commit 85ad3d826392e236e083ede12e11bd68cee0fcf3
Author: Assos Assos <assos+forge@centrale-marseille.fr>
Date:   Tue Jan 7 22:05:56 2014 +0100

    Append of all multiassos project to git

diff --git a/.drush/aliases.drushrc.php b/.drush/aliases.drushrc.php
new file mode 100644
index 00000000..7e0e5c5c
--- /dev/null
+++ b/.drush/aliases.drushrc.php
@@ -0,0 +1,144 @@
+<?php
+$aliases['d7'] = array(
+    'site-list' => array(
+'assos.centrale-marseille.fr/annalestest',
+        'assos.centrale-marseille.fr',
+        'assos.centrale-marseille.fr/aagbokpat',
+        'assos.centrale-marseille.fr/accueil',
+        'assos.centrale-marseille.fr/adeprey',
+        'assos.centrale-marseille.fr/agora',
+        'assos.centrale-marseille.fr/annales',
+        'assos.centrale-marseille.fr/anomaliste',
+        'assos.centrale-marseille.fr/aoudad',
+        'assos.centrale-marseille.fr/apocaliste',
+        'assos.centrale-marseille.fr/bcoissac',
+        'assos.centrale-marseille.fr/bda',
+        'assos.centrale-marseille.fr/bde',
+        'assos.centrale-marseille.fr/bds',
+        'assos.centrale-marseille.fr/bphanluong',
+        'assos.centrale-marseille.fr/bsanchez-pin',
+        'assos.centrale-marseille.fr/bspeziale',
+        'assos.centrale-marseille.fr/cac13',
+        'assos.centrale-marseille.fr/camara',
+        'assos.centrale-marseille.fr/cdechy',
+        'assos.centrale-marseille.fr/centralefightclub',
+        'assos.centrale-marseille.fr/chaasfrangi',
+        'assos.centrale-marseille.fr/charlist',
+        'assos.centrale-marseille.fr/cheer-up',
+        'assos.centrale-marseille.fr/clubfinance',
+        'assos.centrale-marseille.fr/clubrobot',
+        'assos.centrale-marseille.fr/echangesphoceens',
+        'assos.centrale-marseille.fr/ecmnext',
+        'assos.centrale-marseille.fr/election',
+        'assos.centrale-marseille.fr/elepagetest',
+        'assos.centrale-marseille.fr/eluseleves',
+        'assos.centrale-marseille.fr/emath',
+        'assos.centrale-marseille.fr/eptest',
+        'assos.centrale-marseille.fr/ercm',
+        'assos.centrale-marseille.fr/etorri',
+        'assos.centrale-marseille.fr/expat',
+        'assos.centrale-marseille.fr/fablab',
+        'assos.centrale-marseille.fr/foceentest',
+        'assos.centrale-marseille.fr/forumentreprises',
+        'assos.centrale-marseille.fr/ftorregrosa',
+        'assos.centrale-marseille.fr/ftorregrosatest',
+        'assos.centrale-marseille.fr/gala',
+        'assos.centrale-marseille.fr/ggaydier',
+        'assos.centrale-marseille.fr/ginfo',
+        'assos.centrale-marseille.fr/greigniertest',
+        'assos.centrale-marseille.fr/icm',
+        'assos.centrale-marseille.fr/isf',
+        'assos.centrale-marseille.fr/izus',
+        'assos.centrale-marseille.fr/jenselme',
+        'assos.centrale-marseille.fr/jenselmetest',
+        'assos.centrale-marseille.fr/jpennec',
+        'assos.centrale-marseille.fr/ksi',
+        'assos.centrale-marseille.fr/ldp',
+        'assos.centrale-marseille.fr/lintecestlefeu',
+        'assos.centrale-marseille.fr/listerik',
+        'assos.centrale-marseille.fr/listonic',
+        'assos.centrale-marseille.fr/lpomot',
+        'assos.centrale-marseille.fr/mdv',
+        'assos.centrale-marseille.fr/mmenossi',
+        'assos.centrale-marseille.fr/nonotest',
+        'assos.centrale-marseille.fr/nzabeetest',
+        'assos.centrale-marseille.fr/phytv',
+        'assos.centrale-marseille.fr/pjury',
+        'assos.centrale-marseille.fr/qharbulot',
+        'assos.centrale-marseille.fr/rbraun',
+        'assos.centrale-marseille.fr/shauville',
+        'assos.centrale-marseille.fr/testmassiliades',
+        'assos.centrale-marseille.fr/tjanvier',
+        'assos.centrale-marseille.fr/tvp',
+    ),
+    'root' => '/users/guest/assos/htmltest/',
+);
+$aliases['default'] = array('uri' => 'assos.centrale-marseille.fr', 'root' => '/users/guest/assos/htmltest', );
+$aliases['aagbokpat'] = array('uri' => 'assos.centrale-marseille.fr/aagbokpat', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['accueil'] = array('uri' => 'assos.centrale-marseille.fr/accueil', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['adeprey'] = array('uri' => 'assos.centrale-marseille.fr/adeprey', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['agora'] = array('uri' => 'assos.centrale-marseille.fr/agora', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['annales'] = array('uri' => 'assos.centrale-marseille.fr/annales', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['anomaliste'] = array('uri' => 'assos.centrale-marseille.fr/anomaliste', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['aoudad'] = array('uri' => 'assos.centrale-marseille.fr/aoudad', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['apocaliste'] = array('uri' => 'assos.centrale-marseille.fr/apocaliste', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['bcoissac'] = array('uri' => 'assos.centrale-marseille.fr/bcoissac', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['bda'] = array('uri' => 'assos.centrale-marseille.fr/bda', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['bde'] = array('uri' => 'assos.centrale-marseille.fr/bde', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['bds'] = array('uri' => 'assos.centrale-marseille.fr/bds', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['bphanluong'] = array('uri' => 'assos.centrale-marseille.fr/bphanluong', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['bsanchez-pin'] = array('uri' => 'assos.centrale-marseille.fr/bsanchez-pin', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['bspeziale'] = array('uri' => 'assos.centrale-marseille.fr/bspeziale', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['cac13'] = array('uri' => 'assos.centrale-marseille.fr/cac13', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['camara'] = array('uri' => 'assos.centrale-marseille.fr/camara', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['cdechy'] = array('uri' => 'assos.centrale-marseille.fr/cdechy', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['centralefightclub'] = array('uri' => 'assos.centrale-marseille.fr/centralefightclub', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['chaasfrangi'] = array('uri' => 'assos.centrale-marseille.fr/chaasfrangi', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['charlist'] = array('uri' => 'assos.centrale-marseille.fr/charlist', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['cheer-up'] = array('uri' => 'assos.centrale-marseille.fr/cheer-up', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['clubfinance'] = array('uri' => 'assos.centrale-marseille.fr/clubfinance', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['clubrobot'] = array('uri' => 'assos.centrale-marseille.fr/clubrobot', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['echangesphoceens'] = array('uri' => 'assos.centrale-marseille.fr/echangesphoceens', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['ecmnext'] = array('uri' => 'assos.centrale-marseille.fr/ecmnext', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['election'] = array('uri' => 'assos.centrale-marseille.fr/election', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['elepagetest'] = array('uri' => 'assos.centrale-marseille.fr/elepagetest', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['eluseleves'] = array('uri' => 'assos.centrale-marseille.fr/eluseleves', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['emath'] = array('uri' => 'assos.centrale-marseille.fr/emath', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['eptest'] = array('uri' => 'assos.centrale-marseille.fr/eptest', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['ercm'] = array('uri' => 'assos.centrale-marseille.fr/ercm', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['etorri'] = array('uri' => 'assos.centrale-marseille.fr/etorri', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['expat'] = array('uri' => 'assos.centrale-marseille.fr/expat', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['fablab'] = array('uri' => 'assos.centrale-marseille.fr/fablab', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['foceentest'] = array('uri' => 'assos.centrale-marseille.fr/foceentest', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['forumentreprises'] = array('uri' => 'assos.centrale-marseille.fr/forumentreprises', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['ftorregrosa'] = array('uri' => 'assos.centrale-marseille.fr/ftorregrosa', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['ftorregrosatest'] = array('uri' => 'assos.centrale-marseille.fr/ftorregrosatest', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['gala'] = array('uri' => 'assos.centrale-marseille.fr/gala', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['ggaydier'] = array('uri' => 'assos.centrale-marseille.fr/ggaydier', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['ginfo'] = array('uri' => 'assos.centrale-marseille.fr/ginfo', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['greigniertest'] = array('uri' => 'assos.centrale-marseille.fr/greigniertest', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['icm'] = array('uri' => 'assos.centrale-marseille.fr/icm', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['isf'] = array('uri' => 'assos.centrale-marseille.fr/isf', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['izus'] = array('uri' => 'assos.centrale-marseille.fr/izus', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['jenselme'] = array('uri' => 'assos.centrale-marseille.fr/jenselme', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['jenselmetest'] = array('uri' => 'assos.centrale-marseille.fr/jenselmetest', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['jpennec'] = array('uri' => 'assos.centrale-marseille.fr/jpennec', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['ksi'] = array('uri' => 'assos.centrale-marseille.fr/ksi', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['ldp'] = array('uri' => 'assos.centrale-marseille.fr/ldp', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['lintecestlefeu'] = array('uri' => 'assos.centrale-marseille.fr/lintecestlefeu', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['listerik'] = array('uri' => 'assos.centrale-marseille.fr/listerik', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['listonic'] = array('uri' => 'assos.centrale-marseille.fr/listonic', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['lpomot'] = array('uri' => 'assos.centrale-marseille.fr/lpomot', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['mdv'] = array('uri' => 'assos.centrale-marseille.fr/mdv', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['mmenossi'] = array('uri' => 'assos.centrale-marseille.fr/mmenossi', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['nonotest'] = array('uri' => 'assos.centrale-marseille.fr/nonotest', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['nzabeetest'] = array('uri' => 'assos.centrale-marseille.fr/nzabeetest', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['phytv'] = array('uri' => 'assos.centrale-marseille.fr/phytv', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['pjury'] = array('uri' => 'assos.centrale-marseille.fr/pjury', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['qharbulot'] = array('uri' => 'assos.centrale-marseille.fr/qharbulot', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['rbraun'] = array('uri' => 'assos.centrale-marseille.fr/rbraun', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['shauville'] = array('uri' => 'assos.centrale-marseille.fr/shauville', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['testmassiliades'] = array('uri' => 'assos.centrale-marseille.fr/testmassiliades', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['tjanvier'] = array('uri' => 'assos.centrale-marseille.fr/tjanvier', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['tvp'] = array('uri' => 'assos.centrale-marseille.fr/tvp', 'root' => '/users/guest/assos/htmltest/', );
+$aliases['annalestest'] = array('uri' => 'assos.centrale-marseille.fr/', 'root' => '/users/guest/assos/htmltest/', );
diff --git a/.drush/cache/default/6.1.0-commandfiles-0-6c745a3e6820d2539f24a7fea7271b24.cache b/.drush/cache/default/6.1.0-commandfiles-0-6c745a3e6820d2539f24a7fea7271b24.cache
new file mode 100644
index 00000000..65db85bc
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-0-6c745a3e6820d2539f24a7fea7271b24.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-0-6c745a3e6820d2539f24a7fea7271b24","data":{"runserver":"\/usr\/local\/share\/drush\/commands\/runserver\/runserver.drush.inc","sql":"\/usr\/local\/share\/drush\/commands\/sql\/sql.drush.inc","pm":"\/usr\/local\/share\/drush\/commands\/pm\/pm.drush.inc","make":"\/usr\/local\/share\/drush\/commands\/make\/make.drush.inc","user":"\/usr\/local\/share\/drush\/commands\/user\/user.drush.inc","help":"\/usr\/local\/share\/drush\/commands\/core\/help.drush.inc","druplicon":"\/usr\/local\/share\/drush\/commands\/core\/druplicon.drush.inc","cache":"\/usr\/local\/share\/drush\/commands\/core\/cache.drush.inc","sitealias":"\/usr\/local\/share\/drush\/commands\/core\/sitealias.drush.inc","docs":"\/usr\/local\/share\/drush\/commands\/core\/docs.drush.inc","ssh":"\/usr\/local\/share\/drush\/commands\/core\/ssh.drush.inc","shellalias":"\/usr\/local\/share\/drush\/commands\/core\/shellalias.drush.inc","usage":"\/usr\/local\/share\/drush\/commands\/core\/usage.drush.inc","queue":"\/usr\/local\/share\/drush\/commands\/core\/queue.drush.inc","topic":"\/usr\/local\/share\/drush\/commands\/core\/topic.drush.inc","field":"\/usr\/local\/share\/drush\/commands\/core\/field.drush.inc","role":"\/usr\/local\/share\/drush\/commands\/core\/role.drush.inc","outputformat":"\/usr\/local\/share\/drush\/commands\/core\/outputformat.drush.inc","variable":"\/usr\/local\/share\/drush\/commands\/core\/variable.drush.inc","archive":"\/usr\/local\/share\/drush\/commands\/core\/archive.drush.inc","site_install":"\/usr\/local\/share\/drush\/commands\/core\/site_install.drush.inc","core":"\/usr\/local\/share\/drush\/commands\/core\/core.drush.inc","image":"\/usr\/local\/share\/drush\/commands\/core\/image.drush.inc","test":"\/usr\/local\/share\/drush\/commands\/core\/test.drush.inc","watchdog":"\/usr\/local\/share\/drush\/commands\/core\/watchdog.drush.inc","search":"\/usr\/local\/share\/drush\/commands\/core\/search.drush.inc","notify":"\/usr\/local\/share\/drush\/commands\/core\/notify.drush.inc","language":"\/users\/guest\/assos\/.drush\/drush_language\/language.drush.inc"},"created":1389127283,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-0-759458d6f73d50a543cc14c71e2dade0.cache b/.drush/cache/default/6.1.0-commandfiles-0-759458d6f73d50a543cc14c71e2dade0.cache
new file mode 100644
index 00000000..f7cf74bf
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-0-759458d6f73d50a543cc14c71e2dade0.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-0-759458d6f73d50a543cc14c71e2dade0","data":{"runserver":"\/usr\/local\/share\/drush\/commands\/runserver\/runserver.drush.inc","sql":"\/usr\/local\/share\/drush\/commands\/sql\/sql.drush.inc","pm":"\/usr\/local\/share\/drush\/commands\/pm\/pm.drush.inc","make":"\/usr\/local\/share\/drush\/commands\/make\/make.drush.inc","user":"\/usr\/local\/share\/drush\/commands\/user\/user.drush.inc","help":"\/usr\/local\/share\/drush\/commands\/core\/help.drush.inc","druplicon":"\/usr\/local\/share\/drush\/commands\/core\/druplicon.drush.inc","cache":"\/usr\/local\/share\/drush\/commands\/core\/cache.drush.inc","sitealias":"\/usr\/local\/share\/drush\/commands\/core\/sitealias.drush.inc","docs":"\/usr\/local\/share\/drush\/commands\/core\/docs.drush.inc","ssh":"\/usr\/local\/share\/drush\/commands\/core\/ssh.drush.inc","shellalias":"\/usr\/local\/share\/drush\/commands\/core\/shellalias.drush.inc","usage":"\/usr\/local\/share\/drush\/commands\/core\/usage.drush.inc","queue":"\/usr\/local\/share\/drush\/commands\/core\/queue.drush.inc","topic":"\/usr\/local\/share\/drush\/commands\/core\/topic.drush.inc","field":"\/usr\/local\/share\/drush\/commands\/core\/field.drush.inc","role":"\/usr\/local\/share\/drush\/commands\/core\/role.drush.inc","outputformat":"\/usr\/local\/share\/drush\/commands\/core\/outputformat.drush.inc","variable":"\/usr\/local\/share\/drush\/commands\/core\/variable.drush.inc","archive":"\/usr\/local\/share\/drush\/commands\/core\/archive.drush.inc","site_install":"\/usr\/local\/share\/drush\/commands\/core\/site_install.drush.inc","core":"\/usr\/local\/share\/drush\/commands\/core\/core.drush.inc","image":"\/usr\/local\/share\/drush\/commands\/core\/image.drush.inc","test":"\/usr\/local\/share\/drush\/commands\/core\/test.drush.inc","watchdog":"\/usr\/local\/share\/drush\/commands\/core\/watchdog.drush.inc","search":"\/usr\/local\/share\/drush\/commands\/core\/search.drush.inc","notify":"\/usr\/local\/share\/drush\/commands\/core\/notify.drush.inc","language":"\/users\/guest\/assos\/.drush\/drush_language\/language.drush.inc"},"created":1388869507,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-0-8092bea39ee699421125c956416fcde9.cache b/.drush/cache/default/6.1.0-commandfiles-0-8092bea39ee699421125c956416fcde9.cache
new file mode 100644
index 00000000..06001bff
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-0-8092bea39ee699421125c956416fcde9.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-0-8092bea39ee699421125c956416fcde9","data":{"runserver":"\/usr\/local\/share\/drush\/commands\/runserver\/runserver.drush.inc","sql":"\/usr\/local\/share\/drush\/commands\/sql\/sql.drush.inc","pm":"\/usr\/local\/share\/drush\/commands\/pm\/pm.drush.inc","make":"\/usr\/local\/share\/drush\/commands\/make\/make.drush.inc","user":"\/usr\/local\/share\/drush\/commands\/user\/user.drush.inc","help":"\/usr\/local\/share\/drush\/commands\/core\/help.drush.inc","druplicon":"\/usr\/local\/share\/drush\/commands\/core\/druplicon.drush.inc","cache":"\/usr\/local\/share\/drush\/commands\/core\/cache.drush.inc","sitealias":"\/usr\/local\/share\/drush\/commands\/core\/sitealias.drush.inc","docs":"\/usr\/local\/share\/drush\/commands\/core\/docs.drush.inc","ssh":"\/usr\/local\/share\/drush\/commands\/core\/ssh.drush.inc","shellalias":"\/usr\/local\/share\/drush\/commands\/core\/shellalias.drush.inc","usage":"\/usr\/local\/share\/drush\/commands\/core\/usage.drush.inc","queue":"\/usr\/local\/share\/drush\/commands\/core\/queue.drush.inc","topic":"\/usr\/local\/share\/drush\/commands\/core\/topic.drush.inc","field":"\/usr\/local\/share\/drush\/commands\/core\/field.drush.inc","role":"\/usr\/local\/share\/drush\/commands\/core\/role.drush.inc","outputformat":"\/usr\/local\/share\/drush\/commands\/core\/outputformat.drush.inc","variable":"\/usr\/local\/share\/drush\/commands\/core\/variable.drush.inc","archive":"\/usr\/local\/share\/drush\/commands\/core\/archive.drush.inc","site_install":"\/usr\/local\/share\/drush\/commands\/core\/site_install.drush.inc","core":"\/usr\/local\/share\/drush\/commands\/core\/core.drush.inc","image":"\/usr\/local\/share\/drush\/commands\/core\/image.drush.inc","test":"\/usr\/local\/share\/drush\/commands\/core\/test.drush.inc","watchdog":"\/usr\/local\/share\/drush\/commands\/core\/watchdog.drush.inc","search":"\/usr\/local\/share\/drush\/commands\/core\/search.drush.inc","notify":"\/usr\/local\/share\/drush\/commands\/core\/notify.drush.inc","language":"\/users\/guest\/assos\/.drush\/drush_language\/language.drush.inc"},"created":1388872800,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-00923922de68341f1f51ba0b10c9dfbc.cache b/.drush/cache/default/6.1.0-commandfiles-2-00923922de68341f1f51ba0b10c9dfbc.cache
new file mode 100644
index 00000000..25ac4bef
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-00923922de68341f1f51ba0b10c9dfbc.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-00923922de68341f1f51ba0b10c9dfbc","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872839,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-031750f392fcd4ffe6c870201be7ab57.cache b/.drush/cache/default/6.1.0-commandfiles-2-031750f392fcd4ffe6c870201be7ab57.cache
new file mode 100644
index 00000000..9ae3307c
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-031750f392fcd4ffe6c870201be7ab57.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-031750f392fcd4ffe6c870201be7ab57","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873991,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-035ef59fc8c78ddb339383199b633d7b.cache b/.drush/cache/default/6.1.0-commandfiles-2-035ef59fc8c78ddb339383199b633d7b.cache
new file mode 100644
index 00000000..dd6696c9
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-035ef59fc8c78ddb339383199b633d7b.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-035ef59fc8c78ddb339383199b633d7b","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872849,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-04818ca7b2b30be053b6705e6365fa86.cache b/.drush/cache/default/6.1.0-commandfiles-2-04818ca7b2b30be053b6705e6365fa86.cache
new file mode 100644
index 00000000..1e6b00f7
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-04818ca7b2b30be053b6705e6365fa86.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-04818ca7b2b30be053b6705e6365fa86","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873910,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-085024af0874c3c0a63a9d526ac0ff53.cache b/.drush/cache/default/6.1.0-commandfiles-2-085024af0874c3c0a63a9d526ac0ff53.cache
new file mode 100644
index 00000000..b5327651
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-085024af0874c3c0a63a9d526ac0ff53.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-085024af0874c3c0a63a9d526ac0ff53","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873863,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-0ddb47acb60783c6b34baf7d65240045.cache b/.drush/cache/default/6.1.0-commandfiles-2-0ddb47acb60783c6b34baf7d65240045.cache
new file mode 100644
index 00000000..93c401f3
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-0ddb47acb60783c6b34baf7d65240045.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-0ddb47acb60783c6b34baf7d65240045","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873996,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-0f9d9f6962e2e50cef4bc4085a379f67.cache b/.drush/cache/default/6.1.0-commandfiles-2-0f9d9f6962e2e50cef4bc4085a379f67.cache
new file mode 100644
index 00000000..dfec8cec
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-0f9d9f6962e2e50cef4bc4085a379f67.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-0f9d9f6962e2e50cef4bc4085a379f67","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872859,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-1041571cd67962b4d8d3bebd2d0cb99d.cache b/.drush/cache/default/6.1.0-commandfiles-2-1041571cd67962b4d8d3bebd2d0cb99d.cache
new file mode 100644
index 00000000..e7ce11ff
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-1041571cd67962b4d8d3bebd2d0cb99d.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-1041571cd67962b4d8d3bebd2d0cb99d","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873881,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-124e6facba1fec35c9c943ad690ecbf5.cache b/.drush/cache/default/6.1.0-commandfiles-2-124e6facba1fec35c9c943ad690ecbf5.cache
new file mode 100644
index 00000000..794aeeb3
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-124e6facba1fec35c9c943ad690ecbf5.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-124e6facba1fec35c9c943ad690ecbf5","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872886,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-12d1d891a4c44dbf24bbf48cb55604d2.cache b/.drush/cache/default/6.1.0-commandfiles-2-12d1d891a4c44dbf24bbf48cb55604d2.cache
new file mode 100644
index 00000000..7cc243d5
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-12d1d891a4c44dbf24bbf48cb55604d2.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-12d1d891a4c44dbf24bbf48cb55604d2","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872813,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-1340dc3eb07bfd80882f6a79cbd492c8.cache b/.drush/cache/default/6.1.0-commandfiles-2-1340dc3eb07bfd80882f6a79cbd492c8.cache
new file mode 100644
index 00000000..fa628f2e
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-1340dc3eb07bfd80882f6a79cbd492c8.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-1340dc3eb07bfd80882f6a79cbd492c8","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872869,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-13643e481a446679ddc094f99eaab619.cache b/.drush/cache/default/6.1.0-commandfiles-2-13643e481a446679ddc094f99eaab619.cache
new file mode 100644
index 00000000..29f4ac77
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-13643e481a446679ddc094f99eaab619.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-13643e481a446679ddc094f99eaab619","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872829,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-141e25bdbfdcda62feed47a9a90d0a65.cache b/.drush/cache/default/6.1.0-commandfiles-2-141e25bdbfdcda62feed47a9a90d0a65.cache
new file mode 100644
index 00000000..a3982e3e
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-141e25bdbfdcda62feed47a9a90d0a65.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-141e25bdbfdcda62feed47a9a90d0a65","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872876,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-1a24b34f8898ba2cf532fb33c458ae05.cache b/.drush/cache/default/6.1.0-commandfiles-2-1a24b34f8898ba2cf532fb33c458ae05.cache
new file mode 100644
index 00000000..61aef022
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-1a24b34f8898ba2cf532fb33c458ae05.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-1a24b34f8898ba2cf532fb33c458ae05","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873894,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-1ad96b4dc296df74e3e30b6c8b167358.cache b/.drush/cache/default/6.1.0-commandfiles-2-1ad96b4dc296df74e3e30b6c8b167358.cache
new file mode 100644
index 00000000..bb8a1af9
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-1ad96b4dc296df74e3e30b6c8b167358.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-1ad96b4dc296df74e3e30b6c8b167358","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872815,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-1afd832856d60370bb3cee00066ae2f8.cache b/.drush/cache/default/6.1.0-commandfiles-2-1afd832856d60370bb3cee00066ae2f8.cache
new file mode 100644
index 00000000..623ec11f
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-1afd832856d60370bb3cee00066ae2f8.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-1afd832856d60370bb3cee00066ae2f8","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873852,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-1b6416e2f52d1cac7b37fcc1c5287ce6.cache b/.drush/cache/default/6.1.0-commandfiles-2-1b6416e2f52d1cac7b37fcc1c5287ce6.cache
new file mode 100644
index 00000000..180f7897
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-1b6416e2f52d1cac7b37fcc1c5287ce6.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-1b6416e2f52d1cac7b37fcc1c5287ce6","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872853,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-1d672d71e6e55ac01f18597465c9268c.cache b/.drush/cache/default/6.1.0-commandfiles-2-1d672d71e6e55ac01f18597465c9268c.cache
new file mode 100644
index 00000000..0ae65eb1
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-1d672d71e6e55ac01f18597465c9268c.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-1d672d71e6e55ac01f18597465c9268c","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872856,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-1e1833f70e56f51caa265e5d65bb1a1f.cache b/.drush/cache/default/6.1.0-commandfiles-2-1e1833f70e56f51caa265e5d65bb1a1f.cache
new file mode 100644
index 00000000..c11baa9c
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-1e1833f70e56f51caa265e5d65bb1a1f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-1e1833f70e56f51caa265e5d65bb1a1f","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872884,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-20ecfb0e1fc444237021d15081154e3c.cache b/.drush/cache/default/6.1.0-commandfiles-2-20ecfb0e1fc444237021d15081154e3c.cache
new file mode 100644
index 00000000..7c01d42e
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-20ecfb0e1fc444237021d15081154e3c.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-20ecfb0e1fc444237021d15081154e3c","data":[],"created":1388869522,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-21c5b4b303b446b87f68fb780548eedc.cache b/.drush/cache/default/6.1.0-commandfiles-2-21c5b4b303b446b87f68fb780548eedc.cache
new file mode 100644
index 00000000..ae78632d
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-21c5b4b303b446b87f68fb780548eedc.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-21c5b4b303b446b87f68fb780548eedc","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872846,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-24ce4d7a6cf4acc008c46a7143bebe1f.cache b/.drush/cache/default/6.1.0-commandfiles-2-24ce4d7a6cf4acc008c46a7143bebe1f.cache
new file mode 100644
index 00000000..986846de
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-24ce4d7a6cf4acc008c46a7143bebe1f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-24ce4d7a6cf4acc008c46a7143bebe1f","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872867,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-2693796d0c7f70fb6cdd84c2b719cf58.cache b/.drush/cache/default/6.1.0-commandfiles-2-2693796d0c7f70fb6cdd84c2b719cf58.cache
new file mode 100644
index 00000000..17765c6c
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-2693796d0c7f70fb6cdd84c2b719cf58.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-2693796d0c7f70fb6cdd84c2b719cf58","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873903,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-269d2489807cef927ea51a427b611664.cache b/.drush/cache/default/6.1.0-commandfiles-2-269d2489807cef927ea51a427b611664.cache
new file mode 100644
index 00000000..9414d70d
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-269d2489807cef927ea51a427b611664.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-269d2489807cef927ea51a427b611664","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873884,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-284034d4ab088deee458d5c1d685f4cc.cache b/.drush/cache/default/6.1.0-commandfiles-2-284034d4ab088deee458d5c1d685f4cc.cache
new file mode 100644
index 00000000..d1cf1923
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-284034d4ab088deee458d5c1d685f4cc.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-284034d4ab088deee458d5c1d685f4cc","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872880,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-294f6a49135ac08cbe467297c978b56b.cache b/.drush/cache/default/6.1.0-commandfiles-2-294f6a49135ac08cbe467297c978b56b.cache
new file mode 100644
index 00000000..8a253998
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-294f6a49135ac08cbe467297c978b56b.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-294f6a49135ac08cbe467297c978b56b","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873866,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-2b6b9cda0d90077be3f9b8585339d8ce.cache b/.drush/cache/default/6.1.0-commandfiles-2-2b6b9cda0d90077be3f9b8585339d8ce.cache
new file mode 100644
index 00000000..b9bde499
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-2b6b9cda0d90077be3f9b8585339d8ce.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-2b6b9cda0d90077be3f9b8585339d8ce","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873926,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-2b6ce06c5a52b35bc513244def654092.cache b/.drush/cache/default/6.1.0-commandfiles-2-2b6ce06c5a52b35bc513244def654092.cache
new file mode 100644
index 00000000..a53496d6
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-2b6ce06c5a52b35bc513244def654092.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-2b6ce06c5a52b35bc513244def654092","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873985,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-2eeb9d768176c1b3599fb8fba9137d38.cache b/.drush/cache/default/6.1.0-commandfiles-2-2eeb9d768176c1b3599fb8fba9137d38.cache
new file mode 100644
index 00000000..ad530cea
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-2eeb9d768176c1b3599fb8fba9137d38.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-2eeb9d768176c1b3599fb8fba9137d38","data":[],"created":1388869507,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-2f16f72f4ca2d1db605002233b4a62a6.cache b/.drush/cache/default/6.1.0-commandfiles-2-2f16f72f4ca2d1db605002233b4a62a6.cache
new file mode 100644
index 00000000..981e8141
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-2f16f72f4ca2d1db605002233b4a62a6.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-2f16f72f4ca2d1db605002233b4a62a6","data":[],"created":1388869514,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-32bcfb8bc12be5f8f05f47753051e602.cache b/.drush/cache/default/6.1.0-commandfiles-2-32bcfb8bc12be5f8f05f47753051e602.cache
new file mode 100644
index 00000000..bd8fe9f6
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-32bcfb8bc12be5f8f05f47753051e602.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-32bcfb8bc12be5f8f05f47753051e602","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873954,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-33c18c446a4221fc6e9f65e8ea5a26b2.cache b/.drush/cache/default/6.1.0-commandfiles-2-33c18c446a4221fc6e9f65e8ea5a26b2.cache
new file mode 100644
index 00000000..8a35c4d8
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-33c18c446a4221fc6e9f65e8ea5a26b2.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-33c18c446a4221fc6e9f65e8ea5a26b2","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873917,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-3432e1d98e1720f0bc4c6179ab550806.cache b/.drush/cache/default/6.1.0-commandfiles-2-3432e1d98e1720f0bc4c6179ab550806.cache
new file mode 100644
index 00000000..2c382515
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-3432e1d98e1720f0bc4c6179ab550806.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-3432e1d98e1720f0bc4c6179ab550806","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872837,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-34e2eb5937d511052f863c5252c28506.cache b/.drush/cache/default/6.1.0-commandfiles-2-34e2eb5937d511052f863c5252c28506.cache
new file mode 100644
index 00000000..d8151385
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-34e2eb5937d511052f863c5252c28506.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-34e2eb5937d511052f863c5252c28506","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873922,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-354851e4814f8ab98bcb1df7bc0c17d9.cache b/.drush/cache/default/6.1.0-commandfiles-2-354851e4814f8ab98bcb1df7bc0c17d9.cache
new file mode 100644
index 00000000..09a16c52
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-354851e4814f8ab98bcb1df7bc0c17d9.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-354851e4814f8ab98bcb1df7bc0c17d9","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872806,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-3603fae94876114536498220695b5c51.cache b/.drush/cache/default/6.1.0-commandfiles-2-3603fae94876114536498220695b5c51.cache
new file mode 100644
index 00000000..fe215f2f
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-3603fae94876114536498220695b5c51.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-3603fae94876114536498220695b5c51","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872826,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-36d1802744279d036f4b3ee96d41887f.cache b/.drush/cache/default/6.1.0-commandfiles-2-36d1802744279d036f4b3ee96d41887f.cache
new file mode 100644
index 00000000..428df75e
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-36d1802744279d036f4b3ee96d41887f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-36d1802744279d036f4b3ee96d41887f","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873919,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-3704d51c25b3f8520e5b5ca110ce5557.cache b/.drush/cache/default/6.1.0-commandfiles-2-3704d51c25b3f8520e5b5ca110ce5557.cache
new file mode 100644
index 00000000..64ff432e
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-3704d51c25b3f8520e5b5ca110ce5557.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-3704d51c25b3f8520e5b5ca110ce5557","data":[],"created":1388869544,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-3b4f702b95fdd191654ae429b8e9286e.cache b/.drush/cache/default/6.1.0-commandfiles-2-3b4f702b95fdd191654ae429b8e9286e.cache
new file mode 100644
index 00000000..22f2f3ab
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-3b4f702b95fdd191654ae429b8e9286e.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-3b4f702b95fdd191654ae429b8e9286e","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873913,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-3cf9ffffbe35e7757c9a8c71ed221437.cache b/.drush/cache/default/6.1.0-commandfiles-2-3cf9ffffbe35e7757c9a8c71ed221437.cache
new file mode 100644
index 00000000..02b3654b
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-3cf9ffffbe35e7757c9a8c71ed221437.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-3cf9ffffbe35e7757c9a8c71ed221437","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873989,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-40ca6597e08784cd54e27827d3244cb1.cache b/.drush/cache/default/6.1.0-commandfiles-2-40ca6597e08784cd54e27827d3244cb1.cache
new file mode 100644
index 00000000..67abf531
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-40ca6597e08784cd54e27827d3244cb1.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-40ca6597e08784cd54e27827d3244cb1","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873896,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-4138b4440d33b8c7a0076e085533bc9d.cache b/.drush/cache/default/6.1.0-commandfiles-2-4138b4440d33b8c7a0076e085533bc9d.cache
new file mode 100644
index 00000000..09119a7d
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-4138b4440d33b8c7a0076e085533bc9d.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-4138b4440d33b8c7a0076e085533bc9d","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873856,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-4208566f14a7667680a04d3763695a83.cache b/.drush/cache/default/6.1.0-commandfiles-2-4208566f14a7667680a04d3763695a83.cache
new file mode 100644
index 00000000..a18271ce
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-4208566f14a7667680a04d3763695a83.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-4208566f14a7667680a04d3763695a83","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872842,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-42e28daf26ff0d106ac123eed847b871.cache b/.drush/cache/default/6.1.0-commandfiles-2-42e28daf26ff0d106ac123eed847b871.cache
new file mode 100644
index 00000000..a012d194
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-42e28daf26ff0d106ac123eed847b871.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-42e28daf26ff0d106ac123eed847b871","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872801,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-431b862a020f2962231910805f409105.cache b/.drush/cache/default/6.1.0-commandfiles-2-431b862a020f2962231910805f409105.cache
new file mode 100644
index 00000000..a4745a3a
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-431b862a020f2962231910805f409105.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-431b862a020f2962231910805f409105","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872873,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-4478aaf04ad8724cbbafa7358dadad27.cache b/.drush/cache/default/6.1.0-commandfiles-2-4478aaf04ad8724cbbafa7358dadad27.cache
new file mode 100644
index 00000000..f69365ad
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-4478aaf04ad8724cbbafa7358dadad27.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-4478aaf04ad8724cbbafa7358dadad27","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873940,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-45dfb177375a989325765f5b57e2f0b9.cache b/.drush/cache/default/6.1.0-commandfiles-2-45dfb177375a989325765f5b57e2f0b9.cache
new file mode 100644
index 00000000..e3ce508e
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-45dfb177375a989325765f5b57e2f0b9.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-45dfb177375a989325765f5b57e2f0b9","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872833,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-491dcdb4e99f528934c70c751a60f0c0.cache b/.drush/cache/default/6.1.0-commandfiles-2-491dcdb4e99f528934c70c751a60f0c0.cache
new file mode 100644
index 00000000..a8fdffef
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-491dcdb4e99f528934c70c751a60f0c0.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-491dcdb4e99f528934c70c751a60f0c0","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872852,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-49275a50d7cd8e4900ecc68aa527b50c.cache b/.drush/cache/default/6.1.0-commandfiles-2-49275a50d7cd8e4900ecc68aa527b50c.cache
new file mode 100644
index 00000000..8528b3af
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-49275a50d7cd8e4900ecc68aa527b50c.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-49275a50d7cd8e4900ecc68aa527b50c","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873908,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-49c4532feffb9cc03359892ee177a50b.cache b/.drush/cache/default/6.1.0-commandfiles-2-49c4532feffb9cc03359892ee177a50b.cache
new file mode 100644
index 00000000..70241a80
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-49c4532feffb9cc03359892ee177a50b.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-49c4532feffb9cc03359892ee177a50b","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872861,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-4eca541a5c8c6212abb663614bb7910a.cache b/.drush/cache/default/6.1.0-commandfiles-2-4eca541a5c8c6212abb663614bb7910a.cache
new file mode 100644
index 00000000..ed8c97c4
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-4eca541a5c8c6212abb663614bb7910a.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-4eca541a5c8c6212abb663614bb7910a","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872824,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-521e12b8a56dcf42478313585579ded4.cache b/.drush/cache/default/6.1.0-commandfiles-2-521e12b8a56dcf42478313585579ded4.cache
new file mode 100644
index 00000000..99815dc5
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-521e12b8a56dcf42478313585579ded4.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-521e12b8a56dcf42478313585579ded4","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388874008,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-54618a9bfa06534177b9b6b5234e3c4c.cache b/.drush/cache/default/6.1.0-commandfiles-2-54618a9bfa06534177b9b6b5234e3c4c.cache
new file mode 100644
index 00000000..32f36870
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-54618a9bfa06534177b9b6b5234e3c4c.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-54618a9bfa06534177b9b6b5234e3c4c","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872808,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-54ccfe0e7f7b9ffbeee39a7c4289cab1.cache b/.drush/cache/default/6.1.0-commandfiles-2-54ccfe0e7f7b9ffbeee39a7c4289cab1.cache
new file mode 100644
index 00000000..a8b14a81
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-54ccfe0e7f7b9ffbeee39a7c4289cab1.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-54ccfe0e7f7b9ffbeee39a7c4289cab1","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872841,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-5903e49bce1d0f6bb912991c5264c0d2.cache b/.drush/cache/default/6.1.0-commandfiles-2-5903e49bce1d0f6bb912991c5264c0d2.cache
new file mode 100644
index 00000000..7130fdac
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-5903e49bce1d0f6bb912991c5264c0d2.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-5903e49bce1d0f6bb912991c5264c0d2","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872879,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-5aa3cb8fa50d1aa88ea22700adc660a4.cache b/.drush/cache/default/6.1.0-commandfiles-2-5aa3cb8fa50d1aa88ea22700adc660a4.cache
new file mode 100644
index 00000000..3d2b0326
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-5aa3cb8fa50d1aa88ea22700adc660a4.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-5aa3cb8fa50d1aa88ea22700adc660a4","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873960,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-5d97194e3facf41168fe3b78829b4b2b.cache b/.drush/cache/default/6.1.0-commandfiles-2-5d97194e3facf41168fe3b78829b4b2b.cache
new file mode 100644
index 00000000..a1a7cb8b
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-5d97194e3facf41168fe3b78829b4b2b.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-5d97194e3facf41168fe3b78829b4b2b","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873965,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-5e11c9e40191d53c2ebbdb34616f6252.cache b/.drush/cache/default/6.1.0-commandfiles-2-5e11c9e40191d53c2ebbdb34616f6252.cache
new file mode 100644
index 00000000..96238407
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-5e11c9e40191d53c2ebbdb34616f6252.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-5e11c9e40191d53c2ebbdb34616f6252","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872868,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-5e80d64e49003ff66efad4d27bc81322.cache b/.drush/cache/default/6.1.0-commandfiles-2-5e80d64e49003ff66efad4d27bc81322.cache
new file mode 100644
index 00000000..545d9b9e
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-5e80d64e49003ff66efad4d27bc81322.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-5e80d64e49003ff66efad4d27bc81322","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872892,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-60beeb53bda14cd50f4f6085ba65702c.cache b/.drush/cache/default/6.1.0-commandfiles-2-60beeb53bda14cd50f4f6085ba65702c.cache
new file mode 100644
index 00000000..c77c62a5
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-60beeb53bda14cd50f4f6085ba65702c.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-60beeb53bda14cd50f4f6085ba65702c","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873892,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-60c0404a194ff9e2cb4102112b4982ad.cache b/.drush/cache/default/6.1.0-commandfiles-2-60c0404a194ff9e2cb4102112b4982ad.cache
new file mode 100644
index 00000000..ee86d147
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-60c0404a194ff9e2cb4102112b4982ad.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-60c0404a194ff9e2cb4102112b4982ad","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872844,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-6444feff8e885775b8f3dfb1d896f9cd.cache b/.drush/cache/default/6.1.0-commandfiles-2-6444feff8e885775b8f3dfb1d896f9cd.cache
new file mode 100644
index 00000000..9dbb7f69
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-6444feff8e885775b8f3dfb1d896f9cd.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-6444feff8e885775b8f3dfb1d896f9cd","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873899,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-67c92989b835dad4941bfc050e18effe.cache b/.drush/cache/default/6.1.0-commandfiles-2-67c92989b835dad4941bfc050e18effe.cache
new file mode 100644
index 00000000..212a4267
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-67c92989b835dad4941bfc050e18effe.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-67c92989b835dad4941bfc050e18effe","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873958,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-6864917200eea882aa463dcc6596fb44.cache b/.drush/cache/default/6.1.0-commandfiles-2-6864917200eea882aa463dcc6596fb44.cache
new file mode 100644
index 00000000..7c69516f
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-6864917200eea882aa463dcc6596fb44.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-6864917200eea882aa463dcc6596fb44","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873937,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-699657487b88e8b0c2ede2984aa12913.cache b/.drush/cache/default/6.1.0-commandfiles-2-699657487b88e8b0c2ede2984aa12913.cache
new file mode 100644
index 00000000..41626dfc
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-699657487b88e8b0c2ede2984aa12913.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-699657487b88e8b0c2ede2984aa12913","data":[],"created":1388869551,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-6af8679067aba6d7459545ebb88b7eec.cache b/.drush/cache/default/6.1.0-commandfiles-2-6af8679067aba6d7459545ebb88b7eec.cache
new file mode 100644
index 00000000..87936bb7
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-6af8679067aba6d7459545ebb88b7eec.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-6af8679067aba6d7459545ebb88b7eec","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872893,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-741d7f0363dcdbffb737cc83816d0d27.cache b/.drush/cache/default/6.1.0-commandfiles-2-741d7f0363dcdbffb737cc83816d0d27.cache
new file mode 100644
index 00000000..d5376af4
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-741d7f0363dcdbffb737cc83816d0d27.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-741d7f0363dcdbffb737cc83816d0d27","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873998,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-74c04d9a9de852865978130b9749e6ec.cache b/.drush/cache/default/6.1.0-commandfiles-2-74c04d9a9de852865978130b9749e6ec.cache
new file mode 100644
index 00000000..67d5e3f3
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-74c04d9a9de852865978130b9749e6ec.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-74c04d9a9de852865978130b9749e6ec","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872870,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-77cdb2de4bb6a7e63fc724a39e90b32c.cache b/.drush/cache/default/6.1.0-commandfiles-2-77cdb2de4bb6a7e63fc724a39e90b32c.cache
new file mode 100644
index 00000000..108d53e3
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-77cdb2de4bb6a7e63fc724a39e90b32c.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-77cdb2de4bb6a7e63fc724a39e90b32c","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872894,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-7892be02df7e161c831b4877b570170e.cache b/.drush/cache/default/6.1.0-commandfiles-2-7892be02df7e161c831b4877b570170e.cache
new file mode 100644
index 00000000..618e2dfa
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-7892be02df7e161c831b4877b570170e.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-7892be02df7e161c831b4877b570170e","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873962,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-7f0d459a025cfed2d2567a6ec566c6da.cache b/.drush/cache/default/6.1.0-commandfiles-2-7f0d459a025cfed2d2567a6ec566c6da.cache
new file mode 100644
index 00000000..0e982e2e
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-7f0d459a025cfed2d2567a6ec566c6da.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-7f0d459a025cfed2d2567a6ec566c6da","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873945,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-82b63366fefb922145aabf9764d5c438.cache b/.drush/cache/default/6.1.0-commandfiles-2-82b63366fefb922145aabf9764d5c438.cache
new file mode 100644
index 00000000..40f41d54
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-82b63366fefb922145aabf9764d5c438.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-82b63366fefb922145aabf9764d5c438","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872847,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-8778ab6916c64301cb583a2ca52ed7a5.cache b/.drush/cache/default/6.1.0-commandfiles-2-8778ab6916c64301cb583a2ca52ed7a5.cache
new file mode 100644
index 00000000..c6344ddd
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-8778ab6916c64301cb583a2ca52ed7a5.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-8778ab6916c64301cb583a2ca52ed7a5","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872863,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-87f050b57d14d51ff80003324d345583.cache b/.drush/cache/default/6.1.0-commandfiles-2-87f050b57d14d51ff80003324d345583.cache
new file mode 100644
index 00000000..3608300d
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-87f050b57d14d51ff80003324d345583.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-87f050b57d14d51ff80003324d345583","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872887,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-88a5663d60fe56f157f82311a07a3123.cache b/.drush/cache/default/6.1.0-commandfiles-2-88a5663d60fe56f157f82311a07a3123.cache
new file mode 100644
index 00000000..6c3fcaa6
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-88a5663d60fe56f157f82311a07a3123.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-88a5663d60fe56f157f82311a07a3123","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388874010,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-8a8986ba2d85b35b730eac1c424edc15.cache b/.drush/cache/default/6.1.0-commandfiles-2-8a8986ba2d85b35b730eac1c424edc15.cache
new file mode 100644
index 00000000..64bfaffc
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-8a8986ba2d85b35b730eac1c424edc15.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-8a8986ba2d85b35b730eac1c424edc15","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872835,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-8c42abba0154493b9ed310fe0e05aef5.cache b/.drush/cache/default/6.1.0-commandfiles-2-8c42abba0154493b9ed310fe0e05aef5.cache
new file mode 100644
index 00000000..66f9095a
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-8c42abba0154493b9ed310fe0e05aef5.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-8c42abba0154493b9ed310fe0e05aef5","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873967,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-8dde8de982b95a0b155411e273df26c4.cache b/.drush/cache/default/6.1.0-commandfiles-2-8dde8de982b95a0b155411e273df26c4.cache
new file mode 100644
index 00000000..f2ba7b60
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-8dde8de982b95a0b155411e273df26c4.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-8dde8de982b95a0b155411e273df26c4","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873942,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-90b5571ff64221f80c3320ec33b2ed28.cache b/.drush/cache/default/6.1.0-commandfiles-2-90b5571ff64221f80c3320ec33b2ed28.cache
new file mode 100644
index 00000000..2fa5023b
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-90b5571ff64221f80c3320ec33b2ed28.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-90b5571ff64221f80c3320ec33b2ed28","data":[],"created":1388869536,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-918e7428611c0ee54525932a712a4fad.cache b/.drush/cache/default/6.1.0-commandfiles-2-918e7428611c0ee54525932a712a4fad.cache
new file mode 100644
index 00000000..7e45b5bc
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-918e7428611c0ee54525932a712a4fad.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-918e7428611c0ee54525932a712a4fad","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872804,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-922f67cdbac66a5905921b89a529817d.cache b/.drush/cache/default/6.1.0-commandfiles-2-922f67cdbac66a5905921b89a529817d.cache
new file mode 100644
index 00000000..aee17647
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-922f67cdbac66a5905921b89a529817d.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-922f67cdbac66a5905921b89a529817d","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872881,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-9305cd3a72757a2f9cf243412208613b.cache b/.drush/cache/default/6.1.0-commandfiles-2-9305cd3a72757a2f9cf243412208613b.cache
new file mode 100644
index 00000000..48c641ea
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-9305cd3a72757a2f9cf243412208613b.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-9305cd3a72757a2f9cf243412208613b","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872875,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-94e7dd35d97cf67125d3c4e70614ae48.cache b/.drush/cache/default/6.1.0-commandfiles-2-94e7dd35d97cf67125d3c4e70614ae48.cache
new file mode 100644
index 00000000..0961c208
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-94e7dd35d97cf67125d3c4e70614ae48.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-94e7dd35d97cf67125d3c4e70614ae48","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872872,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-967bbbbc74c6cba9f17bc1c95c250a4a.cache b/.drush/cache/default/6.1.0-commandfiles-2-967bbbbc74c6cba9f17bc1c95c250a4a.cache
new file mode 100644
index 00000000..69dfb127
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-967bbbbc74c6cba9f17bc1c95c250a4a.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-967bbbbc74c6cba9f17bc1c95c250a4a","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873879,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-982d22ccfc045cd79e1d18c8c3846bb3.cache b/.drush/cache/default/6.1.0-commandfiles-2-982d22ccfc045cd79e1d18c8c3846bb3.cache
new file mode 100644
index 00000000..44e83586
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-982d22ccfc045cd79e1d18c8c3846bb3.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-982d22ccfc045cd79e1d18c8c3846bb3","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872890,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-98e7d112577782a265931a357f542b5f.cache b/.drush/cache/default/6.1.0-commandfiles-2-98e7d112577782a265931a357f542b5f.cache
new file mode 100644
index 00000000..9532b324
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-98e7d112577782a265931a357f542b5f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-98e7d112577782a265931a357f542b5f","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872820,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-9b9b324d50a6d4447fe54c1aec156f97.cache b/.drush/cache/default/6.1.0-commandfiles-2-9b9b324d50a6d4447fe54c1aec156f97.cache
new file mode 100644
index 00000000..c8b3ac84
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-9b9b324d50a6d4447fe54c1aec156f97.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-9b9b324d50a6d4447fe54c1aec156f97","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873978,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-9c0ddc9787c4110d2a2921c2411584a9.cache b/.drush/cache/default/6.1.0-commandfiles-2-9c0ddc9787c4110d2a2921c2411584a9.cache
new file mode 100644
index 00000000..497fa495
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-9c0ddc9787c4110d2a2921c2411584a9.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-9c0ddc9787c4110d2a2921c2411584a9","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872850,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-a2cb88eda41c9f56bab030de622ca9a1.cache b/.drush/cache/default/6.1.0-commandfiles-2-a2cb88eda41c9f56bab030de622ca9a1.cache
new file mode 100644
index 00000000..0fda3f0b
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-a2cb88eda41c9f56bab030de622ca9a1.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-a2cb88eda41c9f56bab030de622ca9a1","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873983,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-a5eb1a0d87b1ef7b027a90163293c7b0.cache b/.drush/cache/default/6.1.0-commandfiles-2-a5eb1a0d87b1ef7b027a90163293c7b0.cache
new file mode 100644
index 00000000..8ffcb9a9
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-a5eb1a0d87b1ef7b027a90163293c7b0.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-a5eb1a0d87b1ef7b027a90163293c7b0","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872825,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-a8e4e7e25b9e0058c9162719e77dd8db.cache b/.drush/cache/default/6.1.0-commandfiles-2-a8e4e7e25b9e0058c9162719e77dd8db.cache
new file mode 100644
index 00000000..ca05e520
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-a8e4e7e25b9e0058c9162719e77dd8db.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-a8e4e7e25b9e0058c9162719e77dd8db","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873886,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-ac109c3a157fbfaaf64c19b63cd4687d.cache b/.drush/cache/default/6.1.0-commandfiles-2-ac109c3a157fbfaaf64c19b63cd4687d.cache
new file mode 100644
index 00000000..1a162f79
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-ac109c3a157fbfaaf64c19b63cd4687d.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-ac109c3a157fbfaaf64c19b63cd4687d","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873993,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-acc62f84c644a7a21a9d9e0783c6c654.cache b/.drush/cache/default/6.1.0-commandfiles-2-acc62f84c644a7a21a9d9e0783c6c654.cache
new file mode 100644
index 00000000..524c8976
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-acc62f84c644a7a21a9d9e0783c6c654.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-acc62f84c644a7a21a9d9e0783c6c654","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873906,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-afdce0abe5f1f5580e3bc259a0c825eb.cache b/.drush/cache/default/6.1.0-commandfiles-2-afdce0abe5f1f5580e3bc259a0c825eb.cache
new file mode 100644
index 00000000..b96ed538
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-afdce0abe5f1f5580e3bc259a0c825eb.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-afdce0abe5f1f5580e3bc259a0c825eb","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872883,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-b0be08007143205c9178dc8d0c8504ff.cache b/.drush/cache/default/6.1.0-commandfiles-2-b0be08007143205c9178dc8d0c8504ff.cache
new file mode 100644
index 00000000..107d5f26
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-b0be08007143205c9178dc8d0c8504ff.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-b0be08007143205c9178dc8d0c8504ff","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872878,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-b0ee064215bde748c88a1b00baeac52c.cache b/.drush/cache/default/6.1.0-commandfiles-2-b0ee064215bde748c88a1b00baeac52c.cache
new file mode 100644
index 00000000..66b961d0
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-b0ee064215bde748c88a1b00baeac52c.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-b0ee064215bde748c88a1b00baeac52c","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872843,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-b198eabbdd08ef1ea97820908b81e7d8.cache b/.drush/cache/default/6.1.0-commandfiles-2-b198eabbdd08ef1ea97820908b81e7d8.cache
new file mode 100644
index 00000000..fd03b285
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-b198eabbdd08ef1ea97820908b81e7d8.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-b198eabbdd08ef1ea97820908b81e7d8","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872811,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-b1a8dc41e2625cd9ff384200064f475e.cache b/.drush/cache/default/6.1.0-commandfiles-2-b1a8dc41e2625cd9ff384200064f475e.cache
new file mode 100644
index 00000000..3d03666e
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-b1a8dc41e2625cd9ff384200064f475e.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-b1a8dc41e2625cd9ff384200064f475e","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872877,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-b3d28fd7f14adb8c631fac69b876f6ba.cache b/.drush/cache/default/6.1.0-commandfiles-2-b3d28fd7f14adb8c631fac69b876f6ba.cache
new file mode 100644
index 00000000..a92b991f
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-b3d28fd7f14adb8c631fac69b876f6ba.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-b3d28fd7f14adb8c631fac69b876f6ba","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872891,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-be8babc1df158d18f53c6ea7020aa3e2.cache b/.drush/cache/default/6.1.0-commandfiles-2-be8babc1df158d18f53c6ea7020aa3e2.cache
new file mode 100644
index 00000000..ee81696d
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-be8babc1df158d18f53c6ea7020aa3e2.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-be8babc1df158d18f53c6ea7020aa3e2","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872838,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-c3d62b6bffac822f3f151ae139c684ec.cache b/.drush/cache/default/6.1.0-commandfiles-2-c3d62b6bffac822f3f151ae139c684ec.cache
new file mode 100644
index 00000000..fdae158c
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-c3d62b6bffac822f3f151ae139c684ec.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-c3d62b6bffac822f3f151ae139c684ec","data":[],"created":1388869547,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-c5955a6ed65aa60e2c653145d9e78edf.cache b/.drush/cache/default/6.1.0-commandfiles-2-c5955a6ed65aa60e2c653145d9e78edf.cache
new file mode 100644
index 00000000..0ad5bcd8
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-c5955a6ed65aa60e2c653145d9e78edf.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-c5955a6ed65aa60e2c653145d9e78edf","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872858,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-c6ca810da6de84a0044fd2e88b3ceebc.cache b/.drush/cache/default/6.1.0-commandfiles-2-c6ca810da6de84a0044fd2e88b3ceebc.cache
new file mode 100644
index 00000000..b802a2af
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-c6ca810da6de84a0044fd2e88b3ceebc.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-c6ca810da6de84a0044fd2e88b3ceebc","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388874003,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-c70471e5063ed69ec757ab0b11458853.cache b/.drush/cache/default/6.1.0-commandfiles-2-c70471e5063ed69ec757ab0b11458853.cache
new file mode 100644
index 00000000..77749b31
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-c70471e5063ed69ec757ab0b11458853.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-c70471e5063ed69ec757ab0b11458853","data":[],"created":1388869543,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-c849a76bf438d87eacf1c21761299aa6.cache b/.drush/cache/default/6.1.0-commandfiles-2-c849a76bf438d87eacf1c21761299aa6.cache
new file mode 100644
index 00000000..13730413
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-c849a76bf438d87eacf1c21761299aa6.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-c849a76bf438d87eacf1c21761299aa6","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873901,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-c9e4b76212029fc5cbc0282e64ab5350.cache b/.drush/cache/default/6.1.0-commandfiles-2-c9e4b76212029fc5cbc0282e64ab5350.cache
new file mode 100644
index 00000000..cc4796bb
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-c9e4b76212029fc5cbc0282e64ab5350.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-c9e4b76212029fc5cbc0282e64ab5350","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872828,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-ca4a01ac0f7ade4651803d554345104d.cache b/.drush/cache/default/6.1.0-commandfiles-2-ca4a01ac0f7ade4651803d554345104d.cache
new file mode 100644
index 00000000..12813004
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-ca4a01ac0f7ade4651803d554345104d.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-ca4a01ac0f7ade4651803d554345104d","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873933,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-cd9c24141fee25f18e2c84c39e4634ef.cache b/.drush/cache/default/6.1.0-commandfiles-2-cd9c24141fee25f18e2c84c39e4634ef.cache
new file mode 100644
index 00000000..06d99147
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-cd9c24141fee25f18e2c84c39e4634ef.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-cd9c24141fee25f18e2c84c39e4634ef","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873888,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-ce90b4472e79854d577b539cb82b66ef.cache b/.drush/cache/default/6.1.0-commandfiles-2-ce90b4472e79854d577b539cb82b66ef.cache
new file mode 100644
index 00000000..15117937
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-ce90b4472e79854d577b539cb82b66ef.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-ce90b4472e79854d577b539cb82b66ef","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872889,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-cee3f66219601ff8d12cb7a32f0c9dd6.cache b/.drush/cache/default/6.1.0-commandfiles-2-cee3f66219601ff8d12cb7a32f0c9dd6.cache
new file mode 100644
index 00000000..7f6f9b64
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-cee3f66219601ff8d12cb7a32f0c9dd6.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-cee3f66219601ff8d12cb7a32f0c9dd6","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872822,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-d11b6d96e79d444bd5ac44a2788c8653.cache b/.drush/cache/default/6.1.0-commandfiles-2-d11b6d96e79d444bd5ac44a2788c8653.cache
new file mode 100644
index 00000000..060ab345
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-d11b6d96e79d444bd5ac44a2788c8653.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-d11b6d96e79d444bd5ac44a2788c8653","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873972,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-d18a9cc7f1ffad9dc1003ac37952912f.cache b/.drush/cache/default/6.1.0-commandfiles-2-d18a9cc7f1ffad9dc1003ac37952912f.cache
new file mode 100644
index 00000000..3c3fb53f
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-d18a9cc7f1ffad9dc1003ac37952912f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-d18a9cc7f1ffad9dc1003ac37952912f","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873870,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-d56e54d3c8a0fe3a0c838bc7a3325096.cache b/.drush/cache/default/6.1.0-commandfiles-2-d56e54d3c8a0fe3a0c838bc7a3325096.cache
new file mode 100644
index 00000000..152fb613
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-d56e54d3c8a0fe3a0c838bc7a3325096.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-d56e54d3c8a0fe3a0c838bc7a3325096","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873872,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-d5770f669fcb384de3f4fa70d76dd5d5.cache b/.drush/cache/default/6.1.0-commandfiles-2-d5770f669fcb384de3f4fa70d76dd5d5.cache
new file mode 100644
index 00000000..130caa94
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-d5770f669fcb384de3f4fa70d76dd5d5.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-d5770f669fcb384de3f4fa70d76dd5d5","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873931,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-d753ff64d0e6c870d0bcd6727cea9a73.cache b/.drush/cache/default/6.1.0-commandfiles-2-d753ff64d0e6c870d0bcd6727cea9a73.cache
new file mode 100644
index 00000000..3717926e
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-d753ff64d0e6c870d0bcd6727cea9a73.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-d753ff64d0e6c870d0bcd6727cea9a73","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872816,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-d78944701ec52c65ee9fa9155c5bb8c0.cache b/.drush/cache/default/6.1.0-commandfiles-2-d78944701ec52c65ee9fa9155c5bb8c0.cache
new file mode 100644
index 00000000..fcb8fcf8
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-d78944701ec52c65ee9fa9155c5bb8c0.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-d78944701ec52c65ee9fa9155c5bb8c0","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873861,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-d8c6688f1b1f84a1f09b40ca24f7c401.cache b/.drush/cache/default/6.1.0-commandfiles-2-d8c6688f1b1f84a1f09b40ca24f7c401.cache
new file mode 100644
index 00000000..7ab9708d
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-d8c6688f1b1f84a1f09b40ca24f7c401.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-d8c6688f1b1f84a1f09b40ca24f7c401","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873924,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-d9bd6a39b8d7ce9d5e68b4d62cc2c15e.cache b/.drush/cache/default/6.1.0-commandfiles-2-d9bd6a39b8d7ce9d5e68b4d62cc2c15e.cache
new file mode 100644
index 00000000..fb9b8b64
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-d9bd6a39b8d7ce9d5e68b4d62cc2c15e.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-d9bd6a39b8d7ce9d5e68b4d62cc2c15e","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873987,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-db4cca68647c169f7b1b410b2145db98.cache b/.drush/cache/default/6.1.0-commandfiles-2-db4cca68647c169f7b1b410b2145db98.cache
new file mode 100644
index 00000000..52a522fb
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-db4cca68647c169f7b1b410b2145db98.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-db4cca68647c169f7b1b410b2145db98","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873947,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-dd79853508bd873ba1db0a85461c58a1.cache b/.drush/cache/default/6.1.0-commandfiles-2-dd79853508bd873ba1db0a85461c58a1.cache
new file mode 100644
index 00000000..8d566d99
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-dd79853508bd873ba1db0a85461c58a1.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-dd79853508bd873ba1db0a85461c58a1","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388874005,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-df72920c91fe22b10e74a39639ef3e12.cache b/.drush/cache/default/6.1.0-commandfiles-2-df72920c91fe22b10e74a39639ef3e12.cache
new file mode 100644
index 00000000..ed6e8738
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-df72920c91fe22b10e74a39639ef3e12.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-df72920c91fe22b10e74a39639ef3e12","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872885,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-e170fe3d942d4f852e5c007c6b50059d.cache b/.drush/cache/default/6.1.0-commandfiles-2-e170fe3d942d4f852e5c007c6b50059d.cache
new file mode 100644
index 00000000..f7da822b
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-e170fe3d942d4f852e5c007c6b50059d.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-e170fe3d942d4f852e5c007c6b50059d","data":[],"created":1388869528,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-e3b00ec507717e53e7d8c18b6f078c85.cache b/.drush/cache/default/6.1.0-commandfiles-2-e3b00ec507717e53e7d8c18b6f078c85.cache
new file mode 100644
index 00000000..277b5ffe
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-e3b00ec507717e53e7d8c18b6f078c85.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-e3b00ec507717e53e7d8c18b6f078c85","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873969,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-e6455078530237589deaa165671285be.cache b/.drush/cache/default/6.1.0-commandfiles-2-e6455078530237589deaa165671285be.cache
new file mode 100644
index 00000000..e551ca4d
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-e6455078530237589deaa165671285be.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-e6455078530237589deaa165671285be","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388874001,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-e7c4c2d1e9723a457a4772a2cd93f736.cache b/.drush/cache/default/6.1.0-commandfiles-2-e7c4c2d1e9723a457a4772a2cd93f736.cache
new file mode 100644
index 00000000..7fd2d093
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-e7c4c2d1e9723a457a4772a2cd93f736.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-e7c4c2d1e9723a457a4772a2cd93f736","data":[],"created":1388869548,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-e9b75936d9c4565c8efc0c7a2190dab2.cache b/.drush/cache/default/6.1.0-commandfiles-2-e9b75936d9c4565c8efc0c7a2190dab2.cache
new file mode 100644
index 00000000..050f034d
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-e9b75936d9c4565c8efc0c7a2190dab2.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-e9b75936d9c4565c8efc0c7a2190dab2","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873974,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-ec4cb2f0fd6c6429fcc1aa2f24e6b6d4.cache b/.drush/cache/default/6.1.0-commandfiles-2-ec4cb2f0fd6c6429fcc1aa2f24e6b6d4.cache
new file mode 100644
index 00000000..375aa2e7
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-ec4cb2f0fd6c6429fcc1aa2f24e6b6d4.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-ec4cb2f0fd6c6429fcc1aa2f24e6b6d4","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872831,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-ec5df5b8c8271729bdec40193adb9bc0.cache b/.drush/cache/default/6.1.0-commandfiles-2-ec5df5b8c8271729bdec40193adb9bc0.cache
new file mode 100644
index 00000000..1340aadb
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-ec5df5b8c8271729bdec40193adb9bc0.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-ec5df5b8c8271729bdec40193adb9bc0","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873875,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-edd48bfbb95305ff54c05d61a9ea95aa.cache b/.drush/cache/default/6.1.0-commandfiles-2-edd48bfbb95305ff54c05d61a9ea95aa.cache
new file mode 100644
index 00000000..4e84576a
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-edd48bfbb95305ff54c05d61a9ea95aa.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-edd48bfbb95305ff54c05d61a9ea95aa","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873980,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-f3a9fdef9982f461648260a894a9a548.cache b/.drush/cache/default/6.1.0-commandfiles-2-f3a9fdef9982f461648260a894a9a548.cache
new file mode 100644
index 00000000..ec6c8c3b
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-f3a9fdef9982f461648260a894a9a548.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-f3a9fdef9982f461648260a894a9a548","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873868,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-f4263fe3968a6fe0473f41e862ba606f.cache b/.drush/cache/default/6.1.0-commandfiles-2-f4263fe3968a6fe0473f41e862ba606f.cache
new file mode 100644
index 00000000..f6eac387
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-f4263fe3968a6fe0473f41e862ba606f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-f4263fe3968a6fe0473f41e862ba606f","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872814,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-f77faaae8f93cb3e3a960ed30f9856ca.cache b/.drush/cache/default/6.1.0-commandfiles-2-f77faaae8f93cb3e3a960ed30f9856ca.cache
new file mode 100644
index 00000000..9e9083a7
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-f77faaae8f93cb3e3a960ed30f9856ca.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-f77faaae8f93cb3e3a960ed30f9856ca","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873859,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-f78088bf217d06f3c98116600ba70db8.cache b/.drush/cache/default/6.1.0-commandfiles-2-f78088bf217d06f3c98116600ba70db8.cache
new file mode 100644
index 00000000..070887ff
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-f78088bf217d06f3c98116600ba70db8.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-f78088bf217d06f3c98116600ba70db8","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873949,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-f794587c7cb37b84f888003e9b0fd4aa.cache b/.drush/cache/default/6.1.0-commandfiles-2-f794587c7cb37b84f888003e9b0fd4aa.cache
new file mode 100644
index 00000000..ecd95a73
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-f794587c7cb37b84f888003e9b0fd4aa.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-f794587c7cb37b84f888003e9b0fd4aa","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872866,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-f9a63e8dd09ae06f21e193027483aa2b.cache b/.drush/cache/default/6.1.0-commandfiles-2-f9a63e8dd09ae06f21e193027483aa2b.cache
new file mode 100644
index 00000000..44055664
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-f9a63e8dd09ae06f21e193027483aa2b.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-f9a63e8dd09ae06f21e193027483aa2b","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873956,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-f9d4f4b54542059a7f849c70926db3e0.cache b/.drush/cache/default/6.1.0-commandfiles-2-f9d4f4b54542059a7f849c70926db3e0.cache
new file mode 100644
index 00000000..0958d866
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-f9d4f4b54542059a7f849c70926db3e0.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-f9d4f4b54542059a7f849c70926db3e0","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872834,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-fb36488581a8dc3224b9b2e4ccd4147e.cache b/.drush/cache/default/6.1.0-commandfiles-2-fb36488581a8dc3224b9b2e4ccd4147e.cache
new file mode 100644
index 00000000..29b8df28
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-fb36488581a8dc3224b9b2e4ccd4147e.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-fb36488581a8dc3224b9b2e4ccd4147e","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388873935,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-2-fbd46f14f7b4a7b07961215dd5c479cc.cache b/.drush/cache/default/6.1.0-commandfiles-2-fbd46f14f7b4a7b07961215dd5c479cc.cache
new file mode 100644
index 00000000..d54f9e5a
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-2-fbd46f14f7b4a7b07961215dd5c479cc.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-2-fbd46f14f7b4a7b07961215dd5c479cc","data":{"omega":"sites\/all\/themes\/omega\/omega\/includes\/omega.drush.inc","adaptivetheme":"sites\/all\/themes\/adaptivetheme\/at_core\/adaptivetheme.drush.inc","zen":"sites\/all\/themes\/zen\/zen-internals\/zen.drush.inc"},"created":1388872818,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-004b2d6453f1c6b3abb8ad02e08c6cb8.cache b/.drush/cache/default/6.1.0-commandfiles-5-004b2d6453f1c6b3abb8ad02e08c6cb8.cache
new file mode 100644
index 00000000..8d29dfa2
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-004b2d6453f1c6b3abb8ad02e08c6cb8.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-004b2d6453f1c6b3abb8ad02e08c6cb8","data":{"ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","sweaver":"sites\/all\/modules\/sweaver\/drush\/sweaver.drush.inc"},"created":1388872826,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-01ce16f0acf758a17ea3f4b1005a964d.cache b/.drush/cache/default/6.1.0-commandfiles-5-01ce16f0acf758a17ea3f4b1005a964d.cache
new file mode 100644
index 00000000..8b8fb746
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-01ce16f0acf758a17ea3f4b1005a964d.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-01ce16f0acf758a17ea3f4b1005a964d","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc","sweaver":"sites\/all\/modules\/sweaver\/drush\/sweaver.drush.inc"},"created":1388872882,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-03e96b5919762530c9b6730095d98202.cache b/.drush/cache/default/6.1.0-commandfiles-5-03e96b5919762530c9b6730095d98202.cache
new file mode 100644
index 00000000..79722078
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-03e96b5919762530c9b6730095d98202.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-03e96b5919762530c9b6730095d98202","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","print_pdf":"sites\/all\/modules\/print\/print_pdf\/print_pdf.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc"},"created":1388872896,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-08b378f20693df9ab5eb6b7c2d587d6b.cache b/.drush/cache/default/6.1.0-commandfiles-5-08b378f20693df9ab5eb6b7c2d587d6b.cache
new file mode 100644
index 00000000..f5fed4a6
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-08b378f20693df9ab5eb6b7c2d587d6b.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-08b378f20693df9ab5eb6b7c2d587d6b","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","sweaver":"sites\/all\/modules\/sweaver\/drush\/sweaver.drush.inc"},"created":1388872862,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-0e776fd0c1dca9f91822a80ed5bf0c01.cache b/.drush/cache/default/6.1.0-commandfiles-5-0e776fd0c1dca9f91822a80ed5bf0c01.cache
new file mode 100644
index 00000000..aa1ee410
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-0e776fd0c1dca9f91822a80ed5bf0c01.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-0e776fd0c1dca9f91822a80ed5bf0c01","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872818,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-15e93fa00ab869448666223c9d61b4db.cache b/.drush/cache/default/6.1.0-commandfiles-5-15e93fa00ab869448666223c9d61b4db.cache
new file mode 100644
index 00000000..00e23e36
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-15e93fa00ab869448666223c9d61b4db.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-15e93fa00ab869448666223c9d61b4db","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","colorbox":"sites\/all\/modules\/colorbox\/drush\/colorbox.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","print_pdf":"sites\/all\/modules\/print\/print_pdf\/print_pdf.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","ds":"sites\/all\/modules\/ds\/drush\/ds.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1388872859,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-1630f09cf16b6ea5407114938a0ad221.cache b/.drush/cache/default/6.1.0-commandfiles-5-1630f09cf16b6ea5407114938a0ad221.cache
new file mode 100644
index 00000000..22acb3b7
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-1630f09cf16b6ea5407114938a0ad221.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-1630f09cf16b6ea5407114938a0ad221","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc","sweaver":"sites\/all\/modules\/sweaver\/drush\/sweaver.drush.inc"},"created":1388872807,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-1674b930101521e42031e77b197fee4f.cache b/.drush/cache/default/6.1.0-commandfiles-5-1674b930101521e42031e77b197fee4f.cache
new file mode 100644
index 00000000..cb6e4476
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-1674b930101521e42031e77b197fee4f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-1674b930101521e42031e77b197fee4f","data":{"adminrole":"sites\/all\/modules\/adminrole\/adminrole.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","imagecache":"sites\/all\/modules\/imagecache\/imagecache.drush.inc","print_pdf":"sites\/all\/modules\/print\/print_pdf\/print_pdf.drush.inc","views":"sites\/all\/modules\/views\/views.drush.inc","views_revert":"sites\/all\/modules\/views\/views_revert.drush.inc"},"created":1388869537,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-17b294b993991d195c7643d8d52b2b9f.cache b/.drush/cache/default/6.1.0-commandfiles-5-17b294b993991d195c7643d8d52b2b9f.cache
new file mode 100644
index 00000000..f44abec4
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-17b294b993991d195c7643d8d52b2b9f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-17b294b993991d195c7643d8d52b2b9f","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","l10n_update":"sites\/all\/modules\/l10n_update\/l10n_update.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views_bulk_operations":"sites\/all\/modules\/views_bulk_operations\/views_bulk_operations.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1389045610,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-1af665d4eac274cdbaaced9a440790dc.cache b/.drush/cache/default/6.1.0-commandfiles-5-1af665d4eac274cdbaaced9a440790dc.cache
new file mode 100644
index 00000000..79451450
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-1af665d4eac274cdbaaced9a440790dc.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-1af665d4eac274cdbaaced9a440790dc","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872821,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-1ce20c82786562819b6c2e5b2ad1d710.cache b/.drush/cache/default/6.1.0-commandfiles-5-1ce20c82786562819b6c2e5b2ad1d710.cache
new file mode 100644
index 00000000..a6550615
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-1ce20c82786562819b6c2e5b2ad1d710.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-1ce20c82786562819b6c2e5b2ad1d710","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","superfish":"sites\/all\/modules\/superfish\/superfish.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872865,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-1dda37d067a82be60298bb33ef283fcd.cache b/.drush/cache/default/6.1.0-commandfiles-5-1dda37d067a82be60298bb33ef283fcd.cache
new file mode 100644
index 00000000..918d3867
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-1dda37d067a82be60298bb33ef283fcd.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-1dda37d067a82be60298bb33ef283fcd","data":{"ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","print_pdf":"sites\/all\/modules\/print\/print_pdf\/print_pdf.drush.inc","superfish":"sites\/all\/modules\/superfish\/superfish.drush.inc","views":"sites\/all\/modules\/views\/views.drush.inc","views_revert":"sites\/all\/modules\/views\/views_revert.drush.inc"},"created":1388869515,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-2010a51e7bbe8fb66f3785d28cfce84c.cache b/.drush/cache/default/6.1.0-commandfiles-5-2010a51e7bbe8fb66f3785d28cfce84c.cache
new file mode 100644
index 00000000..25f7102d
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-2010a51e7bbe8fb66f3785d28cfce84c.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-2010a51e7bbe8fb66f3785d28cfce84c","data":{"ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","print_pdf":"sites\/all\/modules\/print\/print_pdf\/print_pdf.drush.inc","superfish":"sites\/all\/modules\/superfish\/superfish.drush.inc","views":"sites\/all\/modules\/views\/views.drush.inc","views_revert":"sites\/all\/modules\/views\/views_revert.drush.inc"},"created":1388869545,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-208e9de9f2afe6ddeab4a83c1262a855.cache b/.drush/cache/default/6.1.0-commandfiles-5-208e9de9f2afe6ddeab4a83c1262a855.cache
new file mode 100644
index 00000000..f7e8f9c8
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-208e9de9f2afe6ddeab4a83c1262a855.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-208e9de9f2afe6ddeab4a83c1262a855","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","sweaver":"sites\/all\/modules\/sweaver\/drush\/sweaver.drush.inc"},"created":1388872817,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-20b7da60c449078842adbb50ff0556ce.cache b/.drush/cache/default/6.1.0-commandfiles-5-20b7da60c449078842adbb50ff0556ce.cache
new file mode 100644
index 00000000..0cd19fb6
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-20b7da60c449078842adbb50ff0556ce.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-20b7da60c449078842adbb50ff0556ce","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","variable_realm":"sites\/all\/modules\/variable\/variable_realm\/variable_realm.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","votingapi":"sites\/all\/modules\/votingapi\/votingapi.drush.inc"},"created":1388872851,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-23f9b39b995846c9a1997cfe4f8aa317.cache b/.drush/cache/default/6.1.0-commandfiles-5-23f9b39b995846c9a1997cfe4f8aa317.cache
new file mode 100644
index 00000000..2eba2b25
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-23f9b39b995846c9a1997cfe4f8aa317.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-23f9b39b995846c9a1997cfe4f8aa317","data":{"ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","sweaver":"sites\/all\/modules\/sweaver\/drush\/sweaver.drush.inc"},"created":1388872878,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-2f905819994598fd2e65fc939b36d4e7.cache b/.drush/cache/default/6.1.0-commandfiles-5-2f905819994598fd2e65fc939b36d4e7.cache
new file mode 100644
index 00000000..3b6477f4
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-2f905819994598fd2e65fc939b36d4e7.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-2f905819994598fd2e65fc939b36d4e7","data":{"adminrole":"sites\/all\/modules\/adminrole\/adminrole.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","views":"sites\/all\/modules\/views\/views.drush.inc","views_revert":"sites\/all\/modules\/views\/views_revert.drush.inc"},"created":1388869508,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-313e51d1e6669ad8c46bc5ff18e04fa2.cache b/.drush/cache/default/6.1.0-commandfiles-5-313e51d1e6669ad8c46bc5ff18e04fa2.cache
new file mode 100644
index 00000000..51c11040
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-313e51d1e6669ad8c46bc5ff18e04fa2.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-313e51d1e6669ad8c46bc5ff18e04fa2","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1388872870,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-350fa294977f9a698f4c313de3c9bb8e.cache b/.drush/cache/default/6.1.0-commandfiles-5-350fa294977f9a698f4c313de3c9bb8e.cache
new file mode 100644
index 00000000..af7f3576
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-350fa294977f9a698f4c313de3c9bb8e.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-350fa294977f9a698f4c313de3c9bb8e","data":{"ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","l10n_update":"sites\/all\/modules\/l10n_update\/l10n_update.drush.inc"},"created":1388869522,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-39b5d83a02365aab0fcd08b83c48a1d6.cache b/.drush/cache/default/6.1.0-commandfiles-5-39b5d83a02365aab0fcd08b83c48a1d6.cache
new file mode 100644
index 00000000..27aaa7e8
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-39b5d83a02365aab0fcd08b83c48a1d6.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-39b5d83a02365aab0fcd08b83c48a1d6","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872843,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-475413ad186691eacf92d0055d1f6fa3.cache b/.drush/cache/default/6.1.0-commandfiles-5-475413ad186691eacf92d0055d1f6fa3.cache
new file mode 100644
index 00000000..22bd474c
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-475413ad186691eacf92d0055d1f6fa3.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-475413ad186691eacf92d0055d1f6fa3","data":{"security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc"},"created":1388872893,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-4b4f32b1b53f97c77a9e25bee2f66a86.cache b/.drush/cache/default/6.1.0-commandfiles-5-4b4f32b1b53f97c77a9e25bee2f66a86.cache
new file mode 100644
index 00000000..f4843c03
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-4b4f32b1b53f97c77a9e25bee2f66a86.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-4b4f32b1b53f97c77a9e25bee2f66a86","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","print_pdf":"sites\/all\/modules\/print\/print_pdf\/print_pdf.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","variable_realm":"sites\/all\/modules\/variable\/variable_realm\/variable_realm.drush.inc","views_bulk_operations":"sites\/all\/modules\/views_bulk_operations\/views_bulk_operations.drush.inc","views_data_export":"sites\/all\/modules\/views_data_export\/views_data_export.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872854,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-513946be4a45f63a9b0d9d9b9fe4ce8f.cache b/.drush/cache/default/6.1.0-commandfiles-5-513946be4a45f63a9b0d9d9b9fe4ce8f.cache
new file mode 100644
index 00000000..9aa84c37
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-513946be4a45f63a9b0d9d9b9fe4ce8f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-513946be4a45f63a9b0d9d9b9fe4ce8f","data":{"ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872885,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-51bea84f91230d300b1dfa708cc9e1ea.cache b/.drush/cache/default/6.1.0-commandfiles-5-51bea84f91230d300b1dfa708cc9e1ea.cache
new file mode 100644
index 00000000..ad0f576a
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-51bea84f91230d300b1dfa708cc9e1ea.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-51bea84f91230d300b1dfa708cc9e1ea","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","sweaver":"sites\/all\/modules\/sweaver\/drush\/sweaver.drush.inc"},"created":1388872852,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-54da4fe45565c42ccd62ce97e455a509.cache b/.drush/cache/default/6.1.0-commandfiles-5-54da4fe45565c42ccd62ce97e455a509.cache
new file mode 100644
index 00000000..89a08fc2
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-54da4fe45565c42ccd62ce97e455a509.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-54da4fe45565c42ccd62ce97e455a509","data":{"adminrole":"sites\/all\/modules\/adminrole\/adminrole.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","imagecache":"sites\/all\/modules\/imagecache\/imagecache.drush.inc","print_pdf":"sites\/all\/modules\/print\/print_pdf\/print_pdf.drush.inc","views":"sites\/all\/modules\/views\/views.drush.inc","views_revert":"sites\/all\/modules\/views\/views_revert.drush.inc"},"created":1388869551,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-562aac2ce98ffc86675d541afb8306cc.cache b/.drush/cache/default/6.1.0-commandfiles-5-562aac2ce98ffc86675d541afb8306cc.cache
new file mode 100644
index 00000000..f4f8c3d1
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-562aac2ce98ffc86675d541afb8306cc.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-562aac2ce98ffc86675d541afb8306cc","data":{"ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1388872891,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-58fcfc3401c2297c48e448a8ac8706b1.cache b/.drush/cache/default/6.1.0-commandfiles-5-58fcfc3401c2297c48e448a8ac8706b1.cache
new file mode 100644
index 00000000..5bbc399a
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-58fcfc3401c2297c48e448a8ac8706b1.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-58fcfc3401c2297c48e448a8ac8706b1","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","superfish":"sites\/all\/modules\/superfish\/superfish.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872838,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-5aa902601196cdf559d9926cb55e48ab.cache b/.drush/cache/default/6.1.0-commandfiles-5-5aa902601196cdf559d9926cb55e48ab.cache
new file mode 100644
index 00000000..9186f9e3
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-5aa902601196cdf559d9926cb55e48ab.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-5aa902601196cdf559d9926cb55e48ab","data":{"security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc"},"created":1388872830,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-5cc83b52796f5922f272f36e5f97be4e.cache b/.drush/cache/default/6.1.0-commandfiles-5-5cc83b52796f5922f272f36e5f97be4e.cache
new file mode 100644
index 00000000..4740833a
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-5cc83b52796f5922f272f36e5f97be4e.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-5cc83b52796f5922f272f36e5f97be4e","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc","sweaver":"sites\/all\/modules\/sweaver\/drush\/sweaver.drush.inc"},"created":1388872835,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-630d262b23b52ce8ca2780992d550a90.cache b/.drush/cache/default/6.1.0-commandfiles-5-630d262b23b52ce8ca2780992d550a90.cache
new file mode 100644
index 00000000..ddf5c6d4
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-630d262b23b52ce8ca2780992d550a90.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-630d262b23b52ce8ca2780992d550a90","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","sweaver":"sites\/all\/modules\/sweaver\/drush\/sweaver.drush.inc"},"created":1388872815,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-64887fb8754df52d10ceb634340045c2.cache b/.drush/cache/default/6.1.0-commandfiles-5-64887fb8754df52d10ceb634340045c2.cache
new file mode 100644
index 00000000..3544de9c
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-64887fb8754df52d10ceb634340045c2.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-64887fb8754df52d10ceb634340045c2","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc"},"created":1388872842,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-69cce7161a1392a5def5d1fc0dce4503.cache b/.drush/cache/default/6.1.0-commandfiles-5-69cce7161a1392a5def5d1fc0dce4503.cache
new file mode 100644
index 00000000..b6669c5b
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-69cce7161a1392a5def5d1fc0dce4503.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-69cce7161a1392a5def5d1fc0dce4503","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views_bulk_operations":"sites\/all\/modules\/views_bulk_operations\/views_bulk_operations.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1388872805,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-6cb28739f0912680a2be31373e393b40.cache b/.drush/cache/default/6.1.0-commandfiles-5-6cb28739f0912680a2be31373e393b40.cache
new file mode 100644
index 00000000..93d89487
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-6cb28739f0912680a2be31373e393b40.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-6cb28739f0912680a2be31373e393b40","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","print_pdf":"sites\/all\/modules\/print\/print_pdf\/print_pdf.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","variable_realm":"sites\/all\/modules\/variable\/variable_realm\/variable_realm.drush.inc","views_bulk_operations":"sites\/all\/modules\/views_bulk_operations\/views_bulk_operations.drush.inc","views_data_export":"sites\/all\/modules\/views_data_export\/views_data_export.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872856,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-6ec96a3b1a5c5b6047e3c49afc2b7315.cache b/.drush/cache/default/6.1.0-commandfiles-5-6ec96a3b1a5c5b6047e3c49afc2b7315.cache
new file mode 100644
index 00000000..561e36a7
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-6ec96a3b1a5c5b6047e3c49afc2b7315.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-6ec96a3b1a5c5b6047e3c49afc2b7315","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","ds":"sites\/all\/modules\/ds\/drush\/ds.drush.inc","sweaver":"sites\/all\/modules\/sweaver\/drush\/sweaver.drush.inc"},"created":1388872834,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-718e9347396f78997b8899a9a1cade1b.cache b/.drush/cache/default/6.1.0-commandfiles-5-718e9347396f78997b8899a9a1cade1b.cache
new file mode 100644
index 00000000..9ec91d9e
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-718e9347396f78997b8899a9a1cade1b.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-718e9347396f78997b8899a9a1cade1b","data":{"adminrole":"sites\/all\/modules\/adminrole\/adminrole.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","views":"sites\/all\/modules\/views\/views.drush.inc","views_revert":"sites\/all\/modules\/views\/views_revert.drush.inc"},"created":1388869543,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-729a0e4742cbab4fd33770685eedd934.cache b/.drush/cache/default/6.1.0-commandfiles-5-729a0e4742cbab4fd33770685eedd934.cache
new file mode 100644
index 00000000..473ccf36
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-729a0e4742cbab4fd33770685eedd934.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-729a0e4742cbab4fd33770685eedd934","data":{"ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872802,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-761e23ba763b325adb9ece61288d81ed.cache b/.drush/cache/default/6.1.0-commandfiles-5-761e23ba763b325adb9ece61288d81ed.cache
new file mode 100644
index 00000000..6c2839ae
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-761e23ba763b325adb9ece61288d81ed.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-761e23ba763b325adb9ece61288d81ed","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views_bulk_operations":"sites\/all\/modules\/views_bulk_operations\/views_bulk_operations.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc","sweaver":"sites\/all\/modules\/sweaver\/drush\/sweaver.drush.inc"},"created":1388872874,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-7986623abd13134ae6a5c5334e3a66e4.cache b/.drush/cache/default/6.1.0-commandfiles-5-7986623abd13134ae6a5c5334e3a66e4.cache
new file mode 100644
index 00000000..6cc9accc
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-7986623abd13134ae6a5c5334e3a66e4.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-7986623abd13134ae6a5c5334e3a66e4","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1388872877,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-843c7e601b8a41c0af678ea3b950e742.cache b/.drush/cache/default/6.1.0-commandfiles-5-843c7e601b8a41c0af678ea3b950e742.cache
new file mode 100644
index 00000000..160eea68
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-843c7e601b8a41c0af678ea3b950e742.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-843c7e601b8a41c0af678ea3b950e742","data":{"ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872820,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-8d06f6549bf592ba2c65a6efab551400.cache b/.drush/cache/default/6.1.0-commandfiles-5-8d06f6549bf592ba2c65a6efab551400.cache
new file mode 100644
index 00000000..e6956d5b
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-8d06f6549bf592ba2c65a6efab551400.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-8d06f6549bf592ba2c65a6efab551400","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872827,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-926ae73acc72bcf99538349820c27879.cache b/.drush/cache/default/6.1.0-commandfiles-5-926ae73acc72bcf99538349820c27879.cache
new file mode 100644
index 00000000..aeca546b
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-926ae73acc72bcf99538349820c27879.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-926ae73acc72bcf99538349820c27879","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","print_pdf":"sites\/all\/modules\/print\/print_pdf\/print_pdf.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","superfish":"sites\/all\/modules\/superfish\/superfish.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views_bulk_operations":"sites\/all\/modules\/views_bulk_operations\/views_bulk_operations.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1388872848,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-99a88718138dc3d295a4e45f97b728e1.cache b/.drush/cache/default/6.1.0-commandfiles-5-99a88718138dc3d295a4e45f97b728e1.cache
new file mode 100644
index 00000000..2ad0c48a
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-99a88718138dc3d295a4e45f97b728e1.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-99a88718138dc3d295a4e45f97b728e1","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","sweaver":"sites\/all\/modules\/sweaver\/drush\/sweaver.drush.inc"},"created":1388872879,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-9a85394faa8c2253cd6e97733e00726b.cache b/.drush/cache/default/6.1.0-commandfiles-5-9a85394faa8c2253cd6e97733e00726b.cache
new file mode 100644
index 00000000..65a92bc2
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-9a85394faa8c2253cd6e97733e00726b.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-9a85394faa8c2253cd6e97733e00726b","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views_bulk_operations":"sites\/all\/modules\/views_bulk_operations\/views_bulk_operations.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc"},"created":1388872809,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-9cc1ca5712da77b79d6b382d563782b6.cache b/.drush/cache/default/6.1.0-commandfiles-5-9cc1ca5712da77b79d6b382d563782b6.cache
new file mode 100644
index 00000000..a0dd6d28
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-9cc1ca5712da77b79d6b382d563782b6.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-9cc1ca5712da77b79d6b382d563782b6","data":{"ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872884,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-9f629ef6bbc93edc4d99991ee0417bdf.cache b/.drush/cache/default/6.1.0-commandfiles-5-9f629ef6bbc93edc4d99991ee0417bdf.cache
new file mode 100644
index 00000000..d84c9e5c
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-9f629ef6bbc93edc4d99991ee0417bdf.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-9f629ef6bbc93edc4d99991ee0417bdf","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","variable_realm":"sites\/all\/modules\/variable\/variable_realm\/variable_realm.drush.inc","views_data_export":"sites\/all\/modules\/views_data_export\/views_data_export.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","ds":"sites\/all\/modules\/ds\/drush\/ds.drush.inc"},"created":1388872846,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-ad43df38462a1d62455c791f39c9704e.cache b/.drush/cache/default/6.1.0-commandfiles-5-ad43df38462a1d62455c791f39c9704e.cache
new file mode 100644
index 00000000..7ba62726
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-ad43df38462a1d62455c791f39c9704e.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-ad43df38462a1d62455c791f39c9704e","data":{"ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","imagecache":"sites\/all\/modules\/imagecache\/imagecache.drush.inc","print_pdf":"sites\/all\/modules\/print\/print_pdf\/print_pdf.drush.inc","views":"sites\/all\/modules\/views\/views.drush.inc","views_revert":"sites\/all\/modules\/views\/views_revert.drush.inc"},"created":1388869549,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-b7e0a3d1cc6d851ab1645c819f08d028.cache b/.drush/cache/default/6.1.0-commandfiles-5-b7e0a3d1cc6d851ab1645c819f08d028.cache
new file mode 100644
index 00000000..a2fb8ba5
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-b7e0a3d1cc6d851ab1645c819f08d028.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-b7e0a3d1cc6d851ab1645c819f08d028","data":{"ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872875,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-bad868df6f9bd226b90431cfc29a06ca.cache b/.drush/cache/default/6.1.0-commandfiles-5-bad868df6f9bd226b90431cfc29a06ca.cache
new file mode 100644
index 00000000..9c895488
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-bad868df6f9bd226b90431cfc29a06ca.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-bad868df6f9bd226b90431cfc29a06ca","data":{"security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc"},"created":1388872825,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-bba20e4c7dda4d5968eabe7d2804c044.cache b/.drush/cache/default/6.1.0-commandfiles-5-bba20e4c7dda4d5968eabe7d2804c044.cache
new file mode 100644
index 00000000..f69661be
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-bba20e4c7dda4d5968eabe7d2804c044.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-bba20e4c7dda4d5968eabe7d2804c044","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","l10n_update":"sites\/all\/modules\/l10n_update\/l10n_update.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views_bulk_operations":"sites\/all\/modules\/views_bulk_operations\/views_bulk_operations.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1388872813,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-bc72cc8934ee2d735df0254dbb88b6f4.cache b/.drush/cache/default/6.1.0-commandfiles-5-bc72cc8934ee2d735df0254dbb88b6f4.cache
new file mode 100644
index 00000000..dfddd604
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-bc72cc8934ee2d735df0254dbb88b6f4.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-bc72cc8934ee2d735df0254dbb88b6f4","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc"},"created":1388872816,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-be378d31b707e0bc1c522965efcb5580.cache b/.drush/cache/default/6.1.0-commandfiles-5-be378d31b707e0bc1c522965efcb5580.cache
new file mode 100644
index 00000000..7b3b5f1c
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-be378d31b707e0bc1c522965efcb5580.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-be378d31b707e0bc1c522965efcb5580","data":{"ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","imagecache":"sites\/all\/modules\/imagecache\/imagecache.drush.inc","print_pdf":"sites\/all\/modules\/print\/print_pdf\/print_pdf.drush.inc","views":"sites\/all\/modules\/views\/views.drush.inc","views_revert":"sites\/all\/modules\/views\/views_revert.drush.inc"},"created":1388869528,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-c25e53c5e0606c617ec1100d37f8b326.cache b/.drush/cache/default/6.1.0-commandfiles-5-c25e53c5e0606c617ec1100d37f8b326.cache
new file mode 100644
index 00000000..1a5630f5
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-c25e53c5e0606c617ec1100d37f8b326.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-c25e53c5e0606c617ec1100d37f8b326","data":{"security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc"},"created":1388872883,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-c86fc2bb24f15c5058dd3a5123672da1.cache b/.drush/cache/default/6.1.0-commandfiles-5-c86fc2bb24f15c5058dd3a5123672da1.cache
new file mode 100644
index 00000000..c5c391a0
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-c86fc2bb24f15c5058dd3a5123672da1.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-c86fc2bb24f15c5058dd3a5123672da1","data":{"security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc"},"created":1388872837,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-cd84d6ba3d2b3ccbb6f5166141d647d6.cache b/.drush/cache/default/6.1.0-commandfiles-5-cd84d6ba3d2b3ccbb6f5166141d647d6.cache
new file mode 100644
index 00000000..5b1cb72f
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-cd84d6ba3d2b3ccbb6f5166141d647d6.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-cd84d6ba3d2b3ccbb6f5166141d647d6","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc","sweaver":"sites\/all\/modules\/sweaver\/drush\/sweaver.drush.inc"},"created":1388872845,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-dcdd752b9e9e4828ee1221f0c41d90ee.cache b/.drush/cache/default/6.1.0-commandfiles-5-dcdd752b9e9e4828ee1221f0c41d90ee.cache
new file mode 100644
index 00000000..1ebba9b4
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-dcdd752b9e9e4828ee1221f0c41d90ee.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-dcdd752b9e9e4828ee1221f0c41d90ee","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","l10n_update":"sites\/all\/modules\/l10n_update\/l10n_update.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views_bulk_operations":"sites\/all\/modules\/views_bulk_operations\/views_bulk_operations.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1389049208,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-e004083a34060fff822c09661c1afe18.cache b/.drush/cache/default/6.1.0-commandfiles-5-e004083a34060fff822c09661c1afe18.cache
new file mode 100644
index 00000000..6fdec2ba
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-e004083a34060fff822c09661c1afe18.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-e004083a34060fff822c09661c1afe18","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","uuid":"sites\/all\/modules\/uuid\/uuid.drush.inc"},"created":1388872860,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-e05f3b996c717bad34ed569fc9965760.cache b/.drush/cache/default/6.1.0-commandfiles-5-e05f3b996c717bad34ed569fc9965760.cache
new file mode 100644
index 00000000..6fcde606
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-e05f3b996c717bad34ed569fc9965760.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-e05f3b996c717bad34ed569fc9965760","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","colorbox":"sites\/all\/modules\/colorbox\/drush\/colorbox.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc"},"created":1388872895,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-e3cd4d31376a2830cff2b79b99c15612.cache b/.drush/cache/default/6.1.0-commandfiles-5-e3cd4d31376a2830cff2b79b99c15612.cache
new file mode 100644
index 00000000..583fdfda
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-e3cd4d31376a2830cff2b79b99c15612.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-e3cd4d31376a2830cff2b79b99c15612","data":{"ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","l10n_update":"sites\/all\/modules\/l10n_update\/l10n_update.drush.inc"},"created":1388869548,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-e42b958924ec1b9d44aeb7156da28840.cache b/.drush/cache/default/6.1.0-commandfiles-5-e42b958924ec1b9d44aeb7156da28840.cache
new file mode 100644
index 00000000..dd0c6476
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-e42b958924ec1b9d44aeb7156da28840.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-e42b958924ec1b9d44aeb7156da28840","data":{"ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc"},"created":1388872866,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-e56bdecb5b6044508b3c2a2b47c28d5c.cache b/.drush/cache/default/6.1.0-commandfiles-5-e56bdecb5b6044508b3c2a2b47c28d5c.cache
new file mode 100644
index 00000000..ffde7783
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-e56bdecb5b6044508b3c2a2b47c28d5c.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-e56bdecb5b6044508b3c2a2b47c28d5c","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872824,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-e7bdb97791adbc10d456f2abf2625dea.cache b/.drush/cache/default/6.1.0-commandfiles-5-e7bdb97791adbc10d456f2abf2625dea.cache
new file mode 100644
index 00000000..5a66b9be
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-e7bdb97791adbc10d456f2abf2625dea.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-e7bdb97791adbc10d456f2abf2625dea","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1388872872,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-e7c71f14b2da4313ec8d3df3dafefb8d.cache b/.drush/cache/default/6.1.0-commandfiles-5-e7c71f14b2da4313ec8d3df3dafefb8d.cache
new file mode 100644
index 00000000..bfa15bdb
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-e7c71f14b2da4313ec8d3df3dafefb8d.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-e7c71f14b2da4313ec8d3df3dafefb8d","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","print_pdf":"sites\/all\/modules\/print\/print_pdf\/print_pdf.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","superfish":"sites\/all\/modules\/superfish\/superfish.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views_bulk_operations":"sites\/all\/modules\/views_bulk_operations\/views_bulk_operations.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1388872840,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-e9ff07504718ea107c08648bd3c49479.cache b/.drush/cache/default/6.1.0-commandfiles-5-e9ff07504718ea107c08648bd3c49479.cache
new file mode 100644
index 00000000..683ae467
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-e9ff07504718ea107c08648bd3c49479.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-e9ff07504718ea107c08648bd3c49479","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872886,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-ef08c6a6de40a0682080a98097c675fc.cache b/.drush/cache/default/6.1.0-commandfiles-5-ef08c6a6de40a0682080a98097c675fc.cache
new file mode 100644
index 00000000..dc3951b5
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-ef08c6a6de40a0682080a98097c675fc.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-ef08c6a6de40a0682080a98097c675fc","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872892,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-f03071c46e861b0f0f05b068f21b7dcb.cache b/.drush/cache/default/6.1.0-commandfiles-5-f03071c46e861b0f0f05b068f21b7dcb.cache
new file mode 100644
index 00000000..8867dc41
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-f03071c46e861b0f0f05b068f21b7dcb.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-f03071c46e861b0f0f05b068f21b7dcb","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","print_pdf":"sites\/all\/modules\/print\/print_pdf\/print_pdf.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","superfish":"sites\/all\/modules\/superfish\/superfish.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views_bulk_operations":"sites\/all\/modules\/views_bulk_operations\/views_bulk_operations.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","sweaver":"sites\/all\/modules\/sweaver\/drush\/sweaver.drush.inc"},"created":1388872888,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-f0f2bc1b36128391652382b67080218d.cache b/.drush/cache/default/6.1.0-commandfiles-5-f0f2bc1b36128391652382b67080218d.cache
new file mode 100644
index 00000000..d205b581
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-f0f2bc1b36128391652382b67080218d.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-f0f2bc1b36128391652382b67080218d","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views_bulk_operations":"sites\/all\/modules\/views_bulk_operations\/views_bulk_operations.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1388872812,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-f28bb2a784a989a9503d0e15f0f240b6.cache b/.drush/cache/default/6.1.0-commandfiles-5-f28bb2a784a989a9503d0e15f0f240b6.cache
new file mode 100644
index 00000000..2533c332
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-f28bb2a784a989a9503d0e15f0f240b6.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-f28bb2a784a989a9503d0e15f0f240b6","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","print_pdf":"sites\/all\/modules\/print\/print_pdf\/print_pdf.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1388872871,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-f3aabbb6e94763efbb74d26ebbdb5bf6.cache b/.drush/cache/default/6.1.0-commandfiles-5-f3aabbb6e94763efbb74d26ebbdb5bf6.cache
new file mode 100644
index 00000000..eac33094
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-f3aabbb6e94763efbb74d26ebbdb5bf6.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-f3aabbb6e94763efbb74d26ebbdb5bf6","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views_bulk_operations":"sites\/all\/modules\/views_bulk_operations\/views_bulk_operations.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872831,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-fabab143d4853be95bc51608c0a899e2.cache b/.drush/cache/default/6.1.0-commandfiles-5-fabab143d4853be95bc51608c0a899e2.cache
new file mode 100644
index 00000000..369f4705
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-fabab143d4853be95bc51608c0a899e2.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-fabab143d4853be95bc51608c0a899e2","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1388872868,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-fc80e8121e5b8ebb07642217e2a4c7fd.cache b/.drush/cache/default/6.1.0-commandfiles-5-fc80e8121e5b8ebb07642217e2a4c7fd.cache
new file mode 100644
index 00000000..90a126eb
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-fc80e8121e5b8ebb07642217e2a4c7fd.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-fc80e8121e5b8ebb07642217e2a4c7fd","data":{"ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","superfish":"sites\/all\/modules\/superfish\/superfish.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc"},"created":1388872889,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-commandfiles-5-ffbb2513e10372d7b69574aaa5bda0ca.cache b/.drush/cache/default/6.1.0-commandfiles-5-ffbb2513e10372d7b69574aaa5bda0ca.cache
new file mode 100644
index 00000000..51447b9a
--- /dev/null
+++ b/.drush/cache/default/6.1.0-commandfiles-5-ffbb2513e10372d7b69574aaa5bda0ca.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-commandfiles-5-ffbb2513e10372d7b69574aaa5bda0ca","data":{"cas":"sites\/all\/modules\/cas\/cas.drush.inc","ckeditor":"sites\/all\/modules\/ckeditor\/includes\/ckeditor.drush.inc","ctools":"sites\/all\/modules\/ctools\/drush\/ctools.drush.inc","libraries":"sites\/all\/modules\/libraries\/libraries.drush.inc","security_review":"sites\/all\/modules\/security_review\/security_review.drush.inc","token":"sites\/all\/modules\/token\/token.drush.inc","views":"sites\/all\/modules\/views\/drush\/views.drush.inc","rules_scheduler":"sites\/all\/modules\/rules\/rules_scheduler\/rules_scheduler.drush.inc"},"created":1388872823,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-017b853ae08cffcf180c144432abb123.cache b/.drush/cache/default/6.1.0-install_profile-017b853ae08cffcf180c144432abb123.cache
new file mode 100644
index 00000000..4fbfbfb7
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-017b853ae08cffcf180c144432abb123.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-017b853ae08cffcf180c144432abb123","data":"standard","created":1388872875,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-017c287ec7c3e0bba64955268428e4f9.cache b/.drush/cache/default/6.1.0-install_profile-017c287ec7c3e0bba64955268428e4f9.cache
new file mode 100644
index 00000000..75914a28
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-017c287ec7c3e0bba64955268428e4f9.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-017c287ec7c3e0bba64955268428e4f9","data":"standard","created":1389052819,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-03494c1a8a3b14361adf599d889ebb32.cache b/.drush/cache/default/6.1.0-install_profile-03494c1a8a3b14361adf599d889ebb32.cache
new file mode 100644
index 00000000..6c1ce99f
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-03494c1a8a3b14361adf599d889ebb32.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-03494c1a8a3b14361adf599d889ebb32","data":"standard","created":1388872891,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-084b5e47a9372ad09b768a86aa26fdb7.cache b/.drush/cache/default/6.1.0-install_profile-084b5e47a9372ad09b768a86aa26fdb7.cache
new file mode 100644
index 00000000..4e5bab83
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-084b5e47a9372ad09b768a86aa26fdb7.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-084b5e47a9372ad09b768a86aa26fdb7","data":"standard","created":1388872858,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-13f9bb861460c8b64e0282220fe7255f.cache b/.drush/cache/default/6.1.0-install_profile-13f9bb861460c8b64e0282220fe7255f.cache
new file mode 100644
index 00000000..6550cfc9
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-13f9bb861460c8b64e0282220fe7255f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-13f9bb861460c8b64e0282220fe7255f","data":"standard","created":1388872818,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-15b2b76d8f06020a28d63b6ecc5f5f67.cache b/.drush/cache/default/6.1.0-install_profile-15b2b76d8f06020a28d63b6ecc5f5f67.cache
new file mode 100644
index 00000000..dffcb86c
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-15b2b76d8f06020a28d63b6ecc5f5f67.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-15b2b76d8f06020a28d63b6ecc5f5f67","data":"standard","created":1388872878,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-171137a7ac0a701bdd3c38049d5696a1.cache b/.drush/cache/default/6.1.0-install_profile-171137a7ac0a701bdd3c38049d5696a1.cache
new file mode 100644
index 00000000..c1f53bed
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-171137a7ac0a701bdd3c38049d5696a1.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-171137a7ac0a701bdd3c38049d5696a1","data":"standard","created":1388872886,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-17494214be4463f7e65c2adac582b31f.cache b/.drush/cache/default/6.1.0-install_profile-17494214be4463f7e65c2adac582b31f.cache
new file mode 100644
index 00000000..284dd5fe
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-17494214be4463f7e65c2adac582b31f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-17494214be4463f7e65c2adac582b31f","data":"standard","created":1388872820,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-1cad2c352c4dbc10d1638701147a154f.cache b/.drush/cache/default/6.1.0-install_profile-1cad2c352c4dbc10d1638701147a154f.cache
new file mode 100644
index 00000000..4c1db8d8
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-1cad2c352c4dbc10d1638701147a154f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-1cad2c352c4dbc10d1638701147a154f","data":"standard","created":1388872882,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-1d1a12d99de27aeeb081e687afd73d71.cache b/.drush/cache/default/6.1.0-install_profile-1d1a12d99de27aeeb081e687afd73d71.cache
new file mode 100644
index 00000000..337f75a9
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-1d1a12d99de27aeeb081e687afd73d71.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-1d1a12d99de27aeeb081e687afd73d71","data":"standard","created":1388872893,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-20ccf202555ed7b70e3d2fb2e7415fdc.cache b/.drush/cache/default/6.1.0-install_profile-20ccf202555ed7b70e3d2fb2e7415fdc.cache
new file mode 100644
index 00000000..39c8f07a
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-20ccf202555ed7b70e3d2fb2e7415fdc.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-20ccf202555ed7b70e3d2fb2e7415fdc","data":"standard","created":1388872847,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-26f14b00434518725e24bc20e38bbbca.cache b/.drush/cache/default/6.1.0-install_profile-26f14b00434518725e24bc20e38bbbca.cache
new file mode 100644
index 00000000..99a59518
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-26f14b00434518725e24bc20e38bbbca.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-26f14b00434518725e24bc20e38bbbca","data":"standard","created":1388872894,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-2b076a4da3968872e4ce3b64be7a9230.cache b/.drush/cache/default/6.1.0-install_profile-2b076a4da3968872e4ce3b64be7a9230.cache
new file mode 100644
index 00000000..847b0abf
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-2b076a4da3968872e4ce3b64be7a9230.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-2b076a4da3968872e4ce3b64be7a9230","data":"standard","created":1388872852,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-330cc88972b7d9a028e347d22353b75f.cache b/.drush/cache/default/6.1.0-install_profile-330cc88972b7d9a028e347d22353b75f.cache
new file mode 100644
index 00000000..8015e047
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-330cc88972b7d9a028e347d22353b75f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-330cc88972b7d9a028e347d22353b75f","data":"standard","created":1388872869,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-35c634d4e818f602cb0dfb9c83407fc8.cache b/.drush/cache/default/6.1.0-install_profile-35c634d4e818f602cb0dfb9c83407fc8.cache
new file mode 100644
index 00000000..9767e626
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-35c634d4e818f602cb0dfb9c83407fc8.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-35c634d4e818f602cb0dfb9c83407fc8","data":"standard","created":1388872856,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-35ec25e4aed44a06395d44f2c0834dbf.cache b/.drush/cache/default/6.1.0-install_profile-35ec25e4aed44a06395d44f2c0834dbf.cache
new file mode 100644
index 00000000..0298051a
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-35ec25e4aed44a06395d44f2c0834dbf.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-35ec25e4aed44a06395d44f2c0834dbf","data":"standard","created":1388872874,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-3976887f229d48a44c73bc478a56a86f.cache b/.drush/cache/default/6.1.0-install_profile-3976887f229d48a44c73bc478a56a86f.cache
new file mode 100644
index 00000000..867631db
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-3976887f229d48a44c73bc478a56a86f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-3976887f229d48a44c73bc478a56a86f","data":"standard","created":1388872848,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-3c72437a6f61ba74d35cebf8e059814e.cache b/.drush/cache/default/6.1.0-install_profile-3c72437a6f61ba74d35cebf8e059814e.cache
new file mode 100644
index 00000000..d39cf604
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-3c72437a6f61ba74d35cebf8e059814e.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-3c72437a6f61ba74d35cebf8e059814e","data":"standard","created":1388872854,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-3ee8c28d8411d206d46508c1f3c7c1e2.cache b/.drush/cache/default/6.1.0-install_profile-3ee8c28d8411d206d46508c1f3c7c1e2.cache
new file mode 100644
index 00000000..2aaaaca5
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-3ee8c28d8411d206d46508c1f3c7c1e2.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-3ee8c28d8411d206d46508c1f3c7c1e2","data":"standard","created":1388872876,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-3f2672c5a94480421d33597c704feb3b.cache b/.drush/cache/default/6.1.0-install_profile-3f2672c5a94480421d33597c704feb3b.cache
new file mode 100644
index 00000000..ff26ce1c
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-3f2672c5a94480421d33597c704feb3b.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-3f2672c5a94480421d33597c704feb3b","data":"standard","created":1388872884,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-43d58a718b6124bbebedf6d8f2c475c9.cache b/.drush/cache/default/6.1.0-install_profile-43d58a718b6124bbebedf6d8f2c475c9.cache
new file mode 100644
index 00000000..284da26e
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-43d58a718b6124bbebedf6d8f2c475c9.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-43d58a718b6124bbebedf6d8f2c475c9","data":"standard","created":1388872814,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-4478e4629c142fbc4f2024e874489776.cache b/.drush/cache/default/6.1.0-install_profile-4478e4629c142fbc4f2024e874489776.cache
new file mode 100644
index 00000000..138504dc
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-4478e4629c142fbc4f2024e874489776.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-4478e4629c142fbc4f2024e874489776","data":"standard","created":1388872842,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-474a13701777c31231563171913cc923.cache b/.drush/cache/default/6.1.0-install_profile-474a13701777c31231563171913cc923.cache
new file mode 100644
index 00000000..d8ae7550
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-474a13701777c31231563171913cc923.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-474a13701777c31231563171913cc923","data":"standard","created":1388872813,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-47d830ad6a548861887d5a040c429aa9.cache b/.drush/cache/default/6.1.0-install_profile-47d830ad6a548861887d5a040c429aa9.cache
new file mode 100644
index 00000000..43032fb3
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-47d830ad6a548861887d5a040c429aa9.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-47d830ad6a548861887d5a040c429aa9","data":"standard","created":1388872885,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-4da153fbafcb7163e0694102a5dbac84.cache b/.drush/cache/default/6.1.0-install_profile-4da153fbafcb7163e0694102a5dbac84.cache
new file mode 100644
index 00000000..b88750ce
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-4da153fbafcb7163e0694102a5dbac84.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-4da153fbafcb7163e0694102a5dbac84","data":"standard","created":1388872840,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-56e1c5ce5b9535a785c15d2734993246.cache b/.drush/cache/default/6.1.0-install_profile-56e1c5ce5b9535a785c15d2734993246.cache
new file mode 100644
index 00000000..198ab4f5
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-56e1c5ce5b9535a785c15d2734993246.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-56e1c5ce5b9535a785c15d2734993246","data":"standard","created":1389114058,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-60c9d9a3121530e37f9f04d436c33243.cache b/.drush/cache/default/6.1.0-install_profile-60c9d9a3121530e37f9f04d436c33243.cache
new file mode 100644
index 00000000..3425faae
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-60c9d9a3121530e37f9f04d436c33243.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-60c9d9a3121530e37f9f04d436c33243","data":"standard","created":1388872879,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-653bdb6616ef9b036d782cbe43cd2067.cache b/.drush/cache/default/6.1.0-install_profile-653bdb6616ef9b036d782cbe43cd2067.cache
new file mode 100644
index 00000000..0e38d872
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-653bdb6616ef9b036d782cbe43cd2067.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-653bdb6616ef9b036d782cbe43cd2067","data":"standard","created":1388872806,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-66ecfeb9791a023150773849f1550c5d.cache b/.drush/cache/default/6.1.0-install_profile-66ecfeb9791a023150773849f1550c5d.cache
new file mode 100644
index 00000000..a0f771cc
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-66ecfeb9791a023150773849f1550c5d.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-66ecfeb9791a023150773849f1550c5d","data":"standard","created":1388872895,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-674b5bf4c833eac5710b1b59a7692f8a.cache b/.drush/cache/default/6.1.0-install_profile-674b5bf4c833eac5710b1b59a7692f8a.cache
new file mode 100644
index 00000000..f6293894
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-674b5bf4c833eac5710b1b59a7692f8a.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-674b5bf4c833eac5710b1b59a7692f8a","data":"standard","created":1388872808,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-7136b969f914d0f8b8389b6f76b502f0.cache b/.drush/cache/default/6.1.0-install_profile-7136b969f914d0f8b8389b6f76b502f0.cache
new file mode 100644
index 00000000..20b56112
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-7136b969f914d0f8b8389b6f76b502f0.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-7136b969f914d0f8b8389b6f76b502f0","data":"standard","created":1388872888,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-72997a7cd9cb826b8b04597fb299937c.cache b/.drush/cache/default/6.1.0-install_profile-72997a7cd9cb826b8b04597fb299937c.cache
new file mode 100644
index 00000000..f2bf77a5
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-72997a7cd9cb826b8b04597fb299937c.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-72997a7cd9cb826b8b04597fb299937c","data":"standard","created":1388872801,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-7b309a589492e11ec54dd07c404e9804.cache b/.drush/cache/default/6.1.0-install_profile-7b309a589492e11ec54dd07c404e9804.cache
new file mode 100644
index 00000000..2e221d8e
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-7b309a589492e11ec54dd07c404e9804.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-7b309a589492e11ec54dd07c404e9804","data":"standard","created":1388872834,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-7e074de6aeea8c08b1b284855a20196a.cache b/.drush/cache/default/6.1.0-install_profile-7e074de6aeea8c08b1b284855a20196a.cache
new file mode 100644
index 00000000..bfc5dc73
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-7e074de6aeea8c08b1b284855a20196a.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-7e074de6aeea8c08b1b284855a20196a","data":"standard","created":1388872866,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-8276389a69529494836d10832793d3a8.cache b/.drush/cache/default/6.1.0-install_profile-8276389a69529494836d10832793d3a8.cache
new file mode 100644
index 00000000..e2668943
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-8276389a69529494836d10832793d3a8.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-8276389a69529494836d10832793d3a8","data":"standard","created":1388872817,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-833d7859b8ff20d9b4d27fe04bd9038a.cache b/.drush/cache/default/6.1.0-install_profile-833d7859b8ff20d9b4d27fe04bd9038a.cache
new file mode 100644
index 00000000..145a855f
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-833d7859b8ff20d9b4d27fe04bd9038a.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-833d7859b8ff20d9b4d27fe04bd9038a","data":"standard","created":1388872838,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-835da832ec9478dc5a0c55891c9fcd3c.cache b/.drush/cache/default/6.1.0-install_profile-835da832ec9478dc5a0c55891c9fcd3c.cache
new file mode 100644
index 00000000..7d01db04
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-835da832ec9478dc5a0c55891c9fcd3c.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-835da832ec9478dc5a0c55891c9fcd3c","data":"standard","created":1388872825,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-88e0fd47729ddf1e21ca8234141eef8c.cache b/.drush/cache/default/6.1.0-install_profile-88e0fd47729ddf1e21ca8234141eef8c.cache
new file mode 100644
index 00000000..903f8ddb
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-88e0fd47729ddf1e21ca8234141eef8c.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-88e0fd47729ddf1e21ca8234141eef8c","data":"standard","created":1388872860,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-8bc2d4b159ff8952d2b892b338056ed9.cache b/.drush/cache/default/6.1.0-install_profile-8bc2d4b159ff8952d2b892b338056ed9.cache
new file mode 100644
index 00000000..f3cf26d3
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-8bc2d4b159ff8952d2b892b338056ed9.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-8bc2d4b159ff8952d2b892b338056ed9","data":"standard","created":1388872841,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-8fd59f60f7d49fcd405e3e182c91b528.cache b/.drush/cache/default/6.1.0-install_profile-8fd59f60f7d49fcd405e3e182c91b528.cache
new file mode 100644
index 00000000..91d7e853
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-8fd59f60f7d49fcd405e3e182c91b528.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-8fd59f60f7d49fcd405e3e182c91b528","data":"standard","created":1388872890,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-979e6d6f640aa4beb2a27b87e7c0f78f.cache b/.drush/cache/default/6.1.0-install_profile-979e6d6f640aa4beb2a27b87e7c0f78f.cache
new file mode 100644
index 00000000..3d4bc710
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-979e6d6f640aa4beb2a27b87e7c0f78f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-979e6d6f640aa4beb2a27b87e7c0f78f","data":"standard","created":1388872815,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-995567224e255717af3ff22ee8c897ad.cache b/.drush/cache/default/6.1.0-install_profile-995567224e255717af3ff22ee8c897ad.cache
new file mode 100644
index 00000000..47423d13
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-995567224e255717af3ff22ee8c897ad.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-995567224e255717af3ff22ee8c897ad","data":"standard","created":1388872821,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-9b70231128384ebed04e11f9ba70c7ac.cache b/.drush/cache/default/6.1.0-install_profile-9b70231128384ebed04e11f9ba70c7ac.cache
new file mode 100644
index 00000000..08b70a9c
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-9b70231128384ebed04e11f9ba70c7ac.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-9b70231128384ebed04e11f9ba70c7ac","data":"standard","created":1388872846,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-a21eb831ba21d4c78a0e3129c23db745.cache b/.drush/cache/default/6.1.0-install_profile-a21eb831ba21d4c78a0e3129c23db745.cache
new file mode 100644
index 00000000..25b1b9e8
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-a21eb831ba21d4c78a0e3129c23db745.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-a21eb831ba21d4c78a0e3129c23db745","data":"standard","created":1388872812,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-a2a7e2029449d02fab3ff7ba8c8586a2.cache b/.drush/cache/default/6.1.0-install_profile-a2a7e2029449d02fab3ff7ba8c8586a2.cache
new file mode 100644
index 00000000..54dcf413
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-a2a7e2029449d02fab3ff7ba8c8586a2.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-a2a7e2029449d02fab3ff7ba8c8586a2","data":"standard","created":1388872889,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-a3c55cc70070af2e39410d9a052239e3.cache b/.drush/cache/default/6.1.0-install_profile-a3c55cc70070af2e39410d9a052239e3.cache
new file mode 100644
index 00000000..98f3f89c
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-a3c55cc70070af2e39410d9a052239e3.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-a3c55cc70070af2e39410d9a052239e3","data":"standard","created":1388872829,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-a5c8556a605008378f337f40f4b0c8c6.cache b/.drush/cache/default/6.1.0-install_profile-a5c8556a605008378f337f40f4b0c8c6.cache
new file mode 100644
index 00000000..c297c5ec
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-a5c8556a605008378f337f40f4b0c8c6.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-a5c8556a605008378f337f40f4b0c8c6","data":"standard","created":1388872831,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-a8c581cd1547b9d0f06ebe296dc0f475.cache b/.drush/cache/default/6.1.0-install_profile-a8c581cd1547b9d0f06ebe296dc0f475.cache
new file mode 100644
index 00000000..efe777cf
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-a8c581cd1547b9d0f06ebe296dc0f475.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-a8c581cd1547b9d0f06ebe296dc0f475","data":"standard","created":1388872849,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-a966bfbe467d7935ce3fd7e277d0ddd2.cache b/.drush/cache/default/6.1.0-install_profile-a966bfbe467d7935ce3fd7e277d0ddd2.cache
new file mode 100644
index 00000000..7d91f11a
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-a966bfbe467d7935ce3fd7e277d0ddd2.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-a966bfbe467d7935ce3fd7e277d0ddd2","data":"standard","created":1388872880,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-b2c1ea085ee8b90c9078e002cd8248cb.cache b/.drush/cache/default/6.1.0-install_profile-b2c1ea085ee8b90c9078e002cd8248cb.cache
new file mode 100644
index 00000000..ae6b3b4a
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-b2c1ea085ee8b90c9078e002cd8248cb.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-b2c1ea085ee8b90c9078e002cd8248cb","data":"standard","created":1388872868,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-b32d5aa8785fe5caa9bd6e4598695ea6.cache b/.drush/cache/default/6.1.0-install_profile-b32d5aa8785fe5caa9bd6e4598695ea6.cache
new file mode 100644
index 00000000..a06fcaa9
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-b32d5aa8785fe5caa9bd6e4598695ea6.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-b32d5aa8785fe5caa9bd6e4598695ea6","data":"standard","created":1388872843,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-c35bb2f3f30211fb0f7ba338c7e20d3f.cache b/.drush/cache/default/6.1.0-install_profile-c35bb2f3f30211fb0f7ba338c7e20d3f.cache
new file mode 100644
index 00000000..62371eef
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-c35bb2f3f30211fb0f7ba338c7e20d3f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-c35bb2f3f30211fb0f7ba338c7e20d3f","data":"standard","created":1388872826,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-c5b7cd9aba3fc489742cd60551718272.cache b/.drush/cache/default/6.1.0-install_profile-c5b7cd9aba3fc489742cd60551718272.cache
new file mode 100644
index 00000000..c109fed6
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-c5b7cd9aba3fc489742cd60551718272.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-c5b7cd9aba3fc489742cd60551718272","data":"standard","created":1388872830,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-cd7689369cbeb27cab3b8485826a7348.cache b/.drush/cache/default/6.1.0-install_profile-cd7689369cbeb27cab3b8485826a7348.cache
new file mode 100644
index 00000000..c212047a
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-cd7689369cbeb27cab3b8485826a7348.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-cd7689369cbeb27cab3b8485826a7348","data":"standard","created":1388872837,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-cfd721ba4f7c33da8746262bfd164f84.cache b/.drush/cache/default/6.1.0-install_profile-cfd721ba4f7c33da8746262bfd164f84.cache
new file mode 100644
index 00000000..d96af150
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-cfd721ba4f7c33da8746262bfd164f84.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-cfd721ba4f7c33da8746262bfd164f84","data":"standard","created":1388872851,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-cfeca0dc9cb7b7e865e90e173a8786c3.cache b/.drush/cache/default/6.1.0-install_profile-cfeca0dc9cb7b7e865e90e173a8786c3.cache
new file mode 100644
index 00000000..6f9766f9
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-cfeca0dc9cb7b7e865e90e173a8786c3.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-cfeca0dc9cb7b7e865e90e173a8786c3","data":"standard","created":1388872844,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-d4a110057d565cf0f23d20376fd83f96.cache b/.drush/cache/default/6.1.0-install_profile-d4a110057d565cf0f23d20376fd83f96.cache
new file mode 100644
index 00000000..1f0d5723
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-d4a110057d565cf0f23d20376fd83f96.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-d4a110057d565cf0f23d20376fd83f96","data":"standard","created":1388872864,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-d6221ce2c3a640fe62f98a7fd77bbb0c.cache b/.drush/cache/default/6.1.0-install_profile-d6221ce2c3a640fe62f98a7fd77bbb0c.cache
new file mode 100644
index 00000000..2640487b
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-d6221ce2c3a640fe62f98a7fd77bbb0c.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-d6221ce2c3a640fe62f98a7fd77bbb0c","data":"standard","created":1388872871,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-db2d53dac0674209c1e0c8d975730461.cache b/.drush/cache/default/6.1.0-install_profile-db2d53dac0674209c1e0c8d975730461.cache
new file mode 100644
index 00000000..8f67b5ec
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-db2d53dac0674209c1e0c8d975730461.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-db2d53dac0674209c1e0c8d975730461","data":"standard","created":1388872823,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-dd14d5907612b228636d5e75424430f4.cache b/.drush/cache/default/6.1.0-install_profile-dd14d5907612b228636d5e75424430f4.cache
new file mode 100644
index 00000000..b9ec64ba
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-dd14d5907612b228636d5e75424430f4.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-dd14d5907612b228636d5e75424430f4","data":"standard","created":1388872833,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-ddae31a5b45a1b49749817345ddb266c.cache b/.drush/cache/default/6.1.0-install_profile-ddae31a5b45a1b49749817345ddb266c.cache
new file mode 100644
index 00000000..622496ce
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-ddae31a5b45a1b49749817345ddb266c.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-ddae31a5b45a1b49749817345ddb266c","data":"standard","created":1388872877,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-ddc856f378c7211d88df2eb1e55a88f3.cache b/.drush/cache/default/6.1.0-install_profile-ddc856f378c7211d88df2eb1e55a88f3.cache
new file mode 100644
index 00000000..368a34ed
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-ddc856f378c7211d88df2eb1e55a88f3.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-ddc856f378c7211d88df2eb1e55a88f3","data":"standard","created":1388872835,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-e1daec685ecc77c369adfc9d3dd3df8f.cache b/.drush/cache/default/6.1.0-install_profile-e1daec685ecc77c369adfc9d3dd3df8f.cache
new file mode 100644
index 00000000..d8d0d027
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-e1daec685ecc77c369adfc9d3dd3df8f.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-e1daec685ecc77c369adfc9d3dd3df8f","data":"standard","created":1388872872,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-e3bc7a91c5454b6e679fb8b2362c34c0.cache b/.drush/cache/default/6.1.0-install_profile-e3bc7a91c5454b6e679fb8b2362c34c0.cache
new file mode 100644
index 00000000..88610598
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-e3bc7a91c5454b6e679fb8b2362c34c0.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-e3bc7a91c5454b6e679fb8b2362c34c0","data":"standard","created":1388872824,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-e67452f79a9ebbf78a29ae2c4b99bc34.cache b/.drush/cache/default/6.1.0-install_profile-e67452f79a9ebbf78a29ae2c4b99bc34.cache
new file mode 100644
index 00000000..ed89230c
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-e67452f79a9ebbf78a29ae2c4b99bc34.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-e67452f79a9ebbf78a29ae2c4b99bc34","data":"standard","created":1388872892,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-ef57a5e8fa9c28a3284527316e4b4cd7.cache b/.drush/cache/default/6.1.0-install_profile-ef57a5e8fa9c28a3284527316e4b4cd7.cache
new file mode 100644
index 00000000..e9432ecb
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-ef57a5e8fa9c28a3284527316e4b4cd7.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-ef57a5e8fa9c28a3284527316e4b4cd7","data":"standard","created":1388872862,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-f52198b6ab8958fa3badb53b025be99e.cache b/.drush/cache/default/6.1.0-install_profile-f52198b6ab8958fa3badb53b025be99e.cache
new file mode 100644
index 00000000..aa587340
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-f52198b6ab8958fa3badb53b025be99e.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-f52198b6ab8958fa3badb53b025be99e","data":"standard","created":1388872883,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-f764271e5badbff755f6354ad748d1d0.cache b/.drush/cache/default/6.1.0-install_profile-f764271e5badbff755f6354ad748d1d0.cache
new file mode 100644
index 00000000..2dac8e91
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-f764271e5badbff755f6354ad748d1d0.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-f764271e5badbff755f6354ad748d1d0","data":"standard","created":1388872867,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/cache/default/6.1.0-install_profile-f8e55513aca10f5619b801276f9c4ab0.cache b/.drush/cache/default/6.1.0-install_profile-f8e55513aca10f5619b801276f9c4ab0.cache
new file mode 100644
index 00000000..436c6dd2
--- /dev/null
+++ b/.drush/cache/default/6.1.0-install_profile-f8e55513aca10f5619b801276f9c4ab0.cache
@@ -0,0 +1 @@
+{"cid":"6.1.0-install_profile-f8e55513aca10f5619b801276f9c4ab0","data":"standard","created":1388872804,"headers":null,"expire":0}
\ No newline at end of file
diff --git a/.drush/d7-all-gen-aliases.sh b/.drush/d7-all-gen-aliases.sh
new file mode 100644
index 00000000..28cb0d9d
--- /dev/null
+++ b/.drush/d7-all-gen-aliases.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+# This scripts generates site aliases for our install.
+
+aliases_drushrc_php='aliases.drushrc.php'
+
+echo '<?php' > $aliases_drushrc_php
+
+# Generate @d7
+echo "\$aliases['d7'] = array(
+    'site-list' => array(" >> $aliases_drushrc_php
+for dir in `find ../htmltest/sites/ -maxdepth 1 -type d ! -name all | sort` ; do
+    site_name=`echo $dir | tr '.' '\n' | tail -n 1`
+    echo "        'assos.centrale-marseille.fr/$site_name'," >> $aliases_drushrc_php
+done
+echo '    ),' >> $aliases_drushrc_php
+echo "    'root' => '/users/guest/assos/htmltest/'," >> $aliases_drushrc_php
+echo ');' >> $aliases_drushrc_php
+
+# Generate aliases for each site
+for dir in `find ../htmltest/sites/ -maxdepth 1 -type d ! -name all | sort` ; do
+    site_name=`echo $dir | tr '.' '\n' | tail -n 1`
+    echo "\$aliases['$site_name'] = array('uri' => 'assos.centrale-marseille.fr/$site_name', 'root' => '/users/guest/assos/htmltest/', );" >> $aliases_drushrc_php
+done
diff --git a/.drush/drush_language/LICENSE.txt b/.drush/drush_language/LICENSE.txt
new file mode 100644
index 00000000..d159169d
--- /dev/null
+++ b/.drush/drush_language/LICENSE.txt
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/.drush/drush_language/language.drush.inc b/.drush/drush_language/language.drush.inc
new file mode 100644
index 00000000..6d71549f
--- /dev/null
+++ b/.drush/drush_language/language.drush.inc
@@ -0,0 +1,168 @@
+<?php
+
+/**
+ * Implementation of hook_drush_command().
+ *
+ * @See drush_parse_command() for a list of recognized keys.
+ *
+ * @return
+ *   An associative array describing your command(s).
+ */
+function language_drush_command() {
+  $items = array();
+  $items['language-add'] = array(
+    'description' => "Add and import a new language definition",
+    'aliases' => array('langadd'),
+  );
+  $items['language-enable'] = array(
+    'description' => "Enable an already defined language",
+    'aliases' => array('langen'),
+  );
+  $items['language-disable'] = array(
+    'description' => "Disable an already defined language",
+    'aliases' => array('langdis'),
+  );
+  $items['language-default'] = array(
+    'description' => "Assign an enabled language as default",
+    'aliases' => array('langdef'),
+  );
+  return $items;
+}
+
+/**
+ * Add a language
+ */
+function drush_language_add() {
+  if (!function_exists('locale_add_language')) {
+    drush_set_error(dt('Could not add language. Is the \'locale\' module enabled?'));
+    return;
+  }
+
+  $args = func_get_args();
+  if (count($args) == 0) {
+    drush_set_error(dt('Please provide one or more language codes as arguments.'));
+    return;
+  }
+
+  foreach ($args as $langcode) {
+    if (array_key_exists($langcode, language_list())) {
+      drush_log(dt('The language with code !code already exists.', array('!code' => $langcode)), 'warning');
+    }
+    else {
+      // Predefined language selection.
+      include_once DRUPAL_ROOT . '/includes/iso.inc';
+      $predefined = _locale_get_predefined_list();
+      if (!isset($predefined[$langcode])) {
+        drush_log(dt('Invalid language code !language', array('!language' => $langcode)), 'warning');
+      }
+      else {
+        // Add the language definition
+        locale_add_language($langcode);
+        // See if we have language files to import for the newly added
+        // language, collect and import them.
+        if ($batch = locale_batch_by_language($langcode, '_locale_batch_language_finished')) {
+          batch_set($batch);
+
+          $batch =& batch_get();
+          $batch['progressive'] = FALSE;
+
+          // Process the batch.
+          drush_backend_batch_process();
+        }
+        drush_log(dt('Added language: !language', array('!language' => $langcode)), 'ok');
+      }
+    }
+  }
+}
+
+/**
+ * Enable a language
+ */
+function drush_language_enable() {
+  $args = func_get_args();
+  if (count($args) == 0) {
+    drush_set_error(dt('Please provide one or more language codes as arguments.'));
+    return;
+  }
+
+  foreach ($args as $langcode) {
+    $languages = language_list();
+    if (array_key_exists($langcode, $languages)) {
+      if (!$languages[$langcode]->enabled) {
+        // disable the default english
+        db_update('languages')
+          ->condition('language', $langcode)
+          ->fields(array(
+            'enabled' => 1,
+          ))
+          ->execute();
+
+        // Changing the language settings impacts the interface.
+        cache_clear_all('*', 'cache_page', TRUE);
+        drush_log(dt("Enabled language : !language ", array('!language' => $langcode)), 'ok');
+      }
+      else {
+        drush_log(dt("Language already enabled: !language ", array('!language' => $langcode)), 'warning');
+      }
+    }
+    else {
+      drush_log(dt("Specified language does not exist !language", array('!language' => $langcode)), 'warning');
+    }
+  }
+}
+
+/**
+ * Disables a language
+ */
+function drush_language_disable() {
+  $args = func_get_args();
+  if (count($args) == 0) {
+    drush_set_error(dt('Please provide one or more language codes as arguments.'));
+    return;
+  }
+
+  foreach ($args as $langcode) {
+    $languages = language_list();
+    if (array_key_exists($langcode, $languages)) {
+      if ($languages[$langcode]->enabled) {
+        // disable the default english
+        db_update('languages')
+          ->condition('language', $langcode)
+          ->fields(array(
+            'enabled' => 0,
+          ))
+          ->execute();
+
+        // Changing the language settings impacts the interface.
+        cache_clear_all('*', 'cache_page', TRUE);
+        drush_log(dt("Disabled language : !language ", array('!language' => $langcode)), 'ok');
+      }
+      else {
+        drush_print(dt("Language already disabled: !language ", array('!language' => $langcode)), 'warning');
+      }
+    }
+  }
+}
+
+/**
+ * Assigns the default language
+ */
+function drush_language_default() {
+  $args = func_get_args();
+  if (count($args) == 0) {
+    drush_set_error(dt('Please provide one or more language codes as arguments.'));
+    return;
+  }
+
+  foreach ($args as $langcode) {
+    // get all the languages
+    $languages = language_list();
+    if (array_key_exists($langcode, $languages)) {
+      variable_set('language_default', (object) $languages[$langcode]);
+      drush_log(dt("!language assigned as default", array('!language' => $langcode)), 'ok');
+    }
+    else {
+      drush_log(dt("Specified language does not exist !language", array('!language' => $langcode)), 'warning');
+    }
+  }
+}
diff --git a/.drush/drush_make/EXAMPLE.make b/.drush/drush_make/EXAMPLE.make
new file mode 100644
index 00000000..cd7a6a0f
--- /dev/null
+++ b/.drush/drush_make/EXAMPLE.make
@@ -0,0 +1,86 @@
+; $Id: EXAMPLE.make,v 1.1.2.4 2010/09/04 16:11:37 dmitrig01 Exp $
+;
+; Example makefile
+; ----------------
+; This is an example makefile to introduce new users of drush_make to the
+; syntax and options available to drush_make. For a full description of all
+; options available, see README.txt.
+
+; This make file is a working makefile - try it! Any line starting with a `;`
+; is a comment.
+
+; Core version
+; ------------
+; Each makefile should begin by declaring the core version of Drupal that all
+; projects should be compatible with.
+
+core = 6.x
+
+; Core project
+; ------------
+; In order for your makefile to generate a full Drupal site, you must include
+; a core project. This is usually Drupal core, but you can also specify
+; alternative core projects like Pressflow. Note that makefiles included with
+; install profiles *should not* include a core project.
+
+; Use pressflow instead of Drupal core:
+; projects[pressflow][type] = "core"
+; projects[pressflow][download][type] = "get"
+; projects[pressflow][download][url] = "http://launchpad.net/pressflow/6.x/6.15.73/+download/pressflow-6.15.73.tar.gz"
+
+; CVS checkout of Drupal 6.x core:
+; projects[drupal][type] = "core"
+; projects[drupal][download][type] = "cvs"
+; projects[drupal][download][root] = ":pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal"
+; projects[drupal][download][revision] = "DRUPAL-6"
+; projects[drupal][download][module] = "drupal"
+
+; CVS checkout of Drupal 7.x. Requires the `core` property to be set to 7.x.
+; projects[drupal][type] = "core"
+; projects[drupal][download][type] = "cvs"
+; projects[drupal][download][root] = ":pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal"
+; projects[drupal][download][revision] = "HEAD"
+; projects[drupal][download][module] = "drupal"
+
+projects[] = drupal
+
+; Projects
+; --------
+; Each project that you would like to include in the makefile should be
+; declared under the `projects` key. The simplest declaration of a project
+; looks like this:
+
+projects[] = views
+
+; This will, by default, retrieve the latest recommended version of the project
+; using its update XML feed on Drupal.org. If any of those defaults are not
+; desirable for a project, you will want to use the keyed syntax combined with
+; some options.
+
+; If you want to retrieve a specific version of a project:
+
+projects[cck] = 2.6
+
+; Or an alternative, extended syntax:
+
+projects[ctools][version] = 1.3
+
+; Check out the latest version of a project from CVS. Note that when using a
+; repository as your project source, you must explictly declare the project
+; type so that drush_make knows where to put your project.
+
+projects[data][type] = module
+projects[data][download][type] = cvs
+projects[data][download][module] = contributions/modules/data
+projects[data][download][revision] = DRUPAL-6--1
+
+; Clone a project from github.
+
+projects[tao][type] = theme
+projects[tao][download][type] = git
+projects[tao][download][url] = git://github.com/developmentseed/tao.git
+
+; If you want to install a module into a sub-directory, you can use the
+; `subdir` attribute.
+
+projects[admin_menu][subdir] = custom
diff --git a/.drush/drush_make/INSTALL.txt b/.drush/drush_make/INSTALL.txt
new file mode 100644
index 00000000..1b97b707
--- /dev/null
+++ b/.drush/drush_make/INSTALL.txt
@@ -0,0 +1,17 @@
+$Id: INSTALL.txt,v 1.1.2.4 2010/09/04 16:11:37 dmitrig01 Exp $
+
+Installation
+------------
+Drush make depends on drush (the DRUpal SHell). To use drush_make, you
+first download and install drush from http://drupal.org/project/drush. Install
+instructions can be found at http://tinyurl.com/drush-installation. It contains
+a section about installing other commands like drush_make.
+
+Here is the relevant section.
+
+You can put this folder in a number of places:
+
+- In a .drush folder in your HOME folder. Note, that you have to make the
+  .drush folder yourself (so you end up with ~/.drush/drush_make/INSTALL.txt).
+- In a folder specified with the include option (see above).
+- In /path/to/drush/commands (not a Smart Thing, but it would work).
diff --git a/.drush/drush_make/LICENSE.txt b/.drush/drush_make/LICENSE.txt
new file mode 100644
index 00000000..2c095c8d
--- /dev/null
+++ b/.drush/drush_make/LICENSE.txt
@@ -0,0 +1,274 @@
+GNU GENERAL PUBLIC LICENSE
+
+              Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave,
+Cambridge, MA 02139, USA. Everyone is permitted to copy and distribute
+verbatim copies of this license document, but changing it is not allowed.
+
+                  Preamble
+
+The licenses for most software are designed to take away your freedom to
+share and change it. By contrast, the GNU General Public License is
+intended to guarantee your freedom to share and change free software--to
+make sure the software is free for all its users. This General Public License
+applies to most of the Free Software Foundation's software and to any other
+program whose authors commit to using it. (Some other Free Software
+Foundation software is covered by the GNU Library General Public License
+instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the
+freedom to distribute copies of free software (and charge for this service if
+you wish), that you receive source code or can get it if you want it, that you
+can change the software or use pieces of it in new free programs; and that
+you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to
+deny you these rights or to ask you to surrender the rights. These restrictions
+translate to certain responsibilities for you if you distribute copies of the
+software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for
+a fee, you must give the recipients all the rights that you have. You must make
+sure that they, too, receive or can get the source code. And you must show
+them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software. If the
+software is modified by someone else and passed on, we want its recipients
+to know that what they have is not the original, so that any problems
+introduced by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We
+wish to avoid the danger that redistributors of a free program will individually
+obtain patent licenses, in effect making the program proprietary. To prevent
+this, we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+           GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND
+               MODIFICATION
+
+0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms
+of this General Public License. The "Program", below, refers to any such
+program or work, and a "work based on the Program" means either the
+Program or any derivative work under copyright law: that is to say, a work
+containing the Program or a portion of it, either verbatim or with
+modifications and/or translated into another language. (Hereinafter, translation
+is included without limitation in the term "modification".) Each licensee is
+addressed as "you".
+
+Activities other than copying, distribution and modification are not covered
+by this License; they are outside its scope. The act of running the Program is
+not restricted, and the output from the Program is covered only if its contents
+constitute a work based on the Program (independent of having been made
+by running the Program). Whether that is true depends on what the Program
+does.
+
+1. You may copy and distribute verbatim copies of the Program's source
+code as you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this License
+and to the absence of any warranty; and give any other recipients of the
+Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you
+may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it,
+thus forming a work based on the Program, and copy and distribute such
+modifications or work under the terms of Section 1 above, provided that you
+also meet all of these conditions:
+
+a) You must cause the modified files to carry prominent notices stating that
+you changed the files and the date of any change.
+
+b) You must cause any work that you distribute or publish, that in whole or in
+part contains or is derived from the Program or any part thereof, to be
+licensed as a whole at no charge to all third parties under the terms of this
+License.
+
+c) If the modified program normally reads commands interactively when run,
+you must cause it, when started running for such interactive use in the most
+ordinary way, to print or display an announcement including an appropriate
+copyright notice and a notice that there is no warranty (or else, saying that
+you provide a warranty) and that users may redistribute the program under
+these conditions, and telling the user how to view a copy of this License.
+(Exception: if the Program itself is interactive but does not normally print such
+an announcement, your work based on the Program is not required to print
+an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable
+sections of that work are not derived from the Program, and can be
+reasonably considered independent and separate works in themselves, then
+this License, and its terms, do not apply to those sections when you distribute
+them as separate works. But when you distribute the same sections as part
+of a whole which is a work based on the Program, the distribution of the
+whole must be on the terms of this License, whose permissions for other
+licensees extend to the entire whole, and thus to each and every part
+regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to
+work written entirely by you; rather, the intent is to exercise the right to
+control the distribution of derivative or collective works based on the
+Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of a
+storage or distribution medium does not bring the other work under the scope
+of this License.
+
+3. You may copy and distribute the Program (or a work based on it, under
+Section 2) in object code or executable form under the terms of Sections 1
+and 2 above provided that you also do one of the following:
+
+a) Accompany it with the complete corresponding machine-readable source
+code, which must be distributed under the terms of Sections 1 and 2 above
+on a medium customarily used for software interchange; or,
+
+b) Accompany it with a written offer, valid for at least three years, to give
+any third party, for a charge no more than your cost of physically performing
+source distribution, a complete machine-readable copy of the corresponding
+source code, to be distributed under the terms of Sections 1 and 2 above on
+a medium customarily used for software interchange; or,
+
+c) Accompany it with the information you received as to the offer to distribute
+corresponding source code. (This alternative is allowed only for
+noncommercial distribution and only if you received the program in object
+code or executable form with such an offer, in accord with Subsection b
+above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source code
+means all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation and
+installation of the executable. However, as a special exception, the source
+code distributed need not include anything that is normally distributed (in
+either source or binary form) with the major components (compiler, kernel,
+and so on) of the operating system on which the executable runs, unless that
+component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to
+copy from a designated place, then offering equivalent access to copy the
+source code from the same place counts as distribution of the source code,
+even though third parties are not compelled to copy the source along with the
+object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License. Any attempt otherwise to copy,
+modify, sublicense or distribute the Program is void, and will automatically
+terminate your rights under this License. However, parties who have received
+copies, or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it.
+However, nothing else grants you permission to modify or distribute the
+Program or its derivative works. These actions are prohibited by law if you
+do not accept this License. Therefore, by modifying or distributing the
+Program (or any work based on the Program), you indicate your acceptance
+of this License to do so, and all its terms and conditions for copying,
+distributing or modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the original
+licensor to copy, distribute or modify the Program subject to these terms and
+conditions. You may not impose any further restrictions on the recipients'
+exercise of the rights granted herein. You are not responsible for enforcing
+compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues), conditions
+are imposed on you (whether by court order, agreement or otherwise) that
+contradict the conditions of this License, they do not excuse you from the
+conditions of this License. If you cannot distribute so as to satisfy
+simultaneously your obligations under this License and any other pertinent
+obligations, then as a consequence you may not distribute the Program at all.
+For example, if a patent license would not permit royalty-free redistribution
+of the Program by all those who receive copies directly or indirectly through
+you, then the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and
+the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or
+other property right claims or to contest validity of any such claims; this
+section has the sole purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license practices. Many
+people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose
+that choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original copyright
+holder who places the Program under this License may add an explicit
+geographical distribution limitation excluding those countries, so that
+distribution is permitted only in or among countries not thus excluded. In such
+case, this License incorporates the limitation as if written in the body of this
+License.
+
+9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will be
+similar in spirit to the present version, but may differ in detail to address new
+problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies
+a version number of this License which applies to it and "any later version",
+you have the option of following the terms and conditions either of that
+version or of any later version published by the Free Software Foundation. If
+the Program does not specify a version number of this License, you may
+choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission. For software which is copyrighted by the Free Software
+Foundation, write to the Free Software Foundation; we sometimes make
+exceptions for this. Our decision will be guided by the two goals of
+preserving the free status of all derivatives of our free software and of
+promoting the sharing and reuse of software generally.
+
+               NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE,
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT
+PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
+WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR
+AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR
+ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
+LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL,
+SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OR INABILITY TO USE THE
+PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA
+OR DATA BEING RENDERED INACCURATE OR LOSSES
+SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
+PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN
+IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.
+
+          END OF TERMS AND CONDITIONS
diff --git a/.drush/drush_make/README.txt b/.drush/drush_make/README.txt
new file mode 100644
index 00000000..8aaff202
--- /dev/null
+++ b/.drush/drush_make/README.txt
@@ -0,0 +1,399 @@
+$Id: README.txt,v 1.1.2.19 2010/09/09 06:43:06 dmitrig01 Exp $
+
+Drush make
+----------
+Drush make is an extension to drush that can create a ready-to-use drupal site,
+pulling sources from various locations. It does this by parsing a flat text file
+(similar to a drupal `.info` file) and downloading the sources it describes. In
+practical terms, this means that it is possible to distribute a complicated
+Drupal distribution as a single text file.
+
+Among drush make's capabilities are:
+
+- Downloading Drupal core, as well as contrib modules from drupal.org.
+- Checking code out from CVS, SVN, git, and bzr repositories.
+- Getting plain `.tar.gz` and `.zip` files (particularly useful for libraries
+  that can not be distributed directly with drupal core or modules).
+- Fetching and applying patches.
+- Fetching modules, themes, and installation profiles, but also external
+  libraries.
+
+
+Usage
+-----
+The `drush make` command can be executed from a path within a Drupal codebase or
+independent of any Drupal sites entirely. See the examples below for instances
+where `drush make` can be used within an existing Drupal site.
+
+    drush make [-options] [filename.make] [build path]
+
+
+### Options
+
+    --contrib-destination=path
+
+      Specify a path under which modules and themes should be
+      placed. Defaults to sites/all.
+
+    --force-complete
+
+      Force a complete build even if errors occur.
+
+    --md5
+
+      Output an md5 hash of the current build after completion.
+
+    --no-clean
+
+      Leave temporary build directories in place instead of
+      cleaning up after completion.
+
+    --no-core
+
+      Do not require a Drupal core project to be specified.
+
+    --no-patch-txt
+
+      Do not write a PATCHES.txt file in the directory of
+      each patched project.
+
+    --prepare-install
+
+      Prepare the built site for installation. Generate a
+      properly permissioned settings.php and files directory.
+
+    --tar
+
+      Generate a tar archive of the build. The output filename
+      will be [build path].tar.gz.
+
+    --test
+
+      Run a temporary test build and clean up.
+
+    --translations=languages
+
+      Retrieve translations for the specified comma-separated list
+      of language(s) if available for all projects.
+
+    --working-copy
+
+      Where possible, retrieve a working copy of projects from
+      their respective repositories.
+
+
+### Examples
+
+1. Build a Drupal site at `example/` including Drupal core and any projects
+   defined in the makefile:
+
+        drush make example.make example
+
+2. Build a tarball of the platform above as `example.tar.gz`:
+
+        drush make --tar example.make example
+
+3. Build an installation profile within an existing Drupal site:
+
+        drush make --no-core --contrib-destination=. installprofile.make
+
+
+The `.make` file format
+-----------------------
+Each makefile is a plain text file that adheres to the Drupal `.info` file
+syntax. See the included `example.make` for an example of a working makefile.
+
+
+### Core version
+
+The make file always begins by specifying the core version of Drupal for which
+ each package must be compatible. Example:
+
+    core = 6.x
+
+
+### Projects
+
+An array of the projects to be retrieved. Each project name can be specified as
+a single string value. If further options need to be provided for a project, the
+project should be specified as the key.
+
+**Project with no further options:**
+
+    projects[] = drupal
+
+**Project using options (see below):**
+
+    projects[drupal][version] = 6.15
+
+Do not use both types of declarations for a single project in your makefile.
+
+
+### Project options
+
+- `version`
+
+  Specifies the version of the project to retrieve.
+  This can be as loose as the major branch number or
+  as specific as a particular point release.
+
+        projects[views][version] = 3
+        projects[views][version] = 2.8
+        projects[views][version] = 3.0-alpha2
+
+        ; Shorthand syntax for versions if no other options are to be specified
+        projects[views] = 3.0-alpha2
+
+- `patch`
+
+  One ore more patches to apply to this project. An array of URLs from which
+  each patch should be retrieved.
+
+        projects[adminrole][patch][] = "http://drupal.org/files/issues/adminrole_exceptions.patch"
+
+- `subdir`
+
+  Place a project within a subdirectory of the `--contrib-destination`
+  specified. In the example below, `cck` will be placed in
+  `sites/all/modules/contrib` instead of the default `sites/all/modules`.
+
+        projects[cck][subdir] = "contrib"
+
+- `location`
+
+  URL of an alternate project update XML server to use. Allows project XML data
+  to be retrieved from sites other than `updates.drupal.org`.
+
+        projects[tao][location] = "http://code.developmentseed.com/fserver"
+
+- `type`
+
+  The project type. Must be provided if an update XML source is not specified
+  and/or using version control or direct retrieval for a project. May be one of
+  the following values: core, module, profile, theme.
+
+        projects[mytheme][type] = "theme"
+
+- `directory_name`
+
+  Provide an alternative directory name for this project. By default, the
+  project name is used.
+
+        projects[mytheme][directory_name] = "yourtheme"
+
+- `l10n_path`
+
+  Specific URL (can include tokens) to a translation. Allows translations to be
+  retrieved from l10n servers other than `localize.drupal.org`.
+
+        projects[mytheme][l10n_path] = "http://myl10nserver.com/files/translations/%project-%core-%version-%language.po"
+
+- `l10n_url`
+
+  URL to an l10n server XML info file. Allows translations to be retrieved from
+  l10n servers other than `localize.drupal.org`.
+
+        projects[mytheme][l10n_url] = "http://myl10nserver.com/l10n_server.xml"
+
+
+### Project download options
+
+  Use an alternative download method instead of retrieval through update XML.
+  The following methods are available:
+
+- `download[type][get]`
+
+  Retrieve a project as a direct download. Options:
+
+  `url` - the URL of the file. Required.
+
+- `download[type][post]`
+
+  Retrieve a project as a direct download using an HTTP POST request. Options:
+
+  `url` - the URL of the file. Required.
+
+  `post_data` - The post data to be submitted with the request. Should be a
+  valid URL query string. Required.
+
+  `file_type` - A file type extension to use for the retrieved file. Optional.
+
+     projects[mytheme][download][type] = "post"
+     projects[mytheme][download][url] = "http://example.com/download/mytheme"
+     projects[mytheme][download][post_data] = "format=zip&version=1.0"
+
+- `download[type][bzr]`
+
+  Use a bazaar repository as the source for this project. Options:
+
+  `url` - the URL of the repository. Required.
+
+- `download[type][cvs]`
+
+  Use a CVS repository as the source for this project. Options:
+
+  `date` - use the latest revision no later than specified date. See the CVS
+  man page for more about how to use the date flag.
+
+  `root` - the CVS repository to use for this project. Optional. If unspecified,
+  the `CVSROOT` environment value will first be used and finally Drupal contrib
+  CVS is used as a last resort fallback.
+
+  `module` - the CVS module to retrieve. Required.
+
+  `revision` - a specific tag or revision to check out. Optional.
+
+     projects[mytheme][download][type] = "cvs"
+     projects[mytheme][download][module] = "mytheme"
+
+- `download[type][git]`
+
+  Use a git repository as the source for this project. Options:
+
+  `url` - the URL of the repository. Required.
+
+  `branch` - the branch to be checked out. Optional.
+
+  `revision` - a specific revision identified by commit to check out. Optional.
+
+  `tag` - the tag to be checked out. Optional.
+
+     projects[mytheme][download][type] = "git"
+     projects[mytheme][download][url] = "git://github.com/jane_doe/mytheme.git"
+
+- `download[type][svn]`
+
+  Use an SVN repository as the source for this project. Options:
+
+  `url` - the URL of the repository. Required.
+
+  `username` - the username to use when retrieving an SVN project as a working
+  copy or from a private repository. Optional.
+
+  `password` - the password to use when retrieving an SVN project as a working
+  copy or from a private repository. Optional.
+
+     projects[mytheme][download][type] = "svn"
+     projects[mytheme][download][url] = "http://example.com/svnrepo/cool-theme/"
+
+
+### Libraries
+
+An array of non-Drupal-specific libraries to be retrieved (e.g. js, PHP or other
+Drupal-agnostic components). Each library should be specified as the key of an
+array of options in the libraries array.
+
+**Example:**
+
+    libraries[jquery_ui][download][type] = "get"
+    libraries[jquery_ui][download][url] = "http://jquery- ui.googlecode.com/files/jquery.ui-1.6.zip"
+
+
+### Library options
+
+Libraries share the `download`, `destination` and `directory_name` options with
+projects. Additionally, they may specify a destination:
+
+- `destination`
+
+  The target path to which this library should be moved. The path is relative to
+  that specified by the `--contrib-destination` option. By default, libraries
+  are placed in the `libraries` directory.
+
+        libraries[jquery_ui][destination] = "modules/contrib/jquery_ui
+
+
+### Includes
+
+An array of makefiles to include. Each include may be a local path or a direct
+URL to the makefile. Includes are appended in order with the source makefile
+appended last, allowing latter makefiles to override the keys/values of former
+makefiles.
+
+**Example:**
+
+    includes[example] = "example.make"
+    includes[remote] = "http://www.example.com/remote.make"
+
+
+Recursion
+---------
+If a project that is part of a build contains a `.make` itself, drush make will
+automatically parse it and recurse into a derivative build.
+
+For example, a full build tree may look something like this:
+
+    drush make distro.make distro
+
+    distro.make FOUND
+    - Drupal core
+    - Foo bar install profile
+      + foobar.make FOUND
+        - CCK
+        - Token
+        - Module x
+          + x.make FOUND
+            - External library x.js
+        - Views
+        - etc.
+
+Recursion can be used to nest an install profile build in a Drupal site, easily
+build multiple install profiles on the same site, fetch library dependencies for
+a given module, or bundle a set of module and its dependencies together.
+
+**Build a full Drupal site with the Managing News install profile:**
+
+    core = 6.x
+    projects[] = drupal
+    projects[] = managingnews
+
+Testing
+-------
+Drush make also comes with testing capabilities, designed to test drush make
+itself. Writing a new test is extremely simple. The process is as follows:
+
+1. Figure out what you want to test. Write a makefile that will test this out.
+   You can refer to existing test makefiles for examples.
+2. Drush make your makefile, and use the --md5 option. You may also use other
+   options, but be sure to take note of which ones for step 4.
+3. Verify that the result you got was in fact what you expected. If so,
+   continue. If not, tweak it and re-run step 2 until it's what you expected.
+4. Using the md5 hash that was spit out from step 2, make a new entry in the
+   tests array in drush_make.test.inc, following the example below.
+    'machine-readable-name' => array(
+      'name'     => 'Human readable name',
+      'makefile' => 'tests/yourtest.make',
+      'messages' => array(
+          'Build hash: f68e6510-your-hash-e04fbb4ed',
+      ),
+      'options'  => array('any' => TRUE, 'other' => TRUE, 'options' => TRUE),
+    ),
+5. Test! Run drush make-test machine-readable-name to see if the test passes.
+
+You can check for any messages you want in the message array, but the most
+basic tests would just check the build hash.
+
+Generate
+--------
+
+Drush make has a primitive makefile generation capability. To use it, simply
+change your directory to the Drupal installation from which you would like to
+generate the file, and run the following command: 
+
+`drush generate makefile /path/to/make-file.make`
+
+This will generate a basic makefile. If you have code from other repositories,
+the makefile will not complete - you'll have to fill in some information before
+it is fully functional.
+
+Maintainer
+----------
+- Dmitri Gaskin (dmitrig01)
+
+Co-maintainers
+------------
+- Adrian Rossouw (adrian)
+- Antoine Beaupré (anarcat)
+- Chad Phillips (hunmonk)
+- Jeff Miccolis (jmiccolis)
+- Young Hahn (yhahn)
diff --git a/.drush/drush_make/contrib/drush_make_d_o.convert.inc b/.drush/drush_make/contrib/drush_make_d_o.convert.inc
new file mode 100644
index 00000000..689713da
--- /dev/null
+++ b/.drush/drush_make/contrib/drush_make_d_o.convert.inc
@@ -0,0 +1,370 @@
+<?php
+// $Id: drush_make_d_o.convert.inc,v 1.1.2.17 2010/09/09 07:11:00 dmitrig01 Exp $
+
+class DrushMakeDrupalorgVersionChecker {
+  function latestVersion($project_name, $version) {
+
+    // Project types that are valid for the version checker.
+    $allowed_project_types = array(
+      'core',
+      'module',
+      'theme',
+    );
+
+    $project = array(
+      'name'           => $project_name,
+      'core'           => $this->core,
+      'version'        => $version,
+      'location'       => drush_get_option('drush-make-update-default-url'),
+    );
+    $project = drush_make_updatexml($project);
+
+    // Because the version data we get back from the XML may not be the same
+    // data we passed, and because we can fail even if version data is
+    // returned, track both the success/failure of the request, and  the
+    // version data.
+
+    // Check for bad projects and branch releases.
+    if (empty($project) || preg_match('/.*-dev$/', $project['version'])) {
+      // Use the passed version if no version was returned.
+      if (empty($project)) {
+        $final_version = $version;
+      }
+      else {
+        $final_version = $project['version'];
+      }
+      if ($project_name == 'drupal') {
+        drush_make_error('BUILD_ERROR', dt("Drupal core does not have an official release for version '%version' yet.", array('%version' => $final_version)));
+      }
+      else {
+        drush_make_error('BUILD_ERROR', dt("Project '%project' does not have an official release for version '%version'.", array('%project' => $project_name, '%version' => $final_version)));
+      }
+      $result = FALSE;
+    }
+    // Make sure the project is an allowed project type.
+    elseif (!in_array($project['type'], $allowed_project_types)) {
+      drush_make_error('BUILD_ERROR', dt("Project %project of type '%type' is not permitted.", array('%project' => $project_name, '%type' => $project['type'])));
+      $final_version = $project['version'];
+      $result = FALSE;
+    }
+    else {
+      $final_version = $project['version'];
+      $result = TRUE;
+    }
+    return array($result, $final_version);
+  }
+}
+
+class DrushMakeDrupalorgConverter extends DrushMakeDrupalorgVersionChecker {
+  function __construct($from, $to = NULL) {
+    $this->from = $from;
+    $this->to = $to;
+    $this->log = array();
+  }
+
+  function run() {
+    if ($this->read()) {
+      if ($this->convert()) {
+        $this->write();
+      }
+    }
+  }
+
+  function read() {
+    if (!($this->old_info = drush_make_parse_info_file($this->from))) {
+      drush_make_error('FILE_ERROR', dt("Unable to parse file %file", array('%file' => $this->from)));
+      return FALSE;
+    }
+    return TRUE;
+  }
+
+  function log($message, $type = 'ok') {
+    // Save the log messages so they can be put into the output for the .make
+    // file.
+    if (empty($this->to)) {
+      $this->log[] = "[$type]: \t $message";
+    }
+    // Only log to screen if we're outputting the conversion to file.
+    else {
+      drush_log($message, $type);
+    }
+  }
+
+  function convert() {
+    // Run the regular validation first.  This performs basic syntax
+    // validation, and also pre-converts special syntax into a standard
+    // format. Since the info file validation doesn't return any data if
+    // validation fails, we have to bail here.
+    if (!($this->old_info = drush_make_validate_info_file($this->old_info))) {
+      return FALSE;
+    }
+
+    // The list of currently allowed top-leval attributes.
+    $top_level_attribute_whitelist = array('core', 'api', 'core_release', 'projects');
+
+    // The list of currently allowed project-level attributes.
+    $project_attribute_whitelist = array('version', 'subdir', 'patch');
+
+    // The list of currently disallowed projects.
+    $project_disallowed_list = array('drupal');
+
+    // Assume no errors to start.
+    $errors = FALSE;
+
+    // First order of business: convert core version.
+    $parts = explode('.', $this->old_info['core']);
+    $core_major = $parts[0];
+    $this->core = $core_major . '.x';
+
+    // Check for a stable release on the branch.
+    list($result, $final_version) = $this->latestVersion('drupal', $core_major);
+    if ($result) {
+      $this->new_info['core'] = $final_version;
+      $this->log(dt('Setting the Drupal core version to %version.', array('%version' => $final_version)));
+    }
+    else {
+      $errors = TRUE;
+    }
+    $this->new_info['api'] = 2;
+
+    if (isset($this->old_info['projects'])) {
+      foreach ($this->old_info['projects'] as $project => $project_data) {
+
+        // Skip conversion for disallowed projects.
+        if (in_array($project, $project_disallowed_list)) {
+          if ($project == 'drupal') {
+            $this->log(dt("It is not permitted to include Drupal core as a project in an install profile -- it has been removed"), 'warning');
+          }
+          else {
+            $this->log(dt("Removed disallowed project '%project'", array('%project' => $project)), 'warning');
+          }
+          continue;
+        }
+ 
+        // Clean out disallowed project attributes.
+        foreach ($project_data as $attribute => $attribute_value) {
+          if (!in_array($attribute, $project_attribute_whitelist)) {
+            $this->log(dt("The '%attribute' attribute is not allowed for the '%project' project, removing.", array('%attribute' => $attribute, '%project' => $project)), 'warning');
+            unset($project_data[$attribute]);
+          }
+        }
+        
+        // Check that patches do in fact come from drupal.org.
+        if (isset($project_data['patch'])) {
+          foreach ($project_data['patch'] as $key => $patch) {
+            if (strpos($patch, 'http://drupal.org/files/issues') !== 0) {
+              $this->log(dt("The patch '%patch' is not hosted on drupal.org -- it has been removed.", array('%patch' => $patch)), 'warning');
+              unset($project_data['patches'][$key]);
+            }
+          }
+        }
+
+        // Reset the versioning variables to start fresh for every project.
+        $version = NULL;
+        $result = FALSE;
+        $final_version = '';
+
+        // Figure out the basic version string.
+        if (empty($project_data['version'])) {
+          $version = DRUSH_MAKE_VERSION_BEST;
+        }
+        elseif (preg_match('/^(\d+)((\.\d+)(-[a-z0-9]+)?)?$/', $project_data['version'], $matches)) {
+          // Branch version only.
+          if (empty($matches[2])) {
+            $version = $matches[1];
+          }
+          // Development snapshots not allowed.
+          elseif (!empty($matches[4]) && $matches[4] == '-dev') {
+            drush_make_error('BUILD_ERROR', dt("An official release is required for '%project' -- a development version cannot be used.", array('%project' => $project)));
+            $errors = TRUE;
+            // Move on, nothing more needs to be done with this project.
+            continue;
+          }
+          // All regular releases.
+          else {
+            $version = $matches[1] . $matches[2];
+          }
+        }
+
+        // Use the update XML to verify this project actually has a valid 
+        // release.
+        if (isset($version)) {
+          list($result, $final_version) = $this->latestVersion($project, $version);
+        }
+        if ($result) {
+          $this->log(dt("Setting version for project '%project' to '%version'", array('%project' => $project, '%version' => $final_version)));
+          $project_data['version'] = $final_version;
+          if (array_keys($project_data) == array('version')) {
+            $project_data = $project_data['version'];
+          }
+
+          $this->new_info['projects'][$project] = $project_data;
+        }
+        else {
+          $errors = TRUE;
+        }
+      }
+    }
+
+    // Clean out disallowed top-level attributes.
+    foreach ($this->old_info as $attribute => $attribute_value) {
+      if (!in_array($attribute, $top_level_attribute_whitelist)) {
+        $this->log(dt("The '%attribute' make file attribute is not allowed, removing.", array('%attribute' => $attribute, )), 'warning');
+      }
+    }
+
+    if ($errors) {
+      return FALSE;
+    }
+    return TRUE;
+  }
+
+  function write() {
+    $output = $this->render($this->new_info);
+    // Write to stdout.
+    if (empty($this->to)) {
+      $log = '';
+      if (!empty($this->log)) {
+        $log .= dt("; Logged conversion messages follow. The final converted .make file follows these messages.\n");
+        foreach ($this->log as $message) {
+          $log .= "; $message\n";
+        }
+      }
+      print $log . $output;
+    }
+    // Write to file.
+    else {
+      if (file_put_contents($this->to, $output)) {
+        drush_log(dt("Successfully wrote converted .make file %file.", array('%file' => $this->to)), 'ok');
+      }
+      else {
+        drush_make_error('FILE_ERROR', dt("Unable to write .make file %file.", array('%file' => $this->to)));
+      }
+    }
+  }
+
+  function render($info, $parents = array()) {
+    $output = '';
+    foreach ($info as $key => $value) {
+      if (is_numeric($key)) {
+        $key = '';
+      }
+      if (is_array($value)) {
+        $p = $parents;
+        $p[] = $key;
+        $output .= $this->render($value, $p);
+      }
+      else {
+        // For simplicity
+        $first = TRUE;
+        $p = $parents;
+        $p[] = $key;
+        foreach ($p as $parent) {
+          if ($first) {
+            $key_definition = $parent;
+            $first = FALSE;
+          }
+          else {
+            $key_definition .= '[' . $parent . ']';
+          }
+        }
+        $output .= "$key_definition = $value\n";
+      }
+      if (count($parents) < 2) {
+        $output .= "\n";
+      }
+    }
+    return $output;
+  }
+
+}
+
+class DrushMakeDrupalorgVerifier extends DrushMakeDrupalorgVersionChecker {
+  function __construct($makefile) {
+    $this->makefile = $makefile;
+  }
+
+  function run() {
+    if ($makefile = $this->read($this->makefile)) {
+      $this->verify($makefile);
+    }
+  }
+
+  function read($makefile) {
+    if (!($makefile = drush_make_parse_info_file($makefile))) {
+      drush_make_error('FILE_ERROR', dt("Unable to parse file %file", array('%file' => $makefile)));
+      return FALSE;
+    }
+    return $makefile;
+  }
+
+  function verify($makefile) {
+    // Run the regular validation first.  This performs basic syntax
+    // validation, and also pre-converts special syntax into a standard
+    // format. Since the info file validation doesn't return any data if
+    // validation fails, we have to bail here.
+    if (!($makefile = drush_make_validate_info_file($makefile))) {
+      return FALSE;
+    }
+
+    // Now run drupal.org specific validation on the file.
+    if (!($makefile = drush_make_d_o_validate_info_file($makefile))) {
+      return FALSE;
+    }
+    
+    $this->core = $makefile['core'];
+    // Check for a stable release on the branch.
+    list($result, $final_version) = $this->latestVersion('drupal', $makefile['core_release']);
+    if (!$result) {
+      $errors = TRUE;
+    }
+  
+    if (isset($makefile['projects'])) {
+
+      // The list of currently disallowed projects.
+      $project_disallowed_list = array('drupal');
+      foreach ($makefile['projects'] as $project => $project_data) {
+        // Error out on disallowed projects.
+        if (in_array($project, $project_disallowed_list)) {
+          if ($project == 'drupal') {
+            drush_make_error('BUILD_ERROR', dt("It is not permitted to include Drupal core as a project in an install profile."));
+          }
+          else {
+            drush_make_error('BUILD_ERROR', dt("Project '%project' is not permitted in an install profile.", array('%project' => $project)));
+          }
+          $errors = TRUE;
+        }
+        else {
+          // Use the update XML to verify this project actually has this 
+          // release.
+          list($result, $final_version) = $this->latestVersion($project, $project_data['version']);
+          if (!$result) {
+            $errors = TRUE;
+          }
+        }
+      }
+    }
+    if (!$errors) {
+      drush_log(dt('No errors were found.'), 'ok');
+    }
+    else {
+      drush_make_error('BUILD_ERROR', dt('Errors were found.'));
+    }
+  }
+}
+
+
+/**
+ * Custom logging function for conversions going to STDOUT.
+ *
+ * Drush doesn't output drush_set_error() messages to STDERR, lame-o...  :(
+ *
+ * This helper function overcomes that deficiency by manually writing error
+ * messages to STDERR in the case where output is going to STDOUT.
+ */
+function drush_make_d_o_convert_log_stdout_handler($entry) {
+  if ($entry['type'] == 'error' || $entry['type'] == 'failed') {
+    fwrite(STDERR, dt("ERROR") . ": " .  $entry['message'] . "\n");
+  }
+}
+
diff --git a/.drush/drush_make/contrib/drush_make_d_o.drush.inc b/.drush/drush_make/contrib/drush_make_d_o.drush.inc
new file mode 100644
index 00000000..7760fcbc
--- /dev/null
+++ b/.drush/drush_make/contrib/drush_make_d_o.drush.inc
@@ -0,0 +1,292 @@
+<?php
+// $Id: drush_make_d_o.drush.inc,v 1.1.2.19 2010/09/09 07:11:00 dmitrig01 Exp $
+
+/**
+ * @file
+ * drush_make extension for integrating with the drupal.org packaging system.
+ *
+ * This extension serves the following purposes:
+ *  - Adds the --drupal-org and --build-run-key command line options,
+ *    which activate the functionality in the rest of the code.
+ *  - Validates .make files to ensure they comply with drupal.org packaging
+ *    requirements.
+ *  - Restricts download locations to those approved for drupal.org packages.
+ *  - Implements a custom logging function for error reporting to the packaging
+ *    script.
+ *  - Builds a list of package contents (nids of package items), and stores
+ *    for the packaging system to use.
+ */
+
+// URI of the 'drush_make on drupal.org' handbook page.
+define('DRUSH_MAKE_DO_DOCUMENTATION_LINK', 'http://drupal.org/node/642116');
+// Name of the package contents file used by the packaging script.
+define('DRUSH_MAKE_DO_PACKAGE_CONTENTS_FILE', 'package_contents.txt');
+// Name of the build errors file used by the packaging script.
+define('DRUSH_MAKE_DO_BUILD_ERRORS_FILE', 'build_errors.txt');
+
+/**
+ * Implement hook_drush_command().
+ */
+function drush_make_d_o_drush_command() {
+  $items = array();
+  $items['convert-makefile'] = array(
+    'description' => 'Convert the specified makefile to a drupal.org friendly format, and verify the converted file.',
+    'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
+  );
+  $items['verify-makefile'] = array(
+    'description' => 'Verify the specified makefile is in a drupal.org-friendly format.',
+    'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
+  );
+
+  return $items;
+}
+
+
+/**
+ * Drush callback; verify a .make file is in a drupal.org friendly format.
+ */
+function drush_drush_make_d_o_verify_makefile($makefile) {
+  include_once 'drush_make_d_o.convert.inc';
+  $verifier = new DrushMakeDrupalorgVerifier($makefile);
+  $verifier->run();
+}
+
+
+/**
+ * Drush callback; convert the makefile to a drupal.org friendly format.
+ */
+function drush_drush_make_d_o_convert_makefile($from, $to = NULL) {
+  include_once 'drush_make_d_o.convert.inc';
+  // If output is going to STDOUT, use a custom logger.
+  if (empty($to)) {
+    drush_set_context('DRUSH_LOG_CALLBACK', 'drush_make_d_o_convert_log_stdout_handler');
+  }
+  $converter = new DrushMakeDrupalorgConverter($from, $to);
+  $converter->run();
+}
+
+/**
+ * Implement EXTENSION_drush_make_init().
+ */
+function drush_make_d_o_drush_init() {
+  if (drush_get_option('drupal-org')) {
+    // The --drupal-org switch implies these defaults:
+    // Location to put our custom build files.
+    drush_set_default('drupal-org-build-root', '.');
+    // The destination of the downloaded contrib projects.
+    drush_set_default('contrib-destination', '.');
+    // Whether to allow a build without core.
+    drush_set_default('no-core', TRUE);
+
+    // Optionally set up a custom error logger.
+    if (drush_get_option('drupal-org-log-errors-to-file')) {
+      drush_set_context('DRUSH_LOG_CALLBACK', 'drush_make_d_o_log_errors_to_file');
+    }
+
+    // Optionally set up the package contents file. The packaging script
+    // expects it, so it's created as an empty file here to ensure it
+    // exists.
+    if (drush_get_option('drupal-org-log-package-items-to-file')) {
+      $drupal_org_build_root = drush_get_option('drupal-org-build-root');
+      if (!touch($drupal_org_build_root . '/' . DRUSH_MAKE_DO_PACKAGE_CONTENTS_FILE)) {
+        drush_make_error('FILE_ERROR', dt('Unable to write package contents file to %build_root', array('%build_root' => $drupal_org_build_root)));
+      }
+    }
+  }
+}
+
+/**
+ * Implement EXTENSION_drush_make_validate_info().
+ */
+function drush_make_d_o_drush_make_validate_info($info) {
+  if (drush_get_option('drupal-org')) {
+    // The list of currently allowed top-leval attributes.
+    $top_level_attribute_whitelist = array('core', 'api', 'core_release', 'projects');
+    
+    // The list of currently allowed project-level attributes.
+    $project_attribute_whitelist = array('version', 'subdir', 'patch');
+    
+    // Assume no errors to start.
+    $errors = FALSE;
+    
+    // Check for disallowed top-level attributes.
+    foreach ($info as $attribute => $attribute_data) {
+      if (!in_array($attribute, $top_level_attribute_whitelist)) {
+        drush_make_error('BUILD_ERROR', dt("The top-level attribute '%attribute' is not allowed in drupal.org .make files", array('%attribute' => $attribute)));
+        $errors = TRUE;
+      }
+    }
+    
+    // Check for a valid core value.
+    // This is just a basic sanity check for a properly formatted value.
+    if (!drush_make_d_o_check_valid_version(dt('Drupal core'), $info['core_release'])) {
+      $errors = TRUE;
+    }
+    if (!empty($info['projects'])) {
+      foreach ($info['projects'] as $project => $project_data) {
+        // No specifying just project name.
+        if (!is_array($project_data)) {
+          $project_data = $info['projects'][$project] = array('version' => $project_data);
+        }
+        // Version must be set.
+        if (!isset($project_data['version'])) {
+          drush_make_error('BUILD_ERROR', dt('No version specified for project %project -- version is required.', array('%project' => $project)));
+          $errors = TRUE;
+        }
+        // Check for disallowed project-level attributes.
+        foreach ($project_data as $attribute => $attribute_data) {
+          if (!in_array($attribute, $project_attribute_whitelist)) {
+            drush_make_error('BUILD_ERROR', dt("The project-level attribute '%attribute' is not allowed in drupal.org .make files", array('%attribute' => $attribute)));
+            $errors = TRUE;
+          }
+        }
+        // Check that patches do in fact come from drupal.org.
+        if (isset($project_data['patch'])) {
+          foreach ($project_data['patch'] as $patch) {
+            if (strpos($patch, 'http://drupal.org/files/issues') !== 0) {
+              drush_make_error('BUILD_ERROR', dt("The patch '%patch' is not hosted on drupal.org", array('%patch' => $patch)));
+              $errors = TRUE;
+            }
+          }
+        }
+        // Check for bad project version.
+        if (!drush_make_d_o_check_valid_version($project, $project_data['version'])) {
+          $errors = TRUE;
+        }
+        $info['projects'][$project] += array(
+          'name' => $project,
+          'core' => $info['core'],
+        );
+        $info['projects'][$project] = drush_make_d_o_updatexml($info['projects'][$project]);
+      }
+    }
+    // Abort if any errors were found.
+    if ($errors) {
+      drush_make_error('BUILD_ERROR', dt('The drupal.org validation check failed -- see @doc_link for more information.', array('@doc_link' => DRUSH_MAKE_DO_DOCUMENTATION_LINK)));
+      return FALSE;
+    }
+  }
+  return $info;
+}
+
+/**
+ * Validate release versions.
+ *
+ * @param $name
+ *   The display name of the project.
+ * @param $version_string
+ *   The version string to test.
+ * @return
+ * TRUE if the version string is bad, FALSE otherwise.
+ */
+function drush_make_d_o_check_valid_version($name, $version_string) {
+  // Development snapshots not allowed.
+  if (preg_match('/.*-dev$/', $version_string)) {
+    drush_make_error('BUILD_ERROR', dt('%project branch releases not allowed.', array('%project' => $name)));
+    return FALSE;
+  }
+  // Basic sanity checking on release version strings. We need this because
+  // drush_make supports projects[foo][version] = 1, which downloads the latest
+  // stable release on the major version 1 branch. We require a specific
+  // release.
+  elseif (!preg_match('/^\d+\.\d+(-[a-z0-9]+)?$/', $version_string)) {
+    drush_make_error('BUILD_ERROR', dt('%project version format incorrect -- specifying an official release version is required.', array('%project' => $name)));
+    return FALSE;
+  }
+  return TRUE;
+}
+
+/**
+ * Custom implementation of drush_make_updatexml().
+ *
+ * Only allows loading update XML files from the default location, which for
+ * our purposes is updates.drupal.org. This is also the place where package
+ * items are collected for the package.
+ */
+function drush_make_d_o_updatexml($project) {
+  if ($filename = _drush_make_download_file(drush_get_option('drush-make-update-default-url') . '/' . $project['name'] . '/' . $project['core'])) {
+    $release_history = simplexml_load_string(file_get_contents($filename));
+    drush_op('unlink', $filename);
+  }
+  // First, get the release history.
+  if (!is_object($release_history) || !$release_history->title) {
+    drush_make_error('XML_ERROR', dt("Could not retrieve version information for %project.", array('%project' => $project['name'])));
+    return FALSE;
+  }
+  drush_log(dt('Project information for %project retrieved.', array('%project' => $project['name'])), 'ok');
+  $project['release_history'] = $release_history;
+  if (!isset($project['type'])) {
+    // Determine the project type.
+    $term_map = array(
+      'Modules' => 'module',
+      'Themes' => 'theme',
+      'Drupal project' => 'core',
+      'Installation profiles' => 'profile',
+      'Translations' => 'translation'
+    );
+    // Iterate through all terms related to this project.
+    foreach ($release_history->terms->term as $term) {
+      // If we find a term from the term map, add it.
+      if (in_array((string) $term->value, array_keys($term_map))) {
+        $project['type'] = $term_map[(string)$term->value];
+        break;
+      }
+    }
+    if (!isset($project['type'])) {
+      drush_make_error('BUILD_ERROR', dt("Unable to determine project type for %project.", array('%project' => $project['name'])));
+      return FALSE;
+    }
+  }
+  // Process the file download data, and record the item_nid for the package.
+  if ($project = drush_make_update_xml_download($project)) {
+    // Optionally log package contents to a file.
+    if (drush_get_option('drupal-org-log-package-items-to-file')) {
+      $project = drush_make_d_o_write_package_item_nid($project);
+    }
+    return $project;
+  }
+  return FALSE;
+}
+
+/**
+ * Store a package item in a package summary file.
+ */
+function drush_make_d_o_write_package_item_nid($project) {
+  // Release/version logic ripped off from drush_make_update_xml_download().
+  // Make an array of releases.
+  foreach ($project['release_history']->releases->release as $release) {
+    $version = (string) $release->version_major;
+    if ((string) $release->version_patch) {
+      $version .= '.' . (string) $release->version_patch;
+    }
+    else {
+      $version .= '.0';
+    }
+    if ($extra_version = (string) $release->version_extra) {
+      $version .= '-' . $extra_version;
+    }
+    // Grab the release nid from the release node link.
+    $releases[$version] = basename($release->release_link);
+  }
+  // Write the item's nid to the package contents file.
+  if ($project['version'] && ($item_nid = $releases[$project['version']])) {
+    if (file_put_contents(drush_get_option('drupal-org-build-root') . '/' . DRUSH_MAKE_DO_PACKAGE_CONTENTS_FILE, "$item_nid\n", FILE_APPEND)) {
+      return $project;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Custom logging function for packaging errors.
+ *
+ * Logs all error messages to a build_errors.txt file in the root of the
+ * package build.
+ *
+ * @see drush_log() for a description of the $entry array.
+ */
+function drush_make_d_o_log_errors_to_file($entry) {
+  if ($entry['type'] == 'error' || $entry['type'] == 'failed') {
+    file_put_contents(drush_get_option('drupal-org-build-root') . '/' . DRUSH_MAKE_DO_BUILD_ERRORS_FILE, $entry['message'] . "\n", FILE_APPEND);
+  }
+}
diff --git a/.drush/drush_make/drush_make.download.inc b/.drush/drush_make/drush_make.download.inc
new file mode 100644
index 00000000..aadc5594
--- /dev/null
+++ b/.drush/drush_make/drush_make.download.inc
@@ -0,0 +1,619 @@
+<?php
+// $Id: drush_make.download.inc,v 1.1.2.87 2010/09/06 15:54:23 dmitrig01 Exp $
+
+function drush_make_download_factory($type, $name, $download, $download_location) {
+  $function = 'drush_make_download_' . $type;
+  if (function_exists($function)) {
+    return $function($name, $download, $download_location);
+  }
+  else {
+    return FALSE;
+  }
+}
+
+function drush_make_download_cvs($name, $download, $download_location) {
+  if (!empty($download['module'])) {
+    if (drush_get_option('working-copy')) {
+      if ($download['module'] == 'drupal') {
+        $download['root'] = ":pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal";
+      }
+      elseif (isset($_ENV['CVSROOT'])) {
+        $download['root'] = trim($_ENV['CVSROOT']);
+      }
+      else {
+        drush_log(dt('Please set the CVSROOT variable in your shell environment when using the --working-copy option.'), 'ok');
+      }
+    }
+    // Fallback to anonymous @ cvs.drupal.org
+    if (!isset($download['root'])) {
+      $download['root'] = ":pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal-contrib";
+    }
+  
+    // Checkout or export the module. CVS can't use absolute paths for named
+    // directories, so change into the directory just above the final
+    // destination for the checkout. 
+    $cd_to_directory = dirname($download_location);
+    $destination_directory = basename($download_location);
+  
+    $command = 'cvs -d%s ' . (drush_get_option('working-copy') ? 'checkout' : 'export') . ' -d%s';
+    $args = array($download['root'], $destination_directory);
+    if (isset($download['revision'])) {
+      $command .= ' -r %s';
+      $args[] = $download['revision'];
+    }
+    if (isset($download['date'])) {
+      $command .= ' -D %s';
+      $args[] = $download['date'];
+    }
+    $args[] = $download['module'];
+    $command .= ' %s';
+  
+    array_unshift($args, $command);
+    array_unshift($args, dirname($download_location));
+    if (call_user_func_array('drush_shell_cd_and_exec', $args)) {
+       drush_log(dt('%project downloaded from %module.', array('%project' => $name, '%module' => $download['module'])), 'ok');
+      return $download_location;
+    }
+  }
+  else {
+    $download['module'] = dt("unspecified module");
+  }
+  drush_make_error('DOWNLOAD_ERROR', dt('Unable to download %project from %root %module.', array('%project' => $name, '%root' => $download['root'], '%module' => $download['module'])));
+  return FALSE;
+}
+
+function drush_make_download_file($name, $download, $download_location) {
+  if ($filename = _drush_make_download_file($download)) {
+    drush_log(dt('%project downloaded from %url.', array('%project' => $name, '%url' => $download['url'])), 'ok');
+    return drush_make_download_file_unpack($filename, $download_location);
+  }
+  drush_make_error('DOWNLOAD_ERROR', dt('Unable to download %project from %url.', array('%project' => $name, '%url' => $download['url'])));
+  return FALSE;
+}
+
+function _drush_make_download_file($download) {
+  // Static variable to keep track of whether to use curl or wget.
+  static $download_mechanism;
+
+  $tmp_path = drush_make_tmp();
+  $filename = FALSE;
+  if (is_string($download)) {
+    $download = array('url' => $download);
+  }
+  if (!isset($download['request_type'])) {
+    $download['request_type'] = 'get';
+  }
+  if (!empty($download['url'])) {
+    $url = $download['url'];
+    if (drush_get_context('DRUSH_SIMULATE')) {
+      $filename = t('file');
+    }
+    else {
+      // For first try or if wget was detected already, try using wget 
+      // for downloading.
+      $success = FALSE;
+      $download_path = $tmp_path . '/__download__';
+      drush_make_mkdir($download_path);
+
+      if (!isset($download_mechanism) || $download_mechanism == 'curl') {
+        $header_file = $tmp_path . '/__header__';
+        drush_shell_exec("ls %s", $download_path);
+        $files = drush_shell_exec_output();
+        if ($download['request_type'] == 'get' && drush_shell_cd_and_exec($download_path, 'curl -LOD %s %s', $header_file, $url)) {
+          $download_mechanism = 'curl';
+          $success = TRUE;
+        }
+        elseif ($download['request_type'] == 'post' && drush_shell_cd_and_exec($download_path, 'curl -d %s -LOD %s %s', $download['data'], $header_file, $url)) {
+          $download_mechanism = 'curl';
+          $success = TRUE;
+        }
+
+        drush_shell_exec("ls %s", $download_path);
+        $files_new = drush_shell_exec_output();
+        // Can't use list beacuse it's not guarenteed to be at offset 0.
+        $diff = array_diff($files_new, $files);
+        $filename = $tmp_path . '/__download__/' . array_shift($diff);
+        // Determine the proper filename, or at least, the extension.
+        $header = explode("\n", trim(str_replace("\r", '', file_get_contents($header_file))));
+        $current_header = array();
+        $headers = array();
+        $first = TRUE;
+        foreach ($header as $h) {
+          if ($h == '') {
+            $headers[] = $current_header;
+            $current_header = array();
+            $first = TRUE;
+          }
+          else {
+            if (!$first) {
+              list($name, $value) = explode(': ', $h, 2);
+              $current_header[$name] = $value;
+            }
+            else {
+              $first = FALSE;
+            }
+          }
+        }
+        if (!empty($current_header)) {
+          $headers[] = $current_header;
+        }
+      }
+
+      if (!isset($download_mechanism) || $download_mechanism == 'drush_make') {
+        $retry = 5;
+        $url = $download['url'];
+        $filename = $download_path . '/__destination__';
+        $request_type = strtoupper($download['request_type']);
+        $data = (isset($download['data']) ? $download['data'] : '');
+        $headers = array();
+        while ($retry) {
+          $result = drush_make_http_request($url, $filename, array(), $request_type, $data);
+          switch ($result->code) {
+            case 200: // OK
+            case 304: // Not modified
+              $retry = FALSE;
+              break;
+            case 301: // Moved permanently
+            case 302: // Moved temporarily
+            case 307: // Moved temporarily
+              $retry--;
+
+              if ($retry) {
+                $url = $result->headers['Location'];
+                $request_type = 'GET';
+                $data = NULL;
+              }
+              break;
+            default:
+              // Oops, error.
+              drush_make_error('BUILD_ERROR', $result->message);
+              return;
+          }
+          $download_mechanism = 'drush_make';
+          $headers[] = $result->headers;
+          $success = TRUE;
+        }
+      }
+
+      if (!$success) {
+        return;
+      }
+      // Much more useful in reverse order.
+      $headers = array_reverse($headers);
+      $content_type = '';
+      $file = '';
+      foreach ($headers as $header) {
+        if (isset($header['Location'])) {
+          $file = basename($header['Location']);
+          break;
+        }
+      }
+      if (isset($headers[0]['Content-Disposition'])) {
+        $parts = explode(';', $headers[0]['Content-Disposition']);
+        foreach ($parts as $part) {
+          list($name, $value) = explode('=', $part, 2);
+          if ($inner_parts[0] == 'filename') {
+            $file = $value;
+            break;
+          }
+        }
+      }
+      if (isset($headers[0]['Content-Type'])) {
+        // These still need finalizing.
+        switch ($headers[0]['Content-Type']) {
+          case 'application/zip':
+            $content_type = 'zip';
+            break;
+          case 'application/x-gzip':
+            $content_type = 'tar.gz';
+            break;
+          case 'application/x-tar':
+            $content_type = 'tar';
+            break;
+        }
+      }
+      if (!$file) {
+        $file = basename($url);
+      }
+      if ($content_type) {
+        $file .= '.' . $content_type;
+      }
+      drush_shell_exec('mv %s %s', $filename, $tmp_path . '/' . $file);
+      drush_shell_exec('rm -f %s', $tmp_path . '/__header__');
+      drush_shell_exec('rm -rf %s', $tmp_path . '/__download__');
+      return $tmp_path . '/' . $file;
+    }
+  }
+  return FALSE;
+}
+
+function drush_make_download_file_unpack($filename, $download_location) {
+  $extension = array_pop(explode('.', $filename));
+  $gzip = FALSE;
+  switch ($extension) {
+    case 'gz':
+    case 'tgz':
+      // I'd like to just use tar -z, but apparently it breaks on windoze. Why do they always have to ruin everything?
+      drush_make_download_file_unpack_gzip($filename, $download_location);
+      break;
+    case 'tar':
+      drush_make_download_file_unpack_tar($filename, $download_location);
+      break;
+    case 'zip':
+      drush_make_download_file_unpack_zip($filename, $download_location);
+      break;
+    default:
+      drush_make_error('DOWNLOAD_ERROR', dt('Unable to unpack %file', array('%file' => $filename)));
+  }
+}
+
+function drush_make_download_file_unpack_tar($filename, $download_location) {
+  $tmp_path = drush_make_tmp();
+  // Tarbomb detection.
+  drush_shell_exec('tar -tf %s', $filename);
+  $lines = drush_shell_exec_output();
+  if (!$lines) {
+    return FALSE;
+  }
+  $directory = drush_make_download_file_protect_bomb($lines);
+  if (!$directory) {
+    drush_shell_exec('tar -x -C %s -f %s', $download_location, $filename);
+  }
+  else {
+    list($main_directory) = array_reverse(explode('/', $download_location));
+    drush_make_mkdir($tmp_path . '/__unzip__');
+    drush_shell_exec('tar -x -C %s -f %s', $tmp_path . '/__unzip__', $filename);
+    if ($directory != $main_directory) {
+      drush_shell_exec('mv %s %s', $tmp_path . '/__unzip__/' . $directory, $tmp_path . '/__unzip__/' . $main_directory);
+    }
+    drush_shell_exec('cp -Rf %s %s', $tmp_path . '/__unzip__/' . $main_directory, dirname($download_location));
+    drush_shell_exec('rm -rf %s', $tmp_path . '/__unzip__');
+  }
+
+  // Remove the tarball.
+  if (file_exists($filename)) {
+    drush_shell_exec('rm %s', $filename);
+  }
+}
+
+function drush_make_download_file_unpack_gzip($filename, $download_location) {
+  // Find out where contents will end up. Retrieve last column of output using awk.
+  drush_shell_exec("gzip --list %s | awk '{print $4;}'", $filename);
+  $info = drush_shell_exec_output();
+  if ($info) {
+    $info = array_pop($info);
+    $matches = array();
+    preg_match('/[a-zA-Z0-9.\-_,]*.tar/', $info, $matches);
+    if (isset($matches[0])) {
+      $file = dirname($filename) . '/' . $matches[0];
+      // Unzip it and then delete the tar file.
+      drush_shell_exec('gzip -d %s', $filename);
+      $filename = $file;
+      return drush_make_download_file_unpack_tar($filename, $download_location);
+    }
+  }
+  drush_make_error('PACKAGE_ERROR', dt('Could not retrieve package information for %filename.', array('%filename' => $filename)));
+  return;
+}
+
+function drush_make_download_file_unpack_zip($filename, $download_location) {
+  $tmp_path = drush_make_tmp();
+  // Find the main directory in the zip file.
+  drush_shell_exec("unzip -l %s", $filename);
+  $info = drush_shell_exec_output();
+  if ($info) {
+    foreach ($info as $line) {
+      $matches = array();
+      preg_match('/^\s+[0-9]+\s+[0-9-]+\s+[0-9:]+\s+(.*)$/', $line, $matches);
+      if (isset($matches[1])) {
+        $lines[] = $matches[1];
+      }
+    }
+    $directory = drush_make_download_file_protect_bomb($lines);
+    if ($directory) {
+      list($main_directory) = array_reverse(explode('/', $download_location));
+      if ($main_directory == $directory) {
+        // Directory names match up.
+        drush_shell_exec("unzip %s -d %s", $filename, dirname($download_location));
+      }
+      else {
+        // Directories don't match up. Use cp.
+        drush_make_mkdir($tmp_path . '/__unzip__');
+        drush_shell_exec('unzip %s -d %s', $filename, $tmp_path . '/__unzip__');
+        if (file_exists($filename)) {
+          drush_shell_exec('rm %s', $filename);
+        }
+        if (is_dir($tmp_path . '/__unzip__' . $directory . '/__MACOSX')) {
+          drush_shell_exec('rm -rf %s', $tmp_path . '/__unzip__' . $directory . '/__MACOSX');
+        }
+        drush_shell_exec('mv %s %s', $tmp_path . '/__unzip__/' . $directory, $tmp_path . '/__unzip__/' . $main_directory);
+        drush_shell_exec('cp -Rf %s %s', $tmp_path . '/__unzip__/' . $main_directory, dirname($download_location));
+        drush_shell_exec('rm -rf %s', $tmp_path . '/__unzip__');
+      }
+    }
+    else {
+      // It's a bomb, so we can just unpack it right at its destination.
+      drush_shell_exec("unzip %s -d %s", $filename, $download_location);
+    }
+    if (file_exists($filename)) {
+      drush_shell_exec('rm %s', $filename);
+    }
+    if (is_dir($download_location . '/__MACOSX')) {
+      drush_shell_exec('rm -rf %s', $download_location . '/__MACOSX');
+    }
+  }
+  else {
+    drush_make_error('PACKAGE_ERROR', dt('Could not retrieve package information for %filename.', array('%filename' => $filename)));
+  }
+  return;
+}
+
+function drush_make_download_file_protect_bomb($lines) {
+  $directory = FALSE;
+  foreach ($lines as $line) {
+    if (strpos($line, '/') !== FALSE) {
+      list($dir) = explode('/', $line);
+      if (!$directory) {
+        $directory = $dir;
+      }
+      elseif ($dir != $directory) {
+        // More than one root-level item detected. We're not safe - BOMB!
+        return FALSE;
+      }
+    }
+  }
+  if (!$directory) {
+    // If we didn't come upon anything, that is to say, they were only
+    // root-level files, it's a bomb.
+    return FALSE;
+  }
+  return $directory;
+}
+
+
+// Backwards compatibility.
+function drush_make_download_get($name, $download, $download_location) {
+  return drush_make_download_file($name, $download, $download_location);
+}
+
+function drush_make_download_post($name, $download, $download_location) {
+  $download['request_type'] = 'post';
+  $download['data'] = $download['post_data'];
+  return drush_make_download_file($name, $download, $download_location);
+}
+
+function drush_make_download_git($name, $download, $download_location) {
+  $tmp_path = drush_make_tmp();
+  $wc = drush_get_option('working-copy');
+
+  // check if branch option is set in info file, otherwise set default to master branch
+  $download['branch'] = isset($download['branch']) ? $download['branch'] : 'master';
+  // check if tag option is set in info file, otherwise we set it to false
+  $download['tag'] = isset($download['tag']) ? $download['tag'] : FALSE;
+  // check if specific revision is set in info file
+  $download['revision'] = isset($download['revision']) ? $download['revision'] : FALSE;
+
+  // only progress if we have a download url...
+  if (!empty($download['url'])) {
+    // split the given download url into pieces
+    $url_array = array();
+
+    // Get the protocol, site and resource parts of the URL
+    // original url = http://example.com/blog/index?name=foo
+    // protocol = http://
+    // site = example.com/
+    // resource = blog/index?name=foo
+    $regex = '#^(.*?//)*([\w\.\d]*)(:(\d+))*(/*)(.*)$#';
+    $matches = array();
+    preg_match($regex, $download['url'], $matches);
+
+    // Assign the matched parts of url to the result array
+    $url_array['protocol'] = $matches[1];
+    $url_array['port']     = $matches[4];
+    $url_array['host']     = $matches[2];
+    $url_array['resource'] = $matches[6];
+
+    // clean up the site portion by removing the trailing /
+    $url_array['host'] = preg_replace('#/$#', '', $result['host']);
+
+    // clean up the protocol portion by removing the trailing ://
+    $url_array['protocol'] = preg_replace('#://$#', '', $result['protocol']);
+
+    if (empty($url_array['protocol'])) {
+      // If protocol is not given, assume an SSH URL.
+      $url = $download['url'];
+    }
+    else {
+      // build url for git clone to support different protocols
+      // currently all protocols seems to use the same url schema
+      switch ($url_array['protocol']) {
+        case 'git':
+          // github uses two different urls, working copy urls using scp format
+          // git@domain:repo export url format are git://domain/repo
+          if ($wc) {
+            // working copy is set
+            $url = 'git@'. $url_array['host'] .':'. $url_array['resource'];
+            break;
+          }
+        case 'ssh':
+        case 'http':
+        case 'https':
+        case 'ftp':
+        case 'ftps':
+        case 'rsync':
+        case 'file':
+          // @TODO: implement port & user options
+          $url = $url_array['protocol'] .'://'. $url_array['host'] .'/'. $url_array['resource'];
+          break;
+
+        default:
+          drush_make_error('DOWNLOAD_ERROR', dt('unknown protocol @protocol in %project', array('@protocol' => $url_array['protocol'], '%project' => $name)));
+          return false;
+      }
+    }
+
+    $tmp_location = $tmp_path . '/__git__/' . basename($download_location);
+
+    drush_make_mkdir($tmp_path . '/__git__/');
+
+    // clone the given repository
+    if (drush_shell_exec("git clone %s %s", $url, $tmp_location)) {
+      drush_log(dt('%project cloned from %url.', array('%project' => $name, '%url' => $url)), 'ok');
+
+      // GIT Checkout only work on a ready cloned repo. So we switch to branch or to tag (only if we have no branch) after cloneing.
+      if ($download['branch'] !== 'master' || $download['tag'] || $download['revision'] || !empty($download['submodule'])) {
+
+        // get current directory (for move back later)
+        $cwd = getcwd();
+        // change path to working copy of cloned repo
+        chdir($tmp_location);
+
+        // Progress branch / tag / revision download. Ensure that only one option ist set (branch OR tag OR revision)
+        // check if branch a other than master
+        if ($download['branch'] !== 'master' && !$download['tag'] && !$download['revision']) {
+          if (drush_shell_exec("git checkout -b %s %s", $download['branch'], 'origin/' . $download['branch'])) {
+            drush_log(dt("Checked out branch %branch.", array('%branch' => $download['branch'])), 'ok');
+          }
+          else {
+            drush_make_error('DOWNLOAD_ERROR', dt("Unable to check out branch %branch.", array('%branch' => $download['branch'])));
+          }
+        }
+        // progress if: tag is set but not the others
+        elseif ($download['branch'] == 'master' && $download['tag'] && !$download['revision']) {
+          // @TODO: change checkout to refs path
+          if (drush_shell_exec("git checkout %s", 'refs/tags/' . $download['tag'])) {
+            drush_log(dt("Checked out tag %tag.", array('%tag' => $download['tag'])), 'ok');
+          }
+          else {
+            drush_make_error('DOWNLOAD_ERROR', dt("Unable to check out tag %tag.", array('%tag' => $download['tag'])));
+          }
+        }
+        // progress if: revision is set but not the others
+        elseif ($download['branch'] == 'master' && !$download['tag'] && $download['revision']) {
+          if (drush_shell_exec("git checkout %s", $download['revision'])) {
+            drush_log(dt("Checked out revision %revision.", array('%revision' => $download['revision'])), 'ok');
+          }
+          else {
+            drush_make_error('DOWNLOAD_ERROR', dt("Unable to checkout revision %revision", array('%revision' => $download['revision'])));
+          }
+        }
+        // more than one option is set so we throw a error message
+        elseif ($download['branch'] !== 'master' || $download['tag'] || $download['revision']) {
+          drush_make_error('DOWNLOAD_ERROR', dt("You can only specific branch or tag or revision but not combined in make file."));
+          return false;
+        }
+        if (!empty($download['submodule'])) {
+          $command = 'git submodule update';
+          foreach ($download['submodule'] as $option) {
+            $command .= ' --%s';
+          }
+          if (call_user_func_array('drush_shell_exec', array_merge(array($command), $download['submodule']))) {
+            drush_log(dt('Initialized registered submodules.'), 'ok');
+          }
+          else {
+            drush_make_error('DOWNLOAD_ERROR', dt('Unable to initialize submodules.'));
+          }
+        }
+        // move back to last current directory (first line)
+        chdir($cwd);
+      }
+
+      // Remove .git/ directory if working-copy flag was not specified.
+      if (!$wc && file_exists($tmp_location . '/.git')) {
+        drush_shell_exec("rm -rf %s", $tmp_location . '/.git');
+      }
+      drush_shell_exec('cp -Rf %s %s', $tmp_location, dirname($download_location));
+      drush_shell_exec("rm -rf %s", dirname($tmp_location));
+      return dirname($tmp_location);
+    }
+    else {
+      drush_make_error('DOWNLOAD_ERROR', dt('Unable to clone %project from %url.', array('%project' => $name, '%url' => $url)));
+    }
+  }
+  else {
+    $download['url'] = dt("unspecified location");
+  }
+  return FALSE;
+}
+
+function drush_make_download_bzr($name, $download, $download_location) {
+  $tmp_path = drush_make_tmp();
+  $tmp_location = $tmp_path . '/__bzr__/' . basename($download_location);
+  drush_make_mkdir(dirname($tmp_location));
+  if (!empty($download['url'])) {
+    $args = array();
+    $command = 'bzr';
+    if (drush_get_option('working-copy')) {
+      $command .= ' branch  --use-existing-dir';
+    }
+    else {
+      $command .= ' export';
+    }
+    if (isset($download['revision'])) {
+      $command .= ' -r %s';
+      $args[] = $download['revision'];
+    }
+    $command .= ' %s %s';
+    if (drush_get_option('working-copy')) {
+      $args[] = $download['url'];
+      $args[] = $tmp_location;
+    }
+    else {
+      $args[] = $tmp_location;
+      $args[] = $download['url'];
+    }
+    array_unshift($args, $command);
+    if (call_user_func_array('drush_shell_exec', $args)) {
+      drush_log(dt('%project downloaded from %url.', array('%project' => $name, '%url' => $download['url'])), 'ok');
+      drush_shell_exec('cp -Rf %s %s', $tmp_location, dirname($download_location));
+      drush_shell_exec('rm -rf %s', dirname($tmp_location));
+      return dirname($download_location);
+    }
+  }
+  else {
+    $download['url'] = dt("unspecified location");
+  }
+  drush_make_error('DOWNLOAD_ERROR', dt('Unable to download %project from %url.', array('%project' => $name, '%url' => $download['url'])));
+  drush_shell_exec('rm -rf %s', dirname($tmp_location));
+  return FALSE;
+}
+
+
+function drush_make_download_svn($name, $download, $download_location) {
+  $command = 'svn  --force --non-interactive export';
+  if (!empty($download['url'])) {
+    if (drush_get_option('working-copy')) {
+      $command = 'svn  --force --non-interactive checkout';
+    }
+    $args = array();
+
+    if (isset($download['revision'])) {
+      $command .= ' -r%s';
+      $args[] = $download['revision'];
+    }
+
+    $command .= ' %s %s';
+    $args[] = $download['url'];
+    $args[] = $download_location;
+
+    if (!empty($download['username'])) {
+      $command .= ' --username %s --password %s';
+      $args[] = $download['username'];
+      $args[] = $download['password'];
+    }
+    array_unshift($args, $command);
+    $result = call_user_func_array('drush_shell_exec', $args);
+    if ($result) {
+      drush_log(dt('%project @command from %url.', array('%project' => $name, '@command' => $command, '%url' => $download['url'])), 'ok');
+      return $download_location;
+    }
+    else {
+      $download['url'] = dt("unspecified location");
+    }
+  }
+  else {
+    drush_make_error('DOWNLOAD_ERROR', dt('Unable to download %project from %url.', array('%project' => $name, '%url' => $download['url'])));
+    return FALSE;
+  }
+}
+
diff --git a/.drush/drush_make/drush_make.drush.inc b/.drush/drush_make/drush_make.drush.inc
new file mode 100644
index 00000000..d99994d0
--- /dev/null
+++ b/.drush/drush_make/drush_make.drush.inc
@@ -0,0 +1,371 @@
+<?php
+// $Id: drush_make.drush.inc,v 1.11.2.71 2010/09/04 16:17:42 dmitrig01 Exp $
+
+define('DRUSH_MAKE_UPDATE_DEFAULT_URL', 'http://updates.drupal.org/release-history');
+define('DRUSH_MAKE_VERSION_BEST', 'best');
+
+include_once 'drush_make.utilities.inc';
+include_once 'drush_make.download.inc';
+include_once 'drush_make.project.inc';
+
+/**
+ * Implement EXTENSION_drush_init().
+ */
+function drush_make_drush_init() {
+  // The default URL to use for retrieving update XML files.
+  drush_set_default('drush-make-update-default-url', DRUSH_MAKE_UPDATE_DEFAULT_URL);
+}
+
+/**
+ * Implementation of hook_drush_command().
+ */
+function drush_make_drush_command() {
+  $items['make'] = array(
+    'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
+    'description' => 'Turns a makefile into a working drupal install.',
+    'arguments' => array(
+      'makefile' => 'Filename of the makefile to use for this build.',
+      'build path' => 'The path at which to build the makefile.',
+    ),
+    'examples' => array(
+      'drush make example.make example' => 'Build the example.make makefile in the example directory.',
+    ),
+    'options' => array(
+      '--version' => 'Print the version and exit.',
+      '--contrib-destination=path' => 'Specify a path under which modules and themes should be placed. Defaults to sites/all.',
+      '--force-complete' => 'Force a complete build even if errors occur.',
+      '--md5' => 'Output an md5 hash of the current build after completion.',
+      '--no-clean' => 'Leave temporary build directories in place instead of cleaning up after completion.',
+      '--no-core' => 'Do not require a Drupal core project to be specified.',
+      '--no-patch-txt' => 'Do not write a PATCHES.txt file in the directory of each patched project.',
+      '--prepare-install' => 'Prepare the built site for installation. Generate a properly permissioned settings.php and files directory.',
+      '--tar' => 'Generate a tar archive of the build. The output filename will be [build path].tar.gz.',
+      '--test' => 'Run a temporary test build and clean up.',
+      '--translations=languages' => 'Retrieve translations for the specified comma-separated list of language(s) if available for all projects.',
+      '--working-copy' => 'Where possible, retrieve a working copy of projects from their respective repositories.',
+    ),
+  );
+
+  $items['make-test'] = array(
+    'bootstrap' => DRUSH_BOOTSTRAP_DRUSH,
+    'description' => 'Run a drush make test.',
+    'arguments' => array(
+      'test' => 'Name of the test to run or ALL to run all tests.',
+    ),
+    'examples' => array(
+      'drush make-test svn' => 'Run tests for SVN integration.',
+    ),
+  );
+
+  $items['generate-makefile'] = array(
+    'bootstrap' => DRUSH_BOOTSTRAP_DRUPAL_FULL,
+    'description' => 'Attempts to generate a makefile from the current drupal install.',
+  );
+
+  return $items;
+}
+
+/**
+ * Implementation of hook_drush_help().
+ */
+function drush_make_drush_help($section) {
+  switch ($section) {
+    case 'drush:make':
+      return dt('Turns a makefile into a working drupal install. For a full description of options and makefile syntax, see the README.txt included with drush make.');
+    case 'drush:make-test':
+      return dt('Run a drush make test.');
+    case 'drush:generate-makefile':
+      return dt('Attempts to generate a makefile from the current drupal install.');
+  }
+}
+
+/**
+ * Drush callback; make based on the makefile.
+ */
+function drush_drush_make_make($makefile = NULL, $build_path = NULL) {
+  if (!drush_make_ensure_version()) {
+    return;
+  }
+  if (drush_get_option('version', FALSE)) {
+    drush_print(drush_make_version());
+    return;
+  }
+  if (!($build_path = drush_make_build_path($build_path))) {
+    return;
+  }
+  if (!($info = drush_make_validate_info_file(drush_make_parse_info_file($makefile)))) {
+    return;
+  }
+
+  drush_make_projects(FALSE, drush_get_option('contrib-destination', 'sites/all'), $info, $build_path);
+  drush_make_libraries(drush_get_option('contrib-destination', 'sites/all'), $info, $build_path);
+
+  if (drush_get_option('prepare-install')) {
+    drush_make_prepare_install($build_path);
+  }
+  if (drush_get_option('md5')) {
+    drush_make_md5();
+  }
+
+  // Only take final build steps if not in testing mode.
+  if (!drush_get_option('test')) {
+    if (drush_get_option('tar')) {
+      drush_make_tar($build_path);
+    }
+    else {
+      drush_make_move_build($build_path);
+    }
+  }
+
+  drush_make_clean_tmp();
+}
+
+function drush_make_projects($recursion, $contrib_destination, $info, $build_path) {
+  $projects = array();
+  if (empty($info['projects'])) {
+    return;
+  }
+  foreach ($info['projects'] as $key => $project) {
+    // Merge the known data onto the project info.
+    $project += array(
+      'name'                => $key,
+      'core'                => $info['core'],
+      'build_path'          => $build_path,
+      'contrib_destination' => $contrib_destination,
+      'version'             => DRUSH_MAKE_VERSION_BEST,
+      'location'            => drush_get_option('drush-make-update-default-url'),
+      'subdir'              => '',
+      'directory_name'      => '',
+    );
+    $project = drush_make_updatexml($project);
+    $class_name = 'DrushMakeProject_' . $project['type'];
+    $projects[($project['type'] == 'core' ? 'core' : 'contrib')][$project['name']] = new $class_name($project);
+  }
+
+  if (!empty($projects['core'])) {
+    $cores = count($projects['core']);
+  }
+  else {
+    $cores = 0;
+  }
+
+  if (drush_get_option('no-core')) {
+    unset($projects['core']);
+  }
+  elseif ($cores == 0 && !$recursion) {
+    drush_set_error(dt('No core project specified.'));
+    return FALSE;
+  }
+  elseif ($cores == 1 && $recursion) {
+    unset($projects['core']);
+  }
+  elseif ($cores > 1) {
+    drush_set_error(dt('More than one core project specified.'));
+    return FALSE;
+  }
+  if (isset($projects['core'])) {
+    foreach ($projects['core'] as $project) {
+      $project->make();
+    }
+  }
+
+  if (isset($projects['contrib'])) {
+    foreach ($projects['contrib'] as $project) {
+      $project->make();
+    }
+  }
+}
+
+function drush_make_libraries($contrib_destination, $info, $build_path) {
+  if (!empty($info['libraries'])) {
+    foreach ($info['libraries'] as $key => $library) {
+      if (!is_string($key) || !is_array($library)) {
+        // TODO Print a prettier message
+        continue;
+      }
+      // Merge the known data onto the library info.
+      $library += array(
+        'name'                => $key,
+        'core'                => $info['core'],
+        'build_path'          => $build_path,
+        'contrib_destination' => $contrib_destination,
+        'subdir'              => '',
+        'directory_name'      => $key,
+      );
+      $class = new DrushMakeProject_Library($library);
+      $class->make();
+    }
+  }
+}
+
+function drush_make_updatexml($project) {
+  if (isset($project['download']) && isset($project['type'])) {
+    return $project;
+  }
+  if ($filename = _drush_make_download_file($project['location'] . '/' . $project['name'] . '/' . $project['core'])) {
+    $release_history = simplexml_load_string(file_get_contents($filename));
+    drush_op('unlink', $filename);
+  }
+  // First, get the release history.
+  if (!is_object($release_history) || !$release_history->title) {
+    drush_make_error('XML_ERROR', dt("Could not retrieve version information for %project.", array('%project' => $project['name'])));
+    return FALSE;
+  }
+  drush_log(dt('Project information for %project retrieved.', array('%project' => $project['name'])), 'ok');
+  $project['release_history'] = $release_history;
+  if (!isset($project['type'])) {
+    // Determine the project type.
+    $term_map = array(
+      'Modules' => 'module',
+      'Themes' => 'theme',
+      'Drupal project' => 'core',
+      'Installation profiles' => 'profile',
+      'Translations' => 'translation'
+    );
+    // Iterate through all terms related to this project.
+    foreach ($release_history->terms->term as $term) {
+      // If we find a term from the term map, add it.
+      if (in_array((string) $term->value, array_keys($term_map))) {
+        $project['type'] = $term_map[(string)$term->value];
+        break;
+      }
+    }
+    if (!isset($project['type'])) {
+      drush_make_error('BUILD_ERROR', dt("Unable to determine project type for %project.", array('%project' => $project['name'])));
+      return FALSE;
+    }
+  }
+  if (!isset($project['download'])) {
+    $project = drush_make_update_xml_download($project);
+  }
+  return $project;
+}
+
+function drush_make_update_xml_download($project) {
+  // Make an array of releases.
+  foreach ($project['release_history']->releases->release as $release) {
+    $version = (string) $release->version_major;
+    // there should be version_patch attribute for every stable release
+    // so checking whether the attribute exists should be enough
+    if (isset($release->version_patch)) {
+      $version .= '.' . (string) $release->version_patch;
+    }
+    // if version_patch attribute does not exist, then it should be a dev release
+    // and the version string should be in format MAJOR_VERSION.x-dev
+    else {
+      $version .= '.x';
+    }
+    if ($extra_version = (string) $release->version_extra) {
+      $version .= '-' . $extra_version;
+    }
+    $releases[$version] = array(
+      'file' => (string) $release->download_link,
+      'md5' => (string) $release->mdhash,
+      'version' => (string) $release->version,
+    );
+    foreach (array('major', 'patch', 'extra') as $part) {
+      $releases[$version][$part] = (string) $release->{'version_' . $part};
+    }
+  }
+
+  // Find the best release.
+  if ($project['version'] == DRUSH_MAKE_VERSION_BEST) {
+    $recommended_major = (string)$project['release_history']->recommended_major;
+    $project['version'] = _drush_make_update_xml_best_version($recommended_major, $releases);
+  }
+  // Find the best release for the specified version.
+  else {
+    $exploded_version = explode('.', $project['version']);
+    if (count($exploded_version) == 1) {
+      list($major) = $exploded_version;
+      $project['version'] = _drush_make_update_xml_best_version($major, $releases);
+    }
+    // Otherwise we have a full version.
+  }
+
+  $final_version = empty($project['version']) ? '' : $project['version'];
+
+  // Uh oh, couldn't find a valid version.
+  if (empty($final_version) || empty($releases[$final_version])) {
+    drush_make_error('BUILD_ERROR', dt("Invalid version %version for %project.", array('%version' => $final_version, '%project' => $project['name'])));
+    return FALSE;
+  }
+
+  $release = $releases[$final_version];
+  $project['download'] = array(
+    'type' => 'get',
+    'url'  => $release['file'],
+    'md5'  => $release['md5'],
+  );
+  return $project;
+}
+
+function _drush_make_update_xml_best_version($major, $releases) {
+  $best = NULL;
+  foreach ($releases as $version => $release_info) {
+    if ($release_info['major'] == $major && version_compare($best, $version, '<')) {
+      $best = $version;
+    }
+  }
+  return $best;
+}
+
+function drush_make_build_path($build_path) {
+  // Determine the base of the build.
+  if (drush_get_option('tar')) {
+    $build_path = dirname($build_path) . '/' . basename($build_path, '.tar.gz') . '.tar.gz';
+  }
+  elseif (isset($build_path) && (!empty($build_path) || $build_path == '.')) {
+    $build_path = rtrim($build_path, '/');
+  }
+  // Allow tests to run without a specified base path.
+  elseif (drush_get_option('test') || drush_confirm(dt("Make new site in the current directory?"))) {
+    $build_path = '.';
+  }
+  else {
+    drush_log(dt('Build aborted.'), 'ok');
+    return FALSE;
+  }
+  if ($build_path != '.' && file_exists($build_path)) {
+    drush_set_error(dt('Base path %path already exists', array('%path' => $build_path)));
+    return FALSE;
+  }
+  return $build_path;
+}
+
+function drush_make_move_build($build_path) {
+  $tmp_path = drush_make_tmp();
+  if ($build_path == '.') {
+    drush_shell_exec('ls -A %s', $tmp_path . '/__build__');
+    $info = drush_shell_exec_output();
+    foreach ($info as $file) {
+      drush_shell_exec("cp -Rf %s %s", $tmp_path . '/__build__/' . $file, $build_path);
+    }
+  }
+  else {
+    drush_make_mkdir(dirname($build_path));
+    drush_shell_exec("mv %s %s", $tmp_path . '/__build__', $tmp_path . '/' . basename($build_path));
+    drush_shell_exec("cp -Rf %s %s", $tmp_path . '/' . basename($build_path), dirname($build_path));
+  }
+  return TRUE;
+}
+
+function drush_make_version() {
+  return '2.0-dev';
+}
+
+/**
+ * Drush callback; make a makefile from the current install.
+ */
+function drush_drush_make_generate_makefile($file) {
+  include_once 'drush_make.generate.inc';
+  _drush_generate_makefile($file);
+}
+
+/**
+ * Drush callback; run a drush make test.
+ */
+function drush_drush_make_make_test($test = NULL) {
+  include_once 'drush_make.test.inc';
+  drush_make_test($test);
+}
diff --git a/.drush/drush_make/drush_make.generate.inc b/.drush/drush_make/drush_make.generate.inc
new file mode 100644
index 00000000..e0308e2a
--- /dev/null
+++ b/.drush/drush_make/drush_make.generate.inc
@@ -0,0 +1,155 @@
+<?php
+// $Id: drush_make.generate.inc,v 1.1.2.10 2010/09/03 02:58:49 dmitrig01 Exp $
+
+include_once 'includes/install.inc';
+include_once drupal_get_path('module', 'system') . '/system.install';
+
+/**
+ * Drush callback; generate makefile from the current build.
+ */
+function _drush_generate_makefile($file) {
+  $projects = array();
+
+  $system_requirements = system_requirements('runtime');
+  $core_project = strtolower($system_requirements['drupal']['title']); 
+  $projects[$core_project] = array('_type' => 'core');
+  if ($core_project != 'drupal') {
+    $projects[$core_project]['custom_download'] = TRUE;
+    $projects[$core_project]['type'] = 'core';
+  }
+
+  // Non-default profiles section.
+  $install_profile = variable_get('install_profile', '');
+  if ($install_profile != 'default' && $install_profile != '') {
+    $projects[$install_profile]['type'] =
+    $projects[$install_profile]['_type'] = 'profile';
+    if (_drush_generate_makefile_updatexml($install_profile, 'profile')) {
+      $projects[$install_profile]['custom_download'] = TRUE;
+    }
+  }
+
+  // Re-build theme and module data to be sure we have the most current information.
+  $project_info = drush_get_projects();
+  foreach ($project_info as $item) {
+    $name = $item->name;
+    $type = $item->type;
+    if ($item->info['project'] != 'drupal' && $item->info['project'] == $name) {
+      if (($item->type == 'module') && (!$item->status)) {
+        continue;
+      }
+      $updatexml = _drush_generate_makefile_updatexml($name, $type, $item->info);
+      $projects[$name] = array('_type' => $type);
+      if ($updatexml) {
+        $projects[$name]['type'] = $type;
+        $projects[$name]['custom_download'] = TRUE;
+      }
+      $projects[$name] += _drush_generate_makefile_check_location($name, $type);
+    }
+  }
+
+  if (function_exists('libraries_get_libraries')) {
+    $libraries = libraries_get_libraries();
+    foreach ($libraries as $library_name => $library_path) {
+      $path = explode('/', $library_path);
+      $projects[$library_name] = array(
+        'directory_name' => $path[(count($path) - 1)],
+        'custom_download' => TRUE,
+        'type' => 'library',
+        '_type' => 'librarie', // For plural.
+      );
+    }
+  }
+
+  $contents = _drush_make_generate_makefile_contents($projects);
+  if (file_put_contents($file, $contents)) {
+    drush_log(dt("Wrote .make file %file", array('%file' => $file)), 'ok');
+  }
+  else {
+    drush_make_error('FILE_ERROR', dt("Unable to write .make file %file", array('%file' => $file)));
+  }
+}
+
+/**
+ * Helper function to check if a detected project lives on drupal.org or not.
+ */
+function _drush_generate_makefile_updatexml($name, $type, $info = array()) {
+  // First we set up the project information array.
+  $project = array(
+    'name' => $name,
+    'location' => (isset($info['location']) ? $info['location'] : drush_get_option('drush-make-update-default-url')),
+    'core' => DRUPAL_CORE_COMPATIBILITY,
+    'version' => DRUSH_MAKE_VERSION_BEST,
+  );
+
+  // Now we get the project information.
+  $update_check = drush_make_updatexml($project, NULL);
+  return $update_check === TRUE && $type == $update_check['type'];
+}
+
+/**
+ * Helper function to check for a non-default installation location.
+ */
+function _drush_generate_makefile_check_location($name, $type) {
+  // Check for non-default installation location.
+  $path = drupal_get_path($type, $name);
+  $default_location = 'sites/all/' . $type . 's';
+  $info = array();
+  if ($path != $default_location . '/' . $name) {
+    if (substr($path, 0, strlen($default_location)) != $default_location) {
+      $info['contrib_destination'] = $path;
+    }
+    else {
+      // If it's in a subdir of sites/all/modules, set the subdir.
+      $subdir = preg_replace(array('@^sites/all/' . $type . 's/@', "@/$name" . '$@'), '', $path);
+      $info['subdir'] = $subdir;
+    }
+  }
+  return $info;
+}
+
+function _drush_make_generate_makefile_contents($projects) {
+  $output = array();
+  $custom = FALSE;
+  $output[] = '; This file was auto-generated by drush_make';
+  $output['core'] = DRUPAL_CORE_COMPATIBILITY;
+  $output[] = '';
+  $previous_type = 'core';
+  foreach ($projects as $name => $project) {
+    $type = ($project['type'] == 'library' ? 'libraries' : 'projects');
+    if ($previous_type != $project['_type']) {
+      $previous_type = $project['_type'];
+      $output[] = '; ' . ucfirst($previous_type) . 's';
+    }
+    unset($project['_type']);
+    if (!$project && is_string($name)) {
+      $output[] = $type . '[] = "' . $name . '"';
+      continue;
+    }
+    $base = $type . '[' . $name . ']';
+    if (isset($project['custom_download'])) {
+      $custom = TRUE;
+      $output[] = '; Please fill the following out.';
+      $output[$base . '[download][type]'] = '""; One of get, cvs, git, bzr or svn';
+      $output[$base . '[download][url]'] = '""; The url of the download';
+      unset($project['custom_download']);
+    }
+    foreach ($project as $key => $value) {
+      $output[$base . '[' . $key . ']'] = '"' . $value . '"';
+    }
+    $output[] = '';
+  }
+  $string = '';
+  foreach ($output as $k => $v) {
+    if (!is_numeric($k)) {
+      $string .= $k . ' = ' . $v;
+    }
+    else {
+      $string .= $v;
+    }
+    $string .= "\n";
+  }
+  if ($custom) {
+    drush_log(dt('Some of the properties in your makefile will have to be manually edited. Please do that now.'), 'error');
+  }
+  return $string;
+}
diff --git a/.drush/drush_make/drush_make.project.inc b/.drush/drush_make/drush_make.project.inc
new file mode 100644
index 00000000..ffe0d0ae
--- /dev/null
+++ b/.drush/drush_make/drush_make.project.inc
@@ -0,0 +1,306 @@
+<?php
+// $Id: drush_make.project.inc,v 1.1.2.48 2010/09/06 15:56:59 dmitrig01 Exp $
+
+/**
+ * The base project class.
+ */
+class DrushMakeProject {
+  /**
+   * Set attributes and retrieve project information.
+   */
+  function __construct($project) {
+    $project['base_contrib_destination'] = $project['contrib_destination'];
+    foreach ($project as $key => $value) {
+      $this->{$key} = $value;
+    }
+  }
+
+  /**
+   * Build a project.
+   */
+  function make() {
+    if (!empty($this->made)) {
+      return FALSE;
+    }
+    $download_location = $this->findDownloadLocation();
+    if (drush_make_download_factory($this->download['type'], $this->name, $this->download, $download_location) === FALSE) {
+      return FALSE;
+    }
+    if (!$this->applyPatches($download_location)) {
+      return FALSE;
+    }
+    if (!$this->getTranslations($download_location)) {
+      return FALSE;
+    }
+    if (!$this->recurse($download_location)) {
+      return FALSE;
+    }
+    $this->made = TRUE;
+    return TRUE;
+  }
+
+  function findDownloadLocation() {
+    $this->path = $this->generatePath();
+    $this->project_directory = !empty($this->directory_name) ? $this->directory_name : $this->name;
+    $this->download_location = $this->path . '/' . $this->project_directory;
+    // This directory shouldn't exist yet -- if it does, stop.
+    if (is_dir($this->download_location)) {
+      drush_set_error(dt('Directory not empty: %directory', array('%directory' => $this->download_location)));
+      return FALSE;
+    }
+    else {
+      drush_make_mkdir($this->download_location);
+    }
+    return $this->download_location;
+  }
+
+  /**
+   * Retrieve and apply any patches specified by the makefile to this project.
+   */
+  function applyPatches($project_directory) {
+    if (!empty($this->patch)) {
+      $patches_txt = '';
+      foreach ($this->patch as $url) {
+        // Download the patch.
+        if ($filename = _drush_make_download_file($url)) {
+          $patched = drush_shell_exec("patch -p0 -d %s < %s", $project_directory, $filename);
+          if ($patched) {
+            $patches_txt .= '- ' . $url . "\n";
+          }
+          drush_log($this->name . ' patched with ' . basename($filename) . '.', $patched ? 'ok' : 'error');
+          drush_op('unlink', $filename);
+        }
+        else {
+          drush_make_error('Unable to download ' . $url . '.');
+          return FALSE;
+        }
+      }
+      if (!empty($patches_txt) && !drush_get_option('no-patch-txt') && !file_exists($project_directory . '/PATCHES.txt')) {
+        $patches_txt = "The following patches have been applied to this project:\n" .
+          $patches_txt .
+          "\nThis file was automatically generated by Drush Make (http://drupal.org/project/drush_make).";
+        file_put_contents($project_directory . '/PATCHES.txt', $patches_txt);
+        drush_log('Generated PATCHES.txt file for ' . $this->name, 'ok');
+      }
+    }
+    return TRUE;
+  }
+
+  /**
+   * Retrieve translations for this project.
+   */
+  function getTranslations($project_directory) {
+    static $cache = array();
+    $langcodes = drush_get_option('translations', FALSE);
+    if ($langcodes && $this->version !== drush_get_option('drush-make-version-best') && in_array($this->type, array('core', 'module', 'profile', 'theme'), TRUE)) {
+      // Support the l10n_path, l10n_url keys from l10n_update. Note that the
+      // l10n_server key is not supported.
+      if (isset($this->l10n_path)) {
+        $update_url = $this->l10n_path;
+      }
+      else {
+        if (isset($this->l10n_url)) {
+          $l10n_server = $this->l10n_url;
+        }
+        elseif ($this->location === drush_get_option('drush-make-update-default-url')) {
+          $l10n_server = 'http://localize.drupal.org/l10n_server.xml';
+        }
+        else {
+          $l10n_server = FALSE;
+        }
+        if ($l10n_server) {
+          if (!isset($cache[$l10n_server])) {
+            if ($filename = _drush_make_download_file($l10n_server)) {
+              $server_info = simplexml_load_string(file_get_contents($filename));
+              $cache[$l10n_server] = !empty($server_info->update_url) ? $server_info->update_url : FALSE;
+              drush_op('unlink', $filename);
+            }
+          }
+          if ($cache[$l10n_server]) {
+            $update_url = $cache[$l10n_server];
+          }
+          else {
+            drush_make_error('XML_ERROR', dt("Could not retrieve l10n update url for %project.", array('%project' => $project['name'])));
+            return FALSE;
+          }
+        }
+      }
+      if ($update_url) {
+        $failed = array();
+        $langcodes = explode(',', $langcodes);
+        foreach ($langcodes as $langcode) {
+          $variables = array(
+            '%project' => $this->name,
+            '%release' => $this->type === 'core' ? $this->version : "{$this->core}-{$this->version}",
+            '%core' => $this->core,
+            '%language' => $langcode,
+            '%filename' => '%filename',
+          );
+          $url = strtr($update_url, $variables);
+
+          // Download the translation file.
+          if ($filename = _drush_make_download_file($url)) {
+            // If this is the core project type, download the translation file
+            // and create two copies:
+            // 1. To profiles/default/translations. It must be named
+            //    langcode.po to be used properly by the installer.
+            // 2. To modules/system/translations where it can be detected for
+            //    import by other non-default install profiles.
+            if ($this->type === 'core') {
+              drush_make_mkdir($project_directory . '/profiles/default/translations');
+              drush_make_mkdir($project_directory . '/modules/system/translations');
+              drush_shell_exec("cp %s %s", $filename, $project_directory . '/profiles/default/translations/' . $langcode . '.po');
+              drush_shell_exec("mv %s %s", $filename, $project_directory . '/modules/system/translations');
+            }
+            else {
+              drush_make_mkdir($project_directory . '/translations');
+              drush_shell_exec("mv %s %s", $filename, $project_directory . '/translations');
+            }
+          }
+          else {
+            $failed[] = $langcode;
+          }
+        }
+        if (empty($failed)) {
+          drush_log('All translations downloaded for ' . $this->name, 'ok');
+        }
+        else {
+          drush_log('Unable to download translations for '. $this->name .': ' . implode(', ', $failed), 'warning');
+        }
+      }
+    }
+    return TRUE;
+  }
+
+  /**
+   * Generate the proper path for this project type.
+   *
+   * @param $base
+   *   Whether include the base part (tmp dir). Defaults to TRUE.
+   */
+  protected function generatePath($base = TRUE) {
+    $path = array();
+    if ($base) {
+      $path[] = drush_make_tmp();
+      $path[] = '__build__';
+    }
+    if (!empty($this->contrib_destination)) {
+      $path[] = $this->contrib_destination;
+    }
+    if (!empty($this->subdir)) {
+      $path[] = $this->subdir;
+    }
+    return implode('/', $path);
+  }
+
+  /**
+   * Return the proper path for dependencies to be placed in.
+   *
+   * @return
+   *   The path that dependencies will be placed in.
+   */
+  protected function buildPath() {
+    return $this->base_contrib_destination;
+  }
+
+  function recurse($path) {
+    if (!empty($this->directory_name)) {
+      $directory = $this->directory_name;
+    }
+    $makefile = $this->download_location . '/' . $this->name . '.make';
+    if (!file_exists($makefile)) {
+      $makefile = $this->download_location . '/drupal-org.make';
+      if (!file_exists($makefile)) {
+        return;
+      }
+    }
+    drush_log(dt("Found makefile: %makefile", array("%makefile" => basename($makefile))), 'ok');
+
+    $info = drush_make_parse_info_file($makefile);
+    if (!($info = drush_make_validate_info_file($info))) {
+      return FALSE;
+    }
+    $build_path = $this->buildPath($this->name);
+    drush_make_projects(TRUE, trim($build_path, '/'), $info, $this->build_path);
+    drush_make_libraries(trim($build_path, '/'), $info, $this->build_path);
+  }
+}
+
+class DrushMakeProject_Core extends DrushMakeProject {
+  function __construct(&$project) {
+    parent::__construct($project);
+    $this->contrib_destination = '';
+  }
+
+  function findDownloadLocation() {
+    $this->path = $this->download_location = $this->generatePath();
+    $this->project_directory = '';
+    if (is_dir($this->download_location)) {
+      drush_set_error(dt('Directory not empty: %directory', array('%directory' => $this->download_location)));
+      return FALSE;
+    }
+    else {
+      drush_make_mkdir($this->download_location);
+    }
+    return $this->download_location;
+  }
+}
+
+class DrushMakeProject_Library extends DrushMakeProject {
+  public function __construct(&$project) {
+    parent::__construct($project);
+    // Allow libraries to specify where they should live in the build path.
+    if (isset($project['destination'])) {
+      $project_path = $project['destination'];
+    }
+    else {
+      $project_path = 'libraries';
+    }
+
+    $this->contrib_destination = ($this->base_contrib_destination != '.' ? $this->base_contrib_destination . '/' : '') . $project_path;
+  }
+  // No recursion for libraries, sorry :-(
+  function recurse() {}
+}
+
+class DrushMakeProject_Module extends DrushMakeProject {
+  public function __construct(&$project) {
+    parent::__construct($project);
+    $this->contrib_destination = ($this->base_contrib_destination != '.' ? $this->base_contrib_destination . '/' : '') . 'modules';
+  }
+}
+
+class DrushMakeProject_Profile extends DrushMakeProject {
+  public function __construct(&$project) {
+    parent::__construct($project);
+    $this->contrib_destination = 'profiles';
+  }
+
+  protected function buildPath($directory) {
+    return $this->generatePath(FALSE) . '/' . $directory;
+  }
+}
+
+class DrushMakeProject_Theme extends DrushMakeProject {
+  public function __construct(&$project) {
+    parent::__construct($project);
+    $this->contrib_destination = ($this->base_contrib_destination != '.' ? $this->base_contrib_destination . '/' : '') . 'themes';
+  }
+}
+
+class DrushMakeProject_Translation extends DrushMakeProject {
+  public function __construct(&$project) {
+    parent::__construct($project);
+    switch($project['core']) {
+      case '5.x':
+        // Don't think there's an automatic place we can put 5.x translations,
+        // so we'll toss them in a translations directory in the Drupal root.
+        $this->contrib_destination = ($this->base_contrib_destination != '.' ? $this->base_contrib_destination . '/' : '') . 'translations';
+        break;
+      default:
+        $this->contrib_destination = '';
+        break;
+    }
+  }
+}
+
diff --git a/.drush/drush_make/drush_make.test.inc b/.drush/drush_make/drush_make.test.inc
new file mode 100644
index 00000000..893d174d
--- /dev/null
+++ b/.drush/drush_make/drush_make.test.inc
@@ -0,0 +1,199 @@
+<?php
+// $Id: drush_make.test.inc,v 1.1.2.19 2010/09/09 06:43:06 dmitrig01 Exp $
+
+/**
+ * Main drush make-test callback.
+ */
+function drush_make_test($test) {
+  if (empty($test)) {
+    $rows = array();
+    $rows[] = array(dt('Command'), dt('Description'));
+    $rows[] = array('-------', '-----------');
+    foreach (drush_make_test_get_tests() as $id => $info) {
+      $rows[] = array($id, $info['name']);
+    }
+    drush_print_table($rows, TRUE);
+  }
+  else if ($test === 'ALL') {
+    foreach (array_keys(drush_make_test_get_tests()) as $id) {
+      drush_make_test_run_test($id);
+    }
+  }
+  else {
+    drush_make_test_run_test($test);
+  }
+}
+
+/**
+ * Get an array of all tests.
+ */
+function drush_make_test_get_tests($id = NULL) {
+  $tests = array(
+    'cvs' => array(
+      'name'     => 'CVS integration',
+      'makefile' => 'tests/cvs.make',
+      'build'    => TRUE,
+      'messages' => array(
+        'Build hash: f69d29c7ed065b42290bafb7ab9439f1',
+      ),
+      'options'  => array(),
+    ),
+    'get' => array(
+      'name'     => 'Test GET retrieval of projects',
+      'makefile' => 'tests/get.make',
+      'build'    => TRUE,
+      'messages' => array(
+        'Build hash: de88b6acfca95f19ae5ae852bc6bbbe4',
+      ),
+      'options'  => array('no-core' => TRUE),
+    ),
+    'post' => array(
+      'name'     => 'Test POST retrieval of projects',
+      'makefile' => 'tests/post.make',
+      'build'    => TRUE,
+      'messages' => array(
+        'Build hash: 175b3ba2031a30b31775a70e4c23522e',
+      ),
+      'options'  => array('no-core' => TRUE),
+    ),
+    'git' => array(
+      'name'     => 'GIT integration',
+      'makefile' => 'tests/git.make',
+      'build'    => TRUE,
+      'messages' => array(
+        'Build hash: e5210b009b52d60d64ce5effd7e6cf83',
+      ),
+      'options'  => array('no-core' => TRUE),
+    ),
+    'no-patch-txt' => array(
+      'name'     => 'Test --no-patch-txt option',
+      'makefile' => 'tests/patches.make',
+      'build'    => TRUE,
+      'messages' => array(
+        'Build hash: 24f14f6e28498678cebcab2cff3e1030',
+      ),
+      'options'  => array('no-core' => TRUE, 'no-patch-txt' => TRUE),
+    ),
+    'patch' => array(
+      'name'     => 'Test patching and writing of PATCHES.txt file',
+      'makefile' => 'tests/patches.make',
+      'build'    => TRUE,
+      'messages' => array(
+        'Build hash: 173ae5e2120463e31ff2e2a9cc02491b',
+      ),
+      'options'  => array('no-core' => TRUE),
+    ),
+    'include' => array(
+      'name'     => 'Including files',
+      'makefile' => 'tests/include.make',
+      'build'    => TRUE,
+      'messages' => array(
+        'Build hash: a20c3f4f4167c6577156fa616f542120',
+      ),
+      'options'  => array(),
+    ),
+    'recursion' => array(
+      'name'     => 'Recursion',
+      'makefile' => 'tests/recursion.make',
+      'build'    => TRUE,
+      'messages' => array(
+        'Build hash: b4d0599c7c44566a7e3dc9086b870723',
+      ),
+      'options'  => array('no-core' => TRUE),
+    ),
+    'svn' => array(
+      'name'     => 'SVN',
+      'makefile' => 'tests/svn.make',
+      'build'    => TRUE,
+      'messages' => array(
+        'Build hash: 0cb28a15958d7fc4bbf8bf6b00bc6514',
+      ),
+      'options'  => array('no-core' => TRUE),
+    ),
+    'bzr' => array(
+      'name'     => 'Bzr',
+      'makefile' => 'tests/bzr.make',
+      'build'    => TRUE,
+      'messages' => array(
+        'Build hash: 272e2b9bb27794c54396f2f03c159725',
+      ),
+      'options'  => array(),
+    ),
+    'translations' => array(
+      'name'     => 'Translation downloads',
+      'makefile' => 'tests/translations.make',
+      'build'    => TRUE,
+      'messages' => array(
+        'Build hash: 93272917b39388289075c4a6e2f5dd58',
+      ),
+      'options'  => array('translations' => 'es,pt-br'),
+    ),
+    'contrib-destination' => array(
+      'name'     => 'Contrib-destination attribute',
+      'makefile' => 'tests/contrib-destination.make',
+      'build'    => TRUE,
+      'messages' => array(
+        'Build hash: d615d004adfa8ebfe44e91119b88389c',
+      ),
+      'options'  => array('no-core' => TRUE, 'contrib-destination' => '.'),
+    ),
+  );
+  if (isset($id)) {
+    return isset($tests[$id]) ? $tests[$id] : FALSE;
+  }
+  return $tests;
+}
+
+/**
+ * Run a drush make test.
+ */
+function drush_make_test_run_test($id) {
+  if ($test = drush_make_test_get_tests($id)) {
+    $makefile = dirname(__FILE__) .'/'. $test['makefile'];
+    $options = $test['options'] + array('test' => TRUE, 'md5' => TRUE);
+
+    // Log the test command.
+    $debug_command = 'drush make';
+    foreach ($options as $k => $v) {
+      $debug_command .= _drush_escape_option($k, $v);
+    }
+    $debug_command .= " {$makefile}";
+    drush_log(dt('Test command: @debug.', array('@debug' => $debug_command)), 'ok');
+
+    $fail = FALSE;
+    if ($data = drush_backend_invoke('make '. $makefile, $options)) {
+      // Test build completion.
+      if (isset($test['build'])) {
+        if ($test['build'] && !empty($data['error_status'])) {
+          $fail = TRUE;
+          drush_log(dt('@testname: build failed.', array('@testname' => $test['name'])), 'error');
+        }
+        elseif (!$test['build'] && empty($data['error_status'])) {
+          $fail = TRUE;
+          drush_log(dt('@testname: build completed.', array('@testname' => $test['name'])), 'error');
+        }
+      }
+      // Test for messages.
+      if (isset($test['messages'])) {
+        $messages = array();
+        foreach ($data['log'] as $item) {
+          $messages[] = $item['message'];
+        }
+        foreach ($test['messages'] as $message) {
+          if (!in_array($message, $messages)) {
+            $fail = TRUE;
+            drush_log(dt('@testname: "@message" not found.', array('@testname' => $test['name'], '@message' => $message)), 'error');
+          }
+        }
+      }
+      if (!$fail) {
+        drush_log(dt('Drush make test @testname passed.', array('@testname' => $test['name'])), 'ok');
+        return TRUE;
+      }
+    }
+    drush_log(dt('Drush make test @testname failed.', array('@testname' => $test['name'])), 'error');
+    return FALSE;
+  }
+  drush_log(dt('Test @testname could not be found.', array('@testname' => $test['name'])), 'error');
+  return FALSE;
+}
diff --git a/.drush/drush_make/drush_make.utilities.inc b/.drush/drush_make/drush_make.utilities.inc
new file mode 100644
index 00000000..0e6444dc
--- /dev/null
+++ b/.drush/drush_make/drush_make.utilities.inc
@@ -0,0 +1,628 @@
+<?php
+// $Id: drush_make.utilities.inc,v 1.1.2.49 2010/09/09 07:11:00 dmitrig01 Exp $
+
+function drush_make_ensure_version() {
+  // Check version 4:
+  if (function_exists('drush_get_global_options')) {
+    return '4.0';
+  }
+  // Check version 2.1 or up:
+  $options = drush_get_option_help();
+  if (isset($options['-n, --nocolor'])) {
+    return '2.1';
+  }
+
+  if (isset($options['--nocolor'])) {
+    return '2.2';
+  }
+
+  drush_set_error(dt('Drush version 2.1 or higher is required for drush make to work.'));
+  return;
+}
+
+/**
+ * Parse Drupal info file format.
+ *
+ * Copied with modifications from includes/common.inc.
+ *
+ * @see drupal_parse_info_file
+ */
+function drush_make_parse_info_file($makefile, $parsed = TRUE) {
+  if (!($data = drush_make_get_data($makefile))) {
+    return FALSE;
+  }
+  if (!($info = _drush_make_parse_info_file($data))) {
+    return FALSE;
+  }
+  if (!empty($info['includes'])) {
+    $include_path = dirname($makefile);
+    $includes = array();
+    if (!empty($info['includes']) && is_array($info['includes'])) {
+      foreach ($info['includes'] as $include) {
+        if (is_string($include)) {
+          if (drush_make_valid_url($include, TRUE) && ($file = drush_make_parse_info_file($include, FALSE))) {
+            $includes[] = $file;
+          }
+          else if (file_exists($include_path .'/'. $include) && ($file = drush_make_parse_info_file($include_path .'/'. $include, FALSE))) {
+            $includes[] = $file;
+          }
+          else {
+            drush_make_error('BUILD_ERROR', dt("Include file missing: %include", array('%include' => $include)));
+          }
+        }
+      }
+    }
+    $includes[] = $data;
+    $data = implode("\n", $includes);
+    $info = _drush_make_parse_info_file($data);
+  }
+  if ($parsed) {
+    return $info;
+  }
+  else {
+    return $data;
+  }
+}
+
+function _drush_make_parse_info_file($data) {
+  if (!$data) {
+    return FALSE;
+  }
+
+  if (preg_match_all('
+    @^\s*                           # Start at the beginning of a line, ignoring leading whitespace
+    ((?:
+      [^=;\[\]]|                    # Key names cannot contain equal signs, semi-colons or square brackets,
+      \[[^\[\]]*\]                  # unless they are balanced and not nested
+    )+?)
+    \s*=\s*                         # Key/value pairs are separated by equal signs (ignoring white-space)
+    (?:
+      ("(?:[^"]|(?<=\\\\)")*")|     # Double-quoted string, which may contain slash-escaped quotes/slashes
+      (\'(?:[^\']|(?<=\\\\)\')*\')| # Single-quoted string, which may contain slash-escaped quotes/slashes
+      ([^\r\n]*?)                   # Non-quoted string
+    )\s*$                           # Stop at the next end of a line, ignoring trailing whitespace
+    @msx', $data, $matches, PREG_SET_ORDER)) {
+    $info = array();
+    foreach ($matches as $match) {
+      // Fetch the key and value string
+      $i = 0;
+      foreach (array('key', 'value1', 'value2', 'value3') as $var) {
+        $$var = isset($match[++$i]) ? $match[$i] : '';
+      }
+      $value = stripslashes(substr($value1, 1, -1)) . stripslashes(substr($value2, 1, -1)) . $value3;
+
+      // Parse array syntax
+      $keys = preg_split('/\]?\[/', rtrim($key, ']'));
+      $last = array_pop($keys);
+      $parent = &$info;
+
+      // Create nested arrays
+      foreach ($keys as $key) {
+        if ($key == '') {
+          $key = count($parent);
+        }
+        if (!isset($parent[$key]) || !is_array($parent[$key])) {
+          $parent[$key] = array();
+        }
+        $parent = &$parent[$key];
+      }
+
+      // Handle PHP constants
+      if (defined($value)) {
+        $value = constant($value);
+      }
+
+      // Insert actual value
+      if ($last == '') {
+        $last = count($parent);
+      }
+      $parent[$last] = $value;
+    }
+    return $info;
+  }
+  return FALSE;
+}
+
+function drush_make_validate_info_file($info) {
+  // Assume no errors to start.
+  $errors = FALSE;
+
+  if (empty($info['core'])) {
+    drush_make_error('BUILD_ERROR', dt("The 'core' attribute is required"));
+    $errors = TRUE;
+  }
+  // Standardize on core.
+  elseif (preg_match('/^(\d+)(\.(x|(\d+)(-[a-z0-9]+)?))?$/', $info['core'], $matches)) {
+    // An exact version of core has been specified, so pass that to an
+    // internal variable for storage.
+    if (isset($matches[4])) {
+      $info['core_release'] = $info['core'];
+    }
+    // Format the core attribute consistently.
+    $info['core'] = $matches[1] . '.x';
+  }
+  else {
+    drush_make_error('BUILD_ERROR', dt("The 'core' attribute %core has an incorrect format.", array('%core' => $info['core'])));
+    $errors = TRUE;
+  }
+
+  if (!isset($info['api'])) {
+    $info['api'] = 2;
+    drush_log(dt("You need to specify an API version of two in your makefile:\napi = 2"), 'warning');
+  }
+  elseif ($info['api'] != 2) {
+    drush_make_error('BUILD_ERROR', dt("The specified API attribute is incompatible with this version of Drush Make."));
+    $errors = TRUE;
+  }
+
+  $names = array();
+
+  // Process projects.
+  if (isset($info['projects'])) {
+    if (!is_array($info['projects'])) {
+      drush_make_error('BUILD_ERROR', dt("'projects' attribute must be an array."));
+      $errors = TRUE;
+    }
+    else {
+      foreach ($info['projects'] as $project => $project_data) {
+        // Project has an attributes array.
+        if (is_string($project) && is_array($project_data)) {
+          if (in_array($project, $names)) {
+            drush_make_error('BUILD_ERROR', dt("Project %project defined twice (remove the first projects[] = %project).", array('%project' => $project)));
+            $errors = TRUE;
+          }
+          $names[] = $project;
+          foreach ($project_data as $attribute => $value) {
+            // Unset disallowed attributes.
+            if (in_array($attribute, array('contrib_destination'))) {
+              unset($info['projects'][$project][$attribute]);
+            }
+            // Prevent malicious attempts to access other areas of the filesystem.
+            elseif (in_array($attribute, array('subdir', 'directory_name')) && !drush_make_safe_path($value)) {
+              drush_make_error('BUILD_ERROR', dt("Illegal path %path for '%attribute' attribute in project %project.", array('%path' => $value, '%attribute' => $attribute, '%project' => $project)));
+              $errors = TRUE;
+            }
+          }
+        }
+        // Cover if there is no project info, it's just a project name.
+        elseif (is_numeric($project) && is_string($project_data)) {
+          if (in_array($project_data, $names)) {
+            drush_make_error('BUILD_ERROR', dt("Project %project defined twice (remove the first projects[] = %project).", array('%project' => $project_data)));
+            $errors = TRUE;
+          }
+          $names[] = $project_data;
+          unset($info['projects'][$project]);
+          $info['projects'][$project_data] = array();
+        }
+        // Convert shorthand project version style to array format.
+        elseif (is_string($project_data)) {
+          if (in_array($project, $names)) {
+            drush_make_error('BUILD_ERROR', dt("Project %project defined twice (remove the first projects[] = %project).", array('%project' => $project)));
+            $errors = TRUE;
+          }
+          $names[] = $project;
+          $info['projects'][$project] = array('version' => $project_data);
+        }
+        else {
+          drush_make_error('BUILD_ERROR', dt('Project %project incorrectly specified.', array('%project' => $project)));
+          $errors = TRUE;
+        }
+      }
+    }
+  }
+  if (isset($info['libraries'])) {
+    if (!is_array($info['libraries'])) {
+      drush_make_error('BUILD_ERROR', dt("'libraries' attribute must be an array."));
+      $errors = TRUE;
+    }
+    else {
+      foreach($info['libraries'] as $library => $library_data) {
+        if (is_array($library_data)) {
+          foreach($library_data as $attribute => $value) {
+            // Unset disallowed attributes.
+            if (in_array($attribute, array('contrib_destination'))) {
+              unset($info['libraries'][$library][$attribute]);
+            }
+            // Prevent malicious attempts to access other areas of the filesystem.
+            elseif (in_array($attribute, array('contrib-destination', 'directory_name')) && !drush_make_safe_path($value)) {
+              drush_make_error('BUILD_ERROR', dt("Illegal path %path for '%attribute' attribute in library %library.", array('%path' => $value, '%attribute' => $attribute, '%library' => $library)));
+              $errors = TRUE;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  foreach (drush_command_implements('drush_make_validate_info') as $module) {
+    $function = $module .'_drush_make_validate_info';
+    $return = $function($info);
+    if ($return) {
+      $info = $return;
+    }
+    else {
+      $errors = TRUE;
+    }
+  }
+
+  if ($errors) {
+    return FALSE;
+  }
+  return $info;
+}
+
+/**
+ * Verify the syntax of the given URL.
+ *
+ * Copied verbatim from includes/common.inc
+ *
+ * @see valid_url
+ */
+function drush_make_valid_url($url, $absolute = FALSE) {
+  if ($absolute) {
+    return (bool)preg_match("
+      /^                                                      # Start at the beginning of the text
+      (?:ftp|https?):\/\/                                     # Look for ftp, http, or https schemes
+      (?:                                                     # Userinfo (optional) which is typically
+        (?:(?:[\w\.\-\+!$&'\(\)*\+,;=]|%[0-9a-f]{2})+:)*      # a username or a username and password
+        (?:[\w\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})+@          # combination
+      )?
+      (?:
+        (?:[a-z0-9\-\.]|%[0-9a-f]{2})+                        # A domain name or a IPv4 address
+        |(?:\[(?:[0-9a-f]{0,4}:)*(?:[0-9a-f]{0,4})\])         # or a well formed IPv6 address
+      )
+      (?::[0-9]+)?                                            # Server port number (optional)
+      (?:[\/|\?]
+        (?:[\w#!:\.\?\+=&@$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})   # The path and query (optional)
+      *)?
+    $/xi", $url);
+  }
+  else {
+    return (bool)preg_match("/^(?:[\w#!:\.\?\+=&@$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})+$/i", $url);
+  }
+}
+
+function drush_make_tmp($set = TRUE) {
+  static $tmp_dir;
+  if (!isset($tmp_dir) && $set) {
+    $tmp_dir = sys_get_temp_dir();
+    if (strrpos($tmp_dir, '/') == strlen($tmp_dir) - 1) {
+      $tmp_dir .= 'drush_make_tmp_' . time();
+    }
+    else {
+      $tmp_dir .= '/drush_make_tmp_' . time();
+    }
+    drush_make_mkdir($tmp_dir);
+  }
+  return $tmp_dir;
+}
+
+function drush_make_clean_tmp() {
+  if (!($tmp_dir = drush_make_tmp(FALSE))) {
+    return;
+  }
+  if (!drush_get_option('no-clean', FALSE)) {
+    drush_shell_exec('rm -rf %s', $tmp_dir);
+  }
+  else {
+    drush_log(dt('Temporary directory: %dir', array('%dir' => $tmp_dir)), 'ok');
+  }
+}
+
+function drush_make_prepare_install($build_path) {
+  $default = drush_make_tmp() . '/__build__/sites/default';
+  drush_shell_exec("cp %s %s", $default . '/default.settings.php', $default . '/settings.php');
+  drush_make_mkdir($default . '/files');
+  drush_shell_exec("chmod a+w %s %s", $default . '/settings.php', $default . '/files');
+}
+
+function drush_make_md5() {
+  if (drush_shell_exec("( find %s -type f -exec cksum {} \; )", drush_make_tmp())) {
+    $hashes = array();
+    foreach (drush_shell_exec_output() as $line) {
+      // Remove the temporary build path which includes a (relatively)
+      // unique timestamp.
+      $line = str_replace(drush_make_tmp(), '', $line);
+      // Trim to sanitize.
+      $line = trim($line);
+      $hashes[] = $line;
+    }
+    sort($hashes);
+    $output = implode("\n", $hashes);
+    drush_log(dt('Build hash: %md5', array('%md5' => md5($output))), 'ok');
+  }
+}
+
+function drush_make_tar($build_path) {
+  $tmp_path = drush_make_tmp();
+
+  drush_make_mkdir(dirname($build_path));
+  $filename = basename($build_path);
+  $dirname = basename($build_path, '.tar.gz');
+  // Move the build directory to a more human-friendly name, so that tar will
+  // use it instead.
+  drush_shell_exec("mv %s %s", $tmp_path . '/__build__', $tmp_path . '/' . $dirname);
+  // Only move the tar file to it's final location if it's been built
+  // successfully.
+  if (drush_shell_exec("tar -C %s -Pczf %s %s", $tmp_path, $tmp_path . '/' . $filename, $dirname)) {
+    drush_shell_exec("mv %s %s", $tmp_path . '/' . $filename, $build_path);
+  };
+  // Move the build directory back to it's original location for consistency.
+  drush_shell_exec("mv %s %s", $tmp_path . '/' . $dirname, $tmp_path . '/__build__');
+}
+
+/**
+ * Logs an error unless the --force-complete command line option is specified.
+ */
+function drush_make_error($error_code, $message) {
+  if (drush_get_option('force-complete')) {
+    drush_log("$error_code: $message -- build forced", 'warning');
+  }
+  else {
+    drush_set_error($error_code, $message);
+  }
+}
+
+/**
+ * Checks an attribute's path to ensure it's not maliciously crafted.
+ *
+ * @param $path
+ *   The path to check.
+ */
+function drush_make_safe_path($path) {
+  return !preg_match("+^/|^\.\.|/\.\./+", $path);
+}
+
+if (!function_exists('drush_shell_cd_and_exec')) {
+  function drush_shell_cd_and_exec($effective_wd, $cmd) {
+    $args = func_get_args();
+
+    $effective_wd = array_shift($args);
+    $cwd = getcwd();
+    drush_op('chdir', $effective_wd);
+    $result = call_user_func_array('drush_shell_exec', $args);
+    drush_op('chdir', $cwd);
+    return $result;
+  }
+}
+
+/**
+ * Get data based on the source.
+ *
+ * This is a helper function to abstract the retrieval of data, so that it can
+ * come from files, STDIN, etc.  Currently supports filepath and STDIN.
+ *
+ * @param $data_source
+ *   The path to a file, or '-' for STDIN.
+ * @return
+ *   The raw data as a string.
+ */
+function drush_make_get_data($data_source) {
+  if ($data_source == '-') {
+    // See http://drupal.org/node/499758 before changing this.
+    $stdin = fopen("php://stdin","r");
+    $data = '';
+    $has_input = FALSE;
+  
+    while ($line = fgets($stdin)) {
+      $has_input = TRUE;
+      $data .= $line;
+    }
+  
+    if ($has_input) {
+      return $data;
+    }
+    return FALSE;
+  }
+  else {
+    $data = file_get_contents($data_source);
+  }
+  return $data;
+}
+
+/**
+ * Helper to provide sys_get_temp_dir if on php < 5.2.1
+ */
+if (!function_exists('sys_get_temp_dir')) {
+  // Based on http://www.phpit.net/
+  // article/creating-zip-tar-archives-dynamically-php/2/
+  function sys_get_temp_dir() {
+    // Try to get from environment variable
+    if (!empty($_ENV['TMP'])){
+      return realpath($_ENV['TMP']);
+    }
+    else if (!empty($_ENV['TMPDIR'])){
+      return realpath($_ENV['TMPDIR']);
+    }
+    else if (!empty($_ENV['TEMP'])){
+      return realpath($_ENV['TEMP']);
+    }
+    else {
+      // Detect by creating a temporary file
+      // Try to use system's temporary directory
+      // as random name shouldn't exist
+      $temp_file = tempnam(md5(uniqid(rand(), TRUE)), '');
+      if ($temp_file) {
+        $temp_dir = realpath(dirname($temp_file));
+        unlink($temp_file);
+        return $temp_dir;
+      }
+      else {
+        return FALSE;
+      }
+    }
+  }
+}
+
+/**
+ * Drush make parallel to drupal_http_request, but writes responses to a file.
+ */
+function drush_make_http_request($url, $destination, $headers = array(), $method = 'GET', $data = NULL, $retry = 5) {
+  global $db_prefix;
+
+  $result = new stdClass();
+
+  // Parse the URL and make sure we can handle the schema.
+  $uri = parse_url($url);
+
+  if ($uri == FALSE) {
+    $result->error = 'unable to parse URL';
+    $result->code = -1001;
+    return $result;
+  }
+
+  if (!isset($uri['scheme'])) {
+    $result->error = 'missing schema';
+    $result->code = -1002;
+    return $result;
+  }
+
+  switch ($uri['scheme']) {
+    case 'http':
+    case 'feed':
+      $port = isset($uri['port']) ? $uri['port'] : 80;
+      $host = $uri['host'] . ($port != 80 ? ':'. $port : '');
+      $fp = @fsockopen($uri['host'], $port, $errno, $errstr, 15);
+      break;
+    case 'https':
+      // Note: Only works for PHP 4.3 compiled with OpenSSL.
+      $port = isset($uri['port']) ? $uri['port'] : 443;
+      $host = $uri['host'] . ($port != 443 ? ':'. $port : '');
+      $fp = @fsockopen('ssl://'. $uri['host'], $port, $errno, $errstr, 20);
+      break;
+    default:
+      $result->error = 'invalid schema '. $uri['scheme'];
+      $result->code = -1003;
+      return $result;
+  }
+
+  // Make sure the socket opened properly.
+  if (!$fp) {
+    // When a network error occurs, we use a negative number so it does not
+    // clash with the HTTP status codes.
+    $result->code = -$errno;
+    $result->error = trim($errstr);
+
+    return $result;
+  }
+
+  // Construct the path to act on.
+  $path = isset($uri['path']) ? $uri['path'] : '/';
+  if (isset($uri['query'])) {
+    $path .= '?'. $uri['query'];
+  }
+
+  // Create HTTP request.
+  $defaults = array(
+    // RFC 2616: "non-standard ports MUST, default ports MAY be included".
+    // We don't add the port to prevent from breaking rewrite rules checking the
+    // host that do not take into account the port number.
+    'Host' => "Host: $host",
+    'User-Agent' => 'User-Agent: Drupal (+http://drupal.org/)',
+  );
+
+  // Only add Content-Length if we actually have any content or if it is a POST
+  // or PUT request. Some non-standard servers get confused by Content-Length in
+  // at least HEAD/GET requests, and Squid always requires Content-Length in
+  // POST/PUT requests.
+  $content_length = strlen($data);
+  if ($content_length > 0 || $method == 'POST' || $method == 'PUT') {
+    $defaults['Content-Length'] = 'Content-Length: '. $content_length;
+  }
+
+  // If the server url has a user then attempt to use basic authentication
+  if (isset($uri['user'])) {
+    $defaults['Authorization'] = 'Authorization: Basic '. base64_encode($uri['user'] . (!empty($uri['pass']) ? ":". $uri['pass'] : ''));
+  }
+
+  // If the database prefix is being used by SimpleTest to run the tests in a copied
+  // database then set the user-agent header to the database prefix so that any
+  // calls to other Drupal pages will run the SimpleTest prefixed database. The
+  // user-agent is used to ensure that multiple testing sessions running at the
+  // same time won't interfere with each other as they would if the database
+  // prefix were stored statically in a file or database variable.
+  if (is_string($db_prefix) && preg_match("/^simpletest\d+$/", $db_prefix, $matches)) {
+    $defaults['User-Agent'] = 'User-Agent: ' . $matches[0];
+  }
+
+  foreach ($headers as $header => $value) {
+    $defaults[$header] = $header .': '. $value;
+  }
+
+  $request = $method .' '. $path ." HTTP/1.0\r\n";
+  $request .= implode("\r\n", $defaults);
+  $request .= "\r\n\r\n";
+  $request .= $data;
+
+  $result->request = $request;
+
+  fwrite($fp, $request);
+
+  $fp_dest = fopen($destination, 'w');
+  $all_headers = FALSE;
+
+  // Fetch response.
+  $split = '';
+  while (!feof($fp) && $chunk = fread($fp, 1024)) {
+    if (strpos($chunk, "\r\n\r\n") !== FALSE && !$all_headers) {
+      $all_headers = TRUE;
+      list($header, $body) = explode("\r\n\r\n", $chunk, 2);
+      $split .= $header;
+      fwrite($fp_dest, $body);
+    }
+    elseif (!$all_headers) {
+      $split .= $chunk;
+    }
+    else {
+      fwrite($fp_dest, $chunk);
+    }
+  }
+  fclose($fp_dest);
+  fclose($fp);
+
+  // Parse response.
+  $split = preg_split("/\r\n|\n|\r/", $split);
+
+  list($protocol, $code, $status_message) = explode(' ', trim(array_shift($split)), 3);
+  $result->protocol = $protocol;
+  $result->status_message = $status_message;
+
+  $result->headers = array();
+
+  // Parse headers.
+  while ($line = trim(array_shift($split))) {
+    list($header, $value) = explode(':', $line, 2);
+    if (isset($result->headers[$header]) && $header == 'Set-Cookie') {
+      // RFC 2109: the Set-Cookie response header comprises the token Set-
+      // Cookie:, followed by a comma-separated list of one or more cookies.
+      $result->headers[$header] .= ','. trim($value);
+    }
+    else {
+      $result->headers[$header] = trim($value);
+    }
+  }
+
+  $responses = array(
+    100 => 'Continue', 101 => 'Switching Protocols',
+    200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content',
+    300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect',
+    400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Time-out', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Large', 415 => 'Unsupported Media Type', 416 => 'Requested range not satisfiable', 417 => 'Expectation Failed',
+    500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported'
+  );
+  // RFC 2616 states that all unknown HTTP codes must be treated the same as the
+  // base code in their class.
+  if (!isset($responses[$code])) {
+    $code = floor($code / 100) * 100;
+  }
+
+  $result->code = $code;
+  return $result;
+}
+
+/**
+ * Cross-platform compatible helper function to recursively create a directory tree.
+ * @see http://theserverpages.com/php/manual/en/function.mkdir.php#50383
+ */
+function drush_make_mkdir($path) {
+  return is_dir($path) || (drush_make_mkdir(dirname($path)) && drush_shell_exec('mkdir %s', $path));
+}
diff --git a/.drush/drush_make/tests/bzr.make b/.drush/drush_make/tests/bzr.make
new file mode 100644
index 00000000..538eff23
--- /dev/null
+++ b/.drush/drush_make/tests/bzr.make
@@ -0,0 +1,7 @@
+core = 6.x
+api = 2
+
+projects[mv][type] = "core"
+projects[mv][download][type] = "bzr"
+projects[mv][download][url] = "lp:mv"
+projects[mv][download][revision] = 30
diff --git a/.drush/drush_make/tests/contrib-destination.make b/.drush/drush_make/tests/contrib-destination.make
new file mode 100644
index 00000000..9a717324
--- /dev/null
+++ b/.drush/drush_make/tests/contrib-destination.make
@@ -0,0 +1,8 @@
+core = "6.x"
+api = 2
+
+projects[boxes][subdir] = "contrib"
+projects[boxes][version] = "1.0"
+
+projects[admin][subdir] = "contrib"
+projects[admin][version] = "2.0"
\ No newline at end of file
diff --git a/.drush/drush_make/tests/cvs.make b/.drush/drush_make/tests/cvs.make
new file mode 100644
index 00000000..0fc6b92c
--- /dev/null
+++ b/.drush/drush_make/tests/cvs.make
@@ -0,0 +1,21 @@
+core = 6.x
+api = 2
+
+; Test that an alternative CVSROOT specification works.
+projects[drupal][type] = core
+projects[drupal][download][type] = cvs
+projects[drupal][download][root] = :pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal
+projects[drupal][download][module] = drupal
+projects[drupal][download][revision] = DRUPAL-6-17
+
+; Test that no CVSROOT specification falls back to Drupal contrib.
+projects[votingapi][type] = module
+projects[votingapi][download][type] = cvs
+projects[votingapi][download][module] = contributions/modules/votingapi
+projects[votingapi][download][revision] = DRUPAL-6--2-0
+
+; Test that a revision pinned to a date works.
+projects[token][type] = module
+projects[token][download][type] = cvs
+projects[token][download][module] = contributions/modules/token
+projects[token][download][revision] = DRUPAL-6--1:2010-02-17
diff --git a/.drush/drush_make/tests/get.make b/.drush/drush_make/tests/get.make
new file mode 100644
index 00000000..d0b9474f
--- /dev/null
+++ b/.drush/drush_make/tests/get.make
@@ -0,0 +1,8 @@
+core = 6.x
+api = 2
+
+libraries[drush_make][download][type] = get
+libraries[drush_make][download][url] = http://ftp.drupal.org/files/projects/drush_make-6.x-2.0-beta8.tar.gz
+libraries[drush_make][directory_name] = drush_make
+libraries[drush_make][destination] = libraries
+
diff --git a/.drush/drush_make/tests/git.make b/.drush/drush_make/tests/git.make
new file mode 100644
index 00000000..d5f2d822
--- /dev/null
+++ b/.drush/drush_make/tests/git.make
@@ -0,0 +1,22 @@
+core = 6.x
+api = 2
+
+; Test that a specific tag can be pulled.
+projects[tao][type] = theme
+projects[tao][download][type] = git
+projects[tao][download][url] = git://github.com/developmentseed/tao.git
+projects[tao][download][tag] = drupal-6--1-9
+
+; Test that a branch can be pulled. We use a super-old "stale" branch in the
+; Aegir project that we expect not to change.
+projects[hostmaster][type] = profile
+projects[hostmaster][download][type] = git
+projects[hostmaster][download][url] = git://git.aegirproject.org/hostmaster.git
+projects[hostmaster][download][branch] = DRUPAL-5
+
+; Test that a specific revision can be pulled. Note that provision is not
+; actually a module.
+projects[provision][type] = module
+projects[provision][download][type] = git
+projects[provision][download][url] = git://git.aegirproject.org/provision.git
+projects[provision][download][revision] = 017345defebaa6214a8962522e0e9a94889d0020
diff --git a/.drush/drush_make/tests/include.make b/.drush/drush_make/tests/include.make
new file mode 100644
index 00000000..a9d3c2ba
--- /dev/null
+++ b/.drush/drush_make/tests/include.make
@@ -0,0 +1,5 @@
+core = 6.x
+api = 2
+
+projects[drupal] = 6.17
+includes[] = included.make
\ No newline at end of file
diff --git a/.drush/drush_make/tests/included.make b/.drush/drush_make/tests/included.make
new file mode 100644
index 00000000..846b9a17
--- /dev/null
+++ b/.drush/drush_make/tests/included.make
@@ -0,0 +1,6 @@
+core = 6.x
+api = 2
+
+projects[cck] = 2.6
+
+includes[] = included2.make
\ No newline at end of file
diff --git a/.drush/drush_make/tests/included2.make b/.drush/drush_make/tests/included2.make
new file mode 100644
index 00000000..458ffbfa
--- /dev/null
+++ b/.drush/drush_make/tests/included2.make
@@ -0,0 +1,4 @@
+core = 6.x
+api = 2
+
+projects[views] = 2.11
\ No newline at end of file
diff --git a/.drush/drush_make/tests/patches.make b/.drush/drush_make/tests/patches.make
new file mode 100644
index 00000000..5571d0ff
--- /dev/null
+++ b/.drush/drush_make/tests/patches.make
@@ -0,0 +1,7 @@
+core = 6.x
+api = 2
+
+; Test that patches work
+projects[token][version] = 1.13
+projects[token][patch][] = http://drupal.org/files/issues/new_role_email_action5.patch
+projects[token][patch][] = http://drupal.org/files/issues/token_module_array_resolution_587148_01.patch
\ No newline at end of file
diff --git a/.drush/drush_make/tests/post.make b/.drush/drush_make/tests/post.make
new file mode 100644
index 00000000..e3efe274
--- /dev/null
+++ b/.drush/drush_make/tests/post.make
@@ -0,0 +1,8 @@
+core = 6.x
+api = 2
+
+libraries[shadowbox][download][type] = post
+libraries[shadowbox][download][post_data] = format=tar&adapter=jquery&players[]=img&players[]=iframe&players[]=html&players[]=swf&players[]=flv&players[]=qt&players[]=wmp&language=en&css_support=on
+libraries[shadowbox][download][url] = http://www.shadowbox-js.com/download
+libraries[shadowbox][directory_name] = shadowbox
+libraries[shadowbox][destination] = libraries
diff --git a/.drush/drush_make/tests/recursion.make b/.drush/drush_make/tests/recursion.make
new file mode 100644
index 00000000..cb97bb09
--- /dev/null
+++ b/.drush/drush_make/tests/recursion.make
@@ -0,0 +1,8 @@
+core = 6.x
+api = 2
+
+projects[buildkit][type] = "profile"
+projects[buildkit][download][type] = "cvs"
+projects[buildkit][download][date] = 2010-06-27
+projects[buildkit][download][root] = ":pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal-contrib"
+projects[buildkit][download][module] = "contributions/profiles/buildkit"
\ No newline at end of file
diff --git a/.drush/drush_make/tests/svn.make b/.drush/drush_make/tests/svn.make
new file mode 100644
index 00000000..2e695227
--- /dev/null
+++ b/.drush/drush_make/tests/svn.make
@@ -0,0 +1,7 @@
+core = 6.x
+api = 2
+
+; Test an SVN repo with revision flag.
+libraries[flot][download][type] = svn
+libraries[flot][download][url] = http://flot.googlecode.com/svn/trunk
+libraries[flot][download][revision] = 10
diff --git a/.drush/drush_make/tests/translations.make b/.drush/drush_make/tests/translations.make
new file mode 100644
index 00000000..0c1b4e6d
--- /dev/null
+++ b/.drush/drush_make/tests/translations.make
@@ -0,0 +1,8 @@
+core = 6.x
+api = 2
+
+projects[drupal] = 6.19
+projects[token] = 1.14
+projects[zen] = 2.0
+
+; @TODO: Add a project that uses a custom l10n_server
diff --git a/.drush/drushrc.php b/.drush/drushrc.php
new file mode 100644
index 00000000..3005d7ae
--- /dev/null
+++ b/.drush/drushrc.php
@@ -0,0 +1,351 @@
+<?php
+
+/**
+ * Examples of valid statements for a Drush runtime config (drushrc) file.
+ * Use this file to cut down on typing out lenghty and repetetive command line
+ * options in the Drush commands you use and to avoid mistakes.
+ *
+ * Rename this file to drushrc.php and optionally copy it to one of the places
+ * listed below in order of precedence:
+ *
+ * 1.  Drupal site folder (e.g. sites/{default|example.com}/drushrc.php).
+ * 2.  Drupal sites/all/drush folder.
+ * 3.  In any location, as specified by the --config (-c) option.
+ * 4.  User's .drush folder (i.e. ~/.drush/drushrc.php).
+ * 5.  System wide configuration folder (e.g. /etc/drush/drushrc.php).
+ * 6.  Drush installation folder.
+ *
+ * If a configuration file is found in any of the above locations, it will be
+ * loaded and merged with other configuration files in the search list.
+ *
+ * If you have some configuration options that are specific to a particular
+ * version of Drush, then you may place them in a file called drush5rc.php.
+ * The version-specific file is loaded in addtion to, and after, the general-
+ * purpose drushrc file.  Version-specific configuration files can be placed
+ * in any of the locations specified above.
+ *
+ * IMPORTANT NOTE regarding configuration file on Windows:
+ *
+ * For Windows 7, Windows Vista, Windows Server 2008 and later versions is the
+ * system window configuration folder C:\ProgramData\Drush.  For previous
+ * versions of Windows is the folder C:\Documents and Settings\All Users\Drush.
+ *
+ * IMPORTANT NOTE on configuration file loading:
+ *
+ * At its core, Drush works by "bootstrapping" the Drupal environment in very
+ * much the same way that is done during a normal page request from the web
+ * server, so most Drush commands run in the context of a fully-initialized
+ * website.
+ *
+ * Configuration files are loaded in the reverse order they are shown above. All
+ * configuration files are loaded in the first bootstrapping phase, but
+ * a configuration file in a specific Drupal site folder other than the default
+ * (eg, sites/example.com/drushrc.php) will not be loaded unless a specific
+ * Drupal site is selected.  However, it _will_ be loaded if a site is selected
+ * (either via the current working directory or by use of the --uri option),
+ * even if the Drush command being run does not bootstrap to the Drupal Site
+ * phase.
+ *
+ * IMPORTANT NOTE for users upgrading from Drush 4:
+ *
+ * Drush 5 no longer looks for aliases, configs or command files in the Drupal
+ * root folder, so if you previously used drushrc.php files in the Drupal root
+ * you will need to move the file to sites/all/drush/drushrc.php.
+ *
+ * The Drush commands 'rsync' and 'sql-sync' are special cases.  These commands
+ * will load the configuration file for the site specified by the source
+ * parameter; however, they do not load the configuration file for the site
+ * specified by the destination parameter, nor do they load configuration files
+ * for remote sites.
+ *
+ * See `drush topic docs-bootstrap` for more information on how bootstrapping
+ * affects the loading of Drush configuration files.
+ */
+
+// Specify a particular multisite.
+# $options['l'] = 'http://example.com/subir';
+
+// Specify your Drupal core base directory (useful if you use symlinks).
+# $options['r'] = '/home/USER/workspace/drupal-6';
+
+/**
+ * Useful shell aliases:
+ *
+ * Drush shell aliases act similar to git aliases.  For best results, define
+ * aliases in one of the drushrc file locations between #3 through #6 above.
+ * More information on shell aliases can be found via:
+ * `drush topic docs-shell-aliases` on the command line.
+ *
+ * @see https://git.wiki.kernel.org/articles/a/l/i/Aliases.html#Advanced.
+ */
+# $options['shell-aliases']['pull'] = '!git pull'; // We've all done it.
+# $options['shell-aliases']['pulldb'] = '!git pull && drush updatedb';
+# $options['shell-aliases']['noncore'] = 'pm-list --no-core';
+# $options['shell-aliases']['wipe'] = 'cache-clear all';
+# $options['shell-aliases']['unsuck'] = 'pm-disable -y overlay,dashboard';
+# $options['shell-aliases']['offline'] = 'variable-set -y --always-set maintenance_mode 1';
+# $options['shell-aliases']['online'] = 'variable-delete -y --exact maintenance_mode';
+# $options['shell-aliases']['dis-all'] = '!drush -y dis $(drush pml --status=enabled --type=module --no-core --pipe)';
+
+// You can create a local cache of all projects checked out using
+// --package-handler=git_drupalorg; this can be faster for repeated
+// downloads, but can be dangerous. See: http://randyfay.com/node/119
+# $options['cache'] = TRUE;
+
+/**
+ * Historical (deprecated) aliases:
+ *
+ * The following aliases were supported in Drush 4, but removed in Drush 5.  To
+ * keep using them, uncomment the following lines or copy them to your drushrc
+ * file.
+ */
+# $options['shell-aliases']['script'] = 'php-script';
+# $options['shell-aliases']['sync'] = 'core-rsync';
+# $options['shell-aliases']['installsite'] = 'site-install';
+# $options['shell-aliases']['is'] = 'site-install';
+# $options['shell-aliases']['wd'] = 'watchdog-delete';
+# $options['shell-aliases']['enable'] = 'pm-enable';
+# $options['shell-aliases']['disable'] = 'pm-disable';
+# $options['shell-aliases']['uninstall'] = 'pm-uninstall';
+# $options['shell-aliases']['sm'] = 'pm-list';
+# $options['shell-aliases']['refresh'] = 'pm-refresh';
+# $options['shell-aliases']['updatecode'] = 'pm-updatecode';
+# $options['shell-aliases']['update'] = 'pm-update';
+# $options['shell-aliases']['download'] = 'pm-download';
+
+// Load a drushrc.php configuration file from the current working directory.
+# $options['config'][] = '.';
+
+/**
+ * Drush knows how to check for and download its own code updates with the
+ * `drush pm-updatecode` and `drush version` commands.  Set this value to TRUE
+ * (default) allows updates to latest stable release.  Set to FALSE to disable
+ * self update checks completely.  Set to 'head' to allow bleeding-edge updates
+ * from the code repository.
+ */
+# $options['self-update'] = FALSE;
+
+/**
+ * Enable logging and periodic upload of anonymized usage statistics. The Drush
+ * maintainers use this data to learn which commands and options are most
+ * See the usage-show and usage-send commands.
+ */
+# $options['drush_usage_log'] = TRUE;
+# $options['drush_usage_send'] = TRUE;
+
+/**
+ * By default, Drush will download projects compatibile with the current
+ * version of Drupal, or, if no Drupal site is specified, then the Drupal-7
+ * version of the project is downloaded.  Set default-major to select a
+ * different default version.
+ */
+# $options['default-major'] = 6;
+
+// Clone extensions (modules, themes, etc.) from drupal.org via 'pm-download'.
+# $options['package-handler'] = 'git_drupalorg';
+
+/**
+ * Specify folders to search for Drush command files (*.drush.inc).  These
+ * values are always merged with include paths defined on the command line or
+ * in other configuration files.  On the command line, paths may be separated
+ * by a colon (:) on Unix-based systems or a semi-colon (;) on Windows.
+ */
+# $options['include'] = array('/path/to/commands','/path2/to/more/commands');
+
+/**
+ * Specify the modules to ignore when searching for command files (*.drush.inc)
+ * inside a Drupal site.
+ */
+# $options['ignored-modules'] = array('module1', 'module2');
+
+/**
+ * Specify the folders to search for Drush alias files (*.alias.drushrc.php and
+ * *.aliases.drushrc.php).  These values are always merged with alias paths
+ *  defined on the command line or in other configuration files.  On the command
+ * line, paths may be separated by a colon (:) on Unix-based systems or a
+ * semi-colon (;) on Windows.
+ */
+# $options['alias-path'] = array('/path/to/aliases','/path2/to/more/aliases');
+
+/**
+ * Specify the folder where 'sql-sync' should store persistent dump files.
+ * Keeping the dump files around improves the performance of rsync when the
+ * database is rsync'ed to a remote system.  If a dump directory is not
+ * specified, then 'sql-sync' will store dumps in temporary files.
+ */
+# $options['dump-dir'] = '/path/to/dumpdir';
+
+/**
+ * Specify the filename and path where 'sql-dump' should store backups of
+ * database dumps.  The default is to dump to STDOUT, however if this option is
+ * set in a drushrc.php file, the default behaviour can be achieved by
+ * specifying a value of FALSE ("--result-file=0" on the command line).  Two
+ * substitution tokens are available: @DATABASE is replaced with the name of the
+ * database being dumped, and @DATE is replaced with the current time and date
+ * of the dump of the form: YYYYMMDD_HHMMSS.  A value of TRUE ("--result-file=1"
+ * on the command line) will cause 'sql-dump' to use the same temporary backup
+ * location as 'pm-updatecode'.
+ */
+# $options['result-file'] = TRUE;
+# $options['result-file'] = '/path/to/backup/dir/@DATABASE_@DATE.sql';
+
+
+// Enable verbose mode.
+# $options['v'] = 1;
+
+// Show database passwords in 'status' and 'sql-conf' commands.
+# $options['show-passwords'] = 1;
+
+/**
+ * Specify the logging level for PHP notices.  Defaults to "notice".  Set to
+ * "warning" when doing Drush development.  Also make sure that error_reporting
+ * is set to E_ALL in your php configuration file.  See `drush status` for the
+ * path to your php.ini file.
+ */
+# $options['php-notices'] = 'warning';
+
+/**
+ * Specify options to pass to ssh in backend invoke.  The default is to prohibit
+ * password authentication, and is included here, so you may add additional
+ * parameters without losing the default configuration.
+ */
+# $options['ssh-options'] = '-o PasswordAuthentication=no';
+
+// Set 'remote-os' to 'Windows' to make Drush use Windows shell escape rules
+// for remote sites that do not have an 'os' item set.
+# $options['remote-os'] = 'Linux';
+
+// By default, unknown options are disallowed and result in an error.  Change
+// them to issue only a warning and let command proceed.
+# $options['strict'] = FALSE;
+
+/**
+ * Drush requires at least rsync version 2.6.4 for some functions to work
+ * correctly.  rsync version 2.6.8 or earlier may give the following error
+ * message: "--remove-source-files: unknown option".  To fix this, set
+ * $options['rsync-version'] = '2.6.8'; (replace with the lowest version of
+ * rsync installed on any system you are using with Drush).  Note that this
+ * option can also be set in a site alias, which is the prefered solution if
+ * newer versions of rsync are available on some of the systems you use.
+ * See: http://drupal.org/node/955092
+ */
+# $options['rsync-version'] = '2.6.9';
+
+/**
+ * The output charset suitable to pass to the iconv PHP function's out_charset
+ * parameter.
+ *
+ * Drush will convert its output from UTF-8 to the charset specified here.  It
+ * is possible to use //TRANSLIT and //IGNORE charset name suffixes (see iconv
+ * documentation).  If not defined, conversion will not be performed.
+ */
+# $options['output_charset'] = 'ISO-8859-1';
+# $options['output_charset'] = 'KOI8-R//IGNORE';
+# $options['output_charset'] = 'ISO-8859-1//TRANSLIT';
+
+/**
+ * Multiple-site execution options:
+ *
+ * Some drush commands such as 'sql-sync' are intended for or capable of being
+ * executed on multiple sites or server environments and will pass along the
+ * options specified here to all instances of the command being executed.
+ */
+
+/**
+ * By default, Drush will prepend the name of the site to the output of any
+ * multiple-site command execution.  To disable this behavior, set the
+ * "--no-label" option.
+ */
+# $options['no-label'] = TRUE;
+
+/**
+ * An explicit list of tables which should be included in sql-dump and sql-sync.
+ */
+# $options['tables']['common'] = array('user', 'permissions', 'role_permission', 'role');
+
+/**
+ * List of tables whose *data* is skipped by the 'sql-dump' and 'sql-sync'
+ * commands when the "--structure-tables-key=common" option is provided.
+ * You may add specific tables to the existing array or add a new element.
+ */
+# $options['structure-tables']['common'] = array('cache', 'cache_filter', 'cache_menu', 'cache_page', 'history', 'sessions', 'watchdog');
+
+/**
+ * List of tables to be omitted entirely from SQL dumps made by the 'sql-dump'
+ * and 'sql-sync' commands when the "--skip-tables-key=common" option is
+ * provided on the command line.  This is useful if your database contains
+ * non-Drupal tables used by some other application or during a migration for
+ * example.  You may add new tables to the existing array or add a new element.
+ */
+# $options['skip-tables']['common'] = array('migration_data1', 'migration_data2');
+
+/**
+ * Override specific entries in Drupal's 'variable' table or settings.php
+ */
+# $options['variables']['site_name'] = 'My Drupal site';
+# $options['variables']['theme_default'] = 'minnelli';
+# $options['variables']['anonymous'] = 'Visitor';
+
+/**
+ * Command-specific execution options:
+ *
+ * Most execution options can be shared between multiple Drush commands; these
+ * are specified as top-level elements of the $options array in the prior
+ * examples above.  On the other hand, other options are command-specific, and,
+ * in some cases, a shared option needs a different configuration depending on
+ * which command is being executing.
+ *
+ * To define options that are only applicable to certain commands, make an entry
+ * in the $command-specific array as shown below.  The name of the command may
+ * be either the command's full name or any of the command's aliases.
+ *
+ * Options defined here will be overridden by options of the same name on the
+ * command line.  Unary flags such as "--verbose" are overridden via special
+ * "--no-xxx" options (e.g. "--no-verbose").
+ *
+ * Limitation: If 'verbose' is set in a command-specific option, it must be
+ * cleared by '--no-verbose', not '--no-v', and visa-versa.
+ */
+
+// Ensure all rsync commands use verbose output.
+# $command_specific['rsync'] = array('verbose' => TRUE);
+
+// CVS credentials for module dowlnoads.
+# $command_specific['dl'] = array('cvscredentials' => 'user:pass');
+
+// Additional folders to search for scripts.
+// Separate by : (Unix-based systems) or ; (Windows).
+# $command_specific['script']['script-path'] = 'sites/all/scripts:profiles/myprofile/scripts';
+
+// Always show release notes when running pm-update or pm-updatecode.
+# $command_specific['pm-update'] = array('notes' => TRUE);
+# $command_specific['pm-updatecode'] = array('notes' => TRUE);
+
+// Set a predetermined username and password when using site-install.
+# $command_specific['site-install'] = array('account-name' => 'alice', 'account-pass' => 'secret');
+
+/**
+ * List of Drush commands or aliases that should override built-in shell
+ * functions and commands; otherwise, built-ins override Drush commands. Default
+ * is 'help,dd,sa'.  Warning: bad things can happen if you put the wrong thing
+ * here (e.g. eval, grep), so be cautious.  If a Drush command overrides a
+ * built-in command (e.g. bash help), then you can use the `builtin` operator
+ * to run the built-in version (e.g. `builtin help` to show bash help instead of
+ * Drush help.) If a Drush command overrides a shell command (e.g. grep), then
+ * you can use the regular shell command by typing in the full path to the
+ * command (e.g. /bin/grep).
+ */
+# $command_specific['core-cli'] = array('override' => 'help,dd,sa');
+
+/**
+ * Load a drushrc file from the 'drush' folder at the root of the current
+ * git repository.  Example script below by grayside.  Customize as desired.
+ * @see: http://grayside.org/node/93.
+ */
+#exec('git rev-parse --show-toplevel 2> /dev/null', $output);
+#if (!empty($output)) {
+#  $repo = $output[0];
+#  $options['config'] = $repo . '/drush/drushrc.php';
+#  $options['include'] = $repo . '/drush/commands';
+#  $options['alias-path'] = $repo . '/drush/aliases';
+#}
diff --git a/htmltest/CHANGELOG.txt b/htmltest/CHANGELOG.txt
new file mode 100644
index 00000000..00d4d71a
--- /dev/null
+++ b/htmltest/CHANGELOG.txt
@@ -0,0 +1,1829 @@
+
+Drupal 7.25, 2014-01-02
+-----------------------
+- Fixed a bug in node_save() which prevented the saved node from being updated
+  in hook_node_insert() and other similar hooks.
+- Added a meta tag to install.php to prevent it from being indexed by search
+  engines even when Drupal is installed in a subfolder (minor markup change).
+- Fixed a bug in the database API that caused frequent deadlock errors when
+  running merge queries on some servers.
+- Performance improvement: Prevented block rehashing from writing blocks to the
+  database on every cache clear and cron run when the blocks have not changed.
+  This fix results in an extra 'saved' key which is added and set to TRUE for
+  each block returned by _block_rehash() that actually is saved to the database
+  (data structure change).
+- Added an optional 'skip on cron' parameter to hook_cron_queue_info() to allow
+  queues to avoid being automatically processed on cron runs (API addition).
+- Fixed a bug which caused hook_block_view_MODULE_DELTA_alter() to never be
+  invoked if the block delta had a hyphen in it. To implement the hook when the
+  block delta has a hyphen, modules should now replace hyphens with underscores
+  when constructing the function name for the hook implementation.
+- Fixed a bug which caused cached pages to sometimes be sent to the browser
+  with incorrect compression. The fix adds a new 'page_compressed' key to the
+  $cache->data array returned by drupal_page_get_cache() (minor data structure
+  change).
+- Fixed broken tests on PHP 5.5.
+- Made the File and Image modules more robust when saving entities that have
+  deleted files attached. The code in file_field_presave() will now remove the
+  record of the deleted file from the entity before saving (minor data
+  structure change).
+- Standardized menu callback functions throughout Drupal core to return
+  MENU_NOT_FOUND and MENU_ACCESS_DENIED rather than printing their own "page
+  not found" or "access denied" pages (minor API change in the return value of
+  these functions under some circumstances).
+- Fixed a bug in which caches were not properly cleared when a node was deleted
+  via the administrative interface.
+- Changed the Bartik theme to render content contained in <pre>, <code> and
+  similar tags in a larger font size, so it is easier to read.
+- Fixed a bug in the Search module that caused exceptions to be thrown during
+  searches if the server was not configured to represent decimal points as a
+  period.
+- Fixed a regression in the Image module that made image_style_url() not work
+  when a relative path (rather than a complete file URI) was passed to it.
+- Added an optional feature to the Statistics module to allow node views to be
+  tracked by Ajax requests rather than during the server-side generation of the
+  page. This allows the node counter to work on sites that use external page
+  caches (string change and new administrative option:
+  https://drupal.org/node/2164069).
+- Added a link to the drupal.org documentation page for cron to the Cron
+  settings page (string change).
+- Added a 'drupal_anonymous_user_object' variable to allow the anonymous user
+  object returned by drupal_anonymous_user() to be overridden with a classed
+  object (API addition).
+- Changed the database API to allow inserts based on a SELECT * query to work
+  correctly.
+- Changed the database schema of the {file_managed} table to allow Drupal to
+  manage files larger than 4 GB.
+- Changed the File module's hook_field_load() implementation to prevent file
+  entity properties which have the same name as file or image field properties
+  from overwriting the field properties (minor API change).
+- Numerous small bug fixes.
+- Numerous API documentation improvements.
+- Additional automated test coverage.
+
+Drupal 7.24, 2013-11-20
+----------------------
+- Fixed security issues (multiple vulnerabilities), see SA-CORE-2013-003.
+
+Drupal 7.23, 2013-08-07
+-----------------------
+- Fixed a fatal error on PostgreSQL databases when updating the Taxonomy module
+  from Drupal 6 to Drupal 7.
+- Fixed the default ordering of CSS files for sites using right-to-left
+  languages, to consistently place the right-to-left override file immediately
+  after the CSS it is overriding (API change: https://drupal.org/node/2058463).
+- Added a drupal_check_memory_limit() API function to allow the memory limit to
+  be checked consistently (API addition).
+- Changed the default web.config file for IIS servers to allow favicon.ico
+  files which are present in the filesystem to be accessed.
+- Fixed inconsistent support for the 'tel' protocol in Drupal's URL filtering
+  functions.
+- Performance improvement: Allowed all hooks to be included in the
+  module_implements() cache, even those that are only invoked on HTTP POST
+  requests.
+- Made the database system replace truncate queries with delete queries when
+  inside a transaction, to fix issues with PostgreSQL and other databases.
+- Fixed a bug which caused nested contextual links to display improperly.
+- Fixed a bug which prevented cached image derivatives from being flushed for
+  private files and other non-default file schemes.
+- Fixed drupal_render() to always return an empty string when there is no
+  output, rather than sometimes returning NULL (minor API change).
+- Added protection to cache_clear_all() to ensure that non-cache tables cannot
+  be truncated (API addition: a new isValidBin() method has been added to the
+  default database cache implementation).
+- Changed the default .htaccess file to support HTTP authorization in CGI
+  environments.
+- Changed the password reset form to pre-fill the username when requested via a
+  URL query parameter, and used this in the error message that appears after a
+  failed login attempt (minor data structure and behavior change).
+- Fixed broken support for foreign keys in the field API.
+- Fixed "No active batch" error when a user cancels their own account.
+- Added a description to the "access content overview" permission on the
+  permissions page (string change).
+- Added a drupal_array_diff_assoc_recursive() function to allow associative
+  arrays to be compared recursively (API addition).
+- Added human-readable labels to image styles, in addition to the existing
+  machine-readable name (API change: https://drupal.org/node/2058503).
+- Moved the drupal_get_hash_salt() function to bootstrap.inc and used it in
+  additional places in the code, for added security in the case where there is
+  no hash salt in settings.php.
+- Fixed a regression in Drupal 7.22 that caused internal server errors for
+  sites running on very old Apache 1.x web servers.
+- Numerous small bug fixes.
+- Numerous API documentation improvements.
+- Additional automated test coverage.
+
+Drupal 7.22, 2013-04-03
+-----------------------
+- Allowed the drupal_http_request() function to be overridden so that
+  additional HTTP request capabilities can be added by contributed modules.
+- Changed the Simpletest module to allow PSR-0 test classes to be used in
+  Drupal 7.
+- Removed an unnecessary "Content-Disposition" header from private file
+  downloads; it prevented many private files from being viewed inline in a web
+  browser.
+- Changed various field API functions to allow them to optionally act on a
+  single field within an entity (API addition: http://drupal.org/node/1825844).
+- Fixed a bug which prevented Drupal's file transfer functionality from working
+  on some PHP 5.4 systems.
+- Fixed incorrect log message when theme() is called for a theme hook that does
+  not exist (minor string change).
+- Fixed Drupal's token-replacement system to allow spaces in the token value.
+- Changed the default behavior after a user creates a node they do not have
+  access to view. The user will now be redirected to the front page rather than
+  an access denied page.
+- Fixed a bug which prevented empty HTTP headers (such as "0") from being set.
+  (Minor behavior change: Callers of drupal_add_http_header() must now set
+  FALSE explicitly to prevent a header from being sent at all; this was already
+  indicated in the function's documentation.)
+- Fixed OpenID errors when more than one module implements hook_openid(). The
+  behavior is now changed so that if more than one module tries to set the same
+  parameter, the last module's change takes effect.
+- Fixed a serious documentation bug: The $name variable in the
+  taxonomy-term.tpl.php theme template was incorrectly documented as being
+  sanitized when in fact it is not.
+- Fixed a bug which prevented Drupal 6 to Drupal 7 upgrades on sites which had
+  duplicate permission names in the User module's database tables.
+- Added an empty "datatype" attribute to taxonomy term and username links to
+  make the RDFa markup upward compatible with RDFa 1.1 (minor markup addition).
+- Fixed a bug which caused the denial-of-service protection added in Drupal
+  7.20 to break certain valid image URLs that had an extra slash in them.
+- Fixed a bug with update queries in the SQLite database driver that prevented
+  Drupal from being installed with SQLite on PHP 5.4.
+- Fixed enforced dependencies errors updating to recent versions of Drupal 7 on
+  certain non-MySQL databases.
+- Refactored the Field module's caching behavior to obtain large improvements
+  in memory usage for sites with many fields and instances (API addition:
+  http://drupal.org/node/1915646).
+- Fixed entity argument not being passed to implementations of
+  hook_file_download_access_alter(). The fix adds an additional context
+  parameter that can be passed when calling drupal_alter() for any hook (API
+  change: http://drupal.org/node/1882722).
+- Fixed broken support for translatable comment fields (API change:
+  http://drupal.org/node/1874724).
+- Added an assertThemeOutput() method to Simpletest to allow tests to check
+  that themed output matches an expected HTML string (API addition).
+- Added a link to "Install another module" after a module has been successfully
+  downloaded via the Update Manager (UI change).
+- Added an optional "exclusive" flag to installation profile .info files which
+  allows Drupal distributions to force a profile to be selected during
+  installation (API addition: http://drupal.org/node/1961012).
+- Fixed a bug which caused the database API to not properly close database
+  connections.
+- Added a link to the URL for running cron from outside the site to the Cron
+  settings page (UI change).
+- Fixed a bug which prevented image styles from being reverted on PHP 5.4.
+- Made the default .htaccess rules protocol sensitive to improve security for
+  sites which use HTTPS and redirect between "www" and non-"www" versions of
+  the page.
+- Numerous small bug fixes.
+- Numerous API documentation improvements.
+- Additional automated test coverage.
+
+Drupal 7.21, 2013-03-06
+-----------------------
+- Allowed sites using the 'image_allow_insecure_derivatives' variable to still
+  have partial protection from the security issues fixed in Drupal 7.20.
+
+Drupal 7.20, 2013-02-20
+-----------------------
+- Fixed security issues (denial of service). See SA-CORE-2013-002.
+
+Drupal 7.19, 2013-01-16
+-----------------------
+- Fixed security issues (multiple vulnerabilities). See SA-CORE-2013-001.
+
+Drupal 7.18, 2012-12-19
+-----------------------
+- Fixed security issues (multiple vulnerabilities). See SA-CORE-2012-004.
+
+Drupal 7.17, 2012-11-07
+-----------------------
+- Changed the default value of the '404_fast_html' variable to have a DOCTYPE
+  declaration.
+- Made it possible to use associative arrays for the 'items' variable in
+  theme_item_list().
+- Fixed a bug which prevented required form elements without a title from being
+  given an "error" class when the form fails validation.
+- Prevented duplicate HTML IDs from appearing when two forms are displayed on
+  the same page and one of them is submitted with invalid data (minor markup
+  change).
+- Fixed a bug which prevented Drupal 6 to Drupal 7 upgrades on sites which had
+  stale data in the Upload module's database tables.
+- Fixed a bug in the States API which prevented certain types of form elements
+  from being disabled when requested.
+- Allowed aggregator feed items with author names longer than 255 characters to
+  have a truncated version saved to the database (rather than causing a fatal
+  error).
+- Allowed aggregator feed items to have URLs longer than 255 characters
+  (schema change which results in several columns in the Aggregator module's
+  database tables changing from VARCHAR to TEXT fields).
+- Added hook_taxonomy_term_view() and standardized the process for rendering
+  taxonomy terms to invoke hook_entity_view() and otherwise make it consistent
+  with other entities (API change: http://drupal.org/node/1808870).
+- Added hook_entity_view_mode_alter() to allow modules to change entity view
+  modes on display (API addition: http://drupal.org/node/1833086).
+- Fixed a bug which made database queries running a "LIKE" query on blob fields
+  fail on PostgreSQL databases. This caused errors during the Drupal 6 to
+  Drupal 7 upgrade.
+- Changed the hook_menu() entry for Drupal's rss.xml page to prevent extra path
+  components from being accidentally passed to the page callback function (data
+  structure change).
+- Removed a non-standard "name" attribute from Drupal's default Content-Type
+  header for file downloads.
+- Fixed the theme settings form to properly clean up submitted values in
+  $form_state['values'] when the form is submitted (data structure change).
+- Fixed an inconsistency by removing the colon from the end of the label on
+  multi-valued form fields (minor string change).
+- Added support for 'weight' in hook_field_widget_info() to allow modules to
+  control the order in which widgets are displayed in the Field UI.
+- Updated various tables in the OpenID and Book modules to use the default
+  "empty table" text pattern (string change).
+- Added proxy server support to drupal_http_request().
+- Added "lang" attributes to language links, to better support screen readers.
+- Fixed double occurrence of a "ul" HTML tag on secondary local tasks in the
+  Seven theme (markup change).
+- Fixed bugs which caused taxonomy vocabulary and shortcut set titles to be
+  double-escaped. The fix replaces the taxonomy vocabulary overview page and
+  "Edit shortcuts" menu items' title callback entries in hook_menu() with new
+  functions that do not escape HTML characters (data structure change).
+- Modified the Update manager module to allow drupal.org to collect usage
+  statistics for individual modules and themes, rather than only for entire
+  projects.
+- Modified the node listing database query on Drupal's default front page to
+  add table aliases for better query altering (this is a data structure change
+  affecting code which implements hook_query_alter() on this query).
+- Improved the translatability of the "Field type(s) in use" message on the
+  modules page (admin-facing string change).
+- Fixed a regression which caused a "call to undefined function
+  drupal_find_base_themes()" fatal error under rare circumstances.
+- Numerous API documentation improvements.
+- Additional automated test coverage.
+
+Drupal 7.16, 2012-10-17
+-----------------------
+- Fixed security issues (Arbitrary PHP code execution and information
+  disclosure). See SA-CORE-2012-003.
+
+Drupal 7.15, 2012-08-01
+-----------------------
+- Introduced a 'user_password_reset_timeout' variable to allow the 24-hour
+  expiration for user password reset links to be adjusted (API addition).
+- Fixed database errors due to ambiguous column names that occurred when
+  EntityFieldQuery was used in certain situations.
+- Changed the drupal_array_get_nested_value() function to return a reference
+  (API addition).
+- Changed the System module's hook_block_info() implementation to assign the
+  "Main page content" and "System help" blocks to appropriate regions by
+  default and prevent error messages on the block administration page (data
+  structure change).
+- Fixed regression: Non-node entities couldn't be accessed with
+  EntityFieldQuery.
+- Fixed regression: Optional radio buttons with an empty, non-NULL default
+  value led to an illegal choice error when none were selected.
+- Reorganized the testing framework to split setUp() into specific sub-methods
+  and fix several regressions in the process.
+- Fixed bug which made it impossible to search for strings that have not been
+  translated into a particular language.
+- Renamed the "Field" column on the Manage Fields screen to "Field type", since
+  the former was confusing and inaccurate (UI change).
+- Performance improvement: Removed needless call to system_rebuild_module_data()
+  in field_sync_field_status(), greatly speeding up bulk module enable/disable.
+- Fixed bug which prevented notifications from being sent when core, module, and
+  theme updates are available.
+- Fixed bug which prevented sub-themes from inheriting the default values of
+  theme settings defined by the base theme.
+- Fixed bug which prevented the jQuery UI Datepicker from being localized.
+- Made Ajax alert dialogs respect error reporting settings.
+- Fixed bug which prevented image styles from being deleted on PHP 5.4.
+- Fixed bug: Language detection by domain only worked on port 80.
+- Fixed regression: The first plural index on a page was not calculated
+  correctly.
+- Introduced generic entity language support. Entities may now declare their
+  language property in hook_entity_info(), and modules working with entities
+  may access the language using entity_language() (API change:
+  http://drupal.org/node/1626346).
+- Added EntityFieldQuery support for taxonomy bundles.
+- Fixed issue where field form structure was incomplete if field_access()
+  returned FALSE. Instead of being incomplete, the form structure now has
+  #access set to FALSE and field form validation is skipped (data structure
+  change: http://drupal.org/node/1663020).
+- Fixed data loss issue due to field_has_data() returning inconsistent results.
+  The fix adds an optional DANGEROUS_ACCESS_CHECK_OPT_OUT tag to entity field
+  queries which field storage engines can respond to (API addition:
+  http://drupal.org/node/1597378).
+- Fixed notice: Undefined index: default_image in image_field_prepare_view()
+- Numerous API documentation improvements.
+- Additional automated test coverage.
+
+Drupal 7.14 2012-05-02
+----------------------
+- Fixed "integrity constraint" fatal errors when rebuilding registry.
+- Fixed custom logo and favicon functionality referencing incorrect paths.
+- Fixed DB Case Sensitivity: Allow BINARY attribute in MySQL.
+- Split field_bundle_settings out per bundle.
+- Improve UX for machine names for fields (UI change).
+- Fixed User pictures are not removed properly.
+- Fixed HTTPS sessions not working in all cases.
+- Fixed Regression: Required radios throw illegal choice error when none
+  selected.
+- Fixed allow autocompletion requests to include slashes.
+- Eliminate $user->cache and {session}.cache in favor of
+  $_SESSION['cache_expiration'][$bin] (Performance).
+- Fixed focus jumps to tab when pressing enter on a form element within tab.
+- Fixed race condition in locale() - duplicates in {locales_source}.
+- Fixed Missing "Default image" per field instance.
+- Quit clobbering people's work when they click the filter tips link
+- Form API #states: Fix conditionals to allow OR and XOR constructions.
+- Fixed Focus jumps to tab when pressing enter on a form element within tab.
+  (Accessibility)
+- Improved performance of node_access queries.
+- Fixed Fieldsets inside vertical tabs have no title and can't be collapsed.
+- Reduce size of cache_menu table (Performance).
+- Fixed unnecessary aggregation of CSS/JS (Performance).
+- Fixed taxonomy_autocomplete() produces SQL error for nonexistent field.
+- Fixed HTML filter is not run first by default, despite default weight.
+- Fixed Overlay does not work with prefixed URL paths.
+- Better debug info for field errors (string change).
+- Fixed Data corruption in comment IDs (results in broken threading on
+  PostgreSQL).
+- Fixed machine name not editable if every character is replaced.
+- Fixed user picture not appearing in comment preview (Markup change).
+- Added optional vid argument for taxonomy_get_term_by_name().
+- Fixed Invalid Unicode code range in PREG_CLASS_UNICODE_WORD_BOUNDARY fails
+  with PCRE 8.30.
+- Fixed {trigger_assignments()}.hook has only 32 characters, is too short.
+- Numerous fixes to run-tests.sh.
+- Fixed Tests in profiles/[name]/modules cannot be run and cannot use a
+  different profile for running tests.
+- Numerous JavaScript performance fixes.
+- Numerous documentation fixes.
+- Fixed All pager links have an 'active' CSS class.
+- Numerous upgrade path fixes; notably:
+  - system_update_7061() fails on inserting files with same name but different
+    case.
+  - system_update_7061() converts filepaths too aggressively.
+  - Trigger upgrade path: Node triggers removed when upgrading to 7-x from 6.25.
+
+Drupal 7.13 2012-05-02
+----------------------
+- Fixed security issues (Multiple vulnerabilities), see SA-CORE-2012-002.
+
+Drupal 7.12, 2012-02-01
+----------------------
+- Fixed bug preventing custom menus from receiving an active trail.
+- Fixed hook_field_delete() no longer invoked during field_purge_data().
+- Fixed bug causing entity info cache to not be cleared with the rest of caches.
+- Fixed file_unmanaged_copy() fails with Drupal 7.7+ and safe_mode() or
+  open_basedir().
+- Fixed Nested transactions throw exceptions when they got out of scope.
+- Fixed bugs with the Return-Path when sending mail on both Windows and
+  non-Windows systems.
+- Fixed bug with DrupalCacheArray property visibility preventing others from
+  extending it (API change: http://drupal.org/node/1422264).
+- Fixed bug with handling of non-ASCII characters in file names (API change:
+  http://drupal.org/node/1424840).
+- Reconciled field maximum length with database column size in image and
+  aggregator modules.
+- Fixes to various core JavaScript files to allow for minification and
+  aggregation.
+- Fixed Prevent tests from deleting main installation's tables when
+  parent::setUp() is not called.
+- Fixed several Poll module bugs.
+- Fixed several Shortcut module bugs.
+- Added new hook_system_theme_info() to provide ability for contributed modules
+  to test theme functionality.
+- Added ability to cancel mail sending from hook_mail_alter().
+- Added support for configurable PDO connection options, enabling master-master
+  database replication.
+- Numerous improvements to tests and test runner to pave the way for faster test
+  runs.
+- Expanded test coverage.
+- Numerous API documentation improvements.
+- Numerous performance improvements, including token replacement and render
+  cache.
+
+Drupal 7.11, 2012-02-01
+----------------------
+- Fixed security issues (Multiple vulnerabilities), see SA-CORE-2012-001.
+
+Drupal 7.10, 2011-12-05
+----------------------
+- Fixed Content-Language HTTP header to not cause issues with Drush 5.x.
+- Reduce memory usage of theme registry (performance).
+- Fixed PECL upload progress bar for FileField
+- Fixed running update.php doesn't always clear the cache.
+- Fixed PDO exceptions on long titles.
+- Fixed Overlay redirect does not include query string.
+- Fixed D6 modules satisfy D7 module dependencies.
+- Fixed the ordering of module hooks when using module_implements_alter().
+- Fixed "floating" submit buttons during AJAX requests.
+- Fixed timezone selected on install not propogating to admin account.
+- Added msgctx context to JS translation functions, for feature parity with t().
+- Profiles' .install files now available during hook_install_tasks().
+- Added test coverage of 7.0 -> 7.x upgrade path.
+- Numerous notice fixes.
+- Numerous documentation improvements.
+- Additional automated test coverage.
+
+Drupal 7.9, 2011-10-26
+----------------------
+- Critical fixes to OpenID to spec violations that could allow for
+  impersonation in certain scenarios. Existing OpenID users should see
+  http://drupal.org/node/1120290#comment-5092796 for more information on
+  transitioning.
+- Fixed files getting lost when adding multiple files to multiple file fields
+  at the same time.
+- Improved usability of the clean URL test screens.
+- Restored height/width attributes on images run through the theme system.
+- Fixed usability bug with first password field being pre-filled by certain
+  browser plugins.
+- Fixed file_usage_list() so that it can return more than one result.
+- Fixed bug preventing preview of private images on node form.
+- Fixed PDO error when inserting an aggregator title longer than 255 characters.
+- Spelled out what TRADITIONAL means in MySQL sql_mode.
+- Deprecated "!=" operator for DBTNG; should be "<>".
+- Added two new API functions (menu_tree_set_path()/menu_tree_get_path()) were
+  added in order to enable setting the active menu trail for dynamically
+  generated menu paths.
+- Added new "fast 404" capability in settings.php to bypass Drupal bootstrap
+  when serving 404 pages for certain file types.
+- Added format_string() function which can perform string munging ala the t()
+  function without the overhead of the translation system.
+- Numerous #states system fixes.
+- Numerous EntityFieldQuery, DBTNG, and SQLite fixes.
+- Numerous Shortcut module fixes.
+- Numerous language system fixes.
+- Numerous token fixes.
+- Numerous CSS fixes.
+- Numerous upgrade path fixes.
+- Numerous minor string fixes.
+- Numerous notice fixes.
+
+Drupal 7.8, 2011-08-31
+----------------------
+- Fixed critical upgrade path issue with multilingual sites, leading to lost
+  content.
+- Numerous fixes to upgrade path, preventing fatal errors due to incorrect
+  dependencies.
+- Fixed issue with saving files on hosts with open_basedir restrictions.
+- Fixed Update manger error when used with Overlay.
+- Fixed RTL support in Seven administration theme and Overlay.
+- Fixes to nested transaction support.
+- Introduced performance pattern to reduce Drupal core's RAM usage.
+- Added support for HTML 5 tags to filter_xss_admin().
+- Added exception handling to cron.
+- Added new hook hook_field_widget_form_alter() for contribtued modules.
+- element_validate_*() functions now available to contrib.
+- Added new maintainers for several subsystems.
+- Numerous testing system improvements.
+- Numerous markup and CSS fixes.
+- Numerous poll module fixes.
+- Numerous notice/warning fixes.
+- Numerous documentation fixes.
+- Numerous token fixes.
+
+Drupal 7.7, 2011-07-27
+----------------------
+- Fixed VERSION string.
+
+Drupal 7.6, 2011-07-27
+----------------------
+- Fixed support for remote streamwrappers.
+- AJAX now binds to 'click' instead of 'mousedown'.
+- 'Translatable' flag on fields created in UI now defaults to FALSE, to match those created via the API.
+- Performance enhancement to permissions page on large numbers of permissions.
+- More secure password generation.
+- Fix for temporary directory on Windows servers.
+- run-tests.sh now uses proc_open() instead of pcntl_fork() for better Windows support.
+- Numerous upgrade path fixes.
+- Numerous documentation fixes.
+- Numerous notice fixes.
+- Numerous fixes to improve PHP 5.4 support.
+- Numerous RTL improvements.
+
+Drupal 7.5, 2011-07-27
+----------------------
+- Fixed security issue (Access bypass), see SA-CORE-2011-003.
+
+Drupal 7.4, 2011-06-29
+----------------------
+- Rolled back patch that caused fatal errors in CTools, Feeds, and other modules using the class registry.
+- Fixed critical bug with saving default images.
+- Fixed fatal errors when uninstalling some modules.
+- Added workaround for MySQL transaction support breaking on DDL statments.
+- Improved page caching with external caching systems.
+- Fix to Batch API, which was terminating too early.
+- Numerous upgrade path fixes.
+- Performance fixes.
+- Additional test coverage.
+- Numerous documentation fixes.
+
+Drupal 7.3, 2011-06-29
+----------------------
+- Fixed security issue (Access bypass), see SA-CORE-2011-002.
+
+Drupal 7.2, 2011-05-25
+----------------------
+- Added a default .gitignore file.
+- Improved PostgreSQL and SQLite support.
+- Numerous critical performance improvements.
+- Numerous critical fixes to the upgrade path.
+- Numerous fixes to language and translation systems.
+- Numerous fixes to AJAX and #states systems.
+- Improvements to the locking system.
+- Numerous documentation fixes.
+- Numerous styling and theme system fixes.
+- Numerous fixes for schema mis-matches between Drupal 6 and 7.
+- Minor internal API clean-ups.
+
+Drupal 7.1, 2011-05-25
+----------------------
+- Fixed security issues (Cross site scripting, File access bypass), see SA-CORE-2011-001.
+
+Drupal 7.0, 2011-01-05 
+----------------------
+- Database:
+    * Fully rewritten database layer utilizing PHP 5's PDO abstraction layer.
+    * Drupal now requires MySQL >= 5.0.15 or PostgreSQL >= 8.3.
+    * Added query builders for INSERT, UPDATE, DELETE, MERGE, and SELECT queries.
+    * Support for master/slave replication, transactions, multi-insert queries,
+      and other features.
+    * Added support for the SQLite database engine.
+    * Default to InnoDB engine, rather than MyISAM, on MySQL when available.
+      This offers increased scalability and data integrity.
+- Security:
+    * Protected cron.php -- cron will only run if the proper key is provided.
+    * Implemented a pluggable password system and much stronger password hashes
+      that are compatible with the Portable PHP password hashing framework.
+    * Rate limited login attempts to prevent brute-force password guessing, and
+      improved the flood control API to allow variable time windows and
+      identifiers for limiting user access to resources.
+    * Transformed the "Update status" module into the "Update manager" which
+      can securely install or update modules and themes via a web interface.
+- Usability:
+    * Added contextual links (a.k.a. local tasks) to page elements, such as
+      blocks, nodes, or comments, which allows to perform the most common tasks
+      with a single click only.
+    * Improved installer requirements check.
+    * Improved support for integration of WYSIWYG editors.
+    * Implemented drag-and-drop positioning for input format listings.
+    * Implemented drag-and-drop positioning for language listing.
+    * Implemented drag-and-drop positioning for poll options.
+    * Provided descriptions and human-readable names for user permissions.
+    * Removed comment controls for users.
+    * Removed display order settings for comment module. Comment display
+      order can now be customized using the Views module.
+    * Removed the 'related terms' feature from taxonomy module since this can
+      now be achieved with Field API.
+    * Added additional features to the default installation profile, and
+      implemented a "slimmed down" profile designed for developers.
+    * Added a built-in, automated cron run feature, which is triggered by site
+      visitors.
+    * Added an administrator role which is assigned all permissions for
+      installed modules automatically.
+    * Image toolkits are now provided by modules (rather than requiring a
+      manual file copy to the includes directory).
+    * Added an edit tab to taxonomy term pages.
+    * Redesigned password strength validator.
+    * Redesigned the add content type screen.
+    * Highlight duplicate URL aliases.
+    * Renamed "input formats" to "text formats".
+    * Moved text format permissions to the main permissions page.
+    * Added configurable ability for users to cancel their own accounts.
+    * Added "vertical tabs", a reusable interface component that features
+      automatic summaries and increases usability.
+    * Replaced fieldsets on node edit and add pages with vertical tabs.
+- Performance:
+    * Improved performance on uncached page views by loading multiple core
+      objects in a single database query.
+    * Improved performance for logged-in users by reducing queries for path
+      alias lookups.
+    * Improved support for HTTP proxies (including reverse proxies), allowing
+      anonymous page views to be served entirely from the proxy.
+- Documentation:
+    * Hook API documentation now included in Drupal core.
+- News aggregator:
+    * Added OPML import functionality for RSS feeds.
+    * Optionally, RSS feeds may be configured to not automatically generate feed blocks.
+- Search:
+    * Added support for language-aware searches.
+- Aggregator:
+    * Introduced architecture that allows pluggable parsers and processors for
+      syndicating RSS and Atom feeds.
+    * Added options to suspend updating specific feeds and never discard feeds
+      items.
+- Testing:
+    * Added test framework and tests.
+- Improved time zone support:
+    * Drupal now uses PHP's time zone database when rendering dates in local
+      time. Site-wide and user-configured time zone offsets have been converted
+      to time zone names, e.g. Africa/Abidjan.
+    * In some cases the upgrade and install scripts do not choose the preferred
+      site default time zone. The automatically-selected time zone can be
+      corrected at admin/config/regional/settings.
+    * If your site is being upgraded from Drupal 6 and you do not have the
+      contributed date or event modules installed, user time zone settings will
+      fallback to the system time zone and will have to be reconfigured by each user.
+    * User-configured time zones now serve as the default time zone for PHP
+      date/time functions.
+- Filter system:
+    * Revamped the filter API and text format storage.
+    * Added support for default text formats to be assigned on a per-role basis.
+    * Refactored the HTML corrector to take advantage of PHP 5 features.
+- User system:
+    * Added clean API functions for creating, loading, updating, and deleting
+      user roles and permissions.
+    * Refactored the "access rules" component of user module: The user module
+      now provides a simple interface for blocking single IP addresses. The
+      previous functionality in the user module for restricting certain e-mail
+      addresses and usernames is now available as a contributed module. Further,
+      IP address range blocking is no longer supported and should be implemented
+      at the operating system level.
+    * Removed per-user themes: Contributed modules with similar functionality
+      are available.
+- OpenID:
+    * Added support for Gmail and Google Apps for Domain identifiers. Users can
+      now login with their user@example.com identifier when example.com is powered
+      by Google.
+    * Made the OpenID module more pluggable.
+- Added code registry:
+    * Using the registry, modules declare their includable files via their .info file,
+      allowing Drupal to lazy-load classes and interfaces as needed.
+- Theme system:
+    * Removed the Bluemarine, Chameleon and Pushbutton themes. These themes live
+      on as contributed themes (http://drupal.org/project/bluemarine,
+      http://drupal.org/project/chameleon and http://drupal.org/project/pushbutton).
+    * Added Stark theme to make analyzing Drupal's default HTML and CSS easier.
+    * Added Seven as the default administration theme.
+    * Variable preprocessing of theme hooks prior to template rendering now goes
+      through two phases: a 'preprocess' phase and a new 'process' phase. See
+      http://api.drupal.org/api/function/theme/7 for details.
+    * Theme hooks implemented as functions (rather than as templates) can now
+      also have preprocess (and process) functions. See
+      http://api.drupal.org/api/function/theme/7 for details.
+    * Added Bartik as the default theme.
+- File handling:
+    * Files are now first class Drupal objects with file_load(), file_save(),
+      and file_validate() functions and corresponding hooks.
+    * The file_move(), file_copy() and file_delete() functions now operate on
+      file objects and invoke file hooks so that modules are notified and can
+      respond to changes.
+    * For the occasions when only basic file manipulation are needed--such as
+      uploading a site logo--that don't require the overhead of databases and
+      hooks, the current unmanaged copy, move and delete operations have been
+      preserved but renamed to file_unmanaged_*().
+    * Rewrote file handling to use PHP stream wrappers to enable support for
+      both public and private files and to support pluggable storage mechanisms
+      and access to remote resources (e.g. S3 storage or Flickr photos).
+    * The mime_extension_mapping variable has been removed. Modules that need to
+      alter the default MIME type extension mappings should implement
+      hook_file_mimetype_mapping_alter().
+    * Added the hook_file_url_alter() hook, which makes it possible to serve
+      files from a CDN.
+    * Added a field specifically for uploading files, previously provided by
+      the contributed module FileField.
+- Image handling:
+    * Improved image handling, including better support for add-on image
+      libraries.
+    * Added API and interface for creating advanced image thumbnails.
+    * Inclusion of additional effects such as rotate and desaturate.
+    * Added a field specifically for uploading images, previously provided by
+      the contributed module ImageField.
+- Added aliased multi-site support:
+    * Added support for mapping domain names to sites directories.
+- Added RDF support:
+    * Modules can declare RDF namespaces which are serialized in the <html> tag
+      for RDFa support.
+    * Modules can specify how their data structure maps to RDF.
+    * Added support for RDFa export of nodes, comments, terms, users, etc. and
+      their fields.
+- Search engine optimization and web linking:
+    * Added a rel="canonical" link on node and comment pages to prevent
+      duplicate content indexing by search engines.
+    * Added a default rel="shortlink" link on node and comment pages that
+      advertises a short link as an alternative URL to third-party services.
+    * Meta information is now alterable by all modules before rendering.
+- Field API:
+    * Custom data fields may be attached to nodes, users, comments and taxonomy
+      terms.
+    * Node bodies and teasers are now Field API fields instead of
+      being a hard-coded property of node objects.
+    * In addition, any other object type may register with Field API
+      and allow custom data fields to be attached to itself.
+    * Provides most of the features of the former Content Construction
+      Kit (CCK) module.
+    * Taxonomy terms are now Field API fields that can be added to any fieldable
+      object.
+- Installer:
+    * Refactored the installer into an API that allows Drupal to be installed
+      via a command line script.
+- Page organization
+    * Made the help text area a full featured region with blocks.
+    * Site mission is replaced with the highlighted content block region and
+      separate RSS feed description settings.
+    * The footer message setting was removed in favor of custom blocks.
+    * Made the main page content a block which can be moved and ordered
+      with other blocks in the same region.
+    * Blocks can now return structured arrays for later rendering just
+      like page callbacks.
+- Translation system
+    * The translation system now supports message context (msgctxt).
+    * Added support for translatable fields to Field API.
+- JavaScript changes
+    * Upgraded the core JavaScript library to jQuery version 1.4.4.
+    * Upgraded the jQuery Forms library to 2.52.
+    * Added jQuery UI 1.8.7, which allows improvements to Drupal's user
+      experience.
+- Better module version support
+    * Modules now can specify which version of another module they depend on.
+- Removed modules from core
+    * The following modules have been removed from core, because contributed
+      modules with similar functionality are available:
+      * Blog API module
+      * Ping module
+      * Throttle module
+- Improved node access control system.
+    * All modules may now influence the access to a node at runtime, not just
+      the module that defined a node.
+    * Users may now be allowed to bypass node access restrictions without giving
+      them complete access to the site.
+    * Access control affects both published and unpublished nodes.
+    * Numerous other improvements to the node access system.
+- Actions system
+    * Simplified definitions of actions and triggers.
+    * Removed dependency on the combination of hooks and operations. Triggers
+      now directly map to module hooks.
+- Task handling
+    * Added a queue API to process many or long-running tasks.
+    * Added queue API support to cron API.
+    * Added a locking framework to coordinate long-running operations across
+      requests.
+
+Drupal 6.23-dev, xxxx-xx-xx (development release)
+-----------------------
+
+Drupal 6.22, 2011-05-25
+-----------------------
+- Made Drupal 6 work better with IIS and Internet Explorer.
+- Fixed .po file imports to work better with custom textgroups.
+- Improved code documentation at various places.
+- Fixed a variety of other bugs.
+
+Drupal 6.21, 2011-05-25
+----------------------
+- Fixed security issues (Cross site scripting), see SA-CORE-2011-001.
+
+Drupal 6.20, 2010-12-15
+----------------------
+- Fixed a variety of small bugs, improved code documentation.
+
+Drupal 6.19, 2010-08-11
+----------------------
+- Fixed a variety of small bugs, improved code documentation.
+
+Drupal 6.18, 2010-08-11
+----------------------
+- Fixed security issues (OpenID authentication bypass, File download access
+  bypass, Comment unpublishing bypass, Actions cross site scripting),
+  see SA-CORE-2010-002.
+
+Drupal 6.17, 2010-06-02
+----------------------
+- Improved PostgreSQL compatibility
+- Better PHP 5.3 and PHP 4 compatibility
+- Better browser compatibility of CSS and JS aggregation
+- Improved logging for login failures
+- Fixed an incompatibility with some contributed modules and the locking system
+- Fixed a variety of other bugs.
+
+Drupal 6.16, 2010-03-03
+----------------------
+- Fixed security issues (Installation cross site scripting, Open redirection,
+  Locale module cross site scripting, Blocked user session regeneration),
+  see SA-CORE-2010-001.
+- Better support for updated jQuery versions.
+- Reduced resource usage of update.module.
+- Fixed several issues relating to support of installation profiles and
+  distributions.
+- Added a locking framework to avoid data corruption on long operations.
+- Fixed a variety of other bugs.
+
+Drupal 6.15, 2009-12-16
+----------------------
+- Fixed security issues (Cross site scripting), see SA-CORE-2009-009.
+- Fixed a variety of other bugs.
+
+Drupal 6.14, 2009-09-16
+----------------------
+- Fixed security issues (OpenID association cross site request forgeries,
+  OpenID impersonation and File upload), see SA-CORE-2009-008.
+- Changed the system modules page to not run all cache rebuilds; use the
+  button on the performance settings page to achieve the same effect.
+- Added support for PHP 5.3.0 out of the box.
+- Fixed a variety of small bugs.
+
+Drupal 6.13, 2009-07-01
+----------------------
+- Fixed security issues (Cross site scripting, Input format access bypass and
+  Password leakage in URL), see SA-CORE-2009-007.
+- Fixed a variety of small bugs.
+
+Drupal 6.12, 2009-05-13
+----------------------
+- Fixed security issues (Cross site scripting), see SA-CORE-2009-006.
+- Fixed a variety of small bugs.
+
+Drupal 6.11, 2009-04-29
+----------------------
+- Fixed security issues (Cross site scripting and limited information
+  disclosure), see SA-CORE-2009-005
+- Fixed performance issues with the menu router cache, the update
+  status cache and improved cache invalidation
+- Fixed a variety of small bugs.
+
+Drupal 6.10, 2009-02-25
+----------------------
+- Fixed a security issue, (Local file inclusion on Windows),
+  see SA-CORE-2009-003
+- Fixed node_feed() so custom fields can show up in RSS feeds.
+- Improved PostgreSQL compatibility.
+- Fixed a variety of small bugs.
+
+Drupal 6.9, 2009-01-14
+----------------------
+- Fixed security issues, (Access Bypass, Validation Bypass and Hardening
+  against SQL injection), see SA-CORE-2009-001
+- Made HTTP request checking more robust and informative.
+- Fixed HTTP_HOST checking to work again with HTTP 1.0 clients and
+  basic shell scripts.
+- Removed t() calls from all schema documentation. Suggested best practice
+  changed for contributed modules, see http://drupal.org/node/322731.
+- Fixed a variety of small bugs.
+
+Drupal 6.8, 2008-12-11
+----------------------
+- Removed a previous change incompatible with PHP 5.1.x and lower.
+
+Drupal 6.7, 2008-12-10
+----------------------
+- Fixed security issues, (Cross site request forgery and Cross site scripting), see SA-2008-073
+- Updated robots.txt and .htaccess to match current file use.
+- Fixed a variety of small bugs.
+
+Drupal 6.6, 2008-10-22
+----------------------
+- Fixed security issues, (File inclusion, Cross site scripting), see SA-2008-067
+- Fixed a variety of small bugs.
+
+Drupal 6.5, 2008-10-08
+----------------------
+- Fixed security issues, (File upload access bypass, Access rules bypass,
+  BlogAPI access bypass), see SA-2008-060.
+- Fixed a variety of small bugs.
+
+Drupal 6.4, 2008-08-13
+----------------------
+- Fixed a security issue (Cross site scripting, Arbitrary file uploads via
+  BlogAPI, Cross site request forgeries and Various Upload module
+  vulnerabilities), see SA-2008-047.
+- Improved error messages during installation.
+- Fixed a bug that prevented AHAH handlers to be attached to radios widgets.
+- Fixed a variety of small bugs.
+
+Drupal 6.3, 2008-07-09
+----------------------
+- Fixed security issues, (Cross site scripting, cross site request forgery,
+  session fixation and SQL injection), see SA-2008-044.
+- Slightly modified installation process to prevent file ownership issues on
+  shared hosts.
+- Improved PostgreSQL compatibility (rewritten queries; custom blocks).
+- Upgraded to jQuery 1.2.6.
+- Performance improvements to search, menu handling and form API caches.
+- Fixed Views compatibility issues (Views for Drupal 6 requires Drupal 6.3+).
+- Fixed a variety of small bugs.
+
+Drupal 6.2, 2008-04-09
+----------------------
+- Fixed a variety of small bugs.
+- Fixed a security issue (Access bypasses), see SA-2008-026.
+
+Drupal 6.1, 2008-02-27
+----------------------
+- Fixed a variety of small bugs.
+- Fixed a security issue (Cross site scripting), see SA-2008-018.
+
+Drupal 6.0, 2008-02-13
+----------------------
+- New, faster and better menu system.
+- New watchdog as a hook functionality.
+   * New hook_watchdog that can be implemented by any module to route log
+     messages to various destinations.
+   * Expands the severity levels from 3 (Error, Warning, Notice) to the 8
+     levels defined in RFC 3164.
+   * The watchdog module is now called dblog, and is optional, but enabled by
+     default in the default installation profile.
+   * Extended the database log module so log messages can be filtered.
+   * Added syslog module: useful for monitoring large Drupal installations.
+- Added optional e-mail notifications when users are approved, blocked, or
+  deleted.
+- Drupal works with error reporting set to E_ALL.
+- Added scripts/drupal.sh to execute Drupal code from the command line. Useful
+  to use Drupal as a framework to build command-line tools.
+- Made signature support optional and made it possible to theme signatures.
+- Made it possible to filter the URL aliases on the URL alias administration
+  screen.
+- Language system improvements:
+    * Support for right to left languages.
+    * Language detection based on parts of the URL.
+    * Browser based language detection.
+    * Made it possible to specify a node's language.
+    * Support for translating posts on the site to different languages.
+    * Language dependent path aliases.
+    * Automatically import translations when adding a new language.
+    * JavaScript interface translation.
+    * Automatically import a module's translation upon enabling that module.
+- Moved "PHP input filter" to a standalone module so it can be deleted for
+  security reasons.
+- Usability:
+    * Improved handling of teasers in posts.
+    * Added sticky table headers.
+    * Check for clean URL support automatically with JavaScript.
+    * Removed default/settings.php. Instead the installer will create it from
+      default.settings.php.
+    * Made it possible to configure your own date formats.
+    * Remember anonymous comment posters.
+    * Only allow modules and themes to be enabled that have explicitly been
+      ported to the correct core API version.
+    * Can now specify the minimum PHP version required for a module within the
+      .info file.
+    * Drupal core no longer requires CREATE TEMPORARY TABLES or LOCK TABLES
+      database rights.
+    * Dynamically check password strength and confirmation.
+    * Refactored poll administration.
+    * Implemented drag-and-drop positioning for blocks, menu items, taxonomy
+      vocabularies and terms, forums, profile fields, and input format filters.
+- Theme system:
+    * Added .info files to themes and made it easier to specify regions and
+      features.
+    * Added theme registry: modules can directly provide .tpl.php files for
+      their themes without having to create theme_ functions.
+    * Used the Garland theme for the installation and maintenance pages.
+    * Added theme preprocess functions for themes that are templates.
+    * Added support for themeable functions in JavaScript.
+- Refactored update.php to a generic batch API to be able to run time-consuming
+  operations in multiple subsequent HTTP requests.
+- Installer:
+    * Themed the installer with the Garland theme.
+    * Added form to provide initial site information during installation.
+    * Added ability to provide extra installation steps programmatically.
+    * Made it possible to import interface translations during installation.
+- Added the HTML corrector filter:
+    * Fixes faulty and chopped off HTML in postings.
+    * Tags are now automatically closed at the end of the teaser.
+- Performance:
+    * Made it easier to conditionally load .include files and split up many core
+      modules.
+    * Added a JavaScript aggregator.
+    * Added block-level caching, improving performance for both authenticated
+      and anonymous users.
+    * Made Drupal work correctly when running behind a reverse proxy like
+      Squid or Pound.
+- File handling improvements:
+    * Entries in the files table are now keyed to a user instead of a node.
+    * Added reusable validation functions to check for uploaded file sizes,
+      extensions, and image resolution.
+    * Added ability to create and remove temporary files during a cron job.
+- Forum improvements:
+    * Any node type may now be posted in a forum.
+- Taxonomy improvements:
+    * Descriptions for terms are now shown on taxonomy/term pages as well
+      as RSS feeds.
+    * Added versioning support to categories by associating them with node
+      revisions.
+- Added support for OpenID.
+- Added support for triggering configurable actions.
+- Added the Update status module to automatically check for available updates
+  and warn sites if they are missing security updates or newer versions.
+  Sites deploying from CVS should use http://drupal.org/project/cvs_deploy.
+  Advanced settings provided by http://drupal.org/project/update_advanced.
+- Upgraded the core JavaScript library to jQuery version 1.2.3.
+- Added a new Schema API, which provides built-in support for core and
+  contributed modules to work with databases other than MySQL.
+- Removed drupal.module. The functionality lives on as the Site network
+  contributed module (http://drupal.org/project/site_network).
+- Removed old system updates. Updates from Drupal versions prior to 5.x will
+  require upgrading to 5.x before upgrading to 6.x.
+
+Drupal 5.23, 2010-08-11
+-----------------------
+- Fixed security issues (File download access bypass, Comment unpublishing
+  bypass), see SA-CORE-2010-002.
+
+Drupal 5.22, 2010-03-03
+-----------------------
+- Fixed security issues (Open redirection, Locale module cross site scripting,
+  Blocked user session regeneration), see SA-CORE-2010-001.
+
+Drupal 5.21, 2009-12-16
+-----------------------
+- Fixed a security issue (Cross site scripting), see SA-CORE-2009-009.
+- Fixed a variety of small bugs.
+
+Drupal 5.20, 2009-09-16
+-----------------------
+- Avoid security problems resulting from writing Drupal 6-style menu
+  declarations.
+- Fixed security issues (session fixation), see SA-CORE-2009-008.
+- Fixed a variety of small bugs.
+
+Drupal 5.19, 2009-07-01
+-----------------------
+- Fixed security issues (Cross site scripting and Password leakage in URL), see
+  SA-CORE-2009-007.          
+- Fixed a variety of small bugs.
+
+Drupal 5.18, 2009-05-13
+-----------------------
+- Fixed security issues (Cross site scripting), see SA-CORE-2009-006.
+- Fixed a variety of small bugs.
+
+Drupal 5.17, 2009-04-29
+-----------------------
+- Fixed security issues (Cross site scripting and limited information
+  disclosure) see SA-CORE-2009-005.
+- Fixed a variety of small bugs.
+
+Drupal 5.16, 2009-02-25
+-----------------------
+- Fixed a security issue, (Local file inclusion on Windows), see SA-CORE-2009-004.
+- Fixed a variety of small bugs.
+
+Drupal 5.15, 2009-01-14
+-----------------------
+- Fixed security issues, (Hardening against SQL injection), see
+  SA-CORE-2009-001
+- Fixed HTTP_HOST checking to work again with HTTP 1.0 clients and basic shell
+  scripts.
+- Fixed a variety of small bugs.
+
+Drupal 5.14, 2008-12-11
+-----------------------
+- removed a previous change incompatible with PHP 5.1.x and lower.
+
+Drupal 5.13, 2008-12-10
+-----------------------
+- fixed a variety of small bugs.
+- fixed security issues, (Cross site request forgery and Cross site scripting), see SA-2008-073
+- updated robots.txt and .htaccess to match current file use.
+
+Drupal 5.12, 2008-10-22
+-----------------------
+- fixed security issues, (File inclusion), see SA-2008-067
+
+Drupal 5.11, 2008-10-08
+-----------------------
+- fixed a variety of small bugs.
+- fixed security issues, (File upload access bypass, Access rules bypass,
+  BlogAPI access bypass, Node validation bypass), see SA-2008-060
+
+Drupal 5.10, 2008-08-13
+-----------------------
+- fixed a variety of small bugs.
+- fixed security issues, (Cross site scripting, Arbitrary file uploads via
+  BlogAPI and Cross site request forgery), see SA-2008-047
+
+Drupal 5.9, 2008-07-23
+----------------------
+- fixed a variety of small bugs.
+- fixed security issues, (Session fixation), see SA-2008-046
+
+Drupal 5.8, 2008-07-09
+----------------------
+- fixed a variety of small bugs.
+- fixed security issues, (Cross site scripting, cross site request forgery, and
+  session fixation), see SA-2008-044
+
+Drupal 5.7, 2008-01-28
+----------------------
+- fixed the input format configuration page.
+- fixed a variety of small bugs.
+
+Drupal 5.6, 2008-01-10
+----------------------
+- fixed a variety of small bugs.
+- fixed a security issue (Cross site request forgery), see SA-2008-005
+- fixed a security issue (Cross site scripting, UTF8), see SA-2008-006
+- fixed a security issue (Cross site scripting, register_globals), see SA-2008-007
+
+Drupal 5.5, 2007-12-06
+----------------------
+- fixed missing missing brackets in a query in the user module.
+- fixed taxonomy feed bug introduced by SA-2007-031
+
+Drupal 5.4, 2007-12-05
+----------------------
+- fixed a variety of small bugs.
+- fixed a security issue (SQL injection), see SA-2007-031
+
+Drupal 5.3, 2007-10-17
+----------------------
+- fixed a variety of small bugs.
+- fixed a security issue (HTTP response splitting), see SA-2007-024
+- fixed a security issue (Arbitrary code execution via installer), see SA-2007-025
+- fixed a security issue (Cross site scripting via uploads), see SA-2007-026
+- fixed a security issue (User deletion cross site request forgery), see SA-2007-029
+- fixed a security issue (API handling of unpublished comment), see SA-2007-030
+
+Drupal 5.2, 2007-07-26
+----------------------
+- changed hook_link() $teaser argument to match documentation.
+- fixed a variety of small bugs.
+- fixed a security issue (cross-site request forgery), see SA-2007-017
+- fixed a security issue (cross-site scripting), see SA-2007-018
+
+Drupal 5.1, 2007-01-29
+----------------------
+- fixed security issue (code execution), see SA-2007-005
+- fixed a variety of small bugs.
+
+Drupal 5.0, 2007-01-15
+----------------------
+- Completely retooled the administration page
+    * /Admin now contains an administration page which may be themed
+    * Reorganised administration menu items by task and by module
+    * Added a status report page with detailed PHP/MySQL/Drupal information
+- Added web-based installer which can:
+    * Check installation and run-time requirements
+    * Automatically generate the database configuration file
+    * Install pre-made installation profiles or distributions
+    * Import the database structure with automatic table prefixing
+    * Be localized
+- Added new default Garland theme
+- Added color module to change some themes' color schemes
+- Included the jQuery JavaScript library 1.0.4 and converted all core JavaScript to use it
+- Introduced the ability to alter mail sent from system
+- Module system:
+    * Added .info files for module meta-data
+    * Added support for module dependencies
+    * Improved module installation screen
+    * Moved core modules to their own directories
+    * Added support for module uninstalling
+- Added support for different cache backends
+- Added support for a generic "sites/all" directory.
+- Usability:
+    * Added support for auto-complete forms (AJAX) to user profiles.
+    * Made it possible to instantly assign roles to newly created user accounts.
+    * Improved configurability of the contact forms.
+    * Reorganized the settings pages.
+    * Made it easy to investigate popular search terms.
+    * Added a 'select all' checkbox and a range select feature to administration tables.
+    * Simplified the 'break' tag to split teasers from body.
+    * Use proper capitalization for titles, menu items and operations.
+- Integrated urlfilter.module into filter.module
+- Block system:
+    * Extended the block visibility settings with a role specific setting.
+    * Made it possible to customize all block titles.
+- Poll module:
+    * Optionally allow people to inspect all votes.
+    * Optionally allow people to cancel their vote.
+- Distributed authentication:
+    * Added default server option.
+- Added default robots.txt to control crawlers.
+- Database API:
+    * Added db_table_exists().
+- Blogapi module:
+    * 'Blogapi new' and 'blogapi edit' nodeapi operations.
+- User module:
+    * Added hook_profile_alter().
+    * E-mail verification is made optional.
+    * Added mass editing and filtering on admin/user/user.
+- PHP Template engine:
+    * Add the ability to look for a series of suggested templates.
+    * Look for page templates based upon the path.
+    * Look for block templates based upon the region, module, and delta.
+- Content system:
+    * Made it easier for node access modules to work well with each other.
+    * Added configurable content types.
+    * Changed node rendering to work with structured arrays.
+- Performance:
+    * Improved session handling: reduces database overhead.
+    * Improved access checking: reduces database overhead.
+    * Made it possible to do memcached based session management.
+    * Omit sidebars when serving a '404 - Page not found': saves CPU cycles and bandwidth.
+    * Added an 'aggressive' caching policy.
+    * Added a CSS aggregator and compressor (up to 40% faster page loads).
+- Removed the archive module.
+- Upgrade system:
+    * Created space for update branches.
+- Form API:
+    * Made it possible to programmatically submit forms.
+    * Improved api for multistep forms.
+- Theme system:
+    * Split up and removed drupal.css.
+    * Added nested lists generation.
+    * Added a self-clearing block class.
+
+Drupal 4.7.11, 2008-01-10
+-------------------------
+- fixed a security issue (Cross site request forgery), see SA-2008-005
+- fixed a security issue (Cross site scripting, UTF8), see SA-2008-006
+- fixed a security issue (Cross site scripting, register_globals), see SA-2008-007
+
+Drupal 4.7.10, 2007-12-06
+-------------------------
+- fixed taxonomy feed bug introduced by SA-2007-031
+
+Drupal 4.7.9, 2007-12-05
+------------------------
+- fixed a security issue (SQL injection), see SA-2007-031
+
+Drupal 4.7.8, 2007-10-17
+----------------------
+- fixed a security issue (HTTP response splitting), see SA-2007-024
+- fixed a security issue (Cross site scripting via uploads), see SA-2007-026
+- fixed a security issue (API handling of unpublished comment), see SA-2007-030
+
+Drupal 4.7.7, 2007-07-26
+------------------------
+- fixed security issue (XSS), see SA-2007-018
+
+Drupal 4.7.6, 2007-01-29
+------------------------
+- fixed security issue (code execution), see SA-2007-005
+
+Drupal 4.7.5, 2007-01-05
+------------------------
+- Fixed security issue (XSS), see SA-2007-001
+- Fixed security issue (DoS), see SA-2007-002
+
+Drupal 4.7.4, 2006-10-18
+------------------------
+- Fixed security issue (XSS), see SA-2006-024
+- Fixed security issue (CSRF), see SA-2006-025
+- Fixed security issue (Form action attribute injection), see SA-2006-026
+
+Drupal 4.7.3, 2006-08-02
+------------------------
+- Fixed security issue (XSS), see SA-2006-011
+
+Drupal 4.7.2, 2006-06-01
+------------------------
+- Fixed critical upload issue, see SA-2006-007
+- Fixed taxonomy XSS issue, see SA-2006-008
+- Fixed a variety of small bugs.
+
+Drupal 4.7.1, 2006-05-24
+------------------------
+- Fixed critical SQL issue, see SA-2006-005
+- Fixed a serious upgrade related bug.
+- Fixed a variety of small bugs.
+
+Drupal 4.7.0, 2006-05-01
+------------------------
+- Added free tagging support.
+- Added a site-wide contact form.
+- Theme system:
+    * Added the PHPTemplate theme engine and removed the Xtemplate engine.
+    * Converted the bluemarine theme from XTemplate to PHPTemplate.
+    * Converted the pushbutton theme from XTemplate to PHPTemplate.
+- Usability:
+    * Reworked the 'request new password' functionality.
+    * Reworked the node and comment edit forms.
+    * Made it easy to add nodes to the navigation menu.
+    * Added site 'offline for maintenance' feature.
+    * Added support for auto-complete forms (AJAX).
+    * Added support for collapsible page sections (JS).
+    * Added support for resizable text fields (JS).
+    * Improved file upload functionality (AJAX).
+    * Reorganized some settings pages.
+    * Added friendly database error screens.
+    * Improved styling of update.php.
+- Refactored the forms API.
+    * Made it possible to alter, extend or theme forms.
+- Comment system:
+    * Added support for "mass comment operations" to ease repetitive tasks.
+    * Comment moderation has been removed.
+- Node system:
+    * Reworked the revision functionality.
+    * Removed the bookmarklet code. Third-party modules can now handle
+      This.
+- Upgrade system:
+    * Allows contributed modules to plug into the upgrade system.
+- Profiles:
+    * Added a block to display author information along with posts.
+    * Added support for private profile fields.
+- Statistics module:
+    * Added the ability to track page generation times.
+    * Made it possible to block certain IPs/hostnames.
+- Block system:
+    * Added support for theme-specific block regions.
+- Syndication:
+    * Made the aggregator module parse Atom feeds.
+    * Made the aggregator generate RSS feeds.
+    * Added RSS feed settings.
+- XML-RPC:
+    * Replaced the XML-RPC library by a better one.
+- Performance:
+    * Added 'loose caching' option for high-traffic sites.
+    * Improved performance of path aliasing.
+    * Added the ability to track page generation times.
+- Internationalization:
+    * Improved Unicode string handling API.
+    * Added support for PHP's multibyte string module.
+- Added support for PHP5's 'mysqli' extension.
+- Search module:
+    * Made indexer smarter and more robust.
+    * Added advanced search operators (e.g. phrase, node type, ...).
+    * Added customizable result ranking.
+- PostgreSQL support:
+    * Removed dependency on PL/pgSQL procedural language.
+- Menu system:
+    * Added support for external URLs.
+- Queue module:
+    * Removed from core.
+- HTTP handling:
+    * Added support for a tolerant Base URL.
+    * Output URIs relative to the root, without a base tag.
+
+Drupal 4.6.11, 2007-01-05
+-------------------------
+- Fixed security issue (XSS), see SA-2007-001
+- Fixed security issue (DoS), see SA-2007-002
+
+Drupal 4.6.10, 2006-10-18
+------------------------
+- Fixed security issue (XSS), see SA-2006-024
+- Fixed security issue (CSRF), see SA-2006-025
+- Fixed security issue (Form action attribute injection), see SA-2006-026
+
+Drupal 4.6.9, 2006-08-02
+------------------------
+- Fixed security issue (XSS), see SA-2006-011
+
+Drupal 4.6.8, 2006-06-01
+------------------------
+- Fixed critical upload issue, see SA-2006-007
+- Fixed taxonomy XSS issue, see SA-2006-008
+
+Drupal 4.6.7, 2006-05-24
+------------------------
+- Fixed critical SQL issue, see SA-2006-005
+
+Drupal 4.6.6, 2006-03-13
+------------------------
+- Fixed bugs, including 4 security vulnerabilities.
+
+Drupal 4.6.5, 2005-12-12
+------------------------
+- Fixed bugs: no critical bugs were identified.
+
+Drupal 4.6.4, 2005-11-30
+------------------------
+- Fixed bugs, including 3 security vulnerabilities.
+
+Drupal 4.6.3, 2005-08-15
+------------------------
+- Fixed bugs, including a critical "arbitrary PHP code execution" bug.
+
+Drupal 4.6.2, 2005-06-29
+------------------------
+- Fixed bugs, including two critical "arbitrary PHP code execution" bugs.
+
+Drupal 4.6.1, 2005-06-01
+------------------------
+- Fixed bugs, including a critical input validation bug.
+
+Drupal 4.6.0, 2005-04-15
+------------------------
+- PHP5 compliance
+- Search:
+    * Added UTF-8 support to make it work with all languages.
+    * Improved search indexing algorithm.
+    * Improved search output.
+    * Impose a throttle on indexing of large sites.
+    * Added search block.
+- Syndication:
+    * Made the ping module ping pingomatic.com which, in turn, will ping all the major ping services.
+    * Made Drupal generate RSS 2.0 feeds.
+    * Made RSS feeds extensible.
+    * Added categories to RSS feeds.
+    * Added enclosures to RSS feeds.
+- Flood control mechanism:
+    * Added a mechanism to throttle certain operations.
+- Usability:
+    * Refactored the block configuration pages.
+    * Refactored the statistics pages.
+    * Refactored the watchdog pages.
+    * Refactored the throttle module configuration.
+    * Refactored the access rules page.
+    * Refactored the content administration page.
+    * Introduced forum configuration pages.
+    * Added a 'add child page' link to book pages.
+- Contact module:
+    * Added a simple contact module that allows users to contact each other using e-mail.
+- Multi-site configuration:
+    * Made it possible to run multiple sites from a single code base.
+- Added an image API: enables better image handling.
+- Block system:
+    * Extended the block visibility settings.
+- Theme system:
+    * Added new theme functions.
+- Database backend:
+    * The PEAR database backend is no longer supported.
+- Performance:
+    * Improved performance of the forum topics block.
+    * Improved performance of the tracker module.
+    * Improved performance of the node pages.
+- Documentation:
+    * Improved and extended PHPDoc/Doxygen comments.
+
+Drupal 4.5.8, 2006-03-13
+------------------------
+- Fixed bugs, including 3 security vulnerabilities.
+
+Drupal 4.5.7, 2005-12-12
+------------------------
+- Fixed bugs: no critical bugs were identified.
+
+Drupal 4.5.6, 2005-11-30
+------------------------
+- Fixed bugs, including 3 security vulnerabilities.
+
+Drupal 4.5.5, 2005-08-15
+------------------------
+- Fixed bugs, including a critical "arbitrary PHP code execution" bug.
+
+Drupal 4.5.4, 2005-06-29
+------------------------
+- Fixed bugs, including two critical "arbitrary PHP code execution" bugs.
+
+Drupal 4.5.3, 2005-06-01
+------------------------
+- Fixed bugs, including a critical input validation bug.
+
+Drupal 4.5.2, 2005-01-15
+------------------------
+- Fixed bugs: a cross-site scripting (XSS) vulnerability has been fixed.
+
+Drupal 4.5.1, 2004-12-01
+------------------------
+- Fixed bugs: no critical bugs were identified.
+
+Drupal 4.5.0, 2004-10-18
+------------------------
+- Navigation:
+    * Made it possible to add, delete, rename and move menu items.
+    * Introduced tabs and subtabs for local tasks.
+    * Reorganized the navigation menus.
+- User management:
+    * Added support for multiple roles per user.
+    * Made it possible to add custom profile fields.
+    * Made it possible to browse user profiles by field.
+- Node system:
+    * Added support for node-level permissions.
+- Comment module:
+    * Made it possible to leave contact information without having to register.
+- Upload module:
+    * Added support for uploading documents (includes images).
+- Forum module:
+    * Added support for sticky forum topics.
+    * Made it possible to track forum topics.
+- Syndication:
+    * Added support for RSS ping-notifications of http://technorati.com/.
+    * Refactored the categorization of syndicated news items.
+    * Added an URL alias for 'rss.xml'.
+    * Improved date parsing.
+- Database backend:
+    * Added support for multiple database connections.
+    * The PostgreSQL backend does no longer require PEAR.
+- Theme system:
+    * Changed all GIFs to PNGs.
+    * Reorganised the handling of themes, template engines, templates and styles.
+    * Unified and extended the available theme settings.
+    * Added theme screenshots.
+- Blocks:
+    * Added 'recent comments' block.
+    * Added 'categories' block.
+- Blogger API:
+    * Added support for auto-discovery of blogger API via RSD.
+- Performance:
+    * Added support for sending gzip compressed pages.
+    * Improved performance of the forum module.
+- Accessibility:
+    * Improved the accessibility of the archive module's calendar.
+    * Improved form handling and error reporting.
+    * Added HTTP redirects to prevent submitting twice when refreshing right after a form submission.
+- Refactored 403 (forbidden) handling and added support for custom 403 pages.
+- Documentation:
+    * Added PHPDoc/Doxygen comments.
+- Filter system:
+    * Added support for using multiple input formats on the site
+    * Expanded the embedded PHP-code feature so it can be used everywhere
+    * Added support for role-dependent filtering, through input formats
+- UI translation:
+    * Managing translations is now completely done through the administration interface
+    * Added support for importing/exporting gettext .po files
+
+Drupal 4.4.3, 2005-06-01
+------------------------
+- Fixed bugs, including a critical input validation bug.
+
+Drupal 4.4.2, 2004-07-04
+------------------------
+- Fixed bugs: no critical bugs were identified.
+
+Drupal 4.4.1, 2004-05-01
+------------------------
+- Fixed bugs: no critical bugs were identified.
+
+Drupal 4.4.0, 2004-04-01
+------------------------
+- Added support for the MetaWeblog API and MovableType extensions.
+- Added a file API: enables better document management.
+- Improved the watchdog and search module to log search keys.
+- News aggregator:
+    * Added support for conditional GET.
+    * Added OPML feed subscription list.
+    * Added support for <image>, <pubDate>, <dc:date>, <dcterms:created>, <dcterms:issued> and <dcterms:modified>.
+- Comment module:
+    * Made it possible to disable the "comment viewing controls".
+- Performance:
+    * Improved module loading when serving cached pages.
+    * Made it possible to automatically disable modules when under heavy load.
+    * Made it possible to automatically disable blocks when under heavy load.
+    * Improved performance and memory footprint of the locale module.
+- Theme system:
+    * Made all theme functions start with 'theme_'.
+    * Made all theme functions return their output.
+    * Migrated away from using the BaseTheme class.
+    * Added many new theme functions and refactored existing theme functions.
+    * Added avatar support to 'Xtemplate'.
+    * Replaced theme 'UnConeD' by 'Chameleon'.
+    * Replaced theme 'Marvin' by 'Pushbutton'.
+- Usability:
+    * Added breadcrumb navigation to all pages.
+    * Made it possible to add context-sensitive help to all pages.
+    * Replaced drop-down menus by radio buttons where appropriate.
+    * Removed the 'magic_quotes_gpc = 0' requirement.
+    * Added a 'book navigation' block.
+- Accessibility:
+    * Made themes degrade gracefully in absence of CSS.
+    * Grouped form elements using '<fieldset>' and '<legend>' tags.
+    * Added '<label>' tags to form elements.
+- Refactored 404 (file not found) handling and added support for custom 404 pages.
+- Improved the filter system to prevent conflicts between filters:
+    * Made it possible to change the order in which filters are applied.
+- Documentation:
+    * Added PHPDoc/Doxygen comments.
+
+Drupal 4.3.2, 2004-01-01
+------------------------
+- Fixed bugs: no critical bugs were identified.
+
+Drupal 4.3.1, 2003-12-01
+------------------------
+- Fixed bugs: no critical bugs were identified.
+
+Drupal 4.3.0, 2003-11-01
+------------------------
+- Added support for configurable URLs.
+- Added support for sortable table columns.
+- Database backend:
+    * Added support for selective database table prefixing.
+- Performance:
+    * Optimized many SQL queries for speed by converting left joins to inner joins.
+- Comment module:
+    * Rewrote the comment housekeeping code to be much more efficient and scalable.
+    * Changed the comment module to use the standard pager.
+- User module:
+    * Added support for multiple sessions per user.
+    * Added support for anonymous user sessions.
+- Forum module:
+    * Improved the forum views and the themability thereof.
+- Book module:
+    * Improved integration of non-book nodes in the book outline.
+- Usability:
+    * Added support for "mass node operations" to ease repetitive tasks.
+    * Added support for breadcrumb navigation to several modules' user pages.
+    * Integrated the administration pages with the normal user pages.
+
+Drupal 4.2.0, 2003-08-01
+------------------------
+- Added support for clean URLs.
+- Added textarea hook and support for onload attributes: enables integration of WYSIWYG editors.
+- Rewrote the RSS/RDF parser:
+    * It will now use PHP's built-in XML parser to parse news feeds.
+- Rewrote the administration pages:
+    * Improved the navigational elements and added breadcrumb navigation.
+    * Improved the look and feel.
+    * Added context-sensitive help.
+- Database backend:
+    * Fixed numerous SQL queries to make Drupal ANSI compliant.
+    * Added MSSQL database scheme.
+- Search module:
+    * Changed the search module to use implicit AND'ing instead of implicit OR'ing.
+- Node system:
+    * Replaced the "post content" permission by more fine-grained permissions.
+    * Improved content submission:
+        + Improved teasers: teasers are now optional, teaser length can be configured, teaser and body are edited in a single textarea, users will no longer be bothered with teasers when the post is too short for one.
+        + Added the ability to preview both the short and the full version of your posts.
+    * Extended the node API which allows for better integration.
+    * Added default node settings to control the behavior for promotion, moderation and other options.
+- Themes:
+    * Replaced theme "Goofy" by "Xtemplate", a template driven theme.
+- Removed the 'register_globals = on' requirement.
+- Added better installation instructions.
+
+Drupal 4.1.0, 2003-02-01
+------------------------
+- Collaboratively revised and expanded the Drupal documentation.
+- Rewrote comment.module:
+    * Reintroduced comment rating/moderation.
+    * Added support for comment paging.
+    * Performance improvements: improved comment caching, faster SQL queries, etc.
+- Rewrote block.module:
+    * Performance improvements: blocks are no longer rendered when not displayed.
+- Rewrote forum.module:
+    * Added a lot of features one can find in stand-alone forum software including but not limited to support for topic paging, added support for icons, rewrote the statistics module, etc.
+- Rewrote statistics.module:
+    * Collects access counts for each node, referrer logs, number of users/guests.
+    * Export blocks displaying top viewed nodes over last 24 hour period, top viewed nodes over all time, last nodes viewed, how many users/guest online.
+- Added throttle.module:
+    * Auto-throttle congestion control mechanism: Drupal can adapt itself based on the server load.
+- Added profile.module:
+    * Enables to extend the user and registration page.
+- Added pager support to the main page.
+- Replaced weblogs.module by ping.module:
+    * Added support for normal and RSS notifications of http://blo.gs/.
+    * Added support for RSS ping-notifications of http://weblogs.com/.
+- Removed the rating module
+- Themes:
+    * Removed a significant portion of hard-coded mark-up.
+
+Drupal 4.0.0, 2002-06-15
+------------------------
+- Added tracker.module:
+    * Replaces the previous "your [site]" links (recent comments and nodes).
+- Added weblogs.module:
+    * This will ping weblogs.com when new content is promoted.
+- Added taxonomy module which replaces the meta module.
+    * Supports relations, hierarchies and synonyms.
+- Added a caching system:
+    * Speeds up pages for anonymous users and reduces system load.
+- Added support for external SMTP libraries.
+- Added an archive extension to the calendar.
+- Added support for the Blogger API.
+- Themes:
+    * Cleaned up the theme system.
+    * Moved themes that are not maintained to contributions CVS repository.
+- Database backend:
+    * Changed to PEAR database abstraction layer.
+    * Using ANSI SQL queries to be more portable.
+- Rewrote the user system:
+    * Added support for Drupal authentication through XML-RPC and through a Jabber server.
+    * Added support for modules to add more user data.
+    * Users may delete their own account.
+    * Added who's new and who's online blocks.
+- Changed block system:
+    * Various hard coded blocks are now dynamic.
+    * Blocks can now be enabled and/or be set by the user.
+    * Blocks can be set to only show up on some pages.
+    * Merged box module with block module.
+- Node system:
+    * Blogs can be updated.
+    * Teasers (abstracts) on all node types.
+    * Improved error checking.
+    * Content versioning support.
+    * Usability improvements.
+- Improved book module to support text, HTML and PHP pages.
+- Improved comment module to mark new comments.
+- Added a general outliner which will let any node type be linked to a book.
+- Added an update script that lets you upgrade from previous releases or on a day to day basis when using the development tree.
+- Search module:
+    * Improved the search system by making it context sensitive.
+    * Added indexing.
+- Various updates:
+    * Changed output to valid XHTML.
+    * Improved multiple sites using the same Drupal database support.
+    * Added support for session IDs in URLs instead of cookies.
+    * Made the type of content on the front page configurable.
+    * Made each cloud site have its own settings.
+    * Modules and themes can now be enabled/disabled using the administration pages.
+    * Added URL abstraction for links.
+    * Usability changes (renamed links, better UI, etc).
+- Collaboratively revised and expanded the Drupal documentation.
+
+Drupal 3.0.1, 2001-10-15
+------------------------
+- Various updates:
+    * Added missing translations
+    * Updated the themes: tidied up some HTML code and added new Drupal logos.
+
+Drupal 3.0.0, 2001-09-15
+------------------------
+- Major overhaul of the entire underlying design:
+    * Everything is based on nodes: nodes are a conceptual "black box" to couple and manage different types of content and that promotes reusing existing code, thus reducing the complexity and size of Drupal as well as improving long-term stability.
+- Rewrote submission/moderation queue and renamed it to queue.module.
+- Removed FAQ and documentation module and merged them into a "book module".
+- Removed ban module and integrated it into account.module as "access control":
+    * Access control is based on much more powerful regular expressions (regex) now rather than on MySQL pattern matching.
+- Rewrote watchdog and submission throttle:
+    * Improved watchdog messages and added watchdog filter.
+- Rewrote headline code and renamed it to import.module and export.module:
+    * Added various improvements, including a better parser, bundles and better control over individual feeds.
+- Rewrote section code and renamed it to meta.module:
+    * Supports unlimited amount of nested topics. Topics can be nested to create a multi-level hierarchy.
+- Rewrote configuration file resolving:
+    * Drupal tries to locate a configuration file that matches your domain name or uses conf.php if the former failed. Note also that the configuration files got renamed from .conf to .php for security's sake on mal-configured Drupal sites.
+- Added caching support which makes Drupal extremely scalable.
+- Added access.module:
+    * Allows you to set up 'roles' (groups) and to bind a set of permissions to each group.
+- Added blog.module.
+- Added poll.module.
+- Added system.module:
+    * Moved most of the configuration options from hostname.conf to the new administration section.
+    * Added support for custom "filters".
+- Added statistics.module
+- Added moderate.module:
+    * Allows to assign users editorial/moderator rights to certain nodes or topics.
+- Added page.module:
+    * Allows creation of static (and dynamic) pages through the administration interface.
+- Added help.module:
+    * Groups all available module documentation on a single page.
+- Added forum.module:
+    * Added an integrated forum.
+- Added cvs.module and cvs-to-sql.pl:
+    * Allows to display and mail CVS log messages as daily digests.
+- Added book.module:
+    * Allows collaborative handbook writing: primary used for Drupal documentation.
+- Removed cron.module and integrated it into conf.module.
+- Removed module.module as it was no longer needed.
+- Various updates:
+    * Added "auto-post new submissions" feature versus "moderate new submissions".
+    * Introduced links/Drupal tags: [[link]]
+    * Added preview functionality when submitting new content (such as a story) from the administration pages.
+    * Made the administration section only show those links a user has access to.
+    * Made all modules use specific form_* functions to guarantee a rock-solid forms and more consistent layout.
+    * Improved scheduler:
+        + Content can be scheduled to be 'posted', 'queued' and 'hidden'.
+    * Improved account module:
+        + Added "access control" to allow/deny certain usernames/e-mail addresses/hostnames.
+    * Improved locale module:
+        + Added new overview to easy the translation process.
+    * Improved comment module:
+        + Made it possible to permanently delete comments.
+    * Improved rating module
+    * Improved story module:
+        + Added preview functionality for administrators.
+        + Made it possible to permanently delete stories.
+    * Improved themes:
+        + W3C validation on a best effort basis.
+        + Removed $theme->control() from themes.
+        + Added theme "goofy".
+- Collaboratively revised and expanded the Drupal documentation.
+
+Drupal 2.0.0, 2001-03-15
+------------------------
+- Rewrote the comment/discussion code:
+    * Comment navigation should be less confusing now.
+    * Additional/alternative display and order methods have been added.
+    * Modules can be extended with a "comment system": modules can embed the existing comment system without having to write their own, duplicate comment system.
+- Added sections and section manager:
+    * Story sections can be maintained from the administration pages.
+    * Story sections make the open submission more adaptive in that you can set individual post, dump and expiration thresholds for each section according to the story type and urgency level: stories in certain sections do not "expire" and might stay interesting and active as time passes by, whereas news-related stories are only considered "hot" over a short period of time.
+- Multiple vhosts + multiple directories:
+    * You can set up multiple Drupal sites on top of the same physical source tree either by using vhosts or sub-directories.
+- Added "user ratings" similar to SlashCode's Karma or Scoop's Mojo:
+    * All rating logic is packed into a module to ease experimenting with different rating heuristics/algorithms.
+- Added "search infrastructure":
+    * Improved search page and integrated search functionality in the administration pages.
+- Added translation / localization / internationalization support:
+    * Because many people would love to see their website showing a lot less of English, and far more of their own language, Drupal provides a framework to set up a multi-lingual website or to overwrite the default English text in English.
+- Added fine-grained user permission (or group) system:
+    * Users can be granted access to specific administration sections. Example: a FAQ maintainer can be given access to maintain the FAQ and translators can be given access to the translation pages.
+- Added FAQ module
+- Changed the "open submission queue" into a (optional) module.
+- Various updates:
+    * Improved account module:
+        + User accounts can be deleted.
+        + Added fine-grained permission support.
+    * Improved block module
+    * Improved diary module:
+        + Diary entries can be deleted
+    * Improved headline module:
+        + Improved parser to support more "generic" RDF/RSS/XML backend.
+    * Improved module module
+    * Improved watchdog module
+    * Improved database abstraction layer
+    * Improved themes:
+        + W3C validation on a best effort basis
+        + Added theme "example" (alias "Stone Age")
+    * Added new scripts to directory "scripts"
+    * Added directory "misc"
+    * Added CREDITS file
+- Revised documentation
+
+Drupal 1.0.0, 2001-01-15
+------------------------
+- Initial release
diff --git a/htmltest/COPYRIGHT.txt b/htmltest/COPYRIGHT.txt
new file mode 100644
index 00000000..dc8a855f
--- /dev/null
+++ b/htmltest/COPYRIGHT.txt
@@ -0,0 +1,44 @@
+All Drupal code is Copyright 2001 - 2013 by the original authors.
+
+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 as the file LICENSE.txt; if not, please see
+http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+
+Drupal is a registered trademark of Dries Buytaert.
+
+Drupal includes works under other copyright notices and distributed
+according to the terms of the GNU General Public License or a compatible
+license, including:
+
+Javascript
+
+  Farbtastic - Copyright (c) 2010 Matt Farina
+
+  jQuery - Copyright (c) 2010 John Resig
+
+  jQuery BBQ - Copyright (c) 2010 "Cowboy" Ben Alman
+
+  jQuery Cookie - Copyright (c) 2006 Klaus Hartl
+
+  jQuery Form - Copyright (c) 2010 Mike Alsup
+
+  jQuery Once - Copyright (c) 2009 Konstantin K�fer
+
+  jQuery UI - Copyright (c) 2010 by the original authors
+    (http://jqueryui.com/about)
+
+  Sizzle.js - Copyright (c) 2010 The Dojo Foundation (http://sizzlejs.com/)
+
+PHP
+
+  ArchiveTar - Copyright (c) 1997 - 2008 Vincent Blavet
diff --git a/htmltest/INSTALL.mysql.txt b/htmltest/INSTALL.mysql.txt
new file mode 100644
index 00000000..bee58110
--- /dev/null
+++ b/htmltest/INSTALL.mysql.txt
@@ -0,0 +1,42 @@
+
+CREATE THE MySQL DATABASE
+--------------------------
+
+This step is only necessary if you don't already have a database set up (e.g.,
+by your host). In the following examples, 'username' is an example MySQL user
+which has the CREATE and GRANT privileges. Use the appropriate user name for
+your system.
+
+First, you must create a new database for your Drupal site (here, 'databasename'
+is the name of the new database):
+
+  mysqladmin -u username -p create databasename
+
+MySQL will prompt for the 'username' database password and then create the
+initial database files. Next you must log in and set the access database rights:
+
+  mysql -u username -p
+
+Again, you will be asked for the 'username' database password. At the MySQL
+prompt, enter the following command:
+
+  GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER
+  ON databasename.*
+  TO 'username'@'localhost' IDENTIFIED BY 'password';
+
+where
+
+ 'databasename' is the name of your database
+ 'username@localhost' is the username of your MySQL account
+ 'password' is the password required for that username
+
+Note: Unless your database user has all of the privileges listed above, you will
+not be able to run Drupal.
+
+If successful, MySQL will reply with:
+
+  Query OK, 0 rows affected
+
+If the InnoDB storage engine is available, it will be used for all database
+tables. InnoDB provides features over MyISAM such as transaction support,
+row-level locks, and consistent non-locking reads.
diff --git a/htmltest/INSTALL.pgsql.txt b/htmltest/INSTALL.pgsql.txt
new file mode 100644
index 00000000..8fe80433
--- /dev/null
+++ b/htmltest/INSTALL.pgsql.txt
@@ -0,0 +1,44 @@
+
+CREATE THE PostgreSQL DATABASE
+------------------------------
+
+Note that the database must be created with UTF-8 (Unicode) encoding.
+
+1. CREATE DATABASE USER
+
+   This step is only necessary if you don't already have a user set up (e.g., by
+   your host), or want to create a new user for use with Drupal only. The
+   following command creates a new user named 'username' and asks for a password
+   for that user:
+
+     createuser --pwprompt --encrypted --no-createrole --no-createdb username
+
+   If there are no errors, then the command was successful.
+
+2. CREATE DRUPAL DATABASE
+
+   This step is only necessary if you don't already have a database set up
+   (e.g., by your host) or want to create a new database for use with Drupal
+   only. The following command creates a new database named 'databasename',
+   which is owned by the previously created 'username':
+
+     createdb --encoding=UTF8 --owner=username databasename
+
+   If there are no errors, then the command was successful.
+
+3. CREATE SCHEMA OR SCHEMAS (Optional advanced step)
+
+   Drupal will run across different schemas within your database if you so wish.
+   By default, Drupal runs inside the 'public' schema but you can use $db_prefix
+   inside settings.php to define a schema for Drupal to run inside of, or
+   specify tables that are shared inside of a separate schema. Drupal will not
+   create schemas for you. In fact, the user that Drupal runs as should not be
+   allowed to do this. You'll need to execute the SQL below as a superuser,
+   replace 'username' with the username that Drupal uses to connect to
+   PostgreSQL, and replace 'schema_name' with a schema name you wish to use,
+   such as 'shared':
+
+     CREATE SCHEMA schema_name AUTHORIZATION username;
+
+   Do this for as many schemas as you need. See default.settings.php for
+   instructions on how to set which tables use which schemas.
diff --git a/htmltest/INSTALL.sqlite.txt b/htmltest/INSTALL.sqlite.txt
new file mode 100644
index 00000000..8e57d60c
--- /dev/null
+++ b/htmltest/INSTALL.sqlite.txt
@@ -0,0 +1,31 @@
+
+SQLITE REQUIREMENTS
+-------------------
+
+To use SQLite with your Drupal installation, the following requirements must be
+met: Server has PHP 5.2 or later with PDO, and the PDO SQLite driver must be
+enabled.
+
+SQLITE DATABASE CREATION
+------------------------
+
+The Drupal installer will create the SQLite database for you. The only
+requirement is that the installer must have write permissions to the directory
+where the database file resides. This directory (not just the database file) also
+has to remain writeable by the web server going forward for SQLite to continue to
+be able to operate.
+
+On the "Database configuration" form in the "Database file" field, you must
+supply the exact path to where you wish your database file to reside. It is
+strongly suggested that you choose a path that is outside of the webroot, yet
+ensure that the directory is writeable by the web server.
+
+If you must place your database file in your webroot, you could try using the
+following in your "Database file" field:
+
+  sites/default/files/.ht.sqlite
+
+Note: The .ht in the name will tell Apache to prevent the database from being
+downloaded. Please check that the file is, indeed, protected by your webserver.
+If not, please consult the documentation of your webserver on how to protect a
+file from downloading.
diff --git a/htmltest/INSTALL.txt b/htmltest/INSTALL.txt
new file mode 100644
index 00000000..6f02c05a
--- /dev/null
+++ b/htmltest/INSTALL.txt
@@ -0,0 +1,400 @@
+
+CONTENTS OF THIS FILE
+---------------------
+
+ * Requirements and notes
+ * Optional server requirements
+ * Installation
+ * Building and customizing your site
+ * Multisite configuration
+ * More information
+
+REQUIREMENTS AND NOTES
+----------------------
+
+Drupal requires:
+
+- A web server. Apache (version 2.0 or greater) is recommended.
+- PHP 5.2.4 (or greater) (http://www.php.net/).
+- One of the following databases:
+  - MySQL 5.0.15 (or greater) (http://www.mysql.com/).
+  - MariaDB 5.1.44 (or greater) (http://mariadb.org/). MariaDB is a fully
+    compatible drop-in replacement for MySQL.
+  - Percona Server 5.1.70 (or greater) (http://www.percona.com/). Percona
+    Server is a backwards-compatible replacement for MySQL.
+  - PostgreSQL 8.3 (or greater) (http://www.postgresql.org/).
+  - SQLite 3.4.2 (or greater) (http://www.sqlite.org/).
+
+For more detailed information about Drupal requirements, including a list of
+PHP extensions and configurations that are required, see "System requirements"
+(http://drupal.org/requirements) in the Drupal.org online documentation.
+
+For detailed information on how to configure a test server environment using a
+variety of operating systems and web servers, see "Local server setup"
+(http://drupal.org/node/157602) in the Drupal.org online documentation.
+
+Note that all directories mentioned in this document are always relative to the
+directory of your Drupal installation, and commands are meant to be run from
+this directory (except for the initial commands that create that directory).
+
+OPTIONAL SERVER REQUIREMENTS
+----------------------------
+
+- If you want to use Drupal's "Clean URLs" feature on an Apache web server, you
+  will need the mod_rewrite module and the ability to use local .htaccess
+  files. For Clean URLs support on IIS, see "Clean URLs with IIS"
+  (http://drupal.org/node/3854) in the Drupal.org online documentation.
+
+- If you plan to use XML-based services such as RSS aggregation, you will need
+  PHP's XML extension. This extension is enabled by default on most PHP
+  installations.
+
+- To serve gzip compressed CSS and JS files on an Apache web server, you will
+  need the mod_headers module and the ability to use local .htaccess files.
+
+- Some Drupal functionality (e.g., checking whether Drupal and contributed
+  modules need updates, RSS aggregation, etc.) require that the web server be
+  able to go out to the web and download information. If you want to use this
+  functionality, you need to verify that your hosting provider or server
+  configuration allows the web server to initiate outbound connections. Most web
+  hosting setups allow this.
+
+INSTALLATION
+------------
+
+1. Download and extract Drupal.
+
+   You can obtain the latest Drupal release from http://drupal.org -- the files
+   are available in .tar.gz and .zip formats and can be extracted using most
+   compression tools.
+
+   To download and extract the files, on a typical Unix/Linux command line, use
+   the following commands (assuming you want version x.y of Drupal in .tar.gz
+   format):
+
+     wget http://drupal.org/files/projects/drupal-x.y.tar.gz
+     tar -zxvf drupal-x.y.tar.gz
+
+   This will create a new directory drupal-x.y/ containing all Drupal files and
+   directories. Then, to move the contents of that directory into a directory
+   within your web server's document root or your public HTML directory,
+   continue with this command:
+
+     mv drupal-x.y/* drupal-x.y/.htaccess /path/to/your/installation
+
+2. Optionally, download a translation.
+
+   By default, Drupal is installed in English, and further languages may be
+   installed later. If you prefer to install Drupal in another language
+   initially:
+
+   - Download a translation file for the correct Drupal version and language
+     from the translation server: http://localize.drupal.org/translate/downloads
+
+   - Place the file into your installation profile's translations directory.
+     For instance, if you are using the Standard installation profile,
+     move the .po file into the directory:
+
+       profiles/standard/translations/
+
+   For detailed instructions, visit http://drupal.org/localize
+
+3. Create the Drupal database.
+
+   Because Drupal stores all site information in a database, you must create
+   this database in order to install Drupal, and grant Drupal certain database
+   privileges (such as the ability to create tables). For details, consult
+   INSTALL.mysql.txt, INSTALL.pgsql.txt, or INSTALL.sqlite.txt. You may also
+   need to consult your web hosting provider for instructions specific to your
+   web host.
+
+   Take note of the username, password, database name, and hostname as you
+   create the database. You will enter this information during the install.
+
+4. Run the install script.
+
+   To run the install script, point your browser to the base URL of your
+   website (e.g., http://www.example.com).
+
+   You will be guided through several screens to set up the database, add the
+   site maintenance account (the first user, also known as user/1), and provide
+   basic web site settings.
+
+   During installation, several files and directories need to be created, which
+   the install script will try to do automatically. However, on some hosting
+   environments, manual steps are required, and the install script will tell
+   you that it cannot proceed until you fix certain issues. This is normal and
+   does not indicate a problem with your server.
+
+   The most common steps you may need to perform are:
+
+   a. Missing files directory.
+
+      The install script will attempt to create a file storage directory in
+      the default location at sites/default/files (the location of the files
+      directory may be changed after Drupal is installed).
+
+      If auto-creation fails, you can make it work by changing permissions on
+      the sites/default directory so that the web server can create the files
+      directory within it for you. (If you are creating a multisite
+      installation, substitute the correct sites directory for sites/default;
+      see the Multisite Configuration section of this file, below.)
+
+      For example, on a Unix/Linux command line, you can grant everyone
+      (including the web server) permission to write to the sites/default
+      directory with this command:
+
+        chmod a+w sites/default
+
+      Be sure to set the permissions back after the installation is finished!
+      Sample command:
+
+        chmod go-w sites/default
+
+      Alternatively, instead of allowing the web server to create the files
+      directory for you as described above, you can create it yourself. Sample
+      commands from a Unix/Linux command line:
+
+        mkdir sites/default/files
+        chmod a+w sites/default/files
+
+   b. Missing settings file.
+
+      Drupal will try to automatically create a settings.php configuration file,
+      which is normally in the directory sites/default (to avoid problems when
+      upgrading, Drupal is not packaged with this file). If auto-creation fails,
+      you will need to create this file yourself, using the file
+      sites/default/default.settings.php as a template.
+
+      For example, on a Unix/Linux command line, you can make a copy of the
+      default.settings.php file with the command:
+
+        cp sites/default/default.settings.php sites/default/settings.php
+
+      Next, grant write privileges to the file to everyone (including the web
+      server) with the command:
+
+        chmod a+w sites/default/settings.php
+
+      Be sure to set the permissions back after the installation is finished!
+      Sample command:
+
+        chmod go-w sites/default/settings.php
+
+   c. Write permissions after install.
+
+      The install script will attempt to write-protect the settings.php file and
+      the sites/default directory after saving your configuration. If this
+      fails, you will be notified, and you can do it manually. Sample commands
+      from a Unix/Linux command line:
+
+        chmod go-w sites/default/settings.php
+        chmod go-w sites/default
+
+5. Verify that the site is working.
+
+   When the install script finishes, you will be logged in with the site
+   maintenance account on a "Welcome" page. If the default Drupal theme is not
+   displaying properly and links on the page result in "Page Not Found" errors,
+   you may be experiencing problems with clean URLs. Visit
+   http://drupal.org/getting-started/clean-urls to troubleshoot.
+
+6. Change file system storage settings (optional).
+
+   The files directory created in step 4 is the default file system path used to
+   store all uploaded files, as well as some temporary files created by
+   Drupal. After installation, you can modify the file system path to store
+   uploaded files in a different location.
+
+   It is not necessary to modify this path, but you may wish to change it if:
+
+   - Your site runs multiple Drupal installations from a single codebase (modify
+     the file system path of each installation to a different directory so that
+     uploads do not overlap between installations).
+
+   - Your site runs on a number of web servers behind a load balancer or reverse
+     proxy (modify the file system path on each server to point to a shared file
+     repository).
+
+   - You want to restrict access to uploaded files.
+
+   To modify the file system path:
+
+   a. Ensure that the new location for the path exists and is writable by the
+      web server. For example, to create a new directory named uploads and grant
+      write permissions, use the following commands on a Unix/Linux command
+      line:
+
+        mkdir uploads
+        chmod a+w uploads
+
+   b. Navigate to Administration > Configuration > Media > File system, and
+      enter the desired path. Note that if you want to use private file storage,
+      you need to first enter the path for private files and save the
+      configuration, and then change the "Default download method" setting and
+      save again.
+
+   Changing the file system path after files have been uploaded may cause
+   unexpected problems on an existing site. If you modify the file system path
+   on an existing site, remember to copy all files from the original location
+   to the new location.
+
+7. Revoke documentation file permissions (optional).
+
+   Some administrators suggest making the documentation files, especially
+   CHANGELOG.txt, non-readable so that the exact version of Drupal you are
+   running is slightly more difficult to determine. If you wish to implement
+   this optional security measure, from a Unix/Linux command line you can use
+   the following command:
+
+     chmod a-r CHANGELOG.txt
+
+   Note that the example only affects CHANGELOG.txt. To completely hide all
+   documentation files from public view, repeat this command for each of the
+   Drupal documentation files in the installation directory, substituting the
+   name of each file for CHANGELOG.txt in the example.
+
+   For more information on setting file permissions, see "Modifying Linux,
+   Unix, and Mac file permissions" (http://drupal.org/node/202483) or
+   "Modifying Windows file permissions" (http://drupal.org/node/202491) in the
+   Drupal.org online documentation.
+
+8. Set up independent "cron" maintenance jobs.
+
+   Many Drupal modules have tasks that must be run periodically, including the
+   Search module (building and updating the index used for keyword searching),
+   the Aggregator module (retrieving feeds from other sites), and the System
+   module (performing routine maintenance and pruning of database tables). These
+   tasks are known as "cron maintenance tasks", named after the Unix/Linux
+   "cron" utility.
+
+   When you install Drupal, its built-in cron feature is enabled, which
+   automatically runs the cron tasks periodically, triggered by people visiting
+   pages of your site. You can configure the built-in cron feature by navigating
+   to Administration > Configuration > System > Cron.
+
+   It is also possible to run the cron tasks independent of site visits; this is
+   recommended for most sites. To do this, you will need to set up an automated
+   process to visit the page cron.php on your site, which executes the cron
+   tasks.
+
+   The URL of the cron.php page requires a "cron key" to protect against
+   unauthorized access. Your site's cron key is automatically generated during
+   installation and is specific to your site. The full URL of the page, with the
+   cron key, is available in the "Cron maintenance tasks" section of the Status
+   report page at Administration > Reports > Status report.
+
+   As an example for how to set up this automated process, you can use the
+   crontab utility on Unix/Linux systems. The following crontab line uses the
+   wget command to visit the cron.php page, and runs each hour, on the hour:
+
+   0 * * * * wget -O - -q -t 1 http://example.com/cron.php?cron_key=YOURKEY
+
+   Replace the text "http://example.com/cron.php?cron_key=YOURKEY" in the
+   example with the full URL displayed under "Cron maintenance tasks" on the
+   "Status report" page.
+
+   More information about cron maintenance tasks is available at
+   http://drupal.org/cron, and sample cron shell scripts can be found in the
+   scripts/ directory. (Note that these scripts must be customized like the
+   above example, to add your site-specific cron key and domain name.)
+
+BUILDING AND CUSTOMIZING YOUR SITE
+----------------------------------
+
+A new installation of Drupal defaults to a very basic configuration. To extend
+your site, you use "modules" and "themes". A module is a plugin that adds
+functionality to Drupal, while a theme changes the look of your site. The core
+of Drupal provides several optional modules and themes, and you can download
+more at http://drupal.org/project/modules and http://drupal.org/project/themes
+
+Do not mix downloaded or custom modules and themes with Drupal's core modules
+and themes. Drupal's modules and themes are located in the top-level modules and
+themes directories, while the modules and themes you add to Drupal are normally
+placed in the sites/all/modules and sites/all/themes directories. If you run a
+multisite installation, you can also place modules and themes in the
+site-specific directories -- see the Multisite Configuration section, below.
+
+Never edit Drupal's core modules and themes; instead, use the hooks available in
+the Drupal API. To modify the behavior of Drupal, develop a module as described
+at http://drupal.org/developing/modules. To modify the look of Drupal, create a
+subtheme as described at http://drupal.org/node/225125, or a completely new
+theme as described at http://drupal.org/documentation/theme
+
+MULTISITE CONFIGURATION
+-----------------------
+
+A single Drupal installation can host several Drupal-powered sites, each with
+its own individual configuration.
+
+Additional site configurations are created in subdirectories within the 'sites'
+directory. Each subdirectory must have a 'settings.php' file, which specifies
+the configuration settings. The easiest way to create additional sites is to
+copy the 'default' directory and modify the 'settings.php' file as appropriate.
+The new directory name is constructed from the site's URL. The configuration for
+www.example.com could be in 'sites/example.com/settings.php' (note that 'www.'
+should be omitted if users can access your site at http://example.com/).
+
+Sites do not have to have a different domain. You can also use subdomains and
+subdirectories for Drupal sites. For example, example.com, sub.example.com, and
+sub.example.com/site3 can all be defined as independent Drupal sites. The setup
+for a configuration such as this would look like the following:
+
+  sites/default/settings.php
+  sites/example.com/settings.php
+  sites/sub.example.com/settings.php
+  sites/sub.example.com.site3/settings.php
+
+When searching for a site configuration (for example www.sub.example.com/site3),
+Drupal will search for configuration files in the following order, using the
+first configuration it finds:
+
+  sites/www.sub.example.com.site3/settings.php
+  sites/sub.example.com.site3/settings.php
+  sites/example.com.site3/settings.php
+  sites/www.sub.example.com/settings.php
+  sites/sub.example.com/settings.php
+  sites/example.com/settings.php
+  sites/default/settings.php
+
+If you are installing on a non-standard port, the port number is treated as the
+deepest subdomain. For example: http://www.example.com:8080/ could be loaded
+from sites/8080.www.example.com/. The port number will be removed according to
+the pattern above if no port-specific configuration is found, just like a real
+subdomain.
+
+Each site configuration can have its own site-specific modules and themes in
+addition to those installed in the standard 'modules' and 'themes' directories.
+To use site-specific modules or themes, simply create a 'modules' or 'themes'
+directory within the site configuration directory. For example, if
+sub.example.com has a custom theme and a custom module that should not be
+accessible to other sites, the setup would look like this:
+
+  sites/sub.example.com/
+    settings.php
+    themes/custom_theme
+    modules/custom_module
+
+NOTE: for more information about multiple virtual hosts or the configuration
+settings, consult http://drupal.org/getting-started/6/install/multi-site
+
+For more information on configuring Drupal's file system path in a multisite
+configuration, see step 6 above.
+
+MORE INFORMATION
+----------------
+
+- See the Drupal.org online documentation:
+  http://drupal.org/documentation
+
+- For a list of security announcements, see the "Security advisories" page at
+  http://drupal.org/security (available as an RSS feed). This page also
+  describes how to subscribe to these announcements via e-mail.
+
+- For information about the Drupal security process, or to find out how to
+  report a potential security issue to the Drupal security team, see the
+  "Security team" page at http://drupal.org/security-team
+
+- For information about the wide range of available support options, visit
+  http://drupal.org and click on Community and Support in the top or bottom
+  navigation.
diff --git a/htmltest/LICENSE.txt b/htmltest/LICENSE.txt
new file mode 100644
index 00000000..d159169d
--- /dev/null
+++ b/htmltest/LICENSE.txt
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/htmltest/MAINTAINERS.txt b/htmltest/MAINTAINERS.txt
new file mode 100644
index 00000000..61715668
--- /dev/null
+++ b/htmltest/MAINTAINERS.txt
@@ -0,0 +1,303 @@
+
+Drupal core is built and maintained by the Drupal project community. Everyone is
+encouraged to submit issues and changes (patches) to improve Drupal, and to
+contribute in other ways -- see http://drupal.org/contribute to find out how.
+
+Branch maintainers
+------------------
+
+The Drupal Core branch maintainers oversee the development of Drupal as a whole.
+The branch maintainers for Drupal 7 are:
+
+- Dries Buytaert 'dries' http://drupal.org/user/1
+- Angela Byron 'webchick' http://drupal.org/user/24967
+- David Rothstein 'David_Rothstein' http://drupal.org/user/124982
+
+
+Component maintainers
+---------------------
+
+The Drupal Core component maintainers oversee the development of Drupal
+subsystems. See http://drupal.org/contribute/core-maintainers for more
+information on their responsibilities, and to find out how to become a component
+maintainer. Current component maintainers for Drupal 7:
+
+Ajax system
+- Alex Bronstein 'effulgentsia' http://drupal.org/user/78040
+- Earl Miles 'merlinofchaos' http://drupal.org/user/26979
+
+Base system
+- Károly Négyesi 'chx' http://drupal.org/user/9446
+- Damien Tournoud 'DamZ' http://drupal.org/user/22211
+- Moshe Weitzman 'moshe weitzman' http://drupal.org/user/23
+
+Batch system
+- Yves Chedemois 'yched' http://drupal.org/user/39567
+
+Cache system
+- Damien Tournoud 'DamZ' http://drupal.org/user/22211
+- Nathaniel Catchpole 'catch' http://drupal.org/user/35733
+
+Cron system
+- Károly Négyesi 'chx' http://drupal.org/user/9446
+- Derek Wright 'dww' http://drupal.org/user/46549
+
+Database system
+- Larry Garfield 'Crell' http://drupal.org/user/26398
+
+  - MySQL driver
+    - Larry Garfield 'Crell' http://drupal.org/user/26398
+    - David Strauss 'David Strauss' http://drupal.org/user/93254
+
+  - PostgreSQL driver
+    - Damien Tournoud 'DamZ' http://drupal.org/user/22211
+    - Josh Waihi 'fiasco' http://drupal.org/user/188162
+
+  - Sqlite driver
+    - Damien Tournoud 'DamZ' http://drupal.org/user/22211
+    - Károly Négyesi 'chx' http://drupal.org/user/9446
+
+Database update system
+- Károly Négyesi 'chx' http://drupal.org/user/9446
+- Ashok Modi 'BTMash' http://drupal.org/user/60422
+
+Entity system
+- Wolfgang Ziegler 'fago' http://drupal.org/user/16747
+- Nathaniel Catchpole 'catch' http://drupal.org/user/35733
+- Franz Heinzmann 'Frando' http://drupal.org/user/21850
+
+File system
+- Andrew Morton 'drewish' http://drupal.org/user/34869
+- Aaron Winborn 'aaron' http://drupal.org/user/33420
+
+Form system
+- Károly Négyesi 'chx' http://drupal.org/user/9446
+- Alex Bronstein 'effulgentsia' http://drupal.org/user/78040
+- Wolfgang Ziegler 'fago' http://drupal.org/user/16747
+- Daniel F. Kudwien 'sun' http://drupal.org/user/54136
+- Franz Heinzmann 'Frando' http://drupal.org/user/21850
+
+Image system
+- Andrew Morton 'drewish' http://drupal.org/user/34869
+- Nathan Haug 'quicksketch' http://drupal.org/user/35821
+
+Install system
+- David Rothstein 'David_Rothstein' http://drupal.org/user/124982
+
+JavaScript
+- Théodore Biadala 'nod_' http://drupal.org/user/598310
+- Steve De Jonghe 'seutje' http://drupal.org/user/264148
+- Jesse Renée Beach 'jessebeach' http://drupal.org/user/748566
+
+Language system
+- Francesco Placella 'plach' http://drupal.org/user/183211
+- Daniel F. Kudwien 'sun' http://drupal.org/user/54136
+
+Lock system
+- Damien Tournoud 'DamZ' http://drupal.org/user/22211
+
+Mail system
+- ?
+
+Markup
+- Jacine Luisi 'Jacine' http://drupal.org/user/88931
+- Daniel F. Kudwien 'sun' http://drupal.org/user/54136
+
+Menu system
+- Peter Wolanin 'pwolanin' http://drupal.org/user/49851
+- Károly Négyesi 'chx' http://drupal.org/user/9446
+
+Path system
+- Dave Reid 'davereid' http://drupal.org/user/53892
+- Nathaniel Catchpole 'catch' http://drupal.org/user/35733
+
+Render system
+- Moshe Weitzman 'moshe weitzman' http://drupal.org/user/23
+- Alex Bronstein 'effulgentsia' http://drupal.org/user/78040
+- Franz Heinzmann 'Frando' http://drupal.org/user/21850
+
+Theme system
+- Earl Miles 'merlinofchaos' http://drupal.org/user/26979
+- Alex Bronstein 'effulgentsia' http://drupal.org/user/78040
+- Joon Park 'dvessel' http://drupal.org/user/56782
+- John Albin Wilkins 'JohnAlbin' http://drupal.org/user/32095
+
+Token system
+- Dave Reid 'davereid' http://drupal.org/user/53892
+
+XML-RPC system
+- Frederic G. Marand 'fgm' http://drupal.org/user/27985
+
+
+Topic coordinators
+------------------
+
+Accessibility
+- Everett Zufelt 'Everett Zufelt' http://drupal.org/user/406552
+- Brandon Bowersox-Johnson 'bowersox' http://drupal.org/user/186415
+
+Documentation
+- Jennifer Hodgdon 'jhodgdon' http://drupal.org/user/155601
+
+Security
+- Greg Knaddison 'greggles' http://drupal.org/user/36762
+
+Translations
+- Gerhard Killesreiter 'killes' http://drupal.org/user/83
+
+User experience and usability
+- Roy Scholten 'yoroy' http://drupal.org/user/41502
+- Bojhan Somers 'Bojhan' http://drupal.org/user/87969
+
+Node Access
+- Moshe Weitzman 'moshe weitzman' http://drupal.org/user/23
+- Ken Rickard 'agentrickard' http://drupal.org/user/20975
+- Jess Myrbo 'xjm' http://drupal.org/user/65776
+
+Module maintainers
+------------------
+
+Aggregator module
+- ?
+
+Block module
+- John Albin Wilkins 'JohnAlbin' http://drupal.org/user/32095
+
+Blog module
+- ?
+
+Book module
+- Peter Wolanin 'pwolanin' http://drupal.org/user/49851
+
+Color module
+- ?
+
+Comment module
+- Nathaniel Catchpole 'catch' http://drupal.org/user/35733
+
+Contact module
+- Dave Reid 'davereid' http://drupal.org/user/53892
+
+Contextual module
+- Daniel F. Kudwien 'sun' http://drupal.org/user/54136
+
+Dashboard module
+- ?
+
+Database logging module
+- Khalid Baheyeldin 'kbahey' http://drupal.org/user/4063
+
+Field module
+- Yves Chedemois 'yched' http://drupal.org/user/39567
+- Barry Jaspan 'bjaspan' http://drupal.org/user/46413
+
+Field UI module
+- Yves Chedemois 'yched' http://drupal.org/user/39567
+
+File module
+- Aaron Winborn 'aaron' http://drupal.org/user/33420
+
+Filter module
+- Daniel F. Kudwien 'sun' http://drupal.org/user/54136
+
+Forum module
+- Lee Rowlands 'larowlan' http://drupal.org/user/395439
+
+Help module
+- ?
+
+Image module
+- Nathan Haug 'quicksketch' http://drupal.org/user/35821
+
+Locale module
+- Gábor Hojtsy 'Gábor Hojtsy' http://drupal.org/user/4166
+
+Menu module
+- ?
+
+Node module
+- Moshe Weitzman 'moshe weitzman' http://drupal.org/user/23
+- David Strauss 'David Strauss' http://drupal.org/user/93254
+
+OpenID module
+- Vojtech Kusy 'wojtha' http://drupal.org/user/56154
+- Christian Schmidt 'c960657' http://drupal.org/user/216078
+- Damien Tournoud 'DamZ' http://drupal.org/user/22211
+
+Overlay module
+- Katherine Senzee 'ksenzee' http://drupal.org/user/139855
+
+Path module
+- Dave Reid 'davereid' http://drupal.org/user/53892
+
+PHP module
+- ?
+
+Poll module
+- Andrei Mateescu 'amateescu' http://drupal.org/user/729614
+
+Profile module
+- ?
+
+RDF module
+- Stéphane Corlosquet 'scor' http://drupal.org/user/52142
+
+Search module
+- Doug Green 'douggreen' http://drupal.org/user/29191
+
+Shortcut module
+- David Rothstein 'David_Rothstein' http://drupal.org/user/124982
+
+Simpletest module
+- Jimmy Berry 'boombatower' http://drupal.org/user/214218
+- Károly Négyesi 'chx' http://drupal.org/user/9446
+
+Statistics module
+- Tim Millwood 'timmillwood' http://drupal.org/user/227849
+
+Syslog module
+- Khalid Baheyeldin 'kbahey' http://drupal.org/user/4063
+
+System module
+- ?
+
+Taxonomy module
+- Jess Myrbo 'xjm' http://drupal.org/user/65776
+- Nathaniel Catchpole 'catch' http://drupal.org/user/35733
+- Benjamin Doherty 'bangpound' http://drupal.org/user/100456
+
+Toolbar module
+- ?
+
+Tracker module
+- David Strauss 'David Strauss' http://drupal.org/user/93254
+
+Translation module
+- Francesco Placella 'plach' http://drupal.org/user/183211
+
+Trigger module
+- ?
+
+Update module
+- Derek Wright 'dww' http://drupal.org/user/46549
+
+User module
+- Moshe Weitzman 'moshe weitzman' http://drupal.org/user/23
+- David Strauss 'David Strauss' http://drupal.org/user/93254
+
+
+Theme maintainers
+-----------------
+
+Bartik theme
+- Jen Simmons 'jensimmons' http://drupal.org/user/140882
+- Jeff Burns 'Jeff Burnz' http://drupal.org/user/61393
+
+Garland theme
+- John Albin Wilkins 'JohnAlbin' http://drupal.org/user/32095
+
+Seven theme
+- Jeff Burns 'Jeff Burnz' http://drupal.org/user/61393
+
+Stark theme
+- John Albin Wilkins 'JohnAlbin' http://drupal.org/user/32095
diff --git a/htmltest/README.txt b/htmltest/README.txt
new file mode 100644
index 00000000..f4c2f643
--- /dev/null
+++ b/htmltest/README.txt
@@ -0,0 +1,123 @@
+
+CONTENTS OF THIS FILE
+---------------------
+
+ * About Drupal
+ * Configuration and features
+ * Installation profiles
+ * Appearance
+ * Developing for Drupal
+
+ABOUT DRUPAL
+------------
+
+Drupal is an open source content management platform supporting a variety of
+websites ranging from personal weblogs to large community-driven websites. For
+more information, see the Drupal website at http://drupal.org/, and join the
+Drupal community at http://drupal.org/community.
+
+Legal information about Drupal:
+ * Know your rights when using Drupal:
+   See LICENSE.txt in the same directory as this document.
+ * Learn about the Drupal trademark and logo policy:
+   http://drupal.com/trademark
+
+CONFIGURATION AND FEATURES
+--------------------------
+
+Drupal core (what you get when you download and extract a drupal-x.y.tar.gz or
+drupal-x.y.zip file from http://drupal.org/project/drupal) has what you need to
+get started with your website. It includes several modules (extensions that add
+functionality) for common website features, such as managing content, user
+accounts, image uploading, and search. Core comes with many options that allow
+site-specific configuration. In addition to the core modules, there are
+thousands of contributed modules (for functionality not included with Drupal
+core) available for download.
+
+More about configuration:
+ * Install, upgrade, and maintain Drupal:
+   See INSTALL.txt and UPGRADE.txt in the same directory as this document.
+ * Learn about how to use Drupal to create your site:
+   http://drupal.org/documentation
+ * Download contributed modules to sites/all/modules to extend Drupal's
+   functionality:
+   http://drupal.org/project/modules
+ * See also: "Developing for Drupal" for writing your own modules, below.
+
+INSTALLATION PROFILES
+---------------------
+
+Installation profiles define additional steps (such as enabling modules,
+defining content types, etc.) that run after the base installation provided
+by core when Drupal is first installed. There are two basic installation
+profiles provided with Drupal core.
+
+Installation profiles from the Drupal community modify the installation process
+to provide a website for a specific use case, such as a CMS for media
+publishers, a web-based project tracking tool, or a full-fledged CRM for
+non-profit organizations raising money and accepting donations. They can be
+distributed as bare installation profiles or as "distributions". Distributions
+include Drupal core, the installation profile, and all other required
+extensions, such as contributed and custom modules, themes, and third-party
+libraries. Bare installation profiles require you to download Drupal Core and
+the required extensions separately; place the downloaded profile in the
+/profiles directory before you start the installation process. Note that the
+contents of this directory may be overwritten during updates of Drupal core;
+it is advised to keep code backups or use a version control system.
+
+Additionally, modules and themes may be placed inside subdirectories in a
+specific installation profile such as profiles/your_site_profile/modules and
+profiles/your_site_profile/themes respectively to restrict their usage to only
+sites that were installed with that specific profile.
+
+More about installation profiles and distributions:
+* Read about the difference between installation profiles and distributions:
+  http://drupal.org/node/1089736
+* Download contributed installation profiles and distributions:
+  http://drupal.org/project/distributions
+* Develop your own installation profile or distribution:
+  http://drupal.org/developing/distributions
+
+APPEARANCE
+----------
+
+In Drupal, the appearance of your site is set by the theme (themes are
+extensions that set fonts, colors, and layout). Drupal core comes with several
+themes. More themes are available for download, and you can also create your own
+custom theme.
+
+More about themes:
+ * Download contributed themes to sites/all/themes to modify Drupal's
+   appearance:
+   http://drupal.org/project/themes
+ * Develop your own theme:
+   http://drupal.org/documentation/theme
+
+DEVELOPING FOR DRUPAL
+---------------------
+
+Drupal contains an extensive API that allows you to add to and modify the
+functionality of your site. The API consists of "hooks", which allow modules to
+react to system events and customize Drupal's behavior, and functions that
+standardize common operations such as database queries and form generation. The
+flexible hook architecture means that you should never need to directly modify
+the files that come with Drupal core to achieve the functionality you want;
+instead, functionality modifications take the form of modules.
+
+When you need new functionality for your Drupal site, search for existing
+contributed modules. If you find a module that matches except for a bug or an
+additional needed feature, change the module and contribute your improvements
+back to the project in the form of a "patch". Create new custom modules only
+when nothing existing comes close to what you need.
+
+More about developing:
+ * Search for existing contributed modules:
+   http://drupal.org/project/modules
+ * Contribute a patch:
+   http://drupal.org/patch/submit
+ * Develop your own module:
+   http://drupal.org/developing/modules
+ * Follow best practices:
+   http://drupal.org/best-practices
+ * Refer to the API documentation:
+   http://api.drupal.org/api/drupal/7
diff --git a/htmltest/UPGRADE.txt b/htmltest/UPGRADE.txt
new file mode 100644
index 00000000..e870ff0f
--- /dev/null
+++ b/htmltest/UPGRADE.txt
@@ -0,0 +1,236 @@
+INTRODUCTION
+------------
+This document describes how to:
+
+  * Update your Drupal site from one minor 7.x version to another minor 7.x
+    version; for example, from 7.8 to 7.9, or from 7.6 to 7.10.
+
+  * Upgrade your Drupal site's major version from 6.x to 7.x.
+
+First steps and definitions:
+
+  * If you are upgrading to Drupal version x.y, then x is known as the major
+    version number, and y is known as the minor version number. The download
+    file will be named drupal-x.y.tar.gz (or drupal-x.y.zip).
+
+  * All directories mentioned in this document are relative to the directory of
+    your Drupal installation.
+
+  * Make a full backup of all files, directories, and your database(s) before
+    starting, and save it outside your Drupal installation directory.
+    Instructions may be found at http://drupal.org/upgrade/backing-up-the-db
+
+  * It is wise to try an update or upgrade on a test copy of your site before
+    applying it to your live site. Even minor updates can cause your site's
+    behavior to change.
+
+  * Each new release of Drupal has release notes, which explain the changes made
+    since the previous version and any special instructions needed to update or
+    upgrade to the new version. You can find a link to the release notes for the
+    version you are upgrading or updating to on the Drupal project page
+    (http://drupal.org/project/drupal).
+
+UPGRADE PROBLEMS
+----------------
+If you encounter errors during this process,
+
+  * Note any error messages you see.
+
+  * Restore your site to its previous state, using the file and database backups
+    you created before you started the upgrade process. Do not attempt to do
+    further upgrades on a site that had update problems.
+
+  * Consult one of the support options listed on http://drupal.org/support
+
+More in-depth information on upgrading can be found at http://drupal.org/upgrade
+
+MINOR VERSION UPDATES
+---------------------
+To update from one minor 7.x version of Drupal to any later 7.x version, after
+following the instructions in the INTRODUCTION section at the top of this file:
+
+1. Log in as a user with the permission "Administer software updates".
+
+2. Go to Administration > Configuration > Development > Maintenance mode.
+   Enable the "Put site into maintenance mode" checkbox and save the
+   configuration.
+
+3. Remove all old core files and directories, except for the 'sites' directory
+   and any custom files you added elsewhere.
+
+   If you made modifications to files like .htaccess or robots.txt, you will
+   need to re-apply them from your backup, after the new files are in place.
+
+   Sometimes an update includes changes to default.settings.php (this will be
+   noted in the release notes). If that's the case, follow these steps:
+
+   - Make a backup copy of your settings.php file, with a different file name.
+
+   - Make a copy of the new default.settings.php file, and name the copy
+     settings.php (overwriting your previous settings.php file).
+
+   - Copy the custom and site-specific entries from the backup you made into the
+     new settings.php file. You will definitely need the lines giving the
+     database information, and you will also want to copy in any other
+     customizations you have added.
+
+4. Download the latest Drupal 7.x release from http://drupal.org to a
+   directory outside of your web root. Extract the archive and copy the files
+   into your Drupal directory.
+
+   On a typical Unix/Linux command line, use the following commands to download
+   and extract:
+
+     wget http://drupal.org/files/projects/drupal-x.y.tar.gz
+     tar -zxvf drupal-x.y.tar.gz
+
+   This creates a new directory drupal-x.y/ containing all Drupal files and
+   directories. Copy the files into your Drupal installation directory:
+
+     cp -R drupal-x.y/* drupal-x.y/.htaccess /path/to/your/installation
+
+   If you do not have command line access to your server, download the archive
+   from http://drupal.org using your web browser, extract it, and then use an
+   FTP client to upload the files to your web root.
+
+5. Re-apply any modifications to files such as .htaccess or robots.txt.
+
+6. Run update.php by visiting http://www.example.com/update.php (replace
+   www.example.com with your domain name). This will update the core database
+   tables.
+
+   If you are unable to access update.php do the following:
+
+   - Open settings.php with a text editor.
+
+   - Find the line that says:
+     $update_free_access = FALSE;
+
+   - Change it into:
+     $update_free_access = TRUE;
+
+   - Once the upgrade is done, $update_free_access must be reverted to FALSE.
+
+7. Go to Administration > Reports > Status report. Verify that everything is
+   working as expected.
+
+8. Ensure that $update_free_access is FALSE in settings.php.
+
+9. Go to Administration > Configuration > Development > Maintenance mode.
+   Disable the "Put site into maintenance mode" checkbox and save the
+   configuration.
+
+MAJOR VERSION UPGRADE
+---------------------
+To upgrade from a previous major version of Drupal to Drupal 7.x, after
+following the instructions in the INTRODUCTION section at the top of this file:
+
+1. Check on the Drupal 7 status of your contributed and custom modules and
+   themes. See http://drupal.org/node/948216 for information on upgrading
+   contributed modules and themes. See http://drupal.org/node/895314 for a list
+   of modules that have been moved into core for Drupal 7, and instructions on
+   how to update them. See http://drupal.org/update/modules for information on
+   how to update your custom modules, and http://drupal.org/update/theme for
+   custom themes.
+
+   You may decide at this point that you cannot upgrade your site, because
+   needed modules or themes are not ready for Drupal 7.
+
+2. Update to the latest available version of Drupal 6.x (if your current version
+   is Drupal 5.x, you have to upgrade to 6.x first). If you need to update,
+   download Drupal 6.x and follow the instructions in its UPGRADE.txt. This
+   document only applies for upgrades from 6.x to 7.x.
+
+3. In addition to updating to the latest available version of Drupal 6.x core,
+   you must also upgrade all of your contributed modules for Drupal to their
+   latest Drupal 6.x versions.
+
+4. Log in as user ID 1 (the site maintenance user).
+
+5. Go to Administer > Site configuration > Site maintenance. Select
+   "Off-line" and save the configuration.
+
+6. Go to Administer > Site building > Themes. Enable "Garland" and select it as
+   the default theme.
+
+7. Go to Administer > Site building > Modules. Disable all modules that are not
+   listed under "Core - required" or "Core - optional". It is possible that some
+   modules cannot be disabled, because others depend on them. Repeat this step
+   until all non-core modules are disabled.
+
+   If you know that you will not re-enable some modules for Drupal 7.x and you
+   no longer need their data, then you can uninstall them under the Uninstall
+   tab after disabling them.
+
+8. On the command line or in your FTP client, remove the file
+
+     sites/default/default.settings.php
+
+9. Remove all old core files and directories, except for the 'sites' directory
+   and any custom files you added elsewhere.
+
+   If you made modifications to files like .htaccess or robots.txt, you will
+   need to re-apply them from your backup, after the new files are in place.
+
+10. If you uninstalled any modules, remove them from the sites/all/modules and
+   other sites/*/modules directories. Leave other modules in place, even though
+   they are incompatible with Drupal 7.x.
+
+11. Download the latest Drupal 7.x release from http://drupal.org to a
+   directory outside of your web root. Extract the archive and copy the files
+   into your Drupal directory.
+
+   On a typical Unix/Linux command line, use the following commands to download
+   and extract:
+
+     wget http://drupal.org/files/projects/drupal-x.y.tar.gz
+     tar -zxvf drupal-x.y.tar.gz
+
+   This creates a new directory drupal-x.y/ containing all Drupal files and
+   directories. Copy the files into your Drupal installation directory:
+
+     cp -R drupal-x.y/* drupal-x.y/.htaccess /path/to/your/installation
+
+   If you do not have command line access to your server, download the archive
+   from http://drupal.org using your web browser, extract it, and then use an
+   FTP client to upload the files to your web root.
+
+12. Re-apply any modifications to files such as .htaccess or robots.txt.
+
+13. Make your settings.php file writeable, so that the update process can
+   convert it to the format of Drupal 7.x. settings.php is usually located in
+
+     sites/default/settings.php
+
+14. Run update.php by visiting http://www.example.com/update.php (replace
+   www.example.com with your domain name). This will update the core database
+   tables.
+
+   If you are unable to access update.php do the following:
+
+   - Open settings.php with a text editor.
+
+   - Find the line that says:
+     $update_free_access = FALSE;
+
+   - Change it into:
+     $update_free_access = TRUE;
+
+   - Once the upgrade is done, $update_free_access must be reverted to FALSE.
+
+15. Backup your database after the core upgrade has run.
+
+16. Replace and update your non-core modules and themes, following the
+   procedures at http://drupal.org/node/948216
+
+17. Go to Administration > Reports > Status report. Verify that everything is
+   working as expected.
+
+18. Ensure that $update_free_access is FALSE in settings.php.
+
+19. Go to Administration > Configuration > Development > Maintenance mode.
+   Disable the "Put site into maintenance mode" checkbox and save the
+   configuration.
+
+To get started with Drupal 7 administration, visit
+http://drupal.org/getting-started/7/admin
diff --git a/htmltest/aagbokpat b/htmltest/aagbokpat
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/aagbokpat
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/accueil b/htmltest/accueil
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/accueil
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/adeprey b/htmltest/adeprey
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/adeprey
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/agora b/htmltest/agora
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/agora
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/annales b/htmltest/annales
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/annales
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/annalestest b/htmltest/annalestest
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/annalestest
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/anomaliste b/htmltest/anomaliste
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/anomaliste
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/aoudad b/htmltest/aoudad
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/aoudad
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/apocaliste b/htmltest/apocaliste
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/apocaliste
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/authorize.php b/htmltest/authorize.php
new file mode 100644
index 00000000..3ea2b20a
--- /dev/null
+++ b/htmltest/authorize.php
@@ -0,0 +1,174 @@
+<?php
+
+/**
+ * @file
+ * Administrative script for running authorized file operations.
+ *
+ * Using this script, the site owner (the user actually owning the files on the
+ * webserver) can authorize certain file-related operations to proceed with
+ * elevated privileges, for example to deploy and upgrade modules or themes.
+ * Users should not visit this page directly, but instead use an administrative
+ * user interface which knows how to redirect the user to this script as part of
+ * a multistep process. This script actually performs the selected operations
+ * without loading all of Drupal, to be able to more gracefully recover from
+ * errors. Access to the script is controlled by a global killswitch in
+ * settings.php ('allow_authorize_operations') and via the 'administer software
+ * updates' permission.
+ *
+ * There are helper functions for setting up an operation to run via this
+ * system in modules/system/system.module. For more information, see:
+ * @link authorize Authorized operation helper functions @endlink
+ */
+
+/**
+ * Defines the root directory of the Drupal installation.
+ */
+define('DRUPAL_ROOT', getcwd());
+
+/**
+ * Global flag to identify update.php and authorize.php runs.
+ *
+ * Identifies update.php and authorize.php runs, avoiding unwanted operations
+ * such as hook_init() and hook_exit() invokes, css/js preprocessing and
+ * translation, and solves some theming issues. The flag is checked in other
+ * places in Drupal code (not just authorize.php).
+ */
+define('MAINTENANCE_MODE', 'update');
+
+/**
+ * Renders a 403 access denied page for authorize.php.
+ */
+function authorize_access_denied_page() {
+  drupal_add_http_header('Status', '403 Forbidden');
+  watchdog('access denied', 'authorize.php', NULL, WATCHDOG_WARNING);
+  drupal_set_title('Access denied');
+  return t('You are not allowed to access this page.');
+}
+
+/**
+ * Determines if the current user is allowed to run authorize.php.
+ *
+ * The killswitch in settings.php overrides all else, otherwise, the user must
+ * have access to the 'administer software updates' permission.
+ *
+ * @return
+ *   TRUE if the current user can run authorize.php, and FALSE if not.
+ */
+function authorize_access_allowed() {
+  return variable_get('allow_authorize_operations', TRUE) && user_access('administer software updates');
+}
+
+// *** Real work of the script begins here. ***
+
+require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
+require_once DRUPAL_ROOT . '/includes/common.inc';
+require_once DRUPAL_ROOT . '/includes/file.inc';
+require_once DRUPAL_ROOT . '/includes/module.inc';
+require_once DRUPAL_ROOT . '/includes/ajax.inc';
+
+// We prepare only a minimal bootstrap. This includes the database and
+// variables, however, so we have access to the class autoloader registry.
+drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION);
+
+// This must go after drupal_bootstrap(), which unsets globals!
+global $conf;
+
+// We have to enable the user and system modules, even to check access and
+// display errors via the maintenance theme.
+$module_list['system']['filename'] = 'modules/system/system.module';
+$module_list['user']['filename'] = 'modules/user/user.module';
+module_list(TRUE, FALSE, FALSE, $module_list);
+drupal_load('module', 'system');
+drupal_load('module', 'user');
+
+// We also want to have the language system available, but we do *NOT* want to
+// actually call drupal_bootstrap(DRUPAL_BOOTSTRAP_LANGUAGE), since that would
+// also force us through the DRUPAL_BOOTSTRAP_PAGE_HEADER phase, which loads
+// all the modules, and that's exactly what we're trying to avoid.
+drupal_language_initialize();
+
+// Initialize the maintenance theme for this administrative script.
+drupal_maintenance_theme();
+
+$output = '';
+$show_messages = TRUE;
+
+if (authorize_access_allowed()) {
+  // Load both the Form API and Batch API.
+  require_once DRUPAL_ROOT . '/includes/form.inc';
+  require_once DRUPAL_ROOT . '/includes/batch.inc';
+  // Load the code that drives the authorize process.
+  require_once DRUPAL_ROOT . '/includes/authorize.inc';
+
+  // For the sake of Batch API and a few other low-level functions, we need to
+  // initialize the URL path into $_GET['q']. However, we do not want to raise
+  // our bootstrap level, nor do we want to call drupal_initialize_path(),
+  // since that is assuming that modules are loaded and invoking hooks.
+  // However, all we really care is if we're in the middle of a batch, in which
+  // case $_GET['q'] will already be set, we just initialize it to an empty
+  // string if it's not already defined.
+  if (!isset($_GET['q'])) {
+    $_GET['q'] = '';
+  }
+
+  if (isset($_SESSION['authorize_operation']['page_title'])) {
+    drupal_set_title($_SESSION['authorize_operation']['page_title']);
+  }
+  else {
+    drupal_set_title(t('Authorize file system changes'));
+  }
+
+  // See if we've run the operation and need to display a report.
+  if (isset($_SESSION['authorize_results']) && $results = $_SESSION['authorize_results']) {
+
+    // Clear the session out.
+    unset($_SESSION['authorize_results']);
+    unset($_SESSION['authorize_operation']);
+    unset($_SESSION['authorize_filetransfer_info']);
+
+    if (!empty($results['page_title'])) {
+      drupal_set_title($results['page_title']);
+    }
+    if (!empty($results['page_message'])) {
+      drupal_set_message($results['page_message']['message'], $results['page_message']['type']);
+    }
+
+    $output = theme('authorize_report', array('messages' => $results['messages']));
+
+    $links = array();
+    if (is_array($results['tasks'])) {
+      $links += $results['tasks'];
+    }
+    else {
+      $links = array_merge($links, array(
+        l(t('Administration pages'), 'admin'),
+        l(t('Front page'), '<front>'),
+      ));
+    }
+
+    $output .= theme('item_list', array('items' => $links, 'title' => t('Next steps')));
+  }
+  // If a batch is running, let it run.
+  elseif (isset($_GET['batch'])) {
+    $output = _batch_page();
+  }
+  else {
+    if (empty($_SESSION['authorize_operation']) || empty($_SESSION['authorize_filetransfer_info'])) {
+      $output = t('It appears you have reached this page in error.');
+    }
+    elseif (!$batch = batch_get()) {
+      // We have a batch to process, show the filetransfer form.
+      $elements = drupal_get_form('authorize_filetransfer_form');
+      $output = drupal_render($elements);
+    }
+  }
+  // We defer the display of messages until all operations are done.
+  $show_messages = !(($batch = batch_get()) && isset($batch['running']));
+}
+else {
+  $output = authorize_access_denied_page();
+}
+
+if (!empty($output)) {
+  print theme('update_page', array('content' => $output, 'show_messages' => $show_messages));
+}
diff --git a/htmltest/bcoissac b/htmltest/bcoissac
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/bcoissac
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/bda b/htmltest/bda
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/bda
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/bde b/htmltest/bde
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/bde
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/bds b/htmltest/bds
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/bds
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/bphanluong b/htmltest/bphanluong
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/bphanluong
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/bsanchez-pin b/htmltest/bsanchez-pin
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/bsanchez-pin
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/bspeziale b/htmltest/bspeziale
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/bspeziale
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/cac13 b/htmltest/cac13
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/cac13
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/camara b/htmltest/camara
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/camara
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/cdechy b/htmltest/cdechy
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/cdechy
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/centralefightclub b/htmltest/centralefightclub
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/centralefightclub
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/chaasfrangi b/htmltest/chaasfrangi
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/chaasfrangi
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/charlist b/htmltest/charlist
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/charlist
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/cheer-up b/htmltest/cheer-up
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/cheer-up
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/clubfinance b/htmltest/clubfinance
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/clubfinance
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/clubrobot b/htmltest/clubrobot
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/clubrobot
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/cron.php b/htmltest/cron.php
new file mode 100644
index 00000000..c6ce5317
--- /dev/null
+++ b/htmltest/cron.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Handles incoming requests to fire off regularly-scheduled tasks (cron jobs).
+ */
+
+/**
+ * Root directory of Drupal installation.
+ */
+define('DRUPAL_ROOT', getcwd());
+
+include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
+drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+
+if (!isset($_GET['cron_key']) || variable_get('cron_key', 'drupal') != $_GET['cron_key']) {
+  watchdog('cron', 'Cron could not run because an invalid key was used.', array(), WATCHDOG_NOTICE);
+  drupal_access_denied();
+}
+elseif (variable_get('maintenance_mode', 0)) {
+  watchdog('cron', 'Cron could not run because the site is in maintenance mode.', array(), WATCHDOG_NOTICE);
+  drupal_access_denied();
+}
+else {
+  drupal_cron_run();
+}
diff --git a/htmltest/echangesphoceens b/htmltest/echangesphoceens
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/echangesphoceens
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/ecmnext b/htmltest/ecmnext
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/ecmnext
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/election b/htmltest/election
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/election
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/elepagetest b/htmltest/elepagetest
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/elepagetest
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/eluseleves b/htmltest/eluseleves
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/eluseleves
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/emath b/htmltest/emath
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/emath
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/eptest b/htmltest/eptest
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/eptest
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/ercm b/htmltest/ercm
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/ercm
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/etorri b/htmltest/etorri
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/etorri
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/expat b/htmltest/expat
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/expat
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/fablab b/htmltest/fablab
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/fablab
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/foceentest b/htmltest/foceentest
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/foceentest
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/ftorregrosa b/htmltest/ftorregrosa
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/ftorregrosa
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/ftorregrosatest b/htmltest/ftorregrosatest
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/ftorregrosatest
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/gala b/htmltest/gala
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/gala
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/ggaydier b/htmltest/ggaydier
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/ggaydier
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/ginfo b/htmltest/ginfo
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/ginfo
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/greigniertest b/htmltest/greigniertest
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/greigniertest
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/icm b/htmltest/icm
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/icm
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/includes/actions.inc b/htmltest/includes/actions.inc
new file mode 100644
index 00000000..ed43af4f
--- /dev/null
+++ b/htmltest/includes/actions.inc
@@ -0,0 +1,388 @@
+<?php
+
+/**
+ * @file
+ * This is the actions engine for executing stored actions.
+ */
+
+/**
+ * @defgroup actions Actions
+ * @{
+ * Functions that perform an action on a certain system object.
+ *
+ * Action functions are declared by modules by implementing hook_action_info().
+ * Modules can cause action functions to run by calling actions_do(), and
+ * trigger.module provides a user interface that lets administrators define
+ * events that cause action functions to run.
+ *
+ * Each action function takes two to four arguments:
+ * - $entity: The object that the action acts on, such as a node, comment, or
+ *   user.
+ * - $context: Array of additional information about what triggered the action.
+ * - $a1, $a2: Optional additional information, which can be passed into
+ *   actions_do() and will be passed along to the action function.
+ *
+ * @}
+ */
+
+/**
+ * Performs a given list of actions by executing their callback functions.
+ *
+ * Given the IDs of actions to perform, this function finds out what the
+ * callback functions for the actions are by querying the database. Then
+ * it calls each callback using the function call $function($object, $context,
+ * $a1, $a2), passing the input arguments of this function (see below) to the
+ * action function.
+ *
+ * @param $action_ids
+ *   The IDs of the actions to perform. Can be a single action ID or an array
+ *   of IDs. IDs of configurable actions must be given as numeric action IDs;
+ *   IDs of non-configurable actions may be given as action function names.
+ * @param $object
+ *   The object that the action will act on: a node, user, or comment object.
+ * @param $context
+ *   Associative array containing extra information about what triggered
+ *   the action call, with $context['hook'] giving the name of the hook
+ *   that resulted in this call to actions_do().
+ * @param $a1
+ *   Passed along to the callback.
+ * @param $a2
+ *   Passed along to the callback.
+ *
+ * @return
+ *   An associative array containing the results of the functions that
+ *   perform the actions, keyed on action ID.
+ *
+ * @ingroup actions
+ */
+function actions_do($action_ids, $object = NULL, $context = NULL, $a1 = NULL, $a2 = NULL) {
+  // $stack tracks the number of recursive calls.
+  static $stack;
+  $stack++;
+  if ($stack > variable_get('actions_max_stack', 35)) {
+    watchdog('actions', 'Stack overflow: too many calls to actions_do(). Aborting to prevent infinite recursion.', array(), WATCHDOG_ERROR);
+    return;
+  }
+  $actions = array();
+  $available_actions = actions_list();
+  $actions_result = array();
+  if (is_array($action_ids)) {
+    $conditions = array();
+    foreach ($action_ids as $action_id) {
+      if (is_numeric($action_id)) {
+        $conditions[] = $action_id;
+      }
+      elseif (isset($available_actions[$action_id])) {
+        $actions[$action_id] = $available_actions[$action_id];
+      }
+    }
+
+    // When we have action instances we must go to the database to retrieve
+    // instance data.
+    if (!empty($conditions)) {
+      $query = db_select('actions');
+      $query->addField('actions', 'aid');
+      $query->addField('actions', 'type');
+      $query->addField('actions', 'callback');
+      $query->addField('actions', 'parameters');
+      $query->condition('aid', $conditions, 'IN');
+      $result = $query->execute();
+      foreach ($result as $action) {
+        $actions[$action->aid] = $action->parameters ? unserialize($action->parameters) : array();
+        $actions[$action->aid]['callback'] = $action->callback;
+        $actions[$action->aid]['type'] = $action->type;
+      }
+    }
+
+    // Fire actions, in no particular order.
+    foreach ($actions as $action_id => $params) {
+      // Configurable actions need parameters.
+      if (is_numeric($action_id)) {
+        $function = $params['callback'];
+        if (function_exists($function)) {
+          $context = array_merge($context, $params);
+          $actions_result[$action_id] = $function($object, $context, $a1, $a2);
+        }
+        else {
+          $actions_result[$action_id] = FALSE;
+        }
+      }
+      // Singleton action; $action_id is the function name.
+      else {
+        $actions_result[$action_id] = $action_id($object, $context, $a1, $a2);
+      }
+    }
+  }
+  // Optimized execution of a single action.
+  else {
+    // If it's a configurable action, retrieve stored parameters.
+    if (is_numeric($action_ids)) {
+      $action = db_query("SELECT callback, parameters FROM {actions} WHERE aid = :aid", array(':aid' => $action_ids))->fetchObject();
+      $function = $action->callback;
+      if (function_exists($function)) {
+        $context = array_merge($context, unserialize($action->parameters));
+        $actions_result[$action_ids] = $function($object, $context, $a1, $a2);
+      }
+      else {
+        $actions_result[$action_ids] = FALSE;
+      }
+    }
+    // Singleton action; $action_ids is the function name.
+    else {
+      if (function_exists($action_ids)) {
+        $actions_result[$action_ids] = $action_ids($object, $context, $a1, $a2);
+      }
+      else {
+        // Set to avoid undefined index error messages later.
+        $actions_result[$action_ids] = FALSE;
+      }
+    }
+  }
+  $stack--;
+  return $actions_result;
+}
+
+/**
+ * Discovers all available actions by invoking hook_action_info().
+ *
+ * This function contrasts with actions_get_all_actions(); see the
+ * documentation of actions_get_all_actions() for an explanation.
+ *
+ * @param $reset
+ *   Reset the action info static cache.
+ *
+ * @return
+ *   An associative array keyed on action function name, with the same format
+ *   as the return value of hook_action_info(), containing all
+ *   modules' hook_action_info() return values as modified by any
+ *   hook_action_info_alter() implementations.
+ *
+ * @see hook_action_info()
+ */
+function actions_list($reset = FALSE) {
+  $actions = &drupal_static(__FUNCTION__);
+  if (!isset($actions) || $reset) {
+    $actions = module_invoke_all('action_info');
+    drupal_alter('action_info', $actions);
+  }
+
+  // See module_implements() for an explanation of this cast.
+  return (array) $actions;
+}
+
+/**
+ * Retrieves all action instances from the database.
+ *
+ * This function differs from the actions_list() function, which gathers
+ * actions by invoking hook_action_info(). The actions returned by this
+ * function and the actions returned by actions_list() are partially
+ * synchronized. Non-configurable actions from hook_action_info()
+ * implementations are put into the database when actions_synchronize() is
+ * called, which happens when admin/config/system/actions is visited.
+ * Configurable actions are not added to the database until they are configured
+ * in the user interface, in which case a database row is created for each
+ * configuration of each action.
+ *
+ * @return
+ *   Associative array keyed by numeric action ID. Each value is an associative
+ *   array with keys 'callback', 'label', 'type' and 'configurable'.
+ */
+function actions_get_all_actions() {
+  $actions = db_query("SELECT aid, type, callback, parameters, label FROM {actions}")->fetchAllAssoc('aid', PDO::FETCH_ASSOC);
+  foreach ($actions as &$action) {
+    $action['configurable'] = (bool) $action['parameters'];
+    unset($action['parameters']);
+    unset($action['aid']);
+  }
+  return $actions;
+}
+
+/**
+ * Creates an associative array keyed by hashes of function names or IDs.
+ *
+ * Hashes are used to prevent actual function names from going out into HTML
+ * forms and coming back.
+ *
+ * @param $actions
+ *   An associative array with function names or action IDs as keys
+ *   and associative arrays with keys 'label', 'type', etc. as values.
+ *   This is usually the output of actions_list() or actions_get_all_actions().
+ *
+ * @return
+ *   An associative array whose keys are hashes of the input array keys, and
+ *   whose corresponding values are associative arrays with components
+ *   'callback', 'label', 'type', and 'configurable' from the input array.
+ */
+function actions_actions_map($actions) {
+  $actions_map = array();
+  foreach ($actions as $callback => $array) {
+    $key = drupal_hash_base64($callback);
+    $actions_map[$key]['callback']     = isset($array['callback']) ? $array['callback'] : $callback;
+    $actions_map[$key]['label']        = $array['label'];
+    $actions_map[$key]['type']         = $array['type'];
+    $actions_map[$key]['configurable'] = $array['configurable'];
+  }
+  return $actions_map;
+}
+
+/**
+ * Returns an action array key (function or ID), given its hash.
+ *
+ * Faster than actions_actions_map() when you only need the function name or ID.
+ *
+ * @param $hash
+ *   Hash of a function name or action ID array key. The array key
+ *   is a key into the return value of actions_list() (array key is the action
+ *   function name) or actions_get_all_actions() (array key is the action ID).
+ *
+ * @return
+ *   The corresponding array key, or FALSE if no match is found.
+ */
+function actions_function_lookup($hash) {
+  // Check for a function name match.
+  $actions_list = actions_list();
+  foreach ($actions_list as $function => $array) {
+    if (drupal_hash_base64($function) == $hash) {
+      return $function;
+    }
+  }
+  $aid = FALSE;
+  // Must be a configurable action; check database.
+  $result = db_query("SELECT aid FROM {actions} WHERE parameters <> ''")->fetchAll(PDO::FETCH_ASSOC);
+  foreach ($result as $row) {
+    if (drupal_hash_base64($row['aid']) == $hash) {
+      $aid = $row['aid'];
+      break;
+    }
+  }
+  return $aid;
+}
+
+/**
+ * Synchronizes actions that are provided by modules in hook_action_info().
+ *
+ * Actions provided by modules in hook_action_info() implementations are
+ * synchronized with actions that are stored in the actions database table.
+ * This is necessary so that actions that do not require configuration can
+ * receive action IDs.
+ *
+ * @param $delete_orphans
+ *   If TRUE, any actions that exist in the database but are no longer
+ *   found in the code (for example, because the module that provides them has
+ *   been disabled) will be deleted.
+ */
+function actions_synchronize($delete_orphans = FALSE) {
+  $actions_in_code = actions_list(TRUE);
+  $actions_in_db = db_query("SELECT aid, callback, label FROM {actions} WHERE parameters = ''")->fetchAllAssoc('callback', PDO::FETCH_ASSOC);
+
+  // Go through all the actions provided by modules.
+  foreach ($actions_in_code as $callback => $array) {
+    // Ignore configurable actions since their instances get put in when the
+    // user adds the action.
+    if (!$array['configurable']) {
+      // If we already have an action ID for this action, no need to assign aid.
+      if (isset($actions_in_db[$callback])) {
+        unset($actions_in_db[$callback]);
+      }
+      else {
+        // This is a new singleton that we don't have an aid for; assign one.
+        db_insert('actions')
+          ->fields(array(
+            'aid' => $callback,
+            'type' => $array['type'],
+            'callback' => $callback,
+            'parameters' => '',
+            'label' => $array['label'],
+            ))
+          ->execute();
+        watchdog('actions', "Action '%action' added.", array('%action' => $array['label']));
+      }
+    }
+  }
+
+  // Any actions that we have left in $actions_in_db are orphaned.
+  if ($actions_in_db) {
+    $orphaned = array_keys($actions_in_db);
+
+    if ($delete_orphans) {
+      $actions = db_query('SELECT aid, label FROM {actions} WHERE callback IN (:orphaned)', array(':orphaned' => $orphaned))->fetchAll();
+      foreach ($actions as $action) {
+        actions_delete($action->aid);
+        watchdog('actions', "Removed orphaned action '%action' from database.", array('%action' => $action->label));
+      }
+    }
+    else {
+      $link = l(t('Remove orphaned actions'), 'admin/config/system/actions/orphan');
+      $count = count($actions_in_db);
+      $orphans = implode(', ', $orphaned);
+      watchdog('actions', '@count orphaned actions (%orphans) exist in the actions table. !link', array('@count' => $count, '%orphans' => $orphans, '!link' => $link), WATCHDOG_INFO);
+    }
+  }
+}
+
+/**
+ * Saves an action and its user-supplied parameter values to the database.
+ *
+ * @param $function
+ *   The name of the function to be called when this action is performed.
+ * @param $type
+ *   The type of action, to describe grouping and/or context, e.g., 'node',
+ *   'user', 'comment', or 'system'.
+ * @param $params
+ *   An associative array with parameter names as keys and parameter values as
+ *   values.
+ * @param $label
+ *   A user-supplied label of this particular action, e.g., 'Send e-mail
+ *   to Jim'.
+ * @param $aid
+ *   The ID of this action. If omitted, a new action is created.
+ *
+ * @return
+ *   The ID of the action.
+ */
+function actions_save($function, $type, $params, $label, $aid = NULL) {
+  // aid is the callback for singleton actions so we need to keep a separate
+  // table for numeric aids.
+  if (!$aid) {
+    $aid = db_next_id();
+  }
+
+  db_merge('actions')
+    ->key(array('aid' => $aid))
+    ->fields(array(
+      'callback' => $function,
+      'type' => $type,
+      'parameters' => serialize($params),
+      'label' => $label,
+    ))
+    ->execute();
+
+  watchdog('actions', 'Action %action saved.', array('%action' => $label));
+  return $aid;
+}
+
+/**
+ * Retrieves a single action from the database.
+ *
+ * @param $aid
+ *   The ID of the action to retrieve.
+ *
+ * @return
+ *   The appropriate action row from the database as an object.
+ */
+function actions_load($aid) {
+  return db_query("SELECT aid, type, callback, parameters, label FROM {actions} WHERE aid = :aid", array(':aid' => $aid))->fetchObject();
+}
+
+/**
+ * Deletes a single action from the database.
+ *
+ * @param $aid
+ *   The ID of the action to delete.
+ */
+function actions_delete($aid) {
+  db_delete('actions')
+    ->condition('aid', $aid)
+    ->execute();
+  module_invoke_all('actions_delete', $aid);
+}
diff --git a/htmltest/includes/ajax.inc b/htmltest/includes/ajax.inc
new file mode 100644
index 00000000..ab0111ce
--- /dev/null
+++ b/htmltest/includes/ajax.inc
@@ -0,0 +1,1212 @@
+<?php
+
+/**
+ * @file
+ * Functions for use with Drupal's Ajax framework.
+ */
+
+/**
+ * @defgroup ajax Ajax framework
+ * @{
+ * Functions for Drupal's Ajax framework.
+ *
+ * Drupal's Ajax framework is used to dynamically update parts of a page's HTML
+ * based on data from the server. Upon a specified event, such as a button
+ * click, a callback function is triggered which performs server-side logic and
+ * may return updated markup, which is then replaced on-the-fly with no page
+ * refresh necessary.
+ *
+ * This framework creates a PHP macro language that allows the server to
+ * instruct JavaScript to perform actions on the client browser. When using
+ * forms, it can be used with the #ajax property.
+ * The #ajax property can be used to bind events to the Ajax framework. By
+ * default, #ajax uses 'system/ajax' as its path for submission and thus calls
+ * ajax_form_callback() and a defined #ajax['callback'] function.
+ * However, you may optionally specify a different path to request or a
+ * different callback function to invoke, which can return updated HTML or can
+ * also return a richer set of
+ * @link ajax_commands Ajax framework commands @endlink.
+ *
+ * Standard form handling is as follows:
+ *   - A form element has a #ajax property that includes #ajax['callback'] and
+ *     omits #ajax['path']. See below about using #ajax['path'] to implement
+ *     advanced use-cases that require something other than standard form
+ *     handling.
+ *   - On the specified element, Ajax processing is triggered by a change to
+ *     that element.
+ *   - The browser submits an HTTP POST request to the 'system/ajax' Drupal
+ *     path.
+ *   - The menu page callback for 'system/ajax', ajax_form_callback(), calls
+ *     drupal_process_form() to process the form submission and rebuild the
+ *     form if necessary. The form is processed in much the same way as if it
+ *     were submitted without Ajax, with the same #process functions and
+ *     validation and submission handlers called in either case, making it easy
+ *     to create Ajax-enabled forms that degrade gracefully when JavaScript is
+ *     disabled.
+ *   - After form processing is complete, ajax_form_callback() calls the
+ *     function named by #ajax['callback'], which returns the form element that
+ *     has been updated and needs to be returned to the browser, or
+ *     alternatively, an array of custom Ajax commands.
+ *   - The page delivery callback for 'system/ajax', ajax_deliver(), renders the
+ *     element returned by #ajax['callback'], and returns the JSON string
+ *     created by ajax_render() to the browser.
+ *   - The browser unserializes the returned JSON string into an array of
+ *     command objects and executes each command, resulting in the old page
+ *     content within and including the HTML element specified by
+ *     #ajax['wrapper'] being replaced by the new content returned by
+ *     #ajax['callback'], using a JavaScript animation effect specified by
+ *     #ajax['effect'].
+ *
+ * A simple example of basic Ajax use from the
+ * @link http://drupal.org/project/examples Examples module @endlink follows:
+ * @code
+ * function main_page() {
+ *   return drupal_get_form('ajax_example_simplest');
+ * }
+ *
+ * function ajax_example_simplest($form, &$form_state) {
+ *   $form = array();
+ *   $form['changethis'] = array(
+ *     '#type' => 'select',
+ *     '#options' => array(
+ *       'one' => 'one',
+ *       'two' => 'two',
+ *       'three' => 'three',
+ *     ),
+ *     '#ajax' => array(
+ *       'callback' => 'ajax_example_simplest_callback',
+ *       'wrapper' => 'replace_textfield_div',
+ *      ),
+ *   );
+
+ *   // This entire form element will be replaced with an updated value.
+ *   $form['replace_textfield'] = array(
+ *     '#type' => 'textfield',
+ *     '#title' => t("The default value will be changed"),
+ *     '#description' => t("Say something about why you chose") . "'" .
+ *       (!empty($form_state['values']['changethis'])
+ *       ? $form_state['values']['changethis'] : t("Not changed yet")) . "'",
+ *     '#prefix' => '<div id="replace_textfield_div">',
+ *     '#suffix' => '</div>',
+ *   );
+ *   return $form;
+ * }
+ *
+ * function ajax_example_simplest_callback($form, $form_state) {
+ *   // The form has already been submitted and updated. We can return the replaced
+ *   // item as it is.
+ *   return $form['replace_textfield'];
+ * }
+ * @endcode
+ *
+ * In the above example, the 'changethis' element is Ajax-enabled. The default
+ * #ajax['event'] is 'change', so when the 'changethis' element changes,
+ * an Ajax call is made. The form is submitted and reprocessed, and then the
+ * callback is called. In this case, the form has been automatically
+ * built changing $form['replace_textfield']['#description'], so the callback
+ * just returns that part of the form.
+ *
+ * To implement Ajax handling in a form, add '#ajax' to the form
+ * definition of a field. That field will trigger an Ajax event when it is
+ * clicked (or changed, depending on the kind of field). #ajax supports
+ * the following parameters (either 'path' or 'callback' is required at least):
+ * - #ajax['callback']: The callback to invoke to handle the server side of the
+ *   Ajax event, which will receive a $form and $form_state as arguments, and
+ *   returns a renderable array (most often a form or form fragment), an HTML
+ *   string, or an array of Ajax commands. If returning a renderable array or
+ *   a string, the value will replace the original element named in
+ *   #ajax['wrapper'], and
+ *   theme_status_messages()
+ *   will be prepended to that
+ *   element. (If the status messages are not wanted, return an array
+ *   of Ajax commands instead.)
+ *   #ajax['wrapper']. If an array of Ajax commands is returned, it will be
+ *   executed by the calling code.
+ * - #ajax['path']: The menu path to use for the request. This is often omitted
+ *   and the default is used. This path should map
+ *   to a menu page callback that returns data using ajax_render(). Defaults to
+ *   'system/ajax', which invokes ajax_form_callback(), eventually calling
+ *   the function named in #ajax['callback']. If you use a custom
+ *   path, you must set up the menu entry and handle the entire callback in your
+ *   own code.
+ * - #ajax['wrapper']: The CSS ID of the area to be replaced by the content
+ *   returned by the #ajax['callback'] function. The content returned from
+ *   the callback will replace the entire element named by #ajax['wrapper'].
+ *   The wrapper is usually created using #prefix and #suffix properties in the
+ *   form. Note that this is the wrapper ID, not a CSS selector. So to replace
+ *   the element referred to by the CSS selector #some-selector on the page,
+ *   use #ajax['wrapper'] = 'some-selector', not '#some-selector'.
+ * - #ajax['effect']: The jQuery effect to use when placing the new HTML.
+ *   Defaults to no effect. Valid options are 'none', 'slide', or 'fade'.
+ * - #ajax['speed']: The effect speed to use. Defaults to 'slow'. May be
+ *   'slow', 'fast' or a number in milliseconds which represents the length
+ *   of time the effect should run.
+ * - #ajax['event']: The JavaScript event to respond to. This is normally
+ *   selected automatically for the type of form widget being used, and
+ *   is only needed if you need to override the default behavior.
+ * - #ajax['prevent']: A JavaScript event to prevent when 'event' is triggered.
+ *   Defaults to 'click' for #ajax on #type 'submit', 'button', and
+ *   'image_button'. Multiple events may be specified separated by spaces.
+ *   For example, when binding #ajax behaviors to form buttons, pressing the
+ *   ENTER key within a textfield triggers the 'click' event of the form's first
+ *   submit button. Triggering Ajax in this situation leads to problems, like
+ *   breaking autocomplete textfields. Because of that, Ajax behaviors are bound
+ *   to the 'mousedown' event on form buttons by default. However, binding to
+ *   'mousedown' rather than 'click' means that it is possible to trigger a
+ *   click by pressing the mouse, holding the mouse button down until the Ajax
+ *   request is complete and the button is re-enabled, and then releasing the
+ *   mouse button. For this case, 'prevent' can be set to 'click', so an
+ *   additional event handler is bound to prevent such a click from triggering a
+ *   non-Ajax form submission. This also prevents a textfield's ENTER press
+ *   triggering a button's non-Ajax form submission behavior.
+ * - #ajax['method']: The jQuery method to use to place the new HTML.
+ *   Defaults to 'replaceWith'. May be: 'replaceWith', 'append', 'prepend',
+ *   'before', 'after', or 'html'. See the
+ *   @link http://api.jquery.com/category/manipulation/ jQuery manipulators documentation @endlink
+ *   for more information on these methods.
+ * - #ajax['progress']: Choose either a throbber or progress bar that is
+ *   displayed while awaiting a response from the callback, and add an optional
+ *   message. Possible keys: 'type', 'message', 'url', 'interval'.
+ *   More information is available in the
+ *   @link forms_api_reference.html Form API Reference @endlink
+ *
+ * In addition to using Form API for doing in-form modification, Ajax may be
+ * enabled by adding classes to buttons and links. By adding the 'use-ajax'
+ * class to a link, the link will be loaded via an Ajax call. When using this
+ * method, the href of the link can contain '/nojs/' as part of the path. When
+ * the Ajax framework makes the request, it will convert this to '/ajax/'.
+ * The server is then able to easily tell if this request was made through an
+ * actual Ajax request or in a degraded state, and respond appropriately.
+ *
+ * Similarly, submit buttons can be given the class 'use-ajax-submit'. The
+ * form will then be submitted via Ajax to the path specified in the #action.
+ * Like the ajax-submit class above, this path will have '/nojs/' replaced with
+ * '/ajax/' so that the submit handler can tell if the form was submitted
+ * in a degraded state or not.
+ *
+ * When responding to Ajax requests, the server should do what it needs to do
+ * for that request, then create a commands array. This commands array will
+ * be converted to a JSON object and returned to the client, which will then
+ * iterate over the array and process it like a macro language.
+ *
+ * Each command item is an associative array which will be converted to a
+ * command object on the JavaScript side. $command_item['command'] is the type
+ * of command, e.g. 'alert' or 'replace', and will correspond to a method in the
+ * Drupal.ajax[command] space. The command array may contain any other data that
+ * the command needs to process, e.g. 'method', 'selector', 'settings', etc.
+ *
+ * Commands are usually created with a couple of helper functions, so they
+ * look like this:
+ * @code
+ *   $commands = array();
+ *   // Replace the content of '#object-1' on the page with 'some html here'.
+ *   $commands[] = ajax_command_replace('#object-1', 'some html here');
+ *   // Add a visual "changed" marker to the '#object-1' element.
+ *   $commands[] = ajax_command_changed('#object-1');
+ *   // Menu 'page callback' and #ajax['callback'] functions are supposed to
+ *   // return render arrays. If returning an Ajax commands array, it must be
+ *   // encapsulated in a render array structure.
+ *   return array('#type' => 'ajax', '#commands' => $commands);
+ * @endcode
+ *
+ * When returning an Ajax command array, it is often useful to have
+ * status messages rendered along with other tasks in the command array.
+ * In that case the the Ajax commands array may be constructed like this:
+ * @code
+ *   $commands = array();
+ *   $commands[] = ajax_command_replace(NULL, $output);
+ *   $commands[] = ajax_command_prepend(NULL, theme('status_messages'));
+ *   return array('#type' => 'ajax', '#commands' => $commands);
+ * @endcode
+ *
+ * See @link ajax_commands Ajax framework commands @endlink
+ */
+
+/**
+ * Renders a commands array into JSON.
+ *
+ * @param $commands
+ *   A list of macro commands generated by the use of ajax_command_*()
+ *   functions.
+ */
+function ajax_render($commands = array()) {
+  // Ajax responses aren't rendered with html.tpl.php, so we have to call
+  // drupal_get_css() and drupal_get_js() here, in order to have new files added
+  // during this request to be loaded by the page. We only want to send back
+  // files that the page hasn't already loaded, so we implement simple diffing
+  // logic using array_diff_key().
+  foreach (array('css', 'js') as $type) {
+    // It is highly suspicious if $_POST['ajax_page_state'][$type] is empty,
+    // since the base page ought to have at least one JS file and one CSS file
+    // loaded. It probably indicates an error, and rather than making the page
+    // reload all of the files, instead we return no new files.
+    if (empty($_POST['ajax_page_state'][$type])) {
+      $items[$type] = array();
+    }
+    else {
+      $function = 'drupal_add_' . $type;
+      $items[$type] = $function();
+      drupal_alter($type, $items[$type]);
+      // @todo Inline CSS and JS items are indexed numerically. These can't be
+      //   reliably diffed with array_diff_key(), since the number can change
+      //   due to factors unrelated to the inline content, so for now, we strip
+      //   the inline items from Ajax responses, and can add support for them
+      //   when drupal_add_css() and drupal_add_js() are changed to use a hash
+      //   of the inline content as the array key.
+      foreach ($items[$type] as $key => $item) {
+        if (is_numeric($key)) {
+          unset($items[$type][$key]);
+        }
+      }
+      // Ensure that the page doesn't reload what it already has.
+      $items[$type] = array_diff_key($items[$type], $_POST['ajax_page_state'][$type]);
+    }
+  }
+
+  // Render the HTML to load these files, and add AJAX commands to insert this
+  // HTML in the page. We pass TRUE as the $skip_alter argument to prevent the
+  // data from being altered again, as we already altered it above. Settings are
+  // handled separately, afterwards.
+  if (isset($items['js']['settings'])) {
+    unset($items['js']['settings']);
+  }
+  $styles = drupal_get_css($items['css'], TRUE);
+  $scripts_footer = drupal_get_js('footer', $items['js'], TRUE);
+  $scripts_header = drupal_get_js('header', $items['js'], TRUE);
+
+  $extra_commands = array();
+  if (!empty($styles)) {
+    $extra_commands[] = ajax_command_prepend('head', $styles);
+  }
+  if (!empty($scripts_header)) {
+    $extra_commands[] = ajax_command_prepend('head', $scripts_header);
+  }
+  if (!empty($scripts_footer)) {
+    $extra_commands[] = ajax_command_append('body', $scripts_footer);
+  }
+  if (!empty($extra_commands)) {
+    $commands = array_merge($extra_commands, $commands);
+  }
+
+  // Now add a command to merge changes and additions to Drupal.settings.
+  $scripts = drupal_add_js();
+  if (!empty($scripts['settings'])) {
+    $settings = $scripts['settings'];
+    array_unshift($commands, ajax_command_settings(call_user_func_array('array_merge_recursive', $settings['data']), TRUE));
+  }
+
+  // Allow modules to alter any Ajax response.
+  drupal_alter('ajax_render', $commands);
+
+  return drupal_json_encode($commands);
+}
+
+/**
+ * Gets a form submitted via #ajax during an Ajax callback.
+ *
+ * This will load a form from the form cache used during Ajax operations. It
+ * pulls the form info from $_POST.
+ *
+ * @return
+ *   An array containing the $form and $form_state. Use the list() function
+ *   to break these apart:
+ *   @code
+ *     list($form, $form_state, $form_id, $form_build_id) = ajax_get_form();
+ *   @endcode
+ */
+function ajax_get_form() {
+  $form_state = form_state_defaults();
+
+  $form_build_id = $_POST['form_build_id'];
+
+  // Get the form from the cache.
+  $form = form_get_cache($form_build_id, $form_state);
+  if (!$form) {
+    // If $form cannot be loaded from the cache, the form_build_id in $_POST
+    // must be invalid, which means that someone performed a POST request onto
+    // system/ajax without actually viewing the concerned form in the browser.
+    // This is likely a hacking attempt as it never happens under normal
+    // circumstances, so we just do nothing.
+    watchdog('ajax', 'Invalid form POST data.', array(), WATCHDOG_WARNING);
+    drupal_exit();
+  }
+
+  // Since some of the submit handlers are run, redirects need to be disabled.
+  $form_state['no_redirect'] = TRUE;
+
+  // When a form is rebuilt after Ajax processing, its #build_id and #action
+  // should not change.
+  // @see drupal_rebuild_form()
+  $form_state['rebuild_info']['copy']['#build_id'] = TRUE;
+  $form_state['rebuild_info']['copy']['#action'] = TRUE;
+
+  // The form needs to be processed; prepare for that by setting a few internal
+  // variables.
+  $form_state['input'] = $_POST;
+  $form_id = $form['#form_id'];
+
+  return array($form, $form_state, $form_id, $form_build_id);
+}
+
+/**
+ * Menu callback; handles Ajax requests for the #ajax Form API property.
+ *
+ * This rebuilds the form from cache and invokes the defined #ajax['callback']
+ * to return an Ajax command structure for JavaScript. In case no 'callback' has
+ * been defined, nothing will happen.
+ *
+ * The Form API #ajax property can be set both for buttons and other input
+ * elements.
+ *
+ * This function is also the canonical example of how to implement
+ * #ajax['path']. If processing is required that cannot be accomplished with
+ * a callback, re-implement this function and set #ajax['path'] to the
+ * enhanced function.
+ *
+ * @see system_menu()
+ */
+function ajax_form_callback() {
+  list($form, $form_state) = ajax_get_form();
+  drupal_process_form($form['#form_id'], $form, $form_state);
+
+  // We need to return the part of the form (or some other content) that needs
+  // to be re-rendered so the browser can update the page with changed content.
+  // Since this is the generic menu callback used by many Ajax elements, it is
+  // up to the #ajax['callback'] function of the element (may or may not be a
+  // button) that triggered the Ajax request to determine what needs to be
+  // rendered.
+  if (!empty($form_state['triggering_element'])) {
+    $callback = $form_state['triggering_element']['#ajax']['callback'];
+  }
+  if (!empty($callback) && function_exists($callback)) {
+    return $callback($form, $form_state);
+  }
+}
+
+/**
+ * Theme callback for Ajax requests.
+ *
+ * Many different pages can invoke an Ajax request to system/ajax or another
+ * generic Ajax path. It is almost always desired for an Ajax response to be
+ * rendered using the same theme as the base page, because most themes are built
+ * with the assumption that they control the entire page, so if the CSS for two
+ * themes are both loaded for a given page, they may conflict with each other.
+ * For example, Bartik is Drupal's default theme, and Seven is Drupal's default
+ * administration theme. Depending on whether the "Use the administration theme
+ * when editing or creating content" checkbox is checked, the node edit form may
+ * be displayed in either theme, but the Ajax response to the Field module's
+ * "Add another item" button should be rendered using the same theme as the rest
+ * of the page. Therefore, system_menu() sets the 'theme callback' for
+ * 'system/ajax' to this function, and it is recommended that modules
+ * implementing other generic Ajax paths do the same.
+ *
+ * @see system_menu()
+ * @see file_menu()
+ */
+function ajax_base_page_theme() {
+  if (!empty($_POST['ajax_page_state']['theme']) && !empty($_POST['ajax_page_state']['theme_token'])) {
+    $theme = $_POST['ajax_page_state']['theme'];
+    $token = $_POST['ajax_page_state']['theme_token'];
+
+    // Prevent a request forgery from giving a person access to a theme they
+    // shouldn't be otherwise allowed to see. However, since everyone is allowed
+    // to see the default theme, token validation isn't required for that, and
+    // bypassing it allows most use-cases to work even when accessed from the
+    // page cache.
+    if ($theme === variable_get('theme_default', 'bartik') || drupal_valid_token($token, $theme)) {
+      return $theme;
+    }
+  }
+}
+
+/**
+ * Packages and sends the result of a page callback as an Ajax response.
+ *
+ * This function is the equivalent of drupal_deliver_html_page(), but for Ajax
+ * requests. Like that function, it:
+ * - Adds needed HTTP headers.
+ * - Prints rendered output.
+ * - Performs end-of-request tasks.
+ *
+ * @param $page_callback_result
+ *   The result of a page callback. Can be one of:
+ *   - NULL: to indicate no content.
+ *   - An integer menu status constant: to indicate an error condition.
+ *   - A string of HTML content.
+ *   - A renderable array of content.
+ *
+ * @see drupal_deliver_html_page()
+ */
+function ajax_deliver($page_callback_result) {
+  // Browsers do not allow JavaScript to read the contents of a user's local
+  // files. To work around that, the jQuery Form plugin submits forms containing
+  // a file input element to an IFRAME, instead of using XHR. Browsers do not
+  // normally expect JSON strings as content within an IFRAME, so the response
+  // must be customized accordingly.
+  // @see http://malsup.com/jquery/form/#file-upload
+  // @see Drupal.ajax.prototype.beforeSend()
+  $iframe_upload = !empty($_POST['ajax_iframe_upload']);
+
+  // Emit a Content-Type HTTP header if none has been added by the page callback
+  // or by a wrapping delivery callback.
+  if (is_null(drupal_get_http_header('Content-Type'))) {
+    if (!$iframe_upload) {
+      // Standard JSON can be returned to a browser's XHR object, and to
+      // non-browser user agents.
+      // @see http://www.ietf.org/rfc/rfc4627.txt?number=4627
+      drupal_add_http_header('Content-Type', 'application/json; charset=utf-8');
+    }
+    else {
+      // Browser IFRAMEs expect HTML. With most other content types, Internet
+      // Explorer presents the user with a download prompt.
+      drupal_add_http_header('Content-Type', 'text/html; charset=utf-8');
+    }
+  }
+
+  // Print the response.
+  $commands = ajax_prepare_response($page_callback_result);
+  $json = ajax_render($commands);
+  if (!$iframe_upload) {
+    // Standard JSON can be returned to a browser's XHR object, and to
+    // non-browser user agents.
+    print $json;
+  }
+  else {
+    // Browser IFRAMEs expect HTML. Browser extensions, such as Linkification
+    // and Skype's Browser Highlighter, convert URLs, phone numbers, etc. into
+    // links. This corrupts the JSON response. Protect the integrity of the
+    // JSON data by making it the value of a textarea.
+    // @see http://malsup.com/jquery/form/#file-upload
+    // @see http://drupal.org/node/1009382
+    print '<textarea>' . $json . '</textarea>';
+  }
+
+  // Perform end-of-request tasks.
+  ajax_footer();
+}
+
+/**
+ * Converts the return value of a page callback into an Ajax commands array.
+ *
+ * @param $page_callback_result
+ *   The result of a page callback. Can be one of:
+ *   - NULL: to indicate no content.
+ *   - An integer menu status constant: to indicate an error condition.
+ *   - A string of HTML content.
+ *   - A renderable array of content.
+ *
+ * @return
+ *   An Ajax commands array that can be passed to ajax_render().
+ */
+function ajax_prepare_response($page_callback_result) {
+  $commands = array();
+  if (!isset($page_callback_result)) {
+    // Simply delivering an empty commands array is sufficient. This results
+    // in the Ajax request being completed, but nothing being done to the page.
+  }
+  elseif (is_int($page_callback_result)) {
+    switch ($page_callback_result) {
+      case MENU_NOT_FOUND:
+        $commands[] = ajax_command_alert(t('The requested page could not be found.'));
+        break;
+
+      case MENU_ACCESS_DENIED:
+        $commands[] = ajax_command_alert(t('You are not authorized to access this page.'));
+        break;
+
+      case MENU_SITE_OFFLINE:
+        $commands[] = ajax_command_alert(filter_xss_admin(variable_get('maintenance_mode_message',
+          t('@site is currently under maintenance. We should be back shortly. Thank you for your patience.', array('@site' => variable_get('site_name', 'Drupal'))))));
+        break;
+    }
+  }
+  elseif (is_array($page_callback_result) && isset($page_callback_result['#type']) && ($page_callback_result['#type'] == 'ajax')) {
+    // Complex Ajax callbacks can return a result that contains an error message
+    // or a specific set of commands to send to the browser.
+    $page_callback_result += element_info('ajax');
+    $error = $page_callback_result['#error'];
+    if (isset($error) && $error !== FALSE) {
+      if ((empty($error) || $error === TRUE)) {
+        $error = t('An error occurred while handling the request: The server received invalid input.');
+      }
+      $commands[] = ajax_command_alert($error);
+    }
+    else {
+      $commands = $page_callback_result['#commands'];
+    }
+  }
+  else {
+    // Like normal page callbacks, simple Ajax callbacks can return HTML
+    // content, as a string or render array. This HTML is inserted in some
+    // relationship to #ajax['wrapper'], as determined by which jQuery DOM
+    // manipulation method is used. The method used is specified by
+    // #ajax['method']. The default method is 'replaceWith', which completely
+    // replaces the old wrapper element and its content with the new HTML.
+    $html = is_string($page_callback_result) ? $page_callback_result : drupal_render($page_callback_result);
+    $commands[] = ajax_command_insert(NULL, $html);
+    // Add the status messages inside the new content's wrapper element, so that
+    // on subsequent Ajax requests, it is treated as old content.
+    $commands[] = ajax_command_prepend(NULL, theme('status_messages'));
+  }
+
+  return $commands;
+}
+
+/**
+ * Performs end-of-Ajax-request tasks.
+ *
+ * This function is the equivalent of drupal_page_footer(), but for Ajax
+ * requests.
+ *
+ * @see drupal_page_footer()
+ */
+function ajax_footer() {
+  // Even for Ajax requests, invoke hook_exit() implementations. There may be
+  // modules that need very fast Ajax responses, and therefore, run Ajax
+  // requests with an early bootstrap.
+  if (drupal_get_bootstrap_phase() == DRUPAL_BOOTSTRAP_FULL && (!defined('MAINTENANCE_MODE') || MAINTENANCE_MODE != 'update')) {
+    module_invoke_all('exit');
+  }
+
+  // Commit the user session. See above comment about the possibility of this
+  // function running without session.inc loaded.
+  if (function_exists('drupal_session_commit')) {
+    drupal_session_commit();
+  }
+}
+
+/**
+ * Form element processing handler for the #ajax form property.
+ *
+ * @param $element
+ *   An associative array containing the properties of the element.
+ *
+ * @return
+ *   The processed element.
+ *
+ * @see ajax_pre_render_element()
+ */
+function ajax_process_form($element, &$form_state) {
+  $element = ajax_pre_render_element($element);
+  if (!empty($element['#ajax_processed'])) {
+    $form_state['cache'] = TRUE;
+  }
+  return $element;
+}
+
+/**
+ * Adds Ajax information about an element to communicate with JavaScript.
+ *
+ * If #ajax['path'] is set on an element, this additional JavaScript is added
+ * to the page header to attach the Ajax behaviors. See ajax.js for more
+ * information.
+ *
+ * @param $element
+ *   An associative array containing the properties of the element.
+ *   Properties used:
+ *   - #ajax['event']
+ *   - #ajax['prevent']
+ *   - #ajax['path']
+ *   - #ajax['options']
+ *   - #ajax['wrapper']
+ *   - #ajax['parameters']
+ *   - #ajax['effect']
+ *
+ * @return
+ *   The processed element with the necessary JavaScript attached to it.
+ */
+function ajax_pre_render_element($element) {
+  // Skip already processed elements.
+  if (isset($element['#ajax_processed'])) {
+    return $element;
+  }
+  // Initialize #ajax_processed, so we do not process this element again.
+  $element['#ajax_processed'] = FALSE;
+
+  // Nothing to do if there is neither a callback nor a path.
+  if (!(isset($element['#ajax']['callback']) || isset($element['#ajax']['path']))) {
+    return $element;
+  }
+
+  // Add a reasonable default event handler if none was specified.
+  if (isset($element['#ajax']) && !isset($element['#ajax']['event'])) {
+    switch ($element['#type']) {
+      case 'submit':
+      case 'button':
+      case 'image_button':
+        // Pressing the ENTER key within a textfield triggers the click event of
+        // the form's first submit button. Triggering Ajax in this situation
+        // leads to problems, like breaking autocomplete textfields, so we bind
+        // to mousedown instead of click.
+        // @see http://drupal.org/node/216059
+        $element['#ajax']['event'] = 'mousedown';
+        // Retain keyboard accessibility by setting 'keypress'. This causes
+        // ajax.js to trigger 'event' when SPACE or ENTER are pressed while the
+        // button has focus.
+        $element['#ajax']['keypress'] = TRUE;
+        // Binding to mousedown rather than click means that it is possible to
+        // trigger a click by pressing the mouse, holding the mouse button down
+        // until the Ajax request is complete and the button is re-enabled, and
+        // then releasing the mouse button. Set 'prevent' so that ajax.js binds
+        // an additional handler to prevent such a click from triggering a
+        // non-Ajax form submission. This also prevents a textfield's ENTER
+        // press triggering this button's non-Ajax form submission behavior.
+        if (!isset($element['#ajax']['prevent'])) {
+          $element['#ajax']['prevent'] = 'click';
+        }
+        break;
+
+      case 'password':
+      case 'textfield':
+      case 'textarea':
+        $element['#ajax']['event'] = 'blur';
+        break;
+
+      case 'radio':
+      case 'checkbox':
+      case 'select':
+        $element['#ajax']['event'] = 'change';
+        break;
+
+      case 'link':
+        $element['#ajax']['event'] = 'click';
+        break;
+
+      default:
+        return $element;
+    }
+  }
+
+  // Attach JavaScript settings to the element.
+  if (isset($element['#ajax']['event'])) {
+    $element['#attached']['library'][] = array('system', 'jquery.form');
+    $element['#attached']['library'][] = array('system', 'drupal.ajax');
+
+    $settings = $element['#ajax'];
+
+    // Assign default settings.
+    $settings += array(
+      'path' => 'system/ajax',
+      'options' => array(),
+    );
+
+    // @todo Legacy support. Remove in Drupal 8.
+    if (isset($settings['method']) && $settings['method'] == 'replace') {
+      $settings['method'] = 'replaceWith';
+    }
+
+    // Change path to URL.
+    $settings['url'] = url($settings['path'], $settings['options']);
+    unset($settings['path'], $settings['options']);
+
+    // Add special data to $settings['submit'] so that when this element
+    // triggers an Ajax submission, Drupal's form processing can determine which
+    // element triggered it.
+    // @see _form_element_triggered_scripted_submission()
+    if (isset($settings['trigger_as'])) {
+      // An element can add a 'trigger_as' key within #ajax to make the element
+      // submit as though another one (for example, a non-button can use this
+      // to submit the form as though a button were clicked). When using this,
+      // the 'name' key is always required to identify the element to trigger
+      // as. The 'value' key is optional, and only needed when multiple elements
+      // share the same name, which is commonly the case for buttons.
+      $settings['submit']['_triggering_element_name'] = $settings['trigger_as']['name'];
+      if (isset($settings['trigger_as']['value'])) {
+        $settings['submit']['_triggering_element_value'] = $settings['trigger_as']['value'];
+      }
+      unset($settings['trigger_as']);
+    }
+    elseif (isset($element['#name'])) {
+      // Most of the time, elements can submit as themselves, in which case the
+      // 'trigger_as' key isn't needed, and the element's name is used.
+      $settings['submit']['_triggering_element_name'] = $element['#name'];
+      // If the element is a (non-image) button, its name may not identify it
+      // uniquely, in which case a match on value is also needed.
+      // @see _form_button_was_clicked()
+      if (isset($element['#button_type']) && empty($element['#has_garbage_value'])) {
+        $settings['submit']['_triggering_element_value'] = $element['#value'];
+      }
+    }
+
+    // Convert a simple #ajax['progress'] string into an array.
+    if (isset($settings['progress']) && is_string($settings['progress'])) {
+      $settings['progress'] = array('type' => $settings['progress']);
+    }
+    // Change progress path to a full URL.
+    if (isset($settings['progress']['path'])) {
+      $settings['progress']['url'] = url($settings['progress']['path']);
+      unset($settings['progress']['path']);
+    }
+
+    $element['#attached']['js'][] = array(
+      'type' => 'setting',
+      'data' => array('ajax' => array($element['#id'] => $settings)),
+    );
+
+    // Indicate that Ajax processing was successful.
+    $element['#ajax_processed'] = TRUE;
+  }
+  return $element;
+}
+
+/**
+ * @} End of "defgroup ajax".
+ */
+
+/**
+ * @defgroup ajax_commands Ajax framework commands
+ * @{
+ * Functions to create various Ajax commands.
+ *
+ * These functions can be used to create arrays for use with the
+ * ajax_render() function.
+ */
+
+/**
+ * Creates a Drupal Ajax 'alert' command.
+ *
+ * The 'alert' command instructs the client to display a JavaScript alert
+ * dialog box.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.alert()
+ * defined in misc/ajax.js.
+ *
+ * @param $text
+ *   The message string to display to the user.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ */
+function ajax_command_alert($text) {
+  return array(
+    'command' => 'alert',
+    'text' => $text,
+  );
+}
+
+/**
+ * Creates a Drupal Ajax 'insert' command using the method in #ajax['method'].
+ *
+ * This command instructs the client to insert the given HTML using whichever
+ * jQuery DOM manipulation method has been specified in the #ajax['method']
+ * variable of the element that triggered the request.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.insert()
+ * defined in misc/ajax.js.
+ *
+ * @param $selector
+ *   A jQuery selector string. If the command is a response to a request from
+ *   an #ajax form element then this value can be NULL.
+ * @param $html
+ *   The data to use with the jQuery method.
+ * @param $settings
+ *   An optional array of settings that will be used for this command only.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ */
+function ajax_command_insert($selector, $html, $settings = NULL) {
+  return array(
+    'command' => 'insert',
+    'method' => NULL,
+    'selector' => $selector,
+    'data' => $html,
+    'settings' => $settings,
+  );
+}
+
+/**
+ * Creates a Drupal Ajax 'insert/replaceWith' command.
+ *
+ * The 'insert/replaceWith' command instructs the client to use jQuery's
+ * replaceWith() method to replace each element matched matched by the given
+ * selector with the given HTML.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.insert()
+ * defined in misc/ajax.js.
+ *
+ * @param $selector
+ *   A jQuery selector string. If the command is a response to a request from
+ *   an #ajax form element then this value can be NULL.
+ * @param $html
+ *   The data to use with the jQuery replaceWith() method.
+ * @param $settings
+ *   An optional array of settings that will be used for this command only.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ *
+ * See
+ * @link http://docs.jquery.com/Manipulation/replaceWith#content jQuery replaceWith command @endlink
+ */
+function ajax_command_replace($selector, $html, $settings = NULL) {
+  return array(
+    'command' => 'insert',
+    'method' => 'replaceWith',
+    'selector' => $selector,
+    'data' => $html,
+    'settings' => $settings,
+  );
+}
+
+/**
+ * Creates a Drupal Ajax 'insert/html' command.
+ *
+ * The 'insert/html' command instructs the client to use jQuery's html()
+ * method to set the HTML content of each element matched by the given
+ * selector while leaving the outer tags intact.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.insert()
+ * defined in misc/ajax.js.
+ *
+ * @param $selector
+ *   A jQuery selector string. If the command is a response to a request from
+ *   an #ajax form element then this value can be NULL.
+ * @param $html
+ *   The data to use with the jQuery html() method.
+ * @param $settings
+ *   An optional array of settings that will be used for this command only.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ *
+ * @see http://docs.jquery.com/Attributes/html#val
+ */
+function ajax_command_html($selector, $html, $settings = NULL) {
+  return array(
+    'command' => 'insert',
+    'method' => 'html',
+    'selector' => $selector,
+    'data' => $html,
+    'settings' => $settings,
+  );
+}
+
+/**
+ * Creates a Drupal Ajax 'insert/prepend' command.
+ *
+ * The 'insert/prepend' command instructs the client to use jQuery's prepend()
+ * method to prepend the given HTML content to the inside each element matched
+ * by the given selector.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.insert()
+ * defined in misc/ajax.js.
+ *
+ * @param $selector
+ *   A jQuery selector string. If the command is a response to a request from
+ *   an #ajax form element then this value can be NULL.
+ * @param $html
+ *   The data to use with the jQuery prepend() method.
+ * @param $settings
+ *   An optional array of settings that will be used for this command only.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ *
+ * @see http://docs.jquery.com/Manipulation/prepend#content
+ */
+function ajax_command_prepend($selector, $html, $settings = NULL) {
+  return array(
+    'command' => 'insert',
+    'method' => 'prepend',
+    'selector' => $selector,
+    'data' => $html,
+    'settings' => $settings,
+  );
+}
+
+/**
+ * Creates a Drupal Ajax 'insert/append' command.
+ *
+ * The 'insert/append' command instructs the client to use jQuery's append()
+ * method to append the given HTML content to the inside of each element matched
+ * by the given selector.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.insert()
+ * defined in misc/ajax.js.
+ *
+ * @param $selector
+ *   A jQuery selector string. If the command is a response to a request from
+ *   an #ajax form element then this value can be NULL.
+ * @param $html
+ *   The data to use with the jQuery append() method.
+ * @param $settings
+ *   An optional array of settings that will be used for this command only.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ *
+ * @see http://docs.jquery.com/Manipulation/append#content
+ */
+function ajax_command_append($selector, $html, $settings = NULL) {
+  return array(
+    'command' => 'insert',
+    'method' => 'append',
+    'selector' => $selector,
+    'data' => $html,
+    'settings' => $settings,
+  );
+}
+
+/**
+ * Creates a Drupal Ajax 'insert/after' command.
+ *
+ * The 'insert/after' command instructs the client to use jQuery's after()
+ * method to insert the given HTML content after each element matched by
+ * the given selector.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.insert()
+ * defined in misc/ajax.js.
+ *
+ * @param $selector
+ *   A jQuery selector string. If the command is a response to a request from
+ *   an #ajax form element then this value can be NULL.
+ * @param $html
+ *   The data to use with the jQuery after() method.
+ * @param $settings
+ *   An optional array of settings that will be used for this command only.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ *
+ * @see http://docs.jquery.com/Manipulation/after#content
+ */
+function ajax_command_after($selector, $html, $settings = NULL) {
+  return array(
+    'command' => 'insert',
+    'method' => 'after',
+    'selector' => $selector,
+    'data' => $html,
+    'settings' => $settings,
+  );
+}
+
+/**
+ * Creates a Drupal Ajax 'insert/before' command.
+ *
+ * The 'insert/before' command instructs the client to use jQuery's before()
+ * method to insert the given HTML content before each of elements matched by
+ * the given selector.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.insert()
+ * defined in misc/ajax.js.
+ *
+ * @param $selector
+ *   A jQuery selector string. If the command is a response to a request from
+ *   an #ajax form element then this value can be NULL.
+ * @param $html
+ *   The data to use with the jQuery before() method.
+ * @param $settings
+ *   An optional array of settings that will be used for this command only.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ *
+ * @see http://docs.jquery.com/Manipulation/before#content
+ */
+function ajax_command_before($selector, $html, $settings = NULL) {
+  return array(
+    'command' => 'insert',
+    'method' => 'before',
+    'selector' => $selector,
+    'data' => $html,
+    'settings' => $settings,
+  );
+}
+
+/**
+ * Creates a Drupal Ajax 'remove' command.
+ *
+ * The 'remove' command instructs the client to use jQuery's remove() method
+ * to remove each of elements matched by the given selector, and everything
+ * within them.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.remove()
+ * defined in misc/ajax.js.
+ *
+ * @param $selector
+ *   A jQuery selector string. If the command is a response to a request from
+ *   an #ajax form element then this value can be NULL.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ *
+ * @see http://docs.jquery.com/Manipulation/remove#expr
+ */
+function ajax_command_remove($selector) {
+  return array(
+    'command' => 'remove',
+    'selector' => $selector,
+  );
+}
+
+/**
+ * Creates a Drupal Ajax 'changed' command.
+ *
+ * This command instructs the client to mark each of the elements matched by the
+ * given selector as 'ajax-changed'.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.changed()
+ * defined in misc/ajax.js.
+ *
+ * @param $selector
+ *   A jQuery selector string. If the command is a response to a request from
+ *   an #ajax form element then this value can be NULL.
+ * @param $asterisk
+ *   An optional CSS selector which must be inside $selector. If specified,
+ *   an asterisk will be appended to the HTML inside the $asterisk selector.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ */
+function ajax_command_changed($selector, $asterisk = '') {
+  return array(
+    'command' => 'changed',
+    'selector' => $selector,
+    'asterisk' => $asterisk,
+  );
+}
+
+/**
+ * Creates a Drupal Ajax 'css' command.
+ *
+ * The 'css' command will instruct the client to use the jQuery css() method
+ * to apply the CSS arguments to elements matched by the given selector.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.css()
+ * defined in misc/ajax.js.
+ *
+ * @param $selector
+ *   A jQuery selector string. If the command is a response to a request from
+ *   an #ajax form element then this value can be NULL.
+ * @param $argument
+ *   An array of key/value pairs to set in the CSS for the selector.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ *
+ * @see http://docs.jquery.com/CSS/css#properties
+ */
+function ajax_command_css($selector, $argument) {
+  return array(
+    'command' => 'css',
+    'selector' => $selector,
+    'argument' => $argument,
+  );
+}
+
+/**
+ * Creates a Drupal Ajax 'settings' command.
+ *
+ * The 'settings' command instructs the client either to use the given array as
+ * the settings for ajax-loaded content or to extend Drupal.settings with the
+ * given array, depending on the value of the $merge parameter.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.settings()
+ * defined in misc/ajax.js.
+ *
+ * @param $argument
+ *   An array of key/value pairs to add to the settings. This will be utilized
+ *   for all commands after this if they do not include their own settings
+ *   array.
+ * @param $merge
+ *   Whether or not the passed settings in $argument should be merged into the
+ *   global Drupal.settings on the page. By default (FALSE), the settings that
+ *   are passed to Drupal.attachBehaviors will not include the global
+ *   Drupal.settings.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ */
+function ajax_command_settings($argument, $merge = FALSE) {
+  return array(
+    'command' => 'settings',
+    'settings' => $argument,
+    'merge' => $merge,
+  );
+}
+
+/**
+ * Creates a Drupal Ajax 'data' command.
+ *
+ * The 'data' command instructs the client to attach the name=value pair of
+ * data to the selector via jQuery's data cache.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.data()
+ * defined in misc/ajax.js.
+ *
+ * @param $selector
+ *   A jQuery selector string. If the command is a response to a request from
+ *   an #ajax form element then this value can be NULL.
+ * @param $name
+ *   The name or key (in the key value pair) of the data attached to this
+ *   selector.
+ * @param $value
+ *   The value of the data. Not just limited to strings can be any format.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ *
+ * @see http://docs.jquery.com/Core/data#namevalue
+ */
+function ajax_command_data($selector, $name, $value) {
+  return array(
+    'command' => 'data',
+    'selector' => $selector,
+    'name' => $name,
+    'value' => $value,
+  );
+}
+
+/**
+ * Creates a Drupal Ajax 'invoke' command.
+ *
+ * The 'invoke' command will instruct the client to invoke the given jQuery
+ * method with the supplied arguments on the elements matched by the given
+ * selector. Intended for simple jQuery commands, such as attr(), addClass(),
+ * removeClass(), toggleClass(), etc.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.invoke()
+ * defined in misc/ajax.js.
+ *
+ * @param $selector
+ *   A jQuery selector string. If the command is a response to a request from
+ *   an #ajax form element then this value can be NULL.
+ * @param $method
+ *   The jQuery method to invoke.
+ * @param $arguments
+ *   (optional) A list of arguments to the jQuery $method, if any.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ */
+function ajax_command_invoke($selector, $method, array $arguments = array()) {
+  return array(
+    'command' => 'invoke',
+    'selector' => $selector,
+    'method' => $method,
+    'arguments' => $arguments,
+  );
+}
+
+/**
+ * Creates a Drupal Ajax 'restripe' command.
+ *
+ * The 'restripe' command instructs the client to restripe a table. This is
+ * usually used after a table has been modified by a replace or append command.
+ *
+ * This command is implemented by Drupal.ajax.prototype.commands.restripe()
+ * defined in misc/ajax.js.
+ *
+ * @param $selector
+ *   A jQuery selector string.
+ *
+ * @return
+ *   An array suitable for use with the ajax_render() function.
+ */
+function ajax_command_restripe($selector) {
+  return array(
+    'command' => 'restripe',
+    'selector' => $selector,
+  );
+}
diff --git a/htmltest/includes/archiver.inc b/htmltest/includes/archiver.inc
new file mode 100644
index 00000000..3ce11739
--- /dev/null
+++ b/htmltest/includes/archiver.inc
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * @file
+ * Shared classes and interfaces for the archiver system.
+ */
+
+/**
+ * Defines the common interface for all Archiver classes.
+ */
+interface ArchiverInterface {
+
+  /**
+   * Constructs a new archiver instance.
+   *
+   * @param $file_path
+   *   The full system path of the archive to manipulate. Only local files
+   *   are supported. If the file does not yet exist, it will be created if
+   *   appropriate.
+   */
+  public function __construct($file_path);
+
+  /**
+   * Adds the specified file or directory to the archive.
+   *
+   * @param $file_path
+   *   The full system path of the file or directory to add. Only local files
+   *   and directories are supported.
+   *
+   * @return ArchiverInterface
+   *   The called object.
+   */
+  public function add($file_path);
+
+  /**
+   * Removes the specified file from the archive.
+   *
+   * @param $path
+   *   The file name relative to the root of the archive to remove.
+   *
+   * @return ArchiverInterface
+   *   The called object.
+   */
+  public function remove($path);
+
+  /**
+   * Extracts multiple files in the archive to the specified path.
+   *
+   * @param $path
+   *   A full system path of the directory to which to extract files.
+   * @param $files
+   *   Optionally specify a list of files to be extracted. Files are
+   *   relative to the root of the archive. If not specified, all files
+   *   in the archive will be extracted.
+   *
+   * @return ArchiverInterface
+   *   The called object.
+   */
+  public function extract($path, array $files = array());
+
+  /**
+   * Lists all files in the archive.
+   *
+   * @return
+   *   An array of file names relative to the root of the archive.
+   */
+  public function listContents();
+}
diff --git a/htmltest/includes/authorize.inc b/htmltest/includes/authorize.inc
new file mode 100644
index 00000000..8360e132
--- /dev/null
+++ b/htmltest/includes/authorize.inc
@@ -0,0 +1,334 @@
+<?php
+
+/**
+ * @file
+ * Helper functions and form handlers used for the authorize.php script.
+ */
+
+/**
+ * Form constructor for the file transfer authorization form.
+ *
+ * Allows the user to choose a FileTransfer type and supply credentials.
+ *
+ * @see authorize_filetransfer_form_validate()
+ * @see authorize_filetransfer_form_submit()
+ * @ingroup forms
+ */
+function authorize_filetransfer_form($form, &$form_state) {
+  global $base_url, $is_https;
+  $form = array();
+
+  // If possible, we want to post this form securely via HTTPS.
+  $form['#https'] = TRUE;
+
+  // CSS we depend on lives in modules/system/maintenance.css, which is loaded
+  // via the default maintenance theme.
+  $form['#attached']['js'][] = $base_url . '/misc/authorize.js';
+
+  // Get all the available ways to transfer files.
+  if (empty($_SESSION['authorize_filetransfer_info'])) {
+    drupal_set_message(t('Unable to continue, no available methods of file transfer'), 'error');
+    return array();
+  }
+  $available_backends = $_SESSION['authorize_filetransfer_info'];
+
+  if (!$is_https) {
+    $form['information']['https_warning'] = array(
+      '#prefix' => '<div class="messages error">',
+      '#markup' => t('WARNING: You are not using an encrypted connection, so your password will be sent in plain text. <a href="@https-link">Learn more</a>.', array('@https-link' => 'http://drupal.org/https-information')),
+      '#suffix' => '</div>',
+    );
+  }
+
+  // Decide on a default backend.
+  if (isset($form_state['values']['connection_settings']['authorize_filetransfer_default'])) {
+    $authorize_filetransfer_default = $form_state['values']['connection_settings']['authorize_filetransfer_default'];
+  }
+  elseif ($authorize_filetransfer_default = variable_get('authorize_filetransfer_default', NULL));
+  else {
+    $authorize_filetransfer_default = key($available_backends);
+  }
+
+  $form['information']['main_header'] = array(
+    '#prefix' => '<h3>',
+    '#markup' => t('To continue, provide your server connection details'),
+    '#suffix' => '</h3>',
+  );
+
+  $form['connection_settings']['#tree'] = TRUE;
+  $form['connection_settings']['authorize_filetransfer_default'] = array(
+    '#type' => 'select',
+    '#title' => t('Connection method'),
+    '#default_value' => $authorize_filetransfer_default,
+    '#weight' => -10,
+  );
+
+  /*
+   * Here we create two submit buttons. For a JS enabled client, they will
+   * only ever see submit_process. However, if a client doesn't have JS
+   * enabled, they will see submit_connection on the first form (when picking
+   * what filetransfer type to use, and submit_process on the second one (which
+   * leads to the actual operation).
+   */
+  $form['submit_connection'] = array(
+    '#prefix' => "<br style='clear:both'/>",
+    '#name' => 'enter_connection_settings',
+    '#type' => 'submit',
+    '#value' => t('Enter connection settings'),
+    '#weight' => 100,
+  );
+
+  $form['submit_process'] = array(
+    '#name' => 'process_updates',
+    '#type' => 'submit',
+    '#value' => t('Continue'),
+    '#weight' => 100,
+    '#attributes' => array('style' => 'display:none'),
+  );
+
+  // Build a container for each connection type.
+  foreach ($available_backends as $name => $backend) {
+    $form['connection_settings']['authorize_filetransfer_default']['#options'][$name] = $backend['title'];
+    $form['connection_settings'][$name] = array(
+      '#type' => 'container',
+      '#attributes' => array('class' => array("filetransfer-$name", 'filetransfer')),
+    );
+    // We can't use #prefix on the container itself since then the header won't
+    // be hidden and shown when the containers are being manipulated via JS.
+    $form['connection_settings'][$name]['header'] = array(
+      '#markup' => '<h4>' . t('@backend connection settings', array('@backend' => $backend['title'])) . '</h4>',
+    );
+
+    $form['connection_settings'][$name] += _authorize_filetransfer_connection_settings($name);
+
+    // Start non-JS code.
+    if (isset($form_state['values']['connection_settings']['authorize_filetransfer_default']) && $form_state['values']['connection_settings']['authorize_filetransfer_default'] == $name) {
+
+      // If the user switches from JS to non-JS, Drupal (and Batch API) will
+      // barf. This is a known bug: http://drupal.org/node/229825.
+      setcookie('has_js', '', time() - 3600, '/');
+      unset($_COOKIE['has_js']);
+
+      // Change the submit button to the submit_process one.
+      $form['submit_process']['#attributes'] = array();
+      unset($form['submit_connection']);
+
+      // Activate the proper filetransfer settings form.
+      $form['connection_settings'][$name]['#attributes']['style'] = 'display:block';
+      // Disable the select box.
+      $form['connection_settings']['authorize_filetransfer_default']['#disabled'] = TRUE;
+
+      // Create a button for changing the type of connection.
+      $form['connection_settings']['change_connection_type'] = array(
+        '#name' => 'change_connection_type',
+        '#type' => 'submit',
+        '#value' => t('Change connection type'),
+        '#weight' => -5,
+        '#attributes' => array('class' => array('filetransfer-change-connection-type')),
+      );
+    }
+    // End non-JS code.
+  }
+  return $form;
+}
+
+/**
+ * Generates the Form API array for a given connection backend's settings.
+ *
+ * @param $backend
+ *   The name of the backend (e.g. 'ftp', 'ssh', etc).
+ *
+ * @return
+ *   Form API array of connection settings for the given backend.
+ *
+ * @see hook_filetransfer_backends()
+ */
+function _authorize_filetransfer_connection_settings($backend) {
+  $defaults = variable_get('authorize_filetransfer_connection_settings_' . $backend, array());
+  $form = array();
+
+  // Create an instance of the file transfer class to get its settings form.
+  $filetransfer = authorize_get_filetransfer($backend);
+  if ($filetransfer) {
+    $form = $filetransfer->getSettingsForm();
+  }
+  // Fill in the defaults based on the saved settings, if any.
+  _authorize_filetransfer_connection_settings_set_defaults($form, NULL, $defaults);
+  return $form;
+}
+
+/**
+ * Sets the default settings on a file transfer connection form recursively.
+ *
+ * The default settings for the file transfer connection forms are saved in
+ * the database. The settings are stored as a nested array in the case of a
+ * settings form that has fieldsets or otherwise uses a nested structure.
+ * Therefore, to properly add defaults, we need to walk through all the
+ * children form elements and process those defaults recursively.
+ *
+ * @param $element
+ *   Reference to the Form API form element we're operating on.
+ * @param $key
+ *   The key for our current form element, if any.
+ * @param array $defaults
+ *   The default settings for the file transfer backend we're operating on.
+ */
+function _authorize_filetransfer_connection_settings_set_defaults(&$element, $key, array $defaults) {
+  // If we're operating on a form element which isn't a fieldset, and we have
+  // a default setting saved, stash it in #default_value.
+  if (!empty($key) && isset($defaults[$key]) && isset($element['#type']) && $element['#type'] != 'fieldset') {
+    $element['#default_value'] = $defaults[$key];
+  }
+  // Now, we walk through all the child elements, and recursively invoke
+  // ourself on each one. Since the $defaults settings array can be nested
+  // (because of #tree, any values inside fieldsets will be nested), if
+  // there's a subarray of settings for the form key we're currently
+  // processing, pass in that subarray to the recursive call. Otherwise, just
+  // pass on the whole $defaults array.
+  foreach (element_children($element) as $child_key) {
+    _authorize_filetransfer_connection_settings_set_defaults($element[$child_key], $child_key, ((isset($defaults[$key]) && is_array($defaults[$key])) ? $defaults[$key] : $defaults));
+  }
+}
+
+/**
+ * Form validation handler for authorize_filetransfer_form().
+ *
+ * @see authorize_filetransfer_form()
+ * @see authorize_filetransfer_submit()
+ */
+function authorize_filetransfer_form_validate($form, &$form_state) {
+  // Only validate the form if we have collected all of the user input and are
+  // ready to proceed with updating or installing.
+  if ($form_state['triggering_element']['#name'] != 'process_updates') {
+    return;
+  }
+
+  if (isset($form_state['values']['connection_settings'])) {
+    $backend = $form_state['values']['connection_settings']['authorize_filetransfer_default'];
+    $filetransfer = authorize_get_filetransfer($backend, $form_state['values']['connection_settings'][$backend]);
+    try {
+      if (!$filetransfer) {
+        throw new Exception(t('Error, this type of connection protocol (%backend) does not exist.', array('%backend' => $backend)));
+      }
+      $filetransfer->connect();
+    }
+    catch (Exception $e) {
+      // The format of this error message is similar to that used on the
+      // database connection form in the installer.
+      form_set_error('connection_settings', t('Failed to connect to the server. The server reports the following message: !message For more help installing or updating code on your server, see the <a href="@handbook_url">handbook</a>.', array(
+        '!message' => '<p class="error">' . $e->getMessage()  . '</p>',
+        '@handbook_url' => 'http://drupal.org/documentation/install/modules-themes',
+      )));
+    }
+  }
+}
+
+/**
+ * Form submission handler for authorize_filetransfer_form().
+ *
+ * @see authorize_filetransfer_form()
+ * @see authorize_filetransfer_validate()
+ */
+function authorize_filetransfer_form_submit($form, &$form_state) {
+  global $base_url;
+  switch ($form_state['triggering_element']['#name']) {
+    case 'process_updates':
+
+      // Save the connection settings to the DB.
+      $filetransfer_backend = $form_state['values']['connection_settings']['authorize_filetransfer_default'];
+
+      // If the database is available then try to save our settings. We have
+      // to make sure it is available since this code could potentially (will
+      // likely) be called during the installation process, before the
+      // database is set up.
+      try {
+        $connection_settings = array();
+        foreach ($form_state['values']['connection_settings'][$filetransfer_backend] as $key => $value) {
+          // We do *not* want to store passwords in the database, unless the
+          // backend explicitly says so via the magic #filetransfer_save form
+          // property. Otherwise, we store everything that's not explicitly
+          // marked with #filetransfer_save set to FALSE.
+          if (!isset($form['connection_settings'][$filetransfer_backend][$key]['#filetransfer_save'])) {
+            if ($form['connection_settings'][$filetransfer_backend][$key]['#type'] != 'password') {
+              $connection_settings[$key] = $value;
+            }
+          }
+          // The attribute is defined, so only save if set to TRUE.
+          elseif ($form['connection_settings'][$filetransfer_backend][$key]['#filetransfer_save']) {
+            $connection_settings[$key] = $value;
+          }
+        }
+        // Set this one as the default authorize method.
+        variable_set('authorize_filetransfer_default', $filetransfer_backend);
+        // Save the connection settings minus the password.
+        variable_set('authorize_filetransfer_connection_settings_' . $filetransfer_backend, $connection_settings);
+
+        $filetransfer = authorize_get_filetransfer($filetransfer_backend, $form_state['values']['connection_settings'][$filetransfer_backend]);
+
+        // Now run the operation.
+        authorize_run_operation($filetransfer);
+      }
+      catch (Exception $e) {
+        // If there is no database available, we don't care and just skip
+        // this part entirely.
+      }
+
+      break;
+
+    case 'enter_connection_settings':
+      $form_state['rebuild'] = TRUE;
+      break;
+
+    case 'change_connection_type':
+      $form_state['rebuild'] = TRUE;
+      unset($form_state['values']['connection_settings']['authorize_filetransfer_default']);
+      break;
+  }
+}
+
+/**
+ * Runs the operation specified in $_SESSION['authorize_operation'].
+ *
+ * @param $filetransfer
+ *   The FileTransfer object to use for running the operation.
+ */
+function authorize_run_operation($filetransfer) {
+  $operation = $_SESSION['authorize_operation'];
+  unset($_SESSION['authorize_operation']);
+
+  if (!empty($operation['page_title'])) {
+    drupal_set_title($operation['page_title']);
+  }
+
+  require_once DRUPAL_ROOT . '/' . $operation['file'];
+  call_user_func_array($operation['callback'], array_merge(array($filetransfer), $operation['arguments']));
+}
+
+/**
+ * Gets a FileTransfer class for a specific transfer method and settings.
+ *
+ * @param $backend
+ *   The FileTransfer backend to get the class for.
+ * @param $settings
+ *   Array of settings for the FileTransfer.
+ *
+ * @return
+ *   An instantiated FileTransfer object for the requested method and settings,
+ *   or FALSE if there was an error finding or instantiating it.
+ */
+function authorize_get_filetransfer($backend, $settings = array()) {
+  $filetransfer = FALSE;
+  if (!empty($_SESSION['authorize_filetransfer_info'][$backend])) {
+    $backend_info = $_SESSION['authorize_filetransfer_info'][$backend];
+    if (!empty($backend_info['file'])) {
+      $file = $backend_info['file path'] . '/' . $backend_info['file'];
+      require_once $file;
+    }
+    if (class_exists($backend_info['class'])) {
+      // PHP 5.2 doesn't support $class::factory() syntax, so we have to
+      // use call_user_func_array() until we can require PHP 5.3.
+      $filetransfer = call_user_func_array(array($backend_info['class'], 'factory'), array(DRUPAL_ROOT, $settings));
+    }
+  }
+  return $filetransfer;
+}
diff --git a/htmltest/includes/batch.inc b/htmltest/includes/batch.inc
new file mode 100644
index 00000000..061acd4c
--- /dev/null
+++ b/htmltest/includes/batch.inc
@@ -0,0 +1,539 @@
+<?php
+
+/**
+ * @file
+ * Batch processing API for processes to run in multiple HTTP requests.
+ *
+ * Note that batches are usually invoked by form submissions, which is
+ * why the core interaction functions of the batch processing API live in
+ * form.inc.
+ *
+ * @see form.inc
+ * @see batch_set()
+ * @see batch_process()
+ * @see batch_get()
+ */
+
+/**
+ * Loads a batch from the database.
+ *
+ * @param $id
+ *   The ID of the batch to load. When a progressive batch is being processed,
+ *   the relevant ID is found in $_REQUEST['id'].
+ *
+ * @return
+ *   An array representing the batch, or FALSE if no batch was found.
+ */
+function batch_load($id) {
+  $batch = db_query("SELECT batch FROM {batch} WHERE bid = :bid AND token = :token", array(
+    ':bid' => $id,
+    ':token' => drupal_get_token($id),
+  ))->fetchField();
+  if ($batch) {
+    return unserialize($batch);
+  }
+  return FALSE;
+}
+
+/**
+ * Renders the batch processing page based on the current state of the batch.
+ *
+ * @see _batch_shutdown()
+ */
+function _batch_page() {
+  $batch = &batch_get();
+
+  if (!isset($_REQUEST['id'])) {
+    return FALSE;
+  }
+
+  // Retrieve the current state of the batch.
+  if (!$batch) {
+    $batch = batch_load($_REQUEST['id']);
+    if (!$batch) {
+      drupal_set_message(t('No active batch.'), 'error');
+      drupal_goto();
+    }
+  }
+
+  // Register database update for the end of processing.
+  drupal_register_shutdown_function('_batch_shutdown');
+
+  // Add batch-specific CSS.
+  foreach ($batch['sets'] as $batch_set) {
+    if (isset($batch_set['css'])) {
+      foreach ($batch_set['css'] as $css) {
+        drupal_add_css($css);
+      }
+    }
+  }
+
+  $op = isset($_REQUEST['op']) ? $_REQUEST['op'] : '';
+  $output = NULL;
+  switch ($op) {
+    case 'start':
+      $output = _batch_start();
+      break;
+
+    case 'do':
+      // JavaScript-based progress page callback.
+      _batch_do();
+      break;
+
+    case 'do_nojs':
+      // Non-JavaScript-based progress page.
+      $output = _batch_progress_page_nojs();
+      break;
+
+    case 'finished':
+      $output = _batch_finished();
+      break;
+  }
+
+  return $output;
+}
+
+/**
+ * Initializes the batch processing.
+ *
+ * JavaScript-enabled clients are identified by the 'has_js' cookie set in
+ * drupal.js. If no JavaScript-enabled page has been visited during the current
+ * user's browser session, the non-JavaScript version is returned.
+ */
+function _batch_start() {
+  if (isset($_COOKIE['has_js']) && $_COOKIE['has_js']) {
+    return _batch_progress_page_js();
+  }
+  else {
+    return _batch_progress_page_nojs();
+  }
+}
+
+/**
+ * Outputs a batch processing page with JavaScript support.
+ *
+ * This initializes the batch and error messages. Note that in JavaScript-based
+ * processing, the batch processing page is displayed only once and updated via
+ * AHAH requests, so only the first batch set gets to define the page title.
+ * Titles specified by subsequent batch sets are not displayed.
+ *
+ * @see batch_set()
+ * @see _batch_do()
+ */
+function _batch_progress_page_js() {
+  $batch = batch_get();
+
+  $current_set = _batch_current_set();
+  drupal_set_title($current_set['title'], PASS_THROUGH);
+
+  // Merge required query parameters for batch processing into those provided by
+  // batch_set() or hook_batch_alter().
+  $batch['url_options']['query']['id'] = $batch['id'];
+
+  $js_setting = array(
+    'batch' => array(
+      'errorMessage' => $current_set['error_message'] . '<br />' . $batch['error_message'],
+      'initMessage' => $current_set['init_message'],
+      'uri' => url($batch['url'], $batch['url_options']),
+    ),
+  );
+  drupal_add_js($js_setting, 'setting');
+  drupal_add_library('system', 'drupal.batch');
+
+  return '<div id="progress"></div>';
+}
+
+/**
+ * Does one execution pass with JavaScript and returns progress to the browser.
+ *
+ * @see _batch_progress_page_js()
+ * @see _batch_process()
+ */
+function _batch_do() {
+  // HTTP POST required.
+  if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+    drupal_set_message(t('HTTP POST is required.'), 'error');
+    drupal_set_title(t('Error'));
+    return '';
+  }
+
+  // Perform actual processing.
+  list($percentage, $message) = _batch_process();
+
+  drupal_json_output(array('status' => TRUE, 'percentage' => $percentage, 'message' => $message));
+}
+
+/**
+ * Outputs a batch processing page without JavaScript support.
+ *
+ * @see _batch_process()
+ */
+function _batch_progress_page_nojs() {
+  $batch = &batch_get();
+
+  $current_set = _batch_current_set();
+  drupal_set_title($current_set['title'], PASS_THROUGH);
+
+  $new_op = 'do_nojs';
+
+  if (!isset($batch['running'])) {
+    // This is the first page so we return some output immediately.
+    $percentage       = 0;
+    $message          = $current_set['init_message'];
+    $batch['running'] = TRUE;
+  }
+  else {
+    // This is one of the later requests; do some processing first.
+
+    // Error handling: if PHP dies due to a fatal error (e.g. a nonexistent
+    // function), it will output whatever is in the output buffer, followed by
+    // the error message.
+    ob_start();
+    $fallback = $current_set['error_message'] . '<br />' . $batch['error_message'];
+    $fallback = theme('maintenance_page', array('content' => $fallback, 'show_messages' => FALSE));
+
+    // We strip the end of the page using a marker in the template, so any
+    // additional HTML output by PHP shows up inside the page rather than below
+    // it. While this causes invalid HTML, the same would be true if we didn't,
+    // as content is not allowed to appear after </html> anyway.
+    list($fallback) = explode('<!--partial-->', $fallback);
+    print $fallback;
+
+    // Perform actual processing.
+    list($percentage, $message) = _batch_process($batch);
+    if ($percentage == 100) {
+      $new_op = 'finished';
+    }
+
+    // PHP did not die; remove the fallback output.
+    ob_end_clean();
+  }
+
+  // Merge required query parameters for batch processing into those provided by
+  // batch_set() or hook_batch_alter().
+  $batch['url_options']['query']['id'] = $batch['id'];
+  $batch['url_options']['query']['op'] = $new_op;
+
+  $url = url($batch['url'], $batch['url_options']);
+  $element = array(
+    '#tag' => 'meta',
+    '#attributes' => array(
+      'http-equiv' => 'Refresh',
+      'content' => '0; URL=' . $url,
+    ),
+  );
+  drupal_add_html_head($element, 'batch_progress_meta_refresh');
+
+  return theme('progress_bar', array('percent' => $percentage, 'message' => $message));
+}
+
+/**
+ * Processes sets in a batch.
+ *
+ * If the batch was marked for progressive execution (default), this executes as
+ * many operations in batch sets until an execution time of 1 second has been
+ * exceeded. It will continue with the next operation of the same batch set in
+ * the next request.
+ *
+ * @return
+ *   An array containing a completion value (in percent) and a status message.
+ */
+function _batch_process() {
+  $batch       = &batch_get();
+  $current_set = &_batch_current_set();
+  // Indicate that this batch set needs to be initialized.
+  $set_changed = TRUE;
+
+  // If this batch was marked for progressive execution (e.g. forms submitted by
+  // drupal_form_submit()), initialize a timer to determine whether we need to
+  // proceed with the same batch phase when a processing time of 1 second has
+  // been exceeded.
+  if ($batch['progressive']) {
+    timer_start('batch_processing');
+  }
+
+  if (empty($current_set['start'])) {
+    $current_set['start'] = microtime(TRUE);
+  }
+
+  $queue = _batch_queue($current_set);
+
+  while (!$current_set['success']) {
+    // If this is the first time we iterate this batch set in the current
+    // request, we check if it requires an additional file for functions
+    // definitions.
+    if ($set_changed && isset($current_set['file']) && is_file($current_set['file'])) {
+      include_once DRUPAL_ROOT . '/' . $current_set['file'];
+    }
+
+    $task_message = '';
+    // Assume a single pass operation and set the completion level to 1 by
+    // default.
+    $finished = 1;
+
+    if ($item = $queue->claimItem()) {
+      list($function, $args) = $item->data;
+
+      // Build the 'context' array and execute the function call.
+      $batch_context = array(
+        'sandbox'  => &$current_set['sandbox'],
+        'results'  => &$current_set['results'],
+        'finished' => &$finished,
+        'message'  => &$task_message,
+      );
+      call_user_func_array($function, array_merge($args, array(&$batch_context)));
+
+      if ($finished >= 1) {
+        // Make sure this step is not counted twice when computing $current.
+        $finished = 0;
+        // Remove the processed operation and clear the sandbox.
+        $queue->deleteItem($item);
+        $current_set['count']--;
+        $current_set['sandbox'] = array();
+      }
+    }
+
+    // When all operations in the current batch set are completed, browse
+    // through the remaining sets, marking them 'successfully processed'
+    // along the way, until we find a set that contains operations.
+    // _batch_next_set() executes form submit handlers stored in 'control'
+    // sets (see form_execute_handlers()), which can in turn add new sets to
+    // the batch.
+    $set_changed = FALSE;
+    $old_set = $current_set;
+    while (empty($current_set['count']) && ($current_set['success'] = TRUE) && _batch_next_set()) {
+      $current_set = &_batch_current_set();
+      $current_set['start'] = microtime(TRUE);
+      $set_changed = TRUE;
+    }
+
+    // At this point, either $current_set contains operations that need to be
+    // processed or all sets have been completed.
+    $queue = _batch_queue($current_set);
+
+    // If we are in progressive mode, break processing after 1 second.
+    if ($batch['progressive'] && timer_read('batch_processing') > 1000) {
+      // Record elapsed wall clock time.
+      $current_set['elapsed'] = round((microtime(TRUE) - $current_set['start']) * 1000, 2);
+      break;
+    }
+  }
+
+  if ($batch['progressive']) {
+    // Gather progress information.
+
+    // Reporting 100% progress will cause the whole batch to be considered
+    // processed. If processing was paused right after moving to a new set,
+    // we have to use the info from the new (unprocessed) set.
+    if ($set_changed && isset($current_set['queue'])) {
+      // Processing will continue with a fresh batch set.
+      $remaining        = $current_set['count'];
+      $total            = $current_set['total'];
+      $progress_message = $current_set['init_message'];
+      $task_message     = '';
+    }
+    else {
+      // Processing will continue with the current batch set.
+      $remaining        = $old_set['count'];
+      $total            = $old_set['total'];
+      $progress_message = $old_set['progress_message'];
+    }
+
+    // Total progress is the number of operations that have fully run plus the
+    // completion level of the current operation.
+    $current    = $total - $remaining + $finished;
+    $percentage = _batch_api_percentage($total, $current);
+    $elapsed    = isset($current_set['elapsed']) ? $current_set['elapsed'] : 0;
+    $values     = array(
+      '@remaining'  => $remaining,
+      '@total'      => $total,
+      '@current'    => floor($current),
+      '@percentage' => $percentage,
+      '@elapsed'    => format_interval($elapsed / 1000),
+      // If possible, estimate remaining processing time.
+      '@estimate'   => ($current > 0) ? format_interval(($elapsed * ($total - $current) / $current) / 1000) : '-',
+    );
+    $message = strtr($progress_message, $values);
+    if (!empty($message)) {
+      $message .= '<br />';
+    }
+    if (!empty($task_message)) {
+      $message .= $task_message;
+    }
+
+    return array($percentage, $message);
+  }
+  else {
+    // If we are not in progressive mode, the entire batch has been processed.
+    return _batch_finished();
+  }
+}
+
+/**
+ * Formats the percent completion for a batch set.
+ *
+ * @param $total
+ *   The total number of operations.
+ * @param $current
+ *   The number of the current operation. This may be a floating point number
+ *   rather than an integer in the case of a multi-step operation that is not
+ *   yet complete; in that case, the fractional part of $current represents the
+ *   fraction of the operation that has been completed.
+ *
+ * @return
+ *   The properly formatted percentage, as a string. We output percentages
+ *   using the correct number of decimal places so that we never print "100%"
+ *   until we are finished, but we also never print more decimal places than
+ *   are meaningful.
+ *
+ * @see _batch_process()
+ */
+function _batch_api_percentage($total, $current) {
+  if (!$total || $total == $current) {
+    // If $total doesn't evaluate as true or is equal to the current set, then
+    // we're finished, and we can return "100".
+    $percentage = "100";
+  }
+  else {
+    // We add a new digit at 200, 2000, etc. (since, for example, 199/200
+    // would round up to 100% if we didn't).
+    $decimal_places = max(0, floor(log10($total / 2.0)) - 1);
+    do {
+      // Calculate the percentage to the specified number of decimal places.
+      $percentage = sprintf('%01.' . $decimal_places . 'f', round($current / $total * 100, $decimal_places));
+      // When $current is an integer, the above calculation will always be
+      // correct. However, if $current is a floating point number (in the case
+      // of a multi-step batch operation that is not yet complete), $percentage
+      // may be erroneously rounded up to 100%. To prevent that, we add one
+      // more decimal place and try again.
+      $decimal_places++;
+    } while ($percentage == '100');
+  }
+  return $percentage;
+}
+
+/**
+ * Returns the batch set being currently processed.
+ */
+function &_batch_current_set() {
+  $batch = &batch_get();
+  return $batch['sets'][$batch['current_set']];
+}
+
+/**
+ * Retrieves the next set in a batch.
+ *
+ * If there is a subsequent set in this batch, assign it as the new set to
+ * process and execute its form submit handler (if defined), which may add
+ * further sets to this batch.
+ *
+ * @return
+ *   TRUE if a subsequent set was found in the batch.
+ */
+function _batch_next_set() {
+  $batch = &batch_get();
+  if (isset($batch['sets'][$batch['current_set'] + 1])) {
+    $batch['current_set']++;
+    $current_set = &_batch_current_set();
+    if (isset($current_set['form_submit']) && ($function = $current_set['form_submit']) && function_exists($function)) {
+      // We use our stored copies of $form and $form_state to account for
+      // possible alterations by previous form submit handlers.
+      $function($batch['form_state']['complete form'], $batch['form_state']);
+    }
+    return TRUE;
+  }
+}
+
+/**
+ * Ends the batch processing.
+ *
+ * Call the 'finished' callback of each batch set to allow custom handling of
+ * the results and resolve page redirection.
+ */
+function _batch_finished() {
+  $batch = &batch_get();
+
+  // Execute the 'finished' callbacks for each batch set, if defined.
+  foreach ($batch['sets'] as $batch_set) {
+    if (isset($batch_set['finished'])) {
+      // Check if the set requires an additional file for function definitions.
+      if (isset($batch_set['file']) && is_file($batch_set['file'])) {
+        include_once DRUPAL_ROOT . '/' . $batch_set['file'];
+      }
+      if (function_exists($batch_set['finished'])) {
+        $queue = _batch_queue($batch_set);
+        $operations = $queue->getAllItems();
+        $batch_set['finished']($batch_set['success'], $batch_set['results'], $operations, format_interval($batch_set['elapsed'] / 1000));
+      }
+    }
+  }
+
+  // Clean up the batch table and unset the static $batch variable.
+  if ($batch['progressive']) {
+    db_delete('batch')
+      ->condition('bid', $batch['id'])
+      ->execute();
+    foreach ($batch['sets'] as $batch_set) {
+      if ($queue = _batch_queue($batch_set)) {
+        $queue->deleteQueue();
+      }
+    }
+  }
+  $_batch = $batch;
+  $batch = NULL;
+
+  // Clean-up the session. Not needed for CLI updates.
+  if (isset($_SESSION)) {
+    unset($_SESSION['batches'][$batch['id']]);
+    if (empty($_SESSION['batches'])) {
+      unset($_SESSION['batches']);
+    }
+  }
+
+  // Redirect if needed.
+  if ($_batch['progressive']) {
+    // Revert the 'destination' that was saved in batch_process().
+    if (isset($_batch['destination'])) {
+      $_GET['destination'] = $_batch['destination'];
+    }
+
+    // Determine the target path to redirect to.
+    if (!isset($_batch['form_state']['redirect'])) {
+      if (isset($_batch['redirect'])) {
+        $_batch['form_state']['redirect'] = $_batch['redirect'];
+      }
+      else {
+        $_batch['form_state']['redirect'] = $_batch['source_url'];
+      }
+    }
+
+    // Use drupal_redirect_form() to handle the redirection logic.
+    drupal_redirect_form($_batch['form_state']);
+
+    // If no redirection happened, redirect to the originating page. In case the
+    // form needs to be rebuilt, save the final $form_state for
+    // drupal_build_form().
+    if (!empty($_batch['form_state']['rebuild'])) {
+      $_SESSION['batch_form_state'] = $_batch['form_state'];
+    }
+    $function = $_batch['redirect_callback'];
+    if (function_exists($function)) {
+      $function($_batch['source_url'], array('query' => array('op' => 'finish', 'id' => $_batch['id'])));
+    }
+  }
+}
+
+/**
+ * Shutdown function: Stores the current batch data for the next request.
+ *
+ * @see _batch_page()
+ * @see drupal_register_shutdown_function()
+ */
+function _batch_shutdown() {
+  if ($batch = batch_get()) {
+    db_update('batch')
+      ->fields(array('batch' => serialize($batch)))
+      ->condition('bid', $batch['id'])
+      ->execute();
+  }
+}
diff --git a/htmltest/includes/batch.queue.inc b/htmltest/includes/batch.queue.inc
new file mode 100644
index 00000000..ed290ee7
--- /dev/null
+++ b/htmltest/includes/batch.queue.inc
@@ -0,0 +1,84 @@
+<?php
+
+/**
+ * @file
+ * Queue handlers used by the Batch API.
+ *
+ * These implementations:
+ * - Ensure FIFO ordering.
+ * - Allow an item to be repeatedly claimed until it is actually deleted (no
+ *   notion of lease time or 'expire' date), to allow multipass operations.
+ */
+
+/**
+ * Defines a batch queue.
+ *
+ * Stale items from failed batches are cleaned from the {queue} table on cron
+ * using the 'created' date.
+ */
+class BatchQueue extends SystemQueue {
+
+  /**
+   * Overrides SystemQueue::claimItem().
+   *
+   * Unlike SystemQueue::claimItem(), this method provides a default lease
+   * time of 0 (no expiration) instead of 30. This allows the item to be
+   * claimed repeatedly until it is deleted.
+   */
+  public function claimItem($lease_time = 0) {
+    $item = db_query_range('SELECT data, item_id FROM {queue} q WHERE name = :name ORDER BY item_id ASC', 0, 1, array(':name' => $this->name))->fetchObject();
+    if ($item) {
+      $item->data = unserialize($item->data);
+      return $item;
+    }
+    return FALSE;
+  }
+
+  /**
+   * Retrieves all remaining items in the queue.
+   *
+   * This is specific to Batch API and is not part of the DrupalQueueInterface.
+   */
+  public function getAllItems() {
+    $result = array();
+    $items = db_query('SELECT data FROM {queue} q WHERE name = :name ORDER BY item_id ASC', array(':name' => $this->name))->fetchAll();
+    foreach ($items as $item) {
+      $result[] = unserialize($item->data);
+    }
+    return $result;
+  }
+}
+
+/**
+ * Defines a batch queue for non-progressive batches.
+ */
+class BatchMemoryQueue extends MemoryQueue {
+
+  /**
+   * Overrides MemoryQueue::claimItem().
+   *
+   * Unlike MemoryQueue::claimItem(), this method provides a default lease
+   * time of 0 (no expiration) instead of 30. This allows the item to be
+   * claimed repeatedly until it is deleted.
+   */
+  public function claimItem($lease_time = 0) {
+    if (!empty($this->queue)) {
+      reset($this->queue);
+      return current($this->queue);
+    }
+    return FALSE;
+  }
+
+  /**
+   * Retrieves all remaining items in the queue.
+   *
+   * This is specific to Batch API and is not part of the DrupalQueueInterface.
+   */
+  public function getAllItems() {
+    $result = array();
+    foreach ($this->queue as $item) {
+      $result[] = $item->data;
+    }
+    return $result;
+  }
+}
diff --git a/htmltest/includes/bootstrap.inc b/htmltest/includes/bootstrap.inc
new file mode 100644
index 00000000..f6ffea51
--- /dev/null
+++ b/htmltest/includes/bootstrap.inc
@@ -0,0 +1,3487 @@
+<?php
+
+/**
+ * @file
+ * Functions that need to be loaded on every Drupal request.
+ */
+
+/**
+ * The current system version.
+ */
+define('VERSION', '7.25');
+
+/**
+ * Core API compatibility.
+ */
+define('DRUPAL_CORE_COMPATIBILITY', '7.x');
+
+/**
+ * Minimum supported version of PHP.
+ */
+define('DRUPAL_MINIMUM_PHP', '5.2.4');
+
+/**
+ * Minimum recommended value of PHP memory_limit.
+ */
+define('DRUPAL_MINIMUM_PHP_MEMORY_LIMIT', '32M');
+
+/**
+ * Error reporting level: display no errors.
+ */
+define('ERROR_REPORTING_HIDE', 0);
+
+/**
+ * Error reporting level: display errors and warnings.
+ */
+define('ERROR_REPORTING_DISPLAY_SOME', 1);
+
+/**
+ * Error reporting level: display all messages.
+ */
+define('ERROR_REPORTING_DISPLAY_ALL', 2);
+
+/**
+ * Indicates that the item should never be removed unless explicitly selected.
+ *
+ * The item may be removed using cache_clear_all() with a cache ID.
+ */
+define('CACHE_PERMANENT', 0);
+
+/**
+ * Indicates that the item should be removed at the next general cache wipe.
+ */
+define('CACHE_TEMPORARY', -1);
+
+/**
+ * @defgroup logging_severity_levels Logging severity levels
+ * @{
+ * Logging severity levels as defined in RFC 3164.
+ *
+ * The WATCHDOG_* constant definitions correspond to the logging severity levels
+ * defined in RFC 3164, section 4.1.1. PHP supplies predefined LOG_* constants
+ * for use in the syslog() function, but their values on Windows builds do not
+ * correspond to RFC 3164. The associated PHP bug report was closed with the
+ * comment, "And it's also not a bug, as Windows just have less log levels,"
+ * and "So the behavior you're seeing is perfectly normal."
+ *
+ * @see http://www.faqs.org/rfcs/rfc3164.html
+ * @see http://bugs.php.net/bug.php?id=18090
+ * @see http://php.net/manual/function.syslog.php
+ * @see http://php.net/manual/network.constants.php
+ * @see watchdog()
+ * @see watchdog_severity_levels()
+ */
+
+/**
+ * Log message severity -- Emergency: system is unusable.
+ */
+define('WATCHDOG_EMERGENCY', 0);
+
+/**
+ * Log message severity -- Alert: action must be taken immediately.
+ */
+define('WATCHDOG_ALERT', 1);
+
+/**
+ * Log message severity -- Critical conditions.
+ */
+define('WATCHDOG_CRITICAL', 2);
+
+/**
+ * Log message severity -- Error conditions.
+ */
+define('WATCHDOG_ERROR', 3);
+
+/**
+ * Log message severity -- Warning conditions.
+ */
+define('WATCHDOG_WARNING', 4);
+
+/**
+ * Log message severity -- Normal but significant conditions.
+ */
+define('WATCHDOG_NOTICE', 5);
+
+/**
+ * Log message severity -- Informational messages.
+ */
+define('WATCHDOG_INFO', 6);
+
+/**
+ * Log message severity -- Debug-level messages.
+ */
+define('WATCHDOG_DEBUG', 7);
+
+/**
+ * @} End of "defgroup logging_severity_levels".
+ */
+
+/**
+ * First bootstrap phase: initialize configuration.
+ */
+define('DRUPAL_BOOTSTRAP_CONFIGURATION', 0);
+
+/**
+ * Second bootstrap phase: try to serve a cached page.
+ */
+define('DRUPAL_BOOTSTRAP_PAGE_CACHE', 1);
+
+/**
+ * Third bootstrap phase: initialize database layer.
+ */
+define('DRUPAL_BOOTSTRAP_DATABASE', 2);
+
+/**
+ * Fourth bootstrap phase: initialize the variable system.
+ */
+define('DRUPAL_BOOTSTRAP_VARIABLES', 3);
+
+/**
+ * Fifth bootstrap phase: initialize session handling.
+ */
+define('DRUPAL_BOOTSTRAP_SESSION', 4);
+
+/**
+ * Sixth bootstrap phase: set up the page header.
+ */
+define('DRUPAL_BOOTSTRAP_PAGE_HEADER', 5);
+
+/**
+ * Seventh bootstrap phase: find out language of the page.
+ */
+define('DRUPAL_BOOTSTRAP_LANGUAGE', 6);
+
+/**
+ * Final bootstrap phase: Drupal is fully loaded; validate and fix input data.
+ */
+define('DRUPAL_BOOTSTRAP_FULL', 7);
+
+/**
+ * Role ID for anonymous users; should match what's in the "role" table.
+ */
+define('DRUPAL_ANONYMOUS_RID', 1);
+
+/**
+ * Role ID for authenticated users; should match what's in the "role" table.
+ */
+define('DRUPAL_AUTHENTICATED_RID', 2);
+
+/**
+ * The number of bytes in a kilobyte.
+ *
+ * For more information, visit http://en.wikipedia.org/wiki/Kilobyte.
+ */
+define('DRUPAL_KILOBYTE', 1024);
+
+/**
+ * The language code used when no language is explicitly assigned.
+ *
+ * Defined by ISO639-2 for "Undetermined".
+ */
+define('LANGUAGE_NONE', 'und');
+
+/**
+ * The type of language used to define the content language.
+ */
+define('LANGUAGE_TYPE_CONTENT', 'language_content');
+
+/**
+ * The type of language used to select the user interface.
+ */
+define('LANGUAGE_TYPE_INTERFACE', 'language');
+
+/**
+ * The type of language used for URLs.
+ */
+define('LANGUAGE_TYPE_URL', 'language_url');
+
+/**
+ * Language written left to right. Possible value of $language->direction.
+ */
+define('LANGUAGE_LTR', 0);
+
+/**
+ * Language written right to left. Possible value of $language->direction.
+ */
+define('LANGUAGE_RTL', 1);
+
+/**
+ * Time of the current request in seconds elapsed since the Unix Epoch.
+ *
+ * This differs from $_SERVER['REQUEST_TIME'], which is stored as a float
+ * since PHP 5.4.0. Float timestamps confuse most PHP functions
+ * (including date_create()).
+ *
+ * @see http://php.net/manual/reserved.variables.server.php
+ * @see http://php.net/manual/function.time.php
+ */
+define('REQUEST_TIME', (int) $_SERVER['REQUEST_TIME']);
+
+/**
+ * Flag used to indicate that text is not sanitized, so run check_plain().
+ *
+ * @see drupal_set_title()
+ */
+define('CHECK_PLAIN', 0);
+
+/**
+ * Flag used to indicate that text has already been sanitized.
+ *
+ * @see drupal_set_title()
+ */
+define('PASS_THROUGH', -1);
+
+/**
+ * Signals that the registry lookup cache should be reset.
+ */
+define('REGISTRY_RESET_LOOKUP_CACHE', 1);
+
+/**
+ * Signals that the registry lookup cache should be written to storage.
+ */
+define('REGISTRY_WRITE_LOOKUP_CACHE', 2);
+
+/**
+ * Regular expression to match PHP function names.
+ *
+ * @see http://php.net/manual/language.functions.php
+ */
+define('DRUPAL_PHP_FUNCTION_PATTERN', '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*');
+
+/**
+ * Provides a caching wrapper to be used in place of large array structures.
+ *
+ * This class should be extended by systems that need to cache large amounts
+ * of data and have it represented as an array to calling functions. These
+ * arrays can become very large, so ArrayAccess is used to allow different
+ * strategies to be used for caching internally (lazy loading, building caches
+ * over time etc.). This can dramatically reduce the amount of data that needs
+ * to be loaded from cache backends on each request, and memory usage from
+ * static caches of that same data.
+ *
+ * Note that array_* functions do not work with ArrayAccess. Systems using
+ * DrupalCacheArray should use this only internally. If providing API functions
+ * that return the full array, this can be cached separately or returned
+ * directly. However since DrupalCacheArray holds partial content by design, it
+ * should be a normal PHP array or otherwise contain the full structure.
+ *
+ * Note also that due to limitations in PHP prior to 5.3.4, it is impossible to
+ * write directly to the contents of nested arrays contained in this object.
+ * Only writes to the top-level array elements are possible. So if you
+ * previously had set $object['foo'] = array(1, 2, 'bar' => 'baz'), but later
+ * want to change the value of 'bar' from 'baz' to 'foobar', you cannot do so
+ * a targeted write like $object['foo']['bar'] = 'foobar'. Instead, you must
+ * overwrite the entire top-level 'foo' array with the entire set of new
+ * values: $object['foo'] = array(1, 2, 'bar' => 'foobar'). Due to this same
+ * limitation, attempts to create references to any contained data, nested or
+ * otherwise, will fail silently. So $var = &$object['foo'] will not throw an
+ * error, and $var will be populated with the contents of $object['foo'], but
+ * that data will be passed by value, not reference. For more information on
+ * the PHP limitation, see the note in the official PHP documentation at·
+ * http://php.net/manual/arrayaccess.offsetget.php on
+ * ArrayAccess::offsetGet().
+ *
+ * By default, the class accounts for caches where calling functions might
+ * request keys in the array that won't exist even after a cache rebuild. This
+ * prevents situations where a cache rebuild would be triggered over and over
+ * due to a 'missing' item. These cases are stored internally as a value of
+ * NULL. This means that the offsetGet() and offsetExists() methods
+ * must be overridden if caching an array where the top level values can
+ * legitimately be NULL, and where $object->offsetExists() needs to correctly
+ * return (equivalent to array_key_exists() vs. isset()). This should not
+ * be necessary in the majority of cases.
+ *
+ * Classes extending this class must override at least the
+ * resolveCacheMiss() method to have a working implementation.
+ *
+ * offsetSet() is not overridden by this class by default. In practice this
+ * means that assigning an offset via arrayAccess will only apply while the
+ * object is in scope and will not be written back to the persistent cache.
+ * This follows a similar pattern to static vs. persistent caching in
+ * procedural code. Extending classes may wish to alter this behavior, for
+ * example by overriding offsetSet() and adding an automatic call to persist().
+ *
+ * @see SchemaCache
+ */
+abstract class DrupalCacheArray implements ArrayAccess {
+
+  /**
+   * A cid to pass to cache_set() and cache_get().
+   */
+  protected $cid;
+
+  /**
+   * A bin to pass to cache_set() and cache_get().
+   */
+  protected $bin;
+
+  /**
+   * An array of keys to add to the cache at the end of the request.
+   */
+  protected $keysToPersist = array();
+
+  /**
+   * Storage for the data itself.
+   */
+  protected $storage = array();
+
+  /**
+   * Constructs a DrupalCacheArray object.
+   *
+   * @param $cid
+   *   The cid for the array being cached.
+   * @param $bin
+   *   The bin to cache the array.
+   */
+  public function __construct($cid, $bin) {
+    $this->cid = $cid;
+    $this->bin = $bin;
+
+    if ($cached = cache_get($this->cid, $this->bin)) {
+     $this->storage = $cached->data;
+    }
+  }
+
+  /**
+   * Implements ArrayAccess::offsetExists().
+   */
+  public function offsetExists($offset) {
+    return $this->offsetGet($offset) !== NULL;
+  }
+
+  /**
+   * Implements ArrayAccess::offsetGet().
+   */
+  public function offsetGet($offset) {
+    if (isset($this->storage[$offset]) || array_key_exists($offset, $this->storage)) {
+      return $this->storage[$offset];
+    }
+    else {
+      return $this->resolveCacheMiss($offset);
+    }
+  }
+
+  /**
+   * Implements ArrayAccess::offsetSet().
+   */
+  public function offsetSet($offset, $value) {
+    $this->storage[$offset] = $value;
+  }
+
+  /**
+   * Implements ArrayAccess::offsetUnset().
+   */
+  public function offsetUnset($offset) {
+    unset($this->storage[$offset]);
+  }
+
+  /**
+   * Flags an offset value to be written to the persistent cache.
+   *
+   * If a value is assigned to a cache object with offsetSet(), by default it
+   * will not be written to the persistent cache unless it is flagged with this
+   * method. This allows items to be cached for the duration of a request,
+   * without necessarily writing back to the persistent cache at the end.
+   *
+   * @param $offset
+   *   The array offset that was requested.
+   * @param $persist
+   *   Optional boolean to specify whether the offset should be persisted or
+   *   not, defaults to TRUE. When called with $persist = FALSE the offset will
+   *   be unflagged so that it will not be written at the end of the request.
+   */
+  protected function persist($offset, $persist = TRUE) {
+    $this->keysToPersist[$offset] = $persist;
+  }
+
+  /**
+   * Resolves a cache miss.
+   *
+   * When an offset is not found in the object, this is treated as a cache
+   * miss. This method allows classes implementing the interface to look up
+   * the actual value and allow it to be cached.
+   *
+   * @param $offset
+   *   The offset that was requested.
+   *
+   * @return
+   *   The value of the offset, or NULL if no value was found.
+   */
+  abstract protected function resolveCacheMiss($offset);
+
+  /**
+   * Writes a value to the persistent cache immediately.
+   *
+   * @param $data
+   *   The data to write to the persistent cache.
+   * @param $lock
+   *   Whether to acquire a lock before writing to cache.
+   */
+  protected function set($data, $lock = TRUE) {
+    // Lock cache writes to help avoid stampedes.
+    // To implement locking for cache misses, override __construct().
+    $lock_name = $this->cid . ':' . $this->bin;
+    if (!$lock || lock_acquire($lock_name)) {
+      if ($cached = cache_get($this->cid, $this->bin)) {
+        $data = $cached->data + $data;
+      }
+      cache_set($this->cid, $data, $this->bin);
+      if ($lock) {
+        lock_release($lock_name);
+      }
+    }
+  }
+
+  /**
+   * Destructs the DrupalCacheArray object.
+   */
+  public function __destruct() {
+    $data = array();
+    foreach ($this->keysToPersist as $offset => $persist) {
+      if ($persist) {
+        $data[$offset] = $this->storage[$offset];
+      }
+    }
+    if (!empty($data)) {
+      $this->set($data);
+    }
+  }
+}
+
+/**
+ * Starts the timer with the specified name.
+ *
+ * If you start and stop the same timer multiple times, the measured intervals
+ * will be accumulated.
+ *
+ * @param $name
+ *   The name of the timer.
+ */
+function timer_start($name) {
+  global $timers;
+
+  $timers[$name]['start'] = microtime(TRUE);
+  $timers[$name]['count'] = isset($timers[$name]['count']) ? ++$timers[$name]['count'] : 1;
+}
+
+/**
+ * Reads the current timer value without stopping the timer.
+ *
+ * @param $name
+ *   The name of the timer.
+ *
+ * @return
+ *   The current timer value in ms.
+ */
+function timer_read($name) {
+  global $timers;
+
+  if (isset($timers[$name]['start'])) {
+    $stop = microtime(TRUE);
+    $diff = round(($stop - $timers[$name]['start']) * 1000, 2);
+
+    if (isset($timers[$name]['time'])) {
+      $diff += $timers[$name]['time'];
+    }
+    return $diff;
+  }
+  return $timers[$name]['time'];
+}
+
+/**
+ * Stops the timer with the specified name.
+ *
+ * @param $name
+ *   The name of the timer.
+ *
+ * @return
+ *   A timer array. The array contains the number of times the timer has been
+ *   started and stopped (count) and the accumulated timer value in ms (time).
+ */
+function timer_stop($name) {
+  global $timers;
+
+  if (isset($timers[$name]['start'])) {
+    $stop = microtime(TRUE);
+    $diff = round(($stop - $timers[$name]['start']) * 1000, 2);
+    if (isset($timers[$name]['time'])) {
+      $timers[$name]['time'] += $diff;
+    }
+    else {
+      $timers[$name]['time'] = $diff;
+    }
+    unset($timers[$name]['start']);
+  }
+
+  return $timers[$name];
+}
+
+/**
+ * Returns the appropriate configuration directory.
+ *
+ * Returns the configuration path based on the site's hostname, port, and
+ * pathname. Uses find_conf_path() to find the current configuration directory.
+ * See default.settings.php for examples on how the URL is converted to a
+ * directory.
+ *
+ * @param bool $require_settings
+ *   Only configuration directories with an existing settings.php file
+ *   will be recognized. Defaults to TRUE. During initial installation,
+ *   this is set to FALSE so that Drupal can detect a matching directory,
+ *   then create a new settings.php file in it.
+ * @param bool $reset
+ *   Force a full search for matching directories even if one had been
+ *   found previously. Defaults to FALSE.
+ *
+ * @return
+ *   The path of the matching directory.
+ *
+ * @see default.settings.php
+ */
+function conf_path($require_settings = TRUE, $reset = FALSE) {
+  $conf = &drupal_static(__FUNCTION__, '');
+
+  if ($conf && !$reset) {
+    return $conf;
+  }
+
+  $confdir = 'sites';
+
+  $sites = array();
+  if (file_exists(DRUPAL_ROOT . '/' . $confdir . '/sites.php')) {
+    // This will overwrite $sites with the desired mappings.
+    include(DRUPAL_ROOT . '/' . $confdir . '/sites.php');
+  }
+
+  $uri = explode('/', $_SERVER['SCRIPT_NAME'] ? $_SERVER['SCRIPT_NAME'] : $_SERVER['SCRIPT_FILENAME']);
+  $server = explode('.', implode('.', array_reverse(explode(':', rtrim($_SERVER['HTTP_HOST'], '.')))));
+  for ($i = count($uri) - 1; $i > 0; $i--) {
+    for ($j = count($server); $j > 0; $j--) {
+      $dir = implode('.', array_slice($server, -$j)) . implode('.', array_slice($uri, 0, $i));
+      if (isset($sites[$dir]) && file_exists(DRUPAL_ROOT . '/' . $confdir . '/' . $sites[$dir])) {
+        $dir = $sites[$dir];
+      }
+      if (file_exists(DRUPAL_ROOT . '/' . $confdir . '/' . $dir . '/settings.php') || (!$require_settings && file_exists(DRUPAL_ROOT . '/' . $confdir . '/' . $dir))) {
+        $conf = "$confdir/$dir";
+        return $conf;
+      }
+    }
+  }
+  $conf = "$confdir/default";
+  return $conf;
+}
+
+/**
+ * Sets appropriate server variables needed for command line scripts to work.
+ *
+ * This function can be called by command line scripts before bootstrapping
+ * Drupal, to ensure that the page loads with the desired server parameters.
+ * This is because many parts of Drupal assume that they are running in a web
+ * browser and therefore use information from the global PHP $_SERVER variable
+ * that does not get set when Drupal is run from the command line.
+ *
+ * In many cases, the default way in which this function populates the $_SERVER
+ * variable is sufficient, and it can therefore be called without passing in
+ * any input. However, command line scripts running on a multisite installation
+ * (or on any installation that has settings.php stored somewhere other than
+ * the sites/default folder) need to pass in the URL of the site to allow
+ * Drupal to detect the correct location of the settings.php file. Passing in
+ * the 'url' parameter is also required for functions like request_uri() to
+ * return the expected values.
+ *
+ * Most other parameters do not need to be passed in, but may be necessary in
+ * some cases; for example, if Drupal's ip_address() function needs to return
+ * anything but the standard localhost value ('127.0.0.1'), the command line
+ * script should pass in the desired value via the 'REMOTE_ADDR' key.
+ *
+ * @param $variables
+ *   (optional) An associative array of variables within $_SERVER that should
+ *   be replaced. If the special element 'url' is provided in this array, it
+ *   will be used to populate some of the server defaults; it should be set to
+ *   the URL of the current page request, excluding any $_GET request but
+ *   including the script name (e.g., http://www.example.com/mysite/index.php).
+ *
+ * @see conf_path()
+ * @see request_uri()
+ * @see ip_address()
+ */
+function drupal_override_server_variables($variables = array()) {
+  // Allow the provided URL to override any existing values in $_SERVER.
+  if (isset($variables['url'])) {
+    $url = parse_url($variables['url']);
+    if (isset($url['host'])) {
+      $_SERVER['HTTP_HOST'] = $url['host'];
+    }
+    if (isset($url['path'])) {
+      $_SERVER['SCRIPT_NAME'] = $url['path'];
+    }
+    unset($variables['url']);
+  }
+  // Define default values for $_SERVER keys. These will be used if $_SERVER
+  // does not already define them and no other values are passed in to this
+  // function.
+  $defaults = array(
+    'HTTP_HOST' => 'localhost',
+    'SCRIPT_NAME' => NULL,
+    'REMOTE_ADDR' => '127.0.0.1',
+    'REQUEST_METHOD' => 'GET',
+    'SERVER_NAME' => NULL,
+    'SERVER_SOFTWARE' => NULL,
+    'HTTP_USER_AGENT' => NULL,
+  );
+  // Replace elements of the $_SERVER array, as appropriate.
+  $_SERVER = $variables + $_SERVER + $defaults;
+}
+
+/**
+ * Initializes the PHP environment.
+ */
+function drupal_environment_initialize() {
+  if (!isset($_SERVER['HTTP_REFERER'])) {
+    $_SERVER['HTTP_REFERER'] = '';
+  }
+  if (!isset($_SERVER['SERVER_PROTOCOL']) || ($_SERVER['SERVER_PROTOCOL'] != 'HTTP/1.0' && $_SERVER['SERVER_PROTOCOL'] != 'HTTP/1.1')) {
+    $_SERVER['SERVER_PROTOCOL'] = 'HTTP/1.0';
+  }
+
+  if (isset($_SERVER['HTTP_HOST'])) {
+    // As HTTP_HOST is user input, ensure it only contains characters allowed
+    // in hostnames. See RFC 952 (and RFC 2181).
+    // $_SERVER['HTTP_HOST'] is lowercased here per specifications.
+    $_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']);
+    if (!drupal_valid_http_host($_SERVER['HTTP_HOST'])) {
+      // HTTP_HOST is invalid, e.g. if containing slashes it may be an attack.
+      header($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request');
+      exit;
+    }
+  }
+  else {
+    // Some pre-HTTP/1.1 clients will not send a Host header. Ensure the key is
+    // defined for E_ALL compliance.
+    $_SERVER['HTTP_HOST'] = '';
+  }
+
+  // When clean URLs are enabled, emulate ?q=foo/bar using REQUEST_URI. It is
+  // not possible to append the query string using mod_rewrite without the B
+  // flag (this was added in Apache 2.2.8), because mod_rewrite unescapes the
+  // path before passing it on to PHP. This is a problem when the path contains
+  // e.g. "&" or "%" that have special meanings in URLs and must be encoded.
+  $_GET['q'] = request_path();
+
+  // Enforce E_ALL, but allow users to set levels not part of E_ALL.
+  error_reporting(E_ALL | error_reporting());
+
+  // Override PHP settings required for Drupal to work properly.
+  // sites/default/default.settings.php contains more runtime settings.
+  // The .htaccess file contains settings that cannot be changed at runtime.
+
+  // Don't escape quotes when reading files from the database, disk, etc.
+  ini_set('magic_quotes_runtime', '0');
+  // Use session cookies, not transparent sessions that puts the session id in
+  // the query string.
+  ini_set('session.use_cookies', '1');
+  ini_set('session.use_only_cookies', '1');
+  ini_set('session.use_trans_sid', '0');
+  // Don't send HTTP headers using PHP's session handler.
+  // An empty string is used here to disable the cache limiter.
+  ini_set('session.cache_limiter', '');
+  // Use httponly session cookies.
+  ini_set('session.cookie_httponly', '1');
+
+  // Set sane locale settings, to ensure consistent string, dates, times and
+  // numbers handling.
+  setlocale(LC_ALL, 'C');
+}
+
+/**
+ * Validates that a hostname (for example $_SERVER['HTTP_HOST']) is safe.
+ *
+ * @return
+ *  TRUE if only containing valid characters, or FALSE otherwise.
+ */
+function drupal_valid_http_host($host) {
+  return preg_match('/^\[?(?:[a-zA-Z0-9-:\]_]+\.?)+$/', $host);
+}
+
+/**
+ * Sets the base URL, cookie domain, and session name from configuration.
+ */
+function drupal_settings_initialize() {
+  global $base_url, $base_path, $base_root;
+
+  // Export these settings.php variables to the global namespace.
+  global $databases, $cookie_domain, $conf, $installed_profile, $update_free_access, $db_url, $db_prefix, $drupal_hash_salt, $is_https, $base_secure_url, $base_insecure_url;
+  $conf = array();
+
+  if (file_exists(DRUPAL_ROOT . '/' . conf_path() . '/settings.php')) {
+    include_once DRUPAL_ROOT . '/' . conf_path() . '/settings.php';
+  }
+  $is_https = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on';
+
+  if (isset($base_url)) {
+    // Parse fixed base URL from settings.php.
+    $parts = parse_url($base_url);
+    if (!isset($parts['path'])) {
+      $parts['path'] = '';
+    }
+    $base_path = $parts['path'] . '/';
+    // Build $base_root (everything until first slash after "scheme://").
+    $base_root = substr($base_url, 0, strlen($base_url) - strlen($parts['path']));
+  }
+  else {
+    // Create base URL.
+    $http_protocol = $is_https ? 'https' : 'http';
+    $base_root = $http_protocol . '://' . $_SERVER['HTTP_HOST'];
+
+    $base_url = $base_root;
+
+    // $_SERVER['SCRIPT_NAME'] can, in contrast to $_SERVER['PHP_SELF'], not
+    // be modified by a visitor.
+    if ($dir = rtrim(dirname($_SERVER['SCRIPT_NAME']), '\/')) {
+      $base_path = $dir;
+      $base_url .= $base_path;
+      $base_path .= '/';
+    }
+    else {
+      $base_path = '/';
+    }
+  }
+  $base_secure_url = str_replace('http://', 'https://', $base_url);
+  $base_insecure_url = str_replace('https://', 'http://', $base_url);
+
+  if ($cookie_domain) {
+    // If the user specifies the cookie domain, also use it for session name.
+    $session_name = $cookie_domain;
+  }
+  else {
+    // Otherwise use $base_url as session name, without the protocol
+    // to use the same session identifiers across HTTP and HTTPS.
+    list( , $session_name) = explode('://', $base_url, 2);
+    // HTTP_HOST can be modified by a visitor, but we already sanitized it
+    // in drupal_settings_initialize().
+    if (!empty($_SERVER['HTTP_HOST'])) {
+      $cookie_domain = $_SERVER['HTTP_HOST'];
+      // Strip leading periods, www., and port numbers from cookie domain.
+      $cookie_domain = ltrim($cookie_domain, '.');
+      if (strpos($cookie_domain, 'www.') === 0) {
+        $cookie_domain = substr($cookie_domain, 4);
+      }
+      $cookie_domain = explode(':', $cookie_domain);
+      $cookie_domain = '.' . $cookie_domain[0];
+    }
+  }
+  // Per RFC 2109, cookie domains must contain at least one dot other than the
+  // first. For hosts such as 'localhost' or IP Addresses we don't set a cookie domain.
+  if (count(explode('.', $cookie_domain)) > 2 && !is_numeric(str_replace('.', '', $cookie_domain))) {
+    ini_set('session.cookie_domain', $cookie_domain);
+  }
+  // To prevent session cookies from being hijacked, a user can configure the
+  // SSL version of their website to only transfer session cookies via SSL by
+  // using PHP's session.cookie_secure setting. The browser will then use two
+  // separate session cookies for the HTTPS and HTTP versions of the site. So we
+  // must use different session identifiers for HTTPS and HTTP to prevent a
+  // cookie collision.
+  if ($is_https) {
+    ini_set('session.cookie_secure', TRUE);
+  }
+  $prefix = ini_get('session.cookie_secure') ? 'SSESS' : 'SESS';
+  session_name($prefix . substr(hash('sha256', $session_name), 0, 32));
+}
+
+/**
+ * Returns and optionally sets the filename for a system resource.
+ *
+ * The filename, whether provided, cached, or retrieved from the database, is
+ * only returned if the file exists.
+ *
+ * This function plays a key role in allowing Drupal's resources (modules
+ * and themes) to be located in different places depending on a site's
+ * configuration. For example, a module 'foo' may legally be located
+ * in any of these three places:
+ *
+ * modules/foo/foo.module
+ * sites/all/modules/foo/foo.module
+ * sites/example.com/modules/foo/foo.module
+ *
+ * Calling drupal_get_filename('module', 'foo') will give you one of
+ * the above, depending on where the module is located.
+ *
+ * @param $type
+ *   The type of the item (theme, theme_engine, module, profile).
+ * @param $name
+ *   The name of the item for which the filename is requested.
+ * @param $filename
+ *   The filename of the item if it is to be set explicitly rather
+ *   than by consulting the database.
+ *
+ * @return
+ *   The filename of the requested item or NULL if the item is not found.
+ */
+function drupal_get_filename($type, $name, $filename = NULL) {
+  // The location of files will not change during the request, so do not use
+  // drupal_static().
+  static $files = array(), $dirs = array();
+
+  // Profiles are a special case: they have a fixed location and naming.
+  if ($type == 'profile') {
+    $profile_filename = "profiles/$name/$name.profile";
+    $files[$type][$name] = file_exists($profile_filename) ? $profile_filename : FALSE;
+  }
+  if (!isset($files[$type])) {
+    $files[$type] = array();
+  }
+
+  if (!empty($filename) && file_exists($filename)) {
+    $files[$type][$name] = $filename;
+  }
+  elseif (isset($files[$type][$name])) {
+    // nothing
+  }
+  // Verify that we have an active database connection, before querying
+  // the database. This is required because this function is called both
+  // before we have a database connection (i.e. during installation) and
+  // when a database connection fails.
+  else {
+    try {
+      if (function_exists('db_query')) {
+        $file = db_query("SELECT filename FROM {system} WHERE name = :name AND type = :type", array(':name' => $name, ':type' => $type))->fetchField();
+        if (file_exists(DRUPAL_ROOT . '/' . $file)) {
+          $files[$type][$name] = $file;
+        }
+      }
+    }
+    catch (Exception $e) {
+      // The database table may not exist because Drupal is not yet installed,
+      // or the database might be down. We have a fallback for this case so we
+      // hide the error completely.
+    }
+    // Fallback to searching the filesystem if the database could not find the
+    // file or the file returned by the database is not found.
+    if (!isset($files[$type][$name])) {
+      // We have a consistent directory naming: modules, themes...
+      $dir = $type . 's';
+      if ($type == 'theme_engine') {
+        $dir = 'themes/engines';
+        $extension = 'engine';
+      }
+      elseif ($type == 'theme') {
+        $extension = 'info';
+      }
+      else {
+        $extension = $type;
+      }
+
+      if (!isset($dirs[$dir][$extension])) {
+        $dirs[$dir][$extension] = TRUE;
+        if (!function_exists('drupal_system_listing')) {
+          require_once DRUPAL_ROOT . '/includes/common.inc';
+        }
+        // Scan the appropriate directories for all files with the requested
+        // extension, not just the file we are currently looking for. This
+        // prevents unnecessary scans from being repeated when this function is
+        // called more than once in the same page request.
+        $matches = drupal_system_listing("/^" . DRUPAL_PHP_FUNCTION_PATTERN . "\.$extension$/", $dir, 'name', 0);
+        foreach ($matches as $matched_name => $file) {
+          $files[$type][$matched_name] = $file->uri;
+        }
+      }
+    }
+  }
+
+  if (isset($files[$type][$name])) {
+    return $files[$type][$name];
+  }
+}
+
+/**
+ * Loads the persistent variable table.
+ *
+ * The variable table is composed of values that have been saved in the table
+ * with variable_set() as well as those explicitly specified in the
+ * configuration file.
+ */
+function variable_initialize($conf = array()) {
+  // NOTE: caching the variables improves performance by 20% when serving
+  // cached pages.
+  if ($cached = cache_get('variables', 'cache_bootstrap')) {
+    $variables = $cached->data;
+  }
+  else {
+    // Cache miss. Avoid a stampede.
+    $name = 'variable_init';
+    if (!lock_acquire($name, 1)) {
+      // Another request is building the variable cache.
+      // Wait, then re-run this function.
+      lock_wait($name);
+      return variable_initialize($conf);
+    }
+    else {
+      // Proceed with variable rebuild.
+      $variables = array_map('unserialize', db_query('SELECT name, value FROM {variable}')->fetchAllKeyed());
+      cache_set('variables', $variables, 'cache_bootstrap');
+      lock_release($name);
+    }
+  }
+
+  foreach ($conf as $name => $value) {
+    $variables[$name] = $value;
+  }
+
+  return $variables;
+}
+
+/**
+ * Returns a persistent variable.
+ *
+ * Case-sensitivity of the variable_* functions depends on the database
+ * collation used. To avoid problems, always use lower case for persistent
+ * variable names.
+ *
+ * @param $name
+ *   The name of the variable to return.
+ * @param $default
+ *   The default value to use if this variable has never been set.
+ *
+ * @return
+ *   The value of the variable. Unserialization is taken care of as necessary.
+ *
+ * @see variable_del()
+ * @see variable_set()
+ */
+function variable_get($name, $default = NULL) {
+  global $conf;
+
+  return isset($conf[$name]) ? $conf[$name] : $default;
+}
+
+/**
+ * Sets a persistent variable.
+ *
+ * Case-sensitivity of the variable_* functions depends on the database
+ * collation used. To avoid problems, always use lower case for persistent
+ * variable names.
+ *
+ * @param $name
+ *   The name of the variable to set.
+ * @param $value
+ *   The value to set. This can be any PHP data type; these functions take care
+ *   of serialization as necessary.
+ *
+ * @see variable_del()
+ * @see variable_get()
+ */
+function variable_set($name, $value) {
+  global $conf;
+
+  db_merge('variable')->key(array('name' => $name))->fields(array('value' => serialize($value)))->execute();
+
+  cache_clear_all('variables', 'cache_bootstrap');
+
+  $conf[$name] = $value;
+}
+
+/**
+ * Unsets a persistent variable.
+ *
+ * Case-sensitivity of the variable_* functions depends on the database
+ * collation used. To avoid problems, always use lower case for persistent
+ * variable names.
+ *
+ * @param $name
+ *   The name of the variable to undefine.
+ *
+ * @see variable_get()
+ * @see variable_set()
+ */
+function variable_del($name) {
+  global $conf;
+
+  db_delete('variable')
+    ->condition('name', $name)
+    ->execute();
+  cache_clear_all('variables', 'cache_bootstrap');
+
+  unset($conf[$name]);
+}
+
+/**
+ * Retrieves the current page from the cache.
+ *
+ * Note: we do not serve cached pages to authenticated users, or to anonymous
+ * users when $_SESSION is non-empty. $_SESSION may contain status messages
+ * from a form submission, the contents of a shopping cart, or other user-
+ * specific content that should not be cached and displayed to other users.
+ *
+ * @param $check_only
+ *   (optional) Set to TRUE to only return whether a previous call found a
+ *   cache entry.
+ *
+ * @return
+ *   The cache object, if the page was found in the cache, NULL otherwise.
+ */
+function drupal_page_get_cache($check_only = FALSE) {
+  global $base_root;
+  static $cache_hit = FALSE;
+
+  if ($check_only) {
+    return $cache_hit;
+  }
+
+  if (drupal_page_is_cacheable()) {
+    $cache = cache_get($base_root . request_uri(), 'cache_page');
+    if ($cache !== FALSE) {
+      $cache_hit = TRUE;
+    }
+    return $cache;
+  }
+}
+
+/**
+ * Determines the cacheability of the current page.
+ *
+ * @param $allow_caching
+ *   Set to FALSE if you want to prevent this page to get cached.
+ *
+ * @return
+ *   TRUE if the current page can be cached, FALSE otherwise.
+ */
+function drupal_page_is_cacheable($allow_caching = NULL) {
+  $allow_caching_static = &drupal_static(__FUNCTION__, TRUE);
+  if (isset($allow_caching)) {
+    $allow_caching_static = $allow_caching;
+  }
+
+  return $allow_caching_static && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD')
+    && !drupal_is_cli();
+}
+
+/**
+ * Invokes a bootstrap hook in all bootstrap modules that implement it.
+ *
+ * @param $hook
+ *   The name of the bootstrap hook to invoke.
+ *
+ * @see bootstrap_hooks()
+ */
+function bootstrap_invoke_all($hook) {
+  // Bootstrap modules should have been loaded when this function is called, so
+  // we don't need to tell module_list() to reset its internal list (and we
+  // therefore leave the first parameter at its default value of FALSE). We
+  // still pass in TRUE for the second parameter, though; in case this is the
+  // first time during the bootstrap that module_list() is called, we want to
+  // make sure that its internal cache is primed with the bootstrap modules
+  // only.
+  foreach (module_list(FALSE, TRUE) as $module) {
+    drupal_load('module', $module);
+    module_invoke($module, $hook);
+  }
+}
+
+/**
+ * Includes a file with the provided type and name.
+ *
+ * This prevents including a theme, engine, module, etc., more than once.
+ *
+ * @param $type
+ *   The type of item to load (i.e. theme, theme_engine, module).
+ * @param $name
+ *   The name of the item to load.
+ *
+ * @return
+ *   TRUE if the item is loaded or has already been loaded.
+ */
+function drupal_load($type, $name) {
+  // Once a file is included this can't be reversed during a request so do not
+  // use drupal_static() here.
+  static $files = array();
+
+  if (isset($files[$type][$name])) {
+    return TRUE;
+  }
+
+  $filename = drupal_get_filename($type, $name);
+
+  if ($filename) {
+    include_once DRUPAL_ROOT . '/' . $filename;
+    $files[$type][$name] = TRUE;
+
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+/**
+ * Sets an HTTP response header for the current page.
+ *
+ * Note: When sending a Content-Type header, always include a 'charset' type,
+ * too. This is necessary to avoid security bugs (e.g. UTF-7 XSS).
+ *
+ * @param $name
+ *   The HTTP header name, or the special 'Status' header name.
+ * @param $value
+ *   The HTTP header value; if equal to FALSE, the specified header is unset.
+ *   If $name is 'Status', this is expected to be a status code followed by a
+ *   reason phrase, e.g. "404 Not Found".
+ * @param $append
+ *   Whether to append the value to an existing header or to replace it.
+ */
+function drupal_add_http_header($name, $value, $append = FALSE) {
+  // The headers as name/value pairs.
+  $headers = &drupal_static('drupal_http_headers', array());
+
+  $name_lower = strtolower($name);
+  _drupal_set_preferred_header_name($name);
+
+  if ($value === FALSE) {
+    $headers[$name_lower] = FALSE;
+  }
+  elseif (isset($headers[$name_lower]) && $append) {
+    // Multiple headers with identical names may be combined using comma (RFC
+    // 2616, section 4.2).
+    $headers[$name_lower] .= ',' . $value;
+  }
+  else {
+    $headers[$name_lower] = $value;
+  }
+  drupal_send_headers(array($name => $headers[$name_lower]), TRUE);
+}
+
+/**
+ * Gets the HTTP response headers for the current page.
+ *
+ * @param $name
+ *   An HTTP header name. If omitted, all headers are returned as name/value
+ *   pairs. If an array value is FALSE, the header has been unset.
+ *
+ * @return
+ *   A string containing the header value, or FALSE if the header has been set,
+ *   or NULL if the header has not been set.
+ */
+function drupal_get_http_header($name = NULL) {
+  $headers = &drupal_static('drupal_http_headers', array());
+  if (isset($name)) {
+    $name = strtolower($name);
+    return isset($headers[$name]) ? $headers[$name] : NULL;
+  }
+  else {
+    return $headers;
+  }
+}
+
+/**
+ * Sets the preferred name for the HTTP header.
+ *
+ * Header names are case-insensitive, but for maximum compatibility they should
+ * follow "common form" (see RFC 2617, section 4.2).
+ */
+function _drupal_set_preferred_header_name($name = NULL) {
+  static $header_names = array();
+
+  if (!isset($name)) {
+    return $header_names;
+  }
+  $header_names[strtolower($name)] = $name;
+}
+
+/**
+ * Sends the HTTP response headers that were previously set, adding defaults.
+ *
+ * Headers are set in drupal_add_http_header(). Default headers are not set
+ * if they have been replaced or unset using drupal_add_http_header().
+ *
+ * @param array $default_headers
+ *   (optional) An array of headers as name/value pairs.
+ * @param bool $only_default
+ *   (optional) If TRUE and headers have already been sent, send only the
+ *   specified headers.
+ */
+function drupal_send_headers($default_headers = array(), $only_default = FALSE) {
+  $headers_sent = &drupal_static(__FUNCTION__, FALSE);
+  $headers = drupal_get_http_header();
+  if ($only_default && $headers_sent) {
+    $headers = array();
+  }
+  $headers_sent = TRUE;
+
+  $header_names = _drupal_set_preferred_header_name();
+  foreach ($default_headers as $name => $value) {
+    $name_lower = strtolower($name);
+    if (!isset($headers[$name_lower])) {
+      $headers[$name_lower] = $value;
+      $header_names[$name_lower] = $name;
+    }
+  }
+  foreach ($headers as $name_lower => $value) {
+    if ($name_lower == 'status') {
+      header($_SERVER['SERVER_PROTOCOL'] . ' ' . $value);
+    }
+    // Skip headers that have been unset.
+    elseif ($value !== FALSE) {
+      header($header_names[$name_lower] . ': ' . $value);
+    }
+  }
+}
+
+/**
+ * Sets HTTP headers in preparation for a page response.
+ *
+ * Authenticated users are always given a 'no-cache' header, and will fetch a
+ * fresh page on every request. This prevents authenticated users from seeing
+ * locally cached pages.
+ *
+ * Also give each page a unique ETag. This will force clients to include both
+ * an If-Modified-Since header and an If-None-Match header when doing
+ * conditional requests for the page (required by RFC 2616, section 13.3.4),
+ * making the validation more robust. This is a workaround for a bug in Mozilla
+ * Firefox that is triggered when Drupal's caching is enabled and the user
+ * accesses Drupal via an HTTP proxy (see
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=269303): When an authenticated
+ * user requests a page, and then logs out and requests the same page again,
+ * Firefox may send a conditional request based on the page that was cached
+ * locally when the user was logged in. If this page did not have an ETag
+ * header, the request only contains an If-Modified-Since header. The date will
+ * be recent, because with authenticated users the Last-Modified header always
+ * refers to the time of the request. If the user accesses Drupal via a proxy
+ * server, and the proxy already has a cached copy of the anonymous page with an
+ * older Last-Modified date, the proxy may respond with 304 Not Modified, making
+ * the client think that the anonymous and authenticated pageviews are
+ * identical.
+ *
+ * @see drupal_page_set_cache()
+ */
+function drupal_page_header() {
+  $headers_sent = &drupal_static(__FUNCTION__, FALSE);
+  if ($headers_sent) {
+    return TRUE;
+  }
+  $headers_sent = TRUE;
+
+  $default_headers = array(
+    'Expires' => 'Sun, 19 Nov 1978 05:00:00 GMT',
+    'Last-Modified' => gmdate(DATE_RFC1123, REQUEST_TIME),
+    'Cache-Control' => 'no-cache, must-revalidate, post-check=0, pre-check=0',
+    'ETag' => '"' . REQUEST_TIME . '"',
+  );
+  drupal_send_headers($default_headers);
+}
+
+/**
+ * Sets HTTP headers in preparation for a cached page response.
+ *
+ * The headers allow as much as possible in proxies and browsers without any
+ * particular knowledge about the pages. Modules can override these headers
+ * using drupal_add_http_header().
+ *
+ * If the request is conditional (using If-Modified-Since and If-None-Match),
+ * and the conditions match those currently in the cache, a 304 Not Modified
+ * response is sent.
+ */
+function drupal_serve_page_from_cache(stdClass $cache) {
+  // Negotiate whether to use compression.
+  $page_compression = !empty($cache->data['page_compressed']);
+  $return_compressed = $page_compression && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE;
+
+  // Get headers set in hook_boot(). Keys are lower-case.
+  $hook_boot_headers = drupal_get_http_header();
+
+  // Headers generated in this function, that may be replaced or unset using
+  // drupal_add_http_headers(). Keys are mixed-case.
+  $default_headers = array();
+
+  foreach ($cache->data['headers'] as $name => $value) {
+    // In the case of a 304 response, certain headers must be sent, and the
+    // remaining may not (see RFC 2616, section 10.3.5). Do not override
+    // headers set in hook_boot().
+    $name_lower = strtolower($name);
+    if (in_array($name_lower, array('content-location', 'expires', 'cache-control', 'vary')) && !isset($hook_boot_headers[$name_lower])) {
+      drupal_add_http_header($name, $value);
+      unset($cache->data['headers'][$name]);
+    }
+  }
+
+  // If the client sent a session cookie, a cached copy will only be served
+  // to that one particular client due to Vary: Cookie. Thus, do not set
+  // max-age > 0, allowing the page to be cached by external proxies, when a
+  // session cookie is present unless the Vary header has been replaced or
+  // unset in hook_boot().
+  $max_age = !isset($_COOKIE[session_name()]) || isset($hook_boot_headers['vary']) ? variable_get('page_cache_maximum_age', 0) : 0;
+  $default_headers['Cache-Control'] = 'public, max-age=' . $max_age;
+
+  // Entity tag should change if the output changes.
+  $etag = '"' . $cache->created . '-' . intval($return_compressed) . '"';
+  header('Etag: ' . $etag);
+
+  // See if the client has provided the required HTTP headers.
+  $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) : FALSE;
+  $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : FALSE;
+
+  if ($if_modified_since && $if_none_match
+      && $if_none_match == $etag // etag must match
+      && $if_modified_since == $cache->created) {  // if-modified-since must match
+    header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
+    drupal_send_headers($default_headers);
+    return;
+  }
+
+  // Send the remaining headers.
+  foreach ($cache->data['headers'] as $name => $value) {
+    drupal_add_http_header($name, $value);
+  }
+
+  $default_headers['Last-Modified'] = gmdate(DATE_RFC1123, $cache->created);
+
+  // HTTP/1.0 proxies does not support the Vary header, so prevent any caching
+  // by sending an Expires date in the past. HTTP/1.1 clients ignores the
+  // Expires header if a Cache-Control: max-age= directive is specified (see RFC
+  // 2616, section 14.9.3).
+  $default_headers['Expires'] = 'Sun, 19 Nov 1978 05:00:00 GMT';
+
+  drupal_send_headers($default_headers);
+
+  // Allow HTTP proxies to cache pages for anonymous users without a session
+  // cookie. The Vary header is used to indicates the set of request-header
+  // fields that fully determines whether a cache is permitted to use the
+  // response to reply to a subsequent request for a given URL without
+  // revalidation. If a Vary header has been set in hook_boot(), it is assumed
+  // that the module knows how to cache the page.
+  if (!isset($hook_boot_headers['vary']) && !variable_get('omit_vary_cookie')) {
+    header('Vary: Cookie');
+  }
+
+  if ($page_compression) {
+    header('Vary: Accept-Encoding', FALSE);
+    // If page_compression is enabled, the cache contains gzipped data.
+    if ($return_compressed) {
+      // $cache->data['body'] is already gzip'ed, so make sure
+      // zlib.output_compression does not compress it once more.
+      ini_set('zlib.output_compression', '0');
+      header('Content-Encoding: gzip');
+    }
+    else {
+      // The client does not support compression, so unzip the data in the
+      // cache. Strip the gzip header and run uncompress.
+      $cache->data['body'] = gzinflate(substr(substr($cache->data['body'], 10), 0, -8));
+    }
+  }
+
+  // Print the page.
+  print $cache->data['body'];
+}
+
+/**
+ * Defines the critical hooks that force modules to always be loaded.
+ */
+function bootstrap_hooks() {
+  return array('boot', 'exit', 'watchdog', 'language_init');
+}
+
+/**
+ * Unserializes and appends elements from a serialized string.
+ *
+ * @param $obj
+ *   The object to which the elements are appended.
+ * @param $field
+ *   The attribute of $obj whose value should be unserialized.
+ */
+function drupal_unpack($obj, $field = 'data') {
+  if ($obj->$field && $data = unserialize($obj->$field)) {
+    foreach ($data as $key => $value) {
+      if (!empty($key) && !isset($obj->$key)) {
+        $obj->$key = $value;
+      }
+    }
+  }
+  return $obj;
+}
+
+/**
+ * Translates a string to the current language or to a given language.
+ *
+ * The t() function serves two purposes. First, at run-time it translates
+ * user-visible text into the appropriate language. Second, various mechanisms
+ * that figure out what text needs to be translated work off t() -- the text
+ * inside t() calls is added to the database of strings to be translated.
+ * These strings are expected to be in English, so the first argument should
+ * always be in English. To enable a fully-translatable site, it is important
+ * that all human-readable text that will be displayed on the site or sent to
+ * a user is passed through the t() function, or a related function. See the
+ * @link http://drupal.org/node/322729 Localization API @endlink pages for
+ * more information, including recommendations on how to break up or not
+ * break up strings for translation.
+ *
+ * @section sec_translating_vars Translating Variables
+ * You should never use t() to translate variables, such as calling
+ * @code t($text); @endcode, unless the text that the variable holds has been
+ * passed through t() elsewhere (e.g., $text is one of several translated
+ * literal strings in an array). It is especially important never to call
+ * @code t($user_text); @endcode, where $user_text is some text that a user
+ * entered - doing that can lead to cross-site scripting and other security
+ * problems. However, you can use variable substitution in your string, to put
+ * variable text such as user names or link URLs into translated text. Variable
+ * substitution looks like this:
+ * @code
+ * $text = t("@name's blog", array('@name' => format_username($account)));
+ * @endcode
+ * Basically, you can put variables like @name into your string, and t() will
+ * substitute their sanitized values at translation time. (See the
+ * Localization API pages referenced above and the documentation of
+ * format_string() for details about how to define variables in your string.)
+ * Translators can then rearrange the string as necessary for the language
+ * (e.g., in Spanish, it might be "blog de @name").
+ *
+ * @section sec_alt_funcs_install Use During Installation Phase
+ * During the Drupal installation phase, some resources used by t() wil not be
+ * available to code that needs localization. See st() and get_t() for
+ * alternatives.
+ *
+ * @param $string
+ *   A string containing the English string to translate.
+ * @param $args
+ *   An associative array of replacements to make after translation. Based
+ *   on the first character of the key, the value is escaped and/or themed.
+ *   See format_string() for details.
+ * @param $options
+ *   An associative array of additional options, with the following elements:
+ *   - 'langcode' (defaults to the current language): The language code to
+ *     translate to a language other than what is used to display the page.
+ *   - 'context' (defaults to the empty context): The context the source string
+ *     belongs to.
+ *
+ * @return
+ *   The translated string.
+ *
+ * @see st()
+ * @see get_t()
+ * @see format_string()
+ * @ingroup sanitization
+ */
+function t($string, array $args = array(), array $options = array()) {
+  global $language;
+  static $custom_strings;
+
+  // Merge in default.
+  if (empty($options['langcode'])) {
+    $options['langcode'] = isset($language->language) ? $language->language : 'en';
+  }
+  if (empty($options['context'])) {
+    $options['context'] = '';
+  }
+
+  // First, check for an array of customized strings. If present, use the array
+  // *instead of* database lookups. This is a high performance way to provide a
+  // handful of string replacements. See settings.php for examples.
+  // Cache the $custom_strings variable to improve performance.
+  if (!isset($custom_strings[$options['langcode']])) {
+    $custom_strings[$options['langcode']] = variable_get('locale_custom_strings_' . $options['langcode'], array());
+  }
+  // Custom strings work for English too, even if locale module is disabled.
+  if (isset($custom_strings[$options['langcode']][$options['context']][$string])) {
+    $string = $custom_strings[$options['langcode']][$options['context']][$string];
+  }
+  // Translate with locale module if enabled.
+  elseif ($options['langcode'] != 'en' && function_exists('locale')) {
+    $string = locale($string, $options['context'], $options['langcode']);
+  }
+  if (empty($args)) {
+    return $string;
+  }
+  else {
+    return format_string($string, $args);
+  }
+}
+
+/**
+ * Formats a string for HTML display by replacing variable placeholders.
+ *
+ * This function replaces variable placeholders in a string with the requested
+ * values and escapes the values so they can be safely displayed as HTML. It
+ * should be used on any unknown text that is intended to be printed to an HTML
+ * page (especially text that may have come from untrusted users, since in that
+ * case it prevents cross-site scripting and other security problems).
+ *
+ * In most cases, you should use t() rather than calling this function
+ * directly, since it will translate the text (on non-English-only sites) in
+ * addition to formatting it.
+ *
+ * @param $string
+ *   A string containing placeholders.
+ * @param $args
+ *   An associative array of replacements to make. Occurrences in $string of
+ *   any key in $args are replaced with the corresponding value, after optional
+ *   sanitization and formatting. The type of sanitization and formatting
+ *   depends on the first character of the key:
+ *   - @variable: Escaped to HTML using check_plain(). Use this as the default
+ *     choice for anything displayed on a page on the site.
+ *   - %variable: Escaped to HTML and formatted using drupal_placeholder(),
+ *     which makes it display as <em>emphasized</em> text.
+ *   - !variable: Inserted as is, with no sanitization or formatting. Only use
+ *     this for text that has already been prepared for HTML display (for
+ *     example, user-supplied text that has already been run through
+ *     check_plain() previously, or is expected to contain some limited HTML
+ *     tags and has already been run through filter_xss() previously).
+ *
+ * @see t()
+ * @ingroup sanitization
+ */
+function format_string($string, array $args = array()) {
+  // Transform arguments before inserting them.
+  foreach ($args as $key => $value) {
+    switch ($key[0]) {
+      case '@':
+        // Escaped only.
+        $args[$key] = check_plain($value);
+        break;
+
+      case '%':
+      default:
+        // Escaped and placeholder.
+        $args[$key] = drupal_placeholder($value);
+        break;
+
+      case '!':
+        // Pass-through.
+    }
+  }
+  return strtr($string, $args);
+}
+
+/**
+ * Encodes special characters in a plain-text string for display as HTML.
+ *
+ * Also validates strings as UTF-8 to prevent cross site scripting attacks on
+ * Internet Explorer 6.
+ *
+ * @param $text
+ *   The text to be checked or processed.
+ *
+ * @return
+ *   An HTML safe version of $text, or an empty string if $text is not
+ *   valid UTF-8.
+ *
+ * @see drupal_validate_utf8()
+ * @ingroup sanitization
+ */
+function check_plain($text) {
+  return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
+}
+
+/**
+ * Checks whether a string is valid UTF-8.
+ *
+ * All functions designed to filter input should use drupal_validate_utf8
+ * to ensure they operate on valid UTF-8 strings to prevent bypass of the
+ * filter.
+ *
+ * When text containing an invalid UTF-8 lead byte (0xC0 - 0xFF) is presented
+ * as UTF-8 to Internet Explorer 6, the program may misinterpret subsequent
+ * bytes. When these subsequent bytes are HTML control characters such as
+ * quotes or angle brackets, parts of the text that were deemed safe by filters
+ * end up in locations that are potentially unsafe; An onerror attribute that
+ * is outside of a tag, and thus deemed safe by a filter, can be interpreted
+ * by the browser as if it were inside the tag.
+ *
+ * The function does not return FALSE for strings containing character codes
+ * above U+10FFFF, even though these are prohibited by RFC 3629.
+ *
+ * @param $text
+ *   The text to check.
+ *
+ * @return
+ *   TRUE if the text is valid UTF-8, FALSE if not.
+ */
+function drupal_validate_utf8($text) {
+  if (strlen($text) == 0) {
+    return TRUE;
+  }
+  // With the PCRE_UTF8 modifier 'u', preg_match() fails silently on strings
+  // containing invalid UTF-8 byte sequences. It does not reject character
+  // codes above U+10FFFF (represented by 4 or more octets), though.
+  return (preg_match('/^./us', $text) == 1);
+}
+
+/**
+ * Returns the equivalent of Apache's $_SERVER['REQUEST_URI'] variable.
+ *
+ * Because $_SERVER['REQUEST_URI'] is only available on Apache, we generate an
+ * equivalent using other environment variables.
+ */
+function request_uri() {
+  if (isset($_SERVER['REQUEST_URI'])) {
+    $uri = $_SERVER['REQUEST_URI'];
+  }
+  else {
+    if (isset($_SERVER['argv'])) {
+      $uri = $_SERVER['SCRIPT_NAME'] . '?' . $_SERVER['argv'][0];
+    }
+    elseif (isset($_SERVER['QUERY_STRING'])) {
+      $uri = $_SERVER['SCRIPT_NAME'] . '?' . $_SERVER['QUERY_STRING'];
+    }
+    else {
+      $uri = $_SERVER['SCRIPT_NAME'];
+    }
+  }
+  // Prevent multiple slashes to avoid cross site requests via the Form API.
+  $uri = '/' . ltrim($uri, '/');
+
+  return $uri;
+}
+
+/**
+ * Logs an exception.
+ *
+ * This is a wrapper function for watchdog() which automatically decodes an
+ * exception.
+ *
+ * @param $type
+ *   The category to which this message belongs.
+ * @param $exception
+ *   The exception that is going to be logged.
+ * @param $message
+ *   The message to store in the log. If empty, a text that contains all useful
+ *   information about the passed-in exception is used.
+ * @param $variables
+ *   Array of variables to replace in the message on display. Defaults to the
+ *   return value of drupal_decode_exception().
+ * @param $severity
+ *   The severity of the message, as per RFC 3164.
+ * @param $link
+ *   A link to associate with the message.
+ *
+ * @see watchdog()
+ * @see drupal_decode_exception()
+ */
+function watchdog_exception($type, Exception $exception, $message = NULL, $variables = array(), $severity = WATCHDOG_ERROR, $link = NULL) {
+
+   // Use a default value if $message is not set.
+   if (empty($message)) {
+     // The exception message is run through check_plain() by _drupal_decode_exception().
+     $message = '%type: !message in %function (line %line of %file).';
+   }
+   // $variables must be an array so that we can add the exception information.
+   if (!is_array($variables)) {
+     $variables = array();
+   }
+
+   require_once DRUPAL_ROOT . '/includes/errors.inc';
+   $variables += _drupal_decode_exception($exception);
+   watchdog($type, $message, $variables, $severity, $link);
+}
+
+/**
+ * Logs a system message.
+ *
+ * @param $type
+ *   The category to which this message belongs. Can be any string, but the
+ *   general practice is to use the name of the module calling watchdog().
+ * @param $message
+ *   The message to store in the log. Keep $message translatable
+ *   by not concatenating dynamic values into it! Variables in the
+ *   message should be added by using placeholder strings alongside
+ *   the variables argument to declare the value of the placeholders.
+ *   See t() for documentation on how $message and $variables interact.
+ * @param $variables
+ *   Array of variables to replace in the message on display or
+ *   NULL if message is already translated or not possible to
+ *   translate.
+ * @param $severity
+ *   The severity of the message; one of the following values as defined in
+ *   @link http://www.faqs.org/rfcs/rfc3164.html RFC 3164: @endlink
+ *   - WATCHDOG_EMERGENCY: Emergency, system is unusable.
+ *   - WATCHDOG_ALERT: Alert, action must be taken immediately.
+ *   - WATCHDOG_CRITICAL: Critical conditions.
+ *   - WATCHDOG_ERROR: Error conditions.
+ *   - WATCHDOG_WARNING: Warning conditions.
+ *   - WATCHDOG_NOTICE: (default) Normal but significant conditions.
+ *   - WATCHDOG_INFO: Informational messages.
+ *   - WATCHDOG_DEBUG: Debug-level messages.
+ * @param $link
+ *   A link to associate with the message.
+ *
+ * @see watchdog_severity_levels()
+ * @see hook_watchdog()
+ */
+function watchdog($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL) {
+  global $user, $base_root;
+
+  static $in_error_state = FALSE;
+
+  // It is possible that the error handling will itself trigger an error. In that case, we could
+  // end up in an infinite loop. To avoid that, we implement a simple static semaphore.
+  if (!$in_error_state && function_exists('module_implements')) {
+    $in_error_state = TRUE;
+
+    // The user object may not exist in all conditions, so 0 is substituted if needed.
+    $user_uid = isset($user->uid) ? $user->uid : 0;
+
+    // Prepare the fields to be logged
+    $log_entry = array(
+      'type'        => $type,
+      'message'     => $message,
+      'variables'   => $variables,
+      'severity'    => $severity,
+      'link'        => $link,
+      'user'        => $user,
+      'uid'         => $user_uid,
+      'request_uri' => $base_root . request_uri(),
+      'referer'     => isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '',
+      'ip'          => ip_address(),
+      // Request time isn't accurate for long processes, use time() instead.
+      'timestamp'   => time(),
+    );
+
+    // Call the logging hooks to log/process the message
+    foreach (module_implements('watchdog') as $module) {
+      module_invoke($module, 'watchdog', $log_entry);
+    }
+
+    // It is critical that the semaphore is only cleared here, in the parent
+    // watchdog() call (not outside the loop), to prevent recursive execution.
+    $in_error_state = FALSE;
+  }
+}
+
+/**
+ * Sets a message to display to the user.
+ *
+ * Messages are stored in a session variable and displayed in page.tpl.php via
+ * the $messages theme variable.
+ *
+ * Example usage:
+ * @code
+ * drupal_set_message(t('An error occurred and processing did not complete.'), 'error');
+ * @endcode
+ *
+ * @param string $message
+ *   (optional) The translated message to be displayed to the user. For
+ *   consistency with other messages, it should begin with a capital letter and
+ *   end with a period.
+ * @param string $type
+ *   (optional) The message's type. Defaults to 'status'. These values are
+ *   supported:
+ *   - 'status'
+ *   - 'warning'
+ *   - 'error'
+ * @param bool $repeat
+ *   (optional) If this is FALSE and the message is already set, then the
+ *   message won't be repeated. Defaults to TRUE.
+ *
+ * @return array|null
+ *   A multidimensional array with keys corresponding to the set message types.
+ *   The indexed array values of each contain the set messages for that type.
+ *   Or, if there are no messages set, the function returns NULL.
+ *
+ * @see drupal_get_messages()
+ * @see theme_status_messages()
+ */
+function drupal_set_message($message = NULL, $type = 'status', $repeat = TRUE) {
+  if ($message) {
+    if (!isset($_SESSION['messages'][$type])) {
+      $_SESSION['messages'][$type] = array();
+    }
+
+    if ($repeat || !in_array($message, $_SESSION['messages'][$type])) {
+      $_SESSION['messages'][$type][] = $message;
+    }
+
+    // Mark this page as being uncacheable.
+    drupal_page_is_cacheable(FALSE);
+  }
+
+  // Messages not set when DB connection fails.
+  return isset($_SESSION['messages']) ? $_SESSION['messages'] : NULL;
+}
+
+/**
+ * Returns all messages that have been set with drupal_set_message().
+ *
+ * @param string $type
+ *   (optional) Limit the messages returned by type. Defaults to NULL, meaning
+ *   all types. These values are supported:
+ *   - NULL
+ *   - 'status'
+ *   - 'warning'
+ *   - 'error'
+ * @param bool $clear_queue
+ *   (optional) If this is TRUE, the queue will be cleared of messages of the
+ *   type specified in the $type parameter. Otherwise the queue will be left
+ *   intact. Defaults to TRUE.
+ *
+ * @return array
+ *   A multidimensional array with keys corresponding to the set message types.
+ *   The indexed array values of each contain the set messages for that type.
+ *   The messages returned are limited to the type specified in the $type
+ *   parameter. If there are no messages of the specified type, an empty array
+ *   is returned.
+ *
+ * @see drupal_set_message()
+ * @see theme_status_messages()
+ */
+function drupal_get_messages($type = NULL, $clear_queue = TRUE) {
+  if ($messages = drupal_set_message()) {
+    if ($type) {
+      if ($clear_queue) {
+        unset($_SESSION['messages'][$type]);
+      }
+      if (isset($messages[$type])) {
+        return array($type => $messages[$type]);
+      }
+    }
+    else {
+      if ($clear_queue) {
+        unset($_SESSION['messages']);
+      }
+      return $messages;
+    }
+  }
+  return array();
+}
+
+/**
+ * Gets the title of the current page.
+ *
+ * The title is displayed on the page and in the title bar.
+ *
+ * @return
+ *   The current page's title.
+ */
+function drupal_get_title() {
+  $title = drupal_set_title();
+
+  // During a bootstrap, menu.inc is not included and thus we cannot provide a title.
+  if (!isset($title) && function_exists('menu_get_active_title')) {
+    $title = check_plain(menu_get_active_title());
+  }
+
+  return $title;
+}
+
+/**
+ * Sets the title of the current page.
+ *
+ * The title is displayed on the page and in the title bar.
+ *
+ * @param $title
+ *   Optional string value to assign to the page title; or if set to NULL
+ *   (default), leaves the current title unchanged.
+ * @param $output
+ *   Optional flag - normally should be left as CHECK_PLAIN. Only set to
+ *   PASS_THROUGH if you have already removed any possibly dangerous code
+ *   from $title using a function like check_plain() or filter_xss(). With this
+ *   flag the string will be passed through unchanged.
+ *
+ * @return
+ *   The updated title of the current page.
+ */
+function drupal_set_title($title = NULL, $output = CHECK_PLAIN) {
+  $stored_title = &drupal_static(__FUNCTION__);
+
+  if (isset($title)) {
+    $stored_title = ($output == PASS_THROUGH) ? $title : check_plain($title);
+  }
+
+  return $stored_title;
+}
+
+/**
+ * Checks to see if an IP address has been blocked.
+ *
+ * Blocked IP addresses are stored in the database by default. However for
+ * performance reasons we allow an override in settings.php. This allows us
+ * to avoid querying the database at this critical stage of the bootstrap if
+ * an administrative interface for IP address blocking is not required.
+ *
+ * @param $ip
+ *   IP address to check.
+ *
+ * @return bool
+ *   TRUE if access is denied, FALSE if access is allowed.
+ */
+function drupal_is_denied($ip) {
+  // Because this function is called on every page request, we first check
+  // for an array of IP addresses in settings.php before querying the
+  // database.
+  $blocked_ips = variable_get('blocked_ips');
+  $denied = FALSE;
+  if (isset($blocked_ips) && is_array($blocked_ips)) {
+    $denied = in_array($ip, $blocked_ips);
+  }
+  // Only check if database.inc is loaded already. If
+  // $conf['page_cache_without_database'] = TRUE; is set in settings.php,
+  // then the database won't be loaded here so the IPs in the database
+  // won't be denied. However the user asked explicitly not to use the
+  // database and also in this case it's quite likely that the user relies
+  // on higher performance solutions like a firewall.
+  elseif (class_exists('Database', FALSE)) {
+    $denied = (bool)db_query("SELECT 1 FROM {blocked_ips} WHERE ip = :ip", array(':ip' => $ip))->fetchField();
+  }
+  return $denied;
+}
+
+/**
+ * Handles denied users.
+ *
+ * @param $ip
+ *   IP address to check. Prints a message and exits if access is denied.
+ */
+function drupal_block_denied($ip) {
+  // Deny access to blocked IP addresses - t() is not yet available.
+  if (drupal_is_denied($ip)) {
+    header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
+    print 'Sorry, ' . check_plain(ip_address()) . ' has been banned.';
+    exit();
+  }
+}
+
+/**
+ * Returns a URL-safe, base64 encoded string of highly randomized bytes (over the full 8-bit range).
+ *
+ * @param $byte_count
+ *   The number of random bytes to fetch and base64 encode.
+ *
+ * @return string
+ *   The base64 encoded result will have a length of up to 4 * $byte_count.
+ */
+function drupal_random_key($byte_count = 32) {
+  return drupal_base64_encode(drupal_random_bytes($byte_count));
+}
+
+/**
+ * Returns a URL-safe, base64 encoded version of the supplied string.
+ *
+ * @param $string
+ *   The string to convert to base64.
+ *
+ * @return string
+ */
+function drupal_base64_encode($string) {
+  $data = base64_encode($string);
+  // Modify the output so it's safe to use in URLs.
+  return strtr($data, array('+' => '-', '/' => '_', '=' => ''));
+}
+
+/**
+ * Returns a string of highly randomized bytes (over the full 8-bit range).
+ *
+ * This function is better than simply calling mt_rand() or any other built-in
+ * PHP function because it can return a long string of bytes (compared to < 4
+ * bytes normally from mt_rand()) and uses the best available pseudo-random
+ * source.
+ *
+ * @param $count
+ *   The number of characters (bytes) to return in the string.
+ */
+function drupal_random_bytes($count)  {
+  // $random_state does not use drupal_static as it stores random bytes.
+  static $random_state, $bytes, $has_openssl;
+
+  $missing_bytes = $count - strlen($bytes);
+
+  if ($missing_bytes > 0) {
+    // PHP versions prior 5.3.4 experienced openssl_random_pseudo_bytes()
+    // locking on Windows and rendered it unusable.
+    if (!isset($has_openssl)) {
+      $has_openssl = version_compare(PHP_VERSION, '5.3.4', '>=') && function_exists('openssl_random_pseudo_bytes');
+    }
+
+    // openssl_random_pseudo_bytes() will find entropy in a system-dependent
+    // way.
+    if ($has_openssl) {
+      $bytes .= openssl_random_pseudo_bytes($missing_bytes);
+    }
+
+    // Else, read directly from /dev/urandom, which is available on many *nix
+    // systems and is considered cryptographically secure.
+    elseif ($fh = @fopen('/dev/urandom', 'rb')) {
+      // PHP only performs buffered reads, so in reality it will always read
+      // at least 4096 bytes. Thus, it costs nothing extra to read and store
+      // that much so as to speed any additional invocations.
+      $bytes .= fread($fh, max(4096, $missing_bytes));
+      fclose($fh);
+    }
+
+    // If we couldn't get enough entropy, this simple hash-based PRNG will
+    // generate a good set of pseudo-random bytes on any system.
+    // Note that it may be important that our $random_state is passed
+    // through hash() prior to being rolled into $output, that the two hash()
+    // invocations are different, and that the extra input into the first one -
+    // the microtime() - is prepended rather than appended. This is to avoid
+    // directly leaking $random_state via the $output stream, which could
+    // allow for trivial prediction of further "random" numbers.
+    if (strlen($bytes) < $count) {
+      // Initialize on the first call. The contents of $_SERVER includes a mix of
+      // user-specific and system information that varies a little with each page.
+      if (!isset($random_state)) {
+        $random_state = print_r($_SERVER, TRUE);
+        if (function_exists('getmypid')) {
+          // Further initialize with the somewhat random PHP process ID.
+          $random_state .= getmypid();
+        }
+        $bytes = '';
+      }
+
+      do {
+        $random_state = hash('sha256', microtime() . mt_rand() . $random_state);
+        $bytes .= hash('sha256', mt_rand() . $random_state, TRUE);
+      }
+      while (strlen($bytes) < $count);
+    }
+  }
+  $output = substr($bytes, 0, $count);
+  $bytes = substr($bytes, $count);
+  return $output;
+}
+
+/**
+ * Calculates a base-64 encoded, URL-safe sha-256 hmac.
+ *
+ * @param string $data
+ *   String to be validated with the hmac.
+ * @param string $key
+ *   A secret string key.
+ *
+ * @return string
+ *   A base-64 encoded sha-256 hmac, with + replaced with -, / with _ and
+ *   any = padding characters removed.
+ */
+function drupal_hmac_base64($data, $key) {
+  // Casting $data and $key to strings here is necessary to avoid empty string
+  // results of the hash function if they are not scalar values. As this
+  // function is used in security-critical contexts like token validation it is
+  // important that it never returns an empty string.
+  $hmac = base64_encode(hash_hmac('sha256', (string) $data, (string) $key, TRUE));
+  // Modify the hmac so it's safe to use in URLs.
+  return strtr($hmac, array('+' => '-', '/' => '_', '=' => ''));
+}
+
+/**
+ * Calculates a base-64 encoded, URL-safe sha-256 hash.
+ *
+ * @param $data
+ *   String to be hashed.
+ *
+ * @return
+ *   A base-64 encoded sha-256 hash, with + replaced with -, / with _ and
+ *   any = padding characters removed.
+ */
+function drupal_hash_base64($data) {
+  $hash = base64_encode(hash('sha256', $data, TRUE));
+  // Modify the hash so it's safe to use in URLs.
+  return strtr($hash, array('+' => '-', '/' => '_', '=' => ''));
+}
+
+/**
+ * Merges multiple arrays, recursively, and returns the merged array.
+ *
+ * This function is similar to PHP's array_merge_recursive() function, but it
+ * handles non-array values differently. When merging values that are not both
+ * arrays, the latter value replaces the former rather than merging with it.
+ *
+ * Example:
+ * @code
+ * $link_options_1 = array('fragment' => 'x', 'attributes' => array('title' => t('X'), 'class' => array('a', 'b')));
+ * $link_options_2 = array('fragment' => 'y', 'attributes' => array('title' => t('Y'), 'class' => array('c', 'd')));
+ *
+ * // This results in array('fragment' => array('x', 'y'), 'attributes' => array('title' => array(t('X'), t('Y')), 'class' => array('a', 'b', 'c', 'd'))).
+ * $incorrect = array_merge_recursive($link_options_1, $link_options_2);
+ *
+ * // This results in array('fragment' => 'y', 'attributes' => array('title' => t('Y'), 'class' => array('a', 'b', 'c', 'd'))).
+ * $correct = drupal_array_merge_deep($link_options_1, $link_options_2);
+ * @endcode
+ *
+ * @param ...
+ *   Arrays to merge.
+ *
+ * @return
+ *   The merged array.
+ *
+ * @see drupal_array_merge_deep_array()
+ */
+function drupal_array_merge_deep() {
+  $args = func_get_args();
+  return drupal_array_merge_deep_array($args);
+}
+
+/**
+ * Merges multiple arrays, recursively, and returns the merged array.
+ *
+ * This function is equivalent to drupal_array_merge_deep(), except the
+ * input arrays are passed as a single array parameter rather than a variable
+ * parameter list.
+ *
+ * The following are equivalent:
+ * - drupal_array_merge_deep($a, $b);
+ * - drupal_array_merge_deep_array(array($a, $b));
+ *
+ * The following are also equivalent:
+ * - call_user_func_array('drupal_array_merge_deep', $arrays_to_merge);
+ * - drupal_array_merge_deep_array($arrays_to_merge);
+ *
+ * @see drupal_array_merge_deep()
+ */
+function drupal_array_merge_deep_array($arrays) {
+  $result = array();
+
+  foreach ($arrays as $array) {
+    foreach ($array as $key => $value) {
+      // Renumber integer keys as array_merge_recursive() does. Note that PHP
+      // automatically converts array keys that are integer strings (e.g., '1')
+      // to integers.
+      if (is_integer($key)) {
+        $result[] = $value;
+      }
+      // Recurse when both values are arrays.
+      elseif (isset($result[$key]) && is_array($result[$key]) && is_array($value)) {
+        $result[$key] = drupal_array_merge_deep_array(array($result[$key], $value));
+      }
+      // Otherwise, use the latter value, overriding any previous value.
+      else {
+        $result[$key] = $value;
+      }
+    }
+  }
+
+  return $result;
+}
+
+/**
+ * Generates a default anonymous $user object.
+ *
+ * @return Object - the user object.
+ */
+function drupal_anonymous_user() {
+  $user = variable_get('drupal_anonymous_user_object', new stdClass);
+  $user->uid = 0;
+  $user->hostname = ip_address();
+  $user->roles = array();
+  $user->roles[DRUPAL_ANONYMOUS_RID] = 'anonymous user';
+  $user->cache = 0;
+  return $user;
+}
+
+/**
+ * Ensures Drupal is bootstrapped to the specified phase.
+ *
+ * In order to bootstrap Drupal from another PHP script, you can use this code:
+ * @code
+ *   define('DRUPAL_ROOT', '/path/to/drupal');
+ *   require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
+ *   drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+ * @endcode
+ *
+ * @param $phase
+ *   A constant telling which phase to bootstrap to. When you bootstrap to a
+ *   particular phase, all earlier phases are run automatically. Possible
+ *   values:
+ *   - DRUPAL_BOOTSTRAP_CONFIGURATION: Initializes configuration.
+ *   - DRUPAL_BOOTSTRAP_PAGE_CACHE: Tries to serve a cached page.
+ *   - DRUPAL_BOOTSTRAP_DATABASE: Initializes the database layer.
+ *   - DRUPAL_BOOTSTRAP_VARIABLES: Initializes the variable system.
+ *   - DRUPAL_BOOTSTRAP_SESSION: Initializes session handling.
+ *   - DRUPAL_BOOTSTRAP_PAGE_HEADER: Sets up the page header.
+ *   - DRUPAL_BOOTSTRAP_LANGUAGE: Finds out the language of the page.
+ *   - DRUPAL_BOOTSTRAP_FULL: Fully loads Drupal. Validates and fixes input
+ *     data.
+ * @param $new_phase
+ *   A boolean, set to FALSE if calling drupal_bootstrap from inside a
+ *   function called from drupal_bootstrap (recursion).
+ *
+ * @return
+ *   The most recently completed phase.
+ */
+function drupal_bootstrap($phase = NULL, $new_phase = TRUE) {
+  // Not drupal_static(), because does not depend on any run-time information.
+  static $phases = array(
+    DRUPAL_BOOTSTRAP_CONFIGURATION,
+    DRUPAL_BOOTSTRAP_PAGE_CACHE,
+    DRUPAL_BOOTSTRAP_DATABASE,
+    DRUPAL_BOOTSTRAP_VARIABLES,
+    DRUPAL_BOOTSTRAP_SESSION,
+    DRUPAL_BOOTSTRAP_PAGE_HEADER,
+    DRUPAL_BOOTSTRAP_LANGUAGE,
+    DRUPAL_BOOTSTRAP_FULL,
+  );
+  // Not drupal_static(), because the only legitimate API to control this is to
+  // call drupal_bootstrap() with a new phase parameter.
+  static $final_phase;
+  // Not drupal_static(), because it's impossible to roll back to an earlier
+  // bootstrap state.
+  static $stored_phase = -1;
+
+  // When not recursing, store the phase name so it's not forgotten while
+  // recursing.
+  if ($new_phase) {
+    $final_phase = $phase;
+  }
+  if (isset($phase)) {
+    // Call a phase if it has not been called before and is below the requested
+    // phase.
+    while ($phases && $phase > $stored_phase && $final_phase > $stored_phase) {
+      $current_phase = array_shift($phases);
+
+      // This function is re-entrant. Only update the completed phase when the
+      // current call actually resulted in a progress in the bootstrap process.
+      if ($current_phase > $stored_phase) {
+        $stored_phase = $current_phase;
+      }
+
+      switch ($current_phase) {
+        case DRUPAL_BOOTSTRAP_CONFIGURATION:
+          _drupal_bootstrap_configuration();
+          break;
+
+        case DRUPAL_BOOTSTRAP_PAGE_CACHE:
+          _drupal_bootstrap_page_cache();
+          break;
+
+        case DRUPAL_BOOTSTRAP_DATABASE:
+          _drupal_bootstrap_database();
+          break;
+
+        case DRUPAL_BOOTSTRAP_VARIABLES:
+          _drupal_bootstrap_variables();
+          break;
+
+        case DRUPAL_BOOTSTRAP_SESSION:
+          require_once DRUPAL_ROOT . '/' . variable_get('session_inc', 'includes/session.inc');
+          drupal_session_initialize();
+          break;
+
+        case DRUPAL_BOOTSTRAP_PAGE_HEADER:
+          _drupal_bootstrap_page_header();
+          break;
+
+        case DRUPAL_BOOTSTRAP_LANGUAGE:
+          drupal_language_initialize();
+          break;
+
+        case DRUPAL_BOOTSTRAP_FULL:
+          require_once DRUPAL_ROOT . '/includes/common.inc';
+          _drupal_bootstrap_full();
+          break;
+      }
+    }
+  }
+  return $stored_phase;
+}
+
+/**
+ * Returns the time zone of the current user.
+ */
+function drupal_get_user_timezone() {
+  global $user;
+  if (variable_get('configurable_timezones', 1) && $user->uid && $user->timezone) {
+    return $user->timezone;
+  }
+  else {
+    // Ignore PHP strict notice if time zone has not yet been set in the php.ini
+    // configuration.
+    return variable_get('date_default_timezone', @date_default_timezone_get());
+  }
+}
+
+/**
+ * Gets a salt useful for hardening against SQL injection.
+ *
+ * @return
+ *   A salt based on information in settings.php, not in the database.
+ */
+function drupal_get_hash_salt() {
+  global $drupal_hash_salt, $databases;
+  // If the $drupal_hash_salt variable is empty, a hash of the serialized
+  // database credentials is used as a fallback salt.
+  return empty($drupal_hash_salt) ? hash('sha256', serialize($databases)) : $drupal_hash_salt;
+}
+
+/**
+ * Provides custom PHP error handling.
+ *
+ * @param $error_level
+ *   The level of the error raised.
+ * @param $message
+ *   The error message.
+ * @param $filename
+ *   The filename that the error was raised in.
+ * @param $line
+ *   The line number the error was raised at.
+ * @param $context
+ *   An array that points to the active symbol table at the point the error
+ *   occurred.
+ */
+function _drupal_error_handler($error_level, $message, $filename, $line, $context) {
+  require_once DRUPAL_ROOT . '/includes/errors.inc';
+  _drupal_error_handler_real($error_level, $message, $filename, $line, $context);
+}
+
+/**
+ * Provides custom PHP exception handling.
+ *
+ * Uncaught exceptions are those not enclosed in a try/catch block. They are
+ * always fatal: the execution of the script will stop as soon as the exception
+ * handler exits.
+ *
+ * @param $exception
+ *   The exception object that was thrown.
+ */
+function _drupal_exception_handler($exception) {
+  require_once DRUPAL_ROOT . '/includes/errors.inc';
+
+  try {
+    // Log the message to the watchdog and return an error page to the user.
+    _drupal_log_error(_drupal_decode_exception($exception), TRUE);
+  }
+  catch (Exception $exception2) {
+    // Another uncaught exception was thrown while handling the first one.
+    // If we are displaying errors, then do so with no possibility of a further uncaught exception being thrown.
+    if (error_displayable()) {
+      print '<h1>Additional uncaught exception thrown while handling exception.</h1>';
+      print '<h2>Original</h2><p>' . _drupal_render_exception_safe($exception) . '</p>';
+      print '<h2>Additional</h2><p>' . _drupal_render_exception_safe($exception2) . '</p><hr />';
+    }
+  }
+}
+
+/**
+ * Sets up the script environment and loads settings.php.
+ */
+function _drupal_bootstrap_configuration() {
+  // Set the Drupal custom error handler.
+  set_error_handler('_drupal_error_handler');
+  set_exception_handler('_drupal_exception_handler');
+
+  drupal_environment_initialize();
+  // Start a page timer:
+  timer_start('page');
+  // Initialize the configuration, including variables from settings.php.
+  drupal_settings_initialize();
+}
+
+/**
+ * Attempts to serve a page from the cache.
+ */
+function _drupal_bootstrap_page_cache() {
+  global $user;
+
+  // Allow specifying special cache handlers in settings.php, like
+  // using memcached or files for storing cache information.
+  require_once DRUPAL_ROOT . '/includes/cache.inc';
+  foreach (variable_get('cache_backends', array()) as $include) {
+    require_once DRUPAL_ROOT . '/' . $include;
+  }
+  // Check for a cache mode force from settings.php.
+  if (variable_get('page_cache_without_database')) {
+    $cache_enabled = TRUE;
+  }
+  else {
+    drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES, FALSE);
+    $cache_enabled = variable_get('cache');
+  }
+  drupal_block_denied(ip_address());
+  // If there is no session cookie and cache is enabled (or forced), try
+  // to serve a cached page.
+  if (!isset($_COOKIE[session_name()]) && $cache_enabled) {
+    // Make sure there is a user object because its timestamp will be
+    // checked, hook_boot might check for anonymous user etc.
+    $user = drupal_anonymous_user();
+    // Get the page from the cache.
+    $cache = drupal_page_get_cache();
+    // If there is a cached page, display it.
+    if (is_object($cache)) {
+      header('X-Drupal-Cache: HIT');
+      // Restore the metadata cached with the page.
+      $_GET['q'] = $cache->data['path'];
+      drupal_set_title($cache->data['title'], PASS_THROUGH);
+      date_default_timezone_set(drupal_get_user_timezone());
+      // If the skipping of the bootstrap hooks is not enforced, call
+      // hook_boot.
+      if (variable_get('page_cache_invoke_hooks', TRUE)) {
+        bootstrap_invoke_all('boot');
+      }
+      drupal_serve_page_from_cache($cache);
+      // If the skipping of the bootstrap hooks is not enforced, call
+      // hook_exit.
+      if (variable_get('page_cache_invoke_hooks', TRUE)) {
+        bootstrap_invoke_all('exit');
+      }
+      // We are done.
+      exit;
+    }
+    else {
+      header('X-Drupal-Cache: MISS');
+    }
+  }
+}
+
+/**
+ * Initializes the database system and registers autoload functions.
+ */
+function _drupal_bootstrap_database() {
+  // Redirect the user to the installation script if Drupal has not been
+  // installed yet (i.e., if no $databases array has been defined in the
+  // settings.php file) and we are not already installing.
+  if (empty($GLOBALS['databases']) && !drupal_installation_attempted()) {
+    include_once DRUPAL_ROOT . '/includes/install.inc';
+    install_goto('install.php');
+  }
+
+  // The user agent header is used to pass a database prefix in the request when
+  // running tests. However, for security reasons, it is imperative that we
+  // validate we ourselves made the request.
+  if ($test_prefix = drupal_valid_test_ua()) {
+    // Set the test run id for use in other parts of Drupal.
+    $test_info = &$GLOBALS['drupal_test_info'];
+    $test_info['test_run_id'] = $test_prefix;
+    $test_info['in_child_site'] = TRUE;
+
+    foreach ($GLOBALS['databases']['default'] as &$value) {
+      // Extract the current default database prefix.
+      if (!isset($value['prefix'])) {
+        $current_prefix = '';
+      }
+      elseif (is_array($value['prefix'])) {
+        $current_prefix = $value['prefix']['default'];
+      }
+      else {
+        $current_prefix = $value['prefix'];
+      }
+
+      // Remove the current database prefix and replace it by our own.
+      $value['prefix'] = array(
+        'default' => $current_prefix . $test_prefix,
+      );
+    }
+  }
+
+  // Initialize the database system. Note that the connection
+  // won't be initialized until it is actually requested.
+  require_once DRUPAL_ROOT . '/includes/database/database.inc';
+
+  // Register autoload functions so that we can access classes and interfaces.
+  // The database autoload routine comes first so that we can load the database
+  // system without hitting the database. That is especially important during
+  // the install or upgrade process.
+  spl_autoload_register('drupal_autoload_class');
+  spl_autoload_register('drupal_autoload_interface');
+}
+
+/**
+ * Loads system variables and all enabled bootstrap modules.
+ */
+function _drupal_bootstrap_variables() {
+  global $conf;
+
+  // Initialize the lock system.
+  require_once DRUPAL_ROOT . '/' . variable_get('lock_inc', 'includes/lock.inc');
+  lock_initialize();
+
+  // Load variables from the database, but do not overwrite variables set in settings.php.
+  $conf = variable_initialize(isset($conf) ? $conf : array());
+  // Load bootstrap modules.
+  require_once DRUPAL_ROOT . '/includes/module.inc';
+  module_load_all(TRUE);
+}
+
+/**
+ * Invokes hook_boot(), initializes locking system, and sends HTTP headers.
+ */
+function _drupal_bootstrap_page_header() {
+  bootstrap_invoke_all('boot');
+
+  if (!drupal_is_cli()) {
+    ob_start();
+    drupal_page_header();
+  }
+}
+
+/**
+ * Returns the current bootstrap phase for this Drupal process.
+ *
+ * The current phase is the one most recently completed by drupal_bootstrap().
+ *
+ * @see drupal_bootstrap()
+ */
+function drupal_get_bootstrap_phase() {
+  return drupal_bootstrap();
+}
+
+/**
+ * Returns the test prefix if this is an internal request from SimpleTest.
+ *
+ * @return
+ *   Either the simpletest prefix (the string "simpletest" followed by any
+ *   number of digits) or FALSE if the user agent does not contain a valid
+ *   HMAC and timestamp.
+ */
+function drupal_valid_test_ua() {
+  // No reason to reset this.
+  static $test_prefix;
+
+  if (isset($test_prefix)) {
+    return $test_prefix;
+  }
+
+  if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/^(simpletest\d+);(.+);(.+);(.+)$/", $_SERVER['HTTP_USER_AGENT'], $matches)) {
+    list(, $prefix, $time, $salt, $hmac) = $matches;
+    $check_string =  $prefix . ';' . $time . ';' . $salt;
+    // We use the salt from settings.php to make the HMAC key, since
+    // the database is not yet initialized and we can't access any Drupal variables.
+    // The file properties add more entropy not easily accessible to others.
+    $key = drupal_get_hash_salt() . filectime(__FILE__) . fileinode(__FILE__);
+    $time_diff = REQUEST_TIME - $time;
+    // Since we are making a local request a 5 second time window is allowed,
+    // and the HMAC must match.
+    if ($time_diff >= 0 && $time_diff <= 5 && $hmac == drupal_hmac_base64($check_string, $key)) {
+      $test_prefix = $prefix;
+      return $test_prefix;
+    }
+  }
+
+  $test_prefix = FALSE;
+  return $test_prefix;
+}
+
+/**
+ * Generates a user agent string with a HMAC and timestamp for simpletest.
+ */
+function drupal_generate_test_ua($prefix) {
+  static $key;
+
+  if (!isset($key)) {
+    // We use the salt from settings.php to make the HMAC key, since
+    // the database is not yet initialized and we can't access any Drupal variables.
+    // The file properties add more entropy not easily accessible to others.
+    $key = drupal_get_hash_salt() . filectime(__FILE__) . fileinode(__FILE__);
+  }
+  // Generate a moderately secure HMAC based on the database credentials.
+  $salt = uniqid('', TRUE);
+  $check_string = $prefix . ';' . time() . ';' . $salt;
+  return $check_string . ';' . drupal_hmac_base64($check_string, $key);
+}
+
+/**
+ * Enables use of the theme system without requiring database access.
+ *
+ * Loads and initializes the theme system for site installs, updates and when
+ * the site is in maintenance mode. This also applies when the database fails.
+ *
+ * @see _drupal_maintenance_theme()
+ */
+function drupal_maintenance_theme() {
+  require_once DRUPAL_ROOT . '/includes/theme.maintenance.inc';
+  _drupal_maintenance_theme();
+}
+
+/**
+ * Returns a simple 404 Not Found page.
+ *
+ * If fast 404 pages are enabled, and this is a matching page then print a
+ * simple 404 page and exit.
+ *
+ * This function is called from drupal_deliver_html_page() at the time when a
+ * a normal 404 page is generated, but it can also optionally be called directly
+ * from settings.php to prevent a Drupal bootstrap on these pages. See
+ * documentation in settings.php for the benefits and drawbacks of using this.
+ *
+ * Paths to dynamically-generated content, such as image styles, should also be
+ * accounted for in this function.
+ */
+function drupal_fast_404() {
+  $exclude_paths = variable_get('404_fast_paths_exclude', FALSE);
+  if ($exclude_paths && !preg_match($exclude_paths, $_GET['q'])) {
+    $fast_paths = variable_get('404_fast_paths', FALSE);
+    if ($fast_paths && preg_match($fast_paths, $_GET['q'])) {
+      drupal_add_http_header('Status', '404 Not Found');
+      $fast_404_html = variable_get('404_fast_html', '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>');
+      // Replace @path in the variable with the page path.
+      print strtr($fast_404_html, array('@path' => check_plain(request_uri())));
+      exit;
+    }
+  }
+}
+
+/**
+ * Returns TRUE if a Drupal installation is currently being attempted.
+ */
+function drupal_installation_attempted() {
+  return defined('MAINTENANCE_MODE') && MAINTENANCE_MODE == 'install';
+}
+
+/**
+ * Returns the name of the proper localization function.
+ *
+ * get_t() exists to support localization for code that might run during
+ * the installation phase, when some elements of the system might not have
+ * loaded.
+ *
+ * This would include implementations of hook_install(), which could run
+ * during the Drupal installation phase, and might also be run during
+ * non-installation time, such as while installing the module from the the
+ * module administration page.
+ *
+ * Example usage:
+ * @code
+ *   $t = get_t();
+ *   $translated = $t('translate this');
+ * @endcode
+ *
+ * Use t() if your code will never run during the Drupal installation phase.
+ * Use st() if your code will only run during installation and never any other
+ * time. Use get_t() if your code could run in either circumstance.
+ *
+ * @see t()
+ * @see st()
+ * @ingroup sanitization
+ */
+function get_t() {
+  static $t;
+  // This is not converted to drupal_static because there is no point in
+  // resetting this as it can not change in the course of a request.
+  if (!isset($t)) {
+    $t = drupal_installation_attempted() ? 'st' : 't';
+  }
+  return $t;
+}
+
+/**
+ * Initializes all the defined language types.
+ */
+function drupal_language_initialize() {
+  $types = language_types();
+
+  // Ensure the language is correctly returned, even without multilanguage
+  // support. Also make sure we have a $language fallback, in case a language
+  // negotiation callback needs to do a full bootstrap.
+  // Useful for eg. XML/HTML 'lang' attributes.
+  $default = language_default();
+  foreach ($types as $type) {
+    $GLOBALS[$type] = $default;
+  }
+  if (drupal_multilingual()) {
+    include_once DRUPAL_ROOT . '/includes/language.inc';
+    foreach ($types as $type) {
+      $GLOBALS[$type] = language_initialize($type);
+    }
+    // Allow modules to react on language system initialization in multilingual
+    // environments.
+    bootstrap_invoke_all('language_init');
+  }
+}
+
+/**
+ * Returns a list of the built-in language types.
+ *
+ * @return
+ *   An array of key-values pairs where the key is the language type and the
+ *   value is its configurability.
+ */
+function drupal_language_types() {
+  return array(
+    LANGUAGE_TYPE_INTERFACE => TRUE,
+    LANGUAGE_TYPE_CONTENT => FALSE,
+    LANGUAGE_TYPE_URL => FALSE,
+  );
+}
+
+/**
+ * Returns TRUE if there is more than one language enabled.
+ *
+ * @return
+ *   TRUE if more than one language is enabled.
+ */
+function drupal_multilingual() {
+  // The "language_count" variable stores the number of enabled languages to
+  // avoid unnecessarily querying the database when building the list of
+  // enabled languages on monolingual sites.
+  return variable_get('language_count', 1) > 1;
+}
+
+/**
+ * Returns an array of the available language types.
+ *
+ * @return
+ *   An array of all language types where the keys of each are the language type
+ *   name and its value is its configurability (TRUE/FALSE).
+ */
+function language_types() {
+  return array_keys(variable_get('language_types', drupal_language_types()));
+}
+
+/**
+ * Returns a list of installed languages, indexed by the specified key.
+ *
+ * @param $field
+ *   (optional) The field to index the list with.
+ *
+ * @return
+ *   An associative array, keyed on the values of $field.
+ *   - If $field is 'weight' or 'enabled', the array is nested, with the outer
+ *     array's values each being associative arrays with language codes as
+ *     keys and language objects as values.
+ *   - For all other values of $field, the array is only one level deep, and
+ *     the array's values are language objects.
+ */
+function language_list($field = 'language') {
+  $languages = &drupal_static(__FUNCTION__);
+  // Init language list
+  if (!isset($languages)) {
+    if (drupal_multilingual() || module_exists('locale')) {
+      $languages['language'] = db_query('SELECT * FROM {languages} ORDER BY weight ASC, name ASC')->fetchAllAssoc('language');
+      // Users cannot uninstall the native English language. However, we allow
+      // it to be hidden from the installed languages. Therefore, at least one
+      // other language must be enabled then.
+      if (!$languages['language']['en']->enabled && !variable_get('language_native_enabled', TRUE)) {
+        unset($languages['language']['en']);
+      }
+    }
+    else {
+      // No locale module, so use the default language only.
+      $default = language_default();
+      $languages['language'][$default->language] = $default;
+    }
+  }
+
+  // Return the array indexed by the right field
+  if (!isset($languages[$field])) {
+    $languages[$field] = array();
+    foreach ($languages['language'] as $lang) {
+      // Some values should be collected into an array
+      if (in_array($field, array('enabled', 'weight'))) {
+        $languages[$field][$lang->$field][$lang->language] = $lang;
+      }
+      else {
+        $languages[$field][$lang->$field] = $lang;
+      }
+    }
+  }
+  return $languages[$field];
+}
+
+/**
+ * Returns the default language used on the site
+ *
+ * @param $property
+ *   Optional property of the language object to return
+ */
+function language_default($property = NULL) {
+  $language = variable_get('language_default', (object) array('language' => 'en', 'name' => 'English', 'native' => 'English', 'direction' => 0, 'enabled' => 1, 'plurals' => 0, 'formula' => '', 'domain' => '', 'prefix' => '', 'weight' => 0, 'javascript' => ''));
+  return $property ? $language->$property : $language;
+}
+
+/**
+ * Returns the requested URL path of the page being viewed.
+ *
+ * Examples:
+ * - http://example.com/node/306 returns "node/306".
+ * - http://example.com/drupalfolder/node/306 returns "node/306" while
+ *   base_path() returns "/drupalfolder/".
+ * - http://example.com/path/alias (which is a path alias for node/306) returns
+ *   "path/alias" as opposed to the internal path.
+ * - http://example.com/index.php returns an empty string (meaning: front page).
+ * - http://example.com/index.php?page=1 returns an empty string.
+ *
+ * @return
+ *   The requested Drupal URL path.
+ *
+ * @see current_path()
+ */
+function request_path() {
+  static $path;
+
+  if (isset($path)) {
+    return $path;
+  }
+
+  if (isset($_GET['q']) && is_string($_GET['q'])) {
+    // This is a request with a ?q=foo/bar query string. $_GET['q'] is
+    // overwritten in drupal_path_initialize(), but request_path() is called
+    // very early in the bootstrap process, so the original value is saved in
+    // $path and returned in later calls.
+    $path = $_GET['q'];
+  }
+  elseif (isset($_SERVER['REQUEST_URI'])) {
+    // This request is either a clean URL, or 'index.php', or nonsense.
+    // Extract the path from REQUEST_URI.
+    $request_path = strtok($_SERVER['REQUEST_URI'], '?');
+    $base_path_len = strlen(rtrim(dirname($_SERVER['SCRIPT_NAME']), '\/'));
+    // Unescape and strip $base_path prefix, leaving q without a leading slash.
+    $path = substr(urldecode($request_path), $base_path_len + 1);
+    // If the path equals the script filename, either because 'index.php' was
+    // explicitly provided in the URL, or because the server added it to
+    // $_SERVER['REQUEST_URI'] even when it wasn't provided in the URL (some
+    // versions of Microsoft IIS do this), the front page should be served.
+    if ($path == basename($_SERVER['PHP_SELF'])) {
+      $path = '';
+    }
+  }
+  else {
+    // This is the front page.
+    $path = '';
+  }
+
+  // Under certain conditions Apache's RewriteRule directive prepends the value
+  // assigned to $_GET['q'] with a slash. Moreover we can always have a trailing
+  // slash in place, hence we need to normalize $_GET['q'].
+  $path = trim($path, '/');
+
+  return $path;
+}
+
+/**
+ * Returns a component of the current Drupal path.
+ *
+ * When viewing a page at the path "admin/structure/types", for example, arg(0)
+ * returns "admin", arg(1) returns "structure", and arg(2) returns "types".
+ *
+ * Avoid use of this function where possible, as resulting code is hard to
+ * read. In menu callback functions, attempt to use named arguments. See the
+ * explanation in menu.inc for how to construct callbacks that take arguments.
+ * When attempting to use this function to load an element from the current
+ * path, e.g. loading the node on a node page, use menu_get_object() instead.
+ *
+ * @param $index
+ *   The index of the component, where each component is separated by a '/'
+ *   (forward-slash), and where the first component has an index of 0 (zero).
+ * @param $path
+ *   A path to break into components. Defaults to the path of the current page.
+ *
+ * @return
+ *   The component specified by $index, or NULL if the specified component was
+ *   not found. If called without arguments, it returns an array containing all
+ *   the components of the current path.
+ */
+function arg($index = NULL, $path = NULL) {
+  // Even though $arguments doesn't need to be resettable for any functional
+  // reasons (the result of explode() does not depend on any run-time
+  // information), it should be resettable anyway in case a module needs to
+  // free up the memory used by it.
+  // Use the advanced drupal_static() pattern, since this is called very often.
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['arguments'] = &drupal_static(__FUNCTION__);
+  }
+  $arguments = &$drupal_static_fast['arguments'];
+
+  if (!isset($path)) {
+    $path = $_GET['q'];
+  }
+  if (!isset($arguments[$path])) {
+    $arguments[$path] = explode('/', $path);
+  }
+  if (!isset($index)) {
+    return $arguments[$path];
+  }
+  if (isset($arguments[$path][$index])) {
+    return $arguments[$path][$index];
+  }
+}
+
+/**
+ * Returns the IP address of the client machine.
+ *
+ * If Drupal is behind a reverse proxy, we use the X-Forwarded-For header
+ * instead of $_SERVER['REMOTE_ADDR'], which would be the IP address of
+ * the proxy server, and not the client's. The actual header name can be
+ * configured by the reverse_proxy_header variable.
+ *
+ * @return
+ *   IP address of client machine, adjusted for reverse proxy and/or cluster
+ *   environments.
+ */
+function ip_address() {
+  $ip_address = &drupal_static(__FUNCTION__);
+
+  if (!isset($ip_address)) {
+    $ip_address = $_SERVER['REMOTE_ADDR'];
+
+    if (variable_get('reverse_proxy', 0)) {
+      $reverse_proxy_header = variable_get('reverse_proxy_header', 'HTTP_X_FORWARDED_FOR');
+      if (!empty($_SERVER[$reverse_proxy_header])) {
+        // If an array of known reverse proxy IPs is provided, then trust
+        // the XFF header if request really comes from one of them.
+        $reverse_proxy_addresses = variable_get('reverse_proxy_addresses', array());
+
+        // Turn XFF header into an array.
+        $forwarded = explode(',', $_SERVER[$reverse_proxy_header]);
+
+        // Trim the forwarded IPs; they may have been delimited by commas and spaces.
+        $forwarded = array_map('trim', $forwarded);
+
+        // Tack direct client IP onto end of forwarded array.
+        $forwarded[] = $ip_address;
+
+        // Eliminate all trusted IPs.
+        $untrusted = array_diff($forwarded, $reverse_proxy_addresses);
+
+        // The right-most IP is the most specific we can trust.
+        $ip_address = array_pop($untrusted);
+      }
+    }
+  }
+
+  return $ip_address;
+}
+
+/**
+ * @addtogroup schemaapi
+ * @{
+ */
+
+/**
+ * Gets the schema definition of a table, or the whole database schema.
+ *
+ * The returned schema will include any modifications made by any
+ * module that implements hook_schema_alter().
+ *
+ * @param $table
+ *   The name of the table. If not given, the schema of all tables is returned.
+ * @param $rebuild
+ *   If true, the schema will be rebuilt instead of retrieved from the cache.
+ */
+function drupal_get_schema($table = NULL, $rebuild = FALSE) {
+  static $schema;
+
+  if ($rebuild || !isset($table)) {
+    $schema = drupal_get_complete_schema($rebuild);
+  }
+  elseif (!isset($schema)) {
+    $schema = new SchemaCache();
+  }
+
+  if (!isset($table)) {
+    return $schema;
+  }
+  if (isset($schema[$table])) {
+    return $schema[$table];
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
+ * Extends DrupalCacheArray to allow for dynamic building of the schema cache.
+ */
+class SchemaCache extends DrupalCacheArray {
+
+  /**
+   * Constructs a SchemaCache object.
+   */
+  public function __construct() {
+    // Cache by request method.
+    parent::__construct('schema:runtime:' . ($_SERVER['REQUEST_METHOD'] == 'GET'), 'cache');
+  }
+
+  /**
+   * Overrides DrupalCacheArray::resolveCacheMiss().
+   */
+  protected function resolveCacheMiss($offset) {
+    $complete_schema = drupal_get_complete_schema();
+    $value = isset($complete_schema[$offset]) ? $complete_schema[$offset] :  NULL;
+    $this->storage[$offset] = $value;
+    $this->persist($offset);
+    return $value;
+  }
+}
+
+/**
+ * Gets the whole database schema.
+ *
+ * The returned schema will include any modifications made by any
+ * module that implements hook_schema_alter().
+ *
+ * @param $rebuild
+ *   If true, the schema will be rebuilt instead of retrieved from the cache.
+ */
+function drupal_get_complete_schema($rebuild = FALSE) {
+  static $schema = array();
+
+  if (empty($schema) || $rebuild) {
+    // Try to load the schema from cache.
+    if (!$rebuild && $cached = cache_get('schema')) {
+      $schema = $cached->data;
+    }
+    // Otherwise, rebuild the schema cache.
+    else {
+      $schema = array();
+      // Load the .install files to get hook_schema.
+      // On some databases this function may be called before bootstrap has
+      // been completed, so we force the functions we need to load just in case.
+      if (function_exists('module_load_all_includes')) {
+        // This function can be called very early in the bootstrap process, so
+        // we force the module_list() cache to be refreshed to ensure that it
+        // contains the complete list of modules before we go on to call
+        // module_load_all_includes().
+        module_list(TRUE);
+        module_load_all_includes('install');
+      }
+
+      require_once DRUPAL_ROOT . '/includes/common.inc';
+      // Invoke hook_schema for all modules.
+      foreach (module_implements('schema') as $module) {
+        // Cast the result of hook_schema() to an array, as a NULL return value
+        // would cause array_merge() to set the $schema variable to NULL as well.
+        // That would break modules which use $schema further down the line.
+        $current = (array) module_invoke($module, 'schema');
+        // Set 'module' and 'name' keys for each table, and remove descriptions,
+        // as they needlessly slow down cache_get() for every single request.
+        _drupal_schema_initialize($current, $module);
+        $schema = array_merge($schema, $current);
+      }
+
+      drupal_alter('schema', $schema);
+      // If the schema is empty, avoid saving it: some database engines require
+      // the schema to perform queries, and this could lead to infinite loops.
+      if (!empty($schema) && (drupal_get_bootstrap_phase() == DRUPAL_BOOTSTRAP_FULL)) {
+        cache_set('schema', $schema);
+      }
+      if ($rebuild) {
+        cache_clear_all('schema:', 'cache', TRUE);
+      }
+    }
+  }
+
+  return $schema;
+}
+
+/**
+ * @} End of "addtogroup schemaapi".
+ */
+
+
+/**
+ * @addtogroup registry
+ * @{
+ */
+
+/**
+ * Confirms that an interface is available.
+ *
+ * This function is rarely called directly. Instead, it is registered as an
+ * spl_autoload()  handler, and PHP calls it for us when necessary.
+ *
+ * @param $interface
+ *   The name of the interface to check or load.
+ *
+ * @return
+ *   TRUE if the interface is currently available, FALSE otherwise.
+ */
+function drupal_autoload_interface($interface) {
+  return _registry_check_code('interface', $interface);
+}
+
+/**
+ * Confirms that a class is available.
+ *
+ * This function is rarely called directly. Instead, it is registered as an
+ * spl_autoload()  handler, and PHP calls it for us when necessary.
+ *
+ * @param $class
+ *   The name of the class to check or load.
+ *
+ * @return
+ *   TRUE if the class is currently available, FALSE otherwise.
+ */
+function drupal_autoload_class($class) {
+  return _registry_check_code('class', $class);
+}
+
+/**
+ * Checks for a resource in the registry.
+ *
+ * @param $type
+ *   The type of resource we are looking up, or one of the constants
+ *   REGISTRY_RESET_LOOKUP_CACHE or REGISTRY_WRITE_LOOKUP_CACHE, which
+ *   signal that we should reset or write the cache, respectively.
+ * @param $name
+ *   The name of the resource, or NULL if either of the REGISTRY_* constants
+ *   is passed in.
+ *
+ * @return
+ *   TRUE if the resource was found, FALSE if not.
+ *   NULL if either of the REGISTRY_* constants is passed in as $type.
+ */
+function _registry_check_code($type, $name = NULL) {
+  static $lookup_cache, $cache_update_needed;
+
+  if ($type == 'class' && class_exists($name) || $type == 'interface' && interface_exists($name)) {
+    return TRUE;
+  }
+
+  if (!isset($lookup_cache)) {
+    $lookup_cache = array();
+    if ($cache = cache_get('lookup_cache', 'cache_bootstrap')) {
+      $lookup_cache = $cache->data;
+    }
+  }
+
+  // When we rebuild the registry, we need to reset this cache so
+  // we don't keep lookups for resources that changed during the rebuild.
+  if ($type == REGISTRY_RESET_LOOKUP_CACHE) {
+    $cache_update_needed = TRUE;
+    $lookup_cache = NULL;
+    return;
+  }
+
+  // Called from drupal_page_footer, we write to permanent storage if there
+  // changes to the lookup cache for this request.
+  if ($type == REGISTRY_WRITE_LOOKUP_CACHE) {
+    if ($cache_update_needed) {
+      cache_set('lookup_cache', $lookup_cache, 'cache_bootstrap');
+    }
+    return;
+  }
+
+  // $type is either 'interface' or 'class', so we only need the first letter to
+  // keep the cache key unique.
+  $cache_key = $type[0] . $name;
+  if (isset($lookup_cache[$cache_key])) {
+    if ($lookup_cache[$cache_key]) {
+      require_once DRUPAL_ROOT . '/' . $lookup_cache[$cache_key];
+    }
+    return (bool) $lookup_cache[$cache_key];
+  }
+
+  // This function may get called when the default database is not active, but
+  // there is no reason we'd ever want to not use the default database for
+  // this query.
+  $file = Database::getConnection('default', 'default')->query("SELECT filename FROM {registry} WHERE name = :name AND type = :type", array(
+      ':name' => $name,
+      ':type' => $type,
+    ))
+    ->fetchField();
+
+  // Flag that we've run a lookup query and need to update the cache.
+  $cache_update_needed = TRUE;
+
+  // Misses are valuable information worth caching, so cache even if
+  // $file is FALSE.
+  $lookup_cache[$cache_key] = $file;
+
+  if ($file) {
+    require_once DRUPAL_ROOT . '/' . $file;
+    return TRUE;
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
+ * Rescans all enabled modules and rebuilds the registry.
+ *
+ * Rescans all code in modules or includes directories, storing the location of
+ * each interface or class in the database.
+ */
+function registry_rebuild() {
+  system_rebuild_module_data();
+  registry_update();
+}
+
+/**
+ * Updates the registry based on the latest files listed in the database.
+ *
+ * This function should be used when system_rebuild_module_data() does not need
+ * to be called, because it is already known that the list of files in the
+ * {system} table matches those in the file system.
+ *
+ * @return
+ *   TRUE if the registry was rebuilt, FALSE if another thread was rebuilding
+ *   in parallel and the current thread just waited for completion.
+ *
+ * @see registry_rebuild()
+ */
+function registry_update() {
+  // install_system_module() calls module_enable() which calls into this
+  // function during initial system installation, so the lock system is neither
+  // loaded nor does its storage exist yet.
+  $in_installer = drupal_installation_attempted();
+  if (!$in_installer && !lock_acquire(__FUNCTION__)) {
+    // Another request got the lock, wait for it to finish.
+    lock_wait(__FUNCTION__);
+    return FALSE;
+  }
+
+  require_once DRUPAL_ROOT . '/includes/registry.inc';
+  _registry_update();
+
+  if (!$in_installer) {
+    lock_release(__FUNCTION__);
+  }
+  return TRUE;
+}
+
+/**
+ * @} End of "addtogroup registry".
+ */
+
+/**
+ * Provides central static variable storage.
+ *
+ * All functions requiring a static variable to persist or cache data within
+ * a single page request are encouraged to use this function unless it is
+ * absolutely certain that the static variable will not need to be reset during
+ * the page request. By centralizing static variable storage through this
+ * function, other functions can rely on a consistent API for resetting any
+ * other function's static variables.
+ *
+ * Example:
+ * @code
+ * function language_list($field = 'language') {
+ *   $languages = &drupal_static(__FUNCTION__);
+ *   if (!isset($languages)) {
+ *     // If this function is being called for the first time after a reset,
+ *     // query the database and execute any other code needed to retrieve
+ *     // information about the supported languages.
+ *     ...
+ *   }
+ *   if (!isset($languages[$field])) {
+ *     // If this function is being called for the first time for a particular
+ *     // index field, then execute code needed to index the information already
+ *     // available in $languages by the desired field.
+ *     ...
+ *   }
+ *   // Subsequent invocations of this function for a particular index field
+ *   // skip the above two code blocks and quickly return the already indexed
+ *   // information.
+ *   return $languages[$field];
+ * }
+ * function locale_translate_overview_screen() {
+ *   // When building the content for the translations overview page, make
+ *   // sure to get completely fresh information about the supported languages.
+ *   drupal_static_reset('language_list');
+ *   ...
+ * }
+ * @endcode
+ *
+ * In a few cases, a function can have certainty that there is no legitimate
+ * use-case for resetting that function's static variable. This is rare,
+ * because when writing a function, it's hard to forecast all the situations in
+ * which it will be used. A guideline is that if a function's static variable
+ * does not depend on any information outside of the function that might change
+ * during a single page request, then it's ok to use the "static" keyword
+ * instead of the drupal_static() function.
+ *
+ * Example:
+ * @code
+ * function actions_do(...) {
+ *   // $stack tracks the number of recursive calls.
+ *   static $stack;
+ *   $stack++;
+ *   if ($stack > variable_get('actions_max_stack', 35)) {
+ *     ...
+ *     return;
+ *   }
+ *   ...
+ *   $stack--;
+ * }
+ * @endcode
+ *
+ * In a few cases, a function needs a resettable static variable, but the
+ * function is called many times (100+) during a single page request, so
+ * every microsecond of execution time that can be removed from the function
+ * counts. These functions can use a more cumbersome, but faster variant of
+ * calling drupal_static(). It works by storing the reference returned by
+ * drupal_static() in the calling function's own static variable, thereby
+ * removing the need to call drupal_static() for each iteration of the function.
+ * Conceptually, it replaces:
+ * @code
+ * $foo = &drupal_static(__FUNCTION__);
+ * @endcode
+ * with:
+ * @code
+ * // Unfortunately, this does not work.
+ * static $foo = &drupal_static(__FUNCTION__);
+ * @endcode
+ * However, the above line of code does not work, because PHP only allows static
+ * variables to be initializied by literal values, and does not allow static
+ * variables to be assigned to references.
+ * - http://php.net/manual/language.variables.scope.php#language.variables.scope.static
+ * - http://php.net/manual/language.variables.scope.php#language.variables.scope.references
+ * The example below shows the syntax needed to work around both limitations.
+ * For benchmarks and more information, see http://drupal.org/node/619666.
+ *
+ * Example:
+ * @code
+ * function user_access($string, $account = NULL) {
+ *   // Use the advanced drupal_static() pattern, since this is called very often.
+ *   static $drupal_static_fast;
+ *   if (!isset($drupal_static_fast)) {
+ *     $drupal_static_fast['perm'] = &drupal_static(__FUNCTION__);
+ *   }
+ *   $perm = &$drupal_static_fast['perm'];
+ *   ...
+ * }
+ * @endcode
+ *
+ * @param $name
+ *   Globally unique name for the variable. For a function with only one static,
+ *   variable, the function name (e.g. via the PHP magic __FUNCTION__ constant)
+ *   is recommended. For a function with multiple static variables add a
+ *   distinguishing suffix to the function name for each one.
+ * @param $default_value
+ *   Optional default value.
+ * @param $reset
+ *   TRUE to reset a specific named variable, or all variables if $name is NULL.
+ *   Resetting every variable should only be used, for example, for running
+ *   unit tests with a clean environment. Should be used only though via
+ *   function drupal_static_reset() and the return value should not be used in
+ *   this case.
+ *
+ * @return
+ *   Returns a variable by reference.
+ *
+ * @see drupal_static_reset()
+ */
+function &drupal_static($name, $default_value = NULL, $reset = FALSE) {
+  static $data = array(), $default = array();
+  // First check if dealing with a previously defined static variable.
+  if (isset($data[$name]) || array_key_exists($name, $data)) {
+    // Non-NULL $name and both $data[$name] and $default[$name] statics exist.
+    if ($reset) {
+      // Reset pre-existing static variable to its default value.
+      $data[$name] = $default[$name];
+    }
+    return $data[$name];
+  }
+  // Neither $data[$name] nor $default[$name] static variables exist.
+  if (isset($name)) {
+    if ($reset) {
+      // Reset was called before a default is set and yet a variable must be
+      // returned.
+      return $data;
+    }
+    // First call with new non-NULL $name. Initialize a new static variable.
+    $default[$name] = $data[$name] = $default_value;
+    return $data[$name];
+  }
+  // Reset all: ($name == NULL). This needs to be done one at a time so that
+  // references returned by earlier invocations of drupal_static() also get
+  // reset.
+  foreach ($default as $name => $value) {
+    $data[$name] = $value;
+  }
+  // As the function returns a reference, the return should always be a
+  // variable.
+  return $data;
+}
+
+/**
+ * Resets one or all centrally stored static variable(s).
+ *
+ * @param $name
+ *   Name of the static variable to reset. Omit to reset all variables.
+ */
+function drupal_static_reset($name = NULL) {
+  drupal_static($name, NULL, TRUE);
+}
+
+/**
+ * Detects whether the current script is running in a command-line environment.
+ */
+function drupal_is_cli() {
+  return (!isset($_SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)));
+}
+
+/**
+ * Formats text for emphasized display in a placeholder inside a sentence.
+ *
+ * Used automatically by format_string().
+ *
+ * @param $text
+ *   The text to format (plain-text).
+ *
+ * @return
+ *   The formatted text (html).
+ */
+function drupal_placeholder($text) {
+  return '<em class="placeholder">' . check_plain($text) . '</em>';
+}
+
+/**
+ * Registers a function for execution on shutdown.
+ *
+ * Wrapper for register_shutdown_function() that catches thrown exceptions to
+ * avoid "Exception thrown without a stack frame in Unknown".
+ *
+ * @param $callback
+ *   The shutdown function to register.
+ * @param ...
+ *   Additional arguments to pass to the shutdown function.
+ *
+ * @return
+ *   Array of shutdown functions to be executed.
+ *
+ * @see register_shutdown_function()
+ * @ingroup php_wrappers
+ */
+function &drupal_register_shutdown_function($callback = NULL) {
+  // We cannot use drupal_static() here because the static cache is reset during
+  // batch processing, which breaks batch handling.
+  static $callbacks = array();
+
+  if (isset($callback)) {
+    // Only register the internal shutdown function once.
+    if (empty($callbacks)) {
+      register_shutdown_function('_drupal_shutdown_function');
+    }
+    $args = func_get_args();
+    array_shift($args);
+    // Save callback and arguments
+    $callbacks[] = array('callback' => $callback, 'arguments' => $args);
+  }
+  return $callbacks;
+}
+
+/**
+ * Executes registered shutdown functions.
+ */
+function _drupal_shutdown_function() {
+  $callbacks = &drupal_register_shutdown_function();
+
+  // Set the CWD to DRUPAL_ROOT as it is not guaranteed to be the same as it
+  // was in the normal context of execution.
+  chdir(DRUPAL_ROOT);
+
+  try {
+    while (list($key, $callback) = each($callbacks)) {
+      call_user_func_array($callback['callback'], $callback['arguments']);
+    }
+  }
+  catch (Exception $exception) {
+    // If we are displaying errors, then do so with no possibility of a further uncaught exception being thrown.
+   require_once DRUPAL_ROOT . '/includes/errors.inc';
+   if (error_displayable()) {
+      print '<h1>Uncaught exception thrown in shutdown function.</h1>';
+      print '<p>' . _drupal_render_exception_safe($exception) . '</p><hr />';
+    }
+  }
+}
+
+/**
+ * Compares the memory required for an operation to the available memory.
+ *
+ * @param $required
+ *   The memory required for the operation, expressed as a number of bytes with
+ *   optional SI or IEC binary unit prefix (e.g. 2, 3K, 5MB, 10G, 6GiB, 8bytes,
+ *   9mbytes).
+ * @param $memory_limit
+ *   (optional) The memory limit for the operation, expressed as a number of
+ *   bytes with optional SI or IEC binary unit prefix (e.g. 2, 3K, 5MB, 10G,
+ *   6GiB, 8bytes, 9mbytes). If no value is passed, the current PHP
+ *   memory_limit will be used. Defaults to NULL.
+ *
+ * @return
+ *   TRUE if there is sufficient memory to allow the operation, or FALSE
+ *   otherwise.
+ */
+function drupal_check_memory_limit($required, $memory_limit = NULL) {
+  if (!isset($memory_limit)) {
+    $memory_limit = ini_get('memory_limit');
+  }
+
+  // There is sufficient memory if:
+  // - No memory limit is set.
+  // - The memory limit is set to unlimited (-1).
+  // - The memory limit is greater than the memory required for the operation.
+  return ((!$memory_limit) || ($memory_limit == -1) || (parse_size($memory_limit) >= parse_size($required)));
+}
diff --git a/htmltest/includes/cache-install.inc b/htmltest/includes/cache-install.inc
new file mode 100644
index 00000000..9e0dd01d
--- /dev/null
+++ b/htmltest/includes/cache-install.inc
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * @file
+ * Provides a stub cache implementation to be used during installation.
+ */
+
+/**
+ * Defines a stub cache implementation to be used during installation.
+ *
+ * The stub implementation is needed when database access is not yet available.
+ * Because Drupal's caching system never requires that cached data be present,
+ * these stub functions can short-circuit the process and sidestep the need for
+ * any persistent storage. Obviously, using this cache implementation during
+ * normal operations would have a negative impact on performance.
+ */
+class DrupalFakeCache extends DrupalDatabaseCache implements DrupalCacheInterface {
+
+  /**
+   * Overrides DrupalDatabaseCache::get().
+   */
+  function get($cid) {
+    return FALSE;
+  }
+
+  /**
+   * Overrides DrupalDatabaseCache::getMultiple().
+   */
+  function getMultiple(&$cids) {
+    return array();
+  }
+
+  /**
+   * Overrides DrupalDatabaseCache::set().
+   */
+  function set($cid, $data, $expire = CACHE_PERMANENT) {
+  }
+
+  /**
+   * Overrides DrupalDatabaseCache::clear().
+   */
+  function clear($cid = NULL, $wildcard = FALSE) {
+    // If there is a database cache, attempt to clear it whenever possible. The
+    // reason for doing this is that the database cache can accumulate data
+    // during installation due to any full bootstraps that may occur at the
+    // same time (for example, Ajax requests triggered by the installer). If we
+    // didn't try to clear it whenever this function is called, the data in the
+    // cache would become stale; for example, the installer sometimes calls
+    // variable_set(), which updates the {variable} table and then clears the
+    // cache to make sure that the next page request picks up the new value.
+    // Not actually clearing the cache here therefore leads old variables to be
+    // loaded on the first page requests after installation, which can cause
+    // subtle bugs, some of which would not be fixed unless the site
+    // administrator cleared the cache manually.
+    try {
+      if (class_exists('Database')) {
+        parent::clear($cid, $wildcard);
+      }
+    }
+    // If the attempt at clearing the cache causes an error, that means that
+    // either the database connection is not set up yet or the relevant cache
+    // table in the database has not yet been created, so we can safely do
+    // nothing here.
+    catch (Exception $e) {
+    }
+  }
+
+  /**
+   * Overrides DrupalDatabaseCache::isEmpty().
+   */
+  function isEmpty() {
+    return TRUE;
+  }
+}
diff --git a/htmltest/includes/cache.inc b/htmltest/includes/cache.inc
new file mode 100644
index 00000000..09f4d753
--- /dev/null
+++ b/htmltest/includes/cache.inc
@@ -0,0 +1,575 @@
+<?php
+
+/**
+ * @file
+ * Functions and interfaces for cache handling.
+ */
+
+/**
+ * Gets the cache object for a cache bin.
+ *
+ * By default, this returns an instance of the DrupalDatabaseCache class.
+ * Classes implementing DrupalCacheInterface can register themselves both as a
+ * default implementation and for specific bins.
+ *
+ * @param $bin
+ *   The cache bin for which the cache object should be returned.
+ * @return DrupalCacheInterface
+ *   The cache object associated with the specified bin.
+ *
+ * @see DrupalCacheInterface
+ */
+function _cache_get_object($bin) {
+  // We do not use drupal_static() here because we do not want to change the
+  // storage of a cache bin mid-request.
+  static $cache_objects;
+  if (!isset($cache_objects[$bin])) {
+    $class = variable_get('cache_class_' . $bin);
+    if (!isset($class)) {
+      $class = variable_get('cache_default_class', 'DrupalDatabaseCache');
+    }
+    $cache_objects[$bin] = new $class($bin);
+  }
+  return $cache_objects[$bin];
+}
+
+/**
+ * Returns data from the persistent cache.
+ *
+ * Data may be stored as either plain text or as serialized data. cache_get
+ * will automatically return unserialized objects and arrays.
+ *
+ * @param $cid
+ *   The cache ID of the data to retrieve.
+ * @param $bin
+ *   The cache bin to store the data in. Valid core values are 'cache_block',
+ *   'cache_bootstrap', 'cache_field', 'cache_filter', 'cache_form',
+ *   'cache_menu', 'cache_page', 'cache_path', 'cache_update' or 'cache' for
+ *   the default cache.
+ *
+ * @return
+ *   The cache or FALSE on failure.
+ *
+ * @see cache_set()
+ */
+function cache_get($cid, $bin = 'cache') {
+  return _cache_get_object($bin)->get($cid);
+}
+
+/**
+ * Returns data from the persistent cache when given an array of cache IDs.
+ *
+ * @param $cids
+ *   An array of cache IDs for the data to retrieve. This is passed by
+ *   reference, and will have the IDs successfully returned from cache removed.
+ * @param $bin
+ *   The cache bin where the data is stored.
+ *
+ * @return
+ *   An array of the items successfully returned from cache indexed by cid.
+ */
+function cache_get_multiple(array &$cids, $bin = 'cache') {
+  return _cache_get_object($bin)->getMultiple($cids);
+}
+
+/**
+ * Stores data in the persistent cache.
+ *
+ * The persistent cache is split up into several cache bins. In the default
+ * cache implementation, each cache bin corresponds to a database table by the
+ * same name. Other implementations might want to store several bins in data
+ * structures that get flushed together. While it is not a problem for most
+ * cache bins if the entries in them are flushed before their expire time, some
+ * might break functionality or are extremely expensive to recalculate. The
+ * other bins are expired automatically by core. Contributed modules can add
+ * additional bins and get them expired automatically by implementing
+ * hook_flush_caches().
+ *
+ * The reasons for having several bins are as follows:
+ * - Smaller bins mean smaller database tables and allow for faster selects and
+ *   inserts.
+ * - We try to put fast changing cache items and rather static ones into
+ *   different bins. The effect is that only the fast changing bins will need a
+ *   lot of writes to disk. The more static bins will also be better cacheable
+ *   with MySQL's query cache.
+ *
+ * @param $cid
+ *   The cache ID of the data to store.
+ * @param $data
+ *   The data to store in the cache. Complex data types will be automatically
+ *   serialized before insertion. Strings will be stored as plain text and are
+ *   not serialized.
+ * @param $bin
+ *   The cache bin to store the data in. Valid core values are:
+ *   - cache: (default) Generic cache storage bin (used for theme registry,
+ *     locale date, list of simpletest tests, etc.).
+ *   - cache_block: Stores the content of various blocks.
+ *   - cache_bootstrap: Stores the class registry, the system list of modules,
+ *     the list of which modules implement which hooks, and the Drupal variable
+ *     list.
+ *   - cache_field: Stores the field data belonging to a given object.
+ *   - cache_filter: Stores filtered pieces of content.
+ *   - cache_form: Stores multistep forms. Flushing this bin means that some
+ *     forms displayed to users lose their state and the data already submitted
+ *     to them. This bin should not be flushed before its expired time.
+ *   - cache_menu: Stores the structure of visible navigation menus per page.
+ *   - cache_page: Stores generated pages for anonymous users. It is flushed
+ *     very often, whenever a page changes, at least for every node and comment
+ *     submission. This is the only bin affected by the page cache setting on
+ *     the administrator panel.
+ *   - cache_path: Stores the system paths that have an alias.
+ * @param $expire
+ *   One of the following values:
+ *   - CACHE_PERMANENT: Indicates that the item should never be removed unless
+ *     explicitly told to using cache_clear_all() with a cache ID.
+ *   - CACHE_TEMPORARY: Indicates that the item should be removed at the next
+ *     general cache wipe.
+ *   - A Unix timestamp: Indicates that the item should be kept at least until
+ *     the given time, after which it behaves like CACHE_TEMPORARY.
+ *
+ * @see _update_cache_set()
+ * @see cache_get()
+ */
+function cache_set($cid, $data, $bin = 'cache', $expire = CACHE_PERMANENT) {
+  return _cache_get_object($bin)->set($cid, $data, $expire);
+}
+
+/**
+ * Expires data from the cache.
+ *
+ * If called with the arguments $cid and $bin set to NULL or omitted, then
+ * expirable entries will be cleared from the cache_page and cache_block bins,
+ * and the $wildcard argument is ignored.
+ *
+ * @param $cid
+ *   If set, the cache ID or an array of cache IDs. Otherwise, all cache entries
+ *   that can expire are deleted. The $wildcard argument will be ignored if set
+ *   to NULL.
+ * @param $bin
+ *   If set, the cache bin to delete from. Mandatory argument if $cid is set.
+ * @param $wildcard
+ *   If TRUE, the $cid argument must contain a string value and cache IDs
+ *   starting with $cid are deleted in addition to the exact cache ID specified
+ *   by $cid. If $wildcard is TRUE and $cid is '*', the entire cache is emptied.
+ */
+function cache_clear_all($cid = NULL, $bin = NULL, $wildcard = FALSE) {
+  if (!isset($cid) && !isset($bin)) {
+    // Clear the block cache first, so stale data will
+    // not end up in the page cache.
+    if (module_exists('block')) {
+      cache_clear_all(NULL, 'cache_block');
+    }
+    cache_clear_all(NULL, 'cache_page');
+    return;
+  }
+  return _cache_get_object($bin)->clear($cid, $wildcard);
+}
+
+/**
+ * Checks if a cache bin is empty.
+ *
+ * A cache bin is considered empty if it does not contain any valid data for any
+ * cache ID.
+ *
+ * @param $bin
+ *   The cache bin to check.
+ *
+ * @return
+ *   TRUE if the cache bin specified is empty.
+ */
+function cache_is_empty($bin) {
+  return _cache_get_object($bin)->isEmpty();
+}
+
+/**
+ * Defines an interface for cache implementations.
+ *
+ * All cache implementations have to implement this interface.
+ * DrupalDatabaseCache provides the default implementation, which can be
+ * consulted as an example.
+ *
+ * To make Drupal use your implementation for a certain cache bin, you have to
+ * set a variable with the name of the cache bin as its key and the name of
+ * your class as its value. For example, if your implementation of
+ * DrupalCacheInterface was called MyCustomCache, the following line would make
+ * Drupal use it for the 'cache_page' bin:
+ * @code
+ *  variable_set('cache_class_cache_page', 'MyCustomCache');
+ * @endcode
+ *
+ * Additionally, you can register your cache implementation to be used by
+ * default for all cache bins by setting the variable 'cache_default_class' to
+ * the name of your implementation of the DrupalCacheInterface, e.g.
+ * @code
+ *  variable_set('cache_default_class', 'MyCustomCache');
+ * @endcode
+ *
+ * To implement a completely custom cache bin, use the same variable format:
+ * @code
+ *  variable_set('cache_class_custom_bin', 'MyCustomCache');
+ * @endcode
+ * To access your custom cache bin, specify the name of the bin when storing
+ * or retrieving cached data:
+ * @code
+ *  cache_set($cid, $data, 'custom_bin', $expire);
+ *  cache_get($cid, 'custom_bin');
+ * @endcode
+ *
+ * @see _cache_get_object()
+ * @see DrupalDatabaseCache
+ */
+interface DrupalCacheInterface {
+
+  /**
+   * Returns data from the persistent cache.
+   *
+   * Data may be stored as either plain text or as serialized data. cache_get()
+   * will automatically return unserialized objects and arrays.
+   *
+   * @param $cid
+   *   The cache ID of the data to retrieve.
+   *
+   * @return
+   *   The cache or FALSE on failure.
+   */
+  function get($cid);
+
+  /**
+   * Returns data from the persistent cache when given an array of cache IDs.
+   *
+   * @param $cids
+   *   An array of cache IDs for the data to retrieve. This is passed by
+   *   reference, and will have the IDs successfully returned from cache
+   *   removed.
+   *
+   * @return
+   *   An array of the items successfully returned from cache indexed by cid.
+   */
+   function getMultiple(&$cids);
+
+  /**
+   * Stores data in the persistent cache.
+   *
+   * @param $cid
+   *   The cache ID of the data to store.
+   * @param $data
+   *   The data to store in the cache. Complex data types will be automatically
+   *   serialized before insertion.
+   *   Strings will be stored as plain text and not serialized.
+   * @param $expire
+   *   One of the following values:
+   *   - CACHE_PERMANENT: Indicates that the item should never be removed unless
+   *     explicitly told to using cache_clear_all() with a cache ID.
+   *   - CACHE_TEMPORARY: Indicates that the item should be removed at the next
+   *     general cache wipe.
+   *   - A Unix timestamp: Indicates that the item should be kept at least until
+   *     the given time, after which it behaves like CACHE_TEMPORARY.
+   */
+  function set($cid, $data, $expire = CACHE_PERMANENT);
+
+
+  /**
+   * Expires data from the cache.
+   *
+   * If called without arguments, expirable entries will be cleared from the
+   * cache_page and cache_block bins.
+   *
+   * @param $cid
+   *   If set, the cache ID or an array of cache IDs. Otherwise, all cache
+   *   entries that can expire are deleted. The $wildcard argument will be
+   *   ignored if set to NULL.
+   * @param $wildcard
+   *   If TRUE, the $cid argument must contain a string value and cache IDs
+   *   starting with $cid are deleted in addition to the exact cache ID
+   *   specified by $cid. If $wildcard is TRUE and $cid is '*', the entire
+   *   cache is emptied.
+   */
+  function clear($cid = NULL, $wildcard = FALSE);
+
+  /**
+   * Checks if a cache bin is empty.
+   *
+   * A cache bin is considered empty if it does not contain any valid data for
+   * any cache ID.
+   *
+   * @return
+   *   TRUE if the cache bin specified is empty.
+   */
+  function isEmpty();
+}
+
+/**
+ * Defines a default cache implementation.
+ *
+ * This is Drupal's default cache implementation. It uses the database to store
+ * cached data. Each cache bin corresponds to a database table by the same name.
+ */
+class DrupalDatabaseCache implements DrupalCacheInterface {
+  protected $bin;
+
+  /**
+   * Constructs a DrupalDatabaseCache object.
+   *
+   * @param $bin
+   *   The cache bin for which the object is created.
+   */
+  function __construct($bin) {
+    $this->bin = $bin;
+  }
+
+  /**
+   * Implements DrupalCacheInterface::get().
+   */
+  function get($cid) {
+    $cids = array($cid);
+    $cache = $this->getMultiple($cids);
+    return reset($cache);
+  }
+
+  /**
+   * Implements DrupalCacheInterface::getMultiple().
+   */
+  function getMultiple(&$cids) {
+    try {
+      // Garbage collection necessary when enforcing a minimum cache lifetime.
+      $this->garbageCollection($this->bin);
+
+      // When serving cached pages, the overhead of using db_select() was found
+      // to add around 30% overhead to the request. Since $this->bin is a
+      // variable, this means the call to db_query() here uses a concatenated
+      // string. This is highly discouraged under any other circumstances, and
+      // is used here only due to the performance overhead we would incur
+      // otherwise. When serving an uncached page, the overhead of using
+      // db_select() is a much smaller proportion of the request.
+      $result = db_query('SELECT cid, data, created, expire, serialized FROM {' . db_escape_table($this->bin) . '} WHERE cid IN (:cids)', array(':cids' => $cids));
+      $cache = array();
+      foreach ($result as $item) {
+        $item = $this->prepareItem($item);
+        if ($item) {
+          $cache[$item->cid] = $item;
+        }
+      }
+      $cids = array_diff($cids, array_keys($cache));
+      return $cache;
+    }
+    catch (Exception $e) {
+      // If the database is never going to be available, cache requests should
+      // return FALSE in order to allow exception handling to occur.
+      return array();
+    }
+  }
+
+  /**
+   * Garbage collection for get() and getMultiple().
+   *
+   * @param $bin
+   *   The bin being requested.
+   */
+  protected function garbageCollection() {
+    $cache_lifetime = variable_get('cache_lifetime', 0);
+
+    // Clean-up the per-user cache expiration session data, so that the session
+    // handler can properly clean-up the session data for anonymous users.
+    if (isset($_SESSION['cache_expiration'])) {
+      $expire = REQUEST_TIME - $cache_lifetime;
+      foreach ($_SESSION['cache_expiration'] as $bin => $timestamp) {
+        if ($timestamp < $expire) {
+          unset($_SESSION['cache_expiration'][$bin]);
+        }
+      }
+      if (!$_SESSION['cache_expiration']) {
+        unset($_SESSION['cache_expiration']);
+      }
+    }
+
+    // Garbage collection of temporary items is only necessary when enforcing
+    // a minimum cache lifetime.
+    if (!$cache_lifetime) {
+      return;
+    }
+    // When cache lifetime is in force, avoid running garbage collection too
+    // often since this will remove temporary cache items indiscriminately.
+    $cache_flush = variable_get('cache_flush_' . $this->bin, 0);
+    if ($cache_flush && ($cache_flush + $cache_lifetime <= REQUEST_TIME)) {
+      // Reset the variable immediately to prevent a meltdown in heavy load situations.
+      variable_set('cache_flush_' . $this->bin, 0);
+      // Time to flush old cache data
+      db_delete($this->bin)
+        ->condition('expire', CACHE_PERMANENT, '<>')
+        ->condition('expire', $cache_flush, '<=')
+        ->execute();
+    }
+  }
+
+  /**
+   * Prepares a cached item.
+   *
+   * Checks that items are either permanent or did not expire, and unserializes
+   * data as appropriate.
+   *
+   * @param $cache
+   *   An item loaded from cache_get() or cache_get_multiple().
+   *
+   * @return
+   *   The item with data unserialized as appropriate or FALSE if there is no
+   *   valid item to load.
+   */
+  protected function prepareItem($cache) {
+    global $user;
+
+    if (!isset($cache->data)) {
+      return FALSE;
+    }
+    // If the cached data is temporary and subject to a per-user minimum
+    // lifetime, compare the cache entry timestamp with the user session
+    // cache_expiration timestamp. If the cache entry is too old, ignore it.
+    if ($cache->expire != CACHE_PERMANENT && variable_get('cache_lifetime', 0) && isset($_SESSION['cache_expiration'][$this->bin]) && $_SESSION['cache_expiration'][$this->bin] > $cache->created) {
+      // Ignore cache data that is too old and thus not valid for this user.
+      return FALSE;
+    }
+
+    // If the data is permanent or not subject to a minimum cache lifetime,
+    // unserialize and return the cached data.
+    if ($cache->serialized) {
+      $cache->data = unserialize($cache->data);
+    }
+
+    return $cache;
+  }
+
+  /**
+   * Implements DrupalCacheInterface::set().
+   */
+  function set($cid, $data, $expire = CACHE_PERMANENT) {
+    $fields = array(
+      'serialized' => 0,
+      'created' => REQUEST_TIME,
+      'expire' => $expire,
+    );
+    if (!is_string($data)) {
+      $fields['data'] = serialize($data);
+      $fields['serialized'] = 1;
+    }
+    else {
+      $fields['data'] = $data;
+      $fields['serialized'] = 0;
+    }
+
+    try {
+      db_merge($this->bin)
+        ->key(array('cid' => $cid))
+        ->fields($fields)
+        ->execute();
+    }
+    catch (Exception $e) {
+      // The database may not be available, so we'll ignore cache_set requests.
+    }
+  }
+
+  /**
+   * Implements DrupalCacheInterface::clear().
+   */
+  function clear($cid = NULL, $wildcard = FALSE) {
+    global $user;
+
+    if (empty($cid)) {
+      if (variable_get('cache_lifetime', 0)) {
+        // We store the time in the current user's session. We then simulate
+        // that the cache was flushed for this user by not returning cached
+        // data that was cached before the timestamp.
+        $_SESSION['cache_expiration'][$this->bin] = REQUEST_TIME;
+
+        $cache_flush = variable_get('cache_flush_' . $this->bin, 0);
+        if ($cache_flush == 0) {
+          // This is the first request to clear the cache, start a timer.
+          variable_set('cache_flush_' . $this->bin, REQUEST_TIME);
+        }
+        elseif (REQUEST_TIME > ($cache_flush + variable_get('cache_lifetime', 0))) {
+          // Clear the cache for everyone, cache_lifetime seconds have
+          // passed since the first request to clear the cache.
+          db_delete($this->bin)
+            ->condition('expire', CACHE_PERMANENT, '<>')
+            ->condition('expire', REQUEST_TIME, '<')
+            ->execute();
+          variable_set('cache_flush_' . $this->bin, 0);
+        }
+      }
+      else {
+        // No minimum cache lifetime, flush all temporary cache entries now.
+        db_delete($this->bin)
+          ->condition('expire', CACHE_PERMANENT, '<>')
+          ->condition('expire', REQUEST_TIME, '<')
+          ->execute();
+      }
+    }
+    else {
+      if ($wildcard) {
+        if ($cid == '*') {
+          // Check if $this->bin is a cache table before truncating. Other
+          // cache_clear_all() operations throw a PDO error in this situation,
+          // so we don't need to verify them first. This ensures that non-cache
+          // tables cannot be truncated accidentally.
+          if ($this->isValidBin()) {
+            db_truncate($this->bin)->execute();
+          }
+          else {
+            throw new Exception(t('Invalid or missing cache bin specified: %bin', array('%bin' => $this->bin)));
+          }
+        }
+        else {
+          db_delete($this->bin)
+            ->condition('cid', db_like($cid) . '%', 'LIKE')
+            ->execute();
+        }
+      }
+      elseif (is_array($cid)) {
+        // Delete in chunks when a large array is passed.
+        do {
+          db_delete($this->bin)
+            ->condition('cid', array_splice($cid, 0, 1000), 'IN')
+            ->execute();
+        }
+        while (count($cid));
+      }
+      else {
+        db_delete($this->bin)
+          ->condition('cid', $cid)
+          ->execute();
+      }
+    }
+  }
+
+  /**
+   * Implements DrupalCacheInterface::isEmpty().
+   */
+  function isEmpty() {
+    $this->garbageCollection();
+    $query = db_select($this->bin);
+    $query->addExpression('1');
+    $result = $query->range(0, 1)
+      ->execute()
+      ->fetchField();
+    return empty($result);
+  }
+
+  /**
+   * Checks if $this->bin represents a valid cache table.
+   *
+   * This check is required to ensure that non-cache tables are not truncated
+   * accidentally when calling cache_clear_all().
+   *
+   * @return boolean
+   */
+  function isValidBin() {
+    if ($this->bin == 'cache' || substr($this->bin, 0, 6) == 'cache_') {
+      // Skip schema check for bins with standard table names.
+      return TRUE;
+    }
+    // These fields are required for any cache table.
+    $fields = array('cid', 'data', 'expire', 'created', 'serialized');
+    // Load the table schema.
+    $schema = drupal_get_schema($this->bin);
+    // Confirm that all fields are present.
+    return isset($schema['fields']) && !array_diff($fields, array_keys($schema['fields']));
+  }
+}
diff --git a/htmltest/includes/common.inc b/htmltest/includes/common.inc
new file mode 100644
index 00000000..3b4bf580
--- /dev/null
+++ b/htmltest/includes/common.inc
@@ -0,0 +1,8224 @@
+<?php
+
+/**
+ * @file
+ * Common functions that many Drupal modules will need to reference.
+ *
+ * The functions that are critical and need to be available even when serving
+ * a cached page are instead located in bootstrap.inc.
+ */
+
+/**
+ * @defgroup php_wrappers PHP wrapper functions
+ * @{
+ * Functions that are wrappers or custom implementations of PHP functions.
+ *
+ * Certain PHP functions should not be used in Drupal. Instead, Drupal's
+ * replacement functions should be used.
+ *
+ * For example, for improved or more secure UTF8-handling, or RFC-compliant
+ * handling of URLs in Drupal.
+ *
+ * For ease of use and memorizing, all these wrapper functions use the same name
+ * as the original PHP function, but prefixed with "drupal_". Beware, however,
+ * that not all wrapper functions support the same arguments as the original
+ * functions.
+ *
+ * You should always use these wrapper functions in your code.
+ *
+ * Wrong:
+ * @code
+ *   $my_substring = substr($original_string, 0, 5);
+ * @endcode
+ *
+ * Correct:
+ * @code
+ *   $my_substring = drupal_substr($original_string, 0, 5);
+ * @endcode
+ *
+ * @}
+ */
+
+/**
+ * Return status for saving which involved creating a new item.
+ */
+define('SAVED_NEW', 1);
+
+/**
+ * Return status for saving which involved an update to an existing item.
+ */
+define('SAVED_UPDATED', 2);
+
+/**
+ * Return status for saving which deleted an existing item.
+ */
+define('SAVED_DELETED', 3);
+
+/**
+ * The default group for system CSS files added to the page.
+ */
+define('CSS_SYSTEM', -100);
+
+/**
+ * The default group for module CSS files added to the page.
+ */
+define('CSS_DEFAULT', 0);
+
+/**
+ * The default group for theme CSS files added to the page.
+ */
+define('CSS_THEME', 100);
+
+/**
+ * The default group for JavaScript and jQuery libraries added to the page.
+ */
+define('JS_LIBRARY', -100);
+
+/**
+ * The default group for module JavaScript code added to the page.
+ */
+define('JS_DEFAULT', 0);
+
+/**
+ * The default group for theme JavaScript code added to the page.
+ */
+define('JS_THEME', 100);
+
+/**
+ * Error code indicating that the request exceeded the specified timeout.
+ *
+ * @see drupal_http_request()
+ */
+define('HTTP_REQUEST_TIMEOUT', -1);
+
+/**
+ * @defgroup block_caching Block Caching
+ * @{
+ * Constants that define each block's caching state.
+ *
+ * Modules specify how their blocks can be cached in their hook_block_info()
+ * implementations. Caching can be turned off (DRUPAL_NO_CACHE), managed by the
+ * module declaring the block (DRUPAL_CACHE_CUSTOM), or managed by the core
+ * Block module. If the Block module is managing the cache, you can specify that
+ * the block is the same for every page and user (DRUPAL_CACHE_GLOBAL), or that
+ * it can change depending on the page (DRUPAL_CACHE_PER_PAGE) or by user
+ * (DRUPAL_CACHE_PER_ROLE or DRUPAL_CACHE_PER_USER). Page and user settings can
+ * be combined with a bitwise-binary or operator; for example,
+ * DRUPAL_CACHE_PER_ROLE | DRUPAL_CACHE_PER_PAGE means that the block can change
+ * depending on the user role or page it is on.
+ *
+ * The block cache is cleared in cache_clear_all(), and uses the same clearing
+ * policy than page cache (node, comment, user, taxonomy added or updated...).
+ * Blocks requiring more fine-grained clearing might consider disabling the
+ * built-in block cache (DRUPAL_NO_CACHE) and roll their own.
+ *
+ * Note that user 1 is excluded from block caching.
+ */
+
+/**
+ * The block should not get cached.
+ *
+ * This setting should be used:
+ * - For simple blocks (notably those that do not perform any db query), where
+ *   querying the db cache would be more expensive than directly generating the
+ *   content.
+ * - For blocks that change too frequently.
+ */
+define('DRUPAL_NO_CACHE', -1);
+
+/**
+ * The block is handling its own caching in its hook_block_view().
+ *
+ * This setting is useful when time based expiration is needed or a site uses a
+ * node access which invalidates standard block cache.
+ */
+define('DRUPAL_CACHE_CUSTOM', -2);
+
+/**
+ * The block or element can change depending on the user's roles.
+ *
+ * This is the default setting for blocks, used when the block does not specify
+ * anything.
+ */
+define('DRUPAL_CACHE_PER_ROLE', 0x0001);
+
+/**
+ * The block or element can change depending on the user.
+ *
+ * This setting can be resource-consuming for sites with large number of users,
+ * and thus should only be used when DRUPAL_CACHE_PER_ROLE is not sufficient.
+ */
+define('DRUPAL_CACHE_PER_USER', 0x0002);
+
+/**
+ * The block or element can change depending on the page being viewed.
+ */
+define('DRUPAL_CACHE_PER_PAGE', 0x0004);
+
+/**
+ * The block or element is the same for every user and page that it is visible.
+ */
+define('DRUPAL_CACHE_GLOBAL', 0x0008);
+
+/**
+ * @} End of "defgroup block_caching".
+ */
+
+/**
+ * Adds content to a specified region.
+ *
+ * @param $region
+ *   Page region the content is added to.
+ * @param $data
+ *   Content to be added.
+ */
+function drupal_add_region_content($region = NULL, $data = NULL) {
+  static $content = array();
+
+  if (isset($region) && isset($data)) {
+    $content[$region][] = $data;
+  }
+  return $content;
+}
+
+/**
+ * Gets assigned content for a given region.
+ *
+ * @param $region
+ *   A specified region to fetch content for. If NULL, all regions will be
+ *   returned.
+ * @param $delimiter
+ *   Content to be inserted between imploded array elements.
+ */
+function drupal_get_region_content($region = NULL, $delimiter = ' ') {
+  $content = drupal_add_region_content();
+  if (isset($region)) {
+    if (isset($content[$region]) && is_array($content[$region])) {
+      return implode($delimiter, $content[$region]);
+    }
+  }
+  else {
+    foreach (array_keys($content) as $region) {
+      if (is_array($content[$region])) {
+        $content[$region] = implode($delimiter, $content[$region]);
+      }
+    }
+    return $content;
+  }
+}
+
+/**
+ * Gets the name of the currently active installation profile.
+ *
+ * When this function is called during Drupal's initial installation process,
+ * the name of the profile that's about to be installed is stored in the global
+ * installation state. At all other times, the standard Drupal systems variable
+ * table contains the name of the current profile, and we can call
+ * variable_get() to determine what one is active.
+ *
+ * @return $profile
+ *   The name of the installation profile.
+ */
+function drupal_get_profile() {
+  global $install_state;
+
+  if (isset($install_state['parameters']['profile'])) {
+    $profile = $install_state['parameters']['profile'];
+  }
+  else {
+    $profile = variable_get('install_profile', 'standard');
+  }
+
+  return $profile;
+}
+
+
+/**
+ * Sets the breadcrumb trail for the current page.
+ *
+ * @param $breadcrumb
+ *   Array of links, starting with "home" and proceeding up to but not including
+ *   the current page.
+ */
+function drupal_set_breadcrumb($breadcrumb = NULL) {
+  $stored_breadcrumb = &drupal_static(__FUNCTION__);
+
+  if (isset($breadcrumb)) {
+    $stored_breadcrumb = $breadcrumb;
+  }
+  return $stored_breadcrumb;
+}
+
+/**
+ * Gets the breadcrumb trail for the current page.
+ */
+function drupal_get_breadcrumb() {
+  $breadcrumb = drupal_set_breadcrumb();
+
+  if (!isset($breadcrumb)) {
+    $breadcrumb = menu_get_active_breadcrumb();
+  }
+
+  return $breadcrumb;
+}
+
+/**
+ * Returns a string containing RDF namespace declarations for use in XML and
+ * XHTML output.
+ */
+function drupal_get_rdf_namespaces() {
+  $xml_rdf_namespaces = array();
+
+  // Serializes the RDF namespaces in XML namespace syntax.
+  if (function_exists('rdf_get_namespaces')) {
+    foreach (rdf_get_namespaces() as $prefix => $uri) {
+      $xml_rdf_namespaces[] = 'xmlns:' . $prefix . '="' . $uri . '"';
+    }
+  }
+  return count($xml_rdf_namespaces) ? "\n  " . implode("\n  ", $xml_rdf_namespaces) : '';
+}
+
+/**
+ * Adds output to the HEAD tag of the HTML page.
+ *
+ * This function can be called as long as the headers aren't sent. Pass no
+ * arguments (or NULL for both) to retrieve the currently stored elements.
+ *
+ * @param $data
+ *   A renderable array. If the '#type' key is not set then 'html_tag' will be
+ *   added as the default '#type'.
+ * @param $key
+ *   A unique string key to allow implementations of hook_html_head_alter() to
+ *   identify the element in $data. Required if $data is not NULL.
+ *
+ * @return
+ *   An array of all stored HEAD elements.
+ *
+ * @see theme_html_tag()
+ */
+function drupal_add_html_head($data = NULL, $key = NULL) {
+  $stored_head = &drupal_static(__FUNCTION__);
+
+  if (!isset($stored_head)) {
+    // Make sure the defaults, including Content-Type, come first.
+    $stored_head = _drupal_default_html_head();
+  }
+
+  if (isset($data) && isset($key)) {
+    if (!isset($data['#type'])) {
+      $data['#type'] = 'html_tag';
+    }
+    $stored_head[$key] = $data;
+  }
+  return $stored_head;
+}
+
+/**
+ * Returns elements that are always displayed in the HEAD tag of the HTML page.
+ */
+function _drupal_default_html_head() {
+  // Add default elements. Make sure the Content-Type comes first because the
+  // IE browser may be vulnerable to XSS via encoding attacks from any content
+  // that comes before this META tag, such as a TITLE tag.
+  $elements['system_meta_content_type'] = array(
+    '#type' => 'html_tag',
+    '#tag' => 'meta',
+    '#attributes' => array(
+      'http-equiv' => 'Content-Type',
+      'content' => 'text/html; charset=utf-8',
+    ),
+    // Security: This always has to be output first.
+    '#weight' => -1000,
+  );
+  // Show Drupal and the major version number in the META GENERATOR tag.
+  // Get the major version.
+  list($version, ) = explode('.', VERSION);
+  $elements['system_meta_generator'] = array(
+    '#type' => 'html_tag',
+    '#tag' => 'meta',
+    '#attributes' => array(
+      'name' => 'Generator',
+      'content' => 'Drupal ' . $version . ' (http://drupal.org)',
+    ),
+  );
+  // Also send the generator in the HTTP header.
+  $elements['system_meta_generator']['#attached']['drupal_add_http_header'][] = array('X-Generator', $elements['system_meta_generator']['#attributes']['content']);
+  return $elements;
+}
+
+/**
+ * Retrieves output to be displayed in the HEAD tag of the HTML page.
+ */
+function drupal_get_html_head() {
+  $elements = drupal_add_html_head();
+  drupal_alter('html_head', $elements);
+  return drupal_render($elements);
+}
+
+/**
+ * Adds a feed URL for the current page.
+ *
+ * This function can be called as long the HTML header hasn't been sent.
+ *
+ * @param $url
+ *   An internal system path or a fully qualified external URL of the feed.
+ * @param $title
+ *   The title of the feed.
+ */
+function drupal_add_feed($url = NULL, $title = '') {
+  $stored_feed_links = &drupal_static(__FUNCTION__, array());
+
+  if (isset($url)) {
+    $stored_feed_links[$url] = theme('feed_icon', array('url' => $url, 'title' => $title));
+
+    drupal_add_html_head_link(array(
+      'rel' => 'alternate',
+      'type' => 'application/rss+xml',
+      'title' => $title,
+      // Force the URL to be absolute, for consistency with other <link> tags
+      // output by Drupal.
+      'href' => url($url, array('absolute' => TRUE)),
+    ));
+  }
+  return $stored_feed_links;
+}
+
+/**
+ * Gets the feed URLs for the current page.
+ *
+ * @param $delimiter
+ *   A delimiter to split feeds by.
+ */
+function drupal_get_feeds($delimiter = "\n") {
+  $feeds = drupal_add_feed();
+  return implode($feeds, $delimiter);
+}
+
+/**
+ * @defgroup http_handling HTTP handling
+ * @{
+ * Functions to properly handle HTTP responses.
+ */
+
+/**
+ * Processes a URL query parameter array to remove unwanted elements.
+ *
+ * @param $query
+ *   (optional) An array to be processed. Defaults to $_GET.
+ * @param $exclude
+ *   (optional) A list of $query array keys to remove. Use "parent[child]" to
+ *   exclude nested items. Defaults to array('q').
+ * @param $parent
+ *   Internal use only. Used to build the $query array key for nested items.
+ *
+ * @return
+ *   An array containing query parameters, which can be used for url().
+ */
+function drupal_get_query_parameters(array $query = NULL, array $exclude = array('q'), $parent = '') {
+  // Set defaults, if none given.
+  if (!isset($query)) {
+    $query = $_GET;
+  }
+  // If $exclude is empty, there is nothing to filter.
+  if (empty($exclude)) {
+    return $query;
+  }
+  elseif (!$parent) {
+    $exclude = array_flip($exclude);
+  }
+
+  $params = array();
+  foreach ($query as $key => $value) {
+    $string_key = ($parent ? $parent . '[' . $key . ']' : $key);
+    if (isset($exclude[$string_key])) {
+      continue;
+    }
+
+    if (is_array($value)) {
+      $params[$key] = drupal_get_query_parameters($value, $exclude, $string_key);
+    }
+    else {
+      $params[$key] = $value;
+    }
+  }
+
+  return $params;
+}
+
+/**
+ * Splits a URL-encoded query string into an array.
+ *
+ * @param $query
+ *   The query string to split.
+ *
+ * @return
+ *   An array of URL decoded couples $param_name => $value.
+ */
+function drupal_get_query_array($query) {
+  $result = array();
+  if (!empty($query)) {
+    foreach (explode('&', $query) as $param) {
+      $param = explode('=', $param);
+      $result[$param[0]] = isset($param[1]) ? rawurldecode($param[1]) : '';
+    }
+  }
+  return $result;
+}
+
+/**
+ * Parses an array into a valid, rawurlencoded query string.
+ *
+ * This differs from http_build_query() as we need to rawurlencode() (instead of
+ * urlencode()) all query parameters.
+ *
+ * @param $query
+ *   The query parameter array to be processed, e.g. $_GET.
+ * @param $parent
+ *   Internal use only. Used to build the $query array key for nested items.
+ *
+ * @return
+ *   A rawurlencoded string which can be used as or appended to the URL query
+ *   string.
+ *
+ * @see drupal_get_query_parameters()
+ * @ingroup php_wrappers
+ */
+function drupal_http_build_query(array $query, $parent = '') {
+  $params = array();
+
+  foreach ($query as $key => $value) {
+    $key = ($parent ? $parent . '[' . rawurlencode($key) . ']' : rawurlencode($key));
+
+    // Recurse into children.
+    if (is_array($value)) {
+      $params[] = drupal_http_build_query($value, $key);
+    }
+    // If a query parameter value is NULL, only append its key.
+    elseif (!isset($value)) {
+      $params[] = $key;
+    }
+    else {
+      // For better readability of paths in query strings, we decode slashes.
+      $params[] = $key . '=' . str_replace('%2F', '/', rawurlencode($value));
+    }
+  }
+
+  return implode('&', $params);
+}
+
+/**
+ * Prepares a 'destination' URL query parameter for use with drupal_goto().
+ *
+ * Used to direct the user back to the referring page after completing a form.
+ * By default the current URL is returned. If a destination exists in the
+ * previous request, that destination is returned. As such, a destination can
+ * persist across multiple pages.
+ *
+ * @return
+ *   An associative array containing the key:
+ *   - destination: The path provided via the destination query string or, if
+ *     not available, the current path.
+ *
+ * @see current_path()
+ * @see drupal_goto()
+ */
+function drupal_get_destination() {
+  $destination = &drupal_static(__FUNCTION__);
+
+  if (isset($destination)) {
+    return $destination;
+  }
+
+  if (isset($_GET['destination'])) {
+    $destination = array('destination' => $_GET['destination']);
+  }
+  else {
+    $path = $_GET['q'];
+    $query = drupal_http_build_query(drupal_get_query_parameters());
+    if ($query != '') {
+      $path .= '?' . $query;
+    }
+    $destination = array('destination' => $path);
+  }
+  return $destination;
+}
+
+/**
+ * Parses a system URL string into an associative array suitable for url().
+ *
+ * This function should only be used for URLs that have been generated by the
+ * system, such as via url(). It should not be used for URLs that come from
+ * external sources, or URLs that link to external resources.
+ *
+ * The returned array contains a 'path' that may be passed separately to url().
+ * For example:
+ * @code
+ *   $options = drupal_parse_url($_GET['destination']);
+ *   $my_url = url($options['path'], $options);
+ *   $my_link = l('Example link', $options['path'], $options);
+ * @endcode
+ *
+ * This is required, because url() does not support relative URLs containing a
+ * query string or fragment in its $path argument. Instead, any query string
+ * needs to be parsed into an associative query parameter array in
+ * $options['query'] and the fragment into $options['fragment'].
+ *
+ * @param $url
+ *   The URL string to parse, f.e. $_GET['destination'].
+ *
+ * @return
+ *   An associative array containing the keys:
+ *   - 'path': The path of the URL. If the given $url is external, this includes
+ *     the scheme and host.
+ *   - 'query': An array of query parameters of $url, if existent.
+ *   - 'fragment': The fragment of $url, if existent.
+ *
+ * @see url()
+ * @see drupal_goto()
+ * @ingroup php_wrappers
+ */
+function drupal_parse_url($url) {
+  $options = array(
+    'path' => NULL,
+    'query' => array(),
+    'fragment' => '',
+  );
+
+  // External URLs: not using parse_url() here, so we do not have to rebuild
+  // the scheme, host, and path without having any use for it.
+  if (strpos($url, '://') !== FALSE) {
+    // Split off everything before the query string into 'path'.
+    $parts = explode('?', $url);
+    $options['path'] = $parts[0];
+    // If there is a query string, transform it into keyed query parameters.
+    if (isset($parts[1])) {
+      $query_parts = explode('#', $parts[1]);
+      parse_str($query_parts[0], $options['query']);
+      // Take over the fragment, if there is any.
+      if (isset($query_parts[1])) {
+        $options['fragment'] = $query_parts[1];
+      }
+    }
+  }
+  // Internal URLs.
+  else {
+    // parse_url() does not support relative URLs, so make it absolute. E.g. the
+    // relative URL "foo/bar:1" isn't properly parsed.
+    $parts = parse_url('http://example.com/' . $url);
+    // Strip the leading slash that was just added.
+    $options['path'] = substr($parts['path'], 1);
+    if (isset($parts['query'])) {
+      parse_str($parts['query'], $options['query']);
+    }
+    if (isset($parts['fragment'])) {
+      $options['fragment'] = $parts['fragment'];
+    }
+  }
+  // The 'q' parameter contains the path of the current page if clean URLs are
+  // disabled. It overrides the 'path' of the URL when present, even if clean
+  // URLs are enabled, due to how Apache rewriting rules work.
+  if (isset($options['query']['q'])) {
+    $options['path'] = $options['query']['q'];
+    unset($options['query']['q']);
+  }
+
+  return $options;
+}
+
+/**
+ * Encodes a Drupal path for use in a URL.
+ *
+ * For aesthetic reasons slashes are not escaped.
+ *
+ * Note that url() takes care of calling this function, so a path passed to that
+ * function should not be encoded in advance.
+ *
+ * @param $path
+ *   The Drupal path to encode.
+ */
+function drupal_encode_path($path) {
+  return str_replace('%2F', '/', rawurlencode($path));
+}
+
+/**
+ * Sends the user to a different page.
+ *
+ * This issues an on-site HTTP redirect. The function makes sure the redirected
+ * URL is formatted correctly.
+ *
+ * Usually the redirected URL is constructed from this function's input
+ * parameters. However you may override that behavior by setting a
+ * destination in either the $_REQUEST-array (i.e. by using
+ * the query string of an URI) This is used to direct the user back to
+ * the proper page after completing a form. For example, after editing
+ * a post on the 'admin/content'-page or after having logged on using the
+ * 'user login'-block in a sidebar. The function drupal_get_destination()
+ * can be used to help set the destination URL.
+ *
+ * Drupal will ensure that messages set by drupal_set_message() and other
+ * session data are written to the database before the user is redirected.
+ *
+ * This function ends the request; use it instead of a return in your menu
+ * callback.
+ *
+ * @param $path
+ *   (optional) A Drupal path or a full URL, which will be passed to url() to
+ *   compute the redirect for the URL.
+ * @param $options
+ *   (optional) An associative array of additional URL options to pass to url().
+ * @param $http_response_code
+ *   (optional) The HTTP status code to use for the redirection, defaults to
+ *   302. The valid values for 3xx redirection status codes are defined in
+ *   @link http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3 RFC 2616 @endlink
+ *   and the
+ *   @link http://tools.ietf.org/html/draft-reschke-http-status-308-07 draft for the new HTTP status codes: @endlink
+ *   - 301: Moved Permanently (the recommended value for most redirects).
+ *   - 302: Found (default in Drupal and PHP, sometimes used for spamming search
+ *     engines).
+ *   - 303: See Other.
+ *   - 304: Not Modified.
+ *   - 305: Use Proxy.
+ *   - 307: Temporary Redirect.
+ *
+ * @see drupal_get_destination()
+ * @see url()
+ */
+function drupal_goto($path = '', array $options = array(), $http_response_code = 302) {
+  // A destination in $_GET always overrides the function arguments.
+  // We do not allow absolute URLs to be passed via $_GET, as this can be an attack vector.
+  if (isset($_GET['destination']) && !url_is_external($_GET['destination'])) {
+    $destination = drupal_parse_url($_GET['destination']);
+    $path = $destination['path'];
+    $options['query'] = $destination['query'];
+    $options['fragment'] = $destination['fragment'];
+  }
+
+  drupal_alter('drupal_goto', $path, $options, $http_response_code);
+
+  // The 'Location' HTTP header must be absolute.
+  $options['absolute'] = TRUE;
+
+  $url = url($path, $options);
+
+  header('Location: ' . $url, TRUE, $http_response_code);
+
+  // The "Location" header sends a redirect status code to the HTTP daemon. In
+  // some cases this can be wrong, so we make sure none of the code below the
+  // drupal_goto() call gets executed upon redirection.
+  drupal_exit($url);
+}
+
+/**
+ * Delivers a "site is under maintenance" message to the browser.
+ *
+ * Page callback functions wanting to report a "site offline" message should
+ * return MENU_SITE_OFFLINE instead of calling drupal_site_offline(). However,
+ * functions that are invoked in contexts where that return value might not
+ * bubble up to menu_execute_active_handler() should call drupal_site_offline().
+ */
+function drupal_site_offline() {
+  drupal_deliver_page(MENU_SITE_OFFLINE);
+}
+
+/**
+ * Delivers a "page not found" error to the browser.
+ *
+ * Page callback functions wanting to report a "page not found" message should
+ * return MENU_NOT_FOUND instead of calling drupal_not_found(). However,
+ * functions that are invoked in contexts where that return value might not
+ * bubble up to menu_execute_active_handler() should call drupal_not_found().
+ */
+function drupal_not_found() {
+  drupal_deliver_page(MENU_NOT_FOUND);
+}
+
+/**
+ * Delivers an "access denied" error to the browser.
+ *
+ * Page callback functions wanting to report an "access denied" message should
+ * return MENU_ACCESS_DENIED instead of calling drupal_access_denied(). However,
+ * functions that are invoked in contexts where that return value might not
+ * bubble up to menu_execute_active_handler() should call
+ * drupal_access_denied().
+ */
+function drupal_access_denied() {
+  drupal_deliver_page(MENU_ACCESS_DENIED);
+}
+
+/**
+ * Performs an HTTP request.
+ *
+ * This is a flexible and powerful HTTP client implementation. Correctly
+ * handles GET, POST, PUT or any other HTTP requests. Handles redirects.
+ *
+ * @param $url
+ *   A string containing a fully qualified URI.
+ * @param array $options
+ *   (optional) An array that can have one or more of the following elements:
+ *   - headers: An array containing request headers to send as name/value pairs.
+ *   - method: A string containing the request method. Defaults to 'GET'.
+ *   - data: A string containing the request body, formatted as
+ *     'param=value&param=value&...'. Defaults to NULL.
+ *   - max_redirects: An integer representing how many times a redirect
+ *     may be followed. Defaults to 3.
+ *   - timeout: A float representing the maximum number of seconds the function
+ *     call may take. The default is 30 seconds. If a timeout occurs, the error
+ *     code is set to the HTTP_REQUEST_TIMEOUT constant.
+ *   - context: A context resource created with stream_context_create().
+ *
+ * @return object
+ *   An object that can have one or more of the following components:
+ *   - request: A string containing the request body that was sent.
+ *   - code: An integer containing the response status code, or the error code
+ *     if an error occurred.
+ *   - protocol: The response protocol (e.g. HTTP/1.1 or HTTP/1.0).
+ *   - status_message: The status message from the response, if a response was
+ *     received.
+ *   - redirect_code: If redirected, an integer containing the initial response
+ *     status code.
+ *   - redirect_url: If redirected, a string containing the URL of the redirect
+ *     target.
+ *   - error: If an error occurred, the error message. Otherwise not set.
+ *   - headers: An array containing the response headers as name/value pairs.
+ *     HTTP header names are case-insensitive (RFC 2616, section 4.2), so for
+ *     easy access the array keys are returned in lower case.
+ *   - data: A string containing the response body that was received.
+ */
+function drupal_http_request($url, array $options = array()) {
+  // Allow an alternate HTTP client library to replace Drupal's default
+  // implementation.
+  $override_function = variable_get('drupal_http_request_function', FALSE);
+  if (!empty($override_function) && function_exists($override_function)) {
+    return $override_function($url, $options);
+  }
+
+  $result = new stdClass();
+
+  // Parse the URL and make sure we can handle the schema.
+  $uri = @parse_url($url);
+
+  if ($uri == FALSE) {
+    $result->error = 'unable to parse URL';
+    $result->code = -1001;
+    return $result;
+  }
+
+  if (!isset($uri['scheme'])) {
+    $result->error = 'missing schema';
+    $result->code = -1002;
+    return $result;
+  }
+
+  timer_start(__FUNCTION__);
+
+  // Merge the default options.
+  $options += array(
+    'headers' => array(),
+    'method' => 'GET',
+    'data' => NULL,
+    'max_redirects' => 3,
+    'timeout' => 30.0,
+    'context' => NULL,
+  );
+
+  // Merge the default headers.
+  $options['headers'] += array(
+    'User-Agent' => 'Drupal (+http://drupal.org/)',
+  );
+
+  // stream_socket_client() requires timeout to be a float.
+  $options['timeout'] = (float) $options['timeout'];
+
+  // Use a proxy if one is defined and the host is not on the excluded list.
+  $proxy_server = variable_get('proxy_server', '');
+  if ($proxy_server && _drupal_http_use_proxy($uri['host'])) {
+    // Set the scheme so we open a socket to the proxy server.
+    $uri['scheme'] = 'proxy';
+    // Set the path to be the full URL.
+    $uri['path'] = $url;
+    // Since the URL is passed as the path, we won't use the parsed query.
+    unset($uri['query']);
+
+    // Add in username and password to Proxy-Authorization header if needed.
+    if ($proxy_username = variable_get('proxy_username', '')) {
+      $proxy_password = variable_get('proxy_password', '');
+      $options['headers']['Proxy-Authorization'] = 'Basic ' . base64_encode($proxy_username . (!empty($proxy_password) ? ":" . $proxy_password : ''));
+    }
+    // Some proxies reject requests with any User-Agent headers, while others
+    // require a specific one.
+    $proxy_user_agent = variable_get('proxy_user_agent', '');
+    // The default value matches neither condition.
+    if ($proxy_user_agent === NULL) {
+      unset($options['headers']['User-Agent']);
+    }
+    elseif ($proxy_user_agent) {
+      $options['headers']['User-Agent'] = $proxy_user_agent;
+    }
+  }
+
+  switch ($uri['scheme']) {
+    case 'proxy':
+      // Make the socket connection to a proxy server.
+      $socket = 'tcp://' . $proxy_server . ':' . variable_get('proxy_port', 8080);
+      // The Host header still needs to match the real request.
+      $options['headers']['Host'] = $uri['host'];
+      $options['headers']['Host'] .= isset($uri['port']) && $uri['port'] != 80 ? ':' . $uri['port'] : '';
+      break;
+
+    case 'http':
+    case 'feed':
+      $port = isset($uri['port']) ? $uri['port'] : 80;
+      $socket = 'tcp://' . $uri['host'] . ':' . $port;
+      // RFC 2616: "non-standard ports MUST, default ports MAY be included".
+      // We don't add the standard port to prevent from breaking rewrite rules
+      // checking the host that do not take into account the port number.
+      $options['headers']['Host'] = $uri['host'] . ($port != 80 ? ':' . $port : '');
+      break;
+
+    case 'https':
+      // Note: Only works when PHP is compiled with OpenSSL support.
+      $port = isset($uri['port']) ? $uri['port'] : 443;
+      $socket = 'ssl://' . $uri['host'] . ':' . $port;
+      $options['headers']['Host'] = $uri['host'] . ($port != 443 ? ':' . $port : '');
+      break;
+
+    default:
+      $result->error = 'invalid schema ' . $uri['scheme'];
+      $result->code = -1003;
+      return $result;
+  }
+
+  if (empty($options['context'])) {
+    $fp = @stream_socket_client($socket, $errno, $errstr, $options['timeout']);
+  }
+  else {
+    // Create a stream with context. Allows verification of a SSL certificate.
+    $fp = @stream_socket_client($socket, $errno, $errstr, $options['timeout'], STREAM_CLIENT_CONNECT, $options['context']);
+  }
+
+  // Make sure the socket opened properly.
+  if (!$fp) {
+    // When a network error occurs, we use a negative number so it does not
+    // clash with the HTTP status codes.
+    $result->code = -$errno;
+    $result->error = trim($errstr) ? trim($errstr) : t('Error opening socket @socket', array('@socket' => $socket));
+
+    // Mark that this request failed. This will trigger a check of the web
+    // server's ability to make outgoing HTTP requests the next time that
+    // requirements checking is performed.
+    // See system_requirements().
+    variable_set('drupal_http_request_fails', TRUE);
+
+    return $result;
+  }
+
+  // Construct the path to act on.
+  $path = isset($uri['path']) ? $uri['path'] : '/';
+  if (isset($uri['query'])) {
+    $path .= '?' . $uri['query'];
+  }
+
+  // Only add Content-Length if we actually have any content or if it is a POST
+  // or PUT request. Some non-standard servers get confused by Content-Length in
+  // at least HEAD/GET requests, and Squid always requires Content-Length in
+  // POST/PUT requests.
+  $content_length = strlen($options['data']);
+  if ($content_length > 0 || $options['method'] == 'POST' || $options['method'] == 'PUT') {
+    $options['headers']['Content-Length'] = $content_length;
+  }
+
+  // If the server URL has a user then attempt to use basic authentication.
+  if (isset($uri['user'])) {
+    $options['headers']['Authorization'] = 'Basic ' . base64_encode($uri['user'] . (isset($uri['pass']) ? ':' . $uri['pass'] : ':'));
+  }
+
+  // If the database prefix is being used by SimpleTest to run the tests in a copied
+  // database then set the user-agent header to the database prefix so that any
+  // calls to other Drupal pages will run the SimpleTest prefixed database. The
+  // user-agent is used to ensure that multiple testing sessions running at the
+  // same time won't interfere with each other as they would if the database
+  // prefix were stored statically in a file or database variable.
+  $test_info = &$GLOBALS['drupal_test_info'];
+  if (!empty($test_info['test_run_id'])) {
+    $options['headers']['User-Agent'] = drupal_generate_test_ua($test_info['test_run_id']);
+  }
+
+  $request = $options['method'] . ' ' . $path . " HTTP/1.0\r\n";
+  foreach ($options['headers'] as $name => $value) {
+    $request .= $name . ': ' . trim($value) . "\r\n";
+  }
+  $request .= "\r\n" . $options['data'];
+  $result->request = $request;
+  // Calculate how much time is left of the original timeout value.
+  $timeout = $options['timeout'] - timer_read(__FUNCTION__) / 1000;
+  if ($timeout > 0) {
+    stream_set_timeout($fp, floor($timeout), floor(1000000 * fmod($timeout, 1)));
+    fwrite($fp, $request);
+  }
+
+  // Fetch response. Due to PHP bugs like http://bugs.php.net/bug.php?id=43782
+  // and http://bugs.php.net/bug.php?id=46049 we can't rely on feof(), but
+  // instead must invoke stream_get_meta_data() each iteration.
+  $info = stream_get_meta_data($fp);
+  $alive = !$info['eof'] && !$info['timed_out'];
+  $response = '';
+
+  while ($alive) {
+    // Calculate how much time is left of the original timeout value.
+    $timeout = $options['timeout'] - timer_read(__FUNCTION__) / 1000;
+    if ($timeout <= 0) {
+      $info['timed_out'] = TRUE;
+      break;
+    }
+    stream_set_timeout($fp, floor($timeout), floor(1000000 * fmod($timeout, 1)));
+    $chunk = fread($fp, 1024);
+    $response .= $chunk;
+    $info = stream_get_meta_data($fp);
+    $alive = !$info['eof'] && !$info['timed_out'] && $chunk;
+  }
+  fclose($fp);
+
+  if ($info['timed_out']) {
+    $result->code = HTTP_REQUEST_TIMEOUT;
+    $result->error = 'request timed out';
+    return $result;
+  }
+  // Parse response headers from the response body.
+  // Be tolerant of malformed HTTP responses that separate header and body with
+  // \n\n or \r\r instead of \r\n\r\n.
+  list($response, $result->data) = preg_split("/\r\n\r\n|\n\n|\r\r/", $response, 2);
+  $response = preg_split("/\r\n|\n|\r/", $response);
+
+  // Parse the response status line.
+  list($protocol, $code, $status_message) = explode(' ', trim(array_shift($response)), 3);
+  $result->protocol = $protocol;
+  $result->status_message = $status_message;
+
+  $result->headers = array();
+
+  // Parse the response headers.
+  while ($line = trim(array_shift($response))) {
+    list($name, $value) = explode(':', $line, 2);
+    $name = strtolower($name);
+    if (isset($result->headers[$name]) && $name == 'set-cookie') {
+      // RFC 2109: the Set-Cookie response header comprises the token Set-
+      // Cookie:, followed by a comma-separated list of one or more cookies.
+      $result->headers[$name] .= ',' . trim($value);
+    }
+    else {
+      $result->headers[$name] = trim($value);
+    }
+  }
+
+  $responses = array(
+    100 => 'Continue',
+    101 => 'Switching Protocols',
+    200 => 'OK',
+    201 => 'Created',
+    202 => 'Accepted',
+    203 => 'Non-Authoritative Information',
+    204 => 'No Content',
+    205 => 'Reset Content',
+    206 => 'Partial Content',
+    300 => 'Multiple Choices',
+    301 => 'Moved Permanently',
+    302 => 'Found',
+    303 => 'See Other',
+    304 => 'Not Modified',
+    305 => 'Use Proxy',
+    307 => 'Temporary Redirect',
+    400 => 'Bad Request',
+    401 => 'Unauthorized',
+    402 => 'Payment Required',
+    403 => 'Forbidden',
+    404 => 'Not Found',
+    405 => 'Method Not Allowed',
+    406 => 'Not Acceptable',
+    407 => 'Proxy Authentication Required',
+    408 => 'Request Time-out',
+    409 => 'Conflict',
+    410 => 'Gone',
+    411 => 'Length Required',
+    412 => 'Precondition Failed',
+    413 => 'Request Entity Too Large',
+    414 => 'Request-URI Too Large',
+    415 => 'Unsupported Media Type',
+    416 => 'Requested range not satisfiable',
+    417 => 'Expectation Failed',
+    500 => 'Internal Server Error',
+    501 => 'Not Implemented',
+    502 => 'Bad Gateway',
+    503 => 'Service Unavailable',
+    504 => 'Gateway Time-out',
+    505 => 'HTTP Version not supported',
+  );
+  // RFC 2616 states that all unknown HTTP codes must be treated the same as the
+  // base code in their class.
+  if (!isset($responses[$code])) {
+    $code = floor($code / 100) * 100;
+  }
+  $result->code = $code;
+
+  switch ($code) {
+    case 200: // OK
+    case 304: // Not modified
+      break;
+    case 301: // Moved permanently
+    case 302: // Moved temporarily
+    case 307: // Moved temporarily
+      $location = $result->headers['location'];
+      $options['timeout'] -= timer_read(__FUNCTION__) / 1000;
+      if ($options['timeout'] <= 0) {
+        $result->code = HTTP_REQUEST_TIMEOUT;
+        $result->error = 'request timed out';
+      }
+      elseif ($options['max_redirects']) {
+        // Redirect to the new location.
+        $options['max_redirects']--;
+        $result = drupal_http_request($location, $options);
+        $result->redirect_code = $code;
+      }
+      if (!isset($result->redirect_url)) {
+        $result->redirect_url = $location;
+      }
+      break;
+    default:
+      $result->error = $status_message;
+  }
+
+  return $result;
+}
+
+/**
+ * Helper function for determining hosts excluded from needing a proxy.
+ *
+ * @return
+ *   TRUE if a proxy should be used for this host.
+ */
+function _drupal_http_use_proxy($host) {
+  $proxy_exceptions = variable_get('proxy_exceptions', array('localhost', '127.0.0.1'));
+  return !in_array(strtolower($host), $proxy_exceptions, TRUE);
+}
+
+/**
+ * @} End of "HTTP handling".
+ */
+
+/**
+ * Strips slashes from a string or array of strings.
+ *
+ * Callback for array_walk() within fix_gpx_magic().
+ *
+ * @param $item
+ *   An individual string or array of strings from superglobals.
+ */
+function _fix_gpc_magic(&$item) {
+  if (is_array($item)) {
+    array_walk($item, '_fix_gpc_magic');
+  }
+  else {
+    $item = stripslashes($item);
+  }
+}
+
+/**
+ * Strips slashes from $_FILES items.
+ *
+ * Callback for array_walk() within fix_gpc_magic().
+ *
+ * The tmp_name key is skipped keys since PHP generates single backslashes for
+ * file paths on Windows systems.
+ *
+ * @param $item
+ *   An item from $_FILES.
+ * @param $key
+ *   The key for the item within $_FILES.
+ *
+ * @see http://php.net/manual/features.file-upload.php#42280
+ */
+function _fix_gpc_magic_files(&$item, $key) {
+  if ($key != 'tmp_name') {
+    if (is_array($item)) {
+      array_walk($item, '_fix_gpc_magic_files');
+    }
+    else {
+      $item = stripslashes($item);
+    }
+  }
+}
+
+/**
+ * Fixes double-escaping caused by "magic quotes" in some PHP installations.
+ *
+ * @see _fix_gpc_magic()
+ * @see _fix_gpc_magic_files()
+ */
+function fix_gpc_magic() {
+  static $fixed = FALSE;
+  if (!$fixed && ini_get('magic_quotes_gpc')) {
+    array_walk($_GET, '_fix_gpc_magic');
+    array_walk($_POST, '_fix_gpc_magic');
+    array_walk($_COOKIE, '_fix_gpc_magic');
+    array_walk($_REQUEST, '_fix_gpc_magic');
+    array_walk($_FILES, '_fix_gpc_magic_files');
+  }
+  $fixed = TRUE;
+}
+
+/**
+ * @defgroup validation Input validation
+ * @{
+ * Functions to validate user input.
+ */
+
+/**
+ * Verifies the syntax of the given e-mail address.
+ *
+ * This uses the
+ * @link http://php.net/manual/filter.filters.validate.php PHP e-mail validation filter. @endlink
+ *
+ * @param $mail
+ *   A string containing an e-mail address.
+ *
+ * @return
+ *   TRUE if the address is in a valid format.
+ */
+function valid_email_address($mail) {
+  return (bool)filter_var($mail, FILTER_VALIDATE_EMAIL);
+}
+
+/**
+ * Verifies the syntax of the given URL.
+ *
+ * This function should only be used on actual URLs. It should not be used for
+ * Drupal menu paths, which can contain arbitrary characters.
+ * Valid values per RFC 3986.
+ * @param $url
+ *   The URL to verify.
+ * @param $absolute
+ *   Whether the URL is absolute (beginning with a scheme such as "http:").
+ *
+ * @return
+ *   TRUE if the URL is in a valid format.
+ */
+function valid_url($url, $absolute = FALSE) {
+  if ($absolute) {
+    return (bool)preg_match("
+      /^                                                      # Start at the beginning of the text
+      (?:ftp|https?|feed):\/\/                                # Look for ftp, http, https or feed schemes
+      (?:                                                     # Userinfo (optional) which is typically
+        (?:(?:[\w\.\-\+!$&'\(\)*\+,;=]|%[0-9a-f]{2})+:)*      # a username or a username and password
+        (?:[\w\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})+@          # combination
+      )?
+      (?:
+        (?:[a-z0-9\-\.]|%[0-9a-f]{2})+                        # A domain name or a IPv4 address
+        |(?:\[(?:[0-9a-f]{0,4}:)*(?:[0-9a-f]{0,4})\])         # or a well formed IPv6 address
+      )
+      (?::[0-9]+)?                                            # Server port number (optional)
+      (?:[\/|\?]
+        (?:[\w#!:\.\?\+=&@$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})   # The path and query (optional)
+      *)?
+    $/xi", $url);
+  }
+  else {
+    return (bool)preg_match("/^(?:[\w#!:\.\?\+=&@$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})+$/i", $url);
+  }
+}
+
+/**
+ * @} End of "defgroup validation".
+ */
+
+/**
+ * Registers an event for the current visitor to the flood control mechanism.
+ *
+ * @param $name
+ *   The name of an event.
+ * @param $window
+ *   Optional number of seconds before this event expires. Defaults to 3600 (1
+ *   hour). Typically uses the same value as the flood_is_allowed() $window
+ *   parameter. Expired events are purged on cron run to prevent the flood table
+ *   from growing indefinitely.
+ * @param $identifier
+ *   Optional identifier (defaults to the current user's IP address).
+ */
+function flood_register_event($name, $window = 3600, $identifier = NULL) {
+  if (!isset($identifier)) {
+    $identifier = ip_address();
+  }
+  db_insert('flood')
+    ->fields(array(
+      'event' => $name,
+      'identifier' => $identifier,
+      'timestamp' => REQUEST_TIME,
+      'expiration' => REQUEST_TIME + $window,
+    ))
+    ->execute();
+}
+
+/**
+ * Makes the flood control mechanism forget an event for the current visitor.
+ *
+ * @param $name
+ *   The name of an event.
+ * @param $identifier
+ *   Optional identifier (defaults to the current user's IP address).
+ */
+function flood_clear_event($name, $identifier = NULL) {
+  if (!isset($identifier)) {
+    $identifier = ip_address();
+  }
+  db_delete('flood')
+    ->condition('event', $name)
+    ->condition('identifier', $identifier)
+    ->execute();
+}
+
+/**
+ * Checks whether a user is allowed to proceed with the specified event.
+ *
+ * Events can have thresholds saying that each user can only do that event
+ * a certain number of times in a time window. This function verifies that the
+ * current user has not exceeded this threshold.
+ *
+ * @param $name
+ *   The unique name of the event.
+ * @param $threshold
+ *   The maximum number of times each user can do this event per time window.
+ * @param $window
+ *   Number of seconds in the time window for this event (default is 3600
+ *   seconds, or 1 hour).
+ * @param $identifier
+ *   Unique identifier of the current user. Defaults to their IP address.
+ *
+ * @return
+ *   TRUE if the user is allowed to proceed. FALSE if they have exceeded the
+ *   threshold and should not be allowed to proceed.
+ */
+function flood_is_allowed($name, $threshold, $window = 3600, $identifier = NULL) {
+  if (!isset($identifier)) {
+    $identifier = ip_address();
+  }
+  $number = db_query("SELECT COUNT(*) FROM {flood} WHERE event = :event AND identifier = :identifier AND timestamp > :timestamp", array(
+    ':event' => $name,
+    ':identifier' => $identifier,
+    ':timestamp' => REQUEST_TIME - $window))
+    ->fetchField();
+  return ($number < $threshold);
+}
+
+/**
+ * @defgroup sanitization Sanitization functions
+ * @{
+ * Functions to sanitize values.
+ *
+ * See http://drupal.org/writing-secure-code for information
+ * on writing secure code.
+ */
+
+/**
+ * Strips dangerous protocols (e.g. 'javascript:') from a URI.
+ *
+ * This function must be called for all URIs within user-entered input prior
+ * to being output to an HTML attribute value. It is often called as part of
+ * check_url() or filter_xss(), but those functions return an HTML-encoded
+ * string, so this function can be called independently when the output needs to
+ * be a plain-text string for passing to t(), l(), drupal_attributes(), or
+ * another function that will call check_plain() separately.
+ *
+ * @param $uri
+ *   A plain-text URI that might contain dangerous protocols.
+ *
+ * @return
+ *   A plain-text URI stripped of dangerous protocols. As with all plain-text
+ *   strings, this return value must not be output to an HTML page without
+ *   check_plain() being called on it. However, it can be passed to functions
+ *   expecting plain-text strings.
+ *
+ * @see check_url()
+ */
+function drupal_strip_dangerous_protocols($uri) {
+  static $allowed_protocols;
+
+  if (!isset($allowed_protocols)) {
+    $allowed_protocols = array_flip(variable_get('filter_allowed_protocols', array('ftp', 'http', 'https', 'irc', 'mailto', 'news', 'nntp', 'rtsp', 'sftp', 'ssh', 'tel', 'telnet', 'webcal')));
+  }
+
+  // Iteratively remove any invalid protocol found.
+  do {
+    $before = $uri;
+    $colonpos = strpos($uri, ':');
+    if ($colonpos > 0) {
+      // We found a colon, possibly a protocol. Verify.
+      $protocol = substr($uri, 0, $colonpos);
+      // If a colon is preceded by a slash, question mark or hash, it cannot
+      // possibly be part of the URL scheme. This must be a relative URL, which
+      // inherits the (safe) protocol of the base document.
+      if (preg_match('![/?#]!', $protocol)) {
+        break;
+      }
+      // Check if this is a disallowed protocol. Per RFC2616, section 3.2.3
+      // (URI Comparison) scheme comparison must be case-insensitive.
+      if (!isset($allowed_protocols[strtolower($protocol)])) {
+        $uri = substr($uri, $colonpos + 1);
+      }
+    }
+  } while ($before != $uri);
+
+  return $uri;
+}
+
+/**
+ * Strips dangerous protocols from a URI and encodes it for output to HTML.
+ *
+ * @param $uri
+ *   A plain-text URI that might contain dangerous protocols.
+ *
+ * @return
+ *   A URI stripped of dangerous protocols and encoded for output to an HTML
+ *   attribute value. Because it is already encoded, it should not be set as a
+ *   value within a $attributes array passed to drupal_attributes(), because
+ *   drupal_attributes() expects those values to be plain-text strings. To pass
+ *   a filtered URI to drupal_attributes(), call
+ *   drupal_strip_dangerous_protocols() instead.
+ *
+ * @see drupal_strip_dangerous_protocols()
+ */
+function check_url($uri) {
+  return check_plain(drupal_strip_dangerous_protocols($uri));
+}
+
+/**
+ * Applies a very permissive XSS/HTML filter for admin-only use.
+ *
+ * Use only for fields where it is impractical to use the
+ * whole filter system, but where some (mainly inline) mark-up
+ * is desired (so check_plain() is not acceptable).
+ *
+ * Allows all tags that can be used inside an HTML body, save
+ * for scripts and styles.
+ */
+function filter_xss_admin($string) {
+  return filter_xss($string, array('a', 'abbr', 'acronym', 'address', 'article', 'aside', 'b', 'bdi', 'bdo', 'big', 'blockquote', 'br', 'caption', 'cite', 'code', 'col', 'colgroup', 'command', 'dd', 'del', 'details', 'dfn', 'div', 'dl', 'dt', 'em', 'figcaption', 'figure', 'footer', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hgroup', 'hr', 'i', 'img', 'ins', 'kbd', 'li', 'mark', 'menu', 'meter', 'nav', 'ol', 'output', 'p', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'small', 'span', 'strong', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'time', 'tr', 'tt', 'u', 'ul', 'var', 'wbr'));
+}
+
+/**
+ * Filters HTML to prevent cross-site-scripting (XSS) vulnerabilities.
+ *
+ * Based on kses by Ulf Harnhammar, see http://sourceforge.net/projects/kses.
+ * For examples of various XSS attacks, see: http://ha.ckers.org/xss.html.
+ *
+ * This code does four things:
+ * - Removes characters and constructs that can trick browsers.
+ * - Makes sure all HTML entities are well-formed.
+ * - Makes sure all HTML tags and attributes are well-formed.
+ * - Makes sure no HTML tags contain URLs with a disallowed protocol (e.g.
+ *   javascript:).
+ *
+ * @param $string
+ *   The string with raw HTML in it. It will be stripped of everything that can
+ *   cause an XSS attack.
+ * @param $allowed_tags
+ *   An array of allowed tags.
+ *
+ * @return
+ *   An XSS safe version of $string, or an empty string if $string is not
+ *   valid UTF-8.
+ *
+ * @see drupal_validate_utf8()
+ * @ingroup sanitization
+ */
+function filter_xss($string, $allowed_tags = array('a', 'em', 'strong', 'cite', 'blockquote', 'code', 'ul', 'ol', 'li', 'dl', 'dt', 'dd')) {
+  // Only operate on valid UTF-8 strings. This is necessary to prevent cross
+  // site scripting issues on Internet Explorer 6.
+  if (!drupal_validate_utf8($string)) {
+    return '';
+  }
+  // Store the text format.
+  _filter_xss_split($allowed_tags, TRUE);
+  // Remove NULL characters (ignored by some browsers).
+  $string = str_replace(chr(0), '', $string);
+  // Remove Netscape 4 JS entities.
+  $string = preg_replace('%&\s*\{[^}]*(\}\s*;?|$)%', '', $string);
+
+  // Defuse all HTML entities.
+  $string = str_replace('&', '&amp;', $string);
+  // Change back only well-formed entities in our whitelist:
+  // Decimal numeric entities.
+  $string = preg_replace('/&amp;#([0-9]+;)/', '&#\1', $string);
+  // Hexadecimal numeric entities.
+  $string = preg_replace('/&amp;#[Xx]0*((?:[0-9A-Fa-f]{2})+;)/', '&#x\1', $string);
+  // Named entities.
+  $string = preg_replace('/&amp;([A-Za-z][A-Za-z0-9]*;)/', '&\1', $string);
+
+  return preg_replace_callback('%
+    (
+    <(?=[^a-zA-Z!/])  # a lone <
+    |                 # or
+    <!--.*?-->        # a comment
+    |                 # or
+    <[^>]*(>|$)       # a string that starts with a <, up until the > or the end of the string
+    |                 # or
+    >                 # just a >
+    )%x', '_filter_xss_split', $string);
+}
+
+/**
+ * Processes an HTML tag.
+ *
+ * @param $m
+ *   An array with various meaning depending on the value of $store.
+ *   If $store is TRUE then the array contains the allowed tags.
+ *   If $store is FALSE then the array has one element, the HTML tag to process.
+ * @param $store
+ *   Whether to store $m.
+ *
+ * @return
+ *   If the element isn't allowed, an empty string. Otherwise, the cleaned up
+ *   version of the HTML element.
+ */
+function _filter_xss_split($m, $store = FALSE) {
+  static $allowed_html;
+
+  if ($store) {
+    $allowed_html = array_flip($m);
+    return;
+  }
+
+  $string = $m[1];
+
+  if (substr($string, 0, 1) != '<') {
+    // We matched a lone ">" character.
+    return '&gt;';
+  }
+  elseif (strlen($string) == 1) {
+    // We matched a lone "<" character.
+    return '&lt;';
+  }
+
+  if (!preg_match('%^<\s*(/\s*)?([a-zA-Z0-9]+)([^>]*)>?|(<!--.*?-->)$%', $string, $matches)) {
+    // Seriously malformed.
+    return '';
+  }
+
+  $slash = trim($matches[1]);
+  $elem = &$matches[2];
+  $attrlist = &$matches[3];
+  $comment = &$matches[4];
+
+  if ($comment) {
+    $elem = '!--';
+  }
+
+  if (!isset($allowed_html[strtolower($elem)])) {
+    // Disallowed HTML element.
+    return '';
+  }
+
+  if ($comment) {
+    return $comment;
+  }
+
+  if ($slash != '') {
+    return "</$elem>";
+  }
+
+  // Is there a closing XHTML slash at the end of the attributes?
+  $attrlist = preg_replace('%(\s?)/\s*$%', '\1', $attrlist, -1, $count);
+  $xhtml_slash = $count ? ' /' : '';
+
+  // Clean up attributes.
+  $attr2 = implode(' ', _filter_xss_attributes($attrlist));
+  $attr2 = preg_replace('/[<>]/', '', $attr2);
+  $attr2 = strlen($attr2) ? ' ' . $attr2 : '';
+
+  return "<$elem$attr2$xhtml_slash>";
+}
+
+/**
+ * Processes a string of HTML attributes.
+ *
+ * @return
+ *   Cleaned up version of the HTML attributes.
+ */
+function _filter_xss_attributes($attr) {
+  $attrarr = array();
+  $mode = 0;
+  $attrname = '';
+
+  while (strlen($attr) != 0) {
+    // Was the last operation successful?
+    $working = 0;
+
+    switch ($mode) {
+      case 0:
+        // Attribute name, href for instance.
+        if (preg_match('/^([-a-zA-Z]+)/', $attr, $match)) {
+          $attrname = strtolower($match[1]);
+          $skip = ($attrname == 'style' || substr($attrname, 0, 2) == 'on');
+          $working = $mode = 1;
+          $attr = preg_replace('/^[-a-zA-Z]+/', '', $attr);
+        }
+        break;
+
+      case 1:
+        // Equals sign or valueless ("selected").
+        if (preg_match('/^\s*=\s*/', $attr)) {
+          $working = 1; $mode = 2;
+          $attr = preg_replace('/^\s*=\s*/', '', $attr);
+          break;
+        }
+
+        if (preg_match('/^\s+/', $attr)) {
+          $working = 1; $mode = 0;
+          if (!$skip) {
+            $attrarr[] = $attrname;
+          }
+          $attr = preg_replace('/^\s+/', '', $attr);
+        }
+        break;
+
+      case 2:
+        // Attribute value, a URL after href= for instance.
+        if (preg_match('/^"([^"]*)"(\s+|$)/', $attr, $match)) {
+          $thisval = filter_xss_bad_protocol($match[1]);
+
+          if (!$skip) {
+            $attrarr[] = "$attrname=\"$thisval\"";
+          }
+          $working = 1;
+          $mode = 0;
+          $attr = preg_replace('/^"[^"]*"(\s+|$)/', '', $attr);
+          break;
+        }
+
+        if (preg_match("/^'([^']*)'(\s+|$)/", $attr, $match)) {
+          $thisval = filter_xss_bad_protocol($match[1]);
+
+          if (!$skip) {
+            $attrarr[] = "$attrname='$thisval'";
+          }
+          $working = 1; $mode = 0;
+          $attr = preg_replace("/^'[^']*'(\s+|$)/", '', $attr);
+          break;
+        }
+
+        if (preg_match("%^([^\s\"']+)(\s+|$)%", $attr, $match)) {
+          $thisval = filter_xss_bad_protocol($match[1]);
+
+          if (!$skip) {
+            $attrarr[] = "$attrname=\"$thisval\"";
+          }
+          $working = 1; $mode = 0;
+          $attr = preg_replace("%^[^\s\"']+(\s+|$)%", '', $attr);
+        }
+        break;
+    }
+
+    if ($working == 0) {
+      // Not well formed; remove and try again.
+      $attr = preg_replace('/
+        ^
+        (
+        "[^"]*("|$)     # - a string that starts with a double quote, up until the next double quote or the end of the string
+        |               # or
+        \'[^\']*(\'|$)| # - a string that starts with a quote, up until the next quote or the end of the string
+        |               # or
+        \S              # - a non-whitespace character
+        )*              # any number of the above three
+        \s*             # any number of whitespaces
+        /x', '', $attr);
+      $mode = 0;
+    }
+  }
+
+  // The attribute list ends with a valueless attribute like "selected".
+  if ($mode == 1 && !$skip) {
+    $attrarr[] = $attrname;
+  }
+  return $attrarr;
+}
+
+/**
+ * Processes an HTML attribute value and strips dangerous protocols from URLs.
+ *
+ * @param $string
+ *   The string with the attribute value.
+ * @param $decode
+ *   (deprecated) Whether to decode entities in the $string. Set to FALSE if the
+ *   $string is in plain text, TRUE otherwise. Defaults to TRUE. This parameter
+ *   is deprecated and will be removed in Drupal 8. To process a plain-text URI,
+ *   call drupal_strip_dangerous_protocols() or check_url() instead.
+ *
+ * @return
+ *   Cleaned up and HTML-escaped version of $string.
+ */
+function filter_xss_bad_protocol($string, $decode = TRUE) {
+  // Get the plain text representation of the attribute value (i.e. its meaning).
+  // @todo Remove the $decode parameter in Drupal 8, and always assume an HTML
+  //   string that needs decoding.
+  if ($decode) {
+    if (!function_exists('decode_entities')) {
+      require_once DRUPAL_ROOT . '/includes/unicode.inc';
+    }
+
+    $string = decode_entities($string);
+  }
+  return check_plain(drupal_strip_dangerous_protocols($string));
+}
+
+/**
+ * @} End of "defgroup sanitization".
+ */
+
+/**
+ * @defgroup format Formatting
+ * @{
+ * Functions to format numbers, strings, dates, etc.
+ */
+
+/**
+ * Formats an RSS channel.
+ *
+ * Arbitrary elements may be added using the $args associative array.
+ */
+function format_rss_channel($title, $link, $description, $items, $langcode = NULL, $args = array()) {
+  global $language_content;
+  $langcode = $langcode ? $langcode : $language_content->language;
+
+  $output = "<channel>\n";
+  $output .= ' <title>' . check_plain($title) . "</title>\n";
+  $output .= ' <link>' . check_url($link) . "</link>\n";
+
+  // The RSS 2.0 "spec" doesn't indicate HTML can be used in the description.
+  // We strip all HTML tags, but need to prevent double encoding from properly
+  // escaped source data (such as &amp becoming &amp;amp;).
+  $output .= ' <description>' . check_plain(decode_entities(strip_tags($description))) . "</description>\n";
+  $output .= ' <language>' . check_plain($langcode) . "</language>\n";
+  $output .= format_xml_elements($args);
+  $output .= $items;
+  $output .= "</channel>\n";
+
+  return $output;
+}
+
+/**
+ * Formats a single RSS item.
+ *
+ * Arbitrary elements may be added using the $args associative array.
+ */
+function format_rss_item($title, $link, $description, $args = array()) {
+  $output = "<item>\n";
+  $output .= ' <title>' . check_plain($title) . "</title>\n";
+  $output .= ' <link>' . check_url($link) . "</link>\n";
+  $output .= ' <description>' . check_plain($description) . "</description>\n";
+  $output .= format_xml_elements($args);
+  $output .= "</item>\n";
+
+  return $output;
+}
+
+/**
+ * Formats XML elements.
+ *
+ * @param $array
+ *   An array where each item represents an element and is either a:
+ *   - (key => value) pair (<key>value</key>)
+ *   - Associative array with fields:
+ *     - 'key': element name
+ *     - 'value': element contents
+ *     - 'attributes': associative array of element attributes
+ *
+ * In both cases, 'value' can be a simple string, or it can be another array
+ * with the same format as $array itself for nesting.
+ */
+function format_xml_elements($array) {
+  $output = '';
+  foreach ($array as $key => $value) {
+    if (is_numeric($key)) {
+      if ($value['key']) {
+        $output .= ' <' . $value['key'];
+        if (isset($value['attributes']) && is_array($value['attributes'])) {
+          $output .= drupal_attributes($value['attributes']);
+        }
+
+        if (isset($value['value']) && $value['value'] != '') {
+          $output .= '>' . (is_array($value['value']) ? format_xml_elements($value['value']) : check_plain($value['value'])) . '</' . $value['key'] . ">\n";
+        }
+        else {
+          $output .= " />\n";
+        }
+      }
+    }
+    else {
+      $output .= ' <' . $key . '>' . (is_array($value) ? format_xml_elements($value) : check_plain($value)) . "</$key>\n";
+    }
+  }
+  return $output;
+}
+
+/**
+ * Formats a string containing a count of items.
+ *
+ * This function ensures that the string is pluralized correctly. Since t() is
+ * called by this function, make sure not to pass already-localized strings to
+ * it.
+ *
+ * For example:
+ * @code
+ *   $output = format_plural($node->comment_count, '1 comment', '@count comments');
+ * @endcode
+ *
+ * Example with additional replacements:
+ * @code
+ *   $output = format_plural($update_count,
+ *     'Changed the content type of 1 post from %old-type to %new-type.',
+ *     'Changed the content type of @count posts from %old-type to %new-type.',
+ *     array('%old-type' => $info->old_type, '%new-type' => $info->new_type));
+ * @endcode
+ *
+ * @param $count
+ *   The item count to display.
+ * @param $singular
+ *   The string for the singular case. Make sure it is clear this is singular,
+ *   to ease translation (e.g. use "1 new comment" instead of "1 new"). Do not
+ *   use @count in the singular string.
+ * @param $plural
+ *   The string for the plural case. Make sure it is clear this is plural, to
+ *   ease translation. Use @count in place of the item count, as in
+ *   "@count new comments".
+ * @param $args
+ *   An associative array of replacements to make after translation. Instances
+ *   of any key in this array are replaced with the corresponding value.
+ *   Based on the first character of the key, the value is escaped and/or
+ *   themed. See format_string(). Note that you do not need to include @count
+ *   in this array; this replacement is done automatically for the plural case.
+ * @param $options
+ *   An associative array of additional options. See t() for allowed keys.
+ *
+ * @return
+ *   A translated string.
+ *
+ * @see t()
+ * @see format_string()
+ */
+function format_plural($count, $singular, $plural, array $args = array(), array $options = array()) {
+  $args['@count'] = $count;
+  if ($count == 1) {
+    return t($singular, $args, $options);
+  }
+
+  // Get the plural index through the gettext formula.
+  $index = (function_exists('locale_get_plural')) ? locale_get_plural($count, isset($options['langcode']) ? $options['langcode'] : NULL) : -1;
+  // If the index cannot be computed, use the plural as a fallback (which
+  // allows for most flexiblity with the replaceable @count value).
+  if ($index < 0) {
+    return t($plural, $args, $options);
+  }
+  else {
+    switch ($index) {
+      case "0":
+        return t($singular, $args, $options);
+      case "1":
+        return t($plural, $args, $options);
+      default:
+        unset($args['@count']);
+        $args['@count[' . $index . ']'] = $count;
+        return t(strtr($plural, array('@count' => '@count[' . $index . ']')), $args, $options);
+    }
+  }
+}
+
+/**
+ * Parses a given byte count.
+ *
+ * @param $size
+ *   A size expressed as a number of bytes with optional SI or IEC binary unit
+ *   prefix (e.g. 2, 3K, 5MB, 10G, 6GiB, 8 bytes, 9mbytes).
+ *
+ * @return
+ *   An integer representation of the size in bytes.
+ */
+function parse_size($size) {
+  $unit = preg_replace('/[^bkmgtpezy]/i', '', $size); // Remove the non-unit characters from the size.
+  $size = preg_replace('/[^0-9\.]/', '', $size); // Remove the non-numeric characters from the size.
+  if ($unit) {
+    // Find the position of the unit in the ordered string which is the power of magnitude to multiply a kilobyte by.
+    return round($size * pow(DRUPAL_KILOBYTE, stripos('bkmgtpezy', $unit[0])));
+  }
+  else {
+    return round($size);
+  }
+}
+
+/**
+ * Generates a string representation for the given byte count.
+ *
+ * @param $size
+ *   A size in bytes.
+ * @param $langcode
+ *   Optional language code to translate to a language other than what is used
+ *   to display the page.
+ *
+ * @return
+ *   A translated string representation of the size.
+ */
+function format_size($size, $langcode = NULL) {
+  if ($size < DRUPAL_KILOBYTE) {
+    return format_plural($size, '1 byte', '@count bytes', array(), array('langcode' => $langcode));
+  }
+  else {
+    $size = $size / DRUPAL_KILOBYTE; // Convert bytes to kilobytes.
+    $units = array(
+      t('@size KB', array(), array('langcode' => $langcode)),
+      t('@size MB', array(), array('langcode' => $langcode)),
+      t('@size GB', array(), array('langcode' => $langcode)),
+      t('@size TB', array(), array('langcode' => $langcode)),
+      t('@size PB', array(), array('langcode' => $langcode)),
+      t('@size EB', array(), array('langcode' => $langcode)),
+      t('@size ZB', array(), array('langcode' => $langcode)),
+      t('@size YB', array(), array('langcode' => $langcode)),
+    );
+    foreach ($units as $unit) {
+      if (round($size, 2) >= DRUPAL_KILOBYTE) {
+        $size = $size / DRUPAL_KILOBYTE;
+      }
+      else {
+        break;
+      }
+    }
+    return str_replace('@size', round($size, 2), $unit);
+  }
+}
+
+/**
+ * Formats a time interval with the requested granularity.
+ *
+ * @param $interval
+ *   The length of the interval in seconds.
+ * @param $granularity
+ *   How many different units to display in the string.
+ * @param $langcode
+ *   Optional language code to translate to a language other than
+ *   what is used to display the page.
+ *
+ * @return
+ *   A translated string representation of the interval.
+ */
+function format_interval($interval, $granularity = 2, $langcode = NULL) {
+  $units = array(
+    '1 year|@count years' => 31536000,
+    '1 month|@count months' => 2592000,
+    '1 week|@count weeks' => 604800,
+    '1 day|@count days' => 86400,
+    '1 hour|@count hours' => 3600,
+    '1 min|@count min' => 60,
+    '1 sec|@count sec' => 1
+  );
+  $output = '';
+  foreach ($units as $key => $value) {
+    $key = explode('|', $key);
+    if ($interval >= $value) {
+      $output .= ($output ? ' ' : '') . format_plural(floor($interval / $value), $key[0], $key[1], array(), array('langcode' => $langcode));
+      $interval %= $value;
+      $granularity--;
+    }
+
+    if ($granularity == 0) {
+      break;
+    }
+  }
+  return $output ? $output : t('0 sec', array(), array('langcode' => $langcode));
+}
+
+/**
+ * Formats a date, using a date type or a custom date format string.
+ *
+ * @param $timestamp
+ *   A UNIX timestamp to format.
+ * @param $type
+ *   (optional) The format to use, one of:
+ *   - 'short', 'medium', or 'long' (the corresponding built-in date formats).
+ *   - The name of a date type defined by a module in hook_date_format_types(),
+ *     if it's been assigned a format.
+ *   - The machine name of an administrator-defined date format.
+ *   - 'custom', to use $format.
+ *   Defaults to 'medium'.
+ * @param $format
+ *   (optional) If $type is 'custom', a PHP date format string suitable for
+ *   input to date(). Use a backslash to escape ordinary text, so it does not
+ *   get interpreted as date format characters.
+ * @param $timezone
+ *   (optional) Time zone identifier, as described at
+ *   http://php.net/manual/timezones.php Defaults to the time zone used to
+ *   display the page.
+ * @param $langcode
+ *   (optional) Language code to translate to. Defaults to the language used to
+ *   display the page.
+ *
+ * @return
+ *   A translated date string in the requested format.
+ */
+function format_date($timestamp, $type = 'medium', $format = '', $timezone = NULL, $langcode = NULL) {
+  // Use the advanced drupal_static() pattern, since this is called very often.
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['timezones'] = &drupal_static(__FUNCTION__);
+  }
+  $timezones = &$drupal_static_fast['timezones'];
+
+  if (!isset($timezone)) {
+    $timezone = date_default_timezone_get();
+  }
+  // Store DateTimeZone objects in an array rather than repeatedly
+  // constructing identical objects over the life of a request.
+  if (!isset($timezones[$timezone])) {
+    $timezones[$timezone] = timezone_open($timezone);
+  }
+
+  // Use the default langcode if none is set.
+  global $language;
+  if (empty($langcode)) {
+    $langcode = isset($language->language) ? $language->language : 'en';
+  }
+
+  switch ($type) {
+    case 'short':
+      $format = variable_get('date_format_short', 'm/d/Y - H:i');
+      break;
+
+    case 'long':
+      $format = variable_get('date_format_long', 'l, F j, Y - H:i');
+      break;
+
+    case 'custom':
+      // No change to format.
+      break;
+
+    case 'medium':
+    default:
+      // Retrieve the format of the custom $type passed.
+      if ($type != 'medium') {
+        $format = variable_get('date_format_' . $type, '');
+      }
+      // Fall back to 'medium'.
+      if ($format === '') {
+        $format = variable_get('date_format_medium', 'D, m/d/Y - H:i');
+      }
+      break;
+  }
+
+  // Create a DateTime object from the timestamp.
+  $date_time = date_create('@' . $timestamp);
+  // Set the time zone for the DateTime object.
+  date_timezone_set($date_time, $timezones[$timezone]);
+
+  // Encode markers that should be translated. 'A' becomes '\xEF\AA\xFF'.
+  // xEF and xFF are invalid UTF-8 sequences, and we assume they are not in the
+  // input string.
+  // Paired backslashes are isolated to prevent errors in read-ahead evaluation.
+  // The read-ahead expression ensures that A matches, but not \A.
+  $format = preg_replace(array('/\\\\\\\\/', '/(?<!\\\\)([AaeDlMTF])/'), array("\xEF\\\\\\\\\xFF", "\xEF\\\\\$1\$1\xFF"), $format);
+
+  // Call date_format().
+  $format = date_format($date_time, $format);
+
+  // Pass the langcode to _format_date_callback().
+  _format_date_callback(NULL, $langcode);
+
+  // Translate the marked sequences.
+  return preg_replace_callback('/\xEF([AaeDlMTF]?)(.*?)\xFF/', '_format_date_callback', $format);
+}
+
+/**
+ * Returns an ISO8601 formatted date based on the given date.
+ *
+ * Callback for use within hook_rdf_mapping() implementations.
+ *
+ * @param $date
+ *   A UNIX timestamp.
+ *
+ * @return string
+ *   An ISO8601 formatted date.
+ */
+function date_iso8601($date) {
+  // The DATE_ISO8601 constant cannot be used here because it does not match
+  // date('c') and produces invalid RDF markup.
+  return date('c', $date);
+}
+
+/**
+ * Translates a formatted date string.
+ *
+ * Callback for preg_replace_callback() within format_date().
+ */
+function _format_date_callback(array $matches = NULL, $new_langcode = NULL) {
+  // We cache translations to avoid redundant and rather costly calls to t().
+  static $cache, $langcode;
+
+  if (!isset($matches)) {
+    $langcode = $new_langcode;
+    return;
+  }
+
+  $code = $matches[1];
+  $string = $matches[2];
+
+  if (!isset($cache[$langcode][$code][$string])) {
+    $options = array(
+      'langcode' => $langcode,
+    );
+
+    if ($code == 'F') {
+      $options['context'] = 'Long month name';
+    }
+
+    if ($code == '') {
+      $cache[$langcode][$code][$string] = $string;
+    }
+    else {
+      $cache[$langcode][$code][$string] = t($string, array(), $options);
+    }
+  }
+  return $cache[$langcode][$code][$string];
+}
+
+/**
+ * Format a username.
+ *
+ * This is also the label callback implementation of
+ * callback_entity_info_label() for user_entity_info().
+ *
+ * By default, the passed-in object's 'name' property is used if it exists, or
+ * else, the site-defined value for the 'anonymous' variable. However, a module
+ * may override this by implementing hook_username_alter(&$name, $account).
+ *
+ * @see hook_username_alter()
+ *
+ * @param $account
+ *   The account object for the user whose name is to be formatted.
+ *
+ * @return
+ *   An unsanitized string with the username to display. The code receiving
+ *   this result must ensure that check_plain() is called on it before it is
+ *   printed to the page.
+ */
+function format_username($account) {
+  $name = !empty($account->name) ? $account->name : variable_get('anonymous', t('Anonymous'));
+  drupal_alter('username', $name, $account);
+  return $name;
+}
+
+/**
+ * @} End of "defgroup format".
+ */
+
+/**
+ * Generates an internal or external URL.
+ *
+ * When creating links in modules, consider whether l() could be a better
+ * alternative than url().
+ *
+ * @param $path
+ *   (optional) The internal path or external URL being linked to, such as
+ *   "node/34" or "http://example.com/foo". The default value is equivalent to
+ *   passing in '<front>'. A few notes:
+ *   - If you provide a full URL, it will be considered an external URL.
+ *   - If you provide only the path (e.g. "node/34"), it will be
+ *     considered an internal link. In this case, it should be a system URL,
+ *     and it will be replaced with the alias, if one exists. Additional query
+ *     arguments for internal paths must be supplied in $options['query'], not
+ *     included in $path.
+ *   - If you provide an internal path and $options['alias'] is set to TRUE, the
+ *     path is assumed already to be the correct path alias, and the alias is
+ *     not looked up.
+ *   - The special string '<front>' generates a link to the site's base URL.
+ *   - If your external URL contains a query (e.g. http://example.com/foo?a=b),
+ *     then you can either URL encode the query keys and values yourself and
+ *     include them in $path, or use $options['query'] to let this function
+ *     URL encode them.
+ * @param $options
+ *   (optional) An associative array of additional options, with the following
+ *   elements:
+ *   - 'query': An array of query key/value-pairs (without any URL-encoding) to
+ *     append to the URL.
+ *   - 'fragment': A fragment identifier (named anchor) to append to the URL.
+ *     Do not include the leading '#' character.
+ *   - 'absolute': Defaults to FALSE. Whether to force the output to be an
+ *     absolute link (beginning with http:). Useful for links that will be
+ *     displayed outside the site, such as in an RSS feed.
+ *   - 'alias': Defaults to FALSE. Whether the given path is a URL alias
+ *     already.
+ *   - 'external': Whether the given path is an external URL.
+ *   - 'language': An optional language object. If the path being linked to is
+ *     internal to the site, $options['language'] is used to look up the alias
+ *     for the URL. If $options['language'] is omitted, the global $language_url
+ *     will be used.
+ *   - 'https': Whether this URL should point to a secure location. If not
+ *     defined, the current scheme is used, so the user stays on HTTP or HTTPS
+ *     respectively. TRUE enforces HTTPS and FALSE enforces HTTP, but HTTPS can
+ *     only be enforced when the variable 'https' is set to TRUE.
+ *   - 'base_url': Only used internally, to modify the base URL when a language
+ *     dependent URL requires so.
+ *   - 'prefix': Only used internally, to modify the path when a language
+ *     dependent URL requires so.
+ *   - 'script': The script filename in Drupal's root directory to use when
+ *     clean URLs are disabled, such as 'index.php'. Defaults to an empty
+ *     string, as most modern web servers automatically find 'index.php'. If
+ *     clean URLs are disabled, the value of $path is appended as query
+ *     parameter 'q' to $options['script'] in the returned URL. When deploying
+ *     Drupal on a web server that cannot be configured to automatically find
+ *     index.php, then hook_url_outbound_alter() can be implemented to force
+ *     this value to 'index.php'.
+ *   - 'entity_type': The entity type of the object that called url(). Only
+ *     set if url() is invoked by entity_uri().
+ *   - 'entity': The entity object (such as a node) for which the URL is being
+ *     generated. Only set if url() is invoked by entity_uri().
+ *
+ * @return
+ *   A string containing a URL to the given path.
+ */
+function url($path = NULL, array $options = array()) {
+  // Merge in defaults.
+  $options += array(
+    'fragment' => '',
+    'query' => array(),
+    'absolute' => FALSE,
+    'alias' => FALSE,
+    'prefix' => ''
+  );
+
+  if (!isset($options['external'])) {
+    // Return an external link if $path contains an allowed absolute URL. Only
+    // call the slow drupal_strip_dangerous_protocols() if $path contains a ':'
+    // before any / ? or #. Note: we could use url_is_external($path) here, but
+    // that would require another function call, and performance inside url() is
+    // critical.
+    $colonpos = strpos($path, ':');
+    $options['external'] = ($colonpos !== FALSE && !preg_match('![/?#]!', substr($path, 0, $colonpos)) && drupal_strip_dangerous_protocols($path) == $path);
+  }
+
+  // Preserve the original path before altering or aliasing.
+  $original_path = $path;
+
+  // Allow other modules to alter the outbound URL and options.
+  drupal_alter('url_outbound', $path, $options, $original_path);
+
+  if (isset($options['fragment']) && $options['fragment'] !== '') {
+    $options['fragment'] = '#' . $options['fragment'];
+  }
+
+  if ($options['external']) {
+    // Split off the fragment.
+    if (strpos($path, '#') !== FALSE) {
+      list($path, $old_fragment) = explode('#', $path, 2);
+      // If $options contains no fragment, take it over from the path.
+      if (isset($old_fragment) && !$options['fragment']) {
+        $options['fragment'] = '#' . $old_fragment;
+      }
+    }
+    // Append the query.
+    if ($options['query']) {
+      $path .= (strpos($path, '?') !== FALSE ? '&' : '?') . drupal_http_build_query($options['query']);
+    }
+    if (isset($options['https']) && variable_get('https', FALSE)) {
+      if ($options['https'] === TRUE) {
+        $path = str_replace('http://', 'https://', $path);
+      }
+      elseif ($options['https'] === FALSE) {
+        $path = str_replace('https://', 'http://', $path);
+      }
+    }
+    // Reassemble.
+    return $path . $options['fragment'];
+  }
+
+  global $base_url, $base_secure_url, $base_insecure_url;
+
+  // The base_url might be rewritten from the language rewrite in domain mode.
+  if (!isset($options['base_url'])) {
+    if (isset($options['https']) && variable_get('https', FALSE)) {
+      if ($options['https'] === TRUE) {
+        $options['base_url'] = $base_secure_url;
+        $options['absolute'] = TRUE;
+      }
+      elseif ($options['https'] === FALSE) {
+        $options['base_url'] = $base_insecure_url;
+        $options['absolute'] = TRUE;
+      }
+    }
+    else {
+      $options['base_url'] = $base_url;
+    }
+  }
+
+  // The special path '<front>' links to the default front page.
+  if ($path == '<front>') {
+    $path = '';
+  }
+  elseif (!empty($path) && !$options['alias']) {
+    $language = isset($options['language']) && isset($options['language']->language) ? $options['language']->language : '';
+    $alias = drupal_get_path_alias($original_path, $language);
+    if ($alias != $original_path) {
+      $path = $alias;
+    }
+  }
+
+  $base = $options['absolute'] ? $options['base_url'] . '/' : base_path();
+  $prefix = empty($path) ? rtrim($options['prefix'], '/') : $options['prefix'];
+
+  // With Clean URLs.
+  if (!empty($GLOBALS['conf']['clean_url'])) {
+    $path = drupal_encode_path($prefix . $path);
+    if ($options['query']) {
+      return $base . $path . '?' . drupal_http_build_query($options['query']) . $options['fragment'];
+    }
+    else {
+      return $base . $path . $options['fragment'];
+    }
+  }
+  // Without Clean URLs.
+  else {
+    $path = $prefix . $path;
+    $query = array();
+    if (!empty($path)) {
+      $query['q'] = $path;
+    }
+    if ($options['query']) {
+      // We do not use array_merge() here to prevent overriding $path via query
+      // parameters.
+      $query += $options['query'];
+    }
+    $query = $query ? ('?' . drupal_http_build_query($query)) : '';
+    $script = isset($options['script']) ? $options['script'] : '';
+    return $base . $script . $query . $options['fragment'];
+  }
+}
+
+/**
+ * Returns TRUE if a path is external to Drupal (e.g. http://example.com).
+ *
+ * If a path cannot be assessed by Drupal's menu handler, then we must
+ * treat it as potentially insecure.
+ *
+ * @param $path
+ *   The internal path or external URL being linked to, such as "node/34" or
+ *   "http://example.com/foo".
+ *
+ * @return
+ *   Boolean TRUE or FALSE, where TRUE indicates an external path.
+ */
+function url_is_external($path) {
+  $colonpos = strpos($path, ':');
+  // Avoid calling drupal_strip_dangerous_protocols() if there is any
+  // slash (/), hash (#) or question_mark (?) before the colon (:)
+  // occurrence - if any - as this would clearly mean it is not a URL.
+  return $colonpos !== FALSE && !preg_match('![/?#]!', substr($path, 0, $colonpos)) && drupal_strip_dangerous_protocols($path) == $path;
+}
+
+/**
+ * Formats an attribute string for an HTTP header.
+ *
+ * @param $attributes
+ *   An associative array of attributes such as 'rel'.
+ *
+ * @return
+ *   A ; separated string ready for insertion in a HTTP header. No escaping is
+ *   performed for HTML entities, so this string is not safe to be printed.
+ *
+ * @see drupal_add_http_header()
+ */
+function drupal_http_header_attributes(array $attributes = array()) {
+  foreach ($attributes as $attribute => &$data) {
+    if (is_array($data)) {
+      $data = implode(' ', $data);
+    }
+    $data = $attribute . '="' . $data . '"';
+  }
+  return $attributes ? ' ' . implode('; ', $attributes) : '';
+}
+
+/**
+ * Converts an associative array to an XML/HTML tag attribute string.
+ *
+ * Each array key and its value will be formatted into an attribute string.
+ * If a value is itself an array, then its elements are concatenated to a single
+ * space-delimited string (for example, a class attribute with multiple values).
+ *
+ * Attribute values are sanitized by running them through check_plain().
+ * Attribute names are not automatically sanitized. When using user-supplied
+ * attribute names, it is strongly recommended to allow only white-listed names,
+ * since certain attributes carry security risks and can be abused.
+ *
+ * Examples of security aspects when using drupal_attributes:
+ * @code
+ *   // By running the value in the following statement through check_plain,
+ *   // the malicious script is neutralized.
+ *   drupal_attributes(array('title' => t('<script>steal_cookie();</script>')));
+ *
+ *   // The statement below demonstrates dangerous use of drupal_attributes, and
+ *   // will return an onmouseout attribute with JavaScript code that, when used
+ *   // as attribute in a tag, will cause users to be redirected to another site.
+ *   //
+ *   // In this case, the 'onmouseout' attribute should not be whitelisted --
+ *   // you don't want users to have the ability to add this attribute or others
+ *   // that take JavaScript commands.
+ *   drupal_attributes(array('onmouseout' => 'window.location="http://malicious.com/";')));
+ * @endcode
+ *
+ * @param $attributes
+ *   An associative array of key-value pairs to be converted to attributes.
+ *
+ * @return
+ *   A string ready for insertion in a tag (starts with a space).
+ *
+ * @ingroup sanitization
+ */
+function drupal_attributes(array $attributes = array()) {
+  foreach ($attributes as $attribute => &$data) {
+    $data = implode(' ', (array) $data);
+    $data = $attribute . '="' . check_plain($data) . '"';
+  }
+  return $attributes ? ' ' . implode(' ', $attributes) : '';
+}
+
+/**
+ * Formats an internal or external URL link as an HTML anchor tag.
+ *
+ * This function correctly handles aliased paths and adds an 'active' class
+ * attribute to links that point to the current page (for theming), so all
+ * internal links output by modules should be generated by this function if
+ * possible.
+ *
+ * However, for links enclosed in translatable text you should use t() and
+ * embed the HTML anchor tag directly in the translated string. For example:
+ * @code
+ * t('Visit the <a href="@url">settings</a> page', array('@url' => url('admin')));
+ * @endcode
+ * This keeps the context of the link title ('settings' in the example) for
+ * translators.
+ *
+ * @param string $text
+ *   The translated link text for the anchor tag.
+ * @param string $path
+ *   The internal path or external URL being linked to, such as "node/34" or
+ *   "http://example.com/foo". After the url() function is called to construct
+ *   the URL from $path and $options, the resulting URL is passed through
+ *   check_plain() before it is inserted into the HTML anchor tag, to ensure
+ *   well-formed HTML. See url() for more information and notes.
+ * @param array $options
+ *   An associative array of additional options. Defaults to an empty array. It
+ *   may contain the following elements.
+ *   - 'attributes': An associative array of HTML attributes to apply to the
+ *     anchor tag. If element 'class' is included, it must be an array; 'title'
+ *     must be a string; other elements are more flexible, as they just need
+ *     to work in a call to drupal_attributes($options['attributes']).
+ *   - 'html' (default FALSE): Whether $text is HTML or just plain-text. For
+ *     example, to make an image tag into a link, this must be set to TRUE, or
+ *     you will see the escaped HTML image tag. $text is not sanitized if
+ *     'html' is TRUE. The calling function must ensure that $text is already
+ *     safe.
+ *   - 'language': An optional language object. If the path being linked to is
+ *     internal to the site, $options['language'] is used to determine whether
+ *     the link is "active", or pointing to the current page (the language as
+ *     well as the path must match). This element is also used by url().
+ *   - Additional $options elements used by the url() function.
+ *
+ * @return string
+ *   An HTML string containing a link to the given path.
+ *
+ * @see url()
+ */
+function l($text, $path, array $options = array()) {
+  global $language_url;
+  static $use_theme = NULL;
+
+  // Merge in defaults.
+  $options += array(
+    'attributes' => array(),
+    'html' => FALSE,
+  );
+
+  // Append active class.
+  if (($path == $_GET['q'] || ($path == '<front>' && drupal_is_front_page())) &&
+      (empty($options['language']) || $options['language']->language == $language_url->language)) {
+    $options['attributes']['class'][] = 'active';
+  }
+
+  // Remove all HTML and PHP tags from a tooltip. For best performance, we act only
+  // if a quick strpos() pre-check gave a suspicion (because strip_tags() is expensive).
+  if (isset($options['attributes']['title']) && strpos($options['attributes']['title'], '<') !== FALSE) {
+    $options['attributes']['title'] = strip_tags($options['attributes']['title']);
+  }
+
+  // Determine if rendering of the link is to be done with a theme function
+  // or the inline default. Inline is faster, but if the theme system has been
+  // loaded and a module or theme implements a preprocess or process function
+  // or overrides the theme_link() function, then invoke theme(). Preliminary
+  // benchmarks indicate that invoking theme() can slow down the l() function
+  // by 20% or more, and that some of the link-heavy Drupal pages spend more
+  // than 10% of the total page request time in the l() function.
+  if (!isset($use_theme) && function_exists('theme')) {
+    // Allow edge cases to prevent theme initialization and force inline link
+    // rendering.
+    if (variable_get('theme_link', TRUE)) {
+      drupal_theme_initialize();
+      $registry = theme_get_registry(FALSE);
+      // We don't want to duplicate functionality that's in theme(), so any
+      // hint of a module or theme doing anything at all special with the 'link'
+      // theme hook should simply result in theme() being called. This includes
+      // the overriding of theme_link() with an alternate function or template,
+      // the presence of preprocess or process functions, or the presence of
+      // include files.
+      $use_theme = !isset($registry['link']['function']) || ($registry['link']['function'] != 'theme_link');
+      $use_theme = $use_theme || !empty($registry['link']['preprocess functions']) || !empty($registry['link']['process functions']) || !empty($registry['link']['includes']);
+    }
+    else {
+      $use_theme = FALSE;
+    }
+  }
+  if ($use_theme) {
+    return theme('link', array('text' => $text, 'path' => $path, 'options' => $options));
+  }
+  // The result of url() is a plain-text URL. Because we are using it here
+  // in an HTML argument context, we need to encode it properly.
+  return '<a href="' . check_plain(url($path, $options)) . '"' . drupal_attributes($options['attributes']) . '>' . ($options['html'] ? $text : check_plain($text)) . '</a>';
+}
+
+/**
+ * Delivers a page callback result to the browser in the appropriate format.
+ *
+ * This function is most commonly called by menu_execute_active_handler(), but
+ * can also be called by error conditions such as drupal_not_found(),
+ * drupal_access_denied(), and drupal_site_offline().
+ *
+ * When a user requests a page, index.php calls menu_execute_active_handler(),
+ * which calls the 'page callback' function registered in hook_menu(). The page
+ * callback function can return one of:
+ * - NULL: to indicate no content.
+ * - An integer menu status constant: to indicate an error condition.
+ * - A string of HTML content.
+ * - A renderable array of content.
+ * Returning a renderable array rather than a string of HTML is preferred,
+ * because that provides modules with more flexibility in customizing the final
+ * result.
+ *
+ * When the page callback returns its constructed content to
+ * menu_execute_active_handler(), this function gets called. The purpose of
+ * this function is to determine the most appropriate 'delivery callback'
+ * function to route the content to. The delivery callback function then
+ * sends the content to the browser in the needed format. The default delivery
+ * callback is drupal_deliver_html_page(), which delivers the content as an HTML
+ * page, complete with blocks in addition to the content. This default can be
+ * overridden on a per menu router item basis by setting 'delivery callback' in
+ * hook_menu() or hook_menu_alter(), and can also be overridden on a per request
+ * basis in hook_page_delivery_callback_alter().
+ *
+ * For example, the same page callback function can be used for an HTML
+ * version of the page and an Ajax version of the page. The page callback
+ * function just needs to decide what content is to be returned and the
+ * delivery callback function will send it as an HTML page or an Ajax
+ * response, as appropriate.
+ *
+ * In order for page callbacks to be reusable in different delivery formats,
+ * they should not issue any "print" or "echo" statements, but instead just
+ * return content.
+ *
+ * Also note that this function does not perform access checks. The delivery
+ * callback function specified in hook_menu(), hook_menu_alter(), or
+ * hook_page_delivery_callback_alter() will be called even if the router item
+ * access checks fail. This is intentional (it is needed for JSON and other
+ * purposes), but it has security implications. Do not call this function
+ * directly unless you understand the security implications, and be careful in
+ * writing delivery callbacks, so that they do not violate security. See
+ * drupal_deliver_html_page() for an example of a delivery callback that
+ * respects security.
+ *
+ * @param $page_callback_result
+ *   The result of a page callback. Can be one of:
+ *   - NULL: to indicate no content.
+ *   - An integer menu status constant: to indicate an error condition.
+ *   - A string of HTML content.
+ *   - A renderable array of content.
+ * @param $default_delivery_callback
+ *   (Optional) If given, it is the name of a delivery function most likely
+ *   to be appropriate for the page request as determined by the calling
+ *   function (e.g., menu_execute_active_handler()). If not given, it is
+ *   determined from the menu router information of the current page.
+ *
+ * @see menu_execute_active_handler()
+ * @see hook_menu()
+ * @see hook_menu_alter()
+ * @see hook_page_delivery_callback_alter()
+ */
+function drupal_deliver_page($page_callback_result, $default_delivery_callback = NULL) {
+  if (!isset($default_delivery_callback) && ($router_item = menu_get_item())) {
+    $default_delivery_callback = $router_item['delivery_callback'];
+  }
+  $delivery_callback = !empty($default_delivery_callback) ? $default_delivery_callback : 'drupal_deliver_html_page';
+  // Give modules a chance to alter the delivery callback used, based on
+  // request-time context (e.g., HTTP request headers).
+  drupal_alter('page_delivery_callback', $delivery_callback);
+  if (function_exists($delivery_callback)) {
+    $delivery_callback($page_callback_result);
+  }
+  else {
+    // If a delivery callback is specified, but doesn't exist as a function,
+    // something is wrong, but don't print anything, since it's not known
+    // what format the response needs to be in.
+    watchdog('delivery callback not found', 'callback %callback not found: %q.', array('%callback' => $delivery_callback, '%q' => $_GET['q']), WATCHDOG_ERROR);
+  }
+}
+
+/**
+ * Packages and sends the result of a page callback to the browser as HTML.
+ *
+ * @param $page_callback_result
+ *   The result of a page callback. Can be one of:
+ *   - NULL: to indicate no content.
+ *   - An integer menu status constant: to indicate an error condition.
+ *   - A string of HTML content.
+ *   - A renderable array of content.
+ *
+ * @see drupal_deliver_page()
+ */
+function drupal_deliver_html_page($page_callback_result) {
+  // Emit the correct charset HTTP header, but not if the page callback
+  // result is NULL, since that likely indicates that it printed something
+  // in which case, no further headers may be sent, and not if code running
+  // for this page request has already set the content type header.
+  if (isset($page_callback_result) && is_null(drupal_get_http_header('Content-Type'))) {
+    drupal_add_http_header('Content-Type', 'text/html; charset=utf-8');
+  }
+
+  // Send appropriate HTTP-Header for browsers and search engines.
+  global $language;
+  drupal_add_http_header('Content-Language', $language->language);
+
+  // Menu status constants are integers; page content is a string or array.
+  if (is_int($page_callback_result)) {
+    // @todo: Break these up into separate functions?
+    switch ($page_callback_result) {
+      case MENU_NOT_FOUND:
+        // Print a 404 page.
+        drupal_add_http_header('Status', '404 Not Found');
+
+        watchdog('page not found', check_plain($_GET['q']), NULL, WATCHDOG_WARNING);
+
+        // Check for and return a fast 404 page if configured.
+        drupal_fast_404();
+
+        // Keep old path for reference, and to allow forms to redirect to it.
+        if (!isset($_GET['destination'])) {
+          $_GET['destination'] = $_GET['q'];
+        }
+
+        $path = drupal_get_normal_path(variable_get('site_404', ''));
+        if ($path && $path != $_GET['q']) {
+          // Custom 404 handler. Set the active item in case there are tabs to
+          // display, or other dependencies on the path.
+          menu_set_active_item($path);
+          $return = menu_execute_active_handler($path, FALSE);
+        }
+
+        if (empty($return) || $return == MENU_NOT_FOUND || $return == MENU_ACCESS_DENIED) {
+          // Standard 404 handler.
+          drupal_set_title(t('Page not found'));
+          $return = t('The requested page "@path" could not be found.', array('@path' => request_uri()));
+        }
+
+        drupal_set_page_content($return);
+        $page = element_info('page');
+        print drupal_render_page($page);
+        break;
+
+      case MENU_ACCESS_DENIED:
+        // Print a 403 page.
+        drupal_add_http_header('Status', '403 Forbidden');
+        watchdog('access denied', check_plain($_GET['q']), NULL, WATCHDOG_WARNING);
+
+        // Keep old path for reference, and to allow forms to redirect to it.
+        if (!isset($_GET['destination'])) {
+          $_GET['destination'] = $_GET['q'];
+        }
+
+        $path = drupal_get_normal_path(variable_get('site_403', ''));
+        if ($path && $path != $_GET['q']) {
+          // Custom 403 handler. Set the active item in case there are tabs to
+          // display or other dependencies on the path.
+          menu_set_active_item($path);
+          $return = menu_execute_active_handler($path, FALSE);
+        }
+
+        if (empty($return) || $return == MENU_NOT_FOUND || $return == MENU_ACCESS_DENIED) {
+          // Standard 403 handler.
+          drupal_set_title(t('Access denied'));
+          $return = t('You are not authorized to access this page.');
+        }
+
+        print drupal_render_page($return);
+        break;
+
+      case MENU_SITE_OFFLINE:
+        // Print a 503 page.
+        drupal_maintenance_theme();
+        drupal_add_http_header('Status', '503 Service unavailable');
+        drupal_set_title(t('Site under maintenance'));
+        print theme('maintenance_page', array('content' => filter_xss_admin(variable_get('maintenance_mode_message',
+          t('@site is currently under maintenance. We should be back shortly. Thank you for your patience.', array('@site' => variable_get('site_name', 'Drupal')))))));
+        break;
+    }
+  }
+  elseif (isset($page_callback_result)) {
+    // Print anything besides a menu constant, assuming it's not NULL or
+    // undefined.
+    print drupal_render_page($page_callback_result);
+  }
+
+  // Perform end-of-request tasks.
+  drupal_page_footer();
+}
+
+/**
+ * Performs end-of-request tasks.
+ *
+ * This function sets the page cache if appropriate, and allows modules to
+ * react to the closing of the page by calling hook_exit().
+ */
+function drupal_page_footer() {
+  global $user;
+
+  module_invoke_all('exit');
+
+  // Commit the user session, if needed.
+  drupal_session_commit();
+
+  if (variable_get('cache', 0) && ($cache = drupal_page_set_cache())) {
+    drupal_serve_page_from_cache($cache);
+  }
+  else {
+    ob_flush();
+  }
+
+  _registry_check_code(REGISTRY_WRITE_LOOKUP_CACHE);
+  drupal_cache_system_paths();
+  module_implements_write_cache();
+  system_run_automated_cron();
+}
+
+/**
+ * Performs end-of-request tasks.
+ *
+ * In some cases page requests need to end without calling drupal_page_footer().
+ * In these cases, call drupal_exit() instead. There should rarely be a reason
+ * to call exit instead of drupal_exit();
+ *
+ * @param $destination
+ *   If this function is called from drupal_goto(), then this argument
+ *   will be a fully-qualified URL that is the destination of the redirect.
+ *   This should be passed along to hook_exit() implementations.
+ */
+function drupal_exit($destination = NULL) {
+  if (drupal_get_bootstrap_phase() == DRUPAL_BOOTSTRAP_FULL) {
+    if (!defined('MAINTENANCE_MODE') || MAINTENANCE_MODE != 'update') {
+      module_invoke_all('exit', $destination);
+    }
+    drupal_session_commit();
+  }
+  exit;
+}
+
+/**
+ * Forms an associative array from a linear array.
+ *
+ * This function walks through the provided array and constructs an associative
+ * array out of it. The keys of the resulting array will be the values of the
+ * input array. The values will be the same as the keys unless a function is
+ * specified, in which case the output of the function is used for the values
+ * instead.
+ *
+ * @param $array
+ *   A linear array.
+ * @param $function
+ *   A name of a function to apply to all values before output.
+ *
+ * @return
+ *   An associative array.
+ */
+function drupal_map_assoc($array, $function = NULL) {
+  // array_combine() fails with empty arrays:
+  // http://bugs.php.net/bug.php?id=34857.
+  $array = !empty($array) ? array_combine($array, $array) : array();
+  if (is_callable($function)) {
+    $array = array_map($function, $array);
+  }
+  return $array;
+}
+
+/**
+ * Attempts to set the PHP maximum execution time.
+ *
+ * This function is a wrapper around the PHP function set_time_limit().
+ * When called, set_time_limit() restarts the timeout counter from zero.
+ * In other words, if the timeout is the default 30 seconds, and 25 seconds
+ * into script execution a call such as set_time_limit(20) is made, the
+ * script will run for a total of 45 seconds before timing out.
+ *
+ * It also means that it is possible to decrease the total time limit if
+ * the sum of the new time limit and the current time spent running the
+ * script is inferior to the original time limit. It is inherent to the way
+ * set_time_limit() works, it should rather be called with an appropriate
+ * value every time you need to allocate a certain amount of time
+ * to execute a task than only once at the beginning of the script.
+ *
+ * Before calling set_time_limit(), we check if this function is available
+ * because it could be disabled by the server administrator. We also hide all
+ * the errors that could occur when calling set_time_limit(), because it is
+ * not possible to reliably ensure that PHP or a security extension will
+ * not issue a warning/error if they prevent the use of this function.
+ *
+ * @param $time_limit
+ *   An integer specifying the new time limit, in seconds. A value of 0
+ *   indicates unlimited execution time.
+ *
+ * @ingroup php_wrappers
+ */
+function drupal_set_time_limit($time_limit) {
+  if (function_exists('set_time_limit')) {
+    @set_time_limit($time_limit);
+  }
+}
+
+/**
+ * Returns the path to a system item (module, theme, etc.).
+ *
+ * @param $type
+ *   The type of the item (i.e. theme, theme_engine, module, profile).
+ * @param $name
+ *   The name of the item for which the path is requested.
+ *
+ * @return
+ *   The path to the requested item or an empty string if the item is not found.
+ */
+function drupal_get_path($type, $name) {
+  return dirname(drupal_get_filename($type, $name));
+}
+
+/**
+ * Returns the base URL path (i.e., directory) of the Drupal installation.
+ *
+ * base_path() adds a "/" to the beginning and end of the returned path if the
+ * path is not empty. At the very least, this will return "/".
+ *
+ * Examples:
+ * - http://example.com returns "/" because the path is empty.
+ * - http://example.com/drupal/folder returns "/drupal/folder/".
+ */
+function base_path() {
+  return $GLOBALS['base_path'];
+}
+
+/**
+ * Adds a LINK tag with a distinct 'rel' attribute to the page's HEAD.
+ *
+ * This function can be called as long the HTML header hasn't been sent, which
+ * on normal pages is up through the preprocess step of theme('html'). Adding
+ * a link will overwrite a prior link with the exact same 'rel' and 'href'
+ * attributes.
+ *
+ * @param $attributes
+ *   Associative array of element attributes including 'href' and 'rel'.
+ * @param $header
+ *   Optional flag to determine if a HTTP 'Link:' header should be sent.
+ */
+function drupal_add_html_head_link($attributes, $header = FALSE) {
+  $element = array(
+    '#tag' => 'link',
+    '#attributes' => $attributes,
+  );
+  $href = $attributes['href'];
+
+  if ($header) {
+    // Also add a HTTP header "Link:".
+    $href = '<' . check_plain($attributes['href']) . '>;';
+    unset($attributes['href']);
+    $element['#attached']['drupal_add_http_header'][] = array('Link',  $href . drupal_http_header_attributes($attributes), TRUE);
+  }
+
+  drupal_add_html_head($element, 'drupal_add_html_head_link:' . $attributes['rel'] . ':' . $href);
+}
+
+/**
+ * Adds a cascading stylesheet to the stylesheet queue.
+ *
+ * Calling drupal_static_reset('drupal_add_css') will clear all cascading
+ * stylesheets added so far.
+ *
+ * If CSS aggregation/compression is enabled, all cascading style sheets added
+ * with $options['preprocess'] set to TRUE will be merged into one aggregate
+ * file and compressed by removing all extraneous white space.
+ * Preprocessed inline stylesheets will not be aggregated into this single file;
+ * instead, they are just compressed upon output on the page. Externally hosted
+ * stylesheets are never aggregated or compressed.
+ *
+ * The reason for aggregating the files is outlined quite thoroughly here:
+ * http://www.die.net/musings/page_load_time/ "Load fewer external objects. Due
+ * to request overhead, one bigger file just loads faster than two smaller ones
+ * half its size."
+ *
+ * $options['preprocess'] should be only set to TRUE when a file is required for
+ * all typical visitors and most pages of a site. It is critical that all
+ * preprocessed files are added unconditionally on every page, even if the
+ * files do not happen to be needed on a page. This is normally done by calling
+ * drupal_add_css() in a hook_init() implementation.
+ *
+ * Non-preprocessed files should only be added to the page when they are
+ * actually needed.
+ *
+ * @param $data
+ *   (optional) The stylesheet data to be added, depending on what is passed
+ *   through to the $options['type'] parameter:
+ *   - 'file': The path to the CSS file relative to the base_path(), or a
+ *     stream wrapper URI. For example: "modules/devel/devel.css" or
+ *     "public://generated_css/stylesheet_1.css". Note that Modules should
+ *     always prefix the names of their CSS files with the module name; for
+ *     example, system-menus.css rather than simply menus.css. Themes can
+ *     override module-supplied CSS files based on their filenames, and this
+ *     prefixing helps prevent confusing name collisions for theme developers.
+ *     See drupal_get_css() where the overrides are performed. Also, if the
+ *     direction of the current language is right-to-left (Hebrew, Arabic,
+ *     etc.), the function will also look for an RTL CSS file and append it to
+ *     the list. The name of this file should have an '-rtl.css' suffix. For
+ *     example, a CSS file called 'mymodule-name.css' will have a
+ *     'mymodule-name-rtl.css' file added to the list, if exists in the same
+ *     directory. This CSS file should contain overrides for properties which
+ *     should be reversed or otherwise different in a right-to-left display.
+ *   - 'inline': A string of CSS that should be placed in the given scope. Note
+ *     that it is better practice to use 'file' stylesheets, rather than
+ *     'inline', as the CSS would then be aggregated and cached.
+ *   - 'external': The absolute path to an external CSS file that is not hosted
+ *     on the local server. These files will not be aggregated if CSS
+ *     aggregation is enabled.
+ * @param $options
+ *   (optional) A string defining the 'type' of CSS that is being added in the
+ *   $data parameter ('file', 'inline', or 'external'), or an array which can
+ *   have any or all of the following keys:
+ *   - 'type': The type of stylesheet being added. Available options are 'file',
+ *     'inline' or 'external'. Defaults to 'file'.
+ *   - 'basename': Force a basename for the file being added. Modules are
+ *     expected to use stylesheets with unique filenames, but integration of
+ *     external libraries may make this impossible. The basename of
+ *     'modules/node/node.css' is 'node.css'. If the external library "node.js"
+ *     ships with a 'node.css', then a different, unique basename would be
+ *     'node.js.css'.
+ *   - 'group': A number identifying the group in which to add the stylesheet.
+ *     Available constants are:
+ *     - CSS_SYSTEM: Any system-layer CSS.
+ *     - CSS_DEFAULT: (default) Any module-layer CSS.
+ *     - CSS_THEME: Any theme-layer CSS.
+ *     The group number serves as a weight: the markup for loading a stylesheet
+ *     within a lower weight group is output to the page before the markup for
+ *     loading a stylesheet within a higher weight group, so CSS within higher
+ *     weight groups take precendence over CSS within lower weight groups.
+ *   - 'every_page': For optimal front-end performance when aggregation is
+ *     enabled, this should be set to TRUE if the stylesheet is present on every
+ *     page of the website for users for whom it is present at all. This
+ *     defaults to FALSE. It is set to TRUE for stylesheets added via module and
+ *     theme .info files. Modules that add stylesheets within hook_init()
+ *     implementations, or from other code that ensures that the stylesheet is
+ *     added to all website pages, should also set this flag to TRUE. All
+ *     stylesheets within the same group that have the 'every_page' flag set to
+ *     TRUE and do not have 'preprocess' set to FALSE are aggregated together
+ *     into a single aggregate file, and that aggregate file can be reused
+ *     across a user's entire site visit, leading to faster navigation between
+ *     pages. However, stylesheets that are only needed on pages less frequently
+ *     visited, can be added by code that only runs for those particular pages,
+ *     and that code should not set the 'every_page' flag. This minimizes the
+ *     size of the aggregate file that the user needs to download when first
+ *     visiting the website. Stylesheets without the 'every_page' flag are
+ *     aggregated into a separate aggregate file. This other aggregate file is
+ *     likely to change from page to page, and each new aggregate file needs to
+ *     be downloaded when first encountered, so it should be kept relatively
+ *     small by ensuring that most commonly needed stylesheets are added to
+ *     every page.
+ *   - 'weight': The weight of the stylesheet specifies the order in which the
+ *     CSS will appear relative to other stylesheets with the same group and
+ *     'every_page' flag. The exact ordering of stylesheets is as follows:
+ *     - First by group.
+ *     - Then by the 'every_page' flag, with TRUE coming before FALSE.
+ *     - Then by weight.
+ *     - Then by the order in which the CSS was added. For example, all else
+ *       being the same, a stylesheet added by a call to drupal_add_css() that
+ *       happened later in the page request gets added to the page after one for
+ *       which drupal_add_css() happened earlier in the page request.
+ *   - 'media': The media type for the stylesheet, e.g., all, print, screen.
+ *     Defaults to 'all'.
+ *   - 'preprocess': If TRUE and CSS aggregation/compression is enabled, the
+ *     styles will be aggregated and compressed. Defaults to TRUE.
+ *   - 'browsers': An array containing information specifying which browsers
+ *     should load the CSS item. See drupal_pre_render_conditional_comments()
+ *     for details.
+ *
+ * @return
+ *   An array of queued cascading stylesheets.
+ *
+ * @see drupal_get_css()
+ */
+function drupal_add_css($data = NULL, $options = NULL) {
+  $css = &drupal_static(__FUNCTION__, array());
+
+  // Construct the options, taking the defaults into consideration.
+  if (isset($options)) {
+    if (!is_array($options)) {
+      $options = array('type' => $options);
+    }
+  }
+  else {
+    $options = array();
+  }
+
+  // Create an array of CSS files for each media type first, since each type needs to be served
+  // to the browser differently.
+  if (isset($data)) {
+    $options += array(
+      'type' => 'file',
+      'group' => CSS_DEFAULT,
+      'weight' => 0,
+      'every_page' => FALSE,
+      'media' => 'all',
+      'preprocess' => TRUE,
+      'data' => $data,
+      'browsers' => array(),
+    );
+    $options['browsers'] += array(
+      'IE' => TRUE,
+      '!IE' => TRUE,
+    );
+
+    // Files with a query string cannot be preprocessed.
+    if ($options['type'] === 'file' && $options['preprocess'] && strpos($options['data'], '?') !== FALSE) {
+      $options['preprocess'] = FALSE;
+    }
+
+    // Always add a tiny value to the weight, to conserve the insertion order.
+    $options['weight'] += count($css) / 1000;
+
+    // Add the data to the CSS array depending on the type.
+    switch ($options['type']) {
+      case 'inline':
+        // For inline stylesheets, we don't want to use the $data as the array
+        // key as $data could be a very long string of CSS.
+        $css[] = $options;
+        break;
+      default:
+        // Local and external files must keep their name as the associative key
+        // so the same CSS file is not be added twice.
+        $css[$data] = $options;
+    }
+  }
+
+  return $css;
+}
+
+/**
+ * Returns a themed representation of all stylesheets to attach to the page.
+ *
+ * It loads the CSS in order, with 'module' first, then 'theme' afterwards.
+ * This ensures proper cascading of styles so themes can easily override
+ * module styles through CSS selectors.
+ *
+ * Themes may replace module-defined CSS files by adding a stylesheet with the
+ * same filename. For example, themes/bartik/system-menus.css would replace
+ * modules/system/system-menus.css. This allows themes to override complete
+ * CSS files, rather than specific selectors, when necessary.
+ *
+ * If the original CSS file is being overridden by a theme, the theme is
+ * responsible for supplying an accompanying RTL CSS file to replace the
+ * module's.
+ *
+ * @param $css
+ *   (optional) An array of CSS files. If no array is provided, the default
+ *   stylesheets array is used instead.
+ * @param $skip_alter
+ *   (optional) If set to TRUE, this function skips calling drupal_alter() on
+ *   $css, useful when the calling function passes a $css array that has already
+ *   been altered.
+ *
+ * @return
+ *   A string of XHTML CSS tags.
+ *
+ * @see drupal_add_css()
+ */
+function drupal_get_css($css = NULL, $skip_alter = FALSE) {
+  if (!isset($css)) {
+    $css = drupal_add_css();
+  }
+
+  // Allow modules and themes to alter the CSS items.
+  if (!$skip_alter) {
+    drupal_alter('css', $css);
+  }
+
+  // Sort CSS items, so that they appear in the correct order.
+  uasort($css, 'drupal_sort_css_js');
+
+  // Provide the page with information about the individual CSS files used,
+  // information not otherwise available when CSS aggregation is enabled. The
+  // setting is attached later in this function, but is set here, so that CSS
+  // files removed below are still considered "used" and prevented from being
+  // added in a later AJAX request.
+  // Skip if no files were added to the page or jQuery.extend() will overwrite
+  // the Drupal.settings.ajaxPageState.css object with an empty array.
+  if (!empty($css)) {
+    // Cast the array to an object to be on the safe side even if not empty.
+    $setting['ajaxPageState']['css'] = (object) array_fill_keys(array_keys($css), 1);
+  }
+
+  // Remove the overridden CSS files. Later CSS files override former ones.
+  $previous_item = array();
+  foreach ($css as $key => $item) {
+    if ($item['type'] == 'file') {
+      // If defined, force a unique basename for this file.
+      $basename = isset($item['basename']) ? $item['basename'] : drupal_basename($item['data']);
+      if (isset($previous_item[$basename])) {
+        // Remove the previous item that shared the same base name.
+        unset($css[$previous_item[$basename]]);
+      }
+      $previous_item[$basename] = $key;
+    }
+  }
+
+  // Render the HTML needed to load the CSS.
+  $styles = array(
+    '#type' => 'styles',
+    '#items' => $css,
+  );
+
+  if (!empty($setting)) {
+    $styles['#attached']['js'][] = array('type' => 'setting', 'data' => $setting);
+  }
+
+  return drupal_render($styles);
+}
+
+/**
+ * Sorts CSS and JavaScript resources.
+ *
+ * Callback for uasort() within:
+ * - drupal_get_css()
+ * - drupal_get_js()
+ *
+ * This sort order helps optimize front-end performance while providing modules
+ * and themes with the necessary control for ordering the CSS and JavaScript
+ * appearing on a page.
+ *
+ * @param $a
+ *   First item for comparison. The compared items should be associative arrays
+ *   of member items from drupal_add_css() or drupal_add_js().
+ * @param $b
+ *   Second item for comparison.
+ *
+ * @see drupal_add_css()
+ * @see drupal_add_js()
+ */
+function drupal_sort_css_js($a, $b) {
+  // First order by group, so that, for example, all items in the CSS_SYSTEM
+  // group appear before items in the CSS_DEFAULT group, which appear before
+  // all items in the CSS_THEME group. Modules may create additional groups by
+  // defining their own constants.
+  if ($a['group'] < $b['group']) {
+    return -1;
+  }
+  elseif ($a['group'] > $b['group']) {
+    return 1;
+  }
+  // Within a group, order all infrequently needed, page-specific files after
+  // common files needed throughout the website. Separating this way allows for
+  // the aggregate file generated for all of the common files to be reused
+  // across a site visit without being cut by a page using a less common file.
+  elseif ($a['every_page'] && !$b['every_page']) {
+    return -1;
+  }
+  elseif (!$a['every_page'] && $b['every_page']) {
+    return 1;
+  }
+  // Finally, order by weight.
+  elseif ($a['weight'] < $b['weight']) {
+    return -1;
+  }
+  elseif ($a['weight'] > $b['weight']) {
+    return 1;
+  }
+  else {
+    return 0;
+  }
+}
+
+/**
+ * Default callback to group CSS items.
+ *
+ * This function arranges the CSS items that are in the #items property of the
+ * styles element into groups. Arranging the CSS items into groups serves two
+ * purposes. When aggregation is enabled, files within a group are aggregated
+ * into a single file, significantly improving page loading performance by
+ * minimizing network traffic overhead. When aggregation is disabled, grouping
+ * allows multiple files to be loaded from a single STYLE tag, enabling sites
+ * with many modules enabled or a complex theme being used to stay within IE's
+ * 31 CSS inclusion tag limit: http://drupal.org/node/228818.
+ *
+ * This function puts multiple items into the same group if they are groupable
+ * and if they are for the same 'media' and 'browsers'. Items of the 'file' type
+ * are groupable if their 'preprocess' flag is TRUE, items of the 'inline' type
+ * are always groupable, and items of the 'external' type are never groupable.
+ * This function also ensures that the process of grouping items does not change
+ * their relative order. This requirement may result in multiple groups for the
+ * same type, media, and browsers, if needed to accommodate other items in
+ * between.
+ *
+ * @param $css
+ *   An array of CSS items, as returned by drupal_add_css(), but after
+ *   alteration performed by drupal_get_css().
+ *
+ * @return
+ *   An array of CSS groups. Each group contains the same keys (e.g., 'media',
+ *   'data', etc.) as a CSS item from the $css parameter, with the value of
+ *   each key applying to the group as a whole. Each group also contains an
+ *   'items' key, which is the subset of items from $css that are in the group.
+ *
+ * @see drupal_pre_render_styles()
+ * @see system_element_info()
+ */
+function drupal_group_css($css) {
+  $groups = array();
+  // If a group can contain multiple items, we track the information that must
+  // be the same for each item in the group, so that when we iterate the next
+  // item, we can determine if it can be put into the current group, or if a
+  // new group needs to be made for it.
+  $current_group_keys = NULL;
+  // When creating a new group, we pre-increment $i, so by initializing it to
+  // -1, the first group will have index 0.
+  $i = -1;
+  foreach ($css as $item) {
+    // The browsers for which the CSS item needs to be loaded is part of the
+    // information that determines when a new group is needed, but the order of
+    // keys in the array doesn't matter, and we don't want a new group if all
+    // that's different is that order.
+    ksort($item['browsers']);
+
+    // If the item can be grouped with other items, set $group_keys to an array
+    // of information that must be the same for all items in its group. If the
+    // item can't be grouped with other items, set $group_keys to FALSE. We
+    // put items into a group that can be aggregated together: whether they will
+    // be aggregated is up to the _drupal_css_aggregate() function or an
+    // override of that function specified in hook_css_alter(), but regardless
+    // of the details of that function, a group represents items that can be
+    // aggregated. Since a group may be rendered with a single HTML tag, all
+    // items in the group must share the same information that would need to be
+    // part of that HTML tag.
+    switch ($item['type']) {
+      case 'file':
+        // Group file items if their 'preprocess' flag is TRUE.
+        // Help ensure maximum reuse of aggregate files by only grouping
+        // together items that share the same 'group' value and 'every_page'
+        // flag. See drupal_add_css() for details about that.
+        $group_keys = $item['preprocess'] ? array($item['type'], $item['group'], $item['every_page'], $item['media'], $item['browsers']) : FALSE;
+        break;
+      case 'inline':
+        // Always group inline items.
+        $group_keys = array($item['type'], $item['media'], $item['browsers']);
+        break;
+      case 'external':
+        // Do not group external items.
+        $group_keys = FALSE;
+        break;
+    }
+
+    // If the group keys don't match the most recent group we're working with,
+    // then a new group must be made.
+    if ($group_keys !== $current_group_keys) {
+      $i++;
+      // Initialize the new group with the same properties as the first item
+      // being placed into it. The item's 'data' and 'weight' properties are
+      // unique to the item and should not be carried over to the group.
+      $groups[$i] = $item;
+      unset($groups[$i]['data'], $groups[$i]['weight']);
+      $groups[$i]['items'] = array();
+      $current_group_keys = $group_keys ? $group_keys : NULL;
+    }
+
+    // Add the item to the current group.
+    $groups[$i]['items'][] = $item;
+  }
+  return $groups;
+}
+
+/**
+ * Default callback to aggregate CSS files and inline content.
+ *
+ * Having the browser load fewer CSS files results in much faster page loads
+ * than when it loads many small files. This function aggregates files within
+ * the same group into a single file unless the site-wide setting to do so is
+ * disabled (commonly the case during site development). To optimize download,
+ * it also compresses the aggregate files by removing comments, whitespace, and
+ * other unnecessary content. Additionally, this functions aggregates inline
+ * content together, regardless of the site-wide aggregation setting.
+ *
+ * @param $css_groups
+ *   An array of CSS groups as returned by drupal_group_css(). This function
+ *   modifies the group's 'data' property for each group that is aggregated.
+ *
+ * @see drupal_group_css()
+ * @see drupal_pre_render_styles()
+ * @see system_element_info()
+ */
+function drupal_aggregate_css(&$css_groups) {
+  $preprocess_css = (variable_get('preprocess_css', FALSE) && (!defined('MAINTENANCE_MODE') || MAINTENANCE_MODE != 'update'));
+
+  // For each group that needs aggregation, aggregate its items.
+  foreach ($css_groups as $key => $group) {
+    switch ($group['type']) {
+      // If a file group can be aggregated into a single file, do so, and set
+      // the group's data property to the file path of the aggregate file.
+      case 'file':
+        if ($group['preprocess'] && $preprocess_css) {
+          $css_groups[$key]['data'] = drupal_build_css_cache($group['items']);
+        }
+        break;
+      // Aggregate all inline CSS content into the group's data property.
+      case 'inline':
+        $css_groups[$key]['data'] = '';
+        foreach ($group['items'] as $item) {
+          $css_groups[$key]['data'] .= drupal_load_stylesheet_content($item['data'], $item['preprocess']);
+        }
+        break;
+    }
+  }
+}
+
+/**
+ * #pre_render callback to add the elements needed for CSS tags to be rendered.
+ *
+ * For production websites, LINK tags are preferable to STYLE tags with @import
+ * statements, because:
+ * - They are the standard tag intended for linking to a resource.
+ * - On Firefox 2 and perhaps other browsers, CSS files included with @import
+ *   statements don't get saved when saving the complete web page for offline
+ *   use: http://drupal.org/node/145218.
+ * - On IE, if only LINK tags and no @import statements are used, all the CSS
+ *   files are downloaded in parallel, resulting in faster page load, but if
+ *   @import statements are used and span across multiple STYLE tags, all the
+ *   ones from one STYLE tag must be downloaded before downloading begins for
+ *   the next STYLE tag. Furthermore, IE7 does not support media declaration on
+ *   the @import statement, so multiple STYLE tags must be used when different
+ *   files are for different media types. Non-IE browsers always download in
+ *   parallel, so this is an IE-specific performance quirk:
+ *   http://www.stevesouders.com/blog/2009/04/09/dont-use-import/.
+ *
+ * However, IE has an annoying limit of 31 total CSS inclusion tags
+ * (http://drupal.org/node/228818) and LINK tags are limited to one file per
+ * tag, whereas STYLE tags can contain multiple @import statements allowing
+ * multiple files to be loaded per tag. When CSS aggregation is disabled, a
+ * Drupal site can easily have more than 31 CSS files that need to be loaded, so
+ * using LINK tags exclusively would result in a site that would display
+ * incorrectly in IE. Depending on different needs, different strategies can be
+ * employed to decide when to use LINK tags and when to use STYLE tags.
+ *
+ * The strategy employed by this function is to use LINK tags for all aggregate
+ * files and for all files that cannot be aggregated (e.g., if 'preprocess' is
+ * set to FALSE or the type is 'external'), and to use STYLE tags for groups
+ * of files that could be aggregated together but aren't (e.g., if the site-wide
+ * aggregation setting is disabled). This results in all LINK tags when
+ * aggregation is enabled, a guarantee that as many or only slightly more tags
+ * are used with aggregation disabled than enabled (so that if the limit were to
+ * be crossed with aggregation enabled, the site developer would also notice the
+ * problem while aggregation is disabled), and an easy way for a developer to
+ * view HTML source while aggregation is disabled and know what files will be
+ * aggregated together when aggregation becomes enabled.
+ *
+ * This function evaluates the aggregation enabled/disabled condition on a group
+ * by group basis by testing whether an aggregate file has been made for the
+ * group rather than by testing the site-wide aggregation setting. This allows
+ * this function to work correctly even if modules have implemented custom
+ * logic for grouping and aggregating files.
+ *
+ * @param $element
+ *   A render array containing:
+ *   - '#items': The CSS items as returned by drupal_add_css() and altered by
+ *     drupal_get_css().
+ *   - '#group_callback': A function to call to group #items to enable the use
+ *     of fewer tags by aggregating files and/or using multiple @import
+ *     statements within a single tag.
+ *   - '#aggregate_callback': A function to call to aggregate the items within
+ *     the groups arranged by the #group_callback function.
+ *
+ * @return
+ *   A render array that will render to a string of XHTML CSS tags.
+ *
+ * @see drupal_get_css()
+ */
+function drupal_pre_render_styles($elements) {
+  // Group and aggregate the items.
+  if (isset($elements['#group_callback'])) {
+    $elements['#groups'] = $elements['#group_callback']($elements['#items']);
+  }
+  if (isset($elements['#aggregate_callback'])) {
+    $elements['#aggregate_callback']($elements['#groups']);
+  }
+
+  // A dummy query-string is added to filenames, to gain control over
+  // browser-caching. The string changes on every update or full cache
+  // flush, forcing browsers to load a new copy of the files, as the
+  // URL changed.
+  $query_string = variable_get('css_js_query_string', '0');
+
+  // For inline CSS to validate as XHTML, all CSS containing XHTML needs to be
+  // wrapped in CDATA. To make that backwards compatible with HTML 4, we need to
+  // comment out the CDATA-tag.
+  $embed_prefix = "\n<!--/*--><![CDATA[/*><!--*/\n";
+  $embed_suffix = "\n/*]]>*/-->\n";
+
+  // Defaults for LINK and STYLE elements.
+  $link_element_defaults = array(
+    '#type' => 'html_tag',
+    '#tag' => 'link',
+    '#attributes' => array(
+      'type' => 'text/css',
+      'rel' => 'stylesheet',
+    ),
+  );
+  $style_element_defaults = array(
+    '#type' => 'html_tag',
+    '#tag' => 'style',
+    '#attributes' => array(
+      'type' => 'text/css',
+    ),
+  );
+
+  // Loop through each group.
+  foreach ($elements['#groups'] as $group) {
+    switch ($group['type']) {
+      // For file items, there are three possibilites.
+      // - The group has been aggregated: in this case, output a LINK tag for
+      //   the aggregate file.
+      // - The group can be aggregated but has not been (most likely because
+      //   the site administrator disabled the site-wide setting): in this case,
+      //   output as few STYLE tags for the group as possible, using @import
+      //   statement for each file in the group. This enables us to stay within
+      //   IE's limit of 31 total CSS inclusion tags.
+      // - The group contains items not eligible for aggregation (their
+      //   'preprocess' flag has been set to FALSE): in this case, output a LINK
+      //   tag for each file.
+      case 'file':
+        // The group has been aggregated into a single file: output a LINK tag
+        // for the aggregate file.
+        if (isset($group['data'])) {
+          $element = $link_element_defaults;
+          $element['#attributes']['href'] = file_create_url($group['data']);
+          $element['#attributes']['media'] = $group['media'];
+          $element['#browsers'] = $group['browsers'];
+          $elements[] = $element;
+        }
+        // The group can be aggregated, but hasn't been: combine multiple items
+        // into as few STYLE tags as possible.
+        elseif ($group['preprocess']) {
+          $import = array();
+          foreach ($group['items'] as $item) {
+            // A theme's .info file may have an entry for a file that doesn't
+            // exist as a way of overriding a module or base theme CSS file from
+            // being added to the page. Normally, file_exists() calls that need
+            // to run for every page request should be minimized, but this one
+            // is okay, because it only runs when CSS aggregation is disabled.
+            // On a server under heavy enough load that file_exists() calls need
+            // to be minimized, CSS aggregation should be enabled, in which case
+            // this code is not run. When aggregation is enabled,
+            // drupal_load_stylesheet() checks file_exists(), but only when
+            // building the aggregate file, which is then reused for many page
+            // requests.
+            if (file_exists($item['data'])) {
+              // The dummy query string needs to be added to the URL to control
+              // browser-caching. IE7 does not support a media type on the
+              // @import statement, so we instead specify the media for the
+              // group on the STYLE tag.
+              $import[] = '@import url("' . check_plain(file_create_url($item['data']) . '?' . $query_string) . '");';
+            }
+          }
+          // In addition to IE's limit of 31 total CSS inclusion tags, it also
+          // has a limit of 31 @import statements per STYLE tag.
+          while (!empty($import)) {
+            $import_batch = array_slice($import, 0, 31);
+            $import = array_slice($import, 31);
+            $element = $style_element_defaults;
+            $element['#value'] = implode("\n", $import_batch);
+            $element['#attributes']['media'] = $group['media'];
+            $element['#browsers'] = $group['browsers'];
+            $elements[] = $element;
+          }
+        }
+        // The group contains items ineligible for aggregation: output a LINK
+        // tag for each file.
+        else {
+          foreach ($group['items'] as $item) {
+            $element = $link_element_defaults;
+            // We do not check file_exists() here, because this code runs for
+            // files whose 'preprocess' is set to FALSE, and therefore, even
+            // when aggregation is enabled, and we want to avoid needlessly
+            // taxing a server that may be under heavy load. The file_exists()
+            // performed above for files whose 'preprocess' is TRUE is done for
+            // the benefit of theme .info files, but code that deals with files
+            // whose 'preprocess' is FALSE is responsible for ensuring the file
+            // exists.
+            // The dummy query string needs to be added to the URL to control
+            // browser-caching.
+            $query_string_separator = (strpos($item['data'], '?') !== FALSE) ? '&' : '?';
+            $element['#attributes']['href'] = file_create_url($item['data']) . $query_string_separator . $query_string;
+            $element['#attributes']['media'] = $item['media'];
+            $element['#browsers'] = $group['browsers'];
+            $elements[] = $element;
+          }
+        }
+        break;
+      // For inline content, the 'data' property contains the CSS content. If
+      // the group's 'data' property is set, then output it in a single STYLE
+      // tag. Otherwise, output a separate STYLE tag for each item.
+      case 'inline':
+        if (isset($group['data'])) {
+          $element = $style_element_defaults;
+          $element['#value'] = $group['data'];
+          $element['#value_prefix'] = $embed_prefix;
+          $element['#value_suffix'] = $embed_suffix;
+          $element['#attributes']['media'] = $group['media'];
+          $element['#browsers'] = $group['browsers'];
+          $elements[] = $element;
+        }
+        else {
+          foreach ($group['items'] as $item) {
+            $element = $style_element_defaults;
+            $element['#value'] = $item['data'];
+            $element['#value_prefix'] = $embed_prefix;
+            $element['#value_suffix'] = $embed_suffix;
+            $element['#attributes']['media'] = $item['media'];
+            $element['#browsers'] = $group['browsers'];
+            $elements[] = $element;
+          }
+        }
+        break;
+      // Output a LINK tag for each external item. The item's 'data' property
+      // contains the full URL.
+      case 'external':
+        foreach ($group['items'] as $item) {
+          $element = $link_element_defaults;
+          $element['#attributes']['href'] = $item['data'];
+          $element['#attributes']['media'] = $item['media'];
+          $element['#browsers'] = $group['browsers'];
+          $elements[] = $element;
+        }
+        break;
+    }
+  }
+
+  return $elements;
+}
+
+/**
+ * Aggregates and optimizes CSS files into a cache file in the files directory.
+ *
+ * The file name for the CSS cache file is generated from the hash of the
+ * aggregated contents of the files in $css. This forces proxies and browsers
+ * to download new CSS when the CSS changes.
+ *
+ * The cache file name is retrieved on a page load via a lookup variable that
+ * contains an associative array. The array key is the hash of the file names
+ * in $css while the value is the cache file name. The cache file is generated
+ * in two cases. First, if there is no file name value for the key, which will
+ * happen if a new file name has been added to $css or after the lookup
+ * variable is emptied to force a rebuild of the cache. Second, the cache file
+ * is generated if it is missing on disk. Old cache files are not deleted
+ * immediately when the lookup variable is emptied, but are deleted after a set
+ * period by drupal_delete_file_if_stale(). This ensures that files referenced
+ * by a cached page will still be available.
+ *
+ * @param $css
+ *   An array of CSS files to aggregate and compress into one file.
+ *
+ * @return
+ *   The URI of the CSS cache file, or FALSE if the file could not be saved.
+ */
+function drupal_build_css_cache($css) {
+  $data = '';
+  $uri = '';
+  $map = variable_get('drupal_css_cache_files', array());
+  // Create a new array so that only the file names are used to create the hash.
+  // This prevents new aggregates from being created unnecessarily.
+  $css_data = array();
+  foreach ($css as $css_file) {
+    $css_data[] = $css_file['data'];
+  }
+  $key = hash('sha256', serialize($css_data));
+  if (isset($map[$key])) {
+    $uri = $map[$key];
+  }
+
+  if (empty($uri) || !file_exists($uri)) {
+    // Build aggregate CSS file.
+    foreach ($css as $stylesheet) {
+      // Only 'file' stylesheets can be aggregated.
+      if ($stylesheet['type'] == 'file') {
+        $contents = drupal_load_stylesheet($stylesheet['data'], TRUE);
+
+        // Build the base URL of this CSS file: start with the full URL.
+        $css_base_url = file_create_url($stylesheet['data']);
+        // Move to the parent.
+        $css_base_url = substr($css_base_url, 0, strrpos($css_base_url, '/'));
+        // Simplify to a relative URL if the stylesheet URL starts with the
+        // base URL of the website.
+        if (substr($css_base_url, 0, strlen($GLOBALS['base_root'])) == $GLOBALS['base_root']) {
+          $css_base_url = substr($css_base_url, strlen($GLOBALS['base_root']));
+        }
+
+        _drupal_build_css_path(NULL, $css_base_url . '/');
+        // Anchor all paths in the CSS with its base URL, ignoring external and absolute paths.
+        $data .= preg_replace_callback('/url\(\s*[\'"]?(?![a-z]+:|\/+)([^\'")]+)[\'"]?\s*\)/i', '_drupal_build_css_path', $contents);
+      }
+    }
+
+    // Per the W3C specification at http://www.w3.org/TR/REC-CSS2/cascade.html#at-import,
+    // @import rules must proceed any other style, so we move those to the top.
+    $regexp = '/@import[^;]+;/i';
+    preg_match_all($regexp, $data, $matches);
+    $data = preg_replace($regexp, '', $data);
+    $data = implode('', $matches[0]) . $data;
+
+    // Prefix filename to prevent blocking by firewalls which reject files
+    // starting with "ad*".
+    $filename = 'css_' . drupal_hash_base64($data) . '.css';
+    // Create the css/ within the files folder.
+    $csspath = 'public://css';
+    $uri = $csspath . '/' . $filename;
+    // Create the CSS file.
+    file_prepare_directory($csspath, FILE_CREATE_DIRECTORY);
+    if (!file_exists($uri) && !file_unmanaged_save_data($data, $uri, FILE_EXISTS_REPLACE)) {
+      return FALSE;
+    }
+    // If CSS gzip compression is enabled, clean URLs are enabled (which means
+    // that rewrite rules are working) and the zlib extension is available then
+    // create a gzipped version of this file. This file is served conditionally
+    // to browsers that accept gzip using .htaccess rules.
+    if (variable_get('css_gzip_compression', TRUE) && variable_get('clean_url', 0) && extension_loaded('zlib')) {
+      if (!file_exists($uri . '.gz') && !file_unmanaged_save_data(gzencode($data, 9, FORCE_GZIP), $uri . '.gz', FILE_EXISTS_REPLACE)) {
+        return FALSE;
+      }
+    }
+    // Save the updated map.
+    $map[$key] = $uri;
+    variable_set('drupal_css_cache_files', $map);
+  }
+  return $uri;
+}
+
+/**
+ * Prefixes all paths within a CSS file for drupal_build_css_cache().
+ */
+function _drupal_build_css_path($matches, $base = NULL) {
+  $_base = &drupal_static(__FUNCTION__);
+  // Store base path for preg_replace_callback.
+  if (isset($base)) {
+    $_base = $base;
+  }
+
+  // Prefix with base and remove '../' segments where possible.
+  $path = $_base . $matches[1];
+  $last = '';
+  while ($path != $last) {
+    $last = $path;
+    $path = preg_replace('`(^|/)(?!\.\./)([^/]+)/\.\./`', '$1', $path);
+  }
+  return 'url(' . $path . ')';
+}
+
+/**
+ * Loads the stylesheet and resolves all @import commands.
+ *
+ * Loads a stylesheet and replaces @import commands with the contents of the
+ * imported file. Use this instead of file_get_contents when processing
+ * stylesheets.
+ *
+ * The returned contents are compressed removing white space and comments only
+ * when CSS aggregation is enabled. This optimization will not apply for
+ * color.module enabled themes with CSS aggregation turned off.
+ *
+ * @param $file
+ *   Name of the stylesheet to be processed.
+ * @param $optimize
+ *   Defines if CSS contents should be compressed or not.
+ * @param $reset_basepath
+ *   Used internally to facilitate recursive resolution of @import commands.
+ *
+ * @return
+ *   Contents of the stylesheet, including any resolved @import commands.
+ */
+function drupal_load_stylesheet($file, $optimize = NULL, $reset_basepath = TRUE) {
+  // These statics are not cache variables, so we don't use drupal_static().
+  static $_optimize, $basepath;
+  if ($reset_basepath) {
+    $basepath = '';
+  }
+  // Store the value of $optimize for preg_replace_callback with nested
+  // @import loops.
+  if (isset($optimize)) {
+    $_optimize = $optimize;
+  }
+
+  // Stylesheets are relative one to each other. Start by adding a base path
+  // prefix provided by the parent stylesheet (if necessary).
+  if ($basepath && !file_uri_scheme($file)) {
+    $file = $basepath . '/' . $file;
+  }
+  // Store the parent base path to restore it later.
+  $parent_base_path = $basepath;
+  // Set the current base path to process possible child imports.
+  $basepath = dirname($file);
+
+  // Load the CSS stylesheet. We suppress errors because themes may specify
+  // stylesheets in their .info file that don't exist in the theme's path,
+  // but are merely there to disable certain module CSS files.
+  $content = '';
+  if ($contents = @file_get_contents($file)) {
+    // Return the processed stylesheet.
+    $content = drupal_load_stylesheet_content($contents, $_optimize);
+  }
+
+  // Restore the parent base path as the file and its childen are processed.
+  $basepath = $parent_base_path;
+  return $content;
+}
+
+/**
+ * Processes the contents of a stylesheet for aggregation.
+ *
+ * @param $contents
+ *   The contents of the stylesheet.
+ * @param $optimize
+ *   (optional) Boolean whether CSS contents should be minified. Defaults to
+ *   FALSE.
+ *
+ * @return
+ *   Contents of the stylesheet including the imported stylesheets.
+ */
+function drupal_load_stylesheet_content($contents, $optimize = FALSE) {
+  // Remove multiple charset declarations for standards compliance (and fixing Safari problems).
+  $contents = preg_replace('/^@charset\s+[\'"](\S*?)\b[\'"];/i', '', $contents);
+
+  if ($optimize) {
+    // Perform some safe CSS optimizations.
+    // Regexp to match comment blocks.
+    $comment     = '/\*[^*]*\*+(?:[^/*][^*]*\*+)*/';
+    // Regexp to match double quoted strings.
+    $double_quot = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"';
+    // Regexp to match single quoted strings.
+    $single_quot = "'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'";
+    // Strip all comment blocks, but keep double/single quoted strings.
+    $contents = preg_replace(
+      "<($double_quot|$single_quot)|$comment>Ss",
+      "$1",
+      $contents
+    );
+    // Remove certain whitespace.
+    // There are different conditions for removing leading and trailing
+    // whitespace.
+    // @see http://php.net/manual/regexp.reference.subpatterns.php
+    $contents = preg_replace('<
+      # Strip leading and trailing whitespace.
+        \s*([@{};,])\s*
+      # Strip only leading whitespace from:
+      # - Closing parenthesis: Retain "@media (bar) and foo".
+      | \s+([\)])
+      # Strip only trailing whitespace from:
+      # - Opening parenthesis: Retain "@media (bar) and foo".
+      # - Colon: Retain :pseudo-selectors.
+      | ([\(:])\s+
+    >xS',
+      // Only one of the three capturing groups will match, so its reference
+      // will contain the wanted value and the references for the
+      // two non-matching groups will be replaced with empty strings.
+      '$1$2$3',
+      $contents
+    );
+    // End the file with a new line.
+    $contents = trim($contents);
+    $contents .= "\n";
+  }
+
+  // Replaces @import commands with the actual stylesheet content.
+  // This happens recursively but omits external files.
+  $contents = preg_replace_callback('/@import\s*(?:url\(\s*)?[\'"]?(?![a-z]+:)([^\'"\()]+)[\'"]?\s*\)?\s*;/', '_drupal_load_stylesheet', $contents);
+  return $contents;
+}
+
+/**
+ * Loads stylesheets recursively and returns contents with corrected paths.
+ *
+ * This function is used for recursive loading of stylesheets and
+ * returns the stylesheet content with all url() paths corrected.
+ */
+function _drupal_load_stylesheet($matches) {
+  $filename = $matches[1];
+  // Load the imported stylesheet and replace @import commands in there as well.
+  $file = drupal_load_stylesheet($filename, NULL, FALSE);
+
+  // Determine the file's directory.
+  $directory = dirname($filename);
+  // If the file is in the current directory, make sure '.' doesn't appear in
+  // the url() path.
+  $directory = $directory == '.' ? '' : $directory .'/';
+
+  // Alter all internal url() paths. Leave external paths alone. We don't need
+  // to normalize absolute paths here (i.e. remove folder/... segments) because
+  // that will be done later.
+  return preg_replace('/url\(\s*([\'"]?)(?![a-z]+:|\/+)/i', 'url(\1'. $directory, $file);
+}
+
+/**
+ * Deletes old cached CSS files.
+ */
+function drupal_clear_css_cache() {
+  variable_del('drupal_css_cache_files');
+  file_scan_directory('public://css', '/.*/', array('callback' => 'drupal_delete_file_if_stale'));
+}
+
+/**
+ * Callback to delete files modified more than a set time ago.
+ */
+function drupal_delete_file_if_stale($uri) {
+  // Default stale file threshold is 30 days.
+  if (REQUEST_TIME - filemtime($uri) > variable_get('drupal_stale_file_threshold', 2592000)) {
+    file_unmanaged_delete($uri);
+  }
+}
+
+/**
+ * Prepares a string for use as a CSS identifier (element, class, or ID name).
+ *
+ * http://www.w3.org/TR/CSS21/syndata.html#characters shows the syntax for valid
+ * CSS identifiers (including element names, classes, and IDs in selectors.)
+ *
+ * @param $identifier
+ *   The identifier to clean.
+ * @param $filter
+ *   An array of string replacements to use on the identifier.
+ *
+ * @return
+ *   The cleaned identifier.
+ */
+function drupal_clean_css_identifier($identifier, $filter = array(' ' => '-', '_' => '-', '/' => '-', '[' => '-', ']' => '')) {
+  // By default, we filter using Drupal's coding standards.
+  $identifier = strtr($identifier, $filter);
+
+  // Valid characters in a CSS identifier are:
+  // - the hyphen (U+002D)
+  // - a-z (U+0030 - U+0039)
+  // - A-Z (U+0041 - U+005A)
+  // - the underscore (U+005F)
+  // - 0-9 (U+0061 - U+007A)
+  // - ISO 10646 characters U+00A1 and higher
+  // We strip out any character not in the above list.
+  $identifier = preg_replace('/[^\x{002D}\x{0030}-\x{0039}\x{0041}-\x{005A}\x{005F}\x{0061}-\x{007A}\x{00A1}-\x{FFFF}]/u', '', $identifier);
+
+  return $identifier;
+}
+
+/**
+ * Prepares a string for use as a valid class name.
+ *
+ * Do not pass one string containing multiple classes as they will be
+ * incorrectly concatenated with dashes, i.e. "one two" will become "one-two".
+ *
+ * @param $class
+ *   The class name to clean.
+ *
+ * @return
+ *   The cleaned class name.
+ */
+function drupal_html_class($class) {
+  // The output of this function will never change, so this uses a normal
+  // static instead of drupal_static().
+  static $classes = array();
+
+  if (!isset($classes[$class])) {
+    $classes[$class] = drupal_clean_css_identifier(drupal_strtolower($class));
+  }
+  return $classes[$class];
+}
+
+/**
+ * Prepares a string for use as a valid HTML ID and guarantees uniqueness.
+ *
+ * This function ensures that each passed HTML ID value only exists once on the
+ * page. By tracking the already returned ids, this function enables forms,
+ * blocks, and other content to be output multiple times on the same page,
+ * without breaking (X)HTML validation.
+ *
+ * For already existing IDs, a counter is appended to the ID string. Therefore,
+ * JavaScript and CSS code should not rely on any value that was generated by
+ * this function and instead should rely on manually added CSS classes or
+ * similarly reliable constructs.
+ *
+ * Two consecutive hyphens separate the counter from the original ID. To manage
+ * uniqueness across multiple Ajax requests on the same page, Ajax requests
+ * POST an array of all IDs currently present on the page, which are used to
+ * prime this function's cache upon first invocation.
+ *
+ * To allow reverse-parsing of IDs submitted via Ajax, any multiple consecutive
+ * hyphens in the originally passed $id are replaced with a single hyphen.
+ *
+ * @param $id
+ *   The ID to clean.
+ *
+ * @return
+ *   The cleaned ID.
+ */
+function drupal_html_id($id) {
+  // If this is an Ajax request, then content returned by this page request will
+  // be merged with content already on the base page. The HTML IDs must be
+  // unique for the fully merged content. Therefore, initialize $seen_ids to
+  // take into account IDs that are already in use on the base page.
+  $seen_ids_init = &drupal_static(__FUNCTION__ . ':init');
+  if (!isset($seen_ids_init)) {
+    // Ideally, Drupal would provide an API to persist state information about
+    // prior page requests in the database, and we'd be able to add this
+    // function's $seen_ids static variable to that state information in order
+    // to have it properly initialized for this page request. However, no such
+    // page state API exists, so instead, ajax.js adds all of the in-use HTML
+    // IDs to the POST data of Ajax submissions. Direct use of $_POST is
+    // normally not recommended as it could open up security risks, but because
+    // the raw POST data is cast to a number before being returned by this
+    // function, this usage is safe.
+    if (empty($_POST['ajax_html_ids'])) {
+      $seen_ids_init = array();
+    }
+    else {
+      // This function ensures uniqueness by appending a counter to the base id
+      // requested by the calling function after the first occurrence of that
+      // requested id. $_POST['ajax_html_ids'] contains the ids as they were
+      // returned by this function, potentially with the appended counter, so
+      // we parse that to reconstruct the $seen_ids array.
+      if (isset($_POST['ajax_html_ids'][0]) && strpos($_POST['ajax_html_ids'][0], ',') === FALSE) {
+        $ajax_html_ids = $_POST['ajax_html_ids'];
+      }
+      else {
+        // jquery.form.js may send the server a comma-separated string as the
+        // first element of an array (see http://drupal.org/node/1575060), so
+        // we need to convert it to an array in that case.
+        $ajax_html_ids = explode(',', $_POST['ajax_html_ids'][0]);
+      }
+      foreach ($ajax_html_ids as $seen_id) {
+        // We rely on '--' being used solely for separating a base id from the
+        // counter, which this function ensures when returning an id.
+        $parts = explode('--', $seen_id, 2);
+        if (!empty($parts[1]) && is_numeric($parts[1])) {
+          list($seen_id, $i) = $parts;
+        }
+        else {
+          $i = 1;
+        }
+        if (!isset($seen_ids_init[$seen_id]) || ($i > $seen_ids_init[$seen_id])) {
+          $seen_ids_init[$seen_id] = $i;
+        }
+      }
+    }
+  }
+  $seen_ids = &drupal_static(__FUNCTION__, $seen_ids_init);
+
+  $id = strtr(drupal_strtolower($id), array(' ' => '-', '_' => '-', '[' => '-', ']' => ''));
+
+  // As defined in http://www.w3.org/TR/html4/types.html#type-name, HTML IDs can
+  // only contain letters, digits ([0-9]), hyphens ("-"), underscores ("_"),
+  // colons (":"), and periods ("."). We strip out any character not in that
+  // list. Note that the CSS spec doesn't allow colons or periods in identifiers
+  // (http://www.w3.org/TR/CSS21/syndata.html#characters), so we strip those two
+  // characters as well.
+  $id = preg_replace('/[^A-Za-z0-9\-_]/', '', $id);
+
+  // Removing multiple consecutive hyphens.
+  $id = preg_replace('/\-+/', '-', $id);
+  // Ensure IDs are unique by appending a counter after the first occurrence.
+  // The counter needs to be appended with a delimiter that does not exist in
+  // the base ID. Requiring a unique delimiter helps ensure that we really do
+  // return unique IDs and also helps us re-create the $seen_ids array during
+  // Ajax requests.
+  if (isset($seen_ids[$id])) {
+    $id = $id . '--' . ++$seen_ids[$id];
+  }
+  else {
+    $seen_ids[$id] = 1;
+  }
+
+  return $id;
+}
+
+/**
+ * Provides a standard HTML class name that identifies a page region.
+ *
+ * It is recommended that template preprocess functions apply this class to any
+ * page region that is output by the theme (Drupal core already handles this in
+ * the standard template preprocess implementation). Standardizing the class
+ * names in this way allows modules to implement certain features, such as
+ * drag-and-drop or dynamic Ajax loading, in a theme-independent way.
+ *
+ * @param $region
+ *   The name of the page region (for example, 'page_top' or 'content').
+ *
+ * @return
+ *   An HTML class that identifies the region (for example, 'region-page-top'
+ *   or 'region-content').
+ *
+ * @see template_preprocess_region()
+ */
+function drupal_region_class($region) {
+  return drupal_html_class("region-$region");
+}
+
+/**
+ * Adds a JavaScript file, setting, or inline code to the page.
+ *
+ * The behavior of this function depends on the parameters it is called with.
+ * Generally, it handles the addition of JavaScript to the page, either as
+ * reference to an existing file or as inline code. The following actions can be
+ * performed using this function:
+ * - Add a file ('file'): Adds a reference to a JavaScript file to the page.
+ * - Add inline JavaScript code ('inline'): Executes a piece of JavaScript code
+ *   on the current page by placing the code directly in the page (for example,
+ *   to tell the user that a new message arrived, by opening a pop up, alert
+ *   box, etc.). This should only be used for JavaScript that cannot be executed
+ *   from a file. When adding inline code, make sure that you are not relying on
+ *   $() being the jQuery function. Wrap your code in
+ *   @code (function ($) {... })(jQuery); @endcode
+ *   or use jQuery() instead of $().
+ * - Add external JavaScript ('external'): Allows the inclusion of external
+ *   JavaScript files that are not hosted on the local server. Note that these
+ *   external JavaScript references do not get aggregated when preprocessing is
+ *   on.
+ * - Add settings ('setting'): Adds settings to Drupal's global storage of
+ *   JavaScript settings. Per-page settings are required by some modules to
+ *   function properly. All settings will be accessible at Drupal.settings.
+ *
+ * Examples:
+ * @code
+ *   drupal_add_js('misc/collapse.js');
+ *   drupal_add_js('misc/collapse.js', 'file');
+ *   drupal_add_js('jQuery(document).ready(function () { alert("Hello!"); });', 'inline');
+ *   drupal_add_js('jQuery(document).ready(function () { alert("Hello!"); });',
+ *     array('type' => 'inline', 'scope' => 'footer', 'weight' => 5)
+ *   );
+ *   drupal_add_js('http://example.com/example.js', 'external');
+ *   drupal_add_js(array('myModule' => array('key' => 'value')), 'setting');
+ * @endcode
+ *
+ * Calling drupal_static_reset('drupal_add_js') will clear all JavaScript added
+ * so far.
+ *
+ * If JavaScript aggregation is enabled, all JavaScript files added with
+ * $options['preprocess'] set to TRUE will be merged into one aggregate file.
+ * Preprocessed inline JavaScript will not be aggregated into this single file.
+ * Externally hosted JavaScripts are never aggregated.
+ *
+ * The reason for aggregating the files is outlined quite thoroughly here:
+ * http://www.die.net/musings/page_load_time/ "Load fewer external objects. Due
+ * to request overhead, one bigger file just loads faster than two smaller ones
+ * half its size."
+ *
+ * $options['preprocess'] should be only set to TRUE when a file is required for
+ * all typical visitors and most pages of a site. It is critical that all
+ * preprocessed files are added unconditionally on every page, even if the
+ * files are not needed on a page. This is normally done by calling
+ * drupal_add_js() in a hook_init() implementation.
+ *
+ * Non-preprocessed files should only be added to the page when they are
+ * actually needed.
+ *
+ * @param $data
+ *   (optional) If given, the value depends on the $options parameter, or
+ *   $options['type'] if $options is passed as an associative array:
+ *   - 'file': Path to the file relative to base_path().
+ *   - 'inline': The JavaScript code that should be placed in the given scope.
+ *   - 'external': The absolute path to an external JavaScript file that is not
+ *     hosted on the local server. These files will not be aggregated if
+ *     JavaScript aggregation is enabled.
+ *   - 'setting': An associative array with configuration options. The array is
+ *     merged directly into Drupal.settings. All modules should wrap their
+ *     actual configuration settings in another variable to prevent conflicts in
+ *     the Drupal.settings namespace. Items added with a string key will replace
+ *     existing settings with that key; items with numeric array keys will be
+ *     added to the existing settings array.
+ * @param $options
+ *   (optional) A string defining the type of JavaScript that is being added in
+ *   the $data parameter ('file'/'setting'/'inline'/'external'), or an
+ *   associative array. JavaScript settings should always pass the string
+ *   'setting' only. Other types can have the following elements in the array:
+ *   - type: The type of JavaScript that is to be added to the page. Allowed
+ *     values are 'file', 'inline', 'external' or 'setting'. Defaults
+ *     to 'file'.
+ *   - scope: The location in which you want to place the script. Possible
+ *     values are 'header' or 'footer'. If your theme implements different
+ *     regions, you can also use these. Defaults to 'header'.
+ *   - group: A number identifying the group in which to add the JavaScript.
+ *     Available constants are:
+ *     - JS_LIBRARY: Any libraries, settings, or jQuery plugins.
+ *     - JS_DEFAULT: Any module-layer JavaScript.
+ *     - JS_THEME: Any theme-layer JavaScript.
+ *     The group number serves as a weight: JavaScript within a lower weight
+ *     group is presented on the page before JavaScript within a higher weight
+ *     group.
+ *   - every_page: For optimal front-end performance when aggregation is
+ *     enabled, this should be set to TRUE if the JavaScript is present on every
+ *     page of the website for users for whom it is present at all. This
+ *     defaults to FALSE. It is set to TRUE for JavaScript files that are added
+ *     via module and theme .info files. Modules that add JavaScript within
+ *     hook_init() implementations, or from other code that ensures that the
+ *     JavaScript is added to all website pages, should also set this flag to
+ *     TRUE. All JavaScript files within the same group and that have the
+ *     'every_page' flag set to TRUE and do not have 'preprocess' set to FALSE
+ *     are aggregated together into a single aggregate file, and that aggregate
+ *     file can be reused across a user's entire site visit, leading to faster
+ *     navigation between pages. However, JavaScript that is only needed on
+ *     pages less frequently visited, can be added by code that only runs for
+ *     those particular pages, and that code should not set the 'every_page'
+ *     flag. This minimizes the size of the aggregate file that the user needs
+ *     to download when first visiting the website. JavaScript without the
+ *     'every_page' flag is aggregated into a separate aggregate file. This
+ *     other aggregate file is likely to change from page to page, and each new
+ *     aggregate file needs to be downloaded when first encountered, so it
+ *     should be kept relatively small by ensuring that most commonly needed
+ *     JavaScript is added to every page.
+ *   - weight: A number defining the order in which the JavaScript is added to
+ *     the page relative to other JavaScript with the same 'scope', 'group',
+ *     and 'every_page' value. In some cases, the order in which the JavaScript
+ *     is presented on the page is very important. jQuery, for example, must be
+ *     added to the page before any jQuery code is run, so jquery.js uses the
+ *     JS_LIBRARY group and a weight of -20, jquery.once.js (a library drupal.js
+ *     depends on) uses the JS_LIBRARY group and a weight of -19, drupal.js uses
+ *     the JS_LIBRARY group and a weight of -1, other libraries use the
+ *     JS_LIBRARY group and a weight of 0 or higher, and all other scripts use
+ *     one of the other group constants. The exact ordering of JavaScript is as
+ *     follows:
+ *     - First by scope, with 'header' first, 'footer' last, and any other
+ *       scopes provided by a custom theme coming in between, as determined by
+ *       the theme.
+ *     - Then by group.
+ *     - Then by the 'every_page' flag, with TRUE coming before FALSE.
+ *     - Then by weight.
+ *     - Then by the order in which the JavaScript was added. For example, all
+ *       else being the same, JavaScript added by a call to drupal_add_js() that
+ *       happened later in the page request gets added to the page after one for
+ *       which drupal_add_js() happened earlier in the page request.
+ *   - defer: If set to TRUE, the defer attribute is set on the <script>
+ *     tag. Defaults to FALSE.
+ *   - cache: If set to FALSE, the JavaScript file is loaded anew on every page
+ *     call; in other words, it is not cached. Used only when 'type' references
+ *     a JavaScript file. Defaults to TRUE.
+ *   - preprocess: If TRUE and JavaScript aggregation is enabled, the script
+ *     file will be aggregated. Defaults to TRUE.
+ *
+ * @return
+ *   The current array of JavaScript files, settings, and in-line code,
+ *   including Drupal defaults, anything previously added with calls to
+ *   drupal_add_js(), and this function call's additions.
+ *
+ * @see drupal_get_js()
+ */
+function drupal_add_js($data = NULL, $options = NULL) {
+  $javascript = &drupal_static(__FUNCTION__, array());
+
+  // Construct the options, taking the defaults into consideration.
+  if (isset($options)) {
+    if (!is_array($options)) {
+      $options = array('type' => $options);
+    }
+  }
+  else {
+    $options = array();
+  }
+  $options += drupal_js_defaults($data);
+
+  // Preprocess can only be set if caching is enabled.
+  $options['preprocess'] = $options['cache'] ? $options['preprocess'] : FALSE;
+
+  // Tweak the weight so that files of the same weight are included in the
+  // order of the calls to drupal_add_js().
+  $options['weight'] += count($javascript) / 1000;
+
+  if (isset($data)) {
+    // Add jquery.js and drupal.js, as well as the basePath setting, the
+    // first time a JavaScript file is added.
+    if (empty($javascript)) {
+      // url() generates the prefix using hook_url_outbound_alter(). Instead of
+      // running the hook_url_outbound_alter() again here, extract the prefix
+      // from url().
+      url('', array('prefix' => &$prefix));
+      $javascript = array(
+        'settings' => array(
+          'data' => array(
+            array('basePath' => base_path()),
+            array('pathPrefix' => empty($prefix) ? '' : $prefix),
+          ),
+          'type' => 'setting',
+          'scope' => 'header',
+          'group' => JS_LIBRARY,
+          'every_page' => TRUE,
+          'weight' => 0,
+        ),
+        'misc/drupal.js' => array(
+          'data' => 'misc/drupal.js',
+          'type' => 'file',
+          'scope' => 'header',
+          'group' => JS_LIBRARY,
+          'every_page' => TRUE,
+          'weight' => -1,
+          'preprocess' => TRUE,
+          'cache' => TRUE,
+          'defer' => FALSE,
+        ),
+      );
+      // Register all required libraries.
+      drupal_add_library('system', 'jquery', TRUE);
+      drupal_add_library('system', 'jquery.once', TRUE);
+    }
+
+    switch ($options['type']) {
+      case 'setting':
+        // All JavaScript settings are placed in the header of the page with
+        // the library weight so that inline scripts appear afterwards.
+        $javascript['settings']['data'][] = $data;
+        break;
+
+      case 'inline':
+        $javascript[] = $options;
+        break;
+
+      default: // 'file' and 'external'
+        // Local and external files must keep their name as the associative key
+        // so the same JavaScript file is not added twice.
+        $javascript[$options['data']] = $options;
+    }
+  }
+  return $javascript;
+}
+
+/**
+ * Constructs an array of the defaults that are used for JavaScript items.
+ *
+ * @param $data
+ *   (optional) The default data parameter for the JavaScript item array.
+ *
+ * @see drupal_get_js()
+ * @see drupal_add_js()
+ */
+function drupal_js_defaults($data = NULL) {
+  return array(
+    'type' => 'file',
+    'group' => JS_DEFAULT,
+    'every_page' => FALSE,
+    'weight' => 0,
+    'scope' => 'header',
+    'cache' => TRUE,
+    'defer' => FALSE,
+    'preprocess' => TRUE,
+    'version' => NULL,
+    'data' => $data,
+  );
+}
+
+/**
+ * Returns a themed presentation of all JavaScript code for the current page.
+ *
+ * References to JavaScript files are placed in a certain order: first, all
+ * 'core' files, then all 'module' and finally all 'theme' JavaScript files
+ * are added to the page. Then, all settings are output, followed by 'inline'
+ * JavaScript code. If running update.php, all preprocessing is disabled.
+ *
+ * Note that hook_js_alter(&$javascript) is called during this function call
+ * to allow alterations of the JavaScript during its presentation. Calls to
+ * drupal_add_js() from hook_js_alter() will not be added to the output
+ * presentation. The correct way to add JavaScript during hook_js_alter()
+ * is to add another element to the $javascript array, deriving from
+ * drupal_js_defaults(). See locale_js_alter() for an example of this.
+ *
+ * @param $scope
+ *   (optional) The scope for which the JavaScript rules should be returned.
+ *   Defaults to 'header'.
+ * @param $javascript
+ *   (optional) An array with all JavaScript code. Defaults to the default
+ *   JavaScript array for the given scope.
+ * @param $skip_alter
+ *   (optional) If set to TRUE, this function skips calling drupal_alter() on
+ *   $javascript, useful when the calling function passes a $javascript array
+ *   that has already been altered.
+ *
+ * @return
+ *   All JavaScript code segments and includes for the scope as HTML tags.
+ *
+ * @see drupal_add_js()
+ * @see locale_js_alter()
+ * @see drupal_js_defaults()
+ */
+function drupal_get_js($scope = 'header', $javascript = NULL, $skip_alter = FALSE) {
+  if (!isset($javascript)) {
+    $javascript = drupal_add_js();
+  }
+  if (empty($javascript)) {
+    return '';
+  }
+
+  // Allow modules to alter the JavaScript.
+  if (!$skip_alter) {
+    drupal_alter('js', $javascript);
+  }
+
+  // Filter out elements of the given scope.
+  $items = array();
+  foreach ($javascript as $key => $item) {
+    if ($item['scope'] == $scope) {
+      $items[$key] = $item;
+    }
+  }
+
+  $output = '';
+  // The index counter is used to keep aggregated and non-aggregated files in
+  // order by weight.
+  $index = 1;
+  $processed = array();
+  $files = array();
+  $preprocess_js = (variable_get('preprocess_js', FALSE) && (!defined('MAINTENANCE_MODE') || MAINTENANCE_MODE != 'update'));
+
+  // A dummy query-string is added to filenames, to gain control over
+  // browser-caching. The string changes on every update or full cache
+  // flush, forcing browsers to load a new copy of the files, as the
+  // URL changed. Files that should not be cached (see drupal_add_js())
+  // get REQUEST_TIME as query-string instead, to enforce reload on every
+  // page request.
+  $default_query_string = variable_get('css_js_query_string', '0');
+
+  // For inline JavaScript to validate as XHTML, all JavaScript containing
+  // XHTML needs to be wrapped in CDATA. To make that backwards compatible
+  // with HTML 4, we need to comment out the CDATA-tag.
+  $embed_prefix = "\n<!--//--><![CDATA[//><!--\n";
+  $embed_suffix = "\n//--><!]]>\n";
+
+  // Since JavaScript may look for arguments in the URL and act on them, some
+  // third-party code might require the use of a different query string.
+  $js_version_string = variable_get('drupal_js_version_query_string', 'v=');
+
+  // Sort the JavaScript so that it appears in the correct order.
+  uasort($items, 'drupal_sort_css_js');
+
+  // Provide the page with information about the individual JavaScript files
+  // used, information not otherwise available when aggregation is enabled.
+  $setting['ajaxPageState']['js'] = array_fill_keys(array_keys($items), 1);
+  unset($setting['ajaxPageState']['js']['settings']);
+  drupal_add_js($setting, 'setting');
+
+  // If we're outputting the header scope, then this might be the final time
+  // that drupal_get_js() is running, so add the setting to this output as well
+  // as to the drupal_add_js() cache. If $items['settings'] doesn't exist, it's
+  // because drupal_get_js() was intentionally passed a $javascript argument
+  // stripped off settings, potentially in order to override how settings get
+  // output, so in this case, do not add the setting to this output.
+  if ($scope == 'header' && isset($items['settings'])) {
+    $items['settings']['data'][] = $setting;
+  }
+
+  // Loop through the JavaScript to construct the rendered output.
+  $element = array(
+    '#tag' => 'script',
+    '#value' => '',
+    '#attributes' => array(
+      'type' => 'text/javascript',
+    ),
+  );
+  foreach ($items as $item) {
+    $query_string =  empty($item['version']) ? $default_query_string : $js_version_string . $item['version'];
+
+    switch ($item['type']) {
+      case 'setting':
+        $js_element = $element;
+        $js_element['#value_prefix'] = $embed_prefix;
+        $js_element['#value'] = 'jQuery.extend(Drupal.settings, ' . drupal_json_encode(drupal_array_merge_deep_array($item['data'])) . ");";
+        $js_element['#value_suffix'] = $embed_suffix;
+        $output .= theme('html_tag', array('element' => $js_element));
+        break;
+
+      case 'inline':
+        $js_element = $element;
+        if ($item['defer']) {
+          $js_element['#attributes']['defer'] = 'defer';
+        }
+        $js_element['#value_prefix'] = $embed_prefix;
+        $js_element['#value'] = $item['data'];
+        $js_element['#value_suffix'] = $embed_suffix;
+        $processed[$index++] = theme('html_tag', array('element' => $js_element));
+        break;
+
+      case 'file':
+        $js_element = $element;
+        if (!$item['preprocess'] || !$preprocess_js) {
+          if ($item['defer']) {
+            $js_element['#attributes']['defer'] = 'defer';
+          }
+          $query_string_separator = (strpos($item['data'], '?') !== FALSE) ? '&' : '?';
+          $js_element['#attributes']['src'] = file_create_url($item['data']) . $query_string_separator . ($item['cache'] ? $query_string : REQUEST_TIME);
+          $processed[$index++] = theme('html_tag', array('element' => $js_element));
+        }
+        else {
+          // By increasing the index for each aggregated file, we maintain
+          // the relative ordering of JS by weight. We also set the key such
+          // that groups are split by items sharing the same 'group' value and
+          // 'every_page' flag. While this potentially results in more aggregate
+          // files, it helps make each one more reusable across a site visit,
+          // leading to better front-end performance of a website as a whole.
+          // See drupal_add_js() for details.
+          $key = 'aggregate_' . $item['group'] . '_' . $item['every_page'] . '_' . $index;
+          $processed[$key] = '';
+          $files[$key][$item['data']] = $item;
+        }
+        break;
+
+      case 'external':
+        $js_element = $element;
+        // Preprocessing for external JavaScript files is ignored.
+        if ($item['defer']) {
+          $js_element['#attributes']['defer'] = 'defer';
+        }
+        $js_element['#attributes']['src'] = $item['data'];
+        $processed[$index++] = theme('html_tag', array('element' => $js_element));
+        break;
+    }
+  }
+
+  // Aggregate any remaining JS files that haven't already been output.
+  if ($preprocess_js && count($files) > 0) {
+    foreach ($files as $key => $file_set) {
+      $uri = drupal_build_js_cache($file_set);
+      // Only include the file if was written successfully. Errors are logged
+      // using watchdog.
+      if ($uri) {
+        $preprocess_file = file_create_url($uri);
+        $js_element = $element;
+        $js_element['#attributes']['src'] = $preprocess_file;
+        $processed[$key] = theme('html_tag', array('element' => $js_element));
+      }
+    }
+  }
+
+  // Keep the order of JS files consistent as some are preprocessed and others are not.
+  // Make sure any inline or JS setting variables appear last after libraries have loaded.
+  return implode('', $processed) . $output;
+}
+
+/**
+ * Adds attachments to a render() structure.
+ *
+ * Libraries, JavaScript, CSS and other types of custom structures are attached
+ * to elements using the #attached property. The #attached property is an
+ * associative array, where the keys are the the attachment types and the values
+ * are the attached data. For example:
+ * @code
+ * $build['#attached'] = array(
+ *   'js' => array(drupal_get_path('module', 'taxonomy') . '/taxonomy.js'),
+ *   'css' => array(drupal_get_path('module', 'taxonomy') . '/taxonomy.css'),
+ * );
+ * @endcode
+ *
+ * 'js', 'css', and 'library' are types that get special handling. For any
+ * other kind of attached data, the array key must be the full name of the
+ * callback function and each value an array of arguments. For example:
+ * @code
+ * $build['#attached']['drupal_add_http_header'] = array(
+ *   array('Content-Type', 'application/rss+xml; charset=utf-8'),
+ * );
+ * @endcode
+ *
+ * External 'js' and 'css' files can also be loaded. For example:
+ * @code
+ * $build['#attached']['js'] = array(
+ *   'http://code.jquery.com/jquery-1.4.2.min.js' => array(
+ *     'type' => 'external',
+ *   ),
+ * );
+ * @endcode
+ *
+ * @param $elements
+ *   The structured array describing the data being rendered.
+ * @param $group
+ *   The default group of JavaScript and CSS being added. This is only applied
+ *   to the stylesheets and JavaScript items that don't have an explicit group
+ *   assigned to them.
+ * @param $dependency_check
+ *   When TRUE, will exit if a given library's dependencies are missing. When
+ *   set to FALSE, will continue to add the libraries, even though one or more
+ *   dependencies are missing. Defaults to FALSE.
+ * @param $every_page
+ *   Set to TRUE to indicate that the attachments are added to every page on the
+ *   site. Only attachments with the every_page flag set to TRUE can participate
+ *   in JavaScript/CSS aggregation.
+ *
+ * @return
+ *   FALSE if there were any missing library dependencies; TRUE if all library
+ *   dependencies were met.
+ *
+ * @see drupal_add_library()
+ * @see drupal_add_js()
+ * @see drupal_add_css()
+ * @see drupal_render()
+ */
+function drupal_process_attached($elements, $group = JS_DEFAULT, $dependency_check = FALSE, $every_page = NULL) {
+  // Add defaults to the special attached structures that should be processed differently.
+  $elements['#attached'] += array(
+    'library' => array(),
+    'js' => array(),
+    'css' => array(),
+  );
+
+  // Add the libraries first.
+  $success = TRUE;
+  foreach ($elements['#attached']['library'] as $library) {
+    if (drupal_add_library($library[0], $library[1], $every_page) === FALSE) {
+      $success = FALSE;
+      // Exit if the dependency is missing.
+      if ($dependency_check) {
+        return $success;
+      }
+    }
+  }
+  unset($elements['#attached']['library']);
+
+  // Add both the JavaScript and the CSS.
+  // The parameters for drupal_add_js() and drupal_add_css() require special
+  // handling.
+  foreach (array('js', 'css') as $type) {
+    foreach ($elements['#attached'][$type] as $data => $options) {
+      // If the value is not an array, it's a filename and passed as first
+      // (and only) argument.
+      if (!is_array($options)) {
+        $data = $options;
+        $options = NULL;
+      }
+      // In some cases, the first parameter ($data) is an array. Arrays can't be
+      // passed as keys in PHP, so we have to get $data from the value array.
+      if (is_numeric($data)) {
+        $data = $options['data'];
+        unset($options['data']);
+      }
+      // Apply the default group if it isn't explicitly given.
+      if (!isset($options['group'])) {
+        $options['group'] = $group;
+      }
+      // Set the every_page flag if one was passed.
+      if (isset($every_page)) {
+        $options['every_page'] = $every_page;
+      }
+      call_user_func('drupal_add_' . $type, $data, $options);
+    }
+    unset($elements['#attached'][$type]);
+  }
+
+  // Add additional types of attachments specified in the render() structure.
+  // Libraries, JavaScript and CSS have been added already, as they require
+  // special handling.
+  foreach ($elements['#attached'] as $callback => $options) {
+    if (function_exists($callback)) {
+      foreach ($elements['#attached'][$callback] as $args) {
+        call_user_func_array($callback, $args);
+      }
+    }
+  }
+
+  return $success;
+}
+
+/**
+ * Adds JavaScript to change the state of an element based on another element.
+ *
+ * A "state" means a certain property on a DOM element, such as "visible" or
+ * "checked". A state can be applied to an element, depending on the state of
+ * another element on the page. In general, states depend on HTML attributes and
+ * DOM element properties, which change due to user interaction.
+ *
+ * Since states are driven by JavaScript only, it is important to understand
+ * that all states are applied on presentation only, none of the states force
+ * any server-side logic, and that they will not be applied for site visitors
+ * without JavaScript support. All modules implementing states have to make
+ * sure that the intended logic also works without JavaScript being enabled.
+ *
+ * #states is an associative array in the form of:
+ * @code
+ * array(
+ *   STATE1 => CONDITIONS_ARRAY1,
+ *   STATE2 => CONDITIONS_ARRAY2,
+ *   ...
+ * )
+ * @endcode
+ * Each key is the name of a state to apply to the element, such as 'visible'.
+ * Each value is a list of conditions that denote when the state should be
+ * applied.
+ *
+ * Multiple different states may be specified to act on complex conditions:
+ * @code
+ * array(
+ *   'visible' => CONDITIONS,
+ *   'checked' => OTHER_CONDITIONS,
+ * )
+ * @endcode
+ *
+ * Every condition is a key/value pair, whose key is a jQuery selector that
+ * denotes another element on the page, and whose value is an array of
+ * conditions, which must bet met on that element:
+ * @code
+ * array(
+ *   'visible' => array(
+ *     JQUERY_SELECTOR => REMOTE_CONDITIONS,
+ *     JQUERY_SELECTOR => REMOTE_CONDITIONS,
+ *     ...
+ *   ),
+ * )
+ * @endcode
+ * All conditions must be met for the state to be applied.
+ *
+ * Each remote condition is a key/value pair specifying conditions on the other
+ * element that need to be met to apply the state to the element:
+ * @code
+ * array(
+ *   'visible' => array(
+ *     ':input[name="remote_checkbox"]' => array('checked' => TRUE),
+ *   ),
+ * )
+ * @endcode
+ *
+ * For example, to show a textfield only when a checkbox is checked:
+ * @code
+ * $form['toggle_me'] = array(
+ *   '#type' => 'checkbox',
+ *   '#title' => t('Tick this box to type'),
+ * );
+ * $form['settings'] = array(
+ *   '#type' => 'textfield',
+ *   '#states' => array(
+ *     // Only show this field when the 'toggle_me' checkbox is enabled.
+ *     'visible' => array(
+ *       ':input[name="toggle_me"]' => array('checked' => TRUE),
+ *     ),
+ *   ),
+ * );
+ * @endcode
+ *
+ * The following states may be applied to an element:
+ * - enabled
+ * - disabled
+ * - required
+ * - optional
+ * - visible
+ * - invisible
+ * - checked
+ * - unchecked
+ * - expanded
+ * - collapsed
+ *
+ * The following states may be used in remote conditions:
+ * - empty
+ * - filled
+ * - checked
+ * - unchecked
+ * - expanded
+ * - collapsed
+ * - value
+ *
+ * The following states exist for both elements and remote conditions, but are
+ * not fully implemented and may not change anything on the element:
+ * - relevant
+ * - irrelevant
+ * - valid
+ * - invalid
+ * - touched
+ * - untouched
+ * - readwrite
+ * - readonly
+ *
+ * When referencing select lists and radio buttons in remote conditions, a
+ * 'value' condition must be used:
+ * @code
+ *   '#states' => array(
+ *     // Show the settings if 'bar' has been selected for 'foo'.
+ *     'visible' => array(
+ *       ':input[name="foo"]' => array('value' => 'bar'),
+ *     ),
+ *   ),
+ * @endcode
+ *
+ * @param $elements
+ *   A renderable array element having a #states property as described above.
+ *
+ * @see form_example_states_form()
+ */
+function drupal_process_states(&$elements) {
+  $elements['#attached']['library'][] = array('system', 'drupal.states');
+  $elements['#attached']['js'][] = array(
+    'type' => 'setting',
+    'data' => array('states' => array('#' . $elements['#id'] => $elements['#states'])),
+  );
+}
+
+/**
+ * Adds multiple JavaScript or CSS files at the same time.
+ *
+ * A library defines a set of JavaScript and/or CSS files, optionally using
+ * settings, and optionally requiring another library. For example, a library
+ * can be a jQuery plugin, a JavaScript framework, or a CSS framework. This
+ * function allows modules to load a library defined/shipped by itself or a
+ * depending module, without having to add all files of the library separately.
+ * Each library is only loaded once.
+ *
+ * @param $module
+ *   The name of the module that registered the library.
+ * @param $name
+ *   The name of the library to add.
+ * @param $every_page
+ *   Set to TRUE if this library is added to every page on the site. Only items
+ *   with the every_page flag set to TRUE can participate in aggregation.
+ *
+ * @return
+ *   TRUE if the library was successfully added; FALSE if the library or one of
+ *   its dependencies could not be added.
+ *
+ * @see drupal_get_library()
+ * @see hook_library()
+ * @see hook_library_alter()
+ */
+function drupal_add_library($module, $name, $every_page = NULL) {
+  $added = &drupal_static(__FUNCTION__, array());
+
+  // Only process the library if it exists and it was not added already.
+  if (!isset($added[$module][$name])) {
+    if ($library = drupal_get_library($module, $name)) {
+      // Add all components within the library.
+      $elements['#attached'] = array(
+        'library' => $library['dependencies'],
+        'js' => $library['js'],
+        'css' => $library['css'],
+      );
+      $added[$module][$name] = drupal_process_attached($elements, JS_LIBRARY, TRUE, $every_page);
+    }
+    else {
+      // Requested library does not exist.
+      $added[$module][$name] = FALSE;
+    }
+  }
+
+  return $added[$module][$name];
+}
+
+/**
+ * Retrieves information for a JavaScript/CSS library.
+ *
+ * Library information is statically cached. Libraries are keyed by module for
+ * several reasons:
+ * - Libraries are not unique. Multiple modules might ship with the same library
+ *   in a different version or variant. This registry cannot (and does not
+ *   attempt to) prevent library conflicts.
+ * - Modules implementing and thereby depending on a library that is registered
+ *   by another module can only rely on that module's library.
+ * - Two (or more) modules can still register the same library and use it
+ *   without conflicts in case the libraries are loaded on certain pages only.
+ *
+ * @param $module
+ *   The name of a module that registered a library.
+ * @param $name
+ *   (optional) The name of a registered library to retrieve. By default, all
+ *   libraries registered by $module are returned.
+ *
+ * @return
+ *   The definition of the requested library, if $name was passed and it exists,
+ *   or FALSE if it does not exist. If no $name was passed, an associative array
+ *   of libraries registered by $module is returned (which may be empty).
+ *
+ * @see drupal_add_library()
+ * @see hook_library()
+ * @see hook_library_alter()
+ *
+ * @todo The purpose of drupal_get_*() is completely different to other page
+ *   requisite API functions; find and use a different name.
+ */
+function drupal_get_library($module, $name = NULL) {
+  $libraries = &drupal_static(__FUNCTION__, array());
+
+  if (!isset($libraries[$module])) {
+    // Retrieve all libraries associated with the module.
+    $module_libraries = module_invoke($module, 'library');
+    if (empty($module_libraries)) {
+      $module_libraries = array();
+    }
+    // Allow modules to alter the module's registered libraries.
+    drupal_alter('library', $module_libraries, $module);
+
+    foreach ($module_libraries as $key => $data) {
+      if (is_array($data)) {
+        // Add default elements to allow for easier processing.
+        $module_libraries[$key] += array('dependencies' => array(), 'js' => array(), 'css' => array());
+        foreach ($module_libraries[$key]['js'] as $file => $options) {
+          $module_libraries[$key]['js'][$file]['version'] = $module_libraries[$key]['version'];
+        }
+      }
+    }
+    $libraries[$module] = $module_libraries;
+  }
+  if (isset($name)) {
+    if (!isset($libraries[$module][$name])) {
+      $libraries[$module][$name] = FALSE;
+    }
+    return $libraries[$module][$name];
+  }
+  return $libraries[$module];
+}
+
+/**
+ * Assists in adding the tableDrag JavaScript behavior to a themed table.
+ *
+ * Draggable tables should be used wherever an outline or list of sortable items
+ * needs to be arranged by an end-user. Draggable tables are very flexible and
+ * can manipulate the value of form elements placed within individual columns.
+ *
+ * To set up a table to use drag and drop in place of weight select-lists or in
+ * place of a form that contains parent relationships, the form must be themed
+ * into a table. The table must have an ID attribute set. If using
+ * theme_table(), the ID may be set as follows:
+ * @code
+ * $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'my-module-table')));
+ * return $output;
+ * @endcode
+ *
+ * In the theme function for the form, a special class must be added to each
+ * form element within the same column, "grouping" them together.
+ *
+ * In a situation where a single weight column is being sorted in the table, the
+ * classes could be added like this (in the theme function):
+ * @code
+ * $form['my_elements'][$delta]['weight']['#attributes']['class'] = array('my-elements-weight');
+ * @endcode
+ *
+ * Each row of the table must also have a class of "draggable" in order to
+ * enable the drag handles:
+ * @code
+ * $row = array(...);
+ * $rows[] = array(
+ *   'data' => $row,
+ *   'class' => array('draggable'),
+ * );
+ * @endcode
+ *
+ * When tree relationships are present, the two additional classes
+ * 'tabledrag-leaf' and 'tabledrag-root' can be used to refine the behavior:
+ * - Rows with the 'tabledrag-leaf' class cannot have child rows.
+ * - Rows with the 'tabledrag-root' class cannot be nested under a parent row.
+ *
+ * Calling drupal_add_tabledrag() would then be written as such:
+ * @code
+ * drupal_add_tabledrag('my-module-table', 'order', 'sibling', 'my-elements-weight');
+ * @endcode
+ *
+ * In a more complex case where there are several groups in one column (such as
+ * the block regions on the admin/structure/block page), a separate subgroup
+ * class must also be added to differentiate the groups.
+ * @code
+ * $form['my_elements'][$region][$delta]['weight']['#attributes']['class'] = array('my-elements-weight', 'my-elements-weight-' . $region);
+ * @endcode
+ *
+ * $group is still 'my-element-weight', and the additional $subgroup variable
+ * will be passed in as 'my-elements-weight-' . $region. This also means that
+ * you'll need to call drupal_add_tabledrag() once for every region added.
+ *
+ * @code
+ * foreach ($regions as $region) {
+ *   drupal_add_tabledrag('my-module-table', 'order', 'sibling', 'my-elements-weight', 'my-elements-weight-' . $region);
+ * }
+ * @endcode
+ *
+ * In a situation where tree relationships are present, adding multiple
+ * subgroups is not necessary, because the table will contain indentations that
+ * provide enough information about the sibling and parent relationships. See
+ * theme_menu_overview_form() for an example creating a table containing parent
+ * relationships.
+ *
+ * Note that this function should be called from the theme layer, such as in a
+ * .tpl.php file, theme_ function, or in a template_preprocess function, not in
+ * a form declaration. Though the same JavaScript could be added to the page
+ * using drupal_add_js() directly, this function helps keep template files
+ * clean and readable. It also prevents tabledrag.js from being added twice
+ * accidentally.
+ *
+ * @param $table_id
+ *   String containing the target table's id attribute. If the table does not
+ *   have an id, one will need to be set, such as <table id="my-module-table">.
+ * @param $action
+ *   String describing the action to be done on the form item. Either 'match'
+ *   'depth', or 'order'. Match is typically used for parent relationships.
+ *   Order is typically used to set weights on other form elements with the same
+ *   group. Depth updates the target element with the current indentation.
+ * @param $relationship
+ *   String describing where the $action variable should be performed. Either
+ *   'parent', 'sibling', 'group', or 'self'. Parent will only look for fields
+ *   up the tree. Sibling will look for fields in the same group in rows above
+ *   and below it. Self affects the dragged row itself. Group affects the
+ *   dragged row, plus any children below it (the entire dragged group).
+ * @param $group
+ *   A class name applied on all related form elements for this action.
+ * @param $subgroup
+ *   (optional) If the group has several subgroups within it, this string should
+ *   contain the class name identifying fields in the same subgroup.
+ * @param $source
+ *   (optional) If the $action is 'match', this string should contain the class
+ *   name identifying what field will be used as the source value when matching
+ *   the value in $subgroup.
+ * @param $hidden
+ *   (optional) The column containing the field elements may be entirely hidden
+ *   from view dynamically when the JavaScript is loaded. Set to FALSE if the
+ *   column should not be hidden.
+ * @param $limit
+ *   (optional) Limit the maximum amount of parenting in this table.
+ * @see block-admin-display-form.tpl.php
+ * @see theme_menu_overview_form()
+ */
+function drupal_add_tabledrag($table_id, $action, $relationship, $group, $subgroup = NULL, $source = NULL, $hidden = TRUE, $limit = 0) {
+  $js_added = &drupal_static(__FUNCTION__, FALSE);
+  if (!$js_added) {
+    // Add the table drag JavaScript to the page before the module JavaScript
+    // to ensure that table drag behaviors are registered before any module
+    // uses it.
+    drupal_add_library('system', 'jquery.cookie');
+    drupal_add_js('misc/tabledrag.js', array('weight' => -1));
+    $js_added = TRUE;
+  }
+
+  // If a subgroup or source isn't set, assume it is the same as the group.
+  $target = isset($subgroup) ? $subgroup : $group;
+  $source = isset($source) ? $source : $target;
+  $settings['tableDrag'][$table_id][$group][] = array(
+    'target' => $target,
+    'source' => $source,
+    'relationship' => $relationship,
+    'action' => $action,
+    'hidden' => $hidden,
+    'limit' => $limit,
+  );
+  drupal_add_js($settings, 'setting');
+}
+
+/**
+ * Aggregates JavaScript files into a cache file in the files directory.
+ *
+ * The file name for the JavaScript cache file is generated from the hash of
+ * the aggregated contents of the files in $files. This forces proxies and
+ * browsers to download new JavaScript when the JavaScript changes.
+ *
+ * The cache file name is retrieved on a page load via a lookup variable that
+ * contains an associative array. The array key is the hash of the names in
+ * $files while the value is the cache file name. The cache file is generated
+ * in two cases. First, if there is no file name value for the key, which will
+ * happen if a new file name has been added to $files or after the lookup
+ * variable is emptied to force a rebuild of the cache. Second, the cache file
+ * is generated if it is missing on disk. Old cache files are not deleted
+ * immediately when the lookup variable is emptied, but are deleted after a set
+ * period by drupal_delete_file_if_stale(). This ensures that files referenced
+ * by a cached page will still be available.
+ *
+ * @param $files
+ *   An array of JavaScript files to aggregate and compress into one file.
+ *
+ * @return
+ *   The URI of the cache file, or FALSE if the file could not be saved.
+ */
+function drupal_build_js_cache($files) {
+  $contents = '';
+  $uri = '';
+  $map = variable_get('drupal_js_cache_files', array());
+  // Create a new array so that only the file names are used to create the hash.
+  // This prevents new aggregates from being created unnecessarily.
+  $js_data = array();
+  foreach ($files as $file) {
+    $js_data[] = $file['data'];
+  }
+  $key = hash('sha256', serialize($js_data));
+  if (isset($map[$key])) {
+    $uri = $map[$key];
+  }
+
+  if (empty($uri) || !file_exists($uri)) {
+    // Build aggregate JS file.
+    foreach ($files as $path => $info) {
+      if ($info['preprocess']) {
+        // Append a ';' and a newline after each JS file to prevent them from running together.
+        $contents .= file_get_contents($path) . ";\n";
+      }
+    }
+    // Prefix filename to prevent blocking by firewalls which reject files
+    // starting with "ad*".
+    $filename = 'js_' . drupal_hash_base64($contents) . '.js';
+    // Create the js/ within the files folder.
+    $jspath = 'public://js';
+    $uri = $jspath . '/' . $filename;
+    // Create the JS file.
+    file_prepare_directory($jspath, FILE_CREATE_DIRECTORY);
+    if (!file_exists($uri) && !file_unmanaged_save_data($contents, $uri, FILE_EXISTS_REPLACE)) {
+      return FALSE;
+    }
+    // If JS gzip compression is enabled, clean URLs are enabled (which means
+    // that rewrite rules are working) and the zlib extension is available then
+    // create a gzipped version of this file. This file is served conditionally
+    // to browsers that accept gzip using .htaccess rules.
+    if (variable_get('js_gzip_compression', TRUE) && variable_get('clean_url', 0) && extension_loaded('zlib')) {
+      if (!file_exists($uri . '.gz') && !file_unmanaged_save_data(gzencode($contents, 9, FORCE_GZIP), $uri . '.gz', FILE_EXISTS_REPLACE)) {
+        return FALSE;
+      }
+    }
+    $map[$key] = $uri;
+    variable_set('drupal_js_cache_files', $map);
+  }
+  return $uri;
+}
+
+/**
+ * Deletes old cached JavaScript files and variables.
+ */
+function drupal_clear_js_cache() {
+  variable_del('javascript_parsed');
+  variable_del('drupal_js_cache_files');
+  file_scan_directory('public://js', '/.*/', array('callback' => 'drupal_delete_file_if_stale'));
+}
+
+/**
+ * Converts a PHP variable into its JavaScript equivalent.
+ *
+ * We use HTML-safe strings, with several characters escaped.
+ *
+ * @see drupal_json_decode()
+ * @see drupal_json_encode_helper()
+ * @ingroup php_wrappers
+ */
+function drupal_json_encode($var) {
+  // The PHP version cannot change within a request.
+  static $php530;
+
+  if (!isset($php530)) {
+    $php530 = version_compare(PHP_VERSION, '5.3.0', '>=');
+  }
+
+  if ($php530) {
+    // Encode <, >, ', &, and " using the json_encode() options parameter.
+    return json_encode($var, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);
+  }
+
+  // json_encode() escapes <, >, ', &, and " using its options parameter, but
+  // does not support this parameter prior to PHP 5.3.0.  Use a helper instead.
+  include_once DRUPAL_ROOT . '/includes/json-encode.inc';
+  return drupal_json_encode_helper($var);
+}
+
+/**
+ * Converts an HTML-safe JSON string into its PHP equivalent.
+ *
+ * @see drupal_json_encode()
+ * @ingroup php_wrappers
+ */
+function drupal_json_decode($var) {
+  return json_decode($var, TRUE);
+}
+
+/**
+ * Returns data in JSON format.
+ *
+ * This function should be used for JavaScript callback functions returning
+ * data in JSON format. It sets the header for JavaScript output.
+ *
+ * @param $var
+ *   (optional) If set, the variable will be converted to JSON and output.
+ */
+function drupal_json_output($var = NULL) {
+  // We are returning JSON, so tell the browser.
+  drupal_add_http_header('Content-Type', 'application/json');
+
+  if (isset($var)) {
+    echo drupal_json_encode($var);
+  }
+}
+
+/**
+ * Ensures the private key variable used to generate tokens is set.
+ *
+ * @return
+ *   The private key.
+ */
+function drupal_get_private_key() {
+  if (!($key = variable_get('drupal_private_key', 0))) {
+    $key = drupal_random_key();
+    variable_set('drupal_private_key', $key);
+  }
+  return $key;
+}
+
+/**
+ * Generates a token based on $value, the user session, and the private key.
+ *
+ * @param $value
+ *   An additional value to base the token on.
+ *
+ * @return string
+ *   A 43-character URL-safe token for validation, based on the user session ID,
+ *   the hash salt provided from drupal_get_hash_salt(), and the
+ *   'drupal_private_key' configuration variable.
+ *
+ * @see drupal_get_hash_salt()
+ */
+function drupal_get_token($value = '') {
+  return drupal_hmac_base64($value, session_id() . drupal_get_private_key() . drupal_get_hash_salt());
+}
+
+/**
+ * Validates a token based on $value, the user session, and the private key.
+ *
+ * @param $token
+ *   The token to be validated.
+ * @param $value
+ *   An additional value to base the token on.
+ * @param $skip_anonymous
+ *   Set to true to skip token validation for anonymous users.
+ *
+ * @return
+ *   True for a valid token, false for an invalid token. When $skip_anonymous
+ *   is true, the return value will always be true for anonymous users.
+ */
+function drupal_valid_token($token, $value = '', $skip_anonymous = FALSE) {
+  global $user;
+  return (($skip_anonymous && $user->uid == 0) || ($token === drupal_get_token($value)));
+}
+
+function _drupal_bootstrap_full() {
+  static $called = FALSE;
+
+  if ($called) {
+    return;
+  }
+  $called = TRUE;
+  require_once DRUPAL_ROOT . '/' . variable_get('path_inc', 'includes/path.inc');
+  require_once DRUPAL_ROOT . '/includes/theme.inc';
+  require_once DRUPAL_ROOT . '/includes/pager.inc';
+  require_once DRUPAL_ROOT . '/' . variable_get('menu_inc', 'includes/menu.inc');
+  require_once DRUPAL_ROOT . '/includes/tablesort.inc';
+  require_once DRUPAL_ROOT . '/includes/file.inc';
+  require_once DRUPAL_ROOT . '/includes/unicode.inc';
+  require_once DRUPAL_ROOT . '/includes/image.inc';
+  require_once DRUPAL_ROOT . '/includes/form.inc';
+  require_once DRUPAL_ROOT . '/includes/mail.inc';
+  require_once DRUPAL_ROOT . '/includes/actions.inc';
+  require_once DRUPAL_ROOT . '/includes/ajax.inc';
+  require_once DRUPAL_ROOT . '/includes/token.inc';
+  require_once DRUPAL_ROOT . '/includes/errors.inc';
+
+  // Detect string handling method
+  unicode_check();
+  // Undo magic quotes
+  fix_gpc_magic();
+  // Load all enabled modules
+  module_load_all();
+  // Make sure all stream wrappers are registered.
+  file_get_stream_wrappers();
+  // Ensure mt_rand is reseeded, to prevent random values from one page load
+  // being exploited to predict random values in subsequent page loads.
+  $seed = unpack("L", drupal_random_bytes(4));
+  mt_srand($seed[1]);
+
+  $test_info = &$GLOBALS['drupal_test_info'];
+  if (!empty($test_info['in_child_site'])) {
+    // Running inside the simpletest child site, log fatal errors to test
+    // specific file directory.
+    ini_set('log_errors', 1);
+    ini_set('error_log', 'public://error.log');
+  }
+
+  // Initialize $_GET['q'] prior to invoking hook_init().
+  drupal_path_initialize();
+
+  // Let all modules take action before the menu system handles the request.
+  // We do not want this while running update.php.
+  if (!defined('MAINTENANCE_MODE') || MAINTENANCE_MODE != 'update') {
+    // Prior to invoking hook_init(), initialize the theme (potentially a custom
+    // one for this page), so that:
+    // - Modules with hook_init() implementations that call theme() or
+    //   theme_get_registry() don't initialize the incorrect theme.
+    // - The theme can have hook_*_alter() implementations affect page building
+    //   (e.g., hook_form_alter(), hook_node_view_alter(), hook_page_alter()),
+    //   ahead of when rendering starts.
+    menu_set_custom_theme();
+    drupal_theme_initialize();
+    module_invoke_all('init');
+  }
+}
+
+/**
+ * Stores the current page in the cache.
+ *
+ * If page_compression is enabled, a gzipped version of the page is stored in
+ * the cache to avoid compressing the output on each request. The cache entry
+ * is unzipped in the relatively rare event that the page is requested by a
+ * client without gzip support.
+ *
+ * Page compression requires the PHP zlib extension
+ * (http://php.net/manual/ref.zlib.php).
+ *
+ * @see drupal_page_header()
+ */
+function drupal_page_set_cache() {
+  global $base_root;
+
+  if (drupal_page_is_cacheable()) {
+
+    // Check whether the current page might be compressed.
+    $page_compressed = variable_get('page_compression', TRUE) && extension_loaded('zlib');
+
+    $cache = (object) array(
+      'cid' => $base_root . request_uri(),
+      'data' => array(
+        'path' => $_GET['q'],
+        'body' => ob_get_clean(),
+        'title' => drupal_get_title(),
+        'headers' => array(),
+        // We need to store whether page was compressed or not,
+        // because by the time it is read, the configuration might change.
+        'page_compressed' => $page_compressed,
+      ),
+      'expire' => CACHE_TEMPORARY,
+      'created' => REQUEST_TIME,
+    );
+
+    // Restore preferred header names based on the lower-case names returned
+    // by drupal_get_http_header().
+    $header_names = _drupal_set_preferred_header_name();
+    foreach (drupal_get_http_header() as $name_lower => $value) {
+      $cache->data['headers'][$header_names[$name_lower]] = $value;
+      if ($name_lower == 'expires') {
+        // Use the actual timestamp from an Expires header if available.
+        $cache->expire = strtotime($value);
+      }
+    }
+
+    if ($cache->data['body']) {
+      if ($page_compressed) {
+        $cache->data['body'] = gzencode($cache->data['body'], 9, FORCE_GZIP);
+      }
+      cache_set($cache->cid, $cache->data, 'cache_page', $cache->expire);
+    }
+    return $cache;
+  }
+}
+
+/**
+ * Executes a cron run when called.
+ *
+ * Do not call this function from a test. Use $this->cronRun() instead.
+ *
+ * @return
+ *   TRUE if cron ran successfully.
+ */
+function drupal_cron_run() {
+  // Allow execution to continue even if the request gets canceled.
+  @ignore_user_abort(TRUE);
+
+  // Prevent session information from being saved while cron is running.
+  $original_session_saving = drupal_save_session();
+  drupal_save_session(FALSE);
+
+  // Force the current user to anonymous to ensure consistent permissions on
+  // cron runs.
+  $original_user = $GLOBALS['user'];
+  $GLOBALS['user'] = drupal_anonymous_user();
+
+  // Try to allocate enough time to run all the hook_cron implementations.
+  drupal_set_time_limit(240);
+
+  $return = FALSE;
+  // Grab the defined cron queues.
+  $queues = module_invoke_all('cron_queue_info');
+  drupal_alter('cron_queue_info', $queues);
+
+  // Try to acquire cron lock.
+  if (!lock_acquire('cron', 240.0)) {
+    // Cron is still running normally.
+    watchdog('cron', 'Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);
+  }
+  else {
+    // Make sure every queue exists. There is no harm in trying to recreate an
+    // existing queue.
+    foreach ($queues as $queue_name => $info) {
+      DrupalQueue::get($queue_name)->createQueue();
+    }
+    // Register shutdown callback.
+    drupal_register_shutdown_function('drupal_cron_cleanup');
+
+    // Iterate through the modules calling their cron handlers (if any):
+    foreach (module_implements('cron') as $module) {
+      // Do not let an exception thrown by one module disturb another.
+      try {
+        module_invoke($module, 'cron');
+      }
+      catch (Exception $e) {
+        watchdog_exception('cron', $e);
+      }
+    }
+
+    // Record cron time.
+    variable_set('cron_last', REQUEST_TIME);
+    watchdog('cron', 'Cron run completed.', array(), WATCHDOG_NOTICE);
+
+    // Release cron lock.
+    lock_release('cron');
+
+    // Return TRUE so other functions can check if it did run successfully
+    $return = TRUE;
+  }
+
+  foreach ($queues as $queue_name => $info) {
+    if (!empty($info['skip on cron'])) {
+      // Do not run if queue wants to skip.
+      continue;
+    }
+    $function = $info['worker callback'];
+    $end = time() + (isset($info['time']) ? $info['time'] : 15);
+    $queue = DrupalQueue::get($queue_name);
+    while (time() < $end && ($item = $queue->claimItem())) {
+      $function($item->data);
+      $queue->deleteItem($item);
+    }
+  }
+  // Restore the user.
+  $GLOBALS['user'] = $original_user;
+  drupal_save_session($original_session_saving);
+
+  return $return;
+}
+
+/**
+ * Shutdown function: Performs cron cleanup.
+ *
+ * @see drupal_cron_run()
+ * @see drupal_register_shutdown_function()
+ */
+function drupal_cron_cleanup() {
+  // See if the semaphore is still locked.
+  if (variable_get('cron_semaphore', FALSE)) {
+    watchdog('cron', 'Cron run exceeded the time limit and was aborted.', array(), WATCHDOG_WARNING);
+
+    // Release cron semaphore.
+    variable_del('cron_semaphore');
+  }
+}
+
+/**
+ * Returns information about system object files (modules, themes, etc.).
+ *
+ * This function is used to find all or some system object files (module files,
+ * theme files, etc.) that exist on the site. It searches in several locations,
+ * depending on what type of object you are looking for. For instance, if you
+ * are looking for modules and call:
+ * @code
+ * drupal_system_listing("/\.module$/", "modules", 'name', 0);
+ * @endcode
+ * this function will search the site-wide modules directory (i.e., /modules/),
+ * your installation profile's directory (i.e.,
+ * /profiles/your_site_profile/modules/), the all-sites directory (i.e.,
+ * /sites/all/modules/), and your site-specific directory (i.e.,
+ * /sites/your_site_dir/modules/), in that order, and return information about
+ * all of the files ending in .module in those directories.
+ *
+ * The information is returned in an associative array, which can be keyed on
+ * the file name ($key = 'filename'), the file name without the extension ($key
+ * = 'name'), or the full file stream URI ($key = 'uri'). If you use a key of
+ * 'filename' or 'name', files found later in the search will take precedence
+ * over files found earlier (unless they belong to a module or theme not
+ * compatible with Drupal core); if you choose a key of 'uri', you will get all
+ * files found.
+ *
+ * @param string $mask
+ *   The preg_match() regular expression for the files to find.
+ * @param string $directory
+ *   The subdirectory name in which the files are found. For example,
+ *   'modules' will search in sub-directories of the top-level /modules
+ *   directory, sub-directories of /sites/all/modules/, etc.
+ * @param string $key
+ *   The key to be used for the associative array returned. Possible values are
+ *   'uri', for the file's URI; 'filename', for the basename of the file; and
+ *   'name' for the name of the file without the extension. If you choose 'name'
+ *   or 'filename', only the highest-precedence file will be returned.
+ * @param int $min_depth
+ *   Minimum depth of directories to return files from, relative to each
+ *   directory searched. For instance, a minimum depth of 2 would find modules
+ *   inside /modules/node/tests, but not modules directly in /modules/node.
+ *
+ * @return array
+ *   An associative array of file objects, keyed on the chosen key. Each element
+ *   in the array is an object containing file information, with properties:
+ *   - 'uri': Full URI of the file.
+ *   - 'filename': File name.
+ *   - 'name': Name of file without the extension.
+ */
+function drupal_system_listing($mask, $directory, $key = 'name', $min_depth = 1) {
+  $config = conf_path();
+
+  $searchdir = array($directory);
+  $files = array();
+
+  // The 'profiles' directory contains pristine collections of modules and
+  // themes as organized by a distribution. It is pristine in the same way
+  // that /modules is pristine for core; users should avoid changing anything
+  // there in favor of sites/all or sites/<domain> directories.
+  $profiles = array();
+  $profile = drupal_get_profile();
+  // For SimpleTest to be able to test modules packaged together with a
+  // distribution we need to include the profile of the parent site (in which
+  // test runs are triggered).
+  if (drupal_valid_test_ua()) {
+    $testing_profile = variable_get('simpletest_parent_profile', FALSE);
+    if ($testing_profile && $testing_profile != $profile) {
+      $profiles[] = $testing_profile;
+    }
+  }
+  // In case both profile directories contain the same extension, the actual
+  // profile always has precedence.
+  $profiles[] = $profile;
+  foreach ($profiles as $profile) {
+    if (file_exists("profiles/$profile/$directory")) {
+      $searchdir[] = "profiles/$profile/$directory";
+    }
+  }
+
+  // Always search sites/all/* as well as the global directories.
+  $searchdir[] = 'sites/all/' . $directory;
+
+  if (file_exists("$config/$directory")) {
+    $searchdir[] = "$config/$directory";
+  }
+
+  // Get current list of items.
+  if (!function_exists('file_scan_directory')) {
+    require_once DRUPAL_ROOT . '/includes/file.inc';
+  }
+  foreach ($searchdir as $dir) {
+    $files_to_add = file_scan_directory($dir, $mask, array('key' => $key, 'min_depth' => $min_depth));
+
+    // Duplicate files found in later search directories take precedence over
+    // earlier ones, so we want them to overwrite keys in our resulting
+    // $files array.
+    // The exception to this is if the later file is from a module or theme not
+    // compatible with Drupal core. This may occur during upgrades of Drupal
+    // core when new modules exist in core while older contrib modules with the
+    // same name exist in a directory such as sites/all/modules/.
+    foreach (array_intersect_key($files_to_add, $files) as $file_key => $file) {
+      // If it has no info file, then we just behave liberally and accept the
+      // new resource on the list for merging.
+      if (file_exists($info_file = dirname($file->uri) . '/' . $file->name . '.info')) {
+        // Get the .info file for the module or theme this file belongs to.
+        $info = drupal_parse_info_file($info_file);
+
+        // If the module or theme is incompatible with Drupal core, remove it
+        // from the array for the current search directory, so it is not
+        // overwritten when merged with the $files array.
+        if (isset($info['core']) && $info['core'] != DRUPAL_CORE_COMPATIBILITY) {
+          unset($files_to_add[$file_key]);
+        }
+      }
+    }
+    $files = array_merge($files, $files_to_add);
+  }
+
+  return $files;
+}
+
+/**
+ * Sets the main page content value for later use.
+ *
+ * Given the nature of the Drupal page handling, this will be called once with
+ * a string or array. We store that and return it later as the block is being
+ * displayed.
+ *
+ * @param $content
+ *   A string or renderable array representing the body of the page.
+ *
+ * @return
+ *   If called without $content, a renderable array representing the body of
+ *   the page.
+ */
+function drupal_set_page_content($content = NULL) {
+  $content_block = &drupal_static(__FUNCTION__, NULL);
+  $main_content_display = &drupal_static('system_main_content_added', FALSE);
+
+  if (!empty($content)) {
+    $content_block = (is_array($content) ? $content : array('main' => array('#markup' => $content)));
+  }
+  else {
+    // Indicate that the main content has been requested. We assume that
+    // the module requesting the content will be adding it to the page.
+    // A module can indicate that it does not handle the content by setting
+    // the static variable back to FALSE after calling this function.
+    $main_content_display = TRUE;
+    return $content_block;
+  }
+}
+
+/**
+ * #pre_render callback to render #browsers into #prefix and #suffix.
+ *
+ * @param $elements
+ *   A render array with a '#browsers' property. The '#browsers' property can
+ *   contain any or all of the following keys:
+ *   - 'IE': If FALSE, the element is not rendered by Internet Explorer. If
+ *     TRUE, the element is rendered by Internet Explorer. Can also be a string
+ *     containing an expression for Internet Explorer to evaluate as part of a
+ *     conditional comment. For example, this can be set to 'lt IE 7' for the
+ *     element to be rendered in Internet Explorer 6, but not in Internet
+ *     Explorer 7 or higher. Defaults to TRUE.
+ *   - '!IE': If FALSE, the element is not rendered by browsers other than
+ *     Internet Explorer. If TRUE, the element is rendered by those browsers.
+ *     Defaults to TRUE.
+ *   Examples:
+ *   - To render an element in all browsers, '#browsers' can be left out or set
+ *     to array('IE' => TRUE, '!IE' => TRUE).
+ *   - To render an element in Internet Explorer only, '#browsers' can be set
+ *     to array('!IE' => FALSE).
+ *   - To render an element in Internet Explorer 6 only, '#browsers' can be set
+ *     to array('IE' => 'lt IE 7', '!IE' => FALSE).
+ *   - To render an element in Internet Explorer 8 and higher and in all other
+ *     browsers, '#browsers' can be set to array('IE' => 'gte IE 8').
+ *
+ * @return
+ *   The passed-in element with markup for conditional comments potentially
+ *   added to '#prefix' and '#suffix'.
+ */
+function drupal_pre_render_conditional_comments($elements) {
+  $browsers = isset($elements['#browsers']) ? $elements['#browsers'] : array();
+  $browsers += array(
+    'IE' => TRUE,
+    '!IE' => TRUE,
+  );
+
+  // If rendering in all browsers, no need for conditional comments.
+  if ($browsers['IE'] === TRUE && $browsers['!IE']) {
+    return $elements;
+  }
+
+  // Determine the conditional comment expression for Internet Explorer to
+  // evaluate.
+  if ($browsers['IE'] === TRUE) {
+    $expression = 'IE';
+  }
+  elseif ($browsers['IE'] === FALSE) {
+    $expression = '!IE';
+  }
+  else {
+    $expression = $browsers['IE'];
+  }
+
+  // Wrap the element's potentially existing #prefix and #suffix properties with
+  // conditional comment markup. The conditional comment expression is evaluated
+  // by Internet Explorer only. To control the rendering by other browsers,
+  // either the "downlevel-hidden" or "downlevel-revealed" technique must be
+  // used. See http://en.wikipedia.org/wiki/Conditional_comment for details.
+  $elements += array(
+    '#prefix' => '',
+    '#suffix' => '',
+  );
+  if (!$browsers['!IE']) {
+    // "downlevel-hidden".
+    $elements['#prefix'] = "\n<!--[if $expression]>\n" . $elements['#prefix'];
+    $elements['#suffix'] .= "<![endif]-->\n";
+  }
+  else {
+    // "downlevel-revealed".
+    $elements['#prefix'] = "\n<!--[if $expression]><!-->\n" . $elements['#prefix'];
+    $elements['#suffix'] .= "<!--<![endif]-->\n";
+  }
+
+  return $elements;
+}
+
+/**
+ * #pre_render callback to render a link into #markup.
+ *
+ * Doing so during pre_render gives modules a chance to alter the link parts.
+ *
+ * @param $elements
+ *   A structured array whose keys form the arguments to l():
+ *   - #title: The link text to pass as argument to l().
+ *   - #href: The URL path component to pass as argument to l().
+ *   - #options: (optional) An array of options to pass to l().
+ *
+ * @return
+ *   The passed-in elements containing a rendered link in '#markup'.
+ */
+function drupal_pre_render_link($element) {
+  // By default, link options to pass to l() are normally set in #options.
+  $element += array('#options' => array());
+  // However, within the scope of renderable elements, #attributes is a valid
+  // way to specify attributes, too. Take them into account, but do not override
+  // attributes from #options.
+  if (isset($element['#attributes'])) {
+    $element['#options'] += array('attributes' => array());
+    $element['#options']['attributes'] += $element['#attributes'];
+  }
+
+  // This #pre_render callback can be invoked from inside or outside of a Form
+  // API context, and depending on that, a HTML ID may be already set in
+  // different locations. #options should have precedence over Form API's #id.
+  // #attributes have been taken over into #options above already.
+  if (isset($element['#options']['attributes']['id'])) {
+    $element['#id'] = $element['#options']['attributes']['id'];
+  }
+  elseif (isset($element['#id'])) {
+    $element['#options']['attributes']['id'] = $element['#id'];
+  }
+
+  // Conditionally invoke ajax_pre_render_element(), if #ajax is set.
+  if (isset($element['#ajax']) && !isset($element['#ajax_processed'])) {
+    // If no HTML ID was found above, automatically create one.
+    if (!isset($element['#id'])) {
+      $element['#id'] = $element['#options']['attributes']['id'] = drupal_html_id('ajax-link');
+    }
+    // If #ajax['path] was not specified, use the href as Ajax request URL.
+    if (!isset($element['#ajax']['path'])) {
+      $element['#ajax']['path'] = $element['#href'];
+      $element['#ajax']['options'] = $element['#options'];
+    }
+    $element = ajax_pre_render_element($element);
+  }
+
+  $element['#markup'] = l($element['#title'], $element['#href'], $element['#options']);
+  return $element;
+}
+
+/**
+ * #pre_render callback that collects child links into a single array.
+ *
+ * This function can be added as a pre_render callback for a renderable array,
+ * usually one which will be themed by theme_links(). It iterates through all
+ * unrendered children of the element, collects any #links properties it finds,
+ * merges them into the parent element's #links array, and prevents those
+ * children from being rendered separately.
+ *
+ * The purpose of this is to allow links to be logically grouped into related
+ * categories, so that each child group can be rendered as its own list of
+ * links if drupal_render() is called on it, but calling drupal_render() on the
+ * parent element will still produce a single list containing all the remaining
+ * links, regardless of what group they were in.
+ *
+ * A typical example comes from node links, which are stored in a renderable
+ * array similar to this:
+ * @code
+ * $node->content['links'] = array(
+ *   '#theme' => 'links__node',
+ *   '#pre_render' => array('drupal_pre_render_links'),
+ *   'comment' => array(
+ *     '#theme' => 'links__node__comment',
+ *     '#links' => array(
+ *       // An array of links associated with node comments, suitable for
+ *       // passing in to theme_links().
+ *     ),
+ *   ),
+ *   'statistics' => array(
+ *     '#theme' => 'links__node__statistics',
+ *     '#links' => array(
+ *       // An array of links associated with node statistics, suitable for
+ *       // passing in to theme_links().
+ *     ),
+ *   ),
+ *   'translation' => array(
+ *     '#theme' => 'links__node__translation',
+ *     '#links' => array(
+ *       // An array of links associated with node translation, suitable for
+ *       // passing in to theme_links().
+ *     ),
+ *   ),
+ * );
+ * @endcode
+ *
+ * In this example, the links are grouped by functionality, which can be
+ * helpful to themers who want to display certain kinds of links independently.
+ * For example, adding this code to node.tpl.php will result in the comment
+ * links being rendered as a single list:
+ * @code
+ * print render($content['links']['comment']);
+ * @endcode
+ *
+ * (where $node->content has been transformed into $content before handing
+ * control to the node.tpl.php template).
+ *
+ * The pre_render function defined here allows the above flexibility, but also
+ * allows the following code to be used to render all remaining links into a
+ * single list, regardless of their group:
+ * @code
+ * print render($content['links']);
+ * @endcode
+ *
+ * In the above example, this will result in the statistics and translation
+ * links being rendered together in a single list (but not the comment links,
+ * which were rendered previously on their own).
+ *
+ * Because of the way this function works, the individual properties of each
+ * group (for example, a group-specific #theme property such as
+ * 'links__node__comment' in the example above, or any other property such as
+ * #attributes or #pre_render that is attached to it) are only used when that
+ * group is rendered on its own. When the group is rendered together with other
+ * children, these child-specific properties are ignored, and only the overall
+ * properties of the parent are used.
+ */
+function drupal_pre_render_links($element) {
+  $element += array('#links' => array());
+  foreach (element_children($element) as $key) {
+    $child = &$element[$key];
+    // If the child has links which have not been printed yet and the user has
+    // access to it, merge its links in to the parent.
+    if (isset($child['#links']) && empty($child['#printed']) && (!isset($child['#access']) || $child['#access'])) {
+      $element['#links'] += $child['#links'];
+      // Mark the child as having been printed already (so that its links
+      // cannot be mistakenly rendered twice).
+      $child['#printed'] = TRUE;
+    }
+  }
+  return $element;
+}
+
+/**
+ * #pre_render callback to append contents in #markup to #children.
+ *
+ * This needs to be a #pre_render callback, because eventually assigned
+ * #theme_wrappers will expect the element's rendered content in #children.
+ * Note that if also a #theme is defined for the element, then the result of
+ * the theme callback will override #children.
+ *
+ * @param $elements
+ *   A structured array using the #markup key.
+ *
+ * @return
+ *   The passed-in elements, but #markup appended to #children.
+ *
+ * @see drupal_render()
+ */
+function drupal_pre_render_markup($elements) {
+  $elements['#children'] = $elements['#markup'];
+  return $elements;
+}
+
+/**
+ * Renders the page, including all theming.
+ *
+ * @param $page
+ *   A string or array representing the content of a page. The array consists of
+ *   the following keys:
+ *   - #type: Value is always 'page'. This pushes the theming through
+ *     page.tpl.php (required).
+ *   - #show_messages: Suppress drupal_get_message() items. Used by Batch
+ *     API (optional).
+ *
+ * @see hook_page_alter()
+ * @see element_info()
+ */
+function drupal_render_page($page) {
+  $main_content_display = &drupal_static('system_main_content_added', FALSE);
+
+  // Allow menu callbacks to return strings or arbitrary arrays to render.
+  // If the array returned is not of #type page directly, we need to fill
+  // in the page with defaults.
+  if (is_string($page) || (is_array($page) && (!isset($page['#type']) || ($page['#type'] != 'page')))) {
+    drupal_set_page_content($page);
+    $page = element_info('page');
+  }
+
+  // Modules can add elements to $page as needed in hook_page_build().
+  foreach (module_implements('page_build') as $module) {
+    $function = $module . '_page_build';
+    $function($page);
+  }
+  // Modules alter the $page as needed. Blocks are populated into regions like
+  // 'sidebar_first', 'footer', etc.
+  drupal_alter('page', $page);
+
+  // If no module has taken care of the main content, add it to the page now.
+  // This allows the site to still be usable even if no modules that
+  // control page regions (for example, the Block module) are enabled.
+  if (!$main_content_display) {
+    $page['content']['system_main'] = drupal_set_page_content();
+  }
+
+  return drupal_render($page);
+}
+
+/**
+ * Renders HTML given a structured array tree.
+ *
+ * Recursively iterates over each of the array elements, generating HTML code.
+ *
+ * Renderable arrays have two kinds of key/value pairs: properties and
+ * children. Properties have keys starting with '#' and their values influence
+ * how the array will be rendered. Children are all elements whose keys do not
+ * start with a '#'. Their values should be renderable arrays themselves,
+ * which will be rendered during the rendering of the parent array. The markup
+ * provided by the children is typically inserted into the markup generated by
+ * the parent array.
+ *
+ * HTML generation for a renderable array, and the treatment of any children,
+ * is controlled by two properties containing theme functions, #theme and
+ * #theme_wrappers.
+ *
+ * #theme is the theme function called first. If it is set and the element has
+ * any children, it is the responsibility of the theme function to render
+ * these children. For elements that are not allowed to have any children,
+ * e.g. buttons or textfields, the theme function can be used to render the
+ * element itself. If #theme is not present and the element has children, each
+ * child is itself rendered by a call to drupal_render(), and the results are
+ * concatenated.
+ *
+ * The #theme_wrappers property contains an array of theme functions which will
+ * be called, in order, after #theme has run. These can be used to add further
+ * markup around the rendered children; e.g., fieldsets add the required markup
+ * for a fieldset around their rendered child elements. All wrapper theme
+ * functions have to include the element's #children property in their output,
+ * as it contains the output of the previous theme functions and the rendered
+ * children.
+ *
+ * For example, for the form element type, by default only the #theme_wrappers
+ * property is set, which adds the form markup around the rendered child
+ * elements of the form. This allows you to set the #theme property on a
+ * specific form to a custom theme function, giving you complete control over
+ * the placement of the form's children while not at all having to deal with
+ * the form markup itself.
+ *
+ * drupal_render() can optionally cache the rendered output of elements to
+ * improve performance. To use drupal_render() caching, set the element's #cache
+ * property to an associative array with one or several of the following keys:
+ * - 'keys': An array of one or more keys that identify the element. If 'keys'
+ *   is set, the cache ID is created automatically from these keys. See
+ *   drupal_render_cid_create().
+ * - 'granularity' (optional): Define the cache granularity using binary
+ *   combinations of the cache granularity constants, e.g.
+ *   DRUPAL_CACHE_PER_USER to cache for each user separately or
+ *   DRUPAL_CACHE_PER_PAGE | DRUPAL_CACHE_PER_ROLE to cache separately for each
+ *   page and role. If not specified the element is cached globally for each
+ *   theme and language.
+ * - 'cid': Specify the cache ID directly. Either 'keys' or 'cid' is required.
+ *   If 'cid' is set, 'keys' and 'granularity' are ignored. Use only if you
+ *   have special requirements.
+ * - 'expire': Set to one of the cache lifetime constants.
+ * - 'bin': Specify a cache bin to cache the element in. Defaults to 'cache'.
+ *
+ * This function is usually called from within another function, like
+ * drupal_get_form() or a theme function. Elements are sorted internally
+ * using uasort(). Since this is expensive, when passing already sorted
+ * elements to drupal_render(), for example from a database query, set
+ * $elements['#sorted'] = TRUE to avoid sorting them a second time.
+ *
+ * drupal_render() flags each element with a '#printed' status to indicate that
+ * the element has been rendered, which allows individual elements of a given
+ * array to be rendered independently and prevents them from being rendered
+ * more than once on subsequent calls to drupal_render() (e.g., as part of a
+ * larger array). If the same array or array element is passed more than once
+ * to drupal_render(), it simply returns an empty string.
+ *
+ * @param array $elements
+ *   The structured array describing the data to be rendered.
+ *
+ * @return string
+ *   The rendered HTML.
+ */
+function drupal_render(&$elements) {
+  // Early-return nothing if user does not have access.
+  if (empty($elements) || (isset($elements['#access']) && !$elements['#access'])) {
+    return '';
+  }
+
+  // Do not print elements twice.
+  if (!empty($elements['#printed'])) {
+    return '';
+  }
+
+  // Try to fetch the element's markup from cache and return.
+  if (isset($elements['#cache'])) {
+    $cached_output = drupal_render_cache_get($elements);
+    if ($cached_output !== FALSE) {
+      return $cached_output;
+    }
+  }
+
+  // If #markup is set, ensure #type is set. This allows to specify just #markup
+  // on an element without setting #type.
+  if (isset($elements['#markup']) && !isset($elements['#type'])) {
+    $elements['#type'] = 'markup';
+  }
+
+  // If the default values for this element have not been loaded yet, populate
+  // them.
+  if (isset($elements['#type']) && empty($elements['#defaults_loaded'])) {
+    $elements += element_info($elements['#type']);
+  }
+
+  // Make any final changes to the element before it is rendered. This means
+  // that the $element or the children can be altered or corrected before the
+  // element is rendered into the final text.
+  if (isset($elements['#pre_render'])) {
+    foreach ($elements['#pre_render'] as $function) {
+      if (function_exists($function)) {
+        $elements = $function($elements);
+      }
+    }
+  }
+
+  // Allow #pre_render to abort rendering.
+  if (!empty($elements['#printed'])) {
+    return '';
+  }
+
+  // Get the children of the element, sorted by weight.
+  $children = element_children($elements, TRUE);
+
+  // Initialize this element's #children, unless a #pre_render callback already
+  // preset #children.
+  if (!isset($elements['#children'])) {
+    $elements['#children'] = '';
+  }
+  // Call the element's #theme function if it is set. Then any children of the
+  // element have to be rendered there.
+  if (isset($elements['#theme'])) {
+    $elements['#children'] = theme($elements['#theme'], $elements);
+  }
+  // If #theme was not set and the element has children, render them now.
+  // This is the same process as drupal_render_children() but is inlined
+  // for speed.
+  if ($elements['#children'] == '') {
+    foreach ($children as $key) {
+      $elements['#children'] .= drupal_render($elements[$key]);
+    }
+  }
+
+  // Let the theme functions in #theme_wrappers add markup around the rendered
+  // children.
+  if (isset($elements['#theme_wrappers'])) {
+    foreach ($elements['#theme_wrappers'] as $theme_wrapper) {
+      $elements['#children'] = theme($theme_wrapper, $elements);
+    }
+  }
+
+  // Filter the outputted content and make any last changes before the
+  // content is sent to the browser. The changes are made on $content
+  // which allows the output'ed text to be filtered.
+  if (isset($elements['#post_render'])) {
+    foreach ($elements['#post_render'] as $function) {
+      if (function_exists($function)) {
+        $elements['#children'] = $function($elements['#children'], $elements);
+      }
+    }
+  }
+
+  // Add any JavaScript state information associated with the element.
+  if (!empty($elements['#states'])) {
+    drupal_process_states($elements);
+  }
+
+  // Add additional libraries, CSS, JavaScript an other custom
+  // attached data associated with this element.
+  if (!empty($elements['#attached'])) {
+    drupal_process_attached($elements);
+  }
+
+  $prefix = isset($elements['#prefix']) ? $elements['#prefix'] : '';
+  $suffix = isset($elements['#suffix']) ? $elements['#suffix'] : '';
+  $output = $prefix . $elements['#children'] . $suffix;
+
+  // Cache the processed element if #cache is set.
+  if (isset($elements['#cache'])) {
+    drupal_render_cache_set($output, $elements);
+  }
+
+  $elements['#printed'] = TRUE;
+  return $output;
+}
+
+/**
+ * Renders children of an element and concatenates them.
+ *
+ * This renders all children of an element using drupal_render() and then
+ * joins them together into a single string.
+ *
+ * @param $element
+ *   The structured array whose children shall be rendered.
+ * @param $children_keys
+ *   If the keys of the element's children are already known, they can be passed
+ *   in to save another run of element_children().
+ */
+function drupal_render_children(&$element, $children_keys = NULL) {
+  if ($children_keys === NULL) {
+    $children_keys = element_children($element);
+  }
+  $output = '';
+  foreach ($children_keys as $key) {
+    if (!empty($element[$key])) {
+      $output .= drupal_render($element[$key]);
+    }
+  }
+  return $output;
+}
+
+/**
+ * Renders an element.
+ *
+ * This function renders an element using drupal_render(). The top level
+ * element is shown with show() before rendering, so it will always be rendered
+ * even if hide() had been previously used on it.
+ *
+ * @param $element
+ *   The element to be rendered.
+ *
+ * @return
+ *   The rendered element.
+ *
+ * @see drupal_render()
+ * @see show()
+ * @see hide()
+ */
+function render(&$element) {
+  if (is_array($element)) {
+    show($element);
+    return drupal_render($element);
+  }
+  else {
+    // Safe-guard for inappropriate use of render() on flat variables: return
+    // the variable as-is.
+    return $element;
+  }
+}
+
+/**
+ * Hides an element from later rendering.
+ *
+ * The first time render() or drupal_render() is called on an element tree,
+ * as each element in the tree is rendered, it is marked with a #printed flag
+ * and the rendered children of the element are cached. Subsequent calls to
+ * render() or drupal_render() will not traverse the child tree of this element
+ * again: they will just use the cached children. So if you want to hide an
+ * element, be sure to call hide() on the element before its parent tree is
+ * rendered for the first time, as it will have no effect on subsequent
+ * renderings of the parent tree.
+ *
+ * @param $element
+ *   The element to be hidden.
+ *
+ * @return
+ *   The element.
+ *
+ * @see render()
+ * @see show()
+ */
+function hide(&$element) {
+  $element['#printed'] = TRUE;
+  return $element;
+}
+
+/**
+ * Shows a hidden element for later rendering.
+ *
+ * You can also use render($element), which shows the element while rendering
+ * it.
+ *
+ * The first time render() or drupal_render() is called on an element tree,
+ * as each element in the tree is rendered, it is marked with a #printed flag
+ * and the rendered children of the element are cached. Subsequent calls to
+ * render() or drupal_render() will not traverse the child tree of this element
+ * again: they will just use the cached children. So if you want to show an
+ * element, be sure to call show() on the element before its parent tree is
+ * rendered for the first time, as it will have no effect on subsequent
+ * renderings of the parent tree.
+ *
+ * @param $element
+ *   The element to be shown.
+ *
+ * @return
+ *   The element.
+ *
+ * @see render()
+ * @see hide()
+ */
+function show(&$element) {
+  $element['#printed'] = FALSE;
+  return $element;
+}
+
+/**
+ * Gets the rendered output of a renderable element from the cache.
+ *
+ * @param $elements
+ *   A renderable array.
+ *
+ * @return
+ *   A markup string containing the rendered content of the element, or FALSE
+ *   if no cached copy of the element is available.
+ *
+ * @see drupal_render()
+ * @see drupal_render_cache_set()
+ */
+function drupal_render_cache_get($elements) {
+  if (!in_array($_SERVER['REQUEST_METHOD'], array('GET', 'HEAD')) || !$cid = drupal_render_cid_create($elements)) {
+    return FALSE;
+  }
+  $bin = isset($elements['#cache']['bin']) ? $elements['#cache']['bin'] : 'cache';
+
+  if (!empty($cid) && $cache = cache_get($cid, $bin)) {
+    // Add additional libraries, JavaScript, CSS and other data attached
+    // to this element.
+    if (isset($cache->data['#attached'])) {
+      drupal_process_attached($cache->data);
+    }
+    // Return the rendered output.
+    return $cache->data['#markup'];
+  }
+  return FALSE;
+}
+
+/**
+ * Caches the rendered output of a renderable element.
+ *
+ * This is called by drupal_render() if the #cache property is set on an
+ * element.
+ *
+ * @param $markup
+ *   The rendered output string of $elements.
+ * @param $elements
+ *   A renderable array.
+ *
+ * @see drupal_render_cache_get()
+ */
+function drupal_render_cache_set(&$markup, $elements) {
+  // Create the cache ID for the element.
+  if (!in_array($_SERVER['REQUEST_METHOD'], array('GET', 'HEAD')) || !$cid = drupal_render_cid_create($elements)) {
+    return FALSE;
+  }
+
+  // Cache implementations are allowed to modify the markup, to support
+  // replacing markup with edge-side include commands. The supporting cache
+  // backend will store the markup in some other key (like
+  // $data['#real-value']) and return an include command instead. When the
+  // ESI command is executed by the content accelerator, the real value can
+  // be retrieved and used.
+  $data['#markup'] = &$markup;
+  // Persist attached data associated with this element.
+  $attached = drupal_render_collect_attached($elements, TRUE);
+  if ($attached) {
+    $data['#attached'] = $attached;
+  }
+  $bin = isset($elements['#cache']['bin']) ? $elements['#cache']['bin'] : 'cache';
+  $expire = isset($elements['#cache']['expire']) ? $elements['#cache']['expire'] : CACHE_PERMANENT;
+  cache_set($cid, $data, $bin, $expire);
+}
+
+/**
+ * Collects #attached for an element and its children into a single array.
+ *
+ * When caching elements, it is necessary to collect all libraries, JavaScript
+ * and CSS into a single array, from both the element itself and all child
+ * elements. This allows drupal_render() to add these back to the page when the
+ * element is returned from cache.
+ *
+ * @param $elements
+ *   The element to collect #attached from.
+ * @param $return
+ *   Whether to return the attached elements and reset the internal static.
+ *
+ * @return
+ *   The #attached array for this element and its descendants.
+ */
+function drupal_render_collect_attached($elements, $return = FALSE) {
+  $attached = &drupal_static(__FUNCTION__, array());
+
+  // Collect all #attached for this element.
+  if (isset($elements['#attached'])) {
+    foreach ($elements['#attached'] as $key => $value) {
+      if (!isset($attached[$key])) {
+        $attached[$key] = array();
+      }
+      $attached[$key] = array_merge($attached[$key], $value);
+    }
+  }
+  if ($children = element_children($elements)) {
+    foreach ($children as $child) {
+      drupal_render_collect_attached($elements[$child]);
+    }
+  }
+
+  // If this was the first call to the function, return all attached elements
+  // and reset the static cache.
+  if ($return) {
+    $return = $attached;
+    $attached = array();
+    return $return;
+  }
+}
+
+/**
+ * Prepares an element for caching based on a query.
+ *
+ * This smart caching strategy saves Drupal from querying and rendering to HTML
+ * when the underlying query is unchanged.
+ *
+ * Expensive queries should use the query builder to create the query and then
+ * call this function. Executing the query and formatting results should happen
+ * in a #pre_render callback.
+ *
+ * @param $query
+ *   A select query object as returned by db_select().
+ * @param $function
+ *   The name of the function doing this caching. A _pre_render suffix will be
+ *   added to this string and is also part of the cache key in
+ *   drupal_render_cache_set() and drupal_render_cache_get().
+ * @param $expire
+ *   The cache expire time, passed eventually to cache_set().
+ * @param $granularity
+ *   One or more granularity constants passed to drupal_render_cid_parts().
+ *
+ * @return
+ *   A renderable array with the following keys and values:
+ *   - #query: The passed-in $query.
+ *   - #pre_render: $function with a _pre_render suffix.
+ *   - #cache: An associative array prepared for drupal_render_cache_set().
+ */
+function drupal_render_cache_by_query($query, $function, $expire = CACHE_TEMPORARY, $granularity = NULL) {
+  $cache_keys = array_merge(array($function), drupal_render_cid_parts($granularity));
+  $query->preExecute();
+  $cache_keys[] = hash('sha256', serialize(array((string) $query, $query->getArguments())));
+  return array(
+    '#query' => $query,
+    '#pre_render' => array($function . '_pre_render'),
+    '#cache' => array(
+      'keys' => $cache_keys,
+      'expire' => $expire,
+    ),
+  );
+}
+
+/**
+ * Returns cache ID parts for building a cache ID.
+ *
+ * @param $granularity
+ *   One or more cache granularity constants. For example, to cache separately
+ *   for each user, use DRUPAL_CACHE_PER_USER. To cache separately for each
+ *   page and role, use the expression:
+ *   @code
+ *   DRUPAL_CACHE_PER_PAGE | DRUPAL_CACHE_PER_ROLE
+ *   @endcode
+ *
+ * @return
+ *   An array of cache ID parts, always containing the active theme. If the
+ *   locale module is enabled it also contains the active language. If
+ *   $granularity was passed in, more parts are added.
+ */
+function drupal_render_cid_parts($granularity = NULL) {
+  global $theme, $base_root, $user;
+
+  $cid_parts[] = $theme;
+  // If Locale is enabled but we have only one language we do not need it as cid
+  // part.
+  if (drupal_multilingual()) {
+    foreach (language_types_configurable() as $language_type) {
+      $cid_parts[] = $GLOBALS[$language_type]->language;
+    }
+  }
+
+  if (!empty($granularity)) {
+    // 'PER_ROLE' and 'PER_USER' are mutually exclusive. 'PER_USER' can be a
+    // resource drag for sites with many users, so when a module is being
+    // equivocal, we favor the less expensive 'PER_ROLE' pattern.
+    if ($granularity & DRUPAL_CACHE_PER_ROLE) {
+      $cid_parts[] = 'r.' . implode(',', array_keys($user->roles));
+    }
+    elseif ($granularity & DRUPAL_CACHE_PER_USER) {
+      $cid_parts[] = "u.$user->uid";
+    }
+
+    if ($granularity & DRUPAL_CACHE_PER_PAGE) {
+      $cid_parts[] = $base_root . request_uri();
+    }
+  }
+
+  return $cid_parts;
+}
+
+/**
+ * Creates the cache ID for a renderable element.
+ *
+ * This creates the cache ID string, either by returning the #cache['cid']
+ * property if present or by building the cache ID out of the #cache['keys']
+ * and, optionally, the #cache['granularity'] properties.
+ *
+ * @param $elements
+ *   A renderable array.
+ *
+ * @return
+ *   The cache ID string, or FALSE if the element may not be cached.
+ */
+function drupal_render_cid_create($elements) {
+  if (isset($elements['#cache']['cid'])) {
+    return $elements['#cache']['cid'];
+  }
+  elseif (isset($elements['#cache']['keys'])) {
+    $granularity = isset($elements['#cache']['granularity']) ? $elements['#cache']['granularity'] : NULL;
+    // Merge in additional cache ID parts based provided by drupal_render_cid_parts().
+    $cid_parts = array_merge($elements['#cache']['keys'], drupal_render_cid_parts($granularity));
+    return implode(':', $cid_parts);
+  }
+  return FALSE;
+}
+
+/**
+ * Function used by uasort to sort structured arrays by weight.
+ */
+function element_sort($a, $b) {
+  $a_weight = (is_array($a) && isset($a['#weight'])) ? $a['#weight'] : 0;
+  $b_weight = (is_array($b) && isset($b['#weight'])) ? $b['#weight'] : 0;
+  if ($a_weight == $b_weight) {
+    return 0;
+  }
+  return ($a_weight < $b_weight) ? -1 : 1;
+}
+
+/**
+ * Array sorting callback; sorts elements by title.
+ */
+function element_sort_by_title($a, $b) {
+  $a_title = (is_array($a) && isset($a['#title'])) ? $a['#title'] : '';
+  $b_title = (is_array($b) && isset($b['#title'])) ? $b['#title'] : '';
+  return strnatcasecmp($a_title, $b_title);
+}
+
+/**
+ * Retrieves the default properties for the defined element type.
+ *
+ * @param $type
+ *   An element type as defined by hook_element_info().
+ */
+function element_info($type) {
+  // Use the advanced drupal_static() pattern, since this is called very often.
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['cache'] = &drupal_static(__FUNCTION__);
+  }
+  $cache = &$drupal_static_fast['cache'];
+
+  if (!isset($cache)) {
+    $cache = module_invoke_all('element_info');
+    foreach ($cache as $element_type => $info) {
+      $cache[$element_type]['#type'] = $element_type;
+    }
+    // Allow modules to alter the element type defaults.
+    drupal_alter('element_info', $cache);
+  }
+
+  return isset($cache[$type]) ? $cache[$type] : array();
+}
+
+/**
+ * Retrieves a single property for the defined element type.
+ *
+ * @param $type
+ *   An element type as defined by hook_element_info().
+ * @param $property_name
+ *   The property within the element type that should be returned.
+ * @param $default
+ *   (Optional) The value to return if the element type does not specify a
+ *   value for the property. Defaults to NULL.
+ */
+function element_info_property($type, $property_name, $default = NULL) {
+  return (($info = element_info($type)) && array_key_exists($property_name, $info)) ? $info[$property_name] : $default;
+}
+
+/**
+ * Sorts a structured array by the 'weight' element.
+ *
+ * Note that the sorting is by the 'weight' array element, not by the render
+ * element property '#weight'.
+ *
+ * Callback for uasort() used in various functions.
+ *
+ * @param $a
+ *   First item for comparison. The compared items should be associative arrays
+ *   that optionally include a 'weight' element. For items without a 'weight'
+ *   element, a default value of 0 will be used.
+ * @param $b
+ *   Second item for comparison.
+ */
+function drupal_sort_weight($a, $b) {
+  $a_weight = (is_array($a) && isset($a['weight'])) ? $a['weight'] : 0;
+  $b_weight = (is_array($b) && isset($b['weight'])) ? $b['weight'] : 0;
+  if ($a_weight == $b_weight) {
+    return 0;
+  }
+  return ($a_weight < $b_weight) ? -1 : 1;
+}
+
+/**
+ * Array sorting callback; sorts elements by 'title' key.
+ */
+function drupal_sort_title($a, $b) {
+  if (!isset($b['title'])) {
+    return -1;
+  }
+  if (!isset($a['title'])) {
+    return 1;
+  }
+  return strcasecmp($a['title'], $b['title']);
+}
+
+/**
+ * Checks if the key is a property.
+ */
+function element_property($key) {
+  return $key[0] == '#';
+}
+
+/**
+ * Gets properties of a structured array element (keys beginning with '#').
+ */
+function element_properties($element) {
+  return array_filter(array_keys((array) $element), 'element_property');
+}
+
+/**
+ * Checks if the key is a child.
+ */
+function element_child($key) {
+  return !isset($key[0]) || $key[0] != '#';
+}
+
+/**
+ * Identifies the children of an element array, optionally sorted by weight.
+ *
+ * The children of a element array are those key/value pairs whose key does
+ * not start with a '#'. See drupal_render() for details.
+ *
+ * @param $elements
+ *   The element array whose children are to be identified.
+ * @param $sort
+ *   Boolean to indicate whether the children should be sorted by weight.
+ *
+ * @return
+ *   The array keys of the element's children.
+ */
+function element_children(&$elements, $sort = FALSE) {
+  // Do not attempt to sort elements which have already been sorted.
+  $sort = isset($elements['#sorted']) ? !$elements['#sorted'] : $sort;
+
+  // Filter out properties from the element, leaving only children.
+  $children = array();
+  $sortable = FALSE;
+  foreach ($elements as $key => $value) {
+    if ($key === '' || $key[0] !== '#') {
+      $children[$key] = $value;
+      if (is_array($value) && isset($value['#weight'])) {
+        $sortable = TRUE;
+      }
+    }
+  }
+  // Sort the children if necessary.
+  if ($sort && $sortable) {
+    uasort($children, 'element_sort');
+    // Put the sorted children back into $elements in the correct order, to
+    // preserve sorting if the same element is passed through
+    // element_children() twice.
+    foreach ($children as $key => $child) {
+      unset($elements[$key]);
+      $elements[$key] = $child;
+    }
+    $elements['#sorted'] = TRUE;
+  }
+
+  return array_keys($children);
+}
+
+/**
+ * Returns the visible children of an element.
+ *
+ * @param $elements
+ *   The parent element.
+ *
+ * @return
+ *   The array keys of the element's visible children.
+ */
+function element_get_visible_children(array $elements) {
+  $visible_children = array();
+
+  foreach (element_children($elements) as $key) {
+    $child = $elements[$key];
+
+    // Skip un-accessible children.
+    if (isset($child['#access']) && !$child['#access']) {
+      continue;
+    }
+
+    // Skip value and hidden elements, since they are not rendered.
+    if (isset($child['#type']) && in_array($child['#type'], array('value', 'hidden'))) {
+      continue;
+    }
+
+    $visible_children[$key] = $child;
+  }
+
+  return array_keys($visible_children);
+}
+
+/**
+ * Sets HTML attributes based on element properties.
+ *
+ * @param $element
+ *   The renderable element to process.
+ * @param $map
+ *   An associative array whose keys are element property names and whose values
+ *   are the HTML attribute names to set for corresponding the property; e.g.,
+ *   array('#propertyname' => 'attributename'). If both names are identical
+ *   except for the leading '#', then an attribute name value is sufficient and
+ *   no property name needs to be specified.
+ */
+function element_set_attributes(array &$element, array $map) {
+  foreach ($map as $property => $attribute) {
+    // If the key is numeric, the attribute name needs to be taken over.
+    if (is_int($property)) {
+      $property = '#' . $attribute;
+    }
+    // Do not overwrite already existing attributes.
+    if (isset($element[$property]) && !isset($element['#attributes'][$attribute])) {
+      $element['#attributes'][$attribute] = $element[$property];
+    }
+  }
+}
+
+/**
+ * Recursively computes the difference of arrays with additional index check.
+ *
+ * This is a version of array_diff_assoc() that supports multidimensional
+ * arrays.
+ *
+ * @param array $array1
+ *   The array to compare from.
+ * @param array $array2
+ *   The array to compare to.
+ *
+ * @return array
+ *   Returns an array containing all the values from array1 that are not present
+ *   in array2.
+ */
+function drupal_array_diff_assoc_recursive($array1, $array2) {
+  $difference = array();
+
+  foreach ($array1 as $key => $value) {
+    if (is_array($value)) {
+      if (!array_key_exists($key, $array2) || !is_array($array2[$key])) {
+        $difference[$key] = $value;
+      }
+      else {
+        $new_diff = drupal_array_diff_assoc_recursive($value, $array2[$key]);
+        if (!empty($new_diff)) {
+          $difference[$key] = $new_diff;
+        }
+      }
+    }
+    elseif (!array_key_exists($key, $array2) || $array2[$key] !== $value) {
+      $difference[$key] = $value;
+    }
+  }
+
+  return $difference;
+}
+
+/**
+ * Sets a value in a nested array with variable depth.
+ *
+ * This helper function should be used when the depth of the array element you
+ * are changing may vary (that is, the number of parent keys is variable). It
+ * is primarily used for form structures and renderable arrays.
+ *
+ * Example:
+ * @code
+ * // Assume you have a 'signature' element somewhere in a form. It might be:
+ * $form['signature_settings']['signature'] = array(
+ *   '#type' => 'text_format',
+ *   '#title' => t('Signature'),
+ * );
+ * // Or, it might be further nested:
+ * $form['signature_settings']['user']['signature'] = array(
+ *   '#type' => 'text_format',
+ *   '#title' => t('Signature'),
+ * );
+ * @endcode
+ *
+ * To deal with the situation, the code needs to figure out the route to the
+ * element, given an array of parents that is either
+ * @code array('signature_settings', 'signature') @endcode in the first case or
+ * @code array('signature_settings', 'user', 'signature') @endcode in the second
+ * case.
+ *
+ * Without this helper function the only way to set the signature element in one
+ * line would be using eval(), which should be avoided:
+ * @code
+ * // Do not do this! Avoid eval().
+ * eval('$form[\'' . implode("']['", $parents) . '\'] = $element;');
+ * @endcode
+ *
+ * Instead, use this helper function:
+ * @code
+ * drupal_array_set_nested_value($form, $parents, $element);
+ * @endcode
+ *
+ * However if the number of array parent keys is static, the value should always
+ * be set directly rather than calling this function. For instance, for the
+ * first example we could just do:
+ * @code
+ * $form['signature_settings']['signature'] = $element;
+ * @endcode
+ *
+ * @param $array
+ *   A reference to the array to modify.
+ * @param $parents
+ *   An array of parent keys, starting with the outermost key.
+ * @param $value
+ *   The value to set.
+ * @param $force
+ *   (Optional) If TRUE, the value is forced into the structure even if it
+ *   requires the deletion of an already existing non-array parent value. If
+ *   FALSE, PHP throws an error if trying to add into a value that is not an
+ *   array. Defaults to FALSE.
+ *
+ * @see drupal_array_get_nested_value()
+ */
+function drupal_array_set_nested_value(array &$array, array $parents, $value, $force = FALSE) {
+  $ref = &$array;
+  foreach ($parents as $parent) {
+    // PHP auto-creates container arrays and NULL entries without error if $ref
+    // is NULL, but throws an error if $ref is set, but not an array.
+    if ($force && isset($ref) && !is_array($ref)) {
+      $ref = array();
+    }
+    $ref = &$ref[$parent];
+  }
+  $ref = $value;
+}
+
+/**
+ * Retrieves a value from a nested array with variable depth.
+ *
+ * This helper function should be used when the depth of the array element being
+ * retrieved may vary (that is, the number of parent keys is variable). It is
+ * primarily used for form structures and renderable arrays.
+ *
+ * Without this helper function the only way to get a nested array value with
+ * variable depth in one line would be using eval(), which should be avoided:
+ * @code
+ * // Do not do this! Avoid eval().
+ * // May also throw a PHP notice, if the variable array keys do not exist.
+ * eval('$value = $array[\'' . implode("']['", $parents) . "'];");
+ * @endcode
+ *
+ * Instead, use this helper function:
+ * @code
+ * $value = drupal_array_get_nested_value($form, $parents);
+ * @endcode
+ *
+ * The return value will be NULL, regardless of whether the actual value is NULL
+ * or whether the requested key does not exist. If it is required to know
+ * whether the nested array key actually exists, pass a third argument that is
+ * altered by reference:
+ * @code
+ * $key_exists = NULL;
+ * $value = drupal_array_get_nested_value($form, $parents, $key_exists);
+ * if ($key_exists) {
+ *   // ... do something with $value ...
+ * }
+ * @endcode
+ *
+ * However if the number of array parent keys is static, the value should always
+ * be retrieved directly rather than calling this function. For instance:
+ * @code
+ * $value = $form['signature_settings']['signature'];
+ * @endcode
+ *
+ * @param $array
+ *   The array from which to get the value.
+ * @param $parents
+ *   An array of parent keys of the value, starting with the outermost key.
+ * @param $key_exists
+ *   (optional) If given, an already defined variable that is altered by
+ *   reference.
+ *
+ * @return
+ *   The requested nested value. Possibly NULL if the value is NULL or not all
+ *   nested parent keys exist. $key_exists is altered by reference and is a
+ *   Boolean that indicates whether all nested parent keys exist (TRUE) or not
+ *   (FALSE). This allows to distinguish between the two possibilities when NULL
+ *   is returned.
+ *
+ * @see drupal_array_set_nested_value()
+ */
+function &drupal_array_get_nested_value(array &$array, array $parents, &$key_exists = NULL) {
+  $ref = &$array;
+  foreach ($parents as $parent) {
+    if (is_array($ref) && array_key_exists($parent, $ref)) {
+      $ref = &$ref[$parent];
+    }
+    else {
+      $key_exists = FALSE;
+      $null = NULL;
+      return $null;
+    }
+  }
+  $key_exists = TRUE;
+  return $ref;
+}
+
+/**
+ * Determines whether a nested array contains the requested keys.
+ *
+ * This helper function should be used when the depth of the array element to be
+ * checked may vary (that is, the number of parent keys is variable). See
+ * drupal_array_set_nested_value() for details. It is primarily used for form
+ * structures and renderable arrays.
+ *
+ * If it is required to also get the value of the checked nested key, use
+ * drupal_array_get_nested_value() instead.
+ *
+ * If the number of array parent keys is static, this helper function is
+ * unnecessary and the following code can be used instead:
+ * @code
+ * $value_exists = isset($form['signature_settings']['signature']);
+ * $key_exists = array_key_exists('signature', $form['signature_settings']);
+ * @endcode
+ *
+ * @param $array
+ *   The array with the value to check for.
+ * @param $parents
+ *   An array of parent keys of the value, starting with the outermost key.
+ *
+ * @return
+ *   TRUE if all the parent keys exist, FALSE otherwise.
+ *
+ * @see drupal_array_get_nested_value()
+ */
+function drupal_array_nested_key_exists(array $array, array $parents) {
+  // Although this function is similar to PHP's array_key_exists(), its
+  // arguments should be consistent with drupal_array_get_nested_value().
+  $key_exists = NULL;
+  drupal_array_get_nested_value($array, $parents, $key_exists);
+  return $key_exists;
+}
+
+/**
+ * Provides theme registration for themes across .inc files.
+ */
+function drupal_common_theme() {
+  return array(
+    // From theme.inc.
+    'html' => array(
+      'render element' => 'page',
+      'template' => 'html',
+    ),
+    'page' => array(
+      'render element' => 'page',
+      'template' => 'page',
+    ),
+    'region' => array(
+      'render element' => 'elements',
+      'template' => 'region',
+    ),
+    'status_messages' => array(
+      'variables' => array('display' => NULL),
+    ),
+    'link' => array(
+      'variables' => array('text' => NULL, 'path' => NULL, 'options' => array()),
+    ),
+    'links' => array(
+      'variables' => array('links' => NULL, 'attributes' => array('class' => array('links')), 'heading' => array()),
+    ),
+    'image' => array(
+      // HTML 4 and XHTML 1.0 always require an alt attribute. The HTML 5 draft
+      // allows the alt attribute to be omitted in some cases. Therefore,
+      // default the alt attribute to an empty string, but allow code calling
+      // theme('image') to pass explicit NULL for it to be omitted. Usually,
+      // neither omission nor an empty string satisfies accessibility
+      // requirements, so it is strongly encouraged for code calling
+      // theme('image') to pass a meaningful value for the alt variable.
+      // - http://www.w3.org/TR/REC-html40/struct/objects.html#h-13.8
+      // - http://www.w3.org/TR/xhtml1/dtds.html
+      // - http://dev.w3.org/html5/spec/Overview.html#alt
+      // The title attribute is optional in all cases, so it is omitted by
+      // default.
+      'variables' => array('path' => NULL, 'width' => NULL, 'height' => NULL, 'alt' => '', 'title' => NULL, 'attributes' => array()),
+    ),
+    'breadcrumb' => array(
+      'variables' => array('breadcrumb' => NULL),
+    ),
+    'help' => array(
+      'variables' => array(),
+    ),
+    'table' => array(
+      'variables' => array('header' => NULL, 'rows' => NULL, 'attributes' => array(), 'caption' => NULL, 'colgroups' => array(), 'sticky' => TRUE, 'empty' => ''),
+    ),
+    'tablesort_indicator' => array(
+      'variables' => array('style' => NULL),
+    ),
+    'mark' => array(
+      'variables' => array('type' => MARK_NEW),
+    ),
+    'item_list' => array(
+      'variables' => array('items' => array(), 'title' => NULL, 'type' => 'ul', 'attributes' => array()),
+    ),
+    'more_help_link' => array(
+      'variables' => array('url' => NULL),
+    ),
+    'feed_icon' => array(
+      'variables' => array('url' => NULL, 'title' => NULL),
+    ),
+    'more_link' => array(
+      'variables' => array('url' => NULL, 'title' => NULL)
+    ),
+    'username' => array(
+      'variables' => array('account' => NULL),
+    ),
+    'progress_bar' => array(
+      'variables' => array('percent' => NULL, 'message' => NULL),
+    ),
+    'indentation' => array(
+      'variables' => array('size' => 1),
+    ),
+    'html_tag' => array(
+      'render element' => 'element',
+    ),
+    // From theme.maintenance.inc.
+    'maintenance_page' => array(
+      'variables' => array('content' => NULL, 'show_messages' => TRUE),
+      'template' => 'maintenance-page',
+    ),
+    'update_page' => array(
+      'variables' => array('content' => NULL, 'show_messages' => TRUE),
+    ),
+    'install_page' => array(
+      'variables' => array('content' => NULL),
+    ),
+    'task_list' => array(
+      'variables' => array('items' => NULL, 'active' => NULL),
+    ),
+    'authorize_message' => array(
+      'variables' => array('message' => NULL, 'success' => TRUE),
+    ),
+    'authorize_report' => array(
+      'variables' => array('messages' => array()),
+    ),
+    // From pager.inc.
+    'pager' => array(
+      'variables' => array('tags' => array(), 'element' => 0, 'parameters' => array(), 'quantity' => 9),
+    ),
+    'pager_first' => array(
+      'variables' => array('text' => NULL, 'element' => 0, 'parameters' => array()),
+    ),
+    'pager_previous' => array(
+      'variables' => array('text' => NULL, 'element' => 0, 'interval' => 1, 'parameters' => array()),
+    ),
+    'pager_next' => array(
+      'variables' => array('text' => NULL, 'element' => 0, 'interval' => 1, 'parameters' => array()),
+    ),
+    'pager_last' => array(
+      'variables' => array('text' => NULL, 'element' => 0, 'parameters' => array()),
+    ),
+    'pager_link' => array(
+      'variables' => array('text' => NULL, 'page_new' => NULL, 'element' => NULL, 'parameters' => array(), 'attributes' => array()),
+    ),
+    // From menu.inc.
+    'menu_link' => array(
+      'render element' => 'element',
+    ),
+    'menu_tree' => array(
+      'render element' => 'tree',
+    ),
+    'menu_local_task' => array(
+      'render element' => 'element',
+    ),
+    'menu_local_action' => array(
+      'render element' => 'element',
+    ),
+    'menu_local_tasks' => array(
+      'variables' => array('primary' => array(), 'secondary' => array()),
+    ),
+    // From form.inc.
+    'select' => array(
+      'render element' => 'element',
+    ),
+    'fieldset' => array(
+      'render element' => 'element',
+    ),
+    'radio' => array(
+      'render element' => 'element',
+    ),
+    'radios' => array(
+      'render element' => 'element',
+    ),
+    'date' => array(
+      'render element' => 'element',
+    ),
+    'exposed_filters' => array(
+      'render element' => 'form',
+    ),
+    'checkbox' => array(
+      'render element' => 'element',
+    ),
+    'checkboxes' => array(
+      'render element' => 'element',
+    ),
+    'button' => array(
+      'render element' => 'element',
+    ),
+    'image_button' => array(
+      'render element' => 'element',
+    ),
+    'hidden' => array(
+      'render element' => 'element',
+    ),
+    'textfield' => array(
+      'render element' => 'element',
+    ),
+    'form' => array(
+      'render element' => 'element',
+    ),
+    'textarea' => array(
+      'render element' => 'element',
+    ),
+    'password' => array(
+      'render element' => 'element',
+    ),
+    'file' => array(
+      'render element' => 'element',
+    ),
+    'tableselect' => array(
+      'render element' => 'element',
+    ),
+    'form_element' => array(
+      'render element' => 'element',
+    ),
+    'form_required_marker' => array(
+      'render element' => 'element',
+    ),
+    'form_element_label' => array(
+      'render element' => 'element',
+    ),
+    'vertical_tabs' => array(
+      'render element' => 'element',
+    ),
+    'container' => array(
+      'render element' => 'element',
+    ),
+  );
+}
+
+/**
+ * @addtogroup schemaapi
+ * @{
+ */
+
+/**
+ * Creates all tables defined in a module's hook_schema().
+ *
+ * Note: This function does not pass the module's schema through
+ * hook_schema_alter(). The module's tables will be created exactly as the
+ * module defines them.
+ *
+ * @param $module
+ *   The module for which the tables will be created.
+ */
+function drupal_install_schema($module) {
+  $schema = drupal_get_schema_unprocessed($module);
+  _drupal_schema_initialize($schema, $module, FALSE);
+
+  foreach ($schema as $name => $table) {
+    db_create_table($name, $table);
+  }
+}
+
+/**
+ * Removes all tables defined in a module's hook_schema().
+ *
+ * Note: This function does not pass the module's schema through
+ * hook_schema_alter(). The module's tables will be created exactly as the
+ * module defines them.
+ *
+ * @param $module
+ *   The module for which the tables will be removed.
+ *
+ * @return
+ *   An array of arrays with the following key/value pairs:
+ *    - success: a boolean indicating whether the query succeeded.
+ *    - query: the SQL query(s) executed, passed through check_plain().
+ */
+function drupal_uninstall_schema($module) {
+  $schema = drupal_get_schema_unprocessed($module);
+  _drupal_schema_initialize($schema, $module, FALSE);
+
+  foreach ($schema as $table) {
+    if (db_table_exists($table['name'])) {
+      db_drop_table($table['name']);
+    }
+  }
+}
+
+/**
+ * Returns the unprocessed and unaltered version of a module's schema.
+ *
+ * Use this function only if you explicitly need the original
+ * specification of a schema, as it was defined in a module's
+ * hook_schema(). No additional default values will be set,
+ * hook_schema_alter() is not invoked and these unprocessed
+ * definitions won't be cached.
+ *
+ * This function can be used to retrieve a schema specification in
+ * hook_schema(), so it allows you to derive your tables from existing
+ * specifications.
+ *
+ * It is also used by drupal_install_schema() and
+ * drupal_uninstall_schema() to ensure that a module's tables are
+ * created exactly as specified without any changes introduced by a
+ * module that implements hook_schema_alter().
+ *
+ * @param $module
+ *   The module to which the table belongs.
+ * @param $table
+ *   The name of the table. If not given, the module's complete schema
+ *   is returned.
+ */
+function drupal_get_schema_unprocessed($module, $table = NULL) {
+  // Load the .install file to get hook_schema.
+  module_load_install($module);
+  $schema = module_invoke($module, 'schema');
+
+  if (isset($table) && isset($schema[$table])) {
+    return $schema[$table];
+  }
+  elseif (!empty($schema)) {
+    return $schema;
+  }
+  return array();
+}
+
+/**
+ * Fills in required default values for table definitions from hook_schema().
+ *
+ * @param $schema
+ *   The schema definition array as it was returned by the module's
+ *   hook_schema().
+ * @param $module
+ *   The module for which hook_schema() was invoked.
+ * @param $remove_descriptions
+ *   (optional) Whether to additionally remove 'description' keys of all tables
+ *   and fields to improve performance of serialize() and unserialize().
+ *   Defaults to TRUE.
+ */
+function _drupal_schema_initialize(&$schema, $module, $remove_descriptions = TRUE) {
+  // Set the name and module key for all tables.
+  foreach ($schema as $name => &$table) {
+    if (empty($table['module'])) {
+      $table['module'] = $module;
+    }
+    if (!isset($table['name'])) {
+      $table['name'] = $name;
+    }
+    if ($remove_descriptions) {
+      unset($table['description']);
+      foreach ($table['fields'] as &$field) {
+        unset($field['description']);
+      }
+    }
+  }
+}
+
+/**
+ * Retrieves a list of fields from a table schema.
+ *
+ * The returned list is suitable for use in an SQL query.
+ *
+ * @param $table
+ *   The name of the table from which to retrieve fields.
+ * @param
+ *   An optional prefix to to all fields.
+ *
+ * @return An array of fields.
+ */
+function drupal_schema_fields_sql($table, $prefix = NULL) {
+  $schema = drupal_get_schema($table);
+  $fields = array_keys($schema['fields']);
+  if ($prefix) {
+    $columns = array();
+    foreach ($fields as $field) {
+      $columns[] = "$prefix.$field";
+    }
+    return $columns;
+  }
+  else {
+    return $fields;
+  }
+}
+
+/**
+ * Saves (inserts or updates) a record to the database based upon the schema.
+ *
+ * Do not use drupal_write_record() within hook_update_N() functions, since the
+ * database schema cannot be relied upon when a user is running a series of
+ * updates. Instead, use db_insert() or db_update() to save the record.
+ *
+ * @param $table
+ *   The name of the table; this must be defined by a hook_schema()
+ *   implementation.
+ * @param $record
+ *   An object or array representing the record to write, passed in by
+ *   reference. If inserting a new record, values not provided in $record will
+ *   be populated in $record and in the database with the default values from
+ *   the schema, as well as a single serial (auto-increment) field (if present).
+ *   If updating an existing record, only provided values are updated in the
+ *   database, and $record is not modified.
+ * @param $primary_keys
+ *   To indicate that this is a new record to be inserted, omit this argument.
+ *   If this is an update, this argument specifies the primary keys' field
+ *   names. If there is only 1 field in the key, you may pass in a string; if
+ *   there are multiple fields in the key, pass in an array.
+ *
+ * @return
+ *   If the record insert or update failed, returns FALSE. If it succeeded,
+ *   returns SAVED_NEW or SAVED_UPDATED, depending on the operation performed.
+ */
+function drupal_write_record($table, &$record, $primary_keys = array()) {
+  // Standardize $primary_keys to an array.
+  if (is_string($primary_keys)) {
+    $primary_keys = array($primary_keys);
+  }
+
+  $schema = drupal_get_schema($table);
+  if (empty($schema)) {
+    return FALSE;
+  }
+
+  $object = (object) $record;
+  $fields = array();
+
+  // Go through the schema to determine fields to write.
+  foreach ($schema['fields'] as $field => $info) {
+    if ($info['type'] == 'serial') {
+      // Skip serial types if we are updating.
+      if (!empty($primary_keys)) {
+        continue;
+      }
+      // Track serial field so we can helpfully populate them after the query.
+      // NOTE: Each table should come with one serial field only.
+      $serial = $field;
+    }
+
+    // Skip field if it is in $primary_keys as it is unnecessary to update a
+    // field to the value it is already set to.
+    if (in_array($field, $primary_keys)) {
+      continue;
+    }
+
+    if (!property_exists($object, $field)) {
+      // Skip fields that are not provided, default values are already known
+      // by the database.
+      continue;
+    }
+
+    // Build array of fields to update or insert.
+    if (empty($info['serialize'])) {
+      $fields[$field] = $object->$field;
+    }
+    else {
+      $fields[$field] = serialize($object->$field);
+    }
+
+    // Type cast to proper datatype, except when the value is NULL and the
+    // column allows this.
+    //
+    // MySQL PDO silently casts e.g. FALSE and '' to 0 when inserting the value
+    // into an integer column, but PostgreSQL PDO does not. Also type cast NULL
+    // when the column does not allow this.
+    if (isset($object->$field) || !empty($info['not null'])) {
+      if ($info['type'] == 'int' || $info['type'] == 'serial') {
+        $fields[$field] = (int) $fields[$field];
+      }
+      elseif ($info['type'] == 'float') {
+        $fields[$field] = (float) $fields[$field];
+      }
+      else {
+        $fields[$field] = (string) $fields[$field];
+      }
+    }
+  }
+
+  if (empty($fields)) {
+    return;
+  }
+
+  // Build the SQL.
+  if (empty($primary_keys)) {
+    // We are doing an insert.
+    $options = array('return' => Database::RETURN_INSERT_ID);
+    if (isset($serial) && isset($fields[$serial])) {
+      // If the serial column has been explicitly set with an ID, then we don't
+      // require the database to return the last insert id.
+      if ($fields[$serial]) {
+        $options['return'] = Database::RETURN_AFFECTED;
+      }
+      // If a serial column does exist with no value (i.e. 0) then remove it as
+      // the database will insert the correct value for us.
+      else {
+        unset($fields[$serial]);
+      }
+    }
+    $query = db_insert($table, $options)->fields($fields);
+    $return = SAVED_NEW;
+  }
+  else {
+    $query = db_update($table)->fields($fields);
+    foreach ($primary_keys as $key) {
+      $query->condition($key, $object->$key);
+    }
+    $return = SAVED_UPDATED;
+  }
+
+  // Execute the SQL.
+  if ($query_return = $query->execute()) {
+    if (isset($serial)) {
+      // If the database was not told to return the last insert id, it will be
+      // because we already know it.
+      if (isset($options) && $options['return'] != Database::RETURN_INSERT_ID) {
+        $object->$serial = $fields[$serial];
+      }
+      else {
+        $object->$serial = $query_return;
+      }
+    }
+  }
+  // If we have a single-field primary key but got no insert ID, the
+  // query failed. Note that we explicitly check for FALSE, because
+  // a valid update query which doesn't change any values will return
+  // zero (0) affected rows.
+  elseif ($query_return === FALSE && count($primary_keys) == 1) {
+    $return = FALSE;
+  }
+
+  // If we are inserting, populate empty fields with default values.
+  if (empty($primary_keys)) {
+    foreach ($schema['fields'] as $field => $info) {
+      if (isset($info['default']) && !property_exists($object, $field)) {
+        $object->$field = $info['default'];
+      }
+    }
+  }
+
+  // If we began with an array, convert back.
+  if (is_array($record)) {
+    $record = (array) $object;
+  }
+
+  return $return;
+}
+
+/**
+ * @} End of "addtogroup schemaapi".
+ */
+
+/**
+ * Parses Drupal module and theme .info files.
+ *
+ * Info files are NOT for placing arbitrary theme and module-specific settings.
+ * Use variable_get() and variable_set() for that.
+ *
+ * Information stored in a module .info file:
+ * - name: The real name of the module for display purposes.
+ * - description: A brief description of the module.
+ * - dependencies: An array of shortnames of other modules this module requires.
+ * - package: The name of the package of modules this module belongs to.
+ *
+ * See forum.info for an example of a module .info file.
+ *
+ * Information stored in a theme .info file:
+ * - name: The real name of the theme for display purposes.
+ * - description: Brief description.
+ * - screenshot: Path to screenshot relative to the theme's .info file.
+ * - engine: Theme engine; typically phptemplate.
+ * - base: Name of a base theme, if applicable; e.g., base = zen.
+ * - regions: Listed regions; e.g., region[left] = Left sidebar.
+ * - features: Features available; e.g., features[] = logo.
+ * - stylesheets: Theme stylesheets; e.g., stylesheets[all][] = my-style.css.
+ * - scripts: Theme scripts; e.g., scripts[] = my-script.js.
+ *
+ * See bartik.info for an example of a theme .info file.
+ *
+ * @param $filename
+ *   The file we are parsing. Accepts file with relative or absolute path.
+ *
+ * @return
+ *   The info array.
+ *
+ * @see drupal_parse_info_format()
+ */
+function drupal_parse_info_file($filename) {
+  $info = &drupal_static(__FUNCTION__, array());
+
+  if (!isset($info[$filename])) {
+    if (!file_exists($filename)) {
+      $info[$filename] = array();
+    }
+    else {
+      $data = file_get_contents($filename);
+      $info[$filename] = drupal_parse_info_format($data);
+    }
+  }
+  return $info[$filename];
+}
+
+/**
+ * Parses data in Drupal's .info format.
+ *
+ * Data should be in an .ini-like format to specify values. White-space
+ * generally doesn't matter, except inside values:
+ * @code
+ *   key = value
+ *   key = "value"
+ *   key = 'value'
+ *   key = "multi-line
+ *   value"
+ *   key = 'multi-line
+ *   value'
+ *   key
+ *   =
+ *   'value'
+ * @endcode
+ *
+ * Arrays are created using a HTTP GET alike syntax:
+ * @code
+ *   key[] = "numeric array"
+ *   key[index] = "associative array"
+ *   key[index][] = "nested numeric array"
+ *   key[index][index] = "nested associative array"
+ * @endcode
+ *
+ * PHP constants are substituted in, but only when used as the entire value.
+ * Comments should start with a semi-colon at the beginning of a line.
+ *
+ * @param $data
+ *   A string to parse.
+ *
+ * @return
+ *   The info array.
+ *
+ * @see drupal_parse_info_file()
+ */
+function drupal_parse_info_format($data) {
+  $info = array();
+  $constants = get_defined_constants();
+
+  if (preg_match_all('
+    @^\s*                           # Start at the beginning of a line, ignoring leading whitespace
+    ((?:
+      [^=;\[\]]|                    # Key names cannot contain equal signs, semi-colons or square brackets,
+      \[[^\[\]]*\]                  # unless they are balanced and not nested
+    )+?)
+    \s*=\s*                         # Key/value pairs are separated by equal signs (ignoring white-space)
+    (?:
+      ("(?:[^"]|(?<=\\\\)")*")|     # Double-quoted string, which may contain slash-escaped quotes/slashes
+      (\'(?:[^\']|(?<=\\\\)\')*\')| # Single-quoted string, which may contain slash-escaped quotes/slashes
+      ([^\r\n]*?)                   # Non-quoted string
+    )\s*$                           # Stop at the next end of a line, ignoring trailing whitespace
+    @msx', $data, $matches, PREG_SET_ORDER)) {
+    foreach ($matches as $match) {
+      // Fetch the key and value string.
+      $i = 0;
+      foreach (array('key', 'value1', 'value2', 'value3') as $var) {
+        $$var = isset($match[++$i]) ? $match[$i] : '';
+      }
+      $value = stripslashes(substr($value1, 1, -1)) . stripslashes(substr($value2, 1, -1)) . $value3;
+
+      // Parse array syntax.
+      $keys = preg_split('/\]?\[/', rtrim($key, ']'));
+      $last = array_pop($keys);
+      $parent = &$info;
+
+      // Create nested arrays.
+      foreach ($keys as $key) {
+        if ($key == '') {
+          $key = count($parent);
+        }
+        if (!isset($parent[$key]) || !is_array($parent[$key])) {
+          $parent[$key] = array();
+        }
+        $parent = &$parent[$key];
+      }
+
+      // Handle PHP constants.
+      if (isset($constants[$value])) {
+        $value = $constants[$value];
+      }
+
+      // Insert actual value.
+      if ($last == '') {
+        $last = count($parent);
+      }
+      $parent[$last] = $value;
+    }
+  }
+
+  return $info;
+}
+
+/**
+ * Returns a list of severity levels, as defined in RFC 3164.
+ *
+ * @return
+ *   Array of the possible severity levels for log messages.
+ *
+ * @see http://www.ietf.org/rfc/rfc3164.txt
+ * @see watchdog()
+ * @ingroup logging_severity_levels
+ */
+function watchdog_severity_levels() {
+  return array(
+    WATCHDOG_EMERGENCY => t('emergency'),
+    WATCHDOG_ALERT     => t('alert'),
+    WATCHDOG_CRITICAL  => t('critical'),
+    WATCHDOG_ERROR     => t('error'),
+    WATCHDOG_WARNING   => t('warning'),
+    WATCHDOG_NOTICE    => t('notice'),
+    WATCHDOG_INFO      => t('info'),
+    WATCHDOG_DEBUG     => t('debug'),
+  );
+}
+
+
+/**
+ * Explodes a string of tags into an array.
+ *
+ * @see drupal_implode_tags()
+ */
+function drupal_explode_tags($tags) {
+  // This regexp allows the following types of user input:
+  // this, "somecompany, llc", "and ""this"" w,o.rks", foo bar
+  $regexp = '%(?:^|,\ *)("(?>[^"]*)(?>""[^"]* )*"|(?: [^",]*))%x';
+  preg_match_all($regexp, $tags, $matches);
+  $typed_tags = array_unique($matches[1]);
+
+  $tags = array();
+  foreach ($typed_tags as $tag) {
+    // If a user has escaped a term (to demonstrate that it is a group,
+    // or includes a comma or quote character), we remove the escape
+    // formatting so to save the term into the database as the user intends.
+    $tag = trim(str_replace('""', '"', preg_replace('/^"(.*)"$/', '\1', $tag)));
+    if ($tag != "") {
+      $tags[] = $tag;
+    }
+  }
+
+  return $tags;
+}
+
+/**
+ * Implodes an array of tags into a string.
+ *
+ * @see drupal_explode_tags()
+ */
+function drupal_implode_tags($tags) {
+  $encoded_tags = array();
+  foreach ($tags as $tag) {
+    // Commas and quotes in tag names are special cases, so encode them.
+    if (strpos($tag, ',') !== FALSE || strpos($tag, '"') !== FALSE) {
+      $tag = '"' . str_replace('"', '""', $tag) . '"';
+    }
+
+    $encoded_tags[] = $tag;
+  }
+  return implode(', ', $encoded_tags);
+}
+
+/**
+ * Flushes all cached data on the site.
+ *
+ * Empties cache tables, rebuilds the menu cache and theme registries, and
+ * invokes a hook so that other modules' cache data can be cleared as well.
+ */
+function drupal_flush_all_caches() {
+  // Change query-strings on css/js files to enforce reload for all users.
+  _drupal_flush_css_js();
+
+  registry_rebuild();
+  drupal_clear_css_cache();
+  drupal_clear_js_cache();
+
+  // Rebuild the theme data. Note that the module data is rebuilt above, as
+  // part of registry_rebuild().
+  system_rebuild_theme_data();
+  drupal_theme_rebuild();
+
+  entity_info_cache_clear();
+  node_types_rebuild();
+  // node_menu() defines menu items based on node types so it needs to come
+  // after node types are rebuilt.
+  menu_rebuild();
+
+  // Synchronize to catch any actions that were added or removed.
+  actions_synchronize();
+
+  // Don't clear cache_form - in-progress form submissions may break.
+  // Ordered so clearing the page cache will always be the last action.
+  $core = array('cache', 'cache_path', 'cache_filter', 'cache_bootstrap', 'cache_page');
+  $cache_tables = array_merge(module_invoke_all('flush_caches'), $core);
+  foreach ($cache_tables as $table) {
+    cache_clear_all('*', $table, TRUE);
+  }
+
+  // Rebuild the bootstrap module list. We do this here so that developers
+  // can get new hook_boot() implementations registered without having to
+  // write a hook_update_N() function.
+  _system_update_bootstrap_status();
+}
+
+/**
+ * Changes the dummy query string added to all CSS and JavaScript files.
+ *
+ * Changing the dummy query string appended to CSS and JavaScript files forces
+ * all browsers to reload fresh files.
+ */
+function _drupal_flush_css_js() {
+  // The timestamp is converted to base 36 in order to make it more compact.
+  variable_set('css_js_query_string', base_convert(REQUEST_TIME, 10, 36));
+}
+
+/**
+ * Outputs debug information.
+ *
+ * The debug information is passed on to trigger_error() after being converted
+ * to a string using _drupal_debug_message().
+ *
+ * @param $data
+ *   Data to be output.
+ * @param $label
+ *   Label to prefix the data.
+ * @param $print_r
+ *   Flag to switch between print_r() and var_export() for data conversion to
+ *   string. Set $print_r to TRUE when dealing with a recursive data structure
+ *   as var_export() will generate an error.
+ */
+function debug($data, $label = NULL, $print_r = FALSE) {
+  // Print $data contents to string.
+  $string = check_plain($print_r ? print_r($data, TRUE) : var_export($data, TRUE));
+
+  // Display values with pre-formatting to increase readability.
+  $string = '<pre>' . $string . '</pre>';
+
+  trigger_error(trim($label ? "$label: $string" : $string));
+}
+
+/**
+ * Parses a dependency for comparison by drupal_check_incompatibility().
+ *
+ * @param $dependency
+ *   A dependency string, for example 'foo (>=7.x-4.5-beta5, 3.x)'.
+ *
+ * @return
+ *   An associative array with three keys:
+ *   - 'name' includes the name of the thing to depend on (e.g. 'foo').
+ *   - 'original_version' contains the original version string (which can be
+ *     used in the UI for reporting incompatibilities).
+ *   - 'versions' is a list of associative arrays, each containing the keys
+ *     'op' and 'version'. 'op' can be one of: '=', '==', '!=', '<>', '<',
+ *     '<=', '>', or '>='. 'version' is one piece like '4.5-beta3'.
+ *   Callers should pass this structure to drupal_check_incompatibility().
+ *
+ * @see drupal_check_incompatibility()
+ */
+function drupal_parse_dependency($dependency) {
+  // We use named subpatterns and support every op that version_compare
+  // supports. Also, op is optional and defaults to equals.
+  $p_op = '(?P<operation>!=|==|=|<|<=|>|>=|<>)?';
+  // Core version is always optional: 7.x-2.x and 2.x is treated the same.
+  $p_core = '(?:' . preg_quote(DRUPAL_CORE_COMPATIBILITY) . '-)?';
+  $p_major = '(?P<major>\d+)';
+  // By setting the minor version to x, branches can be matched.
+  $p_minor = '(?P<minor>(?:\d+|x)(?:-[A-Za-z]+\d+)?)';
+  $value = array();
+  $parts = explode('(', $dependency, 2);
+  $value['name'] = trim($parts[0]);
+  if (isset($parts[1])) {
+    $value['original_version'] = ' (' . $parts[1];
+    foreach (explode(',', $parts[1]) as $version) {
+      if (preg_match("/^\s*$p_op\s*$p_core$p_major\.$p_minor/", $version, $matches)) {
+        $op = !empty($matches['operation']) ? $matches['operation'] : '=';
+        if ($matches['minor'] == 'x') {
+          // Drupal considers "2.x" to mean any version that begins with
+          // "2" (e.g. 2.0, 2.9 are all "2.x"). PHP's version_compare(),
+          // on the other hand, treats "x" as a string; so to
+          // version_compare(), "2.x" is considered less than 2.0. This
+          // means that >=2.x and <2.x are handled by version_compare()
+          // as we need, but > and <= are not.
+          if ($op == '>' || $op == '<=') {
+            $matches['major']++;
+          }
+          // Equivalence can be checked by adding two restrictions.
+          if ($op == '=' || $op == '==') {
+            $value['versions'][] = array('op' => '<', 'version' => ($matches['major'] + 1) . '.x');
+            $op = '>=';
+          }
+        }
+        $value['versions'][] = array('op' => $op, 'version' => $matches['major'] . '.' . $matches['minor']);
+      }
+    }
+  }
+  return $value;
+}
+
+/**
+ * Checks whether a version is compatible with a given dependency.
+ *
+ * @param $v
+ *   The parsed dependency structure from drupal_parse_dependency().
+ * @param $current_version
+ *   The version to check against (like 4.2).
+ *
+ * @return
+ *   NULL if compatible, otherwise the original dependency version string that
+ *   caused the incompatibility.
+ *
+ * @see drupal_parse_dependency()
+ */
+function drupal_check_incompatibility($v, $current_version) {
+  if (!empty($v['versions'])) {
+    foreach ($v['versions'] as $required_version) {
+      if ((isset($required_version['op']) && !version_compare($current_version, $required_version['version'], $required_version['op']))) {
+        return $v['original_version'];
+      }
+    }
+  }
+}
+
+/**
+ * Get the entity info array of an entity type.
+ *
+ * @param $entity_type
+ *   The entity type, e.g. node, for which the info shall be returned, or NULL
+ *   to return an array with info about all types.
+ *
+ * @see hook_entity_info()
+ * @see hook_entity_info_alter()
+ */
+function entity_get_info($entity_type = NULL) {
+  global $language;
+
+  // Use the advanced drupal_static() pattern, since this is called very often.
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['entity_info'] = &drupal_static(__FUNCTION__);
+  }
+  $entity_info = &$drupal_static_fast['entity_info'];
+
+  // hook_entity_info() includes translated strings, so each language is cached
+  // separately.
+  $langcode = $language->language;
+
+  if (empty($entity_info)) {
+    if ($cache = cache_get("entity_info:$langcode")) {
+      $entity_info = $cache->data;
+    }
+    else {
+      $entity_info = module_invoke_all('entity_info');
+      // Merge in default values.
+      foreach ($entity_info as $name => $data) {
+        $entity_info[$name] += array(
+          'fieldable' => FALSE,
+          'controller class' => 'DrupalDefaultEntityController',
+          'static cache' => TRUE,
+          'field cache' => TRUE,
+          'load hook' => $name . '_load',
+          'bundles' => array(),
+          'view modes' => array(),
+          'entity keys' => array(),
+          'translation' => array(),
+        );
+        $entity_info[$name]['entity keys'] += array(
+          'revision' => '',
+          'bundle' => '',
+        );
+        foreach ($entity_info[$name]['view modes'] as $view_mode => $view_mode_info) {
+          $entity_info[$name]['view modes'][$view_mode] += array(
+            'custom settings' => FALSE,
+          );
+        }
+        // If no bundle key is provided, assume a single bundle, named after
+        // the entity type.
+        if (empty($entity_info[$name]['entity keys']['bundle']) && empty($entity_info[$name]['bundles'])) {
+          $entity_info[$name]['bundles'] = array($name => array('label' => $entity_info[$name]['label']));
+        }
+        // Prepare entity schema fields SQL info for
+        // DrupalEntityControllerInterface::buildQuery().
+        if (isset($entity_info[$name]['base table'])) {
+          $entity_info[$name]['schema_fields_sql']['base table'] = drupal_schema_fields_sql($entity_info[$name]['base table']);
+          if (isset($entity_info[$name]['revision table'])) {
+            $entity_info[$name]['schema_fields_sql']['revision table'] = drupal_schema_fields_sql($entity_info[$name]['revision table']);
+          }
+        }
+      }
+      // Let other modules alter the entity info.
+      drupal_alter('entity_info', $entity_info);
+      cache_set("entity_info:$langcode", $entity_info);
+    }
+  }
+
+  if (empty($entity_type)) {
+    return $entity_info;
+  }
+  elseif (isset($entity_info[$entity_type])) {
+    return $entity_info[$entity_type];
+  }
+}
+
+/**
+ * Resets the cached information about entity types.
+ */
+function entity_info_cache_clear() {
+  drupal_static_reset('entity_get_info');
+  // Clear all languages.
+  cache_clear_all('entity_info:', 'cache', TRUE);
+}
+
+/**
+ * Helper function to extract id, vid, and bundle name from an entity.
+ *
+ * @param $entity_type
+ *   The entity type; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity from which to extract values.
+ *
+ * @return
+ *   A numerically indexed array (not a hash table) containing these
+ *   elements:
+ *   - 0: Primary ID of the entity.
+ *   - 1: Revision ID of the entity, or NULL if $entity_type is not versioned.
+ *   - 2: Bundle name of the entity, or NULL if $entity_type has no bundles.
+ */
+function entity_extract_ids($entity_type, $entity) {
+  $info = entity_get_info($entity_type);
+
+  // Objects being created might not have id/vid yet.
+  $id = isset($entity->{$info['entity keys']['id']}) ? $entity->{$info['entity keys']['id']} : NULL;
+  $vid = ($info['entity keys']['revision'] && isset($entity->{$info['entity keys']['revision']})) ? $entity->{$info['entity keys']['revision']} : NULL;
+
+  if (!empty($info['entity keys']['bundle'])) {
+    // Explicitly fail for malformed entities missing the bundle property.
+    if (!isset($entity->{$info['entity keys']['bundle']}) || $entity->{$info['entity keys']['bundle']} === '') {
+      throw new EntityMalformedException(t('Missing bundle property on entity of type @entity_type.', array('@entity_type' => $entity_type)));
+    }
+    $bundle = $entity->{$info['entity keys']['bundle']};
+  }
+  else {
+    // The entity type provides no bundle key: assume a single bundle, named
+    // after the entity type.
+    $bundle = $entity_type;
+  }
+
+  return array($id, $vid, $bundle);
+}
+
+/**
+ * Helper function to assemble an object structure with initial ids.
+ *
+ * This function can be seen as reciprocal to entity_extract_ids().
+ *
+ * @param $entity_type
+ *   The entity type; e.g. 'node' or 'user'.
+ * @param $ids
+ *   A numerically indexed array, as returned by entity_extract_ids().
+ *
+ * @return
+ *   An entity structure, initialized with the ids provided.
+ *
+ * @see entity_extract_ids()
+ */
+function entity_create_stub_entity($entity_type, $ids) {
+  $entity = new stdClass();
+  $info = entity_get_info($entity_type);
+  $entity->{$info['entity keys']['id']} = $ids[0];
+  if (!empty($info['entity keys']['revision']) && isset($ids[1])) {
+    $entity->{$info['entity keys']['revision']} = $ids[1];
+  }
+  if (!empty($info['entity keys']['bundle']) && isset($ids[2])) {
+    $entity->{$info['entity keys']['bundle']} = $ids[2];
+  }
+  return $entity;
+}
+
+/**
+ * Load entities from the database.
+ *
+ * The entities are stored in a static memory cache, and will not require
+ * database access if loaded again during the same page request.
+ *
+ * The actual loading is done through a class that has to implement the
+ * DrupalEntityControllerInterface interface. By default,
+ * DrupalDefaultEntityController is used. Entity types can specify that a
+ * different class should be used by setting the 'controller class' key in
+ * hook_entity_info(). These classes can either implement the
+ * DrupalEntityControllerInterface interface, or, most commonly, extend the
+ * DrupalDefaultEntityController class. See node_entity_info() and the
+ * NodeController in node.module as an example.
+ *
+ * @param $entity_type
+ *   The entity type to load, e.g. node or user.
+ * @param $ids
+ *   An array of entity IDs, or FALSE to load all entities.
+ * @param $conditions
+ *   (deprecated) An associative array of conditions on the base table, where
+ *   the keys are the database fields and the values are the values those
+ *   fields must have. Instead, it is preferable to use EntityFieldQuery to
+ *   retrieve a list of entity IDs loadable by this function.
+ * @param $reset
+ *   Whether to reset the internal cache for the requested entity type.
+ *
+ * @return
+ *   An array of entity objects indexed by their ids. When no results are
+ *   found, an empty array is returned.
+ *
+ * @todo Remove $conditions in Drupal 8.
+ *
+ * @see hook_entity_info()
+ * @see DrupalEntityControllerInterface
+ * @see DrupalDefaultEntityController
+ * @see EntityFieldQuery
+ */
+function entity_load($entity_type, $ids = FALSE, $conditions = array(), $reset = FALSE) {
+  if ($reset) {
+    entity_get_controller($entity_type)->resetCache();
+  }
+  return entity_get_controller($entity_type)->load($ids, $conditions);
+}
+
+/**
+ * Loads the unchanged, i.e. not modified, entity from the database.
+ *
+ * Unlike entity_load() this function ensures the entity is directly loaded from
+ * the database, thus bypassing any static cache. In particular, this function
+ * is useful to determine changes by comparing the entity being saved to the
+ * stored entity.
+ *
+ * @param $entity_type
+ *   The entity type to load, e.g. node or user.
+ * @param $id
+ *   The ID of the entity to load.
+ *
+ * @return
+ *   The unchanged entity, or FALSE if the entity cannot be loaded.
+ */
+function entity_load_unchanged($entity_type, $id) {
+  entity_get_controller($entity_type)->resetCache(array($id));
+  $result = entity_get_controller($entity_type)->load(array($id));
+  return reset($result);
+}
+
+/**
+ * Get the entity controller class for an entity type.
+ */
+function entity_get_controller($entity_type) {
+  $controllers = &drupal_static(__FUNCTION__, array());
+  if (!isset($controllers[$entity_type])) {
+    $type_info = entity_get_info($entity_type);
+    $class = $type_info['controller class'];
+    $controllers[$entity_type] = new $class($entity_type);
+  }
+  return $controllers[$entity_type];
+}
+
+/**
+ * Invoke hook_entity_prepare_view().
+ *
+ * If adding a new entity similar to nodes, comments or users, you should
+ * invoke this function during the ENTITY_build_content() or
+ * ENTITY_view_multiple() phases of rendering to allow other modules to alter
+ * the objects during this phase. This is needed for situations where
+ * information needs to be loaded outside of ENTITY_load() - particularly
+ * when loading entities into one another - i.e. a user object into a node, due
+ * to the potential for unwanted side-effects such as caching and infinite
+ * recursion. By convention, entity_prepare_view() is called after
+ * field_attach_prepare_view() to allow entity level hooks to act on content
+ * loaded by field API.
+ *
+ * @param $entity_type
+ *   The type of entity, i.e. 'node', 'user'.
+ * @param $entities
+ *   The entity objects which are being prepared for view, keyed by object ID.
+ * @param $langcode
+ *   (optional) A language code to be used for rendering. Defaults to the global
+ *   content language of the current request.
+ *
+ * @see hook_entity_prepare_view()
+ */
+function entity_prepare_view($entity_type, $entities, $langcode = NULL) {
+  if (!isset($langcode)) {
+    $langcode = $GLOBALS['language_content']->language;
+  }
+
+  // To ensure hooks are only run once per entity, check for an
+  // entity_view_prepared flag and only process items without it.
+  // @todo: resolve this more generally for both entity and field level hooks.
+  $prepare = array();
+  foreach ($entities as $id => $entity) {
+    if (empty($entity->entity_view_prepared)) {
+      // Add this entity to the items to be prepared.
+      $prepare[$id] = $entity;
+
+      // Mark this item as prepared.
+      $entity->entity_view_prepared = TRUE;
+    }
+  }
+
+  if (!empty($prepare)) {
+    module_invoke_all('entity_prepare_view', $prepare, $entity_type, $langcode);
+  }
+}
+
+/**
+ * Returns the URI elements of an entity.
+ *
+ * @param $entity_type
+ *   The entity type; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity for which to generate a path.
+ * @return
+ *   An array containing the 'path' and 'options' keys used to build the URI of
+ *   the entity, and matching the signature of url(). NULL if the entity has no
+ *   URI of its own.
+ */
+function entity_uri($entity_type, $entity) {
+  $info = entity_get_info($entity_type);
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  // A bundle-specific callback takes precedence over the generic one for the
+  // entity type.
+  if (isset($info['bundles'][$bundle]['uri callback'])) {
+    $uri_callback = $info['bundles'][$bundle]['uri callback'];
+  }
+  elseif (isset($info['uri callback'])) {
+    $uri_callback = $info['uri callback'];
+  }
+  else {
+    return NULL;
+  }
+
+  // Invoke the callback to get the URI. If there is no callback, return NULL.
+  if (isset($uri_callback) && function_exists($uri_callback)) {
+    $uri = $uri_callback($entity);
+    // Pass the entity data to url() so that alter functions do not need to
+    // lookup this entity again.
+    $uri['options']['entity_type'] = $entity_type;
+    $uri['options']['entity'] = $entity;
+    return $uri;
+  }
+}
+
+/**
+ * Returns the label of an entity.
+ *
+ * See the 'label callback' component of the hook_entity_info() return value
+ * for more information.
+ *
+ * @param $entity_type
+ *   The entity type; e.g., 'node' or 'user'.
+ * @param $entity
+ *   The entity for which to generate the label.
+ *
+ * @return
+ *   The entity label, or FALSE if not found.
+ */
+function entity_label($entity_type, $entity) {
+  $label = FALSE;
+  $info = entity_get_info($entity_type);
+  if (isset($info['label callback']) && function_exists($info['label callback'])) {
+    $label = $info['label callback']($entity, $entity_type);
+  }
+  elseif (!empty($info['entity keys']['label']) && isset($entity->{$info['entity keys']['label']})) {
+    $label = $entity->{$info['entity keys']['label']};
+  }
+
+  return $label;
+}
+
+/**
+ * Returns the language of an entity.
+ *
+ * @param $entity_type
+ *   The entity type; e.g., 'node' or 'user'.
+ * @param $entity
+ *   The entity for which to get the language.
+ *
+ * @return
+ *   A valid language code or NULL if the entity has no language support.
+ */
+function entity_language($entity_type, $entity) {
+  $info = entity_get_info($entity_type);
+
+  // Invoke the callback to get the language. If there is no callback, try to
+  // get it from a property of the entity, otherwise NULL.
+  if (isset($info['language callback']) && function_exists($info['language callback'])) {
+    $langcode = $info['language callback']($entity_type, $entity);
+  }
+  elseif (!empty($info['entity keys']['language']) && isset($entity->{$info['entity keys']['language']})) {
+    $langcode = $entity->{$info['entity keys']['language']};
+  }
+  else {
+    // The value returned in D8 would be LANGUAGE_NONE, we cannot use it here to
+    // preserve backward compatibility. In fact this function has been
+    // introduced very late in the D7 life cycle, mainly as the proper default
+    // for field_attach_form(). By returning LANGUAGE_NONE when no language
+    // information is available, we would introduce a potentially BC-breaking
+    // API change, since field_attach_form() defaults to the default language
+    // instead of LANGUAGE_NONE. Moreover this allows us to distinguish between
+    // entities that have no language specified from ones that do not have
+    // language support at all.
+    $langcode = NULL;
+  }
+
+  return $langcode;
+}
+
+/**
+ * Attaches field API validation to entity forms.
+ */
+function entity_form_field_validate($entity_type, $form, &$form_state) {
+  // All field attach API functions act on an entity object, but during form
+  // validation, we don't have one. $form_state contains the entity as it was
+  // prior to processing the current form submission, and we must not update it
+  // until we have fully validated the submitted input. Therefore, for
+  // validation, act on a pseudo entity created out of the form values.
+  $pseudo_entity = (object) $form_state['values'];
+  field_attach_form_validate($entity_type, $pseudo_entity, $form, $form_state);
+}
+
+/**
+ * Copies submitted values to entity properties for simple entity forms.
+ *
+ * During the submission handling of an entity form's "Save", "Preview", and
+ * possibly other buttons, the form state's entity needs to be updated with the
+ * submitted form values. Each entity form implements its own builder function
+ * for doing this, appropriate for the particular entity and form, whereas
+ * modules may specify additional builder functions in $form['#entity_builders']
+ * for copying the form values of added form elements to entity properties.
+ * Many of the main entity builder functions can call this helper function to
+ * re-use its logic of copying $form_state['values'][PROPERTY] values to
+ * $entity->PROPERTY for all entries in $form_state['values'] that are not field
+ * data, and calling field_attach_submit() to copy field data. Apart from that
+ * this helper invokes any additional builder functions that have been specified
+ * in $form['#entity_builders'].
+ *
+ * For some entity forms (e.g., forms with complex non-field data and forms that
+ * simultaneously edit multiple entities), this behavior may be inappropriate,
+ * so the builder function for such forms needs to implement the required
+ * functionality instead of calling this function.
+ */
+function entity_form_submit_build_entity($entity_type, $entity, $form, &$form_state) {
+  $info = entity_get_info($entity_type);
+  list(, , $bundle) = entity_extract_ids($entity_type, $entity);
+
+  // Copy top-level form values that are not for fields to entity properties,
+  // without changing existing entity properties that are not being edited by
+  // this form. Copying field values must be done using field_attach_submit().
+  $values_excluding_fields = $info['fieldable'] ? array_diff_key($form_state['values'], field_info_instances($entity_type, $bundle)) : $form_state['values'];
+  foreach ($values_excluding_fields as $key => $value) {
+    $entity->$key = $value;
+  }
+
+  // Invoke all specified builders for copying form values to entity properties.
+  if (isset($form['#entity_builders'])) {
+    foreach ($form['#entity_builders'] as $function) {
+      $function($entity_type, $entity, $form, $form_state);
+    }
+  }
+
+  // Copy field values to the entity.
+  if ($info['fieldable']) {
+    field_attach_submit($entity_type, $entity, $form, $form_state);
+  }
+}
+
+/**
+ * Performs one or more XML-RPC request(s).
+ *
+ * Usage example:
+ * @code
+ * $result = xmlrpc('http://example.com/xmlrpc.php', array(
+ *   'service.methodName' => array($parameter, $second, $third),
+ * ));
+ * @endcode
+ *
+ * @param $url
+ *   An absolute URL of the XML-RPC endpoint.
+ * @param $args
+ *   An associative array whose keys are the methods to call and whose values
+ *   are the arguments to pass to the respective method. If multiple methods
+ *   are specified, a system.multicall is performed.
+ * @param $options
+ *   (optional) An array of options to pass along to drupal_http_request().
+ *
+ * @return
+ *   For one request:
+ *     Either the return value of the method on success, or FALSE.
+ *     If FALSE is returned, see xmlrpc_errno() and xmlrpc_error_msg().
+ *   For multiple requests:
+ *     An array of results. Each result will either be the result
+ *     returned by the method called, or an xmlrpc_error object if the call
+ *     failed. See xmlrpc_error().
+ */
+function xmlrpc($url, $args, $options = array()) {
+  require_once DRUPAL_ROOT . '/includes/xmlrpc.inc';
+  return _xmlrpc($url, $args, $options);
+}
+
+/**
+ * Retrieves a list of all available archivers.
+ *
+ * @see hook_archiver_info()
+ * @see hook_archiver_info_alter()
+ */
+function archiver_get_info() {
+  $archiver_info = &drupal_static(__FUNCTION__, array());
+
+  if (empty($archiver_info)) {
+    $cache = cache_get('archiver_info');
+    if ($cache === FALSE) {
+      // Rebuild the cache and save it.
+      $archiver_info = module_invoke_all('archiver_info');
+      drupal_alter('archiver_info', $archiver_info);
+      uasort($archiver_info, 'drupal_sort_weight');
+      cache_set('archiver_info', $archiver_info);
+    }
+    else {
+      $archiver_info = $cache->data;
+    }
+  }
+
+  return $archiver_info;
+}
+
+/**
+ * Returns a string of supported archive extensions.
+ *
+ * @return
+ *   A space-separated string of extensions suitable for use by the file
+ *   validation system.
+ */
+function archiver_get_extensions() {
+  $valid_extensions = array();
+  foreach (archiver_get_info() as $archive) {
+    foreach ($archive['extensions'] as $extension) {
+      foreach (explode('.', $extension) as $part) {
+        if (!in_array($part, $valid_extensions)) {
+          $valid_extensions[] = $part;
+        }
+      }
+    }
+  }
+  return implode(' ', $valid_extensions);
+}
+
+/**
+ * Creates the appropriate archiver for the specified file.
+ *
+ * @param $file
+ *   The full path of the archive file. Note that stream wrapper paths are
+ *   supported, but not remote ones.
+ *
+ * @return
+ *   A newly created instance of the archiver class appropriate
+ *   for the specified file, already bound to that file.
+ *   If no appropriate archiver class was found, will return FALSE.
+ */
+function archiver_get_archiver($file) {
+  // Archivers can only work on local paths
+  $filepath = drupal_realpath($file);
+  if (!is_file($filepath)) {
+    throw new Exception(t('Archivers can only operate on local files: %file not supported', array('%file' => $file)));
+  }
+  $archiver_info = archiver_get_info();
+
+  foreach ($archiver_info as $implementation) {
+    foreach ($implementation['extensions'] as $extension) {
+      // Because extensions may be multi-part, such as .tar.gz,
+      // we cannot use simpler approaches like substr() or pathinfo().
+      // This method isn't quite as clean but gets the job done.
+      // Also note that the file may not yet exist, so we cannot rely
+      // on fileinfo() or other disk-level utilities.
+      if (strrpos($filepath, '.' . $extension) === strlen($filepath) - strlen('.' . $extension)) {
+        return new $implementation['class']($filepath);
+      }
+    }
+  }
+}
+
+/**
+ * Assembles the Drupal Updater registry.
+ *
+ * An Updater is a class that knows how to update various parts of the Drupal
+ * file system, for example to update modules that have newer releases, or to
+ * install a new theme.
+ *
+ * @return
+ *   The Drupal Updater class registry.
+ *
+ * @see hook_updater_info()
+ * @see hook_updater_info_alter()
+ */
+function drupal_get_updaters() {
+  $updaters = &drupal_static(__FUNCTION__);
+  if (!isset($updaters)) {
+    $updaters = module_invoke_all('updater_info');
+    drupal_alter('updater_info', $updaters);
+    uasort($updaters, 'drupal_sort_weight');
+  }
+  return $updaters;
+}
+
+/**
+ * Assembles the Drupal FileTransfer registry.
+ *
+ * @return
+ *   The Drupal FileTransfer class registry.
+ *
+ * @see FileTransfer
+ * @see hook_filetransfer_info()
+ * @see hook_filetransfer_info_alter()
+ */
+function drupal_get_filetransfer_info() {
+  $info = &drupal_static(__FUNCTION__);
+  if (!isset($info)) {
+    // Since we have to manually set the 'file path' default for each
+    // module separately, we can't use module_invoke_all().
+    $info = array();
+    foreach (module_implements('filetransfer_info') as $module) {
+      $function = $module . '_filetransfer_info';
+      if (function_exists($function)) {
+        $result = $function();
+        if (isset($result) && is_array($result)) {
+          foreach ($result as &$values) {
+            if (empty($values['file path'])) {
+              $values['file path'] = drupal_get_path('module', $module);
+            }
+          }
+          $info = array_merge_recursive($info, $result);
+        }
+      }
+    }
+    drupal_alter('filetransfer_info', $info);
+    uasort($info, 'drupal_sort_weight');
+  }
+  return $info;
+}
diff --git a/htmltest/includes/database/database.inc b/htmltest/includes/database/database.inc
new file mode 100644
index 00000000..604dd4c7
--- /dev/null
+++ b/htmltest/includes/database/database.inc
@@ -0,0 +1,3039 @@
+<?php
+
+/**
+ * @file
+ * Core systems for the database layer.
+ *
+ * Classes required for basic functioning of the database system should be
+ * placed in this file.  All utility functions should also be placed in this
+ * file only, as they cannot auto-load the way classes can.
+ */
+
+/**
+ * @defgroup database Database abstraction layer
+ * @{
+ * Allow the use of different database servers using the same code base.
+ *
+ * Drupal provides a database abstraction layer to provide developers with
+ * the ability to support multiple database servers easily. The intent of
+ * this layer is to preserve the syntax and power of SQL as much as possible,
+ * but also allow developers a way to leverage more complex functionality in
+ * a unified way. It also provides a structured interface for dynamically
+ * constructing queries when appropriate, and enforcing security checks and
+ * similar good practices.
+ *
+ * The system is built atop PHP's PDO (PHP Data Objects) database API and
+ * inherits much of its syntax and semantics.
+ *
+ * Most Drupal database SELECT queries are performed by a call to db_query() or
+ * db_query_range(). Module authors should also consider using the PagerDefault
+ * Extender for queries that return results that need to be presented on
+ * multiple pages, and the Tablesort Extender for generating appropriate queries
+ * for sortable tables.
+ *
+ * For example, one might wish to return a list of the most recent 10 nodes
+ * authored by a given user. Instead of directly issuing the SQL query
+ * @code
+ * SELECT n.nid, n.title, n.created FROM node n WHERE n.uid = $uid LIMIT 0, 10;
+ * @endcode
+ * one would instead call the Drupal functions:
+ * @code
+ * $result = db_query_range('SELECT n.nid, n.title, n.created
+ *   FROM {node} n WHERE n.uid = :uid', 0, 10, array(':uid' => $uid));
+ * foreach ($result as $record) {
+ *   // Perform operations on $record->title, etc. here.
+ * }
+ * @endcode
+ * Curly braces are used around "node" to provide table prefixing via
+ * DatabaseConnection::prefixTables(). The explicit use of a user ID is pulled
+ * out into an argument passed to db_query() so that SQL injection attacks
+ * from user input can be caught and nullified. The LIMIT syntax varies between
+ * database servers, so that is abstracted into db_query_range() arguments.
+ * Finally, note the PDO-based ability to iterate over the result set using
+ * foreach ().
+ *
+ * All queries are passed as a prepared statement string. A
+ * prepared statement is a "template" of a query that omits literal or variable
+ * values in favor of placeholders. The values to place into those
+ * placeholders are passed separately, and the database driver handles
+ * inserting the values into the query in a secure fashion. That means you
+ * should never quote or string-escape a value to be inserted into the query.
+ *
+ * There are two formats for placeholders: named and unnamed. Named placeholders
+ * are strongly preferred in all cases as they are more flexible and
+ * self-documenting. Named placeholders should start with a colon ":" and can be
+ * followed by one or more letters, numbers or underscores.
+ *
+ * Named placeholders begin with a colon followed by a unique string. Example:
+ * @code
+ * SELECT nid, title FROM {node} WHERE uid=:uid;
+ * @endcode
+ *
+ * ":uid" is a placeholder that will be replaced with a literal value when
+ * the query is executed. A given placeholder label cannot be repeated in a
+ * given query, even if the value should be the same. When using named
+ * placeholders, the array of arguments to the query must be an associative
+ * array where keys are a placeholder label (e.g., :uid) and the value is the
+ * corresponding value to use. The array may be in any order.
+ *
+ * Unnamed placeholders are simply a question mark. Example:
+ * @code
+ * SELECT nid, title FROM {node} WHERE uid=?;
+ * @endcode
+ *
+ * In this case, the array of arguments must be an indexed array of values to
+ * use in the exact same order as the placeholders in the query.
+ *
+ * Note that placeholders should be a "complete" value. For example, when
+ * running a LIKE query the SQL wildcard character, %, should be part of the
+ * value, not the query itself. Thus, the following is incorrect:
+ * @code
+ * SELECT nid, title FROM {node} WHERE title LIKE :title%;
+ * @endcode
+ * It should instead read:
+ * @code
+ * SELECT nid, title FROM {node} WHERE title LIKE :title;
+ * @endcode
+ * and the value for :title should include a % as appropriate. Again, note the
+ * lack of quotation marks around :title. Because the value is not inserted
+ * into the query as one big string but as an explicitly separate value, the
+ * database server knows where the query ends and a value begins. That is
+ * considerably more secure against SQL injection than trying to remember
+ * which values need quotation marks and string escaping and which don't.
+ *
+ * INSERT, UPDATE, and DELETE queries need special care in order to behave
+ * consistently across all different databases. Therefore, they use a special
+ * object-oriented API for defining a query structurally. For example, rather
+ * than:
+ * @code
+ * INSERT INTO node (nid, title, body) VALUES (1, 'my title', 'my body');
+ * @endcode
+ * one would instead write:
+ * @code
+ * $fields = array('nid' => 1, 'title' => 'my title', 'body' => 'my body');
+ * db_insert('node')->fields($fields)->execute();
+ * @endcode
+ * This method allows databases that need special data type handling to do so,
+ * while also allowing optimizations such as multi-insert queries. UPDATE and
+ * DELETE queries have a similar pattern.
+ *
+ * Drupal also supports transactions, including a transparent fallback for
+ * databases that do not support transactions. To start a new transaction,
+ * simply call $txn = db_transaction(); in your own code. The transaction will
+ * remain open for as long as the variable $txn remains in scope.  When $txn is
+ * destroyed, the transaction will be committed.  If your transaction is nested
+ * inside of another then Drupal will track each transaction and only commit
+ * the outer-most transaction when the last transaction object goes out out of
+ * scope, that is, all relevant queries completed successfully.
+ *
+ * Example:
+ * @code
+ * function my_transaction_function() {
+ *   // The transaction opens here.
+ *   $txn = db_transaction();
+ *
+ *   try {
+ *     $id = db_insert('example')
+ *       ->fields(array(
+ *         'field1' => 'mystring',
+ *         'field2' => 5,
+ *       ))
+ *       ->execute();
+ *
+ *     my_other_function($id);
+ *
+ *     return $id;
+ *   }
+ *   catch (Exception $e) {
+ *     // Something went wrong somewhere, so roll back now.
+ *     $txn->rollback();
+ *     // Log the exception to watchdog.
+ *     watchdog_exception('type', $e);
+ *   }
+ *
+ *   // $txn goes out of scope here.  Unless the transaction was rolled back, it
+ *   // gets automatically committed here.
+ * }
+ *
+ * function my_other_function($id) {
+ *   // The transaction is still open here.
+ *
+ *   if ($id % 2 == 0) {
+ *     db_update('example')
+ *       ->condition('id', $id)
+ *       ->fields(array('field2' => 10))
+ *       ->execute();
+ *   }
+ * }
+ * @endcode
+ *
+ * @see http://drupal.org/developing/api/database
+ */
+
+
+/**
+ * Base Database API class.
+ *
+ * This class provides a Drupal-specific extension of the PDO database
+ * abstraction class in PHP. Every database driver implementation must provide a
+ * concrete implementation of it to support special handling required by that
+ * database.
+ *
+ * @see http://php.net/manual/book.pdo.php
+ */
+abstract class DatabaseConnection extends PDO {
+
+  /**
+   * The database target this connection is for.
+   *
+   * We need this information for later auditing and logging.
+   *
+   * @var string
+   */
+  protected $target = NULL;
+
+  /**
+   * The key representing this connection.
+   *
+   * The key is a unique string which identifies a database connection. A
+   * connection can be a single server or a cluster of master and slaves (use
+   * target to pick between master and slave).
+   *
+   * @var string
+   */
+  protected $key = NULL;
+
+  /**
+   * The current database logging object for this connection.
+   *
+   * @var DatabaseLog
+   */
+  protected $logger = NULL;
+
+  /**
+   * Tracks the number of "layers" of transactions currently active.
+   *
+   * On many databases transactions cannot nest.  Instead, we track
+   * nested calls to transactions and collapse them into a single
+   * transaction.
+   *
+   * @var array
+   */
+  protected $transactionLayers = array();
+
+  /**
+   * Index of what driver-specific class to use for various operations.
+   *
+   * @var array
+   */
+  protected $driverClasses = array();
+
+  /**
+   * The name of the Statement class for this connection.
+   *
+   * @var string
+   */
+  protected $statementClass = 'DatabaseStatementBase';
+
+  /**
+   * Whether this database connection supports transactions.
+   *
+   * @var bool
+   */
+  protected $transactionSupport = TRUE;
+
+  /**
+   * Whether this database connection supports transactional DDL.
+   *
+   * Set to FALSE by default because few databases support this feature.
+   *
+   * @var bool
+   */
+  protected $transactionalDDLSupport = FALSE;
+
+  /**
+   * An index used to generate unique temporary table names.
+   *
+   * @var integer
+   */
+  protected $temporaryNameIndex = 0;
+
+  /**
+   * The connection information for this connection object.
+   *
+   * @var array
+   */
+  protected $connectionOptions = array();
+
+  /**
+   * The schema object for this connection.
+   *
+   * @var object
+   */
+  protected $schema = NULL;
+
+  /**
+   * The prefixes used by this database connection.
+   *
+   * @var array
+   */
+  protected $prefixes = array();
+
+  /**
+   * List of search values for use in prefixTables().
+   *
+   * @var array
+   */
+  protected $prefixSearch = array();
+
+  /**
+   * List of replacement values for use in prefixTables().
+   *
+   * @var array
+   */
+  protected $prefixReplace = array();
+
+  function __construct($dsn, $username, $password, $driver_options = array()) {
+    // Initialize and prepare the connection prefix.
+    $this->setPrefix(isset($this->connectionOptions['prefix']) ? $this->connectionOptions['prefix'] : '');
+
+    // Because the other methods don't seem to work right.
+    $driver_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
+
+    // Call PDO::__construct and PDO::setAttribute.
+    parent::__construct($dsn, $username, $password, $driver_options);
+
+    // Set a Statement class, unless the driver opted out.
+    if (!empty($this->statementClass)) {
+      $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array($this->statementClass, array($this)));
+    }
+  }
+
+  /**
+   * Destroys this Connection object.
+   *
+   * PHP does not destruct an object if it is still referenced in other
+   * variables. In case of PDO database connection objects, PHP only closes the
+   * connection when the PDO object is destructed, so any references to this
+   * object may cause the number of maximum allowed connections to be exceeded.
+   */
+  public function destroy() {
+    // Destroy all references to this connection by setting them to NULL.
+    // The Statement class attribute only accepts a new value that presents a
+    // proper callable, so we reset it to PDOStatement.
+    $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('PDOStatement', array()));
+    $this->schema = NULL;
+  }
+
+  /**
+   * Returns the default query options for any given query.
+   *
+   * A given query can be customized with a number of option flags in an
+   * associative array:
+   * - target: The database "target" against which to execute a query. Valid
+   *   values are "default" or "slave". The system will first try to open a
+   *   connection to a database specified with the user-supplied key. If one
+   *   is not available, it will silently fall back to the "default" target.
+   *   If multiple databases connections are specified with the same target,
+   *   one will be selected at random for the duration of the request.
+   * - fetch: This element controls how rows from a result set will be
+   *   returned. Legal values include PDO::FETCH_ASSOC, PDO::FETCH_BOTH,
+   *   PDO::FETCH_OBJ, PDO::FETCH_NUM, or a string representing the name of a
+   *   class. If a string is specified, each record will be fetched into a new
+   *   object of that class. The behavior of all other values is defined by PDO.
+   *   See http://php.net/manual/pdostatement.fetch.php
+   * - return: Depending on the type of query, different return values may be
+   *   meaningful. This directive instructs the system which type of return
+   *   value is desired. The system will generally set the correct value
+   *   automatically, so it is extremely rare that a module developer will ever
+   *   need to specify this value. Setting it incorrectly will likely lead to
+   *   unpredictable results or fatal errors. Legal values include:
+   *   - Database::RETURN_STATEMENT: Return the prepared statement object for
+   *     the query. This is usually only meaningful for SELECT queries, where
+   *     the statement object is how one accesses the result set returned by the
+   *     query.
+   *   - Database::RETURN_AFFECTED: Return the number of rows affected by an
+   *     UPDATE or DELETE query. Be aware that means the number of rows actually
+   *     changed, not the number of rows matched by the WHERE clause.
+   *   - Database::RETURN_INSERT_ID: Return the sequence ID (primary key)
+   *     created by an INSERT statement on a table that contains a serial
+   *     column.
+   *   - Database::RETURN_NULL: Do not return anything, as there is no
+   *     meaningful value to return. That is the case for INSERT queries on
+   *     tables that do not contain a serial column.
+   * - throw_exception: By default, the database system will catch any errors
+   *   on a query as an Exception, log it, and then rethrow it so that code
+   *   further up the call chain can take an appropriate action. To suppress
+   *   that behavior and simply return NULL on failure, set this option to
+   *   FALSE.
+   *
+   * @return
+   *   An array of default query options.
+   */
+  protected function defaultOptions() {
+    return array(
+      'target' => 'default',
+      'fetch' => PDO::FETCH_OBJ,
+      'return' => Database::RETURN_STATEMENT,
+      'throw_exception' => TRUE,
+    );
+  }
+
+  /**
+   * Returns the connection information for this connection object.
+   *
+   * Note that Database::getConnectionInfo() is for requesting information
+   * about an arbitrary database connection that is defined. This method
+   * is for requesting the connection information of this specific
+   * open connection object.
+   *
+   * @return
+   *   An array of the connection information. The exact list of
+   *   properties is driver-dependent.
+   */
+  public function getConnectionOptions() {
+    return $this->connectionOptions;
+  }
+
+  /**
+   * Set the list of prefixes used by this database connection.
+   *
+   * @param $prefix
+   *   The prefixes, in any of the multiple forms documented in
+   *   default.settings.php.
+   */
+  protected function setPrefix($prefix) {
+    if (is_array($prefix)) {
+      $this->prefixes = $prefix + array('default' => '');
+    }
+    else {
+      $this->prefixes = array('default' => $prefix);
+    }
+
+    // Set up variables for use in prefixTables(). Replace table-specific
+    // prefixes first.
+    $this->prefixSearch = array();
+    $this->prefixReplace = array();
+    foreach ($this->prefixes as $key => $val) {
+      if ($key != 'default') {
+        $this->prefixSearch[] = '{' . $key . '}';
+        $this->prefixReplace[] = $val . $key;
+      }
+    }
+    // Then replace remaining tables with the default prefix.
+    $this->prefixSearch[] = '{';
+    $this->prefixReplace[] = $this->prefixes['default'];
+    $this->prefixSearch[] = '}';
+    $this->prefixReplace[] = '';
+  }
+
+  /**
+   * Appends a database prefix to all tables in a query.
+   *
+   * Queries sent to Drupal should wrap all table names in curly brackets. This
+   * function searches for this syntax and adds Drupal's table prefix to all
+   * tables, allowing Drupal to coexist with other systems in the same database
+   * and/or schema if necessary.
+   *
+   * @param $sql
+   *   A string containing a partial or entire SQL query.
+   *
+   * @return
+   *   The properly-prefixed string.
+   */
+  public function prefixTables($sql) {
+    return str_replace($this->prefixSearch, $this->prefixReplace, $sql);
+  }
+
+  /**
+   * Find the prefix for a table.
+   *
+   * This function is for when you want to know the prefix of a table. This
+   * is not used in prefixTables due to performance reasons.
+   */
+  public function tablePrefix($table = 'default') {
+    if (isset($this->prefixes[$table])) {
+      return $this->prefixes[$table];
+    }
+    else {
+      return $this->prefixes['default'];
+    }
+  }
+
+  /**
+   * Prepares a query string and returns the prepared statement.
+   *
+   * This method caches prepared statements, reusing them when
+   * possible. It also prefixes tables names enclosed in curly-braces.
+   *
+   * @param $query
+   *   The query string as SQL, with curly-braces surrounding the
+   *   table names.
+   *
+   * @return DatabaseStatementInterface
+   *   A PDO prepared statement ready for its execute() method.
+   */
+  public function prepareQuery($query) {
+    $query = $this->prefixTables($query);
+
+    // Call PDO::prepare.
+    return parent::prepare($query);
+  }
+
+  /**
+   * Tells this connection object what its target value is.
+   *
+   * This is needed for logging and auditing. It's sloppy to do in the
+   * constructor because the constructor for child classes has a different
+   * signature. We therefore also ensure that this function is only ever
+   * called once.
+   *
+   * @param $target
+   *   The target this connection is for. Set to NULL (default) to disable
+   *   logging entirely.
+   */
+  public function setTarget($target = NULL) {
+    if (!isset($this->target)) {
+      $this->target = $target;
+    }
+  }
+
+  /**
+   * Returns the target this connection is associated with.
+   *
+   * @return
+   *   The target string of this connection.
+   */
+  public function getTarget() {
+    return $this->target;
+  }
+
+  /**
+   * Tells this connection object what its key is.
+   *
+   * @param $target
+   *   The key this connection is for.
+   */
+  public function setKey($key) {
+    if (!isset($this->key)) {
+      $this->key = $key;
+    }
+  }
+
+  /**
+   * Returns the key this connection is associated with.
+   *
+   * @return
+   *   The key of this connection.
+   */
+  public function getKey() {
+    return $this->key;
+  }
+
+  /**
+   * Associates a logging object with this connection.
+   *
+   * @param $logger
+   *   The logging object we want to use.
+   */
+  public function setLogger(DatabaseLog $logger) {
+    $this->logger = $logger;
+  }
+
+  /**
+   * Gets the current logging object for this connection.
+   *
+   * @return DatabaseLog
+   *   The current logging object for this connection. If there isn't one,
+   *   NULL is returned.
+   */
+  public function getLogger() {
+    return $this->logger;
+  }
+
+  /**
+   * Creates the appropriate sequence name for a given table and serial field.
+   *
+   * This information is exposed to all database drivers, although it is only
+   * useful on some of them. This method is table prefix-aware.
+   *
+   * @param $table
+   *   The table name to use for the sequence.
+   * @param $field
+   *   The field name to use for the sequence.
+   *
+   * @return
+   *   A table prefix-parsed string for the sequence name.
+   */
+  public function makeSequenceName($table, $field) {
+    return $this->prefixTables('{' . $table . '}_' . $field . '_seq');
+  }
+
+  /**
+   * Flatten an array of query comments into a single comment string.
+   *
+   * The comment string will be sanitized to avoid SQL injection attacks.
+   *
+   * @param $comments
+   *   An array of query comment strings.
+   *
+   * @return
+   *   A sanitized comment string.
+   */
+  public function makeComment($comments) {
+    if (empty($comments))
+      return '';
+
+    // Flatten the array of comments.
+    $comment = implode('; ', $comments);
+
+    // Sanitize the comment string so as to avoid SQL injection attacks.
+    return '/* ' . $this->filterComment($comment) . ' */ ';
+  }
+
+  /**
+   * Sanitize a query comment string.
+   *
+   * Ensure a query comment does not include strings such as "* /" that might
+   * terminate the comment early. This avoids SQL injection attacks via the
+   * query comment. The comment strings in this example are separated by a
+   * space to avoid PHP parse errors.
+   *
+   * For example, the comment:
+   * @code
+   * db_update('example')
+   *  ->condition('id', $id)
+   *  ->fields(array('field2' => 10))
+   *  ->comment('Exploit * / DROP TABLE node; --')
+   *  ->execute()
+   * @endcode
+   *
+   * Would result in the following SQL statement being generated:
+   * @code
+   * "/ * Exploit * / DROP TABLE node; -- * / UPDATE example SET field2=..."
+   * @endcode
+   *
+   * Unless the comment is sanitised first, the SQL server would drop the
+   * node table and ignore the rest of the SQL statement.
+   *
+   * @param $comment
+   *   A query comment string.
+   *
+   * @return
+   *   A sanitized version of the query comment string.
+   */
+  protected function filterComment($comment = '') {
+    return preg_replace('/(\/\*\s*)|(\s*\*\/)/', '', $comment);
+  }
+
+  /**
+   * Executes a query string against the database.
+   *
+   * This method provides a central handler for the actual execution of every
+   * query. All queries executed by Drupal are executed as PDO prepared
+   * statements.
+   *
+   * @param $query
+   *   The query to execute. In most cases this will be a string containing
+   *   an SQL query with placeholders. An already-prepared instance of
+   *   DatabaseStatementInterface may also be passed in order to allow calling
+   *   code to manually bind variables to a query. If a
+   *   DatabaseStatementInterface is passed, the $args array will be ignored.
+   *   It is extremely rare that module code will need to pass a statement
+   *   object to this method. It is used primarily for database drivers for
+   *   databases that require special LOB field handling.
+   * @param $args
+   *   An array of arguments for the prepared statement. If the prepared
+   *   statement uses ? placeholders, this array must be an indexed array.
+   *   If it contains named placeholders, it must be an associative array.
+   * @param $options
+   *   An associative array of options to control how the query is run. See
+   *   the documentation for DatabaseConnection::defaultOptions() for details.
+   *
+   * @return DatabaseStatementInterface
+   *   This method will return one of: the executed statement, the number of
+   *   rows affected by the query (not the number matched), or the generated
+   *   insert IT of the last query, depending on the value of
+   *   $options['return']. Typically that value will be set by default or a
+   *   query builder and should not be set by a user. If there is an error,
+   *   this method will return NULL and may throw an exception if
+   *   $options['throw_exception'] is TRUE.
+   *
+   * @throws PDOException
+   */
+  public function query($query, array $args = array(), $options = array()) {
+
+    // Use default values if not already set.
+    $options += $this->defaultOptions();
+
+    try {
+      // We allow either a pre-bound statement object or a literal string.
+      // In either case, we want to end up with an executed statement object,
+      // which we pass to PDOStatement::execute.
+      if ($query instanceof DatabaseStatementInterface) {
+        $stmt = $query;
+        $stmt->execute(NULL, $options);
+      }
+      else {
+        $this->expandArguments($query, $args);
+        $stmt = $this->prepareQuery($query);
+        $stmt->execute($args, $options);
+      }
+
+      // Depending on the type of query we may need to return a different value.
+      // See DatabaseConnection::defaultOptions() for a description of each
+      // value.
+      switch ($options['return']) {
+        case Database::RETURN_STATEMENT:
+          return $stmt;
+        case Database::RETURN_AFFECTED:
+          return $stmt->rowCount();
+        case Database::RETURN_INSERT_ID:
+          return $this->lastInsertId();
+        case Database::RETURN_NULL:
+          return;
+        default:
+          throw new PDOException('Invalid return directive: ' . $options['return']);
+      }
+    }
+    catch (PDOException $e) {
+      if ($options['throw_exception']) {
+        // Add additional debug information.
+        if ($query instanceof DatabaseStatementInterface) {
+          $e->query_string = $stmt->getQueryString();
+        }
+        else {
+          $e->query_string = $query;
+        }
+        $e->args = $args;
+        throw $e;
+      }
+      return NULL;
+    }
+  }
+
+  /**
+   * Expands out shorthand placeholders.
+   *
+   * Drupal supports an alternate syntax for doing arrays of values. We
+   * therefore need to expand them out into a full, executable query string.
+   *
+   * @param $query
+   *   The query string to modify.
+   * @param $args
+   *   The arguments for the query.
+   *
+   * @return
+   *   TRUE if the query was modified, FALSE otherwise.
+   */
+  protected function expandArguments(&$query, &$args) {
+    $modified = FALSE;
+
+    // If the placeholder value to insert is an array, assume that we need
+    // to expand it out into a comma-delimited set of placeholders.
+    foreach (array_filter($args, 'is_array') as $key => $data) {
+      $new_keys = array();
+      foreach ($data as $i => $value) {
+        // This assumes that there are no other placeholders that use the same
+        // name.  For example, if the array placeholder is defined as :example
+        // and there is already an :example_2 placeholder, this will generate
+        // a duplicate key.  We do not account for that as the calling code
+        // is already broken if that happens.
+        $new_keys[$key . '_' . $i] = $value;
+      }
+
+      // Update the query with the new placeholders.
+      // preg_replace is necessary to ensure the replacement does not affect
+      // placeholders that start with the same exact text. For example, if the
+      // query contains the placeholders :foo and :foobar, and :foo has an
+      // array of values, using str_replace would affect both placeholders,
+      // but using the following preg_replace would only affect :foo because
+      // it is followed by a non-word character.
+      $query = preg_replace('#' . $key . '\b#', implode(', ', array_keys($new_keys)), $query);
+
+      // Update the args array with the new placeholders.
+      unset($args[$key]);
+      $args += $new_keys;
+
+      $modified = TRUE;
+    }
+
+    return $modified;
+  }
+
+  /**
+   * Gets the driver-specific override class if any for the specified class.
+   *
+   * @param string $class
+   *   The class for which we want the potentially driver-specific class.
+   * @param array $files
+   *   The name of the files in which the driver-specific class can be.
+   * @param $use_autoload
+   *   If TRUE, attempt to load classes using PHP's autoload capability
+   *   as well as the manual approach here.
+   * @return string
+   *   The name of the class that should be used for this driver.
+   */
+  public function getDriverClass($class, array $files = array(), $use_autoload = FALSE) {
+    if (empty($this->driverClasses[$class])) {
+      $driver = $this->driver();
+      $this->driverClasses[$class] = $class . '_' . $driver;
+      Database::loadDriverFile($driver, $files);
+      if (!class_exists($this->driverClasses[$class], $use_autoload)) {
+        $this->driverClasses[$class] = $class;
+      }
+    }
+    return $this->driverClasses[$class];
+  }
+
+  /**
+   * Prepares and returns a SELECT query object.
+   *
+   * @param $table
+   *   The base table for this query, that is, the first table in the FROM
+   *   clause. This table will also be used as the "base" table for query_alter
+   *   hook implementations.
+   * @param $alias
+   *   The alias of the base table of this query.
+   * @param $options
+   *   An array of options on the query.
+   *
+   * @return SelectQueryInterface
+   *   An appropriate SelectQuery object for this database connection. Note that
+   *   it may be a driver-specific subclass of SelectQuery, depending on the
+   *   driver.
+   *
+   * @see SelectQuery
+   */
+  public function select($table, $alias = NULL, array $options = array()) {
+    $class = $this->getDriverClass('SelectQuery', array('query.inc', 'select.inc'));
+    return new $class($table, $alias, $this, $options);
+  }
+
+  /**
+   * Prepares and returns an INSERT query object.
+   *
+   * @param $options
+   *   An array of options on the query.
+   *
+   * @return InsertQuery
+   *   A new InsertQuery object.
+   *
+   * @see InsertQuery
+   */
+  public function insert($table, array $options = array()) {
+    $class = $this->getDriverClass('InsertQuery', array('query.inc'));
+    return new $class($this, $table, $options);
+  }
+
+  /**
+   * Prepares and returns a MERGE query object.
+   *
+   * @param $options
+   *   An array of options on the query.
+   *
+   * @return MergeQuery
+   *   A new MergeQuery object.
+   *
+   * @see MergeQuery
+   */
+  public function merge($table, array $options = array()) {
+    $class = $this->getDriverClass('MergeQuery', array('query.inc'));
+    return new $class($this, $table, $options);
+  }
+
+
+  /**
+   * Prepares and returns an UPDATE query object.
+   *
+   * @param $options
+   *   An array of options on the query.
+   *
+   * @return UpdateQuery
+   *   A new UpdateQuery object.
+   *
+   * @see UpdateQuery
+   */
+  public function update($table, array $options = array()) {
+    $class = $this->getDriverClass('UpdateQuery', array('query.inc'));
+    return new $class($this, $table, $options);
+  }
+
+  /**
+   * Prepares and returns a DELETE query object.
+   *
+   * @param $options
+   *   An array of options on the query.
+   *
+   * @return DeleteQuery
+   *   A new DeleteQuery object.
+   *
+   * @see DeleteQuery
+   */
+  public function delete($table, array $options = array()) {
+    $class = $this->getDriverClass('DeleteQuery', array('query.inc'));
+    return new $class($this, $table, $options);
+  }
+
+  /**
+   * Prepares and returns a TRUNCATE query object.
+   *
+   * @param $options
+   *   An array of options on the query.
+   *
+   * @return TruncateQuery
+   *   A new TruncateQuery object.
+   *
+   * @see TruncateQuery
+   */
+  public function truncate($table, array $options = array()) {
+    $class = $this->getDriverClass('TruncateQuery', array('query.inc'));
+    return new $class($this, $table, $options);
+  }
+
+  /**
+   * Returns a DatabaseSchema object for manipulating the schema.
+   *
+   * This method will lazy-load the appropriate schema library file.
+   *
+   * @return DatabaseSchema
+   *   The DatabaseSchema object for this connection.
+   */
+  public function schema() {
+    if (empty($this->schema)) {
+      $class = $this->getDriverClass('DatabaseSchema', array('schema.inc'));
+      if (class_exists($class)) {
+        $this->schema = new $class($this);
+      }
+    }
+    return $this->schema;
+  }
+
+  /**
+   * Escapes a table name string.
+   *
+   * Force all table names to be strictly alphanumeric-plus-underscore.
+   * For some database drivers, it may also wrap the table name in
+   * database-specific escape characters.
+   *
+   * @return
+   *   The sanitized table name string.
+   */
+  public function escapeTable($table) {
+    return preg_replace('/[^A-Za-z0-9_.]+/', '', $table);
+  }
+
+  /**
+   * Escapes a field name string.
+   *
+   * Force all field names to be strictly alphanumeric-plus-underscore.
+   * For some database drivers, it may also wrap the field name in
+   * database-specific escape characters.
+   *
+   * @return
+   *   The sanitized field name string.
+   */
+  public function escapeField($field) {
+    return preg_replace('/[^A-Za-z0-9_.]+/', '', $field);
+  }
+
+  /**
+   * Escapes an alias name string.
+   *
+   * Force all alias names to be strictly alphanumeric-plus-underscore. In
+   * contrast to DatabaseConnection::escapeField() /
+   * DatabaseConnection::escapeTable(), this doesn't allow the period (".")
+   * because that is not allowed in aliases.
+   *
+   * @return
+   *   The sanitized field name string.
+   */
+  public function escapeAlias($field) {
+    return preg_replace('/[^A-Za-z0-9_]+/', '', $field);
+  }
+
+  /**
+   * Escapes characters that work as wildcard characters in a LIKE pattern.
+   *
+   * The wildcard characters "%" and "_" as well as backslash are prefixed with
+   * a backslash. Use this to do a search for a verbatim string without any
+   * wildcard behavior.
+   *
+   * For example, the following does a case-insensitive query for all rows whose
+   * name starts with $prefix:
+   * @code
+   * $result = db_query(
+   *   'SELECT * FROM person WHERE name LIKE :pattern',
+   *   array(':pattern' => db_like($prefix) . '%')
+   * );
+   * @endcode
+   *
+   * Backslash is defined as escape character for LIKE patterns in
+   * DatabaseCondition::mapConditionOperator().
+   *
+   * @param $string
+   *   The string to escape.
+   *
+   * @return
+   *   The escaped string.
+   */
+  public function escapeLike($string) {
+    return addcslashes($string, '\%_');
+  }
+
+  /**
+   * Determines if there is an active transaction open.
+   *
+   * @return
+   *   TRUE if we're currently in a transaction, FALSE otherwise.
+   */
+  public function inTransaction() {
+    return ($this->transactionDepth() > 0);
+  }
+
+  /**
+   * Determines current transaction depth.
+   */
+  public function transactionDepth() {
+    return count($this->transactionLayers);
+  }
+
+  /**
+   * Returns a new DatabaseTransaction object on this connection.
+   *
+   * @param $name
+   *   Optional name of the savepoint.
+   *
+   * @return DatabaseTransaction
+   *   A DatabaseTransaction object.
+   *
+   * @see DatabaseTransaction
+   */
+  public function startTransaction($name = '') {
+    $class = $this->getDriverClass('DatabaseTransaction');
+    return new $class($this, $name);
+  }
+
+  /**
+   * Rolls back the transaction entirely or to a named savepoint.
+   *
+   * This method throws an exception if no transaction is active.
+   *
+   * @param $savepoint_name
+   *   The name of the savepoint. The default, 'drupal_transaction', will roll
+   *   the entire transaction back.
+   *
+   * @throws DatabaseTransactionNoActiveException
+   *
+   * @see DatabaseTransaction::rollback()
+   */
+  public function rollback($savepoint_name = 'drupal_transaction') {
+    if (!$this->supportsTransactions()) {
+      return;
+    }
+    if (!$this->inTransaction()) {
+      throw new DatabaseTransactionNoActiveException();
+    }
+    // A previous rollback to an earlier savepoint may mean that the savepoint
+    // in question has already been accidentally committed.
+    if (!isset($this->transactionLayers[$savepoint_name])) {
+      throw new DatabaseTransactionNoActiveException();
+    }
+
+    // We need to find the point we're rolling back to, all other savepoints
+    // before are no longer needed. If we rolled back other active savepoints,
+    // we need to throw an exception.
+    $rolled_back_other_active_savepoints = FALSE;
+    while ($savepoint = array_pop($this->transactionLayers)) {
+      if ($savepoint == $savepoint_name) {
+        // If it is the last the transaction in the stack, then it is not a
+        // savepoint, it is the transaction itself so we will need to roll back
+        // the transaction rather than a savepoint.
+        if (empty($this->transactionLayers)) {
+          break;
+        }
+        $this->query('ROLLBACK TO SAVEPOINT ' . $savepoint);
+        $this->popCommittableTransactions();
+        if ($rolled_back_other_active_savepoints) {
+          throw new DatabaseTransactionOutOfOrderException();
+        }
+        return;
+      }
+      else {
+        $rolled_back_other_active_savepoints = TRUE;
+      }
+    }
+    parent::rollBack();
+    if ($rolled_back_other_active_savepoints) {
+      throw new DatabaseTransactionOutOfOrderException();
+    }
+  }
+
+  /**
+   * Increases the depth of transaction nesting.
+   *
+   * If no transaction is already active, we begin a new transaction.
+   *
+   * @throws DatabaseTransactionNameNonUniqueException
+   *
+   * @see DatabaseTransaction
+   */
+  public function pushTransaction($name) {
+    if (!$this->supportsTransactions()) {
+      return;
+    }
+    if (isset($this->transactionLayers[$name])) {
+      throw new DatabaseTransactionNameNonUniqueException($name . " is already in use.");
+    }
+    // If we're already in a transaction then we want to create a savepoint
+    // rather than try to create another transaction.
+    if ($this->inTransaction()) {
+      $this->query('SAVEPOINT ' . $name);
+    }
+    else {
+      parent::beginTransaction();
+    }
+    $this->transactionLayers[$name] = $name;
+  }
+
+  /**
+   * Decreases the depth of transaction nesting.
+   *
+   * If we pop off the last transaction layer, then we either commit or roll
+   * back the transaction as necessary. If no transaction is active, we return
+   * because the transaction may have manually been rolled back.
+   *
+   * @param $name
+   *   The name of the savepoint
+   *
+   * @throws DatabaseTransactionNoActiveException
+   * @throws DatabaseTransactionCommitFailedException
+   *
+   * @see DatabaseTransaction
+   */
+  public function popTransaction($name) {
+    if (!$this->supportsTransactions()) {
+      return;
+    }
+    // The transaction has already been committed earlier. There is nothing we
+    // need to do. If this transaction was part of an earlier out-of-order
+    // rollback, an exception would already have been thrown by
+    // Database::rollback().
+    if (!isset($this->transactionLayers[$name])) {
+      return;
+    }
+
+    // Mark this layer as committable.
+    $this->transactionLayers[$name] = FALSE;
+    $this->popCommittableTransactions();
+  }
+
+  /**
+   * Internal function: commit all the transaction layers that can commit.
+   */
+  protected function popCommittableTransactions() {
+    // Commit all the committable layers.
+    foreach (array_reverse($this->transactionLayers) as $name => $active) {
+      // Stop once we found an active transaction.
+      if ($active) {
+        break;
+      }
+
+      // If there are no more layers left then we should commit.
+      unset($this->transactionLayers[$name]);
+      if (empty($this->transactionLayers)) {
+        if (!parent::commit()) {
+          throw new DatabaseTransactionCommitFailedException();
+        }
+      }
+      else {
+        $this->query('RELEASE SAVEPOINT ' . $name);
+      }
+    }
+  }
+
+  /**
+   * Runs a limited-range query on this database object.
+   *
+   * Use this as a substitute for ->query() when a subset of the query is to be
+   * returned. User-supplied arguments to the query should be passed in as
+   * separate parameters so that they can be properly escaped to avoid SQL
+   * injection attacks.
+   *
+   * @param $query
+   *   A string containing an SQL query.
+   * @param $args
+   *   An array of values to substitute into the query at placeholder markers.
+   * @param $from
+   *   The first result row to return.
+   * @param $count
+   *   The maximum number of result rows to return.
+   * @param $options
+   *   An array of options on the query.
+   *
+   * @return DatabaseStatementInterface
+   *   A database query result resource, or NULL if the query was not executed
+   *   correctly.
+   */
+  abstract public function queryRange($query, $from, $count, array $args = array(), array $options = array());
+
+  /**
+   * Generates a temporary table name.
+   *
+   * @return
+   *   A table name.
+   */
+  protected function generateTemporaryTableName() {
+    return "db_temporary_" . $this->temporaryNameIndex++;
+  }
+
+  /**
+   * Runs a SELECT query and stores its results in a temporary table.
+   *
+   * Use this as a substitute for ->query() when the results need to stored
+   * in a temporary table. Temporary tables exist for the duration of the page
+   * request. User-supplied arguments to the query should be passed in as
+   * separate parameters so that they can be properly escaped to avoid SQL
+   * injection attacks.
+   *
+   * Note that if you need to know how many results were returned, you should do
+   * a SELECT COUNT(*) on the temporary table afterwards.
+   *
+   * @param $query
+   *   A string containing a normal SELECT SQL query.
+   * @param $args
+   *   An array of values to substitute into the query at placeholder markers.
+   * @param $options
+   *   An associative array of options to control how the query is run. See
+   *   the documentation for DatabaseConnection::defaultOptions() for details.
+   *
+   * @return
+   *   The name of the temporary table.
+   */
+  abstract function queryTemporary($query, array $args = array(), array $options = array());
+
+  /**
+   * Returns the type of database driver.
+   *
+   * This is not necessarily the same as the type of the database itself. For
+   * instance, there could be two MySQL drivers, mysql and mysql_mock. This
+   * function would return different values for each, but both would return
+   * "mysql" for databaseType().
+   */
+  abstract public function driver();
+
+  /**
+   * Returns the version of the database server.
+   */
+  public function version() {
+    return $this->getAttribute(PDO::ATTR_SERVER_VERSION);
+  }
+
+  /**
+   * Determines if this driver supports transactions.
+   *
+   * @return
+   *   TRUE if this connection supports transactions, FALSE otherwise.
+   */
+  public function supportsTransactions() {
+    return $this->transactionSupport;
+  }
+
+  /**
+   * Determines if this driver supports transactional DDL.
+   *
+   * DDL queries are those that change the schema, such as ALTER queries.
+   *
+   * @return
+   *   TRUE if this connection supports transactions for DDL queries, FALSE
+   *   otherwise.
+   */
+  public function supportsTransactionalDDL() {
+    return $this->transactionalDDLSupport;
+  }
+
+  /**
+   * Returns the name of the PDO driver for this connection.
+   */
+  abstract public function databaseType();
+
+
+  /**
+   * Gets any special processing requirements for the condition operator.
+   *
+   * Some condition types require special processing, such as IN, because
+   * the value data they pass in is not a simple value. This is a simple
+   * overridable lookup function. Database connections should define only
+   * those operators they wish to be handled differently than the default.
+   *
+   * @param $operator
+   *   The condition operator, such as "IN", "BETWEEN", etc. Case-sensitive.
+   *
+   * @return
+   *   The extra handling directives for the specified operator, or NULL.
+   *
+   * @see DatabaseCondition::compile()
+   */
+  abstract public function mapConditionOperator($operator);
+
+  /**
+   * Throws an exception to deny direct access to transaction commits.
+   *
+   * We do not want to allow users to commit transactions at any time, only
+   * by destroying the transaction object or allowing it to go out of scope.
+   * A direct commit bypasses all of the safety checks we've built on top of
+   * PDO's transaction routines.
+   *
+   * @throws DatabaseTransactionExplicitCommitNotAllowedException
+   *
+   * @see DatabaseTransaction
+   */
+  public function commit() {
+    throw new DatabaseTransactionExplicitCommitNotAllowedException();
+  }
+
+  /**
+   * Retrieves an unique id from a given sequence.
+   *
+   * Use this function if for some reason you can't use a serial field. For
+   * example, MySQL has no ways of reading of the current value of a sequence
+   * and PostgreSQL can not advance the sequence to be larger than a given
+   * value. Or sometimes you just need a unique integer.
+   *
+   * @param $existing_id
+   *   After a database import, it might be that the sequences table is behind,
+   *   so by passing in the maximum existing id, it can be assured that we
+   *   never issue the same id.
+   *
+   * @return
+   *   An integer number larger than any number returned by earlier calls and
+   *   also larger than the $existing_id if one was passed in.
+   */
+  abstract public function nextId($existing_id = 0);
+}
+
+/**
+ * Primary front-controller for the database system.
+ *
+ * This class is uninstantiatable and un-extendable. It acts to encapsulate
+ * all control and shepherding of database connections into a single location
+ * without the use of globals.
+ */
+abstract class Database {
+
+  /**
+   * Flag to indicate a query call should simply return NULL.
+   *
+   * This is used for queries that have no reasonable return value anyway, such
+   * as INSERT statements to a table without a serial primary key.
+   */
+  const RETURN_NULL = 0;
+
+  /**
+   * Flag to indicate a query call should return the prepared statement.
+   */
+  const RETURN_STATEMENT = 1;
+
+  /**
+   * Flag to indicate a query call should return the number of affected rows.
+   */
+  const RETURN_AFFECTED = 2;
+
+  /**
+   * Flag to indicate a query call should return the "last insert id".
+   */
+  const RETURN_INSERT_ID = 3;
+
+  /**
+   * An nested array of all active connections. It is keyed by database name
+   * and target.
+   *
+   * @var array
+   */
+  static protected $connections = array();
+
+  /**
+   * A processed copy of the database connection information from settings.php.
+   *
+   * @var array
+   */
+  static protected $databaseInfo = NULL;
+
+  /**
+   * A list of key/target credentials to simply ignore.
+   *
+   * @var array
+   */
+  static protected $ignoreTargets = array();
+
+  /**
+   * The key of the currently active database connection.
+   *
+   * @var string
+   */
+  static protected $activeKey = 'default';
+
+  /**
+   * An array of active query log objects.
+   *
+   * Every connection has one and only one logger object for all targets and
+   * logging keys.
+   *
+   * array(
+   *   '$db_key' => DatabaseLog object.
+   * );
+   *
+   * @var array
+   */
+  static protected $logs = array();
+
+  /**
+   * Starts logging a given logging key on the specified connection.
+   *
+   * @param $logging_key
+   *   The logging key to log.
+   * @param $key
+   *   The database connection key for which we want to log.
+   *
+   * @return DatabaseLog
+   *   The query log object. Note that the log object does support richer
+   *   methods than the few exposed through the Database class, so in some
+   *   cases it may be desirable to access it directly.
+   *
+   * @see DatabaseLog
+   */
+  final public static function startLog($logging_key, $key = 'default') {
+    if (empty(self::$logs[$key])) {
+      self::$logs[$key] = new DatabaseLog($key);
+
+      // Every target already active for this connection key needs to have the
+      // logging object associated with it.
+      if (!empty(self::$connections[$key])) {
+        foreach (self::$connections[$key] as $connection) {
+          $connection->setLogger(self::$logs[$key]);
+        }
+      }
+    }
+
+    self::$logs[$key]->start($logging_key);
+    return self::$logs[$key];
+  }
+
+  /**
+   * Retrieves the queries logged on for given logging key.
+   *
+   * This method also ends logging for the specified key. To get the query log
+   * to date without ending the logger request the logging object by starting
+   * it again (which does nothing to an open log key) and call methods on it as
+   * desired.
+   *
+   * @param $logging_key
+   *   The logging key to log.
+   * @param $key
+   *   The database connection key for which we want to log.
+   *
+   * @return array
+   *   The query log for the specified logging key and connection.
+   *
+   * @see DatabaseLog
+   */
+  final public static function getLog($logging_key, $key = 'default') {
+    if (empty(self::$logs[$key])) {
+      return NULL;
+    }
+    $queries = self::$logs[$key]->get($logging_key);
+    self::$logs[$key]->end($logging_key);
+    return $queries;
+  }
+
+  /**
+   * Gets the connection object for the specified database key and target.
+   *
+   * @param $target
+   *   The database target name.
+   * @param $key
+   *   The database connection key. Defaults to NULL which means the active key.
+   *
+   * @return DatabaseConnection
+   *   The corresponding connection object.
+   */
+  final public static function getConnection($target = 'default', $key = NULL) {
+    if (!isset($key)) {
+      // By default, we want the active connection, set in setActiveConnection.
+      $key = self::$activeKey;
+    }
+    // If the requested target does not exist, or if it is ignored, we fall back
+    // to the default target. The target is typically either "default" or
+    // "slave", indicating to use a slave SQL server if one is available. If
+    // it's not available, then the default/master server is the correct server
+    // to use.
+    if (!empty(self::$ignoreTargets[$key][$target]) || !isset(self::$databaseInfo[$key][$target])) {
+      $target = 'default';
+    }
+
+    if (!isset(self::$connections[$key][$target])) {
+      // If necessary, a new connection is opened.
+      self::$connections[$key][$target] = self::openConnection($key, $target);
+    }
+    return self::$connections[$key][$target];
+  }
+
+  /**
+   * Determines if there is an active connection.
+   *
+   * Note that this method will return FALSE if no connection has been
+   * established yet, even if one could be.
+   *
+   * @return
+   *   TRUE if there is at least one database connection established, FALSE
+   *   otherwise.
+   */
+  final public static function isActiveConnection() {
+    return !empty(self::$activeKey) && !empty(self::$connections) && !empty(self::$connections[self::$activeKey]);
+  }
+
+  /**
+   * Sets the active connection to the specified key.
+   *
+   * @return
+   *   The previous database connection key.
+   */
+  final public static function setActiveConnection($key = 'default') {
+    if (empty(self::$databaseInfo)) {
+      self::parseConnectionInfo();
+    }
+
+    if (!empty(self::$databaseInfo[$key])) {
+      $old_key = self::$activeKey;
+      self::$activeKey = $key;
+      return $old_key;
+    }
+  }
+
+  /**
+   * Process the configuration file for database information.
+   */
+  final public static function parseConnectionInfo() {
+    global $databases;
+
+    $database_info = is_array($databases) ? $databases : array();
+    foreach ($database_info as $index => $info) {
+      foreach ($database_info[$index] as $target => $value) {
+        // If there is no "driver" property, then we assume it's an array of
+        // possible connections for this target. Pick one at random. That allows
+        //  us to have, for example, multiple slave servers.
+        if (empty($value['driver'])) {
+          $database_info[$index][$target] = $database_info[$index][$target][mt_rand(0, count($database_info[$index][$target]) - 1)];
+        }
+
+        // Parse the prefix information.
+        if (!isset($database_info[$index][$target]['prefix'])) {
+          // Default to an empty prefix.
+          $database_info[$index][$target]['prefix'] = array(
+            'default' => '',
+          );
+        }
+        elseif (!is_array($database_info[$index][$target]['prefix'])) {
+          // Transform the flat form into an array form.
+          $database_info[$index][$target]['prefix'] = array(
+            'default' => $database_info[$index][$target]['prefix'],
+          );
+        }
+      }
+    }
+
+    if (!is_array(self::$databaseInfo)) {
+      self::$databaseInfo = $database_info;
+    }
+
+    // Merge the new $database_info into the existing.
+    // array_merge_recursive() cannot be used, as it would make multiple
+    // database, user, and password keys in the same database array.
+    else {
+      foreach ($database_info as $database_key => $database_values) {
+        foreach ($database_values as $target => $target_values) {
+          self::$databaseInfo[$database_key][$target] = $target_values;
+        }
+      }
+    }
+  }
+
+  /**
+   * Adds database connection information for a given key/target.
+   *
+   * This method allows the addition of new connection credentials at runtime.
+   * Under normal circumstances the preferred way to specify database
+   * credentials is via settings.php. However, this method allows them to be
+   * added at arbitrary times, such as during unit tests, when connecting to
+   * admin-defined third party databases, etc.
+   *
+   * If the given key/target pair already exists, this method will be ignored.
+   *
+   * @param $key
+   *   The database key.
+   * @param $target
+   *   The database target name.
+   * @param $info
+   *   The database connection information, as it would be defined in
+   *   settings.php. Note that the structure of this array will depend on the
+   *   database driver it is connecting to.
+   */
+  public static function addConnectionInfo($key, $target, $info) {
+    if (empty(self::$databaseInfo[$key][$target])) {
+      self::$databaseInfo[$key][$target] = $info;
+    }
+  }
+
+  /**
+   * Gets information on the specified database connection.
+   *
+   * @param $connection
+   *   The connection key for which we want information.
+   */
+  final public static function getConnectionInfo($key = 'default') {
+    if (empty(self::$databaseInfo)) {
+      self::parseConnectionInfo();
+    }
+
+    if (!empty(self::$databaseInfo[$key])) {
+      return self::$databaseInfo[$key];
+    }
+  }
+
+  /**
+   * Rename a connection and its corresponding connection information.
+   *
+   * @param $old_key
+   *   The old connection key.
+   * @param $new_key
+   *   The new connection key.
+   * @return
+   *   TRUE in case of success, FALSE otherwise.
+   */
+  final public static function renameConnection($old_key, $new_key) {
+    if (empty(self::$databaseInfo)) {
+      self::parseConnectionInfo();
+    }
+
+    if (!empty(self::$databaseInfo[$old_key]) && empty(self::$databaseInfo[$new_key])) {
+      // Migrate the database connection information.
+      self::$databaseInfo[$new_key] = self::$databaseInfo[$old_key];
+      unset(self::$databaseInfo[$old_key]);
+
+      // Migrate over the DatabaseConnection object if it exists.
+      if (isset(self::$connections[$old_key])) {
+        self::$connections[$new_key] = self::$connections[$old_key];
+        unset(self::$connections[$old_key]);
+      }
+
+      return TRUE;
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  /**
+   * Remove a connection and its corresponding connection information.
+   *
+   * @param $key
+   *   The connection key.
+   * @return
+   *   TRUE in case of success, FALSE otherwise.
+   */
+  final public static function removeConnection($key) {
+    if (isset(self::$databaseInfo[$key])) {
+      self::closeConnection(NULL, $key);
+      unset(self::$databaseInfo[$key]);
+      return TRUE;
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  /**
+   * Opens a connection to the server specified by the given key and target.
+   *
+   * @param $key
+   *   The database connection key, as specified in settings.php. The default is
+   *   "default".
+   * @param $target
+   *   The database target to open.
+   *
+   * @throws DatabaseConnectionNotDefinedException
+   * @throws DatabaseDriverNotSpecifiedException
+   */
+  final protected static function openConnection($key, $target) {
+    if (empty(self::$databaseInfo)) {
+      self::parseConnectionInfo();
+    }
+
+    // If the requested database does not exist then it is an unrecoverable
+    // error.
+    if (!isset(self::$databaseInfo[$key])) {
+      throw new DatabaseConnectionNotDefinedException('The specified database connection is not defined: ' . $key);
+    }
+
+    if (!$driver = self::$databaseInfo[$key][$target]['driver']) {
+      throw new DatabaseDriverNotSpecifiedException('Driver not specified for this database connection: ' . $key);
+    }
+
+    // We cannot rely on the registry yet, because the registry requires an
+    // open database connection.
+    $driver_class = 'DatabaseConnection_' . $driver;
+    require_once DRUPAL_ROOT . '/includes/database/' . $driver . '/database.inc';
+    $new_connection = new $driver_class(self::$databaseInfo[$key][$target]);
+    $new_connection->setTarget($target);
+    $new_connection->setKey($key);
+
+    // If we have any active logging objects for this connection key, we need
+    // to associate them with the connection we just opened.
+    if (!empty(self::$logs[$key])) {
+      $new_connection->setLogger(self::$logs[$key]);
+    }
+
+    return $new_connection;
+  }
+
+  /**
+   * Closes a connection to the server specified by the given key and target.
+   *
+   * @param $target
+   *   The database target name.  Defaults to NULL meaning that all target
+   *   connections will be closed.
+   * @param $key
+   *   The database connection key. Defaults to NULL which means the active key.
+   */
+  public static function closeConnection($target = NULL, $key = NULL) {
+    // Gets the active connection by default.
+    if (!isset($key)) {
+      $key = self::$activeKey;
+    }
+    // To close a connection, it needs to be set to NULL and removed from the
+    // static variable. In all cases, closeConnection() might be called for a
+    // connection that was not opened yet, in which case the key is not defined
+    // yet and we just ensure that the connection key is undefined.
+    if (isset($target)) {
+      if (isset(self::$connections[$key][$target])) {
+        self::$connections[$key][$target]->destroy();
+        self::$connections[$key][$target] = NULL;
+      }
+      unset(self::$connections[$key][$target]);
+    }
+    else {
+      if (isset(self::$connections[$key])) {
+        foreach (self::$connections[$key] as $target => $connection) {
+          self::$connections[$key][$target]->destroy();
+          self::$connections[$key][$target] = NULL;
+        }
+      }
+      unset(self::$connections[$key]);
+    }
+  }
+
+  /**
+   * Instructs the system to temporarily ignore a given key/target.
+   *
+   * At times we need to temporarily disable slave queries. To do so, call this
+   * method with the database key and the target to disable. That database key
+   * will then always fall back to 'default' for that key, even if it's defined.
+   *
+   * @param $key
+   *   The database connection key.
+   * @param $target
+   *   The target of the specified key to ignore.
+   */
+  public static function ignoreTarget($key, $target) {
+    self::$ignoreTargets[$key][$target] = TRUE;
+  }
+
+  /**
+   * Load a file for the database that might hold a class.
+   *
+   * @param $driver
+   *   The name of the driver.
+   * @param array $files
+   *   The name of the files the driver specific class can be.
+   */
+  public static function loadDriverFile($driver, array $files = array()) {
+    static $base_path;
+
+    if (empty($base_path)) {
+      $base_path = dirname(realpath(__FILE__));
+    }
+
+    $driver_base_path = "$base_path/$driver";
+    foreach ($files as $file) {
+      // Load the base file first so that classes extending base classes will
+      // have the base class loaded.
+      foreach (array("$base_path/$file", "$driver_base_path/$file") as $filename) {
+        // The OS caches file_exists() and PHP caches require_once(), so
+        // we'll let both of those take care of performance here.
+        if (file_exists($filename)) {
+          require_once $filename;
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Exception for when popTransaction() is called with no active transaction.
+ */
+class DatabaseTransactionNoActiveException extends Exception { }
+
+/**
+ * Exception thrown when a savepoint or transaction name occurs twice.
+ */
+class DatabaseTransactionNameNonUniqueException extends Exception { }
+
+/**
+ * Exception thrown when a commit() function fails.
+ */
+class DatabaseTransactionCommitFailedException extends Exception { }
+
+/**
+ * Exception to deny attempts to explicitly manage transactions.
+ *
+ * This exception will be thrown when the PDO connection commit() is called.
+ * Code should never call this method directly.
+ */
+class DatabaseTransactionExplicitCommitNotAllowedException extends Exception { }
+
+/**
+ * Exception thrown when a rollback() resulted in other active transactions being rolled-back.
+ */
+class DatabaseTransactionOutOfOrderException extends Exception { }
+
+/**
+ * Exception thrown for merge queries that do not make semantic sense.
+ *
+ * There are many ways that a merge query could be malformed.  They should all
+ * throw this exception and set an appropriately descriptive message.
+ */
+class InvalidMergeQueryException extends Exception {}
+
+/**
+ * Exception thrown if an insert query specifies a field twice.
+ *
+ * It is not allowed to specify a field as default and insert field, this
+ * exception is thrown if that is the case.
+ */
+class FieldsOverlapException extends Exception {}
+
+/**
+ * Exception thrown if an insert query doesn't specify insert or default fields.
+ */
+class NoFieldsException extends Exception {}
+
+/**
+ * Exception thrown if an undefined database connection is requested.
+ */
+class DatabaseConnectionNotDefinedException extends Exception {}
+
+/**
+ * Exception thrown if no driver is specified for a database connection.
+ */
+class DatabaseDriverNotSpecifiedException extends Exception {}
+
+
+/**
+ * A wrapper class for creating and managing database transactions.
+ *
+ * Not all databases or database configurations support transactions. For
+ * example, MySQL MyISAM tables do not. It is also easy to begin a transaction
+ * and then forget to commit it, which can lead to connection errors when
+ * another transaction is started.
+ *
+ * This class acts as a wrapper for transactions. To begin a transaction,
+ * simply instantiate it. When the object goes out of scope and is destroyed
+ * it will automatically commit. It also will check to see if the specified
+ * connection supports transactions. If not, it will simply skip any transaction
+ * commands, allowing user-space code to proceed normally. The only difference
+ * is that rollbacks won't actually do anything.
+ *
+ * In the vast majority of cases, you should not instantiate this class
+ * directly. Instead, call ->startTransaction(), from the appropriate connection
+ * object.
+ */
+class DatabaseTransaction {
+
+  /**
+   * The connection object for this transaction.
+   *
+   * @var DatabaseConnection
+   */
+  protected $connection;
+
+  /**
+   * A boolean value to indicate whether this transaction has been rolled back.
+   *
+   * @var Boolean
+   */
+  protected $rolledBack = FALSE;
+
+  /**
+   * The name of the transaction.
+   *
+   * This is used to label the transaction savepoint. It will be overridden to
+   * 'drupal_transaction' if there is no transaction depth.
+   */
+  protected $name;
+
+  public function __construct(DatabaseConnection $connection, $name = NULL) {
+    $this->connection = $connection;
+    // If there is no transaction depth, then no transaction has started. Name
+    // the transaction 'drupal_transaction'.
+    if (!$depth = $connection->transactionDepth()) {
+      $this->name = 'drupal_transaction';
+    }
+    // Within transactions, savepoints are used. Each savepoint requires a
+    // name. So if no name is present we need to create one.
+    elseif (!$name) {
+      $this->name = 'savepoint_' . $depth;
+    }
+    else {
+      $this->name = $name;
+    }
+    $this->connection->pushTransaction($this->name);
+  }
+
+  public function __destruct() {
+    // If we rolled back then the transaction would have already been popped.
+    if (!$this->rolledBack) {
+      $this->connection->popTransaction($this->name);
+    }
+  }
+
+  /**
+   * Retrieves the name of the transaction or savepoint.
+   */
+  public function name() {
+    return $this->name;
+  }
+
+  /**
+   * Rolls back the current transaction.
+   *
+   * This is just a wrapper method to rollback whatever transaction stack we are
+   * currently in, which is managed by the connection object itself. Note that
+   * logging (preferable with watchdog_exception()) needs to happen after a
+   * transaction has been rolled back or the log messages will be rolled back
+   * too.
+   *
+   * @see DatabaseConnection::rollback()
+   * @see watchdog_exception()
+   */
+  public function rollback() {
+    $this->rolledBack = TRUE;
+    $this->connection->rollback($this->name);
+  }
+}
+
+/**
+ * Represents a prepared statement.
+ *
+ * Some methods in that class are purposefully commented out. Due to a change in
+ * how PHP defines PDOStatement, we can't define a signature for those methods
+ * that will work the same way between versions older than 5.2.6 and later
+ * versions.  See http://bugs.php.net/bug.php?id=42452 for more details.
+ *
+ * Child implementations should either extend PDOStatement:
+ * @code
+ * class DatabaseStatement_oracle extends PDOStatement implements DatabaseStatementInterface {}
+ * @endcode
+ * or define their own class. If defining their own class, they will also have
+ * to implement either the Iterator or IteratorAggregate interface before
+ * DatabaseStatementInterface:
+ * @code
+ * class DatabaseStatement_oracle implements Iterator, DatabaseStatementInterface {}
+ * @endcode
+ */
+interface DatabaseStatementInterface extends Traversable {
+
+  /**
+   * Executes a prepared statement
+   *
+   * @param $args
+   *   An array of values with as many elements as there are bound parameters in
+   *   the SQL statement being executed.
+   * @param $options
+   *   An array of options for this query.
+   *
+   * @return
+   *   TRUE on success, or FALSE on failure.
+   */
+  public function execute($args = array(), $options = array());
+
+  /**
+   * Gets the query string of this statement.
+   *
+   * @return
+   *   The query string, in its form with placeholders.
+   */
+  public function getQueryString();
+
+  /**
+   * Returns the number of rows affected by the last SQL statement.
+   *
+   * @return
+   *   The number of rows affected by the last DELETE, INSERT, or UPDATE
+   *   statement executed.
+   */
+  public function rowCount();
+
+  /**
+   * Sets the default fetch mode for this statement.
+   *
+   * See http://php.net/manual/pdo.constants.php for the definition of the
+   * constants used.
+   *
+   * @param $mode
+   *   One of the PDO::FETCH_* constants.
+   * @param $a1
+   *   An option depending of the fetch mode specified by $mode:
+   *   - for PDO::FETCH_COLUMN, the index of the column to fetch
+   *   - for PDO::FETCH_CLASS, the name of the class to create
+   *   - for PDO::FETCH_INTO, the object to add the data to
+   * @param $a2
+   *   If $mode is PDO::FETCH_CLASS, the optional arguments to pass to the
+   *   constructor.
+   */
+  // public function setFetchMode($mode, $a1 = NULL, $a2 = array());
+
+  /**
+   * Fetches the next row from a result set.
+   *
+   * See http://php.net/manual/pdo.constants.php for the definition of the
+   * constants used.
+   *
+   * @param $mode
+   *   One of the PDO::FETCH_* constants.
+   *   Default to what was specified by setFetchMode().
+   * @param $cursor_orientation
+   *   Not implemented in all database drivers, don't use.
+   * @param $cursor_offset
+   *   Not implemented in all database drivers, don't use.
+   *
+   * @return
+   *   A result, formatted according to $mode.
+   */
+  // public function fetch($mode = NULL, $cursor_orientation = NULL, $cursor_offset = NULL);
+
+  /**
+   * Returns a single field from the next record of a result set.
+   *
+   * @param $index
+   *   The numeric index of the field to return. Defaults to the first field.
+   *
+   * @return
+   *   A single field from the next record, or FALSE if there is no next record.
+   */
+  public function fetchField($index = 0);
+
+  /**
+   * Fetches the next row and returns it as an object.
+   *
+   * The object will be of the class specified by DatabaseStatementInterface::setFetchMode()
+   * or stdClass if not specified.
+   */
+  // public function fetchObject();
+
+  /**
+   * Fetches the next row and returns it as an associative array.
+   *
+   * This method corresponds to PDOStatement::fetchObject(), but for associative
+   * arrays. For some reason PDOStatement does not have a corresponding array
+   * helper method, so one is added.
+   *
+   * @return
+   *   An associative array, or FALSE if there is no next row.
+   */
+  public function fetchAssoc();
+
+  /**
+   * Returns an array containing all of the result set rows.
+   *
+   * @param $mode
+   *   One of the PDO::FETCH_* constants.
+   * @param $column_index
+   *   If $mode is PDO::FETCH_COLUMN, the index of the column to fetch.
+   * @param $constructor_arguments
+   *   If $mode is PDO::FETCH_CLASS, the arguments to pass to the constructor.
+   *
+   * @return
+   *   An array of results.
+   */
+  // function fetchAll($mode = NULL, $column_index = NULL, array $constructor_arguments);
+
+  /**
+   * Returns an entire single column of a result set as an indexed array.
+   *
+   * Note that this method will run the result set to the end.
+   *
+   * @param $index
+   *   The index of the column number to fetch.
+   *
+   * @return
+   *   An indexed array, or an empty array if there is no result set.
+   */
+  public function fetchCol($index = 0);
+
+  /**
+   * Returns the entire result set as a single associative array.
+   *
+   * This method is only useful for two-column result sets. It will return an
+   * associative array where the key is one column from the result set and the
+   * value is another field. In most cases, the default of the first two columns
+   * is appropriate.
+   *
+   * Note that this method will run the result set to the end.
+   *
+   * @param $key_index
+   *   The numeric index of the field to use as the array key.
+   * @param $value_index
+   *   The numeric index of the field to use as the array value.
+   *
+   * @return
+   *   An associative array, or an empty array if there is no result set.
+   */
+  public function fetchAllKeyed($key_index = 0, $value_index = 1);
+
+  /**
+   * Returns the result set as an associative array keyed by the given field.
+   *
+   * If the given key appears multiple times, later records will overwrite
+   * earlier ones.
+   *
+   * @param $key
+   *   The name of the field on which to index the array.
+   * @param $fetch
+   *   The fetchmode to use. If set to PDO::FETCH_ASSOC, PDO::FETCH_NUM, or
+   *   PDO::FETCH_BOTH the returned value with be an array of arrays. For any
+   *   other value it will be an array of objects. By default, the fetch mode
+   *   set for the query will be used.
+   *
+   * @return
+   *   An associative array, or an empty array if there is no result set.
+   */
+  public function fetchAllAssoc($key, $fetch = NULL);
+}
+
+/**
+ * Default implementation of DatabaseStatementInterface.
+ *
+ * PDO allows us to extend the PDOStatement class to provide additional
+ * functionality beyond that offered by default. We do need extra
+ * functionality. By default, this class is not driver-specific. If a given
+ * driver needs to set a custom statement class, it may do so in its
+ * constructor.
+ *
+ * @see http://us.php.net/pdostatement
+ */
+class DatabaseStatementBase extends PDOStatement implements DatabaseStatementInterface {
+
+  /**
+   * Reference to the database connection object for this statement.
+   *
+   * The name $dbh is inherited from PDOStatement.
+   *
+   * @var DatabaseConnection
+   */
+  public $dbh;
+
+  protected function __construct($dbh) {
+    $this->dbh = $dbh;
+    $this->setFetchMode(PDO::FETCH_OBJ);
+  }
+
+  public function execute($args = array(), $options = array()) {
+    if (isset($options['fetch'])) {
+      if (is_string($options['fetch'])) {
+        // Default to an object. Note: db fields will be added to the object
+        // before the constructor is run. If you need to assign fields after
+        // the constructor is run, see http://drupal.org/node/315092.
+        $this->setFetchMode(PDO::FETCH_CLASS, $options['fetch']);
+      }
+      else {
+        $this->setFetchMode($options['fetch']);
+      }
+    }
+
+    $logger = $this->dbh->getLogger();
+    if (!empty($logger)) {
+      $query_start = microtime(TRUE);
+    }
+
+    $return = parent::execute($args);
+
+    if (!empty($logger)) {
+      $query_end = microtime(TRUE);
+      $logger->log($this, $args, $query_end - $query_start);
+    }
+
+    return $return;
+  }
+
+  public function getQueryString() {
+    return $this->queryString;
+  }
+
+  public function fetchCol($index = 0) {
+    return $this->fetchAll(PDO::FETCH_COLUMN, $index);
+  }
+
+  public function fetchAllAssoc($key, $fetch = NULL) {
+    $return = array();
+    if (isset($fetch)) {
+      if (is_string($fetch)) {
+        $this->setFetchMode(PDO::FETCH_CLASS, $fetch);
+      }
+      else {
+        $this->setFetchMode($fetch);
+      }
+    }
+
+    foreach ($this as $record) {
+      $record_key = is_object($record) ? $record->$key : $record[$key];
+      $return[$record_key] = $record;
+    }
+
+    return $return;
+  }
+
+  public function fetchAllKeyed($key_index = 0, $value_index = 1) {
+    $return = array();
+    $this->setFetchMode(PDO::FETCH_NUM);
+    foreach ($this as $record) {
+      $return[$record[$key_index]] = $record[$value_index];
+    }
+    return $return;
+  }
+
+  public function fetchField($index = 0) {
+    // Call PDOStatement::fetchColumn to fetch the field.
+    return $this->fetchColumn($index);
+  }
+
+  public function fetchAssoc() {
+    // Call PDOStatement::fetch to fetch the row.
+    return $this->fetch(PDO::FETCH_ASSOC);
+  }
+}
+
+/**
+ * Empty implementation of a database statement.
+ *
+ * This class satisfies the requirements of being a database statement/result
+ * object, but does not actually contain data.  It is useful when developers
+ * need to safely return an "empty" result set without connecting to an actual
+ * database.  Calling code can then treat it the same as if it were an actual
+ * result set that happens to contain no records.
+ *
+ * @see SearchQuery
+ */
+class DatabaseStatementEmpty implements Iterator, DatabaseStatementInterface {
+
+  public function execute($args = array(), $options = array()) {
+    return FALSE;
+  }
+
+  public function getQueryString() {
+    return '';
+  }
+
+  public function rowCount() {
+    return 0;
+  }
+
+  public function setFetchMode($mode, $a1 = NULL, $a2 = array()) {
+    return;
+  }
+
+  public function fetch($mode = NULL, $cursor_orientation = NULL, $cursor_offset = NULL) {
+    return NULL;
+  }
+
+  public function fetchField($index = 0) {
+    return NULL;
+  }
+
+  public function fetchObject() {
+    return NULL;
+  }
+
+  public function fetchAssoc() {
+    return NULL;
+  }
+
+  function fetchAll($mode = NULL, $column_index = NULL, array $constructor_arguments = array()) {
+    return array();
+  }
+
+  public function fetchCol($index = 0) {
+    return array();
+  }
+
+  public function fetchAllKeyed($key_index = 0, $value_index = 1) {
+    return array();
+  }
+
+  public function fetchAllAssoc($key, $fetch = NULL) {
+    return array();
+  }
+
+  /* Implementations of Iterator. */
+
+  public function current() {
+    return NULL;
+  }
+
+  public function key() {
+    return NULL;
+  }
+
+  public function rewind() {
+    // Nothing to do: our DatabaseStatement can't be rewound.
+  }
+
+  public function next() {
+    // Do nothing, since this is an always-empty implementation.
+  }
+
+  public function valid() {
+    return FALSE;
+  }
+}
+
+/**
+ * The following utility functions are simply convenience wrappers.
+ *
+ * They should never, ever have any database-specific code in them.
+ */
+
+/**
+ * Executes an arbitrary query string against the active database.
+ *
+ * Use this function for SELECT queries if it is just a simple query string.
+ * If the caller or other modules need to change the query, use db_select()
+ * instead.
+ *
+ * Do not use this function for INSERT, UPDATE, or DELETE queries. Those should
+ * be handled via db_insert(), db_update() and db_delete() respectively.
+ *
+ * @param $query
+ *   The prepared statement query to run. Although it will accept both named and
+ *   unnamed placeholders, named placeholders are strongly preferred as they are
+ *   more self-documenting.
+ * @param $args
+ *   An array of values to substitute into the query. If the query uses named
+ *   placeholders, this is an associative array in any order. If the query uses
+ *   unnamed placeholders (?), this is an indexed array and the order must match
+ *   the order of placeholders in the query string.
+ * @param $options
+ *   An array of options to control how the query operates.
+ *
+ * @return DatabaseStatementInterface
+ *   A prepared statement object, already executed.
+ *
+ * @see DatabaseConnection::defaultOptions()
+ */
+function db_query($query, array $args = array(), array $options = array()) {
+  if (empty($options['target'])) {
+    $options['target'] = 'default';
+  }
+
+  return Database::getConnection($options['target'])->query($query, $args, $options);
+}
+
+/**
+ * Executes a query against the active database, restricted to a range.
+ *
+ * @param $query
+ *   The prepared statement query to run. Although it will accept both named and
+ *   unnamed placeholders, named placeholders are strongly preferred as they are
+ *   more self-documenting.
+ * @param $from
+ *   The first record from the result set to return.
+ * @param $count
+ *   The number of records to return from the result set.
+ * @param $args
+ *   An array of values to substitute into the query. If the query uses named
+ *   placeholders, this is an associative array in any order. If the query uses
+ *   unnamed placeholders (?), this is an indexed array and the order must match
+ *   the order of placeholders in the query string.
+ * @param $options
+ *   An array of options to control how the query operates.
+ *
+ * @return DatabaseStatementInterface
+ *   A prepared statement object, already executed.
+ *
+ * @see DatabaseConnection::defaultOptions()
+ */
+function db_query_range($query, $from, $count, array $args = array(), array $options = array()) {
+  if (empty($options['target'])) {
+    $options['target'] = 'default';
+  }
+
+  return Database::getConnection($options['target'])->queryRange($query, $from, $count, $args, $options);
+}
+
+/**
+ * Executes a query string and saves the result set to a temporary table.
+ *
+ * The execution of the query string happens against the active database.
+ *
+ * @param $query
+ *   The prepared statement query to run. Although it will accept both named and
+ *   unnamed placeholders, named placeholders are strongly preferred as they are
+ *   more self-documenting.
+ * @param $args
+ *   An array of values to substitute into the query. If the query uses named
+ *   placeholders, this is an associative array in any order. If the query uses
+ *   unnamed placeholders (?), this is an indexed array and the order must match
+ *   the order of placeholders in the query string.
+ * @param $options
+ *   An array of options to control how the query operates.
+ *
+ * @return
+ *   The name of the temporary table.
+ *
+ * @see DatabaseConnection::defaultOptions()
+ */
+function db_query_temporary($query, array $args = array(), array $options = array()) {
+  if (empty($options['target'])) {
+    $options['target'] = 'default';
+  }
+
+  return Database::getConnection($options['target'])->queryTemporary($query, $args, $options);
+}
+
+/**
+ * Returns a new InsertQuery object for the active database.
+ *
+ * @param $table
+ *   The table into which to insert.
+ * @param $options
+ *   An array of options to control how the query operates.
+ *
+ * @return InsertQuery
+ *   A new InsertQuery object for this connection.
+ */
+function db_insert($table, array $options = array()) {
+  if (empty($options['target']) || $options['target'] == 'slave') {
+    $options['target'] = 'default';
+  }
+  return Database::getConnection($options['target'])->insert($table, $options);
+}
+
+/**
+ * Returns a new MergeQuery object for the active database.
+ *
+ * @param $table
+ *   The table into which to merge.
+ * @param $options
+ *   An array of options to control how the query operates.
+ *
+ * @return MergeQuery
+ *   A new MergeQuery object for this connection.
+ */
+function db_merge($table, array $options = array()) {
+  if (empty($options['target']) || $options['target'] == 'slave') {
+    $options['target'] = 'default';
+  }
+  return Database::getConnection($options['target'])->merge($table, $options);
+}
+
+/**
+ * Returns a new UpdateQuery object for the active database.
+ *
+ * @param $table
+ *   The table to update.
+ * @param $options
+ *   An array of options to control how the query operates.
+ *
+ * @return UpdateQuery
+ *   A new UpdateQuery object for this connection.
+ */
+function db_update($table, array $options = array()) {
+  if (empty($options['target']) || $options['target'] == 'slave') {
+    $options['target'] = 'default';
+  }
+  return Database::getConnection($options['target'])->update($table, $options);
+}
+
+/**
+ * Returns a new DeleteQuery object for the active database.
+ *
+ * @param $table
+ *   The table from which to delete.
+ * @param $options
+ *   An array of options to control how the query operates.
+ *
+ * @return DeleteQuery
+ *   A new DeleteQuery object for this connection.
+ */
+function db_delete($table, array $options = array()) {
+  if (empty($options['target']) || $options['target'] == 'slave') {
+    $options['target'] = 'default';
+  }
+  return Database::getConnection($options['target'])->delete($table, $options);
+}
+
+/**
+ * Returns a new TruncateQuery object for the active database.
+ *
+ * @param $table
+ *   The table from which to delete.
+ * @param $options
+ *   An array of options to control how the query operates.
+ *
+ * @return TruncateQuery
+ *   A new TruncateQuery object for this connection.
+ */
+function db_truncate($table, array $options = array()) {
+  if (empty($options['target']) || $options['target'] == 'slave') {
+    $options['target'] = 'default';
+  }
+  return Database::getConnection($options['target'])->truncate($table, $options);
+}
+
+/**
+ * Returns a new SelectQuery object for the active database.
+ *
+ * @param $table
+ *   The base table for this query. May be a string or another SelectQuery
+ *   object. If a query object is passed, it will be used as a subselect.
+ * @param $alias
+ *   The alias for the base table of this query.
+ * @param $options
+ *   An array of options to control how the query operates.
+ *
+ * @return SelectQuery
+ *   A new SelectQuery object for this connection.
+ */
+function db_select($table, $alias = NULL, array $options = array()) {
+  if (empty($options['target'])) {
+    $options['target'] = 'default';
+  }
+  return Database::getConnection($options['target'])->select($table, $alias, $options);
+}
+
+/**
+ * Returns a new transaction object for the active database.
+ *
+ * @param string $name
+ *   Optional name of the transaction.
+ * @param array $options
+ *   An array of options to control how the transaction operates:
+ *   - target: The database target name.
+ *
+ * @return DatabaseTransaction
+ *   A new DatabaseTransaction object for this connection.
+ */
+function db_transaction($name = NULL, array $options = array()) {
+  if (empty($options['target'])) {
+    $options['target'] = 'default';
+  }
+  return Database::getConnection($options['target'])->startTransaction($name);
+}
+
+/**
+ * Sets a new active database.
+ *
+ * @param $key
+ *   The key in the $databases array to set as the default database.
+ *
+ * @return
+ *   The key of the formerly active database.
+ */
+function db_set_active($key = 'default') {
+  return Database::setActiveConnection($key);
+}
+
+/**
+ * Restricts a dynamic table name to safe characters.
+ *
+ * Only keeps alphanumeric and underscores.
+ *
+ * @param $table
+ *   The table name to escape.
+ *
+ * @return
+ *   The escaped table name as a string.
+ */
+function db_escape_table($table) {
+  return Database::getConnection()->escapeTable($table);
+}
+
+/**
+ * Restricts a dynamic column or constraint name to safe characters.
+ *
+ * Only keeps alphanumeric and underscores.
+ *
+ * @param $field
+ *   The field name to escape.
+ *
+ * @return
+ *   The escaped field name as a string.
+ */
+function db_escape_field($field) {
+  return Database::getConnection()->escapeField($field);
+}
+
+/**
+ * Escapes characters that work as wildcard characters in a LIKE pattern.
+ *
+ * The wildcard characters "%" and "_" as well as backslash are prefixed with
+ * a backslash. Use this to do a search for a verbatim string without any
+ * wildcard behavior.
+ *
+ * For example, the following does a case-insensitive query for all rows whose
+ * name starts with $prefix:
+ * @code
+ * $result = db_query(
+ *   'SELECT * FROM person WHERE name LIKE :pattern',
+ *   array(':pattern' => db_like($prefix) . '%')
+ * );
+ * @endcode
+ *
+ * Backslash is defined as escape character for LIKE patterns in
+ * DatabaseCondition::mapConditionOperator().
+ *
+ * @param $string
+ *   The string to escape.
+ *
+ * @return
+ *   The escaped string.
+ */
+function db_like($string) {
+  return Database::getConnection()->escapeLike($string);
+}
+
+/**
+ * Retrieves the name of the currently active database driver.
+ *
+ * @return
+ *   The name of the currently active database driver.
+ */
+function db_driver() {
+  return Database::getConnection()->driver();
+}
+
+/**
+ * Closes the active database connection.
+ *
+ * @param $options
+ *   An array of options to control which connection is closed. Only the target
+ *   key has any meaning in this case.
+ */
+function db_close(array $options = array()) {
+  if (empty($options['target'])) {
+    $options['target'] = NULL;
+  }
+  Database::closeConnection($options['target']);
+}
+
+/**
+ * Retrieves a unique id.
+ *
+ * Use this function if for some reason you can't use a serial field. Using a
+ * serial field is preferred, and InsertQuery::execute() returns the value of
+ * the last ID inserted.
+ *
+ * @param $existing_id
+ *   After a database import, it might be that the sequences table is behind, so
+ *   by passing in a minimum ID, it can be assured that we never issue the same
+ *   ID.
+ *
+ * @return
+ *   An integer number larger than any number returned before for this sequence.
+ */
+function db_next_id($existing_id = 0) {
+  return Database::getConnection()->nextId($existing_id);
+}
+
+/**
+ * Returns a new DatabaseCondition, set to "OR" all conditions together.
+ *
+ * @return DatabaseCondition
+ */
+function db_or() {
+  return new DatabaseCondition('OR');
+}
+
+/**
+ * Returns a new DatabaseCondition, set to "AND" all conditions together.
+ *
+ * @return DatabaseCondition
+ */
+function db_and() {
+  return new DatabaseCondition('AND');
+}
+
+/**
+ * Returns a new DatabaseCondition, set to "XOR" all conditions together.
+ *
+ * @return DatabaseCondition
+ */
+function db_xor() {
+  return new DatabaseCondition('XOR');
+}
+
+/**
+ * Returns a new DatabaseCondition, set to the specified conjunction.
+ *
+ * Internal API function call.  The db_and(), db_or(), and db_xor()
+ * functions are preferred.
+ *
+ * @param $conjunction
+ *   The conjunction to use for query conditions (AND, OR or XOR).
+ * @return DatabaseCondition
+ */
+function db_condition($conjunction) {
+  return new DatabaseCondition($conjunction);
+}
+
+/**
+ * @} End of "defgroup database".
+ */
+
+
+/**
+ * @addtogroup schemaapi
+ * @{
+ */
+
+/**
+ * Creates a new table from a Drupal table definition.
+ *
+ * @param $name
+ *   The name of the table to create.
+ * @param $table
+ *   A Schema API table definition array.
+ */
+function db_create_table($name, $table) {
+  return Database::getConnection()->schema()->createTable($name, $table);
+}
+
+/**
+ * Returns an array of field names from an array of key/index column specifiers.
+ *
+ * This is usually an identity function but if a key/index uses a column prefix
+ * specification, this function extracts just the name.
+ *
+ * @param $fields
+ *   An array of key/index column specifiers.
+ *
+ * @return
+ *   An array of field names.
+ */
+function db_field_names($fields) {
+  return Database::getConnection()->schema()->fieldNames($fields);
+}
+
+/**
+ * Checks if an index exists in the given table.
+ *
+ * @param $table
+ *   The name of the table in drupal (no prefixing).
+ * @param $name
+ *   The name of the index in drupal (no prefixing).
+ *
+ * @return
+ *   TRUE if the given index exists, otherwise FALSE.
+ */
+function db_index_exists($table, $name) {
+  return Database::getConnection()->schema()->indexExists($table, $name);
+}
+
+/**
+ * Checks if a table exists.
+ *
+ * @param $table
+ *   The name of the table in drupal (no prefixing).
+ *
+ * @return
+ *   TRUE if the given table exists, otherwise FALSE.
+ */
+function db_table_exists($table) {
+  return Database::getConnection()->schema()->tableExists($table);
+}
+
+/**
+ * Checks if a column exists in the given table.
+ *
+ * @param $table
+ *   The name of the table in drupal (no prefixing).
+ * @param $field
+ *   The name of the field.
+ *
+ * @return
+ *   TRUE if the given column exists, otherwise FALSE.
+ */
+function db_field_exists($table, $field) {
+  return Database::getConnection()->schema()->fieldExists($table, $field);
+}
+
+/**
+ * Finds all tables that are like the specified base table name.
+ *
+ * @param $table_expression
+ *   An SQL expression, for example "simpletest%" (without the quotes).
+ *   BEWARE: this is not prefixed, the caller should take care of that.
+ *
+ * @return
+ *   Array, both the keys and the values are the matching tables.
+ */
+function db_find_tables($table_expression) {
+  return Database::getConnection()->schema()->findTables($table_expression);
+}
+
+function _db_create_keys_sql($spec) {
+  return Database::getConnection()->schema()->createKeysSql($spec);
+}
+
+/**
+ * Renames a table.
+ *
+ * @param $table
+ *   The current name of the table to be renamed.
+ * @param $new_name
+ *   The new name for the table.
+ */
+function db_rename_table($table, $new_name) {
+  return Database::getConnection()->schema()->renameTable($table, $new_name);
+}
+
+/**
+ * Drops a table.
+ *
+ * @param $table
+ *   The table to be dropped.
+ */
+function db_drop_table($table) {
+  return Database::getConnection()->schema()->dropTable($table);
+}
+
+/**
+ * Adds a new field to a table.
+ *
+ * @param $table
+ *   Name of the table to be altered.
+ * @param $field
+ *   Name of the field to be added.
+ * @param $spec
+ *   The field specification array, as taken from a schema definition. The
+ *   specification may also contain the key 'initial'; the newly-created field
+ *   will be set to the value of the key in all rows. This is most useful for
+ *   creating NOT NULL columns with no default value in existing tables.
+ * @param $keys_new
+ *   Optional keys and indexes specification to be created on the table along
+ *   with adding the field. The format is the same as a table specification, but
+ *   without the 'fields' element. If you are adding a type 'serial' field, you
+ *   MUST specify at least one key or index including it in this array. See
+ *   db_change_field() for more explanation why.
+ *
+ * @see db_change_field()
+ */
+function db_add_field($table, $field, $spec, $keys_new = array()) {
+  return Database::getConnection()->schema()->addField($table, $field, $spec, $keys_new);
+}
+
+/**
+ * Drops a field.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $field
+ *   The field to be dropped.
+ */
+function db_drop_field($table, $field) {
+  return Database::getConnection()->schema()->dropField($table, $field);
+}
+
+/**
+ * Sets the default value for a field.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $field
+ *   The field to be altered.
+ * @param $default
+ *   Default value to be set. NULL for 'default NULL'.
+ */
+function db_field_set_default($table, $field, $default) {
+  return Database::getConnection()->schema()->fieldSetDefault($table, $field, $default);
+}
+
+/**
+ * Sets a field to have no default value.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $field
+ *   The field to be altered.
+ */
+function db_field_set_no_default($table, $field) {
+  return Database::getConnection()->schema()->fieldSetNoDefault($table, $field);
+}
+
+/**
+ * Adds a primary key to a database table.
+ *
+ * @param $table
+ *   Name of the table to be altered.
+ * @param $fields
+ *   Array of fields for the primary key.
+ */
+function db_add_primary_key($table, $fields) {
+  return Database::getConnection()->schema()->addPrimaryKey($table, $fields);
+}
+
+/**
+ * Drops the primary key of a database table.
+ *
+ * @param $table
+ *   Name of the table to be altered.
+ */
+function db_drop_primary_key($table) {
+  return Database::getConnection()->schema()->dropPrimaryKey($table);
+}
+
+/**
+ * Adds a unique key.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $name
+ *   The name of the key.
+ * @param $fields
+ *   An array of field names.
+ */
+function db_add_unique_key($table, $name, $fields) {
+  return Database::getConnection()->schema()->addUniqueKey($table, $name, $fields);
+}
+
+/**
+ * Drops a unique key.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $name
+ *   The name of the key.
+ */
+function db_drop_unique_key($table, $name) {
+  return Database::getConnection()->schema()->dropUniqueKey($table, $name);
+}
+
+/**
+ * Adds an index.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $name
+ *   The name of the index.
+ * @param $fields
+ *   An array of field names.
+ */
+function db_add_index($table, $name, $fields) {
+  return Database::getConnection()->schema()->addIndex($table, $name, $fields);
+}
+
+/**
+ * Drops an index.
+ *
+ * @param $table
+ *   The table to be altered.
+ * @param $name
+ *   The name of the index.
+ */
+function db_drop_index($table, $name) {
+  return Database::getConnection()->schema()->dropIndex($table, $name);
+}
+
+/**
+ * Changes a field definition.
+ *
+ * IMPORTANT NOTE: To maintain database portability, you have to explicitly
+ * recreate all indices and primary keys that are using the changed field.
+ *
+ * That means that you have to drop all affected keys and indexes with
+ * db_drop_{primary_key,unique_key,index}() before calling db_change_field().
+ * To recreate the keys and indices, pass the key definitions as the optional
+ * $keys_new argument directly to db_change_field().
+ *
+ * For example, suppose you have:
+ * @code
+ * $schema['foo'] = array(
+ *   'fields' => array(
+ *     'bar' => array('type' => 'int', 'not null' => TRUE)
+ *   ),
+ *   'primary key' => array('bar')
+ * );
+ * @endcode
+ * and you want to change foo.bar to be type serial, leaving it as the primary
+ * key. The correct sequence is:
+ * @code
+ * db_drop_primary_key('foo');
+ * db_change_field('foo', 'bar', 'bar',
+ *   array('type' => 'serial', 'not null' => TRUE),
+ *   array('primary key' => array('bar')));
+ * @endcode
+ *
+ * The reasons for this are due to the different database engines:
+ *
+ * On PostgreSQL, changing a field definition involves adding a new field and
+ * dropping an old one which causes any indices, primary keys and sequences
+ * (from serial-type fields) that use the changed field to be dropped.
+ *
+ * On MySQL, all type 'serial' fields must be part of at least one key or index
+ * as soon as they are created. You cannot use
+ * db_add_{primary_key,unique_key,index}() for this purpose because the ALTER
+ * TABLE command will fail to add the column without a key or index
+ * specification. The solution is to use the optional $keys_new argument to
+ * create the key or index at the same time as field.
+ *
+ * You could use db_add_{primary_key,unique_key,index}() in all cases unless you
+ * are converting a field to be type serial. You can use the $keys_new argument
+ * in all cases.
+ *
+ * @param $table
+ *   Name of the table.
+ * @param $field
+ *   Name of the field to change.
+ * @param $field_new
+ *   New name for the field (set to the same as $field if you don't want to
+ *   change the name).
+ * @param $spec
+ *   The field specification for the new field.
+ * @param $keys_new
+ *   Optional keys and indexes specification to be created on the table along
+ *   with changing the field. The format is the same as a table specification
+ *   but without the 'fields' element.
+ */
+function db_change_field($table, $field, $field_new, $spec, $keys_new = array()) {
+  return Database::getConnection()->schema()->changeField($table, $field, $field_new, $spec, $keys_new);
+}
+
+/**
+ * @} End of "addtogroup schemaapi".
+ */
+
+/**
+ * Sets a session variable specifying the lag time for ignoring a slave server.
+ */
+function db_ignore_slave() {
+  $connection_info = Database::getConnectionInfo();
+  // Only set ignore_slave_server if there are slave servers being used, which
+  // is assumed if there are more than one.
+  if (count($connection_info) > 1) {
+    // Five minutes is long enough to allow the slave to break and resume
+    // interrupted replication without causing problems on the Drupal site from
+    // the old data.
+    $duration = variable_get('maximum_replication_lag', 300);
+    // Set session variable with amount of time to delay before using slave.
+    $_SESSION['ignore_slave_server'] = REQUEST_TIME + $duration;
+  }
+}
diff --git a/htmltest/includes/database/log.inc b/htmltest/includes/database/log.inc
new file mode 100644
index 00000000..27eae62c
--- /dev/null
+++ b/htmltest/includes/database/log.inc
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * @file
+ * Logging classes for the database layer.
+ */
+
+/**
+ * Database query logger.
+ *
+ * We log queries in a separate object rather than in the connection object
+ * because we want to be able to see all queries sent to a given database, not
+ * database target. If we logged the queries in each connection object we
+ * would not be able to track what queries went to which target.
+ *
+ * Every connection has one and only one logging object on it for all targets
+ * and logging keys.
+ */
+class DatabaseLog {
+
+  /**
+   * Cache of logged queries. This will only be used if the query logger is enabled.
+   *
+   * The structure for the logging array is as follows:
+   *
+   * array(
+   *   $logging_key = array(
+   *     array(query => '', args => array(), caller => '', target => '', time => 0),
+   *     array(query => '', args => array(), caller => '', target => '', time => 0),
+   *   ),
+   * );
+   *
+   * @var array
+   */
+  protected $queryLog = array();
+
+  /**
+   * The connection key for which this object is logging.
+   *
+   * @var string
+   */
+  protected $connectionKey = 'default';
+
+  /**
+   * Constructor.
+   *
+   * @param $key
+   *   The database connection key for which to enable logging.
+   */
+  public function __construct($key = 'default') {
+    $this->connectionKey = $key;
+  }
+
+  /**
+   * Begin logging queries to the specified connection and logging key.
+   *
+   * If the specified logging key is already running this method does nothing.
+   *
+   * @param $logging_key
+   *   The identification key for this log request. By specifying different
+   *   logging keys we are able to start and stop multiple logging runs
+   *   simultaneously without them colliding.
+   */
+  public function start($logging_key) {
+    if (empty($this->queryLog[$logging_key])) {
+      $this->clear($logging_key);
+    }
+  }
+
+  /**
+   * Retrieve the query log for the specified logging key so far.
+   *
+   * @param $logging_key
+   *   The logging key to fetch.
+   * @return
+   *   An indexed array of all query records for this logging key.
+   */
+  public function get($logging_key) {
+    return $this->queryLog[$logging_key];
+  }
+
+  /**
+   * Empty the query log for the specified logging key.
+   *
+   * This method does not stop logging, it simply clears the log. To stop
+   * logging, use the end() method.
+   *
+   * @param $logging_key
+   *   The logging key to empty.
+   */
+  public function clear($logging_key) {
+    $this->queryLog[$logging_key] = array();
+  }
+
+  /**
+   * Stop logging for the specified logging key.
+   *
+   * @param $logging_key
+   *   The logging key to stop.
+   */
+  public function end($logging_key) {
+    unset($this->queryLog[$logging_key]);
+  }
+
+  /**
+   * Log a query to all active logging keys.
+   *
+   * @param $statement
+   *   The prepared statement object to log.
+   * @param $args
+   *   The arguments passed to the statement object.
+   * @param $time
+   *   The time in milliseconds the query took to execute.
+   */
+  public function log(DatabaseStatementInterface $statement, $args, $time) {
+    foreach (array_keys($this->queryLog) as $key) {
+      $this->queryLog[$key][] = array(
+        'query' => $statement->getQueryString(),
+        'args' => $args,
+        'target' => $statement->dbh->getTarget(),
+        'caller' => $this->findCaller(),
+        'time' => $time,
+      );
+    }
+  }
+
+  /**
+   * Determine the routine that called this query.
+   *
+   * We define "the routine that called this query" as the first entry in
+   * the call stack that is not inside includes/database and does have a file
+   * (which excludes call_user_func_array(), anonymous functions and similar).
+   * That makes the climbing logic very simple, and handles the variable stack
+   * depth caused by the query builders.
+   *
+   * @link http://www.php.net/debug_backtrace
+   * @return
+   *   This method returns a stack trace entry similar to that generated by
+   *   debug_backtrace(). However, it flattens the trace entry and the trace
+   *   entry before it so that we get the function and args of the function that
+   *   called into the database system, not the function and args of the
+   *   database call itself.
+   */
+  public function findCaller() {
+    $stack = debug_backtrace();
+    $stack_count = count($stack);
+    for ($i = 0; $i < $stack_count; ++$i) {
+      if (!empty($stack[$i]['file']) && strpos($stack[$i]['file'], 'includes' . DIRECTORY_SEPARATOR . 'database') === FALSE) {
+        $stack[$i] += array('args' => array());
+        return array(
+          'file' => $stack[$i]['file'],
+          'line' => $stack[$i]['line'],
+          'function' => $stack[$i + 1]['function'],
+          'class' => isset($stack[$i + 1]['class']) ? $stack[$i + 1]['class'] : NULL,
+          'type' => isset($stack[$i + 1]['type']) ? $stack[$i + 1]['type'] : NULL,
+          'args' => $stack[$i + 1]['args'],
+        );
+      }
+    }
+  }
+}
diff --git a/htmltest/includes/database/mysql/database.inc b/htmltest/includes/database/mysql/database.inc
new file mode 100644
index 00000000..00d81f47
--- /dev/null
+++ b/htmltest/includes/database/mysql/database.inc
@@ -0,0 +1,203 @@
+<?php
+
+/**
+ * @file
+ * Database interface code for MySQL database servers.
+ */
+
+/**
+ * @addtogroup database
+ * @{
+ */
+
+class DatabaseConnection_mysql extends DatabaseConnection {
+
+  /**
+   * Flag to indicate if the cleanup function in __destruct() should run.
+   *
+   * @var boolean
+   */
+  protected $needsCleanup = FALSE;
+
+  public function __construct(array $connection_options = array()) {
+    // This driver defaults to transaction support, except if explicitly passed FALSE.
+    $this->transactionSupport = !isset($connection_options['transactions']) || ($connection_options['transactions'] !== FALSE);
+
+    // MySQL never supports transactional DDL.
+    $this->transactionalDDLSupport = FALSE;
+
+    $this->connectionOptions = $connection_options;
+
+    // The DSN should use either a socket or a host/port.
+    if (isset($connection_options['unix_socket'])) {
+      $dsn = 'mysql:unix_socket=' . $connection_options['unix_socket'];
+    }
+    else {
+      // Default to TCP connection on port 3306.
+      $dsn = 'mysql:host=' . $connection_options['host'] . ';port=' . (empty($connection_options['port']) ? 3306 : $connection_options['port']);
+    }
+    $dsn .= ';dbname=' . $connection_options['database'];
+    // Allow PDO options to be overridden.
+    $connection_options += array(
+      'pdo' => array(),
+    );
+    $connection_options['pdo'] += array(
+      // So we don't have to mess around with cursors and unbuffered queries by default.
+      PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
+      // Because MySQL's prepared statements skip the query cache, because it's dumb.
+      PDO::ATTR_EMULATE_PREPARES => TRUE,
+    );
+
+    parent::__construct($dsn, $connection_options['username'], $connection_options['password'], $connection_options['pdo']);
+
+    // Force MySQL to use the UTF-8 character set. Also set the collation, if a
+    // certain one has been set; otherwise, MySQL defaults to 'utf8_general_ci'
+    // for UTF-8.
+    if (!empty($connection_options['collation'])) {
+      $this->exec('SET NAMES utf8 COLLATE ' . $connection_options['collation']);
+    }
+    else {
+      $this->exec('SET NAMES utf8');
+    }
+
+    // Set MySQL init_commands if not already defined.  Default Drupal's MySQL
+    // behavior to conform more closely to SQL standards.  This allows Drupal
+    // to run almost seamlessly on many different kinds of database systems.
+    // These settings force MySQL to behave the same as postgresql, or sqlite
+    // in regards to syntax interpretation and invalid data handling.  See
+    // http://drupal.org/node/344575 for further discussion. Also, as MySQL 5.5
+    // changed the meaning of TRADITIONAL we need to spell out the modes one by
+    // one.
+    $connection_options += array(
+      'init_commands' => array(),
+    );
+    $connection_options['init_commands'] += array(
+      'sql_mode' => "SET sql_mode = 'ANSI,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER'",
+    );
+    // Set connection options.
+    $this->exec(implode('; ', $connection_options['init_commands']));
+  }
+
+  public function __destruct() {
+    if ($this->needsCleanup) {
+      $this->nextIdDelete();
+    }
+  }
+
+  public function queryRange($query, $from, $count, array $args = array(), array $options = array()) {
+    return $this->query($query . ' LIMIT ' . (int) $from . ', ' . (int) $count, $args, $options);
+  }
+
+  public function queryTemporary($query, array $args = array(), array $options = array()) {
+    $tablename = $this->generateTemporaryTableName();
+    $this->query(preg_replace('/^SELECT/i', 'CREATE TEMPORARY TABLE {' . $tablename . '} Engine=MEMORY SELECT', $query), $args, $options);
+    return $tablename;
+  }
+
+  public function driver() {
+    return 'mysql';
+  }
+
+  public function databaseType() {
+    return 'mysql';
+  }
+
+  public function mapConditionOperator($operator) {
+    // We don't want to override any of the defaults.
+    return NULL;
+  }
+
+  public function nextId($existing_id = 0) {
+    $new_id = $this->query('INSERT INTO {sequences} () VALUES ()', array(), array('return' => Database::RETURN_INSERT_ID));
+    // This should only happen after an import or similar event.
+    if ($existing_id >= $new_id) {
+      // If we INSERT a value manually into the sequences table, on the next
+      // INSERT, MySQL will generate a larger value. However, there is no way
+      // of knowing whether this value already exists in the table. MySQL
+      // provides an INSERT IGNORE which would work, but that can mask problems
+      // other than duplicate keys. Instead, we use INSERT ... ON DUPLICATE KEY
+      // UPDATE in such a way that the UPDATE does not do anything. This way,
+      // duplicate keys do not generate errors but everything else does.
+      $this->query('INSERT INTO {sequences} (value) VALUES (:value) ON DUPLICATE KEY UPDATE value = value', array(':value' => $existing_id));
+      $new_id = $this->query('INSERT INTO {sequences} () VALUES ()', array(), array('return' => Database::RETURN_INSERT_ID));
+    }
+    $this->needsCleanup = TRUE;
+    return $new_id;
+  }
+
+  public function nextIdDelete() {
+    // While we want to clean up the table to keep it up from occupying too
+    // much storage and memory, we must keep the highest value in the table
+    // because InnoDB  uses an in-memory auto-increment counter as long as the
+    // server runs. When the server is stopped and restarted, InnoDB
+    // reinitializes the counter for each table for the first INSERT to the
+    // table based solely on values from the table so deleting all values would
+    // be a problem in this case. Also, TRUNCATE resets the auto increment
+    // counter.
+    try {
+      $max_id = $this->query('SELECT MAX(value) FROM {sequences}')->fetchField();
+      // We know we are using MySQL here, no need for the slower db_delete().
+      $this->query('DELETE FROM {sequences} WHERE value < :value', array(':value' => $max_id));
+    }
+    // During testing, this function is called from shutdown with the
+    // simpletest prefix stored in $this->connection, and those tables are gone
+    // by the time shutdown is called so we need to ignore the database
+    // errors. There is no problem with completely ignoring errors here: if
+    // these queries fail, the sequence will work just fine, just use a bit
+    // more database storage and memory.
+    catch (PDOException $e) {
+    }
+  }
+
+  /**
+   * Overridden to work around issues to MySQL not supporting transactional DDL.
+   */
+  protected function popCommittableTransactions() {
+    // Commit all the committable layers.
+    foreach (array_reverse($this->transactionLayers) as $name => $active) {
+      // Stop once we found an active transaction.
+      if ($active) {
+        break;
+      }
+
+      // If there are no more layers left then we should commit.
+      unset($this->transactionLayers[$name]);
+      if (empty($this->transactionLayers)) {
+        if (!PDO::commit()) {
+          throw new DatabaseTransactionCommitFailedException();
+        }
+      }
+      else {
+        // Attempt to release this savepoint in the standard way.
+        try {
+          $this->query('RELEASE SAVEPOINT ' . $name);
+        }
+        catch (PDOException $e) {
+          // However, in MySQL (InnoDB), savepoints are automatically committed
+          // when tables are altered or created (DDL transactions are not
+          // supported). This can cause exceptions due to trying to release
+          // savepoints which no longer exist.
+          //
+          // To avoid exceptions when no actual error has occurred, we silently
+          // succeed for MySQL error code 1305 ("SAVEPOINT does not exist").
+          if ($e->errorInfo[1] == '1305') {
+            // If one SAVEPOINT was released automatically, then all were.
+            // Therefore, clean the transaction stack.
+            $this->transactionLayers = array();
+            // We also have to explain to PDO that the transaction stack has
+            // been cleaned-up.
+            PDO::commit();
+          }
+          else {
+            throw $e;
+          }
+        }
+      }
+    }
+  }
+}
+
+
+/**
+ * @} End of "addtogroup database".
+ */
diff --git a/htmltest/includes/database/mysql/install.inc b/htmltest/includes/database/mysql/install.inc
new file mode 100644
index 00000000..75f2ae39
--- /dev/null
+++ b/htmltest/includes/database/mysql/install.inc
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Installation code for MySQL embedded database engine.
+ */
+
+/**
+ * Specifies installation tasks for MySQL and equivalent databases.
+ */
+class DatabaseTasks_mysql extends DatabaseTasks {
+  /**
+   * The PDO driver name for MySQL and equivalent databases.
+   *
+   * @var string
+   */
+  protected $pdoDriver = 'mysql';
+
+  /**
+   * Returns a human-readable name string for MySQL and equivalent databases.
+   */
+  public function name() {
+    return st('MySQL, MariaDB, or equivalent');
+  }
+
+  /**
+   * Returns the minimum version for MySQL.
+   */
+  public function minimumVersion() {
+    return '5.0.15';
+  }
+}
+
diff --git a/htmltest/includes/database/mysql/query.inc b/htmltest/includes/database/mysql/query.inc
new file mode 100644
index 00000000..d3d2d9ee
--- /dev/null
+++ b/htmltest/includes/database/mysql/query.inc
@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * @addtogroup database
+ * @{
+ */
+
+/**
+ * @file
+ * Query code for MySQL embedded database engine.
+ */
+
+
+class InsertQuery_mysql extends InsertQuery {
+
+  public function execute() {
+    if (!$this->preExecute()) {
+      return NULL;
+    }
+
+    // If we're selecting from a SelectQuery, finish building the query and
+    // pass it back, as any remaining options are irrelevant.
+    if (empty($this->fromQuery)) {
+      $max_placeholder = 0;
+      $values = array();
+      foreach ($this->insertValues as $insert_values) {
+        foreach ($insert_values as $value) {
+          $values[':db_insert_placeholder_' . $max_placeholder++] = $value;
+        }
+      }
+    }
+    else {
+      $values = $this->fromQuery->getArguments();
+    }
+
+    $last_insert_id = $this->connection->query((string) $this, $values, $this->queryOptions);
+
+    // Re-initialize the values array so that we can re-use this query.
+    $this->insertValues = array();
+
+    return $last_insert_id;
+  }
+
+  public function __toString() {
+    // Create a sanitized comment string to prepend to the query.
+    $comments = $this->connection->makeComment($this->comments);
+
+    // Default fields are always placed first for consistency.
+    $insert_fields = array_merge($this->defaultFields, $this->insertFields);
+
+    // If we're selecting from a SelectQuery, finish building the query and
+    // pass it back, as any remaining options are irrelevant.
+    if (!empty($this->fromQuery)) {
+      $insert_fields_string = $insert_fields ? ' (' . implode(', ', $insert_fields) . ') ' : ' ';
+      return $comments . 'INSERT INTO {' . $this->table . '}' . $insert_fields_string . $this->fromQuery;
+    }
+
+    $query = $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $insert_fields) . ') VALUES ';
+
+    $max_placeholder = 0;
+    $values = array();
+    if (count($this->insertValues)) {
+      foreach ($this->insertValues as $insert_values) {
+        $placeholders = array();
+
+        // Default fields aren't really placeholders, but this is the most convenient
+        // way to handle them.
+        $placeholders = array_pad($placeholders, count($this->defaultFields), 'default');
+
+        $new_placeholder = $max_placeholder + count($insert_values);
+        for ($i = $max_placeholder; $i < $new_placeholder; ++$i) {
+          $placeholders[] = ':db_insert_placeholder_' . $i;
+        }
+        $max_placeholder = $new_placeholder;
+        $values[] = '(' . implode(', ', $placeholders) . ')';
+      }
+    }
+    else {
+      // If there are no values, then this is a default-only query. We still need to handle that.
+      $placeholders = array_fill(0, count($this->defaultFields), 'default');
+      $values[] = '(' . implode(', ', $placeholders) . ')';
+    }
+
+    $query .= implode(', ', $values);
+
+    return $query;
+  }
+}
+
+class TruncateQuery_mysql extends TruncateQuery { }
+
+/**
+ * @} End of "addtogroup database".
+ */
diff --git a/htmltest/includes/database/mysql/schema.inc b/htmltest/includes/database/mysql/schema.inc
new file mode 100644
index 00000000..949cf4e8
--- /dev/null
+++ b/htmltest/includes/database/mysql/schema.inc
@@ -0,0 +1,536 @@
+<?php
+
+/**
+ * @file
+ * Database schema code for MySQL database servers.
+ */
+
+
+/**
+ * @addtogroup schemaapi
+ * @{
+ */
+
+class DatabaseSchema_mysql extends DatabaseSchema {
+
+  /**
+   * Maximum length of a table comment in MySQL.
+   */
+  const COMMENT_MAX_TABLE = 60;
+
+  /**
+   * Maximum length of a column comment in MySQL.
+   */
+  const COMMENT_MAX_COLUMN = 255;
+
+  /**
+   * Get information about the table and database name from the prefix.
+   *
+   * @return
+   *   A keyed array with information about the database, table name and prefix.
+   */
+  protected function getPrefixInfo($table = 'default', $add_prefix = TRUE) {
+    $info = array('prefix' => $this->connection->tablePrefix($table));
+    if ($add_prefix) {
+      $table = $info['prefix'] . $table;
+    }
+    if (($pos = strpos($table, '.')) !== FALSE) {
+      $info['database'] = substr($table, 0, $pos);
+      $info['table'] = substr($table, ++$pos);
+    }
+    else {
+      $db_info = Database::getConnectionInfo();
+      $info['database'] = $db_info['default']['database'];
+      $info['table'] = $table;
+    }
+    return $info;
+  }
+
+  /**
+   * Build a condition to match a table name against a standard information_schema.
+   *
+   * MySQL uses databases like schemas rather than catalogs so when we build
+   * a condition to query the information_schema.tables, we set the default
+   * database as the schema unless specified otherwise, and exclude table_catalog
+   * from the condition criteria.
+   */
+  protected function buildTableNameCondition($table_name, $operator = '=', $add_prefix = TRUE) {
+    $info = $this->connection->getConnectionOptions();
+
+    $table_info = $this->getPrefixInfo($table_name, $add_prefix);
+
+    $condition = new DatabaseCondition('AND');
+    $condition->condition('table_schema', $table_info['database']);
+    $condition->condition('table_name', $table_info['table'], $operator);
+    return $condition;
+  }
+
+  /**
+   * Generate SQL to create a new table from a Drupal schema definition.
+   *
+   * @param $name
+   *   The name of the table to create.
+   * @param $table
+   *   A Schema API table definition array.
+   * @return
+   *   An array of SQL statements to create the table.
+   */
+  protected function createTableSql($name, $table) {
+    $info = $this->connection->getConnectionOptions();
+
+    // Provide defaults if needed.
+    $table += array(
+      'mysql_engine' => 'InnoDB',
+      'mysql_character_set' => 'utf8',
+    );
+
+    $sql = "CREATE TABLE {" . $name . "} (\n";
+
+    // Add the SQL statement for each field.
+    foreach ($table['fields'] as $field_name => $field) {
+      $sql .= $this->createFieldSql($field_name, $this->processField($field)) . ", \n";
+    }
+
+    // Process keys & indexes.
+    $keys = $this->createKeysSql($table);
+    if (count($keys)) {
+      $sql .= implode(", \n", $keys) . ", \n";
+    }
+
+    // Remove the last comma and space.
+    $sql = substr($sql, 0, -3) . "\n) ";
+
+    $sql .= 'ENGINE = ' . $table['mysql_engine'] . ' DEFAULT CHARACTER SET ' . $table['mysql_character_set'];
+    // By default, MySQL uses the default collation for new tables, which is
+    // 'utf8_general_ci' for utf8. If an alternate collation has been set, it
+    // needs to be explicitly specified.
+    // @see DatabaseConnection_mysql
+    if (!empty($info['collation'])) {
+      $sql .= ' COLLATE ' . $info['collation'];
+    }
+
+    // Add table comment.
+    if (!empty($table['description'])) {
+      $sql .= ' COMMENT ' . $this->prepareComment($table['description'], self::COMMENT_MAX_TABLE);
+    }
+
+    return array($sql);
+  }
+
+  /**
+   * Create an SQL string for a field to be used in table creation or alteration.
+   *
+   * Before passing a field out of a schema definition into this function it has
+   * to be processed by _db_process_field().
+   *
+   * @param $name
+   *   Name of the field.
+   * @param $spec
+   *   The field specification, as per the schema data structure format.
+   */
+  protected function createFieldSql($name, $spec) {
+    $sql = "`" . $name . "` " . $spec['mysql_type'];
+
+    if (in_array($spec['mysql_type'], array('VARCHAR', 'CHAR', 'TINYTEXT', 'MEDIUMTEXT', 'LONGTEXT', 'TEXT'))) {
+      if (isset($spec['length'])) {
+        $sql .= '(' . $spec['length'] . ')';
+      }
+      if (!empty($spec['binary'])) {
+        $sql .= ' BINARY';
+      }
+    }
+    elseif (isset($spec['precision']) && isset($spec['scale'])) {
+      $sql .= '(' . $spec['precision'] . ', ' . $spec['scale'] . ')';
+    }
+
+    if (!empty($spec['unsigned'])) {
+      $sql .= ' unsigned';
+    }
+
+    if (isset($spec['not null'])) {
+      if ($spec['not null']) {
+        $sql .= ' NOT NULL';
+      }
+      else {
+        $sql .= ' NULL';
+      }
+    }
+
+    if (!empty($spec['auto_increment'])) {
+      $sql .= ' auto_increment';
+    }
+
+    // $spec['default'] can be NULL, so we explicitly check for the key here.
+    if (array_key_exists('default', $spec)) {
+      if (is_string($spec['default'])) {
+        $spec['default'] = "'" . $spec['default'] . "'";
+      }
+      elseif (!isset($spec['default'])) {
+        $spec['default'] = 'NULL';
+      }
+      $sql .= ' DEFAULT ' . $spec['default'];
+    }
+
+    if (empty($spec['not null']) && !isset($spec['default'])) {
+      $sql .= ' DEFAULT NULL';
+    }
+
+    // Add column comment.
+    if (!empty($spec['description'])) {
+      $sql .= ' COMMENT ' . $this->prepareComment($spec['description'], self::COMMENT_MAX_COLUMN);
+    }
+
+    return $sql;
+  }
+
+  /**
+   * Set database-engine specific properties for a field.
+   *
+   * @param $field
+   *   A field description array, as specified in the schema documentation.
+   */
+  protected function processField($field) {
+
+    if (!isset($field['size'])) {
+      $field['size'] = 'normal';
+    }
+
+    // Set the correct database-engine specific datatype.
+    // In case one is already provided, force it to uppercase.
+    if (isset($field['mysql_type'])) {
+      $field['mysql_type'] = drupal_strtoupper($field['mysql_type']);
+    }
+    else {
+      $map = $this->getFieldTypeMap();
+      $field['mysql_type'] = $map[$field['type'] . ':' . $field['size']];
+    }
+
+    if (isset($field['type']) && $field['type'] == 'serial') {
+      $field['auto_increment'] = TRUE;
+    }
+
+    return $field;
+  }
+
+  public function getFieldTypeMap() {
+    // Put :normal last so it gets preserved by array_flip. This makes
+    // it much easier for modules (such as schema.module) to map
+    // database types back into schema types.
+    // $map does not use drupal_static as its value never changes.
+    static $map = array(
+      'varchar:normal'  => 'VARCHAR',
+      'char:normal'     => 'CHAR',
+
+      'text:tiny'       => 'TINYTEXT',
+      'text:small'      => 'TINYTEXT',
+      'text:medium'     => 'MEDIUMTEXT',
+      'text:big'        => 'LONGTEXT',
+      'text:normal'     => 'TEXT',
+
+      'serial:tiny'     => 'TINYINT',
+      'serial:small'    => 'SMALLINT',
+      'serial:medium'   => 'MEDIUMINT',
+      'serial:big'      => 'BIGINT',
+      'serial:normal'   => 'INT',
+
+      'int:tiny'        => 'TINYINT',
+      'int:small'       => 'SMALLINT',
+      'int:medium'      => 'MEDIUMINT',
+      'int:big'         => 'BIGINT',
+      'int:normal'      => 'INT',
+
+      'float:tiny'      => 'FLOAT',
+      'float:small'     => 'FLOAT',
+      'float:medium'    => 'FLOAT',
+      'float:big'       => 'DOUBLE',
+      'float:normal'    => 'FLOAT',
+
+      'numeric:normal'  => 'DECIMAL',
+
+      'blob:big'        => 'LONGBLOB',
+      'blob:normal'     => 'BLOB',
+    );
+    return $map;
+  }
+
+  protected function createKeysSql($spec) {
+    $keys = array();
+
+    if (!empty($spec['primary key'])) {
+      $keys[] = 'PRIMARY KEY (' . $this->createKeysSqlHelper($spec['primary key']) . ')';
+    }
+    if (!empty($spec['unique keys'])) {
+      foreach ($spec['unique keys'] as $key => $fields) {
+        $keys[] = 'UNIQUE KEY `' . $key . '` (' . $this->createKeysSqlHelper($fields) . ')';
+      }
+    }
+    if (!empty($spec['indexes'])) {
+      foreach ($spec['indexes'] as $index => $fields) {
+        $keys[] = 'INDEX `' . $index . '` (' . $this->createKeysSqlHelper($fields) . ')';
+      }
+    }
+
+    return $keys;
+  }
+
+  protected function createKeySql($fields) {
+    $return = array();
+    foreach ($fields as $field) {
+      if (is_array($field)) {
+        $return[] = '`' . $field[0] . '`(' . $field[1] . ')';
+      }
+      else {
+        $return[] = '`' . $field . '`';
+      }
+    }
+    return implode(', ', $return);
+  }
+
+  protected function createKeysSqlHelper($fields) {
+    $return = array();
+    foreach ($fields as $field) {
+      if (is_array($field)) {
+        $return[] = '`' . $field[0] . '`(' . $field[1] . ')';
+      }
+      else {
+        $return[] = '`' . $field . '`';
+      }
+    }
+    return implode(', ', $return);
+  }
+
+  public function renameTable($table, $new_name) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot rename %table to %table_new: table %table doesn't exist.", array('%table' => $table, '%table_new' => $new_name)));
+    }
+    if ($this->tableExists($new_name)) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot rename %table to %table_new: table %table_new already exists.", array('%table' => $table, '%table_new' => $new_name)));
+    }
+
+    $info = $this->getPrefixInfo($new_name);
+    return $this->connection->query('ALTER TABLE {' . $table . '} RENAME TO `' . $info['table'] . '`');
+  }
+
+  public function dropTable($table) {
+    if (!$this->tableExists($table)) {
+      return FALSE;
+    }
+
+    $this->connection->query('DROP TABLE {' . $table . '}');
+    return TRUE;
+  }
+
+  public function addField($table, $field, $spec, $keys_new = array()) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add field %table.%field: table doesn't exist.", array('%field' => $field, '%table' => $table)));
+    }
+    if ($this->fieldExists($table, $field)) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot add field %table.%field: field already exists.", array('%field' => $field, '%table' => $table)));
+    }
+
+    $fixnull = FALSE;
+    if (!empty($spec['not null']) && !isset($spec['default'])) {
+      $fixnull = TRUE;
+      $spec['not null'] = FALSE;
+    }
+    $query = 'ALTER TABLE {' . $table . '} ADD ';
+    $query .= $this->createFieldSql($field, $this->processField($spec));
+    if ($keys_sql = $this->createKeysSql($keys_new)) {
+      $query .= ', ADD ' . implode(', ADD ', $keys_sql);
+    }
+    $this->connection->query($query);
+    if (isset($spec['initial'])) {
+      $this->connection->update($table)
+        ->fields(array($field => $spec['initial']))
+        ->execute();
+    }
+    if ($fixnull) {
+      $spec['not null'] = TRUE;
+      $this->changeField($table, $field, $field, $spec);
+    }
+  }
+
+  public function dropField($table, $field) {
+    if (!$this->fieldExists($table, $field)) {
+      return FALSE;
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} DROP `' . $field . '`');
+    return TRUE;
+  }
+
+  public function fieldSetDefault($table, $field, $default) {
+    if (!$this->fieldExists($table, $field)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot set default value of field %table.%field: field doesn't exist.", array('%table' => $table, '%field' => $field)));
+    }
+
+    if (!isset($default)) {
+      $default = 'NULL';
+    }
+    else {
+      $default = is_string($default) ? "'$default'" : $default;
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} ALTER COLUMN `' . $field . '` SET DEFAULT ' . $default);
+  }
+
+  public function fieldSetNoDefault($table, $field) {
+    if (!$this->fieldExists($table, $field)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot remove default value of field %table.%field: field doesn't exist.", array('%table' => $table, '%field' => $field)));
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} ALTER COLUMN `' . $field . '` DROP DEFAULT');
+  }
+
+  public function indexExists($table, $name) {
+    // Returns one row for each column in the index. Result is string or FALSE.
+    // Details at http://dev.mysql.com/doc/refman/5.0/en/show-index.html
+    $row = $this->connection->query('SHOW INDEX FROM {' . $table . "} WHERE key_name = '$name'")->fetchAssoc();
+    return isset($row['Key_name']);
+  }
+
+  public function addPrimaryKey($table, $fields) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add primary key to table %table: table doesn't exist.", array('%table' => $table)));
+    }
+    if ($this->indexExists($table, 'PRIMARY')) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot add primary key to table %table: primary key already exists.", array('%table' => $table)));
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} ADD PRIMARY KEY (' . $this->createKeySql($fields) . ')');
+  }
+
+  public function dropPrimaryKey($table) {
+    if (!$this->indexExists($table, 'PRIMARY')) {
+      return FALSE;
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} DROP PRIMARY KEY');
+    return TRUE;
+  }
+
+  public function addUniqueKey($table, $name, $fields) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add unique key %name to table %table: table doesn't exist.", array('%table' => $table, '%name' => $name)));
+    }
+    if ($this->indexExists($table, $name)) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot add unique key %name to table %table: unique key already exists.", array('%table' => $table, '%name' => $name)));
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} ADD UNIQUE KEY `' . $name . '` (' . $this->createKeySql($fields) . ')');
+  }
+
+  public function dropUniqueKey($table, $name) {
+    if (!$this->indexExists($table, $name)) {
+      return FALSE;
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} DROP KEY `' . $name . '`');
+    return TRUE;
+  }
+
+  public function addIndex($table, $name, $fields) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add index %name to table %table: table doesn't exist.", array('%table' => $table, '%name' => $name)));
+    }
+    if ($this->indexExists($table, $name)) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot add index %name to table %table: index already exists.", array('%table' => $table, '%name' => $name)));
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} ADD INDEX `' . $name . '` (' . $this->createKeySql($fields) . ')');
+  }
+
+  public function dropIndex($table, $name) {
+    if (!$this->indexExists($table, $name)) {
+      return FALSE;
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} DROP INDEX `' . $name . '`');
+    return TRUE;
+  }
+
+  public function changeField($table, $field, $field_new, $spec, $keys_new = array()) {
+    if (!$this->fieldExists($table, $field)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot change the definition of field %table.%name: field doesn't exist.", array('%table' => $table, '%name' => $field)));
+    }
+    if (($field != $field_new) && $this->fieldExists($table, $field_new)) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot rename field %table.%name to %name_new: target field already exists.", array('%table' => $table, '%name' => $field, '%name_new' => $field_new)));
+    }
+
+    $sql = 'ALTER TABLE {' . $table . '} CHANGE `' . $field . '` ' . $this->createFieldSql($field_new, $this->processField($spec));
+    if ($keys_sql = $this->createKeysSql($keys_new)) {
+      $sql .= ', ADD ' . implode(', ADD ', $keys_sql);
+    }
+    $this->connection->query($sql);
+  }
+
+  public function prepareComment($comment, $length = NULL) {
+    // Work around a bug in some versions of PDO, see http://bugs.php.net/bug.php?id=41125
+    $comment = str_replace("'", '’', $comment);
+
+    // Truncate comment to maximum comment length.
+    if (isset($length)) {
+      // Add table prefixes before truncating.
+      $comment = truncate_utf8($this->connection->prefixTables($comment), $length, TRUE, TRUE);
+    }
+
+    return $this->connection->quote($comment);
+  }
+
+  /**
+   * Retrieve a table or column comment.
+   */
+  public function getComment($table, $column = NULL) {
+    $condition = $this->buildTableNameCondition($table);
+    if (isset($column)) {
+      $condition->condition('column_name', $column);
+      $condition->compile($this->connection, $this);
+      // Don't use {} around information_schema.columns table.
+      return $this->connection->query("SELECT column_comment FROM information_schema.columns WHERE " . (string) $condition, $condition->arguments())->fetchField();
+    }
+    $condition->compile($this->connection, $this);
+    // Don't use {} around information_schema.tables table.
+    $comment = $this->connection->query("SELECT table_comment FROM information_schema.tables WHERE " . (string) $condition, $condition->arguments())->fetchField();
+    // Work-around for MySQL 5.0 bug http://bugs.mysql.com/bug.php?id=11379
+    return preg_replace('/; InnoDB free:.*$/', '', $comment);
+  }
+
+  public function tableExists($table) {
+    // The information_schema table is very slow to query under MySQL 5.0.
+    // Instead, we try to select from the table in question.  If it fails,
+    // the most likely reason is that it does not exist. That is dramatically
+    // faster than using information_schema.
+    // @link http://bugs.mysql.com/bug.php?id=19588
+    // @todo: This override should be removed once we require a version of MySQL
+    // that has that bug fixed.
+    try {
+      $this->connection->queryRange("SELECT 1 FROM {" . $table . "}", 0, 1);
+      return TRUE;
+    }
+    catch (Exception $e) {
+      return FALSE;
+    }
+  }
+
+  public function fieldExists($table, $column) {
+    // The information_schema table is very slow to query under MySQL 5.0.
+    // Instead, we try to select from the table and field in question. If it
+    // fails, the most likely reason is that it does not exist. That is
+    // dramatically faster than using information_schema.
+    // @link http://bugs.mysql.com/bug.php?id=19588
+    // @todo: This override should be removed once we require a version of MySQL
+    // that has that bug fixed.
+    try {
+      $this->connection->queryRange("SELECT $column FROM {" . $table . "}", 0, 1);
+      return TRUE;
+    }
+    catch (Exception $e) {
+      return FALSE;
+    }
+  }
+
+}
+
+/**
+ * @} End of "addtogroup schemaapi".
+ */
diff --git a/htmltest/includes/database/pgsql/database.inc b/htmltest/includes/database/pgsql/database.inc
new file mode 100644
index 00000000..00ed7990
--- /dev/null
+++ b/htmltest/includes/database/pgsql/database.inc
@@ -0,0 +1,223 @@
+<?php
+
+/**
+ * @file
+ * Database interface code for PostgreSQL database servers.
+ */
+
+/**
+ * @addtogroup database
+ * @{
+ */
+
+/**
+ * The name by which to obtain a lock for retrive the next insert id.
+ */
+define('POSTGRESQL_NEXTID_LOCK', 1000);
+
+class DatabaseConnection_pgsql extends DatabaseConnection {
+
+  public function __construct(array $connection_options = array()) {
+    // This driver defaults to transaction support, except if explicitly passed FALSE.
+    $this->transactionSupport = !isset($connection_options['transactions']) || ($connection_options['transactions'] !== FALSE);
+
+    // Transactional DDL is always available in PostgreSQL,
+    // but we'll only enable it if standard transactions are.
+    $this->transactionalDDLSupport = $this->transactionSupport;
+
+    // Default to TCP connection on port 5432.
+    if (empty($connection_options['port'])) {
+      $connection_options['port'] = 5432;
+    }
+
+    // PostgreSQL in trust mode doesn't require a password to be supplied.
+    if (empty($connection_options['password'])) {
+      $connection_options['password'] = NULL;
+    }
+    // If the password contains a backslash it is treated as an escape character
+    // http://bugs.php.net/bug.php?id=53217
+    // so backslashes in the password need to be doubled up.
+    // The bug was reported against pdo_pgsql 1.0.2, backslashes in passwords
+    // will break on this doubling up when the bug is fixed, so check the version
+    //elseif (phpversion('pdo_pgsql') < 'version_this_was_fixed_in') {
+    else {
+      $connection_options['password'] = str_replace('\\', '\\\\', $connection_options['password']);
+    }
+
+    $this->connectionOptions = $connection_options;
+
+    $dsn = 'pgsql:host=' . $connection_options['host'] . ' dbname=' . $connection_options['database'] . ' port=' . $connection_options['port'];
+
+    // Allow PDO options to be overridden.
+    $connection_options += array(
+      'pdo' => array(),
+    );
+    $connection_options['pdo'] += array(
+      // Prepared statements are most effective for performance when queries
+      // are recycled (used several times). However, if they are not re-used,
+      // prepared statements become ineffecient. Since most of Drupal's
+      // prepared queries are not re-used, it should be faster to emulate
+      // the preparation than to actually ready statements for re-use. If in
+      // doubt, reset to FALSE and measure performance.
+      PDO::ATTR_EMULATE_PREPARES => TRUE,
+      // Convert numeric values to strings when fetching.
+      PDO::ATTR_STRINGIFY_FETCHES => TRUE,
+    );
+    parent::__construct($dsn, $connection_options['username'], $connection_options['password'], $connection_options['pdo']);
+
+    // Force PostgreSQL to use the UTF-8 character set by default.
+    $this->exec("SET NAMES 'UTF8'");
+
+    // Execute PostgreSQL init_commands.
+    if (isset($connection_options['init_commands'])) {
+      $this->exec(implode('; ', $connection_options['init_commands']));
+    }
+  }
+
+  public function prepareQuery($query) {
+    // mapConditionOperator converts LIKE operations to ILIKE for consistency
+    // with MySQL. However, Postgres does not support ILIKE on bytea (blobs)
+    // fields.
+    // To make the ILIKE operator work, we type-cast bytea fields into text.
+    // @todo This workaround only affects bytea fields, but the involved field
+    //   types involved in the query are unknown, so there is no way to
+    //   conditionally execute this for affected queries only.
+    return parent::prepareQuery(preg_replace('/ ([^ ]+) +(I*LIKE|NOT +I*LIKE) /i', ' ${1}::text ${2} ', $query));
+  }
+
+  public function query($query, array $args = array(), $options = array()) {
+
+    $options += $this->defaultOptions();
+
+    // The PDO PostgreSQL driver has a bug which
+    // doesn't type cast booleans correctly when
+    // parameters are bound using associative
+    // arrays.
+    // See http://bugs.php.net/bug.php?id=48383
+    foreach ($args as &$value) {
+      if (is_bool($value)) {
+        $value = (int) $value;
+      }
+    }
+
+    try {
+      if ($query instanceof DatabaseStatementInterface) {
+        $stmt = $query;
+        $stmt->execute(NULL, $options);
+      }
+      else {
+        $this->expandArguments($query, $args);
+        $stmt = $this->prepareQuery($query);
+        $stmt->execute($args, $options);
+      }
+
+      switch ($options['return']) {
+        case Database::RETURN_STATEMENT:
+          return $stmt;
+        case Database::RETURN_AFFECTED:
+          return $stmt->rowCount();
+        case Database::RETURN_INSERT_ID:
+          return $this->lastInsertId($options['sequence_name']);
+        case Database::RETURN_NULL:
+          return;
+        default:
+          throw new PDOException('Invalid return directive: ' . $options['return']);
+      }
+    }
+    catch (PDOException $e) {
+      if ($options['throw_exception']) {
+        // Add additional debug information.
+        if ($query instanceof DatabaseStatementInterface) {
+          $e->query_string = $stmt->getQueryString();
+        }
+        else {
+          $e->query_string = $query;
+        }
+        $e->args = $args;
+        throw $e;
+      }
+      return NULL;
+    }
+  }
+
+  public function queryRange($query, $from, $count, array $args = array(), array $options = array()) {
+    return $this->query($query . ' LIMIT ' . (int) $count . ' OFFSET ' . (int) $from, $args, $options);
+  }
+
+  public function queryTemporary($query, array $args = array(), array $options = array()) {
+    $tablename = $this->generateTemporaryTableName();
+    $this->query(preg_replace('/^SELECT/i', 'CREATE TEMPORARY TABLE {' . $tablename . '} AS SELECT', $query), $args, $options);
+    return $tablename;
+  }
+
+  public function driver() {
+    return 'pgsql';
+  }
+
+  public function databaseType() {
+    return 'pgsql';
+  }
+
+  public function mapConditionOperator($operator) {
+    static $specials;
+
+    // Function calls not allowed in static declarations, thus this method.
+    if (!isset($specials)) {
+      $specials = array(
+        // In PostgreSQL, 'LIKE' is case-sensitive. For case-insensitive LIKE
+        // statements, we need to use ILIKE instead.
+        'LIKE' => array('operator' => 'ILIKE'),
+        'NOT LIKE' => array('operator' => 'NOT ILIKE'),
+      );
+    }
+
+    return isset($specials[$operator]) ? $specials[$operator] : NULL;
+  }
+
+  /**
+   * Retrive a the next id in a sequence.
+   *
+   * PostgreSQL has built in sequences. We'll use these instead of inserting
+   * and updating a sequences table.
+   */
+  public function nextId($existing = 0) {
+
+    // Retrive the name of the sequence. This information cannot be cached
+    // because the prefix may change, for example, like it does in simpletests.
+    $sequence_name = $this->makeSequenceName('sequences', 'value');
+
+    // When PostgreSQL gets a value too small then it will lock the table,
+    // retry the INSERT and if it's still too small then alter the sequence.
+    $id = $this->query("SELECT nextval('" . $sequence_name . "')")->fetchField();
+    if ($id > $existing) {
+      return $id;
+    }
+
+    // PostgreSQL advisory locks are simply locks to be used by an
+    // application such as Drupal. This will prevent other Drupal proccesses
+    // from altering the sequence while we are.
+    $this->query("SELECT pg_advisory_lock(" . POSTGRESQL_NEXTID_LOCK . ")");
+
+    // While waiting to obtain the lock, the sequence may have been altered
+    // so lets try again to obtain an adequate value.
+    $id = $this->query("SELECT nextval('" . $sequence_name . "')")->fetchField();
+    if ($id > $existing) {
+      $this->query("SELECT pg_advisory_unlock(" . POSTGRESQL_NEXTID_LOCK . ")");
+      return $id;
+    }
+
+    // Reset the sequence to a higher value than the existing id.
+    $this->query("ALTER SEQUENCE " . $sequence_name . " RESTART WITH " . ($existing + 1));
+
+    // Retrive the next id. We know this will be as high as we want it.
+    $id = $this->query("SELECT nextval('" . $sequence_name . "')")->fetchField();
+
+    $this->query("SELECT pg_advisory_unlock(" . POSTGRESQL_NEXTID_LOCK . ")");
+
+    return $id;
+  }
+}
+
+/**
+ * @} End of "addtogroup database".
+ */
diff --git a/htmltest/includes/database/pgsql/install.inc b/htmltest/includes/database/pgsql/install.inc
new file mode 100644
index 00000000..c77f4ea7
--- /dev/null
+++ b/htmltest/includes/database/pgsql/install.inc
@@ -0,0 +1,197 @@
+<?php
+
+/**
+ * @file
+ * Install functions for PostgreSQL embedded database engine.
+ */
+
+
+// PostgreSQL specific install functions
+
+class DatabaseTasks_pgsql extends DatabaseTasks {
+  protected $pdoDriver = 'pgsql';
+
+  public function __construct() {
+    $this->tasks[] = array(
+      'function' => 'checkEncoding',
+      'arguments' => array(),
+    );
+    $this->tasks[] = array(
+      'function' => 'checkPHPVersion',
+      'arguments' => array(),
+    );
+    $this->tasks[] = array(
+      'function' => 'checkBinaryOutput',
+      'arguments' => array(),
+    );
+    $this->tasks[] = array(
+      'function' => 'initializeDatabase',
+      'arguments' => array(),
+    );
+  }
+
+  public function name() {
+    return st('PostgreSQL');
+  }
+
+  public function minimumVersion() {
+    return '8.3';
+  }
+
+  /**
+   * Check encoding is UTF8.
+   */
+  protected function checkEncoding() {
+    try {
+      if (db_query('SHOW server_encoding')->fetchField() == 'UTF8') {
+        $this->pass(st('Database is encoded in UTF-8'));
+      }
+      else {
+        $replacements = array(
+          '%encoding' => 'UTF8',
+          '%driver' => $this->name(),
+          '!link' => '<a href="INSTALL.pgsql.txt">INSTALL.pgsql.txt</a>'
+        );
+        $text  = 'The %driver database must use %encoding encoding to work with Drupal.';
+        $text .= 'Recreate the database with %encoding encoding. See !link for more details.';
+        $this->fail(st($text, $replacements));
+      }
+    }
+    catch (Exception $e) {
+      $this->fail(st('Drupal could not determine the encoding of the database was set to UTF-8'));
+    }
+  }
+
+  /**
+   * Check PHP version.
+   *
+   * There are two bugs in PDO_pgsql affecting Drupal:
+   *
+   * - in versions < 5.2.7, PDO_pgsql refuses to insert an empty string into
+   *   a NOT NULL BLOB column. See: http://bugs.php.net/bug.php?id=46249
+   * - in versions < 5.2.11 and < 5.3.1 that prevents inserting integer values
+   *   into numeric columns that exceed the PHP_INT_MAX value.
+   *   See: http://bugs.php.net/bug.php?id=48924
+   */
+  function checkPHPVersion() {
+    if (!version_compare(PHP_VERSION, '5.2.11', '>=') || (version_compare(PHP_VERSION, '5.3.0', '>=') && !version_compare(PHP_VERSION, '5.3.1', '>='))) {
+      $this->fail(st('The version of PHP you are using has known issues with PostgreSQL. You need to upgrade PHP to 5.2.11, 5.3.1 or greater.'));
+    };
+  }
+
+  /**
+   * Check Binary Output.
+   *
+   * Unserializing does not work on Postgresql 9 when bytea_output is 'hex'.
+   */
+  function checkBinaryOutput() {
+    // PostgreSQL < 9 doesn't support bytea_output, so verify we are running
+    // at least PostgreSQL 9.
+    $database_connection = Database::getConnection();
+    if (version_compare($database_connection->version(), '9') >= 0) {
+      if (!$this->checkBinaryOutputSuccess()) {
+        // First try to alter the database. If it fails, raise an error telling
+        // the user to do it themselves.
+        $connection_options = $database_connection->getConnectionOptions();
+        // It is safe to include the database name directly here, because this
+        // code is only called when a connection to the database is already
+        // established, thus the database name is guaranteed to be a correct
+        // value.
+        $query = "ALTER DATABASE \"" . $connection_options['database'] . "\" SET bytea_output = 'escape';";
+        try {
+          db_query($query);
+        }
+        catch (Exception $e) {
+          // Ignore possible errors when the user doesn't have the necessary
+          // privileges to ALTER the database.
+        }
+
+        // Close the database connection so that the configuration parameter
+        // is applied to the current connection.
+        db_close();
+
+        // Recheck, if it fails, finally just rely on the end user to do the
+        // right thing.
+        if (!$this->checkBinaryOutputSuccess()) {
+          $replacements = array(
+            '%setting' => 'bytea_output',
+            '%current_value' => 'hex',
+            '%needed_value' => 'escape',
+            '!query' => "<code>" . $query . "</code>",
+          );
+          $this->fail(st("The %setting setting is currently set to '%current_value', but needs to be '%needed_value'. Change this by running the following query: !query", $replacements));
+        }
+      }
+    }
+  }
+
+  /**
+   * Verify that a binary data roundtrip returns the original string.
+   */
+  protected function checkBinaryOutputSuccess() {
+    $bytea_output = db_query("SELECT 'encoding'::bytea AS output")->fetchField();
+    return ($bytea_output == 'encoding');
+  }
+
+  /**
+   * Make PostgreSQL Drupal friendly.
+   */
+  function initializeDatabase() {
+    // We create some functions using global names instead of prefixing them
+    // like we do with table names. This is so that we don't double up if more
+    // than one instance of Drupal is running on a single database. We therefore
+    // avoid trying to create them again in that case.
+
+    try {
+      // Create functions.
+      db_query('CREATE OR REPLACE FUNCTION "greatest"(numeric, numeric) RETURNS numeric AS
+        \'SELECT CASE WHEN (($1 > $2) OR ($2 IS NULL)) THEN $1 ELSE $2 END;\'
+        LANGUAGE \'sql\''
+      );
+      db_query('CREATE OR REPLACE FUNCTION "greatest"(numeric, numeric, numeric) RETURNS numeric AS
+        \'SELECT greatest($1, greatest($2, $3));\'
+        LANGUAGE \'sql\''
+      );
+      // Don't use {} around pg_proc table.
+      if (!db_query("SELECT COUNT(*) FROM pg_proc WHERE proname = 'rand'")->fetchField()) {
+        db_query('CREATE OR REPLACE FUNCTION "rand"() RETURNS float AS
+          \'SELECT random();\'
+          LANGUAGE \'sql\''
+        );
+      }
+
+      db_query('CREATE OR REPLACE FUNCTION "substring_index"(text, text, integer) RETURNS text AS
+        \'SELECT array_to_string((string_to_array($1, $2)) [1:$3], $2);\'
+        LANGUAGE \'sql\''
+      );
+
+      // Using || to concatenate in Drupal is not recommeneded because there are
+      // database drivers for Drupal that do not support the syntax, however
+      // they do support CONCAT(item1, item2) which we can replicate in
+      // PostgreSQL. PostgreSQL requires the function to be defined for each
+      // different argument variation the function can handle.
+      db_query('CREATE OR REPLACE FUNCTION "concat"(anynonarray, anynonarray) RETURNS text AS
+        \'SELECT CAST($1 AS text) || CAST($2 AS text);\'
+        LANGUAGE \'sql\'
+      ');
+      db_query('CREATE OR REPLACE FUNCTION "concat"(text, anynonarray) RETURNS text AS
+        \'SELECT $1 || CAST($2 AS text);\'
+        LANGUAGE \'sql\'
+      ');
+      db_query('CREATE OR REPLACE FUNCTION "concat"(anynonarray, text) RETURNS text AS
+        \'SELECT CAST($1 AS text) || $2;\'
+        LANGUAGE \'sql\'
+      ');
+      db_query('CREATE OR REPLACE FUNCTION "concat"(text, text) RETURNS text AS
+        \'SELECT $1 || $2;\'
+        LANGUAGE \'sql\'
+      ');
+
+      $this->pass(st('PostgreSQL has initialized itself.'));
+    }
+    catch (Exception $e) {
+      $this->fail(st('Drupal could not be correctly setup with the existing database. Revise any errors.'));
+    }
+  }
+}
+
diff --git a/htmltest/includes/database/pgsql/query.inc b/htmltest/includes/database/pgsql/query.inc
new file mode 100644
index 00000000..9902b164
--- /dev/null
+++ b/htmltest/includes/database/pgsql/query.inc
@@ -0,0 +1,210 @@
+<?php
+
+/**
+ * @ingroup database
+ * @{
+ */
+
+/**
+ * @file
+ * Query code for PostgreSQL embedded database engine.
+ */
+
+
+class InsertQuery_pgsql extends InsertQuery {
+
+  public function execute() {
+    if (!$this->preExecute()) {
+      return NULL;
+    }
+
+    $stmt = $this->connection->prepareQuery((string) $this);
+
+    // Fetch the list of blobs and sequences used on that table.
+    $table_information = $this->connection->schema()->queryTableInformation($this->table);
+
+    $max_placeholder = 0;
+    $blobs = array();
+    $blob_count = 0;
+    foreach ($this->insertValues as $insert_values) {
+      foreach ($this->insertFields as $idx => $field) {
+        if (isset($table_information->blob_fields[$field])) {
+          $blobs[$blob_count] = fopen('php://memory', 'a');
+          fwrite($blobs[$blob_count], $insert_values[$idx]);
+          rewind($blobs[$blob_count]);
+
+          $stmt->bindParam(':db_insert_placeholder_' . $max_placeholder++, $blobs[$blob_count], PDO::PARAM_LOB);
+
+          // Pre-increment is faster in PHP than increment.
+          ++$blob_count;
+        }
+        else {
+          $stmt->bindParam(':db_insert_placeholder_' . $max_placeholder++, $insert_values[$idx]);
+        }
+      }
+      // Check if values for a serial field has been passed.
+      if (!empty($table_information->serial_fields)) {
+        foreach ($table_information->serial_fields as $index => $serial_field) {
+          $serial_key = array_search($serial_field, $this->insertFields);
+          if ($serial_key !== FALSE) {
+            $serial_value = $insert_values[$serial_key];
+
+            // Force $last_insert_id to the specified value. This is only done
+            // if $index is 0.
+            if ($index == 0) {
+              $last_insert_id = $serial_value;
+            }
+            // Set the sequence to the bigger value of either the passed
+            // value or the max value of the column. It can happen that another
+            // thread calls nextval() which could lead to a serial number being
+            // used twice. However, trying to insert a value into a serial
+            // column should only be done in very rare cases and is not thread
+            // safe by definition.
+            $this->connection->query("SELECT setval('" . $table_information->sequences[$index] . "', GREATEST(MAX(" . $serial_field . "), :serial_value)) FROM {" . $this->table . "}", array(':serial_value' => (int)$serial_value));
+          }
+        }
+      }
+    }
+    if (!empty($this->fromQuery)) {
+      // bindParam stores only a reference to the variable that is followed when
+      // the statement is executed. We pass $arguments[$key] instead of $value
+      // because the second argument to bindParam is passed by reference and
+      // the foreach statement assigns the element to the existing reference.
+      $arguments = $this->fromQuery->getArguments();
+      foreach ($arguments as $key => $value) {
+        $stmt->bindParam($key, $arguments[$key]);
+      }
+    }
+
+    // PostgreSQL requires the table name to be specified explicitly
+    // when requesting the last insert ID, so we pass that in via
+    // the options array.
+    $options = $this->queryOptions;
+
+    if (!empty($table_information->sequences)) {
+      $options['sequence_name'] = $table_information->sequences[0];
+    }
+    // If there are no sequences then we can't get a last insert id.
+    elseif ($options['return'] == Database::RETURN_INSERT_ID) {
+      $options['return'] = Database::RETURN_NULL;
+    }
+    // Only use the returned last_insert_id if it is not already set.
+    if (!empty($last_insert_id)) {
+      $this->connection->query($stmt, array(), $options);
+    }
+    else {
+      $last_insert_id = $this->connection->query($stmt, array(), $options);
+    }
+
+    // Re-initialize the values array so that we can re-use this query.
+    $this->insertValues = array();
+
+    return $last_insert_id;
+  }
+
+  public function __toString() {
+    // Create a sanitized comment string to prepend to the query.
+    $comments = $this->connection->makeComment($this->comments);
+
+    // Default fields are always placed first for consistency.
+    $insert_fields = array_merge($this->defaultFields, $this->insertFields);
+
+    // If we're selecting from a SelectQuery, finish building the query and
+    // pass it back, as any remaining options are irrelevant.
+    if (!empty($this->fromQuery)) {
+      $insert_fields_string = $insert_fields ? ' (' . implode(', ', $insert_fields) . ') ' : ' ';
+      return $comments . 'INSERT INTO {' . $this->table . '}' . $insert_fields_string . $this->fromQuery;
+    }
+
+    $query = $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $insert_fields) . ') VALUES ';
+
+    $max_placeholder = 0;
+    $values = array();
+      if (count($this->insertValues)) {
+      foreach ($this->insertValues as $insert_values) {
+        $placeholders = array();
+
+        // Default fields aren't really placeholders, but this is the most convenient
+        // way to handle them.
+        $placeholders = array_pad($placeholders, count($this->defaultFields), 'default');
+
+        $new_placeholder = $max_placeholder + count($insert_values);
+        for ($i = $max_placeholder; $i < $new_placeholder; ++$i) {
+          $placeholders[] = ':db_insert_placeholder_' . $i;
+        }
+        $max_placeholder = $new_placeholder;
+        $values[] = '(' . implode(', ', $placeholders) . ')';
+      }
+    }
+    else {
+      // If there are no values, then this is a default-only query. We still need to handle that.
+      $placeholders = array_fill(0, count($this->defaultFields), 'default');
+      $values[] = '(' . implode(', ', $placeholders) . ')';
+    }
+
+    $query .= implode(', ', $values);
+
+    return $query;
+  }
+}
+
+class UpdateQuery_pgsql extends UpdateQuery {
+  public function execute() {
+    $max_placeholder = 0;
+    $blobs = array();
+    $blob_count = 0;
+
+    // Because we filter $fields the same way here and in __toString(), the
+    // placeholders will all match up properly.
+    $stmt = $this->connection->prepareQuery((string) $this);
+
+    // Fetch the list of blobs and sequences used on that table.
+    $table_information = $this->connection->schema()->queryTableInformation($this->table);
+
+    // Expressions take priority over literal fields, so we process those first
+    // and remove any literal fields that conflict.
+    $fields = $this->fields;
+    $expression_fields = array();
+    foreach ($this->expressionFields as $field => $data) {
+      if (!empty($data['arguments'])) {
+        foreach ($data['arguments'] as $placeholder => $argument) {
+          // We assume that an expression will never happen on a BLOB field,
+          // which is a fairly safe assumption to make since in most cases
+          // it would be an invalid query anyway.
+          $stmt->bindParam($placeholder, $data['arguments'][$placeholder]);
+        }
+      }
+      unset($fields[$field]);
+    }
+
+    foreach ($fields as $field => $value) {
+      $placeholder = ':db_update_placeholder_' . ($max_placeholder++);
+
+      if (isset($table_information->blob_fields[$field])) {
+        $blobs[$blob_count] = fopen('php://memory', 'a');
+        fwrite($blobs[$blob_count], $value);
+        rewind($blobs[$blob_count]);
+        $stmt->bindParam($placeholder, $blobs[$blob_count], PDO::PARAM_LOB);
+        ++$blob_count;
+      }
+      else {
+        $stmt->bindParam($placeholder, $fields[$field]);
+      }
+    }
+
+    if (count($this->condition)) {
+      $this->condition->compile($this->connection, $this);
+
+      $arguments = $this->condition->arguments();
+      foreach ($arguments as $placeholder => $value) {
+        $stmt->bindParam($placeholder, $arguments[$placeholder]);
+      }
+    }
+
+    $options = $this->queryOptions;
+    $options['already_prepared'] = TRUE;
+    $this->connection->query($stmt, $options);
+
+    return $stmt->rowCount();
+  }
+}
diff --git a/htmltest/includes/database/pgsql/schema.inc b/htmltest/includes/database/pgsql/schema.inc
new file mode 100644
index 00000000..49adbf90
--- /dev/null
+++ b/htmltest/includes/database/pgsql/schema.inc
@@ -0,0 +1,617 @@
+<?php
+
+/**
+ * @file
+ * Database schema code for PostgreSQL database servers.
+ */
+
+/**
+ * @ingroup schemaapi
+ * @{
+ */
+
+class DatabaseSchema_pgsql extends DatabaseSchema {
+
+  /**
+   * A cache of information about blob columns and sequences of tables.
+   *
+   * This is collected by DatabaseConnection_pgsql->queryTableInformation(),
+   * by introspecting the database.
+   *
+   * @see DatabaseConnection_pgsql->queryTableInformation()
+   * @var array
+   */
+  protected $tableInformation = array();
+
+  /**
+   * Fetch the list of blobs and sequences used on a table.
+   *
+   * We introspect the database to collect the information required by insert
+   * and update queries.
+   *
+   * @param $table_name
+   *   The non-prefixed name of the table.
+   * @return
+   *   An object with two member variables:
+   *     - 'blob_fields' that lists all the blob fields in the table.
+   *     - 'sequences' that lists the sequences used in that table.
+   */
+  public function queryTableInformation($table) {
+    // Generate a key to reference this table's information on.
+    $key = $this->connection->prefixTables('{' . $table . '}');
+    if (!strpos($key, '.')) {
+      $key = 'public.' . $key;
+    }
+
+    if (!isset($this->tableInformation[$key])) {
+      // Split the key into schema and table for querying.
+      list($schema, $table_name) = explode('.', $key);
+      $table_information = (object) array(
+        'blob_fields' => array(),
+        'sequences' => array(),
+      );
+      // Don't use {} around information_schema.columns table.
+      $result = $this->connection->query("SELECT column_name, data_type, column_default FROM information_schema.columns WHERE table_schema = :schema AND table_name = :table AND (data_type = 'bytea' OR (numeric_precision IS NOT NULL AND column_default LIKE :default))", array(
+        ':schema' => $schema,
+        ':table' => $table_name,
+        ':default' => '%nextval%',
+      ));
+      foreach ($result as $column) {
+        if ($column->data_type == 'bytea') {
+          $table_information->blob_fields[$column->column_name] = TRUE;
+        }
+        elseif (preg_match("/nextval\('([^']+)'/", $column->column_default, $matches)) {
+          // We must know of any sequences in the table structure to help us
+          // return the last insert id. If there is more than 1 sequences the
+          // first one (index 0 of the sequences array) will be used.
+          $table_information->sequences[] = $matches[1];
+          $table_information->serial_fields[] = $column->column_name;
+        }
+      }
+      $this->tableInformation[$key] = $table_information;
+    }
+    return $this->tableInformation[$key];
+  }
+
+  /**
+   * Fetch the list of CHECK constraints used on a field.
+   *
+   * We introspect the database to collect the information required by field
+   * alteration.
+   *
+   * @param $table
+   *   The non-prefixed name of the table.
+   * @param $field
+   *   The name of the field.
+   * @return
+   *   An array of all the checks for the field.
+   */
+  public function queryFieldInformation($table, $field) {
+    $prefixInfo = $this->getPrefixInfo($table, TRUE);
+
+    // Split the key into schema and table for querying.
+    $schema = $prefixInfo['schema'];
+    $table_name = $prefixInfo['table'];
+
+    $field_information = (object) array(
+        'checks' => array(),
+    );
+    $checks = $this->connection->query("SELECT conname FROM pg_class cl INNER JOIN pg_constraint co ON co.conrelid = cl.oid INNER JOIN pg_attribute attr ON attr.attrelid = cl.oid AND attr.attnum = ANY (co.conkey) INNER JOIN pg_namespace ns ON cl.relnamespace = ns.oid WHERE co.contype = 'c' AND ns.nspname = :schema AND cl.relname = :table AND attr.attname = :column", array(
+      ':schema' => $schema,
+      ':table' => $table_name,
+      ':column' => $field,
+    ));
+    $field_information = $checks->fetchCol();
+
+    return $field_information;
+  }
+
+  /**
+   * Generate SQL to create a new table from a Drupal schema definition.
+   *
+   * @param $name
+   *   The name of the table to create.
+   * @param $table
+   *   A Schema API table definition array.
+   * @return
+   *   An array of SQL statements to create the table.
+   */
+  protected function createTableSql($name, $table) {
+    $sql_fields = array();
+    foreach ($table['fields'] as $field_name => $field) {
+      $sql_fields[] = $this->createFieldSql($field_name, $this->processField($field));
+    }
+
+    $sql_keys = array();
+    if (isset($table['primary key']) && is_array($table['primary key'])) {
+      $sql_keys[] = 'PRIMARY KEY (' . implode(', ', $table['primary key']) . ')';
+    }
+    if (isset($table['unique keys']) && is_array($table['unique keys'])) {
+      foreach ($table['unique keys'] as $key_name => $key) {
+        $sql_keys[] = 'CONSTRAINT ' . $this->prefixNonTable($name, $key_name, 'key') . ' UNIQUE (' . implode(', ', $key) . ')';
+      }
+    }
+
+    $sql = "CREATE TABLE {" . $name . "} (\n\t";
+    $sql .= implode(",\n\t", $sql_fields);
+    if (count($sql_keys) > 0) {
+      $sql .= ",\n\t";
+    }
+    $sql .= implode(",\n\t", $sql_keys);
+    $sql .= "\n)";
+    $statements[] = $sql;
+
+    if (isset($table['indexes']) && is_array($table['indexes'])) {
+      foreach ($table['indexes'] as $key_name => $key) {
+        $statements[] = $this->_createIndexSql($name, $key_name, $key);
+      }
+    }
+
+    // Add table comment.
+    if (!empty($table['description'])) {
+      $statements[] = 'COMMENT ON TABLE {' . $name . '} IS ' . $this->prepareComment($table['description']);
+    }
+
+    // Add column comments.
+    foreach ($table['fields'] as $field_name => $field) {
+      if (!empty($field['description'])) {
+        $statements[] = 'COMMENT ON COLUMN {' . $name . '}.' . $field_name . ' IS ' . $this->prepareComment($field['description']);
+      }
+    }
+
+    return $statements;
+  }
+
+  /**
+   * Create an SQL string for a field to be used in table creation or
+   * alteration.
+   *
+   * Before passing a field out of a schema definition into this
+   * function it has to be processed by _db_process_field().
+   *
+   * @param $name
+   *    Name of the field.
+   * @param $spec
+   *    The field specification, as per the schema data structure format.
+   */
+  protected function createFieldSql($name, $spec) {
+    $sql = $name . ' ' . $spec['pgsql_type'];
+
+    if (isset($spec['type']) && $spec['type'] == 'serial') {
+      unset($spec['not null']);
+    }
+
+    if (in_array($spec['pgsql_type'], array('varchar', 'character', 'text')) && isset($spec['length'])) {
+      $sql .= '(' . $spec['length'] . ')';
+    }
+    elseif (isset($spec['precision']) && isset($spec['scale'])) {
+      $sql .= '(' . $spec['precision'] . ', ' . $spec['scale'] . ')';
+    }
+
+    if (!empty($spec['unsigned'])) {
+      $sql .= " CHECK ($name >= 0)";
+    }
+
+    if (isset($spec['not null'])) {
+      if ($spec['not null']) {
+        $sql .= ' NOT NULL';
+      }
+      else {
+        $sql .= ' NULL';
+      }
+    }
+    if (isset($spec['default'])) {
+      $default = is_string($spec['default']) ? "'" . $spec['default'] . "'" : $spec['default'];
+      $sql .= " default $default";
+    }
+
+    return $sql;
+  }
+
+  /**
+   * Set database-engine specific properties for a field.
+   *
+   * @param $field
+   *   A field description array, as specified in the schema documentation.
+   */
+  protected function processField($field) {
+    if (!isset($field['size'])) {
+      $field['size'] = 'normal';
+    }
+
+    // Set the correct database-engine specific datatype.
+    // In case one is already provided, force it to lowercase.
+    if (isset($field['pgsql_type'])) {
+      $field['pgsql_type'] = drupal_strtolower($field['pgsql_type']);
+    }
+    else {
+      $map = $this->getFieldTypeMap();
+      $field['pgsql_type'] = $map[$field['type'] . ':' . $field['size']];
+    }
+
+    if (!empty($field['unsigned'])) {
+      // Unsigned datatypes are not supported in PostgreSQL 8.3. In MySQL,
+      // they are used to ensure a positive number is inserted and it also
+      // doubles the maximum integer size that can be stored in a field.
+      // The PostgreSQL schema in Drupal creates a check constraint
+      // to ensure that a value inserted is >= 0. To provide the extra
+      // integer capacity, here, we bump up the column field size.
+      if (!isset($map)) {
+        $map = $this->getFieldTypeMap();
+      }
+      switch ($field['pgsql_type']) {
+        case 'smallint':
+          $field['pgsql_type'] = $map['int:medium'];
+          break;
+        case 'int' :
+          $field['pgsql_type'] = $map['int:big'];
+          break;
+      }
+    }
+    if (isset($field['type']) && $field['type'] == 'serial') {
+      unset($field['not null']);
+    }
+    return $field;
+  }
+
+  /**
+   * This maps a generic data type in combination with its data size
+   * to the engine-specific data type.
+   */
+  function getFieldTypeMap() {
+    // Put :normal last so it gets preserved by array_flip. This makes
+    // it much easier for modules (such as schema.module) to map
+    // database types back into schema types.
+    // $map does not use drupal_static as its value never changes.
+    static $map = array(
+      'varchar:normal' => 'varchar',
+      'char:normal' => 'character',
+
+      'text:tiny' => 'text',
+      'text:small' => 'text',
+      'text:medium' => 'text',
+      'text:big' => 'text',
+      'text:normal' => 'text',
+
+      'int:tiny' => 'smallint',
+      'int:small' => 'smallint',
+      'int:medium' => 'int',
+      'int:big' => 'bigint',
+      'int:normal' => 'int',
+
+      'float:tiny' => 'real',
+      'float:small' => 'real',
+      'float:medium' => 'real',
+      'float:big' => 'double precision',
+      'float:normal' => 'real',
+
+      'numeric:normal' => 'numeric',
+
+      'blob:big' => 'bytea',
+      'blob:normal' => 'bytea',
+
+      'serial:tiny' => 'serial',
+      'serial:small' => 'serial',
+      'serial:medium' => 'serial',
+      'serial:big' => 'bigserial',
+      'serial:normal' => 'serial',
+      );
+    return $map;
+  }
+
+  protected function _createKeySql($fields) {
+    $return = array();
+    foreach ($fields as $field) {
+      if (is_array($field)) {
+        $return[] = 'substr(' . $field[0] . ', 1, ' . $field[1] . ')';
+      }
+      else {
+        $return[] = '"' . $field . '"';
+      }
+    }
+    return implode(', ', $return);
+  }
+
+  function renameTable($table, $new_name) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot rename %table to %table_new: table %table doesn't exist.", array('%table' => $table, '%table_new' => $new_name)));
+    }
+    if ($this->tableExists($new_name)) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot rename %table to %table_new: table %table_new already exists.", array('%table' => $table, '%table_new' => $new_name)));
+    }
+
+    // Get the schema and tablename for the old table.
+    $old_full_name = $this->connection->prefixTables('{' . $table . '}');
+    list($old_schema, $old_table_name) = strpos($old_full_name, '.') ? explode('.', $old_full_name) : array('public', $old_full_name);
+
+    // Index names and constraint names are global in PostgreSQL, so we need to
+    // rename them when renaming the table.
+    $indexes = $this->connection->query('SELECT indexname FROM pg_indexes WHERE schemaname = :schema AND tablename = :table', array(':schema' => $old_schema, ':table' => $old_table_name));
+    foreach ($indexes as $index) {
+      if (preg_match('/^' . preg_quote($old_full_name) . '_(.*)$/', $index->indexname, $matches)) {
+        $index_name = $matches[1];
+        $this->connection->query('ALTER INDEX ' . $index->indexname . ' RENAME TO {' . $new_name . '}_' . $index_name);
+      }
+    }
+
+    // Now rename the table.
+    // Ensure the new table name does not include schema syntax.
+    $prefixInfo = $this->getPrefixInfo($new_name);
+    $this->connection->query('ALTER TABLE {' . $table . '} RENAME TO ' . $prefixInfo['table']);
+  }
+
+  public function dropTable($table) {
+    if (!$this->tableExists($table)) {
+      return FALSE;
+    }
+
+    $this->connection->query('DROP TABLE {' . $table . '}');
+    return TRUE;
+  }
+
+  public function addField($table, $field, $spec, $new_keys = array()) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add field %table.%field: table doesn't exist.", array('%field' => $field, '%table' => $table)));
+    }
+    if ($this->fieldExists($table, $field)) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot add field %table.%field: field already exists.", array('%field' => $field, '%table' => $table)));
+    }
+
+    $fixnull = FALSE;
+    if (!empty($spec['not null']) && !isset($spec['default'])) {
+      $fixnull = TRUE;
+      $spec['not null'] = FALSE;
+    }
+    $query = 'ALTER TABLE {' . $table . '} ADD COLUMN ';
+    $query .= $this->createFieldSql($field, $this->processField($spec));
+    $this->connection->query($query);
+    if (isset($spec['initial'])) {
+      $this->connection->update($table)
+        ->fields(array($field => $spec['initial']))
+        ->execute();
+    }
+    if ($fixnull) {
+      $this->connection->query("ALTER TABLE {" . $table . "} ALTER $field SET NOT NULL");
+    }
+    if (isset($new_keys)) {
+      $this->_createKeys($table, $new_keys);
+    }
+    // Add column comment.
+    if (!empty($spec['description'])) {
+      $this->connection->query('COMMENT ON COLUMN {' . $table . '}.' . $field . ' IS ' . $this->prepareComment($spec['description']));
+    }
+  }
+
+  public function dropField($table, $field) {
+    if (!$this->fieldExists($table, $field)) {
+      return FALSE;
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} DROP COLUMN "' . $field . '"');
+    return TRUE;
+  }
+
+  public function fieldSetDefault($table, $field, $default) {
+    if (!$this->fieldExists($table, $field)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot set default value of field %table.%field: field doesn't exist.", array('%table' => $table, '%field' => $field)));
+    }
+
+    if (!isset($default)) {
+      $default = 'NULL';
+    }
+    else {
+      $default = is_string($default) ? "'$default'" : $default;
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} ALTER COLUMN "' . $field . '" SET DEFAULT ' . $default);
+  }
+
+  public function fieldSetNoDefault($table, $field) {
+    if (!$this->fieldExists($table, $field)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot remove default value of field %table.%field: field doesn't exist.", array('%table' => $table, '%field' => $field)));
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} ALTER COLUMN "' . $field . '" DROP DEFAULT');
+  }
+
+  public function indexExists($table, $name) {
+    // Details http://www.postgresql.org/docs/8.3/interactive/view-pg-indexes.html
+    $index_name = '{' . $table . '}_' . $name . '_idx';
+    return (bool) $this->connection->query("SELECT 1 FROM pg_indexes WHERE indexname = '$index_name'")->fetchField();
+  }
+
+  /**
+   * Helper function: check if a constraint (PK, FK, UK) exists.
+   *
+   * @param $table
+   *   The name of the table.
+   * @param $name
+   *   The name of the constraint (typically 'pkey' or '[constraint]_key').
+   */
+  protected function constraintExists($table, $name) {
+    $constraint_name = '{' . $table . '}_' . $name;
+    return (bool) $this->connection->query("SELECT 1 FROM pg_constraint WHERE conname = '$constraint_name'")->fetchField();
+  }
+
+  public function addPrimaryKey($table, $fields) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add primary key to table %table: table doesn't exist.", array('%table' => $table)));
+    }
+    if ($this->constraintExists($table, 'pkey')) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot add primary key to table %table: primary key already exists.", array('%table' => $table)));
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} ADD PRIMARY KEY (' . implode(',', $fields) . ')');
+  }
+
+  public function dropPrimaryKey($table) {
+    if (!$this->constraintExists($table, 'pkey')) {
+      return FALSE;
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} DROP CONSTRAINT ' . $this->prefixNonTable($table, 'pkey'));
+    return TRUE;
+  }
+
+  function addUniqueKey($table, $name, $fields) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add unique key %name to table %table: table doesn't exist.", array('%table' => $table, '%name' => $name)));
+    }
+    if ($this->constraintExists($table, $name . '_key')) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot add unique key %name to table %table: unique key already exists.", array('%table' => $table, '%name' => $name)));
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} ADD CONSTRAINT "' . $this->prefixNonTable($table, $name, 'key') . '" UNIQUE (' . implode(',', $fields) . ')');
+  }
+
+  public function dropUniqueKey($table, $name) {
+    if (!$this->constraintExists($table, $name . '_key')) {
+      return FALSE;
+    }
+
+    $this->connection->query('ALTER TABLE {' . $table . '} DROP CONSTRAINT "' . $this->prefixNonTable($table, $name, 'key') . '"');
+    return TRUE;
+  }
+
+  public function addIndex($table, $name, $fields) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add index %name to table %table: table doesn't exist.", array('%table' => $table, '%name' => $name)));
+    }
+    if ($this->indexExists($table, $name)) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot add index %name to table %table: index already exists.", array('%table' => $table, '%name' => $name)));
+    }
+
+    $this->connection->query($this->_createIndexSql($table, $name, $fields));
+  }
+
+  public function dropIndex($table, $name) {
+    if (!$this->indexExists($table, $name)) {
+      return FALSE;
+    }
+
+    $this->connection->query('DROP INDEX ' . $this->prefixNonTable($table, $name, 'idx'));
+    return TRUE;
+  }
+
+  public function changeField($table, $field, $field_new, $spec, $new_keys = array()) {
+    if (!$this->fieldExists($table, $field)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot change the definition of field %table.%name: field doesn't exist.", array('%table' => $table, '%name' => $field)));
+    }
+    if (($field != $field_new) && $this->fieldExists($table, $field_new)) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot rename field %table.%name to %name_new: target field already exists.", array('%table' => $table, '%name' => $field, '%name_new' => $field_new)));
+    }
+
+    $spec = $this->processField($spec);
+
+    // We need to typecast the new column to best be able to transfer the data
+    // Schema_pgsql::getFieldTypeMap() will return possibilities that are not
+    // 'cast-able' such as 'serial' - so they need to be casted int instead.
+    if (in_array($spec['pgsql_type'], array('serial', 'bigserial', 'numeric'))) {
+      $typecast = 'int';
+    }
+    else {
+      $typecast = $spec['pgsql_type'];
+    }
+
+    if (in_array($spec['pgsql_type'], array('varchar', 'character', 'text')) && isset($spec['length'])) {
+      $typecast .= '(' . $spec['length'] . ')';
+    }
+    elseif (isset($spec['precision']) && isset($spec['scale'])) {
+      $typecast .= '(' . $spec['precision'] . ', ' . $spec['scale'] . ')';
+    }
+
+    // Remove old check constraints.
+    $field_info = $this->queryFieldInformation($table, $field);
+
+    foreach ($field_info as $check) {
+      $this->connection->query('ALTER TABLE {' . $table . '} DROP CONSTRAINT "' . $check . '"');
+    }
+
+    // Remove old default.
+    $this->fieldSetNoDefault($table, $field);
+
+    $this->connection->query('ALTER TABLE {' . $table . '} ALTER "' . $field . '" TYPE ' . $typecast . ' USING "' . $field . '"::' . $typecast);
+
+    if (isset($spec['not null'])) {
+      if ($spec['not null']) {
+        $nullaction = 'SET NOT NULL';
+      }
+      else {
+        $nullaction = 'DROP NOT NULL';
+      }
+      $this->connection->query('ALTER TABLE {' . $table . '} ALTER "' . $field . '" ' . $nullaction);
+    }
+
+    if (in_array($spec['pgsql_type'], array('serial', 'bigserial'))) {
+      // Type "serial" is known to PostgreSQL, but *only* during table creation,
+      // not when altering. Because of that, the sequence needs to be created
+      // and initialized by hand.
+      $seq = "{" . $table . "}_" . $field_new . "_seq";
+      $this->connection->query("CREATE SEQUENCE " . $seq);
+      // Set sequence to maximal field value to not conflict with existing
+      // entries.
+      $this->connection->query("SELECT setval('" . $seq . "', MAX(\"" . $field . '")) FROM {' . $table . "}");
+      $this->connection->query('ALTER TABLE {' . $table . '} ALTER "' . $field . '" SET DEFAULT nextval(\'' . $seq . '\')');
+    }
+
+    // Rename the column if necessary.
+    if ($field != $field_new) {
+      $this->connection->query('ALTER TABLE {' . $table . '} RENAME "' . $field . '" TO "' . $field_new . '"');
+    }
+
+    // Add unsigned check if necessary.
+    if (!empty($spec['unsigned'])) {
+      $this->connection->query('ALTER TABLE {' . $table . '} ADD CHECK ("' . $field_new . '" >= 0)');
+    }
+
+    // Add default if necessary.
+    if (isset($spec['default'])) {
+      $this->fieldSetDefault($table, $field_new, $spec['default']);
+    }
+
+    // Change description if necessary.
+    if (!empty($spec['description'])) {
+      $this->connection->query('COMMENT ON COLUMN {' . $table . '}."' . $field_new . '" IS ' . $this->prepareComment($spec['description']));
+    }
+
+    if (isset($new_keys)) {
+      $this->_createKeys($table, $new_keys);
+    }
+  }
+
+  protected function _createIndexSql($table, $name, $fields) {
+    $query = 'CREATE INDEX "' . $this->prefixNonTable($table, $name, 'idx') . '" ON {' . $table . '} (';
+    $query .= $this->_createKeySql($fields) . ')';
+    return $query;
+  }
+
+  protected function _createKeys($table, $new_keys) {
+    if (isset($new_keys['primary key'])) {
+      $this->addPrimaryKey($table, $new_keys['primary key']);
+    }
+    if (isset($new_keys['unique keys'])) {
+      foreach ($new_keys['unique keys'] as $name => $fields) {
+        $this->addUniqueKey($table, $name, $fields);
+      }
+    }
+    if (isset($new_keys['indexes'])) {
+      foreach ($new_keys['indexes'] as $name => $fields) {
+        $this->addIndex($table, $name, $fields);
+      }
+    }
+  }
+
+  /**
+   * Retrieve a table or column comment.
+   */
+  public function getComment($table, $column = NULL) {
+    $info = $this->getPrefixInfo($table);
+    // Don't use {} around pg_class, pg_attribute tables.
+    if (isset($column)) {
+      return $this->connection->query('SELECT col_description(oid, attnum) FROM pg_class, pg_attribute WHERE attrelid = oid AND relname = ? AND attname = ?', array($info['table'], $column))->fetchField();
+    }
+    else {
+      return $this->connection->query('SELECT obj_description(oid, ?) FROM pg_class WHERE relname = ?', array('pg_class', $info['table']))->fetchField();
+    }
+  }
+}
diff --git a/htmltest/includes/database/pgsql/select.inc b/htmltest/includes/database/pgsql/select.inc
new file mode 100644
index 00000000..f6a83db7
--- /dev/null
+++ b/htmltest/includes/database/pgsql/select.inc
@@ -0,0 +1,108 @@
+<?php
+
+/**
+ * @file
+ * Select builder for PostgreSQL database engine.
+ */
+
+/**
+ * @addtogroup database
+ * @{
+ */
+
+class SelectQuery_pgsql extends SelectQuery {
+
+  public function orderRandom() {
+    $alias = $this->addExpression('RANDOM()', 'random_field');
+    $this->orderBy($alias);
+    return $this;
+  }
+
+  /**
+   * Overrides SelectQuery::orderBy().
+   *
+   * PostgreSQL adheres strictly to the SQL-92 standard and requires that when
+   * using DISTINCT or GROUP BY conditions, fields and expressions that are
+   * ordered on also need to be selected. This is a best effort implementation
+   * to handle the cases that can be automated by adding the field if it is not
+   * yet selected.
+   *
+   * @code
+   *   $query = db_select('node', 'n');
+   *   $query->join('node_revision', 'nr', 'n.vid = nr.vid');
+   *   $query
+   *     ->distinct()
+   *     ->fields('n')
+   *     ->orderBy('timestamp');
+   * @endcode
+   *
+   * In this query, it is not possible (without relying on the schema) to know
+   * whether timestamp belongs to node_revisions and needs to be added or
+   * belongs to node and is already selected. Queries like this will need to be
+   * corrected in the original query by adding an explicit call to
+   * SelectQuery::addField() or SelectQuery::fields().
+   *
+   * Since this has a small performance impact, both by the additional
+   * processing in this function and in the database that needs to return the
+   * additional fields, this is done as an override instead of implementing it
+   * directly in SelectQuery::orderBy().
+   */
+  public function orderBy($field, $direction = 'ASC') {
+    // Call parent function to order on this.
+    $return = parent::orderBy($field, $direction);
+
+    // If there is a table alias specified, split it up.
+    if (strpos($field, '.') !== FALSE) {
+      list($table, $table_field) = explode('.', $field);
+    }
+    // Figure out if the field has already been added.
+    foreach ($this->fields as $existing_field) {
+      if (!empty($table)) {
+        // If table alias is given, check if field and table exists.
+        if ($existing_field['table'] == $table && $existing_field['field'] == $table_field) {
+          return $return;
+        }
+      }
+      else {
+        // If there is no table, simply check if the field exists as a field or
+        // an aliased field.
+        if ($existing_field['alias'] == $field) {
+          return $return;
+        }
+      }
+    }
+
+    // Also check expression aliases.
+    foreach ($this->expressions as $expression) {
+      if ($expression['alias'] == $field) {
+        return $return;
+      }
+    }
+
+    // If a table loads all fields, it can not be added again. It would
+    // result in an ambigious alias error because that field would be loaded
+    // twice: Once through table_alias.* and once directly. If the field
+    // actually belongs to a different table, it must be added manually.
+    foreach ($this->tables as $table) {
+      if (!empty($table['all_fields'])) {
+        return $return;
+      }
+    }
+
+    // If $field contains an characters which are not allowed in a field name
+    // it is considered an expression, these can't be handeld automatically
+    // either.
+    if ($this->connection->escapeField($field) != $field) {
+      return $return;
+    }
+
+    // This is a case that can be handled automatically, add the field.
+    $this->addField(NULL, $field);
+    return $return;
+  }
+}
+
+/**
+ * @} End of "addtogroup database".
+ */
+
diff --git a/htmltest/includes/database/prefetch.inc b/htmltest/includes/database/prefetch.inc
new file mode 100644
index 00000000..3b36a4e1
--- /dev/null
+++ b/htmltest/includes/database/prefetch.inc
@@ -0,0 +1,507 @@
+<?php
+
+/**
+ * @file
+ * Database interface code for engines that need complete control over their
+ * result sets. For example, SQLite will prefix some column names by the name
+ * of the table. We post-process the data, by renaming the column names
+ * using the same convention as MySQL and PostgreSQL.
+ */
+
+/**
+ * @addtogroup database
+ * @{
+ */
+
+/**
+ * An implementation of DatabaseStatementInterface that prefetches all data.
+ *
+ * This class behaves very similar to a PDOStatement but as it always fetches
+ * every row it is possible to manipulate those results.
+ */
+class DatabaseStatementPrefetch implements Iterator, DatabaseStatementInterface {
+
+  /**
+   * The query string.
+   *
+   * @var string
+   */
+  protected $queryString;
+
+  /**
+   * Driver-specific options. Can be used by child classes.
+   *
+   * @var Array
+   */
+  protected $driverOptions;
+
+  /**
+   * Reference to the database connection object for this statement.
+   *
+   * The name $dbh is inherited from PDOStatement.
+   *
+   * @var DatabaseConnection
+   */
+  public $dbh;
+
+  /**
+   * Main data store.
+   *
+   * @var Array
+   */
+  protected $data = array();
+
+  /**
+   * The current row, retrieved in PDO::FETCH_ASSOC format.
+   *
+   * @var Array
+   */
+  protected $currentRow = NULL;
+
+  /**
+   * The key of the current row.
+   *
+   * @var int
+   */
+  protected $currentKey = NULL;
+
+  /**
+   * The list of column names in this result set.
+   *
+   * @var Array
+   */
+  protected $columnNames = NULL;
+
+  /**
+   * The number of rows affected by the last query.
+   *
+   * @var int
+   */
+  protected $rowCount = NULL;
+
+  /**
+   * The number of rows in this result set.
+   *
+   * @var int
+   */
+  protected $resultRowCount = 0;
+
+  /**
+   * Holds the current fetch style (which will be used by the next fetch).
+   * @see PDOStatement::fetch()
+   *
+   * @var int
+   */
+  protected $fetchStyle = PDO::FETCH_OBJ;
+
+  /**
+   * Holds supplementary current fetch options (which will be used by the next fetch).
+   *
+   * @var Array
+   */
+  protected $fetchOptions = array(
+    'class' => 'stdClass',
+    'constructor_args' => array(),
+    'object' => NULL,
+    'column' => 0,
+  );
+
+  /**
+   * Holds the default fetch style.
+   *
+   * @var int
+   */
+  protected $defaultFetchStyle = PDO::FETCH_OBJ;
+
+  /**
+   * Holds supplementary default fetch options.
+   *
+   * @var Array
+   */
+  protected $defaultFetchOptions = array(
+    'class' => 'stdClass',
+    'constructor_args' => array(),
+    'object' => NULL,
+    'column' => 0,
+  );
+
+  public function __construct(DatabaseConnection $connection, $query, array $driver_options = array()) {
+    $this->dbh = $connection;
+    $this->queryString = $query;
+    $this->driverOptions = $driver_options;
+  }
+
+  /**
+   * Executes a prepared statement.
+   *
+   * @param $args
+   *   An array of values with as many elements as there are bound parameters in the SQL statement being executed.
+   * @param $options
+   *   An array of options for this query.
+   * @return
+   *   TRUE on success, or FALSE on failure.
+   */
+  public function execute($args = array(), $options = array()) {
+    if (isset($options['fetch'])) {
+      if (is_string($options['fetch'])) {
+        // Default to an object. Note: db fields will be added to the object
+        // before the constructor is run. If you need to assign fields after
+        // the constructor is run, see http://drupal.org/node/315092.
+        $this->setFetchMode(PDO::FETCH_CLASS, $options['fetch']);
+      }
+      else {
+        $this->setFetchMode($options['fetch']);
+      }
+    }
+
+    $logger = $this->dbh->getLogger();
+    if (!empty($logger)) {
+      $query_start = microtime(TRUE);
+    }
+
+    // Prepare the query.
+    $statement = $this->getStatement($this->queryString, $args);
+    if (!$statement) {
+      $this->throwPDOException();
+    }
+
+    $return = $statement->execute($args);
+    if (!$return) {
+      $this->throwPDOException();
+    }
+
+    // Fetch all the data from the reply, in order to release any lock
+    // as soon as possible.
+    $this->rowCount = $statement->rowCount();
+    $this->data = $statement->fetchAll(PDO::FETCH_ASSOC);
+    // Destroy the statement as soon as possible. See
+    // DatabaseConnection_sqlite::PDOPrepare() for explanation.
+    unset($statement);
+
+    $this->resultRowCount = count($this->data);
+
+    if ($this->resultRowCount) {
+      $this->columnNames = array_keys($this->data[0]);
+    }
+    else {
+      $this->columnNames = array();
+    }
+
+    if (!empty($logger)) {
+      $query_end = microtime(TRUE);
+      $logger->log($this, $args, $query_end - $query_start);
+    }
+
+    // Initialize the first row in $this->currentRow.
+    $this->next();
+
+    return $return;
+  }
+
+  /**
+   * Throw a PDO Exception based on the last PDO error.
+   */
+  protected function throwPDOException() {
+    $error_info = $this->dbh->errorInfo();
+    // We rebuild a message formatted in the same way as PDO.
+    $exception = new PDOException("SQLSTATE[" . $error_info[0] . "]: General error " . $error_info[1] . ": " . $error_info[2]);
+    $exception->errorInfo = $error_info;
+    throw $exception;
+  }
+
+  /**
+   * Grab a PDOStatement object from a given query and its arguments.
+   *
+   * Some drivers (including SQLite) will need to perform some preparation
+   * themselves to get the statement right.
+   *
+   * @param $query
+   *   The query.
+   * @param array $args
+   *   An array of arguments.
+   * @return PDOStatement
+   *   A PDOStatement object.
+   */
+  protected function getStatement($query, &$args = array()) {
+    return $this->dbh->prepare($query);
+  }
+
+  /**
+   * Return the object's SQL query string.
+   */
+  public function getQueryString() {
+    return $this->queryString;
+  }
+
+  /**
+   * @see PDOStatement::setFetchMode()
+   */
+  public function setFetchMode($fetchStyle, $a2 = NULL, $a3 = NULL) {
+    $this->defaultFetchStyle = $fetchStyle;
+    switch ($fetchStyle) {
+      case PDO::FETCH_CLASS:
+        $this->defaultFetchOptions['class'] = $a2;
+        if ($a3) {
+          $this->defaultFetchOptions['constructor_args'] = $a3;
+        }
+        break;
+      case PDO::FETCH_COLUMN:
+        $this->defaultFetchOptions['column'] = $a2;
+        break;
+      case PDO::FETCH_INTO:
+        $this->defaultFetchOptions['object'] = $a2;
+        break;
+    }
+
+    // Set the values for the next fetch.
+    $this->fetchStyle = $this->defaultFetchStyle;
+    $this->fetchOptions = $this->defaultFetchOptions;
+  }
+
+  /**
+   * Return the current row formatted according to the current fetch style.
+   *
+   * This is the core method of this class. It grabs the value at the current
+   * array position in $this->data and format it according to $this->fetchStyle
+   * and $this->fetchMode.
+   *
+   * @return
+   *  The current row formatted as requested.
+   */
+  public function current() {
+    if (isset($this->currentRow)) {
+      switch ($this->fetchStyle) {
+        case PDO::FETCH_ASSOC:
+          return $this->currentRow;
+        case PDO::FETCH_BOTH:
+          // PDO::FETCH_BOTH returns an array indexed by both the column name
+          // and the column number.
+          return $this->currentRow + array_values($this->currentRow);
+        case PDO::FETCH_NUM:
+          return array_values($this->currentRow);
+        case PDO::FETCH_LAZY:
+          // We do not do lazy as everything is fetched already. Fallback to
+          // PDO::FETCH_OBJ.
+        case PDO::FETCH_OBJ:
+          return (object) $this->currentRow;
+        case PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE:
+          $class_name = array_unshift($this->currentRow);
+          // Deliberate no break.
+        case PDO::FETCH_CLASS:
+          if (!isset($class_name)) {
+            $class_name = $this->fetchOptions['class'];
+          }
+          if (count($this->fetchOptions['constructor_args'])) {
+            $reflector = new ReflectionClass($class_name);
+            $result = $reflector->newInstanceArgs($this->fetchOptions['constructor_args']);
+          }
+          else {
+            $result = new $class_name();
+          }
+          foreach ($this->currentRow as $k => $v) {
+            $result->$k = $v;
+          }
+          return $result;
+        case PDO::FETCH_INTO:
+          foreach ($this->currentRow as $k => $v) {
+            $this->fetchOptions['object']->$k = $v;
+          }
+          return $this->fetchOptions['object'];
+        case PDO::FETCH_COLUMN:
+          if (isset($this->columnNames[$this->fetchOptions['column']])) {
+            return $this->currentRow[$k][$this->columnNames[$this->fetchOptions['column']]];
+          }
+          else {
+            return;
+          }
+      }
+    }
+  }
+
+  /* Implementations of Iterator. */
+
+  public function key() {
+    return $this->currentKey;
+  }
+
+  public function rewind() {
+    // Nothing to do: our DatabaseStatement can't be rewound.
+  }
+
+  public function next() {
+    if (!empty($this->data)) {
+      $this->currentRow = reset($this->data);
+      $this->currentKey = key($this->data);
+      unset($this->data[$this->currentKey]);
+    }
+    else {
+      $this->currentRow = NULL;
+    }
+  }
+
+  public function valid() {
+    return isset($this->currentRow);
+  }
+
+  /* Implementations of DatabaseStatementInterface. */
+
+  public function rowCount() {
+    return $this->rowCount;
+  }
+
+  public function fetch($fetch_style = NULL, $cursor_orientation = PDO::FETCH_ORI_NEXT, $cursor_offset = NULL) {
+    if (isset($this->currentRow)) {
+      // Set the fetch parameter.
+      $this->fetchStyle = isset($fetch_style) ? $fetch_style : $this->defaultFetchStyle;
+      $this->fetchOptions = $this->defaultFetchOptions;
+
+      // Grab the row in the format specified above.
+      $return = $this->current();
+      // Advance the cursor.
+      $this->next();
+
+      // Reset the fetch parameters to the value stored using setFetchMode().
+      $this->fetchStyle = $this->defaultFetchStyle;
+      $this->fetchOptions = $this->defaultFetchOptions;
+      return $return;
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  public function fetchColumn($index = 0) {
+    if (isset($this->currentRow) && isset($this->columnNames[$index])) {
+      // We grab the value directly from $this->data, and format it.
+      $return = $this->currentRow[$this->columnNames[$index]];
+      $this->next();
+      return $return;
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  public function fetchField($index = 0) {
+    return $this->fetchColumn($index);
+  }
+
+  public function fetchObject($class_name = NULL, $constructor_args = array()) {
+    if (isset($this->currentRow)) {
+      if (!isset($class_name)) {
+        // Directly cast to an object to avoid a function call.
+        $result = (object) $this->currentRow;
+      }
+      else {
+        $this->fetchStyle = PDO::FETCH_CLASS;
+        $this->fetchOptions = array('constructor_args' => $constructor_args);
+        // Grab the row in the format specified above.
+        $result = $this->current();
+        // Reset the fetch parameters to the value stored using setFetchMode().
+        $this->fetchStyle = $this->defaultFetchStyle;
+        $this->fetchOptions = $this->defaultFetchOptions;
+      }
+
+      $this->next();
+
+      return $result;
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  public function fetchAssoc() {
+    if (isset($this->currentRow)) {
+      $result = $this->currentRow;
+      $this->next();
+      return $result;
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  public function fetchAll($fetch_style = NULL, $fetch_column = NULL, $constructor_args = NULL) {
+    $this->fetchStyle = isset($fetch_style) ? $fetch_style : $this->defaultFetchStyle;
+    $this->fetchOptions = $this->defaultFetchOptions;
+    if (isset($fetch_column)) {
+      $this->fetchOptions['column'] = $fetch_column;
+    }
+    if (isset($constructor_args)) {
+      $this->fetchOptions['constructor_args'] = $constructor_args;
+    }
+
+    $result = array();
+    // Traverse the array as PHP would have done.
+    while (isset($this->currentRow)) {
+      // Grab the row in the format specified above.
+      $result[] = $this->current();
+      $this->next();
+    }
+
+    // Reset the fetch parameters to the value stored using setFetchMode().
+    $this->fetchStyle = $this->defaultFetchStyle;
+    $this->fetchOptions = $this->defaultFetchOptions;
+    return $result;
+  }
+
+  public function fetchCol($index = 0) {
+    if (isset($this->columnNames[$index])) {
+      $column = $this->columnNames[$index];
+      $result = array();
+      // Traverse the array as PHP would have done.
+      while (isset($this->currentRow)) {
+        $result[] = $this->currentRow[$this->columnNames[$index]];
+        $this->next();
+      }
+      return $result;
+    }
+    else {
+      return array();
+    }
+  }
+
+  public function fetchAllKeyed($key_index = 0, $value_index = 1) {
+    if (!isset($this->columnNames[$key_index]) || !isset($this->columnNames[$value_index]))
+      return array();
+
+    $key = $this->columnNames[$key_index];
+    $value = $this->columnNames[$value_index];
+
+    $result = array();
+    // Traverse the array as PHP would have done.
+    while (isset($this->currentRow)) {
+      $result[$this->currentRow[$key]] = $this->currentRow[$value];
+      $this->next();
+    }
+    return $result;
+  }
+
+  public function fetchAllAssoc($key, $fetch_style = NULL) {
+    $this->fetchStyle = isset($fetch_style) ? $fetch_style : $this->defaultFetchStyle;
+    $this->fetchOptions = $this->defaultFetchOptions;
+
+    $result = array();
+    // Traverse the array as PHP would have done.
+    while (isset($this->currentRow)) {
+      // Grab the row in its raw PDO::FETCH_ASSOC format.
+      $row = $this->currentRow;
+      // Grab the row in the format specified above.
+      $result_row = $this->current();
+      $result[$this->currentRow[$key]] = $result_row;
+      $this->next();
+    }
+
+    // Reset the fetch parameters to the value stored using setFetchMode().
+    $this->fetchStyle = $this->defaultFetchStyle;
+    $this->fetchOptions = $this->defaultFetchOptions;
+    return $result;
+  }
+
+}
+
+/**
+ * @} End of "addtogroup database".
+ */
+
diff --git a/htmltest/includes/database/query.inc b/htmltest/includes/database/query.inc
new file mode 100644
index 00000000..8af91c2d
--- /dev/null
+++ b/htmltest/includes/database/query.inc
@@ -0,0 +1,1963 @@
+<?php
+
+/**
+ * @addtogroup database
+ * @{
+ */
+
+/**
+ * @file
+ * Non-specific Database query code. Used by all engines.
+ */
+
+/**
+ * Interface for a conditional clause in a query.
+ */
+interface QueryConditionInterface {
+
+  /**
+   * Helper function: builds the most common conditional clauses.
+   *
+   * This method can take a variable number of parameters. If called with two
+   * parameters, they are taken as $field and $value with $operator having a
+   * value of IN if $value is an array and = otherwise.
+   *
+   * Do not use this method to test for NULL values. Instead, use
+   * QueryConditionInterface::isNull() or QueryConditionInterface::isNotNull().
+   *
+   * @param $field
+   *   The name of the field to check. If you would like to add a more complex
+   *   condition involving operators or functions, use where().
+   * @param $value
+   *   The value to test the field against. In most cases, this is a scalar.
+   *   For more complex options, it is an array. The meaning of each element in
+   *   the array is dependent on the $operator.
+   * @param $operator
+   *   The comparison operator, such as =, <, or >=. It also accepts more
+   *   complex options such as IN, LIKE, or BETWEEN. Defaults to IN if $value is
+   *   an array, and = otherwise.
+   *
+   * @return QueryConditionInterface
+   *   The called object.
+   *
+   * @see QueryConditionInterface::isNull()
+   * @see QueryConditionInterface::isNotNull()
+   */
+  public function condition($field, $value = NULL, $operator = NULL);
+
+  /**
+   * Adds an arbitrary WHERE clause to the query.
+   *
+   * @param $snippet
+   *   A portion of a WHERE clause as a prepared statement. It must use named
+   *   placeholders, not ? placeholders.
+   * @param $args
+   *   An associative array of arguments.
+   *
+   * @return QueryConditionInterface
+   *   The called object.
+   */
+  public function where($snippet, $args = array());
+
+  /**
+   * Sets a condition that the specified field be NULL.
+   *
+   * @param $field
+   *   The name of the field to check.
+   *
+   * @return QueryConditionInterface
+   *   The called object.
+   */
+  public function isNull($field);
+
+  /**
+   * Sets a condition that the specified field be NOT NULL.
+   *
+   * @param $field
+   *   The name of the field to check.
+   *
+   * @return QueryConditionInterface
+   *   The called object.
+   */
+  public function isNotNull($field);
+
+  /**
+   * Sets a condition that the specified subquery returns values.
+   *
+   * @param SelectQueryInterface $select
+   *   The subquery that must contain results.
+   *
+   * @return QueryConditionInterface
+   *   The called object.
+   */
+  public function exists(SelectQueryInterface $select);
+
+  /**
+   * Sets a condition that the specified subquery returns no values.
+   *
+   * @param SelectQueryInterface $select
+   *   The subquery that must not contain results.
+   *
+   * @return QueryConditionInterface
+   *   The called object.
+   */
+  public function notExists(SelectQueryInterface $select);
+
+  /**
+   * Gets a complete list of all conditions in this conditional clause.
+   *
+   * This method returns by reference. That allows alter hooks to access the
+   * data structure directly and manipulate it before it gets compiled.
+   *
+   * The data structure that is returned is an indexed array of entries, where
+   * each entry looks like the following:
+   * @code
+   * array(
+   *   'field' => $field,
+   *   'value' => $value,
+   *   'operator' => $operator,
+   * );
+   * @endcode
+   *
+   * In the special case that $operator is NULL, the $field is taken as a raw
+   * SQL snippet (possibly containing a function) and $value is an associative
+   * array of placeholders for the snippet.
+   *
+   * There will also be a single array entry of #conjunction, which is the
+   * conjunction that will be applied to the array, such as AND.
+   */
+  public function &conditions();
+
+  /**
+   * Gets a complete list of all values to insert into the prepared statement.
+   *
+   * @return
+   *   An associative array of placeholders and values.
+   */
+  public function arguments();
+
+  /**
+   * Compiles the saved conditions for later retrieval.
+   *
+   * This method does not return anything, but simply prepares data to be
+   * retrieved via __toString() and arguments().
+   *
+   * @param $connection
+   *   The database connection for which to compile the conditionals.
+   * @param $queryPlaceholder
+   *   The query this condition belongs to. If not given, the current query is
+   *   used.
+   */
+  public function compile(DatabaseConnection $connection, QueryPlaceholderInterface $queryPlaceholder);
+
+  /**
+   * Check whether a condition has been previously compiled.
+   *
+   * @return
+   *   TRUE if the condition has been previously compiled.
+   */
+  public function compiled();
+}
+
+
+/**
+ * Interface for a query that can be manipulated via an alter hook.
+ */
+interface QueryAlterableInterface {
+
+  /**
+   * Adds a tag to a query.
+   *
+   * Tags are strings that identify a query. A query may have any number of
+   * tags. Tags are used to mark a query so that alter hooks may decide if they
+   * wish to take action. Tags should be all lower-case and contain only
+   * letters, numbers, and underscore, and start with a letter. That is, they
+   * should follow the same rules as PHP identifiers in general.
+   *
+   * @param $tag
+   *   The tag to add.
+   *
+   * @return QueryAlterableInterface
+   *   The called object.
+   */
+  public function addTag($tag);
+
+  /**
+   * Determines if a given query has a given tag.
+   *
+   * @param $tag
+   *   The tag to check.
+   *
+   * @return
+   *   TRUE if this query has been marked with this tag, FALSE otherwise.
+   */
+  public function hasTag($tag);
+
+  /**
+   * Determines if a given query has all specified tags.
+   *
+   * @param $tags
+   *   A variable number of arguments, one for each tag to check.
+   *
+   * @return
+   *   TRUE if this query has been marked with all specified tags, FALSE
+   *   otherwise.
+   */
+  public function hasAllTags();
+
+  /**
+   * Determines if a given query has any specified tag.
+   *
+   * @param $tags
+   *   A variable number of arguments, one for each tag to check.
+   *
+   * @return
+   *   TRUE if this query has been marked with at least one of the specified
+   *   tags, FALSE otherwise.
+   */
+  public function hasAnyTag();
+
+  /**
+   * Adds additional metadata to the query.
+   *
+   * Often, a query may need to provide additional contextual data to alter
+   * hooks. Alter hooks may then use that information to decide if and how
+   * to take action.
+   *
+   * @param $key
+   *   The unique identifier for this piece of metadata. Must be a string that
+   *   follows the same rules as any other PHP identifier.
+   * @param $object
+   *   The additional data to add to the query. May be any valid PHP variable.
+   *
+   * @return QueryAlterableInterface
+   *   The called object.
+   */
+  public function addMetaData($key, $object);
+
+  /**
+   * Retrieves a given piece of metadata.
+   *
+   * @param $key
+   *   The unique identifier for the piece of metadata to retrieve.
+   *
+   * @return
+   *   The previously attached metadata object, or NULL if one doesn't exist.
+   */
+  public function getMetaData($key);
+}
+
+/**
+ * Interface for a query that accepts placeholders.
+ */
+interface QueryPlaceholderInterface {
+
+  /**
+   * Returns a unique identifier for this object.
+   */
+  public function uniqueIdentifier();
+
+  /**
+   * Returns the next placeholder ID for the query.
+   *
+   * @return
+   *   The next available placeholder ID as an integer.
+   */
+  public function nextPlaceholder();
+}
+
+/**
+ * Base class for query builders.
+ *
+ * Note that query builders use PHP's magic __toString() method to compile the
+ * query object into a prepared statement.
+ */
+abstract class Query implements QueryPlaceholderInterface {
+
+  /**
+   * The connection object on which to run this query.
+   *
+   * @var DatabaseConnection
+   */
+  protected $connection;
+
+  /**
+   * The target of the connection object.
+   *
+   * @var string
+   */
+  protected $connectionTarget;
+
+  /**
+   * The key of the connection object.
+   *
+   * @var string
+   */
+  protected $connectionKey;
+
+  /**
+   * The query options to pass on to the connection object.
+   *
+   * @var array
+   */
+  protected $queryOptions;
+
+  /**
+   * A unique identifier for this query object.
+   */
+  protected $uniqueIdentifier;
+
+  /**
+   * The placeholder counter.
+   */
+  protected $nextPlaceholder = 0;
+
+  /**
+   * An array of comments that can be prepended to a query.
+   *
+   * @var array
+   */
+  protected $comments = array();
+
+  /**
+   * Constructs a Query object.
+   *
+   * @param DatabaseConnection $connection
+   *   Database connection object.
+   * @param array $options
+   *   Array of query options.
+   */
+  public function __construct(DatabaseConnection $connection, $options) {
+    $this->uniqueIdentifier = uniqid('', TRUE);
+
+    $this->connection = $connection;
+    $this->connectionKey = $this->connection->getKey();
+    $this->connectionTarget = $this->connection->getTarget();
+
+    $this->queryOptions = $options;
+  }
+
+  /**
+   * Implements the magic __sleep function to disconnect from the database.
+   */
+  public function __sleep() {
+    $keys = get_object_vars($this);
+    unset($keys['connection']);
+    return array_keys($keys);
+  }
+
+  /**
+   * Implements the magic __wakeup function to reconnect to the database.
+   */
+  public function __wakeup() {
+    $this->connection = Database::getConnection($this->connectionTarget, $this->connectionKey);
+  }
+
+  /**
+   * Implements the magic __clone function.
+   */
+  public function __clone() {
+    $this->uniqueIdentifier = uniqid('', TRUE);
+  }
+
+  /**
+   * Runs the query against the database.
+   */
+  abstract protected function execute();
+
+  /**
+   * Implements PHP magic __toString method to convert the query to a string.
+   *
+   * The toString operation is how we compile a query object to a prepared
+   * statement.
+   *
+   * @return
+   *   A prepared statement query string for this object.
+   */
+  abstract public function __toString();
+
+  /**
+   * Returns a unique identifier for this object.
+   */
+  public function uniqueIdentifier() {
+    return $this->uniqueIdentifier;
+  }
+
+  /**
+   * Gets the next placeholder value for this query object.
+   *
+   * @return int
+   *   Next placeholder value.
+   */
+  public function nextPlaceholder() {
+    return $this->nextPlaceholder++;
+  }
+
+  /**
+   * Adds a comment to the query.
+   *
+   * By adding a comment to a query, you can more easily find it in your
+   * query log or the list of active queries on an SQL server. This allows
+   * for easier debugging and allows you to more easily find where a query
+   * with a performance problem is being generated.
+   *
+   * The comment string will be sanitized to remove * / and other characters
+   * that may terminate the string early so as to avoid SQL injection attacks.
+   *
+   * @param $comment
+   *   The comment string to be inserted into the query.
+   *
+   * @return Query
+   *   The called object.
+   */
+  public function comment($comment) {
+    $this->comments[] = $comment;
+    return $this;
+  }
+
+  /**
+   * Returns a reference to the comments array for the query.
+   *
+   * Because this method returns by reference, alter hooks may edit the comments
+   * array directly to make their changes. If just adding comments, however, the
+   * use of comment() is preferred.
+   *
+   * Note that this method must be called by reference as well:
+   * @code
+   * $comments =& $query->getComments();
+   * @endcode
+   *
+   * @return
+   *   A reference to the comments array structure.
+   */
+  public function &getComments() {
+    return $this->comments;
+  }
+}
+
+/**
+ * General class for an abstracted INSERT query.
+ */
+class InsertQuery extends Query {
+
+  /**
+   * The table on which to insert.
+   *
+   * @var string
+   */
+  protected $table;
+
+  /**
+   * An array of fields on which to insert.
+   *
+   * @var array
+   */
+  protected $insertFields = array();
+
+  /**
+   * An array of fields that should be set to their database-defined defaults.
+   *
+   * @var array
+   */
+  protected $defaultFields = array();
+
+  /**
+   * A nested array of values to insert.
+   *
+   * $insertValues is an array of arrays. Each sub-array is either an
+   * associative array whose keys are field names and whose values are field
+   * values to insert, or a non-associative array of values in the same order
+   * as $insertFields.
+   *
+   * Whether multiple insert sets will be run in a single query or multiple
+   * queries is left to individual drivers to implement in whatever manner is
+   * most appropriate. The order of values in each sub-array must match the
+   * order of fields in $insertFields.
+   *
+   * @var array
+   */
+  protected $insertValues = array();
+
+  /**
+   * A SelectQuery object to fetch the rows that should be inserted.
+   *
+   * @var SelectQueryInterface
+   */
+  protected $fromQuery;
+
+  /**
+   * Constructs an InsertQuery object.
+   *
+   * @param DatabaseConnection $connection
+   *   A DatabaseConnection object.
+   * @param string $table
+   *   Name of the table to associate with this query.
+   * @param array $options
+   *   Array of database options.
+   */
+  public function __construct($connection, $table, array $options = array()) {
+    if (!isset($options['return'])) {
+      $options['return'] = Database::RETURN_INSERT_ID;
+    }
+    parent::__construct($connection, $options);
+    $this->table = $table;
+  }
+
+  /**
+   * Adds a set of field->value pairs to be inserted.
+   *
+   * This method may only be called once. Calling it a second time will be
+   * ignored. To queue up multiple sets of values to be inserted at once,
+   * use the values() method.
+   *
+   * @param $fields
+   *   An array of fields on which to insert. This array may be indexed or
+   *   associative. If indexed, the array is taken to be the list of fields.
+   *   If associative, the keys of the array are taken to be the fields and
+   *   the values are taken to be corresponding values to insert. If a
+   *   $values argument is provided, $fields must be indexed.
+   * @param $values
+   *   An array of fields to insert into the database. The values must be
+   *   specified in the same order as the $fields array.
+   *
+   * @return InsertQuery
+   *   The called object.
+   */
+  public function fields(array $fields, array $values = array()) {
+    if (empty($this->insertFields)) {
+      if (empty($values)) {
+        if (!is_numeric(key($fields))) {
+          $values = array_values($fields);
+          $fields = array_keys($fields);
+        }
+      }
+      $this->insertFields = $fields;
+      if (!empty($values)) {
+        $this->insertValues[] = $values;
+      }
+    }
+
+    return $this;
+  }
+
+  /**
+   * Adds another set of values to the query to be inserted.
+   *
+   * If $values is a numeric-keyed array, it will be assumed to be in the same
+   * order as the original fields() call. If it is associative, it may be
+   * in any order as long as the keys of the array match the names of the
+   * fields.
+   *
+   * @param $values
+   *   An array of values to add to the query.
+   *
+   * @return InsertQuery
+   *   The called object.
+   */
+  public function values(array $values) {
+    if (is_numeric(key($values))) {
+      $this->insertValues[] = $values;
+    }
+    else {
+      // Reorder the submitted values to match the fields array.
+      foreach ($this->insertFields as $key) {
+        $insert_values[$key] = $values[$key];
+      }
+      // For consistency, the values array is always numerically indexed.
+      $this->insertValues[] = array_values($insert_values);
+    }
+    return $this;
+  }
+
+  /**
+   * Specifies fields for which the database defaults should be used.
+   *
+   * If you want to force a given field to use the database-defined default,
+   * not NULL or undefined, use this method to instruct the database to use
+   * default values explicitly. In most cases this will not be necessary
+   * unless you are inserting a row that is all default values, as you cannot
+   * specify no values in an INSERT query.
+   *
+   * Specifying a field both in fields() and in useDefaults() is an error
+   * and will not execute.
+   *
+   * @param $fields
+   *   An array of values for which to use the default values
+   *   specified in the table definition.
+   *
+   * @return InsertQuery
+   *   The called object.
+   */
+  public function useDefaults(array $fields) {
+    $this->defaultFields = $fields;
+    return $this;
+  }
+
+  /**
+   * Sets the fromQuery on this InsertQuery object.
+   *
+   * @param SelectQueryInterface $query
+   *   The query to fetch the rows that should be inserted.
+   *
+   * @return InsertQuery
+   *   The called object.
+   */
+  public function from(SelectQueryInterface $query) {
+    $this->fromQuery = $query;
+    return $this;
+  }
+
+  /**
+   * Executes the insert query.
+   *
+   * @return
+   *   The last insert ID of the query, if one exists. If the query
+   *   was given multiple sets of values to insert, the return value is
+   *   undefined. If no fields are specified, this method will do nothing and
+   *   return NULL. That makes it safe to use in multi-insert loops.
+   */
+  public function execute() {
+    // If validation fails, simply return NULL. Note that validation routines
+    // in preExecute() may throw exceptions instead.
+    if (!$this->preExecute()) {
+      return NULL;
+    }
+
+    // If we're selecting from a SelectQuery, finish building the query and
+    // pass it back, as any remaining options are irrelevant.
+    if (!empty($this->fromQuery)) {
+      $sql = (string) $this;
+      // The SelectQuery may contain arguments, load and pass them through.
+      return $this->connection->query($sql, $this->fromQuery->getArguments(), $this->queryOptions);
+    }
+
+    $last_insert_id = 0;
+
+    // Each insert happens in its own query in the degenerate case. However,
+    // we wrap it in a transaction so that it is atomic where possible. On many
+    // databases, such as SQLite, this is also a notable performance boost.
+    $transaction = $this->connection->startTransaction();
+
+    try {
+      $sql = (string) $this;
+      foreach ($this->insertValues as $insert_values) {
+        $last_insert_id = $this->connection->query($sql, $insert_values, $this->queryOptions);
+      }
+    }
+    catch (Exception $e) {
+      // One of the INSERTs failed, rollback the whole batch.
+      $transaction->rollback();
+      // Rethrow the exception for the calling code.
+      throw $e;
+    }
+
+    // Re-initialize the values array so that we can re-use this query.
+    $this->insertValues = array();
+
+    // Transaction commits here where $transaction looses scope.
+
+    return $last_insert_id;
+  }
+
+  /**
+   * Implements PHP magic __toString method to convert the query to a string.
+   *
+   * @return string
+   *   The prepared statement.
+   */
+  public function __toString() {
+    // Create a sanitized comment string to prepend to the query.
+    $comments = $this->connection->makeComment($this->comments);
+
+    // Default fields are always placed first for consistency.
+    $insert_fields = array_merge($this->defaultFields, $this->insertFields);
+
+    if (!empty($this->fromQuery)) {
+      return $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $insert_fields) . ') ' . $this->fromQuery;
+    }
+
+    // For simplicity, we will use the $placeholders array to inject
+    // default keywords even though they are not, strictly speaking,
+    // placeholders for prepared statements.
+    $placeholders = array();
+    $placeholders = array_pad($placeholders, count($this->defaultFields), 'default');
+    $placeholders = array_pad($placeholders, count($this->insertFields), '?');
+
+    return $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $insert_fields) . ') VALUES (' . implode(', ', $placeholders) . ')';
+  }
+
+  /**
+   * Preprocesses and validates the query.
+   *
+   * @return
+   *   TRUE if the validation was successful, FALSE if not.
+   *
+   * @throws FieldsOverlapException
+   * @throws NoFieldsException
+   */
+  public function preExecute() {
+    // Confirm that the user did not try to specify an identical
+    // field and default field.
+    if (array_intersect($this->insertFields, $this->defaultFields)) {
+      throw new FieldsOverlapException('You may not specify the same field to have a value and a schema-default value.');
+    }
+
+    if (!empty($this->fromQuery)) {
+      // We have to assume that the used aliases match the insert fields.
+      // Regular fields are added to the query before expressions, maintain the
+      // same order for the insert fields.
+      // This behavior can be overridden by calling fields() manually as only the
+      // first call to fields() does have an effect.
+      $this->fields(array_merge(array_keys($this->fromQuery->getFields()), array_keys($this->fromQuery->getExpressions())));
+    }
+    else {
+      // Don't execute query without fields.
+      if (count($this->insertFields) + count($this->defaultFields) == 0) {
+        throw new NoFieldsException('There are no fields available to insert with.');
+      }
+    }
+
+    // If no values have been added, silently ignore this query. This can happen
+    // if values are added conditionally, so we don't want to throw an
+    // exception.
+    if (!isset($this->insertValues[0]) && count($this->insertFields) > 0 && empty($this->fromQuery)) {
+      return FALSE;
+    }
+    return TRUE;
+  }
+}
+
+/**
+ * General class for an abstracted DELETE operation.
+ */
+class DeleteQuery extends Query implements QueryConditionInterface {
+
+  /**
+   * The table from which to delete.
+   *
+   * @var string
+   */
+  protected $table;
+
+  /**
+   * The condition object for this query.
+   *
+   * Condition handling is handled via composition.
+   *
+   * @var DatabaseCondition
+   */
+  protected $condition;
+
+  /**
+   * Constructs a DeleteQuery object.
+   *
+   * @param DatabaseConnection $connection
+   *   A DatabaseConnection object.
+   * @param string $table
+   *   Name of the table to associate with this query.
+   * @param array $options
+   *   Array of database options.
+   */
+  public function __construct(DatabaseConnection $connection, $table, array $options = array()) {
+    $options['return'] = Database::RETURN_AFFECTED;
+    parent::__construct($connection, $options);
+    $this->table = $table;
+
+    $this->condition = new DatabaseCondition('AND');
+  }
+
+  /**
+   * Implements QueryConditionInterface::condition().
+   */
+  public function condition($field, $value = NULL, $operator = NULL) {
+    $this->condition->condition($field, $value, $operator);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::isNull().
+   */
+  public function isNull($field) {
+    $this->condition->isNull($field);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::isNotNull().
+   */
+  public function isNotNull($field) {
+    $this->condition->isNotNull($field);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::exists().
+   */
+  public function exists(SelectQueryInterface $select) {
+    $this->condition->exists($select);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::notExists().
+   */
+  public function notExists(SelectQueryInterface $select) {
+    $this->condition->notExists($select);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::conditions().
+   */
+  public function &conditions() {
+    return $this->condition->conditions();
+  }
+
+  /**
+   * Implements QueryConditionInterface::arguments().
+   */
+  public function arguments() {
+    return $this->condition->arguments();
+  }
+
+  /**
+   * Implements QueryConditionInterface::where().
+   */
+  public function where($snippet, $args = array()) {
+    $this->condition->where($snippet, $args);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::compile().
+   */
+  public function compile(DatabaseConnection $connection, QueryPlaceholderInterface $queryPlaceholder) {
+    return $this->condition->compile($connection, $queryPlaceholder);
+  }
+
+  /**
+   * Implements QueryConditionInterface::compiled().
+   */
+  public function compiled() {
+    return $this->condition->compiled();
+  }
+
+  /**
+   * Executes the DELETE query.
+   *
+   * @return
+   *   The return value is dependent on the database connection.
+   */
+  public function execute() {
+    $values = array();
+    if (count($this->condition)) {
+      $this->condition->compile($this->connection, $this);
+      $values = $this->condition->arguments();
+    }
+
+    return $this->connection->query((string) $this, $values, $this->queryOptions);
+  }
+
+  /**
+   * Implements PHP magic __toString method to convert the query to a string.
+   *
+   * @return string
+   *   The prepared statement.
+   */
+  public function __toString() {
+    // Create a sanitized comment string to prepend to the query.
+    $comments = $this->connection->makeComment($this->comments);
+
+    $query = $comments . 'DELETE FROM {' . $this->connection->escapeTable($this->table) . '} ';
+
+    if (count($this->condition)) {
+
+      $this->condition->compile($this->connection, $this);
+      $query .= "\nWHERE " . $this->condition;
+    }
+
+    return $query;
+  }
+}
+
+
+/**
+ * General class for an abstracted TRUNCATE operation.
+ */
+class TruncateQuery extends Query {
+
+  /**
+   * The table to truncate.
+   *
+   * @var string
+   */
+  protected $table;
+
+  /**
+   * Constructs a TruncateQuery object.
+   *
+   * @param DatabaseConnection $connection
+   *   A DatabaseConnection object.
+   * @param string $table
+   *   Name of the table to associate with this query.
+   * @param array $options
+   *   Array of database options.
+   */
+  public function __construct(DatabaseConnection $connection, $table, array $options = array()) {
+    $options['return'] = Database::RETURN_AFFECTED;
+    parent::__construct($connection, $options);
+    $this->table = $table;
+  }
+
+  /**
+   * Implements QueryConditionInterface::compile().
+   */
+  public function compile(DatabaseConnection $connection, QueryPlaceholderInterface $queryPlaceholder) {
+    return $this->condition->compile($connection, $queryPlaceholder);
+  }
+
+  /**
+   * Implements QueryConditionInterface::compiled().
+   */
+  public function compiled() {
+    return $this->condition->compiled();
+  }
+
+  /**
+   * Executes the TRUNCATE query.
+   *
+   * @return
+   *   Return value is dependent on the database type.
+   */
+  public function execute() {
+    return $this->connection->query((string) $this, array(), $this->queryOptions);
+  }
+
+  /**
+   * Implements PHP magic __toString method to convert the query to a string.
+   *
+   * @return string
+   *   The prepared statement.
+   */
+  public function __toString() {
+    // Create a sanitized comment string to prepend to the query.
+    $comments = $this->connection->makeComment($this->comments);
+
+    // In most cases, TRUNCATE is not a transaction safe statement as it is a
+    // DDL statement which results in an implicit COMMIT. When we are in a
+    // transaction, fallback to the slower, but transactional, DELETE.
+    // PostgreSQL also locks the entire table for a TRUNCATE strongly reducing
+    // the concurrency with other transactions.
+    if ($this->connection->inTransaction()) {
+      return $comments . 'DELETE FROM {' . $this->connection->escapeTable($this->table) . '}';
+    }
+    else {
+      return $comments . 'TRUNCATE {' . $this->connection->escapeTable($this->table) . '} ';
+    }
+  }
+}
+
+/**
+ * General class for an abstracted UPDATE operation.
+ */
+class UpdateQuery extends Query implements QueryConditionInterface {
+
+  /**
+   * The table to update.
+   *
+   * @var string
+   */
+  protected $table;
+
+  /**
+   * An array of fields that will be updated.
+   *
+   * @var array
+   */
+  protected $fields = array();
+
+  /**
+   * An array of values to update to.
+   *
+   * @var array
+   */
+  protected $arguments = array();
+
+  /**
+   * The condition object for this query.
+   *
+   * Condition handling is handled via composition.
+   *
+   * @var DatabaseCondition
+   */
+  protected $condition;
+
+  /**
+   * Array of fields to update to an expression in case of a duplicate record.
+   *
+   * This variable is a nested array in the following format:
+   * @code
+   * <some field> => array(
+   *  'condition' => <condition to execute, as a string>,
+   *  'arguments' => <array of arguments for condition, or NULL for none>,
+   * );
+   * @endcode
+   *
+   * @var array
+   */
+  protected $expressionFields = array();
+
+  /**
+   * Constructs an UpdateQuery object.
+   *
+   * @param DatabaseConnection $connection
+   *   A DatabaseConnection object.
+   * @param string $table
+   *   Name of the table to associate with this query.
+   * @param array $options
+   *   Array of database options.
+   */
+  public function __construct(DatabaseConnection $connection, $table, array $options = array()) {
+    $options['return'] = Database::RETURN_AFFECTED;
+    parent::__construct($connection, $options);
+    $this->table = $table;
+
+    $this->condition = new DatabaseCondition('AND');
+  }
+
+  /**
+   * Implements QueryConditionInterface::condition().
+   */
+  public function condition($field, $value = NULL, $operator = NULL) {
+    $this->condition->condition($field, $value, $operator);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::isNull().
+   */
+  public function isNull($field) {
+    $this->condition->isNull($field);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::isNotNull().
+   */
+  public function isNotNull($field) {
+    $this->condition->isNotNull($field);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::exists().
+   */
+  public function exists(SelectQueryInterface $select) {
+    $this->condition->exists($select);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::notExists().
+   */
+  public function notExists(SelectQueryInterface $select) {
+    $this->condition->notExists($select);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::conditions().
+   */
+  public function &conditions() {
+    return $this->condition->conditions();
+  }
+
+  /**
+   * Implements QueryConditionInterface::arguments().
+   */
+  public function arguments() {
+    return $this->condition->arguments();
+  }
+
+  /**
+   * Implements QueryConditionInterface::where().
+   */
+  public function where($snippet, $args = array()) {
+    $this->condition->where($snippet, $args);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::compile().
+   */
+  public function compile(DatabaseConnection $connection, QueryPlaceholderInterface $queryPlaceholder) {
+    return $this->condition->compile($connection, $queryPlaceholder);
+  }
+
+  /**
+   * Implements QueryConditionInterface::compiled().
+   */
+  public function compiled() {
+    return $this->condition->compiled();
+  }
+
+  /**
+   * Adds a set of field->value pairs to be updated.
+   *
+   * @param $fields
+   *   An associative array of fields to write into the database. The array keys
+   *   are the field names and the values are the values to which to set them.
+   *
+   * @return UpdateQuery
+   *   The called object.
+   */
+  public function fields(array $fields) {
+    $this->fields = $fields;
+    return $this;
+  }
+
+  /**
+   * Specifies fields to be updated as an expression.
+   *
+   * Expression fields are cases such as counter=counter+1. This method takes
+   * precedence over fields().
+   *
+   * @param $field
+   *   The field to set.
+   * @param $expression
+   *   The field will be set to the value of this expression. This parameter
+   *   may include named placeholders.
+   * @param $arguments
+   *   If specified, this is an array of key/value pairs for named placeholders
+   *   corresponding to the expression.
+   *
+   * @return UpdateQuery
+   *   The called object.
+   */
+  public function expression($field, $expression, array $arguments = NULL) {
+    $this->expressionFields[$field] = array(
+      'expression' => $expression,
+      'arguments' => $arguments,
+    );
+
+    return $this;
+  }
+
+  /**
+   * Executes the UPDATE query.
+   *
+   * @return
+   *   The number of rows affected by the update.
+   */
+  public function execute() {
+
+    // Expressions take priority over literal fields, so we process those first
+    // and remove any literal fields that conflict.
+    $fields = $this->fields;
+    $update_values = array();
+    foreach ($this->expressionFields as $field => $data) {
+      if (!empty($data['arguments'])) {
+        $update_values += $data['arguments'];
+      }
+      unset($fields[$field]);
+    }
+
+    // Because we filter $fields the same way here and in __toString(), the
+    // placeholders will all match up properly.
+    $max_placeholder = 0;
+    foreach ($fields as $field => $value) {
+      $update_values[':db_update_placeholder_' . ($max_placeholder++)] = $value;
+    }
+
+    if (count($this->condition)) {
+      $this->condition->compile($this->connection, $this);
+      $update_values = array_merge($update_values, $this->condition->arguments());
+    }
+
+    return $this->connection->query((string) $this, $update_values, $this->queryOptions);
+  }
+
+  /**
+   * Implements PHP magic __toString method to convert the query to a string.
+   *
+   * @return string
+   *   The prepared statement.
+   */
+  public function __toString() {
+    // Create a sanitized comment string to prepend to the query.
+    $comments = $this->connection->makeComment($this->comments);
+
+    // Expressions take priority over literal fields, so we process those first
+    // and remove any literal fields that conflict.
+    $fields = $this->fields;
+    $update_fields = array();
+    foreach ($this->expressionFields as $field => $data) {
+      $update_fields[] = $field . '=' . $data['expression'];
+      unset($fields[$field]);
+    }
+
+    $max_placeholder = 0;
+    foreach ($fields as $field => $value) {
+      $update_fields[] = $field . '=:db_update_placeholder_' . ($max_placeholder++);
+    }
+
+    $query = $comments . 'UPDATE {' . $this->connection->escapeTable($this->table) . '} SET ' . implode(', ', $update_fields);
+
+    if (count($this->condition)) {
+      $this->condition->compile($this->connection, $this);
+      // There is an implicit string cast on $this->condition.
+      $query .= "\nWHERE " . $this->condition;
+    }
+
+    return $query;
+  }
+
+}
+
+/**
+ * General class for an abstracted MERGE query operation.
+ *
+ * An ANSI SQL:2003 compatible database would run the following query:
+ *
+ * @code
+ * MERGE INTO table_name_1 USING table_name_2 ON (condition)
+ *   WHEN MATCHED THEN
+ *   UPDATE SET column1 = value1 [, column2 = value2 ...]
+ *   WHEN NOT MATCHED THEN
+ *   INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...
+ * @endcode
+ *
+ * Other databases (most notably MySQL, PostgreSQL and SQLite) will emulate
+ * this statement by running a SELECT and then INSERT or UPDATE.
+ *
+ * By default, the two table names are identical and they are passed into the
+ * the constructor. table_name_2 can be specified by the
+ * MergeQuery::conditionTable() method. It can be either a string or a
+ * subquery.
+ *
+ * The condition is built exactly like SelectQuery or UpdateQuery conditions,
+ * the UPDATE query part is built similarly like an UpdateQuery and finally the
+ * INSERT query part is built similarly like an InsertQuery. However, both
+ * UpdateQuery and InsertQuery has a fields method so
+ * MergeQuery::updateFields() and MergeQuery::insertFields() needs to be called
+ * instead. MergeQuery::fields() can also be called which calls both of these
+ * methods as the common case is to use the same column-value pairs for both
+ * INSERT and UPDATE. However, this is not mandatory. Another convinient
+ * wrapper is MergeQuery::key() which adds the same column-value pairs to the
+ * condition and the INSERT query part.
+ *
+ * Several methods (key(), fields(), insertFields()) can be called to set a
+ * key-value pair for the INSERT query part. Subsequent calls for the same
+ * fields override the earlier ones. The same is true for UPDATE and key(),
+ * fields() and updateFields().
+ */
+class MergeQuery extends Query implements QueryConditionInterface {
+  /**
+   * Returned by execute() if an INSERT query has been executed.
+   */
+  const STATUS_INSERT = 1;
+
+  /**
+   * Returned by execute() if an UPDATE query has been executed.
+   */
+  const STATUS_UPDATE = 2;
+
+  /**
+   * The table to be used for INSERT and UPDATE.
+   *
+   * @var string
+   */
+  protected $table;
+
+  /**
+   * The table or subquery to be used for the condition.
+   */
+  protected $conditionTable;
+
+  /**
+   * An array of fields on which to insert.
+   *
+   * @var array
+   */
+  protected $insertFields = array();
+
+  /**
+   * An array of fields which should be set to their database-defined defaults.
+   *
+   * Used on INSERT.
+   *
+   * @var array
+   */
+  protected $defaultFields = array();
+
+  /**
+   * An array of values to be inserted.
+   *
+   * @var string
+   */
+  protected $insertValues = array();
+
+  /**
+   * An array of fields that will be updated.
+   *
+   * @var array
+   */
+  protected $updateFields = array();
+
+  /**
+   * Array of fields to update to an expression in case of a duplicate record.
+   *
+   * This variable is a nested array in the following format:
+   * @code
+   * <some field> => array(
+   *  'condition' => <condition to execute, as a string>,
+   *  'arguments' => <array of arguments for condition, or NULL for none>,
+   * );
+   * @endcode
+   *
+   * @var array
+   */
+  protected $expressionFields = array();
+
+  /**
+   * Flag indicating whether an UPDATE is necessary.
+   *
+   * @var boolean
+   */
+  protected $needsUpdate = FALSE;
+
+  /**
+  * Constructs a MergeQuery object.
+  *
+  * @param DatabaseConnection $connection
+  *   A DatabaseConnection object.
+  * @param string $table
+  *   Name of the table to associate with this query.
+  * @param array $options
+  *   Array of database options.
+  */
+  public function __construct(DatabaseConnection $connection, $table, array $options = array()) {
+    $options['return'] = Database::RETURN_AFFECTED;
+    parent::__construct($connection, $options);
+    $this->table = $table;
+    $this->conditionTable = $table;
+    $this->condition = new DatabaseCondition('AND');
+  }
+
+  /**
+   * Sets the table or subquery to be used for the condition.
+   *
+   * @param $table
+   *   The table name or the subquery to be used. Use a SelectQuery object to
+   *   pass in a subquery.
+   *
+   * @return MergeQuery
+   *   The called object.
+   */
+  protected function conditionTable($table) {
+    $this->conditionTable = $table;
+    return $this;
+  }
+
+  /**
+   * Adds a set of field->value pairs to be updated.
+   *
+   * @param $fields
+   *   An associative array of fields to write into the database. The array keys
+   *   are the field names and the values are the values to which to set them.
+   *
+   * @return MergeQuery
+   *   The called object.
+   */
+  public function updateFields(array $fields) {
+    $this->updateFields = $fields;
+    $this->needsUpdate = TRUE;
+    return $this;
+  }
+
+  /**
+   * Specifies fields to be updated as an expression.
+   *
+   * Expression fields are cases such as counter = counter + 1. This method
+   * takes precedence over MergeQuery::updateFields() and it's wrappers,
+   * MergeQuery::key() and MergeQuery::fields().
+   *
+   * @param $field
+   *   The field to set.
+   * @param $expression
+   *   The field will be set to the value of this expression. This parameter
+   *   may include named placeholders.
+   * @param $arguments
+   *   If specified, this is an array of key/value pairs for named placeholders
+   *   corresponding to the expression.
+   *
+   * @return MergeQuery
+   *   The called object.
+   */
+  public function expression($field, $expression, array $arguments = NULL) {
+    $this->expressionFields[$field] = array(
+      'expression' => $expression,
+      'arguments' => $arguments,
+    );
+    $this->needsUpdate = TRUE;
+    return $this;
+  }
+
+  /**
+   * Adds a set of field->value pairs to be inserted.
+   *
+   * @param $fields
+   *   An array of fields on which to insert. This array may be indexed or
+   *   associative. If indexed, the array is taken to be the list of fields.
+   *   If associative, the keys of the array are taken to be the fields and
+   *   the values are taken to be corresponding values to insert. If a
+   *   $values argument is provided, $fields must be indexed.
+   * @param $values
+   *   An array of fields to insert into the database. The values must be
+   *   specified in the same order as the $fields array.
+   *
+   * @return MergeQuery
+   *   The called object.
+   */
+  public function insertFields(array $fields, array $values = array()) {
+    if ($values) {
+      $fields = array_combine($fields, $values);
+    }
+    $this->insertFields = $fields;
+    return $this;
+  }
+
+  /**
+   * Specifies fields for which the database-defaults should be used.
+   *
+   * If you want to force a given field to use the database-defined default,
+   * not NULL or undefined, use this method to instruct the database to use
+   * default values explicitly. In most cases this will not be necessary
+   * unless you are inserting a row that is all default values, as you cannot
+   * specify no values in an INSERT query.
+   *
+   * Specifying a field both in fields() and in useDefaults() is an error
+   * and will not execute.
+   *
+   * @param $fields
+   *   An array of values for which to use the default values
+   *   specified in the table definition.
+   *
+   * @return MergeQuery
+   *   The called object.
+   */
+  public function useDefaults(array $fields) {
+    $this->defaultFields = $fields;
+    return $this;
+  }
+
+  /**
+   * Sets common field-value pairs in the INSERT and UPDATE query parts.
+   *
+   * This method should only be called once. It may be called either
+   * with a single associative array or two indexed arrays. If called
+   * with an associative array, the keys are taken to be the fields
+   * and the values are taken to be the corresponding values to set.
+   * If called with two arrays, the first array is taken as the fields
+   * and the second array is taken as the corresponding values.
+   *
+   * @param $fields
+   *   An array of fields to insert, or an associative array of fields and
+   *   values. The keys of the array are taken to be the fields and the values
+   *   are taken to be corresponding values to insert.
+   * @param $values
+   *   An array of values to set into the database. The values must be
+   *   specified in the same order as the $fields array.
+   *
+   * @return MergeQuery
+   *   The called object.
+   */
+  public function fields(array $fields, array $values = array()) {
+    if ($values) {
+      $fields = array_combine($fields, $values);
+    }
+    foreach ($fields as $key => $value) {
+      $this->insertFields[$key] = $value;
+      $this->updateFields[$key] = $value;
+    }
+    $this->needsUpdate = TRUE;
+    return $this;
+  }
+
+  /**
+   * Sets the key field(s) to be used as conditions for this query.
+   *
+   * This method should only be called once. It may be called either
+   * with a single associative array or two indexed arrays. If called
+   * with an associative array, the keys are taken to be the fields
+   * and the values are taken to be the corresponding values to set.
+   * If called with two arrays, the first array is taken as the fields
+   * and the second array is taken as the corresponding values.
+   *
+   * The fields are copied to the condition of the query and the INSERT part.
+   * If no other method is called, the UPDATE will become a no-op.
+   *
+   * @param $fields
+   *   An array of fields to set, or an associative array of fields and values.
+   * @param $values
+   *   An array of values to set into the database. The values must be
+   *   specified in the same order as the $fields array.
+   *
+   * @return MergeQuery
+   *   The called object.
+   */
+  public function key(array $fields, array $values = array()) {
+    if ($values) {
+      $fields = array_combine($fields, $values);
+    }
+    foreach ($fields as $key => $value) {
+      $this->insertFields[$key] = $value;
+      $this->condition($key, $value);
+    }
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::condition().
+   */
+  public function condition($field, $value = NULL, $operator = NULL) {
+    $this->condition->condition($field, $value, $operator);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::isNull().
+   */
+  public function isNull($field) {
+    $this->condition->isNull($field);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::isNotNull().
+   */
+  public function isNotNull($field) {
+    $this->condition->isNotNull($field);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::exists().
+   */
+  public function exists(SelectQueryInterface $select) {
+    $this->condition->exists($select);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::notExists().
+   */
+  public function notExists(SelectQueryInterface $select) {
+    $this->condition->notExists($select);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::conditions().
+   */
+  public function &conditions() {
+    return $this->condition->conditions();
+  }
+
+  /**
+   * Implements QueryConditionInterface::arguments().
+   */
+  public function arguments() {
+    return $this->condition->arguments();
+  }
+
+  /**
+   * Implements QueryConditionInterface::where().
+   */
+  public function where($snippet, $args = array()) {
+    $this->condition->where($snippet, $args);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::compile().
+   */
+  public function compile(DatabaseConnection $connection, QueryPlaceholderInterface $queryPlaceholder) {
+    return $this->condition->compile($connection, $queryPlaceholder);
+  }
+
+  /**
+   * Implements QueryConditionInterface::compiled().
+   */
+  public function compiled() {
+    return $this->condition->compiled();
+  }
+
+  /**
+   * Implements PHP magic __toString method to convert the query to a string.
+   *
+   * In the degenerate case, there is no string-able query as this operation
+   * is potentially two queries.
+   *
+   * @return string
+   *   The prepared query statement.
+   */
+  public function __toString() {
+  }
+
+  public function execute() {
+    if (!count($this->condition)) {
+      throw new InvalidMergeQueryException(t('Invalid merge query: no conditions'));
+    }
+    $select = $this->connection->select($this->conditionTable)
+      ->condition($this->condition);
+    $select->addExpression('1');
+    if (!$select->execute()->fetchField()) {
+      try {
+        $insert = $this->connection->insert($this->table)->fields($this->insertFields);
+        if ($this->defaultFields) {
+          $insert->useDefaults($this->defaultFields);
+        }
+        $insert->execute();
+        return self::STATUS_INSERT;
+      }
+      catch (Exception $e) {
+        // The insert query failed, maybe it's because a racing insert query
+        // beat us in inserting the same row. Retry the select query, if it
+        // returns a row, ignore the error and continue with the update
+        // query below.
+        if (!$select->execute()->fetchField()) {
+          throw $e;
+        }
+      }
+    }
+    if ($this->needsUpdate) {
+      $update = $this->connection->update($this->table)
+        ->fields($this->updateFields)
+        ->condition($this->condition);
+      if ($this->expressionFields) {
+        foreach ($this->expressionFields as $field => $data) {
+          $update->expression($field, $data['expression'], $data['arguments']);
+        }
+      }
+      $update->execute();
+      return self::STATUS_UPDATE;
+     }
+  }
+}
+
+/**
+ * Generic class for a series of conditions in a query.
+ */
+class DatabaseCondition implements QueryConditionInterface, Countable {
+
+  /**
+   * Array of conditions.
+   *
+   * @var array
+   */
+  protected $conditions = array();
+
+  /**
+   * Array of arguments.
+   *
+   * @var array
+   */
+  protected $arguments = array();
+
+  /**
+   * Whether the conditions have been changed.
+   *
+   * TRUE if the condition has been changed since the last compile.
+   * FALSE if the condition has been compiled and not changed.
+   *
+   * @var bool
+   */
+  protected $changed = TRUE;
+
+  /**
+   * The identifier of the query placeholder this condition has been compiled against.
+   */
+  protected $queryPlaceholderIdentifier;
+
+  /**
+   * Constructs a DataBaseCondition object.
+   *
+   * @param string $conjunction
+   *   The operator to use to combine conditions: 'AND' or 'OR'.
+   */
+  public function __construct($conjunction) {
+    $this->conditions['#conjunction'] = $conjunction;
+  }
+
+  /**
+   * Implements Countable::count().
+   *
+   * Returns the size of this conditional. The size of the conditional is the
+   * size of its conditional array minus one, because one element is the the
+   * conjunction.
+   */
+  public function count() {
+    return count($this->conditions) - 1;
+  }
+
+  /**
+   * Implements QueryConditionInterface::condition().
+   */
+  public function condition($field, $value = NULL, $operator = NULL) {
+    if (!isset($operator)) {
+      if (is_array($value)) {
+        $operator = 'IN';
+      }
+      elseif (!isset($value)) {
+        $operator = 'IS NULL';
+      }
+      else {
+        $operator = '=';
+      }
+    }
+    $this->conditions[] = array(
+      'field' => $field,
+      'value' => $value,
+      'operator' => $operator,
+    );
+
+    $this->changed = TRUE;
+
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::where().
+   */
+  public function where($snippet, $args = array()) {
+    $this->conditions[] = array(
+      'field' => $snippet,
+      'value' => $args,
+      'operator' => NULL,
+    );
+    $this->changed = TRUE;
+
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::isNull().
+   */
+  public function isNull($field) {
+    return $this->condition($field);
+  }
+
+  /**
+   * Implements QueryConditionInterface::isNotNull().
+   */
+  public function isNotNull($field) {
+    return $this->condition($field, NULL, 'IS NOT NULL');
+  }
+
+  /**
+   * Implements QueryConditionInterface::exists().
+   */
+  public function exists(SelectQueryInterface $select) {
+    return $this->condition('', $select, 'EXISTS');
+  }
+
+  /**
+   * Implements QueryConditionInterface::notExists().
+   */
+  public function notExists(SelectQueryInterface $select) {
+    return $this->condition('', $select, 'NOT EXISTS');
+  }
+
+  /**
+   * Implements QueryConditionInterface::conditions().
+   */
+  public function &conditions() {
+    return $this->conditions;
+  }
+
+  /**
+   * Implements QueryConditionInterface::arguments().
+   */
+  public function arguments() {
+    // If the caller forgot to call compile() first, refuse to run.
+    if ($this->changed) {
+      return NULL;
+    }
+    return $this->arguments;
+  }
+
+  /**
+   * Implements QueryConditionInterface::compile().
+   */
+  public function compile(DatabaseConnection $connection, QueryPlaceholderInterface $queryPlaceholder) {
+    // Re-compile if this condition changed or if we are compiled against a
+    // different query placeholder object.
+    if ($this->changed || isset($this->queryPlaceholderIdentifier) && ($this->queryPlaceholderIdentifier != $queryPlaceholder->uniqueIdentifier())) {
+      $this->queryPlaceholderIdentifier = $queryPlaceholder->uniqueIdentifier();
+
+      $condition_fragments = array();
+      $arguments = array();
+
+      $conditions = $this->conditions;
+      $conjunction = $conditions['#conjunction'];
+      unset($conditions['#conjunction']);
+      foreach ($conditions as $condition) {
+        if (empty($condition['operator'])) {
+          // This condition is a literal string, so let it through as is.
+          $condition_fragments[] = ' (' . $condition['field'] . ') ';
+          $arguments += $condition['value'];
+        }
+        else {
+          // It's a structured condition, so parse it out accordingly.
+          // Note that $condition['field'] will only be an object for a dependent
+          // DatabaseCondition object, not for a dependent subquery.
+          if ($condition['field'] instanceof QueryConditionInterface) {
+            // Compile the sub-condition recursively and add it to the list.
+            $condition['field']->compile($connection, $queryPlaceholder);
+            $condition_fragments[] = '(' . (string) $condition['field'] . ')';
+            $arguments += $condition['field']->arguments();
+          }
+          else {
+            // For simplicity, we treat all operators as the same data structure.
+            // In the typical degenerate case, this won't get changed.
+            $operator_defaults = array(
+              'prefix' => '',
+              'postfix' => '',
+              'delimiter' => '',
+              'operator' => $condition['operator'],
+              'use_value' => TRUE,
+            );
+            $operator = $connection->mapConditionOperator($condition['operator']);
+            if (!isset($operator)) {
+              $operator = $this->mapConditionOperator($condition['operator']);
+            }
+            $operator += $operator_defaults;
+
+            $placeholders = array();
+            if ($condition['value'] instanceof SelectQueryInterface) {
+              $condition['value']->compile($connection, $queryPlaceholder);
+              $placeholders[] = (string) $condition['value'];
+              $arguments += $condition['value']->arguments();
+              // Subqueries are the actual value of the operator, we don't
+              // need to add another below.
+              $operator['use_value'] = FALSE;
+            }
+            // We assume that if there is a delimiter, then the value is an
+            // array. If not, it is a scalar. For simplicity, we first convert
+            // up to an array so that we can build the placeholders in the same way.
+            elseif (!$operator['delimiter']) {
+              $condition['value'] = array($condition['value']);
+            }
+            if ($operator['use_value']) {
+              foreach ($condition['value'] as $value) {
+                $placeholder = ':db_condition_placeholder_' . $queryPlaceholder->nextPlaceholder();
+                $arguments[$placeholder] = $value;
+                $placeholders[] = $placeholder;
+              }
+            }
+            $condition_fragments[] = ' (' . $connection->escapeField($condition['field']) . ' ' . $operator['operator'] . ' ' . $operator['prefix'] . implode($operator['delimiter'], $placeholders) . $operator['postfix'] . ') ';
+          }
+        }
+      }
+
+      $this->changed = FALSE;
+      $this->stringVersion = implode($conjunction, $condition_fragments);
+      $this->arguments = $arguments;
+    }
+  }
+
+  /**
+   * Implements QueryConditionInterface::compiled().
+   */
+  public function compiled() {
+    return !$this->changed;
+  }
+
+  /**
+   * Implements PHP magic __toString method to convert the conditions to string.
+   *
+   * @return string
+   *   A string version of the conditions.
+   */
+  public function __toString() {
+    // If the caller forgot to call compile() first, refuse to run.
+    if ($this->changed) {
+      return NULL;
+    }
+    return $this->stringVersion;
+  }
+
+  /**
+   * PHP magic __clone() method.
+   *
+   * Only copies fields that implement QueryConditionInterface. Also sets
+   * $this->changed to TRUE.
+   */
+  function __clone() {
+    $this->changed = TRUE;
+    foreach ($this->conditions as $key => $condition) {
+      if ($key !== '#conjunction') {
+        if ($condition['field'] instanceOf QueryConditionInterface) {
+          $this->conditions[$key]['field'] = clone($condition['field']);
+        }
+        if ($condition['value'] instanceOf SelectQueryInterface) {
+          $this->conditions[$key]['value'] = clone($condition['value']);
+        }
+      }
+    }
+  }
+
+  /**
+   * Gets any special processing requirements for the condition operator.
+   *
+   * Some condition types require special processing, such as IN, because
+   * the value data they pass in is not a simple value. This is a simple
+   * overridable lookup function.
+   *
+   * @param $operator
+   *   The condition operator, such as "IN", "BETWEEN", etc. Case-sensitive.
+   *
+   * @return
+   *   The extra handling directives for the specified operator, or NULL.
+   */
+  protected function mapConditionOperator($operator) {
+    // $specials does not use drupal_static as its value never changes.
+    static $specials = array(
+      'BETWEEN' => array('delimiter' => ' AND '),
+      'IN' => array('delimiter' => ', ', 'prefix' => ' (', 'postfix' => ')'),
+      'NOT IN' => array('delimiter' => ', ', 'prefix' => ' (', 'postfix' => ')'),
+      'EXISTS' => array('prefix' => ' (', 'postfix' => ')'),
+      'NOT EXISTS' => array('prefix' => ' (', 'postfix' => ')'),
+      'IS NULL' => array('use_value' => FALSE),
+      'IS NOT NULL' => array('use_value' => FALSE),
+      // Use backslash for escaping wildcard characters.
+      'LIKE' => array('postfix' => " ESCAPE '\\\\'"),
+      'NOT LIKE' => array('postfix' => " ESCAPE '\\\\'"),
+      // These ones are here for performance reasons.
+      '=' => array(),
+      '<' => array(),
+      '>' => array(),
+      '>=' => array(),
+      '<=' => array(),
+    );
+    if (isset($specials[$operator])) {
+      $return = $specials[$operator];
+    }
+    else {
+      // We need to upper case because PHP index matches are case sensitive but
+      // do not need the more expensive drupal_strtoupper because SQL statements are ASCII.
+      $operator = strtoupper($operator);
+      $return = isset($specials[$operator]) ? $specials[$operator] : array();
+    }
+
+    $return += array('operator' => $operator);
+
+    return $return;
+  }
+
+}
+
+/**
+ * @} End of "addtogroup database".
+ */
diff --git a/htmltest/includes/database/schema.inc b/htmltest/includes/database/schema.inc
new file mode 100644
index 00000000..d3943b29
--- /dev/null
+++ b/htmltest/includes/database/schema.inc
@@ -0,0 +1,727 @@
+<?php
+
+/**
+ * @file
+ * Generic Database schema code.
+ */
+
+require_once dirname(__FILE__) . '/query.inc';
+
+/**
+ * @defgroup schemaapi Schema API
+ * @{
+ * API to handle database schemas.
+ *
+ * A Drupal schema definition is an array structure representing one or
+ * more tables and their related keys and indexes. A schema is defined by
+ * hook_schema(), which usually lives in a modulename.install file.
+ *
+ * By implementing hook_schema() and specifying the tables your module
+ * declares, you can easily create and drop these tables on all
+ * supported database engines. You don't have to deal with the
+ * different SQL dialects for table creation and alteration of the
+ * supported database engines.
+ *
+ * hook_schema() should return an array with a key for each table that
+ * the module defines.
+ *
+ * The following keys are defined:
+ *   - 'description': A string in non-markup plain text describing this table
+ *     and its purpose. References to other tables should be enclosed in
+ *     curly-brackets. For example, the node_revisions table
+ *     description field might contain "Stores per-revision title and
+ *     body data for each {node}."
+ *   - 'fields': An associative array ('fieldname' => specification)
+ *     that describes the table's database columns. The specification
+ *     is also an array. The following specification parameters are defined:
+ *     - 'description': A string in non-markup plain text describing this field
+ *       and its purpose. References to other tables should be enclosed in
+ *       curly-brackets. For example, the node table vid field
+ *       description might contain "Always holds the largest (most
+ *       recent) {node_revision}.vid value for this nid."
+ *     - 'type': The generic datatype: 'char', 'varchar', 'text', 'blob', 'int',
+ *       'float', 'numeric', or 'serial'. Most types just map to the according
+ *       database engine specific datatypes. Use 'serial' for auto incrementing
+ *       fields. This will expand to 'INT auto_increment' on MySQL.
+ *     - 'mysql_type', 'pgsql_type', 'sqlite_type', etc.: If you need to
+ *       use a record type not included in the officially supported list
+ *       of types above, you can specify a type for each database
+ *       backend. In this case, you can leave out the type parameter,
+ *       but be advised that your schema will fail to load on backends that
+ *       do not have a type specified. A possible solution can be to
+ *       use the "text" type as a fallback.
+ *     - 'serialize': A boolean indicating whether the field will be stored as
+ *       a serialized string.
+ *     - 'size': The data size: 'tiny', 'small', 'medium', 'normal',
+ *       'big'. This is a hint about the largest value the field will
+ *       store and determines which of the database engine specific
+ *       datatypes will be used (e.g. on MySQL, TINYINT vs. INT vs. BIGINT).
+ *       'normal', the default, selects the base type (e.g. on MySQL,
+ *       INT, VARCHAR, BLOB, etc.).
+ *       Not all sizes are available for all data types. See
+ *       DatabaseSchema::getFieldTypeMap() for possible combinations.
+ *     - 'not null': If true, no NULL values will be allowed in this
+ *       database column. Defaults to false.
+ *     - 'default': The field's default value. The PHP type of the
+ *       value matters: '', '0', and 0 are all different. If you
+ *       specify '0' as the default value for a type 'int' field it
+ *       will not work because '0' is a string containing the
+ *       character "zero", not an integer.
+ *     - 'length': The maximal length of a type 'char', 'varchar' or 'text'
+ *       field. Ignored for other field types.
+ *     - 'unsigned': A boolean indicating whether a type 'int', 'float'
+ *       and 'numeric' only is signed or unsigned. Defaults to
+ *       FALSE. Ignored for other field types.
+ *     - 'precision', 'scale': For type 'numeric' fields, indicates
+ *       the precision (total number of significant digits) and scale
+ *       (decimal digits right of the decimal point). Both values are
+ *       mandatory. Ignored for other field types.
+ *     - 'binary': A boolean indicating that MySQL should force 'char',
+ *       'varchar' or 'text' fields to use case-sensitive binary collation.
+ *       This has no effect on other database types for which case sensitivity
+ *       is already the default behavior.
+ *     All parameters apart from 'type' are optional except that type
+ *     'numeric' columns must specify 'precision' and 'scale', and type
+ *     'varchar' must specify the 'length' parameter.
+ *  - 'primary key': An array of one or more key column specifiers (see below)
+ *    that form the primary key.
+ *  - 'unique keys': An associative array of unique keys ('keyname' =>
+ *    specification). Each specification is an array of one or more
+ *    key column specifiers (see below) that form a unique key on the table.
+ *  - 'foreign keys': An associative array of relations ('my_relation' =>
+ *    specification). Each specification is an array containing the name of
+ *    the referenced table ('table'), and an array of column mappings
+ *    ('columns'). Column mappings are defined by key pairs ('source_column' =>
+ *    'referenced_column').
+ *  - 'indexes':  An associative array of indexes ('indexname' =>
+ *    specification). Each specification is an array of one or more
+ *    key column specifiers (see below) that form an index on the
+ *    table.
+ *
+ * A key column specifier is either a string naming a column or an
+ * array of two elements, column name and length, specifying a prefix
+ * of the named column.
+ *
+ * As an example, here is a SUBSET of the schema definition for
+ * Drupal's 'node' table. It show four fields (nid, vid, type, and
+ * title), the primary key on field 'nid', a unique key named 'vid' on
+ * field 'vid', and two indexes, one named 'nid' on field 'nid' and
+ * one named 'node_title_type' on the field 'title' and the first four
+ * bytes of the field 'type':
+ *
+ * @code
+ * $schema['node'] = array(
+ *   'description' => 'The base table for nodes.',
+ *   'fields' => array(
+ *     'nid'       => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE),
+ *     'vid'       => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE,'default' => 0),
+ *     'type'      => array('type' => 'varchar','length' => 32,'not null' => TRUE, 'default' => ''),
+ *     'language'  => array('type' => 'varchar','length' => 12,'not null' => TRUE,'default' => ''),
+ *     'title'     => array('type' => 'varchar','length' => 255,'not null' => TRUE, 'default' => ''),
+ *     'uid'       => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+ *     'status'    => array('type' => 'int', 'not null' => TRUE, 'default' => 1),
+ *     'created'   => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+ *     'changed'   => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+ *     'comment'   => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+ *     'promote'   => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+ *     'moderate'  => array('type' => 'int', 'not null' => TRUE,'default' => 0),
+ *     'sticky'    => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+ *     'tnid'      => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+ *     'translate' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+ *   ),
+ *   'indexes' => array(
+ *     'node_changed'        => array('changed'),
+ *     'node_created'        => array('created'),
+ *     'node_moderate'       => array('moderate'),
+ *     'node_frontpage'      => array('promote', 'status', 'sticky', 'created'),
+ *     'node_status_type'    => array('status', 'type', 'nid'),
+ *     'node_title_type'     => array('title', array('type', 4)),
+ *     'node_type'           => array(array('type', 4)),
+ *     'uid'                 => array('uid'),
+ *     'tnid'                => array('tnid'),
+ *     'translate'           => array('translate'),
+ *   ),
+ *   'unique keys' => array(
+ *     'vid' => array('vid'),
+ *   ),
+ *   'foreign keys' => array(
+ *     'node_revision' => array(
+ *       'table' => 'node_revision',
+ *       'columns' => array('vid' => 'vid'),
+ *      ),
+ *     'node_author' => array(
+ *       'table' => 'users',
+ *       'columns' => array('uid' => 'uid'),
+ *      ),
+ *    ),
+ *   'primary key' => array('nid'),
+ * );
+ * @endcode
+ *
+ * @see drupal_install_schema()
+ */
+
+abstract class DatabaseSchema implements QueryPlaceholderInterface {
+
+  protected $connection;
+
+  /**
+   * The placeholder counter.
+   */
+  protected $placeholder = 0;
+
+  /**
+   * Definition of prefixInfo array structure.
+   *
+   * Rather than redefining DatabaseSchema::getPrefixInfo() for each driver,
+   * by defining the defaultSchema variable only MySQL has to re-write the
+   * method.
+   *
+   * @see DatabaseSchema::getPrefixInfo()
+   */
+  protected $defaultSchema = 'public';
+
+  /**
+   * A unique identifier for this query object.
+   */
+  protected $uniqueIdentifier;
+
+  public function __construct($connection) {
+    $this->uniqueIdentifier = uniqid('', TRUE);
+    $this->connection = $connection;
+  }
+
+  /**
+   * Implements the magic __clone function.
+   */
+  public function __clone() {
+    $this->uniqueIdentifier = uniqid('', TRUE);
+  }
+
+  /**
+   * Implements QueryPlaceHolderInterface::uniqueIdentifier().
+   */
+  public function uniqueIdentifier() {
+    return $this->uniqueIdentifier;
+  }
+
+  /**
+   * Implements QueryPlaceHolderInterface::nextPlaceholder().
+   */
+  public function nextPlaceholder() {
+    return $this->placeholder++;
+  }
+
+  /**
+   * Get information about the table name and schema from the prefix.
+   *
+   * @param
+   *   Name of table to look prefix up for. Defaults to 'default' because thats
+   *   default key for prefix.
+   * @param $add_prefix
+   *   Boolean that indicates whether the given table name should be prefixed.
+   *
+   * @return
+   *   A keyed array with information about the schema, table name and prefix.
+   */
+  protected function getPrefixInfo($table = 'default', $add_prefix = TRUE) {
+    $info = array(
+      'schema' => $this->defaultSchema,
+      'prefix' => $this->connection->tablePrefix($table),
+    );
+    if ($add_prefix) {
+      $table = $info['prefix'] . $table;
+    }
+    // If the prefix contains a period in it, then that means the prefix also
+    // contains a schema reference in which case we will change the schema key
+    // to the value before the period in the prefix. Everything after the dot
+    // will be prefixed onto the front of the table.
+    if (($pos = strpos($table, '.')) !== FALSE) {
+      // Grab everything before the period.
+      $info['schema'] = substr($table, 0, $pos);
+      // Grab everything after the dot.
+      $info['table'] = substr($table, ++$pos);
+    }
+    else {
+      $info['table'] = $table;
+    }
+    return $info;
+  }
+
+  /**
+   * Create names for indexes, primary keys and constraints.
+   *
+   * This prevents using {} around non-table names like indexes and keys.
+   */
+  function prefixNonTable($table) {
+    $args = func_get_args();
+    $info = $this->getPrefixInfo($table);
+    $args[0] = $info['table'];
+    return implode('_', $args);
+  }
+
+  /**
+   * Build a condition to match a table name against a standard information_schema.
+   *
+   * The information_schema is a SQL standard that provides information about the
+   * database server and the databases, schemas, tables, columns and users within
+   * it. This makes information_schema a useful tool to use across the drupal
+   * database drivers and is used by a few different functions. The function below
+   * describes the conditions to be meet when querying information_schema.tables
+   * for drupal tables or information associated with drupal tables. Even though
+   * this is the standard method, not all databases follow standards and so this
+   * method should be overwritten by a database driver if the database provider
+   * uses alternate methods. Because information_schema.tables is used in a few
+   * different functions, a database driver will only need to override this function
+   * to make all the others work. For example see includes/databases/mysql/schema.inc.
+   *
+   * @param $table_name
+   *   The name of the table in question.
+   * @param $operator
+   *   The operator to apply on the 'table' part of the condition.
+   * @param $add_prefix
+   *   Boolean to indicate whether the table name needs to be prefixed.
+   *
+   * @return QueryConditionInterface
+   *   A DatabaseCondition object.
+   */
+  protected function buildTableNameCondition($table_name, $operator = '=', $add_prefix = TRUE) {
+    $info = $this->connection->getConnectionOptions();
+
+    // Retrive the table name and schema
+    $table_info = $this->getPrefixInfo($table_name, $add_prefix);
+
+    $condition = new DatabaseCondition('AND');
+    $condition->condition('table_catalog', $info['database']);
+    $condition->condition('table_schema', $table_info['schema']);
+    $condition->condition('table_name', $table_info['table'], $operator);
+    return $condition;
+  }
+
+  /**
+   * Check if a table exists.
+   *
+   * @param $table
+   *   The name of the table in drupal (no prefixing).
+   *
+   * @return
+   *   TRUE if the given table exists, otherwise FALSE.
+   */
+  public function tableExists($table) {
+    $condition = $this->buildTableNameCondition($table);
+    $condition->compile($this->connection, $this);
+    // Normally, we would heartily discourage the use of string
+    // concatenation for conditionals like this however, we
+    // couldn't use db_select() here because it would prefix
+    // information_schema.tables and the query would fail.
+    // Don't use {} around information_schema.tables table.
+    return (bool) $this->connection->query("SELECT 1 FROM information_schema.tables WHERE " . (string) $condition, $condition->arguments())->fetchField();
+  }
+
+  /**
+   * Find all tables that are like the specified base table name.
+   *
+   * @param $table_expression
+   *   An SQL expression, for example "simpletest%" (without the quotes).
+   *   BEWARE: this is not prefixed, the caller should take care of that.
+   *
+   * @return
+   *   Array, both the keys and the values are the matching tables.
+   */
+  public function findTables($table_expression) {
+    $condition = $this->buildTableNameCondition($table_expression, 'LIKE', FALSE);
+
+    $condition->compile($this->connection, $this);
+    // Normally, we would heartily discourage the use of string
+    // concatenation for conditionals like this however, we
+    // couldn't use db_select() here because it would prefix
+    // information_schema.tables and the query would fail.
+    // Don't use {} around information_schema.tables table.
+    return $this->connection->query("SELECT table_name FROM information_schema.tables WHERE " . (string) $condition, $condition->arguments())->fetchAllKeyed(0, 0);
+  }
+
+  /**
+   * Check if a column exists in the given table.
+   *
+   * @param $table
+   *   The name of the table in drupal (no prefixing).
+   * @param $name
+   *   The name of the column.
+   *
+   * @return
+   *   TRUE if the given column exists, otherwise FALSE.
+   */
+  public function fieldExists($table, $column) {
+    $condition = $this->buildTableNameCondition($table);
+    $condition->condition('column_name', $column);
+    $condition->compile($this->connection, $this);
+    // Normally, we would heartily discourage the use of string
+    // concatenation for conditionals like this however, we
+    // couldn't use db_select() here because it would prefix
+    // information_schema.tables and the query would fail.
+    // Don't use {} around information_schema.columns table.
+    return (bool) $this->connection->query("SELECT 1 FROM information_schema.columns WHERE " . (string) $condition, $condition->arguments())->fetchField();
+  }
+
+  /**
+   * Returns a mapping of Drupal schema field names to DB-native field types.
+   *
+   * Because different field types do not map 1:1 between databases, Drupal has
+   * its own normalized field type names. This function returns a driver-specific
+   * mapping table from Drupal names to the native names for each database.
+   *
+   * @return array
+   *   An array of Schema API field types to driver-specific field types.
+   */
+  abstract public function getFieldTypeMap();
+
+  /**
+   * Rename a table.
+   *
+   * @param $table
+   *   The table to be renamed.
+   * @param $new_name
+   *   The new name for the table.
+   *
+   * @throws DatabaseSchemaObjectDoesNotExistException
+   *   If the specified table doesn't exist.
+   * @throws DatabaseSchemaObjectExistsException
+   *   If a table with the specified new name already exists.
+   */
+  abstract public function renameTable($table, $new_name);
+
+  /**
+   * Drop a table.
+   *
+   * @param $table
+   *   The table to be dropped.
+   *
+   * @return
+   *   TRUE if the table was successfully dropped, FALSE if there was no table
+   *   by that name to begin with.
+   */
+  abstract public function dropTable($table);
+
+  /**
+   * Add a new field to a table.
+   *
+   * @param $table
+   *   Name of the table to be altered.
+   * @param $field
+   *   Name of the field to be added.
+   * @param $spec
+   *   The field specification array, as taken from a schema definition.
+   *   The specification may also contain the key 'initial', the newly
+   *   created field will be set to the value of the key in all rows.
+   *   This is most useful for creating NOT NULL columns with no default
+   *   value in existing tables.
+   * @param $keys_new
+   *   Optional keys and indexes specification to be created on the
+   *   table along with adding the field. The format is the same as a
+   *   table specification but without the 'fields' element. If you are
+   *   adding a type 'serial' field, you MUST specify at least one key
+   *   or index including it in this array. See db_change_field() for more
+   *   explanation why.
+   *
+   * @throws DatabaseSchemaObjectDoesNotExistException
+   *   If the specified table doesn't exist.
+   * @throws DatabaseSchemaObjectExistsException
+   *   If the specified table already has a field by that name.
+   */
+  abstract public function addField($table, $field, $spec, $keys_new = array());
+
+  /**
+   * Drop a field.
+   *
+   * @param $table
+   *   The table to be altered.
+   * @param $field
+   *   The field to be dropped.
+   *
+   * @return
+   *   TRUE if the field was successfully dropped, FALSE if there was no field
+   *   by that name to begin with.
+   */
+  abstract public function dropField($table, $field);
+
+  /**
+   * Set the default value for a field.
+   *
+   * @param $table
+   *   The table to be altered.
+   * @param $field
+   *   The field to be altered.
+   * @param $default
+   *   Default value to be set. NULL for 'default NULL'.
+   *
+   * @throws DatabaseSchemaObjectDoesNotExistException
+   *   If the specified table or field doesn't exist.
+   */
+  abstract public function fieldSetDefault($table, $field, $default);
+
+  /**
+   * Set a field to have no default value.
+   *
+   * @param $table
+   *   The table to be altered.
+   * @param $field
+   *   The field to be altered.
+   *
+   * @throws DatabaseSchemaObjectDoesNotExistException
+   *   If the specified table or field doesn't exist.
+   */
+  abstract public function fieldSetNoDefault($table, $field);
+
+  /**
+   * Checks if an index exists in the given table.
+   *
+   * @param $table
+   *   The name of the table in drupal (no prefixing).
+   * @param $name
+   *   The name of the index in drupal (no prefixing).
+   *
+   * @return
+   *   TRUE if the given index exists, otherwise FALSE.
+   */
+  abstract public function indexExists($table, $name);
+
+  /**
+   * Add a primary key.
+   *
+   * @param $table
+   *   The table to be altered.
+   * @param $fields
+   *   Fields for the primary key.
+   *
+   * @throws DatabaseSchemaObjectDoesNotExistException
+   *   If the specified table doesn't exist.
+   * @throws DatabaseSchemaObjectExistsException
+   *   If the specified table already has a primary key.
+   */
+  abstract public function addPrimaryKey($table, $fields);
+
+  /**
+   * Drop the primary key.
+   *
+   * @param $table
+   *   The table to be altered.
+   *
+   * @return
+   *   TRUE if the primary key was successfully dropped, FALSE if there was no
+   *   primary key on this table to begin with.
+   */
+  abstract public function dropPrimaryKey($table);
+
+  /**
+   * Add a unique key.
+   *
+   * @param $table
+   *   The table to be altered.
+   * @param $name
+   *   The name of the key.
+   * @param $fields
+   *   An array of field names.
+   *
+   * @throws DatabaseSchemaObjectDoesNotExistException
+   *   If the specified table doesn't exist.
+   * @throws DatabaseSchemaObjectExistsException
+   *   If the specified table already has a key by that name.
+   */
+  abstract public function addUniqueKey($table, $name, $fields);
+
+  /**
+   * Drop a unique key.
+   *
+   * @param $table
+   *   The table to be altered.
+   * @param $name
+   *   The name of the key.
+   *
+   * @return
+   *   TRUE if the key was successfully dropped, FALSE if there was no key by
+   *   that name to begin with.
+   */
+  abstract public function dropUniqueKey($table, $name);
+
+  /**
+   * Add an index.
+   *
+   * @param $table
+   *   The table to be altered.
+   * @param $name
+   *   The name of the index.
+   * @param $fields
+   *   An array of field names.
+   *
+   * @throws DatabaseSchemaObjectDoesNotExistException
+   *   If the specified table doesn't exist.
+   * @throws DatabaseSchemaObjectExistsException
+   *   If the specified table already has an index by that name.
+   */
+  abstract public function addIndex($table, $name, $fields);
+
+  /**
+   * Drop an index.
+   *
+   * @param $table
+   *   The table to be altered.
+   * @param $name
+   *   The name of the index.
+   *
+   * @return
+   *   TRUE if the index was successfully dropped, FALSE if there was no index
+   *   by that name to begin with.
+   */
+  abstract public function dropIndex($table, $name);
+
+  /**
+   * Change a field definition.
+   *
+   * IMPORTANT NOTE: To maintain database portability, you have to explicitly
+   * recreate all indices and primary keys that are using the changed field.
+   *
+   * That means that you have to drop all affected keys and indexes with
+   * db_drop_{primary_key,unique_key,index}() before calling db_change_field().
+   * To recreate the keys and indices, pass the key definitions as the
+   * optional $keys_new argument directly to db_change_field().
+   *
+   * For example, suppose you have:
+   * @code
+   * $schema['foo'] = array(
+   *   'fields' => array(
+   *     'bar' => array('type' => 'int', 'not null' => TRUE)
+   *   ),
+   *   'primary key' => array('bar')
+   * );
+   * @endcode
+   * and you want to change foo.bar to be type serial, leaving it as the
+   * primary key. The correct sequence is:
+   * @code
+   * db_drop_primary_key('foo');
+   * db_change_field('foo', 'bar', 'bar',
+   *   array('type' => 'serial', 'not null' => TRUE),
+   *   array('primary key' => array('bar')));
+   * @endcode
+   *
+   * The reasons for this are due to the different database engines:
+   *
+   * On PostgreSQL, changing a field definition involves adding a new field
+   * and dropping an old one which* causes any indices, primary keys and
+   * sequences (from serial-type fields) that use the changed field to be dropped.
+   *
+   * On MySQL, all type 'serial' fields must be part of at least one key
+   * or index as soon as they are created. You cannot use
+   * db_add_{primary_key,unique_key,index}() for this purpose because
+   * the ALTER TABLE command will fail to add the column without a key
+   * or index specification. The solution is to use the optional
+   * $keys_new argument to create the key or index at the same time as
+   * field.
+   *
+   * You could use db_add_{primary_key,unique_key,index}() in all cases
+   * unless you are converting a field to be type serial. You can use
+   * the $keys_new argument in all cases.
+   *
+   * @param $table
+   *   Name of the table.
+   * @param $field
+   *   Name of the field to change.
+   * @param $field_new
+   *   New name for the field (set to the same as $field if you don't want to change the name).
+   * @param $spec
+   *   The field specification for the new field.
+   * @param $keys_new
+   *   Optional keys and indexes specification to be created on the
+   *   table along with changing the field. The format is the same as a
+   *   table specification but without the 'fields' element.
+   *
+   * @throws DatabaseSchemaObjectDoesNotExistException
+   *   If the specified table or source field doesn't exist.
+   * @throws DatabaseSchemaObjectExistsException
+   *   If the specified destination field already exists.
+   */
+  abstract public function changeField($table, $field, $field_new, $spec, $keys_new = array());
+
+  /**
+   * Create a new table from a Drupal table definition.
+   *
+   * @param $name
+   *   The name of the table to create.
+   * @param $table
+   *   A Schema API table definition array.
+   *
+   * @throws DatabaseSchemaObjectExistsException
+   *   If the specified table already exists.
+   */
+  public function createTable($name, $table) {
+    if ($this->tableExists($name)) {
+      throw new DatabaseSchemaObjectExistsException(t('Table %name already exists.', array('%name' => $name)));
+    }
+    $statements = $this->createTableSql($name, $table);
+    foreach ($statements as $statement) {
+      $this->connection->query($statement);
+    }
+  }
+
+  /**
+   * Return an array of field names from an array of key/index column specifiers.
+   *
+   * This is usually an identity function but if a key/index uses a column prefix
+   * specification, this function extracts just the name.
+   *
+   * @param $fields
+   *   An array of key/index column specifiers.
+   *
+   * @return
+   *   An array of field names.
+   */
+  public function fieldNames($fields) {
+    $return = array();
+    foreach ($fields as $field) {
+      if (is_array($field)) {
+        $return[] = $field[0];
+      }
+      else {
+        $return[] = $field;
+      }
+    }
+    return $return;
+  }
+
+  /**
+   * Prepare a table or column comment for database query.
+   *
+   * @param $comment
+   *   The comment string to prepare.
+   * @param $length
+   *   Optional upper limit on the returned string length.
+   *
+   * @return
+   *   The prepared comment.
+   */
+  public function prepareComment($comment, $length = NULL) {
+    return $this->connection->quote($comment);
+  }
+}
+
+/**
+ * Exception thrown if an object being created already exists.
+ *
+ * For example, this exception should be thrown whenever there is an attempt to
+ * create a new database table, field, or index that already exists in the
+ * database schema.
+ */
+class DatabaseSchemaObjectExistsException extends Exception {}
+
+/**
+ * Exception thrown if an object being modified doesn't exist yet.
+ *
+ * For example, this exception should be thrown whenever there is an attempt to
+ * modify a database table, field, or index that does not currently exist in
+ * the database schema.
+ */
+class DatabaseSchemaObjectDoesNotExistException extends Exception {}
+
+/**
+ * @} End of "defgroup schemaapi".
+ */
+
diff --git a/htmltest/includes/database/select.inc b/htmltest/includes/database/select.inc
new file mode 100644
index 00000000..e036904b
--- /dev/null
+++ b/htmltest/includes/database/select.inc
@@ -0,0 +1,1613 @@
+<?php
+
+/**
+ * @addtogroup database
+ * @{
+ */
+
+require_once dirname(__FILE__) . '/query.inc';
+
+/**
+ * Interface for extendable query objects.
+ *
+ * "Extenders" follow the "Decorator" OOP design pattern.  That is, they wrap
+ * and "decorate" another object.  In our case, they implement the same interface
+ * as select queries and wrap a select query, to which they delegate almost all
+ * operations.  Subclasses of this class may implement additional methods or
+ * override existing methods as appropriate.  Extenders may also wrap other
+ * extender objects, allowing for arbitrarily complex "enhanced" queries.
+ */
+interface QueryExtendableInterface {
+
+  /**
+   * Enhance this object by wrapping it in an extender object.
+   *
+   * @param $extender_name
+   *   The base name of the extending class.  The base name will be checked
+   *   against the current database connection to allow driver-specific subclasses
+   *   as well, using the same logic as the query objects themselves.  For example,
+   *   PagerDefault_mysql is the MySQL-specific override for PagerDefault.
+   * @return QueryExtendableInterface
+   *   The extender object, which now contains a reference to this object.
+   */
+  public function extend($extender_name);
+}
+
+/**
+ * Interface definition for a Select Query object.
+ */
+interface SelectQueryInterface extends QueryConditionInterface, QueryAlterableInterface, QueryExtendableInterface, QueryPlaceholderInterface {
+
+  /* Alter accessors to expose the query data to alter hooks. */
+
+  /**
+   * Returns a reference to the fields array for this query.
+   *
+   * Because this method returns by reference, alter hooks may edit the fields
+   * array directly to make their changes. If just adding fields, however, the
+   * use of addField() is preferred.
+   *
+   * Note that this method must be called by reference as well:
+   *
+   * @code
+   * $fields =& $query->getFields();
+   * @endcode
+   *
+   * @return
+   *   A reference to the fields array structure.
+   */
+  public function &getFields();
+
+  /**
+   * Returns a reference to the expressions array for this query.
+   *
+   * Because this method returns by reference, alter hooks may edit the expressions
+   * array directly to make their changes. If just adding expressions, however, the
+   * use of addExpression() is preferred.
+   *
+   * Note that this method must be called by reference as well:
+   *
+   * @code
+   * $fields =& $query->getExpressions();
+   * @endcode
+   *
+   * @return
+   *   A reference to the expression array structure.
+   */
+  public function &getExpressions();
+
+  /**
+   * Returns a reference to the order by array for this query.
+   *
+   * Because this method returns by reference, alter hooks may edit the order-by
+   * array directly to make their changes. If just adding additional ordering
+   * fields, however, the use of orderBy() is preferred.
+   *
+   * Note that this method must be called by reference as well:
+   *
+   * @code
+   * $fields =& $query->getOrderBy();
+   * @endcode
+   *
+   * @return
+   *   A reference to the expression array structure.
+   */
+  public function &getOrderBy();
+
+  /**
+   * Returns a reference to the group-by array for this query.
+   *
+   * Because this method returns by reference, alter hooks may edit the group-by
+   * array directly to make their changes. If just adding additional grouping
+   * fields, however, the use of groupBy() is preferred.
+   *
+   * Note that this method must be called by reference as well:
+   *
+   * @code
+   * $fields =& $query->getGroupBy();
+   * @endcode
+   *
+   * @return
+   *   A reference to the group-by array structure.
+   */
+  public function &getGroupBy();
+
+  /**
+   * Returns a reference to the tables array for this query.
+   *
+   * Because this method returns by reference, alter hooks may edit the tables
+   * array directly to make their changes. If just adding tables, however, the
+   * use of the join() methods is preferred.
+   *
+   * Note that this method must be called by reference as well:
+   *
+   * @code
+   * $fields =& $query->getTables();
+   * @endcode
+   *
+   * @return
+   *   A reference to the tables array structure.
+   */
+  public function &getTables();
+
+  /**
+   * Returns a reference to the union queries for this query. This include
+   * queries for UNION, UNION ALL, and UNION DISTINCT.
+   *
+   * Because this method returns by reference, alter hooks may edit the tables
+   * array directly to make their changes. If just adding union queries,
+   * however, the use of the union() method is preferred.
+   *
+   * Note that this method must be called by reference as well:
+   *
+   * @code
+   * $fields =& $query->getUnion();
+   * @endcode
+   *
+   * @return
+   *   A reference to the union query array structure.
+   */
+  public function &getUnion();
+
+  /**
+   * Compiles and returns an associative array of the arguments for this prepared statement.
+   *
+   * @param $queryPlaceholder
+   *   When collecting the arguments of a subquery, the main placeholder
+   *   object should be passed as this parameter.
+   *
+   * @return
+   *   An associative array of all placeholder arguments for this query.
+   */
+  public function getArguments(QueryPlaceholderInterface $queryPlaceholder = NULL);
+
+  /* Query building operations */
+
+  /**
+   * Sets this query to be DISTINCT.
+   *
+   * @param $distinct
+   *   TRUE to flag this query DISTINCT, FALSE to disable it.
+   * @return SelectQueryInterface
+   *   The called object.
+   */
+  public function distinct($distinct = TRUE);
+
+  /**
+   * Adds a field to the list to be SELECTed.
+   *
+   * @param $table_alias
+   *   The name of the table from which the field comes, as an alias. Generally
+   *   you will want to use the return value of join() here to ensure that it is
+   *   valid.
+   * @param $field
+   *   The name of the field.
+   * @param $alias
+   *   The alias for this field. If not specified, one will be generated
+   *   automatically based on the $table_alias and $field. The alias will be
+   *   checked for uniqueness, so the requested alias may not be the alias
+   *   that is assigned in all cases.
+   * @return
+   *   The unique alias that was assigned for this field.
+   */
+  public function addField($table_alias, $field, $alias = NULL);
+
+  /**
+   * Add multiple fields from the same table to be SELECTed.
+   *
+   * This method does not return the aliases set for the passed fields. In the
+   * majority of cases that is not a problem, as the alias will be the field
+   * name. However, if you do need to know the alias you can call getFields()
+   * and examine the result to determine what alias was created. Alternatively,
+   * simply use addField() for the few fields you care about and this method for
+   * the rest.
+   *
+   * @param $table_alias
+   *   The name of the table from which the field comes, as an alias. Generally
+   *   you will want to use the return value of join() here to ensure that it is
+   *   valid.
+   * @param $fields
+   *   An indexed array of fields present in the specified table that should be
+   *   included in this query. If not specified, $table_alias.* will be generated
+   *   without any aliases.
+   * @return SelectQueryInterface
+   *   The called object.
+   */
+  public function fields($table_alias, array $fields = array());
+
+  /**
+   * Adds an expression to the list of "fields" to be SELECTed.
+   *
+   * An expression can be any arbitrary string that is valid SQL. That includes
+   * various functions, which may in some cases be database-dependent. This
+   * method makes no effort to correct for database-specific functions.
+   *
+   * @param $expression
+   *   The expression string. May contain placeholders.
+   * @param $alias
+   *   The alias for this expression. If not specified, one will be generated
+   *   automatically in the form "expression_#". The alias will be checked for
+   *   uniqueness, so the requested alias may not be the alias that is assigned
+   *   in all cases.
+   * @param $arguments
+   *   Any placeholder arguments needed for this expression.
+   * @return
+   *   The unique alias that was assigned for this expression.
+   */
+  public function addExpression($expression, $alias = NULL, $arguments = array());
+
+  /**
+   * Default Join against another table in the database.
+   *
+   * This method is a convenience method for innerJoin().
+   *
+   * @param $table
+   *   The table against which to join.
+   * @param $alias
+   *   The alias for the table. In most cases this should be the first letter
+   *   of the table, or the first letter of each "word" in the table.
+   * @param $condition
+   *   The condition on which to join this table. If the join requires values,
+   *   this clause should use a named placeholder and the value or values to
+   *   insert should be passed in the 4th parameter. For the first table joined
+   *   on a query, this value is ignored as the first table is taken as the base
+   *   table. The token %alias can be used in this string to be replaced with
+   *   the actual alias. This is useful when $alias is modified by the database
+   *   system, for example, when joining the same table more than once.
+   * @param $arguments
+   *   An array of arguments to replace into the $condition of this join.
+   * @return
+   *   The unique alias that was assigned for this table.
+   */
+  public function join($table, $alias = NULL, $condition = NULL, $arguments = array());
+
+  /**
+   * Inner Join against another table in the database.
+   *
+   * @param $table
+   *   The table against which to join.
+   * @param $alias
+   *   The alias for the table. In most cases this should be the first letter
+   *   of the table, or the first letter of each "word" in the table.
+   * @param $condition
+   *   The condition on which to join this table. If the join requires values,
+   *   this clause should use a named placeholder and the value or values to
+   *   insert should be passed in the 4th parameter. For the first table joined
+   *   on a query, this value is ignored as the first table is taken as the base
+   *   table. The token %alias can be used in this string to be replaced with
+   *   the actual alias. This is useful when $alias is modified by the database
+   *   system, for example, when joining the same table more than once.
+   * @param $arguments
+   *   An array of arguments to replace into the $condition of this join.
+   * @return
+   *   The unique alias that was assigned for this table.
+   */
+  public function innerJoin($table, $alias = NULL, $condition = NULL, $arguments = array());
+
+  /**
+   * Left Outer Join against another table in the database.
+   *
+   * @param $table
+   *   The table against which to join.
+   * @param $alias
+   *   The alias for the table. In most cases this should be the first letter
+   *   of the table, or the first letter of each "word" in the table.
+   * @param $condition
+   *   The condition on which to join this table. If the join requires values,
+   *   this clause should use a named placeholder and the value or values to
+   *   insert should be passed in the 4th parameter. For the first table joined
+   *   on a query, this value is ignored as the first table is taken as the base
+   *   table. The token %alias can be used in this string to be replaced with
+   *   the actual alias. This is useful when $alias is modified by the database
+   *   system, for example, when joining the same table more than once.
+   * @param $arguments
+   *   An array of arguments to replace into the $condition of this join.
+   * @return
+   *   The unique alias that was assigned for this table.
+   */
+  public function leftJoin($table, $alias = NULL, $condition = NULL, $arguments = array());
+
+  /**
+   * Right Outer Join against another table in the database.
+   *
+   * @param $table
+   *   The table against which to join.
+   * @param $alias
+   *   The alias for the table. In most cases this should be the first letter
+   *   of the table, or the first letter of each "word" in the table.
+   * @param $condition
+   *   The condition on which to join this table. If the join requires values,
+   *   this clause should use a named placeholder and the value or values to
+   *   insert should be passed in the 4th parameter. For the first table joined
+   *   on a query, this value is ignored as the first table is taken as the base
+   *   table. The token %alias can be used in this string to be replaced with
+   *   the actual alias. This is useful when $alias is modified by the database
+   *   system, for example, when joining the same table more than once.
+   * @param $arguments
+   *   An array of arguments to replace into the $condition of this join.
+   * @return
+   *   The unique alias that was assigned for this table.
+   */
+  public function rightJoin($table, $alias = NULL, $condition = NULL, $arguments = array());
+
+  /**
+   * Join against another table in the database.
+   *
+   * This method does the "hard" work of queuing up a table to be joined against.
+   * In some cases, that may include dipping into the Schema API to find the necessary
+   * fields on which to join.
+   *
+   * @param $type
+   *   The type of join. Typically one one of INNER, LEFT OUTER, and RIGHT OUTER.
+   * @param $table
+   *   The table against which to join. May be a string or another SelectQuery
+   *   object. If a query object is passed, it will be used as a subselect.
+   * @param $alias
+   *   The alias for the table. In most cases this should be the first letter
+   *   of the table, or the first letter of each "word" in the table. If omitted,
+   *   one will be dynamically generated.
+   * @param $condition
+   *   The condition on which to join this table. If the join requires values,
+   *   this clause should use a named placeholder and the value or values to
+   *   insert should be passed in the 4th parameter. For the first table joined
+   *   on a query, this value is ignored as the first table is taken as the base
+   *   table. The token %alias can be used in this string to be replaced with
+   *   the actual alias. This is useful when $alias is modified by the database
+   *   system, for example, when joining the same table more than once.
+   * @param $arguments
+   *   An array of arguments to replace into the $condition of this join.
+   * @return
+   *   The unique alias that was assigned for this table.
+   */
+  public function addJoin($type, $table, $alias = NULL, $condition = NULL, $arguments = array());
+
+  /**
+   * Orders the result set by a given field.
+   *
+   * If called multiple times, the query will order by each specified field in the
+   * order this method is called.
+   *
+   * If the query uses DISTINCT or GROUP BY conditions, fields or expressions
+   * that are used for the order must be selected to be compatible with some
+   * databases like PostgreSQL. The PostgreSQL driver can handle simple cases
+   * automatically but it is suggested to explicitly specify them. Additionally,
+   * when ordering on an alias, the alias must be added before orderBy() is
+   * called.
+   *
+   * @param $field
+   *   The field on which to order.
+   * @param $direction
+   *   The direction to sort. Legal values are "ASC" and "DESC".
+   * @return SelectQueryInterface
+   *   The called object.
+   */
+  public function orderBy($field, $direction = 'ASC');
+
+  /**
+   * Orders the result set by a random value.
+   *
+   * This may be stacked with other orderBy() calls. If so, the query will order
+   * by each specified field, including this one, in the order called. Although
+   * this method may be called multiple times on the same query, doing so
+   * is not particularly useful.
+   *
+   * Note: The method used by most drivers may not scale to very large result
+   * sets. If you need to work with extremely large data sets, you may create
+   * your own database driver by subclassing off of an existing driver and
+   * implementing your own randomization mechanism. See
+   *
+   * http://jan.kneschke.de/projects/mysql/order-by-rand/
+   *
+   * for an example of such an alternate sorting mechanism.
+   *
+   * @return SelectQueryInterface
+   *   The called object
+   */
+  public function orderRandom();
+
+  /**
+   * Restricts a query to a given range in the result set.
+   *
+   * If this method is called with no parameters, will remove any range
+   * directives that have been set.
+   *
+   * @param $start
+   *   The first record from the result set to return. If NULL, removes any
+   *   range directives that are set.
+   * @param $length
+   *   The number of records to return from the result set.
+   * @return SelectQueryInterface
+   *   The called object.
+   */
+  public function range($start = NULL, $length = NULL);
+
+  /**
+   * Add another Select query to UNION to this one.
+   *
+   * Union queries consist of two or more queries whose
+   * results are effectively concatenated together. Queries
+   * will be UNIONed in the order they are specified, with
+   * this object's query coming first. Duplicate columns will
+   * be discarded. All forms of UNION are supported, using
+   * the second '$type' argument.
+   *
+   * Note: All queries UNIONed together must have the same
+   * field structure, in the same order. It is up to the
+   * caller to ensure that they match properly. If they do
+   * not, an SQL syntax error will result.
+   *
+   * @param $query
+   *   The query to UNION to this query.
+   * @param $type
+   *   The type of UNION to add to the query. Defaults to plain
+   *   UNION.
+   * @return SelectQueryInterface
+   *   The called object.
+   */
+  public function union(SelectQueryInterface $query, $type = '');
+
+  /**
+   * Groups the result set by the specified field.
+   *
+   * @param $field
+   *   The field on which to group. This should be the field as aliased.
+   * @return SelectQueryInterface
+   *   The called object.
+   */
+  public function groupBy($field);
+
+  /**
+   * Get the equivalent COUNT query of this query as a new query object.
+   *
+   * @return SelectQueryInterface
+   *   A new SelectQuery object with no fields or expressions besides COUNT(*).
+   */
+  public function countQuery();
+
+  /**
+   * Indicates if preExecute() has already been called on that object.
+   *
+   * @return
+   *   TRUE is this query has already been prepared, FALSE otherwise.
+   */
+  public function isPrepared();
+
+  /**
+   * Generic preparation and validation for a SELECT query.
+   *
+   * @return
+   *   TRUE if the validation was successful, FALSE if not.
+   */
+  public function preExecute(SelectQueryInterface $query = NULL);
+
+  /**
+   * Helper function to build most common HAVING conditional clauses.
+   *
+   * This method can take a variable number of parameters. If called with two
+   * parameters, they are taken as $field and $value with $operator having a value
+   * of IN if $value is an array and = otherwise.
+   *
+   * @param $field
+   *   The name of the field to check. If you would like to add a more complex
+   *   condition involving operators or functions, use having().
+   * @param $value
+   *   The value to test the field against. In most cases, this is a scalar. For more
+   *   complex options, it is an array. The meaning of each element in the array is
+   *   dependent on the $operator.
+   * @param $operator
+   *   The comparison operator, such as =, <, or >=. It also accepts more complex
+   *   options such as IN, LIKE, or BETWEEN. Defaults to IN if $value is an array
+   *   = otherwise.
+   * @return QueryConditionInterface
+   *   The called object.
+   */
+  public function havingCondition($field, $value = NULL, $operator = NULL);
+
+  /**
+   * Clone magic method.
+   *
+   * Select queries have dependent objects that must be deep-cloned.  The
+   * connection object itself, however, should not be cloned as that would
+   * duplicate the connection itself.
+   */
+  public function __clone();
+
+  /**
+   * Add FOR UPDATE to the query.
+   *
+   * FOR UPDATE prevents the rows retrieved by the SELECT statement from being
+   * modified or deleted by other transactions until the current transaction
+   * ends. Other transactions that attempt UPDATE, DELETE, or SELECT FOR UPDATE
+   * of these rows will be blocked until the current transaction ends.
+   *
+   * @param $set
+   *   IF TRUE, FOR UPDATE will be added to the query, if FALSE then it won't.
+   *
+   * @return QueryConditionInterface
+   *   The called object.
+   */
+  public function forUpdate($set = TRUE);
+}
+
+/**
+ * The base extender class for Select queries.
+ */
+class SelectQueryExtender implements SelectQueryInterface {
+
+  /**
+   * The SelectQuery object we are extending/decorating.
+   *
+   * @var SelectQueryInterface
+   */
+  protected $query;
+
+  /**
+   * The connection object on which to run this query.
+   *
+   * @var DatabaseConnection
+   */
+  protected $connection;
+
+  /**
+   * A unique identifier for this query object.
+   */
+  protected $uniqueIdentifier;
+
+  /**
+   * The placeholder counter.
+   */
+  protected $placeholder = 0;
+
+  public function __construct(SelectQueryInterface $query, DatabaseConnection $connection) {
+    $this->uniqueIdentifier = uniqid('', TRUE);
+    $this->query = $query;
+    $this->connection = $connection;
+  }
+
+  /**
+   * Implements QueryPlaceholderInterface::uniqueIdentifier().
+   */
+  public function uniqueIdentifier() {
+    return $this->uniqueIdentifier;
+  }
+
+  /**
+   * Implements QueryPlaceholderInterface::nextPlaceholder().
+   */
+  public function nextPlaceholder() {
+    return $this->placeholder++;
+  }
+
+  /* Implementations of QueryAlterableInterface. */
+
+  public function addTag($tag) {
+    $this->query->addTag($tag);
+    return $this;
+  }
+
+  public function hasTag($tag) {
+    return $this->query->hasTag($tag);
+  }
+
+  public function hasAllTags() {
+    $args = func_get_args();
+    return call_user_func_array(array($this->query, 'hasAllTags'), $args);
+  }
+
+  public function hasAnyTag() {
+    $args = func_get_args();
+    return call_user_func_array(array($this->query, 'hasAnyTags'), $args);
+  }
+
+  public function addMetaData($key, $object) {
+    $this->query->addMetaData($key, $object);
+    return $this;
+  }
+
+  public function getMetaData($key) {
+    return $this->query->getMetaData($key);
+  }
+
+  /* Implementations of QueryConditionInterface for the WHERE clause. */
+
+  public function condition($field, $value = NULL, $operator = NULL) {
+    $this->query->condition($field, $value, $operator);
+    return $this;
+  }
+
+  public function &conditions() {
+    return $this->query->conditions();
+  }
+
+  public function arguments() {
+    return $this->query->arguments();
+  }
+
+  public function where($snippet, $args = array()) {
+    $this->query->where($snippet, $args);
+    return $this;
+  }
+
+  public function compile(DatabaseConnection $connection, QueryPlaceholderInterface $queryPlaceholder) {
+    return $this->query->compile($connection, $queryPlaceholder);
+  }
+
+  public function compiled() {
+    return $this->query->compiled();
+  }
+
+  /* Implementations of QueryConditionInterface for the HAVING clause. */
+
+  public function havingCondition($field, $value = NULL, $operator = '=') {
+    $this->query->havingCondition($field, $value, $operator);
+    return $this;
+  }
+
+  public function &havingConditions() {
+    return $this->query->havingConditions();
+  }
+
+  public function havingArguments() {
+    return $this->query->havingArguments();
+  }
+
+  public function having($snippet, $args = array()) {
+    $this->query->having($snippet, $args);
+    return $this;
+  }
+
+  public function havingCompile(DatabaseConnection $connection) {
+    return $this->query->havingCompile($connection);
+  }
+
+  /* Implementations of QueryExtendableInterface. */
+
+  public function extend($extender_name) {
+    // The extender can be anywhere so this needs to go to the registry, which
+    // is surely loaded by now.
+    $class = $this->connection->getDriverClass($extender_name, array(), TRUE);
+    return new $class($this, $this->connection);
+  }
+
+  /* Alter accessors to expose the query data to alter hooks. */
+
+  public function &getFields() {
+    return $this->query->getFields();
+  }
+
+  public function &getExpressions() {
+    return $this->query->getExpressions();
+  }
+
+  public function &getOrderBy() {
+    return $this->query->getOrderBy();
+  }
+
+  public function &getGroupBy() {
+    return $this->query->getGroupBy();
+  }
+
+  public function &getTables() {
+    return $this->query->getTables();
+  }
+
+  public function &getUnion() {
+    return $this->query->getUnion();
+  }
+
+  public function getArguments(QueryPlaceholderInterface $queryPlaceholder = NULL) {
+    return $this->query->getArguments($queryPlaceholder);
+  }
+
+  public function isPrepared() {
+    return $this->query->isPrepared();
+  }
+
+  public function preExecute(SelectQueryInterface $query = NULL) {
+    // If no query object is passed in, use $this.
+    if (!isset($query)) {
+      $query = $this;
+    }
+
+    return $this->query->preExecute($query);
+  }
+
+  public function execute() {
+    // By calling preExecute() here, we force it to preprocess the extender
+    // object rather than just the base query object.  That means
+    // hook_query_alter() gets access to the extended object.
+    if (!$this->preExecute($this)) {
+      return NULL;
+    }
+
+    return $this->query->execute();
+  }
+
+  public function distinct($distinct = TRUE) {
+    $this->query->distinct($distinct);
+    return $this;
+  }
+
+  public function addField($table_alias, $field, $alias = NULL) {
+    return $this->query->addField($table_alias, $field, $alias);
+  }
+
+  public function fields($table_alias, array $fields = array()) {
+    $this->query->fields($table_alias, $fields);
+    return $this;
+  }
+
+  public function addExpression($expression, $alias = NULL, $arguments = array()) {
+    return $this->query->addExpression($expression, $alias, $arguments);
+  }
+
+  public function join($table, $alias = NULL, $condition = NULL, $arguments = array()) {
+    return $this->query->join($table, $alias, $condition, $arguments);
+  }
+
+  public function innerJoin($table, $alias = NULL, $condition = NULL, $arguments = array()) {
+    return $this->query->innerJoin($table, $alias, $condition, $arguments);
+  }
+
+  public function leftJoin($table, $alias = NULL, $condition = NULL, $arguments = array()) {
+    return $this->query->leftJoin($table, $alias, $condition, $arguments);
+  }
+
+  public function rightJoin($table, $alias = NULL, $condition = NULL, $arguments = array()) {
+    return $this->query->rightJoin($table, $alias, $condition, $arguments);
+  }
+
+  public function addJoin($type, $table, $alias = NULL, $condition = NULL, $arguments = array()) {
+    return $this->query->addJoin($type, $table, $alias, $condition, $arguments);
+  }
+
+  public function orderBy($field, $direction = 'ASC') {
+    $this->query->orderBy($field, $direction);
+    return $this;
+  }
+
+  public function orderRandom() {
+    $this->query->orderRandom();
+    return $this;
+  }
+
+  public function range($start = NULL, $length = NULL) {
+    $this->query->range($start, $length);
+    return $this;
+  }
+
+  public function union(SelectQueryInterface $query, $type = '') {
+    $this->query->union($query, $type);
+    return $this;
+  }
+
+  public function groupBy($field) {
+    $this->query->groupBy($field);
+    return $this;
+  }
+
+  public function forUpdate($set = TRUE) {
+    $this->query->forUpdate($set);
+    return $this;
+  }
+
+  public function countQuery() {
+    return $this->query->countQuery();
+  }
+
+  function isNull($field) {
+    $this->query->isNull($field);
+    return $this;
+  }
+
+  function isNotNull($field) {
+    $this->query->isNotNull($field);
+    return $this;
+  }
+
+  public function exists(SelectQueryInterface $select) {
+    $this->query->exists($select);
+    return $this;
+  }
+
+  public function notExists(SelectQueryInterface $select) {
+    $this->query->notExists($select);
+    return $this;
+  }
+
+  public function __toString() {
+    return (string) $this->query;
+  }
+
+  public function __clone() {
+    $this->uniqueIdentifier = uniqid('', TRUE);
+
+    // We need to deep-clone the query we're wrapping, which in turn may
+    // deep-clone other objects.  Exciting!
+    $this->query = clone($this->query);
+  }
+
+  /**
+   * Magic override for undefined methods.
+   *
+   * If one extender extends another extender, then methods in the inner extender
+   * will not be exposed on the outer extender.  That's because we cannot know
+   * in advance what those methods will be, so we cannot provide wrapping
+   * implementations as we do above.  Instead, we use this slower catch-all method
+   * to handle any additional methods.
+   */
+  public function __call($method, $args) {
+    $return = call_user_func_array(array($this->query, $method), $args);
+
+    // Some methods will return the called object as part of a fluent interface.
+    // Others will return some useful value.  If it's a value, then the caller
+    // probably wants that value.  If it's the called object, then we instead
+    // return this object.  That way we don't "lose" an extender layer when
+    // chaining methods together.
+    if ($return instanceof SelectQueryInterface) {
+      return $this;
+    }
+    else {
+      return $return;
+    }
+  }
+}
+
+/**
+ * Query builder for SELECT statements.
+ */
+class SelectQuery extends Query implements SelectQueryInterface {
+
+  /**
+   * The fields to SELECT.
+   *
+   * @var array
+   */
+  protected $fields = array();
+
+  /**
+   * The expressions to SELECT as virtual fields.
+   *
+   * @var array
+   */
+  protected $expressions = array();
+
+  /**
+   * The tables against which to JOIN.
+   *
+   * This property is a nested array. Each entry is an array representing
+   * a single table against which to join. The structure of each entry is:
+   *
+   * array(
+   *   'type' => $join_type (one of INNER, LEFT OUTER, RIGHT OUTER),
+   *   'table' => $table,
+   *   'alias' => $alias_of_the_table,
+   *   'condition' => $condition_clause_on_which_to_join,
+   *   'arguments' => $array_of_arguments_for_placeholders_in_the condition.
+   *   'all_fields' => TRUE to SELECT $alias.*, FALSE or NULL otherwise.
+   * )
+   *
+   * If $table is a string, it is taken as the name of a table. If it is
+   * a SelectQuery object, it is taken as a subquery.
+   *
+   * @var array
+   */
+  protected $tables = array();
+
+  /**
+   * The fields by which to order this query.
+   *
+   * This is an associative array. The keys are the fields to order, and the value
+   * is the direction to order, either ASC or DESC.
+   *
+   * @var array
+   */
+  protected $order = array();
+
+  /**
+   * The fields by which to group.
+   *
+   * @var array
+   */
+  protected $group = array();
+
+  /**
+   * The conditional object for the WHERE clause.
+   *
+   * @var DatabaseCondition
+   */
+  protected $where;
+
+  /**
+   * The conditional object for the HAVING clause.
+   *
+   * @var DatabaseCondition
+   */
+  protected $having;
+
+  /**
+   * Whether or not this query should be DISTINCT
+   *
+   * @var boolean
+   */
+  protected $distinct = FALSE;
+
+  /**
+   * The range limiters for this query.
+   *
+   * @var array
+   */
+  protected $range;
+
+  /**
+   * An array whose elements specify a query to UNION, and the UNION type. The
+   * 'type' key may be '', 'ALL', or 'DISTINCT' to represent a 'UNION',
+   * 'UNION ALL', or 'UNION DISTINCT' statement, respectively.
+   *
+   * All entries in this array will be applied from front to back, with the
+   * first query to union on the right of the original query, the second union
+   * to the right of the first, etc.
+   *
+   * @var array
+   */
+  protected $union = array();
+
+  /**
+   * Indicates if preExecute() has already been called.
+   * @var boolean
+   */
+  protected $prepared = FALSE;
+
+  /**
+   * The FOR UPDATE status
+   */
+  protected $forUpdate = FALSE;
+
+  public function __construct($table, $alias = NULL, DatabaseConnection $connection, $options = array()) {
+    $options['return'] = Database::RETURN_STATEMENT;
+    parent::__construct($connection, $options);
+    $this->where = new DatabaseCondition('AND');
+    $this->having = new DatabaseCondition('AND');
+    $this->addJoin(NULL, $table, $alias);
+  }
+
+  /* Implementations of QueryAlterableInterface. */
+
+  public function addTag($tag) {
+    $this->alterTags[$tag] = 1;
+    return $this;
+  }
+
+  public function hasTag($tag) {
+    return isset($this->alterTags[$tag]);
+  }
+
+  public function hasAllTags() {
+    $args = func_get_args();
+    return !(boolean)array_diff($args, array_keys($this->alterTags));
+  }
+
+  public function hasAnyTag() {
+    $args = func_get_args();
+    return (boolean)array_intersect($args, array_keys($this->alterTags));
+  }
+
+  public function addMetaData($key, $object) {
+    $this->alterMetaData[$key] = $object;
+    return $this;
+  }
+
+  public function getMetaData($key) {
+    return isset($this->alterMetaData[$key]) ? $this->alterMetaData[$key] : NULL;
+  }
+
+  /* Implementations of QueryConditionInterface for the WHERE clause. */
+
+  public function condition($field, $value = NULL, $operator = NULL) {
+    $this->where->condition($field, $value, $operator);
+    return $this;
+  }
+
+  public function &conditions() {
+    return $this->where->conditions();
+  }
+
+  public function arguments() {
+    if (!$this->compiled()) {
+      return NULL;
+    }
+
+    $args = $this->where->arguments() + $this->having->arguments();
+
+    foreach ($this->tables as $table) {
+      if ($table['arguments']) {
+        $args += $table['arguments'];
+      }
+      // If this table is a subquery, grab its arguments recursively.
+      if ($table['table'] instanceof SelectQueryInterface) {
+        $args += $table['table']->arguments();
+      }
+    }
+
+    foreach ($this->expressions as $expression) {
+      if ($expression['arguments']) {
+        $args += $expression['arguments'];
+      }
+    }
+
+    // If there are any dependent queries to UNION,
+    // incorporate their arguments recursively.
+    foreach ($this->union as $union) {
+      $args += $union['query']->arguments();
+    }
+
+    return $args;
+  }
+
+  public function where($snippet, $args = array()) {
+    $this->where->where($snippet, $args);
+    return $this;
+  }
+
+  public function isNull($field) {
+    $this->where->isNull($field);
+    return $this;
+  }
+
+  public function isNotNull($field) {
+    $this->where->isNotNull($field);
+    return $this;
+  }
+
+  public function exists(SelectQueryInterface $select) {
+    $this->where->exists($select);
+    return $this;
+  }
+
+  public function notExists(SelectQueryInterface $select) {
+    $this->where->notExists($select);
+    return $this;
+  }
+
+  public function compile(DatabaseConnection $connection, QueryPlaceholderInterface $queryPlaceholder) {
+    $this->where->compile($connection, $queryPlaceholder);
+    $this->having->compile($connection, $queryPlaceholder);
+
+    foreach ($this->tables as $table) {
+      // If this table is a subquery, compile it recursively.
+      if ($table['table'] instanceof SelectQueryInterface) {
+        $table['table']->compile($connection, $queryPlaceholder);
+      }
+    }
+
+    // If there are any dependent queries to UNION, compile it recursively.
+    foreach ($this->union as $union) {
+      $union['query']->compile($connection, $queryPlaceholder);
+    }
+  }
+
+  public function compiled() {
+    if (!$this->where->compiled() || !$this->having->compiled()) {
+      return FALSE;
+    }
+
+    foreach ($this->tables as $table) {
+      // If this table is a subquery, check its status recursively.
+      if ($table['table'] instanceof SelectQueryInterface) {
+        if (!$table['table']->compiled()) {
+          return FALSE;
+        }
+      }
+    }
+
+    foreach ($this->union as $union) {
+      if (!$union['query']->compiled()) {
+        return FALSE;
+      }
+    }
+
+    return TRUE;
+  }
+
+  /* Implementations of QueryConditionInterface for the HAVING clause. */
+
+  public function havingCondition($field, $value = NULL, $operator = NULL) {
+    $this->having->condition($field, $value, $operator);
+    return $this;
+  }
+
+  public function &havingConditions() {
+    return $this->having->conditions();
+  }
+
+  public function havingArguments() {
+    return $this->having->arguments();
+  }
+
+  public function having($snippet, $args = array()) {
+    $this->having->where($snippet, $args);
+    return $this;
+  }
+
+  public function havingCompile(DatabaseConnection $connection) {
+    return $this->having->compile($connection, $this);
+  }
+
+  /* Implementations of QueryExtendableInterface. */
+
+  public function extend($extender_name) {
+    $override_class = $extender_name . '_' . $this->connection->driver();
+    if (class_exists($override_class)) {
+      $extender_name = $override_class;
+    }
+    return new $extender_name($this, $this->connection);
+  }
+
+  public function havingIsNull($field) {
+    $this->having->isNull($field);
+    return $this;
+  }
+
+  public function havingIsNotNull($field) {
+    $this->having->isNotNull($field);
+    return $this;
+  }
+
+  public function havingExists(SelectQueryInterface $select) {
+    $this->having->exists($select);
+    return $this;
+  }
+
+  public function havingNotExists(SelectQueryInterface $select) {
+    $this->having->notExists($select);
+    return $this;
+  }
+
+  public function forUpdate($set = TRUE) {
+    if (isset($set)) {
+      $this->forUpdate = $set;
+    }
+    return $this;
+  }
+
+  /* Alter accessors to expose the query data to alter hooks. */
+
+  public function &getFields() {
+    return $this->fields;
+  }
+
+  public function &getExpressions() {
+    return $this->expressions;
+  }
+
+  public function &getOrderBy() {
+    return $this->order;
+  }
+
+  public function &getGroupBy() {
+    return $this->group;
+  }
+
+  public function &getTables() {
+    return $this->tables;
+  }
+
+  public function &getUnion() {
+    return $this->union;
+  }
+
+  public function getArguments(QueryPlaceholderInterface $queryPlaceholder = NULL) {
+    if (!isset($queryPlaceholder)) {
+      $queryPlaceholder = $this;
+    }
+    $this->compile($this->connection, $queryPlaceholder);
+    return $this->arguments();
+  }
+
+  /**
+   * Indicates if preExecute() has already been called on that object.
+   */
+  public function isPrepared() {
+    return $this->prepared;
+  }
+
+  /**
+   * Generic preparation and validation for a SELECT query.
+   *
+   * @return
+   *   TRUE if the validation was successful, FALSE if not.
+   */
+  public function preExecute(SelectQueryInterface $query = NULL) {
+    // If no query object is passed in, use $this.
+    if (!isset($query)) {
+      $query = $this;
+    }
+
+    // Only execute this once.
+    if ($query->isPrepared()) {
+      return TRUE;
+    }
+
+    // Modules may alter all queries or only those having a particular tag.
+    if (isset($this->alterTags)) {
+      $hooks = array('query');
+      foreach ($this->alterTags as $tag => $value) {
+        $hooks[] = 'query_' . $tag;
+      }
+      drupal_alter($hooks, $query);
+    }
+
+    $this->prepared = TRUE;
+
+    // Now also prepare any sub-queries.
+    foreach ($this->tables as $table) {
+      if ($table['table'] instanceof SelectQueryInterface) {
+        $table['table']->preExecute();
+      }
+    }
+
+    foreach ($this->union as $union) {
+      $union['query']->preExecute();
+    }
+
+    return $this->prepared;
+  }
+
+  public function execute() {
+    // If validation fails, simply return NULL.
+    // Note that validation routines in preExecute() may throw exceptions instead.
+    if (!$this->preExecute()) {
+      return NULL;
+    }
+
+    $args = $this->getArguments();
+    return $this->connection->query((string) $this, $args, $this->queryOptions);
+  }
+
+  public function distinct($distinct = TRUE) {
+    $this->distinct = $distinct;
+    return $this;
+  }
+
+  public function addField($table_alias, $field, $alias = NULL) {
+    // If no alias is specified, first try the field name itself.
+    if (empty($alias)) {
+      $alias = $field;
+    }
+
+    // If that's already in use, try the table name and field name.
+    if (!empty($this->fields[$alias])) {
+      $alias = $table_alias . '_' . $field;
+    }
+
+    // If that is already used, just add a counter until we find an unused alias.
+    $alias_candidate = $alias;
+    $count = 2;
+    while (!empty($this->fields[$alias_candidate])) {
+      $alias_candidate = $alias . '_' . $count++;
+    }
+    $alias = $alias_candidate;
+
+    $this->fields[$alias] = array(
+      'field' => $field,
+      'table' => $table_alias,
+      'alias' => $alias,
+    );
+
+    return $alias;
+  }
+
+  public function fields($table_alias, array $fields = array()) {
+
+    if ($fields) {
+      foreach ($fields as $field) {
+        // We don't care what alias was assigned.
+        $this->addField($table_alias, $field);
+      }
+    }
+    else {
+      // We want all fields from this table.
+      $this->tables[$table_alias]['all_fields'] = TRUE;
+    }
+
+    return $this;
+  }
+
+  public function addExpression($expression, $alias = NULL, $arguments = array()) {
+    if (empty($alias)) {
+      $alias = 'expression';
+    }
+
+    $alias_candidate = $alias;
+    $count = 2;
+    while (!empty($this->expressions[$alias_candidate])) {
+      $alias_candidate = $alias . '_' . $count++;
+    }
+    $alias = $alias_candidate;
+
+    $this->expressions[$alias] = array(
+      'expression' => $expression,
+      'alias' => $alias,
+      'arguments' => $arguments,
+    );
+
+    return $alias;
+  }
+
+  public function join($table, $alias = NULL, $condition = NULL, $arguments = array()) {
+    return $this->addJoin('INNER', $table, $alias, $condition, $arguments);
+  }
+
+  public function innerJoin($table, $alias = NULL, $condition = NULL, $arguments = array()) {
+    return $this->addJoin('INNER', $table, $alias, $condition, $arguments);
+  }
+
+  public function leftJoin($table, $alias = NULL, $condition = NULL, $arguments = array()) {
+    return $this->addJoin('LEFT OUTER', $table, $alias, $condition, $arguments);
+  }
+
+  public function rightJoin($table, $alias = NULL, $condition = NULL, $arguments = array()) {
+    return $this->addJoin('RIGHT OUTER', $table, $alias, $condition, $arguments);
+  }
+
+  public function addJoin($type, $table, $alias = NULL, $condition = NULL, $arguments = array()) {
+
+    if (empty($alias)) {
+      if ($table instanceof SelectQueryInterface) {
+        $alias = 'subquery';
+      }
+      else {
+        $alias = $table;
+      }
+    }
+
+    $alias_candidate = $alias;
+    $count = 2;
+    while (!empty($this->tables[$alias_candidate])) {
+      $alias_candidate = $alias . '_' . $count++;
+    }
+    $alias = $alias_candidate;
+
+    if (is_string($condition)) {
+      $condition = str_replace('%alias', $alias, $condition);
+    }
+
+    $this->tables[$alias] = array(
+      'join type' => $type,
+      'table' => $table,
+      'alias' => $alias,
+      'condition' => $condition,
+      'arguments' => $arguments,
+    );
+
+    return $alias;
+  }
+
+  public function orderBy($field, $direction = 'ASC') {
+    $this->order[$field] = $direction;
+    return $this;
+  }
+
+  public function orderRandom() {
+    $alias = $this->addExpression('RAND()', 'random_field');
+    $this->orderBy($alias);
+    return $this;
+  }
+
+  public function range($start = NULL, $length = NULL) {
+    $this->range = func_num_args() ? array('start' => $start, 'length' => $length) : array();
+    return $this;
+  }
+
+  public function union(SelectQueryInterface $query, $type = '') {
+    // Handle UNION aliasing.
+    switch ($type) {
+      // Fold UNION DISTINCT to UNION for better cross database support.
+      case 'DISTINCT':
+      case '':
+        $type = 'UNION';
+        break;
+
+      case 'ALL':
+        $type = 'UNION ALL';
+      default:
+    }
+
+    $this->union[] = array(
+      'type' => $type,
+      'query' => $query,
+    );
+
+    return $this;
+  }
+
+  public function groupBy($field) {
+    $this->group[$field] = $field;
+    return $this;
+  }
+
+  public function countQuery() {
+    // Create our new query object that we will mutate into a count query.
+    $count = clone($this);
+
+    $group_by = $count->getGroupBy();
+    $having = $count->havingConditions();
+
+    if (!$count->distinct && !isset($having[0])) {
+      // When not executing a distinct query, we can zero-out existing fields
+      // and expressions that are not used by a GROUP BY or HAVING. Fields
+      // listed in a GROUP BY or HAVING clause need to be present in the
+      // query.
+      $fields =& $count->getFields();
+      foreach (array_keys($fields) as $field) {
+        if (empty($group_by[$field])) {
+          unset($fields[$field]);
+        }
+      }
+
+      $expressions =& $count->getExpressions();
+      foreach (array_keys($expressions) as $field) {
+        if (empty($group_by[$field])) {
+          unset($expressions[$field]);
+        }
+      }
+
+      // Also remove 'all_fields' statements, which are expanded into tablename.*
+      // when the query is executed.
+      foreach ($count->tables as $alias => &$table) {
+        unset($table['all_fields']);
+      }
+    }
+
+    // If we've just removed all fields from the query, make sure there is at
+    // least one so that the query still runs.
+    $count->addExpression('1');
+
+    // Ordering a count query is a waste of cycles, and breaks on some
+    // databases anyway.
+    $orders = &$count->getOrderBy();
+    $orders = array();
+
+    if ($count->distinct && !empty($group_by)) {
+      // If the query is distinct and contains a GROUP BY, we need to remove the
+      // distinct because SQL99 does not support counting on distinct multiple fields.
+      $count->distinct = FALSE;
+    }
+
+    $query = $this->connection->select($count);
+    $query->addExpression('COUNT(*)');
+
+    return $query;
+  }
+
+  public function __toString() {
+    // For convenience, we compile the query ourselves if the caller forgot
+    // to do it. This allows constructs like "(string) $query" to work. When
+    // the query will be executed, it will be recompiled using the proper
+    // placeholder generator anyway.
+    if (!$this->compiled()) {
+      $this->compile($this->connection, $this);
+    }
+
+    // Create a sanitized comment string to prepend to the query.
+    $comments = $this->connection->makeComment($this->comments);
+
+    // SELECT
+    $query = $comments . 'SELECT ';
+    if ($this->distinct) {
+      $query .= 'DISTINCT ';
+    }
+
+    // FIELDS and EXPRESSIONS
+    $fields = array();
+    foreach ($this->tables as $alias => $table) {
+      if (!empty($table['all_fields'])) {
+        $fields[] = $this->connection->escapeTable($alias) . '.*';
+      }
+    }
+    foreach ($this->fields as $alias => $field) {
+      // Always use the AS keyword for field aliases, as some
+      // databases require it (e.g., PostgreSQL).
+      $fields[] = (isset($field['table']) ? $this->connection->escapeTable($field['table']) . '.' : '') . $this->connection->escapeField($field['field']) . ' AS ' . $this->connection->escapeAlias($field['alias']);
+    }
+    foreach ($this->expressions as $alias => $expression) {
+      $fields[] = $expression['expression'] . ' AS ' . $this->connection->escapeAlias($expression['alias']);
+    }
+    $query .= implode(', ', $fields);
+
+
+    // FROM - We presume all queries have a FROM, as any query that doesn't won't need the query builder anyway.
+    $query .= "\nFROM ";
+    foreach ($this->tables as $alias => $table) {
+      $query .= "\n";
+      if (isset($table['join type'])) {
+        $query .= $table['join type'] . ' JOIN ';
+      }
+
+      // If the table is a subquery, compile it and integrate it into this query.
+      if ($table['table'] instanceof SelectQueryInterface) {
+        // Run preparation steps on this sub-query before converting to string.
+        $subquery = $table['table'];
+        $subquery->preExecute();
+        $table_string = '(' . (string) $subquery . ')';
+      }
+      else {
+        $table_string = '{' . $this->connection->escapeTable($table['table']) . '}';
+      }
+
+      // Don't use the AS keyword for table aliases, as some
+      // databases don't support it (e.g., Oracle).
+      $query .=  $table_string . ' ' . $this->connection->escapeTable($table['alias']);
+
+      if (!empty($table['condition'])) {
+        $query .= ' ON ' . $table['condition'];
+      }
+    }
+
+    // WHERE
+    if (count($this->where)) {
+      // There is an implicit string cast on $this->condition.
+      $query .= "\nWHERE " . $this->where;
+    }
+
+    // GROUP BY
+    if ($this->group) {
+      $query .= "\nGROUP BY " . implode(', ', $this->group);
+    }
+
+    // HAVING
+    if (count($this->having)) {
+      // There is an implicit string cast on $this->having.
+      $query .= "\nHAVING " . $this->having;
+    }
+
+    // ORDER BY
+    if ($this->order) {
+      $query .= "\nORDER BY ";
+      $fields = array();
+      foreach ($this->order as $field => $direction) {
+        $fields[] = $field . ' ' . $direction;
+      }
+      $query .= implode(', ', $fields);
+    }
+
+    // RANGE
+    // There is no universal SQL standard for handling range or limit clauses.
+    // Fortunately, all core-supported databases use the same range syntax.
+    // Databases that need a different syntax can override this method and
+    // do whatever alternate logic they need to.
+    if (!empty($this->range)) {
+      $query .= "\nLIMIT " . (int) $this->range['length'] . " OFFSET " . (int) $this->range['start'];
+    }
+
+    // UNION is a little odd, as the select queries to combine are passed into
+    // this query, but syntactically they all end up on the same level.
+    if ($this->union) {
+      foreach ($this->union as $union) {
+        $query .= ' ' . $union['type'] . ' ' . (string) $union['query'];
+      }
+    }
+
+    if ($this->forUpdate) {
+      $query .= ' FOR UPDATE';
+    }
+
+    return $query;
+  }
+
+  public function __clone() {
+    // On cloning, also clone the dependent objects. However, we do not
+    // want to clone the database connection object as that would duplicate the
+    // connection itself.
+
+    $this->where = clone($this->where);
+    $this->having = clone($this->having);
+    foreach ($this->union as $key => $aggregate) {
+      $this->union[$key]['query'] = clone($aggregate['query']);
+    }
+  }
+}
+
+/**
+ * @} End of "addtogroup database".
+ */
diff --git a/htmltest/includes/database/sqlite/database.inc b/htmltest/includes/database/sqlite/database.inc
new file mode 100644
index 00000000..b302b3e3
--- /dev/null
+++ b/htmltest/includes/database/sqlite/database.inc
@@ -0,0 +1,519 @@
+<?php
+
+/**
+ * @file
+ * Database interface code for SQLite embedded database engine.
+ */
+
+/**
+ * @addtogroup database
+ * @{
+ */
+
+include_once DRUPAL_ROOT . '/includes/database/prefetch.inc';
+
+/**
+ * Specific SQLite implementation of DatabaseConnection.
+ */
+class DatabaseConnection_sqlite extends DatabaseConnection {
+
+  /**
+   * Whether this database connection supports savepoints.
+   *
+   * Version of sqlite lower then 3.6.8 can't use savepoints.
+   * See http://www.sqlite.org/releaselog/3_6_8.html
+   *
+   * @var boolean
+   */
+  protected $savepointSupport = FALSE;
+
+  /**
+   * Whether or not the active transaction (if any) will be rolled back.
+   *
+   * @var boolean
+   */
+  protected $willRollback;
+
+  /**
+   * All databases attached to the current database. This is used to allow
+   * prefixes to be safely handled without locking the table
+   *
+   * @var array
+   */
+  protected $attachedDatabases = array();
+
+  /**
+   * Whether or not a table has been dropped this request: the destructor will
+   * only try to get rid of unnecessary databases if there is potential of them
+   * being empty.
+   *
+   * This variable is set to public because DatabaseSchema_sqlite needs to
+   * access it. However, it should not be manually set.
+   *
+   * @var boolean
+   */
+  var $tableDropped = FALSE;
+
+  public function __construct(array $connection_options = array()) {
+    // We don't need a specific PDOStatement class here, we simulate it below.
+    $this->statementClass = NULL;
+
+    // This driver defaults to transaction support, except if explicitly passed FALSE.
+    $this->transactionSupport = $this->transactionalDDLSupport = !isset($connection_options['transactions']) || $connection_options['transactions'] !== FALSE;
+
+    $this->connectionOptions = $connection_options;
+
+    // Allow PDO options to be overridden.
+    $connection_options += array(
+      'pdo' => array(),
+    );
+    $connection_options['pdo'] += array(
+      // Convert numeric values to strings when fetching.
+      PDO::ATTR_STRINGIFY_FETCHES => TRUE,
+    );
+    parent::__construct('sqlite:' . $connection_options['database'], '', '', $connection_options['pdo']);
+
+    // Attach one database for each registered prefix.
+    $prefixes = $this->prefixes;
+    foreach ($prefixes as $table => &$prefix) {
+      // Empty prefix means query the main database -- no need to attach anything.
+      if (!empty($prefix)) {
+        // Only attach the database once.
+        if (!isset($this->attachedDatabases[$prefix])) {
+          $this->attachedDatabases[$prefix] = $prefix;
+          $this->query('ATTACH DATABASE :database AS :prefix', array(':database' => $connection_options['database'] . '-' . $prefix, ':prefix' => $prefix));
+        }
+
+        // Add a ., so queries become prefix.table, which is proper syntax for
+        // querying an attached database.
+        $prefix .= '.';
+      }
+    }
+    // Regenerate the prefixes replacement table.
+    $this->setPrefix($prefixes);
+
+    // Detect support for SAVEPOINT.
+    $version = $this->query('SELECT sqlite_version()')->fetchField();
+    $this->savepointSupport = (version_compare($version, '3.6.8') >= 0);
+
+    // Create functions needed by SQLite.
+    $this->sqliteCreateFunction('if', array($this, 'sqlFunctionIf'));
+    $this->sqliteCreateFunction('greatest', array($this, 'sqlFunctionGreatest'));
+    $this->sqliteCreateFunction('pow', 'pow', 2);
+    $this->sqliteCreateFunction('length', 'strlen', 1);
+    $this->sqliteCreateFunction('md5', 'md5', 1);
+    $this->sqliteCreateFunction('concat', array($this, 'sqlFunctionConcat'));
+    $this->sqliteCreateFunction('substring', array($this, 'sqlFunctionSubstring'), 3);
+    $this->sqliteCreateFunction('substring_index', array($this, 'sqlFunctionSubstringIndex'), 3);
+    $this->sqliteCreateFunction('rand', array($this, 'sqlFunctionRand'));
+
+    // Execute sqlite init_commands.
+    if (isset($connection_options['init_commands'])) {
+      $this->exec(implode('; ', $connection_options['init_commands']));
+    }
+  }
+
+  /**
+   * Destructor for the SQLite connection.
+   *
+   * We prune empty databases on destruct, but only if tables have been
+   * dropped. This is especially needed when running the test suite, which
+   * creates and destroy databases several times in a row.
+   */
+  public function __destruct() {
+    if ($this->tableDropped && !empty($this->attachedDatabases)) {
+      foreach ($this->attachedDatabases as $prefix) {
+        // Check if the database is now empty, ignore the internal SQLite tables.
+        try {
+          $count = $this->query('SELECT COUNT(*) FROM ' . $prefix . '.sqlite_master WHERE type = :type AND name NOT LIKE :pattern', array(':type' => 'table', ':pattern' => 'sqlite_%'))->fetchField();
+
+          // We can prune the database file if it doesn't have any tables.
+          if ($count == 0) {
+            // Detach the database.
+            $this->query('DETACH DATABASE :schema', array(':schema' => $prefix));
+            // Destroy the database file.
+            unlink($this->connectionOptions['database'] . '-' . $prefix);
+          }
+        }
+        catch (Exception $e) {
+          // Ignore the exception and continue. There is nothing we can do here
+          // to report the error or fail safe.
+        }
+      }
+    }
+  }
+
+  /**
+   * SQLite compatibility implementation for the IF() SQL function.
+   */
+  public function sqlFunctionIf($condition, $expr1, $expr2 = NULL) {
+    return $condition ? $expr1 : $expr2;
+  }
+
+  /**
+   * SQLite compatibility implementation for the GREATEST() SQL function.
+   */
+  public function sqlFunctionGreatest() {
+    $args = func_get_args();
+    foreach ($args as $k => $v) {
+      if (!isset($v)) {
+        unset($args);
+      }
+    }
+    if (count($args)) {
+      return max($args);
+    }
+    else {
+      return NULL;
+    }
+  }
+
+  /**
+   * SQLite compatibility implementation for the CONCAT() SQL function.
+   */
+  public function sqlFunctionConcat() {
+    $args = func_get_args();
+    return implode('', $args);
+  }
+
+  /**
+   * SQLite compatibility implementation for the SUBSTRING() SQL function.
+   */
+  public function sqlFunctionSubstring($string, $from, $length) {
+    return substr($string, $from - 1, $length);
+  }
+
+  /**
+   * SQLite compatibility implementation for the SUBSTRING_INDEX() SQL function.
+   */
+  public function sqlFunctionSubstringIndex($string, $delimiter, $count) {
+    // If string is empty, simply return an empty string.
+    if (empty($string)) {
+      return '';
+    }
+    $end = 0;
+    for ($i = 0; $i < $count; $i++) {
+      $end = strpos($string, $delimiter, $end + 1);
+      if ($end === FALSE) {
+        $end = strlen($string);
+      }
+    }
+    return substr($string, 0, $end);
+  }
+
+  /**
+   * SQLite compatibility implementation for the RAND() SQL function.
+   */
+  public function sqlFunctionRand($seed = NULL) {
+    if (isset($seed)) {
+      mt_srand($seed);
+    }
+    return mt_rand() / mt_getrandmax();
+  }
+
+  /**
+   * SQLite-specific implementation of DatabaseConnection::prepare().
+   *
+   * We don't use prepared statements at all at this stage. We just create
+   * a DatabaseStatement_sqlite object, that will create a PDOStatement
+   * using the semi-private PDOPrepare() method below.
+   */
+  public function prepare($query, $options = array()) {
+    return new DatabaseStatement_sqlite($this, $query, $options);
+  }
+
+  /**
+   * NEVER CALL THIS FUNCTION: YOU MIGHT DEADLOCK YOUR PHP PROCESS.
+   *
+   * This is a wrapper around the parent PDO::prepare method. However, as
+   * the PDO SQLite driver only closes SELECT statements when the PDOStatement
+   * destructor is called and SQLite does not allow data change (INSERT,
+   * UPDATE etc) on a table which has open SELECT statements, you should never
+   * call this function and keep a PDOStatement object alive as that can lead
+   * to a deadlock. This really, really should be private, but as
+   * DatabaseStatement_sqlite needs to call it, we have no other choice but to
+   * expose this function to the world.
+   */
+  public function PDOPrepare($query, array $options = array()) {
+    return parent::prepare($query, $options);
+  }
+
+  public function queryRange($query, $from, $count, array $args = array(), array $options = array()) {
+    return $this->query($query . ' LIMIT ' . (int) $from . ', ' . (int) $count, $args, $options);
+  }
+
+  public function queryTemporary($query, array $args = array(), array $options = array()) {
+    // Generate a new temporary table name and protect it from prefixing.
+    // SQLite requires that temporary tables to be non-qualified.
+    $tablename = $this->generateTemporaryTableName();
+    $prefixes = $this->prefixes;
+    $prefixes[$tablename] = '';
+    $this->setPrefix($prefixes);
+
+    $this->query(preg_replace('/^SELECT/i', 'CREATE TEMPORARY TABLE ' . $tablename . ' AS SELECT', $query), $args, $options);
+    return $tablename;
+  }
+
+  public function driver() {
+    return 'sqlite';
+  }
+
+  public function databaseType() {
+    return 'sqlite';
+  }
+
+  public function mapConditionOperator($operator) {
+    // We don't want to override any of the defaults.
+    static $specials = array(
+      'LIKE' => array('postfix' => " ESCAPE '\\'"),
+      'NOT LIKE' => array('postfix' => " ESCAPE '\\'"),
+    );
+    return isset($specials[$operator]) ? $specials[$operator] : NULL;
+  }
+
+  public function prepareQuery($query) {
+    return $this->prepare($this->prefixTables($query));
+  }
+
+  public function nextId($existing_id = 0) {
+    $transaction = $this->startTransaction();
+    // We can safely use literal queries here instead of the slower query
+    // builder because if a given database breaks here then it can simply
+    // override nextId. However, this is unlikely as we deal with short strings
+    // and integers and no known databases require special handling for those
+    // simple cases. If another transaction wants to write the same row, it will
+    // wait until this transaction commits.
+    $stmt = $this->query('UPDATE {sequences} SET value = GREATEST(value, :existing_id) + 1', array(
+      ':existing_id' => $existing_id,
+    ));
+    if (!$stmt->rowCount()) {
+      $this->query('INSERT INTO {sequences} (value) VALUES (:existing_id + 1)', array(
+        ':existing_id' => $existing_id,
+      ));
+    }
+    // The transaction gets committed when the transaction object gets destroyed
+    // because it gets out of scope.
+    return $this->query('SELECT value FROM {sequences}')->fetchField();
+  }
+
+  public function rollback($savepoint_name = 'drupal_transaction') {
+    if ($this->savepointSupport) {
+      return parent::rollBack($savepoint_name);
+    }
+
+    if (!$this->inTransaction()) {
+      throw new DatabaseTransactionNoActiveException();
+    }
+    // A previous rollback to an earlier savepoint may mean that the savepoint
+    // in question has already been rolled back.
+    if (!in_array($savepoint_name, $this->transactionLayers)) {
+      return;
+    }
+
+    // We need to find the point we're rolling back to, all other savepoints
+    // before are no longer needed.
+    while ($savepoint = array_pop($this->transactionLayers)) {
+      if ($savepoint == $savepoint_name) {
+        // Mark whole stack of transactions as needed roll back.
+        $this->willRollback = TRUE;
+        // If it is the last the transaction in the stack, then it is not a
+        // savepoint, it is the transaction itself so we will need to roll back
+        // the transaction rather than a savepoint.
+        if (empty($this->transactionLayers)) {
+          break;
+        }
+        return;
+      }
+    }
+    if ($this->supportsTransactions()) {
+      PDO::rollBack();
+    }
+  }
+
+  public function pushTransaction($name) {
+    if ($this->savepointSupport) {
+      return parent::pushTransaction($name);
+    }
+    if (!$this->supportsTransactions()) {
+      return;
+    }
+    if (isset($this->transactionLayers[$name])) {
+      throw new DatabaseTransactionNameNonUniqueException($name . " is already in use.");
+    }
+    if (!$this->inTransaction()) {
+      PDO::beginTransaction();
+    }
+    $this->transactionLayers[$name] = $name;
+  }
+
+  public function popTransaction($name) {
+    if ($this->savepointSupport) {
+      return parent::popTransaction($name);
+    }
+    if (!$this->supportsTransactions()) {
+      return;
+    }
+    if (!$this->inTransaction()) {
+      throw new DatabaseTransactionNoActiveException();
+    }
+
+    // Commit everything since SAVEPOINT $name.
+    while($savepoint = array_pop($this->transactionLayers)) {
+      if ($savepoint != $name) continue;
+
+      // If there are no more layers left then we should commit or rollback.
+      if (empty($this->transactionLayers)) {
+        // If there was any rollback() we should roll back whole transaction.
+        if ($this->willRollback) {
+          $this->willRollback = FALSE;
+          PDO::rollBack();
+        }
+        elseif (!PDO::commit()) {
+          throw new DatabaseTransactionCommitFailedException();
+        }
+      }
+      else {
+        break;
+      }
+    }
+  }
+
+}
+
+/**
+ * Specific SQLite implementation of DatabaseConnection.
+ *
+ * See DatabaseConnection_sqlite::PDOPrepare() for reasons why we must prefetch
+ * the data instead of using PDOStatement.
+ *
+ * @see DatabaseConnection_sqlite::PDOPrepare()
+ */
+class DatabaseStatement_sqlite extends DatabaseStatementPrefetch implements Iterator, DatabaseStatementInterface {
+
+  /**
+   * SQLite specific implementation of getStatement().
+   *
+   * The PDO SQLite layer doesn't replace numeric placeholders in queries
+   * correctly, and this makes numeric expressions (such as COUNT(*) >= :count)
+   * fail. We replace numeric placeholders in the query ourselves to work
+   * around this bug.
+   *
+   * See http://bugs.php.net/bug.php?id=45259 for more details.
+   */
+  protected function getStatement($query, &$args = array()) {
+    if (count($args)) {
+      // Check if $args is a simple numeric array.
+      if (range(0, count($args) - 1) === array_keys($args)) {
+        // In that case, we have unnamed placeholders.
+        $count = 0;
+        $new_args = array();
+        foreach ($args as $value) {
+          if (is_float($value) || is_int($value)) {
+            if (is_float($value)) {
+              // Force the conversion to float so as not to loose precision
+              // in the automatic cast.
+              $value = sprintf('%F', $value);
+            }
+            $query = substr_replace($query, $value, strpos($query, '?'), 1);
+          }
+          else {
+            $placeholder = ':db_statement_placeholder_' . $count++;
+            $query = substr_replace($query, $placeholder, strpos($query, '?'), 1);
+            $new_args[$placeholder] = $value;
+          }
+        }
+        $args = $new_args;
+      }
+      else {
+        // Else, this is using named placeholders.
+        foreach ($args as $placeholder => $value) {
+          if (is_float($value) || is_int($value)) {
+            if (is_float($value)) {
+              // Force the conversion to float so as not to loose precision
+              // in the automatic cast.
+              $value = sprintf('%F', $value);
+            }
+
+            // We will remove this placeholder from the query as PDO throws an
+            // exception if the number of placeholders in the query and the
+            // arguments does not match.
+            unset($args[$placeholder]);
+            // PDO allows placeholders to not be prefixed by a colon. See
+            // http://marc.info/?l=php-internals&m=111234321827149&w=2 for
+            // more.
+            if ($placeholder[0] != ':') {
+              $placeholder = ":$placeholder";
+            }
+            // When replacing the placeholders, make sure we search for the
+            // exact placeholder. For example, if searching for
+            // ':db_placeholder_1', do not replace ':db_placeholder_11'.
+            $query = preg_replace('/' . preg_quote($placeholder) . '\b/', $value, $query);
+          }
+        }
+      }
+    }
+
+    return $this->dbh->PDOPrepare($query);
+  }
+
+  public function execute($args = array(), $options = array()) {
+    try {
+      $return = parent::execute($args, $options);
+    }
+    catch (PDOException $e) {
+      if (!empty($e->errorInfo[1]) && $e->errorInfo[1] === 17) {
+        // The schema has changed. SQLite specifies that we must resend the query.
+        $return = parent::execute($args, $options);
+      }
+      else {
+        // Rethrow the exception.
+        throw $e;
+      }
+    }
+
+    // In some weird cases, SQLite will prefix some column names by the name
+    // of the table. We post-process the data, by renaming the column names
+    // using the same convention as MySQL and PostgreSQL.
+    $rename_columns = array();
+    foreach ($this->columnNames as $k => $column) {
+      // In some SQLite versions, SELECT DISTINCT(field) will return "(field)"
+      // instead of "field".
+      if (preg_match("/^\((.*)\)$/", $column, $matches)) {
+        $rename_columns[$column] = $matches[1];
+        $this->columnNames[$k] = $matches[1];
+        $column = $matches[1];
+      }
+
+      // Remove "table." prefixes.
+      if (preg_match("/^.*\.(.*)$/", $column, $matches)) {
+        $rename_columns[$column] = $matches[1];
+        $this->columnNames[$k] = $matches[1];
+      }
+    }
+    if ($rename_columns) {
+      // DatabaseStatementPrefetch already extracted the first row,
+      // put it back into the result set.
+      if (isset($this->currentRow)) {
+        $this->data[0] = &$this->currentRow;
+      }
+
+      // Then rename all the columns across the result set.
+      foreach ($this->data as $k => $row) {
+        foreach ($rename_columns as $old_column => $new_column) {
+          $this->data[$k][$new_column] = $this->data[$k][$old_column];
+          unset($this->data[$k][$old_column]);
+        }
+      }
+
+      // Finally, extract the first row again.
+      $this->currentRow = $this->data[0];
+      unset($this->data[0]);
+    }
+
+    return $return;
+  }
+}
+
+/**
+ * @} End of "addtogroup database".
+ */
diff --git a/htmltest/includes/database/sqlite/install.inc b/htmltest/includes/database/sqlite/install.inc
new file mode 100644
index 00000000..62cbac38
--- /dev/null
+++ b/htmltest/includes/database/sqlite/install.inc
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * @file
+ * SQLite specific install functions
+ */
+
+class DatabaseTasks_sqlite extends DatabaseTasks {
+  protected $pdoDriver = 'sqlite';
+
+  public function name() {
+    return st('SQLite');
+  }
+
+  /**
+   * Minimum engine version.
+   *
+   * @todo: consider upping to 3.6.8 in Drupal 8 to get SAVEPOINT support.
+   */
+  public function minimumVersion() {
+    return '3.3.7';
+  }
+
+  public function getFormOptions($database) {
+    $form = parent::getFormOptions($database);
+
+    // Remove the options that only apply to client/server style databases.
+    unset($form['username'], $form['password'], $form['advanced_options']['host'], $form['advanced_options']['port']);
+
+    // Make the text more accurate for SQLite.
+    $form['database']['#title'] = st('Database file');
+    $form['database']['#description'] = st('The absolute path to the file where @drupal data will be stored. This must be writable by the web server and should exist outside of the web root.', array('@drupal' => drupal_install_profile_distribution_name()));
+    $default_database = conf_path(FALSE, TRUE) . '/files/.ht.sqlite';
+    $form['database']['#default_value'] = empty($database['database']) ? $default_database : $database['database'];
+    return $form;
+  }
+
+  public function validateDatabaseSettings($database) {
+    // Perform standard validation.
+    $errors = parent::validateDatabaseSettings($database);
+
+    // Verify the database is writable.
+    $db_directory = new SplFileInfo(dirname($database['database']));
+    if (!$db_directory->isWritable()) {
+      $errors[$database['driver'] . '][database'] = st('The directory you specified is not writable by the web server.');
+    }
+
+    return $errors;
+  }
+}
+
diff --git a/htmltest/includes/database/sqlite/query.inc b/htmltest/includes/database/sqlite/query.inc
new file mode 100644
index 00000000..1c6289bd
--- /dev/null
+++ b/htmltest/includes/database/sqlite/query.inc
@@ -0,0 +1,140 @@
+<?php
+
+/**
+ * @file
+ * Query code for SQLite embedded database engine.
+ */
+
+/**
+ * @addtogroup database
+ * @{
+ */
+
+/**
+ * SQLite specific implementation of InsertQuery.
+ *
+ * We ignore all the default fields and use the clever SQLite syntax:
+ *   INSERT INTO table DEFAULT VALUES
+ * for degenerated "default only" queries.
+ */
+class InsertQuery_sqlite extends InsertQuery {
+
+  public function execute() {
+    if (!$this->preExecute()) {
+      return NULL;
+    }
+    if (count($this->insertFields)) {
+      return parent::execute();
+    }
+    else {
+      return $this->connection->query('INSERT INTO {' . $this->table . '} DEFAULT VALUES', array(), $this->queryOptions);
+    }
+  }
+
+  public function __toString() {
+    // Create a sanitized comment string to prepend to the query.
+    $comments = $this->connection->makeComment($this->comments);
+
+    // Produce as many generic placeholders as necessary.
+    $placeholders = array_fill(0, count($this->insertFields), '?');
+
+    // If we're selecting from a SelectQuery, finish building the query and
+    // pass it back, as any remaining options are irrelevant.
+    if (!empty($this->fromQuery)) {
+      $insert_fields_string = $this->insertFields ? ' (' . implode(', ', $this->insertFields) . ') ' : ' ';
+      return $comments . 'INSERT INTO {' . $this->table . '}' . $insert_fields_string . $this->fromQuery;
+    }
+
+    return $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $this->insertFields) . ') VALUES (' . implode(', ', $placeholders) . ')';
+  }
+
+}
+
+/**
+ * SQLite specific implementation of UpdateQuery.
+ *
+ * SQLite counts all the rows that match the conditions as modified, even if they
+ * will not be affected by the query. We workaround this by ensuring that
+ * we don't select those rows.
+ *
+ * A query like this one:
+ *   UPDATE test SET col1 = 'newcol1', col2 = 'newcol2' WHERE tid = 1
+ * will become:
+ *   UPDATE test SET col1 = 'newcol1', col2 = 'newcol2' WHERE tid = 1 AND (col1 <> 'newcol1' OR col2 <> 'newcol2')
+ */
+class UpdateQuery_sqlite extends UpdateQuery {
+  public function execute() {
+    if (!empty($this->queryOptions['sqlite_return_matched_rows'])) {
+      return parent::execute();
+    }
+
+    // Get the fields used in the update query.
+    $fields = $this->expressionFields + $this->fields;
+
+    // Add the inverse of the fields to the condition.
+    $condition = new DatabaseCondition('OR');
+    foreach ($fields as $field => $data) {
+      if (is_array($data)) {
+        // The field is an expression.
+        $condition->where($field . ' <> ' . $data['expression']);
+        $condition->isNull($field);
+      }
+      elseif (!isset($data)) {
+        // The field will be set to NULL.
+        $condition->isNotNull($field);
+      }
+      else {
+        $condition->condition($field, $data, '<>');
+        $condition->isNull($field);
+      }
+    }
+    if (count($condition)) {
+      $condition->compile($this->connection, $this);
+      $this->condition->where((string) $condition, $condition->arguments());
+    }
+    return parent::execute();
+  }
+
+}
+
+/**
+ * SQLite specific implementation of DeleteQuery.
+ *
+ * When the WHERE is omitted from a DELETE statement and the table being deleted
+ * has no triggers, SQLite uses an optimization to erase the entire table content
+ * without having to visit each row of the table individually.
+ *
+ * Prior to SQLite 3.6.5, SQLite does not return the actual number of rows deleted
+ * by that optimized "truncate" optimization.
+ */
+class DeleteQuery_sqlite extends DeleteQuery {
+  public function execute() {
+    if (!count($this->condition)) {
+      $total_rows = $this->connection->query('SELECT COUNT(*) FROM {' . $this->connection->escapeTable($this->table) . '}')->fetchField();
+      parent::execute();
+      return $total_rows;
+    }
+    else {
+      return parent::execute();
+    }
+  }
+}
+
+/**
+ * SQLite specific implementation of TruncateQuery.
+ *
+ * SQLite doesn't support TRUNCATE, but a DELETE query with no condition has
+ * exactly the effect (it is implemented by DROPing the table).
+ */
+class TruncateQuery_sqlite extends TruncateQuery {
+  public function __toString() {
+    // Create a sanitized comment string to prepend to the query.
+    $comments = $this->connection->makeComment($this->comments);
+
+    return $comments . 'DELETE FROM {' . $this->connection->escapeTable($this->table) . '} ';
+  }
+}
+
+/**
+ * @} End of "addtogroup database".
+ */
diff --git a/htmltest/includes/database/sqlite/schema.inc b/htmltest/includes/database/sqlite/schema.inc
new file mode 100644
index 00000000..c5882f12
--- /dev/null
+++ b/htmltest/includes/database/sqlite/schema.inc
@@ -0,0 +1,683 @@
+<?php
+
+/**
+ * @file
+ * Database schema code for SQLite databases.
+ */
+
+
+/**
+ * @ingroup schemaapi
+ * @{
+ */
+
+class DatabaseSchema_sqlite extends DatabaseSchema {
+
+  /**
+   * Override DatabaseSchema::$defaultSchema
+   */
+  protected $defaultSchema = 'main';
+
+  public function tableExists($table) {
+    $info = $this->getPrefixInfo($table);
+
+    // Don't use {} around sqlite_master table.
+    return (bool) $this->connection->query('SELECT 1 FROM ' . $info['schema'] . '.sqlite_master WHERE type = :type AND name = :name', array(':type' => 'table', ':name' => $info['table']))->fetchField();
+  }
+
+  public function fieldExists($table, $column) {
+    $schema = $this->introspectSchema($table);
+    return !empty($schema['fields'][$column]);
+  }
+
+  /**
+   * Generate SQL to create a new table from a Drupal schema definition.
+   *
+   * @param $name
+   *   The name of the table to create.
+   * @param $table
+   *   A Schema API table definition array.
+   * @return
+   *   An array of SQL statements to create the table.
+   */
+  public function createTableSql($name, $table) {
+    $sql = array();
+    $sql[] = "CREATE TABLE {" . $name . "} (\n" . $this->createColumsSql($name, $table) . "\n);\n";
+    return array_merge($sql, $this->createIndexSql($name, $table));
+  }
+
+  /**
+   * Build the SQL expression for indexes.
+   */
+  protected function createIndexSql($tablename, $schema) {
+    $sql = array();
+    $info = $this->getPrefixInfo($tablename);
+    if (!empty($schema['unique keys'])) {
+      foreach ($schema['unique keys'] as $key => $fields) {
+        $sql[] = 'CREATE UNIQUE INDEX ' . $info['schema'] . '.' . $info['table'] . '_' . $key . ' ON ' . $info['table'] . ' (' . $this->createKeySql($fields) . "); \n";
+      }
+    }
+    if (!empty($schema['indexes'])) {
+      foreach ($schema['indexes'] as $key => $fields) {
+        $sql[] = 'CREATE INDEX ' . $info['schema'] . '.' . $info['table'] . '_' . $key . ' ON ' . $info['table'] . ' (' . $this->createKeySql($fields) . "); \n";
+      }
+    }
+    return $sql;
+  }
+
+  /**
+   * Build the SQL expression for creating columns.
+   */
+  protected function createColumsSql($tablename, $schema) {
+    $sql_array = array();
+
+    // Add the SQL statement for each field.
+    foreach ($schema['fields'] as $name => $field) {
+      if (isset($field['type']) && $field['type'] == 'serial') {
+        if (isset($schema['primary key']) && ($key = array_search($name, $schema['primary key'])) !== FALSE) {
+          unset($schema['primary key'][$key]);
+        }
+      }
+      $sql_array[] = $this->createFieldSql($name, $this->processField($field));
+    }
+
+    // Process keys.
+    if (!empty($schema['primary key'])) {
+      $sql_array[] = " PRIMARY KEY (" . $this->createKeySql($schema['primary key']) . ")";
+    }
+
+    return implode(", \n", $sql_array);
+  }
+
+  /**
+   * Build the SQL expression for keys.
+   */
+  protected function createKeySql($fields) {
+    $return = array();
+    foreach ($fields as $field) {
+      if (is_array($field)) {
+        $return[] = $field[0];
+      }
+      else {
+        $return[] = $field;
+      }
+    }
+    return implode(', ', $return);
+  }
+
+  /**
+   * Set database-engine specific properties for a field.
+   *
+   * @param $field
+   *   A field description array, as specified in the schema documentation.
+   */
+  protected function processField($field) {
+    if (!isset($field['size'])) {
+      $field['size'] = 'normal';
+    }
+
+    // Set the correct database-engine specific datatype.
+    // In case one is already provided, force it to uppercase.
+    if (isset($field['sqlite_type'])) {
+      $field['sqlite_type'] = drupal_strtoupper($field['sqlite_type']);
+    }
+    else {
+      $map = $this->getFieldTypeMap();
+      $field['sqlite_type'] = $map[$field['type'] . ':' . $field['size']];
+    }
+
+    if (isset($field['type']) && $field['type'] == 'serial') {
+      $field['auto_increment'] = TRUE;
+    }
+
+    return $field;
+  }
+
+  /**
+   * Create an SQL string for a field to be used in table creation or alteration.
+   *
+   * Before passing a field out of a schema definition into this function it has
+   * to be processed by db_processField().
+   *
+   * @param $name
+   *    Name of the field.
+   * @param $spec
+   *    The field specification, as per the schema data structure format.
+   */
+  protected function createFieldSql($name, $spec) {
+    if (!empty($spec['auto_increment'])) {
+      $sql = $name . " INTEGER PRIMARY KEY AUTOINCREMENT";
+      if (!empty($spec['unsigned'])) {
+        $sql .= ' CHECK (' . $name . '>= 0)';
+      }
+    }
+    else {
+      $sql = $name . ' ' . $spec['sqlite_type'];
+
+      if (in_array($spec['sqlite_type'], array('VARCHAR', 'TEXT')) && isset($spec['length'])) {
+        $sql .= '(' . $spec['length'] . ')';
+      }
+
+      if (isset($spec['not null'])) {
+        if ($spec['not null']) {
+          $sql .= ' NOT NULL';
+        }
+        else {
+          $sql .= ' NULL';
+        }
+      }
+
+      if (!empty($spec['unsigned'])) {
+        $sql .= ' CHECK (' . $name . '>= 0)';
+      }
+
+      if (isset($spec['default'])) {
+        if (is_string($spec['default'])) {
+          $spec['default'] = "'" . $spec['default'] . "'";
+        }
+        $sql .= ' DEFAULT ' . $spec['default'];
+      }
+
+      if (empty($spec['not null']) && !isset($spec['default'])) {
+        $sql .= ' DEFAULT NULL';
+      }
+    }
+    return $sql;
+  }
+
+  /**
+   * This maps a generic data type in combination with its data size
+   * to the engine-specific data type.
+   */
+  public function getFieldTypeMap() {
+    // Put :normal last so it gets preserved by array_flip. This makes
+    // it much easier for modules (such as schema.module) to map
+    // database types back into schema types.
+    // $map does not use drupal_static as its value never changes.
+    static $map = array(
+      'varchar:normal'  => 'VARCHAR',
+      'char:normal'     => 'CHAR',
+
+      'text:tiny'       => 'TEXT',
+      'text:small'      => 'TEXT',
+      'text:medium'     => 'TEXT',
+      'text:big'        => 'TEXT',
+      'text:normal'     => 'TEXT',
+
+      'serial:tiny'     => 'INTEGER',
+      'serial:small'    => 'INTEGER',
+      'serial:medium'   => 'INTEGER',
+      'serial:big'      => 'INTEGER',
+      'serial:normal'   => 'INTEGER',
+
+      'int:tiny'        => 'INTEGER',
+      'int:small'       => 'INTEGER',
+      'int:medium'      => 'INTEGER',
+      'int:big'         => 'INTEGER',
+      'int:normal'      => 'INTEGER',
+
+      'float:tiny'      => 'FLOAT',
+      'float:small'     => 'FLOAT',
+      'float:medium'    => 'FLOAT',
+      'float:big'       => 'FLOAT',
+      'float:normal'    => 'FLOAT',
+
+      'numeric:normal'  => 'NUMERIC',
+
+      'blob:big'        => 'BLOB',
+      'blob:normal'     => 'BLOB',
+    );
+    return $map;
+  }
+
+  public function renameTable($table, $new_name) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot rename %table to %table_new: table %table doesn't exist.", array('%table' => $table, '%table_new' => $new_name)));
+    }
+    if ($this->tableExists($new_name)) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot rename %table to %table_new: table %table_new already exists.", array('%table' => $table, '%table_new' => $new_name)));
+    }
+
+    $schema = $this->introspectSchema($table);
+
+    // SQLite doesn't allow you to rename tables outside of the current
+    // database. So the syntax '...RENAME TO database.table' would fail.
+    // So we must determine the full table name here rather than surrounding
+    // the table with curly braces incase the db_prefix contains a reference
+    // to a database outside of our existsing database.
+    $info = $this->getPrefixInfo($new_name);
+    $this->connection->query('ALTER TABLE {' . $table . '} RENAME TO ' . $info['table']);
+
+    // Drop the indexes, there is no RENAME INDEX command in SQLite.
+    if (!empty($schema['unique keys'])) {
+      foreach ($schema['unique keys'] as $key => $fields) {
+        $this->dropIndex($table, $key);
+      }
+    }
+    if (!empty($schema['indexes'])) {
+      foreach ($schema['indexes'] as $index => $fields) {
+        $this->dropIndex($table, $index);
+      }
+    }
+
+    // Recreate the indexes.
+    $statements = $this->createIndexSql($new_name, $schema);
+    foreach ($statements as $statement) {
+      $this->connection->query($statement);
+    }
+  }
+
+  public function dropTable($table) {
+    if (!$this->tableExists($table)) {
+      return FALSE;
+    }
+    $this->connection->tableDropped = TRUE;
+    $this->connection->query('DROP TABLE {' . $table . '}');
+    return TRUE;
+  }
+
+  public function addField($table, $field, $specification, $keys_new = array()) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add field %table.%field: table doesn't exist.", array('%field' => $field, '%table' => $table)));
+    }
+    if ($this->fieldExists($table, $field)) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot add field %table.%field: field already exists.", array('%field' => $field, '%table' => $table)));
+    }
+
+    // SQLite doesn't have a full-featured ALTER TABLE statement. It only
+    // supports adding new fields to a table, in some simple cases. In most
+    // cases, we have to create a new table and copy the data over.
+    if (empty($keys_new) && (empty($specification['not null']) || isset($specification['default']))) {
+      // When we don't have to create new keys and we are not creating a
+      // NOT NULL column without a default value, we can use the quicker version.
+      $query = 'ALTER TABLE {' . $table . '} ADD ' . $this->createFieldSql($field, $this->processField($specification));
+      $this->connection->query($query);
+
+      // Apply the initial value if set.
+      if (isset($specification['initial'])) {
+        $this->connection->update($table)
+          ->fields(array($field => $specification['initial']))
+          ->execute();
+      }
+    }
+    else {
+      // We cannot add the field directly. Use the slower table alteration
+      // method, starting from the old schema.
+      $old_schema = $this->introspectSchema($table);
+      $new_schema = $old_schema;
+
+      // Add the new field.
+      $new_schema['fields'][$field] = $specification;
+
+      // Build the mapping between the old fields and the new fields.
+      $mapping = array();
+      if (isset($specification['initial'])) {
+        // If we have a initial value, copy it over.
+        $mapping[$field] = array(
+          'expression' => ':newfieldinitial',
+          'arguments' => array(':newfieldinitial' => $specification['initial']),
+        );
+      }
+      else {
+        // Else use the default of the field.
+        $mapping[$field] = NULL;
+      }
+
+      // Add the new indexes.
+      $new_schema += $keys_new;
+
+      $this->alterTable($table, $old_schema, $new_schema, $mapping);
+    }
+  }
+
+  /**
+   * Create a table with a new schema containing the old content.
+   *
+   * As SQLite does not support ALTER TABLE (with a few exceptions) it is
+   * necessary to create a new table and copy over the old content.
+   *
+   * @param $table
+   *   Name of the table to be altered.
+   * @param $old_schema
+   *   The old schema array for the table.
+   * @param $new_schema
+   *   The new schema array for the table.
+   * @param $mapping
+   *   An optional mapping between the fields of the old specification and the
+   *   fields of the new specification. An associative array, whose keys are
+   *   the fields of the new table, and values can take two possible forms:
+   *     - a simple string, which is interpreted as the name of a field of the
+   *       old table,
+   *     - an associative array with two keys 'expression' and 'arguments',
+   *       that will be used as an expression field.
+   */
+  protected function alterTable($table, $old_schema, $new_schema, array $mapping = array()) {
+    $i = 0;
+    do {
+      $new_table = $table . '_' . $i++;
+    } while ($this->tableExists($new_table));
+
+    $this->createTable($new_table, $new_schema);
+
+    // Build a SQL query to migrate the data from the old table to the new.
+    $select = $this->connection->select($table);
+
+    // Complete the mapping.
+    $possible_keys = array_keys($new_schema['fields']);
+    $mapping += array_combine($possible_keys, $possible_keys);
+
+    // Now add the fields.
+    foreach ($mapping as $field_alias => $field_source) {
+      // Just ignore this field (ie. use it's default value).
+      if (!isset($field_source)) {
+        continue;
+      }
+
+      if (is_array($field_source)) {
+        $select->addExpression($field_source['expression'], $field_alias, $field_source['arguments']);
+      }
+      else {
+        $select->addField($table, $field_source, $field_alias);
+      }
+    }
+
+    // Execute the data migration query.
+    $this->connection->insert($new_table)
+      ->from($select)
+      ->execute();
+
+    $old_count = $this->connection->query('SELECT COUNT(*) FROM {' . $table . '}')->fetchField();
+    $new_count = $this->connection->query('SELECT COUNT(*) FROM {' . $new_table . '}')->fetchField();
+    if ($old_count == $new_count) {
+      $this->dropTable($table);
+      $this->renameTable($new_table, $table);
+    }
+  }
+
+  /**
+   * Find out the schema of a table.
+   *
+   * This function uses introspection methods provided by the database to
+   * create a schema array. This is useful, for example, during update when
+   * the old schema is not available.
+   *
+   * @param $table
+   *   Name of the table.
+   * @return
+   *   An array representing the schema, from drupal_get_schema().
+   * @see drupal_get_schema()
+   */
+  protected function introspectSchema($table) {
+    $mapped_fields = array_flip($this->getFieldTypeMap());
+    $schema = array(
+      'fields' => array(),
+      'primary key' => array(),
+      'unique keys' => array(),
+      'indexes' => array(),
+    );
+
+    $info = $this->getPrefixInfo($table);
+    $result = $this->connection->query('PRAGMA ' . $info['schema'] . '.table_info(' . $info['table'] . ')');
+    foreach ($result as $row) {
+      if (preg_match('/^([^(]+)\((.*)\)$/', $row->type, $matches)) {
+        $type = $matches[1];
+        $length = $matches[2];
+      }
+      else {
+        $type = $row->type;
+        $length = NULL;
+      }
+      if (isset($mapped_fields[$type])) {
+        list($type, $size) = explode(':', $mapped_fields[$type]);
+        $schema['fields'][$row->name] = array(
+          'type' => $type,
+          'size' => $size,
+          'not null' => !empty($row->notnull),
+          'default' => trim($row->dflt_value, "'"),
+        );
+        if ($length) {
+          $schema['fields'][$row->name]['length'] = $length;
+        }
+        if ($row->pk) {
+          $schema['primary key'][] = $row->name;
+        }
+      }
+      else {
+        new Exception("Unable to parse the column type " . $row->type);
+      }
+    }
+    $indexes = array();
+    $result = $this->connection->query('PRAGMA ' . $info['schema'] . '.index_list(' . $info['table'] . ')');
+    foreach ($result as $row) {
+      if (strpos($row->name, 'sqlite_autoindex_') !== 0) {
+        $indexes[] = array(
+          'schema_key' => $row->unique ? 'unique keys' : 'indexes',
+          'name' => $row->name,
+        );
+      }
+    }
+    foreach ($indexes as $index) {
+      $name = $index['name'];
+      // Get index name without prefix.
+      $index_name = substr($name, strlen($info['table']) + 1);
+      $result = $this->connection->query('PRAGMA ' . $info['schema'] . '.index_info(' . $name . ')');
+      foreach ($result as $row) {
+        $schema[$index['schema_key']][$index_name][] = $row->name;
+      }
+    }
+    return $schema;
+  }
+
+  public function dropField($table, $field) {
+    if (!$this->fieldExists($table, $field)) {
+      return FALSE;
+    }
+
+    $old_schema = $this->introspectSchema($table);
+    $new_schema = $old_schema;
+
+    unset($new_schema['fields'][$field]);
+    foreach ($new_schema['indexes'] as $index => $fields) {
+      foreach ($fields as $key => $field_name) {
+        if ($field_name == $field) {
+          unset($new_schema['indexes'][$index][$key]);
+        }
+      }
+      // If this index has no more fields then remove it.
+      if (empty($new_schema['indexes'][$index])) {
+        unset($new_schema['indexes'][$index]);
+      }
+    }
+    $this->alterTable($table, $old_schema, $new_schema);
+    return TRUE;
+  }
+
+  public function changeField($table, $field, $field_new, $spec, $keys_new = array()) {
+    if (!$this->fieldExists($table, $field)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot change the definition of field %table.%name: field doesn't exist.", array('%table' => $table, '%name' => $field)));
+    }
+    if (($field != $field_new) && $this->fieldExists($table, $field_new)) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot rename field %table.%name to %name_new: target field already exists.", array('%table' => $table, '%name' => $field, '%name_new' => $field_new)));
+    }
+
+    $old_schema = $this->introspectSchema($table);
+    $new_schema = $old_schema;
+
+    // Map the old field to the new field.
+    if ($field != $field_new) {
+      $mapping[$field_new] = $field;
+    }
+    else {
+      $mapping = array();
+    }
+
+    // Remove the previous definition and swap in the new one.
+    unset($new_schema['fields'][$field]);
+    $new_schema['fields'][$field_new] = $spec;
+
+    // Map the former indexes to the new column name.
+    $new_schema['primary key'] = $this->mapKeyDefinition($new_schema['primary key'], $mapping);
+    foreach (array('unique keys', 'indexes') as $k) {
+      foreach ($new_schema[$k] as &$key_definition) {
+        $key_definition = $this->mapKeyDefinition($key_definition, $mapping);
+      }
+    }
+
+    // Add in the keys from $keys_new.
+    if (isset($keys_new['primary key'])) {
+      $new_schema['primary key'] = $keys_new['primary key'];
+    }
+    foreach (array('unique keys', 'indexes') as $k) {
+      if (!empty($keys_new[$k])) {
+        $new_schema[$k] = $keys_new[$k] + $new_schema[$k];
+      }
+    }
+
+    $this->alterTable($table, $old_schema, $new_schema, $mapping);
+  }
+
+  /**
+   * Utility method: rename columns in an index definition according to a new mapping.
+   *
+   * @param $key_definition
+   *   The key definition.
+   * @param $mapping
+   *   The new mapping.
+   */
+  protected function mapKeyDefinition(array $key_definition, array $mapping) {
+    foreach ($key_definition as &$field) {
+      // The key definition can be an array($field, $length).
+      if (is_array($field)) {
+        $field = &$field[0];
+      }
+      if (isset($mapping[$field])) {
+        $field = $mapping[$field];
+      }
+    }
+    return $key_definition;
+  }
+
+  public function addIndex($table, $name, $fields) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add index %name to table %table: table doesn't exist.", array('%table' => $table, '%name' => $name)));
+    }
+    if ($this->indexExists($table, $name)) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot add index %name to table %table: index already exists.", array('%table' => $table, '%name' => $name)));
+    }
+
+    $schema['indexes'][$name] = $fields;
+    $statements = $this->createIndexSql($table, $schema);
+    foreach ($statements as $statement) {
+      $this->connection->query($statement);
+    }
+  }
+
+  public function indexExists($table, $name) {
+    $info = $this->getPrefixInfo($table);
+
+    return $this->connection->query('PRAGMA ' . $info['schema'] . '.index_info(' . $info['table'] . '_' . $name . ')')->fetchField() != '';
+  }
+
+  public function dropIndex($table, $name) {
+    if (!$this->indexExists($table, $name)) {
+      return FALSE;
+    }
+
+    $info = $this->getPrefixInfo($table);
+
+    $this->connection->query('DROP INDEX ' . $info['schema'] . '.' . $info['table'] . '_' . $name);
+    return TRUE;
+  }
+
+  public function addUniqueKey($table, $name, $fields) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add unique key %name to table %table: table doesn't exist.", array('%table' => $table, '%name' => $name)));
+    }
+    if ($this->indexExists($table, $name)) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot add unique key %name to table %table: unique key already exists.", array('%table' => $table, '%name' => $name)));
+    }
+
+    $schema['unique keys'][$name] = $fields;
+    $statements = $this->createIndexSql($table, $schema);
+    foreach ($statements as $statement) {
+      $this->connection->query($statement);
+    }
+  }
+
+  public function dropUniqueKey($table, $name) {
+    if (!$this->indexExists($table, $name)) {
+      return FALSE;
+    }
+
+    $info = $this->getPrefixInfo($table);
+
+    $this->connection->query('DROP INDEX ' . $info['schema'] . '.' . $info['table'] . '_' . $name);
+    return TRUE;
+  }
+
+  public function addPrimaryKey($table, $fields) {
+    if (!$this->tableExists($table)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add primary key to table %table: table doesn't exist.", array('%table' => $table)));
+    }
+
+    $old_schema = $this->introspectSchema($table);
+    $new_schema = $old_schema;
+
+    if (!empty($new_schema['primary key'])) {
+      throw new DatabaseSchemaObjectExistsException(t("Cannot add primary key to table %table: primary key already exists.", array('%table' => $table)));
+    }
+
+    $new_schema['primary key'] = $fields;
+    $this->alterTable($table, $old_schema, $new_schema);
+  }
+
+  public function dropPrimaryKey($table) {
+    $old_schema = $this->introspectSchema($table);
+    $new_schema = $old_schema;
+
+    if (empty($new_schema['primary key'])) {
+      return FALSE;
+    }
+
+    unset($new_schema['primary key']);
+    $this->alterTable($table, $old_schema, $new_schema);
+    return TRUE;
+  }
+
+  public function fieldSetDefault($table, $field, $default) {
+    if (!$this->fieldExists($table, $field)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot set default value of field %table.%field: field doesn't exist.", array('%table' => $table, '%field' => $field)));
+    }
+
+    $old_schema = $this->introspectSchema($table);
+    $new_schema = $old_schema;
+
+    $new_schema['fields'][$field]['default'] = $default;
+    $this->alterTable($table, $old_schema, $new_schema);
+  }
+
+  public function fieldSetNoDefault($table, $field) {
+    if (!$this->fieldExists($table, $field)) {
+      throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot remove default value of field %table.%field: field doesn't exist.", array('%table' => $table, '%field' => $field)));
+    }
+
+    $old_schema = $this->introspectSchema($table);
+    $new_schema = $old_schema;
+
+    unset($new_schema['fields'][$field]['default']);
+    $this->alterTable($table, $old_schema, $new_schema);
+  }
+
+  public function findTables($table_expression) {
+    // Don't add the prefix, $table_expression already includes the prefix.
+    $info = $this->getPrefixInfo($table_expression, FALSE);
+
+    // Can't use query placeholders for the schema because the query would have
+    // to be :prefixsqlite_master, which does not work.
+    $result = db_query("SELECT name FROM " . $info['schema'] . ".sqlite_master WHERE type = :type AND name LIKE :table_name", array(
+      ':type' => 'table',
+      ':table_name' => $info['table'],
+    ));
+    return $result->fetchAllKeyed(0, 0);
+  }
+}
diff --git a/htmltest/includes/database/sqlite/select.inc b/htmltest/includes/database/sqlite/select.inc
new file mode 100644
index 00000000..9037a0e7
--- /dev/null
+++ b/htmltest/includes/database/sqlite/select.inc
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file
+ * Select builder for SQLite embedded database engine.
+ */
+
+/**
+ * @addtogroup database
+ * @{
+ */
+
+/**
+ * SQLite specific query builder for SELECT statements.
+ */
+class SelectQuery_sqlite extends SelectQuery {
+  public function forUpdate($set = TRUE) {
+    // SQLite does not support FOR UPDATE so nothing to do.
+    return $this;
+  }
+}
+
+/**
+ * @} End of "addtogroup database".
+ */
+
+
diff --git a/htmltest/includes/date.inc b/htmltest/includes/date.inc
new file mode 100644
index 00000000..01ab131b
--- /dev/null
+++ b/htmltest/includes/date.inc
@@ -0,0 +1,196 @@
+<?php
+
+/**
+ * @file
+ * Initializes the list of date formats and their locales.
+ */
+
+/**
+ * Provides a default system list of date formats for system_date_formats().
+ */
+function system_default_date_formats() {
+  $formats = array();
+
+  // Short date formats.
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'Y-m-d H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'm/d/Y - H:i',
+    'locales' => array('en-us'),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'd/m/Y - H:i',
+    'locales' => array('en-gb', 'en-hk', 'en-ie', 'el-gr', 'es-es', 'fr-be', 'fr-fr', 'fr-lu', 'it-it', 'nl-be', 'pt-pt'),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'Y/m/d - H:i',
+    'locales' => array('en-ca', 'fr-ca', 'no-no', 'sv-se'),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'd.m.Y - H:i',
+    'locales' => array('de-ch', 'de-de', 'de-lu', 'fi-fi', 'fr-ch', 'is-is', 'pl-pl', 'ro-ro', 'ru-ru'),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'm/d/Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'd/m/Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'Y/m/d - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'M j Y - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'j M Y - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'Y M j - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'M j Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'j M Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'Y M j - g:ia',
+    'locales' => array(),
+  );
+
+  // Medium date formats.
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'D, Y-m-d H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'D, m/d/Y - H:i',
+    'locales' => array('en-us'),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'D, d/m/Y - H:i',
+    'locales' => array('en-gb', 'en-hk', 'en-ie', 'el-gr', 'es-es', 'fr-be', 'fr-fr', 'fr-lu', 'it-it', 'nl-be', 'pt-pt'),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'D, Y/m/d - H:i',
+    'locales' => array('en-ca', 'fr-ca', 'no-no', 'sv-se'),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'F j, Y - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'j F, Y - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'Y, F j - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'D, m/d/Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'D, d/m/Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'D, Y/m/d - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'F j, Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'j F Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'Y, F j - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'j. F Y - G:i',
+    'locales' => array(),
+  );
+
+  // Long date formats.
+  $formats[] = array(
+    'type' => 'long',
+    'format' => 'l, F j, Y - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'long',
+    'format' => 'l, j F, Y - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'long',
+    'format' => 'l, Y,  F j - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'long',
+    'format' => 'l, F j, Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'long',
+    'format' => 'l, j F Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'long',
+    'format' => 'l, Y,  F j - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'long',
+    'format' => 'l, j. F Y - G:i',
+    'locales' => array(),
+  );
+
+  return $formats;
+}
diff --git a/htmltest/includes/entity.inc b/htmltest/includes/entity.inc
new file mode 100644
index 00000000..25f75846
--- /dev/null
+++ b/htmltest/includes/entity.inc
@@ -0,0 +1,1360 @@
+<?php
+
+/**
+ * Interface for entity controller classes.
+ *
+ * All entity controller classes specified via the 'controller class' key
+ * returned by hook_entity_info() or hook_entity_info_alter() have to implement
+ * this interface.
+ *
+ * Most simple, SQL-based entity controllers will do better by extending
+ * DrupalDefaultEntityController instead of implementing this interface
+ * directly.
+ */
+interface DrupalEntityControllerInterface {
+
+  /**
+   * Resets the internal, static entity cache.
+   *
+   * @param $ids
+   *   (optional) If specified, the cache is reset for the entities with the
+   *   given ids only.
+   */
+  public function resetCache(array $ids = NULL);
+
+  /**
+   * Loads one or more entities.
+   *
+   * @param $ids
+   *   An array of entity IDs, or FALSE to load all entities.
+   * @param $conditions
+   *   An array of conditions in the form 'field' => $value.
+   *
+   * @return
+   *   An array of entity objects indexed by their ids. When no results are
+   *   found, an empty array is returned.
+   */
+  public function load($ids = array(), $conditions = array());
+}
+
+/**
+ * Default implementation of DrupalEntityControllerInterface.
+ *
+ * This class can be used as-is by most simple entity types. Entity types
+ * requiring special handling can extend the class.
+ */
+class DrupalDefaultEntityController implements DrupalEntityControllerInterface {
+
+  /**
+   * Static cache of entities.
+   *
+   * @var array
+   */
+  protected $entityCache;
+
+  /**
+   * Entity type for this controller instance.
+   *
+   * @var string
+   */
+  protected $entityType;
+
+  /**
+   * Array of information about the entity.
+   *
+   * @var array
+   *
+   * @see entity_get_info()
+   */
+  protected $entityInfo;
+
+  /**
+   * Additional arguments to pass to hook_TYPE_load().
+   *
+   * Set before calling DrupalDefaultEntityController::attachLoad().
+   *
+   * @var array
+   */
+  protected $hookLoadArguments;
+
+  /**
+   * Name of the entity's ID field in the entity database table.
+   *
+   * @var string
+   */
+  protected $idKey;
+
+  /**
+   * Name of entity's revision database table field, if it supports revisions.
+   *
+   * Has the value FALSE if this entity does not use revisions.
+   *
+   * @var string
+   */
+  protected $revisionKey;
+
+  /**
+   * The table that stores revisions, if the entity supports revisions.
+   *
+   * @var string
+   */
+  protected $revisionTable;
+
+  /**
+   * Whether this entity type should use the static cache.
+   *
+   * Set by entity info.
+   *
+   * @var boolean
+   */
+  protected $cache;
+
+  /**
+   * Constructor: sets basic variables.
+   *
+   * @param $entityType
+   *   The entity type for which the instance is created.
+   */
+  public function __construct($entityType) {
+    $this->entityType = $entityType;
+    $this->entityInfo = entity_get_info($entityType);
+    $this->entityCache = array();
+    $this->hookLoadArguments = array();
+    $this->idKey = $this->entityInfo['entity keys']['id'];
+
+    // Check if the entity type supports revisions.
+    if (!empty($this->entityInfo['entity keys']['revision'])) {
+      $this->revisionKey = $this->entityInfo['entity keys']['revision'];
+      $this->revisionTable = $this->entityInfo['revision table'];
+    }
+    else {
+      $this->revisionKey = FALSE;
+    }
+
+    // Check if the entity type supports static caching of loaded entities.
+    $this->cache = !empty($this->entityInfo['static cache']);
+  }
+
+  /**
+   * Implements DrupalEntityControllerInterface::resetCache().
+   */
+  public function resetCache(array $ids = NULL) {
+    if (isset($ids)) {
+      foreach ($ids as $id) {
+        unset($this->entityCache[$id]);
+      }
+    }
+    else {
+      $this->entityCache = array();
+    }
+  }
+
+  /**
+   * Implements DrupalEntityControllerInterface::load().
+   */
+  public function load($ids = array(), $conditions = array()) {
+    $entities = array();
+
+    // Revisions are not statically cached, and require a different query to
+    // other conditions, so separate the revision id into its own variable.
+    if ($this->revisionKey && isset($conditions[$this->revisionKey])) {
+      $revision_id = $conditions[$this->revisionKey];
+      unset($conditions[$this->revisionKey]);
+    }
+    else {
+      $revision_id = FALSE;
+    }
+
+    // Create a new variable which is either a prepared version of the $ids
+    // array for later comparison with the entity cache, or FALSE if no $ids
+    // were passed. The $ids array is reduced as items are loaded from cache,
+    // and we need to know if it's empty for this reason to avoid querying the
+    // database when all requested entities are loaded from cache.
+    $passed_ids = !empty($ids) ? array_flip($ids) : FALSE;
+    // Try to load entities from the static cache, if the entity type supports
+    // static caching.
+    if ($this->cache && !$revision_id) {
+      $entities += $this->cacheGet($ids, $conditions);
+      // If any entities were loaded, remove them from the ids still to load.
+      if ($passed_ids) {
+        $ids = array_keys(array_diff_key($passed_ids, $entities));
+      }
+    }
+
+    // Load any remaining entities from the database. This is the case if $ids
+    // is set to FALSE (so we load all entities), if there are any ids left to
+    // load, if loading a revision, or if $conditions was passed without $ids.
+    if ($ids === FALSE || $ids || $revision_id || ($conditions && !$passed_ids)) {
+      // Build the query.
+      $query = $this->buildQuery($ids, $conditions, $revision_id);
+      $queried_entities = $query
+        ->execute()
+        ->fetchAllAssoc($this->idKey);
+    }
+
+    // Pass all entities loaded from the database through $this->attachLoad(),
+    // which attaches fields (if supported by the entity type) and calls the
+    // entity type specific load callback, for example hook_node_load().
+    if (!empty($queried_entities)) {
+      $this->attachLoad($queried_entities, $revision_id);
+      $entities += $queried_entities;
+    }
+
+    if ($this->cache) {
+      // Add entities to the cache if we are not loading a revision.
+      if (!empty($queried_entities) && !$revision_id) {
+        $this->cacheSet($queried_entities);
+      }
+    }
+
+    // Ensure that the returned array is ordered the same as the original
+    // $ids array if this was passed in and remove any invalid ids.
+    if ($passed_ids) {
+      // Remove any invalid ids from the array.
+      $passed_ids = array_intersect_key($passed_ids, $entities);
+      foreach ($entities as $entity) {
+        $passed_ids[$entity->{$this->idKey}] = $entity;
+      }
+      $entities = $passed_ids;
+    }
+
+    return $entities;
+  }
+
+  /**
+   * Builds the query to load the entity.
+   *
+   * This has full revision support. For entities requiring special queries,
+   * the class can be extended, and the default query can be constructed by
+   * calling parent::buildQuery(). This is usually necessary when the object
+   * being loaded needs to be augmented with additional data from another
+   * table, such as loading node type into comments or vocabulary machine name
+   * into terms, however it can also support $conditions on different tables.
+   * See CommentController::buildQuery() or TaxonomyTermController::buildQuery()
+   * for examples.
+   *
+   * @param $ids
+   *   An array of entity IDs, or FALSE to load all entities.
+   * @param $conditions
+   *   An array of conditions in the form 'field' => $value.
+   * @param $revision_id
+   *   The ID of the revision to load, or FALSE if this query is asking for the
+   *   most current revision(s).
+   *
+   * @return SelectQuery
+   *   A SelectQuery object for loading the entity.
+   */
+  protected function buildQuery($ids, $conditions = array(), $revision_id = FALSE) {
+    $query = db_select($this->entityInfo['base table'], 'base');
+
+    $query->addTag($this->entityType . '_load_multiple');
+
+    if ($revision_id) {
+      $query->join($this->revisionTable, 'revision', "revision.{$this->idKey} = base.{$this->idKey} AND revision.{$this->revisionKey} = :revisionId", array(':revisionId' => $revision_id));
+    }
+    elseif ($this->revisionKey) {
+      $query->join($this->revisionTable, 'revision', "revision.{$this->revisionKey} = base.{$this->revisionKey}");
+    }
+
+    // Add fields from the {entity} table.
+    $entity_fields = $this->entityInfo['schema_fields_sql']['base table'];
+
+    if ($this->revisionKey) {
+      // Add all fields from the {entity_revision} table.
+      $entity_revision_fields = drupal_map_assoc($this->entityInfo['schema_fields_sql']['revision table']);
+      // The id field is provided by entity, so remove it.
+      unset($entity_revision_fields[$this->idKey]);
+
+      // Remove all fields from the base table that are also fields by the same
+      // name in the revision table.
+      $entity_field_keys = array_flip($entity_fields);
+      foreach ($entity_revision_fields as $key => $name) {
+        if (isset($entity_field_keys[$name])) {
+          unset($entity_fields[$entity_field_keys[$name]]);
+        }
+      }
+      $query->fields('revision', $entity_revision_fields);
+    }
+
+    $query->fields('base', $entity_fields);
+
+    if ($ids) {
+      $query->condition("base.{$this->idKey}", $ids, 'IN');
+    }
+    if ($conditions) {
+      foreach ($conditions as $field => $value) {
+        $query->condition('base.' . $field, $value);
+      }
+    }
+    return $query;
+  }
+
+  /**
+   * Attaches data to entities upon loading.
+   *
+   * This will attach fields, if the entity is fieldable. It calls
+   * hook_entity_load() for modules which need to add data to all entities.
+   * It also calls hook_TYPE_load() on the loaded entities. For example
+   * hook_node_load() or hook_user_load(). If your hook_TYPE_load()
+   * expects special parameters apart from the queried entities, you can set
+   * $this->hookLoadArguments prior to calling the method.
+   * See NodeController::attachLoad() for an example.
+   *
+   * @param $queried_entities
+   *   Associative array of query results, keyed on the entity ID.
+   * @param $revision_id
+   *   ID of the revision that was loaded, or FALSE if the most current revision
+   *   was loaded.
+   */
+  protected function attachLoad(&$queried_entities, $revision_id = FALSE) {
+    // Attach fields.
+    if ($this->entityInfo['fieldable']) {
+      if ($revision_id) {
+        field_attach_load_revision($this->entityType, $queried_entities);
+      }
+      else {
+        field_attach_load($this->entityType, $queried_entities);
+      }
+    }
+
+    // Call hook_entity_load().
+    foreach (module_implements('entity_load') as $module) {
+      $function = $module . '_entity_load';
+      $function($queried_entities, $this->entityType);
+    }
+    // Call hook_TYPE_load(). The first argument for hook_TYPE_load() are
+    // always the queried entities, followed by additional arguments set in
+    // $this->hookLoadArguments.
+    $args = array_merge(array($queried_entities), $this->hookLoadArguments);
+    foreach (module_implements($this->entityInfo['load hook']) as $module) {
+      call_user_func_array($module . '_' . $this->entityInfo['load hook'], $args);
+    }
+  }
+
+  /**
+   * Gets entities from the static cache.
+   *
+   * @param $ids
+   *   If not empty, return entities that match these IDs.
+   * @param $conditions
+   *   If set, return entities that match all of these conditions.
+   *
+   * @return
+   *   Array of entities from the entity cache.
+   */
+  protected function cacheGet($ids, $conditions = array()) {
+    $entities = array();
+    // Load any available entities from the internal cache.
+    if (!empty($this->entityCache)) {
+      if ($ids) {
+        $entities += array_intersect_key($this->entityCache, array_flip($ids));
+      }
+      // If loading entities only by conditions, fetch all available entities
+      // from the cache. Entities which don't match are removed later.
+      elseif ($conditions) {
+        $entities = $this->entityCache;
+      }
+    }
+
+    // Exclude any entities loaded from cache if they don't match $conditions.
+    // This ensures the same behavior whether loading from memory or database.
+    if ($conditions) {
+      foreach ($entities as $entity) {
+        $entity_values = (array) $entity;
+        if (array_diff_assoc($conditions, $entity_values)) {
+          unset($entities[$entity->{$this->idKey}]);
+        }
+      }
+    }
+    return $entities;
+  }
+
+  /**
+   * Stores entities in the static entity cache.
+   *
+   * @param $entities
+   *   Entities to store in the cache.
+   */
+  protected function cacheSet($entities) {
+    $this->entityCache += $entities;
+  }
+}
+
+/**
+ * Exception thrown by EntityFieldQuery() on unsupported query syntax.
+ *
+ * Some storage modules might not support the full range of the syntax for
+ * conditions, and will raise an EntityFieldQueryException when an unsupported
+ * condition was specified.
+ */
+class EntityFieldQueryException extends Exception {}
+
+/**
+ * Retrieves entities matching a given set of conditions.
+ *
+ * This class allows finding entities based on entity properties (for example,
+ * node->changed), field values, and generic entity meta data (bundle,
+ * entity type, entity id, and revision ID). It is not possible to query across
+ * multiple entity types. For example, there is no facility to find published
+ * nodes written by users created in the last hour, as this would require
+ * querying both node->status and user->created.
+ *
+ * Normally we would not want to have public properties on the object, as that
+ * allows the object's state to become inconsistent too easily. However, this
+ * class's standard use case involves primarily code that does need to have
+ * direct access to the collected properties in order to handle alternate
+ * execution routines. We therefore use public properties for simplicity. Note
+ * that code that is simply creating and running a field query should still use
+ * the appropriate methods to add conditions on the query.
+ *
+ * Storage engines are not required to support every type of query. By default,
+ * an EntityFieldQueryException will be raised if an unsupported condition is
+ * specified or if the query has field conditions or sorts that are stored in
+ * different field storage engines. However, this logic can be overridden in
+ * hook_entity_query_alter().
+ *
+ * Also note that this query does not automatically respect entity access
+ * restrictions. Node access control is performed by the SQL storage engine but
+ * other storage engines might not do this.
+ */
+class EntityFieldQuery {
+
+  /**
+   * Indicates that both deleted and non-deleted fields should be returned.
+   *
+   * @see EntityFieldQuery::deleted()
+   */
+  const RETURN_ALL = NULL;
+
+  /**
+   * TRUE if the query has already been altered, FALSE if it hasn't.
+   *
+   * Used in alter hooks to check for cloned queries that have already been
+   * altered prior to the clone (for example, the pager count query).
+   *
+   * @var boolean
+   */
+  public $altered = FALSE;
+
+  /**
+   * Associative array of entity-generic metadata conditions.
+   *
+   * @var array
+   *
+   * @see EntityFieldQuery::entityCondition()
+   */
+  public $entityConditions = array();
+
+  /**
+   * List of field conditions.
+   *
+   * @var array
+   *
+   * @see EntityFieldQuery::fieldCondition()
+   */
+  public $fieldConditions = array();
+
+  /**
+   * List of field meta conditions (language and delta).
+   *
+   * Field conditions operate on columns specified by hook_field_schema(),
+   * the meta conditions operate on columns added by the system: delta
+   * and language. These can not be mixed with the field conditions because
+   * field columns can have any name including delta and language.
+   *
+   * @var array
+   *
+   * @see EntityFieldQuery::fieldLanguageCondition()
+   * @see EntityFieldQuery::fieldDeltaCondition()
+   */
+  public $fieldMetaConditions = array();
+
+  /**
+   * List of property conditions.
+   *
+   * @var array
+   *
+   * @see EntityFieldQuery::propertyCondition()
+   */
+  public $propertyConditions = array();
+
+  /**
+   * List of order clauses.
+   *
+   * @var array
+   */
+  public $order = array();
+
+  /**
+   * The query range.
+   *
+   * @var array
+   *
+   * @see EntityFieldQuery::range()
+   */
+  public $range = array();
+
+  /**
+   * The query pager data.
+   *
+   * @var array
+   *
+   * @see EntityFieldQuery::pager()
+   */
+  public $pager = array();
+
+  /**
+   * Query behavior for deleted data.
+   *
+   * TRUE to return only deleted data, FALSE to return only non-deleted data,
+   * EntityFieldQuery::RETURN_ALL to return everything.
+   *
+   * @see EntityFieldQuery::deleted()
+   */
+  public $deleted = FALSE;
+
+  /**
+   * A list of field arrays used.
+   *
+   * Field names passed to EntityFieldQuery::fieldCondition() and
+   * EntityFieldQuery::fieldOrderBy() are run through field_info_field() before
+   * stored in this array. This way, the elements of this array are field
+   * arrays.
+   *
+   * @var array
+   */
+  public $fields = array();
+
+  /**
+   * TRUE if this is a count query, FALSE if it isn't.
+   *
+   * @var boolean
+   */
+  public $count = FALSE;
+
+  /**
+   * Flag indicating whether this is querying current or all revisions.
+   *
+   * @var int
+   *
+   * @see EntityFieldQuery::age()
+   */
+  public $age = FIELD_LOAD_CURRENT;
+
+  /**
+   * A list of the tags added to this query.
+   *
+   * @var array
+   *
+   * @see EntityFieldQuery::addTag()
+   */
+  public $tags = array();
+
+  /**
+   * A list of metadata added to this query.
+   *
+   * @var array
+   *
+   * @see EntityFieldQuery::addMetaData()
+   */
+  public $metaData = array();
+
+  /**
+   * The ordered results.
+   *
+   * @var array
+   *
+   * @see EntityFieldQuery::execute().
+   */
+  public $orderedResults = array();
+
+  /**
+   * The method executing the query, if it is overriding the default.
+   *
+   * @var string
+   *
+   * @see EntityFieldQuery::execute().
+   */
+  public $executeCallback = '';
+
+  /**
+   * Adds a condition on entity-generic metadata.
+   *
+   * If the overall query contains only entity conditions or ordering, or if
+   * there are property conditions, then specifying the entity type is
+   * mandatory. If there are field conditions or ordering but no property
+   * conditions or ordering, then specifying an entity type is optional. While
+   * the field storage engine might support field conditions on more than one
+   * entity type, there is no way to query across multiple entity base tables by
+   * default. To specify the entity type, pass in 'entity_type' for $name,
+   * the type as a string for $value, and no $operator (it's disregarded).
+   *
+   * 'bundle', 'revision_id' and 'entity_id' have no such restrictions.
+   *
+   * Note: The "comment" entity type does not support bundle conditions.
+   *
+   * @param $name
+   *   'entity_type', 'bundle', 'revision_id' or 'entity_id'.
+   * @param $value
+   *   The value for $name. In most cases, this is a scalar. For more complex
+   *   options, it is an array. The meaning of each element in the array is
+   *   dependent on $operator.
+   * @param $operator
+   *   Possible values:
+   *   - '=', '<>', '>', '>=', '<', '<=', 'STARTS_WITH', 'CONTAINS': These
+   *     operators expect $value to be a literal of the same type as the
+   *     column.
+   *   - 'IN', 'NOT IN': These operators expect $value to be an array of
+   *     literals of the same type as the column.
+   *   - 'BETWEEN': This operator expects $value to be an array of two literals
+   *     of the same type as the column.
+   *   The operator can be omitted, and will default to 'IN' if the value is an
+   *   array, or to '=' otherwise.
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   */
+  public function entityCondition($name, $value, $operator = NULL) {
+    // The '!=' operator is deprecated in favour of the '<>' operator since the
+    // latter is ANSI SQL compatible.
+    if ($operator == '!=') {
+      $operator = '<>';
+    }
+    $this->entityConditions[$name] = array(
+      'value' => $value,
+      'operator' => $operator,
+    );
+    return $this;
+  }
+
+  /**
+   * Adds a condition on field values.
+   *
+   * Note that entities with empty field values will be excluded from the
+   * EntityFieldQuery results when using this method.
+   *
+   * @param $field
+   *   Either a field name or a field array.
+   * @param $column
+   *   The column that should hold the value to be matched.
+   * @param $value
+   *   The value to test the column value against.
+   * @param $operator
+   *   The operator to be used to test the given value.
+   * @param $delta_group
+   *   An arbitrary identifier: conditions in the same group must have the same
+   *   $delta_group.
+   * @param $language_group
+   *   An arbitrary identifier: conditions in the same group must have the same
+   *   $language_group.
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   *
+   * @see EntityFieldQuery::addFieldCondition
+   * @see EntityFieldQuery::deleted
+   */
+  public function fieldCondition($field, $column = NULL, $value = NULL, $operator = NULL, $delta_group = NULL, $language_group = NULL) {
+    return $this->addFieldCondition($this->fieldConditions, $field, $column, $value, $operator, $delta_group, $language_group);
+  }
+
+  /**
+   * Adds a condition on the field language column.
+   *
+   * @param $field
+   *   Either a field name or a field array.
+   * @param $value
+   *   The value to test the column value against.
+   * @param $operator
+   *   The operator to be used to test the given value.
+   * @param $delta_group
+   *   An arbitrary identifier: conditions in the same group must have the same
+   *   $delta_group.
+   * @param $language_group
+   *   An arbitrary identifier: conditions in the same group must have the same
+   *   $language_group.
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   *
+   * @see EntityFieldQuery::addFieldCondition
+   * @see EntityFieldQuery::deleted
+   */
+  public function fieldLanguageCondition($field, $value = NULL, $operator = NULL, $delta_group = NULL, $language_group = NULL) {
+    return $this->addFieldCondition($this->fieldMetaConditions, $field, 'language', $value, $operator, $delta_group, $language_group);
+  }
+
+  /**
+   * Adds a condition on the field delta column.
+   *
+   * @param $field
+   *   Either a field name or a field array.
+   * @param $value
+   *   The value to test the column value against.
+   * @param $operator
+   *   The operator to be used to test the given value.
+   * @param $delta_group
+   *   An arbitrary identifier: conditions in the same group must have the same
+   *   $delta_group.
+   * @param $language_group
+   *   An arbitrary identifier: conditions in the same group must have the same
+   *   $language_group.
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   *
+   * @see EntityFieldQuery::addFieldCondition
+   * @see EntityFieldQuery::deleted
+   */
+  public function fieldDeltaCondition($field, $value = NULL, $operator = NULL, $delta_group = NULL, $language_group = NULL) {
+    return $this->addFieldCondition($this->fieldMetaConditions, $field, 'delta', $value, $operator, $delta_group, $language_group);
+  }
+
+  /**
+   * Adds the given condition to the proper condition array.
+   *
+   * @param $conditions
+   *   A reference to an array of conditions.
+   * @param $field
+   *   Either a field name or a field array.
+   * @param $column
+   *   A column defined in the hook_field_schema() of this field. If this is
+   *   omitted then the query will find only entities that have data in this
+   *   field, using the entity and property conditions if there are any.
+   * @param $value
+   *   The value to test the column value against. In most cases, this is a
+   *   scalar. For more complex options, it is an array. The meaning of each
+   *   element in the array is dependent on $operator.
+   * @param $operator
+   *   Possible values:
+   *   - '=', '<>', '>', '>=', '<', '<=', 'STARTS_WITH', 'CONTAINS': These
+   *     operators expect $value to be a literal of the same type as the
+   *     column.
+   *   - 'IN', 'NOT IN': These operators expect $value to be an array of
+   *     literals of the same type as the column.
+   *   - 'BETWEEN': This operator expects $value to be an array of two literals
+   *     of the same type as the column.
+   *   The operator can be omitted, and will default to 'IN' if the value is an
+   *   array, or to '=' otherwise.
+   * @param $delta_group
+   *   An arbitrary identifier: conditions in the same group must have the same
+   *   $delta_group. For example, let's presume a multivalue field which has
+   *   two columns, 'color' and 'shape', and for entity id 1, there are two
+   *   values: red/square and blue/circle. Entity ID 1 does not have values
+   *   corresponding to 'red circle', however if you pass 'red' and 'circle' as
+   *   conditions, it will appear in the  results - by default queries will run
+   *   against any combination of deltas. By passing the conditions with the
+   *   same $delta_group it will ensure that only values attached to the same
+   *   delta are matched, and entity 1 would then be excluded from the results.
+   * @param $language_group
+   *   An arbitrary identifier: conditions in the same group must have the same
+   *   $language_group.
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   */
+  protected function addFieldCondition(&$conditions, $field, $column = NULL, $value = NULL, $operator = NULL, $delta_group = NULL, $language_group = NULL) {
+    // The '!=' operator is deprecated in favour of the '<>' operator since the
+    // latter is ANSI SQL compatible.
+    if ($operator == '!=') {
+      $operator = '<>';
+    }
+    if (is_scalar($field)) {
+      $field_definition = field_info_field($field);
+      if (empty($field_definition)) {
+        throw new EntityFieldQueryException(t('Unknown field: @field_name', array('@field_name' => $field)));
+      }
+      $field = $field_definition;
+    }
+    // Ensure the same index is used for field conditions as for fields.
+    $index = count($this->fields);
+    $this->fields[$index] = $field;
+    if (isset($column)) {
+      $conditions[$index] = array(
+        'field' => $field,
+        'column' => $column,
+        'value' => $value,
+        'operator' => $operator,
+        'delta_group' => $delta_group,
+        'language_group' => $language_group,
+      );
+    }
+    return $this;
+  }
+
+  /**
+   * Adds a condition on an entity-specific property.
+   *
+   * An $entity_type must be specified by calling
+   * EntityFieldCondition::entityCondition('entity_type', $entity_type) before
+   * executing the query. Also, by default only entities stored in SQL are
+   * supported; however, EntityFieldQuery::executeCallback can be set to handle
+   * different entity storage.
+   *
+   * @param $column
+   *   A column defined in the hook_schema() of the base table of the entity.
+   * @param $value
+   *   The value to test the field against. In most cases, this is a scalar. For
+   *   more complex options, it is an array. The meaning of each element in the
+   *   array is dependent on $operator.
+   * @param $operator
+   *   Possible values:
+   *   - '=', '<>', '>', '>=', '<', '<=', 'STARTS_WITH', 'CONTAINS': These
+   *     operators expect $value to be a literal of the same type as the
+   *     column.
+   *   - 'IN', 'NOT IN': These operators expect $value to be an array of
+   *     literals of the same type as the column.
+   *   - 'BETWEEN': This operator expects $value to be an array of two literals
+   *     of the same type as the column.
+   *   The operator can be omitted, and will default to 'IN' if the value is an
+   *   array, or to '=' otherwise.
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   */
+  public function propertyCondition($column, $value, $operator = NULL) {
+    // The '!=' operator is deprecated in favour of the '<>' operator since the
+    // latter is ANSI SQL compatible.
+    if ($operator == '!=') {
+      $operator = '<>';
+    }
+    $this->propertyConditions[] = array(
+      'column' => $column,
+      'value' => $value,
+      'operator' => $operator,
+    );
+    return $this;
+  }
+
+  /**
+   * Orders the result set by entity-generic metadata.
+   *
+   * If called multiple times, the query will order by each specified column in
+   * the order this method is called.
+   *
+   * Note: The "comment" and "taxonomy_term" entity types don't support ordering
+   * by bundle. For "taxonomy_term", propertyOrderBy('vid') can be used instead.
+   *
+   * @param $name
+   *   'entity_type', 'bundle', 'revision_id' or 'entity_id'.
+   * @param $direction
+   *   The direction to sort. Legal values are "ASC" and "DESC".
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   */
+  public function entityOrderBy($name, $direction = 'ASC') {
+    $this->order[] = array(
+      'type' => 'entity',
+      'specifier' => $name,
+      'direction' => $direction,
+    );
+    return $this;
+  }
+
+  /**
+   * Orders the result set by a given field column.
+   *
+   * If called multiple times, the query will order by each specified column in
+   * the order this method is called. Note that entities with empty field
+   * values will be excluded from the EntityFieldQuery results when using this
+   * method.
+   *
+   * @param $field
+   *   Either a field name or a field array.
+   * @param $column
+   *   A column defined in the hook_field_schema() of this field. entity_id and
+   *   bundle can also be used.
+   * @param $direction
+   *   The direction to sort. Legal values are "ASC" and "DESC".
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   */
+  public function fieldOrderBy($field, $column, $direction = 'ASC') {
+    if (is_scalar($field)) {
+      $field_definition = field_info_field($field);
+      if (empty($field_definition)) {
+        throw new EntityFieldQueryException(t('Unknown field: @field_name', array('@field_name' => $field)));
+      }
+      $field = $field_definition;
+    }
+    // Save the index used for the new field, for later use in field storage.
+    $index = count($this->fields);
+    $this->fields[$index] = $field;
+    $this->order[] = array(
+      'type' => 'field',
+      'specifier' => array(
+        'field' => $field,
+        'index' => $index,
+        'column' => $column,
+      ),
+      'direction' => $direction,
+    );
+    return $this;
+  }
+
+  /**
+   * Orders the result set by an entity-specific property.
+   *
+   * An $entity_type must be specified by calling
+   * EntityFieldCondition::entityCondition('entity_type', $entity_type) before
+   * executing the query.
+   *
+   * If called multiple times, the query will order by each specified column in
+   * the order this method is called.
+   *
+   * @param $column
+   *   The column on which to order.
+   * @param $direction
+   *   The direction to sort. Legal values are "ASC" and "DESC".
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   */
+  public function propertyOrderBy($column, $direction = 'ASC') {
+    $this->order[] = array(
+      'type' => 'property',
+      'specifier' => $column,
+      'direction' => $direction,
+    );
+    return $this;
+  }
+
+  /**
+   * Sets the query to be a count query only.
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   */
+  public function count() {
+    $this->count = TRUE;
+    return $this;
+  }
+
+  /**
+   * Restricts a query to a given range in the result set.
+   *
+   * @param $start
+   *   The first entity from the result set to return. If NULL, removes any
+   *   range directives that are set.
+   * @param $length
+   *   The number of entities to return from the result set.
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   */
+  public function range($start = NULL, $length = NULL) {
+    $this->range = array(
+      'start' => $start,
+      'length' => $length,
+    );
+    return $this;
+  }
+
+  /**
+   * Enables a pager for the query.
+   *
+   * @param $limit
+   *   An integer specifying the number of elements per page.  If passed a false
+   *   value (FALSE, 0, NULL), the pager is disabled.
+   * @param $element
+   *   An optional integer to distinguish between multiple pagers on one page.
+   *   If not provided, one is automatically calculated.
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   */
+  public function pager($limit = 10, $element = NULL) {
+    if (!isset($element)) {
+      $element = PagerDefault::$maxElement++;
+    }
+    elseif ($element >= PagerDefault::$maxElement) {
+      PagerDefault::$maxElement = $element + 1;
+    }
+
+    $this->pager = array(
+      'limit' => $limit,
+      'element' => $element,
+    );
+    return $this;
+  }
+
+  /**
+   * Enables sortable tables for this query.
+   *
+   * @param $headers
+   *   An EFQ Header array based on which the order clause is added to the
+   *   query.
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   */
+  public function tableSort(&$headers) {
+    // If 'field' is not initialized, the header columns aren't clickable
+    foreach ($headers as $key =>$header) {
+      if (is_array($header) && isset($header['specifier'])) {
+        $headers[$key]['field'] = '';
+      }
+    }
+
+    $order = tablesort_get_order($headers);
+    $direction = tablesort_get_sort($headers);
+    foreach ($headers as $header) {
+      if (is_array($header) && ($header['data'] == $order['name'])) {
+        if ($header['type'] == 'field') {
+          $this->fieldOrderBy($header['specifier']['field'], $header['specifier']['column'], $direction);
+        }
+        else {
+          $header['direction'] = $direction;
+          $this->order[] = $header;
+        }
+      }
+    }
+
+    return $this;
+  }
+
+  /**
+   * Filters on the data being deleted.
+   *
+   * @param $deleted
+   *   TRUE to only return deleted data, FALSE to return non-deleted data,
+   *   EntityFieldQuery::RETURN_ALL to return everything. Defaults to FALSE.
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   */
+  public function deleted($deleted = TRUE) {
+    $this->deleted = $deleted;
+    return $this;
+  }
+
+  /**
+   * Queries the current or every revision.
+   *
+   * Note that this only affects field conditions. Property conditions always
+   * apply to the current revision.
+   * @TODO: Once revision tables have been cleaned up, revisit this.
+   *
+   * @param $age
+   *   - FIELD_LOAD_CURRENT (default): Query the most recent revisions for all
+   *     entities. The results will be keyed by entity type and entity ID.
+   *   - FIELD_LOAD_REVISION: Query all revisions. The results will be keyed by
+   *     entity type and entity revision ID.
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   */
+  public function age($age) {
+    $this->age = $age;
+    return $this;
+  }
+
+  /**
+   * Adds a tag to the query.
+   *
+   * Tags are strings that mark a query so that hook_query_alter() and
+   * hook_query_TAG_alter() implementations may decide if they wish to alter
+   * the query. A query may have any number of tags, and they must be valid PHP
+   * identifiers (composed of letters, numbers, and underscores). For example,
+   * queries involving nodes that will be displayed for a user need to add the
+   * tag 'node_access', so that the node module can add access restrictions to
+   * the query.
+   *
+   * If an entity field query has tags, it must also have an entity type
+   * specified, because the alter hook will need the entity base table.
+   *
+   * @param string $tag
+   *   The tag to add.
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   */
+  public function addTag($tag) {
+    $this->tags[$tag] = $tag;
+    return $this;
+  }
+
+  /**
+   * Adds additional metadata to the query.
+   *
+   * Sometimes a query may need to provide additional contextual data for the
+   * alter hook. The alter hook implementations may then use that information
+   * to decide if and how to take action.
+   *
+   * @param $key
+   *   The unique identifier for this piece of metadata. Must be a string that
+   *   follows the same rules as any other PHP identifier.
+   * @param $object
+   *   The additional data to add to the query. May be any valid PHP variable.
+   *
+   * @return EntityFieldQuery
+   *   The called object.
+   */
+  public function addMetaData($key, $object) {
+    $this->metaData[$key] = $object;
+    return $this;
+  }
+
+  /**
+   * Executes the query.
+   *
+   * After executing the query, $this->orderedResults will contain a list of
+   * the same stub entities in the order returned by the query. This is only
+   * relevant if there are multiple entity types in the returned value and
+   * a field ordering was requested. In every other case, the returned value
+   * contains everything necessary for processing.
+   *
+   * @return
+   *   Either a number if count() was called or an array of associative arrays
+   *   of stub entities. The outer array keys are entity types, and the inner
+   *   array keys are the relevant ID. (In most cases this will be the entity
+   *   ID. The only exception is when age=FIELD_LOAD_REVISION is used and field
+   *   conditions or sorts are present -- in this case, the key will be the
+   *   revision ID.) The entity type will only exist in the outer array if
+   *   results were found. The inner array values are always stub entities, as
+   *   returned by entity_create_stub_entity(). To traverse the returned array:
+   *   @code
+   *     foreach ($query->execute() as $entity_type => $entities) {
+   *       foreach ($entities as $entity_id => $entity) {
+   *   @endcode
+   *   Note if the entity type is known, then the following snippet will load
+   *   the entities found:
+   *   @code
+   *     $result = $query->execute();
+   *     if (!empty($result[$my_type])) {
+   *       $entities = entity_load($my_type, array_keys($result[$my_type]));
+   *     }
+   *   @endcode
+   */
+  public function execute() {
+    // Give a chance to other modules to alter the query.
+    drupal_alter('entity_query', $this);
+    $this->altered = TRUE;
+
+    // Initialize the pager.
+    $this->initializePager();
+
+    // Execute the query using the correct callback.
+    $result = call_user_func($this->queryCallback(), $this);
+
+    return $result;
+  }
+
+  /**
+   * Determines the query callback to use for this entity query.
+   *
+   * @return
+   *   A callback that can be used with call_user_func().
+   */
+  public function queryCallback() {
+    // Use the override from $this->executeCallback. It can be set either
+    // while building the query, or using hook_entity_query_alter().
+    if (function_exists($this->executeCallback)) {
+      return $this->executeCallback;
+    }
+    // If there are no field conditions and sorts, and no execute callback
+    // then we default to querying entity tables in SQL.
+    if (empty($this->fields)) {
+      return array($this, 'propertyQuery');
+    }
+    // If no override, find the storage engine to be used.
+    foreach ($this->fields as $field) {
+      if (!isset($storage)) {
+        $storage = $field['storage']['module'];
+      }
+      elseif ($storage != $field['storage']['module']) {
+        throw new EntityFieldQueryException(t("Can't handle more than one field storage engine"));
+      }
+    }
+    if ($storage) {
+      // Use hook_field_storage_query() from the field storage.
+      return $storage . '_field_storage_query';
+    }
+    else {
+      throw new EntityFieldQueryException(t("Field storage engine not found."));
+    }
+  }
+
+  /**
+   * Queries entity tables in SQL for property conditions and sorts.
+   *
+   * This method is only used if there are no field conditions and sorts.
+   *
+   * @return
+   *   See EntityFieldQuery::execute().
+   */
+  protected function propertyQuery() {
+    if (empty($this->entityConditions['entity_type'])) {
+      throw new EntityFieldQueryException(t('For this query an entity type must be specified.'));
+    }
+    $entity_type = $this->entityConditions['entity_type']['value'];
+    $entity_info = entity_get_info($entity_type);
+    if (empty($entity_info['base table'])) {
+      throw new EntityFieldQueryException(t('Entity %entity has no base table.', array('%entity' => $entity_type)));
+    }
+    $base_table = $entity_info['base table'];
+    $base_table_schema = drupal_get_schema($base_table);
+    $select_query = db_select($base_table);
+    $select_query->addExpression(':entity_type', 'entity_type', array(':entity_type' => $entity_type));
+    // Process the property conditions.
+    foreach ($this->propertyConditions as $property_condition) {
+      $this->addCondition($select_query, $base_table . '.' . $property_condition['column'], $property_condition);
+    }
+    // Process the four possible entity condition.
+    // The id field is always present in entity keys.
+    $sql_field = $entity_info['entity keys']['id'];
+    $id_map['entity_id'] = $sql_field;
+    $select_query->addField($base_table, $sql_field, 'entity_id');
+    if (isset($this->entityConditions['entity_id'])) {
+      $this->addCondition($select_query, $base_table . '.' . $sql_field, $this->entityConditions['entity_id']);
+    }
+
+    // If there is a revision key defined, use it.
+    if (!empty($entity_info['entity keys']['revision'])) {
+      $sql_field = $entity_info['entity keys']['revision'];
+      $select_query->addField($base_table, $sql_field, 'revision_id');
+      if (isset($this->entityConditions['revision_id'])) {
+        $this->addCondition($select_query, $base_table . '.' . $sql_field, $this->entityConditions['revision_id']);
+      }
+    }
+    else {
+      $sql_field = 'revision_id';
+      $select_query->addExpression('NULL', 'revision_id');
+    }
+    $id_map['revision_id'] = $sql_field;
+
+    // Handle bundles.
+    if (!empty($entity_info['entity keys']['bundle'])) {
+      $sql_field = $entity_info['entity keys']['bundle'];
+      $having = FALSE;
+
+      if (!empty($base_table_schema['fields'][$sql_field])) {
+        $select_query->addField($base_table, $sql_field, 'bundle');
+      }
+    }
+    else {
+      $sql_field = 'bundle';
+      $select_query->addExpression(':bundle', 'bundle', array(':bundle' => $entity_type));
+      $having = TRUE;
+    }
+    $id_map['bundle'] = $sql_field;
+    if (isset($this->entityConditions['bundle'])) {
+      if (!empty($entity_info['entity keys']['bundle'])) {
+        $this->addCondition($select_query, $base_table . '.' . $sql_field, $this->entityConditions['bundle'], $having);
+      }
+      else {
+        // This entity has no bundle, so invalidate the query.
+        $select_query->where('1 = 0');
+      }
+    }
+
+    // Order the query.
+    foreach ($this->order as $order) {
+      if ($order['type'] == 'entity') {
+        $key = $order['specifier'];
+        if (!isset($id_map[$key])) {
+          throw new EntityFieldQueryException(t('Do not know how to order on @key for @entity_type', array('@key' => $key, '@entity_type' => $entity_type)));
+        }
+        $select_query->orderBy($id_map[$key], $order['direction']);
+      }
+      elseif ($order['type'] == 'property') {
+        $select_query->orderBy($base_table . '.' . $order['specifier'], $order['direction']);
+      }
+    }
+
+    return $this->finishQuery($select_query);
+  }
+
+  /**
+   * Gets the total number of results and initializes a pager for the query.
+   *
+   * The pager can be disabled by either setting the pager limit to 0, or by
+   * setting this query to be a count query.
+   */
+  function initializePager() {
+    if ($this->pager && !empty($this->pager['limit']) && !$this->count) {
+      $page = pager_find_page($this->pager['element']);
+      $count_query = clone $this;
+      $this->pager['total'] = $count_query->count()->execute();
+      $this->pager['start'] = $page * $this->pager['limit'];
+      pager_default_initialize($this->pager['total'], $this->pager['limit'], $this->pager['element']);
+      $this->range($this->pager['start'], $this->pager['limit']);
+    }
+  }
+
+  /**
+   * Finishes the query.
+   *
+   * Adds tags, metaData, range and returns the requested list or count.
+   *
+   * @param SelectQuery $select_query
+   *   A SelectQuery which has entity_type, entity_id, revision_id and bundle
+   *   fields added.
+   * @param $id_key
+   *   Which field's values to use as the returned array keys.
+   *
+   * @return
+   *   See EntityFieldQuery::execute().
+   */
+  function finishQuery($select_query, $id_key = 'entity_id') {
+    foreach ($this->tags as $tag) {
+      $select_query->addTag($tag);
+    }
+    foreach ($this->metaData as $key => $object) {
+      $select_query->addMetaData($key, $object);
+    }
+    $select_query->addMetaData('entity_field_query', $this);
+    if ($this->range) {
+      $select_query->range($this->range['start'], $this->range['length']);
+    }
+    if ($this->count) {
+      return $select_query->countQuery()->execute()->fetchField();
+    }
+    $return = array();
+    foreach ($select_query->execute() as $partial_entity) {
+      $bundle = isset($partial_entity->bundle) ? $partial_entity->bundle : NULL;
+      $entity = entity_create_stub_entity($partial_entity->entity_type, array($partial_entity->entity_id, $partial_entity->revision_id, $bundle));
+      $return[$partial_entity->entity_type][$partial_entity->$id_key] = $entity;
+      $this->ordered_results[] = $partial_entity;
+    }
+    return $return;
+  }
+
+  /**
+   * Adds a condition to an already built SelectQuery (internal function).
+   *
+   * This is a helper for hook_entity_query() and hook_field_storage_query().
+   *
+   * @param SelectQuery $select_query
+   *   A SelectQuery object.
+   * @param $sql_field
+   *   The name of the field.
+   * @param $condition
+   *   A condition as described in EntityFieldQuery::fieldCondition() and
+   *   EntityFieldQuery::entityCondition().
+   * @param $having
+   *   HAVING or WHERE. This is necessary because SQL can't handle WHERE
+   *   conditions on aliased columns.
+   */
+  public function addCondition(SelectQuery $select_query, $sql_field, $condition, $having = FALSE) {
+    $method = $having ? 'havingCondition' : 'condition';
+    $like_prefix = '';
+    switch ($condition['operator']) {
+      case 'CONTAINS':
+        $like_prefix = '%';
+      case 'STARTS_WITH':
+        $select_query->$method($sql_field, $like_prefix . db_like($condition['value']) . '%', 'LIKE');
+        break;
+      default:
+        $select_query->$method($sql_field, $condition['value'], $condition['operator']);
+    }
+  }
+
+}
+
+/**
+ * Defines an exception thrown when a malformed entity is passed.
+ */
+class EntityMalformedException extends Exception { }
diff --git a/htmltest/includes/errors.inc b/htmltest/includes/errors.inc
new file mode 100644
index 00000000..a9b7b5bd
--- /dev/null
+++ b/htmltest/includes/errors.inc
@@ -0,0 +1,286 @@
+<?php
+
+/**
+ * @file
+ * Functions for error handling.
+ */
+
+/**
+ * Maps PHP error constants to watchdog severity levels.
+ *
+ * The error constants are documented at
+ * http://php.net/manual/errorfunc.constants.php
+ *
+ * @ingroup logging_severity_levels
+ */
+function drupal_error_levels() {
+  $types = array(
+    E_ERROR => array('Error', WATCHDOG_ERROR),
+    E_WARNING => array('Warning', WATCHDOG_WARNING),
+    E_PARSE => array('Parse error', WATCHDOG_ERROR),
+    E_NOTICE => array('Notice', WATCHDOG_NOTICE),
+    E_CORE_ERROR => array('Core error', WATCHDOG_ERROR),
+    E_CORE_WARNING => array('Core warning', WATCHDOG_WARNING),
+    E_COMPILE_ERROR => array('Compile error', WATCHDOG_ERROR),
+    E_COMPILE_WARNING => array('Compile warning', WATCHDOG_WARNING),
+    E_USER_ERROR => array('User error', WATCHDOG_ERROR),
+    E_USER_WARNING => array('User warning', WATCHDOG_WARNING),
+    E_USER_NOTICE => array('User notice', WATCHDOG_NOTICE),
+    E_STRICT => array('Strict warning', WATCHDOG_DEBUG),
+    E_RECOVERABLE_ERROR => array('Recoverable fatal error', WATCHDOG_ERROR),
+  );
+  // E_DEPRECATED and E_USER_DEPRECATED were added in PHP 5.3.0.
+  if (defined('E_DEPRECATED')) {
+    $types[E_DEPRECATED] = array('Deprecated function', WATCHDOG_DEBUG);
+    $types[E_USER_DEPRECATED] = array('User deprecated function', WATCHDOG_DEBUG);
+  }
+  return $types;
+}
+
+/**
+ * Provides custom PHP error handling.
+ *
+ * @param $error_level
+ *   The level of the error raised.
+ * @param $message
+ *   The error message.
+ * @param $filename
+ *   The filename that the error was raised in.
+ * @param $line
+ *   The line number the error was raised at.
+ * @param $context
+ *   An array that points to the active symbol table at the point the error
+ *   occurred.
+ */
+function _drupal_error_handler_real($error_level, $message, $filename, $line, $context) {
+  if ($error_level & error_reporting()) {
+    $types = drupal_error_levels();
+    list($severity_msg, $severity_level) = $types[$error_level];
+    $caller = _drupal_get_last_caller(debug_backtrace());
+
+    if (!function_exists('filter_xss_admin')) {
+      require_once DRUPAL_ROOT . '/includes/common.inc';
+    }
+
+    // We treat recoverable errors as fatal.
+    _drupal_log_error(array(
+      '%type' => isset($types[$error_level]) ? $severity_msg : 'Unknown error',
+      // The standard PHP error handler considers that the error messages
+      // are HTML. We mimick this behavior here.
+      '!message' => filter_xss_admin($message),
+      '%function' => $caller['function'],
+      '%file' => $caller['file'],
+      '%line' => $caller['line'],
+      'severity_level' => $severity_level,
+    ), $error_level == E_RECOVERABLE_ERROR);
+  }
+}
+
+/**
+ * Decodes an exception and retrieves the correct caller.
+ *
+ * @param $exception
+ *   The exception object that was thrown.
+ *
+ * @return
+ *   An error in the format expected by _drupal_log_error().
+ */
+function _drupal_decode_exception($exception) {
+  $message = $exception->getMessage();
+
+  $backtrace = $exception->getTrace();
+  // Add the line throwing the exception to the backtrace.
+  array_unshift($backtrace, array('line' => $exception->getLine(), 'file' => $exception->getFile()));
+
+  // For PDOException errors, we try to return the initial caller,
+  // skipping internal functions of the database layer.
+  if ($exception instanceof PDOException) {
+    // The first element in the stack is the call, the second element gives us the caller.
+    // We skip calls that occurred in one of the classes of the database layer
+    // or in one of its global functions.
+    $db_functions = array('db_query',  'db_query_range');
+    while (!empty($backtrace[1]) && ($caller = $backtrace[1]) &&
+        ((isset($caller['class']) && (strpos($caller['class'], 'Query') !== FALSE || strpos($caller['class'], 'Database') !== FALSE || strpos($caller['class'], 'PDO') !== FALSE)) ||
+        in_array($caller['function'], $db_functions))) {
+      // We remove that call.
+      array_shift($backtrace);
+    }
+    if (isset($exception->query_string, $exception->args)) {
+      $message .= ": " . $exception->query_string . "; " . print_r($exception->args, TRUE);
+    }
+  }
+  $caller = _drupal_get_last_caller($backtrace);
+
+  return array(
+    '%type' => get_class($exception),
+    // The standard PHP exception handler considers that the exception message
+    // is plain-text. We mimick this behavior here.
+    '!message' => check_plain($message),
+    '%function' => $caller['function'],
+    '%file' => $caller['file'],
+    '%line' => $caller['line'],
+    'severity_level' => WATCHDOG_ERROR,
+  );
+}
+
+/**
+ * Renders an exception error message without further exceptions.
+ *
+ * @param $exception
+ *   The exception object that was thrown.
+ * @return
+ *   An error message.
+ */
+function _drupal_render_exception_safe($exception) {
+  return check_plain(strtr('%type: !message in %function (line %line of %file).', _drupal_decode_exception($exception)));
+}
+
+/**
+ * Determines whether an error should be displayed.
+ *
+ * When in maintenance mode or when error_level is ERROR_REPORTING_DISPLAY_ALL,
+ * all errors should be displayed. For ERROR_REPORTING_DISPLAY_SOME, $error
+ * will be examined to determine if it should be displayed.
+ *
+ * @param $error
+ *   Optional error to examine for ERROR_REPORTING_DISPLAY_SOME.
+ *
+ * @return
+ *   TRUE if an error should be displayed.
+ */
+function error_displayable($error = NULL) {
+  $error_level = variable_get('error_level', ERROR_REPORTING_DISPLAY_ALL);
+  $updating = (defined('MAINTENANCE_MODE') && MAINTENANCE_MODE == 'update');
+  $all_errors_displayed = ($error_level == ERROR_REPORTING_DISPLAY_ALL);
+  $error_needs_display = ($error_level == ERROR_REPORTING_DISPLAY_SOME &&
+    isset($error) && $error['%type'] != 'Notice' && $error['%type'] != 'Strict warning');
+
+  return ($updating || $all_errors_displayed || $error_needs_display);
+}
+
+/**
+ * Logs a PHP error or exception and displays an error page in fatal cases.
+ *
+ * @param $error
+ *   An array with the following keys: %type, !message, %function, %file, %line
+ *   and severity_level. All the parameters are plain-text, with the exception
+ *   of !message, which needs to be a safe HTML string.
+ * @param $fatal
+ *   TRUE if the error is fatal.
+ */
+function _drupal_log_error($error, $fatal = FALSE) {
+  // Initialize a maintenance theme if the bootstrap was not complete.
+  // Do it early because drupal_set_message() triggers a drupal_theme_initialize().
+  if ($fatal && (drupal_get_bootstrap_phase() != DRUPAL_BOOTSTRAP_FULL)) {
+    unset($GLOBALS['theme']);
+    if (!defined('MAINTENANCE_MODE')) {
+      define('MAINTENANCE_MODE', 'error');
+    }
+    drupal_maintenance_theme();
+  }
+
+  // When running inside the testing framework, we relay the errors
+  // to the tested site by the way of HTTP headers.
+  $test_info = &$GLOBALS['drupal_test_info'];
+  if (!empty($test_info['in_child_site']) && !headers_sent() && (!defined('SIMPLETEST_COLLECT_ERRORS') || SIMPLETEST_COLLECT_ERRORS)) {
+    // $number does not use drupal_static as it should not be reset
+    // as it uniquely identifies each PHP error.
+    static $number = 0;
+    $assertion = array(
+      $error['!message'],
+      $error['%type'],
+      array(
+        'function' => $error['%function'],
+        'file' => $error['%file'],
+        'line' => $error['%line'],
+      ),
+    );
+    header('X-Drupal-Assertion-' . $number . ': ' . rawurlencode(serialize($assertion)));
+    $number++;
+  }
+
+  watchdog('php', '%type: !message in %function (line %line of %file).', $error, $error['severity_level']);
+
+  if ($fatal) {
+    drupal_add_http_header('Status', '500 Service unavailable (with message)');
+  }
+
+  if (drupal_is_cli()) {
+    if ($fatal) {
+      // When called from CLI, simply output a plain text message.
+      print html_entity_decode(strip_tags(t('%type: !message in %function (line %line of %file).', $error))). "\n";
+      exit;
+    }
+  }
+
+  if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
+    if ($fatal) {
+      if (error_displayable($error)) {
+        // When called from JavaScript, simply output the error message.
+        print t('%type: !message in %function (line %line of %file).', $error);
+      }
+      exit;
+    }
+  }
+  else {
+    // Display the message if the current error reporting level allows this type
+    // of message to be displayed, and unconditionnaly in update.php.
+    if (error_displayable($error)) {
+      $class = 'error';
+
+      // If error type is 'User notice' then treat it as debug information
+      // instead of an error message, see dd().
+      if ($error['%type'] == 'User notice') {
+        $error['%type'] = 'Debug';
+        $class = 'status';
+      }
+
+      drupal_set_message(t('%type: !message in %function (line %line of %file).', $error), $class);
+    }
+
+    if ($fatal) {
+      drupal_set_title(t('Error'));
+      // We fallback to a maintenance page at this point, because the page generation
+      // itself can generate errors.
+      print theme('maintenance_page', array('content' => t('The website encountered an unexpected error. Please try again later.')));
+      exit;
+    }
+  }
+}
+
+/**
+ * Gets the last caller from a backtrace.
+ *
+ * @param $backtrace
+ *   A standard PHP backtrace.
+ *
+ * @return
+ *   An associative array with keys 'file', 'line' and 'function'.
+ */
+function _drupal_get_last_caller($backtrace) {
+  // Errors that occur inside PHP internal functions do not generate
+  // information about file and line. Ignore black listed functions.
+  $blacklist = array('debug', '_drupal_error_handler', '_drupal_exception_handler');
+  while (($backtrace && !isset($backtrace[0]['line'])) ||
+         (isset($backtrace[1]['function']) && in_array($backtrace[1]['function'], $blacklist))) {
+    array_shift($backtrace);
+  }
+
+  // The first trace is the call itself.
+  // It gives us the line and the file of the last call.
+  $call = $backtrace[0];
+
+  // The second call give us the function where the call originated.
+  if (isset($backtrace[1])) {
+    if (isset($backtrace[1]['class'])) {
+      $call['function'] = $backtrace[1]['class'] . $backtrace[1]['type'] . $backtrace[1]['function'] . '()';
+    }
+    else {
+      $call['function'] = $backtrace[1]['function'] . '()';
+    }
+  }
+  else {
+    $call['function'] = 'main()';
+  }
+  return $call;
+}
diff --git a/htmltest/includes/file.inc b/htmltest/includes/file.inc
new file mode 100644
index 00000000..0ec69b70
--- /dev/null
+++ b/htmltest/includes/file.inc
@@ -0,0 +1,2518 @@
+<?php
+
+/**
+ * @file
+ * API for handling file uploads and server file management.
+ */
+
+/**
+ * Manually include stream wrapper code.
+ *
+ * Stream wrapper code is included here because there are cases where
+ * File API is needed before a bootstrap, or in an alternate order (e.g.
+ * maintenance theme).
+ */
+require_once DRUPAL_ROOT . '/includes/stream_wrappers.inc';
+
+/**
+ * @defgroup file File interface
+ * @{
+ * Common file handling functions.
+ *
+ * Fields on the file object:
+ * - fid: File ID
+ * - uid: The {users}.uid of the user who is associated with the file.
+ * - filename: Name of the file with no path components. This may differ from
+ *   the basename of the filepath if the file is renamed to avoid overwriting
+ *   an existing file.
+ * - uri: URI of the file.
+ * - filemime: The file's MIME type.
+ * - filesize: The size of the file in bytes.
+ * - status: A bitmapped field indicating the status of the file. The first 8
+ *   bits are reserved for Drupal core. The least significant bit indicates
+ *   temporary (0) or permanent (1). Temporary files older than
+ *   DRUPAL_MAXIMUM_TEMP_FILE_AGE will be removed during cron runs.
+ * - timestamp: UNIX timestamp for the date the file was added to the database.
+ */
+
+/**
+ * Flag used by file_prepare_directory() -- create directory if not present.
+ */
+define('FILE_CREATE_DIRECTORY', 1);
+
+/**
+ * Flag used by file_prepare_directory() -- file permissions may be changed.
+ */
+define('FILE_MODIFY_PERMISSIONS', 2);
+
+/**
+ * Flag for dealing with existing files: Appends number until name is unique.
+ */
+define('FILE_EXISTS_RENAME', 0);
+
+/**
+ * Flag for dealing with existing files: Replace the existing file.
+ */
+define('FILE_EXISTS_REPLACE', 1);
+
+/**
+ * Flag for dealing with existing files: Do nothing and return FALSE.
+ */
+define('FILE_EXISTS_ERROR', 2);
+
+/**
+ * Indicates that the file is permanent and should not be deleted.
+ *
+ * Temporary files older than DRUPAL_MAXIMUM_TEMP_FILE_AGE will be removed
+ * during cron runs, but permanent files will not be removed during the file
+ * garbage collection process.
+ */
+define('FILE_STATUS_PERMANENT', 1);
+
+/**
+ * Provides Drupal stream wrapper registry.
+ *
+ * A stream wrapper is an abstraction of a file system that allows Drupal to
+ * use the same set of methods to access both local files and remote resources.
+ *
+ * Provide a facility for managing and querying user-defined stream wrappers
+ * in PHP. PHP's internal stream_get_wrappers() doesn't return the class
+ * registered to handle a stream, which we need to be able to find the handler
+ * for class instantiation.
+ *
+ * If a module registers a scheme that is already registered with PHP, the
+ * existing scheme will be unregistered and replaced with the specified class.
+ *
+ * A stream is referenced as "scheme://target".
+ *
+ * The optional $filter parameter can be used to retrieve only the stream
+ * wrappers that are appropriate for particular usage. For example, this returns
+ * only stream wrappers that use local file storage:
+ * @code
+ *   $local_stream_wrappers = file_get_stream_wrappers(STREAM_WRAPPERS_LOCAL);
+ * @endcode
+ *
+ * The $filter parameter can only filter to types containing a particular flag.
+ * In some cases, you may want to filter to types that do not contain a
+ * particular flag. For example, you may want to retrieve all stream wrappers
+ * that are not writable, or all stream wrappers that are not local. PHP's
+ * array_diff_key() function can be used to help with this. For example, this
+ * returns only stream wrappers that do not use local file storage:
+ * @code
+ *   $remote_stream_wrappers = array_diff_key(file_get_stream_wrappers(STREAM_WRAPPERS_ALL), file_get_stream_wrappers(STREAM_WRAPPERS_LOCAL));
+ * @endcode
+ *
+ * @param $filter
+ *   (Optional) Filters out all types except those with an on bit for each on
+ *   bit in $filter. For example, if $filter is STREAM_WRAPPERS_WRITE_VISIBLE,
+ *   which is equal to (STREAM_WRAPPERS_READ | STREAM_WRAPPERS_WRITE |
+ *   STREAM_WRAPPERS_VISIBLE), then only stream wrappers with all three of these
+ *   bits set are returned. Defaults to STREAM_WRAPPERS_ALL, which returns all
+ *   registered stream wrappers.
+ *
+ * @return
+ *   An array keyed by scheme, with values containing an array of information
+ *   about the stream wrapper, as returned by hook_stream_wrappers(). If $filter
+ *   is omitted or set to STREAM_WRAPPERS_ALL, the entire Drupal stream wrapper
+ *   registry is returned. Otherwise only the stream wrappers whose 'type'
+ *   bitmask has an on bit for each bit specified in $filter are returned.
+ *
+ * @see hook_stream_wrappers()
+ * @see hook_stream_wrappers_alter()
+ */
+function file_get_stream_wrappers($filter = STREAM_WRAPPERS_ALL) {
+  $wrappers_storage = &drupal_static(__FUNCTION__);
+
+  if (!isset($wrappers_storage)) {
+    $wrappers = module_invoke_all('stream_wrappers');
+    foreach ($wrappers as $scheme => $info) {
+      // Add defaults.
+      $wrappers[$scheme] += array('type' => STREAM_WRAPPERS_NORMAL);
+    }
+    drupal_alter('stream_wrappers', $wrappers);
+    $existing = stream_get_wrappers();
+    foreach ($wrappers as $scheme => $info) {
+      // We only register classes that implement our interface.
+      if (in_array('DrupalStreamWrapperInterface', class_implements($info['class']), TRUE)) {
+        // Record whether we are overriding an existing scheme.
+        if (in_array($scheme, $existing, TRUE)) {
+          $wrappers[$scheme]['override'] = TRUE;
+          stream_wrapper_unregister($scheme);
+        }
+        else {
+          $wrappers[$scheme]['override'] = FALSE;
+        }
+        if (($info['type'] & STREAM_WRAPPERS_LOCAL) == STREAM_WRAPPERS_LOCAL) {
+          stream_wrapper_register($scheme, $info['class']);
+        }
+        else {
+          stream_wrapper_register($scheme, $info['class'], STREAM_IS_URL);
+        }
+      }
+      // Pre-populate the static cache with the filters most typically used.
+      $wrappers_storage[STREAM_WRAPPERS_ALL][$scheme] = $wrappers[$scheme];
+      if (($info['type'] & STREAM_WRAPPERS_WRITE_VISIBLE) == STREAM_WRAPPERS_WRITE_VISIBLE) {
+        $wrappers_storage[STREAM_WRAPPERS_WRITE_VISIBLE][$scheme] = $wrappers[$scheme];
+      }
+    }
+  }
+
+  if (!isset($wrappers_storage[$filter])) {
+    $wrappers_storage[$filter] = array();
+    foreach ($wrappers_storage[STREAM_WRAPPERS_ALL] as $scheme => $info) {
+      // Bit-wise filter.
+      if (($info['type'] & $filter) == $filter) {
+        $wrappers_storage[$filter][$scheme] = $info;
+      }
+    }
+  }
+
+  return $wrappers_storage[$filter];
+}
+
+/**
+ * Returns the stream wrapper class name for a given scheme.
+ *
+ * @param $scheme
+ *   Stream scheme.
+ *
+ * @return
+ *   Return string if a scheme has a registered handler, or FALSE.
+ */
+function file_stream_wrapper_get_class($scheme) {
+  $wrappers = file_get_stream_wrappers();
+  return empty($wrappers[$scheme]) ? FALSE : $wrappers[$scheme]['class'];
+}
+
+/**
+ * Returns the scheme of a URI (e.g. a stream).
+ *
+ * @param $uri
+ *   A stream, referenced as "scheme://target".
+ *
+ * @return
+ *   A string containing the name of the scheme, or FALSE if none. For example,
+ *   the URI "public://example.txt" would return "public".
+ *
+ * @see file_uri_target()
+ */
+function file_uri_scheme($uri) {
+  $position = strpos($uri, '://');
+  return $position ? substr($uri, 0, $position) : FALSE;
+}
+
+/**
+ * Checks that the scheme of a stream URI is valid.
+ *
+ * Confirms that there is a registered stream handler for the provided scheme
+ * and that it is callable. This is useful if you want to confirm a valid
+ * scheme without creating a new instance of the registered handler.
+ *
+ * @param $scheme
+ *   A URI scheme, a stream is referenced as "scheme://target".
+ *
+ * @return
+ *   Returns TRUE if the string is the name of a validated stream,
+ *   or FALSE if the scheme does not have a registered handler.
+ */
+function file_stream_wrapper_valid_scheme($scheme) {
+  // Does the scheme have a registered handler that is callable?
+  $class = file_stream_wrapper_get_class($scheme);
+  if (class_exists($class)) {
+    return TRUE;
+  }
+  else {
+    return FALSE;
+  }
+}
+
+
+/**
+ * Returns the part of a URI after the schema.
+ *
+ * @param $uri
+ *   A stream, referenced as "scheme://target".
+ *
+ * @return
+ *   A string containing the target (path), or FALSE if none.
+ *   For example, the URI "public://sample/test.txt" would return
+ *   "sample/test.txt".
+ *
+ * @see file_uri_scheme()
+ */
+function file_uri_target($uri) {
+  $data = explode('://', $uri, 2);
+
+  // Remove erroneous leading or trailing, forward-slashes and backslashes.
+  return count($data) == 2 ? trim($data[1], '\/') : FALSE;
+}
+
+/**
+ * Gets the default file stream implementation.
+ *
+ * @return
+ *   'public', 'private' or any other file scheme defined as the default.
+ */
+function file_default_scheme() {
+  return variable_get('file_default_scheme', 'public');
+}
+
+/**
+ * Normalizes a URI by making it syntactically correct.
+ *
+ * A stream is referenced as "scheme://target".
+ *
+ * The following actions are taken:
+ * - Remove trailing slashes from target
+ * - Trim erroneous leading slashes from target. e.g. ":///" becomes "://".
+ *
+ * @param $uri
+ *   String reference containing the URI to normalize.
+ *
+ * @return
+ *   The normalized URI.
+ */
+function file_stream_wrapper_uri_normalize($uri) {
+  $scheme = file_uri_scheme($uri);
+
+  if ($scheme && file_stream_wrapper_valid_scheme($scheme)) {
+    $target = file_uri_target($uri);
+
+    if ($target !== FALSE) {
+      $uri = $scheme . '://' . $target;
+    }
+  }
+  return $uri;
+}
+
+/**
+ * Returns a reference to the stream wrapper class responsible for a given URI.
+ *
+ * The scheme determines the stream wrapper class that should be
+ * used by consulting the stream wrapper registry.
+ *
+ * @param $uri
+ *   A stream, referenced as "scheme://target".
+ *
+ * @return
+ *   Returns a new stream wrapper object appropriate for the given URI or FALSE
+ *   if no registered handler could be found. For example, a URI of
+ *   "private://example.txt" would return a new private stream wrapper object
+ *   (DrupalPrivateStreamWrapper).
+ */
+function file_stream_wrapper_get_instance_by_uri($uri) {
+  $scheme = file_uri_scheme($uri);
+  $class = file_stream_wrapper_get_class($scheme);
+  if (class_exists($class)) {
+    $instance = new $class();
+    $instance->setUri($uri);
+    return $instance;
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
+ * Returns a reference to the stream wrapper class responsible for a scheme.
+ *
+ * This helper method returns a stream instance using a scheme. That is, the
+ * passed string does not contain a "://". For example, "public" is a scheme
+ * but "public://" is a URI (stream). This is because the later contains both
+ * a scheme and target despite target being empty.
+ *
+ * Note: the instance URI will be initialized to "scheme://" so that you can
+ * make the customary method calls as if you had retrieved an instance by URI.
+ *
+ * @param $scheme
+ *   If the stream was "public://target", "public" would be the scheme.
+ *
+ * @return
+ *   Returns a new stream wrapper object appropriate for the given $scheme.
+ *   For example, for the public scheme a stream wrapper object
+ *   (DrupalPublicStreamWrapper).
+ *   FALSE is returned if no registered handler could be found.
+ */
+function file_stream_wrapper_get_instance_by_scheme($scheme) {
+  $class = file_stream_wrapper_get_class($scheme);
+  if (class_exists($class)) {
+    $instance = new $class();
+    $instance->setUri($scheme . '://');
+    return $instance;
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
+ * Creates a web-accessible URL for a stream to an external or local file.
+ *
+ * Compatibility: normal paths and stream wrappers.
+ *
+ * There are two kinds of local files:
+ * - "managed files", i.e. those stored by a Drupal-compatible stream wrapper.
+ *   These are files that have either been uploaded by users or were generated
+ *   automatically (for example through CSS aggregation).
+ * - "shipped files", i.e. those outside of the files directory, which ship as
+ *   part of Drupal core or contributed modules or themes.
+ *
+ * @param $uri
+ *   The URI to a file for which we need an external URL, or the path to a
+ *   shipped file.
+ *
+ * @return
+ *   A string containing a URL that may be used to access the file.
+ *   If the provided string already contains a preceding 'http', 'https', or
+ *   '/', nothing is done and the same string is returned. If a stream wrapper
+ *   could not be found to generate an external URL, then FALSE is returned.
+ *
+ * @see http://drupal.org/node/515192
+ */
+function file_create_url($uri) {
+  // Allow the URI to be altered, e.g. to serve a file from a CDN or static
+  // file server.
+  drupal_alter('file_url', $uri);
+
+  $scheme = file_uri_scheme($uri);
+
+  if (!$scheme) {
+    // Allow for:
+    // - root-relative URIs (e.g. /foo.jpg in http://example.com/foo.jpg)
+    // - protocol-relative URIs (e.g. //bar.jpg, which is expanded to
+    //   http://example.com/bar.jpg by the browser when viewing a page over
+    //   HTTP and to https://example.com/bar.jpg when viewing a HTTPS page)
+    // Both types of relative URIs are characterized by a leading slash, hence
+    // we can use a single check.
+    if (drupal_substr($uri, 0, 1) == '/') {
+      return $uri;
+    }
+    else {
+      // If this is not a properly formatted stream, then it is a shipped file.
+      // Therefore, return the urlencoded URI with the base URL prepended.
+      return $GLOBALS['base_url'] . '/' . drupal_encode_path($uri);
+    }
+  }
+  elseif ($scheme == 'http' || $scheme == 'https') {
+    // Check for HTTP so that we don't have to implement getExternalUrl() for
+    // the HTTP wrapper.
+    return $uri;
+  }
+  else {
+    // Attempt to return an external URL using the appropriate wrapper.
+    if ($wrapper = file_stream_wrapper_get_instance_by_uri($uri)) {
+      return $wrapper->getExternalUrl();
+    }
+    else {
+      return FALSE;
+    }
+  }
+}
+
+/**
+ * Checks that the directory exists and is writable.
+ *
+ * Directories need to have execute permissions to be considered a directory by
+ * FTP servers, etc.
+ *
+ * @param $directory
+ *   A string reference containing the name of a directory path or URI. A
+ *   trailing slash will be trimmed from a path.
+ * @param $options
+ *   A bitmask to indicate if the directory should be created if it does
+ *   not exist (FILE_CREATE_DIRECTORY) or made writable if it is read-only
+ *   (FILE_MODIFY_PERMISSIONS).
+ *
+ * @return
+ *   TRUE if the directory exists (or was created) and is writable. FALSE
+ *   otherwise.
+ */
+function file_prepare_directory(&$directory, $options = FILE_MODIFY_PERMISSIONS) {
+  if (!file_stream_wrapper_valid_scheme(file_uri_scheme($directory))) {
+    // Only trim if we're not dealing with a stream.
+    $directory = rtrim($directory, '/\\');
+  }
+
+  // Check if directory exists.
+  if (!is_dir($directory)) {
+    // Let mkdir() recursively create directories and use the default directory
+    // permissions.
+    if (($options & FILE_CREATE_DIRECTORY) && @drupal_mkdir($directory, NULL, TRUE)) {
+      return drupal_chmod($directory);
+    }
+    return FALSE;
+  }
+  // The directory exists, so check to see if it is writable.
+  $writable = is_writable($directory);
+  if (!$writable && ($options & FILE_MODIFY_PERMISSIONS)) {
+    return drupal_chmod($directory);
+  }
+
+  return $writable;
+}
+
+/**
+ * Creates a .htaccess file in each Drupal files directory if it is missing.
+ */
+function file_ensure_htaccess() {
+  file_create_htaccess('public://', FALSE);
+  if (variable_get('file_private_path', FALSE)) {
+    file_create_htaccess('private://', TRUE);
+  }
+  file_create_htaccess('temporary://', TRUE);
+}
+
+/**
+ * Creates a .htaccess file in the given directory.
+ *
+ * @param $directory
+ *   The directory.
+ * @param $private
+ *   FALSE indicates that $directory should be an open and public directory.
+ *   The default is TRUE which indicates a private and protected directory.
+ * @param $force_overwrite
+ *   Set to TRUE to attempt to overwrite the existing .htaccess file if one is
+ *   already present. Defaults to FALSE.
+ */
+function file_create_htaccess($directory, $private = TRUE, $force_overwrite = FALSE) {
+  if (file_uri_scheme($directory)) {
+    $directory = file_stream_wrapper_uri_normalize($directory);
+  }
+  else {
+    $directory = rtrim($directory, '/\\');
+  }
+  $htaccess_path =  $directory . '/.htaccess';
+
+  if (file_exists($htaccess_path) && !$force_overwrite) {
+    // Short circuit if the .htaccess file already exists.
+    return;
+  }
+
+  $htaccess_lines = file_htaccess_lines($private);
+
+  // Write the .htaccess file.
+  if (file_put_contents($htaccess_path, $htaccess_lines)) {
+    drupal_chmod($htaccess_path, 0444);
+  }
+  else {
+    $variables = array('%directory' => $directory, '!htaccess' => '<br />' . nl2br(check_plain($htaccess_lines)));
+    watchdog('security', "Security warning: Couldn't write .htaccess file. Please create a .htaccess file in your %directory directory which contains the following lines: <code>!htaccess</code>", $variables, WATCHDOG_ERROR);
+  }
+}
+
+/**
+ * Returns the standard .htaccess lines that Drupal writes to file directories.
+ *
+ * @param $private
+ *   (Optional) Set to FALSE to return the .htaccess lines for an open and
+ *   public directory. The default is TRUE, which returns the .htaccess lines
+ *   for a private and protected directory.
+ *
+ * @return
+ *   A string representing the desired contents of the .htaccess file.
+ *
+ * @see file_create_htaccess()
+ */
+function file_htaccess_lines($private = TRUE) {
+  $lines = <<<EOF
+# Turn off all options we don't need.
+Options None
+Options +FollowSymLinks
+
+# Set the catch-all handler to prevent scripts from being executed.
+SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006
+<Files *>
+  # Override the handler again if we're run later in the evaluation list.
+  SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003
+</Files>
+
+# If we know how to do it safely, disable the PHP engine entirely.
+<IfModule mod_php5.c>
+  php_flag engine off
+</IfModule>
+EOF;
+
+  if ($private) {
+    $lines = "Deny from all\n\n" . $lines;
+  }
+
+  return $lines;
+}
+
+/**
+ * Loads file objects from the database.
+ *
+ * @param $fids
+ *   An array of file IDs.
+ * @param $conditions
+ *   (deprecated) An associative array of conditions on the {file_managed}
+ *   table, where the keys are the database fields and the values are the
+ *   values those fields must have. Instead, it is preferable to use
+ *   EntityFieldQuery to retrieve a list of entity IDs loadable by
+ *   this function.
+ *
+ * @return
+ *   An array of file objects, indexed by fid.
+ *
+ * @todo Remove $conditions in Drupal 8.
+ *
+ * @see hook_file_load()
+ * @see file_load()
+ * @see entity_load()
+ * @see EntityFieldQuery
+ */
+function file_load_multiple($fids = array(), $conditions = array()) {
+  return entity_load('file', $fids, $conditions);
+}
+
+/**
+ * Loads a single file object from the database.
+ *
+ * @param $fid
+ *   A file ID.
+ *
+ * @return
+ *   An object representing the file, or FALSE if the file was not found.
+ *
+ * @see hook_file_load()
+ * @see file_load_multiple()
+ */
+function file_load($fid) {
+  $files = file_load_multiple(array($fid), array());
+  return reset($files);
+}
+
+/**
+ * Saves a file object to the database.
+ *
+ * If the $file->fid is not set a new record will be added.
+ *
+ * @param $file
+ *   A file object returned by file_load().
+ *
+ * @return
+ *   The updated file object.
+ *
+ * @see hook_file_insert()
+ * @see hook_file_update()
+ */
+function file_save(stdClass $file) {
+  $file->timestamp = REQUEST_TIME;
+  $file->filesize = filesize($file->uri);
+
+  // Load the stored entity, if any.
+  if (!empty($file->fid) && !isset($file->original)) {
+    $file->original = entity_load_unchanged('file', $file->fid);
+  }
+
+  module_invoke_all('file_presave', $file);
+  module_invoke_all('entity_presave', $file, 'file');
+
+  if (empty($file->fid)) {
+    drupal_write_record('file_managed', $file);
+    // Inform modules about the newly added file.
+    module_invoke_all('file_insert', $file);
+    module_invoke_all('entity_insert', $file, 'file');
+  }
+  else {
+    drupal_write_record('file_managed', $file, 'fid');
+    // Inform modules that the file has been updated.
+    module_invoke_all('file_update', $file);
+    module_invoke_all('entity_update', $file, 'file');
+  }
+
+  unset($file->original);
+  return $file;
+}
+
+/**
+ * Determines where a file is used.
+ *
+ * @param $file
+ *   A file object.
+ *
+ * @return
+ *   A nested array with usage data. The first level is keyed by module name,
+ *   the second by object type and the third by the object id. The value
+ *   of the third level contains the usage count.
+ *
+ * @see file_usage_add()
+ * @see file_usage_delete()
+ */
+function file_usage_list(stdClass $file) {
+  $result = db_select('file_usage', 'f')
+    ->fields('f', array('module', 'type', 'id', 'count'))
+    ->condition('fid', $file->fid)
+    ->condition('count', 0, '>')
+    ->execute();
+  $references = array();
+  foreach ($result as $usage) {
+    $references[$usage->module][$usage->type][$usage->id] = $usage->count;
+  }
+  return $references;
+}
+
+/**
+ * Records that a module is using a file.
+ *
+ * This usage information will be queried during file_delete() to ensure that
+ * a file is not in use before it is physically removed from disk.
+ *
+ * Examples:
+ * - A module that associates files with nodes, so $type would be
+ *   'node' and $id would be the node's nid. Files for all revisions are stored
+ *   within a single nid.
+ * - The User module associates an image with a user, so $type would be 'user'
+ *   and the $id would be the user's uid.
+ *
+ * @param $file
+ *   A file object.
+ * @param $module
+ *   The name of the module using the file.
+ * @param $type
+ *   The type of the object that contains the referenced file.
+ * @param $id
+ *   The unique, numeric ID of the object containing the referenced file.
+ * @param $count
+ *   (optional) The number of references to add to the object. Defaults to 1.
+ *
+ * @see file_usage_list()
+ * @see file_usage_delete()
+ */
+function file_usage_add(stdClass $file, $module, $type, $id, $count = 1) {
+  db_merge('file_usage')
+    ->key(array(
+      'fid' => $file->fid,
+      'module' => $module,
+      'type' => $type,
+      'id' => $id,
+    ))
+    ->fields(array('count' => $count))
+    ->expression('count', 'count + :count', array(':count' => $count))
+    ->execute();
+}
+
+/**
+ * Removes a record to indicate that a module is no longer using a file.
+ *
+ * The file_delete() function is typically called after removing a file usage
+ * to remove the record from the file_managed table and delete the file itself.
+ *
+ * @param $file
+ *   A file object.
+ * @param $module
+ *   The name of the module using the file.
+ * @param $type
+ *   (optional) The type of the object that contains the referenced file. May
+ *   be omitted if all module references to a file are being deleted.
+ * @param $id
+ *   (optional) The unique, numeric ID of the object containing the referenced
+ *   file. May be omitted if all module references to a file are being deleted.
+ * @param $count
+ *   (optional) The number of references to delete from the object. Defaults to
+ *   1. 0 may be specified to delete all references to the file within a
+ *   specific object.
+ *
+ * @see file_usage_add()
+ * @see file_usage_list()
+ * @see file_delete()
+ */
+function file_usage_delete(stdClass $file, $module, $type = NULL, $id = NULL, $count = 1) {
+  // Delete rows that have a exact or less value to prevent empty rows.
+  $query = db_delete('file_usage')
+    ->condition('module', $module)
+    ->condition('fid', $file->fid);
+  if ($type && $id) {
+    $query
+      ->condition('type', $type)
+      ->condition('id', $id);
+  }
+  if ($count) {
+    $query->condition('count', $count, '<=');
+  }
+  $result = $query->execute();
+
+  // If the row has more than the specified count decrement it by that number.
+  if (!$result && $count > 0) {
+    $query = db_update('file_usage')
+      ->condition('module', $module)
+      ->condition('fid', $file->fid);
+    if ($type && $id) {
+      $query
+        ->condition('type', $type)
+        ->condition('id', $id);
+    }
+    $query->expression('count', 'count - :count', array(':count' => $count));
+    $query->execute();
+  }
+}
+
+/**
+ * Copies a file to a new location and adds a file record to the database.
+ *
+ * This function should be used when manipulating files that have records
+ * stored in the database. This is a powerful function that in many ways
+ * performs like an advanced version of copy().
+ * - Checks if $source and $destination are valid and readable/writable.
+ * - If file already exists in $destination either the call will error out,
+ *   replace the file or rename the file based on the $replace parameter.
+ * - If the $source and $destination are equal, the behavior depends on the
+ *   $replace parameter. FILE_EXISTS_REPLACE will error out. FILE_EXISTS_RENAME
+ *   will rename the file until the $destination is unique.
+ * - Adds the new file to the files database. If the source file is a
+ *   temporary file, the resulting file will also be a temporary file. See
+ *   file_save_upload() for details on temporary files.
+ *
+ * @param $source
+ *   A file object.
+ * @param $destination
+ *   A string containing the destination that $source should be copied to.
+ *   This must be a stream wrapper URI.
+ * @param $replace
+ *   Replace behavior when the destination file already exists:
+ *   - FILE_EXISTS_REPLACE - Replace the existing file. If a managed file with
+ *       the destination name exists then its database entry will be updated. If
+ *       no database entry is found then a new one will be created.
+ *   - FILE_EXISTS_RENAME - Append _{incrementing number} until the filename is
+ *       unique.
+ *   - FILE_EXISTS_ERROR - Do nothing and return FALSE.
+ *
+ * @return
+ *   File object if the copy is successful, or FALSE in the event of an error.
+ *
+ * @see file_unmanaged_copy()
+ * @see hook_file_copy()
+ */
+function file_copy(stdClass $source, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
+  if (!file_valid_uri($destination)) {
+    if (($realpath = drupal_realpath($source->uri)) !== FALSE) {
+      watchdog('file', 'File %file (%realpath) could not be copied, because the destination %destination is invalid. This is often caused by improper use of file_copy() or a missing stream wrapper.', array('%file' => $source->uri, '%realpath' => $realpath, '%destination' => $destination));
+    }
+    else {
+      watchdog('file', 'File %file could not be copied, because the destination %destination is invalid. This is often caused by improper use of file_copy() or a missing stream wrapper.', array('%file' => $source->uri, '%destination' => $destination));
+    }
+    drupal_set_message(t('The specified file %file could not be copied, because the destination is invalid. More information is available in the system log.', array('%file' => $source->uri)), 'error');
+    return FALSE;
+  }
+
+  if ($uri = file_unmanaged_copy($source->uri, $destination, $replace)) {
+    $file = clone $source;
+    $file->fid = NULL;
+    $file->uri = $uri;
+    $file->filename = drupal_basename($uri);
+    // If we are replacing an existing file re-use its database record.
+    if ($replace == FILE_EXISTS_REPLACE) {
+      $existing_files = file_load_multiple(array(), array('uri' => $uri));
+      if (count($existing_files)) {
+        $existing = reset($existing_files);
+        $file->fid = $existing->fid;
+        $file->filename = $existing->filename;
+      }
+    }
+    // If we are renaming around an existing file (rather than a directory),
+    // use its basename for the filename.
+    elseif ($replace == FILE_EXISTS_RENAME && is_file($destination)) {
+      $file->filename = drupal_basename($destination);
+    }
+
+    $file = file_save($file);
+
+    // Inform modules that the file has been copied.
+    module_invoke_all('file_copy', $file, $source);
+
+    return $file;
+  }
+  return FALSE;
+}
+
+/**
+ * Determines whether the URI has a valid scheme for file API operations.
+ *
+ * There must be a scheme and it must be a Drupal-provided scheme like
+ * 'public', 'private', 'temporary', or an extension provided with
+ * hook_stream_wrappers().
+ *
+ * @param $uri
+ *   The URI to be tested.
+ *
+ * @return
+ *   TRUE if the URI is allowed.
+ */
+function file_valid_uri($uri) {
+  // Assert that the URI has an allowed scheme. Barepaths are not allowed.
+  $uri_scheme = file_uri_scheme($uri);
+  if (empty($uri_scheme) || !file_stream_wrapper_valid_scheme($uri_scheme)) {
+    return FALSE;
+  }
+  return TRUE;
+}
+
+/**
+ * Copies a file to a new location without invoking the file API.
+ *
+ * This is a powerful function that in many ways performs like an advanced
+ * version of copy().
+ * - Checks if $source and $destination are valid and readable/writable.
+ * - If file already exists in $destination either the call will error out,
+ *   replace the file or rename the file based on the $replace parameter.
+ * - If the $source and $destination are equal, the behavior depends on the
+ *   $replace parameter. FILE_EXISTS_REPLACE will error out. FILE_EXISTS_RENAME
+ *   will rename the file until the $destination is unique.
+ * - Provides a fallback using realpaths if the move fails using stream
+ *   wrappers. This can occur because PHP's copy() function does not properly
+ *   support streams if safe_mode or open_basedir are enabled. See
+ *   https://bugs.php.net/bug.php?id=60456
+ *
+ * @param $source
+ *   A string specifying the filepath or URI of the source file.
+ * @param $destination
+ *   A URI containing the destination that $source should be copied to. The
+ *   URI may be a bare filepath (without a scheme). If this value is omitted,
+ *   Drupal's default files scheme will be used, usually "public://".
+ * @param $replace
+ *   Replace behavior when the destination file already exists:
+ *   - FILE_EXISTS_REPLACE - Replace the existing file.
+ *   - FILE_EXISTS_RENAME - Append _{incrementing number} until the filename is
+ *       unique.
+ *   - FILE_EXISTS_ERROR - Do nothing and return FALSE.
+ *
+ * @return
+ *   The path to the new file, or FALSE in the event of an error.
+ *
+ * @see file_copy()
+ */
+function file_unmanaged_copy($source, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
+  $original_source = $source;
+  $original_destination = $destination;
+
+  // Assert that the source file actually exists.
+  if (!file_exists($source)) {
+    // @todo Replace drupal_set_message() calls with exceptions instead.
+    drupal_set_message(t('The specified file %file could not be copied, because no file by that name exists. Please check that you supplied the correct filename.', array('%file' => $original_source)), 'error');
+    if (($realpath = drupal_realpath($original_source)) !== FALSE) {
+      watchdog('file', 'File %file (%realpath) could not be copied because it does not exist.', array('%file' => $original_source, '%realpath' => $realpath));
+    }
+    else {
+      watchdog('file', 'File %file could not be copied because it does not exist.', array('%file' => $original_source));
+    }
+    return FALSE;
+  }
+
+  // Build a destination URI if necessary.
+  if (!isset($destination)) {
+    $destination = file_build_uri(drupal_basename($source));
+  }
+
+
+  // Prepare the destination directory.
+  if (file_prepare_directory($destination)) {
+    // The destination is already a directory, so append the source basename.
+    $destination = file_stream_wrapper_uri_normalize($destination . '/' . drupal_basename($source));
+  }
+  else {
+    // Perhaps $destination is a dir/file?
+    $dirname = drupal_dirname($destination);
+    if (!file_prepare_directory($dirname)) {
+      // The destination is not valid.
+      watchdog('file', 'File %file could not be copied, because the destination directory %destination is not configured correctly.', array('%file' => $original_source, '%destination' => $dirname));
+      drupal_set_message(t('The specified file %file could not be copied, because the destination directory is not properly configured. This may be caused by a problem with file or directory permissions. More information is available in the system log.', array('%file' => $original_source)), 'error');
+      return FALSE;
+    }
+  }
+
+  // Determine whether we can perform this operation based on overwrite rules.
+  $destination = file_destination($destination, $replace);
+  if ($destination === FALSE) {
+    drupal_set_message(t('The file %file could not be copied because a file by that name already exists in the destination directory.', array('%file' => $original_source)), 'error');
+    watchdog('file', 'File %file could not be copied because a file by that name already exists in the destination directory (%directory)', array('%file' => $original_source, '%directory' => $destination));
+    return FALSE;
+  }
+
+  // Assert that the source and destination filenames are not the same.
+  $real_source = drupal_realpath($source);
+  $real_destination = drupal_realpath($destination);
+  if ($source == $destination || ($real_source !== FALSE) && ($real_source == $real_destination)) {
+    drupal_set_message(t('The specified file %file was not copied because it would overwrite itself.', array('%file' => $source)), 'error');
+    watchdog('file', 'File %file could not be copied because it would overwrite itself.', array('%file' => $source));
+    return FALSE;
+  }
+  // Make sure the .htaccess files are present.
+  file_ensure_htaccess();
+  // Perform the copy operation.
+  if (!@copy($source, $destination)) {
+    // If the copy failed and realpaths exist, retry the operation using them
+    // instead.
+    if ($real_source === FALSE || $real_destination === FALSE || !@copy($real_source, $real_destination)) {
+      watchdog('file', 'The specified file %file could not be copied to %destination.', array('%file' => $source, '%destination' => $destination), WATCHDOG_ERROR);
+      return FALSE;
+    }
+  }
+
+  // Set the permissions on the new file.
+  drupal_chmod($destination);
+
+  return $destination;
+}
+
+/**
+ * Constructs a URI to Drupal's default files location given a relative path.
+ */
+function file_build_uri($path) {
+  $uri = file_default_scheme() . '://' . $path;
+  return file_stream_wrapper_uri_normalize($uri);
+}
+
+/**
+ * Determines the destination path for a file.
+ *
+ * @param $destination
+ *   A string specifying the desired final URI or filepath.
+ * @param $replace
+ *   Replace behavior when the destination file already exists.
+ *   - FILE_EXISTS_REPLACE - Replace the existing file.
+ *   - FILE_EXISTS_RENAME - Append _{incrementing number} until the filename is
+ *       unique.
+ *   - FILE_EXISTS_ERROR - Do nothing and return FALSE.
+ *
+ * @return
+ *   The destination filepath, or FALSE if the file already exists
+ *   and FILE_EXISTS_ERROR is specified.
+ */
+function file_destination($destination, $replace) {
+  if (file_exists($destination)) {
+    switch ($replace) {
+      case FILE_EXISTS_REPLACE:
+        // Do nothing here, we want to overwrite the existing file.
+        break;
+
+      case FILE_EXISTS_RENAME:
+        $basename = drupal_basename($destination);
+        $directory = drupal_dirname($destination);
+        $destination = file_create_filename($basename, $directory);
+        break;
+
+      case FILE_EXISTS_ERROR:
+        // Error reporting handled by calling function.
+        return FALSE;
+    }
+  }
+  return $destination;
+}
+
+/**
+ * Moves a file to a new location and update the file's database entry.
+ *
+ * Moving a file is performed by copying the file to the new location and then
+ * deleting the original.
+ * - Checks if $source and $destination are valid and readable/writable.
+ * - Performs a file move if $source is not equal to $destination.
+ * - If file already exists in $destination either the call will error out,
+ *   replace the file or rename the file based on the $replace parameter.
+ * - Adds the new file to the files database.
+ *
+ * @param $source
+ *   A file object.
+ * @param $destination
+ *   A string containing the destination that $source should be moved to.
+ *   This must be a stream wrapper URI.
+ * @param $replace
+ *   Replace behavior when the destination file already exists:
+ *   - FILE_EXISTS_REPLACE - Replace the existing file. If a managed file with
+ *       the destination name exists then its database entry will be updated and
+ *       file_delete() called on the source file after hook_file_move is called.
+ *       If no database entry is found then the source files record will be
+ *       updated.
+ *   - FILE_EXISTS_RENAME - Append _{incrementing number} until the filename is
+ *       unique.
+ *   - FILE_EXISTS_ERROR - Do nothing and return FALSE.
+ *
+ * @return
+ *   Resulting file object for success, or FALSE in the event of an error.
+ *
+ * @see file_unmanaged_move()
+ * @see hook_file_move()
+ */
+function file_move(stdClass $source, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
+  if (!file_valid_uri($destination)) {
+    if (($realpath = drupal_realpath($source->uri)) !== FALSE) {
+      watchdog('file', 'File %file (%realpath) could not be moved, because the destination %destination is invalid. This may be caused by improper use of file_move() or a missing stream wrapper.', array('%file' => $source->uri, '%realpath' => $realpath, '%destination' => $destination));
+    }
+    else {
+      watchdog('file', 'File %file could not be moved, because the destination %destination is invalid. This may be caused by improper use of file_move() or a missing stream wrapper.', array('%file' => $source->uri, '%destination' => $destination));
+    }
+    drupal_set_message(t('The specified file %file could not be moved, because the destination is invalid. More information is available in the system log.', array('%file' => $source->uri)), 'error');
+    return FALSE;
+  }
+
+  if ($uri = file_unmanaged_move($source->uri, $destination, $replace)) {
+    $delete_source = FALSE;
+
+    $file = clone $source;
+    $file->uri = $uri;
+    // If we are replacing an existing file re-use its database record.
+    if ($replace == FILE_EXISTS_REPLACE) {
+      $existing_files = file_load_multiple(array(), array('uri' => $uri));
+      if (count($existing_files)) {
+        $existing = reset($existing_files);
+        $delete_source = TRUE;
+        $file->fid = $existing->fid;
+      }
+    }
+    // If we are renaming around an existing file (rather than a directory),
+    // use its basename for the filename.
+    elseif ($replace == FILE_EXISTS_RENAME && is_file($destination)) {
+      $file->filename = drupal_basename($destination);
+    }
+
+    $file = file_save($file);
+
+    // Inform modules that the file has been moved.
+    module_invoke_all('file_move', $file, $source);
+
+    if ($delete_source) {
+      // Try a soft delete to remove original if it's not in use elsewhere.
+      file_delete($source);
+    }
+
+    return $file;
+  }
+  return FALSE;
+}
+
+/**
+ * Moves a file to a new location without database changes or hook invocation.
+ *
+ * @param $source
+ *   A string specifying the filepath or URI of the original file.
+ * @param $destination
+ *   A string containing the destination that $source should be moved to.
+ *   This must be a stream wrapper URI. If this value is omitted, Drupal's
+ *   default files scheme will be used, usually "public://".
+ * @param $replace
+ *   Replace behavior when the destination file already exists:
+ *   - FILE_EXISTS_REPLACE - Replace the existing file.
+ *   - FILE_EXISTS_RENAME - Append _{incrementing number} until the filename is
+ *       unique.
+ *   - FILE_EXISTS_ERROR - Do nothing and return FALSE.
+ *
+ * @return
+ *   The URI of the moved file, or FALSE in the event of an error.
+ *
+ * @see file_move()
+ */
+function file_unmanaged_move($source, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
+  $filepath = file_unmanaged_copy($source, $destination, $replace);
+  if ($filepath == FALSE || file_unmanaged_delete($source) == FALSE) {
+    return FALSE;
+  }
+  return $filepath;
+}
+
+/**
+ * Modifies a filename as needed for security purposes.
+ *
+ * Munging a file name prevents unknown file extensions from masking exploit
+ * files. When web servers such as Apache decide how to process a URL request,
+ * they use the file extension. If the extension is not recognized, Apache
+ * skips that extension and uses the previous file extension. For example, if
+ * the file being requested is exploit.php.pps, and Apache does not recognize
+ * the '.pps' extension, it treats the file as PHP and executes it. To make
+ * this file name safe for Apache and prevent it from executing as PHP, the
+ * .php extension is "munged" into .php_, making the safe file name
+ * exploit.php_.pps.
+ *
+ * Specifically, this function adds an underscore to all extensions that are
+ * between 2 and 5 characters in length, internal to the file name, and not
+ * included in $extensions.
+ *
+ * Function behavior is also controlled by the Drupal variable
+ * 'allow_insecure_uploads'. If 'allow_insecure_uploads' evaluates to TRUE, no
+ * alterations will be made, if it evaluates to FALSE, the filename is 'munged'.
+ *
+ * @param $filename
+ *   File name to modify.
+ * @param $extensions
+ *   A space-separated list of extensions that should not be altered.
+ * @param $alerts
+ *   If TRUE, drupal_set_message() will be called to display a message if the
+ *   file name was changed.
+ *
+ * @return
+ *   The potentially modified $filename.
+ */
+function file_munge_filename($filename, $extensions, $alerts = TRUE) {
+  $original = $filename;
+
+  // Allow potentially insecure uploads for very savvy users and admin
+  if (!variable_get('allow_insecure_uploads', 0)) {
+    // Remove any null bytes. See http://php.net/manual/security.filesystem.nullbytes.php
+    $filename = str_replace(chr(0), '', $filename);
+
+    $whitelist = array_unique(explode(' ', trim($extensions)));
+
+    // Split the filename up by periods. The first part becomes the basename
+    // the last part the final extension.
+    $filename_parts = explode('.', $filename);
+    $new_filename = array_shift($filename_parts); // Remove file basename.
+    $final_extension = array_pop($filename_parts); // Remove final extension.
+
+    // Loop through the middle parts of the name and add an underscore to the
+    // end of each section that could be a file extension but isn't in the list
+    // of allowed extensions.
+    foreach ($filename_parts as $filename_part) {
+      $new_filename .= '.' . $filename_part;
+      if (!in_array($filename_part, $whitelist) && preg_match("/^[a-zA-Z]{2,5}\d?$/", $filename_part)) {
+        $new_filename .= '_';
+      }
+    }
+    $filename = $new_filename . '.' . $final_extension;
+
+    if ($alerts && $original != $filename) {
+      drupal_set_message(t('For security reasons, your upload has been renamed to %filename.', array('%filename' => $filename)));
+    }
+  }
+
+  return $filename;
+}
+
+/**
+ * Undoes the effect of file_munge_filename().
+ *
+ * @param $filename
+ *   String with the filename to be unmunged.
+ *
+ * @return
+ *   An unmunged filename string.
+ */
+function file_unmunge_filename($filename) {
+  return str_replace('_.', '.', $filename);
+}
+
+/**
+ * Creates a full file path from a directory and filename.
+ *
+ * If a file with the specified name already exists, an alternative will be
+ * used.
+ *
+ * @param $basename
+ *   String filename
+ * @param $directory
+ *   String containing the directory or parent URI.
+ *
+ * @return
+ *   File path consisting of $directory and a unique filename based off
+ *   of $basename.
+ */
+function file_create_filename($basename, $directory) {
+  // Strip control characters (ASCII value < 32). Though these are allowed in
+  // some filesystems, not many applications handle them well.
+  $basename = preg_replace('/[\x00-\x1F]/u', '_', $basename);
+  if (substr(PHP_OS, 0, 3) == 'WIN') {
+    // These characters are not allowed in Windows filenames
+    $basename = str_replace(array(':', '*', '?', '"', '<', '>', '|'), '_', $basename);
+  }
+
+  // A URI or path may already have a trailing slash or look like "public://".
+  if (substr($directory, -1) == '/') {
+    $separator = '';
+  }
+  else {
+    $separator = '/';
+  }
+
+  $destination = $directory . $separator . $basename;
+
+  if (file_exists($destination)) {
+    // Destination file already exists, generate an alternative.
+    $pos = strrpos($basename, '.');
+    if ($pos !== FALSE) {
+      $name = substr($basename, 0, $pos);
+      $ext = substr($basename, $pos);
+    }
+    else {
+      $name = $basename;
+      $ext = '';
+    }
+
+    $counter = 0;
+    do {
+      $destination = $directory . $separator . $name . '_' . $counter++ . $ext;
+    } while (file_exists($destination));
+  }
+
+  return $destination;
+}
+
+/**
+ * Deletes a file and its database record.
+ *
+ * If the $force parameter is not TRUE, file_usage_list() will be called to
+ * determine if the file is being used by any modules. If the file is being
+ * used the delete will be canceled.
+ *
+ * @param $file
+ *   A file object.
+ * @param $force
+ *   Boolean indicating that the file should be deleted even if the file is
+ *   reported as in use by the file_usage table.
+ *
+ * @return mixed
+ *   TRUE for success, FALSE in the event of an error, or an array if the file
+ *   is being used by any modules.
+ *
+ * @see file_unmanaged_delete()
+ * @see file_usage_list()
+ * @see file_usage_delete()
+ * @see hook_file_delete()
+ */
+function file_delete(stdClass $file, $force = FALSE) {
+  if (!file_valid_uri($file->uri)) {
+    if (($realpath = drupal_realpath($file->uri)) !== FALSE) {
+      watchdog('file', 'File %file (%realpath) could not be deleted because it is not a valid URI. This may be caused by improper use of file_delete() or a missing stream wrapper.', array('%file' => $file->uri, '%realpath' => $realpath));
+    }
+    else {
+      watchdog('file', 'File %file could not be deleted because it is not a valid URI. This may be caused by improper use of file_delete() or a missing stream wrapper.', array('%file' => $file->uri));
+    }
+    drupal_set_message(t('The specified file %file could not be deleted, because it is not a valid URI. More information is available in the system log.', array('%file' => $file->uri)), 'error');
+    return FALSE;
+  }
+
+  // If any module still has a usage entry in the file_usage table, the file
+  // will not be deleted, but file_delete() will return a populated array
+  // that tests as TRUE.
+  if (!$force && ($references = file_usage_list($file))) {
+    return $references;
+  }
+
+  // Let other modules clean up any references to the deleted file.
+  module_invoke_all('file_delete', $file);
+  module_invoke_all('entity_delete', $file, 'file');
+
+  // Make sure the file is deleted before removing its row from the
+  // database, so UIs can still find the file in the database.
+  if (file_unmanaged_delete($file->uri)) {
+    db_delete('file_managed')->condition('fid', $file->fid)->execute();
+    db_delete('file_usage')->condition('fid', $file->fid)->execute();
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
+ * Deletes a file without database changes or hook invocations.
+ *
+ * This function should be used when the file to be deleted does not have an
+ * entry recorded in the files table.
+ *
+ * @param $path
+ *   A string containing a file path or (streamwrapper) URI.
+ *
+ * @return
+ *   TRUE for success or path does not exist, or FALSE in the event of an
+ *   error.
+ *
+ * @see file_delete()
+ * @see file_unmanaged_delete_recursive()
+ */
+function file_unmanaged_delete($path) {
+  if (is_dir($path)) {
+    watchdog('file', '%path is a directory and cannot be removed using file_unmanaged_delete().', array('%path' => $path), WATCHDOG_ERROR);
+    return FALSE;
+  }
+  if (is_file($path)) {
+    return drupal_unlink($path);
+  }
+  // Return TRUE for non-existent file, but log that nothing was actually
+  // deleted, as the current state is the intended result.
+  if (!file_exists($path)) {
+    watchdog('file', 'The file %path was not deleted, because it does not exist.', array('%path' => $path), WATCHDOG_NOTICE);
+    return TRUE;
+  }
+  // We cannot handle anything other than files and directories. Log an error
+  // for everything else (sockets, symbolic links, etc).
+  watchdog('file', 'The file %path is not of a recognized type so it was not deleted.', array('%path' => $path), WATCHDOG_ERROR);
+  return FALSE;
+}
+
+/**
+ * Deletes all files and directories in the specified filepath recursively.
+ *
+ * If the specified path is a directory then the function will call itself
+ * recursively to process the contents. Once the contents have been removed the
+ * directory will also be removed.
+ *
+ * If the specified path is a file then it will be passed to
+ * file_unmanaged_delete().
+ *
+ * Note that this only deletes visible files with write permission.
+ *
+ * @param $path
+ *   A string containing either an URI or a file or directory path.
+ *
+ * @return
+ *   TRUE for success or if path does not exist, FALSE in the event of an
+ *   error.
+ *
+ * @see file_unmanaged_delete()
+ */
+function file_unmanaged_delete_recursive($path) {
+  if (is_dir($path)) {
+    $dir = dir($path);
+    while (($entry = $dir->read()) !== FALSE) {
+      if ($entry == '.' || $entry == '..') {
+        continue;
+      }
+      $entry_path = $path . '/' . $entry;
+      file_unmanaged_delete_recursive($entry_path);
+    }
+    $dir->close();
+
+    return drupal_rmdir($path);
+  }
+  return file_unmanaged_delete($path);
+}
+
+/**
+ * Determines total disk space used by a single user or the whole filesystem.
+ *
+ * @param $uid
+ *   Optional. A user id, specifying NULL returns the total space used by all
+ *   non-temporary files.
+ * @param $status
+ *   Optional. The file status to consider. The default is to only
+ *   consider files in status FILE_STATUS_PERMANENT.
+ *
+ * @return
+ *   An integer containing the number of bytes used.
+ */
+function file_space_used($uid = NULL, $status = FILE_STATUS_PERMANENT) {
+  $query = db_select('file_managed', 'f');
+  $query->condition('f.status', $status);
+  $query->addExpression('SUM(f.filesize)', 'filesize');
+  if (isset($uid)) {
+    $query->condition('f.uid', $uid);
+  }
+  return $query->execute()->fetchField();
+}
+
+/**
+ * Saves a file upload to a new location.
+ *
+ * The file will be added to the {file_managed} table as a temporary file.
+ * Temporary files are periodically cleaned. To make the file a permanent file,
+ * assign the status and use file_save() to save the changes.
+ *
+ * @param $source
+ *   A string specifying the filepath or URI of the uploaded file to save.
+ * @param $validators
+ *   An optional, associative array of callback functions used to validate the
+ *   file. See file_validate() for a full discussion of the array format.
+ *   If no extension validator is provided it will default to a limited safe
+ *   list of extensions which is as follows: "jpg jpeg gif png txt
+ *   doc xls pdf ppt pps odt ods odp". To allow all extensions you must
+ *   explicitly set the 'file_validate_extensions' validator to an empty array
+ *   (Beware: this is not safe and should only be allowed for trusted users, if
+ *   at all).
+ * @param $destination
+ *   A string containing the URI $source should be copied to.
+ *   This must be a stream wrapper URI. If this value is omitted, Drupal's
+ *   temporary files scheme will be used ("temporary://").
+ * @param $replace
+ *   Replace behavior when the destination file already exists:
+ *   - FILE_EXISTS_REPLACE: Replace the existing file.
+ *   - FILE_EXISTS_RENAME: Append _{incrementing number} until the filename is
+ *     unique.
+ *   - FILE_EXISTS_ERROR: Do nothing and return FALSE.
+ *
+ * @return
+ *   An object containing the file information if the upload succeeded, FALSE
+ *   in the event of an error, or NULL if no file was uploaded. The
+ *   documentation for the "File interface" group, which you can find under
+ *   Related topics, or the header at the top of this file, documents the
+ *   components of a file object. In addition to the standard components,
+ *   this function adds:
+ *   - source: Path to the file before it is moved.
+ *   - destination: Path to the file after it is moved (same as 'uri').
+ */
+function file_save_upload($source, $validators = array(), $destination = FALSE, $replace = FILE_EXISTS_RENAME) {
+  global $user;
+  static $upload_cache;
+
+  // Return cached objects without processing since the file will have
+  // already been processed and the paths in _FILES will be invalid.
+  if (isset($upload_cache[$source])) {
+    return $upload_cache[$source];
+  }
+
+  // Make sure there's an upload to process.
+  if (empty($_FILES['files']['name'][$source])) {
+    return NULL;
+  }
+
+  // Check for file upload errors and return FALSE if a lower level system
+  // error occurred. For a complete list of errors:
+  // See http://php.net/manual/features.file-upload.errors.php.
+  switch ($_FILES['files']['error'][$source]) {
+    case UPLOAD_ERR_INI_SIZE:
+    case UPLOAD_ERR_FORM_SIZE:
+      drupal_set_message(t('The file %file could not be saved, because it exceeds %maxsize, the maximum allowed size for uploads.', array('%file' => $_FILES['files']['name'][$source], '%maxsize' => format_size(file_upload_max_size()))), 'error');
+      return FALSE;
+
+    case UPLOAD_ERR_PARTIAL:
+    case UPLOAD_ERR_NO_FILE:
+      drupal_set_message(t('The file %file could not be saved, because the upload did not complete.', array('%file' => $_FILES['files']['name'][$source])), 'error');
+      return FALSE;
+
+    case UPLOAD_ERR_OK:
+      // Final check that this is a valid upload, if it isn't, use the
+      // default error handler.
+      if (is_uploaded_file($_FILES['files']['tmp_name'][$source])) {
+        break;
+      }
+
+    // Unknown error
+    default:
+      drupal_set_message(t('The file %file could not be saved. An unknown error has occurred.', array('%file' => $_FILES['files']['name'][$source])), 'error');
+      return FALSE;
+  }
+
+  // Begin building file object.
+  $file = new stdClass();
+  $file->uid      = $user->uid;
+  $file->status   = 0;
+  $file->filename = trim(drupal_basename($_FILES['files']['name'][$source]), '.');
+  $file->uri      = $_FILES['files']['tmp_name'][$source];
+  $file->filemime = file_get_mimetype($file->filename);
+  $file->filesize = $_FILES['files']['size'][$source];
+
+  $extensions = '';
+  if (isset($validators['file_validate_extensions'])) {
+    if (isset($validators['file_validate_extensions'][0])) {
+      // Build the list of non-munged extensions if the caller provided them.
+      $extensions = $validators['file_validate_extensions'][0];
+    }
+    else {
+      // If 'file_validate_extensions' is set and the list is empty then the
+      // caller wants to allow any extension. In this case we have to remove the
+      // validator or else it will reject all extensions.
+      unset($validators['file_validate_extensions']);
+    }
+  }
+  else {
+    // No validator was provided, so add one using the default list.
+    // Build a default non-munged safe list for file_munge_filename().
+    $extensions = 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp';
+    $validators['file_validate_extensions'] = array();
+    $validators['file_validate_extensions'][0] = $extensions;
+  }
+
+  if (!empty($extensions)) {
+    // Munge the filename to protect against possible malicious extension hiding
+    // within an unknown file type (ie: filename.html.foo).
+    $file->filename = file_munge_filename($file->filename, $extensions);
+  }
+
+  // Rename potentially executable files, to help prevent exploits (i.e. will
+  // rename filename.php.foo and filename.php to filename.php.foo.txt and
+  // filename.php.txt, respectively). Don't rename if 'allow_insecure_uploads'
+  // evaluates to TRUE.
+  if (!variable_get('allow_insecure_uploads', 0) && preg_match('/\.(php|pl|py|cgi|asp|js)(\.|$)/i', $file->filename) && (substr($file->filename, -4) != '.txt')) {
+    $file->filemime = 'text/plain';
+    $file->uri .= '.txt';
+    $file->filename .= '.txt';
+    // The .txt extension may not be in the allowed list of extensions. We have
+    // to add it here or else the file upload will fail.
+    if (!empty($extensions)) {
+      $validators['file_validate_extensions'][0] .= ' txt';
+      drupal_set_message(t('For security reasons, your upload has been renamed to %filename.', array('%filename' => $file->filename)));
+    }
+  }
+
+  // If the destination is not provided, use the temporary directory.
+  if (empty($destination)) {
+    $destination = 'temporary://';
+  }
+
+  // Assert that the destination contains a valid stream.
+  $destination_scheme = file_uri_scheme($destination);
+  if (!$destination_scheme || !file_stream_wrapper_valid_scheme($destination_scheme)) {
+    drupal_set_message(t('The file could not be uploaded, because the destination %destination is invalid.', array('%destination' => $destination)), 'error');
+    return FALSE;
+  }
+
+  $file->source = $source;
+  // A URI may already have a trailing slash or look like "public://".
+  if (substr($destination, -1) != '/') {
+    $destination .= '/';
+  }
+  $file->destination = file_destination($destination . $file->filename, $replace);
+  // If file_destination() returns FALSE then $replace == FILE_EXISTS_ERROR and
+  // there's an existing file so we need to bail.
+  if ($file->destination === FALSE) {
+    drupal_set_message(t('The file %source could not be uploaded because a file by that name already exists in the destination %directory.', array('%source' => $source, '%directory' => $destination)), 'error');
+    return FALSE;
+  }
+
+  // Add in our check of the the file name length.
+  $validators['file_validate_name_length'] = array();
+
+  // Call the validation functions specified by this function's caller.
+  $errors = file_validate($file, $validators);
+
+  // Check for errors.
+  if (!empty($errors)) {
+    $message = t('The specified file %name could not be uploaded.', array('%name' => $file->filename));
+    if (count($errors) > 1) {
+      $message .= theme('item_list', array('items' => $errors));
+    }
+    else {
+      $message .= ' ' . array_pop($errors);
+    }
+    form_set_error($source, $message);
+    return FALSE;
+  }
+
+  // Move uploaded files from PHP's upload_tmp_dir to Drupal's temporary
+  // directory. This overcomes open_basedir restrictions for future file
+  // operations.
+  $file->uri = $file->destination;
+  if (!drupal_move_uploaded_file($_FILES['files']['tmp_name'][$source], $file->uri)) {
+    form_set_error($source, t('File upload error. Could not move uploaded file.'));
+    watchdog('file', 'Upload error. Could not move uploaded file %file to destination %destination.', array('%file' => $file->filename, '%destination' => $file->uri));
+    return FALSE;
+  }
+
+  // Set the permissions on the new file.
+  drupal_chmod($file->uri);
+
+  // If we are replacing an existing file re-use its database record.
+  if ($replace == FILE_EXISTS_REPLACE) {
+    $existing_files = file_load_multiple(array(), array('uri' => $file->uri));
+    if (count($existing_files)) {
+      $existing = reset($existing_files);
+      $file->fid = $existing->fid;
+    }
+  }
+
+  // If we made it this far it's safe to record this file in the database.
+  if ($file = file_save($file)) {
+    // Add file to the cache.
+    $upload_cache[$source] = $file;
+    return $file;
+  }
+  return FALSE;
+}
+
+/**
+ * Moves an uploaded file to a new location.
+ *
+ * PHP's move_uploaded_file() does not properly support streams if safe_mode
+ * or open_basedir are enabled, so this function fills that gap.
+ *
+ * Compatibility: normal paths and stream wrappers.
+ *
+ * @param $filename
+ *   The filename of the uploaded file.
+ * @param $uri
+ *   A string containing the destination URI of the file.
+ *
+ * @return
+ *   TRUE on success, or FALSE on failure.
+ *
+ * @see move_uploaded_file()
+ * @see http://drupal.org/node/515192
+ * @ingroup php_wrappers
+ */
+function drupal_move_uploaded_file($filename, $uri) {
+  $result = @move_uploaded_file($filename, $uri);
+  // PHP's move_uploaded_file() does not properly support streams if safe_mode
+  // or open_basedir are enabled so if the move failed, try finding a real path
+  // and retry the move operation.
+  if (!$result) {
+    if ($realpath = drupal_realpath($uri)) {
+      $result = move_uploaded_file($filename, $realpath);
+    }
+    else {
+      $result = move_uploaded_file($filename, $uri);
+    }
+  }
+
+  return $result;
+}
+
+/**
+ * Checks that a file meets the criteria specified by the validators.
+ *
+ * After executing the validator callbacks specified hook_file_validate() will
+ * also be called to allow other modules to report errors about the file.
+ *
+ * @param $file
+ *   A Drupal file object.
+ * @param $validators
+ *   An optional, associative array of callback functions used to validate the
+ *   file. The keys are function names and the values arrays of callback
+ *   parameters which will be passed in after the file object. The
+ *   functions should return an array of error messages; an empty array
+ *   indicates that the file passed validation. The functions will be called in
+ *   the order specified.
+ *
+ * @return
+ *   An array containing validation error messages.
+ *
+ * @see hook_file_validate()
+ */
+function file_validate(stdClass &$file, $validators = array()) {
+  // Call the validation functions specified by this function's caller.
+  $errors = array();
+  foreach ($validators as $function => $args) {
+    if (function_exists($function)) {
+      array_unshift($args, $file);
+      $errors = array_merge($errors, call_user_func_array($function, $args));
+    }
+  }
+
+  // Let other modules perform validation on the new file.
+  return array_merge($errors, module_invoke_all('file_validate', $file));
+}
+
+/**
+ * Checks for files with names longer than we can store in the database.
+ *
+ * @param $file
+ *   A Drupal file object.
+ *
+ * @return
+ *   An array. If the file name is too long, it will contain an error message.
+ */
+function file_validate_name_length(stdClass $file) {
+  $errors = array();
+
+  if (empty($file->filename)) {
+    $errors[] = t("The file's name is empty. Please give a name to the file.");
+  }
+  if (strlen($file->filename) > 240) {
+    $errors[] = t("The file's name exceeds the 240 characters limit. Please rename the file and try again.");
+  }
+  return $errors;
+}
+
+/**
+ * Checks that the filename ends with an allowed extension.
+ *
+ * @param $file
+ *   A Drupal file object.
+ * @param $extensions
+ *   A string with a space separated list of allowed extensions.
+ *
+ * @return
+ *   An array. If the file extension is not allowed, it will contain an error
+ *   message.
+ *
+ * @see hook_file_validate()
+ */
+function file_validate_extensions(stdClass $file, $extensions) {
+  $errors = array();
+
+  $regex = '/\.(' . preg_replace('/ +/', '|', preg_quote($extensions)) . ')$/i';
+  if (!preg_match($regex, $file->filename)) {
+    $errors[] = t('Only files with the following extensions are allowed: %files-allowed.', array('%files-allowed' => $extensions));
+  }
+  return $errors;
+}
+
+/**
+ * Checks that the file's size is below certain limits.
+ *
+ * This check is not enforced for the user #1.
+ *
+ * @param $file
+ *   A Drupal file object.
+ * @param $file_limit
+ *   An integer specifying the maximum file size in bytes. Zero indicates that
+ *   no limit should be enforced.
+ * @param $user_limit
+ *   An integer specifying the maximum number of bytes the user is allowed.
+ *   Zero indicates that no limit should be enforced.
+ *
+ * @return
+ *   An array. If the file size exceeds limits, it will contain an error
+ *   message.
+ *
+ * @see hook_file_validate()
+ */
+function file_validate_size(stdClass $file, $file_limit = 0, $user_limit = 0) {
+  global $user;
+
+  $errors = array();
+
+  // Bypass validation for uid  = 1.
+  if ($user->uid != 1) {
+    if ($file_limit && $file->filesize > $file_limit) {
+      $errors[] = t('The file is %filesize exceeding the maximum file size of %maxsize.', array('%filesize' => format_size($file->filesize), '%maxsize' => format_size($file_limit)));
+    }
+
+    // Save a query by only calling file_space_used() when a limit is provided.
+    if ($user_limit && (file_space_used($user->uid) + $file->filesize) > $user_limit) {
+      $errors[] = t('The file is %filesize which would exceed your disk quota of %quota.', array('%filesize' => format_size($file->filesize), '%quota' => format_size($user_limit)));
+    }
+  }
+  return $errors;
+}
+
+/**
+ * Checks that the file is recognized by image_get_info() as an image.
+ *
+ * @param $file
+ *   A Drupal file object.
+ *
+ * @return
+ *   An array. If the file is not an image, it will contain an error message.
+ *
+ * @see hook_file_validate()
+ */
+function file_validate_is_image(stdClass $file) {
+  $errors = array();
+
+  $info = image_get_info($file->uri);
+  if (!$info || empty($info['extension'])) {
+    $errors[] = t('Only JPEG, PNG and GIF images are allowed.');
+  }
+
+  return $errors;
+}
+
+/**
+ * Verifies that image dimensions are within the specified maximum and minimum.
+ *
+ * Non-image files will be ignored. If a image toolkit is available the image
+ * will be scaled to fit within the desired maximum dimensions.
+ *
+ * @param $file
+ *   A Drupal file object. This function may resize the file affecting its
+ *   size.
+ * @param $maximum_dimensions
+ *   An optional string in the form WIDTHxHEIGHT e.g. '640x480' or '85x85'. If
+ *   an image toolkit is installed the image will be resized down to these
+ *   dimensions. A value of 0 indicates no restriction on size, so resizing
+ *   will be attempted.
+ * @param $minimum_dimensions
+ *   An optional string in the form WIDTHxHEIGHT. This will check that the
+ *   image meets a minimum size. A value of 0 indicates no restriction.
+ *
+ * @return
+ *   An array. If the file is an image and did not meet the requirements, it
+ *   will contain an error message.
+ *
+ * @see hook_file_validate()
+ */
+function file_validate_image_resolution(stdClass $file, $maximum_dimensions = 0, $minimum_dimensions = 0) {
+  $errors = array();
+
+  // Check first that the file is an image.
+  if ($info = image_get_info($file->uri)) {
+    if ($maximum_dimensions) {
+      // Check that it is smaller than the given dimensions.
+      list($width, $height) = explode('x', $maximum_dimensions);
+      if ($info['width'] > $width || $info['height'] > $height) {
+        // Try to resize the image to fit the dimensions.
+        if ($image = image_load($file->uri)) {
+          image_scale($image, $width, $height);
+          image_save($image);
+          $file->filesize = $image->info['file_size'];
+          drupal_set_message(t('The image was resized to fit within the maximum allowed dimensions of %dimensions pixels.', array('%dimensions' => $maximum_dimensions)));
+        }
+        else {
+          $errors[] = t('The image is too large; the maximum dimensions are %dimensions pixels.', array('%dimensions' => $maximum_dimensions));
+        }
+      }
+    }
+
+    if ($minimum_dimensions) {
+      // Check that it is larger than the given dimensions.
+      list($width, $height) = explode('x', $minimum_dimensions);
+      if ($info['width'] < $width || $info['height'] < $height) {
+        $errors[] = t('The image is too small; the minimum dimensions are %dimensions pixels.', array('%dimensions' => $minimum_dimensions));
+      }
+    }
+  }
+
+  return $errors;
+}
+
+/**
+ * Saves a file to the specified destination and creates a database entry.
+ *
+ * @param $data
+ *   A string containing the contents of the file.
+ * @param $destination
+ *   A string containing the destination URI. This must be a stream wrapper URI.
+ *   If no value is provided, a randomized name will be generated and the file
+ *   will be saved using Drupal's default files scheme, usually "public://".
+ * @param $replace
+ *   Replace behavior when the destination file already exists:
+ *   - FILE_EXISTS_REPLACE - Replace the existing file. If a managed file with
+ *       the destination name exists then its database entry will be updated. If
+ *       no database entry is found then a new one will be created.
+ *   - FILE_EXISTS_RENAME - Append _{incrementing number} until the filename is
+ *       unique.
+ *   - FILE_EXISTS_ERROR - Do nothing and return FALSE.
+ *
+ * @return
+ *   A file object, or FALSE on error.
+ *
+ * @see file_unmanaged_save_data()
+ */
+function file_save_data($data, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
+  global $user;
+
+  if (empty($destination)) {
+    $destination = file_default_scheme() . '://';
+  }
+  if (!file_valid_uri($destination)) {
+    watchdog('file', 'The data could not be saved because the destination %destination is invalid. This may be caused by improper use of file_save_data() or a missing stream wrapper.', array('%destination' => $destination));
+    drupal_set_message(t('The data could not be saved, because the destination is invalid. More information is available in the system log.'), 'error');
+    return FALSE;
+  }
+
+  if ($uri = file_unmanaged_save_data($data, $destination, $replace)) {
+    // Create a file object.
+    $file = new stdClass();
+    $file->fid = NULL;
+    $file->uri = $uri;
+    $file->filename = drupal_basename($uri);
+    $file->filemime = file_get_mimetype($file->uri);
+    $file->uid      = $user->uid;
+    $file->status   = FILE_STATUS_PERMANENT;
+    // If we are replacing an existing file re-use its database record.
+    if ($replace == FILE_EXISTS_REPLACE) {
+      $existing_files = file_load_multiple(array(), array('uri' => $uri));
+      if (count($existing_files)) {
+        $existing = reset($existing_files);
+        $file->fid = $existing->fid;
+        $file->filename = $existing->filename;
+      }
+    }
+    // If we are renaming around an existing file (rather than a directory),
+    // use its basename for the filename.
+    elseif ($replace == FILE_EXISTS_RENAME && is_file($destination)) {
+      $file->filename = drupal_basename($destination);
+    }
+
+    return file_save($file);
+  }
+  return FALSE;
+}
+
+/**
+ * Saves a string to the specified destination without invoking file API.
+ *
+ * This function is identical to file_save_data() except the file will not be
+ * saved to the {file_managed} table and none of the file_* hooks will be
+ * called.
+ *
+ * @param $data
+ *   A string containing the contents of the file.
+ * @param $destination
+ *   A string containing the destination location. This must be a stream wrapper
+ *   URI. If no value is provided, a randomized name will be generated and the
+ *   file will be saved using Drupal's default files scheme, usually
+ *   "public://".
+ * @param $replace
+ *   Replace behavior when the destination file already exists:
+ *   - FILE_EXISTS_REPLACE - Replace the existing file.
+ *   - FILE_EXISTS_RENAME - Append _{incrementing number} until the filename is
+ *                          unique.
+ *   - FILE_EXISTS_ERROR - Do nothing and return FALSE.
+ *
+ * @return
+ *   A string with the path of the resulting file, or FALSE on error.
+ *
+ * @see file_save_data()
+ */
+function file_unmanaged_save_data($data, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
+  // Write the data to a temporary file.
+  $temp_name = drupal_tempnam('temporary://', 'file');
+  if (file_put_contents($temp_name, $data) === FALSE) {
+    drupal_set_message(t('The file could not be created.'), 'error');
+    return FALSE;
+  }
+
+  // Move the file to its final destination.
+  return file_unmanaged_move($temp_name, $destination, $replace);
+}
+
+/**
+ * Transfers a file to the client using HTTP.
+ *
+ * Pipes a file through Drupal to the client.
+ *
+ * @param $uri
+ *   String specifying the file URI to transfer.
+ * @param $headers
+ *   An array of HTTP headers to send along with file.
+ */
+function file_transfer($uri, $headers) {
+  if (ob_get_level()) {
+    ob_end_clean();
+  }
+
+  foreach ($headers as $name => $value) {
+    drupal_add_http_header($name, $value);
+  }
+  drupal_send_headers();
+  $scheme = file_uri_scheme($uri);
+  // Transfer file in 1024 byte chunks to save memory usage.
+  if ($scheme && file_stream_wrapper_valid_scheme($scheme) && $fd = fopen($uri, 'rb')) {
+    while (!feof($fd)) {
+      print fread($fd, 1024);
+    }
+    fclose($fd);
+  }
+  else {
+    drupal_not_found();
+  }
+  drupal_exit();
+}
+
+/**
+ * Menu handler for private file transfers.
+ *
+ * Call modules that implement hook_file_download() to find out if a file is
+ * accessible and what headers it should be transferred with. If one or more
+ * modules returned headers the download will start with the returned headers.
+ * If a module returns -1 drupal_access_denied() will be returned. If the file
+ * exists but no modules responded drupal_access_denied() will be returned.
+ * If the file does not exist drupal_not_found() will be returned.
+ *
+ * @see system_menu()
+ */
+function file_download() {
+  // Merge remainder of arguments from GET['q'], into relative file path.
+  $args = func_get_args();
+  $scheme = array_shift($args);
+  $target = implode('/', $args);
+  $uri = $scheme . '://' . $target;
+  if (file_stream_wrapper_valid_scheme($scheme) && file_exists($uri)) {
+    // Let other modules provide headers and controls access to the file.
+    // module_invoke_all() uses array_merge_recursive() which merges header
+    // values into a new array. To avoid that and allow modules to override
+    // headers instead, use array_merge() to merge the returned arrays.
+    $headers = array();
+    foreach (module_implements('file_download') as $module) {
+      $function = $module . '_file_download';
+      $result = $function($uri);
+      if ($result == -1) {
+        // Throw away the headers received so far.
+        $headers = array();
+        break;
+      }
+      if (isset($result) && is_array($result)) {
+        $headers = array_merge($headers, $result);
+      }
+    }
+    if (count($headers)) {
+      file_transfer($uri, $headers);
+    }
+    drupal_access_denied();
+  }
+  else {
+    drupal_not_found();
+  }
+  drupal_exit();
+}
+
+
+/**
+ * Finds all files that match a given mask in a given directory.
+ *
+ * Directories and files beginning with a period are excluded; this
+ * prevents hidden files and directories (such as SVN working directories)
+ * from being scanned.
+ *
+ * @param $dir
+ *   The base directory or URI to scan, without trailing slash.
+ * @param $mask
+ *   The preg_match() regular expression of the files to find.
+ * @param $options
+ *   An associative array of additional options, with the following elements:
+ *   - 'nomask': The preg_match() regular expression of the files to ignore.
+ *     Defaults to '/(\.\.?|CVS)$/'.
+ *   - 'callback': The callback function to call for each match. There is no
+ *     default callback.
+ *   - 'recurse': When TRUE, the directory scan will recurse the entire tree
+ *     starting at the provided directory. Defaults to TRUE.
+ *   - 'key': The key to be used for the returned associative array of files.
+ *     Possible values are 'uri', for the file's URI; 'filename', for the
+ *     basename of the file; and 'name' for the name of the file without the
+ *     extension. Defaults to 'uri'.
+ *   - 'min_depth': Minimum depth of directories to return files from. Defaults
+ *     to 0.
+ * @param $depth
+ *   Current depth of recursion. This parameter is only used internally and
+ *   should not be passed in.
+ *
+ * @return
+ *   An associative array (keyed on the chosen key) of objects with 'uri',
+ *   'filename', and 'name' members corresponding to the matching files.
+ */
+function file_scan_directory($dir, $mask, $options = array(), $depth = 0) {
+  // Merge in defaults.
+  $options += array(
+    'nomask' => '/(\.\.?|CVS)$/',
+    'callback' => 0,
+    'recurse' => TRUE,
+    'key' => 'uri',
+    'min_depth' => 0,
+  );
+
+  $options['key'] = in_array($options['key'], array('uri', 'filename', 'name')) ? $options['key'] : 'uri';
+  $files = array();
+  if (is_dir($dir) && $handle = opendir($dir)) {
+    while (FALSE !== ($filename = readdir($handle))) {
+      if (!preg_match($options['nomask'], $filename) && $filename[0] != '.') {
+        $uri = "$dir/$filename";
+        $uri = file_stream_wrapper_uri_normalize($uri);
+        if (is_dir($uri) && $options['recurse']) {
+          // Give priority to files in this folder by merging them in after any subdirectory files.
+          $files = array_merge(file_scan_directory($uri, $mask, $options, $depth + 1), $files);
+        }
+        elseif ($depth >= $options['min_depth'] && preg_match($mask, $filename)) {
+          // Always use this match over anything already set in $files with the
+          // same $$options['key'].
+          $file = new stdClass();
+          $file->uri = $uri;
+          $file->filename = $filename;
+          $file->name = pathinfo($filename, PATHINFO_FILENAME);
+          $key = $options['key'];
+          $files[$file->$key] = $file;
+          if ($options['callback']) {
+            $options['callback']($uri);
+          }
+        }
+      }
+    }
+
+    closedir($handle);
+  }
+
+  return $files;
+}
+
+/**
+ * Determines the maximum file upload size by querying the PHP settings.
+ *
+ * @return
+ *   A file size limit in bytes based on the PHP upload_max_filesize and
+ *   post_max_size
+ */
+function file_upload_max_size() {
+  static $max_size = -1;
+
+  if ($max_size < 0) {
+    // Start with post_max_size.
+    $max_size = parse_size(ini_get('post_max_size'));
+
+    // If upload_max_size is less, then reduce. Except if upload_max_size is
+    // zero, which indicates no limit.
+    $upload_max = parse_size(ini_get('upload_max_filesize'));
+    if ($upload_max > 0 && $upload_max < $max_size) {
+      $max_size = $upload_max;
+    }
+  }
+  return $max_size;
+}
+
+/**
+ * Determines an Internet Media Type or MIME type from a filename.
+ *
+ * @param $uri
+ *   A string containing the URI, path, or filename.
+ * @param $mapping
+ *   An optional map of extensions to their mimetypes, in the form:
+ *    - 'mimetypes': a list of mimetypes, keyed by an identifier,
+ *    - 'extensions': the mapping itself, an associative array in which
+ *      the key is the extension (lowercase) and the value is the mimetype
+ *      identifier. If $mapping is NULL file_mimetype_mapping() is called.
+ *
+ * @return
+ *   The internet media type registered for the extension or
+ *   application/octet-stream for unknown extensions.
+ *
+ * @see file_default_mimetype_mapping()
+ */
+function file_get_mimetype($uri, $mapping = NULL) {
+  if ($wrapper = file_stream_wrapper_get_instance_by_uri($uri)) {
+    return $wrapper->getMimeType($uri, $mapping);
+  }
+  else {
+    // getMimeType() is not implementation specific, so we can directly
+    // call it without an instance.
+    return DrupalLocalStreamWrapper::getMimeType($uri, $mapping);
+  }
+}
+
+/**
+ * Sets the permissions on a file or directory.
+ *
+ * This function will use the 'file_chmod_directory' and 'file_chmod_file'
+ * variables for the default modes for directories and uploaded/generated
+ * files. By default these will give everyone read access so that users
+ * accessing the files with a user account without the webserver group (e.g.
+ * via FTP) can read these files, and give group write permissions so webserver
+ * group members (e.g. a vhost account) can alter files uploaded and owned by
+ * the webserver.
+ *
+ * PHP's chmod does not support stream wrappers so we use our wrapper
+ * implementation which interfaces with chmod() by default. Contrib wrappers
+ * may override this behavior in their implementations as needed.
+ *
+ * @param $uri
+ *   A string containing a URI file, or directory path.
+ * @param $mode
+ *   Integer value for the permissions. Consult PHP chmod() documentation for
+ *   more information.
+ *
+ * @return
+ *   TRUE for success, FALSE in the event of an error.
+ *
+ * @ingroup php_wrappers
+ */
+function drupal_chmod($uri, $mode = NULL) {
+  if (!isset($mode)) {
+    if (is_dir($uri)) {
+      $mode = variable_get('file_chmod_directory', 0775);
+    }
+    else {
+      $mode = variable_get('file_chmod_file', 0664);
+    }
+  }
+
+  // If this URI is a stream, pass it off to the appropriate stream wrapper.
+  // Otherwise, attempt PHP's chmod. This allows use of drupal_chmod even
+  // for unmanaged files outside of the stream wrapper interface.
+  if ($wrapper = file_stream_wrapper_get_instance_by_uri($uri)) {
+    if ($wrapper->chmod($mode)) {
+      return TRUE;
+    }
+  }
+  else {
+    if (@chmod($uri, $mode)) {
+      return TRUE;
+    }
+  }
+
+  watchdog('file', 'The file permissions could not be set on %uri.', array('%uri' => $uri), WATCHDOG_ERROR);
+  return FALSE;
+}
+
+/**
+ * Deletes a file.
+ *
+ * PHP's unlink() is broken on Windows, as it can fail to remove a file
+ * when it has a read-only flag set.
+ *
+ * @param $uri
+ *   A URI or pathname.
+ * @param $context
+ *   Refer to http://php.net/manual/ref.stream.php
+ *
+ * @return
+ *   Boolean TRUE on success, or FALSE on failure.
+ *
+ * @see unlink()
+ * @ingroup php_wrappers
+ */
+function drupal_unlink($uri, $context = NULL) {
+  $scheme = file_uri_scheme($uri);
+  if ((!$scheme || !file_stream_wrapper_valid_scheme($scheme)) && (substr(PHP_OS, 0, 3) == 'WIN')) {
+    chmod($uri, 0600);
+  }
+  if ($context) {
+    return unlink($uri, $context);
+  }
+  else {
+    return unlink($uri);
+  }
+}
+
+/**
+ * Resolves the absolute filepath of a local URI or filepath.
+ *
+ * The use of drupal_realpath() is discouraged, because it does not work for
+ * remote URIs. Except in rare cases, URIs should not be manually resolved.
+ *
+ * Only use this function if you know that the stream wrapper in the URI uses
+ * the local file system, and you need to pass an absolute path to a function
+ * that is incompatible with stream URIs.
+ *
+ * @param string $uri
+ *   A stream wrapper URI or a filepath, possibly including one or more symbolic
+ *   links.
+ *
+ * @return string|false
+ *   The absolute local filepath (with no symbolic links), or FALSE on failure.
+ *
+ * @see DrupalStreamWrapperInterface::realpath()
+ * @see http://php.net/manual/function.realpath.php
+ * @ingroup php_wrappers
+ */
+function drupal_realpath($uri) {
+  // If this URI is a stream, pass it off to the appropriate stream wrapper.
+  // Otherwise, attempt PHP's realpath. This allows use of drupal_realpath even
+  // for unmanaged files outside of the stream wrapper interface.
+  if ($wrapper = file_stream_wrapper_get_instance_by_uri($uri)) {
+    return $wrapper->realpath();
+  }
+  // Check that the URI has a value. There is a bug in PHP 5.2 on *BSD systems
+  // that makes realpath not return FALSE as expected when passing an empty
+  // variable.
+  // @todo Remove when Drupal drops support for PHP 5.2.
+  elseif (!empty($uri)) {
+    return realpath($uri);
+  }
+  return FALSE;
+}
+
+/**
+ * Gets the name of the directory from a given path.
+ *
+ * PHP's dirname() does not properly pass streams, so this function fills
+ * that gap. It is backwards compatible with normal paths and will use
+ * PHP's dirname() as a fallback.
+ *
+ * Compatibility: normal paths and stream wrappers.
+ *
+ * @param $uri
+ *   A URI or path.
+ *
+ * @return
+ *   A string containing the directory name.
+ *
+ * @see dirname()
+ * @see http://drupal.org/node/515192
+ * @ingroup php_wrappers
+ */
+function drupal_dirname($uri) {
+  $scheme = file_uri_scheme($uri);
+
+  if ($scheme && file_stream_wrapper_valid_scheme($scheme)) {
+    return file_stream_wrapper_get_instance_by_scheme($scheme)->dirname($uri);
+  }
+  else {
+    return dirname($uri);
+  }
+}
+
+/**
+ * Gets the filename from a given path.
+ *
+ * PHP's basename() does not properly support streams or filenames beginning
+ * with a non-US-ASCII character.
+ *
+ * @see http://bugs.php.net/bug.php?id=37738
+ * @see basename()
+ *
+ * @ingroup php_wrappers
+ */
+function drupal_basename($uri, $suffix = NULL) {
+  $separators = '/';
+  if (DIRECTORY_SEPARATOR != '/') {
+    // For Windows OS add special separator.
+    $separators .= DIRECTORY_SEPARATOR;
+  }
+  // Remove right-most slashes when $uri points to directory.
+  $uri = rtrim($uri, $separators);
+  // Returns the trailing part of the $uri starting after one of the directory
+  // separators.
+  $filename = preg_match('@[^' . preg_quote($separators, '@') . ']+$@', $uri, $matches) ? $matches[0] : '';
+  // Cuts off a suffix from the filename.
+  if ($suffix) {
+    $filename = preg_replace('@' . preg_quote($suffix, '@') . '$@', '', $filename);
+  }
+  return $filename;
+}
+
+/**
+ * Creates a directory using Drupal's default mode.
+ *
+ * PHP's mkdir() does not respect Drupal's default permissions mode. If a mode
+ * is not provided, this function will make sure that Drupal's is used.
+ *
+ * Compatibility: normal paths and stream wrappers.
+ *
+ * @param $uri
+ *   A URI or pathname.
+ * @param $mode
+ *   By default the Drupal mode is used.
+ * @param $recursive
+ *   Default to FALSE.
+ * @param $context
+ *   Refer to http://php.net/manual/ref.stream.php
+ *
+ * @return
+ *   Boolean TRUE on success, or FALSE on failure.
+ *
+ * @see mkdir()
+ * @see http://drupal.org/node/515192
+ * @ingroup php_wrappers
+ */
+function drupal_mkdir($uri, $mode = NULL, $recursive = FALSE, $context = NULL) {
+  if (!isset($mode)) {
+    $mode = variable_get('file_chmod_directory', 0775);
+  }
+
+  if (!isset($context)) {
+    return mkdir($uri, $mode, $recursive);
+  }
+  else {
+    return mkdir($uri, $mode, $recursive, $context);
+  }
+}
+
+/**
+ * Removes a directory.
+ *
+ * PHP's rmdir() is broken on Windows, as it can fail to remove a directory
+ * when it has a read-only flag set.
+ *
+ * @param $uri
+ *   A URI or pathname.
+ * @param $context
+ *   Refer to http://php.net/manual/ref.stream.php
+ *
+ * @return
+ *   Boolean TRUE on success, or FALSE on failure.
+ *
+ * @see rmdir()
+ * @ingroup php_wrappers
+ */
+function drupal_rmdir($uri, $context = NULL) {
+  $scheme = file_uri_scheme($uri);
+  if ((!$scheme || !file_stream_wrapper_valid_scheme($scheme)) && (substr(PHP_OS, 0, 3) == 'WIN')) {
+    chmod($uri, 0700);
+  }
+  if ($context) {
+    return rmdir($uri, $context);
+  }
+  else {
+    return rmdir($uri);
+  }
+}
+
+/**
+ * Creates a file with a unique filename in the specified directory.
+ *
+ * PHP's tempnam() does not return a URI like we want. This function
+ * will return a URI if given a URI, or it will return a filepath if
+ * given a filepath.
+ *
+ * Compatibility: normal paths and stream wrappers.
+ *
+ * @param $directory
+ *   The directory where the temporary filename will be created.
+ * @param $prefix
+ *   The prefix of the generated temporary filename.
+ *   Note: Windows uses only the first three characters of prefix.
+ *
+ * @return
+ *   The new temporary filename, or FALSE on failure.
+ *
+ * @see tempnam()
+ * @see http://drupal.org/node/515192
+ * @ingroup php_wrappers
+ */
+function drupal_tempnam($directory, $prefix) {
+  $scheme = file_uri_scheme($directory);
+
+  if ($scheme && file_stream_wrapper_valid_scheme($scheme)) {
+    $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme);
+
+    if ($filename = tempnam($wrapper->getDirectoryPath(), $prefix)) {
+      return $scheme . '://' . drupal_basename($filename);
+    }
+    else {
+      return FALSE;
+    }
+  }
+  else {
+    // Handle as a normal tempnam() call.
+    return tempnam($directory, $prefix);
+  }
+}
+
+/**
+ * Gets the path of system-appropriate temporary directory.
+ */
+function file_directory_temp() {
+  $temporary_directory = variable_get('file_temporary_path', NULL);
+
+  if (empty($temporary_directory)) {
+    $directories = array();
+
+    // Has PHP been set with an upload_tmp_dir?
+    if (ini_get('upload_tmp_dir')) {
+      $directories[] = ini_get('upload_tmp_dir');
+    }
+
+    // Operating system specific dirs.
+    if (substr(PHP_OS, 0, 3) == 'WIN') {
+      $directories[] = 'c:\\windows\\temp';
+      $directories[] = 'c:\\winnt\\temp';
+    }
+    else {
+      $directories[] = '/tmp';
+    }
+    // PHP may be able to find an alternative tmp directory.
+    // This function exists in PHP 5 >= 5.2.1, but Drupal
+    // requires PHP 5 >= 5.2.0, so we check for it.
+    if (function_exists('sys_get_temp_dir')) {
+      $directories[] = sys_get_temp_dir();
+    }
+
+    foreach ($directories as $directory) {
+      if (is_dir($directory) && is_writable($directory)) {
+        $temporary_directory = $directory;
+        break;
+      }
+    }
+
+    if (empty($temporary_directory)) {
+      // If no directory has been found default to 'files/tmp'.
+      $temporary_directory = variable_get('file_public_path', conf_path() . '/files') . '/tmp';
+
+      // Windows accepts paths with either slash (/) or backslash (\), but will
+      // not accept a path which contains both a slash and a backslash. Since
+      // the 'file_public_path' variable may have either format, we sanitize
+      // everything to use slash which is supported on all platforms.
+      $temporary_directory = str_replace('\\', '/', $temporary_directory);
+    }
+    // Save the path of the discovered directory.
+    variable_set('file_temporary_path', $temporary_directory);
+  }
+
+  return $temporary_directory;
+}
+
+/**
+ * Examines a file object and returns appropriate content headers for download.
+ *
+ * @param $file
+ *   A file object.
+ *
+ * @return
+ *   An associative array of headers, as expected by file_transfer().
+ */
+function file_get_content_headers($file) {
+  $name = mime_header_encode($file->filename);
+  $type = mime_header_encode($file->filemime);
+
+  return array(
+    'Content-Type' => $type,
+    'Content-Length' => $file->filesize,
+    'Cache-Control' => 'private',
+  );
+}
+
+/**
+ * @} End of "defgroup file".
+ */
diff --git a/htmltest/includes/file.mimetypes.inc b/htmltest/includes/file.mimetypes.inc
new file mode 100644
index 00000000..7468a60a
--- /dev/null
+++ b/htmltest/includes/file.mimetypes.inc
@@ -0,0 +1,859 @@
+<?php
+
+/**
+ * @file
+ * Provides mimetype mappings.
+ */
+
+/**
+ * Return an array of MIME extension mappings.
+ *
+ * Returns the mapping after modules have altered the default mapping.
+ *
+ * @return
+ *   Array of mimetypes correlated to the extensions that relate to them.
+ *
+ * @see file_get_mimetype()
+ */
+function file_mimetype_mapping() {
+  $mapping = &drupal_static(__FUNCTION__);
+  if (!isset($mapping)) {
+    $mapping = file_default_mimetype_mapping();
+    // Allow modules to alter the default mapping.
+    drupal_alter('file_mimetype_mapping', $mapping);
+  }
+  return $mapping;
+}
+
+/**
+ * Default MIME extension mapping.
+ *
+ * @return
+ *   Array of mimetypes correlated to the extensions that relate to them.
+ *
+ * @see file_get_mimetype()
+ */
+function file_default_mimetype_mapping() {
+  return array(
+    'mimetypes' => array(
+      0 => 'application/andrew-inset',
+      1 => 'application/atom',
+      2 => 'application/atomcat+xml',
+      3 => 'application/atomserv+xml',
+      4 => 'application/cap',
+      5 => 'application/cu-seeme',
+      6 => 'application/dsptype',
+      7 => 'application/hta',
+      8 => 'application/java-archive',
+      9 => 'application/java-serialized-object',
+      10 => 'application/java-vm',
+      11 => 'application/mac-binhex40',
+      12 => 'application/mathematica',
+      13 => 'application/msaccess',
+      14 => 'application/msword',
+      15 => 'application/octet-stream',
+      16 => 'application/oda',
+      17 => 'application/ogg',
+      18 => 'application/pdf',
+      19 => 'application/pgp-keys',
+      20 => 'application/pgp-signature',
+      21 => 'application/pics-rules',
+      22 => 'application/postscript',
+      23 => 'application/rar',
+      24 => 'application/rdf+xml',
+      25 => 'application/rss+xml',
+      26 => 'application/rtf',
+      27 => 'application/smil',
+      28 => 'application/vnd.cinderella',
+      29 => 'application/vnd.google-earth.kml+xml',
+      30 => 'application/vnd.google-earth.kmz',
+      31 => 'application/vnd.mozilla.xul+xml',
+      32 => 'application/vnd.ms-excel',
+      33 => 'application/vnd.ms-excel.addin.macroEnabled.12',
+      34 => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
+      35 => 'application/vnd.ms-excel.sheet.macroEnabled.12',
+      36 => 'application/vnd.ms-excel.template.macroEnabled.12',
+      37 => 'application/vnd.ms-pki.seccat',
+      38 => 'application/vnd.ms-pki.stl',
+      39 => 'application/vnd.ms-powerpoint',
+      40 => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
+      41 => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
+      42 => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
+      43 => 'application/vnd.ms-powerpoint.template.macroEnabled.12',
+      44 => 'application/vnd.ms-word.document.macroEnabled.12',
+      45 => 'application/vnd.ms-word.template.macroEnabled.12',
+      46 => 'application/vnd.ms-xpsdocument',
+      47 => 'application/vnd.oasis.opendocument.chart',
+      48 => 'application/vnd.oasis.opendocument.database',
+      49 => 'application/vnd.oasis.opendocument.formula',
+      50 => 'application/vnd.oasis.opendocument.graphics',
+      51 => 'application/vnd.oasis.opendocument.graphics-template',
+      52 => 'application/vnd.oasis.opendocument.image',
+      53 => 'application/vnd.oasis.opendocument.presentation',
+      54 => 'application/vnd.oasis.opendocument.presentation-template',
+      55 => 'application/vnd.oasis.opendocument.spreadsheet',
+      56 => 'application/vnd.oasis.opendocument.spreadsheet-template',
+      57 => 'application/vnd.oasis.opendocument.text',
+      58 => 'application/vnd.oasis.opendocument.text-master',
+      59 => 'application/vnd.oasis.opendocument.text-template',
+      60 => 'application/vnd.oasis.opendocument.text-web',
+      61 => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+      62 => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
+      63 => 'application/vnd.openxmlformats-officedocument.presentationml.template',
+      64 => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+      65 => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
+      66 => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+      67 => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
+      68 => 'application/vnd.rim.cod',
+      69 => 'application/vnd.smaf',
+      70 => 'application/vnd.stardivision.calc',
+      71 => 'application/vnd.stardivision.chart',
+      72 => 'application/vnd.stardivision.draw',
+      73 => 'application/vnd.stardivision.impress',
+      74 => 'application/vnd.stardivision.math',
+      75 => 'application/vnd.stardivision.writer',
+      76 => 'application/vnd.stardivision.writer-global',
+      77 => 'application/vnd.sun.xml.calc',
+      78 => 'application/vnd.sun.xml.calc.template',
+      79 => 'application/vnd.sun.xml.draw',
+      80 => 'application/vnd.sun.xml.draw.template',
+      81 => 'application/vnd.sun.xml.impress',
+      82 => 'application/vnd.sun.xml.impress.template',
+      83 => 'application/vnd.sun.xml.math',
+      84 => 'application/vnd.sun.xml.writer',
+      85 => 'application/vnd.sun.xml.writer.global',
+      86 => 'application/vnd.sun.xml.writer.template',
+      87 => 'application/vnd.symbian.install',
+      88 => 'application/vnd.visio',
+      89 => 'application/vnd.wap.wbxml',
+      90 => 'application/vnd.wap.wmlc',
+      91 => 'application/vnd.wap.wmlscriptc',
+      92 => 'application/wordperfect',
+      93 => 'application/wordperfect5.1',
+      94 => 'application/x-123',
+      95 => 'application/x-7z-compressed',
+      96 => 'application/x-abiword',
+      97 => 'application/x-apple-diskimage',
+      98 => 'application/x-bcpio',
+      99 => 'application/x-bittorrent',
+      100 => 'application/x-cab',
+      101 => 'application/x-cbr',
+      102 => 'application/x-cbz',
+      103 => 'application/x-cdf',
+      104 => 'application/x-cdlink',
+      105 => 'application/x-chess-pgn',
+      106 => 'application/x-cpio',
+      107 => 'application/x-debian-package',
+      108 => 'application/x-director',
+      109 => 'application/x-dms',
+      110 => 'application/x-doom',
+      111 => 'application/x-dvi',
+      112 => 'application/x-flac',
+      113 => 'application/x-font',
+      114 => 'application/x-freemind',
+      115 => 'application/x-futuresplash',
+      116 => 'application/x-gnumeric',
+      117 => 'application/x-go-sgf',
+      118 => 'application/x-graphing-calculator',
+      119 => 'application/x-gtar',
+      120 => 'application/x-hdf',
+      121 => 'application/x-httpd-eruby',
+      122 => 'application/x-httpd-php',
+      123 => 'application/x-httpd-php-source',
+      124 => 'application/x-httpd-php3',
+      125 => 'application/x-httpd-php3-preprocessed',
+      126 => 'application/x-httpd-php4',
+      127 => 'application/x-ica',
+      128 => 'application/x-internet-signup',
+      129 => 'application/x-iphone',
+      130 => 'application/x-iso9660-image',
+      131 => 'application/x-java-jnlp-file',
+      132 => 'application/x-javascript',
+      133 => 'application/x-jmol',
+      134 => 'application/x-kchart',
+      135 => 'application/x-killustrator',
+      136 => 'application/x-koan',
+      137 => 'application/x-kpresenter',
+      138 => 'application/x-kspread',
+      139 => 'application/x-kword',
+      140 => 'application/x-latex',
+      141 => 'application/x-lha',
+      142 => 'application/x-lyx',
+      143 => 'application/x-lzh',
+      144 => 'application/x-lzx',
+      145 => 'application/x-maker',
+      146 => 'application/x-mif',
+      147 => 'application/x-ms-wmd',
+      148 => 'application/x-ms-wmz',
+      149 => 'application/x-msdos-program',
+      150 => 'application/x-msi',
+      151 => 'application/x-netcdf',
+      152 => 'application/x-ns-proxy-autoconfig',
+      153 => 'application/x-nwc',
+      154 => 'application/x-object',
+      155 => 'application/x-oz-application',
+      156 => 'application/x-pkcs7-certreqresp',
+      157 => 'application/x-pkcs7-crl',
+      158 => 'application/x-python-code',
+      159 => 'application/x-quicktimeplayer',
+      160 => 'application/x-redhat-package-manager',
+      161 => 'application/x-shar',
+      162 => 'application/x-shockwave-flash',
+      163 => 'application/x-stuffit',
+      164 => 'application/x-sv4cpio',
+      165 => 'application/x-sv4crc',
+      166 => 'application/x-tar',
+      167 => 'application/x-tcl',
+      168 => 'application/x-tex-gf',
+      169 => 'application/x-tex-pk',
+      170 => 'application/x-texinfo',
+      171 => 'application/x-trash',
+      172 => 'application/x-troff',
+      173 => 'application/x-troff-man',
+      174 => 'application/x-troff-me',
+      175 => 'application/x-troff-ms',
+      176 => 'application/x-ustar',
+      177 => 'application/x-wais-source',
+      178 => 'application/x-wingz',
+      179 => 'application/x-x509-ca-cert',
+      180 => 'application/x-xcf',
+      181 => 'application/x-xfig',
+      182 => 'application/x-xpinstall',
+      183 => 'application/xhtml+xml',
+      184 => 'application/xml',
+      185 => 'application/zip',
+      186 => 'audio/basic',
+      187 => 'audio/midi',
+      346 => 'audio/mp4',
+      188 => 'audio/mpeg',
+      189 => 'audio/ogg',
+      190 => 'audio/prs.sid',
+      191 => 'audio/x-aiff',
+      192 => 'audio/x-gsm',
+      193 => 'audio/x-mpegurl',
+      194 => 'audio/x-ms-wax',
+      195 => 'audio/x-ms-wma',
+      196 => 'audio/x-pn-realaudio',
+      197 => 'audio/x-realaudio',
+      198 => 'audio/x-scpls',
+      199 => 'audio/x-sd2',
+      200 => 'audio/x-wav',
+      201 => 'chemical/x-alchemy',
+      202 => 'chemical/x-cache',
+      203 => 'chemical/x-cache-csf',
+      204 => 'chemical/x-cactvs-binary',
+      205 => 'chemical/x-cdx',
+      206 => 'chemical/x-cerius',
+      207 => 'chemical/x-chem3d',
+      208 => 'chemical/x-chemdraw',
+      209 => 'chemical/x-cif',
+      210 => 'chemical/x-cmdf',
+      211 => 'chemical/x-cml',
+      212 => 'chemical/x-compass',
+      213 => 'chemical/x-crossfire',
+      214 => 'chemical/x-csml',
+      215 => 'chemical/x-ctx',
+      216 => 'chemical/x-cxf',
+      217 => 'chemical/x-embl-dl-nucleotide',
+      218 => 'chemical/x-galactic-spc',
+      219 => 'chemical/x-gamess-input',
+      220 => 'chemical/x-gaussian-checkpoint',
+      221 => 'chemical/x-gaussian-cube',
+      222 => 'chemical/x-gaussian-input',
+      223 => 'chemical/x-gaussian-log',
+      224 => 'chemical/x-gcg8-sequence',
+      225 => 'chemical/x-genbank',
+      226 => 'chemical/x-hin',
+      227 => 'chemical/x-isostar',
+      228 => 'chemical/x-jcamp-dx',
+      229 => 'chemical/x-kinemage',
+      230 => 'chemical/x-macmolecule',
+      231 => 'chemical/x-macromodel-input',
+      232 => 'chemical/x-mdl-molfile',
+      233 => 'chemical/x-mdl-rdfile',
+      234 => 'chemical/x-mdl-rxnfile',
+      235 => 'chemical/x-mdl-sdfile',
+      236 => 'chemical/x-mdl-tgf',
+      237 => 'chemical/x-mmcif',
+      238 => 'chemical/x-mol2',
+      239 => 'chemical/x-molconn-Z',
+      240 => 'chemical/x-mopac-graph',
+      241 => 'chemical/x-mopac-input',
+      242 => 'chemical/x-mopac-out',
+      243 => 'chemical/x-mopac-vib',
+      244 => 'chemical/x-ncbi-asn1-ascii',
+      245 => 'chemical/x-ncbi-asn1-binary',
+      246 => 'chemical/x-ncbi-asn1-spec',
+      247 => 'chemical/x-pdb',
+      248 => 'chemical/x-rosdal',
+      249 => 'chemical/x-swissprot',
+      250 => 'chemical/x-vamas-iso14976',
+      251 => 'chemical/x-vmd',
+      252 => 'chemical/x-xtel',
+      253 => 'chemical/x-xyz',
+      254 => 'image/gif',
+      255 => 'image/ief',
+      256 => 'image/jpeg',
+      257 => 'image/pcx',
+      258 => 'image/png',
+      259 => 'image/svg+xml',
+      260 => 'image/tiff',
+      261 => 'image/vnd.djvu',
+      262 => 'image/vnd.microsoft.icon',
+      263 => 'image/vnd.wap.wbmp',
+      264 => 'image/x-cmu-raster',
+      265 => 'image/x-coreldraw',
+      266 => 'image/x-coreldrawpattern',
+      267 => 'image/x-coreldrawtemplate',
+      268 => 'image/x-corelphotopaint',
+      269 => 'image/x-jg',
+      270 => 'image/x-jng',
+      271 => 'image/x-ms-bmp',
+      272 => 'image/x-photoshop',
+      273 => 'image/x-portable-anymap',
+      274 => 'image/x-portable-bitmap',
+      275 => 'image/x-portable-graymap',
+      276 => 'image/x-portable-pixmap',
+      277 => 'image/x-rgb',
+      278 => 'image/x-xbitmap',
+      279 => 'image/x-xpixmap',
+      280 => 'image/x-xwindowdump',
+      281 => 'message/rfc822',
+      282 => 'model/iges',
+      283 => 'model/mesh',
+      284 => 'model/vrml',
+      285 => 'text/calendar',
+      286 => 'text/css',
+      287 => 'text/csv',
+      288 => 'text/h323',
+      289 => 'text/html',
+      290 => 'text/iuls',
+      291 => 'text/mathml',
+      292 => 'text/plain',
+      293 => 'text/richtext',
+      294 => 'text/scriptlet',
+      295 => 'text/tab-separated-values',
+      296 => 'text/texmacs',
+      297 => 'text/vnd.sun.j2me.app-descriptor',
+      298 => 'text/vnd.wap.wml',
+      299 => 'text/vnd.wap.wmlscript',
+      300 => 'text/x-bibtex',
+      301 => 'text/x-boo',
+      302 => 'text/x-c++hdr',
+      303 => 'text/x-c++src',
+      304 => 'text/x-chdr',
+      305 => 'text/x-component',
+      306 => 'text/x-csh',
+      307 => 'text/x-csrc',
+      308 => 'text/x-diff',
+      309 => 'text/x-dsrc',
+      310 => 'text/x-haskell',
+      311 => 'text/x-java',
+      312 => 'text/x-literate-haskell',
+      313 => 'text/x-moc',
+      314 => 'text/x-pascal',
+      315 => 'text/x-pcs-gcd',
+      316 => 'text/x-perl',
+      317 => 'text/x-python',
+      318 => 'text/x-setext',
+      319 => 'text/x-sh',
+      320 => 'text/x-tcl',
+      321 => 'text/x-tex',
+      322 => 'text/x-vcalendar',
+      323 => 'text/x-vcard',
+      324 => 'video/3gpp',
+      325 => 'video/dl',
+      326 => 'video/dv',
+      327 => 'video/fli',
+      328 => 'video/gl',
+      329 => 'video/mp4',
+      330 => 'video/mpeg',
+      331 => 'video/ogg',
+      332 => 'video/quicktime',
+      333 => 'video/vnd.mpegurl',
+      347 => 'video/x-flv',
+      334 => 'video/x-la-asf',
+      348 => 'video/x-m4v',
+      335 => 'video/x-mng',
+      336 => 'video/x-ms-asf',
+      337 => 'video/x-ms-wm',
+      338 => 'video/x-ms-wmv',
+      339 => 'video/x-ms-wmx',
+      340 => 'video/x-ms-wvx',
+      341 => 'video/x-msvideo',
+      342 => 'video/x-sgi-movie',
+      343 => 'x-conference/x-cooltalk',
+      344 => 'x-epoc/x-sisx-app',
+      345 => 'x-world/x-vrml',
+    ),
+
+    // Extensions added to this list MUST be lower-case.
+    'extensions' => array(
+      'ez' => 0,
+      'atom' => 1,
+      'atomcat' => 2,
+      'atomsrv' => 3,
+      'cap' => 4,
+      'pcap' => 4,
+      'cu' => 5,
+      'tsp' => 6,
+      'hta' => 7,
+      'jar' => 8,
+      'ser' => 9,
+      'class' => 10,
+      'hqx' => 11,
+      'nb' => 12,
+      'mdb' => 13,
+      'dot' => 14,
+      'doc' => 14,
+      'bin' => 15,
+      'oda' => 16,
+      'ogx' => 17,
+      'pdf' => 18,
+      'key' => 19,
+      'pgp' => 20,
+      'prf' => 21,
+      'eps' => 22,
+      'ai' => 22,
+      'ps' => 22,
+      'rar' => 23,
+      'rdf' => 24,
+      'rss' => 25,
+      'rtf' => 26,
+      'smi' => 27,
+      'smil' => 27,
+      'cdy' => 28,
+      'kml' => 29,
+      'kmz' => 30,
+      'xul' => 31,
+      'xlb' => 32,
+      'xlt' => 32,
+      'xls' => 32,
+      'xlam' => 33,
+      'xlsb' => 34,
+      'xlsm' => 35,
+      'xltm' => 36,
+      'cat' => 37,
+      'stl' => 38,
+      'pps' => 39,
+      'ppt' => 39,
+      'ppam' => 40,
+      'pptm' => 41,
+      'ppsm' => 42,
+      'potm' => 43,
+      'docm' => 44,
+      'dotm' => 45,
+      'xps' => 46,
+      'odc' => 47,
+      'odb' => 48,
+      'odf' => 49,
+      'odg' => 50,
+      'otg' => 51,
+      'odi' => 52,
+      'odp' => 53,
+      'otp' => 54,
+      'ods' => 55,
+      'ots' => 56,
+      'odt' => 57,
+      'odm' => 58,
+      'ott' => 59,
+      'oth' => 60,
+      'pptx' => 61,
+      'ppsx' => 62,
+      'potx' => 63,
+      'xlsx' => 64,
+      'xltx' => 65,
+      'docx' => 66,
+      'dotx' => 67,
+      'cod' => 68,
+      'mmf' => 69,
+      'sdc' => 70,
+      'sds' => 71,
+      'sda' => 72,
+      'sdd' => 73,
+      'sdw' => 75,
+      'sgl' => 76,
+      'sxc' => 77,
+      'stc' => 78,
+      'sxd' => 79,
+      'std' => 80,
+      'sxi' => 81,
+      'sti' => 82,
+      'sxm' => 83,
+      'sxw' => 84,
+      'sxg' => 85,
+      'stw' => 86,
+      'sis' => 87,
+      'vsd' => 88,
+      'wbxml' => 89,
+      'wmlc' => 90,
+      'wmlsc' => 91,
+      'wpd' => 92,
+      'wp5' => 93,
+      'wk' => 94,
+      '7z' => 95,
+      'abw' => 96,
+      'dmg' => 97,
+      'bcpio' => 98,
+      'torrent' => 99,
+      'cab' => 100,
+      'cbr' => 101,
+      'cbz' => 102,
+      'cdf' => 103,
+      'vcd' => 104,
+      'pgn' => 105,
+      'cpio' => 106,
+      'udeb' => 107,
+      'deb' => 107,
+      'dir' => 108,
+      'dxr' => 108,
+      'dcr' => 108,
+      'dms' => 109,
+      'wad' => 110,
+      'dvi' => 111,
+      'flac' => 112,
+      'pfa' => 113,
+      'pfb' => 113,
+      'pcf' => 113,
+      'gsf' => 113,
+      'pcf.z' => 113,
+      'mm' => 114,
+      'spl' => 115,
+      'gnumeric' => 116,
+      'sgf' => 117,
+      'gcf' => 118,
+      'taz' => 119,
+      'gtar' => 119,
+      'tgz' => 119,
+      'hdf' => 120,
+      'rhtml' => 121,
+      'phtml' => 122,
+      'pht' => 122,
+      'php' => 122,
+      'phps' => 123,
+      'php3' => 124,
+      'php3p' => 125,
+      'php4' => 126,
+      'ica' => 127,
+      'ins' => 128,
+      'isp' => 128,
+      'iii' => 129,
+      'iso' => 130,
+      'jnlp' => 131,
+      'js' => 132,
+      'jmz' => 133,
+      'chrt' => 134,
+      'kil' => 135,
+      'skp' => 136,
+      'skd' => 136,
+      'skm' => 136,
+      'skt' => 136,
+      'kpr' => 137,
+      'kpt' => 137,
+      'ksp' => 138,
+      'kwd' => 139,
+      'kwt' => 139,
+      'latex' => 140,
+      'lha' => 141,
+      'lyx' => 142,
+      'lzh' => 143,
+      'lzx' => 144,
+      'maker' => 145,
+      'frm' => 145,
+      'frame' => 145,
+      'fm' => 145,
+      'book' => 145,
+      'fb' => 145,
+      'fbdoc' => 145,
+      'mif' => 146,
+      'wmd' => 147,
+      'wmz' => 148,
+      'dll' => 149,
+      'bat' => 149,
+      'exe' => 149,
+      'com' => 149,
+      'msi' => 150,
+      'nc' => 151,
+      'pac' => 152,
+      'nwc' => 153,
+      'o' => 154,
+      'oza' => 155,
+      'p7r' => 156,
+      'crl' => 157,
+      'pyo' => 158,
+      'pyc' => 158,
+      'qtl' => 159,
+      'rpm' => 160,
+      'shar' => 161,
+      'swf' => 162,
+      'swfl' => 162,
+      'sitx' => 163,
+      'sit' => 163,
+      'sv4cpio' => 164,
+      'sv4crc' => 165,
+      'tar' => 166,
+      'gf' => 168,
+      'pk' => 169,
+      'texi' => 170,
+      'texinfo' => 170,
+      'sik' => 171,
+      '~' => 171,
+      'bak' => 171,
+      '%' => 171,
+      'old' => 171,
+      't' => 172,
+      'roff' => 172,
+      'tr' => 172,
+      'man' => 173,
+      'me' => 174,
+      'ms' => 175,
+      'ustar' => 176,
+      'src' => 177,
+      'wz' => 178,
+      'crt' => 179,
+      'xcf' => 180,
+      'fig' => 181,
+      'xpi' => 182,
+      'xht' => 183,
+      'xhtml' => 183,
+      'xml' => 184,
+      'xsl' => 184,
+      'zip' => 185,
+      'au' => 186,
+      'snd' => 186,
+      'mid' => 187,
+      'midi' => 187,
+      'kar' => 187,
+      'mpega' => 188,
+      'mpga' => 188,
+      'm4a' => 188,
+      'mp3' => 188,
+      'mp2' => 188,
+      'ogg' => 189,
+      'oga' => 189,
+      'spx' => 189,
+      'sid' => 190,
+      'aif' => 191,
+      'aiff' => 191,
+      'aifc' => 191,
+      'gsm' => 192,
+      'm3u' => 193,
+      'wax' => 194,
+      'wma' => 195,
+      'rm' => 196,
+      'ram' => 196,
+      'ra' => 197,
+      'pls' => 198,
+      'sd2' => 199,
+      'wav' => 200,
+      'alc' => 201,
+      'cac' => 202,
+      'cache' => 202,
+      'csf' => 203,
+      'cascii' => 204,
+      'cbin' => 204,
+      'ctab' => 204,
+      'cdx' => 205,
+      'cer' => 206,
+      'c3d' => 207,
+      'chm' => 208,
+      'cif' => 209,
+      'cmdf' => 210,
+      'cml' => 211,
+      'cpa' => 212,
+      'bsd' => 213,
+      'csml' => 214,
+      'csm' => 214,
+      'ctx' => 215,
+      'cxf' => 216,
+      'cef' => 216,
+      'emb' => 217,
+      'embl' => 217,
+      'spc' => 218,
+      'gam' => 219,
+      'inp' => 219,
+      'gamin' => 219,
+      'fchk' => 220,
+      'fch' => 220,
+      'cub' => 221,
+      'gau' => 222,
+      'gjf' => 222,
+      'gjc' => 222,
+      'gal' => 223,
+      'gcg' => 224,
+      'gen' => 225,
+      'hin' => 226,
+      'istr' => 227,
+      'ist' => 227,
+      'dx' => 228,
+      'jdx' => 228,
+      'kin' => 229,
+      'mcm' => 230,
+      'mmd' => 231,
+      'mmod' => 231,
+      'mol' => 232,
+      'rd' => 233,
+      'rxn' => 234,
+      'sdf' => 235,
+      'sd' => 235,
+      'tgf' => 236,
+      'mcif' => 237,
+      'mol2' => 238,
+      'b' => 239,
+      'gpt' => 240,
+      'mopcrt' => 241,
+      'zmt' => 241,
+      'mpc' => 241,
+      'dat' => 241,
+      'mop' => 241,
+      'moo' => 242,
+      'mvb' => 243,
+      'prt' => 244,
+      'aso' => 245,
+      'val' => 245,
+      'asn' => 246,
+      'ent' => 247,
+      'pdb' => 247,
+      'ros' => 248,
+      'sw' => 249,
+      'vms' => 250,
+      'vmd' => 251,
+      'xtel' => 252,
+      'xyz' => 253,
+      'gif' => 254,
+      'ief' => 255,
+      'jpeg' => 256,
+      'jpe' => 256,
+      'jpg' => 256,
+      'pcx' => 257,
+      'png' => 258,
+      'svgz' => 259,
+      'svg' => 259,
+      'tif' => 260,
+      'tiff' => 260,
+      'djvu' => 261,
+      'djv' => 261,
+      'ico' => 262,
+      'wbmp' => 263,
+      'ras' => 264,
+      'cdr' => 265,
+      'pat' => 266,
+      'cdt' => 267,
+      'cpt' => 268,
+      'art' => 269,
+      'jng' => 270,
+      'bmp' => 271,
+      'psd' => 272,
+      'pnm' => 273,
+      'pbm' => 274,
+      'pgm' => 275,
+      'ppm' => 276,
+      'rgb' => 277,
+      'xbm' => 278,
+      'xpm' => 279,
+      'xwd' => 280,
+      'eml' => 281,
+      'igs' => 282,
+      'iges' => 282,
+      'silo' => 283,
+      'msh' => 283,
+      'mesh' => 283,
+      'icz' => 285,
+      'ics' => 285,
+      'css' => 286,
+      'csv' => 287,
+      '323' => 288,
+      'html' => 289,
+      'htm' => 289,
+      'shtml' => 289,
+      'uls' => 290,
+      'mml' => 291,
+      'txt' => 292,
+      'pot' => 292,
+      'text' => 292,
+      'asc' => 292,
+      'rtx' => 293,
+      'wsc' => 294,
+      'sct' => 294,
+      'tsv' => 295,
+      'ts' => 296,
+      'tm' => 296,
+      'jad' => 297,
+      'wml' => 298,
+      'wmls' => 299,
+      'bib' => 300,
+      'boo' => 301,
+      'hpp' => 302,
+      'hh' => 302,
+      'h++' => 302,
+      'hxx' => 302,
+      'cxx' => 303,
+      'cc' => 303,
+      'cpp' => 303,
+      'c++' => 303,
+      'h' => 304,
+      'htc' => 305,
+      'csh' => 306,
+      'c' => 307,
+      'patch' => 308,
+      'diff' => 308,
+      'd' => 309,
+      'hs' => 310,
+      'java' => 311,
+      'lhs' => 312,
+      'moc' => 313,
+      'pas' => 314,
+      'p' => 314,
+      'gcd' => 315,
+      'pm' => 316,
+      'pl' => 316,
+      'py' => 317,
+      'etx' => 318,
+      'sh' => 319,
+      'tk' => 320,
+      'tcl' => 320,
+      'cls' => 321,
+      'ltx' => 321,
+      'sty' => 321,
+      'tex' => 321,
+      'vcs' => 322,
+      'vcf' => 323,
+      '3gp' => 324,
+      'dl' => 325,
+      'dif' => 326,
+      'dv' => 326,
+      'fli' => 327,
+      'gl' => 328,
+      'mp4' => 329,
+      'f4v' => 329,
+      'f4p' => 329,
+      'mpe' => 330,
+      'mpeg' => 330,
+      'mpg' => 330,
+      'ogv' => 331,
+      'qt' => 332,
+      'mov' => 332,
+      'mxu' => 333,
+      'lsf' => 334,
+      'lsx' => 334,
+      'mng' => 335,
+      'asx' => 336,
+      'asf' => 336,
+      'wm' => 337,
+      'wmv' => 338,
+      'wmx' => 339,
+      'wvx' => 340,
+      'avi' => 341,
+      'movie' => 342,
+      'ice' => 343,
+      'sisx' => 344,
+      'wrl' => 345,
+      'vrm' => 345,
+      'vrml' => 345,
+      'f4a' => 346,
+      'f4b' => 346,
+      'flv' => 347,
+      'm4v' => 348,
+    ),
+  );
+}
diff --git a/htmltest/includes/filetransfer/filetransfer.inc b/htmltest/includes/filetransfer/filetransfer.inc
new file mode 100644
index 00000000..6c55b2f4
--- /dev/null
+++ b/htmltest/includes/filetransfer/filetransfer.inc
@@ -0,0 +1,427 @@
+<?php
+
+/*
+ * Base FileTransfer class.
+ *
+ * Classes extending this class perform file operations on directories not
+ * writable by the webserver. To achieve this, the class should connect back
+ * to the server using some backend (for example FTP or SSH). To keep security,
+ * the password should always be asked from the user and never stored. For
+ * safety, all methods operate only inside a "jail", by default the Drupal root.
+ */
+abstract class FileTransfer {
+  protected $username;
+  protected $password;
+  protected $hostname = 'localhost';
+  protected $port;
+
+  /**
+   * The constructor for the UpdateConnection class. This method is also called
+   * from the classes that extend this class and override this method.
+   */
+  function __construct($jail) {
+    $this->jail = $jail;
+  }
+
+  /**
+   * Classes that extend this class must override the factory() static method.
+   *
+   * @param string $jail
+   *   The full path where all file operations performed by this object will
+   *   be restricted to. This prevents the FileTransfer classes from being
+   *   able to touch other parts of the filesystem.
+   * @param array $settings
+   *   An array of connection settings for the FileTransfer subclass. If the
+   *   getSettingsForm() method uses any nested settings, the same structure
+   *   will be assumed here.
+   * @return object
+   *   New instance of the appropriate FileTransfer subclass.
+   */
+  static function factory($jail, $settings) {
+    throw new FileTransferException('FileTransfer::factory() static method not overridden by FileTransfer subclass.');
+  }
+
+  /**
+   * Implementation of the magic __get() method.
+   *
+   * If the connection isn't set to anything, this will call the connect() method
+   * and set it to and return the result; afterwards, the connection will be
+   * returned directly without using this method.
+   */
+  function __get($name) {
+    if ($name == 'connection') {
+      $this->connect();
+      return $this->connection;
+    }
+
+    if ($name == 'chroot') {
+      $this->setChroot();
+      return $this->chroot;
+    }
+  }
+
+  /**
+   * Connect to the server.
+   */
+  abstract protected function connect();
+
+  /**
+   * Copies a directory.
+   *
+   * @param $source
+   *   The source path.
+   * @param $destination
+   *   The destination path.
+   */
+  public final function copyDirectory($source, $destination) {
+    $source = $this->sanitizePath($source);
+    $destination = $this->fixRemotePath($destination);
+    $this->checkPath($destination);
+    $this->copyDirectoryJailed($source, $destination);
+  }
+
+  /**
+   * @see http://php.net/chmod
+   *
+   * @param string $path
+   * @param long $mode
+   * @param bool $recursive
+   */
+  public final function chmod($path, $mode, $recursive = FALSE) {
+    if (!in_array('FileTransferChmodInterface', class_implements(get_class($this)))) {
+      throw new FileTransferException('Unable to change file permissions');
+    }
+    $path = $this->sanitizePath($path);
+    $path = $this->fixRemotePath($path);
+    $this->checkPath($path);
+    $this->chmodJailed($path, $mode, $recursive);
+  }
+
+  /**
+   * Creates a directory.
+   *
+   * @param $directory
+   *   The directory to be created.
+   */
+  public final function createDirectory($directory) {
+    $directory = $this->fixRemotePath($directory);
+    $this->checkPath($directory);
+    $this->createDirectoryJailed($directory);
+  }
+
+  /**
+   * Removes a directory.
+   *
+   * @param $directory
+   *   The directory to be removed.
+   */
+  public final function removeDirectory($directory) {
+    $directory = $this->fixRemotePath($directory);
+    $this->checkPath($directory);
+    $this->removeDirectoryJailed($directory);
+  }
+
+  /**
+   * Copies a file.
+   *
+   * @param $source
+   *   The source file.
+   * @param $destination
+   *   The destination file.
+   */
+  public final function copyFile($source, $destination) {
+    $source = $this->sanitizePath($source);
+    $destination = $this->fixRemotePath($destination);
+    $this->checkPath($destination);
+    $this->copyFileJailed($source, $destination);
+  }
+
+  /**
+   * Removes a file.
+   *
+   * @param $destination
+   *   The destination file to be removed.
+   */
+  public final function removeFile($destination) {
+    $destination = $this->fixRemotePath($destination);
+    $this->checkPath($destination);
+    $this->removeFileJailed($destination);
+  }
+
+  /**
+   * Checks that the path is inside the jail and throws an exception if not.
+   *
+   * @param $path
+   *   A path to check against the jail.
+   */
+  protected final function checkPath($path) {
+    $full_jail = $this->chroot . $this->jail;
+    $full_path = drupal_realpath(substr($this->chroot . $path, 0, strlen($full_jail)));
+    $full_path = $this->fixRemotePath($full_path, FALSE);
+    if ($full_jail !== $full_path) {
+      throw new FileTransferException('@directory is outside of the @jail', NULL, array('@directory' => $path, '@jail' => $this->jail));
+    }
+  }
+
+  /**
+   * Returns a modified path suitable for passing to the server.
+   * If a path is a windows path, makes it POSIX compliant by removing the drive letter.
+   * If $this->chroot has a value, it is stripped from the path to allow for
+   * chroot'd filetransfer systems.
+   *
+   * @param $path
+   * @param $strip_chroot
+   *
+   * @return string
+   */
+  protected final function fixRemotePath($path, $strip_chroot = TRUE) {
+    $path = $this->sanitizePath($path);
+    $path = preg_replace('|^([a-z]{1}):|i', '', $path); // Strip out windows driveletter if its there.
+    if ($strip_chroot) {
+      if ($this->chroot && strpos($path, $this->chroot) === 0) {
+        $path = ($path == $this->chroot) ? '' : substr($path, strlen($this->chroot));
+      }
+    }
+    return $path;
+  }
+
+  /**
+  * Changes backslashes to slashes, also removes a trailing slash.
+  *
+  * @param string $path
+  * @return string
+  */
+  function sanitizePath($path) {
+    $path = str_replace('\\', '/', $path); // Windows path sanitization.
+    if (substr($path, -1) == '/') {
+      $path = substr($path, 0, -1);
+    }
+    return $path;
+  }
+
+  /**
+   * Copies a directory.
+   *
+   * We need a separate method to make the $destination is in the jail.
+   *
+   * @param $source
+   *   The source path.
+   * @param $destination
+   *   The destination path.
+   */
+  protected function copyDirectoryJailed($source, $destination) {
+    if ($this->isDirectory($destination)) {
+      $destination = $destination . '/' . drupal_basename($source);
+    }
+    $this->createDirectory($destination);
+    foreach (new RecursiveIteratorIterator(new SkipDotsRecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST) as $filename => $file) {
+      $relative_path = substr($filename, strlen($source));
+      if ($file->isDir()) {
+        $this->createDirectory($destination . $relative_path);
+      }
+      else {
+        $this->copyFile($file->getPathName(), $destination . $relative_path);
+      }
+    }
+  }
+
+  /**
+   * Creates a directory.
+   *
+   * @param $directory
+   *   The directory to be created.
+   */
+  abstract protected function createDirectoryJailed($directory);
+
+  /**
+   * Removes a directory.
+   *
+   * @param $directory
+   *   The directory to be removed.
+   */
+  abstract protected function removeDirectoryJailed($directory);
+
+  /**
+   * Copies a file.
+   *
+   * @param $source
+   *   The source file.
+   * @param $destination
+   *   The destination file.
+   */
+  abstract protected function copyFileJailed($source, $destination);
+
+  /**
+   * Removes a file.
+   *
+   * @param $destination
+   *   The destination file to be removed.
+   */
+  abstract protected function removeFileJailed($destination);
+
+  /**
+   * Checks if a particular path is a directory
+   *
+   * @param $path
+   *   The path to check
+   *
+   * @return boolean
+   */
+  abstract public function isDirectory($path);
+
+  /**
+   * Checks if a particular path is a file (not a directory).
+   *
+   * @param $path
+   *   The path to check
+   *
+   * @return boolean
+   */
+  abstract public function isFile($path);
+
+  /**
+   * Return the chroot property for this connection.
+   *
+   * It does this by moving up the tree until it finds itself. If successful,
+   * it will return the chroot, otherwise FALSE.
+   *
+   * @return
+   *   The chroot path for this connection or FALSE.
+   */
+  function findChroot() {
+    // If the file exists as is, there is no chroot.
+    $path = __FILE__;
+    $path = $this->fixRemotePath($path, FALSE);
+    if ($this->isFile($path)) {
+      return FALSE;
+    }
+
+    $path = dirname(__FILE__);
+    $path = $this->fixRemotePath($path, FALSE);
+    $parts = explode('/', $path);
+    $chroot = '';
+    while (count($parts)) {
+      $check = implode($parts, '/');
+      if ($this->isFile($check . '/' . drupal_basename(__FILE__))) {
+        // Remove the trailing slash.
+        return substr($chroot, 0, -1);
+      }
+      $chroot .= array_shift($parts) . '/';
+    }
+    return FALSE;
+  }
+
+  /**
+   * Sets the chroot and changes the jail to match the correct path scheme
+   *
+   */
+  function setChroot() {
+    $this->chroot = $this->findChroot();
+    $this->jail = $this->fixRemotePath($this->jail);
+  }
+
+  /**
+   * Returns a form to collect connection settings credentials.
+   *
+   * Implementing classes can either extend this form with fields collecting the
+   * specific information they need, or override it entirely.
+   */
+  public function getSettingsForm() {
+    $form['username'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Username'),
+    );
+    $form['password'] = array(
+      '#type' => 'password',
+      '#title' => t('Password'),
+      '#description' => t('Your password is not saved in the database and is only used to establish a connection.'),
+    );
+    $form['advanced'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Advanced settings'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+    );
+    $form['advanced']['hostname'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Host'),
+      '#default_value' => 'localhost',
+      '#description' => t('The connection will be created between your web server and the machine hosting the web server files. In the vast majority of cases, this will be the same machine, and "localhost" is correct.'),
+    );
+    $form['advanced']['port'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Port'),
+      '#default_value' => NULL,
+    );
+    return $form;
+  }
+}
+
+/**
+ * FileTransferException class.
+ */
+class FileTransferException extends Exception {
+  public $arguments;
+
+  function __construct($message, $code = 0, $arguments = array()) {
+    parent::__construct($message, $code);
+    $this->arguments = $arguments;
+  }
+}
+
+
+/**
+ * A FileTransfer Class implementing this interface can be used to chmod files.
+ */
+interface FileTransferChmodInterface {
+
+  /**
+   * Changes the permissions of the file / directory specified in $path
+   *
+   * @param string $path
+   *   Path to change permissions of.
+   * @param long $mode
+   *   The new file permission mode to be passed to chmod().
+   * @param boolean $recursive
+   *   Pass TRUE to recursively chmod the entire directory specified in $path.
+   */
+  function chmodJailed($path, $mode, $recursive);
+}
+
+/**
+ * Provides an interface for iterating recursively over filesystem directories.
+ *
+ * Manually skips '.' and '..' directories, since no existing method is
+ * available in PHP 5.2.
+ *
+ * @todo Depreciate in favor of RecursiveDirectoryIterator::SKIP_DOTS once PHP
+ *   5.3 or later is required.
+ */
+class SkipDotsRecursiveDirectoryIterator extends RecursiveDirectoryIterator {
+  /**
+   * Constructs a SkipDotsRecursiveDirectoryIterator
+   *
+   * @param $path
+   *   The path of the directory to be iterated over.
+   */
+  function __construct($path) {
+    parent::__construct($path);
+    $this->skipdots();
+  }
+
+  function rewind() {
+    parent::rewind();
+    $this->skipdots();
+  }
+
+  function next() {
+    parent::next();
+    $this->skipdots();
+  }
+
+  protected function skipdots() {
+    while ($this->isDot()) {
+      parent::next();
+    }
+  }
+}
diff --git a/htmltest/includes/filetransfer/ftp.inc b/htmltest/includes/filetransfer/ftp.inc
new file mode 100644
index 00000000..a85831d1
--- /dev/null
+++ b/htmltest/includes/filetransfer/ftp.inc
@@ -0,0 +1,144 @@
+<?php
+
+/**
+ * Base class for FTP implementations.
+ */
+abstract class FileTransferFTP extends FileTransfer {
+
+  public function __construct($jail, $username, $password, $hostname, $port) {
+    $this->username = $username;
+    $this->password = $password;
+    $this->hostname = $hostname;
+    $this->port = $port;
+    parent::__construct($jail);
+  }
+
+  /**
+   * Return an object which can implement the FTP protocol.
+   *
+   * @param string $jail
+   * @param array $settings
+   * @return FileTransferFTP
+   *   The appropriate FileTransferFTP subclass based on the available
+   *   options. If the FTP PHP extension is available, use it.
+   */
+  static function factory($jail, $settings) {
+    $username = empty($settings['username']) ? '' : $settings['username'];
+    $password = empty($settings['password']) ? '' : $settings['password'];
+    $hostname = empty($settings['advanced']['hostname']) ? 'localhost' : $settings['advanced']['hostname'];
+    $port = empty($settings['advanced']['port']) ? 21 : $settings['advanced']['port'];
+
+    if (function_exists('ftp_connect')) {
+      $class = 'FileTransferFTPExtension';
+    }
+    else {
+      throw new FileTransferException('No FTP backend available.');
+    }
+
+    return new $class($jail, $username, $password, $hostname, $port);
+  }
+
+  /**
+   * Returns the form to configure the FileTransfer class for FTP.
+   */
+  public function getSettingsForm() {
+    $form = parent::getSettingsForm();
+    $form['advanced']['port']['#default_value'] = 21;
+    return $form;
+  }
+}
+
+class FileTransferFTPExtension extends FileTransferFTP implements FileTransferChmodInterface {
+
+  public function connect() {
+    $this->connection = ftp_connect($this->hostname, $this->port);
+
+    if (!$this->connection) {
+      throw new FileTransferException("Cannot connect to FTP Server, check settings");
+    }
+    if (!ftp_login($this->connection, $this->username, $this->password)) {
+      throw new FileTransferException("Cannot log in to FTP server. Check username and password");
+    }
+  }
+
+  protected function copyFileJailed($source, $destination) {
+    if (!@ftp_put($this->connection,  $destination, $source, FTP_BINARY)) {
+      throw new FileTransferException("Cannot move @source to @destination", NULL, array("@source" => $source, "@destination" => $destination));
+    }
+  }
+
+  protected function createDirectoryJailed($directory) {
+    if (!ftp_mkdir($this->connection, $directory)) {
+      throw new FileTransferException("Cannot create directory @directory", NULL, array("@directory" => $directory));
+    }
+  }
+
+  protected function removeDirectoryJailed($directory) {
+    $pwd = ftp_pwd($this->connection);
+    if (!ftp_chdir($this->connection, $directory)) {
+      throw new FileTransferException("Unable to change to directory @directory", NULL, array('@directory' => $directory));
+    }
+    $list = @ftp_nlist($this->connection, '.');
+    if (!$list) {
+      $list = array();
+    }
+    foreach ($list as $item) {
+      if ($item == '.' || $item == '..') {
+        continue;
+      }
+      if (@ftp_chdir($this->connection, $item)) {
+        ftp_cdup($this->connection);
+        $this->removeDirectory(ftp_pwd($this->connection) . '/' . $item);
+      }
+      else {
+        $this->removeFile(ftp_pwd($this->connection) . '/' . $item);
+      }
+    }
+    ftp_chdir($this->connection, $pwd);
+    if (!ftp_rmdir($this->connection, $directory)) {
+      throw new FileTransferException("Unable to remove to directory @directory", NULL, array('@directory' => $directory));
+    }
+  }
+
+  protected function removeFileJailed($destination) {
+    if (!ftp_delete($this->connection, $destination)) {
+      throw new FileTransferException("Unable to remove to file @file", NULL, array('@file' => $destination));
+    }
+  }
+
+  public function isDirectory($path) {
+    $result = FALSE;
+    $curr = ftp_pwd($this->connection);
+    if (@ftp_chdir($this->connection, $path)) {
+      $result = TRUE;
+    }
+    ftp_chdir($this->connection, $curr);
+    return $result;
+  }
+
+  public function isFile($path) {
+    return ftp_size($this->connection, $path) != -1;
+  }
+
+  function chmodJailed($path, $mode, $recursive) {
+    if (!ftp_chmod($this->connection, $mode, $path)) {
+      throw new FileTransferException("Unable to set permissions on %file", NULL, array('%file' => $path));
+    }
+    if ($this->isDirectory($path) && $recursive) {
+      $filelist = @ftp_nlist($this->connection, $path);
+      if (!$filelist) {
+        //empty directory - returns false
+        return;
+      }
+      foreach ($filelist as $file) {
+        $this->chmodJailed($file, $mode, $recursive);
+      }
+    }
+  }
+}
+
+if (!function_exists('ftp_chmod')) {
+  function ftp_chmod($ftp_stream, $mode, $filename) {
+    return ftp_site($ftp_stream, sprintf('CHMOD %o %s', $mode, $filename));
+  }
+}
diff --git a/htmltest/includes/filetransfer/local.inc b/htmltest/includes/filetransfer/local.inc
new file mode 100644
index 00000000..b1259897
--- /dev/null
+++ b/htmltest/includes/filetransfer/local.inc
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * The local connection class for copying files as the httpd user.
+ */
+class FileTransferLocal extends FileTransfer implements FileTransferChmodInterface {
+
+  function connect() {
+    // No-op
+  }
+
+  static function factory($jail, $settings) {
+    return new FileTransferLocal($jail);
+  }
+
+  protected function copyFileJailed($source, $destination) {
+    if (@!copy($source, $destination)) {
+      throw new FileTransferException('Cannot copy %source to %destination.', NULL, array('%source' => $source, '%destination' => $destination));
+    }
+  }
+
+  protected function createDirectoryJailed($directory) {
+    if (!is_dir($directory) && @!mkdir($directory, 0777, TRUE)) {
+      throw new FileTransferException('Cannot create directory %directory.', NULL, array('%directory' => $directory));
+    }
+  }
+
+  protected function removeDirectoryJailed($directory) {
+    if (!is_dir($directory)) {
+      // Programmer error assertion, not something we expect users to see.
+      throw new FileTransferException('removeDirectoryJailed() called with a path (%directory) that is not a directory.', NULL, array('%directory' => $directory));
+    }
+    foreach (new RecursiveIteratorIterator(new SkipDotsRecursiveDirectoryIterator($directory), RecursiveIteratorIterator::CHILD_FIRST) as $filename => $file) {
+      if ($file->isDir()) {
+        if (@!drupal_rmdir($filename)) {
+          throw new FileTransferException('Cannot remove directory %directory.', NULL, array('%directory' => $filename));
+        }
+      }
+      elseif ($file->isFile()) {
+        if (@!drupal_unlink($filename)) {
+          throw new FileTransferException('Cannot remove file %file.', NULL, array('%file' => $filename));
+        }
+      }
+    }
+    if (@!drupal_rmdir($directory)) {
+      throw new FileTransferException('Cannot remove directory %directory.', NULL, array('%directory' => $directory));
+    }
+  }
+
+  protected function removeFileJailed($file) {
+    if (@!drupal_unlink($file)) {
+      throw new FileTransferException('Cannot remove file %file.', NULL, array('%file' => $file));
+    }
+  }
+
+  public function isDirectory($path) {
+    return is_dir($path);
+  }
+
+  public function isFile($path) {
+    return is_file($path);
+  }
+
+  public function chmodJailed($path, $mode, $recursive) {
+    if ($recursive && is_dir($path)) {
+      foreach (new RecursiveIteratorIterator(new SkipDotsRecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST) as $filename => $file) {
+        if (@!chmod($filename, $mode)) {
+          throw new FileTransferException('Cannot chmod %path.', NULL, array('%path' => $filename));
+        }
+      }
+    }
+    elseif (@!chmod($path, $mode)) {
+      throw new FileTransferException('Cannot chmod %path.', NULL, array('%path' => $path));
+    }
+  }
+}
diff --git a/htmltest/includes/filetransfer/ssh.inc b/htmltest/includes/filetransfer/ssh.inc
new file mode 100644
index 00000000..43ec3249
--- /dev/null
+++ b/htmltest/includes/filetransfer/ssh.inc
@@ -0,0 +1,108 @@
+<?php
+
+/**
+ * The SSH connection class for the update module.
+ */
+class FileTransferSSH extends FileTransfer implements FileTransferChmodInterface {
+
+  function __construct($jail, $username, $password, $hostname = "localhost", $port = 22) {
+    $this->username = $username;
+    $this->password = $password;
+    $this->hostname = $hostname;
+    $this->port = $port;
+    parent::__construct($jail);
+  }
+
+  function connect() {
+    $this->connection = @ssh2_connect($this->hostname, $this->port);
+    if (!$this->connection) {
+      throw new FileTransferException('SSH Connection failed to @host:@port', NULL, array('@host' => $this->hostname, '@port' => $this->port));
+    }
+    if (!@ssh2_auth_password($this->connection, $this->username, $this->password)) {
+      throw new FileTransferException('The supplied username/password combination was not accepted.');
+    }
+  }
+
+  static function factory($jail, $settings) {
+    $username = empty($settings['username']) ? '' : $settings['username'];
+    $password = empty($settings['password']) ? '' : $settings['password'];
+    $hostname = empty($settings['advanced']['hostname']) ? 'localhost' : $settings['advanced']['hostname'];
+    $port = empty($settings['advanced']['port']) ? 22 : $settings['advanced']['port'];
+    return new FileTransferSSH($jail, $username, $password, $hostname, $port);
+  }
+
+  protected function copyFileJailed($source, $destination) {
+    if (!@ssh2_scp_send($this->connection, $source, $destination)) {
+      throw new FileTransferException('Cannot copy @source_file to @destination_file.', NULL, array('@source' => $source, '@destination' => $destination));
+    }
+  }
+
+  protected function copyDirectoryJailed($source, $destination) {
+    if (@!ssh2_exec($this->connection, 'cp -Rp ' . escapeshellarg($source) . ' ' . escapeshellarg($destination))) {
+      throw new FileTransferException('Cannot copy directory @directory.', NULL, array('@directory' => $source));
+    }
+  }
+
+  protected function createDirectoryJailed($directory) {
+    if (@!ssh2_exec($this->connection, 'mkdir ' . escapeshellarg($directory))) {
+      throw new FileTransferException('Cannot create directory @directory.', NULL, array('@directory' => $directory));
+    }
+  }
+
+  protected function removeDirectoryJailed($directory) {
+    if (@!ssh2_exec($this->connection, 'rm -Rf ' . escapeshellarg($directory))) {
+      throw new FileTransferException('Cannot remove @directory.', NULL, array('@directory' => $directory));
+    }
+  }
+
+  protected function removeFileJailed($destination) {
+    if (!@ssh2_exec($this->connection, 'rm ' . escapeshellarg($destination))) {
+      throw new FileTransferException('Cannot remove @directory.', NULL, array('@directory' => $destination));
+    }
+  }
+
+  /**
+   * WARNING: This is untested.  It is not currently used, but should do the trick.
+   */
+  public function isDirectory($path) {
+    $directory = escapeshellarg($path);
+    $cmd = "[ -d {$directory} ] && echo 'yes'";
+    if ($output = @ssh2_exec($this->connection, $cmd)) {
+      if ($output == 'yes') {
+        return TRUE;
+      }
+      return FALSE;
+    } else {
+      throw new FileTransferException('Cannot check @path.', NULL, array('@path' => $path));
+    }
+  }
+
+  public function isFile($path) {
+    $file = escapeshellarg($path);
+    $cmd = "[ -f {$file} ] && echo 'yes'";
+    if ($output = @ssh2_exec($this->connection, $cmd)) {
+      if ($output == 'yes') {
+        return TRUE;
+      }
+      return FALSE;
+    } else {
+      throw new FileTransferException('Cannot check @path.', NULL, array('@path' => $path));
+    }
+  }
+
+  function chmodJailed($path, $mode, $recursive) {
+    $cmd = sprintf("chmod %s%o %s", $recursive ? '-R ' : '', $mode, escapeshellarg($path));
+    if (@!ssh2_exec($this->connection, $cmd)) {
+      throw new FileTransferException('Cannot change permissions of @path.', NULL, array('@path' => $path));
+    }
+  }
+
+  /**
+   * Returns the form to configure the FileTransfer class for SSH.
+   */
+  public function getSettingsForm() {
+    $form = parent::getSettingsForm();
+    $form['advanced']['port']['#default_value'] = 22;
+    return $form;
+  }
+}
diff --git a/htmltest/includes/form.inc b/htmltest/includes/form.inc
new file mode 100644
index 00000000..fcfc7965
--- /dev/null
+++ b/htmltest/includes/form.inc
@@ -0,0 +1,4610 @@
+<?php
+ /**
+ * @file
+ * Functions for form and batch generation and processing.
+ */
+
+/**
+ * @defgroup forms Form builder functions
+ * @{
+ * Functions that build an abstract representation of a HTML form.
+ *
+ * All modules should declare their form builder functions to be in this
+ * group and each builder function should reference its validate and submit
+ * functions using \@see. Conversely, validate and submit functions should
+ * reference the form builder function using \@see. For examples, of this see
+ * system_modules_uninstall() or user_pass(), the latter of which has the
+ * following in its doxygen documentation:
+ *
+ * \@ingroup forms
+ * \@see user_pass_validate().
+ * \@see user_pass_submit().
+ *
+ * @}
+ */
+
+/**
+ * @defgroup form_api Form generation
+ * @{
+ * Functions to enable the processing and display of HTML forms.
+ *
+ * Drupal uses these functions to achieve consistency in its form processing and
+ * presentation, while simplifying code and reducing the amount of HTML that
+ * must be explicitly generated by modules.
+ *
+ * The primary function used with forms is drupal_get_form(), which is
+ * used for forms presented interactively to a user. Forms can also be built and
+ * submitted programmatically without any user input using the
+ * drupal_form_submit() function.
+ *
+ * drupal_get_form() handles retrieving, processing, and displaying a rendered
+ * HTML form for modules automatically.
+ *
+ * Here is an example of how to use drupal_get_form() and a form builder
+ * function:
+ * @code
+ * $form = drupal_get_form('my_module_example_form');
+ * ...
+ * function my_module_example_form($form, &$form_state) {
+ *   $form['submit'] = array(
+ *     '#type' => 'submit',
+ *     '#value' => t('Submit'),
+ *   );
+ *   return $form;
+ * }
+ * function my_module_example_form_validate($form, &$form_state) {
+ *   // Validation logic.
+ * }
+ * function my_module_example_form_submit($form, &$form_state) {
+ *   // Submission logic.
+ * }
+ * @endcode
+ *
+ * Or with any number of additional arguments:
+ * @code
+ * $extra = "extra";
+ * $form = drupal_get_form('my_module_example_form', $extra);
+ * ...
+ * function my_module_example_form($form, &$form_state, $extra) {
+ *   $form['submit'] = array(
+ *     '#type' => 'submit',
+ *     '#value' => $extra,
+ *   );
+ *   return $form;
+ * }
+ * @endcode
+ *
+ * The $form argument to form-related functions is a structured array containing
+ * the elements and properties of the form. For information on the array
+ * components and format, and more detailed explanations of the Form API
+ * workflow, see the
+ * @link forms_api_reference.html Form API reference @endlink
+ * and the
+ * @link http://drupal.org/node/37775 Form API documentation section. @endlink
+ * In addition, there is a set of Form API tutorials in
+ * @link form_example_tutorial.inc the Form Example Tutorial @endlink which
+ * provide basics all the way up through multistep forms.
+ *
+ * In the form builder, validation, submission, and other form functions,
+ * $form_state is the primary influence on the processing of the form and is
+ * passed by reference to most functions, so they use it to communicate with
+ * the form system and each other.
+ *
+ * See drupal_build_form() for documentation of $form_state keys.
+ */
+
+/**
+ * Returns a renderable form array for a given form ID.
+ *
+ * This function should be used instead of drupal_build_form() when $form_state
+ * is not needed (i.e., when initially rendering the form) and is often
+ * used as a menu callback.
+ *
+ * @param $form_id
+ *   The unique string identifying the desired form. If a function with that
+ *   name exists, it is called to build the form array. Modules that need to
+ *   generate the same form (or very similar forms) using different $form_ids
+ *   can implement hook_forms(), which maps different $form_id values to the
+ *   proper form constructor function. Examples may be found in node_forms(),
+ *   and search_forms().
+ * @param ...
+ *   Any additional arguments are passed on to the functions called by
+ *   drupal_get_form(), including the unique form constructor function. For
+ *   example, the node_edit form requires that a node object is passed in here
+ *   when it is called. These are available to implementations of
+ *   hook_form_alter() and hook_form_FORM_ID_alter() as the array
+ *   $form_state['build_info']['args'].
+ *
+ * @return
+ *   The form array.
+ *
+ * @see drupal_build_form()
+ */
+function drupal_get_form($form_id) {
+  $form_state = array();
+
+  $args = func_get_args();
+  // Remove $form_id from the arguments.
+  array_shift($args);
+  $form_state['build_info']['args'] = $args;
+
+  return drupal_build_form($form_id, $form_state);
+}
+
+/**
+ * Builds and process a form based on a form id.
+ *
+ * The form may also be retrieved from the cache if the form was built in a
+ * previous page-load. The form is then passed on for processing, validation
+ * and submission if there is proper input.
+ *
+ * @param $form_id
+ *   The unique string identifying the desired form. If a function with that
+ *   name exists, it is called to build the form array. Modules that need to
+ *   generate the same form (or very similar forms) using different $form_ids
+ *   can implement hook_forms(), which maps different $form_id values to the
+ *   proper form constructor function. Examples may be found in node_forms(),
+ *   and search_forms().
+ * @param $form_state
+ *   An array which stores information about the form. This is passed as a
+ *   reference so that the caller can use it to examine what in the form changed
+ *   when the form submission process is complete. Furthermore, it may be used
+ *   to store information related to the processed data in the form, which will
+ *   persist across page requests when the 'cache' or 'rebuild' flag is set.
+ *   The following parameters may be set in $form_state to affect how the form
+ *   is rendered:
+ *   - build_info: Internal. An associative array of information stored by Form
+ *     API that is necessary to build and rebuild the form from cache when the
+ *     original context may no longer be available:
+ *     - args: A list of arguments to pass to the form constructor.
+ *     - files: An optional array defining include files that need to be loaded
+ *       for building the form. Each array entry may be the path to a file or
+ *       another array containing values for the parameters 'type', 'module' and
+ *       'name' as needed by module_load_include(). The files listed here are
+ *       automatically loaded by form_get_cache(). By default the current menu
+ *       router item's 'file' definition is added, if any. Use
+ *       form_load_include() to add include files from a form constructor.
+ *     - form_id: Identification of the primary form being constructed and
+ *       processed.
+ *     - base_form_id: Identification for a base form, as declared in a
+ *       hook_forms() implementation.
+ *   - rebuild_info: Internal. Similar to 'build_info', but pertaining to
+ *     drupal_rebuild_form().
+ *   - rebuild: Normally, after the entire form processing is completed and
+ *     submit handlers have run, a form is considered to be done and
+ *     drupal_redirect_form() will redirect the user to a new page using a GET
+ *     request (so a browser refresh does not re-submit the form). However, if
+ *     'rebuild' has been set to TRUE, then a new copy of the form is
+ *     immediately built and sent to the browser, instead of a redirect. This is
+ *     used for multi-step forms, such as wizards and confirmation forms.
+ *     Normally, $form_state['rebuild'] is set by a submit handler, since it is
+ *     usually logic within a submit handler that determines whether a form is
+ *     done or requires another step. However, a validation handler may already
+ *     set $form_state['rebuild'] to cause the form processing to bypass submit
+ *     handlers and rebuild the form instead, even if there are no validation
+ *     errors.
+ *   - redirect: Used to redirect the form on submission. It may either be a
+ *     string containing the destination URL, or an array of arguments
+ *     compatible with drupal_goto(). See drupal_redirect_form() for complete
+ *     information.
+ *   - no_redirect: If set to TRUE the form will NOT perform a drupal_goto(),
+ *     even if 'redirect' is set.
+ *   - method: The HTTP form method to use for finding the input for this form.
+ *     May be 'post' or 'get'. Defaults to 'post'. Note that 'get' method
+ *     forms do not use form ids so are always considered to be submitted, which
+ *     can have unexpected effects. The 'get' method should only be used on
+ *     forms that do not change data, as that is exclusively the domain of
+ *     'post.'
+ *   - cache: If set to TRUE the original, unprocessed form structure will be
+ *     cached, which allows the entire form to be rebuilt from cache. A typical
+ *     form workflow involves two page requests; first, a form is built and
+ *     rendered for the user to fill in. Then, the user fills the form in and
+ *     submits it, triggering a second page request in which the form must be
+ *     built and processed. By default, $form and $form_state are built from
+ *     scratch during each of these page requests. Often, it is necessary or
+ *     desired to persist the $form and $form_state variables from the initial
+ *     page request to the one that processes the submission. 'cache' can be set
+ *     to TRUE to do this. A prominent example is an Ajax-enabled form, in which
+ *     ajax_process_form() enables form caching for all forms that include an
+ *     element with the #ajax property. (The Ajax handler has no way to build
+ *     the form itself, so must rely on the cached version.) Note that the
+ *     persistence of $form and $form_state happens automatically for
+ *     (multi-step) forms having the 'rebuild' flag set, regardless of the value
+ *     for 'cache'.
+ *   - no_cache: If set to TRUE the form will NOT be cached, even if 'cache' is
+ *     set.
+ *   - values: An associative array of values submitted to the form. The
+ *     validation functions and submit functions use this array for nearly all
+ *     their decision making. (Note that #tree determines whether the values are
+ *     a flat array or an array whose structure parallels the $form array. See
+ *     @link forms_api_reference.html Form API reference @endlink for more
+ *     information.) These are raw and unvalidated, so should not be used
+ *     without a thorough understanding of security implications. In almost all
+ *     cases, code should use the data in the 'values' array exclusively. The
+ *     most common use of this key is for multi-step forms that need to clear
+ *     some of the user input when setting 'rebuild'. The values correspond to
+ *     $_POST or $_GET, depending on the 'method' chosen.
+ *   - always_process: If TRUE and the method is GET, a form_id is not
+ *     necessary. This should only be used on RESTful GET forms that do NOT
+ *     write data, as this could lead to security issues. It is useful so that
+ *     searches do not need to have a form_id in their query arguments to
+ *     trigger the search.
+ *   - must_validate: Ordinarily, a form is only validated once, but there are
+ *     times when a form is resubmitted internally and should be validated
+ *     again. Setting this to TRUE will force that to happen. This is most
+ *     likely to occur during Ajax operations.
+ *   - programmed: If TRUE, the form was submitted programmatically, usually
+ *     invoked via drupal_form_submit(). Defaults to FALSE.
+ *   - process_input: Boolean flag. TRUE signifies correct form submission.
+ *     This is always TRUE for programmed forms coming from drupal_form_submit()
+ *     (see 'programmed' key), or if the form_id coming from the $_POST data is
+ *     set and matches the current form_id.
+ *   - submitted: If TRUE, the form has been submitted. Defaults to FALSE.
+ *   - executed: If TRUE, the form was submitted and has been processed and
+ *     executed. Defaults to FALSE.
+ *   - triggering_element: (read-only) The form element that triggered
+ *     submission. This is the same as the deprecated
+ *     $form_state['clicked_button']. It is the element that caused submission,
+ *     which may or may not be a button (in the case of Ajax forms). This key is
+ *     often used to distinguish between various buttons in a submit handler,
+ *     and is also used in Ajax handlers.
+ *   - clicked_button: Deprecated. Use triggering_element instead.
+ *   - has_file_element: Internal. If TRUE, there is a file element and Form API
+ *     will set the appropriate 'enctype' HTML attribute on the form.
+ *   - groups: Internal. An array containing references to fieldsets to render
+ *     them within vertical tabs.
+ *   - storage: $form_state['storage'] is not a special key, and no specific
+ *     support is provided for it in the Form API. By tradition it was
+ *     the location where application-specific data was stored for communication
+ *     between the submit, validation, and form builder functions, especially
+ *     in a multi-step-style form. Form implementations may use any key(s)
+ *     within $form_state (other than the keys listed here and other reserved
+ *     ones used by Form API internals) for this kind of storage. The
+ *     recommended way to ensure that the chosen key doesn't conflict with ones
+ *     used by the Form API or other modules is to use the module name as the
+ *     key name or a prefix for the key name. For example, the Node module uses
+ *     $form_state['node'] in node editing forms to store information about the
+ *     node being edited, and this information stays available across successive
+ *     clicks of the "Preview" button as well as when the "Save" button is
+ *     finally clicked.
+ *   - buttons: A list containing copies of all submit and button elements in
+ *     the form.
+ *   - complete form: A reference to the $form variable containing the complete
+ *     form structure. #process, #after_build, #element_validate, and other
+ *     handlers being invoked on a form element may use this reference to access
+ *     other information in the form the element is contained in.
+ *   - temporary: An array holding temporary data accessible during the current
+ *     page request only. All $form_state properties that are not reserved keys
+ *     (see form_state_keys_no_cache()) persist throughout a multistep form
+ *     sequence. Form API provides this key for modules to communicate
+ *     information across form-related functions during a single page request.
+ *     It may be used to temporarily save data that does not need to or should
+ *     not be cached during the whole form workflow; e.g., data that needs to be
+ *     accessed during the current form build process only. There is no use-case
+ *     for this functionality in Drupal core.
+ *   - wrapper_callback: Modules that wish to pre-populate certain forms with
+ *     common elements, such as back/next/save buttons in multi-step form
+ *     wizards, may define a form builder function name that returns a form
+ *     structure, which is passed on to the actual form builder function.
+ *     Such implementations may either define the 'wrapper_callback' via
+ *     hook_forms() or have to invoke drupal_build_form() (instead of
+ *     drupal_get_form()) on their own in a custom menu callback to prepare
+ *     $form_state accordingly.
+ *   Information on how certain $form_state properties control redirection
+ *   behavior after form submission may be found in drupal_redirect_form().
+ *
+ * @return
+ *   The rendered form. This function may also perform a redirect and hence may
+ *   not return at all, depending upon the $form_state flags that were set.
+ *
+ * @see drupal_redirect_form()
+ */
+function drupal_build_form($form_id, &$form_state) {
+  // Ensure some defaults; if already set they will not be overridden.
+  $form_state += form_state_defaults();
+
+  if (!isset($form_state['input'])) {
+    $form_state['input'] = $form_state['method'] == 'get' ? $_GET : $_POST;
+  }
+
+  if (isset($_SESSION['batch_form_state'])) {
+    // We've been redirected here after a batch processing. The form has
+    // already been processed, but needs to be rebuilt. See _batch_finished().
+    $form_state = $_SESSION['batch_form_state'];
+    unset($_SESSION['batch_form_state']);
+    return drupal_rebuild_form($form_id, $form_state);
+  }
+
+  // If the incoming input contains a form_build_id, we'll check the cache for a
+  // copy of the form in question. If it's there, we don't have to rebuild the
+  // form to proceed. In addition, if there is stored form_state data from a
+  // previous step, we'll retrieve it so it can be passed on to the form
+  // processing code.
+  $check_cache = isset($form_state['input']['form_id']) && $form_state['input']['form_id'] == $form_id && !empty($form_state['input']['form_build_id']);
+  if ($check_cache) {
+    $form = form_get_cache($form_state['input']['form_build_id'], $form_state);
+  }
+
+  // If the previous bit of code didn't result in a populated $form object, we
+  // are hitting the form for the first time and we need to build it from
+  // scratch.
+  if (!isset($form)) {
+    // If we attempted to serve the form from cache, uncacheable $form_state
+    // keys need to be removed after retrieving and preparing the form, except
+    // any that were already set prior to retrieving the form.
+    if ($check_cache) {
+      $form_state_before_retrieval = $form_state;
+    }
+
+    $form = drupal_retrieve_form($form_id, $form_state);
+    drupal_prepare_form($form_id, $form, $form_state);
+
+    // form_set_cache() removes uncacheable $form_state keys defined in
+    // form_state_keys_no_cache() in order for multi-step forms to work
+    // properly. This means that form processing logic for single-step forms
+    // using $form_state['cache'] may depend on data stored in those keys
+    // during drupal_retrieve_form()/drupal_prepare_form(), but form
+    // processing should not depend on whether the form is cached or not, so
+    // $form_state is adjusted to match what it would be after a
+    // form_set_cache()/form_get_cache() sequence. These exceptions are
+    // allowed to survive here:
+    // - always_process: Does not make sense in conjunction with form caching
+    //   in the first place, since passing form_build_id as a GET parameter is
+    //   not desired.
+    // - temporary: Any assigned data is expected to survives within the same
+    //   page request.
+    if ($check_cache) {
+      $uncacheable_keys = array_flip(array_diff(form_state_keys_no_cache(), array('always_process', 'temporary')));
+      $form_state = array_diff_key($form_state, $uncacheable_keys);
+      $form_state += $form_state_before_retrieval;
+    }
+  }
+
+  // Now that we have a constructed form, process it. This is where:
+  // - Element #process functions get called to further refine $form.
+  // - User input, if any, gets incorporated in the #value property of the
+  //   corresponding elements and into $form_state['values'].
+  // - Validation and submission handlers are called.
+  // - If this submission is part of a multistep workflow, the form is rebuilt
+  //   to contain the information of the next step.
+  // - If necessary, the form and form state are cached or re-cached, so that
+  //   appropriate information persists to the next page request.
+  // All of the handlers in the pipeline receive $form_state by reference and
+  // can use it to know or update information about the state of the form.
+  drupal_process_form($form_id, $form, $form_state);
+
+  // If this was a successful submission of a single-step form or the last step
+  // of a multi-step form, then drupal_process_form() issued a redirect to
+  // another page, or back to this page, but as a new request. Therefore, if
+  // we're here, it means that this is either a form being viewed initially
+  // before any user input, or there was a validation error requiring the form
+  // to be re-displayed, or we're in a multi-step workflow and need to display
+  // the form's next step. In any case, we have what we need in $form, and can
+  // return it for rendering.
+  return $form;
+}
+
+/**
+ * Retrieves default values for the $form_state array.
+ */
+function form_state_defaults() {
+  return array(
+    'rebuild' => FALSE,
+    'rebuild_info' => array(),
+    'redirect' => NULL,
+    // @todo 'args' is usually set, so no other default 'build_info' keys are
+    //   appended via += form_state_defaults().
+    'build_info' => array(
+      'args' => array(),
+      'files' => array(),
+    ),
+    'temporary' => array(),
+    'submitted' => FALSE,
+    'executed' => FALSE,
+    'programmed' => FALSE,
+    'cache'=> FALSE,
+    'method' => 'post',
+    'groups' => array(),
+    'buttons' => array(),
+  );
+}
+
+/**
+ * Constructs a new $form from the information in $form_state.
+ *
+ * This is the key function for making multi-step forms advance from step to
+ * step. It is called by drupal_process_form() when all user input processing,
+ * including calling validation and submission handlers, for the request is
+ * finished. If a validate or submit handler set $form_state['rebuild'] to TRUE,
+ * and if other conditions don't preempt a rebuild from happening, then this
+ * function is called to generate a new $form, the next step in the form
+ * workflow, to be returned for rendering.
+ *
+ * Ajax form submissions are almost always multi-step workflows, so that is one
+ * common use-case during which form rebuilding occurs. See ajax_form_callback()
+ * for more information about creating Ajax-enabled forms.
+ *
+ * @param $form_id
+ *   The unique string identifying the desired form. If a function
+ *   with that name exists, it is called to build the form array.
+ *   Modules that need to generate the same form (or very similar forms)
+ *   using different $form_ids can implement hook_forms(), which maps
+ *   different $form_id values to the proper form constructor function. Examples
+ *   may be found in node_forms() and search_forms().
+ * @param $form_state
+ *   A keyed array containing the current state of the form.
+ * @param $old_form
+ *   (optional) A previously built $form. Used to retain the #build_id and
+ *   #action properties in Ajax callbacks and similar partial form rebuilds. The
+ *   only properties copied from $old_form are the ones which both exist in
+ *   $old_form and for which $form_state['rebuild_info']['copy'][PROPERTY] is
+ *   TRUE. If $old_form is not passed, the entire $form is rebuilt freshly.
+ *   'rebuild_info' needs to be a separate top-level property next to
+ *   'build_info', since the contained data must not be cached.
+ *
+ * @return
+ *   The newly built form.
+ *
+ * @see drupal_process_form()
+ * @see ajax_form_callback()
+ */
+function drupal_rebuild_form($form_id, &$form_state, $old_form = NULL) {
+  $form = drupal_retrieve_form($form_id, $form_state);
+
+  // If only parts of the form will be returned to the browser (e.g., Ajax or
+  // RIA clients), re-use the old #build_id to not require client-side code to
+  // manually update the hidden 'build_id' input element.
+  // Otherwise, a new #build_id is generated, to not clobber the previous
+  // build's data in the form cache; also allowing the user to go back to an
+  // earlier build, make changes, and re-submit.
+  // @see drupal_prepare_form()
+  if (isset($old_form['#build_id']) && !empty($form_state['rebuild_info']['copy']['#build_id'])) {
+    $form['#build_id'] = $old_form['#build_id'];
+  }
+  else {
+    $form['#build_id'] = 'form-' . drupal_random_key();
+  }
+
+  // #action defaults to request_uri(), but in case of Ajax and other partial
+  // rebuilds, the form is submitted to an alternate URL, and the original
+  // #action needs to be retained.
+  if (isset($old_form['#action']) && !empty($form_state['rebuild_info']['copy']['#action'])) {
+    $form['#action'] = $old_form['#action'];
+  }
+
+  drupal_prepare_form($form_id, $form, $form_state);
+
+  // Caching is normally done in drupal_process_form(), but what needs to be
+  // cached is the $form structure before it passes through form_builder(),
+  // so we need to do it here.
+  // @todo For Drupal 8, find a way to avoid this code duplication.
+  if (empty($form_state['no_cache'])) {
+    form_set_cache($form['#build_id'], $form, $form_state);
+  }
+
+  // Clear out all group associations as these might be different when
+  // re-rendering the form.
+  $form_state['groups'] = array();
+
+  // Return a fully built form that is ready for rendering.
+  return form_builder($form_id, $form, $form_state);
+}
+
+/**
+ * Fetches a form from cache.
+ */
+function form_get_cache($form_build_id, &$form_state) {
+  if ($cached = cache_get('form_' . $form_build_id, 'cache_form')) {
+    $form = $cached->data;
+
+    global $user;
+    if ((isset($form['#cache_token']) && drupal_valid_token($form['#cache_token'])) || (!isset($form['#cache_token']) && !$user->uid)) {
+      if ($cached = cache_get('form_state_' . $form_build_id, 'cache_form')) {
+        // Re-populate $form_state for subsequent rebuilds.
+        $form_state = $cached->data + $form_state;
+
+        // If the original form is contained in include files, load the files.
+        // @see form_load_include()
+        $form_state['build_info'] += array('files' => array());
+        foreach ($form_state['build_info']['files'] as $file) {
+          if (is_array($file)) {
+            $file += array('type' => 'inc', 'name' => $file['module']);
+            module_load_include($file['type'], $file['module'], $file['name']);
+          }
+          elseif (file_exists($file)) {
+            require_once DRUPAL_ROOT . '/' . $file;
+          }
+        }
+      }
+      return $form;
+    }
+  }
+}
+
+/**
+ * Stores a form in the cache.
+ */
+function form_set_cache($form_build_id, $form, $form_state) {
+  // 6 hours cache life time for forms should be plenty.
+  $expire = 21600;
+
+  // Cache form structure.
+  if (isset($form)) {
+    if ($GLOBALS['user']->uid) {
+      $form['#cache_token'] = drupal_get_token();
+    }
+    cache_set('form_' . $form_build_id, $form, 'cache_form', REQUEST_TIME + $expire);
+  }
+
+  // Cache form state.
+  if ($data = array_diff_key($form_state, array_flip(form_state_keys_no_cache()))) {
+    cache_set('form_state_' . $form_build_id, $data, 'cache_form', REQUEST_TIME + $expire);
+  }
+}
+
+/**
+ * Returns an array of $form_state keys that shouldn't be cached.
+ */
+function form_state_keys_no_cache() {
+  return array(
+    // Public properties defined by form constructors and form handlers.
+    'always_process',
+    'must_validate',
+    'rebuild',
+    'rebuild_info',
+    'redirect',
+    'no_redirect',
+    'temporary',
+    // Internal properties defined by form processing.
+    'buttons',
+    'triggering_element',
+    'clicked_button',
+    'complete form',
+    'groups',
+    'input',
+    'method',
+    'submit_handlers',
+    'submitted',
+    'executed',
+    'validate_handlers',
+    'values',
+  );
+}
+
+/**
+ * Ensures an include file is loaded whenever the form is processed.
+ *
+ * Example:
+ * @code
+ *   // Load node.admin.inc from Node module.
+ *   form_load_include($form_state, 'inc', 'node', 'node.admin');
+ * @endcode
+ *
+ * Use this function instead of module_load_include() from inside a form
+ * constructor or any form processing logic as it ensures that the include file
+ * is loaded whenever the form is processed. In contrast to using
+ * module_load_include() directly, form_load_include() makes sure the include
+ * file is correctly loaded also if the form is cached.
+ *
+ * @param $form_state
+ *   The current state of the form.
+ * @param $type
+ *   The include file's type (file extension).
+ * @param $module
+ *   The module to which the include file belongs.
+ * @param $name
+ *   (optional) The base file name (without the $type extension). If omitted,
+ *   $module is used; i.e., resulting in "$module.$type" by default.
+ *
+ * @return
+ *   The filepath of the loaded include file, or FALSE if the include file was
+ *   not found or has been loaded already.
+ *
+ * @see module_load_include()
+ */
+function form_load_include(&$form_state, $type, $module, $name = NULL) {
+  if (!isset($name)) {
+    $name = $module;
+  }
+  if (!isset($form_state['build_info']['files']["$module:$name.$type"])) {
+    // Only add successfully included files to the form state.
+    if ($result = module_load_include($type, $module, $name)) {
+      $form_state['build_info']['files']["$module:$name.$type"] = array(
+        'type' => $type,
+        'module' => $module,
+        'name' => $name,
+      );
+      return $result;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Retrieves, populates, and processes a form.
+ *
+ * This function allows you to supply values for form elements and submit a
+ * form for processing. Compare to drupal_get_form(), which also builds and
+ * processes a form, but does not allow you to supply values.
+ *
+ * There is no return value, but you can check to see if there are errors
+ * by calling form_get_errors().
+ *
+ * @param $form_id
+ *   The unique string identifying the desired form. If a function
+ *   with that name exists, it is called to build the form array.
+ *   Modules that need to generate the same form (or very similar forms)
+ *   using different $form_ids can implement hook_forms(), which maps
+ *   different $form_id values to the proper form constructor function. Examples
+ *   may be found in node_forms() and search_forms().
+ * @param $form_state
+ *   A keyed array containing the current state of the form. Most important is
+ *   the $form_state['values'] collection, a tree of data used to simulate the
+ *   incoming $_POST information from a user's form submission. If a key is not
+ *   filled in $form_state['values'], then the default value of the respective
+ *   element is used. To submit an unchecked checkbox or other control that
+ *   browsers submit by not having a $_POST entry, include the key, but set the
+ *   value to NULL.
+ * @param ...
+ *   Any additional arguments are passed on to the functions called by
+ *   drupal_form_submit(), including the unique form constructor function.
+ *   For example, the node_edit form requires that a node object be passed
+ *   in here when it is called. Arguments that need to be passed by reference
+ *   should not be included here, but rather placed directly in the $form_state
+ *   build info array so that the reference can be preserved. For example, a
+ *   form builder function with the following signature:
+ *   @code
+ *   function mymodule_form($form, &$form_state, &$object) {
+ *   }
+ *   @endcode
+ *   would be called via drupal_form_submit() as follows:
+ *   @code
+ *   $form_state['values'] = $my_form_values;
+ *   $form_state['build_info']['args'] = array(&$object);
+ *   drupal_form_submit('mymodule_form', $form_state);
+ *   @endcode
+ * For example:
+ * @code
+ * // register a new user
+ * $form_state = array();
+ * $form_state['values']['name'] = 'robo-user';
+ * $form_state['values']['mail'] = 'robouser@example.com';
+ * $form_state['values']['pass']['pass1'] = 'password';
+ * $form_state['values']['pass']['pass2'] = 'password';
+ * $form_state['values']['op'] = t('Create new account');
+ * drupal_form_submit('user_register_form', $form_state);
+ * @endcode
+ */
+function drupal_form_submit($form_id, &$form_state) {
+  if (!isset($form_state['build_info']['args'])) {
+    $args = func_get_args();
+    array_shift($args);
+    array_shift($args);
+    $form_state['build_info']['args'] = $args;
+  }
+  // Merge in default values.
+  $form_state += form_state_defaults();
+
+  // Populate $form_state['input'] with the submitted values before retrieving
+  // the form, to be consistent with what drupal_build_form() does for
+  // non-programmatic submissions (form builder functions may expect it to be
+  // there).
+  $form_state['input'] = $form_state['values'];
+
+  $form_state['programmed'] = TRUE;
+  $form = drupal_retrieve_form($form_id, $form_state);
+  // Programmed forms are always submitted.
+  $form_state['submitted'] = TRUE;
+
+  // Reset form validation.
+  $form_state['must_validate'] = TRUE;
+  form_clear_error();
+
+  drupal_prepare_form($form_id, $form, $form_state);
+  drupal_process_form($form_id, $form, $form_state);
+}
+
+/**
+ * Retrieves the structured array that defines a given form.
+ *
+ * @param $form_id
+ *   The unique string identifying the desired form. If a function
+ *   with that name exists, it is called to build the form array.
+ *   Modules that need to generate the same form (or very similar forms)
+ *   using different $form_ids can implement hook_forms(), which maps
+ *   different $form_id values to the proper form constructor function.
+ * @param $form_state
+ *   A keyed array containing the current state of the form, including the
+ *   additional arguments to drupal_get_form() or drupal_form_submit() in the
+ *   'args' component of the array.
+ */
+function drupal_retrieve_form($form_id, &$form_state) {
+  $forms = &drupal_static(__FUNCTION__);
+
+  // Record the $form_id.
+  $form_state['build_info']['form_id'] = $form_id;
+
+  // Record the filepath of the include file containing the original form, so
+  // the form builder callbacks can be loaded when the form is being rebuilt
+  // from cache on a different path (such as 'system/ajax'). See
+  // form_get_cache(). Don't do this in maintenance mode as Drupal may not be
+  // fully bootstrapped (i.e. during installation) in which case
+  // menu_get_item() is not available.
+  if (!isset($form_state['build_info']['files']['menu']) && !defined('MAINTENANCE_MODE')) {
+    $item = menu_get_item();
+    if (!empty($item['include_file'])) {
+      // Do not use form_load_include() here, as the file is already loaded.
+      // Anyway, form_get_cache() is able to handle filepaths too.
+      $form_state['build_info']['files']['menu'] = $item['include_file'];
+    }
+  }
+
+  // We save two copies of the incoming arguments: one for modules to use
+  // when mapping form ids to constructor functions, and another to pass to
+  // the constructor function itself.
+  $args = $form_state['build_info']['args'];
+
+  // We first check to see if there's a function named after the $form_id.
+  // If there is, we simply pass the arguments on to it to get the form.
+  if (!function_exists($form_id)) {
+    // In cases where many form_ids need to share a central constructor function,
+    // such as the node editing form, modules can implement hook_forms(). It
+    // maps one or more form_ids to the correct constructor functions.
+    //
+    // We cache the results of that hook to save time, but that only works
+    // for modules that know all their form_ids in advance. (A module that
+    // adds a small 'rate this comment' form to each comment in a list
+    // would need a unique form_id for each one, for example.)
+    //
+    // So, we call the hook if $forms isn't yet populated, OR if it doesn't
+    // yet have an entry for the requested form_id.
+    if (!isset($forms) || !isset($forms[$form_id])) {
+      $forms = module_invoke_all('forms', $form_id, $args);
+    }
+    $form_definition = $forms[$form_id];
+    if (isset($form_definition['callback arguments'])) {
+      $args = array_merge($form_definition['callback arguments'], $args);
+    }
+    if (isset($form_definition['callback'])) {
+      $callback = $form_definition['callback'];
+      $form_state['build_info']['base_form_id'] = $callback;
+    }
+    // In case $form_state['wrapper_callback'] is not defined already, we also
+    // allow hook_forms() to define one.
+    if (!isset($form_state['wrapper_callback']) && isset($form_definition['wrapper_callback'])) {
+      $form_state['wrapper_callback'] = $form_definition['wrapper_callback'];
+    }
+  }
+
+  $form = array();
+  // We need to pass $form_state by reference in order for forms to modify it,
+  // since call_user_func_array() requires that referenced variables are passed
+  // explicitly.
+  $args = array_merge(array($form, &$form_state), $args);
+
+  // When the passed $form_state (not using drupal_get_form()) defines a
+  // 'wrapper_callback', then it requests to invoke a separate (wrapping) form
+  // builder function to pre-populate the $form array with form elements, which
+  // the actual form builder function ($callback) expects. This allows for
+  // pre-populating a form with common elements for certain forms, such as
+  // back/next/save buttons in multi-step form wizards. See drupal_build_form().
+  if (isset($form_state['wrapper_callback']) && function_exists($form_state['wrapper_callback'])) {
+    $form = call_user_func_array($form_state['wrapper_callback'], $args);
+    // Put the prepopulated $form into $args.
+    $args[0] = $form;
+  }
+
+  // If $callback was returned by a hook_forms() implementation, call it.
+  // Otherwise, call the function named after the form id.
+  $form = call_user_func_array(isset($callback) ? $callback : $form_id, $args);
+  $form['#form_id'] = $form_id;
+
+  return $form;
+}
+
+/**
+ * Processes a form submission.
+ *
+ * This function is the heart of form API. The form gets built, validated and in
+ * appropriate cases, submitted and rebuilt.
+ *
+ * @param $form_id
+ *   The unique string identifying the current form.
+ * @param $form
+ *   An associative array containing the structure of the form.
+ * @param $form_state
+ *   A keyed array containing the current state of the form. This
+ *   includes the current persistent storage data for the form, and
+ *   any data passed along by earlier steps when displaying a
+ *   multi-step form. Additional information, like the sanitized $_POST
+ *   data, is also accumulated here.
+ */
+function drupal_process_form($form_id, &$form, &$form_state) {
+  $form_state['values'] = array();
+
+  // With $_GET, these forms are always submitted if requested.
+  if ($form_state['method'] == 'get' && !empty($form_state['always_process'])) {
+    if (!isset($form_state['input']['form_build_id'])) {
+      $form_state['input']['form_build_id'] = $form['#build_id'];
+    }
+    if (!isset($form_state['input']['form_id'])) {
+      $form_state['input']['form_id'] = $form_id;
+    }
+    if (!isset($form_state['input']['form_token']) && isset($form['#token'])) {
+      $form_state['input']['form_token'] = drupal_get_token($form['#token']);
+    }
+  }
+
+  // form_builder() finishes building the form by calling element #process
+  // functions and mapping user input, if any, to #value properties, and also
+  // storing the values in $form_state['values']. We need to retain the
+  // unprocessed $form in case it needs to be cached.
+  $unprocessed_form = $form;
+  $form = form_builder($form_id, $form, $form_state);
+
+  // Only process the input if we have a correct form submission.
+  if ($form_state['process_input']) {
+    drupal_validate_form($form_id, $form, $form_state);
+
+    // drupal_html_id() maintains a cache of element IDs it has seen,
+    // so it can prevent duplicates. We want to be sure we reset that
+    // cache when a form is processed, so scenarios that result in
+    // the form being built behind the scenes and again for the
+    // browser don't increment all the element IDs needlessly.
+    if (!form_get_errors()) {
+      // In case of errors, do not break HTML IDs of other forms.
+      drupal_static_reset('drupal_html_id');
+    }
+
+    if ($form_state['submitted'] && !form_get_errors() && !$form_state['rebuild']) {
+      // Execute form submit handlers.
+      form_execute_handlers('submit', $form, $form_state);
+
+      // We'll clear out the cached copies of the form and its stored data
+      // here, as we've finished with them. The in-memory copies are still
+      // here, though.
+      if (!variable_get('cache', 0) && !empty($form_state['values']['form_build_id'])) {
+        cache_clear_all('form_' . $form_state['values']['form_build_id'], 'cache_form');
+        cache_clear_all('form_state_' . $form_state['values']['form_build_id'], 'cache_form');
+      }
+
+      // If batches were set in the submit handlers, we process them now,
+      // possibly ending execution. We make sure we do not react to the batch
+      // that is already being processed (if a batch operation performs a
+      // drupal_form_submit).
+      if ($batch =& batch_get() && !isset($batch['current_set'])) {
+        // Store $form_state information in the batch definition.
+        // We need the full $form_state when either:
+        // - Some submit handlers were saved to be called during batch
+        //   processing. See form_execute_handlers().
+        // - The form is multistep.
+        // In other cases, we only need the information expected by
+        // drupal_redirect_form().
+        if ($batch['has_form_submits'] || !empty($form_state['rebuild'])) {
+          $batch['form_state'] = $form_state;
+        }
+        else {
+          $batch['form_state'] = array_intersect_key($form_state, array_flip(array('programmed', 'rebuild', 'storage', 'no_redirect', 'redirect')));
+        }
+
+        $batch['progressive'] = !$form_state['programmed'];
+        batch_process();
+
+        // Execution continues only for programmatic forms.
+        // For 'regular' forms, we get redirected to the batch processing
+        // page. Form redirection will be handled in _batch_finished(),
+        // after the batch is processed.
+      }
+
+      // Set a flag to indicate the the form has been processed and executed.
+      $form_state['executed'] = TRUE;
+
+      // Redirect the form based on values in $form_state.
+      drupal_redirect_form($form_state);
+    }
+
+    // Don't rebuild or cache form submissions invoked via drupal_form_submit().
+    if (!empty($form_state['programmed'])) {
+      return;
+    }
+
+    // If $form_state['rebuild'] has been set and input has been processed
+    // without validation errors, we are in a multi-step workflow that is not
+    // yet complete. A new $form needs to be constructed based on the changes
+    // made to $form_state during this request. Normally, a submit handler sets
+    // $form_state['rebuild'] if a fully executed form requires another step.
+    // However, for forms that have not been fully executed (e.g., Ajax
+    // submissions triggered by non-buttons), there is no submit handler to set
+    // $form_state['rebuild']. It would not make sense to redisplay the
+    // identical form without an error for the user to correct, so we also
+    // rebuild error-free non-executed forms, regardless of
+    // $form_state['rebuild'].
+    // @todo D8: Simplify this logic; considering Ajax and non-HTML front-ends,
+    //   along with element-level #submit properties, it makes no sense to have
+    //   divergent form execution based on whether the triggering element has
+    //   #executes_submit_callback set to TRUE.
+    if (($form_state['rebuild'] || !$form_state['executed']) && !form_get_errors()) {
+      // Form building functions (e.g., _form_builder_handle_input_element())
+      // may use $form_state['rebuild'] to determine if they are running in the
+      // context of a rebuild, so ensure it is set.
+      $form_state['rebuild'] = TRUE;
+      $form = drupal_rebuild_form($form_id, $form_state, $form);
+    }
+  }
+
+  // After processing the form, the form builder or a #process callback may
+  // have set $form_state['cache'] to indicate that the form and form state
+  // shall be cached. But the form may only be cached if the 'no_cache' property
+  // is not set to TRUE. Only cache $form as it was prior to form_builder(),
+  // because form_builder() must run for each request to accommodate new user
+  // input. Rebuilt forms are not cached here, because drupal_rebuild_form()
+  // already takes care of that.
+  if (!$form_state['rebuild'] && $form_state['cache'] && empty($form_state['no_cache'])) {
+    form_set_cache($form['#build_id'], $unprocessed_form, $form_state);
+  }
+}
+
+/**
+ * Prepares a structured form array.
+ *
+ * Adds required elements, executes any hook_form_alter functions, and
+ * optionally inserts a validation token to prevent tampering.
+ *
+ * @param $form_id
+ *   A unique string identifying the form for validation, submission,
+ *   theming, and hook_form_alter functions.
+ * @param $form
+ *   An associative array containing the structure of the form.
+ * @param $form_state
+ *   A keyed array containing the current state of the form. Passed
+ *   in here so that hook_form_alter() calls can use it, as well.
+ */
+function drupal_prepare_form($form_id, &$form, &$form_state) {
+  global $user;
+
+  $form['#type'] = 'form';
+  $form_state['programmed'] = isset($form_state['programmed']) ? $form_state['programmed'] : FALSE;
+
+  // Fix the form method, if it is 'get' in $form_state, but not in $form.
+  if ($form_state['method'] == 'get' && !isset($form['#method'])) {
+    $form['#method'] = 'get';
+  }
+
+  // Generate a new #build_id for this form, if none has been set already. The
+  // form_build_id is used as key to cache a particular build of the form. For
+  // multi-step forms, this allows the user to go back to an earlier build, make
+  // changes, and re-submit.
+  // @see drupal_build_form()
+  // @see drupal_rebuild_form()
+  if (!isset($form['#build_id'])) {
+    $form['#build_id'] = 'form-' . drupal_random_key();
+  }
+  $form['form_build_id'] = array(
+    '#type' => 'hidden',
+    '#value' => $form['#build_id'],
+    '#id' => $form['#build_id'],
+    '#name' => 'form_build_id',
+    // Form processing and validation requires this value, so ensure the
+    // submitted form value appears literally, regardless of custom #tree
+    // and #parents being set elsewhere.
+    '#parents' => array('form_build_id'),
+  );
+
+  // Add a token, based on either #token or form_id, to any form displayed to
+  // authenticated users. This ensures that any submitted form was actually
+  // requested previously by the user and protects against cross site request
+  // forgeries.
+  // This does not apply to programmatically submitted forms. Furthermore, since
+  // tokens are session-bound and forms displayed to anonymous users are very
+  // likely cached, we cannot assign a token for them.
+  // During installation, there is no $user yet.
+  if (!empty($user->uid) && !$form_state['programmed']) {
+    // Form constructors may explicitly set #token to FALSE when cross site
+    // request forgery is irrelevant to the form, such as search forms.
+    if (isset($form['#token']) && $form['#token'] === FALSE) {
+      unset($form['#token']);
+    }
+    // Otherwise, generate a public token based on the form id.
+    else {
+      $form['#token'] = $form_id;
+      $form['form_token'] = array(
+        '#id' => drupal_html_id('edit-' . $form_id . '-form-token'),
+        '#type' => 'token',
+        '#default_value' => drupal_get_token($form['#token']),
+        // Form processing and validation requires this value, so ensure the
+        // submitted form value appears literally, regardless of custom #tree
+        // and #parents being set elsewhere.
+        '#parents' => array('form_token'),
+      );
+    }
+  }
+
+  if (isset($form_id)) {
+    $form['form_id'] = array(
+      '#type' => 'hidden',
+      '#value' => $form_id,
+      '#id' => drupal_html_id("edit-$form_id"),
+      // Form processing and validation requires this value, so ensure the
+      // submitted form value appears literally, regardless of custom #tree
+      // and #parents being set elsewhere.
+      '#parents' => array('form_id'),
+    );
+  }
+  if (!isset($form['#id'])) {
+    $form['#id'] = drupal_html_id($form_id);
+  }
+
+  $form += element_info('form');
+  $form += array('#tree' => FALSE, '#parents' => array());
+
+  if (!isset($form['#validate'])) {
+    // Ensure that modules can rely on #validate being set.
+    $form['#validate'] = array();
+    // Check for a handler specific to $form_id.
+    if (function_exists($form_id . '_validate')) {
+      $form['#validate'][] = $form_id . '_validate';
+    }
+    // Otherwise check whether this is a shared form and whether there is a
+    // handler for the shared $form_id.
+    elseif (isset($form_state['build_info']['base_form_id']) && function_exists($form_state['build_info']['base_form_id'] . '_validate')) {
+      $form['#validate'][] = $form_state['build_info']['base_form_id'] . '_validate';
+    }
+  }
+
+  if (!isset($form['#submit'])) {
+    // Ensure that modules can rely on #submit being set.
+    $form['#submit'] = array();
+    // Check for a handler specific to $form_id.
+    if (function_exists($form_id . '_submit')) {
+      $form['#submit'][] = $form_id . '_submit';
+    }
+    // Otherwise check whether this is a shared form and whether there is a
+    // handler for the shared $form_id.
+    elseif (isset($form_state['build_info']['base_form_id']) && function_exists($form_state['build_info']['base_form_id'] . '_submit')) {
+      $form['#submit'][] = $form_state['build_info']['base_form_id'] . '_submit';
+    }
+  }
+
+  // If no #theme has been set, automatically apply theme suggestions.
+  // theme_form() itself is in #theme_wrappers and not #theme. Therefore, the
+  // #theme function only has to care for rendering the inner form elements,
+  // not the form itself.
+  if (!isset($form['#theme'])) {
+    $form['#theme'] = array($form_id);
+    if (isset($form_state['build_info']['base_form_id'])) {
+      $form['#theme'][] = $form_state['build_info']['base_form_id'];
+    }
+  }
+
+  // Invoke hook_form_alter(), hook_form_BASE_FORM_ID_alter(), and
+  // hook_form_FORM_ID_alter() implementations.
+  $hooks = array('form');
+  if (isset($form_state['build_info']['base_form_id'])) {
+    $hooks[] = 'form_' . $form_state['build_info']['base_form_id'];
+  }
+  $hooks[] = 'form_' . $form_id;
+  drupal_alter($hooks, $form, $form_state, $form_id);
+}
+
+
+/**
+ * Validates user-submitted form data in the $form_state array.
+ *
+ * @param $form_id
+ *   A unique string identifying the form for validation, submission,
+ *   theming, and hook_form_alter functions.
+ * @param $form
+ *   An associative array containing the structure of the form, which is passed
+ *   by reference. Form validation handlers are able to alter the form structure
+ *   (like #process and #after_build callbacks during form building) in case of
+ *   a validation error. If a validation handler alters the form structure, it
+ *   is responsible for validating the values of changed form elements in
+ *   $form_state['values'] to prevent form submit handlers from receiving
+ *   unvalidated values.
+ * @param $form_state
+ *   A keyed array containing the current state of the form. The current
+ *   user-submitted data is stored in $form_state['values'], though
+ *   form validation functions are passed an explicit copy of the
+ *   values for the sake of simplicity. Validation handlers can also use
+ *   $form_state to pass information on to submit handlers. For example:
+ *     $form_state['data_for_submission'] = $data;
+ *   This technique is useful when validation requires file parsing,
+ *   web service requests, or other expensive requests that should
+ *   not be repeated in the submission step.
+ */
+function drupal_validate_form($form_id, &$form, &$form_state) {
+  $validated_forms = &drupal_static(__FUNCTION__, array());
+
+  if (isset($validated_forms[$form_id]) && empty($form_state['must_validate'])) {
+    return;
+  }
+
+  // If the session token was set by drupal_prepare_form(), ensure that it
+  // matches the current user's session.
+  if (isset($form['#token'])) {
+    if (!drupal_valid_token($form_state['values']['form_token'], $form['#token'])) {
+      $path = current_path();
+      $query = drupal_get_query_parameters();
+      $url = url($path, array('query' => $query));
+
+      // Setting this error will cause the form to fail validation.
+      form_set_error('form_token', t('The form has become outdated. Copy any unsaved work in the form below and then <a href="@link">reload this page</a>.', array('@link' => $url)));
+
+      // Stop here and don't run any further validation handlers, because they
+      // could invoke non-safe operations which opens the door for CSRF
+      // vulnerabilities.
+      $validated_forms[$form_id] = TRUE;
+      return;
+    }
+  }
+
+  _form_validate($form, $form_state, $form_id);
+  $validated_forms[$form_id] = TRUE;
+
+  // If validation errors are limited then remove any non validated form values,
+  // so that only values that passed validation are left for submit callbacks.
+  if (isset($form_state['triggering_element']['#limit_validation_errors']) && $form_state['triggering_element']['#limit_validation_errors'] !== FALSE) {
+    $values = array();
+    foreach ($form_state['triggering_element']['#limit_validation_errors'] as $section) {
+      // If the section exists within $form_state['values'], even if the value
+      // is NULL, copy it to $values.
+      $section_exists = NULL;
+      $value = drupal_array_get_nested_value($form_state['values'], $section, $section_exists);
+      if ($section_exists) {
+        drupal_array_set_nested_value($values, $section, $value);
+      }
+    }
+    // A button's #value does not require validation, so for convenience we
+    // allow the value of the clicked button to be retained in its normal
+    // $form_state['values'] locations, even if these locations are not included
+    // in #limit_validation_errors.
+    if (isset($form_state['triggering_element']['#button_type'])) {
+      $button_value = $form_state['triggering_element']['#value'];
+
+      // Like all input controls, the button value may be in the location
+      // dictated by #parents. If it is, copy it to $values, but do not override
+      // what may already be in $values.
+      $parents = $form_state['triggering_element']['#parents'];
+      if (!drupal_array_nested_key_exists($values, $parents) && drupal_array_get_nested_value($form_state['values'], $parents) === $button_value) {
+        drupal_array_set_nested_value($values, $parents, $button_value);
+      }
+
+      // Additionally, form_builder() places the button value in
+      // $form_state['values'][BUTTON_NAME]. If it's still there, after
+      // validation handlers have run, copy it to $values, but do not override
+      // what may already be in $values.
+      $name = $form_state['triggering_element']['#name'];
+      if (!isset($values[$name]) && isset($form_state['values'][$name]) && $form_state['values'][$name] === $button_value) {
+        $values[$name] = $button_value;
+      }
+    }
+    $form_state['values'] = $values;
+  }
+}
+
+/**
+ * Redirects the user to a URL after a form has been processed.
+ *
+ * After a form is submitted and processed, normally the user should be
+ * redirected to a new destination page. This function figures out what that
+ * destination should be, based on the $form_state array and the 'destination'
+ * query string in the request URL, and redirects the user there.
+ *
+ * Usually (for exceptions, see below) $form_state['redirect'] determines where
+ * to redirect the user. This can be set either to a string (the path to
+ * redirect to), or an array of arguments for drupal_goto(). If
+ * $form_state['redirect'] is missing, the user is usually (again, see below for
+ * exceptions) redirected back to the page they came from, where they should see
+ * a fresh, unpopulated copy of the form.
+ *
+ * Here is an example of how to set up a form to redirect to the path 'node':
+ * @code
+ * $form_state['redirect'] = 'node';
+ * @endcode
+ * And here is an example of how to redirect to 'node/123?foo=bar#baz':
+ * @code
+ * $form_state['redirect'] = array(
+ *   'node/123',
+ *   array(
+ *     'query' => array(
+ *       'foo' => 'bar',
+ *     ),
+ *     'fragment' => 'baz',
+ *   ),
+ * );
+ * @endcode
+ *
+ * There are several exceptions to the "usual" behavior described above:
+ * - If $form_state['programmed'] is TRUE, the form submission was usually
+ *   invoked via drupal_form_submit(), so any redirection would break the script
+ *   that invoked drupal_form_submit() and no redirection is done.
+ * - If $form_state['rebuild'] is TRUE, the form is being rebuilt, and no
+ *   redirection is done.
+ * - If $form_state['no_redirect'] is TRUE, redirection is disabled. This is
+ *   set, for instance, by ajax_get_form() to prevent redirection in Ajax
+ *   callbacks. $form_state['no_redirect'] should never be set or altered by
+ *   form builder functions or form validation/submit handlers.
+ * - If $form_state['redirect'] is set to FALSE, redirection is disabled.
+ * - If none of the above conditions has prevented redirection, then the
+ *   redirect is accomplished by calling drupal_goto(), passing in the value of
+ *   $form_state['redirect'] if it is set, or the current path if it is
+ *   not. drupal_goto() preferentially uses the value of $_GET['destination']
+ *   (the 'destination' URL query string) if it is present, so this will
+ *   override any values set by $form_state['redirect']. Note that during
+ *   installation, install_goto() is called in place of drupal_goto().
+ *
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ *
+ * @see drupal_process_form()
+ * @see drupal_build_form()
+ */
+function drupal_redirect_form($form_state) {
+  // Skip redirection for form submissions invoked via drupal_form_submit().
+  if (!empty($form_state['programmed'])) {
+    return;
+  }
+  // Skip redirection if rebuild is activated.
+  if (!empty($form_state['rebuild'])) {
+    return;
+  }
+  // Skip redirection if it was explicitly disallowed.
+  if (!empty($form_state['no_redirect'])) {
+    return;
+  }
+  // Only invoke drupal_goto() if redirect value was not set to FALSE.
+  if (!isset($form_state['redirect']) || $form_state['redirect'] !== FALSE) {
+    if (isset($form_state['redirect'])) {
+      if (is_array($form_state['redirect'])) {
+        call_user_func_array('drupal_goto', $form_state['redirect']);
+      }
+      else {
+        // This function can be called from the installer, which guarantees
+        // that $redirect will always be a string, so catch that case here
+        // and use the appropriate redirect function.
+        $function = drupal_installation_attempted() ? 'install_goto' : 'drupal_goto';
+        $function($form_state['redirect']);
+      }
+    }
+    drupal_goto(current_path(), array('query' => drupal_get_query_parameters()));
+  }
+}
+
+/**
+ * Performs validation on form elements.
+ *
+ * First ensures required fields are completed, #maxlength is not exceeded, and
+ * selected options were in the list of options given to the user. Then calls
+ * user-defined validators.
+ *
+ * @param $elements
+ *   An associative array containing the structure of the form.
+ * @param $form_state
+ *   A keyed array containing the current state of the form. The current
+ *   user-submitted data is stored in $form_state['values'], though
+ *   form validation functions are passed an explicit copy of the
+ *   values for the sake of simplicity. Validation handlers can also
+ *   $form_state to pass information on to submit handlers. For example:
+ *     $form_state['data_for_submission'] = $data;
+ *   This technique is useful when validation requires file parsing,
+ *   web service requests, or other expensive requests that should
+ *   not be repeated in the submission step.
+ * @param $form_id
+ *   A unique string identifying the form for validation, submission,
+ *   theming, and hook_form_alter functions.
+ */
+function _form_validate(&$elements, &$form_state, $form_id = NULL) {
+  // Also used in the installer, pre-database setup.
+  $t = get_t();
+
+  // Recurse through all children.
+  foreach (element_children($elements) as $key) {
+    if (isset($elements[$key]) && $elements[$key]) {
+      _form_validate($elements[$key], $form_state);
+    }
+  }
+
+  // Validate the current input.
+  if (!isset($elements['#validated']) || !$elements['#validated']) {
+    // The following errors are always shown.
+    if (isset($elements['#needs_validation'])) {
+      // Verify that the value is not longer than #maxlength.
+      if (isset($elements['#maxlength']) && drupal_strlen($elements['#value']) > $elements['#maxlength']) {
+        form_error($elements, $t('!name cannot be longer than %max characters but is currently %length characters long.', array('!name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title'], '%max' => $elements['#maxlength'], '%length' => drupal_strlen($elements['#value']))));
+      }
+
+      if (isset($elements['#options']) && isset($elements['#value'])) {
+        if ($elements['#type'] == 'select') {
+          $options = form_options_flatten($elements['#options']);
+        }
+        else {
+          $options = $elements['#options'];
+        }
+        if (is_array($elements['#value'])) {
+          $value = in_array($elements['#type'], array('checkboxes', 'tableselect')) ? array_keys($elements['#value']) : $elements['#value'];
+          foreach ($value as $v) {
+            if (!isset($options[$v])) {
+              form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
+              watchdog('form', 'Illegal choice %choice in !name element.', array('%choice' => $v, '!name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title']), WATCHDOG_ERROR);
+            }
+          }
+        }
+        // Non-multiple select fields always have a value in HTML. If the user
+        // does not change the form, it will be the value of the first option.
+        // Because of this, form validation for the field will almost always
+        // pass, even if the user did not select anything. To work around this
+        // browser behavior, required select fields without a #default_value get
+        // an additional, first empty option. In case the submitted value is
+        // identical to the empty option's value, we reset the element's value
+        // to NULL to trigger the regular #required handling below.
+        // @see form_process_select()
+        elseif ($elements['#type'] == 'select' && !$elements['#multiple'] && $elements['#required'] && !isset($elements['#default_value']) && $elements['#value'] === $elements['#empty_value']) {
+          $elements['#value'] = NULL;
+          form_set_value($elements, NULL, $form_state);
+        }
+        elseif (!isset($options[$elements['#value']])) {
+          form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
+          watchdog('form', 'Illegal choice %choice in %name element.', array('%choice' => $elements['#value'], '%name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title']), WATCHDOG_ERROR);
+        }
+      }
+    }
+
+    // While this element is being validated, it may be desired that some calls
+    // to form_set_error() be suppressed and not result in a form error, so
+    // that a button that implements low-risk functionality (such as "Previous"
+    // or "Add more") that doesn't require all user input to be valid can still
+    // have its submit handlers triggered. The triggering element's
+    // #limit_validation_errors property contains the information for which
+    // errors are needed, and all other errors are to be suppressed. The
+    // #limit_validation_errors property is ignored if submit handlers will run,
+    // but the element doesn't have a #submit property, because it's too large a
+    // security risk to have any invalid user input when executing form-level
+    // submit handlers.
+    if (isset($form_state['triggering_element']['#limit_validation_errors']) && ($form_state['triggering_element']['#limit_validation_errors'] !== FALSE) && !($form_state['submitted'] && !isset($form_state['triggering_element']['#submit']))) {
+      form_set_error(NULL, '', $form_state['triggering_element']['#limit_validation_errors']);
+    }
+    // If submit handlers won't run (due to the submission having been triggered
+    // by an element whose #executes_submit_callback property isn't TRUE), then
+    // it's safe to suppress all validation errors, and we do so by default,
+    // which is particularly useful during an Ajax submission triggered by a
+    // non-button. An element can override this default by setting the
+    // #limit_validation_errors property. For button element types,
+    // #limit_validation_errors defaults to FALSE (via system_element_info()),
+    // so that full validation is their default behavior.
+    elseif (isset($form_state['triggering_element']) && !isset($form_state['triggering_element']['#limit_validation_errors']) && !$form_state['submitted']) {
+      form_set_error(NULL, '', array());
+    }
+    // As an extra security measure, explicitly turn off error suppression if
+    // one of the above conditions wasn't met. Since this is also done at the
+    // end of this function, doing it here is only to handle the rare edge case
+    // where a validate handler invokes form processing of another form.
+    else {
+      drupal_static_reset('form_set_error:limit_validation_errors');
+    }
+
+    // Make sure a value is passed when the field is required.
+    if (isset($elements['#needs_validation']) && $elements['#required']) {
+      // A simple call to empty() will not cut it here as some fields, like
+      // checkboxes, can return a valid value of '0'. Instead, check the
+      // length if it's a string, and the item count if it's an array.
+      // An unchecked checkbox has a #value of integer 0, different than string
+      // '0', which could be a valid value.
+      $is_empty_multiple = (!count($elements['#value']));
+      $is_empty_string = (is_string($elements['#value']) && drupal_strlen(trim($elements['#value'])) == 0);
+      $is_empty_value = ($elements['#value'] === 0);
+      if ($is_empty_multiple || $is_empty_string || $is_empty_value) {
+        // Although discouraged, a #title is not mandatory for form elements. In
+        // case there is no #title, we cannot set a form error message.
+        // Instead of setting no #title, form constructors are encouraged to set
+        // #title_display to 'invisible' to improve accessibility.
+        if (isset($elements['#title'])) {
+          form_error($elements, $t('!name field is required.', array('!name' => $elements['#title'])));
+        }
+        else {
+          form_error($elements);
+        }
+      }
+    }
+
+    // Call user-defined form level validators.
+    if (isset($form_id)) {
+      form_execute_handlers('validate', $elements, $form_state);
+    }
+    // Call any element-specific validators. These must act on the element
+    // #value data.
+    elseif (isset($elements['#element_validate'])) {
+      foreach ($elements['#element_validate'] as $function) {
+        $function($elements, $form_state, $form_state['complete form']);
+      }
+    }
+    $elements['#validated'] = TRUE;
+  }
+
+  // Done validating this element, so turn off error suppression.
+  // _form_validate() turns it on again when starting on the next element, if
+  // it's still appropriate to do so.
+  drupal_static_reset('form_set_error:limit_validation_errors');
+}
+
+/**
+ * Executes custom validation and submission handlers for a given form.
+ *
+ * Button-specific handlers are checked first. If none exist, the function
+ * falls back to form-level handlers.
+ *
+ * @param $type
+ *   The type of handler to execute. 'validate' or 'submit' are the
+ *   defaults used by Form API.
+ * @param $form
+ *   An associative array containing the structure of the form.
+ * @param $form_state
+ *   A keyed array containing the current state of the form. If the user
+ *   submitted the form by clicking a button with custom handler functions
+ *   defined, those handlers will be stored here.
+ */
+function form_execute_handlers($type, &$form, &$form_state) {
+  $return = FALSE;
+  // If there was a button pressed, use its handlers.
+  if (isset($form_state[$type . '_handlers'])) {
+    $handlers = $form_state[$type . '_handlers'];
+  }
+  // Otherwise, check for a form-level handler.
+  elseif (isset($form['#' . $type])) {
+    $handlers = $form['#' . $type];
+  }
+  else {
+    $handlers = array();
+  }
+
+  foreach ($handlers as $function) {
+    // Check if a previous _submit handler has set a batch, but make sure we
+    // do not react to a batch that is already being processed (for instance
+    // if a batch operation performs a drupal_form_submit()).
+    if ($type == 'submit' && ($batch =& batch_get()) && !isset($batch['id'])) {
+      // Some previous submit handler has set a batch. To ensure correct
+      // execution order, store the call in a special 'control' batch set.
+      // See _batch_next_set().
+      $batch['sets'][] = array('form_submit' => $function);
+      $batch['has_form_submits'] = TRUE;
+    }
+    else {
+      $function($form, $form_state);
+    }
+    $return = TRUE;
+  }
+  return $return;
+}
+
+/**
+ * Files an error against a form element.
+ *
+ * When a validation error is detected, the validator calls form_set_error() to
+ * indicate which element needs to be changed and provide an error message. This
+ * causes the Form API to not execute the form submit handlers, and instead to
+ * re-display the form to the user with the corresponding elements rendered with
+ * an 'error' CSS class (shown as red by default).
+ *
+ * The standard form_set_error() behavior can be changed if a button provides
+ * the #limit_validation_errors property. Multistep forms not wanting to
+ * validate the whole form can set #limit_validation_errors on buttons to
+ * limit validation errors to only certain elements. For example, pressing the
+ * "Previous" button in a multistep form should not fire validation errors just
+ * because the current step has invalid values. If #limit_validation_errors is
+ * set on a clicked button, the button must also define a #submit property
+ * (may be set to an empty array). Any #submit handlers will be executed even if
+ * there is invalid input, so extreme care should be taken with respect to any
+ * actions taken by them. This is typically not a problem with buttons like
+ * "Previous" or "Add more" that do not invoke persistent storage of the
+ * submitted form values. Do not use the #limit_validation_errors property on
+ * buttons that trigger saving of form values to the database.
+ *
+ * The #limit_validation_errors property is a list of "sections" within
+ * $form_state['values'] that must contain valid values. Each "section" is an
+ * array with the ordered set of keys needed to reach that part of
+ * $form_state['values'] (i.e., the #parents property of the element).
+ *
+ * Example 1: Allow the "Previous" button to function, regardless of whether any
+ * user input is valid.
+ *
+ * @code
+ *   $form['actions']['previous'] = array(
+ *     '#type' => 'submit',
+ *     '#value' => t('Previous'),
+ *     '#limit_validation_errors' => array(),       // No validation.
+ *     '#submit' => array('some_submit_function'),  // #submit required.
+ *   );
+ * @endcode
+ *
+ * Example 2: Require some, but not all, user input to be valid to process the
+ * submission of a "Previous" button.
+ *
+ * @code
+ *   $form['actions']['previous'] = array(
+ *     '#type' => 'submit',
+ *     '#value' => t('Previous'),
+ *     '#limit_validation_errors' => array(
+ *       array('step1'),       // Validate $form_state['values']['step1'].
+ *       array('foo', 'bar'),  // Validate $form_state['values']['foo']['bar'].
+ *     ),
+ *     '#submit' => array('some_submit_function'), // #submit required.
+ *   );
+ * @endcode
+ *
+ * This will require $form_state['values']['step1'] and everything within it
+ * (for example, $form_state['values']['step1']['choice']) to be valid, so
+ * calls to form_set_error('step1', $message) or
+ * form_set_error('step1][choice', $message) will prevent the submit handlers
+ * from running, and result in the error message being displayed to the user.
+ * However, calls to form_set_error('step2', $message) and
+ * form_set_error('step2][groupX][choiceY', $message) will be suppressed,
+ * resulting in the message not being displayed to the user, and the submit
+ * handlers will run despite $form_state['values']['step2'] and
+ * $form_state['values']['step2']['groupX']['choiceY'] containing invalid
+ * values. Errors for an invalid $form_state['values']['foo'] will be
+ * suppressed, but errors flagging invalid values for
+ * $form_state['values']['foo']['bar'] and everything within it will be
+ * flagged and submission prevented.
+ *
+ * Partial form validation is implemented by suppressing errors rather than by
+ * skipping the input processing and validation steps entirely, because some
+ * forms have button-level submit handlers that call Drupal API functions that
+ * assume that certain data exists within $form_state['values'], and while not
+ * doing anything with that data that requires it to be valid, PHP errors
+ * would be triggered if the input processing and validation steps were fully
+ * skipped.
+ *
+ * @param $name
+ *   The name of the form element. If the #parents property of your form
+ *   element is array('foo', 'bar', 'baz') then you may set an error on 'foo'
+ *   or 'foo][bar][baz'. Setting an error on 'foo' sets an error for every
+ *   element where the #parents array starts with 'foo'.
+ * @param $message
+ *   The error message to present to the user.
+ * @param $limit_validation_errors
+ *   Internal use only. The #limit_validation_errors property of the clicked
+ *   button, if it exists.
+ *
+ * @return
+ *   Return value is for internal use only. To get a list of errors, use
+ *   form_get_errors() or form_get_error().
+ *
+ * @see http://drupal.org/node/370537
+ * @see http://drupal.org/node/763376
+ */
+function form_set_error($name = NULL, $message = '', $limit_validation_errors = NULL) {
+  $form = &drupal_static(__FUNCTION__, array());
+  $sections = &drupal_static(__FUNCTION__ . ':limit_validation_errors');
+  if (isset($limit_validation_errors)) {
+    $sections = $limit_validation_errors;
+  }
+
+  if (isset($name) && !isset($form[$name])) {
+    $record = TRUE;
+    if (isset($sections)) {
+      // #limit_validation_errors is an array of "sections" within which user
+      // input must be valid. If the element is within one of these sections,
+      // the error must be recorded. Otherwise, it can be suppressed.
+      // #limit_validation_errors can be an empty array, in which case all
+      // errors are suppressed. For example, a "Previous" button might want its
+      // submit action to be triggered even if none of the submitted values are
+      // valid.
+      $record = FALSE;
+      foreach ($sections as $section) {
+        // Exploding by '][' reconstructs the element's #parents. If the
+        // reconstructed #parents begin with the same keys as the specified
+        // section, then the element's values are within the part of
+        // $form_state['values'] that the clicked button requires to be valid,
+        // so errors for this element must be recorded. As the exploded array
+        // will all be strings, we need to cast every value of the section
+        // array to string.
+        if (array_slice(explode('][', $name), 0, count($section)) === array_map('strval', $section)) {
+          $record = TRUE;
+          break;
+        }
+      }
+    }
+    if ($record) {
+      $form[$name] = $message;
+      if ($message) {
+        drupal_set_message($message, 'error');
+      }
+    }
+  }
+
+  return $form;
+}
+
+/**
+ * Clears all errors against all form elements made by form_set_error().
+ */
+function form_clear_error() {
+  drupal_static_reset('form_set_error');
+}
+
+/**
+ * Returns an associative array of all errors.
+ */
+function form_get_errors() {
+  $form = form_set_error();
+  if (!empty($form)) {
+    return $form;
+  }
+}
+
+/**
+ * Returns the error message filed against the given form element.
+ *
+ * Form errors higher up in the form structure override deeper errors as well as
+ * errors on the element itself.
+ */
+function form_get_error($element) {
+  $form = form_set_error();
+  $parents = array();
+  foreach ($element['#parents'] as $parent) {
+    $parents[] = $parent;
+    $key = implode('][', $parents);
+    if (isset($form[$key])) {
+      return $form[$key];
+    }
+  }
+}
+
+/**
+ * Flags an element as having an error.
+ */
+function form_error(&$element, $message = '') {
+  form_set_error(implode('][', $element['#parents']), $message);
+}
+
+/**
+ * Builds and processes all elements in the structured form array.
+ *
+ * Adds any required properties to each element, maps the incoming input data
+ * to the proper elements, and executes any #process handlers attached to a
+ * specific element.
+ *
+ * This is one of the three primary functions that recursively iterates a form
+ * array. This one does it for completing the form building process. The other
+ * two are _form_validate() (invoked via drupal_validate_form() and used to
+ * invoke validation logic for each element) and drupal_render() (for rendering
+ * each element). Each of these three pipelines provides ample opportunity for
+ * modules to customize what happens. For example, during this function's life
+ * cycle, the following functions get called for each element:
+ * - $element['#value_callback']: A function that implements how user input is
+ *   mapped to an element's #value property. This defaults to a function named
+ *   'form_type_TYPE_value' where TYPE is $element['#type'].
+ * - $element['#process']: An array of functions called after user input has
+ *   been mapped to the element's #value property. These functions can be used
+ *   to dynamically add child elements: for example, for the 'date' element
+ *   type, one of the functions in this array is form_process_date(), which adds
+ *   the individual 'year', 'month', 'day', etc. child elements. These functions
+ *   can also be used to set additional properties or implement special logic
+ *   other than adding child elements: for example, for the 'fieldset' element
+ *   type, one of the functions in this array is form_process_fieldset(), which
+ *   adds the attributes and JavaScript needed to make the fieldset collapsible
+ *   if the #collapsible property is set. The #process functions are called in
+ *   preorder traversal, meaning they are called for the parent element first,
+ *   then for the child elements.
+ * - $element['#after_build']: An array of functions called after form_builder()
+ *   is done with its processing of the element. These are called in postorder
+ *   traversal, meaning they are called for the child elements first, then for
+ *   the parent element.
+ * There are similar properties containing callback functions invoked by
+ * _form_validate() and drupal_render(), appropriate for those operations.
+ *
+ * Developers are strongly encouraged to integrate the functionality needed by
+ * their form or module within one of these three pipelines, using the
+ * appropriate callback property, rather than implementing their own recursive
+ * traversal of a form array. This facilitates proper integration between
+ * multiple modules. For example, module developers are familiar with the
+ * relative order in which hook_form_alter() implementations and #process
+ * functions run. A custom traversal function that affects the building of a
+ * form is likely to not integrate with hook_form_alter() and #process in the
+ * expected way. Also, deep recursion within PHP is both slow and memory
+ * intensive, so it is best to minimize how often it's done.
+ *
+ * As stated above, each element's #process functions are executed after its
+ * #value has been set. This enables those functions to execute conditional
+ * logic based on the current value. However, all of form_builder() runs before
+ * drupal_validate_form() is called, so during #process function execution, the
+ * element's #value has not yet been validated, so any code that requires
+ * validated values must reside within a submit handler.
+ *
+ * As a security measure, user input is used for an element's #value only if the
+ * element exists within $form, is not disabled (as per the #disabled property),
+ * and can be accessed (as per the #access property, except that forms submitted
+ * using drupal_form_submit() bypass #access restrictions). When user input is
+ * ignored due to #disabled and #access restrictions, the element's default
+ * value is used.
+ *
+ * Because of the preorder traversal, where #process functions of an element run
+ * before user input for its child elements is processed, and because of the
+ * Form API security of user input processing with respect to #access and
+ * #disabled described above, this generally means that #process functions
+ * should not use an element's (unvalidated) #value to affect the #disabled or
+ * #access of child elements. Use-cases where a developer may be tempted to
+ * implement such conditional logic usually fall into one of two categories:
+ * - Where user input from the current submission must affect the structure of a
+ *   form, including properties like #access and #disabled that affect how the
+ *   next submission needs to be processed, a multi-step workflow is needed.
+ *   This is most commonly implemented with a submit handler setting persistent
+ *   data within $form_state based on *validated* values in
+ *   $form_state['values'] and setting $form_state['rebuild']. The form building
+ *   functions must then be implemented to use the $form_state data to rebuild
+ *   the form with the structure appropriate for the new state.
+ * - Where user input must affect the rendering of the form without affecting
+ *   its structure, the necessary conditional rendering logic should reside
+ *   within functions that run during the rendering phase (#pre_render, #theme,
+ *   #theme_wrappers, and #post_render).
+ *
+ * @param $form_id
+ *   A unique string identifying the form for validation, submission,
+ *   theming, and hook_form_alter functions.
+ * @param $element
+ *   An associative array containing the structure of the current element.
+ * @param $form_state
+ *   A keyed array containing the current state of the form. In this
+ *   context, it is used to accumulate information about which button
+ *   was clicked when the form was submitted, as well as the sanitized
+ *   $_POST data.
+ */
+function form_builder($form_id, &$element, &$form_state) {
+  // Initialize as unprocessed.
+  $element['#processed'] = FALSE;
+
+  // Use element defaults.
+  if (isset($element['#type']) && empty($element['#defaults_loaded']) && ($info = element_info($element['#type']))) {
+    // Overlay $info onto $element, retaining preexisting keys in $element.
+    $element += $info;
+    $element['#defaults_loaded'] = TRUE;
+  }
+  // Assign basic defaults common for all form elements.
+  $element += array(
+    '#required' => FALSE,
+    '#attributes' => array(),
+    '#title_display' => 'before',
+  );
+
+  // Special handling if we're on the top level form element.
+  if (isset($element['#type']) && $element['#type'] == 'form') {
+    if (!empty($element['#https']) && variable_get('https', FALSE) &&
+        !url_is_external($element['#action'])) {
+      global $base_root;
+
+      // Not an external URL so ensure that it is secure.
+      $element['#action'] = str_replace('http://', 'https://', $base_root) . $element['#action'];
+    }
+
+    // Store a reference to the complete form in $form_state prior to building
+    // the form. This allows advanced #process and #after_build callbacks to
+    // perform changes elsewhere in the form.
+    $form_state['complete form'] = &$element;
+
+    // Set a flag if we have a correct form submission. This is always TRUE for
+    // programmed forms coming from drupal_form_submit(), or if the form_id coming
+    // from the POST data is set and matches the current form_id.
+    if ($form_state['programmed'] || (!empty($form_state['input']) && (isset($form_state['input']['form_id']) && ($form_state['input']['form_id'] == $form_id)))) {
+      $form_state['process_input'] = TRUE;
+    }
+    else {
+      $form_state['process_input'] = FALSE;
+    }
+
+    // All form elements should have an #array_parents property.
+    $element['#array_parents'] = array();
+  }
+
+  if (!isset($element['#id'])) {
+    $element['#id'] = drupal_html_id('edit-' . implode('-', $element['#parents']));
+  }
+  // Handle input elements.
+  if (!empty($element['#input'])) {
+    _form_builder_handle_input_element($form_id, $element, $form_state);
+  }
+  // Allow for elements to expand to multiple elements, e.g., radios,
+  // checkboxes and files.
+  if (isset($element['#process']) && !$element['#processed']) {
+    foreach ($element['#process'] as $process) {
+      $element = $process($element, $form_state, $form_state['complete form']);
+    }
+    $element['#processed'] = TRUE;
+  }
+
+  // We start off assuming all form elements are in the correct order.
+  $element['#sorted'] = TRUE;
+
+  // Recurse through all child elements.
+  $count = 0;
+  foreach (element_children($element) as $key) {
+    // Prior to checking properties of child elements, their default properties
+    // need to be loaded.
+    if (isset($element[$key]['#type']) && empty($element[$key]['#defaults_loaded']) && ($info = element_info($element[$key]['#type']))) {
+      $element[$key] += $info;
+      $element[$key]['#defaults_loaded'] = TRUE;
+    }
+
+    // Don't squash an existing tree value.
+    if (!isset($element[$key]['#tree'])) {
+      $element[$key]['#tree'] = $element['#tree'];
+    }
+
+    // Deny access to child elements if parent is denied.
+    if (isset($element['#access']) && !$element['#access']) {
+      $element[$key]['#access'] = FALSE;
+    }
+
+    // Make child elements inherit their parent's #disabled and #allow_focus
+    // values unless they specify their own.
+    foreach (array('#disabled', '#allow_focus') as $property) {
+      if (isset($element[$property]) && !isset($element[$key][$property])) {
+        $element[$key][$property] = $element[$property];
+      }
+    }
+
+    // Don't squash existing parents value.
+    if (!isset($element[$key]['#parents'])) {
+      // Check to see if a tree of child elements is present. If so,
+      // continue down the tree if required.
+      $element[$key]['#parents'] = $element[$key]['#tree'] && $element['#tree'] ? array_merge($element['#parents'], array($key)) : array($key);
+    }
+    // Ensure #array_parents follows the actual form structure.
+    $array_parents = $element['#array_parents'];
+    $array_parents[] = $key;
+    $element[$key]['#array_parents'] = $array_parents;
+
+    // Assign a decimal placeholder weight to preserve original array order.
+    if (!isset($element[$key]['#weight'])) {
+      $element[$key]['#weight'] = $count/1000;
+    }
+    else {
+      // If one of the child elements has a weight then we will need to sort
+      // later.
+      unset($element['#sorted']);
+    }
+    $element[$key] = form_builder($form_id, $element[$key], $form_state);
+    $count++;
+  }
+
+  // The #after_build flag allows any piece of a form to be altered
+  // after normal input parsing has been completed.
+  if (isset($element['#after_build']) && !isset($element['#after_build_done'])) {
+    foreach ($element['#after_build'] as $function) {
+      $element = $function($element, $form_state);
+    }
+    $element['#after_build_done'] = TRUE;
+  }
+
+  // If there is a file element, we need to flip a flag so later the
+  // form encoding can be set.
+  if (isset($element['#type']) && $element['#type'] == 'file') {
+    $form_state['has_file_element'] = TRUE;
+  }
+
+  // Final tasks for the form element after form_builder() has run for all other
+  // elements.
+  if (isset($element['#type']) && $element['#type'] == 'form') {
+    // If there is a file element, we set the form encoding.
+    if (isset($form_state['has_file_element'])) {
+      $element['#attributes']['enctype'] = 'multipart/form-data';
+    }
+
+    // If a form contains a single textfield, and the ENTER key is pressed
+    // within it, Internet Explorer submits the form with no POST data
+    // identifying any submit button. Other browsers submit POST data as though
+    // the user clicked the first button. Therefore, to be as consistent as we
+    // can be across browsers, if no 'triggering_element' has been identified
+    // yet, default it to the first button.
+    if (!$form_state['programmed'] && !isset($form_state['triggering_element']) && !empty($form_state['buttons'])) {
+      $form_state['triggering_element'] = $form_state['buttons'][0];
+    }
+
+    // If the triggering element specifies "button-level" validation and submit
+    // handlers to run instead of the default form-level ones, then add those to
+    // the form state.
+    foreach (array('validate', 'submit') as $type) {
+      if (isset($form_state['triggering_element']['#' . $type])) {
+        $form_state[$type . '_handlers'] = $form_state['triggering_element']['#' . $type];
+      }
+    }
+
+    // If the triggering element executes submit handlers, then set the form
+    // state key that's needed for those handlers to run.
+    if (!empty($form_state['triggering_element']['#executes_submit_callback'])) {
+      $form_state['submitted'] = TRUE;
+    }
+
+    // Special processing if the triggering element is a button.
+    if (isset($form_state['triggering_element']['#button_type'])) {
+      // Because there are several ways in which the triggering element could
+      // have been determined (including from input variables set by JavaScript
+      // or fallback behavior implemented for IE), and because buttons often
+      // have their #name property not derived from their #parents property, we
+      // can't assume that input processing that's happened up until here has
+      // resulted in $form_state['values'][BUTTON_NAME] being set. But it's
+      // common for forms to have several buttons named 'op' and switch on
+      // $form_state['values']['op'] during submit handler execution.
+      $form_state['values'][$form_state['triggering_element']['#name']] = $form_state['triggering_element']['#value'];
+
+      // @todo Legacy support. Remove in Drupal 8.
+      $form_state['clicked_button'] = $form_state['triggering_element'];
+    }
+  }
+  return $element;
+}
+
+/**
+ * Adds the #name and #value properties of an input element before rendering.
+ */
+function _form_builder_handle_input_element($form_id, &$element, &$form_state) {
+  if (!isset($element['#name'])) {
+    $name = array_shift($element['#parents']);
+    $element['#name'] = $name;
+    if ($element['#type'] == 'file') {
+      // To make it easier to handle $_FILES in file.inc, we place all
+      // file fields in the 'files' array. Also, we do not support
+      // nested file names.
+      $element['#name'] = 'files[' . $element['#name'] . ']';
+    }
+    elseif (count($element['#parents'])) {
+      $element['#name'] .= '[' . implode('][', $element['#parents']) . ']';
+    }
+    array_unshift($element['#parents'], $name);
+  }
+
+  // Setting #disabled to TRUE results in user input being ignored, regardless
+  // of how the element is themed or whether JavaScript is used to change the
+  // control's attributes. However, it's good UI to let the user know that input
+  // is not wanted for the control. HTML supports two attributes for this:
+  // http://www.w3.org/TR/html401/interact/forms.html#h-17.12. If a form wants
+  // to start a control off with one of these attributes for UI purposes only,
+  // but still allow input to be processed if it's sumitted, it can set the
+  // desired attribute in #attributes directly rather than using #disabled.
+  // However, developers should think carefully about the accessibility
+  // implications of doing so: if the form expects input to be enterable under
+  // some condition triggered by JavaScript, how would someone who has
+  // JavaScript disabled trigger that condition? Instead, developers should
+  // consider whether a multi-step form would be more appropriate (#disabled can
+  // be changed from step to step). If one still decides to use JavaScript to
+  // affect when a control is enabled, then it is best for accessibility for the
+  // control to be enabled in the HTML, and disabled by JavaScript on document
+  // ready.
+  if (!empty($element['#disabled'])) {
+    if (!empty($element['#allow_focus'])) {
+      $element['#attributes']['readonly'] = 'readonly';
+    }
+    else {
+      $element['#attributes']['disabled'] = 'disabled';
+    }
+  }
+
+  // With JavaScript or other easy hacking, input can be submitted even for
+  // elements with #access=FALSE or #disabled=TRUE. For security, these must
+  // not be processed. Forms that set #disabled=TRUE on an element do not
+  // expect input for the element, and even forms submitted with
+  // drupal_form_submit() must not be able to get around this. Forms that set
+  // #access=FALSE on an element usually allow access for some users, so forms
+  // submitted with drupal_form_submit() may bypass access restriction and be
+  // treated as high-privilege users instead.
+  $process_input = empty($element['#disabled']) && ($form_state['programmed'] || ($form_state['process_input'] && (!isset($element['#access']) || $element['#access'])));
+
+  // Set the element's #value property.
+  if (!isset($element['#value']) && !array_key_exists('#value', $element)) {
+    $value_callback = !empty($element['#value_callback']) ? $element['#value_callback'] : 'form_type_' . $element['#type'] . '_value';
+    if ($process_input) {
+      // Get the input for the current element. NULL values in the input need to
+      // be explicitly distinguished from missing input. (see below)
+      $input_exists = NULL;
+      $input = drupal_array_get_nested_value($form_state['input'], $element['#parents'], $input_exists);
+      // For browser-submitted forms, the submitted values do not contain values
+      // for certain elements (empty multiple select, unchecked checkbox).
+      // During initial form processing, we add explicit NULL values for such
+      // elements in $form_state['input']. When rebuilding the form, we can
+      // distinguish elements having NULL input from elements that were not part
+      // of the initially submitted form and can therefore use default values
+      // for the latter, if required. Programmatically submitted forms can
+      // submit explicit NULL values when calling drupal_form_submit(), so we do
+      // not modify $form_state['input'] for them.
+      if (!$input_exists && !$form_state['rebuild'] && !$form_state['programmed']) {
+        // Add the necessary parent keys to $form_state['input'] and sets the
+        // element's input value to NULL.
+        drupal_array_set_nested_value($form_state['input'], $element['#parents'], NULL);
+        $input_exists = TRUE;
+      }
+      // If we have input for the current element, assign it to the #value
+      // property, optionally filtered through $value_callback.
+      if ($input_exists) {
+        if (function_exists($value_callback)) {
+          $element['#value'] = $value_callback($element, $input, $form_state);
+        }
+        if (!isset($element['#value']) && isset($input)) {
+          $element['#value'] = $input;
+        }
+      }
+      // Mark all posted values for validation.
+      if (isset($element['#value']) || (!empty($element['#required']))) {
+        $element['#needs_validation'] = TRUE;
+      }
+    }
+    // Load defaults.
+    if (!isset($element['#value'])) {
+      // Call #type_value without a second argument to request default_value handling.
+      if (function_exists($value_callback)) {
+        $element['#value'] = $value_callback($element, FALSE, $form_state);
+      }
+      // Final catch. If we haven't set a value yet, use the explicit default value.
+      // Avoid image buttons (which come with garbage value), so we only get value
+      // for the button actually clicked.
+      if (!isset($element['#value']) && empty($element['#has_garbage_value'])) {
+        $element['#value'] = isset($element['#default_value']) ? $element['#default_value'] : '';
+      }
+    }
+  }
+
+  // Determine which element (if any) triggered the submission of the form and
+  // keep track of all the clickable buttons in the form for
+  // form_state_values_clean(). Enforce the same input processing restrictions
+  // as above.
+  if ($process_input) {
+    // Detect if the element triggered the submission via Ajax.
+    if (_form_element_triggered_scripted_submission($element, $form_state)) {
+      $form_state['triggering_element'] = $element;
+    }
+
+    // If the form was submitted by the browser rather than via Ajax, then it
+    // can only have been triggered by a button, and we need to determine which
+    // button within the constraints of how browsers provide this information.
+    if (isset($element['#button_type'])) {
+      // All buttons in the form need to be tracked for
+      // form_state_values_clean() and for the form_builder() code that handles
+      // a form submission containing no button information in $_POST.
+      $form_state['buttons'][] = $element;
+      if (_form_button_was_clicked($element, $form_state)) {
+        $form_state['triggering_element'] = $element;
+      }
+    }
+  }
+
+  // Set the element's value in $form_state['values'], but only, if its key
+  // does not exist yet (a #value_callback may have already populated it).
+  if (!drupal_array_nested_key_exists($form_state['values'], $element['#parents'])) {
+    form_set_value($element, $element['#value'], $form_state);
+  }
+}
+
+/**
+ * Detects if an element triggered the form submission via Ajax.
+ *
+ * This detects button or non-button controls that trigger a form submission via
+ * Ajax or some other scriptable environment. These environments can set the
+ * special input key '_triggering_element_name' to identify the triggering
+ * element. If the name alone doesn't identify the element uniquely, the input
+ * key '_triggering_element_value' may also be set to require a match on element
+ * value. An example where this is needed is if there are several buttons all
+ * named 'op', and only differing in their value.
+ */
+function _form_element_triggered_scripted_submission($element, &$form_state) {
+  if (!empty($form_state['input']['_triggering_element_name']) && $element['#name'] == $form_state['input']['_triggering_element_name']) {
+    if (empty($form_state['input']['_triggering_element_value']) || $form_state['input']['_triggering_element_value'] == $element['#value']) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Determines if a given button triggered the form submission.
+ *
+ * This detects button controls that trigger a form submission by being clicked
+ * and having the click processed by the browser rather than being captured by
+ * JavaScript. Essentially, it detects if the button's name and value are part
+ * of the POST data, but with extra code to deal with the convoluted way in
+ * which browsers submit data for image button clicks.
+ *
+ * This does not detect button clicks processed by Ajax (that is done in
+ * _form_element_triggered_scripted_submission()) and it does not detect form
+ * submissions from Internet Explorer in response to an ENTER key pressed in a
+ * textfield (form_builder() has extra code for that).
+ *
+ * Because this function contains only part of the logic needed to determine
+ * $form_state['triggering_element'], it should not be called from anywhere
+ * other than within the Form API. Form validation and submit handlers needing
+ * to know which button was clicked should get that information from
+ * $form_state['triggering_element'].
+ */
+function _form_button_was_clicked($element, &$form_state) {
+  // First detect normal 'vanilla' button clicks. Traditionally, all
+  // standard buttons on a form share the same name (usually 'op'),
+  // and the specific return value is used to determine which was
+  // clicked. This ONLY works as long as $form['#name'] puts the
+  // value at the top level of the tree of $_POST data.
+  if (isset($form_state['input'][$element['#name']]) && $form_state['input'][$element['#name']] == $element['#value']) {
+    return TRUE;
+  }
+  // When image buttons are clicked, browsers do NOT pass the form element
+  // value in $_POST. Instead they pass an integer representing the
+  // coordinates of the click on the button image. This means that image
+  // buttons MUST have unique $form['#name'] values, but the details of
+  // their $_POST data should be ignored.
+  elseif (!empty($element['#has_garbage_value']) && isset($element['#value']) && $element['#value'] !== '') {
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
+ * Removes internal Form API elements and buttons from submitted form values.
+ *
+ * This function can be used when a module wants to store all submitted form
+ * values, for example, by serializing them into a single database column. In
+ * such cases, all internal Form API values and all form button elements should
+ * not be contained, and this function allows to remove them before the module
+ * proceeds to storage. Next to button elements, the following internal values
+ * are removed:
+ * - form_id
+ * - form_token
+ * - form_build_id
+ * - op
+ *
+ * @param $form_state
+ *   A keyed array containing the current state of the form, including
+ *   submitted form values; altered by reference.
+ */
+function form_state_values_clean(&$form_state) {
+  // Remove internal Form API values.
+  unset($form_state['values']['form_id'], $form_state['values']['form_token'], $form_state['values']['form_build_id'], $form_state['values']['op']);
+
+  // Remove button values.
+  // form_builder() collects all button elements in a form. We remove the button
+  // value separately for each button element.
+  foreach ($form_state['buttons'] as $button) {
+    // Remove this button's value from the submitted form values by finding
+    // the value corresponding to this button.
+    // We iterate over the #parents of this button and move a reference to
+    // each parent in $form_state['values']. For example, if #parents is:
+    //   array('foo', 'bar', 'baz')
+    // then the corresponding $form_state['values'] part will look like this:
+    // array(
+    //   'foo' => array(
+    //     'bar' => array(
+    //       'baz' => 'button_value',
+    //     ),
+    //   ),
+    // )
+    // We start by (re)moving 'baz' to $last_parent, so we are able unset it
+    // at the end of the iteration. Initially, $values will contain a
+    // reference to $form_state['values'], but in the iteration we move the
+    // reference to $form_state['values']['foo'], and finally to
+    // $form_state['values']['foo']['bar'], which is the level where we can
+    // unset 'baz' (that is stored in $last_parent).
+    $parents = $button['#parents'];
+    $last_parent = array_pop($parents);
+    $key_exists = NULL;
+    $values = &drupal_array_get_nested_value($form_state['values'], $parents, $key_exists);
+    if ($key_exists && is_array($values)) {
+      unset($values[$last_parent]);
+    }
+  }
+}
+
+/**
+ * Determines the value for an image button form element.
+ *
+ * @param $form
+ *   The form element whose value is being populated.
+ * @param $input
+ *   The incoming input to populate the form element. If this is FALSE,
+ *   the element's default value should be returned.
+ * @param $form_state
+ *   A keyed array containing the current state of the form.
+ *
+ * @return
+ *   The data that will appear in the $form_state['values'] collection
+ *   for this element. Return nothing to use the default.
+ */
+function form_type_image_button_value($form, $input, $form_state) {
+  if ($input !== FALSE) {
+    if (!empty($input)) {
+      // If we're dealing with Mozilla or Opera, we're lucky. It will
+      // return a proper value, and we can get on with things.
+      return $form['#return_value'];
+    }
+    else {
+      // Unfortunately, in IE we never get back a proper value for THIS
+      // form element. Instead, we get back two split values: one for the
+      // X and one for the Y coordinates on which the user clicked the
+      // button. We'll find this element in the #post data, and search
+      // in the same spot for its name, with '_x'.
+      $input = $form_state['input'];
+      foreach (explode('[', $form['#name']) as $element_name) {
+        // chop off the ] that may exist.
+        if (substr($element_name, -1) == ']') {
+          $element_name = substr($element_name, 0, -1);
+        }
+
+        if (!isset($input[$element_name])) {
+          if (isset($input[$element_name . '_x'])) {
+            return $form['#return_value'];
+          }
+          return NULL;
+        }
+        $input = $input[$element_name];
+      }
+      return $form['#return_value'];
+    }
+  }
+}
+
+/**
+ * Determines the value for a checkbox form element.
+ *
+ * @param $form
+ *   The form element whose value is being populated.
+ * @param $input
+ *   The incoming input to populate the form element. If this is FALSE,
+ *   the element's default value should be returned.
+ *
+ * @return
+ *   The data that will appear in the $element_state['values'] collection
+ *   for this element. Return nothing to use the default.
+ */
+function form_type_checkbox_value($element, $input = FALSE) {
+  if ($input === FALSE) {
+    // Use #default_value as the default value of a checkbox, except change
+    // NULL to 0, because _form_builder_handle_input_element() would otherwise
+    // replace NULL with empty string, but an empty string is a potentially
+    // valid value for a checked checkbox.
+    return isset($element['#default_value']) ? $element['#default_value'] : 0;
+  }
+  else {
+    // Checked checkboxes are submitted with a value (possibly '0' or ''):
+    // http://www.w3.org/TR/html401/interact/forms.html#successful-controls.
+    // For checked checkboxes, browsers submit the string version of
+    // #return_value, but we return the original #return_value. For unchecked
+    // checkboxes, browsers submit nothing at all, but
+    // _form_builder_handle_input_element() detects this, and calls this
+    // function with $input=NULL. Returning NULL from a value callback means to
+    // use the default value, which is not what is wanted when an unchecked
+    // checkbox is submitted, so we use integer 0 as the value indicating an
+    // unchecked checkbox. Therefore, modules must not use integer 0 as a
+    // #return_value, as doing so results in the checkbox always being treated
+    // as unchecked. The string '0' is allowed for #return_value. The most
+    // common use-case for setting #return_value to either 0 or '0' is for the
+    // first option within a 0-indexed array of checkboxes, and for this,
+    // form_process_checkboxes() uses the string rather than the integer.
+    return isset($input) ? $element['#return_value'] : 0;
+  }
+}
+
+/**
+ * Determines the value for a checkboxes form element.
+ *
+ * @param $element
+ *   The form element whose value is being populated.
+ * @param $input
+ *   The incoming input to populate the form element. If this is FALSE,
+ *   the element's default value should be returned.
+ *
+ * @return
+ *   The data that will appear in the $element_state['values'] collection
+ *   for this element. Return nothing to use the default.
+ */
+function form_type_checkboxes_value($element, $input = FALSE) {
+  if ($input === FALSE) {
+    $value = array();
+    $element += array('#default_value' => array());
+    foreach ($element['#default_value'] as $key) {
+      $value[$key] = $key;
+    }
+    return $value;
+  }
+  elseif (is_array($input)) {
+    // Programmatic form submissions use NULL to indicate that a checkbox
+    // should be unchecked; see drupal_form_submit(). We therefore remove all
+    // NULL elements from the array before constructing the return value, to
+    // simulate the behavior of web browsers (which do not send unchecked
+    // checkboxes to the server at all). This will not affect non-programmatic
+    // form submissions, since all values in $_POST are strings.
+    foreach ($input as $key => $value) {
+      if (!isset($value)) {
+        unset($input[$key]);
+      }
+    }
+    return drupal_map_assoc($input);
+  }
+  else {
+    return array();
+  }
+}
+
+/**
+ * Determines the value for a tableselect form element.
+ *
+ * @param $element
+ *   The form element whose value is being populated.
+ * @param $input
+ *   The incoming input to populate the form element. If this is FALSE,
+ *   the element's default value should be returned.
+ *
+ * @return
+ *   The data that will appear in the $element_state['values'] collection
+ *   for this element. Return nothing to use the default.
+ */
+function form_type_tableselect_value($element, $input = FALSE) {
+  // If $element['#multiple'] == FALSE, then radio buttons are displayed and
+  // the default value handling is used.
+  if (isset($element['#multiple']) && $element['#multiple']) {
+    // Checkboxes are being displayed with the default value coming from the
+    // keys of the #default_value property. This differs from the checkboxes
+    // element which uses the array values.
+    if ($input === FALSE) {
+      $value = array();
+      $element += array('#default_value' => array());
+      foreach ($element['#default_value'] as $key => $flag) {
+        if ($flag) {
+          $value[$key] = $key;
+        }
+      }
+      return $value;
+    }
+    else {
+      return is_array($input) ? drupal_map_assoc($input) : array();
+    }
+  }
+}
+
+/**
+ * Form value callback: Determines the value for a #type radios form element.
+ *
+ * @param $element
+ *   The form element whose value is being populated.
+ * @param $input
+ *   (optional) The incoming input to populate the form element. If FALSE, the
+ *   element's default value is returned. Defaults to FALSE.
+ *
+ * @return
+ *   The data that will appear in the $element_state['values'] collection for
+ *   this element.
+ */
+function form_type_radios_value(&$element, $input = FALSE) {
+  if ($input !== FALSE) {
+    // When there's user input (including NULL), return it as the value.
+    // However, if NULL is submitted, _form_builder_handle_input_element() will
+    // apply the default value, and we want that validated against #options
+    // unless it's empty. (An empty #default_value, such as NULL or FALSE, can
+    // be used to indicate that no radio button is selected by default.)
+    if (!isset($input) && !empty($element['#default_value'])) {
+      $element['#needs_validation'] = TRUE;
+    }
+    return $input;
+  }
+  else {
+    // For default value handling, simply return #default_value. Additionally,
+    // for a NULL default value, set #has_garbage_value to prevent
+    // _form_builder_handle_input_element() converting the NULL to an empty
+    // string, so that code can distinguish between nothing selected and the
+    // selection of a radio button whose value is an empty string.
+    $value = isset($element['#default_value']) ? $element['#default_value'] : NULL;
+    if (!isset($value)) {
+      $element['#has_garbage_value'] = TRUE;
+    }
+    return $value;
+  }
+}
+
+/**
+ * Determines the value for a password_confirm form element.
+ *
+ * @param $element
+ *   The form element whose value is being populated.
+ * @param $input
+ *   The incoming input to populate the form element. If this is FALSE,
+ *   the element's default value should be returned.
+ *
+ * @return
+ *   The data that will appear in the $element_state['values'] collection
+ *   for this element. Return nothing to use the default.
+ */
+function form_type_password_confirm_value($element, $input = FALSE) {
+  if ($input === FALSE) {
+    $element += array('#default_value' => array());
+    return $element['#default_value'] + array('pass1' => '', 'pass2' => '');
+  }
+}
+
+/**
+ * Determines the value for a select form element.
+ *
+ * @param $element
+ *   The form element whose value is being populated.
+ * @param $input
+ *   The incoming input to populate the form element. If this is FALSE,
+ *   the element's default value should be returned.
+ *
+ * @return
+ *   The data that will appear in the $element_state['values'] collection
+ *   for this element. Return nothing to use the default.
+ */
+function form_type_select_value($element, $input = FALSE) {
+  if ($input !== FALSE) {
+    if (isset($element['#multiple']) && $element['#multiple']) {
+      // If an enabled multi-select submits NULL, it means all items are
+      // unselected. A disabled multi-select always submits NULL, and the
+      // default value should be used.
+      if (empty($element['#disabled'])) {
+        return (is_array($input)) ? drupal_map_assoc($input) : array();
+      }
+      else {
+        return (isset($element['#default_value']) && is_array($element['#default_value'])) ? $element['#default_value'] : array();
+      }
+    }
+    // Non-multiple select elements may have an empty option preprended to them
+    // (see form_process_select()). When this occurs, usually #empty_value is
+    // an empty string, but some forms set #empty_value to integer 0 or some
+    // other non-string constant. PHP receives all submitted form input as
+    // strings, but if the empty option is selected, set the value to match the
+    // empty value exactly.
+    elseif (isset($element['#empty_value']) && $input === (string) $element['#empty_value']) {
+      return $element['#empty_value'];
+    }
+    else {
+      return $input;
+    }
+  }
+}
+
+/**
+ * Determines the value for a textfield form element.
+ *
+ * @param $element
+ *   The form element whose value is being populated.
+ * @param $input
+ *   The incoming input to populate the form element. If this is FALSE,
+ *   the element's default value should be returned.
+ *
+ * @return
+ *   The data that will appear in the $element_state['values'] collection
+ *   for this element. Return nothing to use the default.
+ */
+function form_type_textfield_value($element, $input = FALSE) {
+  if ($input !== FALSE && $input !== NULL) {
+    // Equate $input to the form value to ensure it's marked for
+    // validation.
+    return str_replace(array("\r", "\n"), '', $input);
+  }
+}
+
+/**
+ * Determines the value for form's token value.
+ *
+ * @param $element
+ *   The form element whose value is being populated.
+ * @param $input
+ *   The incoming input to populate the form element. If this is FALSE,
+ *   the element's default value should be returned.
+ *
+ * @return
+ *   The data that will appear in the $element_state['values'] collection
+ *   for this element. Return nothing to use the default.
+ */
+function form_type_token_value($element, $input = FALSE) {
+  if ($input !== FALSE) {
+    return (string) $input;
+  }
+}
+
+/**
+ * Changes submitted form values during form validation.
+ *
+ * Use this function to change the submitted value of a form element in a form
+ * validation function, so that the changed value persists in $form_state
+ * through the remaining validation and submission handlers. It does not change
+ * the value in $element['#value'], only in $form_state['values'], which is
+ * where submitted values are always stored.
+ *
+ * Note that form validation functions are specified in the '#validate'
+ * component of the form array (the value of $form['#validate'] is an array of
+ * validation function names). If the form does not originate in your module,
+ * you can implement hook_form_FORM_ID_alter() to add a validation function
+ * to $form['#validate'].
+ *
+ * @param $element
+ *   The form element that should have its value updated; in most cases you can
+ *   just pass in the element from the $form array, although the only component
+ *   that is actually used is '#parents'. If constructing yourself, set
+ *   $element['#parents'] to be an array giving the path through the form
+ *   array's keys to the element whose value you want to update. For instance,
+ *   if you want to update the value of $form['elem1']['elem2'], which should be
+ *   stored in $form_state['values']['elem1']['elem2'], you would set
+ *   $element['#parents'] = array('elem1','elem2').
+ * @param $value
+ *   The new value for the form element.
+ * @param $form_state
+ *   Form state array where the value change should be recorded.
+ */
+function form_set_value($element, $value, &$form_state) {
+  drupal_array_set_nested_value($form_state['values'], $element['#parents'], $value, TRUE);
+}
+
+/**
+ * Allows PHP array processing of multiple select options with the same value.
+ *
+ * Used for form select elements which need to validate HTML option groups
+ * and multiple options which may return the same value. Associative PHP arrays
+ * cannot handle these structures, since they share a common key.
+ *
+ * @param $array
+ *   The form options array to process.
+ *
+ * @return
+ *   An array with all hierarchical elements flattened to a single array.
+ */
+function form_options_flatten($array) {
+  // Always reset static var when first entering the recursion.
+  drupal_static_reset('_form_options_flatten');
+  return _form_options_flatten($array);
+}
+
+/**
+ * Iterates over an array and returns a flat array with duplicate keys removed.
+ *
+ * This function also handles cases where objects are passed as array values.
+ */
+function _form_options_flatten($array) {
+  $return = &drupal_static(__FUNCTION__);
+
+  foreach ($array as $key => $value) {
+    if (is_object($value)) {
+      _form_options_flatten($value->option);
+    }
+    elseif (is_array($value)) {
+      _form_options_flatten($value);
+    }
+    else {
+      $return[$key] = 1;
+    }
+  }
+
+  return $return;
+}
+
+/**
+ * Processes a select list form element.
+ *
+ * This process callback is mandatory for select fields, since all user agents
+ * automatically preselect the first available option of single (non-multiple)
+ * select lists.
+ *
+ * @param $element
+ *   The form element to process. Properties used:
+ *   - #multiple: (optional) Indicates whether one or more options can be
+ *     selected. Defaults to FALSE.
+ *   - #default_value: Must be NULL or not set in case there is no value for the
+ *     element yet, in which case a first default option is inserted by default.
+ *     Whether this first option is a valid option depends on whether the field
+ *     is #required or not.
+ *   - #required: (optional) Whether the user needs to select an option (TRUE)
+ *     or not (FALSE). Defaults to FALSE.
+ *   - #empty_option: (optional) The label to show for the first default option.
+ *     By default, the label is automatically set to "- Please select -" for a
+ *     required field and "- None -" for an optional field.
+ *   - #empty_value: (optional) The value for the first default option, which is
+ *     used to determine whether the user submitted a value or not.
+ *     - If #required is TRUE, this defaults to '' (an empty string).
+ *     - If #required is not TRUE and this value isn't set, then no extra option
+ *       is added to the select control, leaving the control in a slightly
+ *       illogical state, because there's no way for the user to select nothing,
+ *       since all user agents automatically preselect the first available
+ *       option. But people are used to this being the behavior of select
+ *       controls.
+ *       @todo Address the above issue in Drupal 8.
+ *     - If #required is not TRUE and this value is set (most commonly to an
+ *       empty string), then an extra option (see #empty_option above)
+ *       representing a "non-selection" is added with this as its value.
+ *
+ * @see _form_validate()
+ */
+function form_process_select($element) {
+  // #multiple select fields need a special #name.
+  if ($element['#multiple']) {
+    $element['#attributes']['multiple'] = 'multiple';
+    $element['#attributes']['name'] = $element['#name'] . '[]';
+  }
+  // A non-#multiple select needs special handling to prevent user agents from
+  // preselecting the first option without intention. #multiple select lists do
+  // not get an empty option, as it would not make sense, user interface-wise.
+  else {
+    $required = $element['#required'];
+    // If the element is required and there is no #default_value, then add an
+    // empty option that will fail validation, so that the user is required to
+    // make a choice. Also, if there's a value for #empty_value or
+    // #empty_option, then add an option that represents emptiness.
+    if (($required && !isset($element['#default_value'])) || isset($element['#empty_value']) || isset($element['#empty_option'])) {
+      $element += array(
+        '#empty_value' => '',
+        '#empty_option' => $required ? t('- Select -') : t('- None -'),
+      );
+      // The empty option is prepended to #options and purposively not merged
+      // to prevent another option in #options mistakenly using the same value
+      // as #empty_value.
+      $empty_option = array($element['#empty_value'] => $element['#empty_option']);
+      $element['#options'] = $empty_option + $element['#options'];
+    }
+  }
+  return $element;
+}
+
+/**
+ * Returns HTML for a select form element.
+ *
+ * It is possible to group options together; to do this, change the format of
+ * $options to an associative array in which the keys are group labels, and the
+ * values are associative arrays in the normal $options format.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #title, #value, #options, #description, #extra,
+ *     #multiple, #required, #name, #attributes, #size.
+ *
+ * @ingroup themeable
+ */
+function theme_select($variables) {
+  $element = $variables['element'];
+  element_set_attributes($element, array('id', 'name', 'size'));
+  _form_set_class($element, array('form-select'));
+
+  return '<select' . drupal_attributes($element['#attributes']) . '>' . form_select_options($element) . '</select>';
+}
+
+/**
+ * Converts a select form element's options array into HTML.
+ *
+ * @param $element
+ *   An associative array containing the properties of the element.
+ * @param $choices
+ *   Mixed: Either an associative array of items to list as choices, or an
+ *   object with an 'option' member that is an associative array. This
+ *   parameter is only used internally and should not be passed.
+ *
+ * @return
+ *   An HTML string of options for the select form element.
+ */
+function form_select_options($element, $choices = NULL) {
+  if (!isset($choices)) {
+    $choices = $element['#options'];
+  }
+  // array_key_exists() accommodates the rare event where $element['#value'] is NULL.
+  // isset() fails in this situation.
+  $value_valid = isset($element['#value']) || array_key_exists('#value', $element);
+  $value_is_array = $value_valid && is_array($element['#value']);
+  $options = '';
+  foreach ($choices as $key => $choice) {
+    if (is_array($choice)) {
+      $options .= '<optgroup label="' . $key . '">';
+      $options .= form_select_options($element, $choice);
+      $options .= '</optgroup>';
+    }
+    elseif (is_object($choice)) {
+      $options .= form_select_options($element, $choice->option);
+    }
+    else {
+      $key = (string) $key;
+      if ($value_valid && (!$value_is_array && (string) $element['#value'] === $key || ($value_is_array && in_array($key, $element['#value'])))) {
+        $selected = ' selected="selected"';
+      }
+      else {
+        $selected = '';
+      }
+      $options .= '<option value="' . check_plain($key) . '"' . $selected . '>' . check_plain($choice) . '</option>';
+    }
+  }
+  return $options;
+}
+
+/**
+ * Returns the indexes of a select element's options matching a given key.
+ *
+ * This function is useful if you need to modify the options that are
+ * already in a form element; for example, to remove choices which are
+ * not valid because of additional filters imposed by another module.
+ * One example might be altering the choices in a taxonomy selector.
+ * To correctly handle the case of a multiple hierarchy taxonomy,
+ * #options arrays can now hold an array of objects, instead of a
+ * direct mapping of keys to labels, so that multiple choices in the
+ * selector can have the same key (and label). This makes it difficult
+ * to manipulate directly, which is why this helper function exists.
+ *
+ * This function does not support optgroups (when the elements of the
+ * #options array are themselves arrays), and will return FALSE if
+ * arrays are found. The caller must either flatten/restore or
+ * manually do their manipulations in this case, since returning the
+ * index is not sufficient, and supporting this would make the
+ * "helper" too complicated and cumbersome to be of any help.
+ *
+ * As usual with functions that can return array() or FALSE, do not
+ * forget to use === and !== if needed.
+ *
+ * @param $element
+ *   The select element to search.
+ * @param $key
+ *   The key to look for.
+ *
+ * @return
+ *   An array of indexes that match the given $key. Array will be
+ *   empty if no elements were found. FALSE if optgroups were found.
+ */
+function form_get_options($element, $key) {
+  $keys = array();
+  foreach ($element['#options'] as $index => $choice) {
+    if (is_array($choice)) {
+      return FALSE;
+    }
+    elseif (is_object($choice)) {
+      if (isset($choice->option[$key])) {
+        $keys[] = $index;
+      }
+    }
+    elseif ($index == $key) {
+      $keys[] = $index;
+    }
+  }
+  return $keys;
+}
+
+/**
+ * Returns HTML for a fieldset form element and its children.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #attributes, #children, #collapsed, #collapsible,
+ *     #description, #id, #title, #value.
+ *
+ * @ingroup themeable
+ */
+function theme_fieldset($variables) {
+  $element = $variables['element'];
+  element_set_attributes($element, array('id'));
+  _form_set_class($element, array('form-wrapper'));
+
+  $output = '<fieldset' . drupal_attributes($element['#attributes']) . '>';
+  if (!empty($element['#title'])) {
+    // Always wrap fieldset legends in a SPAN for CSS positioning.
+    $output .= '<legend><span class="fieldset-legend">' . $element['#title'] . '</span></legend>';
+  }
+  $output .= '<div class="fieldset-wrapper">';
+  if (!empty($element['#description'])) {
+    $output .= '<div class="fieldset-description">' . $element['#description'] . '</div>';
+  }
+  $output .= $element['#children'];
+  if (isset($element['#value'])) {
+    $output .= $element['#value'];
+  }
+  $output .= '</div>';
+  $output .= "</fieldset>\n";
+  return $output;
+}
+
+/**
+ * Returns HTML for a radio button form element.
+ *
+ * Note: The input "name" attribute needs to be sanitized before output, which
+ *       is currently done by passing all attributes to drupal_attributes().
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #required, #return_value, #value, #attributes, #title,
+ *     #description
+ *
+ * @ingroup themeable
+ */
+function theme_radio($variables) {
+  $element = $variables['element'];
+  $element['#attributes']['type'] = 'radio';
+  element_set_attributes($element, array('id', 'name', '#return_value' => 'value'));
+
+  if (isset($element['#return_value']) && $element['#value'] !== FALSE && $element['#value'] == $element['#return_value']) {
+    $element['#attributes']['checked'] = 'checked';
+  }
+  _form_set_class($element, array('form-radio'));
+
+  return '<input' . drupal_attributes($element['#attributes']) . ' />';
+}
+
+/**
+ * Returns HTML for a set of radio button form elements.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #title, #value, #options, #description, #required,
+ *     #attributes, #children.
+ *
+ * @ingroup themeable
+ */
+function theme_radios($variables) {
+  $element = $variables['element'];
+  $attributes = array();
+  if (isset($element['#id'])) {
+    $attributes['id'] = $element['#id'];
+  }
+  $attributes['class'] = 'form-radios';
+  if (!empty($element['#attributes']['class'])) {
+    $attributes['class'] .= ' ' . implode(' ', $element['#attributes']['class']);
+  }
+  if (isset($element['#attributes']['title'])) {
+    $attributes['title'] = $element['#attributes']['title'];
+  }
+  return '<div' . drupal_attributes($attributes) . '>' . (!empty($element['#children']) ? $element['#children'] : '') . '</div>';
+}
+
+/**
+ * Expand a password_confirm field into two text boxes.
+ */
+function form_process_password_confirm($element) {
+  $element['pass1'] =  array(
+    '#type' => 'password',
+    '#title' => t('Password'),
+    '#value' => empty($element['#value']) ? NULL : $element['#value']['pass1'],
+    '#required' => $element['#required'],
+    '#attributes' => array('class' => array('password-field')),
+  );
+  $element['pass2'] =  array(
+    '#type' => 'password',
+    '#title' => t('Confirm password'),
+    '#value' => empty($element['#value']) ? NULL : $element['#value']['pass2'],
+    '#required' => $element['#required'],
+    '#attributes' => array('class' => array('password-confirm')),
+  );
+  $element['#element_validate'] = array('password_confirm_validate');
+  $element['#tree'] = TRUE;
+
+  if (isset($element['#size'])) {
+    $element['pass1']['#size'] = $element['pass2']['#size'] = $element['#size'];
+  }
+
+  return $element;
+}
+
+/**
+ * Validates a password_confirm element.
+ */
+function password_confirm_validate($element, &$element_state) {
+  $pass1 = trim($element['pass1']['#value']);
+  $pass2 = trim($element['pass2']['#value']);
+  if (!empty($pass1) || !empty($pass2)) {
+    if (strcmp($pass1, $pass2)) {
+      form_error($element, t('The specified passwords do not match.'));
+    }
+  }
+  elseif ($element['#required'] && !empty($element_state['input'])) {
+    form_error($element, t('Password field is required.'));
+  }
+
+  // Password field must be converted from a two-element array into a single
+  // string regardless of validation results.
+  form_set_value($element['pass1'], NULL, $element_state);
+  form_set_value($element['pass2'], NULL, $element_state);
+  form_set_value($element, $pass1, $element_state);
+
+  return $element;
+
+}
+
+/**
+ * Returns HTML for a date selection form element.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #title, #value, #options, #description, #required,
+ *     #attributes.
+ *
+ * @ingroup themeable
+ */
+function theme_date($variables) {
+  $element = $variables['element'];
+
+  $attributes = array();
+  if (isset($element['#id'])) {
+    $attributes['id'] = $element['#id'];
+  }
+  if (!empty($element['#attributes']['class'])) {
+    $attributes['class'] = (array) $element['#attributes']['class'];
+  }
+  $attributes['class'][] = 'container-inline';
+
+  return '<div' . drupal_attributes($attributes) . '>' . drupal_render_children($element) . '</div>';
+}
+
+/**
+ * Expands a date element into year, month, and day select elements.
+ */
+function form_process_date($element) {
+  // Default to current date
+  if (empty($element['#value'])) {
+    $element['#value'] = array(
+      'day' => format_date(REQUEST_TIME, 'custom', 'j'),
+      'month' => format_date(REQUEST_TIME, 'custom', 'n'),
+      'year' => format_date(REQUEST_TIME, 'custom', 'Y'),
+    );
+  }
+
+  $element['#tree'] = TRUE;
+
+  // Determine the order of day, month, year in the site's chosen date format.
+  $format = variable_get('date_format_short', 'm/d/Y - H:i');
+  $sort = array();
+  $sort['day'] = max(strpos($format, 'd'), strpos($format, 'j'));
+  $sort['month'] = max(strpos($format, 'm'), strpos($format, 'M'));
+  $sort['year'] = strpos($format, 'Y');
+  asort($sort);
+  $order = array_keys($sort);
+
+  // Output multi-selector for date.
+  foreach ($order as $type) {
+    switch ($type) {
+      case 'day':
+        $options = drupal_map_assoc(range(1, 31));
+        $title = t('Day');
+        break;
+
+      case 'month':
+        $options = drupal_map_assoc(range(1, 12), 'map_month');
+        $title = t('Month');
+        break;
+
+      case 'year':
+        $options = drupal_map_assoc(range(1900, 2050));
+        $title = t('Year');
+        break;
+    }
+
+    $element[$type] = array(
+      '#type' => 'select',
+      '#title' => $title,
+      '#title_display' => 'invisible',
+      '#value' => $element['#value'][$type],
+      '#attributes' => $element['#attributes'],
+      '#options' => $options,
+    );
+  }
+
+  return $element;
+}
+
+/**
+ * Validates the date type to prevent invalid dates (e.g., February 30, 2006).
+ */
+function date_validate($element) {
+  if (!checkdate($element['#value']['month'], $element['#value']['day'], $element['#value']['year'])) {
+    form_error($element, t('The specified date is invalid.'));
+  }
+}
+
+/**
+ * Helper function for usage with drupal_map_assoc to display month names.
+ */
+function map_month($month) {
+  $months = &drupal_static(__FUNCTION__, array(
+    1 => 'Jan',
+    2 => 'Feb',
+    3 => 'Mar',
+    4 => 'Apr',
+    5 => 'May',
+    6 => 'Jun',
+    7 => 'Jul',
+    8 => 'Aug',
+    9 => 'Sep',
+    10 => 'Oct',
+    11 => 'Nov',
+    12 => 'Dec',
+  ));
+  return t($months[$month]);
+}
+
+/**
+ * Sets the value for a weight element, with zero as a default.
+ */
+function weight_value(&$form) {
+  if (isset($form['#default_value'])) {
+    $form['#value'] = $form['#default_value'];
+  }
+  else {
+    $form['#value'] = 0;
+  }
+}
+
+/**
+ * Expands a radios element into individual radio elements.
+ */
+function form_process_radios($element) {
+  if (count($element['#options']) > 0) {
+    $weight = 0;
+    foreach ($element['#options'] as $key => $choice) {
+      // Maintain order of options as defined in #options, in case the element
+      // defines custom option sub-elements, but does not define all option
+      // sub-elements.
+      $weight += 0.001;
+
+      $element += array($key => array());
+      // Generate the parents as the autogenerator does, so we will have a
+      // unique id for each radio button.
+      $parents_for_id = array_merge($element['#parents'], array($key));
+      $element[$key] += array(
+        '#type' => 'radio',
+        '#title' => $choice,
+        // The key is sanitized in drupal_attributes() during output from the
+        // theme function.
+        '#return_value' => $key,
+        // Use default or FALSE. A value of FALSE means that the radio button is
+        // not 'checked'.
+        '#default_value' => isset($element['#default_value']) ? $element['#default_value'] : FALSE,
+        '#attributes' => $element['#attributes'],
+        '#parents' => $element['#parents'],
+        '#id' => drupal_html_id('edit-' . implode('-', $parents_for_id)),
+        '#ajax' => isset($element['#ajax']) ? $element['#ajax'] : NULL,
+        '#weight' => $weight,
+      );
+    }
+  }
+  return $element;
+}
+
+/**
+ * Returns HTML for a checkbox form element.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #title, #value, #return_value, #description, #required,
+ *     #attributes, #checked.
+ *
+ * @ingroup themeable
+ */
+function theme_checkbox($variables) {
+  $element = $variables['element'];
+  $element['#attributes']['type'] = 'checkbox';
+  element_set_attributes($element, array('id', 'name', '#return_value' => 'value'));
+
+  // Unchecked checkbox has #value of integer 0.
+  if (!empty($element['#checked'])) {
+    $element['#attributes']['checked'] = 'checked';
+  }
+  _form_set_class($element, array('form-checkbox'));
+
+  return '<input' . drupal_attributes($element['#attributes']) . ' />';
+}
+
+/**
+ * Returns HTML for a set of checkbox form elements.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #children, #attributes.
+ *
+ * @ingroup themeable
+ */
+function theme_checkboxes($variables) {
+  $element = $variables['element'];
+  $attributes = array();
+  if (isset($element['#id'])) {
+    $attributes['id'] = $element['#id'];
+  }
+  $attributes['class'][] = 'form-checkboxes';
+  if (!empty($element['#attributes']['class'])) {
+    $attributes['class'] = array_merge($attributes['class'], $element['#attributes']['class']);
+  }
+  if (isset($element['#attributes']['title'])) {
+    $attributes['title'] = $element['#attributes']['title'];
+  }
+  return '<div' . drupal_attributes($attributes) . '>' . (!empty($element['#children']) ? $element['#children'] : '') . '</div>';
+}
+
+/**
+ * Adds form element theming to an element if its title or description is set.
+ *
+ * This is used as a pre render function for checkboxes and radios.
+ */
+function form_pre_render_conditional_form_element($element) {
+  $t = get_t();
+  // Set the element's title attribute to show #title as a tooltip, if needed.
+  if (isset($element['#title']) && $element['#title_display'] == 'attribute') {
+    $element['#attributes']['title'] = $element['#title'];
+    if (!empty($element['#required'])) {
+      // Append an indication that this field is required.
+      $element['#attributes']['title'] .= ' (' . $t('Required') . ')';
+    }
+  }
+
+  if (isset($element['#title']) || isset($element['#description'])) {
+    $element['#theme_wrappers'][] = 'form_element';
+  }
+  return $element;
+}
+
+/**
+ * Sets the #checked property of a checkbox element.
+ */
+function form_process_checkbox($element, $form_state) {
+  $value = $element['#value'];
+  $return_value = $element['#return_value'];
+  // On form submission, the #value of an available and enabled checked
+  // checkbox is #return_value, and the #value of an available and enabled
+  // unchecked checkbox is integer 0. On not submitted forms, and for
+  // checkboxes with #access=FALSE or #disabled=TRUE, the #value is
+  // #default_value (integer 0 if #default_value is NULL). Most of the time,
+  // a string comparison of #value and #return_value is sufficient for
+  // determining the "checked" state, but a value of TRUE always means checked
+  // (even if #return_value is 'foo'), and a value of FALSE or integer 0 always
+  // means unchecked (even if #return_value is '' or '0').
+  if ($value === TRUE || $value === FALSE || $value === 0) {
+    $element['#checked'] = (bool) $value;
+  }
+  else {
+    // Compare as strings, so that 15 is not considered equal to '15foo', but 1
+    // is considered equal to '1'. This cast does not imply that either #value
+    // or #return_value is expected to be a string.
+    $element['#checked'] = ((string) $value === (string) $return_value);
+  }
+  return $element;
+}
+
+/**
+ * Processes a checkboxes form element.
+ */
+function form_process_checkboxes($element) {
+  $value = is_array($element['#value']) ? $element['#value'] : array();
+  $element['#tree'] = TRUE;
+  if (count($element['#options']) > 0) {
+    if (!isset($element['#default_value']) || $element['#default_value'] == 0) {
+      $element['#default_value'] = array();
+    }
+    $weight = 0;
+    foreach ($element['#options'] as $key => $choice) {
+      // Integer 0 is not a valid #return_value, so use '0' instead.
+      // @see form_type_checkbox_value().
+      // @todo For Drupal 8, cast all integer keys to strings for consistency
+      //   with form_process_radios().
+      if ($key === 0) {
+        $key = '0';
+      }
+      // Maintain order of options as defined in #options, in case the element
+      // defines custom option sub-elements, but does not define all option
+      // sub-elements.
+      $weight += 0.001;
+
+      $element += array($key => array());
+      $element[$key] += array(
+        '#type' => 'checkbox',
+        '#title' => $choice,
+        '#return_value' => $key,
+        '#default_value' => isset($value[$key]) ? $key : NULL,
+        '#attributes' => $element['#attributes'],
+        '#ajax' => isset($element['#ajax']) ? $element['#ajax'] : NULL,
+        '#weight' => $weight,
+      );
+    }
+  }
+  return $element;
+}
+
+/**
+ * Processes a form actions container element.
+ *
+ * @param $element
+ *   An associative array containing the properties and children of the
+ *   form actions container.
+ * @param $form_state
+ *   The $form_state array for the form this element belongs to.
+ *
+ * @return
+ *   The processed element.
+ */
+function form_process_actions($element, &$form_state) {
+  $element['#attributes']['class'][] = 'form-actions';
+  return $element;
+}
+
+/**
+ * Processes a container element.
+ *
+ * @param $element
+ *   An associative array containing the properties and children of the
+ *   container.
+ * @param $form_state
+ *   The $form_state array for the form this element belongs to.
+ *
+ * @return
+ *   The processed element.
+ */
+function form_process_container($element, &$form_state) {
+  // Generate the ID of the element if it's not explicitly given.
+  if (!isset($element['#id'])) {
+    $element['#id'] = drupal_html_id(implode('-', $element['#parents']) . '-wrapper');
+  }
+  return $element;
+}
+
+/**
+ * Returns HTML to wrap child elements in a container.
+ *
+ * Used for grouped form items. Can also be used as a #theme_wrapper for any
+ * renderable element, to surround it with a <div> and add attributes such as
+ * classes or an HTML id.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #id, #attributes, #children.
+ *
+ * @ingroup themeable
+ */
+function theme_container($variables) {
+  $element = $variables['element'];
+
+  // Special handling for form elements.
+  if (isset($element['#array_parents'])) {
+    // Assign an html ID.
+    if (!isset($element['#attributes']['id'])) {
+      $element['#attributes']['id'] = $element['#id'];
+    }
+    // Add the 'form-wrapper' class.
+    $element['#attributes']['class'][] = 'form-wrapper';
+  }
+
+  return '<div' . drupal_attributes($element['#attributes']) . '>' . $element['#children'] . '</div>';
+}
+
+/**
+ * Returns HTML for a table with radio buttons or checkboxes.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties and children of
+ *     the tableselect element. Properties used: #header, #options, #empty,
+ *     and #js_select. The #options property is an array of selection options;
+ *     each array element of #options is an array of properties. These
+ *     properties can include #attributes, which is added to the
+ *     table row's HTML attributes; see theme_table(). An example of per-row
+ *     options:
+ *     @code
+ *     $options = array(
+ *       array(
+ *         'title' => 'How to Learn Drupal',
+ *         'content_type' => 'Article',
+ *         'status' => 'published',
+ *         '#attributes' => array('class' => array('article-row')),
+ *       ),
+ *       array(
+ *         'title' => 'Privacy Policy',
+ *         'content_type' => 'Page',
+ *         'status' => 'published',
+ *         '#attributes' => array('class' => array('page-row')),
+ *       ),
+ *     );
+ *     $header = array(
+ *       'title' => t('Title'),
+ *       'content_type' => t('Content type'),
+ *       'status' => t('Status'),
+ *     );
+ *     $form['table'] = array(
+ *       '#type' => 'tableselect',
+ *       '#header' => $header,
+ *       '#options' => $options,
+ *       '#empty' => t('No content available.'),
+ *     );
+ *     @endcode
+ *
+ * @ingroup themeable
+ */
+function theme_tableselect($variables) {
+  $element = $variables['element'];
+  $rows = array();
+  $header = $element['#header'];
+  if (!empty($element['#options'])) {
+    // Generate a table row for each selectable item in #options.
+    foreach (element_children($element) as $key) {
+      $row = array();
+
+      $row['data'] = array();
+      if (isset($element['#options'][$key]['#attributes'])) {
+        $row += $element['#options'][$key]['#attributes'];
+      }
+      // Render the checkbox / radio element.
+      $row['data'][] = drupal_render($element[$key]);
+
+      // As theme_table only maps header and row columns by order, create the
+      // correct order by iterating over the header fields.
+      foreach ($element['#header'] as $fieldname => $title) {
+        $row['data'][] = $element['#options'][$key][$fieldname];
+      }
+      $rows[] = $row;
+    }
+    // Add an empty header or a "Select all" checkbox to provide room for the
+    // checkboxes/radios in the first table column.
+    if ($element['#js_select']) {
+      // Add a "Select all" checkbox.
+      drupal_add_js('misc/tableselect.js');
+      array_unshift($header, array('class' => array('select-all')));
+    }
+    else {
+      // Add an empty header when radio buttons are displayed or a "Select all"
+      // checkbox is not desired.
+      array_unshift($header, '');
+    }
+  }
+  return theme('table', array('header' => $header, 'rows' => $rows, 'empty' => $element['#empty'], 'attributes' => $element['#attributes']));
+}
+
+/**
+ * Creates checkbox or radio elements to populate a tableselect table.
+ *
+ * @param $element
+ *   An associative array containing the properties and children of the
+ *   tableselect element.
+ *
+ * @return
+ *   The processed element.
+ */
+function form_process_tableselect($element) {
+
+  if ($element['#multiple']) {
+    $value = is_array($element['#value']) ? $element['#value'] : array();
+  }
+  else {
+    // Advanced selection behavior makes no sense for radios.
+    $element['#js_select'] = FALSE;
+  }
+
+  $element['#tree'] = TRUE;
+
+  if (count($element['#options']) > 0) {
+    if (!isset($element['#default_value']) || $element['#default_value'] === 0) {
+      $element['#default_value'] = array();
+    }
+
+    // Create a checkbox or radio for each item in #options in such a way that
+    // the value of the tableselect element behaves as if it had been of type
+    // checkboxes or radios.
+    foreach ($element['#options'] as $key => $choice) {
+      // Do not overwrite manually created children.
+      if (!isset($element[$key])) {
+        if ($element['#multiple']) {
+          $title = '';
+          if (!empty($element['#options'][$key]['title']['data']['#title'])) {
+            $title = t('Update @title', array(
+              '@title' => $element['#options'][$key]['title']['data']['#title'],
+            ));
+          }
+          $element[$key] = array(
+            '#type' => 'checkbox',
+            '#title' => $title,
+            '#title_display' => 'invisible',
+            '#return_value' => $key,
+            '#default_value' => isset($value[$key]) ? $key : NULL,
+            '#attributes' => $element['#attributes'],
+          );
+        }
+        else {
+          // Generate the parents as the autogenerator does, so we will have a
+          // unique id for each radio button.
+          $parents_for_id = array_merge($element['#parents'], array($key));
+          $element[$key] = array(
+            '#type' => 'radio',
+            '#title' => '',
+            '#return_value' => $key,
+            '#default_value' => ($element['#default_value'] == $key) ? $key : NULL,
+            '#attributes' => $element['#attributes'],
+            '#parents' => $element['#parents'],
+            '#id' => drupal_html_id('edit-' . implode('-', $parents_for_id)),
+            '#ajax' => isset($element['#ajax']) ? $element['#ajax'] : NULL,
+          );
+        }
+        if (isset($element['#options'][$key]['#weight'])) {
+          $element[$key]['#weight'] = $element['#options'][$key]['#weight'];
+        }
+      }
+    }
+  }
+  else {
+    $element['#value'] = array();
+  }
+  return $element;
+}
+
+/**
+ * Processes a machine-readable name form element.
+ *
+ * @param $element
+ *   The form element to process. Properties used:
+ *   - #machine_name: An associative array containing:
+ *     - exists: A function name to invoke for checking whether a submitted
+ *       machine name value already exists. The submitted value is passed as
+ *       argument. In most cases, an existing API or menu argument loader
+ *       function can be re-used. The callback is only invoked, if the submitted
+ *       value differs from the element's #default_value.
+ *     - source: (optional) The #array_parents of the form element containing
+ *       the human-readable name (i.e., as contained in the $form structure) to
+ *       use as source for the machine name. Defaults to array('name').
+ *     - label: (optional) A text to display as label for the machine name value
+ *       after the human-readable name form element. Defaults to "Machine name".
+ *     - replace_pattern: (optional) A regular expression (without delimiters)
+ *       matching disallowed characters in the machine name. Defaults to
+ *       '[^a-z0-9_]+'.
+ *     - replace: (optional) A character to replace disallowed characters in the
+ *       machine name via JavaScript. Defaults to '_' (underscore). When using a
+ *       different character, 'replace_pattern' needs to be set accordingly.
+ *     - error: (optional) A custom form error message string to show, if the
+ *       machine name contains disallowed characters.
+ *     - standalone: (optional) Whether the live preview should stay in its own
+ *       form element rather than in the suffix of the source element. Defaults
+ *       to FALSE.
+ *   - #maxlength: (optional) Should be set to the maximum allowed length of the
+ *     machine name. Defaults to 64.
+ *   - #disabled: (optional) Should be set to TRUE in case an existing machine
+ *     name must not be changed after initial creation.
+ */
+function form_process_machine_name($element, &$form_state) {
+  // Apply default form element properties.
+  $element += array(
+    '#title' => t('Machine-readable name'),
+    '#description' => t('A unique machine-readable name. Can only contain lowercase letters, numbers, and underscores.'),
+    '#machine_name' => array(),
+    '#field_prefix' => '',
+    '#field_suffix' => '',
+    '#suffix' => '',
+  );
+  // A form element that only wants to set one #machine_name property (usually
+  // 'source' only) would leave all other properties undefined, if the defaults
+  // were defined in hook_element_info(). Therefore, we apply the defaults here.
+  $element['#machine_name'] += array(
+    'source' => array('name'),
+    'target' => '#' . $element['#id'],
+    'label' => t('Machine name'),
+    'replace_pattern' => '[^a-z0-9_]+',
+    'replace' => '_',
+    'standalone' => FALSE,
+    'field_prefix' => $element['#field_prefix'],
+    'field_suffix' => $element['#field_suffix'],
+  );
+
+  // By default, machine names are restricted to Latin alphanumeric characters.
+  // So, default to LTR directionality.
+  if (!isset($element['#attributes'])) {
+    $element['#attributes'] = array();
+  }
+  $element['#attributes'] += array('dir' => 'ltr');
+
+  // The source element defaults to array('name'), but may have been overidden.
+  if (empty($element['#machine_name']['source'])) {
+    return $element;
+  }
+
+  // Retrieve the form element containing the human-readable name from the
+  // complete form in $form_state. By reference, because we may need to append
+  // a #field_suffix that will hold the live preview.
+  $key_exists = NULL;
+  $source = drupal_array_get_nested_value($form_state['complete form'], $element['#machine_name']['source'], $key_exists);
+  if (!$key_exists) {
+    return $element;
+  }
+
+  $suffix_id = $source['#id'] . '-machine-name-suffix';
+  $element['#machine_name']['suffix'] = '#' . $suffix_id;
+
+  if ($element['#machine_name']['standalone']) {
+    $element['#suffix'] .= ' <small id="' . $suffix_id . '">&nbsp;</small>';
+  }
+  else {
+    // Append a field suffix to the source form element, which will contain
+    // the live preview of the machine name.
+    $source += array('#field_suffix' => '');
+    $source['#field_suffix'] .= ' <small id="' . $suffix_id . '">&nbsp;</small>';
+
+    $parents = array_merge($element['#machine_name']['source'], array('#field_suffix'));
+    drupal_array_set_nested_value($form_state['complete form'], $parents, $source['#field_suffix']);
+  }
+
+  $js_settings = array(
+    'type' => 'setting',
+    'data' => array(
+      'machineName' => array(
+        '#' . $source['#id'] => $element['#machine_name'],
+      ),
+    ),
+  );
+  $element['#attached']['js'][] = 'misc/machine-name.js';
+  $element['#attached']['js'][] = $js_settings;
+
+  return $element;
+}
+
+/**
+ * Form element validation handler for machine_name elements.
+ *
+ * Note that #maxlength is validated by _form_validate() already.
+ */
+function form_validate_machine_name(&$element, &$form_state) {
+  // Verify that the machine name not only consists of replacement tokens.
+  if (preg_match('@^' . $element['#machine_name']['replace'] . '+$@', $element['#value'])) {
+    form_error($element, t('The machine-readable name must contain unique characters.'));
+  }
+
+  // Verify that the machine name contains no disallowed characters.
+  if (preg_match('@' . $element['#machine_name']['replace_pattern'] . '@', $element['#value'])) {
+    if (!isset($element['#machine_name']['error'])) {
+      // Since a hyphen is the most common alternative replacement character,
+      // a corresponding validation error message is supported here.
+      if ($element['#machine_name']['replace'] == '-') {
+        form_error($element, t('The machine-readable name must contain only lowercase letters, numbers, and hyphens.'));
+      }
+      // Otherwise, we assume the default (underscore).
+      else {
+        form_error($element, t('The machine-readable name must contain only lowercase letters, numbers, and underscores.'));
+      }
+    }
+    else {
+      form_error($element, $element['#machine_name']['error']);
+    }
+  }
+
+  // Verify that the machine name is unique.
+  if ($element['#default_value'] !== $element['#value']) {
+    $function = $element['#machine_name']['exists'];
+    if ($function($element['#value'], $element, $form_state)) {
+      form_error($element, t('The machine-readable name is already in use. It must be unique.'));
+    }
+  }
+}
+
+/**
+ * Arranges fieldsets into groups.
+ *
+ * @param $element
+ *   An associative array containing the properties and children of the
+ *   fieldset. Note that $element must be taken by reference here, so processed
+ *   child elements are taken over into $form_state.
+ * @param $form_state
+ *   The $form_state array for the form this fieldset belongs to.
+ *
+ * @return
+ *   The processed element.
+ */
+function form_process_fieldset(&$element, &$form_state) {
+  $parents = implode('][', $element['#parents']);
+
+  // Each fieldset forms a new group. The #type 'vertical_tabs' basically only
+  // injects a new fieldset.
+  $form_state['groups'][$parents]['#group_exists'] = TRUE;
+  $element['#groups'] = &$form_state['groups'];
+
+  // Process vertical tabs group member fieldsets.
+  if (isset($element['#group'])) {
+    // Add this fieldset to the defined group (by reference).
+    $group = $element['#group'];
+    $form_state['groups'][$group][] = &$element;
+  }
+
+  // Contains form element summary functionalities.
+  $element['#attached']['library'][] = array('system', 'drupal.form');
+
+  // The .form-wrapper class is required for #states to treat fieldsets like
+  // containers.
+  if (!isset($element['#attributes']['class'])) {
+    $element['#attributes']['class'] = array();
+  }
+
+  // Collapsible fieldsets
+  if (!empty($element['#collapsible'])) {
+    $element['#attached']['library'][] = array('system', 'drupal.collapse');
+    $element['#attributes']['class'][] = 'collapsible';
+    if (!empty($element['#collapsed'])) {
+      $element['#attributes']['class'][] = 'collapsed';
+    }
+  }
+
+  return $element;
+}
+
+/**
+ * Adds members of this group as actual elements for rendering.
+ *
+ * @param $element
+ *   An associative array containing the properties and children of the
+ *   fieldset.
+ *
+ * @return
+ *   The modified element with all group members.
+ */
+function form_pre_render_fieldset($element) {
+  // Fieldsets may be rendered outside of a Form API context.
+  if (!isset($element['#parents']) || !isset($element['#groups'])) {
+    return $element;
+  }
+  // Inject group member elements belonging to this group.
+  $parents = implode('][', $element['#parents']);
+  $children = element_children($element['#groups'][$parents]);
+  if (!empty($children)) {
+    foreach ($children as $key) {
+      // Break references and indicate that the element should be rendered as
+      // group member.
+      $child = (array) $element['#groups'][$parents][$key];
+      $child['#group_fieldset'] = TRUE;
+      // Inject the element as new child element.
+      $element[] = $child;
+
+      $sort = TRUE;
+    }
+    // Re-sort the element's children if we injected group member elements.
+    if (isset($sort)) {
+      $element['#sorted'] = FALSE;
+    }
+  }
+
+  if (isset($element['#group'])) {
+    $group = $element['#group'];
+    // If this element belongs to a group, but the group-holding element does
+    // not exist, we need to render it (at its original location).
+    if (!isset($element['#groups'][$group]['#group_exists'])) {
+      // Intentionally empty to clarify the flow; we simply return $element.
+    }
+    // If we injected this element into the group, then we want to render it.
+    elseif (!empty($element['#group_fieldset'])) {
+      // Intentionally empty to clarify the flow; we simply return $element.
+    }
+    // Otherwise, this element belongs to a group and the group exists, so we do
+    // not render it.
+    elseif (element_children($element['#groups'][$group])) {
+      $element['#printed'] = TRUE;
+    }
+  }
+
+  return $element;
+}
+
+/**
+ * Creates a group formatted as vertical tabs.
+ *
+ * @param $element
+ *   An associative array containing the properties and children of the
+ *   fieldset.
+ * @param $form_state
+ *   The $form_state array for the form this vertical tab widget belongs to.
+ *
+ * @return
+ *   The processed element.
+ */
+function form_process_vertical_tabs($element, &$form_state) {
+  // Inject a new fieldset as child, so that form_process_fieldset() processes
+  // this fieldset like any other fieldset.
+  $element['group'] = array(
+    '#type' => 'fieldset',
+    '#theme_wrappers' => array(),
+    '#parents' => $element['#parents'],
+  );
+
+  // The JavaScript stores the currently selected tab in this hidden
+  // field so that the active tab can be restored the next time the
+  // form is rendered, e.g. on preview pages or when form validation
+  // fails.
+  $name = implode('__', $element['#parents']);
+  if (isset($form_state['values'][$name . '__active_tab'])) {
+    $element['#default_tab'] = $form_state['values'][$name . '__active_tab'];
+  }
+  $element[$name . '__active_tab'] = array(
+    '#type' => 'hidden',
+    '#default_value' => $element['#default_tab'],
+    '#attributes' => array('class' => array('vertical-tabs-active-tab')),
+  );
+
+  return $element;
+}
+
+/**
+ * Returns HTML for an element's children fieldsets as vertical tabs.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties and children of
+ *     the fieldset. Properties used: #children.
+ *
+ * @ingroup themeable
+ */
+function theme_vertical_tabs($variables) {
+  $element = $variables['element'];
+  // Add required JavaScript and Stylesheet.
+  drupal_add_library('system', 'drupal.vertical-tabs');
+
+  $output = '<h2 class="element-invisible">' . t('Vertical Tabs') . '</h2>';
+  $output .= '<div class="vertical-tabs-panes">' . $element['#children'] . '</div>';
+  return $output;
+}
+
+/**
+ * Returns HTML for a submit button form element.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #attributes, #button_type, #name, #value.
+ *
+ * @ingroup themeable
+ */
+function theme_submit($variables) {
+  return theme('button', $variables['element']);
+}
+
+/**
+ * Returns HTML for a button form element.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #attributes, #button_type, #name, #value.
+ *
+ * @ingroup themeable
+ */
+function theme_button($variables) {
+  $element = $variables['element'];
+  $element['#attributes']['type'] = 'submit';
+  element_set_attributes($element, array('id', 'name', 'value'));
+
+  $element['#attributes']['class'][] = 'form-' . $element['#button_type'];
+  if (!empty($element['#attributes']['disabled'])) {
+    $element['#attributes']['class'][] = 'form-button-disabled';
+  }
+
+  return '<input' . drupal_attributes($element['#attributes']) . ' />';
+}
+
+/**
+ * Returns HTML for an image button form element.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #attributes, #button_type, #name, #value, #title, #src.
+ *
+ * @ingroup themeable
+ */
+function theme_image_button($variables) {
+  $element = $variables['element'];
+  $element['#attributes']['type'] = 'image';
+  element_set_attributes($element, array('id', 'name', 'value'));
+
+  $element['#attributes']['src'] = file_create_url($element['#src']);
+  if (!empty($element['#title'])) {
+    $element['#attributes']['alt'] = $element['#title'];
+    $element['#attributes']['title'] = $element['#title'];
+  }
+
+  $element['#attributes']['class'][] = 'form-' . $element['#button_type'];
+  if (!empty($element['#attributes']['disabled'])) {
+    $element['#attributes']['class'][] = 'form-button-disabled';
+  }
+
+  return '<input' . drupal_attributes($element['#attributes']) . ' />';
+}
+
+/**
+ * Returns HTML for a hidden form element.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #name, #value, #attributes.
+ *
+ * @ingroup themeable
+ */
+function theme_hidden($variables) {
+  $element = $variables['element'];
+  $element['#attributes']['type'] = 'hidden';
+  element_set_attributes($element, array('name', 'value'));
+  return '<input' . drupal_attributes($element['#attributes']) . " />\n";
+}
+
+/**
+ * Returns HTML for a textfield form element.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #title, #value, #description, #size, #maxlength,
+ *     #required, #attributes, #autocomplete_path.
+ *
+ * @ingroup themeable
+ */
+function theme_textfield($variables) {
+  $element = $variables['element'];
+  $element['#attributes']['type'] = 'text';
+  element_set_attributes($element, array('id', 'name', 'value', 'size', 'maxlength'));
+  _form_set_class($element, array('form-text'));
+
+  $extra = '';
+  if ($element['#autocomplete_path'] && drupal_valid_path($element['#autocomplete_path'])) {
+    drupal_add_library('system', 'drupal.autocomplete');
+    $element['#attributes']['class'][] = 'form-autocomplete';
+
+    $attributes = array();
+    $attributes['type'] = 'hidden';
+    $attributes['id'] = $element['#attributes']['id'] . '-autocomplete';
+    $attributes['value'] = url($element['#autocomplete_path'], array('absolute' => TRUE));
+    $attributes['disabled'] = 'disabled';
+    $attributes['class'][] = 'autocomplete';
+    $extra = '<input' . drupal_attributes($attributes) . ' />';
+  }
+
+  $output = '<input' . drupal_attributes($element['#attributes']) . ' />';
+
+  return $output . $extra;
+}
+
+/**
+ * Returns HTML for a form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #action, #method, #attributes, #children
+ *
+ * @ingroup themeable
+ */
+function theme_form($variables) {
+  $element = $variables['element'];
+  if (isset($element['#action'])) {
+    $element['#attributes']['action'] = drupal_strip_dangerous_protocols($element['#action']);
+  }
+  element_set_attributes($element, array('method', 'id'));
+  if (empty($element['#attributes']['accept-charset'])) {
+    $element['#attributes']['accept-charset'] = "UTF-8";
+  }
+  // Anonymous DIV to satisfy XHTML compliance.
+  return '<form' . drupal_attributes($element['#attributes']) . '><div>' . $element['#children'] . '</div></form>';
+}
+
+/**
+ * Returns HTML for a textarea form element.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #title, #value, #description, #rows, #cols, #required,
+ *     #attributes
+ *
+ * @ingroup themeable
+ */
+function theme_textarea($variables) {
+  $element = $variables['element'];
+  element_set_attributes($element, array('id', 'name', 'cols', 'rows'));
+  _form_set_class($element, array('form-textarea'));
+
+  $wrapper_attributes = array(
+    'class' => array('form-textarea-wrapper'),
+  );
+
+  // Add resizable behavior.
+  if (!empty($element['#resizable'])) {
+    drupal_add_library('system', 'drupal.textarea');
+    $wrapper_attributes['class'][] = 'resizable';
+  }
+
+  $output = '<div' . drupal_attributes($wrapper_attributes) . '>';
+  $output .= '<textarea' . drupal_attributes($element['#attributes']) . '>' . check_plain($element['#value']) . '</textarea>';
+  $output .= '</div>';
+  return $output;
+}
+
+/**
+ * Returns HTML for a password form element.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #title, #value, #description, #size, #maxlength,
+ *     #required, #attributes.
+ *
+ * @ingroup themeable
+ */
+function theme_password($variables) {
+  $element = $variables['element'];
+  $element['#attributes']['type'] = 'password';
+  element_set_attributes($element, array('id', 'name', 'size', 'maxlength'));
+  _form_set_class($element, array('form-text'));
+
+  return '<input' . drupal_attributes($element['#attributes']) . ' />';
+}
+
+/**
+ * Expands a weight element into a select element.
+ */
+function form_process_weight($element) {
+  $element['#is_weight'] = TRUE;
+
+  // If the number of options is small enough, use a select field.
+  $max_elements = variable_get('drupal_weight_select_max', DRUPAL_WEIGHT_SELECT_MAX);
+  if ($element['#delta'] <= $max_elements) {
+    $element['#type'] = 'select';
+    for ($n = (-1 * $element['#delta']); $n <= $element['#delta']; $n++) {
+      $weights[$n] = $n;
+    }
+    $element['#options'] = $weights;
+    $element += element_info('select');
+  }
+  // Otherwise, use a text field.
+  else {
+    $element['#type'] = 'textfield';
+    // Use a field big enough to fit most weights.
+    $element['#size'] = 10;
+    $element['#element_validate'] = array('element_validate_integer');
+    $element += element_info('textfield');
+  }
+
+  return $element;
+}
+
+/**
+ * Returns HTML for a file upload form element.
+ *
+ * For assistance with handling the uploaded file correctly, see the API
+ * provided by file.inc.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #title, #name, #size, #description, #required,
+ *     #attributes.
+ *
+ * @ingroup themeable
+ */
+function theme_file($variables) {
+  $element = $variables['element'];
+  $element['#attributes']['type'] = 'file';
+  element_set_attributes($element, array('id', 'name', 'size'));
+  _form_set_class($element, array('form-file'));
+
+  return '<input' . drupal_attributes($element['#attributes']) . ' />';
+}
+
+/**
+ * Returns HTML for a form element.
+ *
+ * Each form element is wrapped in a DIV container having the following CSS
+ * classes:
+ * - form-item: Generic for all form elements.
+ * - form-type-#type: The internal element #type.
+ * - form-item-#name: The internal form element #name (usually derived from the
+ *   $form structure and set via form_builder()).
+ * - form-disabled: Only set if the form element is #disabled.
+ *
+ * In addition to the element itself, the DIV contains a label for the element
+ * based on the optional #title_display property, and an optional #description.
+ *
+ * The optional #title_display property can have these values:
+ * - before: The label is output before the element. This is the default.
+ *   The label includes the #title and the required marker, if #required.
+ * - after: The label is output after the element. For example, this is used
+ *   for radio and checkbox #type elements as set in system_element_info().
+ *   If the #title is empty but the field is #required, the label will
+ *   contain only the required marker.
+ * - invisible: Labels are critical for screen readers to enable them to
+ *   properly navigate through forms but can be visually distracting. This
+ *   property hides the label for everyone except screen readers.
+ * - attribute: Set the title attribute on the element to create a tooltip
+ *   but output no label element. This is supported only for checkboxes
+ *   and radios in form_pre_render_conditional_form_element(). It is used
+ *   where a visual label is not needed, such as a table of checkboxes where
+ *   the row and column provide the context. The tooltip will include the
+ *   title and required marker.
+ *
+ * If the #title property is not set, then the label and any required marker
+ * will not be output, regardless of the #title_display or #required values.
+ * This can be useful in cases such as the password_confirm element, which
+ * creates children elements that have their own labels and required markers,
+ * but the parent element should have neither. Use this carefully because a
+ * field without an associated label can cause accessibility challenges.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #title, #title_display, #description, #id, #required,
+ *     #children, #type, #name.
+ *
+ * @ingroup themeable
+ */
+function theme_form_element($variables) {
+  $element = &$variables['element'];
+
+  // This function is invoked as theme wrapper, but the rendered form element
+  // may not necessarily have been processed by form_builder().
+  $element += array(
+    '#title_display' => 'before',
+  );
+
+  // Add element #id for #type 'item'.
+  if (isset($element['#markup']) && !empty($element['#id'])) {
+    $attributes['id'] = $element['#id'];
+  }
+  // Add element's #type and #name as class to aid with JS/CSS selectors.
+  $attributes['class'] = array('form-item');
+  if (!empty($element['#type'])) {
+    $attributes['class'][] = 'form-type-' . strtr($element['#type'], '_', '-');
+  }
+  if (!empty($element['#name'])) {
+    $attributes['class'][] = 'form-item-' . strtr($element['#name'], array(' ' => '-', '_' => '-', '[' => '-', ']' => ''));
+  }
+  // Add a class for disabled elements to facilitate cross-browser styling.
+  if (!empty($element['#attributes']['disabled'])) {
+    $attributes['class'][] = 'form-disabled';
+  }
+  $output = '<div' . drupal_attributes($attributes) . '>' . "\n";
+
+  // If #title is not set, we don't display any label or required marker.
+  if (!isset($element['#title'])) {
+    $element['#title_display'] = 'none';
+  }
+  $prefix = isset($element['#field_prefix']) ? '<span class="field-prefix">' . $element['#field_prefix'] . '</span> ' : '';
+  $suffix = isset($element['#field_suffix']) ? ' <span class="field-suffix">' . $element['#field_suffix'] . '</span>' : '';
+
+  switch ($element['#title_display']) {
+    case 'before':
+    case 'invisible':
+      $output .= ' ' . theme('form_element_label', $variables);
+      $output .= ' ' . $prefix . $element['#children'] . $suffix . "\n";
+      break;
+
+    case 'after':
+      $output .= ' ' . $prefix . $element['#children'] . $suffix;
+      $output .= ' ' . theme('form_element_label', $variables) . "\n";
+      break;
+
+    case 'none':
+    case 'attribute':
+      // Output no label and no required marker, only the children.
+      $output .= ' ' . $prefix . $element['#children'] . $suffix . "\n";
+      break;
+  }
+
+  if (!empty($element['#description'])) {
+    $output .= '<div class="description">' . $element['#description'] . "</div>\n";
+  }
+
+  $output .= "</div>\n";
+
+  return $output;
+}
+
+/**
+ * Returns HTML for a marker for required form elements.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *
+ * @ingroup themeable
+ */
+function theme_form_required_marker($variables) {
+  // This is also used in the installer, pre-database setup.
+  $t = get_t();
+  $attributes = array(
+    'class' => 'form-required',
+    'title' => $t('This field is required.'),
+  );
+  return '<span' . drupal_attributes($attributes) . '>*</span>';
+}
+
+/**
+ * Returns HTML for a form element label and required marker.
+ *
+ * Form element labels include the #title and a #required marker. The label is
+ * associated with the element itself by the element #id. Labels may appear
+ * before or after elements, depending on theme_form_element() and
+ * #title_display.
+ *
+ * This function will not be called for elements with no labels, depending on
+ * #title_display. For elements that have an empty #title and are not required,
+ * this function will output no label (''). For required elements that have an
+ * empty #title, this will output the required marker alone within the label.
+ * The label will use the #id to associate the marker with the field that is
+ * required. That is especially important for screenreader users to know
+ * which field is required.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #required, #title, #id, #value, #description.
+ *
+ * @ingroup themeable
+ */
+function theme_form_element_label($variables) {
+  $element = $variables['element'];
+  // This is also used in the installer, pre-database setup.
+  $t = get_t();
+
+  // If title and required marker are both empty, output no label.
+  if ((!isset($element['#title']) || $element['#title'] === '') && empty($element['#required'])) {
+    return '';
+  }
+
+  // If the element is required, a required marker is appended to the label.
+  $required = !empty($element['#required']) ? theme('form_required_marker', array('element' => $element)) : '';
+
+  $title = filter_xss_admin($element['#title']);
+
+  $attributes = array();
+  // Style the label as class option to display inline with the element.
+  if ($element['#title_display'] == 'after') {
+    $attributes['class'] = 'option';
+  }
+  // Show label only to screen readers to avoid disruption in visual flows.
+  elseif ($element['#title_display'] == 'invisible') {
+    $attributes['class'] = 'element-invisible';
+  }
+
+  if (!empty($element['#id'])) {
+    $attributes['for'] = $element['#id'];
+  }
+
+  // The leading whitespace helps visually separate fields from inline labels.
+  return ' <label' . drupal_attributes($attributes) . '>' . $t('!title !required', array('!title' => $title, '!required' => $required)) . "</label>\n";
+}
+
+/**
+ * Sets a form element's class attribute.
+ *
+ * Adds 'required' and 'error' classes as needed.
+ *
+ * @param $element
+ *   The form element.
+ * @param $name
+ *   Array of new class names to be added.
+ */
+function _form_set_class(&$element, $class = array()) {
+  if (!empty($class)) {
+    if (!isset($element['#attributes']['class'])) {
+      $element['#attributes']['class'] = array();
+    }
+    $element['#attributes']['class'] = array_merge($element['#attributes']['class'], $class);
+  }
+  // This function is invoked from form element theme functions, but the
+  // rendered form element may not necessarily have been processed by
+  // form_builder().
+  if (!empty($element['#required'])) {
+    $element['#attributes']['class'][] = 'required';
+  }
+  if (isset($element['#parents']) && form_get_error($element) !== NULL && !empty($element['#validated'])) {
+    $element['#attributes']['class'][] = 'error';
+  }
+}
+
+/**
+ * Form element validation handler for integer elements.
+ */
+function element_validate_integer($element, &$form_state) {
+  $value = $element['#value'];
+  if ($value !== '' && (!is_numeric($value) || intval($value) != $value)) {
+    form_error($element, t('%name must be an integer.', array('%name' => $element['#title'])));
+  }
+}
+
+/**
+ * Form element validation handler for integer elements that must be positive.
+ */
+function element_validate_integer_positive($element, &$form_state) {
+  $value = $element['#value'];
+  if ($value !== '' && (!is_numeric($value) || intval($value) != $value || $value <= 0)) {
+    form_error($element, t('%name must be a positive integer.', array('%name' => $element['#title'])));
+  }
+}
+
+/**
+ * Form element validation handler for number elements.
+ */
+function element_validate_number($element, &$form_state) {
+  $value = $element['#value'];
+  if ($value != '' && !is_numeric($value)) {
+    form_error($element, t('%name must be a number.', array('%name' => $element['#title'])));
+  }
+}
+
+/**
+ * @} End of "defgroup form_api".
+ */
+
+/**
+ * @defgroup batch Batch operations
+ * @{
+ * Creates and processes batch operations.
+ *
+ * Functions allowing forms processing to be spread out over several page
+ * requests, thus ensuring that the processing does not get interrupted
+ * because of a PHP timeout, while allowing the user to receive feedback
+ * on the progress of the ongoing operations.
+ *
+ * The API is primarily designed to integrate nicely with the Form API
+ * workflow, but can also be used by non-Form API scripts (like update.php)
+ * or even simple page callbacks (which should probably be used sparingly).
+ *
+ * Example:
+ * @code
+ * $batch = array(
+ *   'title' => t('Exporting'),
+ *   'operations' => array(
+ *     array('my_function_1', array($account->uid, 'story')),
+ *     array('my_function_2', array()),
+ *   ),
+ *   'finished' => 'my_finished_callback',
+ *   'file' => 'path_to_file_containing_myfunctions',
+ * );
+ * batch_set($batch);
+ * // Only needed if not inside a form _submit handler.
+ * // Setting redirect in batch_process.
+ * batch_process('node/1');
+ * @endcode
+ *
+ * Note: if the batch 'title', 'init_message', 'progress_message', or
+ * 'error_message' could contain any user input, it is the responsibility of
+ * the code calling batch_set() to sanitize them first with a function like
+ * check_plain() or filter_xss(). Furthermore, if the batch operation
+ * returns any user input in the 'results' or 'message' keys of $context,
+ * it must also sanitize them first.
+ *
+ * Sample batch operations:
+ * @code
+ * // Simple and artificial: load a node of a given type for a given user
+ * function my_function_1($uid, $type, &$context) {
+ *   // The $context array gathers batch context information about the execution (read),
+ *   // as well as 'return values' for the current operation (write)
+ *   // The following keys are provided :
+ *   // 'results' (read / write): The array of results gathered so far by
+ *   //   the batch processing, for the current operation to append its own.
+ *   // 'message' (write): A text message displayed in the progress page.
+ *   // The following keys allow for multi-step operations :
+ *   // 'sandbox' (read / write): An array that can be freely used to
+ *   //   store persistent data between iterations. It is recommended to
+ *   //   use this instead of $_SESSION, which is unsafe if the user
+ *   //   continues browsing in a separate window while the batch is processing.
+ *   // 'finished' (write): A float number between 0 and 1 informing
+ *   //   the processing engine of the completion level for the operation.
+ *   //   1 (or no value explicitly set) means the operation is finished
+ *   //   and the batch processing can continue to the next operation.
+ *
+ *   $node = node_load(array('uid' => $uid, 'type' => $type));
+ *   $context['results'][] = $node->nid . ' : ' . check_plain($node->title);
+ *   $context['message'] = check_plain($node->title);
+ * }
+ *
+ * // More advanced example: multi-step operation - load all nodes, five by five
+ * function my_function_2(&$context) {
+ *   if (empty($context['sandbox'])) {
+ *     $context['sandbox']['progress'] = 0;
+ *     $context['sandbox']['current_node'] = 0;
+ *     $context['sandbox']['max'] = db_query('SELECT COUNT(DISTINCT nid) FROM {node}')->fetchField();
+ *   }
+ *   $limit = 5;
+ *   $result = db_select('node')
+ *     ->fields('node', array('nid'))
+ *     ->condition('nid', $context['sandbox']['current_node'], '>')
+ *     ->orderBy('nid')
+ *     ->range(0, $limit)
+ *     ->execute();
+ *   foreach ($result as $row) {
+ *     $node = node_load($row->nid, NULL, TRUE);
+ *     $context['results'][] = $node->nid . ' : ' . check_plain($node->title);
+ *     $context['sandbox']['progress']++;
+ *     $context['sandbox']['current_node'] = $node->nid;
+ *     $context['message'] = check_plain($node->title);
+ *   }
+ *   if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
+ *     $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
+ *   }
+ * }
+ * @endcode
+ *
+ * Sample 'finished' callback:
+ * @code
+ * function batch_test_finished($success, $results, $operations) {
+ *   // The 'success' parameter means no fatal PHP errors were detected. All
+ *   // other error management should be handled using 'results'.
+ *   if ($success) {
+ *     $message = format_plural(count($results), 'One post processed.', '@count posts processed.');
+ *   }
+ *   else {
+ *     $message = t('Finished with an error.');
+ *   }
+ *   drupal_set_message($message);
+ *   // Providing data for the redirected page is done through $_SESSION.
+ *   foreach ($results as $result) {
+ *     $items[] = t('Loaded node %title.', array('%title' => $result));
+ *   }
+ *   $_SESSION['my_batch_results'] = $items;
+ * }
+ * @endcode
+ */
+
+/**
+ * Adds a new batch.
+ *
+ * Batch operations are added as new batch sets. Batch sets are used to spread
+ * processing (primarily, but not exclusively, forms processing) over several
+ * page requests. This helps to ensure that the processing is not interrupted
+ * due to PHP timeouts, while users are still able to receive feedback on the
+ * progress of the ongoing operations. Combining related operations into
+ * distinct batch sets provides clean code independence for each batch set,
+ * ensuring that two or more batches, submitted independently, can be processed
+ * without mutual interference. Each batch set may specify its own set of
+ * operations and results, produce its own UI messages, and trigger its own
+ * 'finished' callback. Batch sets are processed sequentially, with the progress
+ * bar starting afresh for each new set.
+ *
+ * @param $batch_definition
+ *   An associative array defining the batch, with the following elements (all
+ *   are optional except as noted):
+ *   - operations: (required) Array of function calls to be performed.
+ *     Example:
+ *     @code
+ *     array(
+ *       array('my_function_1', array($arg1)),
+ *       array('my_function_2', array($arg2_1, $arg2_2)),
+ *     )
+ *     @endcode
+ *   - title: A safe, translated string to use as the title for the progress
+ *     page. Defaults to t('Processing').
+ *   - init_message: Message displayed while the processing is initialized.
+ *     Defaults to t('Initializing.').
+ *   - progress_message: Message displayed while processing the batch. Available
+ *     placeholders are @current, @remaining, @total, @percentage, @estimate and
+ *     @elapsed. Defaults to t('Completed @current of @total.').
+ *   - error_message: Message displayed if an error occurred while processing
+ *     the batch. Defaults to t('An error has occurred.').
+ *   - finished: Name of a function to be executed after the batch has
+ *     completed. This should be used to perform any result massaging that may
+ *     be needed, and possibly save data in $_SESSION for display after final
+ *     page redirection.
+ *   - file: Path to the file containing the definitions of the 'operations' and
+ *     'finished' functions, for instance if they don't reside in the main
+ *     .module file. The path should be relative to base_path(), and thus should
+ *     be built using drupal_get_path().
+ *   - css: Array of paths to CSS files to be used on the progress page.
+ *   - url_options: options passed to url() when constructing redirect URLs for
+ *     the batch.
+ */
+function batch_set($batch_definition) {
+  if ($batch_definition) {
+    $batch =& batch_get();
+
+    // Initialize the batch if needed.
+    if (empty($batch)) {
+      $batch = array(
+        'sets' => array(),
+        'has_form_submits' => FALSE,
+      );
+    }
+
+    // Base and default properties for the batch set.
+    // Use get_t() to allow batches during installation.
+    $t = get_t();
+    $init = array(
+      'sandbox' => array(),
+      'results' => array(),
+      'success' => FALSE,
+      'start' => 0,
+      'elapsed' => 0,
+    );
+    $defaults = array(
+      'title' => $t('Processing'),
+      'init_message' => $t('Initializing.'),
+      'progress_message' => $t('Completed @current of @total.'),
+      'error_message' => $t('An error has occurred.'),
+      'css' => array(),
+    );
+    $batch_set = $init + $batch_definition + $defaults;
+
+    // Tweak init_message to avoid the bottom of the page flickering down after
+    // init phase.
+    $batch_set['init_message'] .= '<br/>&nbsp;';
+
+    // The non-concurrent workflow of batch execution allows us to save
+    // numberOfItems() queries by handling our own counter.
+    $batch_set['total'] = count($batch_set['operations']);
+    $batch_set['count'] = $batch_set['total'];
+
+    // Add the set to the batch.
+    if (empty($batch['id'])) {
+      // The batch is not running yet. Simply add the new set.
+      $batch['sets'][] = $batch_set;
+    }
+    else {
+      // The set is being added while the batch is running. Insert the new set
+      // right after the current one to ensure execution order, and store its
+      // operations in a queue.
+      $index = $batch['current_set'] + 1;
+      $slice1 = array_slice($batch['sets'], 0, $index);
+      $slice2 = array_slice($batch['sets'], $index);
+      $batch['sets'] = array_merge($slice1, array($batch_set), $slice2);
+      _batch_populate_queue($batch, $index);
+    }
+  }
+}
+
+/**
+ * Processes the batch.
+ *
+ * Unless the batch has been marked with 'progressive' = FALSE, the function
+ * issues a drupal_goto and thus ends page execution.
+ *
+ * This function is generally not needed in form submit handlers;
+ * Form API takes care of batches that were set during form submission.
+ *
+ * @param $redirect
+ *   (optional) Path to redirect to when the batch has finished processing.
+ * @param $url
+ *   (optional - should only be used for separate scripts like update.php)
+ *   URL of the batch processing page.
+ * @param $redirect_callback
+ *   (optional) Specify a function to be called to redirect to the progressive
+ *   processing page. By default drupal_goto() will be used to redirect to a
+ *   page which will do the progressive page. Specifying another function will
+ *   allow the progressive processing to be processed differently.
+ */
+function batch_process($redirect = NULL, $url = 'batch', $redirect_callback = 'drupal_goto') {
+  $batch =& batch_get();
+
+  drupal_theme_initialize();
+
+  if (isset($batch)) {
+    // Add process information
+    $process_info = array(
+      'current_set' => 0,
+      'progressive' => TRUE,
+      'url' => $url,
+      'url_options' => array(),
+      'source_url' => $_GET['q'],
+      'redirect' => $redirect,
+      'theme' => $GLOBALS['theme_key'],
+      'redirect_callback' => $redirect_callback,
+    );
+    $batch += $process_info;
+
+    // The batch is now completely built. Allow other modules to make changes
+    // to the batch so that it is easier to reuse batch processes in other
+    // environments.
+    drupal_alter('batch', $batch);
+
+    // Assign an arbitrary id: don't rely on a serial column in the 'batch'
+    // table, since non-progressive batches skip database storage completely.
+    $batch['id'] = db_next_id();
+
+    // Move operations to a job queue. Non-progressive batches will use a
+    // memory-based queue.
+    foreach ($batch['sets'] as $key => $batch_set) {
+      _batch_populate_queue($batch, $key);
+    }
+
+    // Initiate processing.
+    if ($batch['progressive']) {
+      // Now that we have a batch id, we can generate the redirection link in
+      // the generic error message.
+      $t = get_t();
+      $batch['error_message'] = $t('Please continue to <a href="@error_url">the error page</a>', array('@error_url' => url($url, array('query' => array('id' => $batch['id'], 'op' => 'finished')))));
+
+      // Clear the way for the drupal_goto() redirection to the batch processing
+      // page, by saving and unsetting the 'destination', if there is any.
+      if (isset($_GET['destination'])) {
+        $batch['destination'] = $_GET['destination'];
+        unset($_GET['destination']);
+      }
+
+      // Store the batch.
+      db_insert('batch')
+        ->fields(array(
+          'bid' => $batch['id'],
+          'timestamp' => REQUEST_TIME,
+          'token' => drupal_get_token($batch['id']),
+          'batch' => serialize($batch),
+        ))
+        ->execute();
+
+      // Set the batch number in the session to guarantee that it will stay alive.
+      $_SESSION['batches'][$batch['id']] = TRUE;
+
+      // Redirect for processing.
+      $function = $batch['redirect_callback'];
+      if (function_exists($function)) {
+        $function($batch['url'], array('query' => array('op' => 'start', 'id' => $batch['id'])));
+      }
+    }
+    else {
+      // Non-progressive execution: bypass the whole progressbar workflow
+      // and execute the batch in one pass.
+      require_once DRUPAL_ROOT . '/includes/batch.inc';
+      _batch_process();
+    }
+  }
+}
+
+/**
+ * Retrieves the current batch.
+ */
+function &batch_get() {
+  // Not drupal_static(), because Batch API operates at a lower level than most
+  // use-cases for resetting static variables, and we specifically do not want a
+  // global drupal_static_reset() resetting the batch information. Functions
+  // that are part of the Batch API and need to reset the batch information may
+  // call batch_get() and manipulate the result by reference. Functions that are
+  // not part of the Batch API can also do this, but shouldn't.
+  static $batch = array();
+  return $batch;
+}
+
+/**
+ * Populates a job queue with the operations of a batch set.
+ *
+ * Depending on whether the batch is progressive or not, the BatchQueue or
+ * BatchMemoryQueue handler classes will be used.
+ *
+ * @param $batch
+ *   The batch array.
+ * @param $set_id
+ *   The id of the set to process.
+ *
+ * @return
+ *   The name and class of the queue are added by reference to the batch set.
+ */
+function _batch_populate_queue(&$batch, $set_id) {
+  $batch_set = &$batch['sets'][$set_id];
+
+  if (isset($batch_set['operations'])) {
+    $batch_set += array(
+      'queue' => array(
+        'name' => 'drupal_batch:' . $batch['id'] . ':' . $set_id,
+        'class' => $batch['progressive'] ? 'BatchQueue' : 'BatchMemoryQueue',
+      ),
+    );
+
+    $queue = _batch_queue($batch_set);
+    $queue->createQueue();
+    foreach ($batch_set['operations'] as $operation) {
+      $queue->createItem($operation);
+    }
+
+    unset($batch_set['operations']);
+  }
+}
+
+/**
+ * Returns a queue object for a batch set.
+ *
+ * @param $batch_set
+ *   The batch set.
+ *
+ * @return
+ *   The queue object.
+ */
+function _batch_queue($batch_set) {
+  static $queues;
+
+  // The class autoloader is not available when running update.php, so make
+  // sure the files are manually included.
+  if (!isset($queues)) {
+    $queues = array();
+    require_once DRUPAL_ROOT . '/modules/system/system.queue.inc';
+    require_once DRUPAL_ROOT . '/includes/batch.queue.inc';
+  }
+
+  if (isset($batch_set['queue'])) {
+    $name = $batch_set['queue']['name'];
+    $class = $batch_set['queue']['class'];
+
+    if (!isset($queues[$class][$name])) {
+      $queues[$class][$name] = new $class($name);
+    }
+    return $queues[$class][$name];
+  }
+}
+
+/**
+ * @} End of "defgroup batch".
+ */
diff --git a/htmltest/includes/graph.inc b/htmltest/includes/graph.inc
new file mode 100644
index 00000000..35e68305
--- /dev/null
+++ b/htmltest/includes/graph.inc
@@ -0,0 +1,145 @@
+<?php
+
+/**
+ * @file
+ * Directed acyclic graph manipulation.
+ */
+
+
+/**
+ * Performs a depth-first search and sort on a directed acyclic graph.
+ *
+ * @param $graph
+ *   A three dimensional associated array, with the first keys being the names
+ *   of the vertices, these can be strings or numbers. The second key is
+ *   'edges' and the third one are again vertices, each such key representing
+ *   an edge. Values of array elements are copied over.
+ *
+ *   Example:
+ *   @code
+ *     $graph[1]['edges'][2] = 1;
+ *     $graph[2]['edges'][3] = 1;
+ *     $graph[2]['edges'][4] = 1;
+ *     $graph[3]['edges'][4] = 1;
+ *   @endcode
+ *
+ *   On return you will also have:
+ *   @code
+ *     $graph[1]['paths'][2] = 1;
+ *     $graph[1]['paths'][3] = 1;
+ *     $graph[2]['reverse_paths'][1] = 1;
+ *     $graph[3]['reverse_paths'][1] = 1;
+ *   @endcode
+ *
+ * @return
+ *   The passed-in $graph with more secondary keys filled in:
+ *   - 'paths': Contains a list of vertices than can be reached on a path from
+ *     this vertex.
+ *   - 'reverse_paths': Contains a list of vertices that has a path from them
+ *     to this vertex.
+ *   - 'weight': If there is a path from a vertex to another then the weight of
+ *     the latter is higher.
+ *   - 'component': Vertices in the same component have the same component
+ *     identifier.
+ *
+ * @see _drupal_depth_first_search()
+ */
+function drupal_depth_first_search(&$graph) {
+  $state = array(
+    // The order of last visit of the depth first search. This is the reverse
+    // of the topological order if the graph is acyclic.
+    'last_visit_order' => array(),
+    // The components of the graph.
+    'components' => array(),
+  );
+  // Perform the actual search.
+  foreach ($graph as $start => $data) {
+    _drupal_depth_first_search($graph, $state, $start);
+  }
+
+  // We do such a numbering that every component starts with 0. This is useful
+  // for module installs as we can install every 0 weighted module in one
+  // request, and then every 1 weighted etc.
+  $component_weights = array();
+
+  foreach ($state['last_visit_order'] as $vertex) {
+    $component = $graph[$vertex]['component'];
+    if (!isset($component_weights[$component])) {
+      $component_weights[$component] = 0;
+    }
+    $graph[$vertex]['weight'] = $component_weights[$component]--;
+  }
+}
+
+/**
+ * Performs a depth-first search on a graph.
+ *
+ * @param $graph
+ *   A three dimensional associated graph array.
+ * @param $state
+ *   An associative array. The key 'last_visit_order' stores a list of the
+ *   vertices visited. The key components stores list of vertices belonging
+ *   to the same the component.
+ * @param $start
+ *   An arbitrary vertex where we started traversing the graph.
+ * @param $component
+ *   The component of the last vertex.
+ *
+ * @see drupal_depth_first_search()
+ */
+function _drupal_depth_first_search(&$graph, &$state, $start, &$component = NULL) {
+  // Assign new component for each new vertex, i.e. when not called recursively.
+  if (!isset($component)) {
+    $component = $start;
+  }
+  // Nothing to do, if we already visited this vertex.
+  if (isset($graph[$start]['paths'])) {
+    return;
+  }
+  // Mark $start as visited.
+  $graph[$start]['paths'] = array();
+
+  // Assign $start to the current component.
+  $graph[$start]['component'] = $component;
+  $state['components'][$component][] = $start;
+
+  // Visit edges of $start.
+  if (isset($graph[$start]['edges'])) {
+    foreach ($graph[$start]['edges'] as $end => $v) {
+      // Mark that $start can reach $end.
+      $graph[$start]['paths'][$end] = $v;
+
+      if (isset($graph[$end]['component']) && $component != $graph[$end]['component']) {
+        // This vertex already has a component, use that from now on and
+        // reassign all the previously explored vertices.
+        $new_component = $graph[$end]['component'];
+        foreach ($state['components'][$component] as $vertex) {
+          $graph[$vertex]['component'] = $new_component;
+          $state['components'][$new_component][] = $vertex;
+        }
+        unset($state['components'][$component]);
+        $component = $new_component;
+      }
+      // Only visit existing vertices.
+      if (isset($graph[$end])) {
+        // Visit the connected vertex.
+        _drupal_depth_first_search($graph, $state, $end, $component);
+
+        // All vertices reachable by $end are also reachable by $start.
+        $graph[$start]['paths'] += $graph[$end]['paths'];
+      }
+    }
+  }
+
+  // Now that any other subgraph has been explored, add $start to all reverse
+  // paths.
+  foreach ($graph[$start]['paths'] as $end => $v) {
+    if (isset($graph[$end])) {
+      $graph[$end]['reverse_paths'][$start] = $v;
+    }
+  }
+
+  // Record the order of the last visit. This is the reverse of the
+  // topological order if the graph is acyclic.
+  $state['last_visit_order'][] = $start;
+}
diff --git a/htmltest/includes/image.inc b/htmltest/includes/image.inc
new file mode 100644
index 00000000..e30a3385
--- /dev/null
+++ b/htmltest/includes/image.inc
@@ -0,0 +1,435 @@
+<?php
+
+/**
+ * @file
+ * API for manipulating images.
+ */
+
+/**
+ * @defgroup image Image toolkits
+ * @{
+ * Functions for image file manipulations.
+ *
+ * Drupal's image toolkits provide an abstraction layer for common image file
+ * manipulations like scaling, cropping, and rotating. The abstraction frees
+ * module authors from the need to support multiple image libraries, and it
+ * allows site administrators to choose the library that's best for them.
+ *
+ * PHP includes the GD library by default so a GD toolkit is installed with
+ * Drupal. Other toolkits like ImageMagick are available from contrib modules.
+ * GD works well for small images, but using it with larger files may cause PHP
+ * to run out of memory. In contrast the ImageMagick library does not suffer
+ * from this problem, but it requires the ISP to have installed additional
+ * software.
+ *
+ * Image toolkits are discovered based on the associated module's
+ * hook_image_toolkits. Additionally the image toolkit include file
+ * must be identified in the files array in the module.info file. The
+ * toolkit must then be enabled using the admin/config/media/image-toolkit
+ * form.
+ *
+ * Only one toolkit may be selected at a time. If a module author wishes to call
+ * a specific toolkit they can check that it is installed by calling
+ * image_get_available_toolkits(), and then calling its functions directly.
+ */
+
+/**
+ * Gets a list of available toolkits.
+ *
+ * @return
+ *   An array with the toolkit names as keys and the descriptions as values.
+ */
+function image_get_available_toolkits() {
+  // hook_image_toolkits returns an array of toolkit names.
+  $toolkits = module_invoke_all('image_toolkits');
+
+  $output = array();
+  foreach ($toolkits as $name => $info) {
+    // Only allow modules that aren't marked as unavailable.
+    if ($info['available']) {
+      $output[$name] = $info['title'];
+    }
+  }
+
+  return $output;
+}
+
+/**
+ * Gets the name of the currently used toolkit.
+ *
+ * @return
+ *   String containing the name of the selected toolkit, or FALSE on error.
+ */
+function image_get_toolkit() {
+  static $toolkit;
+
+  if (!isset($toolkit)) {
+    $toolkits = image_get_available_toolkits();
+    $toolkit = variable_get('image_toolkit', 'gd');
+    if (!isset($toolkits[$toolkit]) || !function_exists('image_' . $toolkit . '_load')) {
+      // The selected toolkit isn't available so return the first one found. If
+      // none are available this will return FALSE.
+      reset($toolkits);
+      $toolkit = key($toolkits);
+    }
+  }
+
+  return $toolkit;
+}
+
+/**
+ * Invokes the given method using the currently selected toolkit.
+ *
+ * @param $method
+ *   A string containing the method to invoke.
+ * @param $image
+ *   An image object returned by image_load().
+ * @param $params
+ *   An optional array of parameters to pass to the toolkit method.
+ *
+ * @return
+ *   Mixed values (typically Boolean indicating successful operation).
+ */
+function image_toolkit_invoke($method, stdClass $image, array $params = array()) {
+  $function = 'image_' . $image->toolkit . '_' . $method;
+  if (function_exists($function)) {
+    array_unshift($params, $image);
+    return call_user_func_array($function, $params);
+  }
+  watchdog('image', 'The selected image handling toolkit %toolkit can not correctly process %function.', array('%toolkit' => $image->toolkit, '%function' => $function), WATCHDOG_ERROR);
+  return FALSE;
+}
+
+/**
+ * Gets details about an image.
+ *
+ * Drupal supports GIF, JPG and PNG file formats when used with the GD
+ * toolkit, and may support others, depending on which toolkits are
+ * installed.
+ *
+ * @param $filepath
+ *   String specifying the path of the image file.
+ * @param $toolkit
+ *   An optional image toolkit name to override the default.
+ *
+ * @return
+ *   FALSE, if the file could not be found or is not an image. Otherwise, a
+ *   keyed array containing information about the image:
+ *   - "width": Width, in pixels.
+ *   - "height": Height, in pixels.
+ *   - "extension": Commonly used file extension for the image.
+ *   - "mime_type": MIME type ('image/jpeg', 'image/gif', 'image/png').
+ *   - "file_size": File size in bytes.
+ */
+function image_get_info($filepath, $toolkit = FALSE) {
+  $details = FALSE;
+  if (!is_file($filepath) && !is_uploaded_file($filepath)) {
+    return $details;
+  }
+
+  if (!$toolkit) {
+    $toolkit = image_get_toolkit();
+  }
+  if ($toolkit) {
+    $image = new stdClass();
+    $image->source = $filepath;
+    $image->toolkit = $toolkit;
+    $details = image_toolkit_invoke('get_info', $image);
+    if (isset($details) && is_array($details)) {
+      $details['file_size'] = filesize($filepath);
+    }
+  }
+
+  return $details;
+}
+
+/**
+ * Scales an image to the exact width and height given.
+ *
+ * This function achieves the target aspect ratio by cropping the original image
+ * equally on both sides, or equally on the top and bottom. This function is
+ * useful to create uniform sized avatars from larger images.
+ *
+ * The resulting image always has the exact target dimensions.
+ *
+ * @param $image
+ *   An image object returned by image_load().
+ * @param $width
+ *   The target width, in pixels.
+ * @param $height
+ *   The target height, in pixels.
+ *
+ * @return
+ *   TRUE on success, FALSE on failure.
+ *
+ * @see image_load()
+ * @see image_resize()
+ * @see image_crop()
+ */
+function image_scale_and_crop(stdClass $image, $width, $height) {
+  $scale = max($width / $image->info['width'], $height / $image->info['height']);
+  $x = ($image->info['width'] * $scale - $width) / 2;
+  $y = ($image->info['height'] * $scale - $height) / 2;
+
+  if (image_resize($image, $image->info['width'] * $scale, $image->info['height'] * $scale)) {
+    return image_crop($image, $x, $y, $width, $height);
+  }
+  return FALSE;
+}
+
+/**
+ * Scales image dimensions while maintaining aspect ratio.
+ *
+ * The resulting dimensions can be smaller for one or both target dimensions.
+ *
+ * @param $dimensions
+ *   Dimensions to be modified - an array with components width and height, in
+ *   pixels.
+ * @param $width
+ *   The target width, in pixels. If this value is NULL then the scaling will be
+ *   based only on the height value.
+ * @param $height
+ *   The target height, in pixels. If this value is NULL then the scaling will
+ *   be based only on the width value.
+ * @param $upscale
+ *   Boolean indicating that images smaller than the target dimensions will be
+ *   scaled up. This generally results in a low quality image.
+ *
+ * @return
+ *   TRUE if $dimensions was modified, FALSE otherwise.
+ *
+ * @see image_scale()
+ */
+function image_dimensions_scale(array &$dimensions, $width = NULL, $height = NULL, $upscale = FALSE) {
+  $aspect = $dimensions['height'] / $dimensions['width'];
+
+  // Calculate one of the dimensions from the other target dimension,
+  // ensuring the same aspect ratio as the source dimensions. If one of the
+  // target dimensions is missing, that is the one that is calculated. If both
+  // are specified then the dimension calculated is the one that would not be
+  // calculated to be bigger than its target.
+  if (($width && !$height) || ($width && $height && $aspect < $height / $width)) {
+    $height = (int) round($width * $aspect);
+  }
+  else {
+    $width = (int) round($height / $aspect);
+  }
+
+  // Don't upscale if the option isn't enabled.
+  if (!$upscale && ($width >= $dimensions['width'] || $height >= $dimensions['height'])) {
+    return FALSE;
+  }
+
+  $dimensions['width'] = $width;
+  $dimensions['height'] = $height;
+  return TRUE;
+}
+
+/**
+ * Scales an image while maintaining aspect ratio.
+ *
+ * The resulting image can be smaller for one or both target dimensions.
+ *
+ * @param $image
+ *   An image object returned by image_load().
+ * @param $width
+ *   The target width, in pixels. If this value is NULL then the scaling will
+ *   be based only on the height value.
+ * @param $height
+ *   The target height, in pixels. If this value is NULL then the scaling will
+ *   be based only on the width value.
+ * @param $upscale
+ *   Boolean indicating that files smaller than the dimensions will be scaled
+ *   up. This generally results in a low quality image.
+ *
+ * @return
+ *   TRUE on success, FALSE on failure.
+ *
+ * @see image_dimensions_scale()
+ * @see image_load()
+ * @see image_scale_and_crop()
+ */
+function image_scale(stdClass $image, $width = NULL, $height = NULL, $upscale = FALSE) {
+  $dimensions = $image->info;
+
+  // Scale the dimensions - if they don't change then just return success.
+  if (!image_dimensions_scale($dimensions, $width, $height, $upscale)) {
+    return TRUE;
+  }
+
+  return image_resize($image, $dimensions['width'], $dimensions['height']);
+}
+
+/**
+ * Resizes an image to the given dimensions (ignoring aspect ratio).
+ *
+ * @param $image
+ *   An image object returned by image_load().
+ * @param $width
+ *   The target width, in pixels.
+ * @param $height
+ *   The target height, in pixels.
+ *
+ * @return
+ *   TRUE on success, FALSE on failure.
+ *
+ * @see image_load()
+ * @see image_gd_resize()
+ */
+function image_resize(stdClass $image, $width, $height) {
+  $width = (int) round($width);
+  $height = (int) round($height);
+
+  return image_toolkit_invoke('resize', $image, array($width, $height));
+}
+
+/**
+ * Rotates an image by the given number of degrees.
+ *
+ * @param $image
+ *   An image object returned by image_load().
+ * @param $degrees
+ *   The number of (clockwise) degrees to rotate the image.
+ * @param $background
+ *   An hexadecimal integer specifying the background color to use for the
+ *   uncovered area of the image after the rotation. E.g. 0x000000 for black,
+ *   0xff00ff for magenta, and 0xffffff for white. For images that support
+ *   transparency, this will default to transparent. Otherwise it will
+ *   be white.
+ *
+ * @return
+ *   TRUE on success, FALSE on failure.
+ *
+ * @see image_load()
+ * @see image_gd_rotate()
+ */
+function image_rotate(stdClass $image, $degrees, $background = NULL) {
+  return image_toolkit_invoke('rotate', $image, array($degrees, $background));
+}
+
+/**
+ * Crops an image to a rectangle specified by the given dimensions.
+ *
+ * @param $image
+ *   An image object returned by image_load().
+ * @param $x
+ *   The top left coordinate, in pixels, of the crop area (x axis value).
+ * @param $y
+ *   The top left coordinate, in pixels, of the crop area (y axis value).
+ * @param $width
+ *   The target width, in pixels.
+ * @param $height
+ *   The target height, in pixels.
+ *
+ * @return
+ *   TRUE on success, FALSE on failure.
+ *
+ * @see image_load()
+ * @see image_scale_and_crop()
+ * @see image_gd_crop()
+ */
+function image_crop(stdClass $image, $x, $y, $width, $height) {
+  $aspect = $image->info['height'] / $image->info['width'];
+  if (empty($height)) $height = $width / $aspect;
+  if (empty($width)) $width = $height * $aspect;
+
+  $width = (int) round($width);
+  $height = (int) round($height);
+
+  return image_toolkit_invoke('crop', $image, array($x, $y, $width, $height));
+}
+
+/**
+ * Converts an image to grayscale.
+ *
+ * @param $image
+ *   An image object returned by image_load().
+ *
+ * @return
+ *   TRUE on success, FALSE on failure.
+ *
+ * @see image_load()
+ * @see image_gd_desaturate()
+ */
+function image_desaturate(stdClass $image) {
+  return image_toolkit_invoke('desaturate', $image);
+}
+
+/**
+ * Loads an image file and returns an image object.
+ *
+ * Any changes to the file are not saved until image_save() is called.
+ *
+ * @param $file
+ *   Path to an image file.
+ * @param $toolkit
+ *   An optional, image toolkit name to override the default.
+ *
+ * @return
+ *   An image object or FALSE if there was a problem loading the file. The
+ *   image object has the following properties:
+ *    - 'source' - The original file path.
+ *    - 'info' - The array of information returned by image_get_info()
+ *    - 'toolkit' - The name of the image toolkit requested when the image was
+ *      loaded.
+ *   Image toolkits may add additional properties. The caller is advised not to
+ *   monkey about with them.
+ *
+ * @see image_save()
+ * @see image_get_info()
+ * @see image_get_available_toolkits()
+ * @see image_gd_load()
+ */
+function image_load($file, $toolkit = FALSE) {
+  if (!$toolkit) {
+    $toolkit = image_get_toolkit();
+  }
+  if ($toolkit) {
+    $image = new stdClass();
+    $image->source = $file;
+    $image->info = image_get_info($file, $toolkit);
+    if (isset($image->info) && is_array($image->info)) {
+      $image->toolkit = $toolkit;
+      if (image_toolkit_invoke('load', $image)) {
+        return $image;
+      }
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Closes the image and saves the changes to a file.
+ *
+ * @param $image
+ *   An image object returned by image_load(). The object's 'info' property
+ *   will be updated if the file is saved successfully.
+ * @param $destination
+ *   Destination path where the image should be saved. If it is empty the
+ *   original image file will be overwritten.
+ *
+ * @return
+ *   TRUE on success, FALSE on failure.
+ *
+ * @see image_load()
+ * @see image_gd_save()
+ */
+function image_save(stdClass $image, $destination = NULL) {
+  if (empty($destination)) {
+    $destination = $image->source;
+  }
+  if ($return = image_toolkit_invoke('save', $image, array($destination))) {
+    // Clear the cached file size and refresh the image information.
+    clearstatcache();
+    $image->info = image_get_info($destination, $image->toolkit);
+
+    if (drupal_chmod($destination)) {
+      return $return;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * @} End of "defgroup image".
+ */
diff --git a/htmltest/includes/install.core.inc b/htmltest/includes/install.core.inc
new file mode 100644
index 00000000..38ad7248
--- /dev/null
+++ b/htmltest/includes/install.core.inc
@@ -0,0 +1,1909 @@
+<?php
+
+/**
+ * @file
+ * API functions for installing Drupal.
+ */
+
+/**
+ * Do not run the task during the current installation request.
+ *
+ * This can be used to skip running an installation task when certain
+ * conditions are met, even though the task may still show on the list of
+ * installation tasks presented to the user. For example, the Drupal installer
+ * uses this flag to skip over the database configuration form when valid
+ * database connection information is already available from settings.php. It
+ * also uses this flag to skip language import tasks when the installation is
+ * being performed in English.
+ */
+define('INSTALL_TASK_SKIP', 1);
+
+/**
+ * Run the task on each installation request until the database is set up.
+ *
+ * This is primarily used by the Drupal installer for bootstrap-related tasks.
+ */
+define('INSTALL_TASK_RUN_IF_REACHED', 2);
+
+/**
+ * Global flag to indicate that a task should be run on each installation
+ * request that reaches it, until the database is set up and we are able to
+ * record the fact that it already ran.
+ *
+ * This is the default method for running tasks and should be used for most
+ * tasks that occur after the database is set up; these tasks will then run
+ * once and be marked complete once they are successfully finished. For
+ * example, the Drupal installer uses this flag for the batch installation of
+ * modules on the new site, and also for the configuration form that collects
+ * basic site information and sets up the site maintenance account.
+ */
+define('INSTALL_TASK_RUN_IF_NOT_COMPLETED', 3);
+
+/**
+ * Installs Drupal either interactively or via an array of passed-in settings.
+ *
+ * The Drupal installation happens in a series of steps, which may be spread
+ * out over multiple page requests. Each request begins by trying to determine
+ * the last completed installation step (also known as a "task"), if one is
+ * available from a previous request. Control is then passed to the task
+ * handler, which processes the remaining tasks that need to be run until (a)
+ * an error is thrown, (b) a new page needs to be displayed, or (c) the
+ * installation finishes (whichever happens first).
+ *
+ * @param $settings
+ *   An optional array of installation settings. Leave this empty for a normal,
+ *   interactive, browser-based installation intended to occur over multiple
+ *   page requests. Alternatively, if an array of settings is passed in, the
+ *   installer will attempt to use it to perform the installation in a single
+ *   page request (optimized for the command line) and not send any output
+ *   intended for the web browser. See install_state_defaults() for a list of
+ *   elements that are allowed to appear in this array.
+ *
+ * @see install_state_defaults()
+ */
+function install_drupal($settings = array()) {
+  global $install_state;
+  // Initialize the installation state with the settings that were passed in,
+  // as well as a boolean indicating whether or not this is an interactive
+  // installation.
+  $interactive = empty($settings);
+  $install_state = $settings + array('interactive' => $interactive) + install_state_defaults();
+  try {
+    // Begin the page request. This adds information about the current state of
+    // the Drupal installation to the passed-in array.
+    install_begin_request($install_state);
+    // Based on the installation state, run the remaining tasks for this page
+    // request, and collect any output.
+    $output = install_run_tasks($install_state);
+  }
+  catch (Exception $e) {
+    // When an installation error occurs, either send the error to the web
+    // browser or pass on the exception so the calling script can use it.
+    if ($install_state['interactive']) {
+      install_display_output($e->getMessage(), $install_state);
+    }
+    else {
+      throw $e;
+    }
+  }
+  // All available tasks for this page request are now complete. Interactive
+  // installations can send output to the browser or redirect the user to the
+  // next page.
+  if ($install_state['interactive']) {
+    if ($install_state['parameters_changed']) {
+      // Redirect to the correct page if the URL parameters have changed.
+      install_goto(install_redirect_url($install_state));
+    }
+    elseif (isset($output)) {
+      // Display a page only if some output is available. Otherwise it is
+      // possible that we are printing a JSON page and theme output should
+      // not be shown.
+      install_display_output($output, $install_state);
+    }
+  }
+}
+
+/**
+ * Returns an array of default settings for the global installation state.
+ *
+ * The installation state is initialized with these settings at the beginning
+ * of each page request. They may evolve during the page request, but they are
+ * initialized again once the next request begins.
+ *
+ * Non-interactive Drupal installations can override some of these default
+ * settings by passing in an array to the installation script, most notably
+ * 'parameters' (which contains one-time parameters such as 'profile' and
+ * 'locale' that are normally passed in via the URL) and 'forms' (which can
+ * be used to programmatically submit forms during the installation; the keys
+ * of each element indicate the name of the installation task that the form
+ * submission is for, and the values are used as the $form_state['values']
+ * array that is passed on to the form submission via drupal_form_submit()).
+ *
+ * @see drupal_form_submit()
+ */
+function install_state_defaults() {
+  $defaults = array(
+    // The current task being processed.
+    'active_task' => NULL,
+    // The last task that was completed during the previous installation
+    // request.
+    'completed_task' => NULL,
+    // This becomes TRUE only when Drupal's system module is installed.
+    'database_tables_exist' => FALSE,
+    // An array of forms to be programmatically submitted during the
+    // installation. The keys of each element indicate the name of the
+    // installation task that the form submission is for, and the values are
+    // used as the $form_state['values'] array that is passed on to the form
+    // submission via drupal_form_submit().
+    'forms' => array(),
+    // This becomes TRUE only at the end of the installation process, after
+    // all available tasks have been completed and Drupal is fully installed.
+    // It is used by the installer to store correct information in the database
+    // about the completed installation, as well as to inform theme functions
+    // that all tasks are finished (so that the task list can be displayed
+    // correctly).
+    'installation_finished' => FALSE,
+    // Whether or not this installation is interactive. By default this will
+    // be set to FALSE if settings are passed in to install_drupal().
+    'interactive' => TRUE,
+    // An array of available languages for the installation.
+    'locales' => array(),
+    // An array of parameters for the installation, pre-populated by the URL
+    // or by the settings passed in to install_drupal(). This is primarily
+    // used to store 'profile' (the name of the chosen installation profile)
+    // and 'locale' (the name of the chosen installation language), since
+    // these settings need to persist from page request to page request before
+    // the database is available for storage.
+    'parameters' => array(),
+    // Whether or not the parameters have changed during the current page
+    // request. For interactive installations, this will trigger a page
+    // redirect.
+    'parameters_changed' => FALSE,
+    // An array of information about the chosen installation profile. This will
+    // be filled in based on the profile's .info file.
+    'profile_info' => array(),
+    // An array of available installation profiles.
+    'profiles' => array(),
+    // An array of server variables that will be substituted into the global
+    // $_SERVER array via drupal_override_server_variables(). Used by
+    // non-interactive installations only.
+    'server' => array(),
+    // This becomes TRUE only when a valid database connection can be
+    // established.
+    'settings_verified' => FALSE,
+    // Installation tasks can set this to TRUE to force the page request to
+    // end (even if there is no themable output), in the case of an interactive
+    // installation. This is needed only rarely; for example, it would be used
+    // by an installation task that prints JSON output rather than returning a
+    // themed page. The most common example of this is during batch processing,
+    // but the Drupal installer automatically takes care of setting this
+    // parameter properly in that case, so that individual installation tasks
+    // which implement the batch API do not need to set it themselves.
+    'stop_page_request' => FALSE,
+    // Installation tasks can set this to TRUE to indicate that the task should
+    // be run again, even if it normally wouldn't be. This can be used, for
+    // example, if a single task needs to be spread out over multiple page
+    // requests, or if it needs to perform some validation before allowing
+    // itself to be marked complete. The most common examples of this are batch
+    // processing and form submissions, but the Drupal installer automatically
+    // takes care of setting this parameter properly in those cases, so that
+    // individual installation tasks which implement the batch API or form API
+    // do not need to set it themselves.
+    'task_not_complete' => FALSE,
+    // A list of installation tasks which have already been performed during
+    // the current page request.
+    'tasks_performed' => array(),
+  );
+  return $defaults;
+}
+
+/**
+ * Begins an installation request, modifying the installation state as needed.
+ *
+ * This function performs commands that must run at the beginning of every page
+ * request. It throws an exception if the installation should not proceed.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state. This is
+ *   modified with information gleaned from the beginning of the page request.
+ */
+function install_begin_request(&$install_state) {
+  // Add any installation parameters passed in via the URL.
+  $install_state['parameters'] += $_GET;
+
+  // Validate certain core settings that are used throughout the installation.
+  if (!empty($install_state['parameters']['profile'])) {
+    $install_state['parameters']['profile'] = preg_replace('/[^a-zA-Z_0-9]/', '', $install_state['parameters']['profile']);
+  }
+  if (!empty($install_state['parameters']['locale'])) {
+    $install_state['parameters']['locale'] = preg_replace('/[^a-zA-Z_0-9\-]/', '', $install_state['parameters']['locale']);
+  }
+
+  // Allow command line scripts to override server variables used by Drupal.
+  require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
+  if (!$install_state['interactive']) {
+    drupal_override_server_variables($install_state['server']);
+  }
+
+  // The user agent header is used to pass a database prefix in the request when
+  // running tests. However, for security reasons, it is imperative that no
+  // installation be permitted using such a prefix.
+  if (isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], "simpletest") !== FALSE) {
+    header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
+    exit;
+  }
+
+  drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
+
+  // This must go after drupal_bootstrap(), which unsets globals!
+  global $conf;
+
+  require_once DRUPAL_ROOT . '/modules/system/system.install';
+  require_once DRUPAL_ROOT . '/includes/common.inc';
+  require_once DRUPAL_ROOT . '/includes/file.inc';
+  require_once DRUPAL_ROOT . '/includes/install.inc';
+  require_once DRUPAL_ROOT . '/' . variable_get('path_inc', 'includes/path.inc');
+
+  // Load module basics (needed for hook invokes).
+  include_once DRUPAL_ROOT . '/includes/module.inc';
+  include_once DRUPAL_ROOT . '/includes/session.inc';
+
+  // Set up $language, so t() caller functions will still work.
+  drupal_language_initialize();
+
+  include_once DRUPAL_ROOT . '/includes/entity.inc';
+  require_once DRUPAL_ROOT . '/includes/ajax.inc';
+  $module_list['system']['filename'] = 'modules/system/system.module';
+  $module_list['user']['filename'] = 'modules/user/user.module';
+  module_list(TRUE, FALSE, FALSE, $module_list);
+  drupal_load('module', 'system');
+  drupal_load('module', 'user');
+
+  // Load the cache infrastructure using a "fake" cache implementation that
+  // does not attempt to write to the database. We need this during the initial
+  // part of the installer because the database is not available yet. We
+  // continue to use it even when the database does become available, in order
+  // to preserve consistency between interactive and command-line installations
+  // (the latter complete in one page request and therefore are forced to
+  // continue using the cache implementation they started with) and also
+  // because any data put in the cache during the installer is inherently
+  // suspect, due to the fact that Drupal is not fully set up yet.
+  require_once DRUPAL_ROOT . '/includes/cache.inc';
+  require_once DRUPAL_ROOT . '/includes/cache-install.inc';
+  $conf['cache_default_class'] = 'DrupalFakeCache';
+
+  // Prepare for themed output. We need to run this at the beginning of the
+  // page request to avoid a different theme accidentally getting set. (We also
+  // need to run it even in the case of command-line installations, to prevent
+  // any code in the installer that happens to initialize the theme system from
+  // accessing the database before it is set up yet.)
+  drupal_maintenance_theme();
+
+  // Check existing settings.php.
+  $install_state['settings_verified'] = install_verify_settings();
+
+  if ($install_state['settings_verified']) {
+    // Initialize the database system. Note that the connection
+    // won't be initialized until it is actually requested.
+    require_once DRUPAL_ROOT . '/includes/database/database.inc';
+
+    // Verify the last completed task in the database, if there is one.
+    $task = install_verify_completed_task();
+  }
+  else {
+    $task = NULL;
+
+    // Do not install over a configured settings.php. Check the 'db_url'
+    // variable in addition to 'databases', since previous versions of Drupal
+    // used that (and we do not want to allow installations on an existing site
+    // whose settings file has not yet been updated).
+    if (!empty($GLOBALS['databases']) || !empty($GLOBALS['db_url'])) {
+      throw new Exception(install_already_done_error());
+    }
+  }
+
+  // Modify the installation state as appropriate.
+  $install_state['completed_task'] = $task;
+  $install_state['database_tables_exist'] = !empty($task);
+}
+
+/**
+ * Runs all tasks for the current installation request.
+ *
+ * In the case of an interactive installation, all tasks will be attempted
+ * until one is reached that has output which needs to be displayed to the
+ * user, or until a page redirect is required. Otherwise, tasks will be
+ * attempted until the installation is finished.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state. This is
+ *   passed along to each task, so it can be modified if necessary.
+ *
+ * @return
+ *   HTML output from the last completed task.
+ */
+function install_run_tasks(&$install_state) {
+  do {
+    // Obtain a list of tasks to perform. The list of tasks itself can be
+    // dynamic (e.g., some might be defined by the installation profile,
+    // which is not necessarily known until the earlier tasks have run),
+    // so we regenerate the remaining tasks based on the installation state,
+    // each time through the loop.
+    $tasks_to_perform = install_tasks_to_perform($install_state);
+    // Run the first task on the list.
+    reset($tasks_to_perform);
+    $task_name = key($tasks_to_perform);
+    $task = array_shift($tasks_to_perform);
+    $install_state['active_task'] = $task_name;
+    $original_parameters = $install_state['parameters'];
+    $output = install_run_task($task, $install_state);
+    $install_state['parameters_changed'] = ($install_state['parameters'] != $original_parameters);
+    // Store this task as having been performed during the current request,
+    // and save it to the database as completed, if we need to and if the
+    // database is in a state that allows us to do so. Also mark the
+    // installation as 'done' when we have run out of tasks.
+    if (!$install_state['task_not_complete']) {
+      $install_state['tasks_performed'][] = $task_name;
+      $install_state['installation_finished'] = empty($tasks_to_perform);
+      if ($install_state['database_tables_exist'] && ($task['run'] == INSTALL_TASK_RUN_IF_NOT_COMPLETED || $install_state['installation_finished'])) {
+        variable_set('install_task', $install_state['installation_finished'] ? 'done' : $task_name);
+      }
+    }
+    // Stop when there are no tasks left. In the case of an interactive
+    // installation, also stop if we have some output to send to the browser,
+    // the URL parameters have changed, or an end to the page request was
+    // specifically called for.
+    $finished = empty($tasks_to_perform) || ($install_state['interactive'] && (isset($output) || $install_state['parameters_changed'] || $install_state['stop_page_request']));
+  } while (!$finished);
+  return $output;
+}
+
+/**
+ * Runs an individual installation task.
+ *
+ * @param $task
+ *   An array of information about the task to be run.
+ * @param $install_state
+ *   An array of information about the current installation state. This is
+ *   passed in by reference so that it can be modified by the task.
+ *
+ * @return
+ *   The output of the task function, if there is any.
+ */
+function install_run_task($task, &$install_state) {
+  $function = $task['function'];
+
+  if ($task['type'] == 'form') {
+    require_once DRUPAL_ROOT . '/includes/form.inc';
+    if ($install_state['interactive']) {
+      // For interactive forms, build the form and ensure that it will not
+      // redirect, since the installer handles its own redirection only after
+      // marking the form submission task complete.
+      $form_state = array(
+        // We need to pass $install_state by reference in order for forms to
+        // modify it, since the form API will use it in call_user_func_array(),
+        // which requires that referenced variables be passed explicitly.
+        'build_info' => array('args' => array(&$install_state)),
+        'no_redirect' => TRUE,
+      );
+      $form = drupal_build_form($function, $form_state);
+      // If a successful form submission did not occur, the form needs to be
+      // rendered, which means the task is not complete yet.
+      if (empty($form_state['executed'])) {
+        $install_state['task_not_complete'] = TRUE;
+        return drupal_render($form);
+      }
+      // Otherwise, return nothing so the next task will run in the same
+      // request.
+      return;
+    }
+    else {
+      // For non-interactive forms, submit the form programmatically with the
+      // values taken from the installation state. Throw an exception if any
+      // errors were encountered.
+      $form_state = array(
+        'values' => !empty($install_state['forms'][$function]) ? $install_state['forms'][$function] : array(),
+        // We need to pass $install_state by reference in order for forms to
+        // modify it, since the form API will use it in call_user_func_array(),
+        // which requires that referenced variables be passed explicitly.
+        'build_info' => array('args' => array(&$install_state)),
+      );
+      drupal_form_submit($function, $form_state);
+      $errors = form_get_errors();
+      if (!empty($errors)) {
+        throw new Exception(implode("\n", $errors));
+      }
+    }
+  }
+
+  elseif ($task['type'] == 'batch') {
+    // Start a new batch based on the task function, if one is not running
+    // already.
+    $current_batch = variable_get('install_current_batch');
+    if (!$install_state['interactive'] || !$current_batch) {
+      $batch = $function($install_state);
+      if (empty($batch)) {
+        // If the task did some processing and decided no batch was necessary,
+        // there is nothing more to do here.
+        return;
+      }
+      batch_set($batch);
+      // For interactive batches, we need to store the fact that this batch
+      // task is currently running. Otherwise, we need to make sure the batch
+      // will complete in one page request.
+      if ($install_state['interactive']) {
+        variable_set('install_current_batch', $function);
+      }
+      else {
+        $batch =& batch_get();
+        $batch['progressive'] = FALSE;
+      }
+      // Process the batch. For progressive batches, this will redirect.
+      // Otherwise, the batch will complete.
+      batch_process(install_redirect_url($install_state), install_full_redirect_url($install_state));
+    }
+    // If we are in the middle of processing this batch, keep sending back
+    // any output from the batch process, until the task is complete.
+    elseif ($current_batch == $function) {
+      include_once DRUPAL_ROOT . '/includes/batch.inc';
+      $output = _batch_page();
+      // The task is complete when we try to access the batch page and receive
+      // FALSE in return, since this means we are at a URL where we are no
+      // longer requesting a batch ID.
+      if ($output === FALSE) {
+        // Return nothing so the next task will run in the same request.
+        variable_del('install_current_batch');
+        return;
+      }
+      else {
+        // We need to force the page request to end if the task is not
+        // complete, since the batch API sometimes prints JSON output
+        // rather than returning a themed page.
+        $install_state['task_not_complete'] = $install_state['stop_page_request'] = TRUE;
+        return $output;
+      }
+    }
+  }
+
+  else {
+    // For normal tasks, just return the function result, whatever it is.
+    return $function($install_state);
+  }
+}
+
+/**
+ * Returns a list of tasks to perform during the current installation request.
+ *
+ * Note that the list of tasks can change based on the installation state as
+ * the page request evolves (for example, if an installation profile hasn't
+ * been selected yet, we don't yet know which profile tasks need to be run).
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ *
+ * @return
+ *   A list of tasks to be performed, with associated metadata.
+ */
+function install_tasks_to_perform($install_state) {
+  // Start with a list of all currently available tasks.
+  $tasks = install_tasks($install_state);
+  foreach ($tasks as $name => $task) {
+    // Remove any tasks that were already performed or that never should run.
+    // Also, if we started this page request with an indication of the last
+    // task that was completed, skip that task and all those that come before
+    // it, unless they are marked as always needing to run.
+    if ($task['run'] == INSTALL_TASK_SKIP || in_array($name, $install_state['tasks_performed']) || (!empty($install_state['completed_task']) && empty($completed_task_found) && $task['run'] != INSTALL_TASK_RUN_IF_REACHED)) {
+      unset($tasks[$name]);
+    }
+    if (!empty($install_state['completed_task']) && $name == $install_state['completed_task']) {
+      $completed_task_found = TRUE;
+    }
+  }
+  return $tasks;
+}
+
+/**
+ * Returns a list of all tasks the installer currently knows about.
+ *
+ * This function will return tasks regardless of whether or not they are
+ * intended to run on the current page request. However, the list can change
+ * based on the installation state (for example, if an installation profile
+ * hasn't been selected yet, we don't yet know which profile tasks will be
+ * available).
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ *
+ * @return
+ *   A list of tasks, with associated metadata.
+ */
+function install_tasks($install_state) {
+  // Determine whether translation import tasks will need to be performed.
+  $needs_translations = count($install_state['locales']) > 1 && !empty($install_state['parameters']['locale']) && $install_state['parameters']['locale'] != 'en';
+
+  // Start with the core installation tasks that run before handing control
+  // to the installation profile.
+  $tasks = array(
+    'install_select_profile' => array(
+      'display_name' => st('Choose profile'),
+      'display' => count($install_state['profiles']) != 1,
+      'run' => INSTALL_TASK_RUN_IF_REACHED,
+    ),
+    'install_select_locale' => array(
+      'display_name' => st('Choose language'),
+      'run' => INSTALL_TASK_RUN_IF_REACHED,
+    ),
+    'install_load_profile' => array(
+      'run' => INSTALL_TASK_RUN_IF_REACHED,
+    ),
+    'install_verify_requirements' => array(
+      'display_name' => st('Verify requirements'),
+    ),
+    'install_settings_form' => array(
+      'display_name' => st('Set up database'),
+      'type' => 'form',
+      'run' => $install_state['settings_verified'] ? INSTALL_TASK_SKIP : INSTALL_TASK_RUN_IF_NOT_COMPLETED,
+    ),
+    'install_system_module' => array(
+    ),
+    'install_bootstrap_full' => array(
+      'run' => INSTALL_TASK_RUN_IF_REACHED,
+    ),
+    'install_profile_modules' => array(
+      'display_name' => count($install_state['profiles']) == 1 ? st('Install site') : st('Install profile'),
+      'type' => 'batch',
+    ),
+    'install_import_locales' => array(
+      'display_name' => st('Set up translations'),
+      'display' => $needs_translations,
+      'type' => 'batch',
+      'run' => $needs_translations ? INSTALL_TASK_RUN_IF_NOT_COMPLETED : INSTALL_TASK_SKIP,
+    ),
+    'install_configure_form' => array(
+      'display_name' => st('Configure site'),
+      'type' => 'form',
+    ),
+  );
+
+  // Now add any tasks defined by the installation profile.
+  if (!empty($install_state['parameters']['profile'])) {
+    // Load the profile install file, because it is not always loaded when
+    // hook_install_tasks() is invoked (e.g. batch processing).
+    $profile_install_file = DRUPAL_ROOT . '/profiles/' . $install_state['parameters']['profile'] . '/' . $install_state['parameters']['profile'] . '.install';
+    if (file_exists($profile_install_file)) {
+      include_once $profile_install_file;
+    }
+    $function = $install_state['parameters']['profile'] . '_install_tasks';
+    if (function_exists($function)) {
+      $result = $function($install_state);
+      if (is_array($result)) {
+        $tasks += $result;
+      }
+    }
+  }
+
+  // Finish by adding the remaining core tasks.
+  $tasks += array(
+    'install_import_locales_remaining' => array(
+      'display_name' => st('Finish translations'),
+      'display' => $needs_translations,
+      'type' => 'batch',
+      'run' => $needs_translations ? INSTALL_TASK_RUN_IF_NOT_COMPLETED : INSTALL_TASK_SKIP,
+    ),
+    'install_finished' => array(
+      'display_name' => st('Finished'),
+    ),
+  );
+
+  // Allow the installation profile to modify the full list of tasks.
+  if (!empty($install_state['parameters']['profile'])) {
+    $profile_file = DRUPAL_ROOT . '/profiles/' . $install_state['parameters']['profile'] . '/' . $install_state['parameters']['profile'] . '.profile';
+    if (file_exists($profile_file)) {
+      include_once $profile_file;
+      $function = $install_state['parameters']['profile'] . '_install_tasks_alter';
+      if (function_exists($function)) {
+        $function($tasks, $install_state);
+      }
+    }
+  }
+
+  // Fill in default parameters for each task before returning the list.
+  foreach ($tasks as $task_name => &$task) {
+    $task += array(
+      'display_name' => NULL,
+      'display' => !empty($task['display_name']),
+      'type' => 'normal',
+      'run' => INSTALL_TASK_RUN_IF_NOT_COMPLETED,
+      'function' => $task_name,
+    );
+  }
+  return $tasks;
+}
+
+/**
+ * Returns a list of tasks that should be displayed to the end user.
+ *
+ * The output of this function is a list suitable for sending to
+ * theme_task_list().
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ *
+ * @return
+ *   A list of tasks, with keys equal to the machine-readable task name and
+ *   values equal to the name that should be displayed.
+ *
+ * @see theme_task_list()
+ */
+function install_tasks_to_display($install_state) {
+  $displayed_tasks = array();
+  foreach (install_tasks($install_state) as $name => $task) {
+    if ($task['display']) {
+      $displayed_tasks[$name] = $task['display_name'];
+    }
+  }
+  return $displayed_tasks;
+}
+
+/**
+ * Returns the URL that should be redirected to during an installation request.
+ *
+ * The output of this function is suitable for sending to install_goto().
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ *
+ * @return
+ *   The URL to redirect to.
+ *
+ * @see install_full_redirect_url()
+ */
+function install_redirect_url($install_state) {
+  return 'install.php?' . drupal_http_build_query($install_state['parameters']);
+}
+
+/**
+ * Returns the complete URL redirected to during an installation request.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ *
+ * @return
+ *   The complete URL to redirect to.
+ *
+ * @see install_redirect_url()
+ */
+function install_full_redirect_url($install_state) {
+  global $base_url;
+  return $base_url . '/' . install_redirect_url($install_state);
+}
+
+/**
+ * Displays themed installer output and ends the page request.
+ *
+ * Installation tasks should use drupal_set_title() to set the desired page
+ * title, but otherwise this function takes care of theming the overall page
+ * output during every step of the installation.
+ *
+ * @param $output
+ *   The content to display on the main part of the page.
+ * @param $install_state
+ *   An array of information about the current installation state.
+ */
+function install_display_output($output, $install_state) {
+  drupal_page_header();
+
+  // Prevent install.php from being indexed when installed in a sub folder.
+  // robots.txt rules are not read if the site is within domain.com/subfolder
+  // resulting in /subfolder/install.php being found through search engines.
+  // When settings.php is writeable this can be used via an external database
+  // leading a malicious user to gain php access to the server.
+  $noindex_meta_tag = array(
+    '#tag' => 'meta',
+    '#attributes' => array(
+      'name' => 'robots',
+      'content' => 'noindex, nofollow',
+    ),
+  );
+  drupal_add_html_head($noindex_meta_tag, 'install_meta_robots');
+
+  // Only show the task list if there is an active task; otherwise, the page
+  // request has ended before tasks have even been started, so there is nothing
+  // meaningful to show.
+  if (isset($install_state['active_task'])) {
+    // Let the theming function know when every step of the installation has
+    // been completed.
+    $active_task = $install_state['installation_finished'] ? NULL : $install_state['active_task'];
+    drupal_add_region_content('sidebar_first', theme('task_list', array('items' => install_tasks_to_display($install_state), 'active' => $active_task)));
+  }
+  print theme('install_page', array('content' => $output));
+  exit;
+}
+
+/**
+ * Verifies the requirements for installing Drupal.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ *
+ * @return
+ *   A themed status report, or an exception if there are requirement errors.
+ *   If there are only requirement warnings, a themed status report is shown
+ *   initially, but the user is allowed to bypass it by providing 'continue=1'
+ *   in the URL. Otherwise, no output is returned, so that the next task can be
+ *   run in the same page request.
+ */
+function install_verify_requirements(&$install_state) {
+  // Check the installation requirements for Drupal and this profile.
+  $requirements = install_check_requirements($install_state);
+
+  // Verify existence of all required modules.
+  $requirements += drupal_verify_profile($install_state);
+
+  // Check the severity of the requirements reported.
+  $severity = drupal_requirements_severity($requirements);
+
+  // If there are errors, always display them. If there are only warnings, skip
+  // them if the user has provided a URL parameter acknowledging the warnings
+  // and indicating a desire to continue anyway. See drupal_requirements_url().
+  if ($severity == REQUIREMENT_ERROR || ($severity == REQUIREMENT_WARNING && empty($install_state['parameters']['continue']))) {
+    if ($install_state['interactive']) {
+      drupal_set_title(st('Requirements problem'));
+      $status_report = theme('status_report', array('requirements' => $requirements));
+      $status_report .= st('Check the error messages and <a href="!url">proceed with the installation</a>.', array('!url' => check_url(drupal_requirements_url($severity))));
+      return $status_report;
+    }
+    else {
+      // Throw an exception showing any unmet requirements.
+      $failures = array();
+      foreach ($requirements as $requirement) {
+        // Skip warnings altogether for non-interactive installations; these
+        // proceed in a single request so there is no good opportunity (and no
+        // good method) to warn the user anyway.
+        if (isset($requirement['severity']) && $requirement['severity'] == REQUIREMENT_ERROR) {
+          $failures[] = $requirement['title'] . ': ' . $requirement['value'] . "\n\n" . $requirement['description'];
+        }
+      }
+      if (!empty($failures)) {
+        throw new Exception(implode("\n\n", $failures));
+      }
+    }
+  }
+}
+
+/**
+ * Installation task; install the Drupal system module.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ */
+function install_system_module(&$install_state) {
+  // Install system.module.
+  drupal_install_system();
+
+  // Call file_ensure_htaccess() to ensure that all of Drupal's standard
+  // directories (e.g., the public and private files directories) have
+  // appropriate .htaccess files. These directories will have already been
+  // created by this point in the installer, since Drupal creates them during
+  // the install_verify_requirements() task. Note that we cannot call
+  // file_ensure_htaccess() any earlier than this, since it relies on
+  // system.module in order to work.
+  file_ensure_htaccess();
+
+  // Enable the user module so that sessions can be recorded during the
+  // upcoming bootstrap step.
+  module_enable(array('user'), FALSE);
+
+  // Save the list of other modules to install for the upcoming tasks.
+  // variable_set() can be used now that system.module is installed.
+  $modules = $install_state['profile_info']['dependencies'];
+
+  // The installation profile is also a module, which needs to be installed
+  // after all the dependencies have been installed.
+  $modules[] = drupal_get_profile();
+
+  variable_set('install_profile_modules', array_diff($modules, array('system')));
+  $install_state['database_tables_exist'] = TRUE;
+}
+
+/**
+ * Verifies and returns the last installation task that was completed.
+ *
+ * @return
+ *   The last completed task, if there is one. An exception is thrown if Drupal
+ *   is already installed.
+ */
+function install_verify_completed_task() {
+  try {
+    if ($result = db_query("SELECT value FROM {variable} WHERE name = :name", array('name' => 'install_task'))) {
+      $task = unserialize($result->fetchField());
+    }
+  }
+  // Do not trigger an error if the database query fails, since the database
+  // might not be set up yet.
+  catch (Exception $e) {
+  }
+  if (isset($task)) {
+    if ($task == 'done') {
+      throw new Exception(install_already_done_error());
+    }
+    return $task;
+  }
+}
+
+/**
+ * Verifies the existing settings in settings.php.
+ */
+function install_verify_settings() {
+  global $databases;
+
+  // Verify existing settings (if any).
+  if (!empty($databases) && install_verify_pdo()) {
+    $database = $databases['default']['default'];
+    drupal_static_reset('conf_path');
+    $settings_file = './' . conf_path(FALSE) . '/settings.php';
+    $errors = install_database_errors($database, $settings_file);
+    if (empty($errors)) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Verifies the PDO library.
+ */
+function install_verify_pdo() {
+  // PDO was moved to PHP core in 5.2.0, but the old extension (targeting 5.0
+  // and 5.1) is still available from PECL, and can still be built without
+  // errors. To verify that the correct version is in use, we check the
+  // PDO::ATTR_DEFAULT_FETCH_MODE constant, which is not available in the
+  // PECL extension.
+  return extension_loaded('pdo') && defined('PDO::ATTR_DEFAULT_FETCH_MODE');
+}
+
+/**
+ * Form constructor for a form to configure and rewrite settings.php.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ *
+ * @see install_settings_form_validate()
+ * @see install_settings_form_submit()
+ * @ingroup forms
+ */
+function install_settings_form($form, &$form_state, &$install_state) {
+  global $databases;
+  $profile = $install_state['parameters']['profile'];
+  $install_locale = $install_state['parameters']['locale'];
+
+  drupal_static_reset('conf_path');
+  $conf_path = './' . conf_path(FALSE);
+  $settings_file = $conf_path . '/settings.php';
+  $database = isset($databases['default']['default']) ? $databases['default']['default'] : array();
+
+  drupal_set_title(st('Database configuration'));
+
+  $drivers = drupal_get_database_types();
+  $drivers_keys = array_keys($drivers);
+
+  $form['driver'] = array(
+    '#type' => 'radios',
+    '#title' => st('Database type'),
+    '#required' => TRUE,
+    '#default_value' => !empty($database['driver']) ? $database['driver'] : current($drivers_keys),
+    '#description' => st('The type of database your @drupal data will be stored in.', array('@drupal' => drupal_install_profile_distribution_name())),
+  );
+  if (count($drivers) == 1) {
+    $form['driver']['#disabled'] = TRUE;
+    $form['driver']['#description'] .= ' ' . st('Your PHP configuration only supports a single database type, so it has been automatically selected.');
+  }
+
+  // Add driver specific configuration options.
+  foreach ($drivers as $key => $driver) {
+    $form['driver']['#options'][$key] = $driver->name();
+
+    $form['settings'][$key] = $driver->getFormOptions($database);
+    $form['settings'][$key]['#prefix'] = '<h2 class="js-hide">' . st('@driver_name settings', array('@driver_name' => $driver->name())) . '</h2>';
+    $form['settings'][$key]['#type'] = 'container';
+    $form['settings'][$key]['#tree'] = TRUE;
+    $form['settings'][$key]['advanced_options']['#parents'] = array($key);
+    $form['settings'][$key]['#states'] = array(
+      'visible' => array(
+        ':input[name=driver]' => array('value' => $key),
+      )
+    );
+  }
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['save'] = array(
+    '#type' => 'submit',
+    '#value' => st('Save and continue'),
+    '#limit_validation_errors' => array(
+      array('driver'),
+      array(isset($form_state['input']['driver']) ? $form_state['input']['driver'] : current($drivers_keys)),
+    ),
+    '#submit' => array('install_settings_form_submit'),
+  );
+
+  $form['errors'] = array();
+  $form['settings_file'] = array('#type' => 'value', '#value' => $settings_file);
+
+  return $form;
+}
+
+/**
+ * Form validation handler for install_settings_form().
+ *
+ * @see install_settings_form_submit()
+ */
+function install_settings_form_validate($form, &$form_state) {
+  $driver = $form_state['values']['driver'];
+  $database = $form_state['values'][$driver];
+  $database['driver'] = $driver;
+
+  // TODO: remove when PIFR will be updated to use 'db_prefix' instead of
+  // 'prefix' in the database settings form.
+  $database['prefix'] = $database['db_prefix'];
+  unset($database['db_prefix']);
+
+  $form_state['storage']['database'] = $database;
+  $errors = install_database_errors($database, $form_state['values']['settings_file']);
+  foreach ($errors as $name => $message) {
+    form_set_error($name, $message);
+  }
+}
+
+/**
+ * Checks a database connection and returns any errors.
+ */
+function install_database_errors($database, $settings_file) {
+  global $databases;
+  $errors = array();
+
+  // Check database type.
+  $database_types = drupal_get_database_types();
+  $driver = $database['driver'];
+  if (!isset($database_types[$driver])) {
+    $errors['driver'] = st("In your %settings_file file you have configured @drupal to use a %driver server, however your PHP installation currently does not support this database type.", array('%settings_file' => $settings_file, '@drupal' => drupal_install_profile_distribution_name(), '%driver' => $driver));
+  }
+  else {
+    // Run driver specific validation
+    $errors += $database_types[$driver]->validateDatabaseSettings($database);
+
+    // Run tasks associated with the database type. Any errors are caught in the
+    // calling function.
+    $databases['default']['default'] = $database;
+    // Just changing the global doesn't get the new information processed.
+    // We tell tell the Database class to re-parse $databases.
+    Database::parseConnectionInfo();
+
+    try {
+      db_run_tasks($driver);
+    }
+    catch (DatabaseTaskException $e) {
+      // These are generic errors, so we do not have any specific key of the
+      // database connection array to attach them to; therefore, we just put
+      // them in the error array with standard numeric keys.
+      $errors[$driver . '][0'] = $e->getMessage();
+    }
+  }
+  return $errors;
+}
+
+/**
+ * Form submission handler for install_settings_form().
+ *
+ * @see install_settings_form_validate()
+ */
+function install_settings_form_submit($form, &$form_state) {
+  global $install_state;
+
+  // Update global settings array and save.
+  $settings['databases'] = array(
+    'value'    => array('default' => array('default' => $form_state['storage']['database'])),
+    'required' => TRUE,
+  );
+  $settings['drupal_hash_salt'] = array(
+    'value'    => drupal_random_key(),
+    'required' => TRUE,
+  );
+  drupal_rewrite_settings($settings);
+  // Indicate that the settings file has been verified, and check the database
+  // for the last completed task, now that we have a valid connection. This
+  // last step is important since we want to trigger an error if the new
+  // database already has Drupal installed.
+  $install_state['settings_verified'] = TRUE;
+  $install_state['completed_task'] = install_verify_completed_task();
+}
+
+/**
+ * Finds all .profile files.
+ */
+function install_find_profiles() {
+  return file_scan_directory('./profiles', '/\.profile$/', array('key' => 'name'));
+}
+
+/**
+ * Selects which profile to install.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state. The chosen
+ *   profile will be added here, if it was not already selected previously, as
+ *   will a list of all available profiles.
+ *
+ * @return
+ *   For interactive installations, a form allowing the profile to be selected,
+ *   if the user has a choice that needs to be made. Otherwise, an exception is
+ *   thrown if a profile cannot be chosen automatically.
+ */
+function install_select_profile(&$install_state) {
+  $install_state['profiles'] += install_find_profiles();
+  if (empty($install_state['parameters']['profile'])) {
+    // Try to find a profile.
+    $profile = _install_select_profile($install_state['profiles']);
+    if (empty($profile)) {
+      // We still don't have a profile, so display a form for selecting one.
+      // Only do this in the case of interactive installations, since this is
+      // not a real form with submit handlers (the database isn't even set up
+      // yet), rather just a convenience method for setting parameters in the
+      // URL.
+      if ($install_state['interactive']) {
+        include_once DRUPAL_ROOT . '/includes/form.inc';
+        drupal_set_title(st('Select an installation profile'));
+        $form = drupal_get_form('install_select_profile_form', $install_state['profiles']);
+        return drupal_render($form);
+      }
+      else {
+        throw new Exception(install_no_profile_error());
+      }
+    }
+    else {
+      $install_state['parameters']['profile'] = $profile;
+    }
+  }
+}
+
+/**
+ * Selects an installation profile.
+ *
+ * A profile will be selected if:
+ * - Only one profile is available,
+ * - A profile was submitted through $_POST,
+ * - Exactly one of the profiles is marked as "exclusive".
+ * If multiple profiles are marked as "exclusive" then no profile will be
+ * selected.
+ *
+ * @param array $profiles
+ *   An associative array of profiles with the machine-readable names as keys.
+ *
+ * @return
+ *   The machine-readable name of the selected profile or NULL if no profile was
+ *   selected.
+ */
+function _install_select_profile($profiles) {
+  if (sizeof($profiles) == 0) {
+    throw new Exception(install_no_profile_error());
+  }
+  // Don't need to choose profile if only one available.
+  if (sizeof($profiles) == 1) {
+    $profile = array_pop($profiles);
+    // TODO: is this right?
+    require_once DRUPAL_ROOT . '/' . $profile->uri;
+    return $profile->name;
+  }
+  else {
+    foreach ($profiles as $profile) {
+      if (!empty($_POST['profile']) && ($_POST['profile'] == $profile->name)) {
+        return $profile->name;
+      }
+    }
+  }
+  // Check for a profile marked as "exclusive" and ensure that only one
+  // profile is marked as such.
+  $exclusive_profile = NULL;
+  foreach ($profiles as $profile) {
+    $profile_info = install_profile_info($profile->name);
+    if (!empty($profile_info['exclusive'])) {
+      if (empty($exclusive_profile)) {
+        $exclusive_profile = $profile->name;
+      }
+      else {
+        // We found a second "exclusive" profile. There's no way to choose
+        // between them, so we ignore the property.
+        return;
+      }
+    }
+  }
+  return $exclusive_profile;
+}
+
+/**
+ * Form constructor for the profile selection form.
+ *
+ * @param $form_state
+ *   Array of metadata about state of form processing.
+ * @param $profile_files
+ *   Array of .profile files, as returned from file_scan_directory().
+ *
+ * @ingroup forms
+ */
+function install_select_profile_form($form, &$form_state, $profile_files) {
+  $profiles = array();
+  $names = array();
+
+  foreach ($profile_files as $profile) {
+    // TODO: is this right?
+    include_once DRUPAL_ROOT . '/' . $profile->uri;
+
+    $details = install_profile_info($profile->name);
+    // Don't show hidden profiles. This is used by to hide the testing profile,
+    // which only exists to speed up test runs.
+    if ($details['hidden'] === TRUE) {
+      continue;
+    }
+    $profiles[$profile->name] = $details;
+
+    // Determine the name of the profile; default to file name if defined name
+    // is unspecified.
+    $name = isset($details['name']) ? $details['name'] : $profile->name;
+    $names[$profile->name] = $name;
+  }
+
+  // Display radio buttons alphabetically by human-readable name, but always
+  // put the core profiles first (if they are present in the filesystem).
+  natcasesort($names);
+  if (isset($names['minimal'])) {
+    // If the expert ("Minimal") core profile is present, put it in front of
+    // any non-core profiles rather than including it with them alphabetically,
+    // since the other profiles might be intended to group together in a
+    // particular way.
+    $names = array('minimal' => $names['minimal']) + $names;
+  }
+  if (isset($names['standard'])) {
+    // If the default ("Standard") core profile is present, put it at the very
+    // top of the list. This profile will have its radio button pre-selected,
+    // so we want it to always appear at the top.
+    $names = array('standard' => $names['standard']) + $names;
+  }
+
+  foreach ($names as $profile => $name) {
+    $form['profile'][$name] = array(
+      '#type' => 'radio',
+      '#value' => 'standard',
+      '#return_value' => $profile,
+      '#title' => $name,
+      '#description' => isset($profiles[$profile]['description']) ? $profiles[$profile]['description'] : '',
+      '#parents' => array('profile'),
+    );
+  }
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] =  array(
+    '#type' => 'submit',
+    '#value' => st('Save and continue'),
+  );
+  return $form;
+}
+
+/**
+ * Find all .po files for the current profile.
+ */
+function install_find_locales($profilename) {
+  $locales = file_scan_directory('./profiles/' . $profilename . '/translations', '/\.po$/', array('recurse' => FALSE));
+  array_unshift($locales, (object) array('name' => 'en'));
+  foreach ($locales as $key => $locale) {
+    // The locale (file name) might be drupal-7.2.cs.po instead of cs.po.
+    $locales[$key]->langcode = preg_replace('!^(.+\.)?([^\.]+)$!', '\2', $locale->name);
+    // Language codes cannot exceed 12 characters to fit into the {languages}
+    // table.
+    if (strlen($locales[$key]->langcode) > 12) {
+      unset($locales[$key]);
+    }
+  }
+  return $locales;
+}
+
+/**
+ * Installation task; select which locale to use for the current profile.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state. The chosen
+ *   locale will be added here, if it was not already selected previously, as
+ *   will a list of all available locales.
+ *
+ * @return
+ *   For interactive installations, a form or other page output allowing the
+ *   locale to be selected or providing information about locale selection, if
+ *   a locale has not been chosen. Otherwise, an exception is thrown if a
+ *   locale cannot be chosen automatically.
+ */
+function install_select_locale(&$install_state) {
+  // Find all available locales.
+  $profilename = $install_state['parameters']['profile'];
+  $locales = install_find_locales($profilename);
+  $install_state['locales'] += $locales;
+
+  if (!empty($_POST['locale'])) {
+    foreach ($locales as $locale) {
+      if ($_POST['locale'] == $locale->langcode) {
+        $install_state['parameters']['locale'] = $locale->langcode;
+        return;
+      }
+    }
+  }
+
+  if (empty($install_state['parameters']['locale'])) {
+    // If only the built-in (English) language is available, and we are
+    // performing an interactive installation, inform the user that the
+    // installer can be localized. Otherwise we assume the user knows what he
+    // is doing.
+    if (count($locales) == 1) {
+      if ($install_state['interactive']) {
+        drupal_set_title(st('Choose language'));
+        if (!empty($install_state['parameters']['localize'])) {
+          $output = '<p>Follow these steps to translate Drupal into your language:</p>';
+          $output .= '<ol>';
+          $output .= '<li>Download a translation from the <a href="http://localize.drupal.org/download" target="_blank">translation server</a>.</li>';
+          $output .= '<li>Place it into the following directory:
+<pre>
+/profiles/' . $profilename . '/translations/
+</pre></li>';
+          $output .= '</ol>';
+          $output .= '<p>For more information on installing Drupal in different languages, visit the <a href="http://drupal.org/localize" target="_blank">drupal.org handbook page</a>.</p>';
+          $output .= '<p>How should the installation continue?</p>';
+          $output .= '<ul>';
+          $output .= '<li><a href="install.php?profile=' . $profilename . '">Reload the language selection page after adding translations</a></li>';
+          $output .= '<li><a href="install.php?profile=' . $profilename . '&amp;locale=en">Continue installation in English</a></li>';
+          $output .= '</ul>';
+        }
+        else {
+          include_once DRUPAL_ROOT . '/includes/form.inc';
+          $elements = drupal_get_form('install_select_locale_form', $locales, $profilename);
+          $output = drupal_render($elements);
+        }
+        return $output;
+      }
+      // One language, but not an interactive installation. Assume the user
+      // knows what he is doing.
+      $locale = current($locales);
+      $install_state['parameters']['locale'] = $locale->name;
+      return;
+    }
+    else {
+      // Allow profile to pre-select the language, skipping the selection.
+      $function = $profilename . '_profile_details';
+      if (function_exists($function)) {
+        $details = $function();
+        if (isset($details['language'])) {
+          foreach ($locales as $locale) {
+            if ($details['language'] == $locale->name) {
+              $install_state['parameters']['locale'] = $locale->name;
+              return;
+            }
+          }
+        }
+      }
+
+      // We still don't have a locale, so display a form for selecting one.
+      // Only do this in the case of interactive installations, since this is
+      // not a real form with submit handlers (the database isn't even set up
+      // yet), rather just a convenience method for setting parameters in the
+      // URL.
+      if ($install_state['interactive']) {
+        drupal_set_title(st('Choose language'));
+        include_once DRUPAL_ROOT . '/includes/form.inc';
+        $elements = drupal_get_form('install_select_locale_form', $locales, $profilename);
+        return drupal_render($elements);
+      }
+      else {
+        throw new Exception(st('Sorry, you must select a language to continue the installation.'));
+      }
+    }
+  }
+}
+
+/**
+ * Form constructor for the language selection form.
+ *
+ * @ingroup forms
+ */
+function install_select_locale_form($form, &$form_state, $locales, $profilename) {
+  include_once DRUPAL_ROOT . '/includes/iso.inc';
+  $languages = _locale_get_predefined_list();
+  foreach ($locales as $locale) {
+    $name = $locale->langcode;
+    if (isset($languages[$name])) {
+      $name = $languages[$name][0] . (isset($languages[$name][1]) ? ' ' . st('(@language)', array('@language' => $languages[$name][1])) : '');
+    }
+    $form['locale'][$locale->langcode] = array(
+      '#type' => 'radio',
+      '#return_value' => $locale->langcode,
+      '#default_value' => $locale->langcode == 'en' ? 'en' : '',
+      '#title' => $name . ($locale->langcode == 'en' ? ' ' . st('(built-in)') : ''),
+      '#parents' => array('locale')
+    );
+  }
+  if (count($locales) == 1) {
+    $form['help'] = array(
+      '#markup' => '<p><a href="install.php?profile=' . $profilename . '&amp;localize=true">' . st('Learn how to install Drupal in other languages') . '</a></p>',
+    );
+  }
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] =  array(
+    '#type' => 'submit',
+    '#value' => st('Save and continue'),
+  );
+  return $form;
+}
+
+/**
+ * Indicates that there are no profiles available.
+ */
+function install_no_profile_error() {
+  drupal_set_title(st('No profiles available'));
+  return st('We were unable to find any installation profiles. Installation profiles tell us what modules to enable and what schema to install in the database. A profile is necessary to continue with the installation process.');
+}
+
+/**
+ * Indicates that Drupal has already been installed.
+ */
+function install_already_done_error() {
+  global $base_url;
+
+  drupal_set_title(st('Drupal already installed'));
+  return st('<ul><li>To start over, you must empty your existing database.</li><li>To install to a different database, edit the appropriate <em>settings.php</em> file in the <em>sites</em> folder.</li><li>To upgrade an existing installation, proceed to the <a href="@base-url/update.php">update script</a>.</li><li>View your <a href="@base-url">existing site</a>.</li></ul>', array('@base-url' => $base_url));
+}
+
+/**
+ * Loads information about the chosen profile during installation.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state. The loaded
+ *   profile information will be added here, or an exception will be thrown if
+ *   the profile cannot be loaded.
+ */
+function install_load_profile(&$install_state) {
+  $profile_file = DRUPAL_ROOT . '/profiles/' . $install_state['parameters']['profile'] . '/' . $install_state['parameters']['profile'] . '.profile';
+  if (file_exists($profile_file)) {
+    include_once $profile_file;
+    $install_state['profile_info'] = install_profile_info($install_state['parameters']['profile'], $install_state['parameters']['locale']);
+  }
+  else {
+    throw new Exception(st('Sorry, the profile you have chosen cannot be loaded.'));
+  }
+}
+
+/**
+ * Performs a full bootstrap of Drupal during installation.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ */
+function install_bootstrap_full(&$install_state) {
+  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+}
+
+/**
+ * Installs required modules via a batch process.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ *
+ * @return
+ *   The batch definition.
+ */
+function install_profile_modules(&$install_state) {
+  $modules = variable_get('install_profile_modules', array());
+  $files = system_rebuild_module_data();
+  variable_del('install_profile_modules');
+
+  // Always install required modules first. Respect the dependencies between
+  // the modules.
+  $required = array();
+  $non_required = array();
+  // Although the profile module is marked as required, it needs to go after
+  // every dependency, including non-required ones. So clear its required
+  // flag for now to allow it to install late.
+  $files[$install_state['parameters']['profile']]->info['required'] = FALSE;
+  // Add modules that other modules depend on.
+  foreach ($modules as $module) {
+    if ($files[$module]->requires) {
+      $modules = array_merge($modules, array_keys($files[$module]->requires));
+    }
+  }
+  $modules = array_unique($modules);
+  foreach ($modules as $module) {
+    if (!empty($files[$module]->info['required'])) {
+      $required[$module] = $files[$module]->sort;
+    }
+    else {
+      $non_required[$module] = $files[$module]->sort;
+    }
+  }
+  arsort($required);
+  arsort($non_required);
+
+  $operations = array();
+  foreach ($required + $non_required as $module => $weight) {
+    $operations[] = array('_install_module_batch', array($module, $files[$module]->info['name']));
+  }
+  $batch = array(
+    'operations' => $operations,
+    'title' => st('Installing @drupal', array('@drupal' => drupal_install_profile_distribution_name())),
+    'error_message' => st('The installation has encountered an error.'),
+    'finished' => '_install_profile_modules_finished',
+  );
+  return $batch;
+}
+
+/**
+ * Imports languages via a batch process during installation.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ *
+ * @return
+ *   The batch definition, if there are language files to import.
+ */
+function install_import_locales(&$install_state) {
+  include_once DRUPAL_ROOT . '/includes/locale.inc';
+  $install_locale = $install_state['parameters']['locale'];
+
+  include_once DRUPAL_ROOT . '/includes/iso.inc';
+  $predefined = _locale_get_predefined_list();
+  if (!isset($predefined[$install_locale])) {
+    // Drupal does not know about this language, so we prefill its values with
+    // our best guess. The user will be able to edit afterwards.
+    locale_add_language($install_locale, $install_locale, $install_locale, LANGUAGE_LTR, '', '', TRUE, TRUE);
+  }
+  else {
+    // A known predefined language, details will be filled in properly.
+    locale_add_language($install_locale, NULL, NULL, NULL, '', '', TRUE, TRUE);
+  }
+
+  // Collect files to import for this language.
+  $batch = locale_batch_by_language($install_locale, NULL);
+  if (!empty($batch)) {
+    // Remember components we cover in this batch set.
+    variable_set('install_locale_batch_components', $batch['#components']);
+    return $batch;
+  }
+}
+
+/**
+ * Form constructor for a form to configure the new site.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ *
+ * @see install_configure_form_validate()
+ * @see install_configure_form_submit()
+ * @ingroup forms
+ */
+function install_configure_form($form, &$form_state, &$install_state) {
+  drupal_set_title(st('Configure site'));
+
+  // Warn about settings.php permissions risk
+  $settings_dir = conf_path();
+  $settings_file = $settings_dir . '/settings.php';
+  // Check that $_POST is empty so we only show this message when the form is
+  // first displayed, not on the next page after it is submitted. (We do not
+  // want to repeat it multiple times because it is a general warning that is
+  // not related to the rest of the installation process; it would also be
+  // especially out of place on the last page of the installer, where it would
+  // distract from the message that the Drupal installation has completed
+  // successfully.)
+  if (empty($_POST) && (!drupal_verify_install_file(DRUPAL_ROOT . '/' . $settings_file, FILE_EXIST|FILE_READABLE|FILE_NOT_WRITABLE) || !drupal_verify_install_file(DRUPAL_ROOT . '/' . $settings_dir, FILE_NOT_WRITABLE, 'dir'))) {
+    drupal_set_message(st('All necessary changes to %dir and %file have been made, so you should remove write permissions to them now in order to avoid security risks. If you are unsure how to do so, consult the <a href="@handbook_url">online handbook</a>.', array('%dir' => $settings_dir, '%file' => $settings_file, '@handbook_url' => 'http://drupal.org/server-permissions')), 'warning');
+  }
+
+  drupal_add_js(drupal_get_path('module', 'system') . '/system.js');
+  // Add JavaScript time zone detection.
+  drupal_add_js('misc/timezone.js');
+  // We add these strings as settings because JavaScript translation does not
+  // work during installation.
+  drupal_add_js(array('copyFieldValue' => array('edit-site-mail' => array('edit-account-mail'))), 'setting');
+  drupal_add_js('jQuery(function () { Drupal.cleanURLsInstallCheck(); });', 'inline');
+  // Add JS to show / hide the 'Email administrator about site updates' elements
+  drupal_add_js('jQuery(function () { Drupal.hideEmailAdministratorCheckbox() });', 'inline');
+  // Build menu to allow clean URL check.
+  menu_rebuild();
+
+  // Cache a fully-built schema. This is necessary for any invocation of
+  // index.php because: (1) setting cache table entries requires schema
+  // information, (2) that occurs during bootstrap before any module are
+  // loaded, so (3) if there is no cached schema, drupal_get_schema() will
+  // try to generate one but with no loaded modules will return nothing.
+  //
+  // This logically could be done during the 'install_finished' task, but the
+  // clean URL check requires it now.
+  drupal_get_schema(NULL, TRUE);
+
+  // Return the form.
+  return _install_configure_form($form, $form_state, $install_state);
+}
+
+/**
+ * Installation task; import remaining languages via a batch process.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ *
+ * @return
+ *   The batch definition, if there are language files to import.
+ */
+function install_import_locales_remaining(&$install_state) {
+  include_once DRUPAL_ROOT . '/includes/locale.inc';
+  // Collect files to import for this language. Skip components already covered
+  // in the initial batch set.
+  $install_locale = $install_state['parameters']['locale'];
+  $batch = locale_batch_by_language($install_locale, NULL, variable_get('install_locale_batch_components', array()));
+  // Remove temporary variable.
+  variable_del('install_locale_batch_components');
+  return $batch;
+}
+
+/**
+ * Finishes importing files at end of installation.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ *
+ * @return
+ *   A message informing the user that the installation is complete.
+ */
+function install_finished(&$install_state) {
+  drupal_set_title(st('@drupal installation complete', array('@drupal' => drupal_install_profile_distribution_name())), PASS_THROUGH);
+  $messages = drupal_set_message();
+  $output = '<p>' . st('Congratulations, you installed @drupal!', array('@drupal' => drupal_install_profile_distribution_name())) . '</p>';
+  $output .= '<p>' . (isset($messages['error']) ? st('Review the messages above before visiting <a href="@url">your new site</a>.', array('@url' => url(''))) : st('<a href="@url">Visit your new site</a>.', array('@url' => url('')))) . '</p>';
+
+  // Flush all caches to ensure that any full bootstraps during the installer
+  // do not leave stale cached data, and that any content types or other items
+  // registered by the installation profile are registered correctly.
+  drupal_flush_all_caches();
+
+  // Remember the profile which was used.
+  variable_set('install_profile', drupal_get_profile());
+
+  // Installation profiles are always loaded last
+  db_update('system')
+    ->fields(array('weight' => 1000))
+    ->condition('type', 'module')
+    ->condition('name', drupal_get_profile())
+    ->execute();
+
+  // Cache a fully-built schema.
+  drupal_get_schema(NULL, TRUE);
+
+  // Run cron to populate update status tables (if available) so that users
+  // will be warned if they've installed an out of date Drupal version.
+  // Will also trigger indexing of profile-supplied content or feeds.
+  drupal_cron_run();
+
+  return $output;
+}
+
+/**
+ * Batch callback for batch installation of modules.
+ */
+function _install_module_batch($module, $module_name, &$context) {
+  // Install and enable the module right away, so that the module will be
+  // loaded by drupal_bootstrap in subsequent batch requests, and other
+  // modules possibly depending on it can safely perform their installation
+  // steps.
+  module_enable(array($module), FALSE);
+  $context['results'][] = $module;
+  $context['message'] = st('Installed %module module.', array('%module' => $module_name));
+}
+
+/**
+ * 'Finished' callback for module installation batch.
+ */
+function _install_profile_modules_finished($success, $results, $operations) {
+  // Flush all caches to complete the module installation process. Subsequent
+  // installation tasks will now have full access to the profile's modules.
+  drupal_flush_all_caches();
+}
+
+/**
+ * Checks installation requirements and reports any errors.
+ */
+function install_check_requirements($install_state) {
+  $profile = $install_state['parameters']['profile'];
+
+  // Check the profile requirements.
+  $requirements = drupal_check_profile($profile);
+
+  // If Drupal is not set up already, we need to create a settings file.
+  if (!$install_state['settings_verified']) {
+    $writable = FALSE;
+    $conf_path = './' . conf_path(FALSE, TRUE);
+    $settings_file = $conf_path . '/settings.php';
+    $default_settings_file = './sites/default/default.settings.php';
+    $file = $conf_path;
+    $exists = FALSE;
+    // Verify that the directory exists.
+    if (drupal_verify_install_file($conf_path, FILE_EXIST, 'dir')) {
+      // Check if a settings.php file already exists.
+      $file = $settings_file;
+      if (drupal_verify_install_file($settings_file, FILE_EXIST)) {
+        // If it does, make sure it is writable.
+        $writable = drupal_verify_install_file($settings_file, FILE_READABLE|FILE_WRITABLE);
+        $exists = TRUE;
+      }
+    }
+
+    // If default.settings.php does not exist, or is not readable, throw an
+    // error.
+    if (!drupal_verify_install_file($default_settings_file, FILE_EXIST|FILE_READABLE)) {
+      $requirements['default settings file exists'] = array(
+        'title'       => st('Default settings file'),
+        'value'       => st('The default settings file does not exist.'),
+        'severity'    => REQUIREMENT_ERROR,
+        'description' => st('The @drupal installer requires that the %default-file file not be modified in any way from the original download.', array('@drupal' => drupal_install_profile_distribution_name(), '%default-file' => $default_settings_file)),
+      );
+    }
+    // Otherwise, if settings.php does not exist yet, we can try to copy
+    // default.settings.php to create it.
+    elseif (!$exists) {
+      $copied = drupal_verify_install_file($conf_path, FILE_EXIST|FILE_WRITABLE, 'dir') && @copy($default_settings_file, $settings_file);
+      if ($copied) {
+        // If the new settings file has the same owner as default.settings.php,
+        // this means default.settings.php is owned by the webserver user.
+        // This is an inherent security weakness because it allows a malicious
+        // webserver process to append arbitrary PHP code and then execute it.
+        // However, it is also a common configuration on shared hosting, and
+        // there is nothing Drupal can do to prevent it. In this situation,
+        // having settings.php also owned by the webserver does not introduce
+        // any additional security risk, so we keep the file in place.
+        if (fileowner($default_settings_file) === fileowner($settings_file)) {
+          $writable = drupal_verify_install_file($settings_file, FILE_READABLE|FILE_WRITABLE);
+          $exists = TRUE;
+        }
+        // If settings.php and default.settings.php have different owners, this
+        // probably means the server is set up "securely" (with the webserver
+        // running as its own user, distinct from the user who owns all the
+        // Drupal PHP files), although with either a group or world writable
+        // sites directory. Keeping settings.php owned by the webserver would
+        // therefore introduce a security risk. It would also cause a usability
+        // problem, since site owners who do not have root access to the file
+        // system would be unable to edit their settings file later on. We
+        // therefore must delete the file we just created and force the
+        // administrator to log on to the server and create it manually.
+        else {
+          $deleted = @drupal_unlink($settings_file);
+          // We expect deleting the file to be successful (since we just
+          // created it ourselves above), but if it fails somehow, we set a
+          // variable so we can display a one-time error message to the
+          // administrator at the bottom of the requirements list. We also try
+          // to make the file writable, to eliminate any conflicting error
+          // messages in the requirements list.
+          $exists = !$deleted;
+          if ($exists) {
+            $settings_file_ownership_error = TRUE;
+            $writable = drupal_verify_install_file($settings_file, FILE_READABLE|FILE_WRITABLE);
+          }
+        }
+      }
+    }
+
+    // If settings.php does not exist, throw an error.
+    if (!$exists) {
+      $requirements['settings file exists'] = array(
+        'title'       => st('Settings file'),
+        'value'       => st('The settings file does not exist.'),
+        'severity'    => REQUIREMENT_ERROR,
+        'description' => st('The @drupal installer requires that you create a settings file as part of the installation process. Copy the %default_file file to %file. More details about installing Drupal are available in <a href="@install_txt">INSTALL.txt</a>.', array('@drupal' => drupal_install_profile_distribution_name(), '%file' => $file, '%default_file' => $default_settings_file, '@install_txt' => base_path() . 'INSTALL.txt')),
+      );
+    }
+    else {
+      $requirements['settings file exists'] = array(
+        'title'       => st('Settings file'),
+        'value'       => st('The %file file exists.', array('%file' => $file)),
+      );
+      // If settings.php is not writable, throw an error.
+      if (!$writable) {
+        $requirements['settings file writable'] = array(
+          'title'       => st('Settings file'),
+          'value'       => st('The settings file is not writable.'),
+          'severity'    => REQUIREMENT_ERROR,
+          'description' => st('The @drupal installer requires write permissions to %file during the installation process. If you are unsure how to grant file permissions, consult the <a href="@handbook_url">online handbook</a>.', array('@drupal' => drupal_install_profile_distribution_name(), '%file' => $file, '@handbook_url' => 'http://drupal.org/server-permissions')),
+        );
+      }
+      else {
+        $requirements['settings file'] = array(
+          'title'       => st('Settings file'),
+          'value'       => st('The settings file is writable.'),
+        );
+      }
+      if (!empty($settings_file_ownership_error)) {
+        $requirements['settings file ownership'] = array(
+          'title'       => st('Settings file'),
+          'value'       => st('The settings file is owned by the web server.'),
+          'severity'    => REQUIREMENT_ERROR,
+          'description' => st('The @drupal installer failed to create a settings file with proper file ownership. Log on to your web server, remove the existing %file file, and create a new one by copying the %default_file file to %file. More details about installing Drupal are available in <a href="@install_txt">INSTALL.txt</a>. If you have problems with the file permissions on your server, consult the <a href="@handbook_url">online handbook</a>.', array('@drupal' => drupal_install_profile_distribution_name(), '%file' => $file, '%default_file' => $default_settings_file, '@install_txt' => base_path() . 'INSTALL.txt', '@handbook_url' => 'http://drupal.org/server-permissions')),
+        );
+      }
+    }
+  }
+  return $requirements;
+}
+
+/**
+ * Form constructor for a site configuration form.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ *
+ * @see install_configure_form()
+ * @see install_configure_form_validate()
+ * @see install_configure_form_submit()
+ * @ingroup forms
+ */
+function _install_configure_form($form, &$form_state, &$install_state) {
+  include_once DRUPAL_ROOT . '/includes/locale.inc';
+
+  $form['site_information'] = array(
+    '#type' => 'fieldset',
+    '#title' => st('Site information'),
+    '#collapsible' => FALSE,
+  );
+  $form['site_information']['site_name'] = array(
+    '#type' => 'textfield',
+    '#title' => st('Site name'),
+    '#required' => TRUE,
+    '#weight' => -20,
+  );
+  $form['site_information']['site_mail'] = array(
+    '#type' => 'textfield',
+    '#title' => st('Site e-mail address'),
+    '#default_value' => ini_get('sendmail_from'),
+    '#description' => st("Automated e-mails, such as registration information, will be sent from this address. Use an address ending in your site's domain to help prevent these e-mails from being flagged as spam."),
+    '#required' => TRUE,
+    '#weight' => -15,
+  );
+  $form['admin_account'] = array(
+    '#type' => 'fieldset',
+    '#title' => st('Site maintenance account'),
+    '#collapsible' => FALSE,
+  );
+
+  $form['admin_account']['account']['#tree'] = TRUE;
+  $form['admin_account']['account']['name'] = array('#type' => 'textfield',
+    '#title' => st('Username'),
+    '#maxlength' => USERNAME_MAX_LENGTH,
+    '#description' => st('Spaces are allowed; punctuation is not allowed except for periods, hyphens, and underscores.'),
+    '#required' => TRUE,
+    '#weight' => -10,
+    '#attributes' => array('class' => array('username')),
+  );
+
+  $form['admin_account']['account']['mail'] = array('#type' => 'textfield',
+    '#title' => st('E-mail address'),
+    '#maxlength' => EMAIL_MAX_LENGTH,
+    '#required' => TRUE,
+    '#weight' => -5,
+  );
+  $form['admin_account']['account']['pass'] = array(
+    '#type' => 'password_confirm',
+    '#required' => TRUE,
+    '#size' => 25,
+    '#weight' => 0,
+  );
+
+  $form['server_settings'] = array(
+    '#type' => 'fieldset',
+    '#title' => st('Server settings'),
+    '#collapsible' => FALSE,
+  );
+
+  $countries = country_get_list();
+  $form['server_settings']['site_default_country'] = array(
+    '#type' => 'select',
+    '#title' => st('Default country'),
+    '#empty_value' => '',
+    '#default_value' => variable_get('site_default_country', NULL),
+    '#options' => $countries,
+    '#description' => st('Select the default country for the site.'),
+    '#weight' => 0,
+  );
+
+  $form['server_settings']['date_default_timezone'] = array(
+    '#type' => 'select',
+    '#title' => st('Default time zone'),
+    '#default_value' => date_default_timezone_get(),
+    '#options' => system_time_zones(),
+    '#description' => st('By default, dates in this site will be displayed in the chosen time zone.'),
+    '#weight' => 5,
+    '#attributes' => array('class' => array('timezone-detect')),
+  );
+
+  $form['server_settings']['clean_url'] = array(
+    '#type' => 'hidden',
+    '#default_value' => 0,
+    '#attributes' => array('id' => 'edit-clean-url', 'class' => array('install')),
+  );
+
+  $form['update_notifications'] = array(
+    '#type' => 'fieldset',
+    '#title' => st('Update notifications'),
+    '#collapsible' => FALSE,
+  );
+  $form['update_notifications']['update_status_module'] = array(
+    '#type' => 'checkboxes',
+    '#options' => array(
+      1 => st('Check for updates automatically'),
+      2 => st('Receive e-mail notifications'),
+    ),
+    '#default_value' => array(1, 2),
+    '#description' => st('The system will notify you when updates and important security releases are available for installed components. Anonymous information about your site is sent to <a href="@drupal">Drupal.org</a>.', array('@drupal' => 'http://drupal.org')),
+    '#weight' => 15,
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => st('Save and continue'),
+    '#weight' => 15,
+  );
+
+  return $form;
+}
+
+/**
+ * Form validation handler for install_configure_form().
+ *
+ * @see install_configure_form_submit()
+ */
+function install_configure_form_validate($form, &$form_state) {
+  if ($error = user_validate_name($form_state['values']['account']['name'])) {
+    form_error($form['admin_account']['account']['name'], $error);
+  }
+  if ($error = user_validate_mail($form_state['values']['account']['mail'])) {
+    form_error($form['admin_account']['account']['mail'], $error);
+  }
+  if ($error = user_validate_mail($form_state['values']['site_mail'])) {
+    form_error($form['site_information']['site_mail'], $error);
+  }
+}
+
+/**
+ * Form submission handler for install_configure_form().
+ *
+ * @see install_configure_form_validate()
+ */
+function install_configure_form_submit($form, &$form_state) {
+  global $user;
+
+  variable_set('site_name', $form_state['values']['site_name']);
+  variable_set('site_mail', $form_state['values']['site_mail']);
+  variable_set('date_default_timezone', $form_state['values']['date_default_timezone']);
+  variable_set('site_default_country', $form_state['values']['site_default_country']);
+
+  // Enable update.module if this option was selected.
+  if ($form_state['values']['update_status_module'][1]) {
+    module_enable(array('update'), FALSE);
+
+    // Add the site maintenance account's email address to the list of
+    // addresses to be notified when updates are available, if selected.
+    if ($form_state['values']['update_status_module'][2]) {
+      variable_set('update_notify_emails', array($form_state['values']['account']['mail']));
+    }
+  }
+
+  // We precreated user 1 with placeholder values. Let's save the real values.
+  $account = user_load(1);
+  $merge_data = array('init' => $form_state['values']['account']['mail'], 'roles' => !empty($account->roles) ? $account->roles : array(), 'status' => 1, 'timezone' => $form_state['values']['date_default_timezone']);
+  user_save($account, array_merge($form_state['values']['account'], $merge_data));
+  // Load global $user and perform final login tasks.
+  $user = user_load(1);
+  user_login_finalize();
+
+  if (isset($form_state['values']['clean_url'])) {
+    variable_set('clean_url', $form_state['values']['clean_url']);
+  }
+
+  // Record when this install ran.
+  variable_set('install_time', $_SERVER['REQUEST_TIME']);
+}
diff --git a/htmltest/includes/install.inc b/htmltest/includes/install.inc
new file mode 100644
index 00000000..71de3e6c
--- /dev/null
+++ b/htmltest/includes/install.inc
@@ -0,0 +1,1332 @@
+<?php
+
+/**
+* @file
+* API functions for installing modules and themes.
+*/
+
+/**
+ * Indicates that a module has not been installed yet.
+ */
+define('SCHEMA_UNINSTALLED', -1);
+
+/**
+ * Indicates that a module has been installed.
+ */
+define('SCHEMA_INSTALLED', 0);
+
+/**
+ * Requirement severity -- Informational message only.
+ */
+define('REQUIREMENT_INFO', -1);
+
+/**
+ * Requirement severity -- Requirement successfully met.
+ */
+define('REQUIREMENT_OK', 0);
+
+/**
+ * Requirement severity -- Warning condition; proceed but flag warning.
+ */
+define('REQUIREMENT_WARNING', 1);
+
+/**
+ * Requirement severity -- Error condition; abort installation.
+ */
+define('REQUIREMENT_ERROR', 2);
+
+/**
+ * File permission check -- File exists.
+ */
+define('FILE_EXIST', 1);
+
+/**
+ * File permission check -- File is readable.
+ */
+define('FILE_READABLE', 2);
+
+/**
+ * File permission check -- File is writable.
+ */
+define('FILE_WRITABLE', 4);
+
+/**
+ * File permission check -- File is executable.
+ */
+define('FILE_EXECUTABLE', 8);
+
+/**
+ * File permission check -- File does not exist.
+ */
+define('FILE_NOT_EXIST', 16);
+
+/**
+ * File permission check -- File is not readable.
+ */
+define('FILE_NOT_READABLE', 32);
+
+/**
+ * File permission check -- File is not writable.
+ */
+define('FILE_NOT_WRITABLE', 64);
+
+/**
+ * File permission check -- File is not executable.
+ */
+define('FILE_NOT_EXECUTABLE', 128);
+
+/**
+ * Loads .install files for installed modules to initialize the update system.
+ */
+function drupal_load_updates() {
+  foreach (drupal_get_installed_schema_version(NULL, FALSE, TRUE) as $module => $schema_version) {
+    if ($schema_version > -1) {
+      module_load_install($module);
+    }
+  }
+}
+
+/**
+ * Returns an array of available schema versions for a module.
+ *
+ * @param $module
+ *   A module name.
+ * @return
+ *   If the module has updates, an array of available updates sorted by version.
+ *   Otherwise, FALSE.
+ */
+function drupal_get_schema_versions($module) {
+  $updates = &drupal_static(__FUNCTION__, NULL);
+  if (!isset($updates[$module])) {
+    $updates = array();
+
+    foreach (module_list() as $loaded_module) {
+      $updates[$loaded_module] = array();
+    }
+
+    // Prepare regular expression to match all possible defined hook_update_N().
+    $regexp = '/^(?P<module>.+)_update_(?P<version>\d+)$/';
+    $functions = get_defined_functions();
+    // Narrow this down to functions ending with an integer, since all
+    // hook_update_N() functions end this way, and there are other
+    // possible functions which match '_update_'. We use preg_grep() here
+    // instead of foreaching through all defined functions, since the loop
+    // through all PHP functions can take significant page execution time
+    // and this function is called on every administrative page via
+    // system_requirements().
+    foreach (preg_grep('/_\d+$/', $functions['user']) as $function) {
+      // If this function is a module update function, add it to the list of
+      // module updates.
+      if (preg_match($regexp, $function, $matches)) {
+        $updates[$matches['module']][] = $matches['version'];
+      }
+    }
+    // Ensure that updates are applied in numerical order.
+    foreach ($updates as &$module_updates) {
+      sort($module_updates, SORT_NUMERIC);
+    }
+  }
+  return empty($updates[$module]) ? FALSE : $updates[$module];
+}
+
+/**
+ * Returns the currently installed schema version for a module.
+ *
+ * @param $module
+ *   A module name.
+ * @param $reset
+ *   Set to TRUE after modifying the system table.
+ * @param $array
+ *   Set to TRUE if you want to get information about all modules in the
+ *   system.
+ * @return
+ *   The currently installed schema version, or SCHEMA_UNINSTALLED if the
+ *   module is not installed.
+ */
+function drupal_get_installed_schema_version($module, $reset = FALSE, $array = FALSE) {
+  static $versions = array();
+
+  if ($reset) {
+    $versions = array();
+  }
+
+  if (!$versions) {
+    $versions = array();
+    $result = db_query("SELECT name, schema_version FROM {system} WHERE type = :type", array(':type' => 'module'));
+    foreach ($result as $row) {
+      $versions[$row->name] = $row->schema_version;
+    }
+  }
+
+  if ($array) {
+    return $versions;
+  }
+  else {
+    return isset($versions[$module]) ? $versions[$module] : SCHEMA_UNINSTALLED;
+  }
+}
+
+/**
+ * Update the installed version information for a module.
+ *
+ * @param $module
+ *   A module name.
+ * @param $version
+ *   The new schema version.
+ */
+function drupal_set_installed_schema_version($module, $version) {
+  db_update('system')
+    ->fields(array('schema_version' => $version))
+    ->condition('name', $module)
+    ->execute();
+
+  // Reset the static cache of module schema versions.
+  drupal_get_installed_schema_version(NULL, TRUE);
+}
+
+/**
+ * Loads the installation profile, extracting its defined distribution name.
+ *
+ * @return
+ *   The distribution name defined in the profile's .info file. Defaults to
+ *   "Drupal" if none is explicitly provided by the installation profile.
+ *
+ * @see install_profile_info()
+ */
+function drupal_install_profile_distribution_name() {
+  // During installation, the profile information is stored in the global
+  // installation state (it might not be saved anywhere yet).
+  if (drupal_installation_attempted()) {
+    global $install_state;
+    return $install_state['profile_info']['distribution_name'];
+  }
+  // At all other times, we load the profile via standard methods.
+  else {
+    $profile = drupal_get_profile();
+    $info = system_get_info('module', $profile);
+    return $info['distribution_name'];
+  }
+}
+
+/**
+ * Detects the base URL using the PHP $_SERVER variables.
+ *
+ * @param $file
+ *   The name of the file calling this function so we can strip it out of
+ *   the URI when generating the base_url.
+ *
+ * @return
+ *   The auto-detected $base_url that should be configured in settings.php
+ */
+function drupal_detect_baseurl($file = 'install.php') {
+  $proto = $_SERVER['HTTPS'] ? 'https://' : 'http://';
+  $host = $_SERVER['SERVER_NAME'];
+  $port = ($_SERVER['SERVER_PORT'] == 80 ? '' : ':' . $_SERVER['SERVER_PORT']);
+  $uri = preg_replace("/\?.*/", '', $_SERVER['REQUEST_URI']);
+  $dir = str_replace("/$file", '', $uri);
+
+  return "$proto$host$port$dir";
+}
+
+/**
+ * Detects all supported databases that are compiled into PHP.
+ *
+ * @return
+ *  An array of database types compiled into PHP.
+ */
+function drupal_detect_database_types() {
+  $databases = drupal_get_database_types();
+
+  foreach ($databases as $driver => $installer) {
+    $databases[$driver] = $installer->name();
+  }
+
+  return $databases;
+}
+
+/**
+ * Returns all supported database installer objects that are compiled into PHP.
+ *
+ * @return
+ *  An array of database installer objects compiled into PHP.
+ */
+function drupal_get_database_types() {
+  $databases = array();
+
+  // We define a driver as a directory in /includes/database that in turn
+  // contains a database.inc file. That allows us to drop in additional drivers
+  // without modifying the installer.
+  // Because we have no registry yet, we need to also include the install.inc
+  // file for the driver explicitly.
+  require_once DRUPAL_ROOT . '/includes/database/database.inc';
+  foreach (file_scan_directory(DRUPAL_ROOT . '/includes/database', '/^[a-z]*$/i', array('recurse' => FALSE)) as $file) {
+    if (file_exists($file->uri . '/database.inc') && file_exists($file->uri . '/install.inc')) {
+      $drivers[$file->filename] = $file->uri;
+    }
+  }
+
+  foreach ($drivers as $driver => $file) {
+    $installer = db_installer_object($driver);
+    if ($installer->installable()) {
+      $databases[$driver] = $installer;
+    }
+  }
+
+  // Usability: unconditionally put the MySQL driver on top.
+  if (isset($databases['mysql'])) {
+    $mysql_database = $databases['mysql'];
+    unset($databases['mysql']);
+    $databases = array('mysql' => $mysql_database) + $databases;
+  }
+
+  return $databases;
+}
+
+/**
+ * Database installer structure.
+ *
+ * Defines basic Drupal requirements for databases.
+ */
+abstract class DatabaseTasks {
+
+  /**
+   * Structure that describes each task to run.
+   *
+   * @var array
+   *
+   * Each value of the tasks array is an associative array defining the function
+   * to call (optional) and any arguments to be passed to the function.
+   */
+  protected $tasks = array(
+    array(
+      'function'    => 'checkEngineVersion',
+      'arguments'   => array(),
+    ),
+    array(
+      'arguments'   => array(
+        'CREATE TABLE {drupal_install_test} (id int NULL)',
+        'Drupal can use CREATE TABLE database commands.',
+        'Failed to <strong>CREATE</strong> a test table on your database server with the command %query. The server reports the following message: %error.<p>Are you sure the configured username has the necessary permissions to create tables in the database?</p>',
+        TRUE,
+      ),
+    ),
+    array(
+      'arguments'   => array(
+        'INSERT INTO {drupal_install_test} (id) VALUES (1)',
+        'Drupal can use INSERT database commands.',
+        'Failed to <strong>INSERT</strong> a value into a test table on your database server. We tried inserting a value with the command %query and the server reported the following error: %error.',
+      ),
+    ),
+    array(
+      'arguments'   => array(
+        'UPDATE {drupal_install_test} SET id = 2',
+        'Drupal can use UPDATE database commands.',
+        'Failed to <strong>UPDATE</strong> a value in a test table on your database server. We tried updating a value with the command %query and the server reported the following error: %error.',
+      ),
+    ),
+    array(
+      'arguments'   => array(
+        'DELETE FROM {drupal_install_test}',
+        'Drupal can use DELETE database commands.',
+        'Failed to <strong>DELETE</strong> a value from a test table on your database server. We tried deleting a value with the command %query and the server reported the following error: %error.',
+      ),
+    ),
+    array(
+      'arguments'   => array(
+        'DROP TABLE {drupal_install_test}',
+        'Drupal can use DROP TABLE database commands.',
+        'Failed to <strong>DROP</strong> a test table from your database server. We tried dropping a table with the command %query and the server reported the following error %error.',
+      ),
+    ),
+  );
+
+  /**
+   * Results from tasks.
+   *
+   * @var array
+   */
+  protected $results = array();
+
+  /**
+   * Ensure the PDO driver is supported by the version of PHP in use.
+   */
+  protected function hasPdoDriver() {
+    return in_array($this->pdoDriver, PDO::getAvailableDrivers());
+  }
+
+  /**
+   * Assert test as failed.
+   */
+  protected function fail($message) {
+    $this->results[$message] = FALSE;
+  }
+
+  /**
+   * Assert test as a pass.
+   */
+  protected function pass($message) {
+    $this->results[$message] = TRUE;
+  }
+
+  /**
+   * Check whether Drupal is installable on the database.
+   */
+  public function installable() {
+    return $this->hasPdoDriver() && empty($this->error);
+  }
+
+  /**
+   * Return the human-readable name of the driver.
+   */
+  abstract public function name();
+
+  /**
+   * Return the minimum required version of the engine.
+   *
+   * @return
+   *   A version string. If not NULL, it will be checked against the version
+   *   reported by the Database engine using version_compare().
+   */
+  public function minimumVersion() {
+    return NULL;
+  }
+
+  /**
+   * Run database tasks and tests to see if Drupal can run on the database.
+   */
+  public function runTasks() {
+    // We need to establish a connection before we can run tests.
+    if ($this->connect()) {
+      foreach ($this->tasks as $task) {
+        if (!isset($task['function'])) {
+          $task['function'] = 'runTestQuery';
+        }
+        if (method_exists($this, $task['function'])) {
+          // Returning false is fatal. No other tasks can run.
+          if (FALSE === call_user_func_array(array($this, $task['function']), $task['arguments'])) {
+            break;
+          }
+        }
+        else {
+          throw new DatabaseTaskException(st("Failed to run all tasks against the database server. The task %task wasn't found.", array('%task' => $task['function'])));
+        }
+      }
+    }
+    // Check for failed results and compile message
+    $message = '';
+    foreach ($this->results as $result => $success) {
+      if (!$success) {
+        $message .= '<p class="error">' . $result  . '</p>';
+      }
+    }
+    if (!empty($message)) {
+      $message = '<p>In order for Drupal to work, and to continue with the installation process, you must resolve all issues reported below. For more help with configuring your database server, see the <a href="http://drupal.org/getting-started/install">installation handbook</a>. If you are unsure what any of this means you should probably contact your hosting provider.</p>' . $message;
+      throw new DatabaseTaskException($message);
+    }
+  }
+
+  /**
+   * Check if we can connect to the database.
+   */
+  protected function connect() {
+    try {
+      // This doesn't actually test the connection.
+      db_set_active();
+      // Now actually do a check.
+      Database::getConnection();
+      $this->pass('Drupal can CONNECT to the database ok.');
+    }
+    catch (Exception $e) {
+      $this->fail(st('Failed to connect to your database server. The server reports the following message: %error.<ul><li>Is the database server running?</li><li>Does the database exist, and have you entered the correct database name?</li><li>Have you entered the correct username and password?</li><li>Have you entered the correct database hostname?</li></ul>', array('%error' => $e->getMessage())));
+      return FALSE;
+    }
+    return TRUE;
+  }
+
+  /**
+   * Run SQL tests to ensure the database can execute commands with the current user.
+   */
+  protected function runTestQuery($query, $pass, $fail, $fatal = FALSE) {
+    try {
+      db_query($query);
+      $this->pass(st($pass));
+    }
+    catch (Exception $e) {
+      $this->fail(st($fail, array('%query' => $query, '%error' => $e->getMessage(), '%name' => $this->name())));
+      return !$fatal;
+    }
+  }
+
+  /**
+   * Check the engine version.
+   */
+  protected function checkEngineVersion() {
+    if ($this->minimumVersion() && version_compare(Database::getConnection()->version(), $this->minimumVersion(), '<')) {
+      $this->fail(st("The database version %version is less than the minimum required version %minimum_version.", array('%version' => Database::getConnection()->version(), '%minimum_version' => $this->minimumVersion())));
+    }
+  }
+
+  /**
+   * Return driver specific configuration options.
+   *
+   * @param $database
+   *  An array of driver specific configuration options.
+   *
+   * @return
+   *   The options form array.
+   */
+  public function getFormOptions($database) {
+    $form['database'] = array(
+      '#type' => 'textfield',
+      '#title' => st('Database name'),
+      '#default_value' => empty($database['database']) ? '' : $database['database'],
+      '#size' => 45,
+      '#required' => TRUE,
+      '#description' => st('The name of the database your @drupal data will be stored in. It must exist on your server before @drupal can be installed.', array('@drupal' => drupal_install_profile_distribution_name())),
+    );
+
+    $form['username'] = array(
+      '#type' => 'textfield',
+      '#title' => st('Database username'),
+      '#default_value' => empty($database['username']) ? '' : $database['username'],
+      '#required' => TRUE,
+      '#size' => 45,
+    );
+
+    $form['password'] = array(
+      '#type' => 'password',
+      '#title' => st('Database password'),
+      '#default_value' => empty($database['password']) ? '' : $database['password'],
+      '#required' => FALSE,
+      '#size' => 45,
+    );
+
+    $form['advanced_options'] = array(
+      '#type' => 'fieldset',
+      '#title' => st('Advanced options'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+      '#description' => st("These options are only necessary for some sites. If you're not sure what you should enter here, leave the default settings or check with your hosting provider."),
+      '#weight' => 10,
+    );
+
+    $profile = drupal_get_profile();
+    $db_prefix = ($profile == 'standard') ? 'drupal_' : $profile . '_';
+    $form['advanced_options']['db_prefix'] = array(
+      '#type' => 'textfield',
+      '#title' => st('Table prefix'),
+      '#default_value' => '',
+      '#size' => 45,
+      '#description' => st('If more than one application will be sharing this database, enter a table prefix such as %prefix for your @drupal site here.', array('@drupal' => drupal_install_profile_distribution_name(), '%prefix' => $db_prefix)),
+      '#weight' => 10,
+    );
+
+    $form['advanced_options']['host'] = array(
+      '#type' => 'textfield',
+      '#title' => st('Database host'),
+      '#default_value' => empty($database['host']) ? 'localhost' : $database['host'],
+      '#size' => 45,
+      // Hostnames can be 255 characters long.
+      '#maxlength' => 255,
+      '#required' => TRUE,
+      '#description' => st('If your database is located on a different server, change this.'),
+    );
+
+    $form['advanced_options']['port'] = array(
+      '#type' => 'textfield',
+      '#title' => st('Database port'),
+      '#default_value' => empty($database['port']) ? '' : $database['port'],
+      '#size' => 45,
+      // The maximum port number is 65536, 5 digits.
+      '#maxlength' => 5,
+      '#description' => st('If your database server is listening to a non-standard port, enter its number.'),
+    );
+
+    return $form;
+  }
+
+  /**
+   * Validates driver specific configuration settings.
+   *
+   * Checks to ensure correct basic database settings and that a proper
+   * connection to the database can be established.
+   *
+   * @param $database
+   *   An array of driver specific configuration options.
+   *
+   * @return
+   *   An array of driver configuration errors, keyed by form element name.
+   */
+  public function validateDatabaseSettings($database) {
+    $errors = array();
+
+    // Verify the table prefix.
+    if (!empty($database['prefix']) && is_string($database['prefix']) && !preg_match('/^[A-Za-z0-9_.]+$/', $database['prefix'])) {
+      $errors[$database['driver'] . '][advanced_options][db_prefix'] = st('The database table prefix you have entered, %prefix, is invalid. The table prefix can only contain alphanumeric characters, periods, or underscores.', array('%prefix' => $database['prefix']));
+    }
+
+    // Verify the database port.
+    if (!empty($database['port']) && !is_numeric($database['port'])) {
+      $errors[$database['driver'] . '][advanced_options][port'] =  st('Database port must be a number.');
+    }
+
+    return $errors;
+  }
+
+}
+
+/**
+ * Exception thrown if the database installer fails.
+ */
+class DatabaseTaskException extends Exception {
+}
+
+/**
+ * Replaces values in settings.php with values in the submitted array.
+ *
+ * @param $settings
+ *   An array of settings that need to be updated.
+ */
+function drupal_rewrite_settings($settings = array(), $prefix = '') {
+  $default_settings = 'sites/default/default.settings.php';
+  drupal_static_reset('conf_path');
+  $settings_file = conf_path(FALSE) . '/' . $prefix . 'settings.php';
+
+  // Build list of setting names and insert the values into the global namespace.
+  $keys = array();
+  foreach ($settings as $setting => $data) {
+    $GLOBALS[$setting] = $data['value'];
+    $keys[] = $setting;
+  }
+
+  $buffer = NULL;
+  $first = TRUE;
+  if ($fp = fopen(DRUPAL_ROOT . '/' . $default_settings, 'r')) {
+    // Step line by line through settings.php.
+    while (!feof($fp)) {
+      $line = fgets($fp);
+      if ($first && substr($line, 0, 5) != '<?php') {
+        $buffer = "<?php\n\n";
+      }
+      $first = FALSE;
+      // Check for constants.
+      if (substr($line, 0, 7) == 'define(') {
+        preg_match('/define\(\s*[\'"]([A-Z_-]+)[\'"]\s*,(.*?)\);/', $line, $variable);
+        if (in_array($variable[1], $keys)) {
+          $setting = $settings[$variable[1]];
+          $buffer .= str_replace($variable[2], " '" . $setting['value'] . "'", $line);
+          unset($settings[$variable[1]]);
+          unset($settings[$variable[2]]);
+        }
+        else {
+          $buffer .= $line;
+        }
+      }
+      // Check for variables.
+      elseif (substr($line, 0, 1) == '$') {
+        preg_match('/\$([^ ]*) /', $line, $variable);
+        if (in_array($variable[1], $keys)) {
+          // Write new value to settings.php in the following format:
+          //    $'setting' = 'value'; // 'comment'
+          $setting = $settings[$variable[1]];
+          $buffer .= '$' . $variable[1] . " = " . var_export($setting['value'], TRUE) . ";" . (!empty($setting['comment']) ? ' // ' . $setting['comment'] . "\n" : "\n");
+          unset($settings[$variable[1]]);
+        }
+        else {
+          $buffer .= $line;
+        }
+      }
+      else {
+        $buffer .= $line;
+      }
+    }
+    fclose($fp);
+
+    // Add required settings that were missing from settings.php.
+    foreach ($settings as $setting => $data) {
+      if ($data['required']) {
+        $buffer .= "\$$setting = " . var_export($data['value'], TRUE) . ";\n";
+      }
+    }
+
+    $fp = fopen(DRUPAL_ROOT . '/' . $settings_file, 'w');
+    if ($fp && fwrite($fp, $buffer) === FALSE) {
+      throw new Exception(st('Failed to modify %settings. Verify the file permissions.', array('%settings' => $settings_file)));
+    }
+  }
+  else {
+    throw new Exception(st('Failed to open %settings. Verify the file permissions.', array('%settings' => $default_settings)));
+  }
+}
+
+/**
+ * Verifies an installation profile for installation.
+ *
+ * @param $install_state
+ *   An array of information about the current installation state.
+ *
+ * @return
+ *   The list of modules to install.
+ */
+function drupal_verify_profile($install_state) {
+  $profile = $install_state['parameters']['profile'];
+  $locale = $install_state['parameters']['locale'];
+
+  include_once DRUPAL_ROOT . '/includes/file.inc';
+  include_once DRUPAL_ROOT . '/includes/common.inc';
+
+  $profile_file = DRUPAL_ROOT . "/profiles/$profile/$profile.profile";
+
+  if (!isset($profile) || !file_exists($profile_file)) {
+    throw new Exception(install_no_profile_error());
+  }
+  $info = $install_state['profile_info'];
+
+  // Get a list of modules that exist in Drupal's assorted subdirectories.
+  $present_modules = array();
+  foreach (drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.module$/', 'modules', 'name', 0) as $present_module) {
+    $present_modules[] = $present_module->name;
+  }
+
+  // The installation profile is also a module, which needs to be installed
+  // after all the other dependencies have been installed.
+  $present_modules[] = drupal_get_profile();
+
+  // Verify that all of the profile's required modules are present.
+  $missing_modules = array_diff($info['dependencies'], $present_modules);
+
+  $requirements = array();
+
+  if (count($missing_modules)) {
+    $modules = array();
+    foreach ($missing_modules as $module) {
+      $modules[] = '<span class="admin-missing">' . drupal_ucfirst($module) . '</span>';
+    }
+    $requirements['required_modules'] = array(
+      'title'       => st('Required modules'),
+      'value'       => st('Required modules not found.'),
+      'severity'    => REQUIREMENT_ERROR,
+      'description' => st('The following modules are required but were not found. Move them into the appropriate modules subdirectory, such as <em>sites/all/modules</em>. Missing modules: !modules', array('!modules' => implode(', ', $modules))),
+    );
+  }
+  return $requirements;
+}
+
+/**
+ * Installs the system module.
+ *
+ * Separated from the installation of other modules so core system
+ * functions can be made available while other modules are installed.
+ */
+function drupal_install_system() {
+  $system_path = drupal_get_path('module', 'system');
+  require_once DRUPAL_ROOT . '/' . $system_path . '/system.install';
+  module_invoke('system', 'install');
+
+  $system_versions = drupal_get_schema_versions('system');
+  $system_version = $system_versions ? max($system_versions) : SCHEMA_INSTALLED;
+  db_insert('system')
+    ->fields(array('filename', 'name', 'type', 'owner', 'status', 'schema_version', 'bootstrap'))
+    ->values(array(
+        'filename' => $system_path . '/system.module',
+        'name' => 'system',
+        'type' => 'module',
+        'owner' => '',
+        'status' => 1,
+        'schema_version' => $system_version,
+        'bootstrap' => 0,
+      ))
+    ->execute();
+  system_rebuild_module_data();
+}
+
+/**
+ * Uninstalls a given list of disabled modules.
+ *
+ * @param array $module_list
+ *   The modules to uninstall. It is the caller's responsibility to ensure that
+ *   all modules in this list have already been disabled before this function
+ *   is called.
+ * @param bool $uninstall_dependents
+ *   (optional) If TRUE, the function will check that all modules which depend
+ *   on the passed-in module list either are already uninstalled or contained in
+ *   the list, and it will ensure that the modules are uninstalled in the
+ *   correct order. This incurs a significant performance cost, so use FALSE if
+ *   you know $module_list is already complete and in the correct order.
+ *   Defaults to TRUE.
+ *
+ * @return bool
+ *   Returns TRUE if the operation succeeds or FALSE if it aborts due to an
+ *   unsafe condition, namely, $uninstall_dependents is TRUE and a module in
+ *   $module_list has dependents which are not already uninstalled and not also
+ *   included in $module_list).
+ *
+ * @see module_disable()
+ */
+function drupal_uninstall_modules($module_list = array(), $uninstall_dependents = TRUE) {
+  if ($uninstall_dependents) {
+    // Get all module data so we can find dependents and sort.
+    $module_data = system_rebuild_module_data();
+    // Create an associative array with weights as values.
+    $module_list = array_flip(array_values($module_list));
+
+    $profile = drupal_get_profile();
+    while (list($module) = each($module_list)) {
+      if (!isset($module_data[$module]) || drupal_get_installed_schema_version($module) == SCHEMA_UNINSTALLED) {
+        // This module doesn't exist or is already uninstalled. Skip it.
+        unset($module_list[$module]);
+        continue;
+      }
+      $module_list[$module] = $module_data[$module]->sort;
+
+      // If the module has any dependents which are not already uninstalled and
+      // not included in the passed-in list, abort. It is not safe to uninstall
+      // them automatically because uninstalling a module is a destructive
+      // operation.
+      foreach (array_keys($module_data[$module]->required_by) as $dependent) {
+        if (!isset($module_list[$dependent]) && drupal_get_installed_schema_version($dependent) != SCHEMA_UNINSTALLED && $dependent != $profile) {
+          return FALSE;
+        }
+      }
+    }
+
+    // Sort the module list by pre-calculated weights.
+    asort($module_list);
+    $module_list = array_keys($module_list);
+  }
+
+  foreach ($module_list as $module) {
+    // Uninstall the module.
+    module_load_install($module);
+    module_invoke($module, 'uninstall');
+    drupal_uninstall_schema($module);
+
+    watchdog('system', '%module module uninstalled.', array('%module' => $module), WATCHDOG_INFO);
+    drupal_set_installed_schema_version($module, SCHEMA_UNINSTALLED);
+  }
+
+  if (!empty($module_list)) {
+    // Let other modules react.
+    module_invoke_all('modules_uninstalled', $module_list);
+  }
+
+  return TRUE;
+}
+
+/**
+ * Verifies the state of the specified file.
+ *
+ * @param $file
+ *   The file to check for.
+ * @param $mask
+ *   An optional bitmask created from various FILE_* constants.
+ * @param $type
+ *   The type of file. Can be file (default), dir, or link.
+ *
+ * @return
+ *   TRUE on success or FALSE on failure. A message is set for the latter.
+ */
+function drupal_verify_install_file($file, $mask = NULL, $type = 'file') {
+  $return = TRUE;
+  // Check for files that shouldn't be there.
+  if (isset($mask) && ($mask & FILE_NOT_EXIST) && file_exists($file)) {
+    return FALSE;
+  }
+  // Verify that the file is the type of file it is supposed to be.
+  if (isset($type) && file_exists($file)) {
+    $check = 'is_' . $type;
+    if (!function_exists($check) || !$check($file)) {
+      $return = FALSE;
+    }
+  }
+
+  // Verify file permissions.
+  if (isset($mask)) {
+    $masks = array(FILE_EXIST, FILE_READABLE, FILE_WRITABLE, FILE_EXECUTABLE, FILE_NOT_READABLE, FILE_NOT_WRITABLE, FILE_NOT_EXECUTABLE);
+    foreach ($masks as $current_mask) {
+      if ($mask & $current_mask) {
+        switch ($current_mask) {
+          case FILE_EXIST:
+            if (!file_exists($file)) {
+              if ($type == 'dir') {
+                drupal_install_mkdir($file, $mask);
+              }
+              if (!file_exists($file)) {
+                $return = FALSE;
+              }
+            }
+            break;
+          case FILE_READABLE:
+            if (!is_readable($file) && !drupal_install_fix_file($file, $mask)) {
+              $return = FALSE;
+            }
+            break;
+          case FILE_WRITABLE:
+            if (!is_writable($file) && !drupal_install_fix_file($file, $mask)) {
+              $return = FALSE;
+            }
+            break;
+          case FILE_EXECUTABLE:
+            if (!is_executable($file) && !drupal_install_fix_file($file, $mask)) {
+              $return = FALSE;
+            }
+            break;
+          case FILE_NOT_READABLE:
+            if (is_readable($file) && !drupal_install_fix_file($file, $mask)) {
+              $return = FALSE;
+            }
+            break;
+          case FILE_NOT_WRITABLE:
+            if (is_writable($file) && !drupal_install_fix_file($file, $mask)) {
+              $return = FALSE;
+            }
+            break;
+          case FILE_NOT_EXECUTABLE:
+            if (is_executable($file) && !drupal_install_fix_file($file, $mask)) {
+              $return = FALSE;
+            }
+            break;
+        }
+      }
+    }
+  }
+  return $return;
+}
+
+/**
+ * Creates a directory with the specified permissions.
+ *
+ * @param $file
+ *  The name of the directory to create;
+ * @param $mask
+ *  The permissions of the directory to create.
+ * @param $message
+ *  (optional) Whether to output messages. Defaults to TRUE.
+ *
+ * @return
+ *  TRUE/FALSE whether or not the directory was successfully created.
+ */
+function drupal_install_mkdir($file, $mask, $message = TRUE) {
+  $mod = 0;
+  $masks = array(FILE_READABLE, FILE_WRITABLE, FILE_EXECUTABLE, FILE_NOT_READABLE, FILE_NOT_WRITABLE, FILE_NOT_EXECUTABLE);
+  foreach ($masks as $m) {
+    if ($mask & $m) {
+      switch ($m) {
+        case FILE_READABLE:
+          $mod |= 0444;
+          break;
+        case FILE_WRITABLE:
+          $mod |= 0222;
+          break;
+        case FILE_EXECUTABLE:
+          $mod |= 0111;
+          break;
+      }
+    }
+  }
+
+  if (@drupal_mkdir($file, $mod)) {
+    return TRUE;
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
+ * Attempts to fix file permissions.
+ *
+ * The general approach here is that, because we do not know the security
+ * setup of the webserver, we apply our permission changes to all three
+ * digits of the file permission (i.e. user, group and all).
+ *
+ * To ensure that the values behave as expected (and numbers don't carry
+ * from one digit to the next) we do the calculation on the octal value
+ * using bitwise operations. This lets us remove, for example, 0222 from
+ * 0700 and get the correct value of 0500.
+ *
+ * @param $file
+ *  The name of the file with permissions to fix.
+ * @param $mask
+ *  The desired permissions for the file.
+ * @param $message
+ *  (optional) Whether to output messages. Defaults to TRUE.
+ *
+ * @return
+ *  TRUE/FALSE whether or not we were able to fix the file's permissions.
+ */
+function drupal_install_fix_file($file, $mask, $message = TRUE) {
+  // If $file does not exist, fileperms() issues a PHP warning.
+  if (!file_exists($file)) {
+    return FALSE;
+  }
+
+  $mod = fileperms($file) & 0777;
+  $masks = array(FILE_READABLE, FILE_WRITABLE, FILE_EXECUTABLE, FILE_NOT_READABLE, FILE_NOT_WRITABLE, FILE_NOT_EXECUTABLE);
+
+  // FILE_READABLE, FILE_WRITABLE, and FILE_EXECUTABLE permission strings
+  // can theoretically be 0400, 0200, and 0100 respectively, but to be safe
+  // we set all three access types in case the administrator intends to
+  // change the owner of settings.php after installation.
+  foreach ($masks as $m) {
+    if ($mask & $m) {
+      switch ($m) {
+        case FILE_READABLE:
+          if (!is_readable($file)) {
+            $mod |= 0444;
+          }
+          break;
+        case FILE_WRITABLE:
+          if (!is_writable($file)) {
+            $mod |= 0222;
+          }
+          break;
+        case FILE_EXECUTABLE:
+          if (!is_executable($file)) {
+            $mod |= 0111;
+          }
+          break;
+        case FILE_NOT_READABLE:
+          if (is_readable($file)) {
+            $mod &= ~0444;
+          }
+          break;
+        case FILE_NOT_WRITABLE:
+          if (is_writable($file)) {
+            $mod &= ~0222;
+          }
+          break;
+        case FILE_NOT_EXECUTABLE:
+          if (is_executable($file)) {
+            $mod &= ~0111;
+          }
+          break;
+      }
+    }
+  }
+
+  // chmod() will work if the web server is running as owner of the file.
+  // If PHP safe_mode is enabled the currently executing script must also
+  // have the same owner.
+  if (@chmod($file, $mod)) {
+    return TRUE;
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
+ * Sends the user to a different installer page.
+ *
+ * This issues an on-site HTTP redirect. Messages (and errors) are erased.
+ *
+ * @param $path
+ *   An installer path.
+ */
+function install_goto($path) {
+  global $base_url;
+  include_once DRUPAL_ROOT . '/includes/common.inc';
+  header('Location: ' . $base_url . '/' . $path);
+  header('Cache-Control: no-cache'); // Not a permanent redirect.
+  drupal_exit();
+}
+
+/**
+ * Returns the URL of the current script, with modified query parameters.
+ *
+ * This function can be called by low-level scripts (such as install.php and
+ * update.php) and returns the URL of the current script. Existing query
+ * parameters are preserved by default, but new ones can optionally be merged
+ * in.
+ *
+ * This function is used when the script must maintain certain query parameters
+ * over multiple page requests in order to work correctly. In such cases (for
+ * example, update.php, which requires the 'continue=1' parameter to remain in
+ * the URL throughout the update process if there are any requirement warnings
+ * that need to be bypassed), using this function to generate the URL for links
+ * to the next steps of the script ensures that the links will work correctly.
+ *
+ * @param $query
+ *   (optional) An array of query parameters to merge in to the existing ones.
+ *
+ * @return
+ *   The URL of the current script, with query parameters modified by the
+ *   passed-in $query. The URL is not sanitized, so it still needs to be run
+ *   through check_url() if it will be used as an HTML attribute value.
+ *
+ * @see drupal_requirements_url()
+ */
+function drupal_current_script_url($query = array()) {
+  $uri = $_SERVER['SCRIPT_NAME'];
+  $query = array_merge(drupal_get_query_parameters(), $query);
+  if (!empty($query)) {
+    $uri .= '?' . drupal_http_build_query($query);
+  }
+  return $uri;
+}
+
+/**
+ * Returns a URL for proceeding to the next page after a requirements problem.
+ *
+ * This function can be called by low-level scripts (such as install.php and
+ * update.php) and returns a URL that can be used to attempt to proceed to the
+ * next step of the script.
+ *
+ * @param $severity
+ *   The severity of the requirements problem, as returned by
+ *   drupal_requirements_severity().
+ *
+ * @return
+ *   A URL for attempting to proceed to the next step of the script. The URL is
+ *   not sanitized, so it still needs to be run through check_url() if it will
+ *   be used as an HTML attribute value.
+ *
+ * @see drupal_current_script_url()
+ */
+function drupal_requirements_url($severity) {
+  $query = array();
+  // If there are no errors, only warnings, append 'continue=1' to the URL so
+  // the user can bypass this screen on the next page load.
+  if ($severity == REQUIREMENT_WARNING) {
+    $query['continue'] = 1;
+  }
+  return drupal_current_script_url($query);
+}
+
+/**
+ * Translates a string when some systems are not available.
+ *
+ * Used during the install process, when database, theme, and localization
+ * system is possibly not yet available.
+ *
+ * Use t() if your code will never run during the Drupal installation phase.
+ * Use st() if your code will only run during installation and never any other
+ * time. Use get_t() if your code could run in either circumstance.
+ *
+ * @see t()
+ * @see get_t()
+ * @ingroup sanitization
+ */
+function st($string, array $args = array(), array $options = array()) {
+  static $locale_strings = NULL;
+  global $install_state;
+
+  if (empty($options['context'])) {
+    $options['context'] = '';
+  }
+
+  if (!isset($locale_strings)) {
+    $locale_strings = array();
+    if (isset($install_state['parameters']['profile']) && isset($install_state['parameters']['locale'])) {
+      // If the given locale was selected, there should be at least one .po file
+      // with its name ending in {$install_state['parameters']['locale']}.po
+      // This might or might not be the entire filename. It is also possible
+      // that multiple files end with the same extension, even if unlikely.
+      $po_files = file_scan_directory('./profiles/' . $install_state['parameters']['profile'] . '/translations', '/'. $install_state['parameters']['locale'] .'\.po$/', array('recurse' => FALSE));
+      if (count($po_files)) {
+        require_once DRUPAL_ROOT . '/includes/locale.inc';
+        foreach ($po_files as $po_file) {
+          _locale_import_read_po('mem-store', $po_file);
+        }
+        $locale_strings = _locale_import_one_string('mem-report');
+      }
+    }
+  }
+
+  // Transform arguments before inserting them
+  foreach ($args as $key => $value) {
+    switch ($key[0]) {
+      // Escaped only
+      case '@':
+        $args[$key] = check_plain($value);
+        break;
+      // Escaped and placeholder
+      case '%':
+      default:
+        $args[$key] = '<em>' . check_plain($value) . '</em>';
+        break;
+      // Pass-through
+      case '!':
+    }
+  }
+  return strtr((!empty($locale_strings[$options['context']][$string]) ? $locale_strings[$options['context']][$string] : $string), $args);
+}
+
+/**
+ * Checks an installation profile's requirements.
+ *
+ * @param $profile
+ *   Name of installation profile to check.
+ * @return
+ *   Array of the installation profile's requirements.
+ */
+function drupal_check_profile($profile) {
+  include_once DRUPAL_ROOT . '/includes/file.inc';
+
+  $profile_file = DRUPAL_ROOT . "/profiles/$profile/$profile.profile";
+
+  if (!isset($profile) || !file_exists($profile_file)) {
+    throw new Exception(install_no_profile_error());
+  }
+
+  $info = install_profile_info($profile);
+
+  // Collect requirement testing results.
+  $requirements = array();
+  foreach ($info['dependencies'] as $module) {
+    module_load_install($module);
+    $function = $module . '_requirements';
+    if (function_exists($function)) {
+      $requirements = array_merge($requirements, $function('install'));
+    }
+  }
+  return $requirements;
+}
+
+/**
+ * Extracts the highest severity from the requirements array.
+ *
+ * @param $requirements
+ *   An array of requirements, in the same format as is returned by
+ *   hook_requirements().
+ *
+ * @return
+ *   The highest severity in the array.
+ */
+function drupal_requirements_severity(&$requirements) {
+  $severity = REQUIREMENT_OK;
+  foreach ($requirements as $requirement) {
+    if (isset($requirement['severity'])) {
+      $severity = max($severity, $requirement['severity']);
+    }
+  }
+  return $severity;
+}
+
+/**
+ * Checks a module's requirements.
+ *
+ * @param $module
+ *   Machine name of module to check.
+ *
+ * @return
+ *   TRUE or FALSE, depending on whether the requirements are met.
+ */
+function drupal_check_module($module) {
+  module_load_install($module);
+  if (module_hook($module, 'requirements')) {
+    // Check requirements
+    $requirements = module_invoke($module, 'requirements', 'install');
+    if (is_array($requirements) && drupal_requirements_severity($requirements) == REQUIREMENT_ERROR) {
+      // Print any error messages
+      foreach ($requirements as $requirement) {
+        if (isset($requirement['severity']) && $requirement['severity'] == REQUIREMENT_ERROR) {
+          $message = $requirement['description'];
+          if (isset($requirement['value']) && $requirement['value']) {
+            $message .= ' (' . t('Currently using !item !version', array('!item' => $requirement['title'], '!version' => $requirement['value'])) . ')';
+          }
+          drupal_set_message($message, 'error');
+        }
+      }
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+
+/**
+ * Retrieves information about an installation profile from its .info file.
+ *
+ * The information stored in a profile .info file is similar to that stored in
+ * a normal Drupal module .info file. For example:
+ * - name: The real name of the installation profile for display purposes.
+ * - description: A brief description of the profile.
+ * - dependencies: An array of shortnames of other modules that this install
+ *   profile requires.
+ *
+ * Additional, less commonly-used information that can appear in a profile.info
+ * file but not in a normal Drupal module .info file includes:
+ * - distribution_name: The name of the Drupal distribution that is being
+ *   installed, to be shown throughout the installation process. Defaults to
+ *   'Drupal'.
+ * - exclusive: If the install profile is intended to be the only eligible
+ *   choice in a distribution, setting exclusive = TRUE will auto-select it
+ *   during installation, and the install profile selection screen will be
+ *   skipped. If more than one profile is found where exclusive = TRUE then
+ *   this property will have no effect and the profile selection screen will
+ *   be shown as normal with all available profiles shown.
+ *
+ * Note that this function does an expensive file system scan to get info file
+ * information for dependencies. If you only need information from the info
+ * file itself, use system_get_info().
+ *
+ * Example of .info file:
+ * @code
+ *    name = Minimal
+ *    description = Start fresh, with only a few modules enabled.
+ *    dependencies[] = block
+ *    dependencies[] = dblog
+ * @endcode
+ *
+ * @param $profile
+ *   Name of profile.
+ * @param $locale
+ *   Name of locale used (if any).
+ *
+ * @return
+ *   The info array.
+ */
+function install_profile_info($profile, $locale = 'en') {
+  $cache = &drupal_static(__FUNCTION__, array());
+
+  if (!isset($cache[$profile])) {
+    // Set defaults for module info.
+    $defaults = array(
+      'dependencies' => array(),
+      'description' => '',
+      'distribution_name' => 'Drupal',
+      'version' => NULL,
+      'hidden' => FALSE,
+      'php' => DRUPAL_MINIMUM_PHP,
+    );
+    $info = drupal_parse_info_file("profiles/$profile/$profile.info") + $defaults;
+    $info['dependencies'] = array_unique(array_merge(
+      drupal_required_modules(),
+      $info['dependencies'],
+      ($locale != 'en' && !empty($locale) ? array('locale') : array()))
+    );
+
+    // drupal_required_modules() includes the current profile as a dependency.
+    // Since a module can't depend on itself we remove that element of the array.
+    array_shift($info['dependencies']);
+
+    $cache[$profile] = $info;
+  }
+  return $cache[$profile];
+}
+
+/**
+ * Ensures the environment for a Drupal database on a predefined connection.
+ *
+ * This will run tasks that check that Drupal can perform all of the functions
+ * on a database, that Drupal needs. Tasks include simple checks like CREATE
+ * TABLE to database specific functions like stored procedures and client
+ * encoding.
+ */
+function db_run_tasks($driver) {
+  db_installer_object($driver)->runTasks();
+  return TRUE;
+}
+
+/**
+ * Returns a database installer object.
+ *
+ * @param $driver
+ *   The name of the driver.
+ */
+function db_installer_object($driver) {
+  Database::loadDriverFile($driver, array('install.inc'));
+  $task_class = 'DatabaseTasks_' . $driver;
+  return new $task_class();
+}
diff --git a/htmltest/includes/iso.inc b/htmltest/includes/iso.inc
new file mode 100644
index 00000000..6c66c569
--- /dev/null
+++ b/htmltest/includes/iso.inc
@@ -0,0 +1,483 @@
+<?php
+
+/**
+ * @file
+ * Provides a list of countries and languages based on ISO standards.
+ */
+
+/**
+ * Get an array of all country code => country name pairs.
+ *
+ * Get an array of all country code => country name pairs as laid out
+ * in ISO 3166-1 alpha-2.
+ * Grabbed from location project (http://drupal.org/project/location).
+ * @return
+ *   An array of all country code => country name pairs.
+ */
+function _country_get_predefined_list() {
+  static $countries;
+
+  if (isset($countries)) {
+    return $countries;
+  }
+  $t = get_t();
+
+  $countries = array(
+    'AD' => $t('Andorra'),
+    'AE' => $t('United Arab Emirates'),
+    'AF' => $t('Afghanistan'),
+    'AG' => $t('Antigua and Barbuda'),
+    'AI' => $t('Anguilla'),
+    'AL' => $t('Albania'),
+    'AM' => $t('Armenia'),
+    'AN' => $t('Netherlands Antilles'),
+    'AO' => $t('Angola'),
+    'AQ' => $t('Antarctica'),
+    'AR' => $t('Argentina'),
+    'AS' => $t('American Samoa'),
+    'AT' => $t('Austria'),
+    'AU' => $t('Australia'),
+    'AW' => $t('Aruba'),
+    'AX' => $t('Aland Islands'),
+    'AZ' => $t('Azerbaijan'),
+    'BA' => $t('Bosnia and Herzegovina'),
+    'BB' => $t('Barbados'),
+    'BD' => $t('Bangladesh'),
+    'BE' => $t('Belgium'),
+    'BF' => $t('Burkina Faso'),
+    'BG' => $t('Bulgaria'),
+    'BH' => $t('Bahrain'),
+    'BI' => $t('Burundi'),
+    'BJ' => $t('Benin'),
+    'BL' => $t('Saint Barthélemy'),
+    'BM' => $t('Bermuda'),
+    'BN' => $t('Brunei'),
+    'BO' => $t('Bolivia'),
+    'BR' => $t('Brazil'),
+    'BS' => $t('Bahamas'),
+    'BT' => $t('Bhutan'),
+    'BV' => $t('Bouvet Island'),
+    'BW' => $t('Botswana'),
+    'BY' => $t('Belarus'),
+    'BZ' => $t('Belize'),
+    'CA' => $t('Canada'),
+    'CC' => $t('Cocos (Keeling) Islands'),
+    'CD' => $t('Congo (Kinshasa)'),
+    'CF' => $t('Central African Republic'),
+    'CG' => $t('Congo (Brazzaville)'),
+    'CH' => $t('Switzerland'),
+    'CI' => $t('Ivory Coast'),
+    'CK' => $t('Cook Islands'),
+    'CL' => $t('Chile'),
+    'CM' => $t('Cameroon'),
+    'CN' => $t('China'),
+    'CO' => $t('Colombia'),
+    'CR' => $t('Costa Rica'),
+    'CU' => $t('Cuba'),
+    'CW' => $t('Curaçao'),
+    'CV' => $t('Cape Verde'),
+    'CX' => $t('Christmas Island'),
+    'CY' => $t('Cyprus'),
+    'CZ' => $t('Czech Republic'),
+    'DE' => $t('Germany'),
+    'DJ' => $t('Djibouti'),
+    'DK' => $t('Denmark'),
+    'DM' => $t('Dominica'),
+    'DO' => $t('Dominican Republic'),
+    'DZ' => $t('Algeria'),
+    'EC' => $t('Ecuador'),
+    'EE' => $t('Estonia'),
+    'EG' => $t('Egypt'),
+    'EH' => $t('Western Sahara'),
+    'ER' => $t('Eritrea'),
+    'ES' => $t('Spain'),
+    'ET' => $t('Ethiopia'),
+    'FI' => $t('Finland'),
+    'FJ' => $t('Fiji'),
+    'FK' => $t('Falkland Islands'),
+    'FM' => $t('Micronesia'),
+    'FO' => $t('Faroe Islands'),
+    'FR' => $t('France'),
+    'GA' => $t('Gabon'),
+    'GB' => $t('United Kingdom'),
+    'GD' => $t('Grenada'),
+    'GE' => $t('Georgia'),
+    'GF' => $t('French Guiana'),
+    'GG' => $t('Guernsey'),
+    'GH' => $t('Ghana'),
+    'GI' => $t('Gibraltar'),
+    'GL' => $t('Greenland'),
+    'GM' => $t('Gambia'),
+    'GN' => $t('Guinea'),
+    'GP' => $t('Guadeloupe'),
+    'GQ' => $t('Equatorial Guinea'),
+    'GR' => $t('Greece'),
+    'GS' => $t('South Georgia and the South Sandwich Islands'),
+    'GT' => $t('Guatemala'),
+    'GU' => $t('Guam'),
+    'GW' => $t('Guinea-Bissau'),
+    'GY' => $t('Guyana'),
+    'HK' => $t('Hong Kong S.A.R., China'),
+    'HM' => $t('Heard Island and McDonald Islands'),
+    'HN' => $t('Honduras'),
+    'HR' => $t('Croatia'),
+    'HT' => $t('Haiti'),
+    'HU' => $t('Hungary'),
+    'ID' => $t('Indonesia'),
+    'IE' => $t('Ireland'),
+    'IL' => $t('Israel'),
+    'IM' => $t('Isle of Man'),
+    'IN' => $t('India'),
+    'IO' => $t('British Indian Ocean Territory'),
+    'IQ' => $t('Iraq'),
+    'IR' => $t('Iran'),
+    'IS' => $t('Iceland'),
+    'IT' => $t('Italy'),
+    'JE' => $t('Jersey'),
+    'JM' => $t('Jamaica'),
+    'JO' => $t('Jordan'),
+    'JP' => $t('Japan'),
+    'KE' => $t('Kenya'),
+    'KG' => $t('Kyrgyzstan'),
+    'KH' => $t('Cambodia'),
+    'KI' => $t('Kiribati'),
+    'KM' => $t('Comoros'),
+    'KN' => $t('Saint Kitts and Nevis'),
+    'KP' => $t('North Korea'),
+    'KR' => $t('South Korea'),
+    'KW' => $t('Kuwait'),
+    'KY' => $t('Cayman Islands'),
+    'KZ' => $t('Kazakhstan'),
+    'LA' => $t('Laos'),
+    'LB' => $t('Lebanon'),
+    'LC' => $t('Saint Lucia'),
+    'LI' => $t('Liechtenstein'),
+    'LK' => $t('Sri Lanka'),
+    'LR' => $t('Liberia'),
+    'LS' => $t('Lesotho'),
+    'LT' => $t('Lithuania'),
+    'LU' => $t('Luxembourg'),
+    'LV' => $t('Latvia'),
+    'LY' => $t('Libya'),
+    'MA' => $t('Morocco'),
+    'MC' => $t('Monaco'),
+    'MD' => $t('Moldova'),
+    'ME' => $t('Montenegro'),
+    'MF' => $t('Saint Martin (French part)'),
+    'MG' => $t('Madagascar'),
+    'MH' => $t('Marshall Islands'),
+    'MK' => $t('Macedonia'),
+    'ML' => $t('Mali'),
+    'MM' => $t('Myanmar'),
+    'MN' => $t('Mongolia'),
+    'MO' => $t('Macao S.A.R., China'),
+    'MP' => $t('Northern Mariana Islands'),
+    'MQ' => $t('Martinique'),
+    'MR' => $t('Mauritania'),
+    'MS' => $t('Montserrat'),
+    'MT' => $t('Malta'),
+    'MU' => $t('Mauritius'),
+    'MV' => $t('Maldives'),
+    'MW' => $t('Malawi'),
+    'MX' => $t('Mexico'),
+    'MY' => $t('Malaysia'),
+    'MZ' => $t('Mozambique'),
+    'NA' => $t('Namibia'),
+    'NC' => $t('New Caledonia'),
+    'NE' => $t('Niger'),
+    'NF' => $t('Norfolk Island'),
+    'NG' => $t('Nigeria'),
+    'NI' => $t('Nicaragua'),
+    'NL' => $t('Netherlands'),
+    'NO' => $t('Norway'),
+    'NP' => $t('Nepal'),
+    'NR' => $t('Nauru'),
+    'NU' => $t('Niue'),
+    'NZ' => $t('New Zealand'),
+    'OM' => $t('Oman'),
+    'PA' => $t('Panama'),
+    'PE' => $t('Peru'),
+    'PF' => $t('French Polynesia'),
+    'PG' => $t('Papua New Guinea'),
+    'PH' => $t('Philippines'),
+    'PK' => $t('Pakistan'),
+    'PL' => $t('Poland'),
+    'PM' => $t('Saint Pierre and Miquelon'),
+    'PN' => $t('Pitcairn'),
+    'PR' => $t('Puerto Rico'),
+    'PS' => $t('Palestinian Territory'),
+    'PT' => $t('Portugal'),
+    'PW' => $t('Palau'),
+    'PY' => $t('Paraguay'),
+    'QA' => $t('Qatar'),
+    'RE' => $t('Reunion'),
+    'RO' => $t('Romania'),
+    'RS' => $t('Serbia'),
+    'RU' => $t('Russia'),
+    'RW' => $t('Rwanda'),
+    'SA' => $t('Saudi Arabia'),
+    'SB' => $t('Solomon Islands'),
+    'SC' => $t('Seychelles'),
+    'SD' => $t('Sudan'),
+    'SE' => $t('Sweden'),
+    'SG' => $t('Singapore'),
+    'SH' => $t('Saint Helena'),
+    'SI' => $t('Slovenia'),
+    'SJ' => $t('Svalbard and Jan Mayen'),
+    'SK' => $t('Slovakia'),
+    'SL' => $t('Sierra Leone'),
+    'SM' => $t('San Marino'),
+    'SN' => $t('Senegal'),
+    'SO' => $t('Somalia'),
+    'SR' => $t('Suriname'),
+    'ST' => $t('Sao Tome and Principe'),
+    'SV' => $t('El Salvador'),
+    'SY' => $t('Syria'),
+    'SZ' => $t('Swaziland'),
+    'TC' => $t('Turks and Caicos Islands'),
+    'TD' => $t('Chad'),
+    'TF' => $t('French Southern Territories'),
+    'TG' => $t('Togo'),
+    'TH' => $t('Thailand'),
+    'TJ' => $t('Tajikistan'),
+    'TK' => $t('Tokelau'),
+    'TL' => $t('Timor-Leste'),
+    'TM' => $t('Turkmenistan'),
+    'TN' => $t('Tunisia'),
+    'TO' => $t('Tonga'),
+    'TR' => $t('Turkey'),
+    'TT' => $t('Trinidad and Tobago'),
+    'TV' => $t('Tuvalu'),
+    'TW' => $t('Taiwan'),
+    'TZ' => $t('Tanzania'),
+    'UA' => $t('Ukraine'),
+    'UG' => $t('Uganda'),
+    'UM' => $t('United States Minor Outlying Islands'),
+    'US' => $t('United States'),
+    'UY' => $t('Uruguay'),
+    'UZ' => $t('Uzbekistan'),
+    'VA' => $t('Vatican'),
+    'VC' => $t('Saint Vincent and the Grenadines'),
+    'VE' => $t('Venezuela'),
+    'VG' => $t('British Virgin Islands'),
+    'VI' => $t('U.S. Virgin Islands'),
+    'VN' => $t('Vietnam'),
+    'VU' => $t('Vanuatu'),
+    'WF' => $t('Wallis and Futuna'),
+    'WS' => $t('Samoa'),
+    'YE' => $t('Yemen'),
+    'YT' => $t('Mayotte'),
+    'ZA' => $t('South Africa'),
+    'ZM' => $t('Zambia'),
+    'ZW' => $t('Zimbabwe'),
+  );
+
+  // Sort the list.
+  natcasesort($countries);
+
+  return $countries;
+}
+
+/**
+ * @ingroup locale-api-predefined List of predefined languages
+ * @{
+ */
+
+/**
+ * Some of the common languages with their English and native names
+ *
+ * Based on ISO 639 and http://people.w3.org/rishida/names/languages.html
+ */
+function _locale_get_predefined_list() {
+  return array(
+    'aa' => array('Afar'),
+    'ab' => array('Abkhazian', 'аҧсуа бызшәа'),
+    'ae' => array('Avestan'),
+    'af' => array('Afrikaans'),
+    'ak' => array('Akan'),
+    'am' => array('Amharic', 'አማርኛ'),
+    'ar' => array('Arabic', /* Left-to-right marker "‭" */ 'العربية', LANGUAGE_RTL),
+    'as' => array('Assamese'),
+    'ast' => array('Asturian'),
+    'av' => array('Avar'),
+    'ay' => array('Aymara'),
+    'az' => array('Azerbaijani', 'azərbaycan'),
+    'ba' => array('Bashkir'),
+    'be' => array('Belarusian', 'Беларуская'),
+    'bg' => array('Bulgarian', 'Български'),
+    'bh' => array('Bihari'),
+    'bi' => array('Bislama'),
+    'bm' => array('Bambara', 'Bamanankan'),
+    'bn' => array('Bengali'),
+    'bo' => array('Tibetan'),
+    'br' => array('Breton'),
+    'bs' => array('Bosnian', 'Bosanski'),
+    'ca' => array('Catalan', 'Català'),
+    'ce' => array('Chechen'),
+    'ch' => array('Chamorro'),
+    'co' => array('Corsican'),
+    'cr' => array('Cree'),
+    'cs' => array('Czech', 'Čeština'),
+    'cu' => array('Old Slavonic'),
+    'cv' => array('Chuvash'),
+    'cy' => array('Welsh', 'Cymraeg'),
+    'da' => array('Danish', 'Dansk'),
+    'de' => array('German', 'Deutsch'),
+    'dv' => array('Maldivian'),
+    'dz' => array('Bhutani'),
+    'ee' => array('Ewe', 'Ɛʋɛ'),
+    'el' => array('Greek', 'Ελληνικά'),
+    'en' => array('English'),
+    'en-gb' => array('English, British'),
+    'eo' => array('Esperanto'),
+    'es' => array('Spanish', 'Español'),
+    'et' => array('Estonian', 'Eesti'),
+    'eu' => array('Basque', 'Euskera'),
+    'fa' => array('Persian', /* Left-to-right marker "‭" */ 'فارسی', LANGUAGE_RTL),
+    'ff' => array('Fulah', 'Fulfulde'),
+    'fi' => array('Finnish', 'Suomi'),
+    'fil' => array('Filipino'),
+    'fj' => array('Fiji'),
+    'fo' => array('Faeroese'),
+    'fr' => array('French', 'Français'),
+    'fy' => array('Frisian', 'Frysk'),
+    'ga' => array('Irish', 'Gaeilge'),
+    'gd' => array('Scots Gaelic'),
+    'gl' => array('Galician', 'Galego'),
+    'gn' => array('Guarani'),
+    'gsw-berne' => array('Swiss German'),
+    'gu' => array('Gujarati'),
+    'gv' => array('Manx'),
+    'ha' => array('Hausa'),
+    'he' => array('Hebrew', /* Left-to-right marker "‭" */ 'עברית', LANGUAGE_RTL),
+    'hi' => array('Hindi', 'हिन्दी'),
+    'ho' => array('Hiri Motu'),
+    'hr' => array('Croatian', 'Hrvatski'),
+    'ht' => array('Haitian Creole'),
+    'hu' => array('Hungarian', 'Magyar'),
+    'hy' => array('Armenian', 'Հայերեն'),
+    'hz' => array('Herero'),
+    'ia' => array('Interlingua'),
+    'id' => array('Indonesian', 'Bahasa Indonesia'),
+    'ie' => array('Interlingue'),
+    'ig' => array('Igbo'),
+    'ik' => array('Inupiak'),
+    'is' => array('Icelandic', 'Íslenska'),
+    'it' => array('Italian', 'Italiano'),
+    'iu' => array('Inuktitut'),
+    'ja' => array('Japanese', '日本語'),
+    'jv' => array('Javanese'),
+    'ka' => array('Georgian'),
+    'kg' => array('Kongo'),
+    'ki' => array('Kikuyu'),
+    'kj' => array('Kwanyama'),
+    'kk' => array('Kazakh', 'Қазақ'),
+    'kl' => array('Greenlandic'),
+    'km' => array('Cambodian'),
+    'kn' => array('Kannada', 'ಕನ್ನಡ'),
+    'ko' => array('Korean', '한국어'),
+    'kr' => array('Kanuri'),
+    'ks' => array('Kashmiri'),
+    'ku' => array('Kurdish', 'Kurdî'),
+    'kv' => array('Komi'),
+    'kw' => array('Cornish'),
+    'ky' => array('Kyrgyz', 'Кыргызча'),
+    'la' => array('Latin', 'Latina'),
+    'lb' => array('Luxembourgish'),
+    'lg' => array('Luganda'),
+    'ln' => array('Lingala'),
+    'lo' => array('Laothian'),
+    'lt' => array('Lithuanian', 'Lietuvių'),
+    'lv' => array('Latvian', 'Latviešu'),
+    'mg' => array('Malagasy'),
+    'mh' => array('Marshallese'),
+    'mi' => array('Māori'),
+    'mk' => array('Macedonian', 'Македонски'),
+    'ml' => array('Malayalam', 'മലയാളം'),
+    'mn' => array('Mongolian'),
+    'mo' => array('Moldavian'),
+    'mr' => array('Marathi'),
+    'ms' => array('Malay', 'Bahasa Melayu'),
+    'mt' => array('Maltese', 'Malti'),
+    'my' => array('Burmese'),
+    'na' => array('Nauru'),
+    'nd' => array('North Ndebele'),
+    'ne' => array('Nepali'),
+    'ng' => array('Ndonga'),
+    'nl' => array('Dutch', 'Nederlands'),
+    'nb' => array('Norwegian Bokmål', 'Bokmål'),
+    'nn' => array('Norwegian Nynorsk', 'Nynorsk'),
+    'nr' => array('South Ndebele'),
+    'nv' => array('Navajo'),
+    'ny' => array('Chichewa'),
+    'oc' => array('Occitan'),
+    'om' => array('Oromo'),
+    'or' => array('Oriya'),
+    'os' => array('Ossetian'),
+    'pa' => array('Punjabi'),
+    'pi' => array('Pali'),
+    'pl' => array('Polish', 'Polski'),
+    'ps' => array('Pashto', /* Left-to-right marker "‭" */ 'پښتو', LANGUAGE_RTL),
+    'pt' => array('Portuguese, International'),
+    'pt-pt' => array('Portuguese, Portugal', 'Português'),
+    'pt-br' => array('Portuguese, Brazil', 'Português'),
+    'qu' => array('Quechua'),
+    'rm' => array('Rhaeto-Romance'),
+    'rn' => array('Kirundi'),
+    'ro' => array('Romanian', 'Română'),
+    'ru' => array('Russian', 'Русский'),
+    'rw' => array('Kinyarwanda'),
+    'sa' => array('Sanskrit'),
+    'sc' => array('Sardinian'),
+    'sco' => array('Scots'),
+    'sd' => array('Sindhi'),
+    'se' => array('Northern Sami'),
+    'sg' => array('Sango'),
+    'sh' => array('Serbo-Croatian'),
+    'si' => array('Sinhala', 'සිංහල'),
+    'sk' => array('Slovak', 'Slovenčina'),
+    'sl' => array('Slovenian', 'Slovenščina'),
+    'sm' => array('Samoan'),
+    'sn' => array('Shona'),
+    'so' => array('Somali'),
+    'sq' => array('Albanian', 'Shqip'),
+    'sr' => array('Serbian', 'Српски'),
+    'ss' => array('Siswati'),
+    'st' => array('Sesotho'),
+    'su' => array('Sudanese'),
+    'sv' => array('Swedish', 'Svenska'),
+    'sw' => array('Swahili', 'Kiswahili'),
+    'ta' => array('Tamil', 'தமிழ்'),
+    'te' => array('Telugu', 'తెలుగు'),
+    'tg' => array('Tajik'),
+    'th' => array('Thai', 'ภาษาไทย'),
+    'ti' => array('Tigrinya'),
+    'tk' => array('Turkmen'),
+    'tl' => array('Tagalog'),
+    'tn' => array('Setswana'),
+    'to' => array('Tonga'),
+    'tr' => array('Turkish', 'Türkçe'),
+    'ts' => array('Tsonga'),
+    'tt' => array('Tatar', 'Tatarça'),
+    'tw' => array('Twi'),
+    'ty' => array('Tahitian'),
+    'ug' => array('Uyghur'),
+    'uk' => array('Ukrainian', 'Українська'),
+    'ur' => array('Urdu', /* Left-to-right marker "‭" */ 'اردو', LANGUAGE_RTL),
+    'uz' => array('Uzbek', "o'zbek"),
+    've' => array('Venda'),
+    'vi' => array('Vietnamese', 'Tiếng Việt'),
+    'wo' => array('Wolof'),
+    'xh' => array('Xhosa', 'isiXhosa'),
+    'xx-lolspeak' => array('Lolspeak'),
+    'yi' => array('Yiddish'),
+    'yo' => array('Yoruba', 'Yorùbá'),
+    'za' => array('Zhuang'),
+    'zh-hans' => array('Chinese, Simplified', '简体中文'),
+    'zh-hant' => array('Chinese, Traditional', '繁體中文'),
+    'zu' => array('Zulu', 'isiZulu'),
+  );
+}
+/**
+ * @} End of "locale-api-languages-predefined"
+ */
diff --git a/htmltest/includes/json-encode.inc b/htmltest/includes/json-encode.inc
new file mode 100644
index 00000000..1efd6ddb
--- /dev/null
+++ b/htmltest/includes/json-encode.inc
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * @file
+ * Provides a helper to properly encode HTML-safe JSON prior to PHP 5.3.0.
+ */
+
+/**
+ * Encodes a PHP variable to HTML-safe JSON for PHP versions below 5.3.0.
+ *
+ * @see drupal_json_encode()
+ */
+function drupal_json_encode_helper($var) {
+  switch (gettype($var)) {
+    case 'boolean':
+      return $var ? 'true' : 'false'; // Lowercase necessary!
+
+    case 'integer':
+    case 'double':
+      return $var;
+
+    case 'resource':
+    case 'string':
+      // Always use Unicode escape sequences (\u0022) over JSON escape
+      // sequences (\") to prevent browsers interpreting these as
+      // special characters.
+      $replace_pairs = array(
+        // ", \ and U+0000 - U+001F must be escaped according to RFC 4627.
+        '\\' => '\u005C',
+        '"' => '\u0022',
+        "\x00" => '\u0000',
+        "\x01" => '\u0001',
+        "\x02" => '\u0002',
+        "\x03" => '\u0003',
+        "\x04" => '\u0004',
+        "\x05" => '\u0005',
+        "\x06" => '\u0006',
+        "\x07" => '\u0007',
+        "\x08" => '\u0008',
+        "\x09" => '\u0009',
+        "\x0a" => '\u000A',
+        "\x0b" => '\u000B',
+        "\x0c" => '\u000C',
+        "\x0d" => '\u000D',
+        "\x0e" => '\u000E',
+        "\x0f" => '\u000F',
+        "\x10" => '\u0010',
+        "\x11" => '\u0011',
+        "\x12" => '\u0012',
+        "\x13" => '\u0013',
+        "\x14" => '\u0014',
+        "\x15" => '\u0015',
+        "\x16" => '\u0016',
+        "\x17" => '\u0017',
+        "\x18" => '\u0018',
+        "\x19" => '\u0019',
+        "\x1a" => '\u001A',
+        "\x1b" => '\u001B',
+        "\x1c" => '\u001C',
+        "\x1d" => '\u001D',
+        "\x1e" => '\u001E',
+        "\x1f" => '\u001F',
+        // Prevent browsers from interpreting these as as special.
+        "'" => '\u0027',
+        '<' => '\u003C',
+        '>' => '\u003E',
+        '&' => '\u0026',
+        // Prevent browsers from interpreting the solidus as special and
+        // non-compliant JSON parsers from interpreting // as a comment.
+        '/' => '\u002F',
+        // While these are allowed unescaped according to ECMA-262, section
+        // 15.12.2, they cause problems in some JSON parsers.
+        "\xe2\x80\xa8" => '\u2028', // U+2028, Line Separator.
+        "\xe2\x80\xa9" => '\u2029', // U+2029, Paragraph Separator.
+      );
+
+      return '"' . strtr($var, $replace_pairs) . '"';
+
+    case 'array':
+      // Arrays in JSON can't be associative. If the array is empty or if it
+      // has sequential whole number keys starting with 0, it's not associative
+      // so we can go ahead and convert it as an array.
+      if (empty($var) || array_keys($var) === range(0, sizeof($var) - 1)) {
+        $output = array();
+        foreach ($var as $v) {
+          $output[] = drupal_json_encode_helper($v);
+        }
+        return '[ ' . implode(', ', $output) . ' ]';
+      }
+      // Otherwise, fall through to convert the array as an object.
+
+    case 'object':
+      $output = array();
+      foreach ($var as $k => $v) {
+        $output[] = drupal_json_encode_helper(strval($k)) . ':' . drupal_json_encode_helper($v);
+      }
+      return '{' . implode(', ', $output) . '}';
+
+    default:
+      return 'null';
+  }
+}
diff --git a/htmltest/includes/language.inc b/htmltest/includes/language.inc
new file mode 100644
index 00000000..803a6304
--- /dev/null
+++ b/htmltest/includes/language.inc
@@ -0,0 +1,580 @@
+<?php
+
+/**
+ * @file
+ * Language Negotiation API.
+ *
+ * @see http://drupal.org/node/1497272
+ */
+
+/**
+ * No language negotiation. The default language is used.
+ */
+define('LANGUAGE_NEGOTIATION_DEFAULT', 'language-default');
+
+/**
+ * @defgroup language_negotiation Language Negotiation API functionality
+ * @{
+ * Functions to customize the language types and the negotiation process.
+ *
+ * The language negotiation API is based on two major concepts:
+ * - Language types: types of translatable data (the types of data that a user
+ *   can view or request).
+ * - Language negotiation providers: functions for determining which language to
+ *   use to present a particular piece of data to the user.
+ * Both language types and language negotiation providers are customizable.
+ *
+ * Drupal defines three built-in language types:
+ * - Interface language: The page's main language, used to present translated
+ *   user interface elements such as titles, labels, help text, and messages.
+ * - Content language: The language used to present content that is available
+ *   in more than one language (see
+ *   @link field_language Field Language API @endlink for details).
+ * - URL language: The language associated with URLs. When generating a URL,
+ *   this value will be used by url() as a default if no explicit preference is
+ *   provided.
+ * Modules can define additional language types through
+ * hook_language_types_info(), and alter existing language type definitions
+ * through hook_language_types_info_alter().
+ *
+ * Language types may be configurable or fixed. The language negotiation
+ * providers associated with a configurable language type can be explicitly
+ * set through the user interface. A fixed language type has predetermined
+ * (module-defined) language negotiation settings and, thus, does not appear in
+ * the configuration page. Here is a code snippet that makes the content
+ * language (which by default inherits the interface language's values)
+ * configurable:
+ * @code
+ * function mymodule_language_types_info_alter(&$language_types) {
+ *   unset($language_types[LANGUAGE_TYPE_CONTENT]['fixed']);
+ * }
+ * @endcode
+ *
+ * Every language type can have a different set of language negotiation
+ * providers assigned to it. Different language types often share the same
+ * language negotiation settings, but they can have independent settings if
+ * needed. If two language types are configured the same way, their language
+ * switcher configuration will be functionally identical and the same settings
+ * will act on both language types.
+ *
+ * Drupal defines the following built-in language negotiation providers:
+ * - URL: Determine the language from the URL (path prefix or domain).
+ * - Session: Determine the language from a request/session parameter.
+ * - User: Follow the user's language preference.
+ * - Browser: Determine the language from the browser's language settings.
+ * - Default language: Use the default site language.
+ * Language negotiation providers are simple callback functions that implement a
+ * particular logic to return a language code. For instance, the URL provider
+ * searches for a valid path prefix or domain name in the current request URL.
+ * If a language negotiation provider does not return a valid language code, the
+ * next provider associated to the language type (based on provider weight) is
+ * invoked.
+ *
+ * Modules can define additional language negotiation providers through
+ * hook_language_negotiation_info(), and alter existing providers through
+ * hook_language_negotiation_info_alter(). Here is an example snippet that lets
+ * path prefixes be ignored for administrative paths:
+ * @code
+ * function mymodule_language_negotiation_info_alter(&$negotiation_info) {
+ *   // Replace the core function with our own function.
+ *   module_load_include('language', 'inc', 'language.negotiation');
+ *   $negotiation_info[LANGUAGE_NEGOTIATION_URL]['callbacks']['language'] = 'mymodule_from_url';
+ *   $negotiation_info[LANGUAGE_NEGOTIATION_URL]['file'] = drupal_get_path('module', 'mymodule') . '/mymodule.module';
+ * }
+ *
+ * function mymodule_from_url($languages) {
+ *   // Use the core URL language negotiation provider to get a valid language
+ *   // code.
+ *   module_load_include('language', 'inc', 'language.negotiation');
+ *   $langcode = language_from_url($languages);
+ *
+ *   // If we are on an administrative path, override with the default language.
+ *   if (isset($_GET['q']) && strtok($_GET['q'], '/') == 'admin') {
+ *     return language_default()->langcode;
+ *   }
+ *   return $langcode;
+ * }
+ * @endcode
+ *
+ * For more information, see
+ * @link http://drupal.org/node/1497272 Language Negotiation API @endlink
+ */
+
+/**
+ * Returns all the defined language types.
+ *
+ * @return
+ *   An array of language type names. The name will be used as the global
+ *   variable name the language value will be stored in.
+ */
+function language_types_info() {
+  $language_types = &drupal_static(__FUNCTION__);
+
+  if (!isset($language_types)) {
+    $language_types = module_invoke_all('language_types_info');
+    // Let other modules alter the list of language types.
+    drupal_alter('language_types_info', $language_types);
+  }
+
+  return $language_types;
+}
+
+/**
+ * Returns only the configurable language types.
+ *
+ * A language type maybe configurable or fixed. A fixed language type is a type
+ * whose language negotiation providers are module-defined and not altered
+ * through the user interface.
+ *
+ * @param $stored
+ *   Optional. By default retrieves values from the 'language_types' variable to
+ *   avoid unnecessary hook invocations.
+ *   If set to FALSE retrieves values from the actual language type definitions.
+ *   This allows to react to alterations performed on the definitions by modules
+ *   installed after the 'language_types' variable is set.
+ *
+ * @return
+ *   An array of language type names.
+ */
+function language_types_configurable($stored = TRUE) {
+  $configurable = &drupal_static(__FUNCTION__);
+
+  if ($stored && !isset($configurable)) {
+    $types = variable_get('language_types', drupal_language_types());
+    $configurable = array_keys(array_filter($types));
+  }
+
+  if (!$stored) {
+    $result = array();
+    foreach (language_types_info() as $type => $info) {
+      if (!isset($info['fixed'])) {
+        $result[] = $type;
+      }
+    }
+    return $result;
+  }
+
+  return $configurable;
+}
+
+/**
+ * Disables the given language types.
+ *
+ * @param $types
+ *   An array of language types.
+ */
+function language_types_disable($types) {
+  $enabled_types = variable_get('language_types', drupal_language_types());
+
+  foreach ($types as $type) {
+    unset($enabled_types[$type]);
+  }
+
+  variable_set('language_types', $enabled_types);
+}
+
+/**
+ * Updates the language type configuration.
+ */
+function language_types_set() {
+  // Ensure that we are getting the defined language negotiation information. An
+  // invocation of module_enable() or module_disable() could outdate the cached
+  // information.
+  drupal_static_reset('language_types_info');
+  drupal_static_reset('language_negotiation_info');
+
+  // Determine which language types are configurable and which not by checking
+  // whether the 'fixed' key is defined. Non-configurable (fixed) language types
+  // have their language negotiation settings stored there.
+  $defined_providers = language_negotiation_info();
+  foreach (language_types_info() as $type => $info) {
+    if (isset($info['fixed'])) {
+      $language_types[$type] = FALSE;
+      $negotiation = array();
+      foreach ($info['fixed'] as $weight => $id) {
+        if (isset($defined_providers[$id])) {
+          $negotiation[$id] = $weight;
+        }
+      }
+      language_negotiation_set($type, $negotiation);
+    }
+    else {
+      $language_types[$type] = TRUE;
+    }
+  }
+
+  // Save language types.
+  variable_set('language_types', $language_types);
+
+  // Ensure that subsequent calls of language_types_configurable() return the
+  // updated language type information.
+  drupal_static_reset('language_types_configurable');
+}
+
+/**
+ * Checks whether a language negotiation provider is enabled for a language type.
+ *
+ * This has two possible behaviors:
+ *  - If $provider_id is given return its ID if enabled, FALSE otherwise.
+ *  - If no ID is passed the first enabled language negotiation provider is
+ *    returned.
+ *
+ * @param $type
+ *   The language negotiation provider type.
+ * @param $provider_id
+ *   The language negotiation provider ID.
+ *
+ * @return
+ *   The provider ID if it is enabled, FALSE otherwise.
+ */
+function language_negotiation_get($type, $provider_id = NULL) {
+  $negotiation = variable_get("language_negotiation_$type", array());
+
+  if (empty($negotiation)) {
+    return empty($provider_id) ? LANGUAGE_NEGOTIATION_DEFAULT : FALSE;
+  }
+
+  if (empty($provider_id)) {
+    return key($negotiation);
+  }
+
+  if (isset($negotiation[$provider_id])) {
+    return $provider_id;
+  }
+
+  return FALSE;
+}
+
+/**
+ * Checks if the language negotiation provider is enabled for any language type.
+ *
+ * @param $provider_id
+ *   The language negotiation provider ID.
+ *
+ * @return
+ *   TRUE if there is at least one language type for which the given language
+ *   provider is enabled, FALSE otherwise.
+ */
+function language_negotiation_get_any($provider_id) {
+  foreach (language_types_configurable() as $type) {
+    if (language_negotiation_get($type, $provider_id)) {
+      return TRUE;
+    }
+  }
+
+  return FALSE;
+}
+
+/**
+ * Returns the language switch links for the given language.
+ *
+ * @param $type
+ *   The language negotiation type.
+ * @param $path
+ *   The internal path the switch links will be relative to.
+ *
+ * @return
+ *   A keyed array of links ready to be themed.
+ */
+function language_negotiation_get_switch_links($type, $path) {
+  $links = FALSE;
+  $negotiation = variable_get("language_negotiation_$type", array());
+
+  // Only get the languages if we have more than one.
+  if (count(language_list()) >= 2) {
+    $language = language_initialize($type);
+  }
+
+  foreach ($negotiation as $id => $provider) {
+    if (isset($provider['callbacks']['switcher'])) {
+      if (isset($provider['file'])) {
+        require_once DRUPAL_ROOT . '/' . $provider['file'];
+      }
+
+      $callback = $provider['callbacks']['switcher'];
+      $result = $callback($type, $path);
+
+      // Add support for WCAG 2.0's Language of Parts to add language identifiers.
+      // http://www.w3.org/TR/UNDERSTANDING-WCAG20/meaning-other-lang-id.html
+      foreach ($result as $langcode => $link) {
+        $result[$langcode]['attributes']['lang'] = $langcode;
+      }
+
+      if (!empty($result)) {
+        // Allow modules to provide translations for specific links.
+        drupal_alter('language_switch_links', $result, $type, $path);
+        $links = (object) array('links' => $result, 'provider' => $id);
+        break;
+      }
+    }
+  }
+
+  return $links;
+}
+
+/**
+ * Removes any unused language negotiation providers from the configuration.
+ */
+function language_negotiation_purge() {
+  // Ensure that we are getting the defined language negotiation information. An
+  // invocation of module_enable() or module_disable() could outdate the cached
+  // information.
+  drupal_static_reset('language_negotiation_info');
+  drupal_static_reset('language_types_info');
+
+  $defined_providers = language_negotiation_info();
+  foreach (language_types_info() as $type => $type_info) {
+    $weight = 0;
+    $negotiation = array();
+    foreach (variable_get("language_negotiation_$type", array()) as $id => $provider) {
+      if (isset($defined_providers[$id])) {
+        $negotiation[$id] = $weight++;
+      }
+    }
+    language_negotiation_set($type, $negotiation);
+  }
+}
+
+/**
+ * Saves a list of language negotiation providers.
+ *
+ * @param $type
+ *   The language negotiation type.
+ * @param $language_providers
+ *   An array of language negotiation provider weights keyed by provider ID.
+ *   @see language_provider_weight()
+ */
+function language_negotiation_set($type, $language_providers) {
+  // Save only the necessary fields.
+  $provider_fields = array('callbacks', 'file', 'cache');
+
+  $negotiation = array();
+  $providers_weight = array();
+  $defined_providers = language_negotiation_info();
+  $default_types = language_types_configurable(FALSE);
+
+  // Initialize the providers weight list.
+  foreach ($language_providers as $id => $provider) {
+    $providers_weight[$id] = language_provider_weight($provider);
+  }
+
+  // Order providers list by weight.
+  asort($providers_weight);
+
+  foreach ($providers_weight as $id => $weight) {
+    if (isset($defined_providers[$id])) {
+      $provider = $defined_providers[$id];
+      // If the provider does not express any preference about types, make it
+      // available for any configurable type.
+      $types = array_flip(isset($provider['types']) ? $provider['types'] : $default_types);
+      // Check whether the provider is defined and has the right type.
+      if (isset($types[$type])) {
+        $provider_data = array();
+        foreach ($provider_fields as $field) {
+          if (isset($provider[$field])) {
+            $provider_data[$field] = $provider[$field];
+          }
+        }
+        $negotiation[$id] = $provider_data;
+      }
+    }
+  }
+
+  variable_set("language_negotiation_$type", $negotiation);
+}
+
+/**
+ * Returns all the defined language negotiation providers.
+ *
+ * @return
+ *   An array of language negotiation providers.
+ */
+function language_negotiation_info() {
+  $language_providers = &drupal_static(__FUNCTION__);
+
+  if (!isset($language_providers)) {
+    // Collect all the module-defined language negotiation providers.
+    $language_providers = module_invoke_all('language_negotiation_info');
+
+    // Add the default language negotiation provider.
+    $language_providers[LANGUAGE_NEGOTIATION_DEFAULT] = array(
+      'callbacks' => array('language' => 'language_from_default'),
+      'weight' => 10,
+      'name' => t('Default'),
+      'description' => t('Use the default site language (@language_name).', array('@language_name' => language_default()->native)),
+    );
+
+    // Let other modules alter the list of language negotiation providers.
+    drupal_alter('language_negotiation_info', $language_providers);
+  }
+
+  return $language_providers;
+}
+
+/**
+ * Helper function used to cache the language negotiation providers results.
+ *
+ * @param $provider_id
+ *   The language negotiation provider's identifier.
+ * @param $provider
+ *   (optional) An associative array of information about the provider to be
+ *   invoked (see hook_language_negotiation_info() for details). If not passed
+ *   in, it will be loaded through language_negotiation_info().
+ *
+ * @return
+ *   A language object representing the language chosen by the provider.
+ */
+function language_provider_invoke($provider_id, $provider = NULL) {
+  $results = &drupal_static(__FUNCTION__);
+
+  if (!isset($results[$provider_id])) {
+    global $user;
+
+    // Get languages grouped by status and select only the enabled ones.
+    $languages = language_list('enabled');
+    $languages = $languages[1];
+
+    if (!isset($provider)) {
+      $providers = language_negotiation_info();
+      $provider = $providers[$provider_id];
+    }
+
+    if (isset($provider['file'])) {
+      require_once DRUPAL_ROOT . '/' . $provider['file'];
+    }
+
+    // If the language negotiation provider has no cache preference or this is
+    // satisfied we can execute the callback.
+    $cache = !isset($provider['cache']) || $user->uid || $provider['cache'] == variable_get('cache', 0);
+    $callback = isset($provider['callbacks']['language']) ? $provider['callbacks']['language'] : FALSE;
+    $langcode = $cache && function_exists($callback) ? $callback($languages) : FALSE;
+    $results[$provider_id] = isset($languages[$langcode]) ? $languages[$langcode] : FALSE;
+  }
+
+  // Since objects are resources, we need to return a clone to prevent the
+  // language negotiation provider cache from being unintentionally altered. The
+  // same providers might be used with different language types based on
+  // configuration.
+  return !empty($results[$provider_id]) ? clone($results[$provider_id]) : $results[$provider_id];
+}
+
+/**
+ * Returns the passed language negotiation provider weight or a default value.
+ *
+ * @param $provider
+ *   A language negotiation provider data structure.
+ *
+ * @return
+ *   A numeric weight.
+ */
+function language_provider_weight($provider) {
+  $default = is_numeric($provider) ? $provider : 0;
+  return isset($provider['weight']) && is_numeric($provider['weight']) ? $provider['weight'] : $default;
+}
+
+/**
+ * Chooses a language based on language negotiation provider settings.
+ *
+ * @param $type
+ *   The language type key to find the language for.
+ *
+ * @return
+ *   The negotiated language object.
+ */
+function language_initialize($type) {
+  // Execute the language negotiation providers in the order they were set up and return the
+  // first valid language found.
+  $negotiation = variable_get("language_negotiation_$type", array());
+
+  foreach ($negotiation as $provider_id => $provider) {
+    $language = language_provider_invoke($provider_id, $provider);
+    if ($language) {
+      $language->provider = $provider_id;
+      return $language;
+    }
+  }
+
+  // If no other language was found use the default one.
+  $language = language_default();
+  $language->provider = LANGUAGE_NEGOTIATION_DEFAULT;
+  return $language;
+}
+
+/**
+ * Returns the default language negotiation provider.
+ *
+ * @return
+ *   The default language code.
+ */
+function language_from_default() {
+  return language_default()->language;
+}
+
+/**
+ * Splits the given path into prefix and actual path.
+ *
+ * Parse the given path and return the language object identified by the prefix
+ * and the actual path.
+ *
+ * @param $path
+ *   The path to split.
+ * @param $languages
+ *   An array of valid languages.
+ *
+ * @return
+ *   An array composed of:
+ *    - A language object corresponding to the identified prefix on success,
+ *      FALSE otherwise.
+ *    - The path without the prefix on success, the given path otherwise.
+ */
+function language_url_split_prefix($path, $languages) {
+  $args = empty($path) ? array() : explode('/', $path);
+  $prefix = array_shift($args);
+
+  // Search prefix within enabled languages.
+  foreach ($languages as $language) {
+    if (!empty($language->prefix) && $language->prefix == $prefix) {
+      // Rebuild $path with the language removed.
+      return array($language, implode('/', $args));
+    }
+  }
+
+  return array(FALSE, $path);
+}
+
+/**
+ * Returns the possible fallback languages ordered by language weight.
+ *
+ * @param
+ *   (optional) The language type. Defaults to LANGUAGE_TYPE_CONTENT.
+ *
+ * @return
+ *   An array of language codes.
+ */
+function language_fallback_get_candidates($type = LANGUAGE_TYPE_CONTENT) {
+  $fallback_candidates = &drupal_static(__FUNCTION__);
+
+  if (!isset($fallback_candidates)) {
+    $fallback_candidates = array();
+
+    // Get languages ordered by weight.
+    // Use array keys to avoid duplicated entries.
+    foreach (language_list('weight') as $languages) {
+      foreach ($languages as $language) {
+        $fallback_candidates[$language->language] = NULL;
+      }
+    }
+
+    $fallback_candidates = array_keys($fallback_candidates);
+    $fallback_candidates[] = LANGUAGE_NONE;
+
+    // Let other modules hook in and add/change candidates.
+    drupal_alter('language_fallback_candidates', $fallback_candidates);
+  }
+
+  return $fallback_candidates;
+}
+
+/**
+ * @} End of "language_negotiation"
+ */
diff --git a/htmltest/includes/locale.inc b/htmltest/includes/locale.inc
new file mode 100644
index 00000000..c168da0a
--- /dev/null
+++ b/htmltest/includes/locale.inc
@@ -0,0 +1,2442 @@
+<?php
+
+/**
+ * @file
+ * Administration functions for locale.module.
+ */
+
+/**
+ * The language is determined using a URL language indicator:
+ * path prefix or domain according to the configuration.
+ */
+define('LOCALE_LANGUAGE_NEGOTIATION_URL', 'locale-url');
+
+/**
+ * The language is set based on the browser language settings.
+ */
+define('LOCALE_LANGUAGE_NEGOTIATION_BROWSER', 'locale-browser');
+
+/**
+ * The language is determined using the current interface language.
+ */
+define('LOCALE_LANGUAGE_NEGOTIATION_INTERFACE', 'locale-interface');
+
+/**
+ * If no URL language is available language is determined using an already
+ * detected one.
+ */
+define('LOCALE_LANGUAGE_NEGOTIATION_URL_FALLBACK', 'locale-url-fallback');
+
+/**
+ * The language is set based on the user language settings.
+ */
+define('LOCALE_LANGUAGE_NEGOTIATION_USER', 'locale-user');
+
+/**
+ * The language is set based on the request/session parameters.
+ */
+define('LOCALE_LANGUAGE_NEGOTIATION_SESSION', 'locale-session');
+
+/**
+ * Regular expression pattern used to localize JavaScript strings.
+ */
+define('LOCALE_JS_STRING', '(?:(?:\'(?:\\\\\'|[^\'])*\'|"(?:\\\\"|[^"])*")(?:\s*\+\s*)?)+');
+
+/**
+ * Regular expression pattern used to match simple JS object literal.
+ *
+ * This pattern matches a basic JS object, but will fail on an object with
+ * nested objects. Used in JS file parsing for string arg processing.
+ */
+define('LOCALE_JS_OBJECT', '\{.*?\}');
+
+/**
+ * Regular expression to match an object containing a key 'context'.
+ *
+ * Pattern to match a JS object containing a 'context key' with a string value,
+ * which is captured. Will fail if there are nested objects.
+ */
+define('LOCALE_JS_OBJECT_CONTEXT', '
+  \{              # match object literal start
+  .*?             # match anything, non-greedy
+  (?:             # match a form of "context"
+    \'context\'
+    |
+    "context"
+    |
+    context
+  )
+  \s*:\s*         # match key-value separator ":"
+  (' . LOCALE_JS_STRING . ')  # match context string
+  .*?             # match anything, non-greedy
+  \}              # match end of object literal
+');
+
+/**
+ * Translation import mode overwriting all existing translations
+ * if new translated version available.
+ */
+define('LOCALE_IMPORT_OVERWRITE', 0);
+
+/**
+ * Translation import mode keeping existing translations and only
+ * inserting new strings.
+ */
+define('LOCALE_IMPORT_KEEP', 1);
+
+/**
+ * URL language negotiation: use the path prefix as URL language
+ * indicator.
+ */
+define('LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX', 0);
+
+/**
+ * URL language negotiation: use the domain as URL language
+ * indicator.
+ */
+define('LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN', 1);
+
+/**
+ * @defgroup locale-languages-negotiation Language negotiation options
+ * @{
+ * Functions for language negotiation.
+ *
+ * There are functions that provide the ability to identify the
+ * language. This behavior can be controlled by various options.
+ */
+
+/**
+ * Identifies the language from the current interface language.
+ *
+ * @return
+ *   The current interface language code.
+ */
+function locale_language_from_interface() {
+  global $language;
+  return isset($language->language) ? $language->language : FALSE;
+}
+
+/**
+ * Identify language from the Accept-language HTTP header we got.
+ *
+ * We perform browser accept-language parsing only if page cache is disabled,
+ * otherwise we would cache a user-specific preference.
+ *
+ * @param $languages
+ *   An array of language objects for enabled languages ordered by weight.
+ *
+ * @return
+ *   A valid language code on success, FALSE otherwise.
+ */
+function locale_language_from_browser($languages) {
+  if (empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
+    return FALSE;
+  }
+
+  // The Accept-Language header contains information about the language
+  // preferences configured in the user's browser / operating system.
+  // RFC 2616 (section 14.4) defines the Accept-Language header as follows:
+  //   Accept-Language = "Accept-Language" ":"
+  //                  1#( language-range [ ";" "q" "=" qvalue ] )
+  //   language-range  = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
+  // Samples: "hu, en-us;q=0.66, en;q=0.33", "hu,en-us;q=0.5"
+  $browser_langcodes = array();
+  if (preg_match_all('@(?<=[, ]|^)([a-zA-Z-]+|\*)(?:;q=([0-9.]+))?(?:$|\s*,\s*)@', trim($_SERVER['HTTP_ACCEPT_LANGUAGE']), $matches, PREG_SET_ORDER)) {
+    foreach ($matches as $match) {
+      // We can safely use strtolower() here, tags are ASCII.
+      // RFC2616 mandates that the decimal part is no more than three digits,
+      // so we multiply the qvalue by 1000 to avoid floating point comparisons.
+      $langcode = strtolower($match[1]);
+      $qvalue = isset($match[2]) ? (float) $match[2] : 1;
+      $browser_langcodes[$langcode] = (int) ($qvalue * 1000);
+    }
+  }
+
+  // We should take pristine values from the HTTP headers, but Internet Explorer
+  // from version 7 sends only specific language tags (eg. fr-CA) without the
+  // corresponding generic tag (fr) unless explicitly configured. In that case,
+  // we assume that the lowest value of the specific tags is the value of the
+  // generic language to be as close to the HTTP 1.1 spec as possible.
+  // See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 and
+  // http://blogs.msdn.com/b/ie/archive/2006/10/17/accept-language-header-for-internet-explorer-7.aspx
+  asort($browser_langcodes);
+  foreach ($browser_langcodes as $langcode => $qvalue) {
+    $generic_tag = strtok($langcode, '-');
+    if (!isset($browser_langcodes[$generic_tag])) {
+      $browser_langcodes[$generic_tag] = $qvalue;
+    }
+  }
+
+  // Find the enabled language with the greatest qvalue, following the rules
+  // of RFC 2616 (section 14.4). If several languages have the same qvalue,
+  // prefer the one with the greatest weight.
+  $best_match_langcode = FALSE;
+  $max_qvalue = 0;
+  foreach ($languages as $langcode => $language) {
+    // Language tags are case insensitive (RFC2616, sec 3.10).
+    $langcode = strtolower($langcode);
+
+    // If nothing matches below, the default qvalue is the one of the wildcard
+    // language, if set, or is 0 (which will never match).
+    $qvalue = isset($browser_langcodes['*']) ? $browser_langcodes['*'] : 0;
+
+    // Find the longest possible prefix of the browser-supplied language
+    // ('the language-range') that matches this site language ('the language tag').
+    $prefix = $langcode;
+    do {
+      if (isset($browser_langcodes[$prefix])) {
+        $qvalue = $browser_langcodes[$prefix];
+        break;
+      }
+    }
+    while ($prefix = substr($prefix, 0, strrpos($prefix, '-')));
+
+    // Find the best match.
+    if ($qvalue > $max_qvalue) {
+      $best_match_langcode = $language->language;
+      $max_qvalue = $qvalue;
+    }
+  }
+
+  return $best_match_langcode;
+}
+
+/**
+ * Identify language from the user preferences.
+ *
+ * @param $languages
+ *   An array of valid language objects.
+ *
+ * @return
+ *   A valid language code on success, FALSE otherwise.
+ */
+function locale_language_from_user($languages) {
+  // User preference (only for logged users).
+  global $user;
+
+  if ($user->uid) {
+    return $user->language;
+  }
+
+  // No language preference from the user.
+  return FALSE;
+}
+
+/**
+ * Identify language from a request/session parameter.
+ *
+ * @param $languages
+ *   An array of valid language objects.
+ *
+ * @return
+ *   A valid language code on success, FALSE otherwise.
+ */
+function locale_language_from_session($languages) {
+  $param = variable_get('locale_language_negotiation_session_param', 'language');
+
+  // Request parameter: we need to update the session parameter only if we have
+  // an authenticated user.
+  if (isset($_GET[$param]) && isset($languages[$langcode = $_GET[$param]])) {
+    global $user;
+    if ($user->uid) {
+      $_SESSION[$param] = $langcode;
+    }
+    return $langcode;
+  }
+
+  // Session parameter.
+  if (isset($_SESSION[$param])) {
+    return $_SESSION[$param];
+  }
+
+  return FALSE;
+}
+
+/**
+ * Identify language via URL prefix or domain.
+ *
+ * @param $languages
+ *   An array of valid language objects.
+ *
+ * @return
+ *   A valid language code on success, FALSE otherwise.
+ */
+function locale_language_from_url($languages) {
+  $language_url = FALSE;
+
+  if (!language_negotiation_get_any(LOCALE_LANGUAGE_NEGOTIATION_URL)) {
+    return $language_url;
+  }
+
+  switch (variable_get('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX)) {
+    case LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX:
+      // $_GET['q'] might not be available at this time, because
+      // path initialization runs after the language bootstrap phase.
+      list($language, $_GET['q']) = language_url_split_prefix(isset($_GET['q']) ? $_GET['q'] : NULL, $languages);
+      if ($language !== FALSE) {
+        $language_url = $language->language;
+      }
+      break;
+
+    case LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN:
+      // Get only the host, not the port.
+      $http_host= $_SERVER['HTTP_HOST'];
+      if (strpos($http_host, ':') !== FALSE) {
+        $http_host_tmp = explode(':', $http_host);
+        $http_host = current($http_host_tmp);
+      }
+      foreach ($languages as $language) {
+        // Skip check if the language doesn't have a domain.
+        if ($language->domain) {
+          // Only compare the domains not the protocols or ports.
+          // Remove protocol and add http:// so parse_url works
+          $host = 'http://' . str_replace(array('http://', 'https://'), '', $language->domain);
+          $host = parse_url($host, PHP_URL_HOST);
+          if ($http_host == $host) {
+            $language_url = $language->language;
+            break;
+          }
+        }
+      }
+      break;
+  }
+
+  return $language_url;
+}
+
+/**
+ * Determines the language to be assigned to URLs when none is detected.
+ *
+ * The language negotiation process has a fallback chain that ends with the
+ * default language provider. Each built-in language type has a separate
+ * initialization:
+ * - Interface language, which is the only configurable one, always gets a valid
+ *   value. If no request-specific language is detected, the default language
+ *   will be used.
+ * - Content language merely inherits the interface language by default.
+ * - URL language is detected from the requested URL and will be used to rewrite
+ *   URLs appearing in the page being rendered. If no language can be detected,
+ *   there are two possibilities:
+ *   - If the default language has no configured path prefix or domain, then the
+ *     default language is used. This guarantees that (missing) URL prefixes are
+ *     preserved when navigating through the site.
+ *   - If the default language has a configured path prefix or domain, a
+ *     requested URL having an empty prefix or domain is an anomaly that must be
+ *     fixed. This is done by introducing a prefix or domain in the rendered
+ *     page matching the detected interface language.
+ *
+ * @param $languages
+ *   (optional) An array of valid language objects. This is passed by
+ *   language_provider_invoke() to every language provider callback, but it is
+ *   not actually needed here. Defaults to NULL.
+ * @param $language_type
+ *   (optional) The language type to fall back to. Defaults to the interface
+ *   language.
+ *
+ * @return
+ *   A valid language code.
+ */
+function locale_language_url_fallback($language = NULL, $language_type = LANGUAGE_TYPE_INTERFACE) {
+  $default = language_default();
+  $prefix = (variable_get('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX) == LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX);
+
+  // If the default language is not configured to convey language information,
+  // a missing URL language information indicates that URL language should be
+  // the default one, otherwise we fall back to an already detected language.
+  if (($prefix && empty($default->prefix)) || (!$prefix && empty($default->domain))) {
+    return $default->language;
+  }
+  else {
+    return $GLOBALS[$language_type]->language;
+  }
+}
+
+/**
+ * Return the URL language switcher block. Translation links may be provided by
+ * other modules.
+ */
+function locale_language_switcher_url($type, $path) {
+  $languages = language_list('enabled');
+  $links = array();
+
+  foreach ($languages[1] as $language) {
+    $links[$language->language] = array(
+      'href'       => $path,
+      'title'      => $language->native,
+      'language'   => $language,
+      'attributes' => array('class' => array('language-link')),
+    );
+  }
+
+  return $links;
+}
+
+/**
+ * Return the session language switcher block.
+ */
+function locale_language_switcher_session($type, $path) {
+  drupal_add_css(drupal_get_path('module', 'locale') . '/locale.css');
+
+  $param = variable_get('locale_language_negotiation_session_param', 'language');
+  $language_query = isset($_SESSION[$param]) ? $_SESSION[$param] : $GLOBALS[$type]->language;
+
+  $languages = language_list('enabled');
+  $links = array();
+
+  $query = $_GET;
+  unset($query['q']);
+
+  foreach ($languages[1] as $language) {
+    $langcode = $language->language;
+    $links[$langcode] = array(
+      'href'       => $path,
+      'title'      => $language->native,
+      'attributes' => array('class' => array('language-link')),
+      'query'      => $query,
+    );
+    if ($language_query != $langcode) {
+      $links[$langcode]['query'][$param] = $langcode;
+    }
+    else {
+      $links[$langcode]['attributes']['class'][] = ' session-active';
+    }
+  }
+
+  return $links;
+}
+
+/**
+ * Rewrite URLs for the URL language provider.
+ */
+function locale_language_url_rewrite_url(&$path, &$options) {
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['languages'] = &drupal_static(__FUNCTION__);
+  }
+  $languages = &$drupal_static_fast['languages'];
+
+  if (!isset($languages)) {
+    $languages = language_list('enabled');
+    $languages = array_flip(array_keys($languages[1]));
+  }
+
+  // Language can be passed as an option, or we go for current URL language.
+  if (!isset($options['language'])) {
+    global $language_url;
+    $options['language'] = $language_url;
+  }
+  // We allow only enabled languages here.
+  elseif (!isset($languages[$options['language']->language])) {
+    unset($options['language']);
+    return;
+  }
+
+  if (isset($options['language'])) {
+    switch (variable_get('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX)) {
+      case LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN:
+        if ($options['language']->domain) {
+          // Ask for an absolute URL with our modified base_url.
+          global $is_https;
+          $url_scheme = ($is_https) ? 'https://' : 'http://';
+          $options['absolute'] = TRUE;
+
+          // Take the domain without ports or protocols so we can apply the
+          // protocol needed. The setting might include a protocol.
+          // This is changed in Drupal 8 but we need to keep backwards
+          // compatibility for Drupal 7.
+          $host = 'http://' . str_replace(array('http://', 'https://'), '', $options['language']->domain);
+          $host = parse_url($host, PHP_URL_HOST);
+
+          // Apply the appropriate protocol to the URL.
+          $options['base_url'] = $url_scheme . $host;
+          if (isset($options['https']) && variable_get('https', FALSE)) {
+            if ($options['https'] === TRUE) {
+              $options['base_url'] = str_replace('http://', 'https://', $options['base_url']);
+            }
+            elseif ($options['https'] === FALSE) {
+              $options['base_url'] = str_replace('https://', 'http://', $options['base_url']);
+            }
+          }
+        }
+        break;
+
+      case LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX:
+        if (!empty($options['language']->prefix)) {
+          $options['prefix'] = $options['language']->prefix . '/';
+        }
+        break;
+    }
+  }
+}
+
+/**
+ * Rewrite URLs for the Session language provider.
+ */
+function locale_language_url_rewrite_session(&$path, &$options) {
+  static $query_rewrite, $query_param, $query_value;
+
+  // The following values are not supposed to change during a single page
+  // request processing.
+  if (!isset($query_rewrite)) {
+    global $user;
+    if (!$user->uid) {
+      $languages = language_list('enabled');
+      $languages = $languages[1];
+      $query_param = check_plain(variable_get('locale_language_negotiation_session_param', 'language'));
+      $query_value = isset($_GET[$query_param]) ? check_plain($_GET[$query_param]) : NULL;
+      $query_rewrite = isset($languages[$query_value]) && language_negotiation_get_any(LOCALE_LANGUAGE_NEGOTIATION_SESSION);
+    }
+    else {
+      $query_rewrite = FALSE;
+    }
+  }
+
+  // If the user is anonymous, the user language provider is enabled, and the
+  // corresponding option has been set, we must preserve any explicit user
+  // language preference even with cookies disabled.
+  if ($query_rewrite) {
+    if (is_string($options['query'])) {
+      $options['query'] = drupal_get_query_array($options['query']);
+    }
+    if (!isset($options['query'][$query_param])) {
+      $options['query'][$query_param] = $query_value;
+    }
+  }
+}
+
+/**
+ * @} End of "locale-languages-negotiation"
+ */
+
+/**
+ * Check that a string is safe to be added or imported as a translation.
+ *
+ * This test can be used to detect possibly bad translation strings. It should
+ * not have any false positives. But it is only a test, not a transformation,
+ * as it destroys valid HTML. We cannot reliably filter translation strings
+ * on import because some strings are irreversibly corrupted. For example,
+ * a &amp; in the translation would get encoded to &amp;amp; by filter_xss()
+ * before being put in the database, and thus would be displayed incorrectly.
+ *
+ * The allowed tag list is like filter_xss_admin(), but omitting div and img as
+ * not needed for translation and likely to cause layout issues (div) or a
+ * possible attack vector (img).
+ */
+function locale_string_is_safe($string) {
+  return decode_entities($string) == decode_entities(filter_xss($string, array('a', 'abbr', 'acronym', 'address', 'b', 'bdo', 'big', 'blockquote', 'br', 'caption', 'cite', 'code', 'col', 'colgroup', 'dd', 'del', 'dfn', 'dl', 'dt', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'ins', 'kbd', 'li', 'ol', 'p', 'pre', 'q', 'samp', 'small', 'span', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'tt', 'ul', 'var')));
+}
+
+/**
+ * @defgroup locale-api-add Language addition API
+ * @{
+ * Add a language.
+ *
+ * The language addition API is used to create languages and store them.
+ */
+
+/**
+ * API function to add a language.
+ *
+ * @param $langcode
+ *   Language code.
+ * @param $name
+ *   English name of the language
+ * @param $native
+ *   Native name of the language
+ * @param $direction
+ *   LANGUAGE_LTR or LANGUAGE_RTL
+ * @param $domain
+ *   Optional custom domain name with protocol, without
+ *   trailing slash (eg. http://de.example.com).
+ * @param $prefix
+ *   Optional path prefix for the language. Defaults to the
+ *   language code if omitted.
+ * @param $enabled
+ *   Optionally TRUE to enable the language when created or FALSE to disable.
+ * @param $default
+ *   Optionally set this language to be the default.
+ */
+function locale_add_language($langcode, $name = NULL, $native = NULL, $direction = LANGUAGE_LTR, $domain = '', $prefix = '', $enabled = TRUE, $default = FALSE) {
+  // Default prefix on language code.
+  if (empty($prefix)) {
+    $prefix = $langcode;
+  }
+
+  // If name was not set, we add a predefined language.
+  if (!isset($name)) {
+    include_once DRUPAL_ROOT . '/includes/iso.inc';
+    $predefined = _locale_get_predefined_list();
+    $name = $predefined[$langcode][0];
+    $native = isset($predefined[$langcode][1]) ? $predefined[$langcode][1] : $predefined[$langcode][0];
+    $direction = isset($predefined[$langcode][2]) ? $predefined[$langcode][2] : LANGUAGE_LTR;
+  }
+
+  db_insert('languages')
+    ->fields(array(
+      'language' => $langcode,
+      'name' => $name,
+      'native' => $native,
+      'direction' => $direction,
+      'domain' => $domain,
+      'prefix' => $prefix,
+      'enabled' => $enabled,
+    ))
+    ->execute();
+
+  // Only set it as default if enabled.
+  if ($enabled && $default) {
+    variable_set('language_default', (object) array('language' => $langcode, 'name' => $name, 'native' => $native, 'direction' => $direction, 'enabled' => (int) $enabled, 'plurals' => 0, 'formula' => '', 'domain' => '', 'prefix' => $prefix, 'weight' => 0, 'javascript' => ''));
+  }
+
+  if ($enabled) {
+    // Increment enabled language count if we are adding an enabled language.
+    variable_set('language_count', variable_get('language_count', 1) + 1);
+  }
+
+  // Kill the static cache in language_list().
+  drupal_static_reset('language_list');
+
+  // Force JavaScript translation file creation for the newly added language.
+  _locale_invalidate_js($langcode);
+
+  watchdog('locale', 'The %language language (%code) has been created.', array('%language' => $name, '%code' => $langcode));
+
+  module_invoke_all('multilingual_settings_changed');
+}
+/**
+ * @} End of "locale-api-add"
+ */
+
+/**
+ * @defgroup locale-api-import-export Translation import/export API.
+ * @{
+ * Functions to import and export translations.
+ *
+ * These functions provide the ability to import translations from
+ * external files and to export translations and translation templates.
+ */
+
+/**
+ * Parses Gettext Portable Object file information and inserts into database
+ *
+ * @param $file
+ *   Drupal file object corresponding to the PO file to import.
+ * @param $langcode
+ *   Language code.
+ * @param $mode
+ *   Should existing translations be replaced LOCALE_IMPORT_KEEP or
+ *   LOCALE_IMPORT_OVERWRITE.
+ * @param $group
+ *   Text group to import PO file into (eg. 'default' for interface
+ *   translations).
+ */
+function _locale_import_po($file, $langcode, $mode, $group = NULL) {
+  // Try to allocate enough time to parse and import the data.
+  drupal_set_time_limit(240);
+
+  // Check if we have the language already in the database.
+  if (!db_query("SELECT COUNT(language) FROM {languages} WHERE language = :language", array(':language' => $langcode))->fetchField()) {
+    drupal_set_message(t('The language selected for import is not supported.'), 'error');
+    return FALSE;
+  }
+
+  // Get strings from file (returns on failure after a partial import, or on success)
+  $status = _locale_import_read_po('db-store', $file, $mode, $langcode, $group);
+  if ($status === FALSE) {
+    // Error messages are set in _locale_import_read_po().
+    return FALSE;
+  }
+
+  // Get status information on import process.
+  list($header_done, $additions, $updates, $deletes, $skips) = _locale_import_one_string('db-report');
+
+  if (!$header_done) {
+    drupal_set_message(t('The translation file %filename appears to have a missing or malformed header.', array('%filename' => $file->filename)), 'error');
+  }
+
+  // Clear cache and force refresh of JavaScript translations.
+  _locale_invalidate_js($langcode);
+  cache_clear_all('locale:', 'cache', TRUE);
+
+  // Rebuild the menu, strings may have changed.
+  menu_rebuild();
+
+  drupal_set_message(t('The translation was successfully imported. There are %number newly created translated strings, %update strings were updated and %delete strings were removed.', array('%number' => $additions, '%update' => $updates, '%delete' => $deletes)));
+  watchdog('locale', 'Imported %file into %locale: %number new strings added, %update updated and %delete removed.', array('%file' => $file->filename, '%locale' => $langcode, '%number' => $additions, '%update' => $updates, '%delete' => $deletes));
+  if ($skips) {
+    $skip_message = format_plural($skips, 'One translation string was skipped because it contains disallowed HTML.', '@count translation strings were skipped because they contain disallowed HTML.');
+    drupal_set_message($skip_message);
+    watchdog('locale', '@count disallowed HTML string(s) in %file', array('@count' => $skips, '%file' => $file->uri), WATCHDOG_WARNING);
+  }
+  return TRUE;
+}
+
+/**
+ * Parses Gettext Portable Object file into an array
+ *
+ * @param $op
+ *   Storage operation type: db-store or mem-store.
+ * @param $file
+ *   Drupal file object corresponding to the PO file to import.
+ * @param $mode
+ *   Should existing translations be replaced LOCALE_IMPORT_KEEP or
+ *   LOCALE_IMPORT_OVERWRITE.
+ * @param $lang
+ *   Language code.
+ * @param $group
+ *   Text group to import PO file into (eg. 'default' for interface
+ *   translations).
+ */
+function _locale_import_read_po($op, $file, $mode = NULL, $lang = NULL, $group = 'default') {
+
+  // The file will get closed by PHP on returning from this function.
+  $fd = fopen($file->uri, 'rb');
+  if (!$fd) {
+    _locale_import_message('The translation import failed, because the file %filename could not be read.', $file);
+    return FALSE;
+  }
+
+  /*
+   * The parser context. Can be:
+   *  - 'COMMENT' (#)
+   *  - 'MSGID' (msgid)
+   *  - 'MSGID_PLURAL' (msgid_plural)
+   *  - 'MSGCTXT' (msgctxt)
+   *  - 'MSGSTR' (msgstr or msgstr[])
+   *  - 'MSGSTR_ARR' (msgstr_arg)
+   */
+  $context = 'COMMENT';
+
+  // Current entry being read.
+  $current = array();
+
+  // Current plurality for 'msgstr[]'.
+  $plural = 0;
+
+  // Current line.
+  $lineno = 0;
+
+  while (!feof($fd)) {
+    // A line should not be longer than 10 * 1024.
+    $line = fgets($fd, 10 * 1024);
+
+    if ($lineno == 0) {
+      // The first line might come with a UTF-8 BOM, which should be removed.
+      $line = str_replace("\xEF\xBB\xBF", '', $line);
+    }
+
+    $lineno++;
+
+    // Trim away the linefeed.
+    $line = trim(strtr($line, array("\\\n" => "")));
+
+    if (!strncmp('#', $line, 1)) {
+      // Lines starting with '#' are comments.
+
+      if ($context == 'COMMENT') {
+        // Already in comment token, insert the comment.
+        $current['#'][] = substr($line, 1);
+      }
+      elseif (($context == 'MSGSTR') || ($context == 'MSGSTR_ARR')) {
+        // We are currently in string token, close it out.
+        _locale_import_one_string($op, $current, $mode, $lang, $file, $group);
+
+        // Start a new entry for the comment.
+        $current         = array();
+        $current['#'][]  = substr($line, 1);
+
+        $context = 'COMMENT';
+      }
+      else {
+        // A comment following any other token is a syntax error.
+        _locale_import_message('The translation file %filename contains an error: "msgstr" was expected but not found on line %line.', $file, $lineno);
+        return FALSE;
+      }
+    }
+    elseif (!strncmp('msgid_plural', $line, 12)) {
+      // A plural form for the current message.
+
+      if ($context != 'MSGID') {
+        // A plural form cannot be added to anything else but the id directly.
+        _locale_import_message('The translation file %filename contains an error: "msgid_plural" was expected but not found on line %line.', $file, $lineno);
+        return FALSE;
+      }
+
+      // Remove 'msgid_plural' and trim away whitespace.
+      $line = trim(substr($line, 12));
+      // At this point, $line should now contain only the plural form.
+
+      $quoted = _locale_import_parse_quoted($line);
+      if ($quoted === FALSE) {
+        // The plural form must be wrapped in quotes.
+        _locale_import_message('The translation file %filename contains a syntax error on line %line.', $file, $lineno);
+        return FALSE;
+      }
+
+      // Append the plural form to the current entry.
+      $current['msgid'] .= "\0" . $quoted;
+
+      $context = 'MSGID_PLURAL';
+    }
+    elseif (!strncmp('msgid', $line, 5)) {
+      // Starting a new message.
+
+      if (($context == 'MSGSTR') || ($context == 'MSGSTR_ARR')) {
+        // We are currently in a message string, close it out.
+        _locale_import_one_string($op, $current, $mode, $lang, $file, $group);
+
+        // Start a new context for the id.
+        $current = array();
+      }
+      elseif ($context == 'MSGID') {
+        // We are currently already in the context, meaning we passed an id with no data.
+        _locale_import_message('The translation file %filename contains an error: "msgid" is unexpected on line %line.', $file, $lineno);
+        return FALSE;
+      }
+
+      // Remove 'msgid' and trim away whitespace.
+      $line = trim(substr($line, 5));
+      // At this point, $line should now contain only the message id.
+
+      $quoted = _locale_import_parse_quoted($line);
+      if ($quoted === FALSE) {
+        // The message id must be wrapped in quotes.
+        _locale_import_message('The translation file %filename contains a syntax error on line %line.', $file, $lineno);
+        return FALSE;
+      }
+
+      $current['msgid'] = $quoted;
+      $context = 'MSGID';
+    }
+    elseif (!strncmp('msgctxt', $line, 7)) {
+      // Starting a new context.
+
+      if (($context == 'MSGSTR') || ($context == 'MSGSTR_ARR')) {
+        // We are currently in a message, start a new one.
+        _locale_import_one_string($op, $current, $mode, $lang, $file, $group);
+        $current = array();
+      }
+      elseif (!empty($current['msgctxt'])) {
+        // A context cannot apply to another context.
+        _locale_import_message('The translation file %filename contains an error: "msgctxt" is unexpected on line %line.', $file, $lineno);
+        return FALSE;
+      }
+
+      // Remove 'msgctxt' and trim away whitespaces.
+      $line = trim(substr($line, 7));
+      // At this point, $line should now contain the context.
+
+      $quoted = _locale_import_parse_quoted($line);
+      if ($quoted === FALSE) {
+        // The context string must be quoted.
+        _locale_import_message('The translation file %filename contains a syntax error on line %line.', $file, $lineno);
+        return FALSE;
+      }
+
+      $current['msgctxt'] = $quoted;
+
+      $context = 'MSGCTXT';
+    }
+    elseif (!strncmp('msgstr[', $line, 7)) {
+      // A message string for a specific plurality.
+
+      if (($context != 'MSGID') && ($context != 'MSGCTXT') && ($context != 'MSGID_PLURAL') && ($context != 'MSGSTR_ARR')) {
+        // Message strings must come after msgid, msgxtxt, msgid_plural, or other msgstr[] entries.
+        _locale_import_message('The translation file %filename contains an error: "msgstr[]" is unexpected on line %line.', $file, $lineno);
+        return FALSE;
+      }
+
+      // Ensure the plurality is terminated.
+      if (strpos($line, ']') === FALSE) {
+        _locale_import_message('The translation file %filename contains a syntax error on line %line.', $file, $lineno);
+        return FALSE;
+      }
+
+      // Extract the plurality.
+      $frombracket = strstr($line, '[');
+      $plural = substr($frombracket, 1, strpos($frombracket, ']') - 1);
+
+      // Skip to the next whitespace and trim away any further whitespace, bringing $line to the message data.
+      $line = trim(strstr($line, " "));
+
+      $quoted = _locale_import_parse_quoted($line);
+      if ($quoted === FALSE) {
+        // The string must be quoted.
+        _locale_import_message('The translation file %filename contains a syntax error on line %line.', $file, $lineno);
+        return FALSE;
+      }
+
+      $current['msgstr'][$plural] = $quoted;
+
+      $context = 'MSGSTR_ARR';
+    }
+    elseif (!strncmp("msgstr", $line, 6)) {
+      // A string for the an id or context.
+
+      if (($context != 'MSGID') && ($context != 'MSGCTXT')) {
+        // Strings are only valid within an id or context scope.
+        _locale_import_message('The translation file %filename contains an error: "msgstr" is unexpected on line %line.', $file, $lineno);
+        return FALSE;
+      }
+
+      // Remove 'msgstr' and trim away away whitespaces.
+      $line = trim(substr($line, 6));
+      // At this point, $line should now contain the message.
+
+      $quoted = _locale_import_parse_quoted($line);
+      if ($quoted === FALSE) {
+        // The string must be quoted.
+        _locale_import_message('The translation file %filename contains a syntax error on line %line.', $file, $lineno);
+        return FALSE;
+      }
+
+      $current['msgstr'] = $quoted;
+
+      $context = 'MSGSTR';
+    }
+    elseif ($line != '') {
+      // Anything that is not a token may be a continuation of a previous token.
+
+      $quoted = _locale_import_parse_quoted($line);
+      if ($quoted === FALSE) {
+        // The string must be quoted.
+        _locale_import_message('The translation file %filename contains a syntax error on line %line.', $file, $lineno);
+        return FALSE;
+      }
+
+      // Append the string to the current context.
+      if (($context == 'MSGID') || ($context == 'MSGID_PLURAL')) {
+        $current['msgid'] .= $quoted;
+      }
+      elseif ($context == 'MSGCTXT') {
+        $current['msgctxt'] .= $quoted;
+      }
+      elseif ($context == 'MSGSTR') {
+        $current['msgstr'] .= $quoted;
+      }
+      elseif ($context == 'MSGSTR_ARR') {
+        $current['msgstr'][$plural] .= $quoted;
+      }
+      else {
+        // No valid context to append to.
+        _locale_import_message('The translation file %filename contains an error: there is an unexpected string on line %line.', $file, $lineno);
+        return FALSE;
+      }
+    }
+  }
+
+  // End of PO file, closed out the last entry.
+  if (($context == 'MSGSTR') || ($context == 'MSGSTR_ARR')) {
+    _locale_import_one_string($op, $current, $mode, $lang, $file, $group);
+  }
+  elseif ($context != 'COMMENT') {
+    _locale_import_message('The translation file %filename ended unexpectedly at line %line.', $file, $lineno);
+    return FALSE;
+  }
+}
+
+/**
+ * Sets an error message occurred during locale file parsing.
+ *
+ * @param $message
+ *   The message to be translated.
+ * @param $file
+ *   Drupal file object corresponding to the PO file to import.
+ * @param $lineno
+ *   An optional line number argument.
+ */
+function _locale_import_message($message, $file, $lineno = NULL) {
+  $vars = array('%filename' => $file->filename);
+  if (isset($lineno)) {
+    $vars['%line'] = $lineno;
+  }
+  $t = get_t();
+  drupal_set_message($t($message, $vars), 'error');
+}
+
+/**
+ * Imports a string into the database
+ *
+ * @param $op
+ *   Operation to perform: 'db-store', 'db-report', 'mem-store' or 'mem-report'.
+ * @param $value
+ *   Details of the string stored.
+ * @param $mode
+ *   Should existing translations be replaced LOCALE_IMPORT_KEEP or
+ *   LOCALE_IMPORT_OVERWRITE.
+ * @param $lang
+ *   Language to store the string in.
+ * @param $file
+ *   Object representation of file being imported, only required when op is
+ *   'db-store'.
+ * @param $group
+ *   Text group to import PO file into (eg. 'default' for interface
+ *   translations).
+ */
+function _locale_import_one_string($op, $value = NULL, $mode = NULL, $lang = NULL, $file = NULL, $group = 'default') {
+  $report = &drupal_static(__FUNCTION__, array('additions' => 0, 'updates' => 0, 'deletes' => 0, 'skips' => 0));
+  $header_done = &drupal_static(__FUNCTION__ . ':header_done', FALSE);
+  $strings = &drupal_static(__FUNCTION__ . ':strings', array());
+
+  switch ($op) {
+    // Return stored strings
+    case 'mem-report':
+      return $strings;
+
+    // Store string in memory (only supports single strings)
+    case 'mem-store':
+      $strings[isset($value['msgctxt']) ? $value['msgctxt'] : ''][$value['msgid']] = $value['msgstr'];
+      return;
+
+    // Called at end of import to inform the user
+    case 'db-report':
+      return array($header_done, $report['additions'], $report['updates'], $report['deletes'], $report['skips']);
+
+    // Store the string we got in the database.
+    case 'db-store':
+      // We got header information.
+      if ($value['msgid'] == '') {
+        $languages = language_list();
+        if (($mode != LOCALE_IMPORT_KEEP) || empty($languages[$lang]->plurals)) {
+          // Since we only need to parse the header if we ought to update the
+          // plural formula, only run this if we don't need to keep existing
+          // data untouched or if we don't have an existing plural formula.
+          $header = _locale_import_parse_header($value['msgstr']);
+
+          // Get and store the plural formula if available.
+          if (isset($header["Plural-Forms"]) && $p = _locale_import_parse_plural_forms($header["Plural-Forms"], $file->uri)) {
+            list($nplurals, $plural) = $p;
+            db_update('languages')
+              ->fields(array(
+                'plurals' => $nplurals,
+                'formula' => $plural,
+              ))
+              ->condition('language', $lang)
+              ->execute();
+          }
+        }
+        $header_done = TRUE;
+      }
+
+      else {
+        // Some real string to import.
+        $comments = _locale_import_shorten_comments(empty($value['#']) ? array() : $value['#']);
+
+        if (strpos($value['msgid'], "\0")) {
+          // This string has plural versions.
+          $english = explode("\0", $value['msgid'], 2);
+          $entries = array_keys($value['msgstr']);
+          for ($i = 3; $i <= count($entries); $i++) {
+            $english[] = $english[1];
+          }
+          $translation = array_map('_locale_import_append_plural', $value['msgstr'], $entries);
+          $english = array_map('_locale_import_append_plural', $english, $entries);
+          foreach ($translation as $key => $trans) {
+            if ($key == 0) {
+              $plid = 0;
+            }
+            $plid = _locale_import_one_string_db($report, $lang, isset($value['msgctxt']) ? $value['msgctxt'] : '', $english[$key], $trans, $group, $comments, $mode, $plid, $key);
+          }
+        }
+
+        else {
+          // A simple string to import.
+          $english = $value['msgid'];
+          $translation = $value['msgstr'];
+          _locale_import_one_string_db($report, $lang, isset($value['msgctxt']) ? $value['msgctxt'] : '', $english, $translation, $group, $comments, $mode);
+        }
+      }
+  } // end of db-store operation
+}
+
+/**
+ * Import one string into the database.
+ *
+ * @param $report
+ *   Report array summarizing the number of changes done in the form:
+ *   array(inserts, updates, deletes).
+ * @param $langcode
+ *   Language code to import string into.
+ * @param $context
+ *   The context of this string.
+ * @param $source
+ *   Source string.
+ * @param $translation
+ *   Translation to language specified in $langcode.
+ * @param $textgroup
+ *   Name of textgroup to store translation in.
+ * @param $location
+ *   Location value to save with source string.
+ * @param $mode
+ *   Import mode to use, LOCALE_IMPORT_KEEP or LOCALE_IMPORT_OVERWRITE.
+ * @param $plid
+ *   Optional plural ID to use.
+ * @param $plural
+ *   Optional plural value to use.
+ *
+ * @return
+ *   The string ID of the existing string modified or the new string added.
+ */
+function _locale_import_one_string_db(&$report, $langcode, $context, $source, $translation, $textgroup, $location, $mode, $plid = 0, $plural = 0) {
+  $lid = db_query("SELECT lid FROM {locales_source} WHERE source = :source AND context = :context AND textgroup = :textgroup", array(':source' => $source, ':context' => $context, ':textgroup' => $textgroup))->fetchField();
+
+  if (!empty($translation)) {
+    // Skip this string unless it passes a check for dangerous code.
+    // Text groups other than default still can contain HTML tags
+    // (i.e. translatable blocks).
+    if ($textgroup == "default" && !locale_string_is_safe($translation)) {
+      $report['skips']++;
+      $lid = 0;
+    }
+    elseif ($lid) {
+      // We have this source string saved already.
+      db_update('locales_source')
+        ->fields(array(
+          'location' => $location,
+        ))
+        ->condition('lid', $lid)
+        ->execute();
+
+      $exists = db_query("SELECT COUNT(lid) FROM {locales_target} WHERE lid = :lid AND language = :language", array(':lid' => $lid, ':language' => $langcode))->fetchField();
+
+      if (!$exists) {
+        // No translation in this language.
+        db_insert('locales_target')
+          ->fields(array(
+            'lid' => $lid,
+            'language' => $langcode,
+            'translation' => $translation,
+            'plid' => $plid,
+            'plural' => $plural,
+          ))
+          ->execute();
+
+        $report['additions']++;
+      }
+      elseif ($mode == LOCALE_IMPORT_OVERWRITE) {
+        // Translation exists, only overwrite if instructed.
+        db_update('locales_target')
+          ->fields(array(
+            'translation' => $translation,
+            'plid' => $plid,
+            'plural' => $plural,
+          ))
+          ->condition('language', $langcode)
+          ->condition('lid', $lid)
+          ->execute();
+
+        $report['updates']++;
+      }
+    }
+    else {
+      // No such source string in the database yet.
+      $lid = db_insert('locales_source')
+        ->fields(array(
+          'location' => $location,
+          'source' => $source,
+          'context' => (string) $context,
+          'textgroup' => $textgroup,
+        ))
+        ->execute();
+
+      db_insert('locales_target')
+        ->fields(array(
+           'lid' => $lid,
+           'language' => $langcode,
+           'translation' => $translation,
+           'plid' => $plid,
+           'plural' => $plural
+        ))
+        ->execute();
+
+      $report['additions']++;
+    }
+  }
+  elseif ($mode == LOCALE_IMPORT_OVERWRITE) {
+    // Empty translation, remove existing if instructed.
+    db_delete('locales_target')
+      ->condition('language', $langcode)
+      ->condition('lid', $lid)
+      ->condition('plid', $plid)
+      ->condition('plural', $plural)
+      ->execute();
+
+    $report['deletes']++;
+  }
+
+  return $lid;
+}
+
+/**
+ * Parses a Gettext Portable Object file header
+ *
+ * @param $header
+ *   A string containing the complete header.
+ *
+ * @return
+ *   An associative array of key-value pairs.
+ */
+function _locale_import_parse_header($header) {
+  $header_parsed = array();
+  $lines = array_map('trim', explode("\n", $header));
+  foreach ($lines as $line) {
+    if ($line) {
+      list($tag, $contents) = explode(":", $line, 2);
+      $header_parsed[trim($tag)] = trim($contents);
+    }
+  }
+  return $header_parsed;
+}
+
+/**
+ * Parses a Plural-Forms entry from a Gettext Portable Object file header
+ *
+ * @param $pluralforms
+ *   A string containing the Plural-Forms entry.
+ * @param $filepath
+ *   A string containing the filepath.
+ *
+ * @return
+ *   An array containing the number of plurals and a
+ *   formula in PHP for computing the plural form.
+ */
+function _locale_import_parse_plural_forms($pluralforms, $filepath) {
+  // First, delete all whitespace
+  $pluralforms = strtr($pluralforms, array(" " => "", "\t" => ""));
+
+  // Select the parts that define nplurals and plural
+  $nplurals = strstr($pluralforms, "nplurals=");
+  if (strpos($nplurals, ";")) {
+    $nplurals = substr($nplurals, 9, strpos($nplurals, ";") - 9);
+  }
+  else {
+    return FALSE;
+  }
+  $plural = strstr($pluralforms, "plural=");
+  if (strpos($plural, ";")) {
+    $plural = substr($plural, 7, strpos($plural, ";") - 7);
+  }
+  else {
+    return FALSE;
+  }
+
+  // Get PHP version of the plural formula
+  $plural = _locale_import_parse_arithmetic($plural);
+
+  if ($plural !== FALSE) {
+    return array($nplurals, $plural);
+  }
+  else {
+    drupal_set_message(t('The translation file %filepath contains an error: the plural formula could not be parsed.', array('%filepath' => $filepath)), 'error');
+    return FALSE;
+  }
+}
+
+/**
+ * Parses and sanitizes an arithmetic formula into a PHP expression
+ *
+ * While parsing, we ensure, that the operators have the right
+ * precedence and associativity.
+ *
+ * @param $string
+ *   A string containing the arithmetic formula.
+ *
+ * @return
+ *   The PHP version of the formula.
+ */
+function _locale_import_parse_arithmetic($string) {
+  // Operator precedence table
+  $precedence = array("(" => -1, ")" => -1, "?" => 1, ":" => 1, "||" => 3, "&&" => 4, "==" => 5, "!=" => 5, "<" => 6, ">" => 6, "<=" => 6, ">=" => 6, "+" => 7, "-" => 7, "*" => 8, "/" => 8, "%" => 8);
+  // Right associativity
+  $right_associativity = array("?" => 1, ":" => 1);
+
+  $tokens = _locale_import_tokenize_formula($string);
+
+  // Parse by converting into infix notation then back into postfix
+  // Operator stack - holds math operators and symbols
+  $operator_stack = array();
+  // Element Stack - holds data to be operated on
+  $element_stack = array();
+
+  foreach ($tokens as $token) {
+    $current_token = $token;
+
+    // Numbers and the $n variable are simply pushed into $element_stack
+    if (is_numeric($token)) {
+      $element_stack[] = $current_token;
+    }
+    elseif ($current_token == "n") {
+      $element_stack[] = '$n';
+    }
+    elseif ($current_token == "(") {
+      $operator_stack[] = $current_token;
+    }
+    elseif ($current_token == ")") {
+      $topop = array_pop($operator_stack);
+      while (isset($topop) && ($topop != "(")) {
+        $element_stack[] = $topop;
+        $topop = array_pop($operator_stack);
+      }
+    }
+    elseif (!empty($precedence[$current_token])) {
+      // If it's an operator, then pop from $operator_stack into $element_stack until the
+      // precedence in $operator_stack is less than current, then push into $operator_stack
+      $topop = array_pop($operator_stack);
+      while (isset($topop) && ($precedence[$topop] >= $precedence[$current_token]) && !(($precedence[$topop] == $precedence[$current_token]) && !empty($right_associativity[$topop]) && !empty($right_associativity[$current_token]))) {
+        $element_stack[] = $topop;
+        $topop = array_pop($operator_stack);
+      }
+      if ($topop) {
+        $operator_stack[] = $topop;   // Return element to top
+      }
+      $operator_stack[] = $current_token;      // Parentheses are not needed
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  // Flush operator stack
+  $topop = array_pop($operator_stack);
+  while ($topop != NULL) {
+    $element_stack[] = $topop;
+    $topop = array_pop($operator_stack);
+  }
+
+  // Now extract formula from stack
+  $previous_size = count($element_stack) + 1;
+  while (count($element_stack) < $previous_size) {
+    $previous_size = count($element_stack);
+    for ($i = 2; $i < count($element_stack); $i++) {
+      $op = $element_stack[$i];
+      if (!empty($precedence[$op])) {
+        $f = "";
+        if ($op == ":") {
+          $f = $element_stack[$i - 2] . "):" . $element_stack[$i - 1] . ")";
+        }
+        elseif ($op == "?") {
+          $f = "(" . $element_stack[$i - 2] . "?(" . $element_stack[$i - 1];
+        }
+        else {
+          $f = "(" . $element_stack[$i - 2] . $op . $element_stack[$i - 1] . ")";
+        }
+        array_splice($element_stack, $i - 2, 3, $f);
+        break;
+      }
+    }
+  }
+
+  // If only one element is left, the number of operators is appropriate
+  if (count($element_stack) == 1) {
+    return $element_stack[0];
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
+ * Backward compatible implementation of token_get_all() for formula parsing
+ *
+ * @param $string
+ *   A string containing the arithmetic formula.
+ *
+ * @return
+ *   The PHP version of the formula.
+ */
+function _locale_import_tokenize_formula($formula) {
+  $formula = str_replace(" ", "", $formula);
+  $tokens = array();
+  for ($i = 0; $i < strlen($formula); $i++) {
+    if (is_numeric($formula[$i])) {
+      $num = $formula[$i];
+      $j = $i + 1;
+      while ($j < strlen($formula) && is_numeric($formula[$j])) {
+        $num .= $formula[$j];
+        $j++;
+      }
+      $i = $j - 1;
+      $tokens[] = $num;
+    }
+    elseif ($pos = strpos(" =<>!&|", $formula[$i])) { // We won't have a space
+      $next = $formula[$i + 1];
+      switch ($pos) {
+        case 1:
+        case 2:
+        case 3:
+        case 4:
+          if ($next == '=') {
+            $tokens[] = $formula[$i] . '=';
+            $i++;
+          }
+          else {
+            $tokens[] = $formula[$i];
+          }
+          break;
+        case 5:
+          if ($next == '&') {
+            $tokens[] = '&&';
+            $i++;
+          }
+          else {
+            $tokens[] = $formula[$i];
+          }
+          break;
+        case 6:
+          if ($next == '|') {
+            $tokens[] = '||';
+            $i++;
+          }
+          else {
+            $tokens[] = $formula[$i];
+          }
+          break;
+      }
+    }
+    else {
+      $tokens[] = $formula[$i];
+    }
+  }
+  return $tokens;
+}
+
+/**
+ * Modify a string to contain proper count indices
+ *
+ * This is a callback function used via array_map()
+ *
+ * @param $entry
+ *   An array element.
+ * @param $key
+ *   Index of the array element.
+ */
+function _locale_import_append_plural($entry, $key) {
+  // No modifications for 0, 1
+  if ($key == 0 || $key == 1) {
+    return $entry;
+  }
+
+  // First remove any possibly false indices, then add new ones
+  $entry = preg_replace('/(@count)\[[0-9]\]/', '\\1', $entry);
+  return preg_replace('/(@count)/', "\\1[$key]", $entry);
+}
+
+/**
+ * Generate a short, one string version of the passed comment array
+ *
+ * @param $comment
+ *   An array of strings containing a comment.
+ *
+ * @return
+ *   Short one string version of the comment.
+ */
+function _locale_import_shorten_comments($comment) {
+  $comm = '';
+  while (count($comment)) {
+    $test = $comm . substr(array_shift($comment), 1) . ', ';
+    if (strlen($comm) < 130) {
+      $comm = $test;
+    }
+    else {
+      break;
+    }
+  }
+  return trim(substr($comm, 0, -2));
+}
+
+/**
+ * Parses a string in quotes
+ *
+ * @param $string
+ *   A string specified with enclosing quotes.
+ *
+ * @return
+ *   The string parsed from inside the quotes.
+ */
+function _locale_import_parse_quoted($string) {
+  if (substr($string, 0, 1) != substr($string, -1, 1)) {
+    return FALSE;   // Start and end quotes must be the same
+  }
+  $quote = substr($string, 0, 1);
+  $string = substr($string, 1, -1);
+  if ($quote == '"') {        // Double quotes: strip slashes
+    return stripcslashes($string);
+  }
+  elseif ($quote == "'") {  // Simple quote: return as-is
+    return $string;
+  }
+  else {
+    return FALSE;             // Unrecognized quote
+  }
+}
+/**
+ * @} End of "locale-api-import-export"
+ */
+
+/**
+ * Parses a JavaScript file, extracts strings wrapped in Drupal.t() and
+ * Drupal.formatPlural() and inserts them into the database.
+ */
+function _locale_parse_js_file($filepath) {
+  global $language;
+
+  // The file path might contain a query string, so make sure we only use the
+  // actual file.
+  $parsed_url = drupal_parse_url($filepath);
+  $filepath = $parsed_url['path'];
+  // Load the JavaScript file.
+  $file = file_get_contents($filepath);
+
+  // Match all calls to Drupal.t() in an array.
+  // Note: \s also matches newlines with the 's' modifier.
+  preg_match_all('~
+    [^\w]Drupal\s*\.\s*t\s*                       # match "Drupal.t" with whitespace
+    \(\s*                                         # match "(" argument list start
+    (' . LOCALE_JS_STRING . ')\s*                 # capture string argument
+    (?:,\s*' . LOCALE_JS_OBJECT . '\s*            # optionally capture str args
+      (?:,\s*' . LOCALE_JS_OBJECT_CONTEXT . '\s*) # optionally capture context
+    ?)?                                           # close optional args
+    [,\)]                                         # match ")" or "," to finish
+    ~sx', $file, $t_matches);
+
+  // Match all Drupal.formatPlural() calls in another array.
+  preg_match_all('~
+    [^\w]Drupal\s*\.\s*formatPlural\s*  # match "Drupal.formatPlural" with whitespace
+    \(                                  # match "(" argument list start
+    \s*.+?\s*,\s*                       # match count argument
+    (' . LOCALE_JS_STRING . ')\s*,\s*   # match singular string argument
+    (                             # capture plural string argument
+      (?:                         # non-capturing group to repeat string pieces
+        (?:
+          \'                      # match start of single-quoted string
+          (?:\\\\\'|[^\'])*       # match any character except unescaped single-quote
+          @count                  # match "@count"
+          (?:\\\\\'|[^\'])*       # match any character except unescaped single-quote
+          \'                      # match end of single-quoted string
+          |
+          "                       # match start of double-quoted string
+          (?:\\\\"|[^"])*         # match any character except unescaped double-quote
+          @count                  # match "@count"
+          (?:\\\\"|[^"])*         # match any character except unescaped double-quote
+          "                       # match end of double-quoted string
+        )
+        (?:\s*\+\s*)?             # match "+" with possible whitespace, for str concat
+      )+                          # match multiple because we supports concatenating strs
+    )\s*                          # end capturing of plural string argument
+    (?:,\s*' . LOCALE_JS_OBJECT . '\s*          # optionally capture string args
+      (?:,\s*' . LOCALE_JS_OBJECT_CONTEXT . '\s*)?  # optionally capture context
+    )?
+    [,\)]
+    ~sx', $file, $plural_matches);
+
+  $matches = array();
+
+  // Add strings from Drupal.t().
+  foreach ($t_matches[1] as $key => $string) {
+    $matches[] = array(
+      'string'  => $string,
+      'context' => $t_matches[2][$key],
+    );
+  }
+
+  // Add string from Drupal.formatPlural().
+  foreach ($plural_matches[1] as $key => $string) {
+    $matches[] = array(
+      'string'  => $string,
+      'context' => $plural_matches[3][$key],
+    );
+
+    // If there is also a plural version of this string, add it to the strings array.
+    if (isset($plural_matches[2][$key])) {
+      $matches[] = array(
+        'string'  => $plural_matches[2][$key],
+        'context' => $plural_matches[3][$key],
+      );
+    }
+  }
+
+  foreach ($matches as $key => $match) {
+    // Remove the quotes and string concatenations from the string.
+    $string = implode('', preg_split('~(?<!\\\\)[\'"]\s*\+\s*[\'"]~s', substr($match['string'], 1, -1)));
+    $context = implode('', preg_split('~(?<!\\\\)[\'"]\s*\+\s*[\'"]~s', substr($match['context'], 1, -1)));
+
+    $source = db_query("SELECT lid, location FROM {locales_source} WHERE source = :source AND context = :context AND textgroup = 'default'", array(':source' => $string, ':context' => $context))->fetchObject();
+    if ($source) {
+      // We already have this source string and now have to add the location
+      // to the location column, if this file is not yet present in there.
+      $locations = preg_split('~\s*;\s*~', $source->location);
+
+      if (!in_array($filepath, $locations)) {
+        $locations[] = $filepath;
+        $locations = implode('; ', $locations);
+
+        // Save the new locations string to the database.
+        db_update('locales_source')
+          ->fields(array(
+            'location' => $locations,
+          ))
+          ->condition('lid', $source->lid)
+          ->execute();
+      }
+    }
+    else {
+      // We don't have the source string yet, thus we insert it into the database.
+      db_insert('locales_source')
+        ->fields(array(
+          'location' => $filepath,
+          'source' => $string,
+          'context' => $context,
+          'textgroup' => 'default',
+        ))
+        ->execute();
+    }
+  }
+}
+
+/**
+ * @addtogroup locale-api-import-export
+ * @{
+ */
+
+/**
+ * Generates a structured array of all strings with translations in
+ * $language, if given. This array can be used to generate an export
+ * of the string in the database.
+ *
+ * @param $language
+ *   Language object to generate the output for, or NULL if generating
+ *   translation template.
+ * @param $group
+ *   Text group to export PO file from (eg. 'default' for interface
+ *   translations).
+ */
+function _locale_export_get_strings($language = NULL, $group = 'default') {
+  if (isset($language)) {
+    $result = db_query("SELECT s.lid, s.source, s.context, s.location, t.translation, t.plid, t.plural FROM {locales_source} s LEFT JOIN {locales_target} t ON s.lid = t.lid AND t.language = :language WHERE s.textgroup = :textgroup ORDER BY t.plid, t.plural", array(':language' => $language->language, ':textgroup' => $group));
+  }
+  else {
+    $result = db_query("SELECT s.lid, s.source, s.context, s.location, t.plid, t.plural FROM {locales_source} s LEFT JOIN {locales_target} t ON s.lid = t.lid WHERE s.textgroup = :textgroup ORDER BY t.plid, t.plural", array(':textgroup' => $group));
+  }
+  $strings = array();
+  foreach ($result as $child) {
+    $string = array(
+      'comment'     => $child->location,
+      'source'      => $child->source,
+      'context'     => $child->context,
+      'translation' => isset($child->translation) ? $child->translation : '',
+    );
+    if ($child->plid) {
+      // Has a parent lid. Since we process in the order of plids,
+      // we already have the parent in the array, so we can add the
+      // lid to the next plural version to it. This builds a linked
+      // list of plurals.
+      $string['child'] = TRUE;
+      $strings[$child->plid]['plural'] = $child->lid;
+    }
+    $strings[$child->lid] = $string;
+  }
+  return $strings;
+}
+
+/**
+ * Generates the PO(T) file contents for given strings.
+ *
+ * @param $language
+ *   Language object to generate the output for, or NULL if generating
+ *   translation template.
+ * @param $strings
+ *   Array of strings to export. See _locale_export_get_strings()
+ *   on how it should be formatted.
+ * @param $header
+ *   The header portion to use for the output file. Defaults
+ *   are provided for PO and POT files.
+ */
+function _locale_export_po_generate($language = NULL, $strings = array(), $header = NULL) {
+  global $user;
+
+  if (!isset($header)) {
+    if (isset($language)) {
+      $header = '# ' . $language->name . ' translation of ' . variable_get('site_name', 'Drupal') . "\n";
+      $header .= '# Generated by ' . $user->name . ' <' . $user->mail . ">\n";
+      $header .= "#\n";
+      $header .= "msgid \"\"\n";
+      $header .= "msgstr \"\"\n";
+      $header .= "\"Project-Id-Version: PROJECT VERSION\\n\"\n";
+      $header .= "\"POT-Creation-Date: " . date("Y-m-d H:iO") . "\\n\"\n";
+      $header .= "\"PO-Revision-Date: " . date("Y-m-d H:iO") . "\\n\"\n";
+      $header .= "\"Last-Translator: NAME <EMAIL@ADDRESS>\\n\"\n";
+      $header .= "\"Language-Team: LANGUAGE <EMAIL@ADDRESS>\\n\"\n";
+      $header .= "\"MIME-Version: 1.0\\n\"\n";
+      $header .= "\"Content-Type: text/plain; charset=utf-8\\n\"\n";
+      $header .= "\"Content-Transfer-Encoding: 8bit\\n\"\n";
+      if ($language->formula && $language->plurals) {
+        $header .= "\"Plural-Forms: nplurals=" . $language->plurals . "; plural=" . strtr($language->formula, array('$' => '')) . ";\\n\"\n";
+      }
+    }
+    else {
+      $header = "# LANGUAGE translation of PROJECT\n";
+      $header .= "# Copyright (c) YEAR NAME <EMAIL@ADDRESS>\n";
+      $header .= "#\n";
+      $header .= "msgid \"\"\n";
+      $header .= "msgstr \"\"\n";
+      $header .= "\"Project-Id-Version: PROJECT VERSION\\n\"\n";
+      $header .= "\"POT-Creation-Date: " . date("Y-m-d H:iO") . "\\n\"\n";
+      $header .= "\"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\\n\"\n";
+      $header .= "\"Last-Translator: NAME <EMAIL@ADDRESS>\\n\"\n";
+      $header .= "\"Language-Team: LANGUAGE <EMAIL@ADDRESS>\\n\"\n";
+      $header .= "\"MIME-Version: 1.0\\n\"\n";
+      $header .= "\"Content-Type: text/plain; charset=utf-8\\n\"\n";
+      $header .= "\"Content-Transfer-Encoding: 8bit\\n\"\n";
+      $header .= "\"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n\"\n";
+    }
+  }
+
+  $output = $header . "\n";
+
+  foreach ($strings as $lid => $string) {
+    // Only process non-children, children are output below their parent.
+    if (!isset($string['child'])) {
+      if ($string['comment']) {
+        $output .= '#: ' . $string['comment'] . "\n";
+      }
+      if (!empty($string['context'])) {
+        $output .= 'msgctxt ' . _locale_export_string($string['context']);
+      }
+      $output .= 'msgid ' . _locale_export_string($string['source']);
+      if (!empty($string['plural'])) {
+        $plural = $string['plural'];
+        $output .= 'msgid_plural ' . _locale_export_string($strings[$plural]['source']);
+        if (isset($language)) {
+          $translation = $string['translation'];
+          for ($i = 0; $i < $language->plurals; $i++) {
+            $output .= 'msgstr[' . $i . '] ' . _locale_export_string($translation);
+            if ($plural) {
+              $translation = _locale_export_remove_plural($strings[$plural]['translation']);
+              $plural = isset($strings[$plural]['plural']) ? $strings[$plural]['plural'] : 0;
+            }
+            else {
+              $translation = '';
+            }
+          }
+        }
+        else {
+          $output .= 'msgstr[0] ""' . "\n";
+          $output .= 'msgstr[1] ""' . "\n";
+        }
+      }
+      else {
+        $output .= 'msgstr ' . _locale_export_string($string['translation']);
+      }
+      $output .= "\n";
+    }
+  }
+  return $output;
+}
+
+/**
+ * Write a generated PO or POT file to the output.
+ *
+ * @param $language
+ *   Language object to generate the output for, or NULL if generating
+ *   translation template.
+ * @param $output
+ *   The PO(T) file to output as a string. See _locale_export_generate_po()
+ *   on how it can be generated.
+ */
+function _locale_export_po($language = NULL, $output = NULL) {
+  // Log the export event.
+  if (isset($language)) {
+    $filename = $language->language . '.po';
+    watchdog('locale', 'Exported %locale translation file: %filename.', array('%locale' => $language->name, '%filename' => $filename));
+  }
+  else {
+    $filename = 'drupal.pot';
+    watchdog('locale', 'Exported translation file: %filename.', array('%filename' => $filename));
+  }
+  // Download the file for the client.
+  header("Content-Disposition: attachment; filename=$filename");
+  header("Content-Type: text/plain; charset=utf-8");
+  print $output;
+  drupal_exit();
+}
+
+/**
+ * Print out a string on multiple lines
+ */
+function _locale_export_string($str) {
+  $stri = addcslashes($str, "\0..\37\\\"");
+  $parts = array();
+
+  // Cut text into several lines
+  while ($stri != "") {
+    $i = strpos($stri, "\\n");
+    if ($i === FALSE) {
+      $curstr = $stri;
+      $stri = "";
+    }
+    else {
+      $curstr = substr($stri, 0, $i + 2);
+      $stri = substr($stri, $i + 2);
+    }
+    $curparts = explode("\n", _locale_export_wrap($curstr, 70));
+    $parts = array_merge($parts, $curparts);
+  }
+
+  // Multiline string
+  if (count($parts) > 1) {
+    return "\"\"\n\"" . implode("\"\n\"", $parts) . "\"\n";
+  }
+  // Single line string
+  elseif (count($parts) == 1) {
+    return "\"$parts[0]\"\n";
+  }
+  // No translation
+  else {
+    return "\"\"\n";
+  }
+}
+
+/**
+ * Custom word wrapping for Portable Object (Template) files.
+ */
+function _locale_export_wrap($str, $len) {
+  $words = explode(' ', $str);
+  $return = array();
+
+  $cur = "";
+  $nstr = 1;
+  while (count($words)) {
+    $word = array_shift($words);
+    if ($nstr) {
+      $cur = $word;
+      $nstr = 0;
+    }
+    elseif (strlen("$cur $word") > $len) {
+      $return[] = $cur . " ";
+      $cur = $word;
+    }
+    else {
+      $cur = "$cur $word";
+    }
+  }
+  $return[] = $cur;
+
+  return implode("\n", $return);
+}
+
+/**
+ * Removes plural index information from a string
+ */
+function _locale_export_remove_plural($entry) {
+  return preg_replace('/(@count)\[[0-9]\]/', '\\1', $entry);
+}
+/**
+ * @} End of "locale-api-import-export"
+ */
+
+/**
+ * @defgroup locale-api-seek Translation search API
+ * @{
+ * Functions to search in translation files.
+ *
+ * These functions provide the functionality to search for specific
+ * translations.
+ */
+
+/**
+ * Perform a string search and display results in a table
+ */
+function _locale_translate_seek() {
+  $output = '';
+
+  // We have at least one criterion to match
+  if (!($query = _locale_translate_seek_query())) {
+    $query = array(
+      'translation' => 'all',
+      'group' => 'all',
+      'language' => 'all',
+      'string' => '',
+    );
+  }
+
+  $sql_query = db_select('locales_source', 's');
+
+  $limit_language = NULL;
+  if ($query['language'] != 'en' && $query['language'] != 'all') {
+    $sql_query->leftJoin('locales_target', 't', "t.lid = s.lid AND t.language = :langcode", array(':langcode' => $query['language']));
+    $limit_language = $query['language'];
+  }
+  else {
+    $sql_query->leftJoin('locales_target', 't', 't.lid = s.lid');
+  }
+
+  $sql_query->fields('s', array('source', 'location', 'context', 'lid', 'textgroup'));
+  $sql_query->fields('t', array('translation', 'language'));
+
+  // Compute LIKE section.
+  switch ($query['translation']) {
+    case 'translated':
+      $sql_query->condition('t.translation', '%' . db_like($query['string']) . '%', 'LIKE');
+      $sql_query->orderBy('t.translation', 'DESC');
+      break;
+    case 'untranslated':
+      $sql_query->condition(db_and()
+        ->condition('s.source', '%' . db_like($query['string']) . '%', 'LIKE')
+        ->isNull('t.translation')
+      );
+      $sql_query->orderBy('s.source');
+      break;
+    case 'all' :
+    default:
+      $condition = db_or()
+        ->condition('s.source', '%' . db_like($query['string']) . '%', 'LIKE');
+      if ($query['language'] != 'en') {
+        // Only search in translations if the language is not forced to English.
+        $condition->condition('t.translation', '%' . db_like($query['string']) . '%', 'LIKE');
+      }
+      $sql_query->condition($condition);
+      break;
+  }
+
+  // Add a condition on the text group.
+  if (!empty($query['group']) && $query['group'] != 'all') {
+    $sql_query->condition('s.textgroup', $query['group']);
+  }
+
+  $sql_query = $sql_query->extend('PagerDefault')->limit(50);
+  $locales = $sql_query->execute();
+
+  $groups = module_invoke_all('locale', 'groups');
+  $header = array(t('Text group'), t('String'), t('Context'), ($limit_language) ? t('Language') : t('Languages'), array('data' => t('Operations'), 'colspan' => '2'));
+
+  $strings = array();
+  foreach ($locales as $locale) {
+    if (!isset($strings[$locale->lid])) {
+      $strings[$locale->lid] = array(
+        'group' => $locale->textgroup,
+        'languages' => array(),
+        'location' => $locale->location,
+        'source' => $locale->source,
+        'context' => $locale->context,
+      );
+    }
+    if (isset($locale->language)) {
+      $strings[$locale->lid]['languages'][$locale->language] = $locale->translation;
+    }
+  }
+
+  $rows = array();
+  foreach ($strings as $lid => $string) {
+    $rows[] = array(
+      $groups[$string['group']],
+      array('data' => check_plain(truncate_utf8($string['source'], 150, FALSE, TRUE)) . '<br /><small>' . $string['location'] . '</small>'),
+      $string['context'],
+      array('data' => _locale_translate_language_list($string['languages'], $limit_language), 'align' => 'center'),
+      array('data' => l(t('edit'), "admin/config/regional/translate/edit/$lid", array('query' => drupal_get_destination())), 'class' => array('nowrap')),
+      array('data' => l(t('delete'), "admin/config/regional/translate/delete/$lid", array('query' => drupal_get_destination())), 'class' => array('nowrap')),
+    );
+  }
+
+  $output .= theme('table', array('header' => $header, 'rows' => $rows, 'empty' => t('No strings available.')));
+  $output .= theme('pager');
+
+  return $output;
+}
+
+/**
+ * Build array out of search criteria specified in request variables
+ */
+function _locale_translate_seek_query() {
+  $query = &drupal_static(__FUNCTION__);
+  if (!isset($query)) {
+    $query = array();
+    $fields = array('string', 'language', 'translation', 'group');
+    foreach ($fields as $field) {
+      if (isset($_SESSION['locale_translation_filter'][$field])) {
+        $query[$field] = $_SESSION['locale_translation_filter'][$field];
+      }
+    }
+  }
+  return $query;
+}
+
+/**
+ * Force the JavaScript translation file(s) to be refreshed.
+ *
+ * This function sets a refresh flag for a specified language, or all
+ * languages except English, if none specified. JavaScript translation
+ * files are rebuilt (with locale_update_js_files()) the next time a
+ * request is served in that language.
+ *
+ * @param $langcode
+ *   The language code for which the file needs to be refreshed.
+ *
+ * @return
+ *   New content of the 'javascript_parsed' variable.
+ */
+function _locale_invalidate_js($langcode = NULL) {
+  $parsed = variable_get('javascript_parsed', array());
+
+  if (empty($langcode)) {
+    // Invalidate all languages.
+    $languages = language_list();
+    unset($languages['en']);
+    foreach ($languages as $lcode => $data) {
+      $parsed['refresh:' . $lcode] = 'waiting';
+    }
+  }
+  else {
+    // Invalidate single language.
+    $parsed['refresh:' . $langcode] = 'waiting';
+  }
+
+  variable_set('javascript_parsed', $parsed);
+  return $parsed;
+}
+
+/**
+ * (Re-)Creates the JavaScript translation file for a language.
+ *
+ * @param $language
+ *   The language, the translation file should be (re)created for.
+ */
+function _locale_rebuild_js($langcode = NULL) {
+  if (!isset($langcode)) {
+    global $language;
+  }
+  else {
+    // Get information about the locale.
+    $languages = language_list();
+    $language = $languages[$langcode];
+  }
+
+  // Construct the array for JavaScript translations.
+  // Only add strings with a translation to the translations array.
+  $result = db_query("SELECT s.lid, s.source, s.context, t.translation FROM {locales_source} s INNER JOIN {locales_target} t ON s.lid = t.lid AND t.language = :language WHERE s.location LIKE '%.js%' AND s.textgroup = :textgroup", array(':language' => $language->language, ':textgroup' => 'default'));
+
+  $translations = array();
+  foreach ($result as $data) {
+    $translations[$data->context][$data->source] = $data->translation;
+  }
+
+  // Construct the JavaScript file, if there are translations.
+  $data_hash = NULL;
+  $data = $status = '';
+  if (!empty($translations)) {
+
+    $data = "Drupal.locale = { ";
+
+    if (!empty($language->formula)) {
+      $data .= "'pluralFormula': function (\$n) { return Number({$language->formula}); }, ";
+    }
+
+    $data .= "'strings': " . drupal_json_encode($translations) . " };";
+    $data_hash = drupal_hash_base64($data);
+  }
+
+  // Construct the filepath where JS translation files are stored.
+  // There is (on purpose) no front end to edit that variable.
+  $dir = 'public://' . variable_get('locale_js_directory', 'languages');
+
+  // Delete old file, if we have no translations anymore, or a different file to be saved.
+  $changed_hash = $language->javascript != $data_hash;
+  if (!empty($language->javascript) && (!$data || $changed_hash)) {
+    file_unmanaged_delete($dir . '/' . $language->language . '_' . $language->javascript . '.js');
+    $language->javascript = '';
+    $status = 'deleted';
+  }
+
+  // Only create a new file if the content has changed or the original file got
+  // lost.
+  $dest = $dir . '/' . $language->language . '_' . $data_hash . '.js';
+  if ($data && ($changed_hash || !file_exists($dest))) {
+    // Ensure that the directory exists and is writable, if possible.
+    file_prepare_directory($dir, FILE_CREATE_DIRECTORY);
+
+    // Save the file.
+    if (file_unmanaged_save_data($data, $dest)) {
+      $language->javascript = $data_hash;
+      // If we deleted a previous version of the file and we replace it with a
+      // new one we have an update.
+      if ($status == 'deleted') {
+        $status = 'updated';
+      }
+      // If the file did not exist previously and the data has changed we have
+      // a fresh creation.
+      elseif ($changed_hash) {
+        $status = 'created';
+      }
+      // If the data hash is unchanged the translation was lost and has to be
+      // rebuilt.
+      else {
+        $status = 'rebuilt';
+      }
+    }
+    else {
+      $language->javascript = '';
+      $status = 'error';
+    }
+  }
+
+  // Save the new JavaScript hash (or an empty value if the file just got
+  // deleted). Act only if some operation was executed that changed the hash
+  // code.
+  if ($status && $changed_hash) {
+    db_update('languages')
+      ->fields(array(
+        'javascript' => $language->javascript,
+      ))
+      ->condition('language', $language->language)
+      ->execute();
+
+    // Update the default language variable if the default language has been altered.
+    // This is necessary to keep the variable consistent with the database
+    // version of the language and to prevent checking against an outdated hash.
+    $default_langcode = language_default('language');
+    if ($default_langcode == $language->language) {
+      $default = db_query("SELECT * FROM {languages} WHERE language = :language", array(':language' => $default_langcode))->fetchObject();
+      variable_set('language_default', $default);
+    }
+  }
+
+  // Log the operation and return success flag.
+  switch ($status) {
+    case 'updated':
+      watchdog('locale', 'Updated JavaScript translation file for the language %language.', array('%language' => t($language->name)));
+      return TRUE;
+    case 'rebuilt':
+      watchdog('locale', 'JavaScript translation file %file.js was lost.', array('%file' => $language->javascript), WATCHDOG_WARNING);
+      // Proceed to the 'created' case as the JavaScript translation file has
+      // been created again.
+    case 'created':
+      watchdog('locale', 'Created JavaScript translation file for the language %language.', array('%language' => t($language->name)));
+      return TRUE;
+    case 'deleted':
+      watchdog('locale', 'Removed JavaScript translation file for the language %language, because no translations currently exist for that language.', array('%language' => t($language->name)));
+      return TRUE;
+    case 'error':
+      watchdog('locale', 'An error occurred during creation of the JavaScript translation file for the language %language.', array('%language' => t($language->name)), WATCHDOG_ERROR);
+      return FALSE;
+    default:
+      // No operation needed.
+      return TRUE;
+  }
+}
+
+/**
+ * List languages in search result table
+ */
+function _locale_translate_language_list($translation, $limit_language) {
+  // Add CSS.
+  drupal_add_css(drupal_get_path('module', 'locale') . '/locale.css');
+
+  $languages = language_list();
+  unset($languages['en']);
+  $output = '';
+  foreach ($languages as $langcode => $language) {
+    if (!$limit_language || $limit_language == $langcode) {
+      $output .= (!empty($translation[$langcode])) ? $langcode . ' ' : "<em class=\"locale-untranslated\">$langcode</em> ";
+    }
+  }
+
+  return $output;
+}
+/**
+ * @} End of "locale-api-seek"
+ */
+
+/**
+ * @defgroup locale-api-predefined List of predefined languages
+ * @{
+ * API to provide a list of predefined languages.
+ */
+
+/**
+ * Prepares the language code list for a select form item with only the unsupported ones
+ */
+function _locale_prepare_predefined_list() {
+  include_once DRUPAL_ROOT . '/includes/iso.inc';
+  $languages = language_list();
+  $predefined = _locale_get_predefined_list();
+  foreach ($predefined as $key => $value) {
+    if (isset($languages[$key])) {
+      unset($predefined[$key]);
+      continue;
+    }
+    // Include native name in output, if possible
+    if (count($value) > 1) {
+      $tname = t($value[0]);
+      $predefined[$key] = ($tname == $value[1]) ? $tname : "$tname ($value[1])";
+    }
+    else {
+      $predefined[$key] = t($value[0]);
+    }
+  }
+  asort($predefined);
+  return $predefined;
+}
+
+/**
+ * @} End of "locale-api-languages-predefined"
+ */
+
+/**
+ * @defgroup locale-autoimport Automatic interface translation import
+ * @{
+ * Functions to create batches for importing translations.
+ *
+ * These functions can be used to import translations for installed
+ * modules.
+ */
+
+/**
+ * Prepare a batch to import translations for all enabled
+ * modules in a given language.
+ *
+ * @param $langcode
+ *   Language code to import translations for.
+ * @param $finished
+ *   Optional finished callback for the batch.
+ * @param $skip
+ *   Array of component names to skip. Used in the installer for the
+ *   second pass import, when most components are already imported.
+ *
+ * @return
+ *   A batch structure or FALSE if no files found.
+ */
+function locale_batch_by_language($langcode, $finished = NULL, $skip = array()) {
+  // Collect all files to import for all enabled modules and themes.
+  $files = array();
+  $components = array();
+  $query = db_select('system', 's');
+  $query->fields('s', array('name', 'filename'));
+  $query->condition('s.status', 1);
+  if (count($skip)) {
+    $query->condition('name', $skip, 'NOT IN');
+  }
+  $result = $query->execute();
+  foreach ($result as $component) {
+    // Collect all files for all components, names as $langcode.po or
+    // with names ending with $langcode.po. This allows for filenames
+    // like node-module.de.po to let translators use small files and
+    // be able to import in smaller chunks.
+    $files = array_merge($files, file_scan_directory(dirname($component->filename) . '/translations', '/(^|\.)' . $langcode . '\.po$/', array('recurse' => FALSE)));
+    $components[] = $component->name;
+  }
+
+  return _locale_batch_build($files, $finished, $components);
+}
+
+/**
+ * Prepare a batch to run when installing modules or enabling themes.
+ *
+ * This batch will import translations for the newly added components
+ * in all the languages already set up on the site.
+ *
+ * @param $components
+ *   An array of component (theme and/or module) names to import
+ *   translations for.
+ * @param $finished
+ *   Optional finished callback for the batch.
+ */
+function locale_batch_by_component($components, $finished = '_locale_batch_system_finished') {
+  $files = array();
+  $languages = language_list('enabled');
+  unset($languages[1]['en']);
+  if (count($languages[1])) {
+    $language_list = join('|', array_keys($languages[1]));
+    // Collect all files to import for all $components.
+    $result = db_query("SELECT name, filename FROM {system} WHERE status = 1");
+    foreach ($result as $component) {
+      if (in_array($component->name, $components)) {
+        // Collect all files for this component in all enabled languages, named
+        // as $langcode.po or with names ending with $langcode.po. This allows
+        // for filenames like node-module.de.po to let translators use small
+        // files and be able to import in smaller chunks.
+        $files = array_merge($files, file_scan_directory(dirname($component->filename) . '/translations', '/(^|\.)(' . $language_list . ')\.po$/', array('recurse' => FALSE)));
+      }
+    }
+    return _locale_batch_build($files, $finished);
+  }
+  return FALSE;
+}
+
+/**
+ * Build a locale batch from an array of files.
+ *
+ * @param $files
+ *   Array of files to import.
+ * @param $finished
+ *   Optional finished callback for the batch.
+ * @param $components
+ *   Optional list of component names the batch covers. Used in the installer.
+ *
+ * @return
+ *   A batch structure.
+ */
+function _locale_batch_build($files, $finished = NULL, $components = array()) {
+  $t = get_t();
+  if (count($files)) {
+    $operations = array();
+    foreach ($files as $file) {
+      // We call _locale_batch_import for every batch operation.
+      $operations[] = array('_locale_batch_import', array($file->uri));
+    }
+    $batch = array(
+      'operations'    => $operations,
+      'title'         => $t('Importing interface translations'),
+      'init_message'  => $t('Starting import'),
+      'error_message' => $t('Error importing interface translations'),
+      'file'          => 'includes/locale.inc',
+      // This is not a batch API construct, but data passed along to the
+      // installer, so we know what did we import already.
+      '#components'   => $components,
+    );
+    if (isset($finished)) {
+      $batch['finished'] = $finished;
+    }
+    return $batch;
+  }
+  return FALSE;
+}
+
+/**
+ * Perform interface translation import as a batch step.
+ *
+ * @param $filepath
+ *   Path to a file to import.
+ * @param $results
+ *   Contains a list of files imported.
+ */
+function _locale_batch_import($filepath, &$context) {
+  // The filename is either {langcode}.po or {prefix}.{langcode}.po, so
+  // we can extract the language code to use for the import from the end.
+  if (preg_match('!(/|\.)([^\./]+)\.po$!', $filepath, $langcode)) {
+    $file = (object) array('filename' => drupal_basename($filepath), 'uri' => $filepath);
+    _locale_import_read_po('db-store', $file, LOCALE_IMPORT_KEEP, $langcode[2]);
+    $context['results'][] = $filepath;
+  }
+}
+
+/**
+ * Finished callback of system page locale import batch.
+ * Inform the user of translation files imported.
+ */
+function _locale_batch_system_finished($success, $results) {
+  if ($success) {
+    drupal_set_message(format_plural(count($results), 'One translation file imported for the newly installed modules.', '@count translation files imported for the newly installed modules.'));
+  }
+}
+
+/**
+ * Finished callback of language addition locale import batch.
+ * Inform the user of translation files imported.
+ */
+function _locale_batch_language_finished($success, $results) {
+  if ($success) {
+    drupal_set_message(format_plural(count($results), 'One translation file imported for the enabled modules.', '@count translation files imported for the enabled modules.'));
+  }
+}
+
+/**
+ * @} End of "locale-autoimport"
+ */
+
+/**
+ * Get list of all predefined and custom countries.
+ *
+ * @return
+ *   An array of all country code => country name pairs.
+ */
+function country_get_list() {
+  include_once DRUPAL_ROOT . '/includes/iso.inc';
+  $countries = _country_get_predefined_list();
+  // Allow other modules to modify the country list.
+  drupal_alter('countries', $countries);
+  return $countries;
+}
+
+/**
+ * Save locale specific date formats to the database.
+ *
+ * @param $langcode
+ *   Language code, can be 2 characters, e.g. 'en' or 5 characters, e.g.
+ *   'en-CA'.
+ * @param $type
+ *   Date format type, e.g. 'short', 'medium'.
+ * @param $format
+ *   The date format string.
+ */
+function locale_date_format_save($langcode, $type, $format) {
+  $locale_format = array();
+  $locale_format['language'] = $langcode;
+  $locale_format['type'] = $type;
+  $locale_format['format'] = $format;
+
+  $is_existing = (bool) db_query_range('SELECT 1 FROM {date_format_locale} WHERE language = :langcode AND type = :type', 0, 1, array(':langcode' => $langcode, ':type' => $type))->fetchField();
+  if ($is_existing) {
+    $keys = array('type', 'language');
+    drupal_write_record('date_format_locale', $locale_format, $keys);
+  }
+  else {
+    drupal_write_record('date_format_locale', $locale_format);
+  }
+}
+
+/**
+ * Select locale date format details from database.
+ *
+ * @param $languages
+ *   An array of language codes.
+ *
+ * @return
+ *   An array of date formats.
+ */
+function locale_get_localized_date_format($languages) {
+  $formats = array();
+
+  // Get list of different format types.
+  $format_types = system_get_date_types();
+  $short_default = variable_get('date_format_short', 'm/d/Y - H:i');
+
+  // Loop through each language until we find one with some date formats
+  // configured.
+  foreach ($languages as $language) {
+    $date_formats = system_date_format_locale($language);
+    if (!empty($date_formats)) {
+      // We have locale-specific date formats, so check for their types. If
+      // we're missing a type, use the default setting instead.
+      foreach ($format_types as $type => $type_info) {
+        // If format exists for this language, use it.
+        if (!empty($date_formats[$type])) {
+          $formats['date_format_' . $type] = $date_formats[$type];
+        }
+        // Otherwise get default variable setting. If this is not set, default
+        // to the short format.
+        else {
+          $formats['date_format_' . $type] = variable_get('date_format_' . $type, $short_default);
+        }
+      }
+
+      // Return on the first match.
+      return $formats;
+    }
+  }
+
+  // No locale specific formats found, so use defaults.
+  $system_types = array('short', 'medium', 'long');
+  // Handle system types separately as they have defaults if no variable exists.
+  $formats['date_format_short'] = $short_default;
+  $formats['date_format_medium'] = variable_get('date_format_medium', 'D, m/d/Y - H:i');
+  $formats['date_format_long'] = variable_get('date_format_long', 'l, F j, Y - H:i');
+
+  // For non-system types, get the default setting, otherwise use the short
+  // format.
+  foreach ($format_types as $type => $type_info) {
+    if (!in_array($type, $system_types)) {
+      $formats['date_format_' . $type] = variable_get('date_format_' . $type, $short_default);
+    }
+  }
+
+  return $formats;
+}
diff --git a/htmltest/includes/lock.inc b/htmltest/includes/lock.inc
new file mode 100644
index 00000000..7dd8db30
--- /dev/null
+++ b/htmltest/includes/lock.inc
@@ -0,0 +1,274 @@
+<?php
+
+/**
+ * @file
+ * A database-mediated implementation of a locking mechanism.
+ */
+
+/**
+ * @defgroup lock Locking mechanisms
+ * @{
+ * Functions to coordinate long-running operations across requests.
+ *
+ * In most environments, multiple Drupal page requests (a.k.a. threads or
+ * processes) will execute in parallel. This leads to potential conflicts or
+ * race conditions when two requests execute the same code at the same time. A
+ * common example of this is a rebuild like menu_rebuild() where we invoke many
+ * hook implementations to get and process data from all active modules, and
+ * then delete the current data in the database to insert the new afterwards.
+ *
+ * This is a cooperative, advisory lock system. Any long-running operation
+ * that could potentially be attempted in parallel by multiple requests should
+ * try to acquire a lock before proceeding. By obtaining a lock, one request
+ * notifies any other requests that a specific operation is in progress which
+ * must not be executed in parallel.
+ *
+ * To use this API, pick a unique name for the lock. A sensible choice is the
+ * name of the function performing the operation. A very simple example use of
+ * this API:
+ * @code
+ * function mymodule_long_operation() {
+ *   if (lock_acquire('mymodule_long_operation')) {
+ *     // Do the long operation here.
+ *     // ...
+ *     lock_release('mymodule_long_operation');
+ *   }
+ * }
+ * @endcode
+ *
+ * If a function acquires a lock it should always release it when the
+ * operation is complete by calling lock_release(), as in the example.
+ *
+ * A function that has acquired a lock may attempt to renew a lock (extend the
+ * duration of the lock) by calling lock_acquire() again during the operation.
+ * Failure to renew a lock is indicative that another request has acquired
+ * the lock, and that the current operation may need to be aborted.
+ *
+ * If a function fails to acquire a lock it may either immediately return, or
+ * it may call lock_wait() if the rest of the current page request requires
+ * that the operation in question be complete. After lock_wait() returns,
+ * the function may again attempt to acquire the lock, or may simply allow the
+ * page request to proceed on the assumption that a parallel request completed
+ * the operation.
+ *
+ * lock_acquire() and lock_wait() will automatically break (delete) a lock
+ * whose duration has exceeded the timeout specified when it was acquired.
+ *
+ * Alternative implementations of this API (such as APC) may be substituted
+ * by setting the 'lock_inc' variable to an alternate include filepath. Since
+ * this is an API intended to support alternative implementations, code using
+ * this API should never rely upon specific implementation details (for example
+ * no code should look for or directly modify a lock in the {semaphore} table).
+ */
+
+/**
+ * Initialize the locking system.
+ */
+function lock_initialize() {
+  global $locks;
+
+  $locks = array();
+}
+
+/**
+ * Helper function to get this request's unique id.
+ */
+function _lock_id() {
+  // Do not use drupal_static(). This identifier refers to the current
+  // client request, and must not be changed under any circumstances
+  // else the shutdown handler may fail to release our locks.
+  static $lock_id;
+
+  if (!isset($lock_id)) {
+    // Assign a unique id.
+    $lock_id = uniqid(mt_rand(), TRUE);
+    // We only register a shutdown function if a lock is used.
+    drupal_register_shutdown_function('lock_release_all', $lock_id);
+  }
+  return $lock_id;
+}
+
+/**
+ * Acquire (or renew) a lock, but do not block if it fails.
+ *
+ * @param $name
+ *   The name of the lock.
+ * @param $timeout
+ *   A number of seconds (float) before the lock expires (minimum of 0.001).
+ *
+ * @return
+ *   TRUE if the lock was acquired, FALSE if it failed.
+ */
+function lock_acquire($name, $timeout = 30.0) {
+  global $locks;
+
+  // Insure that the timeout is at least 1 ms.
+  $timeout = max($timeout, 0.001);
+  $expire = microtime(TRUE) + $timeout;
+  if (isset($locks[$name])) {
+    // Try to extend the expiration of a lock we already acquired.
+    $success = (bool) db_update('semaphore')
+      ->fields(array('expire' => $expire))
+      ->condition('name', $name)
+      ->condition('value', _lock_id())
+      ->execute();
+    if (!$success) {
+      // The lock was broken.
+      unset($locks[$name]);
+    }
+    return $success;
+  }
+  else {
+    // Optimistically try to acquire the lock, then retry once if it fails.
+    // The first time through the loop cannot be a retry.
+    $retry = FALSE;
+    // We always want to do this code at least once.
+    do {
+      try {
+        db_insert('semaphore')
+          ->fields(array(
+            'name' => $name,
+            'value' => _lock_id(),
+            'expire' => $expire,
+          ))
+          ->execute();
+        // We track all acquired locks in the global variable.
+        $locks[$name] = TRUE;
+        // We never need to try again.
+        $retry = FALSE;
+      }
+      catch (PDOException $e) {
+        // Suppress the error. If this is our first pass through the loop,
+        // then $retry is FALSE. In this case, the insert must have failed
+        // meaning some other request acquired the lock but did not release it.
+        // We decide whether to retry by checking lock_may_be_available()
+        // Since this will break the lock in case it is expired.
+        $retry = $retry ? FALSE : lock_may_be_available($name);
+      }
+      // We only retry in case the first attempt failed, but we then broke
+      // an expired lock.
+    } while ($retry);
+  }
+  return isset($locks[$name]);
+}
+
+/**
+ * Check if lock acquired by a different process may be available.
+ *
+ * If an existing lock has expired, it is removed.
+ *
+ * @param $name
+ *   The name of the lock.
+ *
+ * @return
+ *   TRUE if there is no lock or it was removed, FALSE otherwise.
+ */
+function lock_may_be_available($name) {
+  $lock = db_query('SELECT expire, value FROM {semaphore} WHERE name = :name', array(':name' => $name))->fetchAssoc();
+  if (!$lock) {
+    return TRUE;
+  }
+  $expire = (float) $lock['expire'];
+  $now = microtime(TRUE);
+  if ($now > $expire) {
+    // We check two conditions to prevent a race condition where another
+    // request acquired the lock and set a new expire time. We add a small
+    // number to $expire to avoid errors with float to string conversion.
+    return (bool) db_delete('semaphore')
+      ->condition('name', $name)
+      ->condition('value', $lock['value'])
+      ->condition('expire', 0.0001 + $expire, '<=')
+      ->execute();
+  }
+  return FALSE;
+}
+
+/**
+ * Wait for a lock to be available.
+ *
+ * This function may be called in a request that fails to acquire a desired
+ * lock. This will block further execution until the lock is available or the
+ * specified delay in seconds is reached. This should not be used with locks
+ * that are acquired very frequently, since the lock is likely to be acquired
+ * again by a different request while waiting.
+ *
+ * @param $name
+ *   The name of the lock.
+ * @param $delay
+ *   The maximum number of seconds to wait, as an integer.
+ *
+ * @return
+ *   TRUE if the lock holds, FALSE if it is available.
+ */
+function lock_wait($name, $delay = 30) {
+  // Pause the process for short periods between calling
+  // lock_may_be_available(). This prevents hitting the database with constant
+  // database queries while waiting, which could lead to performance issues.
+  // However, if the wait period is too long, there is the potential for a
+  // large number of processes to be blocked waiting for a lock, especially
+  // if the item being rebuilt is commonly requested. To address both of these
+  // concerns, begin waiting for 25ms, then add 25ms to the wait period each
+  // time until it reaches 500ms. After this point polling will continue every
+  // 500ms until $delay is reached.
+
+  // $delay is passed in seconds, but we will be using usleep(), which takes
+  // microseconds as a parameter. Multiply it by 1 million so that all
+  // further numbers are equivalent.
+  $delay = (int) $delay * 1000000;
+
+  // Begin sleeping at 25ms.
+  $sleep = 25000;
+  while ($delay > 0) {
+    // This function should only be called by a request that failed to get a
+    // lock, so we sleep first to give the parallel request a chance to finish
+    // and release the lock.
+    usleep($sleep);
+    // After each sleep, increase the value of $sleep until it reaches
+    // 500ms, to reduce the potential for a lock stampede.
+    $delay = $delay - $sleep;
+    $sleep = min(500000, $sleep + 25000, $delay);
+    if (lock_may_be_available($name)) {
+      // No longer need to wait.
+      return FALSE;
+    }
+  }
+  // The caller must still wait longer to get the lock.
+  return TRUE;
+}
+
+/**
+ * Release a lock previously acquired by lock_acquire().
+ *
+ * This will release the named lock if it is still held by the current request.
+ *
+ * @param $name
+ *   The name of the lock.
+ */
+function lock_release($name) {
+  global $locks;
+
+  unset($locks[$name]);
+  db_delete('semaphore')
+    ->condition('name', $name)
+    ->condition('value', _lock_id())
+    ->execute();
+}
+
+/**
+ * Release all previously acquired locks.
+ */
+function lock_release_all($lock_id = NULL) {
+  global $locks;
+
+  $locks = array();
+  if (empty($lock_id)) {
+    $lock_id = _lock_id();
+  }
+  db_delete('semaphore')
+    ->condition('value', $lock_id)
+    ->execute();
+}
+
+/**
+ * @} End of "defgroup lock".
+ */
diff --git a/htmltest/includes/mail.inc b/htmltest/includes/mail.inc
new file mode 100644
index 00000000..7a1d29ed
--- /dev/null
+++ b/htmltest/includes/mail.inc
@@ -0,0 +1,623 @@
+<?php
+
+/**
+ * @file
+ * API functions for processing and sending e-mail.
+ */
+
+/**
+ * Auto-detect appropriate line endings for e-mails.
+ *
+ * $conf['mail_line_endings'] will override this setting.
+ */
+define('MAIL_LINE_ENDINGS', isset($_SERVER['WINDIR']) || strpos($_SERVER['SERVER_SOFTWARE'], 'Win32') !== FALSE ? "\r\n" : "\n");
+
+/**
+ * Composes and optionally sends an e-mail message.
+ *
+ * Sending an e-mail works with defining an e-mail template (subject, text
+ * and possibly e-mail headers) and the replacement values to use in the
+ * appropriate places in the template. Processed e-mail templates are
+ * requested from hook_mail() from the module sending the e-mail. Any module
+ * can modify the composed e-mail message array using hook_mail_alter().
+ * Finally drupal_mail_system()->mail() sends the e-mail, which can
+ * be reused if the exact same composed e-mail is to be sent to multiple
+ * recipients.
+ *
+ * Finding out what language to send the e-mail with needs some consideration.
+ * If you send e-mail to a user, her preferred language should be fine, so
+ * use user_preferred_language(). If you send email based on form values
+ * filled on the page, there are two additional choices if you are not
+ * sending the e-mail to a user on the site. You can either use the language
+ * used to generate the page ($language global variable) or the site default
+ * language. See language_default(). The former is good if sending e-mail to
+ * the person filling the form, the later is good if you send e-mail to an
+ * address previously set up (like contact addresses in a contact form).
+ *
+ * Taking care of always using the proper language is even more important
+ * when sending e-mails in a row to multiple users. Hook_mail() abstracts
+ * whether the mail text comes from an administrator setting or is
+ * static in the source code. It should also deal with common mail tokens,
+ * only receiving $params which are unique to the actual e-mail at hand.
+ *
+ * An example:
+ *
+ * @code
+ *   function example_notify($accounts) {
+ *     foreach ($accounts as $account) {
+ *       $params['account'] = $account;
+ *       // example_mail() will be called based on the first drupal_mail() parameter.
+ *       drupal_mail('example', 'notice', $account->mail, user_preferred_language($account), $params);
+ *     }
+ *   }
+ *
+ *   function example_mail($key, &$message, $params) {
+ *     $data['user'] = $params['account'];
+ *     $options['language'] = $message['language'];
+ *     user_mail_tokens($variables, $data, $options);
+ *     switch($key) {
+ *       case 'notice':
+ *         // If the recipient can receive such notices by instant-message, do
+ *         // not send by email.
+ *         if (example_im_send($key, $message, $params)) {
+ *           $message['send'] = FALSE;
+ *           break;
+ *         }
+ *         $langcode = $message['language']->language;
+ *         $message['subject'] = t('Notification from !site', $variables, array('langcode' => $langcode));
+ *         $message['body'][] = t("Dear !username\n\nThere is new content available on the site.", $variables, array('langcode' => $langcode));
+ *         break;
+ *     }
+ *   }
+ * @endcode
+ *
+ * Another example, which uses drupal_mail() to format a message for sending
+ * later:
+ *
+ * @code
+ *   $params = array('current_conditions' => $data);
+ *   $to = 'user@example.com';
+ *   $message = drupal_mail('example', 'notice', $to, $language, $params, FALSE);
+ *   // Only add to the spool if sending was not canceled.
+ *   if ($message['send']) {
+ *     example_spool_message($message);
+ *   }
+ * @endcode
+ *
+ * @param $module
+ *   A module name to invoke hook_mail() on. The {$module}_mail() hook will be
+ *   called to complete the $message structure which will already contain common
+ *   defaults.
+ * @param $key
+ *   A key to identify the e-mail sent. The final e-mail id for e-mail altering
+ *   will be {$module}_{$key}.
+ * @param $to
+ *   The e-mail address or addresses where the message will be sent to. The
+ *   formatting of this string will be validated with the
+ *   @link http://php.net/manual/filter.filters.validate.php PHP e-mail validation filter. @endlink
+ *   Some examples are:
+ *   - user@example.com
+ *   - user@example.com, anotheruser@example.com
+ *   - User <user@example.com>
+ *   - User <user@example.com>, Another User <anotheruser@example.com>
+ * @param $language
+ *   Language object to use to compose the e-mail.
+ * @param $params
+ *   Optional parameters to build the e-mail.
+ * @param $from
+ *   Sets From to this value, if given.
+ * @param $send
+ *   If TRUE, drupal_mail() will call drupal_mail_system()->mail() to deliver
+ *   the message, and store the result in $message['result']. Modules
+ *   implementing hook_mail_alter() may cancel sending by setting
+ *   $message['send'] to FALSE.
+ *
+ * @return
+ *   The $message array structure containing all details of the
+ *   message. If already sent ($send = TRUE), then the 'result' element
+ *   will contain the success indicator of the e-mail, failure being already
+ *   written to the watchdog. (Success means nothing more than the message being
+ *   accepted at php-level, which still doesn't guarantee it to be delivered.)
+ */
+function drupal_mail($module, $key, $to, $language, $params = array(), $from = NULL, $send = TRUE) {
+  $default_from = variable_get('site_mail', ini_get('sendmail_from'));
+
+  // Bundle up the variables into a structured array for altering.
+  $message = array(
+    'id'       => $module . '_' . $key,
+    'module'   => $module,
+    'key'      => $key,
+    'to'       => $to,
+    'from'     => isset($from) ? $from : $default_from,
+    'language' => $language,
+    'params'   => $params,
+    'send'     => TRUE,
+    'subject'  => '',
+    'body'     => array()
+  );
+
+  // Build the default headers
+  $headers = array(
+    'MIME-Version'              => '1.0',
+    'Content-Type'              => 'text/plain; charset=UTF-8; format=flowed; delsp=yes',
+    'Content-Transfer-Encoding' => '8Bit',
+    'X-Mailer'                  => 'Drupal'
+  );
+  if ($default_from) {
+    // To prevent e-mail from looking like spam, the addresses in the Sender and
+    // Return-Path headers should have a domain authorized to use the originating
+    // SMTP server.
+    $headers['From'] = $headers['Sender'] = $headers['Return-Path'] = $default_from;
+  }
+  if ($from) {
+    $headers['From'] = $from;
+  }
+  $message['headers'] = $headers;
+
+  // Build the e-mail (get subject and body, allow additional headers) by
+  // invoking hook_mail() on this module. We cannot use module_invoke() as
+  // we need to have $message by reference in hook_mail().
+  if (function_exists($function = $module . '_mail')) {
+    $function($key, $message, $params);
+  }
+
+  // Invoke hook_mail_alter() to allow all modules to alter the resulting e-mail.
+  drupal_alter('mail', $message);
+
+  // Retrieve the responsible implementation for this message.
+  $system = drupal_mail_system($module, $key);
+
+  // Format the message body.
+  $message = $system->format($message);
+
+  // Optionally send e-mail.
+  if ($send) {
+    // The original caller requested sending. Sending was canceled by one or
+    // more hook_mail_alter() implementations. We set 'result' to NULL, because
+    // FALSE indicates an error in sending.
+    if (empty($message['send'])) {
+      $message['result'] = NULL;
+    }
+    // Sending was originally requested and was not canceled.
+    else {
+      $message['result'] = $system->mail($message);
+      // Log errors.
+      if (!$message['result']) {
+        watchdog('mail', 'Error sending e-mail (from %from to %to).', array('%from' => $message['from'], '%to' => $message['to']), WATCHDOG_ERROR);
+        drupal_set_message(t('Unable to send e-mail. Contact the site administrator if the problem persists.'), 'error');
+      }
+    }
+  }
+
+  return $message;
+}
+
+/**
+ * Returns an object that implements the MailSystemInterface interface.
+ *
+ * Allows for one or more custom mail backends to format and send mail messages
+ * composed using drupal_mail().
+ *
+ * An implementation needs to implement the following methods:
+ * - format: Allows to preprocess, format, and postprocess a mail
+ *   message before it is passed to the sending system. By default, all messages
+ *   may contain HTML and are converted to plain-text by the DefaultMailSystem
+ *   implementation. For example, an alternative implementation could override
+ *   the default implementation and additionally sanitize the HTML for usage in
+ *   a MIME-encoded e-mail, but still invoking the DefaultMailSystem
+ *   implementation to generate an alternate plain-text version for sending.
+ * - mail: Sends a message through a custom mail sending engine.
+ *   By default, all messages are sent via PHP's mail() function by the
+ *   DefaultMailSystem implementation.
+ *
+ * The selection of a particular implementation is controlled via the variable
+ * 'mail_system', which is a keyed array.  The default implementation
+ * is the class whose name is the value of 'default-system' key. A more specific
+ * match first to key and then to module will be used in preference to the
+ * default. To specify a different class for all mail sent by one module, set
+ * the class name as the value for the key corresponding to the module name. To
+ * specify a class for a particular message sent by one module, set the class
+ * name as the value for the array key that is the message id, which is
+ * "${module}_${key}".
+ *
+ * For example to debug all mail sent by the user module by logging it to a
+ * file, you might set the variable as something like:
+ *
+ * @code
+ * array(
+ *   'default-system' => 'DefaultMailSystem',
+ *   'user' => 'DevelMailLog',
+ * );
+ * @endcode
+ *
+ * Finally, a different system can be specified for a specific e-mail ID (see
+ * the $key param), such as one of the keys used by the contact module:
+ *
+ * @code
+ * array(
+ *   'default-system' => 'DefaultMailSystem',
+ *   'user' => 'DevelMailLog',
+ *   'contact_page_autoreply' => 'DrupalDevNullMailSend',
+ * );
+ * @endcode
+ *
+ * Other possible uses for system include a mail-sending class that actually
+ * sends (or duplicates) each message to SMS, Twitter, instant message, etc, or
+ * a class that queues up a large number of messages for more efficient bulk
+ * sending or for sending via a remote gateway so as to reduce the load
+ * on the local server.
+ *
+ * @param $module
+ *   The module name which was used by drupal_mail() to invoke hook_mail().
+ * @param $key
+ *   A key to identify the e-mail sent. The final e-mail ID for the e-mail
+ *   alter hook in drupal_mail() would have been {$module}_{$key}.
+ *
+ * @return MailSystemInterface
+ */
+function drupal_mail_system($module, $key) {
+  $instances = &drupal_static(__FUNCTION__, array());
+
+  $id = $module . '_' . $key;
+
+  $configuration = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
+
+  // Look for overrides for the default class, starting from the most specific
+  // id, and falling back to the module name.
+  if (isset($configuration[$id])) {
+    $class = $configuration[$id];
+  }
+  elseif (isset($configuration[$module])) {
+    $class = $configuration[$module];
+  }
+  else {
+    $class = $configuration['default-system'];
+  }
+
+  if (empty($instances[$class])) {
+    $interfaces = class_implements($class);
+    if (isset($interfaces['MailSystemInterface'])) {
+      $instances[$class] = new $class();
+    }
+    else {
+      throw new Exception(t('Class %class does not implement interface %interface', array('%class' => $class, '%interface' => 'MailSystemInterface')));
+    }
+  }
+  return $instances[$class];
+}
+
+/**
+ * An interface for pluggable mail back-ends.
+ */
+interface MailSystemInterface {
+  /**
+   * Format a message composed by drupal_mail() prior sending.
+   *
+   * @param $message
+   *   A message array, as described in hook_mail_alter().
+   *
+   * @return
+   *   The formatted $message.
+   */
+   public function format(array $message);
+
+  /**
+   * Send a message composed by drupal_mail().
+   *
+   * @param $message
+   *   Message array with at least the following elements:
+   *   - id: A unique identifier of the e-mail type. Examples: 'contact_user_copy',
+   *     'user_password_reset'.
+   *   - to: The mail address or addresses where the message will be sent to.
+   *     The formatting of this string will be validated with the
+   *     @link http://php.net/manual/filter.filters.validate.php PHP e-mail validation filter. @endlink
+   *     Some examples are:
+   *     - user@example.com
+   *     - user@example.com, anotheruser@example.com
+   *     - User <user@example.com>
+   *     - User <user@example.com>, Another User <anotheruser@example.com>
+   *   - subject: Subject of the e-mail to be sent. This must not contain any
+   *     newline characters, or the mail may not be sent properly.
+   *   - body: Message to be sent. Accepts both CRLF and LF line-endings.
+   *     E-mail bodies must be wrapped. You can use drupal_wrap_mail() for
+   *     smart plain text wrapping.
+   *   - headers: Associative array containing all additional mail headers not
+   *     defined by one of the other parameters.  PHP's mail() looks for Cc and
+   *     Bcc headers and sends the mail to addresses in these headers too.
+   *
+   * @return
+   *   TRUE if the mail was successfully accepted for delivery, otherwise FALSE.
+   */
+   public function mail(array $message);
+}
+
+/**
+ * Performs format=flowed soft wrapping for mail (RFC 3676).
+ *
+ * We use delsp=yes wrapping, but only break non-spaced languages when
+ * absolutely necessary to avoid compatibility issues.
+ *
+ * We deliberately use LF rather than CRLF, see drupal_mail().
+ *
+ * @param string $text
+ *   The plain text to process.
+ * @param string $indent (optional)
+ *   A string to indent the text with. Only '>' characters are repeated on
+ *   subsequent wrapped lines. Others are replaced by spaces.
+ *
+ * @return string
+ *   The content of the email as a string with formatting applied.
+ */
+function drupal_wrap_mail($text, $indent = '') {
+  // Convert CRLF into LF.
+  $text = str_replace("\r", '', $text);
+  // See if soft-wrapping is allowed.
+  $clean_indent = _drupal_html_to_text_clean($indent);
+  $soft = strpos($clean_indent, ' ') === FALSE;
+  // Check if the string has line breaks.
+  if (strpos($text, "\n") !== FALSE) {
+    // Remove trailing spaces to make existing breaks hard, but leave signature
+    // marker untouched (RFC 3676, Section 4.3).
+    $text = preg_replace('/(?(?<!^--) +\n|  +\n)/m', "\n", $text);
+    // Wrap each line at the needed width.
+    $lines = explode("\n", $text);
+    array_walk($lines, '_drupal_wrap_mail_line', array('soft' => $soft, 'length' => strlen($indent)));
+    $text = implode("\n", $lines);
+  }
+  else {
+    // Wrap this line.
+    _drupal_wrap_mail_line($text, 0, array('soft' => $soft, 'length' => strlen($indent)));
+  }
+  // Empty lines with nothing but spaces.
+  $text = preg_replace('/^ +\n/m', "\n", $text);
+  // Space-stuff special lines.
+  $text = preg_replace('/^(>| |From)/m', ' $1', $text);
+  // Apply indentation. We only include non-'>' indentation on the first line.
+  $text = $indent . substr(preg_replace('/^/m', $clean_indent, $text), strlen($indent));
+
+  return $text;
+}
+
+/**
+ * Transforms an HTML string into plain text, preserving its structure.
+ *
+ * The output will be suitable for use as 'format=flowed; delsp=yes' text
+ * (RFC 3676) and can be passed directly to drupal_mail() for sending.
+ *
+ * We deliberately use LF rather than CRLF, see drupal_mail().
+ *
+ * This function provides suitable alternatives for the following tags:
+ * <a> <em> <i> <strong> <b> <br> <p> <blockquote> <ul> <ol> <li> <dl> <dt>
+ * <dd> <h1> <h2> <h3> <h4> <h5> <h6> <hr>
+ *
+ * @param $string
+ *   The string to be transformed.
+ * @param $allowed_tags (optional)
+ *   If supplied, a list of tags that will be transformed. If omitted, all
+ *   all supported tags are transformed.
+ *
+ * @return
+ *   The transformed string.
+ */
+function drupal_html_to_text($string, $allowed_tags = NULL) {
+  // Cache list of supported tags.
+  static $supported_tags;
+  if (empty($supported_tags)) {
+    $supported_tags = array('a', 'em', 'i', 'strong', 'b', 'br', 'p', 'blockquote', 'ul', 'ol', 'li', 'dl', 'dt', 'dd', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr');
+  }
+
+  // Make sure only supported tags are kept.
+  $allowed_tags = isset($allowed_tags) ? array_intersect($supported_tags, $allowed_tags) : $supported_tags;
+
+  // Make sure tags, entities and attributes are well-formed and properly nested.
+  $string = _filter_htmlcorrector(filter_xss($string, $allowed_tags));
+
+  // Apply inline styles.
+  $string = preg_replace('!</?(em|i)((?> +)[^>]*)?>!i', '/', $string);
+  $string = preg_replace('!</?(strong|b)((?> +)[^>]*)?>!i', '*', $string);
+
+  // Replace inline <a> tags with the text of link and a footnote.
+  // 'See <a href="http://drupal.org">the Drupal site</a>' becomes
+  // 'See the Drupal site [1]' with the URL included as a footnote.
+  _drupal_html_to_mail_urls(NULL, TRUE);
+  $pattern = '@(<a[^>]+?href="([^"]*)"[^>]*?>(.+?)</a>)@i';
+  $string = preg_replace_callback($pattern, '_drupal_html_to_mail_urls', $string);
+  $urls = _drupal_html_to_mail_urls();
+  $footnotes = '';
+  if (count($urls)) {
+    $footnotes .= "\n";
+    for ($i = 0, $max = count($urls); $i < $max; $i++) {
+      $footnotes .= '[' . ($i + 1) . '] ' . $urls[$i] . "\n";
+    }
+  }
+
+  // Split tags from text.
+  $split = preg_split('/<([^>]+?)>/', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
+  // Note: PHP ensures the array consists of alternating delimiters and literals
+  // and begins and ends with a literal (inserting $null as required).
+
+  $tag = FALSE; // Odd/even counter (tag or no tag)
+  $casing = NULL; // Case conversion function
+  $output = '';
+  $indent = array(); // All current indentation string chunks
+  $lists = array(); // Array of counters for opened lists
+  foreach ($split as $value) {
+    $chunk = NULL; // Holds a string ready to be formatted and output.
+
+    // Process HTML tags (but don't output any literally).
+    if ($tag) {
+      list($tagname) = explode(' ', strtolower($value), 2);
+      switch ($tagname) {
+        // List counters
+        case 'ul':
+          array_unshift($lists, '*');
+          break;
+        case 'ol':
+          array_unshift($lists, 1);
+          break;
+        case '/ul':
+        case '/ol':
+          array_shift($lists);
+          $chunk = ''; // Ensure blank new-line.
+          break;
+
+        // Quotation/list markers, non-fancy headers
+        case 'blockquote':
+          // Format=flowed indentation cannot be mixed with lists.
+          $indent[] = count($lists) ? ' "' : '>';
+          break;
+        case 'li':
+          $indent[] = isset($lists[0]) && is_numeric($lists[0]) ? ' ' . $lists[0]++ . ') ' : ' * ';
+          break;
+        case 'dd':
+          $indent[] = '    ';
+          break;
+        case 'h3':
+          $indent[] = '.... ';
+          break;
+        case 'h4':
+          $indent[] = '.. ';
+          break;
+        case '/blockquote':
+          if (count($lists)) {
+            // Append closing quote for inline quotes (immediately).
+            $output = rtrim($output, "> \n") . "\"\n";
+            $chunk = ''; // Ensure blank new-line.
+          }
+          // Fall-through
+        case '/li':
+        case '/dd':
+          array_pop($indent);
+          break;
+        case '/h3':
+        case '/h4':
+          array_pop($indent);
+        case '/h5':
+        case '/h6':
+          $chunk = ''; // Ensure blank new-line.
+          break;
+
+        // Fancy headers
+        case 'h1':
+          $indent[] = '======== ';
+          $casing = 'drupal_strtoupper';
+          break;
+        case 'h2':
+          $indent[] = '-------- ';
+          $casing = 'drupal_strtoupper';
+          break;
+        case '/h1':
+        case '/h2':
+          $casing = NULL;
+          // Pad the line with dashes.
+          $output = _drupal_html_to_text_pad($output, ($tagname == '/h1') ? '=' : '-', ' ');
+          array_pop($indent);
+          $chunk = ''; // Ensure blank new-line.
+          break;
+
+        // Horizontal rulers
+        case 'hr':
+          // Insert immediately.
+          $output .= drupal_wrap_mail('', implode('', $indent)) . "\n";
+          $output = _drupal_html_to_text_pad($output, '-');
+          break;
+
+        // Paragraphs and definition lists
+        case '/p':
+        case '/dl':
+          $chunk = ''; // Ensure blank new-line.
+          break;
+      }
+    }
+    // Process blocks of text.
+    else {
+      // Convert inline HTML text to plain text; not removing line-breaks or
+      // white-space, since that breaks newlines when sanitizing plain-text.
+      $value = trim(decode_entities($value));
+      if (drupal_strlen($value)) {
+        $chunk = $value;
+      }
+    }
+
+    // See if there is something waiting to be output.
+    if (isset($chunk)) {
+      // Apply any necessary case conversion.
+      if (isset($casing)) {
+        $chunk = $casing($chunk);
+      }
+      // Format it and apply the current indentation.
+      $output .= drupal_wrap_mail($chunk, implode('', $indent)) . MAIL_LINE_ENDINGS;
+      // Remove non-quotation markers from indentation.
+      $indent = array_map('_drupal_html_to_text_clean', $indent);
+    }
+
+    $tag = !$tag;
+  }
+
+  return $output . $footnotes;
+}
+
+/**
+ * Wraps words on a single line.
+ *
+ * Callback for array_walk() winthin drupal_wrap_mail().
+ */
+function _drupal_wrap_mail_line(&$line, $key, $values) {
+  // Use soft-breaks only for purely quoted or unindented text.
+  $line = wordwrap($line, 77 - $values['length'], $values['soft'] ? " \n" : "\n");
+  // Break really long words at the maximum width allowed.
+  $line = wordwrap($line, 996 - $values['length'], $values['soft'] ? " \n" : "\n");
+}
+
+/**
+ * Keeps track of URLs and replaces them with placeholder tokens.
+ *
+ * Callback for preg_replace_callback() within drupal_html_to_text().
+ */
+function _drupal_html_to_mail_urls($match = NULL, $reset = FALSE) {
+  global $base_url, $base_path;
+  static $urls = array(), $regexp;
+
+  if ($reset) {
+    // Reset internal URL list.
+    $urls = array();
+  }
+  else {
+    if (empty($regexp)) {
+      $regexp = '@^' . preg_quote($base_path, '@') . '@';
+    }
+    if ($match) {
+      list(, , $url, $label) = $match;
+      // Ensure all URLs are absolute.
+      $urls[] = strpos($url, '://') ? $url : preg_replace($regexp, $base_url . '/', $url);
+      return $label . ' [' . count($urls) . ']';
+    }
+  }
+  return $urls;
+}
+
+/**
+ * Replaces non-quotation markers from a given piece of indentation with spaces.
+ *
+ * Callback for array_map() within drupal_html_to_text().
+ */
+function _drupal_html_to_text_clean($indent) {
+  return preg_replace('/[^>]/', ' ', $indent);
+}
+
+/**
+ * Pads the last line with the given character.
+ *
+ * @see drupal_html_to_text()
+ */
+function _drupal_html_to_text_pad($text, $pad, $prefix = '') {
+  // Remove last line break.
+  $text = substr($text, 0, -1);
+  // Calculate needed padding space and add it.
+  if (($p = strrpos($text, "\n")) === FALSE) {
+    $p = -1;
+  }
+  $n = max(0, 79 - (strlen($text) - $p) - strlen($prefix));
+  // Add prefix and padding, and restore linebreak.
+  return $text . $prefix . str_repeat($pad, $n) . "\n";
+}
diff --git a/htmltest/includes/menu.inc b/htmltest/includes/menu.inc
new file mode 100644
index 00000000..aef557a2
--- /dev/null
+++ b/htmltest/includes/menu.inc
@@ -0,0 +1,3891 @@
+<?php
+
+/**
+ * @file
+ * API for the Drupal menu system.
+ */
+
+/**
+ * @defgroup menu Menu system
+ * @{
+ * Define the navigation menus, and route page requests to code based on URLs.
+ *
+ * The Drupal menu system drives both the navigation system from a user
+ * perspective and the callback system that Drupal uses to respond to URLs
+ * passed from the browser. For this reason, a good understanding of the
+ * menu system is fundamental to the creation of complex modules. As a note,
+ * this is related to, but separate from menu.module, which allows menus
+ * (which in this context are hierarchical lists of links) to be customized from
+ * the Drupal administrative interface.
+ *
+ * Drupal's menu system follows a simple hierarchy defined by paths.
+ * Implementations of hook_menu() define menu items and assign them to
+ * paths (which should be unique). The menu system aggregates these items
+ * and determines the menu hierarchy from the paths. For example, if the
+ * paths defined were a, a/b, e, a/b/c/d, f/g, and a/b/h, the menu system
+ * would form the structure:
+ * - a
+ *   - a/b
+ *     - a/b/c/d
+ *     - a/b/h
+ * - e
+ * - f/g
+ * Note that the number of elements in the path does not necessarily
+ * determine the depth of the menu item in the tree.
+ *
+ * When responding to a page request, the menu system looks to see if the
+ * path requested by the browser is registered as a menu item with a
+ * callback. If not, the system searches up the menu tree for the most
+ * complete match with a callback it can find. If the path a/b/i is
+ * requested in the tree above, the callback for a/b would be used.
+ *
+ * The found callback function is called with any arguments specified
+ * in the "page arguments" attribute of its menu item. The
+ * attribute must be an array. After these arguments, any remaining
+ * components of the path are appended as further arguments. In this
+ * way, the callback for a/b above could respond to a request for
+ * a/b/i differently than a request for a/b/j.
+ *
+ * For an illustration of this process, see page_example.module.
+ *
+ * Access to the callback functions is also protected by the menu system.
+ * The "access callback" with an optional "access arguments" of each menu
+ * item is called before the page callback proceeds. If this returns TRUE,
+ * then access is granted; if FALSE, then access is denied. Default local task
+ * menu items (see next paragraph) may omit this attribute to use the value
+ * provided by the parent item.
+ *
+ * In the default Drupal interface, you will notice many links rendered as
+ * tabs. These are known in the menu system as "local tasks", and they are
+ * rendered as tabs by default, though other presentations are possible.
+ * Local tasks function just as other menu items in most respects. It is
+ * convention that the names of these tasks should be short verbs if
+ * possible. In addition, a "default" local task should be provided for
+ * each set. When visiting a local task's parent menu item, the default
+ * local task will be rendered as if it is selected; this provides for a
+ * normal tab user experience. This default task is special in that it
+ * links not to its provided path, but to its parent item's path instead.
+ * The default task's path is only used to place it appropriately in the
+ * menu hierarchy.
+ *
+ * Everything described so far is stored in the menu_router table. The
+ * menu_links table holds the visible menu links. By default these are
+ * derived from the same hook_menu definitions, however you are free to
+ * add more with menu_link_save().
+ */
+
+/**
+ * @defgroup menu_flags Menu flags
+ * @{
+ * Flags for use in the "type" attribute of menu items.
+ */
+
+/**
+ * Internal menu flag -- menu item is the root of the menu tree.
+ */
+define('MENU_IS_ROOT', 0x0001);
+
+/**
+ * Internal menu flag -- menu item is visible in the menu tree.
+ */
+define('MENU_VISIBLE_IN_TREE', 0x0002);
+
+/**
+ * Internal menu flag -- menu item is visible in the breadcrumb.
+ */
+define('MENU_VISIBLE_IN_BREADCRUMB', 0x0004);
+
+/**
+ * Internal menu flag -- menu item links back to its parent.
+ */
+define('MENU_LINKS_TO_PARENT', 0x0008);
+
+/**
+ * Internal menu flag -- menu item can be modified by administrator.
+ */
+define('MENU_MODIFIED_BY_ADMIN', 0x0020);
+
+/**
+ * Internal menu flag -- menu item was created by administrator.
+ */
+define('MENU_CREATED_BY_ADMIN', 0x0040);
+
+/**
+ * Internal menu flag -- menu item is a local task.
+ */
+define('MENU_IS_LOCAL_TASK', 0x0080);
+
+/**
+ * Internal menu flag -- menu item is a local action.
+ */
+define('MENU_IS_LOCAL_ACTION', 0x0100);
+
+/**
+ * @} End of "Menu flags".
+ */
+
+/**
+ * @defgroup menu_item_types Menu item types
+ * @{
+ * Definitions for various menu item types.
+ *
+ * Menu item definitions provide one of these constants, which are shortcuts for
+ * combinations of @link menu_flags Menu flags @endlink.
+ */
+
+/**
+ * Menu type -- A "normal" menu item that's shown in menu and breadcrumbs.
+ *
+ * Normal menu items show up in the menu tree and can be moved/hidden by
+ * the administrator. Use this for most menu items. It is the default value if
+ * no menu item type is specified.
+ */
+define('MENU_NORMAL_ITEM', MENU_VISIBLE_IN_TREE | MENU_VISIBLE_IN_BREADCRUMB);
+
+/**
+ * Menu type -- A hidden, internal callback, typically used for API calls.
+ *
+ * Callbacks simply register a path so that the correct function is fired
+ * when the URL is accessed. They do not appear in menus or breadcrumbs.
+ */
+define('MENU_CALLBACK', 0x0000);
+
+/**
+ * Menu type -- A normal menu item, hidden until enabled by an administrator.
+ *
+ * Modules may "suggest" menu items that the administrator may enable. They act
+ * just as callbacks do until enabled, at which time they act like normal items.
+ * Note for the value: 0x0010 was a flag which is no longer used, but this way
+ * the values of MENU_CALLBACK and MENU_SUGGESTED_ITEM are separate.
+ */
+define('MENU_SUGGESTED_ITEM', MENU_VISIBLE_IN_BREADCRUMB | 0x0010);
+
+/**
+ * Menu type -- A task specific to the parent item, usually rendered as a tab.
+ *
+ * Local tasks are menu items that describe actions to be performed on their
+ * parent item. An example is the path "node/52/edit", which performs the
+ * "edit" task on "node/52".
+ */
+define('MENU_LOCAL_TASK', MENU_IS_LOCAL_TASK | MENU_VISIBLE_IN_BREADCRUMB);
+
+/**
+ * Menu type -- The "default" local task, which is initially active.
+ *
+ * Every set of local tasks should provide one "default" task, that links to the
+ * same path as its parent when clicked.
+ */
+define('MENU_DEFAULT_LOCAL_TASK', MENU_IS_LOCAL_TASK | MENU_LINKS_TO_PARENT | MENU_VISIBLE_IN_BREADCRUMB);
+
+/**
+ * Menu type -- An action specific to the parent, usually rendered as a link.
+ *
+ * Local actions are menu items that describe actions on the parent item such
+ * as adding a new user, taxonomy term, etc.
+ */
+define('MENU_LOCAL_ACTION', MENU_IS_LOCAL_TASK | MENU_IS_LOCAL_ACTION | MENU_VISIBLE_IN_BREADCRUMB);
+
+/**
+ * @} End of "Menu item types".
+ */
+
+/**
+ * @defgroup menu_context_types Menu context types
+ * @{
+ * Flags for use in the "context" attribute of menu router items.
+ */
+
+/**
+ * Internal menu flag: Invisible local task.
+ *
+ * This flag may be used for local tasks like "Delete", so custom modules and
+ * themes can alter the default context and expose the task by altering menu.
+ */
+define('MENU_CONTEXT_NONE', 0x0000);
+
+/**
+ * Internal menu flag: Local task should be displayed in page context.
+ */
+define('MENU_CONTEXT_PAGE', 0x0001);
+
+/**
+ * Internal menu flag: Local task should be displayed inline.
+ */
+define('MENU_CONTEXT_INLINE', 0x0002);
+
+/**
+ * @} End of "Menu context types".
+ */
+
+/**
+ * @defgroup menu_status_codes Menu status codes
+ * @{
+ * Status codes for menu callbacks.
+ */
+
+/**
+ * Internal menu status code -- Menu item was found.
+ */
+define('MENU_FOUND', 1);
+
+/**
+ * Internal menu status code -- Menu item was not found.
+ */
+define('MENU_NOT_FOUND', 2);
+
+/**
+ * Internal menu status code -- Menu item access is denied.
+ */
+define('MENU_ACCESS_DENIED', 3);
+
+/**
+ * Internal menu status code -- Menu item inaccessible because site is offline.
+ */
+define('MENU_SITE_OFFLINE', 4);
+
+/**
+ * Internal menu status code -- Everything is working fine.
+ */
+define('MENU_SITE_ONLINE', 5);
+
+/**
+ * @} End of "Menu status codes".
+ */
+
+/**
+ * @defgroup menu_tree_parameters Menu tree parameters
+ * @{
+ * Parameters for a menu tree.
+ */
+
+ /**
+ * The maximum number of path elements for a menu callback
+ */
+define('MENU_MAX_PARTS', 9);
+
+
+/**
+ * The maximum depth of a menu links tree - matches the number of p columns.
+ */
+define('MENU_MAX_DEPTH', 9);
+
+
+/**
+ * @} End of "Menu tree parameters".
+ */
+
+/**
+ * Reserved key to identify the most specific menu link for a given path.
+ *
+ * The value of this constant is a hash of the constant name. We use the hash
+ * so that the reserved key is over 32 characters in length and will not
+ * collide with allowed menu names:
+ * @code
+ * sha1('MENU_PREFERRED_LINK') = 1cf698d64d1aa4b83907cf6ed55db3a7f8e92c91
+ * @endcode
+ *
+ * @see menu_link_get_preferred()
+ */
+define('MENU_PREFERRED_LINK', '1cf698d64d1aa4b83907cf6ed55db3a7f8e92c91');
+
+/**
+ * Returns the ancestors (and relevant placeholders) for any given path.
+ *
+ * For example, the ancestors of node/12345/edit are:
+ * - node/12345/edit
+ * - node/12345/%
+ * - node/%/edit
+ * - node/%/%
+ * - node/12345
+ * - node/%
+ * - node
+ *
+ * To generate these, we will use binary numbers. Each bit represents a
+ * part of the path. If the bit is 1, then it represents the original
+ * value while 0 means wildcard. If the path is node/12/edit/foo
+ * then the 1011 bitstring represents node/%/edit/foo where % means that
+ * any argument matches that part. We limit ourselves to using binary
+ * numbers that correspond the patterns of wildcards of router items that
+ * actually exists. This list of 'masks' is built in menu_rebuild().
+ *
+ * @param $parts
+ *   An array of path parts; for the above example, 
+ *   array('node', '12345', 'edit').
+ *
+ * @return
+ *   An array which contains the ancestors and placeholders. Placeholders
+ *   simply contain as many '%s' as the ancestors.
+ */
+function menu_get_ancestors($parts) {
+  $number_parts = count($parts);
+  $ancestors = array();
+  $length =  $number_parts - 1;
+  $end = (1 << $number_parts) - 1;
+  $masks = variable_get('menu_masks');
+  // If the optimized menu_masks array is not available use brute force to get
+  // the correct $ancestors and $placeholders returned. Do not use this as the
+  // default value of the menu_masks variable to avoid building such a big
+  // array.
+  if (!$masks) {
+    $masks = range(511, 1);
+  }
+  // Only examine patterns that actually exist as router items (the masks).
+  foreach ($masks as $i) {
+    if ($i > $end) {
+      // Only look at masks that are not longer than the path of interest.
+      continue;
+    }
+    elseif ($i < (1 << $length)) {
+      // We have exhausted the masks of a given length, so decrease the length.
+      --$length;
+    }
+    $current = '';
+    for ($j = $length; $j >= 0; $j--) {
+      // Check the bit on the $j offset.
+      if ($i & (1 << $j)) {
+        // Bit one means the original value.
+        $current .= $parts[$length - $j];
+      }
+      else {
+        // Bit zero means means wildcard.
+        $current .= '%';
+      }
+      // Unless we are at offset 0, add a slash.
+      if ($j) {
+        $current .= '/';
+      }
+    }
+    $ancestors[] = $current;
+  }
+  return $ancestors;
+}
+
+/**
+ * Unserializes menu data, using a map to replace path elements.
+ *
+ * The menu system stores various path-related information (such as the 'page
+ * arguments' and 'access arguments' components of a menu item) in the database
+ * using serialized arrays, where integer values in the arrays represent
+ * arguments to be replaced by values from the path. This function first
+ * unserializes such menu information arrays, and then does the path
+ * replacement.
+ *
+ * The path replacement acts on each integer-valued element of the unserialized
+ * menu data array ($data) using a map array ($map, which is typically an array
+ * of path arguments) as a list of replacements. For instance, if there is an
+ * element of $data whose value is the number 2, then it is replaced in $data
+ * with $map[2]; non-integer values in $data are left alone.
+ *
+ * As an example, an unserialized $data array with elements ('node_load', 1)
+ * represents instructions for calling the node_load() function. Specifically,
+ * this instruction says to use the path component at index 1 as the input
+ * parameter to node_load(). If the path is 'node/123', then $map will be the
+ * array ('node', 123), and the returned array from this function will have
+ * elements ('node_load', 123), since $map[1] is 123. This return value will
+ * indicate specifically that node_load(123) is to be called to load the node
+ * whose ID is 123 for this menu item.
+ *
+ * @param $data
+ *   A serialized array of menu data, as read from the database.
+ * @param $map
+ *   A path argument array, used to replace integer values in $data; an integer
+ *   value N in $data will be replaced by value $map[N]. Typically, the $map
+ *   array is generated from a call to the arg() function.
+ *
+ * @return
+ *   The unserialized $data array, with path arguments replaced.
+ */
+function menu_unserialize($data, $map) {
+  if ($data = unserialize($data)) {
+    foreach ($data as $k => $v) {
+      if (is_int($v)) {
+        $data[$k] = isset($map[$v]) ? $map[$v] : '';
+      }
+    }
+    return $data;
+  }
+  else {
+    return array();
+  }
+}
+
+
+
+/**
+ * Replaces the statically cached item for a given path.
+ *
+ * @param $path
+ *   The path.
+ * @param $router_item
+ *   The router item. Usually a router entry from menu_get_item() is either
+ *   modified or set to a different path. This allows the navigation block,
+ *   the page title, the breadcrumb, and the page help to be modified in one
+ *   call.
+ */
+function menu_set_item($path, $router_item) {
+  menu_get_item($path, $router_item);
+}
+
+/**
+ * Gets a router item.
+ *
+ * @param $path
+ *   The path; for example, 'node/5'. The function will find the corresponding
+ *   node/% item and return that.
+ * @param $router_item
+ *   Internal use only.
+ *
+ * @return
+ *   The router item or, if an error occurs in _menu_translate(), FALSE. A
+ *   router item is an associative array corresponding to one row in the
+ *   menu_router table. The value corresponding to the key 'map' holds the
+ *   loaded objects. The value corresponding to the key 'access' is TRUE if the
+ *   current user can access this page. The values corresponding to the keys
+ *   'title', 'page_arguments', 'access_arguments', and 'theme_arguments' will
+ *   be filled in based on the database values and the objects loaded.
+ */
+function menu_get_item($path = NULL, $router_item = NULL) {
+  $router_items = &drupal_static(__FUNCTION__);
+  if (!isset($path)) {
+    $path = $_GET['q'];
+  }
+  if (isset($router_item)) {
+    $router_items[$path] = $router_item;
+  }
+  if (!isset($router_items[$path])) {
+    // Rebuild if we know it's needed, or if the menu masks are missing which
+    // occurs rarely, likely due to a race condition of multiple rebuilds.
+    if (variable_get('menu_rebuild_needed', FALSE) || !variable_get('menu_masks', array())) {
+      menu_rebuild();
+    }
+    $original_map = arg(NULL, $path);
+
+    $parts = array_slice($original_map, 0, MENU_MAX_PARTS);
+    $ancestors = menu_get_ancestors($parts);
+    $router_item = db_query_range('SELECT * FROM {menu_router} WHERE path IN (:ancestors) ORDER BY fit DESC', 0, 1, array(':ancestors' => $ancestors))->fetchAssoc();
+
+    if ($router_item) {
+      // Allow modules to alter the router item before it is translated and
+      // checked for access.
+      drupal_alter('menu_get_item', $router_item, $path, $original_map);
+
+      $map = _menu_translate($router_item, $original_map);
+      $router_item['original_map'] = $original_map;
+      if ($map === FALSE) {
+        $router_items[$path] = FALSE;
+        return FALSE;
+      }
+      if ($router_item['access']) {
+        $router_item['map'] = $map;
+        $router_item['page_arguments'] = array_merge(menu_unserialize($router_item['page_arguments'], $map), array_slice($map, $router_item['number_parts']));
+        $router_item['theme_arguments'] = array_merge(menu_unserialize($router_item['theme_arguments'], $map), array_slice($map, $router_item['number_parts']));
+      }
+    }
+    $router_items[$path] = $router_item;
+  }
+  return $router_items[$path];
+}
+
+/**
+ * Execute the page callback associated with the current path.
+ *
+ * @param $path
+ *   The drupal path whose handler is to be be executed. If set to NULL, then
+ *   the current path is used.
+ * @param $deliver
+ *   (optional) A boolean to indicate whether the content should be sent to the
+ *   browser using the appropriate delivery callback (TRUE) or whether to return
+ *   the result to the caller (FALSE).
+ */
+function menu_execute_active_handler($path = NULL, $deliver = TRUE) {
+  // Check if site is offline.
+  $page_callback_result = _menu_site_is_offline() ? MENU_SITE_OFFLINE : MENU_SITE_ONLINE;
+
+  // Allow other modules to change the site status but not the path because that
+  // would not change the global variable. hook_url_inbound_alter() can be used
+  // to change the path. Code later will not use the $read_only_path variable.
+  $read_only_path = !empty($path) ? $path : $_GET['q'];
+  drupal_alter('menu_site_status', $page_callback_result, $read_only_path);
+
+  // Only continue if the site status is not set.
+  if ($page_callback_result == MENU_SITE_ONLINE) {
+    if ($router_item = menu_get_item($path)) {
+      if ($router_item['access']) {
+        if ($router_item['include_file']) {
+          require_once DRUPAL_ROOT . '/' . $router_item['include_file'];
+        }
+        $page_callback_result = call_user_func_array($router_item['page_callback'], $router_item['page_arguments']);
+      }
+      else {
+        $page_callback_result = MENU_ACCESS_DENIED;
+      }
+    }
+    else {
+      $page_callback_result = MENU_NOT_FOUND;
+    }
+  }
+
+  // Deliver the result of the page callback to the browser, or if requested,
+  // return it raw, so calling code can do more processing.
+  if ($deliver) {
+    $default_delivery_callback = (isset($router_item) && $router_item) ? $router_item['delivery_callback'] : NULL;
+    drupal_deliver_page($page_callback_result, $default_delivery_callback);
+  }
+  else {
+    return $page_callback_result;
+  }
+}
+
+/**
+ * Loads objects into the map as defined in the $item['load_functions'].
+ *
+ * @param $item
+ *   A menu router or menu link item
+ * @param $map
+ *   An array of path arguments; for example, array('node', '5').
+ *
+ * @return
+ *   Returns TRUE for success, FALSE if an object cannot be loaded.
+ *   Names of object loading functions are placed in $item['load_functions'].
+ *   Loaded objects are placed in $map[]; keys are the same as keys in the
+ *   $item['load_functions'] array.
+ *   $item['access'] is set to FALSE if an object cannot be loaded.
+ */
+function _menu_load_objects(&$item, &$map) {
+  if ($load_functions = $item['load_functions']) {
+    // If someone calls this function twice, then unserialize will fail.
+    if (!is_array($load_functions)) {
+      $load_functions = unserialize($load_functions);
+    }
+    $path_map = $map;
+    foreach ($load_functions as $index => $function) {
+      if ($function) {
+        $value = isset($path_map[$index]) ? $path_map[$index] : '';
+        if (is_array($function)) {
+          // Set up arguments for the load function. These were pulled from
+          // 'load arguments' in the hook_menu() entry, but they need
+          // some processing. In this case the $function is the key to the
+          // load_function array, and the value is the list of arguments.
+          list($function, $args) = each($function);
+          $load_functions[$index] = $function;
+
+          // Some arguments are placeholders for dynamic items to process.
+          foreach ($args as $i => $arg) {
+            if ($arg === '%index') {
+              // Pass on argument index to the load function, so multiple
+              // occurrences of the same placeholder can be identified.
+              $args[$i] = $index;
+            }
+            if ($arg === '%map') {
+              // Pass on menu map by reference. The accepting function must
+              // also declare this as a reference if it wants to modify
+              // the map.
+              $args[$i] = &$map;
+            }
+            if (is_int($arg)) {
+              $args[$i] = isset($path_map[$arg]) ? $path_map[$arg] : '';
+            }
+          }
+          array_unshift($args, $value);
+          $return = call_user_func_array($function, $args);
+        }
+        else {
+          $return = $function($value);
+        }
+        // If callback returned an error or there is no callback, trigger 404.
+        if ($return === FALSE) {
+          $item['access'] = FALSE;
+          $map = FALSE;
+          return FALSE;
+        }
+        $map[$index] = $return;
+      }
+    }
+    $item['load_functions'] = $load_functions;
+  }
+  return TRUE;
+}
+
+/**
+ * Checks access to a menu item using the access callback.
+ *
+ * @param $item
+ *   A menu router or menu link item
+ * @param $map
+ *   An array of path arguments; for example, array('node', '5').
+ *
+ * @return
+ *   $item['access'] becomes TRUE if the item is accessible, FALSE otherwise.
+ */
+function _menu_check_access(&$item, $map) {
+  $item['access'] = FALSE;
+  // Determine access callback, which will decide whether or not the current
+  // user has access to this path.
+  $callback = empty($item['access_callback']) ? 0 : trim($item['access_callback']);
+  // Check for a TRUE or FALSE value.
+  if (is_numeric($callback)) {
+    $item['access'] = (bool) $callback;
+  }
+  else {
+    $arguments = menu_unserialize($item['access_arguments'], $map);
+    // As call_user_func_array is quite slow and user_access is a very common
+    // callback, it is worth making a special case for it.
+    if ($callback == 'user_access') {
+      $item['access'] = (count($arguments) == 1) ? user_access($arguments[0]) : user_access($arguments[0], $arguments[1]);
+    }
+    elseif (function_exists($callback)) {
+      $item['access'] = call_user_func_array($callback, $arguments);
+    }
+  }
+}
+
+/**
+ * Localizes the router item title using t() or another callback.
+ *
+ * Translate the title and description to allow storage of English title
+ * strings in the database, yet display of them in the language required
+ * by the current user.
+ *
+ * @param $item
+ *   A menu router item or a menu link item.
+ * @param $map
+ *   The path as an array with objects already replaced. E.g., for path
+ *   node/123 $map would be array('node', $node) where $node is the node
+ *   object for node 123.
+ * @param $link_translate
+ *   TRUE if we are translating a menu link item; FALSE if we are
+ *   translating a menu router item.
+ *
+ * @return
+ *   No return value.
+ *   $item['title'] is localized according to $item['title_callback'].
+ *   If an item's callback is check_plain(), $item['options']['html'] becomes
+ *   TRUE.
+ *   $item['description'] is translated using t().
+ *   When doing link translation and the $item['options']['attributes']['title']
+ *   (link title attribute) matches the description, it is translated as well.
+ */
+function _menu_item_localize(&$item, $map, $link_translate = FALSE) {
+  $callback = $item['title_callback'];
+  $item['localized_options'] = $item['options'];
+  // All 'class' attributes are assumed to be an array during rendering, but
+  // links stored in the database may use an old string value.
+  // @todo In order to remove this code we need to implement a database update
+  //   including unserializing all existing link options and running this code
+  //   on them, as well as adding validation to menu_link_save().
+  if (isset($item['options']['attributes']['class']) && is_string($item['options']['attributes']['class'])) {
+    $item['localized_options']['attributes']['class'] = explode(' ', $item['options']['attributes']['class']);
+  }
+  // If we are translating the title of a menu link, and its title is the same
+  // as the corresponding router item, then we can use the title information
+  // from the router. If it's customized, then we need to use the link title
+  // itself; can't localize.
+  // If we are translating a router item (tabs, page, breadcrumb), then we
+  // can always use the information from the router item.
+  if (!$link_translate || ($item['title'] == $item['link_title'])) {
+    // t() is a special case. Since it is used very close to all the time,
+    // we handle it directly instead of using indirect, slower methods.
+    if ($callback == 't') {
+      if (empty($item['title_arguments'])) {
+        $item['title'] = t($item['title']);
+      }
+      else {
+        $item['title'] = t($item['title'], menu_unserialize($item['title_arguments'], $map));
+      }
+    }
+    elseif ($callback && function_exists($callback)) {
+      if (empty($item['title_arguments'])) {
+        $item['title'] = $callback($item['title']);
+      }
+      else {
+        $item['title'] = call_user_func_array($callback, menu_unserialize($item['title_arguments'], $map));
+      }
+      // Avoid calling check_plain again on l() function.
+      if ($callback == 'check_plain') {
+        $item['localized_options']['html'] = TRUE;
+      }
+    }
+  }
+  elseif ($link_translate) {
+    $item['title'] = $item['link_title'];
+  }
+
+  // Translate description, see the motivation above.
+  if (!empty($item['description'])) {
+    $original_description = $item['description'];
+    $item['description'] = t($item['description']);
+    if ($link_translate && isset($item['options']['attributes']['title']) && $item['options']['attributes']['title'] == $original_description) {
+      $item['localized_options']['attributes']['title'] = $item['description'];
+    }
+  }
+}
+
+/**
+ * Handles dynamic path translation and menu access control.
+ *
+ * When a user arrives on a page such as node/5, this function determines
+ * what "5" corresponds to, by inspecting the page's menu path definition,
+ * node/%node. This will call node_load(5) to load the corresponding node
+ * object.
+ *
+ * It also works in reverse, to allow the display of tabs and menu items which
+ * contain these dynamic arguments, translating node/%node to node/5.
+ *
+ * Translation of menu item titles and descriptions are done here to
+ * allow for storage of English strings in the database, and translation
+ * to the language required to generate the current page.
+ *
+ * @param $router_item
+ *   A menu router item
+ * @param $map
+ *   An array of path arguments; for example, array('node', '5').
+ * @param $to_arg
+ *   Execute $item['to_arg_functions'] or not. Use only if you want to render a
+ *   path from the menu table, for example tabs.
+ *
+ * @return
+ *   Returns the map with objects loaded as defined in the
+ *   $item['load_functions']. $item['access'] becomes TRUE if the item is
+ *   accessible, FALSE otherwise. $item['href'] is set according to the map.
+ *   If an error occurs during calling the load_functions (like trying to load
+ *   a non-existent node) then this function returns FALSE.
+ */
+function _menu_translate(&$router_item, $map, $to_arg = FALSE) {
+  if ($to_arg && !empty($router_item['to_arg_functions'])) {
+    // Fill in missing path elements, such as the current uid.
+    _menu_link_map_translate($map, $router_item['to_arg_functions']);
+  }
+  // The $path_map saves the pieces of the path as strings, while elements in
+  // $map may be replaced with loaded objects.
+  $path_map = $map;
+  if (!empty($router_item['load_functions']) && !_menu_load_objects($router_item, $map)) {
+    // An error occurred loading an object.
+    $router_item['access'] = FALSE;
+    return FALSE;
+  }
+
+  // Generate the link path for the page request or local tasks.
+  $link_map = explode('/', $router_item['path']);
+  if (isset($router_item['tab_root'])) {
+    $tab_root_map = explode('/', $router_item['tab_root']);
+  }
+  if (isset($router_item['tab_parent'])) {
+    $tab_parent_map = explode('/', $router_item['tab_parent']);
+  }
+  for ($i = 0; $i < $router_item['number_parts']; $i++) {
+    if ($link_map[$i] == '%') {
+      $link_map[$i] = $path_map[$i];
+    }
+    if (isset($tab_root_map[$i]) && $tab_root_map[$i] == '%') {
+      $tab_root_map[$i] = $path_map[$i];
+    }
+    if (isset($tab_parent_map[$i]) && $tab_parent_map[$i] == '%') {
+      $tab_parent_map[$i] = $path_map[$i];
+    }
+  }
+  $router_item['href'] = implode('/', $link_map);
+  $router_item['tab_root_href'] = implode('/', $tab_root_map);
+  $router_item['tab_parent_href'] = implode('/', $tab_parent_map);
+  $router_item['options'] = array();
+  _menu_check_access($router_item, $map);
+
+  // For performance, don't localize an item the user can't access.
+  if ($router_item['access']) {
+    _menu_item_localize($router_item, $map);
+  }
+
+  return $map;
+}
+
+/**
+ * Translates the path elements in the map using any to_arg helper function.
+ *
+ * @param $map
+ *   An array of path arguments; for example, array('node', '5').
+ * @param $to_arg_functions
+ *   An array of helper functions; for example, array(2 => 'menu_tail_to_arg').
+ *
+ * @see hook_menu()
+ */
+function _menu_link_map_translate(&$map, $to_arg_functions) {
+  $to_arg_functions = unserialize($to_arg_functions);
+  foreach ($to_arg_functions as $index => $function) {
+    // Translate place-holders into real values.
+    $arg = $function(!empty($map[$index]) ? $map[$index] : '', $map, $index);
+    if (!empty($map[$index]) || isset($arg)) {
+      $map[$index] = $arg;
+    }
+    else {
+      unset($map[$index]);
+    }
+  }
+}
+
+/**
+ * Returns a string containing the path relative to the current index.
+ */
+function menu_tail_to_arg($arg, $map, $index) {
+  return implode('/', array_slice($map, $index));
+}
+
+/**
+ * Loads the path as one string relative to the current index.
+ *
+ * To use this load function, you must specify the load arguments
+ * in the router item as:
+ * @code
+ * $item['load arguments'] = array('%map', '%index');
+ * @endcode
+ *
+ * @see search_menu().
+ */
+function menu_tail_load($arg, &$map, $index) {
+  $arg = implode('/', array_slice($map, $index));
+  $map = array_slice($map, 0, $index);
+  return $arg;
+}
+
+/**
+ * Provides menu link access control, translation, and argument handling.
+ *
+ * This function is similar to _menu_translate(), but it also does
+ * link-specific preparation (such as always calling to_arg() functions).
+ *
+ * @param $item
+ *   A menu link.
+ * @param $translate
+ *   (optional) Whether to try to translate a link containing dynamic path
+ *   argument placeholders (%) based on the menu router item of the current
+ *   path. Defaults to FALSE. Internally used for breadcrumbs.
+ *
+ * @return
+ *   Returns the map of path arguments with objects loaded as defined in the
+ *   $item['load_functions'].
+ *   $item['access'] becomes TRUE if the item is accessible, FALSE otherwise.
+ *   $item['href'] is generated from link_path, possibly by to_arg functions.
+ *   $item['title'] is generated from link_title, and may be localized.
+ *   $item['options'] is unserialized; it is also changed within the call here
+ *   to $item['localized_options'] by _menu_item_localize().
+ */
+function _menu_link_translate(&$item, $translate = FALSE) {
+  if (!is_array($item['options'])) {
+    $item['options'] = unserialize($item['options']);
+  }
+  if ($item['external']) {
+    $item['access'] = 1;
+    $map = array();
+    $item['href'] = $item['link_path'];
+    $item['title'] = $item['link_title'];
+    $item['localized_options'] = $item['options'];
+  }
+  else {
+    // Complete the path of the menu link with elements from the current path,
+    // if it contains dynamic placeholders (%).
+    $map = explode('/', $item['link_path']);
+    if (strpos($item['link_path'], '%') !== FALSE) {
+      // Invoke registered to_arg callbacks.
+      if (!empty($item['to_arg_functions'])) {
+        _menu_link_map_translate($map, $item['to_arg_functions']);
+      }
+      // Or try to derive the path argument map from the current router item,
+      // if this $item's path is within the router item's path. This means
+      // that if we are on the current path 'foo/%/bar/%/baz', then
+      // menu_get_item() will have translated the menu router item for the
+      // current path, and we can take over the argument map for a link like
+      // 'foo/%/bar'. This inheritance is only valid for breadcrumb links.
+      // @see _menu_tree_check_access()
+      // @see menu_get_active_breadcrumb()
+      elseif ($translate && ($current_router_item = menu_get_item())) {
+        // If $translate is TRUE, then this link is in the active trail.
+        // Only translate paths within the current path.
+        if (strpos($current_router_item['path'], $item['link_path']) === 0) {
+          $count = count($map);
+          $map = array_slice($current_router_item['original_map'], 0, $count);
+          $item['original_map'] = $map;
+          if (isset($current_router_item['map'])) {
+            $item['map'] = array_slice($current_router_item['map'], 0, $count);
+          }
+          // Reset access to check it (for the first time).
+          unset($item['access']);
+        }
+      }
+    }
+    $item['href'] = implode('/', $map);
+
+    // Skip links containing untranslated arguments.
+    if (strpos($item['href'], '%') !== FALSE) {
+      $item['access'] = FALSE;
+      return FALSE;
+    }
+    // menu_tree_check_access() may set this ahead of time for links to nodes.
+    if (!isset($item['access'])) {
+      if (!empty($item['load_functions']) && !_menu_load_objects($item, $map)) {
+        // An error occurred loading an object.
+        $item['access'] = FALSE;
+        return FALSE;
+      }
+      _menu_check_access($item, $map);
+    }
+    // For performance, don't localize a link the user can't access.
+    if ($item['access']) {
+      _menu_item_localize($item, $map, TRUE);
+    }
+  }
+
+  // Allow other customizations - e.g. adding a page-specific query string to the
+  // options array. For performance reasons we only invoke this hook if the link
+  // has the 'alter' flag set in the options array.
+  if (!empty($item['options']['alter'])) {
+    drupal_alter('translated_menu_link', $item, $map);
+  }
+
+  return $map;
+}
+
+/**
+ * Gets a loaded object from a router item.
+ *
+ * menu_get_object() provides access to objects loaded by the current router
+ * item. For example, on the page node/%node, the router loads the %node object,
+ * and calling menu_get_object() will return that. Normally, it is necessary to
+ * specify the type of object referenced, however node is the default.
+ * The following example tests to see whether the node being displayed is of the
+ * "story" content type:
+ * @code
+ * $node = menu_get_object();
+ * $story = $node->type == 'story';
+ * @endcode
+ *
+ * @param $type
+ *   Type of the object. These appear in hook_menu definitions as %type. Core
+ *   provides aggregator_feed, aggregator_category, contact, filter_format,
+ *   forum_term, menu, menu_link, node, taxonomy_vocabulary, user. See the
+ *   relevant {$type}_load function for more on each. Defaults to node.
+ * @param $position
+ *   The position of the object in the path, where the first path segment is 0.
+ *   For node/%node, the position of %node is 1, but for comment/reply/%node,
+ *   it's 2. Defaults to 1.
+ * @param $path
+ *   See menu_get_item() for more on this. Defaults to the current path.
+ */
+function menu_get_object($type = 'node', $position = 1, $path = NULL) {
+  $router_item = menu_get_item($path);
+  if (isset($router_item['load_functions'][$position]) && !empty($router_item['map'][$position]) && $router_item['load_functions'][$position] == $type . '_load') {
+    return $router_item['map'][$position];
+  }
+}
+
+/**
+ * Renders a menu tree based on the current path.
+ *
+ * The tree is expanded based on the current path and dynamic paths are also
+ * changed according to the defined to_arg functions (for example the 'My
+ * account' link is changed from user/% to a link with the current user's uid).
+ *
+ * @param $menu_name
+ *   The name of the menu.
+ *
+ * @return
+ *   A structured array representing the specified menu on the current page, to
+ *   be rendered by drupal_render().
+ */
+function menu_tree($menu_name) {
+  $menu_output = &drupal_static(__FUNCTION__, array());
+
+  if (!isset($menu_output[$menu_name])) {
+    $tree = menu_tree_page_data($menu_name);
+    $menu_output[$menu_name] = menu_tree_output($tree);
+  }
+  return $menu_output[$menu_name];
+}
+
+/**
+ * Returns a rendered menu tree.
+ *
+ * The menu item's LI element is given one of the following classes:
+ * - expanded: The menu item is showing its submenu.
+ * - collapsed: The menu item has a submenu which is not shown.
+ * - leaf: The menu item has no submenu.
+ *
+ * @param $tree
+ *   A data structure representing the tree as returned from menu_tree_data.
+ *
+ * @return
+ *   A structured array to be rendered by drupal_render().
+ */
+function menu_tree_output($tree) {
+  $build = array();
+  $items = array();
+
+  // Pull out just the menu links we are going to render so that we
+  // get an accurate count for the first/last classes.
+  foreach ($tree as $data) {
+    if ($data['link']['access'] && !$data['link']['hidden']) {
+      $items[] = $data;
+    }
+  }
+
+  $router_item = menu_get_item();
+  $num_items = count($items);
+  foreach ($items as $i => $data) {
+    $class = array();
+    if ($i == 0) {
+      $class[] = 'first';
+    }
+    if ($i == $num_items - 1) {
+      $class[] = 'last';
+    }
+    // Set a class for the <li>-tag. Since $data['below'] may contain local
+    // tasks, only set 'expanded' class if the link also has children within
+    // the current menu.
+    if ($data['link']['has_children'] && $data['below']) {
+      $class[] = 'expanded';
+    }
+    elseif ($data['link']['has_children']) {
+      $class[] = 'collapsed';
+    }
+    else {
+      $class[] = 'leaf';
+    }
+    // Set a class if the link is in the active trail.
+    if ($data['link']['in_active_trail']) {
+      $class[] = 'active-trail';
+      $data['link']['localized_options']['attributes']['class'][] = 'active-trail';
+    }
+    // Normally, l() compares the href of every link with $_GET['q'] and sets
+    // the active class accordingly. But local tasks do not appear in menu
+    // trees, so if the current path is a local task, and this link is its
+    // tab root, then we have to set the class manually.
+    if ($data['link']['href'] == $router_item['tab_root_href'] && $data['link']['href'] != $_GET['q']) {
+      $data['link']['localized_options']['attributes']['class'][] = 'active';
+    }
+
+    // Allow menu-specific theme overrides.
+    $element['#theme'] = 'menu_link__' . strtr($data['link']['menu_name'], '-', '_');
+    $element['#attributes']['class'] = $class;
+    $element['#title'] = $data['link']['title'];
+    $element['#href'] = $data['link']['href'];
+    $element['#localized_options'] = !empty($data['link']['localized_options']) ? $data['link']['localized_options'] : array();
+    $element['#below'] = $data['below'] ? menu_tree_output($data['below']) : $data['below'];
+    $element['#original_link'] = $data['link'];
+    // Index using the link's unique mlid.
+    $build[$data['link']['mlid']] = $element;
+  }
+  if ($build) {
+    // Make sure drupal_render() does not re-order the links.
+    $build['#sorted'] = TRUE;
+    // Add the theme wrapper for outer markup.
+    // Allow menu-specific theme overrides.
+    $build['#theme_wrappers'][] = 'menu_tree__' . strtr($data['link']['menu_name'], '-', '_');
+  }
+
+  return $build;
+}
+
+/**
+ * Gets the data structure representing a named menu tree.
+ *
+ * Since this can be the full tree including hidden items, the data returned
+ * may be used for generating an an admin interface or a select.
+ *
+ * @param $menu_name
+ *   The named menu links to return
+ * @param $link
+ *   A fully loaded menu link, or NULL. If a link is supplied, only the
+ *   path to root will be included in the returned tree - as if this link
+ *   represented the current page in a visible menu.
+ * @param $max_depth
+ *   Optional maximum depth of links to retrieve. Typically useful if only one
+ *   or two levels of a sub tree are needed in conjunction with a non-NULL
+ *   $link, in which case $max_depth should be greater than $link['depth'].
+ *
+ * @return
+ *   An tree of menu links in an array, in the order they should be rendered.
+ */
+function menu_tree_all_data($menu_name, $link = NULL, $max_depth = NULL) {
+  $tree = &drupal_static(__FUNCTION__, array());
+
+  // Use $mlid as a flag for whether the data being loaded is for the whole tree.
+  $mlid = isset($link['mlid']) ? $link['mlid'] : 0;
+  // Generate a cache ID (cid) specific for this $menu_name, $link, $language, and depth.
+  $cid = 'links:' . $menu_name . ':all:' . $mlid . ':' . $GLOBALS['language']->language . ':' . (int) $max_depth;
+
+  if (!isset($tree[$cid])) {
+    // If the static variable doesn't have the data, check {cache_menu}.
+    $cache = cache_get($cid, 'cache_menu');
+    if ($cache && isset($cache->data)) {
+      // If the cache entry exists, it contains the parameters for
+      // menu_build_tree().
+      $tree_parameters = $cache->data;
+    }
+    // If the tree data was not in the cache, build $tree_parameters.
+    if (!isset($tree_parameters)) {
+      $tree_parameters = array(
+        'min_depth' => 1,
+        'max_depth' => $max_depth,
+      );
+      if ($mlid) {
+        // The tree is for a single item, so we need to match the values in its
+        // p columns and 0 (the top level) with the plid values of other links.
+        $parents = array(0);
+        for ($i = 1; $i < MENU_MAX_DEPTH; $i++) {
+          if (!empty($link["p$i"])) {
+            $parents[] = $link["p$i"];
+          }
+        }
+        $tree_parameters['expanded'] = $parents;
+        $tree_parameters['active_trail'] = $parents;
+        $tree_parameters['active_trail'][] = $mlid;
+      }
+
+      // Cache the tree building parameters using the page-specific cid.
+      cache_set($cid, $tree_parameters, 'cache_menu');
+    }
+
+    // Build the tree using the parameters; the resulting tree will be cached
+    // by _menu_build_tree()).
+    $tree[$cid] = menu_build_tree($menu_name, $tree_parameters);
+  }
+
+  return $tree[$cid];
+}
+
+/**
+ * Sets the path for determining the active trail of the specified menu tree.
+ *
+ * This path will also affect the breadcrumbs under some circumstances.
+ * Breadcrumbs are built using the preferred link returned by
+ * menu_link_get_preferred(). If the preferred link is inside one of the menus
+ * specified in calls to menu_tree_set_path(), the preferred link will be
+ * overridden by the corresponding path returned by menu_tree_get_path().
+ *
+ * Setting this path does not affect the main content; for that use
+ * menu_set_active_item() instead.
+ *
+ * @param $menu_name
+ *   The name of the affected menu tree.
+ * @param $path
+ *   The path to use when finding the active trail.
+ */
+function menu_tree_set_path($menu_name, $path = NULL) {
+  $paths = &drupal_static(__FUNCTION__);
+  if (isset($path)) {
+    $paths[$menu_name] = $path;
+  }
+  return isset($paths[$menu_name]) ? $paths[$menu_name] : NULL;
+}
+
+/**
+ * Gets the path for determining the active trail of the specified menu tree.
+ *
+ * @param $menu_name
+ *   The menu name of the requested tree.
+ *
+ * @return
+ *   A string containing the path. If no path has been specified with
+ *   menu_tree_set_path(), NULL is returned.
+ */
+function menu_tree_get_path($menu_name) {
+  return menu_tree_set_path($menu_name);
+}
+
+/**
+ * Gets the data structure for a named menu tree, based on the current page.
+ *
+ * The tree order is maintained by storing each parent in an individual
+ * field, see http://drupal.org/node/141866 for more.
+ *
+ * @param $menu_name
+ *   The named menu links to return.
+ * @param $max_depth
+ *   (optional) The maximum depth of links to retrieve.
+ * @param $only_active_trail
+ *   (optional) Whether to only return the links in the active trail (TRUE)
+ *   instead of all links on every level of the menu link tree (FALSE). Defaults
+ *   to FALSE. Internally used for breadcrumbs only.
+ *
+ * @return
+ *   An array of menu links, in the order they should be rendered. The array
+ *   is a list of associative arrays -- these have two keys, link and below.
+ *   link is a menu item, ready for theming as a link. Below represents the
+ *   submenu below the link if there is one, and it is a subtree that has the
+ *   same structure described for the top-level array.
+ */
+function menu_tree_page_data($menu_name, $max_depth = NULL, $only_active_trail = FALSE) {
+  $tree = &drupal_static(__FUNCTION__, array());
+
+  // Check if the active trail has been overridden for this menu tree.
+  $active_path = menu_tree_get_path($menu_name);
+  // Load the menu item corresponding to the current page.
+  if ($item = menu_get_item($active_path)) {
+    if (isset($max_depth)) {
+      $max_depth = min($max_depth, MENU_MAX_DEPTH);
+    }
+    // Generate a cache ID (cid) specific for this page.
+    $cid = 'links:' . $menu_name . ':page:' . $item['href'] . ':' . $GLOBALS['language']->language . ':' . (int) $item['access'] . ':' . (int) $max_depth;
+    // If we are asked for the active trail only, and $menu_name has not been
+    // built and cached for this page yet, then this likely means that it
+    // won't be built anymore, as this function is invoked from
+    // template_process_page(). So in order to not build a giant menu tree
+    // that needs to be checked for access on all levels, we simply check
+    // whether we have the menu already in cache, or otherwise, build a minimum
+    // tree containing the breadcrumb/active trail only.
+    // @see menu_set_active_trail()
+    if (!isset($tree[$cid]) && $only_active_trail) {
+      $cid .= ':trail';
+    }
+
+    if (!isset($tree[$cid])) {
+      // If the static variable doesn't have the data, check {cache_menu}.
+      $cache = cache_get($cid, 'cache_menu');
+      if ($cache && isset($cache->data)) {
+        // If the cache entry exists, it contains the parameters for
+        // menu_build_tree().
+        $tree_parameters = $cache->data;
+      }
+      // If the tree data was not in the cache, build $tree_parameters.
+      if (!isset($tree_parameters)) {
+        $tree_parameters = array(
+          'min_depth' => 1,
+          'max_depth' => $max_depth,
+        );
+        // Parent mlids; used both as key and value to ensure uniqueness.
+        // We always want all the top-level links with plid == 0.
+        $active_trail = array(0 => 0);
+
+        // If the item for the current page is accessible, build the tree
+        // parameters accordingly.
+        if ($item['access']) {
+          // Find a menu link corresponding to the current path. If $active_path
+          // is NULL, let menu_link_get_preferred() determine the path.
+          if ($active_link = menu_link_get_preferred($active_path, $menu_name)) {
+            // The active link may only be taken into account to build the
+            // active trail, if it resides in the requested menu. Otherwise,
+            // we'd needlessly re-run _menu_build_tree() queries for every menu
+            // on every page.
+            if ($active_link['menu_name'] == $menu_name) {
+              // Use all the coordinates, except the last one because there
+              // can be no child beyond the last column.
+              for ($i = 1; $i < MENU_MAX_DEPTH; $i++) {
+                if ($active_link['p' . $i]) {
+                  $active_trail[$active_link['p' . $i]] = $active_link['p' . $i];
+                }
+              }
+              // If we are asked to build links for the active trail only, skip
+              // the entire 'expanded' handling.
+              if ($only_active_trail) {
+                $tree_parameters['only_active_trail'] = TRUE;
+              }
+            }
+          }
+          $parents = $active_trail;
+
+          $expanded = variable_get('menu_expanded', array());
+          // Check whether the current menu has any links set to be expanded.
+          if (!$only_active_trail && in_array($menu_name, $expanded)) {
+            // Collect all the links set to be expanded, and then add all of
+            // their children to the list as well.
+            do {
+              $result = db_select('menu_links', NULL, array('fetch' => PDO::FETCH_ASSOC))
+                ->fields('menu_links', array('mlid'))
+                ->condition('menu_name', $menu_name)
+                ->condition('expanded', 1)
+                ->condition('has_children', 1)
+                ->condition('plid', $parents, 'IN')
+                ->condition('mlid', $parents, 'NOT IN')
+                ->execute();
+              $num_rows = FALSE;
+              foreach ($result as $item) {
+                $parents[$item['mlid']] = $item['mlid'];
+                $num_rows = TRUE;
+              }
+            } while ($num_rows);
+          }
+          $tree_parameters['expanded'] = $parents;
+          $tree_parameters['active_trail'] = $active_trail;
+        }
+        // If access is denied, we only show top-level links in menus.
+        else {
+          $tree_parameters['expanded'] = $active_trail;
+          $tree_parameters['active_trail'] = $active_trail;
+        }
+        // Cache the tree building parameters using the page-specific cid.
+        cache_set($cid, $tree_parameters, 'cache_menu');
+      }
+
+      // Build the tree using the parameters; the resulting tree will be cached
+      // by _menu_build_tree().
+      $tree[$cid] = menu_build_tree($menu_name, $tree_parameters);
+    }
+    return $tree[$cid];
+  }
+
+  return array();
+}
+
+/**
+ * Builds a menu tree, translates links, and checks access.
+ *
+ * @param $menu_name
+ *   The name of the menu.
+ * @param $parameters
+ *   (optional) An associative array of build parameters. Possible keys:
+ *   - expanded: An array of parent link ids to return only menu links that are
+ *     children of one of the plids in this list. If empty, the whole menu tree
+ *     is built, unless 'only_active_trail' is TRUE.
+ *   - active_trail: An array of mlids, representing the coordinates of the
+ *     currently active menu link.
+ *   - only_active_trail: Whether to only return links that are in the active
+ *     trail. This option is ignored, if 'expanded' is non-empty. Internally
+ *     used for breadcrumbs.
+ *   - min_depth: The minimum depth of menu links in the resulting tree.
+ *     Defaults to 1, which is the default to build a whole tree for a menu
+ *     (excluding menu container itself).
+ *   - max_depth: The maximum depth of menu links in the resulting tree.
+ *   - conditions: An associative array of custom database select query
+ *     condition key/value pairs; see _menu_build_tree() for the actual query.
+ *
+ * @return
+ *   A fully built menu tree.
+ */
+function menu_build_tree($menu_name, array $parameters = array()) {
+  // Build the menu tree.
+  $data = _menu_build_tree($menu_name, $parameters);
+  // Check access for the current user to each item in the tree.
+  menu_tree_check_access($data['tree'], $data['node_links']);
+  return $data['tree'];
+}
+
+/**
+ * Builds a menu tree.
+ *
+ * This function may be used build the data for a menu tree only, for example
+ * to further massage the data manually before further processing happens.
+ * menu_tree_check_access() needs to be invoked afterwards.
+ *
+ * @see menu_build_tree()
+ */
+function _menu_build_tree($menu_name, array $parameters = array()) {
+  // Static cache of already built menu trees.
+  $trees = &drupal_static(__FUNCTION__, array());
+
+  // Build the cache id; sort parents to prevent duplicate storage and remove
+  // default parameter values.
+  if (isset($parameters['expanded'])) {
+    sort($parameters['expanded']);
+  }
+  $tree_cid = 'links:' . $menu_name . ':tree-data:' . $GLOBALS['language']->language . ':' . hash('sha256', serialize($parameters));
+
+  // If we do not have this tree in the static cache, check {cache_menu}.
+  if (!isset($trees[$tree_cid])) {
+    $cache = cache_get($tree_cid, 'cache_menu');
+    if ($cache && isset($cache->data)) {
+      $trees[$tree_cid] = $cache->data;
+    }
+  }
+
+  if (!isset($trees[$tree_cid])) {
+    // Select the links from the table, and recursively build the tree. We
+    // LEFT JOIN since there is no match in {menu_router} for an external
+    // link.
+    $query = db_select('menu_links', 'ml', array('fetch' => PDO::FETCH_ASSOC));
+    $query->addTag('translatable');
+    $query->leftJoin('menu_router', 'm', 'm.path = ml.router_path');
+    $query->fields('ml');
+    $query->fields('m', array(
+      'load_functions',
+      'to_arg_functions',
+      'access_callback',
+      'access_arguments',
+      'page_callback',
+      'page_arguments',
+      'delivery_callback',
+      'tab_parent',
+      'tab_root',
+      'title',
+      'title_callback',
+      'title_arguments',
+      'theme_callback',
+      'theme_arguments',
+      'type',
+      'description',
+    ));
+    for ($i = 1; $i <= MENU_MAX_DEPTH; $i++) {
+      $query->orderBy('p' . $i, 'ASC');
+    }
+    $query->condition('ml.menu_name', $menu_name);
+    if (!empty($parameters['expanded'])) {
+      $query->condition('ml.plid', $parameters['expanded'], 'IN');
+    }
+    elseif (!empty($parameters['only_active_trail'])) {
+      $query->condition('ml.mlid', $parameters['active_trail'], 'IN');
+    }
+    $min_depth = (isset($parameters['min_depth']) ? $parameters['min_depth'] : 1);
+    if ($min_depth != 1) {
+      $query->condition('ml.depth', $min_depth, '>=');
+    }
+    if (isset($parameters['max_depth'])) {
+      $query->condition('ml.depth', $parameters['max_depth'], '<=');
+    }
+    // Add custom query conditions, if any were passed.
+    if (isset($parameters['conditions'])) {
+      foreach ($parameters['conditions'] as $column => $value) {
+        $query->condition($column, $value);
+      }
+    }
+
+    // Build an ordered array of links using the query result object.
+    $links = array();
+    foreach ($query->execute() as $item) {
+      $links[] = $item;
+    }
+    $active_trail = (isset($parameters['active_trail']) ? $parameters['active_trail'] : array());
+    $data['tree'] = menu_tree_data($links, $active_trail, $min_depth);
+    $data['node_links'] = array();
+    menu_tree_collect_node_links($data['tree'], $data['node_links']);
+
+    // Cache the data, if it is not already in the cache.
+    cache_set($tree_cid, $data, 'cache_menu');
+    $trees[$tree_cid] = $data;
+  }
+
+  return $trees[$tree_cid];
+}
+
+/**
+ * Collects node links from a given menu tree recursively.
+ *
+ * @param $tree
+ *   The menu tree you wish to collect node links from.
+ * @param $node_links
+ *   An array in which to store the collected node links.
+ */
+function menu_tree_collect_node_links(&$tree, &$node_links) {
+  foreach ($tree as $key => $v) {
+    if ($tree[$key]['link']['router_path'] == 'node/%') {
+      $nid = substr($tree[$key]['link']['link_path'], 5);
+      if (is_numeric($nid)) {
+        $node_links[$nid][$tree[$key]['link']['mlid']] = &$tree[$key]['link'];
+        $tree[$key]['link']['access'] = FALSE;
+      }
+    }
+    if ($tree[$key]['below']) {
+      menu_tree_collect_node_links($tree[$key]['below'], $node_links);
+    }
+  }
+}
+
+/**
+ * Checks access and performs dynamic operations for each link in the tree.
+ *
+ * @param $tree
+ *   The menu tree you wish to operate on.
+ * @param $node_links
+ *   A collection of node link references generated from $tree by
+ *   menu_tree_collect_node_links().
+ */
+function menu_tree_check_access(&$tree, $node_links = array()) {
+  if ($node_links) {
+    $nids = array_keys($node_links);
+    $select = db_select('node', 'n');
+    $select->addField('n', 'nid');
+    $select->condition('n.status', 1);
+    $select->condition('n.nid', $nids, 'IN');
+    $select->addTag('node_access');
+    $nids = $select->execute()->fetchCol();
+    foreach ($nids as $nid) {
+      foreach ($node_links[$nid] as $mlid => $link) {
+        $node_links[$nid][$mlid]['access'] = TRUE;
+      }
+    }
+  }
+  _menu_tree_check_access($tree);
+}
+
+/**
+ * Sorts the menu tree and recursively checks access for each item.
+ */
+function _menu_tree_check_access(&$tree) {
+  $new_tree = array();
+  foreach ($tree as $key => $v) {
+    $item = &$tree[$key]['link'];
+    _menu_link_translate($item);
+    if ($item['access'] || ($item['in_active_trail'] && strpos($item['href'], '%') !== FALSE)) {
+      if ($tree[$key]['below']) {
+        _menu_tree_check_access($tree[$key]['below']);
+      }
+      // The weights are made a uniform 5 digits by adding 50000 as an offset.
+      // After _menu_link_translate(), $item['title'] has the localized link title.
+      // Adding the mlid to the end of the index insures that it is unique.
+      $new_tree[(50000 + $item['weight']) . ' ' . $item['title'] . ' ' . $item['mlid']] = $tree[$key];
+    }
+  }
+  // Sort siblings in the tree based on the weights and localized titles.
+  ksort($new_tree);
+  $tree = $new_tree;
+}
+
+/**
+ * Sorts and returns the built data representing a menu tree.
+ *
+ * @param $links
+ *   A flat array of menu links that are part of the menu. Each array element
+ *   is an associative array of information about the menu link, containing the
+ *   fields from the {menu_links} table, and optionally additional information
+ *   from the {menu_router} table, if the menu item appears in both tables.
+ *   This array must be ordered depth-first. See _menu_build_tree() for a sample
+ *   query.
+ * @param $parents
+ *   An array of the menu link ID values that are in the path from the current
+ *   page to the root of the menu tree.
+ * @param $depth
+ *   The minimum depth to include in the returned menu tree.
+ *
+ * @return
+ *   An array of menu links in the form of a tree. Each item in the tree is an
+ *   associative array containing:
+ *   - link: The menu link item from $links, with additional element
+ *     'in_active_trail' (TRUE if the link ID was in $parents).
+ *   - below: An array containing the sub-tree of this item, where each element
+ *     is a tree item array with 'link' and 'below' elements. This array will be
+ *     empty if the menu item has no items in its sub-tree having a depth
+ *     greater than or equal to $depth.
+ */
+function menu_tree_data(array $links, array $parents = array(), $depth = 1) {
+  // Reverse the array so we can use the more efficient array_pop() function.
+  $links = array_reverse($links);
+  return _menu_tree_data($links, $parents, $depth);
+}
+
+/**
+ * Builds the data representing a menu tree.
+ *
+ * The function is a bit complex because the rendering of a link depends on
+ * the next menu link.
+ */
+function _menu_tree_data(&$links, $parents, $depth) {
+  $tree = array();
+  while ($item = array_pop($links)) {
+    // We need to determine if we're on the path to root so we can later build
+    // the correct active trail and breadcrumb.
+    $item['in_active_trail'] = in_array($item['mlid'], $parents);
+    // Add the current link to the tree.
+    $tree[$item['mlid']] = array(
+      'link' => $item,
+      'below' => array(),
+    );
+    // Look ahead to the next link, but leave it on the array so it's available
+    // to other recursive function calls if we return or build a sub-tree.
+    $next = end($links);
+    // Check whether the next link is the first in a new sub-tree.
+    if ($next && $next['depth'] > $depth) {
+      // Recursively call _menu_tree_data to build the sub-tree.
+      $tree[$item['mlid']]['below'] = _menu_tree_data($links, $parents, $next['depth']);
+      // Fetch next link after filling the sub-tree.
+      $next = end($links);
+    }
+    // Determine if we should exit the loop and return.
+    if (!$next || $next['depth'] < $depth) {
+      break;
+    }
+  }
+  return $tree;
+}
+
+/**
+ * Implements template_preprocess_HOOK() for theme_menu_tree().
+ */
+function template_preprocess_menu_tree(&$variables) {
+  $variables['tree'] = $variables['tree']['#children'];
+}
+
+/**
+ * Returns HTML for a wrapper for a menu sub-tree.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - tree: An HTML string containing the tree's items.
+ *
+ * @see template_preprocess_menu_tree()
+ * @ingroup themeable
+ */
+function theme_menu_tree($variables) {
+  return '<ul class="menu">' . $variables['tree'] . '</ul>';
+}
+
+/**
+ * Returns HTML for a menu link and submenu.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: Structured array data for a menu link.
+ *
+ * @ingroup themeable
+ */
+function theme_menu_link(array $variables) {
+  $element = $variables['element'];
+  $sub_menu = '';
+
+  if ($element['#below']) {
+    $sub_menu = drupal_render($element['#below']);
+  }
+  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
+  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
+}
+
+/**
+ * Returns HTML for a single local task link.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: A render element containing:
+ *     - #link: A menu link array with 'title', 'href', and 'localized_options'
+ *       keys.
+ *     - #active: A boolean indicating whether the local task is active.
+ *
+ * @ingroup themeable
+ */
+function theme_menu_local_task($variables) {
+  $link = $variables['element']['#link'];
+  $link_text = $link['title'];
+
+  if (!empty($variables['element']['#active'])) {
+    // Add text to indicate active tab for non-visual users.
+    $active = '<span class="element-invisible">' . t('(active tab)') . '</span>';
+
+    // If the link does not contain HTML already, check_plain() it now.
+    // After we set 'html'=TRUE the link will not be sanitized by l().
+    if (empty($link['localized_options']['html'])) {
+      $link['title'] = check_plain($link['title']);
+    }
+    $link['localized_options']['html'] = TRUE;
+    $link_text = t('!local-task-title!active', array('!local-task-title' => $link['title'], '!active' => $active));
+  }
+
+  return '<li' . (!empty($variables['element']['#active']) ? ' class="active"' : '') . '>' . l($link_text, $link['href'], $link['localized_options']) . "</li>\n";
+}
+
+/**
+ * Returns HTML for a single local action link.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: A render element containing:
+ *     - #link: A menu link array with 'title', 'href', and 'localized_options'
+ *       keys.
+ *
+ * @ingroup themeable
+ */
+function theme_menu_local_action($variables) {
+  $link = $variables['element']['#link'];
+
+  $output = '<li>';
+  if (isset($link['href'])) {
+    $output .= l($link['title'], $link['href'], isset($link['localized_options']) ? $link['localized_options'] : array());
+  }
+  elseif (!empty($link['localized_options']['html'])) {
+    $output .= $link['title'];
+  }
+  else {
+    $output .= check_plain($link['title']);
+  }
+  $output .= "</li>\n";
+
+  return $output;
+}
+
+/**
+ * Generates elements for the $arg array in the help hook.
+ */
+function drupal_help_arg($arg = array()) {
+  // Note - the number of empty elements should be > MENU_MAX_PARTS.
+  return $arg + array('', '', '', '', '', '', '', '', '', '', '', '');
+}
+
+/**
+ * Returns the help associated with the active menu item.
+ */
+function menu_get_active_help() {
+  $output = '';
+  $router_path = menu_tab_root_path();
+  // We will always have a path unless we are on a 403 or 404.
+  if (!$router_path) {
+    return '';
+  }
+
+  $arg = drupal_help_arg(arg(NULL));
+
+  foreach (module_implements('help') as $module) {
+    $function = $module . '_help';
+    // Lookup help for this path.
+    if ($help = $function($router_path, $arg)) {
+      $output .= $help . "\n";
+    }
+  }
+  return $output;
+}
+
+/**
+ * Gets the custom theme for the current page, if there is one.
+ *
+ * @param $initialize
+ *   This parameter should only be used internally; it is set to TRUE in order
+ *   to force the custom theme to be initialized for the current page request.
+ *
+ * @return
+ *   The machine-readable name of the custom theme, if there is one.
+ *
+ * @see menu_set_custom_theme()
+ */
+function menu_get_custom_theme($initialize = FALSE) {
+  $custom_theme = &drupal_static(__FUNCTION__);
+  // Skip this if the site is offline or being installed or updated, since the
+  // menu system may not be correctly initialized then.
+  if ($initialize && !_menu_site_is_offline(TRUE) && (!defined('MAINTENANCE_MODE') || (MAINTENANCE_MODE != 'update' && MAINTENANCE_MODE != 'install'))) {
+    // First allow modules to dynamically set a custom theme for the current
+    // page. Since we can only have one, the last module to return a valid
+    // theme takes precedence.
+    $custom_themes = array_filter(module_invoke_all('custom_theme'), 'drupal_theme_access');
+    if (!empty($custom_themes)) {
+      $custom_theme = array_pop($custom_themes);
+    }
+    // If there is a theme callback function for the current page, execute it.
+    // If this returns a valid theme, it will override any theme that was set
+    // by a hook_custom_theme() implementation above.
+    $router_item = menu_get_item();
+    if (!empty($router_item['access']) && !empty($router_item['theme_callback']) && function_exists($router_item['theme_callback'])) {
+      $theme_name = call_user_func_array($router_item['theme_callback'], $router_item['theme_arguments']);
+      if (drupal_theme_access($theme_name)) {
+        $custom_theme = $theme_name;
+      }
+    }
+  }
+  return $custom_theme;
+}
+
+/**
+ * Sets a custom theme for the current page, if there is one.
+ */
+function menu_set_custom_theme() {
+  menu_get_custom_theme(TRUE);
+}
+
+/**
+ * Build a list of named menus.
+ */
+function menu_get_names() {
+  $names = &drupal_static(__FUNCTION__);
+
+  if (empty($names)) {
+    $names = db_select('menu_links')
+      ->distinct()
+      ->fields('menu_links', array('menu_name'))
+      ->orderBy('menu_name')
+      ->execute()->fetchCol();
+  }
+  return $names;
+}
+
+/**
+ * Returns an array containing the names of system-defined (default) menus.
+ */
+function menu_list_system_menus() {
+  return array(
+    'navigation' => 'Navigation',
+    'management' => 'Management',
+    'user-menu' => 'User menu',
+    'main-menu' => 'Main menu',
+  );
+}
+
+/**
+ * Returns an array of links to be rendered as the Main menu.
+ */
+function menu_main_menu() {
+  return menu_navigation_links(variable_get('menu_main_links_source', 'main-menu'));
+}
+
+/**
+ * Returns an array of links to be rendered as the Secondary links.
+ */
+function menu_secondary_menu() {
+
+  // If the secondary menu source is set as the primary menu, we display the
+  // second level of the primary menu.
+  if (variable_get('menu_secondary_links_source', 'user-menu') == variable_get('menu_main_links_source', 'main-menu')) {
+    return menu_navigation_links(variable_get('menu_main_links_source', 'main-menu'), 1);
+  }
+  else {
+    return menu_navigation_links(variable_get('menu_secondary_links_source', 'user-menu'), 0);
+  }
+}
+
+/**
+ * Returns an array of links for a navigation menu.
+ *
+ * @param $menu_name
+ *   The name of the menu.
+ * @param $level
+ *   Optional, the depth of the menu to be returned.
+ *
+ * @return
+ *   An array of links of the specified menu and level.
+ */
+function menu_navigation_links($menu_name, $level = 0) {
+  // Don't even bother querying the menu table if no menu is specified.
+  if (empty($menu_name)) {
+    return array();
+  }
+
+  // Get the menu hierarchy for the current page.
+  $tree = menu_tree_page_data($menu_name, $level + 1);
+
+  // Go down the active trail until the right level is reached.
+  while ($level-- > 0 && $tree) {
+    // Loop through the current level's items until we find one that is in trail.
+    while ($item = array_shift($tree)) {
+      if ($item['link']['in_active_trail']) {
+        // If the item is in the active trail, we continue in the subtree.
+        $tree = empty($item['below']) ? array() : $item['below'];
+        break;
+      }
+    }
+  }
+
+  // Create a single level of links.
+  $router_item = menu_get_item();
+  $links = array();
+  foreach ($tree as $item) {
+    if (!$item['link']['hidden']) {
+      $class = '';
+      $l = $item['link']['localized_options'];
+      $l['href'] = $item['link']['href'];
+      $l['title'] = $item['link']['title'];
+      if ($item['link']['in_active_trail']) {
+        $class = ' active-trail';
+        $l['attributes']['class'][] = 'active-trail';
+      }
+      // Normally, l() compares the href of every link with $_GET['q'] and sets
+      // the active class accordingly. But local tasks do not appear in menu
+      // trees, so if the current path is a local task, and this link is its
+      // tab root, then we have to set the class manually.
+      if ($item['link']['href'] == $router_item['tab_root_href'] && $item['link']['href'] != $_GET['q']) {
+        $l['attributes']['class'][] = 'active';
+      }
+      // Keyed with the unique mlid to generate classes in theme_links().
+      $links['menu-' . $item['link']['mlid'] . $class] = $l;
+    }
+  }
+  return $links;
+}
+
+/**
+ * Collects the local tasks (tabs), action links, and the root path.
+ *
+ * @param $level
+ *   The level of tasks you ask for. Primary tasks are 0, secondary are 1.
+ *
+ * @return
+ *   An array containing
+ *   - tabs: Local tasks for the requested level:
+ *     - count: The number of local tasks.
+ *     - output: The themed output of local tasks.
+ *   - actions: Action links for the requested level:
+ *     - count: The number of action links.
+ *     - output: The themed output of action links.
+ *   - root_path: The router path for the current page. If the current page is
+ *     a default local task, then this corresponds to the parent tab.
+ */
+function menu_local_tasks($level = 0) {
+  $data = &drupal_static(__FUNCTION__);
+  $root_path = &drupal_static(__FUNCTION__ . ':root_path', '');
+  $empty = array(
+    'tabs' => array('count' => 0, 'output' => array()),
+    'actions' => array('count' => 0, 'output' => array()),
+    'root_path' => &$root_path,
+  );
+
+  if (!isset($data)) {
+    $data = array();
+    // Set defaults in case there are no actions or tabs.
+    $actions = $empty['actions'];
+    $tabs = array();
+
+    $router_item = menu_get_item();
+
+    // If this router item points to its parent, start from the parents to
+    // compute tabs and actions.
+    if ($router_item && ($router_item['type'] & MENU_LINKS_TO_PARENT)) {
+      $router_item = menu_get_item($router_item['tab_parent_href']);
+    }
+
+    // If we failed to fetch a router item or the current user doesn't have
+    // access to it, don't bother computing the tabs.
+    if (!$router_item || !$router_item['access']) {
+      return $empty;
+    }
+
+    // Get all tabs (also known as local tasks) and the root page.
+    $cid = 'local_tasks:' . $router_item['tab_root'];
+    if ($cache = cache_get($cid, 'cache_menu')) {
+      $result = $cache->data;
+    }
+    else {
+      $result = db_select('menu_router', NULL, array('fetch' => PDO::FETCH_ASSOC))
+        ->fields('menu_router')
+        ->condition('tab_root', $router_item['tab_root'])
+        ->condition('context', MENU_CONTEXT_INLINE, '<>')
+        ->orderBy('weight')
+        ->orderBy('title')
+        ->execute()
+        ->fetchAll();
+      cache_set($cid, $result, 'cache_menu');
+    }
+    $map = $router_item['original_map'];
+    $children = array();
+    $tasks = array();
+    $root_path = $router_item['path'];
+
+    foreach ($result as $item) {
+      _menu_translate($item, $map, TRUE);
+      if ($item['tab_parent']) {
+        // All tabs, but not the root page.
+        $children[$item['tab_parent']][$item['path']] = $item;
+      }
+      // Store the translated item for later use.
+      $tasks[$item['path']] = $item;
+    }
+
+    // Find all tabs below the current path.
+    $path = $router_item['path'];
+    // Tab parenting may skip levels, so the number of parts in the path may not
+    // equal the depth. Thus we use the $depth counter (offset by 1000 for ksort).
+    $depth = 1001;
+    $actions['count'] = 0;
+    $actions['output'] = array();
+    while (isset($children[$path])) {
+      $tabs_current = array();
+      $actions_current = array();
+      $next_path = '';
+      $tab_count = 0;
+      $action_count = 0;
+      foreach ($children[$path] as $item) {
+        // Local tasks can be normal items too, so bitmask with
+        // MENU_IS_LOCAL_TASK before checking.
+        if (!($item['type'] & MENU_IS_LOCAL_TASK)) {
+          // This item is not a tab, skip it.
+          continue;
+        }
+        if ($item['access']) {
+          $link = $item;
+          // The default task is always active. As tabs can be normal items
+          // too, so bitmask with MENU_LINKS_TO_PARENT before checking.
+          if (($item['type'] & MENU_LINKS_TO_PARENT) == MENU_LINKS_TO_PARENT) {
+            // Find the first parent which is not a default local task or action.
+            for ($p = $item['tab_parent']; ($tasks[$p]['type'] & MENU_LINKS_TO_PARENT) == MENU_LINKS_TO_PARENT; $p = $tasks[$p]['tab_parent']);
+            // Use the path of the parent instead.
+            $link['href'] = $tasks[$p]['href'];
+            // Mark the link as active, if the current path happens to be the
+            // path of the default local task itself (i.e., instead of its
+            // tab_parent_href or tab_root_href). Normally, links for default
+            // local tasks link to their parent, but the path of default local
+            // tasks can still be accessed directly, in which case this link
+            // would not be marked as active, since l() only compares the href
+            // with $_GET['q'].
+            if ($link['href'] != $_GET['q']) {
+              $link['localized_options']['attributes']['class'][] = 'active';
+            }
+            $tabs_current[] = array(
+              '#theme' => 'menu_local_task',
+              '#link' => $link,
+              '#active' => TRUE,
+            );
+            $next_path = $item['path'];
+            $tab_count++;
+          }
+          else {
+            // Actions can be normal items too, so bitmask with
+            // MENU_IS_LOCAL_ACTION before checking.
+            if (($item['type'] & MENU_IS_LOCAL_ACTION) == MENU_IS_LOCAL_ACTION) {
+              // The item is an action, display it as such.
+              $actions_current[] = array(
+                '#theme' => 'menu_local_action',
+                '#link' => $link,
+              );
+              $action_count++;
+            }
+            else {
+              // Otherwise, it's a normal tab.
+              $tabs_current[] = array(
+                '#theme' => 'menu_local_task',
+                '#link' => $link,
+              );
+              $tab_count++;
+            }
+          }
+        }
+      }
+      $path = $next_path;
+      $tabs[$depth]['count'] = $tab_count;
+      $tabs[$depth]['output'] = $tabs_current;
+      $actions['count'] += $action_count;
+      $actions['output'] = array_merge($actions['output'], $actions_current);
+      $depth++;
+    }
+    $data['actions'] = $actions;
+    // Find all tabs at the same level or above the current one.
+    $parent = $router_item['tab_parent'];
+    $path = $router_item['path'];
+    $current = $router_item;
+    $depth = 1000;
+    while (isset($children[$parent])) {
+      $tabs_current = array();
+      $next_path = '';
+      $next_parent = '';
+      $count = 0;
+      foreach ($children[$parent] as $item) {
+        // Skip local actions.
+        if ($item['type'] & MENU_IS_LOCAL_ACTION) {
+          continue;
+        }
+        if ($item['access']) {
+          $count++;
+          $link = $item;
+          // Local tasks can be normal items too, so bitmask with
+          // MENU_LINKS_TO_PARENT before checking.
+          if (($item['type'] & MENU_LINKS_TO_PARENT) == MENU_LINKS_TO_PARENT) {
+            // Find the first parent which is not a default local task.
+            for ($p = $item['tab_parent']; ($tasks[$p]['type'] & MENU_LINKS_TO_PARENT) == MENU_LINKS_TO_PARENT; $p = $tasks[$p]['tab_parent']);
+            // Use the path of the parent instead.
+            $link['href'] = $tasks[$p]['href'];
+            if ($item['path'] == $router_item['path']) {
+              $root_path = $tasks[$p]['path'];
+            }
+          }
+          // We check for the active tab.
+          if ($item['path'] == $path) {
+            // Mark the link as active, if the current path is a (second-level)
+            // local task of a default local task. Since this default local task
+            // links to its parent, l() will not mark it as active, as it only
+            // compares the link's href to $_GET['q'].
+            if ($link['href'] != $_GET['q']) {
+              $link['localized_options']['attributes']['class'][] = 'active';
+            }
+            $tabs_current[] = array(
+              '#theme' => 'menu_local_task',
+              '#link' => $link,
+              '#active' => TRUE,
+            );
+            $next_path = $item['tab_parent'];
+            if (isset($tasks[$next_path])) {
+              $next_parent = $tasks[$next_path]['tab_parent'];
+            }
+          }
+          else {
+            $tabs_current[] = array(
+              '#theme' => 'menu_local_task',
+              '#link' => $link,
+            );
+          }
+        }
+      }
+      $path = $next_path;
+      $parent = $next_parent;
+      $tabs[$depth]['count'] = $count;
+      $tabs[$depth]['output'] = $tabs_current;
+      $depth--;
+    }
+    // Sort by depth.
+    ksort($tabs);
+    // Remove the depth, we are interested only in their relative placement.
+    $tabs = array_values($tabs);
+    $data['tabs'] = $tabs;
+
+    // Allow modules to alter local tasks or dynamically append further tasks.
+    drupal_alter('menu_local_tasks', $data, $router_item, $root_path);
+  }
+
+  if (isset($data['tabs'][$level])) {
+    return array(
+      'tabs' => $data['tabs'][$level],
+      'actions' => $data['actions'],
+      'root_path' => $root_path,
+    );
+  }
+  // @todo If there are no tabs, then there still can be actions; for example,
+  //   when added via hook_menu_local_tasks_alter().
+  elseif (!empty($data['actions']['output'])) {
+    return array('actions' => $data['actions']) + $empty;
+  }
+  return $empty;
+}
+
+/**
+ * Retrieves contextual links for a path based on registered local tasks.
+ *
+ * This leverages the menu system to retrieve the first layer of registered
+ * local tasks for a given system path. All local tasks of the tab type
+ * MENU_CONTEXT_INLINE are taken into account.
+ *
+ * For example, when considering the following registered local tasks:
+ * - node/%node/view (default local task) with no 'context' defined
+ * - node/%node/edit with context: MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE
+ * - node/%node/revisions with context: MENU_CONTEXT_PAGE
+ * - node/%node/report-as-spam with context: MENU_CONTEXT_INLINE
+ *
+ * If the path "node/123" is passed to this function, then it will return the
+ * links for 'edit' and 'report-as-spam'.
+ *
+ * @param $module
+ *   The name of the implementing module. This is used to prefix the key for
+ *   each contextual link, which is transformed into a CSS class during
+ *   rendering by theme_links(). For example, if $module is 'block' and the
+ *   retrieved local task path argument is 'edit', then the resulting CSS class
+ *   will be 'block-edit'.
+ * @param $parent_path
+ *   The static menu router path of the object to retrieve local tasks for, for
+ *   example 'node' or 'admin/structure/block/manage'.
+ * @param $args
+ *   A list of dynamic path arguments to append to $parent_path to form the
+ *   fully-qualified menu router path; for example, array(123) for a certain
+ *   node or array('system', 'navigation') for a certain block.
+ *
+ * @return
+ *   A list of menu router items that are local tasks for the passed-in path.
+ *
+ * @see contextual_links_preprocess()
+ * @see hook_menu()
+ */
+function menu_contextual_links($module, $parent_path, $args) {
+  static $path_empty = array();
+
+  $links = array();
+  // Performance: In case a previous invocation for the same parent path did not
+  // return any links, we immediately return here.
+  if (isset($path_empty[$parent_path]) && strpos($parent_path, '%') !== FALSE) {
+    return $links;
+  }
+  // Construct the item-specific parent path.
+  $path = $parent_path . '/' . implode('/', $args);
+
+  // Get the router item for the given parent link path.
+  $router_item = menu_get_item($path);
+  if (!$router_item || !$router_item['access']) {
+    $path_empty[$parent_path] = TRUE;
+    return $links;
+  }
+  $data = &drupal_static(__FUNCTION__, array());
+  $root_path = $router_item['path'];
+
+  // Performance: For a single, normalized path (such as 'node/%') we only query
+  // available tasks once per request.
+  if (!isset($data[$root_path])) {
+    // Get all contextual links that are direct children of the router item and
+    // not of the tab type 'view'.
+    $data[$root_path] = db_select('menu_router', 'm')
+      ->fields('m')
+      ->condition('tab_parent', $router_item['tab_root'])
+      ->condition('context', MENU_CONTEXT_NONE, '<>')
+      ->condition('context', MENU_CONTEXT_PAGE, '<>')
+      ->orderBy('weight')
+      ->orderBy('title')
+      ->execute()
+      ->fetchAllAssoc('path', PDO::FETCH_ASSOC);
+  }
+  $parent_length = drupal_strlen($root_path) + 1;
+  $map = $router_item['original_map'];
+  foreach ($data[$root_path] as $item) {
+    // Extract the actual "task" string from the path argument.
+    $key = drupal_substr($item['path'], $parent_length);
+
+    // Denormalize and translate the contextual link.
+    _menu_translate($item, $map, TRUE);
+    if (!$item['access']) {
+      continue;
+    }
+    // All contextual links are keyed by the actual "task" path argument,
+    // prefixed with the name of the implementing module.
+    $links[$module . '-' . $key] = $item;
+  }
+
+  // Allow modules to alter contextual links.
+  drupal_alter('menu_contextual_links', $links, $router_item, $root_path);
+
+  // Performance: If the current user does not have access to any links for this
+  // router path and no other module added further links, we assign FALSE here
+  // to skip the entire process the next time the same router path is requested.
+  if (empty($links)) {
+    $path_empty[$parent_path] = TRUE;
+  }
+
+  return $links;
+}
+
+/**
+ * Returns the rendered local tasks at the top level.
+ */
+function menu_primary_local_tasks() {
+  $links = menu_local_tasks(0);
+  // Do not display single tabs.
+  return ($links['tabs']['count'] > 1 ? $links['tabs']['output'] : '');
+}
+
+/**
+ * Returns the rendered local tasks at the second level.
+ */
+function menu_secondary_local_tasks() {
+  $links = menu_local_tasks(1);
+  // Do not display single tabs.
+  return ($links['tabs']['count'] > 1 ? $links['tabs']['output'] : '');
+}
+
+/**
+ * Returns the rendered local actions at the current level.
+ */
+function menu_local_actions() {
+  $links = menu_local_tasks();
+  return $links['actions']['output'];
+}
+
+/**
+ * Returns the router path, or the path for a default local task's parent.
+ */
+function menu_tab_root_path() {
+  $links = menu_local_tasks();
+  return $links['root_path'];
+}
+
+/**
+ * Returns a renderable element for the primary and secondary tabs.
+ */
+function menu_local_tabs() {
+  return array(
+    '#theme' => 'menu_local_tasks',
+    '#primary' => menu_primary_local_tasks(),
+    '#secondary' => menu_secondary_local_tasks(),
+  );
+}
+
+/**
+ * Returns HTML for primary and secondary local tasks.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *     - primary: (optional) An array of local tasks (tabs).
+ *     - secondary: (optional) An array of local tasks (tabs).
+ *
+ * @ingroup themeable
+ * @see menu_local_tasks()
+ */
+function theme_menu_local_tasks(&$variables) {
+  $output = '';
+
+  if (!empty($variables['primary'])) {
+    $variables['primary']['#prefix'] = '<h2 class="element-invisible">' . t('Primary tabs') . '</h2>';
+    $variables['primary']['#prefix'] .= '<ul class="tabs primary">';
+    $variables['primary']['#suffix'] = '</ul>';
+    $output .= drupal_render($variables['primary']);
+  }
+  if (!empty($variables['secondary'])) {
+    $variables['secondary']['#prefix'] = '<h2 class="element-invisible">' . t('Secondary tabs') . '</h2>';
+    $variables['secondary']['#prefix'] .= '<ul class="tabs secondary">';
+    $variables['secondary']['#suffix'] = '</ul>';
+    $output .= drupal_render($variables['secondary']);
+  }
+
+  return $output;
+}
+
+/**
+ * Sets (or gets) the active menu for the current page.
+ *
+ * The active menu for the page determines the active trail.
+ *
+ * @return
+ *   An array of menu machine names, in order of preference. The
+ *   'menu_default_active_menus' variable may be used to assert a menu order
+ *   different from the order of creation, or to prevent a particular menu from
+ *   being used at all in the active trail.
+ *   E.g., $conf['menu_default_active_menus'] = array('navigation', 'main-menu')
+ */
+function menu_set_active_menu_names($menu_names = NULL) {
+  $active = &drupal_static(__FUNCTION__);
+
+  if (isset($menu_names) && is_array($menu_names)) {
+    $active = $menu_names;
+  }
+  elseif (!isset($active)) {
+    $active = variable_get('menu_default_active_menus', array_keys(menu_list_system_menus()));
+  }
+  return $active;
+}
+
+/**
+ * Gets the active menu for the current page.
+ */
+function menu_get_active_menu_names() {
+  return menu_set_active_menu_names();
+}
+
+/**
+ * Sets the active path, which determines which page is loaded.
+ *
+ * Note that this may not have the desired effect unless invoked very early
+ * in the page load, such as during hook_boot(), or unless you call
+ * menu_execute_active_handler() to generate your page output.
+ *
+ * @param $path
+ *   A Drupal path - not a path alias.
+ */
+function menu_set_active_item($path) {
+  $_GET['q'] = $path;
+  // Since the active item has changed, the active menu trail may also be out
+  // of date.
+  drupal_static_reset('menu_set_active_trail');
+}
+
+/**
+ * Sets the active trail (path to the menu tree root) of the current page.
+ *
+ * Any trail set by this function will only be used for functionality that calls
+ * menu_get_active_trail(). Drupal core only uses trails set here for
+ * breadcrumbs and the page title and not for menu trees or page content.
+ * Additionally, breadcrumbs set by drupal_set_breadcrumb() will override any
+ * trail set here.
+ *
+ * To affect the trail used by menu trees, use menu_tree_set_path(). To affect
+ * the page content, use menu_set_active_item() instead.
+ *
+ * @param $new_trail
+ *   Menu trail to set; the value is saved in a static variable and can be
+ *   retrieved by menu_get_active_trail(). The format of this array should be
+ *   the same as the return value of menu_get_active_trail().
+ *
+ * @return
+ *   The active trail. See menu_get_active_trail() for details.
+ */
+function menu_set_active_trail($new_trail = NULL) {
+  $trail = &drupal_static(__FUNCTION__);
+
+  if (isset($new_trail)) {
+    $trail = $new_trail;
+  }
+  elseif (!isset($trail)) {
+    $trail = array();
+    $trail[] = array(
+      'title' => t('Home'),
+      'href' => '<front>',
+      'link_path' => '',
+      'localized_options' => array(),
+      'type' => 0,
+    );
+
+    // Try to retrieve a menu link corresponding to the current path. If more
+    // than one exists, the link from the most preferred menu is returned.
+    $preferred_link = menu_link_get_preferred();
+    $current_item = menu_get_item();
+
+    // There is a link for the current path.
+    if ($preferred_link) {
+      // Pass TRUE for $only_active_trail to make menu_tree_page_data() build
+      // a stripped down menu tree containing the active trail only, in case
+      // the given menu has not been built in this request yet.
+      $tree = menu_tree_page_data($preferred_link['menu_name'], NULL, TRUE);
+      list($key, $curr) = each($tree);
+    }
+    // There is no link for the current path.
+    else {
+      $preferred_link = $current_item;
+      $curr = FALSE;
+    }
+
+    while ($curr) {
+      $link = $curr['link'];
+      if ($link['in_active_trail']) {
+        // Add the link to the trail, unless it links to its parent.
+        if (!($link['type'] & MENU_LINKS_TO_PARENT)) {
+          // The menu tree for the active trail may contain additional links
+          // that have not been translated yet, since they contain dynamic
+          // argument placeholders (%). Such links are not contained in regular
+          // menu trees, and have only been loaded for the additional
+          // translation that happens here, so as to be able to display them in
+          // the breadcumb for the current page.
+          // @see _menu_tree_check_access()
+          // @see _menu_link_translate()
+          if (strpos($link['href'], '%') !== FALSE) {
+            _menu_link_translate($link, TRUE);
+          }
+          if ($link['access']) {
+            $trail[] = $link;
+          }
+        }
+        $tree = $curr['below'] ? $curr['below'] : array();
+      }
+      list($key, $curr) = each($tree);
+    }
+    // Make sure the current page is in the trail to build the page title, by
+    // appending either the preferred link or the menu router item for the
+    // current page. Exclude it if we are on the front page.
+    $last = end($trail);
+    if ($preferred_link && $last['href'] != $preferred_link['href'] && !drupal_is_front_page()) {
+      $trail[] = $preferred_link;
+    }
+  }
+  return $trail;
+}
+
+/**
+ * Looks up the preferred menu link for a given system path.
+ *
+ * @param $path
+ *   The path; for example, 'node/5'. The function will find the corresponding
+ *   menu link ('node/5' if it exists, or fallback to 'node/%').
+ * @param $selected_menu
+ *   The name of a menu used to restrict the search for a preferred menu link.
+ *   If not specified, all the menus returned by menu_get_active_menu_names()
+ *   will be used.
+ *
+ * @return
+ *   A fully translated menu link, or FALSE if no matching menu link was
+ *   found. The most specific menu link ('node/5' preferred over 'node/%') in
+ *   the most preferred menu (as defined by menu_get_active_menu_names()) is
+ *   returned.
+ */
+function menu_link_get_preferred($path = NULL, $selected_menu = NULL) {
+  $preferred_links = &drupal_static(__FUNCTION__);
+
+  if (!isset($path)) {
+    $path = $_GET['q'];
+  }
+
+  if (empty($selected_menu)) {
+    // Use an illegal menu name as the key for the preferred menu link.
+    $selected_menu = MENU_PREFERRED_LINK;
+  }
+
+  if (!isset($preferred_links[$path])) {
+    // Look for the correct menu link by building a list of candidate paths,
+    // which are ordered by priority (translated hrefs are preferred over
+    // untranslated paths). Afterwards, the most relevant path is picked from
+    // the menus, ordered by menu preference.
+    $item = menu_get_item($path);
+    $path_candidates = array();
+    // 1. The current item href.
+    $path_candidates[$item['href']] = $item['href'];
+    // 2. The tab root href of the current item (if any).
+    if ($item['tab_parent'] && ($tab_root = menu_get_item($item['tab_root_href']))) {
+      $path_candidates[$tab_root['href']] = $tab_root['href'];
+    }
+    // 3. The current item path (with wildcards).
+    $path_candidates[$item['path']] = $item['path'];
+    // 4. The tab root path of the current item (if any).
+    if (!empty($tab_root)) {
+      $path_candidates[$tab_root['path']] = $tab_root['path'];
+    }
+
+    // Retrieve a list of menu names, ordered by preference.
+    $menu_names = menu_get_active_menu_names();
+    // Put the selected menu at the front of the list.
+    array_unshift($menu_names, $selected_menu);
+
+    $query = db_select('menu_links', 'ml', array('fetch' => PDO::FETCH_ASSOC));
+    $query->leftJoin('menu_router', 'm', 'm.path = ml.router_path');
+    $query->fields('ml');
+    // Weight must be taken from {menu_links}, not {menu_router}.
+    $query->addField('ml', 'weight', 'link_weight');
+    $query->fields('m');
+    $query->condition('ml.link_path', $path_candidates, 'IN');
+
+    // Sort candidates by link path and menu name.
+    $candidates = array();
+    foreach ($query->execute() as $candidate) {
+      $candidate['weight'] = $candidate['link_weight'];
+      $candidates[$candidate['link_path']][$candidate['menu_name']] = $candidate;
+      // Add any menus not already in the menu name search list.
+      if (!in_array($candidate['menu_name'], $menu_names)) {
+        $menu_names[] = $candidate['menu_name'];
+      }
+    }
+
+    // Store the most specific link for each menu. Also save the most specific
+    // link of the most preferred menu in $preferred_link.
+    foreach ($path_candidates as $link_path) {
+      if (isset($candidates[$link_path])) {
+        foreach ($menu_names as $menu_name) {
+          if (empty($preferred_links[$path][$menu_name]) && isset($candidates[$link_path][$menu_name])) {
+            $candidate_item = $candidates[$link_path][$menu_name];
+            $map = explode('/', $path);
+            _menu_translate($candidate_item, $map);
+            if ($candidate_item['access']) {
+              $preferred_links[$path][$menu_name] = $candidate_item;
+              if (empty($preferred_links[$path][MENU_PREFERRED_LINK])) {
+                // Store the most specific link.
+                $preferred_links[$path][MENU_PREFERRED_LINK] = $candidate_item;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  return isset($preferred_links[$path][$selected_menu]) ? $preferred_links[$path][$selected_menu] : FALSE;
+}
+
+/**
+ * Gets the active trail (path to root menu root) of the current page.
+ *
+ * If a trail is supplied to menu_set_active_trail(), that value is returned. If
+ * a trail is not supplied to menu_set_active_trail(), the path to the current
+ * page is calculated and returned. The calculated trail is also saved as a
+ * static value for use by subsequent calls to menu_get_active_trail().
+ *
+ * @return
+ *   Path to menu root of the current page, as an array of menu link items,
+ *   starting with the site's home page. Each link item is an associative array
+ *   with the following components:
+ *   - title: Title of the item.
+ *   - href: Drupal path of the item.
+ *   - localized_options: Options for passing into the l() function.
+ *   - type: A menu type constant, such as MENU_DEFAULT_LOCAL_TASK, or 0 to
+ *     indicate it's not really in the menu (used for the home page item).
+ */
+function menu_get_active_trail() {
+  return menu_set_active_trail();
+}
+
+/**
+ * Gets the breadcrumb for the current page, as determined by the active trail.
+ *
+ * @see menu_set_active_trail()
+ */
+function menu_get_active_breadcrumb() {
+  $breadcrumb = array();
+
+  // No breadcrumb for the front page.
+  if (drupal_is_front_page()) {
+    return $breadcrumb;
+  }
+
+  $item = menu_get_item();
+  if (!empty($item['access'])) {
+    $active_trail = menu_get_active_trail();
+
+    // Allow modules to alter the breadcrumb, if possible, as that is much
+    // faster than rebuilding an entirely new active trail.
+    drupal_alter('menu_breadcrumb', $active_trail, $item);
+
+    // Don't show a link to the current page in the breadcrumb trail.
+    $end = end($active_trail);
+    if ($item['href'] == $end['href']) {
+      array_pop($active_trail);
+    }
+
+    // Remove the tab root (parent) if the current path links to its parent.
+    // Normally, the tab root link is included in the breadcrumb, as soon as we
+    // are on a local task or any other child link. However, if we are on a
+    // default local task (e.g., node/%/view), then we do not want the tab root
+    // link (e.g., node/%) to appear, as it would be identical to the current
+    // page. Since this behavior also needs to work recursively (i.e., on
+    // default local tasks of default local tasks), and since the last non-task
+    // link in the trail is used as page title (see menu_get_active_title()),
+    // this condition cannot be cleanly integrated into menu_get_active_trail().
+    // menu_get_active_trail() already skips all links that link to their parent
+    // (commonly MENU_DEFAULT_LOCAL_TASK). In order to also hide the parent link
+    // itself, we always remove the last link in the trail, if the current
+    // router item links to its parent.
+    if (($item['type'] & MENU_LINKS_TO_PARENT) == MENU_LINKS_TO_PARENT) {
+      array_pop($active_trail);
+    }
+
+    foreach ($active_trail as $parent) {
+      $breadcrumb[] = l($parent['title'], $parent['href'], $parent['localized_options']);
+    }
+  }
+  return $breadcrumb;
+}
+
+/**
+ * Gets the title of the current page, as determined by the active trail.
+ */
+function menu_get_active_title() {
+  $active_trail = menu_get_active_trail();
+
+  foreach (array_reverse($active_trail) as $item) {
+    if (!(bool) ($item['type'] & MENU_IS_LOCAL_TASK)) {
+      return $item['title'];
+    }
+  }
+}
+
+/**
+ * Gets a translated, access-checked menu link that is ready for rendering.
+ *
+ * This function should never be called from within node_load() or any other
+ * function used as a menu object load function since an infinite recursion may
+ * occur.
+ *
+ * @param $mlid
+ *   The mlid of the menu item.
+ *
+ * @return
+ *   A menu link, with $item['access'] filled and link translated for
+ *   rendering.
+ */
+function menu_link_load($mlid) {
+  if (is_numeric($mlid)) {
+    $query = db_select('menu_links', 'ml');
+    $query->leftJoin('menu_router', 'm', 'm.path = ml.router_path');
+    $query->fields('ml');
+    // Weight should be taken from {menu_links}, not {menu_router}.
+    $query->addField('ml', 'weight', 'link_weight');
+    $query->fields('m');
+    $query->condition('ml.mlid', $mlid);
+    if ($item = $query->execute()->fetchAssoc()) {
+      $item['weight'] = $item['link_weight'];
+      _menu_link_translate($item);
+      return $item;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Clears the cached cached data for a single named menu.
+ */
+function menu_cache_clear($menu_name = 'navigation') {
+  $cache_cleared = &drupal_static(__FUNCTION__, array());
+
+  if (empty($cache_cleared[$menu_name])) {
+    cache_clear_all('links:' . $menu_name . ':', 'cache_menu', TRUE);
+    $cache_cleared[$menu_name] = 1;
+  }
+  elseif ($cache_cleared[$menu_name] == 1) {
+    drupal_register_shutdown_function('cache_clear_all', 'links:' . $menu_name . ':', 'cache_menu', TRUE);
+    $cache_cleared[$menu_name] = 2;
+  }
+
+  // Also clear the menu system static caches.
+  menu_reset_static_cache();
+}
+
+/**
+ * Clears all cached menu data.
+ *
+ * This should be called any time broad changes
+ * might have been made to the router items or menu links.
+ */
+function menu_cache_clear_all() {
+  cache_clear_all('*', 'cache_menu', TRUE);
+  menu_reset_static_cache();
+}
+
+/**
+ * Resets the menu system static cache.
+ */
+function menu_reset_static_cache() {
+  drupal_static_reset('_menu_build_tree');
+  drupal_static_reset('menu_tree');
+  drupal_static_reset('menu_tree_all_data');
+  drupal_static_reset('menu_tree_page_data');
+  drupal_static_reset('menu_load_all');
+  drupal_static_reset('menu_link_get_preferred');
+}
+
+/**
+ * Populates the database tables used by various menu functions.
+ *
+ * This function will clear and populate the {menu_router} table, add entries
+ * to {menu_links} for new router items, and then remove stale items from
+ * {menu_links}. If called from update.php or install.php, it will also
+ * schedule a call to itself on the first real page load from
+ * menu_execute_active_handler(), because the maintenance page environment
+ * is different and leaves stale data in the menu tables.
+ *
+ * @return
+ *   TRUE if the menu was rebuilt, FALSE if another thread was rebuilding
+ *   in parallel and the current thread just waited for completion.
+ */
+function menu_rebuild() {
+  if (!lock_acquire('menu_rebuild')) {
+    // Wait for another request that is already doing this work.
+    // We choose to block here since otherwise the router item may not
+    // be available in menu_execute_active_handler() resulting in a 404.
+    lock_wait('menu_rebuild');
+    return FALSE;
+  }
+
+  $transaction = db_transaction();
+
+  try {
+    list($menu, $masks) = menu_router_build();
+    _menu_router_save($menu, $masks);
+    _menu_navigation_links_rebuild($menu);
+    // Clear the menu, page and block caches.
+    menu_cache_clear_all();
+    _menu_clear_page_cache();
+
+    if (defined('MAINTENANCE_MODE')) {
+      variable_set('menu_rebuild_needed', TRUE);
+    }
+    else {
+      variable_del('menu_rebuild_needed');
+    }
+  }
+  catch (Exception $e) {
+    $transaction->rollback();
+    watchdog_exception('menu', $e);
+  }
+
+  lock_release('menu_rebuild');
+  return TRUE;
+}
+
+/**
+ * Collects and alters the menu definitions.
+ */
+function menu_router_build() {
+  // We need to manually call each module so that we can know which module
+  // a given item came from.
+  $callbacks = array();
+  foreach (module_implements('menu') as $module) {
+    $router_items = call_user_func($module . '_menu');
+    if (isset($router_items) && is_array($router_items)) {
+      foreach (array_keys($router_items) as $path) {
+        $router_items[$path]['module'] = $module;
+      }
+      $callbacks = array_merge($callbacks, $router_items);
+    }
+  }
+  // Alter the menu as defined in modules, keys are like user/%user.
+  drupal_alter('menu', $callbacks);
+  list($menu, $masks) = _menu_router_build($callbacks);
+  _menu_router_cache($menu);
+
+  return array($menu, $masks);
+}
+
+/**
+ * Stores the menu router if we have it in memory.
+ */
+function _menu_router_cache($new_menu = NULL) {
+  $menu = &drupal_static(__FUNCTION__);
+
+  if (isset($new_menu)) {
+    $menu = $new_menu;
+  }
+  return $menu;
+}
+
+/**
+ * Gets the menu router.
+ */
+function menu_get_router() {
+  // Check first if we have it in memory already.
+  $menu = _menu_router_cache();
+  if (empty($menu)) {
+    list($menu, $masks) = menu_router_build();
+  }
+  return $menu;
+}
+
+/**
+ * Builds a link from a router item.
+ */
+function _menu_link_build($item) {
+  // Suggested items are disabled by default.
+  if ($item['type'] == MENU_SUGGESTED_ITEM) {
+    $item['hidden'] = 1;
+  }
+  // Hide all items that are not visible in the tree.
+  elseif (!($item['type'] & MENU_VISIBLE_IN_TREE)) {
+    $item['hidden'] = -1;
+  }
+  // Note, we set this as 'system', so that we can be sure to distinguish all
+  // the menu links generated automatically from entries in {menu_router}.
+  $item['module'] = 'system';
+  $item += array(
+    'menu_name' => 'navigation',
+    'link_title' => $item['title'],
+    'link_path' => $item['path'],
+    'hidden' => 0,
+    'options' => empty($item['description']) ? array() : array('attributes' => array('title' => $item['description'])),
+  );
+  return $item;
+}
+
+/**
+ * Builds menu links for the items in the menu router.
+ */
+function _menu_navigation_links_rebuild($menu) {
+  // Add normal and suggested items as links.
+  $menu_links = array();
+  foreach ($menu as $path => $item) {
+    if ($item['_visible']) {
+      $menu_links[$path] = $item;
+      $sort[$path] = $item['_number_parts'];
+    }
+  }
+  if ($menu_links) {
+    // Keep an array of processed menu links, to allow menu_link_save() to
+    // check this for parents instead of querying the database.
+    $parent_candidates = array();
+    // Make sure no child comes before its parent.
+    array_multisort($sort, SORT_NUMERIC, $menu_links);
+
+    foreach ($menu_links as $key => $item) {
+      $existing_item = db_select('menu_links')
+        ->fields('menu_links')
+        ->condition('link_path', $item['path'])
+        ->condition('module', 'system')
+        ->execute()->fetchAssoc();
+      if ($existing_item) {
+        $item['mlid'] = $existing_item['mlid'];
+        // A change in hook_menu may move the link to a different menu
+        if (empty($item['menu_name']) || ($item['menu_name'] == $existing_item['menu_name'])) {
+          $item['menu_name'] = $existing_item['menu_name'];
+          $item['plid'] = $existing_item['plid'];
+        }
+        else {
+          // It moved to a new menu. Let menu_link_save() try to find a new
+          // parent based on the path.
+          unset($item['plid']);
+        }
+        $item['has_children'] = $existing_item['has_children'];
+        $item['updated'] = $existing_item['updated'];
+      }
+      if ($existing_item && $existing_item['customized']) {
+        $parent_candidates[$existing_item['mlid']] = $existing_item;
+      }
+      else {
+        $item = _menu_link_build($item);
+        menu_link_save($item, $existing_item, $parent_candidates);
+        $parent_candidates[$item['mlid']] = $item;
+        unset($menu_links[$key]);
+      }
+    }
+  }
+  $paths = array_keys($menu);
+  // Updated and customized items whose router paths are gone need new ones.
+  $result = db_select('menu_links', NULL, array('fetch' => PDO::FETCH_ASSOC))
+    ->fields('menu_links', array(
+      'link_path',
+      'mlid',
+      'router_path',
+      'updated',
+    ))
+    ->condition(db_or()
+      ->condition('updated', 1)
+      ->condition(db_and()
+        ->condition('router_path', $paths, 'NOT IN')
+        ->condition('external', 0)
+        ->condition('customized', 1)
+      )
+    )
+    ->execute();
+  foreach ($result as $item) {
+    $router_path = _menu_find_router_path($item['link_path']);
+    if (!empty($router_path) && ($router_path != $item['router_path'] || $item['updated'])) {
+      // If the router path and the link path matches, it's surely a working
+      // item, so we clear the updated flag.
+      $updated = $item['updated'] && $router_path != $item['link_path'];
+      db_update('menu_links')
+        ->fields(array(
+          'router_path' => $router_path,
+          'updated' => (int) $updated,
+        ))
+        ->condition('mlid', $item['mlid'])
+        ->execute();
+    }
+  }
+  // Find any item whose router path does not exist any more.
+  $result = db_select('menu_links')
+    ->fields('menu_links')
+    ->condition('router_path', $paths, 'NOT IN')
+    ->condition('external', 0)
+    ->condition('updated', 0)
+    ->condition('customized', 0)
+    ->orderBy('depth', 'DESC')
+    ->execute();
+  // Remove all such items. Starting from those with the greatest depth will
+  // minimize the amount of re-parenting done by menu_link_delete().
+  foreach ($result as $item) {
+    _menu_delete_item($item, TRUE);
+  }
+}
+
+/**
+ * Clones an array of menu links.
+ *
+ * @param $links
+ *   An array of menu links to clone.
+ * @param $menu_name
+ *   (optional) The name of a menu that the links will be cloned for. If not
+ *   set, the cloned links will be in the same menu as the original set of
+ *   links that were passed in.
+ *
+ * @return
+ *   An array of menu links with the same properties as the passed-in array,
+ *   but with the link identifiers removed so that a new link will be created
+ *   when any of them is passed in to menu_link_save().
+ *
+ * @see menu_link_save()
+ */
+function menu_links_clone($links, $menu_name = NULL) {
+  foreach ($links as &$link) {
+    unset($link['mlid']);
+    unset($link['plid']);
+    if (isset($menu_name)) {
+      $link['menu_name'] = $menu_name;
+    }
+  }
+  return $links;
+}
+
+/**
+ * Returns an array containing all links for a menu.
+ *
+ * @param $menu_name
+ *   The name of the menu whose links should be returned.
+ *
+ * @return
+ *   An array of menu links.
+ */
+function menu_load_links($menu_name) {
+  $links = db_select('menu_links', 'ml', array('fetch' => PDO::FETCH_ASSOC))
+    ->fields('ml')
+    ->condition('ml.menu_name', $menu_name)
+    // Order by weight so as to be helpful for menus that are only one level
+    // deep.
+    ->orderBy('weight')
+    ->execute()
+    ->fetchAll();
+
+  foreach ($links as &$link) {
+    $link['options'] = unserialize($link['options']);
+  }
+  return $links;
+}
+
+/**
+ * Deletes all links for a menu.
+ *
+ * @param $menu_name
+ *   The name of the menu whose links will be deleted.
+ */
+function menu_delete_links($menu_name) {
+  $links = menu_load_links($menu_name);
+  foreach ($links as $link) {
+    // To speed up the deletion process, we reset some link properties that
+    // would trigger re-parenting logic in _menu_delete_item() and
+    // _menu_update_parental_status().
+    $link['has_children'] = FALSE;
+    $link['plid'] = 0;
+    _menu_delete_item($link);
+  }
+}
+
+/**
+ * Delete one or several menu links.
+ *
+ * @param $mlid
+ *   A valid menu link mlid or NULL. If NULL, $path is used.
+ * @param $path
+ *   The path to the menu items to be deleted. $mlid must be NULL.
+ */
+function menu_link_delete($mlid, $path = NULL) {
+  if (isset($mlid)) {
+    _menu_delete_item(db_query("SELECT * FROM {menu_links} WHERE mlid = :mlid", array(':mlid' => $mlid))->fetchAssoc());
+  }
+  else {
+    $result = db_query("SELECT * FROM {menu_links} WHERE link_path = :link_path", array(':link_path' => $path));
+    foreach ($result as $link) {
+      _menu_delete_item($link);
+    }
+  }
+}
+
+/**
+ * Deletes a single menu link.
+ *
+ * @param $item
+ *   Item to be deleted.
+ * @param $force
+ *   Forces deletion. Internal use only, setting to TRUE is discouraged.
+ *
+ * @see menu_link_delete()
+ */
+function _menu_delete_item($item, $force = FALSE) {
+  $item = is_object($item) ? get_object_vars($item) : $item;
+  if ($item && ($item['module'] != 'system' || $item['updated'] || $force)) {
+    // Children get re-attached to the item's parent.
+    if ($item['has_children']) {
+      $result = db_query("SELECT mlid FROM {menu_links} WHERE plid = :plid", array(':plid' => $item['mlid']));
+      foreach ($result as $m) {
+        $child = menu_link_load($m->mlid);
+        $child['plid'] = $item['plid'];
+        menu_link_save($child);
+      }
+    }
+
+    // Notify modules we are deleting the item.
+    module_invoke_all('menu_link_delete', $item);
+
+    db_delete('menu_links')->condition('mlid', $item['mlid'])->execute();
+
+    // Update the has_children status of the parent.
+    _menu_update_parental_status($item);
+    menu_cache_clear($item['menu_name']);
+    _menu_clear_page_cache();
+  }
+}
+
+/**
+ * Saves a menu link.
+ *
+ * After calling this function, rebuild the menu cache using
+ * menu_cache_clear_all().
+ *
+ * @param $item
+ *   An associative array representing a menu link item, with elements:
+ *   - link_path: (required) The path of the menu item, which should be
+ *     normalized first by calling drupal_get_normal_path() on it.
+ *   - link_title: (required) Title to appear in menu for the link.
+ *   - menu_name: (optional) The machine name of the menu for the link.
+ *     Defaults to 'navigation'.
+ *   - weight: (optional) Integer to determine position in menu. Default is 0.
+ *   - expanded: (optional) Boolean that determines if the item is expanded.
+ *   - options: (optional) An array of options, see l() for more.
+ *   - mlid: (optional) Menu link identifier, the primary integer key for each
+ *     menu link. Can be set to an existing value, or to 0 or NULL
+ *     to insert a new link.
+ *   - plid: (optional) The mlid of the parent.
+ *   - router_path: (optional) The path of the relevant router item.
+ * @param $existing_item
+ *   Optional, the current record from the {menu_links} table as an array.
+ * @param $parent_candidates
+ *   Optional array of menu links keyed by mlid. Used by
+ *   _menu_navigation_links_rebuild() only.
+ *
+ * @return
+ *   The mlid of the saved menu link, or FALSE if the menu link could not be
+ *   saved.
+ */
+function menu_link_save(&$item, $existing_item = array(), $parent_candidates = array()) {
+  drupal_alter('menu_link', $item);
+
+  // This is the easiest way to handle the unique internal path '<front>',
+  // since a path marked as external does not need to match a router path.
+  $item['external'] = (url_is_external($item['link_path'])  || $item['link_path'] == '<front>') ? 1 : 0;
+  // Load defaults.
+  $item += array(
+    'menu_name' => 'navigation',
+    'weight' => 0,
+    'link_title' => '',
+    'hidden' => 0,
+    'has_children' => 0,
+    'expanded' => 0,
+    'options' => array(),
+    'module' => 'menu',
+    'customized' => 0,
+    'updated' => 0,
+  );
+  if (isset($item['mlid'])) {
+    if (!$existing_item) {
+      $existing_item = db_query('SELECT * FROM {menu_links} WHERE mlid = :mlid', array('mlid' => $item['mlid']))->fetchAssoc();
+    }
+    if ($existing_item) {
+      $existing_item['options'] = unserialize($existing_item['options']);
+    }
+  }
+  else {
+    $existing_item = FALSE;
+  }
+
+  // Try to find a parent link. If found, assign it and derive its menu.
+  $parent = _menu_link_find_parent($item, $parent_candidates);
+  if (!empty($parent['mlid'])) {
+    $item['plid'] = $parent['mlid'];
+    $item['menu_name'] = $parent['menu_name'];
+  }
+  // If no corresponding parent link was found, move the link to the top-level.
+  else {
+    $item['plid'] = 0;
+  }
+  $menu_name = $item['menu_name'];
+
+  if (!$existing_item) {
+    $item['mlid'] = db_insert('menu_links')
+      ->fields(array(
+        'menu_name' => $item['menu_name'],
+        'plid' => $item['plid'],
+        'link_path' => $item['link_path'],
+        'hidden' => $item['hidden'],
+        'external' => $item['external'],
+        'has_children' => $item['has_children'],
+        'expanded' => $item['expanded'],
+        'weight' => $item['weight'],
+        'module' => $item['module'],
+        'link_title' => $item['link_title'],
+        'options' => serialize($item['options']),
+        'customized' => $item['customized'],
+        'updated' => $item['updated'],
+      ))
+      ->execute();
+  }
+
+  // Directly fill parents for top-level links.
+  if ($item['plid'] == 0) {
+    $item['p1'] = $item['mlid'];
+    for ($i = 2; $i <= MENU_MAX_DEPTH; $i++) {
+      $item["p$i"] = 0;
+    }
+    $item['depth'] = 1;
+  }
+  // Otherwise, ensure that this link's depth is not beyond the maximum depth
+  // and fill parents based on the parent link.
+  else {
+    if ($item['has_children'] && $existing_item) {
+      $limit = MENU_MAX_DEPTH - menu_link_children_relative_depth($existing_item) - 1;
+    }
+    else {
+      $limit = MENU_MAX_DEPTH - 1;
+    }
+    if ($parent['depth'] > $limit) {
+      return FALSE;
+    }
+    $item['depth'] = $parent['depth'] + 1;
+    _menu_link_parents_set($item, $parent);
+  }
+  // Need to check both plid and menu_name, since plid can be 0 in any menu.
+  if ($existing_item && ($item['plid'] != $existing_item['plid'] || $menu_name != $existing_item['menu_name'])) {
+    _menu_link_move_children($item, $existing_item);
+  }
+  // Find the router_path.
+  if (empty($item['router_path'])  || !$existing_item || ($existing_item['link_path'] != $item['link_path'])) {
+    if ($item['external']) {
+      $item['router_path'] = '';
+    }
+    else {
+      // Find the router path which will serve this path.
+      $item['parts'] = explode('/', $item['link_path'], MENU_MAX_PARTS);
+      $item['router_path'] = _menu_find_router_path($item['link_path']);
+    }
+  }
+  // If every value in $existing_item is the same in the $item, there is no
+  // reason to run the update queries or clear the caches. We use
+  // array_intersect_key() with the $item as the first parameter because
+  // $item may have additional keys left over from building a router entry.
+  // The intersect removes the extra keys, allowing a meaningful comparison.
+  if (!$existing_item || (array_intersect_key($item, $existing_item) != $existing_item)) {
+    db_update('menu_links')
+      ->fields(array(
+        'menu_name' => $item['menu_name'],
+        'plid' => $item['plid'],
+        'link_path' => $item['link_path'],
+        'router_path' => $item['router_path'],
+        'hidden' => $item['hidden'],
+        'external' => $item['external'],
+        'has_children' => $item['has_children'],
+        'expanded' => $item['expanded'],
+        'weight' => $item['weight'],
+        'depth' => $item['depth'],
+        'p1' => $item['p1'],
+        'p2' => $item['p2'],
+        'p3' => $item['p3'],
+        'p4' => $item['p4'],
+        'p5' => $item['p5'],
+        'p6' => $item['p6'],
+        'p7' => $item['p7'],
+        'p8' => $item['p8'],
+        'p9' => $item['p9'],
+        'module' => $item['module'],
+        'link_title' => $item['link_title'],
+        'options' => serialize($item['options']),
+        'customized' => $item['customized'],
+      ))
+      ->condition('mlid', $item['mlid'])
+      ->execute();
+    // Check the has_children status of the parent.
+    _menu_update_parental_status($item);
+    menu_cache_clear($menu_name);
+    if ($existing_item && $menu_name != $existing_item['menu_name']) {
+      menu_cache_clear($existing_item['menu_name']);
+    }
+    // Notify modules we have acted on a menu item.
+    $hook = 'menu_link_insert';
+    if ($existing_item) {
+      $hook = 'menu_link_update';
+    }
+    module_invoke_all($hook, $item);
+    // Now clear the cache.
+    _menu_clear_page_cache();
+  }
+  return $item['mlid'];
+}
+
+/**
+ * Finds a possible parent for a given menu link.
+ *
+ * Because the parent of a given link might not exist anymore in the database,
+ * we apply a set of heuristics to determine a proper parent:
+ *
+ *  - use the passed parent link if specified and existing.
+ *  - else, use the first existing link down the previous link hierarchy
+ *  - else, for system menu links (derived from hook_menu()), reparent
+ *    based on the path hierarchy.
+ *
+ * @param $menu_link
+ *   A menu link.
+ * @param $parent_candidates
+ *   An array of menu links keyed by mlid.
+ *
+ * @return
+ *   A menu link structure of the possible parent or FALSE if no valid parent
+ *   has been found.
+ */
+function _menu_link_find_parent($menu_link, $parent_candidates = array()) {
+  $parent = FALSE;
+
+  // This item is explicitely top-level, skip the rest of the parenting.
+  if (isset($menu_link['plid']) && empty($menu_link['plid'])) {
+    return $parent;
+  }
+
+  // If we have a parent link ID, try to use that.
+  $candidates = array();
+  if (isset($menu_link['plid'])) {
+    $candidates[] = $menu_link['plid'];
+  }
+
+  // Else, if we have a link hierarchy try to find a valid parent in there.
+  if (!empty($menu_link['depth']) && $menu_link['depth'] > 1) {
+    for ($depth = $menu_link['depth'] - 1; $depth >= 1; $depth--) {
+      $candidates[] = $menu_link['p' . $depth];
+    }
+  }
+
+  foreach ($candidates as $mlid) {
+    if (isset($parent_candidates[$mlid])) {
+      $parent = $parent_candidates[$mlid];
+    }
+    else {
+      $parent = db_query("SELECT * FROM {menu_links} WHERE mlid = :mlid", array(':mlid' => $mlid))->fetchAssoc();
+    }
+    if ($parent) {
+      return $parent;
+    }
+  }
+
+  // If everything else failed, try to derive the parent from the path
+  // hierarchy. This only makes sense for links derived from menu router
+  // items (ie. from hook_menu()).
+  if ($menu_link['module'] == 'system') {
+    $query = db_select('menu_links');
+    $query->condition('module', 'system');
+    // We always respect the link's 'menu_name'; inheritance for router items is
+    // ensured in _menu_router_build().
+    $query->condition('menu_name', $menu_link['menu_name']);
+
+    // Find the parent - it must be unique.
+    $parent_path = $menu_link['link_path'];
+    do {
+      $parent = FALSE;
+      $parent_path = substr($parent_path, 0, strrpos($parent_path, '/'));
+      $new_query = clone $query;
+      $new_query->condition('link_path', $parent_path);
+      // Only valid if we get a unique result.
+      if ($new_query->countQuery()->execute()->fetchField() == 1) {
+        $parent = $new_query->fields('menu_links')->execute()->fetchAssoc();
+      }
+    } while ($parent === FALSE && $parent_path);
+  }
+
+  return $parent;
+}
+
+/**
+ * Clears the page and block caches at most twice per page load.
+ */
+function _menu_clear_page_cache() {
+  $cache_cleared = &drupal_static(__FUNCTION__, 0);
+
+  // Clear the page and block caches, but at most twice, including at
+  //  the end of the page load when there are multiple links saved or deleted.
+  if ($cache_cleared == 0) {
+    cache_clear_all();
+    // Keep track of which menus have expanded items.
+    _menu_set_expanded_menus();
+    $cache_cleared = 1;
+  }
+  elseif ($cache_cleared == 1) {
+    drupal_register_shutdown_function('cache_clear_all');
+    // Keep track of which menus have expanded items.
+    drupal_register_shutdown_function('_menu_set_expanded_menus');
+    $cache_cleared = 2;
+  }
+}
+
+/**
+ * Updates a list of menus with expanded items.
+ */
+function _menu_set_expanded_menus() {
+  $names = db_query("SELECT menu_name FROM {menu_links} WHERE expanded <> 0 GROUP BY menu_name")->fetchCol();
+  variable_set('menu_expanded', $names);
+}
+
+/**
+ * Finds the router path which will serve this path.
+ *
+ * @param $link_path
+ *  The path for we are looking up its router path.
+ *
+ * @return
+ *  A path from $menu keys or empty if $link_path points to a nonexisting
+ *  place.
+ */
+function _menu_find_router_path($link_path) {
+  // $menu will only have data during a menu rebuild.
+  $menu = _menu_router_cache();
+
+  $router_path = $link_path;
+  $parts = explode('/', $link_path, MENU_MAX_PARTS);
+  $ancestors = menu_get_ancestors($parts);
+
+  if (empty($menu)) {
+    // Not during a menu rebuild, so look up in the database.
+    $router_path = (string) db_select('menu_router')
+      ->fields('menu_router', array('path'))
+      ->condition('path', $ancestors, 'IN')
+      ->orderBy('fit', 'DESC')
+      ->range(0, 1)
+      ->execute()->fetchField();
+  }
+  elseif (!isset($menu[$router_path])) {
+    // Add an empty router path as a fallback.
+    $ancestors[] = '';
+    foreach ($ancestors as $key => $router_path) {
+      if (isset($menu[$router_path])) {
+        // Exit the loop leaving $router_path as the first match.
+        break;
+      }
+    }
+    // If we did not find the path, $router_path will be the empty string
+    // at the end of $ancestors.
+  }
+  return $router_path;
+}
+
+/**
+ * Inserts, updates, or deletes an uncustomized menu link related to a module.
+ *
+ * @param $module
+ *   The name of the module.
+ * @param $op
+ *   Operation to perform: insert, update or delete.
+ * @param $link_path
+ *   The path this link points to.
+ * @param $link_title
+ *   Title of the link to insert or new title to update the link to.
+ *   Unused for delete.
+ *
+ * @return
+ *   The insert op returns the mlid of the new item. Others op return NULL.
+ */
+function menu_link_maintain($module, $op, $link_path, $link_title) {
+  switch ($op) {
+    case 'insert':
+      $menu_link = array(
+        'link_title' => $link_title,
+        'link_path' => $link_path,
+        'module' => $module,
+      );
+      return menu_link_save($menu_link);
+      break;
+    case 'update':
+      $result = db_query("SELECT * FROM {menu_links} WHERE link_path = :link_path AND module = :module AND customized = 0", array(':link_path' => $link_path, ':module' => $module))->fetchAll(PDO::FETCH_ASSOC);
+      foreach ($result as $link) {
+        $link['link_title'] = $link_title;
+        $link['options'] = unserialize($link['options']);
+        menu_link_save($link);
+      }
+      break;
+    case 'delete':
+      menu_link_delete(NULL, $link_path);
+      break;
+  }
+}
+
+/**
+ * Finds the depth of an item's children relative to its depth.
+ *
+ * For example, if the item has a depth of 2, and the maximum of any child in
+ * the menu link tree is 5, the relative depth is 3.
+ *
+ * @param $item
+ *   An array representing a menu link item.
+ *
+ * @return
+ *   The relative depth, or zero.
+ *
+ */
+function menu_link_children_relative_depth($item) {
+  $query = db_select('menu_links');
+  $query->addField('menu_links', 'depth');
+  $query->condition('menu_name', $item['menu_name']);
+  $query->orderBy('depth', 'DESC');
+  $query->range(0, 1);
+
+  $i = 1;
+  $p = 'p1';
+  while ($i <= MENU_MAX_DEPTH && $item[$p]) {
+    $query->condition($p, $item[$p]);
+    $p = 'p' . ++$i;
+  }
+
+  $max_depth = $query->execute()->fetchField();
+
+  return ($max_depth > $item['depth']) ? $max_depth - $item['depth'] : 0;
+}
+
+/**
+ * Updates the children of a menu link that is being moved.
+ *
+ * The menu name, parents (p1 - p6), and depth are updated for all children of
+ * the link, and the has_children status of the previous parent is updated.
+ */
+function _menu_link_move_children($item, $existing_item) {
+  $query = db_update('menu_links');
+
+  $query->fields(array('menu_name' => $item['menu_name']));
+
+  $p = 'p1';
+  $expressions = array();
+  for ($i = 1; $i <= $item['depth']; $p = 'p' . ++$i) {
+    $expressions[] = array($p, ":p_$i", array(":p_$i" => $item[$p]));
+  }
+  $j = $existing_item['depth'] + 1;
+  while ($i <= MENU_MAX_DEPTH && $j <= MENU_MAX_DEPTH) {
+    $expressions[] = array('p' . $i++, 'p' . $j++, array());
+  }
+  while ($i <= MENU_MAX_DEPTH) {
+    $expressions[] = array('p' . $i++, 0, array());
+  }
+
+  $shift = $item['depth'] - $existing_item['depth'];
+  if ($shift > 0) {
+    // The order of expressions must be reversed so the new values don't
+    // overwrite the old ones before they can be used because "Single-table
+    // UPDATE assignments are generally evaluated from left to right"
+    // see: http://dev.mysql.com/doc/refman/5.0/en/update.html
+    $expressions = array_reverse($expressions);
+  }
+  foreach ($expressions as $expression) {
+    $query->expression($expression[0], $expression[1], $expression[2]);
+  }
+
+  $query->expression('depth', 'depth + :depth', array(':depth' => $shift));
+  $query->condition('menu_name', $existing_item['menu_name']);
+  $p = 'p1';
+  for ($i = 1; $i <= MENU_MAX_DEPTH && $existing_item[$p]; $p = 'p' . ++$i) {
+    $query->condition($p, $existing_item[$p]);
+  }
+
+  $query->execute();
+
+  // Check the has_children status of the parent, while excluding this item.
+  _menu_update_parental_status($existing_item, TRUE);
+}
+
+/**
+ * Checks and updates the 'has_children' status for the parent of a link.
+ */
+function _menu_update_parental_status($item, $exclude = FALSE) {
+  // If plid == 0, there is nothing to update.
+  if ($item['plid']) {
+    // Check if at least one visible child exists in the table.
+    $query = db_select('menu_links');
+    $query->addField('menu_links', 'mlid');
+    $query->condition('menu_name', $item['menu_name']);
+    $query->condition('hidden', 0);
+    $query->condition('plid', $item['plid']);
+    $query->range(0, 1);
+    if ($exclude) {
+      $query->condition('mlid', $item['mlid'], '<>');
+    }
+    $parent_has_children = ((bool) $query->execute()->fetchField()) ? 1 : 0;
+    db_update('menu_links')
+      ->fields(array('has_children' => $parent_has_children))
+      ->condition('mlid', $item['plid'])
+      ->execute();
+  }
+}
+
+/**
+ * Sets the p1 through p9 values for a menu link being saved.
+ */
+function _menu_link_parents_set(&$item, $parent) {
+  $i = 1;
+  while ($i < $item['depth']) {
+    $p = 'p' . $i++;
+    $item[$p] = $parent[$p];
+  }
+  $p = 'p' . $i++;
+  // The parent (p1 - p9) corresponding to the depth always equals the mlid.
+  $item[$p] = $item['mlid'];
+  while ($i <= MENU_MAX_DEPTH) {
+    $p = 'p' . $i++;
+    $item[$p] = 0;
+  }
+}
+
+/**
+ * Builds the router table based on the data from hook_menu().
+ */
+function _menu_router_build($callbacks) {
+  // First pass: separate callbacks from paths, making paths ready for
+  // matching. Calculate fitness, and fill some default values.
+  $menu = array();
+  $masks = array();
+  foreach ($callbacks as $path => $item) {
+    $load_functions = array();
+    $to_arg_functions = array();
+    $fit = 0;
+    $move = FALSE;
+
+    $parts = explode('/', $path, MENU_MAX_PARTS);
+    $number_parts = count($parts);
+    // We store the highest index of parts here to save some work in the fit
+    // calculation loop.
+    $slashes = $number_parts - 1;
+    // Extract load and to_arg functions.
+    foreach ($parts as $k => $part) {
+      $match = FALSE;
+      // Look for wildcards in the form allowed to be used in PHP functions,
+      // because we are using these to construct the load function names.
+      if (preg_match('/^%(|' . DRUPAL_PHP_FUNCTION_PATTERN . ')$/', $part, $matches)) {
+        if (empty($matches[1])) {
+          $match = TRUE;
+          $load_functions[$k] = NULL;
+        }
+        else {
+          if (function_exists($matches[1] . '_to_arg')) {
+            $to_arg_functions[$k] = $matches[1] . '_to_arg';
+            $load_functions[$k] = NULL;
+            $match = TRUE;
+          }
+          if (function_exists($matches[1] . '_load')) {
+            $function = $matches[1] . '_load';
+            // Create an array of arguments that will be passed to the _load
+            // function when this menu path is checked, if 'load arguments'
+            // exists.
+            $load_functions[$k] = isset($item['load arguments']) ? array($function => $item['load arguments']) : $function;
+            $match = TRUE;
+          }
+        }
+      }
+      if ($match) {
+        $parts[$k] = '%';
+      }
+      else {
+        $fit |=  1 << ($slashes - $k);
+      }
+    }
+    if ($fit) {
+      $move = TRUE;
+    }
+    else {
+      // If there is no %, it fits maximally.
+      $fit = (1 << $number_parts) - 1;
+    }
+    $masks[$fit] = 1;
+    $item['_load_functions'] = $load_functions;
+    $item['to_arg_functions'] = empty($to_arg_functions) ? '' : serialize($to_arg_functions);
+    $item += array(
+      'title' => '',
+      'weight' => 0,
+      'type' => MENU_NORMAL_ITEM,
+      'module' => '',
+      '_number_parts' => $number_parts,
+      '_parts' => $parts,
+      '_fit' => $fit,
+    );
+    $item += array(
+      '_visible' => (bool) ($item['type'] & MENU_VISIBLE_IN_BREADCRUMB),
+      '_tab' => (bool) ($item['type'] & MENU_IS_LOCAL_TASK),
+    );
+    if ($move) {
+      $new_path = implode('/', $item['_parts']);
+      $menu[$new_path] = $item;
+      $sort[$new_path] = $number_parts;
+    }
+    else {
+      $menu[$path] = $item;
+      $sort[$path] = $number_parts;
+    }
+  }
+  array_multisort($sort, SORT_NUMERIC, $menu);
+  // Apply inheritance rules.
+  foreach ($menu as $path => $v) {
+    $item = &$menu[$path];
+    if (!$item['_tab']) {
+      // Non-tab items.
+      $item['tab_parent'] = '';
+      $item['tab_root'] = $path;
+    }
+    // If not specified, assign the default tab type for local tasks.
+    elseif (!isset($item['context'])) {
+      $item['context'] = MENU_CONTEXT_PAGE;
+    }
+    for ($i = $item['_number_parts'] - 1; $i; $i--) {
+      $parent_path = implode('/', array_slice($item['_parts'], 0, $i));
+      if (isset($menu[$parent_path])) {
+
+        $parent = &$menu[$parent_path];
+
+        // If we have no menu name, try to inherit it from parent items.
+        if (!isset($item['menu_name'])) {
+          // If the parent item of this item does not define a menu name (and no
+          // previous iteration assigned one already), try to find the menu name
+          // of the parent item in the currently stored menu links.
+          if (!isset($parent['menu_name'])) {
+            $menu_name = db_query("SELECT menu_name FROM {menu_links} WHERE router_path = :router_path AND module = 'system'", array(':router_path' => $parent_path))->fetchField();
+            if ($menu_name) {
+              $parent['menu_name'] = $menu_name;
+            }
+          }
+          // If the parent item defines a menu name, inherit it.
+          if (!empty($parent['menu_name'])) {
+            $item['menu_name'] = $parent['menu_name'];
+          }
+        }
+        if (!isset($item['tab_parent'])) {
+          // Parent stores the parent of the path.
+          $item['tab_parent'] = $parent_path;
+        }
+        if (!isset($item['tab_root']) && !$parent['_tab']) {
+          $item['tab_root'] = $parent_path;
+        }
+        // If an access callback is not found for a default local task we use
+        // the callback from the parent, since we expect them to be identical.
+        // In all other cases, the access parameters must be specified.
+        if (($item['type'] == MENU_DEFAULT_LOCAL_TASK) && !isset($item['access callback']) && isset($parent['access callback'])) {
+          $item['access callback'] = $parent['access callback'];
+          if (!isset($item['access arguments']) && isset($parent['access arguments'])) {
+            $item['access arguments'] = $parent['access arguments'];
+          }
+        }
+        // Same for page callbacks.
+        if (!isset($item['page callback']) && isset($parent['page callback'])) {
+          $item['page callback'] = $parent['page callback'];
+          if (!isset($item['page arguments']) && isset($parent['page arguments'])) {
+            $item['page arguments'] = $parent['page arguments'];
+          }
+          if (!isset($item['file path']) && isset($parent['file path'])) {
+            $item['file path'] = $parent['file path'];
+          }
+          if (!isset($item['file']) && isset($parent['file'])) {
+            $item['file'] = $parent['file'];
+            if (empty($item['file path']) && isset($item['module']) && isset($parent['module']) && $item['module'] != $parent['module']) {
+              $item['file path'] = drupal_get_path('module', $parent['module']);
+            }
+          }
+        }
+        // Same for delivery callbacks.
+        if (!isset($item['delivery callback']) && isset($parent['delivery callback'])) {
+          $item['delivery callback'] = $parent['delivery callback'];
+        }
+        // Same for theme callbacks.
+        if (!isset($item['theme callback']) && isset($parent['theme callback'])) {
+          $item['theme callback'] = $parent['theme callback'];
+          if (!isset($item['theme arguments']) && isset($parent['theme arguments'])) {
+            $item['theme arguments'] = $parent['theme arguments'];
+          }
+        }
+        // Same for load arguments: if a loader doesn't have any explict
+        // arguments, try to find arguments in the parent.
+        if (!isset($item['load arguments'])) {
+          foreach ($item['_load_functions'] as $k => $function) {
+            // This loader doesn't have any explict arguments...
+            if (!is_array($function)) {
+              // ... check the parent for a loader at the same position
+              // using the same function name and defining arguments...
+              if (isset($parent['_load_functions'][$k]) && is_array($parent['_load_functions'][$k]) && key($parent['_load_functions'][$k]) === $function) {
+                // ... and inherit the arguments on the child.
+                $item['_load_functions'][$k] = $parent['_load_functions'][$k];
+              }
+            }
+          }
+        }
+      }
+    }
+    if (!isset($item['access callback']) && isset($item['access arguments'])) {
+      // Default callback.
+      $item['access callback'] = 'user_access';
+    }
+    if (!isset($item['access callback']) || empty($item['page callback'])) {
+      $item['access callback'] = 0;
+    }
+    if (is_bool($item['access callback'])) {
+      $item['access callback'] = intval($item['access callback']);
+    }
+
+    $item['load_functions'] = empty($item['_load_functions']) ? '' : serialize($item['_load_functions']);
+    $item += array(
+      'access arguments' => array(),
+      'access callback' => '',
+      'page arguments' => array(),
+      'page callback' => '',
+      'delivery callback' => '',
+      'title arguments' => array(),
+      'title callback' => 't',
+      'theme arguments' => array(),
+      'theme callback' => '',
+      'description' => '',
+      'position' => '',
+      'context' => 0,
+      'tab_parent' => '',
+      'tab_root' => $path,
+      'path' => $path,
+      'file' => '',
+      'file path' => '',
+      'include file' => '',
+    );
+
+    // Calculate out the file to be included for each callback, if any.
+    if ($item['file']) {
+      $file_path = $item['file path'] ? $item['file path'] : drupal_get_path('module', $item['module']);
+      $item['include file'] = $file_path . '/' . $item['file'];
+    }
+  }
+
+  // Sort the masks so they are in order of descending fit.
+  $masks = array_keys($masks);
+  rsort($masks);
+
+  return array($menu, $masks);
+}
+
+/**
+ * Saves data from menu_router_build() to the router table.
+ */
+function _menu_router_save($menu, $masks) {
+  // Delete the existing router since we have some data to replace it.
+  db_truncate('menu_router')->execute();
+
+  // Prepare insert object.
+  $insert = db_insert('menu_router')
+    ->fields(array(
+      'path',
+      'load_functions',
+      'to_arg_functions',
+      'access_callback',
+      'access_arguments',
+      'page_callback',
+      'page_arguments',
+      'delivery_callback',
+      'fit',
+      'number_parts',
+      'context',
+      'tab_parent',
+      'tab_root',
+      'title',
+      'title_callback',
+      'title_arguments',
+      'theme_callback',
+      'theme_arguments',
+      'type',
+      'description',
+      'position',
+      'weight',
+      'include_file',
+    ));
+
+  $num_records = 0;
+
+  foreach ($menu as $path => $item) {
+    // Fill in insert object values.
+    $insert->values(array(
+      'path' => $item['path'],
+      'load_functions' => $item['load_functions'],
+      'to_arg_functions' => $item['to_arg_functions'],
+      'access_callback' => $item['access callback'],
+      'access_arguments' => serialize($item['access arguments']),
+      'page_callback' => $item['page callback'],
+      'page_arguments' => serialize($item['page arguments']),
+      'delivery_callback' => $item['delivery callback'],
+      'fit' => $item['_fit'],
+      'number_parts' => $item['_number_parts'],
+      'context' => $item['context'],
+      'tab_parent' => $item['tab_parent'],
+      'tab_root' => $item['tab_root'],
+      'title' => $item['title'],
+      'title_callback' => $item['title callback'],
+      'title_arguments' => ($item['title arguments'] ? serialize($item['title arguments']) : ''),
+      'theme_callback' => $item['theme callback'],
+      'theme_arguments' => serialize($item['theme arguments']),
+      'type' => $item['type'],
+      'description' => $item['description'],
+      'position' => $item['position'],
+      'weight' => $item['weight'],
+      'include_file' => $item['include file'],
+    ));
+
+    // Execute in batches to avoid the memory overhead of all of those records
+    // in the query object.
+    if (++$num_records == 20) {
+      $insert->execute();
+      $num_records = 0;
+    }
+  }
+  // Insert any remaining records.
+  $insert->execute();
+  // Store the masks.
+  variable_set('menu_masks', $masks);
+
+  return $menu;
+}
+
+/**
+ * Checks whether the site is in maintenance mode.
+ *
+ * This function will log the current user out and redirect to front page
+ * if the current user has no 'access site in maintenance mode' permission.
+ *
+ * @param $check_only
+ *   If this is set to TRUE, the function will perform the access checks and
+ *   return the site offline status, but not log the user out or display any
+ *   messages.
+ *
+ * @return
+ *   FALSE if the site is not in maintenance mode, the user login page is
+ *   displayed, or the user has the 'access site in maintenance mode'
+ *   permission. TRUE for anonymous users not being on the login page when the
+ *   site is in maintenance mode.
+ */
+function _menu_site_is_offline($check_only = FALSE) {
+  // Check if site is in maintenance mode.
+  if (variable_get('maintenance_mode', 0)) {
+    if (user_access('access site in maintenance mode')) {
+      // Ensure that the maintenance mode message is displayed only once
+      // (allowing for page redirects) and specifically suppress its display on
+      // the maintenance mode settings page.
+      if (!$check_only && $_GET['q'] != 'admin/config/development/maintenance') {
+        if (user_access('administer site configuration')) {
+          drupal_set_message(t('Operating in maintenance mode. <a href="@url">Go online.</a>', array('@url' => url('admin/config/development/maintenance'))), 'status', FALSE);
+        }
+        else {
+          drupal_set_message(t('Operating in maintenance mode.'), 'status', FALSE);
+        }
+      }
+    }
+    else {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * @} End of "defgroup menu".
+ */
diff --git a/htmltest/includes/module.inc b/htmltest/includes/module.inc
new file mode 100644
index 00000000..fe2a9805
--- /dev/null
+++ b/htmltest/includes/module.inc
@@ -0,0 +1,1103 @@
+<?php
+
+/**
+ * @file
+ * API for loading and interacting with Drupal modules.
+ */
+
+/**
+ * Loads all the modules that have been enabled in the system table.
+ *
+ * @param $bootstrap
+ *   Whether to load only the reduced set of modules loaded in "bootstrap mode"
+ *   for cached pages. See bootstrap.inc.
+ *
+ * @return
+ *   If $bootstrap is NULL, return a boolean indicating whether all modules
+ *   have been loaded.
+ */
+function module_load_all($bootstrap = FALSE) {
+  static $has_run = FALSE;
+
+  if (isset($bootstrap)) {
+    foreach (module_list(TRUE, $bootstrap) as $module) {
+      drupal_load('module', $module);
+    }
+    // $has_run will be TRUE if $bootstrap is FALSE.
+    $has_run = !$bootstrap;
+  }
+  return $has_run;
+}
+
+
+/**
+ * Returns a list of currently active modules.
+ *
+ * Usually, this returns a list of all enabled modules. When called early on in
+ * the bootstrap, it will return a list of vital modules only (those needed to
+ * generate cached pages).
+ *
+ * All parameters to this function are optional and should generally not be
+ * changed from their defaults.
+ *
+ * @param $refresh
+ *   (optional) Whether to force the module list to be regenerated (such as
+ *   after the administrator has changed the system settings). Defaults to
+ *   FALSE.
+ * @param $bootstrap_refresh
+ *   (optional) When $refresh is TRUE, setting $bootstrap_refresh to TRUE forces
+ *   the module list to be regenerated using the reduced set of modules loaded
+ *   in "bootstrap mode" for cached pages. Otherwise, setting $refresh to TRUE
+ *   generates the complete list of enabled modules.
+ * @param $sort
+ *   (optional) By default, modules are ordered by weight and module name. Set
+ *   this option to TRUE to return a module list ordered only by module name.
+ * @param $fixed_list
+ *   (optional) If an array of module names is provided, this will override the
+ *   module list with the given set of modules. This will persist until the next
+ *   call with $refresh set to TRUE or with a new $fixed_list passed in. This
+ *   parameter is primarily intended for internal use (e.g., in install.php and
+ *   update.php).
+ *
+ * @return
+ *   An associative array whose keys and values are the names of the modules in
+ *   the list.
+ */
+function module_list($refresh = FALSE, $bootstrap_refresh = FALSE, $sort = FALSE, $fixed_list = NULL) {
+  static $list = array(), $sorted_list;
+
+  if (empty($list) || $refresh || $fixed_list) {
+    $list = array();
+    $sorted_list = NULL;
+    if ($fixed_list) {
+      foreach ($fixed_list as $name => $module) {
+        drupal_get_filename('module', $name, $module['filename']);
+        $list[$name] = $name;
+      }
+    }
+    else {
+      if ($refresh) {
+        // For the $refresh case, make sure that system_list() returns fresh
+        // data.
+        drupal_static_reset('system_list');
+      }
+      if ($bootstrap_refresh) {
+        $list = system_list('bootstrap');
+      }
+      else {
+        // Not using drupal_map_assoc() here as that requires common.inc.
+        $list = array_keys(system_list('module_enabled'));
+        $list = (!empty($list) ? array_combine($list, $list) : array());
+      }
+    }
+  }
+  if ($sort) {
+    if (!isset($sorted_list)) {
+      $sorted_list = $list;
+      ksort($sorted_list);
+    }
+    return $sorted_list;
+  }
+  return $list;
+}
+
+/**
+ * Builds a list of bootstrap modules and enabled modules and themes.
+ *
+ * @param $type
+ *   The type of list to return:
+ *   - module_enabled: All enabled modules.
+ *   - bootstrap: All enabled modules required for bootstrap.
+ *   - theme: All themes.
+ *
+ * @return
+ *   An associative array of modules or themes, keyed by name. For $type
+ *   'bootstrap', the array values equal the keys. For $type 'module_enabled'
+ *   or 'theme', the array values are objects representing the respective
+ *   database row, with the 'info' property already unserialized.
+ *
+ * @see module_list()
+ * @see list_themes()
+ */
+function system_list($type) {
+  $lists = &drupal_static(__FUNCTION__);
+
+  // For bootstrap modules, attempt to fetch the list from cache if possible.
+  // if not fetch only the required information to fire bootstrap hooks
+  // in case we are going to serve the page from cache.
+  if ($type == 'bootstrap') {
+    if (isset($lists['bootstrap'])) {
+      return $lists['bootstrap'];
+    }
+    if ($cached = cache_get('bootstrap_modules', 'cache_bootstrap')) {
+      $bootstrap_list = $cached->data;
+    }
+    else {
+      $bootstrap_list = db_query("SELECT name, filename FROM {system} WHERE status = 1 AND bootstrap = 1 AND type = 'module' ORDER BY weight ASC, name ASC")->fetchAllAssoc('name');
+      cache_set('bootstrap_modules', $bootstrap_list, 'cache_bootstrap');
+    }
+    // To avoid a separate database lookup for the filepath, prime the
+    // drupal_get_filename() static cache for bootstrap modules only.
+    // The rest is stored separately to keep the bootstrap module cache small.
+    foreach ($bootstrap_list as $module) {
+      drupal_get_filename('module', $module->name, $module->filename);
+    }
+    // We only return the module names here since module_list() doesn't need
+    // the filename itself.
+    $lists['bootstrap'] = array_keys($bootstrap_list);
+  }
+  // Otherwise build the list for enabled modules and themes.
+  elseif (!isset($lists['module_enabled'])) {
+    if ($cached = cache_get('system_list', 'cache_bootstrap')) {
+      $lists = $cached->data;
+    }
+    else {
+      $lists = array(
+        'module_enabled' => array(),
+        'theme' => array(),
+        'filepaths' => array(),
+      );
+      // The module name (rather than the filename) is used as the fallback
+      // weighting in order to guarantee consistent behavior across different
+      // Drupal installations, which might have modules installed in different
+      // locations in the file system. The ordering here must also be
+      // consistent with the one used in module_implements().
+      $result = db_query("SELECT * FROM {system} WHERE type = 'theme' OR (type = 'module' AND status = 1) ORDER BY weight ASC, name ASC");
+      foreach ($result as $record) {
+        $record->info = unserialize($record->info);
+        // Build a list of all enabled modules.
+        if ($record->type == 'module') {
+          $lists['module_enabled'][$record->name] = $record;
+        }
+        // Build a list of themes.
+        if ($record->type == 'theme') {
+          $lists['theme'][$record->name] = $record;
+        }
+        // Build a list of filenames so drupal_get_filename can use it.
+        if ($record->status) {
+          $lists['filepaths'][] = array('type' => $record->type, 'name' => $record->name, 'filepath' => $record->filename);
+        }
+      }
+      foreach ($lists['theme'] as $key => $theme) {
+        if (!empty($theme->info['base theme'])) {
+          // Make a list of the theme's base themes.
+          require_once DRUPAL_ROOT . '/includes/theme.inc';
+          $lists['theme'][$key]->base_themes = drupal_find_base_themes($lists['theme'], $key);
+          // Don't proceed if there was a problem with the root base theme.
+          if (!current($lists['theme'][$key]->base_themes)) {
+            continue;
+          }
+          // Determine the root base theme.
+          $base_key = key($lists['theme'][$key]->base_themes);
+          // Add to the list of sub-themes for each of the theme's base themes.
+          foreach (array_keys($lists['theme'][$key]->base_themes) as $base_theme) {
+            $lists['theme'][$base_theme]->sub_themes[$key] = $lists['theme'][$key]->info['name'];
+          }
+          // Add the base theme's theme engine info.
+          $lists['theme'][$key]->info['engine'] = isset($lists['theme'][$base_key]->info['engine']) ? $lists['theme'][$base_key]->info['engine'] : 'theme';
+        }
+        else {
+          // A plain theme is its own engine.
+          $base_key = $key;
+          if (!isset($lists['theme'][$key]->info['engine'])) {
+            $lists['theme'][$key]->info['engine'] = 'theme';
+          }
+        }
+        // Set the theme engine prefix.
+        $lists['theme'][$key]->prefix = ($lists['theme'][$key]->info['engine'] == 'theme') ? $base_key : $lists['theme'][$key]->info['engine'];
+      }
+      cache_set('system_list', $lists, 'cache_bootstrap');
+    }
+    // To avoid a separate database lookup for the filepath, prime the
+    // drupal_get_filename() static cache with all enabled modules and themes.
+    foreach ($lists['filepaths'] as $item) {
+      drupal_get_filename($item['type'], $item['name'], $item['filepath']);
+    }
+  }
+
+  return $lists[$type];
+}
+
+/**
+ * Resets all system_list() caches.
+ */
+function system_list_reset() {
+  drupal_static_reset('system_list');
+  drupal_static_reset('system_rebuild_module_data');
+  drupal_static_reset('list_themes');
+  cache_clear_all('bootstrap_modules', 'cache_bootstrap');
+  cache_clear_all('system_list', 'cache_bootstrap');
+}
+
+/**
+ * Determines which modules require and are required by each module.
+ *
+ * @param $files
+ *   The array of filesystem objects used to rebuild the cache.
+ *
+ * @return
+ *   The same array with the new keys for each module:
+ *   - requires: An array with the keys being the modules that this module
+ *     requires.
+ *   - required_by: An array with the keys being the modules that will not work
+ *     without this module.
+ */
+function _module_build_dependencies($files) {
+  require_once DRUPAL_ROOT . '/includes/graph.inc';
+  foreach ($files as $filename => $file) {
+    $graph[$file->name]['edges'] = array();
+    if (isset($file->info['dependencies']) && is_array($file->info['dependencies'])) {
+      foreach ($file->info['dependencies'] as $dependency) {
+        $dependency_data = drupal_parse_dependency($dependency);
+        $graph[$file->name]['edges'][$dependency_data['name']] = $dependency_data;
+      }
+    }
+  }
+  drupal_depth_first_search($graph);
+  foreach ($graph as $module => $data) {
+    $files[$module]->required_by = isset($data['reverse_paths']) ? $data['reverse_paths'] : array();
+    $files[$module]->requires = isset($data['paths']) ? $data['paths'] : array();
+    $files[$module]->sort = $data['weight'];
+  }
+  return $files;
+}
+
+/**
+ * Determines whether a given module exists.
+ *
+ * @param $module
+ *   The name of the module (without the .module extension).
+ *
+ * @return
+ *   TRUE if the module is both installed and enabled.
+ */
+function module_exists($module) {
+  $list = module_list();
+  return isset($list[$module]);
+}
+
+/**
+ * Loads a module's installation hooks.
+ *
+ * @param $module
+ *   The name of the module (without the .module extension).
+ *
+ * @return
+ *   The name of the module's install file, if successful; FALSE otherwise.
+ */
+function module_load_install($module) {
+  // Make sure the installation API is available
+  include_once DRUPAL_ROOT . '/includes/install.inc';
+
+  return module_load_include('install', $module);
+}
+
+/**
+ * Loads a module include file.
+ *
+ * Examples:
+ * @code
+ *   // Load node.admin.inc from the node module.
+ *   module_load_include('inc', 'node', 'node.admin');
+ *   // Load content_types.inc from the node module.
+ *   module_load_include('inc', 'node', 'content_types');
+ * @endcode
+ *
+ * Do not use this function to load an install file, use module_load_install()
+ * instead. Do not use this function in a global context since it requires
+ * Drupal to be fully bootstrapped, use require_once DRUPAL_ROOT . '/path/file'
+ * instead.
+ *
+ * @param $type
+ *   The include file's type (file extension).
+ * @param $module
+ *   The module to which the include file belongs.
+ * @param $name
+ *   (optional) The base file name (without the $type extension). If omitted,
+ *   $module is used; i.e., resulting in "$module.$type" by default.
+ *
+ * @return
+ *   The name of the included file, if successful; FALSE otherwise.
+ */
+function module_load_include($type, $module, $name = NULL) {
+  if (!isset($name)) {
+    $name = $module;
+  }
+
+  if (function_exists('drupal_get_path')) {
+    $file = DRUPAL_ROOT . '/' . drupal_get_path('module', $module) . "/$name.$type";
+    if (is_file($file)) {
+      require_once $file;
+      return $file;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Loads an include file for each module enabled in the {system} table.
+ */
+function module_load_all_includes($type, $name = NULL) {
+  $modules = module_list();
+  foreach ($modules as $module) {
+    module_load_include($type, $module, $name);
+  }
+}
+
+/**
+ * Enables or installs a given list of modules.
+ *
+ * Definitions:
+ * - "Enabling" is the process of activating a module for use by Drupal.
+ * - "Disabling" is the process of deactivating a module.
+ * - "Installing" is the process of enabling it for the first time or after it
+ *   has been uninstalled.
+ * - "Uninstalling" is the process of removing all traces of a module.
+ *
+ * Order of events:
+ * - Gather and add module dependencies to $module_list (if applicable).
+ * - For each module that is being enabled:
+ *   - Install module schema and update system registries and caches.
+ *   - If the module is being enabled for the first time or had been
+ *     uninstalled, invoke hook_install() and add it to the list of installed
+ *     modules.
+ *   - Invoke hook_enable().
+ * - Invoke hook_modules_installed().
+ * - Invoke hook_modules_enabled().
+ *
+ * @param $module_list
+ *   An array of module names.
+ * @param $enable_dependencies
+ *   If TRUE, dependencies will automatically be added and enabled in the
+ *   correct order. This incurs a significant performance cost, so use FALSE
+ *   if you know $module_list is already complete and in the correct order.
+ *
+ * @return
+ *   FALSE if one or more dependencies are missing, TRUE otherwise.
+ *
+ * @see hook_install()
+ * @see hook_enable()
+ * @see hook_modules_installed()
+ * @see hook_modules_enabled()
+ */
+function module_enable($module_list, $enable_dependencies = TRUE) {
+  if ($enable_dependencies) {
+    // Get all module data so we can find dependencies and sort.
+    $module_data = system_rebuild_module_data();
+    // Create an associative array with weights as values.
+    $module_list = array_flip(array_values($module_list));
+
+    while (list($module) = each($module_list)) {
+      if (!isset($module_data[$module])) {
+        // This module is not found in the filesystem, abort.
+        return FALSE;
+      }
+      if ($module_data[$module]->status) {
+        // Skip already enabled modules.
+        unset($module_list[$module]);
+        continue;
+      }
+      $module_list[$module] = $module_data[$module]->sort;
+
+      // Add dependencies to the list, with a placeholder weight.
+      // The new modules will be processed as the while loop continues.
+      foreach (array_keys($module_data[$module]->requires) as $dependency) {
+        if (!isset($module_list[$dependency])) {
+          $module_list[$dependency] = 0;
+        }
+      }
+    }
+
+    if (!$module_list) {
+      // Nothing to do. All modules already enabled.
+      return TRUE;
+    }
+
+    // Sort the module list by pre-calculated weights.
+    arsort($module_list);
+    $module_list = array_keys($module_list);
+  }
+
+  // Required for module installation checks.
+  include_once DRUPAL_ROOT . '/includes/install.inc';
+
+  $modules_installed = array();
+  $modules_enabled = array();
+  foreach ($module_list as $module) {
+    // Only process modules that are not already enabled.
+    $existing = db_query("SELECT status FROM {system} WHERE type = :type AND name = :name", array(
+      ':type' => 'module',
+      ':name' => $module))
+      ->fetchObject();
+    if ($existing->status == 0) {
+      // Load the module's code.
+      drupal_load('module', $module);
+      module_load_install($module);
+
+      // Update the database and module list to reflect the new module. This
+      // needs to be done first so that the module's hook implementations,
+      // hook_schema() in particular, can be called while it is being
+      // installed.
+      db_update('system')
+        ->fields(array('status' => 1))
+        ->condition('type', 'module')
+        ->condition('name', $module)
+        ->execute();
+      // Refresh the module list to include it.
+      system_list_reset();
+      module_list(TRUE);
+      module_implements('', FALSE, TRUE);
+      _system_update_bootstrap_status();
+      // Update the registry to include it.
+      registry_update();
+      // Refresh the schema to include it.
+      drupal_get_schema(NULL, TRUE);
+      // Update the theme registry to include it.
+      drupal_theme_rebuild();
+      // Clear entity cache.
+      entity_info_cache_clear();
+
+      // Now install the module if necessary.
+      if (drupal_get_installed_schema_version($module, TRUE) == SCHEMA_UNINSTALLED) {
+        drupal_install_schema($module);
+
+        // Set the schema version to the number of the last update provided
+        // by the module.
+        $versions = drupal_get_schema_versions($module);
+        $version = $versions ? max($versions) : SCHEMA_INSTALLED;
+
+        // If the module has no current updates, but has some that were
+        // previously removed, set the version to the value of
+        // hook_update_last_removed().
+        if ($last_removed = module_invoke($module, 'update_last_removed')) {
+          $version = max($version, $last_removed);
+        }
+        drupal_set_installed_schema_version($module, $version);
+        // Allow the module to perform install tasks.
+        module_invoke($module, 'install');
+        // Record the fact that it was installed.
+        $modules_installed[] = $module;
+        watchdog('system', '%module module installed.', array('%module' => $module), WATCHDOG_INFO);
+      }
+
+      // Enable the module.
+      module_invoke($module, 'enable');
+
+      // Record the fact that it was enabled.
+      $modules_enabled[] = $module;
+      watchdog('system', '%module module enabled.', array('%module' => $module), WATCHDOG_INFO);
+    }
+  }
+
+  // If any modules were newly installed, invoke hook_modules_installed().
+  if (!empty($modules_installed)) {
+    module_invoke_all('modules_installed', $modules_installed);
+  }
+
+  // If any modules were newly enabled, invoke hook_modules_enabled().
+  if (!empty($modules_enabled)) {
+    module_invoke_all('modules_enabled', $modules_enabled);
+  }
+
+  return TRUE;
+}
+
+/**
+ * Disables a given set of modules.
+ *
+ * @param $module_list
+ *   An array of module names.
+ * @param $disable_dependents
+ *   If TRUE, dependent modules will automatically be added and disabled in the
+ *   correct order. This incurs a significant performance cost, so use FALSE
+ *   if you know $module_list is already complete and in the correct order.
+ */
+function module_disable($module_list, $disable_dependents = TRUE) {
+  if ($disable_dependents) {
+    // Get all module data so we can find dependents and sort.
+    $module_data = system_rebuild_module_data();
+    // Create an associative array with weights as values.
+    $module_list = array_flip(array_values($module_list));
+
+    $profile = drupal_get_profile();
+    while (list($module) = each($module_list)) {
+      if (!isset($module_data[$module]) || !$module_data[$module]->status) {
+        // This module doesn't exist or is already disabled, skip it.
+        unset($module_list[$module]);
+        continue;
+      }
+      $module_list[$module] = $module_data[$module]->sort;
+
+      // Add dependent modules to the list, with a placeholder weight.
+      // The new modules will be processed as the while loop continues.
+      foreach ($module_data[$module]->required_by as $dependent => $dependent_data) {
+        if (!isset($module_list[$dependent]) && $dependent != $profile) {
+          $module_list[$dependent] = 0;
+        }
+      }
+    }
+
+    // Sort the module list by pre-calculated weights.
+    asort($module_list);
+    $module_list = array_keys($module_list);
+  }
+
+  $invoke_modules = array();
+
+  foreach ($module_list as $module) {
+    if (module_exists($module)) {
+      // Check if node_access table needs rebuilding.
+      if (!node_access_needs_rebuild() && module_hook($module, 'node_grants')) {
+        node_access_needs_rebuild(TRUE);
+      }
+
+      module_load_install($module);
+      module_invoke($module, 'disable');
+      db_update('system')
+        ->fields(array('status' => 0))
+        ->condition('type', 'module')
+        ->condition('name', $module)
+        ->execute();
+      $invoke_modules[] = $module;
+      watchdog('system', '%module module disabled.', array('%module' => $module), WATCHDOG_INFO);
+    }
+  }
+
+  if (!empty($invoke_modules)) {
+    // Refresh the module list to exclude the disabled modules.
+    system_list_reset();
+    module_list(TRUE);
+    module_implements('', FALSE, TRUE);
+    entity_info_cache_clear();
+    // Invoke hook_modules_disabled before disabling modules,
+    // so we can still call module hooks to get information.
+    module_invoke_all('modules_disabled', $invoke_modules);
+    // Update the registry to remove the newly-disabled module.
+    registry_update();
+    _system_update_bootstrap_status();
+    // Update the theme registry to remove the newly-disabled module.
+    drupal_theme_rebuild();
+  }
+
+  // If there remains no more node_access module, rebuilding will be
+  // straightforward, we can do it right now.
+  if (node_access_needs_rebuild() && count(module_implements('node_grants')) == 0) {
+    node_access_rebuild();
+  }
+}
+
+/**
+ * @defgroup hooks Hooks
+ * @{
+ * Allow modules to interact with the Drupal core.
+ *
+ * Drupal's module system is based on the concept of "hooks". A hook is a PHP
+ * function that is named foo_bar(), where "foo" is the name of the module
+ * (whose filename is thus foo.module) and "bar" is the name of the hook. Each
+ * hook has a defined set of parameters and a specified result type.
+ *
+ * To extend Drupal, a module need simply implement a hook. When Drupal wishes
+ * to allow intervention from modules, it determines which modules implement a
+ * hook and calls that hook in all enabled modules that implement it.
+ *
+ * The available hooks to implement are explained here in the Hooks section of
+ * the developer documentation. The string "hook" is used as a placeholder for
+ * the module name in the hook definitions. For example, if the module file is
+ * called example.module, then hook_help() as implemented by that module would
+ * be defined as example_help().
+ *
+ * The example functions included are not part of the Drupal core, they are
+ * just models that you can modify. Only the hooks implemented within modules
+ * are executed when running Drupal.
+ *
+ * @see themeable
+ * @see callbacks
+ */
+
+ /**
+  * @defgroup callbacks Callbacks
+  * @{
+  * Callback function signatures.
+  *
+  * Drupal's API sometimes uses callback functions to allow you to define how
+  * some type of processing happens. A callback is a function with a defined
+  * signature, which you define in a module. Then you pass the function name as
+  * a parameter to a Drupal API function or return it as part of a hook
+  * implementation return value, and your function is called at an appropriate
+  * time. For instance, when setting up batch processing you might need to
+  * provide a callback function for each processing step and/or a callback for
+  * when processing is finished; you would do that by defining these functions
+  * and passing their names into the batch setup function.
+  *
+  * Callback function signatures, like hook definitions, are described by
+  * creating and documenting dummy functions in a *.api.php file; normally, the
+  * dummy callback function's name should start with "callback_", and you should
+  * document the parameters and return value and provide a sample function body.
+  * Then your API documentation can refer to this callback function in its
+  * documentation. A user of your API can usually name their callback function
+  * anything they want, although a standard name would be to replace "callback_"
+  * with the module name.
+  *
+  * @see hooks
+  * @see themeable
+  *
+  * @}
+  */
+
+/**
+ * Determines whether a module implements a hook.
+ *
+ * @param $module
+ *   The name of the module (without the .module extension).
+ * @param $hook
+ *   The name of the hook (e.g. "help" or "menu").
+ *
+ * @return
+ *   TRUE if the module is both installed and enabled, and the hook is
+ *   implemented in that module.
+ */
+function module_hook($module, $hook) {
+  $function = $module . '_' . $hook;
+  if (function_exists($function)) {
+    return TRUE;
+  }
+  // If the hook implementation does not exist, check whether it may live in an
+  // optional include file registered via hook_hook_info().
+  $hook_info = module_hook_info();
+  if (isset($hook_info[$hook]['group'])) {
+    module_load_include('inc', $module, $module . '.' . $hook_info[$hook]['group']);
+    if (function_exists($function)) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Determines which modules are implementing a hook.
+ *
+ * @param $hook
+ *   The name of the hook (e.g. "help" or "menu").
+ * @param $sort
+ *   By default, modules are ordered by weight and filename, settings this option
+ *   to TRUE, module list will be ordered by module name.
+ * @param $reset
+ *   For internal use only: Whether to force the stored list of hook
+ *   implementations to be regenerated (such as after enabling a new module,
+ *   before processing hook_enable).
+ *
+ * @return
+ *   An array with the names of the modules which are implementing this hook.
+ *
+ * @see module_implements_write_cache()
+ */
+function module_implements($hook, $sort = FALSE, $reset = FALSE) {
+  // Use the advanced drupal_static() pattern, since this is called very often.
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['implementations'] = &drupal_static(__FUNCTION__);
+  }
+  $implementations = &$drupal_static_fast['implementations'];
+
+  // We maintain a persistent cache of hook implementations in addition to the
+  // static cache to avoid looping through every module and every hook on each
+  // request. Benchmarks show that the benefit of this caching outweighs the
+  // additional database hit even when using the default database caching
+  // backend and only a small number of modules are enabled. The cost of the
+  // cache_get() is more or less constant and reduced further when non-database
+  // caching backends are used, so there will be more significant gains when a
+  // large number of modules are installed or hooks invoked, since this can
+  // quickly lead to module_hook() being called several thousand times
+  // per request.
+  if ($reset) {
+    $implementations = array();
+    cache_set('module_implements', array(), 'cache_bootstrap');
+    drupal_static_reset('module_hook_info');
+    drupal_static_reset('drupal_alter');
+    cache_clear_all('hook_info', 'cache_bootstrap');
+    return;
+  }
+
+  // Fetch implementations from cache.
+  if (empty($implementations)) {
+    $implementations = cache_get('module_implements', 'cache_bootstrap');
+    if ($implementations === FALSE) {
+      $implementations = array();
+    }
+    else {
+      $implementations = $implementations->data;
+    }
+  }
+
+  if (!isset($implementations[$hook])) {
+    // The hook is not cached, so ensure that whether or not it has
+    // implementations, that the cache is updated at the end of the request.
+    $implementations['#write_cache'] = TRUE;
+    $hook_info = module_hook_info();
+    $implementations[$hook] = array();
+    $list = module_list(FALSE, FALSE, $sort);
+    foreach ($list as $module) {
+      $include_file = isset($hook_info[$hook]['group']) && module_load_include('inc', $module, $module . '.' . $hook_info[$hook]['group']);
+      // Since module_hook() may needlessly try to load the include file again,
+      // function_exists() is used directly here.
+      if (function_exists($module . '_' . $hook)) {
+        $implementations[$hook][$module] = $include_file ? $hook_info[$hook]['group'] : FALSE;
+      }
+    }
+    // Allow modules to change the weight of specific implementations but avoid
+    // an infinite loop.
+    if ($hook != 'module_implements_alter') {
+      drupal_alter('module_implements', $implementations[$hook], $hook);
+    }
+  }
+  else {
+    foreach ($implementations[$hook] as $module => $group) {
+      // If this hook implementation is stored in a lazy-loaded file, so include
+      // that file first.
+      if ($group) {
+        module_load_include('inc', $module, "$module.$group");
+      }
+      // It is possible that a module removed a hook implementation without the
+      // implementations cache being rebuilt yet, so we check whether the
+      // function exists on each request to avoid undefined function errors.
+      // Since module_hook() may needlessly try to load the include file again,
+      // function_exists() is used directly here.
+      if (!function_exists($module . '_' . $hook)) {
+        // Clear out the stale implementation from the cache and force a cache
+        // refresh to forget about no longer existing hook implementations.
+        unset($implementations[$hook][$module]);
+        $implementations['#write_cache'] = TRUE;
+      }
+    }
+  }
+
+  return array_keys($implementations[$hook]);
+}
+
+/**
+ * Retrieves a list of hooks that are declared through hook_hook_info().
+ *
+ * @return
+ *   An associative array whose keys are hook names and whose values are an
+ *   associative array containing a group name. The structure of the array
+ *   is the same as the return value of hook_hook_info().
+ *
+ * @see hook_hook_info()
+ */
+function module_hook_info() {
+  // This function is indirectly invoked from bootstrap_invoke_all(), in which
+  // case common.inc, subsystems, and modules are not loaded yet, so it does not
+  // make sense to support hook groups resp. lazy-loaded include files prior to
+  // full bootstrap.
+  if (drupal_bootstrap(NULL, FALSE) != DRUPAL_BOOTSTRAP_FULL) {
+    return array();
+  }
+  $hook_info = &drupal_static(__FUNCTION__);
+
+  if (!isset($hook_info)) {
+    $hook_info = array();
+    $cache = cache_get('hook_info', 'cache_bootstrap');
+    if ($cache === FALSE) {
+      // Rebuild the cache and save it.
+      // We can't use module_invoke_all() here or it would cause an infinite
+      // loop.
+      foreach (module_list() as $module) {
+        $function = $module . '_hook_info';
+        if (function_exists($function)) {
+          $result = $function();
+          if (isset($result) && is_array($result)) {
+            $hook_info = array_merge_recursive($hook_info, $result);
+          }
+        }
+      }
+      // We can't use drupal_alter() for the same reason as above.
+      foreach (module_list() as $module) {
+        $function = $module . '_hook_info_alter';
+        if (function_exists($function)) {
+          $function($hook_info);
+        }
+      }
+      cache_set('hook_info', $hook_info, 'cache_bootstrap');
+    }
+    else {
+      $hook_info = $cache->data;
+    }
+  }
+
+  return $hook_info;
+}
+
+/**
+ * Writes the hook implementation cache.
+ *
+ * @see module_implements()
+ */
+function module_implements_write_cache() {
+  $implementations = &drupal_static('module_implements');
+  if (isset($implementations['#write_cache'])) {
+    unset($implementations['#write_cache']);
+    cache_set('module_implements', $implementations, 'cache_bootstrap');
+  }
+}
+
+/**
+ * Invokes a hook in a particular module.
+ *
+ * All arguments are passed by value. Use drupal_alter() if you need to pass
+ * arguments by reference.
+ *
+ * @param $module
+ *   The name of the module (without the .module extension).
+ * @param $hook
+ *   The name of the hook to invoke.
+ * @param ...
+ *   Arguments to pass to the hook implementation.
+ *
+ * @return
+ *   The return value of the hook implementation.
+ *
+ * @see drupal_alter()
+ */
+function module_invoke($module, $hook) {
+  $args = func_get_args();
+  // Remove $module and $hook from the arguments.
+  unset($args[0], $args[1]);
+  if (module_hook($module, $hook)) {
+    return call_user_func_array($module . '_' . $hook, $args);
+  }
+}
+
+/**
+ * Invokes a hook in all enabled modules that implement it.
+ *
+ * All arguments are passed by value. Use drupal_alter() if you need to pass
+ * arguments by reference.
+ *
+ * @param $hook
+ *   The name of the hook to invoke.
+ * @param ...
+ *   Arguments to pass to the hook.
+ *
+ * @return
+ *   An array of return values of the hook implementations. If modules return
+ *   arrays from their implementations, those are merged into one array.
+ *
+ * @see drupal_alter()
+ */
+function module_invoke_all($hook) {
+  $args = func_get_args();
+  // Remove $hook from the arguments.
+  unset($args[0]);
+  $return = array();
+  foreach (module_implements($hook) as $module) {
+    $function = $module . '_' . $hook;
+    if (function_exists($function)) {
+      $result = call_user_func_array($function, $args);
+      if (isset($result) && is_array($result)) {
+        $return = array_merge_recursive($return, $result);
+      }
+      elseif (isset($result)) {
+        $return[] = $result;
+      }
+    }
+  }
+
+  return $return;
+}
+
+/**
+ * @} End of "defgroup hooks".
+ */
+
+/**
+ * Returns an array of modules required by core.
+ */
+function drupal_required_modules() {
+  $files = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.info$/', 'modules', 'name', 0);
+  $required = array();
+
+  // An installation profile is required and one must always be loaded.
+  $required[] = drupal_get_profile();
+
+  foreach ($files as $name => $file) {
+    $info = drupal_parse_info_file($file->uri);
+    if (!empty($info) && !empty($info['required']) && $info['required']) {
+      $required[] = $name;
+    }
+  }
+
+  return $required;
+}
+
+/**
+ * Passes alterable variables to specific hook_TYPE_alter() implementations.
+ *
+ * This dispatch function hands off the passed-in variables to type-specific
+ * hook_TYPE_alter() implementations in modules. It ensures a consistent
+ * interface for all altering operations.
+ *
+ * A maximum of 2 alterable arguments is supported (a third is supported for
+ * legacy reasons, but should not be used in new code). In case more arguments
+ * need to be passed and alterable, modules provide additional variables
+ * assigned by reference in the last $context argument:
+ * @code
+ *   $context = array(
+ *     'alterable' => &$alterable,
+ *     'unalterable' => $unalterable,
+ *     'foo' => 'bar',
+ *   );
+ *   drupal_alter('mymodule_data', $alterable1, $alterable2, $context);
+ * @endcode
+ *
+ * Note that objects are always passed by reference in PHP5. If it is absolutely
+ * required that no implementation alters a passed object in $context, then an
+ * object needs to be cloned:
+ * @code
+ *   $context = array(
+ *     'unalterable_object' => clone $object,
+ *   );
+ *   drupal_alter('mymodule_data', $data, $context);
+ * @endcode
+ *
+ * @param $type
+ *   A string describing the type of the alterable $data. 'form', 'links',
+ *   'node_content', and so on are several examples. Alternatively can be an
+ *   array, in which case hook_TYPE_alter() is invoked for each value in the
+ *   array, ordered first by module, and then for each module, in the order of
+ *   values in $type. For example, when Form API is using drupal_alter() to
+ *   execute both hook_form_alter() and hook_form_FORM_ID_alter()
+ *   implementations, it passes array('form', 'form_' . $form_id) for $type.
+ * @param $data
+ *   The variable that will be passed to hook_TYPE_alter() implementations to be
+ *   altered. The type of this variable depends on the value of the $type
+ *   argument. For example, when altering a 'form', $data will be a structured
+ *   array. When altering a 'profile', $data will be an object.
+ * @param $context1
+ *   (optional) An additional variable that is passed by reference.
+ * @param $context2
+ *   (optional) An additional variable that is passed by reference. If more
+ *   context needs to be provided to implementations, then this should be an
+ *   associative array as described above.
+ * @param $context3
+ *   (optional) An additional variable that is passed by reference. This
+ *   parameter is deprecated and will not exist in Drupal 8; consequently, it
+ *   should not be used for new Drupal 7 code either. It is here only for
+ *   backwards compatibility with older code that passed additional arguments
+ *   to drupal_alter().
+ */
+function drupal_alter($type, &$data, &$context1 = NULL, &$context2 = NULL, &$context3 = NULL) {
+  // Use the advanced drupal_static() pattern, since this is called very often.
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['functions'] = &drupal_static(__FUNCTION__);
+  }
+  $functions = &$drupal_static_fast['functions'];
+
+  // Most of the time, $type is passed as a string, so for performance,
+  // normalize it to that. When passed as an array, usually the first item in
+  // the array is a generic type, and additional items in the array are more
+  // specific variants of it, as in the case of array('form', 'form_FORM_ID').
+  if (is_array($type)) {
+    $cid = implode(',', $type);
+    $extra_types = $type;
+    $type = array_shift($extra_types);
+    // Allow if statements in this function to use the faster isset() rather
+    // than !empty() both when $type is passed as a string, or as an array with
+    // one item.
+    if (empty($extra_types)) {
+      unset($extra_types);
+    }
+  }
+  else {
+    $cid = $type;
+  }
+
+  // Some alter hooks are invoked many times per page request, so statically
+  // cache the list of functions to call, and on subsequent calls, iterate
+  // through them quickly.
+  if (!isset($functions[$cid])) {
+    $functions[$cid] = array();
+    $hook = $type . '_alter';
+    $modules = module_implements($hook);
+    if (!isset($extra_types)) {
+      // For the more common case of a single hook, we do not need to call
+      // function_exists(), since module_implements() returns only modules with
+      // implementations.
+      foreach ($modules as $module) {
+        $functions[$cid][] = $module . '_' . $hook;
+      }
+    }
+    else {
+      // For multiple hooks, we need $modules to contain every module that
+      // implements at least one of them.
+      $extra_modules = array();
+      foreach ($extra_types as $extra_type) {
+        $extra_modules = array_merge($extra_modules, module_implements($extra_type . '_alter'));
+      }
+      // If any modules implement one of the extra hooks that do not implement
+      // the primary hook, we need to add them to the $modules array in their
+      // appropriate order. module_implements() can only return ordered
+      // implementations of a single hook. To get the ordered implementations
+      // of multiple hooks, we mimic the module_implements() logic of first
+      // ordering by module_list(), and then calling
+      // drupal_alter('module_implements').
+      if (array_diff($extra_modules, $modules)) {
+        // Merge the arrays and order by module_list().
+        $modules = array_intersect(module_list(), array_merge($modules, $extra_modules));
+        // Since module_implements() already took care of loading the necessary
+        // include files, we can safely pass FALSE for the array values.
+        $implementations = array_fill_keys($modules, FALSE);
+        // Let modules adjust the order solely based on the primary hook. This
+        // ensures the same module order regardless of whether this if block
+        // runs. Calling drupal_alter() recursively in this way does not result
+        // in an infinite loop, because this call is for a single $type, so we
+        // won't end up in this code block again.
+        drupal_alter('module_implements', $implementations, $hook);
+        $modules = array_keys($implementations);
+      }
+      foreach ($modules as $module) {
+        // Since $modules is a merged array, for any given module, we do not
+        // know whether it has any particular implementation, so we need a
+        // function_exists().
+        $function = $module . '_' . $hook;
+        if (function_exists($function)) {
+          $functions[$cid][] = $function;
+        }
+        foreach ($extra_types as $extra_type) {
+          $function = $module . '_' . $extra_type . '_alter';
+          if (function_exists($function)) {
+            $functions[$cid][] = $function;
+          }
+        }
+      }
+    }
+    // Allow the theme to alter variables after the theme system has been
+    // initialized.
+    global $theme, $base_theme_info;
+    if (isset($theme)) {
+      $theme_keys = array();
+      foreach ($base_theme_info as $base) {
+        $theme_keys[] = $base->name;
+      }
+      $theme_keys[] = $theme;
+      foreach ($theme_keys as $theme_key) {
+        $function = $theme_key . '_' . $hook;
+        if (function_exists($function)) {
+          $functions[$cid][] = $function;
+        }
+        if (isset($extra_types)) {
+          foreach ($extra_types as $extra_type) {
+            $function = $theme_key . '_' . $extra_type . '_alter';
+            if (function_exists($function)) {
+              $functions[$cid][] = $function;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  foreach ($functions[$cid] as $function) {
+    $function($data, $context1, $context2, $context3);
+  }
+}
diff --git a/htmltest/includes/pager.inc b/htmltest/includes/pager.inc
new file mode 100644
index 00000000..c060d0e7
--- /dev/null
+++ b/htmltest/includes/pager.inc
@@ -0,0 +1,664 @@
+<?php
+
+/**
+ * @file
+ * Functions to aid in presenting database results as a set of pages.
+ */
+
+
+/**
+ * Query extender for pager queries.
+ *
+ * This is the "default" pager mechanism.  It creates a paged query with a fixed
+ * number of entries per page.
+ */
+class PagerDefault extends SelectQueryExtender {
+
+  /**
+   * The highest element we've autogenerated so far.
+   *
+   * @var int
+   */
+  static $maxElement = 0;
+
+  /**
+   * The number of elements per page to allow.
+   *
+   * @var int
+   */
+  protected $limit = 10;
+
+  /**
+   * The unique ID of this pager on this page.
+   *
+   * @var int
+   */
+  protected $element = NULL;
+
+  /**
+   * The count query that will be used for this pager.
+   *
+   * @var SelectQueryInterface
+   */
+  protected $customCountQuery = FALSE;
+
+  public function __construct(SelectQueryInterface $query, DatabaseConnection $connection) {
+    parent::__construct($query, $connection);
+
+    // Add pager tag. Do this here to ensure that it is always added before
+    // preExecute() is called.
+    $this->addTag('pager');
+  }
+
+  /**
+   * Override the execute method.
+   *
+   * Before we run the query, we need to add pager-based range() instructions
+   * to it.
+   */
+  public function execute() {
+
+    // Add convenience tag to mark that this is an extended query. We have to
+    // do this in the constructor to ensure that it is set before preExecute()
+    // gets called.
+    if (!$this->preExecute($this)) {
+      return NULL;
+    }
+
+    // A NULL limit is the "kill switch" for pager queries.
+    if (empty($this->limit)) {
+      return;
+    }
+    $this->ensureElement();
+
+    $total_items = $this->getCountQuery()->execute()->fetchField();
+    $current_page = pager_default_initialize($total_items, $this->limit, $this->element);
+    $this->range($current_page * $this->limit, $this->limit);
+
+    // Now that we've added our pager-based range instructions, run the query normally.
+    return $this->query->execute();
+  }
+
+  /**
+   * Ensure that there is an element associated with this query.
+   * If an element was not specified previously, then the value of the
+   * $maxElement counter is taken, after which the counter is incremented.
+   *
+   * After running this method, access $this->element to get the element for this
+   * query.
+   */
+  protected function ensureElement() {
+    if (!isset($this->element)) {
+      $this->element = self::$maxElement++;
+    }
+  }
+
+  /**
+   * Specify the count query object to use for this pager.
+   *
+   * You will rarely need to specify a count query directly.  If not specified,
+   * one is generated off of the pager query itself.
+   *
+   * @param SelectQueryInterface $query
+   *   The count query object.  It must return a single row with a single column,
+   *   which is the total number of records.
+   */
+  public function setCountQuery(SelectQueryInterface $query) {
+    $this->customCountQuery = $query;
+  }
+
+  /**
+   * Retrieve the count query for this pager.
+   *
+   * The count query may be specified manually or, by default, taken from the
+   * query we are extending.
+   *
+   * @return SelectQueryInterface
+   *   A count query object.
+   */
+  public function getCountQuery() {
+    if ($this->customCountQuery) {
+      return $this->customCountQuery;
+    }
+    else {
+      return $this->query->countQuery();
+    }
+  }
+
+  /**
+   * Specify the maximum number of elements per page for this query.
+   *
+   * The default if not specified is 10 items per page.
+   *
+   * @param $limit
+   *   An integer specifying the number of elements per page.  If passed a false
+   *   value (FALSE, 0, NULL), the pager is disabled.
+   */
+  public function limit($limit = 10) {
+    $this->limit = $limit;
+    return $this;
+  }
+
+  /**
+   * Specify the element ID for this pager query.
+   *
+   * The element is used to differentiate different pager queries on the same
+   * page so that they may be operated independently.  If you do not specify an
+   * element, every pager query on the page will get a unique element.  If for
+   * whatever reason you want to explicitly define an element for a given query,
+   * you may do so here.
+   *
+   * Setting the element here also increments the static $maxElement counter,
+   * which is used for determining the $element when there's none specified.
+   *
+   * Note that no collision detection is done when setting an element ID
+   * explicitly, so it is possible for two pagers to end up using the same ID
+   * if both are set explicitly.
+   *
+   * @param $element
+   */
+  public function element($element) {
+    $this->element = $element;
+    if ($element >= self::$maxElement) {
+      self::$maxElement = $element + 1;
+    }
+    return $this;
+  }
+}
+
+/**
+ * Returns the current page being requested for display within a pager.
+ *
+ * @param $element
+ *  An optional integer to distinguish between multiple pagers on one page.
+ *
+ * @return
+ *  The number of the current requested page, within the pager represented by
+ *  $element. This is determined from the URL query parameter $_GET['page'], or
+ *  0 by default. Note that this number may differ from the actual page being
+ *  displayed. For example, if a search for "example text" brings up three
+ *  pages of results, but a users visits search/node/example+text?page=10, this
+ *  function will return 10, even though the default pager implementation
+ *  adjusts for this and still displays the third page of search results at
+ *  that URL.
+ *
+ * @see pager_default_initialize()
+ */
+function pager_find_page($element = 0) {
+  $page = isset($_GET['page']) ? $_GET['page'] : '';
+  $page_array = explode(',', $page);
+  if (!isset($page_array[$element])) {
+    $page_array[$element] = 0;
+  }
+  return (int) $page_array[$element];
+}
+
+/**
+ * Initializes a pager for theme('pager').
+ *
+ * This function sets up the necessary global variables so that future calls
+ * to theme('pager') will render a pager that correctly corresponds to the
+ * items being displayed.
+ *
+ * If the items being displayed result from a database query performed using
+ * Drupal's database API, and if you have control over the construction of the
+ * database query, you do not need to call this function directly; instead, you
+ * can simply extend the query object with the 'PagerDefault' extender before
+ * executing it. For example:
+ * @code
+ *   $query = db_select('some_table')->extend('PagerDefault');
+ * @endcode
+ *
+ * However, if you are using a different method for generating the items to be
+ * paged through, then you should call this function in preparation.
+ *
+ * The following example shows how this function can be used in a page callback
+ * that invokes an external datastore with an SQL-like syntax:
+ * @code
+ *   // First find the total number of items and initialize the pager.
+ *   $where = "status = 1";
+ *   $total = mymodule_select("SELECT COUNT(*) FROM data " . $where)->result();
+ *   $num_per_page = variable_get('mymodule_num_per_page', 10);
+ *   $page = pager_default_initialize($total, $num_per_page);
+ *
+ *   // Next, retrieve and display the items for the current page.
+ *   $offset = $num_per_page * $page;
+ *   $result = mymodule_select("SELECT * FROM data " . $where . " LIMIT %d, %d", $offset, $num_per_page)->fetchAll();
+ *   $output = theme('mymodule_results', array('result' => $result));
+ *
+ *   // Finally, display the pager controls, and return.
+ *   $output .= theme('pager');
+ *   return $output;
+ * @endcode
+ *
+ * A second example involves a page callback that invokes an external search
+ * service where the total number of matching results is provided as part of
+ * the returned set (so that we do not need a separate query in order to obtain
+ * this information). Here, we call pager_find_page() to calculate the desired
+ * offset before the search is invoked:
+ * @code
+ *   // Perform the query, using the requested offset from pager_find_page().
+ *   // This comes from a URL parameter, so here we are assuming that the URL
+ *   // parameter corresponds to an actual page of results that will exist
+ *   // within the set.
+ *   $page = pager_find_page();
+ *   $num_per_page = variable_get('mymodule_num_per_page', 10);
+ *   $offset = $num_per_page * $page;
+ *   $result = mymodule_remote_search($keywords, $offset, $num_per_page);
+ *
+ *   // Now that we have the total number of results, initialize the pager.
+ *   pager_default_initialize($result->total, $num_per_page);
+ *
+ *   // Display the search results.
+ *   $output = theme('search_results', array('results' => $result->data, 'type' => 'remote'));
+ *
+ *   // Finally, display the pager controls, and return.
+ *   $output .= theme('pager');
+ *   return $output;
+ * @endcode
+ *
+ * @param $total
+ *  The total number of items to be paged.
+ * @param $limit
+ *  The number of items the calling code will display per page.
+ * @param $element
+ *  An optional integer to distinguish between multiple pagers on one page.
+ *
+ * @return
+ *   The number of the current page, within the pager represented by $element.
+ *   This is determined from the URL query parameter $_GET['page'], or 0 by
+ *   default. However, if a page that does not correspond to the actual range
+ *   of the result set was requested, this function will return the closest
+ *   page actually within the result set.
+ */
+function pager_default_initialize($total, $limit, $element = 0) {
+  global $pager_page_array, $pager_total, $pager_total_items, $pager_limits;
+
+  $page = pager_find_page($element);
+
+  // We calculate the total of pages as ceil(items / limit).
+  $pager_total_items[$element] = $total;
+  $pager_total[$element] = ceil($pager_total_items[$element] / $limit);
+  $pager_page_array[$element] = max(0, min($page, ((int) $pager_total[$element]) - 1));
+  $pager_limits[$element] = $limit;
+  return $pager_page_array[$element];
+}
+
+/**
+ * Compose a URL query parameter array for pager links.
+ *
+ * @return
+ *   A URL query parameter array that consists of all components of the current
+ *   page request except for those pertaining to paging.
+ */
+function pager_get_query_parameters() {
+  $query = &drupal_static(__FUNCTION__);
+  if (!isset($query)) {
+    $query = drupal_get_query_parameters($_GET, array('q', 'page'));
+  }
+  return $query;
+}
+
+/**
+ * Returns HTML for a query pager.
+ *
+ * Menu callbacks that display paged query results should call theme('pager') to
+ * retrieve a pager control so that users can view other results. Format a list
+ * of nearby pages with additional query results.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - tags: An array of labels for the controls in the pager.
+ *   - element: An optional integer to distinguish between multiple pagers on
+ *     one page.
+ *   - parameters: An associative array of query string parameters to append to
+ *     the pager links.
+ *   - quantity: The number of pages in the list.
+ *
+ * @ingroup themeable
+ */
+function theme_pager($variables) {
+  $tags = $variables['tags'];
+  $element = $variables['element'];
+  $parameters = $variables['parameters'];
+  $quantity = $variables['quantity'];
+  global $pager_page_array, $pager_total;
+
+  // Calculate various markers within this pager piece:
+  // Middle is used to "center" pages around the current page.
+  $pager_middle = ceil($quantity / 2);
+  // current is the page we are currently paged to
+  $pager_current = $pager_page_array[$element] + 1;
+  // first is the first page listed by this pager piece (re quantity)
+  $pager_first = $pager_current - $pager_middle + 1;
+  // last is the last page listed by this pager piece (re quantity)
+  $pager_last = $pager_current + $quantity - $pager_middle;
+  // max is the maximum page number
+  $pager_max = $pager_total[$element];
+  // End of marker calculations.
+
+  // Prepare for generation loop.
+  $i = $pager_first;
+  if ($pager_last > $pager_max) {
+    // Adjust "center" if at end of query.
+    $i = $i + ($pager_max - $pager_last);
+    $pager_last = $pager_max;
+  }
+  if ($i <= 0) {
+    // Adjust "center" if at start of query.
+    $pager_last = $pager_last + (1 - $i);
+    $i = 1;
+  }
+  // End of generation loop preparation.
+
+  $li_first = theme('pager_first', array('text' => (isset($tags[0]) ? $tags[0] : t('« first')), 'element' => $element, 'parameters' => $parameters));
+  $li_previous = theme('pager_previous', array('text' => (isset($tags[1]) ? $tags[1] : t('‹ previous')), 'element' => $element, 'interval' => 1, 'parameters' => $parameters));
+  $li_next = theme('pager_next', array('text' => (isset($tags[3]) ? $tags[3] : t('next ›')), 'element' => $element, 'interval' => 1, 'parameters' => $parameters));
+  $li_last = theme('pager_last', array('text' => (isset($tags[4]) ? $tags[4] : t('last »')), 'element' => $element, 'parameters' => $parameters));
+
+  if ($pager_total[$element] > 1) {
+    if ($li_first) {
+      $items[] = array(
+        'class' => array('pager-first'),
+        'data' => $li_first,
+      );
+    }
+    if ($li_previous) {
+      $items[] = array(
+        'class' => array('pager-previous'),
+        'data' => $li_previous,
+      );
+    }
+
+    // When there is more than one page, create the pager list.
+    if ($i != $pager_max) {
+      if ($i > 1) {
+        $items[] = array(
+          'class' => array('pager-ellipsis'),
+          'data' => '…',
+        );
+      }
+      // Now generate the actual pager piece.
+      for (; $i <= $pager_last && $i <= $pager_max; $i++) {
+        if ($i < $pager_current) {
+          $items[] = array(
+            'class' => array('pager-item'),
+            'data' => theme('pager_previous', array('text' => $i, 'element' => $element, 'interval' => ($pager_current - $i), 'parameters' => $parameters)),
+          );
+        }
+        if ($i == $pager_current) {
+          $items[] = array(
+            'class' => array('pager-current'),
+            'data' => $i,
+          );
+        }
+        if ($i > $pager_current) {
+          $items[] = array(
+            'class' => array('pager-item'),
+            'data' => theme('pager_next', array('text' => $i, 'element' => $element, 'interval' => ($i - $pager_current), 'parameters' => $parameters)),
+          );
+        }
+      }
+      if ($i < $pager_max) {
+        $items[] = array(
+          'class' => array('pager-ellipsis'),
+          'data' => '…',
+        );
+      }
+    }
+    // End generation.
+    if ($li_next) {
+      $items[] = array(
+        'class' => array('pager-next'),
+        'data' => $li_next,
+      );
+    }
+    if ($li_last) {
+      $items[] = array(
+        'class' => array('pager-last'),
+        'data' => $li_last,
+      );
+    }
+    return '<h2 class="element-invisible">' . t('Pages') . '</h2>' . theme('item_list', array(
+      'items' => $items,
+      'attributes' => array('class' => array('pager')),
+    ));
+  }
+}
+
+
+/**
+ * @defgroup pagerpieces Pager pieces
+ * @{
+ * Theme functions for customizing pager elements.
+ *
+ * Note that you should NOT modify this file to customize your pager.
+ */
+
+/**
+ * Returns HTML for the "first page" link in a query pager.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - text: The name (or image) of the link.
+ *   - element: An optional integer to distinguish between multiple pagers on
+ *     one page.
+ *   - parameters: An associative array of query string parameters to append to
+ *     the pager links.
+ *
+ * @ingroup themeable
+ */
+function theme_pager_first($variables) {
+  $text = $variables['text'];
+  $element = $variables['element'];
+  $parameters = $variables['parameters'];
+  global $pager_page_array;
+  $output = '';
+
+  // If we are anywhere but the first page
+  if ($pager_page_array[$element] > 0) {
+    $output = theme('pager_link', array('text' => $text, 'page_new' => pager_load_array(0, $element, $pager_page_array), 'element' => $element, 'parameters' => $parameters));
+  }
+
+  return $output;
+}
+
+/**
+ * Returns HTML for the "previous page" link in a query pager.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - text: The name (or image) of the link.
+ *   - element: An optional integer to distinguish between multiple pagers on
+ *     one page.
+ *   - interval: The number of pages to move backward when the link is clicked.
+ *   - parameters: An associative array of query string parameters to append to
+ *     the pager links.
+ *
+ * @ingroup themeable
+ */
+function theme_pager_previous($variables) {
+  $text = $variables['text'];
+  $element = $variables['element'];
+  $interval = $variables['interval'];
+  $parameters = $variables['parameters'];
+  global $pager_page_array;
+  $output = '';
+
+  // If we are anywhere but the first page
+  if ($pager_page_array[$element] > 0) {
+    $page_new = pager_load_array($pager_page_array[$element] - $interval, $element, $pager_page_array);
+
+    // If the previous page is the first page, mark the link as such.
+    if ($page_new[$element] == 0) {
+      $output = theme('pager_first', array('text' => $text, 'element' => $element, 'parameters' => $parameters));
+    }
+    // The previous page is not the first page.
+    else {
+      $output = theme('pager_link', array('text' => $text, 'page_new' => $page_new, 'element' => $element, 'parameters' => $parameters));
+    }
+  }
+
+  return $output;
+}
+
+/**
+ * Returns HTML for the "next page" link in a query pager.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - text: The name (or image) of the link.
+ *   - element: An optional integer to distinguish between multiple pagers on
+ *     one page.
+ *   - interval: The number of pages to move forward when the link is clicked.
+ *   - parameters: An associative array of query string parameters to append to
+ *     the pager links.
+ *
+ * @ingroup themeable
+ */
+function theme_pager_next($variables) {
+  $text = $variables['text'];
+  $element = $variables['element'];
+  $interval = $variables['interval'];
+  $parameters = $variables['parameters'];
+  global $pager_page_array, $pager_total;
+  $output = '';
+
+  // If we are anywhere but the last page
+  if ($pager_page_array[$element] < ($pager_total[$element] - 1)) {
+    $page_new = pager_load_array($pager_page_array[$element] + $interval, $element, $pager_page_array);
+    // If the next page is the last page, mark the link as such.
+    if ($page_new[$element] == ($pager_total[$element] - 1)) {
+      $output = theme('pager_last', array('text' => $text, 'element' => $element, 'parameters' => $parameters));
+    }
+    // The next page is not the last page.
+    else {
+      $output = theme('pager_link', array('text' => $text, 'page_new' => $page_new, 'element' => $element, 'parameters' => $parameters));
+    }
+  }
+
+  return $output;
+}
+
+/**
+ * Returns HTML for the "last page" link in query pager.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - text: The name (or image) of the link.
+ *   - element: An optional integer to distinguish between multiple pagers on
+ *     one page.
+ *   - parameters: An associative array of query string parameters to append to
+ *     the pager links.
+ *
+ * @ingroup themeable
+ */
+function theme_pager_last($variables) {
+  $text = $variables['text'];
+  $element = $variables['element'];
+  $parameters = $variables['parameters'];
+  global $pager_page_array, $pager_total;
+  $output = '';
+
+  // If we are anywhere but the last page
+  if ($pager_page_array[$element] < ($pager_total[$element] - 1)) {
+    $output = theme('pager_link', array('text' => $text, 'page_new' => pager_load_array($pager_total[$element] - 1, $element, $pager_page_array), 'element' => $element, 'parameters' => $parameters));
+  }
+
+  return $output;
+}
+
+
+/**
+ * Returns HTML for a link to a specific query result page.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - text: The link text. Also used to figure out the title attribute of the
+ *     link, if it is not provided in $variables['attributes']['title']; in
+ *     this case, $variables['text'] must be one of the standard pager link
+ *     text strings that would be generated by the pager theme functions, such
+ *     as a number or t('« first').
+ *   - page_new: The first result to display on the linked page.
+ *   - element: An optional integer to distinguish between multiple pagers on
+ *     one page.
+ *   - parameters: An associative array of query string parameters to append to
+ *     the pager link.
+ *   - attributes: An associative array of HTML attributes to apply to the
+ *     pager link.
+ *
+ * @see theme_pager()
+ *
+ * @ingroup themeable
+ */
+function theme_pager_link($variables) {
+  $text = $variables['text'];
+  $page_new = $variables['page_new'];
+  $element = $variables['element'];
+  $parameters = $variables['parameters'];
+  $attributes = $variables['attributes'];
+
+  $page = isset($_GET['page']) ? $_GET['page'] : '';
+  if ($new_page = implode(',', pager_load_array($page_new[$element], $element, explode(',', $page)))) {
+    $parameters['page'] = $new_page;
+  }
+
+  $query = array();
+  if (count($parameters)) {
+    $query = drupal_get_query_parameters($parameters, array());
+  }
+  if ($query_pager = pager_get_query_parameters()) {
+    $query = array_merge($query, $query_pager);
+  }
+
+  // Set each pager link title
+  if (!isset($attributes['title'])) {
+    static $titles = NULL;
+    if (!isset($titles)) {
+      $titles = array(
+        t('« first') => t('Go to first page'),
+        t('‹ previous') => t('Go to previous page'),
+        t('next ›') => t('Go to next page'),
+        t('last »') => t('Go to last page'),
+      );
+    }
+    if (isset($titles[$text])) {
+      $attributes['title'] = $titles[$text];
+    }
+    elseif (is_numeric($text)) {
+      $attributes['title'] = t('Go to page @number', array('@number' => $text));
+    }
+  }
+
+  // @todo l() cannot be used here, since it adds an 'active' class based on the
+  //   path only (which is always the current path for pager links). Apparently,
+  //   none of the pager links is active at any time - but it should still be
+  //   possible to use l() here.
+  // @see http://drupal.org/node/1410574
+  $attributes['href'] = url($_GET['q'], array('query' => $query));
+  return '<a' . drupal_attributes($attributes) . '>' . check_plain($text) . '</a>';
+}
+
+/**
+ * @} End of "Pager pieces".
+ */
+
+/**
+ * Helper function
+ *
+ * Copies $old_array to $new_array and sets $new_array[$element] = $value
+ * Fills in $new_array[0 .. $element - 1] = 0
+ */
+function pager_load_array($value, $element, $old_array) {
+  $new_array = $old_array;
+  // Look for empty elements.
+  for ($i = 0; $i < $element; $i++) {
+    if (empty($new_array[$i])) {
+      // Load found empty element with 0.
+      $new_array[$i] = 0;
+    }
+  }
+  // Update the changed element.
+  $new_array[$element] = (int) $value;
+  return $new_array;
+}
diff --git a/htmltest/includes/password.inc b/htmltest/includes/password.inc
new file mode 100644
index 00000000..3d5a400d
--- /dev/null
+++ b/htmltest/includes/password.inc
@@ -0,0 +1,287 @@
+<?php
+
+/**
+ * @file
+ * Secure password hashing functions for user authentication.
+ *
+ * Based on the Portable PHP password hashing framework.
+ * @see http://www.openwall.com/phpass/
+ *
+ * An alternative or custom version of this password hashing API may be
+ * used by setting the variable password_inc to the name of the PHP file
+ * containing replacement user_hash_password(), user_check_password(), and
+ * user_needs_new_hash() functions.
+ */
+
+/**
+ * The standard log2 number of iterations for password stretching. This should
+ * increase by 1 every Drupal version in order to counteract increases in the
+ * speed and power of computers available to crack the hashes.
+ */
+define('DRUPAL_HASH_COUNT', 15);
+
+/**
+ * The minimum allowed log2 number of iterations for password stretching.
+ */
+define('DRUPAL_MIN_HASH_COUNT', 7);
+
+/**
+ * The maximum allowed log2 number of iterations for password stretching.
+ */
+define('DRUPAL_MAX_HASH_COUNT', 30);
+
+/**
+ * The expected (and maximum) number of characters in a hashed password.
+ */
+define('DRUPAL_HASH_LENGTH', 55);
+
+/**
+ * Returns a string for mapping an int to the corresponding base 64 character.
+ */
+function _password_itoa64() {
+  return './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+}
+
+/**
+ * Encodes bytes into printable base 64 using the *nix standard from crypt().
+ *
+ * @param $input
+ *   The string containing bytes to encode.
+ * @param $count
+ *   The number of characters (bytes) to encode.
+ *
+ * @return
+ *   Encoded string
+ */
+function _password_base64_encode($input, $count) {
+  $output = '';
+  $i = 0;
+  $itoa64 = _password_itoa64();
+  do {
+    $value = ord($input[$i++]);
+    $output .= $itoa64[$value & 0x3f];
+    if ($i < $count) {
+      $value |= ord($input[$i]) << 8;
+    }
+    $output .= $itoa64[($value >> 6) & 0x3f];
+    if ($i++ >= $count) {
+      break;
+    }
+    if ($i < $count) {
+      $value |= ord($input[$i]) << 16;
+    }
+    $output .= $itoa64[($value >> 12) & 0x3f];
+    if ($i++ >= $count) {
+      break;
+    }
+    $output .= $itoa64[($value >> 18) & 0x3f];
+  } while ($i < $count);
+
+  return $output;
+}
+
+/**
+ * Generates a random base 64-encoded salt prefixed with settings for the hash.
+ *
+ * Proper use of salts may defeat a number of attacks, including:
+ *  - The ability to try candidate passwords against multiple hashes at once.
+ *  - The ability to use pre-hashed lists of candidate passwords.
+ *  - The ability to determine whether two users have the same (or different)
+ *    password without actually having to guess one of the passwords.
+ *
+ * @param $count_log2
+ *   Integer that determines the number of iterations used in the hashing
+ *   process. A larger value is more secure, but takes more time to complete.
+ *
+ * @return
+ *   A 12 character string containing the iteration count and a random salt.
+ */
+function _password_generate_salt($count_log2) {
+  $output = '$S$';
+  // Ensure that $count_log2 is within set bounds.
+  $count_log2 = _password_enforce_log2_boundaries($count_log2);
+  // We encode the final log2 iteration count in base 64.
+  $itoa64 = _password_itoa64();
+  $output .= $itoa64[$count_log2];
+  // 6 bytes is the standard salt for a portable phpass hash.
+  $output .= _password_base64_encode(drupal_random_bytes(6), 6);
+  return $output;
+}
+
+/**
+ * Ensures that $count_log2 is within set bounds.
+ *
+ * @param $count_log2
+ *   Integer that determines the number of iterations used in the hashing
+ *   process. A larger value is more secure, but takes more time to complete.
+ *
+ * @return
+ *   Integer within set bounds that is closest to $count_log2.
+ */
+function _password_enforce_log2_boundaries($count_log2) {
+  if ($count_log2 < DRUPAL_MIN_HASH_COUNT) {
+    return DRUPAL_MIN_HASH_COUNT;
+  }
+  elseif ($count_log2 > DRUPAL_MAX_HASH_COUNT) {
+    return DRUPAL_MAX_HASH_COUNT;
+  }
+
+  return (int) $count_log2;
+}
+
+/**
+ * Hash a password using a secure stretched hash.
+ *
+ * By using a salt and repeated hashing the password is "stretched". Its
+ * security is increased because it becomes much more computationally costly
+ * for an attacker to try to break the hash by brute-force computation of the
+ * hashes of a large number of plain-text words or strings to find a match.
+ *
+ * @param $algo
+ *   The string name of a hashing algorithm usable by hash(), like 'sha256'.
+ * @param $password
+ *   The plain-text password to hash.
+ * @param $setting
+ *   An existing hash or the output of _password_generate_salt().  Must be
+ *   at least 12 characters (the settings and salt).
+ *
+ * @return
+ *   A string containing the hashed password (and salt) or FALSE on failure.
+ *   The return string will be truncated at DRUPAL_HASH_LENGTH characters max.
+ */
+function _password_crypt($algo, $password, $setting) {
+  // The first 12 characters of an existing hash are its setting string.
+  $setting = substr($setting, 0, 12);
+
+  if ($setting[0] != '$' || $setting[2] != '$') {
+    return FALSE;
+  }
+  $count_log2 = _password_get_count_log2($setting);
+  // Hashes may be imported from elsewhere, so we allow != DRUPAL_HASH_COUNT
+  if ($count_log2 < DRUPAL_MIN_HASH_COUNT || $count_log2 > DRUPAL_MAX_HASH_COUNT) {
+    return FALSE;
+  }
+  $salt = substr($setting, 4, 8);
+  // Hashes must have an 8 character salt.
+  if (strlen($salt) != 8) {
+    return FALSE;
+  }
+
+  // Convert the base 2 logarithm into an integer.
+  $count = 1 << $count_log2;
+
+  // We rely on the hash() function being available in PHP 5.2+.
+  $hash = hash($algo, $salt . $password, TRUE);
+  do {
+    $hash = hash($algo, $hash . $password, TRUE);
+  } while (--$count);
+
+  $len = strlen($hash);
+  $output =  $setting . _password_base64_encode($hash, $len);
+  // _password_base64_encode() of a 16 byte MD5 will always be 22 characters.
+  // _password_base64_encode() of a 64 byte sha512 will always be 86 characters.
+  $expected = 12 + ceil((8 * $len) / 6);
+  return (strlen($output) == $expected) ? substr($output, 0, DRUPAL_HASH_LENGTH) : FALSE;
+}
+
+/**
+ * Parse the log2 iteration count from a stored hash or setting string.
+ */
+function _password_get_count_log2($setting) {
+  $itoa64 = _password_itoa64();
+  return strpos($itoa64, $setting[3]);
+}
+
+/**
+ * Hash a password using a secure hash.
+ *
+ * @param $password
+ *   A plain-text password.
+ * @param $count_log2
+ *   Optional integer to specify the iteration count. Generally used only during
+ *   mass operations where a value less than the default is needed for speed.
+ *
+ * @return
+ *   A string containing the hashed password (and a salt), or FALSE on failure.
+ */
+function user_hash_password($password, $count_log2 = 0) {
+  if (empty($count_log2)) {
+    // Use the standard iteration count.
+    $count_log2 = variable_get('password_count_log2', DRUPAL_HASH_COUNT);
+  }
+  return _password_crypt('sha512', $password, _password_generate_salt($count_log2));
+}
+
+/**
+ * Check whether a plain text password matches a stored hashed password.
+ *
+ * Alternative implementations of this function may use other data in the
+ * $account object, for example the uid to look up the hash in a custom table
+ * or remote database.
+ *
+ * @param $password
+ *   A plain-text password
+ * @param $account
+ *   A user object with at least the fields from the {users} table.
+ *
+ * @return
+ *   TRUE or FALSE.
+ */
+function user_check_password($password, $account) {
+  if (substr($account->pass, 0, 2) == 'U$') {
+    // This may be an updated password from user_update_7000(). Such hashes
+    // have 'U' added as the first character and need an extra md5().
+    $stored_hash = substr($account->pass, 1);
+    $password = md5($password);
+  }
+  else {
+    $stored_hash = $account->pass;
+  }
+
+  $type = substr($stored_hash, 0, 3);
+  switch ($type) {
+    case '$S$':
+      // A normal Drupal 7 password using sha512.
+      $hash = _password_crypt('sha512', $password, $stored_hash);
+      break;
+    case '$H$':
+      // phpBB3 uses "$H$" for the same thing as "$P$".
+    case '$P$':
+      // A phpass password generated using md5.  This is an
+      // imported password or from an earlier Drupal version.
+      $hash = _password_crypt('md5', $password, $stored_hash);
+      break;
+    default:
+      return FALSE;
+  }
+  return ($hash && $stored_hash == $hash);
+}
+
+/**
+ * Check whether a user's hashed password needs to be replaced with a new hash.
+ *
+ * This is typically called during the login process when the plain text
+ * password is available. A new hash is needed when the desired iteration count
+ * has changed through a change in the variable password_count_log2 or
+ * DRUPAL_HASH_COUNT or if the user's password hash was generated in an update
+ * like user_update_7000().
+ *
+ * Alternative implementations of this function might use other criteria based
+ * on the fields in $account.
+ *
+ * @param $account
+ *   A user object with at least the fields from the {users} table.
+ *
+ * @return
+ *   TRUE or FALSE.
+ */
+function user_needs_new_hash($account) {
+  // Check whether this was an updated password.
+  if ((substr($account->pass, 0, 3) != '$S$') || (strlen($account->pass) != DRUPAL_HASH_LENGTH)) {
+    return TRUE;
+  }
+  // Ensure that $count_log2 is within set bounds.
+  $count_log2 = _password_enforce_log2_boundaries(variable_get('password_count_log2', DRUPAL_HASH_COUNT));
+  // Check whether the iteration count used differs from the standard number.
+  return (_password_get_count_log2($account->pass) !== $count_log2);
+}
diff --git a/htmltest/includes/path.inc b/htmltest/includes/path.inc
new file mode 100644
index 00000000..234430ea
--- /dev/null
+++ b/htmltest/includes/path.inc
@@ -0,0 +1,587 @@
+<?php
+
+/**
+ * @file
+ * Functions to handle paths in Drupal, including path aliasing.
+ *
+ * These functions are not loaded for cached pages, but modules that need
+ * to use them in hook_boot() or hook exit() can make them available, by
+ * executing "drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);".
+ */
+
+/**
+ * Initialize the $_GET['q'] variable to the proper normal path.
+ */
+function drupal_path_initialize() {
+  // Ensure $_GET['q'] is set before calling drupal_normal_path(), to support
+  // path caching with hook_url_inbound_alter().
+  if (empty($_GET['q'])) {
+    $_GET['q'] = variable_get('site_frontpage', 'node');
+  }
+  $_GET['q'] = drupal_get_normal_path($_GET['q']);
+}
+
+/**
+ * Given an alias, return its Drupal system URL if one exists. Given a Drupal
+ * system URL return one of its aliases if such a one exists. Otherwise,
+ * return FALSE.
+ *
+ * @param $action
+ *   One of the following values:
+ *   - wipe: delete the alias cache.
+ *   - alias: return an alias for a given Drupal system path (if one exists).
+ *   - source: return the Drupal system URL for a path alias (if one exists).
+ * @param $path
+ *   The path to investigate for corresponding aliases or system URLs.
+ * @param $path_language
+ *   Optional language code to search the path with. Defaults to the page language.
+ *   If there's no path defined for that language it will search paths without
+ *   language.
+ *
+ * @return
+ *   Either a Drupal system path, an aliased path, or FALSE if no path was
+ *   found.
+ */
+function drupal_lookup_path($action, $path = '', $path_language = NULL) {
+  global $language_url;
+  // Use the advanced drupal_static() pattern, since this is called very often.
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['cache'] = &drupal_static(__FUNCTION__);
+  }
+  $cache = &$drupal_static_fast['cache'];
+
+  if (!isset($cache)) {
+    $cache = array(
+      'map' => array(),
+      'no_source' => array(),
+      'whitelist' => NULL,
+      'system_paths' => array(),
+      'no_aliases' => array(),
+      'first_call' => TRUE,
+    );
+  }
+
+  // Retrieve the path alias whitelist.
+  if (!isset($cache['whitelist'])) {
+    $cache['whitelist'] = variable_get('path_alias_whitelist', NULL);
+    if (!isset($cache['whitelist'])) {
+      $cache['whitelist'] = drupal_path_alias_whitelist_rebuild();
+    }
+  }
+
+  // If no language is explicitly specified we default to the current URL
+  // language. If we used a language different from the one conveyed by the
+  // requested URL, we might end up being unable to check if there is a path
+  // alias matching the URL path.
+  $path_language = $path_language ? $path_language : $language_url->language;
+
+  if ($action == 'wipe') {
+    $cache = array();
+    $cache['whitelist'] = drupal_path_alias_whitelist_rebuild();
+  }
+  elseif ($cache['whitelist'] && $path != '') {
+    if ($action == 'alias') {
+      // During the first call to drupal_lookup_path() per language, load the
+      // expected system paths for the page from cache.
+      if (!empty($cache['first_call'])) {
+        $cache['first_call'] = FALSE;
+
+        $cache['map'][$path_language] = array();
+        // Load system paths from cache.
+        $cid = current_path();
+        if ($cached = cache_get($cid, 'cache_path')) {
+          $cache['system_paths'] = $cached->data;
+          // Now fetch the aliases corresponding to these system paths.
+          $args = array(
+            ':system' => $cache['system_paths'],
+            ':language' => $path_language,
+            ':language_none' => LANGUAGE_NONE,
+          );
+          // Always get the language-specific alias before the language-neutral
+          // one. For example 'de' is less than 'und' so the order needs to be
+          // ASC, while 'xx-lolspeak' is more than 'und' so the order needs to
+          // be DESC. We also order by pid ASC so that fetchAllKeyed() returns
+          // the most recently created alias for each source. Subsequent queries
+          // using fetchField() must use pid DESC to have the same effect.
+          // For performance reasons, the query builder is not used here.
+          if ($path_language == LANGUAGE_NONE) {
+            // Prevent PDO from complaining about a token the query doesn't use.
+            unset($args[':language']);
+            $result = db_query('SELECT source, alias FROM {url_alias} WHERE source IN (:system) AND language = :language_none ORDER BY pid ASC', $args);
+          }
+          elseif ($path_language < LANGUAGE_NONE) {
+            $result = db_query('SELECT source, alias FROM {url_alias} WHERE source IN (:system) AND language IN (:language, :language_none) ORDER BY language ASC, pid ASC', $args);
+          }
+          else {
+            $result = db_query('SELECT source, alias FROM {url_alias} WHERE source IN (:system) AND language IN (:language, :language_none) ORDER BY language DESC, pid ASC', $args);
+          }
+          $cache['map'][$path_language] = $result->fetchAllKeyed();
+          // Keep a record of paths with no alias to avoid querying twice.
+          $cache['no_aliases'][$path_language] = array_flip(array_diff_key($cache['system_paths'], array_keys($cache['map'][$path_language])));
+        }
+      }
+      // If the alias has already been loaded, return it.
+      if (isset($cache['map'][$path_language][$path])) {
+        return $cache['map'][$path_language][$path];
+      }
+      // Check the path whitelist, if the top_level part before the first /
+      // is not in the list, then there is no need to do anything further,
+      // it is not in the database.
+      elseif (!isset($cache['whitelist'][strtok($path, '/')])) {
+        return FALSE;
+      }
+      // For system paths which were not cached, query aliases individually.
+      elseif (!isset($cache['no_aliases'][$path_language][$path])) {
+        $args = array(
+          ':source' => $path,
+          ':language' => $path_language,
+          ':language_none' => LANGUAGE_NONE,
+        );
+        // See the queries above.
+        if ($path_language == LANGUAGE_NONE) {
+          unset($args[':language']);
+          $alias = db_query("SELECT alias FROM {url_alias} WHERE source = :source AND language = :language_none ORDER BY pid DESC", $args)->fetchField();
+        }
+        elseif ($path_language > LANGUAGE_NONE) {
+          $alias = db_query("SELECT alias FROM {url_alias} WHERE source = :source AND language IN (:language, :language_none) ORDER BY language DESC, pid DESC", $args)->fetchField();
+        }
+        else {
+          $alias = db_query("SELECT alias FROM {url_alias} WHERE source = :source AND language IN (:language, :language_none) ORDER BY language ASC, pid DESC", $args)->fetchField();
+        }
+        $cache['map'][$path_language][$path] = $alias;
+        return $alias;
+      }
+    }
+    // Check $no_source for this $path in case we've already determined that there
+    // isn't a path that has this alias
+    elseif ($action == 'source' && !isset($cache['no_source'][$path_language][$path])) {
+      // Look for the value $path within the cached $map
+      $source = FALSE;
+      if (!isset($cache['map'][$path_language]) || !($source = array_search($path, $cache['map'][$path_language]))) {
+        $args = array(
+          ':alias' => $path,
+          ':language' => $path_language,
+          ':language_none' => LANGUAGE_NONE,
+        );
+        // See the queries above.
+        if ($path_language == LANGUAGE_NONE) {
+          unset($args[':language']);
+          $result = db_query("SELECT source FROM {url_alias} WHERE alias = :alias AND language = :language_none ORDER BY pid DESC", $args);
+        }
+        elseif ($path_language > LANGUAGE_NONE) {
+          $result = db_query("SELECT source FROM {url_alias} WHERE alias = :alias AND language IN (:language, :language_none) ORDER BY language DESC, pid DESC", $args);
+        }
+        else {
+          $result = db_query("SELECT source FROM {url_alias} WHERE alias = :alias AND language IN (:language, :language_none) ORDER BY language ASC, pid DESC", $args);
+        }
+        if ($source = $result->fetchField()) {
+          $cache['map'][$path_language][$source] = $path;
+        }
+        else {
+          // We can't record anything into $map because we do not have a valid
+          // index and there is no need because we have not learned anything
+          // about any Drupal path. Thus cache to $no_source.
+          $cache['no_source'][$path_language][$path] = TRUE;
+        }
+      }
+      return $source;
+    }
+  }
+
+  return FALSE;
+}
+
+/**
+ * Cache system paths for a page.
+ *
+ * Cache an array of the system paths available on each page. We assume
+ * that aliases will be needed for the majority of these paths during
+ * subsequent requests, and load them in a single query during
+ * drupal_lookup_path().
+ */
+function drupal_cache_system_paths() {
+  // Check if the system paths for this page were loaded from cache in this
+  // request to avoid writing to cache on every request.
+  $cache = &drupal_static('drupal_lookup_path', array());
+  if (empty($cache['system_paths']) && !empty($cache['map'])) {
+    // Generate a cache ID (cid) specifically for this page.
+    $cid = current_path();
+    // The static $map array used by drupal_lookup_path() includes all
+    // system paths for the page request.
+    if ($paths = current($cache['map'])) {
+      $data = array_keys($paths);
+      $expire = REQUEST_TIME + (60 * 60 * 24);
+      cache_set($cid, $data, 'cache_path', $expire);
+    }
+  }
+}
+
+/**
+ * Given an internal Drupal path, return the alias set by the administrator.
+ *
+ * If no path is provided, the function will return the alias of the current
+ * page.
+ *
+ * @param $path
+ *   An internal Drupal path.
+ * @param $path_language
+ *   An optional language code to look up the path in.
+ *
+ * @return
+ *   An aliased path if one was found, or the original path if no alias was
+ *   found.
+ */
+function drupal_get_path_alias($path = NULL, $path_language = NULL) {
+  // If no path is specified, use the current page's path.
+  if ($path == NULL) {
+    $path = $_GET['q'];
+  }
+  $result = $path;
+  if ($alias = drupal_lookup_path('alias', $path, $path_language)) {
+    $result = $alias;
+  }
+  return $result;
+}
+
+/**
+ * Given a path alias, return the internal path it represents.
+ *
+ * @param $path
+ *   A Drupal path alias.
+ * @param $path_language
+ *   An optional language code to look up the path in.
+ *
+ * @return
+ *   The internal path represented by the alias, or the original alias if no
+ *   internal path was found.
+ */
+function drupal_get_normal_path($path, $path_language = NULL) {
+  $original_path = $path;
+
+  // Lookup the path alias first.
+  if ($source = drupal_lookup_path('source', $path, $path_language)) {
+    $path = $source;
+  }
+
+  // Allow other modules to alter the inbound URL. We cannot use drupal_alter()
+  // here because we need to run hook_url_inbound_alter() in the reverse order
+  // of hook_url_outbound_alter().
+  foreach (array_reverse(module_implements('url_inbound_alter')) as $module) {
+    $function = $module . '_url_inbound_alter';
+    $function($path, $original_path, $path_language);
+  }
+
+  return $path;
+}
+
+/**
+ * Check if the current page is the front page.
+ *
+ * @return
+ *   Boolean value: TRUE if the current page is the front page; FALSE if otherwise.
+ */
+function drupal_is_front_page() {
+  // Use the advanced drupal_static() pattern, since this is called very often.
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['is_front_page'] = &drupal_static(__FUNCTION__);
+  }
+  $is_front_page = &$drupal_static_fast['is_front_page'];
+
+  if (!isset($is_front_page)) {
+    // As drupal_path_initialize updates $_GET['q'] with the 'site_frontpage' path,
+    // we can check it against the 'site_frontpage' variable.
+    $is_front_page = ($_GET['q'] == variable_get('site_frontpage', 'node'));
+  }
+
+  return $is_front_page;
+}
+
+/**
+ * Check if a path matches any pattern in a set of patterns.
+ *
+ * @param $path
+ *   The path to match.
+ * @param $patterns
+ *   String containing a set of patterns separated by \n, \r or \r\n.
+ *
+ * @return
+ *   Boolean value: TRUE if the path matches a pattern, FALSE otherwise.
+ */
+function drupal_match_path($path, $patterns) {
+  $regexps = &drupal_static(__FUNCTION__);
+
+  if (!isset($regexps[$patterns])) {
+    // Convert path settings to a regular expression.
+    // Therefore replace newlines with a logical or, /* with asterisks and the <front> with the frontpage.
+    $to_replace = array(
+      '/(\r\n?|\n)/', // newlines
+      '/\\\\\*/',     // asterisks
+      '/(^|\|)\\\\<front\\\\>($|\|)/' // <front>
+    );
+    $replacements = array(
+      '|',
+      '.*',
+      '\1' . preg_quote(variable_get('site_frontpage', 'node'), '/') . '\2'
+    );
+    $patterns_quoted = preg_quote($patterns, '/');
+    $regexps[$patterns] = '/^(' . preg_replace($to_replace, $replacements, $patterns_quoted) . ')$/';
+  }
+  return (bool)preg_match($regexps[$patterns], $path);
+}
+
+/**
+ * Return the current URL path of the page being viewed.
+ *
+ * Examples:
+ * - http://example.com/node/306 returns "node/306".
+ * - http://example.com/drupalfolder/node/306 returns "node/306" while
+ *   base_path() returns "/drupalfolder/".
+ * - http://example.com/path/alias (which is a path alias for node/306) returns
+ *   "node/306" as opposed to the path alias.
+ *
+ * This function is not available in hook_boot() so use $_GET['q'] instead.
+ * However, be careful when doing that because in the case of Example #3
+ * $_GET['q'] will contain "path/alias". If "node/306" is needed, calling
+ * drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL) makes this function available.
+ *
+ * @return
+ *   The current Drupal URL path.
+ *
+ * @see request_path()
+ */
+function current_path() {
+  return $_GET['q'];
+}
+
+/**
+ * Rebuild the path alias white list.
+ *
+ * @param $source
+ *   An optional system path for which an alias is being inserted.
+ *
+ * @return
+ *   An array containing a white list of path aliases.
+ */
+function drupal_path_alias_whitelist_rebuild($source = NULL) {
+  // When paths are inserted, only rebuild the whitelist if the system path
+  // has a top level component which is not already in the whitelist.
+  if (!empty($source)) {
+    $whitelist = variable_get('path_alias_whitelist', NULL);
+    if (isset($whitelist[strtok($source, '/')])) {
+      return $whitelist;
+    }
+  }
+  // For each alias in the database, get the top level component of the system
+  // path it corresponds to. This is the portion of the path before the first
+  // '/', if present, otherwise the whole path itself.
+  $whitelist = array();
+  $result = db_query("SELECT DISTINCT SUBSTRING_INDEX(source, '/', 1) AS path FROM {url_alias}");
+  foreach ($result as $row) {
+    $whitelist[$row->path] = TRUE;
+  }
+  variable_set('path_alias_whitelist', $whitelist);
+  return $whitelist;
+}
+
+/**
+ * Fetches a specific URL alias from the database.
+ *
+ * @param $conditions
+ *   A string representing the source, a number representing the pid, or an
+ *   array of query conditions.
+ *
+ * @return
+ *   FALSE if no alias was found or an associative array containing the
+ *   following keys:
+ *   - source: The internal system path.
+ *   - alias: The URL alias.
+ *   - pid: Unique path alias identifier.
+ *   - language: The language of the alias.
+ */
+function path_load($conditions) {
+  if (is_numeric($conditions)) {
+    $conditions = array('pid' => $conditions);
+  }
+  elseif (is_string($conditions)) {
+    $conditions = array('source' => $conditions);
+  }
+  elseif (!is_array($conditions)) {
+    return FALSE;
+  }
+  $select = db_select('url_alias');
+  foreach ($conditions as $field => $value) {
+    $select->condition($field, $value);
+  }
+  return $select
+    ->fields('url_alias')
+    ->execute()
+    ->fetchAssoc();
+}
+
+/**
+ * Save a path alias to the database.
+ *
+ * @param $path
+ *   An associative array containing the following keys:
+ *   - source: The internal system path.
+ *   - alias: The URL alias.
+ *   - pid: (optional) Unique path alias identifier.
+ *   - language: (optional) The language of the alias.
+ */
+function path_save(&$path) {
+  $path += array('language' => LANGUAGE_NONE);
+
+  // Load the stored alias, if any.
+  if (!empty($path['pid']) && !isset($path['original'])) {
+    $path['original'] = path_load($path['pid']);
+  }
+
+  if (empty($path['pid'])) {
+    drupal_write_record('url_alias', $path);
+    module_invoke_all('path_insert', $path);
+  }
+  else {
+    drupal_write_record('url_alias', $path, array('pid'));
+    module_invoke_all('path_update', $path);
+  }
+
+  // Clear internal properties.
+  unset($path['original']);
+
+  // Clear the static alias cache.
+  drupal_clear_path_cache($path['source']);
+}
+
+/**
+ * Delete a URL alias.
+ *
+ * @param $criteria
+ *   A number representing the pid or an array of criteria.
+ */
+function path_delete($criteria) {
+  if (!is_array($criteria)) {
+    $criteria = array('pid' => $criteria);
+  }
+  $path = path_load($criteria);
+  $query = db_delete('url_alias');
+  foreach ($criteria as $field => $value) {
+    $query->condition($field, $value);
+  }
+  $query->execute();
+  module_invoke_all('path_delete', $path);
+  drupal_clear_path_cache($path['source']);
+}
+
+/**
+ * Determines whether a path is in the administrative section of the site.
+ *
+ * By default, paths are considered to be non-administrative. If a path does
+ * not match any of the patterns in path_get_admin_paths(), or if it matches
+ * both administrative and non-administrative patterns, it is considered
+ * non-administrative.
+ *
+ * @param $path
+ *   A Drupal path.
+ *
+ * @return
+ *   TRUE if the path is administrative, FALSE otherwise.
+ *
+ * @see path_get_admin_paths()
+ * @see hook_admin_paths()
+ * @see hook_admin_paths_alter()
+ */
+function path_is_admin($path) {
+  $path_map = &drupal_static(__FUNCTION__);
+  if (!isset($path_map['admin'][$path])) {
+    $patterns = path_get_admin_paths();
+    $path_map['admin'][$path] = drupal_match_path($path, $patterns['admin']);
+    $path_map['non_admin'][$path] = drupal_match_path($path, $patterns['non_admin']);
+  }
+  return $path_map['admin'][$path] && !$path_map['non_admin'][$path];
+}
+
+/**
+ * Gets a list of administrative and non-administrative paths.
+ *
+ * @return array
+ *   An associative array containing the following keys:
+ *   'admin': An array of administrative paths and regular expressions
+ *            in a format suitable for drupal_match_path().
+ *   'non_admin': An array of non-administrative paths and regular expressions.
+ *
+ * @see hook_admin_paths()
+ * @see hook_admin_paths_alter()
+ */
+function path_get_admin_paths() {
+  $patterns = &drupal_static(__FUNCTION__);
+  if (!isset($patterns)) {
+    $paths = module_invoke_all('admin_paths');
+    drupal_alter('admin_paths', $paths);
+    // Combine all admin paths into one array, and likewise for non-admin paths,
+    // for easier handling.
+    $patterns = array();
+    $patterns['admin'] = array();
+    $patterns['non_admin'] = array();
+    foreach ($paths as $path => $enabled) {
+      if ($enabled) {
+        $patterns['admin'][] = $path;
+      }
+      else {
+        $patterns['non_admin'][] = $path;
+      }
+    }
+    $patterns['admin'] = implode("\n", $patterns['admin']);
+    $patterns['non_admin'] = implode("\n", $patterns['non_admin']);
+  }
+  return $patterns;
+}
+
+/**
+ * Checks a path exists and the current user has access to it.
+ *
+ * @param $path
+ *   The path to check.
+ * @param $dynamic_allowed
+ *   Whether paths with menu wildcards (like user/%) should be allowed.
+ *
+ * @return
+ *   TRUE if it is a valid path AND the current user has access permission,
+ *   FALSE otherwise.
+ */
+function drupal_valid_path($path, $dynamic_allowed = FALSE) {
+  global $menu_admin;
+  // We indicate that a menu administrator is running the menu access check.
+  $menu_admin = TRUE;
+  if ($path == '<front>' || url_is_external($path)) {
+    $item = array('access' => TRUE);
+  }
+  elseif ($dynamic_allowed && preg_match('/\/\%/', $path)) {
+    // Path is dynamic (ie 'user/%'), so check directly against menu_router table.
+    if ($item = db_query("SELECT * FROM {menu_router} where path = :path", array(':path' => $path))->fetchAssoc()) {
+      $item['link_path']  = $form_item['link_path'];
+      $item['link_title'] = $form_item['link_title'];
+      $item['external']   = FALSE;
+      $item['options'] = '';
+      _menu_link_translate($item);
+    }
+  }
+  else {
+    $item = menu_get_item($path);
+  }
+  $menu_admin = FALSE;
+  return $item && $item['access'];
+}
+
+/**
+ * Clear the path cache.
+ *
+ * @param $source
+ *   An optional system path for which an alias is being changed.
+ */
+function drupal_clear_path_cache($source = NULL) {
+  // Clear the drupal_lookup_path() static cache.
+  drupal_static_reset('drupal_lookup_path');
+  drupal_path_alias_whitelist_rebuild($source);
+}
diff --git a/htmltest/includes/registry.inc b/htmltest/includes/registry.inc
new file mode 100644
index 00000000..f6c81eb1
--- /dev/null
+++ b/htmltest/includes/registry.inc
@@ -0,0 +1,189 @@
+<?php
+
+/**
+ * @file
+ * This file contains the code registry parser engine.
+ */
+
+/**
+ * @defgroup registry Code registry
+ * @{
+ * The code registry engine.
+ *
+ * Drupal maintains an internal registry of all functions or classes in the
+ * system, allowing it to lazy-load code files as needed (reducing the amount
+ * of code that must be parsed on each request).
+ */
+
+/**
+ * Does the work for registry_update().
+ */
+function _registry_update() {
+
+  // The registry serves as a central autoloader for all classes, including
+  // the database query builders. However, the registry rebuild process
+  // requires write ability to the database, which means having access to the
+  // query builders that require the registry in order to be loaded. That
+  // causes a fatal race condition. Therefore we manually include the
+  // appropriate query builders for the currently active database before the
+  // registry rebuild process runs.
+  $connection_info = Database::getConnectionInfo();
+  $driver = $connection_info['default']['driver'];
+  require_once DRUPAL_ROOT . '/includes/database/query.inc';
+  require_once DRUPAL_ROOT . '/includes/database/select.inc';
+  require_once DRUPAL_ROOT . '/includes/database/' . $driver . '/query.inc';
+
+  // Get current list of modules and their files.
+  $modules = db_query("SELECT * FROM {system} WHERE type = 'module'")->fetchAll();
+  // Get the list of files we are going to parse.
+  $files = array();
+  foreach ($modules as &$module) {
+    $module->info = unserialize($module->info);
+    $dir = dirname($module->filename);
+
+    // Store the module directory for use in hook_registry_files_alter().
+    $module->dir = $dir;
+
+    if ($module->status) {
+      // Add files for enabled modules to the registry.
+      foreach ($module->info['files'] as $file) {
+        $files["$dir/$file"] = array('module' => $module->name, 'weight' => $module->weight);
+      }
+    }
+  }
+  foreach (file_scan_directory('includes', '/\.inc$/') as $filename => $file) {
+    $files["$filename"] = array('module' => '', 'weight' => 0);
+  }
+
+  $transaction = db_transaction();
+  try {
+    // Allow modules to manually modify the list of files before the registry
+    // parses them. The $modules array provides the .info file information, which
+    // includes the list of files registered to each module. Any files in the
+    // list can then be added to the list of files that the registry will parse,
+    // or modify attributes of a file.
+    drupal_alter('registry_files', $files, $modules);
+    foreach (registry_get_parsed_files() as $filename => $file) {
+      // Add the hash for those files we have already parsed.
+      if (isset($files[$filename])) {
+        $files[$filename]['hash'] = $file['hash'];
+      }
+      else {
+        // Flush the registry of resources in files that are no longer on disc
+        // or are in files that no installed modules require to be parsed.
+        db_delete('registry')
+          ->condition('filename', $filename)
+          ->execute();
+        db_delete('registry_file')
+          ->condition('filename', $filename)
+          ->execute();
+      }
+    }
+    $parsed_files = _registry_parse_files($files);
+
+    $unchanged_resources = array();
+    $lookup_cache = array();
+    if ($cache = cache_get('lookup_cache', 'cache_bootstrap')) {
+      $lookup_cache = $cache->data;
+    }
+    foreach ($lookup_cache as $key => $file) {
+      // If the file for this cached resource is carried over unchanged from
+      // the last registry build, then we can safely re-cache it.
+      if ($file && in_array($file, array_keys($files)) && !in_array($file, $parsed_files)) {
+        $unchanged_resources[$key] = $file;
+      }
+    }
+    module_implements('', FALSE, TRUE);
+    _registry_check_code(REGISTRY_RESET_LOOKUP_CACHE);
+  }
+  catch (Exception $e) {
+    $transaction->rollback();
+    watchdog_exception('registry', $e);
+    throw $e;
+  }
+
+  // We have some unchanged resources, warm up the cache - no need to pay
+  // for looking them up again.
+  if (count($unchanged_resources) > 0) {
+    cache_set('lookup_cache', $unchanged_resources, 'cache_bootstrap');
+  }
+}
+
+/**
+ * Return the list of files in registry_file
+ */
+function registry_get_parsed_files() {
+  $files = array();
+  // We want the result as a keyed array.
+  $files = db_query("SELECT * FROM {registry_file}")->fetchAllAssoc('filename', PDO::FETCH_ASSOC);
+  return $files;
+}
+
+/**
+ * Parse all files that have changed since the registry was last built, and save their function and class listings.
+ *
+ * @param $files
+ *  The list of files to check and parse.
+ */
+function _registry_parse_files($files) {
+  $parsed_files = array();
+  foreach ($files as $filename => $file) {
+    if (file_exists($filename)) {
+      $hash = hash_file('sha256', $filename);
+      if (empty($file['hash']) || $file['hash'] != $hash) {
+        $file['hash'] = $hash;
+        $parsed_files[$filename] = $file;
+      }
+    }
+  }
+  foreach ($parsed_files as $filename => $file) {
+    _registry_parse_file($filename, file_get_contents($filename), $file['module'], $file['weight']);
+    db_merge('registry_file')
+      ->key(array('filename' => $filename))
+      ->fields(array(
+        'hash' => $file['hash'],
+      ))
+      ->execute();
+  }
+  return array_keys($parsed_files);
+}
+
+/**
+ * Parse a file and save its function and class listings.
+ *
+ * @param $filename
+ *   Name of the file we are going to parse.
+ * @param $contents
+ *   Contents of the file we are going to parse as a string.
+ * @param $module
+ *   (optional) Name of the module this file belongs to.
+ * @param $weight
+ *   (optional) Weight of the module.
+ */
+function _registry_parse_file($filename, $contents, $module = '', $weight = 0) {
+  if (preg_match_all('/^\s*(?:abstract|final)?\s*(class|interface)\s+([a-zA-Z0-9_]+)/m', $contents, $matches)) {
+    foreach ($matches[2] as $key => $name) {
+      db_merge('registry')
+        ->key(array(
+          'name' => $name,
+          'type' => $matches[1][$key],
+        ))
+        ->fields(array(
+          'filename' => $filename,
+          'module' => $module,
+          'weight' => $weight,
+        ))
+        ->execute();
+    }
+    // Delete any resources for this file where the name is not in the list
+    // we just merged in.
+    db_delete('registry')
+      ->condition('filename', $filename)
+      ->condition('name', $matches[2], 'NOT IN')
+      ->execute();
+  }
+}
+
+/**
+ * @} End of "defgroup registry".
+ */
diff --git a/htmltest/includes/session.inc b/htmltest/includes/session.inc
new file mode 100644
index 00000000..9589e06f
--- /dev/null
+++ b/htmltest/includes/session.inc
@@ -0,0 +1,533 @@
+<?php
+
+/**
+ * @file
+ * User session handling functions.
+ *
+ * The user-level session storage handlers:
+ * - _drupal_session_open()
+ * - _drupal_session_close()
+ * - _drupal_session_read()
+ * - _drupal_session_write()
+ * - _drupal_session_destroy()
+ * - _drupal_session_garbage_collection()
+ * are assigned by session_set_save_handler() in bootstrap.inc and are called
+ * automatically by PHP. These functions should not be called directly. Session
+ * data should instead be accessed via the $_SESSION superglobal.
+ */
+
+/**
+ * Session handler assigned by session_set_save_handler().
+ *
+ * This function is used to handle any initialization, such as file paths or
+ * database connections, that is needed before accessing session data. Drupal
+ * does not need to initialize anything in this function.
+ *
+ * This function should not be called directly.
+ *
+ * @return
+ *   This function will always return TRUE.
+ */
+function _drupal_session_open() {
+  return TRUE;
+}
+
+/**
+ * Session handler assigned by session_set_save_handler().
+ *
+ * This function is used to close the current session. Because Drupal stores
+ * session data in the database immediately on write, this function does
+ * not need to do anything.
+ *
+ * This function should not be called directly.
+ *
+ * @return
+ *   This function will always return TRUE.
+ */
+function _drupal_session_close() {
+  return TRUE;
+}
+
+/**
+ * Reads an entire session from the database (internal use only).
+ *
+ * Also initializes the $user object for the user associated with the session.
+ * This function is registered with session_set_save_handler() to support
+ * database-backed sessions. It is called on every page load when PHP sets
+ * up the $_SESSION superglobal.
+ *
+ * This function is an internal function and must not be called directly.
+ * Doing so may result in logging out the current user, corrupting session data
+ * or other unexpected behavior. Session data must always be accessed via the
+ * $_SESSION superglobal.
+ *
+ * @param $sid
+ *   The session ID of the session to retrieve.
+ *
+ * @return
+ *   The user's session, or an empty string if no session exists.
+ */
+function _drupal_session_read($sid) {
+  global $user, $is_https;
+
+  // Write and Close handlers are called after destructing objects
+  // since PHP 5.0.5.
+  // Thus destructors can use sessions but session handler can't use objects.
+  // So we are moving session closure before destructing objects.
+  drupal_register_shutdown_function('session_write_close');
+
+  // Handle the case of first time visitors and clients that don't store
+  // cookies (eg. web crawlers).
+  $insecure_session_name = substr(session_name(), 1);
+  if (!isset($_COOKIE[session_name()]) && !isset($_COOKIE[$insecure_session_name])) {
+    $user = drupal_anonymous_user();
+    return '';
+  }
+
+  // Otherwise, if the session is still active, we have a record of the
+  // client's session in the database. If it's HTTPS then we are either have
+  // a HTTPS session or we are about to log in so we check the sessions table
+  // for an anonymous session with the non-HTTPS-only cookie.
+  if ($is_https) {
+    $user = db_query("SELECT u.*, s.* FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.ssid = :ssid", array(':ssid' => $sid))->fetchObject();
+    if (!$user) {
+      if (isset($_COOKIE[$insecure_session_name])) {
+        $user = db_query("SELECT u.*, s.* FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.sid = :sid AND s.uid = 0", array(
+        ':sid' => $_COOKIE[$insecure_session_name]))
+        ->fetchObject();
+      }
+    }
+  }
+  else {
+    $user = db_query("SELECT u.*, s.* FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.sid = :sid", array(':sid' => $sid))->fetchObject();
+  }
+
+  // We found the client's session record and they are an authenticated,
+  // active user.
+  if ($user && $user->uid > 0 && $user->status == 1) {
+    // This is done to unserialize the data member of $user.
+    $user->data = unserialize($user->data);
+
+    // Add roles element to $user.
+    $user->roles = array();
+    $user->roles[DRUPAL_AUTHENTICATED_RID] = 'authenticated user';
+    $user->roles += db_query("SELECT r.rid, r.name FROM {role} r INNER JOIN {users_roles} ur ON ur.rid = r.rid WHERE ur.uid = :uid", array(':uid' => $user->uid))->fetchAllKeyed(0, 1);
+  }
+  elseif ($user) {
+    // The user is anonymous or blocked. Only preserve two fields from the
+    // {sessions} table.
+    $account = drupal_anonymous_user();
+    $account->session = $user->session;
+    $account->timestamp = $user->timestamp;
+    $user = $account;
+  }
+  else {
+    // The session has expired.
+    $user = drupal_anonymous_user();
+    $user->session = '';
+  }
+
+  // Store the session that was read for comparison in _drupal_session_write().
+  $last_read = &drupal_static('drupal_session_last_read');
+  $last_read = array(
+    'sid' => $sid,
+    'value' => $user->session,
+  );
+
+  return $user->session;
+}
+
+/**
+ * Writes an entire session to the database (internal use only).
+ *
+ * This function is registered with session_set_save_handler() to support
+ * database-backed sessions.
+ *
+ * This function is an internal function and must not be called directly.
+ * Doing so may result in corrupted session data or other unexpected behavior.
+ * Session data must always be accessed via the $_SESSION superglobal.
+ *
+ * @param $sid
+ *   The session ID of the session to write to.
+ * @param $value
+ *   Session data to write as a serialized string.
+ *
+ * @return
+ *   Always returns TRUE.
+ */
+function _drupal_session_write($sid, $value) {
+  global $user, $is_https;
+
+  // The exception handler is not active at this point, so we need to do it
+  // manually.
+  try {
+    if (!drupal_save_session()) {
+      // We don't have anything to do if we are not allowed to save the session.
+      return;
+    }
+
+    // Check whether $_SESSION has been changed in this request.
+    $last_read = &drupal_static('drupal_session_last_read');
+    $is_changed = !isset($last_read) || $last_read['sid'] != $sid || $last_read['value'] !== $value;
+
+    // For performance reasons, do not update the sessions table, unless
+    // $_SESSION has changed or more than 180 has passed since the last update.
+    if ($is_changed || !isset($user->timestamp) || REQUEST_TIME - $user->timestamp > variable_get('session_write_interval', 180)) {
+      // Either ssid or sid or both will be added from $key below.
+      $fields = array(
+        'uid' => $user->uid,
+        'cache' => isset($user->cache) ? $user->cache : 0,
+        'hostname' => ip_address(),
+        'session' => $value,
+        'timestamp' => REQUEST_TIME,
+      );
+
+      // Use the session ID as 'sid' and an empty string as 'ssid' by default.
+      // _drupal_session_read() does not allow empty strings so that's a safe
+      // default.
+      $key = array('sid' => $sid, 'ssid' => '');
+      // On HTTPS connections, use the session ID as both 'sid' and 'ssid'.
+      if ($is_https) {
+        $key['ssid'] = $sid;
+        // The "secure pages" setting allows a site to simultaneously use both
+        // secure and insecure session cookies. If enabled and both cookies are
+        // presented then use both keys.
+        if (variable_get('https', FALSE)) {
+          $insecure_session_name = substr(session_name(), 1);
+          if (isset($_COOKIE[$insecure_session_name])) {
+            $key['sid'] = $_COOKIE[$insecure_session_name];
+          }
+        }
+      }
+      elseif (variable_get('https', FALSE)) {
+        unset($key['ssid']);
+      }
+
+      db_merge('sessions')
+        ->key($key)
+        ->fields($fields)
+        ->execute();
+    }
+
+    // Likewise, do not update access time more than once per 180 seconds.
+    if ($user->uid && REQUEST_TIME - $user->access > variable_get('session_write_interval', 180)) {
+      db_update('users')
+        ->fields(array(
+          'access' => REQUEST_TIME
+        ))
+        ->condition('uid', $user->uid)
+        ->execute();
+    }
+
+    return TRUE;
+  }
+  catch (Exception $exception) {
+    require_once DRUPAL_ROOT . '/includes/errors.inc';
+    // If we are displaying errors, then do so with no possibility of a further
+    // uncaught exception being thrown.
+    if (error_displayable()) {
+      print '<h1>Uncaught exception thrown in session handler.</h1>';
+      print '<p>' . _drupal_render_exception_safe($exception) . '</p><hr />';
+    }
+    return FALSE;
+  }
+}
+
+/**
+ * Initializes the session handler, starting a session if needed.
+ */
+function drupal_session_initialize() {
+  global $user, $is_https;
+
+  session_set_save_handler('_drupal_session_open', '_drupal_session_close', '_drupal_session_read', '_drupal_session_write', '_drupal_session_destroy', '_drupal_session_garbage_collection');
+
+  // We use !empty() in the following check to ensure that blank session IDs
+  // are not valid.
+  if (!empty($_COOKIE[session_name()]) || ($is_https && variable_get('https', FALSE) && !empty($_COOKIE[substr(session_name(), 1)]))) {
+    // If a session cookie exists, initialize the session. Otherwise the
+    // session is only started on demand in drupal_session_commit(), making
+    // anonymous users not use a session cookie unless something is stored in
+    // $_SESSION. This allows HTTP proxies to cache anonymous pageviews.
+    drupal_session_start();
+    if (!empty($user->uid) || !empty($_SESSION)) {
+      drupal_page_is_cacheable(FALSE);
+    }
+  }
+  else {
+    // Set a session identifier for this request. This is necessary because
+    // we lazily start sessions at the end of this request, and some
+    // processes (like drupal_get_token()) needs to know the future
+    // session ID in advance.
+    $GLOBALS['lazy_session'] = TRUE;
+    $user = drupal_anonymous_user();
+    // Less random sessions (which are much faster to generate) are used for
+    // anonymous users than are generated in drupal_session_regenerate() when
+    // a user becomes authenticated.
+    session_id(drupal_random_key());
+    if ($is_https && variable_get('https', FALSE)) {
+      $insecure_session_name = substr(session_name(), 1);
+      $session_id = drupal_random_key();
+      $_COOKIE[$insecure_session_name] = $session_id;
+    }
+  }
+  date_default_timezone_set(drupal_get_user_timezone());
+}
+
+/**
+ * Starts a session forcefully, preserving already set session data.
+ *
+ * @ingroup php_wrappers
+ */
+function drupal_session_start() {
+  // Command line clients do not support cookies nor sessions.
+  if (!drupal_session_started() && !drupal_is_cli()) {
+    // Save current session data before starting it, as PHP will destroy it.
+    $session_data = isset($_SESSION) ? $_SESSION : NULL;
+
+    session_start();
+    drupal_session_started(TRUE);
+
+    // Restore session data.
+    if (!empty($session_data)) {
+      $_SESSION += $session_data;
+    }
+  }
+}
+
+/**
+ * Commits the current session, if necessary.
+ *
+ * If an anonymous user already have an empty session, destroy it.
+ */
+function drupal_session_commit() {
+  global $user, $is_https;
+
+  if (!drupal_save_session()) {
+    // We don't have anything to do if we are not allowed to save the session.
+    return;
+  }
+
+  if (empty($user->uid) && empty($_SESSION)) {
+    // There is no session data to store, destroy the session if it was
+    // previously started.
+    if (drupal_session_started()) {
+      session_destroy();
+    }
+  }
+  else {
+    // There is session data to store. Start the session if it is not already
+    // started.
+    if (!drupal_session_started()) {
+      drupal_session_start();
+      if ($is_https && variable_get('https', FALSE)) {
+        $insecure_session_name = substr(session_name(), 1);
+        $params = session_get_cookie_params();
+        $expire = $params['lifetime'] ? REQUEST_TIME + $params['lifetime'] : 0;
+        setcookie($insecure_session_name, $_COOKIE[$insecure_session_name], $expire, $params['path'], $params['domain'], FALSE, $params['httponly']);
+      }
+    }
+    // Write the session data.
+    session_write_close();
+  }
+}
+
+/**
+ * Returns whether a session has been started.
+ */
+function drupal_session_started($set = NULL) {
+  static $session_started = FALSE;
+  if (isset($set)) {
+    $session_started = $set;
+  }
+  return $session_started && session_id();
+}
+
+/**
+ * Called when an anonymous user becomes authenticated or vice-versa.
+ *
+ * @ingroup php_wrappers
+ */
+function drupal_session_regenerate() {
+  global $user, $is_https;
+  // Nothing to do if we are not allowed to change the session.
+  if (!drupal_save_session()) {
+    return;
+  }
+
+  if ($is_https && variable_get('https', FALSE)) {
+    $insecure_session_name = substr(session_name(), 1);
+    if (!isset($GLOBALS['lazy_session']) && isset($_COOKIE[$insecure_session_name])) {
+      $old_insecure_session_id = $_COOKIE[$insecure_session_name];
+    }
+    $params = session_get_cookie_params();
+    $session_id = drupal_random_key();
+    // If a session cookie lifetime is set, the session will expire
+    // $params['lifetime'] seconds from the current request. If it is not set,
+    // it will expire when the browser is closed.
+    $expire = $params['lifetime'] ? REQUEST_TIME + $params['lifetime'] : 0;
+    setcookie($insecure_session_name, $session_id, $expire, $params['path'], $params['domain'], FALSE, $params['httponly']);
+    $_COOKIE[$insecure_session_name] = $session_id;
+  }
+
+  if (drupal_session_started()) {
+    $old_session_id = session_id();
+  }
+  session_id(drupal_random_key());
+
+  if (isset($old_session_id)) {
+    $params = session_get_cookie_params();
+    $expire = $params['lifetime'] ? REQUEST_TIME + $params['lifetime'] : 0;
+    setcookie(session_name(), session_id(), $expire, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
+    $fields = array('sid' => session_id());
+    if ($is_https) {
+      $fields['ssid'] = session_id();
+      // If the "secure pages" setting is enabled, use the newly-created
+      // insecure session identifier as the regenerated sid.
+      if (variable_get('https', FALSE)) {
+        $fields['sid'] = $session_id;
+      }
+    }
+    db_update('sessions')
+      ->fields($fields)
+      ->condition($is_https ? 'ssid' : 'sid', $old_session_id)
+      ->execute();
+  }
+  elseif (isset($old_insecure_session_id)) {
+    // If logging in to the secure site, and there was no active session on the
+    // secure site but a session was active on the insecure site, update the
+    // insecure session with the new session identifiers.
+    db_update('sessions')
+      ->fields(array('sid' => $session_id, 'ssid' => session_id()))
+      ->condition('sid', $old_insecure_session_id)
+      ->execute();
+  }
+  else {
+    // Start the session when it doesn't exist yet.
+    // Preserve the logged in user, as it will be reset to anonymous
+    // by _drupal_session_read.
+    $account = $user;
+    drupal_session_start();
+    $user = $account;
+  }
+  date_default_timezone_set(drupal_get_user_timezone());
+}
+
+/**
+ * Session handler assigned by session_set_save_handler().
+ *
+ * Cleans up a specific session.
+ *
+ * @param $sid
+ *   Session ID.
+ */
+function _drupal_session_destroy($sid) {
+  global $user, $is_https;
+
+  // Nothing to do if we are not allowed to change the session.
+  if (!drupal_save_session()) {
+    return;
+  }
+
+  // Delete session data.
+  db_delete('sessions')
+    ->condition($is_https ? 'ssid' : 'sid', $sid)
+    ->execute();
+
+  // Reset $_SESSION and $user to prevent a new session from being started
+  // in drupal_session_commit().
+  $_SESSION = array();
+  $user = drupal_anonymous_user();
+
+  // Unset the session cookies.
+  _drupal_session_delete_cookie(session_name());
+  if ($is_https) {
+    _drupal_session_delete_cookie(substr(session_name(), 1), FALSE);
+  }
+  elseif (variable_get('https', FALSE)) {
+    _drupal_session_delete_cookie('S' . session_name(), TRUE);
+  }
+}
+
+/**
+ * Deletes the session cookie.
+ *
+ * @param $name
+ *   Name of session cookie to delete.
+ * @param boolean $secure
+ *   Force the secure value of the cookie.
+ */
+function _drupal_session_delete_cookie($name, $secure = NULL) {
+  global $is_https;
+  if (isset($_COOKIE[$name]) || (!$is_https && $secure === TRUE)) {
+    $params = session_get_cookie_params();
+    if ($secure !== NULL) {
+      $params['secure'] = $secure;
+    }
+    setcookie($name, '', REQUEST_TIME - 3600, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
+    unset($_COOKIE[$name]);
+  }
+}
+
+/**
+ * Ends a specific user's session(s).
+ *
+ * @param $uid
+ *   User ID.
+ */
+function drupal_session_destroy_uid($uid) {
+  // Nothing to do if we are not allowed to change the session.
+  if (!drupal_save_session()) {
+    return;
+  }
+
+  db_delete('sessions')
+    ->condition('uid', $uid)
+    ->execute();
+}
+
+/**
+ * Session handler assigned by session_set_save_handler().
+ *
+ * Cleans up stalled sessions.
+ *
+ * @param $lifetime
+ *   The value of session.gc_maxlifetime, passed by PHP.
+ *   Sessions not updated for more than $lifetime seconds will be removed.
+ */
+function _drupal_session_garbage_collection($lifetime) {
+  // Be sure to adjust 'php_value session.gc_maxlifetime' to a large enough
+  // value. For example, if you want user sessions to stay in your database
+  // for three weeks before deleting them, you need to set gc_maxlifetime
+  // to '1814400'. At that value, only after a user doesn't log in after
+  // three weeks (1814400 seconds) will his/her session be removed.
+  db_delete('sessions')
+    ->condition('timestamp', REQUEST_TIME - $lifetime, '<')
+    ->execute();
+  return TRUE;
+}
+
+/**
+ * Determines whether to save session data of the current request.
+ *
+ * This function allows the caller to temporarily disable writing of
+ * session data, should the request end while performing potentially
+ * dangerous operations, such as manipulating the global $user object.
+ * See http://drupal.org/node/218104 for usage.
+ *
+ * @param $status
+ *   Disables writing of session data when FALSE, (re-)enables
+ *   writing when TRUE.
+ *
+ * @return
+ *   FALSE if writing session data has been disabled. Otherwise, TRUE.
+ */
+function drupal_save_session($status = NULL) {
+  // PHP session ID, session, and cookie handling happens in the global scope.
+  // This value has to persist across calls to drupal_static_reset(), since a
+  // potentially wrong or disallowed session would be written otherwise.
+  static $save_session = TRUE;
+  if (isset($status)) {
+    $save_session = $status;
+  }
+  return $save_session;
+}
diff --git a/htmltest/includes/stream_wrappers.inc b/htmltest/includes/stream_wrappers.inc
new file mode 100644
index 00000000..48829388
--- /dev/null
+++ b/htmltest/includes/stream_wrappers.inc
@@ -0,0 +1,834 @@
+<?php
+
+/**
+ * @file
+ * Drupal stream wrapper interface.
+ *
+ * Provides a Drupal interface and classes to implement PHP stream wrappers for
+ * public, private, and temporary files.
+ *
+ * A stream wrapper is an abstraction of a file system that allows Drupal to
+ * use the same set of methods to access both local files and remote resources.
+ *
+ * Note that PHP 5.2 fopen() only supports URIs of the form "scheme://target"
+ * despite the fact that according to RFC 3986 a URI's scheme component
+ * delimiter is in general just ":", not "://".  Because of this PHP limitation
+ * and for consistency Drupal will only accept URIs of form "scheme://target".
+ *
+ * @see http://www.faqs.org/rfcs/rfc3986.html
+ * @see http://bugs.php.net/bug.php?id=47070
+ */
+
+/**
+ * Stream wrapper bit flags that are the basis for composite types.
+ *
+ * Note that 0x0002 is skipped, because it was the value of a constant that has
+ * since been removed.
+ */
+
+/**
+ * Stream wrapper bit flag -- a filter that matches all wrappers.
+ */
+define('STREAM_WRAPPERS_ALL', 0x0000);
+
+/**
+ * Stream wrapper bit flag -- refers to a local file system location.
+ */
+define('STREAM_WRAPPERS_LOCAL', 0x0001);
+
+/**
+ * Stream wrapper bit flag -- wrapper is readable (almost always true).
+ */
+define('STREAM_WRAPPERS_READ', 0x0004);
+
+/**
+ * Stream wrapper bit flag -- wrapper is writeable.
+ */
+define('STREAM_WRAPPERS_WRITE', 0x0008);
+
+/**
+ * Stream wrapper bit flag -- exposed in the UI and potentially web accessible.
+ */
+define('STREAM_WRAPPERS_VISIBLE', 0x0010);
+
+/**
+ * Composite stream wrapper bit flags that are usually used as the types.
+ */
+
+/**
+ * Stream wrapper type flag -- not visible in the UI or accessible via web,
+ * but readable and writable. E.g. the temporary directory for uploads.
+ */
+define('STREAM_WRAPPERS_HIDDEN', STREAM_WRAPPERS_READ | STREAM_WRAPPERS_WRITE);
+
+/**
+ * Stream wrapper type flag -- hidden, readable and writeable using local files.
+ */
+define('STREAM_WRAPPERS_LOCAL_HIDDEN', STREAM_WRAPPERS_LOCAL | STREAM_WRAPPERS_HIDDEN);
+
+/**
+ * Stream wrapper type flag -- visible, readable and writeable.
+ */
+define('STREAM_WRAPPERS_WRITE_VISIBLE', STREAM_WRAPPERS_READ | STREAM_WRAPPERS_WRITE | STREAM_WRAPPERS_VISIBLE);
+
+/**
+ * Stream wrapper type flag -- visible and read-only.
+ */
+define('STREAM_WRAPPERS_READ_VISIBLE', STREAM_WRAPPERS_READ | STREAM_WRAPPERS_VISIBLE);
+
+/**
+ * Stream wrapper type flag -- the default when 'type' is omitted from
+ * hook_stream_wrappers(). This does not include STREAM_WRAPPERS_LOCAL,
+ * because PHP grants a greater trust level to local files (for example, they
+ * can be used in an "include" statement, regardless of the "allow_url_include"
+ * setting), so stream wrappers need to explicitly opt-in to this.
+ */
+define('STREAM_WRAPPERS_NORMAL', STREAM_WRAPPERS_WRITE_VISIBLE);
+
+/**
+ * Stream wrapper type flag -- visible, readable and writeable using local files.
+ */
+define('STREAM_WRAPPERS_LOCAL_NORMAL', STREAM_WRAPPERS_LOCAL | STREAM_WRAPPERS_NORMAL);
+
+/**
+ * Generic PHP stream wrapper interface.
+ *
+ * @see http://www.php.net/manual/class.streamwrapper.php
+ */
+interface StreamWrapperInterface {
+  public function stream_open($uri, $mode, $options, &$opened_url);
+  public function stream_close();
+  public function stream_lock($operation);
+  public function stream_read($count);
+  public function stream_write($data);
+  public function stream_eof();
+  public function stream_seek($offset, $whence);
+  public function stream_flush();
+  public function stream_tell();
+  public function stream_stat();
+  public function unlink($uri);
+  public function rename($from_uri, $to_uri);
+  public function mkdir($uri, $mode, $options);
+  public function rmdir($uri, $options);
+  public function url_stat($uri, $flags);
+  public function dir_opendir($uri, $options);
+  public function dir_readdir();
+  public function dir_rewinddir();
+  public function dir_closedir();
+}
+
+/**
+ * Drupal stream wrapper extension.
+ *
+ * Extend the StreamWrapperInterface with methods expected by Drupal stream
+ * wrapper classes.
+ */
+interface DrupalStreamWrapperInterface extends StreamWrapperInterface {
+  /**
+   * Set the absolute stream resource URI.
+   *
+   * This allows you to set the URI. Generally is only called by the factory
+   * method.
+   *
+   * @param $uri
+   *   A string containing the URI that should be used for this instance.
+   */
+  function setUri($uri);
+
+  /**
+   * Returns the stream resource URI.
+   *
+   * @return
+   *   Returns the current URI of the instance.
+   */
+  public function getUri();
+
+  /**
+   * Returns a web accessible URL for the resource.
+   *
+   * This function should return a URL that can be embedded in a web page
+   * and accessed from a browser. For example, the external URL of
+   * "youtube://xIpLd0WQKCY" might be
+   * "http://www.youtube.com/watch?v=xIpLd0WQKCY".
+   *
+   * @return
+   *   Returns a string containing a web accessible URL for the resource.
+   */
+  public function getExternalUrl();
+
+  /**
+   * Returns the MIME type of the resource.
+   *
+   * @param $uri
+   *   The URI, path, or filename.
+   * @param $mapping
+   *   An optional map of extensions to their mimetypes, in the form:
+   *    - 'mimetypes': a list of mimetypes, keyed by an identifier,
+   *    - 'extensions': the mapping itself, an associative array in which
+   *      the key is the extension and the value is the mimetype identifier.
+   *
+   * @return
+   *   Returns a string containing the MIME type of the resource.
+   */
+  public static function getMimeType($uri, $mapping = NULL);
+
+  /**
+   * Changes permissions of the resource.
+   *
+   * PHP lacks this functionality and it is not part of the official stream
+   * wrapper interface. This is a custom implementation for Drupal.
+   *
+   * @param $mode
+   *   Integer value for the permissions. Consult PHP chmod() documentation
+   *   for more information.
+   *
+   * @return
+   *   Returns TRUE on success or FALSE on failure.
+   */
+  public function chmod($mode);
+
+  /**
+   * Returns canonical, absolute path of the resource.
+   *
+   * Implementation placeholder. PHP's realpath() does not support stream
+   * wrappers. We provide this as a default so that individual wrappers may
+   * implement their own solutions.
+   *
+   * @return
+   *   Returns a string with absolute pathname on success (implemented
+   *   by core wrappers), or FALSE on failure or if the registered
+   *   wrapper does not provide an implementation.
+   */
+  public function realpath();
+
+  /**
+   * Gets the name of the directory from a given path.
+   *
+   * This method is usually accessed through drupal_dirname(), which wraps
+   * around the normal PHP dirname() function, which does not support stream
+   * wrappers.
+   *
+   * @param $uri
+   *   An optional URI.
+   *
+   * @return
+   *   A string containing the directory name, or FALSE if not applicable.
+   *
+   * @see drupal_dirname()
+   */
+  public function dirname($uri = NULL);
+}
+
+
+/**
+ * Drupal stream wrapper base class for local files.
+ *
+ * This class provides a complete stream wrapper implementation. URIs such as
+ * "public://example.txt" are expanded to a normal filesystem path such as
+ * "sites/default/files/example.txt" and then PHP filesystem functions are
+ * invoked.
+ *
+ * DrupalLocalStreamWrapper implementations need to implement at least the
+ * getDirectoryPath() and getExternalUrl() methods.
+ */
+abstract class DrupalLocalStreamWrapper implements DrupalStreamWrapperInterface {
+  /**
+   * Stream context resource.
+   *
+   * @var Resource
+   */
+  public $context;
+
+  /**
+   * A generic resource handle.
+   *
+   * @var Resource
+   */
+  public $handle = NULL;
+
+  /**
+   * Instance URI (stream).
+   *
+   * A stream is referenced as "scheme://target".
+   *
+   * @var String
+   */
+  protected $uri;
+
+  /**
+   * Gets the path that the wrapper is responsible for.
+   * @TODO: Review this method name in D8 per http://drupal.org/node/701358
+   *
+   * @return
+   *   String specifying the path.
+   */
+  abstract function getDirectoryPath();
+
+  /**
+   * Base implementation of setUri().
+   */
+  function setUri($uri) {
+    $this->uri = $uri;
+  }
+
+  /**
+   * Base implementation of getUri().
+   */
+  function getUri() {
+    return $this->uri;
+  }
+
+  /**
+   * Returns the local writable target of the resource within the stream.
+   *
+   * This function should be used in place of calls to realpath() or similar
+   * functions when attempting to determine the location of a file. While
+   * functions like realpath() may return the location of a read-only file, this
+   * method may return a URI or path suitable for writing that is completely
+   * separate from the URI used for reading.
+   *
+   * @param $uri
+   *   Optional URI.
+   *
+   * @return
+   *   Returns a string representing a location suitable for writing of a file,
+   *   or FALSE if unable to write to the file such as with read-only streams.
+   */
+  protected function getTarget($uri = NULL) {
+    if (!isset($uri)) {
+      $uri = $this->uri;
+    }
+
+    list($scheme, $target) = explode('://', $uri, 2);
+
+    // Remove erroneous leading or trailing, forward-slashes and backslashes.
+    return trim($target, '\/');
+  }
+
+  /**
+   * Base implementation of getMimeType().
+   */
+  static function getMimeType($uri, $mapping = NULL) {
+    if (!isset($mapping)) {
+      // The default file map, defined in file.mimetypes.inc is quite big.
+      // We only load it when necessary.
+      include_once DRUPAL_ROOT . '/includes/file.mimetypes.inc';
+      $mapping = file_mimetype_mapping();
+    }
+
+    $extension = '';
+    $file_parts = explode('.', drupal_basename($uri));
+
+    // Remove the first part: a full filename should not match an extension.
+    array_shift($file_parts);
+
+    // Iterate over the file parts, trying to find a match.
+    // For my.awesome.image.jpeg, we try:
+    //   - jpeg
+    //   - image.jpeg, and
+    //   - awesome.image.jpeg
+    while ($additional_part = array_pop($file_parts)) {
+      $extension = strtolower($additional_part . ($extension ? '.' . $extension : ''));
+      if (isset($mapping['extensions'][$extension])) {
+        return $mapping['mimetypes'][$mapping['extensions'][$extension]];
+      }
+    }
+
+    return 'application/octet-stream';
+  }
+
+  /**
+   * Base implementation of chmod().
+   */
+  function chmod($mode) {
+    $output = @chmod($this->getLocalPath(), $mode);
+    // We are modifying the underlying file here, so we have to clear the stat
+    // cache so that PHP understands that URI has changed too.
+    clearstatcache();
+    return $output;
+  }
+
+  /**
+   * Base implementation of realpath().
+   */
+  function realpath() {
+    return $this->getLocalPath();
+  }
+
+  /**
+   * Returns the canonical absolute path of the URI, if possible.
+   *
+   * @param string $uri
+   *   (optional) The stream wrapper URI to be converted to a canonical
+   *   absolute path. This may point to a directory or another type of file.
+   *
+   * @return string|false
+   *   If $uri is not set, returns the canonical absolute path of the URI
+   *   previously set by the DrupalStreamWrapperInterface::setUri() function.
+   *   If $uri is set and valid for this class, returns its canonical absolute
+   *   path, as determined by the realpath() function. If $uri is set but not
+   *   valid, returns FALSE.
+   */
+  protected function getLocalPath($uri = NULL) {
+    if (!isset($uri)) {
+      $uri = $this->uri;
+    }
+    $path = $this->getDirectoryPath() . '/' . $this->getTarget($uri);
+    $realpath = realpath($path);
+    if (!$realpath) {
+      // This file does not yet exist.
+      $realpath = realpath(dirname($path)) . '/' . drupal_basename($path);
+    }
+    $directory = realpath($this->getDirectoryPath());
+    if (!$realpath || !$directory || strpos($realpath, $directory) !== 0) {
+      return FALSE;
+    }
+    return $realpath;
+  }
+
+  /**
+   * Support for fopen(), file_get_contents(), file_put_contents() etc.
+   *
+   * @param $uri
+   *   A string containing the URI to the file to open.
+   * @param $mode
+   *   The file mode ("r", "wb" etc.).
+   * @param $options
+   *   A bit mask of STREAM_USE_PATH and STREAM_REPORT_ERRORS.
+   * @param $opened_path
+   *   A string containing the path actually opened.
+   *
+   * @return
+   *   Returns TRUE if file was opened successfully.
+   *
+   * @see http://php.net/manual/streamwrapper.stream-open.php
+   */
+  public function stream_open($uri, $mode, $options, &$opened_path) {
+    $this->uri = $uri;
+    $path = $this->getLocalPath();
+    $this->handle = ($options & STREAM_REPORT_ERRORS) ? fopen($path, $mode) : @fopen($path, $mode);
+
+    if ((bool) $this->handle && $options & STREAM_USE_PATH) {
+      $opened_path = $path;
+    }
+
+    return (bool) $this->handle;
+  }
+
+  /**
+   * Support for flock().
+   *
+   * @param $operation
+   *   One of the following:
+   *   - LOCK_SH to acquire a shared lock (reader).
+   *   - LOCK_EX to acquire an exclusive lock (writer).
+   *   - LOCK_UN to release a lock (shared or exclusive).
+   *   - LOCK_NB if you don't want flock() to block while locking (not
+   *     supported on Windows).
+   *
+   * @return
+   *   Always returns TRUE at the present time.
+   *
+   * @see http://php.net/manual/streamwrapper.stream-lock.php
+   */
+  public function stream_lock($operation) {
+    if (in_array($operation, array(LOCK_SH, LOCK_EX, LOCK_UN, LOCK_NB))) {
+      return flock($this->handle, $operation);
+    }
+
+    return TRUE;
+  }
+
+  /**
+   * Support for fread(), file_get_contents() etc.
+   *
+   * @param $count
+   *   Maximum number of bytes to be read.
+   *
+   * @return
+   *   The string that was read, or FALSE in case of an error.
+   *
+   * @see http://php.net/manual/streamwrapper.stream-read.php
+   */
+  public function stream_read($count) {
+    return fread($this->handle, $count);
+  }
+
+  /**
+   * Support for fwrite(), file_put_contents() etc.
+   *
+   * @param $data
+   *   The string to be written.
+   *
+   * @return
+   *   The number of bytes written (integer).
+   *
+   * @see http://php.net/manual/streamwrapper.stream-write.php
+   */
+  public function stream_write($data) {
+    return fwrite($this->handle, $data);
+  }
+
+  /**
+   * Support for feof().
+   *
+   * @return
+   *   TRUE if end-of-file has been reached.
+   *
+   * @see http://php.net/manual/streamwrapper.stream-eof.php
+   */
+  public function stream_eof() {
+    return feof($this->handle);
+  }
+
+  /**
+   * Support for fseek().
+   *
+   * @param $offset
+   *   The byte offset to got to.
+   * @param $whence
+   *   SEEK_SET, SEEK_CUR, or SEEK_END.
+   *
+   * @return
+   *   TRUE on success.
+   *
+   * @see http://php.net/manual/streamwrapper.stream-seek.php
+   */
+  public function stream_seek($offset, $whence) {
+    // fseek returns 0 on success and -1 on a failure.
+    // stream_seek   1 on success and  0 on a failure.
+    return !fseek($this->handle, $offset, $whence);
+  }
+
+  /**
+   * Support for fflush().
+   *
+   * @return
+   *   TRUE if data was successfully stored (or there was no data to store).
+   *
+   * @see http://php.net/manual/streamwrapper.stream-flush.php
+   */
+  public function stream_flush() {
+    return fflush($this->handle);
+  }
+
+  /**
+   * Support for ftell().
+   *
+   * @return
+   *   The current offset in bytes from the beginning of file.
+   *
+   * @see http://php.net/manual/streamwrapper.stream-tell.php
+   */
+  public function stream_tell() {
+    return ftell($this->handle);
+  }
+
+  /**
+   * Support for fstat().
+   *
+   * @return
+   *   An array with file status, or FALSE in case of an error - see fstat()
+   *   for a description of this array.
+   *
+   * @see http://php.net/manual/streamwrapper.stream-stat.php
+   */
+  public function stream_stat() {
+    return fstat($this->handle);
+  }
+
+  /**
+   * Support for fclose().
+   *
+   * @return
+   *   TRUE if stream was successfully closed.
+   *
+   * @see http://php.net/manual/streamwrapper.stream-close.php
+   */
+  public function stream_close() {
+    return fclose($this->handle);
+  }
+
+  /**
+   * Support for unlink().
+   *
+   * @param $uri
+   *   A string containing the URI to the resource to delete.
+   *
+   * @return
+   *   TRUE if resource was successfully deleted.
+   *
+   * @see http://php.net/manual/streamwrapper.unlink.php
+   */
+  public function unlink($uri) {
+    $this->uri = $uri;
+    return drupal_unlink($this->getLocalPath());
+  }
+
+  /**
+   * Support for rename().
+   *
+   * @param $from_uri,
+   *   The URI to the file to rename.
+   * @param $to_uri
+   *   The new URI for file.
+   *
+   * @return
+   *   TRUE if file was successfully renamed.
+   *
+   * @see http://php.net/manual/streamwrapper.rename.php
+   */
+  public function rename($from_uri, $to_uri) {
+    return rename($this->getLocalPath($from_uri), $this->getLocalPath($to_uri));
+  }
+
+  /**
+   * Gets the name of the directory from a given path.
+   *
+   * This method is usually accessed through drupal_dirname(), which wraps
+   * around the PHP dirname() function because it does not support stream
+   * wrappers.
+   *
+   * @param $uri
+   *   A URI or path.
+   *
+   * @return
+   *   A string containing the directory name.
+   *
+   * @see drupal_dirname()
+   */
+  public function dirname($uri = NULL) {
+    list($scheme, $target) = explode('://', $uri, 2);
+    $target  = $this->getTarget($uri);
+    $dirname = dirname($target);
+
+    if ($dirname == '.') {
+      $dirname = '';
+    }
+
+    return $scheme . '://' . $dirname;
+  }
+
+  /**
+   * Support for mkdir().
+   *
+   * @param $uri
+   *   A string containing the URI to the directory to create.
+   * @param $mode
+   *   Permission flags - see mkdir().
+   * @param $options
+   *   A bit mask of STREAM_REPORT_ERRORS and STREAM_MKDIR_RECURSIVE.
+   *
+   * @return
+   *   TRUE if directory was successfully created.
+   *
+   * @see http://php.net/manual/streamwrapper.mkdir.php
+   */
+  public function mkdir($uri, $mode, $options) {
+    $this->uri = $uri;
+    $recursive = (bool) ($options & STREAM_MKDIR_RECURSIVE);
+    if ($recursive) {
+      // $this->getLocalPath() fails if $uri has multiple levels of directories
+      // that do not yet exist.
+      $localpath = $this->getDirectoryPath() . '/' . $this->getTarget($uri);
+    }
+    else {
+      $localpath = $this->getLocalPath($uri);
+    }
+    if ($options & STREAM_REPORT_ERRORS) {
+      return mkdir($localpath, $mode, $recursive);
+    }
+    else {
+      return @mkdir($localpath, $mode, $recursive);
+    }
+  }
+
+  /**
+   * Support for rmdir().
+   *
+   * @param $uri
+   *   A string containing the URI to the directory to delete.
+   * @param $options
+   *   A bit mask of STREAM_REPORT_ERRORS.
+   *
+   * @return
+   *   TRUE if directory was successfully removed.
+   *
+   * @see http://php.net/manual/streamwrapper.rmdir.php
+   */
+  public function rmdir($uri, $options) {
+    $this->uri = $uri;
+    if ($options & STREAM_REPORT_ERRORS) {
+      return drupal_rmdir($this->getLocalPath());
+    }
+    else {
+      return @drupal_rmdir($this->getLocalPath());
+    }
+  }
+
+  /**
+   * Support for stat().
+   *
+   * @param $uri
+   *   A string containing the URI to get information about.
+   * @param $flags
+   *   A bit mask of STREAM_URL_STAT_LINK and STREAM_URL_STAT_QUIET.
+   *
+   * @return
+   *   An array with file status, or FALSE in case of an error - see fstat()
+   *   for a description of this array.
+   *
+   * @see http://php.net/manual/streamwrapper.url-stat.php
+   */
+  public function url_stat($uri, $flags) {
+    $this->uri = $uri;
+    $path = $this->getLocalPath();
+    // Suppress warnings if requested or if the file or directory does not
+    // exist. This is consistent with PHP's plain filesystem stream wrapper.
+    if ($flags & STREAM_URL_STAT_QUIET || !file_exists($path)) {
+      return @stat($path);
+    }
+    else {
+      return stat($path);
+    }
+  }
+
+  /**
+   * Support for opendir().
+   *
+   * @param $uri
+   *   A string containing the URI to the directory to open.
+   * @param $options
+   *   Unknown (parameter is not documented in PHP Manual).
+   *
+   * @return
+   *   TRUE on success.
+   *
+   * @see http://php.net/manual/streamwrapper.dir-opendir.php
+   */
+  public function dir_opendir($uri, $options) {
+    $this->uri = $uri;
+    $this->handle = opendir($this->getLocalPath());
+
+    return (bool) $this->handle;
+  }
+
+  /**
+   * Support for readdir().
+   *
+   * @return
+   *   The next filename, or FALSE if there are no more files in the directory.
+   *
+   * @see http://php.net/manual/streamwrapper.dir-readdir.php
+   */
+  public function dir_readdir() {
+    return readdir($this->handle);
+  }
+
+  /**
+   * Support for rewinddir().
+   *
+   * @return
+   *   TRUE on success.
+   *
+   * @see http://php.net/manual/streamwrapper.dir-rewinddir.php
+   */
+  public function dir_rewinddir() {
+    rewinddir($this->handle);
+    // We do not really have a way to signal a failure as rewinddir() does not
+    // have a return value and there is no way to read a directory handler
+    // without advancing to the next file.
+    return TRUE;
+  }
+
+  /**
+   * Support for closedir().
+   *
+   * @return
+   *   TRUE on success.
+   *
+   * @see http://php.net/manual/streamwrapper.dir-closedir.php
+   */
+  public function dir_closedir() {
+    closedir($this->handle);
+    // We do not really have a way to signal a failure as closedir() does not
+    // have a return value.
+    return TRUE;
+  }
+}
+
+/**
+ * Drupal public (public://) stream wrapper class.
+ *
+ * Provides support for storing publicly accessible files with the Drupal file
+ * interface.
+ */
+class DrupalPublicStreamWrapper extends DrupalLocalStreamWrapper {
+  /**
+   * Implements abstract public function getDirectoryPath()
+   */
+  public function getDirectoryPath() {
+    return variable_get('file_public_path', conf_path() . '/files');
+  }
+
+  /**
+   * Overrides getExternalUrl().
+   *
+   * Return the HTML URI of a public file.
+   */
+  function getExternalUrl() {
+    $path = str_replace('\\', '/', $this->getTarget());
+    return $GLOBALS['base_url'] . '/' . self::getDirectoryPath() . '/' . drupal_encode_path($path);
+  }
+}
+
+
+/**
+ * Drupal private (private://) stream wrapper class.
+ *
+ * Provides support for storing privately accessible files with the Drupal file
+ * interface.
+ */
+class DrupalPrivateStreamWrapper extends DrupalLocalStreamWrapper {
+  /**
+   * Implements abstract public function getDirectoryPath()
+   */
+  public function getDirectoryPath() {
+    return variable_get('file_private_path', '');
+  }
+
+  /**
+   * Overrides getExternalUrl().
+   *
+   * Return the HTML URI of a private file.
+   */
+  function getExternalUrl() {
+    $path = str_replace('\\', '/', $this->getTarget());
+    return url('system/files/' . $path, array('absolute' => TRUE));
+  }
+}
+
+/**
+ * Drupal temporary (temporary://) stream wrapper class.
+ *
+ * Provides support for storing temporarily accessible files with the Drupal
+ * file interface.
+ *
+ * Extends DrupalPublicStreamWrapper.
+ */
+class DrupalTemporaryStreamWrapper extends DrupalLocalStreamWrapper {
+  /**
+   * Implements abstract public function getDirectoryPath()
+   */
+  public function getDirectoryPath() {
+    return variable_get('file_temporary_path', file_directory_temp());
+  }
+
+  /**
+   * Overrides getExternalUrl().
+   */
+  public function getExternalUrl() {
+    $path = str_replace('\\', '/', $this->getTarget());
+    return url('system/temporary/' . $path, array('absolute' => TRUE));
+  }
+}
diff --git a/htmltest/includes/tablesort.inc b/htmltest/includes/tablesort.inc
new file mode 100644
index 00000000..e589526c
--- /dev/null
+++ b/htmltest/includes/tablesort.inc
@@ -0,0 +1,256 @@
+<?php
+
+/**
+ * @file
+ * Functions to aid in the creation of sortable tables.
+ *
+ * All tables created with a call to theme('table') have the option of having
+ * column headers that the user can click on to sort the table by that column.
+ */
+
+
+/**
+ * Query extender class for tablesort queries.
+ */
+class TableSort extends SelectQueryExtender {
+
+  /**
+   * The array of fields that can be sorted by.
+   *
+   * @var array
+   */
+  protected $header = array();
+
+  public function __construct(SelectQueryInterface $query, DatabaseConnection $connection) {
+    parent::__construct($query, $connection);
+
+    // Add convenience tag to mark that this is an extended query. We have to
+    // do this in the constructor to ensure that it is set before preExecute()
+    // gets called.
+    $this->addTag('tablesort');
+  }
+
+  /**
+   * Order the query based on a header array.
+   *
+   * @see theme_table()
+   * @param $header
+   *   Table header array.
+   * @return SelectQueryInterface
+   *   The called object.
+   */
+  public function orderByHeader(Array $header) {
+    $this->header = $header;
+    $ts = $this->init();
+    if (!empty($ts['sql'])) {
+      // Based on code from db_escape_table(), but this can also contain a dot.
+      $field = preg_replace('/[^A-Za-z0-9_.]+/', '', $ts['sql']);
+
+      // Sort order can only be ASC or DESC.
+      $sort = drupal_strtoupper($ts['sort']);
+      $sort = in_array($sort, array('ASC', 'DESC')) ? $sort : '';
+      $this->orderBy($field, $sort);
+    }
+    return $this;
+  }
+
+  /**
+   * Initializes the table sort context.
+   */
+  protected function init() {
+    $ts = $this->order();
+    $ts['sort'] = $this->getSort();
+    $ts['query'] = $this->getQueryParameters();
+    return $ts;
+  }
+
+  /**
+   * Determine the current sort direction.
+   *
+   * @param $headers
+   *   An array of column headers in the format described in theme_table().
+   * @return
+   *   The current sort direction ("asc" or "desc").
+   */
+  protected function getSort() {
+    return tablesort_get_sort($this->header);
+  }
+
+  /**
+   * Compose a URL query parameter array to append to table sorting requests.
+   *
+   * @return
+   *   A URL query parameter array that consists of all components of the current
+   *   page request except for those pertaining to table sorting.
+   *
+   * @see tablesort_get_query_parameters()
+   */
+  protected function getQueryParameters() {
+    return tablesort_get_query_parameters();
+  }
+
+  /**
+   * Determine the current sort criterion.
+   *
+   * @param $headers
+   *   An array of column headers in the format described in theme_table().
+   * @return
+   *   An associative array describing the criterion, containing the keys:
+   *   - "name": The localized title of the table column.
+   *   - "sql": The name of the database field to sort on.
+   */
+  protected function order() {
+    return tablesort_get_order($this->header);
+  }
+}
+
+/**
+ * Initialize the table sort context.
+ */
+function tablesort_init($header) {
+  $ts = tablesort_get_order($header);
+  $ts['sort'] = tablesort_get_sort($header);
+  $ts['query'] = tablesort_get_query_parameters();
+  return $ts;
+}
+
+/**
+ * Formats a column header.
+ *
+ * If the cell in question is the column header for the current sort criterion,
+ * it gets special formatting. All possible sort criteria become links.
+ *
+ * @param $cell
+ *   The cell to format.
+ * @param $header
+ *   An array of column headers in the format described in theme_table().
+ * @param $ts
+ *   The current table sort context as returned from tablesort_init().
+ *
+ * @return
+ *   A properly formatted cell, ready for _theme_table_cell().
+ */
+function tablesort_header($cell, $header, $ts) {
+  // Special formatting for the currently sorted column header.
+  if (is_array($cell) && isset($cell['field'])) {
+    $title = t('sort by @s', array('@s' => $cell['data']));
+    if ($cell['data'] == $ts['name']) {
+      $ts['sort'] = (($ts['sort'] == 'asc') ? 'desc' : 'asc');
+      $cell['class'][] = 'active';
+      $image = theme('tablesort_indicator', array('style' => $ts['sort']));
+    }
+    else {
+      // If the user clicks a different header, we want to sort ascending initially.
+      $ts['sort'] = 'asc';
+      $image = '';
+    }
+    $cell['data'] = l($cell['data'] . $image, $_GET['q'], array('attributes' => array('title' => $title), 'query' => array_merge($ts['query'], array('sort' => $ts['sort'], 'order' => $cell['data'])), 'html' => TRUE));
+
+    unset($cell['field'], $cell['sort']);
+  }
+  return $cell;
+}
+
+/**
+ * Formats a table cell.
+ *
+ * Adds a class attribute to all cells in the currently active column.
+ *
+ * @param $cell
+ *   The cell to format.
+ * @param $header
+ *   An array of column headers in the format described in theme_table().
+ * @param $ts
+ *   The current table sort context as returned from tablesort_init().
+ * @param $i
+ *   The index of the cell's table column.
+ *
+ * @return
+ *   A properly formatted cell, ready for _theme_table_cell().
+ */
+function tablesort_cell($cell, $header, $ts, $i) {
+  if (isset($header[$i]['data']) && $header[$i]['data'] == $ts['name'] && !empty($header[$i]['field'])) {
+    if (is_array($cell)) {
+      $cell['class'][] = 'active';
+    }
+    else {
+      $cell = array('data' => $cell, 'class' => array('active'));
+    }
+  }
+  return $cell;
+}
+
+/**
+ * Composes a URL query parameter array for table sorting links.
+ *
+ * @return
+ *   A URL query parameter array that consists of all components of the current
+ *   page request except for those pertaining to table sorting.
+ */
+function tablesort_get_query_parameters() {
+  return drupal_get_query_parameters($_GET, array('q', 'sort', 'order'));
+}
+
+/**
+ * Determines the current sort criterion.
+ *
+ * @param $headers
+ *   An array of column headers in the format described in theme_table().
+ *
+ * @return
+ *   An associative array describing the criterion, containing the keys:
+ *   - "name": The localized title of the table column.
+ *   - "sql": The name of the database field to sort on.
+ */
+function tablesort_get_order($headers) {
+  $order = isset($_GET['order']) ? $_GET['order'] : '';
+  foreach ($headers as $header) {
+    if (is_array($header)) {
+      if (isset($header['data']) && $order == $header['data']) {
+        $default = $header;
+        break;
+      }
+
+      if (empty($default) && isset($header['sort']) && ($header['sort'] == 'asc' || $header['sort'] == 'desc')) {
+        $default = $header;
+      }
+    }
+  }
+
+  if (!isset($default)) {
+    $default = reset($headers);
+    if (!is_array($default)) {
+      $default = array('data' => $default);
+    }
+  }
+
+  $default += array('data' => NULL, 'field' => NULL);
+  return array('name' => $default['data'], 'sql' => $default['field']);
+}
+
+/**
+ * Determines the current sort direction.
+ *
+ * @param $headers
+ *   An array of column headers in the format described in theme_table().
+ *
+ * @return
+ *   The current sort direction ("asc" or "desc").
+ */
+function tablesort_get_sort($headers) {
+  if (isset($_GET['sort'])) {
+    return (strtolower($_GET['sort']) == 'desc') ? 'desc' : 'asc';
+  }
+  // The user has not specified a sort. Use the default for the currently sorted
+  // header if specified; otherwise use "asc".
+  else {
+    // Find out which header is currently being sorted.
+    $ts = tablesort_get_order($headers);
+    foreach ($headers as $header) {
+      if (is_array($header) && isset($header['data']) && $header['data'] == $ts['name'] && isset($header['sort'])) {
+        return $header['sort'];
+      }
+    }
+  }
+  return 'asc';
+}
diff --git a/htmltest/includes/theme.inc b/htmltest/includes/theme.inc
new file mode 100644
index 00000000..ee73965d
--- /dev/null
+++ b/htmltest/includes/theme.inc
@@ -0,0 +1,2918 @@
+<?php
+
+/**
+ * @file
+ * The theme system, which controls the output of Drupal.
+ *
+ * The theme system allows for nearly all output of the Drupal system to be
+ * customized by user themes.
+ */
+
+/**
+ * @defgroup content_flags Content markers
+ * @{
+ * Markers used by theme_mark() and node_mark() to designate content.
+ * @see theme_mark(), node_mark()
+ */
+
+/**
+ * Mark content as read.
+ */
+define('MARK_READ', 0);
+
+/**
+ * Mark content as being new.
+ */
+define('MARK_NEW', 1);
+
+/**
+ * Mark content as being updated.
+ */
+define('MARK_UPDATED', 2);
+
+/**
+ * @} End of "Content markers".
+ */
+
+/**
+ * Determines if a theme is available to use.
+ *
+ * @param $theme
+ *   Either the name of a theme or a full theme object.
+ *
+ * @return
+ *   Boolean TRUE if the theme is enabled or is the site administration theme;
+ *   FALSE otherwise.
+ */
+function drupal_theme_access($theme) {
+  if (is_object($theme)) {
+    return _drupal_theme_access($theme);
+  }
+  else {
+    $themes = list_themes();
+    return isset($themes[$theme]) && _drupal_theme_access($themes[$theme]);
+  }
+}
+
+/**
+ * Helper function for determining access to a theme.
+ *
+ * @see drupal_theme_access()
+ */
+function _drupal_theme_access($theme) {
+  $admin_theme = variable_get('admin_theme');
+  return !empty($theme->status) || ($admin_theme && $theme->name == $admin_theme);
+}
+
+/**
+ * Initializes the theme system by loading the theme.
+ */
+function drupal_theme_initialize() {
+  global $theme, $user, $theme_key;
+
+  // If $theme is already set, assume the others are set, too, and do nothing
+  if (isset($theme)) {
+    return;
+  }
+
+  drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);
+  $themes = list_themes();
+
+  // Only select the user selected theme if it is available in the
+  // list of themes that can be accessed.
+  $theme = !empty($user->theme) && drupal_theme_access($user->theme) ? $user->theme : variable_get('theme_default', 'bartik');
+
+  // Allow modules to override the theme. Validation has already been performed
+  // inside menu_get_custom_theme(), so we do not need to check it again here.
+  $custom_theme = menu_get_custom_theme();
+  $theme = !empty($custom_theme) ? $custom_theme : $theme;
+
+  // Store the identifier for retrieving theme settings with.
+  $theme_key = $theme;
+
+  // Find all our ancestor themes and put them in an array.
+  $base_theme = array();
+  $ancestor = $theme;
+  while ($ancestor && isset($themes[$ancestor]->base_theme)) {
+    $ancestor = $themes[$ancestor]->base_theme;
+    $base_theme[] = $themes[$ancestor];
+  }
+  _drupal_theme_initialize($themes[$theme], array_reverse($base_theme));
+
+  // Themes can have alter functions, so reset the drupal_alter() cache.
+  drupal_static_reset('drupal_alter');
+
+  // Provide the page with information about the theme that's used, so that a
+  // later Ajax request can be rendered using the same theme.
+  // @see ajax_base_page_theme()
+  $setting['ajaxPageState'] = array(
+    'theme' => $theme_key,
+    'theme_token' => drupal_get_token($theme_key),
+  );
+  drupal_add_js($setting, 'setting');
+}
+
+/**
+ * Initializes the theme system given already loaded information.
+ *
+ * This function is useful to initialize a theme when no database is present.
+ *
+ * @param $theme
+ *   An object with the following information:
+ *     filename
+ *       The .info file for this theme. The 'path' to
+ *       the theme will be in this file's directory. (Required)
+ *     owner
+ *       The path to the .theme file or the .engine file to load for
+ *       the theme. (Required)
+ *     stylesheet
+ *       The primary stylesheet for the theme. (Optional)
+ *     engine
+ *       The name of theme engine to use. (Optional)
+ * @param $base_theme
+ *    An optional array of objects that represent the 'base theme' if the
+ *    theme is meant to be derivative of another theme. It requires
+ *    the same information as the $theme object. It should be in
+ *    'oldest first' order, meaning the top level of the chain will
+ *    be first.
+ * @param $registry_callback
+ *   The callback to invoke to set the theme registry.
+ */
+function _drupal_theme_initialize($theme, $base_theme = array(), $registry_callback = '_theme_load_registry') {
+  global $theme_info, $base_theme_info, $theme_engine, $theme_path;
+  $theme_info = $theme;
+  $base_theme_info = $base_theme;
+
+  $theme_path = dirname($theme->filename);
+
+  // Prepare stylesheets from this theme as well as all ancestor themes.
+  // We work it this way so that we can have child themes override parent
+  // theme stylesheets easily.
+  $final_stylesheets = array();
+
+  // Grab stylesheets from base theme
+  foreach ($base_theme as $base) {
+    if (!empty($base->stylesheets)) {
+      foreach ($base->stylesheets as $media => $stylesheets) {
+        foreach ($stylesheets as $name => $stylesheet) {
+          $final_stylesheets[$media][$name] = $stylesheet;
+        }
+      }
+    }
+  }
+
+  // Add stylesheets used by this theme.
+  if (!empty($theme->stylesheets)) {
+    foreach ($theme->stylesheets as $media => $stylesheets) {
+      foreach ($stylesheets as $name => $stylesheet) {
+        $final_stylesheets[$media][$name] = $stylesheet;
+      }
+    }
+  }
+
+  // And now add the stylesheets properly
+  foreach ($final_stylesheets as $media => $stylesheets) {
+    foreach ($stylesheets as $stylesheet) {
+      drupal_add_css($stylesheet, array('group' => CSS_THEME, 'every_page' => TRUE, 'media' => $media));
+    }
+  }
+
+  // Do basically the same as the above for scripts
+  $final_scripts = array();
+
+  // Grab scripts from base theme
+  foreach ($base_theme as $base) {
+    if (!empty($base->scripts)) {
+      foreach ($base->scripts as $name => $script) {
+        $final_scripts[$name] = $script;
+      }
+    }
+  }
+
+  // Add scripts used by this theme.
+  if (!empty($theme->scripts)) {
+    foreach ($theme->scripts as $name => $script) {
+      $final_scripts[$name] = $script;
+    }
+  }
+
+  // Add scripts used by this theme.
+  foreach ($final_scripts as $script) {
+    drupal_add_js($script, array('group' => JS_THEME, 'every_page' => TRUE));
+  }
+
+  $theme_engine = NULL;
+
+  // Initialize the theme.
+  if (isset($theme->engine)) {
+    // Include the engine.
+    include_once DRUPAL_ROOT . '/' . $theme->owner;
+
+    $theme_engine = $theme->engine;
+    if (function_exists($theme_engine . '_init')) {
+      foreach ($base_theme as $base) {
+        call_user_func($theme_engine . '_init', $base);
+      }
+      call_user_func($theme_engine . '_init', $theme);
+    }
+  }
+  else {
+    // include non-engine theme files
+    foreach ($base_theme as $base) {
+      // Include the theme file or the engine.
+      if (!empty($base->owner)) {
+        include_once DRUPAL_ROOT . '/' . $base->owner;
+      }
+    }
+    // and our theme gets one too.
+    if (!empty($theme->owner)) {
+      include_once DRUPAL_ROOT . '/' . $theme->owner;
+    }
+  }
+
+  if (isset($registry_callback)) {
+    _theme_registry_callback($registry_callback, array($theme, $base_theme, $theme_engine));
+  }
+}
+
+/**
+ * Gets the theme registry.
+ *
+ * @param $complete
+ *   Optional boolean to indicate whether to return the complete theme registry
+ *   array or an instance of the ThemeRegistry class. If TRUE, the complete
+ *   theme registry array will be returned. This is useful if you want to
+ *   foreach over the whole registry, use array_* functions or inspect it in a
+ *   debugger. If FALSE, an instance of the ThemeRegistry class will be
+ *   returned, this provides an ArrayObject which allows it to be accessed
+ *   with array syntax and  isset(), and should be more lightweight
+ *   than the full registry. Defaults to TRUE.
+ *
+ * @return
+ *   The complete theme registry array, or an instance of the ThemeRegistry
+ *   class.
+ */
+function theme_get_registry($complete = TRUE) {
+  // Use the advanced drupal_static() pattern, since this is called very often.
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['registry'] = &drupal_static('theme_get_registry');
+  }
+  $theme_registry = &$drupal_static_fast['registry'];
+
+  // Initialize the theme, if this is called early in the bootstrap, or after
+  // static variables have been reset.
+  if (!is_array($theme_registry)) {
+    drupal_theme_initialize();
+    $theme_registry = array();
+  }
+
+  $key = (int) $complete;
+
+  if (!isset($theme_registry[$key])) {
+    list($callback, $arguments) = _theme_registry_callback();
+    if (!$complete) {
+      $arguments[] = FALSE;
+    }
+    $theme_registry[$key] = call_user_func_array($callback, $arguments);
+  }
+
+  return $theme_registry[$key];
+}
+
+/**
+ * Sets the callback that will be used by theme_get_registry().
+ *
+ * @param $callback
+ *   The name of the callback function.
+ * @param $arguments
+ *   The arguments to pass to the function.
+ */
+function _theme_registry_callback($callback = NULL, array $arguments = array()) {
+  static $stored;
+  if (isset($callback)) {
+    $stored = array($callback, $arguments);
+  }
+  return $stored;
+}
+
+/**
+ * Gets the theme_registry cache; if it doesn't exist, builds it.
+ *
+ * @param $theme
+ *   The loaded $theme object as returned by list_themes().
+ * @param $base_theme
+ *   An array of loaded $theme objects representing the ancestor themes in
+ *   oldest first order.
+ * @param $theme_engine
+ *   The name of the theme engine.
+ * @param $complete
+ *   Whether to load the complete theme registry or an instance of the
+ *   ThemeRegistry class.
+ *
+ * @return
+ *   The theme registry array, or an instance of the ThemeRegistry class.
+ */
+function _theme_load_registry($theme, $base_theme = NULL, $theme_engine = NULL, $complete = TRUE) {
+  if ($complete) {
+    // Check the theme registry cache; if it exists, use it.
+    $cached = cache_get("theme_registry:$theme->name");
+    if (isset($cached->data)) {
+      $registry = $cached->data;
+    }
+    else {
+      // If not, build one and cache it.
+      $registry = _theme_build_registry($theme, $base_theme, $theme_engine);
+      // Only persist this registry if all modules are loaded. This assures a
+      // complete set of theme hooks.
+      if (module_load_all(NULL)) {
+        _theme_save_registry($theme, $registry);
+      }
+    }
+    return $registry;
+  }
+  else {
+    return new ThemeRegistry('theme_registry:runtime:' . $theme->name, 'cache');
+  }
+}
+
+/**
+ * Writes the theme_registry cache into the database.
+ */
+function _theme_save_registry($theme, $registry) {
+  cache_set("theme_registry:$theme->name", $registry);
+}
+
+/**
+ * Forces the system to rebuild the theme registry.
+ *
+ * This function should be called when modules are added to the system, or when
+ * a dynamic system needs to add more theme hooks.
+ */
+function drupal_theme_rebuild() {
+  drupal_static_reset('theme_get_registry');
+  cache_clear_all('theme_registry', 'cache', TRUE);
+}
+
+/**
+ * Builds the run-time theme registry.
+ *
+ * Extends DrupalCacheArray to allow the theme registry to be accessed as a
+ * complete registry, while internally caching only the parts of the registry
+ * that are actually in use on the site. On cache misses the complete
+ * theme registry is loaded and used to update the run-time cache.
+ */
+class ThemeRegistry Extends DrupalCacheArray {
+
+  /**
+   * Whether the partial registry can be persisted to the cache.
+   *
+   * This is only allowed if all modules and the request method is GET. theme()
+   * should be very rarely called on POST requests and this avoids polluting
+   * the runtime cache.
+   */
+  protected $persistable;
+
+  /**
+   * The complete theme registry array.
+   */
+  protected $completeRegistry;
+
+  function __construct($cid, $bin) {
+    $this->cid = $cid;
+    $this->bin = $bin;
+    $this->persistable = module_load_all(NULL) && $_SERVER['REQUEST_METHOD'] == 'GET';
+
+    $data = array();
+    if ($this->persistable && $cached = cache_get($this->cid, $this->bin)) {
+      $data = $cached->data;
+    }
+    else {
+      // If there is no runtime cache stored, fetch the full theme registry,
+      // but then initialize each value to NULL. This allows offsetExists()
+      // to function correctly on non-registered theme hooks without triggering
+      // a call to resolveCacheMiss().
+      $data = $this->initializeRegistry();
+      if ($this->persistable) {
+        $this->set($data);
+      }
+    }
+    $this->storage = $data;
+  }
+
+  /**
+   * Initializes the full theme registry.
+   *
+   * @return
+   *   An array with the keys of the full theme registry, but the values
+   *   initialized to NULL.
+   */
+  function initializeRegistry() {
+    $this->completeRegistry = theme_get_registry();
+
+    return array_fill_keys(array_keys($this->completeRegistry), NULL);
+  }
+
+  public function offsetExists($offset) {
+    // Since the theme registry allows for theme hooks to be requested that
+    // are not registered, just check the existence of the key in the registry.
+    // Use array_key_exists() here since a NULL value indicates that the theme
+    // hook exists but has not yet been requested.
+    return array_key_exists($offset, $this->storage);
+  }
+
+  public function offsetGet($offset) {
+    // If the offset is set but empty, it is a registered theme hook that has
+    // not yet been requested. Offsets that do not exist at all were not
+    // registered in hook_theme().
+    if (isset($this->storage[$offset])) {
+      return $this->storage[$offset];
+    }
+    elseif (array_key_exists($offset, $this->storage)) {
+      return $this->resolveCacheMiss($offset);
+    }
+  }
+
+  public function resolveCacheMiss($offset) {
+    if (!isset($this->completeRegistry)) {
+      $this->completeRegistry = theme_get_registry();
+    }
+    $this->storage[$offset] = $this->completeRegistry[$offset];
+    if ($this->persistable) {
+      $this->persist($offset);
+    }
+    return $this->storage[$offset];
+  }
+
+  public function set($data, $lock = TRUE) {
+    $lock_name = $this->cid . ':' . $this->bin;
+    if (!$lock || lock_acquire($lock_name)) {
+      if ($cached = cache_get($this->cid, $this->bin)) {
+        // Use array merge instead of union so that filled in values in $data
+        // overwrite empty values in the current cache.
+        $data = array_merge($cached->data, $data);
+      }
+      else {
+        $registry = $this->initializeRegistry();
+        $data = array_merge($registry, $data);
+      }
+      cache_set($this->cid, $data, $this->bin);
+      if ($lock) {
+        lock_release($lock_name);
+      }
+    }
+  }
+}
+
+/**
+ * Process a single implementation of hook_theme().
+ *
+ * @param $cache
+ *   The theme registry that will eventually be cached; It is an associative
+ *   array keyed by theme hooks, whose values are associative arrays describing
+ *   the hook:
+ *   - 'type': The passed-in $type.
+ *   - 'theme path': The passed-in $path.
+ *   - 'function': The name of the function generating output for this theme
+ *     hook. Either defined explicitly in hook_theme() or, if neither 'function'
+ *     nor 'template' is defined, then the default theme function name is used.
+ *     The default theme function name is the theme hook prefixed by either
+ *     'theme_' for modules or '$name_' for everything else. If 'function' is
+ *     defined, 'template' is not used.
+ *   - 'template': The filename of the template generating output for this
+ *     theme hook. The template is in the directory defined by the 'path' key of
+ *     hook_theme() or defaults to $path.
+ *   - 'variables': The variables for this theme hook as defined in
+ *     hook_theme(). If there is more than one implementation and 'variables' is
+ *     not specified in a later one, then the previous definition is kept.
+ *   - 'render element': The renderable element for this theme hook as defined
+ *     in hook_theme(). If there is more than one implementation and
+ *     'render element' is not specified in a later one, then the previous
+ *     definition is kept.
+ *   - 'preprocess functions': See theme() for detailed documentation.
+ *   - 'process functions': See theme() for detailed documentation.
+ * @param $name
+ *   The name of the module, theme engine, base theme engine, theme or base
+ *   theme implementing hook_theme().
+ * @param $type
+ *   One of 'module', 'theme_engine', 'base_theme_engine', 'theme', or
+ *   'base_theme'. Unlike regular hooks that can only be implemented by modules,
+ *   each of these can implement hook_theme(). _theme_process_registry() is
+ *   called in aforementioned order and new entries override older ones. For
+ *   example, if a theme hook is both defined by a module and a theme, then the
+ *   definition in the theme will be used.
+ * @param $theme
+ *   The loaded $theme object as returned from list_themes().
+ * @param $path
+ *   The directory where $name is. For example, modules/system or
+ *   themes/bartik.
+ *
+ * @see theme()
+ * @see _theme_build_registry()
+ * @see hook_theme()
+ * @see list_themes()
+ */
+function _theme_process_registry(&$cache, $name, $type, $theme, $path) {
+  $result = array();
+
+  // Processor functions work in two distinct phases with the process
+  // functions always being executed after the preprocess functions.
+  $variable_process_phases = array(
+    'preprocess functions' => 'preprocess',
+    'process functions'    => 'process',
+  );
+
+  $hook_defaults = array(
+    'variables' => TRUE,
+    'render element' => TRUE,
+    'pattern' => TRUE,
+    'base hook' => TRUE,
+  );
+
+  // Invoke the hook_theme() implementation, process what is returned, and
+  // merge it into $cache.
+  $function = $name . '_theme';
+  if (function_exists($function)) {
+    $result = $function($cache, $type, $theme, $path);
+    foreach ($result as $hook => $info) {
+      // When a theme or engine overrides a module's theme function
+      // $result[$hook] will only contain key/value pairs for information being
+      // overridden.  Pull the rest of the information from what was defined by
+      // an earlier hook.
+
+      // Fill in the type and path of the module, theme, or engine that
+      // implements this theme function.
+      $result[$hook]['type'] = $type;
+      $result[$hook]['theme path'] = $path;
+
+      // If function and file are omitted, default to standard naming
+      // conventions.
+      if (!isset($info['template']) && !isset($info['function'])) {
+        $result[$hook]['function'] = ($type == 'module' ? 'theme_' : $name . '_') . $hook;
+      }
+
+      if (isset($cache[$hook]['includes'])) {
+        $result[$hook]['includes'] = $cache[$hook]['includes'];
+      }
+
+      // If the theme implementation defines a file, then also use the path
+      // that it defined. Otherwise use the default path. This allows
+      // system.module to declare theme functions on behalf of core .include
+      // files.
+      if (isset($info['file'])) {
+        $include_file = isset($info['path']) ? $info['path'] : $path;
+        $include_file .= '/' . $info['file'];
+        include_once DRUPAL_ROOT . '/' . $include_file;
+        $result[$hook]['includes'][] = $include_file;
+      }
+
+      // If the default keys are not set, use the default values registered
+      // by the module.
+      if (isset($cache[$hook])) {
+        $result[$hook] += array_intersect_key($cache[$hook], $hook_defaults);
+      }
+
+      // The following apply only to theming hooks implemented as templates.
+      if (isset($info['template'])) {
+        // Prepend the current theming path when none is set.
+        if (!isset($info['path'])) {
+          $result[$hook]['template'] = $path . '/' . $info['template'];
+        }
+      }
+
+      // Allow variable processors for all theming hooks, whether the hook is
+      // implemented as a template or as a function.
+      foreach ($variable_process_phases as $phase_key => $phase) {
+        // Check for existing variable processors. Ensure arrayness.
+        if (!isset($info[$phase_key]) || !is_array($info[$phase_key])) {
+          $info[$phase_key] = array();
+          $prefixes = array();
+          if ($type == 'module') {
+            // Default variable processor prefix.
+            $prefixes[] = 'template';
+            // Add all modules so they can intervene with their own variable
+            // processors. This allows them to provide variable processors even
+            // if they are not the owner of the current hook.
+            $prefixes += module_list();
+          }
+          elseif ($type == 'theme_engine' || $type == 'base_theme_engine') {
+            // Theme engines get an extra set that come before the normally
+            // named variable processors.
+            $prefixes[] = $name . '_engine';
+            // The theme engine registers on behalf of the theme using the
+            // theme's name.
+            $prefixes[] = $theme;
+          }
+          else {
+            // This applies when the theme manually registers their own variable
+            // processors.
+            $prefixes[] = $name;
+          }
+          foreach ($prefixes as $prefix) {
+            // Only use non-hook-specific variable processors for theming hooks
+            // implemented as templates. See theme().
+            if (isset($info['template']) && function_exists($prefix . '_' . $phase)) {
+              $info[$phase_key][] = $prefix . '_' . $phase;
+            }
+            if (function_exists($prefix . '_' . $phase . '_' . $hook)) {
+              $info[$phase_key][] = $prefix . '_' . $phase . '_' . $hook;
+            }
+          }
+        }
+        // Check for the override flag and prevent the cached variable
+        // processors from being used. This allows themes or theme engines to
+        // remove variable processors set earlier in the registry build.
+        if (!empty($info['override ' . $phase_key])) {
+          // Flag not needed inside the registry.
+          unset($result[$hook]['override ' . $phase_key]);
+        }
+        elseif (isset($cache[$hook][$phase_key]) && is_array($cache[$hook][$phase_key])) {
+          $info[$phase_key] = array_merge($cache[$hook][$phase_key], $info[$phase_key]);
+        }
+        $result[$hook][$phase_key] = $info[$phase_key];
+      }
+    }
+
+    // Merge the newly created theme hooks into the existing cache.
+    $cache = $result + $cache;
+  }
+
+  // Let themes have variable processors even if they didn't register a
+  // template.
+  if ($type == 'theme' || $type == 'base_theme') {
+    foreach ($cache as $hook => $info) {
+      // Check only if not registered by the theme or engine.
+      if (empty($result[$hook])) {
+        foreach ($variable_process_phases as $phase_key => $phase) {
+          if (!isset($info[$phase_key])) {
+            $cache[$hook][$phase_key] = array();
+          }
+          // Only use non-hook-specific variable processors for theming hooks
+          // implemented as templates. See theme().
+          if (isset($info['template']) && function_exists($name . '_' . $phase)) {
+            $cache[$hook][$phase_key][] = $name . '_' . $phase;
+          }
+          if (function_exists($name . '_' . $phase . '_' . $hook)) {
+            $cache[$hook][$phase_key][] = $name . '_' . $phase . '_' . $hook;
+            $cache[$hook]['theme path'] = $path;
+          }
+          // Ensure uniqueness.
+          $cache[$hook][$phase_key] = array_unique($cache[$hook][$phase_key]);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Builds the theme registry cache.
+ *
+ * @param $theme
+ *   The loaded $theme object as returned by list_themes().
+ * @param $base_theme
+ *   An array of loaded $theme objects representing the ancestor themes in
+ *   oldest first order.
+ * @param $theme_engine
+ *   The name of the theme engine.
+ */
+function _theme_build_registry($theme, $base_theme, $theme_engine) {
+  $cache = array();
+  // First, process the theme hooks advertised by modules. This will
+  // serve as the basic registry. Since the list of enabled modules is the same
+  // regardless of the theme used, this is cached in its own entry to save
+  // building it for every theme.
+  if ($cached = cache_get('theme_registry:build:modules')) {
+    $cache = $cached->data;
+  }
+  else {
+    foreach (module_implements('theme') as $module) {
+      _theme_process_registry($cache, $module, 'module', $module, drupal_get_path('module', $module));
+    }
+    // Only cache this registry if all modules are loaded.
+    if (module_load_all(NULL)) {
+      cache_set('theme_registry:build:modules', $cache);
+    }
+  }
+
+  // Process each base theme.
+  foreach ($base_theme as $base) {
+    // If the base theme uses a theme engine, process its hooks.
+    $base_path = dirname($base->filename);
+    if ($theme_engine) {
+      _theme_process_registry($cache, $theme_engine, 'base_theme_engine', $base->name, $base_path);
+    }
+    _theme_process_registry($cache, $base->name, 'base_theme', $base->name, $base_path);
+  }
+
+  // And then the same thing, but for the theme.
+  if ($theme_engine) {
+    _theme_process_registry($cache, $theme_engine, 'theme_engine', $theme->name, dirname($theme->filename));
+  }
+
+  // Finally, hooks provided by the theme itself.
+  _theme_process_registry($cache, $theme->name, 'theme', $theme->name, dirname($theme->filename));
+
+  // Let modules alter the registry.
+  drupal_alter('theme_registry', $cache);
+
+  // Optimize the registry to not have empty arrays for functions.
+  foreach ($cache as $hook => $info) {
+    foreach (array('preprocess functions', 'process functions') as $phase) {
+      if (empty($info[$phase])) {
+        unset($cache[$hook][$phase]);
+      }
+    }
+  }
+  return $cache;
+}
+
+/**
+ * Returns a list of all currently available themes.
+ *
+ * Retrieved from the database, if available and the site is not in maintenance
+ * mode; otherwise compiled freshly from the filesystem.
+ *
+ * @param $refresh
+ *   Whether to reload the list of themes from the database. Defaults to FALSE.
+ *
+ * @return
+ *   An associative array of the currently available themes. The keys are the
+ *   themes' machine names and the values are objects having the following
+ *   properties:
+ *   - filename: The filepath and name of the .info file.
+ *   - name: The machine name of the theme.
+ *   - status: 1 for enabled, 0 for disabled themes.
+ *   - info: The contents of the .info file.
+ *   - stylesheets: A two dimensional array, using the first key for the
+ *     media attribute (e.g. 'all'), the second for the name of the file
+ *     (e.g. style.css). The value is a complete filepath (e.g.
+ *     themes/bartik/style.css). Not set if no stylesheets are defined in the
+ *     .info file.
+ *   - scripts: An associative array of JavaScripts, using the filename as key
+ *     and the complete filepath as value. Not set if no scripts are defined in
+ *     the .info file.
+ *   - prefix: The base theme engine prefix.
+ *   - engine: The machine name of the theme engine.
+ *   - base_theme: If this is a sub-theme, the machine name of the base theme
+ *     defined in the .info file. Otherwise, the element is not set.
+ *   - base_themes: If this is a sub-theme, an associative array of the
+ *     base-theme ancestors of this theme, starting with this theme's base
+ *     theme, then the base theme's own base theme, etc. Each entry has an
+ *     array key equal to the theme's machine name, and a value equal to the
+ *     human-readable theme name; if a theme with matching machine name does
+ *     not exist in the system, the value will instead be NULL (and since the
+ *     system would not know whether that theme itself has a base theme, that
+ *     will end the array of base themes). This is not set if the theme is not
+ *     a sub-theme.
+ *   - sub_themes: An associative array of themes on the system that are
+ *     either direct sub-themes (that is, they declare this theme to be
+ *     their base theme), direct sub-themes of sub-themes, etc. The keys are
+ *     the themes' machine names, and the values are the themes' human-readable
+ *     names. This element is not set if there are no themes on the system that
+ *     declare this theme as their base theme.
+*/
+function list_themes($refresh = FALSE) {
+  $list = &drupal_static(__FUNCTION__, array());
+
+  if ($refresh) {
+    $list = array();
+    system_list_reset();
+  }
+
+  if (empty($list)) {
+    $list = array();
+    $themes = array();
+    // Extract from the database only when it is available.
+    // Also check that the site is not in the middle of an install or update.
+    if (!defined('MAINTENANCE_MODE')) {
+      try {
+        $themes = system_list('theme');
+      }
+      catch (Exception $e) {
+        // If the database is not available, rebuild the theme data.
+        $themes = _system_rebuild_theme_data();
+      }
+    }
+    else {
+      // Scan the installation when the database should not be read.
+      $themes = _system_rebuild_theme_data();
+    }
+
+    foreach ($themes as $theme) {
+      foreach ($theme->info['stylesheets'] as $media => $stylesheets) {
+        foreach ($stylesheets as $stylesheet => $path) {
+          $theme->stylesheets[$media][$stylesheet] = $path;
+        }
+      }
+      foreach ($theme->info['scripts'] as $script => $path) {
+        $theme->scripts[$script] = $path;
+      }
+      if (isset($theme->info['engine'])) {
+        $theme->engine = $theme->info['engine'];
+      }
+      if (isset($theme->info['base theme'])) {
+        $theme->base_theme = $theme->info['base theme'];
+      }
+      // Status is normally retrieved from the database. Add zero values when
+      // read from the installation directory to prevent notices.
+      if (!isset($theme->status)) {
+        $theme->status = 0;
+      }
+      $list[$theme->name] = $theme;
+    }
+  }
+
+  return $list;
+}
+
+/**
+ * Find all the base themes for the specified theme.
+ *
+ * Themes can inherit templates and function implementations from earlier themes.
+ *
+ * @param $themes
+ *   An array of available themes.
+ * @param $key
+ *   The name of the theme whose base we are looking for.
+ * @param $used_keys
+ *   A recursion parameter preventing endless loops.
+ * @return
+ *   Returns an array of all of the theme's ancestors; the first element's value
+ *   will be NULL if an error occurred.
+ */
+function drupal_find_base_themes($themes, $key, $used_keys = array()) {
+  $base_key = $themes[$key]->info['base theme'];
+  // Does the base theme exist?
+  if (!isset($themes[$base_key])) {
+    return array($base_key => NULL);
+  }
+
+  $current_base_theme = array($base_key => $themes[$base_key]->info['name']);
+
+  // Is the base theme itself a child of another theme?
+  if (isset($themes[$base_key]->info['base theme'])) {
+    // Do we already know the base themes of this theme?
+    if (isset($themes[$base_key]->base_themes)) {
+      return $themes[$base_key]->base_themes + $current_base_theme;
+    }
+    // Prevent loops.
+    if (!empty($used_keys[$base_key])) {
+      return array($base_key => NULL);
+    }
+    $used_keys[$base_key] = TRUE;
+    return drupal_find_base_themes($themes, $base_key, $used_keys) + $current_base_theme;
+  }
+  // If we get here, then this is our parent theme.
+  return $current_base_theme;
+}
+
+/**
+ * Generates themed output.
+ *
+ * All requests for themed output must go through this function (however,
+ * calling the theme() function directly is strongly discouraged - see next
+ * paragraph). It examines the request and routes it to the appropriate
+ * @link themeable theme function or template @endlink, by checking the theme
+ * registry.
+ *
+ * Avoid calling this function directly. It is preferable to replace direct
+ * calls to the theme() function with calls to drupal_render() by passing a
+ * render array with a #theme key to drupal_render(), which in turn calls
+ * theme().
+ *
+ * @section sec_theme_hooks Theme Hooks
+ * Most commonly, the first argument to this function is the name of the theme
+ * hook. For instance, to theme a taxonomy term, the theme hook name is
+ * 'taxonomy_term'. Modules register theme hooks within a hook_theme()
+ * implementation and provide a default implementation via a function named
+ * theme_HOOK() (e.g., theme_taxonomy_term()) or via a template file named
+ * according to the value of the 'template' key registered with the theme hook
+ * (see hook_theme() for details). Default templates are implemented with the
+ * PHPTemplate rendering engine and are named the same as the theme hook, with
+ * underscores changed to hyphens, so for the 'taxonomy_term' theme hook, the
+ * default template is 'taxonomy-term.tpl.php'.
+ *
+ * @subsection sub_overriding_theme_hooks Overriding Theme Hooks
+ * Themes may also register new theme hooks within a hook_theme()
+ * implementation, but it is more common for themes to override default
+ * implementations provided by modules than to register entirely new theme
+ * hooks. Themes can override a default implementation by implementing a
+ * function named THEME_HOOK() (for example, the 'bartik' theme overrides the
+ * default implementation of the 'menu_tree' theme hook by implementing a
+ * bartik_menu_tree() function), or by adding a template file within its folder
+ * structure that follows the template naming structure used by the theme's
+ * rendering engine (for example, since the Bartik theme uses the PHPTemplate
+ * rendering engine, it overrides the default implementation of the 'page' theme
+ * hook by containing a 'page.tpl.php' file within its folder structure).
+ *
+ * @subsection sub_preprocess_templates Preprocessing for Template Files
+ * If the implementation is a template file, several functions are called
+ * before the template file is invoked, to modify the $variables array. These
+ * fall into the "preprocessing" phase and the "processing" phase, and are
+ * executed (if they exist), in the following order (note that in the following
+ * list, HOOK indicates the theme hook name, MODULE indicates a module name,
+ * THEME indicates a theme name, and ENGINE indicates a theme engine name):
+ * - template_preprocess(&$variables, $hook): Creates a default set of
+ *   variables for all theme hooks with template implementations.
+ * - template_preprocess_HOOK(&$variables): Should be implemented by the module
+ *   that registers the theme hook, to set up default variables.
+ * - MODULE_preprocess(&$variables, $hook): hook_preprocess() is invoked on all
+ *   implementing modules.
+ * - MODULE_preprocess_HOOK(&$variables): hook_preprocess_HOOK() is invoked on
+ *   all implementing modules, so that modules that didn't define the theme
+ *   hook can alter the variables.
+ * - ENGINE_engine_preprocess(&$variables, $hook): Allows the theme engine to
+ *   set necessary variables for all theme hooks with template implementations.
+ * - ENGINE_engine_preprocess_HOOK(&$variables): Allows the theme engine to set
+ *   necessary variables for the particular theme hook.
+ * - THEME_preprocess(&$variables, $hook): Allows the theme to set necessary
+ *   variables for all theme hooks with template implementations.
+ * - THEME_preprocess_HOOK(&$variables): Allows the theme to set necessary
+ *   variables specific to the particular theme hook.
+ * - template_process(&$variables, $hook): Creates an additional set of default
+ *   variables for all theme hooks with template implementations. The variables
+ *   created in this function are derived from ones created by
+ *   template_preprocess(), but potentially altered by the other preprocess
+ *   functions listed above. For example, any preprocess function can add to or
+ *   modify the $variables['attributes_array'] variable, and after all of them
+ *   have finished executing, template_process() flattens it into a
+ *   $variables['attributes'] string for convenient use by templates.
+ * - template_process_HOOK(&$variables): Should be implemented by the module
+ *   that registers the theme hook, if it needs to perform additional variable
+ *   processing after all preprocess functions have finished.
+ * - MODULE_process(&$variables, $hook): hook_process() is invoked on all
+ *   implementing modules.
+ * - MODULE_process_HOOK(&$variables): hook_process_HOOK() is invoked on
+ *   on all implementing modules, so that modules that didn't define the theme
+ *   hook can alter the variables.
+ * - ENGINE_engine_process(&$variables, $hook): Allows the theme engine to
+ *   process variables for all theme hooks with template implementations.
+ * - ENGINE_engine_process_HOOK(&$variables): Allows the theme engine to process
+ *   the variables specific to the theme hook.
+ * - THEME_process(&$variables, $hook):  Allows the theme to process the
+ *   variables for all theme hooks with template implementations.
+ * - THEME_process_HOOK(&$variables):  Allows the theme to process the
+ *   variables specific to the theme hook.
+ *
+ * @subsection sub_preprocess_theme_funcs Preprocessing for Theme Functions
+ * If the implementation is a function, only the theme-hook-specific preprocess
+ * and process functions (the ones ending in _HOOK) are called from the
+ * list above. This is because theme hooks with function implementations
+ * need to be fast, and calling the non-theme-hook-specific preprocess and
+ * process functions for them would incur a noticeable performance penalty.
+ *
+ * @subsection sub_alternate_suggestions Suggesting Alternate Hooks
+ * There are two special variables that these preprocess and process functions
+ * can set: 'theme_hook_suggestion' and 'theme_hook_suggestions'. These will be
+ * merged together to form a list of 'suggested' alternate theme hooks to use,
+ * in reverse order of priority. theme_hook_suggestion will always be a higher
+ * priority than items in theme_hook_suggestions. theme() will use the
+ * highest priority implementation that exists. If none exists, theme() will
+ * use the implementation for the theme hook it was called with. These
+ * suggestions are similar to and are used for similar reasons as calling
+ * theme() with an array as the $hook parameter (see below). The difference
+ * is whether the suggestions are determined by the code that calls theme() or
+ * by a preprocess or process function.
+ *
+ * @param $hook
+ *   The name of the theme hook to call. If the name contains a
+ *   double-underscore ('__') and there isn't an implementation for the full
+ *   name, the part before the '__' is checked. This allows a fallback to a
+ *   more generic implementation. For example, if theme('links__node', ...) is
+ *   called, but there is no implementation of that theme hook, then the
+ *   'links' implementation is used. This process is iterative, so if
+ *   theme('links__contextual__node', ...) is called, theme() checks for the
+ *   following implementations, and uses the first one that exists:
+ *   - links__contextual__node
+ *   - links__contextual
+ *   - links
+ *   This allows themes to create specific theme implementations for named
+ *   objects and contexts of otherwise generic theme hooks. The $hook parameter
+ *   may also be an array, in which case the first theme hook that has an
+ *   implementation is used. This allows for the code that calls theme() to
+ *   explicitly specify the fallback order in a situation where using the '__'
+ *   convention is not desired or is insufficient.
+ * @param $variables
+ *   An associative array of variables to merge with defaults from the theme
+ *   registry, pass to preprocess and process functions for modification, and
+ *   finally, pass to the function or template implementing the theme hook.
+ *   Alternatively, this can be a renderable array, in which case, its
+ *   properties are mapped to variables expected by the theme hook
+ *   implementations.
+ *
+ * @return
+ *   An HTML string representing the themed output.
+ *
+ * @see drupal_render()
+ * @see themeable
+ * @see hook_theme()
+ * @see template_preprocess()
+ * @see template_process()
+ */
+function theme($hook, $variables = array()) {
+  // If called before all modules are loaded, we do not necessarily have a full
+  // theme registry to work with, and therefore cannot process the theme
+  // request properly. See also _theme_load_registry().
+  if (!module_load_all(NULL) && !defined('MAINTENANCE_MODE')) {
+    throw new Exception(t('theme() may not be called until all modules are loaded.'));
+  }
+
+  $hooks = theme_get_registry(FALSE);
+
+  // If an array of hook candidates were passed, use the first one that has an
+  // implementation.
+  if (is_array($hook)) {
+    foreach ($hook as $candidate) {
+      if (isset($hooks[$candidate])) {
+        break;
+      }
+    }
+    $hook = $candidate;
+  }
+
+  // If there's no implementation, check for more generic fallbacks. If there's
+  // still no implementation, log an error and return an empty string.
+  if (!isset($hooks[$hook])) {
+    // Iteratively strip everything after the last '__' delimiter, until an
+    // implementation is found.
+    while ($pos = strrpos($hook, '__')) {
+      $hook = substr($hook, 0, $pos);
+      if (isset($hooks[$hook])) {
+        break;
+      }
+    }
+    if (!isset($hooks[$hook])) {
+      // Only log a message when not trying theme suggestions ($hook being an
+      // array).
+      if (!isset($candidate)) {
+        watchdog('theme', 'Theme hook %hook not found.', array('%hook' => $hook), WATCHDOG_WARNING);
+      }
+      return '';
+    }
+  }
+
+  $info = $hooks[$hook];
+  global $theme_path;
+  $temp = $theme_path;
+  // point path_to_theme() to the currently used theme path:
+  $theme_path = $info['theme path'];
+
+  // Include a file if the theme function or variable processor is held
+  // elsewhere.
+  if (!empty($info['includes'])) {
+    foreach ($info['includes'] as $include_file) {
+      include_once DRUPAL_ROOT . '/' . $include_file;
+    }
+  }
+
+  // If a renderable array is passed as $variables, then set $variables to
+  // the arguments expected by the theme function.
+  if (isset($variables['#theme']) || isset($variables['#theme_wrappers'])) {
+    $element = $variables;
+    $variables = array();
+    if (isset($info['variables'])) {
+      foreach (array_keys($info['variables']) as $name) {
+        if (isset($element["#$name"])) {
+          $variables[$name] = $element["#$name"];
+        }
+      }
+    }
+    else {
+      $variables[$info['render element']] = $element;
+    }
+  }
+
+  // Merge in argument defaults.
+  if (!empty($info['variables'])) {
+    $variables += $info['variables'];
+  }
+  elseif (!empty($info['render element'])) {
+    $variables += array($info['render element'] => array());
+  }
+
+  // Invoke the variable processors, if any. The processors may specify
+  // alternate suggestions for which hook's template/function to use. If the
+  // hook is a suggestion of a base hook, invoke the variable processors of
+  // the base hook, but retain the suggestion as a high priority suggestion to
+  // be used unless overridden by a variable processor function.
+  if (isset($info['base hook'])) {
+    $base_hook = $info['base hook'];
+    $base_hook_info = $hooks[$base_hook];
+    // Include files required by the base hook, since its variable processors
+    // might reside there.
+    if (!empty($base_hook_info['includes'])) {
+      foreach ($base_hook_info['includes'] as $include_file) {
+        include_once DRUPAL_ROOT . '/' . $include_file;
+      }
+    }
+    if (isset($base_hook_info['preprocess functions']) || isset($base_hook_info['process functions'])) {
+      $variables['theme_hook_suggestion'] = $hook;
+      $hook = $base_hook;
+      $info = $base_hook_info;
+    }
+  }
+  if (isset($info['preprocess functions']) || isset($info['process functions'])) {
+    $variables['theme_hook_suggestions'] = array();
+    foreach (array('preprocess functions', 'process functions') as $phase) {
+      if (!empty($info[$phase])) {
+        foreach ($info[$phase] as $processor_function) {
+          if (function_exists($processor_function)) {
+            // We don't want a poorly behaved process function changing $hook.
+            $hook_clone = $hook;
+            $processor_function($variables, $hook_clone);
+          }
+        }
+      }
+    }
+    // If the preprocess/process functions specified hook suggestions, and the
+    // suggestion exists in the theme registry, use it instead of the hook that
+    // theme() was called with. This allows the preprocess/process step to
+    // route to a more specific theme hook. For example, a function may call
+    // theme('node', ...), but a preprocess function can add 'node__article' as
+    // a suggestion, enabling a theme to have an alternate template file for
+    // article nodes. Suggestions are checked in the following order:
+    // - The 'theme_hook_suggestion' variable is checked first. It overrides
+    //   all others.
+    // - The 'theme_hook_suggestions' variable is checked in FILO order, so the
+    //   last suggestion added to the array takes precedence over suggestions
+    //   added earlier.
+    $suggestions = array();
+    if (!empty($variables['theme_hook_suggestions'])) {
+      $suggestions = $variables['theme_hook_suggestions'];
+    }
+    if (!empty($variables['theme_hook_suggestion'])) {
+      $suggestions[] = $variables['theme_hook_suggestion'];
+    }
+    foreach (array_reverse($suggestions) as $suggestion) {
+      if (isset($hooks[$suggestion])) {
+        $info = $hooks[$suggestion];
+        break;
+      }
+    }
+  }
+
+  // Generate the output using either a function or a template.
+  $output = '';
+  if (isset($info['function'])) {
+    if (function_exists($info['function'])) {
+      $output = $info['function']($variables);
+    }
+  }
+  else {
+    // Default render function and extension.
+    $render_function = 'theme_render_template';
+    $extension = '.tpl.php';
+
+    // The theme engine may use a different extension and a different renderer.
+    global $theme_engine;
+    if (isset($theme_engine)) {
+      if ($info['type'] != 'module') {
+        if (function_exists($theme_engine . '_render_template')) {
+          $render_function = $theme_engine . '_render_template';
+        }
+        $extension_function = $theme_engine . '_extension';
+        if (function_exists($extension_function)) {
+          $extension = $extension_function();
+        }
+      }
+    }
+
+    // In some cases, a template implementation may not have had
+    // template_preprocess() run (for example, if the default implementation is
+    // a function, but a template overrides that default implementation). In
+    // these cases, a template should still be able to expect to have access to
+    // the variables provided by template_preprocess(), so we add them here if
+    // they don't already exist. We don't want to run template_preprocess()
+    // twice (it would be inefficient and mess up zebra striping), so we use the
+    // 'directory' variable to determine if it has already run, which while not
+    // completely intuitive, is reasonably safe, and allows us to save on the
+    // overhead of adding some new variable to track that.
+    if (!isset($variables['directory'])) {
+      $default_template_variables = array();
+      template_preprocess($default_template_variables, $hook);
+      $variables += $default_template_variables;
+    }
+
+    // Render the output using the template file.
+    $template_file = $info['template'] . $extension;
+    if (isset($info['path'])) {
+      $template_file = $info['path'] . '/' . $template_file;
+    }
+    $output = $render_function($template_file, $variables);
+  }
+
+  // restore path_to_theme()
+  $theme_path = $temp;
+  return $output;
+}
+
+/**
+ * Returns the path to the current themed element.
+ *
+ * It can point to the active theme or the module handling a themed
+ * implementation. For example, when invoked within the scope of a theming call
+ * it will depend on where the theming function is handled. If implemented from
+ * a module, it will point to the module. If implemented from the active theme,
+ * it will point to the active theme. When called outside the scope of a
+ * theming call, it will always point to the active theme.
+ */
+function path_to_theme() {
+  global $theme_path;
+
+  if (!isset($theme_path)) {
+    drupal_theme_initialize();
+  }
+
+  return $theme_path;
+}
+
+/**
+ * Allows themes and/or theme engines to discover overridden theme functions.
+ *
+ * @param $cache
+ *   The existing cache of theme hooks to test against.
+ * @param $prefixes
+ *   An array of prefixes to test, in reverse order of importance.
+ *
+ * @return $implementations
+ *   The functions found, suitable for returning from hook_theme;
+ */
+function drupal_find_theme_functions($cache, $prefixes) {
+  $implementations = array();
+  $functions = get_defined_functions();
+
+  foreach ($cache as $hook => $info) {
+    foreach ($prefixes as $prefix) {
+      // Find theme functions that implement possible "suggestion" variants of
+      // registered theme hooks and add those as new registered theme hooks.
+      // The 'pattern' key defines a common prefix that all suggestions must
+      // start with. The default is the name of the hook followed by '__'. An
+      // 'base hook' key is added to each entry made for a found suggestion,
+      // so that common functionality can be implemented for all suggestions of
+      // the same base hook. To keep things simple, deep hierarchy of
+      // suggestions is not supported: each suggestion's 'base hook' key
+      // refers to a base hook, not to another suggestion, and all suggestions
+      // are found using the base hook's pattern, not a pattern from an
+      // intermediary suggestion.
+      $pattern = isset($info['pattern']) ? $info['pattern'] : ($hook . '__');
+      if (!isset($info['base hook']) && !empty($pattern)) {
+        $matches = preg_grep('/^' . $prefix . '_' . $pattern . '/', $functions['user']);
+        if ($matches) {
+          foreach ($matches as $match) {
+            $new_hook = substr($match, strlen($prefix) + 1);
+            $arg_name = isset($info['variables']) ? 'variables' : 'render element';
+            $implementations[$new_hook] = array(
+              'function' => $match,
+              $arg_name => $info[$arg_name],
+              'base hook' => $hook,
+            );
+          }
+        }
+      }
+      // Find theme functions that implement registered theme hooks and include
+      // that in what is returned so that the registry knows that the theme has
+      // this implementation.
+      if (function_exists($prefix . '_' . $hook)) {
+        $implementations[$hook] = array(
+          'function' => $prefix . '_' . $hook,
+        );
+      }
+    }
+  }
+
+  return $implementations;
+}
+
+/**
+ * Allows themes and/or theme engines to easily discover overridden templates.
+ *
+ * @param $cache
+ *   The existing cache of theme hooks to test against.
+ * @param $extension
+ *   The extension that these templates will have.
+ * @param $path
+ *   The path to search.
+ */
+function drupal_find_theme_templates($cache, $extension, $path) {
+  $implementations = array();
+
+  // Collect paths to all sub-themes grouped by base themes. These will be
+  // used for filtering. This allows base themes to have sub-themes in its
+  // folder hierarchy without affecting the base themes template discovery.
+  $theme_paths = array();
+  foreach (list_themes() as $theme_info) {
+    if (!empty($theme_info->base_theme)) {
+      $theme_paths[$theme_info->base_theme][$theme_info->name] = dirname($theme_info->filename);
+    }
+  }
+  foreach ($theme_paths as $basetheme => $subthemes) {
+    foreach ($subthemes as $subtheme => $subtheme_path) {
+      if (isset($theme_paths[$subtheme])) {
+        $theme_paths[$basetheme] = array_merge($theme_paths[$basetheme], $theme_paths[$subtheme]);
+      }
+    }
+  }
+  global $theme;
+  $subtheme_paths = isset($theme_paths[$theme]) ? $theme_paths[$theme] : array();
+
+  // Escape the periods in the extension.
+  $regex = '/' . str_replace('.', '\.', $extension) . '$/';
+  // Get a listing of all template files in the path to search.
+  $files = drupal_system_listing($regex, $path, 'name', 0);
+
+  // Find templates that implement registered theme hooks and include that in
+  // what is returned so that the registry knows that the theme has this
+  // implementation.
+  foreach ($files as $template => $file) {
+    // Ignore sub-theme templates for the current theme.
+    if (strpos($file->uri, str_replace($subtheme_paths, '', $file->uri)) !== 0) {
+      continue;
+    }
+    // Chop off the remaining extensions if there are any. $template already
+    // has the rightmost extension removed, but there might still be more,
+    // such as with .tpl.php, which still has .tpl in $template at this point.
+    if (($pos = strpos($template, '.')) !== FALSE) {
+      $template = substr($template, 0, $pos);
+    }
+    // Transform - in filenames to _ to match function naming scheme
+    // for the purposes of searching.
+    $hook = strtr($template, '-', '_');
+    if (isset($cache[$hook])) {
+      $implementations[$hook] = array(
+        'template' => $template,
+        'path' => dirname($file->uri),
+      );
+    }
+  }
+
+  // Find templates that implement possible "suggestion" variants of registered
+  // theme hooks and add those as new registered theme hooks. See
+  // drupal_find_theme_functions() for more information about suggestions and
+  // the use of 'pattern' and 'base hook'.
+  $patterns = array_keys($files);
+  foreach ($cache as $hook => $info) {
+    $pattern = isset($info['pattern']) ? $info['pattern'] : ($hook . '__');
+    if (!isset($info['base hook']) && !empty($pattern)) {
+      // Transform _ in pattern to - to match file naming scheme
+      // for the purposes of searching.
+      $pattern = strtr($pattern, '_', '-');
+
+      $matches = preg_grep('/^' . $pattern . '/', $patterns);
+      if ($matches) {
+        foreach ($matches as $match) {
+          $file = substr($match, 0, strpos($match, '.'));
+          // Put the underscores back in for the hook name and register this
+          // pattern.
+          $arg_name = isset($info['variables']) ? 'variables' : 'render element';
+          $implementations[strtr($file, '-', '_')] = array(
+            'template' => $file,
+            'path' => dirname($files[$match]->uri),
+            $arg_name => $info[$arg_name],
+            'base hook' => $hook,
+          );
+        }
+      }
+    }
+  }
+  return $implementations;
+}
+
+/**
+ * Retrieves a setting for the current theme or for a given theme.
+ *
+ * The final setting is obtained from the last value found in the following
+ * sources:
+ * - the default global settings specified in this function
+ * - the default theme-specific settings defined in any base theme's .info file
+ * - the default theme-specific settings defined in the theme's .info file
+ * - the saved values from the global theme settings form
+ * - the saved values from the theme's settings form
+ * To only retrieve the default global theme setting, an empty string should be
+ * given for $theme.
+ *
+ * @param $setting_name
+ *   The name of the setting to be retrieved.
+ * @param $theme
+ *   The name of a given theme; defaults to the current theme.
+ *
+ * @return
+ *   The value of the requested setting, NULL if the setting does not exist.
+ */
+function theme_get_setting($setting_name, $theme = NULL) {
+  $cache = &drupal_static(__FUNCTION__, array());
+
+  // If no key is given, use the current theme if we can determine it.
+  if (!isset($theme)) {
+    $theme = !empty($GLOBALS['theme_key']) ? $GLOBALS['theme_key'] : '';
+  }
+
+  if (empty($cache[$theme])) {
+    // Set the default values for each global setting.
+    // To add new global settings, add their default values below, and then
+    // add form elements to system_theme_settings() in system.admin.inc.
+    $cache[$theme] = array(
+      'default_logo'                     =>  1,
+      'logo_path'                        =>  '',
+      'default_favicon'                  =>  1,
+      'favicon_path'                     =>  '',
+      // Use the IANA-registered MIME type for ICO files as default.
+      'favicon_mimetype'                 =>  'image/vnd.microsoft.icon',
+    );
+    // Turn on all default features.
+    $features = _system_default_theme_features();
+    foreach ($features as $feature) {
+      $cache[$theme]['toggle_' . $feature] = 1;
+    }
+
+    // Get the values for the theme-specific settings from the .info files of
+    // the theme and all its base themes.
+    if ($theme) {
+      $themes = list_themes();
+      $theme_object = $themes[$theme];
+
+      // Create a list which includes the current theme and all its base themes.
+      if (isset($theme_object->base_themes)) {
+        $theme_keys = array_keys($theme_object->base_themes);
+        $theme_keys[] = $theme;
+      }
+      else {
+        $theme_keys = array($theme);
+      }
+      foreach ($theme_keys as $theme_key) {
+        if (!empty($themes[$theme_key]->info['settings'])) {
+          $cache[$theme] = array_merge($cache[$theme], $themes[$theme_key]->info['settings']);
+        }
+      }
+    }
+
+    // Get the saved global settings from the database.
+    $cache[$theme] = array_merge($cache[$theme], variable_get('theme_settings', array()));
+
+    if ($theme) {
+      // Get the saved theme-specific settings from the database.
+      $cache[$theme] = array_merge($cache[$theme], variable_get('theme_' . $theme . '_settings', array()));
+
+      // If the theme does not support a particular feature, override the global
+      // setting and set the value to NULL.
+      if (!empty($theme_object->info['features'])) {
+        foreach ($features as $feature) {
+          if (!in_array($feature, $theme_object->info['features'])) {
+            $cache[$theme]['toggle_' . $feature] = NULL;
+          }
+        }
+      }
+
+      // Generate the path to the logo image.
+      if ($cache[$theme]['toggle_logo']) {
+        if ($cache[$theme]['default_logo']) {
+          $cache[$theme]['logo'] = file_create_url(dirname($theme_object->filename) . '/logo.png');
+        }
+        elseif ($cache[$theme]['logo_path']) {
+          $cache[$theme]['logo'] = file_create_url($cache[$theme]['logo_path']);
+        }
+      }
+
+      // Generate the path to the favicon.
+      if ($cache[$theme]['toggle_favicon']) {
+        if ($cache[$theme]['default_favicon']) {
+          if (file_exists($favicon = dirname($theme_object->filename) . '/favicon.ico')) {
+            $cache[$theme]['favicon'] = file_create_url($favicon);
+          }
+          else {
+            $cache[$theme]['favicon'] = file_create_url('misc/favicon.ico');
+          }
+        }
+        elseif ($cache[$theme]['favicon_path']) {
+          $cache[$theme]['favicon'] = file_create_url($cache[$theme]['favicon_path']);
+        }
+        else {
+          $cache[$theme]['toggle_favicon'] = FALSE;
+        }
+      }
+    }
+  }
+
+  return isset($cache[$theme][$setting_name]) ? $cache[$theme][$setting_name] : NULL;
+}
+
+/**
+ * Renders a system default template, which is essentially a PHP template.
+ *
+ * @param $template_file
+ *   The filename of the template to render.
+ * @param $variables
+ *   A keyed array of variables that will appear in the output.
+ *
+ * @return
+ *   The output generated by the template.
+ */
+function theme_render_template($template_file, $variables) {
+  // Extract the variables to a local namespace
+  extract($variables, EXTR_SKIP);
+
+  // Start output buffering
+  ob_start();
+
+  // Include the template file
+  include DRUPAL_ROOT . '/' . $template_file;
+
+  // End buffering and return its contents
+  return ob_get_clean();
+}
+
+/**
+ * Enables a given list of themes.
+ *
+ * @param $theme_list
+ *   An array of theme names.
+ */
+function theme_enable($theme_list) {
+  drupal_clear_css_cache();
+
+  foreach ($theme_list as $key) {
+    db_update('system')
+      ->fields(array('status' => 1))
+      ->condition('type', 'theme')
+      ->condition('name', $key)
+      ->execute();
+  }
+
+  list_themes(TRUE);
+  menu_rebuild();
+  drupal_theme_rebuild();
+
+  // Invoke hook_themes_enabled() after the themes have been enabled.
+  module_invoke_all('themes_enabled', $theme_list);
+}
+
+/**
+ * Disables a given list of themes.
+ *
+ * @param $theme_list
+ *   An array of theme names.
+ */
+function theme_disable($theme_list) {
+  // Don't disable the default theme.
+  if ($pos = array_search(variable_get('theme_default', 'bartik'), $theme_list) !== FALSE) {
+    unset($theme_list[$pos]);
+    if (empty($theme_list)) {
+      return;
+    }
+  }
+
+  drupal_clear_css_cache();
+
+  foreach ($theme_list as $key) {
+    db_update('system')
+      ->fields(array('status' => 0))
+      ->condition('type', 'theme')
+      ->condition('name', $key)
+      ->execute();
+  }
+
+  list_themes(TRUE);
+  menu_rebuild();
+  drupal_theme_rebuild();
+
+  // Invoke hook_themes_disabled after the themes have been disabled.
+  module_invoke_all('themes_disabled', $theme_list);
+}
+
+/**
+ * @addtogroup themeable
+ * @{
+ */
+
+/**
+ * Returns HTML for status and/or error messages, grouped by type.
+ *
+ * An invisible heading identifies the messages for assistive technology.
+ * Sighted users see a colored box. See http://www.w3.org/TR/WCAG-TECHS/H69.html
+ * for info.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - display: (optional) Set to 'status' or 'error' to display only messages
+ *     of that type.
+ */
+function theme_status_messages($variables) {
+  $display = $variables['display'];
+  $output = '';
+
+  $status_heading = array(
+    'status' => t('Status message'),
+    'error' => t('Error message'),
+    'warning' => t('Warning message'),
+  );
+  foreach (drupal_get_messages($display) as $type => $messages) {
+    $output .= "<div class=\"messages $type\">\n";
+    if (!empty($status_heading[$type])) {
+      $output .= '<h2 class="element-invisible">' . $status_heading[$type] . "</h2>\n";
+    }
+    if (count($messages) > 1) {
+      $output .= " <ul>\n";
+      foreach ($messages as $message) {
+        $output .= '  <li>' . $message . "</li>\n";
+      }
+      $output .= " </ul>\n";
+    }
+    else {
+      $output .= $messages[0];
+    }
+    $output .= "</div>\n";
+  }
+  return $output;
+}
+
+/**
+ * Returns HTML for a link.
+ *
+ * All Drupal code that outputs a link should call the l() function. That
+ * function performs some initial preprocessing, and then, if necessary, calls
+ * theme('link') for rendering the anchor tag.
+ *
+ * To optimize performance for sites that don't need custom theming of links,
+ * the l() function includes an inline copy of this function, and uses that
+ * copy if none of the enabled modules or the active theme implement any
+ * preprocess or process functions or override this theme implementation.
+ *
+ * @param $variables
+ *   An associative array containing the keys 'text', 'path', and 'options'.
+ *   See the l() function for information about these variables.
+ *
+ * @see l()
+ */
+function theme_link($variables) {
+  return '<a href="' . check_plain(url($variables['path'], $variables['options'])) . '"' . drupal_attributes($variables['options']['attributes']) . '>' . ($variables['options']['html'] ? $variables['text'] : check_plain($variables['text'])) . '</a>';
+}
+
+/**
+ * Returns HTML for a set of links.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - links: An associative array of links to be themed. The key for each link
+ *     is used as its CSS class. Each link should be itself an array, with the
+ *     following elements:
+ *     - title: The link text.
+ *     - href: The link URL. If omitted, the 'title' is shown as a plain text
+ *       item in the links list.
+ *     - html: (optional) Whether or not 'title' is HTML. If set, the title
+ *       will not be passed through check_plain().
+ *     - attributes: (optional) Attributes for the anchor, or for the <span>
+ *       tag used in its place if no 'href' is supplied. If element 'class' is
+ *       included, it must be an array of one or more class names.
+ *     If the 'href' element is supplied, the entire link array is passed to
+ *     l() as its $options parameter.
+ *   - attributes: A keyed array of attributes for the UL containing the
+ *     list of links.
+ *   - heading: (optional) A heading to precede the links. May be an
+ *     associative array or a string. If it's an array, it can have the
+ *     following elements:
+ *     - text: The heading text.
+ *     - level: The heading level (e.g. 'h2', 'h3').
+ *     - class: (optional) An array of the CSS classes for the heading.
+ *     When using a string it will be used as the text of the heading and the
+ *     level will default to 'h2'. Headings should be used on navigation menus
+ *     and any list of links that consistently appears on multiple pages. To
+ *     make the heading invisible use the 'element-invisible' CSS class. Do not
+ *     use 'display:none', which removes it from screen-readers and assistive
+ *     technology. Headings allow screen-reader and keyboard only users to
+ *     navigate to or skip the links. See
+ *     http://juicystudio.com/article/screen-readers-display-none.php and
+ *     http://www.w3.org/TR/WCAG-TECHS/H42.html for more information.
+ */
+function theme_links($variables) {
+  $links = $variables['links'];
+  $attributes = $variables['attributes'];
+  $heading = $variables['heading'];
+  global $language_url;
+  $output = '';
+
+  if (count($links) > 0) {
+    $output = '';
+
+    // Treat the heading first if it is present to prepend it to the
+    // list of links.
+    if (!empty($heading)) {
+      if (is_string($heading)) {
+        // Prepare the array that will be used when the passed heading
+        // is a string.
+        $heading = array(
+          'text' => $heading,
+          // Set the default level of the heading.
+          'level' => 'h2',
+        );
+      }
+      $output .= '<' . $heading['level'];
+      if (!empty($heading['class'])) {
+        $output .= drupal_attributes(array('class' => $heading['class']));
+      }
+      $output .= '>' . check_plain($heading['text']) . '</' . $heading['level'] . '>';
+    }
+
+    $output .= '<ul' . drupal_attributes($attributes) . '>';
+
+    $num_links = count($links);
+    $i = 1;
+
+    foreach ($links as $key => $link) {
+      $class = array($key);
+
+      // Add first, last and active classes to the list of links to help out themers.
+      if ($i == 1) {
+        $class[] = 'first';
+      }
+      if ($i == $num_links) {
+        $class[] = 'last';
+      }
+      if (isset($link['href']) && ($link['href'] == $_GET['q'] || ($link['href'] == '<front>' && drupal_is_front_page()))
+          && (empty($link['language']) || $link['language']->language == $language_url->language)) {
+        $class[] = 'active';
+      }
+      $output .= '<li' . drupal_attributes(array('class' => $class)) . '>';
+
+      if (isset($link['href'])) {
+        // Pass in $link as $options, they share the same keys.
+        $output .= l($link['title'], $link['href'], $link);
+      }
+      elseif (!empty($link['title'])) {
+        // Some links are actually not links, but we wrap these in <span> for adding title and class attributes.
+        if (empty($link['html'])) {
+          $link['title'] = check_plain($link['title']);
+        }
+        $span_attributes = '';
+        if (isset($link['attributes'])) {
+          $span_attributes = drupal_attributes($link['attributes']);
+        }
+        $output .= '<span' . $span_attributes . '>' . $link['title'] . '</span>';
+      }
+
+      $i++;
+      $output .= "</li>\n";
+    }
+
+    $output .= '</ul>';
+  }
+
+  return $output;
+}
+
+/**
+ * Returns HTML for an image.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - path: Either the path of the image file (relative to base_path()) or a
+ *     full URL.
+ *   - width: The width of the image (if known).
+ *   - height: The height of the image (if known).
+ *   - alt: The alternative text for text-based browsers. HTML 4 and XHTML 1.0
+ *     always require an alt attribute. The HTML 5 draft allows the alt
+ *     attribute to be omitted in some cases. Therefore, this variable defaults
+ *     to an empty string, but can be set to NULL for the attribute to be
+ *     omitted. Usually, neither omission nor an empty string satisfies
+ *     accessibility requirements, so it is strongly encouraged for code
+ *     calling theme('image') to pass a meaningful value for this variable.
+ *     - http://www.w3.org/TR/REC-html40/struct/objects.html#h-13.8
+ *     - http://www.w3.org/TR/xhtml1/dtds.html
+ *     - http://dev.w3.org/html5/spec/Overview.html#alt
+ *   - title: The title text is displayed when the image is hovered in some
+ *     popular browsers.
+ *   - attributes: Associative array of attributes to be placed in the img tag.
+ */
+function theme_image($variables) {
+  $attributes = $variables['attributes'];
+  $attributes['src'] = file_create_url($variables['path']);
+
+  foreach (array('width', 'height', 'alt', 'title') as $key) {
+
+    if (isset($variables[$key])) {
+      $attributes[$key] = $variables[$key];
+    }
+  }
+
+  return '<img' . drupal_attributes($attributes) . ' />';
+}
+
+/**
+ * Returns HTML for a breadcrumb trail.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - breadcrumb: An array containing the breadcrumb links.
+ */
+function theme_breadcrumb($variables) {
+  $breadcrumb = $variables['breadcrumb'];
+
+  if (!empty($breadcrumb)) {
+    // Provide a navigational heading to give context for breadcrumb links to
+    // screen-reader users. Make the heading invisible with .element-invisible.
+    $output = '<h2 class="element-invisible">' . t('You are here') . '</h2>';
+
+    $output .= '<div class="breadcrumb">' . implode(' » ', $breadcrumb) . '</div>';
+    return $output;
+  }
+}
+
+/**
+ * Returns HTML for a table.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - header: An array containing the table headers. Each element of the array
+ *     can be either a localized string or an associative array with the
+ *     following keys:
+ *     - "data": The localized title of the table column.
+ *     - "field": The database field represented in the table column (required
+ *       if user is to be able to sort on this column).
+ *     - "sort": A default sort order for this column ("asc" or "desc"). Only
+ *       one column should be given a default sort order because table sorting
+ *       only applies to one column at a time.
+ *     - Any HTML attributes, such as "colspan", to apply to the column header
+ *       cell.
+ *   - rows: An array of table rows. Every row is an array of cells, or an
+ *     associative array with the following keys:
+ *     - "data": an array of cells
+ *     - Any HTML attributes, such as "class", to apply to the table row.
+ *     - "no_striping": a boolean indicating that the row should receive no
+ *       'even / odd' styling. Defaults to FALSE.
+ *     Each cell can be either a string or an associative array with the
+ *     following keys:
+ *     - "data": The string to display in the table cell.
+ *     - "header": Indicates this cell is a header.
+ *     - Any HTML attributes, such as "colspan", to apply to the table cell.
+ *     Here's an example for $rows:
+ *     @code
+ *     $rows = array(
+ *       // Simple row
+ *       array(
+ *         'Cell 1', 'Cell 2', 'Cell 3'
+ *       ),
+ *       // Row with attributes on the row and some of its cells.
+ *       array(
+ *         'data' => array('Cell 1', array('data' => 'Cell 2', 'colspan' => 2)), 'class' => array('funky')
+ *       )
+ *     );
+ *     @endcode
+ *   - attributes: An array of HTML attributes to apply to the table tag.
+ *   - caption: A localized string to use for the <caption> tag.
+ *   - colgroups: An array of column groups. Each element of the array can be
+ *     either:
+ *     - An array of columns, each of which is an associative array of HTML
+ *       attributes applied to the COL element.
+ *     - An array of attributes applied to the COLGROUP element, which must
+ *       include a "data" attribute. To add attributes to COL elements, set the
+ *       "data" attribute with an array of columns, each of which is an
+ *       associative array of HTML attributes.
+ *     Here's an example for $colgroup:
+ *     @code
+ *     $colgroup = array(
+ *       // COLGROUP with one COL element.
+ *       array(
+ *         array(
+ *           'class' => array('funky'), // Attribute for the COL element.
+ *         ),
+ *       ),
+ *       // Colgroup with attributes and inner COL elements.
+ *       array(
+ *         'data' => array(
+ *           array(
+ *             'class' => array('funky'), // Attribute for the COL element.
+ *           ),
+ *         ),
+ *         'class' => array('jazzy'), // Attribute for the COLGROUP element.
+ *       ),
+ *     );
+ *     @endcode
+ *     These optional tags are used to group and set properties on columns
+ *     within a table. For example, one may easily group three columns and
+ *     apply same background style to all.
+ *   - sticky: Use a "sticky" table header.
+ *   - empty: The message to display in an extra row if table does not have any
+ *     rows.
+ */
+function theme_table($variables) {
+  $header = $variables['header'];
+  $rows = $variables['rows'];
+  $attributes = $variables['attributes'];
+  $caption = $variables['caption'];
+  $colgroups = $variables['colgroups'];
+  $sticky = $variables['sticky'];
+  $empty = $variables['empty'];
+
+  // Add sticky headers, if applicable.
+  if (count($header) && $sticky) {
+    drupal_add_js('misc/tableheader.js');
+    // Add 'sticky-enabled' class to the table to identify it for JS.
+    // This is needed to target tables constructed by this function.
+    $attributes['class'][] = 'sticky-enabled';
+  }
+
+  $output = '<table' . drupal_attributes($attributes) . ">\n";
+
+  if (isset($caption)) {
+    $output .= '<caption>' . $caption . "</caption>\n";
+  }
+
+  // Format the table columns:
+  if (count($colgroups)) {
+    foreach ($colgroups as $number => $colgroup) {
+      $attributes = array();
+
+      // Check if we're dealing with a simple or complex column
+      if (isset($colgroup['data'])) {
+        foreach ($colgroup as $key => $value) {
+          if ($key == 'data') {
+            $cols = $value;
+          }
+          else {
+            $attributes[$key] = $value;
+          }
+        }
+      }
+      else {
+        $cols = $colgroup;
+      }
+
+      // Build colgroup
+      if (is_array($cols) && count($cols)) {
+        $output .= ' <colgroup' . drupal_attributes($attributes) . '>';
+        $i = 0;
+        foreach ($cols as $col) {
+          $output .= ' <col' . drupal_attributes($col) . ' />';
+        }
+        $output .= " </colgroup>\n";
+      }
+      else {
+        $output .= ' <colgroup' . drupal_attributes($attributes) . " />\n";
+      }
+    }
+  }
+
+  // Add the 'empty' row message if available.
+  if (!count($rows) && $empty) {
+    $header_count = 0;
+    foreach ($header as $header_cell) {
+      if (is_array($header_cell)) {
+        $header_count += isset($header_cell['colspan']) ? $header_cell['colspan'] : 1;
+      }
+      else {
+        $header_count++;
+      }
+    }
+    $rows[] = array(array('data' => $empty, 'colspan' => $header_count, 'class' => array('empty', 'message')));
+  }
+
+  // Format the table header:
+  if (count($header)) {
+    $ts = tablesort_init($header);
+    // HTML requires that the thead tag has tr tags in it followed by tbody
+    // tags. Using ternary operator to check and see if we have any rows.
+    $output .= (count($rows) ? ' <thead><tr>' : ' <tr>');
+    foreach ($header as $cell) {
+      $cell = tablesort_header($cell, $header, $ts);
+      $output .= _theme_table_cell($cell, TRUE);
+    }
+    // Using ternary operator to close the tags based on whether or not there are rows
+    $output .= (count($rows) ? " </tr></thead>\n" : "</tr>\n");
+  }
+  else {
+    $ts = array();
+  }
+
+  // Format the table rows:
+  if (count($rows)) {
+    $output .= "<tbody>\n";
+    $flip = array('even' => 'odd', 'odd' => 'even');
+    $class = 'even';
+    foreach ($rows as $number => $row) {
+      // Check if we're dealing with a simple or complex row
+      if (isset($row['data'])) {
+        $cells = $row['data'];
+        $no_striping = isset($row['no_striping']) ? $row['no_striping'] : FALSE;
+
+        // Set the attributes array and exclude 'data' and 'no_striping'.
+        $attributes = $row;
+        unset($attributes['data']);
+        unset($attributes['no_striping']);
+      }
+      else {
+        $cells = $row;
+        $attributes = array();
+        $no_striping = FALSE;
+      }
+      if (count($cells)) {
+        // Add odd/even class
+        if (!$no_striping) {
+          $class = $flip[$class];
+          $attributes['class'][] = $class;
+        }
+
+        // Build row
+        $output .= ' <tr' . drupal_attributes($attributes) . '>';
+        $i = 0;
+        foreach ($cells as $cell) {
+          $cell = tablesort_cell($cell, $header, $ts, $i++);
+          $output .= _theme_table_cell($cell);
+        }
+        $output .= " </tr>\n";
+      }
+    }
+    $output .= "</tbody>\n";
+  }
+
+  $output .= "</table>\n";
+  return $output;
+}
+
+/**
+ * Returns HTML for a sort icon.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - style: Set to either 'asc' or 'desc', this determines which icon to
+ *     show.
+ */
+function theme_tablesort_indicator($variables) {
+  if ($variables['style'] == "asc") {
+    return theme('image', array('path' => 'misc/arrow-asc.png', 'width' => 13, 'height' => 13, 'alt' => t('sort ascending'), 'title' => t('sort ascending')));
+  }
+  else {
+    return theme('image', array('path' => 'misc/arrow-desc.png', 'width' => 13, 'height' => 13, 'alt' => t('sort descending'), 'title' => t('sort descending')));
+  }
+}
+
+/**
+ * Returns HTML for a marker for new or updated content.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - type: Number representing the marker type to display. See MARK_NEW,
+ *     MARK_UPDATED, MARK_READ.
+ */
+function theme_mark($variables) {
+  $type = $variables['type'];
+  global $user;
+  if ($user->uid) {
+    if ($type == MARK_NEW) {
+      return ' <span class="marker">' . t('new') . '</span>';
+    }
+    elseif ($type == MARK_UPDATED) {
+      return ' <span class="marker">' . t('updated') . '</span>';
+    }
+  }
+}
+
+/**
+ * Returns HTML for a list or nested list of items.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - items: An array of items to be displayed in the list. If an item is a
+ *     string, then it is used as is. If an item is an array, then the "data"
+ *     element of the array is used as the contents of the list item. If an item
+ *     is an array with a "children" element, those children are displayed in a
+ *     nested list. All other elements are treated as attributes of the list
+ *     item element.
+ *   - title: The title of the list.
+ *   - type: The type of list to return (e.g. "ul", "ol").
+ *   - attributes: The attributes applied to the list element.
+ */
+function theme_item_list($variables) {
+  $items = $variables['items'];
+  $title = $variables['title'];
+  $type = $variables['type'];
+  $attributes = $variables['attributes'];
+
+  // Only output the list container and title, if there are any list items.
+  // Check to see whether the block title exists before adding a header.
+  // Empty headers are not semantic and present accessibility challenges.
+  $output = '<div class="item-list">';
+  if (isset($title) && $title !== '') {
+    $output .= '<h3>' . $title . '</h3>';
+  }
+
+  if (!empty($items)) {
+    $output .= "<$type" . drupal_attributes($attributes) . '>';
+    $num_items = count($items);
+    $i = 0;
+    foreach ($items as $item) {
+      $attributes = array();
+      $children = array();
+      $data = '';
+      $i++;
+      if (is_array($item)) {
+        foreach ($item as $key => $value) {
+          if ($key == 'data') {
+            $data = $value;
+          }
+          elseif ($key == 'children') {
+            $children = $value;
+          }
+          else {
+            $attributes[$key] = $value;
+          }
+        }
+      }
+      else {
+        $data = $item;
+      }
+      if (count($children) > 0) {
+        // Render nested list.
+        $data .= theme_item_list(array('items' => $children, 'title' => NULL, 'type' => $type, 'attributes' => $attributes));
+      }
+      if ($i == 1) {
+        $attributes['class'][] = 'first';
+      }
+      if ($i == $num_items) {
+        $attributes['class'][] = 'last';
+      }
+      $output .= '<li' . drupal_attributes($attributes) . '>' . $data . "</li>\n";
+    }
+    $output .= "</$type>";
+  }
+  $output .= '</div>';
+  return $output;
+}
+
+/**
+ * Returns HTML for a "more help" link.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - url: The URL for the link.
+ */
+function theme_more_help_link($variables) {
+  return '<div class="more-help-link">' . l(t('More help'), $variables['url']) . '</div>';
+}
+
+/**
+ * Returns HTML for a feed icon.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - url: An internal system path or a fully qualified external URL of the
+ *     feed.
+ *   - title: A descriptive title of the feed.
+ */
+function theme_feed_icon($variables) {
+  $text = t('Subscribe to !feed-title', array('!feed-title' => $variables['title']));
+  if ($image = theme('image', array('path' => 'misc/feed.png', 'width' => 16, 'height' => 16, 'alt' => $text))) {
+    return l($image, $variables['url'], array('html' => TRUE, 'attributes' => array('class' => array('feed-icon'), 'title' => $text)));
+  }
+}
+
+/**
+ * Returns HTML for a generic HTML tag with attributes.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: An associative array describing the tag:
+ *     - #tag: The tag name to output. Typical tags added to the HTML HEAD:
+ *       - meta: To provide meta information, such as a page refresh.
+ *       - link: To refer to stylesheets and other contextual information.
+ *       - script: To load JavaScript.
+ *     - #attributes: (optional) An array of HTML attributes to apply to the
+ *       tag.
+ *     - #value: (optional) A string containing tag content, such as inline
+ *       CSS.
+ *     - #value_prefix: (optional) A string to prepend to #value, e.g. a CDATA
+ *       wrapper prefix.
+ *     - #value_suffix: (optional) A string to append to #value, e.g. a CDATA
+ *       wrapper suffix.
+ */
+function theme_html_tag($variables) {
+  $element = $variables['element'];
+  $attributes = isset($element['#attributes']) ? drupal_attributes($element['#attributes']) : '';
+  if (!isset($element['#value'])) {
+    return '<' . $element['#tag'] . $attributes . " />\n";
+  }
+  else {
+    $output = '<' . $element['#tag'] . $attributes . '>';
+    if (isset($element['#value_prefix'])) {
+      $output .= $element['#value_prefix'];
+    }
+    $output .= $element['#value'];
+    if (isset($element['#value_suffix'])) {
+      $output .= $element['#value_suffix'];
+    }
+    $output .= '</' . $element['#tag'] . ">\n";
+    return $output;
+  }
+}
+
+/**
+ * Returns HTML for a "more" link, like those used in blocks.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - url: The URL of the main page.
+ *   - title: A descriptive verb for the link, like 'Read more'.
+ */
+function theme_more_link($variables) {
+  return '<div class="more-link">' . l(t('More'), $variables['url'], array('attributes' => array('title' => $variables['title']))) . '</div>';
+}
+
+/**
+ * Returns HTML for a username, potentially linked to the user's page.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - account: The user object to format.
+ *   - name: The user's name, sanitized.
+ *   - extra: Additional text to append to the user's name, sanitized.
+ *   - link_path: The path or URL of the user's profile page, home page, or
+ *     other desired page to link to for more information about the user.
+ *   - link_options: An array of options to pass to the l() function's $options
+ *     parameter if linking the user's name to the user's page.
+ *   - attributes_array: An array of attributes to pass to the
+ *     drupal_attributes() function if not linking to the user's page.
+ *
+ * @see template_preprocess_username()
+ * @see template_process_username()
+ */
+function theme_username($variables) {
+  if (isset($variables['link_path'])) {
+    // We have a link path, so we should generate a link using l().
+    // Additional classes may be added as array elements like
+    // $variables['link_options']['attributes']['class'][] = 'myclass';
+    $output = l($variables['name'] . $variables['extra'], $variables['link_path'], $variables['link_options']);
+  }
+  else {
+    // Modules may have added important attributes so they must be included
+    // in the output. Additional classes may be added as array elements like
+    // $variables['attributes_array']['class'][] = 'myclass';
+    $output = '<span' . drupal_attributes($variables['attributes_array']) . '>' . $variables['name'] . $variables['extra'] . '</span>';
+  }
+  return $output;
+}
+
+/**
+ * Returns HTML for a progress bar.
+ *
+ * Note that the core Batch API uses this only for non-JavaScript batch jobs.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - percent: The percentage of the progress.
+ *   - message: A string containing information to be displayed.
+ */
+function theme_progress_bar($variables) {
+  $output = '<div id="progress" class="progress">';
+  $output .= '<div class="bar"><div class="filled" style="width: ' . $variables['percent'] . '%"></div></div>';
+  $output .= '<div class="percentage">' . $variables['percent'] . '%</div>';
+  $output .= '<div class="message">' . $variables['message'] . '</div>';
+  $output .= '</div>';
+
+  return $output;
+}
+
+/**
+ * Returns HTML for an indentation div; used for drag and drop tables.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - size: Optional. The number of indentations to create.
+ */
+function theme_indentation($variables) {
+  $output = '';
+  for ($n = 0; $n < $variables['size']; $n++) {
+    $output .= '<div class="indentation">&nbsp;</div>';
+  }
+  return $output;
+}
+
+/**
+ * @} End of "addtogroup themeable".
+ */
+
+/**
+ * Returns HTML output for a single table cell for theme_table().
+ *
+ * @param $cell
+ *   Array of cell information, or string to display in cell.
+ * @param bool $header
+ *   TRUE if this cell is a table header cell, FALSE if it is an ordinary
+ *   table cell. If $cell is an array with element 'header' set to TRUE, that
+ *   will override the $header parameter.
+ *
+ * @return
+ *   HTML for the cell.
+ */
+function _theme_table_cell($cell, $header = FALSE) {
+  $attributes = '';
+
+  if (is_array($cell)) {
+    $data = isset($cell['data']) ? $cell['data'] : '';
+    // Cell's data property can be a string or a renderable array.
+    if (is_array($data)) {
+      $data = drupal_render($data);
+    }
+    $header |= isset($cell['header']);
+    unset($cell['data']);
+    unset($cell['header']);
+    $attributes = drupal_attributes($cell);
+  }
+  else {
+    $data = $cell;
+  }
+
+  if ($header) {
+    $output = "<th$attributes>$data</th>";
+  }
+  else {
+    $output = "<td$attributes>$data</td>";
+  }
+
+  return $output;
+}
+
+/**
+ * Adds a default set of helper variables for variable processors and templates.
+ *
+ * This function is called for theme hooks implemented as templates only, not
+ * for theme hooks implemented as functions. This preprocess function is the
+ * first in the sequence of preprocessing and processing functions that is
+ * called when preparing variables for a template. See theme() for more details
+ * about the full sequence.
+ *
+ * @see theme()
+ * @see template_process()
+ */
+function template_preprocess(&$variables, $hook) {
+  global $user;
+  static $count = array();
+
+  // Track run count for each hook to provide zebra striping. See
+  // "template_preprocess_block()" which provides the same feature specific to
+  // blocks.
+  $count[$hook] = isset($count[$hook]) && is_int($count[$hook]) ? $count[$hook] : 1;
+  $variables['zebra'] = ($count[$hook] % 2) ? 'odd' : 'even';
+  $variables['id'] = $count[$hook]++;
+
+  // Tell all templates where they are located.
+  $variables['directory'] = path_to_theme();
+
+  // Initialize html class attribute for the current hook.
+  $variables['classes_array'] = array(drupal_html_class($hook));
+
+  // Merge in variables that don't depend on hook and don't change during a
+  // single page request.
+  // Use the advanced drupal_static() pattern, since this is called very often.
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['default_variables'] = &drupal_static(__FUNCTION__);
+  }
+  $default_variables = &$drupal_static_fast['default_variables'];
+  // Global $user object shouldn't change during a page request once rendering
+  // has started, but if there's an edge case where it does, re-fetch the
+  // variables appropriate for the new user.
+  if (!isset($default_variables) || ($user !== $default_variables['user'])) {
+    $default_variables = _template_preprocess_default_variables();
+  }
+  $variables += $default_variables;
+}
+
+/**
+ * Returns hook-independent variables to template_preprocess().
+ */
+function _template_preprocess_default_variables() {
+  global $user;
+
+  // Variables that don't depend on a database connection.
+  $variables = array(
+    'attributes_array' => array(),
+    'title_attributes_array' => array(),
+    'content_attributes_array' => array(),
+    'title_prefix' => array(),
+    'title_suffix' => array(),
+    'user' => $user,
+    'db_is_active' => !defined('MAINTENANCE_MODE'),
+    'is_admin' => FALSE,
+    'logged_in' => FALSE,
+  );
+
+  // The user object has no uid property when the database does not exist during
+  // install. The user_access() check deals with issues when in maintenance mode
+  // as uid is set but the user.module has not been included.
+  if (isset($user->uid) && function_exists('user_access')) {
+    $variables['is_admin'] = user_access('access administration pages');
+    $variables['logged_in'] = ($user->uid > 0);
+  }
+
+  // drupal_is_front_page() might throw an exception.
+  try {
+    $variables['is_front'] = drupal_is_front_page();
+  }
+  catch (Exception $e) {
+    // If the database is not yet available, set default values for these
+    // variables.
+    $variables['is_front'] = FALSE;
+    $variables['db_is_active'] = FALSE;
+  }
+
+  return $variables;
+}
+
+/**
+ * Adds helper variables derived from variables defined during preprocessing.
+ *
+ * When preparing variables for a theme hook implementation, all 'preprocess'
+ * functions run first, then all 'process' functions (see theme() for details
+ * about the full sequence).
+ *
+ * This function serializes array variables manipulated during the preprocessing
+ * phase into strings for convenient use by templates. As with
+ * template_preprocess(), this function does not get called for theme hooks
+ * implemented as functions.
+ *
+ * @see theme()
+ * @see template_preprocess()
+ */
+function template_process(&$variables, $hook) {
+  // Flatten out classes.
+  $variables['classes'] = implode(' ', $variables['classes_array']);
+
+  // Flatten out attributes, title_attributes, and content_attributes.
+  // Because this function can be called very often, and often with empty
+  // attributes, optimize performance by only calling drupal_attributes() if
+  // necessary.
+  $variables['attributes'] = $variables['attributes_array'] ? drupal_attributes($variables['attributes_array']) : '';
+  $variables['title_attributes'] = $variables['title_attributes_array'] ? drupal_attributes($variables['title_attributes_array']) : '';
+  $variables['content_attributes'] = $variables['content_attributes_array'] ? drupal_attributes($variables['content_attributes_array']) : '';
+}
+
+/**
+ * Preprocess variables for html.tpl.php
+ *
+ * @see system_elements()
+ * @see html.tpl.php
+ */
+function template_preprocess_html(&$variables) {
+  // Compile a list of classes that are going to be applied to the body element.
+  // This allows advanced theming based on context (home page, node of certain type, etc.).
+  // Add a class that tells us whether we're on the front page or not.
+  $variables['classes_array'][] = $variables['is_front'] ? 'front' : 'not-front';
+  // Add a class that tells us whether the page is viewed by an authenticated user or not.
+  $variables['classes_array'][] = $variables['logged_in'] ? 'logged-in' : 'not-logged-in';
+
+  // Add information about the number of sidebars.
+  if (!empty($variables['page']['sidebar_first']) && !empty($variables['page']['sidebar_second'])) {
+    $variables['classes_array'][] = 'two-sidebars';
+  }
+  elseif (!empty($variables['page']['sidebar_first'])) {
+    $variables['classes_array'][] = 'one-sidebar sidebar-first';
+  }
+  elseif (!empty($variables['page']['sidebar_second'])) {
+    $variables['classes_array'][] = 'one-sidebar sidebar-second';
+  }
+  else {
+    $variables['classes_array'][] = 'no-sidebars';
+  }
+
+  // Populate the body classes.
+  if ($suggestions = theme_get_suggestions(arg(), 'page', '-')) {
+    foreach ($suggestions as $suggestion) {
+      if ($suggestion != 'page-front') {
+        // Add current suggestion to page classes to make it possible to theme
+        // the page depending on the current page type (e.g. node, admin, user,
+        // etc.) as well as more specific data like node-12 or node-edit.
+        $variables['classes_array'][] = drupal_html_class($suggestion);
+      }
+    }
+  }
+
+  // If on an individual node page, add the node type to body classes.
+  if ($node = menu_get_object()) {
+    $variables['classes_array'][] = drupal_html_class('node-type-' . $node->type);
+  }
+
+  // RDFa allows annotation of XHTML pages with RDF data, while GRDDL provides
+  // mechanisms for extraction of this RDF content via XSLT transformation
+  // using an associated GRDDL profile.
+  $variables['rdf_namespaces']    = drupal_get_rdf_namespaces();
+  $variables['grddl_profile']     = 'http://www.w3.org/1999/xhtml/vocab';
+  $variables['language']          = $GLOBALS['language'];
+  $variables['language']->dir     = $GLOBALS['language']->direction ? 'rtl' : 'ltr';
+
+  // Add favicon.
+  if (theme_get_setting('toggle_favicon')) {
+    $favicon = theme_get_setting('favicon');
+    $type = theme_get_setting('favicon_mimetype');
+    drupal_add_html_head_link(array('rel' => 'shortcut icon', 'href' => drupal_strip_dangerous_protocols($favicon), 'type' => $type));
+  }
+
+  // Construct page title.
+  if (drupal_get_title()) {
+    $head_title = array(
+      'title' => strip_tags(drupal_get_title()),
+      'name' => check_plain(variable_get('site_name', 'Drupal')),
+    );
+  }
+  else {
+    $head_title = array('name' => check_plain(variable_get('site_name', 'Drupal')));
+    if (variable_get('site_slogan', '')) {
+      $head_title['slogan'] = filter_xss_admin(variable_get('site_slogan', ''));
+    }
+  }
+  $variables['head_title_array'] = $head_title;
+  $variables['head_title'] = implode(' | ', $head_title);
+
+  // Populate the page template suggestions.
+  if ($suggestions = theme_get_suggestions(arg(), 'html')) {
+    $variables['theme_hook_suggestions'] = $suggestions;
+  }
+}
+
+/**
+ * Preprocess variables for page.tpl.php
+ *
+ * Most themes utilize their own copy of page.tpl.php. The default is located
+ * inside "modules/system/page.tpl.php". Look in there for the full list of
+ * variables.
+ *
+ * Uses the arg() function to generate a series of page template suggestions
+ * based on the current path.
+ *
+ * Any changes to variables in this preprocessor should also be changed inside
+ * template_preprocess_maintenance_page() to keep all of them consistent.
+ *
+ * @see drupal_render_page()
+ * @see template_process_page()
+ * @see page.tpl.php
+ */
+function template_preprocess_page(&$variables) {
+  // Move some variables to the top level for themer convenience and template cleanliness.
+  $variables['show_messages'] = $variables['page']['#show_messages'];
+
+  foreach (system_region_list($GLOBALS['theme']) as $region_key => $region_name) {
+    if (!isset($variables['page'][$region_key])) {
+      $variables['page'][$region_key] = array();
+    }
+  }
+
+  // Set up layout variable.
+  $variables['layout'] = 'none';
+  if (!empty($variables['page']['sidebar_first'])) {
+    $variables['layout'] = 'first';
+  }
+  if (!empty($variables['page']['sidebar_second'])) {
+    $variables['layout'] = ($variables['layout'] == 'first') ? 'both' : 'second';
+  }
+
+  $variables['base_path']         = base_path();
+  $variables['front_page']        = url();
+  $variables['feed_icons']        = drupal_get_feeds();
+  $variables['language']          = $GLOBALS['language'];
+  $variables['language']->dir     = $GLOBALS['language']->direction ? 'rtl' : 'ltr';
+  $variables['logo']              = theme_get_setting('logo');
+  $variables['main_menu']         = theme_get_setting('toggle_main_menu') ? menu_main_menu() : array();
+  $variables['secondary_menu']    = theme_get_setting('toggle_secondary_menu') ? menu_secondary_menu() : array();
+  $variables['action_links']      = menu_local_actions();
+  $variables['site_name']         = (theme_get_setting('toggle_name') ? filter_xss_admin(variable_get('site_name', 'Drupal')) : '');
+  $variables['site_slogan']       = (theme_get_setting('toggle_slogan') ? filter_xss_admin(variable_get('site_slogan', '')) : '');
+  $variables['tabs']              = menu_local_tabs();
+
+  if ($node = menu_get_object()) {
+    $variables['node'] = $node;
+  }
+
+  // Populate the page template suggestions.
+  if ($suggestions = theme_get_suggestions(arg(), 'page')) {
+    $variables['theme_hook_suggestions'] = $suggestions;
+  }
+}
+
+/**
+ * Process variables for page.tpl.php
+ *
+ * Perform final addition of variables before passing them into the template.
+ * To customize these variables, simply set them in an earlier step.
+ *
+ * @see template_preprocess_page()
+ * @see page.tpl.php
+ */
+function template_process_page(&$variables) {
+  if (!isset($variables['breadcrumb'])) {
+    // Build the breadcrumb last, so as to increase the chance of being able to
+    // re-use the cache of an already rendered menu containing the active link
+    // for the current page.
+    // @see menu_tree_page_data()
+    $variables['breadcrumb'] = theme('breadcrumb', array('breadcrumb' => drupal_get_breadcrumb()));
+  }
+  if (!isset($variables['title'])) {
+    $variables['title'] = drupal_get_title();
+  }
+
+  // Generate messages last in order to capture as many as possible for the
+  // current page.
+  if (!isset($variables['messages'])) {
+    $variables['messages'] = $variables['show_messages'] ? theme('status_messages') : '';
+  }
+}
+
+/**
+ * Process variables for html.tpl.php
+ *
+ * Perform final addition and modification of variables before passing into
+ * the template. To customize these variables, call drupal_render() on elements
+ * in $variables['page'] during THEME_preprocess_page().
+ *
+ * @see template_preprocess_html()
+ * @see html.tpl.php
+ */
+function template_process_html(&$variables) {
+  // Render page_top and page_bottom into top level variables.
+  $variables['page_top'] = drupal_render($variables['page']['page_top']);
+  $variables['page_bottom'] = drupal_render($variables['page']['page_bottom']);
+  // Place the rendered HTML for the page body into a top level variable.
+  $variables['page']              = $variables['page']['#children'];
+  $variables['page_bottom'] .= drupal_get_js('footer');
+
+  $variables['head']    = drupal_get_html_head();
+  $variables['css']     = drupal_add_css();
+  $variables['styles']  = drupal_get_css();
+  $variables['scripts'] = drupal_get_js();
+}
+
+/**
+ * Generate an array of suggestions from path arguments.
+ *
+ * This is typically called for adding to the 'theme_hook_suggestions' or
+ * 'classes_array' variables from within preprocess functions, when wanting to
+ * base the additional suggestions on the path of the current page.
+ *
+ * @param $args
+ *   An array of path arguments, such as from function arg().
+ * @param $base
+ *   A string identifying the base 'thing' from which more specific suggestions
+ *   are derived. For example, 'page' or 'html'.
+ * @param $delimiter
+ *   The string used to delimit increasingly specific information. The default
+ *   of '__' is appropriate for theme hook suggestions. '-' is appropriate for
+ *   extra classes.
+ *
+ * @return
+ *   An array of suggestions, suitable for adding to
+ *   $variables['theme_hook_suggestions'] within a preprocess function or to
+ *   $variables['classes_array'] if the suggestions represent extra CSS classes.
+ */
+function theme_get_suggestions($args, $base, $delimiter = '__') {
+
+  // Build a list of suggested theme hooks or body classes in order of
+  // specificity. One suggestion is made for every element of the current path,
+  // though numeric elements are not carried to subsequent suggestions. For
+  // example, for $base='page', http://www.example.com/node/1/edit would result
+  // in the following suggestions and body classes:
+  //
+  // page__node              page-node
+  // page__node__%           page-node-%
+  // page__node__1           page-node-1
+  // page__node__edit        page-node-edit
+
+  $suggestions = array();
+  $prefix = $base;
+  foreach ($args as $arg) {
+    // Remove slashes or null per SA-CORE-2009-003 and change - (hyphen) to _
+    // (underscore).
+    //
+    // When we discover templates in @see drupal_find_theme_templates,
+    // hyphens (-) are converted to underscores (_) before the theme hook
+    // is registered. We do this because the hyphens used for delimiters
+    // in hook suggestions cannot be used in the function names of the
+    // associated preprocess functions. Any page templates designed to be used
+    // on paths that contain a hyphen are also registered with these hyphens
+    // converted to underscores so here we must convert any hyphens in path
+    // arguments to underscores here before fetching theme hook suggestions
+    // to ensure the templates are appropriately recognized.
+    $arg = str_replace(array("/", "\\", "\0", '-'), array('', '', '', '_'), $arg);
+    // The percent acts as a wildcard for numeric arguments since
+    // asterisks are not valid filename characters on many filesystems.
+    if (is_numeric($arg)) {
+      $suggestions[] = $prefix . $delimiter . '%';
+    }
+    $suggestions[] = $prefix . $delimiter . $arg;
+    if (!is_numeric($arg)) {
+      $prefix .= $delimiter . $arg;
+    }
+  }
+  if (drupal_is_front_page()) {
+    // Front templates should be based on root only, not prefixed arguments.
+    $suggestions[] = $base . $delimiter . 'front';
+  }
+
+  return $suggestions;
+}
+
+/**
+ * Process variables for maintenance-page.tpl.php.
+ *
+ * The variables array generated here is a mirror of
+ * template_preprocess_page(). This preprocessor will run its course when
+ * theme_maintenance_page() is invoked. An alternate template file of
+ * maintenance-page--offline.tpl.php can be used when the database is offline to
+ * hide errors and completely replace the content.
+ *
+ * The $variables array contains the following arguments:
+ * - $content
+ *
+ * @see maintenance-page.tpl.php
+ */
+function template_preprocess_maintenance_page(&$variables) {
+  // Add favicon
+  if (theme_get_setting('toggle_favicon')) {
+    $favicon = theme_get_setting('favicon');
+    $type = theme_get_setting('favicon_mimetype');
+    drupal_add_html_head_link(array('rel' => 'shortcut icon', 'href' => drupal_strip_dangerous_protocols($favicon), 'type' => $type));
+  }
+
+  global $theme;
+  // Retrieve the theme data to list all available regions.
+  $theme_data = list_themes();
+  $regions = $theme_data[$theme]->info['regions'];
+
+  // Get all region content set with drupal_add_region_content().
+  foreach (array_keys($regions) as $region) {
+    // Assign region to a region variable.
+    $region_content = drupal_get_region_content($region);
+    isset($variables[$region]) ? $variables[$region] .= $region_content : $variables[$region] = $region_content;
+  }
+
+  // Setup layout variable.
+  $variables['layout'] = 'none';
+  if (!empty($variables['sidebar_first'])) {
+    $variables['layout'] = 'first';
+  }
+  if (!empty($variables['sidebar_second'])) {
+    $variables['layout'] = ($variables['layout'] == 'first') ? 'both' : 'second';
+  }
+
+  // Construct page title
+  if (drupal_get_title()) {
+    $head_title = array(
+      'title' => strip_tags(drupal_get_title()),
+      'name' => variable_get('site_name', 'Drupal'),
+    );
+  }
+  else {
+    $head_title = array('name' => variable_get('site_name', 'Drupal'));
+    if (variable_get('site_slogan', '')) {
+      $head_title['slogan'] = variable_get('site_slogan', '');
+    }
+  }
+
+  // set the default language if necessary
+  $language = isset($GLOBALS['language']) ? $GLOBALS['language'] : language_default();
+
+  $variables['head_title_array']  = $head_title;
+  $variables['head_title']        = implode(' | ', $head_title);
+  $variables['base_path']         = base_path();
+  $variables['front_page']        = url();
+  $variables['breadcrumb']        = '';
+  $variables['feed_icons']        = '';
+  $variables['help']              = '';
+  $variables['language']          = $language;
+  $variables['language']->dir     = $language->direction ? 'rtl' : 'ltr';
+  $variables['logo']              = theme_get_setting('logo');
+  $variables['messages']          = $variables['show_messages'] ? theme('status_messages') : '';
+  $variables['main_menu']         = array();
+  $variables['secondary_menu']    = array();
+  $variables['site_name']         = (theme_get_setting('toggle_name') ? variable_get('site_name', 'Drupal') : '');
+  $variables['site_slogan']       = (theme_get_setting('toggle_slogan') ? variable_get('site_slogan', '') : '');
+  $variables['tabs']              = '';
+  $variables['title']             = drupal_get_title();
+
+  // Compile a list of classes that are going to be applied to the body element.
+  $variables['classes_array'][] = 'in-maintenance';
+  if (isset($variables['db_is_active']) && !$variables['db_is_active']) {
+    $variables['classes_array'][] = 'db-offline';
+  }
+  if ($variables['layout'] == 'both') {
+    $variables['classes_array'][] = 'two-sidebars';
+  }
+  elseif ($variables['layout'] == 'none') {
+    $variables['classes_array'][] = 'no-sidebars';
+  }
+  else {
+    $variables['classes_array'][] = 'one-sidebar sidebar-' . $variables['layout'];
+  }
+
+  // Dead databases will show error messages so supplying this template will
+  // allow themers to override the page and the content completely.
+  if (isset($variables['db_is_active']) && !$variables['db_is_active']) {
+    $variables['theme_hook_suggestion'] = 'maintenance_page__offline';
+  }
+}
+
+/**
+ * Theme process function for theme_maintenance_field().
+ *
+ * The variables array generated here is a mirror of template_process_html().
+ * This processor will run its course when theme_maintenance_page() is invoked.
+ *
+ * @see maintenance-page.tpl.php
+ * @see template_process_html()
+ */
+function template_process_maintenance_page(&$variables) {
+  $variables['head']    = drupal_get_html_head();
+  $variables['css']     = drupal_add_css();
+  $variables['styles']  = drupal_get_css();
+  $variables['scripts'] = drupal_get_js();
+}
+
+/**
+ * Preprocess variables for region.tpl.php
+ *
+ * Prepares the values passed to the theme_region function to be passed into a
+ * pluggable template engine. Uses the region name to generate a template file
+ * suggestions. If none are found, the default region.tpl.php is used.
+ *
+ * @see drupal_region_class()
+ * @see region.tpl.php
+ */
+function template_preprocess_region(&$variables) {
+  // Create the $content variable that templates expect.
+  $variables['content'] = $variables['elements']['#children'];
+  $variables['region'] = $variables['elements']['#region'];
+
+  $variables['classes_array'][] = drupal_region_class($variables['region']);
+  $variables['theme_hook_suggestions'][] = 'region__' . $variables['region'];
+}
+
+/**
+ * Preprocesses variables for theme_username().
+ *
+ * Modules that make any changes to variables like 'name' or 'extra' must insure
+ * that the final string is safe to include directly in the output by using
+ * check_plain() or filter_xss().
+ *
+ * @see template_process_username()
+ */
+function template_preprocess_username(&$variables) {
+  $account = $variables['account'];
+
+  $variables['extra'] = '';
+  if (empty($account->uid)) {
+   $variables['uid'] = 0;
+   if (theme_get_setting('toggle_comment_user_verification')) {
+     $variables['extra'] = ' (' . t('not verified') . ')';
+   }
+  }
+  else {
+    $variables['uid'] = (int) $account->uid;
+  }
+
+  // Set the name to a formatted name that is safe for printing and
+  // that won't break tables by being too long. Keep an unshortened,
+  // unsanitized version, in case other preprocess functions want to implement
+  // their own shortening logic or add markup. If they do so, they must ensure
+  // that $variables['name'] is safe for printing.
+  $name = $variables['name_raw'] = format_username($account);
+  if (drupal_strlen($name) > 20) {
+    $name = drupal_substr($name, 0, 15) . '...';
+  }
+  $variables['name'] = check_plain($name);
+
+  $variables['profile_access'] = user_access('access user profiles');
+  $variables['link_attributes'] = array();
+  // Populate link path and attributes if appropriate.
+  if ($variables['uid'] && $variables['profile_access']) {
+    // We are linking to a local user.
+    $variables['link_attributes'] = array('title' => t('View user profile.'));
+    $variables['link_path'] = 'user/' . $variables['uid'];
+  }
+  elseif (!empty($account->homepage)) {
+    // Like the 'class' attribute, the 'rel' attribute can hold a
+    // space-separated set of values, so initialize it as an array to make it
+    // easier for other preprocess functions to append to it.
+    $variables['link_attributes'] = array('rel' => array('nofollow'));
+    $variables['link_path'] = $account->homepage;
+    $variables['homepage'] = $account->homepage;
+  }
+  // We do not want the l() function to check_plain() a second time.
+  $variables['link_options']['html'] = TRUE;
+  // Set a default class.
+  $variables['attributes_array'] = array('class' => array('username'));
+}
+
+/**
+ * Processes variables for theme_username().
+ *
+ * @see template_preprocess_username()
+ */
+function template_process_username(&$variables) {
+  // Finalize the link_options array for passing to the l() function.
+  // This is done in the process phase so that attributes may be added by
+  // modules or the theme during the preprocess phase.
+  if (isset($variables['link_path'])) {
+    // $variables['attributes_array'] contains attributes that should be applied
+    // regardless of whether a link is being rendered or not.
+    // $variables['link_attributes'] contains attributes that should only be
+    // applied if a link is being rendered. Preprocess functions are encouraged
+    // to use the former unless they want to add attributes on the link only.
+    // If a link is being rendered, these need to be merged. Some attributes are
+    // themselves arrays, so the merging needs to be recursive.
+    $variables['link_options']['attributes'] = array_merge_recursive($variables['link_attributes'], $variables['attributes_array']);
+  }
+}
diff --git a/htmltest/includes/theme.maintenance.inc b/htmltest/includes/theme.maintenance.inc
new file mode 100644
index 00000000..6baf219b
--- /dev/null
+++ b/htmltest/includes/theme.maintenance.inc
@@ -0,0 +1,211 @@
+<?php
+
+/**
+ * @file
+ * Theming for maintenance pages.
+ */
+
+/**
+ * Sets up the theming system for maintenance page.
+ *
+ * Used for site installs, updates and when the site is in maintenance mode.
+ * It also applies when the database is unavailable or bootstrap was not
+ * complete. Seven is always used for the initial install and update
+ * operations. In other cases, Bartik is used, but this can be overridden by
+ * setting a "maintenance_theme" key in the $conf variable in settings.php.
+ */
+function _drupal_maintenance_theme() {
+  global $theme, $theme_key, $conf;
+
+  // If $theme is already set, assume the others are set too, and do nothing.
+  if (isset($theme)) {
+    return;
+  }
+
+  require_once DRUPAL_ROOT . '/' . variable_get('path_inc', 'includes/path.inc');
+  require_once DRUPAL_ROOT . '/includes/theme.inc';
+  require_once DRUPAL_ROOT . '/includes/common.inc';
+  require_once DRUPAL_ROOT . '/includes/unicode.inc';
+  require_once DRUPAL_ROOT . '/includes/file.inc';
+  require_once DRUPAL_ROOT . '/includes/module.inc';
+  unicode_check();
+
+  // Install and update pages are treated differently to prevent theming overrides.
+  if (defined('MAINTENANCE_MODE') && (MAINTENANCE_MODE == 'install' || MAINTENANCE_MODE == 'update')) {
+    $custom_theme = (isset($conf['maintenance_theme']) ? $conf['maintenance_theme'] : 'seven');
+  }
+  else {
+    // The bootstrap was not complete. So we are operating in a crippled
+    // environment, we need to bootstrap just enough to allow hook invocations
+    // to work. See _drupal_log_error().
+    if (!class_exists('Database', FALSE)) {
+      require_once DRUPAL_ROOT . '/includes/database/database.inc';
+    }
+
+    // We use the default theme as the maintenance theme. If a default theme
+    // isn't specified in the database or in settings.php, we use Bartik.
+    $custom_theme = variable_get('maintenance_theme', variable_get('theme_default', 'bartik'));
+  }
+
+  // Ensure that system.module is loaded.
+  if (!function_exists('_system_rebuild_theme_data')) {
+    $module_list['system']['filename'] = 'modules/system/system.module';
+    module_list(TRUE, FALSE, FALSE, $module_list);
+    drupal_load('module', 'system');
+  }
+
+  $themes = list_themes();
+
+  // list_themes() triggers a drupal_alter() in maintenance mode, but we can't
+  // let themes alter the .info data until we know a theme's base themes. So
+  // don't set global $theme until after list_themes() builds its cache.
+  $theme = $custom_theme;
+
+  // Store the identifier for retrieving theme settings with.
+  $theme_key = $theme;
+
+  // Find all our ancestor themes and put them in an array.
+  $base_theme = array();
+  $ancestor = $theme;
+  while ($ancestor && isset($themes[$ancestor]->base_theme)) {
+    $base_theme[] = $new_base_theme = $themes[$themes[$ancestor]->base_theme];
+    $ancestor = $themes[$ancestor]->base_theme;
+  }
+  _drupal_theme_initialize($themes[$theme], array_reverse($base_theme), '_theme_load_offline_registry');
+
+  // These are usually added from system_init() -except maintenance.css.
+  // When the database is inactive it's not called so we add it here.
+  $path = drupal_get_path('module', 'system');
+  drupal_add_css($path . '/system.base.css');
+  drupal_add_css($path . '/system.admin.css');
+  drupal_add_css($path . '/system.menus.css');
+  drupal_add_css($path . '/system.messages.css');
+  drupal_add_css($path . '/system.theme.css');
+  drupal_add_css($path . '/system.maintenance.css');
+}
+
+/**
+ * Builds the registry when the site needs to bypass any database calls.
+ */
+function _theme_load_offline_registry($theme, $base_theme = NULL, $theme_engine = NULL) {
+  return _theme_build_registry($theme, $base_theme, $theme_engine);
+}
+
+/**
+ * Returns HTML for a list of maintenance tasks to perform.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - items: An associative array of maintenance tasks.
+ *   - active: The key for the currently active maintenance task.
+ *
+ * @ingroup themeable
+ */
+function theme_task_list($variables) {
+  $items = $variables['items'];
+  $active = $variables['active'];
+
+  $done = isset($items[$active]) || $active == NULL;
+  $output = '<h2 class="element-invisible">Installation tasks</h2>';
+  $output .= '<ol class="task-list">';
+
+  foreach ($items as $k => $item) {
+    if ($active == $k) {
+      $class = 'active';
+      $status = '(' . t('active') . ')';
+      $done = FALSE;
+    }
+    else {
+      $class = $done ? 'done' : '';
+      $status = $done ? '(' . t('done') . ')' : '';
+    }
+    $output .= '<li';
+    $output .= ($class ? ' class="' . $class . '"' : '') . '>';
+    $output .= $item;
+    $output .= ($status ? '<span class="element-invisible">' . $status . '</span>' : '');
+    $output .= '</li>';
+  }
+  $output .= '</ol>';
+  return $output;
+}
+
+/**
+ * Returns HTML for the installation page.
+ *
+ * Note: this function is not themeable.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - content: The page content to show.
+ */
+function theme_install_page($variables) {
+  drupal_add_http_header('Content-Type', 'text/html; charset=utf-8');
+  return theme('maintenance_page', $variables);
+}
+
+/**
+ * Returns HTML for the update page.
+ *
+ * Note: this function is not themeable.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - content: The page content to show.
+ *   - show_messages: Whether to output status and error messages.
+ *     FALSE can be useful to postpone the messages to a subsequent page.
+ */
+function theme_update_page($variables) {
+  drupal_add_http_header('Content-Type', 'text/html; charset=utf-8');
+  return theme('maintenance_page', $variables);
+}
+
+/**
+ * Returns HTML for a results report of an operation run by authorize.php.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - messages: An array of result messages.
+ *
+ * @ingroup themeable
+ */
+function theme_authorize_report($variables) {
+  $messages = $variables['messages'];
+  $output = '';
+  if (!empty($messages)) {
+    $output .= '<div id="authorize-results">';
+    foreach ($messages as $heading => $logs) {
+      $items = array();
+      foreach ($logs as $number => $log_message) {
+        if ($number === '#abort') {
+          continue;
+        }
+        $items[] = theme('authorize_message', array('message' => $log_message['message'], 'success' => $log_message['success']));
+      }
+      $output .= theme('item_list',  array('items' => $items, 'title' => $heading));
+    }
+    $output .= '</div>';
+  }
+  return $output;
+}
+
+/**
+ * Returns HTML for a single log message from the authorize.php batch operation.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - message: The log message.
+ *   - success: A boolean indicating failure or success.
+ *
+ * @ingroup themeable
+ */
+function theme_authorize_message($variables) {
+  $message = $variables['message'];
+  $success = $variables['success'];
+  if ($success) {
+    $item = array('data' => $message, 'class' => array('success'));
+  }
+  else {
+    $item = array('data' => '<strong>' . $message . '</strong>', 'class' => array('failure'));
+  }
+  return $item;
+}
diff --git a/htmltest/includes/token.inc b/htmltest/includes/token.inc
new file mode 100644
index 00000000..5e9ece85
--- /dev/null
+++ b/htmltest/includes/token.inc
@@ -0,0 +1,264 @@
+<?php
+
+/**
+ * @file
+ * Drupal placeholder/token replacement system.
+ *
+ * API functions for replacing placeholders in text with meaningful values.
+ *
+ * For example: When configuring automated emails, an administrator enters
+ * standard text for the email. Variables like the title of a node and the date
+ * the email was sent can be entered as placeholders like [node:title] and
+ * [date:short]. When a Drupal module prepares to send the email, it can call
+ * the token_replace() function, passing in the text. The token system will
+ * scan the text for placeholder tokens, give other modules an opportunity to
+ * replace them with meaningful text, then return the final product to the
+ * original module.
+ *
+ * Tokens follow the form: [$type:$name], where $type is a general class of
+ * tokens like 'node', 'user', or 'comment' and $name is the name of a given
+ * placeholder. For example, [node:title] or [node:created:since].
+ *
+ * In addition to raw text containing placeholders, modules may pass in an array
+ * of objects to be used when performing the replacement. The objects should be
+ * keyed by the token type they correspond to. For example:
+ *
+ * @code
+ * // Load a node and a user, then replace tokens in the text.
+ * $text = 'On [date:short], [user:name] read [node:title].';
+ * $node = node_load(1);
+ * $user = user_load(1);
+ *
+ * // [date:...] tokens use the current date automatically.
+ * $data = array('node' => $node, 'user' => $user);
+ * return token_replace($text, $data);
+ * @endcode
+ *
+ * Some tokens may be chained in the form of [$type:$pointer:$name], where $type
+ * is a normal token type, $pointer is a reference to another token type, and
+ * $name is the name of a given placeholder. For example, [node:author:mail]. In
+ * that example, 'author' is a pointer to the 'user' account that created the
+ * node, and 'mail' is a placeholder available for any 'user'.
+ *
+ * @see token_replace()
+ * @see hook_tokens()
+ * @see hook_token_info()
+ */
+
+/**
+ * Replaces all tokens in a given string with appropriate values.
+ *
+ * @param $text
+ *   A string potentially containing replaceable tokens.
+ * @param $data
+ *   (optional) An array of keyed objects. For simple replacement scenarios
+ *   'node', 'user', and others are common keys, with an accompanying node or
+ *   user object being the value. Some token types, like 'site', do not require
+ *   any explicit information from $data and can be replaced even if it is
+ *   empty.
+ * @param $options
+ *   (optional) A keyed array of settings and flags to control the token
+ *   replacement process. Supported options are:
+ *   - language: A language object to be used when generating locale-sensitive
+ *     tokens.
+ *   - callback: A callback function that will be used to post-process the array
+ *     of token replacements after they are generated. For example, a module
+ *     using tokens in a text-only email might provide a callback to strip HTML
+ *     entities from token values before they are inserted into the final text.
+ *   - clear: A boolean flag indicating that tokens should be removed from the
+ *     final text if no replacement value can be generated.
+ *   - sanitize: A boolean flag indicating that tokens should be sanitized for
+ *     display to a web browser. Defaults to TRUE. Developers who set this
+ *     option to FALSE assume responsibility for running filter_xss(),
+ *     check_plain() or other appropriate scrubbing functions before displaying
+ *     data to users.
+ *
+ * @return
+ *   Text with tokens replaced.
+ */
+function token_replace($text, array $data = array(), array $options = array()) {
+  $text_tokens = token_scan($text);
+  if (empty($text_tokens)) {
+    return $text;
+  }
+
+  $replacements = array();
+  foreach ($text_tokens as $type => $tokens) {
+    $replacements += token_generate($type, $tokens, $data, $options);
+    if (!empty($options['clear'])) {
+      $replacements += array_fill_keys($tokens, '');
+    }
+  }
+
+  // Optionally alter the list of replacement values.
+  if (!empty($options['callback']) && function_exists($options['callback'])) {
+    $function = $options['callback'];
+    $function($replacements, $data, $options);
+  }
+
+  $tokens = array_keys($replacements);
+  $values = array_values($replacements);
+
+  return str_replace($tokens, $values, $text);
+}
+
+/**
+ * Builds a list of all token-like patterns that appear in the text.
+ *
+ * @param $text
+ *   The text to be scanned for possible tokens.
+ *
+ * @return
+ *   An associative array of discovered tokens, grouped by type.
+ */
+function token_scan($text) {
+  // Matches tokens with the following pattern: [$type:$name]
+  // $type and $name may not contain  [ ] characters.
+  // $type may not contain : or whitespace characters, but $name may.
+  preg_match_all('/
+    \[             # [ - pattern start
+    ([^\s\[\]:]*)  # match $type not containing whitespace : [ or ]
+    :              # : - separator
+    ([^\[\]]*)     # match $name not containing [ or ]
+    \]             # ] - pattern end
+    /x', $text, $matches);
+
+  $types = $matches[1];
+  $tokens = $matches[2];
+
+  // Iterate through the matches, building an associative array containing
+  // $tokens grouped by $types, pointing to the version of the token found in
+  // the source text. For example, $results['node']['title'] = '[node:title]';
+  $results = array();
+  for ($i = 0; $i < count($tokens); $i++) {
+    $results[$types[$i]][$tokens[$i]] = $matches[0][$i];
+  }
+
+  return $results;
+}
+
+/**
+ * Generates replacement values for a list of tokens.
+ *
+ * @param $type
+ *   The type of token being replaced. 'node', 'user', and 'date' are common.
+ * @param $tokens
+ *   An array of tokens to be replaced, keyed by the literal text of the token
+ *   as it appeared in the source text.
+ * @param $data
+ *   (optional) An array of keyed objects. For simple replacement scenarios
+ *   'node', 'user', and others are common keys, with an accompanying node or
+ *   user object being the value. Some token types, like 'site', do not require
+ *   any explicit information from $data and can be replaced even if it is
+ *   empty.
+ * @param $options
+ *   (optional) A keyed array of settings and flags to control the token
+ *   replacement process. Supported options are:
+ *   - language: A language object to be used when generating locale-sensitive
+ *     tokens.
+ *   - callback: A callback function that will be used to post-process the
+ *     array of token replacements after they are generated. Can be used when
+ *     modules require special formatting of token text, for example URL
+ *     encoding or truncation to a specific length.
+ *   - sanitize: A boolean flag indicating that tokens should be sanitized for
+ *     display to a web browser. Developers who set this option to FALSE assume
+ *     responsibility for running filter_xss(), check_plain() or other
+ *     appropriate scrubbing functions before displaying data to users.
+ *
+ * @return
+ *   An associative array of replacement values, keyed by the original 'raw'
+ *   tokens that were found in the source text. For example:
+ *   $results['[node:title]'] = 'My new node';
+ *
+ * @see hook_tokens()
+ * @see hook_tokens_alter()
+ */
+function token_generate($type, array $tokens, array $data = array(), array $options = array()) {
+  $options += array('sanitize' => TRUE);
+  $replacements = module_invoke_all('tokens', $type, $tokens, $data, $options);
+
+  // Allow other modules to alter the replacements.
+  $context = array(
+    'type' => $type,
+    'tokens' => $tokens,
+    'data' => $data,
+    'options' => $options,
+  );
+  drupal_alter('tokens', $replacements, $context);
+
+  return $replacements;
+}
+
+/**
+ * Returns a list of tokens that begin with a specific prefix.
+ *
+ * Used to extract a group of 'chained' tokens (such as [node:author:name])
+ * from the full list of tokens found in text. For example:
+ * @code
+ *   $data = array(
+ *     'author:name' => '[node:author:name]',
+ *     'title'       => '[node:title]',
+ *     'created'     => '[node:created]',
+ *   );
+ *   $results = token_find_with_prefix($data, 'author');
+ *   $results == array('name' => '[node:author:name]');
+ * @endcode
+ *
+ * @param $tokens
+ *   A keyed array of tokens, and their original raw form in the source text.
+ * @param $prefix
+ *   A textual string to be matched at the beginning of the token.
+ * @param $delimiter
+ *   An optional string containing the character that separates the prefix from
+ *   the rest of the token. Defaults to ':'.
+ *
+ * @return
+ *   An associative array of discovered tokens, with the prefix and delimiter
+ *   stripped from the key.
+ */
+function token_find_with_prefix(array $tokens, $prefix, $delimiter = ':') {
+  $results = array();
+  foreach ($tokens as $token => $raw) {
+    $parts = explode($delimiter, $token, 2);
+    if (count($parts) == 2 && $parts[0] == $prefix) {
+      $results[$parts[1]] = $raw;
+    }
+  }
+  return $results;
+}
+
+/**
+ * Returns metadata describing supported tokens.
+ *
+ * The metadata array contains token type, name, and description data as well
+ * as an optional pointer indicating that the token chains to another set of
+ * tokens.
+ *
+ * For example:
+ * @code
+ *   $data['types']['node'] = array(
+ *     'name' => t('Nodes'),
+ *     'description' => t('Tokens related to node objects.'),
+ *   );
+ *   $data['tokens']['node']['title'] = array(
+ *     'name' => t('Title'),
+ *     'description' => t('The title of the current node.'),
+ *   );
+ *   $data['tokens']['node']['author'] = array(
+ *     'name' => t('Author'),
+ *     'description' => t('The author of the current node.'),
+ *     'type' => 'user',
+ *   );
+ * @endcode
+ *
+ * @return
+ *   An associative array of token information, grouped by token type.
+ */
+function token_info() {
+  $data = &drupal_static(__FUNCTION__);
+  if (!isset($data)) {
+    $data = module_invoke_all('token_info');
+    drupal_alter('token_info', $data);
+  }
+  return $data;
+}
diff --git a/htmltest/includes/unicode.entities.inc b/htmltest/includes/unicode.entities.inc
new file mode 100644
index 00000000..3b1fbb69
--- /dev/null
+++ b/htmltest/includes/unicode.entities.inc
@@ -0,0 +1,265 @@
+<?php
+
+/**
+ * @file
+ * (X)HTML entities, as defined in HTML 4.01.
+ *
+ * @see http://www.w3.org/TR/html401/sgml/entities.html
+ */
+
+$html_entities = array(
+  '&Aacute;' => 'Á',
+  '&aacute;' => 'á',
+  '&Acirc;' => 'Â',
+  '&acirc;' => 'â',
+  '&acute;' => '´',
+  '&AElig;' => 'Æ',
+  '&aelig;' => 'æ',
+  '&Agrave;' => 'À',
+  '&agrave;' => 'à',
+  '&alefsym;' => 'ℵ',
+  '&Alpha;' => 'Α',
+  '&alpha;' => 'α',
+  '&amp;' => '&',
+  '&and;' => '∧',
+  '&ang;' => '∠',
+  '&Aring;' => 'Å',
+  '&aring;' => 'å',
+  '&asymp;' => '≈',
+  '&Atilde;' => 'Ã',
+  '&atilde;' => 'ã',
+  '&Auml;' => 'Ä',
+  '&auml;' => 'ä',
+  '&bdquo;' => '„',
+  '&Beta;' => 'Β',
+  '&beta;' => 'β',
+  '&brvbar;' => '¦',
+  '&bull;' => '•',
+  '&cap;' => '∩',
+  '&Ccedil;' => 'Ç',
+  '&ccedil;' => 'ç',
+  '&cedil;' => '¸',
+  '&cent;' => '¢',
+  '&Chi;' => 'Χ',
+  '&chi;' => 'χ',
+  '&circ;' => 'ˆ',
+  '&clubs;' => '♣',
+  '&cong;' => '≅',
+  '&copy;' => '©',
+  '&crarr;' => '↵',
+  '&cup;' => '∪',
+  '&curren;' => '¤',
+  '&dagger;' => '†',
+  '&Dagger;' => '‡',
+  '&darr;' => '↓',
+  '&dArr;' => '⇓',
+  '&deg;' => '°',
+  '&Delta;' => 'Δ',
+  '&delta;' => 'δ',
+  '&diams;' => '♦',
+  '&divide;' => '÷',
+  '&Eacute;' => 'É',
+  '&eacute;' => 'é',
+  '&Ecirc;' => 'Ê',
+  '&ecirc;' => 'ê',
+  '&Egrave;' => 'È',
+  '&egrave;' => 'è',
+  '&empty;' => '∅',
+  '&emsp;' => ' ',
+  '&ensp;' => ' ',
+  '&Epsilon;' => 'Ε',
+  '&epsilon;' => 'ε',
+  '&equiv;' => '≡',
+  '&Eta;' => 'Η',
+  '&eta;' => 'η',
+  '&ETH;' => 'Ð',
+  '&eth;' => 'ð',
+  '&Euml;' => 'Ë',
+  '&euml;' => 'ë',
+  '&euro;' => '€',
+  '&exist;' => '∃',
+  '&fnof;' => 'ƒ',
+  '&forall;' => '∀',
+  '&frac12;' => '½',
+  '&frac14;' => '¼',
+  '&frac34;' => '¾',
+  '&frasl;' => '⁄',
+  '&Gamma;' => 'Γ',
+  '&gamma;' => 'γ',
+  '&ge;' => '≥',
+  '&harr;' => '↔',
+  '&hArr;' => '⇔',
+  '&hearts;' => '♥',
+  '&hellip;' => '…',
+  '&Iacute;' => 'Í',
+  '&iacute;' => 'í',
+  '&Icirc;' => 'Î',
+  '&icirc;' => 'î',
+  '&iexcl;' => '¡',
+  '&Igrave;' => 'Ì',
+  '&igrave;' => 'ì',
+  '&image;' => 'ℑ',
+  '&infin;' => '∞',
+  '&int;' => '∫',
+  '&Iota;' => 'Ι',
+  '&iota;' => 'ι',
+  '&iquest;' => '¿',
+  '&isin;' => '∈',
+  '&Iuml;' => 'Ï',
+  '&iuml;' => 'ï',
+  '&Kappa;' => 'Κ',
+  '&kappa;' => 'κ',
+  '&Lambda;' => 'Λ',
+  '&lambda;' => 'λ',
+  '&lang;' => '〈',
+  '&laquo;' => '«',
+  '&larr;' => '←',
+  '&lArr;' => '⇐',
+  '&lceil;' => '⌈',
+  '&ldquo;' => '“',
+  '&le;' => '≤',
+  '&lfloor;' => '⌊',
+  '&lowast;' => '∗',
+  '&loz;' => '◊',
+  '&lrm;' => '‎',
+  '&lsaquo;' => '‹',
+  '&lsquo;' => '‘',
+  '&macr;' => '¯',
+  '&mdash;' => '—',
+  '&micro;' => 'µ',
+  '&middot;' => '·',
+  '&minus;' => '−',
+  '&Mu;' => 'Μ',
+  '&mu;' => 'μ',
+  '&nabla;' => '∇',
+  '&nbsp;' => ' ',
+  '&ndash;' => '–',
+  '&ne;' => '≠',
+  '&ni;' => '∋',
+  '&not;' => '¬',
+  '&notin;' => '∉',
+  '&nsub;' => '⊄',
+  '&Ntilde;' => 'Ñ',
+  '&ntilde;' => 'ñ',
+  '&Nu;' => 'Ν',
+  '&nu;' => 'ν',
+  '&Oacute;' => 'Ó',
+  '&oacute;' => 'ó',
+  '&Ocirc;' => 'Ô',
+  '&ocirc;' => 'ô',
+  '&OElig;' => 'Œ',
+  '&oelig;' => 'œ',
+  '&Ograve;' => 'Ò',
+  '&ograve;' => 'ò',
+  '&oline;' => '‾',
+  '&Omega;' => 'Ω',
+  '&omega;' => 'ω',
+  '&Omicron;' => 'Ο',
+  '&omicron;' => 'ο',
+  '&oplus;' => '⊕',
+  '&or;' => '∨',
+  '&ordf;' => 'ª',
+  '&ordm;' => 'º',
+  '&Oslash;' => 'Ø',
+  '&oslash;' => 'ø',
+  '&Otilde;' => 'Õ',
+  '&otilde;' => 'õ',
+  '&otimes;' => '⊗',
+  '&Ouml;' => 'Ö',
+  '&ouml;' => 'ö',
+  '&para;' => '¶',
+  '&part;' => '∂',
+  '&permil;' => '‰',
+  '&perp;' => '⊥',
+  '&Phi;' => 'Φ',
+  '&phi;' => 'φ',
+  '&Pi;' => 'Π',
+  '&pi;' => 'π',
+  '&piv;' => 'ϖ',
+  '&plusmn;' => '±',
+  '&pound;' => '£',
+  '&prime;' => '′',
+  '&Prime;' => '″',
+  '&prod;' => '∏',
+  '&prop;' => '∝',
+  '&Psi;' => 'Ψ',
+  '&psi;' => 'ψ',
+  '&radic;' => '√',
+  '&rang;' => '〉',
+  '&raquo;' => '»',
+  '&rarr;' => '→',
+  '&rArr;' => '⇒',
+  '&rceil;' => '⌉',
+  '&rdquo;' => '”',
+  '&real;' => 'ℜ',
+  '&reg;' => '®',
+  '&rfloor;' => '⌋',
+  '&Rho;' => 'Ρ',
+  '&rho;' => 'ρ',
+  '&rlm;' => '‏',
+  '&rsaquo;' => '›',
+  '&rsquo;' => '’',
+  '&sbquo;' => '‚',
+  '&Scaron;' => 'Š',
+  '&scaron;' => 'š',
+  '&sdot;' => '⋅',
+  '&sect;' => '§',
+  '&shy;' => '­',
+  '&Sigma;' => 'Σ',
+  '&sigma;' => 'σ',
+  '&sigmaf;' => 'ς',
+  '&sim;' => '∼',
+  '&spades;' => '♠',
+  '&sub;' => '⊂',
+  '&sube;' => '⊆',
+  '&sum;' => '∑',
+  '&sup1;' => '¹',
+  '&sup2;' => '²',
+  '&sup3;' => '³',
+  '&sup;' => '⊃',
+  '&supe;' => '⊇',
+  '&szlig;' => 'ß',
+  '&Tau;' => 'Τ',
+  '&tau;' => 'τ',
+  '&there4;' => '∴',
+  '&Theta;' => 'Θ',
+  '&theta;' => 'θ',
+  '&thetasym;' => 'ϑ',
+  '&thinsp;' => ' ',
+  '&THORN;' => 'Þ',
+  '&thorn;' => 'þ',
+  '&tilde;' => '˜',
+  '&times;' => '×',
+  '&trade;' => '™',
+  '&Uacute;' => 'Ú',
+  '&uacute;' => 'ú',
+  '&uarr;' => '↑',
+  '&uArr;' => '⇑',
+  '&Ucirc;' => 'Û',
+  '&ucirc;' => 'û',
+  '&Ugrave;' => 'Ù',
+  '&ugrave;' => 'ù',
+  '&uml;' => '¨',
+  '&upsih;' => 'ϒ',
+  '&Upsilon;' => 'Υ',
+  '&upsilon;' => 'υ',
+  '&Uuml;' => 'Ü',
+  '&uuml;' => 'ü',
+  '&weierp;' => '℘',
+  '&Xi;' => 'Ξ',
+  '&xi;' => 'ξ',
+  '&Yacute;' => 'Ý',
+  '&yacute;' => 'ý',
+  '&yen;' => '¥',
+  '&yuml;' => 'ÿ',
+  '&Yuml;' => 'Ÿ',
+  '&Zeta;' => 'Ζ',
+  '&zeta;' => 'ζ',
+  '&zwj;' => '‍',
+  '&zwnj;' => '‌',
+  '&gt;' => '>',
+  '&lt;' => '<',
+  '&quot;' => '"',
+  // Add apostrophe (XML).
+  '&apos;' => "'",
+);
diff --git a/htmltest/includes/unicode.inc b/htmltest/includes/unicode.inc
new file mode 100644
index 00000000..fd497cca
--- /dev/null
+++ b/htmltest/includes/unicode.inc
@@ -0,0 +1,672 @@
+<?php
+
+/**
+* @file
+* Provides Unicode-related conversions and operations.
+*/
+
+/**
+ * Indicates an error during check for PHP unicode support.
+ */
+define('UNICODE_ERROR', -1);
+
+/**
+ * Indicates that standard PHP (emulated) unicode support is being used.
+ */
+define('UNICODE_SINGLEBYTE', 0);
+
+/**
+ * Indicates that full unicode support with the PHP mbstring extension is being
+ * used.
+ */
+define('UNICODE_MULTIBYTE', 1);
+
+/**
+ * Matches Unicode characters that are word boundaries.
+ *
+ * Characters with the following General_category (gc) property values are used
+ * as word boundaries. While this does not fully conform to the Word Boundaries
+ * algorithm described in http://unicode.org/reports/tr29, as PCRE does not
+ * contain the Word_Break property table, this simpler algorithm has to do.
+ * - Cc, Cf, Cn, Co, Cs: Other.
+ * - Pc, Pd, Pe, Pf, Pi, Po, Ps: Punctuation.
+ * - Sc, Sk, Sm, So: Symbols.
+ * - Zl, Zp, Zs: Separators.
+ *
+ * Non-boundary characters include the following General_category (gc) property
+ * values:
+ * - Ll, Lm, Lo, Lt, Lu: Letters.
+ * - Mc, Me, Mn: Combining Marks.
+ * - Nd, Nl, No: Numbers.
+ *
+ * Note that the PCRE property matcher is not used because we wanted to be
+ * compatible with Unicode 5.2.0 regardless of the PCRE version used (and any
+ * bugs in PCRE property tables).
+ *
+ * @see http://unicode.org/glossary
+ */
+define('PREG_CLASS_UNICODE_WORD_BOUNDARY',
+  '\x{0}-\x{2F}\x{3A}-\x{40}\x{5B}-\x{60}\x{7B}-\x{A9}\x{AB}-\x{B1}\x{B4}' .
+  '\x{B6}-\x{B8}\x{BB}\x{BF}\x{D7}\x{F7}\x{2C2}-\x{2C5}\x{2D2}-\x{2DF}' .
+  '\x{2E5}-\x{2EB}\x{2ED}\x{2EF}-\x{2FF}\x{375}\x{37E}-\x{385}\x{387}\x{3F6}' .
+  '\x{482}\x{55A}-\x{55F}\x{589}-\x{58A}\x{5BE}\x{5C0}\x{5C3}\x{5C6}' .
+  '\x{5F3}-\x{60F}\x{61B}-\x{61F}\x{66A}-\x{66D}\x{6D4}\x{6DD}\x{6E9}' .
+  '\x{6FD}-\x{6FE}\x{700}-\x{70F}\x{7F6}-\x{7F9}\x{830}-\x{83E}' .
+  '\x{964}-\x{965}\x{970}\x{9F2}-\x{9F3}\x{9FA}-\x{9FB}\x{AF1}\x{B70}' .
+  '\x{BF3}-\x{BFA}\x{C7F}\x{CF1}-\x{CF2}\x{D79}\x{DF4}\x{E3F}\x{E4F}' .
+  '\x{E5A}-\x{E5B}\x{F01}-\x{F17}\x{F1A}-\x{F1F}\x{F34}\x{F36}\x{F38}' .
+  '\x{F3A}-\x{F3D}\x{F85}\x{FBE}-\x{FC5}\x{FC7}-\x{FD8}\x{104A}-\x{104F}' .
+  '\x{109E}-\x{109F}\x{10FB}\x{1360}-\x{1368}\x{1390}-\x{1399}\x{1400}' .
+  '\x{166D}-\x{166E}\x{1680}\x{169B}-\x{169C}\x{16EB}-\x{16ED}' .
+  '\x{1735}-\x{1736}\x{17B4}-\x{17B5}\x{17D4}-\x{17D6}\x{17D8}-\x{17DB}' .
+  '\x{1800}-\x{180A}\x{180E}\x{1940}-\x{1945}\x{19DE}-\x{19FF}' .
+  '\x{1A1E}-\x{1A1F}\x{1AA0}-\x{1AA6}\x{1AA8}-\x{1AAD}\x{1B5A}-\x{1B6A}' .
+  '\x{1B74}-\x{1B7C}\x{1C3B}-\x{1C3F}\x{1C7E}-\x{1C7F}\x{1CD3}\x{1FBD}' .
+  '\x{1FBF}-\x{1FC1}\x{1FCD}-\x{1FCF}\x{1FDD}-\x{1FDF}\x{1FED}-\x{1FEF}' .
+  '\x{1FFD}-\x{206F}\x{207A}-\x{207E}\x{208A}-\x{208E}\x{20A0}-\x{20B8}' .
+  '\x{2100}-\x{2101}\x{2103}-\x{2106}\x{2108}-\x{2109}\x{2114}' .
+  '\x{2116}-\x{2118}\x{211E}-\x{2123}\x{2125}\x{2127}\x{2129}\x{212E}' .
+  '\x{213A}-\x{213B}\x{2140}-\x{2144}\x{214A}-\x{214D}\x{214F}' .
+  '\x{2190}-\x{244A}\x{249C}-\x{24E9}\x{2500}-\x{2775}\x{2794}-\x{2B59}' .
+  '\x{2CE5}-\x{2CEA}\x{2CF9}-\x{2CFC}\x{2CFE}-\x{2CFF}\x{2E00}-\x{2E2E}' .
+  '\x{2E30}-\x{3004}\x{3008}-\x{3020}\x{3030}\x{3036}-\x{3037}' .
+  '\x{303D}-\x{303F}\x{309B}-\x{309C}\x{30A0}\x{30FB}\x{3190}-\x{3191}' .
+  '\x{3196}-\x{319F}\x{31C0}-\x{31E3}\x{3200}-\x{321E}\x{322A}-\x{3250}' .
+  '\x{3260}-\x{327F}\x{328A}-\x{32B0}\x{32C0}-\x{33FF}\x{4DC0}-\x{4DFF}' .
+  '\x{A490}-\x{A4C6}\x{A4FE}-\x{A4FF}\x{A60D}-\x{A60F}\x{A673}\x{A67E}' .
+  '\x{A6F2}-\x{A716}\x{A720}-\x{A721}\x{A789}-\x{A78A}\x{A828}-\x{A82B}' .
+  '\x{A836}-\x{A839}\x{A874}-\x{A877}\x{A8CE}-\x{A8CF}\x{A8F8}-\x{A8FA}' .
+  '\x{A92E}-\x{A92F}\x{A95F}\x{A9C1}-\x{A9CD}\x{A9DE}-\x{A9DF}' .
+  '\x{AA5C}-\x{AA5F}\x{AA77}-\x{AA79}\x{AADE}-\x{AADF}\x{ABEB}' .
+  '\x{E000}-\x{F8FF}\x{FB29}\x{FD3E}-\x{FD3F}\x{FDFC}-\x{FDFD}' .
+  '\x{FE10}-\x{FE19}\x{FE30}-\x{FE6B}\x{FEFF}-\x{FF0F}\x{FF1A}-\x{FF20}' .
+  '\x{FF3B}-\x{FF40}\x{FF5B}-\x{FF65}\x{FFE0}-\x{FFFD}');
+
+/**
+ * Wrapper around _unicode_check().
+ */
+function unicode_check() {
+  list($GLOBALS['multibyte']) = _unicode_check();
+}
+
+/**
+ * Perform checks about Unicode support in PHP, and set the right settings if
+ * needed.
+ *
+ * Because Drupal needs to be able to handle text in various encodings, we do
+ * not support mbstring function overloading. HTTP input/output conversion must
+ * be disabled for similar reasons.
+ *
+ * @param $errors
+ *   Whether to report any fatal errors with form_set_error().
+ */
+function _unicode_check() {
+  // Ensure translations don't break during installation.
+  $t = get_t();
+
+  // Check for mbstring extension
+  if (!function_exists('mb_strlen')) {
+    return array(UNICODE_SINGLEBYTE, $t('Operations on Unicode strings are emulated on a best-effort basis. Install the <a href="@url">PHP mbstring extension</a> for improved Unicode support.', array('@url' => 'http://www.php.net/mbstring')));
+  }
+
+  // Check mbstring configuration
+  if (ini_get('mbstring.func_overload') != 0) {
+    return array(UNICODE_ERROR, $t('Multibyte string function overloading in PHP is active and must be disabled. Check the php.ini <em>mbstring.func_overload</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', array('@url' => 'http://www.php.net/mbstring')));
+  }
+  if (ini_get('mbstring.encoding_translation') != 0) {
+    return array(UNICODE_ERROR, $t('Multibyte string input conversion in PHP is active and must be disabled. Check the php.ini <em>mbstring.encoding_translation</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', array('@url' => 'http://www.php.net/mbstring')));
+  }
+  if (ini_get('mbstring.http_input') != 'pass') {
+    return array(UNICODE_ERROR, $t('Multibyte string input conversion in PHP is active and must be disabled. Check the php.ini <em>mbstring.http_input</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', array('@url' => 'http://www.php.net/mbstring')));
+  }
+  if (ini_get('mbstring.http_output') != 'pass') {
+    return array(UNICODE_ERROR, $t('Multibyte string output conversion in PHP is active and must be disabled. Check the php.ini <em>mbstring.http_output</em> setting. Please refer to the <a href="@url">PHP mbstring documentation</a> for more information.', array('@url' => 'http://www.php.net/mbstring')));
+  }
+
+  // Set appropriate configuration
+  mb_internal_encoding('utf-8');
+  mb_language('uni');
+  return array(UNICODE_MULTIBYTE, '');
+}
+
+/**
+ * Returns Unicode library status and errors.
+ */
+function unicode_requirements() {
+  // Ensure translations don't break during installation.
+  $t = get_t();
+
+  $libraries = array(
+    UNICODE_SINGLEBYTE => $t('Standard PHP'),
+    UNICODE_MULTIBYTE => $t('PHP Mbstring Extension'),
+    UNICODE_ERROR => $t('Error'),
+  );
+  $severities = array(
+    UNICODE_SINGLEBYTE => REQUIREMENT_WARNING,
+    UNICODE_MULTIBYTE => REQUIREMENT_OK,
+    UNICODE_ERROR => REQUIREMENT_ERROR,
+  );
+  list($library, $description) = _unicode_check();
+
+  $requirements['unicode'] = array(
+    'title' => $t('Unicode library'),
+    'value' => $libraries[$library],
+  );
+  if ($description) {
+    $requirements['unicode']['description'] = $description;
+  }
+
+  $requirements['unicode']['severity'] = $severities[$library];
+
+  return $requirements;
+}
+
+/**
+ * Prepares a new XML parser.
+ *
+ * This is a wrapper around xml_parser_create() which extracts the encoding
+ * from the XML data first and sets the output encoding to UTF-8. This function
+ * should be used instead of xml_parser_create(), because PHP 4's XML parser
+ * doesn't check the input encoding itself. "Starting from PHP 5, the input
+ * encoding is automatically detected, so that the encoding parameter specifies
+ * only the output encoding."
+ *
+ * This is also where unsupported encodings will be converted. Callers should
+ * take this into account: $data might have been changed after the call.
+ *
+ * @param $data
+ *   The XML data which will be parsed later.
+ *
+ * @return
+ *   An XML parser object or FALSE on error.
+ *
+ * @ingroup php_wrappers
+ */
+function drupal_xml_parser_create(&$data) {
+  // Default XML encoding is UTF-8
+  $encoding = 'utf-8';
+  $bom = FALSE;
+
+  // Check for UTF-8 byte order mark (PHP5's XML parser doesn't handle it).
+  if (!strncmp($data, "\xEF\xBB\xBF", 3)) {
+    $bom = TRUE;
+    $data = substr($data, 3);
+  }
+
+  // Check for an encoding declaration in the XML prolog if no BOM was found.
+  if (!$bom && preg_match('/^<\?xml[^>]+encoding="(.+?)"/', $data, $match)) {
+    $encoding = $match[1];
+  }
+
+  // Unsupported encodings are converted here into UTF-8.
+  $php_supported = array('utf-8', 'iso-8859-1', 'us-ascii');
+  if (!in_array(strtolower($encoding), $php_supported)) {
+    $out = drupal_convert_to_utf8($data, $encoding);
+    if ($out !== FALSE) {
+      $encoding = 'utf-8';
+      $data = preg_replace('/^(<\?xml[^>]+encoding)="(.+?)"/', '\\1="utf-8"', $out);
+    }
+    else {
+      watchdog('php', 'Could not convert XML encoding %s to UTF-8.', array('%s' => $encoding), WATCHDOG_WARNING);
+      return FALSE;
+    }
+  }
+
+  $xml_parser = xml_parser_create($encoding);
+  xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, 'utf-8');
+  return $xml_parser;
+}
+
+/**
+ * Converts data to UTF-8.
+ *
+ * Requires the iconv, GNU recode or mbstring PHP extension.
+ *
+ * @param $data
+ *   The data to be converted.
+ * @param $encoding
+ *   The encoding that the data is in.
+ *
+ * @return
+ *   Converted data or FALSE.
+ */
+function drupal_convert_to_utf8($data, $encoding) {
+  if (function_exists('iconv')) {
+    $out = @iconv($encoding, 'utf-8', $data);
+  }
+  elseif (function_exists('mb_convert_encoding')) {
+    $out = @mb_convert_encoding($data, 'utf-8', $encoding);
+  }
+  elseif (function_exists('recode_string')) {
+    $out = @recode_string($encoding . '..utf-8', $data);
+  }
+  else {
+    watchdog('php', 'Unsupported encoding %s. Please install iconv, GNU recode or mbstring for PHP.', array('%s' => $encoding), WATCHDOG_ERROR);
+    return FALSE;
+  }
+
+  return $out;
+}
+
+/**
+ * Truncates a UTF-8-encoded string safely to a number of bytes.
+ *
+ * If the end position is in the middle of a UTF-8 sequence, it scans backwards
+ * until the beginning of the byte sequence.
+ *
+ * Use this function whenever you want to chop off a string at an unsure
+ * location. On the other hand, if you're sure that you're splitting on a
+ * character boundary (e.g. after using strpos() or similar), you can safely
+ * use substr() instead.
+ *
+ * @param $string
+ *   The string to truncate.
+ * @param $len
+ *   An upper limit on the returned string length.
+ *
+ * @return
+ *   The truncated string.
+ */
+function drupal_truncate_bytes($string, $len) {
+  if (strlen($string) <= $len) {
+    return $string;
+  }
+  if ((ord($string[$len]) < 0x80) || (ord($string[$len]) >= 0xC0)) {
+    return substr($string, 0, $len);
+  }
+  // Scan backwards to beginning of the byte sequence.
+  while (--$len >= 0 && ord($string[$len]) >= 0x80 && ord($string[$len]) < 0xC0);
+
+  return substr($string, 0, $len);
+}
+
+/**
+ * Truncates a UTF-8-encoded string safely to a number of characters.
+ *
+ * @param $string
+ *   The string to truncate.
+ * @param $max_length
+ *   An upper limit on the returned string length, including trailing ellipsis
+ *   if $add_ellipsis is TRUE.
+ * @param $wordsafe
+ *   If TRUE, attempt to truncate on a word boundary. Word boundaries are
+ *   spaces, punctuation, and Unicode characters used as word boundaries in
+ *   non-Latin languages; see PREG_CLASS_UNICODE_WORD_BOUNDARY for more
+ *   information. If a word boundary cannot be found that would make the length
+ *   of the returned string fall within length guidelines (see parameters
+ *   $max_length and $min_wordsafe_length), word boundaries are ignored.
+ * @param $add_ellipsis
+ *   If TRUE, add t('...') to the end of the truncated string (defaults to
+ *   FALSE). The string length will still fall within $max_length.
+ * @param $min_wordsafe_length
+ *   If $wordsafe is TRUE, the minimum acceptable length for truncation (before
+ *   adding an ellipsis, if $add_ellipsis is TRUE). Has no effect if $wordsafe
+ *   is FALSE. This can be used to prevent having a very short resulting string
+ *   that will not be understandable. For instance, if you are truncating the
+ *   string "See myverylongurlexample.com for more information" to a word-safe
+ *   return length of 20, the only available word boundary within 20 characters
+ *   is after the word "See", which wouldn't leave a very informative string. If
+ *   you had set $min_wordsafe_length to 10, though, the function would realise
+ *   that "See" alone is too short, and would then just truncate ignoring word
+ *   boundaries, giving you "See myverylongurl..." (assuming you had set
+ *   $add_ellipses to TRUE).
+ *
+ * @return string
+ *   The truncated string.
+ */
+function truncate_utf8($string, $max_length, $wordsafe = FALSE, $add_ellipsis = FALSE, $min_wordsafe_length = 1) {
+  $ellipsis = '';
+  $max_length = max($max_length, 0);
+  $min_wordsafe_length = max($min_wordsafe_length, 0);
+
+  if (drupal_strlen($string) <= $max_length) {
+    // No truncation needed, so don't add ellipsis, just return.
+    return $string;
+  }
+
+  if ($add_ellipsis) {
+    // Truncate ellipsis in case $max_length is small.
+    $ellipsis = drupal_substr(t('...'), 0, $max_length);
+    $max_length -= drupal_strlen($ellipsis);
+    $max_length = max($max_length, 0);
+  }
+
+  if ($max_length <= $min_wordsafe_length) {
+    // Do not attempt word-safe if lengths are bad.
+    $wordsafe = FALSE;
+  }
+
+  if ($wordsafe) {
+    $matches = array();
+    // Find the last word boundary, if there is one within $min_wordsafe_length
+    // to $max_length characters. preg_match() is always greedy, so it will
+    // find the longest string possible.
+    $found = preg_match('/^(.{' . $min_wordsafe_length . ',' . $max_length . '})[' . PREG_CLASS_UNICODE_WORD_BOUNDARY . ']/u', $string, $matches);
+    if ($found) {
+      $string = $matches[1];
+    }
+    else {
+      $string = drupal_substr($string, 0, $max_length);
+    }
+  }
+  else {
+    $string = drupal_substr($string, 0, $max_length);
+  }
+
+  if ($add_ellipsis) {
+    $string .= $ellipsis;
+  }
+
+  return $string;
+}
+
+/**
+ * Encodes MIME/HTTP header values that contain incorrectly encoded characters.
+ *
+ * For example, mime_header_encode('tést.txt') returns "=?UTF-8?B?dMOpc3QudHh0?=".
+ *
+ * See http://www.rfc-editor.org/rfc/rfc2047.txt for more information.
+ *
+ * Notes:
+ * - Only encode strings that contain non-ASCII characters.
+ * - We progressively cut-off a chunk with truncate_utf8(). This is to ensure
+ *   each chunk starts and ends on a character boundary.
+ * - Using \n as the chunk separator may cause problems on some systems and may
+ *   have to be changed to \r\n or \r.
+ *
+ * @param $string
+ *   The header to encode.
+ *
+ * @return string
+ *   The mime-encoded header.
+ *
+ * @see mime_header_decode()
+ */
+function mime_header_encode($string) {
+  if (preg_match('/[^\x20-\x7E]/', $string)) {
+    $chunk_size = 47; // floor((75 - strlen("=?UTF-8?B??=")) * 0.75);
+    $len = strlen($string);
+    $output = '';
+    while ($len > 0) {
+      $chunk = drupal_truncate_bytes($string, $chunk_size);
+      $output .= ' =?UTF-8?B?' . base64_encode($chunk) . "?=\n";
+      $c = strlen($chunk);
+      $string = substr($string, $c);
+      $len -= $c;
+    }
+    return trim($output);
+  }
+  return $string;
+}
+
+/**
+ * Decodes MIME/HTTP encoded header values.
+ *
+ * @param $header
+ *   The header to decode.
+ *
+ * @return string
+ *   The mime-decoded header.
+ *
+ * @see mime_header_encode()
+ */
+function mime_header_decode($header) {
+  // First step: encoded chunks followed by other encoded chunks (need to collapse whitespace)
+  $header = preg_replace_callback('/=\?([^?]+)\?(Q|B)\?([^?]+|\?(?!=))\?=\s+(?==\?)/', '_mime_header_decode', $header);
+  // Second step: remaining chunks (do not collapse whitespace)
+  return preg_replace_callback('/=\?([^?]+)\?(Q|B)\?([^?]+|\?(?!=))\?=/', '_mime_header_decode', $header);
+}
+
+/**
+ * Decodes encoded header data passed from mime_header_decode().
+ *
+ * Callback for preg_replace_callback() within mime_header_decode().
+ *
+ * @param $matches
+ *   The array of matches from preg_replace_callback().
+ *
+ * @return string
+ *   The mime-decoded string.
+ *
+ * @see mime_header_decode()
+ */
+function _mime_header_decode($matches) {
+  // Regexp groups:
+  // 1: Character set name
+  // 2: Escaping method (Q or B)
+  // 3: Encoded data
+  $data = ($matches[2] == 'B') ? base64_decode($matches[3]) : str_replace('_', ' ', quoted_printable_decode($matches[3]));
+  if (strtolower($matches[1]) != 'utf-8') {
+    $data = drupal_convert_to_utf8($data, $matches[1]);
+  }
+  return $data;
+}
+
+/**
+ * Decodes all HTML entities (including numerical ones) to regular UTF-8 bytes.
+ *
+ * Double-escaped entities will only be decoded once ("&amp;lt;" becomes "&lt;"
+ * , not "<"). Be careful when using this function, as decode_entities can
+ * revert previous sanitization efforts (&lt;script&gt; will become <script>).
+ *
+ * @param $text
+ *   The text to decode entities in.
+ *
+ * @return
+ *   The input $text, with all HTML entities decoded once.
+ */
+function decode_entities($text) {
+  return html_entity_decode($text, ENT_QUOTES, 'UTF-8');
+}
+
+/**
+ * Counts the number of characters in a UTF-8 string.
+ *
+ * This is less than or equal to the byte count.
+ *
+ * @param $text
+ *   The string to run the operation on.
+ *
+ * @return integer
+ *   The length of the string.
+ *
+ * @ingroup php_wrappers
+ */
+function drupal_strlen($text) {
+  global $multibyte;
+  if ($multibyte == UNICODE_MULTIBYTE) {
+    return mb_strlen($text);
+  }
+  else {
+    // Do not count UTF-8 continuation bytes.
+    return strlen(preg_replace("/[\x80-\xBF]/", '', $text));
+  }
+}
+
+/**
+ * Uppercase a UTF-8 string.
+ *
+ * @param $text
+ *   The string to run the operation on.
+ *
+ * @return string
+ *   The string in uppercase.
+ *
+ * @ingroup php_wrappers
+ */
+function drupal_strtoupper($text) {
+  global $multibyte;
+  if ($multibyte == UNICODE_MULTIBYTE) {
+    return mb_strtoupper($text);
+  }
+  else {
+    // Use C-locale for ASCII-only uppercase
+    $text = strtoupper($text);
+    // Case flip Latin-1 accented letters
+    $text = preg_replace_callback('/\xC3[\xA0-\xB6\xB8-\xBE]/', '_unicode_caseflip', $text);
+    return $text;
+  }
+}
+
+/**
+ * Lowercase a UTF-8 string.
+ *
+ * @param $text
+ *   The string to run the operation on.
+ *
+ * @return string
+ *   The string in lowercase.
+ *
+ * @ingroup php_wrappers
+ */
+function drupal_strtolower($text) {
+  global $multibyte;
+  if ($multibyte == UNICODE_MULTIBYTE) {
+    return mb_strtolower($text);
+  }
+  else {
+    // Use C-locale for ASCII-only lowercase
+    $text = strtolower($text);
+    // Case flip Latin-1 accented letters
+    $text = preg_replace_callback('/\xC3[\x80-\x96\x98-\x9E]/', '_unicode_caseflip', $text);
+    return $text;
+  }
+}
+
+/**
+ * Flips U+C0-U+DE to U+E0-U+FD and back.
+ *
+ * @param $matches
+ *   An array of matches.
+ *
+ * @return array
+ *   The Latin-1 version of the array of matches.
+ *
+ * @see drupal_strtolower()
+ */
+function _unicode_caseflip($matches) {
+  return $matches[0][0] . chr(ord($matches[0][1]) ^ 32);
+}
+
+/**
+ * Capitalizes the first letter of a UTF-8 string.
+ *
+ * @param $text
+ *   The string to convert.
+ *
+ * @return
+ *   The string with the first letter as uppercase.
+ *
+ * @ingroup php_wrappers
+ */
+function drupal_ucfirst($text) {
+  // Note: no mbstring equivalent!
+  return drupal_strtoupper(drupal_substr($text, 0, 1)) . drupal_substr($text, 1);
+}
+
+/**
+ * Cuts off a piece of a string based on character indices and counts.
+ *
+ * Follows the same behavior as PHP's own substr() function. Note that for
+ * cutting off a string at a known character/substring location, the usage of
+ * PHP's normal strpos/substr is safe and much faster.
+ *
+ * @param $text
+ *   The input string.
+ * @param $start
+ *   The position at which to start reading.
+ * @param $length
+ *   The number of characters to read.
+ *
+ * @return
+ *   The shortened string.
+ *
+ * @ingroup php_wrappers
+ */
+function drupal_substr($text, $start, $length = NULL) {
+  global $multibyte;
+  if ($multibyte == UNICODE_MULTIBYTE) {
+    return $length === NULL ? mb_substr($text, $start) : mb_substr($text, $start, $length);
+  }
+  else {
+    $strlen = strlen($text);
+    // Find the starting byte offset.
+    $bytes = 0;
+    if ($start > 0) {
+      // Count all the continuation bytes from the start until we have found
+      // $start characters or the end of the string.
+      $bytes = -1; $chars = -1;
+      while ($bytes < $strlen - 1 && $chars < $start) {
+        $bytes++;
+        $c = ord($text[$bytes]);
+        if ($c < 0x80 || $c >= 0xC0) {
+          $chars++;
+        }
+      }
+    }
+    elseif ($start < 0) {
+      // Count all the continuation bytes from the end until we have found
+      // abs($start) characters.
+      $start = abs($start);
+      $bytes = $strlen; $chars = 0;
+      while ($bytes > 0 && $chars < $start) {
+        $bytes--;
+        $c = ord($text[$bytes]);
+        if ($c < 0x80 || $c >= 0xC0) {
+          $chars++;
+        }
+      }
+    }
+    $istart = $bytes;
+
+    // Find the ending byte offset.
+    if ($length === NULL) {
+      $iend = $strlen;
+    }
+    elseif ($length > 0) {
+      // Count all the continuation bytes from the starting index until we have
+      // found $length characters or reached the end of the string, then
+      // backtrace one byte.
+      $iend = $istart - 1;
+      $chars = -1;
+      $last_real = FALSE;
+      while ($iend < $strlen - 1 && $chars < $length) {
+        $iend++;
+        $c = ord($text[$iend]);
+        $last_real = FALSE;
+        if ($c < 0x80 || $c >= 0xC0) {
+          $chars++;
+          $last_real = TRUE;
+        }
+      }
+      // Backtrace one byte if the last character we found was a real character
+      // and we don't need it.
+      if ($last_real && $chars >= $length) {
+        $iend--;
+      }
+    }
+    elseif ($length < 0) {
+      // Count all the continuation bytes from the end until we have found
+      // abs($start) characters, then backtrace one byte.
+      $length = abs($length);
+      $iend = $strlen; $chars = 0;
+      while ($iend > 0 && $chars < $length) {
+        $iend--;
+        $c = ord($text[$iend]);
+        if ($c < 0x80 || $c >= 0xC0) {
+          $chars++;
+        }
+      }
+      // Backtrace one byte if we are not at the beginning of the string.
+      if ($iend > 0) {
+        $iend--;
+      }
+    }
+    else {
+      // $length == 0, return an empty string.
+      return '';
+    }
+
+    return substr($text, $istart, max(0, $iend - $istart + 1));
+  }
+}
diff --git a/htmltest/includes/update.inc b/htmltest/includes/update.inc
new file mode 100644
index 00000000..a17161c9
--- /dev/null
+++ b/htmltest/includes/update.inc
@@ -0,0 +1,1477 @@
+<?php
+
+/**
+ * @file
+ * Drupal database update API.
+ *
+ * This file contains functions to perform database updates for a Drupal
+ * installation. It is included and used extensively by update.php.
+ */
+
+/**
+ * Minimum schema version of Drupal 6 required for upgrade to Drupal 7.
+ *
+ * Upgrades from Drupal 6 to Drupal 7 require that Drupal 6 be running
+ * the most recent version, or the upgrade could fail. We can't easily
+ * check the Drupal 6 version once the update process has begun, so instead
+ * we check the schema version of system.module in the system table.
+ */
+define('REQUIRED_D6_SCHEMA_VERSION', '6055');
+
+/**
+ * Disable any items in the {system} table that are not core compatible.
+ */
+function update_fix_compatibility() {
+  $incompatible = array();
+  $result = db_query("SELECT name, type, status FROM {system} WHERE status = 1 AND type IN ('module','theme')");
+  foreach ($result as $row) {
+    if (update_check_incompatibility($row->name, $row->type)) {
+      $incompatible[] = $row->name;
+    }
+  }
+  if (!empty($incompatible)) {
+    db_update('system')
+      ->fields(array('status' => 0))
+      ->condition('name', $incompatible, 'IN')
+      ->execute();
+  }
+}
+
+/**
+ * Tests the compatibility of a module or theme.
+ */
+function update_check_incompatibility($name, $type = 'module') {
+  static $themes, $modules;
+
+  // Store values of expensive functions for future use.
+  if (empty($themes) || empty($modules)) {
+    // We need to do a full rebuild here to make sure the database reflects any
+    // code changes that were made in the filesystem before the update script
+    // was initiated.
+    $themes = system_rebuild_theme_data();
+    $modules = system_rebuild_module_data();
+  }
+
+  if ($type == 'module' && isset($modules[$name])) {
+    $file = $modules[$name];
+  }
+  elseif ($type == 'theme' && isset($themes[$name])) {
+    $file = $themes[$name];
+  }
+  if (!isset($file)
+      || !isset($file->info['core'])
+      || $file->info['core'] != DRUPAL_CORE_COMPATIBILITY
+      || version_compare(phpversion(), $file->info['php']) < 0) {
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
+ * Performs extra steps required to bootstrap when using a Drupal 6 database.
+ *
+ * Users who still have a Drupal 6 database (and are in the process of
+ * updating to Drupal 7) need extra help before a full bootstrap can be
+ * achieved. This function does the necessary preliminary work that allows
+ * the bootstrap to be successful.
+ *
+ * No access check has been performed when this function is called, so no
+ * irreversible changes to the database are made here.
+ */
+function update_prepare_d7_bootstrap() {
+  // Allow the bootstrap to proceed even if a Drupal 6 settings.php file is
+  // still being used.
+  include_once DRUPAL_ROOT . '/includes/install.inc';
+  drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
+  global $databases, $db_url, $db_prefix, $update_rewrite_settings;
+  if (empty($databases) && !empty($db_url)) {
+    $databases = update_parse_db_url($db_url, $db_prefix);
+    // Record the fact that the settings.php file will need to be rewritten.
+    $update_rewrite_settings = TRUE;
+    $settings_file = conf_path() . '/settings.php';
+    $writable = drupal_verify_install_file($settings_file, FILE_EXIST|FILE_READABLE|FILE_WRITABLE);
+    $requirements = array(
+      'settings file' => array(
+        'title' => 'Settings file',
+        'value' => $writable ? 'The settings file is writable.' : 'The settings file is not writable.',
+        'severity' => $writable ? REQUIREMENT_OK : REQUIREMENT_ERROR,
+        'description' => $writable ? '' : 'Drupal requires write permissions to <em>' . $settings_file . '</em> during the update process. If you are unsure how to grant file permissions, consult the <a href="http://drupal.org/server-permissions">online handbook</a>.',
+      ),
+    );
+    update_extra_requirements($requirements);
+  }
+
+  // The new {blocked_ips} table is used in Drupal 7 to store a list of
+  // banned IP addresses. If this table doesn't exist then we are still
+  // running on a Drupal 6 database, so we suppress the unavoidable errors
+  // that occur by creating a static list.
+  $GLOBALS['conf']['blocked_ips'] = array();
+
+  // Check that PDO is available and that the correct PDO database driver is
+  // loaded. Bootstrapping to DRUPAL_BOOTSTRAP_DATABASE will result in a fatal
+  // error otherwise.
+  $message = '';
+  $pdo_link = 'http://drupal.org/requirements/pdo';
+  // Check that PDO is loaded.
+  if (!extension_loaded('pdo')) {
+    $message = '<h2>PDO is required!</h2><p>Drupal 7 requires PHP ' . DRUPAL_MINIMUM_PHP . ' or higher with the PHP Data Objects (PDO) extension enabled.</p>';
+  }
+  // The PDO::ATTR_DEFAULT_FETCH_MODE constant is not available in the PECL
+  // version of PDO.
+  elseif (!defined('PDO::ATTR_DEFAULT_FETCH_MODE')) {
+    $message = '<h2>The wrong version of PDO is installed!</h2><p>Drupal 7 requires the PHP Data Objects (PDO) extension from PHP core to be enabled. This system has the older PECL version installed.';
+    $pdo_link = 'http://drupal.org/requirements/pdo#pecl';
+  }
+  // Check that the correct driver is loaded for the database being updated.
+  // If we have no driver information (for example, if someone tried to create
+  // the Drupal 7 $databases array themselves but did not do it correctly),
+  // this message will be confusing, so do not perform the check; instead, just
+  // let the database connection fail in the code that follows.
+  elseif (isset($databases['default']['default']['driver']) && !in_array($databases['default']['default']['driver'], PDO::getAvailableDrivers())) {
+    $message = '<h2>A PDO database driver is required!</h2><p>You need to enable the PDO_' . strtoupper($databases['default']['default']['driver']) . ' database driver for PHP ' . DRUPAL_MINIMUM_PHP . ' or higher so that Drupal 7 can access the database.</p>';
+  }
+  if ($message) {
+    print $message . '<p>See the <a href="' . $pdo_link . '">system requirements page</a> for more information.</p>';
+    exit();
+  }
+
+  // Allow the database system to work even if the registry has not been
+  // created yet.
+  drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);
+
+  // If the site has not updated to Drupal 7 yet, check to make sure that it is
+  // running an up-to-date version of Drupal 6 before proceeding. Note this has
+  // to happen AFTER the database bootstraps because of
+  // drupal_get_installed_schema_version().
+  $system_schema = drupal_get_installed_schema_version('system');
+  if ($system_schema < 7000) {
+    $has_required_schema = $system_schema >= REQUIRED_D6_SCHEMA_VERSION;
+    $requirements = array(
+      'drupal 6 version' => array(
+        'title' => 'Drupal 6 version',
+        'value' => $has_required_schema ? 'You are running a current version of Drupal 6.' : 'You are not running a current version of Drupal 6',
+        'severity' => $has_required_schema ? REQUIREMENT_OK : REQUIREMENT_ERROR,
+        'description' => $has_required_schema ? '' : 'Please update your Drupal 6 installation to the most recent version before attempting to upgrade to Drupal 7',
+      ),
+    );
+
+    // Make sure that the database environment is properly set up.
+    try {
+      db_run_tasks(db_driver());
+    }
+    catch (DatabaseTaskException $e) {
+      $requirements['database tasks'] = array(
+        'title' => 'Database environment',
+        'value' => 'There is a problem with your database environment',
+        'severity' => REQUIREMENT_ERROR,
+        'description' => $e->getMessage(),
+      );
+    }
+
+    update_extra_requirements($requirements);
+
+    // Allow a D6 session to work, since the upgrade has not been performed yet.
+    $d6_session_name = update_get_d6_session_name();
+    if (!empty($_COOKIE[$d6_session_name])) {
+      // Set the current sid to the one found in the D6 cookie.
+      $sid = $_COOKIE[$d6_session_name];
+      $_COOKIE[session_name()] = $sid;
+      session_id($sid);
+    }
+
+    // Upgrading from D6 to D7.{0,1,2,3,4,8,...} is different than upgrading
+    // from D6 to D7.{5,6,7} which should be considered broken. To be able to
+    // properly handle this difference in node_update_7012 we need to keep track
+    // of whether a D6 > D7 upgrade or a D7 > D7 update is running.
+    // Since variable_set() is not available here, the D6 status is being saved
+    // in a local variable to be able to store it later.
+    $update_d6 = TRUE;
+  }
+
+  // Create the registry tables.
+  if (!db_table_exists('registry')) {
+    $schema['registry'] = array(
+      'fields' => array(
+        'name'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+        'type'   => array('type' => 'varchar', 'length' => 9, 'not null' => TRUE, 'default' => ''),
+        'filename'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+        'module'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+        'weight'   => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
+      ),
+      'primary key' => array('name', 'type'),
+      'indexes' => array(
+        'hook' => array('type', 'weight', 'module'),
+      ),
+    );
+    db_create_table('registry', $schema['registry']);
+  }
+  if (!db_table_exists('registry_file')) {
+    $schema['registry_file'] = array(
+      'fields' => array(
+        'filename'   => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE),
+        'hash'   => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE),
+      ),
+      'primary key' => array('filename'),
+    );
+    db_create_table('registry_file', $schema['registry_file']);
+  }
+
+  // Older versions of Drupal 6 do not include the semaphore table, which is
+  // required to bootstrap, so we add it now so that we can bootstrap and
+  // provide a reasonable error message.
+  if (!db_table_exists('semaphore')) {
+    $semaphore = array(
+      'description' => 'Table for holding semaphores, locks, flags, etc. that cannot be stored as Drupal variables since they must not be cached.',
+      'fields' => array(
+        'name' => array(
+          'description' => 'Primary Key: Unique name.',
+          'type' => 'varchar',
+          'length' => 255,
+          'not null' => TRUE,
+          'default' => ''
+        ),
+        'value' => array(
+          'description' => 'A value for the semaphore.',
+          'type' => 'varchar',
+          'length' => 255,
+          'not null' => TRUE,
+          'default' => ''
+        ),
+        'expire' => array(
+          'description' => 'A Unix timestamp with microseconds indicating when the semaphore should expire.',
+          'type' => 'float',
+          'size' => 'big',
+          'not null' => TRUE
+        ),
+      ),
+      'indexes' => array(
+        'value' => array('value'),
+        'expire' => array('expire'),
+      ),
+      'primary key' => array('name'),
+    );
+    db_create_table('semaphore', $semaphore);
+  }
+
+  // The new cache_bootstrap bin is required to bootstrap to
+  // DRUPAL_BOOTSTRAP_SESSION, so create it here rather than in
+  // update_fix_d7_requirements().
+  if (!db_table_exists('cache_bootstrap')) {
+    $cache_bootstrap = array(
+      'description' => 'Cache table for data required to bootstrap Drupal, may be routed to a shared memory cache.',
+      'fields' => array(
+        'cid' => array(
+          'description' => 'Primary Key: Unique cache ID.',
+          'type' => 'varchar',
+          'length' => 255,
+          'not null' => TRUE,
+          'default' => '',
+        ),
+        'data' => array(
+          'description' => 'A collection of data to cache.',
+          'type' => 'blob',
+          'not null' => FALSE,
+          'size' => 'big',
+        ),
+        'expire' => array(
+          'description' => 'A Unix timestamp indicating when the cache entry should expire, or 0 for never.',
+          'type' => 'int',
+          'not null' => TRUE,
+          'default' => 0,
+        ),
+        'created' => array(
+          'description' => 'A Unix timestamp indicating when the cache entry was created.',
+          'type' => 'int',
+          'not null' => TRUE,
+          'default' => 0,
+        ),
+        'serialized' => array(
+          'description' => 'A flag to indicate whether content is serialized (1) or not (0).',
+          'type' => 'int',
+          'size' => 'small',
+          'not null' => TRUE,
+          'default' => 0,
+        ),
+      ),
+      'indexes' => array(
+        'expire' => array('expire'),
+      ),
+      'primary key' => array('cid'),
+    );
+    db_create_table('cache_bootstrap', $cache_bootstrap);
+  }
+
+  // Set a valid timezone for 6 -> 7 upgrade process.
+  drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES);
+  $timezone_offset = variable_get('date_default_timezone', 0);
+  if (is_numeric($timezone_offset)) {
+    // Save the original offset.
+    variable_set('date_temporary_timezone', $timezone_offset);
+    // Set the timezone for this request only.
+    $GLOBALS['conf']['date_default_timezone'] = 'UTC';
+  }
+
+  // This allows update functions to tell if an upgrade from D6 is running.
+  if (!empty($update_d6)) {
+    variable_set('update_d6', TRUE);
+  }
+}
+
+/**
+ * A helper function that modules can use to assist with the transformation
+ * from numeric block deltas to string block deltas during the 6.x -> 7.x
+ * upgrade.
+ *
+ * @todo This function should be removed in 8.x.
+ *
+ * @param $sandbox
+ *   An array holding data for the batch process.
+ * @param $renamed_deltas
+ *   An associative array.  Keys are module names, values an associative array
+ *   mapping the old block deltas to the new block deltas for the module.
+ *   Example:
+ *   @code
+ *     $renamed_deltas = array(
+ *       'mymodule' =>
+ *         array(
+ *           0 => 'mymodule-block-1',
+ *           1 => 'mymodule-block-2',
+ *         ),
+ *     );
+ *   @endcode
+ * @param $moved_deltas
+ *   An associative array. Keys are source module names, values an associative
+ *   array mapping the (possibly renamed) block name to the new module name.
+ *   Example:
+ *   @code
+ *     $moved_deltas = array(
+ *       'user' =>
+ *         array(
+ *           'navigation' => 'system',
+ *         ),
+ *     );
+ *   @endcode
+ */
+function update_fix_d7_block_deltas(&$sandbox, $renamed_deltas, $moved_deltas) {
+  // Loop through each block and make changes to the block tables.
+  // Only run this the first time through the batch update.
+  if (!isset($sandbox['progress'])) {
+    // Determine whether to use the old or new block table names.
+    $block_tables = db_table_exists('blocks') ? array('blocks', 'blocks_roles') : array('block', 'block_role');
+    foreach ($block_tables as $table) {
+      foreach ($renamed_deltas as $module => $deltas) {
+        foreach ($deltas as $old_delta => $new_delta) {
+          // Only do the update if the old block actually exists.
+          $block_exists = db_query("SELECT COUNT(*) FROM {" . $table . "} WHERE module = :module AND delta = :delta", array(
+              ':module' => $module,
+              ':delta' => $old_delta,
+            ))
+            ->fetchField();
+          if ($block_exists) {
+            // Delete any existing blocks with the new module+delta.
+            db_delete($table)
+              ->condition('module', $module)
+              ->condition('delta', $new_delta)
+              ->execute();
+            // Rename the old block to the new module+delta.
+            db_update($table)
+              ->fields(array('delta' => $new_delta))
+              ->condition('module', $module)
+              ->condition('delta', $old_delta)
+              ->execute();
+          }
+        }
+      }
+      foreach ($moved_deltas as $old_module => $deltas) {
+        foreach ($deltas as $delta => $new_module) {
+          // Only do the update if the old block actually exists.
+          $block_exists = db_query("SELECT COUNT(*) FROM {" . $table . "} WHERE module = :module AND delta = :delta", array(
+              ':module' => $old_module,
+              ':delta' => $delta,
+            ))
+            ->fetchField();
+          if ($block_exists) {
+            // Delete any existing blocks with the new module+delta.
+            db_delete($table)
+              ->condition('module', $new_module)
+              ->condition('delta', $delta)
+              ->execute();
+            // Rename the old block to the new module+delta.
+            db_update($table)
+              ->fields(array('module' => $new_module))
+              ->condition('module', $old_module)
+              ->condition('delta', $delta)
+              ->execute();
+          }
+        }
+      }
+    }
+
+    // Initialize batch update information.
+    $sandbox['progress'] = 0;
+    $sandbox['last_user_processed'] = -1;
+    $sandbox['max'] = db_query("SELECT COUNT(*) FROM {users} WHERE data LIKE :block", array(
+        ':block' => '%' . db_like(serialize('block')) . '%',
+      ))
+      ->fetchField();
+  }
+  // Now do the batch update of the user-specific block visibility settings.
+  $limit = 100;
+  $result = db_select('users', 'u')
+    ->fields('u', array('uid', 'data'))
+    ->condition('uid', $sandbox['last_user_processed'], '>')
+    ->condition('data', '%' . db_like(serialize('block')) . '%', 'LIKE')
+    ->orderBy('uid', 'ASC')
+    ->range(0, $limit)
+    ->execute();
+  foreach ($result as $row) {
+    $data = unserialize($row->data);
+    $user_needs_update = FALSE;
+    foreach ($renamed_deltas as $module => $deltas) {
+      foreach ($deltas as $old_delta => $new_delta) {
+        if (isset($data['block'][$module][$old_delta])) {
+          // Transfer the old block visibility settings to the newly-renamed
+          // block, and mark this user for a database update.
+          $data['block'][$module][$new_delta] = $data['block'][$module][$old_delta];
+          unset($data['block'][$module][$old_delta]);
+          $user_needs_update = TRUE;
+        }
+      }
+    }
+    foreach ($moved_deltas as $old_module => $deltas) {
+      foreach ($deltas as $delta => $new_module) {
+        if (isset($data['block'][$old_module][$delta])) {
+          // Transfer the old block visibility settings to the moved
+          // block, and mark this user for a database update.
+          $data['block'][$new_module][$delta] = $data['block'][$old_module][$delta];
+          unset($data['block'][$old_module][$delta]);
+          $user_needs_update = TRUE;
+        }
+      }
+    }
+    // Update the current user.
+    if ($user_needs_update) {
+      db_update('users')
+        ->fields(array('data' => serialize($data)))
+        ->condition('uid', $row->uid)
+        ->execute();
+    }
+    // Update our progress information for the batch update.
+    $sandbox['progress']++;
+    $sandbox['last_user_processed'] = $row->uid;
+  }
+  // Indicate our current progress to the batch update system.
+  if ($sandbox['progress'] < $sandbox['max']) {
+    $sandbox['#finished'] = $sandbox['progress'] / $sandbox['max'];
+  }
+}
+
+/**
+ * Perform Drupal 6.x to 7.x updates that are required for update.php
+ * to function properly.
+ *
+ * This function runs when update.php is run the first time for 7.x,
+ * even before updates are selected or performed. It is important
+ * that if updates are not ultimately performed that no changes are
+ * made which make it impossible to continue using the prior version.
+ */
+function update_fix_d7_requirements() {
+  global $conf;
+
+  // Rewrite the settings.php file if necessary, see
+  // update_prepare_d7_bootstrap().
+  global $update_rewrite_settings, $db_url, $db_prefix;
+  if (!empty($update_rewrite_settings)) {
+    $databases = update_parse_db_url($db_url, $db_prefix);
+    $salt = drupal_hash_base64(drupal_random_bytes(55));
+    file_put_contents(conf_path() . '/settings.php', "\n" . '$databases = ' . var_export($databases, TRUE) . ";\n\$drupal_hash_salt = '$salt';", FILE_APPEND);
+  }
+  if (drupal_get_installed_schema_version('system') < 7000 && !variable_get('update_d7_requirements', FALSE)) {
+    // Change 6.x system table field values to 7.x equivalent.
+    // Change field values.
+    db_change_field('system', 'schema_version', 'schema_version', array(
+     'type' => 'int',
+     'size' => 'small',
+     'not null' => TRUE,
+     'default' => -1)
+    );
+    db_change_field('system', 'status', 'status', array(
+      'type' => 'int', 'not null' => TRUE, 'default' => 0));
+    db_change_field('system', 'weight', 'weight', array(
+      'type' => 'int', 'not null' => TRUE, 'default' => 0));
+    db_change_field('system', 'bootstrap', 'bootstrap', array(
+      'type' => 'int', 'not null' => TRUE, 'default' => 0));
+    // Drop and recreate 6.x indexes.
+    db_drop_index('system', 'bootstrap');
+    db_add_index('system', 'bootstrap', array(
+      'status', 'bootstrap', array('type', 12), 'weight', 'name'));
+
+    db_drop_index('system' ,'modules');
+    db_add_index('system', 'modules', array(array(
+      'type', 12), 'status', 'weight', 'name'));
+
+    db_drop_index('system', 'type_name');
+    db_add_index('system', 'type_name', array(array('type', 12), 'name'));
+    // Add 7.x indexes.
+    db_add_index('system', 'system_list', array('weight', 'name'));
+
+    // Add the cache_path table.
+    if (db_table_exists('cache_path')) {
+      db_drop_table('cache_path');
+    }
+    require_once('./modules/system/system.install');
+    $schema['cache_path'] = system_schema_cache_7054();
+    $schema['cache_path']['description'] = 'Cache table used for path alias lookups.';
+    db_create_table('cache_path', $schema['cache_path']);
+
+    // system_update_7042() renames columns, but these are needed to bootstrap.
+    // Add empty columns for now.
+    db_add_field('url_alias', 'source', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''));
+    db_add_field('url_alias', 'alias', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''));
+
+    // Add new columns to {menu_router}.
+    db_add_field('menu_router', 'delivery_callback', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''));
+    db_add_field('menu_router', 'context', array(
+      'description' => 'Only for local tasks (tabs) - the context of a local task to control its placement.',
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ));
+    db_drop_index('menu_router', 'tab_parent');
+    db_add_index('menu_router', 'tab_parent', array(array('tab_parent', 64), 'weight', 'title'));
+    db_add_field('menu_router', 'theme_callback', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''));
+    db_add_field('menu_router', 'theme_arguments', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''));
+
+    // Add the role_permission table.
+    $schema['role_permission'] = array(
+      'fields' => array(
+        'rid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'permission' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+    ),
+    'primary key' => array('rid', 'permission'),
+    'indexes' => array(
+      'permission' => array('permission'),
+      ),
+    );
+    db_create_table('role_permission', $schema['role_permission']);
+
+    // Drops and recreates semaphore value index.
+    db_drop_index('semaphore', 'value');
+    db_add_index('semaphore', 'value', array('value'));
+
+    $schema['date_format_type'] = array(
+      'description' => 'Stores configured date format types.',
+      'fields' => array(
+        'type' => array(
+          'description' => 'The date format type, e.g. medium.',
+          'type' => 'varchar',
+          'length' => 64,
+          'not null' => TRUE,
+        ),
+        'title' => array(
+          'description' => 'The human readable name of the format type.',
+          'type' => 'varchar',
+          'length' => 255,
+          'not null' => TRUE,
+        ),
+        'locked' => array(
+          'description' => 'Whether or not this is a system provided format.',
+          'type' => 'int',
+          'size' => 'tiny',
+          'default' => 0,
+          'not null' => TRUE,
+        ),
+      ),
+      'primary key' => array('type'),
+    );
+
+    $schema['date_formats'] = array(
+      'description' => 'Stores configured date formats.',
+      'fields' => array(
+        'dfid' => array(
+          'description' => 'The date format identifier.',
+          'type' => 'serial',
+          'not null' => TRUE,
+          'unsigned' => TRUE,
+        ),
+        'format' => array(
+          'description' => 'The date format string.',
+          'type' => 'varchar',
+          'length' => 100,
+          'not null' => TRUE,
+        ),
+        'type' => array(
+          'description' => 'The date format type, e.g. medium.',
+          'type' => 'varchar',
+          'length' => 64,
+          'not null' => TRUE,
+        ),
+        'locked' => array(
+          'description' => 'Whether or not this format can be modified.',
+          'type' => 'int',
+          'size' => 'tiny',
+          'default' => 0,
+          'not null' => TRUE,
+        ),
+      ),
+      'primary key' => array('dfid'),
+      'unique keys' => array('formats' => array('format', 'type')),
+    );
+
+    $schema['date_format_locale'] = array(
+      'description' => 'Stores configured date formats for each locale.',
+      'fields' => array(
+        'format' => array(
+          'description' => 'The date format string.',
+          'type' => 'varchar',
+          'length' => 100,
+          'not null' => TRUE,
+        ),
+        'type' => array(
+          'description' => 'The date format type, e.g. medium.',
+          'type' => 'varchar',
+          'length' => 64,
+          'not null' => TRUE,
+        ),
+        'language' => array(
+          'description' => 'A {languages}.language for this format to be used with.',
+          'type' => 'varchar',
+          'length' => 12,
+          'not null' => TRUE,
+        ),
+      ),
+      'primary key' => array('type', 'language'),
+    );
+
+    db_create_table('date_format_type', $schema['date_format_type']);
+    // Sites that have the Drupal 6 Date module installed already have the
+    // following tables.
+    if (db_table_exists('date_formats')) {
+      db_rename_table('date_formats', 'd6_date_formats');
+    }
+    db_create_table('date_formats', $schema['date_formats']);
+    if (db_table_exists('date_format_locale')) {
+      db_rename_table('date_format_locale', 'd6_date_format_locale');
+    }
+    db_create_table('date_format_locale', $schema['date_format_locale']);
+
+    // Add the queue table.
+    $schema['queue'] = array(
+      'description' => 'Stores items in queues.',
+      'fields' => array(
+        'item_id' => array(
+          'type' => 'serial',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+          'description' => 'Primary Key: Unique item ID.',
+        ),
+        'name' => array(
+          'type' => 'varchar',
+          'length' => 255,
+          'not null' => TRUE,
+          'default' => '',
+          'description' => 'The queue name.',
+        ),
+        'data' => array(
+          'type' => 'blob',
+          'not null' => FALSE,
+          'size' => 'big',
+          'serialize' => TRUE,
+          'description' => 'The arbitrary data for the item.',
+        ),
+        'expire' => array(
+          'type' => 'int',
+          'not null' => TRUE,
+          'default' => 0,
+          'description' => 'Timestamp when the claim lease expires on the item.',
+        ),
+        'created' => array(
+          'type' => 'int',
+          'not null' => TRUE,
+          'default' => 0,
+          'description' => 'Timestamp when the item was created.',
+        ),
+      ),
+      'primary key' => array('item_id'),
+      'indexes' => array(
+        'name_created' => array('name', 'created'),
+        'expire' => array('expire'),
+      ),
+    );
+    // Check for queue table that may remain from D5 or D6, if found
+    //drop it.
+    if (db_table_exists('queue')) {
+      db_drop_table('queue');
+    }
+
+    db_create_table('queue', $schema['queue']);
+
+    // Create the sequences table.
+    $schema['sequences'] = array(
+      'description' => 'Stores IDs.',
+      'fields' => array(
+        'value' => array(
+          'description' => 'The value of the sequence.',
+          'type' => 'serial',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+        ),
+       ),
+      'primary key' => array('value'),
+    );
+    // Check for sequences table that may remain from D5 or D6, if found
+    //drop it.
+    if (db_table_exists('sequences')) {
+      db_drop_table('sequences');
+    }
+    db_create_table('sequences', $schema['sequences']);
+    // Initialize the table with the maximum current increment of the tables
+    // that will rely on it for their ids.
+    $max_aid = db_query('SELECT MAX(aid) FROM {actions_aid}')->fetchField();
+    $max_uid = db_query('SELECT MAX(uid) FROM {users}')->fetchField();
+    $max_batch_id = db_query('SELECT MAX(bid) FROM {batch}')->fetchField();
+    db_insert('sequences')->fields(array('value' => max($max_aid, $max_uid, $max_batch_id)))->execute();
+
+    // Add column for locale context.
+    if (db_table_exists('locales_source')) {
+      db_add_field('locales_source', 'context', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '', 'description' => 'The context this string applies to.'));
+    }
+
+    // Rename 'site_offline_message' variable to 'maintenance_mode_message'
+    // and 'site_offline' variable to 'maintenance_mode'.
+    // Old variable is removed in update for system.module, see
+    // system_update_7072().
+    if ($message = variable_get('site_offline_message', NULL)) {
+      variable_set('maintenance_mode_message', $message);
+    }
+    // Old variable is removed in update for system.module, see
+    // system_update_7069().
+    $site_offline = variable_get('site_offline', -1);
+    if ($site_offline != -1) {
+      variable_set('maintenance_mode', $site_offline);
+    }
+
+    // Add ssid column and index.
+    db_add_field('sessions', 'ssid', array('description' => "Secure session ID. The value is generated by Drupal's session handlers.", 'type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''));
+    db_add_index('sessions', 'ssid', array('ssid'));
+    // Drop existing primary key.
+    db_drop_primary_key('sessions');
+    // Add new primary key.
+    db_add_primary_key('sessions', array('sid', 'ssid'));
+
+    // Allow longer javascript file names.
+    if (db_table_exists('languages')) {
+      db_change_field('languages', 'javascript', 'javascript', array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => ''));
+    }
+
+    // Rename action description to label.
+    db_change_field('actions', 'description', 'label', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => '0'));
+
+    variable_set('update_d7_requirements', TRUE);
+  }
+
+  update_fix_d7_install_profile();
+}
+
+/**
+ * Register the currently installed profile in the system table.
+ *
+ * Installation profiles are now treated as modules by Drupal, and have an
+ * upgrade path based on their schema version in the system table.
+ *
+ * The installation profile will be set to schema_version 0, as it has already
+ * been installed. Any other hook_update_N functions provided by the
+ * installation profile will be run by update.php.
+ */
+function update_fix_d7_install_profile() {
+  $profile = drupal_get_profile();
+
+  $results = db_select('system', 's')
+    ->fields('s', array('name', 'schema_version'))
+    ->condition('name', $profile)
+    ->condition('type', 'module')
+    ->execute()
+    ->fetchAll();
+
+  if (empty($results)) {
+    $filename = 'profiles/' . $profile . '/' . $profile . '.profile';
+
+    // Read profile info file
+    $info = drupal_parse_info_file(dirname($filename) . '/' . $profile . '.info');
+
+    // Merge in defaults.
+    $info = $info + array(
+      'dependencies' => array(),
+      'description' => '',
+      'package' => 'Other',
+      'version' => NULL,
+      'php' => DRUPAL_MINIMUM_PHP,
+      'files' => array(),
+    );
+
+    $values = array(
+      'filename' => $filename,
+      'name' => $profile,
+      'info' => serialize($info),
+      'schema_version' => 0,
+      'type' => 'module',
+      'status' => 1,
+      'owner' => '',
+    );
+
+    // Installation profile hooks are always executed last by the module system
+    $values['weight'] = 1000;
+
+    // Initializing the system table entry for the installation profile
+    db_insert('system')
+      ->fields(array_keys($values))
+      ->values($values)
+      ->execute();
+
+    // Reset the cached schema version.
+    drupal_get_installed_schema_version($profile, TRUE);
+
+    // Load the updates again to make sure the installation profile updates
+    // are loaded.
+    drupal_load_updates();
+  }
+}
+
+/**
+ * Parse pre-Drupal 7 database connection URLs and return D7 compatible array.
+ *
+ * @return
+ *   Drupal 7 DBTNG compatible array of database connection information.
+ */
+function update_parse_db_url($db_url, $db_prefix) {
+  $databases = array();
+  if (!is_array($db_url)) {
+    $db_url = array('default' => $db_url);
+  }
+  foreach ($db_url as $database => $url) {
+    $url = parse_url($url);
+    $databases[$database]['default'] = array(
+      // MySQLi uses the mysql driver.
+      'driver' => $url['scheme'] == 'mysqli' ? 'mysql' : $url['scheme'],
+      // Remove the leading slash to get the database name.
+      'database' => substr(urldecode($url['path']), 1),
+      'username' => urldecode($url['user']),
+      'password' => isset($url['pass']) ? urldecode($url['pass']) : '',
+      'host' => urldecode($url['host']),
+      'port' => isset($url['port']) ? urldecode($url['port']) : '',
+    );
+    if (isset($db_prefix)) {
+      $databases[$database]['default']['prefix'] = $db_prefix;
+    }
+  }
+  return $databases;
+}
+
+/**
+ * Constructs a session name compatible with a D6 environment.
+ *
+ * @return
+ *   D6-compatible session name string.
+ *
+ * @see drupal_settings_initialize()
+ */
+function update_get_d6_session_name() {
+  global $base_url, $cookie_domain;
+  $cookie_secure = ini_get('session.cookie_secure');
+
+  // If a custom cookie domain is set in settings.php, that variable forms
+  // the basis of the session name. Re-compute the D7 hashing method to find
+  // out if $cookie_domain was used as the session name.
+  if (($cookie_secure ? 'SSESS' : 'SESS') . substr(hash('sha256', $cookie_domain), 0, 32) == session_name()) {
+    $session_name = $cookie_domain;
+  }
+  else {
+    // Otherwise use $base_url as session name, without the protocol
+    // to use the same session identifiers across HTTP and HTTPS.
+    list( , $session_name) = explode('://', $base_url, 2);
+  }
+
+  if ($cookie_secure) {
+    $session_name .= 'SSL';
+  }
+
+  return 'SESS' . md5($session_name);
+}
+
+/**
+ * Performs one update and stores the results for display on the results page.
+ *
+ * If an update function completes successfully, it should return a message
+ * as a string indicating success, for example:
+ * @code
+ * return t('New index added successfully.');
+ * @endcode
+ *
+ * Alternatively, it may return nothing. In that case, no message
+ * will be displayed at all.
+ *
+ * If it fails for whatever reason, it should throw an instance of
+ * DrupalUpdateException with an appropriate error message, for example:
+ * @code
+ * throw new DrupalUpdateException(t('Description of what went wrong'));
+ * @endcode
+ *
+ * If an exception is thrown, the current update and all updates that depend on
+ * it will be aborted. The schema version will not be updated in this case, and
+ * all the aborted updates will continue to appear on update.php as updates
+ * that have not yet been run.
+ *
+ * If an update function needs to be re-run as part of a batch process, it
+ * should accept the $sandbox array by reference as its first parameter
+ * and set the #finished property to the percentage completed that it is, as a
+ * fraction of 1.
+ *
+ * @param $module
+ *   The module whose update will be run.
+ * @param $number
+ *   The update number to run.
+ * @param $dependency_map
+ *   An array whose keys are the names of all update functions that will be
+ *   performed during this batch process, and whose values are arrays of other
+ *   update functions that each one depends on.
+ * @param $context
+ *   The batch context array.
+ *
+ * @see update_resolve_dependencies()
+ */
+function update_do_one($module, $number, $dependency_map, &$context) {
+  $function = $module . '_update_' . $number;
+
+  // If this update was aborted in a previous step, or has a dependency that
+  // was aborted in a previous step, go no further.
+  if (!empty($context['results']['#abort']) && array_intersect($context['results']['#abort'], array_merge($dependency_map, array($function)))) {
+    return;
+  }
+
+  $ret = array();
+  if (function_exists($function)) {
+    try {
+      $ret['results']['query'] = $function($context['sandbox']);
+      $ret['results']['success'] = TRUE;
+    }
+    // @TODO We may want to do different error handling for different
+    // exception types, but for now we'll just log the exception and
+    // return the message for printing.
+    catch (Exception $e) {
+      watchdog_exception('update', $e);
+
+      require_once DRUPAL_ROOT . '/includes/errors.inc';
+      $variables = _drupal_decode_exception($e);
+      // The exception message is run through check_plain() by _drupal_decode_exception().
+      $ret['#abort'] = array('success' => FALSE, 'query' => t('%type: !message in %function (line %line of %file).', $variables));
+    }
+  }
+
+  if (isset($context['sandbox']['#finished'])) {
+    $context['finished'] = $context['sandbox']['#finished'];
+    unset($context['sandbox']['#finished']);
+  }
+
+  if (!isset($context['results'][$module])) {
+    $context['results'][$module] = array();
+  }
+  if (!isset($context['results'][$module][$number])) {
+    $context['results'][$module][$number] = array();
+  }
+  $context['results'][$module][$number] = array_merge($context['results'][$module][$number], $ret);
+
+  if (!empty($ret['#abort'])) {
+    // Record this function in the list of updates that were aborted.
+    $context['results']['#abort'][] = $function;
+  }
+
+  // Record the schema update if it was completed successfully.
+  if ($context['finished'] == 1 && empty($ret['#abort'])) {
+    drupal_set_installed_schema_version($module, $number);
+  }
+
+  $context['message'] = 'Updating ' . check_plain($module) . ' module';
+}
+
+/**
+ * @class Exception class used to throw error if a module update fails.
+ */
+class DrupalUpdateException extends Exception { }
+
+/**
+ * Starts the database update batch process.
+ *
+ * @param $start
+ *   An array whose keys contain the names of modules to be updated during the
+ *   current batch process, and whose values contain the number of the first
+ *   requested update for that module. The actual updates that are run (and the
+ *   order they are run in) will depend on the results of passing this data
+ *   through the update dependency system.
+ * @param $redirect
+ *   Path to redirect to when the batch has finished processing.
+ * @param $url
+ *   URL of the batch processing page (should only be used for separate
+ *   scripts like update.php).
+ * @param $batch
+ *   Optional parameters to pass into the batch API.
+ * @param $redirect_callback
+ *   (optional) Specify a function to be called to redirect to the progressive
+ *   processing page.
+ *
+ * @see update_resolve_dependencies()
+ */
+function update_batch($start, $redirect = NULL, $url = NULL, $batch = array(), $redirect_callback = 'drupal_goto') {
+  // During the update, bring the site offline so that schema changes do not
+  // affect visiting users.
+  $_SESSION['maintenance_mode'] = variable_get('maintenance_mode', FALSE);
+  if ($_SESSION['maintenance_mode'] == FALSE) {
+    variable_set('maintenance_mode', TRUE);
+  }
+
+  // Resolve any update dependencies to determine the actual updates that will
+  // be run and the order they will be run in.
+  $updates = update_resolve_dependencies($start);
+
+  // Store the dependencies for each update function in an array which the
+  // batch API can pass in to the batch operation each time it is called. (We
+  // do not store the entire update dependency array here because it is
+  // potentially very large.)
+  $dependency_map = array();
+  foreach ($updates as $function => $update) {
+    $dependency_map[$function] = !empty($update['reverse_paths']) ? array_keys($update['reverse_paths']) : array();
+  }
+
+  $operations = array();
+  foreach ($updates as $update) {
+    if ($update['allowed']) {
+      // Set the installed version of each module so updates will start at the
+      // correct place. (The updates are already sorted, so we can simply base
+      // this on the first one we come across in the above foreach loop.)
+      if (isset($start[$update['module']])) {
+        drupal_set_installed_schema_version($update['module'], $update['number'] - 1);
+        unset($start[$update['module']]);
+      }
+      // Add this update function to the batch.
+      $function = $update['module'] . '_update_' . $update['number'];
+      $operations[] = array('update_do_one', array($update['module'], $update['number'], $dependency_map[$function]));
+    }
+  }
+  $batch['operations'] = $operations;
+  $batch += array(
+    'title' => 'Updating',
+    'init_message' => 'Starting updates',
+    'error_message' => 'An unrecoverable error has occurred. You can find the error message below. It is advised to copy it to the clipboard for reference.',
+    'finished' => 'update_finished',
+    'file' => 'includes/update.inc',
+  );
+  batch_set($batch);
+  batch_process($redirect, $url, $redirect_callback);
+}
+
+/**
+ * Finishes the update process and stores the results for eventual display.
+ *
+ * After the updates run, all caches are flushed. The update results are
+ * stored into the session (for example, to be displayed on the update results
+ * page in update.php). Additionally, if the site was off-line, now that the
+ * update process is completed, the site is set back online.
+ *
+ * @param $success
+ *   Indicate that the batch API tasks were all completed successfully.
+ * @param $results
+ *   An array of all the results that were updated in update_do_one().
+ * @param $operations
+ *   A list of all the operations that had not been completed by the batch API.
+ *
+ * @see update_batch()
+ */
+function update_finished($success, $results, $operations) {
+  // Remove the D6 upgrade flag variable so that subsequent update runs do not
+  // get the wrong context.
+  variable_del('update_d6');
+
+  // Clear the caches in case the data has been updated.
+  drupal_flush_all_caches();
+
+  $_SESSION['update_results'] = $results;
+  $_SESSION['update_success'] = $success;
+  $_SESSION['updates_remaining'] = $operations;
+
+  // Now that the update is done, we can put the site back online if it was
+  // previously in maintenance mode.
+  if (isset($_SESSION['maintenance_mode']) && $_SESSION['maintenance_mode'] == FALSE) {
+    variable_set('maintenance_mode', FALSE);
+    unset($_SESSION['maintenance_mode']);
+  }
+}
+
+/**
+ * Returns a list of all the pending database updates.
+ *
+ * @return
+ *   An associative array keyed by module name which contains all information
+ *   about database updates that need to be run, and any updates that are not
+ *   going to proceed due to missing requirements. The system module will
+ *   always be listed first.
+ *
+ *   The subarray for each module can contain the following keys:
+ *   - start: The starting update that is to be processed. If this does not
+ *       exist then do not process any updates for this module as there are
+ *       other requirements that need to be resolved.
+ *   - warning: Any warnings about why this module can not be updated.
+ *   - pending: An array of all the pending updates for the module including
+ *       the update number and the description from source code comment for
+ *       each update function. This array is keyed by the update number.
+ */
+function update_get_update_list() {
+  // Make sure that the system module is first in the list of updates.
+  $ret = array('system' => array());
+
+  $modules = drupal_get_installed_schema_version(NULL, FALSE, TRUE);
+  foreach ($modules as $module => $schema_version) {
+    // Skip uninstalled and incompatible modules.
+    if ($schema_version == SCHEMA_UNINSTALLED || update_check_incompatibility($module)) {
+      continue;
+    }
+    // Otherwise, get the list of updates defined by this module.
+    $updates = drupal_get_schema_versions($module);
+    if ($updates !== FALSE) {
+      // module_invoke returns NULL for nonexisting hooks, so if no updates
+      // are removed, it will == 0.
+      $last_removed = module_invoke($module, 'update_last_removed');
+      if ($schema_version < $last_removed) {
+        $ret[$module]['warning'] = '<em>' . $module . '</em> module can not be updated. Its schema version is ' . $schema_version . '. Updates up to and including ' . $last_removed . ' have been removed in this release. In order to update <em>' . $module . '</em> module, you will first <a href="http://drupal.org/upgrade">need to upgrade</a> to the last version in which these updates were available.';
+        continue;
+      }
+
+      $updates = drupal_map_assoc($updates);
+      foreach (array_keys($updates) as $update) {
+        if ($update > $schema_version) {
+          // The description for an update comes from its Doxygen.
+          $func = new ReflectionFunction($module . '_update_' . $update);
+          $description = str_replace(array("\n", '*', '/'), '', $func->getDocComment());
+          $ret[$module]['pending'][$update] = "$update - $description";
+          if (!isset($ret[$module]['start'])) {
+            $ret[$module]['start'] = $update;
+          }
+        }
+      }
+      if (!isset($ret[$module]['start']) && isset($ret[$module]['pending'])) {
+        $ret[$module]['start'] = $schema_version;
+      }
+    }
+  }
+
+  if (empty($ret['system'])) {
+    unset($ret['system']);
+  }
+  return $ret;
+}
+
+/**
+ * Resolves dependencies in a set of module updates, and orders them correctly.
+ *
+ * This function receives a list of requested module updates and determines an
+ * appropriate order to run them in such that all update dependencies are met.
+ * Any updates whose dependencies cannot be met are included in the returned
+ * array but have the key 'allowed' set to FALSE; the calling function should
+ * take responsibility for ensuring that these updates are ultimately not
+ * performed.
+ *
+ * In addition, the returned array also includes detailed information about the
+ * dependency chain for each update, as provided by the depth-first search
+ * algorithm in drupal_depth_first_search().
+ *
+ * @param $starting_updates
+ *   An array whose keys contain the names of modules with updates to be run
+ *   and whose values contain the number of the first requested update for that
+ *   module.
+ *
+ * @return
+ *   An array whose keys are the names of all update functions within the
+ *   provided modules that would need to be run in order to fulfill the
+ *   request, arranged in the order in which the update functions should be
+ *   run. (This includes the provided starting update for each module and all
+ *   subsequent updates that are available.) The values are themselves arrays
+ *   containing all the keys provided by the drupal_depth_first_search()
+ *   algorithm, which encode detailed information about the dependency chain
+ *   for this update function (for example: 'paths', 'reverse_paths', 'weight',
+ *   and 'component'), as well as the following additional keys:
+ *   - 'allowed': A boolean which is TRUE when the update function's
+ *     dependencies are met, and FALSE otherwise. Calling functions should
+ *     inspect this value before running the update.
+ *   - 'missing_dependencies': An array containing the names of any other
+ *     update functions that are required by this one but that are unavailable
+ *     to be run. This array will be empty when 'allowed' is TRUE.
+ *   - 'module': The name of the module that this update function belongs to.
+ *   - 'number': The number of this update function within that module.
+ *
+ * @see drupal_depth_first_search()
+ */
+function update_resolve_dependencies($starting_updates) {
+  // Obtain a dependency graph for the requested update functions.
+  $update_functions = update_get_update_function_list($starting_updates);
+  $graph = update_build_dependency_graph($update_functions);
+
+  // Perform the depth-first search and sort the results.
+  require_once DRUPAL_ROOT . '/includes/graph.inc';
+  drupal_depth_first_search($graph);
+  uasort($graph, 'drupal_sort_weight');
+
+  foreach ($graph as $function => &$data) {
+    $module = $data['module'];
+    $number = $data['number'];
+    // If the update function is missing and has not yet been performed, mark
+    // it and everything that ultimately depends on it as disallowed.
+    if (update_is_missing($module, $number, $update_functions) && !update_already_performed($module, $number)) {
+      $data['allowed'] = FALSE;
+      foreach (array_keys($data['paths']) as $dependent) {
+        $graph[$dependent]['allowed'] = FALSE;
+        $graph[$dependent]['missing_dependencies'][] = $function;
+      }
+    }
+    elseif (!isset($data['allowed'])) {
+      $data['allowed'] = TRUE;
+      $data['missing_dependencies'] = array();
+    }
+    // Now that we have finished processing this function, remove it from the
+    // graph if it was not part of the original list. This ensures that we
+    // never try to run any updates that were not specifically requested.
+    if (!isset($update_functions[$module][$number])) {
+      unset($graph[$function]);
+    }
+  }
+
+  return $graph;
+}
+
+/**
+ * Returns an organized list of update functions for a set of modules.
+ *
+ * @param $starting_updates
+ *   An array whose keys contain the names of modules and whose values contain
+ *   the number of the first requested update for that module.
+ *
+ * @return
+ *   An array containing all the update functions that should be run for each
+ *   module, including the provided starting update and all subsequent updates
+ *   that are available. The keys of the array contain the module names, and
+ *   each value is an ordered array of update functions, keyed by the update
+ *   number.
+ *
+ * @see update_resolve_dependencies()
+ */
+function update_get_update_function_list($starting_updates) {
+  // Go through each module and find all updates that we need (including the
+  // first update that was requested and any updates that run after it).
+  $update_functions = array();
+  foreach ($starting_updates as $module => $version) {
+    $update_functions[$module] = array();
+    $updates = drupal_get_schema_versions($module);
+    if ($updates !== FALSE) {
+      $max_version = max($updates);
+      if ($version <= $max_version) {
+        foreach ($updates as $update) {
+          if ($update >= $version) {
+            $update_functions[$module][$update] = $module . '_update_' . $update;
+          }
+        }
+      }
+    }
+  }
+  return $update_functions;
+}
+
+/**
+ * Constructs a graph which encodes the dependencies between module updates.
+ *
+ * This function returns an associative array which contains a "directed graph"
+ * representation of the dependencies between a provided list of update
+ * functions, as well as any outside update functions that they directly depend
+ * on but that were not in the provided list. The vertices of the graph
+ * represent the update functions themselves, and each edge represents a
+ * requirement that the first update function needs to run before the second.
+ * For example, consider this graph:
+ *
+ * system_update_7000 ---> system_update_7001 ---> system_update_7002
+ *
+ * Visually, this indicates that system_update_7000() must run before
+ * system_update_7001(), which in turn must run before system_update_7002().
+ *
+ * The function takes into account standard dependencies within each module, as
+ * shown above (i.e., the fact that each module's updates must run in numerical
+ * order), but also finds any cross-module dependencies that are defined by
+ * modules which implement hook_update_dependencies(), and builds them into the
+ * graph as well.
+ *
+ * @param $update_functions
+ *   An organized array of update functions, in the format returned by
+ *   update_get_update_function_list().
+ *
+ * @return
+ *   A multidimensional array representing the dependency graph, suitable for
+ *   passing in to drupal_depth_first_search(), but with extra information
+ *   about each update function also included. Each array key contains the name
+ *   of an update function, including all update functions from the provided
+ *   list as well as any outside update functions which they directly depend
+ *   on. Each value is an associative array containing the following keys:
+ *   - 'edges': A representation of any other update functions that immediately
+ *     depend on this one. See drupal_depth_first_search() for more details on
+ *     the format.
+ *   - 'module': The name of the module that this update function belongs to.
+ *   - 'number': The number of this update function within that module.
+ *
+ * @see drupal_depth_first_search()
+ * @see update_resolve_dependencies()
+ */
+function update_build_dependency_graph($update_functions) {
+  // Initialize an array that will define a directed graph representing the
+  // dependencies between update functions.
+  $graph = array();
+
+  // Go through each update function and build an initial list of dependencies.
+  foreach ($update_functions as $module => $functions) {
+    $previous_function = NULL;
+    foreach ($functions as $number => $function) {
+      // Add an edge to the directed graph representing the fact that each
+      // update function in a given module must run after the update that
+      // numerically precedes it.
+      if ($previous_function) {
+        $graph[$previous_function]['edges'][$function] = TRUE;
+      }
+      $previous_function = $function;
+
+      // Define the module and update number associated with this function.
+      $graph[$function]['module'] = $module;
+      $graph[$function]['number'] = $number;
+    }
+  }
+
+  // Now add any explicit update dependencies declared by modules.
+  $update_dependencies = update_retrieve_dependencies();
+  foreach ($graph as $function => $data) {
+    if (!empty($update_dependencies[$data['module']][$data['number']])) {
+      foreach ($update_dependencies[$data['module']][$data['number']] as $module => $number) {
+        $dependency = $module . '_update_' . $number;
+        $graph[$dependency]['edges'][$function] = TRUE;
+        $graph[$dependency]['module'] = $module;
+        $graph[$dependency]['number'] = $number;
+      }
+    }
+  }
+
+  return $graph;
+}
+
+/**
+ * Determines if a module update is missing or unavailable.
+ *
+ * @param $module
+ *   The name of the module.
+ * @param $number
+ *   The number of the update within that module.
+ * @param $update_functions
+ *   An organized array of update functions, in the format returned by
+ *   update_get_update_function_list(). This should represent all module
+ *   updates that are requested to run at the time this function is called.
+ *
+ * @return
+ *   TRUE if the provided module update is not installed or is not in the
+ *   provided list of updates to run; FALSE otherwise.
+ */
+function update_is_missing($module, $number, $update_functions) {
+  return !isset($update_functions[$module][$number]) || !function_exists($update_functions[$module][$number]);
+}
+
+/**
+ * Determines if a module update has already been performed.
+ *
+ * @param $module
+ *   The name of the module.
+ * @param $number
+ *   The number of the update within that module.
+ *
+ * @return
+ *   TRUE if the database schema indicates that the update has already been
+ *   performed; FALSE otherwise.
+ */
+function update_already_performed($module, $number) {
+  return $number <= drupal_get_installed_schema_version($module);
+}
+
+/**
+ * Invokes hook_update_dependencies() in all installed modules.
+ *
+ * This function is similar to module_invoke_all(), with the main difference
+ * that it does not require that a module be enabled to invoke its hook, only
+ * that it be installed. This allows the update system to properly perform
+ * updates even on modules that are currently disabled.
+ *
+ * @return
+ *   An array of return values obtained by merging the results of the
+ *   hook_update_dependencies() implementations in all installed modules.
+ *
+ * @see module_invoke_all()
+ * @see hook_update_dependencies()
+ */
+function update_retrieve_dependencies() {
+  $return = array();
+  // Get a list of installed modules, arranged so that we invoke their hooks in
+  // the same order that module_invoke_all() does.
+  $modules = db_query("SELECT name FROM {system} WHERE type = 'module' AND schema_version <> :schema ORDER BY weight ASC, name ASC", array(':schema' => SCHEMA_UNINSTALLED))->fetchCol();
+  foreach ($modules as $module) {
+    $function = $module . '_update_dependencies';
+    if (function_exists($function)) {
+      $result = $function();
+      // Each implementation of hook_update_dependencies() returns a
+      // multidimensional, associative array containing some keys that
+      // represent module names (which are strings) and other keys that
+      // represent update function numbers (which are integers). We cannot use
+      // array_merge_recursive() to properly merge these results, since it
+      // treats strings and integers differently. Therefore, we have to
+      // explicitly loop through the expected array structure here and perform
+      // the merge manually.
+      if (isset($result) && is_array($result)) {
+        foreach ($result as $module => $module_data) {
+          foreach ($module_data as $update => $update_data) {
+            foreach ($update_data as $module_dependency => $update_dependency) {
+              // If there are redundant dependencies declared for the same
+              // update function (so that it is declared to depend on more than
+              // one update from a particular module), record the dependency on
+              // the highest numbered update here, since that automatically
+              // implies the previous ones. For example, if one module's
+              // implementation of hook_update_dependencies() required this
+              // ordering:
+              //
+              // system_update_7001 ---> user_update_7000
+              //
+              // but another module's implementation of the hook required this
+              // one:
+              //
+              // system_update_7002 ---> user_update_7000
+              //
+              // we record the second one, since system_update_7001() is always
+              // guaranteed to run before system_update_7002() anyway (within
+              // an individual module, updates are always run in numerical
+              // order).
+              if (!isset($return[$module][$update][$module_dependency]) || $update_dependency > $return[$module][$update][$module_dependency]) {
+                $return[$module][$update][$module_dependency] = $update_dependency;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  return $return;
+}
diff --git a/htmltest/includes/updater.inc b/htmltest/includes/updater.inc
new file mode 100644
index 00000000..d4f99e97
--- /dev/null
+++ b/htmltest/includes/updater.inc
@@ -0,0 +1,427 @@
+<?php
+
+/**
+ * @file
+ * Classes used for updating various files in the Drupal webroot. These
+ * classes use a FileTransfer object to actually perform the operations.
+ * Normally, the FileTransfer is provided when the site owner is redirected to
+ * authorize.php as part of a multistep process.
+ */
+
+/**
+ * Interface for a class which can update a Drupal project.
+ *
+ * An Updater currently serves the following purposes:
+ *   - It can take a given directory, and determine if it can operate on it.
+ *   - It can move the contents of that directory into the appropriate place
+ *     on the system using FileTransfer classes.
+ *   - It can return a list of "next steps" after an update or install.
+ *   - In the future, it will most likely perform some of those steps as well.
+ */
+interface DrupalUpdaterInterface {
+
+  /**
+   * Checks if the project is installed.
+   *
+   * @return bool
+   */
+  public function isInstalled();
+
+  /**
+   * Returns the system name of the project.
+   *
+   * @param string $directory
+   *  A directory containing a project.
+   */
+  public static function getProjectName($directory);
+
+  /**
+   * @return string
+   *   An absolute path to the default install location.
+   */
+  public function getInstallDirectory();
+
+  /**
+   * Determine if the Updater can handle the project provided in $directory.
+   *
+   * @todo: Provide something more rational here, like a project spec file.
+   *
+   * @param string $directory
+   *
+   * @return bool
+   *   TRUE if the project is installed, FALSE if not.
+   */
+  public static function canUpdateDirectory($directory);
+
+  /**
+   * Actions to run after an install has occurred.
+   */
+  public function postInstall();
+
+  /**
+   * Actions to run after an update has occurred.
+   */
+  public function postUpdate();
+}
+
+/**
+ * Base class for Updaters used in Drupal.
+ */
+class Updater {
+
+  /**
+   * @var string $source Directory to install from.
+   */
+  public $source;
+
+  public function __construct($source) {
+    $this->source = $source;
+    $this->name = self::getProjectName($source);
+    $this->title = self::getProjectTitle($source);
+  }
+
+  /**
+   * Return an Updater of the appropriate type depending on the source.
+   *
+   * If a directory is provided which contains a module, will return a
+   * ModuleUpdater.
+   *
+   * @param string $source
+   *   Directory of a Drupal project.
+   *
+   * @return Updater
+   */
+  public static function factory($source) {
+    if (is_dir($source)) {
+      $updater = self::getUpdaterFromDirectory($source);
+    }
+    else {
+      throw new UpdaterException(t('Unable to determine the type of the source directory.'));
+    }
+    return new $updater($source);
+  }
+
+  /**
+   * Determine which Updater class can operate on the given directory.
+   *
+   * @param string $directory
+   *   Extracted Drupal project.
+   *
+   * @return string
+   *   The class name which can work with this project type.
+   */
+  public static function getUpdaterFromDirectory($directory) {
+    // Gets a list of possible implementing classes.
+    $updaters = drupal_get_updaters();
+    foreach ($updaters as $updater) {
+      $class = $updater['class'];
+      if (call_user_func(array($class, 'canUpdateDirectory'), $directory)) {
+        return $class;
+      }
+    }
+    throw new UpdaterException(t('Cannot determine the type of project.'));
+  }
+
+  /**
+   * Figure out what the most important (or only) info file is in a directory.
+   *
+   * Since there is no enforcement of which info file is the project's "main"
+   * info file, this will get one with the same name as the directory, or the
+   * first one it finds.  Not ideal, but needs a larger solution.
+   *
+   * @param string $directory
+   *   Directory to search in.
+   *
+   * @return string
+   *   Path to the info file.
+   */
+  public static function findInfoFile($directory) {
+    $info_files = file_scan_directory($directory, '/.*\.info$/');
+    if (!$info_files) {
+      return FALSE;
+    }
+    foreach ($info_files as $info_file) {
+      if (drupal_substr($info_file->filename, 0, -5) == drupal_basename($directory)) {
+        // Info file Has the same name as the directory, return it.
+        return $info_file->uri;
+      }
+    }
+    // Otherwise, return the first one.
+    $info_file = array_shift($info_files);
+    return $info_file->uri;
+  }
+
+  /**
+   * Get the name of the project directory (basename).
+   *
+   * @todo: It would be nice, if projects contained an info file which could
+   *        provide their canonical name.
+   *
+   * @param string $directory
+   *
+   * @return string
+   *   The name of the project.
+   */
+  public static function getProjectName($directory) {
+    return drupal_basename($directory);
+  }
+
+  /**
+   * Return the project name from a Drupal info file.
+   *
+   * @param string $directory
+   *   Directory to search for the info file.
+   *
+   * @return string
+   *   The title of the project.
+   */
+  public static function getProjectTitle($directory) {
+    $info_file = self::findInfoFile($directory);
+    $info = drupal_parse_info_file($info_file);
+    if (empty($info)) {
+      throw new UpdaterException(t('Unable to parse info file: %info_file.', array('%info_file' => $info_file)));
+    }
+    if (empty($info['name'])) {
+      throw new UpdaterException(t("The info file (%info_file) does not define a 'name' attribute.", array('%info_file' => $info_file)));
+    }
+    return $info['name'];
+  }
+
+  /**
+   * Store the default parameters for the Updater.
+   *
+   * @param array $overrides
+   *   An array of overrides for the default parameters.
+   *
+   * @return array
+   *   An array of configuration parameters for an update or install operation.
+   */
+  protected function getInstallArgs($overrides = array()) {
+    $args = array(
+      'make_backup' => FALSE,
+      'install_dir' => $this->getInstallDirectory(),
+      'backup_dir'  => $this->getBackupDir(),
+    );
+    return array_merge($args, $overrides);
+  }
+
+  /**
+   * Updates a Drupal project, returns a list of next actions.
+   *
+   * @param FileTransfer $filetransfer
+   *   Object that is a child of FileTransfer. Used for moving files
+   *   to the server.
+   * @param array $overrides
+   *   An array of settings to override defaults; see self::getInstallArgs().
+   *
+   * @return array
+   *   An array of links which the user may need to complete the update
+   */
+  public function update(&$filetransfer, $overrides = array()) {
+    try {
+      // Establish arguments with possible overrides.
+      $args = $this->getInstallArgs($overrides);
+
+      // Take a Backup.
+      if ($args['make_backup']) {
+        $this->makeBackup($args['install_dir'], $args['backup_dir']);
+      }
+
+      if (!$this->name) {
+        // This is bad, don't want to delete the install directory.
+        throw new UpdaterException(t('Fatal error in update, cowardly refusing to wipe out the install directory.'));
+      }
+
+      // Make sure the installation parent directory exists and is writable.
+      $this->prepareInstallDirectory($filetransfer, $args['install_dir']);
+
+      // Note: If the project is installed in sites/all, it will not be
+      // deleted. It will be installed in sites/default as that will override
+      // the sites/all reference and not break other sites which are using it.
+      if (is_dir($args['install_dir'] . '/' . $this->name)) {
+        // Remove the existing installed file.
+        $filetransfer->removeDirectory($args['install_dir'] . '/' . $this->name);
+      }
+
+      // Copy the directory in place.
+      $filetransfer->copyDirectory($this->source, $args['install_dir']);
+
+      // Make sure what we just installed is readable by the web server.
+      $this->makeWorldReadable($filetransfer, $args['install_dir'] . '/' . $this->name);
+
+      // Run the updates.
+      // @TODO: decide if we want to implement this.
+      $this->postUpdate();
+
+      // For now, just return a list of links of things to do.
+      return $this->postUpdateTasks();
+    }
+    catch (FileTransferException $e) {
+      throw new UpdaterFileTransferException(t('File Transfer failed, reason: !reason', array('!reason' => strtr($e->getMessage(), $e->arguments))));
+    }
+  }
+
+  /**
+   * Installs a Drupal project, returns a list of next actions.
+   *
+   * @param FileTransfer $filetransfer
+   *   Object that is a child of FileTransfer.
+   * @param array $overrides
+   *   An array of settings to override defaults; see self::getInstallArgs().
+   *
+   * @return array
+   *   An array of links which the user may need to complete the install.
+   */
+  public function install(&$filetransfer, $overrides = array()) {
+    try {
+      // Establish arguments with possible overrides.
+      $args = $this->getInstallArgs($overrides);
+
+      // Make sure the installation parent directory exists and is writable.
+      $this->prepareInstallDirectory($filetransfer, $args['install_dir']);
+
+      // Copy the directory in place.
+      $filetransfer->copyDirectory($this->source, $args['install_dir']);
+
+      // Make sure what we just installed is readable by the web server.
+      $this->makeWorldReadable($filetransfer, $args['install_dir'] . '/' . $this->name);
+
+      // Potentially enable something?
+      // @TODO: decide if we want to implement this.
+      $this->postInstall();
+      // For now, just return a list of links of things to do.
+      return $this->postInstallTasks();
+    }
+    catch (FileTransferException $e) {
+      throw new UpdaterFileTransferException(t('File Transfer failed, reason: !reason', array('!reason' => strtr($e->getMessage(), $e->arguments))));
+    }
+  }
+
+  /**
+   * Make sure the installation parent directory exists and is writable.
+   *
+   * @param FileTransfer $filetransfer
+   *   Object which is a child of FileTransfer.
+   * @param string $directory
+   *   The installation directory to prepare.
+   */
+  public function prepareInstallDirectory(&$filetransfer, $directory) {
+    // Make the parent dir writable if need be and create the dir.
+    if (!is_dir($directory)) {
+      $parent_dir = dirname($directory);
+      if (!is_writable($parent_dir)) {
+        @chmod($parent_dir, 0755);
+        // It is expected that this will fail if the directory is owned by the
+        // FTP user. If the FTP user == web server, it will succeed.
+        try {
+          $filetransfer->createDirectory($directory);
+          $this->makeWorldReadable($filetransfer, $directory);
+        }
+        catch (FileTransferException $e) {
+          // Probably still not writable. Try to chmod and do it again.
+          // @todo: Make a new exception class so we can catch it differently.
+          try {
+            $old_perms = substr(sprintf('%o', fileperms($parent_dir)), -4);
+            $filetransfer->chmod($parent_dir, 0755);
+            $filetransfer->createDirectory($directory);
+            $this->makeWorldReadable($filetransfer, $directory);
+            // Put the permissions back.
+            $filetransfer->chmod($parent_dir, intval($old_perms, 8));
+          }
+          catch (FileTransferException $e) {
+            $message = t($e->getMessage(), $e->arguments);
+            $throw_message = t('Unable to create %directory due to the following: %reason', array('%directory' => $directory, '%reason' => $message));
+            throw new UpdaterException($throw_message);
+          }
+        }
+        // Put the parent directory back.
+        @chmod($parent_dir, 0555);
+      }
+    }
+  }
+
+  /**
+   * Ensure that a given directory is world readable.
+   *
+   * @param FileTransfer $filetransfer
+   *   Object which is a child of FileTransfer.
+   * @param string $path
+   *   The file path to make world readable.
+   * @param bool $recursive
+   *   If the chmod should be applied recursively.
+   */
+  public function makeWorldReadable(&$filetransfer, $path, $recursive = TRUE) {
+    if (!is_executable($path)) {
+      // Set it to read + execute.
+      $new_perms = substr(sprintf('%o', fileperms($path)), -4, -1) . "5";
+      $filetransfer->chmod($path, intval($new_perms, 8), $recursive);
+    }
+  }
+
+  /**
+   * Perform a backup.
+   *
+   * @todo Not implemented.
+   */
+  public function makeBackup(&$filetransfer, $from, $to) {
+  }
+
+  /**
+   * Return the full path to a directory where backups should be written.
+   */
+  public function getBackupDir() {
+    return file_stream_wrapper_get_instance_by_scheme('temporary')->getDirectoryPath();
+  }
+
+  /**
+   * Perform actions after new code is updated.
+   */
+  public function postUpdate() {
+  }
+
+  /**
+   * Perform actions after installation.
+   */
+  public function postInstall() {
+  }
+
+  /**
+   * Return an array of links to pages that should be visited post operation.
+   *
+   * @return array
+   *   Links which provide actions to take after the install is finished.
+   */
+  public function postInstallTasks() {
+    return array();
+  }
+
+  /**
+   * Return an array of links to pages that should be visited post operation.
+   *
+   * @return array
+   *   Links which provide actions to take after the update is finished.
+   */
+  public function postUpdateTasks() {
+    return array();
+  }
+}
+
+/**
+ * Exception class for the Updater class hierarchy.
+ *
+ * This is identical to the base Exception class, we just give it a more
+ * specific name so that call sites that want to tell the difference can
+ * specifically catch these exceptions and treat them differently.
+ */
+class UpdaterException extends Exception {
+}
+
+/**
+ * Child class of UpdaterException that indicates a FileTransfer exception.
+ *
+ * We have to catch FileTransfer exceptions and wrap those in t(), since
+ * FileTransfer is so low-level that it doesn't use any Drupal APIs and none
+ * of the strings are translated.
+ */
+class UpdaterFileTransferException extends UpdaterException {
+}
diff --git a/htmltest/includes/utility.inc b/htmltest/includes/utility.inc
new file mode 100644
index 00000000..f651fd63
--- /dev/null
+++ b/htmltest/includes/utility.inc
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * @file
+ * Miscellaneous functions.
+ */
+
+/**
+ * Drupal-friendly var_export().
+ *
+ * @param $var
+ *   The variable to export.
+ * @param $prefix
+ *   A prefix that will be added at the beginning of every lines of the output.
+ *
+ * @return
+ *   The variable exported in a way compatible to Drupal's coding standards.
+ */
+function drupal_var_export($var, $prefix = '') {
+  if (is_array($var)) {
+    if (empty($var)) {
+      $output = 'array()';
+    }
+    else {
+      $output = "array(\n";
+      // Don't export keys if the array is non associative.
+      $export_keys = array_values($var) != $var;
+      foreach ($var as $key => $value) {
+        $output .= '  ' . ($export_keys ? drupal_var_export($key) . ' => ' : '') . drupal_var_export($value, '  ', FALSE) . ",\n";
+      }
+      $output .= ')';
+    }
+  }
+  elseif (is_bool($var)) {
+    $output = $var ? 'TRUE' : 'FALSE';
+  }
+  elseif (is_string($var)) {
+    $line_safe_var = str_replace("\n", '\n', $var);
+    if (strpos($var, "\n") !== FALSE || strpos($var, "'") !== FALSE) {
+      // If the string contains a line break or a single quote, use the
+      // double quote export mode. Encode backslash and double quotes and
+      // transform some common control characters.
+      $var = str_replace(array('\\', '"', "\n", "\r", "\t"), array('\\\\', '\"', '\n', '\r', '\t'), $var);
+      $output = '"' . $var . '"';
+    }
+    else {
+      $output = "'" . $var . "'";
+    }
+  }
+  elseif (is_object($var) && get_class($var) === 'stdClass') {
+    // var_export() will export stdClass objects using an undefined
+    // magic method __set_state() leaving the export broken. This
+    // workaround avoids this by casting the object as an array for
+    // export and casting it back to an object when evaluated.
+    $output = '(object) ' . drupal_var_export((array) $var, $prefix);
+  }
+  else {
+    $output = var_export($var, TRUE);
+  }
+
+  if ($prefix) {
+    $output = str_replace("\n", "\n$prefix", $output);
+  }
+
+  return $output;
+}
diff --git a/htmltest/includes/xmlrpc.inc b/htmltest/includes/xmlrpc.inc
new file mode 100644
index 00000000..b1c6f39c
--- /dev/null
+++ b/htmltest/includes/xmlrpc.inc
@@ -0,0 +1,624 @@
+<?php
+
+/**
+ * @file
+ * Drupal XML-RPC library.
+ *
+ * Based on the IXR - The Incutio XML-RPC Library - (c) Incutio Ltd 2002-2005
+ * Version 1.7 (beta) - Simon Willison, 23rd May 2005
+ * Site:   http://scripts.incutio.com/xmlrpc/
+ * Manual: http://scripts.incutio.com/xmlrpc/manual.php
+ * This version is made available under the GNU GPL License
+ */
+
+/**
+ * Turns a data structure into objects with 'data' and 'type' attributes.
+ *
+ * @param $data
+ *   The data structure.
+ * @param $type
+ *   Optional type to assign to $data.
+ *
+ * @return object
+ *   An XML-RPC data object containing the input $data.
+ */
+function xmlrpc_value($data, $type = FALSE) {
+  $xmlrpc_value = new stdClass();
+  $xmlrpc_value->data = $data;
+  if (!$type) {
+    $type = xmlrpc_value_calculate_type($xmlrpc_value);
+  }
+  $xmlrpc_value->type = $type;
+  if ($type == 'struct') {
+    // Turn all the values in the array into new xmlrpc_values
+    foreach ($xmlrpc_value->data as $key => $value) {
+      $xmlrpc_value->data[$key] = xmlrpc_value($value);
+    }
+  }
+  if ($type == 'array') {
+    for ($i = 0, $j = count($xmlrpc_value->data); $i < $j; $i++) {
+      $xmlrpc_value->data[$i] = xmlrpc_value($xmlrpc_value->data[$i]);
+    }
+  }
+  return $xmlrpc_value;
+}
+
+/**
+ * Maps a PHP type to an XML-RPC type.
+ *
+ * @param $xmlrpc_value
+ *   Variable whose type should be mapped.
+ *
+ * @return string
+ *   The corresponding XML-RPC type.
+ *
+ * @see http://www.xmlrpc.com/spec#scalars
+ */
+function xmlrpc_value_calculate_type($xmlrpc_value) {
+  // http://www.php.net/gettype: Never use gettype() to test for a certain type
+  // [...] Instead, use the is_* functions.
+  if (is_bool($xmlrpc_value->data)) {
+    return 'boolean';
+  }
+  if (is_double($xmlrpc_value->data)) {
+    return 'double';
+  }
+  if (is_int($xmlrpc_value->data)) {
+    return 'int';
+  }
+  if (is_array($xmlrpc_value->data)) {
+    // empty or integer-indexed arrays are 'array', string-indexed arrays 'struct'
+    return empty($xmlrpc_value->data) || range(0, count($xmlrpc_value->data) - 1) === array_keys($xmlrpc_value->data) ? 'array' : 'struct';
+  }
+  if (is_object($xmlrpc_value->data)) {
+    if (isset($xmlrpc_value->data->is_date)) {
+      return 'date';
+    }
+    if (isset($xmlrpc_value->data->is_base64)) {
+      return 'base64';
+    }
+    $xmlrpc_value->data = get_object_vars($xmlrpc_value->data);
+    return 'struct';
+  }
+  // default
+  return 'string';
+}
+
+/**
+ * Generates XML representing the given value.
+ *
+ * @param $xmlrpc_value
+ *   A value to be represented in XML.
+ *
+ * @return
+ *   XML representation of $xmlrpc_value.
+ */
+function xmlrpc_value_get_xml($xmlrpc_value) {
+  switch ($xmlrpc_value->type) {
+    case 'boolean':
+      return '<boolean>' . (($xmlrpc_value->data) ? '1' : '0') . '</boolean>';
+
+    case 'int':
+      return '<int>' . $xmlrpc_value->data . '</int>';
+
+    case 'double':
+      return '<double>' . $xmlrpc_value->data . '</double>';
+
+    case 'string':
+      // Note: we don't escape apostrophes because of the many blogging clients
+      // that don't support numerical entities (and XML in general) properly.
+      return '<string>' . htmlspecialchars($xmlrpc_value->data) . '</string>';
+
+    case 'array':
+      $return = '<array><data>' . "\n";
+      foreach ($xmlrpc_value->data as $item) {
+        $return .= '  <value>' . xmlrpc_value_get_xml($item) . "</value>\n";
+      }
+      $return .= '</data></array>';
+      return $return;
+
+    case 'struct':
+      $return = '<struct>' . "\n";
+      foreach ($xmlrpc_value->data as $name => $value) {
+        $return .= "  <member><name>" . check_plain($name) . "</name><value>";
+        $return .= xmlrpc_value_get_xml($value) . "</value></member>\n";
+      }
+      $return .= '</struct>';
+      return $return;
+
+    case 'date':
+      return xmlrpc_date_get_xml($xmlrpc_value->data);
+
+    case 'base64':
+      return xmlrpc_base64_get_xml($xmlrpc_value->data);
+  }
+  return FALSE;
+}
+
+/**
+ * Constructs an object representing an XML-RPC message.
+ *
+ * @param $message
+ *   A string containing an XML message.
+ *
+ * @return object
+ *   An XML-RPC object containing the message.
+ *
+ * @see http://www.xmlrpc.com/spec
+ */
+function xmlrpc_message($message) {
+  $xmlrpc_message = new stdClass();
+  // The stack used to keep track of the current array/struct
+  $xmlrpc_message->array_structs = array();
+  // The stack used to keep track of if things are structs or array
+  $xmlrpc_message->array_structs_types = array();
+  // A stack as well
+  $xmlrpc_message->current_struct_name = array();
+  $xmlrpc_message->message = $message;
+  return $xmlrpc_message;
+}
+
+/**
+ * Parses an XML-RPC message.
+ *
+ * If parsing fails, the faultCode and faultString will be added to the message
+ * object.
+ *
+ * @param $xmlrpc_message
+ *   An object generated by xmlrpc_message().
+ *
+ * @return
+ *   TRUE if parsing succeeded; FALSE otherwise.
+ */
+function xmlrpc_message_parse($xmlrpc_message) {
+  $xmlrpc_message->_parser = xml_parser_create();
+  // Set XML parser to take the case of tags into account.
+  xml_parser_set_option($xmlrpc_message->_parser, XML_OPTION_CASE_FOLDING, FALSE);
+  // Set XML parser callback functions
+  xml_set_element_handler($xmlrpc_message->_parser, 'xmlrpc_message_tag_open', 'xmlrpc_message_tag_close');
+  xml_set_character_data_handler($xmlrpc_message->_parser, 'xmlrpc_message_cdata');
+  xmlrpc_message_set($xmlrpc_message);
+  if (!xml_parse($xmlrpc_message->_parser, $xmlrpc_message->message)) {
+    return FALSE;
+  }
+  xml_parser_free($xmlrpc_message->_parser);
+
+  // Grab the error messages, if any.
+  $xmlrpc_message = xmlrpc_message_get();
+  if (!isset($xmlrpc_message->messagetype)) {
+    return FALSE;
+  }
+  elseif ($xmlrpc_message->messagetype == 'fault') {
+    $xmlrpc_message->fault_code = $xmlrpc_message->params[0]['faultCode'];
+    $xmlrpc_message->fault_string = $xmlrpc_message->params[0]['faultString'];
+  }
+  return TRUE;
+}
+
+/**
+ * Stores a copy of the most recent XML-RPC message object temporarily.
+ *
+ * @param $value
+ *   An XML-RPC message to store, or NULL to keep the last message.
+ *
+ * @return object
+ *   The most recently stored message.
+ *
+ * @see xmlrpc_message_get()
+ */
+function xmlrpc_message_set($value = NULL) {
+  static $xmlrpc_message;
+  if ($value) {
+    $xmlrpc_message = $value;
+  }
+  return $xmlrpc_message;
+}
+
+/**
+ * Returns the most recently stored XML-RPC message object.
+ *
+ * @return object
+ *   The most recently stored message.
+ *
+ * @see xmlrpc_message_set()
+ */
+function xmlrpc_message_get() {
+  return xmlrpc_message_set();
+}
+
+/**
+ * Handles opening tags for XML parsing in xmlrpc_message_parse().
+ */
+function xmlrpc_message_tag_open($parser, $tag, $attr) {
+  $xmlrpc_message = xmlrpc_message_get();
+  $xmlrpc_message->current_tag_contents = '';
+  $xmlrpc_message->last_open = $tag;
+  switch ($tag) {
+    case 'methodCall':
+    case 'methodResponse':
+    case 'fault':
+      $xmlrpc_message->messagetype = $tag;
+      break;
+
+    // Deal with stacks of arrays and structs
+    case 'data':
+      $xmlrpc_message->array_structs_types[] = 'array';
+      $xmlrpc_message->array_structs[] = array();
+      break;
+
+    case 'struct':
+      $xmlrpc_message->array_structs_types[] = 'struct';
+      $xmlrpc_message->array_structs[] = array();
+      break;
+  }
+  xmlrpc_message_set($xmlrpc_message);
+}
+
+/**
+ * Handles character data for XML parsing in xmlrpc_message_parse().
+ */
+function xmlrpc_message_cdata($parser, $cdata) {
+  $xmlrpc_message = xmlrpc_message_get();
+  $xmlrpc_message->current_tag_contents .= $cdata;
+  xmlrpc_message_set($xmlrpc_message);
+}
+
+/**
+ * Handles closing tags for XML parsing in xmlrpc_message_parse().
+ */
+function xmlrpc_message_tag_close($parser, $tag) {
+  $xmlrpc_message = xmlrpc_message_get();
+  $value_flag = FALSE;
+  switch ($tag) {
+    case 'int':
+    case 'i4':
+      $value = (int)trim($xmlrpc_message->current_tag_contents);
+      $value_flag = TRUE;
+      break;
+
+    case 'double':
+      $value = (double)trim($xmlrpc_message->current_tag_contents);
+      $value_flag = TRUE;
+      break;
+
+    case 'string':
+      $value = $xmlrpc_message->current_tag_contents;
+      $value_flag = TRUE;
+      break;
+
+    case 'dateTime.iso8601':
+      $value = xmlrpc_date(trim($xmlrpc_message->current_tag_contents));
+      // $value = $iso->getTimestamp();
+      $value_flag = TRUE;
+      break;
+
+    case 'value':
+      // If no type is indicated, the type is string
+      // We take special care for empty values
+      if (trim($xmlrpc_message->current_tag_contents) != '' || (isset($xmlrpc_message->last_open) && ($xmlrpc_message->last_open == 'value'))) {
+        $value = (string) $xmlrpc_message->current_tag_contents;
+        $value_flag = TRUE;
+      }
+      unset($xmlrpc_message->last_open);
+      break;
+
+    case 'boolean':
+      $value = (boolean)trim($xmlrpc_message->current_tag_contents);
+      $value_flag = TRUE;
+      break;
+
+    case 'base64':
+      $value = base64_decode(trim($xmlrpc_message->current_tag_contents));
+      $value_flag = TRUE;
+      break;
+
+    // Deal with stacks of arrays and structs
+    case 'data':
+    case 'struct':
+      $value = array_pop($xmlrpc_message->array_structs);
+      array_pop($xmlrpc_message->array_structs_types);
+      $value_flag = TRUE;
+      break;
+
+    case 'member':
+      array_pop($xmlrpc_message->current_struct_name);
+      break;
+
+    case 'name':
+      $xmlrpc_message->current_struct_name[] = trim($xmlrpc_message->current_tag_contents);
+      break;
+
+    case 'methodName':
+      $xmlrpc_message->methodname = trim($xmlrpc_message->current_tag_contents);
+      break;
+  }
+  if ($value_flag) {
+    if (count($xmlrpc_message->array_structs) > 0) {
+      // Add value to struct or array
+      if ($xmlrpc_message->array_structs_types[count($xmlrpc_message->array_structs_types) - 1] == 'struct') {
+        // Add to struct
+        $xmlrpc_message->array_structs[count($xmlrpc_message->array_structs) - 1][$xmlrpc_message->current_struct_name[count($xmlrpc_message->current_struct_name) - 1]] = $value;
+      }
+      else {
+        // Add to array
+        $xmlrpc_message->array_structs[count($xmlrpc_message->array_structs) - 1][] = $value;
+      }
+    }
+    else {
+      // Just add as a parameter
+      $xmlrpc_message->params[] = $value;
+    }
+  }
+  if (!in_array($tag, array("data", "struct", "member"))) {
+    $xmlrpc_message->current_tag_contents = '';
+  }
+  xmlrpc_message_set($xmlrpc_message);
+}
+
+/**
+ * Constructs an object representing an XML-RPC request.
+ *
+ * @param $method
+ *   The name of the method to be called.
+ * @param $args
+ *   An array of parameters to send with the method.
+ *
+ * @return object
+ *   An XML-RPC object representing the request.
+ */
+function xmlrpc_request($method, $args) {
+  $xmlrpc_request = new stdClass();
+  $xmlrpc_request->method = $method;
+  $xmlrpc_request->args = $args;
+  $xmlrpc_request->xml = <<<EOD
+<?xml version="1.0"?>
+<methodCall>
+<methodName>{$xmlrpc_request->method}</methodName>
+<params>
+
+EOD;
+  foreach ($xmlrpc_request->args as $arg) {
+    $xmlrpc_request->xml .= '<param><value>';
+    $v = xmlrpc_value($arg);
+    $xmlrpc_request->xml .= xmlrpc_value_get_xml($v);
+    $xmlrpc_request->xml .= "</value></param>\n";
+  }
+  $xmlrpc_request->xml .= '</params></methodCall>';
+  return $xmlrpc_request;
+}
+
+/**
+ * Generates, temporarily saves, and returns an XML-RPC error object.
+ *
+ * @param $code
+ *   The error code.
+ * @param $message
+ *   The error message.
+ * @param $reset
+ *   TRUE to empty the temporary error storage. Ignored if $code is supplied.
+ *
+ * @return object
+ *   An XML-RPC error object representing $code and $message, or the most
+ *   recently stored error object if omitted.
+ */
+function xmlrpc_error($code = NULL, $message = NULL, $reset = FALSE) {
+  static $xmlrpc_error;
+  if (isset($code)) {
+    $xmlrpc_error = new stdClass();
+    $xmlrpc_error->is_error = TRUE;
+    $xmlrpc_error->code = $code;
+    $xmlrpc_error->message = $message;
+  }
+  elseif ($reset) {
+    $xmlrpc_error = NULL;
+  }
+  return $xmlrpc_error;
+}
+
+/**
+ * Converts an XML-RPC error object into XML.
+ *
+ * @param $xmlrpc_error
+ *   The XML-RPC error object.
+ *
+ * @return string
+ *   An XML representation of the error as an XML methodResponse.
+ */
+function xmlrpc_error_get_xml($xmlrpc_error) {
+  return <<<EOD
+<methodResponse>
+  <fault>
+  <value>
+    <struct>
+    <member>
+      <name>faultCode</name>
+      <value><int>{$xmlrpc_error->code}</int></value>
+    </member>
+    <member>
+      <name>faultString</name>
+      <value><string>{$xmlrpc_error->message}</string></value>
+    </member>
+    </struct>
+  </value>
+  </fault>
+</methodResponse>
+
+EOD;
+}
+
+/**
+ * Converts a PHP or ISO date/time to an XML-RPC object.
+ *
+ * @param $time
+ *   A PHP timestamp or an ISO date-time string.
+ *
+ * @return object
+ *   An XML-RPC time/date object.
+ */
+function xmlrpc_date($time) {
+  $xmlrpc_date = new stdClass();
+  $xmlrpc_date->is_date = TRUE;
+  // $time can be a PHP timestamp or an ISO one
+  if (is_numeric($time)) {
+    $xmlrpc_date->year = gmdate('Y', $time);
+    $xmlrpc_date->month = gmdate('m', $time);
+    $xmlrpc_date->day = gmdate('d', $time);
+    $xmlrpc_date->hour = gmdate('H', $time);
+    $xmlrpc_date->minute = gmdate('i', $time);
+    $xmlrpc_date->second = gmdate('s', $time);
+    $xmlrpc_date->iso8601 = gmdate('Ymd\TH:i:s', $time);
+  }
+  else {
+    $xmlrpc_date->iso8601 = $time;
+    $time = str_replace(array('-', ':'), '', $time);
+    $xmlrpc_date->year = substr($time, 0, 4);
+    $xmlrpc_date->month = substr($time, 4, 2);
+    $xmlrpc_date->day = substr($time, 6, 2);
+    $xmlrpc_date->hour = substr($time, 9, 2);
+    $xmlrpc_date->minute = substr($time, 11, 2);
+    $xmlrpc_date->second = substr($time, 13, 2);
+  }
+  return $xmlrpc_date;
+}
+
+/**
+ * Converts an XML-RPC date-time object into XML.
+ *
+ * @param $xmlrpc_date
+ *   The XML-RPC date-time object.
+ *
+ * @return string
+ *   An XML representation of the date/time as XML.
+ */
+function xmlrpc_date_get_xml($xmlrpc_date) {
+  return '<dateTime.iso8601>' . $xmlrpc_date->year . $xmlrpc_date->month . $xmlrpc_date->day . 'T' . $xmlrpc_date->hour . ':' . $xmlrpc_date->minute . ':' . $xmlrpc_date->second . '</dateTime.iso8601>';
+}
+
+/**
+ * Returns an XML-RPC base 64 object.
+ *
+ * @param $data
+ *   Base 64 data to store in returned object.
+ *
+ * @return object
+ *   An XML-RPC base 64 object.
+ */
+function xmlrpc_base64($data) {
+  $xmlrpc_base64 = new stdClass();
+  $xmlrpc_base64->is_base64 = TRUE;
+  $xmlrpc_base64->data = $data;
+  return $xmlrpc_base64;
+}
+
+/**
+ * Converts an XML-RPC base 64 object into XML.
+ *
+ * @param $xmlrpc_base64
+ *   The XML-RPC base 64 object.
+ *
+ * @return string
+ *   An XML representation of the base 64 data as XML.
+ */
+function xmlrpc_base64_get_xml($xmlrpc_base64) {
+  return '<base64>' . base64_encode($xmlrpc_base64->data) . '</base64>';
+}
+
+/**
+ * Performs one or more XML-RPC requests.
+ *
+ * @param $url
+ *   An absolute URL of the XML-RPC endpoint, e.g.,
+ *   http://example.com/xmlrpc.php
+ * @param $args
+ *   An associative array whose keys are the methods to call and whose values
+ *   are the arguments to pass to the respective method. If multiple methods
+ *   are specified, a system.multicall is performed.
+ * @param $options
+ *   (optional) An array of options to pass along to drupal_http_request().
+ *
+ * @return
+ *   A single response (single request) or an array of responses (multicall
+ *   request). Each response is the return value of the method, just as if it
+ *   has been a local function call, on success, or FALSE on failure. If FALSE
+ *   is returned, see xmlrpc_errno() and xmlrpc_error_msg() to get more
+ *   information.
+ */
+function _xmlrpc($url, $args, $options = array()) {
+  xmlrpc_clear_error();
+  if (count($args) > 1) {
+    $multicall_args = array();
+    foreach ($args as $method => $call) {
+      $multicall_args[] = array('methodName' => $method, 'params' => $call);
+    }
+    $method = 'system.multicall';
+    $args = array($multicall_args);
+  }
+  else {
+    $method = key($args);
+    $args = $args[$method];
+  }
+  $xmlrpc_request = xmlrpc_request($method, $args);
+  // Required options which will replace any that are passed in.
+  $options['method'] = 'POST';
+  $options['headers']['Content-Type'] = 'text/xml';
+  $options['data'] = $xmlrpc_request->xml;
+  $result = drupal_http_request($url, $options);
+  if ($result->code != 200) {
+    xmlrpc_error($result->code, $result->error);
+    return FALSE;
+  }
+  $message = xmlrpc_message($result->data);
+  // Now parse what we've got back
+  if (!xmlrpc_message_parse($message)) {
+    // XML error
+    xmlrpc_error(-32700, t('Parse error. Not well formed'));
+    return FALSE;
+  }
+  // Is the message a fault?
+  if ($message->messagetype == 'fault') {
+    xmlrpc_error($message->fault_code, $message->fault_string);
+    return FALSE;
+  }
+  // We now know that the message is well-formed and a non-fault result.
+  if ($method == 'system.multicall') {
+    // Return per-method results or error objects.
+    $return = array();
+    foreach ($message->params[0] as $result) {
+      if (array_keys($result) == array(0)) {
+        $return[] = $result[0];
+      }
+      else {
+        $return[] = xmlrpc_error($result['faultCode'], $result['faultString']);
+      }
+    }
+  }
+  else {
+    $return = $message->params[0];
+  }
+  return $return;
+}
+
+/**
+ * Returns the last XML-RPC client error number.
+ */
+function xmlrpc_errno() {
+  $error = xmlrpc_error();
+  return ($error != NULL ? $error->code : NULL);
+}
+
+/**
+ * Returns the last XML-RPC client error message.
+ */
+function xmlrpc_error_msg() {
+  $error = xmlrpc_error();
+  return ($error != NULL ? $error->message : NULL);
+}
+
+/**
+ * Clears any previously-saved errors.
+ *
+ * @see xmlrpc_error()
+ */
+function xmlrpc_clear_error() {
+  xmlrpc_error(NULL, NULL, TRUE);
+}
diff --git a/htmltest/includes/xmlrpcs.inc b/htmltest/includes/xmlrpcs.inc
new file mode 100644
index 00000000..118f652d
--- /dev/null
+++ b/htmltest/includes/xmlrpcs.inc
@@ -0,0 +1,384 @@
+<?php
+
+/**
+ * @file
+ * Provides API for defining and handling XML-RPC requests.
+ */
+
+/**
+ * Invokes XML-RPC methods on this server.
+ *
+ * @param array $callbacks
+ *   Array of external XML-RPC method names with the callbacks they map to.
+ */
+function xmlrpc_server($callbacks) {
+  $xmlrpc_server = new stdClass();
+  // Define built-in XML-RPC method names
+  $defaults = array(
+    'system.multicall' => 'xmlrpc_server_multicall',
+    array(
+      'system.methodSignature',
+      'xmlrpc_server_method_signature',
+      array('array', 'string'),
+      'Returns an array describing the return type and required parameters of a method.',
+    ),
+    array(
+      'system.getCapabilities',
+      'xmlrpc_server_get_capabilities',
+      array('struct'),
+      'Returns a struct describing the XML-RPC specifications supported by this server.',
+    ),
+    array(
+      'system.listMethods',
+      'xmlrpc_server_list_methods',
+      array('array'),
+      'Returns an array of available methods on this server.',
+    ),
+    array(
+      'system.methodHelp',
+      'xmlrpc_server_method_help',
+      array('string', 'string'),
+      'Returns a documentation string for the specified method.',
+    ),
+  );
+  // We build an array of all method names by combining the built-ins
+  // with those defined by modules implementing the _xmlrpc hook.
+  // Built-in methods are overridable.
+  $callbacks = array_merge($defaults, (array) $callbacks);
+  drupal_alter('xmlrpc', $callbacks);
+  foreach ($callbacks as $key => $callback) {
+    // we could check for is_array($callback)
+    if (is_int($key)) {
+      $method = $callback[0];
+      $xmlrpc_server->callbacks[$method] = $callback[1];
+      $xmlrpc_server->signatures[$method] = $callback[2];
+      $xmlrpc_server->help[$method] = $callback[3];
+    }
+    else {
+      $xmlrpc_server->callbacks[$key] = $callback;
+      $xmlrpc_server->signatures[$key] = '';
+      $xmlrpc_server->help[$key] = '';
+    }
+  }
+
+  $data = file_get_contents('php://input');
+  if (!$data) {
+    print 'XML-RPC server accepts POST requests only.';
+    drupal_exit();
+  }
+  $xmlrpc_server->message = xmlrpc_message($data);
+  if (!xmlrpc_message_parse($xmlrpc_server->message)) {
+    xmlrpc_server_error(-32700, t('Parse error. Request not well formed.'));
+  }
+  if ($xmlrpc_server->message->messagetype != 'methodCall') {
+    xmlrpc_server_error(-32600, t('Server error. Invalid XML-RPC. Request must be a methodCall.'));
+  }
+  if (!isset($xmlrpc_server->message->params)) {
+    $xmlrpc_server->message->params = array();
+  }
+  xmlrpc_server_set($xmlrpc_server);
+  $result = xmlrpc_server_call($xmlrpc_server, $xmlrpc_server->message->methodname, $xmlrpc_server->message->params);
+
+  if (is_object($result) && !empty($result->is_error)) {
+    xmlrpc_server_error($result);
+  }
+  // Encode the result
+  $r = xmlrpc_value($result);
+  // Create the XML
+  $xml = '
+<methodResponse>
+  <params>
+  <param>
+    <value>' . xmlrpc_value_get_xml($r) . '</value>
+  </param>
+  </params>
+</methodResponse>
+
+';
+  // Send it
+  xmlrpc_server_output($xml);
+}
+
+/**
+ * Throws an XML-RPC error.
+ *
+ * @param $error
+ *   An error object or integer error code.
+ * @param $message
+ *   (optional) The description of the error. Used only if an integer error
+ *   code was passed in.
+ */
+function xmlrpc_server_error($error, $message = FALSE) {
+  if ($message && !is_object($error)) {
+    $error = xmlrpc_error($error, $message);
+  }
+  xmlrpc_server_output(xmlrpc_error_get_xml($error));
+}
+
+/**
+ * Sends XML-RPC output to the browser.
+ *
+ * @param string $xml
+ *   XML to send to the browser.
+ */
+function xmlrpc_server_output($xml) {
+  $xml = '<?xml version="1.0"?>' . "\n" . $xml;
+  drupal_add_http_header('Content-Length', strlen($xml));
+  drupal_add_http_header('Content-Type', 'text/xml');
+  echo $xml;
+  drupal_exit();
+}
+
+/**
+ * Stores a copy of an XML-RPC request temporarily.
+ *
+ * @param object $xmlrpc_server
+ *   (optional) Request object created by xmlrpc_server(). Omit to leave the
+ *   previous server object saved.
+ *
+ * @return
+ *   The latest stored request.
+ *
+ * @see xmlrpc_server_get()
+ */
+function xmlrpc_server_set($xmlrpc_server = NULL) {
+  static $server;
+  if (!isset($server)) {
+    $server = $xmlrpc_server;
+  }
+  return $server;
+}
+
+/**
+ * Retrieves the latest stored XML-RPC request.
+ *
+ * @return object
+ *   The stored request.
+ *
+ * @see xmlrpc_server_set()
+ */
+function xmlrpc_server_get() {
+  return xmlrpc_server_set();
+}
+
+/**
+ * Dispatches an XML-RPC request and any parameters to the appropriate handler.
+ *
+ * @param object $xmlrpc_server
+ *   Object containing information about this XML-RPC server, the methods it
+ *   provides, their signatures, etc.
+ * @param string $methodname
+ *   The external XML-RPC method name; e.g., 'system.methodHelp'.
+ * @param array $args
+ *   Array containing any parameters that are to be sent along with the request.
+ *
+ * @return
+ *   The results of the call.
+ */
+function xmlrpc_server_call($xmlrpc_server, $methodname, $args) {
+  // Make sure parameters are in an array
+  if ($args && !is_array($args)) {
+    $args = array($args);
+  }
+  // Has this method been mapped to a Drupal function by us or by modules?
+  if (!isset($xmlrpc_server->callbacks[$methodname])) {
+    return xmlrpc_error(-32601, t('Server error. Requested method @methodname not specified.', array("@methodname" => $xmlrpc_server->message->methodname)));
+  }
+  $method = $xmlrpc_server->callbacks[$methodname];
+  $signature = $xmlrpc_server->signatures[$methodname];
+
+  // If the method has a signature, validate the request against the signature
+  if (is_array($signature)) {
+    $ok = TRUE;
+    $return_type = array_shift($signature);
+    // Check the number of arguments
+    if (count($args) != count($signature)) {
+      return xmlrpc_error(-32602, t('Server error. Wrong number of method parameters.'));
+    }
+    // Check the argument types
+    foreach ($signature as $key => $type) {
+      $arg = $args[$key];
+      switch ($type) {
+        case 'int':
+        case 'i4':
+          if (is_array($arg) || !is_int($arg)) {
+            $ok = FALSE;
+          }
+          break;
+
+        case 'base64':
+        case 'string':
+          if (!is_string($arg)) {
+            $ok = FALSE;
+          }
+          break;
+
+        case 'boolean':
+          if ($arg !== FALSE && $arg !== TRUE) {
+            $ok = FALSE;
+          }
+          break;
+
+        case 'float':
+        case 'double':
+          if (!is_float($arg)) {
+            $ok = FALSE;
+          }
+          break;
+
+        case 'date':
+        case 'dateTime.iso8601':
+          if (!$arg->is_date) {
+            $ok = FALSE;
+          }
+          break;
+      }
+      if (!$ok) {
+        return xmlrpc_error(-32602, t('Server error. Invalid method parameters.'));
+      }
+    }
+  }
+
+  if (!function_exists($method)) {
+    return xmlrpc_error(-32601, t('Server error. Requested function @method does not exist.', array("@method" => $method)));
+  }
+  // Call the mapped function
+  return call_user_func_array($method, $args);
+}
+
+/**
+ * Dispatches multiple XML-RPC requests.
+ *
+ * @param array $methodcalls
+ *   An array of XML-RPC requests to make. Each request is an array with the
+ *   following elements:
+ *   - methodName: Name of the method to invoke.
+ *   - params: Parameters to pass to the method.
+ *
+ * @return
+ *   An array of the results of each request.
+ *
+ * @see xmlrpc_server_call()
+ */
+function xmlrpc_server_multicall($methodcalls) {
+  // See http://www.xmlrpc.com/discuss/msgReader$1208
+  $return = array();
+  $xmlrpc_server = xmlrpc_server_get();
+  foreach ($methodcalls as $call) {
+    $ok = TRUE;
+    if (!isset($call['methodName']) || !isset($call['params'])) {
+      $result = xmlrpc_error(3, t('Invalid syntax for system.multicall.'));
+      $ok = FALSE;
+    }
+    $method = $call['methodName'];
+    $params = $call['params'];
+    if ($method == 'system.multicall') {
+      $result = xmlrpc_error(-32600, t('Recursive calls to system.multicall are forbidden.'));
+    }
+    elseif ($ok) {
+      $result = xmlrpc_server_call($xmlrpc_server, $method, $params);
+    }
+    if (is_object($result) && !empty($result->is_error)) {
+      $return[] = array(
+        'faultCode' => $result->code,
+        'faultString' => $result->message,
+      );
+    }
+    else {
+      $return[] = array($result);
+    }
+  }
+  return $return;
+}
+
+/**
+ * Lists the methods available on this XML-RPC server.
+ *
+ * XML-RPC method system.listMethods maps to this function.
+ *
+ * @return array
+ *   Array of the names of methods available on this server.
+ */
+function xmlrpc_server_list_methods() {
+  $xmlrpc_server = xmlrpc_server_get();
+  return array_keys($xmlrpc_server->callbacks);
+}
+
+/**
+ * Returns a list of the capabilities of this server.
+ *
+ * XML-RPC method system.getCapabilities maps to this function.
+ *
+ * @return array
+ *   Array of server capabilities.
+ *
+ * @see http://groups.yahoo.com/group/xml-rpc/message/2897
+ */
+function xmlrpc_server_get_capabilities() {
+  return array(
+    'xmlrpc' => array(
+      'specUrl' => 'http://www.xmlrpc.com/spec',
+      'specVersion' => 1,
+    ),
+    'faults_interop' => array(
+      'specUrl' => 'http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php',
+      'specVersion' => 20010516,
+    ),
+    'system.multicall' => array(
+      'specUrl' => 'http://www.xmlrpc.com/discuss/msgReader$1208',
+      'specVersion' => 1,
+    ),
+    'introspection' => array(
+      'specUrl' => 'http://scripts.incutio.com/xmlrpc/introspection.html',
+      'specVersion' => 1,
+    ),
+  );
+}
+
+/**
+ * Returns one method signature for a function.
+ *
+ * This is the function mapped to the XML-RPC method system.methodSignature.
+ *
+ * A method signature is an array of the input and output types of a method. For
+ * instance, the method signature of this function is array('array', 'string'),
+ * because it takes an array and returns a string.
+ *
+ * @param string $methodname
+ *   Name of method to return a method signature for.
+ *
+ * @return array
+ *   An array of arrays of types, each of the arrays representing one method
+ *   signature of the function that $methodname maps to.
+ */
+function xmlrpc_server_method_signature($methodname) {
+  $xmlrpc_server = xmlrpc_server_get();
+  if (!isset($xmlrpc_server->callbacks[$methodname])) {
+    return xmlrpc_error(-32601, t('Server error. Requested method @methodname not specified.', array("@methodname" => $methodname)));
+  }
+  if (!is_array($xmlrpc_server->signatures[$methodname])) {
+    return xmlrpc_error(-32601, t('Server error. Requested method @methodname signature not specified.', array("@methodname" => $methodname)));
+  }
+  // We array of types
+  $return = array();
+  foreach ($xmlrpc_server->signatures[$methodname] as $type) {
+    $return[] = $type;
+  }
+  return array($return);
+}
+
+/**
+ * Returns the help for an XML-RPC method.
+ *
+ * XML-RPC method system.methodHelp maps to this function.
+ *
+ * @param string $method
+ *   Name of method for which we return a help string.
+ *
+ * @return string
+ *   Help text for $method.
+ */
+function xmlrpc_server_method_help($method) {
+  $xmlrpc_server = xmlrpc_server_get();
+  return $xmlrpc_server->help[$method];
+}
diff --git a/htmltest/index.php b/htmltest/index.php
new file mode 100644
index 00000000..8b831997
--- /dev/null
+++ b/htmltest/index.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * @file
+ * The PHP page that serves all page requests on a Drupal installation.
+ *
+ * The routines here dispatch control to the appropriate handler, which then
+ * prints the appropriate page.
+ *
+ * All Drupal code is released under the GNU General Public License.
+ * See COPYRIGHT.txt and LICENSE.txt.
+ */
+
+/**
+ * Root directory of Drupal installation.
+ */
+define('DRUPAL_ROOT', getcwd());
+
+require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
+drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+menu_execute_active_handler();
diff --git a/htmltest/install.php b/htmltest/install.php
new file mode 100644
index 00000000..685d3b4e
--- /dev/null
+++ b/htmltest/install.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Initiates a browser-based installation of Drupal.
+ */
+
+/**
+ * Defines the root directory of the Drupal installation.
+ */
+define('DRUPAL_ROOT', getcwd());
+
+/**
+ * Global flag to indicate the site is in installation mode.
+ */
+define('MAINTENANCE_MODE', 'install');
+
+// Exit early if running an incompatible PHP version to avoid fatal errors.
+if (version_compare(PHP_VERSION, '5.2.4') < 0) {
+  print 'Your PHP installation is too old. Drupal requires at least PHP 5.2.4. See the <a href="http://drupal.org/requirements">system requirements</a> page for more information.';
+  exit;
+}
+
+// Start the installer.
+require_once DRUPAL_ROOT . '/includes/install.core.inc';
+install_drupal();
diff --git a/htmltest/isf b/htmltest/isf
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/isf
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/izus b/htmltest/izus
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/izus
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/jenselme b/htmltest/jenselme
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/jenselme
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/jenselmetest b/htmltest/jenselmetest
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/jenselmetest
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/jpennec b/htmltest/jpennec
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/jpennec
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/ksi b/htmltest/ksi
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/ksi
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/ldp b/htmltest/ldp
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/ldp
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/lintecestlefeu b/htmltest/lintecestlefeu
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/lintecestlefeu
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/list b/htmltest/list
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/list
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/listerik b/htmltest/listerik
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/listerik
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/listonic b/htmltest/listonic
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/listonic
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/lpomot b/htmltest/lpomot
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/lpomot
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/mdv b/htmltest/mdv
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/mdv
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/misc/ajax.js b/htmltest/misc/ajax.js
new file mode 100644
index 00000000..90c3bb8b
--- /dev/null
+++ b/htmltest/misc/ajax.js
@@ -0,0 +1,622 @@
+(function ($) {
+
+/**
+ * Provides Ajax page updating via jQuery $.ajax (Asynchronous JavaScript and XML).
+ *
+ * Ajax is a method of making a request via JavaScript while viewing an HTML
+ * page. The request returns an array of commands encoded in JSON, which is
+ * then executed to make any changes that are necessary to the page.
+ *
+ * Drupal uses this file to enhance form elements with #ajax['path'] and
+ * #ajax['wrapper'] properties. If set, this file will automatically be included
+ * to provide Ajax capabilities.
+ */
+
+Drupal.ajax = Drupal.ajax || {};
+
+/**
+ * Attaches the Ajax behavior to each Ajax form element.
+ */
+Drupal.behaviors.AJAX = {
+  attach: function (context, settings) {
+    // Load all Ajax behaviors specified in the settings.
+    for (var base in settings.ajax) {
+      if (!$('#' + base + '.ajax-processed').length) {
+        var element_settings = settings.ajax[base];
+
+        if (typeof element_settings.selector == 'undefined') {
+          element_settings.selector = '#' + base;
+        }
+        $(element_settings.selector).each(function () {
+          element_settings.element = this;
+          Drupal.ajax[base] = new Drupal.ajax(base, this, element_settings);
+        });
+
+        $('#' + base).addClass('ajax-processed');
+      }
+    }
+
+    // Bind Ajax behaviors to all items showing the class.
+    $('.use-ajax:not(.ajax-processed)').addClass('ajax-processed').each(function () {
+      var element_settings = {};
+      // Clicked links look better with the throbber than the progress bar.
+      element_settings.progress = { 'type': 'throbber' };
+
+      // For anchor tags, these will go to the target of the anchor rather
+      // than the usual location.
+      if ($(this).attr('href')) {
+        element_settings.url = $(this).attr('href');
+        element_settings.event = 'click';
+      }
+      var base = $(this).attr('id');
+      Drupal.ajax[base] = new Drupal.ajax(base, this, element_settings);
+    });
+
+    // This class means to submit the form to the action using Ajax.
+    $('.use-ajax-submit:not(.ajax-processed)').addClass('ajax-processed').each(function () {
+      var element_settings = {};
+
+      // Ajax submits specified in this manner automatically submit to the
+      // normal form action.
+      element_settings.url = $(this.form).attr('action');
+      // Form submit button clicks need to tell the form what was clicked so
+      // it gets passed in the POST request.
+      element_settings.setClick = true;
+      // Form buttons use the 'click' event rather than mousedown.
+      element_settings.event = 'click';
+      // Clicked form buttons look better with the throbber than the progress bar.
+      element_settings.progress = { 'type': 'throbber' };
+
+      var base = $(this).attr('id');
+      Drupal.ajax[base] = new Drupal.ajax(base, this, element_settings);
+    });
+  }
+};
+
+/**
+ * Ajax object.
+ *
+ * All Ajax objects on a page are accessible through the global Drupal.ajax
+ * object and are keyed by the submit button's ID. You can access them from
+ * your module's JavaScript file to override properties or functions.
+ *
+ * For example, if your Ajax enabled button has the ID 'edit-submit', you can
+ * redefine the function that is called to insert the new content like this
+ * (inside a Drupal.behaviors attach block):
+ * @code
+ *    Drupal.behaviors.myCustomAJAXStuff = {
+ *      attach: function (context, settings) {
+ *        Drupal.ajax['edit-submit'].commands.insert = function (ajax, response, status) {
+ *          new_content = $(response.data);
+ *          $('#my-wrapper').append(new_content);
+ *          alert('New content was appended to #my-wrapper');
+ *        }
+ *      }
+ *    };
+ * @endcode
+ */
+Drupal.ajax = function (base, element, element_settings) {
+  var defaults = {
+    url: 'system/ajax',
+    event: 'mousedown',
+    keypress: true,
+    selector: '#' + base,
+    effect: 'none',
+    speed: 'none',
+    method: 'replaceWith',
+    progress: {
+      type: 'throbber',
+      message: Drupal.t('Please wait...')
+    },
+    submit: {
+      'js': true
+    }
+  };
+
+  $.extend(this, defaults, element_settings);
+
+  this.element = element;
+  this.element_settings = element_settings;
+
+  // Replacing 'nojs' with 'ajax' in the URL allows for an easy method to let
+  // the server detect when it needs to degrade gracefully.
+  // There are five scenarios to check for:
+  // 1. /nojs/
+  // 2. /nojs$ - The end of a URL string.
+  // 3. /nojs? - Followed by a query (with clean URLs enabled).
+  //      E.g.: path/nojs?destination=foobar
+  // 4. /nojs& - Followed by a query (without clean URLs enabled).
+  //      E.g.: ?q=path/nojs&destination=foobar
+  // 5. /nojs# - Followed by a fragment.
+  //      E.g.: path/nojs#myfragment
+  this.url = element_settings.url.replace(/\/nojs(\/|$|\?|&|#)/g, '/ajax$1');
+  this.wrapper = '#' + element_settings.wrapper;
+
+  // If there isn't a form, jQuery.ajax() will be used instead, allowing us to
+  // bind Ajax to links as well.
+  if (this.element.form) {
+    this.form = $(this.element.form);
+  }
+
+  // Set the options for the ajaxSubmit function.
+  // The 'this' variable will not persist inside of the options object.
+  var ajax = this;
+  ajax.options = {
+    url: ajax.url,
+    data: ajax.submit,
+    beforeSerialize: function (element_settings, options) {
+      return ajax.beforeSerialize(element_settings, options);
+    },
+    beforeSubmit: function (form_values, element_settings, options) {
+      ajax.ajaxing = true;
+      return ajax.beforeSubmit(form_values, element_settings, options);
+    },
+    beforeSend: function (xmlhttprequest, options) {
+      ajax.ajaxing = true;
+      return ajax.beforeSend(xmlhttprequest, options);
+    },
+    success: function (response, status) {
+      // Sanity check for browser support (object expected).
+      // When using iFrame uploads, responses must be returned as a string.
+      if (typeof response == 'string') {
+        response = $.parseJSON(response);
+      }
+      return ajax.success(response, status);
+    },
+    complete: function (response, status) {
+      ajax.ajaxing = false;
+      if (status == 'error' || status == 'parsererror') {
+        return ajax.error(response, ajax.url);
+      }
+    },
+    dataType: 'json',
+    type: 'POST'
+  };
+
+  // Bind the ajaxSubmit function to the element event.
+  $(ajax.element).bind(element_settings.event, function (event) {
+    return ajax.eventResponse(this, event);
+  });
+
+  // If necessary, enable keyboard submission so that Ajax behaviors
+  // can be triggered through keyboard input as well as e.g. a mousedown
+  // action.
+  if (element_settings.keypress) {
+    $(ajax.element).keypress(function (event) {
+      return ajax.keypressResponse(this, event);
+    });
+  }
+
+  // If necessary, prevent the browser default action of an additional event.
+  // For example, prevent the browser default action of a click, even if the
+  // AJAX behavior binds to mousedown.
+  if (element_settings.prevent) {
+    $(ajax.element).bind(element_settings.prevent, false);
+  }
+};
+
+/**
+ * Handle a key press.
+ *
+ * The Ajax object will, if instructed, bind to a key press response. This
+ * will test to see if the key press is valid to trigger this event and
+ * if it is, trigger it for us and prevent other keypresses from triggering.
+ * In this case we're handling RETURN and SPACEBAR keypresses (event codes 13
+ * and 32. RETURN is often used to submit a form when in a textfield, and 
+ * SPACE is often used to activate an element without submitting. 
+ */
+Drupal.ajax.prototype.keypressResponse = function (element, event) {
+  // Create a synonym for this to reduce code confusion.
+  var ajax = this;
+
+  // Detect enter key and space bar and allow the standard response for them,
+  // except for form elements of type 'text' and 'textarea', where the 
+  // spacebar activation causes inappropriate activation if #ajax['keypress'] is 
+  // TRUE. On a text-type widget a space should always be a space.
+  if (event.which == 13 || (event.which == 32 && element.type != 'text' && element.type != 'textarea')) {
+    $(ajax.element_settings.element).trigger(ajax.element_settings.event);
+    return false;
+  }
+};
+
+/**
+ * Handle an event that triggers an Ajax response.
+ *
+ * When an event that triggers an Ajax response happens, this method will
+ * perform the actual Ajax call. It is bound to the event using
+ * bind() in the constructor, and it uses the options specified on the
+ * ajax object.
+ */
+Drupal.ajax.prototype.eventResponse = function (element, event) {
+  // Create a synonym for this to reduce code confusion.
+  var ajax = this;
+
+  // Do not perform another ajax command if one is already in progress.
+  if (ajax.ajaxing) {
+    return false;
+  }
+
+  try {
+    if (ajax.form) {
+      // If setClick is set, we must set this to ensure that the button's
+      // value is passed.
+      if (ajax.setClick) {
+        // Mark the clicked button. 'form.clk' is a special variable for
+        // ajaxSubmit that tells the system which element got clicked to
+        // trigger the submit. Without it there would be no 'op' or
+        // equivalent.
+        element.form.clk = element;
+      }
+
+      ajax.form.ajaxSubmit(ajax.options);
+    }
+    else {
+      ajax.beforeSerialize(ajax.element, ajax.options);
+      $.ajax(ajax.options);
+    }
+  }
+  catch (e) {
+    // Unset the ajax.ajaxing flag here because it won't be unset during
+    // the complete response.
+    ajax.ajaxing = false;
+    alert("An error occurred while attempting to process " + ajax.options.url + ": " + e.message);
+  }
+
+  // For radio/checkbox, allow the default event. On IE, this means letting
+  // it actually check the box.
+  if (typeof element.type != 'undefined' && (element.type == 'checkbox' || element.type == 'radio')) {
+    return true;
+  }
+  else {
+    return false;
+  }
+
+};
+
+/**
+ * Handler for the form serialization.
+ *
+ * Runs before the beforeSend() handler (see below), and unlike that one, runs
+ * before field data is collected.
+ */
+Drupal.ajax.prototype.beforeSerialize = function (element, options) {
+  // Allow detaching behaviors to update field values before collecting them.
+  // This is only needed when field values are added to the POST data, so only
+  // when there is a form such that this.form.ajaxSubmit() is used instead of
+  // $.ajax(). When there is no form and $.ajax() is used, beforeSerialize()
+  // isn't called, but don't rely on that: explicitly check this.form.
+  if (this.form) {
+    var settings = this.settings || Drupal.settings;
+    Drupal.detachBehaviors(this.form, settings, 'serialize');
+  }
+
+  // Prevent duplicate HTML ids in the returned markup.
+  // @see drupal_html_id()
+  options.data['ajax_html_ids[]'] = [];
+  $('[id]').each(function () {
+    options.data['ajax_html_ids[]'].push(this.id);
+  });
+
+  // Allow Drupal to return new JavaScript and CSS files to load without
+  // returning the ones already loaded.
+  // @see ajax_base_page_theme()
+  // @see drupal_get_css()
+  // @see drupal_get_js()
+  options.data['ajax_page_state[theme]'] = Drupal.settings.ajaxPageState.theme;
+  options.data['ajax_page_state[theme_token]'] = Drupal.settings.ajaxPageState.theme_token;
+  for (var key in Drupal.settings.ajaxPageState.css) {
+    options.data['ajax_page_state[css][' + key + ']'] = 1;
+  }
+  for (var key in Drupal.settings.ajaxPageState.js) {
+    options.data['ajax_page_state[js][' + key + ']'] = 1;
+  }
+};
+
+/**
+ * Modify form values prior to form submission.
+ */
+Drupal.ajax.prototype.beforeSubmit = function (form_values, element, options) {
+  // This function is left empty to make it simple to override for modules
+  // that wish to add functionality here.
+};
+
+/**
+ * Prepare the Ajax request before it is sent.
+ */
+Drupal.ajax.prototype.beforeSend = function (xmlhttprequest, options) {
+  // For forms without file inputs, the jQuery Form plugin serializes the form
+  // values, and then calls jQuery's $.ajax() function, which invokes this
+  // handler. In this circumstance, options.extraData is never used. For forms
+  // with file inputs, the jQuery Form plugin uses the browser's normal form
+  // submission mechanism, but captures the response in a hidden IFRAME. In this
+  // circumstance, it calls this handler first, and then appends hidden fields
+  // to the form to submit the values in options.extraData. There is no simple
+  // way to know which submission mechanism will be used, so we add to extraData
+  // regardless, and allow it to be ignored in the former case.
+  if (this.form) {
+    options.extraData = options.extraData || {};
+
+    // Let the server know when the IFRAME submission mechanism is used. The
+    // server can use this information to wrap the JSON response in a TEXTAREA,
+    // as per http://jquery.malsup.com/form/#file-upload.
+    options.extraData.ajax_iframe_upload = '1';
+
+    // The triggering element is about to be disabled (see below), but if it
+    // contains a value (e.g., a checkbox, textfield, select, etc.), ensure that
+    // value is included in the submission. As per above, submissions that use
+    // $.ajax() are already serialized prior to the element being disabled, so
+    // this is only needed for IFRAME submissions.
+    var v = $.fieldValue(this.element);
+    if (v !== null) {
+      options.extraData[this.element.name] = v;
+    }
+  }
+
+  // Disable the element that received the change to prevent user interface
+  // interaction while the Ajax request is in progress. ajax.ajaxing prevents
+  // the element from triggering a new request, but does not prevent the user
+  // from changing its value.
+  $(this.element).addClass('progress-disabled').attr('disabled', true);
+
+  // Insert progressbar or throbber.
+  if (this.progress.type == 'bar') {
+    var progressBar = new Drupal.progressBar('ajax-progress-' + this.element.id, eval(this.progress.update_callback), this.progress.method, eval(this.progress.error_callback));
+    if (this.progress.message) {
+      progressBar.setProgress(-1, this.progress.message);
+    }
+    if (this.progress.url) {
+      progressBar.startMonitoring(this.progress.url, this.progress.interval || 1500);
+    }
+    this.progress.element = $(progressBar.element).addClass('ajax-progress ajax-progress-bar');
+    this.progress.object = progressBar;
+    $(this.element).after(this.progress.element);
+  }
+  else if (this.progress.type == 'throbber') {
+    this.progress.element = $('<div class="ajax-progress ajax-progress-throbber"><div class="throbber">&nbsp;</div></div>');
+    if (this.progress.message) {
+      $('.throbber', this.progress.element).after('<div class="message">' + this.progress.message + '</div>');
+    }
+    $(this.element).after(this.progress.element);
+  }
+};
+
+/**
+ * Handler for the form redirection completion.
+ */
+Drupal.ajax.prototype.success = function (response, status) {
+  // Remove the progress element.
+  if (this.progress.element) {
+    $(this.progress.element).remove();
+  }
+  if (this.progress.object) {
+    this.progress.object.stopMonitoring();
+  }
+  $(this.element).removeClass('progress-disabled').removeAttr('disabled');
+
+  Drupal.freezeHeight();
+
+  for (var i in response) {
+    if (response.hasOwnProperty(i) && response[i]['command'] && this.commands[response[i]['command']]) {
+      this.commands[response[i]['command']](this, response[i], status);
+    }
+  }
+
+  // Reattach behaviors, if they were detached in beforeSerialize(). The
+  // attachBehaviors() called on the new content from processing the response
+  // commands is not sufficient, because behaviors from the entire form need
+  // to be reattached.
+  if (this.form) {
+    var settings = this.settings || Drupal.settings;
+    Drupal.attachBehaviors(this.form, settings);
+  }
+
+  Drupal.unfreezeHeight();
+
+  // Remove any response-specific settings so they don't get used on the next
+  // call by mistake.
+  this.settings = null;
+};
+
+/**
+ * Build an effect object which tells us how to apply the effect when adding new HTML.
+ */
+Drupal.ajax.prototype.getEffect = function (response) {
+  var type = response.effect || this.effect;
+  var speed = response.speed || this.speed;
+
+  var effect = {};
+  if (type == 'none') {
+    effect.showEffect = 'show';
+    effect.hideEffect = 'hide';
+    effect.showSpeed = '';
+  }
+  else if (type == 'fade') {
+    effect.showEffect = 'fadeIn';
+    effect.hideEffect = 'fadeOut';
+    effect.showSpeed = speed;
+  }
+  else {
+    effect.showEffect = type + 'Toggle';
+    effect.hideEffect = type + 'Toggle';
+    effect.showSpeed = speed;
+  }
+
+  return effect;
+};
+
+/**
+ * Handler for the form redirection error.
+ */
+Drupal.ajax.prototype.error = function (response, uri) {
+  alert(Drupal.ajaxError(response, uri));
+  // Remove the progress element.
+  if (this.progress.element) {
+    $(this.progress.element).remove();
+  }
+  if (this.progress.object) {
+    this.progress.object.stopMonitoring();
+  }
+  // Undo hide.
+  $(this.wrapper).show();
+  // Re-enable the element.
+  $(this.element).removeClass('progress-disabled').removeAttr('disabled');
+  // Reattach behaviors, if they were detached in beforeSerialize().
+  if (this.form) {
+    var settings = response.settings || this.settings || Drupal.settings;
+    Drupal.attachBehaviors(this.form, settings);
+  }
+};
+
+/**
+ * Provide a series of commands that the server can request the client perform.
+ */
+Drupal.ajax.prototype.commands = {
+  /**
+   * Command to insert new content into the DOM.
+   */
+  insert: function (ajax, response, status) {
+    // Get information from the response. If it is not there, default to
+    // our presets.
+    var wrapper = response.selector ? $(response.selector) : $(ajax.wrapper);
+    var method = response.method || ajax.method;
+    var effect = ajax.getEffect(response);
+
+    // We don't know what response.data contains: it might be a string of text
+    // without HTML, so don't rely on jQuery correctly iterpreting
+    // $(response.data) as new HTML rather than a CSS selector. Also, if
+    // response.data contains top-level text nodes, they get lost with either
+    // $(response.data) or $('<div></div>').replaceWith(response.data).
+    var new_content_wrapped = $('<div></div>').html(response.data);
+    var new_content = new_content_wrapped.contents();
+
+    // For legacy reasons, the effects processing code assumes that new_content
+    // consists of a single top-level element. Also, it has not been
+    // sufficiently tested whether attachBehaviors() can be successfully called
+    // with a context object that includes top-level text nodes. However, to
+    // give developers full control of the HTML appearing in the page, and to
+    // enable Ajax content to be inserted in places where DIV elements are not
+    // allowed (e.g., within TABLE, TR, and SPAN parents), we check if the new
+    // content satisfies the requirement of a single top-level element, and
+    // only use the container DIV created above when it doesn't. For more
+    // information, please see http://drupal.org/node/736066.
+    if (new_content.length != 1 || new_content.get(0).nodeType != 1) {
+      new_content = new_content_wrapped;
+    }
+
+    // If removing content from the wrapper, detach behaviors first.
+    switch (method) {
+      case 'html':
+      case 'replaceWith':
+      case 'replaceAll':
+      case 'empty':
+      case 'remove':
+        var settings = response.settings || ajax.settings || Drupal.settings;
+        Drupal.detachBehaviors(wrapper, settings);
+    }
+
+    // Add the new content to the page.
+    wrapper[method](new_content);
+
+    // Immediately hide the new content if we're using any effects.
+    if (effect.showEffect != 'show') {
+      new_content.hide();
+    }
+
+    // Determine which effect to use and what content will receive the
+    // effect, then show the new content.
+    if ($('.ajax-new-content', new_content).length > 0) {
+      $('.ajax-new-content', new_content).hide();
+      new_content.show();
+      $('.ajax-new-content', new_content)[effect.showEffect](effect.showSpeed);
+    }
+    else if (effect.showEffect != 'show') {
+      new_content[effect.showEffect](effect.showSpeed);
+    }
+
+    // Attach all JavaScript behaviors to the new content, if it was successfully
+    // added to the page, this if statement allows #ajax['wrapper'] to be
+    // optional.
+    if (new_content.parents('html').length > 0) {
+      // Apply any settings from the returned JSON if available.
+      var settings = response.settings || ajax.settings || Drupal.settings;
+      Drupal.attachBehaviors(new_content, settings);
+    }
+  },
+
+  /**
+   * Command to remove a chunk from the page.
+   */
+  remove: function (ajax, response, status) {
+    var settings = response.settings || ajax.settings || Drupal.settings;
+    Drupal.detachBehaviors($(response.selector), settings);
+    $(response.selector).remove();
+  },
+
+  /**
+   * Command to mark a chunk changed.
+   */
+  changed: function (ajax, response, status) {
+    if (!$(response.selector).hasClass('ajax-changed')) {
+      $(response.selector).addClass('ajax-changed');
+      if (response.asterisk) {
+        $(response.selector).find(response.asterisk).append(' <span class="ajax-changed">*</span> ');
+      }
+    }
+  },
+
+  /**
+   * Command to provide an alert.
+   */
+  alert: function (ajax, response, status) {
+    alert(response.text, response.title);
+  },
+
+  /**
+   * Command to provide the jQuery css() function.
+   */
+  css: function (ajax, response, status) {
+    $(response.selector).css(response.argument);
+  },
+
+  /**
+   * Command to set the settings that will be used for other commands in this response.
+   */
+  settings: function (ajax, response, status) {
+    if (response.merge) {
+      $.extend(true, Drupal.settings, response.settings);
+    }
+    else {
+      ajax.settings = response.settings;
+    }
+  },
+
+  /**
+   * Command to attach data using jQuery's data API.
+   */
+  data: function (ajax, response, status) {
+    $(response.selector).data(response.name, response.value);
+  },
+
+  /**
+   * Command to apply a jQuery method.
+   */
+  invoke: function (ajax, response, status) {
+    var $element = $(response.selector);
+    $element[response.method].apply($element, response.arguments);
+  },
+
+  /**
+   * Command to restripe a table.
+   */
+  restripe: function (ajax, response, status) {
+    // :even and :odd are reversed because jQuery counts from 0 and
+    // we count from 1, so we're out of sync.
+    // Match immediate children of the parent element to allow nesting.
+    $('> tbody > tr:visible, > tr:visible', $(response.selector))
+      .removeClass('odd even')
+      .filter(':even').addClass('odd').end()
+      .filter(':odd').addClass('even');
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/misc/arrow-asc.png b/htmltest/misc/arrow-asc.png
new file mode 100644
index 00000000..2edbb17d
Binary files /dev/null and b/htmltest/misc/arrow-asc.png differ
diff --git a/htmltest/misc/arrow-desc.png b/htmltest/misc/arrow-desc.png
new file mode 100644
index 00000000..a3ccabc5
Binary files /dev/null and b/htmltest/misc/arrow-desc.png differ
diff --git a/htmltest/misc/authorize.js b/htmltest/misc/authorize.js
new file mode 100644
index 00000000..d522a5ba
--- /dev/null
+++ b/htmltest/misc/authorize.js
@@ -0,0 +1,27 @@
+
+/**
+ * @file
+ * Conditionally hide or show the appropriate settings and saved defaults
+ * on the file transfer connection settings form used by authorize.php.
+ */
+
+(function ($) {
+
+Drupal.behaviors.authorizeFileTransferForm = {
+  attach: function(context) {
+    $('#edit-connection-settings-authorize-filetransfer-default').change(function() {
+      $('.filetransfer').hide().filter('.filetransfer-' + $(this).val()).show();
+    });
+    $('.filetransfer').hide().filter('.filetransfer-' + $('#edit-connection-settings-authorize-filetransfer-default').val()).show();
+
+    // Removes the float on the select box (used for non-JS interface).
+    if ($('.connection-settings-update-filetransfer-default-wrapper').length > 0) {
+      $('.connection-settings-update-filetransfer-default-wrapper').css('float', 'none');
+    }
+    // Hides the submit button for non-js users.
+    $('#edit-submit-connection').hide();
+    $('#edit-submit-process').show();
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/misc/autocomplete.js b/htmltest/misc/autocomplete.js
new file mode 100644
index 00000000..8f7ac601
--- /dev/null
+++ b/htmltest/misc/autocomplete.js
@@ -0,0 +1,324 @@
+(function ($) {
+
+/**
+ * Attaches the autocomplete behavior to all required fields.
+ */
+Drupal.behaviors.autocomplete = {
+  attach: function (context, settings) {
+    var acdb = [];
+    $('input.autocomplete', context).once('autocomplete', function () {
+      var uri = this.value;
+      if (!acdb[uri]) {
+        acdb[uri] = new Drupal.ACDB(uri);
+      }
+      var $input = $('#' + this.id.substr(0, this.id.length - 13))
+        .attr('autocomplete', 'OFF')
+        .attr('aria-autocomplete', 'list');
+      $($input[0].form).submit(Drupal.autocompleteSubmit);
+      $input.parent()
+        .attr('role', 'application')
+        .append($('<span class="element-invisible" aria-live="assertive"></span>')
+          .attr('id', $input.attr('id') + '-autocomplete-aria-live')
+        );
+      new Drupal.jsAC($input, acdb[uri]);
+    });
+  }
+};
+
+/**
+ * Prevents the form from submitting if the suggestions popup is open
+ * and closes the suggestions popup when doing so.
+ */
+Drupal.autocompleteSubmit = function () {
+  return $('#autocomplete').each(function () {
+    this.owner.hidePopup();
+  }).length == 0;
+};
+
+/**
+ * An AutoComplete object.
+ */
+Drupal.jsAC = function ($input, db) {
+  var ac = this;
+  this.input = $input[0];
+  this.ariaLive = $('#' + this.input.id + '-autocomplete-aria-live');
+  this.db = db;
+
+  $input
+    .keydown(function (event) { return ac.onkeydown(this, event); })
+    .keyup(function (event) { ac.onkeyup(this, event); })
+    .blur(function () { ac.hidePopup(); ac.db.cancel(); });
+
+};
+
+/**
+ * Handler for the "keydown" event.
+ */
+Drupal.jsAC.prototype.onkeydown = function (input, e) {
+  if (!e) {
+    e = window.event;
+  }
+  switch (e.keyCode) {
+    case 40: // down arrow.
+      this.selectDown();
+      return false;
+    case 38: // up arrow.
+      this.selectUp();
+      return false;
+    default: // All other keys.
+      return true;
+  }
+};
+
+/**
+ * Handler for the "keyup" event.
+ */
+Drupal.jsAC.prototype.onkeyup = function (input, e) {
+  if (!e) {
+    e = window.event;
+  }
+  switch (e.keyCode) {
+    case 16: // Shift.
+    case 17: // Ctrl.
+    case 18: // Alt.
+    case 20: // Caps lock.
+    case 33: // Page up.
+    case 34: // Page down.
+    case 35: // End.
+    case 36: // Home.
+    case 37: // Left arrow.
+    case 38: // Up arrow.
+    case 39: // Right arrow.
+    case 40: // Down arrow.
+      return true;
+
+    case 9:  // Tab.
+    case 13: // Enter.
+    case 27: // Esc.
+      this.hidePopup(e.keyCode);
+      return true;
+
+    default: // All other keys.
+      if (input.value.length > 0 && !input.readOnly) {
+        this.populatePopup();
+      }
+      else {
+        this.hidePopup(e.keyCode);
+      }
+      return true;
+  }
+};
+
+/**
+ * Puts the currently highlighted suggestion into the autocomplete field.
+ */
+Drupal.jsAC.prototype.select = function (node) {
+  this.input.value = $(node).data('autocompleteValue');
+};
+
+/**
+ * Highlights the next suggestion.
+ */
+Drupal.jsAC.prototype.selectDown = function () {
+  if (this.selected && this.selected.nextSibling) {
+    this.highlight(this.selected.nextSibling);
+  }
+  else if (this.popup) {
+    var lis = $('li', this.popup);
+    if (lis.length > 0) {
+      this.highlight(lis.get(0));
+    }
+  }
+};
+
+/**
+ * Highlights the previous suggestion.
+ */
+Drupal.jsAC.prototype.selectUp = function () {
+  if (this.selected && this.selected.previousSibling) {
+    this.highlight(this.selected.previousSibling);
+  }
+};
+
+/**
+ * Highlights a suggestion.
+ */
+Drupal.jsAC.prototype.highlight = function (node) {
+  if (this.selected) {
+    $(this.selected).removeClass('selected');
+  }
+  $(node).addClass('selected');
+  this.selected = node;
+  $(this.ariaLive).html($(this.selected).html());
+};
+
+/**
+ * Unhighlights a suggestion.
+ */
+Drupal.jsAC.prototype.unhighlight = function (node) {
+  $(node).removeClass('selected');
+  this.selected = false;
+  $(this.ariaLive).empty();
+};
+
+/**
+ * Hides the autocomplete suggestions.
+ */
+Drupal.jsAC.prototype.hidePopup = function (keycode) {
+  // Select item if the right key or mousebutton was pressed.
+  if (this.selected && ((keycode && keycode != 46 && keycode != 8 && keycode != 27) || !keycode)) {
+    this.input.value = $(this.selected).data('autocompleteValue');
+  }
+  // Hide popup.
+  var popup = this.popup;
+  if (popup) {
+    this.popup = null;
+    $(popup).fadeOut('fast', function () { $(popup).remove(); });
+  }
+  this.selected = false;
+  $(this.ariaLive).empty();
+};
+
+/**
+ * Positions the suggestions popup and starts a search.
+ */
+Drupal.jsAC.prototype.populatePopup = function () {
+  var $input = $(this.input);
+  var position = $input.position();
+  // Show popup.
+  if (this.popup) {
+    $(this.popup).remove();
+  }
+  this.selected = false;
+  this.popup = $('<div id="autocomplete"></div>')[0];
+  this.popup.owner = this;
+  $(this.popup).css({
+    top: parseInt(position.top + this.input.offsetHeight, 10) + 'px',
+    left: parseInt(position.left, 10) + 'px',
+    width: $input.innerWidth() + 'px',
+    display: 'none'
+  });
+  $input.before(this.popup);
+
+  // Do search.
+  this.db.owner = this;
+  this.db.search(this.input.value);
+};
+
+/**
+ * Fills the suggestion popup with any matches received.
+ */
+Drupal.jsAC.prototype.found = function (matches) {
+  // If no value in the textfield, do not show the popup.
+  if (!this.input.value.length) {
+    return false;
+  }
+
+  // Prepare matches.
+  var ul = $('<ul></ul>');
+  var ac = this;
+  for (key in matches) {
+    $('<li></li>')
+      .html($('<div></div>').html(matches[key]))
+      .mousedown(function () { ac.select(this); })
+      .mouseover(function () { ac.highlight(this); })
+      .mouseout(function () { ac.unhighlight(this); })
+      .data('autocompleteValue', key)
+      .appendTo(ul);
+  }
+
+  // Show popup with matches, if any.
+  if (this.popup) {
+    if (ul.children().length) {
+      $(this.popup).empty().append(ul).show();
+      $(this.ariaLive).html(Drupal.t('Autocomplete popup'));
+    }
+    else {
+      $(this.popup).css({ visibility: 'hidden' });
+      this.hidePopup();
+    }
+  }
+};
+
+Drupal.jsAC.prototype.setStatus = function (status) {
+  switch (status) {
+    case 'begin':
+      $(this.input).addClass('throbbing');
+      $(this.ariaLive).html(Drupal.t('Searching for matches...'));
+      break;
+    case 'cancel':
+    case 'error':
+    case 'found':
+      $(this.input).removeClass('throbbing');
+      break;
+  }
+};
+
+/**
+ * An AutoComplete DataBase object.
+ */
+Drupal.ACDB = function (uri) {
+  this.uri = uri;
+  this.delay = 300;
+  this.cache = {};
+};
+
+/**
+ * Performs a cached and delayed search.
+ */
+Drupal.ACDB.prototype.search = function (searchString) {
+  var db = this;
+  this.searchString = searchString;
+
+  // See if this string needs to be searched for anyway.
+  searchString = searchString.replace(/^\s+|\s+$/, '');
+  if (searchString.length <= 0 ||
+    searchString.charAt(searchString.length - 1) == ',') {
+    return;
+  }
+
+  // See if this key has been searched for before.
+  if (this.cache[searchString]) {
+    return this.owner.found(this.cache[searchString]);
+  }
+
+  // Initiate delayed search.
+  if (this.timer) {
+    clearTimeout(this.timer);
+  }
+  this.timer = setTimeout(function () {
+    db.owner.setStatus('begin');
+
+    // Ajax GET request for autocompletion. We use Drupal.encodePath instead of
+    // encodeURIComponent to allow autocomplete search terms to contain slashes.
+    $.ajax({
+      type: 'GET',
+      url: db.uri + '/' + Drupal.encodePath(searchString),
+      dataType: 'json',
+      success: function (matches) {
+        if (typeof matches.status == 'undefined' || matches.status != 0) {
+          db.cache[searchString] = matches;
+          // Verify if these are still the matches the user wants to see.
+          if (db.searchString == searchString) {
+            db.owner.found(matches);
+          }
+          db.owner.setStatus('found');
+        }
+      },
+      error: function (xmlhttp) {
+        alert(Drupal.ajaxError(xmlhttp, db.uri));
+      }
+    });
+  }, this.delay);
+};
+
+/**
+ * Cancels the current autocomplete request.
+ */
+Drupal.ACDB.prototype.cancel = function () {
+  if (this.owner) this.owner.setStatus('cancel');
+  if (this.timer) clearTimeout(this.timer);
+  this.searchString = '';
+};
+
+})(jQuery);
diff --git a/htmltest/misc/batch.js b/htmltest/misc/batch.js
new file mode 100644
index 00000000..fee71a52
--- /dev/null
+++ b/htmltest/misc/batch.js
@@ -0,0 +1,32 @@
+(function ($) {
+
+/**
+ * Attaches the batch behavior to progress bars.
+ */
+Drupal.behaviors.batch = {
+  attach: function (context, settings) {
+    $('#progress', context).once('batch', function () {
+      var holder = $(this);
+
+      // Success: redirect to the summary.
+      var updateCallback = function (progress, status, pb) {
+        if (progress == 100) {
+          pb.stopMonitoring();
+          window.location = settings.batch.uri + '&op=finished';
+        }
+      };
+
+      var errorCallback = function (pb) {
+        holder.prepend($('<p class="error"></p>').html(settings.batch.errorMessage));
+        $('#wait').hide();
+      };
+
+      var progress = new Drupal.progressBar('updateprogress', updateCallback, 'POST', errorCallback);
+      progress.setProgress(-1, settings.batch.initMessage);
+      holder.append(progress.element);
+      progress.startMonitoring(settings.batch.uri + '&op=do', 10);
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/misc/collapse.js b/htmltest/misc/collapse.js
new file mode 100644
index 00000000..512ff2f9
--- /dev/null
+++ b/htmltest/misc/collapse.js
@@ -0,0 +1,103 @@
+(function ($) {
+
+/**
+ * Toggle the visibility of a fieldset using smooth animations.
+ */
+Drupal.toggleFieldset = function (fieldset) {
+  var $fieldset = $(fieldset);
+  if ($fieldset.is('.collapsed')) {
+    var $content = $('> .fieldset-wrapper', fieldset).hide();
+    $fieldset
+      .removeClass('collapsed')
+      .trigger({ type: 'collapsed', value: false })
+      .find('> legend span.fieldset-legend-prefix').html(Drupal.t('Hide'));
+    $content.slideDown({
+      duration: 'fast',
+      easing: 'linear',
+      complete: function () {
+        Drupal.collapseScrollIntoView(fieldset);
+        fieldset.animating = false;
+      },
+      step: function () {
+        // Scroll the fieldset into view.
+        Drupal.collapseScrollIntoView(fieldset);
+      }
+    });
+  }
+  else {
+    $fieldset.trigger({ type: 'collapsed', value: true });
+    $('> .fieldset-wrapper', fieldset).slideUp('fast', function () {
+      $fieldset
+        .addClass('collapsed')
+        .find('> legend span.fieldset-legend-prefix').html(Drupal.t('Show'));
+      fieldset.animating = false;
+    });
+  }
+};
+
+/**
+ * Scroll a given fieldset into view as much as possible.
+ */
+Drupal.collapseScrollIntoView = function (node) {
+  var h = document.documentElement.clientHeight || document.body.clientHeight || 0;
+  var offset = document.documentElement.scrollTop || document.body.scrollTop || 0;
+  var posY = $(node).offset().top;
+  var fudge = 55;
+  if (posY + node.offsetHeight + fudge > h + offset) {
+    if (node.offsetHeight > h) {
+      window.scrollTo(0, posY);
+    }
+    else {
+      window.scrollTo(0, posY + node.offsetHeight - h + fudge);
+    }
+  }
+};
+
+Drupal.behaviors.collapse = {
+  attach: function (context, settings) {
+    $('fieldset.collapsible', context).once('collapse', function () {
+      var $fieldset = $(this);
+      // Expand fieldset if there are errors inside, or if it contains an
+      // element that is targeted by the URI fragment identifier.
+      var anchor = location.hash && location.hash != '#' ? ', ' + location.hash : '';
+      if ($fieldset.find('.error' + anchor).length) {
+        $fieldset.removeClass('collapsed');
+      }
+
+      var summary = $('<span class="summary"></span>');
+      $fieldset.
+        bind('summaryUpdated', function () {
+          var text = $.trim($fieldset.drupalGetSummary());
+          summary.html(text ? ' (' + text + ')' : '');
+        })
+        .trigger('summaryUpdated');
+
+      // Turn the legend into a clickable link, but retain span.fieldset-legend
+      // for CSS positioning.
+      var $legend = $('> legend .fieldset-legend', this);
+
+      $('<span class="fieldset-legend-prefix element-invisible"></span>')
+        .append($fieldset.hasClass('collapsed') ? Drupal.t('Show') : Drupal.t('Hide'))
+        .prependTo($legend)
+        .after(' ');
+
+      // .wrapInner() does not retain bound events.
+      var $link = $('<a class="fieldset-title" href="#"></a>')
+        .prepend($legend.contents())
+        .appendTo($legend)
+        .click(function () {
+          var fieldset = $fieldset.get(0);
+          // Don't animate multiple times.
+          if (!fieldset.animating) {
+            fieldset.animating = true;
+            Drupal.toggleFieldset(fieldset);
+          }
+          return false;
+        });
+
+      $legend.append(summary);
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/misc/configure.png b/htmltest/misc/configure.png
new file mode 100644
index 00000000..ff200dc1
Binary files /dev/null and b/htmltest/misc/configure.png differ
diff --git a/htmltest/misc/draggable.png b/htmltest/misc/draggable.png
new file mode 100644
index 00000000..93d20d60
Binary files /dev/null and b/htmltest/misc/draggable.png differ
diff --git a/htmltest/misc/drupal.js b/htmltest/misc/drupal.js
new file mode 100644
index 00000000..643baa1b
--- /dev/null
+++ b/htmltest/misc/drupal.js
@@ -0,0 +1,433 @@
+
+var Drupal = Drupal || { 'settings': {}, 'behaviors': {}, 'locale': {} };
+
+// Allow other JavaScript libraries to use $.
+jQuery.noConflict();
+
+(function ($) {
+
+/**
+ * Override jQuery.fn.init to guard against XSS attacks.
+ *
+ * See http://bugs.jquery.com/ticket/9521
+ */
+var jquery_init = $.fn.init;
+$.fn.init = function (selector, context, rootjQuery) {
+  // If the string contains a "#" before a "<", treat it as invalid HTML.
+  if (selector && typeof selector === 'string') {
+    var hash_position = selector.indexOf('#');
+    if (hash_position >= 0) {
+      var bracket_position = selector.indexOf('<');
+      if (bracket_position > hash_position) {
+        throw 'Syntax error, unrecognized expression: ' + selector;
+      }
+    }
+  }
+  return jquery_init.call(this, selector, context, rootjQuery);
+};
+$.fn.init.prototype = jquery_init.prototype;
+
+/**
+ * Attach all registered behaviors to a page element.
+ *
+ * Behaviors are event-triggered actions that attach to page elements, enhancing
+ * default non-JavaScript UIs. Behaviors are registered in the Drupal.behaviors
+ * object using the method 'attach' and optionally also 'detach' as follows:
+ * @code
+ *    Drupal.behaviors.behaviorName = {
+ *      attach: function (context, settings) {
+ *        ...
+ *      },
+ *      detach: function (context, settings, trigger) {
+ *        ...
+ *      }
+ *    };
+ * @endcode
+ *
+ * Drupal.attachBehaviors is added below to the jQuery ready event and so
+ * runs on initial page load. Developers implementing AHAH/Ajax in their
+ * solutions should also call this function after new page content has been
+ * loaded, feeding in an element to be processed, in order to attach all
+ * behaviors to the new content.
+ *
+ * Behaviors should use
+ * @code
+ *   $(selector).once('behavior-name', function () {
+ *     ...
+ *   });
+ * @endcode
+ * to ensure the behavior is attached only once to a given element. (Doing so
+ * enables the reprocessing of given elements, which may be needed on occasion
+ * despite the ability to limit behavior attachment to a particular element.)
+ *
+ * @param context
+ *   An element to attach behaviors to. If none is given, the document element
+ *   is used.
+ * @param settings
+ *   An object containing settings for the current context. If none given, the
+ *   global Drupal.settings object is used.
+ */
+Drupal.attachBehaviors = function (context, settings) {
+  context = context || document;
+  settings = settings || Drupal.settings;
+  // Execute all of them.
+  $.each(Drupal.behaviors, function () {
+    if ($.isFunction(this.attach)) {
+      this.attach(context, settings);
+    }
+  });
+};
+
+/**
+ * Detach registered behaviors from a page element.
+ *
+ * Developers implementing AHAH/Ajax in their solutions should call this
+ * function before page content is about to be removed, feeding in an element
+ * to be processed, in order to allow special behaviors to detach from the
+ * content.
+ *
+ * Such implementations should look for the class name that was added in their
+ * corresponding Drupal.behaviors.behaviorName.attach implementation, i.e.
+ * behaviorName-processed, to ensure the behavior is detached only from
+ * previously processed elements.
+ *
+ * @param context
+ *   An element to detach behaviors from. If none is given, the document element
+ *   is used.
+ * @param settings
+ *   An object containing settings for the current context. If none given, the
+ *   global Drupal.settings object is used.
+ * @param trigger
+ *   A string containing what's causing the behaviors to be detached. The
+ *   possible triggers are:
+ *   - unload: (default) The context element is being removed from the DOM.
+ *   - move: The element is about to be moved within the DOM (for example,
+ *     during a tabledrag row swap). After the move is completed,
+ *     Drupal.attachBehaviors() is called, so that the behavior can undo
+ *     whatever it did in response to the move. Many behaviors won't need to
+ *     do anything simply in response to the element being moved, but because
+ *     IFRAME elements reload their "src" when being moved within the DOM,
+ *     behaviors bound to IFRAME elements (like WYSIWYG editors) may need to
+ *     take some action.
+ *   - serialize: When an Ajax form is submitted, this is called with the
+ *     form as the context. This provides every behavior within the form an
+ *     opportunity to ensure that the field elements have correct content
+ *     in them before the form is serialized. The canonical use-case is so
+ *     that WYSIWYG editors can update the hidden textarea to which they are
+ *     bound.
+ *
+ * @see Drupal.attachBehaviors
+ */
+Drupal.detachBehaviors = function (context, settings, trigger) {
+  context = context || document;
+  settings = settings || Drupal.settings;
+  trigger = trigger || 'unload';
+  // Execute all of them.
+  $.each(Drupal.behaviors, function () {
+    if ($.isFunction(this.detach)) {
+      this.detach(context, settings, trigger);
+    }
+  });
+};
+
+/**
+ * Encode special characters in a plain-text string for display as HTML.
+ *
+ * @ingroup sanitization
+ */
+Drupal.checkPlain = function (str) {
+  var character, regex,
+      replace = { '&': '&amp;', '"': '&quot;', '<': '&lt;', '>': '&gt;' };
+  str = String(str);
+  for (character in replace) {
+    if (replace.hasOwnProperty(character)) {
+      regex = new RegExp(character, 'g');
+      str = str.replace(regex, replace[character]);
+    }
+  }
+  return str;
+};
+
+/**
+ * Replace placeholders with sanitized values in a string.
+ *
+ * @param str
+ *   A string with placeholders.
+ * @param args
+ *   An object of replacements pairs to make. Incidences of any key in this
+ *   array are replaced with the corresponding value. Based on the first
+ *   character of the key, the value is escaped and/or themed:
+ *    - !variable: inserted as is
+ *    - @variable: escape plain text to HTML (Drupal.checkPlain)
+ *    - %variable: escape text and theme as a placeholder for user-submitted
+ *      content (checkPlain + Drupal.theme('placeholder'))
+ *
+ * @see Drupal.t()
+ * @ingroup sanitization
+ */
+Drupal.formatString = function(str, args) {
+  // Transform arguments before inserting them.
+  for (var key in args) {
+    switch (key.charAt(0)) {
+      // Escaped only.
+      case '@':
+        args[key] = Drupal.checkPlain(args[key]);
+      break;
+      // Pass-through.
+      case '!':
+        break;
+      // Escaped and placeholder.
+      case '%':
+      default:
+        args[key] = Drupal.theme('placeholder', args[key]);
+        break;
+    }
+    str = str.replace(key, args[key]);
+  }
+  return str;
+};
+
+/**
+ * Translate strings to the page language or a given language.
+ *
+ * See the documentation of the server-side t() function for further details.
+ *
+ * @param str
+ *   A string containing the English string to translate.
+ * @param args
+ *   An object of replacements pairs to make after translation. Incidences
+ *   of any key in this array are replaced with the corresponding value.
+ *   See Drupal.formatString().
+ *
+ * @param options
+ *   - 'context' (defaults to the empty context): The context the source string
+ *     belongs to.
+ *
+ * @return
+ *   The translated string.
+ */
+Drupal.t = function (str, args, options) {
+  options = options || {};
+  options.context = options.context || '';
+
+  // Fetch the localized version of the string.
+  if (Drupal.locale.strings && Drupal.locale.strings[options.context] && Drupal.locale.strings[options.context][str]) {
+    str = Drupal.locale.strings[options.context][str];
+  }
+
+  if (args) {
+    str = Drupal.formatString(str, args);
+  }
+  return str;
+};
+
+/**
+ * Format a string containing a count of items.
+ *
+ * This function ensures that the string is pluralized correctly. Since Drupal.t() is
+ * called by this function, make sure not to pass already-localized strings to it.
+ *
+ * See the documentation of the server-side format_plural() function for further details.
+ *
+ * @param count
+ *   The item count to display.
+ * @param singular
+ *   The string for the singular case. Please make sure it is clear this is
+ *   singular, to ease translation (e.g. use "1 new comment" instead of "1 new").
+ *   Do not use @count in the singular string.
+ * @param plural
+ *   The string for the plural case. Please make sure it is clear this is plural,
+ *   to ease translation. Use @count in place of the item count, as in "@count
+ *   new comments".
+ * @param args
+ *   An object of replacements pairs to make after translation. Incidences
+ *   of any key in this array are replaced with the corresponding value.
+ *   See Drupal.formatString().
+ *   Note that you do not need to include @count in this array.
+ *   This replacement is done automatically for the plural case.
+ * @param options
+ *   The options to pass to the Drupal.t() function.
+ * @return
+ *   A translated string.
+ */
+Drupal.formatPlural = function (count, singular, plural, args, options) {
+  var args = args || {};
+  args['@count'] = count;
+  // Determine the index of the plural form.
+  var index = Drupal.locale.pluralFormula ? Drupal.locale.pluralFormula(args['@count']) : ((args['@count'] == 1) ? 0 : 1);
+
+  if (index == 0) {
+    return Drupal.t(singular, args, options);
+  }
+  else if (index == 1) {
+    return Drupal.t(plural, args, options);
+  }
+  else {
+    args['@count[' + index + ']'] = args['@count'];
+    delete args['@count'];
+    return Drupal.t(plural.replace('@count', '@count[' + index + ']'), args, options);
+  }
+};
+
+/**
+ * Generate the themed representation of a Drupal object.
+ *
+ * All requests for themed output must go through this function. It examines
+ * the request and routes it to the appropriate theme function. If the current
+ * theme does not provide an override function, the generic theme function is
+ * called.
+ *
+ * For example, to retrieve the HTML for text that should be emphasized and
+ * displayed as a placeholder inside a sentence, call
+ * Drupal.theme('placeholder', text).
+ *
+ * @param func
+ *   The name of the theme function to call.
+ * @param ...
+ *   Additional arguments to pass along to the theme function.
+ * @return
+ *   Any data the theme function returns. This could be a plain HTML string,
+ *   but also a complex object.
+ */
+Drupal.theme = function (func) {
+  var args = Array.prototype.slice.apply(arguments, [1]);
+
+  return (Drupal.theme[func] || Drupal.theme.prototype[func]).apply(this, args);
+};
+
+/**
+ * Freeze the current body height (as minimum height). Used to prevent
+ * unnecessary upwards scrolling when doing DOM manipulations.
+ */
+Drupal.freezeHeight = function () {
+  Drupal.unfreezeHeight();
+  $('<div id="freeze-height"></div>').css({
+    position: 'absolute',
+    top: '0px',
+    left: '0px',
+    width: '1px',
+    height: $('body').css('height')
+  }).appendTo('body');
+};
+
+/**
+ * Unfreeze the body height.
+ */
+Drupal.unfreezeHeight = function () {
+  $('#freeze-height').remove();
+};
+
+/**
+ * Encodes a Drupal path for use in a URL.
+ *
+ * For aesthetic reasons slashes are not escaped.
+ */
+Drupal.encodePath = function (item, uri) {
+  uri = uri || location.href;
+  return encodeURIComponent(item).replace(/%2F/g, '/');
+};
+
+/**
+ * Get the text selection in a textarea.
+ */
+Drupal.getSelection = function (element) {
+  if (typeof element.selectionStart != 'number' && document.selection) {
+    // The current selection.
+    var range1 = document.selection.createRange();
+    var range2 = range1.duplicate();
+    // Select all text.
+    range2.moveToElementText(element);
+    // Now move 'dummy' end point to end point of original range.
+    range2.setEndPoint('EndToEnd', range1);
+    // Now we can calculate start and end points.
+    var start = range2.text.length - range1.text.length;
+    var end = start + range1.text.length;
+    return { 'start': start, 'end': end };
+  }
+  return { 'start': element.selectionStart, 'end': element.selectionEnd };
+};
+
+/**
+ * Build an error message from an Ajax response.
+ */
+Drupal.ajaxError = function (xmlhttp, uri) {
+  var statusCode, statusText, pathText, responseText, readyStateText, message;
+  if (xmlhttp.status) {
+    statusCode = "\n" + Drupal.t("An AJAX HTTP error occurred.") +  "\n" + Drupal.t("HTTP Result Code: !status", {'!status': xmlhttp.status});
+  }
+  else {
+    statusCode = "\n" + Drupal.t("An AJAX HTTP request terminated abnormally.");
+  }
+  statusCode += "\n" + Drupal.t("Debugging information follows.");
+  pathText = "\n" + Drupal.t("Path: !uri", {'!uri': uri} );
+  statusText = '';
+  // In some cases, when statusCode == 0, xmlhttp.statusText may not be defined.
+  // Unfortunately, testing for it with typeof, etc, doesn't seem to catch that
+  // and the test causes an exception. So we need to catch the exception here.
+  try {
+    statusText = "\n" + Drupal.t("StatusText: !statusText", {'!statusText': $.trim(xmlhttp.statusText)});
+  }
+  catch (e) {}
+
+  responseText = '';
+  // Again, we don't have a way to know for sure whether accessing
+  // xmlhttp.responseText is going to throw an exception. So we'll catch it.
+  try {
+    responseText = "\n" + Drupal.t("ResponseText: !responseText", {'!responseText': $.trim(xmlhttp.responseText) } );
+  } catch (e) {}
+
+  // Make the responseText more readable by stripping HTML tags and newlines.
+  responseText = responseText.replace(/<("[^"]*"|'[^']*'|[^'">])*>/gi,"");
+  responseText = responseText.replace(/[\n]+\s+/g,"\n");
+
+  // We don't need readyState except for status == 0.
+  readyStateText = xmlhttp.status == 0 ? ("\n" + Drupal.t("ReadyState: !readyState", {'!readyState': xmlhttp.readyState})) : "";
+
+  message = statusCode + pathText + statusText + responseText + readyStateText;
+  return message;
+};
+
+// Class indicating that JS is enabled; used for styling purpose.
+$('html').addClass('js');
+
+// 'js enabled' cookie.
+document.cookie = 'has_js=1; path=/';
+
+/**
+ * Additions to jQuery.support.
+ */
+$(function () {
+  /**
+   * Boolean indicating whether or not position:fixed is supported.
+   */
+  if (jQuery.support.positionFixed === undefined) {
+    var el = $('<div style="position:fixed; top:10px" />').appendTo(document.body);
+    jQuery.support.positionFixed = el[0].offsetTop === 10;
+    el.remove();
+  }
+});
+
+//Attach all behaviors.
+$(function () {
+  Drupal.attachBehaviors(document, Drupal.settings);
+});
+
+/**
+ * The default themes.
+ */
+Drupal.theme.prototype = {
+
+  /**
+   * Formats text for emphasized display in a placeholder inside a sentence.
+   *
+   * @param str
+   *   The text to format (plain-text).
+   * @return
+   *   The formatted text (html).
+   */
+  placeholder: function (str) {
+    return '<em class="placeholder">' + Drupal.checkPlain(str) + '</em>';
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/misc/druplicon.png b/htmltest/misc/druplicon.png
new file mode 100644
index 00000000..3b49a4ce
Binary files /dev/null and b/htmltest/misc/druplicon.png differ
diff --git a/htmltest/misc/farbtastic/farbtastic.css b/htmltest/misc/farbtastic/farbtastic.css
new file mode 100644
index 00000000..25a68ebf
--- /dev/null
+++ b/htmltest/misc/farbtastic/farbtastic.css
@@ -0,0 +1,36 @@
+
+.farbtastic {
+  position: relative;
+}
+.farbtastic * {
+  position: absolute;
+  cursor: crosshair;
+}
+.farbtastic,
+.farbtastic .wheel {
+  width: 195px;
+  height: 195px;
+}
+.farbtastic .color,
+.farbtastic .overlay {
+  top: 47px;
+  left: 47px;
+  width: 101px;
+  height: 101px;
+}
+.farbtastic .wheel {
+  background: url(wheel.png) no-repeat;
+  width: 195px;
+  height: 195px;
+}
+.farbtastic .overlay {
+  background: url(mask.png) no-repeat;
+}
+.farbtastic .marker {
+  width: 17px;
+  height: 17px;
+  margin: -8px 0 0 -8px;
+  overflow: hidden;
+  background: url(marker.png) no-repeat;
+}
+
diff --git a/htmltest/misc/farbtastic/farbtastic.js b/htmltest/misc/farbtastic/farbtastic.js
new file mode 100644
index 00000000..10c9e763
--- /dev/null
+++ b/htmltest/misc/farbtastic/farbtastic.js
@@ -0,0 +1,8 @@
+(function(e){e.fn.farbtastic=function(f){e.farbtastic(this,f);return this};e.farbtastic=function(f,l){f=e(f).get(0);return f.farbtastic||(f.farbtastic=new e._farbtastic(f,l))};e._farbtastic=function(f,l){var a=this;e(f).html('<div class="farbtastic"><div class="color"></div><div class="wheel"></div><div class="overlay"></div><div class="h-marker marker"></div><div class="sl-marker marker"></div></div>');var k=e(".farbtastic",f);a.wheel=e(".wheel",f).get(0);a.radius=84;a.square=100;a.width=194;navigator.appVersion.match(/MSIE [0-6]\./)&&
+e("*",k).each(function(){if(this.currentStyle.backgroundImage!="none"){var b=this.currentStyle.backgroundImage;b=this.currentStyle.backgroundImage.substring(5,b.length-2);e(this).css({backgroundImage:"none",filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='"+b+"')"})}});a.linkTo=function(b){typeof a.callback=="object"&&e(a.callback).unbind("keyup",a.updateValue);a.color=null;if(typeof b=="function")a.callback=b;else if(typeof b=="object"||typeof b=="string"){a.callback=
+e(b);a.callback.bind("keyup",a.updateValue);a.callback.get(0).value&&a.setColor(a.callback.get(0).value)}return this};a.updateValue=function(){this.value&&this.value!=a.color&&a.setColor(this.value)};a.setColor=function(b){var c=a.unpack(b);if(a.color!=b&&c){a.color=b;a.rgb=c;a.hsl=a.RGBToHSL(a.rgb);a.updateDisplay()}return this};a.setHSL=function(b){a.hsl=b;a.rgb=a.HSLToRGB(b);a.color=a.pack(a.rgb);a.updateDisplay();return this};a.widgetCoords=function(b){var c=e(a.wheel).offset();return{x:b.pageX-
+c.left-a.width/2,y:b.pageY-c.top-a.width/2}};a.mousedown=function(b){if(!document.dragging){e(document).bind("mousemove",a.mousemove).bind("mouseup",a.mouseup);document.dragging=true}var c=a.widgetCoords(b);a.circleDrag=Math.max(Math.abs(c.x),Math.abs(c.y))*2>a.square;a.mousemove(b);return false};a.mousemove=function(b){var c=a.widgetCoords(b);if(a.circleDrag){b=Math.atan2(c.x,-c.y)/6.28;if(b<0)b+=1;a.setHSL([b,a.hsl[1],a.hsl[2]])}else{b=Math.max(0,Math.min(1,-(c.x/a.square)+0.5));c=Math.max(0,Math.min(1,
+-(c.y/a.square)+0.5));a.setHSL([a.hsl[0],b,c])}return false};a.mouseup=function(){e(document).unbind("mousemove",a.mousemove);e(document).unbind("mouseup",a.mouseup);document.dragging=false};a.updateDisplay=function(){var b=a.hsl[0]*6.28;e(".h-marker",k).css({left:Math.round(Math.sin(b)*a.radius+a.width/2)+"px",top:Math.round(-Math.cos(b)*a.radius+a.width/2)+"px"});e(".sl-marker",k).css({left:Math.round(a.square*(0.5-a.hsl[1])+a.width/2)+"px",top:Math.round(a.square*(0.5-a.hsl[2])+a.width/2)+"px"});
+e(".color",k).css("backgroundColor",a.pack(a.HSLToRGB([a.hsl[0],1,0.5])));if(typeof a.callback=="object"){e(a.callback).css({backgroundColor:a.color,color:a.hsl[2]>0.5?"#000":"#fff"});e(a.callback).each(function(){if(this.value&&this.value!=a.color)this.value=a.color})}else typeof a.callback=="function"&&a.callback.call(a,a.color)};a.pack=function(b){var c=Math.round(b[0]*255),d=Math.round(b[1]*255);b=Math.round(b[2]*255);return"#"+(c<16?"0":"")+c.toString(16)+(d<16?"0":"")+d.toString(16)+(b<16?"0":
+"")+b.toString(16)};a.unpack=function(b){if(b.length==7)return[parseInt("0x"+b.substring(1,3))/255,parseInt("0x"+b.substring(3,5))/255,parseInt("0x"+b.substring(5,7))/255];else if(b.length==4)return[parseInt("0x"+b.substring(1,2))/15,parseInt("0x"+b.substring(2,3))/15,parseInt("0x"+b.substring(3,4))/15]};a.HSLToRGB=function(b){var c,d=b[0];c=b[1];b=b[2];c=b<=0.5?b*(c+1):b+c-b*c;b=b*2-c;return[this.hueToRGB(b,c,d+0.33333),this.hueToRGB(b,c,d),this.hueToRGB(b,c,d-0.33333)]};a.hueToRGB=function(b,c,
+d){d=d<0?d+1:d>1?d-1:d;if(d*6<1)return b+(c-b)*d*6;if(d*2<1)return c;if(d*3<2)return b+(c-b)*(0.66666-d)*6;return b};a.RGBToHSL=function(b){var c,d,m,g,h=b[0],i=b[1],j=b[2];c=Math.min(h,Math.min(i,j));b=Math.max(h,Math.max(i,j));d=b-c;g=(c+b)/2;m=0;if(g>0&&g<1)m=d/(g<0.5?2*g:2-2*g);c=0;if(d>0){if(b==h&&b!=i)c+=(i-j)/d;if(b==i&&b!=j)c+=2+(j-h)/d;if(b==j&&b!=h)c+=4+(h-i)/d;c/=6}return[c,m,g]};e("*",k).mousedown(a.mousedown);a.setColor("#000000");l&&a.linkTo(l)}})(jQuery);
diff --git a/htmltest/misc/farbtastic/marker.png b/htmltest/misc/farbtastic/marker.png
new file mode 100644
index 00000000..f9773d14
Binary files /dev/null and b/htmltest/misc/farbtastic/marker.png differ
diff --git a/htmltest/misc/farbtastic/mask.png b/htmltest/misc/farbtastic/mask.png
new file mode 100644
index 00000000..0fc9cbe6
Binary files /dev/null and b/htmltest/misc/farbtastic/mask.png differ
diff --git a/htmltest/misc/farbtastic/wheel.png b/htmltest/misc/farbtastic/wheel.png
new file mode 100644
index 00000000..4a905e9f
Binary files /dev/null and b/htmltest/misc/farbtastic/wheel.png differ
diff --git a/htmltest/misc/favicon.ico b/htmltest/misc/favicon.ico
new file mode 100644
index 00000000..3417ec24
Binary files /dev/null and b/htmltest/misc/favicon.ico differ
diff --git a/htmltest/misc/feed.png b/htmltest/misc/feed.png
new file mode 100644
index 00000000..e3f50677
Binary files /dev/null and b/htmltest/misc/feed.png differ
diff --git a/htmltest/misc/form.js b/htmltest/misc/form.js
new file mode 100644
index 00000000..259b84eb
--- /dev/null
+++ b/htmltest/misc/form.js
@@ -0,0 +1,78 @@
+(function ($) {
+
+/**
+ * Retrieves the summary for the first element.
+ */
+$.fn.drupalGetSummary = function () {
+  var callback = this.data('summaryCallback');
+  return (this[0] && callback) ? $.trim(callback(this[0])) : '';
+};
+
+/**
+ * Sets the summary for all matched elements.
+ *
+ * @param callback
+ *   Either a function that will be called each time the summary is
+ *   retrieved or a string (which is returned each time).
+ */
+$.fn.drupalSetSummary = function (callback) {
+  var self = this;
+
+  // To facilitate things, the callback should always be a function. If it's
+  // not, we wrap it into an anonymous function which just returns the value.
+  if (typeof callback != 'function') {
+    var val = callback;
+    callback = function () { return val; };
+  }
+
+  return this
+    .data('summaryCallback', callback)
+    // To prevent duplicate events, the handlers are first removed and then
+    // (re-)added.
+    .unbind('formUpdated.summary')
+    .bind('formUpdated.summary', function () {
+      self.trigger('summaryUpdated');
+    })
+    // The actual summaryUpdated handler doesn't fire when the callback is
+    // changed, so we have to do this manually.
+    .trigger('summaryUpdated');
+};
+
+/**
+ * Sends a 'formUpdated' event each time a form element is modified.
+ */
+Drupal.behaviors.formUpdated = {
+  attach: function (context) {
+    // These events are namespaced so that we can remove them later.
+    var events = 'change.formUpdated click.formUpdated blur.formUpdated keyup.formUpdated';
+    $(context)
+      // Since context could be an input element itself, it's added back to
+      // the jQuery object and filtered again.
+      .find(':input').andSelf().filter(':input')
+      // To prevent duplicate events, the handlers are first removed and then
+      // (re-)added.
+      .unbind(events).bind(events, function () {
+        $(this).trigger('formUpdated');
+      });
+  }
+};
+
+/**
+ * Prepopulate form fields with information from the visitor cookie.
+ */
+Drupal.behaviors.fillUserInfoFromCookie = {
+  attach: function (context, settings) {
+    $('form.user-info-from-cookie').once('user-info-from-cookie', function () {
+      var formContext = this;
+      $.each(['name', 'mail', 'homepage'], function () {
+        var $element = $('[name=' + this + ']', formContext);
+        var cookie = $.cookie('Drupal.visitor.' + this);
+        if ($element.length && cookie) {
+          $element.val(cookie);
+        }
+      });
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/misc/forum-icons.png b/htmltest/misc/forum-icons.png
new file mode 100644
index 00000000..e291de67
Binary files /dev/null and b/htmltest/misc/forum-icons.png differ
diff --git a/htmltest/misc/grippie.png b/htmltest/misc/grippie.png
new file mode 100644
index 00000000..fbd84316
Binary files /dev/null and b/htmltest/misc/grippie.png differ
diff --git a/htmltest/misc/help.png b/htmltest/misc/help.png
new file mode 100644
index 00000000..dcc5cac7
Binary files /dev/null and b/htmltest/misc/help.png differ
diff --git a/htmltest/misc/jquery.ba-bbq.js b/htmltest/misc/jquery.ba-bbq.js
new file mode 100644
index 00000000..deb9a2fa
--- /dev/null
+++ b/htmltest/misc/jquery.ba-bbq.js
@@ -0,0 +1,19 @@
+
+/*
+ * jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010
+ * http://benalman.com/projects/jquery-bbq-plugin/
+ *
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:""}}});return H};function z(H,F,G){if(F===i||typeof F==="boolean"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,""):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:"action",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!=="object"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||"").toLowerCase()]||"",K=J&&L.attr(J)||"";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?"":"#")};b.getState=u=function(F,G){return F===i||typeof F==="boolean"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K==="boolean"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this);
+/*
+ * jQuery hashchange event - v1.2 - 2/11/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ *
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,i,b){var j,k=$.event.special,c="location",d="hashchange",l="href",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e="on"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src="javascript:0"/>').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);
diff --git a/htmltest/misc/jquery.cookie.js b/htmltest/misc/jquery.cookie.js
new file mode 100644
index 00000000..79f514c2
--- /dev/null
+++ b/htmltest/misc/jquery.cookie.js
@@ -0,0 +1,11 @@
+
+/**
+ * Cookie plugin 1.0
+ *
+ * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ */
+jQuery.cookie=function(b,j,m){if(typeof j!="undefined"){m=m||{};if(j===null){j="";m.expires=-1}var e="";if(m.expires&&(typeof m.expires=="number"||m.expires.toUTCString)){var f;if(typeof m.expires=="number"){f=new Date();f.setTime(f.getTime()+(m.expires*24*60*60*1000))}else{f=m.expires}e="; expires="+f.toUTCString()}var l=m.path?"; path="+(m.path):"";var g=m.domain?"; domain="+(m.domain):"";var a=m.secure?"; secure":"";document.cookie=[b,"=",encodeURIComponent(j),e,l,g,a].join("")}else{var d=null;if(document.cookie&&document.cookie!=""){var k=document.cookie.split(";");for(var h=0;h<k.length;h++){var c=jQuery.trim(k[h]);if(c.substring(0,b.length+1)==(b+"=")){d=decodeURIComponent(c.substring(b.length+1));break}}}return d}};
diff --git a/htmltest/misc/jquery.form.js b/htmltest/misc/jquery.form.js
new file mode 100644
index 00000000..7a6f1b29
--- /dev/null
+++ b/htmltest/misc/jquery.form.js
@@ -0,0 +1,12 @@
+
+/*!
+ * jQuery Form Plugin
+ * version: 2.52 (07-DEC-2010)
+ * @requires jQuery v1.3.2 or later
+ *
+ * Examples and documentation at: http://malsup.com/jquery/form/
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ */
+;(function(b){function q(){if(b.fn.ajaxSubmit.debug){var a="[jquery.form] "+Array.prototype.join.call(arguments,"");if(window.console&&window.console.log)window.console.log(a);else window.opera&&window.opera.postError&&window.opera.postError(a)}}b.fn.ajaxSubmit=function(a){function f(){function t(){var o=i.attr("target"),m=i.attr("action");l.setAttribute("target",u);l.getAttribute("method")!="POST"&&l.setAttribute("method","POST");l.getAttribute("action")!=e.url&&l.setAttribute("action",e.url);e.skipEncodingOverride|| i.attr({encoding:"multipart/form-data",enctype:"multipart/form-data"});e.timeout&&setTimeout(function(){F=true;s()},e.timeout);var v=[];try{if(e.extraData)for(var w in e.extraData)v.push(b('<input type="hidden" name="'+w+'" value="'+e.extraData[w]+'" />').appendTo(l)[0]);r.appendTo("body");r.data("form-plugin-onload",s);l.submit()}finally{l.setAttribute("action",m);o?l.setAttribute("target",o):i.removeAttr("target");b(v).remove()}}function s(){if(!G){r.removeData("form-plugin-onload");var o=true; try{if(F)throw"timeout";p=x.contentWindow?x.contentWindow.document:x.contentDocument?x.contentDocument:x.document;var m=e.dataType=="xml"||p.XMLDocument||b.isXMLDoc(p);q("isXml="+m);if(!m&&window.opera&&(p.body==null||p.body.innerHTML==""))if(--K){q("requeing onLoad callback, DOM not available");setTimeout(s,250);return}G=true;j.responseText=p.documentElement?p.documentElement.innerHTML:null;j.responseXML=p.XMLDocument?p.XMLDocument:p;j.getResponseHeader=function(L){return{"content-type":e.dataType}[L]}; var v=/(json|script)/.test(e.dataType);if(v||e.textarea){var w=p.getElementsByTagName("textarea")[0];if(w)j.responseText=w.value;else if(v){var H=p.getElementsByTagName("pre")[0],I=p.getElementsByTagName("body")[0];if(H)j.responseText=H.textContent;else if(I)j.responseText=I.innerHTML}}else if(e.dataType=="xml"&&!j.responseXML&&j.responseText!=null)j.responseXML=C(j.responseText);J=b.httpData(j,e.dataType)}catch(D){q("error caught:",D);o=false;j.error=D;b.handleError(e,j,"error",D)}if(j.aborted){q("upload aborted"); o=false}if(o){e.success.call(e.context,J,"success",j);y&&b.event.trigger("ajaxSuccess",[j,e])}y&&b.event.trigger("ajaxComplete",[j,e]);y&&!--b.active&&b.event.trigger("ajaxStop");if(e.complete)e.complete.call(e.context,j,o?"success":"error");setTimeout(function(){r.removeData("form-plugin-onload");r.remove();j.responseXML=null},100)}}function C(o,m){if(window.ActiveXObject){m=new ActiveXObject("Microsoft.XMLDOM");m.async="false";m.loadXML(o)}else m=(new DOMParser).parseFromString(o,"text/xml");return m&& m.documentElement&&m.documentElement.tagName!="parsererror"?m:null}var l=i[0];if(b(":input[name=submit],:input[id=submit]",l).length)alert('Error: Form elements must not have name or id of "submit".');else{var e=b.extend(true,{},b.ajaxSettings,a);e.context=e.context||e;var u="jqFormIO"+(new Date).getTime(),E="_"+u;window[E]=function(){var o=r.data("form-plugin-onload");if(o){o();window[E]=undefined;try{delete window[E]}catch(m){}}};var r=b('<iframe id="'+u+'" name="'+u+'" src="'+e.iframeSrc+'" onload="window[\'_\'+this.id]()" />'), x=r[0];r.css({position:"absolute",top:"-1000px",left:"-1000px"});var j={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(){this.aborted=1;r.attr("src",e.iframeSrc)}},y=e.global;y&&!b.active++&&b.event.trigger("ajaxStart");y&&b.event.trigger("ajaxSend",[j,e]);if(e.beforeSend&&e.beforeSend.call(e.context,j,e)===false)e.global&&b.active--;else if(!j.aborted){var G=false, F=0,z=l.clk;if(z){var A=z.name;if(A&&!z.disabled){e.extraData=e.extraData||{};e.extraData[A]=z.value;if(z.type=="image"){e.extraData[A+".x"]=l.clk_x;e.extraData[A+".y"]=l.clk_y}}}e.forceSync?t():setTimeout(t,10);var J,p,K=50}}}if(!this.length){q("ajaxSubmit: skipping submit process - no element selected");return this}if(typeof a=="function")a={success:a};var d=this.attr("action");if(d=typeof d==="string"?b.trim(d):"")d=(d.match(/^([^#]+)/)||[])[1];d=d||window.location.href||"";a=b.extend(true,{url:d, type:this.attr("method")||"GET",iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},a);d={};this.trigger("form-pre-serialize",[this,a,d]);if(d.veto){q("ajaxSubmit: submit vetoed via form-pre-serialize trigger");return this}if(a.beforeSerialize&&a.beforeSerialize(this,a)===false){q("ajaxSubmit: submit aborted via beforeSerialize callback");return this}var c,h,g=this.formToArray(a.semantic);if(a.data){a.extraData=a.data;for(c in a.data)if(a.data[c]instanceof Array)for(var k in a.data[c])g.push({name:c, value:a.data[c][k]});else{h=a.data[c];h=b.isFunction(h)?h():h;g.push({name:c,value:h})}}if(a.beforeSubmit&&a.beforeSubmit(g,this,a)===false){q("ajaxSubmit: submit aborted via beforeSubmit callback");return this}this.trigger("form-submit-validate",[g,this,a,d]);if(d.veto){q("ajaxSubmit: submit vetoed via form-submit-validate trigger");return this}c=b.param(g);if(a.type.toUpperCase()=="GET"){a.url+=(a.url.indexOf("?")>=0?"&":"?")+c;a.data=null}else a.data=c;var i=this,n=[];a.resetForm&&n.push(function(){i.resetForm()}); a.clearForm&&n.push(function(){i.clearForm()});if(!a.dataType&&a.target){var B=a.success||function(){};n.push(function(t){var s=a.replaceTarget?"replaceWith":"html";b(a.target)[s](t).each(B,arguments)})}else a.success&&n.push(a.success);a.success=function(t,s,C){for(var l=a.context||a,e=0,u=n.length;e<u;e++)n[e].apply(l,[t,s,C||i,i])};c=b("input:file",this).length>0;k=i.attr("enctype")=="multipart/form-data"||i.attr("encoding")=="multipart/form-data";if(a.iframe!==false&&(c||a.iframe||k))a.closeKeepAlive? b.get(a.closeKeepAlive,f):f();else b.ajax(a);this.trigger("form-submit-notify",[this,a]);return this};b.fn.ajaxForm=function(a){if(this.length===0){var f={s:this.selector,c:this.context};if(!b.isReady&&f.s){q("DOM not ready, queuing ajaxForm");b(function(){b(f.s,f.c).ajaxForm(a)});return this}q("terminating; zero elements found by selector"+(b.isReady?"":" (DOM not ready)"));return this}return this.ajaxFormUnbind().bind("submit.form-plugin",function(d){if(!d.isDefaultPrevented()){d.preventDefault(); b(this).ajaxSubmit(a)}}).bind("click.form-plugin",function(d){var c=d.target,h=b(c);if(!h.is(":submit,input:image")){c=h.closest(":submit");if(c.length==0)return;c=c[0]}var g=this;g.clk=c;if(c.type=="image")if(d.offsetX!=undefined){g.clk_x=d.offsetX;g.clk_y=d.offsetY}else if(typeof b.fn.offset=="function"){h=h.offset();g.clk_x=d.pageX-h.left;g.clk_y=d.pageY-h.top}else{g.clk_x=d.pageX-c.offsetLeft;g.clk_y=d.pageY-c.offsetTop}setTimeout(function(){g.clk=g.clk_x=g.clk_y=null},100)})};b.fn.ajaxFormUnbind= function(){return this.unbind("submit.form-plugin click.form-plugin")};b.fn.formToArray=function(a){var f=[];if(this.length===0)return f;var d=this[0],c=a?d.getElementsByTagName("*"):d.elements;if(!c)return f;var h,g,k,i,n,B;h=0;for(n=c.length;h<n;h++){g=c[h];if(k=g.name)if(a&&d.clk&&g.type=="image"){if(!g.disabled&&d.clk==g){f.push({name:k,value:b(g).val()});f.push({name:k+".x",value:d.clk_x},{name:k+".y",value:d.clk_y})}}else if((i=b.fieldValue(g,true))&&i.constructor==Array){g=0;for(B=i.length;g< B;g++)f.push({name:k,value:i[g]})}else i!==null&&typeof i!="undefined"&&f.push({name:k,value:i})}if(!a&&d.clk){a=b(d.clk);c=a[0];if((k=c.name)&&!c.disabled&&c.type=="image"){f.push({name:k,value:a.val()});f.push({name:k+".x",value:d.clk_x},{name:k+".y",value:d.clk_y})}}return f};b.fn.formSerialize=function(a){return b.param(this.formToArray(a))};b.fn.fieldSerialize=function(a){var f=[];this.each(function(){var d=this.name;if(d){var c=b.fieldValue(this,a);if(c&&c.constructor==Array)for(var h=0,g=c.length;h< g;h++)f.push({name:d,value:c[h]});else c!==null&&typeof c!="undefined"&&f.push({name:this.name,value:c})}});return b.param(f)};b.fn.fieldValue=function(a){for(var f=[],d=0,c=this.length;d<c;d++){var h=b.fieldValue(this[d],a);h===null||typeof h=="undefined"||h.constructor==Array&&!h.length||(h.constructor==Array?b.merge(f,h):f.push(h))}return f};b.fieldValue=function(a,f){var d=a.name,c=a.type,h=a.tagName.toLowerCase();if(f===undefined)f=true;if(f&&(!d||a.disabled||c=="reset"||c=="button"||(c=="checkbox"|| c=="radio")&&!a.checked||(c=="submit"||c=="image")&&a.form&&a.form.clk!=a||h=="select"&&a.selectedIndex==-1))return null;if(h=="select"){var g=a.selectedIndex;if(g<0)return null;d=[];h=a.options;var k=(c=c=="select-one")?g+1:h.length;for(g=c?g:0;g<k;g++){var i=h[g];if(i.selected){var n=i.value;n||(n=i.attributes&&i.attributes.value&&!i.attributes.value.specified?i.text:i.value);if(c)return n;d.push(n)}}return d}return b(a).val()};b.fn.clearForm=function(){return this.each(function(){b("input,select,textarea", this).clearFields()})};b.fn.clearFields=b.fn.clearInputs=function(){return this.each(function(){var a=this.type,f=this.tagName.toLowerCase();if(a=="text"||a=="password"||f=="textarea")this.value="";else if(a=="checkbox"||a=="radio")this.checked=false;else if(f=="select")this.selectedIndex=-1})};b.fn.resetForm=function(){return this.each(function(){if(typeof this.reset=="function"||typeof this.reset=="object"&&!this.reset.nodeType)this.reset()})};b.fn.enable=function(a){if(a===undefined)a=true;return this.each(function(){this.disabled= !a})};b.fn.selected=function(a){if(a===undefined)a=true;return this.each(function(){var f=this.type;if(f=="checkbox"||f=="radio")this.checked=a;else if(this.tagName.toLowerCase()=="option"){f=b(this).parent("select");a&&f[0]&&f[0].type=="select-one"&&f.find("option").selected(false);this.selected=a}})}})(jQuery);
\ No newline at end of file
diff --git a/htmltest/misc/jquery.js b/htmltest/misc/jquery.js
new file mode 100644
index 00000000..e900c19a
--- /dev/null
+++ b/htmltest/misc/jquery.js
@@ -0,0 +1,168 @@
+
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
+h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
+h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
+"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
+e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
+"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
+s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
+j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
+toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
+-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
+if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
+if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
+b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
+!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
+l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
+z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
+s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
+s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
+[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
+false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
+k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
+scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
+1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
+"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
+c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
+else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
+a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
+c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
+a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
+colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
+1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
+l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
+"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
+if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
+a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
+attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
+b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
+c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
+arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
+d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
+c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
+w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
+8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
+"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
+Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
+c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
+var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
+"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
+xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
+B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
+"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
+0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
+a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
+1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
+"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
+c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
+(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
+[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
+break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
+q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
+l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
+return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
+B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
+POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
+i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
+i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
+"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
+m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
+true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
+g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
+0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
+"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
+i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
+if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
+g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
+for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
+i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
+n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
+function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
+p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
+t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
+function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
+c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
+not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
+h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
+c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
+2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
+b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
+e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
+"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
+else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
+c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
+b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
+this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
+prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
+b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
+1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
+d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
+jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
+zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
+h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
+if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
+d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
+e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
+"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
+!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
+getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
+script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
+!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
+false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
+A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
+b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
+c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
+c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
+encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
+[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
+e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
+if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
+3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
+d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
+d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
+"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
+1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
+d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
+Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
+var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
+this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
+this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
+c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
+b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
+h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
+for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
+parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
+height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
+f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
+"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
+e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
+c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
+c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
+b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);
diff --git a/htmltest/misc/jquery.once.js b/htmltest/misc/jquery.once.js
new file mode 100644
index 00000000..506fb486
--- /dev/null
+++ b/htmltest/misc/jquery.once.js
@@ -0,0 +1,79 @@
+
+/**
+ * jQuery Once Plugin v1.2
+ * http://plugins.jquery.com/project/once
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ */
+
+(function ($) {
+  var cache = {}, uuid = 0;
+
+  /**
+   * Filters elements by whether they have not yet been processed.
+   *
+   * @param id
+   *   (Optional) If this is a string, then it will be used as the CSS class
+   *   name that is applied to the elements for determining whether it has
+   *   already been processed. The elements will get a class in the form of
+   *   "id-processed".
+   *
+   *   If the id parameter is a function, it will be passed off to the fn
+   *   parameter and the id will become a unique identifier, represented as a
+   *   number.
+   *
+   *   When the id is neither a string or a function, it becomes a unique
+   *   identifier, depicted as a number. The element's class will then be
+   *   represented in the form of "jquery-once-#-processed".
+   *
+   *   Take note that the id must be valid for usage as an element's class name.
+   * @param fn
+   *   (Optional) If given, this function will be called for each element that
+   *   has not yet been processed. The function's return value follows the same
+   *   logic as $.each(). Returning true will continue to the next matched
+   *   element in the set, while returning false will entirely break the
+   *   iteration.
+   */
+  $.fn.once = function (id, fn) {
+    if (typeof id != 'string') {
+      // Generate a numeric ID if the id passed can't be used as a CSS class.
+      if (!(id in cache)) {
+        cache[id] = ++uuid;
+      }
+      // When the fn parameter is not passed, we interpret it from the id.
+      if (!fn) {
+        fn = id;
+      }
+      id = 'jquery-once-' + cache[id];
+    }
+    // Remove elements from the set that have already been processed.
+    var name = id + '-processed';
+    var elements = this.not('.' + name).addClass(name);
+
+    return $.isFunction(fn) ? elements.each(fn) : elements;
+  };
+
+  /**
+   * Filters elements that have been processed once already.
+   *
+   * @param id
+   *   A required string representing the name of the class which should be used
+   *   when filtering the elements. This only filters elements that have already
+   *   been processed by the once function. The id should be the same id that
+   *   was originally passed to the once() function.
+   * @param fn
+   *   (Optional) If given, this function will be called for each element that
+   *   has not yet been processed. The function's return value follows the same
+   *   logic as $.each(). Returning true will continue to the next matched
+   *   element in the set, while returning false will entirely break the
+   *   iteration.
+   */
+  $.fn.removeOnce = function (id, fn) {
+    var name = id + '-processed';
+    var elements = this.filter('.' + name).removeClass(name);
+
+    return $.isFunction(fn) ? elements.each(fn) : elements;
+  };
+})(jQuery);
diff --git a/htmltest/misc/machine-name.js b/htmltest/misc/machine-name.js
new file mode 100644
index 00000000..4678e0b5
--- /dev/null
+++ b/htmltest/misc/machine-name.js
@@ -0,0 +1,127 @@
+(function ($) {
+
+/**
+ * Attach the machine-readable name form element behavior.
+ */
+Drupal.behaviors.machineName = {
+  /**
+   * Attaches the behavior.
+   *
+   * @param settings.machineName
+   *   A list of elements to process, keyed by the HTML ID of the form element
+   *   containing the human-readable value. Each element is an object defining
+   *   the following properties:
+   *   - target: The HTML ID of the machine name form element.
+   *   - suffix: The HTML ID of a container to show the machine name preview in
+   *     (usually a field suffix after the human-readable name form element).
+   *   - label: The label to show for the machine name preview.
+   *   - replace_pattern: A regular expression (without modifiers) matching
+   *     disallowed characters in the machine name; e.g., '[^a-z0-9]+'.
+   *   - replace: A character to replace disallowed characters with; e.g., '_'
+   *     or '-'.
+   *   - standalone: Whether the preview should stay in its own element rather
+   *     than the suffix of the source element.
+   *   - field_prefix: The #field_prefix of the form element.
+   *   - field_suffix: The #field_suffix of the form element.
+   */
+  attach: function (context, settings) {
+    var self = this;
+    $.each(settings.machineName, function (source_id, options) {
+      var $source = $(source_id, context).addClass('machine-name-source');
+      var $target = $(options.target, context).addClass('machine-name-target');
+      var $suffix = $(options.suffix, context);
+      var $wrapper = $target.closest('.form-item');
+      // All elements have to exist.
+      if (!$source.length || !$target.length || !$suffix.length || !$wrapper.length) {
+        return;
+      }
+      // Skip processing upon a form validation error on the machine name.
+      if ($target.hasClass('error')) {
+        return;
+      }
+      // Figure out the maximum length for the machine name.
+      options.maxlength = $target.attr('maxlength');
+      // Hide the form item container of the machine name form element.
+      $wrapper.hide();
+      // Determine the initial machine name value. Unless the machine name form
+      // element is disabled or not empty, the initial default value is based on
+      // the human-readable form element value.
+      if ($target.is(':disabled') || $target.val() != '') {
+        var machine = $target.val();
+      }
+      else {
+        var machine = self.transliterate($source.val(), options);
+      }
+      // Append the machine name preview to the source field.
+      var $preview = $('<span class="machine-name-value">' + options.field_prefix + Drupal.checkPlain(machine) + options.field_suffix + '</span>');
+      $suffix.empty();
+      if (options.label) {
+        $suffix.append(' ').append('<span class="machine-name-label">' + options.label + ':</span>');
+      }
+      $suffix.append(' ').append($preview);
+
+      // If the machine name cannot be edited, stop further processing.
+      if ($target.is(':disabled')) {
+        return;
+      }
+
+      // If it is editable, append an edit link.
+      var $link = $('<span class="admin-link"><a href="#">' + Drupal.t('Edit') + '</a></span>')
+        .click(function () {
+          $wrapper.show();
+          $target.focus();
+          $suffix.hide();
+          $source.unbind('.machineName');
+          return false;
+        });
+      $suffix.append(' ').append($link);
+
+      // Preview the machine name in realtime when the human-readable name
+      // changes, but only if there is no machine name yet; i.e., only upon
+      // initial creation, not when editing.
+      if ($target.val() == '') {
+        $source.bind('keyup.machineName change.machineName input.machineName', function () {
+          machine = self.transliterate($(this).val(), options);
+          // Set the machine name to the transliterated value.
+          if (machine != '') {
+            if (machine != options.replace) {
+              $target.val(machine);
+              $preview.html(options.field_prefix + Drupal.checkPlain(machine) + options.field_suffix);
+            }
+            $suffix.show();
+          }
+          else {
+            $suffix.hide();
+            $target.val(machine);
+            $preview.empty();
+          }
+        });
+        // Initialize machine name preview.
+        $source.keyup();
+      }
+    });
+  },
+
+  /**
+   * Transliterate a human-readable name to a machine name.
+   *
+   * @param source
+   *   A string to transliterate.
+   * @param settings
+   *   The machine name settings for the corresponding field, containing:
+   *   - replace_pattern: A regular expression (without modifiers) matching
+   *     disallowed characters in the machine name; e.g., '[^a-z0-9]+'.
+   *   - replace: A character to replace disallowed characters with; e.g., '_'
+   *     or '-'.
+   *   - maxlength: The maximum length of the machine name.
+   *
+   * @return
+   *   The transliterated source string.
+   */
+  transliterate: function (source, settings) {
+    var rx = new RegExp(settings.replace_pattern, 'g');
+    return source.toLowerCase().replace(rx, settings.replace).substr(0, settings.maxlength);
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/misc/menu-collapsed-rtl.png b/htmltest/misc/menu-collapsed-rtl.png
new file mode 100644
index 00000000..dc8d0b88
Binary files /dev/null and b/htmltest/misc/menu-collapsed-rtl.png differ
diff --git a/htmltest/misc/menu-collapsed.png b/htmltest/misc/menu-collapsed.png
new file mode 100644
index 00000000..91f3fd40
Binary files /dev/null and b/htmltest/misc/menu-collapsed.png differ
diff --git a/htmltest/misc/menu-expanded.png b/htmltest/misc/menu-expanded.png
new file mode 100644
index 00000000..46f39ecb
Binary files /dev/null and b/htmltest/misc/menu-expanded.png differ
diff --git a/htmltest/misc/menu-leaf.png b/htmltest/misc/menu-leaf.png
new file mode 100644
index 00000000..6b2d63f9
Binary files /dev/null and b/htmltest/misc/menu-leaf.png differ
diff --git a/htmltest/misc/message-16-error.png b/htmltest/misc/message-16-error.png
new file mode 100644
index 00000000..486390c9
Binary files /dev/null and b/htmltest/misc/message-16-error.png differ
diff --git a/htmltest/misc/message-16-help.png b/htmltest/misc/message-16-help.png
new file mode 100644
index 00000000..fc44326e
Binary files /dev/null and b/htmltest/misc/message-16-help.png differ
diff --git a/htmltest/misc/message-16-info.png b/htmltest/misc/message-16-info.png
new file mode 100644
index 00000000..f47924fc
Binary files /dev/null and b/htmltest/misc/message-16-info.png differ
diff --git a/htmltest/misc/message-16-ok.png b/htmltest/misc/message-16-ok.png
new file mode 100644
index 00000000..9edebe6b
Binary files /dev/null and b/htmltest/misc/message-16-ok.png differ
diff --git a/htmltest/misc/message-16-warning.png b/htmltest/misc/message-16-warning.png
new file mode 100644
index 00000000..ffc43177
Binary files /dev/null and b/htmltest/misc/message-16-warning.png differ
diff --git a/htmltest/misc/message-24-error.png b/htmltest/misc/message-24-error.png
new file mode 100644
index 00000000..b0941806
Binary files /dev/null and b/htmltest/misc/message-24-error.png differ
diff --git a/htmltest/misc/message-24-help.png b/htmltest/misc/message-24-help.png
new file mode 100644
index 00000000..66b89cee
Binary files /dev/null and b/htmltest/misc/message-24-help.png differ
diff --git a/htmltest/misc/message-24-info.png b/htmltest/misc/message-24-info.png
new file mode 100644
index 00000000..be599cab
Binary files /dev/null and b/htmltest/misc/message-24-info.png differ
diff --git a/htmltest/misc/message-24-ok.png b/htmltest/misc/message-24-ok.png
new file mode 100644
index 00000000..bd366693
Binary files /dev/null and b/htmltest/misc/message-24-ok.png differ
diff --git a/htmltest/misc/message-24-warning.png b/htmltest/misc/message-24-warning.png
new file mode 100644
index 00000000..183297d8
Binary files /dev/null and b/htmltest/misc/message-24-warning.png differ
diff --git a/htmltest/misc/permissions.png b/htmltest/misc/permissions.png
new file mode 100644
index 00000000..62147113
Binary files /dev/null and b/htmltest/misc/permissions.png differ
diff --git a/htmltest/misc/powered-black-135x42.png b/htmltest/misc/powered-black-135x42.png
new file mode 100644
index 00000000..1ac2a871
Binary files /dev/null and b/htmltest/misc/powered-black-135x42.png differ
diff --git a/htmltest/misc/powered-black-80x15.png b/htmltest/misc/powered-black-80x15.png
new file mode 100644
index 00000000..e76fa038
Binary files /dev/null and b/htmltest/misc/powered-black-80x15.png differ
diff --git a/htmltest/misc/powered-black-88x31.png b/htmltest/misc/powered-black-88x31.png
new file mode 100644
index 00000000..3adaa4f4
Binary files /dev/null and b/htmltest/misc/powered-black-88x31.png differ
diff --git a/htmltest/misc/powered-blue-135x42.png b/htmltest/misc/powered-blue-135x42.png
new file mode 100644
index 00000000..21e05210
Binary files /dev/null and b/htmltest/misc/powered-blue-135x42.png differ
diff --git a/htmltest/misc/powered-blue-80x15.png b/htmltest/misc/powered-blue-80x15.png
new file mode 100644
index 00000000..28f8bc58
Binary files /dev/null and b/htmltest/misc/powered-blue-80x15.png differ
diff --git a/htmltest/misc/powered-blue-88x31.png b/htmltest/misc/powered-blue-88x31.png
new file mode 100644
index 00000000..e6e30865
Binary files /dev/null and b/htmltest/misc/powered-blue-88x31.png differ
diff --git a/htmltest/misc/powered-gray-135x42.png b/htmltest/misc/powered-gray-135x42.png
new file mode 100644
index 00000000..7bbfcc6b
Binary files /dev/null and b/htmltest/misc/powered-gray-135x42.png differ
diff --git a/htmltest/misc/powered-gray-80x15.png b/htmltest/misc/powered-gray-80x15.png
new file mode 100644
index 00000000..80808ad5
Binary files /dev/null and b/htmltest/misc/powered-gray-80x15.png differ
diff --git a/htmltest/misc/powered-gray-88x31.png b/htmltest/misc/powered-gray-88x31.png
new file mode 100644
index 00000000..a618d830
Binary files /dev/null and b/htmltest/misc/powered-gray-88x31.png differ
diff --git a/htmltest/misc/print-rtl.css b/htmltest/misc/print-rtl.css
new file mode 100644
index 00000000..f99287a5
--- /dev/null
+++ b/htmltest/misc/print-rtl.css
@@ -0,0 +1,7 @@
+
+body {
+  direction: rtl;
+}
+th {
+  text-align: right;
+}
diff --git a/htmltest/misc/print.css b/htmltest/misc/print.css
new file mode 100644
index 00000000..0a56ef13
--- /dev/null
+++ b/htmltest/misc/print.css
@@ -0,0 +1,25 @@
+
+body {
+  margin: 1em;
+  background-color: #fff;
+}
+th {
+  text-align: left; /* LTR */
+  color: #006;
+  border-bottom: 1px solid #ccc;
+}
+tr.odd {
+  background-color: #ddd;
+}
+tr.even {
+  background-color: #fff;
+}
+td {
+  padding: 5px;
+}
+#menu {
+  visibility: hidden;
+}
+#main {
+  margin: 1em;
+}
diff --git a/htmltest/misc/progress.gif b/htmltest/misc/progress.gif
new file mode 100644
index 00000000..f84a9de5
Binary files /dev/null and b/htmltest/misc/progress.gif differ
diff --git a/htmltest/misc/progress.js b/htmltest/misc/progress.js
new file mode 100644
index 00000000..822666af
--- /dev/null
+++ b/htmltest/misc/progress.js
@@ -0,0 +1,106 @@
+(function ($) {
+
+/**
+ * A progressbar object. Initialized with the given id. Must be inserted into
+ * the DOM afterwards through progressBar.element.
+ *
+ * method is the function which will perform the HTTP request to get the
+ * progress bar state. Either "GET" or "POST".
+ *
+ * e.g. pb = new progressBar('myProgressBar');
+ *      some_element.appendChild(pb.element);
+ */
+Drupal.progressBar = function (id, updateCallback, method, errorCallback) {
+  var pb = this;
+  this.id = id;
+  this.method = method || 'GET';
+  this.updateCallback = updateCallback;
+  this.errorCallback = errorCallback;
+
+  // The WAI-ARIA setting aria-live="polite" will announce changes after users
+  // have completed their current activity and not interrupt the screen reader.
+  this.element = $('<div class="progress" aria-live="polite"></div>').attr('id', id);
+  this.element.html('<div class="bar"><div class="filled"></div></div>' +
+                    '<div class="percentage"></div>' +
+                    '<div class="message">&nbsp;</div>');
+};
+
+/**
+ * Set the percentage and status message for the progressbar.
+ */
+Drupal.progressBar.prototype.setProgress = function (percentage, message) {
+  if (percentage >= 0 && percentage <= 100) {
+    $('div.filled', this.element).css('width', percentage + '%');
+    $('div.percentage', this.element).html(percentage + '%');
+  }
+  $('div.message', this.element).html(message);
+  if (this.updateCallback) {
+    this.updateCallback(percentage, message, this);
+  }
+};
+
+/**
+ * Start monitoring progress via Ajax.
+ */
+Drupal.progressBar.prototype.startMonitoring = function (uri, delay) {
+  this.delay = delay;
+  this.uri = uri;
+  this.sendPing();
+};
+
+/**
+ * Stop monitoring progress via Ajax.
+ */
+Drupal.progressBar.prototype.stopMonitoring = function () {
+  clearTimeout(this.timer);
+  // This allows monitoring to be stopped from within the callback.
+  this.uri = null;
+};
+
+/**
+ * Request progress data from server.
+ */
+Drupal.progressBar.prototype.sendPing = function () {
+  if (this.timer) {
+    clearTimeout(this.timer);
+  }
+  if (this.uri) {
+    var pb = this;
+    // When doing a post request, you need non-null data. Otherwise a
+    // HTTP 411 or HTTP 406 (with Apache mod_security) error may result.
+    $.ajax({
+      type: this.method,
+      url: this.uri,
+      data: '',
+      dataType: 'json',
+      success: function (progress) {
+        // Display errors.
+        if (progress.status == 0) {
+          pb.displayError(progress.data);
+          return;
+        }
+        // Update display.
+        pb.setProgress(progress.percentage, progress.message);
+        // Schedule next timer.
+        pb.timer = setTimeout(function () { pb.sendPing(); }, pb.delay);
+      },
+      error: function (xmlhttp) {
+        pb.displayError(Drupal.ajaxError(xmlhttp, pb.uri));
+      }
+    });
+  }
+};
+
+/**
+ * Display errors on the page.
+ */
+Drupal.progressBar.prototype.displayError = function (string) {
+  var error = $('<div class="messages error"></div>').html(string);
+  $(this.element).before(error).hide();
+
+  if (this.errorCallback) {
+    this.errorCallback(this);
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/misc/states.js b/htmltest/misc/states.js
new file mode 100644
index 00000000..6d98da81
--- /dev/null
+++ b/htmltest/misc/states.js
@@ -0,0 +1,544 @@
+(function ($) {
+
+/**
+ * The base States namespace.
+ *
+ * Having the local states variable allows us to use the States namespace
+ * without having to always declare "Drupal.states".
+ */
+var states = Drupal.states = {
+  // An array of functions that should be postponed.
+  postponed: []
+};
+
+/**
+ * Attaches the states.
+ */
+Drupal.behaviors.states = {
+  attach: function (context, settings) {
+    var $context = $(context);
+    for (var selector in settings.states) {
+      for (var state in settings.states[selector]) {
+        new states.Dependent({
+          element: $context.find(selector),
+          state: states.State.sanitize(state),
+          constraints: settings.states[selector][state]
+        });
+      }
+    }
+
+    // Execute all postponed functions now.
+    while (states.postponed.length) {
+      (states.postponed.shift())();
+    }
+  }
+};
+
+/**
+ * Object representing an element that depends on other elements.
+ *
+ * @param args
+ *   Object with the following keys (all of which are required):
+ *   - element: A jQuery object of the dependent element
+ *   - state: A State object describing the state that is dependent
+ *   - constraints: An object with dependency specifications. Lists all elements
+ *     that this element depends on. It can be nested and can contain arbitrary
+ *     AND and OR clauses.
+ */
+states.Dependent = function (args) {
+  $.extend(this, { values: {}, oldValue: null }, args);
+
+  this.dependees = this.getDependees();
+  for (var selector in this.dependees) {
+    this.initializeDependee(selector, this.dependees[selector]);
+  }
+};
+
+/**
+ * Comparison functions for comparing the value of an element with the
+ * specification from the dependency settings. If the object type can't be
+ * found in this list, the === operator is used by default.
+ */
+states.Dependent.comparisons = {
+  'RegExp': function (reference, value) {
+    return reference.test(value);
+  },
+  'Function': function (reference, value) {
+    // The "reference" variable is a comparison function.
+    return reference(value);
+  },
+  'Number': function (reference, value) {
+    // If "reference" is a number and "value" is a string, then cast reference
+    // as a string before applying the strict comparison in compare(). Otherwise
+    // numeric keys in the form's #states array fail to match string values
+    // returned from jQuery's val().
+    return (typeof value === 'string') ? compare(reference.toString(), value) : compare(reference, value);
+  }
+};
+
+states.Dependent.prototype = {
+  /**
+   * Initializes one of the elements this dependent depends on.
+   *
+   * @param selector
+   *   The CSS selector describing the dependee.
+   * @param dependeeStates
+   *   The list of states that have to be monitored for tracking the
+   *   dependee's compliance status.
+   */
+  initializeDependee: function (selector, dependeeStates) {
+    var state;
+
+    // Cache for the states of this dependee.
+    this.values[selector] = {};
+
+    for (var i in dependeeStates) {
+      if (dependeeStates.hasOwnProperty(i)) {
+        state = dependeeStates[i];
+        // Make sure we're not initializing this selector/state combination twice.
+        if ($.inArray(state, dependeeStates) === -1) {
+          continue;
+        }
+
+        state = states.State.sanitize(state);
+
+        // Initialize the value of this state.
+        this.values[selector][state.name] = null;
+
+        // Monitor state changes of the specified state for this dependee.
+        $(selector).bind('state:' + state, $.proxy(function (e) {
+          this.update(selector, state, e.value);
+        }, this));
+
+        // Make sure the event we just bound ourselves to is actually fired.
+        new states.Trigger({ selector: selector, state: state });
+      }
+    }
+  },
+
+  /**
+   * Compares a value with a reference value.
+   *
+   * @param reference
+   *   The value used for reference.
+   * @param selector
+   *   CSS selector describing the dependee.
+   * @param state
+   *   A State object describing the dependee's updated state.
+   *
+   * @return
+   *   true or false.
+   */
+  compare: function (reference, selector, state) {
+    var value = this.values[selector][state.name];
+    if (reference.constructor.name in states.Dependent.comparisons) {
+      // Use a custom compare function for certain reference value types.
+      return states.Dependent.comparisons[reference.constructor.name](reference, value);
+    }
+    else {
+      // Do a plain comparison otherwise.
+      return compare(reference, value);
+    }
+  },
+
+  /**
+   * Update the value of a dependee's state.
+   *
+   * @param selector
+   *   CSS selector describing the dependee.
+   * @param state
+   *   A State object describing the dependee's updated state.
+   * @param value
+   *   The new value for the dependee's updated state.
+   */
+  update: function (selector, state, value) {
+    // Only act when the 'new' value is actually new.
+    if (value !== this.values[selector][state.name]) {
+      this.values[selector][state.name] = value;
+      this.reevaluate();
+    }
+  },
+
+  /**
+   * Triggers change events in case a state changed.
+   */
+  reevaluate: function () {
+    // Check whether any constraint for this dependent state is satisifed.
+    var value = this.verifyConstraints(this.constraints);
+
+    // Only invoke a state change event when the value actually changed.
+    if (value !== this.oldValue) {
+      // Store the new value so that we can compare later whether the value
+      // actually changed.
+      this.oldValue = value;
+
+      // Normalize the value to match the normalized state name.
+      value = invert(value, this.state.invert);
+
+      // By adding "trigger: true", we ensure that state changes don't go into
+      // infinite loops.
+      this.element.trigger({ type: 'state:' + this.state, value: value, trigger: true });
+    }
+  },
+
+  /**
+   * Evaluates child constraints to determine if a constraint is satisfied.
+   *
+   * @param constraints
+   *   A constraint object or an array of constraints.
+   * @param selector
+   *   The selector for these constraints. If undefined, there isn't yet a
+   *   selector that these constraints apply to. In that case, the keys of the
+   *   object are interpreted as the selector if encountered.
+   *
+   * @return
+   *   true or false, depending on whether these constraints are satisfied.
+   */
+  verifyConstraints: function(constraints, selector) {
+    var result;
+    if ($.isArray(constraints)) {
+      // This constraint is an array (OR or XOR).
+      var hasXor = $.inArray('xor', constraints) === -1;
+      for (var i = 0, len = constraints.length; i < len; i++) {
+        if (constraints[i] != 'xor') {
+          var constraint = this.checkConstraints(constraints[i], selector, i);
+          // Return if this is OR and we have a satisfied constraint or if this
+          // is XOR and we have a second satisfied constraint.
+          if (constraint && (hasXor || result)) {
+            return hasXor;
+          }
+          result = result || constraint;
+        }
+      }
+    }
+    // Make sure we don't try to iterate over things other than objects. This
+    // shouldn't normally occur, but in case the condition definition is bogus,
+    // we don't want to end up with an infinite loop.
+    else if ($.isPlainObject(constraints)) {
+      // This constraint is an object (AND).
+      for (var n in constraints) {
+        if (constraints.hasOwnProperty(n)) {
+          result = ternary(result, this.checkConstraints(constraints[n], selector, n));
+          // False and anything else will evaluate to false, so return when any
+          // false condition is found.
+          if (result === false) { return false; }
+        }
+      }
+    }
+    return result;
+  },
+
+  /**
+   * Checks whether the value matches the requirements for this constraint.
+   *
+   * @param value
+   *   Either the value of a state or an array/object of constraints. In the
+   *   latter case, resolving the constraint continues.
+   * @param selector
+   *   The selector for this constraint. If undefined, there isn't yet a
+   *   selector that this constraint applies to. In that case, the state key is
+   *   propagates to a selector and resolving continues.
+   * @param state
+   *   The state to check for this constraint. If undefined, resolving
+   *   continues.
+   *   If both selector and state aren't undefined and valid non-numeric
+   *   strings, a lookup for the actual value of that selector's state is
+   *   performed. This parameter is not a State object but a pristine state
+   *   string.
+   *
+   * @return
+   *   true or false, depending on whether this constraint is satisfied.
+   */
+  checkConstraints: function(value, selector, state) {
+    // Normalize the last parameter. If it's non-numeric, we treat it either as
+    // a selector (in case there isn't one yet) or as a trigger/state.
+    if (typeof state !== 'string' || (/[0-9]/).test(state[0])) {
+      state = null;
+    }
+    else if (typeof selector === 'undefined') {
+      // Propagate the state to the selector when there isn't one yet.
+      selector = state;
+      state = null;
+    }
+
+    if (state !== null) {
+      // constraints is the actual constraints of an element to check for.
+      state = states.State.sanitize(state);
+      return invert(this.compare(value, selector, state), state.invert);
+    }
+    else {
+      // Resolve this constraint as an AND/OR operator.
+      return this.verifyConstraints(value, selector);
+    }
+  },
+
+  /**
+   * Gathers information about all required triggers.
+   */
+  getDependees: function() {
+    var cache = {};
+    // Swivel the lookup function so that we can record all available selector-
+    // state combinations for initialization.
+    var _compare = this.compare;
+    this.compare = function(reference, selector, state) {
+      (cache[selector] || (cache[selector] = [])).push(state.name);
+      // Return nothing (=== undefined) so that the constraint loops are not
+      // broken.
+    };
+
+    // This call doesn't actually verify anything but uses the resolving
+    // mechanism to go through the constraints array, trying to look up each
+    // value. Since we swivelled the compare function, this comparison returns
+    // undefined and lookup continues until the very end. Instead of lookup up
+    // the value, we record that combination of selector and state so that we
+    // can initialize all triggers.
+    this.verifyConstraints(this.constraints);
+    // Restore the original function.
+    this.compare = _compare;
+
+    return cache;
+  }
+};
+
+states.Trigger = function (args) {
+  $.extend(this, args);
+
+  if (this.state in states.Trigger.states) {
+    this.element = $(this.selector);
+
+    // Only call the trigger initializer when it wasn't yet attached to this
+    // element. Otherwise we'd end up with duplicate events.
+    if (!this.element.data('trigger:' + this.state)) {
+      this.initialize();
+    }
+  }
+};
+
+states.Trigger.prototype = {
+  initialize: function () {
+    var trigger = states.Trigger.states[this.state];
+
+    if (typeof trigger == 'function') {
+      // We have a custom trigger initialization function.
+      trigger.call(window, this.element);
+    }
+    else {
+      for (var event in trigger) {
+        if (trigger.hasOwnProperty(event)) {
+          this.defaultTrigger(event, trigger[event]);
+        }
+      }
+    }
+
+    // Mark this trigger as initialized for this element.
+    this.element.data('trigger:' + this.state, true);
+  },
+
+  defaultTrigger: function (event, valueFn) {
+    var oldValue = valueFn.call(this.element);
+
+    // Attach the event callback.
+    this.element.bind(event, $.proxy(function (e) {
+      var value = valueFn.call(this.element, e);
+      // Only trigger the event if the value has actually changed.
+      if (oldValue !== value) {
+        this.element.trigger({ type: 'state:' + this.state, value: value, oldValue: oldValue });
+        oldValue = value;
+      }
+    }, this));
+
+    states.postponed.push($.proxy(function () {
+      // Trigger the event once for initialization purposes.
+      this.element.trigger({ type: 'state:' + this.state, value: oldValue, oldValue: null });
+    }, this));
+  }
+};
+
+/**
+ * This list of states contains functions that are used to monitor the state
+ * of an element. Whenever an element depends on the state of another element,
+ * one of these trigger functions is added to the dependee so that the
+ * dependent element can be updated.
+ */
+states.Trigger.states = {
+  // 'empty' describes the state to be monitored
+  empty: {
+    // 'keyup' is the (native DOM) event that we watch for.
+    'keyup': function () {
+      // The function associated to that trigger returns the new value for the
+      // state.
+      return this.val() == '';
+    }
+  },
+
+  checked: {
+    'change': function () {
+      return this.is(':checked');
+    }
+  },
+
+  // For radio buttons, only return the value if the radio button is selected.
+  value: {
+    'keyup': function () {
+      // Radio buttons share the same :input[name="key"] selector.
+      if (this.length > 1) {
+        // Initial checked value of radios is undefined, so we return false.
+        return this.filter(':checked').val() || false;
+      }
+      return this.val();
+    },
+    'change': function () {
+      // Radio buttons share the same :input[name="key"] selector.
+      if (this.length > 1) {
+        // Initial checked value of radios is undefined, so we return false.
+        return this.filter(':checked').val() || false;
+      }
+      return this.val();
+    }
+  },
+
+  collapsed: {
+    'collapsed': function(e) {
+      return (typeof e !== 'undefined' && 'value' in e) ? e.value : this.is('.collapsed');
+    }
+  }
+};
+
+
+/**
+ * A state object is used for describing the state and performing aliasing.
+ */
+states.State = function(state) {
+  // We may need the original unresolved name later.
+  this.pristine = this.name = state;
+
+  // Normalize the state name.
+  while (true) {
+    // Iteratively remove exclamation marks and invert the value.
+    while (this.name.charAt(0) == '!') {
+      this.name = this.name.substring(1);
+      this.invert = !this.invert;
+    }
+
+    // Replace the state with its normalized name.
+    if (this.name in states.State.aliases) {
+      this.name = states.State.aliases[this.name];
+    }
+    else {
+      break;
+    }
+  }
+};
+
+/**
+ * Creates a new State object by sanitizing the passed value.
+ */
+states.State.sanitize = function (state) {
+  if (state instanceof states.State) {
+    return state;
+  }
+  else {
+    return new states.State(state);
+  }
+};
+
+/**
+ * This list of aliases is used to normalize states and associates negated names
+ * with their respective inverse state.
+ */
+states.State.aliases = {
+  'enabled': '!disabled',
+  'invisible': '!visible',
+  'invalid': '!valid',
+  'untouched': '!touched',
+  'optional': '!required',
+  'filled': '!empty',
+  'unchecked': '!checked',
+  'irrelevant': '!relevant',
+  'expanded': '!collapsed',
+  'readwrite': '!readonly'
+};
+
+states.State.prototype = {
+  invert: false,
+
+  /**
+   * Ensures that just using the state object returns the name.
+   */
+  toString: function() {
+    return this.name;
+  }
+};
+
+/**
+ * Global state change handlers. These are bound to "document" to cover all
+ * elements whose state changes. Events sent to elements within the page
+ * bubble up to these handlers. We use this system so that themes and modules
+ * can override these state change handlers for particular parts of a page.
+ */
+$(document).bind('state:disabled', function(e) {
+  // Only act when this change was triggered by a dependency and not by the
+  // element monitoring itself.
+  if (e.trigger) {
+    $(e.target)
+      .attr('disabled', e.value)
+        .closest('.form-item, .form-submit, .form-wrapper').toggleClass('form-disabled', e.value)
+        .find('select, input, textarea').attr('disabled', e.value);
+
+    // Note: WebKit nightlies don't reflect that change correctly.
+    // See https://bugs.webkit.org/show_bug.cgi?id=23789
+  }
+});
+
+$(document).bind('state:required', function(e) {
+  if (e.trigger) {
+    if (e.value) {
+      $(e.target).closest('.form-item, .form-wrapper').find('label').append('<span class="form-required">*</span>');
+    }
+    else {
+      $(e.target).closest('.form-item, .form-wrapper').find('label .form-required').remove();
+    }
+  }
+});
+
+$(document).bind('state:visible', function(e) {
+  if (e.trigger) {
+      $(e.target).closest('.form-item, .form-submit, .form-wrapper').toggle(e.value);
+  }
+});
+
+$(document).bind('state:checked', function(e) {
+  if (e.trigger) {
+    $(e.target).attr('checked', e.value);
+  }
+});
+
+$(document).bind('state:collapsed', function(e) {
+  if (e.trigger) {
+    if ($(e.target).is('.collapsed') !== e.value) {
+      $('> legend a', e.target).click();
+    }
+  }
+});
+
+/**
+ * These are helper functions implementing addition "operators" and don't
+ * implement any logic that is particular to states.
+ */
+
+// Bitwise AND with a third undefined state.
+function ternary (a, b) {
+  return typeof a === 'undefined' ? b : (typeof b === 'undefined' ? a : a && b);
+}
+
+// Inverts a (if it's not undefined) when invert is true.
+function invert (a, invert) {
+  return (invert && typeof a !== 'undefined') ? !a : a;
+}
+
+// Compares two values while ignoring undefined values.
+function compare (a, b) {
+  return (a === b) ? (typeof a === 'undefined' ? a : true) : (typeof a === 'undefined' || typeof b === 'undefined');
+}
+
+})(jQuery);
diff --git a/htmltest/misc/tabledrag.js b/htmltest/misc/tabledrag.js
new file mode 100644
index 00000000..fed674ca
--- /dev/null
+++ b/htmltest/misc/tabledrag.js
@@ -0,0 +1,1176 @@
+(function ($) {
+
+/**
+ * Drag and drop table rows with field manipulation.
+ *
+ * Using the drupal_add_tabledrag() function, any table with weights or parent
+ * relationships may be made into draggable tables. Columns containing a field
+ * may optionally be hidden, providing a better user experience.
+ *
+ * Created tableDrag instances may be modified with custom behaviors by
+ * overriding the .onDrag, .onDrop, .row.onSwap, and .row.onIndent methods.
+ * See blocks.js for an example of adding additional functionality to tableDrag.
+ */
+Drupal.behaviors.tableDrag = {
+  attach: function (context, settings) {
+    for (var base in settings.tableDrag) {
+      $('#' + base, context).once('tabledrag', function () {
+        // Create the new tableDrag instance. Save in the Drupal variable
+        // to allow other scripts access to the object.
+        Drupal.tableDrag[base] = new Drupal.tableDrag(this, settings.tableDrag[base]);
+      });
+    }
+  }
+};
+
+/**
+ * Constructor for the tableDrag object. Provides table and field manipulation.
+ *
+ * @param table
+ *   DOM object for the table to be made draggable.
+ * @param tableSettings
+ *   Settings for the table added via drupal_add_dragtable().
+ */
+Drupal.tableDrag = function (table, tableSettings) {
+  var self = this;
+
+  // Required object variables.
+  this.table = table;
+  this.tableSettings = tableSettings;
+  this.dragObject = null; // Used to hold information about a current drag operation.
+  this.rowObject = null; // Provides operations for row manipulation.
+  this.oldRowElement = null; // Remember the previous element.
+  this.oldY = 0; // Used to determine up or down direction from last mouse move.
+  this.changed = false; // Whether anything in the entire table has changed.
+  this.maxDepth = 0; // Maximum amount of allowed parenting.
+  this.rtl = $(this.table).css('direction') == 'rtl' ? -1 : 1; // Direction of the table.
+
+  // Configure the scroll settings.
+  this.scrollSettings = { amount: 4, interval: 50, trigger: 70 };
+  this.scrollInterval = null;
+  this.scrollY = 0;
+  this.windowHeight = 0;
+
+  // Check this table's settings to see if there are parent relationships in
+  // this table. For efficiency, large sections of code can be skipped if we
+  // don't need to track horizontal movement and indentations.
+  this.indentEnabled = false;
+  for (var group in tableSettings) {
+    for (var n in tableSettings[group]) {
+      if (tableSettings[group][n].relationship == 'parent') {
+        this.indentEnabled = true;
+      }
+      if (tableSettings[group][n].limit > 0) {
+        this.maxDepth = tableSettings[group][n].limit;
+      }
+    }
+  }
+  if (this.indentEnabled) {
+    this.indentCount = 1; // Total width of indents, set in makeDraggable.
+    // Find the width of indentations to measure mouse movements against.
+    // Because the table doesn't need to start with any indentations, we
+    // manually append 2 indentations in the first draggable row, measure
+    // the offset, then remove.
+    var indent = Drupal.theme('tableDragIndentation');
+    var testRow = $('<tr/>').addClass('draggable').appendTo(table);
+    var testCell = $('<td/>').appendTo(testRow).prepend(indent).prepend(indent);
+    this.indentAmount = $('.indentation', testCell).get(1).offsetLeft - $('.indentation', testCell).get(0).offsetLeft;
+    testRow.remove();
+  }
+
+  // Make each applicable row draggable.
+  // Match immediate children of the parent element to allow nesting.
+  $('> tr.draggable, > tbody > tr.draggable', table).each(function () { self.makeDraggable(this); });
+
+  // Add a link before the table for users to show or hide weight columns.
+  $(table).before($('<a href="#" class="tabledrag-toggle-weight"></a>')
+    .attr('title', Drupal.t('Re-order rows by numerical weight instead of dragging.'))
+    .click(function () {
+      if ($.cookie('Drupal.tableDrag.showWeight') == 1) {
+        self.hideColumns();
+      }
+      else {
+        self.showColumns();
+      }
+      return false;
+    })
+    .wrap('<div class="tabledrag-toggle-weight-wrapper"></div>')
+    .parent()
+  );
+
+  // Initialize the specified columns (for example, weight or parent columns)
+  // to show or hide according to user preference. This aids accessibility
+  // so that, e.g., screen reader users can choose to enter weight values and
+  // manipulate form elements directly, rather than using drag-and-drop..
+  self.initColumns();
+
+  // Add mouse bindings to the document. The self variable is passed along
+  // as event handlers do not have direct access to the tableDrag object.
+  $(document).bind('mousemove', function (event) { return self.dragRow(event, self); });
+  $(document).bind('mouseup', function (event) { return self.dropRow(event, self); });
+};
+
+/**
+ * Initialize columns containing form elements to be hidden by default,
+ * according to the settings for this tableDrag instance.
+ *
+ * Identify and mark each cell with a CSS class so we can easily toggle
+ * show/hide it. Finally, hide columns if user does not have a
+ * 'Drupal.tableDrag.showWeight' cookie.
+ */
+Drupal.tableDrag.prototype.initColumns = function () {
+  for (var group in this.tableSettings) {
+    // Find the first field in this group.
+    for (var d in this.tableSettings[group]) {
+      var field = $('.' + this.tableSettings[group][d].target + ':first', this.table);
+      if (field.length && this.tableSettings[group][d].hidden) {
+        var hidden = this.tableSettings[group][d].hidden;
+        var cell = field.closest('td');
+        break;
+      }
+    }
+
+    // Mark the column containing this field so it can be hidden.
+    if (hidden && cell[0]) {
+      // Add 1 to our indexes. The nth-child selector is 1 based, not 0 based.
+      // Match immediate children of the parent element to allow nesting.
+      var columnIndex = $('> td', cell.parent()).index(cell.get(0)) + 1;
+      $('> thead > tr, > tbody > tr, > tr', this.table).each(function () {
+        // Get the columnIndex and adjust for any colspans in this row.
+        var index = columnIndex;
+        var cells = $(this).children();
+        cells.each(function (n) {
+          if (n < index && this.colSpan && this.colSpan > 1) {
+            index -= this.colSpan - 1;
+          }
+        });
+        if (index > 0) {
+          cell = cells.filter(':nth-child(' + index + ')');
+          if (cell[0].colSpan && cell[0].colSpan > 1) {
+            // If this cell has a colspan, mark it so we can reduce the colspan.
+            cell.addClass('tabledrag-has-colspan');
+          }
+          else {
+            // Mark this cell so we can hide it.
+            cell.addClass('tabledrag-hide');
+          }
+        }
+      });
+    }
+  }
+
+  // Now hide cells and reduce colspans unless cookie indicates previous choice.
+  // Set a cookie if it is not already present.
+  if ($.cookie('Drupal.tableDrag.showWeight') === null) {
+    $.cookie('Drupal.tableDrag.showWeight', 0, {
+      path: Drupal.settings.basePath,
+      // The cookie expires in one year.
+      expires: 365
+    });
+    this.hideColumns();
+  }
+  // Check cookie value and show/hide weight columns accordingly.
+  else {
+    if ($.cookie('Drupal.tableDrag.showWeight') == 1) {
+      this.showColumns();
+    }
+    else {
+      this.hideColumns();
+    }
+  }
+};
+
+/**
+ * Hide the columns containing weight/parent form elements.
+ * Undo showColumns().
+ */
+Drupal.tableDrag.prototype.hideColumns = function () {
+  // Hide weight/parent cells and headers.
+  $('.tabledrag-hide', 'table.tabledrag-processed').css('display', 'none');
+  // Show TableDrag handles.
+  $('.tabledrag-handle', 'table.tabledrag-processed').css('display', '');
+  // Reduce the colspan of any effected multi-span columns.
+  $('.tabledrag-has-colspan', 'table.tabledrag-processed').each(function () {
+    this.colSpan = this.colSpan - 1;
+  });
+  // Change link text.
+  $('.tabledrag-toggle-weight').text(Drupal.t('Show row weights'));
+  // Change cookie.
+  $.cookie('Drupal.tableDrag.showWeight', 0, {
+    path: Drupal.settings.basePath,
+    // The cookie expires in one year.
+    expires: 365
+  });
+  // Trigger an event to allow other scripts to react to this display change.
+  $('table.tabledrag-processed').trigger('columnschange', 'hide');
+};
+
+/**
+ * Show the columns containing weight/parent form elements
+ * Undo hideColumns().
+ */
+Drupal.tableDrag.prototype.showColumns = function () {
+  // Show weight/parent cells and headers.
+  $('.tabledrag-hide', 'table.tabledrag-processed').css('display', '');
+  // Hide TableDrag handles.
+  $('.tabledrag-handle', 'table.tabledrag-processed').css('display', 'none');
+  // Increase the colspan for any columns where it was previously reduced.
+  $('.tabledrag-has-colspan', 'table.tabledrag-processed').each(function () {
+    this.colSpan = this.colSpan + 1;
+  });
+  // Change link text.
+  $('.tabledrag-toggle-weight').text(Drupal.t('Hide row weights'));
+  // Change cookie.
+  $.cookie('Drupal.tableDrag.showWeight', 1, {
+    path: Drupal.settings.basePath,
+    // The cookie expires in one year.
+    expires: 365
+  });
+  // Trigger an event to allow other scripts to react to this display change.
+  $('table.tabledrag-processed').trigger('columnschange', 'show');
+};
+
+/**
+ * Find the target used within a particular row and group.
+ */
+Drupal.tableDrag.prototype.rowSettings = function (group, row) {
+  var field = $('.' + group, row);
+  for (var delta in this.tableSettings[group]) {
+    var targetClass = this.tableSettings[group][delta].target;
+    if (field.is('.' + targetClass)) {
+      // Return a copy of the row settings.
+      var rowSettings = {};
+      for (var n in this.tableSettings[group][delta]) {
+        rowSettings[n] = this.tableSettings[group][delta][n];
+      }
+      return rowSettings;
+    }
+  }
+};
+
+/**
+ * Take an item and add event handlers to make it become draggable.
+ */
+Drupal.tableDrag.prototype.makeDraggable = function (item) {
+  var self = this;
+
+  // Create the handle.
+  var handle = $('<a href="#" class="tabledrag-handle"><div class="handle">&nbsp;</div></a>').attr('title', Drupal.t('Drag to re-order'));
+  // Insert the handle after indentations (if any).
+  if ($('td:first .indentation:last', item).length) {
+    $('td:first .indentation:last', item).after(handle);
+    // Update the total width of indentation in this entire table.
+    self.indentCount = Math.max($('.indentation', item).length, self.indentCount);
+  }
+  else {
+    $('td:first', item).prepend(handle);
+  }
+
+  // Add hover action for the handle.
+  handle.hover(function () {
+    self.dragObject == null ? $(this).addClass('tabledrag-handle-hover') : null;
+  }, function () {
+    self.dragObject == null ? $(this).removeClass('tabledrag-handle-hover') : null;
+  });
+
+  // Add the mousedown action for the handle.
+  handle.mousedown(function (event) {
+    // Create a new dragObject recording the event information.
+    self.dragObject = {};
+    self.dragObject.initMouseOffset = self.getMouseOffset(item, event);
+    self.dragObject.initMouseCoords = self.mouseCoords(event);
+    if (self.indentEnabled) {
+      self.dragObject.indentMousePos = self.dragObject.initMouseCoords;
+    }
+
+    // If there's a lingering row object from the keyboard, remove its focus.
+    if (self.rowObject) {
+      $('a.tabledrag-handle', self.rowObject.element).blur();
+    }
+
+    // Create a new rowObject for manipulation of this row.
+    self.rowObject = new self.row(item, 'mouse', self.indentEnabled, self.maxDepth, true);
+
+    // Save the position of the table.
+    self.table.topY = $(self.table).offset().top;
+    self.table.bottomY = self.table.topY + self.table.offsetHeight;
+
+    // Add classes to the handle and row.
+    $(this).addClass('tabledrag-handle-hover');
+    $(item).addClass('drag');
+
+    // Set the document to use the move cursor during drag.
+    $('body').addClass('drag');
+    if (self.oldRowElement) {
+      $(self.oldRowElement).removeClass('drag-previous');
+    }
+
+    // Hack for IE6 that flickers uncontrollably if select lists are moved.
+    if (navigator.userAgent.indexOf('MSIE 6.') != -1) {
+      $('select', this.table).css('display', 'none');
+    }
+
+    // Hack for Konqueror, prevent the blur handler from firing.
+    // Konqueror always gives links focus, even after returning false on mousedown.
+    self.safeBlur = false;
+
+    // Call optional placeholder function.
+    self.onDrag();
+    return false;
+  });
+
+  // Prevent the anchor tag from jumping us to the top of the page.
+  handle.click(function () {
+    return false;
+  });
+
+  // Similar to the hover event, add a class when the handle is focused.
+  handle.focus(function () {
+    $(this).addClass('tabledrag-handle-hover');
+    self.safeBlur = true;
+  });
+
+  // Remove the handle class on blur and fire the same function as a mouseup.
+  handle.blur(function (event) {
+    $(this).removeClass('tabledrag-handle-hover');
+    if (self.rowObject && self.safeBlur) {
+      self.dropRow(event, self);
+    }
+  });
+
+  // Add arrow-key support to the handle.
+  handle.keydown(function (event) {
+    // If a rowObject doesn't yet exist and this isn't the tab key.
+    if (event.keyCode != 9 && !self.rowObject) {
+      self.rowObject = new self.row(item, 'keyboard', self.indentEnabled, self.maxDepth, true);
+    }
+
+    var keyChange = false;
+    switch (event.keyCode) {
+      case 37: // Left arrow.
+      case 63234: // Safari left arrow.
+        keyChange = true;
+        self.rowObject.indent(-1 * self.rtl);
+        break;
+      case 38: // Up arrow.
+      case 63232: // Safari up arrow.
+        var previousRow = $(self.rowObject.element).prev('tr').get(0);
+        while (previousRow && $(previousRow).is(':hidden')) {
+          previousRow = $(previousRow).prev('tr').get(0);
+        }
+        if (previousRow) {
+          self.safeBlur = false; // Do not allow the onBlur cleanup.
+          self.rowObject.direction = 'up';
+          keyChange = true;
+
+          if ($(item).is('.tabledrag-root')) {
+            // Swap with the previous top-level row.
+            var groupHeight = 0;
+            while (previousRow && $('.indentation', previousRow).length) {
+              previousRow = $(previousRow).prev('tr').get(0);
+              groupHeight += $(previousRow).is(':hidden') ? 0 : previousRow.offsetHeight;
+            }
+            if (previousRow) {
+              self.rowObject.swap('before', previousRow);
+              // No need to check for indentation, 0 is the only valid one.
+              window.scrollBy(0, -groupHeight);
+            }
+          }
+          else if (self.table.tBodies[0].rows[0] != previousRow || $(previousRow).is('.draggable')) {
+            // Swap with the previous row (unless previous row is the first one
+            // and undraggable).
+            self.rowObject.swap('before', previousRow);
+            self.rowObject.interval = null;
+            self.rowObject.indent(0);
+            window.scrollBy(0, -parseInt(item.offsetHeight, 10));
+          }
+          handle.get(0).focus(); // Regain focus after the DOM manipulation.
+        }
+        break;
+      case 39: // Right arrow.
+      case 63235: // Safari right arrow.
+        keyChange = true;
+        self.rowObject.indent(1 * self.rtl);
+        break;
+      case 40: // Down arrow.
+      case 63233: // Safari down arrow.
+        var nextRow = $(self.rowObject.group).filter(':last').next('tr').get(0);
+        while (nextRow && $(nextRow).is(':hidden')) {
+          nextRow = $(nextRow).next('tr').get(0);
+        }
+        if (nextRow) {
+          self.safeBlur = false; // Do not allow the onBlur cleanup.
+          self.rowObject.direction = 'down';
+          keyChange = true;
+
+          if ($(item).is('.tabledrag-root')) {
+            // Swap with the next group (necessarily a top-level one).
+            var groupHeight = 0;
+            var nextGroup = new self.row(nextRow, 'keyboard', self.indentEnabled, self.maxDepth, false);
+            if (nextGroup) {
+              $(nextGroup.group).each(function () {
+                groupHeight += $(this).is(':hidden') ? 0 : this.offsetHeight;
+              });
+              var nextGroupRow = $(nextGroup.group).filter(':last').get(0);
+              self.rowObject.swap('after', nextGroupRow);
+              // No need to check for indentation, 0 is the only valid one.
+              window.scrollBy(0, parseInt(groupHeight, 10));
+            }
+          }
+          else {
+            // Swap with the next row.
+            self.rowObject.swap('after', nextRow);
+            self.rowObject.interval = null;
+            self.rowObject.indent(0);
+            window.scrollBy(0, parseInt(item.offsetHeight, 10));
+          }
+          handle.get(0).focus(); // Regain focus after the DOM manipulation.
+        }
+        break;
+    }
+
+    if (self.rowObject && self.rowObject.changed == true) {
+      $(item).addClass('drag');
+      if (self.oldRowElement) {
+        $(self.oldRowElement).removeClass('drag-previous');
+      }
+      self.oldRowElement = item;
+      self.restripeTable();
+      self.onDrag();
+    }
+
+    // Returning false if we have an arrow key to prevent scrolling.
+    if (keyChange) {
+      return false;
+    }
+  });
+
+  // Compatibility addition, return false on keypress to prevent unwanted scrolling.
+  // IE and Safari will suppress scrolling on keydown, but all other browsers
+  // need to return false on keypress. http://www.quirksmode.org/js/keys.html
+  handle.keypress(function (event) {
+    switch (event.keyCode) {
+      case 37: // Left arrow.
+      case 38: // Up arrow.
+      case 39: // Right arrow.
+      case 40: // Down arrow.
+        return false;
+    }
+  });
+};
+
+/**
+ * Mousemove event handler, bound to document.
+ */
+Drupal.tableDrag.prototype.dragRow = function (event, self) {
+  if (self.dragObject) {
+    self.currentMouseCoords = self.mouseCoords(event);
+
+    var y = self.currentMouseCoords.y - self.dragObject.initMouseOffset.y;
+    var x = self.currentMouseCoords.x - self.dragObject.initMouseOffset.x;
+
+    // Check for row swapping and vertical scrolling.
+    if (y != self.oldY) {
+      self.rowObject.direction = y > self.oldY ? 'down' : 'up';
+      self.oldY = y; // Update the old value.
+
+      // Check if the window should be scrolled (and how fast).
+      var scrollAmount = self.checkScroll(self.currentMouseCoords.y);
+      // Stop any current scrolling.
+      clearInterval(self.scrollInterval);
+      // Continue scrolling if the mouse has moved in the scroll direction.
+      if (scrollAmount > 0 && self.rowObject.direction == 'down' || scrollAmount < 0 && self.rowObject.direction == 'up') {
+        self.setScroll(scrollAmount);
+      }
+
+      // If we have a valid target, perform the swap and restripe the table.
+      var currentRow = self.findDropTargetRow(x, y);
+      if (currentRow) {
+        if (self.rowObject.direction == 'down') {
+          self.rowObject.swap('after', currentRow, self);
+        }
+        else {
+          self.rowObject.swap('before', currentRow, self);
+        }
+        self.restripeTable();
+      }
+    }
+
+    // Similar to row swapping, handle indentations.
+    if (self.indentEnabled) {
+      var xDiff = self.currentMouseCoords.x - self.dragObject.indentMousePos.x;
+      // Set the number of indentations the mouse has been moved left or right.
+      var indentDiff = Math.round(xDiff / self.indentAmount * self.rtl);
+      // Indent the row with our estimated diff, which may be further
+      // restricted according to the rows around this row.
+      var indentChange = self.rowObject.indent(indentDiff);
+      // Update table and mouse indentations.
+      self.dragObject.indentMousePos.x += self.indentAmount * indentChange * self.rtl;
+      self.indentCount = Math.max(self.indentCount, self.rowObject.indents);
+    }
+
+    return false;
+  }
+};
+
+/**
+ * Mouseup event handler, bound to document.
+ * Blur event handler, bound to drag handle for keyboard support.
+ */
+Drupal.tableDrag.prototype.dropRow = function (event, self) {
+  // Drop row functionality shared between mouseup and blur events.
+  if (self.rowObject != null) {
+    var droppedRow = self.rowObject.element;
+    // The row is already in the right place so we just release it.
+    if (self.rowObject.changed == true) {
+      // Update the fields in the dropped row.
+      self.updateFields(droppedRow);
+
+      // If a setting exists for affecting the entire group, update all the
+      // fields in the entire dragged group.
+      for (var group in self.tableSettings) {
+        var rowSettings = self.rowSettings(group, droppedRow);
+        if (rowSettings.relationship == 'group') {
+          for (var n in self.rowObject.children) {
+            self.updateField(self.rowObject.children[n], group);
+          }
+        }
+      }
+
+      self.rowObject.markChanged();
+      if (self.changed == false) {
+        $(Drupal.theme('tableDragChangedWarning')).insertBefore(self.table).hide().fadeIn('slow');
+        self.changed = true;
+      }
+    }
+
+    if (self.indentEnabled) {
+      self.rowObject.removeIndentClasses();
+    }
+    if (self.oldRowElement) {
+      $(self.oldRowElement).removeClass('drag-previous');
+    }
+    $(droppedRow).removeClass('drag').addClass('drag-previous');
+    self.oldRowElement = droppedRow;
+    self.onDrop();
+    self.rowObject = null;
+  }
+
+  // Functionality specific only to mouseup event.
+  if (self.dragObject != null) {
+    $('.tabledrag-handle', droppedRow).removeClass('tabledrag-handle-hover');
+
+    self.dragObject = null;
+    $('body').removeClass('drag');
+    clearInterval(self.scrollInterval);
+
+    // Hack for IE6 that flickers uncontrollably if select lists are moved.
+    if (navigator.userAgent.indexOf('MSIE 6.') != -1) {
+      $('select', this.table).css('display', 'block');
+    }
+  }
+};
+
+/**
+ * Get the mouse coordinates from the event (allowing for browser differences).
+ */
+Drupal.tableDrag.prototype.mouseCoords = function (event) {
+  if (event.pageX || event.pageY) {
+    return { x: event.pageX, y: event.pageY };
+  }
+  return {
+    x: event.clientX + document.body.scrollLeft - document.body.clientLeft,
+    y: event.clientY + document.body.scrollTop  - document.body.clientTop
+  };
+};
+
+/**
+ * Given a target element and a mouse event, get the mouse offset from that
+ * element. To do this we need the element's position and the mouse position.
+ */
+Drupal.tableDrag.prototype.getMouseOffset = function (target, event) {
+  var docPos   = $(target).offset();
+  var mousePos = this.mouseCoords(event);
+  return { x: mousePos.x - docPos.left, y: mousePos.y - docPos.top };
+};
+
+/**
+ * Find the row the mouse is currently over. This row is then taken and swapped
+ * with the one being dragged.
+ *
+ * @param x
+ *   The x coordinate of the mouse on the page (not the screen).
+ * @param y
+ *   The y coordinate of the mouse on the page (not the screen).
+ */
+Drupal.tableDrag.prototype.findDropTargetRow = function (x, y) {
+  var rows = $(this.table.tBodies[0].rows).not(':hidden');
+  for (var n = 0; n < rows.length; n++) {
+    var row = rows[n];
+    var indentDiff = 0;
+    var rowY = $(row).offset().top;
+    // Because Safari does not report offsetHeight on table rows, but does on
+    // table cells, grab the firstChild of the row and use that instead.
+    // http://jacob.peargrove.com/blog/2006/technical/table-row-offsettop-bug-in-safari.
+    if (row.offsetHeight == 0) {
+      var rowHeight = parseInt(row.firstChild.offsetHeight, 10) / 2;
+    }
+    // Other browsers.
+    else {
+      var rowHeight = parseInt(row.offsetHeight, 10) / 2;
+    }
+
+    // Because we always insert before, we need to offset the height a bit.
+    if ((y > (rowY - rowHeight)) && (y < (rowY + rowHeight))) {
+      if (this.indentEnabled) {
+        // Check that this row is not a child of the row being dragged.
+        for (var n in this.rowObject.group) {
+          if (this.rowObject.group[n] == row) {
+            return null;
+          }
+        }
+      }
+      else {
+        // Do not allow a row to be swapped with itself.
+        if (row == this.rowObject.element) {
+          return null;
+        }
+      }
+
+      // Check that swapping with this row is allowed.
+      if (!this.rowObject.isValidSwap(row)) {
+        return null;
+      }
+
+      // We may have found the row the mouse just passed over, but it doesn't
+      // take into account hidden rows. Skip backwards until we find a draggable
+      // row.
+      while ($(row).is(':hidden') && $(row).prev('tr').is(':hidden')) {
+        row = $(row).prev('tr').get(0);
+      }
+      return row;
+    }
+  }
+  return null;
+};
+
+/**
+ * After the row is dropped, update the table fields according to the settings
+ * set for this table.
+ *
+ * @param changedRow
+ *   DOM object for the row that was just dropped.
+ */
+Drupal.tableDrag.prototype.updateFields = function (changedRow) {
+  for (var group in this.tableSettings) {
+    // Each group may have a different setting for relationship, so we find
+    // the source rows for each separately.
+    this.updateField(changedRow, group);
+  }
+};
+
+/**
+ * After the row is dropped, update a single table field according to specific
+ * settings.
+ *
+ * @param changedRow
+ *   DOM object for the row that was just dropped.
+ * @param group
+ *   The settings group on which field updates will occur.
+ */
+Drupal.tableDrag.prototype.updateField = function (changedRow, group) {
+  var rowSettings = this.rowSettings(group, changedRow);
+
+  // Set the row as its own target.
+  if (rowSettings.relationship == 'self' || rowSettings.relationship == 'group') {
+    var sourceRow = changedRow;
+  }
+  // Siblings are easy, check previous and next rows.
+  else if (rowSettings.relationship == 'sibling') {
+    var previousRow = $(changedRow).prev('tr').get(0);
+    var nextRow = $(changedRow).next('tr').get(0);
+    var sourceRow = changedRow;
+    if ($(previousRow).is('.draggable') && $('.' + group, previousRow).length) {
+      if (this.indentEnabled) {
+        if ($('.indentations', previousRow).length == $('.indentations', changedRow)) {
+          sourceRow = previousRow;
+        }
+      }
+      else {
+        sourceRow = previousRow;
+      }
+    }
+    else if ($(nextRow).is('.draggable') && $('.' + group, nextRow).length) {
+      if (this.indentEnabled) {
+        if ($('.indentations', nextRow).length == $('.indentations', changedRow)) {
+          sourceRow = nextRow;
+        }
+      }
+      else {
+        sourceRow = nextRow;
+      }
+    }
+  }
+  // Parents, look up the tree until we find a field not in this group.
+  // Go up as many parents as indentations in the changed row.
+  else if (rowSettings.relationship == 'parent') {
+    var previousRow = $(changedRow).prev('tr');
+    while (previousRow.length && $('.indentation', previousRow).length >= this.rowObject.indents) {
+      previousRow = previousRow.prev('tr');
+    }
+    // If we found a row.
+    if (previousRow.length) {
+      sourceRow = previousRow[0];
+    }
+    // Otherwise we went all the way to the left of the table without finding
+    // a parent, meaning this item has been placed at the root level.
+    else {
+      // Use the first row in the table as source, because it's guaranteed to
+      // be at the root level. Find the first item, then compare this row
+      // against it as a sibling.
+      sourceRow = $(this.table).find('tr.draggable:first').get(0);
+      if (sourceRow == this.rowObject.element) {
+        sourceRow = $(this.rowObject.group[this.rowObject.group.length - 1]).next('tr.draggable').get(0);
+      }
+      var useSibling = true;
+    }
+  }
+
+  // Because we may have moved the row from one category to another,
+  // take a look at our sibling and borrow its sources and targets.
+  this.copyDragClasses(sourceRow, changedRow, group);
+  rowSettings = this.rowSettings(group, changedRow);
+
+  // In the case that we're looking for a parent, but the row is at the top
+  // of the tree, copy our sibling's values.
+  if (useSibling) {
+    rowSettings.relationship = 'sibling';
+    rowSettings.source = rowSettings.target;
+  }
+
+  var targetClass = '.' + rowSettings.target;
+  var targetElement = $(targetClass, changedRow).get(0);
+
+  // Check if a target element exists in this row.
+  if (targetElement) {
+    var sourceClass = '.' + rowSettings.source;
+    var sourceElement = $(sourceClass, sourceRow).get(0);
+    switch (rowSettings.action) {
+      case 'depth':
+        // Get the depth of the target row.
+        targetElement.value = $('.indentation', $(sourceElement).closest('tr')).length;
+        break;
+      case 'match':
+        // Update the value.
+        targetElement.value = sourceElement.value;
+        break;
+      case 'order':
+        var siblings = this.rowObject.findSiblings(rowSettings);
+        if ($(targetElement).is('select')) {
+          // Get a list of acceptable values.
+          var values = [];
+          $('option', targetElement).each(function () {
+            values.push(this.value);
+          });
+          var maxVal = values[values.length - 1];
+          // Populate the values in the siblings.
+          $(targetClass, siblings).each(function () {
+            // If there are more items than possible values, assign the maximum value to the row.
+            if (values.length > 0) {
+              this.value = values.shift();
+            }
+            else {
+              this.value = maxVal;
+            }
+          });
+        }
+        else {
+          // Assume a numeric input field.
+          var weight = parseInt($(targetClass, siblings[0]).val(), 10) || 0;
+          $(targetClass, siblings).each(function () {
+            this.value = weight;
+            weight++;
+          });
+        }
+        break;
+    }
+  }
+};
+
+/**
+ * Copy all special tableDrag classes from one row's form elements to a
+ * different one, removing any special classes that the destination row
+ * may have had.
+ */
+Drupal.tableDrag.prototype.copyDragClasses = function (sourceRow, targetRow, group) {
+  var sourceElement = $('.' + group, sourceRow);
+  var targetElement = $('.' + group, targetRow);
+  if (sourceElement.length && targetElement.length) {
+    targetElement[0].className = sourceElement[0].className;
+  }
+};
+
+Drupal.tableDrag.prototype.checkScroll = function (cursorY) {
+  var de  = document.documentElement;
+  var b  = document.body;
+
+  var windowHeight = this.windowHeight = window.innerHeight || (de.clientHeight && de.clientWidth != 0 ? de.clientHeight : b.offsetHeight);
+  var scrollY = this.scrollY = (document.all ? (!de.scrollTop ? b.scrollTop : de.scrollTop) : (window.pageYOffset ? window.pageYOffset : window.scrollY));
+  var trigger = this.scrollSettings.trigger;
+  var delta = 0;
+
+  // Return a scroll speed relative to the edge of the screen.
+  if (cursorY - scrollY > windowHeight - trigger) {
+    delta = trigger / (windowHeight + scrollY - cursorY);
+    delta = (delta > 0 && delta < trigger) ? delta : trigger;
+    return delta * this.scrollSettings.amount;
+  }
+  else if (cursorY - scrollY < trigger) {
+    delta = trigger / (cursorY - scrollY);
+    delta = (delta > 0 && delta < trigger) ? delta : trigger;
+    return -delta * this.scrollSettings.amount;
+  }
+};
+
+Drupal.tableDrag.prototype.setScroll = function (scrollAmount) {
+  var self = this;
+
+  this.scrollInterval = setInterval(function () {
+    // Update the scroll values stored in the object.
+    self.checkScroll(self.currentMouseCoords.y);
+    var aboveTable = self.scrollY > self.table.topY;
+    var belowTable = self.scrollY + self.windowHeight < self.table.bottomY;
+    if (scrollAmount > 0 && belowTable || scrollAmount < 0 && aboveTable) {
+      window.scrollBy(0, scrollAmount);
+    }
+  }, this.scrollSettings.interval);
+};
+
+Drupal.tableDrag.prototype.restripeTable = function () {
+  // :even and :odd are reversed because jQuery counts from 0 and
+  // we count from 1, so we're out of sync.
+  // Match immediate children of the parent element to allow nesting.
+  $('> tbody > tr.draggable:visible, > tr.draggable:visible', this.table)
+    .removeClass('odd even')
+    .filter(':odd').addClass('even').end()
+    .filter(':even').addClass('odd');
+};
+
+/**
+ * Stub function. Allows a custom handler when a row begins dragging.
+ */
+Drupal.tableDrag.prototype.onDrag = function () {
+  return null;
+};
+
+/**
+ * Stub function. Allows a custom handler when a row is dropped.
+ */
+Drupal.tableDrag.prototype.onDrop = function () {
+  return null;
+};
+
+/**
+ * Constructor to make a new object to manipulate a table row.
+ *
+ * @param tableRow
+ *   The DOM element for the table row we will be manipulating.
+ * @param method
+ *   The method in which this row is being moved. Either 'keyboard' or 'mouse'.
+ * @param indentEnabled
+ *   Whether the containing table uses indentations. Used for optimizations.
+ * @param maxDepth
+ *   The maximum amount of indentations this row may contain.
+ * @param addClasses
+ *   Whether we want to add classes to this row to indicate child relationships.
+ */
+Drupal.tableDrag.prototype.row = function (tableRow, method, indentEnabled, maxDepth, addClasses) {
+  this.element = tableRow;
+  this.method = method;
+  this.group = [tableRow];
+  this.groupDepth = $('.indentation', tableRow).length;
+  this.changed = false;
+  this.table = $(tableRow).closest('table').get(0);
+  this.indentEnabled = indentEnabled;
+  this.maxDepth = maxDepth;
+  this.direction = ''; // Direction the row is being moved.
+
+  if (this.indentEnabled) {
+    this.indents = $('.indentation', tableRow).length;
+    this.children = this.findChildren(addClasses);
+    this.group = $.merge(this.group, this.children);
+    // Find the depth of this entire group.
+    for (var n = 0; n < this.group.length; n++) {
+      this.groupDepth = Math.max($('.indentation', this.group[n]).length, this.groupDepth);
+    }
+  }
+};
+
+/**
+ * Find all children of rowObject by indentation.
+ *
+ * @param addClasses
+ *   Whether we want to add classes to this row to indicate child relationships.
+ */
+Drupal.tableDrag.prototype.row.prototype.findChildren = function (addClasses) {
+  var parentIndentation = this.indents;
+  var currentRow = $(this.element, this.table).next('tr.draggable');
+  var rows = [];
+  var child = 0;
+  while (currentRow.length) {
+    var rowIndentation = $('.indentation', currentRow).length;
+    // A greater indentation indicates this is a child.
+    if (rowIndentation > parentIndentation) {
+      child++;
+      rows.push(currentRow[0]);
+      if (addClasses) {
+        $('.indentation', currentRow).each(function (indentNum) {
+          if (child == 1 && (indentNum == parentIndentation)) {
+            $(this).addClass('tree-child-first');
+          }
+          if (indentNum == parentIndentation) {
+            $(this).addClass('tree-child');
+          }
+          else if (indentNum > parentIndentation) {
+            $(this).addClass('tree-child-horizontal');
+          }
+        });
+      }
+    }
+    else {
+      break;
+    }
+    currentRow = currentRow.next('tr.draggable');
+  }
+  if (addClasses && rows.length) {
+    $('.indentation:nth-child(' + (parentIndentation + 1) + ')', rows[rows.length - 1]).addClass('tree-child-last');
+  }
+  return rows;
+};
+
+/**
+ * Ensure that two rows are allowed to be swapped.
+ *
+ * @param row
+ *   DOM object for the row being considered for swapping.
+ */
+Drupal.tableDrag.prototype.row.prototype.isValidSwap = function (row) {
+  if (this.indentEnabled) {
+    var prevRow, nextRow;
+    if (this.direction == 'down') {
+      prevRow = row;
+      nextRow = $(row).next('tr').get(0);
+    }
+    else {
+      prevRow = $(row).prev('tr').get(0);
+      nextRow = row;
+    }
+    this.interval = this.validIndentInterval(prevRow, nextRow);
+
+    // We have an invalid swap if the valid indentations interval is empty.
+    if (this.interval.min > this.interval.max) {
+      return false;
+    }
+  }
+
+  // Do not let an un-draggable first row have anything put before it.
+  if (this.table.tBodies[0].rows[0] == row && $(row).is(':not(.draggable)')) {
+    return false;
+  }
+
+  return true;
+};
+
+/**
+ * Perform the swap between two rows.
+ *
+ * @param position
+ *   Whether the swap will occur 'before' or 'after' the given row.
+ * @param row
+ *   DOM element what will be swapped with the row group.
+ */
+Drupal.tableDrag.prototype.row.prototype.swap = function (position, row) {
+  Drupal.detachBehaviors(this.group, Drupal.settings, 'move');
+  $(row)[position](this.group);
+  Drupal.attachBehaviors(this.group, Drupal.settings);
+  this.changed = true;
+  this.onSwap(row);
+};
+
+/**
+ * Determine the valid indentations interval for the row at a given position
+ * in the table.
+ *
+ * @param prevRow
+ *   DOM object for the row before the tested position
+ *   (or null for first position in the table).
+ * @param nextRow
+ *   DOM object for the row after the tested position
+ *   (or null for last position in the table).
+ */
+Drupal.tableDrag.prototype.row.prototype.validIndentInterval = function (prevRow, nextRow) {
+  var minIndent, maxIndent;
+
+  // Minimum indentation:
+  // Do not orphan the next row.
+  minIndent = nextRow ? $('.indentation', nextRow).length : 0;
+
+  // Maximum indentation:
+  if (!prevRow || $(prevRow).is(':not(.draggable)') || $(this.element).is('.tabledrag-root')) {
+    // Do not indent:
+    // - the first row in the table,
+    // - rows dragged below a non-draggable row,
+    // - 'root' rows.
+    maxIndent = 0;
+  }
+  else {
+    // Do not go deeper than as a child of the previous row.
+    maxIndent = $('.indentation', prevRow).length + ($(prevRow).is('.tabledrag-leaf') ? 0 : 1);
+    // Limit by the maximum allowed depth for the table.
+    if (this.maxDepth) {
+      maxIndent = Math.min(maxIndent, this.maxDepth - (this.groupDepth - this.indents));
+    }
+  }
+
+  return { 'min': minIndent, 'max': maxIndent };
+};
+
+/**
+ * Indent a row within the legal bounds of the table.
+ *
+ * @param indentDiff
+ *   The number of additional indentations proposed for the row (can be
+ *   positive or negative). This number will be adjusted to nearest valid
+ *   indentation level for the row.
+ */
+Drupal.tableDrag.prototype.row.prototype.indent = function (indentDiff) {
+  // Determine the valid indentations interval if not available yet.
+  if (!this.interval) {
+    var prevRow = $(this.element).prev('tr').get(0);
+    var nextRow = $(this.group).filter(':last').next('tr').get(0);
+    this.interval = this.validIndentInterval(prevRow, nextRow);
+  }
+
+  // Adjust to the nearest valid indentation.
+  var indent = this.indents + indentDiff;
+  indent = Math.max(indent, this.interval.min);
+  indent = Math.min(indent, this.interval.max);
+  indentDiff = indent - this.indents;
+
+  for (var n = 1; n <= Math.abs(indentDiff); n++) {
+    // Add or remove indentations.
+    if (indentDiff < 0) {
+      $('.indentation:first', this.group).remove();
+      this.indents--;
+    }
+    else {
+      $('td:first', this.group).prepend(Drupal.theme('tableDragIndentation'));
+      this.indents++;
+    }
+  }
+  if (indentDiff) {
+    // Update indentation for this row.
+    this.changed = true;
+    this.groupDepth += indentDiff;
+    this.onIndent();
+  }
+
+  return indentDiff;
+};
+
+/**
+ * Find all siblings for a row, either according to its subgroup or indentation.
+ * Note that the passed-in row is included in the list of siblings.
+ *
+ * @param settings
+ *   The field settings we're using to identify what constitutes a sibling.
+ */
+Drupal.tableDrag.prototype.row.prototype.findSiblings = function (rowSettings) {
+  var siblings = [];
+  var directions = ['prev', 'next'];
+  var rowIndentation = this.indents;
+  for (var d = 0; d < directions.length; d++) {
+    var checkRow = $(this.element)[directions[d]]();
+    while (checkRow.length) {
+      // Check that the sibling contains a similar target field.
+      if ($('.' + rowSettings.target, checkRow)) {
+        // Either add immediately if this is a flat table, or check to ensure
+        // that this row has the same level of indentation.
+        if (this.indentEnabled) {
+          var checkRowIndentation = $('.indentation', checkRow).length;
+        }
+
+        if (!(this.indentEnabled) || (checkRowIndentation == rowIndentation)) {
+          siblings.push(checkRow[0]);
+        }
+        else if (checkRowIndentation < rowIndentation) {
+          // No need to keep looking for siblings when we get to a parent.
+          break;
+        }
+      }
+      else {
+        break;
+      }
+      checkRow = $(checkRow)[directions[d]]();
+    }
+    // Since siblings are added in reverse order for previous, reverse the
+    // completed list of previous siblings. Add the current row and continue.
+    if (directions[d] == 'prev') {
+      siblings.reverse();
+      siblings.push(this.element);
+    }
+  }
+  return siblings;
+};
+
+/**
+ * Remove indentation helper classes from the current row group.
+ */
+Drupal.tableDrag.prototype.row.prototype.removeIndentClasses = function () {
+  for (var n in this.children) {
+    $('.indentation', this.children[n])
+      .removeClass('tree-child')
+      .removeClass('tree-child-first')
+      .removeClass('tree-child-last')
+      .removeClass('tree-child-horizontal');
+  }
+};
+
+/**
+ * Add an asterisk or other marker to the changed row.
+ */
+Drupal.tableDrag.prototype.row.prototype.markChanged = function () {
+  var marker = Drupal.theme('tableDragChangedMarker');
+  var cell = $('td:first', this.element);
+  if ($('span.tabledrag-changed', cell).length == 0) {
+    cell.append(marker);
+  }
+};
+
+/**
+ * Stub function. Allows a custom handler when a row is indented.
+ */
+Drupal.tableDrag.prototype.row.prototype.onIndent = function () {
+  return null;
+};
+
+/**
+ * Stub function. Allows a custom handler when a row is swapped.
+ */
+Drupal.tableDrag.prototype.row.prototype.onSwap = function (swappedRow) {
+  return null;
+};
+
+Drupal.theme.prototype.tableDragChangedMarker = function () {
+  return '<span class="warning tabledrag-changed">*</span>';
+};
+
+Drupal.theme.prototype.tableDragIndentation = function () {
+  return '<div class="indentation">&nbsp;</div>';
+};
+
+Drupal.theme.prototype.tableDragChangedWarning = function () {
+  return '<div class="tabledrag-changed-warning messages warning">' + Drupal.theme('tableDragChangedMarker') + ' ' + Drupal.t('Changes made in this table will not be saved until the form is submitted.') + '</div>';
+};
+
+})(jQuery);
diff --git a/htmltest/misc/tableheader.js b/htmltest/misc/tableheader.js
new file mode 100644
index 00000000..47201b26
--- /dev/null
+++ b/htmltest/misc/tableheader.js
@@ -0,0 +1,133 @@
+(function ($) {
+
+/**
+ * Attaches sticky table headers.
+ */
+Drupal.behaviors.tableHeader = {
+  attach: function (context, settings) {
+    if (!$.support.positionFixed) {
+      return;
+    }
+
+    $('table.sticky-enabled', context).once('tableheader', function () {
+      $(this).data("drupal-tableheader", new Drupal.tableHeader(this));
+    });
+  }
+};
+
+/**
+ * Constructor for the tableHeader object. Provides sticky table headers.
+ *
+ * @param table
+ *   DOM object for the table to add a sticky header to.
+ */
+Drupal.tableHeader = function (table) {
+  var self = this;
+
+  this.originalTable = $(table);
+  this.originalHeader = $(table).children('thead');
+  this.originalHeaderCells = this.originalHeader.find('> tr > th');
+  this.displayWeight = null;
+
+  // React to columns change to avoid making checks in the scroll callback.
+  this.originalTable.bind('columnschange', function (e, display) {
+    // This will force header size to be calculated on scroll.
+    self.widthCalculated = (self.displayWeight !== null && self.displayWeight === display);
+    self.displayWeight = display;
+  });
+
+  // Clone the table header so it inherits original jQuery properties. Hide
+  // the table to avoid a flash of the header clone upon page load.
+  this.stickyTable = $('<table class="sticky-header"/>')
+    .insertBefore(this.originalTable)
+    .css({ position: 'fixed', top: '0px' });
+  this.stickyHeader = this.originalHeader.clone(true)
+    .hide()
+    .appendTo(this.stickyTable);
+  this.stickyHeaderCells = this.stickyHeader.find('> tr > th');
+
+  this.originalTable.addClass('sticky-table');
+  $(window)
+    .bind('scroll.drupal-tableheader', $.proxy(this, 'eventhandlerRecalculateStickyHeader'))
+    .bind('resize.drupal-tableheader', { calculateWidth: true }, $.proxy(this, 'eventhandlerRecalculateStickyHeader'))
+    // Make sure the anchor being scrolled into view is not hidden beneath the
+    // sticky table header. Adjust the scrollTop if it does.
+    .bind('drupalDisplaceAnchor.drupal-tableheader', function () {
+      window.scrollBy(0, -self.stickyTable.outerHeight());
+    })
+    // Make sure the element being focused is not hidden beneath the sticky
+    // table header. Adjust the scrollTop if it does.
+    .bind('drupalDisplaceFocus.drupal-tableheader', function (event) {
+      if (self.stickyVisible && event.clientY < (self.stickyOffsetTop + self.stickyTable.outerHeight()) && event.$target.closest('sticky-header').length === 0) {
+        window.scrollBy(0, -self.stickyTable.outerHeight());
+      }
+    })
+    .triggerHandler('resize.drupal-tableheader');
+
+  // We hid the header to avoid it showing up erroneously on page load;
+  // we need to unhide it now so that it will show up when expected.
+  this.stickyHeader.show();
+};
+
+/**
+ * Event handler: recalculates position of the sticky table header.
+ *
+ * @param event
+ *   Event being triggered.
+ */
+Drupal.tableHeader.prototype.eventhandlerRecalculateStickyHeader = function (event) {
+  var self = this;
+  var calculateWidth = event.data && event.data.calculateWidth;
+
+  // Reset top position of sticky table headers to the current top offset.
+  this.stickyOffsetTop = Drupal.settings.tableHeaderOffset ? eval(Drupal.settings.tableHeaderOffset + '()') : 0;
+  this.stickyTable.css('top', this.stickyOffsetTop + 'px');
+
+  // Save positioning data.
+  var viewHeight = document.documentElement.scrollHeight || document.body.scrollHeight;
+  if (calculateWidth || this.viewHeight !== viewHeight) {
+    this.viewHeight = viewHeight;
+    this.vPosition = this.originalTable.offset().top - 4 - this.stickyOffsetTop;
+    this.hPosition = this.originalTable.offset().left;
+    this.vLength = this.originalTable[0].clientHeight - 100;
+    calculateWidth = true;
+  }
+
+  // Track horizontal positioning relative to the viewport and set visibility.
+  var hScroll = document.documentElement.scrollLeft || document.body.scrollLeft;
+  var vOffset = (document.documentElement.scrollTop || document.body.scrollTop) - this.vPosition;
+  this.stickyVisible = vOffset > 0 && vOffset < this.vLength;
+  this.stickyTable.css({ left: (-hScroll + this.hPosition) + 'px', visibility: this.stickyVisible ? 'visible' : 'hidden' });
+
+  // Only perform expensive calculations if the sticky header is actually
+  // visible or when forced.
+  if (this.stickyVisible && (calculateWidth || !this.widthCalculated)) {
+    this.widthCalculated = true;
+    var $that = null;
+    var $stickyCell = null;
+    var display = null;
+    var cellWidth = null;
+    // Resize header and its cell widths.
+    // Only apply width to visible table cells. This prevents the header from
+    // displaying incorrectly when the sticky header is no longer visible.
+    for (var i = 0, il = this.originalHeaderCells.length; i < il; i += 1) {
+      $that = $(this.originalHeaderCells[i]);
+      $stickyCell = this.stickyHeaderCells.eq($that.index());
+      display = $that.css('display');
+      if (display !== 'none') {
+        cellWidth = $that.css('width');
+        // Exception for IE7.
+        if (cellWidth === 'auto') {
+          cellWidth = $that[0].clientWidth + 'px';
+        }
+        $stickyCell.css({'width': cellWidth, 'display': display});
+      }
+      else {
+        $stickyCell.css('display', 'none');
+      }
+    }
+    this.stickyTable.css('width', this.originalTable.outerWidth());
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/misc/tableselect.js b/htmltest/misc/tableselect.js
new file mode 100644
index 00000000..fee63a9f
--- /dev/null
+++ b/htmltest/misc/tableselect.js
@@ -0,0 +1,92 @@
+(function ($) {
+
+Drupal.behaviors.tableSelect = {
+  attach: function (context, settings) {
+    // Select the inner-most table in case of nested tables.
+    $('th.select-all', context).closest('table').once('table-select', Drupal.tableSelect);
+  }
+};
+
+Drupal.tableSelect = function () {
+  // Do not add a "Select all" checkbox if there are no rows with checkboxes in the table
+  if ($('td input:checkbox', this).length == 0) {
+    return;
+  }
+
+  // Keep track of the table, which checkbox is checked and alias the settings.
+  var table = this, checkboxes, lastChecked;
+  var strings = { 'selectAll': Drupal.t('Select all rows in this table'), 'selectNone': Drupal.t('Deselect all rows in this table') };
+  var updateSelectAll = function (state) {
+    // Update table's select-all checkbox (and sticky header's if available).
+    $(table).prev('table.sticky-header').andSelf().find('th.select-all input:checkbox').each(function() {
+      $(this).attr('title', state ? strings.selectNone : strings.selectAll);
+      this.checked = state;
+    });
+  };
+
+  // Find all <th> with class select-all, and insert the check all checkbox.
+  $('th.select-all', table).prepend($('<input type="checkbox" class="form-checkbox" />').attr('title', strings.selectAll)).click(function (event) {
+    if ($(event.target).is('input:checkbox')) {
+      // Loop through all checkboxes and set their state to the select all checkbox' state.
+      checkboxes.each(function () {
+        this.checked = event.target.checked;
+        // Either add or remove the selected class based on the state of the check all checkbox.
+        $(this).closest('tr').toggleClass('selected', this.checked);
+      });
+      // Update the title and the state of the check all box.
+      updateSelectAll(event.target.checked);
+    }
+  });
+
+  // For each of the checkboxes within the table that are not disabled.
+  checkboxes = $('td input:checkbox:enabled', table).click(function (e) {
+    // Either add or remove the selected class based on the state of the check all checkbox.
+    $(this).closest('tr').toggleClass('selected', this.checked);
+
+    // If this is a shift click, we need to highlight everything in the range.
+    // Also make sure that we are actually checking checkboxes over a range and
+    // that a checkbox has been checked or unchecked before.
+    if (e.shiftKey && lastChecked && lastChecked != e.target) {
+      // We use the checkbox's parent TR to do our range searching.
+      Drupal.tableSelectRange($(e.target).closest('tr')[0], $(lastChecked).closest('tr')[0], e.target.checked);
+    }
+
+    // If all checkboxes are checked, make sure the select-all one is checked too, otherwise keep unchecked.
+    updateSelectAll((checkboxes.length == $(checkboxes).filter(':checked').length));
+
+    // Keep track of the last checked checkbox.
+    lastChecked = e.target;
+  });
+};
+
+Drupal.tableSelectRange = function (from, to, state) {
+  // We determine the looping mode based on the the order of from and to.
+  var mode = from.rowIndex > to.rowIndex ? 'previousSibling' : 'nextSibling';
+
+  // Traverse through the sibling nodes.
+  for (var i = from[mode]; i; i = i[mode]) {
+    // Make sure that we're only dealing with elements.
+    if (i.nodeType != 1) {
+      continue;
+    }
+
+    // Either add or remove the selected class based on the state of the target checkbox.
+    $(i).toggleClass('selected', state);
+    $('input:checkbox', i).each(function () {
+      this.checked = state;
+    });
+
+    if (to.nodeType) {
+      // If we are at the end of the range, stop.
+      if (i == to) {
+        break;
+      }
+    }
+    // A faster alternative to doing $(i).filter(to).length.
+    else if ($.filter(to, [i]).r.length) {
+      break;
+    }
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/misc/textarea.js b/htmltest/misc/textarea.js
new file mode 100644
index 00000000..0ab5e712
--- /dev/null
+++ b/htmltest/misc/textarea.js
@@ -0,0 +1,32 @@
+(function ($) {
+
+Drupal.behaviors.textarea = {
+  attach: function (context, settings) {
+    $('.form-textarea-wrapper.resizable', context).once('textarea', function () {
+      var staticOffset = null;
+      var textarea = $(this).addClass('resizable-textarea').find('textarea');
+      var grippie = $('<div class="grippie"></div>').mousedown(startDrag);
+
+      grippie.insertAfter(textarea);
+
+      function startDrag(e) {
+        staticOffset = textarea.height() - e.pageY;
+        textarea.css('opacity', 0.25);
+        $(document).mousemove(performDrag).mouseup(endDrag);
+        return false;
+      }
+
+      function performDrag(e) {
+        textarea.height(Math.max(32, staticOffset + e.pageY) + 'px');
+        return false;
+      }
+
+      function endDrag(e) {
+        $(document).unbind('mousemove', performDrag).unbind('mouseup', endDrag);
+        textarea.css('opacity', 1);
+      }
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/misc/throbber.gif b/htmltest/misc/throbber.gif
new file mode 100644
index 00000000..4352e64e
Binary files /dev/null and b/htmltest/misc/throbber.gif differ
diff --git a/htmltest/misc/timezone.js b/htmltest/misc/timezone.js
new file mode 100644
index 00000000..54497304
--- /dev/null
+++ b/htmltest/misc/timezone.js
@@ -0,0 +1,66 @@
+(function ($) {
+
+/**
+ * Set the client's system time zone as default values of form fields.
+ */
+Drupal.behaviors.setTimezone = {
+  attach: function (context, settings) {
+    $('select.timezone-detect', context).once('timezone', function () {
+      var dateString = Date();
+      // In some client environments, date strings include a time zone
+      // abbreviation, between 3 and 5 letters enclosed in parentheses,
+      // which can be interpreted by PHP.
+      var matches = dateString.match(/\(([A-Z]{3,5})\)/);
+      var abbreviation = matches ? matches[1] : 0;
+
+      // For all other client environments, the abbreviation is set to "0"
+      // and the current offset from UTC and daylight saving time status are
+      // used to guess the time zone.
+      var dateNow = new Date();
+      var offsetNow = dateNow.getTimezoneOffset() * -60;
+
+      // Use January 1 and July 1 as test dates for determining daylight
+      // saving time status by comparing their offsets.
+      var dateJan = new Date(dateNow.getFullYear(), 0, 1, 12, 0, 0, 0);
+      var dateJul = new Date(dateNow.getFullYear(), 6, 1, 12, 0, 0, 0);
+      var offsetJan = dateJan.getTimezoneOffset() * -60;
+      var offsetJul = dateJul.getTimezoneOffset() * -60;
+
+      var isDaylightSavingTime;
+      // If the offset from UTC is identical on January 1 and July 1,
+      // assume daylight saving time is not used in this time zone.
+      if (offsetJan == offsetJul) {
+        isDaylightSavingTime = '';
+      }
+      // If the maximum annual offset is equivalent to the current offset,
+      // assume daylight saving time is in effect.
+      else if (Math.max(offsetJan, offsetJul) == offsetNow) {
+        isDaylightSavingTime = 1;
+      }
+      // Otherwise, assume daylight saving time is not in effect.
+      else {
+        isDaylightSavingTime = 0;
+      }
+
+      // Submit request to the system/timezone callback and set the form field
+      // to the response time zone. The client date is passed to the callback
+      // for debugging purposes. Submit a synchronous request to avoid database
+      // errors associated with concurrent requests during install.
+      var path = 'system/timezone/' + abbreviation + '/' + offsetNow + '/' + isDaylightSavingTime;
+      var element = this;
+      $.ajax({
+        async: false,
+        url: settings.basePath,
+        data: { q: path, date: dateString },
+        dataType: 'json',
+        success: function (data) {
+          if (data) {
+            $(element).val(data);
+          }
+        }
+      });
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/misc/tree-bottom.png b/htmltest/misc/tree-bottom.png
new file mode 100644
index 00000000..a5580457
Binary files /dev/null and b/htmltest/misc/tree-bottom.png differ
diff --git a/htmltest/misc/tree.png b/htmltest/misc/tree.png
new file mode 100644
index 00000000..89ea2350
Binary files /dev/null and b/htmltest/misc/tree.png differ
diff --git a/htmltest/misc/ui/images/ui-bg_flat_0_aaaaaa_40x100.png b/htmltest/misc/ui/images/ui-bg_flat_0_aaaaaa_40x100.png
new file mode 100644
index 00000000..5b5dab2a
Binary files /dev/null and b/htmltest/misc/ui/images/ui-bg_flat_0_aaaaaa_40x100.png differ
diff --git a/htmltest/misc/ui/images/ui-bg_flat_75_ffffff_40x100.png b/htmltest/misc/ui/images/ui-bg_flat_75_ffffff_40x100.png
new file mode 100644
index 00000000..ac8b229a
Binary files /dev/null and b/htmltest/misc/ui/images/ui-bg_flat_75_ffffff_40x100.png differ
diff --git a/htmltest/misc/ui/images/ui-bg_glass_55_fbf9ee_1x400.png b/htmltest/misc/ui/images/ui-bg_glass_55_fbf9ee_1x400.png
new file mode 100644
index 00000000..ad3d6346
Binary files /dev/null and b/htmltest/misc/ui/images/ui-bg_glass_55_fbf9ee_1x400.png differ
diff --git a/htmltest/misc/ui/images/ui-bg_glass_65_ffffff_1x400.png b/htmltest/misc/ui/images/ui-bg_glass_65_ffffff_1x400.png
new file mode 100644
index 00000000..42ccba26
Binary files /dev/null and b/htmltest/misc/ui/images/ui-bg_glass_65_ffffff_1x400.png differ
diff --git a/htmltest/misc/ui/images/ui-bg_glass_75_dadada_1x400.png b/htmltest/misc/ui/images/ui-bg_glass_75_dadada_1x400.png
new file mode 100644
index 00000000..5a46b47c
Binary files /dev/null and b/htmltest/misc/ui/images/ui-bg_glass_75_dadada_1x400.png differ
diff --git a/htmltest/misc/ui/images/ui-bg_glass_75_e6e6e6_1x400.png b/htmltest/misc/ui/images/ui-bg_glass_75_e6e6e6_1x400.png
new file mode 100644
index 00000000..86c2baa6
Binary files /dev/null and b/htmltest/misc/ui/images/ui-bg_glass_75_e6e6e6_1x400.png differ
diff --git a/htmltest/misc/ui/images/ui-bg_glass_95_fef1ec_1x400.png b/htmltest/misc/ui/images/ui-bg_glass_95_fef1ec_1x400.png
new file mode 100644
index 00000000..4443fdc1
Binary files /dev/null and b/htmltest/misc/ui/images/ui-bg_glass_95_fef1ec_1x400.png differ
diff --git a/htmltest/misc/ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/htmltest/misc/ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png
new file mode 100644
index 00000000..7c9fa6c6
Binary files /dev/null and b/htmltest/misc/ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ
diff --git a/htmltest/misc/ui/images/ui-icons_222222_256x240.png b/htmltest/misc/ui/images/ui-icons_222222_256x240.png
new file mode 100644
index 00000000..ee039dc0
Binary files /dev/null and b/htmltest/misc/ui/images/ui-icons_222222_256x240.png differ
diff --git a/htmltest/misc/ui/images/ui-icons_2e83ff_256x240.png b/htmltest/misc/ui/images/ui-icons_2e83ff_256x240.png
new file mode 100644
index 00000000..45e8928e
Binary files /dev/null and b/htmltest/misc/ui/images/ui-icons_2e83ff_256x240.png differ
diff --git a/htmltest/misc/ui/images/ui-icons_454545_256x240.png b/htmltest/misc/ui/images/ui-icons_454545_256x240.png
new file mode 100644
index 00000000..7ec70d11
Binary files /dev/null and b/htmltest/misc/ui/images/ui-icons_454545_256x240.png differ
diff --git a/htmltest/misc/ui/images/ui-icons_888888_256x240.png b/htmltest/misc/ui/images/ui-icons_888888_256x240.png
new file mode 100644
index 00000000..5ba708c3
Binary files /dev/null and b/htmltest/misc/ui/images/ui-icons_888888_256x240.png differ
diff --git a/htmltest/misc/ui/images/ui-icons_cd0a0a_256x240.png b/htmltest/misc/ui/images/ui-icons_cd0a0a_256x240.png
new file mode 100644
index 00000000..7930a558
Binary files /dev/null and b/htmltest/misc/ui/images/ui-icons_cd0a0a_256x240.png differ
diff --git a/htmltest/misc/ui/jquery.effects.blind.min.js b/htmltest/misc/ui/jquery.effects.blind.min.js
new file mode 100644
index 00000000..ed7c74f1
--- /dev/null
+++ b/htmltest/misc/ui/jquery.effects.blind.min.js
@@ -0,0 +1,15 @@
+
+/*
+ * jQuery UI Effects Blind 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","left"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,g);b.effects.removeWrapper(a);
+c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.effects.bounce.min.js b/htmltest/misc/ui/jquery.effects.bounce.min.js
new file mode 100644
index 00000000..ca63813f
--- /dev/null
+++ b/htmltest/misc/ui/jquery.effects.bounce.min.js
@@ -0,0 +1,16 @@
+
+/*
+ * jQuery UI Effects Bounce 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","left"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/
+3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a);
+b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.effects.clip.min.js b/htmltest/misc/ui/jquery.effects.clip.min.js
new file mode 100644
index 00000000..75966ec4
--- /dev/null
+++ b/htmltest/misc/ui/jquery.effects.clip.min.js
@@ -0,0 +1,15 @@
+
+/*
+ * jQuery UI Effects Clip 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","left","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,c/2)}var h={};h[g.size]=
+f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.effects.core.min.js b/htmltest/misc/ui/jquery.effects.core.min.js
new file mode 100644
index 00000000..40c15504
--- /dev/null
+++ b/htmltest/misc/ui/jquery.effects.core.min.js
@@ -0,0 +1,31 @@
+
+/*
+ * jQuery UI Effects 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+jQuery.effects||function(f,j){function n(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
+16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return o.transparent;return o[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return n(b)}function p(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
+a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function q(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d=
+a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function m(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
+"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=n(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var o={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,
+0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,
+211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},r=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,
+d){if(f.isFunction(b)){d=b;b=null}return this.each(function(){f.queue(this,"fx",function(){var e=f(this),g=e.attr("style")||" ",h=q(p.call(this)),l,v=e.attr("className");f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});l=q(p.call(this));e.attr("className",v);e.animate(u(h,l),a,b,function(){f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)});h=f.queue(this);l=
+h.splice(h.length-1,1)[0];h.splice(1,0,l);f.dequeue(this)})})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},
+b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.7",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";
+return a},getBaseline:function(c,a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",
+background:"transparent",border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);
+return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(c))return this._show.apply(this,arguments);
+else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(m(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(m(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),
+b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,
+a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,
+a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==
+e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=
+g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/
+h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,
+a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
diff --git a/htmltest/misc/ui/jquery.effects.drop.min.js b/htmltest/misc/ui/jquery.effects.drop.min.js
new file mode 100644
index 00000000..37a034d3
--- /dev/null
+++ b/htmltest/misc/ui/jquery.effects.drop.min.js
@@ -0,0 +1,15 @@
+
+/*
+ * jQuery UI Effects Drop 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","left","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e=="show"?1:
+0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.effects.explode.min.js b/htmltest/misc/ui/jquery.effects.explode.min.js
new file mode 100644
index 00000000..726f3d5b
--- /dev/null
+++ b/htmltest/misc/ui/jquery.effects.explode.min.js
@@ -0,0 +1,16 @@
+
+/*
+ * jQuery UI Effects Explode 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f=
+0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+
+e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.effects.fade.min.js b/htmltest/misc/ui/jquery.effects.fade.min.js
new file mode 100644
index 00000000..71127f9a
--- /dev/null
+++ b/htmltest/misc/ui/jquery.effects.fade.min.js
@@ -0,0 +1,14 @@
+
+/*
+ * jQuery UI Effects Fade 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.effects.fold.min.js b/htmltest/misc/ui/jquery.effects.fold.min.js
new file mode 100644
index 00000000..ccc6b294
--- /dev/null
+++ b/htmltest/misc/ui/jquery.effects.fold.min.js
@@ -0,0 +1,15 @@
+
+/*
+ * jQuery UI Effects Fold 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","left"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],10)/100*
+f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.effects.highlight.min.js b/htmltest/misc/ui/jquery.effects.highlight.min.js
new file mode 100644
index 00000000..0ed3d898
--- /dev/null
+++ b/htmltest/misc/ui/jquery.effects.highlight.min.js
@@ -0,0 +1,15 @@
+
+/*
+ * jQuery UI Effects Highlight 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
+this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.effects.pulsate.min.js b/htmltest/misc/ui/jquery.effects.pulsate.min.js
new file mode 100644
index 00000000..658d8d03
--- /dev/null
+++ b/htmltest/misc/ui/jquery.effects.pulsate.min.js
@@ -0,0 +1,15 @@
+
+/*
+ * jQuery UI Effects Pulsate 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration,
+a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.effects.scale.min.js b/htmltest/misc/ui/jquery.effects.scale.min.js
new file mode 100644
index 00000000..206ef12f
--- /dev/null
+++ b/htmltest/misc/ui/jquery.effects.scale.min.js
@@ -0,0 +1,21 @@
+
+/*
+ * jQuery UI Effects Scale 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a,
+b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity=
+1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","left","width","height","overflow","opacity"],g=["position","top","left","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=c.effects.setMode(a,
+b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};if(m=="box"||m=="both"){if(d.from.y!=
+d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);a.css("overflow","hidden").css(a.from);
+if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);child.to=c.effects.setTransition(child,
+f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,n?e:g);c.effects.removeWrapper(a);b.callback&&
+b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.effects.shake.min.js b/htmltest/misc/ui/jquery.effects.shake.min.js
new file mode 100644
index 00000000..44542f32
--- /dev/null
+++ b/htmltest/misc/ui/jquery.effects.shake.min.js
@@ -0,0 +1,15 @@
+
+/*
+ * jQuery UI Effects Shake 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","left"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=(h=="pos"?"-=":"+=")+
+e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.effects.slide.min.js b/htmltest/misc/ui/jquery.effects.slide.min.js
new file mode 100644
index 00000000..94f5906f
--- /dev/null
+++ b/htmltest/misc/ui/jquery.effects.slide.min.js
@@ -0,0 +1,15 @@
+
+/*
+ * jQuery UI Effects Slide 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","left"],f=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var g=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var e=d.options.distance||(g=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(f=="show")a.css(g,b=="pos"?isNaN(e)?"-"+e:-e:e);var i={};i[g]=(f==
+"show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+e;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.effects.transfer.min.js b/htmltest/misc/ui/jquery.effects.transfer.min.js
new file mode 100644
index 00000000..0addaa8b
--- /dev/null
+++ b/htmltest/misc/ui/jquery.effects.transfer.min.js
@@ -0,0 +1,15 @@
+
+/*
+ * jQuery UI Effects Transfer 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments);
+b.dequeue()})})}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.accordion.css b/htmltest/misc/ui/jquery.ui.accordion.css
new file mode 100644
index 00000000..fcd7c55d
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.accordion.css
@@ -0,0 +1,20 @@
+
+/*
+ * jQuery UI Accordion 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
diff --git a/htmltest/misc/ui/jquery.ui.accordion.min.js b/htmltest/misc/ui/jquery.ui.accordion.min.js
new file mode 100644
index 00000000..0e0ee39a
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.accordion.min.js
@@ -0,0 +1,31 @@
+
+/*
+ * jQuery UI Accordion 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(c){c.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");
+a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
+if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var f=d.closest(".ui-accordion-header");a.active=f.length?f:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion",
+function(g){return a._keydown(g)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(g){a._clickHandler.call(a,g,this);g.preventDefault()})},_createIcons:function(){var a=this.options;if(a.icons){c("<span></span>").addClass("ui-icon "+
+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex");
+this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons();
+b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,f=this.headers.index(a.target),g=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:g=this.headers[(f+1)%d];break;case b.LEFT:case b.UP:g=this.headers[(f-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target);
+a.preventDefault()}if(g){c(a.target).attr("tabIndex",-1);c(g).attr("tabIndex",0);g.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+
+c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options;
+if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);
+a.next().addClass("ui-accordion-content-active")}h=a.next();f=this.active.next();g={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):h,oldContent:f};d=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(h,f,g,b,d)}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);
+this.active.next().addClass("ui-accordion-content-active");var f=this.active.next(),g={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:f},h=this.active=c([]);this._toggle(h,f,g)}},_toggle:function(a,b,d,f,g){var h=this,e=h.options;h.toShow=a;h.toHide=b;h.data=d;var j=function(){if(h)return h._completed.apply(h,arguments)};h._trigger("changestart",null,h.data);h.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&f?{toShow:c([]),toHide:b,complete:j,
+down:g,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:g,autoHeight:e.autoHeight||e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;f=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!f[k]&&!c.easing[k])k="slide";f[k]||(f[k]=function(l){this.slide(l,{easing:k,duration:i||700})});
+f[k](d)}else{if(e.collapsible&&f)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.7",animations:{slide:function(a,
+b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),f=0,g={},h={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){h[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);g[i]={value:j[1],
+unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(h,{step:function(j,i){if(i.prop=="height")f=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=f*g[i.prop].value+g[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",paddingTop:"hide",
+paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.autocomplete.css b/htmltest/misc/ui/jquery.ui.autocomplete.css
new file mode 100644
index 00000000..80a5789e
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.autocomplete.css
@@ -0,0 +1,54 @@
+
+/*
+ * jQuery UI Autocomplete 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }	
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+	list-style:none;
+	padding: 2px;
+	margin: 0;
+	display:block;
+	float: left;
+}
+.ui-menu .ui-menu {
+	margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+	margin:0;
+	padding: 0;
+	zoom: 1;
+	float: left;
+	clear: left;
+	width: 100%;
+}
+.ui-menu .ui-menu-item a {
+	text-decoration:none;
+	display:block;
+	padding:.2em .4em;
+	line-height:1.5;
+	zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+	font-weight: normal;
+	margin: -1px;
+}
diff --git a/htmltest/misc/ui/jquery.ui.autocomplete.min.js b/htmltest/misc/ui/jquery.ui.autocomplete.min.js
new file mode 100644
index 00000000..9983ec77
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.autocomplete.min.js
@@ -0,0 +1,32 @@
+
+/*
+ * jQuery UI Autocomplete 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.position.js
+ */
+(function(d){d.widget("ui.autocomplete",{options:{appendTo:"body",delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},_create:function(){var a=this,b=this.element[0].ownerDocument,f;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){f=false;var e=d.ui.keyCode;switch(c.keyCode){case e.PAGE_UP:a._move("previousPage",
+c);break;case e.PAGE_DOWN:a._move("nextPage",c);break;case e.UP:a._move("previous",c);c.preventDefault();break;case e.DOWN:a._move("next",c);c.preventDefault();break;case e.ENTER:case e.NUMPAD_ENTER:if(a.menu.active){f=true;c.preventDefault()}case e.TAB:if(!a.menu.active)return;a.menu.select(c);break;case e.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);
+break}}}).bind("keypress.autocomplete",function(c){if(f){f=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||
+"body",b)[0]).mousedown(function(c){var e=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(g){g.target!==a.element[0]&&g.target!==e&&!d.ui.contains(e,g.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,e){e=e.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:e})&&/^key/.test(c.originalEvent.type)&&a.element.val(e.value)},selected:function(c,e){var g=e.item.data("item.autocomplete"),
+h=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=h;setTimeout(function(){a.previous=h;a.selectedItem=g},1)}false!==a._trigger("select",c,{item:g})&&a.element.val(g.value);a.term=a.element.val();a.close(c);a.selectedItem=g},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");
+this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0])},_initSource:function(){var a=this,b,f;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,e){e(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){f=this.options.source;this.source=
+function(c,e){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:f,data:c,dataType:"json",success:function(g,h,i){i===a.xhr&&e(g);a.xhr=null},error:function(g){g===a.xhr&&e([]);a.xhr=null}})}}else this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)},_search:function(a){this.element.addClass("ui-autocomplete-loading");
+this.source({term:a},this.response)},_response:function(a){if(a&&a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",a)}},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&
+a[0].label&&a[0].value)return a;return d.map(a,function(b){if(typeof b==="string")return{label:b,value:b};return d.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();b.show();this._resizeMenu();b.position(d.extend({of:this.element},this.options.position))},_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),
+this.element.outerWidth()))},_renderMenu:function(a,b){var f=this;d.each(b,function(c,e){f._renderItem(a,e)})},_renderItem:function(a,b){return d("<li></li>").data("item.autocomplete",b).append(d("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});
+d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(a,b){var f=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return f.test(c.label||c.value||c)})}})})(jQuery);
+(function(d){d.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(b){if(d(b.target).closest(".ui-menu-item a").length){b.preventDefault();a.select(b)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
+-1).mouseenter(function(b){a.activate(b,d(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var f=b.offset().top-this.element.offset().top,c=this.element.attr("scrollTop"),e=this.element.height();if(f<0)this.element.attr("scrollTop",c+f);else f>=e&&this.element.attr("scrollTop",c+f-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:b})},
+deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,f){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0);
+a.length?this.activate(f,a):this.activate(f,this.element.children(b))}else this.activate(f,this.element.children(b))},nextPage:function(a){if(this.hasScroll())if(!this.active||this.last())this.activate(a,this.element.children(".ui-menu-item:first"));else{var b=this.active.offset().top,f=this.element.height(),c=this.element.children(".ui-menu-item").filter(function(){var e=d(this).offset().top-b-f+d(this).height();return e<10&&e>-10});c.length||(c=this.element.children(".ui-menu-item:last"));this.activate(a,
+c)}else this.activate(a,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active||this.first())this.activate(a,this.element.children(".ui-menu-item:last"));else{var b=this.active.offset().top,f=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-b+f-d(this).height();return c<10&&c>-10});result.length||(result=this.element.children(".ui-menu-item:first"));
+this.activate(a,result)}else this.activate(a,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.button.css b/htmltest/misc/ui/jquery.ui.button.css
new file mode 100644
index 00000000..973c3145
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.button.css
@@ -0,0 +1,39 @@
+
+/*
+ * jQuery UI Button 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
diff --git a/htmltest/misc/ui/jquery.ui.button.min.js b/htmltest/misc/ui/jquery.ui.button.min.js
new file mode 100644
index 00000000..26366aa4
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.button.min.js
@@ -0,0 +1,26 @@
+
+/*
+ * jQuery UI Button 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,e=a([]);if(c)e=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return e};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",
+i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",e="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",
+function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(e)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");
+b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var f=b.element[0];h(f).not(f).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");
+g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(f){if(c.disabled)return false;if(f.keyCode==a.ui.keyCode.SPACE||f.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(f){f.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",
+c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){this.buttonElement=this.element.parents().last().find("label[for="+this.element.attr("id")+"]");this.element.addClass("ui-helper-hidden-accessible");var b=this.element.is(":checked");b&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=
+this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active  ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());this.hasTitle||
+this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
+true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
+c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary");
+this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},
+destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.core.css b/htmltest/misc/ui/jquery.ui.core.css
new file mode 100644
index 00000000..d436225e
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.core.css
@@ -0,0 +1,42 @@
+
+/*
+ * jQuery UI CSS Framework 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
diff --git a/htmltest/misc/ui/jquery.ui.core.min.js b/htmltest/misc/ui/jquery.ui.core.min.js
new file mode 100644
index 00000000..976e056f
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.core.min.js
@@ -0,0 +1,18 @@
+
+/*!
+ * jQuery UI 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.7",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
+NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
+"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
+if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
+"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,
+d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
+c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
+b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.datepicker.css b/htmltest/misc/ui/jquery.ui.datepicker.css
new file mode 100644
index 00000000..a9048840
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.datepicker.css
@@ -0,0 +1,69 @@
+
+/*
+ * jQuery UI Datepicker 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}
diff --git a/htmltest/misc/ui/jquery.ui.datepicker.min.js b/htmltest/misc/ui/jquery.ui.datepicker.min.js
new file mode 100644
index 00000000..11af4811
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.datepicker.min.js
@@ -0,0 +1,82 @@
+
+/*
+ * jQuery UI Datepicker 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ */
+(function(d,G){function K(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
+"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
+"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
+minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}function E(a,b){d.extend(a,b);for(var c in b)if(b[c]==
+null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.7"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();
+f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},
+_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&
+b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==
+""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,
+c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),
+true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});
+b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);
+this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",
+this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,
+function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:
+f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},
+e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&&this._hideDatepicker();var h=this._getDateDatepicker(a,true);E(e.settings,f);this._attachments(d(a),e);this._autoSize(e);this._setDateDatepicker(a,h);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);
+this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass+":not(."+d.datepicker._currentClass+")",b.dpDiv);c[0]?
+d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker();return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||
+a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,
+e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,
+"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));var c=String.fromCharCode(a.charCode==G?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},
+_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=
+d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,
+c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&
+d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var e=a.dpDiv.find("iframe.ui-datepicker-cover");e.length&&e.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",
+function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=
+-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,
+"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},
+_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-
+g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?
+b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},
+_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):
+0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=
+false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=
+d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);
+else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=
+a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;for(var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,
+j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=z+1<a.length&&a.charAt(z+1)==p)&&z++;return p},m=function(p){var v=o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"&&v?4:p=="o"?3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,v,H){p=o(p)?H:v;for(v=0;v<p.length;v++)if(b.substr(s,p[v].length).toLowerCase()==p[v].toLowerCase()){s+=p[v].length;return v+1}throw"Unknown name at position "+s;},r=function(){if(b.charAt(s)!=
+a.charAt(z))throw"Unexpected literal at position "+s;s++},s=0,z=0;z<a.length;z++)if(k)if(a.charAt(z)=="'"&&!o("'"))k=false;else r();else switch(a.charAt(z)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":j=m("m");break;case "M":j=n("M",i,g);break;case "y":c=m("y");break;case "@":var w=new Date(m("@"));c=w.getFullYear();j=w.getMonth()+1;l=w.getDate();break;case "!":w=new Date((m("!")-this._ticksTo1970)/1E4);c=w.getFullYear();j=w.getMonth()+1;l=w.getDate();break;
+case "'":if(o("'"))r();else k=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}w=this._daylightSavingAdjust(new Date(c,j-1,l));if(w.getFullYear()!=c||w.getMonth()+1!=j||w.getDate()!=l)throw"Invalid date";return w},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",
+RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+1<a.length&&a.charAt(k+1)==o)&&k++;
+return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},j=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var k=0;k<a.length;k++)if(u)if(a.charAt(k)=="'"&&!i("'"))u=false;else l+=a.charAt(k);else switch(a.charAt(k)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=j("D",b.getDay(),e,f);break;case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=j("M",b.getMonth(),h,c);break;
+case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(k)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+=
+"0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==G?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=
+f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=
+(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,j=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,k=u.exec(h);k;){switch(k[2]||"d"){case "d":case "D":g+=parseInt(k[1],10);break;case "w":case "W":g+=parseInt(k[1],10)*7;break;case "m":case "M":l+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break;case "y":case "Y":j+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break}k=u.exec(h)}return new Date(j,
+l,g)};if(b=(b=b==null||b===""?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):new Date(b.getTime()))&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=
+a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),
+b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=
+this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&n<k?k:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', -"+j+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', +"+j+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;j=!h?j:this.formatDate(j,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+y+'.datepicker._hideDatepicker();">'+this._get(a,
+"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._gotoToday('#"+a.id+"');\">"+j+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=
+this._get(a,"monthNames"),w=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),v=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var L=this._getDefaultDate(a),I="",C=0;C<i[0];C++){for(var M="",D=0;D<i[1];D++){var N=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",x="";if(l){x+='<div class="ui-datepicker-group';if(i[1]>1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-
+1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c?f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,C>0||D>0,z,w)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var A=j?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=
+(t+h)%7;A+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}x+=A+"</tr></thead><tbody>";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O<A;O++){x+="<tr>";var P=!j?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var F=
+p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,J=B&&!H||!F[0]||k&&q<k||o&&q>o;P+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(B?" ui-datepicker-other-month":"")+(q.getTime()==N.getTime()&&g==a.selectedMonth&&a._keyEvent||L.getTime()==q.getTime()&&L.getTime()==N.getTime()?" "+this._dayOverClass:"")+(J?" "+this._unselectableClass+" ui-state-disabled":"")+(B&&!v?"":" "+F[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":
+""))+'"'+((!B||v)&&F[2]?' title="'+F[2]+'"':"")+(J?"":' onclick="DP_jQuery_'+y+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(B&&!v?"&#xa0;":J?'<span class="ui-state-default">'+q.getDate()+"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==u.getTime()?" ui-state-active":"")+(B?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=
+P+"</tr>"}g++;if(g>11){g=0;m++}x+="</tbody></table>"+(l?"</div>"+(i[0]>0&&D==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");M+=x}I+=M}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='<div class="ui-datepicker-title">',
+o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(k+=o+(h||!(j&&
+l)?"&#xa0;":""));a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+
+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";if(d.browser.mozilla)k+='<select class="ui-datepicker-year"><option value="'+c+'" selected="selected">'+c+"</option></select>";else{k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?"&#xa0;":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e=
+a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,
+"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);
+c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,
+"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=
+function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));
+return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.7";window["DP_jQuery_"+y]=d})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.dialog.css b/htmltest/misc/ui/jquery.ui.dialog.css
new file mode 100644
index 00000000..156e03ac
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.dialog.css
@@ -0,0 +1,22 @@
+
+/*
+ * jQuery UI Dialog 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
diff --git a/htmltest/misc/ui/jquery.ui.dialog.min.js b/htmltest/misc/ui/jquery.ui.dialog.min.js
new file mode 100644
index 00000000..d60151c2
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.dialog.min.js
@@ -0,0 +1,41 @@
+
+/*
+ * jQuery UI Dialog 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *  jquery.ui.button.js
+ *	jquery.ui.draggable.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.position.js
+ *	jquery.ui.resizable.js
+ */
+(function(c,j){var k={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},l={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&
+c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||"&#160;",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",
+-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role",
+"button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=
+b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");a.uiDialog.remove();a.originalTitle&&
+a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==b.uiDialog[0]){e=c(this).css("z-index");
+isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);
+d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===f[0]&&e.shiftKey){g.focus(1);return false}}});
+c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,function(f,
+h){h=c.isFunction(h)?{click:h,text:f}:h;f=c('<button type="button"></button>').attr(h,true).unbind("click").click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&f.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=
+d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize,
+position:f.position,size:f.size}}a=a===j?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f,
+h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===
+1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);if(g in k)e=true;if(g in
+l)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled");
+break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||"&#160;"));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=this.options,b,d,e=
+this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-b,0));this.uiDialog.is(":data(resizable)")&&
+this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.7",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===
+0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),
+height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
+b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,
+function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.draggable.min.js b/htmltest/misc/ui/jquery.ui.draggable.min.js
new file mode 100644
index 00000000..59a74182
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.draggable.min.js
@@ -0,0 +1,51 @@
+
+/*
+ * jQuery UI Draggable 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper==
+"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b=
+this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-
+this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();
+d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||
+this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode)return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,
+b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==
+a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||
+0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],
+this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-
+(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment==
+"parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[(a.containment=="document"?0:d(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(a.containment=="document"?0:d(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?
+0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),
+10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}}else if(a.containment.constructor==
+Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():
+f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;
+if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])e=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/
+b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;e=this.originalPageX+Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=this.containment?!(e-this.offset.click.left<this.containment[0]||e-this.offset.click.left>this.containment[2])?e:!(e-this.offset.click.left<this.containment[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:g-this.offset.click.top-
+this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=
+this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.7"});
+d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var g=d.data(this,"sortable");if(g&&!g.options.disabled){c.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=
+0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=
+c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=d(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,
+true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=
+0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=
+a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","iframeFix",{start:function(){var a=d(this).data("draggable").options;d(a.iframeFix===true?"iframe":a.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},
+stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=
+document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-
+c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX-b.overflowOffset.left<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-
+(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()-c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable",
+"snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this,width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,g=b.offset.left,n=g+c.helperProportions.width,m=b.offset.top,o=m+c.helperProportions.height,h=
+c.snapElements.length-1;h>=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e<g&&g<k+e&&j-e<m&&m<l+e||i-e<g&&g<k+e&&j-e<o&&o<l+e||i-e<n&&n<k+e&&j-e<m&&m<l+e||i-e<n&&n<k+e&&j-e<o&&o<l+e){if(f.snapMode!="inner"){var p=Math.abs(j-o)<=e,q=Math.abs(l-m)<=e,r=Math.abs(i-n)<=e,s=Math.abs(k-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",
+{top:l,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k}).left-c.margins.left}var t=p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(j-m)<=e;q=Math.abs(l-o)<=e;r=Math.abs(i-g)<=e;s=Math.abs(k-n)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l-c.helperProportions.height,
+left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[h].snapping&&(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=p||q||r||s||t}else{c.snapElements[h].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,
+a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,
+b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.droppable.min.js b/htmltest/misc/ui/jquery.ui.droppable.min.js
new file mode 100644
index 00000000..12efd10b
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.droppable.min.js
@@ -0,0 +1,27 @@
+
+/*
+ * jQuery UI Droppable 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.draggable.js
+ */
+(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this);
+a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&
+this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
+this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=
+d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
+a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.7"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
+switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=
+i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!=
+"none";if(c[f].visible){c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight};e=="mousedown"&&c[f]._activate.call(c[f],b)}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem||
+a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e=
+d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})}}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.mouse.min.js b/htmltest/misc/ui/jquery.ui.mouse.min.js
new file mode 100644
index 00000000..18057ebd
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.mouse.min.js
@@ -0,0 +1,18 @@
+
+/*!
+ * jQuery UI Mouse 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *	jquery.ui.widget.js
+ */
+(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(true===c.data(b.target,a.widgetName+".preventClickEvent")){c.removeData(b.target,a.widgetName+".preventClickEvent");b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=
+a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=
+this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!(document.documentMode>=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);
+return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;a.target==this._mouseDownEvent.target&&c.data(a.target,this.widgetName+".preventClickEvent",
+true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.position.min.js b/htmltest/misc/ui/jquery.ui.position.min.js
new file mode 100644
index 00000000..2e1451ef
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.position.min.js
@@ -0,0 +1,17 @@
+
+/*
+ * jQuery UI Position 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY,
+left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+=
+k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+parseInt(c.curCSS(this,"marginRight",true))||0,w=m+q+parseInt(c.curCSS(this,"marginBottom",true))||0,i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-=m/2;
+i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left=
+d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+=
+a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
+g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.progressbar.css b/htmltest/misc/ui/jquery.ui.progressbar.css
new file mode 100644
index 00000000..75610308
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.progressbar.css
@@ -0,0 +1,12 @@
+
+/*
+ * jQuery UI Progressbar 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
diff --git a/htmltest/misc/ui/jquery.ui.progressbar.min.js b/htmltest/misc/ui/jquery.ui.progressbar.min.js
new file mode 100644
index 00000000..7a8f0b79
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.progressbar.min.js
@@ -0,0 +1,17 @@
+
+/*
+ * jQuery UI Progressbar 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ */
+(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow");
+this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*
+this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.7"})})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.resizable.css b/htmltest/misc/ui/jquery.ui.resizable.css
new file mode 100644
index 00000000..e0f15cc6
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.resizable.css
@@ -0,0 +1,21 @@
+
+/*
+ * jQuery UI Resizable 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
diff --git a/htmltest/misc/ui/jquery.ui.resizable.min.js b/htmltest/misc/ui/jquery.ui.resizable.min.js
new file mode 100644
index 00000000..4df6eb77
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.resizable.min.js
@@ -0,0 +1,48 @@
+
+/*
+ * jQuery UI Resizable 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
+_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),
+top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=
+this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
+nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d<c.length;d++){var f=e.trim(c[d]),g=e('<div class="ui-resizable-handle '+("ui-resizable-"+f)+'"></div>');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor==
+String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection();
+this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};
+if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),
+d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=
+this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:
+this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",
+b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;
+f={width:c.size.width-(f?0:c.sizeDiff.width),height:c.size.height-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",
+b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top=
+a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=l(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=l(b.width)&&a.minWidth&&a.minWidth>b.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,
+k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=[c.css("borderTopWidth"),
+c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset=
+this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+
+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,
+arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,
+{version:"1.8.7"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,
+function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=
+(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=
+false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-
+a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",
+b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top",
+"Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,
+f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=
+a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+
+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&
+e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",
+height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=
+d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.selectable.css b/htmltest/misc/ui/jquery.ui.selectable.css
new file mode 100644
index 00000000..1489dcf3
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.selectable.css
@@ -0,0 +1,11 @@
+
+/*
+ * jQuery UI Selectable 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
diff --git a/htmltest/misc/ui/jquery.ui.selectable.min.js b/htmltest/misc/ui/jquery.ui.selectable.min.js
new file mode 100644
index 00000000..e2ec516e
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.selectable.min.js
@@ -0,0 +1,23 @@
+
+/*
+ * jQuery UI Selectable 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
+selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX,
+c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting",
+c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d=
+this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");
+a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&
+!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=
+e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.7"})})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.slider.css b/htmltest/misc/ui/jquery.ui.slider.css
new file mode 100644
index 00000000..a56a5138
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.slider.css
@@ -0,0 +1,25 @@
+
+/*
+ * jQuery UI Slider 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }
diff --git a/htmltest/misc/ui/jquery.ui.slider.min.js b/htmltest/misc/ui/jquery.ui.slider.min.js
new file mode 100644
index 00000000..dc36f15f
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.slider.min.js
@@ -0,0 +1,34 @@
+
+/*
+ * jQuery UI Slider 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var b=this,a=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");a.disabled&&this.element.addClass("ui-slider-disabled ui-disabled");
+this.range=d([]);if(a.range){if(a.range===true){this.range=d("<div></div>");if(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}else this.range=d("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(a.range==="min"||a.range==="max")this.range.addClass("ui-slider-range-"+a.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");
+if(a.values&&a.values.length)for(;d(".ui-slider-handle",this.element).length<a.values.length;)d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur();
+else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!b.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e=
+false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");h=b._start(c,f);if(h===false)return}break}i=b.options.step;h=b.options.values&&b.options.values.length?(g=b.values(f)):(g=b.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=b._valueMin();break;case d.ui.keyCode.END:g=b._valueMax();break;case d.ui.keyCode.PAGE_UP:g=b._trimAlignValue(h+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=b._trimAlignValue(h-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h===
+b._valueMax())return;g=b._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===b._valueMin())return;g=b._trimAlignValue(h-i);break}b._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(c,e);b._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");
+this._mouseDestroy();return this},_mouseCapture:function(b){var a=this.options,c,e,f,h,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(a.range===true&&this.values(1)===a.min){g+=1;f=d(this.handles[g])}if(this._start(b,
+g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();a=f.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-f.width()/2,top:b.pageY-a.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true},
+_mouseDrag:function(b){var a=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a;
+if(this.orientation==="horizontal"){a=this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=
+this.values(a);c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var e;if(this.options.values&&this.options.values.length){e=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>e||a===1&&c<e))c=e;if(c!==this.values(a)){e=this.values();e[a]=c;b=this._trigger("slide",b,{handle:this.handles[a],value:c,values:e});this.values(a?0:1);b!==false&&this.values(a,c,true)}}else if(c!==this.value()){b=this._trigger("slide",b,{handle:this.handles[a],
+value:c});b!==false&&this.value(c)}},_stop:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("stop",b,c)},_change:function(b,a){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("change",b,c)}},value:function(b){if(arguments.length){this.options.value=
+this._trimAlignValue(b);this._refreshValue();this._change(null,0)}return this._value()},values:function(b,a){var c,e,f;if(arguments.length>1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f<c.length;f+=1){c[f]=this._trimAlignValue(e[f]);this._change(null,f)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(b):this.value();
+else return this._values()},_setOption:function(b,a){var c,e=0;if(d.isArray(this.options.values))e=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(b){case "disabled":if(a){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();
+this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<e;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var b=this.options.value;return b=this._trimAlignValue(b)},_values:function(b){var a,c;if(arguments.length){a=this.options.values[b];
+return a=this._trimAlignValue(a)}else{a=this.options.values.slice();for(c=0;c<a.length;c+=1)a[c]=this._trimAlignValue(a[c]);return a}},_trimAlignValue:function(b){if(b<=this._valueMin())return this._valueMin();if(b>=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},
+_refreshValue:function(){var b=this.options.range,a=this.options,c=this,e=!this._animateOff?a.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate);
+if(k===1)c.range[e?"animate":"css"]({width:f-g+"%"},{queue:false,duration:a.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:a.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1,
+1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.7"})})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.sortable.min.js b/htmltest/misc/ui/jquery.ui.sortable.min.js
new file mode 100644
index 00000000..2cb1eaa5
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.sortable.min.js
@@ -0,0 +1,61 @@
+
+/*
+ * jQuery UI Sortable 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable");
+this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,
+arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=
+c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,
+{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();
+if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",
+a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");
+if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+
+this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+
+b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+
+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,
+c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==
+document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp();this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",
+null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):
+d(this.domPosition.parent).prepend(this.currentItem);return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||
+"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?j:g<b+
+this.helperProportions.width/2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?c&&c=="right"||a=="down"?2:1:a&&(a=="down"?
+2:1)},_intersectsWithSides:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},
+_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=
+this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=
+this.currentItem.find(":data(sortable-item)"),b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");
+if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&this.helper)this.offset.parent=this._getParentOffset();for(var b=this.items.length-1;b>=
+0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=
+this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},
+update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=
+null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));
+this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a,
+null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change",a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length||
+d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a==
+"string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition==
+"absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition==
+"relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},
+_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-
+this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b=d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),
+10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?
+this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=
+this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])f=this.containment[0]+
+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?
+g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f-this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():
+e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g==
+f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&&this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",
+f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",
+g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=
+0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});
+d.extend(d.ui.sortable,{version:"1.8.7"})})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.tabs.css b/htmltest/misc/ui/jquery.ui.tabs.css
new file mode 100644
index 00000000..94420e18
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.tabs.css
@@ -0,0 +1,19 @@
+
+/*
+ * jQuery UI Tabs 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
diff --git a/htmltest/misc/ui/jquery.ui.tabs.min.js b/htmltest/misc/ui/jquery.ui.tabs.min.js
new file mode 100644
index 00000000..aeb42bb4
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.tabs.min.js
@@ -0,0 +1,36 @@
+
+/*
+ * jQuery UI Tabs 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&&
+e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=
+d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]||
+(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
+this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));
+this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+
+g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",
+function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};
+this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=
+-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=
+d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b,
+e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);
+j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove();
+if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=b}),function(h){return h>=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null,
+this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this},
+load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c,
+"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},
+url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.7"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&
+a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
diff --git a/htmltest/misc/ui/jquery.ui.theme.css b/htmltest/misc/ui/jquery.ui.theme.css
new file mode 100644
index 00000000..1e622b46
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.theme.css
@@ -0,0 +1,253 @@
+
+/*
+ * jQuery UI CSS Framework 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; }
+.ui-widget-content a { color: #222222/*{fcContent}*/; }
+.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; }
+.ui-widget-header a { color: #222222/*{fcHeader}*/; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-top { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-right {  -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-left { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-all { -moz-border-radius: 4px/*{cornerRadius}*/; -webkit-border-radius: 4px/*{cornerRadius}*/; border-radius: 4px/*{cornerRadius}*/; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; }
+.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; }
diff --git a/htmltest/misc/ui/jquery.ui.widget.min.js b/htmltest/misc/ui/jquery.ui.widget.min.js
new file mode 100644
index 00000000..165a272b
--- /dev/null
+++ b/htmltest/misc/ui/jquery.ui.widget.min.js
@@ -0,0 +1,16 @@
+
+/*!
+ * jQuery UI Widget 1.8.7
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
+a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
+e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
+this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
+widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
+enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
diff --git a/htmltest/misc/vertical-tabs-rtl.css b/htmltest/misc/vertical-tabs-rtl.css
new file mode 100644
index 00000000..7fb0347d
--- /dev/null
+++ b/htmltest/misc/vertical-tabs-rtl.css
@@ -0,0 +1,14 @@
+
+div.vertical-tabs {
+  margin-left: 0;
+  margin-right: 15em;
+}
+.vertical-tabs ul.vertical-tabs-list {
+  margin-left: 0;
+  margin-right: -15em;
+  float: right;
+}
+.vertical-tabs ul.vertical-tabs-list li.selected {
+  border-left-width: 0;
+  border-right-width: 1px;
+}
diff --git a/htmltest/misc/vertical-tabs.css b/htmltest/misc/vertical-tabs.css
new file mode 100644
index 00000000..197fb5f1
--- /dev/null
+++ b/htmltest/misc/vertical-tabs.css
@@ -0,0 +1,80 @@
+
+div.vertical-tabs {
+  margin: 1em 0 1em 15em; /* LTR */
+  border: 1px solid #ccc;
+  position: relative; /* IE6/7 */
+}
+.vertical-tabs ul.vertical-tabs-list {
+  width: 15em;
+  list-style: none;
+  list-style-image: none; /* IE6 */
+  border-top: 1px solid #ccc;
+  padding: 0;
+  position: relative; /* IE6 */
+  margin: -1px 0 -1px -15em; /* LTR */
+  float: left; /* LTR */
+}
+.vertical-tabs fieldset.vertical-tabs-pane {
+  margin: 0 !important;
+  padding: 0 1em;
+  border: 0;
+}
+fieldset.vertical-tabs-pane legend {
+  display: none;
+}
+fieldset.vertical-tabs-pane fieldset legend {
+  display: block;
+}
+
+/* Layout of each tab */
+.vertical-tabs ul.vertical-tabs-list li {
+  background: #eee;
+  border: 1px solid #ccc;
+  border-top: 0;
+  padding: 0;
+  margin: 0;
+  min-width: 0; /* IE7 */
+}
+.vertical-tabs ul.vertical-tabs-list li a {
+  display: block;
+  text-decoration: none;
+  padding: 0.5em 0.6em;
+}
+.vertical-tabs ul.vertical-tabs-list li a:focus strong,
+.vertical-tabs ul.vertical-tabs-list li a:active strong,
+.vertical-tabs ul.vertical-tabs-list li a:hover strong {
+  text-decoration: underline;
+}
+.vertical-tabs ul.vertical-tabs-list li a:hover {
+  outline: 1px dotted;
+}
+.vertical-tabs ul.vertical-tabs-list li.selected {
+  background-color: #fff;
+  border-right-width: 0; /* LTR */
+}
+.vertical-tabs ul.vertical-tabs-list .selected strong {
+  color: #000;
+}
+.vertical-tabs ul.vertical-tabs-list .summary {
+  display: block;
+}
+.vertical-tabs ul.vertical-tabs ul.vertical-tabs-list .summary {
+  line-height: normal;
+  margin-bottom: 0;
+}
+
+/**
+ * Prevent text inputs from overflowing when container is too narrow. "width" is
+ * applied to override hardcoded cols or size attributes and used in conjunction
+ * with "box-sizing" to prevent box model issues from occurring in most browsers.
+*/
+.vertical-tabs .form-type-textfield input {
+  width: 100%;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+}
+* html .vertical-tabs .form-type-textfield,
+* html .vertical-tabs .form-textarea-wrapper {
+  width: 95%; /* IE6 */
+}
diff --git a/htmltest/misc/vertical-tabs.js b/htmltest/misc/vertical-tabs.js
new file mode 100644
index 00000000..ebfaa4f7
--- /dev/null
+++ b/htmltest/misc/vertical-tabs.js
@@ -0,0 +1,195 @@
+
+(function ($) {
+
+/**
+ * This script transforms a set of fieldsets into a stack of vertical
+ * tabs. Another tab pane can be selected by clicking on the respective
+ * tab.
+ *
+ * Each tab may have a summary which can be updated by another
+ * script. For that to work, each fieldset has an associated
+ * 'verticalTabCallback' (with jQuery.data() attached to the fieldset),
+ * which is called every time the user performs an update to a form
+ * element inside the tab pane.
+ */
+Drupal.behaviors.verticalTabs = {
+  attach: function (context) {
+    $('.vertical-tabs-panes', context).once('vertical-tabs', function () {
+      var focusID = $(':hidden.vertical-tabs-active-tab', this).val();
+      var tab_focus;
+
+      // Check if there are some fieldsets that can be converted to vertical-tabs
+      var $fieldsets = $('> fieldset', this);
+      if ($fieldsets.length == 0) {
+        return;
+      }
+
+      // Create the tab column.
+      var tab_list = $('<ul class="vertical-tabs-list"></ul>');
+      $(this).wrap('<div class="vertical-tabs clearfix"></div>').before(tab_list);
+
+      // Transform each fieldset into a tab.
+      $fieldsets.each(function () {
+        var vertical_tab = new Drupal.verticalTab({
+          title: $('> legend', this).text(),
+          fieldset: $(this)
+        });
+        tab_list.append(vertical_tab.item);
+        $(this)
+          .removeClass('collapsible collapsed')
+          .addClass('vertical-tabs-pane')
+          .data('verticalTab', vertical_tab);
+        if (this.id == focusID) {
+          tab_focus = $(this);
+        }
+      });
+
+      $('> li:first', tab_list).addClass('first');
+      $('> li:last', tab_list).addClass('last');
+
+      if (!tab_focus) {
+        // If the current URL has a fragment and one of the tabs contains an
+        // element that matches the URL fragment, activate that tab.
+        if (window.location.hash && $(this).find(window.location.hash).length) {
+          tab_focus = $(this).find(window.location.hash).closest('.vertical-tabs-pane');
+        }
+        else {
+          tab_focus = $('> .vertical-tabs-pane:first', this);
+        }
+      }
+      if (tab_focus.length) {
+        tab_focus.data('verticalTab').focus();
+      }
+    });
+  }
+};
+
+/**
+ * The vertical tab object represents a single tab within a tab group.
+ *
+ * @param settings
+ *   An object with the following keys:
+ *   - title: The name of the tab.
+ *   - fieldset: The jQuery object of the fieldset that is the tab pane.
+ */
+Drupal.verticalTab = function (settings) {
+  var self = this;
+  $.extend(this, settings, Drupal.theme('verticalTab', settings));
+
+  this.link.click(function () {
+    self.focus();
+    return false;
+  });
+
+  // Keyboard events added:
+  // Pressing the Enter key will open the tab pane.
+  this.link.keydown(function(event) {
+    if (event.keyCode == 13) {
+      self.focus();
+      // Set focus on the first input field of the visible fieldset/tab pane.
+      $("fieldset.vertical-tabs-pane :input:visible:enabled:first").focus();
+      return false;
+    }
+  });
+
+  this.fieldset
+    .bind('summaryUpdated', function () {
+      self.updateSummary();
+    })
+    .trigger('summaryUpdated');
+};
+
+Drupal.verticalTab.prototype = {
+  /**
+   * Displays the tab's content pane.
+   */
+  focus: function () {
+    this.fieldset
+      .siblings('fieldset.vertical-tabs-pane')
+        .each(function () {
+          var tab = $(this).data('verticalTab');
+          tab.fieldset.hide();
+          tab.item.removeClass('selected');
+        })
+        .end()
+      .show()
+      .siblings(':hidden.vertical-tabs-active-tab')
+        .val(this.fieldset.attr('id'));
+    this.item.addClass('selected');
+    // Mark the active tab for screen readers.
+    $('#active-vertical-tab').remove();
+    this.link.append('<span id="active-vertical-tab" class="element-invisible">' + Drupal.t('(active tab)') + '</span>');
+  },
+
+  /**
+   * Updates the tab's summary.
+   */
+  updateSummary: function () {
+    this.summary.html(this.fieldset.drupalGetSummary());
+  },
+
+  /**
+   * Shows a vertical tab pane.
+   */
+  tabShow: function () {
+    // Display the tab.
+    this.item.show();
+    // Update .first marker for items. We need recurse from parent to retain the
+    // actual DOM element order as jQuery implements sortOrder, but not as public
+    // method.
+    this.item.parent().children('.vertical-tab-button').removeClass('first')
+      .filter(':visible:first').addClass('first');
+    // Display the fieldset.
+    this.fieldset.removeClass('vertical-tab-hidden').show();
+    // Focus this tab.
+    this.focus();
+    return this;
+  },
+
+  /**
+   * Hides a vertical tab pane.
+   */
+  tabHide: function () {
+    // Hide this tab.
+    this.item.hide();
+    // Update .first marker for items. We need recurse from parent to retain the
+    // actual DOM element order as jQuery implements sortOrder, but not as public
+    // method.
+    this.item.parent().children('.vertical-tab-button').removeClass('first')
+      .filter(':visible:first').addClass('first');
+    // Hide the fieldset.
+    this.fieldset.addClass('vertical-tab-hidden').hide();
+    // Focus the first visible tab (if there is one).
+    var $firstTab = this.fieldset.siblings('.vertical-tabs-pane:not(.vertical-tab-hidden):first');
+    if ($firstTab.length) {
+      $firstTab.data('verticalTab').focus();
+    }
+    return this;
+  }
+};
+
+/**
+ * Theme function for a vertical tab.
+ *
+ * @param settings
+ *   An object with the following keys:
+ *   - title: The name of the tab.
+ * @return
+ *   This function has to return an object with at least these keys:
+ *   - item: The root tab jQuery element
+ *   - link: The anchor tag that acts as the clickable area of the tab
+ *       (jQuery version)
+ *   - summary: The jQuery element that contains the tab summary
+ */
+Drupal.theme.prototype.verticalTab = function (settings) {
+  var tab = {};
+  tab.item = $('<li class="vertical-tab-button" tabindex="-1"></li>')
+    .append(tab.link = $('<a href="#"></a>')
+      .append(tab.title = $('<strong></strong>').text(settings.title))
+      .append(tab.summary = $('<span class="summary"></span>')
+    )
+  );
+  return tab;
+};
+
+})(jQuery);
diff --git a/htmltest/misc/watchdog-error.png b/htmltest/misc/watchdog-error.png
new file mode 100644
index 00000000..db05365a
Binary files /dev/null and b/htmltest/misc/watchdog-error.png differ
diff --git a/htmltest/misc/watchdog-ok.png b/htmltest/misc/watchdog-ok.png
new file mode 100644
index 00000000..1d7baa06
Binary files /dev/null and b/htmltest/misc/watchdog-ok.png differ
diff --git a/htmltest/misc/watchdog-warning.png b/htmltest/misc/watchdog-warning.png
new file mode 100644
index 00000000..d8dced88
Binary files /dev/null and b/htmltest/misc/watchdog-warning.png differ
diff --git a/htmltest/mmenossi b/htmltest/mmenossi
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/mmenossi
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/modules/README.txt b/htmltest/modules/README.txt
new file mode 100644
index 00000000..8928d802
--- /dev/null
+++ b/htmltest/modules/README.txt
@@ -0,0 +1,9 @@
+
+This directory is reserved for core module files. Custom or contributed modules
+should be placed in their own subdirectory of the sites/all/modules directory.
+For multisite installations, they can also be placed in a subdirectory under
+/sites/{sitename}/modules/, where {sitename} is the name of your site (e.g.,
+www.example.com). This will allow you to more easily update Drupal core files.
+
+For more details, see: http://drupal.org/node/176043
+
diff --git a/htmltest/modules/aggregator/aggregator-feed-source.tpl.php b/htmltest/modules/aggregator/aggregator-feed-source.tpl.php
new file mode 100644
index 00000000..f9cfa555
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator-feed-source.tpl.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to present the source of the feed.
+ *
+ * The contents are rendered above feed listings when browsing source feeds.
+ * For example, "example.com/aggregator/sources/1".
+ *
+ * Available variables:
+ * - $source_icon: Feed icon linked to the source. Rendered through
+ *   theme_feed_icon().
+ * - $source_image: Image set by the feed source.
+ * - $source_description: Description set by the feed source.
+ * - $source_url: URL to the feed source.
+ * - $last_checked: How long ago the feed was checked locally.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_aggregator_feed_source()
+ *
+ * @ingroup themeable
+ */
+?>
+<div class="feed-source">
+  <?php print $source_icon; ?>
+  <?php print $source_image; ?>
+  <div class="feed-description">
+    <?php print $source_description; ?>
+  </div>
+  <div class="feed-url">
+    <em><?php print t('URL:'); ?></em> <a href="<?php print $source_url; ?>"><?php print $source_url; ?></a>
+  </div>
+  <div class="feed-updated">
+    <em><?php print t('Updated:'); ?></em> <?php print $last_checked; ?>
+  </div>
+</div>
diff --git a/htmltest/modules/aggregator/aggregator-item.tpl.php b/htmltest/modules/aggregator/aggregator-item.tpl.php
new file mode 100644
index 00000000..74b2284c
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator-item.tpl.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to format an individual feed item for display
+ * on the aggregator page.
+ *
+ * Available variables:
+ * - $feed_url: URL to the originating feed item.
+ * - $feed_title: Title of the feed item.
+ * - $source_url: Link to the local source section.
+ * - $source_title: Title of the remote source.
+ * - $source_date: Date the feed was posted on the remote source.
+ * - $content: Feed item content.
+ * - $categories: Linked categories assigned to the feed.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_aggregator_item()
+ *
+ * @ingroup themeable
+ */
+?>
+<div class="feed-item">
+  <h3 class="feed-item-title">
+    <a href="<?php print $feed_url; ?>"><?php print $feed_title; ?></a>
+  </h3>
+
+  <div class="feed-item-meta">
+  <?php if ($source_url): ?>
+    <a href="<?php print $source_url; ?>" class="feed-item-source"><?php print $source_title; ?></a> -
+  <?php endif; ?>
+    <span class="feed-item-date"><?php print $source_date; ?></span>
+  </div>
+
+<?php if ($content): ?>
+  <div class="feed-item-body">
+    <?php print $content; ?>
+  </div>
+<?php endif; ?>
+
+<?php if ($categories): ?>
+  <div class="feed-item-categories">
+    <?php print t('Categories'); ?>: <?php print implode(', ', $categories); ?>
+  </div>
+<?php endif ;?>
+
+</div>
diff --git a/htmltest/modules/aggregator/aggregator-rtl.css b/htmltest/modules/aggregator/aggregator-rtl.css
new file mode 100644
index 00000000..057d0156
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator-rtl.css
@@ -0,0 +1,7 @@
+/**
+ * Right-to-Left styles for theme in the Aggregator module.
+ */
+
+#aggregator .feed-source .feed-icon {
+  float: left;
+}
diff --git a/htmltest/modules/aggregator/aggregator-summary-item.tpl.php b/htmltest/modules/aggregator/aggregator-summary-item.tpl.php
new file mode 100644
index 00000000..f9199a52
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator-summary-item.tpl.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to present a linked feed item for summaries.
+ *
+ * Available variables:
+ * - $feed_url: Link to originating feed.
+ * - $feed_title: Title of feed.
+ * - $feed_age: Age of remote feed.
+ * - $source_url: Link to remote source.
+ * - $source_title: Locally set title for the source.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_aggregator_summary_item()
+ *
+ * @ingroup themeable
+ */
+?>
+<a href="<?php print $feed_url; ?>"><?php print $feed_title; ?></a>
+<span class="age"><?php print $feed_age; ?></span>
+
+<?php if ($source_url): ?>,
+  <span class="source"><a href="<?php print $source_url; ?>"><?php print $source_title; ?></a></span>
+<?php endif; ?>
diff --git a/htmltest/modules/aggregator/aggregator-summary-items.tpl.php b/htmltest/modules/aggregator/aggregator-summary-items.tpl.php
new file mode 100644
index 00000000..4a0551d7
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator-summary-items.tpl.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to present feeds as list items.
+ *
+ * Each iteration generates a single feed source or category.
+ *
+ * Available variables:
+ * - $title: Title of the feed or category.
+ * - $summary_list: Unordered list of linked feed items generated through
+ *   theme_item_list().
+ * - $source_url: URL to the local source or category.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_aggregator_summary_items()
+ *
+ * @ingroup themeable
+ */
+?>
+<h3><?php print $title; ?></h3>
+<?php print $summary_list; ?>
+<div class="links">
+  <a href="<?php print $source_url; ?>"><?php print t('More'); ?></a>
+</div>
diff --git a/htmltest/modules/aggregator/aggregator-wrapper.tpl.php b/htmltest/modules/aggregator/aggregator-wrapper.tpl.php
new file mode 100644
index 00000000..2fa51a70
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator-wrapper.tpl.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to wrap aggregator content.
+ *
+ * Available variables:
+ * - $content: All aggregator content.
+ * - $page: Pager links rendered through theme_pager().
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_aggregator_wrapper()
+ *
+ * @ingroup themeable
+ */
+?>
+<div id="aggregator">
+  <?php print $content; ?>
+  <?php print $pager; ?>
+</div>
diff --git a/htmltest/modules/aggregator/aggregator.admin.inc b/htmltest/modules/aggregator/aggregator.admin.inc
new file mode 100644
index 00000000..443facb1
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator.admin.inc
@@ -0,0 +1,633 @@
+<?php
+
+/**
+ * @file
+ * Administration page callbacks for the Aggregator module.
+ */
+
+/**
+ * Page callback: Displays the Aggregator module administration page.
+ */
+function aggregator_admin_overview() {
+  return aggregator_view();
+}
+
+/**
+ * Displays the aggregator administration page.
+ *
+ * @return
+ *   A HTML-formatted string with administration page content.
+ */
+function aggregator_view() {
+  $result = db_query('SELECT f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.hash, f.etag, f.modified, f.image, f.block, COUNT(i.iid) AS items FROM {aggregator_feed} f LEFT JOIN {aggregator_item} i ON f.fid = i.fid GROUP BY f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.hash, f.etag, f.modified, f.image, f.block ORDER BY f.title');
+
+  $output = '<h3>' . t('Feed overview') . '</h3>';
+
+  $header = array(t('Title'), t('Items'), t('Last update'), t('Next update'), array('data' => t('Operations'), 'colspan' => '3'));
+  $rows = array();
+  foreach ($result as $feed) {
+    $rows[] = array(
+      l($feed->title, "aggregator/sources/$feed->fid"),
+      format_plural($feed->items, '1 item', '@count items'),
+      ($feed->checked ? t('@time ago', array('@time' => format_interval(REQUEST_TIME - $feed->checked))) : t('never')),
+      ($feed->checked && $feed->refresh ? t('%time left', array('%time' => format_interval($feed->checked + $feed->refresh - REQUEST_TIME))) : t('never')),
+      l(t('edit'), "admin/config/services/aggregator/edit/feed/$feed->fid"),
+      l(t('remove items'), "admin/config/services/aggregator/remove/$feed->fid"),
+      l(t('update items'), "admin/config/services/aggregator/update/$feed->fid", array('query' => array('token' => drupal_get_token("aggregator/update/$feed->fid")))),
+    );
+  }
+  $output .= theme('table', array('header' => $header, 'rows' => $rows, 'empty' => t('No feeds available. <a href="@link">Add feed</a>.', array('@link' => url('admin/config/services/aggregator/add/feed')))));
+
+  $result = db_query('SELECT c.cid, c.title, COUNT(ci.iid) as items FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid GROUP BY c.cid, c.title ORDER BY title');
+
+  $output .= '<h3>' . t('Category overview') . '</h3>';
+
+  $header = array(t('Title'), t('Items'), t('Operations'));
+  $rows = array();
+  foreach ($result as $category) {
+    $rows[] = array(l($category->title, "aggregator/categories/$category->cid"), format_plural($category->items, '1 item', '@count items'), l(t('edit'), "admin/config/services/aggregator/edit/category/$category->cid"));
+  }
+  $output .= theme('table', array('header' => $header, 'rows' => $rows, 'empty' => t('No categories available. <a href="@link">Add category</a>.', array('@link' => url('admin/config/services/aggregator/add/category')))));
+
+  return $output;
+}
+
+/**
+ * Form constructor for adding and editing feed sources.
+ *
+ * @param $feed
+ *   (optional) If editing a feed, the feed to edit as a PHP stdClass value; if
+ *   adding a new feed, NULL. Defaults to NULL.
+ *
+ * @ingroup forms
+ * @see aggregator_form_feed_validate()
+ * @see aggregator_form_feed_submit()
+ */
+function aggregator_form_feed($form, &$form_state, stdClass $feed = NULL) {
+  $period = drupal_map_assoc(array(900, 1800, 3600, 7200, 10800, 21600, 32400, 43200, 64800, 86400, 172800, 259200, 604800, 1209600, 2419200), 'format_interval');
+  $period[AGGREGATOR_CLEAR_NEVER] = t('Never');
+
+  $form['title'] = array('#type' => 'textfield',
+    '#title' => t('Title'),
+    '#default_value' => isset($feed->title) ? $feed->title : '',
+    '#maxlength' => 255,
+    '#description' => t('The name of the feed (or the name of the website providing the feed).'),
+    '#required' => TRUE,
+  );
+  $form['url'] = array('#type' => 'textfield',
+    '#title' => t('URL'),
+    '#default_value' => isset($feed->url) ? $feed->url : '',
+    '#maxlength' => NULL,
+    '#description' => t('The fully-qualified URL of the feed.'),
+    '#required' => TRUE,
+  );
+  $form['refresh'] = array('#type' => 'select',
+    '#title' => t('Update interval'),
+    '#default_value' => isset($feed->refresh) ? $feed->refresh : 3600,
+    '#options' => $period,
+    '#description' => t('The length of time between feed updates. Requires a correctly configured <a href="@cron">cron maintenance task</a>.', array('@cron' => url('admin/reports/status'))),
+  );
+  $form['block'] = array('#type' => 'select',
+    '#title' => t('News items in block'),
+    '#default_value' => isset($feed->block) ? $feed->block : 5,
+    '#options' => drupal_map_assoc(array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)),
+    '#description' => t("Drupal can make a block with the most recent news items of this feed. You can <a href=\"@block-admin\">configure blocks</a> to be displayed in the sidebar of your page. This setting lets you configure the number of news items to show in this feed's block. If you choose '0' this feed's block will be disabled.", array('@block-admin' => url('admin/structure/block'))),
+  );
+
+  // Handling of categories.
+  $options = array();
+  $values = array();
+  $categories = db_query('SELECT c.cid, c.title, f.fid FROM {aggregator_category} c LEFT JOIN {aggregator_category_feed} f ON c.cid = f.cid AND f.fid = :fid ORDER BY title', array(':fid' => isset($feed->fid) ? $feed->fid : NULL));
+  foreach ($categories as $category) {
+    $options[$category->cid] = check_plain($category->title);
+    if ($category->fid) $values[] = $category->cid;
+  }
+
+  if ($options) {
+    $form['category'] = array(
+      '#type' => 'checkboxes',
+      '#title' => t('Categorize news items'),
+      '#default_value' => $values,
+      '#options' => $options,
+      '#description' => t('New feed items are automatically filed in the checked categories.'),
+    );
+  }
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+  );
+  if (!empty($feed->fid)) {
+    $form['actions']['delete'] = array(
+      '#type' => 'submit',
+      '#value' => t('Delete'),
+    );
+    $form['fid'] = array(
+      '#type' => 'hidden',
+      '#value' => $feed->fid,
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Form validation handler for aggregator_form_feed().
+ *
+ * @see aggregator_form_feed_submit()
+ */
+function aggregator_form_feed_validate($form, &$form_state) {
+  if ($form_state['values']['op'] == t('Save')) {
+    // Ensure URL is valid.
+    if (!valid_url($form_state['values']['url'], TRUE)) {
+      form_set_error('url', t('The URL %url is invalid. Enter a fully-qualified URL, such as http://www.example.com/feed.xml.', array('%url' => $form_state['values']['url'])));
+    }
+    // Check for duplicate titles.
+    if (isset($form_state['values']['fid'])) {
+      $result = db_query("SELECT title, url FROM {aggregator_feed} WHERE (title = :title OR url = :url) AND fid <> :fid", array(':title' => $form_state['values']['title'], ':url' => $form_state['values']['url'], ':fid' => $form_state['values']['fid']));
+    }
+    else {
+      $result = db_query("SELECT title, url FROM {aggregator_feed} WHERE title = :title OR url = :url", array(':title' => $form_state['values']['title'], ':url' => $form_state['values']['url']));
+    }
+    foreach ($result as $feed) {
+      if (strcasecmp($feed->title, $form_state['values']['title']) == 0) {
+        form_set_error('title', t('A feed named %feed already exists. Enter a unique title.', array('%feed' => $form_state['values']['title'])));
+      }
+      if (strcasecmp($feed->url, $form_state['values']['url']) == 0) {
+        form_set_error('url', t('A feed with this URL %url already exists. Enter a unique URL.', array('%url' => $form_state['values']['url'])));
+      }
+    }
+  }
+}
+
+/**
+ * Form submission handler for aggregator_form_feed().
+ *
+ * @see aggregator_form_feed_validate()
+ *
+ * @todo Add delete confirmation dialog.
+ */
+function aggregator_form_feed_submit($form, &$form_state) {
+  if ($form_state['values']['op'] == t('Delete')) {
+    $title = $form_state['values']['title'];
+    // Unset the title.
+    unset($form_state['values']['title']);
+  }
+  aggregator_save_feed($form_state['values']);
+  if (isset($form_state['values']['fid'])) {
+    if (isset($form_state['values']['title'])) {
+      drupal_set_message(t('The feed %feed has been updated.', array('%feed' => $form_state['values']['title'])));
+      if (arg(0) == 'admin') {
+        $form_state['redirect'] = 'admin/config/services/aggregator/';
+        return;
+      }
+      else {
+        $form_state['redirect'] = 'aggregator/sources/' . $form_state['values']['fid'];
+        return;
+      }
+    }
+    else {
+      watchdog('aggregator', 'Feed %feed deleted.', array('%feed' => $title));
+      drupal_set_message(t('The feed %feed has been deleted.', array('%feed' => $title)));
+      if (arg(0) == 'admin') {
+        $form_state['redirect'] = 'admin/config/services/aggregator/';
+        return;
+      }
+      else {
+        $form_state['redirect'] = 'aggregator/sources/';
+        return;
+      }
+    }
+  }
+  else {
+    watchdog('aggregator', 'Feed %feed added.', array('%feed' => $form_state['values']['title']), WATCHDOG_NOTICE, l(t('view'), 'admin/config/services/aggregator'));
+    drupal_set_message(t('The feed %feed has been added.', array('%feed' => $form_state['values']['title'])));
+  }
+}
+
+/**
+ * Deletes a feed.
+ *
+ * @param $feed
+ *   An associative array describing the feed to be cleared.
+ *
+ * @see aggregator_admin_remove_feed_submit()
+ */
+function aggregator_admin_remove_feed($form, $form_state, $feed) {
+  return confirm_form(
+    array(
+      'feed' => array(
+        '#type' => 'value',
+        '#value' => $feed,
+      ),
+    ),
+    t('Are you sure you want to remove all items from the feed %feed?', array('%feed' => $feed->title)),
+    'admin/config/services/aggregator',
+    t('This action cannot be undone.'),
+    t('Remove items'),
+    t('Cancel')
+  );
+}
+
+/**
+ * Form submission handler for aggregator_admin_remove_feed().
+ *
+ * Removes all items from a feed and redirects to the overview page.
+ */
+function aggregator_admin_remove_feed_submit($form, &$form_state) {
+  aggregator_remove($form_state['values']['feed']);
+  $form_state['redirect'] = 'admin/config/services/aggregator';
+}
+
+/**
+ * Form constructor for importing feeds from OPML.
+ *
+ * @ingroup forms
+ * @see aggregator_form_opml_validate()
+ * @see aggregator_form_opml_submit()
+ */
+function aggregator_form_opml($form, &$form_state) {
+  $period = drupal_map_assoc(array(900, 1800, 3600, 7200, 10800, 21600, 32400, 43200, 64800, 86400, 172800, 259200, 604800, 1209600, 2419200), 'format_interval');
+
+  $form['upload'] = array(
+    '#type' => 'file',
+    '#title' => t('OPML File'),
+    '#description' => t('Upload an OPML file containing a list of feeds to be imported.'),
+  );
+  $form['remote'] = array(
+    '#type' => 'textfield',
+    '#title' => t('OPML Remote URL'),
+    '#maxlength' => 1024,
+    '#description' => t('Enter the URL of an OPML file. This file will be downloaded and processed only once on submission of the form.'),
+  );
+  $form['refresh'] = array(
+    '#type' => 'select',
+    '#title' => t('Update interval'),
+    '#default_value' => 3600,
+    '#options' => $period,
+    '#description' => t('The length of time between feed updates. Requires a correctly configured <a href="@cron">cron maintenance task</a>.', array('@cron' => url('admin/reports/status'))),
+  );
+  $form['block'] = array('#type' => 'select',
+    '#title' => t('News items in block'),
+    '#default_value' => 5,
+    '#options' => drupal_map_assoc(array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)),
+    '#description' => t("Drupal can make a block with the most recent news items of a feed. You can <a href=\"@block-admin\">configure blocks</a> to be displayed in the sidebar of your page. This setting lets you configure the number of news items to show in a feed's block. If you choose '0' these feeds' blocks will be disabled.", array('@block-admin' => url('admin/structure/block'))),
+  );
+
+  // Handling of categories.
+  $options = array_map('check_plain', db_query("SELECT cid, title FROM {aggregator_category} ORDER BY title")->fetchAllKeyed());
+  if ($options) {
+    $form['category'] = array(
+      '#type' => 'checkboxes',
+      '#title' => t('Categorize news items'),
+      '#options' => $options,
+      '#description' => t('New feed items are automatically filed in the checked categories.'),
+    );
+  }
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Import')
+  );
+
+  return $form;
+}
+
+/**
+ * Form validation handler for aggregator_form_opml().
+ *
+ * @see aggregator_form_opml_submit()
+ */
+function aggregator_form_opml_validate($form, &$form_state) {
+  // If both fields are empty or filled, cancel.
+  if (empty($form_state['values']['remote']) == empty($_FILES['files']['name']['upload'])) {
+    form_set_error('remote', t('You must <em>either</em> upload a file or enter a URL.'));
+  }
+
+  // Validate the URL, if one was entered.
+  if (!empty($form_state['values']['remote']) && !valid_url($form_state['values']['remote'], TRUE)) {
+    form_set_error('remote', t('This URL is not valid.'));
+  }
+}
+
+/**
+ * Form submission handler for aggregator_form_opml().
+ *
+ * @see aggregator_form_opml_validate()
+ */
+function aggregator_form_opml_submit($form, &$form_state) {
+  $data = '';
+  $validators = array('file_validate_extensions' => array('opml xml'));
+  if ($file = file_save_upload('upload', $validators)) {
+    $data = file_get_contents($file->uri);
+  }
+  else {
+    $response = drupal_http_request($form_state['values']['remote']);
+    if (!isset($response->error)) {
+      $data = $response->data;
+    }
+  }
+
+  $feeds = _aggregator_parse_opml($data);
+  if (empty($feeds)) {
+    drupal_set_message(t('No new feed has been added.'));
+    return;
+  }
+
+  $form_state['values']['op'] = t('Save');
+
+  foreach ($feeds as $feed) {
+    // Ensure URL is valid.
+    if (!valid_url($feed['url'], TRUE)) {
+      drupal_set_message(t('The URL %url is invalid.', array('%url' => $feed['url'])), 'warning');
+      continue;
+    }
+
+    // Check for duplicate titles or URLs.
+    $result = db_query("SELECT title, url FROM {aggregator_feed} WHERE title = :title OR url = :url", array(':title' => $feed['title'], ':url' => $feed['url']));
+    foreach ($result as $old) {
+      if (strcasecmp($old->title, $feed['title']) == 0) {
+        drupal_set_message(t('A feed named %title already exists.', array('%title' => $old->title)), 'warning');
+        continue 2;
+      }
+      if (strcasecmp($old->url, $feed['url']) == 0) {
+        drupal_set_message(t('A feed with the URL %url already exists.', array('%url' => $old->url)), 'warning');
+        continue 2;
+      }
+    }
+
+    $form_state['values']['title'] = $feed['title'];
+    $form_state['values']['url'] = $feed['url'];
+    drupal_form_submit('aggregator_form_feed', $form_state);
+  }
+
+  $form_state['redirect'] = 'admin/config/services/aggregator';
+}
+
+/**
+ * Parses an OPML file.
+ *
+ * Feeds are recognized as <outline> elements with the attributes "text" and
+ * "xmlurl" set.
+ *
+ * @param $opml
+ *   The complete contents of an OPML document.
+ *
+ * @return
+ *   An array of feeds, each an associative array with a "title" and a "url"
+ *   element, or NULL if the OPML document failed to be parsed. An empty array
+ *   will be returned if the document is valid but contains no feeds, as some
+ *   OPML documents do.
+ */
+function _aggregator_parse_opml($opml) {
+  $feeds = array();
+  $xml_parser = drupal_xml_parser_create($opml);
+  if (xml_parse_into_struct($xml_parser, $opml, $values)) {
+    foreach ($values as $entry) {
+      if ($entry['tag'] == 'OUTLINE' && isset($entry['attributes'])) {
+        $item = $entry['attributes'];
+        if (!empty($item['XMLURL']) && !empty($item['TEXT'])) {
+          $feeds[] = array('title' => $item['TEXT'], 'url' => $item['XMLURL']);
+        }
+      }
+    }
+  }
+  xml_parser_free($xml_parser);
+
+  return $feeds;
+}
+
+/**
+ * Page callback: Refreshes a feed, then redirects to the overview page.
+ *
+ * @param $feed
+ *   An object describing the feed to be refreshed.
+ */
+function aggregator_admin_refresh_feed($feed) {
+  if (!isset($_GET['token']) || !drupal_valid_token($_GET['token'], 'aggregator/update/' . $feed->fid)) {
+    return MENU_ACCESS_DENIED;
+  }
+  aggregator_refresh($feed);
+  drupal_goto('admin/config/services/aggregator');
+}
+
+/**
+ * Form constructor for the aggregator system settings.
+ *
+ * @see aggregator_admin_form_submit()
+ * @ingroup forms
+ */
+function aggregator_admin_form($form, $form_state) {
+  // Global aggregator settings.
+  $form['aggregator_allowed_html_tags'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Allowed HTML tags'),
+    '#size' => 80,
+    '#maxlength' => 255,
+    '#default_value' => variable_get('aggregator_allowed_html_tags', '<a> <b> <br> <dd> <dl> <dt> <em> <i> <li> <ol> <p> <strong> <u> <ul>'),
+    '#description' => t('A space-separated list of HTML tags allowed in the content of feed items. Disallowed tags are stripped from the content.'),
+  );
+
+  // Make sure configuration is sane.
+  aggregator_sanitize_configuration();
+
+  // Get all available fetchers.
+  $fetchers = module_implements('aggregator_fetch');
+  foreach ($fetchers as $k => $module) {
+    if ($info = module_invoke($module, 'aggregator_fetch_info')) {
+      $label = $info['title'] . ' <span class="description">' . $info['description'] . '</span>';
+    }
+    else {
+      $label = $module;
+    }
+    unset($fetchers[$k]);
+    $fetchers[$module] = $label;
+  }
+
+  // Get all available parsers.
+  $parsers = module_implements('aggregator_parse');
+  foreach ($parsers as $k => $module) {
+    if ($info = module_invoke($module, 'aggregator_parse_info')) {
+      $label = $info['title'] . ' <span class="description">' . $info['description'] . '</span>';
+    }
+    else {
+      $label = $module;
+    }
+    unset($parsers[$k]);
+    $parsers[$module] = $label;
+  }
+
+  // Get all available processors.
+  $processors = module_implements('aggregator_process');
+  foreach ($processors as $k => $module) {
+    if ($info = module_invoke($module, 'aggregator_process_info')) {
+      $label = $info['title'] . ' <span class="description">' . $info['description'] . '</span>';
+    }
+    else {
+      $label = $module;
+    }
+    unset($processors[$k]);
+    $processors[$module] = $label;
+  }
+
+  // Only show basic configuration if there are actually options.
+  $basic_conf = array();
+  if (count($fetchers) > 1) {
+    $basic_conf['aggregator_fetcher'] = array(
+      '#type' => 'radios',
+      '#title' => t('Fetcher'),
+      '#description' => t('Fetchers download data from an external source. Choose a fetcher suitable for the external source you would like to download from.'),
+      '#options' => $fetchers,
+      '#default_value' => variable_get('aggregator_fetcher', 'aggregator'),
+    );
+  }
+  if (count($parsers) > 1) {
+    $basic_conf['aggregator_parser'] = array(
+      '#type' => 'radios',
+      '#title' => t('Parser'),
+      '#description' => t('Parsers transform downloaded data into standard structures. Choose a parser suitable for the type of feeds you would like to aggregate.'),
+      '#options' => $parsers,
+      '#default_value' => variable_get('aggregator_parser', 'aggregator'),
+    );
+  }
+  if (count($processors) > 1) {
+    $basic_conf['aggregator_processors'] = array(
+      '#type' => 'checkboxes',
+      '#title' => t('Processors'),
+      '#description' => t('Processors act on parsed feed data, for example they store feed items. Choose the processors suitable for your task.'),
+      '#options' => $processors,
+      '#default_value' => variable_get('aggregator_processors', array('aggregator')),
+    );
+  }
+  if (count($basic_conf)) {
+    $form['basic_conf'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Basic configuration'),
+      '#description' => t('For most aggregation tasks, the default settings are fine.'),
+      '#collapsible' => TRUE,
+      '#collapsed' => FALSE,
+      );
+    $form['basic_conf'] += $basic_conf;
+  }
+
+  // Implementing modules will expect an array at $form['modules'].
+  $form['modules'] = array();
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save configuration'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form submission handler for aggregator_admin_form().
+ */
+function aggregator_admin_form_submit($form, &$form_state) {
+  if (isset($form_state['values']['aggregator_processors'])) {
+    $form_state['values']['aggregator_processors'] = array_filter($form_state['values']['aggregator_processors']);
+  }
+  system_settings_form_submit($form, $form_state);
+}
+
+/**
+ * Form constructor to add/edit/delete aggregator categories.
+ *
+ * @param $edit
+ *   An associative array containing:
+ *   - title: A string to use for the category title.
+ *   - description: A string to use for the category description.
+ *   - cid: The category ID.
+ *
+ * @ingroup forms
+ * @see aggregator_form_category_validate()
+ * @see aggregator_form_category_submit()
+ */
+function aggregator_form_category($form, &$form_state, $edit = array('title' => '', 'description' => '', 'cid' => NULL)) {
+  $form['title'] = array('#type' => 'textfield',
+    '#title' => t('Title'),
+    '#default_value' => $edit['title'],
+    '#maxlength' => 64,
+    '#required' => TRUE,
+  );
+  $form['description'] = array('#type' => 'textarea',
+    '#title' => t('Description'),
+    '#default_value' => $edit['description'],
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save'));
+  if ($edit['cid']) {
+    $form['actions']['delete'] = array('#type' => 'submit', '#value' => t('Delete'));
+    $form['cid'] = array('#type' => 'hidden', '#value' => $edit['cid']);
+  }
+
+  return $form;
+}
+
+/**
+ * Form validation handler for aggregator_form_category().
+ *
+ * @see aggregator_form_category_submit()
+ */
+function aggregator_form_category_validate($form, &$form_state) {
+  if ($form_state['values']['op'] == t('Save')) {
+    // Check for duplicate titles
+    if (isset($form_state['values']['cid'])) {
+      $category = db_query("SELECT cid FROM {aggregator_category} WHERE title = :title AND cid <> :cid", array(':title' => $form_state['values']['title'], ':cid' => $form_state['values']['cid']))->fetchObject();
+    }
+    else {
+      $category = db_query("SELECT cid FROM {aggregator_category} WHERE title = :title", array(':title' => $form_state['values']['title']))->fetchObject();
+    }
+    if ($category) {
+      form_set_error('title', t('A category named %category already exists. Enter a unique title.', array('%category' => $form_state['values']['title'])));
+    }
+  }
+}
+
+/**
+ * Form submission handler for aggregator_form_category().
+ *
+ * @see aggregator_form_category_validate()
+ *
+ * @todo Add delete confirmation dialog.
+ */
+function aggregator_form_category_submit($form, &$form_state) {
+  if ($form_state['values']['op'] == t('Delete')) {
+    $title = $form_state['values']['title'];
+    // Unset the title.
+    unset($form_state['values']['title']);
+  }
+  aggregator_save_category($form_state['values']);
+  if (isset($form_state['values']['cid'])) {
+    if (isset($form_state['values']['title'])) {
+      drupal_set_message(t('The category %category has been updated.', array('%category' => $form_state['values']['title'])));
+      if (arg(0) == 'admin') {
+        $form_state['redirect'] = 'admin/config/services/aggregator/';
+        return;
+      }
+      else {
+        $form_state['redirect'] = 'aggregator/categories/' . $form_state['values']['cid'];
+        return;
+      }
+    }
+    else {
+      watchdog('aggregator', 'Category %category deleted.', array('%category' => $title));
+      drupal_set_message(t('The category %category has been deleted.', array('%category' => $title)));
+      if (arg(0) == 'admin') {
+        $form_state['redirect'] = 'admin/config/services/aggregator/';
+        return;
+      }
+      else {
+        $form_state['redirect'] = 'aggregator/categories/';
+        return;
+      }
+    }
+  }
+  else {
+    watchdog('aggregator', 'Category %category added.', array('%category' => $form_state['values']['title']), WATCHDOG_NOTICE, l(t('view'), 'admin/config/services/aggregator'));
+    drupal_set_message(t('The category %category has been added.', array('%category' => $form_state['values']['title'])));
+  }
+}
diff --git a/htmltest/modules/aggregator/aggregator.api.php b/htmltest/modules/aggregator/aggregator.api.php
new file mode 100644
index 00000000..d5cac4ec
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator.api.php
@@ -0,0 +1,220 @@
+<?php
+
+/**
+ * @file
+ * Documentation for aggregator API.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Create an alternative fetcher for aggregator.module.
+ *
+ * A fetcher downloads feed data to a Drupal site. The fetcher is called at the
+ * first of the three aggregation stages: first, data is downloaded by the
+ * active fetcher; second, it is converted to a common format by the active
+ * parser; and finally, it is passed to all active processors, which manipulate
+ * or store the data.
+ *
+ * Modules that define this hook can be set as the active fetcher within the
+ * configuration page. Only one fetcher can be active at a time.
+ *
+ * @param $feed
+ *   A feed object representing the resource to be downloaded. $feed->url
+ *   contains the link to the feed. Download the data at the URL and expose it
+ *   to other modules by attaching it to $feed->source_string.
+ *
+ * @return
+ *   TRUE if fetching was successful, FALSE otherwise.
+ *
+ * @see hook_aggregator_fetch_info()
+ * @see hook_aggregator_parse()
+ * @see hook_aggregator_process()
+ *
+ * @ingroup aggregator
+ */
+function hook_aggregator_fetch($feed) {
+  $feed->source_string = mymodule_fetch($feed->url);
+}
+
+/**
+ * Specify the title and short description of your fetcher.
+ *
+ * The title and the description provided are shown within the configuration
+ * page. Use as title the human readable name of the fetcher and as description
+ * a brief (40 to 80 characters) explanation of the fetcher's functionality.
+ *
+ * This hook is only called if your module implements hook_aggregator_fetch().
+ * If this hook is not implemented aggregator will use your module's file name
+ * as title and there will be no description.
+ *
+ * @return
+ *   An associative array defining a title and a description string.
+ *
+ * @see hook_aggregator_fetch()
+ *
+ * @ingroup aggregator
+ */
+function hook_aggregator_fetch_info() {
+  return array(
+    'title' => t('Default fetcher'),
+    'description' => t('Default fetcher for resources available by URL.'),
+  );
+}
+
+/**
+ * Create an alternative parser for aggregator module.
+ *
+ * A parser converts feed item data to a common format. The parser is called
+ * at the second of the three aggregation stages: first, data is downloaded
+ * by the active fetcher; second, it is converted to a common format by the
+ * active parser; and finally, it is passed to all active processors which
+ * manipulate or store the data.
+ *
+ * Modules that define this hook can be set as the active parser within the
+ * configuration page. Only one parser can be active at a time.
+ *
+ * @param $feed
+ *   An object describing the resource to be parsed. $feed->source_string
+ *   contains the raw feed data. The hook implementation should parse this data
+ *   and add the following properties to the $feed object:
+ *   - description: The human-readable description of the feed.
+ *   - link: A full URL that directly relates to the feed.
+ *   - image: An image URL used to display an image of the feed.
+ *   - etag: An entity tag from the HTTP header used for cache validation to
+ *     determine if the content has been changed.
+ *   - modified: The UNIX timestamp when the feed was last modified.
+ *   - items: An array of feed items. The common format for a single feed item
+ *     is an associative array containing:
+ *     - title: The human-readable title of the feed item.
+ *     - description: The full body text of the item or a summary.
+ *     - timestamp: The UNIX timestamp when the feed item was last published.
+ *     - author: The author of the feed item.
+ *     - guid: The global unique identifier (GUID) string that uniquely
+ *       identifies the item. If not available, the link is used to identify
+ *       the item.
+ *     - link: A full URL to the individual feed item.
+ *
+ * @return
+ *   TRUE if parsing was successful, FALSE otherwise.
+ *
+ * @see hook_aggregator_parse_info()
+ * @see hook_aggregator_fetch()
+ * @see hook_aggregator_process()
+ *
+ * @ingroup aggregator
+ */
+function hook_aggregator_parse($feed) {
+  if ($items = mymodule_parse($feed->source_string)) {
+    $feed->items = $items;
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
+ * Specify the title and short description of your parser.
+ *
+ * The title and the description provided are shown within the configuration
+ * page. Use as title the human readable name of the parser and as description
+ * a brief (40 to 80 characters) explanation of the parser's functionality.
+ *
+ * This hook is only called if your module implements hook_aggregator_parse().
+ * If this hook is not implemented aggregator will use your module's file name
+ * as title and there will be no description.
+ *
+ * @return
+ *   An associative array defining a title and a description string.
+ *
+ * @see hook_aggregator_parse()
+ *
+ * @ingroup aggregator
+ */
+function hook_aggregator_parse_info() {
+  return array(
+    'title' => t('Default parser'),
+    'description' => t('Default parser for RSS, Atom and RDF feeds.'),
+  );
+}
+
+/**
+ * Create a processor for aggregator.module.
+ *
+ * A processor acts on parsed feed data. Active processors are called at the
+ * third and last of the aggregation stages: first, data is downloaded by the
+ * active fetcher; second, it is converted to a common format by the active
+ * parser; and finally, it is passed to all active processors that manipulate or
+ * store the data.
+ *
+ * Modules that define this hook can be activated as a processor within the
+ * configuration page.
+ *
+ * @param $feed
+ *   A feed object representing the resource to be processed. $feed->items
+ *   contains an array of feed items downloaded and parsed at the parsing stage.
+ *   See hook_aggregator_parse() for the basic format of a single item in the
+ *   $feed->items array. For the exact format refer to the particular parser in
+ *   use.
+ *
+ * @see hook_aggregator_process_info()
+ * @see hook_aggregator_fetch()
+ * @see hook_aggregator_parse()
+ *
+ * @ingroup aggregator
+ */
+function hook_aggregator_process($feed) {
+  foreach ($feed->items as $item) {
+    mymodule_save($item);
+  }
+}
+
+/**
+ * Specify the title and short description of your processor.
+ *
+ * The title and the description provided are shown within the configuration
+ * page. Use as title the natural name of the processor and as description a
+ * brief (40 to 80 characters) explanation of the functionality.
+ *
+ * This hook is only called if your module implements hook_aggregator_process().
+ * If this hook is not implemented aggregator will use your module's file name
+ * as title and there will be no description.
+ *
+ * @return
+ *   An associative array defining a title and a description string.
+ *
+ * @see hook_aggregator_process()
+ *
+ * @ingroup aggregator
+ */
+function hook_aggregator_process_info() {
+  return array(
+    'title' => t('Default processor'),
+    'description' => t('Creates lightweight records of feed items.'),
+  );
+}
+
+/**
+ * Remove stored feed data.
+ *
+ * Aggregator calls this hook if either a feed is deleted or a user clicks on
+ * "remove items".
+ *
+ * If your module stores feed items for example on hook_aggregator_process() it
+ * is recommended to implement this hook and to remove data related to $feed
+ * when called.
+ *
+ * @param $feed
+ *   The $feed object whose items are being removed.
+ *
+ * @ingroup aggregator
+ */
+function hook_aggregator_remove($feed) {
+  mymodule_remove_items($feed->fid);
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/aggregator/aggregator.css b/htmltest/modules/aggregator/aggregator.css
new file mode 100644
index 00000000..4285631e
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator.css
@@ -0,0 +1,41 @@
+/**
+ * Styles for theme in the Aggregator module.
+ */
+
+#aggregator .feed-source .feed-title {
+  margin-top: 0;
+}
+#aggregator .feed-source .feed-image img {
+  margin-bottom: 0.75em;
+}
+#aggregator .feed-source .feed-icon {
+  float: right; /* LTR */
+  display: block;
+}
+#aggregator .feed-item {
+  margin-bottom: 1.5em;
+}
+#aggregator .feed-item-title {
+  margin-bottom: 0;
+  font-size: 1.3em;
+}
+#aggregator .feed-item-meta,
+#aggregator .feed-item-body {
+  margin-bottom: 0.5em;
+}
+#aggregator .feed-item-categories {
+  font-size: 0.9em;
+}
+#aggregator td {
+  vertical-align: bottom;
+}
+#aggregator td.categorize-item {
+  white-space: nowrap;
+}
+#aggregator .categorize-item .news-item .body {
+  margin-top: 0;
+}
+#aggregator .categorize-item h3 {
+  margin-bottom: 1em;
+  margin-top: 0;
+}
diff --git a/htmltest/modules/aggregator/aggregator.fetcher.inc b/htmltest/modules/aggregator/aggregator.fetcher.inc
new file mode 100644
index 00000000..0f728779
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator.fetcher.inc
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * @file
+ * Fetcher functions for the aggregator module.
+ */
+
+/**
+ * Implements hook_aggregator_fetch_info().
+ */
+function aggregator_aggregator_fetch_info() {
+  return array(
+    'title' => t('Default fetcher'),
+    'description' => t('Downloads data from a URL using Drupal\'s HTTP request handler.'),
+  );
+}
+
+/**
+ * Implements hook_aggregator_fetch().
+ */
+function aggregator_aggregator_fetch($feed) {
+  $feed->source_string = FALSE;
+
+  // Generate conditional GET headers.
+  $headers = array();
+  if ($feed->etag) {
+    $headers['If-None-Match'] = $feed->etag;
+  }
+  if ($feed->modified) {
+    $headers['If-Modified-Since'] = gmdate(DATE_RFC1123, $feed->modified);
+  }
+
+  // Request feed.
+  $result = drupal_http_request($feed->url, array('headers' => $headers));
+
+  // Process HTTP response code.
+  switch ($result->code) {
+    case 304:
+      break;
+    case 301:
+      $feed->url = $result->redirect_url;
+      // Do not break here.
+    case 200:
+    case 302:
+    case 307:
+      if (!isset($result->data)) {
+        $result->data = '';
+      }
+      if (!isset($result->headers)) {
+        $result->headers = array();
+      }
+      $feed->source_string = $result->data;
+      $feed->http_headers = $result->headers;
+      break;
+    default:
+      watchdog('aggregator', 'The feed from %site seems to be broken, due to "%error".', array('%site' => $feed->title, '%error' => $result->code . ' ' . $result->error), WATCHDOG_WARNING);
+      drupal_set_message(t('The feed from %site seems to be broken, because of error "%error".', array('%site' => $feed->title, '%error' => $result->code . ' ' . $result->error)));
+  }
+
+  return $feed->source_string === FALSE ? FALSE : TRUE;
+}
diff --git a/htmltest/modules/aggregator/aggregator.info b/htmltest/modules/aggregator/aggregator.info
new file mode 100644
index 00000000..2d6df067
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator.info
@@ -0,0 +1,14 @@
+name = Aggregator
+description = "Aggregates syndicated content (RSS, RDF, and Atom feeds)."
+package = Core
+version = VERSION
+core = 7.x
+files[] = aggregator.test
+configure = admin/config/services/aggregator/settings
+stylesheets[all][] = aggregator.css
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/aggregator/aggregator.install b/htmltest/modules/aggregator/aggregator.install
new file mode 100644
index 00000000..b84556a9
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator.install
@@ -0,0 +1,330 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the aggregator module.
+ */
+
+/**
+ * Implements hook_uninstall().
+ */
+function aggregator_uninstall() {
+  variable_del('aggregator_allowed_html_tags');
+  variable_del('aggregator_summary_items');
+  variable_del('aggregator_clear');
+  variable_del('aggregator_category_selector');
+  variable_del('aggregator_fetcher');
+  variable_del('aggregator_parser');
+  variable_del('aggregator_processors');
+  variable_del('aggregator_teaser_length');
+}
+
+/**
+ * Implements hook_schema().
+ */
+function aggregator_schema() {
+  $schema['aggregator_category'] = array(
+    'description' => 'Stores categories for aggregator feeds and feed items.',
+    'fields' => array(
+      'cid'  => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique aggregator category ID.',
+      ),
+      'title' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Title of the category.',
+      ),
+      'description' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'size' => 'big',
+        'description' => 'Description of the category',
+      ),
+      'block' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'The number of recent items to show within the category block.',
+      )
+    ),
+    'primary key' => array('cid'),
+    'unique keys' => array(
+      'title' => array('title'),
+    ),
+  );
+
+  $schema['aggregator_category_feed'] = array(
+    'description' => 'Bridge table; maps feeds to categories.',
+    'fields' => array(
+      'fid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => "The feed's {aggregator_feed}.fid.",
+      ),
+      'cid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {aggregator_category}.cid to which the feed is being assigned.',
+      )
+    ),
+    'primary key' => array('cid', 'fid'),
+    'indexes' => array(
+      'fid' => array('fid'),
+    ),
+    'foreign keys' => array(
+      'aggregator_category' => array(
+        'table' => 'aggregator_category',
+        'columns' => array('cid' => 'cid'),
+      ),
+    ),
+  );
+
+  $schema['aggregator_category_item'] = array(
+    'description' => 'Bridge table; maps feed items to categories.',
+    'fields' => array(
+      'iid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => "The feed item's {aggregator_item}.iid.",
+      ),
+      'cid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {aggregator_category}.cid to which the feed item is being assigned.',
+      )
+    ),
+    'primary key' => array('cid', 'iid'),
+    'indexes' => array(
+      'iid' => array('iid'),
+    ),
+    'foreign keys' => array(
+      'aggregator_category' => array(
+        'table' => 'aggregator_category',
+        'columns' => array('cid' => 'cid'),
+      ),
+    ),
+  );
+
+  $schema['aggregator_feed'] = array(
+    'description' => 'Stores feeds to be parsed by the aggregator.',
+    'fields' => array(
+      'fid' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique feed ID.',
+      ),
+      'title' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Title of the feed.',
+      ),
+      'url' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'description' => 'URL to the feed.',
+      ),
+      'refresh' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'How often to check for new feed items, in seconds.',
+      ),
+      'checked' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Last time feed was checked for new items, as Unix timestamp.',
+      ),
+      'queued' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Time when this feed was queued for refresh, 0 if not queued.',
+      ),
+      'link' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'description' => 'The parent website of the feed; comes from the <link> element in the feed.',
+      ),
+      'description' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'size' => 'big',
+        'description' => "The parent website's description; comes from the <description> element in the feed.",
+      ),
+      'image' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'size' => 'big',
+        'description' => 'An image representing the feed.',
+      ),
+      'hash' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Calculated hash of the feed data, used for validating cache.',
+      ),
+      'etag' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Entity tag HTTP response header, used for validating cache.',
+      ),
+      'modified' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'When the feed was last modified, as a Unix timestamp.',
+      ),
+      'block' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => "Number of items to display in the feed's block.",
+      )
+    ),
+    'primary key' => array('fid'),
+    'indexes' => array(
+      'url'  => array(array('url', 255)),
+      'queued' => array('queued'),
+    ),
+    'unique keys' => array(
+      'title' => array('title'),
+    ),
+  );
+
+  $schema['aggregator_item'] = array(
+    'description' => 'Stores the individual items imported from feeds.',
+    'fields' => array(
+      'iid'  => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique ID for feed item.',
+      ),
+      'fid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {aggregator_feed}.fid to which this item belongs.',
+      ),
+      'title' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Title of the feed item.',
+      ),
+      'link' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'description' => 'Link to the feed item.',
+      ),
+      'author' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Author of the feed item.',
+      ),
+      'description' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'size' => 'big',
+        'description' => 'Body of the feed item.',
+      ),
+      'timestamp' => array(
+        'type' => 'int',
+        'not null' => FALSE,
+        'description' => 'Posted date of the feed item, as a Unix timestamp.',
+      ),
+      'guid' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'description' => 'Unique identifier for the feed item.',
+      )
+    ),
+    'primary key' => array('iid'),
+    'indexes' => array(
+      'fid' => array('fid'),
+    ),
+    'foreign keys' => array(
+      'aggregator_feed' => array(
+        'table' => 'aggregator_feed',
+        'columns' => array('fid' => 'fid'),
+      ),
+    ),
+  );
+
+  return $schema;
+}
+
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Add hash column to aggregator_feed table.
+ */
+function aggregator_update_7000() {
+  db_add_field('aggregator_feed', 'hash', array('type' => 'varchar', 'length' => 64, 'not null' => TRUE, 'default' => ''));
+}
+
+/**
+ * Add aggregator teaser length to settings from old global default teaser length
+ */
+function aggregator_update_7001() {
+  variable_set('aggregator_teaser_length', variable_get('teaser_length'));
+}
+
+/**
+ * Add queued timestamp.
+ */
+function aggregator_update_7002() {
+  db_add_field('aggregator_feed', 'queued', array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'description' => 'Time when this feed was queued for refresh, 0 if not queued.',
+  ));
+  db_add_index('aggregator_feed', 'queued', array('queued'));
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x"
+ */
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Increase the length of {aggregator_feed}.url.
+ */
+function aggregator_update_7003() {
+  db_drop_unique_key('aggregator_feed', 'url');
+  db_change_field('aggregator_feed', 'url', 'url', array('type' => 'text', 'not null' => TRUE, 'description' => 'URL to the feed.'));
+  db_change_field('aggregator_feed', 'link', 'link', array('type' => 'text', 'not null' => TRUE, 'description' => 'The parent website of the feed; comes from the <link> element in the feed.'));
+  db_change_field('aggregator_item', 'link', 'link', array('type' => 'text', 'not null' => TRUE, 'description' => 'Link to the feed item.'));
+  db_change_field('aggregator_item', 'guid', 'guid', array('type' => 'text', 'not null' => TRUE, 'description' => 'Unique identifier for the feed item.'));
+  db_add_index('aggregator_feed', 'url', array(array('url', 255)));
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra"
+ */
diff --git a/htmltest/modules/aggregator/aggregator.module b/htmltest/modules/aggregator/aggregator.module
new file mode 100644
index 00000000..70f8c5cd
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator.module
@@ -0,0 +1,782 @@
+<?php
+
+/**
+ * @file
+ * Used to aggregate syndicated content (RSS, RDF, and Atom).
+ */
+
+/**
+ * Denotes that a feed's items should never expire.
+ */
+define('AGGREGATOR_CLEAR_NEVER', 0);
+
+/**
+ * Implements hook_help().
+ */
+function aggregator_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#aggregator':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Aggregator module is an on-site syndicator and news reader that gathers and displays fresh content from RSS-, RDF-, and Atom-based feeds made available across the web. Thousands of sites (particularly news sites and blogs) publish their latest headlines in feeds, using a number of standardized XML-based formats. For more information, see the online handbook entry for <a href="@aggregator-module">Aggregator module</a>.', array('@aggregator-module' => 'http://drupal.org/documentation/modules/aggregator', '@aggregator' => url('aggregator'))) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Viewing feeds') . '</dt>';
+      $output .= '<dd>' . t('Feeds contain published content, and may be grouped in categories, generally by topic. Users view feed content in the <a href="@aggregator">main aggregator display</a>, or by <a href="@aggregator-sources">their source</a> (usually via an RSS feed reader). The most recent content in a feed or category can be displayed as a block through the <a href="@admin-block">Blocks administration page</a>.', array('@aggregator' => url('aggregator'), '@aggregator-sources' => url('aggregator/sources'), '@admin-block' => url('admin/structure/block'))) . '</a></dd>';
+      $output .= '<dt>' . t('Adding, editing, and deleting feeds') . '</dt>';
+      $output .= '<dd>' . t('Administrators can add, edit, and delete feeds, and choose how often to check each feed for newly updated items on the <a href="@feededit">Feed aggregator administration page</a>.', array('@feededit' => url('admin/config/services/aggregator'))) . '</dd>';
+      $output .= '<dt>' . t('OPML integration') . '</dt>';
+      $output .= '<dd>' . t('A <a href="@aggregator-opml">machine-readable OPML file</a> of all feeds is available. OPML is an XML-based file format used to share outline-structured information such as a list of RSS feeds. Feeds can also be <a href="@import-opml">imported via an OPML file</a>.', array('@aggregator-opml' => url('aggregator/opml'), '@import-opml' => url('admin/config/services/aggregator'))) . '</dd>';
+      $output .= '<dt>' . t('Configuring cron') . '</dt>';
+      $output .= '<dd>' . t('A correctly configured <a href="@cron">cron maintenance task</a> is required to update feeds automatically.', array('@cron' => 'http://drupal.org/cron')) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'admin/config/services/aggregator':
+      $output = '<p>' . t('Thousands of sites (particularly news sites and blogs) publish their latest headlines and posts in feeds, using a number of standardized XML-based formats. Formats supported by the aggregator include <a href="@rss">RSS</a>, <a href="@rdf">RDF</a>, and <a href="@atom">Atom</a>.', array('@rss' => 'http://cyber.law.harvard.edu/rss/', '@rdf' => 'http://www.w3.org/RDF/', '@atom' => 'http://www.atomenabled.org')) . '</p>';
+      $output .= '<p>' . t('Current feeds are listed below, and <a href="@addfeed">new feeds may be added</a>. For each feed or feed category, the <em>latest items</em> block may be enabled at the <a href="@block">blocks administration page</a>.', array('@addfeed' => url('admin/config/services/aggregator/add/feed'), '@block' => url('admin/structure/block'))) . '</p>';
+      return $output;
+    case 'admin/config/services/aggregator/add/feed':
+      return '<p>' . t('Add a feed in RSS, RDF or Atom format. A feed may only have one entry.') . '</p>';
+    case 'admin/config/services/aggregator/add/category':
+      return '<p>' . t('Categories allow feed items from different feeds to be grouped together. For example, several sport-related feeds may belong to a category named <em>Sports</em>. Feed items may be grouped automatically (by selecting a category when creating or editing a feed) or manually (via the <em>Categorize</em> page available from feed item listings). Each category provides its own feed page and block.') . '</p>';
+    case 'admin/config/services/aggregator/add/opml':
+      return '<p>' . t('<acronym title="Outline Processor Markup Language">OPML</acronym> is an XML format used to exchange multiple feeds between aggregators. A single OPML document may contain a collection of many feeds. Drupal can parse such a file and import all feeds at once, saving you the effort of adding them manually. You may either upload a local file from your computer or enter a URL where Drupal can download it.') . '</p>';
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function aggregator_theme() {
+  return array(
+    'aggregator_wrapper' => array(
+      'variables' => array('content' => NULL),
+      'file' => 'aggregator.pages.inc',
+      'template' => 'aggregator-wrapper',
+    ),
+    'aggregator_categorize_items' => array(
+      'render element' => 'form',
+      'file' => 'aggregator.pages.inc',
+    ),
+    'aggregator_feed_source' => array(
+      'variables' => array('feed' => NULL),
+      'file' => 'aggregator.pages.inc',
+      'template' => 'aggregator-feed-source',
+    ),
+    'aggregator_block_item' => array(
+      'variables' => array('item' => NULL, 'feed' => 0),
+    ),
+    'aggregator_summary_items' => array(
+      'variables' => array('summary_items' => NULL, 'source' => NULL),
+      'file' => 'aggregator.pages.inc',
+      'template' => 'aggregator-summary-items',
+    ),
+    'aggregator_summary_item' => array(
+      'variables' => array('item' => NULL),
+      'file' => 'aggregator.pages.inc',
+      'template' => 'aggregator-summary-item',
+    ),
+    'aggregator_item' => array(
+      'variables' => array('item' => NULL),
+      'file' => 'aggregator.pages.inc',
+      'template' => 'aggregator-item',
+    ),
+    'aggregator_page_opml' => array(
+      'variables' => array('feeds' => NULL),
+      'file' => 'aggregator.pages.inc',
+    ),
+    'aggregator_page_rss' => array(
+      'variables' => array('feeds' => NULL, 'category' => NULL),
+      'file' => 'aggregator.pages.inc',
+    ),
+  );
+}
+
+/**
+ * Implements hook_menu().
+ */
+function aggregator_menu() {
+  $items['admin/config/services/aggregator'] = array(
+    'title' => 'Feed aggregator',
+    'description' => "Configure which content your site aggregates from other sites, how often it polls them, and how they're categorized.",
+    'page callback' => 'aggregator_admin_overview',
+    'access arguments' => array('administer news feeds'),
+    'weight' => 10,
+    'file' => 'aggregator.admin.inc',
+  );
+  $items['admin/config/services/aggregator/add/feed'] = array(
+    'title' => 'Add feed',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('aggregator_form_feed'),
+    'access arguments' => array('administer news feeds'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'aggregator.admin.inc',
+  );
+  $items['admin/config/services/aggregator/add/category'] = array(
+    'title' => 'Add category',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('aggregator_form_category'),
+    'access arguments' => array('administer news feeds'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'aggregator.admin.inc',
+  );
+  $items['admin/config/services/aggregator/add/opml'] = array(
+    'title' => 'Import OPML',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('aggregator_form_opml'),
+    'access arguments' => array('administer news feeds'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'aggregator.admin.inc',
+  );
+  $items['admin/config/services/aggregator/remove/%aggregator_feed'] = array(
+    'title' => 'Remove items',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('aggregator_admin_remove_feed', 5),
+    'access arguments' => array('administer news feeds'),
+    'file' => 'aggregator.admin.inc',
+  );
+  $items['admin/config/services/aggregator/update/%aggregator_feed'] = array(
+    'title' => 'Update items',
+    'page callback' => 'aggregator_admin_refresh_feed',
+    'page arguments' => array(5),
+    'access arguments' => array('administer news feeds'),
+    'file' => 'aggregator.admin.inc',
+  );
+  $items['admin/config/services/aggregator/list'] = array(
+    'title' => 'List',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['admin/config/services/aggregator/settings'] = array(
+    'title' => 'Settings',
+    'description' => 'Configure the behavior of the feed aggregator, including when to discard feed items and how to present feed items and categories.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('aggregator_admin_form'),
+    'access arguments' => array('administer news feeds'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'aggregator.admin.inc',
+  );
+  $items['aggregator'] = array(
+    'title' => 'Feed aggregator',
+    'page callback' => 'aggregator_page_last',
+    'access arguments' => array('access news feeds'),
+    'weight' => 5,
+    'file' => 'aggregator.pages.inc',
+  );
+  $items['aggregator/sources'] = array(
+    'title' => 'Sources',
+    'page callback' => 'aggregator_page_sources',
+    'access arguments' => array('access news feeds'),
+    'file' => 'aggregator.pages.inc',
+  );
+  $items['aggregator/categories'] = array(
+    'title' => 'Categories',
+    'page callback' => 'aggregator_page_categories',
+    'access callback' => '_aggregator_has_categories',
+    'file' => 'aggregator.pages.inc',
+  );
+  $items['aggregator/rss'] = array(
+    'title' => 'RSS feed',
+    'page callback' => 'aggregator_page_rss',
+    'access arguments' => array('access news feeds'),
+    'type' => MENU_CALLBACK,
+    'file' => 'aggregator.pages.inc',
+  );
+  $items['aggregator/opml'] = array(
+    'title' => 'OPML feed',
+    'page callback' => 'aggregator_page_opml',
+    'access arguments' => array('access news feeds'),
+    'type' => MENU_CALLBACK,
+    'file' => 'aggregator.pages.inc',
+  );
+  $items['aggregator/categories/%aggregator_category'] = array(
+    'title callback' => '_aggregator_category_title',
+    'title arguments' => array(2),
+    'page callback' => 'aggregator_page_category',
+    'page arguments' => array(2),
+    'access arguments' => array('access news feeds'),
+    'file' => 'aggregator.pages.inc',
+  );
+  $items['aggregator/categories/%aggregator_category/view'] = array(
+    'title' => 'View',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['aggregator/categories/%aggregator_category/categorize'] = array(
+    'title' => 'Categorize',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('aggregator_page_category_form', 2),
+    'access arguments' => array('administer news feeds'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'aggregator.pages.inc',
+  );
+  $items['aggregator/categories/%aggregator_category/configure'] = array(
+    'title' => 'Configure',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('aggregator_form_category', 2),
+    'access arguments' => array('administer news feeds'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 1,
+    'file' => 'aggregator.admin.inc',
+  );
+  $items['aggregator/sources/%aggregator_feed'] = array(
+    'page callback' => 'aggregator_page_source',
+    'page arguments' => array(2),
+    'access arguments' => array('access news feeds'),
+    'file' => 'aggregator.pages.inc',
+  );
+  $items['aggregator/sources/%aggregator_feed/view'] = array(
+    'title' => 'View',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['aggregator/sources/%aggregator_feed/categorize'] = array(
+    'title' => 'Categorize',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('aggregator_page_source_form', 2),
+    'access arguments' => array('administer news feeds'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'aggregator.pages.inc',
+  );
+  $items['aggregator/sources/%aggregator_feed/configure'] = array(
+    'title' => 'Configure',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('aggregator_form_feed', 2),
+    'access arguments' => array('administer news feeds'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 1,
+    'file' => 'aggregator.admin.inc',
+  );
+  $items['admin/config/services/aggregator/edit/feed/%aggregator_feed'] = array(
+    'title' => 'Edit feed',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('aggregator_form_feed', 6),
+    'access arguments' => array('administer news feeds'),
+    'file' => 'aggregator.admin.inc',
+  );
+  $items['admin/config/services/aggregator/edit/category/%aggregator_category'] = array(
+    'title' => 'Edit category',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('aggregator_form_category', 6),
+    'access arguments' => array('administer news feeds'),
+    'file' => 'aggregator.admin.inc',
+  );
+
+  return $items;
+}
+
+/**
+ * Title callback: Returns a title for aggregator category pages.
+ *
+ * @param $category
+ *   An aggregator category.
+ *
+ * @return
+ *   A string with the aggregator category title.
+ */
+function _aggregator_category_title($category) {
+  return $category['title'];
+}
+
+/**
+ * Determines whether there are any aggregator categories.
+ *
+ * @return
+ *   TRUE if there is at least one category and the user has access to them;
+ *   FALSE otherwise.
+ */
+function _aggregator_has_categories() {
+  return user_access('access news feeds') && (bool) db_query_range('SELECT 1 FROM {aggregator_category}', 0, 1)->fetchField();
+}
+
+/**
+ * Implements hook_permission().
+ */
+function aggregator_permission() {
+  return array(
+    'administer news feeds' => array(
+      'title' => t('Administer news feeds'),
+    ),
+    'access news feeds' => array(
+      'title' => t('View news feeds'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_cron().
+ *
+ * Queues news feeds for updates once their refresh interval has elapsed.
+ */
+function aggregator_cron() {
+  $result = db_query('SELECT * FROM {aggregator_feed} WHERE queued = 0 AND checked + refresh < :time AND refresh <> :never', array(
+    ':time' => REQUEST_TIME,
+    ':never' => AGGREGATOR_CLEAR_NEVER
+  ));
+  $queue = DrupalQueue::get('aggregator_feeds');
+  foreach ($result as $feed) {
+    if ($queue->createItem($feed)) {
+      // Add timestamp to avoid queueing item more than once.
+      db_update('aggregator_feed')
+        ->fields(array('queued' => REQUEST_TIME))
+        ->condition('fid', $feed->fid)
+        ->execute();
+    }
+  }
+
+  // Remove queued timestamp after 6 hours assuming the update has failed.
+  db_update('aggregator_feed')
+    ->fields(array('queued' => 0))
+    ->condition('queued', REQUEST_TIME - (3600 * 6), '<')
+    ->execute();
+}
+
+/**
+ * Implements hook_cron_queue_info().
+ */
+function aggregator_cron_queue_info() {
+  $queues['aggregator_feeds'] = array(
+    'worker callback' => 'aggregator_refresh',
+    'time' => 60,
+  );
+  return $queues;
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function aggregator_block_info() {
+  $blocks = array();
+  $result = db_query('SELECT cid, title FROM {aggregator_category} ORDER BY title');
+  foreach ($result as $category) {
+    $blocks['category-' . $category->cid]['info'] = t('!title category latest items', array('!title' => $category->title));
+  }
+  $result = db_query('SELECT fid, title FROM {aggregator_feed} WHERE block <> 0 ORDER BY fid');
+  foreach ($result as $feed) {
+    $blocks['feed-' . $feed->fid]['info'] = t('!title feed latest items', array('!title' => $feed->title));
+  }
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_configure().
+ */
+function aggregator_block_configure($delta = '') {
+  list($type, $id) = explode('-', $delta);
+  if ($type == 'category') {
+    $value = db_query('SELECT block FROM {aggregator_category} WHERE cid = :cid', array(':cid' => $id))->fetchField();
+    $form['block'] = array(
+      '#type' => 'select',
+      '#title' => t('Number of news items in block'),
+      '#default_value' => $value,
+      '#options' => drupal_map_assoc(range(2, 20)),
+    );
+    return $form;
+  }
+}
+
+/**
+ * Implements hook_block_save().
+ */
+function aggregator_block_save($delta = '', $edit = array()) {
+  list($type, $id) = explode('-', $delta);
+  if ($type == 'category') {
+    db_update('aggregator_category')
+      ->fields(array('block' => $edit['block']))
+      ->condition('cid', $id)
+      ->execute();
+  }
+}
+
+/**
+ * Implements hook_block_view().
+ *
+ * Generates blocks for the latest news items in each category and feed.
+ */
+function aggregator_block_view($delta = '') {
+  if (user_access('access news feeds')) {
+    $block = array();
+    list($type, $id) = explode('-', $delta);
+    $result = FALSE;
+    switch ($type) {
+      case 'feed':
+        if ($feed = db_query('SELECT fid, title, block FROM {aggregator_feed} WHERE block <> 0 AND fid = :fid', array(':fid' => $id))->fetchObject()) {
+          $block['subject'] = check_plain($feed->title);
+          $result = db_query_range("SELECT * FROM {aggregator_item} WHERE fid = :fid ORDER BY timestamp DESC, iid DESC", 0, $feed->block, array(':fid' => $id));
+          $read_more = theme('more_link', array('url' => 'aggregator/sources/' . $feed->fid, 'title' => t("View this feed's recent news.")));
+        }
+        break;
+
+      case 'category':
+        if ($category = db_query('SELECT cid, title, block FROM {aggregator_category} WHERE cid = :cid', array(':cid' => $id))->fetchObject()) {
+          $block['subject'] = check_plain($category->title);
+          $result = db_query_range('SELECT i.* FROM {aggregator_category_item} ci LEFT JOIN {aggregator_item} i ON ci.iid = i.iid WHERE ci.cid = :cid ORDER BY i.timestamp DESC, i.iid DESC', 0, $category->block, array(':cid' => $category->cid));
+          $read_more = theme('more_link', array('url' => 'aggregator/categories/' . $category->cid, 'title' => t("View this category's recent news.")));
+        }
+        break;
+    }
+
+    $items = array();
+    if (!empty($result)) {
+      foreach ($result as $item) {
+        $items[] = theme('aggregator_block_item', array('item' => $item));
+      }
+    }
+
+    // Only display the block if there are items to show.
+    if (count($items) > 0) {
+      $block['content'] = theme('item_list', array('items' => $items)) . $read_more;
+    }
+    return $block;
+  }
+}
+
+/**
+ * Adds/edits/deletes aggregator categories.
+ *
+ * @param $edit
+ *   An associative array describing the category to be added/edited/deleted.
+ */
+function aggregator_save_category($edit) {
+  $link_path = 'aggregator/categories/';
+  if (!empty($edit['cid'])) {
+    $link_path .= $edit['cid'];
+    if (!empty($edit['title'])) {
+      db_merge('aggregator_category')
+        ->key(array('cid' => $edit['cid']))
+        ->fields(array(
+          'title' => $edit['title'],
+          'description' => $edit['description'],
+        ))
+        ->execute();
+      $op = 'update';
+    }
+    else {
+      db_delete('aggregator_category')
+        ->condition('cid', $edit['cid'])
+        ->execute();
+      // Make sure there is no active block for this category.
+      if (module_exists('block')) {
+        db_delete('block')
+          ->condition('module', 'aggregator')
+          ->condition('delta', 'category-' . $edit['cid'])
+          ->execute();
+      }
+      $edit['title'] = '';
+      $op = 'delete';
+    }
+  }
+  elseif (!empty($edit['title'])) {
+    // A single unique id for bundles and feeds, to use in blocks.
+    $link_path .= db_insert('aggregator_category')
+      ->fields(array(
+        'title' => $edit['title'],
+        'description' => $edit['description'],
+        'block' => 5,
+      ))
+      ->execute();
+    $op = 'insert';
+  }
+  if (isset($op)) {
+    menu_link_maintain('aggregator', $op, $link_path, $edit['title']);
+  }
+}
+
+/**
+ * Add/edit/delete an aggregator feed.
+ *
+ * @param $edit
+ *   An associative array describing the feed to be added/edited/deleted.
+ */
+function aggregator_save_feed($edit) {
+  if (!empty($edit['fid'])) {
+    // An existing feed is being modified, delete the category listings.
+    db_delete('aggregator_category_feed')
+      ->condition('fid', $edit['fid'])
+      ->execute();
+  }
+  if (!empty($edit['fid']) && !empty($edit['title'])) {
+    db_update('aggregator_feed')
+      ->condition('fid', $edit['fid'])
+      ->fields(array(
+        'title' => $edit['title'],
+        'url' => $edit['url'],
+        'refresh' => $edit['refresh'],
+        'block' => $edit['block'],
+      ))
+      ->execute();
+  }
+  elseif (!empty($edit['fid'])) {
+    $iids = db_query('SELECT iid FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $edit['fid']))->fetchCol();
+    if ($iids) {
+      db_delete('aggregator_category_item')
+        ->condition('iid', $iids, 'IN')
+        ->execute();
+    }
+    db_delete('aggregator_feed')->
+      condition('fid', $edit['fid'])
+      ->execute();
+    db_delete('aggregator_item')
+      ->condition('fid', $edit['fid'])
+      ->execute();
+    // Make sure there is no active block for this feed.
+    if (module_exists('block')) {
+      db_delete('block')
+        ->condition('module', 'aggregator')
+        ->condition('delta', 'feed-' . $edit['fid'])
+        ->execute();
+    }
+  }
+  elseif (!empty($edit['title'])) {
+    $edit['fid'] = db_insert('aggregator_feed')
+      ->fields(array(
+        'title' => $edit['title'],
+        'url' => $edit['url'],
+        'refresh' => $edit['refresh'],
+        'block' => $edit['block'],
+        'link' => '',
+        'description' => '',
+        'image' => '',
+      ))
+      ->execute();
+
+  }
+  if (!empty($edit['title'])) {
+    // The feed is being saved, save the categories as well.
+    if (!empty($edit['category'])) {
+      foreach ($edit['category'] as $cid => $value) {
+        if ($value) {
+          db_insert('aggregator_category_feed')
+            ->fields(array(
+              'fid' => $edit['fid'],
+              'cid' => $cid,
+            ))
+            ->execute();
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Removes all items from a feed.
+ *
+ * @param $feed
+ *   An object describing the feed to be cleared.
+ */
+function aggregator_remove($feed) {
+  _aggregator_get_variables();
+  // Call hook_aggregator_remove() on all modules.
+  module_invoke_all('aggregator_remove', $feed);
+  // Reset feed.
+  db_update('aggregator_feed')
+    ->condition('fid', $feed->fid)
+    ->fields(array(
+      'checked' => 0,
+      'hash' => '',
+      'etag' => '',
+      'modified' => 0,
+    ))
+    ->execute();
+}
+
+/**
+ * Gets the fetcher, parser, and processors.
+ *
+ * @return
+ *   An array containing the fetcher, parser, and processors.
+ */
+function _aggregator_get_variables() {
+  // Fetch the feed.
+  $fetcher = variable_get('aggregator_fetcher', 'aggregator');
+  if ($fetcher == 'aggregator') {
+    include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'aggregator') . '/aggregator.fetcher.inc';
+  }
+  $parser = variable_get('aggregator_parser', 'aggregator');
+  if ($parser == 'aggregator') {
+    include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'aggregator') . '/aggregator.parser.inc';
+  }
+  $processors = variable_get('aggregator_processors', array('aggregator'));
+  if (in_array('aggregator', $processors)) {
+    include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'aggregator') . '/aggregator.processor.inc';
+  }
+  return array($fetcher, $parser, $processors);
+}
+
+/**
+ * Checks a news feed for new items.
+ *
+ * @param $feed
+ *   An object describing the feed to be refreshed.
+ */
+function aggregator_refresh($feed) {
+  // Store feed URL to track changes.
+  $feed_url = $feed->url;
+
+  // Fetch the feed.
+  list($fetcher, $parser, $processors) = _aggregator_get_variables();
+  $success = module_invoke($fetcher, 'aggregator_fetch', $feed);
+
+  // We store the hash of feed data in the database. When refreshing a
+  // feed we compare stored hash and new hash calculated from downloaded
+  // data. If both are equal we say that feed is not updated.
+  $hash = hash('sha256', $feed->source_string);
+
+  if ($success && ($feed->hash != $hash)) {
+    // Parse the feed.
+    if (module_invoke($parser, 'aggregator_parse', $feed)) {
+      // Update feed with parsed data.
+      db_merge('aggregator_feed')
+        ->key(array('fid' => $feed->fid))
+        ->fields(array(
+          'url' => $feed->url,
+          'link' => empty($feed->link) ? $feed->url : $feed->link,
+          'description' => empty($feed->description) ? '' : $feed->description,
+          'image' => empty($feed->image) ? '' : $feed->image,
+          'hash' => $hash,
+          'etag' => empty($feed->etag) ? '' : $feed->etag,
+          'modified' => empty($feed->modified) ? 0 : $feed->modified,
+        ))
+        ->execute();
+
+      // Log if feed URL has changed.
+      if ($feed->url != $feed_url) {
+        watchdog('aggregator', 'Updated URL for feed %title to %url.', array('%title' => $feed->title, '%url' => $feed->url));
+      }
+
+      watchdog('aggregator', 'There is new syndicated content from %site.', array('%site' => $feed->title));
+      drupal_set_message(t('There is new syndicated content from %site.', array('%site' => $feed->title)));
+
+      // If there are items on the feed, let all enabled processors do their work on it.
+      if (@count($feed->items)) {
+        foreach ($processors as $processor) {
+          module_invoke($processor, 'aggregator_process', $feed);
+        }
+      }
+    }
+  }
+  else {
+    drupal_set_message(t('There is no new syndicated content from %site.', array('%site' => $feed->title)));
+  }
+
+  // Regardless of successful or not, indicate that this feed has been checked.
+  db_update('aggregator_feed')
+    ->fields(array('checked' => REQUEST_TIME, 'queued' => 0))
+    ->condition('fid', $feed->fid)
+    ->execute();
+
+  // Expire old feed items.
+  if (function_exists('aggregator_expire')) {
+    aggregator_expire($feed);
+  }
+}
+
+/**
+ * Loads an aggregator feed.
+ *
+ * @param $fid
+ *   The feed id.
+ *
+ * @return
+ *   An object describing the feed.
+ */
+function aggregator_feed_load($fid) {
+  $feeds = &drupal_static(__FUNCTION__);
+  if (!isset($feeds[$fid])) {
+    $feeds[$fid] = db_query('SELECT * FROM {aggregator_feed} WHERE fid = :fid', array(':fid' => $fid))->fetchObject();
+  }
+
+  return $feeds[$fid];
+}
+
+/**
+ * Loads an aggregator category.
+ *
+ * @param $cid
+ *   The category id.
+ *
+ * @return
+ *   An associative array describing the category.
+ */
+function aggregator_category_load($cid) {
+  $categories = &drupal_static(__FUNCTION__);
+  if (!isset($categories[$cid])) {
+    $categories[$cid] = db_query('SELECT * FROM {aggregator_category} WHERE cid = :cid', array(':cid' => $cid))->fetchAssoc();
+  }
+
+  return $categories[$cid];
+}
+
+/**
+ * Returns HTML for an individual feed item for display in the block.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - item: The item to be displayed.
+ *   - feed: Not used.
+ *
+ * @ingroup themeable
+ */
+function theme_aggregator_block_item($variables) {
+  // Display the external link to the item.
+  return '<a href="' . check_url($variables['item']->link) . '">' . check_plain($variables['item']->title) . "</a>\n";
+}
+
+/**
+ * Renders the HTML content safely, as allowed.
+ *
+ * @param $value
+ *   The content to be filtered.
+ *
+ * @return
+ *   The filtered content.
+ */
+function aggregator_filter_xss($value) {
+  return filter_xss($value, preg_split('/\s+|<|>/', variable_get('aggregator_allowed_html_tags', '<a> <b> <br> <dd> <dl> <dt> <em> <i> <li> <ol> <p> <strong> <u> <ul>'), -1, PREG_SPLIT_NO_EMPTY));
+}
+
+/**
+ * Checks and sanitizes the aggregator configuration.
+ *
+ * Goes through all fetchers, parsers and processors and checks whether they
+ * are available. If one is missing, resets to standard configuration.
+ *
+ * @return
+ *   TRUE if this function resets the configuration; FALSE if not.
+ */
+function aggregator_sanitize_configuration() {
+  $reset = FALSE;
+  list($fetcher, $parser, $processors) = _aggregator_get_variables();
+  if (!module_exists($fetcher)) {
+    $reset = TRUE;
+  }
+  if (!module_exists($parser)) {
+    $reset = TRUE;
+  }
+  foreach ($processors as $processor) {
+    if (!module_exists($processor)) {
+      $reset = TRUE;
+      break;
+    }
+  }
+  if ($reset) {
+    variable_del('aggregator_fetcher');
+    variable_del('aggregator_parser');
+    variable_del('aggregator_processors');
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
+ * Helper function for drupal_map_assoc.
+ *
+ * @param $count
+ *   Items count.
+ *
+ * @return
+ *   A string that is plural-formatted as "@count items".
+ */
+function _aggregator_items($count) {
+  return format_plural($count, '1 item', '@count items');
+}
diff --git a/htmltest/modules/aggregator/aggregator.pages.inc b/htmltest/modules/aggregator/aggregator.pages.inc
new file mode 100644
index 00000000..bfba3fff
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator.pages.inc
@@ -0,0 +1,582 @@
+<?php
+
+/**
+ * @file
+ * User page callbacks for the Aggregator module.
+ */
+
+/**
+ * Page callback: Displays the most recent items gathered from any feed.
+ *
+ * @return
+ *   The rendered list of items for the feed.
+ */
+function aggregator_page_last() {
+  drupal_add_feed('aggregator/rss', variable_get('site_name', 'Drupal') . ' ' . t('aggregator'));
+
+  $items = aggregator_feed_items_load('sum');
+
+  return _aggregator_page_list($items, arg(1));
+}
+
+/**
+ * Page callback: Displays all the items captured from the particular feed.
+ *
+ * @param $feed
+ *   The feed for which to display all items.
+ *
+ * @return
+ *   The rendered list of items for a feed.
+ *
+ * @see aggregator_menu()
+ */
+function aggregator_page_source($feed) {
+  drupal_set_title($feed->title);
+  $feed_source = theme('aggregator_feed_source', array('feed' => $feed));
+
+  // It is safe to include the fid in the query because it's loaded from the
+  // database by aggregator_feed_load.
+  $items = aggregator_feed_items_load('source', $feed);
+
+  return _aggregator_page_list($items, arg(3), $feed_source);
+}
+
+/**
+ * Page callback: Displays a form with all items captured from a feed.
+ *
+ * @param $feed
+ *   The feed for which to list all of the aggregated items.
+ *
+ * @return
+ *   The rendered list of items for the feed.
+ *
+ * @see aggregator_page_source()
+ */
+function aggregator_page_source_form($form, $form_state, $feed) {
+  return aggregator_page_source($feed);
+}
+
+/**
+ * Page callback: Displays all the items aggregated in a particular category.
+ *
+ * @param $category
+ *   The category for which to list all of the aggregated items.
+ *
+ * @return
+ *   The rendered list of items for the feed.
+ */
+function aggregator_page_category($category) {
+  drupal_add_feed('aggregator/rss/' . $category['cid'], variable_get('site_name', 'Drupal') . ' ' . t('aggregator - @title', array('@title' => $category['title'])));
+
+  // It is safe to include the cid in the query because it's loaded from the
+  // database by aggregator_category_load.
+  $items = aggregator_feed_items_load('category', $category);
+
+  return _aggregator_page_list($items, arg(3));
+}
+
+/**
+ * Page callback: Displays a form containing items aggregated in a category.
+ *
+ * @param $category
+ *   The category for which to list all of the aggregated items.
+ *
+ * @return
+ *   The rendered list of items for the feed.
+ *
+ * @see aggregator_page_category()
+ */
+function aggregator_page_category_form($form, $form_state, $category) {
+  return aggregator_page_category($category);
+}
+
+/**
+ * Loads and optionally filters feed items.
+ *
+ * @param $type
+ *   The type of filter for the items. Possible values are:
+ *   - sum: No filtering.
+ *   - source: Filter the feed items, limiting the result to items from a
+ *     single source.
+ *   - category: Filter the feed items by category.
+ * @param $data
+ *   Feed or category data used for filtering. The type and value of $data
+ *   depends on $type:
+ *   - source: $data is an object with $data->fid identifying the feed used to
+ *     as filter.
+ *   - category: $data is an array with $data['cid'] being the category id to
+ *     filter on.
+ *   The $data parameter is not used when $type is 'sum'.
+ *
+ * @return
+ *   An array of the feed items.
+ */
+function aggregator_feed_items_load($type, $data = NULL) {
+  $items = array();
+  switch ($type) {
+    case 'sum':
+      $query = db_select('aggregator_item', 'i');
+      $query->join('aggregator_feed', 'f', 'i.fid = f.fid');
+      $query->fields('i');
+      $query->addField('f', 'title', 'ftitle');
+      $query->addField('f', 'link', 'flink');
+      break;
+    case 'source':
+      $query = db_select('aggregator_item', 'i');
+      $query
+        ->fields('i')
+        ->condition('i.fid', $data->fid);
+      break;
+    case 'category':
+      $query = db_select('aggregator_category_item', 'c');
+      $query->leftJoin('aggregator_item', 'i', 'c.iid = i.iid');
+      $query->leftJoin('aggregator_feed', 'f', 'i.fid = f.fid');
+      $query
+        ->fields('i')
+        ->condition('cid', $data['cid']);
+      $query->addField('f', 'title', 'ftitle');
+      $query->addField('f', 'link', 'flink');
+      break;
+  }
+
+  $result = $query
+    ->extend('PagerDefault')
+    ->limit(20)
+    ->orderBy('i.timestamp', 'DESC')
+    ->orderBy('i.iid', 'DESC')
+    ->execute();
+
+  foreach ($result as $item) {
+    $item->categories = db_query('SELECT c.title, c.cid FROM {aggregator_category_item} ci LEFT JOIN {aggregator_category} c ON ci.cid = c.cid WHERE ci.iid = :iid ORDER BY c.title', array(':iid' => $item->iid))->fetchAll();
+    $items[] = $item;
+  }
+
+  return $items;
+}
+
+/**
+ * Prints an aggregator page listing a number of feed items.
+ *
+ * Various menu callbacks use this function to print their feeds.
+ *
+ * @param $items
+ *   The items to be listed.
+ * @param $op
+ *   Which form should be added to the items. Only 'categorize' is now
+ *   recognized.
+ * @param $feed_source
+ *   The feed source URL.
+ *
+ * @return
+ *   The rendered list of items for the feed.
+ */
+function _aggregator_page_list($items, $op, $feed_source = '') {
+  if (user_access('administer news feeds') && ($op == 'categorize')) {
+    // Get form data.
+    $output = aggregator_categorize_items($items, $feed_source);
+  }
+  else {
+    // Assemble themed output.
+    $output = $feed_source;
+    foreach ($items as $item) {
+      $output .= theme('aggregator_item', array('item' => $item));
+    }
+    $output = theme('aggregator_wrapper', array('content' => $output));
+  }
+
+  return $output;
+}
+
+/**
+ * Form constructor to build the page list form.
+ *
+ * @param $items
+ *   An array of the feed items.
+ * @param $feed_source
+ *   (optional) The feed source URL. Defaults to an empty string.
+ *
+ * @return array
+ *   An array of FAPI elements.
+ *
+ * @see aggregator_categorize_items_submit()
+ * @see theme_aggregator_categorize_items()
+ * @ingroup forms
+ */
+function aggregator_categorize_items($items, $feed_source = '') {
+  $form['#submit'][] = 'aggregator_categorize_items_submit';
+  $form['#theme'] = 'aggregator_categorize_items';
+  $form['feed_source'] = array(
+    '#value' => $feed_source,
+  );
+  $categories = array();
+  $done = FALSE;
+  $form['items'] = array();
+  $form['categories'] = array(
+    '#tree' => TRUE,
+  );
+  foreach ($items as $item) {
+    $form['items'][$item->iid] = array('#markup' => theme('aggregator_item', array('item' => $item)));
+    $form['categories'][$item->iid] = array();
+    $categories_result = db_query('SELECT c.cid, c.title, ci.iid FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid AND ci.iid = :iid', array(':iid' => $item->iid));
+    $selected = array();
+    foreach ($categories_result as $category) {
+      if (!$done) {
+        $categories[$category->cid] = check_plain($category->title);
+      }
+      if ($category->iid) {
+        $selected[] = $category->cid;
+      }
+    }
+    $done = TRUE;
+    $form['categories'][$item->iid] = array(
+      '#type' => variable_get('aggregator_category_selector', 'checkboxes'),
+      '#default_value' => $selected,
+      '#options' => $categories,
+      '#size' => 10,
+      '#multiple' => TRUE
+    );
+  }
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save categories'));
+
+  return $form;
+}
+
+/**
+ * Form submission handler for aggregator_categorize_items().
+ */
+function aggregator_categorize_items_submit($form, &$form_state) {
+  if (!empty($form_state['values']['categories'])) {
+    foreach ($form_state['values']['categories'] as $iid => $selection) {
+      db_delete('aggregator_category_item')
+        ->condition('iid', $iid)
+        ->execute();
+      $insert = db_insert('aggregator_category_item')->fields(array('iid', 'cid'));
+      $has_values = FALSE;
+      foreach ($selection as $cid) {
+        if ($cid && $iid) {
+          $has_values = TRUE;
+          $insert->values(array(
+            'iid' => $iid,
+            'cid' => $cid,
+          ));
+        }
+      }
+      if ($has_values) {
+        $insert->execute();
+      }
+    }
+  }
+  drupal_set_message(t('The categories have been saved.'));
+}
+
+/**
+ * Returns HTML for the aggregator page list form for assigning categories.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_aggregator_categorize_items($variables) {
+  $form = $variables['form'];
+
+  $output = drupal_render($form['feed_source']);
+  $rows = array();
+  if (!empty($form['items'])) {
+    foreach (element_children($form['items']) as $key) {
+      $rows[] = array(
+        drupal_render($form['items'][$key]),
+        array('data' => drupal_render($form['categories'][$key]), 'class' => array('categorize-item')),
+      );
+    }
+  }
+  $output .= theme('table', array('header' => array('', t('Categorize')), 'rows' => $rows));
+  $output .= drupal_render($form['submit']);
+  $output .= drupal_render_children($form);
+
+  return theme('aggregator_wrapper', array('content' => $output));
+}
+
+/**
+ * Processes variables for aggregator-wrapper.tpl.php.
+ *
+ * @see aggregator-wrapper.tpl.php
+ */
+function template_preprocess_aggregator_wrapper(&$variables) {
+  $variables['pager'] = theme('pager');
+}
+
+/**
+ * Processes variables for aggregator-item.tpl.php.
+ *
+ * @see aggregator-item.tpl.php
+ */
+function template_preprocess_aggregator_item(&$variables) {
+  $item = $variables['item'];
+
+  $variables['feed_url'] = check_url($item->link);
+  $variables['feed_title'] = check_plain($item->title);
+  $variables['content'] = aggregator_filter_xss($item->description);
+
+  $variables['source_url'] = '';
+  $variables['source_title'] = '';
+  if (isset($item->ftitle) && isset($item->fid)) {
+    $variables['source_url'] = url("aggregator/sources/$item->fid");
+    $variables['source_title'] = check_plain($item->ftitle);
+  }
+  if (date('Ymd', $item->timestamp) == date('Ymd')) {
+    $variables['source_date'] = t('%ago ago', array('%ago' => format_interval(REQUEST_TIME - $item->timestamp)));
+  }
+  else {
+    $variables['source_date'] = format_date($item->timestamp, 'custom', variable_get('date_format_medium', 'D, m/d/Y - H:i'));
+  }
+
+  $variables['categories'] = array();
+  foreach ($item->categories as $category) {
+    $variables['categories'][$category->cid] = l($category->title, 'aggregator/categories/' . $category->cid);
+  }
+}
+
+/**
+ * Page callback: Displays all the feeds used by the aggregator.
+ *
+ * @return
+ *   An HTML-formatted string.
+ *
+ * @see aggregator_menu()
+ */
+function aggregator_page_sources() {
+  $result = db_query('SELECT f.fid, f.title, f.description, f.image, MAX(i.timestamp) AS last FROM {aggregator_feed} f LEFT JOIN {aggregator_item} i ON f.fid = i.fid GROUP BY f.fid, f.title, f.description, f.image ORDER BY last DESC, f.title');
+
+  $output = '';
+  foreach ($result as $feed) {
+    // Most recent items:
+    $summary_items = array();
+    if (variable_get('aggregator_summary_items', 3)) {
+      $items = db_query_range('SELECT i.title, i.timestamp, i.link FROM {aggregator_item} i WHERE i.fid = :fid ORDER BY i.timestamp DESC', 0, variable_get('aggregator_summary_items', 3), array(':fid' => $feed->fid));
+      foreach ($items as $item) {
+        $summary_items[] = theme('aggregator_summary_item', array('item' => $item));
+      }
+    }
+    $feed->url = url('aggregator/sources/' . $feed->fid);
+    $output .= theme('aggregator_summary_items', array('summary_items' => $summary_items, 'source' => $feed));
+  }
+  $output .= theme('feed_icon', array('url' => 'aggregator/opml', 'title' => t('OPML feed')));
+
+  return theme('aggregator_wrapper', array('content' => $output));
+}
+
+/**
+ * Page callback: Displays all the categories used by the Aggregator module.
+ *
+ * @return string
+ *   An HTML formatted string.
+ *
+ * @see aggregator_menu()
+ */
+function aggregator_page_categories() {
+  $result = db_query('SELECT c.cid, c.title, c.description FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid LEFT JOIN {aggregator_item} i ON ci.iid = i.iid GROUP BY c.cid, c.title, c.description');
+
+  $output = '';
+  foreach ($result as $category) {
+    if (variable_get('aggregator_summary_items', 3)) {
+      $summary_items = array();
+      $items = db_query_range('SELECT i.title, i.timestamp, i.link, f.title as feed_title, f.link as feed_link FROM {aggregator_category_item} ci LEFT JOIN {aggregator_item} i ON i.iid = ci.iid LEFT JOIN {aggregator_feed} f ON i.fid = f.fid WHERE ci.cid = :cid ORDER BY i.timestamp DESC', 0, variable_get('aggregator_summary_items', 3), array(':cid' => $category->cid));
+      foreach ($items as $item) {
+        $summary_items[] = theme('aggregator_summary_item', array('item' => $item));
+      }
+    }
+    $category->url = url('aggregator/categories/' . $category->cid);
+    $output .= theme('aggregator_summary_items', array('summary_items' => $summary_items, 'source' => $category));
+  }
+
+  return theme('aggregator_wrapper', array('content' => $output));
+}
+
+/**
+ * Page callback: Generates an RSS 0.92 feed of aggregator items or categories.
+ *
+ * @return string
+ *   An HTML formatted string.
+ */
+function aggregator_page_rss() {
+  $result = NULL;
+  // arg(2) is the passed cid, only select for that category.
+  if (arg(2)) {
+    $category = db_query('SELECT cid, title FROM {aggregator_category} WHERE cid = :cid', array(':cid' => arg(2)))->fetchObject();
+    $result = db_query_range('SELECT i.*, f.title AS ftitle, f.link AS flink FROM {aggregator_category_item} c LEFT JOIN {aggregator_item} i ON c.iid = i.iid LEFT JOIN {aggregator_feed} f ON i.fid = f.fid WHERE cid = :cid ORDER BY timestamp DESC, i.iid DESC', 0, variable_get('feed_default_items', 10), array(':cid' => $category->cid));
+  }
+  // Or, get the default aggregator items.
+  else {
+    $category = NULL;
+    $result = db_query_range('SELECT i.*, f.title AS ftitle, f.link AS flink FROM {aggregator_item} i INNER JOIN {aggregator_feed} f ON i.fid = f.fid ORDER BY i.timestamp DESC, i.iid DESC', 0, variable_get('feed_default_items', 10));
+  }
+
+  $feeds = $result->fetchAll();
+  return theme('aggregator_page_rss', array('feeds' => $feeds, 'category' => $category));
+}
+
+/**
+ * Prints the RSS page for a feed.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - feeds: An array of the feeds to theme.
+ *   - category: A common category, if any, for all the feeds.
+ *
+ * @return void
+ *
+ * @ingroup themeable
+ */
+function theme_aggregator_page_rss($variables) {
+  $feeds = $variables['feeds'];
+  $category = $variables['category'];
+
+  drupal_add_http_header('Content-Type', 'application/rss+xml; charset=utf-8');
+
+  $items = '';
+  $feed_length = variable_get('feed_item_length', 'fulltext');
+  foreach ($feeds as $feed) {
+    switch ($feed_length) {
+      case 'teaser':
+        $summary = text_summary($feed->description, NULL, variable_get('aggregator_teaser_length', 600));
+        if ($summary != $feed->description) {
+          $summary .= '<p><a href="' . check_url($feed->link) . '">' . t('read more') . "</a></p>\n";
+        }
+        $feed->description = $summary;
+        break;
+      case 'title':
+        $feed->description = '';
+        break;
+    }
+    $items .= format_rss_item($feed->ftitle . ': ' . $feed->title, $feed->link, $feed->description, array('pubDate' => date('r', $feed->timestamp)));
+  }
+
+  $site_name = variable_get('site_name', 'Drupal');
+  $url = url((isset($category) ? 'aggregator/categories/' . $category->cid : 'aggregator'), array('absolute' => TRUE));
+  $description = isset($category) ? t('@site_name - aggregated feeds in category @title', array('@site_name' => $site_name, '@title' => $category->title)) : t('@site_name - aggregated feeds', array('@site_name' => $site_name));
+
+  $output  = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
+  $output .= "<rss version=\"2.0\">\n";
+  $output .= format_rss_channel(t('@site_name aggregator', array('@site_name' => $site_name)), $url, $description, $items);
+  $output .= "</rss>\n";
+
+  print $output;
+}
+
+/**
+ * Page callback: Generates an OPML representation of all feeds.
+ *
+ * @param $cid
+ *   (optional) If set, feeds are exported only from a category with this ID.
+ *   Otherwise, all feeds are exported. Defaults to NULL.
+ *
+ * @return
+ *   An OPML formatted string.
+ */
+function aggregator_page_opml($cid = NULL) {
+  if ($cid) {
+    $result = db_query('SELECT f.title, f.url FROM {aggregator_feed} f LEFT JOIN {aggregator_category_feed} c on f.fid = c.fid WHERE c.cid = :cid ORDER BY title', array(':cid' => $cid));
+  }
+  else {
+    $result = db_query('SELECT * FROM {aggregator_feed} ORDER BY title');
+  }
+
+  $feeds = $result->fetchAll();
+  return theme('aggregator_page_opml', array('feeds' => $feeds));
+}
+
+/**
+ * Prints the OPML page for the feed.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - feeds: An array of the feeds to theme.
+ *
+ * @ingroup themeable
+ */
+function theme_aggregator_page_opml($variables) {
+  $feeds = $variables['feeds'];
+
+  drupal_add_http_header('Content-Type', 'text/xml; charset=utf-8');
+
+  $output  = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
+  $output .= "<opml version=\"1.1\">\n";
+  $output .= "<head>\n";
+  $output .= '<title>' . check_plain(variable_get('site_name', 'Drupal')) . "</title>\n";
+  $output .= '<dateModified>' . gmdate(DATE_RFC2822, REQUEST_TIME) . "</dateModified>\n";
+  $output .= "</head>\n";
+  $output .= "<body>\n";
+  foreach ($feeds as $feed) {
+    $output .= '<outline text="' . check_plain($feed->title) . '" xmlUrl="' . check_url($feed->url) . "\" />\n";
+  }
+  $output .= "</body>\n";
+  $output .= "</opml>\n";
+
+  print $output;
+}
+
+/**
+ * Processes variables for aggregator-summary-items.tpl.php.
+ *
+ * @see aggregator-summary-items.tpl.php
+ */
+function template_preprocess_aggregator_summary_items(&$variables) {
+  $variables['title'] = check_plain($variables['source']->title);
+  $variables['summary_list'] = theme('item_list', array('items' => $variables['summary_items']));
+  $variables['source_url'] = $variables['source']->url;
+}
+
+/**
+ * Processes variables for aggregator-summary-item.tpl.php.
+ *
+ * @see aggregator-summary-item.tpl.php
+ */
+function template_preprocess_aggregator_summary_item(&$variables) {
+  $item = $variables['item'];
+
+  $variables['feed_url'] = check_url($item->link);
+  $variables['feed_title'] = check_plain($item->title);
+  $variables['feed_age'] = t('%age old', array('%age' => format_interval(REQUEST_TIME - $item->timestamp)));
+
+  $variables['source_url'] = '';
+  $variables['source_title'] = '';
+  if (!empty($item->feed_link)) {
+    $variables['source_url'] = check_url($item->feed_link);
+    $variables['source_title'] = check_plain($item->feed_title);
+  }
+}
+
+/**
+ * Processes variables for aggregator-feed-source.tpl.php.
+ *
+ * @see aggregator-feed-source.tpl.php
+ */
+function template_preprocess_aggregator_feed_source(&$variables) {
+  $feed = $variables['feed'];
+
+  $variables['source_icon'] = theme('feed_icon', array('url' => $feed->url, 'title' => t('!title feed', array('!title' => $feed->title))));
+
+  if (!empty($feed->image) && !empty($feed->title) && !empty($feed->link)) {
+    $variables['source_image'] = l(theme('image', array('path' => $feed->image, 'alt' => $feed->title)), $feed->link, array('html' => TRUE, 'attributes' => array('class' => 'feed-image')));
+  }
+  else {
+    $variables['source_image'] = '';
+  }
+
+  $variables['source_description'] = aggregator_filter_xss($feed->description);
+  $variables['source_url'] = check_url(url($feed->link, array('absolute' => TRUE)));
+
+  if ($feed->checked) {
+    $variables['last_checked'] = t('@time ago', array('@time' => format_interval(REQUEST_TIME - $feed->checked)));
+  }
+  else {
+    $variables['last_checked'] = t('never');
+  }
+
+  if (user_access('administer news feeds')) {
+    $variables['last_checked'] = l($variables['last_checked'], 'admin/config/services/aggregator');
+  }
+}
diff --git a/htmltest/modules/aggregator/aggregator.parser.inc b/htmltest/modules/aggregator/aggregator.parser.inc
new file mode 100644
index 00000000..91fbe3aa
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator.parser.inc
@@ -0,0 +1,329 @@
+<?php
+
+/**
+ * @file
+ * Parser functions for the aggregator module.
+ */
+
+/**
+ * Implements hook_aggregator_parse_info().
+ */
+function aggregator_aggregator_parse_info() {
+  return array(
+    'title' => t('Default parser'),
+    'description' => t('Parses RSS, Atom and RDF feeds.'),
+  );
+}
+
+/**
+ * Implements hook_aggregator_parse().
+ */
+function aggregator_aggregator_parse($feed) {
+  global $channel, $image;
+
+  // Filter the input data.
+  if (aggregator_parse_feed($feed->source_string, $feed)) {
+    $modified = empty($feed->http_headers['last-modified']) ? 0 : strtotime($feed->http_headers['last-modified']);
+
+    // Prepare the channel data.
+    foreach ($channel as $key => $value) {
+      $channel[$key] = trim($value);
+    }
+
+    // Prepare the image data (if any).
+    foreach ($image as $key => $value) {
+      $image[$key] = trim($value);
+    }
+
+    $etag = empty($feed->http_headers['etag']) ? '' : $feed->http_headers['etag'];
+
+    // Add parsed data to the feed object.
+    $feed->link = !empty($channel['link']) ? $channel['link'] : '';
+    $feed->description = !empty($channel['description']) ? $channel['description'] : '';
+    $feed->image = !empty($image['url']) ? $image['url'] : '';
+    $feed->etag = $etag;
+    $feed->modified = $modified;
+
+    // Clear the cache.
+    cache_clear_all();
+
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+/**
+ * Parses a feed and stores its items.
+ *
+ * @param $data
+ *   The feed data.
+ * @param $feed
+ *   An object describing the feed to be parsed.
+ *
+ * @return
+ *   FALSE on error, TRUE otherwise.
+ */
+function aggregator_parse_feed(&$data, $feed) {
+  global $items, $image, $channel;
+
+  // Unset the global variables before we use them.
+  unset($GLOBALS['element'], $GLOBALS['item'], $GLOBALS['tag']);
+  $items = array();
+  $image = array();
+  $channel = array();
+
+  // Parse the data.
+  $xml_parser = drupal_xml_parser_create($data);
+  xml_set_element_handler($xml_parser, 'aggregator_element_start', 'aggregator_element_end');
+  xml_set_character_data_handler($xml_parser, 'aggregator_element_data');
+
+  if (!xml_parse($xml_parser, $data, 1)) {
+    watchdog('aggregator', 'The feed from %site seems to be broken, due to an error "%error" on line %line.', array('%site' => $feed->title, '%error' => xml_error_string(xml_get_error_code($xml_parser)), '%line' => xml_get_current_line_number($xml_parser)), WATCHDOG_WARNING);
+    drupal_set_message(t('The feed from %site seems to be broken, because of error "%error" on line %line.', array('%site' => $feed->title, '%error' => xml_error_string(xml_get_error_code($xml_parser)), '%line' => xml_get_current_line_number($xml_parser))), 'error');
+    return FALSE;
+  }
+  xml_parser_free($xml_parser);
+
+  // We reverse the array such that we store the first item last, and the last
+  // item first. In the database, the newest item should be at the top.
+  $items = array_reverse($items);
+
+  // Initialize items array.
+  $feed->items = array();
+  foreach ($items as $item) {
+
+    // Prepare the item:
+    foreach ($item as $key => $value) {
+      $item[$key] = trim($value);
+    }
+
+    // Resolve the item's title. If no title is found, we use up to 40
+    // characters of the description ending at a word boundary, but not
+    // splitting potential entities.
+    if (!empty($item['title'])) {
+      $item['title'] = $item['title'];
+    }
+    elseif (!empty($item['description'])) {
+      $item['title'] = preg_replace('/^(.*)[^\w;&].*?$/', "\\1", truncate_utf8($item['description'], 40));
+    }
+    else {
+      $item['title'] = '';
+    }
+
+    // Resolve the items link.
+    if (!empty($item['link'])) {
+      $item['link'] = $item['link'];
+    }
+    else {
+      $item['link'] = $feed->link;
+    }
+
+    // Atom feeds have an ID tag instead of a GUID tag.
+    if (!isset($item['guid'])) {
+      $item['guid'] = isset($item['id']) ? $item['id'] : '';
+    }
+
+    // Atom feeds have a content and/or summary tag instead of a description tag.
+    if (!empty($item['content:encoded'])) {
+      $item['description'] = $item['content:encoded'];
+    }
+    elseif (!empty($item['summary'])) {
+      $item['description'] = $item['summary'];
+    }
+    elseif (!empty($item['content'])) {
+      $item['description'] = $item['content'];
+    }
+
+    // Try to resolve and parse the item's publication date.
+    $date = '';
+    foreach (array('pubdate', 'dc:date', 'dcterms:issued', 'dcterms:created', 'dcterms:modified', 'issued', 'created', 'modified', 'published', 'updated') as $key) {
+      if (!empty($item[$key])) {
+        $date = $item[$key];
+        break;
+      }
+    }
+
+    $item['timestamp'] = strtotime($date);
+
+    if ($item['timestamp'] === FALSE) {
+      $item['timestamp'] = aggregator_parse_w3cdtf($date); // Aggregator_parse_w3cdtf() returns FALSE on failure.
+    }
+
+    // Resolve dc:creator tag as the item author if author tag is not set.
+    if (empty($item['author']) && !empty($item['dc:creator'])) {
+      $item['author'] = $item['dc:creator'];
+    }
+
+    $item += array('author' => '', 'description' => '');
+
+    // Store on $feed object. This is where processors will look for parsed items.
+    $feed->items[] = $item;
+  }
+
+  return TRUE;
+}
+
+/**
+ * Performs an action when an opening tag is encountered.
+ *
+ * Callback function used by xml_parse() within aggregator_parse_feed().
+ */
+function aggregator_element_start($parser, $name, $attributes) {
+  global $item, $element, $tag, $items, $channel;
+
+  $name = strtolower($name);
+  switch ($name) {
+    case 'image':
+    case 'textinput':
+    case 'summary':
+    case 'tagline':
+    case 'subtitle':
+    case 'logo':
+    case 'info':
+      $element = $name;
+      break;
+    case 'id':
+    case 'content':
+      if ($element != 'item') {
+        $element = $name;
+      }
+    case 'link':
+      // According to RFC 4287, link elements in Atom feeds without a 'rel'
+      // attribute should be interpreted as though the relation type is
+      // "alternate".
+      if (!empty($attributes['HREF']) && (empty($attributes['REL']) || $attributes['REL'] == 'alternate')) {
+        if ($element == 'item') {
+          $items[$item]['link'] = $attributes['HREF'];
+        }
+        else {
+          $channel['link'] = $attributes['HREF'];
+        }
+      }
+      break;
+    case 'item':
+      $element = $name;
+      $item += 1;
+      break;
+    case 'entry':
+      $element = 'item';
+      $item += 1;
+      break;
+  }
+
+  $tag = $name;
+}
+
+/**
+ * Performs an action when a closing tag is encountered.
+ *
+ * Callback function used by xml_parse() within aggregator_parse_feed().
+ */
+function aggregator_element_end($parser, $name) {
+  global $element;
+
+  switch ($name) {
+    case 'image':
+    case 'textinput':
+    case 'item':
+    case 'entry':
+    case 'info':
+      $element = '';
+      break;
+    case 'id':
+    case 'content':
+      if ($element == $name) {
+        $element = '';
+      }
+  }
+}
+
+/**
+ * Performs an action when data is encountered.
+ *
+ * Callback function used by xml_parse() within aggregator_parse_feed().
+ */
+function aggregator_element_data($parser, $data) {
+  global $channel, $element, $items, $item, $image, $tag;
+  $items += array($item => array());
+  switch ($element) {
+    case 'item':
+      $items[$item] += array($tag => '');
+      $items[$item][$tag] .= $data;
+      break;
+    case 'image':
+    case 'logo':
+      $image += array($tag => '');
+      $image[$tag] .= $data;
+      break;
+    case 'link':
+      if ($data) {
+        $items[$item] += array($tag => '');
+        $items[$item][$tag] .= $data;
+      }
+      break;
+    case 'content':
+      $items[$item] += array('content' => '');
+      $items[$item]['content'] .= $data;
+      break;
+    case 'summary':
+      $items[$item] += array('summary' => '');
+      $items[$item]['summary'] .= $data;
+      break;
+    case 'tagline':
+    case 'subtitle':
+      $channel += array('description' => '');
+      $channel['description'] .= $data;
+      break;
+    case 'info':
+    case 'id':
+    case 'textinput':
+      // The sub-element is not supported. However, we must recognize
+      // it or its contents will end up in the item array.
+      break;
+    default:
+      $channel += array($tag => '');
+      $channel[$tag] .= $data;
+  }
+}
+
+/**
+ * Parses the W3C date/time format, a subset of ISO 8601.
+ *
+ * PHP date parsing functions do not handle this format. See
+ * http://www.w3.org/TR/NOTE-datetime for more information. Originally from
+ * MagpieRSS (http://magpierss.sourceforge.net/).
+ *
+ * @param $date_str
+ *   A string with a potentially W3C DTF date.
+ *
+ * @return
+ *   A timestamp if parsed successfully or FALSE if not.
+ */
+function aggregator_parse_w3cdtf($date_str) {
+  if (preg_match('/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/', $date_str, $match)) {
+    list($year, $month, $day, $hours, $minutes, $seconds) = array($match[1], $match[2], $match[3], $match[4], $match[5], $match[6]);
+    // Calculate the epoch for current date assuming GMT.
+    $epoch = gmmktime($hours, $minutes, $seconds, $month, $day, $year);
+    if ($match[10] != 'Z') { // Z is zulu time, aka GMT
+      list($tz_mod, $tz_hour, $tz_min) = array($match[8], $match[9], $match[10]);
+      // Zero out the variables.
+      if (!$tz_hour) {
+        $tz_hour = 0;
+      }
+      if (!$tz_min) {
+        $tz_min = 0;
+      }
+      $offset_secs = (($tz_hour * 60) + $tz_min) * 60;
+      // Is timezone ahead of GMT?  If yes, subtract offset.
+      if ($tz_mod == '+') {
+        $offset_secs *= -1;
+      }
+      $epoch += $offset_secs;
+    }
+    return $epoch;
+  }
+  else {
+    return FALSE;
+  }
+}
diff --git a/htmltest/modules/aggregator/aggregator.processor.inc b/htmltest/modules/aggregator/aggregator.processor.inc
new file mode 100644
index 00000000..44ed5499
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator.processor.inc
@@ -0,0 +1,213 @@
+<?php
+
+/**
+ * @file
+ * Processor functions for the aggregator module.
+ */
+
+/**
+ * Implements hook_aggregator_process_info().
+ */
+function aggregator_aggregator_process_info() {
+  return array(
+    'title' => t('Default processor'),
+    'description' => t('Creates lightweight records from feed items.'),
+  );
+}
+
+/**
+ * Implements hook_aggregator_process().
+ */
+function aggregator_aggregator_process($feed) {
+  if (is_object($feed)) {
+    if (is_array($feed->items)) {
+      foreach ($feed->items as $item) {
+        // Save this item. Try to avoid duplicate entries as much as possible. If
+        // we find a duplicate entry, we resolve it and pass along its ID is such
+        // that we can update it if needed.
+        if (!empty($item['guid'])) {
+          $entry = db_query("SELECT iid, timestamp FROM {aggregator_item} WHERE fid = :fid AND guid = :guid", array(':fid' => $feed->fid, ':guid' => $item['guid']))->fetchObject();
+        }
+        elseif ($item['link'] && $item['link'] != $feed->link && $item['link'] != $feed->url) {
+          $entry = db_query("SELECT iid, timestamp FROM {aggregator_item} WHERE fid = :fid AND link = :link", array(':fid' => $feed->fid, ':link' => $item['link']))->fetchObject();
+        }
+        else {
+          $entry = db_query("SELECT iid, timestamp FROM {aggregator_item} WHERE fid = :fid AND title = :title", array(':fid' => $feed->fid, ':title' => $item['title']))->fetchObject();
+        }
+        if (!$item['timestamp']) {
+          $item['timestamp'] = isset($entry->timestamp) ? $entry->timestamp : REQUEST_TIME;
+        }
+
+        // Make sure the item title and author fit in the 255 varchar column.
+        $item['title'] = truncate_utf8($item['title'], 255, TRUE, TRUE);
+        $item['author'] = truncate_utf8($item['author'], 255, TRUE, TRUE);
+        aggregator_save_item(array('iid' => (isset($entry->iid) ? $entry->iid : ''), 'fid' => $feed->fid, 'timestamp' => $item['timestamp'], 'title' => $item['title'], 'link' => $item['link'], 'author' => $item['author'], 'description' => $item['description'], 'guid' => $item['guid']));
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_aggregator_remove().
+ */
+function aggregator_aggregator_remove($feed) {
+  $iids = db_query('SELECT iid FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->fid))->fetchCol();
+  if ($iids) {
+    db_delete('aggregator_category_item')
+      ->condition('iid', $iids, 'IN')
+      ->execute();
+  }
+  db_delete('aggregator_item')
+    ->condition('fid', $feed->fid)
+    ->execute();
+
+  drupal_set_message(t('The news items from %site have been removed.', array('%site' => $feed->title)));
+}
+
+/**
+ * Implements hook_form_aggregator_admin_form_alter().
+ *
+ * Form alter aggregator module's own form to keep processor functionality
+ * separate from aggregator API functionality.
+ */
+function aggregator_form_aggregator_admin_form_alter(&$form, $form_state) {
+  if (in_array('aggregator', variable_get('aggregator_processors', array('aggregator')))) {
+    $info = module_invoke('aggregator', 'aggregator_process', 'info');
+    $items = drupal_map_assoc(array(3, 5, 10, 15, 20, 25), '_aggregator_items');
+    $period = drupal_map_assoc(array(3600, 10800, 21600, 32400, 43200, 86400, 172800, 259200, 604800, 1209600, 2419200, 4838400, 9676800), 'format_interval');
+    $period[AGGREGATOR_CLEAR_NEVER] = t('Never');
+
+    // Only wrap into a collapsible fieldset if there is a basic configuration.
+    if (isset($form['basic_conf'])) {
+      $form['modules']['aggregator'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('Default processor settings'),
+        '#description' => $info['description'],
+        '#collapsible' => TRUE,
+        '#collapsed' => !in_array('aggregator', variable_get('aggregator_processors', array('aggregator'))),
+      );
+    }
+    else {
+      $form['modules']['aggregator'] = array();
+    }
+
+    $form['modules']['aggregator']['aggregator_summary_items'] = array(
+      '#type' => 'select',
+      '#title' => t('Number of items shown in listing pages'),
+      '#default_value' => variable_get('aggregator_summary_items', 3),
+      '#empty_value' => 0,
+      '#options' => $items,
+    );
+
+    $form['modules']['aggregator']['aggregator_clear'] = array(
+      '#type' => 'select',
+      '#title' => t('Discard items older than'),
+      '#default_value' => variable_get('aggregator_clear', 9676800),
+      '#options' => $period,
+      '#description' => t('Requires a correctly configured <a href="@cron">cron maintenance task</a>.', array('@cron' => url('admin/reports/status'))),
+    );
+
+    $form['modules']['aggregator']['aggregator_category_selector'] = array(
+      '#type' => 'radios',
+      '#title' => t('Select categories using'),
+      '#default_value' => variable_get('aggregator_category_selector', 'checkboxes'),
+      '#options' => array('checkboxes' => t('checkboxes'),
+      'select' => t('multiple selector')),
+      '#description' => t('For a small number of categories, checkboxes are easier to use, while a multiple selector works well with large numbers of categories.'),
+    );
+    $form['modules']['aggregator']['aggregator_teaser_length'] = array(
+      '#type' => 'select',
+      '#title' => t('Length of trimmed description'),
+      '#default_value' => variable_get('aggregator_teaser_length', 600),
+      '#options' => drupal_map_assoc(array(0, 200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000), '_aggregator_characters'),
+      '#description' => t("The maximum number of characters used in the trimmed version of content.")
+    );
+
+  }
+}
+
+/**
+ * Creates display text for teaser length option values.
+ *
+ * Callback for drupal_map_assoc() within
+ * aggregator_form_aggregator_admin_form_alter().
+ *
+ * @param $length
+ *   The desired length of teaser text, in bytes.
+ *
+ * @return
+ *   A translated string explaining the teaser string length.
+ */
+function _aggregator_characters($length) {
+  return ($length == 0) ? t('Unlimited') : format_plural($length, '1 character', '@count characters');
+}
+
+/**
+ * Adds/edits/deletes an aggregator item.
+ *
+ * @param $edit
+ *   An associative array describing the item to be added/edited/deleted.
+ */
+function aggregator_save_item($edit) {
+  if ($edit['title'] && empty($edit['iid'])) {
+    $edit['iid'] = db_insert('aggregator_item')
+      ->fields(array(
+        'title' => $edit['title'],
+        'link' => $edit['link'],
+        'author' => $edit['author'],
+        'description' => $edit['description'],
+        'guid' => $edit['guid'],
+        'timestamp' => $edit['timestamp'],
+        'fid' => $edit['fid'],
+      ))
+      ->execute();
+  }
+  if ($edit['iid'] && !$edit['title']) {
+    db_delete('aggregator_item')
+      ->condition('iid', $edit['iid'])
+      ->execute();
+    db_delete('aggregator_category_item')
+      ->condition('iid', $edit['iid'])
+      ->execute();
+  }
+  elseif ($edit['title'] && $edit['link']) {
+    // file the items in the categories indicated by the feed
+    $result = db_query('SELECT cid FROM {aggregator_category_feed} WHERE fid = :fid', array(':fid' => $edit['fid']));
+    foreach ($result as $category) {
+      db_merge('aggregator_category_item')
+        ->key(array(
+          'iid' => $edit['iid'],
+          'cid' => $category->cid,
+        ))
+        ->execute();
+    }
+  }
+}
+
+/**
+ * Expires items from a feed depending on expiration settings.
+ *
+ * @param $feed
+ *   Object describing feed.
+ */
+function aggregator_expire($feed) {
+  $aggregator_clear = variable_get('aggregator_clear', 9676800);
+
+  if ($aggregator_clear != AGGREGATOR_CLEAR_NEVER) {
+    // Remove all items that are older than flush item timer.
+    $age = REQUEST_TIME - $aggregator_clear;
+    $iids = db_query('SELECT iid FROM {aggregator_item} WHERE fid = :fid AND timestamp < :timestamp', array(
+      ':fid' => $feed->fid,
+      ':timestamp' => $age,
+    ))
+    ->fetchCol();
+    if ($iids) {
+      db_delete('aggregator_category_item')
+        ->condition('iid', $iids, 'IN')
+        ->execute();
+      db_delete('aggregator_item')
+        ->condition('iid', $iids, 'IN')
+        ->execute();
+    }
+  }
+}
diff --git a/htmltest/modules/aggregator/aggregator.test b/htmltest/modules/aggregator/aggregator.test
new file mode 100644
index 00000000..18d5b335
--- /dev/null
+++ b/htmltest/modules/aggregator/aggregator.test
@@ -0,0 +1,1019 @@
+<?php
+
+/**
+ * @file
+ * Tests for aggregator.module.
+ */
+
+/**
+ * Defines a base class for testing the Aggregator module.
+ */
+class AggregatorTestCase extends DrupalWebTestCase {
+  function setUp() {
+    parent::setUp('aggregator', 'aggregator_test');
+    $web_user = $this->drupalCreateUser(array('administer news feeds', 'access news feeds', 'create article content'));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Creates an aggregator feed.
+   *
+   * This method simulates the form submission on path
+   * admin/config/services/aggregator/add/feed.
+   *
+   * @param $feed_url
+   *   (optional) If given, feed will be created with this URL, otherwise
+   *   /rss.xml will be used. Defaults to NULL.
+   *
+   * @return $feed
+   *   Full feed object if possible.
+   *
+   * @see getFeedEditArray()
+   */
+  function createFeed($feed_url = NULL) {
+    $edit = $this->getFeedEditArray($feed_url);
+    $this->drupalPost('admin/config/services/aggregator/add/feed', $edit, t('Save'));
+    $this->assertRaw(t('The feed %name has been added.', array('%name' => $edit['title'])), format_string('The feed !name has been added.', array('!name' => $edit['title'])));
+
+    $feed = db_query("SELECT *  FROM {aggregator_feed} WHERE title = :title AND url = :url", array(':title' => $edit['title'], ':url' => $edit['url']))->fetch();
+    $this->assertTrue(!empty($feed), 'The feed found in database.');
+    return $feed;
+  }
+
+  /**
+   * Deletes an aggregator feed.
+   *
+   * @param $feed
+   *   Feed object representing the feed.
+   */
+  function deleteFeed($feed) {
+    $this->drupalPost('admin/config/services/aggregator/edit/feed/' . $feed->fid, array(), t('Delete'));
+    $this->assertRaw(t('The feed %title has been deleted.', array('%title' => $feed->title)), 'Feed deleted successfully.');
+  }
+
+  /**
+   * Returns a randomly generated feed edit array.
+   *
+   * @param $feed_url
+   *   (optional) If given, feed will be created with this URL, otherwise
+   *   /rss.xml will be used. Defaults to NULL.
+   * @return
+   *   A feed array.
+   */
+  function getFeedEditArray($feed_url = NULL) {
+    $feed_name = $this->randomName(10);
+    if (!$feed_url) {
+      $feed_url = url('rss.xml', array(
+        'query' => array('feed' => $feed_name),
+        'absolute' => TRUE,
+      ));
+    }
+    $edit = array(
+      'title' => $feed_name,
+      'url' => $feed_url,
+      'refresh' => '900',
+    );
+    return $edit;
+  }
+
+  /**
+   * Returns the count of the randomly created feed array.
+   *
+   * @return
+   *   Number of feed items on default feed created by createFeed().
+   */
+  function getDefaultFeedItemCount() {
+    // Our tests are based off of rss.xml, so let's find out how many elements should be related.
+    $feed_count = db_query_range('SELECT COUNT(*) FROM {node} n WHERE n.promote = 1 AND n.status = 1', 0, variable_get('feed_default_items', 10))->fetchField();
+    return $feed_count > 10 ? 10 : $feed_count;
+  }
+
+  /**
+   * Updates the feed items.
+   *
+   * This method simulates a click to
+   * admin/config/services/aggregator/update/$fid.
+   *
+   * @param $feed
+   *   Feed object representing the feed, passed by reference.
+   * @param $expected_count
+   *   Expected number of feed items.
+   */
+  function updateFeedItems(&$feed, $expected_count) {
+    // First, let's ensure we can get to the rss xml.
+    $this->drupalGet($feed->url);
+    $this->assertResponse(200, format_string('!url is reachable.', array('!url' => $feed->url)));
+
+    // Attempt to access the update link directly without an access token.
+    $this->drupalGet('admin/config/services/aggregator/update/' . $feed->fid);
+    $this->assertResponse(403);
+
+    // Refresh the feed (simulated link click).
+    $this->drupalGet('admin/config/services/aggregator');
+    $this->clickLink('update items');
+
+    // Ensure we have the right number of items.
+    $result = db_query('SELECT iid FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->fid));
+    $items = array();
+    $feed->items = array();
+    foreach ($result as $item) {
+      $feed->items[] = $item->iid;
+    }
+    $feed->item_count = count($feed->items);
+    $this->assertEqual($expected_count, $feed->item_count, format_string('Total items in feed equal to the total items in database (!val1 != !val2)', array('!val1' => $expected_count, '!val2' => $feed->item_count)));
+  }
+
+  /**
+   * Confirms an item removal from a feed.
+   *
+   * @param $feed
+   *   Feed object representing the feed.
+   */
+  function removeFeedItems($feed) {
+    $this->drupalPost('admin/config/services/aggregator/remove/' . $feed->fid, array(), t('Remove items'));
+    $this->assertRaw(t('The news items from %title have been removed.', array('%title' => $feed->title)), 'Feed items removed.');
+  }
+
+  /**
+   * Adds and removes feed items and ensure that the count is zero.
+   *
+   * @param $feed
+   *   Feed object representing the feed.
+   * @param $expected_count
+   *   Expected number of feed items.
+   */
+  function updateAndRemove($feed, $expected_count) {
+    $this->updateFeedItems($feed, $expected_count);
+    $count = db_query('SELECT COUNT(*) FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->fid))->fetchField();
+    $this->assertTrue($count);
+    $this->removeFeedItems($feed);
+    $count = db_query('SELECT COUNT(*) FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->fid))->fetchField();
+    $this->assertTrue($count == 0);
+  }
+
+  /**
+   * Pulls feed categories from {aggregator_category_feed} table.
+   *
+   * @param $feed
+   *   Feed object representing the feed.
+   */
+  function getFeedCategories($feed) {
+    // add the categories to the feed so we can use them
+    $result = db_query('SELECT cid FROM {aggregator_category_feed} WHERE fid = :fid', array(':fid' => $feed->fid));
+    foreach ($result as $category) {
+      $feed->categories[] = $category->cid;
+    }
+  }
+
+  /**
+   * Pulls categories from {aggregator_category} table.
+   *
+   * @return
+   *   An associative array keyed by category ID and values are set to the
+   *   category names.
+   */
+  function getCategories() {
+    $categories = array();
+    $result = db_query('SELECT * FROM {aggregator_category}');
+    foreach ($result as $category) {
+      $categories[$category->cid] = $category;
+    }
+    return $categories;
+  }
+
+  /**
+   * Checks whether the feed name and URL are unique.
+   *
+   * @param $feed_name
+   *   String containing the feed name to check.
+   * @param $feed_url
+   *   String containing the feed URL to check.
+   *
+   * @return
+   *   TRUE if feed is unique.
+   */
+  function uniqueFeed($feed_name, $feed_url) {
+    $result = db_query("SELECT COUNT(*) FROM {aggregator_feed} WHERE title = :title AND url = :url", array(':title' => $feed_name, ':url' => $feed_url))->fetchField();
+    return (1 == $result);
+  }
+
+  /**
+   * Creates a valid OPML file from an array of feeds.
+   *
+   * @param $feeds
+   *   An array of feeds.
+   *
+   * @return
+   *   Path to valid OPML file.
+   */
+  function getValidOpml($feeds) {
+    // Properly escape URLs so that XML parsers don't choke on them.
+    foreach ($feeds as &$feed) {
+      $feed['url'] = htmlspecialchars($feed['url']);
+    }
+    /**
+     * Does not have an XML declaration, must pass the parser.
+     */
+    $opml = <<<EOF
+<opml version="1.0">
+  <head></head>
+  <body>
+    <!-- First feed to be imported. -->
+    <outline text="{$feeds[0]['title']}" xmlurl="{$feeds[0]['url']}" />
+
+    <!-- Second feed. Test string delimitation and attribute order. -->
+    <outline xmlurl='{$feeds[1]['url']}' text='{$feeds[1]['title']}'/>
+
+    <!-- Test for duplicate URL and title. -->
+    <outline xmlurl="{$feeds[0]['url']}" text="Duplicate URL"/>
+    <outline xmlurl="http://duplicate.title" text="{$feeds[1]['title']}"/>
+
+    <!-- Test that feeds are only added with required attributes. -->
+    <outline text="{$feeds[2]['title']}" />
+    <outline xmlurl="{$feeds[2]['url']}" />
+  </body>
+</opml>
+EOF;
+
+    $path = 'public://valid-opml.xml';
+    return file_unmanaged_save_data($opml, $path);
+  }
+
+  /**
+   * Creates an invalid OPML file.
+   *
+   * @return
+   *   Path to invalid OPML file.
+   */
+  function getInvalidOpml() {
+    $opml = <<<EOF
+<opml>
+  <invalid>
+</opml>
+EOF;
+
+    $path = 'public://invalid-opml.xml';
+    return file_unmanaged_save_data($opml, $path);
+  }
+
+  /**
+   * Creates a valid but empty OPML file.
+   *
+   * @return
+   *   Path to empty OPML file.
+   */
+  function getEmptyOpml() {
+    $opml = <<<EOF
+<?xml version="1.0" encoding="utf-8"?>
+<opml version="1.0">
+  <head></head>
+  <body>
+    <outline text="Sample text" />
+    <outline text="Sample text" url="Sample URL" />
+  </body>
+</opml>
+EOF;
+
+    $path = 'public://empty-opml.xml';
+    return file_unmanaged_save_data($opml, $path);
+  }
+
+  function getRSS091Sample() {
+    return $GLOBALS['base_url'] . '/' . drupal_get_path('module', 'aggregator') . '/tests/aggregator_test_rss091.xml';
+  }
+
+  function getAtomSample() {
+    // The content of this sample ATOM feed is based directly off of the
+    // example provided in RFC 4287.
+    return $GLOBALS['base_url'] . '/' . drupal_get_path('module', 'aggregator') . '/tests/aggregator_test_atom.xml';
+  }
+
+  /**
+   * Creates sample article nodes.
+   *
+   * @param $count
+   *   (optional) The number of nodes to generate. Defaults to five.
+   */
+  function createSampleNodes($count = 5) {
+    $langcode = LANGUAGE_NONE;
+    // Post $count article nodes.
+    for ($i = 0; $i < $count; $i++) {
+      $edit = array();
+      $edit['title'] = $this->randomName();
+      $edit["body[$langcode][0][value]"] = $this->randomName();
+      $this->drupalPost('node/add/article', $edit, t('Save'));
+    }
+  }
+}
+
+/**
+ * Tests functionality of the configuration settings in the Aggregator module.
+ */
+class AggregatorConfigurationTestCase extends AggregatorTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Aggregator configuration',
+      'description' => 'Test aggregator settings page.',
+      'group' => 'Aggregator',
+    );
+  }
+
+  /**
+   * Tests the settings form to ensure the correct default values are used.
+   */
+  function testSettingsPage() {
+    $edit = array(
+      'aggregator_allowed_html_tags' => '<a>',
+      'aggregator_summary_items' => 10,
+      'aggregator_clear' => 3600,
+      'aggregator_category_selector' => 'select',
+      'aggregator_teaser_length' => 200,
+    );
+    $this->drupalPost('admin/config/services/aggregator/settings', $edit, t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'));
+
+    foreach ($edit as $name => $value) {
+      $this->assertFieldByName($name, $value, format_string('"@name" has correct default value.', array('@name' => $name)));
+    }
+  }
+}
+
+/**
+ * Tests adding aggregator feeds.
+ */
+class AddFeedTestCase extends AggregatorTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Add feed functionality',
+      'description' => 'Add feed test.',
+      'group' => 'Aggregator'
+    );
+  }
+
+  /**
+   * Creates and ensures that a feed is unique, checks source, and deletes feed.
+   */
+  function testAddFeed() {
+    $feed = $this->createFeed();
+
+    // Check feed data.
+    $this->assertEqual($this->getUrl(), url('admin/config/services/aggregator/add/feed', array('absolute' => TRUE)), 'Directed to correct url.');
+    $this->assertTrue($this->uniqueFeed($feed->title, $feed->url), 'The feed is unique.');
+
+    // Check feed source.
+    $this->drupalGet('aggregator/sources/' . $feed->fid);
+    $this->assertResponse(200, 'Feed source exists.');
+    $this->assertText($feed->title, 'Page title');
+    $this->drupalGet('aggregator/sources/' . $feed->fid . '/categorize');
+    $this->assertResponse(200, 'Feed categorization page exists.');
+
+    // Delete feed.
+    $this->deleteFeed($feed);
+  }
+
+  /**
+   * Tests feeds with very long URLs.
+   */
+  function testAddLongFeed() {
+    // Create a feed with a URL of > 255 characters.
+    $long_url = "https://www.google.com/search?ix=heb&sourceid=chrome&ie=UTF-8&q=angie+byron#sclient=psy-ab&hl=en&safe=off&source=hp&q=angie+byron&pbx=1&oq=angie+byron&aq=f&aqi=&aql=&gs_sm=3&gs_upl=0l0l0l10534l0l0l0l0l0l0l0l0ll0l0&bav=on.2,or.r_gc.r_pw.r_cp.,cf.osb&fp=a70b6b1f0abe28d8&biw=1629&bih=889&ix=heb";
+    $feed = $this->createFeed($long_url);
+
+    // Create a second feed of > 255 characters, where the only difference is
+    // after the 255th character.
+    $long_url_2 = "https://www.google.com/search?ix=heb&sourceid=chrome&ie=UTF-8&q=angie+byron#sclient=psy-ab&hl=en&safe=off&source=hp&q=angie+byron&pbx=1&oq=angie+byron&aq=f&aqi=&aql=&gs_sm=3&gs_upl=0l0l0l10534l0l0l0l0l0l0l0l0ll0l0&bav=on.2,or.r_gc.r_pw.r_cp.,cf.osb&fp=a70b6b1f0abe28d8&biw=1629&bih=889";
+    $feed_2 = $this->createFeed($long_url_2);
+
+    // Check feed data.
+    $this->assertTrue($this->uniqueFeed($feed->title, $feed->url), 'The first long URL feed is unique.');
+    $this->assertTrue($this->uniqueFeed($feed_2->title, $feed_2->url), 'The second long URL feed is unique.');
+
+    // Check feed source.
+    $this->drupalGet('aggregator/sources/' . $feed->fid);
+    $this->assertResponse(200, 'Long URL feed source exists.');
+    $this->assertText($feed->title, 'Page title');
+    $this->drupalGet('aggregator/sources/' . $feed->fid . '/categorize');
+    $this->assertResponse(200, 'Long URL feed categorization page exists.');
+
+    // Delete feeds.
+    $this->deleteFeed($feed);
+    $this->deleteFeed($feed_2);
+  }
+}
+
+/**
+ * Tests the categorize feed functionality in the Aggregator module.
+ */
+class CategorizeFeedTestCase extends AggregatorTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Categorize feed functionality',
+      'description' => 'Categorize feed test.',
+      'group' => 'Aggregator'
+    );
+  }
+
+  /**
+   * Creates a feed and makes sure you can add more than one category to it.
+   */
+  function testCategorizeFeed() {
+
+    // Create 2 categories.
+    $category_1 = array('title' => $this->randomName(10), 'description' => '');
+    $this->drupalPost('admin/config/services/aggregator/add/category', $category_1, t('Save'));
+    $this->assertRaw(t('The category %title has been added.', array('%title' => $category_1['title'])), format_string('The category %title has been added.', array('%title' => $category_1['title'])));
+
+    $category_2 = array('title' => $this->randomName(10), 'description' => '');
+    $this->drupalPost('admin/config/services/aggregator/add/category', $category_2, t('Save'));
+    $this->assertRaw(t('The category %title has been added.', array('%title' => $category_2['title'])), format_string('The category %title has been added.', array('%title' => $category_2['title'])));
+
+    // Get categories from database.
+    $categories = $this->getCategories();
+
+    // Create a feed and assign 2 categories to it.
+    $feed = $this->getFeedEditArray();
+    $feed['block'] = 5;
+    foreach ($categories as $cid => $category) {
+      $feed['category'][$cid] = $cid;
+    }
+
+    // Use aggregator_save_feed() function to save the feed.
+    aggregator_save_feed($feed);
+    $db_feed = db_query("SELECT *  FROM {aggregator_feed} WHERE title = :title AND url = :url", array(':title' => $feed['title'], ':url' => $feed['url']))->fetch();
+
+    // Assert the feed has two categories.
+    $this->getFeedCategories($db_feed);
+    $this->assertEqual(count($db_feed->categories), 2, 'Feed has 2 categories');
+  }
+}
+
+/**
+ * Tests functionality of updating the feed in the Aggregator module.
+ */
+class UpdateFeedTestCase extends AggregatorTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Update feed functionality',
+      'description' => 'Update feed test.',
+      'group' => 'Aggregator'
+    );
+  }
+
+  /**
+   * Creates a feed and attempts to update it.
+   */
+  function testUpdateFeed() {
+    $remamining_fields = array('title', 'url', '');
+    foreach ($remamining_fields as $same_field) {
+      $feed = $this->createFeed();
+
+      // Get new feed data array and modify newly created feed.
+      $edit = $this->getFeedEditArray();
+      $edit['refresh'] =  1800; // Change refresh value.
+      if (isset($feed->{$same_field})) {
+        $edit[$same_field] = $feed->{$same_field};
+      }
+      $this->drupalPost('admin/config/services/aggregator/edit/feed/' . $feed->fid, $edit, t('Save'));
+      $this->assertRaw(t('The feed %name has been updated.', array('%name' => $edit['title'])), format_string('The feed %name has been updated.', array('%name' => $edit['title'])));
+
+      // Check feed data.
+      $this->assertEqual($this->getUrl(), url('admin/config/services/aggregator/', array('absolute' => TRUE)));
+      $this->assertTrue($this->uniqueFeed($edit['title'], $edit['url']), 'The feed is unique.');
+
+      // Check feed source.
+      $this->drupalGet('aggregator/sources/' . $feed->fid);
+      $this->assertResponse(200, 'Feed source exists.');
+      $this->assertText($edit['title'], 'Page title');
+
+      // Delete feed.
+      $feed->title = $edit['title']; // Set correct title so deleteFeed() will work.
+      $this->deleteFeed($feed);
+    }
+  }
+}
+
+/**
+ * Tests functionality for removing feeds in the Aggregator module.
+ */
+class RemoveFeedTestCase extends AggregatorTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Remove feed functionality',
+      'description' => 'Remove feed test.',
+      'group' => 'Aggregator'
+    );
+  }
+
+  /**
+   * Removes a feed and ensures that all of its services are removed.
+   */
+  function testRemoveFeed() {
+    $feed = $this->createFeed();
+
+    // Delete feed.
+    $this->deleteFeed($feed);
+
+    // Check feed source.
+    $this->drupalGet('aggregator/sources/' . $feed->fid);
+    $this->assertResponse(404, 'Deleted feed source does not exists.');
+
+    // Check database for feed.
+    $result = db_query("SELECT COUNT(*) FROM {aggregator_feed} WHERE title = :title AND url = :url", array(':title' => $feed->title, ':url' => $feed->url))->fetchField();
+    $this->assertFalse($result, 'Feed not found in database');
+  }
+}
+
+/**
+ * Tests functionality of updating a feed item in the Aggregator module.
+ */
+class UpdateFeedItemTestCase extends AggregatorTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Update feed item functionality',
+      'description' => 'Update feed items from a feed.',
+      'group' => 'Aggregator'
+    );
+  }
+
+  /**
+   * Tests running "update items" from 'admin/config/services/aggregator' page.
+   */
+  function testUpdateFeedItem() {
+    $this->createSampleNodes();
+
+    // Create a feed and test updating feed items if possible.
+    $feed = $this->createFeed();
+    if (!empty($feed)) {
+      $this->updateFeedItems($feed, $this->getDefaultFeedItemCount());
+      $this->removeFeedItems($feed);
+    }
+
+    // Delete feed.
+    $this->deleteFeed($feed);
+
+    // Test updating feed items without valid timestamp information.
+    $edit = array(
+      'title' => "Feed without publish timestamp",
+      'url' => $this->getRSS091Sample(),
+    );
+
+    $this->drupalGet($edit['url']);
+    $this->assertResponse(array(200), format_string('URL !url is accessible', array('!url' => $edit['url'])));
+
+    $this->drupalPost('admin/config/services/aggregator/add/feed', $edit, t('Save'));
+    $this->assertRaw(t('The feed %name has been added.', array('%name' => $edit['title'])), format_string('The feed !name has been added.', array('!name' => $edit['title'])));
+
+    $feed = db_query("SELECT * FROM {aggregator_feed} WHERE url = :url", array(':url' => $edit['url']))->fetchObject();
+
+    aggregator_refresh($feed);
+    $before = db_query('SELECT timestamp FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->fid))->fetchField();
+
+    // Sleep for 3 second.
+    sleep(3);
+    db_update('aggregator_feed')
+      ->condition('fid', $feed->fid)
+      ->fields(array(
+        'checked' => 0,
+        'hash' => '',
+        'etag' => '',
+        'modified' => 0,
+      ))
+      ->execute();
+    aggregator_refresh($feed);
+
+    $after = db_query('SELECT timestamp FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->fid))->fetchField();
+    $this->assertTrue($before === $after, format_string('Publish timestamp of feed item was not updated (!before === !after)', array('!before' => $before, '!after' => $after)));
+  }
+}
+
+class RemoveFeedItemTestCase extends AggregatorTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Remove feed item functionality',
+      'description' => 'Remove feed items from a feed.',
+      'group' => 'Aggregator'
+    );
+  }
+
+  /**
+   * Tests running "remove items" from 'admin/config/services/aggregator' page.
+   */
+  function testRemoveFeedItem() {
+    // Create a bunch of test feeds.
+    $feed_urls = array();
+    // No last-modified, no etag.
+    $feed_urls[] = url('aggregator/test-feed', array('absolute' => TRUE));
+    // Last-modified, but no etag.
+    $feed_urls[] = url('aggregator/test-feed/1', array('absolute' => TRUE));
+    // No Last-modified, but etag.
+    $feed_urls[] = url('aggregator/test-feed/0/1', array('absolute' => TRUE));
+    // Last-modified and etag.
+    $feed_urls[] = url('aggregator/test-feed/1/1', array('absolute' => TRUE));
+
+    foreach ($feed_urls as $feed_url) {
+      $feed = $this->createFeed($feed_url);
+      // Update and remove items two times in a row to make sure that removal
+      // resets all 'modified' information (modified, etag, hash) and allows for
+      // immediate update.
+      $this->updateAndRemove($feed, 4);
+      $this->updateAndRemove($feed, 4);
+      $this->updateAndRemove($feed, 4);
+      // Delete feed.
+      $this->deleteFeed($feed);
+    }
+  }
+}
+
+/**
+ * Tests categorization functionality in the Aggregator module.
+ */
+class CategorizeFeedItemTestCase extends AggregatorTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Categorize feed item functionality',
+      'description' => 'Test feed item categorization.',
+      'group' => 'Aggregator'
+    );
+  }
+
+  /**
+   * Checks that children of a feed inherit a defined category.
+   *
+   * If a feed has a category, make sure that the children inherit that
+   * categorization.
+   */
+  function testCategorizeFeedItem() {
+    $this->createSampleNodes();
+
+    // Simulate form submission on "admin/config/services/aggregator/add/category".
+    $edit = array('title' => $this->randomName(10), 'description' => '');
+    $this->drupalPost('admin/config/services/aggregator/add/category', $edit, t('Save'));
+    $this->assertRaw(t('The category %title has been added.', array('%title' => $edit['title'])), format_string('The category %title has been added.', array('%title' => $edit['title'])));
+
+    $category = db_query("SELECT * FROM {aggregator_category} WHERE title = :title", array(':title' => $edit['title']))->fetch();
+    $this->assertTrue(!empty($category), 'The category found in database.');
+
+    $link_path = 'aggregator/categories/' . $category->cid;
+    $menu_link = db_query("SELECT * FROM {menu_links} WHERE link_path = :link_path", array(':link_path' => $link_path))->fetch();
+    $this->assertTrue(!empty($menu_link), 'The menu link associated with the category found in database.');
+
+    $feed = $this->createFeed();
+    db_insert('aggregator_category_feed')
+      ->fields(array(
+        'cid' => $category->cid,
+        'fid' => $feed->fid,
+      ))
+      ->execute();
+    $this->updateFeedItems($feed, $this->getDefaultFeedItemCount());
+    $this->getFeedCategories($feed);
+    $this->assertTrue(!empty($feed->categories), 'The category found in the feed.');
+
+    // For each category of a feed, ensure feed items have that category, too.
+    if (!empty($feed->categories) && !empty($feed->items)) {
+      foreach ($feed->categories as $category) {
+        $categorized_count = db_select('aggregator_category_item')
+          ->condition('iid', $feed->items, 'IN')
+          ->countQuery()
+          ->execute()
+          ->fetchField();
+
+        $this->assertEqual($feed->item_count, $categorized_count, 'Total items in feed equal to the total categorized feed items in database');
+      }
+    }
+
+    // Delete feed.
+    $this->deleteFeed($feed);
+  }
+}
+
+/**
+ * Tests importing feeds from OPML functionality for the Aggregator module.
+ */
+class ImportOPMLTestCase extends AggregatorTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Import feeds from OPML functionality',
+      'description' => 'Test OPML import.',
+      'group' => 'Aggregator',
+    );
+  }
+
+  /**
+   * Opens OPML import form.
+   */
+  function openImportForm() {
+    db_delete('aggregator_category')->execute();
+
+    $category = $this->randomName(10);
+    $cid = db_insert('aggregator_category')
+      ->fields(array(
+        'title' => $category,
+        'description' => '',
+      ))
+      ->execute();
+
+    $this->drupalGet('admin/config/services/aggregator/add/opml');
+    $this->assertText('A single OPML document may contain a collection of many feeds.', 'Found OPML help text.');
+    $this->assertField('files[upload]', 'Found file upload field.');
+    $this->assertField('remote', 'Found Remote URL field.');
+    $this->assertField('refresh', 'Found Refresh field.');
+    $this->assertFieldByName("category[$cid]", $cid, 'Found category field.');
+  }
+
+  /**
+   * Submits form filled with invalid fields.
+   */
+  function validateImportFormFields() {
+    $before = db_query('SELECT COUNT(*) FROM {aggregator_feed}')->fetchField();
+
+    $edit = array();
+    $this->drupalPost('admin/config/services/aggregator/add/opml', $edit, t('Import'));
+    $this->assertRaw(t('You must <em>either</em> upload a file or enter a URL.'), 'Error if no fields are filled.');
+
+    $path = $this->getEmptyOpml();
+    $edit = array(
+      'files[upload]' => $path,
+      'remote' => file_create_url($path),
+    );
+    $this->drupalPost('admin/config/services/aggregator/add/opml', $edit, t('Import'));
+    $this->assertRaw(t('You must <em>either</em> upload a file or enter a URL.'), 'Error if both fields are filled.');
+
+    $edit = array('remote' => 'invalidUrl://empty');
+    $this->drupalPost('admin/config/services/aggregator/add/opml', $edit, t('Import'));
+    $this->assertText(t('This URL is not valid.'), 'Error if the URL is invalid.');
+
+    $after = db_query('SELECT COUNT(*) FROM {aggregator_feed}')->fetchField();
+    $this->assertEqual($before, $after, 'No feeds were added during the three last form submissions.');
+  }
+
+  /**
+   * Submits form with invalid, empty, and valid OPML files.
+   */
+  function submitImportForm() {
+    $before = db_query('SELECT COUNT(*) FROM {aggregator_feed}')->fetchField();
+
+    $form['files[upload]'] = $this->getInvalidOpml();
+    $this->drupalPost('admin/config/services/aggregator/add/opml', $form, t('Import'));
+    $this->assertText(t('No new feed has been added.'), 'Attempting to upload invalid XML.');
+
+    $edit = array('remote' => file_create_url($this->getEmptyOpml()));
+    $this->drupalPost('admin/config/services/aggregator/add/opml', $edit, t('Import'));
+    $this->assertText(t('No new feed has been added.'), 'Attempting to load empty OPML from remote URL.');
+
+    $after = db_query('SELECT COUNT(*) FROM {aggregator_feed}')->fetchField();
+    $this->assertEqual($before, $after, 'No feeds were added during the two last form submissions.');
+
+    db_delete('aggregator_feed')->execute();
+    db_delete('aggregator_category')->execute();
+    db_delete('aggregator_category_feed')->execute();
+
+    $category = $this->randomName(10);
+    db_insert('aggregator_category')
+      ->fields(array(
+        'cid' => 1,
+        'title' => $category,
+        'description' => '',
+      ))
+      ->execute();
+
+    $feeds[0] = $this->getFeedEditArray();
+    $feeds[1] = $this->getFeedEditArray();
+    $feeds[2] = $this->getFeedEditArray();
+    $edit = array(
+      'files[upload]' => $this->getValidOpml($feeds),
+      'refresh'       => '900',
+      'category[1]'   => $category,
+    );
+    $this->drupalPost('admin/config/services/aggregator/add/opml', $edit, t('Import'));
+    $this->assertRaw(t('A feed with the URL %url already exists.', array('%url' => $feeds[0]['url'])), 'Verifying that a duplicate URL was identified');
+    $this->assertRaw(t('A feed named %title already exists.', array('%title' => $feeds[1]['title'])), 'Verifying that a duplicate title was identified');
+
+    $after = db_query('SELECT COUNT(*) FROM {aggregator_feed}')->fetchField();
+    $this->assertEqual($after, 2, 'Verifying that two distinct feeds were added.');
+
+    $feeds_from_db = db_query("SELECT f.title, f.url, f.refresh, cf.cid FROM {aggregator_feed} f LEFT JOIN {aggregator_category_feed} cf ON f.fid = cf.fid");
+    $refresh = $category = TRUE;
+    foreach ($feeds_from_db as $feed) {
+      $title[$feed->url] = $feed->title;
+      $url[$feed->title] = $feed->url;
+      $category = $category && $feed->cid == 1;
+      $refresh = $refresh && $feed->refresh == 900;
+    }
+
+    $this->assertEqual($title[$feeds[0]['url']], $feeds[0]['title'], 'First feed was added correctly.');
+    $this->assertEqual($url[$feeds[1]['title']], $feeds[1]['url'], 'Second feed was added correctly.');
+    $this->assertTrue($refresh, 'Refresh times are correct.');
+    $this->assertTrue($category, 'Categories are correct.');
+  }
+
+  /**
+   * Tests the import of an OPML file.
+   */
+  function testOPMLImport() {
+    $this->openImportForm();
+    $this->validateImportFormFields();
+    $this->submitImportForm();
+  }
+}
+
+/**
+ * Tests functionality of the cron process in the Aggregator module.
+ */
+class AggregatorCronTestCase extends AggregatorTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Update on cron functionality',
+      'description' => 'Update feeds on cron.',
+      'group' => 'Aggregator'
+    );
+  }
+
+  /**
+   * Adds feeds and updates them via cron process.
+   */
+  public function testCron() {
+    // Create feed and test basic updating on cron.
+    global $base_url;
+    $key = variable_get('cron_key', 'drupal');
+    $this->createSampleNodes();
+    $feed = $this->createFeed();
+    $this->drupalGet($base_url . '/cron.php', array('external' => TRUE, 'query' => array('cron_key' => $key)));
+    $this->assertEqual(5, db_query('SELECT COUNT(*) FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->fid))->fetchField(), 'Expected number of items in database.');
+    $this->removeFeedItems($feed);
+    $this->assertEqual(0, db_query('SELECT COUNT(*) FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->fid))->fetchField(), 'Expected number of items in database.');
+    $this->drupalGet($base_url . '/cron.php', array('external' => TRUE, 'query' => array('cron_key' => $key)));
+    $this->assertEqual(5, db_query('SELECT COUNT(*) FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->fid))->fetchField(), 'Expected number of items in database.');
+
+    // Test feed locking when queued for update.
+    $this->removeFeedItems($feed);
+    db_update('aggregator_feed')
+      ->condition('fid', $feed->fid)
+      ->fields(array(
+        'queued' => REQUEST_TIME,
+      ))
+      ->execute();
+    $this->drupalGet($base_url . '/cron.php', array('external' => TRUE, 'query' => array('cron_key' => $key)));
+    $this->assertEqual(0, db_query('SELECT COUNT(*) FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->fid))->fetchField(), 'Expected number of items in database.');
+    db_update('aggregator_feed')
+      ->condition('fid', $feed->fid)
+      ->fields(array(
+        'queued' => 0,
+      ))
+      ->execute();
+    $this->drupalGet($base_url . '/cron.php', array('external' => TRUE, 'query' => array('cron_key' => $key)));
+    $this->assertEqual(5, db_query('SELECT COUNT(*) FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->fid))->fetchField(), 'Expected number of items in database.');
+  }
+}
+
+/**
+ * Tests rendering functionality in the Aggregator module.
+ */
+class AggregatorRenderingTestCase extends AggregatorTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Checks display of aggregator items',
+      'description' => 'Checks display of aggregator items on the page.',
+      'group' => 'Aggregator'
+    );
+  }
+
+  /**
+   * Adds a feed block to the page and checks its links.
+   *
+   * @todo Test the category block as well.
+   */
+  public function testBlockLinks() {
+    // Create feed.
+    $this->createSampleNodes();
+    $feed = $this->createFeed();
+    $this->updateFeedItems($feed, $this->getDefaultFeedItemCount());
+
+    // Place block on page (@see block.test:moveBlockToRegion())
+    // Need admin user to be able to access block admin.
+    $this->admin_user = $this->drupalCreateUser(array(
+      'administer blocks',
+      'access administration pages',
+      'administer news feeds',
+      'access news feeds',
+    ));
+    $this->drupalLogin($this->admin_user);
+
+    // Prepare to use the block admin form.
+    $block = array(
+      'module' => 'aggregator',
+      'delta' => 'feed-' . $feed->fid,
+      'title' => $feed->title,
+    );
+    $region = 'footer';
+    $edit = array();
+    $edit['blocks[' . $block['module'] . '_' . $block['delta'] . '][region]'] = $region;
+    // Check the feed block is available in the block list form.
+    $this->drupalGet('admin/structure/block');
+    $this->assertFieldByName('blocks[' . $block['module'] . '_' . $block['delta'] . '][region]', '', 'Aggregator feed block is available for positioning.');
+    // Position it.
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->assertText(t('The block settings have been updated.'), format_string('Block successfully moved to %region_name region.', array( '%region_name' => $region)));
+    // Confirm that the block is now being displayed on pages.
+    $this->drupalGet('node');
+    $this->assertText(t($block['title']), 'Feed block is displayed on the page.');
+
+    // Find the expected read_more link.
+    $href = 'aggregator/sources/' . $feed->fid;
+    $links = $this->xpath('//a[@href = :href]', array(':href' => url($href)));
+    $this->assert(isset($links[0]), format_string('Link to href %href found.', array('%href' => $href)));
+
+    // Visit that page.
+    $this->drupalGet($href);
+    $correct_titles = $this->xpath('//h1[normalize-space(text())=:title]', array(':title' => $feed->title));
+    $this->assertFalse(empty($correct_titles), 'Aggregator feed page is available and has the correct title.');
+
+    // Set the number of news items to 0 to test that the block does not show
+    // up.
+    $feed->block = 0;
+    aggregator_save_feed((array) $feed);
+    // It is necessary to flush the cache after saving the number of items.
+    drupal_flush_all_caches();
+    // Check that the block is no longer displayed.
+    $this->drupalGet('node');
+    $this->assertNoText(t($block['title']), 'Feed block is not displayed on the page when number of items is set to 0.');
+  }
+
+  /**
+   * Creates a feed and checks that feed's page.
+   */
+  public function testFeedPage() {
+    // Increase the number of items published in the rss.xml feed so we have
+    // enough articles to test paging.
+    variable_set('feed_default_items', 30);
+
+    // Create a feed with 30 items.
+    $this->createSampleNodes(30);
+    $feed = $this->createFeed();
+    $this->updateFeedItems($feed, 30);
+
+    // Check for the presence of a pager.
+    $this->drupalGet('aggregator/sources/' . $feed->fid);
+    $elements = $this->xpath("//ul[@class=:class]", array(':class' => 'pager'));
+    $this->assertTrue(!empty($elements), 'Individual source page contains a pager.');
+
+    // Reset the number of items in rss.xml to the default value.
+    variable_set('feed_default_items', 10);
+  }
+}
+
+/**
+ * Tests feed parsing in the Aggregator module.
+ */
+class FeedParserTestCase extends AggregatorTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Feed parser functionality',
+      'description' => 'Test the built-in feed parser with valid feed samples.',
+      'group' => 'Aggregator',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    // Do not remove old aggregator items during these tests, since our sample
+    // feeds have hardcoded dates in them (which may be expired when this test
+    // is run).
+    variable_set('aggregator_clear', AGGREGATOR_CLEAR_NEVER);
+  }
+
+  /**
+   * Tests a feed that uses the RSS 0.91 format.
+   */
+  function testRSS091Sample() {
+    $feed = $this->createFeed($this->getRSS091Sample());
+    aggregator_refresh($feed);
+    $this->drupalGet('aggregator/sources/' . $feed->fid);
+    $this->assertResponse(200, format_string('Feed %name exists.', array('%name' => $feed->title)));
+    $this->assertText('First example feed item title');
+    $this->assertLinkByHref('http://example.com/example-turns-one');
+    $this->assertText('First example feed item description.');
+
+    // Several additional items that include elements over 255 characters.
+    $this->assertRaw("Second example feed item title.");
+    $this->assertText('Long link feed item title');
+    $this->assertText('Long link feed item description');
+    $this->assertLinkByHref('http://example.com/tomorrow/and/tomorrow/and/tomorrow/creeps/in/this/petty/pace/from/day/to/day/to/the/last/syllable/of/recorded/time/and/all/our/yesterdays/have/lighted/fools/the/way/to/dusty/death/out/out/brief/candle/life/is/but/a/walking/shadow/a/poor/player/that/struts/and/frets/his/hour/upon/the/stage/and/is/heard/no/more/it/is/a/tale/told/by/an/idiot/full/of/sound/and/fury/signifying/nothing');
+    $this->assertText('Long author feed item title');
+    $this->assertText('Long author feed item description');
+    $this->assertLinkByHref('http://example.com/long/author');
+  }
+
+  /**
+   * Tests a feed that uses the Atom format.
+   */
+  function testAtomSample() {
+    $feed = $this->createFeed($this->getAtomSample());
+    aggregator_refresh($feed);
+    $this->drupalGet('aggregator/sources/' . $feed->fid);
+    $this->assertResponse(200, format_string('Feed %name exists.', array('%name' => $feed->title)));
+    $this->assertText('Atom-Powered Robots Run Amok');
+    $this->assertLinkByHref('http://example.org/2003/12/13/atom03');
+    $this->assertText('Some text.');
+    $this->assertEqual('urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', db_query('SELECT guid FROM {aggregator_item} WHERE link = :link', array(':link' => 'http://example.org/2003/12/13/atom03'))->fetchField(), 'Atom entry id element is parsed correctly.');
+  }
+}
diff --git a/htmltest/modules/aggregator/tests/aggregator_test.info b/htmltest/modules/aggregator/tests/aggregator_test.info
new file mode 100644
index 00000000..79b0aa3e
--- /dev/null
+++ b/htmltest/modules/aggregator/tests/aggregator_test.info
@@ -0,0 +1,12 @@
+name = "Aggregator module tests"
+description = "Support module for aggregator related testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/aggregator/tests/aggregator_test.module b/htmltest/modules/aggregator/tests/aggregator_test.module
new file mode 100644
index 00000000..2d26a5d9
--- /dev/null
+++ b/htmltest/modules/aggregator/tests/aggregator_test.module
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * Implements hook_menu().
+ */
+function aggregator_test_menu() {
+  $items['aggregator/test-feed'] = array(
+    'title' => 'Test feed static last modified date',
+    'description' => "A cached test feed with a static last modified date.",
+    'page callback' => 'aggregator_test_feed',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  return $items;
+}
+
+/**
+ * Page callback. Generates a test feed and simulates last-modified and etags.
+ *
+ * @param $use_last_modified
+ *   Set TRUE to send a last modified header.
+ * @param $use_etag
+ *   Set TRUE to send an etag.
+ */
+function aggregator_test_feed($use_last_modified = FALSE, $use_etag = FALSE) {
+  $last_modified = strtotime('Sun, 19 Nov 1978 05:00:00 GMT');
+  $etag = drupal_hash_base64($last_modified);
+
+  $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) : FALSE;
+  $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : FALSE;
+
+  // Send appropriate response. We respond with a 304 not modified on either
+  // etag or on last modified.
+  if ($use_last_modified) {
+    drupal_add_http_header('Last-Modified', gmdate(DATE_RFC1123, $last_modified));
+  }
+  if ($use_etag) {
+    drupal_add_http_header('ETag', $etag);
+  }
+  // Return 304 not modified if either last modified or etag match.
+  if ($last_modified == $if_modified_since || $etag == $if_none_match) {
+    drupal_add_http_header('Status', '304 Not Modified');
+    return;
+  }
+
+  // The following headers force validation of cache:
+  drupal_add_http_header('Expires', 'Sun, 19 Nov 1978 05:00:00 GMT');
+  drupal_add_http_header('Cache-Control', 'must-revalidate');
+  drupal_add_http_header('Content-Type', 'application/rss+xml; charset=utf-8');
+
+  // Read actual feed from file.
+  $file_name = DRUPAL_ROOT . '/' . drupal_get_path('module', 'aggregator') . '/tests/aggregator_test_rss091.xml';
+  $handle = fopen($file_name, 'r');
+  $feed = fread($handle, filesize($file_name));
+  fclose($handle);
+
+  print $feed;
+}
diff --git a/htmltest/modules/aggregator/tests/aggregator_test_atom.xml b/htmltest/modules/aggregator/tests/aggregator_test_atom.xml
new file mode 100644
index 00000000..357b2e5a
--- /dev/null
+++ b/htmltest/modules/aggregator/tests/aggregator_test_atom.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+
+  <title>Example Feed</title>
+  <link href="http://example.org/" />
+  <updated>2003-12-13T18:30:02Z</updated>
+  <author>
+    <name>John Doe</name>
+  </author>
+  <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id>
+
+  <entry>
+    <title>Atom-Powered Robots Run Amok</title>
+    <link href="http://example.org/2003/12/13/atom03" />
+    <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
+    <updated>2003-12-13T18:30:02Z</updated>
+    <summary>Some text.</summary>
+  </entry>
+
+</feed>
diff --git a/htmltest/modules/aggregator/tests/aggregator_test_rss091.xml b/htmltest/modules/aggregator/tests/aggregator_test_rss091.xml
new file mode 100644
index 00000000..29440227
--- /dev/null
+++ b/htmltest/modules/aggregator/tests/aggregator_test_rss091.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rss version="0.91">
+  <channel>
+    <title>Example</title>
+    <link>http://example.com</link>
+    <description>Example updates</description>
+    <language>en-us</language>
+    <copyright>Copyright 2000, Example team.</copyright>
+    <managingEditor>editor@example.com</managingEditor>
+    <webMaster>webmaster@example.com</webMaster>
+    <image>
+      <title>Example</title>
+      <url>http://example.com/images/druplicon.png</url>
+      <link>http://example.com</link>
+      <width>88</width>
+      <height>100</height>
+      <description>Example updates</description>
+    </image>
+    <item>
+      <title>First example feed item title</title>
+      <link>http://example.com/example-turns-one</link>
+      <description>First example feed item description.</description>
+    </item>
+    <item>
+      <title>Second example feed item title. This title is extremely long so that it exceeds the 255 character limit for titles in feed item storage. In fact it's so long that this sentence isn't long enough so I'm rambling a bit to make it longer, nearly there now. Ah now it's long enough so I'll shut up.</title>
+      <link>http://example.com/example-turns-two</link>
+      <description>Second example feed item description.</description>
+    </item>
+    <item>
+      <title>Long link feed item title.</title>
+      <link>http://example.com/tomorrow/and/tomorrow/and/tomorrow/creeps/in/this/petty/pace/from/day/to/day/to/the/last/syllable/of/recorded/time/and/all/our/yesterdays/have/lighted/fools/the/way/to/dusty/death/out/out/brief/candle/life/is/but/a/walking/shadow/a/poor/player/that/struts/and/frets/his/hour/upon/the/stage/and/is/heard/no/more/it/is/a/tale/told/by/an/idiot/full/of/sound/and/fury/signifying/nothing</link>
+      <description>Long link feed item description.</description>
+    </item>
+    <item>
+      <title>Long author feed item title.</title>
+      <link>http://example.com/long/author</link>
+      <author>I wanted to get out and walk eastward toward the park through the soft twilight, but each time I tried to go I became entangled in some wild, strident argument which pulled me back, as if with ropes, into my chair. Yet high over the city our line of yellow windows must have contributed their share of human secrecy to the casual watcher in the darkening streets, and I was him too, looking up and wondering. I was within and without, simultaneously enchanted and repelled by the inexhaustible variety of life.</author>
+      <description>Long author feed item description.</description>
+    </item>
+  </channel>
+</rss>
diff --git a/htmltest/modules/block/block-admin-display-form.tpl.php b/htmltest/modules/block/block-admin-display-form.tpl.php
new file mode 100644
index 00000000..17a15e40
--- /dev/null
+++ b/htmltest/modules/block/block-admin-display-form.tpl.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to configure blocks.
+ *
+ * Available variables:
+ * - $block_regions: An array of regions. Keyed by name with the title as value.
+ * - $block_listing: An array of blocks keyed by region and then delta.
+ * - $form_submit: Form submit button.
+ *
+ * Each $block_listing[$region] contains an array of blocks for that region.
+ *
+ * Each $data in $block_listing[$region] contains:
+ * - $data->region_title: Region title for the listed block.
+ * - $data->block_title: Block title.
+ * - $data->region_select: Drop-down menu for assigning a region.
+ * - $data->weight_select: Drop-down menu for setting weights.
+ * - $data->configure_link: Block configuration link.
+ * - $data->delete_link: For deleting user added blocks.
+ *
+ * @see template_preprocess_block_admin_display_form()
+ * @see theme_block_admin_display()
+ *
+ * @ingroup themeable
+ */
+?>
+<?php
+  // Add table javascript.
+  drupal_add_js('misc/tableheader.js');
+  drupal_add_js(drupal_get_path('module', 'block') . '/block.js');
+  foreach ($block_regions as $region => $title) {
+    drupal_add_tabledrag('blocks', 'match', 'sibling', 'block-region-select', 'block-region-' . $region, NULL, FALSE);
+    drupal_add_tabledrag('blocks', 'order', 'sibling', 'block-weight', 'block-weight-' . $region);
+  }
+?>
+<table id="blocks" class="sticky-enabled">
+  <thead>
+    <tr>
+      <th><?php print t('Block'); ?></th>
+      <th><?php print t('Region'); ?></th>
+      <th><?php print t('Weight'); ?></th>
+      <th colspan="2"><?php print t('Operations'); ?></th>
+    </tr>
+  </thead>
+  <tbody>
+    <?php $row = 0; ?>
+    <?php foreach ($block_regions as $region => $title): ?>
+      <tr class="region-title region-title-<?php print $region?>">
+        <td colspan="5"><?php print $title; ?></td>
+      </tr>
+      <tr class="region-message region-<?php print $region?>-message <?php print empty($block_listing[$region]) ? 'region-empty' : 'region-populated'; ?>">
+        <td colspan="5"><em><?php print t('No blocks in this region'); ?></em></td>
+      </tr>
+      <?php foreach ($block_listing[$region] as $delta => $data): ?>
+      <tr class="draggable <?php print $row % 2 == 0 ? 'odd' : 'even'; ?><?php print $data->row_class ? ' ' . $data->row_class : ''; ?>">
+        <td class="block"><?php print $data->block_title; ?></td>
+        <td><?php print $data->region_select; ?></td>
+        <td><?php print $data->weight_select; ?></td>
+        <td><?php print $data->configure_link; ?></td>
+        <td><?php print $data->delete_link; ?></td>
+      </tr>
+      <?php $row++; ?>
+      <?php endforeach; ?>
+    <?php endforeach; ?>
+  </tbody>
+</table>
+
+<?php print $form_submit; ?>
diff --git a/htmltest/modules/block/block.admin.inc b/htmltest/modules/block/block.admin.inc
new file mode 100644
index 00000000..bd617906
--- /dev/null
+++ b/htmltest/modules/block/block.admin.inc
@@ -0,0 +1,700 @@
+<?php
+
+/**
+ * @file
+ * Admin page callbacks for the block module.
+ */
+
+/**
+ * Menu callback for admin/structure/block/demo.
+ */
+function block_admin_demo($theme = NULL) {
+  drupal_add_css(drupal_get_path('module', 'block') . '/block.css');
+  return '';
+}
+
+/**
+ * Menu callback for admin/structure/block.
+ *
+ * @param $theme
+ *   The theme to display the administration page for. If not provided, defaults
+ *   to the currently used theme.
+ */
+function block_admin_display($theme = NULL) {
+  global $theme_key;
+
+  drupal_theme_initialize();
+
+  if (!isset($theme)) {
+    // If theme is not specifically set, rehash for the current theme.
+    $theme = $theme_key;
+  }
+
+  // Fetch and sort blocks.
+  $blocks = block_admin_display_prepare_blocks($theme);
+
+  return drupal_get_form('block_admin_display_form', $blocks, $theme);
+}
+
+/**
+ * Prepares a list of blocks for display on the blocks administration page.
+ *
+ * @param $theme
+ *   The machine-readable name of the theme whose blocks should be returned.
+ *
+ * @return
+ *   An array of blocks, as returned by _block_rehash(), sorted by region in
+ *   preparation for display on the blocks administration page.
+ *
+ * @see block_admin_display_form()
+ */
+function block_admin_display_prepare_blocks($theme) {
+  $blocks = _block_rehash($theme);
+  $compare_theme = &drupal_static('_block_compare:theme');
+  $compare_theme = $theme;
+  usort($blocks, '_block_compare');
+  return $blocks;
+}
+
+/**
+ * Form constructor for the main block administration form.
+ *
+ * @param $blocks
+ *   An array of blocks, as returned by block_admin_display_prepare_blocks().
+ * @param $theme
+ *   A string representing the name of the theme to edit blocks for.
+ * @param $block_regions
+ *   (optional) An array of regions in which the blocks will be allowed to be
+ *   placed. Defaults to all visible regions for the theme whose blocks are
+ *   being configured. In all cases, a dummy region for disabled blocks will
+ *   also be displayed.
+ *
+ * @return
+ *   An array representing the form definition.
+ *
+ * @ingroup forms
+ * @see block_admin_display_form_submit()
+ */
+function block_admin_display_form($form, &$form_state, $blocks, $theme, $block_regions = NULL) {
+
+  $form['#attached']['css'] = array(drupal_get_path('module', 'block') . '/block.css');
+
+  // Get a list of block regions if one was not provided.
+  if (!isset($block_regions)) {
+    $block_regions = system_region_list($theme, REGIONS_VISIBLE);
+  }
+
+  // Weights range from -delta to +delta, so delta should be at least half
+  // of the amount of blocks present. This makes sure all blocks in the same
+  // region get an unique weight.
+  $weight_delta = round(count($blocks) / 2);
+
+  // Build the form tree.
+  $form['edited_theme'] = array(
+    '#type' => 'value',
+    '#value' => $theme,
+  );
+  $form['block_regions'] = array(
+    '#type' => 'value',
+    // Add a last region for disabled blocks.
+    '#value' => $block_regions + array(BLOCK_REGION_NONE => BLOCK_REGION_NONE),
+  );
+  $form['blocks'] = array();
+  $form['#tree'] = TRUE;
+
+  foreach ($blocks as $i => $block) {
+    $key = $block['module'] . '_' . $block['delta'];
+    $form['blocks'][$key]['module'] = array(
+      '#type' => 'value',
+      '#value' => $block['module'],
+    );
+    $form['blocks'][$key]['delta'] = array(
+      '#type' => 'value',
+      '#value' => $block['delta'],
+    );
+    $form['blocks'][$key]['info'] = array(
+      '#markup' => check_plain($block['info']),
+    );
+    $form['blocks'][$key]['theme'] = array(
+      '#type' => 'hidden',
+      '#value' => $theme,
+    );
+    $form['blocks'][$key]['weight'] = array(
+      '#type' => 'weight',
+      '#default_value' => $block['weight'],
+      '#delta' => $weight_delta,
+      '#title_display' => 'invisible',
+      '#title' => t('Weight for @block block', array('@block' => $block['info'])),
+    );
+    $form['blocks'][$key]['region'] = array(
+      '#type' => 'select',
+      '#default_value' => $block['region'] != BLOCK_REGION_NONE ? $block['region'] : NULL,
+      '#empty_value' => BLOCK_REGION_NONE,
+      '#title_display' => 'invisible',
+      '#title' => t('Region for @block block', array('@block' => $block['info'])),
+      '#options' => $block_regions,
+    );
+    $form['blocks'][$key]['configure'] = array(
+      '#type' => 'link',
+      '#title' => t('configure'),
+      '#href' => 'admin/structure/block/manage/' . $block['module'] . '/' . $block['delta'] . '/configure',
+    );
+    if ($block['module'] == 'block') {
+      $form['blocks'][$key]['delete'] = array(
+        '#type' => 'link',
+        '#title' => t('delete'),
+        '#href' => 'admin/structure/block/manage/' . $block['module'] . '/' . $block['delta'] . '/delete',
+     );
+    }
+  }
+  // Do not allow disabling the main system content block when it is present.
+  if (isset($form['blocks']['system_main']['region'])) {
+    $form['blocks']['system_main']['region']['#required'] = TRUE;
+  }
+
+  $form['actions'] = array(
+    '#tree' => FALSE,
+    '#type' => 'actions',
+  );
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save blocks'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form submission handler for block_admin_display_form().
+ *
+ * @see block_admin_display_form()
+ */
+function block_admin_display_form_submit($form, &$form_state) {
+  $transaction = db_transaction();
+  try {
+    foreach ($form_state['values']['blocks'] as $block) {
+      $block['status'] = (int) ($block['region'] != BLOCK_REGION_NONE);
+      $block['region'] = $block['status'] ? $block['region'] : '';
+      db_update('block')
+        ->fields(array(
+          'status' => $block['status'],
+          'weight' => $block['weight'],
+          'region' => $block['region'],
+        ))
+        ->condition('module', $block['module'])
+        ->condition('delta', $block['delta'])
+        ->condition('theme', $block['theme'])
+        ->execute();
+    }
+  }
+  catch (Exception $e) {
+    $transaction->rollback();
+    watchdog_exception('block', $e);
+    throw $e;
+  }
+  drupal_set_message(t('The block settings have been updated.'));
+  cache_clear_all();
+}
+
+/**
+ * Sorts active blocks by region, then by weight; sorts inactive blocks by name.
+ *
+ * Callback for usort() in block_admin_display_prepare_blocks().
+ */
+function _block_compare($a, $b) {
+  global $theme_key;
+
+  // Theme should be set before calling this function, or the current theme
+  // is being used.
+  $theme = &drupal_static(__FUNCTION__ . ':theme');
+  if (!isset($theme)) {
+    $theme = $theme_key;
+  }
+
+  $regions = &drupal_static(__FUNCTION__ . ':regions');
+  // We need the region list to correctly order by region.
+  if (!isset($regions)) {
+    $regions = array_flip(array_keys(system_region_list($theme)));
+    $regions[BLOCK_REGION_NONE] = count($regions);
+  }
+
+  // Separate enabled from disabled.
+  $status = $b['status'] - $a['status'];
+  if ($status) {
+    return $status;
+  }
+  // Sort by region (in the order defined by theme .info file).
+  if ((!empty($a['region']) && !empty($b['region'])) && ($place = ($regions[$a['region']] - $regions[$b['region']]))) {
+    return $place;
+  }
+  // Sort by weight, unless disabled.
+  if ($a['region'] != BLOCK_REGION_NONE) {
+    $weight = $a['weight'] - $b['weight'];
+    if ($weight) {
+      return $weight;
+    }
+  }
+  // Sort by title.
+  return strcmp($a['info'], $b['info']);
+}
+
+/**
+ * Form constructor for the block configuration form.
+ *
+ * Also used by block_add_block_form() for adding a new custom block.
+ *
+ * @param $module
+ *   Name of the module that implements the block to be configured.
+ * @param $delta
+ *   Unique ID of the block within the context of $module.
+ *
+ * @see block_admin_configure_validate()
+ * @see block_admin_configure_submit()
+ * @ingroup forms
+ */
+function block_admin_configure($form, &$form_state, $module, $delta) {
+  $block = block_load($module, $delta);
+  $form['module'] = array(
+    '#type' => 'value',
+    '#value' => $block->module,
+  );
+  $form['delta'] = array(
+    '#type' => 'value',
+    '#value' => $block->delta,
+  );
+
+  // Get the block subject for the page title.
+  $info = module_invoke($block->module, 'block_info');
+  if (isset($info[$block->delta])) {
+    drupal_set_title(t("'%name' block", array('%name' => $info[$block->delta]['info'])), PASS_THROUGH);
+  }
+
+  $form['settings']['title'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Block title'),
+    '#maxlength' => 64,
+    '#description' => $block->module == 'block' ? t('The title of the block as shown to the user.') : t('Override the default title for the block. Use <em>!placeholder</em> to display no title, or leave blank to use the default block title.', array('!placeholder' => '&lt;none&gt;')),
+    '#default_value' => isset($block->title) ? $block->title : '',
+    '#weight' => -19,
+  );
+
+  // Module-specific block configuration.
+  if ($settings = module_invoke($block->module, 'block_configure', $block->delta)) {
+    foreach ($settings as $k => $v) {
+      $form['settings'][$k] = $v;
+    }
+  }
+
+  // Region settings.
+  $form['regions'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Region settings'),
+    '#collapsible' => FALSE,
+    '#description' => t('Specify in which themes and regions this block is displayed.'),
+    '#tree' => TRUE,
+  );
+
+  $theme_default = variable_get('theme_default', 'bartik');
+  $admin_theme = variable_get('admin_theme');
+  foreach (list_themes() as $key => $theme) {
+    // Only display enabled themes
+    if ($theme->status) {
+      $region = db_query("SELECT region FROM {block} WHERE module = :module AND delta = :delta AND theme = :theme", array(
+        ':module' => $block->module,
+        ':delta' => $block->delta,
+        ':theme' => $key,
+      ))->fetchField();
+
+      // Use a meaningful title for the main site theme and administrative
+      // theme.
+      $theme_title = $theme->info['name'];
+      if ($key == $theme_default) {
+        $theme_title = t('!theme (default theme)', array('!theme' => $theme_title));
+      }
+      elseif ($admin_theme && $key == $admin_theme) {
+        $theme_title = t('!theme (administration theme)', array('!theme' => $theme_title));
+      }
+      $form['regions'][$key] = array(
+        '#type' => 'select',
+        '#title' => $theme_title,
+        '#default_value' => !empty($region) && $region != -1 ? $region : NULL,
+        '#empty_value' => BLOCK_REGION_NONE,
+        '#options' => system_region_list($key, REGIONS_VISIBLE),
+        '#weight' => ($key == $theme_default ? 9 : 10),
+      );
+    }
+  }
+
+  // Visibility settings.
+  $form['visibility_title'] = array(
+    '#type' => 'item',
+    '#title' => t('Visibility settings'),
+  );
+  $form['visibility'] = array(
+    '#type' => 'vertical_tabs',
+    '#attached' => array(
+      'js' => array(drupal_get_path('module', 'block') . '/block.js'),
+    ),
+  );
+
+  // Per-path visibility.
+  $form['visibility']['path'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Pages'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#group' => 'visibility',
+    '#weight' => 0,
+  );
+
+  $access = user_access('use PHP for settings');
+  if (isset($block->visibility) && $block->visibility == BLOCK_VISIBILITY_PHP && !$access) {
+    $form['visibility']['path']['visibility'] = array(
+      '#type' => 'value',
+      '#value' => BLOCK_VISIBILITY_PHP,
+    );
+    $form['visibility']['path']['pages'] = array(
+      '#type' => 'value',
+      '#value' => isset($block->pages) ? $block->pages : '',
+    );
+  }
+  else {
+    $options = array(
+      BLOCK_VISIBILITY_NOTLISTED => t('All pages except those listed'),
+      BLOCK_VISIBILITY_LISTED => t('Only the listed pages'),
+    );
+    $description = t("Specify pages by using their paths. Enter one path per line. The '*' character is a wildcard. Example paths are %blog for the blog page and %blog-wildcard for every personal blog. %front is the front page.", array('%blog' => 'blog', '%blog-wildcard' => 'blog/*', '%front' => '<front>'));
+
+    if (module_exists('php') && $access) {
+      $options += array(BLOCK_VISIBILITY_PHP => t('Pages on which this PHP code returns <code>TRUE</code> (experts only)'));
+      $title = t('Pages or PHP code');
+      $description .= ' ' . t('If the PHP option is chosen, enter PHP code between %php. Note that executing incorrect PHP code can break your Drupal site.', array('%php' => '<?php ?>'));
+    }
+    else {
+      $title = t('Pages');
+    }
+    $form['visibility']['path']['visibility'] = array(
+      '#type' => 'radios',
+      '#title' => t('Show block on specific pages'),
+      '#options' => $options,
+      '#default_value' => isset($block->visibility) ? $block->visibility : BLOCK_VISIBILITY_NOTLISTED,
+    );
+    $form['visibility']['path']['pages'] = array(
+      '#type' => 'textarea',
+      '#title' => '<span class="element-invisible">' . $title . '</span>',
+      '#default_value' => isset($block->pages) ? $block->pages : '',
+      '#description' => $description,
+    );
+  }
+
+  // Per-role visibility.
+  $default_role_options = db_query("SELECT rid FROM {block_role} WHERE module = :module AND delta = :delta", array(
+    ':module' => $block->module,
+    ':delta' => $block->delta,
+  ))->fetchCol();
+  $role_options = array_map('check_plain', user_roles());
+  $form['visibility']['role'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Roles'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#group' => 'visibility',
+    '#weight' => 10,
+  );
+  $form['visibility']['role']['roles'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Show block for specific roles'),
+    '#default_value' => $default_role_options,
+    '#options' => $role_options,
+    '#description' => t('Show this block only for the selected role(s). If you select no roles, the block will be visible to all users.'),
+  );
+
+  // Per-user visibility.
+  $form['visibility']['user'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Users'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#group' => 'visibility',
+    '#weight' => 20,
+  );
+  $form['visibility']['user']['custom'] = array(
+    '#type' => 'radios',
+    '#title' => t('Customizable per user'),
+    '#options' => array(
+      BLOCK_CUSTOM_FIXED => t('Not customizable'),
+      BLOCK_CUSTOM_ENABLED => t('Customizable, visible by default'),
+      BLOCK_CUSTOM_DISABLED => t('Customizable, hidden by default'),
+    ),
+    '#description' => t('Allow individual users to customize the visibility of this block in their account settings.'),
+    '#default_value' => isset($block->custom) ? $block->custom : BLOCK_CUSTOM_FIXED,
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save block'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form validation handler for block_admin_configure().
+ *
+ * @see block_admin_configure()
+ * @see block_admin_configure_submit()
+ */
+function block_admin_configure_validate($form, &$form_state) {
+  if ($form_state['values']['module'] == 'block') {
+    $custom_block_exists = (bool) db_query_range('SELECT 1 FROM {block_custom} WHERE bid <> :bid AND info = :info', 0, 1, array(
+      ':bid' => $form_state['values']['delta'],
+      ':info' => $form_state['values']['info'],
+    ))->fetchField();
+    if (empty($form_state['values']['info']) || $custom_block_exists) {
+      form_set_error('info', t('Ensure that each block description is unique.'));
+    }
+  }
+}
+
+/**
+ * Form submission handler for block_admin_configure().
+ *
+ * @see block_admin_configure()
+ * @see block_admin_configure_validate()
+ */
+function block_admin_configure_submit($form, &$form_state) {
+  if (!form_get_errors()) {
+    $transaction = db_transaction();
+    try {
+      db_update('block')
+        ->fields(array(
+          'visibility' => (int) $form_state['values']['visibility'],
+          'pages' => trim($form_state['values']['pages']),
+          'custom' => (int) $form_state['values']['custom'],
+          'title' => $form_state['values']['title'],
+        ))
+        ->condition('module', $form_state['values']['module'])
+        ->condition('delta', $form_state['values']['delta'])
+        ->execute();
+
+      db_delete('block_role')
+        ->condition('module', $form_state['values']['module'])
+        ->condition('delta', $form_state['values']['delta'])
+        ->execute();
+      $query = db_insert('block_role')->fields(array('rid', 'module', 'delta'));
+      foreach (array_filter($form_state['values']['roles']) as $rid) {
+        $query->values(array(
+          'rid' => $rid,
+          'module' => $form_state['values']['module'],
+          'delta' => $form_state['values']['delta'],
+        ));
+      }
+      $query->execute();
+
+      // Store regions per theme for this block
+      foreach ($form_state['values']['regions'] as $theme => $region) {
+        db_merge('block')
+          ->key(array('theme' => $theme, 'delta' => $form_state['values']['delta'], 'module' => $form_state['values']['module']))
+          ->fields(array(
+            'region' => ($region == BLOCK_REGION_NONE ? '' : $region),
+            'pages' => trim($form_state['values']['pages']),
+            'status' => (int) ($region != BLOCK_REGION_NONE),
+          ))
+          ->execute();
+      }
+
+      module_invoke($form_state['values']['module'], 'block_save', $form_state['values']['delta'], $form_state['values']);
+    }
+    catch (Exception $e) {
+      $transaction->rollback();
+      watchdog_exception('block', $e);
+      throw $e;
+    }
+    drupal_set_message(t('The block configuration has been saved.'));
+    cache_clear_all();
+    $form_state['redirect'] = 'admin/structure/block';
+  }
+}
+
+/**
+ * Form constructor for the add block form.
+ *
+ * @see block_add_block_form_validate()
+ * @see block_add_block_form_submit()
+ * @ingroup forms
+ */
+function block_add_block_form($form, &$form_state) {
+  return block_admin_configure($form, $form_state, 'block', NULL);
+}
+
+/**
+ * Form validation handler for block_add_block_form().
+ *
+ * @see block_add_block_form()
+ * @see block_add_block_form_submit()
+ */
+function block_add_block_form_validate($form, &$form_state) {
+  $custom_block_exists = (bool) db_query_range('SELECT 1 FROM {block_custom} WHERE info = :info', 0, 1, array(':info' => $form_state['values']['info']))->fetchField();
+
+  if (empty($form_state['values']['info']) || $custom_block_exists) {
+    form_set_error('info', t('Ensure that each block description is unique.'));
+  }
+}
+
+/**
+ * Form submission handler for block_add_block_form().
+ *
+ * Saves the new custom block.
+ *
+ * @see block_add_block_form()
+ * @see block_add_block_form_validate()
+ */
+function block_add_block_form_submit($form, &$form_state) {
+  $delta = db_insert('block_custom')
+    ->fields(array(
+      'body' => $form_state['values']['body']['value'],
+      'info' => $form_state['values']['info'],
+      'format' => $form_state['values']['body']['format'],
+    ))
+    ->execute();
+  // Store block delta to allow other modules to work with new block.
+  $form_state['values']['delta'] = $delta;
+
+  $query = db_insert('block')->fields(array('visibility', 'pages', 'custom', 'title', 'module', 'theme', 'status', 'weight', 'delta', 'cache'));
+  foreach (list_themes() as $key => $theme) {
+    if ($theme->status) {
+      $query->values(array(
+        'visibility' => (int) $form_state['values']['visibility'],
+        'pages' => trim($form_state['values']['pages']),
+        'custom' => (int) $form_state['values']['custom'],
+        'title' => $form_state['values']['title'],
+        'module' => $form_state['values']['module'],
+        'theme' => $theme->name,
+        'status' => 0,
+        'weight' => 0,
+        'delta' => $delta,
+        'cache' => DRUPAL_NO_CACHE,
+      ));
+    }
+  }
+  $query->execute();
+
+  $query = db_insert('block_role')->fields(array('rid', 'module', 'delta'));
+  foreach (array_filter($form_state['values']['roles']) as $rid) {
+    $query->values(array(
+      'rid' => $rid,
+      'module' => $form_state['values']['module'],
+      'delta' => $delta,
+    ));
+  }
+  $query->execute();
+
+  // Store regions per theme for this block
+  foreach ($form_state['values']['regions'] as $theme => $region) {
+    db_merge('block')
+      ->key(array('theme' => $theme, 'delta' => $delta, 'module' => $form_state['values']['module']))
+      ->fields(array(
+        'region' => ($region == BLOCK_REGION_NONE ? '' : $region),
+        'pages' => trim($form_state['values']['pages']),
+        'status' => (int) ($region != BLOCK_REGION_NONE),
+      ))
+      ->execute();
+  }
+
+  drupal_set_message(t('The block has been created.'));
+  cache_clear_all();
+  $form_state['redirect'] = 'admin/structure/block';
+}
+
+/**
+ * Form constructor for the custom block deletion form.
+ *
+ * @param $module
+ *   The name of the module that implements the block to be deleted. This should
+ *   always equal 'block' since it only allows custom blocks to be deleted.
+ * @param $delta
+ *   The unique ID of the block within the context of $module.
+ *
+ * @see block_custom_block_delete_submit()
+ */
+function block_custom_block_delete($form, &$form_state, $module, $delta) {
+  $block = block_load($module, $delta);
+  $custom_block = block_custom_block_get($block->delta);
+  $form['info'] = array('#type' => 'hidden', '#value' => $custom_block['info'] ? $custom_block['info'] : $custom_block['title']);
+  $form['bid'] = array('#type' => 'hidden', '#value' => $block->delta);
+
+  return confirm_form($form, t('Are you sure you want to delete the block %name?', array('%name' => $custom_block['info'])), 'admin/structure/block', '', t('Delete'), t('Cancel'));
+}
+
+/**
+ * Form submission handler for block_custom_block_delete().
+ *
+ * @see block_custom_block_delete()
+ */
+function block_custom_block_delete_submit($form, &$form_state) {
+  db_delete('block_custom')
+    ->condition('bid', $form_state['values']['bid'])
+    ->execute();
+  db_delete('block')
+    ->condition('module', 'block')
+    ->condition('delta', $form_state['values']['bid'])
+    ->execute();
+  db_delete('block_role')
+    ->condition('module', 'block')
+    ->condition('delta', $form_state['values']['bid'])
+    ->execute();
+  drupal_set_message(t('The block %name has been removed.', array('%name' => $form_state['values']['info'])));
+  cache_clear_all();
+  $form_state['redirect'] = 'admin/structure/block';
+  return;
+}
+
+/**
+ * Processes variables for block-admin-display-form.tpl.php.
+ *
+ * The $variables array contains the following arguments:
+ * - $form
+ *
+ * @see block-admin-display.tpl.php
+ * @see theme_block_admin_display()
+ */
+function template_preprocess_block_admin_display_form(&$variables) {
+  $variables['block_regions'] = $variables['form']['block_regions']['#value'];
+  if (isset($variables['block_regions'][BLOCK_REGION_NONE])) {
+    $variables['block_regions'][BLOCK_REGION_NONE] = t('Disabled');
+  }
+
+  foreach ($variables['block_regions'] as $key => $value) {
+    // Initialize an empty array for the region.
+    $variables['block_listing'][$key] = array();
+  }
+
+  // Initialize disabled blocks array.
+  $variables['block_listing'][BLOCK_REGION_NONE] = array();
+
+  // Add each block in the form to the appropriate place in the block listing.
+  foreach (element_children($variables['form']['blocks']) as $i) {
+    $block = &$variables['form']['blocks'][$i];
+
+    // Fetch the region for the current block.
+    $region = (isset($block['region']['#default_value']) ? $block['region']['#default_value'] : BLOCK_REGION_NONE);
+
+    // Set special classes needed for table drag and drop.
+    $block['region']['#attributes']['class'] = array('block-region-select', 'block-region-' . $region);
+    $block['weight']['#attributes']['class'] = array('block-weight', 'block-weight-' . $region);
+
+    $variables['block_listing'][$region][$i] = new stdClass();
+    $variables['block_listing'][$region][$i]->row_class = !empty($block['#attributes']['class']) ? implode(' ', $block['#attributes']['class']) : '';
+    $variables['block_listing'][$region][$i]->block_modified = !empty($block['#attributes']['class']) && in_array('block-modified', $block['#attributes']['class']);
+    $variables['block_listing'][$region][$i]->block_title = drupal_render($block['info']);
+    $variables['block_listing'][$region][$i]->region_select = drupal_render($block['region']) . drupal_render($block['theme']);
+    $variables['block_listing'][$region][$i]->weight_select = drupal_render($block['weight']);
+    $variables['block_listing'][$region][$i]->configure_link = drupal_render($block['configure']);
+    $variables['block_listing'][$region][$i]->delete_link = !empty($block['delete']) ? drupal_render($block['delete']) : '';
+    $variables['block_listing'][$region][$i]->printed = FALSE;
+  }
+
+  $variables['form_submit'] = drupal_render_children($variables['form']);
+}
+
diff --git a/htmltest/modules/block/block.api.php b/htmltest/modules/block/block.api.php
new file mode 100644
index 00000000..d8e129e2
--- /dev/null
+++ b/htmltest/modules/block/block.api.php
@@ -0,0 +1,368 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Block module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Define all blocks provided by the module.
+ *
+ * This hook declares to Drupal what blocks are provided by your module and can
+ * optionally specify initial block configuration settings.
+ *
+ * In hook_block_info(), each block your module provides is given a unique
+ * identifier referred to as "delta" (the array key in the return value). Delta
+ * values only need to be unique within your module, and they are used in the
+ * following ways:
+ * - Passed into the other block hooks in your module as an argument to identify
+ *   the block being configured or viewed.
+ * - Used to construct the default HTML ID of "block-MODULE-DELTA" applied to
+ *   each block when it is rendered. This ID may then be used for CSS styling or
+ *   JavaScript programming.
+ * - Used to define a theming template suggestion of block__MODULE__DELTA, for
+ *   advanced theming possibilities.
+ * - Used by other modules to identify your block in hook_block_info_alter() and
+ *   other alter hooks.
+ * The values of delta can be strings or numbers, but because of the uses above
+ * it is preferable to use descriptive strings whenever possible, and only use a
+ * numeric identifier if you have to (for instance if your module allows users
+ * to create several similar blocks that you identify within your module code
+ * with numeric IDs). The maximum length for delta values is 32 bytes.
+ *
+ * @return
+ *   An associative array whose keys define the delta for each block and whose
+ *   values contain the block descriptions. Each block description is itself an
+ *   associative array, with the following key-value pairs:
+ *   - info: (required) The human-readable administrative name of the block.
+ *     This is used to identify the block on administration screens, and is not
+ *     displayed to non-administrative users.
+ *   - cache: (optional) A bitmask describing what kind of caching is
+ *     appropriate for the block. Drupal provides the following bitmask
+ *     constants for defining cache granularity:
+ *     - DRUPAL_CACHE_PER_ROLE (default): The block can change depending on the
+ *       roles the user viewing the page belongs to.
+ *     - DRUPAL_CACHE_PER_USER: The block can change depending on the user
+ *       viewing the page. This setting can be resource-consuming for sites with
+ *       large number of users, and should only be used when
+ *       DRUPAL_CACHE_PER_ROLE is not sufficient.
+ *     - DRUPAL_CACHE_PER_PAGE: The block can change depending on the page being
+ *       viewed.
+ *     - DRUPAL_CACHE_GLOBAL: The block is the same for every user on every page
+ *       where it is visible.
+ *     - DRUPAL_CACHE_CUSTOM: The module implements its own caching system.
+ *     - DRUPAL_NO_CACHE: The block should not get cached.
+ *   - properties: (optional) Array of additional metadata to add to the block.
+ *     Common properties include:
+ *     - administrative: Boolean that categorizes this block as usable in an
+ *       administrative context. This might include blocks that help an
+ *       administrator approve/deny comments, or view recently created user
+ *       accounts.
+ *   - weight: (optional) Initial value for the ordering weight of this block.
+ *     Most modules do not provide an initial value, and any value provided can
+ *     be modified by a user on the block configuration screen.
+ *   - status: (optional) Initial value for block enabled status. (1 = enabled,
+ *     0 = disabled). Most modules do not provide an initial value, and any
+ *     value provided can be modified by a user on the block configuration
+ *     screen.
+ *   - region: (optional) Initial value for theme region within which this
+ *     block is set. Most modules do not provide an initial value, and any value
+ *     provided can be modified by a user on the block configuration screen.
+ *     Note: If you set a region that isn't available in the currently enabled
+ *     theme, the block will be disabled.
+ *   - visibility: (optional) Initial value for the visibility flag, which tells
+ *     how to interpret the 'pages' value. Possible values are:
+ *     - BLOCK_VISIBILITY_NOTLISTED: Show on all pages except listed pages.
+ *       'pages' lists the paths where the block should not be shown.
+ *     - BLOCK_VISIBILITY_LISTED: Show only on listed pages. 'pages' lists the
+ *       paths where the block should be shown.
+ *     - BLOCK_VISIBILITY_PHP: Use custom PHP code to determine visibility.
+ *       'pages' gives the PHP code to use.
+ *     Most modules do not provide an initial value for 'visibility' or 'pages',
+ *     and any value provided can be modified by a user on the block
+ *     configuration screen.
+ *   - pages: (optional) See 'visibility' above. A string that contains one or
+ *     more page paths separated by '\n', '\r', or '\r\n' when 'visibility' is
+ *     set to BLOCK_VISIBILITY_NOTLISTED or BLOCK_VISIBILITY_LISTED, or custom
+ *     PHP code when 'visibility' is set to BLOCK_VISIBILITY_PHP. Paths may use
+ *     '*' as a wildcard (matching any number of characters); '<front>'
+ *     designates the site's front page. For BLOCK_VISIBILITY_PHP, the PHP
+ *     code's return value should be TRUE if the block is to be made visible or
+ *     FALSE if the block should not be visible.
+ *
+ * For a detailed usage example, see block_example.module.
+ *
+ * @see hook_block_configure()
+ * @see hook_block_save()
+ * @see hook_block_view()
+ * @see hook_block_info_alter()
+ */
+function hook_block_info() {
+  // This example comes from node.module.
+  $blocks['syndicate'] = array(
+    'info' => t('Syndicate'),
+    'cache' => DRUPAL_NO_CACHE
+  );
+
+  $blocks['recent'] = array(
+    'info' => t('Recent content'),
+    // DRUPAL_CACHE_PER_ROLE will be assumed.
+  );
+
+  return $blocks;
+}
+
+/**
+ * Change block definition before saving to the database.
+ *
+ * @param $blocks
+ *   A multidimensional array of blocks keyed by the defining module and delta;
+ *   the values are blocks returned by hook_block_info(). This hook is fired
+ *   after the blocks are collected from hook_block_info() and the database,
+ *   right before saving back to the database.
+ * @param $theme
+ *   The theme these blocks belong to.
+ * @param $code_blocks
+ *   The blocks as defined in hook_block_info() before being overwritten by the
+ *   database data.
+ *
+ * @see hook_block_info()
+ */
+function hook_block_info_alter(&$blocks, $theme, $code_blocks) {
+  // Disable the login block.
+  $blocks['user']['login']['status'] = 0;
+}
+
+/**
+ * Define a configuration form for a block.
+ *
+ * @param $delta
+ *   Which block is being configured. This is a unique identifier for the block
+ *   within the module, defined in hook_block_info().
+ *
+ * @return
+ *   A configuration form, if one is needed for your block beyond the standard
+ *   elements that the block module provides (block title, visibility, etc.).
+ *
+ * For a detailed usage example, see block_example.module.
+ *
+ * @see hook_block_info()
+ * @see hook_block_save()
+ */
+function hook_block_configure($delta = '') {
+  // This example comes from node.module.
+  $form = array();
+  if ($delta == 'recent') {
+    $form['node_recent_block_count'] = array(
+      '#type' => 'select',
+      '#title' => t('Number of recent content items to display'),
+      '#default_value' => variable_get('node_recent_block_count', 10),
+      '#options' => drupal_map_assoc(array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 30)),
+    );
+  }
+  return $form;
+}
+
+/**
+ * Save the configuration options from hook_block_configure().
+ *
+ * This hook allows you to save the block-specific configuration settings
+ * defined within your hook_block_configure().
+ *
+ * @param $delta
+ *   Which block is being configured. This is a unique identifier for the block
+ *   within the module, defined in hook_block_info().
+ * @param $edit
+ *   The submitted form data from the configuration form.
+ *
+ * For a detailed usage example, see block_example.module.
+ *
+ * @see hook_block_configure()
+ * @see hook_block_info()
+ */
+function hook_block_save($delta = '', $edit = array()) {
+  // This example comes from node.module.
+  if ($delta == 'recent') {
+    variable_set('node_recent_block_count', $edit['node_recent_block_count']);
+  }
+}
+
+/**
+ * Return a rendered or renderable view of a block.
+ *
+ * @param $delta
+ *   Which block to render. This is a unique identifier for the block
+ *   within the module, defined in hook_block_info().
+ *
+ * @return
+ *   Either an empty array so the block will not be shown or an array containing
+ *   the following elements:
+ *   - subject: The default localized title of the block. If the block does not
+ *     have a default title, this should be set to NULL.
+ *   - content: The content of the block's body. This may be a renderable array
+ *     (preferable) or a string containing rendered HTML content. If the content
+ *     is empty the block will not be shown.
+ *
+ * For a detailed usage example, see block_example.module.
+ *
+ * @see hook_block_info()
+ * @see hook_block_view_alter()
+ * @see hook_block_view_MODULE_DELTA_alter()
+ */
+function hook_block_view($delta = '') {
+  // This example is adapted from node.module.
+  $block = array();
+
+  switch ($delta) {
+    case 'syndicate':
+      $block['subject'] = t('Syndicate');
+      $block['content'] = array(
+        '#theme' => 'feed_icon',
+        '#url' => 'rss.xml',
+        '#title' => t('Syndicate'),
+      );
+      break;
+
+    case 'recent':
+      if (user_access('access content')) {
+        $block['subject'] = t('Recent content');
+        if ($nodes = node_get_recent(variable_get('node_recent_block_count', 10))) {
+          $block['content'] = array(
+            '#theme' => 'node_recent_block',
+            '#nodes' => $nodes,
+          );
+        } else {
+          $block['content'] = t('No content available.');
+        }
+      }
+      break;
+  }
+  return $block;
+}
+
+/**
+ * Perform alterations to the content of a block.
+ *
+ * This hook allows you to modify any data returned by hook_block_view().
+ *
+ * Note that instead of hook_block_view_alter(), which is called for all
+ * blocks, you can also use hook_block_view_MODULE_DELTA_alter() to alter a
+ * specific block.
+ *
+ * @param $data
+ *   The data as returned from the hook_block_view() implementation of the
+ *   module that defined the block. This could be an empty array or NULL value
+ *   (if the block is empty) or an array containing:
+ *   - subject: The default localized title of the block.
+ *   - content: Either a string or a renderable array representing the content
+ *     of the block. You should check that the content is an array before trying
+ *     to modify parts of the renderable structure.
+ * @param $block
+ *   The block object, as loaded from the database, having the main properties:
+ *   - module: The name of the module that defined the block.
+ *   - delta: The unique identifier for the block within that module, as defined
+ *     in hook_block_info().
+ *
+ * @see hook_block_view_MODULE_DELTA_alter()
+ * @see hook_block_view()
+ */
+function hook_block_view_alter(&$data, $block) {
+  // Remove the contextual links on all blocks that provide them.
+  if (is_array($data['content']) && isset($data['content']['#contextual_links'])) {
+    unset($data['content']['#contextual_links']);
+  }
+  // Add a theme wrapper function defined by the current module to all blocks
+  // provided by the "somemodule" module.
+  if (is_array($data['content']) && $block->module == 'somemodule') {
+    $data['content']['#theme_wrappers'][] = 'mymodule_special_block';
+  }
+}
+
+/**
+ * Perform alterations to a specific block.
+ *
+ * Modules can implement hook_block_view_MODULE_DELTA_alter() to modify a
+ * specific block, rather than implementing hook_block_view_alter().
+ *
+ * @param $data
+ *   The data as returned from the hook_block_view() implementation of the
+ *   module that defined the block. This could be an empty array or NULL value
+ *   (if the block is empty) or an array containing:
+ *   - subject: The localized title of the block.
+ *   - content: Either a string or a renderable array representing the content
+ *     of the block. You should check that the content is an array before trying
+ *     to modify parts of the renderable structure.
+ * @param $block
+ *   The block object, as loaded from the database, having the main properties:
+ *   - module: The name of the module that defined the block.
+ *   - delta: The unique identifier for the block within that module, as defined
+ *     in hook_block_info().
+ *
+ * @see hook_block_view_alter()
+ * @see hook_block_view()
+ */
+function hook_block_view_MODULE_DELTA_alter(&$data, $block) {
+  // This code will only run for a specific block. For example, if MODULE_DELTA
+  // in the function definition above is set to "mymodule_somedelta", the code
+  // will only run on the "somedelta" block provided by the "mymodule" module.
+
+  // Change the title of the "somedelta" block provided by the "mymodule"
+  // module.
+  $data['subject'] = t('New title of the block');
+}
+
+/**
+ * Act on blocks prior to rendering.
+ *
+ * This hook allows you to add, remove or modify blocks in the block list. The
+ * block list contains the block definitions, not the rendered blocks. The
+ * blocks are rendered after the modules have had a chance to manipulate the
+ * block list.
+ *
+ * You can also set $block->content here, which will override the content of the
+ * block and prevent hook_block_view() from running.
+ *
+ * @param $blocks
+ *   An array of $blocks, keyed by the block ID.
+ */
+function hook_block_list_alter(&$blocks) {
+  global $language, $theme_key;
+
+  // This example shows how to achieve language specific visibility setting for
+  // blocks.
+
+  $result = db_query('SELECT module, delta, language FROM {my_table}');
+  $block_languages = array();
+  foreach ($result as $record) {
+    $block_languages[$record->module][$record->delta][$record->language] = TRUE;
+  }
+
+  foreach ($blocks as $key => $block) {
+    // Any module using this alter should inspect the data before changing it,
+    // to ensure it is what they expect.
+    if (!isset($block->theme) || !isset($block->status) || $block->theme != $theme_key || $block->status != 1) {
+      // This block was added by a contrib module, leave it in the list.
+      continue;
+    }
+
+    if (!isset($block_languages[$block->module][$block->delta])) {
+      // No language setting for this block, leave it in the list.
+      continue;
+    }
+
+    if (!isset($block_languages[$block->module][$block->delta][$language->language])) {
+      // This block should not be displayed with the active language, remove
+      // from the list.
+      unset($blocks[$key]);
+    }
+  }
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/block/block.css b/htmltest/modules/block/block.css
new file mode 100644
index 00000000..214c8a25
--- /dev/null
+++ b/htmltest/modules/block/block.css
@@ -0,0 +1,36 @@
+
+#blocks tr.region-title td {
+  font-weight: bold;
+}
+#blocks tr.region-message {
+  font-weight: normal;
+  color: #999;
+}
+#blocks tr.region-populated {
+  display: none;
+}
+.block-region {
+  background-color: #ff6;
+  margin-top: 4px;
+  margin-bottom: 4px;
+  padding: 3px;
+}
+a.block-demo-backlink,
+a.block-demo-backlink:link,
+a.block-demo-backlink:visited {
+  background-color: #B4D7F0;
+  -moz-border-radius: 0 0 10px 10px;
+  -webkit-border-radius: 0 0 10px 10px;
+  border-radius: 0 0 10px 10px;
+  color: #000;
+  font-family: "Lucida Grande", Verdana, sans-serif;
+  font-size: small;
+  line-height: 20px;
+  left: 20px; /*LTR*/
+  padding: 5px 10px;
+  position: fixed;
+  z-index: 499;
+}
+a.block-demo-backlink:hover {
+  text-decoration: underline;
+}
diff --git a/htmltest/modules/block/block.info b/htmltest/modules/block/block.info
new file mode 100644
index 00000000..da40dd4a
--- /dev/null
+++ b/htmltest/modules/block/block.info
@@ -0,0 +1,13 @@
+name = Block
+description = Controls the visual building blocks a page is constructed with. Blocks are boxes of content rendered into an area, or region, of a web page.
+package = Core
+version = VERSION
+core = 7.x
+files[] = block.test
+configure = admin/structure/block
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/block/block.install b/htmltest/modules/block/block.install
new file mode 100644
index 00000000..a78c885e
--- /dev/null
+++ b/htmltest/modules/block/block.install
@@ -0,0 +1,477 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the block module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function block_schema() {
+  $schema['block'] = array(
+    'description' => 'Stores block settings, such as region and visibility settings.',
+    'fields' => array(
+      'bid' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique block ID.',
+      ),
+      'module' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => "The module from which the block originates; for example, 'user' for the Who's Online block, and 'block' for any custom blocks.",
+      ),
+      'delta' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '0',
+        'description' => 'Unique ID for block within a module.',
+      ),
+      'theme' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The theme under which the block settings apply.',
+      ),
+      'status' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'Block enabled status. (1 = enabled, 0 = disabled)',
+      ),
+      'weight' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Block weight within region.',
+      ),
+      'region' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Theme region within which the block is set.',
+      ),
+      'custom' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'Flag to indicate how users may control visibility of the block. (0 = Users cannot control, 1 = On by default, but can be hidden, 2 = Hidden by default, but can be shown)',
+      ),
+      'visibility' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'Flag to indicate how to show blocks on pages. (0 = Show on all pages except listed pages, 1 = Show only on listed pages, 2 = Use custom PHP code to determine visibility)',
+      ),
+      'pages' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'description' => 'Contents of the "Pages" block; contains either a list of paths on which to include/exclude the block or PHP code, depending on "visibility" setting.',
+      ),
+      'title' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Custom title for the block. (Empty string will use block default title, <none> will remove the title, text will cause block to use specified title.)',
+        'translatable' => TRUE,
+      ),
+      'cache' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 1,
+        'size' => 'tiny',
+        'description' => 'Binary flag to indicate block cache mode. (-2: Custom cache, -1: Do not cache, 1: Cache per role, 2: Cache per user, 4: Cache per page, 8: Block cache global) See DRUPAL_CACHE_* constants in ../includes/common.inc for more detailed information.',
+      ),
+    ),
+    'primary key' => array('bid'),
+    'unique keys' => array(
+      'tmd' => array('theme', 'module', 'delta'),
+    ),
+    'indexes' => array(
+      'list' => array('theme', 'status', 'region', 'weight', 'module'),
+    ),
+  );
+
+  $schema['block_role'] = array(
+    'description' => 'Sets up access permissions for blocks based on user roles',
+    'fields' => array(
+      'module' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'description' => "The block's origin module, from {block}.module.",
+      ),
+      'delta' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'description' => "The block's unique delta within module, from {block}.delta.",
+      ),
+      'rid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => "The user's role ID from {users_roles}.rid.",
+      ),
+    ),
+    'primary key' => array('module', 'delta', 'rid'),
+    'indexes' => array(
+      'rid' => array('rid'),
+    ),
+  );
+
+  $schema['block_custom'] = array(
+    'description' => 'Stores contents of custom-made blocks.',
+    'fields' => array(
+      'bid' => array(
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => "The block's {block}.bid.",
+      ),
+      'body' => array(
+        'type' => 'text',
+        'not null' => FALSE,
+        'size' => 'big',
+        'description' => 'Block contents.',
+        'translatable' => TRUE,
+      ),
+      'info' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Block description.',
+      ),
+      'format' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => FALSE,
+        'description' => 'The {filter_format}.format of the block body.',
+      ),
+    ),
+    'unique keys' => array(
+      'info' => array('info'),
+    ),
+    'primary key' => array('bid'),
+  );
+
+  $schema['cache_block'] = drupal_get_schema_unprocessed('system', 'cache');
+  $schema['cache_block']['description'] = 'Cache table for the Block module to store already built blocks, identified by module, delta, and various contexts which may change the block, such as theme, locale, and caching mode defined for the block.';
+
+  return $schema;
+}
+
+/**
+ * Implements hook_install().
+ */
+function block_install() {
+
+  // Block should go first so that other modules can alter its output
+  // during hook_page_alter(). Almost everything on the page is a block,
+  // so before block module runs, there will not be much to alter.
+  db_update('system')
+    ->fields(array('weight' => -5))
+    ->condition('name', 'block')
+    ->execute();
+}
+
+/**
+ * Implements hook_update_dependencies().
+ */
+function block_update_dependencies() {
+  // block_update_7005() needs to query the {filter_format} table to get a list
+  // of existing text formats, so it must run after filter_update_7000(), which
+  // creates that table.
+  $dependencies['block'][7005] = array(
+    'filter' => 7000,
+  );
+
+  return $dependencies;
+}
+
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Set system.weight to a low value for block module.
+ *
+ * Block should go first so that other modules can alter its output
+ * during hook_page_alter(). Almost everything on the page is a block,
+ * so before block module runs, there will not be much to alter.
+ */
+function block_update_7000() {
+  db_update('system')
+    ->fields(array('weight' => '-5'))
+    ->condition('name', 'block')
+    ->execute();
+}
+
+/**
+ * Rename {blocks} table to {block}, {blocks_roles} to {block_role} and
+ * {boxes} to {block_custom}.
+ */
+function block_update_7002() {
+  db_drop_index('blocks', 'list');
+  db_rename_table('blocks', 'block');
+  db_rename_table('blocks_roles', 'block_role');
+  db_rename_table('boxes', 'block_custom');
+}
+
+/**
+ * Change the weight column to normal int.
+ */
+function block_update_7003() {
+  db_change_field('block', 'weight', 'weight', array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'description' => 'Block weight within region.',
+  ), array(
+    'indexes' => array(
+      'list' => array('theme', 'status', 'region', 'weight', 'module'),
+    ),
+  ));
+}
+
+/**
+ * Add new blocks to new regions, migrate custom variables to blocks.
+ */
+function block_update_7004() {
+  // Collect a list of themes with blocks.
+  $themes_with_blocks = array();
+  $result = db_query("SELECT s.name FROM {system} s INNER JOIN {block} b ON s.name = b.theme WHERE s.type = 'theme' GROUP by s.name");
+
+  $insert = db_insert('block')->fields(array('module', 'delta', 'theme', 'status', 'weight', 'region', 'pages', 'cache'));
+  foreach ($result as $theme) {
+    $themes_with_blocks[] = $theme->name;
+    // Add new system generated help block.
+    $insert->values(array(
+      'module' => 'system',
+      'delta' => 'help',
+      'theme' => $theme->name,
+      'status' => 1,
+      'weight' => 0,
+      'region' => 'help',
+      'pages' => '',
+      'cache' => DRUPAL_CACHE_PER_ROLE,
+    ));
+    // Add new system generated main page content block.
+    $insert->values(array(
+      'module' => 'system',
+      'delta' => 'main',
+      'theme' => $theme->name,
+      'status' => 1,
+      'weight' => 0,
+      'region' => 'content',
+      'pages' => '',
+      'cache' => DRUPAL_NO_CACHE,
+    ));
+  }
+  $insert->execute();
+
+  // Migrate blocks from left/right regions to first/second regions.
+  db_update('block')
+    ->fields(array('region' => 'sidebar_first'))
+    ->condition('region', 'left')
+    ->execute();
+  db_update('block')
+    ->fields(array('region' => 'sidebar_second'))
+    ->condition('region', 'right')
+    ->execute();
+
+  // Migrate contact form information.
+  $default_format = variable_get('filter_default_format', 1);
+  if ($contact_help = variable_get('contact_form_information', '')) {
+    $bid = db_insert('block_custom')
+      ->fields(array(
+        'body' => $contact_help,
+        'info' => 'Contact page help',
+        'format' => $default_format,
+      ))
+      ->execute();
+
+    $insert = db_insert('block')->fields(array('module', 'delta', 'theme', 'status', 'weight', 'region', 'visibility', 'pages', 'cache'));
+    foreach ($themes_with_blocks as $theme) {
+      // Add contact help block for themes, which had blocks.
+      $insert->values(array(
+        'module' => 'block',
+        'delta' => $bid,
+        'theme' => $theme,
+        'status' => 1,
+        'weight' => 5,
+        'region' => 'help',
+        'visibility' => BLOCK_VISIBILITY_LISTED,
+        'pages' => 'contact',
+        'cache' => DRUPAL_NO_CACHE,
+      ));
+    }
+    drupal_set_message('The contact form information setting was migrated to <a href="' . url('admin/structure/block/manage/block/' . $bid . '/configure') . '">a custom block</a> and set up to only show on the site-wide contact page. The block was set to use the default text format, which might differ from the HTML based format used before. Check the block and ensure that the output is right.');
+  }
+  $insert->execute();
+
+  // Migrate user help setting.
+  if ($user_help = variable_get('user_registration_help', '')) {
+    $bid = db_insert('block_custom')->fields(array('body' => $user_help, 'info' => 'User registration guidelines', 'format' => $default_format))->execute();
+
+    $insert = db_insert('block')->fields(array('module', 'delta', 'theme', 'status', 'weight', 'region', 'visibility', 'pages', 'cache'));
+    foreach ($themes_with_blocks as $theme) {
+      // Add user registration help block for themes, which had blocks.
+      $insert->values(array(
+        'module' => 'block',
+        'delta' => $bid,
+        'theme' => $theme,
+        'status' => 1,
+        'weight' => 5,
+        'region' => 'help',
+        'visibility' => BLOCK_VISIBILITY_LISTED,
+        'pages' => 'user/register',
+        'cache' => DRUPAL_NO_CACHE,
+      ));
+    }
+    drupal_set_message('The user registration guidelines were migrated to <a href="' . url('admin/structure/block/manage/block/' . $bid . '/configure') . '">a custom block</a> and set up to only show on the user registration page. The block was set to use the default text format, which might differ from the HTML based format used before. Check the block and ensure that the output is right.');
+    $insert->execute();
+  }
+
+  // Migrate site mission setting.
+  if ($mission = variable_get('site_mission')) {
+    $bid = db_insert('block_custom')->fields(array('body' => $mission, 'info' => 'Site mission', 'format' => $default_format))->execute();
+
+    $insert = db_insert('block')->fields(array('module', 'delta', 'theme', 'status', 'weight', 'region', 'visibility', 'pages', 'cache'));
+    foreach ($themes_with_blocks as $theme) {
+      // Add mission block for themes, which had blocks.
+      $insert->values(array(
+        'module' => 'block',
+        'delta' => $bid,
+        'theme' => $theme,
+        'status' => 1,
+        'weight' => 0,
+        'region' => 'highlighted',
+        'visibility' => BLOCK_VISIBILITY_LISTED,
+        'pages' => '<front>',
+        'cache' => DRUPAL_NO_CACHE,
+      ));
+    }
+    drupal_set_message('The site mission was migrated to <a href="' . url('admin/structure/block/manage/block/' . $bid . '/configure') . '">a custom block</a> and set up to only show on the front page in the highlighted content region. The block was set to use the default text format, which might differ from the HTML based format used before. Check the block and ensure that the output is right. If your theme does not have a highlighted content region, you might need to <a href="' . url('admin/structure/block') . '">relocate the block</a>.');
+    $insert->execute();
+    // Migrate mission to RSS site description.
+    variable_set('feed_description', $mission);
+  }
+
+  // Migrate site footer message to a custom block.
+  if ($footer_message = variable_get('site_footer', '')) {
+    $bid = db_insert('block_custom')->fields(array('body' => $footer_message, 'info' => 'Footer message', 'format' => $default_format))->execute();
+
+    $insert = db_insert('block')->fields(array('module', 'delta', 'theme', 'status', 'weight', 'region', 'pages', 'cache'));
+    foreach ($themes_with_blocks as $theme) {
+      // Add site footer block for themes, which had blocks.
+      // Set low weight, so the block comes early (it used to be
+      // before the other blocks).
+      $insert->values(array(
+        'module' => 'block',
+        'delta' => $bid,
+        'theme' => $theme,
+        'status' => 1,
+        'weight' => -10,
+        'region' => 'footer',
+        'pages' => '',
+        'cache' => DRUPAL_NO_CACHE,
+      ));
+    }
+    drupal_set_message('The footer message was migrated to <a href="' . url('admin/structure/block/manage/block/' . $bid . '/configure') . '">a custom block</a> and set up to appear in the footer. The block was set to use the default text format, which might differ from the HTML based format used before. Check the block and ensure that the output is right. If your theme does not have a footer region, you might need to <a href="' . url('admin/structure/block') . '">relocate the block</a>.');
+    $insert->execute();
+  }
+
+  // Remove the variables (even if they were saved empty on the admin interface),
+  // to avoid keeping clutter in the variables table.
+  variable_del('contact_form_information');
+  variable_del('user_registration_help');
+  variable_del('site_mission');
+  variable_del('site_footer');
+
+  // Rebuild theme data, so the new 'help' region is identified.
+  system_rebuild_theme_data();
+}
+
+/**
+ * Update the {block_custom}.format column.
+ */
+function block_update_7005() {
+  // For an explanation of these updates, see the code comments in
+  // user_update_7010().
+  db_change_field('block_custom', 'format', 'format', array(
+    'type' => 'int',
+    'unsigned' => TRUE,
+    'not null' => FALSE,
+    'description' => 'The {filter_format}.format of the block body.',
+  ));
+  db_update('block_custom')
+    ->fields(array('format' => NULL))
+    ->condition('body', '')
+    ->condition('format', 0)
+    ->execute();
+  $existing_formats = db_query("SELECT format FROM {filter_format}")->fetchCol();
+  $default_format = variable_get('filter_default_format', 1);
+  db_update('block_custom')
+    ->fields(array('format' => $default_format))
+    ->isNotNull('format')
+    ->condition('format', $existing_formats, 'NOT IN')
+    ->execute();
+}
+
+/**
+ * Recreates cache_block table.
+ *
+ * Converts fields that hold serialized variables from text to blob.
+ * Removes 'headers' column.
+ */
+function block_update_7006() {
+  $schema = system_schema_cache_7054();
+
+  db_drop_table('cache_block');
+  db_create_table('cache_block', $schema);
+}
+
+/**
+ * Change {block_custom}.format into varchar.
+ */
+function block_update_7007() {
+  db_change_field('block_custom', 'format', 'format', array(
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => FALSE,
+    'description' => 'The {filter_format}.format of the block body.',
+  ));
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x".
+ */
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Update database to match Drupal 7 schema.
+ */
+function block_update_7008() {
+  db_drop_field('block', 'throttle');
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra".
+ */
diff --git a/htmltest/modules/block/block.js b/htmltest/modules/block/block.js
new file mode 100644
index 00000000..acd3f5ae
--- /dev/null
+++ b/htmltest/modules/block/block.js
@@ -0,0 +1,152 @@
+(function ($) {
+
+/**
+ * Provide the summary information for the block settings vertical tabs.
+ */
+Drupal.behaviors.blockSettingsSummary = {
+  attach: function (context) {
+    // The drupalSetSummary method required for this behavior is not available
+    // on the Blocks administration page, so we need to make sure this
+    // behavior is processed only if drupalSetSummary is defined.
+    if (typeof jQuery.fn.drupalSetSummary == 'undefined') {
+      return;
+    }
+
+    $('fieldset#edit-path', context).drupalSetSummary(function (context) {
+      if (!$('textarea[name="pages"]', context).val()) {
+        return Drupal.t('Not restricted');
+      }
+      else {
+        return Drupal.t('Restricted to certain pages');
+      }
+    });
+
+    $('fieldset#edit-node-type', context).drupalSetSummary(function (context) {
+      var vals = [];
+      $('input[type="checkbox"]:checked', context).each(function () {
+        vals.push($.trim($(this).next('label').text()));
+      });
+      if (!vals.length) {
+        vals.push(Drupal.t('Not restricted'));
+      }
+      return vals.join(', ');
+    });
+
+    $('fieldset#edit-role', context).drupalSetSummary(function (context) {
+      var vals = [];
+      $('input[type="checkbox"]:checked', context).each(function () {
+        vals.push($.trim($(this).next('label').text()));
+      });
+      if (!vals.length) {
+        vals.push(Drupal.t('Not restricted'));
+      }
+      return vals.join(', ');
+    });
+
+    $('fieldset#edit-user', context).drupalSetSummary(function (context) {
+      var $radio = $('input[name="custom"]:checked', context);
+      if ($radio.val() == 0) {
+        return Drupal.t('Not customizable');
+      }
+      else {
+        return $radio.next('label').text();
+      }
+    });
+  }
+};
+
+/**
+ * Move a block in the blocks table from one region to another via select list.
+ *
+ * This behavior is dependent on the tableDrag behavior, since it uses the
+ * objects initialized in that behavior to update the row.
+ */
+Drupal.behaviors.blockDrag = {
+  attach: function (context, settings) {
+    // tableDrag is required and we should be on the blocks admin page.
+    if (typeof Drupal.tableDrag == 'undefined' || typeof Drupal.tableDrag.blocks == 'undefined') {
+      return;
+    }
+
+    var table = $('table#blocks');
+    var tableDrag = Drupal.tableDrag.blocks; // Get the blocks tableDrag object.
+
+    // Add a handler for when a row is swapped, update empty regions.
+    tableDrag.row.prototype.onSwap = function (swappedRow) {
+      checkEmptyRegions(table, this);
+    };
+
+    // A custom message for the blocks page specifically.
+    Drupal.theme.tableDragChangedWarning = function () {
+      return '<div class="messages warning">' + Drupal.theme('tableDragChangedMarker') + ' ' + Drupal.t('The changes to these blocks will not be saved until the <em>Save blocks</em> button is clicked.') + '</div>';
+    };
+
+    // Add a handler so when a row is dropped, update fields dropped into new regions.
+    tableDrag.onDrop = function () {
+      dragObject = this;
+      // Use "region-message" row instead of "region" row because
+      // "region-{region_name}-message" is less prone to regexp match errors.
+      var regionRow = $(dragObject.rowObject.element).prevAll('tr.region-message').get(0);
+      var regionName = regionRow.className.replace(/([^ ]+[ ]+)*region-([^ ]+)-message([ ]+[^ ]+)*/, '$2');
+      var regionField = $('select.block-region-select', dragObject.rowObject.element);
+      // Check whether the newly picked region is available for this block.
+      if ($('option[value=' + regionName + ']', regionField).length == 0) {
+        // If not, alert the user and keep the block in its old region setting.
+        alert(Drupal.t('The block cannot be placed in this region.'));
+        // Simulate that there was a selected element change, so the row is put
+        // back to from where the user tried to drag it.
+        regionField.change();
+      }
+      else if ($(dragObject.rowObject.element).prev('tr').is('.region-message')) {
+        var weightField = $('select.block-weight', dragObject.rowObject.element);
+        var oldRegionName = weightField[0].className.replace(/([^ ]+[ ]+)*block-weight-([^ ]+)([ ]+[^ ]+)*/, '$2');
+
+        if (!regionField.is('.block-region-' + regionName)) {
+          regionField.removeClass('block-region-' + oldRegionName).addClass('block-region-' + regionName);
+          weightField.removeClass('block-weight-' + oldRegionName).addClass('block-weight-' + regionName);
+          regionField.val(regionName);
+        }
+      }
+    };
+
+    // Add the behavior to each region select list.
+    $('select.block-region-select', context).once('block-region-select', function () {
+      $(this).change(function (event) {
+        // Make our new row and select field.
+        var row = $(this).closest('tr');
+        var select = $(this);
+        tableDrag.rowObject = new tableDrag.row(row);
+
+        // Find the correct region and insert the row as the last in the region.
+        table.find('.region-' + select[0].value + '-message').nextUntil('.region-message').last().before(row);
+
+        // Modify empty regions with added or removed fields.
+        checkEmptyRegions(table, row);
+        // Remove focus from selectbox.
+        select.get(0).blur();
+      });
+    });
+
+    var checkEmptyRegions = function (table, rowObject) {
+      $('tr.region-message', table).each(function () {
+        // If the dragged row is in this region, but above the message row, swap it down one space.
+        if ($(this).prev('tr').get(0) == rowObject.element) {
+          // Prevent a recursion problem when using the keyboard to move rows up.
+          if ((rowObject.method != 'keyboard' || rowObject.direction == 'down')) {
+            rowObject.swap('after', this);
+          }
+        }
+        // This region has become empty.
+        if ($(this).next('tr').is(':not(.draggable)') || $(this).next('tr').length == 0) {
+          $(this).removeClass('region-populated').addClass('region-empty');
+        }
+        // This region has become populated.
+        else if ($(this).is('.region-empty')) {
+          $(this).removeClass('region-empty').addClass('region-populated');
+        }
+      });
+    };
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/block/block.module b/htmltest/modules/block/block.module
new file mode 100644
index 00000000..2977ca88
--- /dev/null
+++ b/htmltest/modules/block/block.module
@@ -0,0 +1,1092 @@
+<?php
+
+/**
+ * @file
+ * Controls the visual building blocks a page is constructed with.
+ */
+
+/**
+ * Denotes that a block is not enabled in any region and should not be shown.
+ */
+define('BLOCK_REGION_NONE', -1);
+
+/**
+ * Users cannot control whether or not they see this block.
+ */
+define('BLOCK_CUSTOM_FIXED', 0);
+
+/**
+ *  Shows this block by default, but lets individual users hide it.
+ */
+define('BLOCK_CUSTOM_ENABLED', 1);
+
+/**
+ * Hides this block by default but lets individual users show it.
+ */
+define('BLOCK_CUSTOM_DISABLED', 2);
+
+/**
+ * Shows this block on every page except the listed pages.
+ */
+define('BLOCK_VISIBILITY_NOTLISTED', 0);
+
+/**
+ * Shows this block on only the listed pages.
+ */
+define('BLOCK_VISIBILITY_LISTED', 1);
+
+/**
+ * Shows this block if the associated PHP code returns TRUE.
+ */
+define('BLOCK_VISIBILITY_PHP', 2);
+
+/**
+ * Implements hook_help().
+ */
+function block_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#block':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Block module allows you to create boxes of content, which are rendered into an area, or region, of one or more pages of a website. The core Seven administration theme, for example, implements the regions "Content", "Help", "Dashboard main", and "Dashboard sidebar", and a block may appear in any one of these regions. The <a href="@blocks">Blocks administration page</a> provides a drag-and-drop interface for assigning a block to a region, and for controlling the order of blocks within regions. For more information, see the online handbook entry for <a href="@block">Block module</a>.', array('@block' => 'http://drupal.org/documentation/modules/block/', '@blocks' => url('admin/structure/block'))) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Positioning content') . '</dt>';
+      $output .= '<dd>' . t('When working with blocks, remember that all themes do <em>not</em> implement the same regions, or display regions in the same way. Blocks are positioned on a per-theme basis. Users with the <em>Administer blocks</em> permission can disable blocks. Disabled blocks are listed on the <a href="@blocks">Blocks administration page</a>, but are not displayed in any region.', array('@block' => 'http://drupal.org/documentation/modules/block/', '@blocks' => url('admin/structure/block'))) . '</dd>';
+      $output .= '<dt>' . t('Controlling visibility') . '</dt>';
+      $output .= '<dd>' . t('Blocks can be configured to be visible only on certain pages, only to users of certain roles, or only on pages displaying certain <a href="@content-type">content types</a>. Administrators can also allow specific blocks to be enabled or disabled by users when they edit their <a href="@user">My account</a> page. Some dynamic blocks, such as those generated by modules, will be displayed only on certain pages.', array('@content-type' => url('admin/structure/types'), '@user' => url('user'))) . '</dd>';
+      $output .= '<dt>' . t('Creating custom blocks') . '</dt>';
+      $output .= '<dd>' . t('Users with the <em>Administer blocks</em> permission can <a href="@block-add">add custom blocks</a>, which are then listed on the <a href="@blocks">Blocks administration page</a>. Once created, custom blocks behave just like default and module-generated blocks.', array('@blocks' => url('admin/structure/block'), '@block-add' => url('admin/structure/block/add'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'admin/structure/block/add':
+      return '<p>' . t('Use this page to create a new custom block.') . '</p>';
+  }
+  if ($arg[0] == 'admin' && $arg[1] == 'structure' && $arg['2'] == 'block' && (empty($arg[3]) || $arg[3] == 'list')) {
+    $demo_theme = !empty($arg[4]) ? $arg[4] : variable_get('theme_default', 'bartik');
+    $themes = list_themes();
+    $output = '<p>' . t('This page provides a drag-and-drop interface for assigning a block to a region, and for controlling the order of blocks within regions. Since not all themes implement the same regions, or display regions in the same way, blocks are positioned on a per-theme basis. Remember that your changes will not be saved until you click the <em>Save blocks</em> button at the bottom of the page. Click the <em>configure</em> link next to each block to configure its specific title and visibility settings.') . '</p>';
+    $output .= '<p>' . l(t('Demonstrate block regions (@theme)', array('@theme' => $themes[$demo_theme]->info['name'])), 'admin/structure/block/demo/' . $demo_theme) . '</p>';
+    return $output;
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function block_theme() {
+  return array(
+    'block' => array(
+      'render element' => 'elements',
+      'template' => 'block',
+    ),
+    'block_admin_display_form' => array(
+      'template' => 'block-admin-display-form',
+      'file' => 'block.admin.inc',
+      'render element' => 'form',
+    ),
+  );
+}
+
+/**
+ * Implements hook_permission().
+ */
+function block_permission() {
+  return array(
+    'administer blocks' => array(
+      'title' => t('Administer blocks'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_menu().
+ */
+function block_menu() {
+  $default_theme = variable_get('theme_default', 'bartik');
+  $items['admin/structure/block'] = array(
+    'title' => 'Blocks',
+    'description' => 'Configure what block content appears in your site\'s sidebars and other regions.',
+    'page callback' => 'block_admin_display',
+    'page arguments' => array($default_theme),
+    'access arguments' => array('administer blocks'),
+    'file' => 'block.admin.inc',
+  );
+  $items['admin/structure/block/manage/%/%'] = array(
+    'title' => 'Configure block',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('block_admin_configure', 4, 5),
+    'access arguments' => array('administer blocks'),
+    'file' => 'block.admin.inc',
+  );
+  $items['admin/structure/block/manage/%/%/configure'] = array(
+    'title' => 'Configure block',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'context' => MENU_CONTEXT_INLINE,
+  );
+  $items['admin/structure/block/manage/%/%/delete'] = array(
+    'title' => 'Delete block',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('block_custom_block_delete', 4, 5),
+    'access arguments' => array('administer blocks'),
+    'type' => MENU_LOCAL_TASK,
+    'context' => MENU_CONTEXT_NONE,
+    'file' => 'block.admin.inc',
+  );
+  $items['admin/structure/block/add'] = array(
+    'title' => 'Add block',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('block_add_block_form'),
+    'access arguments' => array('administer blocks'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'block.admin.inc',
+  );
+  foreach (list_themes() as $key => $theme) {
+    $items['admin/structure/block/list/' . $key] = array(
+      'title' => check_plain($theme->info['name']),
+      'page arguments' => array($key),
+      'type' => $key == $default_theme ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK,
+      'weight' => $key == $default_theme ? -10 : 0,
+      'access callback' => '_block_themes_access',
+      'access arguments' => array($theme),
+      'file' => 'block.admin.inc',
+    );
+    if ($key != $default_theme) {
+      $items['admin/structure/block/list/' . $key . '/add'] = array(
+        'title' => 'Add block',
+        'page callback' => 'drupal_get_form',
+        'page arguments' => array('block_add_block_form'),
+        'access arguments' => array('administer blocks'),
+        'type' => MENU_LOCAL_ACTION,
+        'file' => 'block.admin.inc',
+      );
+    }
+    $items['admin/structure/block/demo/' . $key] = array(
+      'title' => check_plain($theme->info['name']),
+      'page callback' => 'block_admin_demo',
+      'page arguments' => array($key),
+      'type' => MENU_CALLBACK,
+      'access callback' => '_block_themes_access',
+      'access arguments' => array($theme),
+      'theme callback' => '_block_custom_theme',
+      'theme arguments' => array($key),
+      'file' => 'block.admin.inc',
+    );
+  }
+  return $items;
+}
+
+/**
+ * Menu item access callback - only admin or enabled themes can be accessed.
+ */
+function _block_themes_access($theme) {
+  return user_access('administer blocks') && drupal_theme_access($theme);
+}
+
+/**
+ * Theme callback for the block configuration pages.
+ *
+ * @param $theme
+ *   The theme whose blocks are being configured. If not set, the default theme
+ *   is assumed.
+ * @return
+ *   The theme that should be used for the block configuration page, or NULL
+ *   to indicate that the default theme should be used.
+ */
+function _block_custom_theme($theme = NULL) {
+  // We return exactly what was passed in, to guarantee that the page will
+  // always be displayed using the theme whose blocks are being configured.
+  return $theme;
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function block_block_info() {
+  $blocks = array();
+
+  $result = db_query('SELECT bid, info FROM {block_custom} ORDER BY info');
+  foreach ($result as $block) {
+    $blocks[$block->bid]['info'] = $block->info;
+    // Not worth caching.
+    $blocks[$block->bid]['cache'] = DRUPAL_NO_CACHE;
+  }
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_configure().
+ */
+function block_block_configure($delta = 0) {
+  if ($delta) {
+    $custom_block = block_custom_block_get($delta);
+  }
+  else {
+    $custom_block = array();
+  }
+  return block_custom_block_form($custom_block);
+}
+
+/**
+ * Implements hook_block_save().
+ */
+function block_block_save($delta = 0, $edit = array()) {
+  block_custom_block_save($edit, $delta);
+}
+
+/**
+ * Implements hook_block_view().
+ *
+ * Generates the administrator-defined blocks for display.
+ */
+function block_block_view($delta = '') {
+  $block = db_query('SELECT body, format FROM {block_custom} WHERE bid = :bid', array(':bid' => $delta))->fetchObject();
+  $data['subject'] = NULL;
+  $data['content'] = check_markup($block->body, $block->format, '', TRUE);
+  return $data;
+}
+
+/**
+ * Implements hook_page_build().
+ *
+ * Renders blocks into their regions.
+ */
+function block_page_build(&$page) {
+  global $theme;
+
+  // The theme system might not yet be initialized. We need $theme.
+  drupal_theme_initialize();
+
+  // Fetch a list of regions for the current theme.
+  $all_regions = system_region_list($theme);
+
+  $item = menu_get_item();
+  if ($item['path'] != 'admin/structure/block/demo/' . $theme) {
+    // Load all region content assigned via blocks.
+    foreach (array_keys($all_regions) as $region) {
+      // Assign blocks to region.
+      if ($blocks = block_get_blocks_by_region($region)) {
+        $page[$region] = $blocks;
+      }
+    }
+    // Once we've finished attaching all blocks to the page, clear the static
+    // cache to allow modules to alter the block list differently in different
+    // contexts. For example, any code that triggers hook_page_build() more
+    // than once in the same page request may need to alter the block list
+    // differently each time, so that only certain parts of the page are
+    // actually built. We do not clear the cache any earlier than this, though,
+    // because it is used each time block_get_blocks_by_region() gets called
+    // above.
+    drupal_static_reset('block_list');
+  }
+  else {
+    // Append region description if we are rendering the regions demo page.
+    $item = menu_get_item();
+    if ($item['path'] == 'admin/structure/block/demo/' . $theme) {
+      $visible_regions = array_keys(system_region_list($theme, REGIONS_VISIBLE));
+      foreach ($visible_regions as $region) {
+        $description = '<div class="block-region">' . $all_regions[$region] . '</div>';
+        $page[$region]['block_description'] = array(
+          '#markup' => $description,
+          '#weight' => 15,
+        );
+      }
+      $page['page_top']['backlink'] = array(
+        '#type' => 'link',
+        '#title' => t('Exit block region demonstration'),
+        '#href' => 'admin/structure/block' . (variable_get('theme_default', 'bartik') == $theme ? '' : '/list/' . $theme),
+        // Add the "overlay-restore" class to indicate this link should restore
+        // the context in which the region demonstration page was opened.
+        '#options' => array('attributes' => array('class' => array('block-demo-backlink', 'overlay-restore'))),
+        '#weight' => -10,
+      );
+    }
+  }
+}
+
+/**
+ * Gets a renderable array of a region containing all enabled blocks.
+ *
+ * @param $region
+ *   The requested region.
+ *
+ * @return
+ *   A renderable array of a region containing all enabled blocks.
+ */
+function block_get_blocks_by_region($region) {
+  $build = array();
+  if ($list = block_list($region)) {
+    $build = _block_get_renderable_array($list);
+  }
+  return $build;
+}
+
+/**
+ * Gets an array of blocks suitable for drupal_render().
+ *
+ * @param $list
+ *   A list of blocks such as that returned by block_list().
+ *
+ * @return
+ *   A renderable array.
+ */
+function _block_get_renderable_array($list = array()) {
+  $weight = 0;
+  $build = array();
+  foreach ($list as $key => $block) {
+    $build[$key] = $block->content;
+    unset($block->content);
+
+    // Add contextual links for this block; skip the main content block, since
+    // contextual links are basically output as tabs/local tasks already. Also
+    // skip the help block, since we assume that most users do not need or want
+    // to perform contextual actions on the help block, and the links needlessly
+    // draw attention on it.
+    if ($key != 'system_main' && $key != 'system_help') {
+      $build[$key]['#contextual_links']['block'] = array('admin/structure/block/manage', array($block->module, $block->delta));
+    }
+
+    $build[$key] += array(
+      '#block' => $block,
+      '#weight' => ++$weight,
+    );
+    $build[$key]['#theme_wrappers'][] ='block';
+  }
+  $build['#sorted'] = TRUE;
+  return $build;
+}
+
+/**
+ * Updates the 'block' DB table with the blocks currently exported by modules.
+ *
+ * @param $theme
+ *   The theme to rehash blocks for. If not provided, defaults to the currently
+ *   used theme.
+ *
+ * @return
+ *   Blocks currently exported by modules.
+ */
+function _block_rehash($theme = NULL) {
+  global $theme_key;
+
+  drupal_theme_initialize();
+  if (!isset($theme)) {
+    // If theme is not specifically set, rehash for the current theme.
+    $theme = $theme_key;
+  }
+  $regions = system_region_list($theme);
+
+  // These are the blocks the function will return.
+  $blocks = array();
+  // These are the blocks defined by code and modified by the database.
+  $current_blocks = array();
+  // These are {block}.bid values to be kept.
+  $bids = array();
+  $or = db_or();
+  // Gather the blocks defined by modules.
+  foreach (module_implements('block_info') as $module) {
+    $module_blocks = module_invoke($module, 'block_info');
+    foreach ($module_blocks as $delta => $block) {
+      // Compile a condition to retrieve this block from the database.
+      $condition = db_and()
+        ->condition('module', $module)
+        ->condition('delta', $delta);
+      $or->condition($condition);
+      // Add identifiers.
+      $block['module'] = $module;
+      $block['delta']  = $delta;
+      $block['theme']  = $theme;
+      $current_blocks[$module][$delta] = $block;
+    }
+  }
+  // Save the blocks defined in code for alter context.
+  $code_blocks = $current_blocks;
+  $database_blocks = db_select('block', 'b', array('fetch' => PDO::FETCH_ASSOC))
+    ->fields('b')
+    ->condition($or)
+    ->condition('theme', $theme)
+    ->execute();
+  $original_database_blocks = array();
+  foreach ($database_blocks as $block) {
+    $module = $block['module'];
+    $delta = $block['delta'];
+    $original_database_blocks[$module][$delta] = $block;
+    // The cache mode can only by set from hook_block_info(), so that has
+    // precedence over the database's value.
+    if (isset($current_blocks[$module][$delta]['cache'])) {
+      $block['cache'] = $current_blocks[$module][$delta]['cache'];
+    }
+    // Preserve info which is not in the database.
+    $block['info'] = $current_blocks[$module][$delta]['info'];
+    // Blocks stored in the database override the blocks defined in code.
+    $current_blocks[$module][$delta] = $block;
+    // Preserve this block.
+    $bids[$block['bid']] = $block['bid'];
+  }
+  drupal_alter('block_info', $current_blocks, $theme, $code_blocks);
+  foreach ($current_blocks as $module => $module_blocks) {
+    foreach ($module_blocks as $delta => $block) {
+      if (!isset($block['pages'])) {
+        // {block}.pages is type 'text', so it cannot have a
+        // default value, and not null, so we need to provide
+        // value if the module did not.
+        $block['pages']  = '';
+      }
+      // Make sure weight is set.
+      if (!isset($block['weight'])) {
+        $block['weight'] = 0;
+      }
+      if (!empty($block['region']) && $block['region'] != BLOCK_REGION_NONE && !isset($regions[$block['region']]) && $block['status'] == 1) {
+        drupal_set_message(t('The block %info was assigned to the invalid region %region and has been disabled.', array('%info' => $block['info'], '%region' => $block['region'])), 'warning');
+        // Disabled modules are moved into the BLOCK_REGION_NONE later so no
+        // need to move the block to another region.
+        $block['status'] = 0;
+      }
+      // Set region to none if not enabled and make sure status is set.
+      if (empty($block['status'])) {
+        $block['status'] = 0;
+        $block['region'] = BLOCK_REGION_NONE;
+      }
+      // There is no point saving disabled blocks. Still, we need to save them
+      // because the 'title' attribute is saved to the {blocks} table.
+      if (isset($block['bid'])) {
+        // If the block has a bid property, it comes from the database and
+        // the record needs to be updated, so set the primary key to 'bid'
+        // before passing to drupal_write_record().
+        $primary_keys = array('bid');
+        // Remove a block from the list of blocks to keep if it became disabled.
+        unset($bids[$block['bid']]);
+      }
+      else {
+        $primary_keys = array();
+      }
+      // If the block is new or differs from the original database block, save
+      // it. To determine whether there was a change it is enough to examine
+      // the values for the keys in the original database record as that
+      // contained every database field.
+      if (!$primary_keys || array_diff_assoc($original_database_blocks[$module][$delta], $block)) {
+        drupal_write_record('block', $block, $primary_keys);
+        // Make it possible to test this.
+        $block['saved'] = TRUE;
+      }
+      // Add to the list of blocks we return.
+      $blocks[] = $block;
+    }
+  }
+  if ($bids) {
+    // Remove disabled that are no longer defined by the code from the
+    // database.
+    db_delete('block')
+      ->condition('bid', $bids, 'NOT IN')
+      ->condition('theme', $theme)
+      ->execute();
+  }
+  return $blocks;
+}
+
+/**
+ * Returns information from database about a user-created (custom) block.
+ *
+ * @param $bid
+ *   ID of the block to get information for.
+ *
+ * @return
+ *   Associative array of information stored in the database for this block.
+ *   Array keys:
+ *   - bid: Block ID.
+ *   - info: Block description.
+ *   - body: Block contents.
+ *   - format: Filter ID of the filter format for the body.
+ */
+function block_custom_block_get($bid) {
+  return db_query("SELECT * FROM {block_custom} WHERE bid = :bid", array(':bid' => $bid))->fetchAssoc();
+}
+
+/**
+ * Form constructor for the custom block form.
+ *
+ * @param $edit
+ *   (optional) An associative array of information retrieved by
+ *   block_custom_get_block() if an existing block is being edited, or an empty
+ *   array otherwise. Defaults to array().
+ *
+ * @ingroup forms
+ */
+function block_custom_block_form($edit = array()) {
+  $edit += array(
+    'info' => '',
+    'body' => '',
+  );
+  $form['info'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Block description'),
+    '#default_value' => $edit['info'],
+    '#maxlength' => 64,
+    '#description' => t('A brief description of your block. Used on the <a href="@overview">Blocks administration page</a>.', array('@overview' => url('admin/structure/block'))),
+    '#required' => TRUE,
+    '#weight' => -18,
+  );
+  $form['body_field']['#weight'] = -17;
+  $form['body_field']['body'] = array(
+    '#type' => 'text_format',
+    '#title' => t('Block body'),
+    '#default_value' => $edit['body'],
+    '#format' => isset($edit['format']) ? $edit['format'] : NULL,
+    '#rows' => 15,
+    '#description' => t('The content of the block as shown to the user.'),
+    '#required' => TRUE,
+    '#weight' => -17,
+  );
+
+  return $form;
+}
+
+/**
+ * Saves a user-created block in the database.
+ *
+ * @param $edit
+ *   Associative array of fields to save. Array keys:
+ *   - info: Block description.
+ *   - body: Associative array of body value and format.  Array keys:
+ *     - value: Block contents.
+ *     - format: Filter ID of the filter format for the body.
+ * @param $delta
+ *   Block ID of the block to save.
+ *
+ * @return
+ *   Always returns TRUE.
+ */
+function block_custom_block_save($edit, $delta) {
+  db_update('block_custom')
+    ->fields(array(
+      'body' => $edit['body']['value'],
+      'info' => $edit['info'],
+      'format' => $edit['body']['format'],
+    ))
+    ->condition('bid', $delta)
+    ->execute();
+  return TRUE;
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter() for user_profile_form().
+ */
+function block_form_user_profile_form_alter(&$form, &$form_state) {
+  if ($form['#user_category'] == 'account') {
+    $account = $form['#user'];
+    $rids = array_keys($account->roles);
+    $result = db_query("SELECT DISTINCT b.* FROM {block} b LEFT JOIN {block_role} r ON b.module = r.module AND b.delta = r.delta WHERE b.status = 1 AND b.custom <> 0 AND (r.rid IN (:rids) OR r.rid IS NULL) ORDER BY b.weight, b.module", array(':rids' => $rids));
+
+    $blocks = array();
+    foreach ($result as $block) {
+      $data = module_invoke($block->module, 'block_info');
+      if ($data[$block->delta]['info']) {
+        $blocks[$block->module][$block->delta] = array(
+          '#type' => 'checkbox',
+          '#title' => check_plain($data[$block->delta]['info']),
+          '#default_value' => isset($account->data['block'][$block->module][$block->delta]) ? $account->data['block'][$block->module][$block->delta] : ($block->custom == 1),
+        );
+      }
+    }
+    // Only display the fieldset if there are any personalizable blocks.
+    if ($blocks) {
+      $form['block'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('Personalize blocks'),
+        '#description' => t('Blocks consist of content or information that complements the main content of the page. Enable or disable optional blocks using the checkboxes below.'),
+        '#weight' => 3,
+        '#collapsible' => TRUE,
+        '#tree' => TRUE,
+      );
+      $form['block'] += $blocks;
+    }
+  }
+}
+
+/**
+ * Implements hook_user_presave().
+ */
+function block_user_presave(&$edit, $account, $category) {
+  if (isset($edit['block'])) {
+    $edit['data']['block'] = $edit['block'];
+  }
+}
+
+/**
+ * Initializes blocks for enabled themes.
+ *
+ * @param $theme_list
+ *   An array of theme names.
+ */
+function block_themes_enabled($theme_list) {
+  foreach ($theme_list as $theme) {
+    block_theme_initialize($theme);
+  }
+}
+
+/**
+ * Assigns an initial, default set of blocks for a theme.
+ *
+ * This function is called the first time a new theme is enabled. The new theme
+ * gets a copy of the default theme's blocks, with the difference that if a
+ * particular region isn't available in the new theme, the block is assigned
+ * to the new theme's default region.
+ *
+ * @param $theme
+ *   The name of a theme.
+ */
+function block_theme_initialize($theme) {
+  // Initialize theme's blocks if none already registered.
+  $has_blocks = (bool) db_query_range('SELECT 1 FROM {block} WHERE theme = :theme', 0, 1, array(':theme' => $theme))->fetchField();
+  if (!$has_blocks) {
+    $default_theme = variable_get('theme_default', 'bartik');
+    // Apply only to new theme's visible regions.
+    $regions = system_region_list($theme, REGIONS_VISIBLE);
+    $result = db_query("SELECT * FROM {block} WHERE theme = :theme", array(':theme' => $default_theme), array('fetch' => PDO::FETCH_ASSOC));
+    foreach ($result as $block) {
+      // If the region isn't supported by the theme, assign the block to the theme's default region.
+      if ($block['status'] && !isset($regions[$block['region']])) {
+        $block['region'] = system_default_region($theme);
+      }
+      $block['theme'] = $theme;
+      unset($block['bid']);
+      drupal_write_record('block', $block);
+    }
+  }
+}
+
+/**
+ * Returns all blocks in the specified region for the current user.
+ *
+ * @param $region
+ *   The name of a region.
+ *
+ * @return
+ *   An array of block objects, indexed with the module name and block delta
+ *   concatenated with an underscore, thus: MODULE_DELTA. If you are displaying
+ *   your blocks in one or two sidebars, you may check whether this array is
+ *   empty to see how many columns are going to be displayed.
+ *
+ * @todo
+ *   Now that the block table has a primary key, we should use that as the
+ *   array key instead of MODULE_DELTA.
+ */
+function block_list($region) {
+  $blocks = &drupal_static(__FUNCTION__);
+
+  if (!isset($blocks)) {
+    $blocks = _block_load_blocks();
+  }
+
+  // Create an empty array if there are no entries.
+  if (!isset($blocks[$region])) {
+    $blocks[$region] = array();
+  }
+  else {
+    $blocks[$region] = _block_render_blocks($blocks[$region]);
+  }
+
+  return $blocks[$region];
+}
+
+/**
+ * Loads a block object from the database.
+ *
+ * @param $module
+ *   Name of the module that implements the block to load.
+ * @param $delta
+ *   Unique ID of the block within the context of $module. Pass NULL to return
+ *   an empty block object for $module.
+ *
+ * @return
+ *   A block object.
+ */
+function block_load($module, $delta) {
+  if (isset($delta)) {
+    $block = db_query('SELECT * FROM {block} WHERE module = :module AND delta = :delta', array(':module' => $module, ':delta' => $delta))->fetchObject();
+  }
+
+  // If the block does not exist in the database yet return a stub block
+  // object.
+  if (empty($block)) {
+    $block = new stdClass();
+    $block->module = $module;
+    $block->delta = $delta;
+  }
+
+  return $block;
+}
+
+/**
+ * Loads blocks' information from the database.
+ *
+ * @return
+ *   An array of blocks grouped by region.
+ */
+function _block_load_blocks() {
+  global $theme_key;
+
+  $query = db_select('block', 'b');
+  $result = $query
+    ->fields('b')
+    ->condition('b.theme', $theme_key)
+    ->condition('b.status', 1)
+    ->orderBy('b.region')
+    ->orderBy('b.weight')
+    ->orderBy('b.module')
+    ->addTag('block_load')
+    ->addTag('translatable')
+    ->execute();
+
+  $block_info = $result->fetchAllAssoc('bid');
+  // Allow modules to modify the block list.
+  drupal_alter('block_list', $block_info);
+
+  $blocks = array();
+  foreach ($block_info as $block) {
+    $blocks[$block->region]["{$block->module}_{$block->delta}"] = $block;
+  }
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_list_alter().
+ *
+ * Checks the page, user role, and user-specific visibility settings.
+ * Removes the block if the visibility conditions are not met.
+ */
+function block_block_list_alter(&$blocks) {
+  global $user, $theme_key;
+
+  // Build an array of roles for each block.
+  $block_roles = array();
+  $result = db_query('SELECT module, delta, rid FROM {block_role}');
+  foreach ($result as $record) {
+    $block_roles[$record->module][$record->delta][] = $record->rid;
+  }
+
+  foreach ($blocks as $key => $block) {
+    if (!isset($block->theme) || !isset($block->status) || $block->theme != $theme_key || $block->status != 1) {
+      // This block was added by a contrib module, leave it in the list.
+      continue;
+    }
+
+    // If a block has no roles associated, it is displayed for every role.
+    // For blocks with roles associated, if none of the user's roles matches
+    // the settings from this block, remove it from the block list.
+    if (isset($block_roles[$block->module][$block->delta]) && !array_intersect($block_roles[$block->module][$block->delta], array_keys($user->roles))) {
+      // No match.
+      unset($blocks[$key]);
+      continue;
+    }
+
+    // Use the user's block visibility setting, if necessary.
+    if ($block->custom != BLOCK_CUSTOM_FIXED) {
+      if ($user->uid && isset($user->data['block'][$block->module][$block->delta])) {
+        $enabled = $user->data['block'][$block->module][$block->delta];
+      }
+      else {
+        $enabled = ($block->custom == BLOCK_CUSTOM_ENABLED);
+      }
+    }
+    else {
+      $enabled = TRUE;
+    }
+
+    // Limited visibility blocks must list at least one page.
+    if ($block->visibility == BLOCK_VISIBILITY_LISTED && empty($block->pages)) {
+      $enabled = FALSE;
+    }
+
+    if (!$enabled) {
+      unset($blocks[$key]);
+      continue;
+    }
+
+    // Match path if necessary.
+    if ($block->pages) {
+      // Convert path to lowercase. This allows comparison of the same path
+      // with different case. Ex: /Page, /page, /PAGE.
+      $pages = drupal_strtolower($block->pages);
+      if ($block->visibility < BLOCK_VISIBILITY_PHP) {
+        // Convert the Drupal path to lowercase
+        $path = drupal_strtolower(drupal_get_path_alias($_GET['q']));
+        // Compare the lowercase internal and lowercase path alias (if any).
+        $page_match = drupal_match_path($path, $pages);
+        if ($path != $_GET['q']) {
+          $page_match = $page_match || drupal_match_path($_GET['q'], $pages);
+        }
+        // When $block->visibility has a value of 0 (BLOCK_VISIBILITY_NOTLISTED),
+        // the block is displayed on all pages except those listed in $block->pages.
+        // When set to 1 (BLOCK_VISIBILITY_LISTED), it is displayed only on those
+        // pages listed in $block->pages.
+        $page_match = !($block->visibility xor $page_match);
+      }
+      elseif (module_exists('php')) {
+        $page_match = php_eval($block->pages);
+      }
+      else {
+        $page_match = FALSE;
+      }
+    }
+    else {
+      $page_match = TRUE;
+    }
+    if (!$page_match) {
+      unset($blocks[$key]);
+    }
+  }
+}
+
+/**
+ * Render the content and subject for a set of blocks.
+ *
+ * @param $region_blocks
+ *   An array of block objects such as returned for one region by _block_load_blocks().
+ *
+ * @return
+ *   An array of visible blocks as expected by drupal_render().
+ */
+function _block_render_blocks($region_blocks) {
+  // Block caching is not compatible with node access modules. We also
+  // preserve the submission of forms in blocks, by fetching from cache only
+  // if the request method is 'GET' (or 'HEAD').
+  $cacheable = !count(module_implements('node_grants')) && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD');
+
+  // Proceed to loop over all blocks in order to compute their respective cache
+  // identifiers; this allows us to do one single cache_get_multiple() call
+  // instead of doing one cache_get() call per block.
+  $cached_blocks = array();
+  $cids = array();
+
+  if ($cacheable) {
+    foreach ($region_blocks as $key => $block) {
+      if (!isset($block->content)) {
+        if (($cid = _block_get_cache_id($block))) {
+          $cids[$key] = $cid;
+        }
+      }
+    }
+
+    if ($cids) {
+      // We cannot pass $cids in directly because cache_get_multiple() will
+      // modify it, and we need to use it later on in this function.
+      $cid_values = array_values($cids);
+      $cached_blocks = cache_get_multiple($cid_values, 'cache_block');
+    }
+  }
+
+  foreach ($region_blocks as $key => $block) {
+    // Render the block content if it has not been created already.
+    if (!isset($block->content)) {
+      // Erase the block from the static array - we'll put it back if it has
+      // content.
+      unset($region_blocks[$key]);
+
+      $cid = empty($cids[$key]) ? NULL : $cids[$key];
+
+      // Try fetching the block from the previously loaded cache entries.
+      if (isset($cached_blocks[$cid])) {
+        $array = $cached_blocks[$cid]->data;
+      }
+      else {
+        $array = module_invoke($block->module, 'block_view', $block->delta);
+
+        // Valid PHP function names cannot contain hyphens.
+        $delta = str_replace('-', '_', $block->delta);
+        // Allow modules to modify the block before it is viewed, via either
+        // hook_block_view_alter() or hook_block_view_MODULE_DELTA_alter().
+        drupal_alter(array('block_view', "block_view_{$block->module}_{$delta}"), $array, $block);
+
+        if (isset($cid)) {
+          cache_set($cid, $array, 'cache_block', CACHE_TEMPORARY);
+        }
+      }
+
+      if (isset($array) && is_array($array)) {
+        foreach ($array as $k => $v) {
+          $block->$k = $v;
+        }
+      }
+      if (isset($block->content) && $block->content) {
+        // Normalize to the drupal_render() structure.
+        if (is_string($block->content)) {
+          $block->content = array('#markup' => $block->content);
+        }
+        // Override default block title if a custom display title is present.
+        if ($block->title) {
+          // Check plain here to allow module generated titles to keep any
+          // markup.
+          $block->subject = $block->title == '<none>' ? '' : check_plain($block->title);
+        }
+        if (!isset($block->subject)) {
+          $block->subject = '';
+        }
+        $region_blocks["{$block->module}_{$block->delta}"] = $block;
+      }
+    }
+  }
+  return $region_blocks;
+}
+
+/**
+ * Assemble the cache_id to use for a given block.
+ *
+ * The cache_id string reflects the viewing context for the current block
+ * instance, obtained by concatenating the relevant context information
+ * (user, page, ...) according to the block's cache settings (BLOCK_CACHE_*
+ * constants). Two block instances can use the same cached content when
+ * they share the same cache_id.
+ *
+ * Theme and language contexts are automatically differentiated.
+ *
+ * @param $block
+ * @return
+ *   The string used as cache_id for the block.
+ */
+function _block_get_cache_id($block) {
+  global $user;
+
+  // User 1 being out of the regular 'roles define permissions' schema,
+  // it brings too many chances of having unwanted output get in the cache
+  // and later be served to other users. We therefore exclude user 1 from
+  // block caching.
+  if (variable_get('block_cache', FALSE) && !in_array($block->cache, array(DRUPAL_NO_CACHE, DRUPAL_CACHE_CUSTOM)) && $user->uid != 1) {
+    // Start with common sub-patterns: block identification, theme, language.
+    $cid_parts[] = $block->module;
+    $cid_parts[] = $block->delta;
+    $cid_parts = array_merge($cid_parts, drupal_render_cid_parts($block->cache));
+
+    return implode(':', $cid_parts);
+  }
+}
+
+/**
+ * Implements hook_flush_caches().
+ */
+function block_flush_caches() {
+  // Rehash blocks for active themes. We don't use list_themes() here,
+  // because if MAINTENANCE_MODE is defined it skips reading the database,
+  // and we can't tell which themes are active.
+  $themes = db_query("SELECT name FROM {system} WHERE type = 'theme' AND status = 1");
+  foreach ($themes as $theme) {
+    _block_rehash($theme->name);
+  }
+
+  return array('cache_block');
+}
+
+/**
+ * Processes variables for block.tpl.php.
+ *
+ * Prepares the values passed to the theme_block function to be passed
+ * into a pluggable template engine. Uses block properties to generate a
+ * series of template file suggestions. If none are found, the default
+ * block.tpl.php is used.
+ *
+ * Most themes utilize their own copy of block.tpl.php. The default is located
+ * inside "modules/block/block.tpl.php". Look in there for the full list of
+ * variables.
+ *
+ * The $variables array contains the following arguments:
+ * - $block
+ *
+ * @see block.tpl.php
+ */
+function template_preprocess_block(&$variables) {
+  $block_counter = &drupal_static(__FUNCTION__, array());
+  $variables['block'] = $variables['elements']['#block'];
+  // All blocks get an independent counter for each region.
+  if (!isset($block_counter[$variables['block']->region])) {
+    $block_counter[$variables['block']->region] = 1;
+  }
+  // Same with zebra striping.
+  $variables['block_zebra'] = ($block_counter[$variables['block']->region] % 2) ? 'odd' : 'even';
+  $variables['block_id'] = $block_counter[$variables['block']->region]++;
+
+  // Create the $content variable that templates expect.
+  $variables['content'] = $variables['elements']['#children'];
+
+  $variables['classes_array'][] = drupal_html_class('block-' . $variables['block']->module);
+
+  $variables['theme_hook_suggestions'][] = 'block__' . $variables['block']->region;
+  $variables['theme_hook_suggestions'][] = 'block__' . $variables['block']->module;
+  // Hyphens (-) and underscores (_) play a special role in theme suggestions.
+  // Theme suggestions should only contain underscores, because within
+  // drupal_find_theme_templates(), underscores are converted to hyphens to
+  // match template file names, and then converted back to underscores to match
+  // pre-processing and other function names. So if your theme suggestion
+  // contains a hyphen, it will end up as an underscore after this conversion,
+  // and your function names won't be recognized. So, we need to convert
+  // hyphens to underscores in block deltas for the theme suggestions.
+  $variables['theme_hook_suggestions'][] = 'block__' . $variables['block']->module . '__' . strtr($variables['block']->delta, '-', '_');
+
+  // Create a valid HTML ID and make sure it is unique.
+  $variables['block_html_id'] = drupal_html_id('block-' . $variables['block']->module . '-' . $variables['block']->delta);
+}
+
+/**
+ * Implements hook_user_role_delete().
+ *
+ * Removes deleted role from blocks that use it.
+ */
+function block_user_role_delete($role) {
+  db_delete('block_role')
+    ->condition('rid', $role->rid)
+    ->execute();
+}
+
+/**
+ * Implements hook_menu_delete().
+ */
+function block_menu_delete($menu) {
+  db_delete('block')
+    ->condition('module', 'menu')
+    ->condition('delta', $menu['menu_name'])
+    ->execute();
+  db_delete('block_role')
+    ->condition('module', 'menu')
+    ->condition('delta', $menu['menu_name'])
+    ->execute();
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function block_form_system_performance_settings_alter(&$form, &$form_state) {
+  $disabled = count(module_implements('node_grants'));
+  $form['caching']['block_cache'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Cache blocks'),
+    '#default_value' => variable_get('block_cache', FALSE),
+    '#disabled' => $disabled,
+    '#description' => $disabled ? t('Block caching is inactive because you have enabled modules defining content access restrictions.') : NULL,
+    '#weight' => -1,
+  );
+}
+
+/**
+ * Implements hook_admin_paths().
+ */
+function block_admin_paths() {
+  $paths = array(
+    // Exclude the block demonstration page from admin (overlay) treatment.
+    // This allows us to present this page in its true form, full page.
+    'admin/structure/block/demo/*' => FALSE,
+  );
+  return $paths;
+}
+
+/**
+ * Implements hook_modules_uninstalled().
+ *
+ * Cleans up {block} and {block_role} tables from modules' blocks.
+ */
+function block_modules_uninstalled($modules) {
+  db_delete('block')
+    ->condition('module', $modules, 'IN')
+    ->execute();
+  db_delete('block_role')
+    ->condition('module', $modules, 'IN')
+    ->execute();
+}
diff --git a/htmltest/modules/block/block.test b/htmltest/modules/block/block.test
new file mode 100644
index 00000000..99c81dc6
--- /dev/null
+++ b/htmltest/modules/block/block.test
@@ -0,0 +1,979 @@
+<?php
+
+/**
+ * @file
+ * Tests for block.module.
+ */
+
+class BlockTestCase extends DrupalWebTestCase {
+  protected $regions;
+  protected $admin_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Block functionality',
+      'description' => 'Add, edit and delete custom block. Configure and move a module-defined block.',
+      'group' => 'Block',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Create and log in an administrative user having access to the Full HTML
+    // text format.
+    $full_html_format = filter_format_load('full_html');
+    $this->admin_user = $this->drupalCreateUser(array(
+      'administer blocks',
+      filter_permission_name($full_html_format),
+      'access administration pages',
+    ));
+    $this->drupalLogin($this->admin_user);
+
+    // Define the existing regions
+    $this->regions = array();
+    $this->regions[] = 'header';
+    $this->regions[] = 'sidebar_first';
+    $this->regions[] = 'content';
+    $this->regions[] = 'sidebar_second';
+    $this->regions[] = 'footer';
+  }
+
+  /**
+   * Test creating custom block, moving it to a specific region and then deleting it.
+   */
+  function testCustomBlock() {
+    // Confirm that the add block link appears on block overview pages.
+    $this->drupalGet('admin/structure/block');
+    $this->assertRaw(l('Add block', 'admin/structure/block/add'), 'Add block link is present on block overview page for default theme.');
+    $this->drupalGet('admin/structure/block/list/seven');
+    $this->assertRaw(l('Add block', 'admin/structure/block/list/seven/add'), 'Add block link is present on block overview page for non-default theme.');
+
+    // Confirm that hidden regions are not shown as options for block placement
+    // when adding a new block.
+    theme_enable(array('stark'));
+    $themes = list_themes();
+    $this->drupalGet('admin/structure/block/add');
+    foreach ($themes as $key => $theme) {
+      if ($theme->status) {
+        foreach ($theme->info['regions_hidden'] as $hidden_region) {
+          $elements = $this->xpath('//select[@id=:id]//option[@value=:value]', array(':id' => 'edit-regions-' . $key, ':value' => $hidden_region));
+          $this->assertFalse(isset($elements[0]), format_string('The hidden region @region is not available for @theme.', array('@region' => $hidden_region, '@theme' => $key)));
+        }
+      }
+    }
+
+    // Add a new custom block by filling out the input form on the admin/structure/block/add page.
+    $custom_block = array();
+    $custom_block['info'] = $this->randomName(8);
+    $custom_block['title'] = $this->randomName(8);
+    $custom_block['body[value]'] = $this->randomName(32);
+    $this->drupalPost('admin/structure/block/add', $custom_block, t('Save block'));
+
+    // Confirm that the custom block has been created, and then query the created bid.
+    $this->assertText(t('The block has been created.'), 'Custom block successfully created.');
+    $bid = db_query("SELECT bid FROM {block_custom} WHERE info = :info", array(':info' => $custom_block['info']))->fetchField();
+
+    // Check to see if the custom block was created by checking that it's in the database.
+    $this->assertNotNull($bid, 'Custom block found in database');
+
+    // Check that block_block_view() returns the correct title and content.
+    $data = block_block_view($bid);
+    $format = db_query("SELECT format FROM {block_custom} WHERE bid = :bid", array(':bid' => $bid))->fetchField();
+    $this->assertTrue(array_key_exists('subject', $data) && empty($data['subject']), 'block_block_view() provides an empty block subject, since custom blocks do not have default titles.');
+    $this->assertEqual(check_markup($custom_block['body[value]'], $format), $data['content'], 'block_block_view() provides correct block content.');
+
+    // Check whether the block can be moved to all available regions.
+    $custom_block['module'] = 'block';
+    $custom_block['delta'] = $bid;
+    foreach ($this->regions as $region) {
+      $this->moveBlockToRegion($custom_block, $region);
+    }
+
+    // Verify presence of configure and delete links for custom block.
+    $this->drupalGet('admin/structure/block');
+    $this->assertLinkByHref('admin/structure/block/manage/block/' . $bid . '/configure', 0, 'Custom block configure link found.');
+    $this->assertLinkByHref('admin/structure/block/manage/block/' . $bid . '/delete', 0, 'Custom block delete link found.');
+
+    // Set visibility only for authenticated users, to verify delete functionality.
+    $edit = array();
+    $edit['roles[' . DRUPAL_AUTHENTICATED_RID . ']'] = TRUE;
+    $this->drupalPost('admin/structure/block/manage/block/' . $bid . '/configure', $edit, t('Save block'));
+
+    // Delete the created custom block & verify that it's been deleted and no longer appearing on the page.
+    $this->clickLink(t('delete'));
+    $this->drupalPost('admin/structure/block/manage/block/' . $bid . '/delete', array(), t('Delete'));
+    $this->assertRaw(t('The block %title has been removed.', array('%title' => $custom_block['info'])), 'Custom block successfully deleted.');
+    $this->assertNoText(t($custom_block['title']), 'Custom block no longer appears on page.');
+    $count = db_query("SELECT 1 FROM {block_role} WHERE module = :module AND delta = :delta", array(':module' => $custom_block['module'], ':delta' => $custom_block['delta']))->fetchField();
+    $this->assertFalse($count, 'Table block_role being cleaned.');
+  }
+
+  /**
+   * Test creating custom block using Full HTML.
+   */
+  function testCustomBlockFormat() {
+    // Add a new custom block by filling out the input form on the admin/structure/block/add page.
+    $custom_block = array();
+    $custom_block['info'] = $this->randomName(8);
+    $custom_block['title'] = $this->randomName(8);
+    $custom_block['body[value]'] = '<h1>Full HTML</h1>';
+    $full_html_format = filter_format_load('full_html');
+    $custom_block['body[format]'] = $full_html_format->format;
+    $this->drupalPost('admin/structure/block/add', $custom_block, t('Save block'));
+
+    // Set the created custom block to a specific region.
+    $bid = db_query("SELECT bid FROM {block_custom} WHERE info = :info", array(':info' => $custom_block['info']))->fetchField();
+    $edit = array();
+    $edit['blocks[block_' . $bid . '][region]'] = $this->regions[1];
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+
+    // Confirm that the custom block is being displayed using configured text format.
+    $this->drupalGet('node');
+    $this->assertRaw('<h1>Full HTML</h1>', 'Custom block successfully being displayed using Full HTML.');
+
+    // Confirm that a user without access to Full HTML can not see the body field,
+    // but can still submit the form without errors.
+    $block_admin = $this->drupalCreateUser(array('administer blocks'));
+    $this->drupalLogin($block_admin);
+    $this->drupalGet('admin/structure/block/manage/block/' . $bid . '/configure');
+    $this->assertFieldByXPath("//textarea[@name='body[value]' and @disabled='disabled']", t('This field has been disabled because you do not have sufficient permissions to edit it.'), 'Body field contains denied message');
+    $this->drupalPost('admin/structure/block/manage/block/' . $bid . '/configure', array(), t('Save block'));
+    $this->assertNoText(t('Ensure that each block description is unique.'));
+
+    // Confirm that the custom block is still being displayed using configured text format.
+    $this->drupalGet('node');
+    $this->assertRaw('<h1>Full HTML</h1>', 'Custom block successfully being displayed using Full HTML.');
+  }
+
+  /**
+   * Test block visibility.
+   */
+  function testBlockVisibility() {
+    $block = array();
+
+    // Create a random title for the block
+    $title = $this->randomName(8);
+
+    // Create the custom block
+    $custom_block = array();
+    $custom_block['info'] = $this->randomName(8);
+    $custom_block['title'] = $title;
+    $custom_block['body[value]'] = $this->randomName(32);
+    $this->drupalPost('admin/structure/block/add', $custom_block, t('Save block'));
+
+    $bid = db_query("SELECT bid FROM {block_custom} WHERE info = :info", array(':info' => $custom_block['info']))->fetchField();
+    $block['module'] = 'block';
+    $block['delta'] = $bid;
+    $block['title'] = $title;
+
+    // Set the block to be hidden on any user path, and to be shown only to
+    // authenticated users.
+    $edit = array();
+    $edit['pages'] = 'user*';
+    $edit['roles[' . DRUPAL_AUTHENTICATED_RID . ']'] = TRUE;
+    $this->drupalPost('admin/structure/block/manage/' . $block['module'] . '/' . $block['delta'] . '/configure', $edit, t('Save block'));
+
+    // Move block to the first sidebar.
+    $this->moveBlockToRegion($block, $this->regions[1]);
+
+    $this->drupalGet('');
+    $this->assertText($title, 'Block was displayed on the front page.');
+
+    $this->drupalGet('user');
+    $this->assertNoText($title, 'Block was not displayed according to block visibility rules.');
+
+    $this->drupalGet('USER/' . $this->admin_user->uid);
+    $this->assertNoText($title, 'Block was not displayed according to block visibility rules regardless of path case.');
+
+    // Confirm that the block is not displayed to anonymous users.
+    $this->drupalLogout();
+    $this->drupalGet('');
+    $this->assertNoText($title, 'Block was not displayed to anonymous users.');
+  }
+
+  /**
+   * Test block visibility when using "pages" restriction but leaving
+   * "pages" textarea empty
+   */
+  function testBlockVisibilityListedEmpty() {
+    $block = array();
+
+    // Create a random title for the block
+    $title = $this->randomName(8);
+
+    // Create the custom block
+    $custom_block = array();
+    $custom_block['info'] = $this->randomName(8);
+    $custom_block['title'] = $title;
+    $custom_block['body[value]'] = $this->randomName(32);
+    $this->drupalPost('admin/structure/block/add', $custom_block, t('Save block'));
+
+    $bid = db_query("SELECT bid FROM {block_custom} WHERE info = :info", array(':info' => $custom_block['info']))->fetchField();
+    $block['module'] = 'block';
+    $block['delta'] = $bid;
+    $block['title'] = $title;
+
+    // Move block to the first sidebar.
+    $this->moveBlockToRegion($block, $this->regions[1]);
+
+    // Set the block to be hidden on any user path, and to be shown only to
+    // authenticated users.
+    $edit = array();
+    $edit['visibility'] = BLOCK_VISIBILITY_LISTED;
+    $this->drupalPost('admin/structure/block/manage/' . $block['module'] . '/' . $block['delta'] . '/configure', $edit, t('Save block'));
+
+    $this->drupalGet('');
+    $this->assertNoText($title, 'Block was not displayed according to block visibility rules.');
+
+    $this->drupalGet('user');
+    $this->assertNoText($title, 'Block was not displayed according to block visibility rules regardless of path case.');
+
+    // Confirm that the block is not displayed to anonymous users.
+    $this->drupalLogout();
+    $this->drupalGet('');
+    $this->assertNoText($title, 'Block was not displayed to anonymous users.');
+  }
+
+  /**
+   * Test user customization of block visibility.
+   */
+  function testBlockVisibilityPerUser() {
+    $block = array();
+
+    // Create a random title for the block.
+    $title = $this->randomName(8);
+
+    // Create our custom test block.
+    $custom_block = array();
+    $custom_block['info'] = $this->randomName(8);
+    $custom_block['title'] = $title;
+    $custom_block['body[value]'] = $this->randomName(32);
+    $this->drupalPost('admin/structure/block/add', $custom_block, t('Save block'));
+
+    $bid = db_query("SELECT bid FROM {block_custom} WHERE info = :info", array(':info' => $custom_block['info']))->fetchField();
+    $block['module'] = 'block';
+    $block['delta'] = $bid;
+    $block['title'] = $title;
+
+    // Move block to the first sidebar.
+    $this->moveBlockToRegion($block, $this->regions[1]);
+
+    // Set the block to be customizable per user, visible by default.
+    $edit = array();
+    $edit['custom'] = BLOCK_CUSTOM_ENABLED;
+    $this->drupalPost('admin/structure/block/manage/' . $block['module'] . '/' . $block['delta'] . '/configure', $edit, t('Save block'));
+
+    // Disable block visibility for the admin user.
+    $edit = array();
+    $edit['block[' . $block['module'] . '][' . $block['delta'] . ']'] = FALSE;
+    $this->drupalPost('user/' . $this->admin_user->uid . '/edit', $edit, t('Save'));
+
+    $this->drupalGet('');
+    $this->assertNoText($block['title'], 'Block was not displayed according to per user block visibility setting.');
+
+    // Set the block to be customizable per user, hidden by default.
+    $edit = array();
+    $edit['custom'] = BLOCK_CUSTOM_DISABLED;
+    $this->drupalPost('admin/structure/block/manage/' . $block['module'] . '/' . $block['delta'] . '/configure', $edit, t('Save block'));
+
+    // Enable block visibility for the admin user.
+    $edit = array();
+    $edit['block[' . $block['module'] . '][' . $block['delta'] . ']'] = TRUE;
+    $this->drupalPost('user/' . $this->admin_user->uid . '/edit', $edit, t('Save'));
+
+    $this->drupalGet('');
+    $this->assertText($block['title'], 'Block was displayed according to per user block visibility setting.');
+  }
+
+  /**
+   * Test configuring and moving a module-define block to specific regions.
+   */
+  function testBlock() {
+    // Select the Navigation block to be configured and moved.
+    $block = array();
+    $block['module'] = 'system';
+    $block['delta'] = 'management';
+    $block['title'] = $this->randomName(8);
+
+    // Set block title to confirm that interface works and override any custom titles.
+    $this->drupalPost('admin/structure/block/manage/' . $block['module'] . '/' . $block['delta'] . '/configure', array('title' => $block['title']), t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), 'Block title set.');
+    $bid = db_query("SELECT bid FROM {block} WHERE module = :module AND delta = :delta", array(
+      ':module' => $block['module'],
+      ':delta' => $block['delta'],
+    ))->fetchField();
+
+    // Check to see if the block was created by checking that it's in the database.
+    $this->assertNotNull($bid, 'Block found in database');
+
+    // Check whether the block can be moved to all available regions.
+    foreach ($this->regions as $region) {
+      $this->moveBlockToRegion($block, $region);
+    }
+
+    // Set the block to the disabled region.
+    $edit = array();
+    $edit['blocks[' . $block['module'] . '_' . $block['delta'] . '][region]'] = '-1';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+
+    // Confirm that the block was moved to the proper region.
+    $this->assertText(t('The block settings have been updated.'), 'Block successfully move to disabled region.');
+    $this->assertNoText(t($block['title']), 'Block no longer appears on page.');
+
+    // Confirm that the region's xpath is not available.
+    $xpath = $this->buildXPathQuery('//div[@id=:id]/*', array(':id' => 'block-block-' . $bid));
+    $this->assertNoFieldByXPath($xpath, FALSE, 'Custom block found in no regions.');
+
+    // For convenience of developers, put the navigation block back.
+    $edit = array();
+    $edit['blocks[' . $block['module'] . '_' . $block['delta'] . '][region]'] = $this->regions[1];
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->assertText(t('The block settings have been updated.'), 'Block successfully move to first sidebar region.');
+
+    $this->drupalPost('admin/structure/block/manage/' . $block['module'] . '/' . $block['delta'] . '/configure', array('title' => 'Navigation'), t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), 'Block title set.');
+  }
+
+  function moveBlockToRegion($block, $region) {
+    // Set the created block to a specific region.
+    $edit = array();
+    $edit['blocks[' . $block['module'] . '_' . $block['delta'] . '][region]'] = $region;
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+
+    // Confirm that the block was moved to the proper region.
+    $this->assertText(t('The block settings have been updated.'), format_string('Block successfully moved to %region_name region.', array( '%region_name' => $region)));
+
+    // Confirm that the block is being displayed.
+    $this->drupalGet('node');
+    $this->assertText(t($block['title']), 'Block successfully being displayed on the page.');
+
+    // Confirm that the custom block was found at the proper region.
+    $xpath = $this->buildXPathQuery('//div[@class=:region-class]//div[@id=:block-id]/*', array(
+      ':region-class' => 'region region-' . str_replace('_', '-', $region),
+      ':block-id' => 'block-' . $block['module'] . '-' . $block['delta'],
+    ));
+    $this->assertFieldByXPath($xpath, NULL, format_string('Custom block found in %region_name region.', array('%region_name' => $region)));
+  }
+
+  /**
+   * Test _block_rehash().
+   */
+  function testBlockRehash() {
+    module_enable(array('block_test'));
+    $this->assertTrue(module_exists('block_test'), 'Test block module enabled.');
+
+    // Our new block should be inserted in the database when we visit the
+    // block management page.
+    $this->drupalGet('admin/structure/block');
+    // Our test block's caching should default to DRUPAL_CACHE_PER_ROLE.
+    $current_caching = db_query("SELECT cache FROM {block} WHERE module = 'block_test' AND delta = 'test_cache'")->fetchField();
+    $this->assertEqual($current_caching, DRUPAL_CACHE_PER_ROLE, 'Test block cache mode defaults to DRUPAL_CACHE_PER_ROLE.');
+
+    // Disable caching for this block.
+    variable_set('block_test_caching', DRUPAL_NO_CACHE);
+    // Flushing all caches should call _block_rehash().
+    drupal_flush_all_caches();
+    // Verify that the database is updated with the new caching mode.
+    $current_caching = db_query("SELECT cache FROM {block} WHERE module = 'block_test' AND delta = 'test_cache'")->fetchField();
+    $this->assertEqual($current_caching, DRUPAL_NO_CACHE, "Test block's database entry updated to DRUPAL_NO_CACHE.");
+  }
+}
+
+class NonDefaultBlockAdmin extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Non default theme admin',
+      'description' => 'Check the administer page for non default theme.',
+      'group' => 'Block',
+    );
+  }
+
+  /**
+   * Test non-default theme admin.
+   */
+  function testNonDefaultBlockAdmin() {
+    $admin_user = $this->drupalCreateUser(array('administer blocks', 'administer themes'));
+    $this->drupalLogin($admin_user);
+    theme_enable(array('stark'));
+    $this->drupalGet('admin/structure/block/list/stark');
+  }
+}
+
+/**
+ * Test blocks correctly initialized when picking a new default theme.
+ */
+class NewDefaultThemeBlocks extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'New default theme blocks',
+      'description' => 'Checks that the new default theme gets blocks.',
+      'group' => 'Block',
+    );
+  }
+
+  /**
+   * Check the enabled Bartik blocks are correctly copied over.
+   */
+  function testNewDefaultThemeBlocks() {
+    // Create administrative user.
+    $admin_user = $this->drupalCreateUser(array('administer themes'));
+    $this->drupalLogin($admin_user);
+
+    // Ensure no other theme's blocks are in the block table yet.
+    $themes = array();
+    $themes['default'] = variable_get('theme_default', 'bartik');
+    if ($admin_theme = variable_get('admin_theme')) {
+      $themes['admin'] = $admin_theme;
+    }
+    $count = db_query_range('SELECT 1 FROM {block} WHERE theme NOT IN (:themes)', 0, 1, array(':themes' => $themes))->fetchField();
+    $this->assertFalse($count, 'Only the default theme and the admin theme have blocks.');
+
+    // Populate list of all blocks for matching against new theme.
+    $blocks = array();
+    $result = db_query('SELECT * FROM {block} WHERE theme = :theme', array(':theme' => $themes['default']));
+    foreach ($result as $block) {
+      // $block->theme and $block->bid will not match, so remove them.
+      unset($block->theme, $block->bid);
+      $blocks[$block->module][$block->delta] = $block;
+    }
+
+    // Turn on the Stark theme and ensure that it contains all of the blocks
+    // the default theme had.
+    theme_enable(array('stark'));
+    variable_set('theme_default', 'stark');
+    $result = db_query('SELECT * FROM {block} WHERE theme = :theme', array(':theme' => 'stark'));
+    foreach ($result as $block) {
+      unset($block->theme, $block->bid);
+      $this->assertEqual($blocks[$block->module][$block->delta], $block, format_string('Block %name matched', array('%name' => $block->module . '-' . $block->delta)));
+    }
+  }
+}
+
+/**
+ * Test the block system with admin themes.
+ */
+class BlockAdminThemeTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Admin theme block admin accessibility',
+      'description' => "Check whether the block administer page for a disabled theme accessible if and only if it's the admin theme.",
+      'group' => 'Block',
+    );
+  }
+
+  /**
+   * Check for the accessibility of the admin theme on the  block admin page.
+   */
+  function testAdminTheme() {
+    // Create administrative user.
+    $admin_user = $this->drupalCreateUser(array('administer blocks', 'administer themes'));
+    $this->drupalLogin($admin_user);
+
+    // Ensure that access to block admin page is denied when theme is disabled.
+    $this->drupalGet('admin/structure/block/list/stark');
+    $this->assertResponse(403, 'The block admin page for a disabled theme can not be accessed');
+
+    // Enable admin theme and confirm that tab is accessible.
+    $edit['admin_theme'] = 'stark';
+    $this->drupalPost('admin/appearance', $edit, t('Save configuration'));
+    $this->drupalGet('admin/structure/block/list/stark');
+    $this->assertResponse(200, 'The block admin page for the admin theme can be accessed');
+  }
+}
+
+/**
+ * Test block caching.
+ */
+class BlockCacheTestCase extends DrupalWebTestCase {
+  protected $admin_user;
+  protected $normal_user;
+  protected $normal_user_alt;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Block caching',
+      'description' => 'Test block caching.',
+      'group' => 'Block',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('block_test');
+
+    // Create an admin user, log in and enable test blocks.
+    $this->admin_user = $this->drupalCreateUser(array('administer blocks', 'access administration pages'));
+    $this->drupalLogin($this->admin_user);
+
+    // Create additional users to test caching modes.
+    $this->normal_user = $this->drupalCreateUser();
+    $this->normal_user_alt = $this->drupalCreateUser();
+    // Sync the roles, since drupalCreateUser() creates separate roles for
+    // the same permission sets.
+    user_save($this->normal_user_alt, array('roles' => $this->normal_user->roles));
+    $this->normal_user_alt->roles = $this->normal_user->roles;
+
+    // Enable block caching.
+    variable_set('block_cache', TRUE);
+
+    // Enable our test block.
+    $edit['blocks[block_test_test_cache][region]'] = 'sidebar_first';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+  }
+
+  /**
+   * Test DRUPAL_CACHE_PER_ROLE.
+   */
+  function testCachePerRole() {
+    $this->setCacheMode(DRUPAL_CACHE_PER_ROLE);
+
+    // Enable our test block. Set some content for it to display.
+    $current_content = $this->randomName();
+    variable_set('block_test_content', $current_content);
+    $this->drupalLogin($this->normal_user);
+    $this->drupalGet('');
+    $this->assertText($current_content, 'Block content displays.');
+
+    // Change the content, but the cached copy should still be served.
+    $old_content = $current_content;
+    $current_content = $this->randomName();
+    variable_set('block_test_content', $current_content);
+    $this->drupalGet('');
+    $this->assertText($old_content, 'Block is served from the cache.');
+
+    // Clear the cache and verify that the stale data is no longer there.
+    cache_clear_all();
+    $this->drupalGet('');
+    $this->assertNoText($old_content, 'Block cache clear removes stale cache data.');
+    $this->assertText($current_content, 'Fresh block content is displayed after clearing the cache.');
+
+    // Test whether the cached data is served for the correct users.
+    $old_content = $current_content;
+    $current_content = $this->randomName();
+    variable_set('block_test_content', $current_content);
+    $this->drupalLogout();
+    $this->drupalGet('');
+    $this->assertNoText($old_content, 'Anonymous user does not see content cached per-role for normal user.');
+
+    $this->drupalLogin($this->normal_user_alt);
+    $this->drupalGet('');
+    $this->assertText($old_content, 'User with the same roles sees per-role cached content.');
+
+    $this->drupalLogin($this->admin_user);
+    $this->drupalGet('');
+    $this->assertNoText($old_content, 'Admin user does not see content cached per-role for normal user.');
+
+    $this->drupalLogin($this->normal_user);
+    $this->drupalGet('');
+    $this->assertText($old_content, 'Block is served from the per-role cache.');
+  }
+
+  /**
+   * Test DRUPAL_CACHE_GLOBAL.
+   */
+  function testCacheGlobal() {
+    $this->setCacheMode(DRUPAL_CACHE_GLOBAL);
+    $current_content = $this->randomName();
+    variable_set('block_test_content', $current_content);
+
+    $this->drupalGet('');
+    $this->assertText($current_content, 'Block content displays.');
+
+    $old_content = $current_content;
+    $current_content = $this->randomName();
+    variable_set('block_test_content', $current_content);
+
+    $this->drupalLogout();
+    $this->drupalGet('user');
+    $this->assertText($old_content, 'Block content served from global cache.');
+  }
+
+  /**
+   * Test DRUPAL_NO_CACHE.
+   */
+  function testNoCache() {
+    $this->setCacheMode(DRUPAL_NO_CACHE);
+    $current_content = $this->randomName();
+    variable_set('block_test_content', $current_content);
+
+    // If DRUPAL_NO_CACHE has no effect, the next request would be cached.
+    $this->drupalGet('');
+    $this->assertText($current_content, 'Block content displays.');
+
+    // A cached copy should not be served.
+    $current_content = $this->randomName();
+    variable_set('block_test_content', $current_content);
+    $this->drupalGet('');
+    $this->assertText($current_content, 'DRUPAL_NO_CACHE prevents blocks from being cached.');
+  }
+
+  /**
+   * Test DRUPAL_CACHE_PER_USER.
+   */
+  function testCachePerUser() {
+    $this->setCacheMode(DRUPAL_CACHE_PER_USER);
+    $current_content = $this->randomName();
+    variable_set('block_test_content', $current_content);
+    $this->drupalLogin($this->normal_user);
+
+    $this->drupalGet('');
+    $this->assertText($current_content, 'Block content displays.');
+
+    $old_content = $current_content;
+    $current_content = $this->randomName();
+    variable_set('block_test_content', $current_content);
+
+    $this->drupalGet('');
+    $this->assertText($old_content, 'Block is served from per-user cache.');
+
+    $this->drupalLogin($this->normal_user_alt);
+    $this->drupalGet('');
+    $this->assertText($current_content, 'Per-user block cache is not served for other users.');
+
+    $this->drupalLogin($this->normal_user);
+    $this->drupalGet('');
+    $this->assertText($old_content, 'Per-user block cache is persistent.');
+  }
+
+  /**
+   * Test DRUPAL_CACHE_PER_PAGE.
+   */
+  function testCachePerPage() {
+    $this->setCacheMode(DRUPAL_CACHE_PER_PAGE);
+    $current_content = $this->randomName();
+    variable_set('block_test_content', $current_content);
+
+    $this->drupalGet('node');
+    $this->assertText($current_content, 'Block content displays on the node page.');
+
+    $old_content = $current_content;
+    $current_content = $this->randomName();
+    variable_set('block_test_content', $current_content);
+
+    $this->drupalGet('user');
+    $this->assertNoText($old_content, 'Block content cached for the node page does not show up for the user page.');
+    $this->drupalGet('node');
+    $this->assertText($old_content, 'Block content cached for the node page.');
+  }
+
+  /**
+   * Private helper method to set the test block's cache mode.
+   */
+  private function setCacheMode($cache_mode) {
+    db_update('block')
+      ->fields(array('cache' => $cache_mode))
+      ->condition('module', 'block_test')
+      ->execute();
+
+    $current_mode = db_query("SELECT cache FROM {block} WHERE module = 'block_test'")->fetchField();
+    if ($current_mode != $cache_mode) {
+      $this->fail(t('Unable to set cache mode to %mode. Current mode: %current_mode', array('%mode' => $cache_mode, '%current_mode' => $current_mode)));
+    }
+  }
+}
+
+/**
+ * Test block HTML id validity.
+ */
+class BlockHTMLIdTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Block HTML id',
+      'description' => 'Test block HTML id validity.',
+      'group' => 'Block',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('block_test');
+
+    // Create an admin user, log in and enable test blocks.
+    $this->admin_user = $this->drupalCreateUser(array('administer blocks', 'access administration pages'));
+    $this->drupalLogin($this->admin_user);
+
+    // Enable our test block.
+    $edit['blocks[block_test_test_html_id][region]'] = 'sidebar_first';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+
+    // Make sure the block has some content so it will appear
+    $current_content = $this->randomName();
+    variable_set('block_test_content', $current_content);
+  }
+
+  /**
+   * Test valid HTML id.
+   */
+  function testHTMLId() {
+    $this->drupalGet('');
+    $this->assertRaw('block-block-test-test-html-id', 'HTML id for test block is valid.');
+  }
+}
+
+
+/**
+ * Unit tests for template_preprocess_block().
+ */
+class BlockTemplateSuggestionsUnitTest extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Block template suggestions',
+      'description' => 'Test the template_preprocess_block() function.',
+      'group' => 'Block',
+    );
+  }
+
+  /**
+   * Test if template_preprocess_block() handles the suggestions right.
+   */
+  function testBlockThemeHookSuggestions() {
+    // Define block delta with underscore to be preprocessed
+    $block1 = new stdClass();
+    $block1->module = 'block';
+    $block1->delta = 'underscore_test';
+    $block1->region = 'footer';
+    $variables1 = array();
+    $variables1['elements']['#block'] = $block1;
+    $variables1['elements']['#children'] = '';
+    template_preprocess_block($variables1);
+    $this->assertEqual($variables1['theme_hook_suggestions'], array('block__footer', 'block__block', 'block__block__underscore_test'), 'Found expected block suggestions for delta with underscore');
+
+    // Define block delta with hyphens to be preprocessed. Hyphens should be
+    // replaced with underscores.
+    $block2 = new stdClass();
+    $block2->module = 'block';
+    $block2->delta = 'hyphen-test';
+    $block2->region = 'footer';
+    $variables2 = array();
+    $variables2['elements']['#block'] = $block2;
+    $variables2['elements']['#children'] = '';
+    template_preprocess_block($variables2);
+    $this->assertEqual($variables2['theme_hook_suggestions'], array('block__footer', 'block__block', 'block__block__hyphen_test'), 'Hyphens (-) in block delta were replaced by underscore (_)');
+  }
+}
+
+/**
+ * Tests for hook_block_view_MODULE_DELTA_alter().
+ */
+class BlockViewModuleDeltaAlterWebTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Block view module delta alter',
+      'description' => 'Test the hook_block_view_MODULE_DELTA_alter() hook.',
+      'group' => 'Block',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp(array('block_test'));
+  }
+
+  /**
+   * Tests that the alter hook is called, even if the delta contains a hyphen.
+   */
+  public function testBlockViewModuleDeltaAlter() {
+    $block = new stdClass;
+    $block->module = 'block_test';
+    $block->delta = 'test_underscore';
+    $block->title = '';
+    $render_array = _block_render_blocks(array('region' => $block));
+    $render = array_pop($render_array);
+    $test_underscore = $render->content['#markup'];
+    $this->assertEqual($test_underscore, 'hook_block_view_MODULE_DELTA_alter', 'Found expected altered block content for delta with underscore');
+
+    $block = new stdClass;
+    $block->module = 'block_test';
+    $block->delta = 'test-hyphen';
+    $block->title = '';
+    $render_array = _block_render_blocks(array('region' => $block));
+    $render = array_pop($render_array);
+    $test_hyphen = $render->content['#markup'];
+    $this->assertEqual($test_hyphen, 'hook_block_view_MODULE_DELTA_alter', 'Hyphens (-) in block delta were replaced by underscore (_)');
+  }
+
+}
+
+/**
+ * Tests that hidden regions do not inherit blocks when a theme is enabled.
+ */
+class BlockHiddenRegionTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Blocks not in hidden region',
+      'description' => 'Checks that a newly enabled theme does not inherit blocks to its hidden regions.',
+      'group' => 'Block',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('block_test'));
+  }
+
+  /**
+   * Tests that hidden regions do not inherit blocks when a theme is enabled.
+   */
+  function testBlockNotInHiddenRegion() {
+    // Create administrative user.
+    $admin_user = $this->drupalCreateUser(array('administer blocks', 'administer themes', 'search content'));
+    $this->drupalLogin($admin_user);
+
+    // Enable "block_test_theme" and set it as the default theme.
+    $theme = 'block_test_theme';
+    theme_enable(array($theme));
+    variable_set('theme_default', $theme);
+    menu_rebuild();
+
+    // Ensure that "block_test_theme" is set as the default theme.
+    $this->drupalGet('admin/structure/block');
+    $this->assertText('Block test theme(' . t('active tab') . ')', 'Default local task on blocks admin page is the block test theme.');
+
+    // Ensure that the search form block is displayed.
+    $this->drupalGet('');
+    $this->assertText('Search form', 'Block was displayed on the front page.');
+  }
+}
+
+/**
+ * Tests that a block assigned to an invalid region triggers the warning.
+ */
+class BlockInvalidRegionTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Blocks in invalid regions',
+      'description' => 'Checks that an active block assigned to a non-existing region triggers the warning message and is disabled.',
+      'group' => 'Block',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('block', 'block_test'));
+    // Create an admin user.
+    $admin_user = $this->drupalCreateUser(array('administer site configuration', 'access administration pages'));
+    $this->drupalLogin($admin_user);
+  }
+
+  /**
+   * Tests that blocks assigned to invalid regions work correctly.
+   */
+  function testBlockInInvalidRegion() {
+    // Enable a test block in the default theme and place it in an invalid region.
+    db_merge('block')
+      ->key(array(
+        'module' => 'block_test',
+        'delta' => 'test_html_id',
+        'theme' => variable_get('theme_default', 'stark'),
+      ))
+      ->fields(array(
+        'status' => 1,
+        'region' => 'invalid_region',
+        'cache' => DRUPAL_NO_CACHE,
+      ))
+      ->execute();
+
+    $warning_message = t('The block %info was assigned to the invalid region %region and has been disabled.', array('%info' => t('Test block html id'), '%region' => 'invalid_region'));
+
+    // Clearing the cache should disable the test block placed in the invalid region.
+    $this->drupalPost('admin/config/development/performance', array(), 'Clear all caches');
+    $this->assertRaw($warning_message, 'Enabled block was in the invalid region and has been disabled.');
+
+    // Clear the cache to check if the warning message is not triggered.
+    $this->drupalPost('admin/config/development/performance', array(), 'Clear all caches');
+    $this->assertNoRaw($warning_message, 'Disabled block in the invalid region will not trigger the warning.');
+
+    // Place disabled test block in the invalid region of the default theme.
+    db_merge('block')
+      ->key(array(
+        'module' => 'block_test',
+        'delta' => 'test_html_id',
+        'theme' => variable_get('theme_default', 'stark'),
+      ))
+      ->fields(array(
+        'region' => 'invalid_region',
+        'cache' => DRUPAL_NO_CACHE,
+      ))
+      ->execute();
+
+    // Clear the cache to check if the warning message is not triggered.
+    $this->drupalPost('admin/config/development/performance', array(), 'Clear all caches');
+    $this->assertNoRaw($warning_message, 'Disabled block in the invalid region will not trigger the warning.');
+  }
+}
+
+/**
+ * Tests that block rehashing works correctly.
+ */
+class BlockHashTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Block rehash',
+      'description' => 'Checks _block_rehash() functionality.',
+      'group' => 'Block',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('block'));
+  }
+
+  /**
+   * Tests that block rehashing does not write to the database too often.
+   */
+  function testBlockRehash() {
+    // No hook_block_info_alter(), no save.
+    $this->doRehash();
+    module_enable(array('block_test'), FALSE);
+    // Save the new blocks, check that the new blocks exist by checking weight.
+    _block_rehash();
+    $this->assertWeight(0);
+    // Now hook_block_info_alter() exists but no blocks are saved on a second
+    // rehash.
+    $this->doRehash();
+    $this->assertWeight(0);
+    // Now hook_block_info_alter() exists and is changing one block which
+    // should be saved.
+    $GLOBALS['conf']['block_test_info_alter'] = 1;
+    $this->doRehash(TRUE);
+    $this->assertWeight(10000);
+    // Now hook_block_info_alter() exists but already changed the block's
+    // weight before, so it should not be saved again.
+    $this->doRehash();
+    $this->assertWeight(10000);
+  }
+
+  /**
+   * Performs a block rehash and checks several related assertions.
+   *
+   * @param $alter_active
+   *   Set to TRUE if the block_test module's hook_block_info_alter()
+   *   implementation is expected to make a change that results in an existing
+   *   block needing to be resaved to the database. Defaults to FALSE.
+   */
+  function doRehash($alter_active = FALSE) {
+    $saves = 0;
+    foreach (_block_rehash() as $block) {
+      $module = $block['module'];
+      $delta = $block['delta'];
+      if ($alter_active && $module == 'block_test' && $delta == 'test_html_id') {
+        $this->assertFalse(empty($block['saved']), "$module $delta saved");
+        $saves++;
+      }
+      else {
+        $this->assertTrue(empty($block['saved']), "$module $delta not saved");
+      }
+    }
+    $this->assertEqual($alter_active, $saves);
+  }
+
+  /**
+   * Asserts that the block_test module's block has a given weight.
+   *
+   * @param $weight
+   *   The expected weight.
+   */
+  function assertWeight($weight) {
+    $db_weight = db_query('SELECT weight FROM {block} WHERE module = :module AND delta = :delta', array(':module' => 'block_test', ':delta' => 'test_html_id'))->fetchField();
+    // By casting to string the assert fails on FALSE.
+    $this->assertIdentical((string) $db_weight, (string) $weight);
+  }
+}
diff --git a/htmltest/modules/block/block.tpl.php b/htmltest/modules/block/block.tpl.php
new file mode 100644
index 00000000..f0bfa5ca
--- /dev/null
+++ b/htmltest/modules/block/block.tpl.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to display a block.
+ *
+ * Available variables:
+ * - $block->subject: Block title.
+ * - $content: Block content.
+ * - $block->module: Module that generated the block.
+ * - $block->delta: An ID for the block, unique within each module.
+ * - $block->region: The block region embedding the current block.
+ * - $classes: String of classes that can be used to style contextually through
+ *   CSS. It can be manipulated through the variable $classes_array from
+ *   preprocess functions. The default values can be one or more of the
+ *   following:
+ *   - block: The current template type, i.e., "theming hook".
+ *   - block-[module]: The module generating the block. For example, the user
+ *     module is responsible for handling the default user navigation block. In
+ *     that case the class would be 'block-user'.
+ * - $title_prefix (array): An array containing additional output populated by
+ *   modules, intended to be displayed in front of the main title tag that
+ *   appears in the template.
+ * - $title_suffix (array): An array containing additional output populated by
+ *   modules, intended to be displayed after the main title tag that appears in
+ *   the template.
+ *
+ * Helper variables:
+ * - $classes_array: Array of html class attribute values. It is flattened
+ *   into a string within the variable $classes.
+ * - $block_zebra: Outputs 'odd' and 'even' dependent on each block region.
+ * - $zebra: Same output as $block_zebra but independent of any block region.
+ * - $block_id: Counter dependent on each block region.
+ * - $id: Same output as $block_id but independent of any block region.
+ * - $is_front: Flags true when presented in the front page.
+ * - $logged_in: Flags true when the current user is a logged-in member.
+ * - $is_admin: Flags true when the current user is an administrator.
+ * - $block_html_id: A valid HTML ID and guaranteed unique.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_block()
+ * @see template_process()
+ *
+ * @ingroup themeable
+ */
+?>
+<div id="<?php print $block_html_id; ?>" class="<?php print $classes; ?>"<?php print $attributes; ?>>
+
+  <?php print render($title_prefix); ?>
+<?php if ($block->subject): ?>
+  <h2<?php print $title_attributes; ?>><?php print $block->subject ?></h2>
+<?php endif;?>
+  <?php print render($title_suffix); ?>
+
+  <div class="content"<?php print $content_attributes; ?>>
+    <?php print $content ?>
+  </div>
+</div>
diff --git a/htmltest/modules/block/tests/block_test.info b/htmltest/modules/block/tests/block_test.info
new file mode 100644
index 00000000..db474373
--- /dev/null
+++ b/htmltest/modules/block/tests/block_test.info
@@ -0,0 +1,12 @@
+name = Block test
+description = Provides test blocks.
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/block/tests/block_test.module b/htmltest/modules/block/tests/block_test.module
new file mode 100644
index 00000000..e7ed09b2
--- /dev/null
+++ b/htmltest/modules/block/tests/block_test.module
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @file
+ *   Provide test blocks.
+ */
+
+/**
+ * Implements hook_system_theme_info().
+ */
+function block_test_system_theme_info() {
+  $themes['block_test_theme'] = drupal_get_path('module', 'block_test') . '/themes/block_test_theme/block_test_theme.info';
+  return $themes;
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function block_test_block_info() {
+  $blocks['test_cache'] = array(
+    'info' => t('Test block caching'),
+    'cache' => variable_get('block_test_caching', DRUPAL_CACHE_PER_ROLE),
+  );
+
+  $blocks['test_underscore'] = array(
+    'info' => t('Test underscore'),
+  );
+
+  $blocks['test-hyphen'] = array(
+    'info' => t('Test hyphen'),
+  );
+
+  $blocks['test_html_id'] = array(
+    'info' => t('Test block html id'),
+  );
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_view().
+ */
+function block_test_block_view($delta = 0) {
+  return array('content' => variable_get('block_test_content', ''));
+}
+
+/**
+ * Implements hook_block_view_MODULE_DELTA_alter().
+ */
+function block_test_block_view_block_test_test_underscore_alter(&$data, $block) {
+  $data['content'] = 'hook_block_view_MODULE_DELTA_alter';
+}
+
+/**
+ * Implements hook_block_view_MODULE_DELTA_alter().
+ */
+function block_test_block_view_block_test_test_hyphen_alter(&$data, $block) {
+  $data['content'] = 'hook_block_view_MODULE_DELTA_alter';
+}
+
+/**
+ * Implements hook_block_info_alter().
+ */
+function block_test_block_info_alter(&$blocks) {
+  if (variable_get('block_test_info_alter')) {
+    $blocks['block_test']['test_html_id']['weight'] = 10000;
+  }
+}
diff --git a/htmltest/modules/block/tests/themes/block_test_theme/block_test_theme.info b/htmltest/modules/block/tests/themes/block_test_theme/block_test_theme.info
new file mode 100644
index 00000000..eff2b502
--- /dev/null
+++ b/htmltest/modules/block/tests/themes/block_test_theme/block_test_theme.info
@@ -0,0 +1,20 @@
+name = Block test theme
+description = Theme for testing the block system
+core = 7.x
+hidden = TRUE
+
+regions[sidebar_first] = Left sidebar
+regions_hidden[]  = sidebar_first
+regions[sidebar_second] = Right sidebar
+regions_hidden[]  = sidebar_second
+regions[content] = Content
+regions[header] = Header
+regions[footer] = Footer
+regions[highlighted] = Highlighted
+regions[help] = Help
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/block/tests/themes/block_test_theme/page.tpl.php b/htmltest/modules/block/tests/themes/block_test_theme/page.tpl.php
new file mode 100644
index 00000000..ba72882e
--- /dev/null
+++ b/htmltest/modules/block/tests/themes/block_test_theme/page.tpl.php
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * @file
+ * Custom theme implementation to display a single Drupal page without
+ * sidebars. The sidebars are hidden by regions_hidden for this theme, so
+ * the default page.tpl.php will not work without throwing exceptions.
+ */
+?>
+
+  <div id="page-wrapper"><div id="page">
+
+    <div id="header"><div class="section clearfix">
+
+      <?php if ($logo): ?>
+        <a href="<?php print $front_page; ?>" title="<?php print t('Home'); ?>" rel="home" id="logo">
+          <img src="<?php print $logo; ?>" alt="<?php print t('Home'); ?>" />
+        </a>
+      <?php endif; ?>
+
+      <?php if ($site_name || $site_slogan): ?>
+        <div id="name-and-slogan">
+          <?php if ($site_name): ?>
+            <?php if ($title): ?>
+              <div id="site-name"><strong>
+                <a href="<?php print $front_page; ?>" title="<?php print t('Home'); ?>" rel="home"><span><?php print $site_name; ?></span></a>
+              </strong></div>
+            <?php else: /* Use h1 when the content title is empty */ ?>
+              <h1 id="site-name">
+                <a href="<?php print $front_page; ?>" title="<?php print t('Home'); ?>" rel="home"><span><?php print $site_name; ?></span></a>
+              </h1>
+            <?php endif; ?>
+          <?php endif; ?>
+
+          <?php if ($site_slogan): ?>
+            <div id="site-slogan"><?php print $site_slogan; ?></div>
+          <?php endif; ?>
+        </div> <!-- /#name-and-slogan -->
+      <?php endif; ?>
+
+      <?php print render($page['header']); ?>
+
+    </div></div> <!-- /.section, /#header -->
+
+    <?php if ($main_menu || $secondary_menu): ?>
+      <div id="navigation"><div class="section">
+        <?php print theme('links__system_main_menu', array('links' => $main_menu, 'attributes' => array('id' => 'main-menu', 'class' => array('links', 'inline', 'clearfix')), 'heading' => t('Main menu'))); ?>
+        <?php print theme('links__system_secondary_menu', array('links' => $secondary_menu, 'attributes' => array('id' => 'secondary-menu', 'class' => array('links', 'inline', 'clearfix')), 'heading' => t('Secondary menu'))); ?>
+      </div></div> <!-- /.section, /#navigation -->
+    <?php endif; ?>
+
+    <?php if ($breadcrumb): ?>
+      <div id="breadcrumb"><?php print $breadcrumb; ?></div>
+    <?php endif; ?>
+
+    <?php print $messages; ?>
+
+    <div id="main-wrapper"><div id="main" class="clearfix">
+
+      <div id="content" class="column"><div class="section">
+        <?php if ($page['highlighted']): ?><div id="highlighted"><?php print render($page['highlighted']); ?></div><?php endif; ?>
+        <a id="main-content"></a>
+        <?php print render($title_prefix); ?>
+        <?php if ($title): ?><h1 class="title" id="page-title"><?php print $title; ?></h1><?php endif; ?>
+        <?php print render($title_suffix); ?>
+        <?php if ($tabs = render($tabs)): ?><div class="tabs"><?php print $tabs; ?></div><?php endif; ?>
+        <?php print render($page['help']); ?>
+        <?php if ($action_links): ?><ul class="action-links"><?php print render($action_links); ?></ul><?php endif; ?>
+        <?php print render($page['content']); ?>
+        <?php print $feed_icons; ?>
+      </div></div> <!-- /.section, /#content -->
+    </div></div> <!-- /#main, /#main-wrapper -->
+
+    <div id="footer"><div class="section">
+      <?php print render($page['footer']); ?>
+    </div></div> <!-- /.section, /#footer -->
+
+  </div></div> <!-- /#page, /#page-wrapper -->
diff --git a/htmltest/modules/blog/blog.info b/htmltest/modules/blog/blog.info
new file mode 100644
index 00000000..01bfa8fe
--- /dev/null
+++ b/htmltest/modules/blog/blog.info
@@ -0,0 +1,12 @@
+name = Blog
+description = Enables multi-user blogs.
+package = Core
+version = VERSION
+core = 7.x
+files[] = blog.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/blog/blog.install b/htmltest/modules/blog/blog.install
new file mode 100644
index 00000000..fffb14b8
--- /dev/null
+++ b/htmltest/modules/blog/blog.install
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the blog module.
+ */
+
+/**
+ * Implements hook_install().
+ */
+function blog_install() {
+  // Ensure the blog node type is available.
+  node_types_rebuild();
+  $types = node_type_get_types();
+  node_add_body_field($types['blog']);
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function blog_uninstall() {
+  variable_del('blog_block_count');
+}
diff --git a/htmltest/modules/blog/blog.module b/htmltest/modules/blog/blog.module
new file mode 100644
index 00000000..11e3ab95
--- /dev/null
+++ b/htmltest/modules/blog/blog.module
@@ -0,0 +1,272 @@
+<?php
+
+/**
+ * @file
+ * Enables multi-user blogs.
+ */
+
+/**
+ * Implements hook_node_info().
+ */
+function blog_node_info() {
+  return array(
+    'blog' => array(
+      'name' => t('Blog entry'),
+      'base' => 'blog',
+      'description' => t('Use for multi-user blogs. Every user gets a personal blog.'),
+    )
+  );
+}
+
+/**
+ * Implements hook_user_view().
+ */
+function blog_user_view($account) {
+  if (user_access('create blog content', $account)) {
+    $account->content['summary']['blog'] =  array(
+      '#type' => 'user_profile_item',
+      '#title' => t('Blog'),
+      // l() escapes the attributes, so we should not escape !username here.
+      '#markup' => l(t('View recent blog entries'), "blog/$account->uid", array('attributes' => array('title' => t("Read !username's latest blog entries.", array('!username' => format_username($account)))))),
+      '#attributes' => array('class' => array('blog')),
+    );
+  }
+}
+
+/**
+ * Implements hook_help().
+ */
+function blog_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#blog':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t("The Blog module allows registered users to maintain an online journal, or <em>blog</em>. Blogs are made up of individual <em>blog entries</em>. By default, the blog entries are displayed by creation time in descending order, with comments enabled, and are promoted to the site's front page. For more information, see the online handbook entry for <a href='@blog'>Blog module</a>.", array('@blog' => 'http://drupal.org/documentation/modules/blog/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Single-user blogs') . '</dt>';
+      $output .= '<dd>' . t("Each user's blog entries are automatically displayed with a link to the user's main blog page. You can create as many single-user blogs as you have site users with permission to create blog content.") . '</dd>';
+      $output .= '<dt>' . t('Multi-user blogs') . '</dt>';
+      $output .= '<dd>' . t("Blog entries from each single-user blog are also aggregated into one central multi-user blog, which displays the blog content of all users in a single listing.") . '</dd>';
+      $output .= '<dt>' . t('Navigation') . '</dt>';
+      $output .= '<dd>' . t("There is an optional <em>Blogs</em> menu item added to the Navigation menu, which displays all blogs available on your site, and a <em>My blog</em> item displaying the current user's blog entries.") . '</dd>';
+      $output .= '<dt>' . t('Blocks') . '</dt>';
+      $output .= '<dd>' . t('The Blog module also creates a default <em>Recent blog posts</em> block that may be enabled at the <a href="@blocks">blocks administration page</a>.', array('@blocks' => url('admin/structure/block'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_form().
+ */
+function blog_form($node, $form_state) {
+  return node_content_form($node, $form_state);
+}
+
+/**
+ * Implements hook_view().
+ */
+function blog_view($node, $view_mode) {
+  if ($view_mode == 'full' && node_is_page($node)) {
+    // Breadcrumb navigation.  l() escapes title, so we should not escape !name.
+    drupal_set_breadcrumb(array(l(t('Home'), NULL), l(t('Blogs'), 'blog'), l(t("!name's blog", array('!name' => format_username($node))), 'blog/' . $node->uid)));
+  }
+  return $node;
+}
+
+/**
+ * Implements hook_node_view().
+ */
+function blog_node_view($node, $view_mode) {
+  if ($view_mode != 'rss') {
+    if ($node->type == 'blog' && (arg(0) != 'blog' || arg(1) != $node->uid)) {
+      // This goes to l(), which escapes !username in both title and attributes.
+      $links['blog_usernames_blog'] = array(
+        'title' => t("!username's blog", array('!username' => format_username($node))),
+        'href' => "blog/$node->uid",
+        'attributes' => array('title' => t("Read !username's latest blog entries.", array('!username' => format_username($node)))),
+      );
+      $node->content['links']['blog'] = array(
+        '#theme' => 'links__node__blog',
+        '#links' => $links,
+        '#attributes' => array('class' => array('links', 'inline')),
+      );
+    }
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function blog_menu() {
+  $items['blog'] = array(
+    'title' => 'Blogs',
+    'page callback' => 'blog_page_last',
+    'access arguments' => array('access content'),
+    'type' => MENU_SUGGESTED_ITEM,
+    'file' => 'blog.pages.inc',
+  );
+  $items['blog/%user_uid_optional'] = array(
+    'title' => 'My blog',
+    'page callback' => 'blog_page_user',
+    'page arguments' => array(1),
+    'access callback' => 'blog_page_user_access',
+    'access arguments' => array(1),
+    'file' => 'blog.pages.inc',
+  );
+  $items['blog/%user/feed'] = array(
+    'title' => 'Blogs',
+    'page callback' => 'blog_feed_user',
+    'page arguments' => array(1),
+    'access callback' => 'blog_page_user_access',
+    'access arguments' => array(1),
+    'type' => MENU_CALLBACK,
+    'file' => 'blog.pages.inc',
+  );
+  $items['blog/feed'] = array(
+    'title' => 'Blogs',
+    'page callback' => 'blog_feed_last',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+    'file' => 'blog.pages.inc',
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_menu_local_tasks_alter().
+ */
+function blog_menu_local_tasks_alter(&$data, $router_item, $root_path) {
+  global $user;
+
+  // Add action link to 'node/add/blog' on 'blog' page.
+  if ($root_path == 'blog') {
+    $item = menu_get_item('node/add/blog');
+    if ($item['access']) {
+      $item['title'] = t('Create new blog entry');
+      $data['actions']['output'][] = array(
+        '#theme' => 'menu_local_action',
+        '#link' => $item,
+      );
+    }
+  }
+  // Provide a helper action link to the author on the 'blog/%' page.
+  elseif ($root_path == 'blog/%' && $router_item['page_arguments'][0]->uid == $user->uid) {
+    $data['actions']['output']['blog'] = array(
+      '#theme' => 'menu_local_action',
+    );
+    if (user_access('create blog content')) {
+      $data['actions']['output']['blog']['#link']['title'] = t('Post new blog entry.');
+      $data['actions']['output']['blog']['#link']['href'] = 'node/add/blog';
+    }
+    else {
+      $data['actions']['output']['blog']['#link']['title'] = t('You are not allowed to post a new blog entry.');
+    }
+  }
+}
+
+/**
+ * Access callback for user blog pages.
+ */
+function blog_page_user_access($account) {
+  // The visitor must be able to access the site's content.
+  // For a blog to 'exist' the user must either be able to
+  // create new blog entries, or it must have existing posts.
+  return $account->uid && user_access('access content') && (user_access('create blog content', $account) || _blog_post_exists($account));
+}
+
+/**
+ * Helper function to determine if a user has blog posts already.
+ */
+function _blog_post_exists($account) {
+  return (bool)db_select('node', 'n')
+    ->fields('n', array('nid'))
+    ->condition('type', 'blog')
+    ->condition('uid', $account->uid)
+    ->condition('status', 1)
+    ->range(0, 1)
+    ->addTag('node_access')
+    ->execute()
+    ->fetchField();
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function blog_block_info() {
+  $block['recent']['info'] = t('Recent blog posts');
+  $block['recent']['properties']['administrative'] = TRUE;
+  return $block;
+}
+
+/**
+ * Implements hook_block_configure().
+ */
+function blog_block_configure($delta = '') {
+  if ($delta == 'recent') {
+    $form['blog_block_count'] = array(
+      '#type' => 'select',
+      '#title' => t('Number of recent blog posts to display'),
+      '#default_value' => variable_get('blog_block_count', 10),
+      '#options' => drupal_map_assoc(array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 30)),
+    );
+    return $form;
+  }
+}
+
+/**
+ * Implements hook_block_save().
+ */
+function blog_block_save($delta = '', $edit = array()) {
+  if ($delta == 'recent') {
+    variable_set('blog_block_count', $edit['blog_block_count']);
+  }
+}
+
+/**
+ * Implements hook_block_view().
+ *
+ * Displays the most recent 10 blog titles.
+ */
+function blog_block_view($delta = '') {
+  global $user;
+
+  if (user_access('access content')) {
+    $result = db_select('node', 'n')
+      ->fields('n', array('nid', 'title', 'created'))
+      ->condition('type', 'blog')
+      ->condition('status', 1)
+      ->orderBy('created', 'DESC')
+      ->range(0, variable_get('blog_block_count', 10))
+      ->addTag('node_access')
+      ->execute();
+
+    if ($node_title_list = node_title_list($result)) {
+      $block['subject'] = t('Recent blog posts');
+      $block['content']['blog_list'] = $node_title_list;
+      $block['content']['blog_more'] = array(
+        '#theme' => 'more_link',
+        '#url' => 'blog',
+        '#title' => t('Read the latest blog entries.'),
+      );
+
+      return $block;
+    }
+  }
+}
+
+/**
+ * Implements hook_rdf_mapping().
+ */
+function blog_rdf_mapping() {
+  return array(
+    array(
+      'type' => 'node',
+      'bundle' => 'blog',
+      'mapping' => array(
+        'rdftype' => array('sioc:Post', 'sioct:BlogPost'),
+      ),
+    ),
+  );
+}
diff --git a/htmltest/modules/blog/blog.pages.inc b/htmltest/modules/blog/blog.pages.inc
new file mode 100644
index 00000000..3684028d
--- /dev/null
+++ b/htmltest/modules/blog/blog.pages.inc
@@ -0,0 +1,127 @@
+<?php
+
+/**
+ * @file
+ * Page callback file for the blog module.
+ */
+
+/**
+ * Menu callback; displays a Drupal page containing recent blog entries of a given user.
+ */
+function blog_page_user($account) {
+  global $user;
+
+  drupal_set_title($title = t("@name's blog", array('@name' => format_username($account))), PASS_THROUGH);
+
+  $build = array();
+
+  $query = db_select('node', 'n')->extend('PagerDefault');
+  $nids = $query
+    ->fields('n', array('nid', 'sticky', 'created'))
+    ->condition('type', 'blog')
+    ->condition('uid', $account->uid)
+    ->condition('status', 1)
+    ->orderBy('sticky', 'DESC')
+    ->orderBy('created', 'DESC')
+    ->limit(variable_get('default_nodes_main', 10))
+    ->addTag('node_access')
+    ->execute()
+    ->fetchCol();
+
+  if (!empty($nids)) {
+    $nodes = node_load_multiple($nids);
+    $build += node_view_multiple($nodes);
+    $build['pager'] = array(
+      '#theme' => 'pager',
+      '#weight' => 5,
+    );
+  }
+  else {
+    if ($account->uid == $user->uid) {
+      drupal_set_message(t('You have not created any blog entries.'));
+    }
+    else {
+      drupal_set_message(t('!author has not created any blog entries.', array('!author' => theme('username', array('account' => $account)))));
+    }
+  }
+  drupal_add_feed('blog/' . $account->uid . '/feed', t('RSS - !title', array('!title' => $title)));
+
+  return $build;
+}
+
+/**
+ * Menu callback; displays a Drupal page containing recent blog entries of all users.
+ */
+function blog_page_last() {
+  global $user;
+  $build = array();
+
+  $query = db_select('node', 'n')->extend('PagerDefault');
+  $nids = $query
+    ->fields('n', array('nid', 'sticky', 'created'))
+    ->condition('type', 'blog')
+    ->condition('status', 1)
+    ->orderBy('sticky', 'DESC')
+    ->orderBy('created', 'DESC')
+    ->limit(variable_get('default_nodes_main', 10))
+    ->addTag('node_access')
+    ->execute()
+    ->fetchCol();
+
+  if (!empty($nids)) {
+    $nodes = node_load_multiple($nids);
+    $build += node_view_multiple($nodes);
+    $build['pager'] = array(
+      '#theme' => 'pager',
+      '#weight' => 5,
+    );
+  }
+  else {
+    drupal_set_message(t('No blog entries have been created.'));
+  }
+  drupal_add_feed('blog/feed', t('RSS - blogs'));
+
+  return $build;
+}
+
+/**
+ * Menu callback; displays an RSS feed containing recent blog entries of a given user.
+ */
+function blog_feed_user($account) {
+
+  $nids = db_select('node', 'n')
+    ->fields('n', array('nid', 'created'))
+    ->condition('type', 'blog')
+    ->condition('uid', $account->uid)
+    ->condition('status', 1)
+    ->orderBy('created', 'DESC')
+    ->range(0, variable_get('feed_default_items', 10))
+    ->addTag('node_access')
+    ->execute()
+    ->fetchCol();
+
+  $channel['title'] = t("!name's blog", array('!name' => format_username($account)));
+  $channel['link'] = url('blog/' . $account->uid, array('absolute' => TRUE));
+
+  node_feed($nids, $channel);
+}
+
+/**
+ * Menu callback; displays an RSS feed containing recent blog entries of all users.
+ */
+function blog_feed_last() {
+  $nids = db_select('node', 'n')
+    ->fields('n', array('nid', 'created'))
+    ->condition('type', 'blog')
+    ->condition('status', 1)
+    ->orderBy('created', 'DESC')
+    ->range(0, variable_get('feed_default_items', 10))
+    ->addTag('node_access')
+    ->execute()
+    ->fetchCol();
+
+  $channel['title'] = t('!site_name blogs', array('!site_name' => variable_get('site_name', 'Drupal')));
+  $channel['link'] = url('blog', array('absolute' => TRUE));
+
+  node_feed($nids, $channel);
+}
diff --git a/htmltest/modules/blog/blog.test b/htmltest/modules/blog/blog.test
new file mode 100644
index 00000000..b9172945
--- /dev/null
+++ b/htmltest/modules/blog/blog.test
@@ -0,0 +1,213 @@
+<?php
+
+/**
+ * @file
+ * Tests for blog.module.
+ */
+
+class BlogTestCase extends DrupalWebTestCase {
+  protected $big_user;
+  protected $own_user;
+  protected $any_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Blog functionality',
+      'description' => 'Create, view, edit, delete, and change blog entries and verify its consistency in the database.',
+      'group' => 'Blog',
+    );
+  }
+
+  /**
+   * Enable modules and create users with specific permissions.
+   */
+  function setUp() {
+    parent::setUp('blog');
+    // Create users.
+    $this->big_user = $this->drupalCreateUser(array('administer blocks'));
+    $this->own_user = $this->drupalCreateUser(array('create blog content', 'edit own blog content', 'delete own blog content'));
+    $this->any_user = $this->drupalCreateUser(array('create blog content', 'edit any blog content', 'delete any blog content', 'access administration pages'));
+  }
+
+  /**
+   * Confirm that the "You are not allowed to post a new blog entry." message
+   * shows up if a user submitted blog entries, has been denied that
+   * permission, and goes to the blog page.
+   */
+  function testUnprivilegedUser() {
+    // Create a blog node for a user with no blog permissions.
+    $this->drupalCreateNode(array('type' => 'blog', 'uid' => $this->big_user->uid));
+
+    $this->drupalLogin($this->big_user);
+
+    $this->drupalGet('blog/' . $this->big_user->uid);
+    $this->assertResponse(200);
+    $this->assertTitle(t("@name's blog", array('@name' => format_username($this->big_user))) . ' | Drupal', 'Blog title was displayed');
+    $this->assertText(t('You are not allowed to post a new blog entry.'), 'No new entries can be posted without the right permission');
+  }
+
+  /**
+   * View the blog of a user with no blog entries as another user.
+   */
+  function testBlogPageNoEntries() {
+    $this->drupalLogin($this->big_user);
+
+    $this->drupalGet('blog/' . $this->own_user->uid);
+    $this->assertResponse(200);
+    $this->assertTitle(t("@name's blog", array('@name' => format_username($this->own_user))) . ' | Drupal', 'Blog title was displayed');
+    $this->assertText(t('@author has not created any blog entries.', array('@author' => format_username($this->own_user))), 'Users blog displayed with no entries');
+  }
+
+  /**
+   * Login users, create blog nodes, and test blog functionality through the admin and user interfaces.
+   */
+  function testBlog() {
+    // Login the admin user.
+    $this->drupalLogin($this->big_user);
+    // Enable the recent blog block.
+    $edit = array();
+    $edit['blocks[blog_recent][region]'] = 'sidebar_second';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->assertResponse(200);
+    // Verify ability to change number of recent blog posts in block.
+    $edit = array();
+    $edit['blog_block_count'] = 5;
+    $this->drupalPost('admin/structure/block/manage/blog/recent/configure', $edit, t('Save block'));
+    $this->assertEqual(variable_get('blog_block_count', 10), 5, 'Number of recent blog posts changed.');
+
+    // Do basic tests for each user.
+    $this->doBasicTests($this->any_user, TRUE);
+    $this->doBasicTests($this->own_user, FALSE);
+
+    // Create another blog node for the any blog user.
+    $node = $this->drupalCreateNode(array('type' => 'blog', 'uid' => $this->any_user->uid));
+    // Verify the own blog user only has access to the blog view node.
+    $this->verifyBlogs($this->any_user, $node, FALSE, 403);
+
+    // Create another blog node for the own blog user.
+    $node = $this->drupalCreateNode(array('type' => 'blog', 'uid' => $this->own_user->uid));
+    // Login the any blog user.
+    $this->drupalLogin($this->any_user);
+    // Verify the any blog user has access to all the blog nodes.
+    $this->verifyBlogs($this->own_user, $node, TRUE);
+  }
+
+  /**
+   * Run basic tests on the indicated user.
+   *
+   * @param object $user
+   *   The logged in user.
+   * @param boolean $admin
+   *   User has 'access administration pages' privilege.
+   */
+  private function doBasicTests($user, $admin) {
+    // Login the user.
+    $this->drupalLogin($user);
+    // Create blog node.
+    $node = $this->drupalCreateNode(array('type' => 'blog'));
+    // Verify the user has access to all the blog nodes.
+    $this->verifyBlogs($user, $node, $admin);
+    // Create one more node to test the blog page with more than one node
+    $this->drupalCreateNode(array('type' => 'blog', 'uid' => $user->uid));
+    // Verify the blog links are displayed.
+    $this->verifyBlogLinks($user);
+  }
+
+  /**
+   * Verify the logged in user has the desired access to the various blog nodes.
+   *
+   * @param object $node_user
+   *   The user who creates the node.
+   * @param object $node
+   *   A node object.
+   * @param boolean $admin
+   *   User has 'access administration pages' privilege.
+   * @param integer $response
+   *   HTTP response code.
+   */
+  private function verifyBlogs($node_user, $node, $admin, $response = 200) {
+    $response2 = ($admin) ? 200 : 403;
+
+    // View blog help node.
+    $this->drupalGet('admin/help/blog');
+    $this->assertResponse($response2);
+    if ($response2 == 200) {
+      $this->assertTitle(t('Blog | Drupal'), 'Blog help node was displayed');
+      $this->assertText(t('Blog'), 'Blog help node was displayed');
+    }
+
+    // Verify the blog block was displayed.
+    $this->drupalGet('');
+    $this->assertResponse(200);
+    $this->assertText(t('Recent blog posts'), 'Blog block was displayed');
+
+    // View blog node.
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertResponse(200);
+    $this->assertTitle($node->title . ' | Drupal', 'Blog node was displayed');
+    $breadcrumb = array(
+      l(t('Home'), NULL),
+      l(t('Blogs'), 'blog'),
+      l(t("!name's blog", array('!name' => format_username($node_user))), 'blog/' . $node_user->uid),
+    );
+    $this->assertRaw(theme('breadcrumb', array('breadcrumb' => $breadcrumb)), 'Breadcrumbs were displayed');
+
+    // View blog edit node.
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertResponse($response);
+    if ($response == 200) {
+      $this->assertTitle('Edit Blog entry ' . $node->title . ' | Drupal', 'Blog edit node was displayed');
+    }
+
+    if ($response == 200) {
+      // Edit blog node.
+      $edit = array();
+      $langcode = LANGUAGE_NONE;
+      $edit["title"] = 'node/' . $node->nid;
+      $edit["body[$langcode][0][value]"] = $this->randomName(256);
+      $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+      $this->assertRaw(t('Blog entry %title has been updated.', array('%title' => $edit["title"])), 'Blog node was edited');
+
+      // Delete blog node.
+      $this->drupalPost('node/' . $node->nid . '/delete', array(), t('Delete'));
+      $this->assertResponse($response);
+      $this->assertRaw(t('Blog entry %title has been deleted.', array('%title' => $edit["title"])), 'Blog node was deleted');
+    }
+  }
+
+  /**
+   * Verify the blog links are displayed to the logged in user.
+   *
+   * @param object $user
+   *   The logged in user.
+   */
+  private function verifyBlogLinks($user) {
+    // Confirm blog entries link exists on the user page.
+    $this->drupalGet('user/' . $user->uid);
+    $this->assertResponse(200);
+    $this->assertText(t('View recent blog entries'), 'View recent blog entries link was displayed');
+
+    // Confirm the recent blog entries link goes to the user's blog page.
+    $this->clickLink('View recent blog entries');
+    $this->assertTitle(t("@name's blog | Drupal", array('@name' => format_username($user))), 'View recent blog entries link target was correct');
+
+    // Confirm a blog page was displayed.
+    $this->drupalGet('blog');
+    $this->assertResponse(200);
+    $this->assertTitle('Blogs | Drupal', 'Blog page was displayed');
+    $this->assertText(t('Home'), 'Breadcrumbs were displayed');
+    $this->assertLink(t('Create new blog entry'));
+
+    // Confirm a blog page was displayed per user.
+    $this->drupalGet('blog/' . $user->uid);
+    $this->assertTitle(t("@name's blog | Drupal", array('@name' => format_username($user))), 'User blog node was displayed');
+
+    // Confirm a blog feed was displayed.
+    $this->drupalGet('blog/feed');
+    $this->assertTitle(t('Drupal blogs'), 'Blog feed was displayed');
+
+    // Confirm a blog feed was displayed per user.
+    $this->drupalGet('blog/' . $user->uid . '/feed');
+    $this->assertTitle(t("@name's blog", array('@name' => format_username($user))), 'User blog feed was displayed');
+  }
+}
diff --git a/htmltest/modules/book/book-all-books-block.tpl.php b/htmltest/modules/book/book-all-books-block.tpl.php
new file mode 100644
index 00000000..3a5a2876
--- /dev/null
+++ b/htmltest/modules/book/book-all-books-block.tpl.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation for rendering book outlines within a block.
+ *
+ * This template is used only when the block is configured to "show block on all
+ * pages", which presents multiple independent books on all pages.
+ *
+ * Available variables:
+ * - $book_menus: Array of book outlines keyed to the parent book ID. Call
+ *   render() on each to print it as an unordered list.
+ *
+ * @see template_preprocess_book_all_books_block()
+ *
+ * @ingroup themeable
+ */
+?>
+<?php foreach ($book_menus as $book_id => $menu): ?>
+  <div id="book-block-menu-<?php print $book_id; ?>" class="book-block-menu">
+    <?php print render($menu); ?>
+  </div>
+<?php endforeach; ?>
diff --git a/htmltest/modules/book/book-export-html.tpl.php b/htmltest/modules/book/book-export-html.tpl.php
new file mode 100644
index 00000000..d22b7d26
--- /dev/null
+++ b/htmltest/modules/book/book-export-html.tpl.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation for printed version of book outline.
+ *
+ * Available variables:
+ * - $title: Top level node title.
+ * - $head: Header tags.
+ * - $language: Language code. e.g. "en" for english.
+ * - $language_rtl: TRUE or FALSE depending on right to left language scripts.
+ * - $base_url: URL to home page.
+ * - $contents: Nodes within the current outline rendered through
+ *   book-node-export-html.tpl.php.
+ *
+ * @see template_preprocess_book_export_html()
+ *
+ * @ingroup themeable
+ */
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="<?php print $language->language; ?>" xml:lang="<?php print $language->language; ?>" dir="<?php print $dir; ?>">
+  <head>
+    <title><?php print $title; ?></title>
+    <?php print $head; ?>
+    <base href="<?php print $base_url; ?>" />
+    <link type="text/css" rel="stylesheet" href="misc/print.css" />
+    <?php if ($language_rtl): ?>
+      <link type="text/css" rel="stylesheet" href="misc/print-rtl.css" />
+    <?php endif; ?>
+  </head>
+  <body>
+    <?php
+    /**
+     * The given node is /embedded to its absolute depth in a top level
+     * section/. For example, a child node with depth 2 in the hierarchy is
+     * contained in (otherwise empty) &lt;div&gt; elements corresponding to
+     * depth 0 and depth 1. This is intended to support WYSIWYG output - e.g.,
+     * level 3 sections always look like level 3 sections, no matter their
+     * depth relative to the node selected to be exported as printer-friendly
+     * HTML.
+     */
+    $div_close = '';
+    ?>
+    <?php for ($i = 1; $i < $depth; $i++): ?>
+      <div class="section-<?php print $i; ?>">
+      <?php $div_close .= '</div>'; ?>
+    <?php endfor; ?>
+    <?php print $contents; ?>
+    <?php print $div_close; ?>
+  </body>
+</html>
diff --git a/htmltest/modules/book/book-navigation.tpl.php b/htmltest/modules/book/book-navigation.tpl.php
new file mode 100644
index 00000000..7a6b34c7
--- /dev/null
+++ b/htmltest/modules/book/book-navigation.tpl.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to navigate books.
+ *
+ * Presented under nodes that are a part of book outlines.
+ *
+ * Available variables:
+ * - $tree: The immediate children of the current node rendered as an unordered
+ *   list.
+ * - $current_depth: Depth of the current node within the book outline. Provided
+ *   for context.
+ * - $prev_url: URL to the previous node.
+ * - $prev_title: Title of the previous node.
+ * - $parent_url: URL to the parent node.
+ * - $parent_title: Title of the parent node. Not printed by default. Provided
+ *   as an option.
+ * - $next_url: URL to the next node.
+ * - $next_title: Title of the next node.
+ * - $has_links: Flags TRUE whenever the previous, parent or next data has a
+ *   value.
+ * - $book_id: The book ID of the current outline being viewed. Same as the node
+ *   ID containing the entire outline. Provided for context.
+ * - $book_url: The book/node URL of the current outline being viewed. Provided
+ *   as an option. Not used by default.
+ * - $book_title: The book/node title of the current outline being viewed.
+ *   Provided as an option. Not used by default.
+ *
+ * @see template_preprocess_book_navigation()
+ *
+ * @ingroup themeable
+ */
+?>
+<?php if ($tree || $has_links): ?>
+  <div id="book-navigation-<?php print $book_id; ?>" class="book-navigation">
+    <?php print $tree; ?>
+
+    <?php if ($has_links): ?>
+    <div class="page-links clearfix">
+      <?php if ($prev_url): ?>
+        <a href="<?php print $prev_url; ?>" class="page-previous" title="<?php print t('Go to previous page'); ?>"><?php print t('‹ ') . $prev_title; ?></a>
+      <?php endif; ?>
+      <?php if ($parent_url): ?>
+        <a href="<?php print $parent_url; ?>" class="page-up" title="<?php print t('Go to parent page'); ?>"><?php print t('up'); ?></a>
+      <?php endif; ?>
+      <?php if ($next_url): ?>
+        <a href="<?php print $next_url; ?>" class="page-next" title="<?php print t('Go to next page'); ?>"><?php print $next_title . t(' ›'); ?></a>
+      <?php endif; ?>
+    </div>
+    <?php endif; ?>
+
+  </div>
+<?php endif; ?>
diff --git a/htmltest/modules/book/book-node-export-html.tpl.php b/htmltest/modules/book/book-node-export-html.tpl.php
new file mode 100644
index 00000000..0c2c67cc
--- /dev/null
+++ b/htmltest/modules/book/book-node-export-html.tpl.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation for a single node in a printer-friendly outline.
+ *
+ * @see book-node-export-html.tpl.php
+ * Where it is collected and printed out.
+ *
+ * Available variables:
+ * - $depth: Depth of the current node inside the outline.
+ * - $title: Node title.
+ * - $content: Node content.
+ * - $children: All the child nodes recursively rendered through this file.
+ *
+ * @see template_preprocess_book_node_export_html()
+ *
+ * @ingroup themeable
+ */
+?>
+<div id="node-<?php print $node->nid; ?>" class="section-<?php print $depth; ?>">
+  <h1 class="book-heading"><?php print $title; ?></h1>
+  <?php print $content; ?>
+  <?php print $children; ?>
+</div>
diff --git a/htmltest/modules/book/book-rtl.css b/htmltest/modules/book/book-rtl.css
new file mode 100644
index 00000000..40dff0e5
--- /dev/null
+++ b/htmltest/modules/book/book-rtl.css
@@ -0,0 +1,15 @@
+/**
+ * @file
+ * Right-to-Left styling for the Book module.
+ */
+
+.book-navigation .menu {
+  padding: 1em 3em 0 0;
+}
+
+.book-navigation .page-previous {
+  float: right;
+}
+.book-navigation .page-up {
+  float: right;
+}
diff --git a/htmltest/modules/book/book.admin.inc b/htmltest/modules/book/book.admin.inc
new file mode 100644
index 00000000..cc3f08fc
--- /dev/null
+++ b/htmltest/modules/book/book.admin.inc
@@ -0,0 +1,289 @@
+<?php
+
+/**
+ * @file
+ * Administration page callbacks for the Book module.
+ */
+
+/**
+ * Returns an administrative overview of all books.
+ *
+ * @return string
+ *   A HTML-formatted string with the administrative page content.
+ *
+ * @see book_menu()
+ */
+function book_admin_overview() {
+  $rows = array();
+
+  $headers = array(t('Book'), t('Operations'));
+
+  // Add any recognized books to the table list.
+  foreach (book_get_books() as $book) {
+    $rows[] = array(l($book['title'], $book['href'], $book['options']), l(t('edit order and titles'), 'admin/content/book/' . $book['nid']));
+  }
+
+  return theme('table', array('header' => $headers, 'rows' => $rows, 'empty' => t('No books available.')));
+}
+
+/**
+ * Form constructor for the book settings form.
+ *
+ * @see book_admin_settings_validate()
+ *
+ * @ingroup forms
+ */
+function book_admin_settings() {
+  $types = node_type_get_names();
+  $form['book_allowed_types'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Content types allowed in book outlines'),
+    '#default_value' => variable_get('book_allowed_types', array('book')),
+    '#options' => $types,
+    '#description' => t('Users with the %outline-perm permission can add all content types.', array('%outline-perm' => t('Administer book outlines'))),
+    '#required' => TRUE,
+  );
+  $form['book_child_type'] = array(
+    '#type' => 'radios',
+    '#title' => t('Content type for child pages'),
+    '#default_value' => variable_get('book_child_type', 'book'),
+    '#options' => $types,
+    '#required' => TRUE,
+  );
+  $form['array_filter'] = array('#type' => 'value', '#value' => TRUE);
+  $form['#validate'][] = 'book_admin_settings_validate';
+
+  return system_settings_form($form);
+}
+
+/**
+ * Form validation handler for book_admin_settings().
+ *
+ * @see book_admin_settings_submit()
+ */
+function book_admin_settings_validate($form, &$form_state) {
+  $child_type = $form_state['values']['book_child_type'];
+  if (empty($form_state['values']['book_allowed_types'][$child_type])) {
+    form_set_error('book_child_type', t('The content type for the %add-child link must be one of those selected as an allowed book outline type.', array('%add-child' => t('Add child page'))));
+  }
+}
+
+/**
+ * Form constructor for administering a single book's hierarchy.
+ *
+ * @see book_admin_edit_submit()
+ *
+ * @param $node
+ *   The node of the top-level page in the book.
+ *
+ * @see book_admin_edit_validate()
+ * @see book_admin_edit_submit()
+ * @ingroup forms
+ */
+function book_admin_edit($form, $form_state, $node) {
+  drupal_set_title($node->title);
+  $form['#node'] = $node;
+  _book_admin_table($node, $form);
+  $form['save'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save book pages'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form validation handler for book_admin_edit().
+ *
+ * Checks that the book has not been changed while using the form.
+ *
+ * @see book_admin_edit_submit()
+ */
+function book_admin_edit_validate($form, &$form_state) {
+  if ($form_state['values']['tree_hash'] != $form_state['values']['tree_current_hash']) {
+    form_set_error('', t('This book has been modified by another user, the changes could not be saved.'));
+  }
+}
+
+/**
+ * Form submission handler for book_admin_edit().
+ *
+ * This function takes care to save parent menu items before their children.
+ * Saving menu items in the incorrect order can break the menu tree.
+ *
+ * @see book_admin_edit_validate()
+ * @see menu_overview_form_submit()
+ */
+function book_admin_edit_submit($form, &$form_state) {
+  // Save elements in the same order as defined in post rather than the form.
+  // This ensures parents are updated before their children, preventing orphans.
+  $order = array_flip(array_keys($form_state['input']['table']));
+  $form['table'] = array_merge($order, $form['table']);
+
+  foreach (element_children($form['table']) as $key) {
+    if ($form['table'][$key]['#item']) {
+      $row = $form['table'][$key];
+      $values = $form_state['values']['table'][$key];
+
+      // Update menu item if moved.
+      if ($row['plid']['#default_value'] != $values['plid'] || $row['weight']['#default_value'] != $values['weight']) {
+        $row['#item']['plid'] = $values['plid'];
+        $row['#item']['weight'] = $values['weight'];
+        menu_link_save($row['#item']);
+      }
+
+      // Update the title if changed.
+      if ($row['title']['#default_value'] != $values['title']) {
+        $node = node_load($values['nid']);
+        $langcode = LANGUAGE_NONE;
+        $node->title = $values['title'];
+        $node->book['link_title'] = $values['title'];
+        $node->revision = 1;
+        $node->log = t('Title changed from %original to %current.', array('%original' => $node->title, '%current' => $values['title']));
+
+        node_save($node);
+        watchdog('content', 'book: updated %title.', array('%title' => $node->title), WATCHDOG_NOTICE, l(t('view'), 'node/' . $node->nid));
+      }
+    }
+  }
+
+  drupal_set_message(t('Updated book %title.', array('%title' => $form['#node']->title)));
+}
+
+/**
+ * Builds the table portion of the form for the book administration page.
+ *
+ * @param $node
+ *   The node of the top-level page in the book.
+ * @param $form
+ *   The form that is being modified, passed by reference.
+ *
+ * @see book_admin_edit()
+ */
+function _book_admin_table($node, &$form) {
+  $form['table'] = array(
+    '#theme' => 'book_admin_table',
+    '#tree' => TRUE,
+  );
+
+  $tree = book_menu_subtree_data($node->book);
+  $tree = array_shift($tree); // Do not include the book item itself.
+  if ($tree['below']) {
+    $hash = drupal_hash_base64(serialize($tree['below']));
+    // Store the hash value as a hidden form element so that we can detect
+    // if another user changed the book hierarchy.
+    $form['tree_hash'] = array(
+      '#type' => 'hidden',
+      '#default_value' => $hash,
+    );
+    $form['tree_current_hash'] = array(
+      '#type' => 'value',
+      '#value' => $hash,
+    );
+    _book_admin_table_tree($tree['below'], $form['table']);
+  }
+
+}
+
+/**
+ * Helps build the main table in the book administration page form.
+ *
+ * @param $tree
+ *   A subtree of the book menu hierarchy.
+ * @param $form
+ *   The form that is being modified, passed by reference.
+ *
+ * @return
+ *   The modified form array.
+ *
+ * @see book_admin_edit()
+ */
+function _book_admin_table_tree($tree, &$form) {
+  // The delta must be big enough to give each node a distinct value.
+  $count = count($tree);
+  $delta = ($count < 30) ? 15 : intval($count / 2) + 1;
+
+  foreach ($tree as $data) {
+    $form['book-admin-' . $data['link']['nid']] = array(
+      '#item' => $data['link'],
+      'nid' => array('#type' => 'value', '#value' => $data['link']['nid']),
+      'depth' => array('#type' => 'value', '#value' => $data['link']['depth']),
+      'href' => array('#type' => 'value', '#value' => $data['link']['href']),
+      'title' => array(
+        '#type' => 'textfield',
+        '#default_value' => $data['link']['link_title'],
+        '#maxlength' => 255,
+        '#size' => 40,
+      ),
+      'weight' => array(
+        '#type' => 'weight',
+        '#default_value' => $data['link']['weight'],
+        '#delta' => max($delta, abs($data['link']['weight'])),
+        '#title' => t('Weight for @title', array('@title' => $data['link']['title'])),
+        '#title_display' => 'invisible',
+      ),
+      'plid' => array(
+        '#type' => 'hidden',
+        '#default_value' => $data['link']['plid'],
+      ),
+      'mlid' => array(
+        '#type' => 'hidden',
+        '#default_value' => $data['link']['mlid'],
+      ),
+    );
+    if ($data['below']) {
+      _book_admin_table_tree($data['below'], $form);
+    }
+  }
+
+  return $form;
+}
+
+/**
+ * Returns HTML for a book administration form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @see book_admin_table()
+ * @ingroup themeable
+ */
+function theme_book_admin_table($variables) {
+  $form = $variables['form'];
+
+  drupal_add_tabledrag('book-outline', 'match', 'parent', 'book-plid', 'book-plid', 'book-mlid', TRUE, MENU_MAX_DEPTH - 2);
+  drupal_add_tabledrag('book-outline', 'order', 'sibling', 'book-weight');
+
+  $header = array(t('Title'), t('Weight'), t('Parent'), array('data' => t('Operations'), 'colspan' => '3'));
+
+  $rows = array();
+  $destination = drupal_get_destination();
+  $access = user_access('administer nodes');
+  foreach (element_children($form) as $key) {
+    $nid = $form[$key]['nid']['#value'];
+    $href = $form[$key]['href']['#value'];
+
+    // Add special classes to be used with tabledrag.js.
+    $form[$key]['plid']['#attributes']['class'] = array('book-plid');
+    $form[$key]['mlid']['#attributes']['class'] = array('book-mlid');
+    $form[$key]['weight']['#attributes']['class'] = array('book-weight');
+
+    $data = array(
+      theme('indentation', array('size' => $form[$key]['depth']['#value'] - 2)) . drupal_render($form[$key]['title']),
+      drupal_render($form[$key]['weight']),
+      drupal_render($form[$key]['plid']) . drupal_render($form[$key]['mlid']),
+      l(t('view'), $href),
+      $access ? l(t('edit'), 'node/' . $nid . '/edit', array('query' => $destination)) : '&nbsp;',
+      $access ? l(t('delete'), 'node/' . $nid . '/delete', array('query' => $destination) )  : '&nbsp;',
+    );
+    $row = array('data' => $data);
+    if (isset($form[$key]['#attributes'])) {
+      $row = array_merge($row, $form[$key]['#attributes']);
+    }
+    $row['class'][] = 'draggable';
+    $rows[] = $row;
+  }
+
+  return theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'book-outline'), 'empty' => t('No book content available.')));
+}
diff --git a/htmltest/modules/book/book.css b/htmltest/modules/book/book.css
new file mode 100644
index 00000000..00e379ee
--- /dev/null
+++ b/htmltest/modules/book/book.css
@@ -0,0 +1,58 @@
+ /**
+  * @file
+  * Styling for the Book module.
+  */
+
+.book-navigation .menu {
+  border-top: 1px solid #888;
+  padding: 1em 0 0 3em; /* LTR */
+}
+.book-navigation .page-links {
+  border-top: 1px solid #888;
+  border-bottom: 1px solid #888;
+  text-align: center;
+  padding: 0.5em;
+}
+.book-navigation .page-previous {
+  text-align: left;
+  width: 42%;
+  display: block;
+  float: left; /* LTR */
+}
+.book-navigation .page-up {
+  margin: 0 5%;
+  width: 4%;
+  display: block;
+  float: left; /* LTR */
+}
+.book-navigation .page-next {
+  text-align: right;
+  width: 42%;
+  display: block;
+  float: right;
+}
+#book-outline {
+  min-width: 56em;
+}
+.book-outline-form .form-item {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+html.js #edit-book-pick-book {
+  display: none;
+}
+.form-item-book-bid .description {
+  clear: both;
+}
+#book-admin-edit select {
+  margin-right: 24px;
+}
+#book-admin-edit select.progress-disabled {
+  margin-right: 0;
+}
+#book-admin-edit tr.ajax-new-content {
+  background-color: #ffd;
+}
+#book-admin-edit .form-item {
+  float: left;
+}
diff --git a/htmltest/modules/book/book.info b/htmltest/modules/book/book.info
new file mode 100644
index 00000000..f0036700
--- /dev/null
+++ b/htmltest/modules/book/book.info
@@ -0,0 +1,14 @@
+name = Book
+description = Allows users to create and organize related content in an outline.
+package = Core
+version = VERSION
+core = 7.x
+files[] = book.test
+configure = admin/content/book/settings
+stylesheets[all][] = book.css
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/book/book.install b/htmltest/modules/book/book.install
new file mode 100644
index 00000000..899ee814
--- /dev/null
+++ b/htmltest/modules/book/book.install
@@ -0,0 +1,95 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the book module.
+ */
+
+/**
+ * Implements hook_install().
+ */
+function book_install() {
+  // Add the node type.
+  _book_install_type_create();
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function book_uninstall() {
+  variable_del('book_allowed_types');
+  variable_del('book_child_type');
+  variable_del('book_block_mode');
+
+  // Delete menu links.
+  db_delete('menu_links')
+    ->condition('module', 'book')
+    ->execute();
+  menu_cache_clear_all();
+}
+
+/**
+ * Creates the book content type.
+ */
+function _book_install_type_create() {
+  // Create an additional node type.
+  $book_node_type = array(
+    'type' => 'book',
+    'name' => t('Book page'),
+    'base' => 'node_content',
+    'description' => t('<em>Books</em> have a built-in hierarchical navigation. Use for handbooks or tutorials.'),
+    'custom' => 1,
+    'modified' => 1,
+    'locked' => 0,
+  );
+
+  $book_node_type = node_type_set_defaults($book_node_type);
+  node_type_save($book_node_type);
+  node_add_body_field($book_node_type);
+  // Default to not promoted.
+  variable_set('node_options_book', array('status'));
+  // Use this default type for adding content to books.
+  variable_set('book_allowed_types', array('book'));
+  variable_set('book_child_type', 'book');
+}
+
+/**
+ * Implements hook_schema().
+ */
+function book_schema() {
+  $schema['book'] = array(
+  'description' => 'Stores book outline information. Uniquely connects each node in the outline to a link in {menu_links}',
+    'fields' => array(
+      'mlid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => "The book page's {menu_links}.mlid.",
+      ),
+      'nid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => "The book page's {node}.nid.",
+      ),
+      'bid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => "The book ID is the {book}.nid of the top-level page.",
+      ),
+    ),
+    'primary key' => array('mlid'),
+    'unique keys' => array(
+      'nid' => array('nid'),
+    ),
+    'indexes' => array(
+      'bid' => array('bid'),
+    ),
+  );
+
+  return $schema;
+}
diff --git a/htmltest/modules/book/book.js b/htmltest/modules/book/book.js
new file mode 100644
index 00000000..64f4aee6
--- /dev/null
+++ b/htmltest/modules/book/book.js
@@ -0,0 +1,27 @@
+/**
+ * @file
+ * Javascript behaviors for the Book module.
+ */
+
+(function ($) {
+
+Drupal.behaviors.bookFieldsetSummaries = {
+  attach: function (context) {
+    $('fieldset.book-outline-form', context).drupalSetSummary(function (context) {
+      var $select = $('.form-item-book-bid select');
+      var val = $select.val();
+
+      if (val === '0') {
+        return Drupal.t('Not in book');
+      }
+      else if (val === 'new') {
+        return Drupal.t('New book');
+      }
+      else {
+        return Drupal.checkPlain($select.find(':selected').text());
+      }
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/book/book.module b/htmltest/modules/book/book.module
new file mode 100644
index 00000000..7afed9ae
--- /dev/null
+++ b/htmltest/modules/book/book.module
@@ -0,0 +1,1437 @@
+<?php
+
+/**
+ * @file
+ * Allows users to create and organize related content in an outline.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function book_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#book':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Book module is used for creating structured, multi-page content, such as site resource guides, manuals, and wikis. It allows you to create content that has chapters, sections, subsections, or any similarly-tiered structure. For more information, see the online handbook entry for <a href="@book">Book module</a>.', array('@book' => 'http://drupal.org/documentation/modules/book/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Adding and managing book content') . '</dt>';
+      $output .= '<dd>' . t('You can assign separate permissions for <em>creating</em>, <em>editing</em>, and <em>deleting</em> book content, as well as <em>adding content to books</em>, and <em>creating new books</em>. Users with the <em>Administer book outlines</em> permission can add <em>any</em> type of content to a book by selecting the appropriate book outline while editing the content. They can also view a list of all books, and edit and rearrange section titles on the <a href="@admin-book">Book administration page</a>.', array('@admin-book' => url('admin/content/book'))) . '</dd>';
+      $output .= '<dt>' . t('Book navigation') . '</dt>';
+      $output .= '<dd>' . t("Book pages have a default book-specific navigation block. This navigation block contains links that lead to the previous and next pages in the book, and to the level above the current page in the book's structure. This block can be enabled on the <a href='@admin-block'>Blocks administration page</a>. For book pages to show up in the book navigation, they must be added to a book outline.", array('@admin-block' => url('admin/structure/block'))) . '</dd>';
+      $output .= '<dt>' . t('Collaboration') . '</dt>';
+      $output .= '<dd>' . t('Books can be created collaboratively, as they allow users with appropriate permissions to add pages into existing books, and add those pages to a custom table of contents menu.') . '</dd>';
+      $output .= '<dt>' . t('Printing books') . '</dt>';
+      $output .= '<dd>' . t("Users with the <em>View printer-friendly books</em> permission can select the <em>printer-friendly version</em> link visible at the bottom of a book page's content to generate a printer-friendly display of the page and all of its subsections.") . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'admin/content/book':
+      return '<p>' . t('The book module offers a means to organize a collection of related content pages, collectively known as a book. When viewed, this content automatically displays links to adjacent book pages, providing a simple navigation system for creating and reviewing structured content.') . '</p>';
+    case 'node/%/outline':
+      return '<p>' . t('The outline feature allows you to include pages in the <a href="@book">Book hierarchy</a>, as well as move them within the hierarchy or to <a href="@book-admin">reorder an entire book</a>.', array('@book' => url('book'), '@book-admin' => url('admin/content/book'))) . '</p>';
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function book_theme() {
+  return array(
+    'book_navigation' => array(
+      'variables' => array('book_link' => NULL),
+      'template' => 'book-navigation',
+    ),
+    'book_export_html' => array(
+      'variables' => array('title' => NULL, 'contents' => NULL, 'depth' => NULL),
+      'template' => 'book-export-html',
+    ),
+    'book_admin_table' => array(
+      'render element' => 'form',
+    ),
+    'book_title_link' => array(
+      'variables' => array('link' => NULL),
+    ),
+    'book_all_books_block' => array(
+      'render element' => 'book_menus',
+      'template' => 'book-all-books-block',
+    ),
+    'book_node_export_html' => array(
+      'variables' => array('node' => NULL, 'children' => NULL),
+      'template' => 'book-node-export-html',
+    ),
+  );
+}
+
+/**
+ * Implements hook_permission().
+ */
+function book_permission() {
+  return array(
+    'administer book outlines' => array(
+      'title' => t('Administer book outlines'),
+    ),
+    'create new books' => array(
+      'title' => t('Create new books'),
+    ),
+    'add content to books' => array(
+      'title' => t('Add content and child pages to books'),
+    ),
+    'access printer-friendly version' => array(
+      'title' => t('View printer-friendly books'),
+      'description' => t('View a book page and all of its sub-pages as a single document for ease of printing. Can be performance heavy.'),
+    ),
+  );
+}
+
+/**
+ * Adds relevant book links to the node's links.
+ *
+ * @param $node
+ *   The book page node to add links to.
+ * @param $view_mode
+ *   The view mode of the node.
+ */
+function book_node_view_link($node, $view_mode) {
+  $links = array();
+
+  if (isset($node->book['depth'])) {
+    if ($view_mode == 'full' && node_is_page($node)) {
+      $child_type = variable_get('book_child_type', 'book');
+      if ((user_access('add content to books') || user_access('administer book outlines')) && node_access('create', $child_type) && $node->status == 1 && $node->book['depth'] < MENU_MAX_DEPTH) {
+        $links['book_add_child'] = array(
+          'title' => t('Add child page'),
+          'href' => 'node/add/' . str_replace('_', '-', $child_type),
+          'query' => array('parent' => $node->book['mlid']),
+        );
+      }
+
+      if (user_access('access printer-friendly version')) {
+        $links['book_printer'] = array(
+          'title' => t('Printer-friendly version'),
+          'href' => 'book/export/html/' . $node->nid,
+          'attributes' => array('title' => t('Show a printer-friendly version of this book page and its sub-pages.'))
+        );
+      }
+    }
+  }
+
+  if (!empty($links)) {
+    $node->content['links']['book'] = array(
+      '#theme' => 'links__node__book',
+      '#links' => $links,
+      '#attributes' => array('class' => array('links', 'inline')),
+    );
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function book_menu() {
+  $items['admin/content/book'] = array(
+    'title' => 'Books',
+    'description' => "Manage your site's book outlines.",
+    'page callback' => 'book_admin_overview',
+    'access arguments' => array('administer book outlines'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'book.admin.inc',
+  );
+  $items['admin/content/book/list'] = array(
+    'title' => 'List',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $items['admin/content/book/settings'] = array(
+    'title' => 'Settings',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('book_admin_settings'),
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 8,
+    'file' => 'book.admin.inc',
+  );
+  $items['admin/content/book/%node'] = array(
+    'title' => 'Re-order book pages and change titles',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('book_admin_edit', 3),
+    'access callback' => '_book_outline_access',
+    'access arguments' => array(3),
+    'type' => MENU_CALLBACK,
+    'file' => 'book.admin.inc',
+  );
+  $items['book'] = array(
+    'title' => 'Books',
+    'page callback' => 'book_render',
+    'access arguments' => array('access content'),
+    'type' => MENU_SUGGESTED_ITEM,
+    'file' => 'book.pages.inc',
+  );
+  $items['book/export/%/%'] = array(
+    'page callback' => 'book_export',
+    'page arguments' => array(2, 3),
+    'access arguments' => array('access printer-friendly version'),
+    'type' => MENU_CALLBACK,
+    'file' => 'book.pages.inc',
+  );
+  $items['node/%node/outline'] = array(
+    'title' => 'Outline',
+    'page callback' => 'book_outline',
+    'page arguments' => array(1),
+    'access callback' => '_book_outline_access',
+    'access arguments' => array(1),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 2,
+    'file' => 'book.pages.inc',
+  );
+  $items['node/%node/outline/remove'] = array(
+    'title' => 'Remove from outline',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('book_remove_form', 1),
+    'access callback' => '_book_outline_remove_access',
+    'access arguments' => array(1),
+    'file' => 'book.pages.inc',
+  );
+
+  return $items;
+}
+
+/**
+ * Access callback: Determines if the outline tab is accessible.
+ *
+ * @param $node
+ *   The node whose outline tab is to be viewed.
+ */
+function _book_outline_access($node) {
+  return user_access('administer book outlines') && node_access('view', $node);
+}
+
+/**
+ * Access callback: Determines if the user can remove nodes from the outline.
+ *
+ * @param $node
+ *   The node to remove from the outline.
+ *
+ * @see book_menu()
+ */
+function _book_outline_remove_access($node) {
+  return _book_node_is_removable($node) && _book_outline_access($node);
+}
+
+/**
+ * Determines if a node can be removed from the book.
+ *
+ * A node can be removed from a book if it is actually in a book and it either
+ * is not a top-level page or is a top-level page with no children.
+ *
+ * @param $node
+ *   The node to remove from the outline.
+ */
+function _book_node_is_removable($node) {
+  return (!empty($node->book['bid']) && (($node->book['bid'] != $node->nid) || !$node->book['has_children']));
+}
+
+/**
+ * Implements hook_admin_paths().
+ */
+function book_admin_paths() {
+  if (variable_get('node_admin_theme')) {
+    $paths = array(
+      'node/*/outline' => TRUE,
+      'node/*/outline/remove' => TRUE,
+    );
+    return $paths;
+  }
+}
+
+/**
+ * Implements hook_entity_info_alter().
+ */
+function book_entity_info_alter(&$info) {
+  // Add the 'Print' view mode for nodes.
+  $info['node']['view modes'] += array(
+    'print' => array(
+      'label' => t('Print'),
+      'custom settings' => FALSE,
+    ),
+  );
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function book_block_info() {
+  $block = array();
+  $block['navigation']['info'] = t('Book navigation');
+  $block['navigation']['cache'] = DRUPAL_CACHE_PER_PAGE | DRUPAL_CACHE_PER_ROLE;
+
+  return $block;
+}
+
+/**
+ * Implements hook_block_view().
+ *
+ * Displays the book table of contents in a block when the current page is a
+ * single-node view of a book node.
+ */
+function book_block_view($delta = '') {
+  $block = array();
+  $current_bid = 0;
+  if ($node = menu_get_object()) {
+    $current_bid = empty($node->book['bid']) ? 0 : $node->book['bid'];
+  }
+
+  if (variable_get('book_block_mode', 'all pages') == 'all pages') {
+    $block['subject'] = t('Book navigation');
+    $book_menus = array();
+    $pseudo_tree = array(0 => array('below' => FALSE));
+    foreach (book_get_books() as $book_id => $book) {
+      if ($book['bid'] == $current_bid) {
+        // If the current page is a node associated with a book, the menu
+        // needs to be retrieved.
+        $book_menus[$book_id] = menu_tree_output(menu_tree_all_data($node->book['menu_name'], $node->book));
+      }
+      else {
+        // Since we know we will only display a link to the top node, there
+        // is no reason to run an additional menu tree query for each book.
+        $book['in_active_trail'] = FALSE;
+        // Check whether user can access the book link.
+        $book_node = node_load($book['nid']);
+        $book['access'] = node_access('view', $book_node);
+        $pseudo_tree[0]['link'] = $book;
+        $book_menus[$book_id] = menu_tree_output($pseudo_tree);
+      }
+    }
+    $book_menus['#theme'] = 'book_all_books_block';
+    $block['content'] = $book_menus;
+  }
+  elseif ($current_bid) {
+    // Only display this block when the user is browsing a book.
+  $select = db_select('node', 'n')
+    ->fields('n', array('title'))
+    ->condition('n.nid', $node->book['bid'])
+    ->addTag('node_access');
+    $title = $select->execute()->fetchField();
+    // Only show the block if the user has view access for the top-level node.
+    if ($title) {
+      $tree = menu_tree_all_data($node->book['menu_name'], $node->book);
+      // There should only be one element at the top level.
+      $data = array_shift($tree);
+      $block['subject'] = theme('book_title_link', array('link' => $data['link']));
+      $block['content'] = ($data['below']) ? menu_tree_output($data['below']) : '';
+    }
+  }
+
+  return $block;
+}
+
+/**
+ * Implements hook_block_configure().
+ */
+function book_block_configure($delta = '') {
+  $block = array();
+  $options = array(
+    'all pages' => t('Show block on all pages'),
+    'book pages' => t('Show block only on book pages'),
+  );
+  $form['book_block_mode'] = array(
+    '#type' => 'radios',
+    '#title' => t('Book navigation block display'),
+    '#options' => $options,
+    '#default_value' => variable_get('book_block_mode', 'all pages'),
+    '#description' => t("If <em>Show block on all pages</em> is selected, the block will contain the automatically generated menus for all of the site's books. If <em>Show block only on book pages</em> is selected, the block will contain only the one menu corresponding to the current page's book. In this case, if the current page is not in a book, no block will be displayed. The <em>Page specific visibility settings</em> or other visibility settings can be used in addition to selectively display this block."),
+    );
+
+  return $form;
+}
+
+/**
+ * Implements hook_block_save().
+ */
+function book_block_save($delta = '', $edit = array()) {
+  $block = array();
+  variable_set('book_block_mode', $edit['book_block_mode']);
+}
+
+/**
+ * Returns HTML for a link to a book title when used as a block title.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - link: An array containing title, href and options for the link.
+ *
+ * @ingroup themeable
+ */
+function theme_book_title_link($variables) {
+  $link = $variables['link'];
+
+  $link['options']['attributes']['class'] = array('book-title');
+
+  return l($link['title'], $link['href'], $link['options']);
+}
+
+/**
+ * Returns an array of all books.
+ *
+ * This list may be used for generating a list of all the books, or for building
+ * the options for a form select.
+ *
+ * @return
+ *   An array of all books.
+ */
+function book_get_books() {
+  $all_books = &drupal_static(__FUNCTION__);
+
+  if (!isset($all_books)) {
+    $all_books = array();
+    $nids = db_query("SELECT DISTINCT(bid) FROM {book}")->fetchCol();
+
+    if ($nids) {
+      $query = db_select('book', 'b', array('fetch' => PDO::FETCH_ASSOC));
+      $query->join('node', 'n', 'b.nid = n.nid');
+      $query->join('menu_links', 'ml', 'b.mlid = ml.mlid');
+      $query->addField('n', 'type', 'type');
+      $query->addField('n', 'title', 'title');
+      $query->fields('b');
+      $query->fields('ml');
+      $query->condition('n.nid', $nids, 'IN');
+      $query->condition('n.status', 1);
+      $query->orderBy('ml.weight');
+      $query->orderBy('ml.link_title');
+      $query->addTag('node_access');
+      $result2 = $query->execute();
+      foreach ($result2 as $link) {
+        $link['href'] = $link['link_path'];
+        $link['options'] = unserialize($link['options']);
+        $all_books[$link['bid']] = $link;
+      }
+    }
+  }
+
+  return $all_books;
+}
+
+/**
+ * Implements hook_form_BASE_FORM_ID_alter() for node_form().
+ *
+ * Adds the book fieldset to the node form.
+ *
+ * @see book_pick_book_nojs_submit()
+ */
+function book_form_node_form_alter(&$form, &$form_state, $form_id) {
+  $node = $form['#node'];
+  $access = user_access('administer book outlines');
+  if (!$access) {
+    if (user_access('add content to books') && ((!empty($node->book['mlid']) && !empty($node->nid)) || book_type_is_allowed($node->type))) {
+      // Already in the book hierarchy, or this node type is allowed.
+      $access = TRUE;
+    }
+  }
+
+  if ($access) {
+    _book_add_form_elements($form, $form_state, $node);
+    // Since the "Book" dropdown can't trigger a form submission when
+    // JavaScript is disabled, add a submit button to do that. book.css hides
+    // this button when JavaScript is enabled.
+    $form['book']['pick-book'] = array(
+      '#type' => 'submit',
+      '#value' => t('Change book (update list of parents)'),
+      '#submit' => array('book_pick_book_nojs_submit'),
+      '#weight' => 20,
+    );
+  }
+}
+
+/**
+ * Form submission handler for node_form().
+ *
+ * This handler is run when JavaScript is disabled. It triggers the form to
+ * rebuild so that the "Parent item" options are changed to reflect the newly
+ * selected book. When JavaScript is enabled, the submit button that triggers
+ * this handler is hidden, and the "Book" dropdown directly triggers the
+ * book_form_update() Ajax callback instead.
+ *
+ * @see book_form_update()
+ * @see book_form_node_form_alter()
+ */
+function book_pick_book_nojs_submit($form, &$form_state) {
+  $form_state['node']->book = $form_state['values']['book'];
+  $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * Builds the parent selection form element for the node form or outline tab.
+ *
+ * This function is also called when generating a new set of options during the
+ * Ajax callback, so an array is returned that can be used to replace an
+ * existing form element.
+ *
+ * @param $book_link
+ *   A fully loaded menu link that is part of the book hierarchy.
+ *
+ * @return
+ *   A parent selection form element.
+ */
+function _book_parent_select($book_link) {
+  if (variable_get('menu_override_parent_selector', FALSE)) {
+    return array();
+  }
+  // Offer a message or a drop-down to choose a different parent page.
+  $form = array(
+    '#type' => 'hidden',
+    '#value' => -1,
+    '#prefix' => '<div id="edit-book-plid-wrapper">',
+    '#suffix' => '</div>',
+  );
+
+  if ($book_link['nid'] === $book_link['bid']) {
+    // This is a book - at the top level.
+    if ($book_link['original_bid'] === $book_link['bid']) {
+      $form['#prefix'] .= '<em>' . t('This is the top-level page in this book.') . '</em>';
+    }
+    else {
+      $form['#prefix'] .= '<em>' . t('This will be the top-level page in this book.') . '</em>';
+    }
+  }
+  elseif (!$book_link['bid']) {
+    $form['#prefix'] .= '<em>' . t('No book selected.') . '</em>';
+  }
+  else {
+    $form = array(
+      '#type' => 'select',
+      '#title' => t('Parent item'),
+      '#default_value' => $book_link['plid'],
+      '#description' => t('The parent page in the book. The maximum depth for a book and all child pages is !maxdepth. Some pages in the selected book may not be available as parents if selecting them would exceed this limit.', array('!maxdepth' => MENU_MAX_DEPTH)),
+      '#options' => book_toc($book_link['bid'], $book_link['parent_depth_limit'], array($book_link['mlid'])),
+      '#attributes' => array('class' => array('book-title-select')),
+      '#prefix' => '<div id="edit-book-plid-wrapper">',
+      '#suffix' => '</div>',
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Builds the common elements of the book form for the node and outline forms.
+ *
+ * @param $node
+ *   The node whose form is being viewed.
+ */
+function _book_add_form_elements(&$form, &$form_state, $node) {
+  // If the form is being processed during the Ajax callback of our book bid
+  // dropdown, then $form_state will hold the value that was selected.
+  if (isset($form_state['values']['book'])) {
+    $node->book = $form_state['values']['book'];
+  }
+
+  $form['book'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Book outline'),
+    '#weight' => 10,
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#group' => 'additional_settings',
+    '#attributes' => array(
+      'class' => array('book-outline-form'),
+    ),
+    '#attached' => array(
+      'js' => array(drupal_get_path('module', 'book') . '/book.js'),
+    ),
+    '#tree' => TRUE,
+  );
+  foreach (array('menu_name', 'mlid', 'nid', 'router_path', 'has_children', 'options', 'module', 'original_bid', 'parent_depth_limit') as $key) {
+    $form['book'][$key] = array(
+      '#type' => 'value',
+      '#value' => $node->book[$key],
+    );
+  }
+
+  $form['book']['plid'] = _book_parent_select($node->book);
+
+  // @see _book_admin_table_tree(). The weight may be larger than 15.
+  $form['book']['weight'] = array(
+    '#type' => 'weight',
+    '#title' => t('Weight'),
+    '#default_value' => $node->book['weight'],
+    '#delta' => max(15, abs($node->book['weight'])),
+    '#weight' => 5,
+    '#description' => t('Pages at a given level are ordered first by weight and then by title.'),
+  );
+  $options = array();
+  $nid = isset($node->nid) ? $node->nid : 'new';
+
+  if (isset($node->nid) && ($nid == $node->book['original_bid']) && ($node->book['parent_depth_limit'] == 0)) {
+    // This is the top level node in a maximum depth book and thus cannot be moved.
+    $options[$node->nid] = $node->title;
+  }
+  else {
+    foreach (book_get_books() as $book) {
+      $options[$book['nid']] = $book['title'];
+    }
+  }
+
+  if (user_access('create new books') && ($nid == 'new' || ($nid != $node->book['original_bid']))) {
+    // The node can become a new book, if it is not one already.
+    $options = array($nid => '<' . t('create a new book') . '>') + $options;
+  }
+  if (!$node->book['mlid']) {
+    // The node is not currently in the hierarchy.
+    $options = array(0 => '<' . t('none') . '>') + $options;
+  }
+
+  // Add a drop-down to select the destination book.
+  $form['book']['bid'] = array(
+    '#type' => 'select',
+    '#title' => t('Book'),
+    '#default_value' => $node->book['bid'],
+    '#options' => $options,
+    '#access' => (bool) $options,
+    '#description' => t('Your page will be a part of the selected book.'),
+    '#weight' => -5,
+    '#attributes' => array('class' => array('book-title-select')),
+    '#ajax' => array(
+      'callback' => 'book_form_update',
+      'wrapper' => 'edit-book-plid-wrapper',
+      'effect' => 'fade',
+      'speed' => 'fast',
+    ),
+  );
+}
+
+/**
+ * Renders a new parent page select element when the book selection changes.
+ *
+ * This function is called via Ajax when the selected book is changed on a node
+ * or book outline form.
+ *
+ * @return
+ *   The rendered parent page select element.
+ */
+function book_form_update($form, $form_state) {
+  return $form['book']['plid'];
+}
+
+/**
+ * Handles additions and updates to the book outline.
+ *
+ * This common helper function performs all additions and updates to the book
+ * outline through node addition, node editing, node deletion, or the outline
+ * tab.
+ *
+ * @param $node
+ *   The node that is being saved, added, deleted, or moved.
+ *
+ * @return
+ *   TRUE if the menu link was saved; FALSE otherwise.
+ */
+function _book_update_outline($node) {
+  if (empty($node->book['bid'])) {
+    return FALSE;
+  }
+  $new = empty($node->book['mlid']);
+
+  $node->book['link_path'] = 'node/' . $node->nid;
+  $node->book['link_title'] = $node->title;
+  $node->book['parent_mismatch'] = FALSE; // The normal case.
+
+  if ($node->book['bid'] == $node->nid) {
+    $node->book['plid'] = 0;
+    $node->book['menu_name'] = book_menu_name($node->nid);
+  }
+  else {
+    // Check in case the parent is not is this book; the book takes precedence.
+    if (!empty($node->book['plid'])) {
+      $parent = db_query("SELECT * FROM {book} WHERE mlid = :mlid", array(
+        ':mlid' => $node->book['plid'],
+      ))->fetchAssoc();
+    }
+    if (empty($node->book['plid']) || !$parent || $parent['bid'] != $node->book['bid']) {
+      $node->book['plid'] = db_query("SELECT mlid FROM {book} WHERE nid = :nid", array(
+        ':nid' => $node->book['bid'],
+      ))->fetchField();
+      $node->book['parent_mismatch'] = TRUE; // Likely when JS is disabled.
+    }
+  }
+
+  if (menu_link_save($node->book)) {
+    if ($new) {
+      // Insert new.
+      db_insert('book')
+        ->fields(array(
+          'nid' => $node->nid,
+          'mlid' => $node->book['mlid'],
+          'bid' => $node->book['bid'],
+        ))
+        ->execute();
+      // Reset the cache of stored books.
+      drupal_static_reset('book_get_books');
+    }
+    else {
+      if ($node->book['bid'] != db_query("SELECT bid FROM {book} WHERE nid = :nid", array(
+          ':nid' => $node->nid,
+        ))->fetchField()) {
+        // Update the bid for this page and all children.
+        book_update_bid($node->book);
+        // Reset the cache of stored books.
+        drupal_static_reset('book_get_books');
+      }
+    }
+
+    return TRUE;
+  }
+
+  // Failed to save the menu link.
+  return FALSE;
+}
+
+/**
+ * Updates the book ID of a page and its children when it moves to a new book.
+ *
+ * @param $book_link
+ *   A fully loaded menu link that is part of the book hierarchy.
+ */
+function book_update_bid($book_link) {
+  $query = db_select('menu_links');
+  $query->addField('menu_links', 'mlid');
+  for ($i = 1; $i <= MENU_MAX_DEPTH && $book_link["p$i"]; $i++) {
+    $query->condition("p$i", $book_link["p$i"]);
+  }
+  $mlids = $query->execute()->fetchCol();
+
+  if ($mlids) {
+    db_update('book')
+      ->fields(array('bid' => $book_link['bid']))
+      ->condition('mlid', $mlids, 'IN')
+      ->execute();
+  }
+}
+
+/**
+ * Gets the book menu tree for a page and returns it as a linear array.
+ *
+ * @param $book_link
+ *   A fully loaded menu link that is part of the book hierarchy.
+ *
+ * @return
+ *   A linear array of menu links in the order that the links are shown in the
+ *   menu, so the previous and next pages are the elements before and after the
+ *   element corresponding to the current node. The children of the current node
+ *   (if any) will come immediately after it in the array, and links will only
+ *   be fetched as deep as one level deeper than $book_link.
+ */
+function book_get_flat_menu($book_link) {
+  $flat = &drupal_static(__FUNCTION__, array());
+
+  if (!isset($flat[$book_link['mlid']])) {
+    // Call menu_tree_all_data() to take advantage of the menu system's caching.
+    $tree = menu_tree_all_data($book_link['menu_name'], $book_link, $book_link['depth'] + 1);
+    $flat[$book_link['mlid']] = array();
+    _book_flatten_menu($tree, $flat[$book_link['mlid']]);
+  }
+
+  return $flat[$book_link['mlid']];
+}
+
+/**
+ * Recursively converts a tree of menu links to a flat array.
+ *
+ * @param $tree
+ *   A tree of menu links in an array.
+ * @param $flat
+ *   A flat array of the menu links from $tree, passed by reference.
+ *
+ * @see book_get_flat_menu().
+ */
+function _book_flatten_menu($tree, &$flat) {
+  foreach ($tree as $data) {
+    if (!$data['link']['hidden']) {
+      $flat[$data['link']['mlid']] = $data['link'];
+      if ($data['below']) {
+        _book_flatten_menu($data['below'], $flat);
+      }
+    }
+  }
+}
+
+/**
+ * Fetches the menu link for the previous page of the book.
+ *
+ * @param $book_link
+ *   A fully loaded menu link that is part of the book hierarchy.
+ *
+ * @return
+ *   A fully loaded menu link for the page before the one represented in
+ *   $book_link.
+ */
+function book_prev($book_link) {
+  // If the parent is zero, we are at the start of a book.
+  if ($book_link['plid'] == 0) {
+    return NULL;
+  }
+  $flat = book_get_flat_menu($book_link);
+  // Assigning the array to $flat resets the array pointer for use with each().
+  $curr = NULL;
+  do {
+    $prev = $curr;
+    list($key, $curr) = each($flat);
+  } while ($key && $key != $book_link['mlid']);
+
+  if ($key == $book_link['mlid']) {
+    // The previous page in the book may be a child of the previous visible link.
+    if ($prev['depth'] == $book_link['depth'] && $prev['has_children']) {
+      // The subtree will have only one link at the top level - get its data.
+      $tree = book_menu_subtree_data($prev);
+      $data = array_shift($tree);
+      // The link of interest is the last child - iterate to find the deepest one.
+      while ($data['below']) {
+        $data = end($data['below']);
+      }
+
+      return $data['link'];
+    }
+    else {
+      return $prev;
+    }
+  }
+}
+
+/**
+ * Fetches the menu link for the next page of the book.
+ *
+ * @param $book_link
+ *   A fully loaded menu link that is part of the book hierarchy.
+ *
+ * @return
+ *   A fully loaded menu link for the page after the one represented in
+ *   $book_link.
+ */
+function book_next($book_link) {
+  $flat = book_get_flat_menu($book_link);
+  // Assigning the array to $flat resets the array pointer for use with each().
+  do {
+    list($key, $curr) = each($flat);
+  }
+  while ($key && $key != $book_link['mlid']);
+
+  if ($key == $book_link['mlid']) {
+    return current($flat);
+  }
+}
+
+/**
+ * Formats the menu links for the child pages of the current page.
+ *
+ * @param $book_link
+ *   A fully loaded menu link that is part of the book hierarchy.
+ *
+ * @return
+ *   HTML for the links to the child pages of the current page.
+ */
+function book_children($book_link) {
+  $flat = book_get_flat_menu($book_link);
+
+  $children = array();
+
+  if ($book_link['has_children']) {
+    // Walk through the array until we find the current page.
+    do {
+      $link = array_shift($flat);
+    }
+    while ($link && ($link['mlid'] != $book_link['mlid']));
+    // Continue though the array and collect the links whose parent is this page.
+    while (($link = array_shift($flat)) && $link['plid'] == $book_link['mlid']) {
+      $data['link'] = $link;
+      $data['below'] = '';
+      $children[] = $data;
+    }
+  }
+
+  if ($children) {
+    $elements = menu_tree_output($children);
+    return drupal_render($elements);
+  }
+  return '';
+}
+
+/**
+ * Generates the corresponding menu name from a book ID.
+ *
+ * @param $bid
+ *   The book ID for which to make a menu name.
+ *
+ * @return
+ *   The menu name.
+ */
+function book_menu_name($bid) {
+  return 'book-toc-' . $bid;
+}
+
+/**
+ * Implements hook_node_load().
+ */
+function book_node_load($nodes, $types) {
+  $result = db_query("SELECT * FROM {book} b INNER JOIN {menu_links} ml ON b.mlid = ml.mlid WHERE b.nid IN (:nids)", array(':nids' =>  array_keys($nodes)), array('fetch' => PDO::FETCH_ASSOC));
+  foreach ($result as $record) {
+    $nodes[$record['nid']]->book = $record;
+    $nodes[$record['nid']]->book['href'] = $record['link_path'];
+    $nodes[$record['nid']]->book['title'] = $record['link_title'];
+    $nodes[$record['nid']]->book['options'] = unserialize($record['options']);
+  }
+}
+
+/**
+ * Implements hook_node_view().
+ */
+function book_node_view($node, $view_mode) {
+  if ($view_mode == 'full') {
+    if (!empty($node->book['bid']) && empty($node->in_preview)) {
+      $node->content['book_navigation'] = array(
+        '#markup' => theme('book_navigation', array('book_link' => $node->book)),
+        '#weight' => 100,
+      );
+    }
+  }
+
+  if ($view_mode != 'rss') {
+    book_node_view_link($node, $view_mode);
+  }
+}
+
+/**
+ * Implements hook_page_alter().
+ *
+ * Adds the book menu to the list of menus used to build the active trail when
+ * viewing a book page.
+ */
+function book_page_alter(&$page) {
+  if (($node = menu_get_object()) && !empty($node->book['bid'])) {
+    $active_menus = menu_get_active_menu_names();
+    $active_menus[] = $node->book['menu_name'];
+    menu_set_active_menu_names($active_menus);
+  }
+}
+
+/**
+ * Implements hook_node_presave().
+ */
+function book_node_presave($node) {
+  // Always save a revision for non-administrators.
+  if (!empty($node->book['bid']) && !user_access('administer nodes')) {
+    $node->revision = 1;
+    // The database schema requires a log message for every revision.
+    if (!isset($node->log)) {
+      $node->log = '';
+    }
+  }
+  // Make sure a new node gets a new menu link.
+  if (empty($node->nid)) {
+    $node->book['mlid'] = NULL;
+  }
+}
+
+/**
+ * Implements hook_node_insert().
+ */
+function book_node_insert($node) {
+  if (!empty($node->book['bid'])) {
+    if ($node->book['bid'] == 'new') {
+      // New nodes that are their own book.
+      $node->book['bid'] = $node->nid;
+    }
+    $node->book['nid'] = $node->nid;
+    $node->book['menu_name'] = book_menu_name($node->book['bid']);
+    _book_update_outline($node);
+  }
+}
+
+/**
+ * Implements hook_node_update().
+ */
+function book_node_update($node) {
+  if (!empty($node->book['bid'])) {
+    if ($node->book['bid'] == 'new') {
+      // New nodes that are their own book.
+      $node->book['bid'] = $node->nid;
+    }
+    $node->book['nid'] = $node->nid;
+    $node->book['menu_name'] = book_menu_name($node->book['bid']);
+    _book_update_outline($node);
+  }
+}
+
+/**
+ * Implements hook_node_delete().
+ */
+function book_node_delete($node) {
+  if (!empty($node->book['bid'])) {
+    if ($node->nid == $node->book['bid']) {
+      // Handle deletion of a top-level post.
+      $result = db_query("SELECT b.nid FROM {menu_links} ml INNER JOIN {book} b on b.mlid = ml.mlid WHERE ml.plid = :plid", array(
+        ':plid' => $node->book['mlid']
+      ));
+      foreach ($result as $child) {
+        $child_node = node_load($child->nid);
+        $child_node->book['bid'] = $child_node->nid;
+        _book_update_outline($child_node);
+      }
+    }
+    menu_link_delete($node->book['mlid']);
+    db_delete('book')
+      ->condition('mlid', $node->book['mlid'])
+      ->execute();
+    drupal_static_reset('book_get_books');
+  }
+}
+
+/**
+ * Implements hook_node_prepare().
+ */
+function book_node_prepare($node) {
+  // Prepare defaults for the add/edit form.
+  if (empty($node->book) && (user_access('add content to books') || user_access('administer book outlines'))) {
+    $node->book = array();
+
+    if (empty($node->nid) && isset($_GET['parent']) && is_numeric($_GET['parent'])) {
+      // Handle "Add child page" links:
+      $parent = book_link_load($_GET['parent']);
+
+      if ($parent && $parent['access']) {
+        $node->book['bid'] = $parent['bid'];
+        $node->book['plid'] = $parent['mlid'];
+        $node->book['menu_name'] = $parent['menu_name'];
+      }
+    }
+    // Set defaults.
+    $node->book += _book_link_defaults(!empty($node->nid) ? $node->nid : 'new');
+  }
+  else {
+    if (isset($node->book['bid']) && !isset($node->book['original_bid'])) {
+      $node->book['original_bid'] = $node->book['bid'];
+    }
+  }
+  // Find the depth limit for the parent select.
+  if (isset($node->book['bid']) && !isset($node->book['parent_depth_limit'])) {
+    $node->book['parent_depth_limit'] = _book_parent_depth_limit($node->book);
+  }
+}
+
+/**
+ * Finds the depth limit for items in the parent select.
+ *
+ * @param $book_link
+ *   A fully loaded menu link that is part of the book hierarchy.
+ *
+ * @return
+ *   The depth limit for items in the parent select.
+ */
+function _book_parent_depth_limit($book_link) {
+  return MENU_MAX_DEPTH - 1 - (($book_link['mlid'] && $book_link['has_children']) ? menu_link_children_relative_depth($book_link) : 0);
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter() for node_delete_confirm().
+ *
+ * Alters the confirm form for a single node deletion.
+ *
+ * @see node_delete_confirm()
+ */
+function book_form_node_delete_confirm_alter(&$form, $form_state) {
+  $node = node_load($form['nid']['#value']);
+
+  if (isset($node->book) && $node->book['has_children']) {
+    $form['book_warning'] = array(
+      '#markup' => '<p>' . t('%title is part of a book outline, and has associated child pages. If you proceed with deletion, the child pages will be relocated automatically.', array('%title' => $node->title)) . '</p>',
+      '#weight' => -10,
+    );
+  }
+}
+
+/**
+ * Returns an array with default values for a book page's menu link.
+ *
+ * @param $nid
+ *   The ID of the node whose menu link is being created.
+ *
+ * @return
+ *   The default values for the menu link.
+ */
+function _book_link_defaults($nid) {
+  return array('original_bid' => 0, 'menu_name' => '', 'nid' => $nid, 'bid' => 0, 'router_path' => 'node/%', 'plid' => 0, 'mlid' => 0, 'has_children' => 0, 'weight' => 0, 'module' => 'book', 'options' => array());
+}
+
+/**
+ * Processes variables for book-all-books-block.tpl.php.
+ *
+ * All non-renderable elements are removed so that the template has full access
+ * to the structured data but can also simply iterate over all elements and
+ * render them (as in the default template).
+ *
+ * @param $variables
+ *   An associative array containing the following key:
+ *   - book_menus
+ *
+ * @see book-all-books-block.tpl.php
+ */
+function template_preprocess_book_all_books_block(&$variables) {
+  // Remove all non-renderable elements.
+  $elements = $variables['book_menus'];
+  $variables['book_menus'] = array();
+  foreach (element_children($elements) as $index) {
+    $variables['book_menus'][$index] = $elements[$index];
+  }
+}
+
+/**
+ * Processes variables for book-navigation.tpl.php.
+ *
+ * @param $variables
+ *   An associative array containing the following key:
+ *   - book_link
+ *
+ * @see book-navigation.tpl.php
+ */
+function template_preprocess_book_navigation(&$variables) {
+  $book_link = $variables['book_link'];
+
+  // Provide extra variables for themers. Not needed by default.
+  $variables['book_id'] = $book_link['bid'];
+  $variables['book_title'] = check_plain($book_link['link_title']);
+  $variables['book_url'] = 'node/' . $book_link['bid'];
+  $variables['current_depth'] = $book_link['depth'];
+  $variables['tree'] = '';
+
+  if ($book_link['mlid']) {
+    $variables['tree'] = book_children($book_link);
+
+    if ($prev = book_prev($book_link)) {
+      $prev_href = url($prev['href']);
+      drupal_add_html_head_link(array('rel' => 'prev', 'href' => $prev_href));
+      $variables['prev_url'] = $prev_href;
+      $variables['prev_title'] = check_plain($prev['title']);
+    }
+
+    if ($book_link['plid'] && $parent = book_link_load($book_link['plid'])) {
+      $parent_href = url($parent['href']);
+      drupal_add_html_head_link(array('rel' => 'up', 'href' => $parent_href));
+      $variables['parent_url'] = $parent_href;
+      $variables['parent_title'] = check_plain($parent['title']);
+    }
+
+    if ($next = book_next($book_link)) {
+      $next_href = url($next['href']);
+      drupal_add_html_head_link(array('rel' => 'next', 'href' => $next_href));
+      $variables['next_url'] = $next_href;
+      $variables['next_title'] = check_plain($next['title']);
+    }
+  }
+
+  $variables['has_links'] = FALSE;
+  // Link variables to filter for values and set state of the flag variable.
+  $links = array('prev_url', 'prev_title', 'parent_url', 'parent_title', 'next_url', 'next_title');
+  foreach ($links as $link) {
+    if (isset($variables[$link])) {
+      // Flag when there is a value.
+      $variables['has_links'] = TRUE;
+    }
+    else {
+      // Set empty to prevent notices.
+      $variables[$link] = '';
+    }
+  }
+}
+
+/**
+ * Recursively processes and formats menu items for book_toc().
+ *
+ * This helper function recursively modifies the table of contents array for
+ * each item in the menu tree, ignoring items in the exclude array or at a depth
+ * greater than the limit. Truncates titles over thirty characters and appends
+ * an indentation string incremented by depth.
+ *
+ * @param $tree
+ *   The data structure of the book's menu tree. Includes hidden links.
+ * @param $indent
+ *   A string appended to each menu item title. Increments by '--' per depth
+ *   level.
+ * @param $toc
+ *   Reference to the table of contents array. This is modified in place, so the
+ *   function does not have a return value.
+ * @param $exclude
+ *   (optional) An array of menu link ID values. Any link whose menu link ID is
+ *   in this array will be excluded (along with its children). Defaults to an
+ *   empty array.
+ * @param $depth_limit
+ *   Any link deeper than this value will be excluded (along with its children).
+ */
+function _book_toc_recurse($tree, $indent, &$toc, $exclude, $depth_limit) {
+  foreach ($tree as $data) {
+    if ($data['link']['depth'] > $depth_limit) {
+      // Don't iterate through any links on this level.
+      break;
+    }
+
+    if (!in_array($data['link']['mlid'], $exclude)) {
+      $toc[$data['link']['mlid']] = $indent . ' ' . truncate_utf8($data['link']['title'], 30, TRUE, TRUE);
+      if ($data['below']) {
+        _book_toc_recurse($data['below'], $indent . '--', $toc, $exclude, $depth_limit);
+      }
+    }
+  }
+}
+
+/**
+ * Returns an array of book pages in table of contents order.
+ *
+ * @param $bid
+ *   The ID of the book whose pages are to be listed.
+ * @param $depth_limit
+ *   Any link deeper than this value will be excluded (along with its children).
+ * @param $exclude
+ *   Optional array of menu link ID values. Any link whose menu link ID is in
+ *   this array will be excluded (along with its children).
+ *
+ * @return
+ *   An array of (menu link ID, title) pairs for use as options for selecting a
+ *   book page.
+ */
+function book_toc($bid, $depth_limit, $exclude = array()) {
+  $tree = menu_tree_all_data(book_menu_name($bid));
+  $toc = array();
+  _book_toc_recurse($tree, '', $toc, $exclude, $depth_limit);
+
+  return $toc;
+}
+
+/**
+ * Processes variables for book-export-html.tpl.php.
+ *
+ * @param $variables
+ *   An associative array containing the following keys:
+ *   - title
+ *   - contents
+ *   - depth
+ *
+ * @see book-export-html.tpl.php
+ */
+function template_preprocess_book_export_html(&$variables) {
+  global $base_url, $language;
+
+  $variables['title'] = check_plain($variables['title']);
+  $variables['base_url'] = $base_url;
+  $variables['language'] = $language;
+  $variables['language_rtl'] = ($language->direction == LANGUAGE_RTL);
+  $variables['head'] = drupal_get_html_head();
+  $variables['dir'] = $language->direction ? 'rtl' : 'ltr';
+}
+
+/**
+ * Traverses the book tree to build printable or exportable output.
+ *
+ * During the traversal, the $visit_func() callback is applied to each node and
+ * is called recursively for each child of the node (in weight, title order).
+ *
+ * @param $tree
+ *   A subtree of the book menu hierarchy, rooted at the current page.
+ * @param $visit_func
+ *   A function callback to be called upon visiting a node in the tree.
+ *
+ * @return
+ *   The output generated in visiting each node.
+ */
+function book_export_traverse($tree, $visit_func) {
+  $output = '';
+
+  foreach ($tree as $data) {
+    // Note- access checking is already performed when building the tree.
+    if ($node = node_load($data['link']['nid'], FALSE)) {
+      $children = '';
+
+      if ($data['below']) {
+        $children = book_export_traverse($data['below'], $visit_func);
+      }
+
+      if (function_exists($visit_func)) {
+        $output .= call_user_func($visit_func, $node, $children);
+      }
+      else {
+        // Use the default function.
+        $output .= book_node_export($node, $children);
+      }
+    }
+  }
+
+  return $output;
+}
+
+/**
+ * Generates printer-friendly HTML for a node.
+ *
+ * @param $node
+ *   The node that will be output.
+ * @param $children
+ *   (optional) All the rendered child nodes within the current node. Defaults
+ *   to an empty string.
+ *
+ * @return
+ *   The HTML generated for the given node.
+ *
+ * @see book_export_traverse()
+ */
+function book_node_export($node, $children = '') {
+  $build = node_view($node, 'print');
+  unset($build['#theme']);
+  // @todo Rendering should happen in the template using render().
+  $node->rendered = drupal_render($build);
+
+  return theme('book_node_export_html', array('node' => $node, 'children' => $children));
+}
+
+/**
+ * Processes variables for book-node-export-html.tpl.php.
+ *
+ * @param $variables
+ *   An associative array containing the following keys:
+ *   - node
+ *   - children
+ *
+ * @see book-node-export-html.tpl.php
+ */
+function template_preprocess_book_node_export_html(&$variables) {
+  $variables['depth'] = $variables['node']->book['depth'];
+  $variables['title'] = check_plain($variables['node']->title);
+  $variables['content'] = $variables['node']->rendered;
+}
+
+/**
+ * Determine if a given node type is in the list of types allowed for books.
+ *
+ * @param $type
+ *   A node type.
+ *
+ * @return
+ *   A Boolean TRUE if the node type can be included in books; otherwise, FALSE.
+ */
+function book_type_is_allowed($type) {
+  return in_array($type, variable_get('book_allowed_types', array('book')));
+}
+
+/**
+ * Implements hook_node_type_update().
+ *
+ * Updates the Book module's persistent variables if the machine-readable name
+ * of a node type is changed.
+ */
+function book_node_type_update($type) {
+  if (!empty($type->old_type) && $type->old_type != $type->type) {
+    // Update the list of node types that are allowed to be added to books.
+    $allowed_types = variable_get('book_allowed_types', array('book'));
+    $key = array_search($type->old_type, $allowed_types);
+
+    if ($key !== FALSE) {
+      $allowed_types[$type->type] = $allowed_types[$key] ? $type->type : 0;
+      unset($allowed_types[$key]);
+      variable_set('book_allowed_types', $allowed_types);
+    }
+
+    // Update the setting for the "Add child page" link.
+    if (variable_get('book_child_type', 'book') == $type->old_type) {
+      variable_set('book_child_type', $type->type);
+    }
+  }
+}
+
+/**
+ * Gets a book menu link by its menu link ID.
+ *
+ * Like menu_link_load(), but adds additional data from the {book} table.
+ *
+ * Do not call when loading a node, since this function may call node_load().
+ *
+ * @param $mlid
+ *   The menu link ID of the menu item.
+ *
+ * @return
+ *   A menu link, with the link translated for rendering and data added from the
+ *   {book} table. FALSE if there is an error.
+ */
+function book_link_load($mlid) {
+  if ($item = db_query("SELECT * FROM {menu_links} ml INNER JOIN {book} b ON b.mlid = ml.mlid LEFT JOIN {menu_router} m ON m.path = ml.router_path WHERE ml.mlid = :mlid", array(
+      ':mlid' => $mlid,
+    ))->fetchAssoc()) {
+    _menu_link_translate($item);
+    return $item;
+  }
+
+  return FALSE;
+}
+
+/**
+ * Gets the data representing a subtree of the book hierarchy.
+ *
+ * The root of the subtree will be the link passed as a parameter, so the
+ * returned tree will contain this item and all its descendents in the menu
+ * tree.
+ *
+ * @param $link
+ *   A fully loaded menu link.
+ *
+ * @return
+ *   A subtree of menu links in an array, in the order they should be rendered.
+ */
+function book_menu_subtree_data($link) {
+  $tree = &drupal_static(__FUNCTION__, array());
+
+  // Generate a cache ID (cid) specific for this $menu_name and $link.
+  $cid = 'links:' . $link['menu_name'] . ':subtree-cid:' . $link['mlid'];
+
+  if (!isset($tree[$cid])) {
+    $cache = cache_get($cid, 'cache_menu');
+
+    if ($cache && isset($cache->data)) {
+      // If the cache entry exists, it will just be the cid for the actual data.
+      // This avoids duplication of large amounts of data.
+      $cache = cache_get($cache->data, 'cache_menu');
+
+      if ($cache && isset($cache->data)) {
+        $data = $cache->data;
+      }
+    }
+
+    // If the subtree data was not in the cache, $data will be NULL.
+    if (!isset($data)) {
+      $query = db_select('menu_links', 'ml', array('fetch' => PDO::FETCH_ASSOC));
+      $query->join('menu_router', 'm', 'm.path = ml.router_path');
+      $query->join('book', 'b', 'ml.mlid = b.mlid');
+      $query->fields('b');
+      $query->fields('m', array('load_functions', 'to_arg_functions', 'access_callback', 'access_arguments', 'page_callback', 'page_arguments', 'delivery_callback', 'title', 'title_callback', 'title_arguments', 'type'));
+      $query->fields('ml');
+      $query->condition('menu_name', $link['menu_name']);
+      for ($i = 1; $i <= MENU_MAX_DEPTH && $link["p$i"]; ++$i) {
+        $query->condition("p$i", $link["p$i"]);
+      }
+      for ($i = 1; $i <= MENU_MAX_DEPTH; ++$i) {
+        $query->orderBy("p$i");
+      }
+      $links = array();
+      foreach ($query->execute() as $item) {
+        $links[] = $item;
+      }
+      $data['tree'] = menu_tree_data($links, array(), $link['depth']);
+      $data['node_links'] = array();
+      menu_tree_collect_node_links($data['tree'], $data['node_links']);
+      // Compute the real cid for book subtree data.
+      $tree_cid = 'links:' . $item['menu_name'] . ':subtree-data:' . hash('sha256', serialize($data));
+      // Cache the data, if it is not already in the cache.
+
+      if (!cache_get($tree_cid, 'cache_menu')) {
+        cache_set($tree_cid, $data, 'cache_menu');
+      }
+      // Cache the cid of the (shared) data using the menu and item-specific cid.
+      cache_set($cid, $tree_cid, 'cache_menu');
+    }
+    // Check access for the current user to each item in the tree.
+    menu_tree_check_access($data['tree'], $data['node_links']);
+    $tree[$cid] = $data['tree'];
+  }
+
+  return $tree[$cid];
+}
diff --git a/htmltest/modules/book/book.pages.inc b/htmltest/modules/book/book.pages.inc
new file mode 100644
index 00000000..ac4f3572
--- /dev/null
+++ b/htmltest/modules/book/book.pages.inc
@@ -0,0 +1,247 @@
+<?php
+
+/**
+ * @file
+ * User page callbacks for the book module.
+ */
+
+/**
+ * Menu callback: Prints a listing of all books.
+ *
+ * @return string
+ *   A HTML-formatted string with the listing of all books content.
+ *
+ * @see book_menu()
+ */
+function book_render() {
+  $book_list = array();
+  foreach (book_get_books() as $book) {
+    $book_list[] = l($book['title'], $book['href'], $book['options']);
+  }
+
+  return theme('item_list', array('items' => $book_list));
+}
+
+/**
+ * Menu callback; Generates representations of a book page and its children.
+ *
+ * The function delegates the generation of output to helper functions. The
+ * function name is derived by prepending 'book_export_' to the given output
+ * type. So, e.g., a type of 'html' results in a call to the function
+ * book_export_html().
+ *
+ * @param $type
+ *   A string encoding the type of output requested. The following types are
+ *   currently supported in book module:
+ *   - html: Printer-friendly HTML.
+ *   Other types may be supported in contributed modules.
+ * @param $nid
+ *   An integer representing the node id (nid) of the node to export
+ *
+ * @return
+ *   A string representing the node and its children in the book hierarchy in a
+ *   format determined by the $type parameter.
+ *
+ * @see book_menu()
+ */
+function book_export($type, $nid) {
+  // Check that the node exists and that the current user has access to it.
+  $node = node_load($nid);
+  if (!$node) {
+    return MENU_NOT_FOUND;
+  }
+  if (!node_access('view', $node)) {
+    return MENU_ACCESS_DENIED;
+  }
+
+  $type = drupal_strtolower($type);
+
+  $export_function = 'book_export_' . $type;
+
+  if (function_exists($export_function)) {
+    print call_user_func($export_function, $nid);
+  }
+  else {
+    drupal_set_message(t('Unknown export format.'));
+    drupal_not_found();
+  }
+}
+
+/**
+ * Generates HTML for export when invoked by book_export().
+ *
+ * The given node is embedded to its absolute depth in a top level section. For
+ * example, a child node with depth 2 in the hierarchy is contained in
+ * (otherwise empty) <div> elements corresponding to depth 0 and depth 1.
+ * This is intended to support WYSIWYG output - e.g., level 3 sections always
+ * look like level 3 sections, no matter their depth relative to the node
+ * selected to be exported as printer-friendly HTML.
+ *
+ * @param $nid
+ *   An integer representing the node id (nid) of the node to export.
+ *
+ * @return
+ *   A string containing HTML representing the node and its children in
+ *   the book hierarchy.
+ */
+function book_export_html($nid) {
+  if (user_access('access printer-friendly version')) {
+    $node = node_load($nid);
+    if (isset($node->book)) {
+      $tree = book_menu_subtree_data($node->book);
+      $contents = book_export_traverse($tree, 'book_node_export');
+      return theme('book_export_html', array('title' => $node->title, 'contents' => $contents, 'depth' => $node->book['depth']));
+    }
+    else {
+      drupal_not_found();
+    }
+  }
+  else {
+    drupal_access_denied();
+  }
+}
+
+/**
+ * Menu callback: Shows the outline form for a single node.
+ *
+ * @param $node
+ *   The book node for which to show the outline.
+ *
+ * @return string
+ *   A HTML-formatted string with the outline form for a single node.
+ *
+  * @see book_menu()
+ */
+function book_outline($node) {
+  drupal_set_title($node->title);
+  return drupal_get_form('book_outline_form', $node);
+}
+
+/**
+ * Form constructor for the book outline form.
+ *
+ * Allows handling of all book outline operations via the outline tab.
+ *
+ * @param $node
+ *   The book node for which to show the outline.
+ *
+ * @see book_outline_form_submit()
+ * @see book_remove_button_submit()
+ * @ingroup forms
+ */
+function book_outline_form($form, &$form_state, $node) {
+  if (!isset($node->book)) {
+    // The node is not part of any book yet - set default options.
+    $node->book = _book_link_defaults($node->nid);
+  }
+  else {
+    $node->book['original_bid'] = $node->book['bid'];
+  }
+
+  // Find the depth limit for the parent select.
+  if (!isset($node->book['parent_depth_limit'])) {
+    $node->book['parent_depth_limit'] = _book_parent_depth_limit($node->book);
+  }
+  $form['#node'] = $node;
+  $form['#id'] = 'book-outline';
+  _book_add_form_elements($form, $form_state, $node);
+
+  $form['book']['#collapsible'] = FALSE;
+
+  $form['update'] = array(
+    '#type' => 'submit',
+    '#value' => $node->book['original_bid'] ? t('Update book outline') : t('Add to book outline'),
+    '#weight' => 15,
+  );
+
+  $form['remove'] = array(
+    '#type' => 'submit',
+    '#value' => t('Remove from book outline'),
+    '#access' => _book_node_is_removable($node),
+    '#weight' => 20,
+    '#submit' => array('book_remove_button_submit'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form submission handler for book_outline_form().
+ *
+ * Redirects to removal confirmation form.
+ *
+ * @see book_outline_form_submit()
+ */
+function book_remove_button_submit($form, &$form_state) {
+  $form_state['redirect'] = 'node/' . $form['#node']->nid . '/outline/remove';
+}
+
+/**
+ * Form submission handler for book_outline_form().
+ *
+ * @see book_remove_button_submit()
+ */
+function book_outline_form_submit($form, &$form_state) {
+  $node = $form['#node'];
+  $form_state['redirect'] = "node/" . $node->nid;
+  $book_link = $form_state['values']['book'];
+  if (!$book_link['bid']) {
+    drupal_set_message(t('No changes were made'));
+
+    return;
+  }
+
+  $book_link['menu_name'] = book_menu_name($book_link['bid']);
+  $node->book = $book_link;
+  if (_book_update_outline($node)) {
+    if ($node->book['parent_mismatch']) {
+      // This will usually only happen when JS is disabled.
+      drupal_set_message(t('The post has been added to the selected book. You may now position it relative to other pages.'));
+      $form_state['redirect'] = "node/" . $node->nid . "/outline";
+    }
+    else {
+      drupal_set_message(t('The book outline has been updated.'));
+    }
+  }
+  else {
+    drupal_set_message(t('There was an error adding the post to the book.'), 'error');
+  }
+}
+
+/**
+ * Form constructor to confirm removal of a node from a book.
+ *
+ * @param $node
+ *   The node to delete.
+ *
+ * @see book_remove_form_submit()
+ * @ingroup forms
+ */
+function book_remove_form($form, &$form_state, $node) {
+  $form['#node'] = $node;
+  $title = array('%title' => $node->title);
+
+  if ($node->book['has_children']) {
+    $description = t('%title has associated child pages, which will be relocated automatically to maintain their connection to the book. To recreate the hierarchy (as it was before removing this page), %title may be added again using the Outline tab, and each of its former child pages will need to be relocated manually.', $title);
+  }
+  else {
+    $description = t('%title may be added to hierarchy again using the Outline tab.', $title);
+  }
+
+  return confirm_form($form, t('Are you sure you want to remove %title from the book hierarchy?', $title), 'node/' . $node->nid, $description, t('Remove'));
+}
+
+/**
+ * Form submission handler for book_remove_form().
+ */
+function book_remove_form_submit($form, &$form_state) {
+  $node = $form['#node'];
+  if (_book_node_is_removable($node)) {
+    menu_link_delete($node->book['mlid']);
+    db_delete('book')
+      ->condition('nid', $node->nid)
+      ->execute();
+    drupal_set_message(t('The post has been removed from the book.'));
+  }
+  $form_state['redirect'] = 'node/' . $node->nid;
+}
diff --git a/htmltest/modules/book/book.test b/htmltest/modules/book/book.test
new file mode 100644
index 00000000..81f4524a
--- /dev/null
+++ b/htmltest/modules/book/book.test
@@ -0,0 +1,398 @@
+<?php
+
+/**
+ * @file
+ * Tests for book.module.
+ */
+
+/**
+ * Tests the functionality of the Book module.
+ */
+class BookTestCase extends DrupalWebTestCase {
+
+  /**
+   * A book node.
+   *
+   * @var object
+   */
+  protected $book;
+
+  /**
+   * A user with permission to create and edit books.
+   *
+   * @var object
+   */
+  protected $book_author;
+
+  /**
+   * A user with permission to view a book and access printer-friendly version.
+   *
+   * @var object
+   */
+  protected $web_user;
+
+  /**
+   * A user with permission to create and edit books and to administer blocks.
+   *
+   * @var object
+   */
+  protected $admin_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Book functionality',
+      'description' => 'Create a book, add pages, and test book interface.',
+      'group' => 'Book',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('book', 'node_access_test'));
+
+    // node_access_test requires a node_access_rebuild().
+    node_access_rebuild();
+
+    // Create users.
+    $this->book_author = $this->drupalCreateUser(array('create new books', 'create book content', 'edit own book content', 'add content to books'));
+    $this->web_user = $this->drupalCreateUser(array('access printer-friendly version', 'node test view'));
+    $this->admin_user = $this->drupalCreateUser(array('create new books', 'create book content', 'edit own book content', 'add content to books', 'administer blocks', 'administer permissions', 'administer book outlines', 'node test view'));
+  }
+
+  /**
+   * Creates a new book with a page hierarchy.
+   */
+  function createBook() {
+    // Create new book.
+    $this->drupalLogin($this->book_author);
+
+    $this->book = $this->createBookNode('new');
+    $book = $this->book;
+
+    /*
+     * Add page hierarchy to book.
+     * Book
+     *  |- Node 0
+     *   |- Node 1
+     *   |- Node 2
+     *  |- Node 3
+     *  |- Node 4
+     */
+    $nodes = array();
+    $nodes[] = $this->createBookNode($book->nid); // Node 0.
+    $nodes[] = $this->createBookNode($book->nid, $nodes[0]->book['mlid']); // Node 1.
+    $nodes[] = $this->createBookNode($book->nid, $nodes[0]->book['mlid']); // Node 2.
+    $nodes[] = $this->createBookNode($book->nid); // Node 3.
+    $nodes[] = $this->createBookNode($book->nid); // Node 4.
+
+    $this->drupalLogout();
+
+    return $nodes;
+  }
+
+  /**
+   * Tests book functionality through node interfaces.
+   */
+  function testBook() {
+    // Create new book.
+    $nodes = $this->createBook();
+    $book = $this->book;
+
+    $this->drupalLogin($this->web_user);
+
+    // Check that book pages display along with the correct outlines and
+    // previous/next links.
+    $this->checkBookNode($book, array($nodes[0], $nodes[3], $nodes[4]), FALSE, FALSE, $nodes[0], array());
+    $this->checkBookNode($nodes[0], array($nodes[1], $nodes[2]), $book, $book, $nodes[1], array($book));
+    $this->checkBookNode($nodes[1], NULL, $nodes[0], $nodes[0], $nodes[2], array($book, $nodes[0]));
+    $this->checkBookNode($nodes[2], NULL, $nodes[1], $nodes[0], $nodes[3], array($book, $nodes[0]));
+    $this->checkBookNode($nodes[3], NULL, $nodes[2], $book, $nodes[4], array($book));
+    $this->checkBookNode($nodes[4], NULL, $nodes[3], $book, FALSE, array($book));
+
+    $this->drupalLogout();
+
+    // Create a second book, and move an existing book page into it.
+    $this->drupalLogin($this->book_author);
+    $other_book = $this->createBookNode('new');
+    $node = $this->createBookNode($book->nid);
+    $edit = array('book[bid]' => $other_book->nid);
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    $this->drupalLogout();
+    $this->drupalLogin($this->web_user);
+
+    // Check that the nodes in the second book are displayed correctly.
+    // First we must set $this->book to the second book, so that the
+    // correct regex will be generated for testing the outline.
+    $this->book = $other_book;
+    $this->checkBookNode($other_book, array($node), FALSE, FALSE, $node, array());
+    $this->checkBookNode($node, NULL, $other_book, $other_book, FALSE, array($other_book));
+  }
+
+  /**
+   * Checks the outline of sub-pages; previous, up, and next.
+   *
+   * Also checks the printer friendly version of the outline.
+   *
+   * @param $node
+   *   Node to check.
+   * @param $nodes
+   *   Nodes that should be in outline.
+   * @param $previous
+   *   (optional) Previous link node. Defaults to FALSE.
+   * @param $up
+   *   (optional) Up link node. Defaults to FALSE.
+   * @param $next
+   *   (optional) Next link node. Defaults to FALSE.
+   * @param $breadcrumb
+   *   The nodes that should be displayed in the breadcrumb.
+   */
+  function checkBookNode($node, $nodes, $previous = FALSE, $up = FALSE, $next = FALSE, array $breadcrumb) {
+    // $number does not use drupal_static as it should not be reset
+    // since it uniquely identifies each call to checkBookNode().
+    static $number = 0;
+    $this->drupalGet('node/' . $node->nid);
+
+    // Check outline structure.
+    if ($nodes !== NULL) {
+      $this->assertPattern($this->generateOutlinePattern($nodes), format_string('Node %number outline confirmed.', array('%number' => $number)));
+    }
+    else {
+      $this->pass(format_string('Node %number does not have outline.', array('%number' => $number)));
+    }
+
+    // Check previous, up, and next links.
+    if ($previous) {
+      $this->assertRaw(l('‹ ' . $previous->title, 'node/' . $previous->nid, array('attributes' => array('class' => array('page-previous'), 'title' => t('Go to previous page')))), 'Previous page link found.');
+    }
+
+    if ($up) {
+      $this->assertRaw(l('up', 'node/' . $up->nid, array('attributes' => array('class' => array('page-up'), 'title' => t('Go to parent page')))), 'Up page link found.');
+    }
+
+    if ($next) {
+      $this->assertRaw(l($next->title . ' ›', 'node/' . $next->nid, array('attributes' => array('class' => array('page-next'), 'title' => t('Go to next page')))), 'Next page link found.');
+    }
+
+    // Compute the expected breadcrumb.
+    $expected_breadcrumb = array();
+    $expected_breadcrumb[] = url('');
+    foreach ($breadcrumb as $a_node) {
+      $expected_breadcrumb[] = url('node/' . $a_node->nid);
+    }
+
+    // Fetch links in the current breadcrumb.
+    $links = $this->xpath('//div[@class="breadcrumb"]/a');
+    $got_breadcrumb = array();
+    foreach ($links as $link) {
+      $got_breadcrumb[] = (string) $link['href'];
+    }
+
+    // Compare expected and got breadcrumbs.
+    $this->assertIdentical($expected_breadcrumb, $got_breadcrumb, 'The breadcrumb is correctly displayed on the page.');
+
+    // Check printer friendly version.
+    $this->drupalGet('book/export/html/' . $node->nid);
+    $this->assertText($node->title, 'Printer friendly title found.');
+    $this->assertRaw(check_markup($node->body[LANGUAGE_NONE][0]['value'], $node->body[LANGUAGE_NONE][0]['format']), 'Printer friendly body found.');
+
+    $number++;
+  }
+
+  /**
+   * Creates a regular expression to check for the sub-nodes in the outline.
+   *
+   * @param array $nodes
+   *   An array of nodes to check in outline.
+   *
+   * @return
+   *   A regular expression that locates sub-nodes of the outline.
+   */
+  function generateOutlinePattern($nodes) {
+    $outline = '';
+    foreach ($nodes as $node) {
+      $outline .= '(node\/' . $node->nid . ')(.*?)(' . $node->title . ')(.*?)';
+    }
+
+    return '/<div id="book-navigation-' . $this->book->nid . '"(.*?)<ul(.*?)' . $outline . '<\/ul>/s';
+  }
+
+  /**
+   * Creates a book node.
+   *
+   * @param $book_nid
+   *   A book node ID or set to 'new' to create a new book.
+   * @param $parent
+   *   (optional) Parent book reference ID. Defaults to NULL.
+   */
+  function createBookNode($book_nid, $parent = NULL) {
+    // $number does not use drupal_static as it should not be reset
+    // since it uniquely identifies each call to createBookNode().
+    static $number = 0; // Used to ensure that when sorted nodes stay in same order.
+
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = $number . ' - SimpleTest test node ' . $this->randomName(10);
+    $edit["body[$langcode][0][value]"] = 'SimpleTest test body ' . $this->randomName(32) . ' ' . $this->randomName(32);
+    $edit['book[bid]'] = $book_nid;
+
+    if ($parent !== NULL) {
+      $this->drupalPost('node/add/book', $edit, t('Change book (update list of parents)'));
+
+      $edit['book[plid]'] = $parent;
+      $this->drupalPost(NULL, $edit, t('Save'));
+    }
+    else {
+      $this->drupalPost('node/add/book', $edit, t('Save'));
+    }
+
+    // Check to make sure the book node was created.
+    $node = $this->drupalGetNodeByTitle($edit['title']);
+    $this->assertNotNull(($node === FALSE ? NULL : $node), 'Book node found in database.');
+    $number++;
+
+    return $node;
+  }
+
+  /**
+   * Tests book export ("printer-friendly version") functionality.
+   */
+  function testBookExport() {
+    // Create a book.
+    $nodes = $this->createBook();
+
+    // Login as web user and view printer-friendly version.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('node/' . $this->book->nid);
+    $this->clickLink(t('Printer-friendly version'));
+
+    // Make sure each part of the book is there.
+    foreach ($nodes as $node) {
+      $this->assertText($node->title, 'Node title found in printer friendly version.');
+      $this->assertRaw(check_markup($node->body[LANGUAGE_NONE][0]['value'], $node->body[LANGUAGE_NONE][0]['format']), 'Node body found in printer friendly version.');
+    }
+
+    // Make sure we can't export an unsupported format.
+    $this->drupalGet('book/export/foobar/' . $this->book->nid);
+    $this->assertResponse('404', 'Unsupported export format returned "not found".');
+
+    // Make sure we get a 404 on a not existing book node.
+    $this->drupalGet('book/export/html/123');
+    $this->assertResponse('404', 'Not existing book node returned "not found".');
+
+    // Make sure an anonymous user cannot view printer-friendly version.
+    $this->drupalLogout();
+
+    // Load the book and verify there is no printer-friendly version link.
+    $this->drupalGet('node/' . $this->book->nid);
+    $this->assertNoLink(t('Printer-friendly version'), 'Anonymous user is not shown link to printer-friendly version.');
+
+    // Try getting the URL directly, and verify it fails.
+    $this->drupalGet('book/export/html/' . $this->book->nid);
+    $this->assertResponse('403', 'Anonymous user properly forbidden.');
+
+    // Now grant anonymous users permission to view the printer-friendly
+    // version and verify that node access restrictions still prevent them from
+    // seeing it.
+    user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access printer-friendly version'));
+    $this->drupalGet('book/export/html/' . $this->book->nid);
+    $this->assertResponse('403', 'Anonymous user properly forbidden from seeing the printer-friendly version when denied by node access.');
+  }
+
+  /**
+   * Tests the functionality of the book navigation block.
+   */
+  function testBookNavigationBlock() {
+    $this->drupalLogin($this->admin_user);
+
+    // Set block title to confirm that the interface is available.
+    $block_title = $this->randomName(16);
+    $this->drupalPost('admin/structure/block/manage/book/navigation/configure', array('title' => $block_title), t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), 'Block configuration set.');
+
+    // Set the block to a region to confirm block is available.
+    $edit = array();
+    $edit['blocks[book_navigation][region]'] = 'footer';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->assertText(t('The block settings have been updated.'), 'Block successfully move to footer region.');
+
+     // Give anonymous users the permission 'node test view'.
+     $edit = array();
+     $edit[DRUPAL_ANONYMOUS_RID . '[node test view]'] = TRUE;
+     $this->drupalPost('admin/people/permissions/' . DRUPAL_ANONYMOUS_RID, $edit, t('Save permissions'));
+     $this->assertText(t('The changes have been saved.'), "Permission 'node test view' successfully assigned to anonymous users.");
+
+    // Test correct display of the block.
+    $nodes = $this->createBook();
+    $this->drupalGet('<front>');
+    $this->assertText($block_title, 'Book navigation block is displayed.');
+    $this->assertText($this->book->title, format_string('Link to book root (@title) is displayed.', array('@title' => $nodes[0]->title)));
+    $this->assertNoText($nodes[0]->title, 'No links to individual book pages are displayed.');
+  }
+
+  /**
+   * Tests the book navigation block when an access module is enabled.
+   */
+   function testNavigationBlockOnAccessModuleEnabled() {
+     $this->drupalLogin($this->admin_user);
+     $edit = array();
+
+     // Set the block title.
+     $block_title = $this->randomName(16);
+     $edit['title'] = $block_title;
+
+     // Set block display to 'Show block only on book pages'.
+     $edit['book_block_mode'] = 'book pages';
+     $this->drupalPost('admin/structure/block/manage/book/navigation/configure', $edit, t('Save block'));
+     $this->assertText(t('The block configuration has been saved.'), 'Block configuration set.');
+
+     // Set the block to a region to confirm block is available.
+     $edit = array();
+     $edit['blocks[book_navigation][region]'] = 'footer';
+     $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+     $this->assertText(t('The block settings have been updated.'), 'Block successfully move to footer region.');
+
+     // Give anonymous users the permission 'node test view'.
+     $edit = array();
+     $edit[DRUPAL_ANONYMOUS_RID . '[node test view]'] = TRUE;
+     $this->drupalPost('admin/people/permissions/' . DRUPAL_ANONYMOUS_RID, $edit, t('Save permissions'));
+     $this->assertText(t('The changes have been saved.'), "Permission 'node test view' successfully assigned to anonymous users.");
+
+     // Create a book.
+     $this->createBook();
+
+     // Test correct display of the block to registered users.
+     $this->drupalLogin($this->web_user);
+     $this->drupalGet('node/' . $this->book->nid);
+     $this->assertText($block_title, 'Book navigation block is displayed to registered users.');
+     $this->drupalLogout();
+
+     // Test correct display of the block to anonymous users.
+     $this->drupalGet('node/' . $this->book->nid);
+     $this->assertText($block_title, 'Book navigation block is displayed to anonymous users.');
+   }
+
+  /**
+   * Tests the access for deleting top-level book nodes.
+   */
+   function testBookDelete() {
+     $nodes = $this->createBook();
+     $this->drupalLogin($this->admin_user);
+     $edit = array();
+
+     // Test access to delete top-level and child book nodes.
+     $this->drupalGet('node/' . $this->book->nid . '/outline/remove');
+     $this->assertResponse('403', 'Deleting top-level book node properly forbidden.');
+     $this->drupalPost('node/' . $nodes[4]->nid . '/outline/remove', $edit, t('Remove'));
+     $node4 = node_load($nodes[4]->nid, NULL, TRUE);
+     $this->assertTrue(empty($node4->book), 'Deleting child book node properly allowed.');
+
+     // Delete all child book nodes and retest top-level node deletion.
+     foreach ($nodes as $node) {
+       $nids[] = $node->nid;
+     }
+     node_delete_multiple($nids);
+     $this->drupalPost('node/' . $this->book->nid . '/outline/remove', $edit, t('Remove'));
+     $node = node_load($this->book->nid, NULL, TRUE);
+     $this->assertTrue(empty($node->book), 'Deleting childless top-level book node properly allowed.');
+   }
+}
diff --git a/htmltest/modules/color/color-rtl.css b/htmltest/modules/color/color-rtl.css
new file mode 100644
index 00000000..07b754ea
--- /dev/null
+++ b/htmltest/modules/color/color-rtl.css
@@ -0,0 +1,48 @@
+/**
+ * @file
+ * Right-to-left specific stylesheet for the Color module.
+ */
+
+#placeholder {
+  left: 0;
+  right: auto;
+}
+
+/* Palette */
+.color-form .form-item {
+  padding-left: 0;
+  padding-right: 1em;
+}
+.color-form label {
+  float: right;
+  clear: right;
+}
+.color-form .form-text,
+.color-form .form-select {
+  float: right;
+}
+.color-form .form-text {
+  margin-right: 0;
+  margin-left: 5px;
+}
+#palette .hook {
+  float: right;
+}
+#palette .down,
+#palette .up,
+#palette .both {
+  background: url(images/hook-rtl.png) no-repeat 0 0;
+}
+#palette .up {
+  background-position: 0 -27px;
+}
+#palette .both {
+  background-position: 0 -54px;
+}
+#palette .lock {
+  float: right;
+  right: -10px;
+}
+html.js #preview {
+  float: right;
+}
diff --git a/htmltest/modules/color/color.css b/htmltest/modules/color/color.css
new file mode 100644
index 00000000..981cff85
--- /dev/null
+++ b/htmltest/modules/color/color.css
@@ -0,0 +1,85 @@
+/**
+ * @file
+ * Stylesheet for the administration pages of the Color module.
+ */
+
+/* Farbtastic placement */
+.color-form {
+  max-width: 50em;
+  position: relative;
+}
+#placeholder {
+  position: absolute;
+  top: 0;
+  right: 0; /* LTR */
+}
+
+/* Palette */
+.color-form .form-item {
+  height: 2em;
+  line-height: 2em;
+  padding-left: 1em; /* LTR */
+  margin: 0.5em 0;
+}
+.color-form label {
+  float: left; /* LTR */
+  clear: left; /* LTR */
+  width: 10em;
+}
+.color-form .form-text,
+.color-form .form-select {
+  float: left; /* LTR */
+}
+.color-form .form-text {
+  text-align: center;
+  margin-right: 5px; /* LTR */
+  cursor: pointer;
+}
+
+#palette .hook {
+  float: left; /* LTR */
+  margin-top: 3px;
+  width: 16px;
+  height: 16px;
+}
+#palette .down,
+#palette .up,
+#palette .both {
+  background: url(images/hook.png) no-repeat 100% 0; /* LTR */
+}
+#palette .up {
+  background-position: 100% -27px; /* LTR */
+}
+#palette .both {
+  background-position: 100% -54px; /* LTR */
+}
+
+#palette .lock {
+  float: left; /* LTR */
+  position: relative;
+  top: -1.4em;
+  left: -10px; /* LTR */
+  width: 20px;
+  height: 25px;
+  background: url(images/lock.png) no-repeat 50% 2px;
+  cursor: pointer;
+}
+#palette .unlocked {
+  background-position: 50% -22px;
+}
+#palette .form-item {
+  width: 20em;
+}
+#palette .item-selected {
+  background: #eee;
+}
+
+/* Preview */
+#preview {
+  display: none;
+}
+html.js #preview {
+  display: block;
+  position: relative;
+  float: left; /* LTR */
+}
diff --git a/htmltest/modules/color/color.info b/htmltest/modules/color/color.info
new file mode 100644
index 00000000..c14b6001
--- /dev/null
+++ b/htmltest/modules/color/color.info
@@ -0,0 +1,12 @@
+name = Color
+description = Allows administrators to change the color scheme of compatible themes.
+package = Core
+version = VERSION
+core = 7.x
+files[] = color.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/color/color.install b/htmltest/modules/color/color.install
new file mode 100644
index 00000000..3a9aea35
--- /dev/null
+++ b/htmltest/modules/color/color.install
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the color module.
+ */
+
+/**
+ * Implements hook_requirements().
+ */
+function color_requirements($phase) {
+  $requirements = array();
+
+  if ($phase == 'runtime') {
+    // Check for the PHP GD library.
+    if (function_exists('imagegd2')) {
+      $info = gd_info();
+      $requirements['color_gd'] = array(
+        'value' => $info['GD Version'],
+      );
+
+      // Check for PNG support.
+      if (function_exists('imagecreatefrompng')) {
+        $requirements['color_gd']['severity'] = REQUIREMENT_OK;
+      }
+      else {
+        $requirements['color_gd']['severity'] = REQUIREMENT_WARNING;
+        $requirements['color_gd']['description'] = t('The GD library for PHP is enabled, but was compiled without PNG support. Check the <a href="@url">PHP image documentation</a> for information on how to correct this.', array('@url' => 'http://www.php.net/manual/ref.image.php'));
+      }
+    }
+    else {
+      $requirements['color_gd'] = array(
+        'value' => t('Not installed'),
+        'severity' => REQUIREMENT_ERROR,
+        'description' => t('The GD library for PHP is missing or outdated. Check the <a href="@url">PHP image documentation</a> for information on how to correct this.', array('@url' => 'http://www.php.net/manual/book.image.php')),
+      );
+    }
+    $requirements['color_gd']['title'] = t('GD library PNG support');
+  }
+
+  return $requirements;
+}
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Warn site administrator if unsafe CSS color codes are found in the database.
+ */
+function color_update_7001() {
+  $theme_palettes = db_query("SELECT name FROM {variable} WHERE name LIKE 'color_%_palette'")->fetchCol();
+  foreach ($theme_palettes as $name) {
+    $palette = variable_get($name, array());
+    foreach ($palette as $key => $color) {
+      if (!preg_match('/^#([a-f0-9]{3}){1,2}$/iD', $color)) {
+        drupal_set_message('Some of the custom CSS color codes specified via the color module are invalid. Please examine the themes which are making use of the color module at the <a href="'. url('admin/appearance/settings') .'">Appearance settings</a> page to verify their CSS color values.', 'warning');
+      }
+    }
+  }
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra".
+ */
diff --git a/htmltest/modules/color/color.js b/htmltest/modules/color/color.js
new file mode 100644
index 00000000..d7e06645
--- /dev/null
+++ b/htmltest/modules/color/color.js
@@ -0,0 +1,250 @@
+/**
+ * @file
+ * Attaches the behaviors for the Color module.
+ */
+
+(function ($) {
+
+Drupal.behaviors.color = {
+  attach: function (context, settings) {
+    var i, j, colors, field_name;
+    // This behavior attaches by ID, so is only valid once on a page.
+    var form = $('#system-theme-settings .color-form', context).once('color');
+    if (form.length == 0) {
+      return;
+    }
+    var inputs = [];
+    var hooks = [];
+    var locks = [];
+    var focused = null;
+
+    // Add Farbtastic.
+    $(form).prepend('<div id="placeholder"></div>').addClass('color-processed');
+    var farb = $.farbtastic('#placeholder');
+
+    // Decode reference colors to HSL.
+    var reference = settings.color.reference;
+    for (i in reference) {
+      reference[i] = farb.RGBToHSL(farb.unpack(reference[i]));
+    }
+
+    // Build a preview.
+    var height = [];
+    var width = [];
+    // Loop through all defined gradients.
+    for (i in settings.gradients) {
+      // Add element to display the gradient.
+      $('#preview').once('color').append('<div id="gradient-' + i + '"></div>');
+      var gradient = $('#preview #gradient-' + i);
+      // Add height of current gradient to the list (divided by 10).
+      height.push(parseInt(gradient.css('height'), 10) / 10);
+      // Add width of current gradient to the list (divided by 10).
+      width.push(parseInt(gradient.css('width'), 10) / 10);
+      // Add rows (or columns for horizontal gradients).
+      // Each gradient line should have a height (or width for horizontal
+      // gradients) of 10px (because we divided the height/width by 10 above).
+      for (j = 0; j < (settings.gradients[i]['direction'] == 'vertical' ? height[i] : width[i]); ++j) {
+        gradient.append('<div class="gradient-line"></div>');
+      }
+    }
+
+    // Fix preview background in IE6.
+    if (navigator.appVersion.match(/MSIE [0-6]\./)) {
+      var e = $('#preview #img')[0];
+      var image = e.currentStyle.backgroundImage;
+      e.style.backgroundImage = 'none';
+      e.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image.substring(5, image.length - 2) + "')";
+    }
+
+    // Set up colorScheme selector.
+    $('#edit-scheme', form).change(function () {
+      var schemes = settings.color.schemes, colorScheme = this.options[this.selectedIndex].value;
+      if (colorScheme != '' && schemes[colorScheme]) {
+        // Get colors of active scheme.
+        colors = schemes[colorScheme];
+        for (field_name in colors) {
+          callback($('#edit-palette-' + field_name), colors[field_name], false, true);
+        }
+        preview();
+      }
+    });
+
+    /**
+     * Renders the preview.
+     */
+    function preview() {
+      Drupal.color.callback(context, settings, form, farb, height, width);
+    }
+
+    /**
+     * Shifts a given color, using a reference pair (ref in HSL).
+     *
+     * This algorithm ensures relative ordering on the saturation and luminance
+     * axes is preserved, and performs a simple hue shift.
+     *
+     * It is also symmetrical. If: shift_color(c, a, b) == d, then
+     * shift_color(d, b, a) == c.
+     */
+    function shift_color(given, ref1, ref2) {
+      // Convert to HSL.
+      given = farb.RGBToHSL(farb.unpack(given));
+
+      // Hue: apply delta.
+      given[0] += ref2[0] - ref1[0];
+
+      // Saturation: interpolate.
+      if (ref1[1] == 0 || ref2[1] == 0) {
+        given[1] = ref2[1];
+      }
+      else {
+        var d = ref1[1] / ref2[1];
+        if (d > 1) {
+          given[1] /= d;
+        }
+        else {
+          given[1] = 1 - (1 - given[1]) * d;
+        }
+      }
+
+      // Luminance: interpolate.
+      if (ref1[2] == 0 || ref2[2] == 0) {
+        given[2] = ref2[2];
+      }
+      else {
+        var d = ref1[2] / ref2[2];
+        if (d > 1) {
+          given[2] /= d;
+        }
+        else {
+          given[2] = 1 - (1 - given[2]) * d;
+        }
+      }
+
+      return farb.pack(farb.HSLToRGB(given));
+    }
+
+    /**
+     * Callback for Farbtastic when a new color is chosen.
+     */
+    function callback(input, color, propagate, colorScheme) {
+      var matched;
+      // Set background/foreground colors.
+      $(input).css({
+        backgroundColor: color,
+        'color': farb.RGBToHSL(farb.unpack(color))[2] > 0.5 ? '#000' : '#fff'
+      });
+
+      // Change input value.
+      if ($(input).val() && $(input).val() != color) {
+        $(input).val(color);
+
+        // Update locked values.
+        if (propagate) {
+          i = input.i;
+          for (j = i + 1; ; ++j) {
+            if (!locks[j - 1] || $(locks[j - 1]).is('.unlocked')) break;
+            matched = shift_color(color, reference[input.key], reference[inputs[j].key]);
+            callback(inputs[j], matched, false);
+          }
+          for (j = i - 1; ; --j) {
+            if (!locks[j] || $(locks[j]).is('.unlocked')) break;
+            matched = shift_color(color, reference[input.key], reference[inputs[j].key]);
+            callback(inputs[j], matched, false);
+          }
+
+          // Update preview.
+          preview();
+        }
+
+        // Reset colorScheme selector.
+        if (!colorScheme) {
+          resetScheme();
+        }
+      }
+    }
+
+    /**
+     * Resets the color scheme selector.
+     */
+    function resetScheme() {
+      $('#edit-scheme', form).each(function () {
+        this.selectedIndex = this.options.length - 1;
+      });
+    }
+
+    /**
+     * Focuses Farbtastic on a particular field.
+     */
+    function focus() {
+      var input = this;
+      // Remove old bindings.
+      focused && $(focused).unbind('keyup', farb.updateValue)
+          .unbind('keyup', preview).unbind('keyup', resetScheme)
+          .parent().removeClass('item-selected');
+
+      // Add new bindings.
+      focused = this;
+      farb.linkTo(function (color) { callback(input, color, true, false); });
+      farb.setColor(this.value);
+      $(focused).keyup(farb.updateValue).keyup(preview).keyup(resetScheme)
+        .parent().addClass('item-selected');
+    }
+
+    // Initialize color fields.
+    $('#palette input.form-text', form)
+    .each(function () {
+      // Extract palette field name
+      this.key = this.id.substring(13);
+
+      // Link to color picker temporarily to initialize.
+      farb.linkTo(function () {}).setColor('#000').linkTo(this);
+
+      // Add lock.
+      var i = inputs.length;
+      if (inputs.length) {
+        var lock = $('<div class="lock"></div>').toggle(
+          function () {
+            $(this).addClass('unlocked');
+            $(hooks[i - 1]).attr('class',
+              locks[i - 2] && $(locks[i - 2]).is(':not(.unlocked)') ? 'hook up' : 'hook'
+            );
+            $(hooks[i]).attr('class',
+              locks[i] && $(locks[i]).is(':not(.unlocked)') ? 'hook down' : 'hook'
+            );
+          },
+          function () {
+            $(this).removeClass('unlocked');
+            $(hooks[i - 1]).attr('class',
+              locks[i - 2] && $(locks[i - 2]).is(':not(.unlocked)') ? 'hook both' : 'hook down'
+            );
+            $(hooks[i]).attr('class',
+              locks[i] && $(locks[i]).is(':not(.unlocked)') ? 'hook both' : 'hook up'
+            );
+          }
+        );
+        $(this).after(lock);
+        locks.push(lock);
+      };
+
+      // Add hook.
+      var hook = $('<div class="hook"></div>');
+      $(this).after(hook);
+      hooks.push(hook);
+
+      $(this).parent().find('.lock').click();
+      this.i = i;
+      inputs.push(this);
+    })
+    .focus(focus);
+
+    $('#palette label', form);
+
+    // Focus first color.
+    focus.call(inputs[0]);
+
+    // Render preview.
+    preview();
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/color/color.module b/htmltest/modules/color/color.module
new file mode 100644
index 00000000..5b441aab
--- /dev/null
+++ b/htmltest/modules/color/color.module
@@ -0,0 +1,815 @@
+<?php
+/**
+ * @file
+ * Allows users to change the color scheme of themes.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function color_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#color':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Color module allows users with the <em>Administer site configuration</em> permission to quickly and easily change the color scheme of themes that have been built to be compatible with it. For more information, see the online handbook entry for <a href="@color">Color module</a>.', array('@color' => 'http://drupal.org/documentation/modules/color')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Changing colors') . '</dt>';
+      $output .= '<dd>' . t("Using the Color module allows you to easily change the color of links, backgrounds, text, and other theme elements. To change the color settings for a compatible theme, select the <em>Settings</em> link for your theme on the <a href='@configure'>Themes administration page</a>. If you don't see a color picker on that page, then your theme is not compatible with the color module. If you are sure that the theme does indeed support the color module, but the color picker does not appear, then <a href='@troubleshoot'>follow these troubleshooting procedures</a>.", array('@configure' => url('admin/appearance'), '@troubleshoot' => 'http://drupal.org/node/109457')) . '</dd>';
+      $output .= '<dd>' . t("The Color module saves a modified copy of the theme's specified stylesheets in the files directory. This means that if you make any manual changes to your theme's stylesheet, <em>you must save your color settings again, even if they haven't changed</em>. This step is required because the module stylesheets (in the files directory) need to be recreated to include your changes.") . '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function color_theme() {
+  return array(
+    'color_scheme_form' => array(
+      'render element' => 'form',
+    ),
+  );
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function color_form_system_theme_settings_alter(&$form, &$form_state) {
+  if (isset($form_state['build_info']['args'][0]) && ($theme = $form_state['build_info']['args'][0]) && color_get_info($theme) && function_exists('gd_info')) {
+    $form['color'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Color scheme'),
+      '#weight' => -1,
+      '#attributes' => array('id' => 'color_scheme_form'),
+      '#theme' => 'color_scheme_form',
+    );
+    $form['color'] += color_scheme_form($form, $form_state, $theme);
+    $form['#validate'][] = 'color_scheme_form_validate';
+    $form['#submit'][] = 'color_scheme_form_submit';
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function color_form_system_themes_alter(&$form, &$form_state) {
+  _color_theme_select_form_alter($form, $form_state);
+}
+
+/**
+ * Helper for hook_form_FORM_ID_alter() implementations.
+ */
+function _color_theme_select_form_alter(&$form, &$form_state) {
+  // Use the generated screenshot in the theme list.
+  $themes = list_themes();
+  foreach (element_children($form) as $theme) {
+    if ($screenshot = variable_get('color_' . $theme . '_screenshot')) {
+      if (isset($form[$theme]['screenshot'])) {
+        $form[$theme]['screenshot']['#markup'] = theme('image', array('path' => $screenshot, 'title' => '', 'attributes' => array('class' => array('screenshot'))));
+      }
+    }
+  }
+}
+
+/**
+ * Replaces style sheets with color-altered style sheets.
+ *
+ * A theme that supports the color module should call this function from its
+ * THEME_process_html() function, so that the correct style sheets are
+ * included when html.tpl.php is rendered.
+ *
+ * @see theme()
+ */
+function _color_html_alter(&$vars) {
+  global $theme_key;
+  $themes = list_themes();
+
+  // Override stylesheets.
+  $color_paths = variable_get('color_' . $theme_key . '_stylesheets', array());
+  if (!empty($color_paths)) {
+
+    foreach ($themes[$theme_key]->stylesheets['all'] as $base_filename => $old_path) {
+      // Loop over the path array with recolored CSS files to find matching
+      // paths which could replace the non-recolored paths.
+      foreach ($color_paths as $color_path) {
+        // Color module currently requires unique file names to be used,
+        // which allows us to compare different file paths.
+        if (drupal_basename($old_path) == drupal_basename($color_path)) {
+          // Replace the path to the new css file.
+          // This keeps the order of the stylesheets intact.
+          $vars['css'][$old_path]['data'] = $color_path;
+        }
+      }
+    }
+
+    $vars['styles'] = drupal_get_css($vars['css']);
+  }
+}
+
+/**
+ * Replaces the logo with a color-altered logo.
+ *
+ * A theme that supports the color module should call this function from its
+ * THEME_process_page() function, so that the correct logo is included when
+ * page.tpl.php is rendered.
+ *
+ * @see theme()
+ */
+function _color_page_alter(&$vars) {
+  global $theme_key;
+
+  // Override logo.
+  $logo = variable_get('color_' . $theme_key . '_logo');
+  if ($logo && $vars['logo'] && preg_match('!' . $theme_key . '/logo.png$!', $vars['logo'])) {
+    $vars['logo'] = file_create_url($logo);
+  }
+}
+
+/**
+ * Retrieves the Color module information for a particular theme.
+ */
+function color_get_info($theme) {
+  static $theme_info = array();
+
+  if (isset($theme_info[$theme])) {
+    return $theme_info[$theme];
+  }
+
+  $path = drupal_get_path('theme', $theme);
+  $file = DRUPAL_ROOT . '/' . $path . '/color/color.inc';
+  if ($path && file_exists($file)) {
+    include $file;
+    $theme_info[$theme] = $info;
+    return $info;
+  }
+}
+
+/**
+ * Retrieves the color palette for a particular theme.
+ */
+function color_get_palette($theme, $default = FALSE) {
+  // Fetch and expand default palette.
+  $info = color_get_info($theme);
+  $palette = $info['schemes']['default']['colors'];
+
+  // Load variable.
+  return $default ? $palette : variable_get('color_' . $theme . '_palette', $palette);
+}
+
+/**
+ * Form constructor for the color configuration form for a particular theme.
+ *
+ * @param $theme
+ *   The machine name of the theme whose color settings are being configured.
+ *
+ * @see color_scheme_form_validate()
+ * @see color_scheme_form_submit()
+ * @ingroup forms
+ */
+function color_scheme_form($complete_form, &$form_state, $theme) {
+  $base = drupal_get_path('module', 'color');
+  $info = color_get_info($theme);
+
+  $info['schemes'][''] = array('title' => t('Custom'), 'colors' => array());
+  $color_sets = array();
+  $schemes = array();
+  foreach ($info['schemes'] as $key => $scheme) {
+    $color_sets[$key] = $scheme['title'];
+    $schemes[$key] = $scheme['colors'];
+    $schemes[$key] += $info['schemes']['default']['colors'];
+  }
+
+  // See if we're using a predefined scheme.
+  // Note: we use the original theme when the default scheme is chosen.
+  $current_scheme = variable_get('color_' . $theme . '_palette', array());
+  foreach ($schemes as $key => $scheme) {
+    if ($current_scheme == $scheme) {
+      $scheme_name = $key;
+      break;
+    }
+  }
+  if (empty($scheme_name)) {
+    if (empty($current_scheme)) {
+      $scheme_name = 'default';
+    }
+    else {
+      $scheme_name = '';
+    }
+  }
+
+  // Add scheme selector.
+  $form['scheme'] = array(
+    '#type' => 'select',
+    '#title' => t('Color set'),
+    '#options' => $color_sets,
+    '#default_value' => $scheme_name,
+    '#attached' => array(
+      // Add Farbtastic color picker.
+      'library' => array(
+        array('system', 'farbtastic'),
+      ),
+      // Add custom CSS.
+      'css' => array(
+        $base . '/color.css' => array(),
+      ),
+      // Add custom JavaScript.
+      'js' => array(
+        $base . '/color.js',
+        array(
+          'data' => array(
+            'color' => array(
+              'reference' => color_get_palette($theme, TRUE),
+              'schemes' => $schemes,
+            ),
+            'gradients' => $info['gradients'],
+          ),
+          'type' => 'setting',
+        ),
+      ),
+    ),
+  );
+
+  // Add palette fields.
+  $palette = color_get_palette($theme);
+  $names = $info['fields'];
+  $form['palette']['#tree'] = TRUE;
+  foreach ($palette as $name => $value) {
+    if (isset($names[$name])) {
+      $form['palette'][$name] = array(
+        '#type' => 'textfield',
+        '#title' => check_plain($names[$name]),
+        '#value_callback' => 'color_palette_color_value',
+        '#default_value' => $value,
+        '#size' => 8,
+      );
+    }
+  }
+  $form['theme'] = array('#type' => 'value', '#value' => $theme);
+  $form['info'] = array('#type' => 'value', '#value' => $info);
+
+  return $form;
+}
+
+/**
+ * Returns HTML for a theme's color form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_color_scheme_form($variables) {
+  $form = $variables['form'];
+
+  $theme = $form['theme']['#value'];
+  $info = $form['info']['#value'];
+  $path = drupal_get_path('theme', $theme) . '/';
+  drupal_add_css($path . $info['preview_css']);
+
+  $preview_js_path = isset($info['preview_js']) ? $path . $info['preview_js'] : drupal_get_path('module', 'color') . '/' . 'preview.js';
+  // Add the JS at a weight below color.js.
+  drupal_add_js($preview_js_path, array('weight' => -1));
+
+  $output  = '';
+  $output .= '<div class="color-form clearfix">';
+  // Color schemes
+  $output .= drupal_render($form['scheme']);
+  // Palette
+  $output .= '<div id="palette" class="clearfix">';
+  foreach (element_children($form['palette']) as $name) {
+    $output .= drupal_render($form['palette'][$name]);
+  }
+  $output .= '</div>';
+  // Preview
+  $output .= drupal_render_children($form);
+  $output .= '<h2>' . t('Preview') . '</h2>';
+  // Attempt to load preview HTML if the theme provides it.
+  $preview_html_path = DRUPAL_ROOT . '/' . (isset($info['preview_html']) ? drupal_get_path('theme', $theme) . '/' . $info['preview_html'] : drupal_get_path('module', 'color') . '/preview.html');
+  $output .= file_get_contents($preview_html_path);
+  // Close the wrapper div.
+  $output .= '</div>';
+
+  return $output;
+}
+
+/**
+ * Determines the value for a palette color field.
+ *
+ * @param $element
+ *   The form element whose value is being populated.
+ * @param $input
+ *   The incoming input to populate the form element. If this is FALSE,
+ *   the element's default value should be returned.
+ * @param $form_state
+ *   A keyed array containing the current state of the form.
+ *
+ * @return
+ *   The data that will appear in the $form_state['values'] collection for this
+ *   element. Return nothing to use the default.
+ */
+function color_palette_color_value($element, $input = FALSE, $form_state = array()) {
+  // If we suspect a possible cross-site request forgery attack, only accept
+  // hexadecimal CSS color strings from user input, to avoid problems when this
+  // value is used in the JavaScript preview.
+  if ($input !== FALSE) {
+    // Start with the provided value for this textfield, and validate that if
+    // necessary, falling back on the default value.
+    $value = form_type_textfield_value($element, $input, $form_state);
+    if (!$value || !isset($form_state['complete form']['#token']) || color_valid_hexadecimal_string($value) || drupal_valid_token($form_state['values']['form_token'], $form_state['complete form']['#token'])) {
+      return $value;
+    }
+    else {
+      return $element['#default_value'];
+    }
+  }
+}
+
+/**
+ * Determines if a hexadecimal CSS color string is valid.
+ *
+ * @param $color
+ *   The string to check.
+ *
+ * @return
+ *   TRUE if the string is a valid hexadecimal CSS color string, or FALSE if it
+ *   isn't.
+ */
+function color_valid_hexadecimal_string($color) {
+  return preg_match('/^#([a-f0-9]{3}){1,2}$/iD', $color);
+}
+
+/**
+ * Form validation handler for color_scheme_form().
+ *
+ * @see color_scheme_form_submit()
+ */
+function color_scheme_form_validate($form, &$form_state) {
+  // Only accept hexadecimal CSS color strings to avoid XSS upon use.
+  foreach ($form_state['values']['palette'] as $key => $color) {
+    if (!color_valid_hexadecimal_string($color)) {
+      form_set_error('palette][' . $key, t('%name must be a valid hexadecimal CSS color value.', array('%name' => $form['color']['palette'][$key]['#title'])));
+    }
+  }
+}
+
+/**
+ * Form submission handler for color_scheme_form().
+ *
+ * @see color_scheme_form_validate()
+ */
+function color_scheme_form_submit($form, &$form_state) {
+  // Get theme coloring info.
+  if (!isset($form_state['values']['info'])) {
+    return;
+  }
+  $theme = $form_state['values']['theme'];
+  $info = $form_state['values']['info'];
+
+  // Resolve palette.
+  $palette = $form_state['values']['palette'];
+  if ($form_state['values']['scheme'] != '') {
+    foreach ($palette as $key => $color) {
+      if (isset($info['schemes'][$form_state['values']['scheme']]['colors'][$key])) {
+        $palette[$key] = $info['schemes'][$form_state['values']['scheme']]['colors'][$key];
+      }
+    }
+    $palette += $info['schemes']['default']['colors'];
+  }
+
+  // Make sure enough memory is available, if PHP's memory limit is compiled in.
+  if (function_exists('memory_get_usage')) {
+    // Fetch source image dimensions.
+    $source = drupal_get_path('theme', $theme) . '/' . $info['base_image'];
+    list($width, $height) = getimagesize($source);
+
+    // We need at least a copy of the source and a target buffer of the same
+    // size (both at 32bpp).
+    $required = $width * $height * 8;
+    // We intend to prevent color scheme changes if there isn't enough memory
+    // available.  memory_get_usage(TRUE) returns a more accurate number than
+    // memory_get_usage(), therefore we won't inadvertently reject a color
+    // scheme change based on a faulty memory calculation.
+    $usage = memory_get_usage(TRUE);
+    $memory_limit = ini_get('memory_limit');
+    $size = parse_size($memory_limit);
+    if (!drupal_check_memory_limit($usage + $required, $memory_limit)) {
+      drupal_set_message(t('There is not enough memory available to PHP to change this theme\'s color scheme. You need at least %size more. Check the <a href="@url">PHP documentation</a> for more information.', array('%size' => format_size($usage + $required - $size), '@url' => 'http://www.php.net/manual/ini.core.php#ini.sect.resource-limits')), 'error');
+      return;
+    }
+  }
+
+  // Delete old files.
+  foreach (variable_get('color_' . $theme . '_files', array()) as $file) {
+    @drupal_unlink($file);
+  }
+  if (isset($file) && $file = dirname($file)) {
+    @drupal_rmdir($file);
+  }
+
+  // Don't render the default colorscheme, use the standard theme instead.
+  if (implode(',', color_get_palette($theme, TRUE)) == implode(',', $palette)) {
+    variable_del('color_' . $theme . '_palette');
+    variable_del('color_' . $theme . '_stylesheets');
+    variable_del('color_' . $theme . '_logo');
+    variable_del('color_' . $theme . '_files');
+    variable_del('color_' . $theme . '_screenshot');
+    return;
+  }
+
+  // Prepare target locations for generated files.
+  $id = $theme . '-' . substr(hash('sha256', serialize($palette) . microtime()), 0, 8);
+  $paths['color'] = 'public://color';
+  $paths['target'] = $paths['color'] . '/' . $id;
+  foreach ($paths as $path) {
+    file_prepare_directory($path, FILE_CREATE_DIRECTORY);
+  }
+  $paths['target'] = $paths['target'] . '/';
+  $paths['id'] = $id;
+  $paths['source'] = drupal_get_path('theme', $theme) . '/';
+  $paths['files'] = $paths['map'] = array();
+
+  // Save palette and logo location.
+  variable_set('color_' . $theme . '_palette', $palette);
+  variable_set('color_' . $theme . '_logo', $paths['target'] . 'logo.png');
+
+  // Copy over neutral images.
+  foreach ($info['copy'] as $file) {
+    $base = drupal_basename($file);
+    $source = $paths['source'] . $file;
+    $filepath = file_unmanaged_copy($source, $paths['target'] . $base);
+    $paths['map'][$file] = $base;
+    $paths['files'][] = $filepath;
+  }
+
+  // Render new images, if image has been provided.
+  if ($info['base_image']) {
+    _color_render_images($theme, $info, $paths, $palette);
+  }
+
+  // Rewrite theme stylesheets.
+  $css = array();
+  foreach ($info['css'] as $stylesheet) {
+    // Build a temporary array with LTR and RTL files.
+    $files = array();
+    if (file_exists($paths['source'] . $stylesheet)) {
+      $files[] = $stylesheet;
+
+      $rtl_file = str_replace('.css', '-rtl.css', $stylesheet);
+      if (file_exists($paths['source'] . $rtl_file)) {
+        $files[] = $rtl_file;
+      }
+    }
+
+    foreach ($files as $file) {
+      // Aggregate @imports recursively for each configured top level CSS file
+      // without optimization. Aggregation and optimization will be
+      // handled by drupal_build_css_cache() only.
+      $style = drupal_load_stylesheet($paths['source'] . $file, FALSE);
+
+      // Return the path to where this CSS file originated from, stripping
+      // off the name of the file at the end of the path.
+      $base = base_path() . dirname($paths['source'] . $file) . '/';
+      _drupal_build_css_path(NULL, $base);
+
+      // Prefix all paths within this CSS file, ignoring absolute paths.
+      $style = preg_replace_callback('/url\([\'"]?(?![a-z]+:|\/+)([^\'")]+)[\'"]?\)/i', '_drupal_build_css_path', $style);
+
+      // Rewrite stylesheet with new colors.
+      $style = _color_rewrite_stylesheet($theme, $info, $paths, $palette, $style);
+      $base_file = drupal_basename($file);
+      $css[] = $paths['target'] . $base_file;
+      _color_save_stylesheet($paths['target'] . $base_file, $style, $paths);
+    }
+  }
+
+  // Maintain list of files.
+  variable_set('color_' . $theme . '_stylesheets', $css);
+  variable_set('color_' . $theme . '_files', $paths['files']);
+}
+
+/**
+ * Rewrites the stylesheet to match the colors in the palette.
+ */
+function _color_rewrite_stylesheet($theme, &$info, &$paths, $palette, $style) {
+  $themes = list_themes();
+  // Prepare color conversion table.
+  $conversion = $palette;
+  foreach ($conversion as $k => $v) {
+    $conversion[$k] = drupal_strtolower($v);
+  }
+  $default = color_get_palette($theme, TRUE);
+
+  // Split off the "Don't touch" section of the stylesheet.
+  $split = "Color Module: Don't touch";
+  if (strpos($style, $split) !== FALSE) {
+    list($style, $fixed) = explode($split, $style);
+  }
+
+  // Find all colors in the stylesheet and the chunks in between.
+  $style = preg_split('/(#[0-9a-f]{6}|#[0-9a-f]{3})/i', $style, -1, PREG_SPLIT_DELIM_CAPTURE);
+  $is_color = FALSE;
+  $output = '';
+  $base = 'base';
+
+  // Iterate over all the parts.
+  foreach ($style as $chunk) {
+    if ($is_color) {
+      $chunk = drupal_strtolower($chunk);
+      // Check if this is one of the colors in the default palette.
+      if ($key = array_search($chunk, $default)) {
+        $chunk = $conversion[$key];
+      }
+      // Not a pre-set color. Extrapolate from the base.
+      else {
+        $chunk = _color_shift($palette[$base], $default[$base], $chunk, $info['blend_target']);
+      }
+    }
+    else {
+      // Determine the most suitable base color for the next color.
+
+      // 'a' declarations. Use link.
+      if (preg_match('@[^a-z0-9_-](a)[^a-z0-9_-][^/{]*{[^{]+$@i', $chunk)) {
+        $base = 'link';
+      }
+      // 'color:' styles. Use text.
+      elseif (preg_match('/(?<!-)color[^{:]*:[^{#]*$/i', $chunk)) {
+        $base = 'text';
+      }
+      // Reset back to base.
+      else {
+        $base = 'base';
+      }
+    }
+    $output .= $chunk;
+    $is_color = !$is_color;
+  }
+  // Append fixed colors segment.
+  if (isset($fixed)) {
+    $output .= $fixed;
+  }
+
+  // Replace paths to images.
+  foreach ($paths['map'] as $before => $after) {
+    $before = base_path() . $paths['source'] . $before;
+    $before = preg_replace('`(^|/)(?!../)([^/]+)/../`', '$1', $before);
+    $output = str_replace($before, $after, $output);
+  }
+
+  return $output;
+}
+
+/**
+ * Saves the rewritten stylesheet to disk.
+ */
+function _color_save_stylesheet($file, $style, &$paths) {
+  $filepath = file_unmanaged_save_data($style, $file, FILE_EXISTS_REPLACE);
+  $paths['files'][] = $filepath;
+
+  // Set standard file permissions for webserver-generated files.
+  drupal_chmod($file);
+}
+
+/**
+ * Renders images that match a given palette.
+ */
+function _color_render_images($theme, &$info, &$paths, $palette) {
+  // Prepare template image.
+  $source = $paths['source'] . '/' . $info['base_image'];
+  $source = imagecreatefrompng($source);
+  $width = imagesx($source);
+  $height = imagesy($source);
+
+  // Prepare target buffer.
+  $target = imagecreatetruecolor($width, $height);
+  imagealphablending($target, TRUE);
+
+  // Fill regions of solid color.
+  foreach ($info['fill'] as $color => $fill) {
+    imagefilledrectangle($target, $fill[0], $fill[1], $fill[0] + $fill[2], $fill[1] + $fill[3], _color_gd($target, $palette[$color]));
+  }
+
+  // Render gradients.
+  foreach ($info['gradients'] as $gradient) {
+    // Get direction of the gradient.
+    if (isset($gradient['direction']) && $gradient['direction'] == 'horizontal') {
+      // Horizontal gradient.
+      for ($x = 0; $x < $gradient['dimension'][2]; $x++) {
+        $color = _color_blend($target, $palette[$gradient['colors'][0]], $palette[$gradient['colors'][1]], $x / ($gradient['dimension'][2] - 1));
+        imagefilledrectangle($target, ($gradient['dimension'][0] + $x), $gradient['dimension'][1], ($gradient['dimension'][0] + $x + 1), ($gradient['dimension'][1] + $gradient['dimension'][3]), $color);
+      }
+    }
+    else {
+      // Vertical gradient.
+      for ($y = 0; $y < $gradient['dimension'][3]; $y++) {
+        $color = _color_blend($target, $palette[$gradient['colors'][0]], $palette[$gradient['colors'][1]], $y / ($gradient['dimension'][3] - 1));
+        imagefilledrectangle($target, $gradient['dimension'][0], $gradient['dimension'][1] + $y, $gradient['dimension'][0] + $gradient['dimension'][2], $gradient['dimension'][1] + $y + 1, $color);
+      }
+    }
+  }
+
+  // Blend over template.
+  imagecopy($target, $source, 0, 0, 0, 0, $width, $height);
+
+  // Clean up template image.
+  imagedestroy($source);
+
+  // Cut out slices.
+  foreach ($info['slices'] as $file => $coord) {
+    list($x, $y, $width, $height) = $coord;
+    $base = drupal_basename($file);
+    $image = drupal_realpath($paths['target'] . $base);
+
+    // Cut out slice.
+    if ($file == 'screenshot.png') {
+      $slice = imagecreatetruecolor(150, 90);
+      imagecopyresampled($slice, $target, 0, 0, $x, $y, 150, 90, $width, $height);
+      variable_set('color_' . $theme . '_screenshot', $image);
+    }
+    else {
+      $slice = imagecreatetruecolor($width, $height);
+      imagecopy($slice, $target, 0, 0, $x, $y, $width, $height);
+    }
+
+    // Save image.
+    imagepng($slice, $image);
+    imagedestroy($slice);
+    $paths['files'][] = $image;
+
+    // Set standard file permissions for webserver-generated files
+    drupal_chmod($image);
+
+    // Build before/after map of image paths.
+    $paths['map'][$file] = $base;
+  }
+
+  // Clean up target buffer.
+  imagedestroy($target);
+}
+
+/**
+ * Shifts a given color, using a reference pair and a target blend color.
+ *
+ * Note: this function is significantly different from the JS version, as it
+ * is written to match the blended images perfectly.
+ *
+ * Constraint: if (ref2 == target + (ref1 - target) * delta) for some fraction
+ * delta then (return == target + (given - target) * delta).
+ *
+ * Loose constraint: Preserve relative positions in saturation and luminance
+ * space.
+ */
+function _color_shift($given, $ref1, $ref2, $target) {
+  // We assume that ref2 is a blend of ref1 and target and find
+  // delta based on the length of the difference vectors.
+
+  // delta = 1 - |ref2 - ref1| / |white - ref1|
+  $target = _color_unpack($target, TRUE);
+  $ref1 = _color_unpack($ref1, TRUE);
+  $ref2 = _color_unpack($ref2, TRUE);
+  $numerator = 0;
+  $denominator = 0;
+  for ($i = 0; $i < 3; ++$i) {
+    $numerator += ($ref2[$i] - $ref1[$i]) * ($ref2[$i] - $ref1[$i]);
+    $denominator += ($target[$i] - $ref1[$i]) * ($target[$i] - $ref1[$i]);
+  }
+  $delta = ($denominator > 0) ? (1 - sqrt($numerator / $denominator)) : 0;
+
+  // Calculate the color that ref2 would be if the assumption was true.
+  for ($i = 0; $i < 3; ++$i) {
+    $ref3[$i] = $target[$i] + ($ref1[$i] - $target[$i]) * $delta;
+  }
+
+  // If the assumption is not true, there is a difference between ref2 and ref3.
+  // We measure this in HSL space. Notation: x' = hsl(x).
+  $ref2 = _color_rgb2hsl($ref2);
+  $ref3 = _color_rgb2hsl($ref3);
+  for ($i = 0; $i < 3; ++$i) {
+    $shift[$i] = $ref2[$i] - $ref3[$i];
+  }
+
+  // Take the given color, and blend it towards the target.
+  $given = _color_unpack($given, TRUE);
+  for ($i = 0; $i < 3; ++$i) {
+    $result[$i] = $target[$i] + ($given[$i] - $target[$i]) * $delta;
+  }
+
+  // Finally, we apply the extra shift in HSL space.
+  // Note: if ref2 is a pure blend of ref1 and target, then |shift| = 0.
+  $result = _color_rgb2hsl($result);
+  for ($i = 0; $i < 3; ++$i) {
+    $result[$i] = min(1, max(0, $result[$i] + $shift[$i]));
+  }
+  $result = _color_hsl2rgb($result);
+
+  // Return hex color.
+  return _color_pack($result, TRUE);
+}
+
+/**
+ * Converts a hex triplet into a GD color.
+ */
+function _color_gd($img, $hex) {
+  $c = array_merge(array($img), _color_unpack($hex));
+  return call_user_func_array('imagecolorallocate', $c);
+}
+
+/**
+ * Blends two hex colors and returns the GD color.
+ */
+function _color_blend($img, $hex1, $hex2, $alpha) {
+  $in1 = _color_unpack($hex1);
+  $in2 = _color_unpack($hex2);
+  $out = array($img);
+  for ($i = 0; $i < 3; ++$i) {
+    $out[] = $in1[$i] + ($in2[$i] - $in1[$i]) * $alpha;
+  }
+
+  return call_user_func_array('imagecolorallocate', $out);
+}
+
+/**
+ * Converts a hex color into an RGB triplet.
+ */
+function _color_unpack($hex, $normalize = FALSE) {
+  if (strlen($hex) == 4) {
+    $hex = $hex[1] . $hex[1] . $hex[2] . $hex[2] . $hex[3] . $hex[3];
+  }
+  $c = hexdec($hex);
+  for ($i = 16; $i >= 0; $i -= 8) {
+    $out[] = (($c >> $i) & 0xFF) / ($normalize ? 255 : 1);
+  }
+
+  return $out;
+}
+
+/**
+ * Converts an RGB triplet to a hex color.
+ */
+function _color_pack($rgb, $normalize = FALSE) {
+  $out = 0;
+  foreach ($rgb as $k => $v) {
+    $out |= (($v * ($normalize ? 255 : 1)) << (16 - $k * 8));
+  }
+
+  return '#' . str_pad(dechex($out), 6, 0, STR_PAD_LEFT);
+}
+
+/**
+ * Converts an HSL triplet into RGB.
+ */
+function _color_hsl2rgb($hsl) {
+  $h = $hsl[0];
+  $s = $hsl[1];
+  $l = $hsl[2];
+  $m2 = ($l <= 0.5) ? $l * ($s + 1) : $l + $s - $l*$s;
+  $m1 = $l * 2 - $m2;
+
+  return array(
+    _color_hue2rgb($m1, $m2, $h + 0.33333),
+    _color_hue2rgb($m1, $m2, $h),
+    _color_hue2rgb($m1, $m2, $h - 0.33333),
+  );
+}
+
+/**
+ * Helper function for _color_hsl2rgb().
+ */
+function _color_hue2rgb($m1, $m2, $h) {
+  $h = ($h < 0) ? $h + 1 : (($h > 1) ? $h - 1 : $h);
+  if ($h * 6 < 1) return $m1 + ($m2 - $m1) * $h * 6;
+  if ($h * 2 < 1) return $m2;
+  if ($h * 3 < 2) return $m1 + ($m2 - $m1) * (0.66666 - $h) * 6;
+
+  return $m1;
+}
+
+/**
+ * Converts an RGB triplet to HSL.
+ */
+function _color_rgb2hsl($rgb) {
+  $r = $rgb[0];
+  $g = $rgb[1];
+  $b = $rgb[2];
+  $min = min($r, min($g, $b));
+  $max = max($r, max($g, $b));
+  $delta = $max - $min;
+  $l = ($min + $max) / 2;
+  $s = 0;
+
+  if ($l > 0 && $l < 1) {
+    $s = $delta / ($l < 0.5 ? (2 * $l) : (2 - 2 * $l));
+  }
+
+  $h = 0;
+  if ($delta > 0) {
+    if ($max == $r && $max != $g) $h += ($g - $b) / $delta;
+    if ($max == $g && $max != $b) $h += (2 + ($b - $r) / $delta);
+    if ($max == $b && $max != $r) $h += (4 + ($r - $g) / $delta);
+    $h /= 6;
+  }
+
+  return array($h, $s, $l);
+}
diff --git a/htmltest/modules/color/color.test b/htmltest/modules/color/color.test
new file mode 100644
index 00000000..09043250
--- /dev/null
+++ b/htmltest/modules/color/color.test
@@ -0,0 +1,133 @@
+<?php
+
+/**
+ * @file
+ * Tests for color module.
+ */
+
+/**
+ * Tests the Color module functionality.
+ */
+class ColorTestCase extends DrupalWebTestCase {
+  protected $big_user;
+  protected $themes;
+  protected $colorTests;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Color functionality',
+      'description' => 'Modify the Bartik and Garland theme colors and make sure the changes are reflected on the frontend',
+      'group' => 'Color',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('color');
+
+    // Create users.
+    $this->big_user = $this->drupalCreateUser(array('administer themes'));
+
+    // This tests the color module in both Bartik and Garland.
+    $this->themes = array(
+      'bartik' => array(
+        'palette_input' => 'palette[bg]',
+        'scheme' => 'slate',
+        'scheme_color' => '#3b3b3b',
+      ),
+      'garland' => array(
+        'palette_input' => 'palette[link]',
+        'scheme' => 'greenbeam',
+        'scheme_color' => '#0c7a00',
+      ),
+    );
+    theme_enable(array_keys($this->themes));
+
+    // Array filled with valid and not valid color values
+    $this->colorTests = array(
+      '#000' => TRUE,
+      '#123456' => TRUE,
+      '#abcdef' => TRUE,
+      '#0' => FALSE,
+      '#00' => FALSE,
+      '#0000' => FALSE,
+      '#00000' => FALSE,
+      '123456' => FALSE,
+      '#00000g' => FALSE,
+    );
+  }
+
+  /**
+   * Tests the Color module functionality.
+   */
+  function testColor() {
+    foreach ($this->themes as $theme => $test_values) {
+      $this->_testColor($theme, $test_values);
+    }
+  }
+
+  /**
+   * Tests the Color module functionality using the given theme.
+   */
+  function _testColor($theme, $test_values) {
+    variable_set('theme_default', $theme);
+    $settings_path = 'admin/appearance/settings/' . $theme;
+
+    $this->drupalLogin($this->big_user);
+    $this->drupalGet($settings_path);
+    $this->assertResponse(200);
+    $edit['scheme'] = '';
+    $edit[$test_values['palette_input']] = '#123456';
+    $this->drupalPost($settings_path, $edit, t('Save configuration'));
+
+    $this->drupalGet('<front>');
+    $stylesheets = variable_get('color_' . $theme . '_stylesheets', array());
+    $this->assertPattern('|' . file_create_url($stylesheets[0]) . '|', 'Make sure the color stylesheet is included in the content. (' . $theme . ')');
+
+    $stylesheet_content = join("\n", file($stylesheets[0]));
+    $this->assertTrue(strpos($stylesheet_content, 'color: #123456') !== FALSE, 'Make sure the color we changed is in the color stylesheet. (' . $theme . ')');
+
+    $this->drupalGet($settings_path);
+    $this->assertResponse(200);
+    $edit['scheme'] = $test_values['scheme'];
+    $this->drupalPost($settings_path, $edit, t('Save configuration'));
+
+    $this->drupalGet('<front>');
+    $stylesheets = variable_get('color_' . $theme . '_stylesheets', array());
+    $stylesheet_content = join("\n", file($stylesheets[0]));
+    $this->assertTrue(strpos($stylesheet_content, 'color: ' . $test_values['scheme_color']) !== FALSE, 'Make sure the color we changed is in the color stylesheet. (' . $theme . ')');
+
+    // Test with aggregated CSS turned on.
+    variable_set('preprocess_css', 1);
+    $this->drupalGet('<front>');
+    $stylesheets = variable_get('drupal_css_cache_files', array());
+    $stylesheet_content = '';
+    foreach ($stylesheets as $key => $uri) {
+      $stylesheet_content .= join("\n", file(drupal_realpath($uri)));
+    }
+    $this->assertTrue(strpos($stylesheet_content, 'public://') === FALSE, 'Make sure the color paths have been translated to local paths. (' . $theme . ')');
+    variable_set('preprocess_css', 0);
+  }
+
+  /**
+   * Tests whether the provided color is valid.
+   */
+  function testValidColor() {
+    variable_set('theme_default', 'bartik');
+    $settings_path = 'admin/appearance/settings/bartik';
+
+    $this->drupalLogin($this->big_user);
+    $edit['scheme'] = '';
+
+    foreach ($this->colorTests as $color => $is_valid) {
+      $edit['palette[bg]'] = $color;
+      $this->drupalPost($settings_path, $edit, t('Save configuration'));
+
+      if($is_valid) {
+        $this->assertText('The configuration options have been saved.');
+      }
+      else {
+        $this->assertText('Main background must be a valid hexadecimal CSS color value.');
+      }
+    }
+  }
+}
diff --git a/htmltest/modules/color/images/hook-rtl.png b/htmltest/modules/color/images/hook-rtl.png
new file mode 100644
index 00000000..a26b211e
Binary files /dev/null and b/htmltest/modules/color/images/hook-rtl.png differ
diff --git a/htmltest/modules/color/images/hook.png b/htmltest/modules/color/images/hook.png
new file mode 100644
index 00000000..dc189737
Binary files /dev/null and b/htmltest/modules/color/images/hook.png differ
diff --git a/htmltest/modules/color/images/lock.png b/htmltest/modules/color/images/lock.png
new file mode 100644
index 00000000..9e1e00e5
Binary files /dev/null and b/htmltest/modules/color/images/lock.png differ
diff --git a/htmltest/modules/color/preview.html b/htmltest/modules/color/preview.html
new file mode 100644
index 00000000..e25b7add
--- /dev/null
+++ b/htmltest/modules/color/preview.html
@@ -0,0 +1,7 @@
+<div id="preview">
+  <div id="text">
+    <h2>Lorem ipsum dolor</h2>
+    <p>Sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud <a href="#">exercitation ullamco</a> laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+  </div>
+  <div id="img"></div>
+</div>
\ No newline at end of file
diff --git a/htmltest/modules/color/preview.js b/htmltest/modules/color/preview.js
new file mode 100644
index 00000000..67eef0b0
--- /dev/null
+++ b/htmltest/modules/color/preview.js
@@ -0,0 +1,38 @@
+/**
+ * @file
+ * Attaches preview-related behavior for the Color module.
+ */
+
+(function ($) {
+  Drupal.color = {
+    callback: function(context, settings, form, farb, height, width) {
+      // Solid background.
+      $('#preview', form).css('backgroundColor', $('#palette input[name="palette[base]"]', form).val());
+
+      // Text preview
+      $('#text', form).css('color', $('#palette input[name="palette[text]"]', form).val());
+      $('#text a, #text h2', form).css('color', $('#palette input[name="palette[link]"]', form).val());
+
+      // Set up gradients if there are some.
+      var color_start, color_end;
+      for (i in settings.gradients) {
+        color_start = farb.unpack($('#palette input[name="palette[' + settings.gradients[i]['colors'][0] + ']"]', form).val());
+        color_end = farb.unpack($('#palette input[name="palette[' + settings.gradients[i]['colors'][1] + ']"]', form).val());
+        if (color_start && color_end) {
+          var delta = [];
+          for (j in color_start) {
+            delta[j] = (color_end[j] - color_start[j]) / (settings.gradients[i]['vertical'] ? height[i] : width[i]);
+          }
+          var accum = color_start;
+          // Render gradient lines.
+          $('#gradient-' + i + ' > div', form).each(function () {
+            for (j in accum) {
+              accum[j] += delta[j];
+            }
+            this.style.backgroundColor = farb.pack(accum);
+          });
+        }
+      }
+    }
+  };
+})(jQuery);
diff --git a/htmltest/modules/comment/comment-node-form.js b/htmltest/modules/comment/comment-node-form.js
new file mode 100644
index 00000000..76db2404
--- /dev/null
+++ b/htmltest/modules/comment/comment-node-form.js
@@ -0,0 +1,32 @@
+
+(function ($) {
+
+Drupal.behaviors.commentFieldsetSummaries = {
+  attach: function (context) {
+    $('fieldset.comment-node-settings-form', context).drupalSetSummary(function (context) {
+      return Drupal.checkPlain($('.form-item-comment input:checked', context).next('label').text());
+    });
+
+    // Provide the summary for the node type form.
+    $('fieldset.comment-node-type-settings-form', context).drupalSetSummary(function(context) {
+      var vals = [];
+
+      // Default comment setting.
+      vals.push($(".form-item-comment select option:selected", context).text());
+
+      // Threading.
+      var threading = $(".form-item-comment-default-mode input:checked", context).next('label').text();
+      if (threading) {
+        vals.push(threading);
+      }
+
+      // Comments per page.
+      var number = $(".form-item-comment-default-per-page select option:selected", context).val();
+      vals.push(Drupal.t('@number comments per page', {'@number': number}));
+
+      return Drupal.checkPlain(vals.join(', '));
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/comment/comment-rtl.css b/htmltest/modules/comment/comment-rtl.css
new file mode 100644
index 00000000..39c39296
--- /dev/null
+++ b/htmltest/modules/comment/comment-rtl.css
@@ -0,0 +1,5 @@
+
+.indented {
+  margin-left: 0;
+  margin-right: 25px;
+}
diff --git a/htmltest/modules/comment/comment-wrapper.tpl.php b/htmltest/modules/comment/comment-wrapper.tpl.php
new file mode 100644
index 00000000..c6914592
--- /dev/null
+++ b/htmltest/modules/comment/comment-wrapper.tpl.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to provide an HTML container for comments.
+ *
+ * Available variables:
+ * - $content: The array of content-related elements for the node. Use
+ *   render($content) to print them all, or
+ *   print a subset such as render($content['comment_form']).
+ * - $classes: String of classes that can be used to style contextually through
+ *   CSS. It can be manipulated through the variable $classes_array from
+ *   preprocess functions. The default value has the following:
+ *   - comment-wrapper: The current template type, i.e., "theming hook".
+ * - $title_prefix (array): An array containing additional output populated by
+ *   modules, intended to be displayed in front of the main title tag that
+ *   appears in the template.
+ * - $title_suffix (array): An array containing additional output populated by
+ *   modules, intended to be displayed after the main title tag that appears in
+ *   the template.
+ *
+ * The following variables are provided for contextual information.
+ * - $node: Node object the comments are attached to.
+ * The constants below the variables show the possible values and should be
+ * used for comparison.
+ * - $display_mode
+ *   - COMMENT_MODE_FLAT
+ *   - COMMENT_MODE_THREADED
+ *
+ * Other variables:
+ * - $classes_array: Array of html class attribute values. It is flattened
+ *   into a string within the variable $classes.
+ *
+ * @see template_preprocess_comment_wrapper()
+ *
+ * @ingroup themeable
+ */
+?>
+<div id="comments" class="<?php print $classes; ?>"<?php print $attributes; ?>>
+  <?php if ($content['comments'] && $node->type != 'forum'): ?>
+    <?php print render($title_prefix); ?>
+    <h2 class="title"><?php print t('Comments'); ?></h2>
+    <?php print render($title_suffix); ?>
+  <?php endif; ?>
+
+  <?php print render($content['comments']); ?>
+
+  <?php if ($content['comment_form']): ?>
+    <h2 class="title comment-form"><?php print t('Add new comment'); ?></h2>
+    <?php print render($content['comment_form']); ?>
+  <?php endif; ?>
+</div>
diff --git a/htmltest/modules/comment/comment.admin.inc b/htmltest/modules/comment/comment.admin.inc
new file mode 100644
index 00000000..43b53e27
--- /dev/null
+++ b/htmltest/modules/comment/comment.admin.inc
@@ -0,0 +1,284 @@
+<?php
+
+/**
+ * @file
+ * Admin page callbacks for the comment module.
+ */
+
+/**
+ * Menu callback; present an administrative comment listing.
+ */
+function comment_admin($type = 'new') {
+  $edit = $_POST;
+
+  if (isset($edit['operation']) && ($edit['operation'] == 'delete') && isset($edit['comments']) && $edit['comments']) {
+    return drupal_get_form('comment_multiple_delete_confirm');
+  }
+  else {
+    return drupal_get_form('comment_admin_overview', $type);
+  }
+}
+
+/**
+ * Form builder for the comment overview administration form.
+ *
+ * @param $arg
+ *   Current path's fourth component: the type of overview form ('approval' or
+ *   'new').
+ *
+ * @ingroup forms
+ * @see comment_admin_overview_validate()
+ * @see comment_admin_overview_submit()
+ * @see theme_comment_admin_overview()
+ */
+function comment_admin_overview($form, &$form_state, $arg) {
+  // Build an 'Update options' form.
+  $form['options'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Update options'),
+    '#attributes' => array('class' => array('container-inline')),
+  );
+
+  if ($arg == 'approval') {
+    $options['publish'] = t('Publish the selected comments');
+  }
+  else {
+    $options['unpublish'] = t('Unpublish the selected comments');
+  }
+  $options['delete'] = t('Delete the selected comments');
+
+  $form['options']['operation'] = array(
+    '#type' => 'select',
+    '#title' => t('Operation'),
+    '#title_display' => 'invisible',
+    '#options' => $options,
+    '#default_value' => 'publish',
+  );
+  $form['options']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Update'),
+  );
+
+  // Load the comments that need to be displayed.
+  $status = ($arg == 'approval') ? COMMENT_NOT_PUBLISHED : COMMENT_PUBLISHED;
+  $header = array(
+    'subject' => array('data' => t('Subject'), 'field' => 'subject'),
+    'author' => array('data' => t('Author'), 'field' => 'name'),
+    'posted_in' => array('data' => t('Posted in'), 'field' => 'node_title'),
+    'changed' => array('data' => t('Updated'), 'field' => 'c.changed', 'sort' => 'desc'),
+    'operations' => array('data' => t('Operations')),
+  );
+
+  $query = db_select('comment', 'c')->extend('PagerDefault')->extend('TableSort');
+  $query->join('node', 'n', 'n.nid = c.nid');
+  $query->addField('n', 'title', 'node_title');
+  $query->addTag('node_access');
+  $result = $query
+    ->fields('c', array('cid', 'subject', 'name', 'changed'))
+    ->condition('c.status', $status)
+    ->limit(50)
+    ->orderByHeader($header)
+    ->execute();
+
+  $cids = array();
+
+  // We collect a sorted list of node_titles during the query to attach to the
+  // comments later.
+  foreach ($result as $row) {
+    $cids[] = $row->cid;
+    $node_titles[] = $row->node_title;
+  }
+  $comments = comment_load_multiple($cids);
+
+  // Build a table listing the appropriate comments.
+  $options = array();
+  $destination = drupal_get_destination();
+
+  foreach ($comments as $comment) {
+    // Remove the first node title from the node_titles array and attach to
+    // the comment.
+    $comment->node_title = array_shift($node_titles);
+    $comment_body = field_get_items('comment', $comment, 'comment_body');
+    $options[$comment->cid] = array(
+      'subject' => array(
+        'data' => array(
+          '#type' => 'link',
+          '#title' => $comment->subject,
+          '#href' => 'comment/' . $comment->cid,
+          '#options' => array('attributes' => array('title' => truncate_utf8($comment_body[0]['value'], 128)), 'fragment' => 'comment-' . $comment->cid),
+        ),
+      ),
+      'author' => theme('username', array('account' => $comment)),
+      'posted_in' => array(
+        'data' => array(
+          '#type' => 'link',
+          '#title' => $comment->node_title,
+          '#href' => 'node/' . $comment->nid,
+        ),
+      ),
+      'changed' => format_date($comment->changed, 'short'),
+      'operations' => array(
+        'data' => array(
+          '#type' => 'link',
+          '#title' => t('edit'),
+          '#href' => 'comment/' . $comment->cid . '/edit',
+          '#options' => array('query' => $destination),
+        ),
+      ),
+    );
+  }
+
+  $form['comments'] = array(
+    '#type' => 'tableselect',
+    '#header' => $header,
+    '#options' => $options,
+    '#empty' => t('No comments available.'),
+  );
+
+  $form['pager'] = array('#theme' => 'pager');
+
+  return $form;
+}
+
+/**
+ * Validate comment_admin_overview form submissions.
+ */
+function comment_admin_overview_validate($form, &$form_state) {
+  $form_state['values']['comments'] = array_diff($form_state['values']['comments'], array(0));
+  // We can't execute any 'Update options' if no comments were selected.
+  if (count($form_state['values']['comments']) == 0) {
+    form_set_error('', t('Select one or more comments to perform the update on.'));
+  }
+}
+
+/**
+ * Process comment_admin_overview form submissions.
+ *
+ * Execute the chosen 'Update option' on the selected comments, such as
+ * publishing, unpublishing or deleting.
+ */
+function comment_admin_overview_submit($form, &$form_state) {
+  $operation = $form_state['values']['operation'];
+  $cids = $form_state['values']['comments'];
+
+  if ($operation == 'delete') {
+    comment_delete_multiple($cids);
+  }
+  else {
+    foreach ($cids as $cid => $value) {
+      $comment = comment_load($value);
+
+      if ($operation == 'unpublish') {
+        $comment->status = COMMENT_NOT_PUBLISHED;
+      }
+      elseif ($operation == 'publish') {
+        $comment->status = COMMENT_PUBLISHED;
+      }
+      comment_save($comment);
+    }
+  }
+  drupal_set_message(t('The update has been performed.'));
+  $form_state['redirect'] = 'admin/content/comment';
+  cache_clear_all();
+}
+
+/**
+ * List the selected comments and verify that the admin wants to delete them.
+ *
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @return
+ *   TRUE if the comments should be deleted, FALSE otherwise.
+ * @ingroup forms
+ * @see comment_multiple_delete_confirm_submit()
+ */
+function comment_multiple_delete_confirm($form, &$form_state) {
+  $edit = $form_state['input'];
+
+  $form['comments'] = array(
+    '#prefix' => '<ul>',
+    '#suffix' => '</ul>',
+    '#tree' => TRUE,
+  );
+  // array_filter() returns only elements with actual values.
+  $comment_counter = 0;
+  foreach (array_filter($edit['comments']) as $cid => $value) {
+    $comment = comment_load($cid);
+    if (is_object($comment) && is_numeric($comment->cid)) {
+      $subject = db_query('SELECT subject FROM {comment} WHERE cid = :cid', array(':cid' => $cid))->fetchField();
+      $form['comments'][$cid] = array('#type' => 'hidden', '#value' => $cid, '#prefix' => '<li>', '#suffix' => check_plain($subject) . '</li>');
+      $comment_counter++;
+    }
+  }
+  $form['operation'] = array('#type' => 'hidden', '#value' => 'delete');
+
+  if (!$comment_counter) {
+    drupal_set_message(t('There do not appear to be any comments to delete, or your selected comment was deleted by another administrator.'));
+    drupal_goto('admin/content/comment');
+  }
+  else {
+    return confirm_form($form,
+                        t('Are you sure you want to delete these comments and all their children?'),
+                        'admin/content/comment', t('This action cannot be undone.'),
+                        t('Delete comments'), t('Cancel'));
+  }
+}
+
+/**
+ * Process comment_multiple_delete_confirm form submissions.
+ */
+function comment_multiple_delete_confirm_submit($form, &$form_state) {
+  if ($form_state['values']['confirm']) {
+    comment_delete_multiple(array_keys($form_state['values']['comments']));
+    cache_clear_all();
+    $count = count($form_state['values']['comments']);
+    watchdog('content', 'Deleted @count comments.', array('@count' => $count));
+    drupal_set_message(format_plural($count, 'Deleted 1 comment.', 'Deleted @count comments.'));
+  }
+  $form_state['redirect'] = 'admin/content/comment';
+}
+
+/**
+ * Page callback for comment deletions.
+ */
+function comment_confirm_delete_page($cid) {
+  if ($comment = comment_load($cid)) {
+    return drupal_get_form('comment_confirm_delete', $comment);
+  }
+  return MENU_NOT_FOUND;
+}
+
+/**
+ * Form builder; Builds the confirmation form for deleting a single comment.
+ *
+ * @ingroup forms
+ * @see comment_confirm_delete_submit()
+ */
+function comment_confirm_delete($form, &$form_state, $comment) {
+  $form['#comment'] = $comment;
+  // Always provide entity id in the same form key as in the entity edit form.
+  $form['cid'] = array('#type' => 'value', '#value' => $comment->cid);
+  return confirm_form(
+    $form,
+    t('Are you sure you want to delete the comment %title?', array('%title' => $comment->subject)),
+    'node/' . $comment->nid,
+    t('Any replies to this comment will be lost. This action cannot be undone.'),
+    t('Delete'),
+    t('Cancel'),
+    'comment_confirm_delete');
+}
+
+/**
+ * Process comment_confirm_delete form submissions.
+ */
+function comment_confirm_delete_submit($form, &$form_state) {
+  $comment = $form['#comment'];
+  // Delete the comment and its replies.
+  comment_delete($comment->cid);
+  drupal_set_message(t('The comment and all its replies have been deleted.'));
+  watchdog('content', 'Deleted comment @cid and its replies.', array('@cid' => $comment->cid));
+  // Clear the cache so an anonymous user sees that his comment was deleted.
+  cache_clear_all();
+
+  $form_state['redirect'] = "node/$comment->nid";
+}
diff --git a/htmltest/modules/comment/comment.api.php b/htmltest/modules/comment/comment.api.php
new file mode 100644
index 00000000..05912655
--- /dev/null
+++ b/htmltest/modules/comment/comment.api.php
@@ -0,0 +1,145 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Comment module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * The comment passed validation and is about to be saved.
+ *
+ * Modules may make changes to the comment before it is saved to the database.
+ *
+ * @param $comment
+ *   The comment object.
+ */
+function hook_comment_presave($comment) {
+  // Remove leading & trailing spaces from the comment subject.
+  $comment->subject = trim($comment->subject);
+}
+
+/**
+ * The comment is being inserted.
+ *
+ * @param $comment
+ *   The comment object.
+ */
+function hook_comment_insert($comment) {
+  // Reindex the node when comments are added.
+  search_touch_node($comment->nid);
+}
+
+/**
+ * The comment is being updated.
+ *
+ * @param $comment
+ *   The comment object.
+ */
+function hook_comment_update($comment) {
+  // Reindex the node when comments are updated.
+  search_touch_node($comment->nid);
+}
+
+/**
+ * Comments are being loaded from the database.
+ *
+ * @param $comments
+ *  An array of comment objects indexed by cid.
+ */
+function hook_comment_load($comments) {
+  $result = db_query('SELECT cid, foo FROM {mytable} WHERE cid IN (:cids)', array(':cids' => array_keys($comments)));
+  foreach ($result as $record) {
+    $comments[$record->cid]->foo = $record->foo;
+  }
+}
+
+/**
+ * The comment is being viewed. This hook can be used to add additional data to the comment before theming.
+ *
+ * @param $comment
+ *   Passes in the comment the action is being performed on.
+ * @param $view_mode
+ *   View mode, e.g. 'full', 'teaser'...
+ * @param $langcode
+ *   The language code used for rendering.
+ *
+ * @see hook_entity_view()
+ */
+function hook_comment_view($comment, $view_mode, $langcode) {
+  // how old is the comment
+  $comment->time_ago = time() - $comment->changed;
+}
+
+/**
+ * The comment was built; the module may modify the structured content.
+ *
+ * This hook is called after the content has been assembled in a structured array
+ * and may be used for doing processing which requires that the complete comment
+ * content structure has been built.
+ *
+ * If the module wishes to act on the rendered HTML of the comment rather than the
+ * structured content array, it may use this hook to add a #post_render callback.
+ * Alternatively, it could also implement hook_preprocess_comment(). See
+ * drupal_render() and theme() documentation respectively for details.
+ *
+ * @param $build
+ *   A renderable array representing the comment.
+ *
+ * @see comment_view()
+ * @see hook_entity_view_alter()
+ */
+function hook_comment_view_alter(&$build) {
+  // Check for the existence of a field added by another module.
+  if ($build['#view_mode'] == 'full' && isset($build['an_additional_field'])) {
+    // Change its weight.
+    $build['an_additional_field']['#weight'] = -10;
+  }
+
+  // Add a #post_render callback to act on the rendered HTML of the comment.
+  $build['#post_render'][] = 'my_module_comment_post_render';
+}
+
+/**
+ * The comment is being published by the moderator.
+ *
+ * @param $comment
+ *   Passes in the comment the action is being performed on.
+ * @return
+ *   Nothing.
+ */
+function hook_comment_publish($comment) {
+  drupal_set_message(t('Comment: @subject has been published', array('@subject' => $comment->subject)));
+}
+
+/**
+ * The comment is being unpublished by the moderator.
+ *
+ * @param $comment
+ *   Passes in the comment the action is being performed on.
+ * @return
+ *   Nothing.
+ */
+function hook_comment_unpublish($comment) {
+  drupal_set_message(t('Comment: @subject has been unpublished', array('@subject' => $comment->subject)));
+}
+
+/**
+ * The comment is being deleted by the moderator.
+ *
+ * @param $comment
+ *   Passes in the comment the action is being performed on.
+ * @return
+ *   Nothing.
+ */
+function hook_comment_delete($comment) {
+  drupal_set_message(t('Comment: @subject has been deleted', array('@subject' => $comment->subject)));
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/comment/comment.css b/htmltest/modules/comment/comment.css
new file mode 100644
index 00000000..a55f527c
--- /dev/null
+++ b/htmltest/modules/comment/comment.css
@@ -0,0 +1,13 @@
+
+#comments {
+  margin-top: 15px;
+}
+.indented {
+  margin-left: 25px; /* LTR */
+}
+.comment-unpublished {
+  background-color: #fff4f4;
+}
+.comment-preview {
+  background-color: #ffffea;
+}
diff --git a/htmltest/modules/comment/comment.info b/htmltest/modules/comment/comment.info
new file mode 100644
index 00000000..c2723b64
--- /dev/null
+++ b/htmltest/modules/comment/comment.info
@@ -0,0 +1,16 @@
+name = Comment
+description = Allows users to comment on and discuss published content.
+package = Core
+version = VERSION
+core = 7.x
+dependencies[] = text
+files[] = comment.module
+files[] = comment.test
+configure = admin/content/comment
+stylesheets[all][] = comment.css
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/comment/comment.install b/htmltest/modules/comment/comment.install
new file mode 100644
index 00000000..e4da58f3
--- /dev/null
+++ b/htmltest/modules/comment/comment.install
@@ -0,0 +1,578 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the comment module.
+ */
+
+/**
+ * Implements hook_uninstall().
+ */
+function comment_uninstall() {
+  // Delete comment_body field.
+  field_delete_field('comment_body');
+
+  // Remove variables.
+  variable_del('comment_block_count');
+  $node_types = array_keys(node_type_get_types());
+  foreach ($node_types as $node_type) {
+    field_attach_delete_bundle('comment', 'comment_node_' . $node_type);
+    variable_del('comment_' . $node_type);
+    variable_del('comment_anonymous_' . $node_type);
+    variable_del('comment_controls_' . $node_type);
+    variable_del('comment_default_mode_' . $node_type);
+    variable_del('comment_default_order_' . $node_type);
+    variable_del('comment_default_per_page_' . $node_type);
+    variable_del('comment_form_location_' . $node_type);
+    variable_del('comment_preview_' . $node_type);
+    variable_del('comment_subject_field_' . $node_type);
+  }
+}
+
+/**
+ * Implements hook_enable().
+ */
+function comment_enable() {
+  // Insert records into the node_comment_statistics for nodes that are missing.
+  $query = db_select('node', 'n');
+  $query->leftJoin('node_comment_statistics', 'ncs', 'ncs.nid = n.nid');
+  $query->addField('n', 'created', 'last_comment_timestamp');
+  $query->addField('n', 'uid', 'last_comment_uid');
+  $query->addField('n', 'nid');
+  $query->addExpression('0', 'comment_count');
+  $query->addExpression('NULL', 'last_comment_name');
+  $query->isNull('ncs.comment_count');
+
+  db_insert('node_comment_statistics')
+    ->from($query)
+    ->execute();
+}
+
+/**
+ * Implements hook_modules_enabled().
+ *
+ * Creates comment body fields for node types existing before the comment module
+ * is enabled. We use hook_modules_enabled() rather than hook_enable() so we can
+ * react to node types of existing modules, and those of modules being enabled
+ * both before and after comment module in the loop of module_enable().
+ *
+ * There is a separate comment bundle for each node type to allow for
+ * per-node-type customization of comment fields. Each one of these bundles
+ * needs a comment body field instance. A comment bundle is needed even for
+ * node types whose comments are disabled by default, because individual nodes
+ * may override that default.
+ *
+ * @see comment_node_type_insert()
+ */
+function comment_modules_enabled($modules) {
+  // Only react if comment module is one of the modules being enabled.
+  // hook_node_type_insert() is used to create body fields while the comment
+  // module is enabled.
+  if (in_array('comment', $modules)) {
+    // Ensure that the list of node types reflects newly enabled modules.
+    node_types_rebuild();
+
+    // Create comment body fields for each node type, if needed.
+    foreach (node_type_get_types() as $type => $info) {
+      _comment_body_field_create($info);
+    }
+  }
+}
+
+/**
+ * Implements hook_update_dependencies().
+ */
+function comment_update_dependencies() {
+  // comment_update_7005() creates the comment body field and therefore must
+  // run after all Field modules have been enabled, which happens in
+  // system_update_7027().
+  $dependencies['comment'][7005] = array(
+    'system' => 7027,
+  );
+
+  // comment_update_7006() needs to query the {filter_format} table to get a
+  // list of existing text formats, so it must run after filter_update_7000(),
+  // which creates that table.
+  $dependencies['comment'][7006] = array(
+    'filter' => 7000,
+  );
+
+  return $dependencies;
+}
+
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Rename comment display setting variables.
+ */
+function comment_update_7000() {
+  $types = _update_7000_node_get_types();
+  foreach ($types as $type => $type_object) {
+    variable_del('comment_default_order' . $type);
+
+    // Drupal 6 had four display modes:
+    // - COMMENT_MODE_FLAT_COLLAPSED = 1
+    // - COMMENT_MODE_FLAT_EXPANDED = 2
+    // - COMMENT_MODE_THREADED_COLLAPSED = 3
+    // - COMMENT_MODE_THREADED_EXPANDED = 4
+    //
+    // Drupal 7 doesn't support collapsed/expanded modes anymore, so we
+    // migrate all the flat modes to COMMENT_MODE_FLAT (0) and all the threaded
+    // modes to COMMENT_MODE_THREADED (1).
+    $setting = variable_get('comment_default_mode_' . $type, 4);
+    if ($setting == 3 || $setting == 4) {
+      variable_set('comment_default_mode_' . $type, 1);
+    }
+    else {
+      variable_set('comment_default_mode_' . $type, 0);
+    }
+
+    // There were only two comment modes in the past:
+    // - 1 was 'required' previously, convert into DRUPAL_REQUIRED (2).
+    // - 0 was 'optional' previously, convert into DRUPAL_OPTIONAL (1).
+    $preview = variable_get('comment_preview_' . $type, 1) ? 2 : 1;
+    variable_set('comment_preview_' . $type, $preview);
+  }
+}
+
+/**
+ * Change comment status from published being 0 to being 1
+ */
+function comment_update_7001() {
+  // Choose a temporary status value different from the existing status values.
+  $tmp_status = db_query('SELECT MAX(status) FROM {comments}')->fetchField() + 1;
+
+  $changes = array(
+    0 => $tmp_status,
+    1 => 0,
+    $tmp_status => 1,
+  );
+
+  foreach ($changes as $old => $new) {
+    db_update('comments')
+      ->fields(array('status' => $new))
+      ->condition('status', $old)
+      ->execute();
+  }
+}
+
+/**
+ * Rename {comments} table to {comment} and upgrade it.
+ */
+function comment_update_7002() {
+  db_rename_table('comments', 'comment');
+
+  // Add user-related indexes. These may already exist from Drupal 6.
+  if (!db_index_exists('comment', 'comment_uid')) {
+    db_add_index('comment', 'comment_uid', array('uid'));
+    db_add_index('node_comment_statistics', 'last_comment_uid', array('last_comment_uid'));
+  }
+
+  // Create a language column.
+  db_add_field('comment', 'language', array(
+    'type' => 'varchar',
+    'length' => 12,
+    'not null' => TRUE,
+    'default' => '',
+  ));
+  db_add_index('comment', 'comment_nid_language', array('nid', 'language'));
+}
+
+/**
+ * Split {comment}.timestamp into 'created' and 'changed', improve indexing on {comment}.
+ */
+function comment_update_7003() {
+  // Drop the old indexes.
+  db_drop_index('comment', 'status');
+  db_drop_index('comment', 'pid');
+
+  // Create a created column.
+  db_add_field('comment', 'created', array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+  ));
+
+  // Rename the timestamp column to changed.
+  db_change_field('comment', 'timestamp', 'changed', array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+  ));
+
+  // Migrate the data.
+  // @todo db_update() should support this.
+  db_query('UPDATE {comment} SET created = changed');
+
+  // Recreate the indexes.
+  // The 'comment_num_new' index is optimized for comment_num_new()
+  // and comment_new_page_count().
+  db_add_index('comment', 'comment_num_new', array('nid', 'status', 'created', 'cid', 'thread'));
+  db_add_index('comment', 'comment_pid_status', array('pid', 'status'));
+}
+
+/**
+ * Upgrade the {node_comment_statistics} table.
+ */
+function comment_update_7004() {
+  db_add_field('node_comment_statistics', 'cid', array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'description' => 'The {comment}.cid of the last comment.',
+  ));
+  db_add_index('node_comment_statistics', 'cid', array('cid'));
+
+  // The comment_count index may have been added in Drupal 6.
+  if (!db_index_exists('node_comment_statistics', 'comment_count')) {
+    // Add an index on the comment_count.
+    db_add_index('node_comment_statistics', 'comment_count', array('comment_count'));
+  }
+}
+
+/**
+ * Create the comment_body field.
+ */
+function comment_update_7005() {
+  // Create comment body field.
+  $field = array(
+    'field_name' => 'comment_body',
+    'type' => 'text_long',
+    'module' => 'text',
+    'entity_types' => array(
+      'comment',
+    ),
+    'settings' => array(),
+    'cardinality' => 1,
+  );
+  _update_7000_field_create_field($field);
+
+  // Add the field to comments for all existing bundles.
+  $generic_instance = array(
+    'entity_type' => 'comment',
+    'label' => t('Comment'),
+    'settings' => array(
+      'text_processing' => 1,
+    ),
+    'required' => TRUE,
+    'display' => array(
+      'default' => array(
+        'label' => 'hidden',
+        'type' => 'text_default',
+        'weight' => 0,
+        'settings' => array(),
+        'module' => 'text',
+      ),
+    ),
+    'widget' => array(
+      'type' => 'text_textarea',
+      'settings' => array(
+        'rows' => 5,
+      ),
+      'weight' => 0,
+      'module' => 'text',
+    ),
+    'description' => '',
+  );
+
+  $types = _update_7000_node_get_types();
+  foreach ($types as $type => $type_object) {
+    $instance = $generic_instance;
+    $instance['bundle'] = 'comment_node_' . $type;
+    _update_7000_field_create_instance($field, $instance);
+  }
+}
+
+/**
+ * Migrate data from the comment field to field storage.
+ */
+function comment_update_7006(&$sandbox) {
+  // This is a multipass update. First set up some comment variables.
+  if (empty($sandbox['total'])) {
+    $comments = (bool) db_query_range('SELECT 1 FROM {comment}', 0, 1)->fetchField();
+    $sandbox['types'] = array();
+    if ($comments) {
+      $sandbox['types'] = array_keys(_update_7000_node_get_types());
+    }
+    $sandbox['total'] = count($sandbox['types']);
+  }
+
+  if (!empty($sandbox['types'])) {
+    $type = array_shift($sandbox['types']);
+
+    $query = db_select('comment', 'c');
+    $query->innerJoin('node', 'n', 'c.nid = n.nid AND n.type = :type', array(':type' => $type));
+    $query->addField('c', 'cid', 'entity_id');
+    $query->addExpression("'comment_node_$type'", 'bundle');
+    $query->addExpression("'comment'", 'entity_type');
+    $query->addExpression('0', 'deleted');
+    $query->addExpression("'" . LANGUAGE_NONE . "'", 'language');
+    $query->addExpression('0', 'delta');
+    $query->addField('c', 'comment', 'comment_body_value');
+    $query->addField('c', 'format', 'comment_body_format');
+
+    db_insert('field_data_comment_body')
+      ->from($query)
+      ->execute();
+
+    $sandbox['#finished'] = 1 - count($sandbox['types']) / $sandbox['total'];
+  }
+
+  // On the last pass of the update, $sandbox['types'] will be empty.
+  if (empty($sandbox['types'])) {
+    // Update the comment body text formats. For an explanation of these
+    // updates, see the code comments in user_update_7010().
+    db_update('field_data_comment_body')
+      ->fields(array('comment_body_format' => NULL))
+      ->condition('comment_body_value', '')
+      ->condition('comment_body_format', 0)
+      ->execute();
+    $existing_formats = db_query("SELECT format FROM {filter_format}")->fetchCol();
+    $default_format = variable_get('filter_default_format', 1);
+    db_update('field_data_comment_body')
+      ->fields(array('comment_body_format' => $default_format))
+      ->isNotNull('comment_body_format')
+      ->condition('comment_body_format', $existing_formats, 'NOT IN')
+      ->execute();
+
+    // Finally, remove the old comment data.
+    db_drop_field('comment', 'comment');
+    db_drop_field('comment', 'format');
+  }
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x".
+ */
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Add an index to the created column.
+ */
+function comment_update_7007() {
+  db_add_index('comment', 'comment_created', array('created'));
+}
+
+/**
+ * Update database to match Drupal 7 schema.
+ */
+function comment_update_7008() {
+  // Update default status to 1.
+  db_change_field('comment', 'status', 'status', array(
+    'type' => 'int',
+    'unsigned' => TRUE,
+    'not null' => TRUE,
+    'default' => 1,
+    'size' => 'tiny',
+  ));
+
+  // Realign indexes.
+  db_drop_index('comment', 'comment_status_pid');
+  db_add_index('comment', 'comment_status_pid', array('pid', 'status'));
+  db_drop_index('comment', 'comment_pid_status');
+  db_drop_index('comment', 'nid');
+}
+
+/**
+ * Change the last_comment_timestamp column description.
+ */
+function comment_update_7009() {
+  db_change_field('node_comment_statistics', 'last_comment_timestamp', 'last_comment_timestamp', array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'description' => 'The Unix timestamp of the last comment that was posted within this node, from {comment}.changed.',
+  ));
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra".
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function comment_schema() {
+  $schema['comment'] = array(
+    'description' => 'Stores comments and associated data.',
+    'fields' => array(
+      'cid' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique comment ID.',
+      ),
+      'pid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {comment}.cid to which this comment is a reply. If set to 0, this comment is not a reply to an existing comment.',
+      ),
+      'nid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {node}.nid to which this comment is a reply.',
+      ),
+      'uid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {users}.uid who authored the comment. If set to 0, this comment was created by an anonymous user.',
+      ),
+      'subject' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The comment title.',
+      ),
+      'hostname' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => "The author's host name.",
+      ),
+      'created' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The time that the comment was created, as a Unix timestamp.',
+      ),
+      'changed' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The time that the comment was last edited, as a Unix timestamp.',
+      ),
+      'status' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 1,
+        'size' => 'tiny',
+        'description' => 'The published status of a comment. (0 = Not Published, 1 = Published)',
+      ),
+      'thread' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'description' => "The vancode representation of the comment's place in a thread.",
+      ),
+      'name' => array(
+        'type' => 'varchar',
+        'length' => 60,
+        'not null' => FALSE,
+        'description' => "The comment author's name. Uses {users}.name if the user is logged in, otherwise uses the value typed into the comment form.",
+      ),
+      'mail' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => FALSE,
+        'description' => "The comment author's e-mail address from the comment form, if user is anonymous, and the 'Anonymous users may/must leave their contact information' setting is turned on.",
+      ),
+      'homepage' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => FALSE,
+        'description' => "The comment author's home page address from the comment form, if user is anonymous, and the 'Anonymous users may/must leave their contact information' setting is turned on.",
+      ),
+      'language' => array(
+        'description' => 'The {languages}.language of this comment.',
+        'type' => 'varchar',
+        'length' => 12,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+    ),
+    'indexes' => array(
+      'comment_status_pid' => array('pid', 'status'),
+      'comment_num_new' => array('nid', 'status', 'created', 'cid', 'thread'),
+      'comment_uid' => array('uid'),
+      'comment_nid_language' => array('nid', 'language'),
+      'comment_created' => array('created'),
+    ),
+    'primary key' => array('cid'),
+    'foreign keys' => array(
+      'comment_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+      'comment_author' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid'),
+      ),
+    ),
+  );
+
+  $schema['node_comment_statistics'] = array(
+    'description' => 'Maintains statistics of node and comments posts to show "new" and "updated" flags.',
+    'fields' => array(
+      'nid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {node}.nid for which the statistics are compiled.',
+      ),
+      'cid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {comment}.cid of the last comment.',
+      ),
+      'last_comment_timestamp' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The Unix timestamp of the last comment that was posted within this node, from {comment}.changed.',
+      ),
+      'last_comment_name' => array(
+        'type' => 'varchar',
+        'length' => 60,
+        'not null' => FALSE,
+        'description' => 'The name of the latest author to post a comment on this node, from {comment}.name.',
+      ),
+      'last_comment_uid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The user ID of the latest author to post a comment on this node, from {comment}.uid.',
+      ),
+      'comment_count' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The total number of comments on this node.',
+      ),
+    ),
+    'primary key' => array('nid'),
+    'indexes' => array(
+      'node_comment_timestamp' => array('last_comment_timestamp'),
+      'comment_count' => array('comment_count'),
+      'last_comment_uid' => array('last_comment_uid'),
+    ),
+    'foreign keys' => array(
+      'statistics_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+      'last_comment_author' => array(
+        'table' => 'users',
+        'columns' => array(
+          'last_comment_uid' => 'uid',
+        ),
+      ),
+    ),
+  );
+
+  return $schema;
+}
diff --git a/htmltest/modules/comment/comment.module b/htmltest/modules/comment/comment.module
new file mode 100644
index 00000000..6f6c04b0
--- /dev/null
+++ b/htmltest/modules/comment/comment.module
@@ -0,0 +1,2739 @@
+<?php
+
+/**
+ * @file
+ * Enables users to comment on published content.
+ *
+ * When enabled, the Drupal comment module creates a discussion
+ * board for each Drupal node. Users can post comments to discuss
+ * a forum topic, weblog post, story, collaborative book page, etc.
+ */
+
+/**
+ * Comment is awaiting approval.
+ */
+define('COMMENT_NOT_PUBLISHED', 0);
+
+/**
+ * Comment is published.
+ */
+define('COMMENT_PUBLISHED', 1);
+
+/**
+ * Comments are displayed in a flat list - expanded.
+ */
+define('COMMENT_MODE_FLAT', 0);
+
+/**
+ * Comments are displayed as a threaded list - expanded.
+ */
+define('COMMENT_MODE_THREADED', 1);
+
+/**
+ * Anonymous posters cannot enter their contact information.
+ */
+define('COMMENT_ANONYMOUS_MAYNOT_CONTACT', 0);
+
+/**
+ * Anonymous posters may leave their contact information.
+ */
+define('COMMENT_ANONYMOUS_MAY_CONTACT', 1);
+
+/**
+ * Anonymous posters are required to leave their contact information.
+ */
+define('COMMENT_ANONYMOUS_MUST_CONTACT', 2);
+
+/**
+ * Comment form should be displayed on a separate page.
+ */
+define('COMMENT_FORM_SEPARATE_PAGE', 0);
+
+/**
+ * Comment form should be shown below post or list of comments.
+ */
+define('COMMENT_FORM_BELOW', 1);
+
+/**
+ * Comments for this node are hidden.
+ */
+define('COMMENT_NODE_HIDDEN', 0);
+
+/**
+ * Comments for this node are closed.
+ */
+define('COMMENT_NODE_CLOSED', 1);
+
+/**
+ * Comments for this node are open.
+ */
+define('COMMENT_NODE_OPEN', 2);
+
+/**
+ * Implements hook_help().
+ */
+function comment_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#comment':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Comment module allows users to comment on site content, set commenting defaults and permissions, and moderate comments. For more information, see the online handbook entry for <a href="@comment">Comment module</a>.', array('@comment' => 'http://drupal.org/documentation/modules/comment/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Default and custom settings') . '</dt>';
+      $output .= '<dd>' . t("Each <a href='@content-type'>content type</a> can have its own default comment settings configured as: <em>Open</em> to allow new comments, <em>Hidden</em> to hide existing comments and prevent new comments, or <em>Closed</em> to view existing comments, but prevent new comments. These defaults will apply to all new content created (changes to the settings on existing content must be done manually). Other comment settings can also be customized per content type, and can be overridden for any given item of content. When a comment has no replies, it remains editable by its author, as long as the author has a user account and is logged in.", array('@content-type' => url('admin/structure/types'))) . '</dd>';
+      $output .= '<dt>' . t('Comment approval') . '</dt>';
+      $output .= '<dd>' . t("Comments from users who have the <em>Skip comment approval</em> permission are published immediately. All other comments are placed in the <a href='@comment-approval'>Unapproved comments</a> queue, until a user who has permission to <em>Administer comments</em> publishes or deletes them. Published comments can be bulk managed on the <a href='@admin-comment'>Published comments</a> administration page.", array('@comment-approval' => url('admin/content/comment/approval'), '@admin-comment' => url('admin/content/comment'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_entity_info().
+ */
+function comment_entity_info() {
+  $return = array(
+    'comment' => array(
+      'label' => t('Comment'),
+      'base table' => 'comment',
+      'uri callback' => 'comment_uri',
+      'fieldable' => TRUE,
+      'controller class' => 'CommentController',
+      'entity keys' => array(
+        'id' => 'cid',
+        'bundle' => 'node_type',
+        'label' => 'subject',
+        'language' => 'language',
+      ),
+      'bundles' => array(),
+      'view modes' => array(
+        'full' => array(
+          'label' => t('Full comment'),
+          'custom settings' => FALSE,
+        ),
+      ),
+      'static cache' => FALSE,
+    ),
+  );
+
+  foreach (node_type_get_names() as $type => $name) {
+    $return['comment']['bundles']['comment_node_' . $type] = array(
+      'label' => t('@node_type comment', array('@node_type' => $name)),
+      // Provide the node type/bundle name for other modules, so it does not
+      // have to be extracted manually from the bundle name.
+      'node bundle' => $type,
+      'admin' => array(
+        // Place the Field UI paths for comments one level below the
+        // corresponding paths for nodes, so that they appear in the same set
+        // of local tasks. Note that the paths use a different placeholder name
+        // and thus a different menu loader callback, so that Field UI page
+        // callbacks get a comment bundle name from the node type in the URL.
+        // See comment_node_type_load() and comment_menu_alter().
+        'path' => 'admin/structure/types/manage/%comment_node_type/comment',
+        'bundle argument' => 4,
+        'real path' => 'admin/structure/types/manage/' . str_replace('_', '-', $type) . '/comment',
+        'access arguments' => array('administer content types'),
+      ),
+    );
+  }
+
+  return $return;
+}
+
+/**
+ * Menu loader callback for Field UI paths.
+ *
+ * Return a comment bundle name from a node type in the URL.
+ */
+function comment_node_type_load($name) {
+  if ($type = node_type_get_type(strtr($name, array('-' => '_')))) {
+    return 'comment_node_' . $type->type;
+  }
+}
+
+/**
+ * Implements callback_entity_info_uri().
+ */
+function comment_uri($comment) {
+  return array(
+    'path' => 'comment/' . $comment->cid,
+    'options' => array('fragment' => 'comment-' . $comment->cid),
+  );
+}
+
+/**
+ * Implements hook_field_extra_fields().
+ */
+function comment_field_extra_fields() {
+  $return = array();
+
+  foreach (node_type_get_types() as $type) {
+    if (variable_get('comment_subject_field_' . $type->type, 1) == 1) {
+      $return['comment']['comment_node_' . $type->type] = array(
+        'form' => array(
+          'author' => array(
+            'label' => t('Author'),
+            'description' => t('Author textfield'),
+            'weight' => -2,
+          ),
+          'subject' => array(
+            'label' => t('Subject'),
+            'description' => t('Subject textfield'),
+            'weight' => -1,
+          ),
+        ),
+      );
+    }
+  }
+
+  return $return;
+}
+
+/**
+ * Implements hook_theme().
+ */
+function comment_theme() {
+  return array(
+    'comment_block' => array(
+      'variables' => array(),
+    ),
+    'comment_preview' => array(
+      'variables' => array('comment' => NULL),
+    ),
+    'comment' => array(
+      'template' => 'comment',
+      'render element' => 'elements',
+    ),
+    'comment_post_forbidden' => array(
+      'variables' => array('node' => NULL),
+    ),
+    'comment_wrapper' => array(
+      'template' => 'comment-wrapper',
+      'render element' => 'content',
+    ),
+  );
+}
+
+/**
+ * Implements hook_menu().
+ */
+function comment_menu() {
+  $items['admin/content/comment'] = array(
+    'title' => 'Comments',
+    'description' => 'List and edit site comments and the comment approval queue.',
+    'page callback' => 'comment_admin',
+    'access arguments' => array('administer comments'),
+    'type' => MENU_LOCAL_TASK | MENU_NORMAL_ITEM,
+    'file' => 'comment.admin.inc',
+  );
+  // Tabs begin here.
+  $items['admin/content/comment/new'] = array(
+    'title' => 'Published comments',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['admin/content/comment/approval'] = array(
+    'title' => 'Unapproved comments',
+    'title callback' => 'comment_count_unpublished',
+    'page arguments' => array('approval'),
+    'access arguments' => array('administer comments'),
+    'type' => MENU_LOCAL_TASK,
+  );
+  $items['comment/%'] = array(
+    'title' => 'Comment permalink',
+    'page callback' => 'comment_permalink',
+    'page arguments' => array(1),
+    'access arguments' => array('access comments'),
+  );
+  $items['comment/%/view'] = array(
+    'title' => 'View comment',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  // Every other comment path uses %, but this one loads the comment directly,
+  // so we don't end up loading it twice (in the page and access callback).
+  $items['comment/%comment/edit'] = array(
+    'title' => 'Edit',
+    'page callback' => 'comment_edit_page',
+    'page arguments' => array(1),
+    'access callback' => 'comment_access',
+    'access arguments' => array('edit', 1),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 0,
+  );
+  $items['comment/%/approve'] = array(
+    'title' => 'Approve',
+    'page callback' => 'comment_approve',
+    'page arguments' => array(1),
+    'access arguments' => array('administer comments'),
+    'file' => 'comment.pages.inc',
+    'weight' => 1,
+  );
+  $items['comment/%/delete'] = array(
+    'title' => 'Delete',
+    'page callback' => 'comment_confirm_delete_page',
+    'page arguments' => array(1),
+    'access arguments' => array('administer comments'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'comment.admin.inc',
+    'weight' => 2,
+  );
+  $items['comment/reply/%node'] = array(
+    'title' => 'Add new comment',
+    'page callback' => 'comment_reply',
+    'page arguments' => array(2),
+    'access callback' => 'node_access',
+    'access arguments' => array('view', 2),
+    'file' => 'comment.pages.inc',
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_menu_alter().
+ */
+function comment_menu_alter(&$items) {
+  // Add comments to the description for admin/content.
+  $items['admin/content']['description'] = 'Administer content and comments.';
+
+  // Adjust the Field UI tabs on admin/structure/types/manage/[node-type].
+  // See comment_entity_info().
+  $items['admin/structure/types/manage/%comment_node_type/comment/fields']['title'] = 'Comment fields';
+  $items['admin/structure/types/manage/%comment_node_type/comment/fields']['weight'] = 3;
+  $items['admin/structure/types/manage/%comment_node_type/comment/display']['title'] = 'Comment display';
+  $items['admin/structure/types/manage/%comment_node_type/comment/display']['weight'] = 4;
+}
+
+/**
+ * Returns a menu title which includes the number of unapproved comments.
+ */
+function comment_count_unpublished() {
+  $count = db_query('SELECT COUNT(cid) FROM {comment} WHERE status = :status', array(
+    ':status' => COMMENT_NOT_PUBLISHED,
+  ))->fetchField();
+  return t('Unapproved comments (@count)', array('@count' => $count));
+}
+
+/**
+ * Implements hook_node_type_insert().
+ *
+ * Creates a comment body field for a node type created while the comment module
+ * is enabled. For node types created before the comment module is enabled,
+ * hook_modules_enabled() serves to create the body fields.
+ *
+ * @see comment_modules_enabled()
+ */
+function comment_node_type_insert($info) {
+  _comment_body_field_create($info);
+}
+
+/**
+ * Implements hook_node_type_update().
+ */
+function comment_node_type_update($info) {
+  if (!empty($info->old_type) && $info->type != $info->old_type) {
+    field_attach_rename_bundle('comment', 'comment_node_' . $info->old_type, 'comment_node_' . $info->type);
+  }
+}
+
+/**
+ * Implements hook_node_type_delete().
+ */
+function comment_node_type_delete($info) {
+  field_attach_delete_bundle('comment', 'comment_node_' . $info->type);
+  $settings = array(
+    'comment',
+    'comment_default_mode',
+    'comment_default_per_page',
+    'comment_anonymous',
+    'comment_subject_field',
+    'comment_preview',
+    'comment_form_location',
+  );
+  foreach ($settings as $setting) {
+    variable_del($setting . '_' . $info->type);
+  }
+}
+
+ /**
+ * Creates a comment_body field instance for a given node type.
+ */
+function _comment_body_field_create($info) {
+  // Create the field if needed.
+  if (!field_read_field('comment_body', array('include_inactive' => TRUE))) {
+    $field = array(
+      'field_name' => 'comment_body',
+      'type' => 'text_long',
+      'entity_types' => array('comment'),
+    );
+    field_create_field($field);
+  }
+  // Create the instance if needed.
+  if (!field_read_instance('comment', 'comment_body', 'comment_node_' . $info->type, array('include_inactive' => TRUE))) {
+    field_attach_create_bundle('comment', 'comment_node_' . $info->type);
+    // Attaches the body field by default.
+    $instance = array(
+      'field_name' => 'comment_body',
+      'label' => 'Comment',
+      'entity_type' => 'comment',
+      'bundle' => 'comment_node_' . $info->type,
+      'settings' => array('text_processing' => 1),
+      'required' => TRUE,
+      'display' => array(
+        'default' => array(
+          'label' => 'hidden',
+          'type' => 'text_default',
+          'weight' => 0,
+        ),
+      ),
+    );
+    field_create_instance($instance);
+  }
+}
+
+/**
+ * Implements hook_permission().
+ */
+function comment_permission() {
+  return array(
+    'administer comments' => array(
+      'title' => t('Administer comments and comment settings'),
+    ),
+    'access comments' => array(
+      'title' => t('View comments'),
+    ),
+    'post comments' => array(
+      'title' => t('Post comments'),
+    ),
+    'skip comment approval' => array(
+      'title' => t('Skip comment approval'),
+    ),
+    'edit own comments' => array(
+      'title' => t('Edit own comments'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function comment_block_info() {
+  $blocks['recent']['info'] = t('Recent comments');
+  $blocks['recent']['properties']['administrative'] = TRUE;
+
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_configure().
+ */
+function comment_block_configure($delta = '') {
+  $form['comment_block_count'] = array(
+    '#type' => 'select',
+    '#title' => t('Number of recent comments'),
+    '#default_value' => variable_get('comment_block_count', 10),
+    '#options' => drupal_map_assoc(array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 30)),
+  );
+
+  return $form;
+}
+
+/**
+ * Implements hook_block_save().
+ */
+function comment_block_save($delta = '', $edit = array()) {
+  variable_set('comment_block_count', (int) $edit['comment_block_count']);
+}
+
+/**
+ * Implements hook_block_view().
+ *
+ * Generates a block with the most recent comments.
+ */
+function comment_block_view($delta = '') {
+  if (user_access('access comments')) {
+    $block['subject'] = t('Recent comments');
+    $block['content'] = theme('comment_block');
+
+    return $block;
+  }
+}
+
+/**
+ * Redirects comment links to the correct page depending on comment settings.
+ *
+ * Since comments are paged there is no way to guarantee which page a comment
+ * appears on. Comment paging and threading settings may be changed at any time.
+ * With threaded comments, an individual comment may move between pages as
+ * comments can be added either before or after it in the overall discussion.
+ * Therefore we use a central routing function for comment links, which
+ * calculates the page number based on current comment settings and returns
+ * the full comment view with the pager set dynamically.
+ *
+ * @param $cid
+ *   A comment identifier.
+ * @return
+ *   The comment listing set to the page on which the comment appears.
+ */
+function comment_permalink($cid) {
+  if (($comment = comment_load($cid)) && ($node = node_load($comment->nid))) {
+
+    // Find the current display page for this comment.
+    $page = comment_get_display_page($comment->cid, $node->type);
+
+    // Set $_GET['q'] and $_GET['page'] ourselves so that the node callback
+    // behaves as it would when visiting the page directly.
+    $_GET['q'] = 'node/' . $node->nid;
+    $_GET['page'] = $page;
+
+    // Return the node view, this will show the correct comment in context.
+    return menu_execute_active_handler('node/' . $node->nid, FALSE);
+  }
+  return MENU_NOT_FOUND;
+}
+
+/**
+ * Find the most recent comments that are available to the current user.
+ *
+ * @param integer $number
+ *   (optional) The maximum number of comments to find. Defaults to 10.
+ *
+ * @return
+ *   An array of comment objects or an empty array if there are no recent
+ *   comments visible to the current user.
+ */
+function comment_get_recent($number = 10) {
+  $query = db_select('comment', 'c');
+  $query->innerJoin('node', 'n', 'n.nid = c.nid');
+  $query->addTag('node_access');
+  $comments = $query
+    ->fields('c')
+    ->condition('c.status', COMMENT_PUBLISHED)
+    ->condition('n.status', NODE_PUBLISHED)
+    ->orderBy('c.created', 'DESC')
+    // Additionally order by cid to ensure that comments with the same timestamp
+    // are returned in the exact order posted.
+    ->orderBy('c.cid', 'DESC')
+    ->range(0, $number)
+    ->execute()
+    ->fetchAll();
+
+  return $comments ? $comments : array();
+}
+
+/**
+ * Calculate page number for first new comment.
+ *
+ * @param $num_comments
+ *   Number of comments.
+ * @param $new_replies
+ *   Number of new replies.
+ * @param $node
+ *   The first new comment node.
+ * @return
+ *   "page=X" if the page number is greater than zero; empty string otherwise.
+ */
+function comment_new_page_count($num_comments, $new_replies, $node) {
+  $mode = variable_get('comment_default_mode_' . $node->type, COMMENT_MODE_THREADED);
+  $comments_per_page = variable_get('comment_default_per_page_' . $node->type, 50);
+  $pagenum = NULL;
+  $flat = $mode == COMMENT_MODE_FLAT ? TRUE : FALSE;
+  if ($num_comments <= $comments_per_page) {
+    // Only one page of comments.
+    $pageno = 0;
+  }
+  elseif ($flat) {
+    // Flat comments.
+    $count = $num_comments - $new_replies;
+    $pageno = $count / $comments_per_page;
+  }
+  else {
+    // Threaded comments: we build a query with a subquery to find the first
+    // thread with a new comment.
+
+    // 1. Find all the threads with a new comment.
+    $unread_threads_query = db_select('comment')
+      ->fields('comment', array('thread'))
+      ->condition('nid', $node->nid)
+      ->condition('status', COMMENT_PUBLISHED)
+      ->orderBy('created', 'DESC')
+      ->orderBy('cid', 'DESC')
+      ->range(0, $new_replies);
+
+    // 2. Find the first thread.
+    $first_thread = db_select($unread_threads_query, 'thread')
+      ->fields('thread', array('thread'))
+      ->orderBy('SUBSTRING(thread, 1, (LENGTH(thread) - 1))')
+      ->range(0, 1)
+      ->execute()
+      ->fetchField();
+
+    // Remove the final '/'.
+    $first_thread = substr($first_thread, 0, -1);
+
+    // Find the number of the first comment of the first unread thread.
+    $count = db_query('SELECT COUNT(*) FROM {comment} WHERE nid = :nid AND status = :status AND SUBSTRING(thread, 1, (LENGTH(thread) - 1)) < :thread', array(
+      ':status' => COMMENT_PUBLISHED,
+      ':nid' => $node->nid,
+      ':thread' => $first_thread,
+    ))->fetchField();
+
+    $pageno = $count / $comments_per_page;
+  }
+
+  if ($pageno >= 1) {
+    $pagenum = array('page' => intval($pageno));
+  }
+
+  return $pagenum;
+}
+
+/**
+ * Returns HTML for a list of recent comments to be displayed in the comment block.
+ *
+ * @ingroup themeable
+ */
+function theme_comment_block() {
+  $items = array();
+  $number = variable_get('comment_block_count', 10);
+  foreach (comment_get_recent($number) as $comment) {
+    $items[] = l($comment->subject, 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid)) . '&nbsp;<span>' . t('@time ago', array('@time' => format_interval(REQUEST_TIME - $comment->changed))) . '</span>';
+  }
+
+  if ($items) {
+    return theme('item_list', array('items' => $items));
+  }
+  else {
+    return t('No comments available.');
+  }
+}
+
+/**
+ * Implements hook_node_view().
+ */
+function comment_node_view($node, $view_mode) {
+  $links = array();
+
+  if ($node->comment != COMMENT_NODE_HIDDEN) {
+    if ($view_mode == 'rss') {
+      // Add a comments RSS element which is a URL to the comments of this node.
+      $node->rss_elements[] = array(
+        'key' => 'comments',
+        'value' => url('node/' . $node->nid, array('fragment' => 'comments', 'absolute' => TRUE))
+      );
+    }
+    elseif ($view_mode == 'teaser') {
+      // Teaser view: display the number of comments that have been posted,
+      // or a link to add new comments if the user has permission, the node
+      // is open to new comments, and there currently are none.
+      if (user_access('access comments')) {
+        if (!empty($node->comment_count)) {
+          $links['comment-comments'] = array(
+            'title' => format_plural($node->comment_count, '1 comment', '@count comments'),
+            'href' => "node/$node->nid",
+            'attributes' => array('title' => t('Jump to the first comment of this posting.')),
+            'fragment' => 'comments',
+            'html' => TRUE,
+          );
+          // Show a link to the first new comment.
+          if ($new = comment_num_new($node->nid)) {
+            $links['comment-new-comments'] = array(
+              'title' => format_plural($new, '1 new comment', '@count new comments'),
+              'href' => "node/$node->nid",
+              'query' => comment_new_page_count($node->comment_count, $new, $node),
+              'attributes' => array('title' => t('Jump to the first new comment of this posting.')),
+              'fragment' => 'new',
+              'html' => TRUE,
+            );
+          }
+        }
+      }
+      if ($node->comment == COMMENT_NODE_OPEN) {
+        if (user_access('post comments')) {
+          $links['comment-add'] = array(
+            'title' => t('Add new comment'),
+            'href' => "comment/reply/$node->nid",
+            'attributes' => array('title' => t('Add a new comment to this page.')),
+            'fragment' => 'comment-form',
+          );
+        }
+        else {
+          $links['comment_forbidden'] = array(
+            'title' => theme('comment_post_forbidden', array('node' => $node)),
+            'html' => TRUE,
+          );
+        }
+      }
+    }
+    elseif ($view_mode != 'search_index' && $view_mode != 'search_result') {
+      // Node in other view modes: add a "post comment" link if the user is
+      // allowed to post comments and if this node is allowing new comments.
+      // But we don't want this link if we're building the node for search
+      // indexing or constructing a search result excerpt.
+      if ($node->comment == COMMENT_NODE_OPEN) {
+        $comment_form_location = variable_get('comment_form_location_' . $node->type, COMMENT_FORM_BELOW);
+        if (user_access('post comments')) {
+          // Show the "post comment" link if the form is on another page, or
+          // if there are existing comments that the link will skip past.
+          if ($comment_form_location == COMMENT_FORM_SEPARATE_PAGE || (!empty($node->comment_count) && user_access('access comments'))) {
+            $links['comment-add'] = array(
+              'title' => t('Add new comment'),
+              'attributes' => array('title' => t('Share your thoughts and opinions related to this posting.')),
+              'href' => "node/$node->nid",
+              'fragment' => 'comment-form',
+            );
+            if ($comment_form_location == COMMENT_FORM_SEPARATE_PAGE) {
+              $links['comment-add']['href'] = "comment/reply/$node->nid";
+            }
+          }
+        }
+        else {
+          $links['comment_forbidden'] = array(
+            'title' => theme('comment_post_forbidden', array('node' => $node)),
+            'html' => TRUE,
+          );
+        }
+      }
+    }
+
+    $node->content['links']['comment'] = array(
+      '#theme' => 'links__node__comment',
+      '#links' => $links,
+      '#attributes' => array('class' => array('links', 'inline')),
+    );
+
+    // Only append comments when we are building a node on its own node detail
+    // page. We compare $node and $page_node to ensure that comments are not
+    // appended to other nodes shown on the page, for example a node_reference
+    // displayed in 'full' view mode within another node.
+    if ($node->comment && $view_mode == 'full' && node_is_page($node) && empty($node->in_preview)) {
+      $node->content['comments'] = comment_node_page_additions($node);
+    }
+  }
+}
+
+/**
+ * Build the comment-related elements for node detail pages.
+ *
+ * @param $node
+ *  A node object.
+ */
+function comment_node_page_additions($node) {
+  $additions = array();
+
+  // Only attempt to render comments if the node has visible comments.
+  // Unpublished comments are not included in $node->comment_count, so show
+  // comments unconditionally if the user is an administrator.
+  if (($node->comment_count && user_access('access comments')) || user_access('administer comments')) {
+    $mode = variable_get('comment_default_mode_' . $node->type, COMMENT_MODE_THREADED);
+    $comments_per_page = variable_get('comment_default_per_page_' . $node->type, 50);
+    if ($cids = comment_get_thread($node, $mode, $comments_per_page)) {
+      $comments = comment_load_multiple($cids);
+      comment_prepare_thread($comments);
+      $build = comment_view_multiple($comments, $node);
+      $build['pager']['#theme'] = 'pager';
+      $additions['comments'] = $build;
+    }
+  }
+
+  // Append comment form if needed.
+  if (user_access('post comments') && $node->comment == COMMENT_NODE_OPEN && (variable_get('comment_form_location_' . $node->type, COMMENT_FORM_BELOW) == COMMENT_FORM_BELOW)) {
+    $build = drupal_get_form("comment_node_{$node->type}_form", (object) array('nid' => $node->nid));
+    $additions['comment_form'] = $build;
+  }
+
+  if ($additions) {
+    $additions += array(
+      '#theme' => 'comment_wrapper__node_' . $node->type,
+      '#node' => $node,
+      'comments' => array(),
+      'comment_form' => array(),
+    );
+  }
+
+  return $additions;
+}
+
+/**
+ * Retrieve comments for a thread.
+ *
+ * @param $node
+ *   The node whose comment(s) needs rendering.
+ * @param $mode
+ *   The comment display mode; COMMENT_MODE_FLAT or COMMENT_MODE_THREADED.
+ * @param $comments_per_page
+ *   The amount of comments to display per page.
+ *
+ * To display threaded comments in the correct order we keep a 'thread' field
+ * and order by that value. This field keeps this data in
+ * a way which is easy to update and convenient to use.
+ *
+ * A "thread" value starts at "1". If we add a child (A) to this comment,
+ * we assign it a "thread" = "1.1". A child of (A) will have "1.1.1". Next
+ * brother of (A) will get "1.2". Next brother of the parent of (A) will get
+ * "2" and so on.
+ *
+ * First of all note that the thread field stores the depth of the comment:
+ * depth 0 will be "X", depth 1 "X.X", depth 2 "X.X.X", etc.
+ *
+ * Now to get the ordering right, consider this example:
+ *
+ * 1
+ * 1.1
+ * 1.1.1
+ * 1.2
+ * 2
+ *
+ * If we "ORDER BY thread ASC" we get the above result, and this is the
+ * natural order sorted by time. However, if we "ORDER BY thread DESC"
+ * we get:
+ *
+ * 2
+ * 1.2
+ * 1.1.1
+ * 1.1
+ * 1
+ *
+ * Clearly, this is not a natural way to see a thread, and users will get
+ * confused. The natural order to show a thread by time desc would be:
+ *
+ * 2
+ * 1
+ * 1.2
+ * 1.1
+ * 1.1.1
+ *
+ * which is what we already did before the standard pager patch. To achieve
+ * this we simply add a "/" at the end of each "thread" value. This way, the
+ * thread fields will look like this:
+ *
+ * 1/
+ * 1.1/
+ * 1.1.1/
+ * 1.2/
+ * 2/
+ *
+ * we add "/" since this char is, in ASCII, higher than every number, so if
+ * now we "ORDER BY thread DESC" we get the correct order. However this would
+ * spoil the reverse ordering, "ORDER BY thread ASC" -- here, we do not need
+ * to consider the trailing "/" so we use a substring only.
+ */
+function comment_get_thread($node, $mode, $comments_per_page) {
+  $query = db_select('comment', 'c')->extend('PagerDefault');
+  $query->addField('c', 'cid');
+  $query
+    ->condition('c.nid', $node->nid)
+    ->addTag('node_access')
+    ->addTag('comment_filter')
+    ->addMetaData('node', $node)
+    ->limit($comments_per_page);
+
+  $count_query = db_select('comment', 'c');
+  $count_query->addExpression('COUNT(*)');
+  $count_query
+    ->condition('c.nid', $node->nid)
+    ->addTag('node_access')
+    ->addTag('comment_filter')
+    ->addMetaData('node', $node);
+
+  if (!user_access('administer comments')) {
+    $query->condition('c.status', COMMENT_PUBLISHED);
+    $count_query->condition('c.status', COMMENT_PUBLISHED);
+  }
+  if ($mode === COMMENT_MODE_FLAT) {
+    $query->orderBy('c.cid', 'ASC');
+  }
+  else {
+    // See comment above. Analysis reveals that this doesn't cost too
+    // much. It scales much much better than having the whole comment
+    // structure.
+    $query->addExpression('SUBSTRING(c.thread, 1, (LENGTH(c.thread) - 1))', 'torder');
+    $query->orderBy('torder', 'ASC');
+  }
+
+  $query->setCountQuery($count_query);
+  $cids = $query->execute()->fetchCol();
+
+  return $cids;
+}
+
+/**
+ * Loop over comment thread, noting indentation level.
+ *
+ * @param array $comments
+ *   An array of comment objects, keyed by cid.
+ * @return
+ *   The $comments argument is altered by reference with indentation information.
+ */
+function comment_prepare_thread(&$comments) {
+  // A flag stating if we are still searching for first new comment on the thread.
+  $first_new = TRUE;
+
+  // A counter that helps track how indented we are.
+  $divs = 0;
+
+  foreach ($comments as $key => $comment) {
+    if ($first_new && $comment->new != MARK_READ) {
+      // Assign the anchor only for the first new comment. This avoids duplicate
+      // id attributes on a page.
+      $first_new = FALSE;
+      $comment->first_new = TRUE;
+    }
+
+    // The $divs element instructs #prefix whether to add an indent div or
+    // close existing divs (a negative value).
+    $comment->depth = count(explode('.', $comment->thread)) - 1;
+    if ($comment->depth > $divs) {
+      $comment->divs = 1;
+      $divs++;
+    }
+    else {
+      $comment->divs = $comment->depth - $divs;
+      while ($comment->depth < $divs) {
+        $divs--;
+      }
+    }
+    $comments[$key] = $comment;
+  }
+
+  // The final comment must close up some hanging divs
+  $comments[$key]->divs_final = $divs;
+}
+
+/**
+ * Generate an array for rendering the given comment.
+ *
+ * @param $comment
+ *   A comment object.
+ * @param $node
+ *   The node the comment is attached to.
+ * @param $view_mode
+ *   View mode, e.g. 'full', 'teaser'...
+ * @param $langcode
+ *   (optional) A language code to use for rendering. Defaults to the global
+ *   content language of the current request.
+ *
+ * @return
+ *   An array as expected by drupal_render().
+ */
+function comment_view($comment, $node, $view_mode = 'full', $langcode = NULL) {
+  if (!isset($langcode)) {
+    $langcode = $GLOBALS['language_content']->language;
+  }
+
+  // Populate $comment->content with a render() array.
+  comment_build_content($comment, $node, $view_mode, $langcode);
+
+  $build = $comment->content;
+  // We don't need duplicate rendering info in comment->content.
+  unset($comment->content);
+
+  $build += array(
+    '#theme' => 'comment__node_' . $node->type,
+    '#comment' => $comment,
+    '#node' => $node,
+    '#view_mode' => $view_mode,
+    '#language' => $langcode,
+  );
+
+  if (empty($comment->in_preview)) {
+    $prefix = '';
+    $is_threaded = isset($comment->divs) && variable_get('comment_default_mode_' . $node->type, COMMENT_MODE_THREADED) == COMMENT_MODE_THREADED;
+
+    // Add 'new' anchor if needed.
+    if (!empty($comment->first_new)) {
+      $prefix .= "<a id=\"new\"></a>\n";
+    }
+
+    // Add indentation div or close open divs as needed.
+    if ($is_threaded) {
+      $prefix .= $comment->divs <= 0 ? str_repeat('</div>', abs($comment->divs)) : "\n" . '<div class="indented">';
+    }
+
+    // Add anchor for each comment.
+    $prefix .= "<a id=\"comment-$comment->cid\"></a>\n";
+    $build['#prefix'] = $prefix;
+
+    // Close all open divs.
+    if ($is_threaded && !empty($comment->divs_final)) {
+      $build['#suffix'] = str_repeat('</div>', $comment->divs_final);
+    }
+  }
+
+  // Allow modules to modify the structured comment.
+  $type = 'comment';
+  drupal_alter(array('comment_view', 'entity_view'), $build, $type);
+
+  return $build;
+}
+
+/**
+ * Builds a structured array representing the comment's content.
+ *
+ * The content built for the comment (field values, comments, file attachments or
+ * other comment components) will vary depending on the $view_mode parameter.
+ *
+ * @param $comment
+ *   A comment object.
+ * @param $node
+ *   The node the comment is attached to.
+ * @param $view_mode
+ *   View mode, e.g. 'full', 'teaser'...
+ * @param $langcode
+ *   (optional) A language code to use for rendering. Defaults to the global
+ *   content language of the current request.
+ */
+function comment_build_content($comment, $node, $view_mode = 'full', $langcode = NULL) {
+  if (!isset($langcode)) {
+    $langcode = $GLOBALS['language_content']->language;
+  }
+
+  // Remove previously built content, if exists.
+  $comment->content = array();
+
+  // Allow modules to change the view mode.
+  $context = array(
+    'entity_type' => 'comment',
+    'entity' => $comment,
+    'langcode' => $langcode,
+  );
+  drupal_alter('entity_view_mode', $view_mode, $context);
+
+  // Build fields content.
+  field_attach_prepare_view('comment', array($comment->cid => $comment), $view_mode, $langcode);
+  entity_prepare_view('comment', array($comment->cid => $comment), $langcode);
+  $comment->content += field_attach_view('comment', $comment, $view_mode, $langcode);
+
+  $comment->content['links'] = array(
+    '#theme' => 'links__comment',
+    '#pre_render' => array('drupal_pre_render_links'),
+    '#attributes' => array('class' => array('links', 'inline')),
+  );
+  if (empty($comment->in_preview)) {
+    $comment->content['links']['comment'] = array(
+      '#theme' => 'links__comment__comment',
+      '#links' => comment_links($comment, $node),
+      '#attributes' => array('class' => array('links', 'inline')),
+    );
+  }
+
+  // Allow modules to make their own additions to the comment.
+  module_invoke_all('comment_view', $comment, $view_mode, $langcode);
+  module_invoke_all('entity_view', $comment, 'comment', $view_mode, $langcode);
+
+  // Make sure the current view mode is stored if no module has already
+  // populated the related key.
+  $comment->content += array('#view_mode' => $view_mode);
+}
+
+/**
+ * Helper function, build links for an individual comment.
+ *
+ * Adds reply, edit, delete etc. depending on the current user permissions.
+ *
+ * @param $comment
+ *   The comment object.
+ * @param $node
+ *   The node the comment is attached to.
+ * @return
+ *   A structured array of links.
+ */
+function comment_links($comment, $node) {
+  $links = array();
+  if ($node->comment == COMMENT_NODE_OPEN) {
+    if (user_access('administer comments') && user_access('post comments')) {
+      $links['comment-delete'] = array(
+        'title' => t('delete'),
+        'href' => "comment/$comment->cid/delete",
+        'html' => TRUE,
+      );
+      $links['comment-edit'] = array(
+        'title' => t('edit'),
+        'href' => "comment/$comment->cid/edit",
+        'html' => TRUE,
+      );
+      $links['comment-reply'] = array(
+        'title' => t('reply'),
+        'href' => "comment/reply/$comment->nid/$comment->cid",
+        'html' => TRUE,
+      );
+      if ($comment->status == COMMENT_NOT_PUBLISHED) {
+        $links['comment-approve'] = array(
+          'title' => t('approve'),
+          'href' => "comment/$comment->cid/approve",
+          'html' => TRUE,
+          'query' => array('token' => drupal_get_token("comment/$comment->cid/approve")),
+        );
+      }
+    }
+    elseif (user_access('post comments')) {
+      if (comment_access('edit', $comment)) {
+        $links['comment-edit'] = array(
+          'title' => t('edit'),
+          'href' => "comment/$comment->cid/edit",
+          'html' => TRUE,
+        );
+      }
+      $links['comment-reply'] = array(
+        'title' => t('reply'),
+        'href' => "comment/reply/$comment->nid/$comment->cid",
+        'html' => TRUE,
+      );
+    }
+    else {
+      $links['comment_forbidden']['title'] = theme('comment_post_forbidden', array('node' => $node));
+      $links['comment_forbidden']['html'] = TRUE;
+    }
+  }
+  return $links;
+}
+
+/**
+ * Construct a drupal_render() style array from an array of loaded comments.
+ *
+ * @param $comments
+ *   An array of comments as returned by comment_load_multiple().
+ * @param $node
+ *   The node the comments are attached to.
+ * @param $view_mode
+ *   View mode, e.g. 'full', 'teaser'...
+ * @param $weight
+ *   An integer representing the weight of the first comment in the list.
+ * @param $langcode
+ *   A string indicating the language field values are to be shown in. If no
+ *   language is provided the current content language is used.
+ *
+ * @return
+ *   An array in the format expected by drupal_render().
+ */
+function comment_view_multiple($comments, $node, $view_mode = 'full', $weight = 0, $langcode = NULL) {
+  field_attach_prepare_view('comment', $comments, $view_mode, $langcode);
+  entity_prepare_view('comment', $comments, $langcode);
+
+  $build = array(
+    '#sorted' => TRUE,
+  );
+  foreach ($comments as $comment) {
+    $build[$comment->cid] = comment_view($comment, $node, $view_mode, $langcode);
+    $build[$comment->cid]['#weight'] = $weight;
+    $weight++;
+  }
+  return $build;
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function comment_form_node_type_form_alter(&$form, $form_state) {
+  if (isset($form['type'])) {
+    $form['comment'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Comment settings'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+      '#group' => 'additional_settings',
+      '#attributes' => array(
+        'class' => array('comment-node-type-settings-form'),
+      ),
+      '#attached' => array(
+        'js' => array(drupal_get_path('module', 'comment') . '/comment-node-form.js'),
+      ),
+    );
+    // Unlike coment_form_node_form_alter(), all of these settings are applied
+    // as defaults to all new nodes. Therefore, it would be wrong to use #states
+    // to hide the other settings based on the primary comment setting.
+    $form['comment']['comment'] = array(
+      '#type' => 'select',
+      '#title' => t('Default comment setting for new content'),
+      '#default_value' => variable_get('comment_' . $form['#node_type']->type, COMMENT_NODE_OPEN),
+      '#options' => array(
+        COMMENT_NODE_OPEN => t('Open'),
+        COMMENT_NODE_CLOSED => t('Closed'),
+        COMMENT_NODE_HIDDEN => t('Hidden'),
+      ),
+    );
+    $form['comment']['comment_default_mode'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Threading'),
+      '#default_value' => variable_get('comment_default_mode_' . $form['#node_type']->type, COMMENT_MODE_THREADED),
+      '#description' => t('Show comment replies in a threaded list.'),
+    );
+    $form['comment']['comment_default_per_page'] = array(
+      '#type' => 'select',
+      '#title' => t('Comments per page'),
+      '#default_value' => variable_get('comment_default_per_page_' . $form['#node_type']->type, 50),
+      '#options' => _comment_per_page(),
+    );
+    $form['comment']['comment_anonymous'] = array(
+      '#type' => 'select',
+      '#title' => t('Anonymous commenting'),
+      '#default_value' => variable_get('comment_anonymous_' . $form['#node_type']->type, COMMENT_ANONYMOUS_MAYNOT_CONTACT),
+      '#options' => array(
+        COMMENT_ANONYMOUS_MAYNOT_CONTACT => t('Anonymous posters may not enter their contact information'),
+        COMMENT_ANONYMOUS_MAY_CONTACT => t('Anonymous posters may leave their contact information'),
+        COMMENT_ANONYMOUS_MUST_CONTACT => t('Anonymous posters must leave their contact information'),
+      ),
+      '#access' => user_access('post comments', drupal_anonymous_user()),
+    );
+    $form['comment']['comment_subject_field'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Allow comment title'),
+      '#default_value' => variable_get('comment_subject_field_' . $form['#node_type']->type, 1),
+    );
+    $form['comment']['comment_form_location'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Show reply form on the same page as comments'),
+      '#default_value' => variable_get('comment_form_location_' . $form['#node_type']->type, COMMENT_FORM_BELOW),
+    );
+    $form['comment']['comment_preview'] = array(
+      '#type' => 'radios',
+      '#title' => t('Preview comment'),
+      '#default_value' => variable_get('comment_preview_' . $form['#node_type']->type, DRUPAL_OPTIONAL),
+      '#options' => array(
+        DRUPAL_DISABLED => t('Disabled'),
+        DRUPAL_OPTIONAL => t('Optional'),
+        DRUPAL_REQUIRED => t('Required'),
+      ),
+    );
+  }
+}
+
+/**
+ * Implements hook_form_BASE_FORM_ID_alter().
+ */
+function comment_form_node_form_alter(&$form, $form_state) {
+  $node = $form['#node'];
+  $form['comment_settings'] = array(
+    '#type' => 'fieldset',
+    '#access' => user_access('administer comments'),
+    '#title' => t('Comment settings'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#group' => 'additional_settings',
+    '#attributes' => array(
+      'class' => array('comment-node-settings-form'),
+    ),
+    '#attached' => array(
+      'js' => array(drupal_get_path('module', 'comment') . '/comment-node-form.js'),
+     ),
+    '#weight' => 30,
+  );
+  $comment_count = isset($node->nid) ? db_query('SELECT comment_count FROM {node_comment_statistics} WHERE nid = :nid', array(':nid' => $node->nid))->fetchField() : 0;
+  $comment_settings = ($node->comment == COMMENT_NODE_HIDDEN && empty($comment_count)) ? COMMENT_NODE_CLOSED : $node->comment;
+  $form['comment_settings']['comment'] = array(
+    '#type' => 'radios',
+    '#title' => t('Comments'),
+    '#title_display' => 'invisible',
+    '#parents' => array('comment'),
+    '#default_value' => $comment_settings,
+    '#options' => array(
+      COMMENT_NODE_OPEN => t('Open'),
+      COMMENT_NODE_CLOSED => t('Closed'),
+      COMMENT_NODE_HIDDEN => t('Hidden'),
+    ),
+    COMMENT_NODE_OPEN => array(
+      '#description' => t('Users with the "Post comments" permission can post comments.'),
+    ),
+    COMMENT_NODE_CLOSED => array(
+      '#description' => t('Users cannot post comments, but existing comments will be displayed.'),
+    ),
+    COMMENT_NODE_HIDDEN => array(
+      '#description' => t('Comments are hidden from view.'),
+    ),
+  );
+  // If the node doesn't have any comments, the "hidden" option makes no
+  // sense, so don't even bother presenting it to the user.
+  if (empty($comment_count)) {
+    $form['comment_settings']['comment'][COMMENT_NODE_HIDDEN]['#access'] = FALSE;
+    // Also adjust the description of the "closed" option.
+    $form['comment_settings']['comment'][COMMENT_NODE_CLOSED]['#description'] = t('Users cannot post comments.');
+  }
+}
+
+/**
+ * Implements hook_node_load().
+ */
+function comment_node_load($nodes, $types) {
+  $comments_enabled = array();
+
+  // Check if comments are enabled for each node. If comments are disabled,
+  // assign values without hitting the database.
+  foreach ($nodes as $node) {
+    // Store whether comments are enabled for this node.
+    if ($node->comment != COMMENT_NODE_HIDDEN) {
+      $comments_enabled[] = $node->nid;
+    }
+    else {
+      $node->cid = 0;
+      $node->last_comment_timestamp = $node->created;
+      $node->last_comment_name = '';
+      $node->last_comment_uid = $node->uid;
+      $node->comment_count = 0;
+    }
+  }
+
+  // For nodes with comments enabled, fetch information from the database.
+  if (!empty($comments_enabled)) {
+    $result = db_query('SELECT nid, cid, last_comment_timestamp, last_comment_name, last_comment_uid, comment_count FROM {node_comment_statistics} WHERE nid IN (:comments_enabled)', array(':comments_enabled' => $comments_enabled));
+    foreach ($result as $record) {
+      $nodes[$record->nid]->cid = $record->cid;
+      $nodes[$record->nid]->last_comment_timestamp = $record->last_comment_timestamp;
+      $nodes[$record->nid]->last_comment_name = $record->last_comment_name;
+      $nodes[$record->nid]->last_comment_uid = $record->last_comment_uid;
+      $nodes[$record->nid]->comment_count = $record->comment_count;
+    }
+  }
+}
+
+/**
+ * Implements hook_node_prepare().
+ */
+function comment_node_prepare($node) {
+  if (!isset($node->comment)) {
+    $node->comment = variable_get("comment_$node->type", COMMENT_NODE_OPEN);
+  }
+}
+
+/**
+ * Implements hook_node_insert().
+ */
+function comment_node_insert($node) {
+  // Allow bulk updates and inserts to temporarily disable the
+  // maintenance of the {node_comment_statistics} table.
+  if (variable_get('comment_maintain_node_statistics', TRUE)) {
+    db_insert('node_comment_statistics')
+      ->fields(array(
+        'nid' => $node->nid,
+        'cid' => 0,
+        'last_comment_timestamp' => $node->changed,
+        'last_comment_name' => NULL,
+        'last_comment_uid' => $node->uid,
+        'comment_count' => 0,
+      ))
+      ->execute();
+  }
+}
+
+/**
+ * Implements hook_node_delete().
+ */
+function comment_node_delete($node) {
+  $cids = db_query('SELECT cid FROM {comment} WHERE nid = :nid', array(':nid' => $node->nid))->fetchCol();
+  comment_delete_multiple($cids);
+  db_delete('node_comment_statistics')
+    ->condition('nid', $node->nid)
+    ->execute();
+}
+
+/**
+ * Implements hook_node_update_index().
+ */
+function comment_node_update_index($node) {
+  $index_comments = &drupal_static(__FUNCTION__);
+
+  if ($index_comments === NULL) {
+    // Find and save roles that can 'access comments' or 'search content'.
+    $perms = array('access comments' => array(), 'search content' => array());
+    $result = db_query("SELECT rid, permission FROM {role_permission} WHERE permission IN ('access comments', 'search content')");
+    foreach ($result as $record) {
+      $perms[$record->permission][$record->rid] = $record->rid;
+    }
+
+    // Prevent indexing of comments if there are any roles that can search but
+    // not view comments.
+    $index_comments = TRUE;
+    foreach ($perms['search content'] as $rid) {
+      if (!isset($perms['access comments'][$rid]) && ($rid <= DRUPAL_AUTHENTICATED_RID || !isset($perms['access comments'][DRUPAL_AUTHENTICATED_RID]))) {
+        $index_comments = FALSE;
+        break;
+      }
+    }
+  }
+
+  if ($index_comments) {
+    $mode = variable_get('comment_default_mode_' . $node->type, COMMENT_MODE_THREADED);
+    $comments_per_page = variable_get('comment_default_per_page_' . $node->type, 50);
+    if ($node->comment && $cids = comment_get_thread($node, $mode, $comments_per_page)) {
+      $comments = comment_load_multiple($cids);
+      comment_prepare_thread($comments);
+      $build = comment_view_multiple($comments, $node);
+      return drupal_render($build);
+    }
+  }
+  return '';
+}
+
+/**
+ * Implements hook_update_index().
+ */
+function comment_update_index() {
+  // Store the maximum possible comments per thread (used for ranking by reply count)
+  variable_set('node_cron_comments_scale', 1.0 / max(1, db_query('SELECT MAX(comment_count) FROM {node_comment_statistics}')->fetchField()));
+}
+
+/**
+ * Implements hook_node_search_result().
+ *
+ * Formats a comment count string and returns it, for display with search
+ * results.
+ */
+function comment_node_search_result($node) {
+  // Do not make a string if comments are hidden.
+  if (user_access('access comments') && $node->comment != COMMENT_NODE_HIDDEN) {
+    $comments = db_query('SELECT comment_count FROM {node_comment_statistics} WHERE nid = :nid', array('nid' => $node->nid))->fetchField();
+    // Do not make a string if comments are closed and there are currently
+    // zero comments.
+    if ($node->comment != COMMENT_NODE_CLOSED || $comments > 0) {
+      return array('comment' => format_plural($comments, '1 comment', '@count comments'));
+    }
+  }
+}
+
+/**
+ * Implements hook_user_cancel().
+ */
+function comment_user_cancel($edit, $account, $method) {
+  switch ($method) {
+    case 'user_cancel_block_unpublish':
+      $comments = comment_load_multiple(array(), array('uid' => $account->uid));
+      foreach ($comments as $comment) {
+        $comment->status = 0;
+        comment_save($comment);
+      }
+      break;
+
+    case 'user_cancel_reassign':
+      $comments = comment_load_multiple(array(), array('uid' => $account->uid));
+      foreach ($comments as $comment) {
+        $comment->uid = 0;
+        comment_save($comment);
+      }
+      break;
+  }
+}
+
+/**
+ * Implements hook_user_delete().
+ */
+function comment_user_delete($account) {
+  $cids = db_query('SELECT c.cid FROM {comment} c WHERE uid = :uid', array(':uid' => $account->uid))->fetchCol();
+  comment_delete_multiple($cids);
+}
+
+/**
+ * Determines whether the current user has access to a particular comment.
+ *
+ * Authenticated users can edit their comments as long they have not been
+ * replied to. This prevents people from changing or revising their statements
+ * based on the replies to their posts.
+ *
+ * @param $op
+ *   The operation that is to be performed on the comment. Only 'edit' is
+ *   recognized now.
+ * @param $comment
+ *   The comment object.
+ * @return
+ *   TRUE if the current user has acces to the comment, FALSE otherwise.
+ */
+function comment_access($op, $comment) {
+  global $user;
+
+  if ($op == 'edit') {
+    return ($user->uid && $user->uid == $comment->uid && $comment->status == COMMENT_PUBLISHED && user_access('edit own comments')) || user_access('administer comments');
+  }
+}
+
+/**
+ * Accepts a submission of new or changed comment content.
+ *
+ * @param $comment
+ *   A comment object.
+ */
+function comment_save($comment) {
+  global $user;
+
+  $transaction = db_transaction();
+  try {
+    $defaults = array(
+      'mail' => '',
+      'homepage' => '',
+      'name' => '',
+      'status' => user_access('skip comment approval') ? COMMENT_PUBLISHED : COMMENT_NOT_PUBLISHED,
+    );
+    foreach ($defaults as $key => $default) {
+      if (!isset($comment->$key)) {
+        $comment->$key = $default;
+      }
+    }
+    // Make sure we have a bundle name.
+    if (!isset($comment->node_type)) {
+      $node = node_load($comment->nid);
+      $comment->node_type = 'comment_node_' . $node->type;
+    }
+
+    // Load the stored entity, if any.
+    if (!empty($comment->cid) && !isset($comment->original)) {
+      $comment->original = entity_load_unchanged('comment', $comment->cid);
+    }
+
+    field_attach_presave('comment', $comment);
+
+    // Allow modules to alter the comment before saving.
+    module_invoke_all('comment_presave', $comment);
+    module_invoke_all('entity_presave', $comment, 'comment');
+
+    if ($comment->cid) {
+
+      drupal_write_record('comment', $comment, 'cid');
+
+      // Ignore slave server temporarily to give time for the
+      // saved comment to be propagated to the slave.
+      db_ignore_slave();
+
+      // Update the {node_comment_statistics} table prior to executing hooks.
+      _comment_update_node_statistics($comment->nid);
+
+      field_attach_update('comment', $comment);
+      // Allow modules to respond to the updating of a comment.
+      module_invoke_all('comment_update', $comment);
+      module_invoke_all('entity_update', $comment, 'comment');
+    }
+    else {
+      // Add the comment to database. This next section builds the thread field.
+      // Also see the documentation for comment_view().
+      if (!empty($comment->thread)) {
+        // Allow calling code to set thread itself.
+        $thread = $comment->thread;
+      }
+      elseif ($comment->pid == 0) {
+        // This is a comment with no parent comment (depth 0): we start
+        // by retrieving the maximum thread level.
+        $max = db_query('SELECT MAX(thread) FROM {comment} WHERE nid = :nid', array(':nid' => $comment->nid))->fetchField();
+        // Strip the "/" from the end of the thread.
+        $max = rtrim($max, '/');
+        // We need to get the value at the correct depth.
+        $parts = explode('.', $max);
+        $firstsegment = $parts[0];
+        // Finally, build the thread field for this new comment.
+        $thread = int2vancode(vancode2int($firstsegment) + 1) . '/';
+      }
+      else {
+        // This is a comment with a parent comment, so increase the part of the
+        // thread value at the proper depth.
+
+        // Get the parent comment:
+        $parent = comment_load($comment->pid);
+        // Strip the "/" from the end of the parent thread.
+        $parent->thread = (string) rtrim((string) $parent->thread, '/');
+        // Get the max value in *this* thread.
+        $max = db_query("SELECT MAX(thread) FROM {comment} WHERE thread LIKE :thread AND nid = :nid", array(
+          ':thread' => $parent->thread . '.%',
+          ':nid' => $comment->nid,
+        ))->fetchField();
+
+        if ($max == '') {
+          // First child of this parent.
+          $thread = $parent->thread . '.' . int2vancode(0) . '/';
+        }
+        else {
+          // Strip the "/" at the end of the thread.
+          $max = rtrim($max, '/');
+          // Get the value at the correct depth.
+          $parts = explode('.', $max);
+          $parent_depth = count(explode('.', $parent->thread));
+          $last = $parts[$parent_depth];
+          // Finally, build the thread field for this new comment.
+          $thread = $parent->thread . '.' . int2vancode(vancode2int($last) + 1) . '/';
+        }
+      }
+
+      if (empty($comment->created)) {
+        $comment->created = REQUEST_TIME;
+      }
+
+      if (empty($comment->changed)) {
+        $comment->changed = $comment->created;
+      }
+
+      if ($comment->uid === $user->uid && isset($user->name)) { // '===' Need to modify anonymous users as well.
+        $comment->name = $user->name;
+      }
+
+      // Ensure the parent id (pid) has a value set.
+      if (empty($comment->pid)) {
+        $comment->pid = 0;
+      }
+
+      // Add the values which aren't passed into the function.
+      $comment->thread = $thread;
+      $comment->hostname = ip_address();
+
+      drupal_write_record('comment', $comment);
+
+      // Ignore slave server temporarily to give time for the
+      // created comment to be propagated to the slave.
+      db_ignore_slave();
+
+      // Update the {node_comment_statistics} table prior to executing hooks.
+      _comment_update_node_statistics($comment->nid);
+
+      field_attach_insert('comment', $comment);
+
+      // Tell the other modules a new comment has been submitted.
+      module_invoke_all('comment_insert', $comment);
+      module_invoke_all('entity_insert', $comment, 'comment');
+    }
+    if ($comment->status == COMMENT_PUBLISHED) {
+      module_invoke_all('comment_publish', $comment);
+    }
+    unset($comment->original);
+  }
+  catch (Exception $e) {
+    $transaction->rollback('comment');
+    watchdog_exception('comment', $e);
+    throw $e;
+  }
+
+}
+
+/**
+ * Delete a comment and all its replies.
+ *
+ * @param $cid
+ *   The comment to delete.
+ */
+function comment_delete($cid) {
+  comment_delete_multiple(array($cid));
+}
+
+/**
+ * Delete comments and all their replies.
+ *
+ * @param $cids
+ *   The comment to delete.
+ */
+function comment_delete_multiple($cids) {
+  $comments = comment_load_multiple($cids);
+  if ($comments) {
+    $transaction = db_transaction();
+    try {
+      // Delete the comments.
+      db_delete('comment')
+        ->condition('cid', array_keys($comments), 'IN')
+        ->execute();
+      foreach ($comments as $comment) {
+        field_attach_delete('comment', $comment);
+        module_invoke_all('comment_delete', $comment);
+        module_invoke_all('entity_delete', $comment, 'comment');
+
+        // Delete the comment's replies.
+        $child_cids = db_query('SELECT cid FROM {comment} WHERE pid = :cid', array(':cid' => $comment->cid))->fetchCol();
+        comment_delete_multiple($child_cids);
+        _comment_update_node_statistics($comment->nid);
+      }
+    }
+    catch (Exception $e) {
+      $transaction->rollback();
+      watchdog_exception('comment', $e);
+      throw $e;
+    }
+  }
+}
+
+/**
+ * Load comments from the database.
+ *
+ * @param $cids
+ *   An array of comment IDs.
+ * @param $conditions
+ *   (deprecated) An associative array of conditions on the {comments}
+ *   table, where the keys are the database fields and the values are the
+ *   values those fields must have. Instead, it is preferable to use
+ *   EntityFieldQuery to retrieve a list of entity IDs loadable by
+ *   this function.
+ * @param $reset
+ *   Whether to reset the internal static entity cache. Note that the static
+ *   cache is disabled in comment_entity_info() by default.
+ *
+ * @return
+ *   An array of comment objects, indexed by comment ID.
+ *
+ * @see entity_load()
+ * @see EntityFieldQuery
+ *
+ * @todo Remove $conditions in Drupal 8.
+ */
+function comment_load_multiple($cids = array(), $conditions = array(), $reset = FALSE) {
+  return entity_load('comment', $cids, $conditions, $reset);
+}
+
+/**
+ * Load the entire comment by cid.
+ *
+ * @param $cid
+ *   The identifying comment id.
+ * @param $reset
+ *   Whether to reset the internal static entity cache. Note that the static
+ *   cache is disabled in comment_entity_info() by default.
+ *
+ * @return
+ *   The comment object.
+ */
+function comment_load($cid, $reset = FALSE) {
+  $comment = comment_load_multiple(array($cid), array(), $reset);
+  return $comment ? $comment[$cid] : FALSE;
+}
+
+/**
+ * Controller class for comments.
+ *
+ * This extends the DrupalDefaultEntityController class, adding required
+ * special handling for comment objects.
+ */
+class CommentController extends DrupalDefaultEntityController {
+
+  protected function buildQuery($ids, $conditions = array(), $revision_id = FALSE) {
+    $query = parent::buildQuery($ids, $conditions, $revision_id);
+    // Specify additional fields from the user and node tables.
+    $query->innerJoin('node', 'n', 'base.nid = n.nid');
+    $query->addField('n', 'type', 'node_type');
+    $query->innerJoin('users', 'u', 'base.uid = u.uid');
+    $query->addField('u', 'name', 'registered_name');
+    $query->fields('u', array('uid', 'signature', 'signature_format', 'picture'));
+    return $query;
+  }
+
+  protected function attachLoad(&$comments, $revision_id = FALSE) {
+    // Setup standard comment properties.
+    foreach ($comments as $key => $comment) {
+      $comment->name = $comment->uid ? $comment->registered_name : $comment->name;
+      $comment->new = node_mark($comment->nid, $comment->changed);
+      $comment->node_type = 'comment_node_' . $comment->node_type;
+      $comments[$key] = $comment;
+    }
+    parent::attachLoad($comments, $revision_id);
+  }
+}
+
+/**
+ * Get number of new comments for current user and specified node.
+ *
+ * @param $nid
+ *   Node-id to count comments for.
+ * @param $timestamp
+ *   Time to count from (defaults to time of last user access
+ *   to node).
+ * @return The result or FALSE on error.
+ */
+function comment_num_new($nid, $timestamp = 0) {
+  global $user;
+
+  if ($user->uid) {
+    // Retrieve the timestamp at which the current user last viewed this node.
+    if (!$timestamp) {
+      $timestamp = node_last_viewed($nid);
+    }
+    $timestamp = ($timestamp > NODE_NEW_LIMIT ? $timestamp : NODE_NEW_LIMIT);
+
+    // Use the timestamp to retrieve the number of new comments.
+    return db_query('SELECT COUNT(cid) FROM {comment} WHERE nid = :nid AND created > :timestamp AND status = :status', array(
+      ':nid' => $nid,
+      ':timestamp' => $timestamp,
+      ':status' => COMMENT_PUBLISHED,
+      ))->fetchField();
+  }
+  else {
+    return FALSE;
+  }
+
+}
+
+/**
+ * Get the display ordinal for a comment, starting from 0.
+ *
+ * Count the number of comments which appear before the comment we want to
+ * display, taking into account display settings and threading.
+ *
+ * @param $cid
+ *   The comment ID.
+ * @param $node_type
+ *   The node type of the comment's parent.
+ * @return
+ *   The display ordinal for the comment.
+ * @see comment_get_display_page()
+ */
+function comment_get_display_ordinal($cid, $node_type) {
+  // Count how many comments (c1) are before $cid (c2) in display order. This is
+  // the 0-based display ordinal.
+  $query = db_select('comment', 'c1');
+  $query->innerJoin('comment', 'c2', 'c2.nid = c1.nid');
+  $query->addExpression('COUNT(*)', 'count');
+  $query->condition('c2.cid', $cid);
+  if (!user_access('administer comments')) {
+    $query->condition('c1.status', COMMENT_PUBLISHED);
+  }
+  $mode = variable_get('comment_default_mode_' . $node_type, COMMENT_MODE_THREADED);
+
+  if ($mode == COMMENT_MODE_FLAT) {
+    // For flat comments, cid is used for ordering comments due to
+    // unpredicatable behavior with timestamp, so we make the same assumption
+    // here.
+    $query->condition('c1.cid', $cid, '<');
+  }
+  else {
+    // For threaded comments, the c.thread column is used for ordering. We can
+    // use the vancode for comparison, but must remove the trailing slash.
+    // See comment_view_multiple().
+    $query->where('SUBSTRING(c1.thread, 1, (LENGTH(c1.thread) -1)) < SUBSTRING(c2.thread, 1, (LENGTH(c2.thread) -1))');
+  }
+
+  return $query->execute()->fetchField();
+}
+
+/**
+ * Return the page number for a comment.
+ *
+ * Finds the correct page number for a comment taking into account display
+ * and paging settings.
+ *
+ * @param $cid
+ *   The comment ID.
+ * @param $node_type
+ *   The node type the comment is attached to.
+ * @return
+ *   The page number.
+ */
+function comment_get_display_page($cid, $node_type) {
+  $ordinal = comment_get_display_ordinal($cid, $node_type);
+  $comments_per_page = variable_get('comment_default_per_page_' . $node_type, 50);
+  return floor($ordinal / $comments_per_page);
+}
+
+/**
+ * Page callback for comment editing.
+ */
+function comment_edit_page($comment) {
+  drupal_set_title(t('Edit comment %comment', array('%comment' => $comment->subject)), PASS_THROUGH);
+  $node = node_load($comment->nid);
+  return drupal_get_form("comment_node_{$node->type}_form", $comment);
+}
+
+/**
+ * Implements hook_forms().
+ */
+function comment_forms() {
+  $forms = array();
+  foreach (node_type_get_types() as $type) {
+    $forms["comment_node_{$type->type}_form"]['callback'] = 'comment_form';
+  }
+  return $forms;
+}
+
+/**
+ * Generate the basic commenting form, for appending to a node or display on a separate page.
+ *
+ * @see comment_form_validate()
+ * @see comment_form_submit()
+ *
+ * @ingroup forms
+ */
+function comment_form($form, &$form_state, $comment) {
+  global $user;
+
+  // During initial form build, add the comment entity to the form state for
+  // use during form building and processing. During a rebuild, use what is in
+  // the form state.
+  if (!isset($form_state['comment'])) {
+    $defaults = array(
+      'name' => '',
+      'mail' => '',
+      'homepage' => '',
+      'subject' => '',
+      'comment' => '',
+      'cid' => NULL,
+      'pid' => NULL,
+      'language' => LANGUAGE_NONE,
+      'uid' => 0,
+    );
+    foreach ($defaults as $key => $value) {
+      if (!isset($comment->$key)) {
+        $comment->$key = $value;
+      }
+    }
+    $form_state['comment'] = $comment;
+  }
+  else {
+    $comment = $form_state['comment'];
+  }
+
+  $node = node_load($comment->nid);
+  $form['#node'] = $node;
+
+  // Use #comment-form as unique jump target, regardless of node type.
+  $form['#id'] = drupal_html_id('comment_form');
+  $form['#attributes']['class'][] = 'comment-form';
+  $form['#theme'] = array('comment_form__node_' . $node->type, 'comment_form');
+
+  $anonymous_contact = variable_get('comment_anonymous_' . $node->type, COMMENT_ANONYMOUS_MAYNOT_CONTACT);
+  $is_admin = (!empty($comment->cid) && user_access('administer comments'));
+
+  if (!$user->uid && $anonymous_contact != COMMENT_ANONYMOUS_MAYNOT_CONTACT) {
+    $form['#attached']['library'][] = array('system', 'jquery.cookie');
+    $form['#attributes']['class'][] = 'user-info-from-cookie';
+  }
+
+  // If not replying to a comment, use our dedicated page callback for new
+  // comments on nodes.
+  if (empty($comment->cid) && empty($comment->pid)) {
+    $form['#action'] = url('comment/reply/' . $comment->nid);
+  }
+
+  if (isset($form_state['comment_preview'])) {
+    $form += $form_state['comment_preview'];
+  }
+
+  // Display author information in a fieldset for comment moderators.
+  if ($is_admin) {
+    $form['author'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Administration'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+      '#weight' => -2,
+    );
+  }
+  else {
+    // Sets the author form elements above the subject.
+    $form['author'] = array(
+      '#weight' => -2,
+    );
+  }
+
+  // Prepare default values for form elements.
+  if ($is_admin) {
+    $author = (!$comment->uid && $comment->name ? $comment->name : $comment->registered_name);
+    $status = (isset($comment->status) ? $comment->status : COMMENT_NOT_PUBLISHED);
+    $date = (!empty($comment->date) ? $comment->date : format_date($comment->created, 'custom', 'Y-m-d H:i O'));
+  }
+  else {
+    if ($user->uid) {
+      $author = $user->name;
+    }
+    else {
+      $author = ($comment->name ? $comment->name : '');
+    }
+    $status = (user_access('skip comment approval') ? COMMENT_PUBLISHED : COMMENT_NOT_PUBLISHED);
+    $date = '';
+  }
+
+  // Add the author name field depending on the current user.
+  if ($is_admin) {
+    $form['author']['name'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Authored by'),
+      '#default_value' => $author,
+      '#maxlength' => 60,
+      '#size' => 30,
+      '#description' => t('Leave blank for %anonymous.', array('%anonymous' => variable_get('anonymous', t('Anonymous')))),
+      '#autocomplete_path' => 'user/autocomplete',
+    );
+  }
+  elseif ($user->uid) {
+    $form['author']['_author'] = array(
+      '#type' => 'item',
+      '#title' => t('Your name'),
+      '#markup' => theme('username', array('account' => $user)),
+    );
+    $form['author']['name'] = array(
+      '#type' => 'value',
+      '#value' => $author,
+    );
+  }
+  else {
+    $form['author']['name'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Your name'),
+      '#default_value' => $author,
+      '#required' => (!$user->uid && $anonymous_contact == COMMENT_ANONYMOUS_MUST_CONTACT),
+      '#maxlength' => 60,
+      '#size' => 30,
+    );
+  }
+
+  // Add author e-mail and homepage fields depending on the current user.
+  $form['author']['mail'] = array(
+    '#type' => 'textfield',
+    '#title' => t('E-mail'),
+    '#default_value' => $comment->mail,
+    '#required' => (!$user->uid && $anonymous_contact == COMMENT_ANONYMOUS_MUST_CONTACT),
+    '#maxlength' => 64,
+    '#size' => 30,
+    '#description' => t('The content of this field is kept private and will not be shown publicly.'),
+    '#access' => $is_admin || (!$user->uid && $anonymous_contact != COMMENT_ANONYMOUS_MAYNOT_CONTACT),
+  );
+  $form['author']['homepage'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Homepage'),
+    '#default_value' => $comment->homepage,
+    '#maxlength' => 255,
+    '#size' => 30,
+    '#access' => $is_admin || (!$user->uid && $anonymous_contact != COMMENT_ANONYMOUS_MAYNOT_CONTACT),
+  );
+
+  // Add administrative comment publishing options.
+  $form['author']['date'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Authored on'),
+    '#default_value' => $date,
+    '#maxlength' => 25,
+    '#size' => 20,
+    '#access' => $is_admin,
+  );
+  $form['author']['status'] = array(
+    '#type' => 'radios',
+    '#title' => t('Status'),
+    '#default_value' => $status,
+    '#options' => array(
+      COMMENT_PUBLISHED => t('Published'),
+      COMMENT_NOT_PUBLISHED => t('Not published'),
+    ),
+    '#access' => $is_admin,
+  );
+
+  $form['subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#maxlength' => 64,
+    '#default_value' => $comment->subject,
+    '#access' => variable_get('comment_subject_field_' . $node->type, 1) == 1,
+    '#weight' => -1,
+  );
+
+  // Used for conditional validation of author fields.
+  $form['is_anonymous'] = array(
+    '#type' => 'value',
+    '#value' => ($comment->cid ? !$comment->uid : !$user->uid),
+  );
+
+  // Add internal comment properties.
+  foreach (array('cid', 'pid', 'nid', 'language', 'uid') as $key) {
+    $form[$key] = array('#type' => 'value', '#value' => $comment->$key);
+  }
+  $form['node_type'] = array('#type' => 'value', '#value' => 'comment_node_' . $node->type);
+
+  // Only show the save button if comment previews are optional or if we are
+  // already previewing the submission.
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+    '#access' => ($comment->cid && user_access('administer comments')) || variable_get('comment_preview_' . $node->type, DRUPAL_OPTIONAL) != DRUPAL_REQUIRED || isset($form_state['comment_preview']),
+    '#weight' => 19,
+  );
+  $form['actions']['preview'] = array(
+    '#type' => 'submit',
+    '#value' => t('Preview'),
+    '#access' => (variable_get('comment_preview_' . $node->type, DRUPAL_OPTIONAL) != DRUPAL_DISABLED),
+    '#weight' => 20,
+    '#submit' => array('comment_form_build_preview'),
+  );
+
+  // Attach fields.
+  $comment->node_type = 'comment_node_' . $node->type;
+  $langcode = entity_language('comment', $comment);
+  field_attach_form('comment', $comment, $form, $form_state, $langcode);
+
+  return $form;
+}
+
+/**
+ * Build a preview from submitted form values.
+ */
+function comment_form_build_preview($form, &$form_state) {
+  $comment = comment_form_submit_build_comment($form, $form_state);
+  $form_state['comment_preview'] = comment_preview($comment);
+  $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * Generate a comment preview.
+ */
+function comment_preview($comment) {
+  global $user;
+
+  drupal_set_title(t('Preview comment'), PASS_THROUGH);
+
+  $node = node_load($comment->nid);
+
+  if (!form_get_errors()) {
+    $comment_body = field_get_items('comment', $comment, 'comment_body');
+    $comment->format = $comment_body[0]['format'];
+    // Attach the user and time information.
+    if (!empty($comment->name)) {
+      $account = user_load_by_name($comment->name);
+    }
+    elseif ($user->uid && empty($comment->is_anonymous)) {
+      $account = $user;
+    }
+
+    if (!empty($account->uid)) {
+      $comment->uid = $account->uid;
+      $comment->name = check_plain($account->name);
+      $comment->signature = $account->signature;
+      $comment->signature_format = $account->signature_format;
+      $comment->picture = $account->picture;
+    }
+    elseif (empty($comment->name)) {
+      $comment->name = variable_get('anonymous', t('Anonymous'));
+    }
+
+    $comment->created = !empty($comment->created) ? $comment->created : REQUEST_TIME;
+    $comment->changed = REQUEST_TIME;
+    $comment->in_preview = TRUE;
+    $comment_build = comment_view($comment, $node);
+    $comment_build['#weight'] = -100;
+
+    $form['comment_preview'] = $comment_build;
+  }
+
+  if ($comment->pid) {
+    $build = array();
+    if ($comments = comment_load_multiple(array($comment->pid), array('status' => COMMENT_PUBLISHED))) {
+      $parent_comment = $comments[$comment->pid];
+      $build = comment_view($parent_comment, $node);
+    }
+  }
+  else {
+    $build = node_view($node);
+  }
+
+  $form['comment_output_below'] = $build;
+  $form['comment_output_below']['#weight'] = 100;
+
+  return $form;
+}
+
+/**
+ * Validate comment form submissions.
+ */
+function comment_form_validate($form, &$form_state) {
+  global $user;
+
+  entity_form_field_validate('comment', $form, $form_state);
+
+  if (!empty($form_state['values']['cid'])) {
+    // Verify the name in case it is being changed from being anonymous.
+    $account = user_load_by_name($form_state['values']['name']);
+    $form_state['values']['uid'] = $account ? $account->uid : 0;
+
+    if ($form_state['values']['date'] && strtotime($form_state['values']['date']) === FALSE) {
+      form_set_error('date', t('You have to specify a valid date.'));
+    }
+    if ($form_state['values']['name'] && !$form_state['values']['is_anonymous'] && !$account) {
+      form_set_error('name', t('You have to specify a valid author.'));
+    }
+  }
+  elseif ($form_state['values']['is_anonymous']) {
+    // Validate anonymous comment author fields (if given). If the (original)
+    // author of this comment was an anonymous user, verify that no registered
+    // user with this name exists.
+    if ($form_state['values']['name']) {
+      $query = db_select('users', 'u');
+      $query->addField('u', 'uid', 'uid');
+      $taken = $query
+        ->condition('name', db_like($form_state['values']['name']), 'LIKE')
+        ->countQuery()
+        ->execute()
+        ->fetchField();
+      if ($taken) {
+        form_set_error('name', t('The name you used belongs to a registered user.'));
+      }
+    }
+  }
+  if ($form_state['values']['mail'] && !valid_email_address($form_state['values']['mail'])) {
+    form_set_error('mail', t('The e-mail address you specified is not valid.'));
+  }
+  if ($form_state['values']['homepage'] && !valid_url($form_state['values']['homepage'], TRUE)) {
+    form_set_error('homepage', t('The URL of your homepage is not valid. Remember that it must be fully qualified, i.e. of the form <code>http://example.com/directory</code>.'));
+  }
+}
+
+/**
+ * Prepare a comment for submission.
+ */
+function comment_submit($comment) {
+  // @todo Legacy support. Remove in Drupal 8.
+  if (is_array($comment)) {
+    $comment += array('subject' => '');
+    $comment = (object) $comment;
+  }
+
+  if (empty($comment->date)) {
+    $comment->date = 'now';
+  }
+  $comment->created = strtotime($comment->date);
+  $comment->changed = REQUEST_TIME;
+
+  // If the comment was posted by a registered user, assign the author's ID.
+  // @todo Too fragile. Should be prepared and stored in comment_form() already.
+  if (!$comment->is_anonymous && !empty($comment->name) && ($account = user_load_by_name($comment->name))) {
+    $comment->uid = $account->uid;
+  }
+  // If the comment was posted by an anonymous user and no author name was
+  // required, use "Anonymous" by default.
+  if ($comment->is_anonymous && (!isset($comment->name) || $comment->name === '')) {
+    $comment->name = variable_get('anonymous', t('Anonymous'));
+  }
+
+  // Validate the comment's subject. If not specified, extract from comment body.
+  if (trim($comment->subject) == '') {
+    // The body may be in any format, so:
+    // 1) Filter it into HTML
+    // 2) Strip out all HTML tags
+    // 3) Convert entities back to plain-text.
+    $field = field_info_field('comment_body');
+    $langcode = field_is_translatable('comment', $field) ? entity_language('comment', $comment) : LANGUAGE_NONE;
+    $comment_body = $comment->comment_body[$langcode][0];
+    if (isset($comment_body['format'])) {
+      $comment_text = check_markup($comment_body['value'], $comment_body['format']);
+    }
+    else {
+      $comment_text = check_plain($comment_body['value']);
+    }
+    $comment->subject = truncate_utf8(trim(decode_entities(strip_tags($comment_text))), 29, TRUE);
+    // Edge cases where the comment body is populated only by HTML tags will
+    // require a default subject.
+    if ($comment->subject == '') {
+      $comment->subject = t('(No subject)');
+    }
+  }
+  return $comment;
+}
+
+/**
+ * Updates the form state's comment entity by processing this submission's values.
+ *
+ * This is the default builder function for the comment form. It is called
+ * during the "Save" and "Preview" submit handlers to retrieve the entity to
+ * save or preview. This function can also be called by a "Next" button of a
+ * wizard to update the form state's entity with the current step's values
+ * before proceeding to the next step.
+ *
+ * @see comment_form()
+ */
+function comment_form_submit_build_comment($form, &$form_state) {
+  $comment = $form_state['comment'];
+  entity_form_submit_build_entity('comment', $comment, $form, $form_state);
+  comment_submit($comment);
+  return $comment;
+}
+
+/**
+ * Process comment form submissions; prepare the comment, store it, and set a redirection target.
+ */
+function comment_form_submit($form, &$form_state) {
+  $node = node_load($form_state['values']['nid']);
+  $comment = comment_form_submit_build_comment($form, $form_state);
+  if (user_access('post comments') && (user_access('administer comments') || $node->comment == COMMENT_NODE_OPEN)) {
+    // Save the anonymous user information to a cookie for reuse.
+    if (user_is_anonymous()) {
+      user_cookie_save(array_intersect_key($form_state['values'], array_flip(array('name', 'mail', 'homepage'))));
+    }
+
+    comment_save($comment);
+    $form_state['values']['cid'] = $comment->cid;
+
+    // Add an entry to the watchdog log.
+    watchdog('content', 'Comment posted: %subject.', array('%subject' => $comment->subject), WATCHDOG_NOTICE, l(t('view'), 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid)));
+
+    // Explain the approval queue if necessary.
+    if ($comment->status == COMMENT_NOT_PUBLISHED) {
+      if (!user_access('administer comments')) {
+        drupal_set_message(t('Your comment has been queued for review by site administrators and will be published after approval.'));
+      }
+    }
+    else {
+      drupal_set_message(t('Your comment has been posted.'));
+    }
+    $query = array();
+    // Find the current display page for this comment.
+    $page = comment_get_display_page($comment->cid, $node->type);
+    if ($page > 0) {
+      $query['page'] = $page;
+    }
+    // Redirect to the newly posted comment.
+    $redirect = array('node/' . $node->nid, array('query' => $query, 'fragment' => 'comment-' . $comment->cid));
+  }
+  else {
+    watchdog('content', 'Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject), WATCHDOG_WARNING);
+    drupal_set_message(t('Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject)), 'error');
+    // Redirect the user to the node they are commenting on.
+    $redirect = 'node/' . $node->nid;
+  }
+  $form_state['redirect'] = $redirect;
+  // Clear the block and page caches so that anonymous users see the comment
+  // they have posted.
+  cache_clear_all();
+}
+
+/**
+ * Process variables for comment.tpl.php.
+ *
+ * @see comment.tpl.php
+ */
+function template_preprocess_comment(&$variables) {
+  $comment = $variables['elements']['#comment'];
+  $node = $variables['elements']['#node'];
+  $variables['comment']   = $comment;
+  $variables['node']      = $node;
+  $variables['author']    = theme('username', array('account' => $comment));
+
+  $variables['created']   = format_date($comment->created);
+
+  // Avoid calling format_date() twice on the same timestamp.
+  if ($comment->changed == $comment->created) {
+    $variables['changed'] = $variables['created'];
+  }
+  else {
+    $variables['changed'] = format_date($comment->changed);
+  }
+
+  $variables['new']       = !empty($comment->new) ? t('new') : '';
+  $variables['picture']   = theme_get_setting('toggle_comment_user_picture') ? theme('user_picture', array('account' => $comment)) : '';
+  $variables['signature'] = $comment->signature;
+
+  $uri = entity_uri('comment', $comment);
+  $uri['options'] += array('attributes' => array('class' => 'permalink', 'rel' => 'bookmark'));
+
+  $variables['title']     = l($comment->subject, $uri['path'], $uri['options']);
+  $variables['permalink'] = l(t('Permalink'), $uri['path'], $uri['options']);
+  $variables['submitted'] = t('Submitted by !username on !datetime', array('!username' => $variables['author'], '!datetime' => $variables['created']));
+
+  // Preprocess fields.
+  field_attach_preprocess('comment', $comment, $variables['elements'], $variables);
+
+  // Helpful $content variable for templates.
+  foreach (element_children($variables['elements']) as $key) {
+    $variables['content'][$key] = $variables['elements'][$key];
+  }
+
+  // Set status to a string representation of comment->status.
+  if (isset($comment->in_preview)) {
+    $variables['status'] = 'comment-preview';
+  }
+  else {
+    $variables['status'] = ($comment->status == COMMENT_NOT_PUBLISHED) ? 'comment-unpublished' : 'comment-published';
+  }
+
+  // Gather comment classes.
+  // 'comment-published' class is not needed, it is either 'comment-preview' or
+  // 'comment-unpublished'.
+  if ($variables['status'] != 'comment-published') {
+    $variables['classes_array'][] = $variables['status'];
+  }
+  if ($variables['new']) {
+    $variables['classes_array'][] = 'comment-new';
+  }
+  if (!$comment->uid) {
+    $variables['classes_array'][] = 'comment-by-anonymous';
+  }
+  else {
+    if ($comment->uid == $variables['node']->uid) {
+      $variables['classes_array'][] = 'comment-by-node-author';
+    }
+    if ($comment->uid == $variables['user']->uid) {
+      $variables['classes_array'][] = 'comment-by-viewer';
+    }
+  }
+}
+
+/**
+ * Returns HTML for a "you can't post comments" notice.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - node: The comment node.
+ *
+ * @ingroup themeable
+ */
+function theme_comment_post_forbidden($variables) {
+  $node = $variables['node'];
+  global $user;
+
+  // Since this is expensive to compute, we cache it so that a page with many
+  // comments only has to query the database once for all the links.
+  $authenticated_post_comments = &drupal_static(__FUNCTION__, NULL);
+
+  if (!$user->uid) {
+    if (!isset($authenticated_post_comments)) {
+      // We only output a link if we are certain that users will get permission
+      // to post comments by logging in.
+      $comment_roles = user_roles(TRUE, 'post comments');
+      $authenticated_post_comments = isset($comment_roles[DRUPAL_AUTHENTICATED_RID]);
+    }
+
+    if ($authenticated_post_comments) {
+      // We cannot use drupal_get_destination() because these links
+      // sometimes appear on /node and taxonomy listing pages.
+      if (variable_get('comment_form_location_' . $node->type, COMMENT_FORM_BELOW) == COMMENT_FORM_SEPARATE_PAGE) {
+        $destination = array('destination' => "comment/reply/$node->nid#comment-form");
+      }
+      else {
+        $destination = array('destination' => "node/$node->nid#comment-form");
+      }
+
+      if (variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL)) {
+        // Users can register themselves.
+        return t('<a href="@login">Log in</a> or <a href="@register">register</a> to post comments', array('@login' => url('user/login', array('query' => $destination)), '@register' => url('user/register', array('query' => $destination))));
+      }
+      else {
+        // Only admins can add new users, no public registration.
+        return t('<a href="@login">Log in</a> to post comments', array('@login' => url('user/login', array('query' => $destination))));
+      }
+    }
+  }
+}
+
+/**
+ * Process variables for comment-wrapper.tpl.php.
+ *
+ * @see comment-wrapper.tpl.php
+ */
+function template_preprocess_comment_wrapper(&$variables) {
+  // Provide contextual information.
+  $variables['node'] = $variables['content']['#node'];
+  $variables['display_mode'] = variable_get('comment_default_mode_' . $variables['node']->type, COMMENT_MODE_THREADED);
+  // The comment form is optional and may not exist.
+  $variables['content'] += array('comment_form' => array());
+}
+
+/**
+ * Return an array of viewing modes for comment listings.
+ *
+ * We can't use a global variable array because the locale system
+ * is not initialized yet when the comment module is loaded.
+ */
+function _comment_get_modes() {
+  return array(
+    COMMENT_MODE_FLAT => t('Flat list'),
+    COMMENT_MODE_THREADED => t('Threaded list')
+  );
+}
+
+/**
+ * Return an array of "comments per page" settings from which the user
+ * can choose.
+ */
+function _comment_per_page() {
+  return drupal_map_assoc(array(10, 30, 50, 70, 90, 150, 200, 250, 300));
+}
+
+/**
+ * Updates the comment statistics for a given node. This should be called any
+ * time a comment is added, deleted, or updated.
+ *
+ * The following fields are contained in the node_comment_statistics table.
+ * - last_comment_timestamp: the timestamp of the last comment for this node or the node create stamp if no comments exist for the node.
+ * - last_comment_name: the name of the anonymous poster for the last comment
+ * - last_comment_uid: the uid of the poster for the last comment for this node or the node authors uid if no comments exists for the node.
+ * - comment_count: the total number of approved/published comments on this node.
+ */
+function _comment_update_node_statistics($nid) {
+  // Allow bulk updates and inserts to temporarily disable the
+  // maintenance of the {node_comment_statistics} table.
+  if (!variable_get('comment_maintain_node_statistics', TRUE)) {
+    return;
+  }
+
+  $count = db_query('SELECT COUNT(cid) FROM {comment} WHERE nid = :nid AND status = :status', array(
+    ':nid' => $nid,
+    ':status' => COMMENT_PUBLISHED,
+  ))->fetchField();
+
+  if ($count > 0) {
+    // Comments exist.
+    $last_reply = db_query_range('SELECT cid, name, changed, uid FROM {comment} WHERE nid = :nid AND status = :status ORDER BY cid DESC', 0, 1, array(
+      ':nid' => $nid,
+      ':status' => COMMENT_PUBLISHED,
+    ))->fetchObject();
+    db_update('node_comment_statistics')
+      ->fields(array(
+        'cid' => $last_reply->cid,
+        'comment_count' => $count,
+        'last_comment_timestamp' => $last_reply->changed,
+        'last_comment_name' => $last_reply->uid ? '' : $last_reply->name,
+        'last_comment_uid' => $last_reply->uid,
+      ))
+      ->condition('nid', $nid)
+      ->execute();
+  }
+  else {
+    // Comments do not exist.
+    $node = db_query('SELECT uid, created FROM {node} WHERE nid = :nid', array(':nid' => $nid))->fetchObject();
+    db_update('node_comment_statistics')
+      ->fields(array(
+        'cid' => 0,
+        'comment_count' => 0,
+        'last_comment_timestamp' => $node->created,
+        'last_comment_name' => '',
+        'last_comment_uid' => $node->uid,
+      ))
+      ->condition('nid', $nid)
+      ->execute();
+  }
+}
+
+/**
+ * Generate vancode.
+ *
+ * Consists of a leading character indicating length, followed by N digits
+ * with a numerical value in base 36. Vancodes can be sorted as strings
+ * without messing up numerical order.
+ *
+ * It goes:
+ * 00, 01, 02, ..., 0y, 0z,
+ * 110, 111, ... , 1zy, 1zz,
+ * 2100, 2101, ..., 2zzy, 2zzz,
+ * 31000, 31001, ...
+ */
+function int2vancode($i = 0) {
+  $num = base_convert((int) $i, 10, 36);
+  $length = strlen($num);
+
+  return chr($length + ord('0') - 1) . $num;
+}
+
+/**
+ * Decode vancode back to an integer.
+ */
+function vancode2int($c = '00') {
+  return base_convert(substr($c, 1), 36, 10);
+}
+
+/**
+ * Implements hook_action_info().
+ */
+function comment_action_info() {
+  return array(
+    'comment_publish_action' => array(
+      'label' => t('Publish comment'),
+      'type' => 'comment',
+      'configurable' => FALSE,
+      'behavior' => array('changes_property'),
+      'triggers' => array('comment_presave', 'comment_insert', 'comment_update'),
+    ),
+    'comment_unpublish_action' => array(
+      'label' => t('Unpublish comment'),
+      'type' => 'comment',
+      'configurable' => FALSE,
+      'behavior' => array('changes_property'),
+      'triggers' => array('comment_presave', 'comment_insert', 'comment_update'),
+    ),
+    'comment_unpublish_by_keyword_action' => array(
+      'label' => t('Unpublish comment containing keyword(s)'),
+      'type' => 'comment',
+      'configurable' => TRUE,
+      'behavior' => array('changes_property'),
+      'triggers' => array('comment_presave', 'comment_insert', 'comment_update'),
+    ),
+    'comment_save_action' => array(
+      'label' => t('Save comment'),
+      'type' => 'comment',
+      'configurable' => FALSE,
+      'triggers' => array('comment_insert', 'comment_update'),
+    ),
+  );
+}
+
+/**
+ * Publishes a comment.
+ *
+ * @param $comment
+ *   An optional comment object.
+ * @param array $context
+ *   Array with components:
+ *   - 'cid': Comment ID. Required if $comment is not given.
+ *
+ * @ingroup actions
+ */
+function comment_publish_action($comment, $context = array()) {
+  if (isset($comment->subject)) {
+    $subject = $comment->subject;
+    $comment->status = COMMENT_PUBLISHED;
+  }
+  else {
+    $cid = $context['cid'];
+    $subject = db_query('SELECT subject FROM {comment} WHERE cid = :cid', array(':cid' => $cid))->fetchField();
+    db_update('comment')
+      ->fields(array('status' => COMMENT_PUBLISHED))
+      ->condition('cid', $cid)
+      ->execute();
+  }
+  watchdog('action', 'Published comment %subject.', array('%subject' => $subject));
+}
+
+/**
+ * Unpublishes a comment.
+ *
+ * @param $comment
+ *   An optional comment object.
+ * @param array $context
+ *   Array with components:
+ *   - 'cid': Comment ID. Required if $comment is not given.
+ *
+ * @ingroup actions
+ */
+function comment_unpublish_action($comment, $context = array()) {
+  if (isset($comment->subject)) {
+    $subject = $comment->subject;
+    $comment->status = COMMENT_NOT_PUBLISHED;
+  }
+  else {
+    $cid = $context['cid'];
+    $subject = db_query('SELECT subject FROM {comment} WHERE cid = :cid', array(':cid' => $cid))->fetchField();
+    db_update('comment')
+      ->fields(array('status' => COMMENT_NOT_PUBLISHED))
+      ->condition('cid', $cid)
+      ->execute();
+  }
+  watchdog('action', 'Unpublished comment %subject.', array('%subject' => $subject));
+}
+
+/**
+ * Unpublishes a comment if it contains certain keywords.
+ *
+ * @param $comment
+ *   Comment object to modify.
+ * @param array $context
+ *   Array with components:
+ *   - 'keywords': Keywords to look for. If the comment contains at least one
+ *     of the keywords, it is unpublished.
+ *
+ * @ingroup actions
+ * @see comment_unpublish_by_keyword_action_form()
+ * @see comment_unpublish_by_keyword_action_submit()
+ */
+function comment_unpublish_by_keyword_action($comment, $context) {
+  foreach ($context['keywords'] as $keyword) {
+    $text = drupal_render($comment);
+    if (strpos($text, $keyword) !== FALSE) {
+      $comment->status = COMMENT_NOT_PUBLISHED;
+      watchdog('action', 'Unpublished comment %subject.', array('%subject' => $comment->subject));
+      break;
+    }
+  }
+}
+
+/**
+ * Form builder; Prepare a form for blacklisted keywords.
+ *
+ * @ingroup forms
+ * @see comment_unpublish_by_keyword_action()
+ * @see comment_unpublish_by_keyword_action_submit()
+ */
+function comment_unpublish_by_keyword_action_form($context) {
+  $form['keywords'] = array(
+    '#title' => t('Keywords'),
+    '#type' => 'textarea',
+    '#description' => t('The comment will be unpublished if it contains any of the phrases above. Use a case-sensitive, comma-separated list of phrases. Example: funny, bungee jumping, "Company, Inc."'),
+    '#default_value' => isset($context['keywords']) ? drupal_implode_tags($context['keywords']) : '',
+  );
+
+  return $form;
+}
+
+/**
+ * Process comment_unpublish_by_keyword_action_form form submissions.
+ *
+ * @see comment_unpublish_by_keyword_action()
+ */
+function comment_unpublish_by_keyword_action_submit($form, $form_state) {
+  return array('keywords' => drupal_explode_tags($form_state['values']['keywords']));
+}
+
+/**
+ * Saves a comment.
+ *
+ * @ingroup actions
+ */
+function comment_save_action($comment) {
+  comment_save($comment);
+  cache_clear_all();
+  watchdog('action', 'Saved comment %title', array('%title' => $comment->subject));
+}
+
+/**
+ * Implements hook_ranking().
+ */
+function comment_ranking() {
+  return array(
+    'comments' => array(
+      'title' => t('Number of comments'),
+      'join' => array(
+        'type' => 'LEFT',
+        'table' => 'node_comment_statistics',
+        'alias' => 'node_comment_statistics',
+        'on' => 'node_comment_statistics.nid = i.sid',
+      ),
+      // Inverse law that maps the highest reply count on the site to 1 and 0 to 0.
+      'score' => '2.0 - 2.0 / (1.0 + node_comment_statistics.comment_count * CAST(:scale AS DECIMAL))',
+      'arguments' => array(':scale' => variable_get('node_cron_comments_scale', 0)),
+    ),
+  );
+}
+
+/**
+ * Implements hook_rdf_mapping().
+ */
+function comment_rdf_mapping() {
+  return array(
+    array(
+      'type' => 'comment',
+      'bundle' => RDF_DEFAULT_BUNDLE,
+      'mapping' => array(
+        'rdftype' => array('sioc:Post', 'sioct:Comment'),
+        'title' => array(
+          'predicates' => array('dc:title'),
+        ),
+        'created' => array(
+          'predicates' => array('dc:date', 'dc:created'),
+          'datatype' => 'xsd:dateTime',
+          'callback' => 'date_iso8601',
+        ),
+        'changed' => array(
+          'predicates' => array('dc:modified'),
+          'datatype' => 'xsd:dateTime',
+          'callback' => 'date_iso8601',
+        ),
+        'comment_body' => array(
+          'predicates' => array('content:encoded'),
+        ),
+        'pid' => array(
+          'predicates' => array('sioc:reply_of'),
+          'type' => 'rel',
+        ),
+        'uid' => array(
+          'predicates' => array('sioc:has_creator'),
+          'type' => 'rel',
+        ),
+        'name' => array(
+          'predicates' => array('foaf:name'),
+        ),
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_file_download_access().
+ */
+function comment_file_download_access($field, $entity_type, $entity) {
+  if ($entity_type == 'comment') {
+    if (user_access('access comments') && $entity->status == COMMENT_PUBLISHED || user_access('administer comments')) {
+      $node = node_load($entity->nid);
+      return node_access('view', $node);
+    }
+    return FALSE;
+  }
+}
diff --git a/htmltest/modules/comment/comment.pages.inc b/htmltest/modules/comment/comment.pages.inc
new file mode 100644
index 00000000..482e3f2f
--- /dev/null
+++ b/htmltest/modules/comment/comment.pages.inc
@@ -0,0 +1,123 @@
+<?php
+
+/**
+ * @file
+ * User page callbacks for the comment module.
+ */
+
+/**
+ * This function is responsible for generating a comment reply form.
+ * There are several cases that have to be handled, including:
+ *   - replies to comments
+ *   - replies to nodes
+ *   - attempts to reply to nodes that can no longer accept comments
+ *   - respecting access permissions ('access comments', 'post comments', etc.)
+ *
+ * The node or comment that is being replied to must appear above the comment
+ * form to provide the user context while authoring the comment.
+ *
+ * @param $node
+ *   Every comment belongs to a node. This is that node.
+ *
+ * @param $pid
+ *   Some comments are replies to other comments. In those cases, $pid is the parent
+ *   comment's cid.
+ *
+ * @return array
+ *   An associative array containing:
+ *   - An array for rendering the node or parent comment.
+ *     - comment_node: If the comment is a reply to the node.
+ *     - comment_parent: If the comment is a reply to another comment.
+ *   - comment_form: The comment form as a renderable array.
+ */
+function comment_reply($node, $pid = NULL) {
+  // Set the breadcrumb trail.
+  drupal_set_breadcrumb(array(l(t('Home'), NULL), l($node->title, 'node/' . $node->nid)));
+  $op = isset($_POST['op']) ? $_POST['op'] : '';
+  $build = array();
+
+  // The user is previewing a comment prior to submitting it.
+  if ($op == t('Preview')) {
+    if (user_access('post comments')) {
+      $build['comment_form'] = drupal_get_form("comment_node_{$node->type}_form", (object) array('pid' => $pid, 'nid' => $node->nid));
+    }
+    else {
+      drupal_set_message(t('You are not authorized to post comments.'), 'error');
+      drupal_goto("node/$node->nid");
+    }
+  }
+  else {
+    // $pid indicates that this is a reply to a comment.
+    if ($pid) {
+      if (user_access('access comments')) {
+        // Load the comment whose cid = $pid
+        $comment = db_query('SELECT c.*, u.uid, u.name AS registered_name, u.signature, u.signature_format, u.picture, u.data FROM {comment} c INNER JOIN {users} u ON c.uid = u.uid WHERE c.cid = :cid AND c.status = :status', array(
+          ':cid' => $pid,
+          ':status' => COMMENT_PUBLISHED,
+        ))->fetchObject();
+        if ($comment) {
+          // If that comment exists, make sure that the current comment and the
+          // parent comment both belong to the same parent node.
+          if ($comment->nid != $node->nid) {
+            // Attempting to reply to a comment not belonging to the current nid.
+            drupal_set_message(t('The comment you are replying to does not exist.'), 'error');
+            drupal_goto("node/$node->nid");
+          }
+          // Display the parent comment
+          $comment->node_type = 'comment_node_' . $node->type;
+          field_attach_load('comment', array($comment->cid => $comment));
+          $comment->name = $comment->uid ? $comment->registered_name : $comment->name;
+          $build['comment_parent'] = comment_view($comment, $node);
+        }
+        else {
+          drupal_set_message(t('The comment you are replying to does not exist.'), 'error');
+          drupal_goto("node/$node->nid");
+        }
+      }
+      else {
+        drupal_set_message(t('You are not authorized to view comments.'), 'error');
+        drupal_goto("node/$node->nid");
+      }
+    }
+    // This is the case where the comment is in response to a node. Display the node.
+    elseif (user_access('access content')) {
+      $build['comment_node'] = node_view($node);
+    }
+
+    // Should we show the reply box?
+    if ($node->comment != COMMENT_NODE_OPEN) {
+      drupal_set_message(t("This discussion is closed: you can't post new comments."), 'error');
+      drupal_goto("node/$node->nid");
+    }
+    elseif (user_access('post comments')) {
+      $edit = array('nid' => $node->nid, 'pid' => $pid);
+      $build['comment_form'] = drupal_get_form("comment_node_{$node->type}_form", (object) $edit);
+    }
+    else {
+      drupal_set_message(t('You are not authorized to post comments.'), 'error');
+      drupal_goto("node/$node->nid");
+    }
+  }
+
+  return $build;
+}
+
+/**
+ * Menu callback; publish specified comment.
+ *
+ * @param $cid
+ *   A comment identifier.
+ */
+function comment_approve($cid) {
+  if (!isset($_GET['token']) || !drupal_valid_token($_GET['token'], "comment/$cid/approve")) {
+    return MENU_ACCESS_DENIED;
+  }
+  if ($comment = comment_load($cid)) {
+    $comment->status = COMMENT_PUBLISHED;
+    comment_save($comment);
+
+    drupal_set_message(t('Comment approved.'));
+    drupal_goto('node/' . $comment->nid);
+  }
+  return MENU_NOT_FOUND;
+}
diff --git a/htmltest/modules/comment/comment.test b/htmltest/modules/comment/comment.test
new file mode 100644
index 00000000..9e69ba62
--- /dev/null
+++ b/htmltest/modules/comment/comment.test
@@ -0,0 +1,2225 @@
+<?php
+
+/**
+ * @file
+ * Tests for comment.module.
+ */
+
+class CommentHelperCase extends DrupalWebTestCase {
+  protected $admin_user;
+  protected $web_user;
+  protected $node;
+
+  function setUp() {
+    parent::setUp('comment', 'search');
+    // Create users and test node.
+    $this->admin_user = $this->drupalCreateUser(array('administer content types', 'administer comments', 'administer blocks'));
+    $this->web_user = $this->drupalCreateUser(array('access comments', 'post comments', 'create article content', 'edit own comments'));
+    $this->node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1, 'uid' => $this->web_user->uid));
+  }
+
+  /**
+   * Post comment.
+   *
+   * @param $node
+   *   Node to post comment on.
+   * @param $comment
+   *   Comment body.
+   * @param $subject
+   *   Comment subject.
+   * @param $contact
+   *   Set to NULL for no contact info, TRUE to ignore success checking, and
+   *   array of values to set contact info.
+   */
+  function postComment($node, $comment, $subject = '', $contact = NULL) {
+    $langcode = LANGUAGE_NONE;
+    $edit = array();
+    $edit['comment_body[' . $langcode . '][0][value]'] = $comment;
+
+    $preview_mode = variable_get('comment_preview_article', DRUPAL_OPTIONAL);
+    $subject_mode = variable_get('comment_subject_field_article', 1);
+
+    // Must get the page before we test for fields.
+    if ($node !== NULL) {
+      $this->drupalGet('comment/reply/' . $node->nid);
+    }
+
+    if ($subject_mode == TRUE) {
+      $edit['subject'] = $subject;
+    }
+    else {
+      $this->assertNoFieldByName('subject', '', 'Subject field not found.');
+    }
+
+    if ($contact !== NULL && is_array($contact)) {
+      $edit += $contact;
+    }
+    switch ($preview_mode) {
+      case DRUPAL_REQUIRED:
+        // Preview required so no save button should be found.
+        $this->assertNoFieldByName('op', t('Save'), 'Save button not found.');
+        $this->drupalPost(NULL, $edit, t('Preview'));
+        // Don't break here so that we can test post-preview field presence and
+        // function below.
+      case DRUPAL_OPTIONAL:
+        $this->assertFieldByName('op', t('Preview'), 'Preview button found.');
+        $this->assertFieldByName('op', t('Save'), 'Save button found.');
+        $this->drupalPost(NULL, $edit, t('Save'));
+        break;
+
+      case DRUPAL_DISABLED:
+        $this->assertNoFieldByName('op', t('Preview'), 'Preview button not found.');
+        $this->assertFieldByName('op', t('Save'), 'Save button found.');
+        $this->drupalPost(NULL, $edit, t('Save'));
+        break;
+    }
+    $match = array();
+    // Get comment ID
+    preg_match('/#comment-([0-9]+)/', $this->getURL(), $match);
+
+    // Get comment.
+    if ($contact !== TRUE) { // If true then attempting to find error message.
+      if ($subject) {
+        $this->assertText($subject, 'Comment subject posted.');
+      }
+      $this->assertText($comment, 'Comment body posted.');
+      $this->assertTrue((!empty($match) && !empty($match[1])), 'Comment id found.');
+    }
+
+    if (isset($match[1])) {
+      return (object) array('id' => $match[1], 'subject' => $subject, 'comment' => $comment);
+    }
+  }
+
+  /**
+   * Checks current page for specified comment.
+   *
+   * @param object $comment Comment object.
+   * @param boolean $reply The comment is a reply to another comment.
+   * @return boolean Comment found.
+   */
+  function commentExists($comment, $reply = FALSE) {
+    if ($comment && is_object($comment)) {
+      $regex = '/' . ($reply ? '<div class="indented">(.*?)' : '');
+      $regex .= '<a id="comment-' . $comment->id . '"(.*?)'; // Comment anchor.
+      $regex .= '<div(.*?)'; // Begin in comment div.
+      $regex .= $comment->subject . '(.*?)'; // Match subject.
+      $regex .= $comment->comment . '(.*?)'; // Match comment.
+      $regex .= '/s';
+
+      return (boolean)preg_match($regex, $this->drupalGetContent());
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  /**
+   * Delete comment.
+   *
+   * @param object $comment
+   *   Comment to delete.
+   */
+  function deleteComment($comment) {
+    $this->drupalPost('comment/' . $comment->id . '/delete', array(), t('Delete'));
+    $this->assertText(t('The comment and all its replies have been deleted.'), 'Comment deleted.');
+  }
+
+  /**
+   * Set comment subject setting.
+   *
+   * @param boolean $enabled
+   *   Subject value.
+   */
+  function setCommentSubject($enabled) {
+    $this->setCommentSettings('comment_subject_field', ($enabled ? '1' : '0'), 'Comment subject ' . ($enabled ? 'enabled' : 'disabled') . '.');
+  }
+
+  /**
+   * Set comment preview setting.
+   *
+   * @param int $mode
+   *   Preview value.
+   */
+  function setCommentPreview($mode) {
+    switch ($mode) {
+      case DRUPAL_DISABLED:
+        $mode_text = 'disabled';
+        break;
+
+      case DRUPAL_OPTIONAL:
+        $mode_text = 'optional';
+        break;
+
+      case DRUPAL_REQUIRED:
+        $mode_text = 'required';
+        break;
+    }
+    $this->setCommentSettings('comment_preview', $mode, format_string('Comment preview @mode_text.', array('@mode_text' => $mode_text)));
+  }
+
+  /**
+   * Set comment form location setting.
+   *
+   * @param boolean $enabled
+   *   Form value.
+   */
+  function setCommentForm($enabled) {
+    $this->setCommentSettings('comment_form_location', ($enabled ? COMMENT_FORM_BELOW : COMMENT_FORM_SEPARATE_PAGE), 'Comment controls ' . ($enabled ? 'enabled' : 'disabled') . '.');
+  }
+
+  /**
+   * Set comment anonymous level setting.
+   *
+   * @param integer $level
+   *   Anonymous level.
+   */
+  function setCommentAnonymous($level) {
+    $this->setCommentSettings('comment_anonymous', $level, format_string('Anonymous commenting set to level @level.', array('@level' => $level)));
+  }
+
+  /**
+   * Set the default number of comments per page.
+   *
+   * @param integer $comments
+   *   Comments per page value.
+   */
+  function setCommentsPerPage($number) {
+    $this->setCommentSettings('comment_default_per_page', $number, format_string('Number of comments per page set to @number.', array('@number' => $number)));
+  }
+
+  /**
+   * Set comment setting for article content type.
+   *
+   * @param string $name
+   *   Name of variable.
+   * @param string $value
+   *   Value of variable.
+   * @param string $message
+   *   Status message to display.
+   */
+  function setCommentSettings($name, $value, $message) {
+    variable_set($name . '_article', $value);
+    // Display status message.
+    $this->pass($message);
+  }
+
+  /**
+   * Check for contact info.
+   *
+   * @return boolean Contact info is available.
+   */
+  function commentContactInfoAvailable() {
+    return preg_match('/(input).*?(name="name").*?(input).*?(name="mail").*?(input).*?(name="homepage")/s', $this->drupalGetContent());
+  }
+
+  /**
+   * Perform the specified operation on the specified comment.
+   *
+   * @param object $comment
+   *   Comment to perform operation on.
+   * @param string $operation
+   *   Operation to perform.
+   * @param boolean $aproval
+   *   Operation is found on approval page.
+   */
+  function performCommentOperation($comment, $operation, $approval = FALSE) {
+    $edit = array();
+    $edit['operation'] = $operation;
+    $edit['comments[' . $comment->id . ']'] = TRUE;
+    $this->drupalPost('admin/content/comment' . ($approval ? '/approval' : ''), $edit, t('Update'));
+
+    if ($operation == 'delete') {
+      $this->drupalPost(NULL, array(), t('Delete comments'));
+      $this->assertRaw(format_plural(1, 'Deleted 1 comment.', 'Deleted @count comments.'), format_string('Operation @operation was performed on comment.', array('@operation' => $operation)));
+    }
+    else {
+      $this->assertText(t('The update has been performed.'), format_string('Operation @operation was performed on comment.', array('@operation' => $operation)));
+    }
+  }
+
+  /**
+   * Get the comment ID for an unapproved comment.
+   *
+   * @param string $subject
+   *   Comment subject to find.
+   * @return integer
+   *   Comment id.
+   */
+  function getUnapprovedComment($subject) {
+    $this->drupalGet('admin/content/comment/approval');
+    preg_match('/href="(.*?)#comment-([^"]+)"(.*?)>(' . $subject . ')/', $this->drupalGetContent(), $match);
+
+    return $match[2];
+  }
+}
+
+class CommentInterfaceTest extends CommentHelperCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment interface',
+      'description' => 'Test comment user interfaces.',
+      'group' => 'Comment',
+    );
+  }
+
+  /**
+   * Test comment interface.
+   */
+  function testCommentInterface() {
+    $langcode = LANGUAGE_NONE;
+    // Set comments to have subject and preview disabled.
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentPreview(DRUPAL_DISABLED);
+    $this->setCommentForm(TRUE);
+    $this->setCommentSubject(FALSE);
+    $this->setCommentSettings('comment_default_mode', COMMENT_MODE_THREADED, 'Comment paging changed.');
+    $this->drupalLogout();
+
+    // Post comment #1 without subject or preview.
+    $this->drupalLogin($this->web_user);
+    $comment_text = $this->randomName();
+    $comment = $this->postComment($this->node, $comment_text);
+    $comment_loaded = comment_load($comment->id);
+    $this->assertTrue($this->commentExists($comment), 'Comment found.');
+
+    // Set comments to have subject and preview to required.
+    $this->drupalLogout();
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentSubject(TRUE);
+    $this->setCommentPreview(DRUPAL_REQUIRED);
+    $this->drupalLogout();
+
+    // Create comment #2 that allows subject and requires preview.
+    $this->drupalLogin($this->web_user);
+    $subject_text = $this->randomName();
+    $comment_text = $this->randomName();
+    $comment = $this->postComment($this->node, $comment_text, $subject_text, TRUE);
+    $comment_loaded = comment_load($comment->id);
+    $this->assertTrue($this->commentExists($comment), 'Comment found.');
+
+    // Check comment display.
+    $this->drupalGet('node/' . $this->node->nid . '/' . $comment->id);
+    $this->assertText($subject_text, 'Individual comment subject found.');
+    $this->assertText($comment_text, 'Individual comment body found.');
+
+    // Set comments to have subject and preview to optional.
+    $this->drupalLogout();
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentSubject(TRUE);
+    $this->setCommentPreview(DRUPAL_OPTIONAL);
+
+    // Test changing the comment author to "Anonymous".
+    $this->drupalGet('comment/' . $comment->id . '/edit');
+    $comment = $this->postComment(NULL, $comment->comment, $comment->subject, array('name' => ''));
+    $comment_loaded = comment_load($comment->id);
+    $this->assertTrue(empty($comment_loaded->name) && $comment_loaded->uid == 0, 'Comment author successfully changed to anonymous.');
+
+    // Test changing the comment author to an unverified user.
+    $random_name = $this->randomName();
+    $this->drupalGet('comment/' . $comment->id . '/edit');
+    $comment = $this->postComment(NULL, $comment->comment, $comment->subject, array('name' => $random_name));
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->assertText($random_name . ' (' . t('not verified') . ')', 'Comment author successfully changed to an unverified user.');
+
+    // Test changing the comment author to a verified user.
+    $this->drupalGet('comment/' . $comment->id . '/edit');
+    $comment = $this->postComment(NULL, $comment->comment, $comment->subject, array('name' => $this->web_user->name));
+    $comment_loaded = comment_load($comment->id);
+    $this->assertTrue($comment_loaded->name == $this->web_user->name && $comment_loaded->uid == $this->web_user->uid, 'Comment author successfully changed to a registered user.');
+
+    $this->drupalLogout();
+
+    // Reply to comment #2 creating comment #3 with optional preview and no
+    // subject though field enabled.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id);
+    $this->assertText($subject_text, 'Individual comment-reply subject found.');
+    $this->assertText($comment_text, 'Individual comment-reply body found.');
+    $reply = $this->postComment(NULL, $this->randomName(), '', TRUE);
+    $reply_loaded = comment_load($reply->id);
+    $this->assertTrue($this->commentExists($reply, TRUE), 'Reply found.');
+    $this->assertEqual($comment->id, $reply_loaded->pid, 'Pid of a reply to a comment is set correctly.');
+    $this->assertEqual(rtrim($comment_loaded->thread, '/') . '.00/', $reply_loaded->thread, 'Thread of reply grows correctly.');
+
+    // Second reply to comment #3 creating comment #4.
+    $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id);
+    $this->assertText($subject_text, 'Individual comment-reply subject found.');
+    $this->assertText($comment_text, 'Individual comment-reply body found.');
+    $reply = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+    $reply_loaded = comment_load($reply->id);
+    $this->assertTrue($this->commentExists($reply, TRUE), 'Second reply found.');
+    $this->assertEqual(rtrim($comment_loaded->thread, '/') . '.01/', $reply_loaded->thread, 'Thread of second reply grows correctly.');
+
+    // Edit reply.
+    $this->drupalGet('comment/' . $reply->id . '/edit');
+    $reply = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+    $this->assertTrue($this->commentExists($reply, TRUE), 'Modified reply found.');
+
+    // Correct link count
+    $this->drupalGet('node');
+    $this->assertRaw('4 comments', 'Link to the 4 comments exist.');
+
+    // Confirm a new comment is posted to the correct page.
+    $this->setCommentsPerPage(2);
+    $comment_new_page = $this->postComment($this->node, $this->randomName(), $this->randomName(), TRUE);
+    $this->assertTrue($this->commentExists($comment_new_page), 'Page one exists. %s');
+    $this->drupalGet('node/' . $this->node->nid, array('query' => array('page' => 1)));
+    $this->assertTrue($this->commentExists($reply, TRUE), 'Page two exists. %s');
+    $this->setCommentsPerPage(50);
+
+    // Attempt to post to node with comments disabled.
+    $this->node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1, 'comment' => COMMENT_NODE_HIDDEN));
+    $this->assertTrue($this->node, 'Article node created.');
+    $this->drupalGet('comment/reply/' . $this->node->nid);
+    $this->assertText('This discussion is closed', 'Posting to node with comments disabled');
+    $this->assertNoField('edit-comment', 'Comment body field found.');
+
+    // Attempt to post to node with read-only comments.
+    $this->node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1, 'comment' => COMMENT_NODE_CLOSED));
+    $this->assertTrue($this->node, 'Article node created.');
+    $this->drupalGet('comment/reply/' . $this->node->nid);
+    $this->assertText('This discussion is closed', 'Posting to node with comments read-only');
+    $this->assertNoField('edit-comment', 'Comment body field found.');
+
+    // Attempt to post to node with comments enabled (check field names etc).
+    $this->node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1, 'comment' => COMMENT_NODE_OPEN));
+    $this->assertTrue($this->node, 'Article node created.');
+    $this->drupalGet('comment/reply/' . $this->node->nid);
+    $this->assertNoText('This discussion is closed', 'Posting to node with comments enabled');
+    $this->assertField('edit-comment-body-' . $langcode . '-0-value', 'Comment body field found.');
+
+    // Delete comment and make sure that reply is also removed.
+    $this->drupalLogout();
+    $this->drupalLogin($this->admin_user);
+    $this->deleteComment($comment);
+    $this->deleteComment($comment_new_page);
+
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->assertFalse($this->commentExists($comment), 'Comment not found.');
+    $this->assertFalse($this->commentExists($reply, TRUE), 'Reply not found.');
+
+    // Enabled comment form on node page.
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentForm(TRUE);
+    $this->drupalLogout();
+
+    // Submit comment through node form.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('node/' . $this->node->nid);
+    $form_comment = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+    $this->assertTrue($this->commentExists($form_comment), 'Form comment found.');
+
+    // Disable comment form on node page.
+    $this->drupalLogout();
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentForm(FALSE);
+  }
+
+  /**
+   * Tests new comment marker.
+   */
+  public function testCommentNewCommentsIndicator() {
+    // Test if the right links are displayed when no comment is present for the
+    // node.
+    $this->drupalLogin($this->admin_user);
+    $this->node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1, 'comment' => COMMENT_NODE_OPEN));
+    $this->drupalGet('node');
+    $this->assertNoLink(t('@count comments', array('@count' => 0)));
+    $this->assertNoLink(t('@count new comments', array('@count' => 0)));
+    $this->assertLink(t('Read more'));
+    $count = $this->xpath('//div[@id=:id]/div[@class=:class]/ul/li', array(':id' => 'node-' . $this->node->nid, ':class' => 'link-wrapper'));
+    $this->assertTrue(count($count) == 1, 'One child found');
+
+    // Create a new comment. This helper function may be run with different
+    // comment settings so use comment_save() to avoid complex setup.
+    $comment = (object) array(
+      'cid' => NULL,
+      'nid' => $this->node->nid,
+      'node_type' => $this->node->type,
+      'pid' => 0,
+      'uid' => $this->loggedInUser->uid,
+      'status' => COMMENT_PUBLISHED,
+      'subject' => $this->randomName(),
+      'hostname' => ip_address(),
+      'language' => LANGUAGE_NONE,
+      'comment_body' => array(LANGUAGE_NONE => array($this->randomName())),
+    );
+    comment_save($comment);
+    $this->drupalLogout();
+
+    // Log in with 'web user' and check comment links.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('node');
+    $this->assertLink(t('1 new comment'));
+    $this->clickLink(t('1 new comment'));
+    $this->assertRaw('<a id="new"></a>', 'Found "new" marker.');
+    $this->assertTrue($this->xpath('//a[@id=:new]/following-sibling::a[1][@id=:comment_id]', array(':new' => 'new', ':comment_id' => 'comment-1')), 'The "new" anchor is positioned at the right comment.');
+
+    // Test if "new comment" link is correctly removed.
+    $this->drupalGet('node');
+    $this->assertLink(t('1 comment'));
+    $this->assertLink(t('Read more'));
+    $this->assertNoLink(t('1 new comment'));
+    $this->assertNoLink(t('@count new comments', array('@count' => 0)));
+    $count = $this->xpath('//div[@id=:id]/div[@class=:class]/ul/li', array(':id' => 'node-' . $this->node->nid, ':class' => 'link-wrapper'));
+    $this->assertTrue(count($count) == 2, print_r($count, TRUE));
+  }
+
+  /**
+   * Tests CSS classes on comments.
+   */
+  function testCommentClasses() {
+    // Create all permutations for comments, users, and nodes.
+    $parameters = array(
+      'node_uid' => array(0, $this->web_user->uid),
+      'comment_uid' => array(0, $this->web_user->uid, $this->admin_user->uid),
+      'comment_status' => array(COMMENT_PUBLISHED, COMMENT_NOT_PUBLISHED),
+      'user' => array('anonymous', 'authenticated', 'admin'),
+    );
+    $permutations = $this->generatePermutations($parameters);
+
+    foreach ($permutations as $case) {
+      // Create a new node.
+      $node = $this->drupalCreateNode(array('type' => 'article', 'uid' => $case['node_uid']));
+
+      // Add a comment.
+      $comment = (object) array(
+        'cid' => NULL,
+        'nid' => $node->nid,
+        'pid' => 0,
+        'uid' => $case['comment_uid'],
+        'status' => $case['comment_status'],
+        'subject' => $this->randomName(),
+        'language' => LANGUAGE_NONE,
+        'comment_body' => array(LANGUAGE_NONE => array($this->randomName())),
+      );
+      comment_save($comment);
+
+      // Adjust the current/viewing user.
+      switch ($case['user']) {
+        case 'anonymous':
+          $this->drupalLogout();
+          $case['user_uid'] = 0;
+          break;
+
+        case 'authenticated':
+          $this->drupalLogin($this->web_user);
+          $case['user_uid'] = $this->web_user->uid;
+          break;
+
+        case 'admin':
+          $this->drupalLogin($this->admin_user);
+          $case['user_uid'] = $this->admin_user->uid;
+          break;
+      }
+      // Request the node with the comment.
+      $this->drupalGet('node/' . $node->nid);
+
+      // Verify classes if the comment is visible for the current user.
+      if ($case['comment_status'] == COMMENT_PUBLISHED || $case['user'] == 'admin') {
+        // Verify the comment-by-anonymous class.
+        $comments = $this->xpath('//*[contains(@class, "comment-by-anonymous")]');
+        if ($case['comment_uid'] == 0) {
+          $this->assertTrue(count($comments) == 1, 'comment-by-anonymous class found.');
+        }
+        else {
+          $this->assertFalse(count($comments), 'comment-by-anonymous class not found.');
+        }
+
+        // Verify the comment-by-node-author class.
+        $comments = $this->xpath('//*[contains(@class, "comment-by-node-author")]');
+        if ($case['comment_uid'] > 0 && $case['comment_uid'] == $case['node_uid']) {
+          $this->assertTrue(count($comments) == 1, 'comment-by-node-author class found.');
+        }
+        else {
+          $this->assertFalse(count($comments), 'comment-by-node-author class not found.');
+        }
+
+        // Verify the comment-by-viewer class.
+        $comments = $this->xpath('//*[contains(@class, "comment-by-viewer")]');
+        if ($case['comment_uid'] > 0 && $case['comment_uid'] == $case['user_uid']) {
+          $this->assertTrue(count($comments) == 1, 'comment-by-viewer class found.');
+        }
+        else {
+          $this->assertFalse(count($comments), 'comment-by-viewer class not found.');
+        }
+      }
+
+      // Verify the comment-unpublished class.
+      $comments = $this->xpath('//*[contains(@class, "comment-unpublished")]');
+      if ($case['comment_status'] == COMMENT_NOT_PUBLISHED && $case['user'] == 'admin') {
+        $this->assertTrue(count($comments) == 1, 'comment-unpublished class found.');
+      }
+      else {
+        $this->assertFalse(count($comments), 'comment-unpublished class not found.');
+      }
+
+      // Verify the comment-new class.
+      if ($case['comment_status'] == COMMENT_PUBLISHED || $case['user'] == 'admin') {
+        $comments = $this->xpath('//*[contains(@class, "comment-new")]');
+        if ($case['user'] != 'anonymous') {
+          $this->assertTrue(count($comments) == 1, 'comment-new class found.');
+
+          // Request the node again. The comment-new class should disappear.
+          $this->drupalGet('node/' . $node->nid);
+          $comments = $this->xpath('//*[contains(@class, "comment-new")]');
+          $this->assertFalse(count($comments), 'comment-new class not found.');
+        }
+        else {
+          $this->assertFalse(count($comments), 'comment-new class not found.');
+        }
+      }
+    }
+  }
+
+  /**
+   * Tests the node comment statistics.
+   */
+  function testCommentNodeCommentStatistics() {
+    $langcode = LANGUAGE_NONE;
+    // Set comments to have subject and preview disabled.
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentPreview(DRUPAL_DISABLED);
+    $this->setCommentForm(TRUE);
+    $this->setCommentSubject(FALSE);
+    $this->setCommentSettings('comment_default_mode', COMMENT_MODE_THREADED, 'Comment paging changed.');
+    $this->drupalLogout();
+
+    // Creates a second user to post comments.
+    $this->web_user2 = $this->drupalCreateUser(array('access comments', 'post comments', 'create article content', 'edit own comments'));
+
+    // Checks the initial values of node comment statistics with no comment.
+    $node = node_load($this->node->nid);
+    $this->assertEqual($node->last_comment_timestamp, $this->node->created, 'The initial value of node last_comment_timestamp is the node created date.');
+    $this->assertEqual($node->last_comment_name, NULL, 'The initial value of node last_comment_name is NULL.');
+    $this->assertEqual($node->last_comment_uid, $this->web_user->uid, 'The initial value of node last_comment_uid is the node uid.');
+    $this->assertEqual($node->comment_count, 0, 'The initial value of node comment_count is zero.');
+
+    // Post comment #1 as web_user2.
+    $this->drupalLogin($this->web_user2);
+    $comment_text = $this->randomName();
+    $comment = $this->postComment($this->node, $comment_text);
+    $comment_loaded = comment_load($comment->id);
+
+    // Checks the new values of node comment statistics with comment #1.
+    // The node needs to be reloaded with a node_load_multiple cache reset.
+    $node = node_load($this->node->nid, NULL, TRUE);
+    $this->assertEqual($node->last_comment_name, NULL, 'The value of node last_comment_name is NULL.');
+    $this->assertEqual($node->last_comment_uid, $this->web_user2->uid, 'The value of node last_comment_uid is the comment #1 uid.');
+    $this->assertEqual($node->comment_count, 1, 'The value of node comment_count is 1.');
+
+    // Prepare for anonymous comment submission (comment approval enabled).
+    variable_set('user_register', USER_REGISTER_VISITORS);
+    $this->drupalLogin($this->admin_user);
+    user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
+      'access comments' => TRUE,
+      'post comments' => TRUE,
+      'skip comment approval' => FALSE,
+    ));
+    // Ensure that the poster can leave some contact info.
+    $this->setCommentAnonymous('1');
+    $this->drupalLogout();
+
+    // Post comment #2 as anonymous (comment approval enabled).
+    $this->drupalGet('comment/reply/' . $this->node->nid);
+    $anonymous_comment = $this->postComment($this->node, $this->randomName(), '', TRUE);
+    $comment_unpublished_loaded = comment_load($anonymous_comment->id);
+
+    // Checks the new values of node comment statistics with comment #2 and
+    // ensure they haven't changed since the comment has not been moderated.
+    // The node needs to be reloaded with a node_load_multiple cache reset.
+    $node = node_load($this->node->nid, NULL, TRUE);
+    $this->assertEqual($node->last_comment_name, NULL, 'The value of node last_comment_name is still NULL.');
+    $this->assertEqual($node->last_comment_uid, $this->web_user2->uid, 'The value of node last_comment_uid is still the comment #1 uid.');
+    $this->assertEqual($node->comment_count, 1, 'The value of node comment_count is still 1.');
+
+    // Prepare for anonymous comment submission (no approval required).
+    $this->drupalLogin($this->admin_user);
+    user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
+      'access comments' => TRUE,
+      'post comments' => TRUE,
+      'skip comment approval' => TRUE,
+    ));
+    $this->drupalLogout();
+
+    // Post comment #3 as anonymous.
+    $this->drupalGet('comment/reply/' . $this->node->nid);
+    $anonymous_comment = $this->postComment($this->node, $this->randomName(), '', array('name' => $this->randomName()));
+    $comment_loaded = comment_load($anonymous_comment->id);
+
+    // Checks the new values of node comment statistics with comment #3.
+    // The node needs to be reloaded with a node_load_multiple cache reset.
+    $node = node_load($this->node->nid, NULL, TRUE);
+    $this->assertEqual($node->last_comment_name, $comment_loaded->name, 'The value of node last_comment_name is the name of the anonymous user.');
+    $this->assertEqual($node->last_comment_uid, 0, 'The value of node last_comment_uid is zero.');
+    $this->assertEqual($node->comment_count, 2, 'The value of node comment_count is 2.');
+  }
+
+  /**
+   * Tests comment links.
+   *
+   * The output of comment links depends on various environment conditions:
+   * - Various Comment module configuration settings, user registration
+   *   settings, and user access permissions.
+   * - Whether the user is authenticated or not, and whether any comments exist.
+   *
+   * To account for all possible cases, this test creates permutations of all
+   * possible conditions and tests the expected appearance of comment links in
+   * each environment.
+   */
+  function testCommentLinks() {
+    // Bartik theme alters comment links, so use a different theme.
+    theme_enable(array('garland'));
+    variable_set('theme_default', 'garland');
+
+    // Remove additional user permissions from $this->web_user added by setUp(),
+    // since this test is limited to anonymous and authenticated roles only.
+    user_role_delete(key($this->web_user->roles));
+
+    // Matrix of possible environmental conditions and configuration settings.
+    // See setEnvironment() for details.
+    $conditions = array(
+      'authenticated'   => array(FALSE, TRUE),
+      'comment count'   => array(FALSE, TRUE),
+      'access comments' => array(0, 1),
+      'post comments'   => array(0, 1),
+      'form'            => array(COMMENT_FORM_BELOW, COMMENT_FORM_SEPARATE_PAGE),
+      // USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL is irrelevant for this
+      // test; there is only a difference between open and closed registration.
+      'user_register'   => array(USER_REGISTER_VISITORS, USER_REGISTER_ADMINISTRATORS_ONLY),
+      // @todo Complete test coverage for:
+      //'comments'        => array(COMMENT_NODE_OPEN, COMMENT_NODE_CLOSED, COMMENT_NODE_HIDDEN),
+      //// COMMENT_ANONYMOUS_MUST_CONTACT is irrelevant for this test.
+      //'contact '        => array(COMMENT_ANONYMOUS_MAY_CONTACT, COMMENT_ANONYMOUS_MAYNOT_CONTACT),
+    );
+
+    $environments = $this->generatePermutations($conditions);
+    foreach ($environments as $info) {
+      $this->assertCommentLinks($info);
+    }
+  }
+
+  /**
+   * Re-configures the environment, module settings, and user permissions.
+   *
+   * @param $info
+   *   An associative array describing the environment to setup:
+   *   - Environment conditions:
+   *     - authenticated: Boolean whether to test with $this->web_user or
+   *       anonymous.
+   *     - comment count: Boolean whether to test with a new/unread comment on
+   *       $this->node or no comments.
+   *   - Configuration settings:
+   *     - form: COMMENT_FORM_BELOW or COMMENT_FORM_SEPARATE_PAGE.
+   *     - user_register: USER_REGISTER_ADMINISTRATORS_ONLY or
+   *       USER_REGISTER_VISITORS.
+   *     - contact: COMMENT_ANONYMOUS_MAY_CONTACT or
+   *       COMMENT_ANONYMOUS_MAYNOT_CONTACT.
+   *     - comments: COMMENT_NODE_OPEN, COMMENT_NODE_CLOSED, or
+   *       COMMENT_NODE_HIDDEN.
+   *   - User permissions:
+   *     These are granted or revoked for the user, according to the
+   *     'authenticated' flag above. Pass 0 or 1 as parameter values. See
+   *     user_role_change_permissions().
+   *     - access comments
+   *     - post comments
+   *     - skip comment approval
+   *     - edit own comments
+   */
+  function setEnvironment(array $info) {
+    static $current;
+
+    // Apply defaults to initial environment.
+    if (!isset($current)) {
+      $current = array(
+        'authenticated' => FALSE,
+        'comment count' => FALSE,
+        'form' => COMMENT_FORM_BELOW,
+        'user_register' => USER_REGISTER_VISITORS,
+        'contact' => COMMENT_ANONYMOUS_MAY_CONTACT,
+        'comments' => COMMENT_NODE_OPEN,
+        'access comments' => 0,
+        'post comments' => 0,
+        // Enabled by default, because it's irrelevant for this test.
+        'skip comment approval' => 1,
+        'edit own comments' => 0,
+      );
+    }
+    // Complete new environment with current environment.
+    $info = array_merge($current, $info);
+
+    // Change environment conditions.
+    if ($current['authenticated'] != $info['authenticated']) {
+      if ($this->loggedInUser) {
+        $this->drupalLogout();
+      }
+      else {
+        $this->drupalLogin($this->web_user);
+      }
+    }
+    if ($current['comment count'] != $info['comment count']) {
+      if ($info['comment count']) {
+        // Create a comment via CRUD API functionality, since
+        // $this->postComment() relies on actual user permissions.
+        $comment = (object) array(
+          'cid' => NULL,
+          'nid' => $this->node->nid,
+          'node_type' => $this->node->type,
+          'pid' => 0,
+          'uid' => 0,
+          'status' => COMMENT_PUBLISHED,
+          'subject' => $this->randomName(),
+          'hostname' => ip_address(),
+          'language' => LANGUAGE_NONE,
+          'comment_body' => array(LANGUAGE_NONE => array($this->randomName())),
+        );
+        comment_save($comment);
+        $this->comment = $comment;
+
+        // comment_num_new() relies on node_last_viewed(), so ensure that no one
+        // has seen the node of this comment.
+        db_delete('history')->condition('nid', $this->node->nid)->execute();
+      }
+      else {
+        $cids = db_query("SELECT cid FROM {comment}")->fetchCol();
+        comment_delete_multiple($cids);
+        unset($this->comment);
+      }
+    }
+
+    // Change comment settings.
+    variable_set('comment_form_location_' . $this->node->type, $info['form']);
+    variable_set('comment_anonymous_' . $this->node->type, $info['contact']);
+    if ($this->node->comment != $info['comments']) {
+      $this->node->comment = $info['comments'];
+      node_save($this->node);
+    }
+
+    // Change user settings.
+    variable_set('user_register', $info['user_register']);
+
+    // Change user permissions.
+    $rid = ($this->loggedInUser ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID);
+    $perms = array_intersect_key($info, array('access comments' => 1, 'post comments' => 1, 'skip comment approval' => 1, 'edit own comments' => 1));
+    user_role_change_permissions($rid, $perms);
+
+    // Output verbose debugging information.
+    // @see DrupalTestCase::error()
+    $t_form = array(
+      COMMENT_FORM_BELOW => 'below',
+      COMMENT_FORM_SEPARATE_PAGE => 'separate page',
+    );
+    $t_contact = array(
+      COMMENT_ANONYMOUS_MAY_CONTACT => 'optional',
+      COMMENT_ANONYMOUS_MAYNOT_CONTACT => 'disabled',
+      COMMENT_ANONYMOUS_MUST_CONTACT => 'required',
+    );
+    $t_comments = array(
+      COMMENT_NODE_OPEN => 'open',
+      COMMENT_NODE_CLOSED => 'closed',
+      COMMENT_NODE_HIDDEN => 'hidden',
+    );
+    $verbose = $info;
+    $verbose['form'] = $t_form[$info['form']];
+    $verbose['contact'] = $t_contact[$info['contact']];
+    $verbose['comments'] = $t_comments[$info['comments']];
+    $message = t('Changed environment:<pre>@verbose</pre>', array(
+      '@verbose' => var_export($verbose, TRUE),
+    ));
+    $this->assert('debug', $message, 'Debug');
+
+    // Update current environment.
+    $current = $info;
+
+    return $info;
+  }
+
+  /**
+   * Asserts that comment links appear according to the passed environment setup.
+   *
+   * @param $info
+   *   An associative array describing the environment to pass to
+   *   setEnvironment().
+   */
+  function assertCommentLinks(array $info) {
+    $info = $this->setEnvironment($info);
+
+    $nid = $this->node->nid;
+
+    foreach (array('', "node/$nid") as $path) {
+      $this->drupalGet($path);
+
+      // User is allowed to view comments.
+      if ($info['access comments']) {
+        if ($path == '') {
+          // In teaser view, a link containing the comment count is always
+          // expected.
+          if ($info['comment count']) {
+            $this->assertLink(t('1 comment'));
+
+            // For logged in users, a link containing the amount of new/unread
+            // comments is expected.
+            // See important note about comment_num_new() below.
+            if ($this->loggedInUser && isset($this->comment) && !isset($this->comment->seen)) {
+              $this->assertLink(t('1 new comment'));
+              $this->comment->seen = TRUE;
+            }
+          }
+        }
+      }
+      else {
+        $this->assertNoLink(t('1 comment'));
+        $this->assertNoLink(t('1 new comment'));
+      }
+      // comment_num_new() is based on node views, so comments are marked as
+      // read when a node is viewed, regardless of whether we have access to
+      // comments.
+      if ($path == "node/$nid" && $this->loggedInUser && isset($this->comment)) {
+        $this->comment->seen = TRUE;
+      }
+
+      // User is not allowed to post comments.
+      if (!$info['post comments']) {
+        $this->assertNoLink('Add new comment');
+
+        // Anonymous users should see a note to log in or register in case
+        // authenticated users are allowed to post comments.
+        // @see theme_comment_post_forbidden()
+        if (!$this->loggedInUser) {
+          if (user_access('post comments', $this->web_user)) {
+            // The note depends on whether users are actually able to register.
+            if ($info['user_register']) {
+              $this->assertText('Log in or register to post comments');
+            }
+            else {
+              $this->assertText('Log in to post comments');
+            }
+          }
+          else {
+            $this->assertNoText('Log in or register to post comments');
+            $this->assertNoText('Log in to post comments');
+          }
+        }
+      }
+      // User is allowed to post comments.
+      else {
+        $this->assertNoText('Log in or register to post comments');
+
+        // "Add new comment" is always expected, except when there are no
+        // comments or if the user cannot see them.
+        if ($path == "node/$nid" && $info['form'] == COMMENT_FORM_BELOW && (!$info['comment count'] || !$info['access comments'])) {
+          $this->assertNoLink('Add new comment');
+        }
+        else {
+          $this->assertLink('Add new comment');
+        }
+
+        // Also verify that the comment form appears according to the configured
+        // location.
+        if ($path == "node/$nid") {
+          $elements = $this->xpath('//form[@id=:id]', array(':id' => 'comment-form'));
+          if ($info['form'] == COMMENT_FORM_BELOW) {
+            $this->assertTrue(count($elements), 'Comment form found below.');
+          }
+          else {
+            $this->assertFalse(count($elements), 'Comment form not found below.');
+          }
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Test previewing comments.
+ */
+class CommentPreviewTest extends CommentHelperCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment preview',
+      'description' => 'Test comment preview.',
+      'group' => 'Comment',
+    );
+  }
+
+  /**
+   * Test comment preview.
+   */
+  function testCommentPreview() {
+    $langcode = LANGUAGE_NONE;
+
+    // As admin user, configure comment settings.
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentPreview(DRUPAL_OPTIONAL);
+    $this->setCommentForm(TRUE);
+    $this->setCommentSubject(TRUE);
+    $this->setCommentSettings('comment_default_mode', COMMENT_MODE_THREADED, 'Comment paging changed.');
+    $this->drupalLogout();
+
+    // Login as web user and add a signature and a user picture.
+    $this->drupalLogin($this->web_user);
+    variable_set('user_signatures', 1);
+    variable_set('user_pictures', 1);
+    $test_signature = $this->randomName();
+    $edit['signature[value]'] = '<a href="http://example.com/">' . $test_signature. '</a>';
+    $edit['signature[format]'] = 'filtered_html';
+    $image = current($this->drupalGetTestFiles('image'));
+    $edit['files[picture_upload]'] = drupal_realpath($image->uri);
+    $this->drupalPost('user/' . $this->web_user->uid . '/edit', $edit, t('Save'));
+
+    // As the web user, fill in the comment form and preview the comment.
+    $edit = array();
+    $edit['subject'] = $this->randomName(8);
+    $edit['comment_body[' . $langcode . '][0][value]'] = $this->randomName(16);
+    $this->drupalPost('node/' . $this->node->nid, $edit, t('Preview'));
+
+    // Check that the preview is displaying the title and body.
+    $this->assertTitle(t('Preview comment | Drupal'), 'Page title is "Preview comment".');
+    $this->assertText($edit['subject'], 'Subject displayed.');
+    $this->assertText($edit['comment_body[' . $langcode . '][0][value]'], 'Comment displayed.');
+
+    // Check that the title and body fields are displayed with the correct values.
+    $this->assertFieldByName('subject', $edit['subject'], 'Subject field displayed.');
+    $this->assertFieldByName('comment_body[' . $langcode . '][0][value]', $edit['comment_body[' . $langcode . '][0][value]'], 'Comment field displayed.');
+
+    // Check that the signature is displaying with the correct text format.
+    $this->assertLink($test_signature);
+
+    // Check that the user picture is displayed.
+    $this->assertFieldByXPath("//div[contains(@class, 'comment-preview')]//div[contains(@class, 'user-picture')]//img", NULL, 'User picture displayed.');
+  }
+
+  /**
+   * Test comment edit, preview, and save.
+   */
+  function testCommentEditPreviewSave() {
+    $langcode = LANGUAGE_NONE;
+    $web_user = $this->drupalCreateUser(array('access comments', 'post comments', 'skip comment approval'));
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentPreview(DRUPAL_OPTIONAL);
+    $this->setCommentForm(TRUE);
+    $this->setCommentSubject(TRUE);
+    $this->setCommentSettings('comment_default_mode', COMMENT_MODE_THREADED, 'Comment paging changed.');
+
+    $edit = array();
+    $edit['subject'] = $this->randomName(8);
+    $edit['comment_body[' . $langcode . '][0][value]'] = $this->randomName(16);
+    $edit['name'] = $web_user->name;
+    $edit['date'] = '2008-03-02 17:23 +0300';
+    $raw_date = strtotime($edit['date']);
+    $expected_text_date = format_date($raw_date);
+    $expected_form_date = format_date($raw_date, 'custom', 'Y-m-d H:i O');
+    $comment = $this->postComment($this->node, $edit['subject'], $edit['comment_body[' . $langcode . '][0][value]'], TRUE);
+    $this->drupalPost('comment/' . $comment->id . '/edit', $edit, t('Preview'));
+
+    // Check that the preview is displaying the subject, comment, author and date correctly.
+    $this->assertTitle(t('Preview comment | Drupal'), 'Page title is "Preview comment".');
+    $this->assertText($edit['subject'], 'Subject displayed.');
+    $this->assertText($edit['comment_body[' . $langcode . '][0][value]'], 'Comment displayed.');
+    $this->assertText($edit['name'], 'Author displayed.');
+    $this->assertText($expected_text_date, 'Date displayed.');
+
+    // Check that the subject, comment, author and date fields are displayed with the correct values.
+    $this->assertFieldByName('subject', $edit['subject'], 'Subject field displayed.');
+    $this->assertFieldByName('comment_body[' . $langcode . '][0][value]', $edit['comment_body[' . $langcode . '][0][value]'], 'Comment field displayed.');
+    $this->assertFieldByName('name', $edit['name'], 'Author field displayed.');
+    $this->assertFieldByName('date', $edit['date'], 'Date field displayed.');
+
+    // Check that saving a comment produces a success message.
+    $this->drupalPost('comment/' . $comment->id . '/edit', $edit, t('Save'));
+    $this->assertText(t('Your comment has been posted.'), 'Comment posted.');
+
+    // Check that the comment fields are correct after loading the saved comment.
+    $this->drupalGet('comment/' . $comment->id . '/edit');
+    $this->assertFieldByName('subject', $edit['subject'], 'Subject field displayed.');
+    $this->assertFieldByName('comment_body[' . $langcode . '][0][value]', $edit['comment_body[' . $langcode . '][0][value]'], 'Comment field displayed.');
+    $this->assertFieldByName('name', $edit['name'], 'Author field displayed.');
+    $this->assertFieldByName('date', $expected_form_date, 'Date field displayed.');
+
+    // Submit the form using the displayed values.
+    $displayed = array();
+    $displayed['subject'] = (string) current($this->xpath("//input[@id='edit-subject']/@value"));
+    $displayed['comment_body[' . $langcode . '][0][value]'] = (string) current($this->xpath("//textarea[@id='edit-comment-body-" . $langcode . "-0-value']"));
+    $displayed['name'] = (string) current($this->xpath("//input[@id='edit-name']/@value"));
+    $displayed['date'] = (string) current($this->xpath("//input[@id='edit-date']/@value"));
+    $this->drupalPost('comment/' . $comment->id . '/edit', $displayed, t('Save'));
+
+    // Check that the saved comment is still correct.
+    $comment_loaded = comment_load($comment->id);
+    $this->assertEqual($comment_loaded->subject, $edit['subject'], 'Subject loaded.');
+    $this->assertEqual($comment_loaded->comment_body[$langcode][0]['value'], $edit['comment_body[' . $langcode . '][0][value]'], 'Comment body loaded.');
+    $this->assertEqual($comment_loaded->name, $edit['name'], 'Name loaded.');
+    $this->assertEqual($comment_loaded->created, $raw_date, 'Date loaded.');
+
+  }
+
+}
+
+class CommentAnonymous extends CommentHelperCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Anonymous comments',
+      'description' => 'Test anonymous comments.',
+      'group' => 'Comment',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    variable_set('user_register', USER_REGISTER_VISITORS);
+  }
+
+  /**
+   * Test anonymous comment functionality.
+   */
+  function testAnonymous() {
+    $this->drupalLogin($this->admin_user);
+    // Enabled anonymous user comments.
+    user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
+      'access comments' => TRUE,
+      'post comments' => TRUE,
+      'skip comment approval' => TRUE,
+    ));
+    $this->setCommentAnonymous('0'); // Ensure that doesn't require contact info.
+    $this->drupalLogout();
+
+    // Post anonymous comment without contact info.
+    $anonymous_comment1 = $this->postComment($this->node, $this->randomName(), $this->randomName());
+    $this->assertTrue($this->commentExists($anonymous_comment1), 'Anonymous comment without contact info found.');
+
+    // Allow contact info.
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentAnonymous('1');
+
+    // Attempt to edit anonymous comment.
+    $this->drupalGet('comment/' . $anonymous_comment1->id . '/edit');
+    $edited_comment = $this->postComment(NULL, $this->randomName(), $this->randomName());
+    $this->assertTrue($this->commentExists($edited_comment, FALSE), 'Modified reply found.');
+    $this->drupalLogout();
+
+    // Post anonymous comment with contact info (optional).
+    $this->drupalGet('comment/reply/' . $this->node->nid);
+    $this->assertTrue($this->commentContactInfoAvailable(), 'Contact information available.');
+
+    $anonymous_comment2 = $this->postComment($this->node, $this->randomName(), $this->randomName());
+    $this->assertTrue($this->commentExists($anonymous_comment2), 'Anonymous comment with contact info (optional) found.');
+
+    // Ensure anonymous users cannot post in the name of registered users.
+    $langcode = LANGUAGE_NONE;
+    $edit = array(
+      'name' => $this->admin_user->name,
+      'mail' => $this->randomName() . '@example.com',
+      'subject' => $this->randomName(),
+      "comment_body[$langcode][0][value]" => $this->randomName(),
+    );
+    $this->drupalPost('comment/reply/' . $this->node->nid, $edit, t('Save'));
+    $this->assertText(t('The name you used belongs to a registered user.'));
+
+    // Require contact info.
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentAnonymous('2');
+    $this->drupalLogout();
+
+    // Try to post comment with contact info (required).
+    $this->drupalGet('comment/reply/' . $this->node->nid);
+    $this->assertTrue($this->commentContactInfoAvailable(), 'Contact information available.');
+
+    $anonymous_comment3 = $this->postComment($this->node, $this->randomName(), $this->randomName(), TRUE);
+    // Name should have 'Anonymous' for value by default.
+    $this->assertText(t('E-mail field is required.'), 'E-mail required.');
+    $this->assertFalse($this->commentExists($anonymous_comment3), 'Anonymous comment with contact info (required) not found.');
+
+    // Post comment with contact info (required).
+    $author_name = $this->randomName();
+    $author_mail = $this->randomName() . '@example.com';
+    $anonymous_comment3 = $this->postComment($this->node, $this->randomName(), $this->randomName(), array('name' => $author_name, 'mail' => $author_mail));
+    $this->assertTrue($this->commentExists($anonymous_comment3), 'Anonymous comment with contact info (required) found.');
+
+    // Make sure the user data appears correctly when editing the comment.
+    $this->drupalLogin($this->admin_user);
+    $this->drupalGet('comment/' . $anonymous_comment3->id . '/edit');
+    $this->assertRaw($author_name, "The anonymous user's name is correct when editing the comment.");
+    $this->assertRaw($author_mail, "The anonymous user's e-mail address is correct when editing the comment.");
+
+    // Unpublish comment.
+    $this->performCommentOperation($anonymous_comment3, 'unpublish');
+
+    $this->drupalGet('admin/content/comment/approval');
+    $this->assertRaw('comments[' . $anonymous_comment3->id . ']', 'Comment was unpublished.');
+
+    // Publish comment.
+    $this->performCommentOperation($anonymous_comment3, 'publish', TRUE);
+
+    $this->drupalGet('admin/content/comment');
+    $this->assertRaw('comments[' . $anonymous_comment3->id . ']', 'Comment was published.');
+
+    // Delete comment.
+    $this->performCommentOperation($anonymous_comment3, 'delete');
+
+    $this->drupalGet('admin/content/comment');
+    $this->assertNoRaw('comments[' . $anonymous_comment3->id . ']', 'Comment was deleted.');
+    $this->drupalLogout();
+
+    // Reset.
+    user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
+      'access comments' => FALSE,
+      'post comments' => FALSE,
+      'skip comment approval' => FALSE,
+    ));
+
+    // Attempt to view comments while disallowed.
+    // NOTE: if authenticated user has permission to post comments, then a
+    // "Login or register to post comments" type link may be shown.
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->assertNoPattern('@<h2[^>]*>Comments</h2>@', 'Comments were not displayed.');
+    $this->assertNoLink('Add new comment', 'Link to add comment was found.');
+
+    // Attempt to view node-comment form while disallowed.
+    $this->drupalGet('comment/reply/' . $this->node->nid);
+    $this->assertText('You are not authorized to post comments', 'Error attempting to post comment.');
+    $this->assertNoFieldByName('subject', '', 'Subject field not found.');
+    $this->assertNoFieldByName("comment_body[$langcode][0][value]", '', 'Comment field not found.');
+
+    user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
+      'access comments' => TRUE,
+      'post comments' => FALSE,
+      'skip comment approval' => FALSE,
+    ));
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->assertPattern('@<h2[^>]*>Comments</h2>@', 'Comments were displayed.');
+    $this->assertLink('Log in', 1, 'Link to log in was found.');
+    $this->assertLink('register', 1, 'Link to register was found.');
+
+    user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
+      'access comments' => FALSE,
+      'post comments' => TRUE,
+      'skip comment approval' => TRUE,
+    ));
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->assertNoPattern('@<h2[^>]*>Comments</h2>@', 'Comments were not displayed.');
+    $this->assertFieldByName('subject', '', 'Subject field found.');
+    $this->assertFieldByName("comment_body[$langcode][0][value]", '', 'Comment field found.');
+
+    $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $anonymous_comment3->id);
+    $this->assertText('You are not authorized to view comments', 'Error attempting to post reply.');
+    $this->assertNoText($author_name, 'Comment not displayed.');
+  }
+}
+
+/**
+ * Verify pagination of comments.
+ */
+class CommentPagerTest extends CommentHelperCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment paging settings',
+      'description' => 'Test paging of comments and their settings.',
+      'group' => 'Comment',
+    );
+  }
+
+  /**
+   * Confirm comment paging works correctly with flat and threaded comments.
+   */
+  function testCommentPaging() {
+    $this->drupalLogin($this->admin_user);
+
+    // Set comment variables.
+    $this->setCommentForm(TRUE);
+    $this->setCommentSubject(TRUE);
+    $this->setCommentPreview(DRUPAL_DISABLED);
+
+    // Create a node and three comments.
+    $node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+    $comments = array();
+    $comments[] = $this->postComment($node, $this->randomName(), $this->randomName(), TRUE);
+    $comments[] = $this->postComment($node, $this->randomName(), $this->randomName(), TRUE);
+    $comments[] = $this->postComment($node, $this->randomName(), $this->randomName(), TRUE);
+
+    $this->setCommentSettings('comment_default_mode', COMMENT_MODE_FLAT, 'Comment paging changed.');
+
+    // Set comments to one per page so that we are able to test paging without
+    // needing to insert large numbers of comments.
+    $this->setCommentsPerPage(1);
+
+    // Check the first page of the node, and confirm the correct comments are
+    // shown.
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw(t('next'), 'Paging links found.');
+    $this->assertTrue($this->commentExists($comments[0]), 'Comment 1 appears on page 1.');
+    $this->assertFalse($this->commentExists($comments[1]), 'Comment 2 does not appear on page 1.');
+    $this->assertFalse($this->commentExists($comments[2]), 'Comment 3 does not appear on page 1.');
+
+    // Check the second page.
+    $this->drupalGet('node/' . $node->nid, array('query' => array('page' => 1)));
+    $this->assertTrue($this->commentExists($comments[1]), 'Comment 2 appears on page 2.');
+    $this->assertFalse($this->commentExists($comments[0]), 'Comment 1 does not appear on page 2.');
+    $this->assertFalse($this->commentExists($comments[2]), 'Comment 3 does not appear on page 2.');
+
+    // Check the third page.
+    $this->drupalGet('node/' . $node->nid, array('query' => array('page' => 2)));
+    $this->assertTrue($this->commentExists($comments[2]), 'Comment 3 appears on page 3.');
+    $this->assertFalse($this->commentExists($comments[0]), 'Comment 1 does not appear on page 3.');
+    $this->assertFalse($this->commentExists($comments[1]), 'Comment 2 does not appear on page 3.');
+
+    // Post a reply to the oldest comment and test again.
+    $replies = array();
+    $oldest_comment = reset($comments);
+    $this->drupalGet('comment/reply/' . $node->nid . '/' . $oldest_comment->id);
+    $reply = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+
+    $this->setCommentsPerPage(2);
+    // We are still in flat view - the replies should not be on the first page,
+    // even though they are replies to the oldest comment.
+    $this->drupalGet('node/' . $node->nid, array('query' => array('page' => 0)));
+    $this->assertFalse($this->commentExists($reply, TRUE), 'In flat mode, reply does not appear on page 1.');
+
+    // If we switch to threaded mode, the replies on the oldest comment
+    // should be bumped to the first page and comment 6 should be bumped
+    // to the second page.
+    $this->setCommentSettings('comment_default_mode', COMMENT_MODE_THREADED, 'Switched to threaded mode.');
+    $this->drupalGet('node/' . $node->nid, array('query' => array('page' => 0)));
+    $this->assertTrue($this->commentExists($reply, TRUE), 'In threaded mode, reply appears on page 1.');
+    $this->assertFalse($this->commentExists($comments[1]), 'In threaded mode, comment 2 has been bumped off of page 1.');
+
+    // If (# replies > # comments per page) in threaded expanded view,
+    // the overage should be bumped.
+    $reply2 = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+    $this->drupalGet('node/' . $node->nid, array('query' => array('page' => 0)));
+    $this->assertFalse($this->commentExists($reply2, TRUE), 'In threaded mode where # replies > # comments per page, the newest reply does not appear on page 1.');
+
+    $this->drupalLogout();
+  }
+
+  /**
+   * Test comment ordering and threading.
+   */
+  function testCommentOrderingThreading() {
+    $this->drupalLogin($this->admin_user);
+
+    // Set comment variables.
+    $this->setCommentForm(TRUE);
+    $this->setCommentSubject(TRUE);
+    $this->setCommentPreview(DRUPAL_DISABLED);
+
+    // Display all the comments on the same page.
+    $this->setCommentsPerPage(1000);
+
+    // Create a node and three comments.
+    $node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+    $comments = array();
+    $comments[] = $this->postComment($node, $this->randomName(), $this->randomName(), TRUE);
+    $comments[] = $this->postComment($node, $this->randomName(), $this->randomName(), TRUE);
+    $comments[] = $this->postComment($node, $this->randomName(), $this->randomName(), TRUE);
+
+    // Post a reply to the second comment.
+    $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[1]->id);
+    $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+
+    // Post a reply to the first comment.
+    $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[0]->id);
+    $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+
+    // Post a reply to the last comment.
+    $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[2]->id);
+    $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+
+    // Post a reply to the second comment.
+    $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[3]->id);
+    $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+
+    // At this point, the comment tree is:
+    // - 0
+    //   - 4
+    // - 1
+    //   - 3
+    //     - 6
+    // - 2
+    //   - 5
+
+    $this->setCommentSettings('comment_default_mode', COMMENT_MODE_FLAT, 'Comment paging changed.');
+
+    $expected_order = array(
+      0,
+      1,
+      2,
+      3,
+      4,
+      5,
+      6,
+    );
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertCommentOrder($comments, $expected_order);
+
+    $this->setCommentSettings('comment_default_mode', COMMENT_MODE_THREADED, 'Switched to threaded mode.');
+
+    $expected_order = array(
+      0,
+      4,
+      1,
+      3,
+      6,
+      2,
+      5,
+    );
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertCommentOrder($comments, $expected_order);
+  }
+
+  /**
+   * Helper function: assert that the comments are displayed in the correct order.
+   *
+   * @param $comments
+   *   And array of comments.
+   * @param $expected_order
+   *   An array of keys from $comments describing the expected order.
+   */
+  function assertCommentOrder(array $comments, array $expected_order) {
+    $expected_cids = array();
+
+    // First, rekey the expected order by cid.
+    foreach ($expected_order as $key) {
+      $expected_cids[] = $comments[$key]->id;
+    }
+
+    $comment_anchors = $this->xpath('//a[starts-with(@id,"comment-")]');
+    $result_order = array();
+    foreach ($comment_anchors as $anchor) {
+      $result_order[] = substr($anchor['id'], 8);
+    }
+
+    return $this->assertIdentical($expected_cids, $result_order, format_string('Comment order: expected @expected, returned @returned.', array('@expected' => implode(',', $expected_cids), '@returned' => implode(',', $result_order))));
+  }
+
+  /**
+   * Test comment_new_page_count().
+   */
+  function testCommentNewPageIndicator() {
+    $this->drupalLogin($this->admin_user);
+
+    // Set comment variables.
+    $this->setCommentForm(TRUE);
+    $this->setCommentSubject(TRUE);
+    $this->setCommentPreview(DRUPAL_DISABLED);
+
+    // Set comments to one per page so that we are able to test paging without
+    // needing to insert large numbers of comments.
+    $this->setCommentsPerPage(1);
+
+    // Create a node and three comments.
+    $node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+    $comments = array();
+    $comments[] = $this->postComment($node, $this->randomName(), $this->randomName(), TRUE);
+    $comments[] = $this->postComment($node, $this->randomName(), $this->randomName(), TRUE);
+    $comments[] = $this->postComment($node, $this->randomName(), $this->randomName(), TRUE);
+
+    // Post a reply to the second comment.
+    $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[1]->id);
+    $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+
+    // Post a reply to the first comment.
+    $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[0]->id);
+    $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+
+    // Post a reply to the last comment.
+    $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[2]->id);
+    $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+
+    // At this point, the comment tree is:
+    // - 0
+    //   - 4
+    // - 1
+    //   - 3
+    // - 2
+    //   - 5
+
+    $this->setCommentSettings('comment_default_mode', COMMENT_MODE_FLAT, 'Comment paging changed.');
+
+    $expected_pages = array(
+      1 => 5, // Page of comment 5
+      2 => 4, // Page of comment 4
+      3 => 3, // Page of comment 3
+      4 => 2, // Page of comment 2
+      5 => 1, // Page of comment 1
+      6 => 0, // Page of comment 0
+    );
+
+    $node = node_load($node->nid);
+    foreach ($expected_pages as $new_replies => $expected_page) {
+      $returned = comment_new_page_count($node->comment_count, $new_replies, $node);
+      $returned_page = is_array($returned) ? $returned['page'] : 0;
+      $this->assertIdentical($expected_page, $returned_page, format_string('Flat mode, @new replies: expected page @expected, returned page @returned.', array('@new' => $new_replies, '@expected' => $expected_page, '@returned' => $returned_page)));
+    }
+
+    $this->setCommentSettings('comment_default_mode', COMMENT_MODE_THREADED, 'Switched to threaded mode.');
+
+    $expected_pages = array(
+      1 => 5, // Page of comment 5
+      2 => 1, // Page of comment 4
+      3 => 1, // Page of comment 4
+      4 => 1, // Page of comment 4
+      5 => 1, // Page of comment 4
+      6 => 0, // Page of comment 0
+    );
+
+    $node = node_load($node->nid);
+    foreach ($expected_pages as $new_replies => $expected_page) {
+      $returned = comment_new_page_count($node->comment_count, $new_replies, $node);
+      $returned_page = is_array($returned) ? $returned['page'] : 0;
+      $this->assertEqual($expected_page, $returned_page, format_string('Threaded mode, @new replies: expected page @expected, returned page @returned.', array('@new' => $new_replies, '@expected' => $expected_page, '@returned' => $returned_page)));
+    }
+  }
+}
+
+/**
+ * Tests comments with node access.
+ *
+ * See http://drupal.org/node/886752 -- verify there is no PostgreSQL error when
+ * viewing a node with threaded comments (a comment and a reply), if a node
+ * access module is in use.
+ */
+class CommentNodeAccessTest extends CommentHelperCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment node access',
+      'description' => 'Test comment viewing with node access.',
+      'group' => 'Comment',
+    );
+  }
+
+  function setUp() {
+    DrupalWebTestCase::setUp('comment', 'search', 'node_access_test');
+    node_access_rebuild();
+
+    // Create users and test node.
+    $this->admin_user = $this->drupalCreateUser(array('administer content types', 'administer comments', 'administer blocks'));
+    $this->web_user = $this->drupalCreateUser(array('access comments', 'post comments', 'create article content', 'edit own comments', 'node test view'));
+    $this->node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1, 'uid' => $this->web_user->uid));
+  }
+
+  /**
+   * Test that threaded comments can be viewed.
+   */
+  function testThreadedCommentView() {
+    $langcode = LANGUAGE_NONE;
+    // Set comments to have subject required and preview disabled.
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentPreview(DRUPAL_DISABLED);
+    $this->setCommentForm(TRUE);
+    $this->setCommentSubject(TRUE);
+    $this->setCommentSettings('comment_default_mode', COMMENT_MODE_THREADED, 'Comment paging changed.');
+    $this->drupalLogout();
+
+    // Post comment.
+    $this->drupalLogin($this->web_user);
+    $comment_text = $this->randomName();
+    $comment_subject = $this->randomName();
+    $comment = $this->postComment($this->node, $comment_text, $comment_subject);
+    $comment_loaded = comment_load($comment->id);
+    $this->assertTrue($this->commentExists($comment), 'Comment found.');
+
+    // Check comment display.
+    $this->drupalGet('node/' . $this->node->nid . '/' . $comment->id);
+    $this->assertText($comment_subject, 'Individual comment subject found.');
+    $this->assertText($comment_text, 'Individual comment body found.');
+
+    // Reply to comment, creating second comment.
+    $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id);
+    $reply_text = $this->randomName();
+    $reply_subject = $this->randomName();
+    $reply = $this->postComment(NULL, $reply_text, $reply_subject, TRUE);
+    $reply_loaded = comment_load($reply->id);
+    $this->assertTrue($this->commentExists($reply, TRUE), 'Reply found.');
+
+    // Go to the node page and verify comment and reply are visible.
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->assertText($comment_text);
+    $this->assertText($comment_subject);
+    $this->assertText($reply_text);
+    $this->assertText($reply_subject);
+  }
+}
+
+class CommentApprovalTest extends CommentHelperCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment approval',
+      'description' => 'Test comment approval functionality.',
+      'group' => 'Comment',
+    );
+  }
+
+  /**
+   * Test comment approval functionality through admin/content/comment.
+   */
+  function testApprovalAdminInterface() {
+    // Set anonymous comments to require approval.
+    user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
+      'access comments' => TRUE,
+      'post comments' => TRUE,
+      'skip comment approval' => FALSE,
+    ));
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentAnonymous('0'); // Ensure that doesn't require contact info.
+
+    // Test that the comments page loads correctly when there are no comments
+    $this->drupalGet('admin/content/comment');
+    $this->assertText(t('No comments available.'));
+
+    $this->drupalLogout();
+
+    // Post anonymous comment without contact info.
+    $subject = $this->randomName();
+    $body = $this->randomName();
+    $this->postComment($this->node, $body, $subject, TRUE); // Set $contact to true so that it won't check for id and message.
+    $this->assertText(t('Your comment has been queued for review by site administrators and will be published after approval.'), 'Comment requires approval.');
+
+    // Get unapproved comment id.
+    $this->drupalLogin($this->admin_user);
+    $anonymous_comment4 = $this->getUnapprovedComment($subject);
+    $anonymous_comment4 = (object) array('id' => $anonymous_comment4, 'subject' => $subject, 'comment' => $body);
+    $this->drupalLogout();
+
+    $this->assertFalse($this->commentExists($anonymous_comment4), 'Anonymous comment was not published.');
+
+    // Approve comment.
+    $this->drupalLogin($this->admin_user);
+    $this->performCommentOperation($anonymous_comment4, 'publish', TRUE);
+    $this->drupalLogout();
+
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->assertTrue($this->commentExists($anonymous_comment4), 'Anonymous comment visible.');
+
+    // Post 2 anonymous comments without contact info.
+    $comments[] = $this->postComment($this->node, $this->randomName(), $this->randomName(), TRUE);
+    $comments[] = $this->postComment($this->node, $this->randomName(), $this->randomName(), TRUE);
+
+    // Publish multiple comments in one operation.
+    $this->drupalLogin($this->admin_user);
+    $this->drupalGet('admin/content/comment/approval');
+    $this->assertText(t('Unapproved comments (@count)', array('@count' => 2)), 'Two unapproved comments waiting for approval.');
+    $edit = array(
+      "comments[{$comments[0]->id}]" => 1,
+      "comments[{$comments[1]->id}]" => 1,
+    );
+    $this->drupalPost(NULL, $edit, t('Update'));
+    $this->assertText(t('Unapproved comments (@count)', array('@count' => 0)), 'All comments were approved.');
+
+    // Delete multiple comments in one operation.
+    $edit = array(
+      'operation' => 'delete',
+      "comments[{$comments[0]->id}]" => 1,
+      "comments[{$comments[1]->id}]" => 1,
+      "comments[{$anonymous_comment4->id}]" => 1,
+    );
+    $this->drupalPost(NULL, $edit, t('Update'));
+    $this->assertText(t('Are you sure you want to delete these comments and all their children?'), 'Confirmation required.');
+    $this->drupalPost(NULL, $edit, t('Delete comments'));
+    $this->assertText(t('No comments available.'), 'All comments were deleted.');
+  }
+
+  /**
+   * Test comment approval functionality through node interface.
+   */
+  function testApprovalNodeInterface() {
+    // Set anonymous comments to require approval.
+    user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
+      'access comments' => TRUE,
+      'post comments' => TRUE,
+      'skip comment approval' => FALSE,
+    ));
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentAnonymous('0'); // Ensure that doesn't require contact info.
+    $this->drupalLogout();
+
+    // Post anonymous comment without contact info.
+    $subject = $this->randomName();
+    $body = $this->randomName();
+    $this->postComment($this->node, $body, $subject, TRUE); // Set $contact to true so that it won't check for id and message.
+    $this->assertText(t('Your comment has been queued for review by site administrators and will be published after approval.'), 'Comment requires approval.');
+
+    // Get unapproved comment id.
+    $this->drupalLogin($this->admin_user);
+    $anonymous_comment4 = $this->getUnapprovedComment($subject);
+    $anonymous_comment4 = (object) array('id' => $anonymous_comment4, 'subject' => $subject, 'comment' => $body);
+    $this->drupalLogout();
+
+    $this->assertFalse($this->commentExists($anonymous_comment4), 'Anonymous comment was not published.');
+
+    // Approve comment.
+    $this->drupalLogin($this->admin_user);
+    $this->drupalGet('comment/1/approve');
+    $this->assertResponse(403, 'Forged comment approval was denied.');
+    $this->drupalGet('comment/1/approve', array('query' => array('token' => 'forged')));
+    $this->assertResponse(403, 'Forged comment approval was denied.');
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->clickLink(t('approve'));
+    $this->drupalLogout();
+
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->assertTrue($this->commentExists($anonymous_comment4), 'Anonymous comment visible.');
+  }
+}
+
+/**
+ * Functional tests for the comment module blocks.
+ */
+class CommentBlockFunctionalTest extends CommentHelperCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment blocks',
+      'description' => 'Test comment block functionality.',
+      'group' => 'Comment',
+    );
+  }
+
+  /**
+   * Test the recent comments block.
+   */
+  function testRecentCommentBlock() {
+    $this->drupalLogin($this->admin_user);
+
+    // Set the block to a region to confirm block is available.
+    $edit = array(
+      'blocks[comment_recent][region]' => 'sidebar_first',
+    );
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->assertText(t('The block settings have been updated.'), 'Block saved to first sidebar region.');
+
+    // Set block title and variables.
+    $block = array(
+      'title' => $this->randomName(),
+      'comment_block_count' => 2,
+    );
+    $this->drupalPost('admin/structure/block/manage/comment/recent/configure', $block, t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), 'Block saved.');
+
+    // Add some test comments, one without a subject.
+    $comment1 = $this->postComment($this->node, $this->randomName(), $this->randomName());
+    $comment2 = $this->postComment($this->node, $this->randomName(), $this->randomName());
+    $comment3 = $this->postComment($this->node, $this->randomName());
+
+    // Test that a user without the 'access comments' permission cannot see the
+    // block.
+    $this->drupalLogout();
+    user_role_revoke_permissions(DRUPAL_ANONYMOUS_RID, array('access comments'));
+    $this->drupalGet('');
+    $this->assertNoText($block['title'], 'Block was not found.');
+    user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access comments'));
+
+    // Test that a user with the 'access comments' permission can see the
+    // block.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('');
+    $this->assertText($block['title'], 'Block was found.');
+
+    // Test the only the 2 latest comments are shown and in the proper order.
+    $this->assertNoText($comment1->subject, 'Comment not found in block.');
+    $this->assertText($comment2->subject, 'Comment found in block.');
+    $this->assertText($comment3->comment, 'Comment found in block.');
+    $this->assertTrue(strpos($this->drupalGetContent(), $comment3->comment) < strpos($this->drupalGetContent(), $comment2->subject), 'Comments were ordered correctly in block.');
+
+    // Set the number of recent comments to show to 10.
+    $this->drupalLogout();
+    $this->drupalLogin($this->admin_user);
+    $block = array(
+      'comment_block_count' => 10,
+    );
+    $this->drupalPost('admin/structure/block/manage/comment/recent/configure', $block, t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), 'Block saved.');
+
+    // Post an additional comment.
+    $comment4 = $this->postComment($this->node, $this->randomName(), $this->randomName());
+
+    // Test that all four comments are shown.
+    $this->assertText($comment1->subject, 'Comment found in block.');
+    $this->assertText($comment2->subject, 'Comment found in block.');
+    $this->assertText($comment3->comment, 'Comment found in block.');
+    $this->assertText($comment4->subject, 'Comment found in block.');
+
+    // Test that links to comments work when comments are across pages.
+    $this->setCommentsPerPage(1);
+    $this->drupalGet('');
+    $this->clickLink($comment1->subject);
+    $this->assertText($comment1->subject, 'Comment link goes to correct page.');
+    $this->drupalGet('');
+    $this->clickLink($comment2->subject);
+    $this->assertText($comment2->subject, 'Comment link goes to correct page.');
+    $this->clickLink($comment4->subject);
+    $this->assertText($comment4->subject, 'Comment link goes to correct page.');
+    // Check that when viewing a comment page from a link to the comment, that
+    // rel="canonical" is added to the head of the document.
+    $this->assertRaw('<link rel="canonical"', 'Canonical URL was found in the HTML head');
+  }
+}
+
+/**
+ * Unit tests for comment module integration with RSS feeds.
+ */
+class CommentRSSUnitTest extends CommentHelperCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment RSS',
+      'description' => 'Test comments as part of an RSS feed.',
+      'group' => 'Comment',
+    );
+  }
+
+  /**
+   * Test comments as part of an RSS feed.
+   */
+  function testCommentRSS() {
+    // Find comment in RSS feed.
+    $this->drupalLogin($this->web_user);
+    $comment = $this->postComment($this->node, $this->randomName(), $this->randomName());
+    $this->drupalGet('rss.xml');
+    $raw = '<comments>' . url('node/' . $this->node->nid, array('fragment' => 'comments', 'absolute' => TRUE)) . '</comments>';
+    $this->assertRaw($raw, 'Comments as part of RSS feed.');
+
+    // Hide comments from RSS feed and check presence.
+    $this->node->comment = COMMENT_NODE_HIDDEN;
+    node_save($this->node);
+    $this->drupalGet('rss.xml');
+    $this->assertNoRaw($raw, 'Hidden comments is not a part of RSS feed.');
+  }
+}
+
+
+/**
+ * Test to make sure comment content is rebuilt.
+ */
+class CommentContentRebuild extends CommentHelperCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment Rebuild',
+      'description' => 'Test to make sure the comment content is rebuilt.',
+      'group' => 'Comment',
+    );
+  }
+
+  /**
+   * Test to ensure that the comment's content array is rebuilt for every
+   * call to comment_view().
+   */
+  function testCommentRebuild() {
+    // Update the comment settings so preview isn't required.
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentSubject(TRUE);
+    $this->setCommentPreview(DRUPAL_OPTIONAL);
+    $this->drupalLogout();
+
+    // Log in as the web user and add the comment.
+    $this->drupalLogin($this->web_user);
+    $subject_text = $this->randomName();
+    $comment_text = $this->randomName();
+    $comment = $this->postComment($this->node, $comment_text, $subject_text, TRUE);
+    $comment_loaded = comment_load($comment->id);
+    $this->assertTrue($this->commentExists($comment), 'Comment found.');
+
+    // Add the property to the content array and then see if it still exists on build.
+    $comment_loaded->content['test_property'] = array('#value' => $this->randomString());
+    $built_content = comment_view($comment_loaded, $this->node);
+
+    // This means that the content was rebuilt as the added test property no longer exists.
+    $this->assertFalse(isset($built_content['test_property']), 'Comment content was emptied before being built.');
+  }
+}
+
+/**
+ * Test comment token replacement in strings.
+ */
+class CommentTokenReplaceTestCase extends CommentHelperCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment token replacement',
+      'description' => 'Generates text using placeholders for dummy content to check comment token replacement.',
+      'group' => 'Comment',
+    );
+  }
+
+  /**
+   * Creates a comment, then tests the tokens generated from it.
+   */
+  function testCommentTokenReplacement() {
+    global $language;
+    $url_options = array(
+      'absolute' => TRUE,
+      'language' => $language,
+    );
+
+    $this->drupalLogin($this->admin_user);
+
+    // Set comment variables.
+    $this->setCommentSubject(TRUE);
+
+    // Create a node and a comment.
+    $node = $this->drupalCreateNode(array('type' => 'article'));
+    $parent_comment = $this->postComment($node, $this->randomName(), $this->randomName(), TRUE);
+
+    // Post a reply to the comment.
+    $this->drupalGet('comment/reply/' . $node->nid . '/' . $parent_comment->id);
+    $child_comment = $this->postComment(NULL, $this->randomName(), $this->randomName());
+    $comment = comment_load($child_comment->id);
+    $comment->homepage = 'http://example.org/';
+
+    // Add HTML to ensure that sanitation of some fields tested directly.
+    $comment->subject = '<blink>Blinking Comment</blink>';
+    $instance = field_info_instance('comment', 'body', 'comment_body');
+
+    // Generate and test sanitized tokens.
+    $tests = array();
+    $tests['[comment:cid]'] = $comment->cid;
+    $tests['[comment:hostname]'] = check_plain($comment->hostname);
+    $tests['[comment:name]'] = filter_xss($comment->name);
+    $tests['[comment:mail]'] = check_plain($this->admin_user->mail);
+    $tests['[comment:homepage]'] = check_url($comment->homepage);
+    $tests['[comment:title]'] = filter_xss($comment->subject);
+    $tests['[comment:body]'] = _text_sanitize($instance, LANGUAGE_NONE, $comment->comment_body[LANGUAGE_NONE][0], 'value');
+    $tests['[comment:url]'] = url('comment/' . $comment->cid, $url_options + array('fragment' => 'comment-' . $comment->cid));
+    $tests['[comment:edit-url]'] = url('comment/' . $comment->cid . '/edit', $url_options);
+    $tests['[comment:created:since]'] = format_interval(REQUEST_TIME - $comment->created, 2, $language->language);
+    $tests['[comment:changed:since]'] = format_interval(REQUEST_TIME - $comment->changed, 2, $language->language);
+    $tests['[comment:parent:cid]'] = $comment->pid;
+    $tests['[comment:parent:title]'] = check_plain($parent_comment->subject);
+    $tests['[comment:node:nid]'] = $comment->nid;
+    $tests['[comment:node:title]'] = check_plain($node->title);
+    $tests['[comment:author:uid]'] = $comment->uid;
+    $tests['[comment:author:name]'] = check_plain($this->admin_user->name);
+
+    // Test to make sure that we generated something for each token.
+    $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('comment' => $comment), array('language' => $language));
+      $this->assertEqual($output, $expected, format_string('Sanitized comment token %token replaced.', array('%token' => $input)));
+    }
+
+    // Generate and test unsanitized tokens.
+    $tests['[comment:hostname]'] = $comment->hostname;
+    $tests['[comment:name]'] = $comment->name;
+    $tests['[comment:mail]'] = $this->admin_user->mail;
+    $tests['[comment:homepage]'] = $comment->homepage;
+    $tests['[comment:title]'] = $comment->subject;
+    $tests['[comment:body]'] = $comment->comment_body[LANGUAGE_NONE][0]['value'];
+    $tests['[comment:parent:title]'] = $parent_comment->subject;
+    $tests['[comment:node:title]'] = $node->title;
+    $tests['[comment:author:name]'] = $this->admin_user->name;
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('comment' => $comment), array('language' => $language, 'sanitize' => FALSE));
+      $this->assertEqual($output, $expected, format_string('Unsanitized comment token %token replaced.', array('%token' => $input)));
+    }
+
+    // Load node so comment_count gets computed.
+    $node = node_load($node->nid);
+
+    // Generate comment tokens for the node (it has 2 comments, both new).
+    $tests = array();
+    $tests['[node:comment-count]'] = 2;
+    $tests['[node:comment-count-new]'] = 2;
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('node' => $node), array('language' => $language));
+      $this->assertEqual($output, $expected, format_string('Node comment token %token replaced.', array('%token' => $input)));
+    }
+  }
+}
+
+/**
+ * Test actions provided by the comment module.
+ */
+class CommentActionsTestCase extends CommentHelperCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment actions',
+      'description' => 'Test actions provided by the comment module.',
+      'group' => 'Comment',
+    );
+  }
+
+  /**
+   * Test comment publish and unpublish actions.
+   */
+  function testCommentPublishUnpublishActions() {
+    $this->drupalLogin($this->web_user);
+    $comment_text = $this->randomName();
+    $subject = $this->randomName();
+    $comment = $this->postComment($this->node, $comment_text, $subject);
+    $comment = comment_load($comment->id);
+
+    // Unpublish a comment (direct form: doesn't actually save the comment).
+    comment_unpublish_action($comment);
+    $this->assertEqual($comment->status, COMMENT_NOT_PUBLISHED, 'Comment was unpublished');
+    $this->assertWatchdogMessage('Unpublished comment %subject.', array('%subject' => $subject), 'Found watchdog message');
+    $this->clearWatchdog();
+
+    // Unpublish a comment (indirect form: modify the comment in the database).
+    comment_unpublish_action(NULL, array('cid' => $comment->cid));
+    $this->assertEqual(comment_load($comment->cid)->status, COMMENT_NOT_PUBLISHED, 'Comment was unpublished');
+    $this->assertWatchdogMessage('Unpublished comment %subject.', array('%subject' => $subject), 'Found watchdog message');
+
+    // Publish a comment (direct form: doesn't actually save the comment).
+    comment_publish_action($comment);
+    $this->assertEqual($comment->status, COMMENT_PUBLISHED, 'Comment was published');
+    $this->assertWatchdogMessage('Published comment %subject.', array('%subject' => $subject), 'Found watchdog message');
+    $this->clearWatchdog();
+
+    // Publish a comment (indirect form: modify the comment in the database).
+    comment_publish_action(NULL, array('cid' => $comment->cid));
+    $this->assertEqual(comment_load($comment->cid)->status, COMMENT_PUBLISHED, 'Comment was published');
+    $this->assertWatchdogMessage('Published comment %subject.', array('%subject' => $subject), 'Found watchdog message');
+    $this->clearWatchdog();
+  }
+
+  /**
+   * Verify that a watchdog message has been entered.
+   *
+   * @param $watchdog_message
+   *   The watchdog message.
+   * @param $variables
+   *   The array of variables passed to watchdog().
+   * @param $message
+   *   The assertion message.
+   */
+  function assertWatchdogMessage($watchdog_message, $variables, $message) {
+    $status = (bool) db_query_range("SELECT 1 FROM {watchdog} WHERE message = :message AND variables = :variables", 0, 1, array(':message' => $watchdog_message, ':variables' => serialize($variables)))->fetchField();
+    return $this->assert($status, format_string('@message', array('@message' => $message)));
+  }
+
+  /**
+   * Helper function: clear the watchdog.
+   */
+  function clearWatchdog() {
+    db_truncate('watchdog')->execute();
+  }
+}
+
+/**
+ * Test fields on comments.
+ */
+class CommentFieldsTest extends CommentHelperCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment fields',
+      'description' => 'Tests fields on comments.',
+      'group' => 'Comment',
+    );
+  }
+
+  /**
+   * Tests that the default 'comment_body' field is correctly added.
+   */
+  function testCommentDefaultFields() {
+    // Do not make assumptions on default node types created by the test
+    // installation profile, and create our own.
+    $this->drupalCreateContentType(array('type' => 'test_node_type'));
+
+    // Check that the 'comment_body' field is present on all comment bundles.
+    $instances = field_info_instances('comment');
+    foreach (node_type_get_types() as $type_name => $info) {
+      $this->assertTrue(isset($instances['comment_node_' . $type_name]['comment_body']), format_string('The comment_body field is present for comments on type @type', array('@type' => $type_name)));
+
+      // Delete the instance along the way.
+      field_delete_instance($instances['comment_node_' . $type_name]['comment_body']);
+    }
+
+    // Check that the 'comment_body' field is deleted.
+    $field = field_info_field('comment_body');
+    $this->assertTrue(empty($field), 'The comment_body field was deleted');
+
+    // Create a new content type.
+    $type_name = 'test_node_type_2';
+    $this->drupalCreateContentType(array('type' => $type_name));
+
+    // Check that the 'comment_body' field exists and has an instance on the
+    // new comment bundle.
+    $field = field_info_field('comment_body');
+    $this->assertTrue($field, 'The comment_body field exists');
+    $instances = field_info_instances('comment');
+    $this->assertTrue(isset($instances['comment_node_' . $type_name]['comment_body']), format_string('The comment_body field is present for comments on type @type', array('@type' => $type_name)));
+  }
+
+  /**
+   * Test that comment module works when enabled after a content module.
+   */
+  function testCommentEnable() {
+    // Create a user to do module administration.
+    $this->admin_user = $this->drupalCreateUser(array('access administration pages', 'administer modules'));
+    $this->drupalLogin($this->admin_user);
+
+    // Disable the comment module.
+    $edit = array();
+    $edit['modules[Core][comment][enable]'] = FALSE;
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->resetAll();
+    $this->assertFalse(module_exists('comment'), 'Comment module disabled.');
+
+    // Enable core content type modules (blog, book, and poll).
+    $edit = array();
+    $edit['modules[Core][blog][enable]'] = 'blog';
+    $edit['modules[Core][book][enable]'] = 'book';
+    $edit['modules[Core][poll][enable]'] = 'poll';
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->resetAll();
+
+    // Now enable the comment module.
+    $edit = array();
+    $edit['modules[Core][comment][enable]'] = 'comment';
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->resetAll();
+    $this->assertTrue(module_exists('comment'), 'Comment module enabled.');
+
+    // Create nodes of each type.
+    $blog_node = $this->drupalCreateNode(array('type' => 'blog'));
+    $book_node = $this->drupalCreateNode(array('type' => 'book'));
+    $poll_node = $this->drupalCreateNode(array('type' => 'poll', 'active' => 1, 'runtime' => 0, 'choice' => array(array('chtext' => ''))));
+
+    $this->drupalLogout();
+
+    // Try to post a comment on each node. A failure will be triggered if the
+    // comment body is missing on one of these forms, due to postComment()
+    // asserting that the body is actually posted correctly.
+    $this->web_user = $this->drupalCreateUser(array('access content', 'access comments', 'post comments', 'skip comment approval'));
+    $this->drupalLogin($this->web_user);
+    $this->postComment($blog_node, $this->randomName(), $this->randomName());
+    $this->postComment($book_node, $this->randomName(), $this->randomName());
+    $this->postComment($poll_node, $this->randomName(), $this->randomName());
+  }
+
+  /**
+   * Test that comment module works correctly with plain text format.
+   */
+  function testCommentFormat() {
+    // Disable text processing for comments.
+    $this->drupalLogin($this->admin_user);
+    $edit = array('instance[settings][text_processing]' => 0);
+    $this->drupalPost('admin/structure/types/manage/article/comment/fields/comment_body', $edit, t('Save settings'));
+
+    // Post a comment without an explicit subject.
+    $this->drupalLogin($this->web_user);
+    $edit = array('comment_body[und][0][value]' => $this->randomName(8));
+    $this->drupalPost('node/' . $this->node->nid, $edit, t('Save'));
+  }
+}
+
+/**
+ * Tests comment threading.
+ */
+class CommentThreadingTestCase extends CommentHelperCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment Threading',
+      'description' => 'Test to make sure the comment number increments properly.',
+      'group' => 'Comment',
+    );
+  }
+
+  /**
+   * Tests the comment threading.
+   */
+  function testCommentThreading() {
+    $langcode = LANGUAGE_NONE;
+    // Set comments to have a subject with preview disabled.
+    $this->drupalLogin($this->admin_user);
+    $this->setCommentPreview(DRUPAL_DISABLED);
+    $this->setCommentForm(TRUE);
+    $this->setCommentSubject(TRUE);
+    $this->setCommentSettings('comment_default_mode', COMMENT_MODE_THREADED, 'Comment paging changed.');
+    $this->drupalLogout();
+
+    // Create a node.
+    $this->drupalLogin($this->web_user);
+    $this->node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1, 'uid' => $this->web_user->uid));
+
+    // Post comment #1.
+    $this->drupalLogin($this->web_user);
+    $subject_text = $this->randomName();
+    $comment_text = $this->randomName();
+    $comment = $this->postComment($this->node, $comment_text, $subject_text, TRUE);
+    $comment_loaded = comment_load($comment->id);
+    $this->assertTrue($this->commentExists($comment), 'Comment #1. Comment found.');
+    $this->assertEqual($comment_loaded->thread, '01/');
+
+    // Reply to comment #1 creating comment #2.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id);
+    $reply = $this->postComment(NULL, $this->randomName(), '', TRUE);
+    $reply_loaded = comment_load($reply->id);
+    $this->assertTrue($this->commentExists($reply, TRUE), 'Comment #2. Reply found.');
+    $this->assertEqual($reply_loaded->thread, '01.00/');
+
+    // Reply to comment #2 creating comment #3.
+    $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $reply->id);
+    $reply = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+    $reply_loaded = comment_load($reply->id);
+    $this->assertTrue($this->commentExists($reply, TRUE), 'Comment #3. Second reply found.');
+    $this->assertEqual($reply_loaded->thread, '01.00.00/');
+
+    // Reply to comment #1 creating comment #4.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id);
+    $reply = $this->postComment(NULL, $this->randomName(), '', TRUE);
+    $reply_loaded = comment_load($reply->id);
+    $this->assertTrue($this->commentExists($comment), 'Comment #4. Third reply found.');
+    $this->assertEqual($reply_loaded->thread, '01.01/');
+
+    // Post comment #2 overall comment #5.
+    $this->drupalLogin($this->web_user);
+    $subject_text = $this->randomName();
+    $comment_text = $this->randomName();
+    $comment = $this->postComment($this->node, $comment_text, $subject_text, TRUE);
+    $comment_loaded = comment_load($comment->id);
+    $this->assertTrue($this->commentExists($comment), 'Comment #5. Second comment found.');
+    $this->assertEqual($comment_loaded->thread, '02/');
+
+    // Reply to comment #5 creating comment #6.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id);
+    $reply = $this->postComment(NULL, $this->randomName(), '', TRUE);
+    $reply_loaded = comment_load($reply->id);
+    $this->assertTrue($this->commentExists($reply, TRUE), 'Comment #6. Reply found.');
+    $this->assertEqual($reply_loaded->thread, '02.00/');
+
+    // Reply to comment #6 creating comment #7.
+    $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $reply->id);
+    $reply = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+    $reply_loaded = comment_load($reply->id);
+    $this->assertTrue($this->commentExists($reply, TRUE), 'Comment #7. Second reply found.');
+    $this->assertEqual($reply_loaded->thread, '02.00.00/');
+
+    // Reply to comment #5 creating comment #8.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id);
+    $reply = $this->postComment(NULL, $this->randomName(), '', TRUE);
+    $reply_loaded = comment_load($reply->id);
+    $this->assertTrue($this->commentExists($comment), 'Comment #8. Third reply found.');
+    $this->assertEqual($reply_loaded->thread, '02.01/');
+  }
+}
+
+/**
+ * Tests that comments behave correctly when the node is changed.
+ */
+class CommentNodeChangesTestCase extends CommentHelperCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment deletion on node changes',
+      'description' => 'Tests that comments behave correctly when the node is changed.',
+      'group' => 'Comment',
+    );
+  }
+
+  /**
+   * Tests that comments are deleted with the node.
+   */
+  function testNodeDeletion() {
+    $this->drupalLogin($this->web_user);
+    $comment = $this->postComment($this->node, $this->randomName(), $this->randomName());
+    $this->assertTrue(comment_load($comment->id), 'The comment could be loaded.');
+    node_delete($this->node->nid);
+    $this->assertFalse(comment_load($comment->id), 'The comment could not be loaded after the node was deleted.');
+  }
+}
diff --git a/htmltest/modules/comment/comment.tokens.inc b/htmltest/modules/comment/comment.tokens.inc
new file mode 100644
index 00000000..c495ec35
--- /dev/null
+++ b/htmltest/modules/comment/comment.tokens.inc
@@ -0,0 +1,243 @@
+<?php
+
+/**
+ * @file
+ * Builds placeholder replacement tokens for comment-related data.
+ */
+
+/**
+ * Implements hook_token_info().
+ */
+function comment_token_info() {
+  $type = array(
+    'name' => t('Comments'),
+    'description' => t('Tokens for comments posted on the site.'),
+    'needs-data' => 'comment',
+  );
+
+  // Comment-related tokens for nodes
+  $node['comment-count'] = array(
+    'name' => t("Comment count"),
+    'description' => t("The number of comments posted on a node."),
+  );
+  $node['comment-count-new'] = array(
+    'name' => t("New comment count"),
+    'description' => t("The number of comments posted on a node since the reader last viewed it."),
+  );
+
+  // Core comment tokens
+  $comment['cid'] = array(
+    'name' => t("Comment ID"),
+    'description' => t("The unique ID of the comment."),
+  );
+  $comment['hostname'] = array(
+    'name' => t("IP Address"),
+    'description' => t("The IP address of the computer the comment was posted from."),
+  );
+  $comment['name'] = array(
+    'name' => t("Name"),
+    'description' => t("The name left by the comment author."),
+  );
+  $comment['mail'] = array(
+    'name' => t("Email address"),
+    'description' => t("The email address left by the comment author."),
+  );
+  $comment['homepage'] = array(
+    'name' => t("Home page"),
+    'description' => t("The home page URL left by the comment author."),
+  );
+  $comment['title'] = array(
+    'name' => t("Title"),
+    'description' => t("The title of the comment."),
+  );
+  $comment['body'] = array(
+    'name' => t("Content"),
+    'description' => t("The formatted content of the comment itself."),
+  );
+  $comment['url'] = array(
+    'name' => t("URL"),
+    'description' => t("The URL of the comment."),
+  );
+  $comment['edit-url'] = array(
+    'name' => t("Edit URL"),
+    'description' => t("The URL of the comment's edit page."),
+  );
+
+  // Chained tokens for comments
+  $comment['created'] = array(
+    'name' => t("Date created"),
+    'description' => t("The date the comment was posted."),
+    'type' => 'date',
+  );
+  $comment['changed'] = array(
+    'name' => t("Date changed"),
+    'description' => t("The date the comment was most recently updated."),
+    'type' => 'date',
+  );
+  $comment['parent'] = array(
+    'name' => t("Parent"),
+    'description' => t("The comment's parent, if comment threading is active."),
+    'type' => 'comment',
+  );
+  $comment['node'] = array(
+    'name' => t("Node"),
+    'description' => t("The node the comment was posted to."),
+    'type' => 'node',
+  );
+  $comment['author'] = array(
+    'name' => t("Author"),
+    'description' => t("The author of the comment, if they were logged in."),
+    'type' => 'user',
+  );
+
+  return array(
+    'types' => array('comment' => $type),
+    'tokens' => array(
+      'node' => $node,
+      'comment' => $comment,
+    ),
+  );
+}
+
+/**
+ * Implements hook_tokens().
+ */
+function comment_tokens($type, $tokens, array $data = array(), array $options = array()) {
+  $url_options = array('absolute' => TRUE);
+  if (isset($options['language'])) {
+    $url_options['language'] = $options['language'];
+    $language_code = $options['language']->language;
+  }
+  else {
+    $language_code = NULL;
+  }
+  $sanitize = !empty($options['sanitize']);
+
+  $replacements = array();
+
+  if ($type == 'comment' && !empty($data['comment'])) {
+    $comment = $data['comment'];
+
+    foreach ($tokens as $name => $original) {
+      switch ($name) {
+        // Simple key values on the comment.
+        case 'cid':
+          $replacements[$original] = $comment->cid;
+          break;
+
+        // Poster identity information for comments
+        case 'hostname':
+          $replacements[$original] = $sanitize ? check_plain($comment->hostname) : $comment->hostname;
+          break;
+
+        case 'name':
+          $name = ($comment->uid == 0) ? variable_get('anonymous', t('Anonymous')) : $comment->name;
+          $replacements[$original] = $sanitize ? filter_xss($name) : $name;
+          break;
+
+        case 'mail':
+          if ($comment->uid != 0) {
+            $account = user_load($comment->uid);
+            $mail = $account->mail;
+          }
+          else {
+            $mail = $comment->mail;
+          }
+          $replacements[$original] = $sanitize ? check_plain($mail) : $mail;
+          break;
+
+        case 'homepage':
+          $replacements[$original] = $sanitize ? check_url($comment->homepage) : $comment->homepage;
+          break;
+
+        case 'title':
+          $replacements[$original] = $sanitize ? filter_xss($comment->subject) : $comment->subject;
+          break;
+
+        case 'body':
+          if ($items = field_get_items('comment', $comment, 'comment_body', $language_code)) {
+            $instance = field_info_instance('comment', 'body', 'comment_body');
+            $field_langcode = field_language('comment', $comment, 'comment_body', $language_code);
+            $replacements[$original] = $sanitize ? _text_sanitize($instance, $field_langcode, $items[0], 'value') : $items[0]['value'];
+          }
+          break;
+
+        // Comment related URLs.
+        case 'url':
+          $url_options['fragment']  = 'comment-' . $comment->cid;
+          $replacements[$original] = url('comment/' . $comment->cid, $url_options);
+          break;
+
+        case 'edit-url':
+          $url_options['fragment'] = NULL;
+          $replacements[$original] = url('comment/' . $comment->cid . '/edit', $url_options);
+          break;
+
+        // Default values for the chained tokens handled below.
+        case 'author':
+          $replacements[$original] = $sanitize ? filter_xss($comment->name) : $comment->name;
+          break;
+
+        case 'parent':
+          if (!empty($comment->pid)) {
+            $parent = comment_load($comment->pid);
+            $replacements[$original] = $sanitize ? filter_xss($parent->subject) : $parent->subject;
+          }
+          break;
+
+        case 'created':
+          $replacements[$original] = format_date($comment->created, 'medium', '', NULL, $language_code);
+          break;
+
+        case 'changed':
+          $replacements[$original] = format_date($comment->changed, 'medium', '', NULL, $language_code);
+          break;
+
+        case 'node':
+          $node = node_load($comment->nid);
+          $title = $node->title;
+          $replacements[$original] = $sanitize ? filter_xss($title) : $title;
+          break;
+      }
+    }
+
+    // Chained token relationships.
+    if ($node_tokens = token_find_with_prefix($tokens, 'node')) {
+      $node = node_load($comment->nid);
+      $replacements += token_generate('node', $node_tokens, array('node' => $node), $options);
+    }
+
+    if ($date_tokens = token_find_with_prefix($tokens, 'created')) {
+      $replacements += token_generate('date', $date_tokens, array('date' => $comment->created), $options);
+    }
+
+    if ($date_tokens = token_find_with_prefix($tokens, 'changed')) {
+      $replacements += token_generate('date', $date_tokens, array('date' => $comment->changed), $options);
+    }
+
+    if (($parent_tokens = token_find_with_prefix($tokens, 'parent')) && $parent = comment_load($comment->pid)) {
+      $replacements += token_generate('comment', $parent_tokens, array('comment' => $parent), $options);
+    }
+
+    if (($author_tokens = token_find_with_prefix($tokens, 'author')) && $account = user_load($comment->uid)) {
+      $replacements += token_generate('user', $author_tokens, array('user' => $account), $options);
+    }
+  }
+  elseif ($type == 'node' & !empty($data['node'])) {
+    $node = $data['node'];
+
+    foreach ($tokens as $name => $original) {
+      switch($name) {
+        case 'comment-count':
+          $replacements[$original] = $node->comment_count;
+          break;
+
+        case 'comment-count-new':
+          $replacements[$original] = comment_num_new($node->nid);
+          break;
+      }
+    }
+  }
+
+  return $replacements;
+}
diff --git a/htmltest/modules/comment/comment.tpl.php b/htmltest/modules/comment/comment.tpl.php
new file mode 100644
index 00000000..82984735
--- /dev/null
+++ b/htmltest/modules/comment/comment.tpl.php
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation for comments.
+ *
+ * Available variables:
+ * - $author: Comment author. Can be link or plain text.
+ * - $content: An array of comment items. Use render($content) to print them all, or
+ *   print a subset such as render($content['field_example']). Use
+ *   hide($content['field_example']) to temporarily suppress the printing of a
+ *   given element.
+ * - $created: Formatted date and time for when the comment was created.
+ *   Preprocess functions can reformat it by calling format_date() with the
+ *   desired parameters on the $comment->created variable.
+ * - $changed: Formatted date and time for when the comment was last changed.
+ *   Preprocess functions can reformat it by calling format_date() with the
+ *   desired parameters on the $comment->changed variable.
+ * - $new: New comment marker.
+ * - $permalink: Comment permalink.
+ * - $submitted: Submission information created from $author and $created during
+ *   template_preprocess_comment().
+ * - $picture: Authors picture.
+ * - $signature: Authors signature.
+ * - $status: Comment status. Possible values are:
+ *   comment-unpublished, comment-published or comment-preview.
+ * - $title: Linked title.
+ * - $classes: String of classes that can be used to style contextually through
+ *   CSS. It can be manipulated through the variable $classes_array from
+ *   preprocess functions. The default values can be one or more of the following:
+ *   - comment: The current template type, i.e., "theming hook".
+ *   - comment-by-anonymous: Comment by an unregistered user.
+ *   - comment-by-node-author: Comment by the author of the parent node.
+ *   - comment-preview: When previewing a new or edited comment.
+ *   The following applies only to viewers who are registered users:
+ *   - comment-unpublished: An unpublished comment visible only to administrators.
+ *   - comment-by-viewer: Comment by the user currently viewing the page.
+ *   - comment-new: New comment since last the visit.
+ * - $title_prefix (array): An array containing additional output populated by
+ *   modules, intended to be displayed in front of the main title tag that
+ *   appears in the template.
+ * - $title_suffix (array): An array containing additional output populated by
+ *   modules, intended to be displayed after the main title tag that appears in
+ *   the template.
+ *
+ * These two variables are provided for context:
+ * - $comment: Full comment object.
+ * - $node: Node object the comments are attached to.
+ *
+ * Other variables:
+ * - $classes_array: Array of html class attribute values. It is flattened
+ *   into a string within the variable $classes.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_comment()
+ * @see template_process()
+ * @see theme_comment()
+ *
+ * @ingroup themeable
+ */
+?>
+<div class="<?php print $classes; ?> clearfix"<?php print $attributes; ?>>
+  <?php print $picture ?>
+
+  <?php if ($new): ?>
+    <span class="new"><?php print $new ?></span>
+  <?php endif; ?>
+
+  <?php print render($title_prefix); ?>
+  <h3<?php print $title_attributes; ?>><?php print $title ?></h3>
+  <?php print render($title_suffix); ?>
+
+  <div class="submitted">
+    <?php print $permalink; ?>
+    <?php print $submitted; ?>
+  </div>
+
+  <div class="content"<?php print $content_attributes; ?>>
+    <?php
+      // We hide the comments and links now so that we can render them later.
+      hide($content['links']);
+      print render($content);
+    ?>
+    <?php if ($signature): ?>
+    <div class="user-signature clearfix">
+      <?php print $signature ?>
+    </div>
+    <?php endif; ?>
+  </div>
+
+  <?php print render($content['links']) ?>
+</div>
diff --git a/htmltest/modules/contact/contact.admin.inc b/htmltest/modules/contact/contact.admin.inc
new file mode 100644
index 00000000..4648fd3d
--- /dev/null
+++ b/htmltest/modules/contact/contact.admin.inc
@@ -0,0 +1,228 @@
+<?php
+
+/**
+ * @file
+ * Admin page callbacks for the Contact module.
+ */
+
+/**
+ * Categories/list tab.
+ */
+function contact_category_list() {
+  $header = array(
+    t('Category'),
+    t('Recipients'),
+    t('Selected'),
+    array('data' => t('Operations'), 'colspan' => 2),
+  );
+  $rows = array();
+
+  // Get all the contact categories from the database.
+  $categories = db_select('contact', 'c')
+    ->addTag('translatable')
+    ->fields('c', array('cid', 'category', 'recipients', 'selected'))
+    ->orderBy('weight')
+    ->orderBy('category')
+    ->execute()
+    ->fetchAll();
+
+  // Loop through the categories and add them to the table.
+  foreach ($categories as $category) {
+    $rows[] = array(
+      check_plain($category->category),
+      check_plain($category->recipients),
+      ($category->selected ? t('Yes') : t('No')),
+      l(t('Edit'), 'admin/structure/contact/edit/' . $category->cid),
+      l(t('Delete'), 'admin/structure/contact/delete/' . $category->cid),
+    );
+  }
+
+  if (!$rows) {
+    $rows[] = array(array(
+      'data' => t('No categories available.'),
+      'colspan' => 5,
+    ));
+  }
+
+  $build['category_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+  );
+  return $build;
+}
+
+/**
+ * Form constructor for the category edit form.
+ *
+ * @param $category
+ *   An array describing the category to be edited. May be empty for new
+ *   categories. Recognized array keys are:
+ *   - category: The name of the category.
+ *   - recipients: A comma-separated list of recipients.
+ *   - reply: (optional) The body of the auto-reply message.
+ *   - weight: The weight of the category.
+ *   - selected: Boolean indicating whether the category should be selected by
+ *     default.
+ *   - cid: The category ID for which the form is to be displayed.
+ *
+ * @see contact_category_edit_form_validate()
+ * @see contact_category_edit_form_submit()
+ * @ingroup forms
+ */
+function contact_category_edit_form($form, &$form_state, array $category = array()) {
+  // If this is a new category, add the default values.
+  $category += array(
+    'category' => '',
+    'recipients' => '',
+    'reply' => '',
+    'weight' => 0,
+    'selected' => 0,
+    'cid' => NULL,
+  );
+
+  $form['category'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Category'),
+    '#maxlength' => 255,
+    '#default_value' => $category['category'],
+    '#description' => t("Example: 'website feedback' or 'product information'."),
+    '#required' => TRUE,
+  );
+  $form['recipients'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Recipients'),
+    '#default_value' => $category['recipients'],
+    '#description' => t("Example: 'webmaster@example.com' or 'sales@example.com,support@example.com' . To specify multiple recipients, separate each e-mail address with a comma."),
+    '#required' => TRUE,
+  );
+  $form['reply'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Auto-reply'),
+    '#default_value' => $category['reply'],
+    '#description' => t('Optional auto-reply. Leave empty if you do not want to send the user an auto-reply message.'),
+  );
+  $form['weight'] = array(
+    '#type' => 'weight',
+    '#title' => t('Weight'),
+    '#default_value' => $category['weight'],
+    '#description' => t('When listing categories, those with lighter (smaller) weights get listed before categories with heavier (larger) weights. Categories with equal weights are sorted alphabetically.'),
+  );
+  $form['selected'] = array(
+    '#type' => 'select',
+    '#title' => t('Selected'),
+    '#options' => array(
+      0 => t('No'),
+      1 => t('Yes'),
+    ),
+    '#default_value' => $category['selected'],
+    '#description' => t('Set this to <em>Yes</em> if you would like this category to be selected by default.'),
+  );
+  $form['cid'] = array(
+    '#type' => 'value',
+    '#value' => $category['cid'],
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form validation handler for contact_category_edit_form().
+ *
+ * @see contact_category_edit_form_submit()
+ */
+function contact_category_edit_form_validate($form, &$form_state) {
+  // Validate and each e-mail recipient.
+  $recipients = explode(',', $form_state['values']['recipients']);
+
+  // When creating a new contact form, or renaming the category on an existing
+  // contact form, make sure that the given category is unique.
+  $category = $form_state['values']['category'];
+  $query = db_select('contact', 'c')->condition('c.category', $category, '=');
+  if (!empty($form_state['values']['cid'])) {
+    $query->condition('c.cid', $form_state['values']['cid'], '<>');
+  }
+  if ($query->countQuery()->execute()->fetchField()) {
+    form_set_error('category', t('A contact form with category %category already exists.', array('%category' => $category)));
+  }
+
+  foreach ($recipients as &$recipient) {
+    $recipient = trim($recipient);
+    if (!valid_email_address($recipient)) {
+      form_set_error('recipients', t('%recipient is an invalid e-mail address.', array('%recipient' => $recipient)));
+    }
+  }
+  $form_state['values']['recipients'] = implode(',', $recipients);
+}
+
+/**
+ * Form submission handler for contact_category_edit_form().
+ *
+ * @see contact_category_edit_form_validate()
+ */
+function contact_category_edit_form_submit($form, &$form_state) {
+  if ($form_state['values']['selected']) {
+    // Unselect all other contact categories.
+    db_update('contact')
+      ->fields(array('selected' => '0'))
+      ->execute();
+  }
+
+  if (empty($form_state['values']['cid'])) {
+    drupal_write_record('contact', $form_state['values']);
+  }
+  else {
+    drupal_write_record('contact', $form_state['values'], array('cid'));
+  }
+
+  drupal_set_message(t('Category %category has been saved.', array('%category' => $form_state['values']['category'])));
+  watchdog('contact', 'Category %category has been saved.', array('%category' => $form_state['values']['category']), WATCHDOG_NOTICE, l(t('Edit'), 'admin/structure/contact/edit/' . $form_state['values']['cid']));
+  $form_state['redirect'] = 'admin/structure/contact';
+}
+
+/**
+ * Form constructor for the contact category deletion form.
+ *
+ * @param $contact
+ *   Array describing the contact category to be deleted. See the documentation
+ *   of contact_category_edit_form() for the recognized keys.
+ *
+ * @see contact_menu()
+ * @see contact_category_delete_form_submit()
+ */
+function contact_category_delete_form($form, &$form_state, array $contact) {
+  $form['contact'] = array(
+    '#type' => 'value',
+    '#value' => $contact,
+  );
+
+  return confirm_form(
+    $form,
+    t('Are you sure you want to delete %category?', array('%category' => $contact['category'])),
+    'admin/structure/contact',
+    t('This action cannot be undone.'),
+    t('Delete'),
+    t('Cancel')
+  );
+}
+
+/**
+ * Form submission handler for contact_category_delete_form().
+ */
+function contact_category_delete_form_submit($form, &$form_state) {
+  $contact = $form['contact']['#value'];
+
+  db_delete('contact')
+    ->condition('cid', $contact['cid'])
+    ->execute();
+
+  drupal_set_message(t('Category %category has been deleted.', array('%category' => $contact['category'])));
+  watchdog('contact', 'Category %category has been deleted.', array('%category' => $contact['category']), WATCHDOG_NOTICE);
+
+  $form_state['redirect'] = 'admin/structure/contact';
+}
diff --git a/htmltest/modules/contact/contact.info b/htmltest/modules/contact/contact.info
new file mode 100644
index 00000000..f71ce36f
--- /dev/null
+++ b/htmltest/modules/contact/contact.info
@@ -0,0 +1,13 @@
+name = Contact
+description = Enables the use of both personal and site-wide contact forms.
+package = Core
+version = VERSION
+core = 7.x
+files[] = contact.test
+configure = admin/structure/contact
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/contact/contact.install b/htmltest/modules/contact/contact.install
new file mode 100644
index 00000000..fba5cfd4
--- /dev/null
+++ b/htmltest/modules/contact/contact.install
@@ -0,0 +1,168 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the contact module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function contact_schema() {
+  $schema['contact'] = array(
+    'description' => 'Contact form category settings.',
+    'fields' => array(
+      'cid' => array(
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique category ID.',
+      ),
+      'category' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Category name.',
+        'translatable' => TRUE,
+      ),
+      'recipients' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'size' => 'big',
+        'description' => 'Comma-separated list of recipient e-mail addresses.',
+      ),
+      'reply' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'size' => 'big',
+        'description' => 'Text of the auto-reply message.',
+      ),
+      'weight' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => "The category's weight.",
+      ),
+      'selected' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'Flag to indicate whether or not category is selected by default. (1 = Yes, 0 = No)',
+      ),
+    ),
+    'primary key' => array('cid'),
+    'unique keys' => array(
+      'category' => array('category'),
+    ),
+    'indexes' => array(
+      'list' => array('weight', 'category'),
+    ),
+  );
+
+  return $schema;
+}
+
+/**
+ * Implements hook_install().
+ */
+function contact_install() {
+  // Insert a default contact category.
+  db_insert('contact')
+    ->fields(array(
+      'category' => 'Website feedback',
+      'recipients' => variable_get('site_mail', ini_get('sendmail_from')),
+      'selected' => 1,
+      'reply' => '',
+    ))
+    ->execute();
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function contact_uninstall() {
+  variable_del('contact_default_status');
+  variable_del('contact_threshold_limit');
+  variable_del('contact_threshold_window');
+}
+
+/**
+ * Implements hook_update_dependencies().
+ */
+function contact_update_dependencies() {
+  // contact_update_7001() relies on the {role_permission} table being updated
+  // to the new format and filled with data.
+  $dependencies['contact'][7001] = array(
+    'system' => 7007,
+  );
+
+  // contact_update_7002() relies on the {role_permission} table having the
+  // module field, which is created in user_update_7006().
+  $dependencies['contact'][7002] = array(
+    'user' => 7006,
+  );
+
+  return $dependencies;
+}
+
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Rename the threshold limit variable.
+ */
+function contact_update_7000() {
+  variable_set('contact_threshold_limit', variable_get('contact_hourly_threshold', 5));
+  variable_del('contact_hourly_threshold');
+}
+
+/**
+ * Rename the administer contact forms permission.
+ */
+function contact_update_7001() {
+  db_update('role_permission')
+    ->fields(array('permission' => 'administer contact forms'))
+    ->condition('permission', 'administer site-wide contact form')
+    ->execute();
+}
+
+/**
+ * Enable the 'access user contact forms' for registered users by default.
+ */
+function contact_update_7002() {
+  // Do not use user_role_grant_permission() since it relies on
+  // hook_permission(), which will not run for contact module if it is
+  // disabled.
+  db_merge('role_permission')
+    ->key(array(
+      'rid' => DRUPAL_AUTHENTICATED_RID,
+      'permission' => 'access user contact forms',
+      'module' => 'contact',
+    ))
+    ->execute();
+}
+
+/**
+ * Change the weight column to normal int.
+ */
+function contact_update_7003() {
+  db_drop_index('contact', 'list');
+  db_change_field('contact', 'weight', 'weight', array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'description' => "The category's weight.",
+  ), array(
+    'indexes' => array(
+      'list' => array('weight', 'category'),
+    ),
+  ));
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x".
+ */
diff --git a/htmltest/modules/contact/contact.module b/htmltest/modules/contact/contact.module
new file mode 100644
index 00000000..9a48f231
--- /dev/null
+++ b/htmltest/modules/contact/contact.module
@@ -0,0 +1,259 @@
+<?php
+
+/**
+ * @file
+ * Enables the use of personal and site-wide contact forms.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function contact_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#contact':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Contact module allows visitors to contact site administrators and other users. Users specify a subject, write their message, and can have a copy of their message sent to their own e-mail address. For more information, see the online handbook entry for <a href="@contact">Contact module</a>.', array('@contact' => 'http://drupal.org/documentation/modules/contact/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('User contact forms') . '</dt>';
+      $output .= '<dd>' . t('Site users can be contacted with a user contact form that keeps their e-mail address private. Users may enable or disable their personal contact forms by editing their <em>My account</em> page. If enabled, a <em>Contact</em> tab leads to a personal contact form displayed on their user profile. Site administrators are still able to use the contact form, even if has been disabled. The <em>Contact</em> tab is not shown when you view your own profile.') . '</dd>';
+      $output .= '<dt>' . t('Site-wide contact forms') . '</dt>';
+      $output .= '<dd>' . t('The <a href="@contact">Contact page</a> provides a simple form for users with the <em>Use the site-wide contact form</em> permission to send comments, feedback, or other requests. You can create categories for directing the contact form messages to a set of defined recipients. Common categories for a business site, for example, might include "Website feedback" (messages are forwarded to website administrators) and "Product information" (messages are forwarded to members of the sales department). E-mail addresses defined within a category are not displayed publicly.', array('@contact' => url('contact'))) . '</p>';
+      $output .= '<dt>' . t('Navigation') . '</dt>';
+      $output .= '<dd>' . t("When the site-wide contact form is enabled, a link in the main <em>Navigation</em> menu is created, but the link is disabled by default. This menu link can be enabled on the <a href='@menu'>Menus administration page</a>.", array('@contact' => url('contact'), '@menu' => url('admin/structure/menu'))) . '</dd>';
+      $output .= '<dt>' . t('Customization') . '</dt>';
+      $output .= '<dd>' . t('If you would like additional text to appear on the site-wide or personal contact page, use a block. You can create and edit blocks on the <a href="@blocks">Blocks administration page</a>.', array('@blocks' => url('admin/structure/block'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'admin/structure/contact':
+      $output = '<p>' . t('Add one or more categories on this page to set up your site-wide <a href="@form">contact form</a>.', array('@form' => url('contact'))) . '</p>';
+      $output .= '<p>' . t('A <em>Contact</em> menu item (disabled by default) is added to the Navigation menu, which you can modify on the <a href="@menu-settings">Menus administration page</a>.', array('@menu-settings' => url('admin/structure/menu'))) . '</p>';
+      $output .= '<p>' . t('If you would like additional text to appear on the site-wide contact page, use a block. You can create and edit blocks on the <a href="@blocks">Blocks administration page</a>.', array('@blocks' => url('admin/structure/block'))) . '</p>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_permission().
+ */
+function contact_permission() {
+  return array(
+    'administer contact forms' => array(
+      'title' => t('Administer contact forms and contact form settings'),
+    ),
+    'access site-wide contact form' => array(
+      'title' => t('Use the site-wide contact form'),
+    ),
+    'access user contact forms' => array(
+      'title' => t("Use users' personal contact forms"),
+    ),
+  );
+}
+
+/**
+ * Implements hook_menu().
+ */
+function contact_menu() {
+  $items['admin/structure/contact'] = array(
+    'title' => 'Contact form',
+    'description' => 'Create a system contact form and set up categories for the form to use.',
+    'page callback' => 'contact_category_list',
+    'access arguments' => array('administer contact forms'),
+    'file' => 'contact.admin.inc',
+  );
+  $items['admin/structure/contact/add'] = array(
+    'title' => 'Add category',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('contact_category_edit_form'),
+    'access arguments' => array('administer contact forms'),
+    'type' => MENU_LOCAL_ACTION,
+    'weight' => 1,
+    'file' => 'contact.admin.inc',
+  );
+  $items['admin/structure/contact/edit/%contact'] = array(
+    'title' => 'Edit contact category',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('contact_category_edit_form', 4),
+    'access arguments' => array('administer contact forms'),
+    'file' => 'contact.admin.inc',
+  );
+  $items['admin/structure/contact/delete/%contact'] = array(
+    'title' => 'Delete contact',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('contact_category_delete_form', 4),
+    'access arguments' => array('administer contact forms'),
+    'file' => 'contact.admin.inc',
+  );
+  $items['contact'] = array(
+    'title' => 'Contact',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('contact_site_form'),
+    'access arguments' => array('access site-wide contact form'),
+    'type' => MENU_SUGGESTED_ITEM,
+    'file' => 'contact.pages.inc',
+  );
+  $items['user/%user/contact'] = array(
+    'title' => 'Contact',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('contact_personal_form', 1),
+    'type' => MENU_LOCAL_TASK,
+    'access callback' => '_contact_personal_tab_access',
+    'access arguments' => array(1),
+    'weight' => 2,
+    'file' => 'contact.pages.inc',
+  );
+  return $items;
+}
+
+/**
+ * Menu access callback for a user's personal contact form.
+ *
+ * @param $account
+ *   The user object of the user whose contact form is being requested.
+ */
+function _contact_personal_tab_access($account) {
+  global $user;
+
+  // Anonymous users cannot have contact forms.
+  if (!$account->uid) {
+    return FALSE;
+  }
+
+  // User administrators should always have access to personal contact forms.
+  if (user_access('administer users')) {
+    return TRUE;
+  }
+
+  // Users may not contact themselves.
+  if ($user->uid == $account->uid) {
+    return FALSE;
+  }
+
+  // If the requested user has disabled their contact form, or this preference
+  // has not yet been saved, do not allow users to contact them.
+  if (empty($account->data['contact'])) {
+    return FALSE;
+  }
+
+  // If requested user has been blocked, do not allow users to contact them.
+  if (empty($account->status)) {
+    return FALSE;
+  }
+
+  return user_access('access user contact forms');
+}
+
+/**
+ * Loads a contact category.
+ *
+ * @param $cid
+ *   The contact category ID.
+ *
+ * @return
+ *   An array with the contact category's data.
+ */
+function contact_load($cid) {
+  return db_select('contact', 'c')
+    ->addTag('translatable')
+    ->fields('c')
+    ->condition('cid', $cid)
+    ->execute()
+    ->fetchAssoc();
+}
+
+/**
+ * Implements hook_mail().
+ */
+function contact_mail($key, &$message, $params) {
+  $language = $message['language'];
+  $variables = array(
+    '!site-name' => variable_get('site_name', 'Drupal'),
+    '!subject' => $params['subject'],
+    '!category' => isset($params['category']['category']) ? $params['category']['category'] : '',
+    '!form-url' => url($_GET['q'], array('absolute' => TRUE, 'language' => $language)),
+    '!sender-name' => format_username($params['sender']),
+    '!sender-url' => $params['sender']->uid ? url('user/' . $params['sender']->uid, array('absolute' => TRUE, 'language' => $language)) : $params['sender']->mail,
+  );
+
+  switch ($key) {
+    case 'page_mail':
+    case 'page_copy':
+      $message['subject'] .= t('[!category] !subject', $variables, array('langcode' => $language->language));
+      $message['body'][] = t("!sender-name (!sender-url) sent a message using the contact form at !form-url.", $variables, array('langcode' => $language->language));
+      $message['body'][] = $params['message'];
+      break;
+
+    case 'page_autoreply':
+      $message['subject'] .= t('[!category] !subject', $variables, array('langcode' => $language->language));
+      $message['body'][] = $params['category']['reply'];
+      break;
+
+    case 'user_mail':
+    case 'user_copy':
+      $variables += array(
+        '!recipient-name' => format_username($params['recipient']),
+        '!recipient-edit-url' => url('user/' . $params['recipient']->uid . '/edit', array('absolute' => TRUE, 'language' => $language)),
+      );
+      $message['subject'] .= t('[!site-name] !subject', $variables, array('langcode' => $language->language));
+      $message['body'][] = t('Hello !recipient-name,', $variables, array('langcode' => $language->language));
+      $message['body'][] = t("!sender-name (!sender-url) has sent you a message via your contact form (!form-url) at !site-name.", $variables, array('langcode' => $language->language));
+      $message['body'][] = t("If you don't want to receive such e-mails, you can change your settings at !recipient-edit-url.", $variables, array('langcode' => $language->language));
+      $message['body'][] = t('Message:', array(), array('langcode' => $language->language));
+      $message['body'][] = $params['message'];
+      break;
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Add the enable personal contact form to an individual user's account page.
+ *
+ * @see user_profile_form()
+ */
+function contact_form_user_profile_form_alter(&$form, &$form_state) {
+  if ($form['#user_category'] == 'account') {
+    $account = $form['#user'];
+    $form['contact'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Contact settings'),
+      '#weight' => 5,
+      '#collapsible' => TRUE,
+    );
+    $form['contact']['contact'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Personal contact form'),
+      '#default_value' => !empty($account->data['contact']) ? $account->data['contact'] : FALSE,
+      '#description' => t('Allow other users to contact you via a <a href="@url">personal contact form</a> which keeps your e-mail address hidden. Note that some privileged users such as site administrators are still able to contact you even if you choose to disable this feature.', array('@url' => url("user/$account->uid/contact"))),
+    );
+  }
+}
+
+/**
+ * Implements hook_user_presave().
+ */
+function contact_user_presave(&$edit, $account, $category) {
+  $edit['data']['contact'] = isset($edit['contact']) ? $edit['contact'] : variable_get('contact_default_status', 1);
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Add the default personal contact setting on the user settings page.
+ *
+ * @see user_admin_settings()
+ */
+function contact_form_user_admin_settings_alter(&$form, &$form_state) {
+  $form['contact'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Contact settings'),
+    '#weight' => 0,
+  );
+  $form['contact']['contact_default_status'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable the personal contact form by default for new users.'),
+    '#description' => t('Changing this setting will not affect existing users.'),
+    '#default_value' => variable_get('contact_default_status', 1),
+  );
+}
diff --git a/htmltest/modules/contact/contact.pages.inc b/htmltest/modules/contact/contact.pages.inc
new file mode 100644
index 00000000..ba8918bf
--- /dev/null
+++ b/htmltest/modules/contact/contact.pages.inc
@@ -0,0 +1,300 @@
+<?php
+
+/**
+ * @file
+ * Page callbacks for the Contact module.
+ */
+
+/**
+ * Form constructor for the site-wide contact form.
+ *
+ * @see contact_site_form_validate()
+ * @see contact_site_form_submit()
+ * @ingroup forms
+ */
+function contact_site_form($form, &$form_state) {
+  global $user;
+
+  // Check if flood control has been activated for sending e-mails.
+  $limit = variable_get('contact_threshold_limit', 5);
+  $window = variable_get('contact_threshold_window', 3600);
+  if (!flood_is_allowed('contact', $limit, $window) && !user_access('administer contact forms')) {
+    drupal_set_message(t("You cannot send more than %limit messages in @interval. Try again later.", array('%limit' => $limit, '@interval' => format_interval($window))), 'error');
+    drupal_access_denied();
+    drupal_exit();
+  }
+
+  // Get an array of the categories and the current default category.
+  $categories = db_select('contact', 'c')
+    ->addTag('translatable')
+    ->fields('c', array('cid', 'category'))
+    ->orderBy('weight')
+    ->orderBy('category')
+    ->execute()
+    ->fetchAllKeyed();
+  $default_category = db_query("SELECT cid FROM {contact} WHERE selected = 1")->fetchField();
+
+  // If there are no categories, do not display the form.
+  if (!$categories) {
+    if (user_access('administer contact forms')) {
+      drupal_set_message(t('The contact form has not been configured. <a href="@add">Add one or more categories</a> to the form.', array('@add' => url('admin/structure/contact/add'))), 'error');
+    }
+    else {
+      drupal_not_found();
+      drupal_exit();
+    }
+  }
+
+  // If there is more than one category available and no default category has
+  // been selected, prepend a default placeholder value.
+  if (!$default_category) {
+    if (count($categories) > 1) {
+      $categories = array(0 => t('- Please choose -')) + $categories;
+    }
+    else {
+      $default_category = key($categories);
+    }
+  }
+
+  if (!$user->uid) {
+    $form['#attached']['library'][] = array('system', 'jquery.cookie');
+    $form['#attributes']['class'][] = 'user-info-from-cookie';
+  }
+
+  $form['#attributes']['class'][] = 'contact-form';
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Your name'),
+    '#maxlength' => 255,
+    '#default_value' => $user->uid ? format_username($user) : '',
+    '#required' => TRUE,
+  );
+  $form['mail'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Your e-mail address'),
+    '#maxlength' => 255,
+    '#default_value' => $user->uid ? $user->mail : '',
+    '#required' => TRUE,
+  );
+  $form['subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#maxlength' => 255,
+    '#required' => TRUE,
+  );
+  $form['cid'] = array(
+    '#type' => 'select',
+    '#title' => t('Category'),
+    '#default_value' => $default_category,
+    '#options' => $categories,
+    '#required' => TRUE,
+    '#access' => count($categories) > 1,
+  );
+  $form['message'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Message'),
+    '#required' => TRUE,
+  );
+  // We do not allow anonymous users to send themselves a copy
+  // because it can be abused to spam people.
+  $form['copy'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Send yourself a copy.'),
+    '#access' => $user->uid,
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Send message'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form validation handler for contact_site_form().
+ *
+ * @see contact_site_form_submit()
+ */
+function contact_site_form_validate($form, &$form_state) {
+  if (!$form_state['values']['cid']) {
+    form_set_error('cid', t('You must select a valid category.'));
+  }
+  if (!valid_email_address($form_state['values']['mail'])) {
+    form_set_error('mail', t('You must enter a valid e-mail address.'));
+  }
+}
+
+/**
+ * Form submission handler for contact_site_form().
+ *
+ * @see contact_site_form_validate()
+ */
+function contact_site_form_submit($form, &$form_state) {
+  global $user, $language;
+
+  $values = $form_state['values'];
+  $values['sender'] = $user;
+  $values['sender']->name = $values['name'];
+  $values['sender']->mail = $values['mail'];
+  $values['category'] = contact_load($values['cid']);
+
+  // Save the anonymous user information to a cookie for reuse.
+  if (!$user->uid) {
+    user_cookie_save(array_intersect_key($values, array_flip(array('name', 'mail'))));
+  }
+
+  // Get the to and from e-mail addresses.
+  $to = $values['category']['recipients'];
+  $from = $values['sender']->mail;
+
+  // Send the e-mail to the recipients using the site default language.
+  drupal_mail('contact', 'page_mail', $to, language_default(), $values, $from);
+
+  // If the user requests it, send a copy using the current language.
+  if ($values['copy']) {
+    drupal_mail('contact', 'page_copy', $from, $language, $values, $from);
+  }
+
+  // Send an auto-reply if necessary using the current language.
+  if ($values['category']['reply']) {
+    drupal_mail('contact', 'page_autoreply', $from, $language, $values, $to);
+  }
+
+  flood_register_event('contact', variable_get('contact_threshold_window', 3600));
+  watchdog('mail', '%sender-name (@sender-from) sent an e-mail regarding %category.', array('%sender-name' => $values['name'], '@sender-from' => $from, '%category' => $values['category']['category']));
+
+  // Jump to home page rather than back to contact page to avoid
+  // contradictory messages if flood control has been activated.
+  drupal_set_message(t('Your message has been sent.'));
+  $form_state['redirect'] = '';
+}
+
+/**
+ * Form constructor for the personal contact form.
+ *
+ * Path: user/%user/contact
+ *
+ * @see contact_menu()
+ * @see contact_personal_form_validate()
+ * @see contact_personal_form_submit()
+ * @ingroup forms
+ */
+function contact_personal_form($form, &$form_state, $recipient) {
+  global $user;
+
+  // Check if flood control has been activated for sending e-mails.
+  $limit = variable_get('contact_threshold_limit', 5);
+  $window = variable_get('contact_threshold_window', 3600);
+  if (!flood_is_allowed('contact', $limit, $window) && !user_access('administer contact forms') && !user_access('administer users')) {
+    drupal_set_message(t("You cannot send more than %limit messages in @interval. Try again later.", array('%limit' => $limit, '@interval' => format_interval($window))), 'error');
+    drupal_access_denied();
+    drupal_exit();
+  }
+
+  drupal_set_title(t('Contact @username', array('@username' => format_username($recipient))), PASS_THROUGH);
+
+  if (!$user->uid) {
+    $form['#attached']['library'][] = array('system', 'jquery.cookie');
+    $form['#attributes']['class'][] = 'user-info-from-cookie';
+  }
+
+  $form['#attributes']['class'][] = 'contact-form';
+  $form['recipient'] = array(
+    '#type' => 'value',
+    '#value' => $recipient,
+  );
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Your name'),
+    '#maxlength' => 255,
+    '#default_value' => $user->uid ? format_username($user) : '',
+    '#required' => TRUE,
+  );
+  $form['mail'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Your e-mail address'),
+    '#maxlength' => 255,
+    '#default_value' => $user->uid ? $user->mail : '',
+    '#required' => TRUE,
+  );
+  $form['to'] = array(
+    '#type' => 'item',
+    '#title' => t('To'),
+    '#markup' => theme('username', array('account' => $recipient)),
+  );
+  $form['subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#maxlength' => 50,
+    '#required' => TRUE,
+  );
+  $form['message'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Message'),
+    '#rows' => 15,
+    '#required' => TRUE,
+  );
+  // We do not allow anonymous users to send themselves a copy
+  // because it can be abused to spam people.
+  $form['copy'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Send yourself a copy.'),
+    '#access' => $user->uid,
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Send message'),
+  );
+  return $form;
+}
+
+/**
+ * Form validation handler for contact_personal_form().
+ *
+ * @see contact_personal_form_submit()
+ */
+function contact_personal_form_validate($form, &$form_state) {
+  if (!valid_email_address($form_state['values']['mail'])) {
+    form_set_error('mail', t('You must enter a valid e-mail address.'));
+  }
+}
+
+/**
+ * Form submission handler for contact_personal_form().
+ *
+ * @see contact_personal_form_validate()
+ */
+function contact_personal_form_submit($form, &$form_state) {
+  global $user, $language;
+
+  $values = $form_state['values'];
+  $values['sender'] = $user;
+  $values['sender']->name = $values['name'];
+  $values['sender']->mail = $values['mail'];
+
+  // Save the anonymous user information to a cookie for reuse.
+  if (!$user->uid) {
+    user_cookie_save(array_intersect_key($values, array_flip(array('name', 'mail'))));
+  }
+
+  // Get the to and from e-mail addresses.
+  $to = $values['recipient']->mail;
+  $from = $values['sender']->mail;
+
+  // Send the e-mail in the requested user language.
+  drupal_mail('contact', 'user_mail', $to, user_preferred_language($values['recipient']), $values, $from);
+
+  // Send a copy if requested, using current page language.
+  if ($values['copy']) {
+    drupal_mail('contact', 'user_copy', $from, $language, $values, $from);
+  }
+
+  flood_register_event('contact', variable_get('contact_threshold_window', 3600));
+  watchdog('mail', '%sender-name (@sender-from) sent %recipient-name an e-mail.', array('%sender-name' => $values['name'], '@sender-from' => $from, '%recipient-name' => $values['recipient']->name));
+
+  // Jump to the contacted user's profile page.
+  drupal_set_message(t('Your message has been sent.'));
+  $form_state['redirect'] = user_access('access user profiles') ? 'user/' . $values['recipient']->uid : '';
+}
diff --git a/htmltest/modules/contact/contact.test b/htmltest/modules/contact/contact.test
new file mode 100644
index 00000000..6693b574
--- /dev/null
+++ b/htmltest/modules/contact/contact.test
@@ -0,0 +1,434 @@
+<?php
+/**
+ * @file
+ * Tests for the Contact module.
+ */
+
+/**
+ * Tests the site-wide contact form.
+ */
+class ContactSitewideTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Site-wide contact form',
+      'description' => 'Tests site-wide contact form functionality.',
+      'group' => 'Contact',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('contact');
+  }
+
+  /**
+   * Tests configuration options and the site-wide contact form.
+   */
+  function testSiteWideContact() {
+    // Create and login administrative user.
+    $admin_user = $this->drupalCreateUser(array('access site-wide contact form', 'administer contact forms', 'administer users'));
+    $this->drupalLogin($admin_user);
+
+    $flood_limit = 3;
+    variable_set('contact_threshold_limit', $flood_limit);
+    variable_set('contact_threshold_window', 600);
+
+    // Set settings.
+    $edit = array();
+    $edit['contact_default_status'] = TRUE;
+    $this->drupalPost('admin/config/people/accounts', $edit, t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'Setting successfully saved.');
+
+    // Delete old categories to ensure that new categories are used.
+    $this->deleteCategories();
+
+    // Ensure that the contact form won't be shown without categories.
+    user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access site-wide contact form'));
+    $this->drupalLogout();
+    $this->drupalGet('contact');
+    $this->assertResponse(404);
+    $this->drupalLogin($admin_user);
+    $this->drupalGet('contact');
+    $this->assertResponse(200);
+    $this->assertText(t('The contact form has not been configured.'));
+
+    // Add categories.
+    // Test invalid recipients.
+    $invalid_recipients = array('invalid', 'invalid@', 'invalid@site.', '@site.', '@site.com');
+    foreach ($invalid_recipients as $invalid_recipient) {
+      $this->addCategory($this->randomName(16), $invalid_recipient, '', FALSE);
+      $this->assertRaw(t('%recipient is an invalid e-mail address.', array('%recipient' => $invalid_recipient)), format_string('Caught invalid recipient (@invalid_recipient).', array('@invalid_recipient' => $invalid_recipient)));
+    }
+
+    // Test validation of empty category and recipients fields.
+    $this->addCategory($category = '', '', '', TRUE);
+    $this->assertText(t('Category field is required.'), 'Caught empty category field');
+    $this->assertText(t('Recipients field is required.'), 'Caught empty recipients field.');
+
+    // Create first valid category.
+    $recipients = array('simpletest@example.com', 'simpletest2@example.com', 'simpletest3@example.com');
+    $this->addCategory($category = $this->randomName(16), implode(',', array($recipients[0])), '', TRUE);
+    $this->assertRaw(t('Category %category has been saved.', array('%category' => $category)), 'Category successfully saved.');
+
+    // Make sure the newly created category is included in the list of categories.
+    $this->assertNoUniqueText($category, 'New category included in categories list.');
+
+    // Test update contact form category.
+    $categories = $this->getCategories();
+    $category_id = $this->updateCategory($categories, $category = $this->randomName(16), $recipients_str = implode(',', array($recipients[0], $recipients[1])), $reply = $this->randomName(30), FALSE);
+    $category_array = db_query("SELECT category, recipients, reply, selected FROM {contact} WHERE cid = :cid", array(':cid' => $category_id))->fetchAssoc();
+    $this->assertEqual($category_array['category'], $category);
+    $this->assertEqual($category_array['recipients'], $recipients_str);
+    $this->assertEqual($category_array['reply'], $reply);
+    $this->assertFalse($category_array['selected']);
+    $this->assertRaw(t('Category %category has been saved.', array('%category' => $category)), 'Category successfully saved.');
+
+    // Ensure that the contact form is shown without a category selection input.
+    user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access site-wide contact form'));
+    $this->drupalLogout();
+    $this->drupalGet('contact');
+    $this->assertText(t('Your e-mail address'), 'Contact form is shown when there is one category.');
+    $this->assertNoText(t('Category'), 'When there is only one category, the category selection element is hidden.');
+    $this->drupalLogin($admin_user);
+
+    // Add more categories.
+    $this->addCategory($category = $this->randomName(16), implode(',', array($recipients[0], $recipients[1])), '', FALSE);
+    $this->assertRaw(t('Category %category has been saved.', array('%category' => $category)), 'Category successfully saved.');
+
+    $this->addCategory($category = $this->randomName(16), implode(',', array($recipients[0], $recipients[1], $recipients[2])), '', FALSE);
+    $this->assertRaw(t('Category %category has been saved.', array('%category' => $category)), 'Category successfully saved.');
+
+    // Try adding a category that already exists.
+    $this->addCategory($category, '', '', FALSE);
+    $this->assertNoRaw(t('Category %category has been saved.', array('%category' => $category)), 'Category not saved.');
+    $this->assertRaw(t('A contact form with category %category already exists.', array('%category' => $category)), 'Duplicate category error found.');
+
+    // Clear flood table in preparation for flood test and allow other checks to complete.
+    db_delete('flood')->execute();
+    $num_records_after = db_query("SELECT COUNT(*) FROM {flood}")->fetchField();
+    $this->assertIdentical($num_records_after, '0', 'Flood table emptied.');
+    $this->drupalLogout();
+
+    // Check to see that anonymous user cannot see contact page without permission.
+    user_role_revoke_permissions(DRUPAL_ANONYMOUS_RID, array('access site-wide contact form'));
+    $this->drupalGet('contact');
+    $this->assertResponse(403, 'Access denied to anonymous user without permission.');
+
+    // Give anonymous user permission and see that page is viewable.
+    user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access site-wide contact form'));
+    $this->drupalGet('contact');
+    $this->assertResponse(200, 'Access granted to anonymous user with permission.');
+
+    // Submit contact form with invalid values.
+    $this->submitContact('', $recipients[0], $this->randomName(16), $categories[0], $this->randomName(64));
+    $this->assertText(t('Your name field is required.'), 'Name required.');
+
+    $this->submitContact($this->randomName(16), '', $this->randomName(16), $categories[0], $this->randomName(64));
+    $this->assertText(t('Your e-mail address field is required.'), 'E-mail required.');
+
+    $this->submitContact($this->randomName(16), $invalid_recipients[0], $this->randomName(16), $categories[0], $this->randomName(64));
+    $this->assertText(t('You must enter a valid e-mail address.'), 'Valid e-mail required.');
+
+    $this->submitContact($this->randomName(16), $recipients[0], '', $categories[0], $this->randomName(64));
+    $this->assertText(t('Subject field is required.'), 'Subject required.');
+
+    $this->submitContact($this->randomName(16), $recipients[0], $this->randomName(16), $categories[0], '');
+    $this->assertText(t('Message field is required.'), 'Message required.');
+
+    // Test contact form with no default category selected.
+    db_update('contact')
+      ->fields(array('selected' => 0))
+      ->execute();
+    $this->drupalGet('contact');
+    $this->assertRaw(t('- Please choose -'), 'Without selected categories the visitor is asked to chose a category.');
+
+    // Submit contact form with invalid category id (cid 0).
+    $this->submitContact($this->randomName(16), $recipients[0], $this->randomName(16), 0, '');
+    $this->assertText(t('You must select a valid category.'), 'Valid category required.');
+
+    // Submit contact form with correct values and check flood interval.
+    for ($i = 0; $i < $flood_limit; $i++) {
+      $this->submitContact($this->randomName(16), $recipients[0], $this->randomName(16), $categories[0], $this->randomName(64));
+      $this->assertText(t('Your message has been sent.'), 'Message sent.');
+    }
+    // Submit contact form one over limit.
+    $this->drupalGet('contact');
+    $this->assertResponse(403, 'Access denied to anonymous user after reaching message treshold.');
+    $this->assertRaw(t('You cannot send more than %number messages in @interval. Try again later.', array('%number' => variable_get('contact_threshold_limit', 3), '@interval' => format_interval(600))), 'Message threshold reached.');
+
+    // Delete created categories.
+    $this->drupalLogin($admin_user);
+    $this->deleteCategories();
+  }
+
+  /**
+  * Tests auto-reply on the site-wide contact form.
+  */
+  function testAutoReply() {
+    // Create and login administrative user.
+    $admin_user = $this->drupalCreateUser(array('access site-wide contact form', 'administer contact forms', 'administer permissions', 'administer users'));
+    $this->drupalLogin($admin_user);
+
+    // Set up three categories, 2 with an auto-reply and one without.
+    $foo_autoreply = $this->randomName(40);
+    $bar_autoreply = $this->randomName(40);
+    $this->addCategory('foo', 'foo@example.com', $foo_autoreply, FALSE);
+    $this->addCategory('bar', 'bar@example.com', $bar_autoreply, FALSE);
+    $this->addCategory('no_autoreply', 'bar@example.com', '', FALSE);
+
+    // Test the auto-reply for category 'foo'.
+    $email = $this->randomName(32) . '@example.com';
+    $subject = $this->randomName(64);
+    $this->submitContact($this->randomName(16), $email, $subject, 2, $this->randomString(128));
+
+    // We are testing the auto-reply, so there should be one e-mail going to the sender.
+    $captured_emails = $this->drupalGetMails(array('id' => 'contact_page_autoreply', 'to' => $email, 'from' => 'foo@example.com'));
+    $this->assertEqual(count($captured_emails), 1, 'Auto-reply e-mail was sent to the sender for category "foo".', 'Contact');
+    $this->assertEqual($captured_emails[0]['body'], drupal_html_to_text($foo_autoreply), 'Auto-reply e-mail body is correct for category "foo".', 'Contact');
+
+    // Test the auto-reply for category 'bar'.
+    $email = $this->randomName(32) . '@example.com';
+    $this->submitContact($this->randomName(16), $email, $this->randomString(64), 3, $this->randomString(128));
+
+    // Auto-reply for category 'bar' should result in one auto-reply e-mail to the sender.
+    $captured_emails = $this->drupalGetMails(array('id' => 'contact_page_autoreply', 'to' => $email, 'from' => 'bar@example.com'));
+    $this->assertEqual(count($captured_emails), 1, 'Auto-reply e-mail was sent to the sender for category "bar".', 'Contact');
+    $this->assertEqual($captured_emails[0]['body'], drupal_html_to_text($bar_autoreply), 'Auto-reply e-mail body is correct for category "bar".', 'Contact');
+
+    // Verify that no auto-reply is sent when the auto-reply field is left blank.
+    $email = $this->randomName(32) . '@example.com';
+    $this->submitContact($this->randomName(16), $email, $this->randomString(64), 4, $this->randomString(128));
+    $captured_emails = $this->drupalGetMails(array('id' => 'contact_page_autoreply', 'to' => $email, 'from' => 'no_autoreply@example.com'));
+    $this->assertEqual(count($captured_emails), 0, 'No auto-reply e-mail was sent to the sender for category "no-autoreply".', 'Contact');
+  }
+
+  /**
+   * Adds a category.
+   *
+   * @param string $category
+   *   The category name.
+   * @param string $recipients
+   *   The list of recipient e-mail addresses.
+   * @param string $reply
+   *   The auto-reply text that is sent to a user upon completing the contact
+   *   form.
+   * @param boolean $selected
+   *   Boolean indicating whether the category should be selected by default.
+   */
+  function addCategory($category, $recipients, $reply, $selected) {
+    $edit = array();
+    $edit['category'] = $category;
+    $edit['recipients'] = $recipients;
+    $edit['reply'] = $reply;
+    $edit['selected'] = ($selected ? '1' : '0');
+    $this->drupalPost('admin/structure/contact/add', $edit, t('Save'));
+  }
+
+  /**
+   * Updates a category.
+   *
+   * @param string $category
+   *   The category name.
+   * @param string $recipients
+   *   The list of recipient e-mail addresses.
+   * @param string $reply
+   *   The auto-reply text that is sent to a user upon completing the contact
+   *   form.
+   * @param boolean $selected
+   *   Boolean indicating whether the category should be selected by default.
+   */
+  function updateCategory($categories, $category, $recipients, $reply, $selected) {
+    $category_id = $categories[array_rand($categories)];
+    $edit = array();
+    $edit['category'] = $category;
+    $edit['recipients'] = $recipients;
+    $edit['reply'] = $reply;
+    $edit['selected'] = ($selected ? '1' : '0');
+    $this->drupalPost('admin/structure/contact/edit/' . $category_id, $edit, t('Save'));
+    return ($category_id);
+  }
+
+  /**
+   * Submits the contact form.
+   *
+   * @param string $name
+   *   The name of the sender.
+   * @param string $mail
+   *   The e-mail address of the sender.
+   * @param string $subject
+   *   The subject of the message.
+   * @param integer $cid
+   *   The category ID of the message.
+   * @param string $message
+   *   The message body.
+   */
+  function submitContact($name, $mail, $subject, $cid, $message) {
+    $edit = array();
+    $edit['name'] = $name;
+    $edit['mail'] = $mail;
+    $edit['subject'] = $subject;
+    $edit['cid'] = $cid;
+    $edit['message'] = $message;
+    $this->drupalPost('contact', $edit, t('Send message'));
+  }
+
+  /**
+   * Deletes all categories.
+   */
+  function deleteCategories() {
+    $categories = $this->getCategories();
+    foreach ($categories as $category) {
+      $category_name = db_query("SELECT category FROM {contact} WHERE cid = :cid", array(':cid' => $category))->fetchField();
+      $this->drupalPost('admin/structure/contact/delete/' . $category, array(), t('Delete'));
+      $this->assertRaw(t('Category %category has been deleted.', array('%category' => $category_name)), 'Category deleted successfully.');
+    }
+  }
+
+  /**
+   * Gets a list of all category IDs.
+   *
+   * @return array
+   *   A list of the category IDs.
+   */
+  function getCategories() {
+    $categories = db_query('SELECT cid FROM {contact}')->fetchCol();
+    return $categories;
+  }
+}
+
+/**
+ * Tests the personal contact form.
+ */
+class ContactPersonalTestCase extends DrupalWebTestCase {
+  private $admin_user;
+  private $web_user;
+  private $contact_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Personal contact form',
+      'description' => 'Tests personal contact form functionality.',
+      'group' => 'Contact',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('contact');
+
+    // Create an admin user.
+    $this->admin_user = $this->drupalCreateUser(array('administer contact forms', 'administer users'));
+
+    // Create some normal users with their contact forms enabled by default.
+    variable_set('contact_default_status', TRUE);
+    $this->web_user = $this->drupalCreateUser(array('access user contact forms'));
+    $this->contact_user = $this->drupalCreateUser();
+  }
+
+  /**
+   * Tests access to the personal contact form.
+   */
+  function testPersonalContactAccess() {
+    // Test allowed access to user with contact form enabled.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('user/' . $this->contact_user->uid . '/contact');
+    $this->assertResponse(200);
+
+    // Test denied access to the user's own contact form.
+    $this->drupalGet('user/' . $this->web_user->uid . '/contact');
+    $this->assertResponse(403);
+
+    // Test always denied access to the anonymous user contact form.
+    $this->drupalGet('user/0/contact');
+    $this->assertResponse(403);
+
+    // Test that anonymous users can access the contact form.
+    $this->drupalLogout();
+    user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access user contact forms'));
+    $this->drupalGet('user/' . $this->contact_user->uid . '/contact');
+    $this->assertResponse(200);
+
+    // Revoke the personal contact permission for the anonymous user.
+    user_role_revoke_permissions(DRUPAL_ANONYMOUS_RID, array('access user contact forms'));
+    $this->drupalGet('user/' . $this->contact_user->uid . '/contact');
+    $this->assertResponse(403);
+
+    // Disable the personal contact form.
+    $this->drupalLogin($this->admin_user);
+    $edit = array('contact_default_status' => FALSE);
+    $this->drupalPost('admin/config/people/accounts', $edit, t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'Setting successfully saved.');
+    $this->drupalLogout();
+
+    // Re-create our contacted user with personal contact forms disabled by
+    // default.
+    $this->contact_user = $this->drupalCreateUser();
+
+    // Test denied access to a user with contact form disabled.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('user/' . $this->contact_user->uid . '/contact');
+    $this->assertResponse(403);
+
+    // Test allowed access for admin user to a user with contact form disabled.
+    $this->drupalLogin($this->admin_user);
+    $this->drupalGet('user/' . $this->contact_user->uid . '/contact');
+    $this->assertResponse(200);
+
+    // Re-create our contacted user as a blocked user.
+    $this->contact_user = $this->drupalCreateUser();
+    user_save($this->contact_user, array('status' => 0));
+
+    // Test that blocked users can still be contacted by admin.
+    $this->drupalGet('user/' . $this->contact_user->uid . '/contact');
+    $this->assertResponse(200);
+
+    // Test that blocked users cannot be contacted by non-admins.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('user/' . $this->contact_user->uid . '/contact');
+    $this->assertResponse(403);
+  }
+
+  /**
+   * Tests the personal contact form flood protection.
+   */
+  function testPersonalContactFlood() {
+    $flood_limit = 3;
+    variable_set('contact_threshold_limit', $flood_limit);
+
+    // Clear flood table in preparation for flood test and allow other checks to complete.
+    db_delete('flood')->execute();
+    $num_records_flood = db_query("SELECT COUNT(*) FROM {flood}")->fetchField();
+    $this->assertIdentical($num_records_flood, '0', 'Flood table emptied.');
+
+    $this->drupalLogin($this->web_user);
+
+    // Submit contact form with correct values and check flood interval.
+    for ($i = 0; $i < $flood_limit; $i++) {
+      $this->submitPersonalContact($this->contact_user);
+      $this->assertText(t('Your message has been sent.'), 'Message sent.');
+    }
+
+    // Submit contact form one over limit.
+    $this->drupalGet('user/' . $this->contact_user->uid. '/contact');
+    $this->assertRaw(t('You cannot send more than %number messages in @interval. Try again later.', array('%number' => $flood_limit, '@interval' => format_interval(variable_get('contact_threshold_window', 3600)))), 'Normal user denied access to flooded contact form.');
+
+    // Test that the admin user can still access the contact form even though
+    // the flood limit was reached.
+    $this->drupalLogin($this->admin_user);
+    $this->assertNoText('Try again later.', 'Admin user not denied access to flooded contact form.');
+  }
+
+  /**
+   * Fills out a user's personal contact form and submits it.
+   *
+   * @param $account
+   *   A user object of the user being contacted.
+   * @param $message
+   *   An optional array with the form fields being used.
+   */
+  protected function submitPersonalContact($account, array $message = array()) {
+    $message += array(
+      'subject' => $this->randomName(16),
+      'message' => $this->randomName(64),
+    );
+    $this->drupalPost('user/' . $account->uid . '/contact', $message, t('Send message'));
+  }
+}
diff --git a/htmltest/modules/contextual/contextual-rtl.css b/htmltest/modules/contextual/contextual-rtl.css
new file mode 100644
index 00000000..aecbee04
--- /dev/null
+++ b/htmltest/modules/contextual/contextual-rtl.css
@@ -0,0 +1,20 @@
+/**
+ * @file
+ * Stylesheet specific to right-to-left languages.
+ */
+
+div.contextual-links-wrapper {
+  left: 5px;
+  right: auto;
+}
+div.contextual-links-wrapper ul.contextual-links {
+  -moz-border-radius: 0 4px 4px 4px;
+  -webkit-border-top-left-radius: 0;
+  -webkit-border-top-right-radius: 4px;
+  border-radius: 0 4px 4px 4px;
+  left: 0;
+  right: auto;
+}
+a.contextual-links-trigger {
+  text-indent: -90px;
+}
diff --git a/htmltest/modules/contextual/contextual.api.php b/htmltest/modules/contextual/contextual.api.php
new file mode 100644
index 00000000..e8f33ee0
--- /dev/null
+++ b/htmltest/modules/contextual/contextual.api.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by Contextual module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Alter a contextual links element before it is rendered.
+ *
+ * This hook is invoked by contextual_pre_render_links(). The renderable array
+ * of #type 'contextual_links', containing the entire contextual links data that
+ * is passed in by reference. Further links may be added or existing links can
+ * be altered.
+ *
+ * @param $element
+ *   A renderable array representing the contextual links.
+ * @param $items
+ *   An associative array containing the original contextual link items, as
+ *   generated by menu_contextual_links(), which were used to build
+ *   $element['#links'].
+ *
+ * @see hook_menu_contextual_links_alter()
+ * @see contextual_pre_render_links()
+ * @see contextual_element_info()
+ */
+function hook_contextual_links_view_alter(&$element, $items) {
+  // Add another class to all contextual link lists to facilitate custom
+  // styling.
+  $element['#attributes']['class'][] = 'custom-class';
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/contextual/contextual.css b/htmltest/modules/contextual/contextual.css
new file mode 100644
index 00000000..93a17963
--- /dev/null
+++ b/htmltest/modules/contextual/contextual.css
@@ -0,0 +1,103 @@
+/**
+ * @file
+ * Stylesheet for the Contextual module.
+ */
+
+/**
+ * Contextual links regions.
+ */
+.contextual-links-region {
+  outline: none;
+  position: relative;
+}
+.contextual-links-region-active {
+  outline: #999 dashed 1px;
+}
+
+/**
+ * Contextual links.
+ */
+div.contextual-links-wrapper {
+  display: none;
+  font-size: 90%;
+  position: absolute;
+  right: 5px; /* LTR */
+  top: 2px;
+  z-index: 999;
+}
+html.js div.contextual-links-wrapper {
+  display: block;
+}
+a.contextual-links-trigger {
+  background: transparent url(images/gear-select.png) no-repeat 2px 0;
+  border: 1px solid transparent;
+  display: none;
+  height: 18px;
+  margin: 0;
+  padding: 0 2px;
+  outline: none;
+  text-indent: 34px; /* LTR */
+  width: 28px;
+  overflow: hidden;
+  -khtml-border-radius: 4px;
+  -moz-border-radius: 4px;
+  -webkit-border-radius: 4px;
+  border-radius: 4px;
+}
+a.contextual-links-trigger:hover,
+div.contextual-links-active a.contextual-links-trigger {
+  background-position: 2px -18px;
+}
+div.contextual-links-active a.contextual-links-trigger {
+  background-color: #fff;
+  border-color: #ccc;
+  border-bottom: none;
+  position: relative;
+  z-index: 1;
+  -moz-border-radius: 4px 4px 0 0;
+  -webkit-border-bottom-left-radius: 0;
+  -webkit-border-bottom-right-radius: 0;
+  border-radius: 4px 4px 0 0;
+}
+div.contextual-links-wrapper ul.contextual-links {
+  background-color: #fff;
+  border: 1px solid #ccc;
+  display: none;
+  margin: 0;
+  padding: 0.25em 0;
+  position: absolute;
+  right: 0;
+  text-align: left;
+  top: 18px;
+  white-space: nowrap;
+  -moz-border-radius: 4px 0 4px 4px; /* LTR */
+  -webkit-border-bottom-left-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+  -webkit-border-top-right-radius: 0; /* LTR */
+  -webkit-border-top-left-radius: 4px; /* LTR */
+  border-radius: 4px 0 4px 4px; /* LTR */
+}
+a.contextual-links-trigger-active,
+div.contextual-links-active a.contextual-links-trigger,
+div.contextual-links-active ul.contextual-links {
+  display: block;
+}
+ul.contextual-links li {
+  line-height: 100%;
+  list-style: none;
+  list-style-image: none;
+  margin: 0;
+  padding: 0;
+}
+div.contextual-links-wrapper a {
+  text-decoration: none;
+}
+ul.contextual-links li a {
+  color: #333 !important;
+  display: block;
+  margin: 0.25em 0;
+  padding: 0.25em 1em 0.25em 0.5em;
+}
+ul.contextual-links li a:hover {
+  background-color: #bfdcee;
+}
diff --git a/htmltest/modules/contextual/contextual.info b/htmltest/modules/contextual/contextual.info
new file mode 100644
index 00000000..0bfad8c8
--- /dev/null
+++ b/htmltest/modules/contextual/contextual.info
@@ -0,0 +1,12 @@
+name = Contextual links
+description = Provides contextual links to perform actions related to elements on a page.
+package = Core
+version = VERSION
+core = 7.x
+files[] = contextual.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/contextual/contextual.js b/htmltest/modules/contextual/contextual.js
new file mode 100644
index 00000000..4339780e
--- /dev/null
+++ b/htmltest/modules/contextual/contextual.js
@@ -0,0 +1,52 @@
+/**
+ * @file
+ * Attaches behaviors for the Contextual module.
+ */
+
+(function ($) {
+
+Drupal.contextualLinks = Drupal.contextualLinks || {};
+
+/**
+ * Attaches outline behavior for regions associated with contextual links.
+ */
+Drupal.behaviors.contextualLinks = {
+  attach: function (context) {
+    $('div.contextual-links-wrapper', context).once('contextual-links', function () {
+      var $wrapper = $(this);
+      var $region = $wrapper.closest('.contextual-links-region');
+      var $links = $wrapper.find('ul.contextual-links');
+      var $trigger = $('<a class="contextual-links-trigger" href="#" />').text(Drupal.t('Configure')).click(
+        function () {
+          $links.stop(true, true).slideToggle(100);
+          $wrapper.toggleClass('contextual-links-active');
+          return false;
+        }
+      );
+      // Attach hover behavior to trigger and ul.contextual-links.
+      $trigger.add($links).hover(
+        function () { $region.addClass('contextual-links-region-active'); },
+        function () { $region.removeClass('contextual-links-region-active'); }
+      );
+      // Hide the contextual links when user clicks a link or rolls out of the .contextual-links-region.
+      $region.bind('mouseleave click', Drupal.contextualLinks.mouseleave);
+      $region.hover(
+        function() { $trigger.addClass('contextual-links-trigger-active'); },
+        function() { $trigger.removeClass('contextual-links-trigger-active'); }
+      );
+      // Prepend the trigger.
+      $wrapper.prepend($trigger);
+    });
+  }
+};
+
+/**
+ * Disables outline for the region contextual links are associated with.
+ */
+Drupal.contextualLinks.mouseleave = function () {
+  $(this)
+    .find('.contextual-links-active').removeClass('contextual-links-active')
+    .find('ul.contextual-links').hide();
+};
+
+})(jQuery);
diff --git a/htmltest/modules/contextual/contextual.module b/htmltest/modules/contextual/contextual.module
new file mode 100644
index 00000000..0f371a57
--- /dev/null
+++ b/htmltest/modules/contextual/contextual.module
@@ -0,0 +1,169 @@
+<?php
+
+/**
+ * @file
+ * Adds contextual links to perform actions related to elements on a page.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function contextual_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#contextual':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Contextual links module displays links related to regions of pages on your site to users with <em>access contextual links</em> permission. For more information, see the online handbook entry for <a href="@contextual">Contextual links module</a>.', array('@contextual' => 'http://drupal.org/documentation/modules/contextual')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Displaying contextual links') . '</dt>';
+      $output .= '<dd>' . t('Contextual links are supplied by modules, to give you quick access to tasks associated with regions of pages on your site. For instance, if you have a custom menu block displayed in a sidebar of your site, the Blocks and Menus modules will supply links to configure the block and edit the menu. The Contextual links module collects these links into a list for display by your theme, and also adds JavaScript code to the page to hide the links initially, and display them when your mouse hovers over the block.') . '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_permission().
+ */
+function contextual_permission() {
+  return array(
+    'access contextual links' => array(
+      'title' => t('Use contextual links'),
+      'description' => t('Use contextual links to perform actions related to elements on a page.'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_library().
+ */
+function contextual_library() {
+  $path = drupal_get_path('module', 'contextual');
+  $libraries['contextual-links'] = array(
+    'title' => 'Contextual links',
+    'website' => 'http://drupal.org/node/473268',
+    'version' => '1.0',
+    'js' => array(
+      $path . '/contextual.js' => array(),
+    ),
+    'css' => array(
+      $path . '/contextual.css' => array(),
+    ),
+  );
+  return $libraries;
+}
+
+/**
+ * Implements hook_element_info().
+ */
+function contextual_element_info() {
+  $types['contextual_links'] = array(
+    '#pre_render' => array('contextual_pre_render_links'),
+    '#theme' => 'links__contextual',
+    '#links' => array(),
+    '#prefix' => '<div class="contextual-links-wrapper">',
+    '#suffix' => '</div>',
+    '#attributes' => array(
+      'class' => array('contextual-links'),
+    ),
+    '#attached' => array(
+      'library' => array(
+        array('contextual', 'contextual-links'),
+      ),
+    ),
+  );
+  return $types;
+}
+
+/**
+ * Implements hook_preprocess().
+ *
+ * @see contextual_pre_render_links()
+ */
+function contextual_preprocess(&$variables, $hook) {
+  // Nothing to do here if the user is not permitted to access contextual links.
+  if (!user_access('access contextual links')) {
+    return;
+  }
+
+  $hooks = theme_get_registry(FALSE);
+
+  // Determine the primary theme function argument.
+  if (!empty($hooks[$hook]['variables'])) {
+    $keys = array_keys($hooks[$hook]['variables']);
+    $key = $keys[0];
+  }
+  elseif (!empty($hooks[$hook]['render element'])) {
+    $key = $hooks[$hook]['render element'];
+  }
+  if (!empty($key) && isset($variables[$key])) {
+    $element = $variables[$key];
+  }
+
+  if (isset($element) && is_array($element) && !empty($element['#contextual_links'])) {
+    // Initialize the template variable as a renderable array.
+    $variables['title_suffix']['contextual_links'] = array(
+      '#type' => 'contextual_links',
+      '#contextual_links' => $element['#contextual_links'],
+      '#element' => $element,
+    );
+    // Mark this element as potentially having contextual links attached to it.
+    $variables['classes_array'][] = 'contextual-links-region';
+  }
+}
+
+/**
+ * Build a renderable array for contextual links.
+ *
+ * @param $element
+ *   A renderable array containing a #contextual_links property, which is a
+ *   keyed array. Each key is the name of the implementing module, and each
+ *   value is an array that forms the function arguments for
+ *   menu_contextual_links(). For example:
+ *   @code
+ *     array('#contextual_links' => array(
+ *       'block' => array('admin/structure/block/manage', array('system', 'navigation')),
+ *       'menu' => array('admin/structure/menu/manage', array('navigation')),
+ *     ))
+ *   @endcode
+ *
+ * @return
+ *   A renderable array representing contextual links.
+ *
+ * @see menu_contextual_links()
+ * @see contextual_element_info()
+ */
+function contextual_pre_render_links($element) {
+  // Retrieve contextual menu links.
+  $items = array();
+  foreach ($element['#contextual_links'] as $module => $args) {
+    $items += menu_contextual_links($module, $args[0], $args[1]);
+  }
+
+  // Transform contextual links into parameters suitable for theme_link().
+  $links = array();
+  foreach ($items as $class => $item) {
+    $class = drupal_html_class($class);
+    $links[$class] = array(
+      'title' => $item['title'],
+      'href' => $item['href'],
+    );
+    // @todo theme_links() should *really* use the same parameters as l().
+    $item['localized_options'] += array('query' => array());
+    $item['localized_options']['query'] += drupal_get_destination();
+    $links[$class] += $item['localized_options'];
+  }
+  $element['#links'] = $links;
+
+  // Allow modules to alter the renderable contextual links element.
+  drupal_alter('contextual_links_view', $element, $items);
+
+  // If there are no links, tell drupal_render() to abort rendering.
+  if (empty($element['#links'])) {
+    $element['#printed'] = TRUE;
+  }
+
+  return $element;
+}
+
diff --git a/htmltest/modules/contextual/contextual.test b/htmltest/modules/contextual/contextual.test
new file mode 100644
index 00000000..79eedb86
--- /dev/null
+++ b/htmltest/modules/contextual/contextual.test
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Tests for contextual.module.
+ */
+
+/**
+ * Tests accessible links after inaccessible links on dynamic context.
+ */
+class ContextualDynamicContextTestCase extends DrupalWebTestCase {
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Contextual links on node lists',
+      'description' => 'Tests if contextual links are showing on the front page depending on permissions.',
+      'group' => 'Contextual',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('contextual', 'node'));
+    $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page'));
+    $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article'));
+    $web_user = $this->drupalCreateUser(array('access content', 'access contextual links', 'edit any article content'));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Tests contextual links on node lists with different permissions.
+   */
+  function testNodeLinks() {
+    // Create three nodes in the following order:
+    // - An article, which should be user-editable.
+    // - A page, which should not be user-editable.
+    // - A second article, which should also be user-editable.
+    $node1 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+    $node2 = $this->drupalCreateNode(array('type' => 'page', 'promote' => 1));
+    $node3 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+
+    // Now, on the front page, all article nodes should have contextual edit
+    // links. The page node in between should not.
+    $this->drupalGet('node');
+    $this->assertRaw('node/' . $node1->nid . '/edit', 'Edit link for oldest article node showing.');
+    $this->assertNoRaw('node/' . $node2->nid . '/edit', 'No edit link for page nodes.');
+    $this->assertRaw('node/' . $node3->nid . '/edit', 'Edit link for most recent article node showing.');
+  }
+}
diff --git a/htmltest/modules/contextual/images/gear-select.png b/htmltest/modules/contextual/images/gear-select.png
new file mode 100644
index 00000000..adf65822
Binary files /dev/null and b/htmltest/modules/contextual/images/gear-select.png differ
diff --git a/htmltest/modules/dashboard/dashboard-rtl.css b/htmltest/modules/dashboard/dashboard-rtl.css
new file mode 100644
index 00000000..8d3d0edd
--- /dev/null
+++ b/htmltest/modules/dashboard/dashboard-rtl.css
@@ -0,0 +1,30 @@
+/**
+ * @file
+ * Right-to-left specific stylesheet for the Dashboard module.
+ */
+
+#dashboard div.dashboard-region {
+  float: right;
+}
+#dashboard #disabled-blocks .block, #dashboard .block-placeholder {
+  float: right;
+  margin: 3px 0 3px 3px;
+  padding: 6px 8px 6px 4px;
+}
+#dashboard .canvas-content a.button {
+  margin: 0 10px 0 0;
+}
+#dashboard .ui-sortable .block h2 {
+  background-position: right -39px;
+  padding: 0 19px;
+}
+#dashboard.customize-inactive #disabled-blocks .block:hover h2 {
+  background-position: right -39px;
+}
+#dashboard.customize-inactive .dashboard-region .ui-sortable .block:hover h2 {
+  background-position: right -36px;
+}
+#dashboard div#dashboard_main {
+  margin-left: 1%;
+  margin-right: 0;
+}
diff --git a/htmltest/modules/dashboard/dashboard.api.php b/htmltest/modules/dashboard/dashboard.api.php
new file mode 100644
index 00000000..a36a8ea0
--- /dev/null
+++ b/htmltest/modules/dashboard/dashboard.api.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Dashboard module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Add regions to the dashboard.
+ *
+ * @return
+ *   An array whose keys are the names of the dashboard regions and whose
+ *   values are the titles that will be displayed in the blocks administration
+ *   interface. The keys are also used as theme wrapper functions.
+ */
+function hook_dashboard_regions() {
+  // Define a new dashboard region. Your module can also then define
+  // theme_mymodule_dashboard_region() as a theme wrapper function to control
+  // the region's appearance.
+  return array('mymodule_dashboard_region' => "My module's dashboard region");
+}
+
+/**
+ * Alter dashboard regions provided by modules.
+ *
+ * @param $regions
+ *   An array containing all dashboard regions, in the format provided by
+ *   hook_dashboard_regions().
+ */
+function hook_dashboard_regions_alter(&$regions) {
+  // Remove the sidebar region defined by the core dashboard module.
+  unset($regions['dashboard_sidebar']);
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/dashboard/dashboard.css b/htmltest/modules/dashboard/dashboard.css
new file mode 100644
index 00000000..83e9ee46
--- /dev/null
+++ b/htmltest/modules/dashboard/dashboard.css
@@ -0,0 +1,134 @@
+/**
+ * @file
+ * Stylesheet for the Dashboard module.
+ */
+
+#dashboard div.dashboard-region {
+  float: left;
+  min-height: 1px;
+}
+
+#dashboard div#dashboard_main {
+  width: 65%;
+  margin-right: 1%; /* LTR */
+}
+
+#dashboard div#dashboard_sidebar {
+  width: 33%;
+}
+
+#dashboard div.block {
+  margin-bottom: 20px;
+}
+
+#dashboard .dashboard-region .block {
+  clear: both;
+}
+
+#dashboard div.block h2 {
+  float: none;
+}
+
+#dashboard #disabled-blocks .block,
+#dashboard .block-placeholder {
+  background: #e2e1dc;
+  padding: 6px 4px 6px 8px; /* LTR */
+  margin: 3px 3px 3px 0; /* LTR */
+  float: left; /* LTR */
+  -moz-border-radius: 4px;
+  -webkit-border-radius: 4px;
+  border-radius: 4px;
+}
+
+#dashboard .dashboard-add-other-blocks {
+  margin: 10px 0 0 0;
+}
+
+#dashboard .ui-sortable {
+  border: 2px dashed #ccc;
+  padding: 10px;
+}
+
+#dashboard .canvas-content {
+  padding: 10px;
+}
+
+#dashboard #disabled-blocks .ui-sortable {
+  padding: 0;
+  background-color: #777;
+  border: 0;
+}
+
+#dashboard .canvas-content a.button {
+  margin: 0 0 0 10px; /* LTR */
+  color: #5a5a5a;
+  text-decoration: none;
+}
+
+#dashboard .region {
+  margin: 5px;
+}
+
+#dashboard #disabled-blocks .region {
+  background-color: #E0E0D8;
+  border: #ccc 1px solid;
+  padding: 10px;
+}
+
+#dashboard #disabled-blocks {
+  padding: 5px 0;
+}
+
+#dashboard #disabled-blocks h2 {
+  display: inline;
+  font-weight: normal;
+  white-space: nowrap;
+}
+
+#dashboard #disabled-blocks .block {
+  background: #444;
+  color: #fff;
+}
+
+#dashboard.customize-inactive #disabled-blocks .block:hover {
+  background: #0074BD;
+}
+
+#dashboard #disabled-blocks .block .content,
+#dashboard .ui-sortable-helper .content {
+  display: none;
+}
+
+#dashboard .ui-sortable .block {
+  cursor: move;
+  min-height: 1px;
+}
+
+#dashboard .ui-sortable .block h2 {
+  background: transparent url(../../misc/draggable.png) no-repeat 0px -39px;
+  padding: 0 17px;
+}
+
+#dashboard.customize-inactive #disabled-blocks .block:hover h2 {
+  background: #0074BD url(../../misc/draggable.png) no-repeat 0px -39px;
+  color: #fff;
+}
+
+#dashboard.customize-inactive .dashboard-region .ui-sortable .block:hover h2 {
+  background: #0074BD url(../../misc/draggable.png) no-repeat;
+  background-position: 3px -36px;
+  color: #fff;
+}
+
+#dashboard .dashboard-region .block-placeholder {
+  margin: 0 0 20px 0;
+  padding: 0;
+  display: block;
+  height: 1.6em;
+  width: 100%;
+}
+
+#dashboard #disabled-blocks .block-placeholder {
+  width: 30px;
+  height: 1.6em;
+}
diff --git a/htmltest/modules/dashboard/dashboard.info b/htmltest/modules/dashboard/dashboard.info
new file mode 100644
index 00000000..e43262dd
--- /dev/null
+++ b/htmltest/modules/dashboard/dashboard.info
@@ -0,0 +1,14 @@
+name = Dashboard
+description = Provides a dashboard page in the administrative interface for organizing administrative tasks and tracking information within your site.
+core = 7.x
+package = Core
+version = VERSION
+files[] = dashboard.test
+dependencies[] = block
+configure = admin/dashboard/customize
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/dashboard/dashboard.install b/htmltest/modules/dashboard/dashboard.install
new file mode 100644
index 00000000..50218262
--- /dev/null
+++ b/htmltest/modules/dashboard/dashboard.install
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the dashboard module.
+ */
+
+/**
+ * Implements hook_disable().
+ *
+ * Stash a list of blocks enabled on the dashboard, so they can be re-enabled
+ * if the dashboard is re-enabled. Then disable those blocks, since the
+ * dashboard regions will no longer be defined.
+ */
+function dashboard_disable() {
+  // Stash a list of currently enabled blocks.
+  $stashed_blocks = array();
+
+  $result = db_select('block', 'b')
+    ->fields('b', array('module', 'delta', 'region'))
+    ->condition('b.region', dashboard_regions(), 'IN')
+    ->execute();
+
+  foreach ($result as $block) {
+    $stashed_blocks[] = array(
+      'module' => $block->module,
+      'delta' => $block->delta,
+      'region' => $block->region,
+    );
+  }
+  variable_set('dashboard_stashed_blocks', $stashed_blocks);
+
+  // Disable the dashboard blocks.
+  db_update('block')
+    ->fields(array(
+      'status' => 0,
+      'region' => BLOCK_REGION_NONE,
+    ))
+    ->condition('region', dashboard_regions(), 'IN')
+    ->execute();
+}
+
+/**
+ * Implements hook_enable().
+ *
+ * Restores blocks to the dashboard that were there when the dashboard module
+ * was disabled.
+ */
+function dashboard_enable() {
+  global $theme_key;
+  if (!$stashed_blocks = variable_get('dashboard_stashed_blocks')) {
+    return;
+  }
+  if (!$admin_theme = variable_get('admin_theme')) {
+    drupal_theme_initialize();
+    $admin_theme = $theme_key;
+  }
+  foreach ($stashed_blocks as $block) {
+    db_update('block')
+      ->fields(array(
+        'status' => 1,
+        'region' => $block['region']
+      ))
+      ->condition('module', $block['module'])
+      ->condition('delta', $block['delta'])
+      ->condition('theme', $admin_theme)
+      ->condition('status', 0)
+      ->execute();
+  }
+  variable_del('dashboard_stashed_blocks');
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function dashboard_uninstall() {
+  variable_del('dashboard_stashed_blocks');
+}
diff --git a/htmltest/modules/dashboard/dashboard.js b/htmltest/modules/dashboard/dashboard.js
new file mode 100644
index 00000000..62f13a41
--- /dev/null
+++ b/htmltest/modules/dashboard/dashboard.js
@@ -0,0 +1,223 @@
+/**
+ * @file
+ * Attaches behaviors for the Dashboard module.
+ */
+
+(function ($) {
+
+/**
+ * Implements Drupal.behaviors for the Dashboard module.
+ */
+Drupal.behaviors.dashboard = {
+  attach: function (context, settings) {
+    $('#dashboard', context).once(function () {
+      $(this).prepend('<div class="customize clearfix"><ul class="action-links"><li><a href="#">' + Drupal.t('Customize dashboard') + '</a></li></ul><div class="canvas"></div></div>');
+      $('.customize .action-links a', this).click(Drupal.behaviors.dashboard.enterCustomizeMode);
+    });
+    Drupal.behaviors.dashboard.addPlaceholders();
+    if (Drupal.settings.dashboard.launchCustomize) {
+      Drupal.behaviors.dashboard.enterCustomizeMode();
+    }
+  },
+
+  addPlaceholders: function() {
+    $('#dashboard .dashboard-region .region').each(function () {
+      var empty_text = "";
+      // If the region is empty
+      if ($('.block', this).length == 0) {
+        // Check if we are in customize mode and grab the correct empty text
+        if ($('#dashboard').hasClass('customize-mode')) {
+          empty_text = Drupal.settings.dashboard.emptyRegionTextActive;
+        } else {
+          empty_text = Drupal.settings.dashboard.emptyRegionTextInactive;
+        }
+        // We need a placeholder.
+        if ($('.placeholder', this).length == 0) {
+          $(this).append('<div class="placeholder"></div>');
+        }
+        $('.placeholder', this).html(empty_text);
+      }
+      else {
+        $('.placeholder', this).remove();
+      }
+    });
+  },
+
+  /**
+   * Enters "customize" mode by displaying disabled blocks.
+   */
+  enterCustomizeMode: function () {
+    $('#dashboard').addClass('customize-mode customize-inactive');
+    Drupal.behaviors.dashboard.addPlaceholders();
+    // Hide the customize link
+    $('#dashboard .customize .action-links').hide();
+    // Load up the disabled blocks
+    $('div.customize .canvas').load(Drupal.settings.dashboard.drawer, Drupal.behaviors.dashboard.setupDrawer);
+  },
+
+  /**
+   * Exits "customize" mode by simply forcing a page refresh.
+   */
+  exitCustomizeMode: function () {
+    $('#dashboard').removeClass('customize-mode customize-inactive');
+    Drupal.behaviors.dashboard.addPlaceholders();
+    location.href = Drupal.settings.dashboard.dashboard;
+  },
+
+  /**
+   * Sets up the drag-and-drop behavior and the 'close' button.
+   */
+  setupDrawer: function () {
+    $('div.customize .canvas-content input').click(Drupal.behaviors.dashboard.exitCustomizeMode);
+    $('div.customize .canvas-content').append('<a class="button" href="' + Drupal.settings.dashboard.dashboard + '">' + Drupal.t('Done') + '</a>');
+
+    // Initialize drag-and-drop.
+    var regions = $('#dashboard div.region');
+    regions.sortable({
+      connectWith: regions,
+      cursor: 'move',
+      cursorAt: {top:0},
+      dropOnEmpty: true,
+      items: '> div.block, > div.disabled-block',
+      placeholder: 'block-placeholder clearfix',
+      tolerance: 'pointer',
+      start: Drupal.behaviors.dashboard.start,
+      over: Drupal.behaviors.dashboard.over,
+      sort: Drupal.behaviors.dashboard.sort,
+      update: Drupal.behaviors.dashboard.update
+    });
+  },
+
+  /**
+   * Makes the block appear as a disabled block while dragging.
+   *
+   * This function is called on the jQuery UI Sortable "start" event.
+   *
+   * @param event
+   *  The event that triggered this callback.
+   * @param ui
+   *  An object containing information about the item that is being dragged.
+   */
+  start: function (event, ui) {
+    $('#dashboard').removeClass('customize-inactive');
+    var item = $(ui.item);
+
+    // If the block is already in disabled state, don't do anything.
+    if (!item.hasClass('disabled-block')) {
+      item.css({height: 'auto'});
+    }
+  },
+
+  /**
+   * Adapts block's width to the region it is moved into while dragging.
+   *
+   * This function is called on the jQuery UI Sortable "over" event.
+   *
+   * @param event
+   *  The event that triggered this callback.
+   * @param ui
+   *  An object containing information about the item that is being dragged.
+   */
+  over: function (event, ui) {
+    var item = $(ui.item);
+
+    // If the block is in disabled state, remove width.
+    if ($(this).closest('#disabled-blocks').length) {
+      item.css('width', '');
+    }
+    else {
+      item.css('width', $(this).width());
+    }
+  },
+
+  /**
+   * Adapts a block's position to stay connected with the mouse pointer.
+   *
+   * This function is called on the jQuery UI Sortable "sort" event.
+   *
+   * @param event
+   *  The event that triggered this callback.
+   * @param ui
+   *  An object containing information about the item that is being dragged.
+   */
+  sort: function (event, ui) {
+    var item = $(ui.item);
+
+    if (event.pageX > ui.offset.left + item.width()) {
+      item.css('left', event.pageX);
+    }
+  },
+
+  /**
+   * Sends block order to the server, and expand previously disabled blocks.
+   *
+   * This function is called on the jQuery UI Sortable "update" event.
+   *
+   * @param event
+   *   The event that triggered this callback.
+   * @param ui
+   *   An object containing information about the item that was just dropped.
+   */
+  update: function (event, ui) {
+    $('#dashboard').addClass('customize-inactive');
+    var item = $(ui.item);
+
+    // If the user dragged a disabled block, load the block contents.
+    if (item.hasClass('disabled-block')) {
+      var module, delta, itemClass;
+      itemClass = item.attr('class');
+      // Determine the block module and delta.
+      module = itemClass.match(/\bmodule-(\S+)\b/)[1];
+      delta = itemClass.match(/\bdelta-(\S+)\b/)[1];
+
+      // Load the newly enabled block's content.
+      $.get(Drupal.settings.dashboard.blockContent + '/' + module + '/' + delta, {},
+        function (block) {
+          if (block) {
+            item.html(block);
+          }
+
+          if (item.find('div.content').is(':empty')) {
+            item.find('div.content').html(Drupal.settings.dashboard.emptyBlockText);
+          }
+
+          Drupal.attachBehaviors(item);
+        },
+        'html'
+      );
+      // Remove the "disabled-block" class, so we don't reload its content the
+      // next time it's dragged.
+      item.removeClass("disabled-block");
+    }
+
+    Drupal.behaviors.dashboard.addPlaceholders();
+
+    // Let the server know what the new block order is.
+    $.post(Drupal.settings.dashboard.updatePath, {
+        'form_token': Drupal.settings.dashboard.formToken,
+        'regions': Drupal.behaviors.dashboard.getOrder
+      }
+    );
+  },
+
+  /**
+   * Returns the current order of the blocks in each of the sortable regions.
+   *
+   * @return
+   *   The current order of the blocks, in query string format.
+   */
+  getOrder: function () {
+    var order = [];
+    $('#dashboard div.region').each(function () {
+      var region = $(this).parent().attr('id').replace(/-/g, '_');
+      var blocks = $(this).sortable('toArray');
+      $.each(blocks, function() {
+        order.push(region + '[]=' + this);
+      });
+    });
+    order = order.join('&');
+    return order;
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/dashboard/dashboard.module b/htmltest/modules/dashboard/dashboard.module
new file mode 100644
index 00000000..4cf654f5
--- /dev/null
+++ b/htmltest/modules/dashboard/dashboard.module
@@ -0,0 +1,681 @@
+<?php
+/**
+ * @file
+ * Provides a dashboard page in the administrative interface.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function dashboard_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#dashboard':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Dashboard module provides a <a href="@dashboard">Dashboard page</a> in the administrative interface for organizing administrative tasks and navigation, and tracking information within your site. The Dashboard page contains blocks, which you can add to and arrange using the drag-and-drop interface that appears when you click on the <em>Customize dashboard</em> link. Within this interface, blocks that are not primarily used for site administration do not appear by default, but can be added via the <em>Add other blocks</em> link. For more information, see the online handbook entry for <a href="@handbook">Dashboard module</a>.', array('@handbook' => 'http://drupal.org/documentation/modules/dashboard', '@dashboard' => url('admin/dashboard'))) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Tracking user activity') . '</dt>';
+      $output .= '<dd>' . t("By enabling blocks such as <em>Who's online</em> and <em>Who's new</em>, site users can track who is logged in and new user signups at a centralized location.") . '</dd>';
+      $output .= '<dt>' . t('Tracking content activity') . '</dt>';
+      $output .= '<dd>' . t('By enabling blocks such as <em>Recent blog posts</em>, <em>New forum topics</em> and <em>Recent comments</em>, site users can view newly added site content at a glance.') . '</dd>';
+      $output .= '</dl>';
+      return $output;
+
+    case 'admin/dashboard/configure':
+      // @todo This assumes the current page is being displayed using the same
+      //   theme that the dashboard is displayed in.
+      $output = '<p>' . t('Rearrange blocks for display on the <a href="@dashboard-url">Dashboard page</a>. Blocks placed in the <em>Dashboard (inactive)</em> region are not displayed when viewing the Dashboard page, but are available within its <em>Customize dashboard</em> interface. Removing a block from active dashboard display makes it available on the main <a href="@blocks-url">blocks administration page</a>.', array('@dashboard-url' => url('admin/dashboard'), '@blocks-url' => url("admin/structure/block/list/{$GLOBALS['theme_key']}"))) . '</p>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function dashboard_menu() {
+  $items['admin/dashboard'] = array(
+    'title' => 'Dashboard',
+    'description' => 'View and customize your dashboard.',
+    'page callback' => 'dashboard_admin',
+    'access arguments' => array('access dashboard'),
+    // Make this appear first, so for example, in admin menus, it shows up on
+    // the top corner of the window as a convenient "home link".
+    'weight' => -15,
+  );
+  $items['admin/dashboard/configure'] = array(
+    'title' => 'Configure available dashboard blocks',
+    'description' => 'Configure which blocks can be shown on the dashboard.',
+    'page callback' => 'dashboard_admin_blocks',
+    'access arguments' => array('administer blocks'),
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+  );
+  $items['admin/dashboard/customize'] = array(
+    'title' => 'Customize dashboard',
+    'description' => 'Customize your dashboard.',
+    'page callback' => 'dashboard_admin',
+    'page arguments' => array(TRUE),
+    'access arguments' => array('access dashboard'),
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+  );
+  $items['admin/dashboard/drawer'] = array(
+    'page callback' => 'dashboard_show_disabled',
+    'access arguments' => array('administer blocks'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['admin/dashboard/block-content/%/%'] = array(
+    'page callback' => 'dashboard_show_block_content',
+    'page arguments' => array(3, 4),
+    'access arguments' => array('administer blocks'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['admin/dashboard/update'] = array(
+    'page callback' => 'dashboard_update',
+    'access arguments' => array('administer blocks'),
+    'type' => MENU_CALLBACK,
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_permission().
+ */
+function dashboard_permission() {
+  return array(
+    'access dashboard' => array(
+      'title' => t('View the administrative dashboard'),
+      // Note: We translate the 'Administer blocks' permission string here with
+      // a separate t() call, to make sure it gets the same translation as when
+      // it's in block_permission().
+      'description' => t('Customizing the dashboard requires the !permission-name permission.', array(
+        '!permission-name' => l(t('Administer blocks'), 'admin/people/permissions', array('fragment' => 'module-block')),
+      )),
+    ),
+  );
+}
+
+/**
+ * Implements hook_block_info_alter().
+ */
+function dashboard_block_info_alter(&$blocks, $theme, $code_blocks) {
+  $admin_theme = variable_get('admin_theme');
+  if (($admin_theme && $theme == $admin_theme) || (!$admin_theme && $theme == variable_get('theme_default', 'bartik'))) {
+    foreach ($blocks as $module => &$module_blocks) {
+      foreach ($module_blocks as $delta => &$block) {
+        // Make administrative blocks that are not already in use elsewhere
+        // available for the dashboard.
+        if (empty($block['status']) && (empty($block['region']) || $block['region'] == BLOCK_REGION_NONE) && !empty($code_blocks[$module][$delta]['properties']['administrative'])) {
+          $block['status'] = 1;
+          $block['region'] = 'dashboard_inactive';
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_block_list_alter().
+ *
+ * Skip rendering dashboard blocks when not on the dashboard page itself. This
+ * prevents expensive dashboard blocks from causing performance issues on pages
+ * where they will never be displayed.
+ */
+function dashboard_block_list_alter(&$blocks) {
+  if (!dashboard_is_visible()) {
+    foreach ($blocks as $key => $block) {
+      if (in_array($block->region, dashboard_regions())) {
+        unset($blocks[$key]);
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_page_build().
+ *
+ * Display dashboard blocks in the main content region.
+ */
+function dashboard_page_build(&$page) {
+  global $theme_key;
+
+  if (dashboard_is_visible()) {
+    $block_info = array();
+
+    // Create a wrapper for the dashboard itself, then insert each dashboard
+    // region into it.
+    $page['content']['dashboard'] = array('#theme_wrappers' => array('dashboard'));
+    foreach (dashboard_regions() as $region) {
+      // Do not show dashboard blocks that are disabled.
+      if ($region == 'dashboard_inactive') {
+        continue;
+      }
+      // Insert regions even when they are empty, so that they will be
+      // displayed when the dashboard is being configured.
+      $page['content']['dashboard'][$region] = !empty($page[$region]) ? $page[$region] : array();
+      $page['content']['dashboard'][$region]['#dashboard_region'] = $region;
+      // Allow each dashboard region to be themed differently, or fall back on
+      // the generic theme wrapper function for dashboard regions.
+      $page['content']['dashboard'][$region]['#theme_wrappers'][] = array($region, 'dashboard_region');
+      unset($page[$region]);
+      $blocks_found = array();
+      foreach ($page['content']['dashboard'][$region] as $item) {
+        if (isset($item['#theme_wrappers']) && is_array($item['#theme_wrappers']) && in_array('block', $item['#theme_wrappers'])) {
+          // If this item is a block, ensure it has a subject.
+          if (empty($item['#block']->subject)) {
+            // Locally cache info data for the object for all blocks, in case
+            // we find a block similarly missing title from the same module.
+            if (!isset($block_info[$item['#block']->module])) {
+              $block_info[$item['#block']->module] = module_invoke($item['#block']->module, 'block_info');
+            }
+            $item['#block']->subject = $block_info[$item['#block']->module][$item['#block']->delta]['info'];
+          }
+          $blocks_found[$item['#block']->module . '_' . $item['#block']->delta] = TRUE;
+        }
+      }
+
+      // Find blocks which were not yet displayed on the page (were empty), and
+      // add placeholder items in their place for rendering.
+      $block_list = db_select('block')
+        ->condition('theme', $theme_key)
+        ->condition('status', 1)
+        ->condition('region', $region)
+        ->fields('block')
+        ->execute();
+      foreach ($block_list as $block) {
+        if (!isset($blocks_found[$block->module . '_' . $block->delta])) {
+          $block->enabled = $block->page_match = TRUE;
+          $block->content = array('#markup' => '<div class="dashboard-block-empty">(empty)</div>');
+          if (!isset($block_info[$block->module])) {
+            $block_info[$block->module] = module_invoke($block->module, 'block_info');
+          }
+          $block->subject = t('@title', array('@title' => $block_info[$block->module][$block->delta]['info']));
+          $block_render = array($block->module . '_' . $block->delta => $block);
+          $build = _block_get_renderable_array($block_render);
+          $page['content']['dashboard'][$block->region][] = $build;
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_system_info_alter().
+ *
+ * Add regions to each theme to store the dashboard blocks.
+ */
+function dashboard_system_info_alter(&$info, $file, $type) {
+  if ($type == 'theme') {
+    // Add the dashboard regions (the "inactive" region should always appear
+    // last in the list, for usability reasons).
+    $dashboard_regions = dashboard_region_descriptions();
+    if (isset($dashboard_regions['dashboard_inactive'])) {
+      $inactive_region = $dashboard_regions['dashboard_inactive'];
+      unset($dashboard_regions['dashboard_inactive']);
+      $dashboard_regions['dashboard_inactive'] = $inactive_region;
+    }
+    $info['regions'] += $dashboard_regions;
+    // Indicate that these regions are intended to be displayed whenever the
+    // dashboard is displayed in an overlay. This information is provided for
+    // any module that might need to use it, not just the core Overlay module.
+    $info['overlay_regions'] = !empty($info['overlay_regions']) ? array_merge($info['overlay_regions'], dashboard_regions()) : dashboard_regions();
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function dashboard_theme() {
+  return array(
+    'dashboard' => array(
+      'render element' => 'element',
+    ),
+    'dashboard_admin' => array(
+      'render element' => 'element',
+    ),
+    'dashboard_region' => array(
+      'render element' => 'element',
+    ),
+    'dashboard_disabled_blocks' => array(
+      'variables' => array('blocks' => NULL),
+    ),
+    'dashboard_disabled_block' => array(
+      'variables' => array('block' => NULL),
+    ),
+    'dashboard_admin_display_form' => array(
+      // When building the form for configuring dashboard blocks, reuse the
+      // Block module's template for the main block configuration form.
+      'template' => 'block-admin-display-form',
+      'path' => drupal_get_path('module', 'block'),
+      'file' => 'block.admin.inc',
+      'render element' => 'form',
+    ),
+  );
+}
+
+/**
+ * Implements hook_forms().
+ */
+function dashboard_forms() {
+  // Reroute the dashboard configuration form to the main blocks administration
+  // form. This allows us to distinguish them by form ID in hook_form_alter().
+  $forms['dashboard_admin_display_form'] = array(
+    'callback' => 'block_admin_display_form',
+  );
+
+  return $forms;
+}
+
+/**
+ * Page callback: Displays the dashboard.
+ *
+ * @param $launch_customize
+ *   Whether to launch in customization mode right away. TRUE or FALSE.
+ */
+function dashboard_admin($launch_customize = FALSE) {
+  $js_settings = array(
+    'dashboard' => array(
+      'drawer' => url('admin/dashboard/drawer'),
+      'blockContent' => url('admin/dashboard/block-content'),
+      'updatePath' => url('admin/dashboard/update'),
+      'formToken' => drupal_get_token('dashboard-update'),
+      'launchCustomize' => $launch_customize,
+      'dashboard' => url('admin/dashboard'),
+      'emptyBlockText' => t('(empty)'),
+      'emptyRegionTextInactive' => t('This dashboard region is empty. Click <em>Customize dashboard</em> to add blocks to it.'),
+      'emptyRegionTextActive' => t('DRAG HERE'),
+    ),
+  );
+  $build = array(
+    '#theme' => 'dashboard_admin',
+    '#message' => t('To customize the dashboard page, move blocks to the dashboard regions on the <a href="@dashboard">Dashboard administration page</a>, or enable JavaScript on this page to use the drag-and-drop interface.', array('@dashboard' => url('admin/dashboard/configure'))),
+    '#access' => user_access('administer blocks'),
+    '#attached' => array(
+      'js' => array(
+        drupal_get_path('module', 'dashboard') . '/dashboard.js',
+        array('data' => $js_settings, 'type' => 'setting'),
+      ),
+      'library' => array(array('system', 'ui.sortable')),
+    ),
+  );
+  return $build;
+}
+
+/**
+ * Page callback: Builds the page for administering dashboard blocks.
+ *
+ * This page reuses the Block module's administration form but limits editing
+ * to blocks that are available to appear on the dashboard.
+ *
+ * @see block_admin_display()
+ * @see block_admin_display_form()
+ * @see dashboard_form_dashboard_admin_display_form_alter()
+ * @see template_preprocess_dashboard_admin_display_form()
+ */
+function dashboard_admin_blocks() {
+  global $theme_key;
+  drupal_theme_initialize();
+  module_load_include('inc', 'block', 'block.admin');
+
+  // Prepare the blocks for the current theme, and remove those that are
+  // currently displayed in non-dashboard regions.
+  // @todo This assumes the current page is being displayed using the same
+  //   theme that the dashboard is displayed in.
+  $blocks = block_admin_display_prepare_blocks($theme_key);
+  $dashboard_regions = dashboard_region_descriptions();
+  $regions_to_remove = array_diff_key(system_region_list($theme_key, REGIONS_VISIBLE), $dashboard_regions);
+  foreach ($blocks as $id => $block) {
+    if (isset($regions_to_remove[$block['region']])) {
+      unset($blocks[$id]);
+    }
+  }
+
+  // Pass in the above blocks and dashboard regions to the form, so that only
+  // dashboard-related regions will be displayed.
+  return drupal_get_form('dashboard_admin_display_form', $blocks, $theme_key, $dashboard_regions);
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function dashboard_form_block_admin_display_form_alter(&$form, &$form_state, $form_id) {
+  // Hide dashboard regions (and any blocks placed within them) from the block
+  // administration form and from the options list on that form. This
+  // function is called for both the dashboard block configuration form and the
+  // standard block configuration form so that both forms can share the same
+  // constructor. As a result the form_id must be checked.
+  if ($form_id != 'dashboard_admin_display_form') {
+    $dashboard_regions = dashboard_region_descriptions();
+    $form['block_regions']['#value'] = array_diff_key($form['block_regions']['#value'], $dashboard_regions);
+    foreach (element_children($form['blocks']) as $i) {
+      $block = &$form['blocks'][$i];
+      if (isset($block['region']['#default_value']) && isset($dashboard_regions[$block['region']['#default_value']]) && $block['region']['#default_value'] != 'dashboard_inactive') {
+        $block['#access'] = FALSE;
+      }
+      elseif (isset($block['region']['#options'])) {
+        $block['region']['#options'] = array_diff_key($block['region']['#options'], $dashboard_regions);
+      }
+      // Show inactive dashboard blocks as disabled on the main block
+      // administration form, so that they are available to place in other
+      // regions of the theme. Note that when the form is submitted, any such
+      // blocks which still remain disabled will immediately be put back in the
+      // 'dashboard_inactive' region, because dashboard_block_info_alter() is
+      // called when the blocks are rehashed. Fortunately, this is the exact
+      // behavior we want.
+      if ($block['region']['#default_value'] == 'dashboard_inactive') {
+        // @todo These do not wind up in correct alphabetical order.
+        $block['region']['#default_value'] = NULL;
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function dashboard_form_dashboard_admin_display_form_alter(&$form, &$form_state) {
+  // Redirect the 'configure' and 'delete' links on each block back to the
+  // dashboard blocks administration page.
+  foreach ($form['blocks'] as &$block) {
+    if (isset($block['configure']['#href'])) {
+      $block['configure']['#options']['query']['destination'] = 'admin/dashboard/configure';
+    }
+    if (isset($block['delete']['#href'])) {
+      $block['delete']['#options']['query']['destination'] = 'admin/dashboard/configure';
+    }
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function dashboard_form_block_admin_configure_alter(&$form, &$form_state) {
+  global $theme_key;
+  drupal_theme_initialize();
+  // Hide the dashboard regions from the region select list on the block
+  // configuration form, for all themes except the current theme (since the
+  // other themes do not display the dashboard).
+  // @todo This assumes the current page is being displayed using the same
+  //   theme that the dashboard is displayed in.
+  $dashboard_regions = dashboard_region_descriptions();
+  foreach (element_children($form['regions']) as $region_name) {
+    $region = &$form['regions'][$region_name];
+    if ($region_name != $theme_key && isset($region['#options'])) {
+      $region['#options'] = array_diff_key($region['#options'], $dashboard_regions);
+    }
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function dashboard_form_block_add_block_form_alter(&$form, &$form_state) {
+  dashboard_form_block_admin_configure_alter($form, $form_state);
+}
+
+/**
+ * Preprocesses variables for block-admin-display-form.tpl.php.
+ */
+function template_preprocess_dashboard_admin_display_form(&$variables) {
+  template_preprocess_block_admin_display_form($variables);
+  if (isset($variables['block_regions'][BLOCK_REGION_NONE])) {
+    $variables['block_regions'][BLOCK_REGION_NONE] = t('Other blocks');
+  }
+}
+
+/**
+ * Determines if the dashboard should be displayed on the current page.
+ *
+ * This function checks if the user is currently viewing the dashboard and has
+ * access to see it. It is used by other functions in the dashboard module to
+ * decide whether or not the dashboard content should be displayed to the
+ * current user.
+ *
+ * Although the menu system normally handles the above tasks, it only does so
+ * for the main page content. However, the dashboard is not part of the main
+ * page content, but rather is displayed in special regions of the page (so it
+ * can interface with the Block module's method of managing page regions). We
+ * therefore need to maintain this separate function to check the menu item for
+ * us.
+ *
+ * @return
+ *   TRUE if the dashboard should be visible on the current page, FALSE
+ *   otherwise.
+ *
+ * @see dashboard_block_list_alter()
+ * @see dashboard_page_build()
+ */
+function dashboard_is_visible() {
+  static $is_visible;
+  if (!isset($is_visible)) {
+    // If the current menu item represents the page on which we want to display
+    // the dashboard, and if the current user has access to see it, return
+    // TRUE.
+    $menu_item = menu_get_item();
+    $is_visible = isset($menu_item['page_callback']) && $menu_item['page_callback'] == 'dashboard_admin' && !empty($menu_item['access']);
+  }
+  return $is_visible;
+}
+
+/**
+ * Returns an array of dashboard region descriptions, keyed by region name.
+ */
+function dashboard_region_descriptions() {
+  $regions = module_invoke_all('dashboard_regions');
+  drupal_alter('dashboard_regions', $regions);
+  return $regions;
+}
+
+/**
+ * Returns an array of dashboard region names.
+ */
+function dashboard_regions() {
+  $regions = &drupal_static(__FUNCTION__);
+  if (!isset($regions)) {
+    $regions = array_keys(dashboard_region_descriptions());
+  }
+  return $regions;
+}
+
+/**
+ * Implements hook_dashboard_regions().
+ */
+function dashboard_dashboard_regions() {
+  return array(
+    'dashboard_main' => 'Dashboard (main)',
+    'dashboard_sidebar' => 'Dashboard (sidebar)',
+    'dashboard_inactive' => 'Dashboard (inactive)',
+  );
+}
+
+/**
+ * Ajax callback: Shows disabled blocks in the dashboard customization mode.
+ */
+function dashboard_show_disabled() {
+  global $theme_key;
+
+  // Blocks are not necessarily initialized at this point.
+  $blocks = _block_rehash();
+
+  // Limit the list to blocks that are marked as disabled for the dashboard.
+  foreach ($blocks as $key => $block) {
+    if ($block['theme'] != $theme_key || $block['region'] != 'dashboard_inactive') {
+      unset($blocks[$key]);
+    }
+  }
+
+  // Theme the output and end the page request.
+  print theme('dashboard_disabled_blocks', array('blocks' => $blocks));
+  drupal_exit();
+}
+
+/**
+ * Ajax callback: Displays the rendered contents of a specific block.
+ *
+ * @param $module
+ *   The block's module name.
+ * @param $delta
+ *   The block's delta.
+ */
+function dashboard_show_block_content($module, $delta) {
+  drupal_theme_initialize();
+  global $theme_key;
+
+  $blocks = array();
+  $block_object = db_query("SELECT * FROM {block} WHERE theme = :theme AND module = :module AND delta = :delta", array(
+    ":theme" => $theme_key,
+    ":module" => $module,
+    ":delta" => $delta,
+    ))
+    ->fetchObject();
+  $block_object->enabled = $block_object->page_match = TRUE;
+  $blocks[$module . "_" . $delta] = $block_object;
+  $block_content = _block_render_blocks($blocks);
+  $build = _block_get_renderable_array($block_content);
+  $rendered_block = drupal_render($build);
+  print $rendered_block;
+  drupal_exit();
+}
+
+/**
+ * Sets the new weight of each region according to the drag-and-drop order.
+ */
+function dashboard_update() {
+  drupal_theme_initialize();
+  global $theme_key;
+  // Check the form token to make sure we have a valid request.
+  if (!empty($_REQUEST['form_token']) && drupal_valid_token($_REQUEST['form_token'], 'dashboard-update')) {
+    parse_str($_REQUEST['regions'], $regions);
+    foreach ($regions as $region_name => $blocks) {
+      if ($region_name == 'disabled_blocks') {
+        $region_name = 'dashboard_inactive';
+      }
+      foreach ($blocks as $weight => $block_string) {
+        // Parse the query string to determine the block's module and delta.
+        preg_match('/block-([^-]+)-(.+)/', $block_string, $matches);
+        $block = new stdClass();
+        $block->module = $matches[1];
+        $block->delta = $matches[2];
+
+        $block->region = $region_name;
+        $block->weight = $weight;
+        $block->status = 1;
+
+        db_merge('block')
+          ->key(array(
+            'module' => $block->module,
+            'delta' => $block->delta,
+            'theme' => $theme_key,
+          ))
+          ->fields(array(
+            'status' => $block->status,
+            'weight' => $block->weight,
+            'region' => $block->region,
+            'pages' => '',
+          ))
+          ->execute();
+      }
+    }
+    drupal_set_message(t('The configuration options have been saved.'), 'status', FALSE);
+  }
+  drupal_exit();
+}
+
+/**
+ * Returns HTML for the entire dashboard.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: A render element containing the properties of the dashboard
+ *     region element, #dashboard_region and #children.
+ *
+ * @ingroup themeable
+ */
+function theme_dashboard($variables) {
+  extract($variables);
+  drupal_add_css(drupal_get_path('module', 'dashboard') . '/dashboard.css');
+  return '<div id="dashboard" class="clearfix">' . $element['#children'] . '</div>';
+}
+
+/**
+ * Returns HTML for the non-customizable part of the dashboard page.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: A render element containing a #message.
+ *
+ * @ingroup themeable
+ */
+function theme_dashboard_admin($variables) {
+  // We only return a simple help message, since the actual content of the page
+  // will be populated via the dashboard regions in dashboard_page_build().
+  return '<div class="customize-dashboard js-hide">' . $variables['element']['#message'] . '</div>';
+}
+
+/**
+ * Returns HTML for a generic dashboard region.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: A render element containing the properties of the dashboard
+ *     region element, #dashboard_region and #children.
+ *
+ * @ingroup themeable
+ */
+function theme_dashboard_region($variables) {
+  extract($variables);
+  $output = '<div id="' . $element['#dashboard_region'] . '" class="dashboard-region">';
+  $output .= '<div class="region clearfix">';
+  $output .= $element['#children'];
+  // Closing div.region
+  $output .= '</div>';
+  // Closing div.dashboard-region
+  $output .= '</div>';
+  return $output;
+}
+
+/**
+ * Returns HTML for disabled blocks, for use in dashboard customization mode.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - blocks: An array of block objects from _block_rehash().
+ *
+ * @ingroup themeable
+ */
+function theme_dashboard_disabled_blocks($variables) {
+  extract($variables);
+  $output = '<div class="canvas-content"><p>' . t('Drag and drop these blocks to the columns below. Changes are automatically saved. More options are available on the <a href="@dashboard-url">configuration page</a>.', array('@dashboard-url' => url('admin/dashboard/configure'))) . '</p>';
+  $output .= '<div id="disabled-blocks"><div class="region disabled-blocks clearfix">';
+  foreach ($blocks as $block) {
+    $output .= theme('dashboard_disabled_block', array('block' => $block));
+  }
+  $output .= '<div class="clearfix"></div>';
+  $output .= '<p class="dashboard-add-other-blocks">' . l(t('Add other blocks'), 'admin/dashboard/configure') . '</p>';
+  $output .= '</div></div></div>';
+  return $output;
+}
+
+/**
+ * Returns HTML for disabled blocks, for use in dashboard customization mode.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - block: A block object from _block_rehash().
+ *
+ * @ingroup themeable
+ */
+function theme_dashboard_disabled_block($variables) {
+  extract($variables);
+  $output = "";
+  if (isset($block)) {
+    $output .= '<div id="block-' . $block['module'] . '-' . $block['delta']
+    . '" class="disabled-block block block-' . $block['module'] . '-' . $block['delta']
+    . ' module-' . $block['module'] . ' delta-' . $block['delta'] . '">'
+    . '<h2>' . (!empty($block['title']) && $block['title'] != '<none>' ? check_plain($block['title']) : check_plain($block['info'])) . '</h2>'
+    . '<div class="content"></div>'
+    . '</div>';
+  }
+  return $output;
+}
+
diff --git a/htmltest/modules/dashboard/dashboard.test b/htmltest/modules/dashboard/dashboard.test
new file mode 100644
index 00000000..06344fc9
--- /dev/null
+++ b/htmltest/modules/dashboard/dashboard.test
@@ -0,0 +1,141 @@
+<?php
+
+/**
+ * @file
+ * Tests for dashboard.module.
+ */
+
+/**
+ * Tests the Dashboard module blocks.
+ */
+class DashboardBlocksTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Dashboard blocks',
+      'description' => 'Test blocks as used by the dashboard.',
+      'group' => 'Dashboard',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Create and log in an administrative user having access to the dashboard.
+    $admin_user = $this->drupalCreateUser(array('access dashboard', 'administer blocks', 'access administration pages', 'administer modules'));
+    $this->drupalLogin($admin_user);
+
+    // Make sure that the dashboard is using the same theme as the rest of the
+    // site (and in particular, the same theme used on 403 pages). This forces
+    // the dashboard blocks to be the same for an administrator as for a
+    // regular user, and therefore lets us test that the dashboard blocks
+    // themselves are specifically removed for a user who does not have access
+    // to the dashboard page.
+    theme_enable(array('stark'));
+    variable_set('theme_default', 'stark');
+    variable_set('admin_theme', 'stark');
+  }
+
+  /**
+   * Tests adding a block to the dashboard and checking access to it.
+   */
+  function testDashboardAccess() {
+    // Add a new custom block to a dashboard region.
+    $custom_block = array();
+    $custom_block['info'] = $this->randomName(8);
+    $custom_block['title'] = $this->randomName(8);
+    $custom_block['body[value]'] = $this->randomName(32);
+    $custom_block['regions[stark]'] = 'dashboard_main';
+    $this->drupalPost('admin/structure/block/add', $custom_block, t('Save block'));
+
+    // Ensure admin access.
+    $this->drupalGet('admin/dashboard');
+    $this->assertResponse(200, 'Admin has access to the dashboard.');
+    $this->assertRaw($custom_block['title'], 'Admin has access to a dashboard block.');
+
+    // Ensure non-admin access is denied.
+    $normal_user = $this->drupalCreateUser();
+    $this->drupalLogin($normal_user);
+    $this->drupalGet('admin/dashboard');
+    $this->assertResponse(403, 'Non-admin has no access to the dashboard.');
+    $this->assertNoText($custom_block['title'], 'Non-admin has no access to a dashboard block.');
+  }
+
+  /**
+   * Tests that dashboard regions are displayed or hidden properly.
+   */
+  function testDashboardRegions() {
+    $dashboard_regions = dashboard_region_descriptions();
+
+    // Ensure blocks can be placed in dashboard regions.
+    $this->drupalGet('admin/dashboard/configure');
+    foreach ($dashboard_regions as $region => $description) {
+      $elements = $this->xpath('//option[@value=:region]', array(':region' => $region));
+      $this->assertTrue(!empty($elements), format_string('%region is an available choice on the dashboard block configuration page.', array('%region' => $region)));
+    }
+
+    // Ensure blocks cannot be placed in dashboard regions on the standard
+    // blocks configuration page.
+    $this->drupalGet('admin/structure/block');
+    foreach ($dashboard_regions as $region => $description) {
+      $elements = $this->xpath('//option[@value=:region]', array(':region' => $region));
+      $this->assertTrue(empty($elements), format_string('%region is not an available choice on the block configuration page.', array('%region' => $region)));
+    }
+  }
+
+  /**
+   * Tests that the dashboard module can be re-enabled, retaining its blocks.
+   */
+  function testDisableEnable() {
+    // Add a new custom block to a dashboard region.
+    $custom_block = array();
+    $custom_block['info'] = $this->randomName(8);
+    $custom_block['title'] = $this->randomName(8);
+    $custom_block['body[value]'] = $this->randomName(32);
+    $custom_block['regions[stark]'] = 'dashboard_main';
+    $this->drupalPost('admin/structure/block/add', $custom_block, t('Save block'));
+    $this->drupalGet('admin/dashboard');
+    $this->assertRaw($custom_block['title'], 'Block appears on the dashboard.');
+
+    $edit = array();
+    $edit['modules[Core][dashboard][enable]'] = FALSE;
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'Modules status has been updated.');
+    $this->assertNoRaw('assigned to the invalid region', 'Dashboard blocks gracefully disabled.');
+    module_list(TRUE);
+    $this->assertFalse(module_exists('dashboard'), 'Dashboard disabled.');
+
+    $edit['modules[Core][dashboard][enable]'] = 'dashboard';
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'Modules status has been updated.');
+    module_list(TRUE);
+    $this->assertTrue(module_exists('dashboard'), 'Dashboard enabled.');
+
+    $this->drupalGet('admin/dashboard');
+    $this->assertRaw($custom_block['title'], 'Block still appears on the dashboard.');
+  }
+
+  /**
+   * Tests that administrative blocks are available for the dashboard.
+   */
+  function testBlockAvailability() {
+    // Test "Recent comments", which should be available (defined as
+    // "administrative") but not enabled.
+    $this->drupalGet('admin/dashboard');
+    $this->assertNoText(t('Recent comments'), '"Recent comments" not on dashboard.');
+    $this->drupalGet('admin/dashboard/drawer');
+    $this->assertText(t('Recent comments'), 'Drawer of disabled blocks includes a block defined as "administrative".');
+    $this->assertNoText(t('Syndicate'), 'Drawer of disabled blocks excludes a block not defined as "administrative".');
+    $this->drupalGet('admin/dashboard/configure');
+    $elements = $this->xpath('//select[@id=:id]//option[@selected="selected"]', array(':id' => 'edit-blocks-comment-recent-region'));
+    $this->assertTrue($elements[0]['value'] == 'dashboard_inactive', 'A block defined as "administrative" defaults to dashboard_inactive.');
+
+    // Now enable the block on the dashboard.
+    $values = array();
+    $values['blocks[comment_recent][region]'] = 'dashboard_main';
+    $this->drupalPost('admin/dashboard/configure', $values, t('Save blocks'));
+    $this->drupalGet('admin/dashboard');
+    $this->assertText(t('Recent comments'), '"Recent comments" was placed on dashboard.');
+    $this->drupalGet('admin/dashboard/drawer');
+    $this->assertNoText(t('Recent comments'), 'Drawer of disabled blocks excludes enabled blocks.');
+  }
+}
diff --git a/htmltest/modules/dblog/dblog-rtl.css b/htmltest/modules/dblog/dblog-rtl.css
new file mode 100644
index 00000000..0fab8d06
--- /dev/null
+++ b/htmltest/modules/dblog/dblog-rtl.css
@@ -0,0 +1,11 @@
+/**
+ * @file
+ * Right-to-Left styling for the Database Logging module.
+ */
+
+.form-item-type,
+.form-item-severity {
+  float: right;
+  padding-right: 0;
+  padding-left: .8em;
+}
diff --git a/htmltest/modules/dblog/dblog.admin.inc b/htmltest/modules/dblog/dblog.admin.inc
new file mode 100644
index 00000000..7c1c0e20
--- /dev/null
+++ b/htmltest/modules/dblog/dblog.admin.inc
@@ -0,0 +1,418 @@
+<?php
+
+/**
+ * @file
+ * Administrative page callbacks for the Database Logging module.
+ */
+
+/**
+ * Page callback: Displays a listing of database log messages.
+ *
+ * Messages are truncated at 56 chars. Full-length messages can be viewed on the
+ * message details page.
+ *
+ * @see dblog_clear_log_form()
+ * @see dblog_event()
+ * @see dblog_filter_form()
+ * @see dblog_menu()
+ *
+ * @ingroup logging_severity_levels
+ */
+function dblog_overview() {
+  $filter = dblog_build_filter_query();
+  $rows = array();
+  $classes = array(
+    WATCHDOG_DEBUG     => 'dblog-debug',
+    WATCHDOG_INFO      => 'dblog-info',
+    WATCHDOG_NOTICE    => 'dblog-notice',
+    WATCHDOG_WARNING   => 'dblog-warning',
+    WATCHDOG_ERROR     => 'dblog-error',
+    WATCHDOG_CRITICAL  => 'dblog-critical',
+    WATCHDOG_ALERT     => 'dblog-alert',
+    WATCHDOG_EMERGENCY => 'dblog-emerg',
+  );
+
+  $build['dblog_filter_form'] = drupal_get_form('dblog_filter_form');
+  $build['dblog_clear_log_form'] = drupal_get_form('dblog_clear_log_form');
+
+  $header = array(
+    '', // Icon column.
+    array('data' => t('Type'), 'field' => 'w.type'),
+    array('data' => t('Date'), 'field' => 'w.wid', 'sort' => 'desc'),
+    t('Message'),
+    array('data' => t('User'), 'field' => 'u.name'),
+    array('data' => t('Operations')),
+  );
+
+  $query = db_select('watchdog', 'w')->extend('PagerDefault')->extend('TableSort');
+  $query->leftJoin('users', 'u', 'w.uid = u.uid');
+  $query
+    ->fields('w', array('wid', 'uid', 'severity', 'type', 'timestamp', 'message', 'variables', 'link'))
+    ->addField('u', 'name');
+  if (!empty($filter['where'])) {
+    $query->where($filter['where'], $filter['args']);
+  }
+  $result = $query
+    ->limit(50)
+    ->orderByHeader($header)
+    ->execute();
+
+  foreach ($result as $dblog) {
+    $rows[] = array('data' =>
+      array(
+        // Cells
+        array('class' => 'icon'),
+        t($dblog->type),
+        format_date($dblog->timestamp, 'short'),
+        theme('dblog_message', array('event' => $dblog, 'link' => TRUE)),
+        theme('username', array('account' => $dblog)),
+        filter_xss($dblog->link),
+      ),
+      // Attributes for tr
+      'class' => array(drupal_html_class('dblog-' . $dblog->type), $classes[$dblog->severity]),
+    );
+  }
+
+  $build['dblog_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#attributes' => array('id' => 'admin-dblog'),
+    '#empty' => t('No log messages available.'),
+  );
+  $build['dblog_pager'] = array('#theme' => 'pager');
+
+  return $build;
+}
+
+/**
+ * Page callback: Shows the most frequent log messages of a given event type.
+ *
+ * Messages are not truncated on this page because events detailed herein do not
+ * have links to a detailed view.
+ *
+ * @param string $type
+ *   Type of database log events to display (e.g., 'search').
+ *
+ * @return array
+ *   A build array in the format expected by drupal_render().
+ *
+ * @see dblog_menu()
+ */
+function dblog_top($type) {
+
+  $header = array(
+    array('data' => t('Count'), 'field' => 'count', 'sort' => 'desc'),
+    array('data' => t('Message'), 'field' => 'message')
+  );
+  $count_query = db_select('watchdog');
+  $count_query->addExpression('COUNT(DISTINCT(message))');
+  $count_query->condition('type', $type);
+
+  $query = db_select('watchdog', 'w')->extend('PagerDefault')->extend('TableSort');
+  $query->addExpression('COUNT(wid)', 'count');
+  $query = $query
+    ->fields('w', array('message', 'variables'))
+    ->condition('w.type', $type)
+    ->groupBy('message')
+    ->groupBy('variables')
+    ->limit(30)
+    ->orderByHeader($header);
+  $query->setCountQuery($count_query);
+  $result = $query->execute();
+
+  $rows = array();
+  foreach ($result as $dblog) {
+    $rows[] = array($dblog->count, theme('dblog_message', array('event' => $dblog)));
+  }
+
+  $build['dblog_top_table']  = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#empty' => t('No log messages available.'),
+  );
+  $build['dblog_top_pager'] = array('#theme' => 'pager');
+
+  return $build;
+}
+
+/**
+ * Page callback: Displays details about a specific database log message.
+ *
+ * @param int $id
+ *   Unique ID of the database log message.
+ *
+ * @return array|string
+ *   If the ID is located in the Database Logging table, a build array in the
+ *   format expected by drupal_render(); otherwise, an empty string.
+ *
+ * @see dblog_menu()
+ */
+function dblog_event($id) {
+  $severity = watchdog_severity_levels();
+  $result = db_query('SELECT w.*, u.name, u.uid FROM {watchdog} w INNER JOIN {users} u ON w.uid = u.uid WHERE w.wid = :id', array(':id' => $id))->fetchObject();
+  if ($dblog = $result) {
+    $rows = array(
+      array(
+        array('data' => t('Type'), 'header' => TRUE),
+        t($dblog->type),
+      ),
+      array(
+        array('data' => t('Date'), 'header' => TRUE),
+        format_date($dblog->timestamp, 'long'),
+      ),
+      array(
+        array('data' => t('User'), 'header' => TRUE),
+        theme('username', array('account' => $dblog)),
+      ),
+      array(
+        array('data' => t('Location'), 'header' => TRUE),
+        l($dblog->location, $dblog->location),
+      ),
+      array(
+        array('data' => t('Referrer'), 'header' => TRUE),
+        l($dblog->referer, $dblog->referer),
+      ),
+      array(
+        array('data' => t('Message'), 'header' => TRUE),
+        theme('dblog_message', array('event' => $dblog)),
+      ),
+      array(
+        array('data' => t('Severity'), 'header' => TRUE),
+        $severity[$dblog->severity],
+      ),
+      array(
+        array('data' => t('Hostname'), 'header' => TRUE),
+        check_plain($dblog->hostname),
+      ),
+      array(
+        array('data' => t('Operations'), 'header' => TRUE),
+        $dblog->link,
+      ),
+    );
+    $build['dblog_table'] = array(
+      '#theme' => 'table',
+      '#rows' => $rows,
+      '#attributes' => array('class' => array('dblog-event')),
+    );
+    return $build;
+  }
+  else {
+    return '';
+  }
+}
+
+/**
+ * Builds a query for database log administration filters based on session.
+ *
+ * @return array
+ *   An associative array with keys 'where' and 'args'.
+ */
+function dblog_build_filter_query() {
+  if (empty($_SESSION['dblog_overview_filter'])) {
+    return;
+  }
+
+  $filters = dblog_filters();
+
+  // Build query
+  $where = $args = array();
+  foreach ($_SESSION['dblog_overview_filter'] as $key => $filter) {
+    $filter_where = array();
+    foreach ($filter as $value) {
+      $filter_where[] = $filters[$key]['where'];
+      $args[] = $value;
+    }
+    if (!empty($filter_where)) {
+      $where[] = '(' . implode(' OR ', $filter_where) . ')';
+    }
+  }
+  $where = !empty($where) ? implode(' AND ', $where) : '';
+
+  return array(
+    'where' => $where,
+    'args' => $args,
+  );
+}
+
+/**
+ * Creates a list of database log administration filters that can be applied.
+ *
+ * @return array
+ *   Associative array of filters. The top-level keys are used as the form
+ *   element names for the filters, and the values are arrays with the following
+ *   elements:
+ *   - title: Title of the filter.
+ *   - where: The filter condition.
+ *   - options: Array of options for the select list for the filter.
+ */
+function dblog_filters() {
+  $filters = array();
+
+  foreach (_dblog_get_message_types() as $type) {
+    $types[$type] = t($type);
+  }
+
+  if (!empty($types)) {
+    $filters['type'] = array(
+      'title' => t('Type'),
+      'where' => "w.type = ?",
+      'options' => $types,
+    );
+  }
+
+  $filters['severity'] = array(
+    'title' => t('Severity'),
+    'where' => 'w.severity = ?',
+    'options' => watchdog_severity_levels(),
+  );
+
+  return $filters;
+}
+
+/**
+ * Returns HTML for a log message.
+ *
+ * @param array $variables
+ *   An associative array containing:
+ *   - event: An object with at least the message and variables properties.
+ *   - link: (optional) Format message as link, event->wid is required.
+ *
+ * @ingroup themeable
+ */
+function theme_dblog_message($variables) {
+  $output = '';
+  $event = $variables['event'];
+  // Check for required properties.
+  if (isset($event->message) && isset($event->variables)) {
+    // Messages without variables or user specified text.
+    if ($event->variables === 'N;') {
+      $output = $event->message;
+    }
+    // Message to translate with injected variables.
+    else {
+      $output = t($event->message, unserialize($event->variables));
+    }
+    if ($variables['link'] && isset($event->wid)) {
+      // Truncate message to 56 chars.
+      $output = truncate_utf8(filter_xss($output, array()), 56, TRUE, TRUE);
+      $output = l($output, 'admin/reports/event/' . $event->wid, array('html' => TRUE));
+    }
+  }
+  return $output;
+}
+
+/**
+ * Form constructor for the database logging filter form.
+ *
+ * @see dblog_filter_form_validate()
+ * @see dblog_filter_form_submit()
+ * @see dblog_overview()
+ *
+ * @ingroup forms
+ */
+function dblog_filter_form($form) {
+  $filters = dblog_filters();
+
+  $form['filters'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Filter log messages'),
+    '#collapsible' => TRUE,
+    '#collapsed' => empty($_SESSION['dblog_overview_filter']),
+  );
+  foreach ($filters as $key => $filter) {
+    $form['filters']['status'][$key] = array(
+      '#title' => $filter['title'],
+      '#type' => 'select',
+      '#multiple' => TRUE,
+      '#size' => 8,
+      '#options' => $filter['options'],
+    );
+    if (!empty($_SESSION['dblog_overview_filter'][$key])) {
+      $form['filters']['status'][$key]['#default_value'] = $_SESSION['dblog_overview_filter'][$key];
+    }
+  }
+
+  $form['filters']['actions'] = array(
+    '#type' => 'actions',
+    '#attributes' => array('class' => array('container-inline')),
+  );
+  $form['filters']['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Filter'),
+  );
+  if (!empty($_SESSION['dblog_overview_filter'])) {
+    $form['filters']['actions']['reset'] = array(
+      '#type' => 'submit',
+      '#value' => t('Reset')
+    );
+  }
+  return $form;
+}
+
+/**
+ * Form validation handler for dblog_filter_form().
+ *
+ * @see dblog_filter_form_submit()
+ */
+function dblog_filter_form_validate($form, &$form_state) {
+  if ($form_state['values']['op'] == t('Filter') && empty($form_state['values']['type']) && empty($form_state['values']['severity'])) {
+    form_set_error('type', t('You must select something to filter by.'));
+  }
+}
+
+/**
+ * Form submission handler for dblog_filter_form().
+ *
+ * @see dblog_filter_form_validate()
+ */
+function dblog_filter_form_submit($form, &$form_state) {
+  $op = $form_state['values']['op'];
+  $filters = dblog_filters();
+  switch ($op) {
+    case t('Filter'):
+      foreach ($filters as $name => $filter) {
+        if (isset($form_state['values'][$name])) {
+          $_SESSION['dblog_overview_filter'][$name] = $form_state['values'][$name];
+        }
+      }
+      break;
+    case t('Reset'):
+      $_SESSION['dblog_overview_filter'] = array();
+      break;
+  }
+  return 'admin/reports/dblog';
+}
+
+/**
+ * Form constructor for the form that clears out the log.
+ *
+ * @see dblog_clear_log_submit()
+ * @ingroup forms
+ */
+function dblog_clear_log_form($form) {
+  $form['dblog_clear'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Clear log messages'),
+    '#description' => t('This will permanently remove the log messages from the database.'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['dblog_clear']['clear'] = array(
+    '#type' => 'submit',
+    '#value' => t('Clear log messages'),
+    '#submit' => array('dblog_clear_log_submit'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form submission handler for dblog_clear_log_form().
+ */
+function dblog_clear_log_submit() {
+  $_SESSION['dblog_overview_filter'] = array();
+  db_delete('watchdog')->execute();
+  drupal_set_message(t('Database log cleared.'));
+}
diff --git a/htmltest/modules/dblog/dblog.css b/htmltest/modules/dblog/dblog.css
new file mode 100644
index 00000000..b1278862
--- /dev/null
+++ b/htmltest/modules/dblog/dblog.css
@@ -0,0 +1,64 @@
+/**
+ * @file
+ * Admin styles for the Database Logging module.
+ */
+
+.form-item-type,
+.form-item-severity {
+  float: left; /* LTR */
+  padding-right: .8em; /* LTR */
+  margin: 0.1em;
+  /**
+   * In Opera 9, DOM elements with the property of "overflow: auto"
+   * will partially hide its contents with unnecessary scrollbars when
+   * its immediate child is floated without an explicit width set.
+   */
+  width: 15em;
+}
+#dblog-filter-form .form-type-select select {
+  width: 100%;
+}
+#dblog-filter-form .form-actions {
+  float: left;
+  padding: 3ex 0 0 1em;
+}
+
+tr.dblog-user {
+  background: #ffd;
+}
+tr.dblog-user .active {
+  background: #eed;
+}
+tr.dblog-content {
+  background: #ddf;
+}
+tr.dblog-content .active {
+  background: #cce;
+}
+tr.dblog-page-not-found,
+tr.dblog-access-denied {
+  background: #dfd;
+}
+tr.dblog-page-not-found .active,
+tr.dblog-access-denied .active {
+  background: #cec;
+}
+tr.dblog-error {
+  background: #ffc9c9;
+}
+tr.dblog-error .active {
+  background: #eeb9b9;
+}
+table#admin-dblog td.icon {
+  background: no-repeat center;
+  width: 16px;
+}
+table#admin-dblog tr.dblog-warning td.icon {
+  background-image: url(../../misc/message-16-warning.png);
+}
+table#admin-dblog tr.dblog-error td.icon,
+table#admin-dblog tr.dblog-critical td.icon,
+table#admin-dblog tr.dblog-alert td.icon,
+table#admin-dblog tr.dblog-emerg td.icon {
+  background-image: url(../../misc/message-16-error.png);
+}
diff --git a/htmltest/modules/dblog/dblog.info b/htmltest/modules/dblog/dblog.info
new file mode 100644
index 00000000..e426ff33
--- /dev/null
+++ b/htmltest/modules/dblog/dblog.info
@@ -0,0 +1,12 @@
+name = Database logging
+description = Logs and records system events to the database.
+package = Core
+version = VERSION
+core = 7.x
+files[] = dblog.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/dblog/dblog.install b/htmltest/modules/dblog/dblog.install
new file mode 100644
index 00000000..abfd9a2c
--- /dev/null
+++ b/htmltest/modules/dblog/dblog.install
@@ -0,0 +1,159 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the dblog module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function dblog_schema() {
+  $schema['watchdog'] = array(
+    'description' => 'Table that contains logs of all system events.',
+    'fields' => array(
+      'wid' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique watchdog event ID.',
+      ),
+      'uid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {users}.uid of the user who triggered the event.',
+      ),
+      'type' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Type of log message, for example "user" or "page not found."',
+      ),
+      'message' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'size' => 'big',
+        'description' => 'Text of log message to be passed into the t() function.',
+      ),
+      'variables' => array(
+        'type' => 'blob',
+        'not null' => TRUE,
+        'size' => 'big',
+        'description' => 'Serialized array of variables that match the message string and that is passed into the t() function.',
+      ),
+      'severity' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'The severity level of the event; ranges from 0 (Emergency) to 7 (Debug)',
+      ),
+      'link' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => FALSE,
+        'default' => '',
+        'description' => 'Link to view the result of the event.',
+      ),
+      'location'  => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'description' => 'URL of the origin of the event.',
+      ),
+      'referer' => array(
+        'type' => 'text',
+        'not null' => FALSE,
+        'description' => 'URL of referring page.',
+      ),
+      'hostname' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Hostname of the user who triggered the event.',
+      ),
+      'timestamp' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Unix timestamp of when event occurred.',
+      ),
+    ),
+    'primary key' => array('wid'),
+    'indexes' => array(
+      'type' => array('type'),
+      'uid' => array('uid'),
+      'severity' => array('severity'),
+    ),
+  );
+
+  return $schema;
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function dblog_uninstall() {
+  variable_del('dblog_row_limit');
+}
+
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Update the {watchdog} table.
+ */
+function dblog_update_7001() {
+  // Allow NULL values for links.
+  db_change_field('watchdog', 'link', 'link', array(
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => FALSE,
+    'default' => '',
+    'description' => 'Link to view the result of the event.',
+  ));
+
+  // Add an index on uid.
+  db_add_index('watchdog', 'uid', array('uid'));
+
+  // Allow longer type values.
+  db_change_field('watchdog', 'type', 'type', array(
+    'type' => 'varchar',
+    'length' => 64,
+    'not null' => TRUE,
+    'default' => '',
+    'description' => 'Type of log message, for example "user" or "page not found."',
+  ));
+
+  // Convert the variables field (that stores serialized variables) from text to blob.
+  db_change_field('watchdog', 'variables', 'variables', array(
+    'type' => 'blob',
+    'not null' => TRUE,
+    'size' => 'big',
+    'description' => 'Serialized array of variables that match the message string and that is passed into the t() function.',
+  ));
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x".
+ */
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Add an index to the severity column in the watchdog database table.
+ */
+function dblog_update_7002() {
+  db_add_index('watchdog', 'severity', array('severity'));
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra".
+ */
diff --git a/htmltest/modules/dblog/dblog.module b/htmltest/modules/dblog/dblog.module
new file mode 100644
index 00000000..9183eed6
--- /dev/null
+++ b/htmltest/modules/dblog/dblog.module
@@ -0,0 +1,187 @@
+<?php
+
+/**
+ * @file
+ * System monitoring and logging for administrators.
+ *
+ * The Database Logging module monitors your site and keeps a list of recorded
+ * events containing usage and performance data, errors, warnings, and similar
+ * operational information.
+ *
+ * @see watchdog()
+ */
+
+/**
+ * Implements hook_help().
+ */
+function dblog_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#dblog':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Database logging module logs system events in the Drupal database. For more information, see the online handbook entry for the <a href="@dblog">Database logging module</a>.', array('@dblog' => 'http://drupal.org/documentation/modules/dblog')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Monitoring your site') . '</dt>';
+      $output .= '<dd>' . t('The Database logging module allows you to view an event log on the <a href="@dblog">Recent log messages</a> page. The log is a chronological list of recorded events containing usage data, performance data, errors, warnings and operational information. Administrators should check the log on a regular basis to ensure their site is working properly.', array('@dblog' => url('admin/reports/dblog'))) . '</dd>';
+      $output .= '<dt>' . t('Debugging site problems') . '</dt>';
+      $output .= '<dd>' . t('In case of errors or problems with the site, the <a href="@dblog">Recent log messages</a> page can be useful for debugging, since it shows the sequence of events. The log messages include usage information, warnings, and errors.', array('@dblog' => url('admin/reports/dblog'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'admin/reports/dblog':
+      return '<p>' . t('The Database logging module monitors your website, capturing system events in a log (shown here) to be reviewed by an authorized individual at a later time. This log is a list of recorded events containing usage data, performance data, errors, warnings and operational information. It is vital to check the Recent log messages report on a regular basis, as it is often the only way to tell what is going on.') . '</p>';
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function dblog_menu() {
+  $items['admin/reports/dblog'] = array(
+    'title' => 'Recent log messages',
+    'description' => 'View events that have recently been logged.',
+    'page callback' => 'dblog_overview',
+    'access arguments' => array('access site reports'),
+    'weight' => -1,
+    'file' => 'dblog.admin.inc',
+  );
+  $items['admin/reports/page-not-found'] = array(
+    'title' => "Top 'page not found' errors",
+    'description' => "View 'page not found' errors (404s).",
+    'page callback' => 'dblog_top',
+    'page arguments' => array('page not found'),
+    'access arguments' => array('access site reports'),
+    'file' => 'dblog.admin.inc',
+  );
+  $items['admin/reports/access-denied'] = array(
+    'title' => "Top 'access denied' errors",
+    'description' => "View 'access denied' errors (403s).",
+    'page callback' => 'dblog_top',
+    'page arguments' => array('access denied'),
+    'access arguments' => array('access site reports'),
+    'file' => 'dblog.admin.inc',
+  );
+  $items['admin/reports/event/%'] = array(
+    'title' => 'Details',
+    'page callback' => 'dblog_event',
+    'page arguments' => array(3),
+    'access arguments' => array('access site reports'),
+    'file' => 'dblog.admin.inc',
+  );
+
+  if (module_exists('search')) {
+    $items['admin/reports/search'] = array(
+      'title' => 'Top search phrases',
+      'description' => 'View most popular search phrases.',
+      'page callback' => 'dblog_top',
+      'page arguments' => array('search'),
+      'access arguments' => array('access site reports'),
+      'file' => 'dblog.admin.inc',
+    );
+  }
+
+  return $items;
+}
+
+/**
+ * Implements hook_init().
+ */
+function dblog_init() {
+  if (arg(0) == 'admin' && arg(1) == 'reports') {
+    // Add the CSS for this module
+    drupal_add_css(drupal_get_path('module', 'dblog') . '/dblog.css');
+  }
+}
+
+/**
+ * Implements hook_cron().
+ *
+ * Controls the size of the log table, paring it to 'dblog_row_limit' messages.
+ */
+function dblog_cron() {
+  // Cleanup the watchdog table.
+  $row_limit = variable_get('dblog_row_limit', 1000);
+
+  // For row limit n, get the wid of the nth row in descending wid order.
+  // Counting the most recent n rows avoids issues with wid number sequences,
+  // e.g. auto_increment value > 1 or rows deleted directly from the table.
+  if ($row_limit > 0) {
+    $min_row = db_select('watchdog', 'w')
+      ->fields('w', array('wid'))
+      ->orderBy('wid', 'DESC')
+      ->range($row_limit - 1, 1)
+      ->execute()->fetchField();
+
+    // Delete all table entries older than the nth row, if nth row was found.
+    if ($min_row) {
+      db_delete('watchdog')
+        ->condition('wid', $min_row, '<')
+        ->execute();
+    }
+  }
+}
+
+/**
+ * Gathers a list of uniquely defined database log message types.
+ *
+ * @return array
+ *   List of uniquely defined database log message types.
+ */
+function _dblog_get_message_types() {
+  $types = array();
+
+  $result = db_query('SELECT DISTINCT(type) FROM {watchdog} ORDER BY type');
+  foreach ($result as $object) {
+    $types[] = $object->type;
+  }
+
+  return $types;
+}
+
+/**
+ * Implements hook_watchdog().
+ *
+ * Note: Some values may be truncated to meet database column size restrictions.
+ */
+function dblog_watchdog(array $log_entry) {
+  Database::getConnection('default', 'default')->insert('watchdog')
+    ->fields(array(
+      'uid' => $log_entry['uid'],
+      'type' => substr($log_entry['type'], 0, 64),
+      'message' => $log_entry['message'],
+      'variables' => serialize($log_entry['variables']),
+      'severity' => $log_entry['severity'],
+      'link' => substr($log_entry['link'], 0, 255),
+      'location' => $log_entry['request_uri'],
+      'referer' => $log_entry['referer'],
+      'hostname' => substr($log_entry['ip'], 0, 128),
+      'timestamp' => $log_entry['timestamp'],
+    ))
+    ->execute();
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter() for system_logging_settings().
+ */
+function dblog_form_system_logging_settings_alter(&$form, $form_state) {
+  $form['dblog_row_limit'] = array(
+    '#type' => 'select',
+    '#title' => t('Database log messages to keep'),
+    '#default_value' => variable_get('dblog_row_limit', 1000),
+    '#options' => array(0 => t('All')) + drupal_map_assoc(array(100, 1000, 10000, 100000, 1000000)),
+    '#description' => t('The maximum number of messages to keep in the database log. Requires a <a href="@cron">cron maintenance task</a>.', array('@cron' => url('admin/reports/status')))
+  );
+  $form['actions']['#weight'] = 1;
+}
+
+/**
+ * Implements hook_theme().
+ */
+function dblog_theme() {
+  return array(
+    'dblog_message' => array(
+      'variables' => array('event' => NULL, 'link' => FALSE),
+      'file' => 'dblog.admin.inc',
+    ),
+  );
+}
diff --git a/htmltest/modules/dblog/dblog.test b/htmltest/modules/dblog/dblog.test
new file mode 100644
index 00000000..bf409c94
--- /dev/null
+++ b/htmltest/modules/dblog/dblog.test
@@ -0,0 +1,637 @@
+<?php
+
+/**
+ * @file
+ * Tests for dblog.module.
+ */
+
+/**
+ * Tests logging messages to the database.
+ */
+class DBLogTestCase extends DrupalWebTestCase {
+
+  /**
+   * A user with some relevant administrative permissions.
+   *
+   * @var object
+   */
+  protected $big_user;
+
+  /**
+   * A user without any permissions.
+   *
+   * @var object
+   */
+  protected $any_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'DBLog functionality',
+      'description' => 'Generate events and verify dblog entries; verify user access to log reports based on persmissions.',
+      'group' => 'DBLog',
+    );
+  }
+
+  /**
+   * Enable modules and create users with specific permissions.
+   */
+  function setUp() {
+    parent::setUp('dblog', 'blog', 'poll');
+    // Create users.
+    $this->big_user = $this->drupalCreateUser(array('administer site configuration', 'access administration pages', 'access site reports', 'administer users'));
+    $this->any_user = $this->drupalCreateUser(array());
+  }
+
+  /**
+   * Tests Database Logging module functionality through interfaces.
+   *
+   * First logs in users, then creates database log events, and finally tests
+   * Database Logging module functionality through both the admin and user
+   * interfaces.
+   */
+  function testDBLog() {
+    // Login the admin user.
+    $this->drupalLogin($this->big_user);
+
+    $row_limit = 100;
+    $this->verifyRowLimit($row_limit);
+    $this->verifyCron($row_limit);
+    $this->verifyEvents();
+    $this->verifyReports();
+
+    // Login the regular user.
+    $this->drupalLogin($this->any_user);
+    $this->verifyReports(403);
+  }
+
+  /**
+   * Verifies setting of the database log row limit.
+   *
+   * @param int $row_limit
+   *   The row limit.
+   */
+  private function verifyRowLimit($row_limit) {
+    // Change the database log row limit.
+    $edit = array();
+    $edit['dblog_row_limit'] = $row_limit;
+    $this->drupalPost('admin/config/development/logging', $edit, t('Save configuration'));
+    $this->assertResponse(200);
+
+    // Check row limit variable.
+    $current_limit = variable_get('dblog_row_limit', 1000);
+    $this->assertTrue($current_limit == $row_limit, format_string('[Cache] Row limit variable of @count equals row limit of @limit', array('@count' => $current_limit, '@limit' => $row_limit)));
+    // Verify dblog row limit equals specified row limit.
+    $current_limit = unserialize(db_query("SELECT value FROM {variable} WHERE name = :dblog_limit", array(':dblog_limit' => 'dblog_row_limit'))->fetchField());
+    $this->assertTrue($current_limit == $row_limit, format_string('[Variable table] Row limit variable of @count equals row limit of @limit', array('@count' => $current_limit, '@limit' => $row_limit)));
+  }
+
+  /**
+   * Verifies that cron correctly applies the database log row limit.
+   *
+   * @param int $row_limit
+   *   The row limit.
+   */
+  private function verifyCron($row_limit) {
+    // Generate additional log entries.
+    $this->generateLogEntries($row_limit + 10);
+    // Verify that the database log row count exceeds the row limit.
+    $count = db_query('SELECT COUNT(wid) FROM {watchdog}')->fetchField();
+    $this->assertTrue($count > $row_limit, format_string('Dblog row count of @count exceeds row limit of @limit', array('@count' => $count, '@limit' => $row_limit)));
+
+    // Run a cron job.
+    $this->cronRun();
+    // Verify that the database log row count equals the row limit plus one
+    // because cron adds a record after it runs.
+    $count = db_query('SELECT COUNT(wid) FROM {watchdog}')->fetchField();
+    $this->assertTrue($count == $row_limit + 1, format_string('Dblog row count of @count equals row limit of @limit plus one', array('@count' => $count, '@limit' => $row_limit)));
+  }
+
+  /**
+   * Generates a number of random database log events.
+   *
+   * @param int $count
+   *   Number of watchdog entries to generate.
+   * @param string $type
+   *   (optional) The type of watchdog entry. Defaults to 'custom'.
+   * @param int $severity
+   *   (optional) The severity of the watchdog entry. Defaults to WATCHDOG_NOTICE.
+   */
+  private function generateLogEntries($count, $type = 'custom', $severity = WATCHDOG_NOTICE) {
+    global $base_root;
+
+    // Prepare the fields to be logged
+    $log = array(
+      'type'        => $type,
+      'message'     => 'Log entry added to test the dblog row limit.',
+      'variables'   => array(),
+      'severity'    => $severity,
+      'link'        => NULL,
+      'user'        => $this->big_user,
+      'uid'         => isset($this->big_user->uid) ? $this->big_user->uid : 0,
+      'request_uri' => $base_root . request_uri(),
+      'referer'     => $_SERVER['HTTP_REFERER'],
+      'ip'          => ip_address(),
+      'timestamp'   => REQUEST_TIME,
+      );
+    $message = 'Log entry added to test the dblog row limit. Entry #';
+    for ($i = 0; $i < $count; $i++) {
+      $log['message'] = $message . $i;
+      dblog_watchdog($log);
+    }
+  }
+
+  /**
+   * Confirms that database log reports are displayed at the correct paths.
+   *
+   * @param int $response
+   *   (optional) HTTP response code. Defaults to 200.
+   */
+  private function verifyReports($response = 200) {
+    $quote = '&#039;';
+
+    // View the database log help page.
+    $this->drupalGet('admin/help/dblog');
+    $this->assertResponse($response);
+    if ($response == 200) {
+      $this->assertText(t('Database logging'), 'DBLog help was displayed');
+    }
+
+    // View the database log report page.
+    $this->drupalGet('admin/reports/dblog');
+    $this->assertResponse($response);
+    if ($response == 200) {
+      $this->assertText(t('Recent log messages'), 'DBLog report was displayed');
+    }
+
+    // View the database log page-not-found report page.
+    $this->drupalGet('admin/reports/page-not-found');
+    $this->assertResponse($response);
+    if ($response == 200) {
+      $this->assertText(t('Top ' . $quote . 'page not found' . $quote . ' errors'), 'DBLog page-not-found report was displayed');
+    }
+
+    // View the database log access-denied report page.
+    $this->drupalGet('admin/reports/access-denied');
+    $this->assertResponse($response);
+    if ($response == 200) {
+      $this->assertText(t('Top ' . $quote . 'access denied' . $quote . ' errors'), 'DBLog access-denied report was displayed');
+    }
+
+    // View the database log event page.
+    $this->drupalGet('admin/reports/event/1');
+    $this->assertResponse($response);
+    if ($response == 200) {
+      $this->assertText(t('Details'), 'DBLog event node was displayed');
+    }
+  }
+
+  /**
+   * Generates and then verifies various types of events.
+   */
+  private function verifyEvents() {
+    // Invoke events.
+    $this->doUser();
+    $this->doNode('article');
+    $this->doNode('blog');
+    $this->doNode('page');
+    $this->doNode('poll');
+
+    // When a user account is canceled, any content they created remains but the
+    // uid = 0. Their blog entry shows as "'s blog" on the home page. Records
+    // in the watchdog table related to that user have the uid set to zero.
+  }
+
+  /**
+   * Generates and then verifies some user events.
+   */
+  private function doUser() {
+    // Set user variables.
+    $name = $this->randomName();
+    $pass = user_password();
+    // Add a user using the form to generate an add user event (which is not
+    // triggered by drupalCreateUser).
+    $edit = array();
+    $edit['name'] = $name;
+    $edit['mail'] = $name . '@example.com';
+    $edit['pass[pass1]'] = $pass;
+    $edit['pass[pass2]'] = $pass;
+    $edit['status'] = 1;
+    $this->drupalPost('admin/people/create', $edit, t('Create new account'));
+    $this->assertResponse(200);
+    // Retrieve the user object.
+    $user = user_load_by_name($name);
+    $this->assertTrue($user != NULL, format_string('User @name was loaded', array('@name' => $name)));
+    // pass_raw property is needed by drupalLogin.
+    $user->pass_raw = $pass;
+    // Login user.
+    $this->drupalLogin($user);
+    // Logout user.
+    $this->drupalLogout();
+    // Fetch the row IDs in watchdog that relate to the user.
+    $result = db_query('SELECT wid FROM {watchdog} WHERE uid = :uid', array(':uid' => $user->uid));
+    foreach ($result as $row) {
+      $ids[] = $row->wid;
+    }
+    $count_before = (isset($ids)) ? count($ids) : 0;
+    $this->assertTrue($count_before > 0, format_string('DBLog contains @count records for @name', array('@count' => $count_before, '@name' => $user->name)));
+
+    // Login the admin user.
+    $this->drupalLogin($this->big_user);
+    // Delete the user created at the start of this test.
+    // We need to POST here to invoke batch_process() in the internal browser.
+    $this->drupalPost('user/' . $user->uid . '/cancel', array('user_cancel_method' => 'user_cancel_reassign'), t('Cancel account'));
+
+    // View the database log report.
+    $this->drupalGet('admin/reports/dblog');
+    $this->assertResponse(200);
+
+    // Verify that the expected events were recorded.
+    // Add user.
+    // Default display includes name and email address; if too long, the email
+    // address is replaced by three periods.
+    $this->assertLogMessage(t('New user: %name (%email).', array('%name' => $name, '%email' => $user->mail)), 'DBLog event was recorded: [add user]');
+    // Login user.
+    $this->assertLogMessage(t('Session opened for %name.', array('%name' => $name)), 'DBLog event was recorded: [login user]');
+    // Logout user.
+    $this->assertLogMessage(t('Session closed for %name.', array('%name' => $name)), 'DBLog event was recorded: [logout user]');
+    // Delete user.
+    $message = t('Deleted user: %name %email.', array('%name' => $name, '%email' => '<' . $user->mail . '>'));
+    $message_text = truncate_utf8(filter_xss($message, array()), 56, TRUE, TRUE);
+    // Verify that the full message displays on the details page.
+    $link = FALSE;
+    if ($links = $this->xpath('//a[text()="' . html_entity_decode($message_text) . '"]')) {
+      // Found link with the message text.
+      $links = array_shift($links);
+      foreach ($links->attributes() as $attr => $value) {
+        if ($attr == 'href') {
+          // Extract link to details page.
+          $link = drupal_substr($value, strpos($value, 'admin/reports/event/'));
+          $this->drupalGet($link);
+          // Check for full message text on the details page.
+          $this->assertRaw($message, 'DBLog event details was found: [delete user]');
+          break;
+        }
+      }
+    }
+    $this->assertTrue($link, 'DBLog event was recorded: [delete user]');
+    // Visit random URL (to generate page not found event).
+    $not_found_url = $this->randomName(60);
+    $this->drupalGet($not_found_url);
+    $this->assertResponse(404);
+    // View the database log page-not-found report page.
+    $this->drupalGet('admin/reports/page-not-found');
+    $this->assertResponse(200);
+    // Check that full-length URL displayed.
+    $this->assertText($not_found_url, 'DBLog event was recorded: [page not found]');
+  }
+
+  /**
+   * Generates and then verifies some node events.
+   *
+   * @param string $type
+   *   A node type (e.g., 'article', 'page' or 'poll').
+   */
+  private function doNode($type) {
+    // Create user.
+    $perm = array('create ' . $type . ' content', 'edit own ' . $type . ' content', 'delete own ' . $type . ' content');
+    $user = $this->drupalCreateUser($perm);
+    // Login user.
+    $this->drupalLogin($user);
+
+    // Create a node using the form in order to generate an add content event
+    // (which is not triggered by drupalCreateNode).
+    $edit = $this->getContent($type);
+    $langcode = LANGUAGE_NONE;
+    $title = $edit["title"];
+    $this->drupalPost('node/add/' . $type, $edit, t('Save'));
+    $this->assertResponse(200);
+    // Retrieve the node object.
+    $node = $this->drupalGetNodeByTitle($title);
+    $this->assertTrue($node != NULL, format_string('Node @title was loaded', array('@title' => $title)));
+    // Edit the node.
+    $edit = $this->getContentUpdate($type);
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->assertResponse(200);
+    // Delete the node.
+    $this->drupalPost('node/' . $node->nid . '/delete', array(), t('Delete'));
+    $this->assertResponse(200);
+    // View the node (to generate page not found event).
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertResponse(404);
+    // View the database log report (to generate access denied event).
+    $this->drupalGet('admin/reports/dblog');
+    $this->assertResponse(403);
+
+    // Login the admin user.
+    $this->drupalLogin($this->big_user);
+    // View the database log report.
+    $this->drupalGet('admin/reports/dblog');
+    $this->assertResponse(200);
+
+    // Verify that node events were recorded.
+    // Was node content added?
+    $this->assertLogMessage(t('@type: added %title.', array('@type' => $type, '%title' => $title)), 'DBLog event was recorded: [content added]');
+    // Was node content updated?
+    $this->assertLogMessage(t('@type: updated %title.', array('@type' => $type, '%title' => $title)), 'DBLog event was recorded: [content updated]');
+    // Was node content deleted?
+    $this->assertLogMessage(t('@type: deleted %title.', array('@type' => $type, '%title' => $title)), 'DBLog event was recorded: [content deleted]');
+
+    // View the database log access-denied report page.
+    $this->drupalGet('admin/reports/access-denied');
+    $this->assertResponse(200);
+    // Verify that the 'access denied' event was recorded.
+    $this->assertText(t('admin/reports/dblog'), 'DBLog event was recorded: [access denied]');
+
+    // View the database log page-not-found report page.
+    $this->drupalGet('admin/reports/page-not-found');
+    $this->assertResponse(200);
+    // Verify that the 'page not found' event was recorded.
+    $this->assertText(t('node/@nid', array('@nid' => $node->nid)), 'DBLog event was recorded: [page not found]');
+  }
+
+  /**
+   * Creates random content based on node content type.
+   *
+   * @param string $type
+   *   Node content type (e.g., 'article').
+   *
+   * @return array
+   *   Random content needed by various node types.
+   */
+  private function getContent($type) {
+    $langcode = LANGUAGE_NONE;
+    switch ($type) {
+      case 'poll':
+        $content = array(
+          "title" => $this->randomName(8),
+          'choice[new:0][chtext]' => $this->randomName(32),
+          'choice[new:1][chtext]' => $this->randomName(32),
+        );
+      break;
+
+      default:
+        $content = array(
+          "title" => $this->randomName(8),
+          "body[$langcode][0][value]" => $this->randomName(32),
+        );
+      break;
+    }
+    return $content;
+  }
+
+  /**
+   * Creates random content as an update based on node content type.
+   *
+   * @param string $type
+   *   Node content type (e.g., 'article').
+   *
+   * @return array
+   *   Random content needed by various node types.
+   */
+  private function getContentUpdate($type) {
+    switch ($type) {
+      case 'poll':
+        $content = array(
+          'choice[chid:1][chtext]' => $this->randomName(32),
+          'choice[chid:2][chtext]' => $this->randomName(32),
+        );
+      break;
+
+      default:
+        $langcode = LANGUAGE_NONE;
+        $content = array(
+          "body[$langcode][0][value]" => $this->randomName(32),
+        );
+      break;
+    }
+    return $content;
+  }
+
+  /**
+   * Tests the addition and clearing of log events through the admin interface.
+   *
+   * Logs in the admin user, creates a database log event, and tests the
+   * functionality of clearing the database log through the admin interface.
+   */
+  protected function testDBLogAddAndClear() {
+    global $base_root;
+    // Get a count of how many watchdog entries already exist.
+    $count = db_query('SELECT COUNT(*) FROM {watchdog}')->fetchField();
+    $log = array(
+      'type'        => 'custom',
+      'message'     => 'Log entry added to test the doClearTest clear down.',
+      'variables'   => array(),
+      'severity'    => WATCHDOG_NOTICE,
+      'link'        => NULL,
+      'user'        => $this->big_user,
+      'uid'         => isset($this->big_user->uid) ? $this->big_user->uid : 0,
+      'request_uri' => $base_root . request_uri(),
+      'referer'     => $_SERVER['HTTP_REFERER'],
+      'ip'          => ip_address(),
+      'timestamp'   => REQUEST_TIME,
+    );
+    // Add a watchdog entry.
+    dblog_watchdog($log);
+    // Make sure the table count has actually been incremented.
+    $this->assertEqual($count + 1, db_query('SELECT COUNT(*) FROM {watchdog}')->fetchField(), format_string('dblog_watchdog() added an entry to the dblog :count', array(':count' => $count)));
+    // Login the admin user.
+    $this->drupalLogin($this->big_user);
+    // Post in order to clear the database table.
+    $this->drupalPost('admin/reports/dblog', array(), t('Clear log messages'));
+    // Count the rows in watchdog that previously related to the deleted user.
+    $count = db_query('SELECT COUNT(*) FROM {watchdog}')->fetchField();
+    $this->assertEqual($count, 0, format_string('DBLog contains :count records after a clear.', array(':count' => $count)));
+  }
+
+  /**
+   * Tests the database log filter functionality at admin/reports/dblog.
+   */
+  protected function testFilter() {
+    $this->drupalLogin($this->big_user);
+
+    // Clear the log to ensure that only generated entries will be found.
+    db_delete('watchdog')->execute();
+
+    // Generate 9 random watchdog entries.
+    $type_names = array();
+    $types = array();
+    for ($i = 0; $i < 3; $i++) {
+      $type_names[] = $type_name = $this->randomName();
+      $severity = WATCHDOG_EMERGENCY;
+      for ($j = 0; $j < 3; $j++) {
+        $types[] = $type = array(
+          'count' => $j + 1,
+          'type' => $type_name,
+          'severity' => $severity++,
+        );
+        $this->generateLogEntries($type['count'], $type['type'], $type['severity']);
+      }
+    }
+
+    // View the database log page.
+    $this->drupalGet('admin/reports/dblog');
+
+    // Confirm that all the entries are displayed.
+    $count = $this->getTypeCount($types);
+    foreach ($types as $key => $type) {
+      $this->assertEqual($count[$key], $type['count'], 'Count matched');
+    }
+
+    // Filter by each type and confirm that entries with various severities are
+    // displayed.
+    foreach ($type_names as $type_name) {
+      $edit = array(
+        'type[]' => array($type_name),
+      );
+      $this->drupalPost(NULL, $edit, t('Filter'));
+
+      // Count the number of entries of this type.
+      $type_count = 0;
+      foreach ($types as $type) {
+        if ($type['type'] == $type_name) {
+          $type_count += $type['count'];
+        }
+      }
+
+      $count = $this->getTypeCount($types);
+      $this->assertEqual(array_sum($count), $type_count, 'Count matched');
+    }
+
+    // Set the filter to match each of the two filter-type attributes and
+    // confirm the correct number of entries are displayed.
+    foreach ($types as $key => $type) {
+      $edit = array(
+        'type[]' => array($type['type']),
+        'severity[]' => array($type['severity']),
+      );
+      $this->drupalPost(NULL, $edit, t('Filter'));
+
+      $count = $this->getTypeCount($types);
+      $this->assertEqual(array_sum($count), $type['count'], 'Count matched');
+    }
+
+    // Clear all logs and make sure the confirmation message is found.
+    $this->drupalPost('admin/reports/dblog', array(), t('Clear log messages'));
+    $this->assertText(t('Database log cleared.'), 'Confirmation message found');
+  }
+
+  /**
+   * Gets the database log event information from the browser page.
+   *
+   * @return array
+   *   List of log events where each event is an array with following keys:
+   *   - severity: (int) A database log severity constant.
+   *   - type: (string) The type of database log event.
+   *   - message: (string) The message for this database log event.
+   *   - user: (string) The user associated with this database log event.
+   */
+  protected function getLogEntries() {
+    $entries = array();
+    if ($table = $this->xpath('.//table[@id="admin-dblog"]')) {
+      $table = array_shift($table);
+      foreach ($table->tbody->tr as $row) {
+        $entries[] = array(
+          'severity' => $this->getSeverityConstant($row['class']),
+          'type' => $this->asText($row->td[1]),
+          'message' => $this->asText($row->td[3]),
+          'user' => $this->asText($row->td[4]),
+        );
+      }
+    }
+    return $entries;
+  }
+
+  /**
+   * Gets the count of database log entries by database log event type.
+   *
+   * @param array $types
+   *   The type information to compare against.
+   *
+   * @return array
+   *   The count of each type keyed by the key of the $types array.
+   */
+  protected function getTypeCount(array $types) {
+    $entries = $this->getLogEntries();
+    $count = array_fill(0, count($types), 0);
+    foreach ($entries as $entry) {
+      foreach ($types as $key => $type) {
+        if ($entry['type'] == $type['type'] && $entry['severity'] == $type['severity']) {
+          $count[$key]++;
+          break;
+        }
+      }
+    }
+    return $count;
+  }
+
+  /**
+   * Gets the watchdog severity constant corresponding to the CSS class.
+   *
+   * @param string $class
+   *   CSS class attribute.
+   *
+   * @return int|null
+   *   The watchdog severity constant or NULL if not found.
+   *
+   * @ingroup logging_severity_levels
+   */
+  protected function getSeverityConstant($class) {
+    // Reversed array from dblog_overview().
+    $map = array(
+      'dblog-debug' => WATCHDOG_DEBUG,
+      'dblog-info' => WATCHDOG_INFO,
+      'dblog-notice' => WATCHDOG_NOTICE,
+      'dblog-warning' => WATCHDOG_WARNING,
+      'dblog-error' => WATCHDOG_ERROR,
+      'dblog-critical' => WATCHDOG_CRITICAL,
+      'dblog-alert' => WATCHDOG_ALERT,
+      'dblog-emerg' => WATCHDOG_EMERGENCY,
+    );
+
+    // Find the class that contains the severity.
+    $classes = explode(' ', $class);
+    foreach ($classes as $class) {
+      if (isset($map[$class])) {
+        return $map[$class];
+      }
+    }
+    return NULL;
+  }
+
+  /**
+   * Extracts the text contained by the XHTML element.
+   *
+   * @param SimpleXMLElement $element
+   *   Element to extract text from.
+   *
+   * @return string
+   *   Extracted text.
+   */
+  protected function asText(SimpleXMLElement $element) {
+    if (!is_object($element)) {
+      return $this->fail('The element is not an element.');
+    }
+    return trim(html_entity_decode(strip_tags($element->asXML())));
+  }
+
+  /**
+   * Confirms that a log message appears on the database log overview screen.
+   *
+   * This function should only be used for the admin/reports/dblog page, because
+   * it checks for the message link text truncated to 56 characters. Other log
+   * pages have no detail links so they contain the full message text.
+   *
+   * @param string $log_message
+   *   The database log message to check.
+   * @param string $message
+   *   The message to pass to simpletest.
+   */
+  protected function assertLogMessage($log_message, $message) {
+    $message_text = truncate_utf8(filter_xss($log_message, array()), 56, TRUE, TRUE);
+    // After filter_xss(), HTML entities should be converted to their character
+    // equivalents because assertLink() uses this string in xpath() to query the
+    // Document Object Model (DOM).
+    $this->assertLink(html_entity_decode($message_text), 0, $message);
+  }
+}
+
diff --git a/htmltest/modules/field/field.api.php b/htmltest/modules/field/field.api.php
new file mode 100644
index 00000000..b0fc6a48
--- /dev/null
+++ b/htmltest/modules/field/field.api.php
@@ -0,0 +1,2698 @@
+<?php
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Exposes "pseudo-field" components on fieldable entities.
+ *
+ * Field UI's "Manage fields" and "Manage display" pages let users re-order
+ * fields, but also non-field components. For nodes, these include the title,
+ * poll choices, and other elements exposed by modules through hook_form() or
+ * hook_form_alter().
+ *
+ * Fieldable entities or modules that want to have their components supported
+ * should expose them using this hook. The user-defined settings (weight,
+ * visible) are automatically applied on rendered forms and displayed
+ * entities in a #pre_render callback added by field_attach_form() and
+ * field_attach_view().
+ *
+ * @see _field_extra_fields_pre_render()
+ * @see hook_field_extra_fields_alter()
+ *
+ * @return
+ *   A nested array of 'pseudo-field' elements. Each list is nested within the
+ *   following keys: entity type, bundle name, context (either 'form' or
+ *   'display'). The keys are the name of the elements as appearing in the
+ *   renderable array (either the entity form or the displayed entity). The
+ *   value is an associative array:
+ *   - label: The human readable name of the element.
+ *   - description: A short description of the element contents.
+ *   - weight: The default weight of the element.
+ *   - edit: (optional) String containing markup (normally a link) used as the
+ *     element's 'edit' operation in the administration interface. Only for
+ *     'form' context.
+ *   - delete: (optional) String containing markup (normally a link) used as the
+ *     element's 'delete' operation in the administration interface. Only for
+ *     'form' context.
+ */
+function hook_field_extra_fields() {
+  $extra['node']['poll'] = array(
+    'form' => array(
+      'choice_wrapper' => array(
+        'label' => t('Poll choices'),
+        'description' => t('Poll choices'),
+        'weight' => -4,
+      ),
+      'settings' => array(
+        'label' => t('Poll settings'),
+        'description' => t('Poll module settings'),
+        'weight' => -3,
+      ),
+    ),
+    'display' => array(
+      'poll_view_voting' => array(
+        'label' => t('Poll vote'),
+        'description' => t('Poll vote'),
+        'weight' => 0,
+      ),
+      'poll_view_results' => array(
+        'label' => t('Poll results'),
+        'description' => t('Poll results'),
+        'weight' => 0,
+      ),
+    )
+  );
+
+  return $extra;
+}
+
+/**
+ * Alter "pseudo-field" components on fieldable entities.
+ *
+ * @param $info
+ *   The associative array of 'pseudo-field' components.
+ *
+ * @see hook_field_extra_fields()
+ */
+function hook_field_extra_fields_alter(&$info) {
+  // Force node title to always be at the top of the list by default.
+  foreach (node_type_get_types() as $bundle) {
+    if (isset($info['node'][$bundle->type]['form']['title'])) {
+      $info['node'][$bundle->type]['form']['title']['weight'] = -20;
+    }
+  }
+}
+
+/**
+ * @defgroup field_types Field Types API
+ * @{
+ * Define field types.
+ *
+ * In the Field API, each field has a type, which determines what kind of data
+ * (integer, string, date, etc.) the field can hold, which settings it provides,
+ * and so on. The data type(s) accepted by a field are defined in
+ * hook_field_schema(); other basic properties of a field are defined in
+ * hook_field_info(). The other hooks below are called by the Field Attach API
+ * to perform field-type-specific actions.
+ *
+ * The Field Types API also defines two kinds of pluggable handlers: widgets
+ * and formatters. @link field_widget Widgets @endlink specify how the field
+ * appears in edit forms, while @link field_formatter formatters @endlink
+ * specify how the field appears in displayed entities.
+ *
+ * A third kind of pluggable handlers, storage backends, is defined by the
+ * @link field_storage Field Storage API @endlink.
+ *
+ * See @link field Field API @endlink for information about the other parts of
+ * the Field API.
+ */
+
+/**
+ * Define Field API field types.
+ *
+ * Along with this hook, you also need to implement other hooks. See
+ * @link field_types Field Types API @endlink for more information.
+ *
+ * @return
+ *   An array whose keys are field type names and whose values are arrays
+ *   describing the field type, with the following key/value pairs:
+ *   - label: The human-readable name of the field type.
+ *   - description: A short description for the field type.
+ *   - settings: An array whose keys are the names of the settings available
+ *     for the field type, and whose values are the default values for those
+ *     settings.
+ *   - instance_settings: An array whose keys are the names of the settings
+ *     available for instances of the field type, and whose values are the
+ *     default values for those settings. Instance-level settings can have
+ *     different values on each field instance, and thus allow greater
+ *     flexibility than field-level settings. It is recommended to put settings
+ *     at the instance level whenever possible. Notable exceptions: settings
+ *     acting on the schema definition, or settings that Views needs to use
+ *     across field instances (for example, the list of allowed values).
+ *   - default_widget: The machine name of the default widget to be used by
+ *     instances of this field type, when no widget is specified in the
+ *     instance definition. This widget must be available whenever the field
+ *     type is available (i.e. provided by the field type module, or by a module
+ *     the field type module depends on).
+ *   - default_formatter: The machine name of the default formatter to be used
+ *     by instances of this field type, when no formatter is specified in the
+ *     instance definition. This formatter must be available whenever the field
+ *     type is available (i.e. provided by the field type module, or by a module
+ *     the field type module depends on).
+ *   - no_ui: (optional) A boolean specifying that users should not be allowed
+ *     to create fields and instances of this field type through the UI. Such
+ *     fields can only be created programmatically with field_create_field()
+ *     and field_create_instance(). Defaults to FALSE.
+ *
+ * @see hook_field_info_alter()
+ */
+function hook_field_info() {
+  return array(
+    'text' => array(
+      'label' => t('Text'),
+      'description' => t('This field stores varchar text in the database.'),
+      'settings' => array('max_length' => 255),
+      'instance_settings' => array('text_processing' => 0),
+      'default_widget' => 'text_textfield',
+      'default_formatter' => 'text_default',
+    ),
+    'text_long' => array(
+      'label' => t('Long text'),
+      'description' => t('This field stores long text in the database.'),
+      'settings' => array('max_length' => ''),
+      'instance_settings' => array('text_processing' => 0),
+      'default_widget' => 'text_textarea',
+      'default_formatter' => 'text_default',
+    ),
+    'text_with_summary' => array(
+      'label' => t('Long text and summary'),
+      'description' => t('This field stores long text in the database along with optional summary text.'),
+      'settings' => array('max_length' => ''),
+      'instance_settings' => array('text_processing' => 1, 'display_summary' => 0),
+      'default_widget' => 'text_textarea_with_summary',
+      'default_formatter' => 'text_summary_or_trimmed',
+    ),
+  );
+}
+
+/**
+ * Perform alterations on Field API field types.
+ *
+ * @param $info
+ *   Array of information on field types exposed by hook_field_info()
+ *   implementations.
+ */
+function hook_field_info_alter(&$info) {
+  // Add a setting to all field types.
+  foreach ($info as $field_type => $field_type_info) {
+    $info[$field_type]['settings'] += array(
+      'mymodule_additional_setting' => 'default value',
+    );
+  }
+
+  // Change the default widget for fields of type 'foo'.
+  if (isset($info['foo'])) {
+    $info['foo']['default widget'] = 'mymodule_widget';
+  }
+}
+
+/**
+ * Define the Field API schema for a field structure.
+ *
+ * This is invoked when a field is created, in order to obtain the database
+ * schema from the module that defines the field's type.
+ *
+ * This hook must be defined in the module's .install file for it to be detected
+ * during installation and upgrade.
+ *
+ * @param $field
+ *   A field structure.
+ *
+ * @return
+ *   An associative array with the following keys:
+ *   - columns: An array of Schema API column specifications, keyed by column
+ *     name. This specifies what comprises a value for a given field. For
+ *     example, a value for a number field is simply 'value', while a value for
+ *     a formatted text field is the combination of 'value' and 'format'. It is
+ *     recommended to avoid having the column definitions depend on field
+ *     settings when possible. No assumptions should be made on how storage
+ *     engines internally use the original column name to structure their
+ *     storage.
+ *   - indexes: (optional) An array of Schema API indexes definitions. Only
+ *     columns that appear in the 'columns' array are allowed. Those indexes
+ *     will be used as default indexes. Callers of field_create_field() can
+ *     specify additional indexes, or, at their own risk, modify the default
+ *     indexes specified by the field-type module. Some storage engines might
+ *     not support indexes.
+ *   - foreign keys: (optional) An array of Schema API foreign keys
+ *     definitions.
+ */
+function hook_field_schema($field) {
+  if ($field['type'] == 'text_long') {
+    $columns = array(
+      'value' => array(
+        'type' => 'text',
+        'size' => 'big',
+        'not null' => FALSE,
+      ),
+    );
+  }
+  else {
+    $columns = array(
+      'value' => array(
+        'type' => 'varchar',
+        'length' => $field['settings']['max_length'],
+        'not null' => FALSE,
+      ),
+    );
+  }
+  $columns += array(
+    'format' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => FALSE,
+    ),
+  );
+  return array(
+    'columns' => $columns,
+    'indexes' => array(
+      'format' => array('format'),
+    ),
+    'foreign keys' => array(
+      'format' => array(
+        'table' => 'filter_format',
+        'columns' => array('format' => 'format'),
+      ),
+    ),
+  );
+}
+
+/**
+ * Define custom load behavior for this module's field types.
+ *
+ * Unlike most other field hooks, this hook operates on multiple entities. The
+ * $entities, $instances and $items parameters are arrays keyed by entity ID.
+ * For performance reasons, information for all available entity should be
+ * loaded in a single query where possible.
+ *
+ * Note that the changes made to the field values get cached by the field cache
+ * for subsequent loads. You should never use this hook to load fieldable
+ * entities, since this is likely to cause infinite recursions when
+ * hook_field_load() is run on those as well. Use
+ * hook_field_formatter_prepare_view() instead.
+ *
+ * Make changes or additions to field values by altering the $items parameter by
+ * reference. There is no return value.
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entities
+ *   Array of entities being loaded, keyed by entity ID.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instances
+ *   Array of instance structures for $field for each entity, keyed by entity
+ *   ID.
+ * @param $langcode
+ *   The language code associated with $items.
+ * @param $items
+ *   Array of field values already loaded for the entities, keyed by entity ID.
+ *   Store your changes in this parameter (passed by reference).
+ * @param $age
+ *   FIELD_LOAD_CURRENT to load the most recent revision for all fields, or
+ *   FIELD_LOAD_REVISION to load the version indicated by each entity.
+ */
+function hook_field_load($entity_type, $entities, $field, $instances, $langcode, &$items, $age) {
+  // Sample code from text.module: precompute sanitized strings so they are
+  // stored in the field cache.
+  foreach ($entities as $id => $entity) {
+    foreach ($items[$id] as $delta => $item) {
+      // Only process items with a cacheable format, the rest will be handled
+      // by formatters if needed.
+      if (empty($instances[$id]['settings']['text_processing']) || filter_format_allowcache($item['format'])) {
+        $items[$id][$delta]['safe_value'] = isset($item['value']) ? _text_sanitize($instances[$id], $langcode, $item, 'value') : '';
+        if ($field['type'] == 'text_with_summary') {
+          $items[$id][$delta]['safe_summary'] = isset($item['summary']) ? _text_sanitize($instances[$id], $langcode, $item, 'summary') : '';
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Prepare field values prior to display.
+ *
+ * This hook is invoked before the field values are handed to formatters
+ * for display, and runs before the formatters' own
+ * hook_field_formatter_prepare_view().
+ *
+ * Unlike most other field hooks, this hook operates on multiple entities. The
+ * $entities, $instances and $items parameters are arrays keyed by entity ID.
+ * For performance reasons, information for all available entities should be
+ * loaded in a single query where possible.
+ *
+ * Make changes or additions to field values by altering the $items parameter by
+ * reference. There is no return value.
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entities
+ *   Array of entities being displayed, keyed by entity ID.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instances
+ *   Array of instance structures for $field for each entity, keyed by entity
+ *   ID.
+ * @param $langcode
+ *   The language associated to $items.
+ * @param $items
+ *   $entity->{$field['field_name']}, or an empty array if unset.
+ */
+function hook_field_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items) {
+  // Sample code from image.module: if there are no images specified at all,
+  // use the default image.
+  foreach ($entities as $id => $entity) {
+    if (empty($items[$id]) && $field['settings']['default_image']) {
+      if ($file = file_load($field['settings']['default_image'])) {
+        $items[$id][0] = (array) $file + array(
+          'is_default' => TRUE,
+          'alt' => '',
+          'title' => '',
+        );
+      }
+    }
+  }
+}
+
+/**
+ * Validate this module's field data.
+ *
+ * If there are validation problems, add to the $errors array (passed by
+ * reference). There is no return value.
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entity
+ *   The entity for the operation.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instance
+ *   The instance structure for $field on $entity's bundle.
+ * @param $langcode
+ *   The language associated with $items.
+ * @param $items
+ *   $entity->{$field['field_name']}[$langcode], or an empty array if unset.
+ * @param $errors
+ *   The array of errors (keyed by field name, language code, and delta) that
+ *   have already been reported for the entity. The function should add its
+ *   errors to this array. Each error is an associative array with the following
+ *   keys and values:
+ *   - error: An error code (should be a string prefixed with the module name).
+ *   - message: The human readable message to be displayed.
+ */
+function hook_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
+  foreach ($items as $delta => $item) {
+    if (!empty($item['value'])) {
+      if (!empty($field['settings']['max_length']) && drupal_strlen($item['value']) > $field['settings']['max_length']) {
+        $errors[$field['field_name']][$langcode][$delta][] = array(
+          'error' => 'text_max_length',
+          'message' => t('%name: the value may not be longer than %max characters.', array('%name' => $instance['label'], '%max' => $field['settings']['max_length'])),
+        );
+      }
+    }
+  }
+}
+
+/**
+ * Define custom presave behavior for this module's field types.
+ *
+ * Make changes or additions to field values by altering the $items parameter by
+ * reference. There is no return value.
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entity
+ *   The entity for the operation.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instance
+ *   The instance structure for $field on $entity's bundle.
+ * @param $langcode
+ *   The language associated with $items.
+ * @param $items
+ *   $entity->{$field['field_name']}[$langcode], or an empty array if unset.
+ */
+function hook_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  if ($field['type'] == 'number_decimal') {
+    // Let PHP round the value to ensure consistent behavior across storage
+    // backends.
+    foreach ($items as $delta => $item) {
+      if (isset($item['value'])) {
+        $items[$delta]['value'] = round($item['value'], $field['settings']['scale']);
+      }
+    }
+  }
+}
+
+/**
+ * Define custom insert behavior for this module's field data.
+ *
+ * This hook is invoked from field_attach_insert() on the module that defines a
+ * field, during the process of inserting an entity object (node, taxonomy term,
+ * etc.). It is invoked just before the data for this field on the particular
+ * entity object is inserted into field storage. Only field modules that are
+ * storing or tracking information outside the standard field storage mechanism
+ * need to implement this hook.
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entity
+ *   The entity for the operation.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instance
+ *   The instance structure for $field on $entity's bundle.
+ * @param $langcode
+ *   The language associated with $items.
+ * @param $items
+ *   $entity->{$field['field_name']}[$langcode], or an empty array if unset.
+ *
+ * @see hook_field_update()
+ * @see hook_field_delete()
+ */
+function hook_field_insert($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  if (variable_get('taxonomy_maintain_index_table', TRUE) && $field['storage']['type'] == 'field_sql_storage' && $entity_type == 'node' && $entity->status) {
+    $query = db_insert('taxonomy_index')->fields(array('nid', 'tid', 'sticky', 'created', ));
+    foreach ($items as $item) {
+      $query->values(array(
+        'nid' => $entity->nid,
+        'tid' => $item['tid'],
+        'sticky' => $entity->sticky,
+        'created' => $entity->created,
+      ));
+    }
+    $query->execute();
+  }
+}
+
+/**
+ * Define custom update behavior for this module's field data.
+ *
+ * This hook is invoked from field_attach_update() on the module that defines a
+ * field, during the process of updating an entity object (node, taxonomy term,
+ * etc.). It is invoked just before the data for this field on the particular
+ * entity object is updated into field storage. Only field modules that are
+ * storing or tracking information outside the standard field storage mechanism
+ * need to implement this hook.
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entity
+ *   The entity for the operation.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instance
+ *   The instance structure for $field on $entity's bundle.
+ * @param $langcode
+ *   The language associated with $items.
+ * @param $items
+ *   $entity->{$field['field_name']}[$langcode], or an empty array if unset.
+ *
+ * @see hook_field_insert()
+ * @see hook_field_delete()
+ */
+function hook_field_update($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  if (variable_get('taxonomy_maintain_index_table', TRUE) && $field['storage']['type'] == 'field_sql_storage' && $entity_type == 'node') {
+    $first_call = &drupal_static(__FUNCTION__, array());
+
+    // We don't maintain data for old revisions, so clear all previous values
+    // from the table. Since this hook runs once per field, per object, make
+    // sure we only wipe values once.
+    if (!isset($first_call[$entity->nid])) {
+      $first_call[$entity->nid] = FALSE;
+      db_delete('taxonomy_index')->condition('nid', $entity->nid)->execute();
+    }
+    // Only save data to the table if the node is published.
+    if ($entity->status) {
+      $query = db_insert('taxonomy_index')->fields(array('nid', 'tid', 'sticky', 'created'));
+      foreach ($items as $item) {
+        $query->values(array(
+          'nid' => $entity->nid,
+          'tid' => $item['tid'],
+          'sticky' => $entity->sticky,
+          'created' => $entity->created,
+        ));
+      }
+      $query->execute();
+    }
+  }
+}
+
+/**
+ * Update the storage information for a field.
+ *
+ * This is invoked on the field's storage module from field_update_field(),
+ * before the new field information is saved to the database. The field storage
+ * module should update its storage tables to agree with the new field
+ * information. If there is a problem, the field storage module should throw an
+ * exception.
+ *
+ * @param $field
+ *   The updated field structure to be saved.
+ * @param $prior_field
+ *   The previously-saved field structure.
+ * @param $has_data
+ *   TRUE if the field has data in storage currently.
+ */
+function hook_field_storage_update_field($field, $prior_field, $has_data) {
+  if (!$has_data) {
+    // There is no data. Re-create the tables completely.
+    $prior_schema = _field_sql_storage_schema($prior_field);
+    foreach ($prior_schema as $name => $table) {
+      db_drop_table($name, $table);
+    }
+    $schema = _field_sql_storage_schema($field);
+    foreach ($schema as $name => $table) {
+      db_create_table($name, $table);
+    }
+  }
+  else {
+    // There is data. See field_sql_storage_field_storage_update_field() for
+    // an example of what to do to modify the schema in place, preserving the
+    // old data as much as possible.
+  }
+  drupal_get_schema(NULL, TRUE);
+}
+
+/**
+ * Define custom delete behavior for this module's field data.
+ *
+ * This hook is invoked from field_attach_delete() on the module that defines a
+ * field, during the process of deleting an entity object (node, taxonomy term,
+ * etc.). It is invoked just before the data for this field on the particular
+ * entity object is deleted from field storage. Only field modules that are
+ * storing or tracking information outside the standard field storage mechanism
+ * need to implement this hook.
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entity
+ *   The entity for the operation.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instance
+ *   The instance structure for $field on $entity's bundle.
+ * @param $langcode
+ *   The language associated with $items.
+ * @param $items
+ *   $entity->{$field['field_name']}[$langcode], or an empty array if unset.
+ *
+ * @see hook_field_insert()
+ * @see hook_field_update()
+ */
+function hook_field_delete($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+  foreach ($items as $delta => $item) {
+    // For hook_file_references(), remember that this is being deleted.
+    $item['file_field_name'] = $field['field_name'];
+    // Pass in the ID of the object that is being removed so all references can
+    // be counted in hook_file_references().
+    $item['file_field_type'] = $entity_type;
+    $item['file_field_id'] = $id;
+    file_field_delete_file($item, $field, $entity_type, $id);
+  }
+}
+
+/**
+ * Define custom revision delete behavior for this module's field types.
+ *
+ * This hook is invoked just before the data is deleted from field storage
+ * in field_attach_delete_revision(), and will only be called for fieldable
+ * types that are versioned.
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entity
+ *   The entity for the operation.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instance
+ *   The instance structure for $field on $entity's bundle.
+ * @param $langcode
+ *   The language associated with $items.
+ * @param $items
+ *   $entity->{$field['field_name']}[$langcode], or an empty array if unset.
+ */
+function hook_field_delete_revision($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+  foreach ($items as $delta => $item) {
+    // For hook_file_references, remember that this file is being deleted.
+    $item['file_field_name'] = $field['field_name'];
+    if (file_field_delete_file($item, $field, $entity_type, $id)) {
+      $items[$delta] = NULL;
+    }
+  }
+}
+
+/**
+ * Define custom prepare_translation behavior for this module's field types.
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entity
+ *   The entity for the operation.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instance
+ *   The instance structure for $field on $entity's bundle.
+ * @param $langcode
+ *   The language associated to $items.
+ * @param $items
+ *   $entity->{$field['field_name']}[$langcode], or an empty array if unset.
+ * @param $source_entity
+ *   The source entity from which field values are being copied.
+ * @param $source_langcode
+ *   The source language from which field values are being copied.
+ */
+function hook_field_prepare_translation($entity_type, $entity, $field, $instance, $langcode, &$items, $source_entity, $source_langcode) {
+  // If the translating user is not permitted to use the assigned text format,
+  // we must not expose the source values.
+  $field_name = $field['field_name'];
+  $formats = filter_formats();
+  $format_id = $source_entity->{$field_name}[$source_langcode][0]['format'];
+  if (!filter_access($formats[$format_id])) {
+    $items = array();
+  }
+}
+
+/**
+ * Define what constitutes an empty item for a field type.
+ *
+ * @param $item
+ *   An item that may or may not be empty.
+ * @param $field
+ *   The field to which $item belongs.
+ *
+ * @return
+ *   TRUE if $field's type considers $item not to contain any data;
+ *   FALSE otherwise.
+ */
+function hook_field_is_empty($item, $field) {
+  if (empty($item['value']) && (string) $item['value'] !== '0') {
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
+ * @} End of "defgroup field_types".
+ */
+
+/**
+ * @defgroup field_widget Field Widget API
+ * @{
+ * Define Field API widget types.
+ *
+ * Field API widgets specify how fields are displayed in edit forms. Fields of a
+ * given @link field_types field type @endlink may be edited using more than one
+ * widget. In this case, the Field UI module allows the site builder to choose
+ * which widget to use. Widget types are defined by implementing
+ * hook_field_widget_info().
+ *
+ * Widgets are @link forms_api_reference.html Form API @endlink elements with
+ * additional processing capabilities. Widget hooks are typically called by the
+ * Field Attach API during the creation of the field form structure with
+ * field_attach_form().
+ *
+ * @see field
+ * @see field_types
+ * @see field_formatter
+ */
+
+/**
+ * Expose Field API widget types.
+ *
+ * @return
+ *   An array describing the widget types implemented by the module.
+ *   The keys are widget type names. To avoid name clashes, widget type
+ *   names should be prefixed with the name of the module that exposes them.
+ *   The values are arrays describing the widget type, with the following
+ *   key/value pairs:
+ *   - label: The human-readable name of the widget type.
+ *   - description: A short description for the widget type.
+ *   - field types: An array of field types the widget supports.
+ *   - settings: An array whose keys are the names of the settings available
+ *     for the widget type, and whose values are the default values for those
+ *     settings.
+ *   - behaviors: (optional) An array describing behaviors of the widget, with
+ *     the following elements:
+ *     - multiple values: One of the following constants:
+ *       - FIELD_BEHAVIOR_DEFAULT: (default) If the widget allows the input of
+ *         one single field value (most common case). The widget will be
+ *         repeated for each value input.
+ *       - FIELD_BEHAVIOR_CUSTOM: If one single copy of the widget can receive
+ *         several field values. Examples: checkboxes, multiple select,
+ *         comma-separated textfield.
+ *     - default value: One of the following constants:
+ *       - FIELD_BEHAVIOR_DEFAULT: (default) If the widget accepts default
+ *         values.
+ *       - FIELD_BEHAVIOR_NONE: if the widget does not support default values.
+ *   - weight: (optional) An integer to determine the weight of this widget
+ *     relative to other widgets in the Field UI when selecting a widget for a
+ *     given field instance.
+ *
+ * @see hook_field_widget_info_alter()
+ * @see hook_field_widget_form()
+ * @see hook_field_widget_form_alter()
+ * @see hook_field_widget_WIDGET_TYPE_form_alter()
+ * @see hook_field_widget_error()
+ * @see hook_field_widget_settings_form()
+ */
+function hook_field_widget_info() {
+  return array(
+    'text_textfield' => array(
+      'label' => t('Text field'),
+      'field types' => array('text'),
+      'settings' => array('size' => 60),
+      'behaviors' => array(
+        'multiple values' => FIELD_BEHAVIOR_DEFAULT,
+        'default value' => FIELD_BEHAVIOR_DEFAULT,
+      ),
+    ),
+    'text_textarea' => array(
+      'label' => t('Text area (multiple rows)'),
+      'field types' => array('text_long'),
+      'settings' => array('rows' => 5),
+      'behaviors' => array(
+        'multiple values' => FIELD_BEHAVIOR_DEFAULT,
+        'default value' => FIELD_BEHAVIOR_DEFAULT,
+      ),
+    ),
+    'text_textarea_with_summary' => array(
+      'label' => t('Text area with a summary'),
+      'field types' => array('text_with_summary'),
+      'settings' => array('rows' => 20, 'summary_rows' => 5),
+      'behaviors' => array(
+        'multiple values' => FIELD_BEHAVIOR_DEFAULT,
+        'default value' => FIELD_BEHAVIOR_DEFAULT,
+      ),
+      // As an advanced widget, force it to sink to the bottom of the choices.
+      'weight' => 2,
+    ),
+  );
+}
+
+/**
+ * Perform alterations on Field API widget types.
+ *
+ * @param $info
+ *   Array of informations on widget types exposed by hook_field_widget_info()
+ *   implementations.
+ */
+function hook_field_widget_info_alter(&$info) {
+  // Add a setting to a widget type.
+  $info['text_textfield']['settings'] += array(
+    'mymodule_additional_setting' => 'default value',
+  );
+
+  // Let a new field type re-use an existing widget.
+  $info['options_select']['field types'][] = 'my_field_type';
+}
+
+/**
+ * Return the form for a single field widget.
+ *
+ * Field widget form elements should be based on the passed-in $element, which
+ * contains the base form element properties derived from the field
+ * configuration.
+ *
+ * Field API will set the weight, field name and delta values for each form
+ * element. If there are multiple values for this field, the Field API will
+ * invoke this hook as many times as needed.
+ *
+ * Note that, depending on the context in which the widget is being included
+ * (regular entity form, field configuration form, advanced search form...),
+ * the values for $field and $instance might be different from the "official"
+ * definitions returned by field_info_field() and field_info_instance().
+ * Examples: mono-value widget even if the field is multi-valued, non-required
+ * widget even if the field is 'required'...
+ *
+ * Therefore, the FAPI element callbacks (such as #process, #element_validate,
+ * #value_callback...) used by the widget cannot use the field_info_field()
+ * or field_info_instance() functions to retrieve the $field or $instance
+ * definitions they should operate on. The field_widget_field() and
+ * field_widget_instance() functions should be used instead to fetch the
+ * current working definitions from $form_state, where Field API stores them.
+ *
+ * Alternatively, hook_field_widget_form() can extract the needed specific
+ * properties from $field and $instance and set them as ad-hoc
+ * $element['#custom'] properties, for later use by its element callbacks.
+ *
+ * Other modules may alter the form element provided by this function using
+ * hook_field_widget_form_alter().
+ *
+ * @param $form
+ *   The form structure where widgets are being attached to. This might be a
+ *   full form structure, or a sub-element of a larger form.
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param $field
+ *   The field structure.
+ * @param $instance
+ *   The field instance.
+ * @param $langcode
+ *   The language associated with $items.
+ * @param $items
+ *   Array of default values for this field.
+ * @param $delta
+ *   The order of this item in the array of subelements (0, 1, 2, etc).
+ * @param $element
+ *   A form element array containing basic properties for the widget:
+ *   - #entity_type: The name of the entity the field is attached to.
+ *   - #bundle: The name of the field bundle the field is contained in.
+ *   - #field_name: The name of the field.
+ *   - #language: The language the field is being edited in.
+ *   - #field_parents: The 'parents' space for the field in the form. Most
+ *       widgets can simply overlook this property. This identifies the
+ *       location where the field values are placed within
+ *       $form_state['values'], and is used to access processing information
+ *       for the field through the field_form_get_state() and
+ *       field_form_set_state() functions.
+ *   - #columns: A list of field storage columns of the field.
+ *   - #title: The sanitized element label for the field instance, ready for
+ *     output.
+ *   - #description: The sanitized element description for the field instance,
+ *     ready for output.
+ *   - #required: A Boolean indicating whether the element value is required;
+ *     for required multiple value fields, only the first widget's values are
+ *     required.
+ *   - #delta: The order of this item in the array of subelements; see $delta
+ *     above.
+ *
+ * @return
+ *   The form elements for a single widget for this field.
+ *
+ * @see field_widget_field()
+ * @see field_widget_instance()
+ * @see hook_field_widget_form_alter()
+ * @see hook_field_widget_WIDGET_TYPE_form_alter()
+ */
+function hook_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  $element += array(
+    '#type' => $instance['widget']['type'],
+    '#default_value' => isset($items[$delta]) ? $items[$delta] : '',
+  );
+  return array('value' => $element);
+}
+
+/**
+ * Alter forms for field widgets provided by other modules.
+ *
+ * @param $element
+ *   The field widget form element as constructed by hook_field_widget_form().
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param $context
+ *   An associative array containing the following key-value pairs, matching the
+ *   arguments received by hook_field_widget_form():
+ *   - form: The form structure to which widgets are being attached. This may be
+ *     a full form structure, or a sub-element of a larger form.
+ *   - field: The field structure.
+ *   - instance: The field instance structure.
+ *   - langcode: The language associated with $items.
+ *   - items: Array of default values for this field.
+ *   - delta: The order of this item in the array of subelements (0, 1, 2, etc).
+ *
+ * @see hook_field_widget_form()
+ * @see hook_field_widget_WIDGET_TYPE_form_alter()
+ */
+function hook_field_widget_form_alter(&$element, &$form_state, $context) {
+  // Add a css class to widget form elements for all fields of type mytype.
+  if ($context['field']['type'] == 'mytype') {
+    // Be sure not to overwrite existing attributes.
+    $element['#attributes']['class'][] = 'myclass';
+  }
+}
+
+/**
+ * Alter widget forms for a specific widget provided by another module.
+ *
+ * Modules can implement hook_field_widget_WIDGET_TYPE_form_alter() to modify a
+ * specific widget form, rather than using hook_field_widget_form_alter() and
+ * checking the widget type.
+ *
+ * @param $element
+ *   The field widget form element as constructed by hook_field_widget_form().
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param $context
+ *   An associative array containing the following key-value pairs, matching the
+ *   arguments received by hook_field_widget_form():
+ *   - "form": The form structure where widgets are being attached to. This
+ *     might be a full form structure, or a sub-element of a larger form.
+ *   - "field": The field structure.
+ *   - "instance": The field instance structure.
+ *   - "langcode": The language associated with $items.
+ *   - "items": Array of default values for this field.
+ *   - "delta": The order of this item in the array of subelements (0, 1, 2,
+ *     etc).
+ *
+ * @see hook_field_widget_form()
+ * @see hook_field_widget_form_alter()
+ */
+function hook_field_widget_WIDGET_TYPE_form_alter(&$element, &$form_state, $context) {
+  // Code here will only act on widgets of type WIDGET_TYPE.  For example,
+  // hook_field_widget_mymodule_autocomplete_form_alter() will only act on
+  // widgets of type 'mymodule_autocomplete'.
+  $element['#autocomplete_path'] = 'mymodule/autocomplete_path';
+}
+
+/**
+ * Alters the widget properties of a field instance before it gets displayed.
+ *
+ * Note that instead of hook_field_widget_properties_alter(), which is called
+ * for all fields on all entity types,
+ * hook_field_widget_properties_ENTITY_TYPE_alter() may be used to alter widget
+ * properties for fields on a specific entity type only.
+ *
+ * This hook is called once per field per added or edit entity. If the result
+ * of the hook involves reading from the database, it is highly recommended to
+ * statically cache the information.
+ *
+ * @param $widget
+ *   The instance's widget properties.
+ * @param $context
+ *   An associative array containing:
+ *   - entity_type: The entity type; e.g., 'node' or 'user'.
+ *   - entity: The entity object.
+ *   - field: The field that the widget belongs to.
+ *   - instance: The instance of the field.
+ *
+ * @see hook_field_widget_properties_ENTITY_TYPE_alter()
+ */
+function hook_field_widget_properties_alter(&$widget, $context) {
+  // Change a widget's type according to the time of day.
+  $field = $context['field'];
+  if ($context['entity_type'] == 'node' && $field['field_name'] == 'field_foo') {
+    $time = date('H');
+    $widget['type'] = $time < 12 ? 'widget_am' : 'widget_pm';
+  }
+}
+
+/**
+ * Flag a field-level validation error.
+ *
+ * @param $element
+ *   An array containing the form element for the widget. The error needs to be
+ *   flagged on the right sub-element, according to the widget's internal
+ *   structure.
+ * @param $error
+ *   An associative array with the following key-value pairs, as returned by
+ *   hook_field_validate():
+ *   - error: the error code. Complex widgets might need to report different
+ *     errors to different form elements inside the widget.
+ *   - message: the human readable message to be displayed.
+ * @param $form
+ *   The form structure where field elements are attached to. This might be a
+ *   full form structure, or a sub-element of a larger form.
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ */
+function hook_field_widget_error($element, $error, $form, &$form_state) {
+  form_error($element, $error['message']);
+}
+
+
+/**
+ * @} End of "defgroup field_widget".
+ */
+
+
+/**
+ * @defgroup field_formatter Field Formatter API
+ * @{
+ * Define Field API formatter types.
+ *
+ * Field API formatters specify how fields are displayed when the entity to
+ * which the field is attached is displayed. Fields of a given
+ * @link field_types field type @endlink may be displayed using more than one
+ * formatter. In this case, the Field UI module allows the site builder to
+ * choose which formatter to use. Field formatters are defined by implementing
+ * hook_field_formatter_info().
+ *
+ * @see field
+ * @see field_types
+ * @see field_widget
+ */
+
+/**
+ * Expose Field API formatter types.
+ *
+ * Formatters handle the display of field values. Formatter hooks are typically
+ * called by the Field Attach API field_attach_prepare_view() and
+ * field_attach_view() functions.
+ *
+ * @return
+ *   An array describing the formatter types implemented by the module.
+ *   The keys are formatter type names. To avoid name clashes, formatter type
+ *   names should be prefixed with the name of the module that exposes them.
+ *   The values are arrays describing the formatter type, with the following
+ *   key/value pairs:
+ *   - label: The human-readable name of the formatter type.
+ *   - description: A short description for the formatter type.
+ *   - field types: An array of field types the formatter supports.
+ *   - settings: An array whose keys are the names of the settings available
+ *     for the formatter type, and whose values are the default values for
+ *     those settings.
+ *
+ * @see hook_field_formatter_info_alter()
+ * @see hook_field_formatter_view()
+ * @see hook_field_formatter_prepare_view()
+ */
+function hook_field_formatter_info() {
+  return array(
+    'text_default' => array(
+      'label' => t('Default'),
+      'field types' => array('text', 'text_long', 'text_with_summary'),
+    ),
+    'text_plain' => array(
+      'label' => t('Plain text'),
+      'field types' => array('text', 'text_long', 'text_with_summary'),
+    ),
+
+    // The text_trimmed formatter displays the trimmed version of the
+    // full element of the field. It is intended to be used with text
+    // and text_long fields. It also works with text_with_summary
+    // fields though the text_summary_or_trimmed formatter makes more
+    // sense for that field type.
+    'text_trimmed' => array(
+      'label' => t('Trimmed'),
+      'field types' => array('text', 'text_long', 'text_with_summary'),
+    ),
+
+    // The 'summary or trimmed' field formatter for text_with_summary
+    // fields displays returns the summary element of the field or, if
+    // the summary is empty, the trimmed version of the full element
+    // of the field.
+    'text_summary_or_trimmed' => array(
+      'label' => t('Summary or trimmed'),
+      'field types' => array('text_with_summary'),
+    ),
+  );
+}
+
+/**
+ * Perform alterations on Field API formatter types.
+ *
+ * @param $info
+ *   An array of information on formatter types exposed by
+ *   hook_field_formatter_info() implementations.
+ */
+function hook_field_formatter_info_alter(&$info) {
+  // Add a setting to a formatter type.
+  $info['text_default']['settings'] += array(
+    'mymodule_additional_setting' => 'default value',
+  );
+
+  // Let a new field type re-use an existing formatter.
+  $info['text_default']['field types'][] = 'my_field_type';
+}
+
+/**
+ * Allow formatters to load information for field values being displayed.
+ *
+ * This should be used when a formatter needs to load additional information
+ * from the database in order to render a field, for example a reference field
+ * which displays properties of the referenced entities such as name or type.
+ *
+ * This hook is called after the field type's own hook_field_prepare_view().
+ *
+ * Unlike most other field hooks, this hook operates on multiple entities. The
+ * $entities, $instances and $items parameters are arrays keyed by entity ID.
+ * For performance reasons, information for all available entities should be
+ * loaded in a single query where possible.
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entities
+ *   Array of entities being displayed, keyed by entity ID.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instances
+ *   Array of instance structures for $field for each entity, keyed by entity
+ *   ID.
+ * @param $langcode
+ *   The language the field values are to be shown in. If no language is
+ *   provided the current language is used.
+ * @param $items
+ *   Array of field values for the entities, keyed by entity ID.
+ * @param $displays
+ *   Array of display settings to use for each entity, keyed by entity ID.
+ *
+ * @return
+ *   Changes or additions to field values are done by altering the $items
+ *   parameter by reference.
+ */
+function hook_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays) {
+  $tids = array();
+
+  // Collect every possible term attached to any of the fieldable entities.
+  foreach ($entities as $id => $entity) {
+    foreach ($items[$id] as $delta => $item) {
+      // Force the array key to prevent duplicates.
+      $tids[$item['tid']] = $item['tid'];
+    }
+  }
+
+  if ($tids) {
+    $terms = taxonomy_term_load_multiple($tids);
+
+    // Iterate through the fieldable entities again to attach the loaded term
+    // data.
+    foreach ($entities as $id => $entity) {
+      $rekey = FALSE;
+
+      foreach ($items[$id] as $delta => $item) {
+        // Check whether the taxonomy term field instance value could be loaded.
+        if (isset($terms[$item['tid']])) {
+          // Replace the instance value with the term data.
+          $items[$id][$delta]['taxonomy_term'] = $terms[$item['tid']];
+        }
+        // Otherwise, unset the instance value, since the term does not exist.
+        else {
+          unset($items[$id][$delta]);
+          $rekey = TRUE;
+        }
+      }
+
+      if ($rekey) {
+        // Rekey the items array.
+        $items[$id] = array_values($items[$id]);
+      }
+    }
+  }
+}
+
+/**
+ * Build a renderable array for a field value.
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entity
+ *   The entity being displayed.
+ * @param $field
+ *   The field structure.
+ * @param $instance
+ *   The field instance.
+ * @param $langcode
+ *   The language associated with $items.
+ * @param $items
+ *   Array of values for this field.
+ * @param $display
+ *   The display settings to use, as found in the 'display' entry of instance
+ *   definitions. The array notably contains the following keys and values;
+ *   - type: The name of the formatter to use.
+ *   - settings: The array of formatter settings.
+ *
+ * @return
+ *   A renderable array for the $items, as an array of child elements keyed
+ *   by numeric indexes starting from 0.
+ */
+function hook_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  $element = array();
+  $settings = $display['settings'];
+
+  switch ($display['type']) {
+    case 'sample_field_formatter_simple':
+      // Common case: each value is displayed individually in a sub-element
+      // keyed by delta. The field.tpl.php template specifies the markup
+      // wrapping each value.
+      foreach ($items as $delta => $item) {
+        $element[$delta] = array('#markup' => $settings['some_setting'] . $item['value']);
+      }
+      break;
+
+    case 'sample_field_formatter_themeable':
+      // More elaborate formatters can defer to a theme function for easier
+      // customization.
+      foreach ($items as $delta => $item) {
+        $element[$delta] = array(
+          '#theme' => 'mymodule_theme_sample_field_formatter_themeable',
+          '#data' => $item['value'],
+          '#some_setting' => $settings['some_setting'],
+        );
+      }
+      break;
+
+    case 'sample_field_formatter_combined':
+      // Some formatters might need to display all values within a single piece
+      // of markup.
+      $rows = array();
+      foreach ($items as $delta => $item) {
+        $rows[] = array($delta, $item['value']);
+      }
+      $element[0] = array(
+        '#theme' => 'table',
+        '#header' => array(t('Delta'), t('Value')),
+        '#rows' => $rows,
+      );
+      break;
+  }
+
+  return $element;
+}
+
+/**
+ * @} End of "defgroup field_formatter".
+ */
+
+/**
+ * @ingroup field_attach
+ * @{
+ */
+
+/**
+ * Act on field_attach_form().
+ *
+ * This hook is invoked after the field module has performed the operation.
+ * Implementing modules should alter the $form or $form_state parameters.
+ *
+ * @param $entity_type
+ *   The type of $entity; for example, 'node' or 'user'.
+ * @param $entity
+ *   The entity for which an edit form is being built.
+ * @param $form
+ *   The form structure where field elements are attached to. This might be a
+ *   full form structure, or a sub-element of a larger form. The
+ *   $form['#parents'] property can be used to identify the corresponding part
+ *   of $form_state['values']. Hook implementations that need to act on the
+ *   top-level properties of the global form (like #submit, #validate...) can
+ *   add a #process callback to the array received in the $form parameter, and
+ *   act on the $complete_form parameter in the process callback.
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param $langcode
+ *   The language the field values are going to be entered in. If no language
+ *   is provided the default site language will be used.
+ */
+function hook_field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode) {
+  // Add a checkbox allowing a given field to be emptied.
+  // See hook_field_attach_submit() for the corresponding processing code.
+  $form['empty_field_foo'] = array(
+    '#type' => 'checkbox',
+    '#title' => t("Empty the 'field_foo' field"),
+  );
+}
+
+/**
+ * Act on field_attach_load().
+ *
+ * This hook is invoked after the field module has performed the operation.
+ *
+ * Unlike other field_attach hooks, this hook accounts for 'multiple loads'.
+ * Instead of the usual $entity parameter, it accepts an array of entities,
+ * indexed by entity ID. For performance reasons, information for all available
+ * entities should be loaded in a single query where possible.
+ *
+ * The changes made to the entities' field values get cached by the field cache
+ * for subsequent loads.
+ *
+ * See field_attach_load() for details and arguments.
+ */
+function hook_field_attach_load($entity_type, $entities, $age, $options) {
+  // @todo Needs function body.
+}
+
+/**
+ * Act on field_attach_validate().
+ *
+ * This hook is invoked after the field module has performed the operation.
+ *
+ * See field_attach_validate() for details and arguments.
+ */
+function hook_field_attach_validate($entity_type, $entity, &$errors) {
+  // @todo Needs function body.
+}
+
+/**
+ * Act on field_attach_submit().
+ *
+ * This hook is invoked after the field module has performed the operation.
+ *
+ * @param $entity_type
+ *   The type of $entity; for example, 'node' or 'user'.
+ * @param $entity
+ *   The entity for which an edit form is being submitted. The incoming form
+ *   values have been extracted as field values of the $entity object.
+ * @param $form
+ *   The form structure where field elements are attached to. This might be a
+ *   full form structure, or a sub-part of a larger form. The $form['#parents']
+ *   property can be used to identify the corresponding part of
+ *   $form_state['values'].
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ */
+function hook_field_attach_submit($entity_type, $entity, $form, &$form_state) {
+  // Sample case of an 'Empty the field' checkbox added on the form, allowing
+  // a given field to be emptied.
+  $values = drupal_array_get_nested_value($form_state['values'], $form['#parents']);
+  if (!empty($values['empty_field_foo'])) {
+    unset($entity->field_foo);
+  }
+}
+
+/**
+ * Act on field_attach_presave().
+ *
+ * This hook is invoked after the field module has performed the operation.
+ *
+ * See field_attach_presave() for details and arguments.
+ */
+function hook_field_attach_presave($entity_type, $entity) {
+  // @todo Needs function body.
+}
+
+/**
+ * Act on field_attach_insert().
+ *
+ * This hook is invoked after the field module has performed the operation.
+ *
+ * See field_attach_insert() for details and arguments.
+ */
+function hook_field_attach_insert($entity_type, $entity) {
+  // @todo Needs function body.
+}
+
+/**
+ * Act on field_attach_update().
+ *
+ * This hook is invoked after the field module has performed the operation.
+ *
+ * See field_attach_update() for details and arguments.
+ */
+function hook_field_attach_update($entity_type, $entity) {
+  // @todo Needs function body.
+}
+
+/**
+ * Alter field_attach_preprocess() variables.
+ *
+ * This hook is invoked while preprocessing the field.tpl.php template file
+ * in field_attach_preprocess().
+ *
+ * @param $variables
+ *   The variables array is passed by reference and will be populated with field
+ *   values.
+ * @param $context
+ *   An associative array containing:
+ *   - entity_type: The type of $entity; for example, 'node' or 'user'.
+ *   - entity: The entity with fields to render.
+ *   - element: The structured array containing the values ready for rendering.
+ */
+function hook_field_attach_preprocess_alter(&$variables, $context) {
+  // @todo Needs function body.
+}
+
+/**
+ * Act on field_attach_delete().
+ *
+ * This hook is invoked after the field module has performed the operation.
+ *
+ * See field_attach_delete() for details and arguments.
+ */
+function hook_field_attach_delete($entity_type, $entity) {
+  // @todo Needs function body.
+}
+
+/**
+ * Act on field_attach_delete_revision().
+ *
+ * This hook is invoked after the field module has performed the operation.
+ *
+ * See field_attach_delete_revision() for details and arguments.
+ */
+function hook_field_attach_delete_revision($entity_type, $entity) {
+  // @todo Needs function body.
+}
+
+/**
+ * Act on field_purge_data().
+ *
+ * This hook is invoked in field_purge_data() and allows modules to act on
+ * purging data from a single field pseudo-entity. For example, if a module
+ * relates data in the field with its own data, it may purge its own data
+ * during this process as well.
+ *
+ * @param $entity_type
+ *   The type of $entity; for example, 'node' or 'user'.
+ * @param $entity
+ *   The pseudo-entity whose field data is being purged.
+ * @param $field
+ *   The (possibly deleted) field whose data is being purged.
+ * @param $instance
+ *   The deleted field instance whose data is being purged.
+ *
+ * @see @link field_purge Field API bulk data deletion @endlink
+ * @see field_purge_data()
+ */
+function hook_field_attach_purge($entity_type, $entity, $field, $instance) {
+  // find the corresponding data in mymodule and purge it
+  if ($entity_type == 'node' && $field->field_name == 'my_field_name') {
+    mymodule_remove_mydata($entity->nid);
+  }
+}
+
+/**
+ * Perform alterations on field_attach_view() or field_view_field().
+ *
+ * This hook is invoked after the field module has performed the operation.
+ *
+ * @param $output
+ *   The structured content array tree for all of the entity's fields.
+ * @param $context
+ *   An associative array containing:
+ *   - entity_type: The type of $entity; for example, 'node' or 'user'.
+ *   - entity: The entity with fields to render.
+ *   - view_mode: View mode; for example, 'full' or 'teaser'.
+ *   - display: Either a view mode string or an array of display settings. If
+ *     this hook is being invoked from field_attach_view(), the 'display'
+ *     element is set to the view mode string. If this hook is being invoked
+ *     from field_view_field(), this element is set to the $display argument
+ *     and the view_mode element is set to '_custom'. See field_view_field()
+ *     for more information on what its $display argument contains.
+ *   - language: The language code used for rendering.
+ */
+function hook_field_attach_view_alter(&$output, $context) {
+  // Append RDF term mappings on displayed taxonomy links.
+  foreach (element_children($output) as $field_name) {
+    $element = &$output[$field_name];
+    if ($element['#field_type'] == 'taxonomy_term_reference' && $element['#formatter'] == 'taxonomy_term_reference_link') {
+      foreach ($element['#items'] as $delta => $item) {
+        $term = $item['taxonomy_term'];
+        if (!empty($term->rdf_mapping['rdftype'])) {
+          $element[$delta]['#options']['attributes']['typeof'] = $term->rdf_mapping['rdftype'];
+        }
+        if (!empty($term->rdf_mapping['name']['predicates'])) {
+          $element[$delta]['#options']['attributes']['property'] = $term->rdf_mapping['name']['predicates'];
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Perform alterations on field_attach_prepare_translation().
+ *
+ * This hook is invoked after the field module has performed the operation.
+ *
+ * @param $entity
+ *   The entity being prepared for translation.
+ * @param $context
+ *   An associative array containing:
+ *   - entity_type: The type of $entity; e.g. 'node' or 'user'.
+ *   - langcode: The language the entity has to be translated in.
+ *   - source_entity: The entity holding the field values to be translated.
+ *   - source_langcode: The source language from which translate.
+ */
+function hook_field_attach_prepare_translation_alter(&$entity, $context) {
+  if ($context['entity_type'] == 'custom_entity_type') {
+    $entity->custom_field = $context['source_entity']->custom_field;
+  }
+}
+
+/**
+ * Perform alterations on field_language() values.
+ *
+ * This hook is invoked to alter the array of display languages for the given
+ * entity.
+ *
+ * @param $display_language
+ *   A reference to an array of language codes keyed by field name.
+ * @param $context
+ *   An associative array containing:
+ *   - entity_type: The type of the entity to be displayed.
+ *   - entity: The entity with fields to render.
+ *   - langcode: The language code $entity has to be displayed in.
+ */
+function hook_field_language_alter(&$display_language, $context) {
+  // Do not apply core language fallback rules if they are disabled or if Locale
+  // is not registered as a translation handler.
+  if (variable_get('locale_field_language_fallback', TRUE) && field_has_translation_handler($context['entity_type'], 'locale')) {
+    locale_field_language_fallback($display_language, $context['entity'], $context['language']);
+  }
+}
+
+/**
+ * Alter field_available_languages() values.
+ *
+ * This hook is invoked from field_available_languages() to allow modules to
+ * alter the array of available languages for the given field.
+ *
+ * @param $languages
+ *   A reference to an array of language codes to be made available.
+ * @param $context
+ *   An associative array containing:
+ *   - entity_type: The type of the entity the field is attached to.
+ *   - field: A field data structure.
+ */
+function hook_field_available_languages_alter(&$languages, $context) {
+  // Add an unavailable language.
+  $languages[] = 'xx';
+
+  // Remove an available language.
+  $index = array_search('yy', $languages);
+  unset($languages[$index]);
+}
+
+/**
+ * Act on field_attach_create_bundle().
+ *
+ * This hook is invoked after the field module has performed the operation.
+ *
+ * See field_attach_create_bundle() for details and arguments.
+ */
+function hook_field_attach_create_bundle($entity_type, $bundle) {
+  // When a new bundle is created, the menu needs to be rebuilt to add the
+  // Field UI menu item tabs.
+  variable_set('menu_rebuild_needed', TRUE);
+}
+
+/**
+ * Act on field_attach_rename_bundle().
+ *
+ * This hook is invoked after the field module has performed the operation.
+ *
+ * See field_attach_rename_bundle() for details and arguments.
+ */
+function hook_field_attach_rename_bundle($entity_type, $bundle_old, $bundle_new) {
+  // Update the extra weights variable with new information.
+  if ($bundle_old !== $bundle_new) {
+    $extra_weights = variable_get('field_extra_weights', array());
+    if (isset($info[$entity_type][$bundle_old])) {
+      $extra_weights[$entity_type][$bundle_new] = $extra_weights[$entity_type][$bundle_old];
+      unset($extra_weights[$entity_type][$bundle_old]);
+      variable_set('field_extra_weights', $extra_weights);
+    }
+  }
+}
+
+/**
+ * Act on field_attach_delete_bundle.
+ *
+ * This hook is invoked after the field module has performed the operation.
+ *
+ * @param $entity_type
+ *   The type of entity; for example, 'node' or 'user'.
+ * @param $bundle
+ *   The bundle that was just deleted.
+ * @param $instances
+ *   An array of all instances that existed for the bundle before it was
+ *   deleted.
+ */
+function hook_field_attach_delete_bundle($entity_type, $bundle, $instances) {
+  // Remove the extra weights variable information for this bundle.
+  $extra_weights = variable_get('field_extra_weights', array());
+  if (isset($extra_weights[$entity_type][$bundle])) {
+    unset($extra_weights[$entity_type][$bundle]);
+    variable_set('field_extra_weights', $extra_weights);
+  }
+}
+
+/**
+ * @} End of "defgroup field_attach".
+ */
+
+/**
+ * @addtogroup field_storage
+ * @{
+ */
+
+/**
+ * Expose Field API storage backends.
+ *
+ * @return
+ *   An array describing the storage backends implemented by the module.
+ *   The keys are storage backend names. To avoid name clashes, storage backend
+ *   names should be prefixed with the name of the module that exposes them.
+ *   The values are arrays describing the storage backend, with the following
+ *   key/value pairs:
+ *   - label: The human-readable name of the storage backend.
+ *   - description: A short description for the storage backend.
+ *   - settings: An array whose keys are the names of the settings available
+ *     for the storage backend, and whose values are the default values for
+ *     those settings.
+ */
+function hook_field_storage_info() {
+  return array(
+    'field_sql_storage' => array(
+      'label' => t('Default SQL storage'),
+      'description' => t('Stores fields in the local SQL database, using per-field tables.'),
+      'settings' => array(),
+    ),
+  );
+}
+
+/**
+ * Perform alterations on Field API storage types.
+ *
+ * @param $info
+ *   Array of informations on storage types exposed by
+ *   hook_field_field_storage_info() implementations.
+ */
+function hook_field_storage_info_alter(&$info) {
+  // Add a setting to a storage type.
+  $info['field_sql_storage']['settings'] += array(
+    'mymodule_additional_setting' => 'default value',
+  );
+}
+
+/**
+ * Reveal the internal details about the storage for a field.
+ *
+ * For example, an SQL storage module might return the Schema API structure for
+ * the table. A key/value storage module might return the server name,
+ * authentication credentials, and bin name.
+ *
+ * Field storage modules are not obligated to implement this hook. Modules
+ * that rely on these details must only use them for read operations.
+ *
+ * @param $field
+ *   A field structure.
+ *
+ * @return
+ *   An array of details.
+ *    - The first dimension is a store type (sql, solr, etc).
+ *    - The second dimension indicates the age of the values in the store
+ *      FIELD_LOAD_CURRENT or FIELD_LOAD_REVISION.
+ *    - Other dimensions are specific to the field storage module.
+ *
+ * @see hook_field_storage_details_alter()
+ */
+function hook_field_storage_details($field) {
+  $details = array();
+
+  // Add field columns.
+  foreach ((array) $field['columns'] as $column_name => $attributes) {
+    $real_name = _field_sql_storage_columnname($field['field_name'], $column_name);
+    $columns[$column_name] = $real_name;
+  }
+  return array(
+    'sql' => array(
+      FIELD_LOAD_CURRENT => array(
+        _field_sql_storage_tablename($field) => $columns,
+      ),
+      FIELD_LOAD_REVISION => array(
+        _field_sql_storage_revision_tablename($field) => $columns,
+      ),
+    ),
+  );
+}
+
+/**
+ * Perform alterations on Field API storage details.
+ *
+ * @param $details
+ *   An array of storage details for fields as exposed by
+ *   hook_field_storage_details() implementations.
+ * @param $field
+ *   A field structure.
+ *
+ * @see hook_field_storage_details()
+ */
+function hook_field_storage_details_alter(&$details, $field) {
+  if ($field['field_name'] == 'field_of_interest') {
+    $columns = array();
+    foreach ((array) $field['columns'] as $column_name => $attributes) {
+      $columns[$column_name] = $column_name;
+    }
+    $details['drupal_variables'] = array(
+      FIELD_LOAD_CURRENT => array(
+        'moon' => $columns,
+      ),
+      FIELD_LOAD_REVISION => array(
+        'mars' => $columns,
+      ),
+    );
+  }
+}
+
+/**
+ * Load field data for a set of entities.
+ *
+ * This hook is invoked from field_attach_load() to ask the field storage
+ * module to load field data.
+ *
+ * Modules implementing this hook should load field values and add them to
+ * objects in $entities. Fields with no values should be added as empty
+ * arrays.
+ *
+ * @param $entity_type
+ *   The type of entity, such as 'node' or 'user'.
+ * @param $entities
+ *   The array of entity objects to add fields to, keyed by entity ID.
+ * @param $age
+ *   FIELD_LOAD_CURRENT to load the most recent revision for all fields, or
+ *   FIELD_LOAD_REVISION to load the version indicated by each entity.
+ * @param $fields
+ *   An array listing the fields to be loaded. The keys of the array are field
+ *   IDs, and the values of the array are the entity IDs (or revision IDs,
+ *   depending on the $age parameter) to add each field to.
+ * @param $options
+ *   An associative array of additional options, with the following keys:
+ *   - deleted: If TRUE, deleted fields should be loaded as well as
+ *     non-deleted fields. If unset or FALSE, only non-deleted fields should be
+ *     loaded.
+ */
+function hook_field_storage_load($entity_type, $entities, $age, $fields, $options) {
+  $load_current = $age == FIELD_LOAD_CURRENT;
+
+  foreach ($fields as $field_id => $ids) {
+    // By the time this hook runs, the relevant field definitions have been
+    // populated and cached in FieldInfo, so calling field_info_field_by_id()
+    // on each field individually is more efficient than loading all fields in
+    // memory upfront with field_info_field_by_ids().
+    $field = field_info_field_by_id($field_id);
+    $field_name = $field['field_name'];
+    $table = $load_current ? _field_sql_storage_tablename($field) : _field_sql_storage_revision_tablename($field);
+
+    $query = db_select($table, 't')
+      ->fields('t')
+      ->condition('entity_type', $entity_type)
+      ->condition($load_current ? 'entity_id' : 'revision_id', $ids, 'IN')
+      ->condition('language', field_available_languages($entity_type, $field), 'IN')
+      ->orderBy('delta');
+
+    if (empty($options['deleted'])) {
+      $query->condition('deleted', 0);
+    }
+
+    $results = $query->execute();
+
+    $delta_count = array();
+    foreach ($results as $row) {
+      if (!isset($delta_count[$row->entity_id][$row->language])) {
+        $delta_count[$row->entity_id][$row->language] = 0;
+      }
+
+      if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED || $delta_count[$row->entity_id][$row->language] < $field['cardinality']) {
+        $item = array();
+        // For each column declared by the field, populate the item
+        // from the prefixed database column.
+        foreach ($field['columns'] as $column => $attributes) {
+          $column_name = _field_sql_storage_columnname($field_name, $column);
+          $item[$column] = $row->$column_name;
+        }
+
+        // Add the item to the field values for the entity.
+        $entities[$row->entity_id]->{$field_name}[$row->language][] = $item;
+        $delta_count[$row->entity_id][$row->language]++;
+      }
+    }
+  }
+}
+
+/**
+ * Write field data for an entity.
+ *
+ * This hook is invoked from field_attach_insert() and field_attach_update(),
+ * to ask the field storage module to save field data.
+ *
+ * @param $entity_type
+ *   The entity type of entity, such as 'node' or 'user'.
+ * @param $entity
+ *   The entity on which to operate.
+ * @param $op
+ *   FIELD_STORAGE_UPDATE when updating an existing entity,
+ *   FIELD_STORAGE_INSERT when inserting a new entity.
+ * @param $fields
+ *   An array listing the fields to be written. The keys and values of the
+ *   array are field IDs.
+ */
+function hook_field_storage_write($entity_type, $entity, $op, $fields) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+  if (!isset($vid)) {
+    $vid = $id;
+  }
+
+  foreach ($fields as $field_id) {
+    $field = field_info_field_by_id($field_id);
+    $field_name = $field['field_name'];
+    $table_name = _field_sql_storage_tablename($field);
+    $revision_name = _field_sql_storage_revision_tablename($field);
+
+    $all_languages = field_available_languages($entity_type, $field);
+    $field_languages = array_intersect($all_languages, array_keys((array) $entity->$field_name));
+
+    // Delete and insert, rather than update, in case a value was added.
+    if ($op == FIELD_STORAGE_UPDATE) {
+      // Delete languages present in the incoming $entity->$field_name.
+      // Delete all languages if $entity->$field_name is empty.
+      $languages = !empty($entity->$field_name) ? $field_languages : $all_languages;
+      if ($languages) {
+        db_delete($table_name)
+          ->condition('entity_type', $entity_type)
+          ->condition('entity_id', $id)
+          ->condition('language', $languages, 'IN')
+          ->execute();
+        db_delete($revision_name)
+          ->condition('entity_type', $entity_type)
+          ->condition('entity_id', $id)
+          ->condition('revision_id', $vid)
+          ->condition('language', $languages, 'IN')
+          ->execute();
+      }
+    }
+
+    // Prepare the multi-insert query.
+    $do_insert = FALSE;
+    $columns = array('entity_type', 'entity_id', 'revision_id', 'bundle', 'delta', 'language');
+    foreach ($field['columns'] as $column => $attributes) {
+      $columns[] = _field_sql_storage_columnname($field_name, $column);
+    }
+    $query = db_insert($table_name)->fields($columns);
+    $revision_query = db_insert($revision_name)->fields($columns);
+
+    foreach ($field_languages as $langcode) {
+      $items = (array) $entity->{$field_name}[$langcode];
+      $delta_count = 0;
+      foreach ($items as $delta => $item) {
+        // We now know we have someting to insert.
+        $do_insert = TRUE;
+        $record = array(
+          'entity_type' => $entity_type,
+          'entity_id' => $id,
+          'revision_id' => $vid,
+          'bundle' => $bundle,
+          'delta' => $delta,
+          'language' => $langcode,
+        );
+        foreach ($field['columns'] as $column => $attributes) {
+          $record[_field_sql_storage_columnname($field_name, $column)] = isset($item[$column]) ? $item[$column] : NULL;
+        }
+        $query->values($record);
+        if (isset($vid)) {
+          $revision_query->values($record);
+        }
+
+        if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED && ++$delta_count == $field['cardinality']) {
+          break;
+        }
+      }
+    }
+
+    // Execute the query if we have values to insert.
+    if ($do_insert) {
+      $query->execute();
+      $revision_query->execute();
+    }
+  }
+}
+
+/**
+ * Delete all field data for an entity.
+ *
+ * This hook is invoked from field_attach_delete() to ask the field storage
+ * module to delete field data.
+ *
+ * @param $entity_type
+ *   The entity type of entity, such as 'node' or 'user'.
+ * @param $entity
+ *   The entity on which to operate.
+ * @param $fields
+ *   An array listing the fields to delete. The keys and values of the
+ *   array are field IDs.
+ */
+function hook_field_storage_delete($entity_type, $entity, $fields) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  foreach (field_info_instances($entity_type, $bundle) as $instance) {
+    if (isset($fields[$instance['field_id']])) {
+      $field = field_info_field_by_id($instance['field_id']);
+      field_sql_storage_field_storage_purge($entity_type, $entity, $field, $instance);
+    }
+  }
+}
+
+/**
+ * Delete a single revision of field data for an entity.
+ *
+ * This hook is invoked from field_attach_delete_revision() to ask the field
+ * storage module to delete field revision data.
+ *
+ * Deleting the current (most recently written) revision is not
+ * allowed as has undefined results.
+ *
+ * @param $entity_type
+ *   The entity type of entity, such as 'node' or 'user'.
+ * @param $entity
+ *   The entity on which to operate. The revision to delete is
+ *   indicated by the entity's revision ID property, as identified by
+ *   hook_fieldable_info() for $entity_type.
+ * @param $fields
+ *   An array listing the fields to delete. The keys and values of the
+ *   array are field IDs.
+ */
+function hook_field_storage_delete_revision($entity_type, $entity, $fields) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  if (isset($vid)) {
+    foreach ($fields as $field_id) {
+      $field = field_info_field_by_id($field_id);
+      $revision_name = _field_sql_storage_revision_tablename($field);
+      db_delete($revision_name)
+        ->condition('entity_type', $entity_type)
+        ->condition('entity_id', $id)
+        ->condition('revision_id', $vid)
+        ->execute();
+    }
+  }
+}
+
+/**
+ * Execute an EntityFieldQuery.
+ *
+ * This hook is called to find the entities having certain entity and field
+ * conditions and sort them in the given field order. If the field storage
+ * engine also handles property sorts and orders, it should unset those
+ * properties in the called object to signal that those have been handled.
+ *
+ * @param EntityFieldQuery $query
+ *   An EntityFieldQuery.
+ *
+ * @return
+ *   See EntityFieldQuery::execute() for the return values.
+ */
+function hook_field_storage_query($query) {
+  $groups = array();
+  if ($query->age == FIELD_LOAD_CURRENT) {
+    $tablename_function = '_field_sql_storage_tablename';
+    $id_key = 'entity_id';
+  }
+  else {
+    $tablename_function = '_field_sql_storage_revision_tablename';
+    $id_key = 'revision_id';
+  }
+  $table_aliases = array();
+  // Add tables for the fields used.
+  foreach ($query->fields as $key => $field) {
+    $tablename = $tablename_function($field);
+    // Every field needs a new table.
+    $table_alias = $tablename . $key;
+    $table_aliases[$key] = $table_alias;
+    if ($key) {
+      $select_query->join($tablename, $table_alias, "$table_alias.entity_type = $field_base_table.entity_type AND $table_alias.$id_key = $field_base_table.$id_key");
+    }
+    else {
+      $select_query = db_select($tablename, $table_alias);
+      $select_query->addTag('entity_field_access');
+      $select_query->addMetaData('base_table', $tablename);
+      $select_query->fields($table_alias, array('entity_type', 'entity_id', 'revision_id', 'bundle'));
+      $field_base_table = $table_alias;
+    }
+    if ($field['cardinality'] != 1) {
+      $select_query->distinct();
+    }
+  }
+
+  // Add field conditions.
+  foreach ($query->fieldConditions as $key => $condition) {
+    $table_alias = $table_aliases[$key];
+    $field = $condition['field'];
+    // Add the specified condition.
+    $sql_field = "$table_alias." . _field_sql_storage_columnname($field['field_name'], $condition['column']);
+    $query->addCondition($select_query, $sql_field, $condition);
+    // Add delta / language group conditions.
+    foreach (array('delta', 'language') as $column) {
+      if (isset($condition[$column . '_group'])) {
+        $group_name = $condition[$column . '_group'];
+        if (!isset($groups[$column][$group_name])) {
+          $groups[$column][$group_name] = $table_alias;
+        }
+        else {
+          $select_query->where("$table_alias.$column = " . $groups[$column][$group_name] . ".$column");
+        }
+      }
+    }
+  }
+
+  if (isset($query->deleted)) {
+    $select_query->condition("$field_base_table.deleted", (int) $query->deleted);
+  }
+
+  // Is there a need to sort the query by property?
+  $has_property_order = FALSE;
+  foreach ($query->order as $order) {
+    if ($order['type'] == 'property') {
+      $has_property_order = TRUE;
+    }
+  }
+
+  if ($query->propertyConditions || $has_property_order) {
+    if (empty($query->entityConditions['entity_type']['value'])) {
+      throw new EntityFieldQueryException('Property conditions and orders must have an entity type defined.');
+    }
+    $entity_type = $query->entityConditions['entity_type']['value'];
+    $entity_base_table = _field_sql_storage_query_join_entity($select_query, $entity_type, $field_base_table);
+    $query->entityConditions['entity_type']['operator'] = '=';
+    foreach ($query->propertyConditions as $property_condition) {
+      $query->addCondition($select_query, "$entity_base_table." . $property_condition['column'], $property_condition);
+    }
+  }
+  foreach ($query->entityConditions as $key => $condition) {
+    $query->addCondition($select_query, "$field_base_table.$key", $condition);
+  }
+
+  // Order the query.
+  foreach ($query->order as $order) {
+    if ($order['type'] == 'entity') {
+      $key = $order['specifier'];
+      $select_query->orderBy("$field_base_table.$key", $order['direction']);
+    }
+    elseif ($order['type'] == 'field') {
+      $specifier = $order['specifier'];
+      $field = $specifier['field'];
+      $table_alias = $table_aliases[$specifier['index']];
+      $sql_field = "$table_alias." . _field_sql_storage_columnname($field['field_name'], $specifier['column']);
+      $select_query->orderBy($sql_field, $order['direction']);
+    }
+    elseif ($order['type'] == 'property') {
+      $select_query->orderBy("$entity_base_table." . $order['specifier'], $order['direction']);
+    }
+  }
+
+  return $query->finishQuery($select_query, $id_key);
+}
+
+/**
+ * Act on creation of a new field.
+ *
+ * This hook is invoked from field_create_field() to ask the field storage
+ * module to save field information and prepare for storing field instances.
+ * If there is a problem, the field storage module should throw an exception.
+ *
+ * @param $field
+ *   The field structure being created.
+ */
+function hook_field_storage_create_field($field) {
+  $schema = _field_sql_storage_schema($field);
+  foreach ($schema as $name => $table) {
+    db_create_table($name, $table);
+  }
+  drupal_get_schema(NULL, TRUE);
+}
+
+/**
+ * Act on deletion of a field.
+ *
+ * This hook is invoked from field_delete_field() to ask the field storage
+ * module to mark all information stored in the field for deletion.
+ *
+ * @param $field
+ *   The field being deleted.
+ */
+function hook_field_storage_delete_field($field) {
+  // Mark all data associated with the field for deletion.
+  $field['deleted'] = 0;
+  $table = _field_sql_storage_tablename($field);
+  $revision_table = _field_sql_storage_revision_tablename($field);
+  db_update($table)
+    ->fields(array('deleted' => 1))
+    ->execute();
+
+  // Move the table to a unique name while the table contents are being deleted.
+  $field['deleted'] = 1;
+  $new_table = _field_sql_storage_tablename($field);
+  $revision_new_table = _field_sql_storage_revision_tablename($field);
+  db_rename_table($table, $new_table);
+  db_rename_table($revision_table, $revision_new_table);
+  drupal_get_schema(NULL, TRUE);
+}
+
+/**
+ * Act on deletion of a field instance.
+ *
+ * This hook is invoked from field_delete_instance() to ask the field storage
+ * module to mark all information stored for the field instance for deletion.
+ *
+ * @param $instance
+ *   The instance being deleted.
+ */
+function hook_field_storage_delete_instance($instance) {
+  $field = field_info_field($instance['field_name']);
+  $table_name = _field_sql_storage_tablename($field);
+  $revision_name = _field_sql_storage_revision_tablename($field);
+  db_update($table_name)
+    ->fields(array('deleted' => 1))
+    ->condition('entity_type', $instance['entity_type'])
+    ->condition('bundle', $instance['bundle'])
+    ->execute();
+  db_update($revision_name)
+    ->fields(array('deleted' => 1))
+    ->condition('entity_type', $instance['entity_type'])
+    ->condition('bundle', $instance['bundle'])
+    ->execute();
+}
+
+/**
+ * Act before the storage backends load field data.
+ *
+ * This hook allows modules to load data before the Field Storage API,
+ * optionally preventing the field storage module from doing so.
+ *
+ * This lets 3rd party modules override, mirror, shard, or otherwise store a
+ * subset of fields in a different way than the current storage engine.
+ * Possible use cases include per-bundle storage, per-combo-field storage, etc.
+ *
+ * Modules implementing this hook should load field values and add them to
+ * objects in $entities. Fields with no values should be added as empty
+ * arrays. In addition, fields loaded should be added as keys to $skip_fields.
+ *
+ * @param $entity_type
+ *   The type of entity, such as 'node' or 'user'.
+ * @param $entities
+ *   The array of entity objects to add fields to, keyed by entity ID.
+ * @param $age
+ *   FIELD_LOAD_CURRENT to load the most recent revision for all fields, or
+ *   FIELD_LOAD_REVISION to load the version indicated by each entity.
+ * @param $skip_fields
+ *   An array keyed by field IDs whose data has already been loaded and
+ *   therefore should not be loaded again. Add a key to this array to indicate
+ *   that your module has already loaded a field.
+ * @param $options
+ *   An associative array of additional options, with the following keys:
+ *   - field_id: The field ID that should be loaded. If unset, all fields
+ *     should be loaded.
+ *   - deleted: If TRUE, deleted fields should be loaded as well as
+ *     non-deleted fields. If unset or FALSE, only non-deleted fields should be
+ *     loaded.
+ */
+function hook_field_storage_pre_load($entity_type, $entities, $age, &$skip_fields, $options) {
+  // @todo Needs function body.
+}
+
+/**
+ * Act before the storage backends insert field data.
+ *
+ * This hook allows modules to store data before the Field Storage API,
+ * optionally preventing the field storage module from doing so.
+ *
+ * @param $entity_type
+ *   The type of $entity; for example, 'node' or 'user'.
+ * @param $entity
+ *   The entity with fields to save.
+ * @param $skip_fields
+ *   An array keyed by field IDs whose data has already been written and
+ *   therefore should not be written again. The values associated with these
+ *   keys are not specified.
+ * @return
+ *   Saved field IDs are set set as keys in $skip_fields.
+ */
+function hook_field_storage_pre_insert($entity_type, $entity, &$skip_fields) {
+  if ($entity_type == 'node' && $entity->status && _forum_node_check_node_type($entity)) {
+    $query = db_insert('forum_index')->fields(array('nid', 'title', 'tid', 'sticky', 'created', 'comment_count', 'last_comment_timestamp'));
+    foreach ($entity->taxonomy_forums as $language) {
+      foreach ($language as $delta) {
+        $query->values(array(
+          'nid' => $entity->nid,
+          'title' => $entity->title,
+          'tid' => $delta['value'],
+          'sticky' => $entity->sticky,
+          'created' => $entity->created,
+          'comment_count' => 0,
+          'last_comment_timestamp' => $entity->created,
+        ));
+      }
+    }
+    $query->execute();
+  }
+}
+
+/**
+ * Act before the storage backends update field data.
+ *
+ * This hook allows modules to store data before the Field Storage API,
+ * optionally preventing the field storage module from doing so.
+ *
+ * @param $entity_type
+ *   The type of $entity; for example, 'node' or 'user'.
+ * @param $entity
+ *   The entity with fields to save.
+ * @param $skip_fields
+ *   An array keyed by field IDs whose data has already been written and
+ *   therefore should not be written again. The values associated with these
+ *   keys are not specified.
+ * @return
+ *   Saved field IDs are set set as keys in $skip_fields.
+ */
+function hook_field_storage_pre_update($entity_type, $entity, &$skip_fields) {
+  $first_call = &drupal_static(__FUNCTION__, array());
+
+  if ($entity_type == 'node' && $entity->status && _forum_node_check_node_type($entity)) {
+    // We don't maintain data for old revisions, so clear all previous values
+    // from the table. Since this hook runs once per field, per entity, make
+    // sure we only wipe values once.
+    if (!isset($first_call[$entity->nid])) {
+      $first_call[$entity->nid] = FALSE;
+      db_delete('forum_index')->condition('nid', $entity->nid)->execute();
+    }
+    // Only save data to the table if the node is published.
+    if ($entity->status) {
+      $query = db_insert('forum_index')->fields(array('nid', 'title', 'tid', 'sticky', 'created', 'comment_count', 'last_comment_timestamp'));
+      foreach ($entity->taxonomy_forums as $language) {
+        foreach ($language as $delta) {
+          $query->values(array(
+            'nid' => $entity->nid,
+            'title' => $entity->title,
+            'tid' => $delta['value'],
+            'sticky' => $entity->sticky,
+            'created' => $entity->created,
+            'comment_count' => 0,
+            'last_comment_timestamp' => $entity->created,
+          ));
+        }
+      }
+      $query->execute();
+      // The logic for determining last_comment_count is fairly complex, so
+      // call _forum_update_forum_index() too.
+      _forum_update_forum_index($entity->nid);
+    }
+  }
+}
+
+/**
+ * Returns the maximum weight for the entity components handled by the module.
+ *
+ * Field API takes care of fields and 'extra_fields'. This hook is intended for
+ * third-party modules adding other entity components (e.g. field_group).
+ *
+ * @param $entity_type
+ *   The type of entity; e.g. 'node' or 'user'.
+ * @param $bundle
+ *   The bundle name.
+ * @param $context
+ *   The context for which the maximum weight is requested. Either 'form', or
+ *   the name of a view mode.
+ * @return
+ *   The maximum weight of the entity's components, or NULL if no components
+ *   were found.
+ */
+function hook_field_info_max_weight($entity_type, $bundle, $context) {
+  $weights = array();
+
+  foreach (my_module_entity_additions($entity_type, $bundle, $context) as $addition) {
+    $weights[] = $addition['weight'];
+  }
+
+  return $weights ? max($weights) : NULL;
+}
+
+/**
+ * Alters the display settings of a field before it gets displayed.
+ *
+ * Note that instead of hook_field_display_alter(), which is called for all
+ * fields on all entity types, hook_field_display_ENTITY_TYPE_alter() may be
+ * used to alter display settings for fields on a specific entity type only.
+ *
+ * This hook is called once per field per displayed entity. If the result of the
+ * hook involves reading from the database, it is highly recommended to
+ * statically cache the information.
+ *
+ * @param $display
+ *   The display settings that will be used to display the field values, as
+ *   found in the 'display' key of $instance definitions.
+ * @param $context
+ *   An associative array containing:
+ *   - entity_type: The entity type; e.g., 'node' or 'user'.
+ *   - field: The field being rendered.
+ *   - instance: The instance being rendered.
+ *   - entity: The entity being rendered.
+ *   - view_mode: The view mode, e.g. 'full', 'teaser'...
+ *
+ * @see hook_field_display_ENTITY_TYPE_alter()
+ */
+function hook_field_display_alter(&$display, $context) {
+  // Leave field labels out of the search index.
+  // Note: The check against $context['entity_type'] == 'node' could be avoided
+  // by using hook_field_display_node_alter() instead of
+  // hook_field_display_alter(), resulting in less function calls when
+  // rendering non-node entities.
+  if ($context['entity_type'] == 'node' && $context['view_mode'] == 'search_index') {
+    $display['label'] = 'hidden';
+  }
+}
+
+/**
+ * Alters the display settings of a field on a given entity type before it gets displayed.
+ *
+ * Modules can implement hook_field_display_ENTITY_TYPE_alter() to alter display
+ * settings for fields on a specific entity type, rather than implementing
+ * hook_field_display_alter().
+ *
+ * This hook is called once per field per displayed entity. If the result of the
+ * hook involves reading from the database, it is highly recommended to
+ * statically cache the information.
+ *
+ * @param $display
+ *   The display settings that will be used to display the field values, as
+ *   found in the 'display' key of $instance definitions.
+ * @param $context
+ *   An associative array containing:
+ *   - entity_type: The entity type; e.g., 'node' or 'user'.
+ *   - field: The field being rendered.
+ *   - instance: The instance being rendered.
+ *   - entity: The entity being rendered.
+ *   - view_mode: The view mode, e.g. 'full', 'teaser'...
+ *
+ * @see hook_field_display_alter()
+ */
+function hook_field_display_ENTITY_TYPE_alter(&$display, $context) {
+  // Leave field labels out of the search index.
+  if ($context['view_mode'] == 'search_index') {
+    $display['label'] = 'hidden';
+  }
+}
+
+/**
+ * Alters the display settings of pseudo-fields before an entity is displayed.
+ *
+ * This hook is called once per displayed entity. If the result of the hook
+ * involves reading from the database, it is highly recommended to statically
+ * cache the information.
+ *
+ * @param $displays
+ *   An array of display settings for the pseudo-fields in the entity, keyed
+ *   by pseudo-field names.
+ * @param $context
+ *   An associative array containing:
+ *   - entity_type: The entity type; e.g., 'node' or 'user'.
+ *   - bundle: The bundle name.
+ *   - view_mode: The view mode, e.g. 'full', 'teaser'...
+ */
+function hook_field_extra_fields_display_alter(&$displays, $context) {
+  if ($context['entity_type'] == 'taxonomy_term' && $context['view_mode'] == 'full') {
+    $displays['description']['visible'] = FALSE;
+  }
+}
+
+/**
+ * Alters the widget properties of a field instance on a given entity type
+ * before it gets displayed.
+ *
+ * Modules can implement hook_field_widget_properties_ENTITY_TYPE_alter() to
+ * alter the widget properties for fields on a specific entity type, rather than
+ * implementing hook_field_widget_properties_alter().
+ *
+ * This hook is called once per field per displayed widget entity. If the result
+ * of the hook involves reading from the database, it is highly recommended to
+ * statically cache the information.
+ *
+ * @param $widget
+ *   The instance's widget properties.
+ * @param $context
+ *   An associative array containing:
+ *   - entity_type: The entity type; e.g., 'node' or 'user'.
+ *   - entity: The entity object.
+ *   - field: The field that the widget belongs to.
+ *   - instance: The instance of the field.
+ *
+ * @see hook_field_widget_properties_alter()
+ */
+function hook_field_widget_properties_ENTITY_TYPE_alter(&$widget, $context) {
+  // Change a widget's type according to the time of day.
+  $field = $context['field'];
+  if ($field['field_name'] == 'field_foo') {
+    $time = date('H');
+    $widget['type'] = $time < 12 ? 'widget_am' : 'widget_pm';
+  }
+}
+
+/**
+ * @} End of "addtogroup field_storage".
+ */
+
+/**
+ * @addtogroup field_crud
+ * @{
+ */
+
+/**
+ * Act on a field being created.
+ *
+ * This hook is invoked from field_create_field() after the field is created, to
+ * allow modules to act on field creation.
+ *
+ * @param $field
+ *   The field just created.
+ */
+function hook_field_create_field($field) {
+  // @todo Needs function body.
+}
+
+/**
+ * Act on a field instance being created.
+ *
+ * This hook is invoked from field_create_instance() after the instance record
+ * is saved, so it cannot be used to modify the instance itself.
+ *
+ * @param $instance
+ *   The instance just created.
+ */
+function hook_field_create_instance($instance) {
+  // @todo Needs function body.
+}
+
+/**
+ * Forbid a field update from occurring.
+ *
+ * Any module may forbid any update for any reason. For example, the
+ * field's storage module might forbid an update if it would change
+ * the storage schema while data for the field exists. A field type
+ * module might forbid an update if it would change existing data's
+ * semantics, or if there are external dependencies on field settings
+ * that cannot be updated.
+ *
+ * To forbid the update from occurring, throw a FieldUpdateForbiddenException.
+ *
+ * @param $field
+ *   The field as it will be post-update.
+ * @param $prior_field
+ *   The field as it is pre-update.
+ * @param $has_data
+ *   Whether any data already exists for this field.
+ */
+function hook_field_update_forbid($field, $prior_field, $has_data) {
+  // A 'list' field stores integer keys mapped to display values. If
+  // the new field will have fewer values, and any data exists for the
+  // abandoned keys, the field will have no way to display them. So,
+  // forbid such an update.
+  if ($has_data && count($field['settings']['allowed_values']) < count($prior_field['settings']['allowed_values'])) {
+    // Identify the keys that will be lost.
+    $lost_keys = array_diff(array_keys($field['settings']['allowed_values']), array_keys($prior_field['settings']['allowed_values']));
+    // If any data exist for those keys, forbid the update.
+    $query = new EntityFieldQuery();
+    $found = $query
+      ->fieldCondition($prior_field['field_name'], 'value', $lost_keys)
+      ->range(0, 1)
+      ->execute();
+    if ($found) {
+      throw new FieldUpdateForbiddenException("Cannot update a list field not to include keys with existing data");
+    }
+  }
+}
+
+/**
+ * Act on a field being updated.
+ *
+ * This hook is invoked just after field is updated in field_update_field().
+ *
+ * @param $field
+ *   The field as it is post-update.
+ * @param $prior_field
+ *   The field as it was pre-update.
+ * @param $has_data
+ *   Whether any data already exists for this field.
+ */
+function hook_field_update_field($field, $prior_field, $has_data) {
+  // Reset the static value that keeps track of allowed values for list fields.
+  drupal_static_reset('list_allowed_values');
+}
+
+/**
+ * Act on a field being deleted.
+ *
+ * This hook is invoked just after a field is deleted by field_delete_field().
+ *
+ * @param $field
+ *   The field just deleted.
+ */
+function hook_field_delete_field($field) {
+  // @todo Needs function body.
+}
+
+/**
+ * Act on a field instance being updated.
+ *
+ * This hook is invoked from field_update_instance() after the instance record
+ * is saved, so it cannot be used by a module to modify the instance itself.
+ *
+ * @param $instance
+ *   The instance as it is post-update.
+ * @param $prior_instance
+ *   The instance as it was pre-update.
+ */
+function hook_field_update_instance($instance, $prior_instance) {
+  // @todo Needs function body.
+}
+
+/**
+ * Act on a field instance being deleted.
+ *
+ * This hook is invoked from field_delete_instance() after the instance is
+ * deleted.
+ *
+ * @param $instance
+ *   The instance just deleted.
+ */
+function hook_field_delete_instance($instance) {
+  // @todo Needs function body.
+}
+
+/**
+ * Act on field records being read from the database.
+ *
+ * This hook is invoked from field_read_fields() on each field being read.
+ *
+ * @param $field
+ *   The field record just read from the database.
+ */
+function hook_field_read_field($field) {
+  // @todo Needs function body.
+}
+
+/**
+ * Act on a field record being read from the database.
+ *
+ * This hook is invoked from field_read_instances() on each instance being read.
+ *
+ * @param $instance
+ *   The instance record just read from the database.
+ */
+function hook_field_read_instance($instance) {
+  // @todo Needs function body.
+}
+
+/**
+ * Acts when a field record is being purged.
+ *
+ * In field_purge_field(), after the field configuration has been
+ * removed from the database, the field storage module has had a chance to
+ * run its hook_field_storage_purge_field(), and the field info cache
+ * has been cleared, this hook is invoked on all modules to allow them to
+ * respond to the field being purged.
+ *
+ * @param $field
+ *   The field being purged.
+ */
+function hook_field_purge_field($field) {
+  db_delete('my_module_field_info')
+    ->condition('id', $field['id'])
+    ->execute();
+}
+
+/**
+ * Acts when a field instance is being purged.
+ *
+ * In field_purge_instance(), after the field instance has been
+ * removed from the database, the field storage module has had a chance to
+ * run its hook_field_storage_purge_instance(), and the field info cache
+ * has been cleared, this hook is invoked on all modules to allow them to
+ * respond to the field instance being purged.
+ *
+ * @param $instance
+ *   The instance being purged.
+ */
+function hook_field_purge_instance($instance) {
+  db_delete('my_module_field_instance_info')
+    ->condition('id', $instance['id'])
+    ->execute();
+}
+
+/**
+ * Remove field storage information when a field record is purged.
+ *
+ * Called from field_purge_field() to allow the field storage module
+ * to remove field information when a field is being purged.
+ *
+ * @param $field
+ *   The field being purged.
+ */
+function hook_field_storage_purge_field($field) {
+  $table_name = _field_sql_storage_tablename($field);
+  $revision_name = _field_sql_storage_revision_tablename($field);
+  db_drop_table($table_name);
+  db_drop_table($revision_name);
+}
+
+/**
+ * Remove field storage information when a field instance is purged.
+ *
+ * Called from field_purge_instance() to allow the field storage module
+ * to remove field instance information when a field instance is being
+ * purged.
+ *
+ * @param $instance
+ *   The instance being purged.
+ */
+function hook_field_storage_purge_field_instance($instance) {
+  db_delete('my_module_field_instance_info')
+    ->condition('id', $instance['id'])
+    ->execute();
+}
+
+/**
+ * Remove field storage information when field data is purged.
+ *
+ * Called from field_purge_data() to allow the field storage
+ * module to delete field data information.
+ *
+ * @param $entity_type
+ *   The type of $entity; for example, 'node' or 'user'.
+ * @param $entity
+ *   The pseudo-entity whose field data to delete.
+ * @param $field
+ *   The (possibly deleted) field whose data is being purged.
+ * @param $instance
+ *   The deleted field instance whose data is being purged.
+ */
+function hook_field_storage_purge($entity_type, $entity, $field, $instance) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  $table_name = _field_sql_storage_tablename($field);
+  $revision_name = _field_sql_storage_revision_tablename($field);
+  db_delete($table_name)
+    ->condition('entity_type', $entity_type)
+    ->condition('entity_id', $id)
+    ->execute();
+  db_delete($revision_name)
+    ->condition('entity_type', $entity_type)
+    ->condition('entity_id', $id)
+    ->execute();
+}
+
+/**
+ * @} End of "addtogroup field_crud".
+ */
+
+/**
+ * Determine whether the user has access to a given field.
+ *
+ * This hook is invoked from field_access() to let modules block access to
+ * operations on fields. If no module returns FALSE, the operation is allowed.
+ *
+ * @param $op
+ *   The operation to be performed. Possible values: 'edit', 'view'.
+ * @param $field
+ *   The field on which the operation is to be performed.
+ * @param $entity_type
+ *   The type of $entity; for example, 'node' or 'user'.
+ * @param $entity
+ *   (optional) The entity for the operation.
+ * @param $account
+ *   (optional) The account to check; if not given use currently logged in user.
+ *
+ * @return
+ *   TRUE if the operation is allowed, and FALSE if the operation is denied.
+ */
+function hook_field_access($op, $field, $entity_type, $entity, $account) {
+  if ($field['field_name'] == 'field_of_interest' && $op == 'edit') {
+    return user_access('edit field of interest', $account);
+  }
+  return TRUE;
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/field/field.attach.inc b/htmltest/modules/field/field.attach.inc
new file mode 100644
index 00000000..4a90961d
--- /dev/null
+++ b/htmltest/modules/field/field.attach.inc
@@ -0,0 +1,1416 @@
+<?php
+
+/**
+ * @file
+ * Field attach API, allowing entities (nodes, users, ...) to be 'fieldable'.
+ */
+
+/**
+ * Exception thrown by field_attach_validate() on field validation errors.
+ */
+class FieldValidationException extends FieldException {
+  var $errors;
+
+ /**
+  * Constructor for FieldValidationException.
+  *
+  * @param $errors
+  *   An array of field validation errors, keyed by field name and
+  *   delta that contains two keys:
+  *   - 'error': A machine-readable error code string, prefixed by
+  *     the field module name. A field widget may use this code to decide
+  *     how to report the error.
+  *   - 'message': A human-readable error message such as to be
+  *     passed to form_error() for the appropriate form element.
+  */
+  function __construct($errors) {
+    $this->errors = $errors;
+    parent::__construct(t('Field validation errors'));
+  }
+}
+
+/**
+ * @defgroup field_storage Field Storage API
+ * @{
+ * Implement a storage engine for Field API data.
+ *
+ * The Field Attach API uses the Field Storage API to perform all "database
+ * access". Each Field Storage API hook function defines a primitive database
+ * operation such as read, write, or delete. The default field storage module,
+ * field_sql_storage.module, uses the local SQL database to implement these
+ * operations, but alternative field storage backends can choose to represent
+ * the data in SQL differently or use a completely different storage mechanism
+ * such as a cloud-based database.
+ *
+ * Each field defines which storage backend it uses. The Drupal system variable
+ * 'field_storage_default' identifies the storage backend used by default.
+ *
+ * See @link field Field API @endlink for information about the other parts of
+ * the Field API.
+ */
+
+/**
+ * Argument for an update operation.
+ *
+ * This is used in hook_field_storage_write when updating an
+ * existing entity.
+ */
+define('FIELD_STORAGE_UPDATE', 'update');
+
+/**
+ * Argument for an insert operation.
+ *
+ * This is used in hook_field_storage_write when inserting a new entity.
+ */
+define('FIELD_STORAGE_INSERT', 'insert');
+
+/**
+ * @} End of "defgroup field_storage".
+ */
+
+/**
+ * @defgroup field_attach Field Attach API
+ * @{
+ * Operate on Field API data attached to Drupal entities.
+ *
+ * Field Attach API functions load, store, display, generate Field API
+ * structures, and perform a variety of other functions for field data attached
+ * to individual entities.
+ *
+ * Field Attach API functions generally take $entity_type and $entity arguments
+ * along with additional function-specific arguments. $entity_type is the type
+ * of the fieldable entity, such as 'node' or 'user', and $entity is the entity
+ * itself.
+ *
+ * hook_entity_info() is the central place for entity types to define if and
+ * how Field API should operate on their entity objects. Notably, the
+ * 'fieldable' property needs to be set to TRUE.
+ *
+ * The Field Attach API uses the concept of bundles: the set of fields for a
+ * given entity is defined on a per-bundle basis. The collection of bundles for
+ * an entity type is defined its hook_entity_info() implementation. For
+ * instance, node_entity_info() exposes each node type as its own bundle. This
+ * means that the set of fields of a node is determined by the node type. The
+ * Field API reads the bundle name for a given entity from a particular
+ * property of the entity object, and hook_entity_info() defines which property
+ * to use. For instance, node_entity_info() specifies:
+ * @code $info['entity keys']['bundle'] = 'type'@endcode
+ * This indicates that for a particular node object, the bundle name can be
+ * found in $node->type. This property can be omitted if the entity type only
+ * exposes a single bundle (all entities of this type have the same collection
+ * of fields). This is the case for the 'user' entity type.
+ *
+ * Most Field Attach API functions define a corresponding hook function that
+ * allows any module to act on Field Attach operations for any entity after the
+ * operation is complete, and access or modify all the field, form, or display
+ * data for that entity and operation. For example, field_attach_view() invokes
+ * hook_field_attach_view_alter(). These all-module hooks are distinct from
+ * those of the Field Types API, such as hook_field_load(), that are only
+ * invoked for the module that defines a specific field type.
+ *
+ * field_attach_load(), field_attach_insert(), and field_attach_update() also
+ * define pre-operation hooks, e.g. hook_field_attach_pre_load(). These hooks
+ * run before the corresponding Field Storage API and Field Type API
+ * operations. They allow modules to define additional storage locations (e.g.
+ * denormalizing, mirroring) for field data on a per-field basis. They also
+ * allow modules to take over field storage completely by instructing other
+ * implementations of the same hook and the Field Storage API itself not to
+ * operate on specified fields.
+ *
+ * The pre-operation hooks do not make the Field Storage API irrelevant. The
+ * Field Storage API is essentially the "fallback mechanism" for any fields
+ * that aren't being intercepted explicitly by pre-operation hooks.
+ *
+ * @link field_language Field Language API @endlink provides information about
+ * the structure of field objects.
+ *
+ * See @link field Field API @endlink for information about the other parts of
+ * the Field API.
+ */
+
+/**
+ * Invoke a field hook.
+ *
+ * @param $op
+ *   Possible operations include:
+ *   - form
+ *   - validate
+ *   - presave
+ *   - insert
+ *   - update
+ *   - delete
+ *   - delete revision
+ *   - view
+ *   - prepare translation
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The fully formed $entity_type entity.
+ * @param $a
+ *   - The $form in the 'form' operation.
+ *   - The value of $view_mode in the 'view' operation.
+ *   - Otherwise NULL.
+ * @param $b
+ *   - The $form_state in the 'submit' operation.
+ *   - Otherwise NULL.
+ * @param $options
+ *   An associative array of additional options, with the following keys:
+ *  - 'field_name': The name of the field whose operation should be
+ *    invoked. By default, the operation is invoked on all the fields
+ *    in the entity's bundle. NOTE: This option is not compatible with
+ *    the 'deleted' option; the 'field_id' option should be used
+ *    instead.
+ *  - 'field_id': The id of the field whose operation should be
+ *    invoked. By default, the operation is invoked on all the fields
+ *    in the entity's' bundles.
+ *  - 'default': A boolean value, specifying which implementation of
+ *    the operation should be invoked.
+ *    - if FALSE (default), the field types implementation of the operation
+ *      will be invoked (hook_field_[op])
+ *    - If TRUE, the default field implementation of the field operation
+ *      will be invoked (field_default_[op])
+ *    Internal use only. Do not explicitely set to TRUE, but use
+ *    _field_invoke_default() instead.
+ *  - 'deleted': If TRUE, the function will operate on deleted fields
+ *    as well as non-deleted fields. If unset or FALSE, only
+ *    non-deleted fields are operated on.
+ *  - 'language': A language code or an array of language codes keyed by field
+ *    name. It will be used to narrow down to a single value the available
+ *    languages to act on.
+ */
+function _field_invoke($op, $entity_type, $entity, &$a = NULL, &$b = NULL, $options = array()) {
+  // Merge default options.
+  $default_options = array(
+    'default' => FALSE,
+    'deleted' => FALSE,
+    'language' => NULL,
+  );
+  $options += $default_options;
+
+  // Determine the list of instances to iterate on.
+  list(, , $bundle) = entity_extract_ids($entity_type, $entity);
+  $instances = _field_invoke_get_instances($entity_type, $bundle, $options);
+
+  // Iterate through the instances and collect results.
+  $return = array();
+  foreach ($instances as $instance) {
+    // field_info_field() is not available for deleted fields, so use
+    // field_info_field_by_id().
+    $field = field_info_field_by_id($instance['field_id']);
+    $field_name = $field['field_name'];
+    $function = $options['default'] ? 'field_default_' . $op : $field['module'] . '_field_' . $op;
+    if (function_exists($function)) {
+      // Determine the list of languages to iterate on.
+      $available_languages = field_available_languages($entity_type, $field);
+      $languages = _field_language_suggestion($available_languages, $options['language'], $field_name);
+
+      foreach ($languages as $langcode) {
+        $items = isset($entity->{$field_name}[$langcode]) ? $entity->{$field_name}[$langcode] : array();
+        $result = $function($entity_type, $entity, $field, $instance, $langcode, $items, $a, $b);
+        if (isset($result)) {
+          // For hooks with array results, we merge results together.
+          // For hooks with scalar results, we collect results in an array.
+          if (is_array($result)) {
+            $return = array_merge($return, $result);
+          }
+          else {
+            $return[] = $result;
+          }
+        }
+
+        // Populate $items back in the field values, but avoid replacing missing
+        // fields with an empty array (those are not equivalent on update).
+        if ($items !== array() || isset($entity->{$field_name}[$langcode])) {
+          $entity->{$field_name}[$langcode] = $items;
+        }
+      }
+    }
+  }
+
+  return $return;
+}
+
+/**
+ * Invoke a field hook across fields on multiple entities.
+ *
+ * @param $op
+ *   Possible operations include:
+ *   - load
+ *   - prepare_view
+ *   For all other operations, use _field_invoke() / field_invoke_default()
+ *   instead.
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entities
+ *   An array of entities, keyed by entity id.
+ * @param $a
+ *   - The $age parameter in the 'load' operation.
+ *   - Otherwise NULL.
+ * @param $b
+ *   Currently always NULL.
+ * @param $options
+ *   An associative array of additional options, with the following keys:
+ *  - 'field_name': The name of the field whose operation should be
+ *    invoked. By default, the operation is invoked on all the fields
+ *    in the entity's bundle. NOTE: This option is not compatible with
+ *    the 'deleted' option; the 'field_id' option should be used instead.
+ *  - 'field_id': The id of the field whose operation should be
+ *    invoked. By default, the operation is invoked on all the fields
+ *    in the entity's' bundles.
+ *  - 'default': A boolean value, specifying which implementation of
+ *    the operation should be invoked.
+ *    - if FALSE (default), the field types implementation of the operation
+ *      will be invoked (hook_field_[op])
+ *    - If TRUE, the default field implementation of the field operation
+ *      will be invoked (field_default_[op])
+ *    Internal use only. Do not explicitely set to TRUE, but use
+ *    _field_invoke_multiple_default() instead.
+ *  - 'deleted': If TRUE, the function will operate on deleted fields
+ *    as well as non-deleted fields. If unset or FALSE, only
+ *    non-deleted fields are operated on.
+ *  - 'language': A language code or an array of arrays of language codes keyed
+ *    by entity id and field name. It will be used to narrow down to a single
+ *    value the available languages to act on.
+ *
+ * @return
+ *   An array of returned values keyed by entity id.
+ */
+function _field_invoke_multiple($op, $entity_type, $entities, &$a = NULL, &$b = NULL, $options = array()) {
+  // Merge default options.
+  $default_options = array(
+    'default' => FALSE,
+    'deleted' => FALSE,
+    'language' => NULL,
+  );
+  $options += $default_options;
+
+  $fields = array();
+  $grouped_instances = array();
+  $grouped_entities = array();
+  $grouped_items = array();
+  $return = array();
+
+  // Go through the entities and collect the fields on which the hook should be
+  // invoked.
+  //
+  // We group fields by id, not by name, because this function can operate on
+  // deleted fields which may have non-unique names. However, entities can only
+  // contain data for a single field for each name, even if that field
+  // is deleted, so we reference field data via the
+  // $entity->$field_name property.
+  foreach ($entities as $entity) {
+    // Determine the list of instances to iterate on.
+    list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+    $instances = _field_invoke_get_instances($entity_type, $bundle, $options);
+
+    foreach ($instances as $instance) {
+      $field_id = $instance['field_id'];
+      $field_name = $instance['field_name'];
+      $field = field_info_field_by_id($field_id);
+      $function = $options['default'] ? 'field_default_' . $op : $field['module'] . '_field_' . $op;
+      if (function_exists($function)) {
+        // Add the field to the list of fields to invoke the hook on.
+        if (!isset($fields[$field_id])) {
+          $fields[$field_id] = $field;
+        }
+        // Extract the field values into a separate variable, easily accessed
+        // by hook implementations.
+        // Unless a language suggestion is provided we iterate on all the
+        // available languages.
+        $available_languages = field_available_languages($entity_type, $field);
+        $language = !empty($options['language'][$id]) ? $options['language'][$id] : $options['language'];
+        $languages = _field_language_suggestion($available_languages, $language, $field_name);
+        foreach ($languages as $langcode) {
+          $grouped_items[$field_id][$langcode][$id] = isset($entity->{$field_name}[$langcode]) ? $entity->{$field_name}[$langcode] : array();
+          // Group the instances and entities corresponding to the current
+          // field.
+          $grouped_instances[$field_id][$langcode][$id] = $instance;
+          $grouped_entities[$field_id][$langcode][$id] = $entities[$id];
+        }
+      }
+    }
+    // Initialize the return value for each entity.
+    $return[$id] = array();
+  }
+
+  // For each field, invoke the field hook and collect results.
+  foreach ($fields as $field_id => $field) {
+    $field_name = $field['field_name'];
+    $function = $options['default'] ? 'field_default_' . $op : $field['module'] . '_field_' . $op;
+    // Iterate over all the field translations.
+    foreach ($grouped_items[$field_id] as $langcode => &$items) {
+      $entities = $grouped_entities[$field_id][$langcode];
+      $instances = $grouped_instances[$field_id][$langcode];
+      $results = $function($entity_type, $entities, $field, $instances, $langcode, $items, $a, $b);
+      if (isset($results)) {
+        // Collect results by entity.
+        // For hooks with array results, we merge results together.
+        // For hooks with scalar results, we collect results in an array.
+        foreach ($results as $id => $result) {
+          if (is_array($result)) {
+            $return[$id] = array_merge($return[$id], $result);
+          }
+          else {
+            $return[$id][] = $result;
+          }
+        }
+      }
+    }
+
+    // Populate field values back in the entities, but avoid replacing missing
+    // fields with an empty array (those are not equivalent on update).
+    foreach ($grouped_entities[$field_id] as $langcode => $entities) {
+      foreach ($entities as $id => $entity) {
+        if ($grouped_items[$field_id][$langcode][$id] !== array() || isset($entity->{$field_name}[$langcode])) {
+          $entity->{$field_name}[$langcode] = $grouped_items[$field_id][$langcode][$id];
+        }
+      }
+    }
+  }
+
+  return $return;
+}
+
+/**
+ * Invoke field.module's version of a field hook.
+ *
+ * This function invokes the field_default_[op]() function.
+ * Use _field_invoke() to invoke the field type implementation,
+ * hook_field_[op]().
+ *
+ * @see _field_invoke()
+ */
+function _field_invoke_default($op, $entity_type, $entity, &$a = NULL, &$b = NULL, $options = array()) {
+  $options['default'] = TRUE;
+  return _field_invoke($op, $entity_type, $entity, $a, $b, $options);
+}
+
+/**
+ * Invoke field.module's version of a field hook on multiple entities.
+ *
+ * This function invokes the field_default_[op]() function.
+ * Use _field_invoke_multiple() to invoke the field type implementation,
+ * hook_field_[op]().
+ *
+ * @see _field_invoke_multiple()
+ */
+function _field_invoke_multiple_default($op, $entity_type, $entities, &$a = NULL, &$b = NULL, $options = array()) {
+  $options['default'] = TRUE;
+  return _field_invoke_multiple($op, $entity_type, $entities, $a, $b, $options);
+}
+
+/**
+ * Helper for _field_invoke(): retrieves a list of instances to operate on.
+ *
+ * @param $entity_type
+ *   The entity type.
+ * @param $bundle
+ *   The bundle name.
+ * @param $options
+ *   An associative array of options, as provided to _field_invoke(). Only the
+ *   following keys are considered :
+ *   - deleted
+ *   - field_name
+ *   - field_id
+ *   See _field_invoke() for details.
+ *
+ * @return
+ *   The array of selected instance definitions.
+ */
+function _field_invoke_get_instances($entity_type, $bundle, $options) {
+  if ($options['deleted']) {
+    // Deleted fields are not included in field_info_instances(), and need to
+    // be fetched from the database with field_read_instances().
+    $params = array('entity_type' => $entity_type, 'bundle' => $bundle);
+    if (isset($options['field_id'])) {
+      // Single-field mode by field id: field_read_instances() does the filtering.
+      // Single-field mode by field name is not compatible with the 'deleted'
+      // option.
+      $params['field_id'] = $options['field_id'];
+    }
+    $instances = field_read_instances($params, array('include_deleted' => TRUE));
+  }
+  elseif (isset($options['field_name'])) {
+    // Single-field mode by field name: field_info_instance() does the
+    // filtering.
+    $instances = array(field_info_instance($entity_type, $options['field_name'], $bundle));
+  }
+  else {
+    $instances = field_info_instances($entity_type, $bundle);
+    if (isset($options['field_id'])) {
+      // Single-field mode by field id: we need to loop on each instance to
+      // find the right one.
+      foreach ($instances as $instance) {
+        if ($instance['field_id'] == $options['field_id']) {
+          $instances = array($instance);
+          break;
+        }
+      }
+    }
+  }
+
+  return $instances;
+}
+
+/**
+ * Add form elements for all fields for an entity to a form structure.
+ *
+ * The form elements for the entity's fields are added by reference as direct
+ * children in the $form parameter. This parameter can be a full form structure
+ * (most common case for entity edit forms), or a sub-element of a larger form.
+ *
+ * By default, submitted field values appear at the top-level of
+ * $form_state['values']. A different location within $form_state['values'] can
+ * be specified by setting the '#parents' property on the incoming $form
+ * parameter. Because of name clashes, two instances of the same field cannot
+ * appear within the same $form element, or within the same '#parents' space.
+ *
+ * For each call to field_attach_form(), field values are processed by calling
+ * field_attach_form_validate() and field_attach_submit() on the same $form
+ * element.
+ *
+ * Sample resulting structure in $form:
+ * @code
+ *   '#parents' => The location of field values in $form_state['values'],
+ *   '#entity_type' => The name of the entity type,
+ *   '#bundle' => The name of the bundle,
+ *   // One sub-array per field appearing in the entity, keyed by field name.
+ *   // The structure of the array differs slightly depending on whether the
+ *   // widget is 'single-value' (provides the input for one field value,
+ *   // most common case), and will therefore be repeated as many times as
+ *   // needed, or 'multiple-values' (one single widget allows the input of
+ *   // several values, e.g checkboxes, select box...).
+ *   // The sub-array is nested into a $langcode key where $langcode has the
+ *   // same value of the $langcode parameter above.
+ *   // The '#language' key holds the same value of $langcode and it is used
+ *   // to access the field sub-array when $langcode is unknown.
+ *   'field_foo' => array(
+ *     '#tree' => TRUE,
+ *     '#field_name' => The name of the field,
+ *     '#language' => $langcode,
+ *     $langcode => array(
+ *       '#field_name' => The name of the field,
+ *       '#language' => $langcode,
+ *       '#field_parents' => The 'parents' space for the field in the form,
+ *          equal to the #parents property of the $form parameter received by
+ *          field_attach_form(),
+ *       '#required' => Whether or not the field is required,
+ *       '#title' => The label of the field instance,
+ *       '#description' => The description text for the field instance,
+ *
+ *       // Only for 'single' widgets:
+ *       '#theme' => 'field_multiple_value_form',
+ *       '#cardinality' => The field cardinality,
+ *       // One sub-array per copy of the widget, keyed by delta.
+ *       0 => array(
+ *         '#entity_type' => The name of the entity type,
+ *         '#bundle' => The name of the bundle,
+ *         '#field_name' => The name of the field,
+ *         '#field_parents' => The 'parents' space for the field in the form,
+ *            equal to the #parents property of the $form parameter received by
+ *            field_attach_form(),
+ *         '#title' => The title to be displayed by the widget,
+ *         '#default_value' => The field value for delta 0,
+ *         '#required' => Whether the widget should be marked required,
+ *         '#delta' => 0,
+ *         '#columns' => The array of field columns,
+ *         // The remaining elements in the sub-array depend on the widget.
+ *         '#type' => The type of the widget,
+ *         ...
+ *       ),
+ *       1 => array(
+ *         ...
+ *       ),
+ *
+ *       // Only for multiple widgets:
+ *       '#entity_type' => The name of the entity type,
+ *       '#bundle' => $instance['bundle'],
+ *       '#columns'  => array_keys($field['columns']),
+ *       // The remaining elements in the sub-array depend on the widget.
+ *       '#type' => The type of the widget,
+ *       ...
+ *     ),
+ *     ...
+ *   ),
+ * )
+ * @endcode
+ *
+ * Additionally, some processing data is placed in $form_state, and can be
+ * accessed by field_form_get_state() and field_form_set_state().
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity for which to load form elements, used to initialize
+ *   default form values.
+ * @param $form
+ *   The form structure to fill in. This can be a full form structure, or a
+ *   sub-element of a larger form. The #parents property can be set to control
+ *   the location of submitted field values within $form_state['values']. If
+ *   not specified, $form['#parents'] is set to an empty array, placing field
+ *   values at the top-level of $form_state['values'].
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param $langcode
+ *   The language the field values are going to be entered, if no language
+ *   is provided the default site language will be used.
+ * @param array $options
+ *   An associative array of additional options. See _field_invoke() for
+ *   details.
+ *
+ * @see field_form_get_state()
+ * @see field_form_set_state()
+ */
+function field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode = NULL, $options = array()) {
+  // Validate $options since this is a new parameter added after Drupal 7 was
+  // released.
+  $options = is_array($options) ? $options : array();
+
+  // Set #parents to 'top-level' by default.
+  $form += array('#parents' => array());
+
+  // If no language is provided use the default site language.
+  $options['language'] = field_valid_language($langcode);
+  $form += (array) _field_invoke_default('form', $entity_type, $entity, $form, $form_state, $options);
+
+  // Add custom weight handling.
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+  $form['#pre_render'][] = '_field_extra_fields_pre_render';
+  $form['#entity_type'] = $entity_type;
+  $form['#bundle'] = $bundle;
+
+  // Let other modules make changes to the form.
+  // Avoid module_invoke_all() to let parameters be taken by reference.
+  foreach (module_implements('field_attach_form') as $module) {
+    $function = $module . '_field_attach_form';
+    $function($entity_type, $entity, $form, $form_state, $langcode);
+  }
+}
+
+/**
+ * Loads fields for the current revisions of a group of entities.
+ *
+ * Loads all fields for each entity object in a group of a single entity type.
+ * The loaded field values are added directly to the entity objects.
+ *
+ * field_attach_load() is automatically called by the default entity controller
+ * class, and thus, in most cases, doesn't need to be explicitly called by the
+ * entity type module.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g., 'node' or 'user'.
+ * @param $entities
+ *   An array of entities for which to load fields, keyed by entity ID.
+ *   Each entity needs to have its 'bundle', 'id' and (if applicable)
+ *   'revision' keys filled in. The function adds the loaded field data
+ *   directly in the entity objects of the $entities array.
+ * @param $age
+ *   FIELD_LOAD_CURRENT to load the most recent revision for all
+ *   fields, or FIELD_LOAD_REVISION to load the version indicated by
+ *   each entity. Defaults to FIELD_LOAD_CURRENT; use
+ *   field_attach_load_revision() instead of passing FIELD_LOAD_REVISION.
+ * @param $options
+ *   An associative array of additional options, with the following keys:
+ *   - 'field_id': The field ID that should be loaded, instead of
+ *     loading all fields, for each entity. Note that returned entities
+ *     may contain data for other fields, for example if they are read
+ *     from a cache.
+ *   - 'deleted': If TRUE, the function will operate on deleted fields
+ *     as well as non-deleted fields. If unset or FALSE, only
+ *     non-deleted fields are operated on.
+ */
+function field_attach_load($entity_type, $entities, $age = FIELD_LOAD_CURRENT, $options = array()) {
+  $load_current = $age == FIELD_LOAD_CURRENT;
+
+  // Merge default options.
+  $default_options = array(
+    'deleted' => FALSE,
+  );
+  $options += $default_options;
+
+  $info = entity_get_info($entity_type);
+  // Only the most current revision of non-deleted fields for cacheable entity
+  // types can be cached.
+  $cache_read = $load_current && $info['field cache'] && empty($options['deleted']);
+  // In addition, do not write to the cache when loading a single field.
+  $cache_write = $cache_read && !isset($options['field_id']);
+
+  if (empty($entities)) {
+    return;
+  }
+
+  // Assume all entities will need to be queried. Entities found in the cache
+  // will be removed from the list.
+  $queried_entities = $entities;
+
+  // Fetch available entities from cache, if applicable.
+  if ($cache_read) {
+    // Build the list of cache entries to retrieve.
+    $cids = array();
+    foreach ($entities as $id => $entity) {
+      $cids[] = "field:$entity_type:$id";
+    }
+    $cache = cache_get_multiple($cids, 'cache_field');
+    // Put the cached field values back into the entities and remove them from
+    // the list of entities to query.
+    foreach ($entities as $id => $entity) {
+      $cid = "field:$entity_type:$id";
+      if (isset($cache[$cid])) {
+        unset($queried_entities[$id]);
+        foreach ($cache[$cid]->data as $field_name => $values) {
+          $entity->$field_name = $values;
+        }
+      }
+    }
+  }
+
+  // Fetch other entities from their storage location.
+  if ($queried_entities) {
+    // The invoke order is:
+    // - hook_field_storage_pre_load()
+    // - storage backend's hook_field_storage_load()
+    // - field-type module's hook_field_load()
+    // - hook_field_attach_load()
+
+    // Invoke hook_field_storage_pre_load(): let any module load field
+    // data before the storage engine, accumulating along the way.
+    $skip_fields = array();
+    foreach (module_implements('field_storage_pre_load') as $module) {
+      $function = $module . '_field_storage_pre_load';
+      $function($entity_type, $queried_entities, $age, $skip_fields, $options);
+    }
+
+    $instances = array();
+
+    // Collect the storage backends used by the remaining fields in the entities.
+    $storages = array();
+    foreach ($queried_entities as $entity) {
+      list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+      $instances = _field_invoke_get_instances($entity_type, $bundle, $options);
+
+      foreach ($instances as $instance) {
+        $field_name = $instance['field_name'];
+        $field_id = $instance['field_id'];
+        // Make sure all fields are present at least as empty arrays.
+        if (!isset($queried_entities[$id]->{$field_name})) {
+          $queried_entities[$id]->{$field_name} = array();
+        }
+        // Collect the storage backend if the field has not been loaded yet.
+        if (!isset($skip_fields[$field_id])) {
+          $field = field_info_field_by_id($field_id);
+          $storages[$field['storage']['type']][$field_id][] = $load_current ? $id : $vid;
+        }
+      }
+    }
+
+    // Invoke hook_field_storage_load() on the relevant storage backends.
+    foreach ($storages as $storage => $fields) {
+      $storage_info = field_info_storage_types($storage);
+      module_invoke($storage_info['module'], 'field_storage_load', $entity_type, $queried_entities, $age, $fields, $options);
+    }
+
+    // Invoke field-type module's hook_field_load().
+    $null = NULL;
+    _field_invoke_multiple('load', $entity_type, $queried_entities, $age, $null, $options);
+
+    // Invoke hook_field_attach_load(): let other modules act on loading the
+    // entity.
+    module_invoke_all('field_attach_load', $entity_type, $queried_entities, $age, $options);
+
+    // Build cache data.
+    if ($cache_write) {
+      foreach ($queried_entities as $id => $entity) {
+        $data = array();
+        list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+        $instances = field_info_instances($entity_type, $bundle);
+        foreach ($instances as $instance) {
+          $data[$instance['field_name']] = $queried_entities[$id]->{$instance['field_name']};
+        }
+        $cid = "field:$entity_type:$id";
+        cache_set($cid, $data, 'cache_field');
+      }
+    }
+  }
+}
+
+/**
+ * Load all fields for previous versions of a group of entities.
+ *
+ * Loading different versions of the same entities is not supported, and should
+ * be done by separate calls to the function.
+ *
+ * field_attach_load_revision() is automatically called by the default entity
+ * controller class, and thus, in most cases, doesn't need to be explicitly
+ * called by the entity type module.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entities
+ *   An array of entities for which to load fields, keyed by entity ID. Each
+ *   entity needs to have its 'bundle', 'id' and (if applicable) 'revision'
+ *   keys filled. The function adds the loaded field data directly in the
+ *   entity objects of the $entities array.
+ * @param $options
+ *   An associative array of additional options. See field_attach_load() for
+ *   details.
+ */
+function field_attach_load_revision($entity_type, $entities, $options = array()) {
+  return field_attach_load($entity_type, $entities, FIELD_LOAD_REVISION, $options);
+}
+
+/**
+ * Perform field validation against the field data in an entity.
+ *
+ * This function does not perform field widget validation on form
+ * submissions. It is intended to be called during API save
+ * operations. Use field_attach_form_validate() to validate form
+ * submissions.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity with fields to validate.
+ * @throws FieldValidationException
+ *   If validation errors are found, a FieldValidationException is thrown. The
+ *   'errors' property contains the array of errors, keyed by field name,
+ *   language and delta.
+ * @param array $options
+ *   An associative array of additional options. See _field_invoke() for
+ *   details.
+ */
+function field_attach_validate($entity_type, $entity, $options = array()) {
+  // Validate $options since this is a new parameter added after Drupal 7 was
+  // released.
+  $options = is_array($options) ? $options : array();
+
+  $errors = array();
+  // Check generic, field-type-agnostic errors first.
+  $null = NULL;
+  _field_invoke_default('validate', $entity_type, $entity, $errors, $null, $options);
+  // Check field-type specific errors.
+  _field_invoke('validate', $entity_type, $entity, $errors, $null, $options);
+
+  // Let other modules validate the entity.
+  // Avoid module_invoke_all() to let $errors be taken by reference.
+  foreach (module_implements('field_attach_validate') as $module) {
+    $function = $module . '_field_attach_validate';
+    $function($entity_type, $entity, $errors);
+  }
+
+  if ($errors) {
+    throw new FieldValidationException($errors);
+  }
+}
+
+/**
+ * Perform field validation against form-submitted field values.
+ *
+ * There are two levels of validation for fields in forms: widget
+ * validation, and field validation.
+ * - Widget validation steps are specific to a given widget's own form
+ *   structure and UI metaphors. They are executed through FAPI's
+ *   #element_validate property during normal form validation.
+ * - Field validation steps are common to a given field type, independently of
+ *   the specific widget being used in a given form. They are defined in the
+ *   field type's implementation of hook_field_validate().
+ *
+ * This function performs field validation in the context of a form
+ * submission. It converts field validation errors into form errors
+ * on the correct form elements. Fieldable entity types should call
+ * this function during their own form validation function.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity being submitted. The 'bundle', 'id' and (if applicable)
+ *   'revision' keys should be present. The actual field values will be read
+ *   from $form_state['values'].
+ * @param $form
+ *   The form structure where field elements are attached to. This might be a
+ *   full form structure, or a sub-element of a larger form.
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param array $options
+ *   An associative array of additional options. See _field_invoke() for
+ *   details.
+ */
+function field_attach_form_validate($entity_type, $entity, $form, &$form_state, $options = array()) {
+  // Validate $options since this is a new parameter added after Drupal 7 was
+  // released.
+  $options = is_array($options) ? $options : array();
+
+  // Extract field values from submitted values.
+  _field_invoke_default('extract_form_values', $entity_type, $entity, $form, $form_state);
+
+  // Perform field_level validation.
+  try {
+    field_attach_validate($entity_type, $entity, $options);
+  }
+  catch (FieldValidationException $e) {
+    // Pass field-level validation errors back to widgets for accurate error
+    // flagging.
+    foreach ($e->errors as $field_name => $field_errors) {
+      foreach ($field_errors as $langcode => $errors) {
+        $field_state = field_form_get_state($form['#parents'], $field_name, $langcode, $form_state);
+        $field_state['errors'] = $errors;
+        field_form_set_state($form['#parents'], $field_name, $langcode, $form_state, $field_state);
+      }
+    }
+    _field_invoke_default('form_errors', $entity_type, $entity, $form, $form_state, $options);
+  }
+}
+
+/**
+ * Perform necessary operations on field data submitted by a form.
+ *
+ * Currently, this accounts for drag-and-drop reordering of
+ * field values, and filtering of empty values.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity being submitted. The 'bundle', 'id' and (if applicable)
+ *   'revision' keys should be present. The actual field values will be read
+ *   from $form_state['values'].
+ * @param $form
+ *   The form structure where field elements are attached to. This might be a
+ *   full form structure, or a sub-element of a larger form.
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param array $options
+ *   An associative array of additional options. See _field_invoke() for
+ *   details.
+ */
+function field_attach_submit($entity_type, $entity, $form, &$form_state, $options = array()) {
+  // Validate $options since this is a new parameter added after Drupal 7 was
+  // released.
+  $options = is_array($options) ? $options : array();
+
+  // Extract field values from submitted values.
+  _field_invoke_default('extract_form_values', $entity_type, $entity, $form, $form_state, $options);
+
+  _field_invoke_default('submit', $entity_type, $entity, $form, $form_state, $options);
+
+  // Let other modules act on submitting the entity.
+  // Avoid module_invoke_all() to let $form_state be taken by reference.
+  foreach (module_implements('field_attach_submit') as $module) {
+    $function = $module . '_field_attach_submit';
+    $function($entity_type, $entity, $form, $form_state);
+  }
+}
+
+/**
+ * Perform necessary operations just before fields data get saved.
+ *
+ * We take no specific action here, we just give other
+ * modules the opportunity to act.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity with fields to process.
+ */
+function field_attach_presave($entity_type, $entity) {
+  _field_invoke('presave', $entity_type, $entity);
+
+  // Let other modules act on presaving the entity.
+  module_invoke_all('field_attach_presave', $entity_type, $entity);
+}
+
+/**
+ * Save field data for a new entity.
+ *
+ * The passed-in entity must already contain its id and (if applicable)
+ * revision id attributes.
+ * Default values (if any) will be saved for fields not present in the
+ * $entity.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity with fields to save.
+ * @return
+ *   Default values (if any) will be added to the $entity parameter for fields
+ *   it leaves unspecified.
+ */
+function field_attach_insert($entity_type, $entity) {
+  _field_invoke_default('insert', $entity_type, $entity);
+  _field_invoke('insert', $entity_type, $entity);
+
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  // Let any module insert field data before the storage engine, accumulating
+  // saved fields along the way.
+  $skip_fields = array();
+  foreach (module_implements('field_storage_pre_insert') as $module) {
+    $function = $module . '_field_storage_pre_insert';
+    $function($entity_type, $entity, $skip_fields);
+  }
+
+  // Collect the storage backends used by the remaining fields in the entities.
+  $storages = array();
+  foreach (field_info_instances($entity_type, $bundle) as $instance) {
+    $field = field_info_field_by_id($instance['field_id']);
+    $field_id = $field['id'];
+    $field_name = $field['field_name'];
+    if (!empty($entity->$field_name)) {
+      // Collect the storage backend if the field has not been written yet.
+      if (!isset($skip_fields[$field_id])) {
+        $storages[$field['storage']['type']][$field_id] = $field_id;
+      }
+    }
+  }
+
+  // Field storage backends save any remaining unsaved fields.
+  foreach ($storages as $storage => $fields) {
+    $storage_info = field_info_storage_types($storage);
+    module_invoke($storage_info['module'], 'field_storage_write', $entity_type, $entity, FIELD_STORAGE_INSERT, $fields);
+  }
+
+  // Let other modules act on inserting the entity.
+  module_invoke_all('field_attach_insert', $entity_type, $entity);
+
+  $entity_info = entity_get_info($entity_type);
+}
+
+/**
+ * Save field data for an existing entity.
+ *
+ * When calling this function outside an entity save operation be sure to
+ * clear caches for the entity:
+ * @code
+ * entity_get_controller($entity_type)->resetCache(array($entity_id))
+ * @endcode
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity with fields to save.
+ */
+function field_attach_update($entity_type, $entity) {
+  _field_invoke('update', $entity_type, $entity);
+
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  // Let any module update field data before the storage engine, accumulating
+  // saved fields along the way.
+  $skip_fields = array();
+  foreach (module_implements('field_storage_pre_update') as $module) {
+    $function = $module . '_field_storage_pre_update';
+    $function($entity_type, $entity, $skip_fields);
+  }
+
+  // Collect the storage backends used by the remaining fields in the entities.
+  $storages = array();
+  foreach (field_info_instances($entity_type, $bundle) as $instance) {
+    $field = field_info_field_by_id($instance['field_id']);
+    $field_id = $field['id'];
+    $field_name = $field['field_name'];
+    // Leave the field untouched if $entity comes with no $field_name property,
+    // but empty the field if it comes as a NULL value or an empty array.
+    // Function property_exists() is slower, so we catch the more frequent
+    // cases where it's an empty array with the faster isset().
+    if (isset($entity->$field_name) || property_exists($entity, $field_name)) {
+      // Collect the storage backend if the field has not been written yet.
+      if (!isset($skip_fields[$field_id])) {
+        $storages[$field['storage']['type']][$field_id] = $field_id;
+      }
+    }
+  }
+
+  // Field storage backends save any remaining unsaved fields.
+  foreach ($storages as $storage => $fields) {
+    $storage_info = field_info_storage_types($storage);
+    module_invoke($storage_info['module'], 'field_storage_write', $entity_type, $entity, FIELD_STORAGE_UPDATE, $fields);
+  }
+
+  // Let other modules act on updating the entity.
+  module_invoke_all('field_attach_update', $entity_type, $entity);
+
+  $entity_info = entity_get_info($entity_type);
+  if ($entity_info['field cache']) {
+    cache_clear_all("field:$entity_type:$id", 'cache_field');
+  }
+}
+
+/**
+ * Delete field data for an existing entity. This deletes all
+ * revisions of field data for the entity.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity whose field data to delete.
+ */
+function field_attach_delete($entity_type, $entity) {
+  _field_invoke('delete', $entity_type, $entity);
+
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  // Collect the storage backends used by the fields in the entities.
+  $storages = array();
+  foreach (field_info_instances($entity_type, $bundle) as $instance) {
+    $field = field_info_field_by_id($instance['field_id']);
+    $field_id = $field['id'];
+    $storages[$field['storage']['type']][$field_id] = $field_id;
+  }
+
+  // Field storage backends delete their data.
+  foreach ($storages as $storage => $fields) {
+    $storage_info = field_info_storage_types($storage);
+    module_invoke($storage_info['module'], 'field_storage_delete', $entity_type, $entity, $fields);
+  }
+
+  // Let other modules act on deleting the entity.
+  module_invoke_all('field_attach_delete', $entity_type, $entity);
+
+  $entity_info = entity_get_info($entity_type);
+  if ($entity_info['field cache']) {
+    cache_clear_all("field:$entity_type:$id", 'cache_field');
+  }
+}
+
+/**
+ * Delete field data for a single revision of an existing entity. The
+ * passed entity must have a revision id attribute.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity with fields to save.
+ */
+function field_attach_delete_revision($entity_type, $entity) {
+  _field_invoke('delete_revision', $entity_type, $entity);
+
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  // Collect the storage backends used by the fields in the entities.
+  $storages = array();
+  foreach (field_info_instances($entity_type, $bundle) as $instance) {
+    $field = field_info_field_by_id($instance['field_id']);
+    $field_id = $field['id'];
+    $storages[$field['storage']['type']][$field_id] = $field_id;
+  }
+
+  // Field storage backends delete their data.
+  foreach ($storages as $storage => $fields) {
+    $storage_info = field_info_storage_types($storage);
+    module_invoke($storage_info['module'], 'field_storage_delete_revision', $entity_type, $entity, $fields);
+  }
+
+  // Let other modules act on deleting the revision.
+  module_invoke_all('field_attach_delete_revision', $entity_type, $entity);
+}
+
+/**
+ * Prepare field data prior to display.
+ *
+ * This function lets field types and formatters load additional data
+ * needed for display that is not automatically loaded during
+ * field_attach_load(). It accepts an array of entities to allow query
+ * optimisation when displaying lists of entities.
+ *
+ * field_attach_prepare_view() and field_attach_view() are two halves
+ * of the same operation. It is safe to call
+ * field_attach_prepare_view() multiple times on the same entity
+ * before calling field_attach_view() on it, but calling any Field
+ * API operation on an entity between passing that entity to these two
+ * functions may yield incorrect results.
+ *
+ * @param $entity_type
+ *   The type of $entities; e.g. 'node' or 'user'.
+ * @param $entities
+ *   An array of entities, keyed by entity id.
+ * @param $view_mode
+ *   View mode, e.g. 'full', 'teaser'...
+ * @param $langcode
+ *   (Optional) The language the field values are to be shown in. If no language
+ *   is provided the current language is used.
+ * @param array $options
+ *   An associative array of additional options. See _field_invoke() for
+ *   details.
+ */
+function field_attach_prepare_view($entity_type, $entities, $view_mode, $langcode = NULL, $options = array()) {
+  // Validate $options since this is a new parameter added after Drupal 7 was
+  // released.
+  $options = is_array($options) ? $options : array();
+
+  $options['language'] = array();
+
+  // To ensure hooks are only run once per entity, only process items without
+  // the _field_view_prepared flag.
+  // @todo: resolve this more generally for both entity and field level hooks.
+  $prepare = array();
+  foreach ($entities as $id => $entity) {
+    if (empty($entity->_field_view_prepared)) {
+      // Add this entity to the items to be prepared.
+      $prepare[$id] = $entity;
+
+      // Determine the actual language to display for each field, given the
+      // languages available in the field data.
+      $options['language'][$id] = field_language($entity_type, $entity, NULL, $langcode);
+
+      // Mark this item as prepared.
+      $entity->_field_view_prepared = TRUE;
+    }
+  }
+
+  $null = NULL;
+  // First let the field types do their preparation.
+  _field_invoke_multiple('prepare_view', $entity_type, $prepare, $null, $null, $options);
+  // Then let the formatters do their own specific massaging.
+  // field_default_prepare_view() takes care of dispatching to the correct
+  // formatters according to the display settings for the view mode.
+  _field_invoke_multiple_default('prepare_view', $entity_type, $prepare, $view_mode, $null, $options);
+}
+
+/**
+ * Returns a renderable array for the fields on an entity.
+ *
+ * Each field is displayed according to the display options specified in the
+ * $instance definition for the given $view_mode.
+ *
+ * field_attach_prepare_view() and field_attach_view() are two halves
+ * of the same operation. It is safe to call
+ * field_attach_prepare_view() multiple times on the same entity
+ * before calling field_attach_view() on it, but calling any Field
+ * API operation on an entity between passing that entity to these two
+ * functions may yield incorrect results.
+ *
+ * Sample structure:
+ * @code
+ * array(
+ *   'field_foo' => array(
+ *     '#theme' => 'field',
+ *     '#title' => the label of the field instance,
+ *     '#label_display' => the label display mode,
+ *     '#object' => the fieldable entity being displayed,
+ *     '#entity_type' => the type of the entity being displayed,
+ *     '#language' => the language of the field values being displayed,
+ *     '#view_mode' => the view mode,
+ *     '#field_name' => the name of the field,
+ *     '#field_type' => the type of the field,
+ *     '#formatter' => the name of the formatter,
+ *     '#items' => the field values being displayed,
+ *     // The element's children are the formatted values returned by
+ *     // hook_field_formatter_view().
+ *   ),
+ * );
+ * @endcode
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity with fields to render.
+ * @param $view_mode
+ *   View mode, e.g. 'full', 'teaser'...
+ * @param $langcode
+ *   The language the field values are to be shown in. If no language is
+ *   provided the current language is used.
+ * @param array $options
+ *   An associative array of additional options. See _field_invoke() for
+ *   details.
+ * @return
+ *   A renderable array for the field values.
+ */
+function field_attach_view($entity_type, $entity, $view_mode, $langcode = NULL, $options = array()) {
+  // Validate $options since this is a new parameter added after Drupal 7 was
+  // released.
+  $options = is_array($options) ? $options : array();
+
+  // Determine the actual language to display for each field, given the
+  // languages available in the field data.
+  $display_language = field_language($entity_type, $entity, NULL, $langcode);
+  $options['language'] = $display_language;
+
+  // Invoke field_default_view().
+  $null = NULL;
+  $output = _field_invoke_default('view', $entity_type, $entity, $view_mode, $null, $options);
+
+  // Add custom weight handling.
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+  $output['#pre_render'][] = '_field_extra_fields_pre_render';
+  $output['#entity_type'] = $entity_type;
+  $output['#bundle'] = $bundle;
+
+  // Let other modules alter the renderable array.
+  $context = array(
+    'entity_type' => $entity_type,
+    'entity' => $entity,
+    'view_mode' => $view_mode,
+    'display' => $view_mode,
+    'language' => $langcode,
+  );
+  drupal_alter('field_attach_view', $output, $context);
+
+  // Reset the _field_view_prepared flag set in field_attach_prepare_view(),
+  // in case the same entity is displayed with different settings later in
+  // the request.
+  unset($entity->_field_view_prepared);
+
+  return $output;
+}
+
+/**
+ * Populate the template variables with the field values available for rendering.
+ *
+ * The $variables array will be populated with all the field instance values
+ * associated with the given entity type, keyed by field name; in case of
+ * translatable fields the language currently chosen for display will be
+ * selected.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity with fields to render.
+ * @param $element
+ *   The structured array containing the values ready for rendering.
+ * @param $variables
+ *   The variables array is passed by reference and will be populated with field
+ *   values.
+ */
+function field_attach_preprocess($entity_type, $entity, $element, &$variables) {
+  list(, , $bundle) = entity_extract_ids($entity_type, $entity);
+
+  foreach (field_info_instances($entity_type, $bundle) as $instance) {
+    $field_name = $instance['field_name'];
+    if (isset($element[$field_name]['#language'])) {
+      $langcode = $element[$field_name]['#language'];
+      $variables[$field_name] = isset($entity->{$field_name}[$langcode]) ? $entity->{$field_name}[$langcode] : NULL;
+    }
+  }
+
+  // Let other modules make changes to the $variables array.
+  $context = array(
+    'entity_type' => $entity_type,
+    'entity' => $entity,
+    'element' => $element,
+  );
+  drupal_alter('field_attach_preprocess', $variables, $context);
+}
+
+/**
+ * Prepares an entity for translation.
+ *
+ * This function is used to fill-in the form default values for Field API fields
+ * while performing entity translation. By default it copies all the source
+ * values in the given source language to the new entity and assigns them the
+ * target language.
+ *
+ * This is used as part of the 'per entity' translation pattern, which is
+ * implemented only for nodes by translation.module. Other entity types may be
+ * supported through contributed modules.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity to be prepared for translation.
+ * @param $langcode
+ *   The language the entity has to be translated in.
+ * @param $source_entity
+ *   The source entity holding the field values to be translated.
+ * @param $source_langcode
+ *   The source language from which translate.
+ */
+function field_attach_prepare_translation($entity_type, $entity, $langcode, $source_entity, $source_langcode) {
+  $options = array('language' => $langcode);
+  // Copy source field values into the entity to be prepared.
+  _field_invoke_default('prepare_translation', $entity_type, $entity, $source_entity, $source_langcode, $options);
+  // Let field types handle their own advanced translation pattern if needed.
+  _field_invoke('prepare_translation', $entity_type, $entity, $source_entity, $source_langcode, $options);
+  // Let other modules alter the entity translation.
+  $context = array(
+    'entity_type' => $entity_type,
+    'langcode' => $langcode,
+    'source_entity' => $source_entity,
+    'source_langcode' => $source_langcode,
+  );
+  drupal_alter('field_attach_prepare_translation', $entity, $context);
+}
+
+/**
+ * Notify field.module that a new bundle was created.
+ *
+ * The default SQL-based storage doesn't need to do anything about it, but
+ * others might.
+ *
+ * @param $entity_type
+ *   The entity type to which the bundle is bound.
+ * @param $bundle
+ *   The name of the newly created bundle.
+ */
+function field_attach_create_bundle($entity_type, $bundle) {
+  // Clear the cache.
+  field_cache_clear();
+
+  // Let other modules act on creating the bundle.
+  module_invoke_all('field_attach_create_bundle', $entity_type, $bundle);
+}
+
+/**
+ * Notify field.module that a bundle was renamed.
+ *
+ * @param $entity_type
+ *   The entity type to which the bundle is bound.
+ * @param $bundle_old
+ *   The previous name of the bundle.
+ * @param $bundle_new
+ *   The new name of the bundle.
+ */
+function field_attach_rename_bundle($entity_type, $bundle_old, $bundle_new) {
+  db_update('field_config_instance')
+    ->fields(array('bundle' => $bundle_new))
+    ->condition('entity_type', $entity_type)
+    ->condition('bundle', $bundle_old)
+    ->execute();
+
+  // Clear the cache.
+  field_cache_clear();
+
+  // Update bundle settings.
+  $settings = variable_get('field_bundle_settings_' . $entity_type . '__' . $bundle_old, array());
+  variable_set('field_bundle_settings_' . $entity_type . '__' . $bundle_new, $settings);
+  variable_del('field_bundle_settings_' . $entity_type . '__' . $bundle_old);
+
+  // Let other modules act on renaming the bundle.
+  module_invoke_all('field_attach_rename_bundle', $entity_type, $bundle_old, $bundle_new);
+}
+
+/**
+ * Notify field.module the a bundle was deleted.
+ *
+ * This deletes the data for the field instances as well as the field instances
+ * themselves. This function actually just marks the data and field instances
+ * and deleted, leaving the garbage collection for a separate process, because
+ * it is not always possible to delete this much data in a single page request
+ * (particularly since for some field types, the deletion is more than just a
+ * simple DELETE query).
+ *
+ * @param $entity_type
+ *   The entity type to which the bundle is bound.
+ * @param $bundle
+ *   The bundle to delete.
+ */
+function field_attach_delete_bundle($entity_type, $bundle) {
+  // First, delete the instances themselves. field_read_instances() must be
+  // used here since field_info_instances() does not return instances for
+  // disabled entity types or bundles.
+  $instances = field_read_instances(array('entity_type' => $entity_type, 'bundle' => $bundle), array('include_inactive' => 1));
+  foreach ($instances as $instance) {
+    field_delete_instance($instance);
+  }
+
+  // Clear the cache.
+  field_cache_clear();
+
+  // Clear bundle display settings.
+  variable_del('field_bundle_settings_' . $entity_type . '__' . $bundle);
+
+  // Let other modules act on deleting the bundle.
+  module_invoke_all('field_attach_delete_bundle', $entity_type, $bundle, $instances);
+}
+
+
+/**
+ * @} End of "defgroup field_attach".
+ */
diff --git a/htmltest/modules/field/field.crud.inc b/htmltest/modules/field/field.crud.inc
new file mode 100644
index 00000000..83863d6e
--- /dev/null
+++ b/htmltest/modules/field/field.crud.inc
@@ -0,0 +1,1010 @@
+<?php
+
+/**
+ * @file
+ * Field CRUD API, handling field and field instance creation and deletion.
+ */
+
+/**
+ * @defgroup field_crud Field CRUD API
+ * @{
+ * Create, update, and delete Field API fields, bundles, and instances.
+ *
+ * Modules use this API, often in hook_install(), to create custom
+ * data structures. UI modules will use it to create a user interface.
+ *
+ * The Field CRUD API uses
+ * @link field Field API data structures @endlink.
+ *
+ * See @link field Field API @endlink for information about the other parts of
+ * the Field API.
+ */
+
+/**
+ * Creates a field.
+ *
+ * This function does not bind the field to any bundle; use
+ * field_create_instance() for that.
+ *
+ * @param $field
+ *   A field definition array. The field_name and type properties are required.
+ *   Other properties, if omitted, will be given the following default values:
+ *   - cardinality: 1
+ *   - locked: FALSE
+ *   - indexes: the field-type indexes, specified by the field type's
+ *     hook_field_schema(). The indexes specified in $field are added
+ *     to those default indexes. It is possible to override the
+ *     definition of a field-type index by providing an index with the
+ *     same name, or to remove it by redefining it as an empty array
+ *     of columns. Overriding field-type indexes should be done
+ *     carefully, for it might seriously affect the site's performance.
+ *   - settings: each omitted setting is given the default value defined in
+ *     hook_field_info().
+ *   - storage:
+ *     - type: the storage backend specified in the 'field_storage_default'
+ *       system variable.
+ *     - settings: each omitted setting is given the default value specified in
+ *       hook_field_storage_info().
+ *
+ * @return
+ *   The $field array with the id property filled in.
+ *
+ * @throws FieldException
+ *
+ * See: @link field Field API data structures @endlink.
+ */
+function field_create_field($field) {
+  // Field name is required.
+  if (empty($field['field_name'])) {
+    throw new FieldException('Attempt to create an unnamed field.');
+  }
+  // Field type is required.
+  if (empty($field['type'])) {
+    throw new FieldException('Attempt to create a field with no type.');
+  }
+  // Field name cannot contain invalid characters.
+  if (!preg_match('/^[_a-z]+[_a-z0-9]*$/', $field['field_name'])) {
+    throw new FieldException('Attempt to create a field with invalid characters. Only lowercase alphanumeric characters and underscores are allowed, and only lowercase letters and underscore are allowed as the first character');
+  }
+
+  // Field name cannot be longer than 32 characters. We use drupal_strlen()
+  // because the DB layer assumes that column widths are given in characters,
+  // not bytes.
+  if (drupal_strlen($field['field_name']) > 32) {
+    throw new FieldException(t('Attempt to create a field with a name longer than 32 characters: %name',
+      array('%name' => $field['field_name'])));
+  }
+
+  // Ensure the field name is unique over active and disabled fields.
+  // We do not care about deleted fields.
+  $prior_field = field_read_field($field['field_name'], array('include_inactive' => TRUE));
+  if (!empty($prior_field)) {
+    $message = $prior_field['active']?
+      t('Attempt to create field name %name which already exists and is active.', array('%name' => $field['field_name'])):
+      t('Attempt to create field name %name which already exists, although it is inactive.', array('%name' => $field['field_name']));
+    throw new FieldException($message);
+  }
+
+  // Disallow reserved field names. This can't prevent all field name
+  // collisions with existing entity properties, but some is better
+  // than none.
+  foreach (entity_get_info() as $type => $info) {
+    if (in_array($field['field_name'], $info['entity keys'])) {
+      throw new FieldException(t('Attempt to create field name %name which is reserved by entity type %type.', array('%name' => $field['field_name'], '%type' => $type)));
+    }
+  }
+
+  $field += array(
+    'entity_types' => array(),
+    'cardinality' => 1,
+    'translatable' => FALSE,
+    'locked' => FALSE,
+    'settings' => array(),
+    'storage' => array(),
+    'deleted' => 0,
+  );
+
+  // Check that the field type is known.
+  $field_type = field_info_field_types($field['type']);
+  if (!$field_type) {
+    throw new FieldException(t('Attempt to create a field of unknown type %type.', array('%type' => $field['type'])));
+  }
+  // Create all per-field-type properties (needed here as long as we have
+  // settings that impact column definitions).
+  $field['settings'] += field_info_field_settings($field['type']);
+  $field['module'] = $field_type['module'];
+  $field['active'] = 1;
+
+  // Provide default storage.
+  $field['storage'] += array(
+    'type' => variable_get('field_storage_default', 'field_sql_storage'),
+    'settings' => array(),
+  );
+  // Check that the storage type is known.
+  $storage_type = field_info_storage_types($field['storage']['type']);
+  if (!$storage_type) {
+    throw new FieldException(t('Attempt to create a field with unknown storage type %type.', array('%type' => $field['storage']['type'])));
+  }
+  // Provide default storage settings.
+  $field['storage']['settings'] += field_info_storage_settings($field['storage']['type']);
+  $field['storage']['module'] = $storage_type['module'];
+  $field['storage']['active'] = 1;
+  // Collect storage information.
+  module_load_install($field['module']);
+  $schema = (array) module_invoke($field['module'], 'field_schema', $field);
+  $schema += array('columns' => array(), 'indexes' => array(), 'foreign keys' => array());
+  // 'columns' are hardcoded in the field type.
+  $field['columns'] = $schema['columns'];
+  // 'foreign keys' are hardcoded in the field type.
+  $field['foreign keys'] = $schema['foreign keys'];
+  // 'indexes' can be both hardcoded in the field type, and specified in the
+  // incoming $field definition.
+  $field += array(
+    'indexes' => array(),
+  );
+  $field['indexes'] += $schema['indexes'];
+
+  // The serialized 'data' column contains everything from $field that does not
+  // have its own column and is not automatically populated when the field is
+  // read.
+  $data = $field;
+  unset($data['columns'], $data['field_name'], $data['type'], $data['active'], $data['module'], $data['storage_type'], $data['storage_active'], $data['storage_module'], $data['locked'], $data['cardinality'], $data['deleted']);
+  // Additionally, do not save the 'bundles' property populated by
+  // field_info_field().
+  unset($data['bundles']);
+
+  $record = array(
+    'field_name' => $field['field_name'],
+    'type' => $field['type'],
+    'module' => $field['module'],
+    'active' => $field['active'],
+    'storage_type' => $field['storage']['type'],
+    'storage_module' => $field['storage']['module'],
+    'storage_active' => $field['storage']['active'],
+    'locked' => $field['locked'],
+    'data' => $data,
+    'cardinality' => $field['cardinality'],
+    'translatable' => $field['translatable'],
+    'deleted' => $field['deleted'],
+  );
+
+  // Store the field and get the id back.
+  drupal_write_record('field_config', $record);
+  $field['id'] = $record['id'];
+
+  // Invoke hook_field_storage_create_field after the field is
+  // complete (e.g. it has its id).
+  try {
+    // Invoke hook_field_storage_create_field after
+    // drupal_write_record() sets the field id.
+    module_invoke($storage_type['module'], 'field_storage_create_field', $field);
+  }
+  catch (Exception $e) {
+    // If storage creation failed, remove the field_config record before
+    // rethrowing the exception.
+    db_delete('field_config')
+      ->condition('id', $field['id'])
+      ->execute();
+    throw $e;
+  }
+
+  // Clear caches
+  field_cache_clear(TRUE);
+
+  // Invoke external hooks after the cache is cleared for API consistency.
+  module_invoke_all('field_create_field', $field);
+
+  return $field;
+}
+
+/**
+ * Updates a field.
+ *
+ * Any module may forbid any update for any reason. For example, the
+ * field's storage module might forbid an update if it would change
+ * the storage schema while data for the field exists. A field type
+ * module might forbid an update if it would change existing data's
+ * semantics, or if there are external dependencies on field settings
+ * that cannot be updated.
+ *
+ * @param $field
+ *   A field structure. $field['field_name'] must provided; it
+ *   identifies the field that will be updated to match this
+ *   structure. Any other properties of the field that are not
+ *   specified in $field will be left unchanged, so it is not
+ *   necessary to pass in a fully populated $field structure.
+ * @return
+ *   Throws a FieldException if the update cannot be performed.
+ * @see field_create_field()
+ */
+function field_update_field($field) {
+  // Check that the specified field exists.
+  $prior_field = field_read_field($field['field_name']);
+  if (empty($prior_field)) {
+    throw new FieldException('Attempt to update a non-existent field.');
+  }
+
+  // Use the prior field values for anything not specifically set by the new
+  // field to be sure that all values are set.
+  $field += $prior_field;
+  $field['settings'] += $prior_field['settings'];
+
+  // Some updates are always disallowed.
+  if ($field['type'] != $prior_field['type']) {
+    throw new FieldException("Cannot change an existing field's type.");
+  }
+  if ($field['entity_types'] != $prior_field['entity_types']) {
+    throw new FieldException("Cannot change an existing field's entity_types property.");
+  }
+  if ($field['storage']['type'] != $prior_field['storage']['type']) {
+    throw new FieldException("Cannot change an existing field's storage type.");
+  }
+
+  // Collect the new storage information, since what is in
+  // $prior_field may no longer be right.
+  module_load_install($field['module']);
+  $schema = (array) module_invoke($field['module'], 'field_schema', $field);
+  $schema += array('columns' => array(), 'indexes' => array(), 'foreign keys' => array());
+  // 'columns' are hardcoded in the field type.
+  $field['columns'] = $schema['columns'];
+  // 'foreign keys' are hardcoded in the field type.
+  $field['foreign keys'] = $schema['foreign keys'];
+  // 'indexes' can be both hardcoded in the field type, and specified in the
+  // incoming $field definition.
+  $field += array(
+    'indexes' => array(),
+  );
+  $field['indexes'] += $schema['indexes'];
+
+  $has_data = field_has_data($field);
+
+  // See if any module forbids the update by throwing an exception.
+  foreach (module_implements('field_update_forbid') as $module) {
+    $function = $module . '_field_update_forbid';
+    $function($field, $prior_field, $has_data);
+  }
+
+  // Tell the storage engine to update the field. Do this before
+  // saving the new definition since it still might fail.
+  $storage_type = field_info_storage_types($field['storage']['type']);
+  module_invoke($storage_type['module'], 'field_storage_update_field', $field, $prior_field, $has_data);
+
+  // Save the new field definition. @todo: refactor with
+  // field_create_field.
+
+  // The serialized 'data' column contains everything from $field that does not
+  // have its own column and is not automatically populated when the field is
+  // read.
+  $data = $field;
+  unset($data['columns'], $data['field_name'], $data['type'], $data['locked'], $data['module'], $data['cardinality'], $data['active'], $data['deleted']);
+  // Additionally, do not save the 'bundles' property populated by
+  // field_info_field().
+  unset($data['bundles']);
+
+  $field['data'] = $data;
+
+  // Store the field and create the id.
+  $primary_key = array('id');
+  drupal_write_record('field_config', $field, $primary_key);
+
+  // Clear caches
+  field_cache_clear(TRUE);
+
+  // Invoke external hooks after the cache is cleared for API consistency.
+  module_invoke_all('field_update_field', $field, $prior_field, $has_data);
+}
+
+/**
+ * Reads a single field record directly from the database.
+ *
+ * Generally, you should use the field_info_field() instead.
+ *
+ * This function will not return deleted fields. Use
+ * field_read_fields() instead for this purpose.
+ *
+ * @param $field_name
+ *   The field name to read.
+ * @param array $include_additional
+ *   The default behavior of this function is to not return a field that
+ *   is inactive. Setting
+ *   $include_additional['include_inactive'] to TRUE will override this
+ *   behavior.
+ * @return
+ *   A field definition array, or FALSE.
+ */
+function field_read_field($field_name, $include_additional = array()) {
+  $fields = field_read_fields(array('field_name' => $field_name), $include_additional);
+  return $fields ? current($fields) : FALSE;
+}
+
+/**
+ * Reads in fields that match an array of conditions.
+ *
+ * @param array $params
+ *   An array of conditions to match against. Keys are columns from the
+ *   'field_config' table, values are conditions to match. Additionally,
+ *   conditions on the 'entity_type' and 'bundle' columns from the
+ *   'field_config_instance' table are supported (select fields having an
+ *   instance on a given bundle).
+ * @param array $include_additional
+ *   The default behavior of this function is to not return fields that
+ *   are inactive or have been deleted. Setting
+ *   $include_additional['include_inactive'] or
+ *   $include_additional['include_deleted'] to TRUE will override this
+ *   behavior.
+ * @return
+ *   An array of fields matching $params. If
+ *   $include_additional['include_deleted'] is TRUE, the array is keyed
+ *   by field id, otherwise it is keyed by field name.
+ */
+function field_read_fields($params = array(), $include_additional = array()) {
+  $query = db_select('field_config', 'fc', array('fetch' => PDO::FETCH_ASSOC));
+  $query->fields('fc');
+
+  // Turn the conditions into a query.
+  foreach ($params as $key => $value) {
+    // Allow filtering on the 'entity_type' and 'bundle' columns of the
+    // field_config_instance table.
+    if ($key == 'entity_type' || $key == 'bundle') {
+      if (empty($fci_join)) {
+        $fci_join = $query->join('field_config_instance', 'fci', 'fc.id = fci.field_id');
+      }
+      $key = 'fci.' . $key;
+    }
+    else {
+      $key = 'fc.' . $key;
+    }
+
+    $query->condition($key, $value);
+  }
+
+  if (!isset($include_additional['include_inactive']) || !$include_additional['include_inactive']) {
+    $query
+      ->condition('fc.active', 1)
+      ->condition('fc.storage_active', 1);
+  }
+  $include_deleted = (isset($include_additional['include_deleted']) && $include_additional['include_deleted']);
+  if (!$include_deleted) {
+    $query->condition('fc.deleted', 0);
+  }
+
+  $fields = array();
+  $results = $query->execute();
+  foreach ($results as $record) {
+    $field = unserialize($record['data']);
+    $field['id'] = $record['id'];
+    $field['field_name'] = $record['field_name'];
+    $field['type'] = $record['type'];
+    $field['module'] = $record['module'];
+    $field['active'] = $record['active'];
+    $field['storage']['type'] = $record['storage_type'];
+    $field['storage']['module'] = $record['storage_module'];
+    $field['storage']['active'] = $record['storage_active'];
+    $field['locked'] = $record['locked'];
+    $field['cardinality'] = $record['cardinality'];
+    $field['translatable'] = $record['translatable'];
+    $field['deleted'] = $record['deleted'];
+
+    module_invoke_all('field_read_field', $field);
+
+    // Populate storage information.
+    module_load_install($field['module']);
+    $schema = (array) module_invoke($field['module'], 'field_schema', $field);
+    $schema += array('columns' => array(), 'indexes' => array());
+    $field['columns'] = $schema['columns'];
+
+    $field_name = $field['field_name'];
+    if ($include_deleted) {
+      $field_name = $field['id'];
+    }
+    $fields[$field_name] = $field;
+  }
+  return $fields;
+}
+
+/**
+ * Marks a field and its instances and data for deletion.
+ *
+ * @param $field_name
+ *   The field name to delete.
+ */
+function field_delete_field($field_name) {
+  // Delete all non-deleted instances.
+  $field = field_info_field($field_name);
+  if (isset($field['bundles'])) {
+    foreach ($field['bundles'] as $entity_type => $bundles) {
+      foreach ($bundles as $bundle) {
+        $instance = field_info_instance($entity_type, $field_name, $bundle);
+        field_delete_instance($instance, FALSE);
+      }
+    }
+  }
+
+  // Mark field data for deletion.
+  module_invoke($field['storage']['module'], 'field_storage_delete_field', $field);
+
+  // Mark the field for deletion.
+  db_update('field_config')
+    ->fields(array('deleted' => 1))
+    ->condition('field_name', $field_name)
+    ->execute();
+
+  // Clear the cache.
+  field_cache_clear(TRUE);
+
+  module_invoke_all('field_delete_field', $field);
+}
+
+/**
+ * Creates an instance of a field, binding it to a bundle.
+ *
+ * @param $instance
+ *   A field instance definition array. The field_name, entity_type and
+ *   bundle properties are required. Other properties, if omitted,
+ *   will be given the following default values:
+ *   - label: the field name
+ *   - description: empty string
+ *   - required: FALSE
+ *   - default_value_function: empty string
+ *   - settings: each omitted setting is given the default value specified in
+ *     hook_field_info().
+ *   - widget:
+ *     - type: the default widget specified in hook_field_info().
+ *     - settings: each omitted setting is given the default value specified in
+ *       hook_field_widget_info().
+ *   - display:
+ *     Settings for the 'default' view mode will be added if not present, and
+ *     each view mode in the definition will be completed with the following
+ *     default values:
+ *     - label: 'above'
+ *     - type: the default formatter specified in hook_field_info().
+ *     - settings: each omitted setting is given the default value specified in
+ *       hook_field_formatter_info().
+ *     View modes not present in the definition are left empty, and the field
+ *     will not be displayed in this mode.
+ *
+ * @return
+ *   The $instance array with the id property filled in.
+ *
+ * @throws FieldException
+ *
+ * See: @link field Field API data structures @endlink.
+ */
+function field_create_instance($instance) {
+  $field = field_read_field($instance['field_name']);
+  if (empty($field)) {
+    throw new FieldException(t("Attempt to create an instance of a field @field_name that doesn't exist or is currently inactive.", array('@field_name' => $instance['field_name'])));
+  }
+  // Check that the required properties exists.
+  if (empty($instance['entity_type'])) {
+    throw new FieldException(t('Attempt to create an instance of field @field_name without an entity type.', array('@field_name' => $instance['field_name'])));
+  }
+  if (empty($instance['bundle'])) {
+    throw new FieldException(t('Attempt to create an instance of field @field_name without a bundle.', array('@field_name' => $instance['field_name'])));
+  }
+  // Check that the field can be attached to this entity type.
+  if (!empty($field['entity_types']) && !in_array($instance['entity_type'], $field['entity_types'])) {
+    throw new FieldException(t('Attempt to create an instance of field @field_name on forbidden entity type @entity_type.', array('@field_name' => $instance['field_name'], '@entity_type' => $instance['entity_type'])));
+  }
+
+  // Set the field id.
+  $instance['field_id'] = $field['id'];
+
+  // Note that we do *not* prevent creating a field on non-existing bundles,
+  // because that would break the 'Body as field' upgrade for contrib
+  // node types.
+
+  // TODO: Check that the widget type is known and can handle the field type ?
+  // TODO: Check that the formatters are known and can handle the field type ?
+  // TODO: Check that the display view modes are known for the entity type ?
+  // Those checks should probably happen in _field_write_instance() ?
+  // Problem : this would mean that a UI module cannot update an instance with a disabled formatter.
+
+  // Ensure the field instance is unique within the bundle.
+  // We only check for instances of active fields, since adding an instance of
+  // a disabled field is not supported.
+  $prior_instance = field_read_instance($instance['entity_type'], $instance['field_name'], $instance['bundle']);
+  if (!empty($prior_instance)) {
+    $message = t('Attempt to create an instance of field @field_name on bundle @bundle that already has an instance of that field.', array('@field_name' => $instance['field_name'], '@bundle' => $instance['bundle']));
+    throw new FieldException($message);
+  }
+
+  _field_write_instance($instance);
+
+  // Clear caches
+  field_cache_clear();
+
+  // Invoke external hooks after the cache is cleared for API consistency.
+  module_invoke_all('field_create_instance', $instance);
+
+  return $instance;
+}
+
+/**
+ * Updates an instance of a field.
+ *
+ * @param $instance
+ *   An associative array representing an instance structure. The following
+ *   required array elements specify which field instance is being updated:
+ *   - entity_type: The type of the entity the field is attached to.
+ *   - bundle: The bundle this field belongs to.
+ *   - field_name: The name of an existing field.
+ *   The other array elements represent properties of the instance, and all
+ *   properties must be specified or their default values will be used (except
+ *   internal-use properties, which are assigned automatically). To avoid
+ *   losing the previously stored properties of the instance when making a
+ *   change, first load the instance with field_info_instance(), then override
+ *   the values you want to override, and finally save using this function.
+ *   Example:
+ *   @code
+ *   // Fetch an instance info array.
+ *   $instance_info = field_info_instance($entity_type, $field_name, $bundle_name);
+ *   // Change a single property in the instance definition.
+ *   $instance_info['definition']['required'] = TRUE;
+ *   // Write the changed definition back.
+ *   field_update_instance($instance_info['definition']);
+ *   @endcode
+ *
+ * @throws FieldException
+ *
+ * @see field_info_instance()
+ * @see field_create_instance()
+ */
+function field_update_instance($instance) {
+  // Check that the specified field exists.
+  $field = field_read_field($instance['field_name']);
+  if (empty($field)) {
+    throw new FieldException(t('Attempt to update an instance of a nonexistent field @field.', array('@field' => $instance['field_name'])));
+  }
+
+  // Check that the field instance exists (even if it is inactive, since we
+  // want to be able to replace inactive widgets with new ones).
+  $prior_instance = field_read_instance($instance['entity_type'], $instance['field_name'], $instance['bundle'], array('include_inactive' => TRUE));
+  if (empty($prior_instance)) {
+    throw new FieldException(t("Attempt to update an instance of field @field on bundle @bundle that doesn't exist.", array('@field' => $instance['field_name'], '@bundle' => $instance['bundle'])));
+  }
+
+  $instance['id'] = $prior_instance['id'];
+  $instance['field_id'] = $prior_instance['field_id'];
+
+  _field_write_instance($instance, TRUE);
+
+  // Clear caches.
+  field_cache_clear();
+
+  module_invoke_all('field_update_instance', $instance, $prior_instance);
+}
+
+/**
+ * Stores an instance record in the field configuration database.
+ *
+ * @param $instance
+ *   An instance structure.
+ * @param $update
+ *   Whether this is a new or existing instance.
+ */
+function _field_write_instance($instance, $update = FALSE) {
+  $field = field_read_field($instance['field_name']);
+  $field_type = field_info_field_types($field['type']);
+
+  // Set defaults.
+  $instance += array(
+    'settings' => array(),
+    'display' => array(),
+    'widget' => array(),
+    'required' => FALSE,
+    'label' => $instance['field_name'],
+    'description' => '',
+    'deleted' => 0,
+  );
+
+  // Set default instance settings.
+  $instance['settings'] += field_info_instance_settings($field['type']);
+
+  // Set default widget and settings.
+  $instance['widget'] += array(
+    // TODO: what if no 'default_widget' specified ?
+    'type' => $field_type['default_widget'],
+    'settings' => array(),
+  );
+  // If no weight specified, make sure the field sinks at the bottom.
+  if (!isset($instance['widget']['weight'])) {
+    $max_weight = field_info_max_weight($instance['entity_type'], $instance['bundle'], 'form');
+    $instance['widget']['weight'] = isset($max_weight) ? $max_weight + 1 : 0;
+  }
+  // Check widget module.
+  $widget_type = field_info_widget_types($instance['widget']['type']);
+  $instance['widget']['module'] = $widget_type['module'];
+  $instance['widget']['settings'] += field_info_widget_settings($instance['widget']['type']);
+
+  // Make sure there are at least display settings for the 'default' view mode,
+  // and fill in defaults for each view mode specified in the definition.
+  $instance['display'] += array(
+    'default' => array(),
+  );
+  foreach ($instance['display'] as $view_mode => $display) {
+    $display += array(
+      'label' => 'above',
+      'type' => isset($field_type['default_formatter']) ? $field_type['default_formatter'] : 'hidden',
+      'settings' => array(),
+    );
+    if ($display['type'] != 'hidden') {
+      $formatter_type = field_info_formatter_types($display['type']);
+      $display['module'] = $formatter_type['module'];
+      $display['settings'] += field_info_formatter_settings($display['type']);
+    }
+    // If no weight specified, make sure the field sinks at the bottom.
+    if (!isset($display['weight'])) {
+      $max_weight = field_info_max_weight($instance['entity_type'], $instance['bundle'], $view_mode);
+      $display['weight'] = isset($max_weight) ? $max_weight + 1 : 0;
+    }
+    $instance['display'][$view_mode] = $display;
+  }
+
+  // The serialized 'data' column contains everything from $instance that does
+  // not have its own column and is not automatically populated when the
+  // instance is read.
+  $data = $instance;
+  unset($data['id'], $data['field_id'], $data['field_name'], $data['entity_type'], $data['bundle'], $data['deleted']);
+
+  $record = array(
+    'field_id' => $instance['field_id'],
+    'field_name' => $instance['field_name'],
+    'entity_type' => $instance['entity_type'],
+    'bundle' => $instance['bundle'],
+    'data' => $data,
+    'deleted' => $instance['deleted'],
+  );
+  // We need to tell drupal_update_record() the primary keys to trigger an
+  // update.
+  if ($update) {
+    $record['id'] = $instance['id'];
+    $primary_key = array('id');
+  }
+  else {
+    $primary_key = array();
+  }
+  drupal_write_record('field_config_instance', $record, $primary_key);
+}
+
+/**
+ * Reads a single instance record from the database.
+ *
+ * Generally, you should use field_info_instance() instead, as it
+ * provides caching and allows other modules the opportunity to
+ * append additional formatters, widgets, and other information.
+ *
+ * @param $entity_type
+ *   The type of entity to which the field is bound.
+ * @param $field_name
+ *   The field name to read.
+ * @param $bundle
+ *   The bundle to which the field is bound.
+ * @param array $include_additional
+ *   The default behavior of this function is to not return an instance that
+ *   has been deleted, or whose field is inactive. Setting
+ *   $include_additional['include_inactive'] or
+ *   $include_additional['include_deleted'] to TRUE will override this
+ *   behavior.
+ * @return
+ *   An instance structure, or FALSE.
+ */
+function field_read_instance($entity_type, $field_name, $bundle, $include_additional = array()) {
+  $instances = field_read_instances(array('entity_type' => $entity_type, 'field_name' => $field_name, 'bundle' => $bundle), $include_additional);
+  return $instances ? current($instances) : FALSE;
+}
+
+/**
+ * Reads in field instances that match an array of conditions.
+ *
+ * @param $param
+ *   An array of properties to use in selecting a field
+ *   instance. Valid keys include any column of the
+ *   field_config_instance table. If NULL, all instances will be returned.
+ * @param $include_additional
+ *   The default behavior of this function is to not return field
+ *   instances that have been marked deleted, or whose field is inactive.
+ *   Setting $include_additional['include_inactive'] or
+ *   $include_additional['include_deleted'] to TRUE will override this
+ *   behavior.
+ * @return
+ *   An array of instances matching the arguments.
+ */
+function field_read_instances($params = array(), $include_additional = array()) {
+  $include_inactive = isset($include_additional['include_inactive']) && $include_additional['include_inactive'];
+  $include_deleted = isset($include_additional['include_deleted']) && $include_additional['include_deleted'];
+
+  $query = db_select('field_config_instance', 'fci', array('fetch' => PDO::FETCH_ASSOC));
+  $query->join('field_config', 'fc', 'fc.id = fci.field_id');
+  $query->fields('fci');
+
+  // Turn the conditions into a query.
+  foreach ($params as $key => $value) {
+    $query->condition('fci.' . $key, $value);
+  }
+  if (!$include_inactive) {
+    $query
+      ->condition('fc.active', 1)
+      ->condition('fc.storage_active', 1);
+  }
+  if (!$include_deleted) {
+    $query->condition('fc.deleted', 0);
+    $query->condition('fci.deleted', 0);
+  }
+
+  $instances = array();
+  $results = $query->execute();
+
+  foreach ($results as $record) {
+    // Filter out instances on unknown entity types (for instance because the
+    // module exposing them was disabled).
+    $entity_info = entity_get_info($record['entity_type']);
+    if ($include_inactive || $entity_info) {
+      $instance = unserialize($record['data']);
+      $instance['id'] = $record['id'];
+      $instance['field_id'] = $record['field_id'];
+      $instance['field_name'] = $record['field_name'];
+      $instance['entity_type'] = $record['entity_type'];
+      $instance['bundle'] = $record['bundle'];
+      $instance['deleted'] = $record['deleted'];
+
+      module_invoke_all('field_read_instance', $instance);
+      $instances[] = $instance;
+    }
+  }
+  return $instances;
+}
+
+/**
+ * Marks a field instance and its data for deletion.
+ *
+ * @param $instance
+ *   An instance structure.
+ * @param $field_cleanup
+ *   If TRUE, the field will be deleted as well if its last instance is being
+ *   deleted. If FALSE, it is the caller's responsibility to handle the case of
+ *   fields left without instances. Defaults to TRUE.
+ */
+function field_delete_instance($instance, $field_cleanup = TRUE) {
+  // Mark the field instance for deletion.
+  db_update('field_config_instance')
+    ->fields(array('deleted' => 1))
+    ->condition('field_name', $instance['field_name'])
+    ->condition('entity_type', $instance['entity_type'])
+    ->condition('bundle', $instance['bundle'])
+    ->execute();
+
+  // Clear the cache.
+  field_cache_clear();
+
+  // Mark instance data for deletion.
+  $field = field_info_field($instance['field_name']);
+  module_invoke($field['storage']['module'], 'field_storage_delete_instance', $instance);
+
+  // Let modules react to the deletion of the instance.
+  module_invoke_all('field_delete_instance', $instance);
+
+  // Delete the field itself if we just deleted its last instance.
+  if ($field_cleanup && count($field['bundles']) == 0) {
+    field_delete_field($field['field_name']);
+  }
+}
+
+/**
+ * @} End of "defgroup field_crud".
+ */
+
+/**
+ * @defgroup field_purge Field API bulk data deletion
+ * @{
+ * Clean up after Field API bulk deletion operations.
+ *
+ * Field API provides functions for deleting data attached to individual
+ * entities as well as deleting entire fields or field instances in a single
+ * operation.
+ *
+ * Deleting field data items for an entity with field_attach_delete() involves
+ * three separate operations:
+ * - Invoking the Field Type API hook_field_delete() for each field on the
+ * entity. The hook for each field type receives the entity and the specific
+ * field being deleted. A file field module might use this hook to delete
+ * uploaded files from the filesystem.
+ * - Invoking the Field Storage API hook_field_storage_delete() to remove
+ * data from the primary field storage. The hook implementation receives the
+ * entity being deleted and deletes data for all of the entity's bundle's
+ * fields.
+ * - Invoking the global Field Attach API hook_field_attach_delete() for all
+ * modules that implement it. Each hook implementation receives the entity
+ * being deleted and can operate on whichever subset of the entity's bundle's
+ * fields it chooses to.
+ *
+ * These hooks are invoked immediately when field_attach_delete() is
+ * called. Similar operations are performed for field_attach_delete_revision().
+ *
+ * When a field, bundle, or field instance is deleted, it is not practical to
+ * invoke these hooks immediately on every affected entity in a single page
+ * request; there could be thousands or millions of them. Instead, the
+ * appropriate field data items, instances, and/or fields are marked as deleted
+ * so that subsequent load or query operations will not return them. Later, a
+ * separate process cleans up, or "purges", the marked-as-deleted data by going
+ * through the three-step process described above and, finally, removing
+ * deleted field and instance records.
+ *
+ * Purging field data is made somewhat tricky by the fact that, while
+ * field_attach_delete() has a complete entity to pass to the various deletion
+ * hooks, the Field API purge process only has the field data it has previously
+ * stored. It cannot reconstruct complete original entities to pass to the
+ * deletion hooks. It is even possible that the original entity to which some
+ * Field API data was attached has been itself deleted before the field purge
+ * operation takes place.
+ *
+ * Field API resolves this problem by using "pseudo-entities" during purge
+ * operations. A pseudo-entity contains only the information from the original
+ * entity that Field API knows about: entity type, id, revision id, and
+ * bundle. It also contains the field data for whichever field instance is
+ * currently being purged. For example, suppose that the node type 'story' used
+ * to contain a field called 'subtitle' but the field was deleted. If node 37
+ * was a story with a subtitle, the pseudo-entity passed to the purge hooks
+ * would look something like this:
+ *
+ * @code
+ *   $entity = stdClass Object(
+ *     [nid] => 37,
+ *     [vid] => 37,
+ *     [type] => 'story',
+ *     [subtitle] => array(
+ *       [0] => array(
+ *         'value' => 'subtitle text',
+ *       ),
+ *     ),
+ *   );
+ * @endcode
+ *
+ * See @link field Field API @endlink for information about the other parts of
+ * the Field API.
+ */
+
+/**
+ * Purges a batch of deleted Field API data, instances, or fields.
+ *
+ * This function will purge deleted field data in batches. The batch size
+ * is defined as an argument to the function, and once each batch is finished,
+ * it continues with the next batch until all have completed. If a deleted field
+ * instance with no remaining data records is found, the instance itself will
+ * be purged. If a deleted field with no remaining field instances is found, the
+ * field itself will be purged.
+ *
+ * @param $batch_size
+ *   The maximum number of field data records to purge before returning.
+ */
+function field_purge_batch($batch_size) {
+  // Retrieve all deleted field instances. We cannot use field_info_instances()
+  // because that function does not return deleted instances.
+  $instances = field_read_instances(array('deleted' => 1), array('include_deleted' => 1));
+
+  foreach ($instances as $instance) {
+    // field_purge_data() will need the field array.
+    $field = field_info_field_by_id($instance['field_id']);
+    // Retrieve some entities.
+    $query = new EntityFieldQuery();
+    $results = $query
+      ->fieldCondition($field)
+      ->entityCondition('bundle', $instance['bundle'])
+      ->deleted(TRUE)
+      ->range(0, $batch_size)
+      ->execute();
+
+    if ($results) {
+      foreach ($results as $entity_type => $stub_entities) {
+        field_attach_load($entity_type, $stub_entities, FIELD_LOAD_CURRENT, array('field_id' => $field['id'], 'deleted' => 1));
+        foreach ($stub_entities as $stub_entity) {
+          // Purge the data for the entity.
+          field_purge_data($entity_type, $stub_entity, $field, $instance);
+        }
+      }
+    }
+    else {
+      // No field data remains for the instance, so we can remove it.
+      field_purge_instance($instance);
+    }
+  }
+
+  // Retrieve all deleted fields. Any that have no instances can be purged.
+  $fields = field_read_fields(array('deleted' => 1), array('include_deleted' => 1));
+  foreach ($fields as $field) {
+    $instances = field_read_instances(array('field_id' => $field['id']), array('include_deleted' => 1));
+    if (empty($instances)) {
+      field_purge_field($field);
+    }
+  }
+}
+
+/**
+ * Purges the field data for a single field on a single pseudo-entity.
+ *
+ * This is basically the same as field_attach_delete() except it only applies
+ * to a single field. The entity itself is not being deleted, and it is quite
+ * possible that other field data will remain attached to it.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The pseudo-entity whose field data is being purged.
+ * @param $field
+ *   The (possibly deleted) field whose data is being purged.
+ * @param $instance
+ *   The deleted field instance whose data is being purged.
+ */
+function field_purge_data($entity_type, $entity, $field, $instance) {
+  // Each field type's hook_field_delete() only expects to operate on a single
+  // field at a time, so we can use it as-is for purging.
+  $options = array('field_id' => $instance['field_id'], 'deleted' => TRUE);
+  _field_invoke('delete', $entity_type, $entity, $dummy, $dummy, $options);
+
+  // Tell the field storage system to purge the data.
+  module_invoke($field['storage']['module'], 'field_storage_purge', $entity_type, $entity, $field, $instance);
+
+  // Let other modules act on purging the data.
+  foreach (module_implements('field_attach_purge') as $module) {
+    $function = $module . '_field_attach_purge';
+    $function($entity_type, $entity, $field, $instance);
+  }
+}
+
+/**
+ * Purges a field instance record from the database.
+ *
+ * This function assumes all data for the instance has already been purged, and
+ * should only be called by field_purge_batch().
+ *
+ * @param $instance
+ *   The instance record to purge.
+ */
+function field_purge_instance($instance) {
+  db_delete('field_config_instance')
+    ->condition('id', $instance['id'])
+    ->execute();
+
+  // Notify the storage engine.
+  $field = field_info_field_by_id($instance['field_id']);
+  module_invoke($field['storage']['module'], 'field_storage_purge_instance', $instance);
+
+  // Clear the cache.
+  field_info_cache_clear();
+
+  // Invoke external hooks after the cache is cleared for API consistency.
+  module_invoke_all('field_purge_instance', $instance);
+}
+
+/**
+ * Purges a field record from the database.
+ *
+ * This function assumes all instances for the field has already been purged,
+ * and should only be called by field_purge_batch().
+ *
+ * @param $field
+ *   The field record to purge.
+ */
+function field_purge_field($field) {
+  $instances = field_read_instances(array('field_id' => $field['id']), array('include_deleted' => 1));
+  if (count($instances) > 0) {
+    throw new FieldException(t('Attempt to purge a field @field_name that still has instances.', array('@field_name' => $field['field_name'])));
+  }
+
+  db_delete('field_config')
+    ->condition('id', $field['id'])
+    ->execute();
+
+  // Notify the storage engine.
+  module_invoke($field['storage']['module'], 'field_storage_purge_field', $field);
+
+  // Clear the cache.
+  field_info_cache_clear();
+
+  // Invoke external hooks after the cache is cleared for API consistency.
+  module_invoke_all('field_purge_field', $field);
+}
+
+/**
+ * @} End of "defgroup field_purge".
+ */
diff --git a/htmltest/modules/field/field.default.inc b/htmltest/modules/field/field.default.inc
new file mode 100644
index 00000000..cb49bdb8
--- /dev/null
+++ b/htmltest/modules/field/field.default.inc
@@ -0,0 +1,268 @@
+<?php
+
+/**
+ * @file
+ * Default 'implementations' of hook_field_*(): common field housekeeping.
+ *
+ * Those implementations are special, as field.module does not define any field
+ * types. Those functions take care of default stuff common to all field types.
+ * They are called through the _field_invoke_default() iterator, generally in
+ * the corresponding field_attach_[operation]() function.
+ */
+
+/**
+ * Extracts field values from submitted form values.
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entity
+ *   The entity for the operation.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instance
+ *   The instance structure for $field on $entity's bundle.
+ * @param $langcode
+ *   The language associated to $items.
+ * @param $items
+ *   The field values. This parameter is altered by reference to receive the
+ *   incoming form values.
+ * @param $form
+ *   The form structure where field elements are attached to. This might be a
+ *   full form structure, or a sub-element of a larger form.
+ * @param $form_state
+ *   The form state.
+ */
+function field_default_extract_form_values($entity_type, $entity, $field, $instance, $langcode, &$items, $form, &$form_state) {
+  $path = array_merge($form['#parents'], array($field['field_name'], $langcode));
+  $key_exists = NULL;
+  $values = drupal_array_get_nested_value($form_state['values'], $path, $key_exists);
+  if ($key_exists) {
+    // Remove the 'value' of the 'add more' button.
+    unset($values['add_more']);
+    $items = $values;
+  }
+}
+
+/**
+ * Generic field validation handler.
+ *
+ * Possible error codes:
+ * - 'field_cardinality': The number of values exceeds the field cardinality.
+ *
+ * @see _hook_field_validate()
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entity
+ *   The entity for the operation.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instance
+ *   The instance structure for $field on $entity's bundle.
+ * @param $langcode
+ *   The language associated to $items.
+ * @param $items
+ *   $entity->{$field['field_name']}[$langcode], or an empty array if unset.
+ * @param $errors
+ *   The array of errors, keyed by field name and by value delta, that have
+ *   already been reported for the entity. The function should add its errors
+ *   to this array. Each error is an associative array, with the following
+ *   keys and values:
+ *   - 'error': an error code (should be a string, prefixed with the module name)
+ *   - 'message': the human readable message to be displayed.
+ */
+function field_default_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
+  // Filter out empty values.
+  $items = _field_filter_items($field, $items);
+
+  // Check that the number of values doesn't exceed the field cardinality.
+  // For form submitted values, this can only happen with 'multiple value'
+  // widgets.
+  if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED && count($items) > $field['cardinality']) {
+    $errors[$field['field_name']][$langcode][0][] = array(
+      'error' => 'field_cardinality',
+      'message' => t('%name: this field cannot hold more than @count values.', array('%name' => $instance['label'], '@count' => $field['cardinality'])),
+    );
+  }
+}
+
+function field_default_submit($entity_type, $entity, $field, $instance, $langcode, &$items, $form, &$form_state) {
+  // Filter out empty values.
+  $items = _field_filter_items($field, $items);
+  // Reorder items to account for drag-n-drop reordering.
+  $items = _field_sort_items($field, $items);
+}
+
+/**
+ * Default field 'insert' operation.
+ *
+ * Insert default value if no $entity->$field_name entry was provided.
+ * This can happen with programmatic saves, or on form-based creation where
+ * the current user doesn't have 'edit' permission for the field.
+ */
+function field_default_insert($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  // _field_invoke() populates $items with an empty array if the $entity has no
+  // entry for the field, so we check on the $entity itself.
+  // We also check that the current field translation is actually defined before
+  // assigning it a default value. This way we ensure that only the intended
+  // languages get a default value. Otherwise we could have default values for
+  // not yet open languages.
+  if (empty($entity) || !property_exists($entity, $field['field_name']) ||
+    (isset($entity->{$field['field_name']}[$langcode]) && count($entity->{$field['field_name']}[$langcode]) == 0)) {
+    $items = field_get_default_value($entity_type, $entity, $field, $instance, $langcode);
+  }
+}
+
+/**
+ * Invokes hook_field_formatter_prepare_view() on the relevant formatters.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entities
+ *   An array of entities being displayed, keyed by entity id.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instances
+ *   Array of instance structures for $field for each entity, keyed by entity
+ *   id.
+ * @param $langcode
+ *   The language associated to $items.
+ * @param $items
+ *   Array of field values already loaded for the entities, keyed by entity id.
+ * @param $display
+ *   Can be either:
+ *   - the name of a view mode
+ *   - or an array of display settings to use for display, as found in the
+ *     'display' entry of $instance definitions.
+ */
+function field_default_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $display) {
+  // Group entities, instances and items by formatter module.
+  $modules = array();
+  foreach ($instances as $id => $instance) {
+    if (is_string($display)) {
+      $view_mode = $display;
+      $instance_display = field_get_display($instance, $view_mode, $entities[$id]);
+    }
+    else {
+      $instance_display = $display;
+    }
+
+    if ($instance_display['type'] !== 'hidden') {
+      $module = $instance_display['module'];
+      $modules[$module] = $module;
+      $grouped_entities[$module][$id] = $entities[$id];
+      $grouped_instances[$module][$id] = $instance;
+      $grouped_displays[$module][$id] = $instance_display;
+      // hook_field_formatter_prepare_view() alters $items by reference.
+      $grouped_items[$module][$id] = &$items[$id];
+    }
+  }
+
+  foreach ($modules as $module) {
+    // Invoke hook_field_formatter_prepare_view().
+    $function = $module . '_field_formatter_prepare_view';
+    if (function_exists($function)) {
+      $function($entity_type, $grouped_entities[$module], $field, $grouped_instances[$module], $langcode, $grouped_items[$module], $grouped_displays[$module]);
+    }
+  }
+}
+
+/**
+ * Builds a renderable array for one field on one entity instance.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   A single object of type $entity_type.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instance
+ *   An array containing each field on $entity's bundle.
+ * @param $langcode
+ *   The language associated to $items.
+ * @param $items
+ *   Array of field values already loaded for the entities, keyed by entity id.
+ * @param $display
+ *   Can be either:
+ *   - the name of a view mode;
+ *   - or an array of custom display settings, as found in the 'display' entry
+ *     of $instance definitions.
+ */
+function field_default_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  $addition = array();
+
+  // Prepare incoming display specifications.
+  if (is_string($display)) {
+    $view_mode = $display;
+    $display = field_get_display($instance, $view_mode, $entity);
+  }
+  else {
+    $view_mode = '_custom_display';
+  }
+
+  if ($display['type'] !== 'hidden') {
+    // Calling the formatter function through module_invoke() can have a
+    // performance impact on pages with many fields and values.
+    $function = $display['module'] . '_field_formatter_view';
+    if (function_exists($function)) {
+      $elements = $function($entity_type, $entity, $field, $instance, $langcode, $items, $display);
+
+      if ($elements) {
+        $info = array(
+          '#theme' => 'field',
+          '#weight' => $display['weight'],
+          '#title' => $instance['label'],
+          '#access' => field_access('view', $field, $entity_type, $entity),
+          '#label_display' => $display['label'],
+          '#view_mode' => $view_mode,
+          '#language' => $langcode,
+          '#field_name' => $field['field_name'],
+          '#field_type' => $field['type'],
+          '#field_translatable' => $field['translatable'],
+          '#entity_type' => $entity_type,
+          '#bundle' => $bundle,
+          '#object' => $entity,
+          '#items' => $items,
+          '#formatter' => $display['type']
+        );
+
+        $addition[$field['field_name']] = array_merge($info, $elements);
+      }
+    }
+  }
+
+  return $addition;
+}
+
+/**
+ * Copies source field values into the entity to be prepared.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g. 'node' or 'user'.
+ * @param $entity
+ *   The entity to be prepared for translation.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $instance
+ *   The instance structure for $field on $entity's bundle.
+ * @param $langcode
+ *   The language the entity has to be translated in.
+ * @param $items
+ *   $entity->{$field['field_name']}[$langcode], or an empty array if unset.
+ * @param $source_entity
+ *   The source entity holding the field values to be translated.
+ * @param $source_langcode
+ *   The source language from which translate.
+ */
+function field_default_prepare_translation($entity_type, $entity, $field, $instance, $langcode, &$items, $source_entity, $source_langcode) {
+  $field_name = $field['field_name'];
+  // If the field is untranslatable keep using LANGUAGE_NONE.
+  if ($langcode == LANGUAGE_NONE) {
+    $source_langcode = LANGUAGE_NONE;
+  }
+  if (isset($source_entity->{$field_name}[$source_langcode])) {
+    $items = $source_entity->{$field_name}[$source_langcode];
+  }
+}
diff --git a/htmltest/modules/field/field.form.inc b/htmltest/modules/field/field.form.inc
new file mode 100644
index 00000000..280f778f
--- /dev/null
+++ b/htmltest/modules/field/field.form.inc
@@ -0,0 +1,604 @@
+<?php
+
+/**
+ * @file
+ * Field forms management.
+ */
+
+/**
+ * Creates a form element for a field and can populate it with a default value.
+ *
+ * If the form element is not associated with an entity (i.e., $entity is NULL)
+ * field_get_default_value will be called to supply the default value for the
+ * field. Also allows other modules to alter the form element by implementing
+ * their own hooks.
+ *
+ * @param $entity_type
+ *   The type of entity (for example 'node' or 'user') that the field belongs
+ *   to.
+ * @param $entity
+ *   The entity object that the field belongs to. This may be NULL if creating a
+ *   form element with a default value.
+ * @param $field
+ *   An array representing the field whose editing element is being created.
+ * @param $instance
+ *   An array representing the structure for $field in its current context.
+ * @param $langcode
+ *   The language associated with the field.
+ * @param $items
+ *   An array of the field values. When creating a new entity this may be NULL
+ *   or an empty array to use default values.
+ * @param $form
+ *   An array representing the form that the editing element will be attached
+ *   to. 
+ * @param $form_state
+ *   An array containing the current state of the form.
+ * @param $get_delta
+ *   Used to get only a specific delta value of a multiple value field.
+ *
+ * @return
+ *  The form element array created for this field.
+ */
+function field_default_form($entity_type, $entity, $field, $instance, $langcode, $items, &$form, &$form_state, $get_delta = NULL) {
+  // This could be called with no entity, as when a UI module creates a
+  // dummy form to set default values.
+  if ($entity) {
+    list($id, , ) = entity_extract_ids($entity_type, $entity);
+  }
+
+  $parents = $form['#parents'];
+
+  $addition = array();
+  $field_name = $field['field_name'];
+  $addition[$field_name] = array();
+
+  // Populate widgets with default values when creating a new entity.
+  if (empty($items) && empty($id)) {
+    $items = field_get_default_value($entity_type, $entity, $field, $instance, $langcode);
+  }
+
+  // Let modules alter the widget properties.
+  $context = array(
+    'entity_type' => $entity_type,
+    'entity' => $entity,
+    'field' => $field,
+    'instance' => $instance,
+  );
+  drupal_alter(array('field_widget_properties', 'field_widget_properties_' . $entity_type), $instance['widget'], $context);
+
+  // Collect widget elements.
+  $elements = array();
+
+  // Store field information in $form_state.
+  if (!field_form_get_state($parents, $field_name, $langcode, $form_state)) {
+    $field_state = array(
+      'field' => $field,
+      'instance' => $instance,
+      'items_count' => count($items),
+      'array_parents' => array(),
+      'errors' => array(),
+    );
+    field_form_set_state($parents, $field_name, $langcode, $form_state, $field_state);
+  }
+
+  // If field module handles multiple values for this form element, and we are
+  // displaying an individual element, process the multiple value form.
+  if (!isset($get_delta) && field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_DEFAULT) {
+    // Store the entity in the form.
+    $form['#entity'] = $entity;
+    $elements = field_multiple_value_form($field, $instance, $langcode, $items, $form, $form_state);
+  }
+  // If the widget is handling multiple values (e.g Options), or if we are
+  // displaying an individual element, just get a single form element and make
+  // it the $delta value.
+  else {
+    $delta = isset($get_delta) ? $get_delta : 0;
+    $function = $instance['widget']['module'] . '_field_widget_form';
+    if (function_exists($function)) {
+      $element = array(
+        '#entity' => $entity,
+        '#entity_type' => $instance['entity_type'],
+        '#bundle' => $instance['bundle'],
+        '#field_name' => $field_name,
+        '#language' => $langcode,
+        '#field_parents' => $parents,
+        '#columns' => array_keys($field['columns']),
+        '#title' => check_plain($instance['label']),
+        '#description' => field_filter_xss($instance['description']),
+        // Only the first widget should be required.
+        '#required' => $delta == 0 && $instance['required'],
+        '#delta' => $delta,
+      );
+      if ($element = $function($form, $form_state, $field, $instance, $langcode, $items, $delta, $element)) {
+        // Allow modules to alter the field widget form element.
+        $context = array(
+          'form' => $form,
+          'field' => $field,
+          'instance' => $instance,
+          'langcode' => $langcode,
+          'items' => $items,
+          'delta' => $delta,
+        );
+        drupal_alter(array('field_widget_form', 'field_widget_' . $instance['widget']['type'] . '_form'), $element, $form_state, $context);
+
+        // If we're processing a specific delta value for a field where the
+        // field module handles multiples, set the delta in the result.
+        // For fields that handle their own processing, we can't make
+        // assumptions about how the field is structured, just merge in the
+        // returned element.
+        if (field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_DEFAULT) {
+          $elements[$delta] = $element;
+        }
+        else {
+          $elements = $element;
+        }
+      }
+    }
+  }
+
+  // Also aid in theming of field widgets by rendering a classified container.
+  $addition[$field_name] = array(
+    '#type' => 'container',
+    '#attributes' => array(
+      'class' => array(
+        'field-type-' . drupal_html_class($field['type']),
+        'field-name-' . drupal_html_class($field_name),
+        'field-widget-' . drupal_html_class($instance['widget']['type']),
+      ),
+    ),
+    '#weight' => $instance['widget']['weight'],
+  );
+
+  // Populate the 'array_parents' information in $form_state['field'] after
+  // the form is built, so that we catch changes in the form structure performed
+  // in alter() hooks.
+  $elements['#after_build'][] = 'field_form_element_after_build';
+  $elements['#field_name'] = $field_name;
+  $elements['#language'] = $langcode;
+  $elements['#field_parents'] = $parents;
+
+  $addition[$field_name] += array(
+    '#tree' => TRUE,
+    // The '#language' key can be used to access the field's form element
+    // when $langcode is unknown.
+    '#language' => $langcode,
+    $langcode => $elements,
+    '#access' => field_access('edit', $field, $entity_type, $entity),
+  );
+
+  return $addition;
+}
+
+/**
+ * Special handling to create form elements for multiple values.
+ *
+ * Handles generic features for multiple fields:
+ * - number of widgets
+ * - AHAH-'add more' button
+ * - drag-n-drop value reordering
+ */
+function field_multiple_value_form($field, $instance, $langcode, $items, &$form, &$form_state) {
+  $field_name = $field['field_name'];
+  $parents = $form['#parents'];
+
+  // Determine the number of widgets to display.
+  switch ($field['cardinality']) {
+    case FIELD_CARDINALITY_UNLIMITED:
+      $field_state = field_form_get_state($parents, $field_name, $langcode, $form_state);
+      $max = $field_state['items_count'];
+      break;
+
+    default:
+      $max = $field['cardinality'] - 1;
+      break;
+  }
+
+  $title = check_plain($instance['label']);
+  $description = field_filter_xss($instance['description']);
+
+  $id_prefix = implode('-', array_merge($parents, array($field_name)));
+  $wrapper_id = drupal_html_id($id_prefix . '-add-more-wrapper');
+
+  $field_elements = array();
+
+  $function = $instance['widget']['module'] . '_field_widget_form';
+  if (function_exists($function)) {
+    for ($delta = 0; $delta <= $max; $delta++) {
+      $multiple = $field['cardinality'] > 1 || $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED;
+      $element = array(
+        '#entity_type' => $instance['entity_type'],
+        '#entity' => $form['#entity'],
+        '#bundle' => $instance['bundle'],
+        '#field_name' => $field_name,
+        '#language' => $langcode,
+        '#field_parents' => $parents,
+        '#columns' => array_keys($field['columns']),
+        // For multiple fields, title and description are handled by the wrapping table.
+        '#title' => $multiple ? '' : $title,
+        '#description' => $multiple ? '' : $description,
+        // Only the first widget should be required.
+        '#required' => $delta == 0 && $instance['required'],
+        '#delta' => $delta,
+        '#weight' => $delta,
+      );
+      if ($element = $function($form, $form_state, $field, $instance, $langcode, $items, $delta, $element)) {
+        // Input field for the delta (drag-n-drop reordering).
+        if ($multiple) {
+          // We name the element '_weight' to avoid clashing with elements
+          // defined by widget.
+          $element['_weight'] = array(
+            '#type' => 'weight',
+            '#title' => t('Weight for row @number', array('@number' => $delta + 1)),
+            '#title_display' => 'invisible',
+             // Note: this 'delta' is the FAPI 'weight' element's property.
+            '#delta' => $max,
+            '#default_value' => isset($items[$delta]['_weight']) ? $items[$delta]['_weight'] : $delta,
+            '#weight' => 100,
+          );
+        }
+
+        // Allow modules to alter the field widget form element.
+        $context = array(
+          'form' => $form,
+          'field' => $field,
+          'instance' => $instance,
+          'langcode' => $langcode,
+          'items' => $items,
+          'delta' => $delta,
+        );
+        drupal_alter(array('field_widget_form', 'field_widget_' . $instance['widget']['type'] . '_form'), $element, $form_state, $context);
+
+        $field_elements[$delta] = $element;
+      }
+    }
+
+    if ($field_elements) {
+      $field_elements += array(
+        '#theme' => 'field_multiple_value_form',
+        '#field_name' => $field['field_name'],
+        '#cardinality' => $field['cardinality'],
+        '#title' => $title,
+        '#required' => $instance['required'],
+        '#description' => $description,
+        '#prefix' => '<div id="' . $wrapper_id . '">',
+        '#suffix' => '</div>',
+        '#max_delta' => $max,
+      );
+      // Add 'add more' button, if not working with a programmed form.
+      if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED && empty($form_state['programmed'])) {
+        $field_elements['add_more'] = array(
+          '#type' => 'submit',
+          '#name' => strtr($id_prefix, '-', '_') . '_add_more',
+          '#value' => t('Add another item'),
+          '#attributes' => array('class' => array('field-add-more-submit')),
+          '#limit_validation_errors' => array(array_merge($parents, array($field_name, $langcode))),
+          '#submit' => array('field_add_more_submit'),
+          '#ajax' => array(
+            'callback' => 'field_add_more_js',
+            'wrapper' => $wrapper_id,
+            'effect' => 'fade',
+          ),
+        );
+      }
+    }
+  }
+
+  return $field_elements;
+}
+
+/**
+ * Returns HTML for an individual form element.
+ *
+ * Combine multiple values into a table with drag-n-drop reordering.
+ * TODO : convert to a template.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: A render element representing the form element.
+ *
+ * @ingroup themeable
+ */
+function theme_field_multiple_value_form($variables) {
+  $element = $variables['element'];
+  $output = '';
+
+  if ($element['#cardinality'] > 1 || $element['#cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
+    $table_id = drupal_html_id($element['#field_name'] . '_values');
+    $order_class = $element['#field_name'] . '-delta-order';
+    $required = !empty($element['#required']) ? theme('form_required_marker', $variables) : '';
+
+    $header = array(
+      array(
+        'data' => '<label>' . t('!title !required', array('!title' => $element['#title'], '!required' => $required)) . "</label>",
+        'colspan' => 2,
+        'class' => array('field-label'),
+      ),
+      t('Order'),
+    );
+    $rows = array();
+
+    // Sort items according to '_weight' (needed when the form comes back after
+    // preview or failed validation)
+    $items = array();
+    foreach (element_children($element) as $key) {
+      if ($key === 'add_more') {
+        $add_more_button = &$element[$key];
+      }
+      else {
+        $items[] = &$element[$key];
+      }
+    }
+    usort($items, '_field_sort_items_value_helper');
+
+    // Add the items as table rows.
+    foreach ($items as $key => $item) {
+      $item['_weight']['#attributes']['class'] = array($order_class);
+      $delta_element = drupal_render($item['_weight']);
+      $cells = array(
+        array('data' => '', 'class' => array('field-multiple-drag')),
+        drupal_render($item),
+        array('data' => $delta_element, 'class' => array('delta-order')),
+      );
+      $rows[] = array(
+        'data' => $cells,
+        'class' => array('draggable'),
+      );
+    }
+
+    $output = '<div class="form-item">';
+    $output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => $table_id, 'class' => array('field-multiple-table'))));
+    $output .= $element['#description'] ? '<div class="description">' . $element['#description'] . '</div>' : '';
+    $output .= '<div class="clearfix">' . drupal_render($add_more_button) . '</div>';
+    $output .= '</div>';
+
+    drupal_add_tabledrag($table_id, 'order', 'sibling', $order_class);
+  }
+  else {
+    foreach (element_children($element) as $key) {
+      $output .= drupal_render($element[$key]);
+    }
+  }
+
+  return $output;
+}
+
+/**
+ * #after_build callback for field elements in a form.
+ *
+ * This stores the final location of the field within the form structure so
+ * that field_default_form_errors() can assign validation errors to the right
+ * form element.
+ *
+ * @see field_default_form_errors()
+ */
+function field_form_element_after_build($element, &$form_state) {
+  $parents = $element['#field_parents'];
+  $field_name = $element['#field_name'];
+  $langcode = $element['#language'];
+
+  $field_state = field_form_get_state($parents, $field_name, $langcode, $form_state);
+  $field_state['array_parents'] = $element['#array_parents'];
+  field_form_set_state($parents, $field_name, $langcode, $form_state, $field_state);
+
+  return $element;
+}
+
+/**
+ * Transfer field-level validation errors to widgets.
+ */
+function field_default_form_errors($entity_type, $entity, $field, $instance, $langcode, $items, $form, &$form_state) {
+  $field_state = field_form_get_state($form['#parents'], $field['field_name'], $langcode, $form_state);
+
+  if (!empty($field_state['errors'])) {
+    // Locate the correct element in the form.
+    $element = drupal_array_get_nested_value($form_state['complete form'], $field_state['array_parents']);
+    // Only set errors if the element is accessible.
+    if (!isset($element['#access']) || $element['#access']) {
+      $function = $instance['widget']['module'] . '_field_widget_error';
+      $function_exists = function_exists($function);
+
+      $multiple_widget = field_behaviors_widget('multiple values', $instance) != FIELD_BEHAVIOR_DEFAULT;
+      foreach ($field_state['errors'] as $delta => $delta_errors) {
+        // For multiple single-value widgets, pass errors by delta.
+        // For a multiple-value widget, pass all errors to the main widget.
+        $error_element = $multiple_widget ? $element : $element[$delta];
+        foreach ($delta_errors as $error) {
+          if ($function_exists) {
+            $function($error_element, $error, $form, $form_state);
+          }
+          else {
+            // Make sure that errors are reported (even incorrectly flagged) if
+            // the widget module fails to implement hook_field_widget_error().
+            form_error($error_element, $error['message']);
+          }
+        }
+      }
+      // Reinitialize the errors list for the next submit.
+      $field_state['errors'] = array();
+      field_form_set_state($form['#parents'], $field['field_name'], $langcode, $form_state, $field_state);
+    }
+  }
+}
+
+/**
+ * Submit handler for the "Add another item" button of a field form.
+ *
+ * This handler is run regardless of whether JS is enabled or not. It makes
+ * changes to the form state. If the button was clicked with JS disabled, then
+ * the page is reloaded with the complete rebuilt form. If the button was
+ * clicked with JS enabled, then ajax_form_callback() calls field_add_more_js()
+ * to return just the changed part of the form.
+ */
+function field_add_more_submit($form, &$form_state) {
+  $button = $form_state['triggering_element'];
+
+  // Go one level up in the form, to the widgets container.
+  $element = drupal_array_get_nested_value($form, array_slice($button['#array_parents'], 0, -1));
+  $field_name = $element['#field_name'];
+  $langcode = $element['#language'];
+  $parents = $element['#field_parents'];
+
+  // Increment the items count.
+  $field_state = field_form_get_state($parents, $field_name, $langcode, $form_state);
+  $field_state['items_count']++;
+  field_form_set_state($parents, $field_name, $langcode, $form_state, $field_state);
+
+  $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * Ajax callback in response to a new empty widget being added to the form.
+ *
+ * This returns the new page content to replace the page content made obsolete
+ * by the form submission.
+ *
+ * @see field_add_more_submit()
+ */
+function field_add_more_js($form, $form_state) {
+  $button = $form_state['triggering_element'];
+
+  // Go one level up in the form, to the widgets container.
+  $element = drupal_array_get_nested_value($form, array_slice($button['#array_parents'], 0, -1));
+  $field_name = $element['#field_name'];
+  $langcode = $element['#language'];
+  $parents = $element['#field_parents'];
+
+  $field_state = field_form_get_state($parents, $field_name, $langcode, $form_state);
+
+  $field = $field_state['field'];
+  if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED) {
+    return;
+  }
+
+  // Add a DIV around the delta receiving the Ajax effect.
+  $delta = $element['#max_delta'];
+  $element[$delta]['#prefix'] = '<div class="ajax-new-content">' . (isset($element[$delta]['#prefix']) ? $element[$delta]['#prefix'] : '');
+  $element[$delta]['#suffix'] = (isset($element[$delta]['#suffix']) ? $element[$delta]['#suffix'] : '') . '</div>';
+
+  return $element;
+}
+
+/**
+ * Retrieves processing information about a field from $form_state.
+ *
+ * @param $parents
+ *   The array of #parents where the field lives in the form.
+ * @param $field_name
+ *   The field name.
+ * @param $langcode
+ *   The language in which the field values are entered.
+ * @param $form_state
+ *   The form state.
+ *
+ * @return
+ *   An array with the following key/data pairs:
+ *   - field: the field definition array,
+ *   - instance: the field instance definition array,
+ *   - items_count: the number of widgets to display for the field,
+ *   - array_parents: the location of the field's widgets within the $form
+ *     structure. This entry is populated at '#after_build' time.
+ *   - errors: the array of field validation errors reported on the field. This
+ *     entry is populated at field_attach_form_validate() time.
+ *
+ * @see field_form_set_state()
+ */
+function field_form_get_state($parents, $field_name, $langcode, &$form_state) {
+  $form_state_parents = _field_form_state_parents($parents, $field_name, $langcode);
+  return drupal_array_get_nested_value($form_state, $form_state_parents);
+}
+
+/**
+ * Stores processing information about a field in $form_state.
+ *
+ * @param $parents
+ *   The array of #parents where the field lives in the form.
+ * @param $field_name
+ *   The field name.
+ * @param $langcode
+ *   The language in which the field values are entered.
+ * @param $form_state
+ *   The form state.
+ * @param $field_state
+ *   The array of data to store. See field_form_get_state() for the structure
+ *   and content of the array.
+ *
+ * @see field_form_get_state()
+ */
+function field_form_set_state($parents, $field_name, $langcode, &$form_state, $field_state) {
+  $form_state_parents = _field_form_state_parents($parents, $field_name, $langcode);
+  drupal_array_set_nested_value($form_state, $form_state_parents, $field_state);
+}
+
+/**
+ * Returns the location of processing information within $form_state.
+ */
+function _field_form_state_parents($parents, $field_name, $langcode) {
+  // To ensure backwards compatibility on regular entity forms for widgets that
+  // still access $form_state['field'][$field_name] directly,
+  // - top-level fields (empty $parents) are placed directly under
+  //   $form_state['fields'][$field_name].
+  // - Other fields are placed under
+  //   $form_state['field']['#parents'][...$parents...]['#fields'][$field_name]
+  //   to avoid clashes between field names and $parents parts.
+  // @todo Remove backwards compatibility in Drupal 8, and use a unique
+  // $form_state['field'][...$parents...]['#fields'][$field_name] structure.
+  if (!empty($parents)) {
+    $form_state_parents = array_merge(array('#parents'), $parents, array('#fields'));
+  }
+  else {
+    $form_state_parents = array();
+  }
+  $form_state_parents = array_merge(array('field'), $form_state_parents, array($field_name, $langcode));
+
+  return $form_state_parents;
+}
+
+/**
+ * Retrieves the field definition for a widget's helper callbacks.
+ *
+ * Widgets helper element callbacks (such as #process, #element_validate,
+ * #value_callback, ...) should use field_widget_field() and
+ * field_widget_instance() instead of field_info_field() and
+ * field_info_instance() when they need to access field or instance properties.
+ * See hook_field_widget_form() for more details.
+ *
+ * @param $element
+ *   The structured array for the widget.
+ * @param $form_state
+ *   The form state.
+ *
+ * @return
+ *   The $field definition array for the current widget.
+ *
+ * @see field_widget_instance()
+ * @see hook_field_widget_form()
+ */
+function field_widget_field($element, $form_state) {
+  $field_state = field_form_get_state($element['#field_parents'], $element['#field_name'], $element['#language'], $form_state);
+  return $field_state['field'];
+}
+
+/**
+ * Retrieves the instance definition array for a widget's helper callbacks.
+ *
+ * Widgets helper element callbacks (such as #process, #element_validate,
+ * #value_callback, ...) should use field_widget_field() and
+ * field_widget_instance() instead of field_info_field() and
+ * field_info_instance() when they need to access field or instance properties.
+ * See hook_field_widget_form() for more details.
+ *
+ * @param $element
+ *   The structured array for the widget.
+ * @param $form_state
+ *   The form state.
+ *
+ * @return
+ *   The $instance definition array for the current widget.
+ *
+ * @see field_widget_field()
+ * @see hook_field_widget_form()
+ */
+function field_widget_instance($element, $form_state) {
+  $field_state = field_form_get_state($element['#field_parents'], $element['#field_name'], $element['#language'], $form_state);
+  return $field_state['instance'];
+}
diff --git a/htmltest/modules/field/field.info b/htmltest/modules/field/field.info
new file mode 100644
index 00000000..3f6da3e1
--- /dev/null
+++ b/htmltest/modules/field/field.info
@@ -0,0 +1,18 @@
+name = Field
+description = Field API to add fields to entities like nodes and users.
+package = Core
+version = VERSION
+core = 7.x
+files[] = field.module
+files[] = field.attach.inc
+files[] = field.info.class.inc
+files[] = tests/field.test
+dependencies[] = field_sql_storage
+required = TRUE
+stylesheets[all][] = theme/field.css
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/field/field.info.class.inc b/htmltest/modules/field/field.info.class.inc
new file mode 100644
index 00000000..3b89898f
--- /dev/null
+++ b/htmltest/modules/field/field.info.class.inc
@@ -0,0 +1,668 @@
+<?php
+
+/*
+ * @file
+ * Definition of the FieldInfo class.
+ */
+
+/**
+ * Provides field and instance definitions for the current runtime environment.
+ *
+ * A FieldInfo object is created and statically persisted through the request
+ * by the _field_info_field_cache() function. The object properties act as a
+ * "static cache" of fields and instances definitions.
+ *
+ * The preferred way to access definitions is through the getBundleInstances()
+ * method, which keeps cache entries per bundle, storing both fields and
+ * instances for a given bundle. Fields used in multiple bundles are duplicated
+ * in several cache entries, and are merged into a single list in the memory
+ * cache. Cache entries are loaded for bundles as a whole, optimizing memory
+ * and CPU usage for the most common pattern of iterating over all instances of
+ * a bundle rather than accessing a single instance.
+ *
+ * The getFields() and getInstances() methods, which return all existing field
+ * and instance definitions, are kept mainly for backwards compatibility, and
+ * should be avoided when possible, since they load and persist in memory a
+ * potentially large array of information. In many cases, the lightweight
+ * getFieldMap() method should be preferred.
+ */
+class FieldInfo {
+
+  /**
+   * Lightweight map of fields across entity types and bundles.
+   *
+   * @var array
+   */
+  protected $fieldMap;
+
+  /**
+   * List of $field structures keyed by ID. Includes deleted fields.
+   *
+   * @var array
+   */
+  protected $fieldsById = array();
+
+  /**
+   * Mapping of field names to the ID of the corresponding non-deleted field.
+   *
+   * @var array
+   */
+  protected $fieldIdsByName = array();
+
+  /**
+   * Whether $fieldsById contains all field definitions or a subset.
+   *
+   * @var bool
+   */
+  protected $loadedAllFields = FALSE;
+
+  /**
+   * Separately tracks requested field names or IDs that do not exist.
+   *
+   * @var array
+   */
+  protected $unknownFields = array();
+
+  /**
+   * Instance definitions by bundle.
+   *
+   * @var array
+   */
+  protected $bundleInstances = array();
+
+  /**
+   * Whether $bundleInstances contains all instances definitions or a subset.
+   *
+   * @var bool
+   */
+  protected $loadedAllInstances = FALSE;
+
+  /**
+   * Separately tracks requested bundles that are empty (or do not exist).
+   *
+   * @var array
+   */
+  protected $emptyBundles = array();
+
+  /**
+   * Extra fields by bundle.
+   *
+   * @var array
+   */
+  protected $bundleExtraFields = array();
+
+  /**
+   * Clears the "static" and persistent caches.
+   */
+  public function flush() {
+    $this->fieldMap = NULL;
+
+    $this->fieldsById = array();
+    $this->fieldIdsByName = array();
+    $this->loadedAllFields = FALSE;
+    $this->unknownFields = array();
+
+    $this->bundleInstances = array();
+    $this->loadedAllInstances = FALSE;
+    $this->emptyBundles = array();
+
+    $this->bundleExtraFields = array();
+
+    cache_clear_all('field_info:', 'cache_field', TRUE);
+  }
+
+  /**
+   * Collects a lightweight map of fields across bundles.
+   *
+   * @return
+   *   An array keyed by field name. Each value is an array with two entries:
+   *   - type: The field type.
+   *   - bundles: The bundles in which the field appears, as an array with
+   *     entity types as keys and the array of bundle names as values.
+   */
+  public function getFieldMap() {
+    // Read from the "static" cache.
+    if ($this->fieldMap !== NULL) {
+      return $this->fieldMap;
+    }
+
+    // Read from persistent cache.
+    if ($cached = cache_get('field_info:field_map', 'cache_field')) {
+      $map = $cached->data;
+
+      // Save in "static" cache.
+      $this->fieldMap = $map;
+
+      return $map;
+    }
+
+    $map = array();
+
+    $query = db_query('SELECT fc.type, fci.field_name, fci.entity_type, fci.bundle FROM {field_config_instance} fci INNER JOIN {field_config} fc ON fc.id = fci.field_id WHERE fc.active = 1 AND fc.storage_active = 1 AND fc.deleted = 0 AND fci.deleted = 0');
+    foreach ($query as $row) {
+      $map[$row->field_name]['bundles'][$row->entity_type][] = $row->bundle;
+      $map[$row->field_name]['type'] = $row->type;
+    }
+
+    // Save in "static" and persistent caches.
+    $this->fieldMap = $map;
+    cache_set('field_info:field_map', $map, 'cache_field');
+
+    return $map;
+  }
+
+  /**
+   * Returns all active fields, including deleted ones.
+   *
+   * @return
+   *   An array of field definitions, keyed by field ID.
+   */
+  public function getFields() {
+    // Read from the "static" cache.
+    if ($this->loadedAllFields) {
+      return $this->fieldsById;
+    }
+
+    // Read from persistent cache.
+    if ($cached = cache_get('field_info:fields', 'cache_field')) {
+      $this->fieldsById = $cached->data;
+    }
+    else {
+      // Collect and prepare fields.
+      foreach (field_read_fields(array(), array('include_deleted' => TRUE)) as $field) {
+        $this->fieldsById[$field['id']] = $this->prepareField($field);
+      }
+
+      // Store in persistent cache.
+      cache_set('field_info:fields', $this->fieldsById, 'cache_field');
+    }
+
+    // Fill the name/ID map.
+    foreach ($this->fieldsById as $field) {
+      if (!$field['deleted']) {
+        $this->fieldIdsByName[$field['field_name']] = $field['id'];
+      }
+    }
+
+    $this->loadedAllFields = TRUE;
+
+    return $this->fieldsById;
+  }
+
+  /**
+   * Retrieves all active, non-deleted instances definitions.
+   *
+   * @param $entity_type
+   *   (optional) The entity type.
+   *
+   * @return
+   *   If $entity_type is not set, all instances keyed by entity type and bundle
+   *   name. If $entity_type is set, all instances for that entity type, keyed
+   *   by bundle name.
+   */
+  public function getInstances($entity_type = NULL) {
+    // If the full list is not present in "static" cache yet.
+    if (!$this->loadedAllInstances) {
+
+      // Read from persistent cache.
+      if ($cached = cache_get('field_info:instances', 'cache_field')) {
+        $this->bundleInstances = $cached->data;
+      }
+      else {
+        // Collect and prepare instances.
+
+        // We also need to populate the static field cache, since it will not
+        // be set by subsequent getBundleInstances() calls.
+        $this->getFields();
+
+        // Initialize empty arrays for all existing entity types and bundles.
+        // This is not strictly needed, but is done to preserve the behavior of
+        // field_info_instances() before http://drupal.org/node/1915646.
+        foreach (field_info_bundles() as $existing_entity_type => $bundles) {
+          foreach ($bundles as $bundle => $bundle_info) {
+            $this->bundleInstances[$existing_entity_type][$bundle] = array();
+          }
+        }
+
+        foreach (field_read_instances() as $instance) {
+          $field = $this->getField($instance['field_name']);
+          $instance = $this->prepareInstance($instance, $field['type']);
+          $this->bundleInstances[$instance['entity_type']][$instance['bundle']][$instance['field_name']] = $instance;
+        }
+
+        // Store in persistent cache.
+        cache_set('field_info:instances', $this->bundleInstances, 'cache_field');
+      }
+
+      $this->loadedAllInstances = TRUE;
+    }
+
+    if (isset($entity_type)) {
+      return isset($this->bundleInstances[$entity_type]) ? $this->bundleInstances[$entity_type] : array();
+    }
+    else {
+      return $this->bundleInstances;
+    }
+  }
+
+  /**
+   * Returns a field definition from a field name.
+   *
+   * This method only retrieves active, non-deleted fields.
+   *
+   * @param $field_name
+   *   The field name.
+   *
+   * @return
+   *   The field definition, or NULL if no field was found.
+   */
+  public function getField($field_name) {
+    // Read from the "static" cache.
+    if (isset($this->fieldIdsByName[$field_name])) {
+      $field_id = $this->fieldIdsByName[$field_name];
+      return $this->fieldsById[$field_id];
+    }
+    if (isset($this->unknownFields[$field_name])) {
+      return;
+    }
+
+    // Do not check the (large) persistent cache, but read the definition.
+
+    // Cache miss: read from definition.
+    if ($field = field_read_field($field_name)) {
+      $field = $this->prepareField($field);
+
+      // Save in the "static" cache.
+      $this->fieldsById[$field['id']] = $field;
+      $this->fieldIdsByName[$field['field_name']] = $field['id'];
+
+      return $field;
+    }
+    else {
+      $this->unknownFields[$field_name] = TRUE;
+    }
+  }
+
+  /**
+   * Returns a field definition from a field ID.
+   *
+   * This method only retrieves active fields, deleted or not.
+   *
+   * @param $field_id
+   *   The field ID.
+   *
+   * @return
+   *   The field definition, or NULL if no field was found.
+   */
+  public function getFieldById($field_id) {
+    // Read from the "static" cache.
+    if (isset($this->fieldsById[$field_id])) {
+      return $this->fieldsById[$field_id];
+    }
+    if (isset($this->unknownFields[$field_id])) {
+      return;
+    }
+
+    // No persistent cache, fields are only persistently cached as part of a
+    // bundle.
+
+    // Cache miss: read from definition.
+    if ($fields = field_read_fields(array('id' => $field_id), array('include_deleted' => TRUE))) {
+      $field = current($fields);
+      $field = $this->prepareField($field);
+
+      // Store in the static cache.
+      $this->fieldsById[$field['id']] = $field;
+      if (!$field['deleted']) {
+        $this->fieldIdsByName[$field['field_name']] = $field['id'];
+      }
+
+      return $field;
+    }
+    else {
+      $this->unknownFields[$field_id] = TRUE;
+    }
+  }
+
+  /**
+   * Retrieves the instances for a bundle.
+   *
+   * The function also populates the corresponding field definitions in the
+   * "static" cache.
+   *
+   * @param $entity_type
+   *   The entity type.
+   * @param $bundle
+   *   The bundle name.
+   *
+   * @return
+   *   The array of instance definitions, keyed by field name.
+   */
+  public function getBundleInstances($entity_type, $bundle) {
+    // Read from the "static" cache.
+    if (isset($this->bundleInstances[$entity_type][$bundle])) {
+      return $this->bundleInstances[$entity_type][$bundle];
+    }
+    if (isset($this->emptyBundles[$entity_type][$bundle])) {
+      return array();
+    }
+
+    // Read from the persistent cache.
+    if ($cached = cache_get("field_info:bundle:$entity_type:$bundle", 'cache_field')) {
+      $info = $cached->data;
+
+      // Extract the field definitions and save them in the "static" cache.
+      foreach ($info['fields'] as $field) {
+        if (!isset($this->fieldsById[$field['id']])) {
+          $this->fieldsById[$field['id']] = $field;
+          if (!$field['deleted']) {
+            $this->fieldIdsByName[$field['field_name']] = $field['id'];
+          }
+        }
+      }
+      unset($info['fields']);
+
+      // Store the instance definitions in the "static" cache'. Empty (or
+      // non-existent) bundles are stored separately, so that they do not
+      // pollute the global list returned by getInstances().
+      if ($info['instances']) {
+        $this->bundleInstances[$entity_type][$bundle] = $info['instances'];
+      }
+      else {
+        $this->emptyBundles[$entity_type][$bundle] = TRUE;
+      }
+
+      return $info['instances'];
+    }
+
+    // Cache miss: collect from the definitions.
+
+    $instances = array();
+
+    // Collect the fields in the bundle.
+    $params = array('entity_type' => $entity_type, 'bundle' => $bundle);
+    $fields = field_read_fields($params);
+
+    // This iterates on non-deleted instances, so deleted fields are kept out of
+    // the persistent caches.
+    foreach (field_read_instances($params) as $instance) {
+      $field = $fields[$instance['field_name']];
+
+      $instance = $this->prepareInstance($instance, $field['type']);
+      $instances[$field['field_name']] = $instance;
+
+      // If the field is not in our global "static" list yet, add it.
+      if (!isset($this->fieldsById[$field['id']])) {
+        $field = $this->prepareField($field);
+
+        $this->fieldsById[$field['id']] = $field;
+        $this->fieldIdsByName[$field['field_name']] = $field['id'];
+      }
+    }
+
+    // Store in the 'static' cache'. Empty (or non-existent) bundles are stored
+    // separately, so that they do not pollute the global list returned by
+    // getInstances().
+    if ($instances) {
+      $this->bundleInstances[$entity_type][$bundle] = $instances;
+    }
+    else {
+      $this->emptyBundles[$entity_type][$bundle] = TRUE;
+    }
+
+    // The persistent cache additionally contains the definitions of the fields
+    // involved in the bundle.
+    $cache = array(
+      'instances' => $instances,
+      'fields' => array()
+    );
+    foreach ($instances as $instance) {
+      $cache['fields'][] = $this->fieldsById[$instance['field_id']];
+    }
+    cache_set("field_info:bundle:$entity_type:$bundle", $cache, 'cache_field');
+
+    return $instances;
+  }
+
+  /**
+   * Retrieves the "extra fields" for a bundle.
+   *
+   * @param $entity_type
+   *   The entity type.
+   * @param $bundle
+   *   The bundle name.
+   *
+   * @return
+   *   The array of extra fields.
+   */
+  public function getBundleExtraFields($entity_type, $bundle) {
+    // Read from the "static" cache.
+    if (isset($this->bundleExtraFields[$entity_type][$bundle])) {
+      return $this->bundleExtraFields[$entity_type][$bundle];
+    }
+
+    // Read from the persistent cache.
+    if ($cached = cache_get("field_info:bundle_extra:$entity_type:$bundle", 'cache_field')) {
+      $this->bundleExtraFields[$entity_type][$bundle] = $cached->data;
+      return $this->bundleExtraFields[$entity_type][$bundle];
+    }
+
+    // Cache miss: read from hook_field_extra_fields(). Note: given the current
+    // shape of the hook, we have no other way than collecting extra fields on
+    // all bundles.
+    $info = array();
+    $extra = module_invoke_all('field_extra_fields');
+    drupal_alter('field_extra_fields', $extra);
+    // Merge in saved settings.
+    if (isset($extra[$entity_type][$bundle])) {
+      $info = $this->prepareExtraFields($extra[$entity_type][$bundle], $entity_type, $bundle);
+    }
+
+    // Store in the 'static' and persistent caches.
+    $this->bundleExtraFields[$entity_type][$bundle] = $info;
+    cache_set("field_info:bundle_extra:$entity_type:$bundle", $info, 'cache_field');
+
+    return $this->bundleExtraFields[$entity_type][$bundle];
+  }
+
+  /**
+   * Prepares a field definition for the current run-time context.
+   *
+   * @param $field
+   *   The raw field structure as read from the database.
+   *
+   * @return
+   *   The field definition completed for the current runtime context.
+   */
+  public function prepareField($field) {
+    // Make sure all expected field settings are present.
+    $field['settings'] += field_info_field_settings($field['type']);
+    $field['storage']['settings'] += field_info_storage_settings($field['storage']['type']);
+
+    // Add storage details.
+    $details = (array) module_invoke($field['storage']['module'], 'field_storage_details', $field);
+    drupal_alter('field_storage_details', $details, $field);
+    $field['storage']['details'] = $details;
+
+    // Populate the list of bundles using the field.
+    $field['bundles'] = array();
+    if (!$field['deleted']) {
+      $map = $this->getFieldMap();
+      if (isset($map[$field['field_name']])) {
+        $field['bundles'] = $map[$field['field_name']]['bundles'];
+      }
+    }
+
+    return $field;
+  }
+
+  /**
+   * Prepares an instance definition for the current run-time context.
+   *
+   * @param $instance
+   *   The raw instance structure as read from the database.
+   * @param $field_type
+   *   The field type.
+   *
+   * @return
+   *   The field instance array completed for the current runtime context.
+   */
+  public function prepareInstance($instance, $field_type) {
+    // Make sure all expected instance settings are present.
+    $instance['settings'] += field_info_instance_settings($field_type);
+
+    // Set a default value for the instance.
+    if (field_behaviors_widget('default value', $instance) == FIELD_BEHAVIOR_DEFAULT && !isset($instance['default_value'])) {
+      $instance['default_value'] = NULL;
+    }
+
+    // Prepare widget settings.
+    $instance['widget'] = $this->prepareInstanceWidget($instance['widget'], $field_type);
+
+    // Prepare display settings.
+    foreach ($instance['display'] as $view_mode => $display) {
+      $instance['display'][$view_mode] = $this->prepareInstanceDisplay($display, $field_type);
+    }
+
+    // Fall back to 'hidden' for view modes configured to use custom display
+    // settings, and for which the instance has no explicit settings.
+    $entity_info = entity_get_info($instance['entity_type']);
+    $view_modes = array_merge(array('default'), array_keys($entity_info['view modes']));
+    $view_mode_settings = field_view_mode_settings($instance['entity_type'], $instance['bundle']);
+    foreach ($view_modes as $view_mode) {
+      if ($view_mode == 'default' || !empty($view_mode_settings[$view_mode]['custom_settings'])) {
+        if (!isset($instance['display'][$view_mode])) {
+          $instance['display'][$view_mode] = array(
+            'type' => 'hidden',
+            'label' => 'above',
+            'settings' => array(),
+            'weight' => 0,
+          );
+        }
+      }
+    }
+
+    return $instance;
+  }
+
+  /**
+   * Prepares widget properties for the current run-time context.
+   *
+   * @param $widget
+   *   Widget specifications as found in $instance['widget'].
+   * @param $field_type
+   *   The field type.
+   *
+   * @return
+   *   The widget properties completed for the current runtime context.
+   */
+  public function prepareInstanceWidget($widget, $field_type) {
+    $field_type_info = field_info_field_types($field_type);
+
+    // Fill in default values.
+    $widget += array(
+      'type' => $field_type_info['default_widget'],
+      'settings' => array(),
+      'weight' => 0,
+    );
+
+    $widget_type_info = field_info_widget_types($widget['type']);
+    // Fall back to default formatter if formatter type is not available.
+    if (!$widget_type_info) {
+      $widget['type'] = $field_type_info['default_widget'];
+      $widget_type_info = field_info_widget_types($widget['type']);
+    }
+    $widget['module'] = $widget_type_info['module'];
+    // Fill in default settings for the widget.
+    $widget['settings'] += field_info_widget_settings($widget['type']);
+
+    return $widget;
+  }
+
+  /**
+   * Adapts display specifications to the current run-time context.
+   *
+   * @param $display
+   *   Display specifications as found in $instance['display']['a_view_mode'].
+   * @param $field_type
+   *   The field type.
+   *
+   * @return
+   *   The display properties completed for the current runtime context.
+   */
+  public function prepareInstanceDisplay($display, $field_type) {
+    $field_type_info = field_info_field_types($field_type);
+
+    // Fill in default values.
+    $display += array(
+      'label' => 'above',
+      'type' => $field_type_info['default_formatter'],
+      'settings' => array(),
+      'weight' => 0,
+    );
+    if ($display['type'] != 'hidden') {
+      $formatter_type_info = field_info_formatter_types($display['type']);
+      // Fall back to default formatter if formatter type is not available.
+      if (!$formatter_type_info) {
+        $display['type'] = $field_type_info['default_formatter'];
+        $formatter_type_info = field_info_formatter_types($display['type']);
+      }
+      $display['module'] = $formatter_type_info['module'];
+      // Fill in default settings for the formatter.
+      $display['settings'] += field_info_formatter_settings($display['type']);
+    }
+
+    return $display;
+  }
+
+  /**
+   * Prepares 'extra fields' for the current run-time context.
+   *
+   * @param $extra_fields
+   *   The array of extra fields, as collected in hook_field_extra_fields().
+   * @param $entity_type
+   *   The entity type.
+   * @param $bundle
+   *   The bundle name.
+   *
+   * @return
+   *   The list of extra fields completed for the current runtime context.
+   */
+  public function prepareExtraFields($extra_fields, $entity_type, $bundle) {
+    $entity_type_info = entity_get_info($entity_type);
+    $bundle_settings = field_bundle_settings($entity_type, $bundle);
+    $extra_fields += array('form' => array(), 'display' => array());
+
+    $result = array();
+    // Extra fields in forms.
+    foreach ($extra_fields['form'] as $name => $field_data) {
+      $settings = isset($bundle_settings['extra_fields']['form'][$name]) ? $bundle_settings['extra_fields']['form'][$name] : array();
+      if (isset($settings['weight'])) {
+        $field_data['weight'] = $settings['weight'];
+      }
+      $result['form'][$name] = $field_data;
+    }
+
+    // Extra fields in displayed entities.
+    $data = $extra_fields['display'];
+    foreach ($extra_fields['display'] as $name => $field_data) {
+      $settings = isset($bundle_settings['extra_fields']['display'][$name]) ? $bundle_settings['extra_fields']['display'][$name] : array();
+      $view_modes = array_merge(array('default'), array_keys($entity_type_info['view modes']));
+      foreach ($view_modes as $view_mode) {
+        if (isset($settings[$view_mode])) {
+          $field_data['display'][$view_mode] = $settings[$view_mode];
+        }
+        else {
+          $field_data['display'][$view_mode] = array(
+            'weight' => $field_data['weight'],
+            'visible' => TRUE,
+          );
+        }
+      }
+      unset($field_data['weight']);
+      $result['display'][$name] = $field_data;
+    }
+
+    return $result;
+  }
+}
diff --git a/htmltest/modules/field/field.info.inc b/htmltest/modules/field/field.info.inc
new file mode 100644
index 00000000..02b3c9ca
--- /dev/null
+++ b/htmltest/modules/field/field.info.inc
@@ -0,0 +1,812 @@
+<?php
+
+/**
+ * @file
+ * Field Info API, providing information about available fields and field types.
+ */
+
+/**
+ * Retrieves the FieldInfo object for the current request.
+ *
+ * @return FieldInfo
+ *   An instance of the FieldInfo class.
+ */
+function _field_info_field_cache() {
+  // Use the advanced drupal_static() pattern, since this is called very often.
+  static $drupal_static_fast;
+
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['field_info_field_cache'] = &drupal_static(__FUNCTION__);
+  }
+  $field_info = &$drupal_static_fast['field_info_field_cache'];
+
+  if (!isset($field_info)) {
+    // @todo The registry should save the need for an explicit include, but not
+    // a couple upgrade tests (DisabledNodeTypeTestCase,
+    // FilterFormatUpgradePathTestCase...) break in a strange way without it.
+    include_once dirname(__FILE__) . '/field.info.class.inc';
+    $field_info = new FieldInfo();
+  }
+
+  return $field_info;
+}
+
+/**
+ * @defgroup field_info Field Info API
+ * @{
+ * Obtain information about Field API configuration.
+ *
+ * The Field Info API exposes information about field types, fields,
+ * instances, bundles, widget types, display formatters, behaviors,
+ * and settings defined by or with the Field API.
+ *
+ * See @link field Field API @endlink for information about the other parts of
+ * the Field API.
+ */
+
+/**
+ * Clears the field info cache without clearing the field data cache.
+ *
+ * This is useful when deleted fields or instances are purged.  We
+ * need to remove the purged records, but no actual field data items
+ * are affected.
+ */
+function field_info_cache_clear() {
+  drupal_static_reset('field_view_mode_settings');
+  drupal_static_reset('field_available_languages');
+
+  // @todo: Remove this when field_attach_*_bundle() bundle management
+  // functions are moved to the entity API.
+  entity_info_cache_clear();
+
+  _field_info_collate_types(TRUE);
+  _field_info_field_cache()->flush();
+}
+
+/**
+ * Collates all information on existing fields and instances.
+ *
+ * Deprecated. This function is kept to ensure backwards compatibility, but has
+ * a serious performance impact, and should be absolutely avoided.
+ * See http://drupal.org/node/1915646.
+ *
+ * Use the regular field_info_*() API functions to access the information, or
+ * field_info_cache_clear() to clear the cached data.
+ */
+function _field_info_collate_fields($reset = FALSE) {
+  if ($reset) {
+    _field_info_field_cache()->flush();
+    return;
+  }
+
+  $cache = _field_info_field_cache();
+
+  // Collect fields, and build the array of IDs keyed by field_name.
+  $fields = $cache->getFields();
+  $field_ids = array();
+  foreach ($fields as $id => $field) {
+    if (!$field['deleted']) {
+      $field_ids[$field['field_name']] = $id;
+    }
+  }
+
+  // Collect extra fields for all entity types.
+  $extra_fields = array();
+  foreach (field_info_bundles() as $entity_type => $bundles) {
+    foreach ($bundles as $bundle => $info) {
+      $extra_fields[$entity_type][$bundle] = $cache->getBundleExtraFields($entity_type, $bundle);
+    }
+  }
+
+  return array(
+    'fields' => $fields,
+    'field_ids' => $field_ids,
+    'instances' => $cache->getInstances(),
+    'extra_fields' => $extra_fields,
+  );
+}
+
+/**
+ * Collates all information on field types, widget types and related structures.
+ *
+ * @param $reset
+ *   If TRUE, clear the cache. The information will be rebuilt from the database
+ *   next time it is needed. Defaults to FALSE.
+ *
+ * @return
+ *   If $reset is TRUE, nothing.
+ *   If $reset is FALSE, an array containing the following elements:
+ *   - 'field types': Array of hook_field_info() results, keyed by field_type.
+ *     Each element has the following components: label, description, settings,
+ *     instance_settings, default_widget, default_formatter, and behaviors
+ *     from hook_field_info(), as well as module, giving the module that exposes
+ *     the field type.
+ *   - 'widget types': Array of hook_field_widget_info() results, keyed by
+ *     widget_type. Each element has the following components: label, field
+ *     types, settings, weight, and behaviors from hook_field_widget_info(),
+ *     as well as module, giving the module that exposes the widget type.
+ *   - 'formatter types': Array of hook_field_formatter_info() results, keyed by
+ *     formatter_type. Each element has the following components: label, field
+ *     types, and behaviors from hook_field_formatter_info(), as well as
+ *     module, giving the module that exposes the formatter type.
+ *   - 'storage types': Array of hook_field_storage_info() results, keyed by
+ *     storage type names. Each element has the following components: label,
+ *     description, and settings from hook_field_storage_info(), as well as
+ *     module, giving the module that exposes the storage type.
+ *   - 'fieldable types': Array of hook_entity_info() results, keyed by
+ *     entity_type. Each element has the following components: name, id key,
+ *     revision key, bundle key, cacheable, and bundles from hook_entity_info(),
+ *     as well as module, giving the module that exposes the entity type.
+ */
+function _field_info_collate_types($reset = FALSE) {
+  global $language;
+  static $info;
+
+  // The _info() hooks invoked below include translated strings, so each
+  // language is cached separately.
+  $langcode = $language->language;
+
+  if ($reset) {
+    $info = NULL;
+    // Clear all languages.
+    cache_clear_all('field_info_types:', 'cache_field', TRUE);
+    return;
+  }
+
+  if (!isset($info)) {
+    if ($cached = cache_get("field_info_types:$langcode", 'cache_field')) {
+      $info = $cached->data;
+    }
+    else {
+      $info = array(
+        'field types' => array(),
+        'widget types' => array(),
+        'formatter types' => array(),
+        'storage types' => array(),
+      );
+
+      // Populate field types.
+      foreach (module_implements('field_info') as $module) {
+        $field_types = (array) module_invoke($module, 'field_info');
+        foreach ($field_types as $name => $field_info) {
+          // Provide defaults.
+          $field_info += array(
+            'settings' => array(),
+            'instance_settings' => array(),
+          );
+          $info['field types'][$name] = $field_info;
+          $info['field types'][$name]['module'] = $module;
+        }
+      }
+      drupal_alter('field_info', $info['field types']);
+
+      // Populate widget types.
+      foreach (module_implements('field_widget_info') as $module) {
+        $widget_types = (array) module_invoke($module, 'field_widget_info');
+        foreach ($widget_types as $name => $widget_info) {
+          // Provide defaults.
+          $widget_info += array(
+            'settings' => array(),
+          );
+          $info['widget types'][$name] = $widget_info;
+          $info['widget types'][$name]['module'] = $module;
+        }
+      }
+      drupal_alter('field_widget_info', $info['widget types']);
+      uasort($info['widget types'], 'drupal_sort_weight');
+
+      // Populate formatter types.
+      foreach (module_implements('field_formatter_info') as $module) {
+        $formatter_types = (array) module_invoke($module, 'field_formatter_info');
+        foreach ($formatter_types as $name => $formatter_info) {
+          // Provide defaults.
+          $formatter_info += array(
+            'settings' => array(),
+          );
+          $info['formatter types'][$name] = $formatter_info;
+          $info['formatter types'][$name]['module'] = $module;
+        }
+      }
+      drupal_alter('field_formatter_info', $info['formatter types']);
+
+      // Populate storage types.
+      foreach (module_implements('field_storage_info') as $module) {
+        $storage_types = (array) module_invoke($module, 'field_storage_info');
+        foreach ($storage_types as $name => $storage_info) {
+          // Provide defaults.
+          $storage_info += array(
+            'settings' => array(),
+          );
+          $info['storage types'][$name] = $storage_info;
+          $info['storage types'][$name]['module'] = $module;
+        }
+      }
+      drupal_alter('field_storage_info', $info['storage types']);
+
+      cache_set("field_info_types:$langcode", $info, 'cache_field');
+    }
+  }
+
+  return $info;
+}
+
+/**
+ * Prepares a field definition for the current run-time context.
+ *
+ * The functionality has moved to the FieldInfo class. This function is kept as
+ * a backwards-compatibility layer. See http://drupal.org/node/1915646.
+ *
+ * @see FieldInfo::prepareField()
+ */
+function _field_info_prepare_field($field) {
+  $cache = _field_info_field_cache();
+  return $cache->prepareField($field);
+}
+
+/**
+ * Prepares an instance definition for the current run-time context.
+ *
+ * The functionality has moved to the FieldInfo class. This function is kept as
+ * a backwards-compatibility layer. See http://drupal.org/node/1915646.
+ *
+ * @see FieldInfo::prepareInstance()
+ */
+function _field_info_prepare_instance($instance, $field) {
+  $cache = _field_info_field_cache();
+  return $cache->prepareInstance($instance, $field['type']);
+}
+
+/**
+ * Adapts display specifications to the current run-time context.
+ *
+ * The functionality has moved to the FieldInfo class. This function is kept as
+ * a backwards-compatibility layer. See http://drupal.org/node/1915646.
+ *
+ * @see FieldInfo::prepareInstanceDisplay()
+ */
+function _field_info_prepare_instance_display($field, $display) {
+  $cache = _field_info_field_cache();
+  return $cache->prepareInstanceDisplay($display, $field['type']);
+}
+
+/**
+ * Prepares widget specifications for the current run-time context.
+ *
+ * The functionality has moved to the FieldInfo class. This function is kept as
+ * a backwards-compatibility layer. See http://drupal.org/node/1915646.
+ *
+ * @see FieldInfo::prepareInstanceWidget()
+ */
+function _field_info_prepare_instance_widget($field, $widget) {
+  $cache = _field_info_field_cache();
+  return $cache->prepareInstanceWidget($widget, $field['type']);
+}
+
+/**
+ * Prepares 'extra fields' for the current run-time context.
+ *
+ * The functionality has moved to the FieldInfo class. This function is kept as
+ * a backwards-compatibility layer. See http://drupal.org/node/1915646.
+ *
+ * @see FieldInfo::prepareExtraFields()
+ */
+function _field_info_prepare_extra_fields($extra_fields, $entity_type, $bundle) {
+  $cache = _field_info_field_cache();
+  return $cache->prepareExtraFields($extra_fields, $entity_type, $bundle);
+}
+
+/**
+ * Determines the behavior of a widget with respect to an operation.
+ *
+ * @param $op
+ *   The name of the operation. Currently supported: 'default value',
+ *   'multiple values'.
+ * @param $instance
+ *   The field instance array.
+ *
+ * @return
+ *   One of these values:
+ *   - FIELD_BEHAVIOR_NONE: Do nothing for this operation.
+ *   - FIELD_BEHAVIOR_CUSTOM: Use the widget's callback function.
+ *   - FIELD_BEHAVIOR_DEFAULT: Use field.module default behavior.
+ */
+function field_behaviors_widget($op, $instance) {
+  $info = field_info_widget_types($instance['widget']['type']);
+  return isset($info['behaviors'][$op]) ? $info['behaviors'][$op] : FIELD_BEHAVIOR_DEFAULT;
+}
+
+/**
+ * Returns information about field types from hook_field_info().
+ *
+ * @param $field_type
+ *   (optional) A field type name. If omitted, all field types will be
+ *   returned.
+ *
+ * @return
+ *   Either a field type description, as provided by hook_field_info(), or an
+ *   array of all existing field types, keyed by field type name.
+ */
+function field_info_field_types($field_type = NULL) {
+  $info = _field_info_collate_types();
+  $field_types = $info['field types'];
+  if ($field_type) {
+    if (isset($field_types[$field_type])) {
+      return $field_types[$field_type];
+    }
+  }
+  else {
+    return $field_types;
+  }
+}
+
+/**
+ * Returns information about field widgets from hook_field_widget_info().
+ *
+ * @param $widget_type
+ *   (optional) A widget type name. If omitted, all widget types will be
+ *   returned.
+ *
+ * @return
+ *   Either a single widget type description, as provided by
+ *   hook_field_widget_info(), or an array of all existing widget types, keyed
+ *   by widget type name.
+ */
+function field_info_widget_types($widget_type = NULL) {
+  $info = _field_info_collate_types();
+  $widget_types = $info['widget types'];
+  if ($widget_type) {
+    if (isset($widget_types[$widget_type])) {
+      return $widget_types[$widget_type];
+    }
+  }
+  else {
+    return $widget_types;
+  }
+}
+
+/**
+ * Returns information about field formatters from hook_field_formatter_info().
+ *
+ * @param $formatter_type
+ *   (optional) A formatter type name. If omitted, all formatter types will be
+ *   returned.
+ *
+ * @return
+ *   Either a single formatter type description, as provided by
+ *   hook_field_formatter_info(), or an array of all existing formatter types,
+ *   keyed by formatter type name.
+ */
+function field_info_formatter_types($formatter_type = NULL) {
+  $info = _field_info_collate_types();
+  $formatter_types = $info['formatter types'];
+  if ($formatter_type) {
+    if (isset($formatter_types[$formatter_type])) {
+      return $formatter_types[$formatter_type];
+    }
+  }
+  else {
+    return $formatter_types;
+  }
+}
+
+/**
+ * Returns information about field storage from hook_field_storage_info().
+ *
+ * @param $storage_type
+ *   (optional) A storage type name. If omitted, all storage types will be
+ *   returned.
+ *
+ * @return
+ *   Either a storage type description, as provided by
+ *   hook_field_storage_info(), or an array of all existing storage types,
+ *   keyed by storage type name.
+ */
+function field_info_storage_types($storage_type = NULL) {
+  $info = _field_info_collate_types();
+  $storage_types = $info['storage types'];
+  if ($storage_type) {
+    if (isset($storage_types[$storage_type])) {
+      return $storage_types[$storage_type];
+    }
+  }
+  else {
+    return $storage_types;
+  }
+}
+
+/**
+ * Returns information about existing bundles.
+ *
+ * @param $entity_type
+ *   The type of entity; e.g. 'node' or 'user'.
+ *
+ * @return
+ *   An array of bundles for the $entity_type keyed by bundle name,
+ *   or, if no $entity_type was provided, the array of all existing bundles,
+ *   keyed by entity type.
+ */
+function field_info_bundles($entity_type = NULL) {
+  $info = entity_get_info();
+
+  if ($entity_type) {
+    return isset($info[$entity_type]['bundles']) ? $info[$entity_type]['bundles'] : array();
+  }
+
+  $bundles = array();
+  foreach ($info as $type => $entity_info) {
+    $bundles[$type] = $entity_info['bundles'];
+  }
+  return $bundles;
+}
+
+/**
+ * Returns a lightweight map of fields across bundles.
+ *
+ * The function only returns active, non deleted fields.
+ *
+ * @return
+ *   An array keyed by field name. Each value is an array with two entries:
+ *   - type: The field type.
+ *   - bundles: The bundles in which the field appears, as an array with entity
+ *     types as keys and the array of bundle names as values.
+ * Example:
+ * @code
+ * array(
+ *   'body' => array(
+ *     'bundles' => array(
+ *       'node' => array('page', 'article'),
+ *     ),
+ *     'type' => 'text_with_summary',
+ *   ),
+ * );
+ * @endcode
+ */
+function field_info_field_map() {
+  $cache = _field_info_field_cache();
+  return $cache->getFieldMap();
+}
+
+/**
+ * Returns all field definitions.
+ *
+ * Use of this function should be avoided when possible, since it loads and
+ * statically caches a potentially large array of information. Use
+ * field_info_field_map() instead.
+ *
+ * When iterating over the fields present in a given bundle after a call to
+ * field_info_instances($entity_type, $bundle), it is recommended to use
+ * field_info_field() on each individual field instead.
+ *
+ * @return
+ *   An array of field definitions, keyed by field name. Each field has an
+ *   additional property, 'bundles', which is an array of all the bundles to
+ *   which this field belongs keyed by entity type.
+ *
+ * @see field_info_field_map()
+ */
+function field_info_fields() {
+  $cache = _field_info_field_cache();
+  $info = $cache->getFields();
+
+  $fields = array();
+  foreach ($info as $key => $field) {
+    if (!$field['deleted']) {
+      $fields[$field['field_name']] = $field;
+    }
+  }
+
+  return $fields;
+}
+
+/**
+ * Returns data about an individual field, given a field name.
+ *
+ * @param $field_name
+ *   The name of the field to retrieve. $field_name can only refer to a
+ *   non-deleted, active field. For deleted fields, use
+ *   field_info_field_by_id(). To retrieve information about inactive fields,
+ *   use field_read_fields().
+ *
+ * @return
+ *   The field array, as returned by field_read_fields(), with an
+ *   additional element 'bundles', whose value is an array of all the bundles
+ *   this field belongs to keyed by entity type. NULL if the field was not
+ *   found.
+ *
+ * @see field_info_field_by_id()
+ */
+function field_info_field($field_name) {
+  $cache = _field_info_field_cache();
+  return $cache->getField($field_name);
+}
+
+/**
+ * Returns data about an individual field, given a field ID.
+ *
+ * @param $field_id
+ *   The id of the field to retrieve. $field_id can refer to a
+ *   deleted field, but not an inactive one.
+ *
+ * @return
+ *   The field array, as returned by field_read_fields(), with an
+ *   additional element 'bundles', whose value is an array of all the bundles
+ *   this field belongs to.
+ *
+ * @see field_info_field()
+ */
+function field_info_field_by_id($field_id) {
+  $cache = _field_info_field_cache();
+  return $cache->getFieldById($field_id);
+}
+
+/**
+ * Returns the same data as field_info_field_by_id() for every field.
+ *
+ * Use of this function should be avoided when possible, since it loads and
+ * statically caches a potentially large array of information.
+ *
+ * When iterating over the fields present in a given bundle after a call to
+ * field_info_instances($entity_type, $bundle), it is recommended to use
+ * field_info_field() on each individual field instead.
+ *
+ * @return
+ *   An array, each key is a field ID and the values are field arrays as
+ *   returned by field_read_fields(), with an additional element 'bundles',
+ *   whose value is an array of all the bundle this field belongs to.
+ *
+ * @see field_info_field()
+ * @see field_info_field_by_id()
+ */
+function field_info_field_by_ids() {
+  $cache = _field_info_field_cache();
+  return $cache->getFields();
+}
+
+/**
+ * Retrieves information about field instances.
+ *
+ * Use of this function to retrieve instances across separate bundles (i.e.
+ * when the $bundle parameter is NULL) should be avoided when possible, since
+ * it loads and statically caches a potentially large array of information. Use
+ * field_info_field_map() instead.
+ *
+ * When retrieving the instances of a specific bundle (i.e. when both
+ * $entity_type and $bundle_name are provided), the function also populates a
+ * static cache with the corresponding field definitions, allowing fast
+ * retrieval of field_info_field() later in the request.
+ *
+ * @param $entity_type
+ *   (optional) The entity type for which to return instances.
+ * @param $bundle_name
+ *   (optional) The bundle name for which to return instances. If $entity_type
+ *   is NULL, the $bundle_name parameter is ignored.
+ *
+ * @return
+ *   If $entity_type is not set, return all instances keyed by entity type and
+ *   bundle name. If $entity_type is set, return all instances for that entity
+ *   type, keyed by bundle name. If $entity_type and $bundle_name are set, return
+ *   all instances for that bundle.
+ *
+ * @see field_info_field_map()
+ */
+function field_info_instances($entity_type = NULL, $bundle_name = NULL) {
+  $cache = _field_info_field_cache();
+
+  if (!isset($entity_type)) {
+    return $cache->getInstances();
+  }
+  if (!isset($bundle_name)) {
+    return $cache->getInstances($entity_type);
+  }
+
+  return $cache->getBundleInstances($entity_type, $bundle_name);
+}
+
+/**
+ * Returns an array of instance data for a specific field and bundle.
+ *
+ * The function populates a static cache with all fields and instances used in
+ * the bundle, allowing fast retrieval of field_info_field() or
+ * field_info_instance() later in the request.
+ *
+ * @param $entity_type
+ *   The entity type for the instance.
+ * @param $field_name
+ *   The field name for the instance.
+ * @param $bundle_name
+ *   The bundle name for the instance.
+ *
+ * @return
+ *   An associative array of instance data for the specific field and bundle;
+ *   NULL if the instance does not exist.
+ */
+function field_info_instance($entity_type, $field_name, $bundle_name) {
+  $cache = _field_info_field_cache();
+  $info = $cache->getBundleInstances($entity_type, $bundle_name);
+  if (isset($info[$field_name])) {
+    return $info[$field_name];
+  }
+}
+
+/**
+ * Returns a list and settings of pseudo-field elements in a given bundle.
+ *
+ * If $context is 'form', an array with the following structure:
+ * @code
+ *   array(
+ *     'name_of_pseudo_field_component' => array(
+ *       'label' => The human readable name of the component,
+ *       'description' => A short description of the component content,
+ *       'weight' => The weight of the component in edit forms,
+ *     ),
+ *     'name_of_other_pseudo_field_component' => array(
+ *       // ...
+ *     ),
+ *   );
+ * @endcode
+ *
+ * If $context is 'display', an array with the following structure:
+ * @code
+ *   array(
+ *     'name_of_pseudo_field_component' => array(
+ *       'label' => The human readable name of the component,
+ *       'description' => A short description of the component content,
+ *       // One entry per view mode, including the 'default' mode:
+ *       'display' => array(
+ *         'default' => array(
+ *           'weight' => The weight of the component in displayed entities in
+ *             this view mode,
+ *           'visible' => TRUE if the component is visible, FALSE if hidden, in
+ *             displayed entities in this view mode,
+ *         ),
+ *         'teaser' => array(
+ *           // ...
+ *         ),
+ *       ),
+ *     ),
+ *     'name_of_other_pseudo_field_component' => array(
+ *       // ...
+ *     ),
+ *   );
+ * @endcode
+ *
+ * @param $entity_type
+ *   The type of entity; e.g. 'node' or 'user'.
+ * @param $bundle
+ *   The bundle name.
+ * @param $context
+ *   The context for which the list of pseudo-fields is requested. Either
+ *   'form' or 'display'.
+ *
+ * @return
+ *   The array of pseudo-field elements in the bundle.
+ */
+function field_info_extra_fields($entity_type, $bundle, $context) {
+  $cache = _field_info_field_cache();
+  $info = $cache->getBundleExtraFields($entity_type, $bundle);
+
+  return isset($info[$context]) ? $info[$context] : array();
+}
+
+/**
+ * Returns the maximum weight of all the components in an entity.
+ *
+ * This includes fields, 'extra_fields', and other components added by
+ * third-party modules (e.g. field_group).
+ *
+ * @param $entity_type
+ *   The type of entity; e.g. 'node' or 'user'.
+ * @param $bundle
+ *   The bundle name.
+ * @param $context
+ *   The context for which the maximum weight is requested. Either 'form', or
+ *   the name of a view mode.
+ * @return
+ *   The maximum weight of the entity's components, or NULL if no components
+ *   were found.
+ */
+function field_info_max_weight($entity_type, $bundle, $context) {
+  $weights = array();
+
+  // Collect weights for fields.
+  foreach (field_info_instances($entity_type, $bundle) as $instance) {
+    if ($context == 'form') {
+      $weights[] = $instance['widget']['weight'];
+    }
+    elseif (isset($instance['display'][$context]['weight'])) {
+      $weights[] = $instance['display'][$context]['weight'];
+    }
+  }
+  // Collect weights for extra fields.
+  foreach (field_info_extra_fields($entity_type, $bundle, $context) as $extra) {
+    $weights[] = $extra['weight'];
+  }
+
+  // Let other modules feedback about their own additions.
+  $weights = array_merge($weights, module_invoke_all('field_info_max_weight', $entity_type, $bundle, $context));
+  $max_weight = $weights ? max($weights) : NULL;
+
+  return $max_weight;
+}
+
+/**
+ * Returns a field type's default settings.
+ *
+ * @param $type
+ *   A field type name.
+ *
+ * @return
+ *   The field type's default settings, as provided by hook_field_info(), or an
+ *   empty array if type or settings are not defined.
+ */
+function field_info_field_settings($type) {
+  $info = field_info_field_types($type);
+  return isset($info['settings']) ? $info['settings'] : array();
+}
+
+/**
+ * Returns a field type's default instance settings.
+ *
+ * @param $type
+ *   A field type name.
+ *
+ * @return
+ *   The field type's default instance settings, as provided by
+ *   hook_field_info(), or an empty array if type or settings are not defined.
+ */
+function field_info_instance_settings($type) {
+  $info = field_info_field_types($type);
+  return isset($info['instance_settings']) ? $info['instance_settings'] : array();
+}
+
+/**
+ * Returns a field widget's default settings.
+ *
+ * @param $type
+ *   A widget type name.
+ *
+ * @return
+ *   The widget type's default settings, as provided by
+ *   hook_field_widget_info(), or an empty array if type or settings are
+ *   undefined.
+ */
+function field_info_widget_settings($type) {
+  $info = field_info_widget_types($type);
+  return isset($info['settings']) ? $info['settings'] : array();
+}
+
+/**
+ * Returns a field formatter's default settings.
+ *
+ * @param $type
+ *   A field formatter type name.
+ *
+ * @return
+ *   The formatter type's default settings, as provided by
+ *   hook_field_formatter_info(), or an empty array if type or settings are
+ *   undefined.
+ */
+function field_info_formatter_settings($type) {
+  $info = field_info_formatter_types($type);
+  return isset($info['settings']) ? $info['settings'] : array();
+}
+
+/**
+ * Returns a field storage type's default settings.
+ *
+ * @param $type
+ *   A field storage type name.
+ *
+ * @return
+ *   The storage type's default settings, as provided by
+ *   hook_field_storage_info(), or an empty array if type or settings are
+ *   undefined.
+ */
+function field_info_storage_settings($type) {
+  $info = field_info_storage_types($type);
+  return isset($info['settings']) ? $info['settings'] : array();
+}
+
+/**
+ * @} End of "defgroup field_info".
+ */
diff --git a/htmltest/modules/field/field.install b/htmltest/modules/field/field.install
new file mode 100644
index 00000000..c5c5005d
--- /dev/null
+++ b/htmltest/modules/field/field.install
@@ -0,0 +1,471 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the field module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function field_schema() {
+  // Static (meta) tables.
+  $schema['field_config'] = array(
+    'fields' => array(
+      'id' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'The primary identifier for a field',
+      ),
+      'field_name' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'description' => 'The name of this field. Non-deleted field names are unique, but multiple deleted fields can have the same name.',
+      ),
+      'type' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'description' => 'The type of this field.',
+      ),
+     'module' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The module that implements the field type.',
+      ),
+      'active' => array(
+        'type' => 'int',
+        'size' => 'tiny',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Boolean indicating whether the module that implements the field type is enabled.',
+      ),
+      'storage_type' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'description' => 'The storage backend for the field.',
+      ),
+      'storage_module' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The module that implements the storage backend.',
+      ),
+      'storage_active' => array(
+        'type' => 'int',
+        'size' => 'tiny',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Boolean indicating whether the module that implements the storage backend is enabled.',
+      ),
+      'locked' => array(
+        'type' => 'int',
+        'size' => 'tiny',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => '@TODO',
+      ),
+      'data' => array(
+        'type' => 'blob',
+        'size' => 'big',
+        'not null' => TRUE,
+        'serialize' => TRUE,
+        'description' => 'Serialized data containing the field properties that do not warrant a dedicated column.',
+      ),
+      'cardinality' => array(
+        'type' => 'int',
+        'size' => 'tiny',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'translatable' => array(
+        'type' => 'int',
+        'size' => 'tiny',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'deleted' => array(
+        'type' => 'int',
+        'size' => 'tiny',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'primary key' => array('id'),
+    'indexes' => array(
+      'field_name' => array('field_name'),
+      // Used by field_sync_field_status().
+      'active' => array('active'),
+      'storage_active' => array('storage_active'),
+      'deleted' => array('deleted'),
+      // Used by field_modules_disabled().
+      'module' => array('module'),
+      'storage_module' => array('storage_module'),
+      'type' => array('type'),
+      'storage_type' => array('storage_type'),
+    ),
+  );
+  $schema['field_config_instance'] = array(
+    'fields' => array(
+      'id' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'The primary identifier for a field instance',
+      ),
+      'field_id' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'description' => 'The identifier of the field attached by this instance',
+      ),
+      'field_name' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => ''
+      ),
+      'entity_type' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => ''
+      ),
+      'bundle' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => ''
+      ),
+      'data' => array(
+        'type' => 'blob',
+        'size' => 'big',
+        'not null' => TRUE,
+        'serialize' => TRUE,
+      ),
+      'deleted' => array(
+        'type' => 'int',
+        'size' => 'tiny',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'primary key' => array('id'),
+    'indexes' => array(
+      // Used by field_delete_instance().
+      'field_name_bundle' => array('field_name', 'entity_type', 'bundle'),
+      // Used by field_read_instances().
+      'deleted' => array('deleted'),
+    ),
+  );
+  $schema['cache_field'] = drupal_get_schema_unprocessed('system', 'cache');
+
+  return $schema;
+}
+
+/**
+ * Utility function: create a field by writing directly to the database.
+ *
+ * This function can be used for databases whose schema is at field module
+ * version 7000 or higher.
+ *
+ * @ingroup update_api
+ */
+function _update_7000_field_create_field(&$field) {
+  // Merge in default values.`
+  $field += array(
+    'entity_types' => array(),
+    'cardinality' => 1,
+    'translatable' => FALSE,
+    'locked' => FALSE,
+    'settings' => array(),
+    'indexes' => array(),
+    'deleted' => 0,
+    'active' => 1,
+  );
+
+  // Set storage.
+  $field['storage'] = array(
+    'type' => 'field_sql_storage',
+    'settings' => array(),
+    'module' => 'field_sql_storage',
+    'active' => 1,
+  );
+
+  // Fetch the field schema to initialize columns and indexes. The field module
+  // is not guaranteed to be loaded at this point.
+  module_load_install($field['module']);
+  $schema = (array) module_invoke($field['module'], 'field_schema', $field);
+  $schema += array('columns' => array(), 'indexes' => array());
+  // 'columns' are hardcoded in the field type.
+  $field['columns'] = $schema['columns'];
+  // 'indexes' can be both hardcoded in the field type, and specified in the
+  // incoming $field definition.
+  $field['indexes'] += $schema['indexes'];
+
+  // The serialized 'data' column contains everything from $field that does not
+  // have its own column and is not automatically populated when the field is
+  // read.
+  $data = $field;
+  unset($data['columns'], $data['field_name'], $data['type'], $data['active'], $data['module'], $data['storage_type'], $data['storage_active'], $data['storage_module'], $data['locked'], $data['cardinality'], $data['deleted']);
+  // Additionally, do not save the 'bundles' property populated by
+  // field_info_field().
+  unset($data['bundles']);
+
+  // Write the field to the database.
+  $record = array(
+    'field_name' => $field['field_name'],
+    'type' => $field['type'],
+    'module' => $field['module'],
+    'active' => (int) $field['active'],
+    'storage_type' => $field['storage']['type'],
+    'storage_module' => $field['storage']['module'],
+    'storage_active' => (int) $field['storage']['active'],
+    'locked' => (int) $field['locked'],
+    'data' => serialize($data),
+    'cardinality' => $field['cardinality'],
+    'translatable' => (int) $field['translatable'],
+    'deleted' => (int) $field['deleted'],
+  );
+  // We don't use drupal_write_record() here because it depends on the schema.
+  $field['id'] = db_insert('field_config')
+    ->fields($record)
+    ->execute();
+
+  // Create storage for the field.
+  field_sql_storage_field_storage_create_field($field);
+}
+
+/**
+ * Utility function: delete a field stored in SQL storage directly from the database.
+ *
+ * To protect user data, this function can only be used to delete fields once
+ * all information it stored is gone. Delete all data from the
+ * field_data_$field_name table before calling by either manually issuing
+ * delete queries against it or using _update_7000_field_delete_instance().
+ *
+ * This function can be used for databases whose schema is at field module
+ * version 7000 or higher.
+ *
+ * @param $field_name
+ *   The field name to delete.
+ *
+ * @ingroup update_api
+ */
+function _update_7000_field_delete_field($field_name) {
+  $table_name = 'field_data_' . $field_name;
+  if (db_select($table_name)->range(0, 1)->countQuery()->execute()->fetchField()) {
+    $t = get_t();
+    throw new Exception($t('This function can only be used to delete fields without data'));
+  }
+  // Delete all instances.
+  db_delete('field_config_instance')
+    ->condition('field_name', $field_name)
+    ->execute();
+
+  // Nuke field data and revision tables.
+  db_drop_table($table_name);
+  db_drop_table('field_revision_' . $field_name);
+
+  // Delete the field.
+  db_delete('field_config')
+    ->condition('field_name', $field_name)
+    ->execute();
+}
+
+
+/**
+ * Utility function: delete an instance and all its data of a field stored in SQL Storage.
+ *
+ * BEWARE: this function deletes user data from the field storage tables.
+ *
+ * This function is valid for a database schema version 7000.
+ *
+ * @ingroup update_api
+ */
+function _update_7000_field_delete_instance($field_name, $entity_type, $bundle) {
+  // Delete field instance configuration data.
+  db_delete('field_config_instance')
+    ->condition('field_name', $field_name)
+    ->condition('entity_type', $entity_type)
+    ->condition('bundle', $bundle)
+    ->execute();
+
+  // Nuke data.
+  db_delete('field_data_' . $field_name)
+    ->condition('entity_type', $entity_type)
+    ->condition('bundle', $bundle)
+    ->execute();
+  db_delete('field_revision_' . $field_name)
+    ->condition('entity_type', $entity_type)
+    ->condition('bundle', $bundle)
+    ->execute();
+}
+
+/**
+ * Utility function: fetch all the field definitions from the database.
+ *
+ * Warning: unlike the field_read_fields() API function, this function returns
+ * all fields by default, including deleted and inactive fields, unless
+ * specified otherwise in the $conditions parameter.
+ *
+ * @param $conditions
+ *   An array of conditions to limit the select query to.
+ * @param $key
+ *   The name of the field property the return array is indexed by. Using
+ *   anything else than 'id' might cause incomplete results if the $conditions
+ *   do not filter out deleted fields.
+ *
+ * @return
+ *   An array of fields matching $conditions, keyed by the property specified
+ *   by the $key parameter.
+ *
+ * @ingroup update_api
+ */
+function _update_7000_field_read_fields(array $conditions = array(), $key = 'id') {
+  $fields = array();
+  $query = db_select('field_config', 'fc', array('fetch' => PDO::FETCH_ASSOC))
+    ->fields('fc');
+  foreach ($conditions as $column => $value) {
+    $query->condition($column, $value);
+  }
+  foreach ($query->execute() as $record) {
+    $field = unserialize($record['data']);
+    $field['id'] = $record['id'];
+    $field['field_name'] = $record['field_name'];
+    $field['type'] = $record['type'];
+    $field['module'] = $record['module'];
+    $field['active'] = $record['active'];
+    $field['storage']['type'] = $record['storage_type'];
+    $field['storage']['module'] = $record['storage_module'];
+    $field['storage']['active'] = $record['storage_active'];
+    $field['locked'] = $record['locked'];
+    $field['cardinality'] = $record['cardinality'];
+    $field['translatable'] = $record['translatable'];
+    $field['deleted'] = $record['deleted'];
+
+    $fields[$field[$key]] = $field;
+  }
+  return $fields;
+}
+
+/**
+ * Utility function: write a field instance directly to the database.
+ *
+ * This function can be used for databases whose schema is at field module
+ * version 7000 or higher.
+ *
+ * @ingroup update_api
+ */
+function _update_7000_field_create_instance($field, &$instance) {
+  // Merge in defaults.
+  $instance += array(
+    'field_id' => $field['id'],
+    'field_name' => $field['field_name'],
+    'deleted' => 0,
+  );
+
+  // The serialized 'data' column contains everything from $instance that does
+  // not have its own column and is not automatically populated when the
+  // instance is read.
+  $data = $instance;
+  unset($data['id'], $data['field_id'], $data['field_name'], $data['entity_type'], $data['bundle'], $data['deleted']);
+
+  $record = array(
+    'field_id' => $instance['field_id'],
+    'field_name' => $instance['field_name'],
+    'entity_type' => $instance['entity_type'],
+    'bundle' => $instance['bundle'],
+    'data' => serialize($data),
+    'deleted' => (int) $instance['deleted'],
+  );
+  $instance['id'] = db_insert('field_config_instance')
+    ->fields($record)
+    ->execute();
+}
+
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Field update version placeholder.
+ */
+function field_update_7000() {
+  // Some update helper functions (such as _update_7000_field_create_field())
+  // modify the database directly. They can be used safely only if the database
+  // schema matches the field module schema established for Drupal 7.0 (i.e.
+  // version 7000). This function exists solely to set the schema version to
+  // 7000, so that update functions calling those helpers can do so safely
+  // by declaring a dependency on field_update_7000().
+}
+
+/**
+ * Fix fields definitions created during the d6 to d7 upgrade path.
+ */
+function field_update_7001() {
+  $fields = _update_7000_field_read_fields();
+  foreach ($fields as $field) {
+    // _update_7000_field_create_field() was broken in d7 RC2, and the fields
+    // created during a d6 to d7 upgrade do not correcly store the 'index'
+    // entry. See http://drupal.org/node/996160.
+
+    module_load_install($field['module']);
+    $schema = (array) module_invoke($field['module'], 'field_schema', $field);
+    $schema += array('indexes' => array());
+    // 'indexes' can be both hardcoded in the field type, and specified in the
+    // incoming $field definition.
+    $field['indexes'] += $schema['indexes'];
+
+    // Place the updated entries in the existing serialized 'data' column.
+    $data = db_query("SELECT data FROM {field_config} WHERE id = :id", array(':id' => $field['id']))->fetchField();
+    $data = unserialize($data);
+    $data['columns'] = $field['columns'];
+    $data['indexes'] = $field['indexes'];
+
+    // Save the new data.
+    $query = db_update('field_config')
+      ->condition('id', $field['id'])
+      ->fields(array('data' => serialize($data)))
+      ->execute();
+  }
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x".
+ */
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Split the all-inclusive field_bundle_settings variable per bundle.
+ */
+function field_update_7002() {
+  $settings = variable_get('field_bundle_settings', array());
+  if ($settings) {
+    foreach ($settings as $entity_type => $entity_type_settings) {
+      foreach ($entity_type_settings as $bundle => $bundle_settings) {
+        variable_set('field_bundle_settings_' . $entity_type . '__' . $bundle, $bundle_settings);
+      }
+    }
+    variable_del('field_bundle_settings');
+  }
+}
+
+/**
+ * Add the FieldInfo class to the class registry.
+ */
+function field_update_7003() {
+  // Empty update to force a rebuild of the registry.
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra".
+ */
diff --git a/htmltest/modules/field/field.module b/htmltest/modules/field/field.module
new file mode 100644
index 00000000..52faf354
--- /dev/null
+++ b/htmltest/modules/field/field.module
@@ -0,0 +1,1217 @@
+<?php
+/**
+ * @file
+ * Attach custom data fields to Drupal entities.
+ */
+
+/**
+ * Base class for all exceptions thrown by Field API functions.
+ *
+ * This class has no functionality of its own other than allowing all
+ * Field API exceptions to be caught by a single catch block.
+ */
+class FieldException extends Exception {}
+
+/*
+ * Load all public Field API functions. Drupal currently has no
+ * mechanism for auto-loading core APIs, so we have to load them on
+ * every page request.
+ */
+require_once DRUPAL_ROOT . '/modules/field/field.crud.inc';
+require_once DRUPAL_ROOT . '/modules/field/field.default.inc';
+require_once DRUPAL_ROOT . '/modules/field/field.info.inc';
+require_once DRUPAL_ROOT . '/modules/field/field.multilingual.inc';
+require_once DRUPAL_ROOT . '/modules/field/field.attach.inc';
+require_once DRUPAL_ROOT . '/modules/field/field.form.inc';
+
+/**
+ * @defgroup field Field API
+ * @{
+ * Attach custom data fields to Drupal entities.
+ *
+ * The Field API allows custom data fields to be attached to Drupal
+ * entities and takes care of storing, loading, editing, and rendering
+ * field data. Any entity type (node, user, etc.) can use the Field
+ * API to make itself "fieldable" and thus allow fields to be attached
+ * to it. Other modules can provide a user interface for managing custom
+ * fields via a web browser as well as a wide and flexible variety of
+ * data type, form element, and display format capabilities.
+ *
+ * The Field API defines two primary data structures, Field and
+ * Instance, and the concept of a Bundle. A Field defines a
+ * particular type of data that can be attached to entities. A Field
+ * Instance is a Field attached to a single Bundle. A Bundle is a set
+ * of fields that are treated as a group by the Field Attach API and
+ * is related to a single fieldable entity type.
+ *
+ * For example, suppose a site administrator wants Article nodes to
+ * have a subtitle and photo. Using the Field API or Field UI module,
+ * the administrator creates a field named 'subtitle' of type 'text'
+ * and a field named 'photo' of type 'image'. The administrator
+ * (again, via a UI) creates two Field Instances, one attaching the
+ * field 'subtitle' to the 'node' bundle 'article' and one attaching
+ * the field 'photo' to the 'node' bundle 'article'. When the node
+ * system uses the Field Attach API to load all fields for an Article
+ * node, it passes the node's entity type (which is 'node') and
+ * content type (which is 'article') as the node's bundle.
+ * field_attach_load() then loads the 'subtitle' and 'photo' fields
+ * because they are both attached to the 'node' bundle 'article'.
+ *
+ * Field definitions are represented as an array of key/value pairs.
+ *
+ * array $field:
+ * - id (integer, read-only): The primary identifier of the field. It is
+ *   assigned automatically by field_create_field().
+ * - field_name (string): The name of the field. Each field name is unique
+ *   within Field API. When a field is attached to an entity, the field's data
+ *   is stored in $entity->$field_name. Maximum length is 32 characters.
+ * - type (string): The type of the field, such as 'text' or 'image'. Field
+ *   types are defined by modules that implement hook_field_info().
+ * - entity_types (array): The array of entity types that can hold instances
+ *   of this field. If empty or not specified, the field can have instances
+ *   in any entity type.
+ * - cardinality (integer): The number of values the field can hold. Legal
+ *   values are any positive integer or FIELD_CARDINALITY_UNLIMITED.
+ * - translatable (integer): Whether the field is translatable.
+ * - locked (integer): Whether or not the field is available for editing. If
+ *   TRUE, users can't change field settings or create new instances of the
+ *   field in the UI. Defaults to FALSE.
+ * - module (string, read-only): The name of the module that implements the
+ *   field type.
+ * - active (integer, read-only): TRUE if the module that implements the field
+ *   type is currently enabled, FALSE otherwise.
+ * - deleted (integer, read-only): TRUE if this field has been deleted, FALSE
+ *   otherwise. Deleted fields are ignored by the Field Attach API. This
+ *   property exists because fields can be marked for deletion but only
+ *   actually destroyed by a separate garbage-collection process.
+ * - columns (array, read-only): An array of the Field API columns used to
+ *   store each value of this field. The column list may depend on field
+ *   settings; it is not constant per field type. Field API column
+ *   specifications are exactly like Schema API column specifications but,
+ *   depending on the field storage module in use, the name of the column may
+ *   not represent an actual column in an SQL database.
+ * - indexes (array): An array of indexes on data columns, using the same
+ *   definition format as Schema API index specifications. Only columns that
+ *   appear in the 'columns' setting are allowed. Note that field types can
+ *   specify default indexes, which can be modified or added to when
+ *   creating a field.
+ * - foreign keys: (optional) An associative array of relations, using the same
+ *   structure as the 'foreign keys' definition of hook_schema(). Note,
+ *   however, that the field data is not necessarily stored in SQL. Also, the
+ *   possible usage is limited, as you cannot specify another field as
+ *   related, only existing SQL tables, such as filter formats.
+ * - settings (array): A sub-array of key/value pairs of field-type-specific
+ *   settings. Each field type module defines and documents its own field
+ *   settings.
+ * - storage (array): A sub-array of key/value pairs identifying the storage
+ *   backend to use for the for the field:
+ *   - type (string): The storage backend used by the field. Storage backends
+ *     are defined by modules that implement hook_field_storage_info().
+ *   - module (string, read-only): The name of the module that implements the
+ *     storage backend.
+ *   - active (integer, read-only): TRUE if the module that implements the
+ *     storage backend is currently enabled, FALSE otherwise.
+ *   - settings (array): A sub-array of key/value pairs of settings. Each
+ *     storage backend defines and documents its own settings.
+ *
+ * Field instance definitions are represented as an array of key/value pairs.
+ *
+ * array $instance:
+ * - id (integer, read-only): The primary identifier of this field instance.
+ *   It is assigned automatically by field_create_instance().
+ * - field_id (integer, read-only): The foreign key of the field attached to
+ *   the bundle by this instance. It is populated automatically by
+ *   field_create_instance().
+ * - field_name (string): The name of the field attached to the bundle by this
+ *   instance.
+ * - entity_type (string): The name of the entity type the instance is attached
+ *   to.
+ * - bundle (string): The name of the bundle that the field is attached to.
+ * - label (string): A human-readable label for the field when used with this
+ *   bundle. For example, the label will be the title of Form API elements
+ *   for this instance.
+ * - description (string): A human-readable description for the field when
+ *   used with this bundle. For example, the description will be the help
+ *   text of Form API elements for this instance.
+ * - required (integer): TRUE if a value for this field is required when used
+ *   with this bundle, FALSE otherwise. Currently, required-ness is only
+ *   enforced during Form API operations, not by field_attach_load(),
+ *   field_attach_insert(), or field_attach_update().
+ * - default_value_function (string): The name of the function, if any, that
+ *   will provide a default value.
+ * - default_value (array): If default_value_function is not set, then fixed
+ *   values can be provided.
+ * - deleted (integer, read-only): TRUE if this instance has been deleted,
+ *   FALSE otherwise. Deleted instances are ignored by the Field Attach API.
+ *   This property exists because instances can be marked for deletion but
+ *   only actually destroyed by a separate garbage-collection process.
+ * - settings (array): A sub-array of key/value pairs of field-type-specific
+ *   instance settings. Each field type module defines and documents its own
+ *   instance settings.
+ * - widget (array): A sub-array of key/value pairs identifying the Form API
+ *   input widget for the field when used by this bundle:
+ *   - type (string): The type of the widget, such as text_textfield. Widget
+ *     types are defined by modules that implement hook_field_widget_info().
+ *   - settings (array): A sub-array of key/value pairs of
+ *     widget-type-specific settings. Each field widget type module defines
+ *     and documents its own widget settings.
+ *   - weight (float): The weight of the widget relative to the other elements
+ *     in entity edit forms.
+ *   - module (string, read-only): The name of the module that implements the
+ *     widget type.
+ * - display (array): A sub-array of key/value pairs identifying the way field
+ *   values should be displayed in each of the entity type's view modes, plus
+ *   the 'default' mode. For each view mode, Field UI lets site administrators
+ *   define whether they want to use a dedicated set of display options or the
+ *   'default' options to reduce the number of displays to maintain as they
+ *   add new fields. For nodes, on a fresh install, only the 'teaser' view
+ *   mode is configured to use custom display options, all other view modes
+ *   defined use the 'default' options by default. When programmatically
+ *   adding field instances on nodes, it is therefore recommended to at least
+ *   specify display options for 'default' and 'teaser':
+ *   - default (array): A sub-array of key/value pairs describing the display
+ *     options to be used when the field is being displayed in view modes
+ *     that are not configured to use dedicated display options:
+ *     - label (string): Position of the label. 'inline', 'above' and
+ *       'hidden' are the values recognized by the default 'field' theme
+ *       implementation.
+ *     - type (string): The type of the display formatter, or 'hidden' for
+ *       no display.
+ *     - settings (array): A sub-array of key/value pairs of display
+ *       options specific to the formatter.
+ *     - weight (float): The weight of the field relative to the other entity
+ *       components displayed in this view mode.
+ *     - module (string, read-only): The name of the module which implements
+ *       the display formatter.
+ *   - some_mode: A sub-array of key/value pairs describing the display
+ *     options to be used when the field is being displayed in the 'some_mode'
+ *     view mode. Those options will only be actually applied at run time if
+ *     the view mode is not configured to use default settings for this bundle:
+ *     - ...
+ *   - other_mode:
+ *     - ...
+ *
+ * The (default) render arrays produced for field instances are documented at
+ * field_attach_view().
+ *
+ * Bundles are represented by two strings, an entity type and a bundle name.
+ *
+ * - @link field_types Field Types API @endlink. Defines field types,
+ *   widget types, and display formatters. Field modules use this API
+ *   to provide field types like Text and Node Reference along with the
+ *   associated form elements and display formatters.
+ *
+ * - @link field_crud Field CRUD API @endlink. Create, updates, and
+ *   deletes fields, bundles (a.k.a. "content types"), and instances.
+ *   Modules use this API, often in hook_install(), to create
+ *   custom data structures.
+ *
+ * - @link field_attach Field Attach API @endlink. Connects entity
+ *   types to the Field API. Field Attach API functions load, store,
+ *   generate Form API structures, display, and perform a variety of
+ *   other functions for field data connected to individual entities.
+ *   Fieldable entity types like node and user use this API to make
+ *   themselves fieldable.
+ *
+ * - @link field_info Field Info API @endlink. Exposes information
+ *   about all fields, instances, widgets, and related information
+ *   defined by or with the Field API.
+ *
+ * - @link field_storage Field Storage API @endlink. Provides a
+ *   pluggable back-end storage system for actual field data. The
+ *   default implementation, field_sql_storage.module, stores field data
+ *   in the local SQL database.
+ *
+ * - @link field_purge Field API bulk data deletion @endlink. Cleans
+ *   up after bulk deletion operations such as field_delete_field()
+ *   and field_delete_instance().
+ *
+ * - @link field_language Field language API @endlink. Provides native
+ *   multilingual support for the Field API.
+ */
+
+/**
+ * Value for field API indicating a field accepts an unlimited number of values.
+ */
+define('FIELD_CARDINALITY_UNLIMITED', -1);
+
+/**
+ * Value for field API indicating a widget doesn't accept default values.
+ *
+ * @see hook_field_widget_info()
+ */
+define('FIELD_BEHAVIOR_NONE', 0x0001);
+
+/**
+ * Value for field API concerning widget default and multiple value settings.
+ *
+ * @see hook_field_widget_info()
+ *
+ * When used in a widget default context, indicates the widget accepts default
+ * values. When used in a multiple value context for a widget that allows the
+ * input of one single field value, indicates that the widget will be repeated
+ * for each value input.
+ */
+define('FIELD_BEHAVIOR_DEFAULT', 0x0002);
+
+/**
+ * Value for field API indicating a widget can receive several field values.
+ *
+ * @see hook_field_widget_info()
+ */
+define('FIELD_BEHAVIOR_CUSTOM', 0x0004);
+
+/**
+ * Age argument for loading the most recent version of an entity's
+ * field data with field_attach_load().
+ */
+define('FIELD_LOAD_CURRENT', 'FIELD_LOAD_CURRENT');
+
+/**
+ * Age argument for loading the version of an entity's field data
+ * specified in the entity with field_attach_load().
+ */
+define('FIELD_LOAD_REVISION', 'FIELD_LOAD_REVISION');
+
+/**
+ * Exception class thrown by hook_field_update_forbid().
+ */
+class FieldUpdateForbiddenException extends FieldException {}
+
+/**
+ * Implements hook_help().
+ */
+function field_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#field':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Field module allows custom data fields to be defined for <em>entity</em> types (entities include content items, comments, user accounts, and taxonomy terms). The Field module takes care of storing, loading, editing, and rendering field data. Most users will not interact with the Field module directly, but will instead use the <a href="@field-ui-help">Field UI module</a> user interface. Module developers can use the Field API to make new entity types "fieldable" and thus allow fields to be attached to them. For more information, see the online handbook entry for <a href="@field">Field module</a>.', array('@field-ui-help' => url('admin/help/field_ui'), '@field' => 'http://drupal.org/documentation/modules/field')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Enabling field types') . '</dt>';
+      $output .= '<dd>' . t('The Field module provides the infrastructure for fields and field attachment; the field types and input widgets themselves are provided by additional modules. Some of the modules are required; the optional modules can be enabled from the <a href="@modules">Modules administration page</a>. Drupal core includes the following field type modules: Number (required), Text (required), List (required), Taxonomy (optional), Image (optional), and File (optional); the required Options module provides input widgets for other field modules. Additional fields and widgets may be provided by contributed modules, which you can find in the <a href="@contrib">contributed module section of Drupal.org</a>. Currently enabled field and input widget modules:', array('@modules' => url('admin/modules'), '@contrib' => 'http://drupal.org/project/modules', '@options' => url('admin/help/options')));
+
+      // Make a list of all widget and field modules currently enabled, in
+      // order by displayed module name (module names are not translated).
+      $items = array();
+      $info = system_get_info('module');
+      $modules = array_merge(module_implements('field_info'), module_implements('field_widget_info'));
+      $modules = array_unique($modules);
+      sort($modules);
+      foreach ($modules as $module) {
+        $display = $info[$module]['name'];
+        if (module_hook($module, 'help')) {
+          $items['items'][] = l($display, 'admin/help/' . $module);
+        }
+        else {
+          $items['items'][] = $display;
+        }
+      }
+      $output .= theme('item_list', $items) . '</dd>';
+      $output .= '<dt>' . t('Managing field data storage') . '</dt>';
+      $output .= '<dd>' . t('Developers of field modules can either use the default <a href="@sql-store">Field SQL storage module</a> to store data for their fields, or a contributed or custom module developed using the <a href="@storage-api">field storage API</a>.', array('@storage-api' => 'http://api.drupal.org/api/group/field_storage/7', '@sql-store' => url('admin/help/field_sql_storage'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function field_theme() {
+  return array(
+    'field' => array(
+      'render element' => 'element',
+    ),
+    'field_multiple_value_form' => array(
+      'render element' => 'element',
+    ),
+  );
+}
+
+/**
+ * Implements hook_cron().
+ */
+function field_cron() {
+  // Refresh the 'active' status of fields.
+  field_sync_field_status();
+
+  // Do a pass of purging on deleted Field API data, if any exists.
+  $limit = variable_get('field_purge_batch_size', 10);
+  field_purge_batch($limit);
+}
+
+/**
+ * Implements hook_modules_uninstalled().
+ */
+function field_modules_uninstalled($modules) {
+  module_load_include('inc', 'field', 'field.crud');
+  foreach ($modules as $module) {
+    // TODO D7: field_module_delete is not yet implemented
+    // field_module_delete($module);
+  }
+}
+
+/**
+ * Implements hook_system_info_alter().
+ *
+ * Goes through a list of all modules that provide a field type, and makes them
+ * required if there are any active fields of that type.
+ */
+function field_system_info_alter(&$info, $file, $type) {
+  if ($type == 'module' && module_hook($file->name, 'field_info')) {
+    $fields = field_read_fields(array('module' => $file->name), array('include_deleted' => TRUE));
+    if ($fields) {
+      $info['required'] = TRUE;
+
+      // Provide an explanation message (only mention pending deletions if there
+      // remains no actual, non-deleted fields)
+      $non_deleted = FALSE;
+      foreach ($fields as $field) {
+        if (empty($field['deleted'])) {
+          $non_deleted = TRUE;
+          break;
+        }
+      }
+      if ($non_deleted) {
+        if (module_exists('field_ui')) {
+          $explanation = t('Field type(s) in use - see <a href="@fields-page">Field list</a>', array('@fields-page' => url('admin/reports/fields')));
+        }
+        else {
+          $explanation = t('Fields type(s) in use');
+        }
+      }
+      else {
+        $explanation = t('Fields pending deletion');
+      }
+      $info['explanation'] = $explanation;
+    }
+  }
+}
+
+/**
+ * Implements hook_flush_caches().
+ */
+function field_flush_caches() {
+  // Refresh the 'active' status of fields.
+  field_sync_field_status();
+
+  // Request a flush of our cache table.
+  return array('cache_field');
+}
+
+/**
+ * Implements hook_modules_enabled().
+ */
+function field_modules_enabled($modules) {
+  // Refresh the 'active' status of fields.
+  field_sync_field_status();
+}
+
+/**
+ * Implements hook_modules_disabled().
+ */
+function field_modules_disabled($modules) {
+  // Refresh the 'active' status of fields.
+  field_sync_field_status();
+}
+
+/**
+ * Refreshes the 'active' and 'storage_active' columns for fields.
+ */
+function field_sync_field_status() {
+  // Refresh the 'active' and 'storage_active' columns according to the current
+  // set of enabled modules.
+  $modules = module_list();
+  foreach ($modules as $module_name) {
+    field_associate_fields($module_name);
+  }
+  db_update('field_config')
+    ->fields(array('active' => 0))
+    ->condition('module', $modules, 'NOT IN')
+    ->execute();
+  db_update('field_config')
+    ->fields(array('storage_active' => 0))
+    ->condition('storage_module', $modules, 'NOT IN')
+    ->execute();
+}
+
+/**
+ * Allows a module to update the database for fields and columns it controls.
+ *
+ * @param $module
+ *   The name of the module to update on.
+ */
+function field_associate_fields($module) {
+  // Associate field types.
+  $field_types = (array) module_invoke($module, 'field_info');
+  if ($field_types) {
+    db_update('field_config')
+      ->fields(array('module' => $module, 'active' => 1))
+      ->condition('type', array_keys($field_types))
+      ->execute();
+  }
+  // Associate storage backends.
+  $storage_types = (array) module_invoke($module, 'field_storage_info');
+  if ($storage_types) {
+    db_update('field_config')
+      ->fields(array('storage_module' => $module, 'storage_active' => 1))
+      ->condition('storage_type', array_keys($storage_types))
+      ->execute();
+  }
+}
+
+/**
+ * Helper function to get the default value for a field on an entity.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g., 'node' or 'user'.
+ * @param $entity
+ *   The entity for the operation.
+ * @param $field
+ *   The field structure.
+ * @param $instance
+ *   The instance structure.
+ * @param $langcode
+ *   The field language to fill-in with the default value.
+ */
+function field_get_default_value($entity_type, $entity, $field, $instance, $langcode = NULL) {
+  $items = array();
+  if (!empty($instance['default_value_function'])) {
+    $function = $instance['default_value_function'];
+    if (function_exists($function)) {
+      $items = $function($entity_type, $entity, $field, $instance, $langcode);
+    }
+  }
+  elseif (!empty($instance['default_value'])) {
+    $items = $instance['default_value'];
+  }
+  return $items;
+}
+
+/**
+ * Helper function to filter out empty field values.
+ *
+ * @param $field
+ *   The field definition.
+ * @param $items
+ *   The field values to filter.
+ *
+ * @return
+ *   The array of items without empty field values. The function also renumbers
+ *   the array keys to ensure sequential deltas.
+ */
+function _field_filter_items($field, $items) {
+  $function = $field['module'] . '_field_is_empty';
+  foreach ((array) $items as $delta => $item) {
+    // Explicitly break if the function is undefined.
+    if ($function($item, $field)) {
+      unset($items[$delta]);
+    }
+  }
+  return array_values($items);
+}
+
+/**
+ * Helper function to sort items in a field according to
+ * user drag-n-drop reordering.
+ */
+function _field_sort_items($field, $items) {
+  if (($field['cardinality'] > 1 || $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED) && isset($items[0]['_weight'])) {
+    usort($items, '_field_sort_items_helper');
+    foreach ($items as $delta => $item) {
+      if (is_array($items[$delta])) {
+        unset($items[$delta]['_weight']);
+      }
+    }
+  }
+  return $items;
+}
+
+/**
+ * Sort function for items order.
+ * (copied form element_sort(), which acts on #weight keys)
+ */
+function _field_sort_items_helper($a, $b) {
+  $a_weight = (is_array($a) ? $a['_weight'] : 0);
+  $b_weight = (is_array($b) ? $b['_weight'] : 0);
+  return $a_weight - $b_weight;
+}
+
+/**
+ * Same as above, using ['_weight']['#value']
+ */
+function _field_sort_items_value_helper($a, $b) {
+  $a_weight = (is_array($a) && isset($a['_weight']['#value']) ? $a['_weight']['#value'] : 0);
+  $b_weight = (is_array($b) && isset($b['_weight']['#value']) ? $b['_weight']['#value'] : 0);
+  return $a_weight - $b_weight;
+}
+
+/**
+ * Gets or sets administratively defined bundle settings.
+ *
+ * @param string $entity_type
+ *   The type of $entity; e.g., 'node' or 'user'.
+ * @param string $bundle
+ *   The bundle name.
+ * @param array|null $settings
+ *   (optional) The settings to store, an associative array with the following
+ *   elements:
+ *   - view_modes: An associative array keyed by view mode, with the following
+ *     key/value pairs:
+ *     - custom_settings: Boolean specifying whether the view mode uses a
+ *       dedicated set of display options (TRUE), or the 'default' options
+ *       (FALSE). Defaults to FALSE.
+ *   - extra_fields: An associative array containing the form and display
+ *     settings for extra fields (also known as pseudo-fields):
+ *     - form: An associative array whose keys are the names of extra fields,
+ *       and whose values are associative arrays with the following elements:
+ *       - weight: The weight of the extra field, determining its position on an
+ *         entity form.
+ *     - display: An associative array whose keys are the names of extra fields,
+ *       and whose values are associative arrays keyed by the name of view
+ *       modes. This array must include an item for the 'default' view mode.
+ *       Each view mode sub-array contains the following elements:
+ *       - weight: The weight of the extra field, determining its position when
+ *         an entity is viewed.
+ *       - visible: TRUE if the extra field is visible, FALSE otherwise.
+ *
+ * @return array|null
+ *   If no $settings are passed, the current settings are returned.
+ */
+function field_bundle_settings($entity_type, $bundle, $settings = NULL) {
+  if (isset($settings)) {
+    variable_set('field_bundle_settings_' . $entity_type . '__' . $bundle, $settings);
+    field_info_cache_clear();
+  }
+  else {
+    $settings = variable_get('field_bundle_settings_' . $entity_type . '__' . $bundle, array());
+    $settings += array(
+      'view_modes' => array(),
+      'extra_fields' => array(),
+    );
+    $settings['extra_fields'] += array(
+      'form' => array(),
+      'display' => array(),
+    );
+
+    return $settings;
+  }
+}
+
+/**
+ * Returns view mode settings in a given bundle.
+ *
+ * @param $entity_type
+ *   The type of entity; e.g. 'node' or 'user'.
+ * @param $bundle
+ *   The bundle name to return view mode settings for.
+ *
+ * @return
+ *   An array keyed by view mode, with the following key/value pairs:
+ *   - custom_settings: Boolean specifying whether the view mode uses a
+ *     dedicated set of display options (TRUE), or the 'default' options
+ *     (FALSE). Defaults to FALSE.
+ */
+function field_view_mode_settings($entity_type, $bundle) {
+  $cache = &drupal_static(__FUNCTION__, array());
+
+  if (!isset($cache[$entity_type][$bundle])) {
+    $bundle_settings = field_bundle_settings($entity_type, $bundle);
+    $settings = $bundle_settings['view_modes'];
+    // Include view modes for which nothing has been stored yet, but whose
+    // definition in hook_entity_info() specify they should use custom settings
+    // by default.
+    $entity_info = entity_get_info($entity_type);
+    foreach ($entity_info['view modes'] as $view_mode => $view_mode_info) {
+      if (!isset($settings[$view_mode]['custom_settings']) && $view_mode_info['custom settings']) {
+        $settings[$view_mode]['custom_settings'] = TRUE;
+      }
+    }
+    $cache[$entity_type][$bundle] = $settings;
+  }
+
+  return $cache[$entity_type][$bundle];
+}
+
+/**
+ * Returns the display settings to use for an instance in a given view mode.
+ *
+ * @param $instance
+ *   The field instance being displayed.
+ * @param $view_mode
+ *   The view mode.
+ * @param $entity
+ *   The entity being displayed.
+ *
+ * @return
+ *   The display settings to be used when displaying the field values.
+ */
+function field_get_display($instance, $view_mode, $entity) {
+  // Check whether the view mode uses custom display settings or the 'default'
+  // mode.
+  $view_mode_settings = field_view_mode_settings($instance['entity_type'], $instance['bundle']);
+  $actual_mode = (!empty($view_mode_settings[$view_mode]['custom_settings']) ? $view_mode : 'default');
+  $display = $instance['display'][$actual_mode];
+
+  // Let modules alter the display settings.
+  $context = array(
+    'entity_type' => $instance['entity_type'],
+    'field' => field_info_field($instance['field_name']),
+    'instance' => $instance,
+    'entity' => $entity,
+    'view_mode' => $view_mode,
+  );
+  drupal_alter(array('field_display', 'field_display_' . $instance['entity_type']), $display, $context);
+
+  return $display;
+}
+
+/**
+ * Returns the display settings to use for pseudo-fields in a given view mode.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g., 'node' or 'user'.
+ * @param $bundle
+ *   The bundle name.
+ * @param $view_mode
+ *   The view mode.
+ *
+ * @return
+ *   The display settings to be used when viewing the bundle's pseudo-fields.
+ */
+function field_extra_fields_get_display($entity_type, $bundle, $view_mode) {
+  // Check whether the view mode uses custom display settings or the 'default'
+  // mode.
+  $view_mode_settings = field_view_mode_settings($entity_type, $bundle);
+  $actual_mode = (!empty($view_mode_settings[$view_mode]['custom_settings'])) ? $view_mode : 'default';
+  $extra_fields = field_info_extra_fields($entity_type, $bundle, 'display');
+
+  $displays = array();
+  foreach ($extra_fields as $name => $value) {
+    $displays[$name] = $extra_fields[$name]['display'][$actual_mode];
+  }
+
+  // Let modules alter the display settings.
+  $context = array(
+    'entity_type' => $entity_type,
+    'bundle' => $bundle,
+    'view_mode' => $view_mode,
+  );
+  drupal_alter('field_extra_fields_display', $displays, $context);
+
+  return $displays;
+}
+
+/**
+ * Pre-render callback to adjust weights and visibility of non-field elements.
+ */
+function _field_extra_fields_pre_render($elements) {
+  $entity_type = $elements['#entity_type'];
+  $bundle = $elements['#bundle'];
+
+  if (isset($elements['#type']) && $elements['#type'] == 'form') {
+    $extra_fields = field_info_extra_fields($entity_type, $bundle, 'form');
+    foreach ($extra_fields as $name => $settings) {
+      if (isset($elements[$name])) {
+        $elements[$name]['#weight'] = $settings['weight'];
+      }
+    }
+  }
+  elseif (isset($elements['#view_mode'])) {
+    $view_mode = $elements['#view_mode'];
+    $extra_fields = field_extra_fields_get_display($entity_type, $bundle, $view_mode);
+    foreach ($extra_fields as $name => $settings) {
+      if (isset($elements[$name])) {
+        $elements[$name]['#weight'] = $settings['weight'];
+        // Visibility: make sure we do not accidentally show a hidden element.
+        $elements[$name]['#access'] = isset($elements[$name]['#access']) ? ($elements[$name]['#access'] && $settings['visible']) : $settings['visible'];
+      }
+    }
+  }
+
+  return $elements;
+}
+
+/**
+ * Clear the field info and field data caches.
+ */
+function field_cache_clear() {
+  cache_clear_all('*', 'cache_field', TRUE);
+  field_info_cache_clear();
+}
+
+/**
+ * Like filter_xss_admin(), but with a shorter list of allowed tags.
+ *
+ * Used for items entered by administrators, like field descriptions,
+ * allowed values, where some (mainly inline) mark-up may be desired
+ * (so check_plain() is not acceptable).
+ */
+function field_filter_xss($string) {
+  return filter_xss($string, _field_filter_xss_allowed_tags());
+}
+
+/**
+ * List of tags allowed by field_filter_xss().
+ */
+function _field_filter_xss_allowed_tags() {
+  return array('a', 'b', 'big',  'code', 'del', 'em', 'i', 'ins',  'pre', 'q', 'small', 'span', 'strong', 'sub', 'sup', 'tt', 'ol', 'ul', 'li', 'p', 'br', 'img');
+}
+
+/**
+ * Human-readable list of allowed tags, for display in help texts.
+ */
+function _field_filter_xss_display_allowed_tags() {
+  return '<' . implode('> <', _field_filter_xss_allowed_tags()) . '>';
+}
+
+/**
+ * Returns a renderable array for a single field value.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g., 'node' or 'user'.
+ * @param $entity
+ *   The entity containing the field to display. Must at least contain the id
+ *   key and the field data to display.
+ * @param $field_name
+ *   The name of the field to display.
+ * @param $item
+ *   The field value to display, as found in
+ *   $entity->field_name[$langcode][$delta].
+ * @param $display
+ *   Can be either the name of a view mode, or an array of display settings.
+ *   See field_view_field() for more information.
+ * @param $langcode
+ *   (Optional) The language of the value in $item. If not provided, the
+ *   current language will be assumed.
+ * @return
+ *   A renderable array for the field value.
+ */
+function field_view_value($entity_type, $entity, $field_name, $item, $display = array(), $langcode = NULL) {
+  $output = array();
+
+  if ($field = field_info_field($field_name)) {
+    // Determine the langcode that will be used by language fallback.
+    $langcode = field_language($entity_type, $entity, $field_name, $langcode);
+
+    // Push the item as the single value for the field, and defer to
+    // field_view_field() to build the render array for the whole field.
+    $clone = clone $entity;
+    $clone->{$field_name}[$langcode] = array($item);
+    $elements = field_view_field($entity_type, $clone, $field_name, $display, $langcode);
+
+    // Extract the part of the render array we need.
+    $output = isset($elements[0]) ? $elements[0] : array();
+    if (isset($elements['#access'])) {
+      $output['#access'] = $elements['#access'];
+    }
+  }
+
+  return $output;
+}
+
+/**
+ * Returns a renderable array for the value of a single field in an entity.
+ *
+ * The resulting output is a fully themed field with label and multiple values.
+ *
+ * This function can be used by third-party modules that need to output an
+ * isolated field.
+ * - Do not use inside node (or any other entity) templates; use
+ *   render($content[FIELD_NAME]) instead.
+ * - Do not use to display all fields in an entity; use
+ *   field_attach_prepare_view() and field_attach_view() instead.
+ * - The field_view_value() function can be used to output a single formatted
+ *   field value, without label or wrapping field markup.
+ *
+ * The function takes care of invoking the prepare_view steps. It also respects
+ * field access permissions.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g., 'node' or 'user'.
+ * @param $entity
+ *   The entity containing the field to display. Must at least contain the id
+ *   key and the field data to display.
+ * @param $field_name
+ *   The name of the field to display.
+ * @param $display
+ *   Can be either:
+ *   - The name of a view mode. The field will be displayed according to the
+ *     display settings specified for this view mode in the $instance
+ *     definition for the field in the entity's bundle.
+ *     If no display settings are found for the view mode, the settings for
+ *     the 'default' view mode will be used.
+ *   - An array of display settings, as found in the 'display' entry of
+ *     $instance definitions. The following key/value pairs are allowed:
+ *     - label: (string) Position of the label. The default 'field' theme
+ *       implementation supports the values 'inline', 'above' and 'hidden'.
+ *       Defaults to 'above'.
+ *     - type: (string) The formatter to use. Defaults to the
+ *       'default_formatter' for the field type, specified in
+ *       hook_field_info(). The default formatter will also be used if the
+ *       requested formatter is not available.
+ *     - settings: (array) Settings specific to the formatter. Defaults to the
+ *       formatter's default settings, specified in
+ *       hook_field_formatter_info().
+ *     - weight: (float) The weight to assign to the renderable element.
+ *       Defaults to 0.
+ * @param $langcode
+ *   (Optional) The language the field values are to be shown in. The site's
+ *   current language fallback logic will be applied no values are available
+ *   for the language. If no language is provided the current language will be
+ *   used.
+ * @return
+ *   A renderable array for the field value.
+ *
+ * @see field_view_value()
+ */
+function field_view_field($entity_type, $entity, $field_name, $display = array(), $langcode = NULL) {
+  $output = array();
+
+  if ($field = field_info_field($field_name)) {
+    if (is_array($display)) {
+      // When using custom display settings, fill in default values.
+      $cache = _field_info_field_cache();
+      $display = $cache->prepareInstanceDisplay($display, $field["type"]);
+    }
+
+    // Hook invocations are done through the _field_invoke() functions in
+    // 'single field' mode, to reuse the language fallback logic.
+    // Determine the actual language to display for the field, given the
+    // languages available in the field data.
+    $display_language = field_language($entity_type, $entity, $field_name, $langcode);
+    $options = array('field_name' => $field_name, 'language' => $display_language);
+    $null = NULL;
+
+    // Invoke prepare_view steps if needed.
+    if (empty($entity->_field_view_prepared)) {
+      list($id) = entity_extract_ids($entity_type, $entity);
+
+      // First let the field types do their preparation.
+      _field_invoke_multiple('prepare_view', $entity_type, array($id => $entity), $display, $null, $options);
+      // Then let the formatters do their own specific massaging.
+      _field_invoke_multiple_default('prepare_view', $entity_type, array($id => $entity), $display, $null, $options);
+    }
+
+    // Build the renderable array.
+    $result = _field_invoke_default('view', $entity_type, $entity, $display, $null, $options);
+
+    // Invoke hook_field_attach_view_alter() to let other modules alter the
+    // renderable array, as in a full field_attach_view() execution.
+    $context = array(
+      'entity_type' => $entity_type,
+      'entity' => $entity,
+      'view_mode' => '_custom',
+      'display' => $display,
+    );
+    drupal_alter('field_attach_view', $result, $context);
+
+    if (isset($result[$field_name])) {
+      $output = $result[$field_name];
+    }
+  }
+
+  return $output;
+}
+
+/**
+ * Returns the field items in the language they currently would be displayed.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g., 'node' or 'user'.
+ * @param $entity
+ *   The entity containing the data to be displayed.
+ * @param $field_name
+ *   The field to be displayed.
+ * @param $langcode
+ *   (optional) The language code $entity->{$field_name} has to be displayed in.
+ *   Defaults to the current language.
+ *
+ * @return
+ *   An array of field items keyed by delta if available, FALSE otherwise.
+ */
+function field_get_items($entity_type, $entity, $field_name, $langcode = NULL) {
+  $langcode = field_language($entity_type, $entity, $field_name, $langcode);
+  return isset($entity->{$field_name}[$langcode]) ? $entity->{$field_name}[$langcode] : FALSE;
+}
+
+/**
+ * Determine whether a field has any data.
+ *
+ * @param $field
+ *   A field structure.
+ * @return
+ *   TRUE if the field has data for any entity; FALSE otherwise.
+ */
+function field_has_data($field) {
+  $query = new EntityFieldQuery();
+  return (bool) $query
+    ->fieldCondition($field)
+    ->range(0, 1)
+    ->count()
+    // Neutralize the 'entity_field_access' query tag added by
+    // field_sql_storage_field_storage_query(). The result cannot depend on the
+    // access grants of the current user.
+    ->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT')
+    ->execute();
+}
+
+/**
+ * Determine whether the user has access to a given field.
+ *
+ * @param $op
+ *   The operation to be performed. Possible values:
+ *   - 'edit'
+ *   - 'view'
+ * @param $field
+ *   The full field structure array for the field on which the operation is to
+ *   be performed. See field_info_field().
+ * @param $entity_type
+ *   The type of $entity; e.g., 'node' or 'user'.
+ * @param $entity
+ *   (optional) The entity for the operation.
+ * @param $account
+ *   (optional) The account to check, if not given use currently logged in user.
+ *
+ * @return
+ *   TRUE if the operation is allowed;
+ *   FALSE if the operation is denied.
+ */
+function field_access($op, $field, $entity_type, $entity = NULL, $account = NULL) {
+  global $user;
+
+  if (!isset($account)) {
+    $account = $user;
+  }
+
+  foreach (module_implements('field_access') as $module) {
+    $function = $module . '_field_access';
+    $access = $function($op, $field, $entity_type, $entity, $account);
+    if ($access === FALSE) {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+
+/**
+ * Helper function to extract the bundle name of from a bundle object.
+ *
+ * @param $entity_type
+ *   The type of $entity; e.g., 'node' or 'user'.
+ * @param $bundle
+ *   The bundle object (or string if bundles for this entity type do not exist
+ *   as standalone objects).
+ * @return
+ *   The bundle name.
+ */
+function field_extract_bundle($entity_type, $bundle) {
+  if (is_string($bundle)) {
+    return $bundle;
+  }
+
+  $info = entity_get_info($entity_type);
+  if (is_object($bundle) && isset($info['bundle keys']['bundle']) && isset($bundle->{$info['bundle keys']['bundle']})) {
+    return $bundle->{$info['bundle keys']['bundle']};
+  }
+}
+
+/**
+ * Theme preprocess function for theme_field() and field.tpl.php.
+ *
+ * @see theme_field()
+ * @see field.tpl.php
+ */
+function template_preprocess_field(&$variables, $hook) {
+  $element = $variables['element'];
+
+  // There's some overhead in calling check_plain() so only call it if the label
+  // variable is being displayed. Otherwise, set it to NULL to avoid PHP
+  // warnings if a theme implementation accesses the variable even when it's
+  // supposed to be hidden. If a theme implementation needs to print a hidden
+  // label, it needs to supply a preprocess function that sets it to the
+  // sanitized element title or whatever else is wanted in its place.
+  $variables['label_hidden'] = ($element['#label_display'] == 'hidden');
+  $variables['label'] = $variables['label_hidden'] ? NULL : check_plain($element['#title']);
+
+  // We want other preprocess functions and the theme implementation to have
+  // fast access to the field item render arrays. The item render array keys
+  // (deltas) should always be a subset of the keys in #items, and looping on
+  // those keys is faster than calling element_children() or looping on all keys
+  // within $element, since that requires traversal of all element properties.
+  $variables['items'] = array();
+  foreach ($element['#items'] as $delta => $item) {
+    if (!empty($element[$delta])) {
+      $variables['items'][$delta] = $element[$delta];
+    }
+  }
+
+  // Add default CSS classes. Since there can be many fields rendered on a page,
+  // save some overhead by calling strtr() directly instead of
+  // drupal_html_class().
+  $variables['field_name_css'] = strtr($element['#field_name'], '_', '-');
+  $variables['field_type_css'] = strtr($element['#field_type'], '_', '-');
+  $variables['classes_array'] = array(
+    'field',
+    'field-name-' . $variables['field_name_css'],
+    'field-type-' . $variables['field_type_css'],
+    'field-label-' . $element['#label_display'],
+  );
+  // Add a "clearfix" class to the wrapper since we float the label and the
+  // field items in field.css if the label is inline.
+  if ($element['#label_display'] == 'inline') {
+    $variables['classes_array'][] = 'clearfix';
+  }
+
+  // Add specific suggestions that can override the default implementation.
+  $variables['theme_hook_suggestions'] = array(
+    'field__' . $element['#field_type'],
+    'field__' . $element['#field_name'],
+    'field__' . $element['#bundle'],
+    'field__' . $element['#field_name'] . '__' . $element['#bundle'],
+  );
+}
+
+/**
+ * Theme process function for theme_field() and field.tpl.php.
+ *
+ * @see theme_field()
+ * @see field.tpl.php
+ */
+function template_process_field(&$variables, $hook) {
+  // The default theme implementation is a function, so template_process() does
+  // not automatically run, so we need to flatten the classes and attributes
+  // here. For best performance, only call drupal_attributes() when needed, and
+  // note that template_preprocess_field() does not initialize the
+  // *_attributes_array variables.
+  $variables['classes'] = implode(' ', $variables['classes_array']);
+  $variables['attributes'] = empty($variables['attributes_array']) ? '' : drupal_attributes($variables['attributes_array']);
+  $variables['title_attributes'] = empty($variables['title_attributes_array']) ? '' : drupal_attributes($variables['title_attributes_array']);
+  $variables['content_attributes'] = empty($variables['content_attributes_array']) ? '' : drupal_attributes($variables['content_attributes_array']);
+  foreach ($variables['items'] as $delta => $item) {
+    $variables['item_attributes'][$delta] = empty($variables['item_attributes_array'][$delta]) ? '' : drupal_attributes($variables['item_attributes_array'][$delta]);
+  }
+}
+/**
+ * @} End of "defgroup field".
+ */
+
+/**
+ * Returns HTML for a field.
+ *
+ * This is the default theme implementation to display the value of a field.
+ * Theme developers who are comfortable with overriding theme functions may do
+ * so in order to customize this markup. This function can be overridden with
+ * varying levels of specificity. For example, for a field named 'body'
+ * displayed on the 'article' content type, any of the following functions will
+ * override this default implementation. The first of these functions that
+ * exists is used:
+ * - THEMENAME_field__body__article()
+ * - THEMENAME_field__article()
+ * - THEMENAME_field__body()
+ * - THEMENAME_field()
+ *
+ * Theme developers who prefer to customize templates instead of overriding
+ * functions may copy the "field.tpl.php" from the "modules/field/theme" folder
+ * of the Drupal installation to somewhere within the theme's folder and
+ * customize it, just like customizing other Drupal templates such as
+ * page.tpl.php or node.tpl.php. However, it takes longer for the server to
+ * process templates than to call a function, so for websites with many fields
+ * displayed on a page, this can result in a noticeable slowdown of the website.
+ * For these websites, developers are discouraged from placing a field.tpl.php
+ * file into the theme's folder, but may customize templates for specific
+ * fields. For example, for a field named 'body' displayed on the 'article'
+ * content type, any of the following templates will override this default
+ * implementation. The first of these templates that exists is used:
+ * - field--body--article.tpl.php
+ * - field--article.tpl.php
+ * - field--body.tpl.php
+ * - field.tpl.php
+ * So, if the body field on the article content type needs customization, a
+ * field--body--article.tpl.php file can be added within the theme's folder.
+ * Because it's a template, it will result in slightly more time needed to
+ * display that field, but it will not impact other fields, and therefore,
+ * is unlikely to cause a noticeable change in website performance. A very rough
+ * guideline is that if a page is being displayed with more than 100 fields and
+ * they are all themed with a template instead of a function, it can add up to
+ * 5% to the time it takes to display that page. This is a guideline only and
+ * the exact performance impact depends on the server configuration and the
+ * details of the website.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - label_hidden: A boolean indicating to show or hide the field label.
+ *   - title_attributes: A string containing the attributes for the title.
+ *   - label: The label for the field.
+ *   - content_attributes: A string containing the attributes for the content's
+ *     div.
+ *   - items: An array of field items.
+ *   - item_attributes: An array of attributes for each item.
+ *   - classes: A string containing the classes for the wrapping div.
+ *   - attributes: A string containing the attributes for the wrapping div.
+ *
+ * @see template_preprocess_field()
+ * @see template_process_field()
+ * @see field.tpl.php
+ *
+ * @ingroup themeable
+ */
+function theme_field($variables) {
+  $output = '';
+
+  // Render the label, if it's not hidden.
+  if (!$variables['label_hidden']) {
+    $output .= '<div class="field-label"' . $variables['title_attributes'] . '>' . $variables['label'] . ':&nbsp;</div>';
+  }
+
+  // Render the items.
+  $output .= '<div class="field-items"' . $variables['content_attributes'] . '>';
+  foreach ($variables['items'] as $delta => $item) {
+    $classes = 'field-item ' . ($delta % 2 ? 'odd' : 'even');
+    $output .= '<div class="' . $classes . '"' . $variables['item_attributes'][$delta] . '>' . drupal_render($item) . '</div>';
+  }
+  $output .= '</div>';
+
+  // Render the top-level DIV.
+  $output = '<div class="' . $variables['classes'] . '"' . $variables['attributes'] . '>' . $output . '</div>';
+
+  return $output;
+}
+
+/**
+ * DEPRECATED: Helper form element validator: integer.
+ *
+ * Use element_validate_integer() instead.
+ *
+ * @deprecated
+ * @see element_validate_integer()
+ */
+function _element_validate_integer($element, &$form_state) {
+  element_validate_integer($element, $form_state);
+}
+
+/**
+ * DEPRECATED: Helper form element validator: integer > 0.
+ *
+ * Use element_validate_integer_positive() instead.
+ *
+ * @deprecated
+ * @see element_validate_integer_positive()
+ */
+function _element_validate_integer_positive($element, &$form_state) {
+  element_validate_integer_positive($element, $form_state);
+}
+
+/**
+ * DEPRECATED: Helper form element validator: number.
+ *
+ * Use element_validate_number() instead.
+ *
+ * @deprecated
+ * @see element_validate_number()
+ */
+function _element_validate_number($element, &$form_state) {
+  element_validate_number($element, $form_state);
+}
diff --git a/htmltest/modules/field/field.multilingual.inc b/htmltest/modules/field/field.multilingual.inc
new file mode 100644
index 00000000..4b4f01d7
--- /dev/null
+++ b/htmltest/modules/field/field.multilingual.inc
@@ -0,0 +1,301 @@
+<?php
+
+/**
+ * @file
+ * Functions implementing Field API multilingual support.
+ */
+
+/**
+ * @defgroup field_language Field Language API
+ * @{
+ * Handling of multilingual fields.
+ *
+ * Fields natively implement multilingual support, and all fields use the
+ * following structure:
+ * @code
+ * $entity->{$field_name}[$langcode][$delta][$column_name]
+ * @endcode
+ * Every field can hold a single or multiple value for each language belonging
+ * to the available languages set:
+ * - For untranslatable fields this set only contains LANGUAGE_NONE.
+ * - For translatable fields this set can contain any language code. By default
+ *   it is the list returned by field_content_languages(), which contains all
+ *   installed languages with the addition of LANGUAGE_NONE. This default can be
+ *   altered by modules implementing hook_field_available_languages_alter().
+ *
+ * The available languages for a particular field are returned by
+ * field_available_languages(). Whether a field is translatable is determined by
+ * calling field_is_translatable(), which checks the $field['translatable']
+ * property returned by field_info_field(), and whether there is at least one
+ * translation handler available for the field. A translation handler is a
+ * module registering itself via hook_entity_info() to handle field
+ * translations.
+ *
+ * By default, _field_invoke() and _field_invoke_multiple() are processing a
+ * field in all available languages, unless they are given a language
+ * suggestion. Based on that suggestion, _field_language_suggestion() determines
+ * the languages to act on.
+ *
+ * Most field_attach_*() functions act on all available languages, except for
+ * the following:
+ * - field_attach_form() only takes a single language code, specifying which
+ *   language the field values will be submitted in.
+ * - field_attach_view() requires the language the entity will be displayed in.
+ *   Since it is unknown whether a field translation exists for the requested
+ *   language, the translation handler is responsible for performing one of the
+ *   following actions:
+ *   - Ignore missing translations, i.e. do not show any field values for the
+ *     requested language. For example, see locale_field_language_alter().
+ *   - Provide a value in a different language as fallback. By default, the
+ *     fallback logic is applied separately to each field to ensure that there
+ *     is a value for each field to display.
+ *   The field language fallback logic relies on the global language fallback
+ *   configuration. Therefore, the displayed field values can be in the
+ *   requested language, but may be different if no values for the requested
+ *   language are available. The default language fallback rules inspect all the
+ *   enabled languages ordered by their weight. This behavior can be altered or
+ *   even disabled by modules implementing hook_field_language_alter(), making
+ *   it possible to choose the first approach. The display language for each
+ *   field is returned by field_language().
+ *
+ * See @link field Field API @endlink for information about the other parts of
+ * the Field API.
+ */
+
+/**
+ * Implements hook_multilingual_settings_changed().
+ */
+function field_multilingual_settings_changed() {
+  field_info_cache_clear();
+}
+
+/**
+ * Collects the available languages for the given entity type and field.
+ *
+ * If the given field has language support enabled, an array of available
+ * languages will be returned, otherwise only LANGUAGE_NONE will be returned.
+ * Since the default value for a 'translatable' entity property is FALSE, we
+ * ensure that only entities that are able to handle translations actually get
+ * translatable fields.
+ *
+ * @param $entity_type
+ *   The type of the entity the field is attached to, e.g. 'node' or 'user'.
+ * @param $field
+ *   A field structure.
+ *
+ * @return
+ *   An array of valid language codes.
+ */
+function field_available_languages($entity_type, $field) {
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['field_languages'] = &drupal_static(__FUNCTION__);
+  }
+  $field_languages = &$drupal_static_fast['field_languages'];
+  $field_name = $field['field_name'];
+
+  if (!isset($field_languages[$entity_type][$field_name])) {
+    // If the field has language support enabled we retrieve an (alterable) list
+    // of enabled languages, otherwise we return just LANGUAGE_NONE.
+    if (field_is_translatable($entity_type, $field)) {
+      $languages = field_content_languages();
+      // Let other modules alter the available languages.
+      $context = array('entity_type' => $entity_type, 'field' => $field);
+      drupal_alter('field_available_languages', $languages, $context);
+      $field_languages[$entity_type][$field_name] = $languages;
+    }
+    else {
+      $field_languages[$entity_type][$field_name] = array(LANGUAGE_NONE);
+    }
+  }
+
+  return $field_languages[$entity_type][$field_name];
+}
+
+/**
+ * Process the given language suggestion based on the available languages.
+ *
+ * If a non-empty language suggestion is provided it must appear among the
+ * available languages, otherwise it will be ignored.
+ *
+ * @param $available_languages
+ *   An array of valid language codes.
+ * @param $language_suggestion
+ *   A language code or an array of language codes keyed by field name.
+ * @param $field_name
+ *   The name of the field being processed.
+ *
+ * @return
+ *   An array of valid language codes.
+ */
+function _field_language_suggestion($available_languages, $language_suggestion, $field_name) {
+  // Handle possible language suggestions.
+  if (!empty($language_suggestion)) {
+    // We might have an array of language suggestions keyed by field name.
+    if (is_array($language_suggestion) && isset($language_suggestion[$field_name])) {
+      $language_suggestion = $language_suggestion[$field_name];
+    }
+
+    // If we have a language suggestion and the suggested language is available,
+    // we return only it.
+    if (in_array($language_suggestion, $available_languages)) {
+      $available_languages = array($language_suggestion);
+    }
+  }
+
+  return $available_languages;
+}
+
+/**
+ * Returns available content languages.
+ *
+ * The languages that may be associated to fields include LANGUAGE_NONE.
+ *
+ * @return
+ *   An array of language codes.
+ */
+function field_content_languages() {
+  return array_keys(language_list() + array(LANGUAGE_NONE => NULL));
+}
+
+/**
+ * Checks whether a field has language support.
+ *
+ * A field has language support enabled if its 'translatable' property is set to
+ * TRUE, and its entity type has at least one translation handler registered.
+ *
+ * @param $entity_type
+ *   The type of the entity the field is attached to.
+ * @param $field
+ *   A field data structure.
+ *
+ * @return
+ *   TRUE if the field can be translated.
+ */
+function field_is_translatable($entity_type, $field) {
+  return $field['translatable'] && field_has_translation_handler($entity_type);
+}
+
+/**
+ * Checks if a module is registered as a translation handler for a given entity.
+ *
+ * If no handler is passed, simply check if there is any translation handler
+ * enabled for the given entity type.
+ *
+ * @param $entity_type
+ *   The type of the entity whose fields are to be translated.
+ * @param $handler
+ *   (optional) The name of the handler to be checked. Defaults to NULL.
+ *
+ * @return
+ *   TRUE, if the given handler is allowed to manage field translations. If no
+ *   handler is passed, TRUE means there is at least one registered translation
+ *   handler.
+ */
+function field_has_translation_handler($entity_type, $handler = NULL) {
+  $entity_info = entity_get_info($entity_type);
+
+  if (isset($handler)) {
+    return !empty($entity_info['translation'][$handler]);
+  }
+  elseif (isset($entity_info['translation'])) {
+    foreach ($entity_info['translation'] as $handler_info) {
+      // The translation handler must use a non-empty data structure.
+      if (!empty($handler_info)) {
+        return TRUE;
+      }
+    }
+  }
+
+  return FALSE;
+}
+
+/**
+ * Ensures that a given language code is valid.
+ *
+ * Checks whether the given language is one of the enabled languages. Otherwise,
+ * it returns the current, global language; or the site's default language, if
+ * the additional parameter $default is TRUE.
+ *
+ * @param $langcode
+ *   The language code to validate.
+ * @param $default
+ *   Whether to return the default language code or the current language code in
+ *   case $langcode is invalid.
+ * @return
+ *   A valid language code.
+ */
+function field_valid_language($langcode, $default = TRUE) {
+  $enabled_languages = field_content_languages();
+  if (in_array($langcode, $enabled_languages)) {
+    return $langcode;
+  }
+  global $language_content;
+  return $default ? language_default('language') : $language_content->language;
+}
+
+/**
+ * Returns the display language for the fields attached to the given entity.
+ *
+ * The actual language for each given field is determined based on the requested
+ * language and the actual data available in the fields themselves.
+ * If there is no registered translation handler for the given entity type, the
+ * display language to be used is just LANGUAGE_NONE, as no other language code
+ * is allowed by field_available_languages().
+ * If translation handlers are found, we let modules provide alternative display
+ * languages for fields not having the requested language available.
+ * Core language fallback rules are provided by locale_field_language_fallback()
+ * which is called by locale_field_language_alter().
+ *
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $entity
+ *   The entity to be displayed.
+ * @param $field_name
+ *   (optional) The name of the field to be displayed. Defaults to NULL. If
+ *   no value is specified, the display languages for every field attached to
+ *   the given entity will be returned.
+ * @param $langcode
+ *   (optional) The language code $entity has to be displayed in. Defaults to
+ *   NULL. If no value is given the current language will be used.
+ *
+ * @return
+ *   A language code if a field name is specified, an array of language codes
+ *   keyed by field name otherwise.
+ */
+function field_language($entity_type, $entity, $field_name = NULL, $langcode = NULL) {
+  $display_languages = &drupal_static(__FUNCTION__, array());
+  list($id, , $bundle) = entity_extract_ids($entity_type, $entity);
+  $langcode = field_valid_language($langcode, FALSE);
+
+  if (!isset($display_languages[$entity_type][$id][$langcode])) {
+    $display_language = array();
+
+    // By default display language is set to LANGUAGE_NONE if the field
+    // translation is not available. It is up to translation handlers to
+    // implement language fallback rules.
+    foreach (field_info_instances($entity_type, $bundle) as $instance) {
+      $display_language[$instance['field_name']] = isset($entity->{$instance['field_name']}[$langcode]) ? $langcode : LANGUAGE_NONE;
+    }
+
+    if (field_has_translation_handler($entity_type)) {
+      $context = array(
+        'entity_type' => $entity_type,
+        'entity' => $entity,
+        'language' => $langcode,
+      );
+      drupal_alter('field_language', $display_language, $context);
+    }
+
+    $display_languages[$entity_type][$id][$langcode] = $display_language;
+  }
+
+  $display_language = $display_languages[$entity_type][$id][$langcode];
+
+  // Single-field mode.
+  if (isset($field_name)) {
+    return isset($display_language[$field_name]) ? $display_language[$field_name] : FALSE;
+  }
+
+  return $display_language;
+}
diff --git a/htmltest/modules/field/modules/field_sql_storage/field_sql_storage.info b/htmltest/modules/field/modules/field_sql_storage/field_sql_storage.info
new file mode 100644
index 00000000..e5bef5f1
--- /dev/null
+++ b/htmltest/modules/field/modules/field_sql_storage/field_sql_storage.info
@@ -0,0 +1,14 @@
+name = Field SQL storage
+description = Stores field data in an SQL database.
+package = Core
+version = VERSION
+core = 7.x
+dependencies[] = field
+files[] = field_sql_storage.test
+required = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/field/modules/field_sql_storage/field_sql_storage.install b/htmltest/modules/field/modules/field_sql_storage/field_sql_storage.install
new file mode 100644
index 00000000..24973ab4
--- /dev/null
+++ b/htmltest/modules/field/modules/field_sql_storage/field_sql_storage.install
@@ -0,0 +1,215 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the field_sql_storage module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function field_sql_storage_schema() {
+  $schema = array();
+
+  // Dynamic (data) tables.
+  if (db_table_exists('field_config')) {
+    $fields = field_read_fields(array(), array('include_deleted' => TRUE, 'include_inactive' => TRUE));
+    drupal_load('module', 'field_sql_storage');
+    foreach ($fields as $field) {
+      if ($field['storage']['type'] == 'field_sql_storage') {
+        $schema += _field_sql_storage_schema($field);
+      }
+    }
+  }
+  return $schema;
+}
+
+/**
+ * Utility function: write field data directly to SQL storage.
+ *
+ * This function can be used for databases whose schema is at field module
+ * version 7000 or higher.
+ *
+ * @ingroup update_api
+ */
+function _update_7000_field_sql_storage_write($entity_type, $bundle, $entity_id, $revision_id, $field_name, $data) {
+  $table_name = "field_data_{$field_name}";
+  $revision_name = "field_revision_{$field_name}";
+
+  db_delete($table_name)
+    ->condition('entity_type', $entity_type)
+    ->condition('entity_id', $entity_id)
+    ->execute();
+  db_delete($revision_name)
+    ->condition('entity_type', $entity_type)
+    ->condition('entity_id', $entity_id)
+    ->condition('revision_id', $revision_id)
+    ->execute();
+
+  $columns = array();
+  foreach ($data as $langcode => $items) {
+    foreach ($items as $delta => $item) {
+      $record = array(
+        'entity_type' => $entity_type,
+        'entity_id' => $entity_id,
+        'revision_id' => $revision_id,
+        'bundle' => $bundle,
+        'delta' => $delta,
+        'language' => $langcode,
+      );
+      foreach ($item as $column => $value) {
+        $record[_field_sql_storage_columnname($field_name, $column)] = $value;
+      }
+
+      $records[] = $record;
+      // Record the columns used.
+      $columns += $record;
+    }
+  }
+
+  if ($columns) {
+    $query = db_insert($table_name)->fields(array_keys($columns));
+    $revision_query = db_insert($revision_name)->fields(array_keys($columns));
+    foreach ($records as $record) {
+      $query->values($record);
+      if ($revision_id) {
+        $revision_query->values($record);
+      }
+    }
+    $query->execute();
+    $revision_query->execute();
+  }
+}
+
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Field SQL storage update version placeholder.
+ */
+function field_sql_storage_update_7000() {
+  // Some update helper functions (such as
+  // _update_7000_field_sql_storage_write()) modify the database directly. They
+  // can be used safely only if the database schema matches the field module
+  // schema established for Drupal 7.0 (i.e. version 7000). This function exists
+  // solely to set the schema version to 7000, so that update functions calling
+  // those helpers can do so safely by declaring a dependency on
+  // field_sql_storage_update_7000().
+}
+
+/**
+ * Remove the field_config_entity_type table and store 'entity_type' strings.
+ */
+function field_sql_storage_update_7001(&$sandbox) {
+  if (!isset($sandbox['progress'])) {
+    // Collect current etids.
+    $sandbox['etids'] = db_query('SELECT etid, type FROM {field_config_entity_type}')->fetchAllKeyed();
+
+    // Collect affected tables: field data, field revision data, 'deleted'
+    // tables.
+    $sandbox['tables'] = array();
+    $results = db_select('field_config', 'fc', array('fetch' => PDO::FETCH_ASSOC))
+      ->fields('fc')
+      ->condition('storage_module', 'field_sql_storage')
+      ->execute();
+    foreach ($results as $field) {
+      if ($field['deleted']) {
+        $sandbox['tables']["field_deleted_data_{$field['id']}"] = 'data';
+        $sandbox['tables']["field_deleted_revision_{$field['id']}"] = 'revision';
+      }
+      else {
+        $sandbox['tables']["field_data_{$field['field_name']}"] = 'data';
+        $sandbox['tables']["field_revision_{$field['field_name']}"] = 'revision';
+      }
+    }
+    reset($sandbox['tables']);
+
+    $sandbox['total'] = count($sandbox['tables']);
+    $sandbox['progress'] = 0;
+  }
+
+  if ($sandbox['tables']) {
+    // Grab the next table to process.
+    $table = key($sandbox['tables']);
+    $type = array_shift($sandbox['tables']);
+
+    if (db_table_exists($table)) {
+      // Add the 'entity_type' column.
+      if (!db_field_exists($table, 'entity_type')) {
+        $column = array(
+          'type' => 'varchar',
+          'length' => 128,
+          'not null' => TRUE,
+          'default' => '',
+          'description' => 'The entity type this data is attached to.',
+        );
+        db_add_field($table, 'entity_type', $column);
+
+        // Populate the 'entity_type' column based on the 'etid' column.
+        foreach ($sandbox['etids'] as $etid => $entity_type) {
+          db_update($table)
+            ->fields(array('entity_type' => $entity_type))
+            ->condition('etid', $etid)
+            ->execute();
+        }
+
+        // Index the new column.
+        db_add_index($table, 'entity_type', array('entity_type'));
+      }
+
+      // Use the 'entity_type' column in the primary key.
+      db_drop_primary_key($table);
+      $primary_keys = array(
+        'data' => array('entity_type', 'entity_id', 'deleted', 'delta', 'language'),
+        'revision' => array('entity_type', 'entity_id', 'revision_id', 'deleted', 'delta', 'language'),
+      );
+      db_add_primary_key($table, $primary_keys[$type]);
+
+      // Drop the 'etid' column.
+      if (db_field_exists($table, 'etid')) {
+        db_drop_field($table, 'etid');
+      }
+    }
+
+    // Report progress.
+    $sandbox['progress']++;
+    $sandbox['#finished'] = min(0.99, $sandbox['progress'] / $sandbox['total']);
+  }
+  else {
+    // No more tables left: drop the field_config_entity_type table.
+    db_drop_table('field_config_entity_type');
+
+    // Drop the previous 'field_sql_storage_ENTITYTYPE_etid' system variables.
+    foreach ($sandbox['etids'] as $etid => $entity_type) {
+      variable_del('field_sql_storage_' . $entity_type . '_etid');
+    }
+
+    // We're done.
+    $sandbox['#finished'] = 1;
+  }
+}
+
+/**
+ * Fix primary keys in field revision data tables.
+ */
+function field_sql_storage_update_7002() {
+  $results = db_select('field_config', 'fc', array('fetch' => PDO::FETCH_ASSOC))
+    ->fields('fc')
+    ->condition('storage_module', 'field_sql_storage')
+    ->execute();
+  foreach ($results as $field) {
+    // Revision tables of deleted fields do not need to be fixed, since no new
+    // data is written to them.
+    if (!$field['deleted']) {
+      $table = "field_revision_{$field['field_name']}";
+      db_drop_primary_key($table);
+      db_add_primary_key($table, array('entity_type', 'entity_id', 'revision_id', 'deleted', 'delta', 'language'));
+    }
+  }
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x".
+ */
diff --git a/htmltest/modules/field/modules/field_sql_storage/field_sql_storage.module b/htmltest/modules/field/modules/field_sql_storage/field_sql_storage.module
new file mode 100644
index 00000000..93f20771
--- /dev/null
+++ b/htmltest/modules/field/modules/field_sql_storage/field_sql_storage.module
@@ -0,0 +1,758 @@
+<?php
+
+/**
+ * @file
+ * Default implementation of the field storage API.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function field_sql_storage_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#field_sql_storage':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Field SQL storage module stores field data in the database. It is the default field storage module; other field storage mechanisms may be available as contributed modules. See the <a href="@field-help">Field module help page</a> for more information about fields.', array('@field-help' => url('admin/help/field'))) . '</p>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_field_storage_info().
+ */
+function field_sql_storage_field_storage_info() {
+  return array(
+    'field_sql_storage' => array(
+      'label' => t('Default SQL storage'),
+      'description' => t('Stores fields in the local SQL database, using per-field tables.'),
+    ),
+  );
+}
+
+/**
+ * Generate a table name for a field data table.
+ *
+ * @param $field
+ *   The field structure.
+ * @return
+ *   A string containing the generated name for the database table
+ */
+function _field_sql_storage_tablename($field) {
+  if ($field['deleted']) {
+    return "field_deleted_data_{$field['id']}";
+  }
+  else {
+    return "field_data_{$field['field_name']}";
+  }
+}
+
+/**
+ * Generate a table name for a field revision archive table.
+ *
+ * @param $name
+ *   The field structure.
+ * @return
+ *   A string containing the generated name for the database table
+ */
+function _field_sql_storage_revision_tablename($field) {
+  if ($field['deleted']) {
+    return "field_deleted_revision_{$field['id']}";
+  }
+  else {
+    return "field_revision_{$field['field_name']}";
+  }
+}
+
+/**
+ * Generate a column name for a field data table.
+ *
+ * @param $name
+ *   The name of the field
+ * @param $column
+ *   The name of the column
+ * @return
+ *   A string containing a generated column name for a field data
+ *   table that is unique among all other fields.
+ */
+function _field_sql_storage_columnname($name, $column) {
+  return $name . '_' . $column;
+}
+
+/**
+ * Generate an index name for a field data table.
+ *
+ * @param $name
+ *   The name of the field
+ * @param $column
+ *   The name of the index
+ * @return
+ *   A string containing a generated index name for a field data
+ *   table that is unique among all other fields.
+ */
+function _field_sql_storage_indexname($name, $index) {
+  return $name . '_' . $index;
+}
+
+/**
+ * Return the database schema for a field. This may contain one or
+ * more tables. Each table will contain the columns relevant for the
+ * specified field. Leave the $field's 'columns' and 'indexes' keys
+ * empty to get only the base schema.
+ *
+ * @param $field
+ *   The field structure for which to generate a database schema.
+ * @return
+ *   One or more tables representing the schema for the field.
+ */
+function _field_sql_storage_schema($field) {
+  $deleted = $field['deleted'] ? 'deleted ' : '';
+  $current = array(
+    'description' => "Data storage for {$deleted}field {$field['id']} ({$field['field_name']})",
+    'fields' => array(
+      'entity_type' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The entity type this data is attached to',
+      ),
+      'bundle' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The field instance bundle to which this row belongs, used when deleting a field instance',
+      ),
+      'deleted' => array(
+        'type' => 'int',
+        'size' => 'tiny',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'A boolean indicating whether this data item has been deleted'
+      ),
+      'entity_id' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'The entity id this data is attached to',
+      ),
+      'revision_id' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => FALSE,
+        'description' => 'The entity revision id this data is attached to, or NULL if the entity type is not versioned',
+      ),
+      // @todo Consider storing language as integer.
+      'language' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The language for this data item.',
+      ),
+      'delta' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'The sequence number for this data item, used for multi-value fields',
+      ),
+    ),
+    'primary key' => array('entity_type', 'entity_id', 'deleted', 'delta', 'language'),
+    'indexes' => array(
+      'entity_type' => array('entity_type'),
+      'bundle' => array('bundle'),
+      'deleted' => array('deleted'),
+      'entity_id' => array('entity_id'),
+      'revision_id' => array('revision_id'),
+      'language' => array('language'),
+    ),
+  );
+
+  $field += array('columns' => array(), 'indexes' => array(), 'foreign keys' => array());
+  // Add field columns.
+  foreach ($field['columns'] as $column_name => $attributes) {
+    $real_name = _field_sql_storage_columnname($field['field_name'], $column_name);
+    $current['fields'][$real_name] = $attributes;
+  }
+
+  // Add indexes.
+  foreach ($field['indexes'] as $index_name => $columns) {
+    $real_name = _field_sql_storage_indexname($field['field_name'], $index_name);
+    foreach ($columns as $column_name) {
+      $current['indexes'][$real_name][] = _field_sql_storage_columnname($field['field_name'], $column_name);
+    }
+  }
+
+  // Add foreign keys.
+  foreach ($field['foreign keys'] as $specifier => $specification) {
+    $real_name = _field_sql_storage_indexname($field['field_name'], $specifier);
+    $current['foreign keys'][$real_name]['table'] = $specification['table'];
+    foreach ($specification['columns'] as $column_name => $referenced) {
+      $sql_storage_column = _field_sql_storage_columnname($field['field_name'], $column_name);
+      $current['foreign keys'][$real_name]['columns'][$sql_storage_column] = $referenced;
+    }
+  }
+
+  // Construct the revision table.
+  $revision = $current;
+  $revision['description'] = "Revision archive storage for {$deleted}field {$field['id']} ({$field['field_name']})";
+  $revision['primary key'] = array('entity_type', 'entity_id', 'revision_id', 'deleted', 'delta', 'language');
+  $revision['fields']['revision_id']['not null'] = TRUE;
+  $revision['fields']['revision_id']['description'] = 'The entity revision id this data is attached to';
+
+  return array(
+    _field_sql_storage_tablename($field) => $current,
+    _field_sql_storage_revision_tablename($field) => $revision,
+  );
+}
+
+/**
+ * Implements hook_field_storage_create_field().
+ */
+function field_sql_storage_field_storage_create_field($field) {
+  $schema = _field_sql_storage_schema($field);
+  foreach ($schema as $name => $table) {
+    db_create_table($name, $table);
+  }
+  drupal_get_schema(NULL, TRUE);
+}
+
+/**
+ * Implements hook_field_update_forbid().
+ *
+ * Forbid any field update that changes column definitions if there is
+ * any data.
+ */
+function field_sql_storage_field_update_forbid($field, $prior_field, $has_data) {
+  if ($has_data && $field['columns'] != $prior_field['columns']) {
+    throw new FieldUpdateForbiddenException("field_sql_storage cannot change the schema for an existing field with data.");
+  }
+}
+
+/**
+ * Implements hook_field_storage_update_field().
+ */
+function field_sql_storage_field_storage_update_field($field, $prior_field, $has_data) {
+  if (! $has_data) {
+    // There is no data. Re-create the tables completely.
+
+    if (Database::getConnection()->supportsTransactionalDDL()) {
+      // If the database supports transactional DDL, we can go ahead and rely
+      // on it. If not, we will have to rollback manually if something fails.
+      $transaction = db_transaction();
+    }
+
+    try {
+      $prior_schema = _field_sql_storage_schema($prior_field);
+      foreach ($prior_schema as $name => $table) {
+        db_drop_table($name, $table);
+      }
+      $schema = _field_sql_storage_schema($field);
+      foreach ($schema as $name => $table) {
+        db_create_table($name, $table);
+      }
+    }
+    catch (Exception $e) {
+      if (Database::getConnection()->supportsTransactionalDDL()) {
+        $transaction->rollback();
+      }
+      else {
+        // Recreate tables.
+        $prior_schema = _field_sql_storage_schema($prior_field);
+        foreach ($prior_schema as $name => $table) {
+          if (!db_table_exists($name)) {
+            db_create_table($name, $table);
+          }
+        }
+      }
+      throw $e;
+    }
+  }
+  else {
+    // There is data, so there are no column changes. Drop all the
+    // prior indexes and create all the new ones, except for all the
+    // priors that exist unchanged.
+    $table = _field_sql_storage_tablename($prior_field);
+    $revision_table = _field_sql_storage_revision_tablename($prior_field);
+    foreach ($prior_field['indexes'] as $name => $columns) {
+      if (!isset($field['indexes'][$name]) || $columns != $field['indexes'][$name]) {
+        $real_name = _field_sql_storage_indexname($field['field_name'], $name);
+        db_drop_index($table, $real_name);
+        db_drop_index($revision_table, $real_name);
+      }
+    }
+    $table = _field_sql_storage_tablename($field);
+    $revision_table = _field_sql_storage_revision_tablename($field);
+    foreach ($field['indexes'] as $name => $columns) {
+      if (!isset($prior_field['indexes'][$name]) || $columns != $prior_field['indexes'][$name]) {
+        $real_name = _field_sql_storage_indexname($field['field_name'], $name);
+        $real_columns = array();
+        foreach ($columns as $column_name) {
+          $real_columns[] = _field_sql_storage_columnname($field['field_name'], $column_name);
+        }
+        db_add_index($table, $real_name, $real_columns);
+        db_add_index($revision_table, $real_name, $real_columns);
+      }
+    }
+  }
+  drupal_get_schema(NULL, TRUE);
+}
+
+/**
+ * Implements hook_field_storage_delete_field().
+ */
+function field_sql_storage_field_storage_delete_field($field) {
+  // Mark all data associated with the field for deletion.
+  $field['deleted'] = 0;
+  $table = _field_sql_storage_tablename($field);
+  $revision_table = _field_sql_storage_revision_tablename($field);
+  db_update($table)
+    ->fields(array('deleted' => 1))
+    ->execute();
+
+  // Move the table to a unique name while the table contents are being deleted.
+  $field['deleted'] = 1;
+  $new_table = _field_sql_storage_tablename($field);
+  $revision_new_table = _field_sql_storage_revision_tablename($field);
+  db_rename_table($table, $new_table);
+  db_rename_table($revision_table, $revision_new_table);
+  drupal_get_schema(NULL, TRUE);
+}
+
+/**
+ * Implements hook_field_storage_load().
+ */
+function field_sql_storage_field_storage_load($entity_type, $entities, $age, $fields, $options) {
+  $load_current = $age == FIELD_LOAD_CURRENT;
+
+  foreach ($fields as $field_id => $ids) {
+    // By the time this hook runs, the relevant field definitions have been
+    // populated and cached in FieldInfo, so calling field_info_field_by_id()
+    // on each field individually is more efficient than loading all fields in
+    // memory upfront with field_info_field_by_ids().
+    $field = field_info_field_by_id($field_id);
+    $field_name = $field['field_name'];
+    $table = $load_current ? _field_sql_storage_tablename($field) : _field_sql_storage_revision_tablename($field);
+
+    $query = db_select($table, 't')
+      ->fields('t')
+      ->condition('entity_type', $entity_type)
+      ->condition($load_current ? 'entity_id' : 'revision_id', $ids, 'IN')
+      ->condition('language', field_available_languages($entity_type, $field), 'IN')
+      ->orderBy('delta');
+
+    if (empty($options['deleted'])) {
+      $query->condition('deleted', 0);
+    }
+
+    $results = $query->execute();
+
+    $delta_count = array();
+    foreach ($results as $row) {
+      if (!isset($delta_count[$row->entity_id][$row->language])) {
+        $delta_count[$row->entity_id][$row->language] = 0;
+      }
+
+      if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED || $delta_count[$row->entity_id][$row->language] < $field['cardinality']) {
+        $item = array();
+        // For each column declared by the field, populate the item
+        // from the prefixed database column.
+        foreach ($field['columns'] as $column => $attributes) {
+          $column_name = _field_sql_storage_columnname($field_name, $column);
+          $item[$column] = $row->$column_name;
+        }
+
+        // Add the item to the field values for the entity.
+        $entities[$row->entity_id]->{$field_name}[$row->language][] = $item;
+        $delta_count[$row->entity_id][$row->language]++;
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_storage_write().
+ */
+function field_sql_storage_field_storage_write($entity_type, $entity, $op, $fields) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+  if (!isset($vid)) {
+    $vid = $id;
+  }
+
+  foreach ($fields as $field_id) {
+    $field = field_info_field_by_id($field_id);
+    $field_name = $field['field_name'];
+    $table_name = _field_sql_storage_tablename($field);
+    $revision_name = _field_sql_storage_revision_tablename($field);
+
+    $all_languages = field_available_languages($entity_type, $field);
+    $field_languages = array_intersect($all_languages, array_keys((array) $entity->$field_name));
+
+    // Delete and insert, rather than update, in case a value was added.
+    if ($op == FIELD_STORAGE_UPDATE) {
+      // Delete languages present in the incoming $entity->$field_name.
+      // Delete all languages if $entity->$field_name is empty.
+      $languages = !empty($entity->$field_name) ? $field_languages : $all_languages;
+      if ($languages) {
+        db_delete($table_name)
+          ->condition('entity_type', $entity_type)
+          ->condition('entity_id', $id)
+          ->condition('language', $languages, 'IN')
+          ->execute();
+        db_delete($revision_name)
+          ->condition('entity_type', $entity_type)
+          ->condition('entity_id', $id)
+          ->condition('revision_id', $vid)
+          ->condition('language', $languages, 'IN')
+          ->execute();
+      }
+    }
+
+    // Prepare the multi-insert query.
+    $do_insert = FALSE;
+    $columns = array('entity_type', 'entity_id', 'revision_id', 'bundle', 'delta', 'language');
+    foreach ($field['columns'] as $column => $attributes) {
+      $columns[] = _field_sql_storage_columnname($field_name, $column);
+    }
+    $query = db_insert($table_name)->fields($columns);
+    $revision_query = db_insert($revision_name)->fields($columns);
+
+    foreach ($field_languages as $langcode) {
+      $items = (array) $entity->{$field_name}[$langcode];
+      $delta_count = 0;
+      foreach ($items as $delta => $item) {
+        // We now know we have someting to insert.
+        $do_insert = TRUE;
+        $record = array(
+          'entity_type' => $entity_type,
+          'entity_id' => $id,
+          'revision_id' => $vid,
+          'bundle' => $bundle,
+          'delta' => $delta,
+          'language' => $langcode,
+        );
+        foreach ($field['columns'] as $column => $attributes) {
+          $record[_field_sql_storage_columnname($field_name, $column)] = isset($item[$column]) ? $item[$column] : NULL;
+        }
+        $query->values($record);
+        if (isset($vid)) {
+          $revision_query->values($record);
+        }
+
+        if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED && ++$delta_count == $field['cardinality']) {
+          break;
+        }
+      }
+    }
+
+    // Execute the query if we have values to insert.
+    if ($do_insert) {
+      $query->execute();
+      $revision_query->execute();
+    }
+  }
+}
+
+/**
+ * Implements hook_field_storage_delete().
+ *
+ * This function deletes data for all fields for an entity from the database.
+ */
+function field_sql_storage_field_storage_delete($entity_type, $entity, $fields) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  foreach (field_info_instances($entity_type, $bundle) as $instance) {
+    if (isset($fields[$instance['field_id']])) {
+      $field = field_info_field_by_id($instance['field_id']);
+      field_sql_storage_field_storage_purge($entity_type, $entity, $field, $instance);
+    }
+  }
+}
+
+/**
+ * Implements hook_field_storage_purge().
+ *
+ * This function deletes data from the database for a single field on
+ * an entity.
+ */
+function field_sql_storage_field_storage_purge($entity_type, $entity, $field, $instance) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  $table_name = _field_sql_storage_tablename($field);
+  $revision_name = _field_sql_storage_revision_tablename($field);
+  db_delete($table_name)
+    ->condition('entity_type', $entity_type)
+    ->condition('entity_id', $id)
+    ->execute();
+  db_delete($revision_name)
+    ->condition('entity_type', $entity_type)
+    ->condition('entity_id', $id)
+    ->execute();
+}
+
+/**
+ * Implements hook_field_storage_query().
+ */
+function field_sql_storage_field_storage_query(EntityFieldQuery $query) {
+  if ($query->age == FIELD_LOAD_CURRENT) {
+    $tablename_function = '_field_sql_storage_tablename';
+    $id_key = 'entity_id';
+  }
+  else {
+    $tablename_function = '_field_sql_storage_revision_tablename';
+    $id_key = 'revision_id';
+  }
+  $table_aliases = array();
+  // Add tables for the fields used.
+  foreach ($query->fields as $key => $field) {
+    $tablename = $tablename_function($field);
+    // Every field needs a new table.
+    $table_alias = $tablename . $key;
+    $table_aliases[$key] = $table_alias;
+    if ($key) {
+      $select_query->join($tablename, $table_alias, "$table_alias.entity_type = $field_base_table.entity_type AND $table_alias.$id_key = $field_base_table.$id_key");
+    }
+    else {
+      $select_query = db_select($tablename, $table_alias);
+      // Allow queries internal to the Field API to opt out of the access
+      // check, for situations where the query's results should not depend on
+      // the access grants for the current user.
+      if (!isset($query->tags['DANGEROUS_ACCESS_CHECK_OPT_OUT'])) {
+        $select_query->addTag('entity_field_access');
+      }
+      $select_query->addMetaData('base_table', $tablename);
+      $select_query->fields($table_alias, array('entity_type', 'entity_id', 'revision_id', 'bundle'));
+      $field_base_table = $table_alias;
+    }
+    if ($field['cardinality'] != 1 || $field['translatable']) {
+      $select_query->distinct();
+    }
+  }
+
+  // Add field conditions. We need a fresh grouping cache.
+  drupal_static_reset('_field_sql_storage_query_field_conditions');
+  _field_sql_storage_query_field_conditions($query, $select_query, $query->fieldConditions, $table_aliases, '_field_sql_storage_columnname');
+
+  // Add field meta conditions.
+  _field_sql_storage_query_field_conditions($query, $select_query, $query->fieldMetaConditions, $table_aliases, '_field_sql_storage_query_columnname');
+
+  if (isset($query->deleted)) {
+    $select_query->condition("$field_base_table.deleted", (int) $query->deleted);
+  }
+
+  // Is there a need to sort the query by property?
+  $has_property_order = FALSE;
+  foreach ($query->order as $order) {
+    if ($order['type'] == 'property') {
+      $has_property_order = TRUE;
+    }
+  }
+
+  if ($query->propertyConditions || $has_property_order) {
+    if (empty($query->entityConditions['entity_type']['value'])) {
+      throw new EntityFieldQueryException('Property conditions and orders must have an entity type defined.');
+    }
+    $entity_type = $query->entityConditions['entity_type']['value'];
+    $entity_base_table = _field_sql_storage_query_join_entity($select_query, $entity_type, $field_base_table);
+    $query->entityConditions['entity_type']['operator'] = '=';
+    foreach ($query->propertyConditions as $property_condition) {
+      $query->addCondition($select_query, "$entity_base_table." . $property_condition['column'], $property_condition);
+    }
+  }
+  foreach ($query->entityConditions as $key => $condition) {
+    $query->addCondition($select_query, "$field_base_table.$key", $condition);
+  }
+
+  // Order the query.
+  foreach ($query->order as $order) {
+    if ($order['type'] == 'entity') {
+      $key = $order['specifier'];
+      $select_query->orderBy("$field_base_table.$key", $order['direction']);
+    }
+    elseif ($order['type'] == 'field') {
+      $specifier = $order['specifier'];
+      $field = $specifier['field'];
+      $table_alias = $table_aliases[$specifier['index']];
+      $sql_field = "$table_alias." . _field_sql_storage_columnname($field['field_name'], $specifier['column']);
+      $select_query->orderBy($sql_field, $order['direction']);
+    }
+    elseif ($order['type'] == 'property') {
+      $select_query->orderBy("$entity_base_table." . $order['specifier'], $order['direction']);
+    }
+  }
+
+  return $query->finishQuery($select_query, $id_key);
+}
+
+/**
+ * Adds the base entity table to a field query object.
+ *
+ * @param SelectQuery $select_query
+ *   A SelectQuery containing at least one table as specified by
+ *   _field_sql_storage_tablename().
+ * @param $entity_type
+ *   The entity type for which the base table should be joined.
+ * @param $field_base_table
+ *   Name of a table in $select_query. As only INNER JOINs are used, it does
+ *   not matter which.
+ *
+ * @return
+ *   The name of the entity base table joined in.
+ */
+function _field_sql_storage_query_join_entity(SelectQuery $select_query, $entity_type, $field_base_table) {
+  $entity_info = entity_get_info($entity_type);
+  $entity_base_table = $entity_info['base table'];
+  $entity_field = $entity_info['entity keys']['id'];
+  $select_query->join($entity_base_table, $entity_base_table, "$entity_base_table.$entity_field = $field_base_table.entity_id");
+  return $entity_base_table;
+}
+
+/**
+ * Adds field (meta) conditions to the given query objects respecting groupings.
+ *
+ * @param EntityFieldQuery $query
+ *   The field query object to be processed.
+ * @param SelectQuery $select_query
+ *   The SelectQuery that should get grouping conditions.
+ * @param condtions
+ *   The conditions to be added.
+ * @param $table_aliases
+ *   An associative array of table aliases keyed by field index.
+ * @param $column_callback
+ *   A callback that should return the column name to be used for the field
+ *   conditions. Accepts a field name and a field column name as parameters.
+ */
+function _field_sql_storage_query_field_conditions(EntityFieldQuery $query, SelectQuery $select_query, $conditions, $table_aliases, $column_callback) {
+  $groups = &drupal_static(__FUNCTION__, array());
+  foreach ($conditions as $key => $condition) {
+    $table_alias = $table_aliases[$key];
+    $field = $condition['field'];
+    // Add the specified condition.
+    $sql_field = "$table_alias." . $column_callback($field['field_name'], $condition['column']);
+    $query->addCondition($select_query, $sql_field, $condition);
+    // Add delta / language group conditions.
+    foreach (array('delta', 'language') as $column) {
+      if (isset($condition[$column . '_group'])) {
+        $group_name = $condition[$column . '_group'];
+        if (!isset($groups[$column][$group_name])) {
+          $groups[$column][$group_name] = $table_alias;
+        }
+        else {
+          $select_query->where("$table_alias.$column = " . $groups[$column][$group_name] . ".$column");
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Field meta condition column callback.
+ */
+function _field_sql_storage_query_columnname($field_name, $column) {
+  return $column;
+}
+
+/**
+ * Implements hook_field_storage_delete_revision().
+ *
+ * This function actually deletes the data from the database.
+ */
+function field_sql_storage_field_storage_delete_revision($entity_type, $entity, $fields) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  if (isset($vid)) {
+    foreach ($fields as $field_id) {
+      $field = field_info_field_by_id($field_id);
+      $revision_name = _field_sql_storage_revision_tablename($field);
+      db_delete($revision_name)
+        ->condition('entity_type', $entity_type)
+        ->condition('entity_id', $id)
+        ->condition('revision_id', $vid)
+        ->execute();
+    }
+  }
+}
+
+/**
+ * Implements hook_field_storage_delete_instance().
+ *
+ * This function simply marks for deletion all data associated with the field.
+ */
+function field_sql_storage_field_storage_delete_instance($instance) {
+  $field = field_info_field($instance['field_name']);
+  $table_name = _field_sql_storage_tablename($field);
+  $revision_name = _field_sql_storage_revision_tablename($field);
+  db_update($table_name)
+    ->fields(array('deleted' => 1))
+    ->condition('entity_type', $instance['entity_type'])
+    ->condition('bundle', $instance['bundle'])
+    ->execute();
+  db_update($revision_name)
+    ->fields(array('deleted' => 1))
+    ->condition('entity_type', $instance['entity_type'])
+    ->condition('bundle', $instance['bundle'])
+    ->execute();
+}
+
+/**
+ * Implements hook_field_attach_rename_bundle().
+ */
+function field_sql_storage_field_attach_rename_bundle($entity_type, $bundle_old, $bundle_new) {
+  // We need to account for deleted or inactive fields and instances.
+  $instances = field_read_instances(array('entity_type' => $entity_type, 'bundle' => $bundle_new), array('include_deleted' => TRUE, 'include_inactive' => TRUE));
+  foreach ($instances as $instance) {
+    $field = field_info_field_by_id($instance['field_id']);
+    if ($field['storage']['type'] == 'field_sql_storage') {
+      $table_name = _field_sql_storage_tablename($field);
+      $revision_name = _field_sql_storage_revision_tablename($field);
+      db_update($table_name)
+        ->fields(array('bundle' => $bundle_new))
+        ->condition('entity_type', $entity_type)
+        ->condition('bundle', $bundle_old)
+        ->execute();
+      db_update($revision_name)
+        ->fields(array('bundle' => $bundle_new))
+        ->condition('entity_type', $entity_type)
+        ->condition('bundle', $bundle_old)
+        ->execute();
+    }
+  }
+}
+
+/**
+ * Implements hook_field_storage_purge_field().
+ *
+ * All field data items and instances have already been purged, so all
+ * that is left is to delete the table.
+ */
+function field_sql_storage_field_storage_purge_field($field) {
+  $table_name = _field_sql_storage_tablename($field);
+  $revision_name = _field_sql_storage_revision_tablename($field);
+  db_drop_table($table_name);
+  db_drop_table($revision_name);
+}
+
+/**
+ * Implements hook_field_storage_details().
+ */
+function field_sql_storage_field_storage_details($field) {
+  $details = array();
+  if (!empty($field['columns'])) {
+     // Add field columns.
+    foreach ($field['columns'] as $column_name => $attributes) {
+      $real_name = _field_sql_storage_columnname($field['field_name'], $column_name);
+      $columns[$column_name] = $real_name;
+    }
+    return array(
+      'sql' => array(
+        FIELD_LOAD_CURRENT => array(
+          _field_sql_storage_tablename($field) => $columns,
+        ),
+        FIELD_LOAD_REVISION => array(
+          _field_sql_storage_revision_tablename($field) => $columns,
+        ),
+      ),
+    );
+  }
+}
diff --git a/htmltest/modules/field/modules/field_sql_storage/field_sql_storage.test b/htmltest/modules/field/modules/field_sql_storage/field_sql_storage.test
new file mode 100644
index 00000000..12c54ba2
--- /dev/null
+++ b/htmltest/modules/field/modules/field_sql_storage/field_sql_storage.test
@@ -0,0 +1,441 @@
+<?php
+
+/**
+ * @file
+ * Tests for field_sql_storage.module.
+ *
+ * Field_sql_storage.module implements the default back-end storage plugin
+ * for the Field Strage API.
+ */
+
+/**
+ * Tests field storage.
+ */
+class FieldSqlStorageTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Field SQL storage tests',
+      'description'  => "Test field SQL storage module.",
+      'group' => 'Field API'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('field_sql_storage', 'field', 'field_test', 'text');
+    $this->field_name = strtolower($this->randomName());
+    $this->field = array('field_name' => $this->field_name, 'type' => 'test_field', 'cardinality' => 4);
+    $this->field = field_create_field($this->field);
+    $this->instance = array(
+      'field_name' => $this->field_name,
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle'
+    );
+    $this->instance = field_create_instance($this->instance);
+    $this->table = _field_sql_storage_tablename($this->field);
+    $this->revision_table = _field_sql_storage_revision_tablename($this->field);
+
+  }
+
+  /**
+   * Uses the mysql tables and records to verify
+   * field_load_revision works correctly.
+   */
+  function testFieldAttachLoad() {
+    $entity_type = 'test_entity';
+    $eid = 0;
+    $langcode = LANGUAGE_NONE;
+
+    $columns = array('entity_type', 'entity_id', 'revision_id', 'delta', 'language', $this->field_name . '_value');
+
+    // Insert data for four revisions to the field revisions table
+    $query = db_insert($this->revision_table)->fields($columns);
+    for ($evid = 0; $evid < 4; ++$evid) {
+      $values[$evid] = array();
+      // Note: we insert one extra value ('<=' instead of '<').
+      for ($delta = 0; $delta <= $this->field['cardinality']; $delta++) {
+        $value = mt_rand(1, 127);
+        $values[$evid][] = $value;
+        $query->values(array($entity_type, $eid, $evid, $delta, $langcode, $value));
+      }
+    }
+    $query->execute();
+
+    // Insert data for the "most current revision" into the field table
+    $query = db_insert($this->table)->fields($columns);
+    foreach ($values[0] as $delta => $value) {
+      $query->values(array($entity_type, $eid, 0, $delta, $langcode, $value));
+    }
+    $query->execute();
+
+    // Load the "most current revision"
+    $entity = field_test_create_stub_entity($eid, 0, $this->instance['bundle']);
+    field_attach_load($entity_type, array($eid => $entity));
+    foreach ($values[0] as $delta => $value) {
+      if ($delta < $this->field['cardinality']) {
+        $this->assertEqual($entity->{$this->field_name}[$langcode][$delta]['value'], $value, "Value $delta is loaded correctly for current revision");
+      }
+      else {
+        $this->assertFalse(array_key_exists($delta, $entity->{$this->field_name}[$langcode]), "No extraneous value gets loaded for current revision.");
+      }
+    }
+
+    // Load every revision
+    for ($evid = 0; $evid < 4; ++$evid) {
+      $entity = field_test_create_stub_entity($eid, $evid, $this->instance['bundle']);
+      field_attach_load_revision($entity_type, array($eid => $entity));
+      foreach ($values[$evid] as $delta => $value) {
+        if ($delta < $this->field['cardinality']) {
+          $this->assertEqual($entity->{$this->field_name}[$langcode][$delta]['value'], $value, "Value $delta for revision $evid is loaded correctly");
+        }
+        else {
+          $this->assertFalse(array_key_exists($delta, $entity->{$this->field_name}[$langcode]), "No extraneous value gets loaded for revision $evid.");
+        }
+      }
+    }
+
+    // Add a translation in an unavailable language and verify it is not loaded.
+    $eid = $evid = 1;
+    $unavailable_language = 'xx';
+    $entity = field_test_create_stub_entity($eid, $evid, $this->instance['bundle']);
+    $values = array($entity_type, $eid, $evid, 0, $unavailable_language, mt_rand(1, 127));
+    db_insert($this->table)->fields($columns)->values($values)->execute();
+    db_insert($this->revision_table)->fields($columns)->values($values)->execute();
+    field_attach_load($entity_type, array($eid => $entity));
+    $this->assertFalse(array_key_exists($unavailable_language, $entity->{$this->field_name}), 'Field translation in an unavailable language ignored');
+  }
+
+  /**
+   * Reads mysql to verify correct data is
+   * written when using insert and update.
+   */
+  function testFieldAttachInsertAndUpdate() {
+    $entity_type = 'test_entity';
+    $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
+    $langcode = LANGUAGE_NONE;
+
+    // Test insert.
+    $values = array();
+    // Note: we try to insert one extra value ('<=' instead of '<').
+    // TODO : test empty values filtering and "compression" (store consecutive deltas).
+    for ($delta = 0; $delta <= $this->field['cardinality']; $delta++) {
+      $values[$delta]['value'] = mt_rand(1, 127);
+    }
+    $entity->{$this->field_name}[$langcode] = $rev_values[0] = $values;
+    field_attach_insert($entity_type, $entity);
+
+    $rows = db_select($this->table, 't')->fields('t')->execute()->fetchAllAssoc('delta', PDO::FETCH_ASSOC);
+    foreach ($values as $delta => $value) {
+      if ($delta < $this->field['cardinality']) {
+        $this->assertEqual($rows[$delta][$this->field_name . '_value'], $value['value'], format_string("Value %delta is inserted correctly", array('%delta' => $delta)));
+      }
+      else {
+        $this->assertFalse(array_key_exists($delta, $rows), "No extraneous value gets inserted.");
+      }
+    }
+
+    // Test update.
+    $entity = field_test_create_stub_entity(0, 1, $this->instance['bundle']);
+    $values = array();
+    // Note: we try to update one extra value ('<=' instead of '<').
+    for ($delta = 0; $delta <= $this->field['cardinality']; $delta++) {
+      $values[$delta]['value'] = mt_rand(1, 127);
+    }
+    $entity->{$this->field_name}[$langcode] = $rev_values[1] = $values;
+    field_attach_update($entity_type, $entity);
+    $rows = db_select($this->table, 't')->fields('t')->execute()->fetchAllAssoc('delta', PDO::FETCH_ASSOC);
+    foreach ($values as $delta => $value) {
+      if ($delta < $this->field['cardinality']) {
+        $this->assertEqual($rows[$delta][$this->field_name . '_value'], $value['value'], format_string("Value %delta is updated correctly", array('%delta' => $delta)));
+      }
+      else {
+        $this->assertFalse(array_key_exists($delta, $rows), "No extraneous value gets updated.");
+      }
+    }
+
+    // Check that data for both revisions are in the revision table.
+    // We make sure each value is stored correctly, then unset it.
+    // When an entire revision's values are unset (remembering that we
+    // put one extra value in $values per revision), unset the entire
+    // revision. Then, if $rev_values is empty at the end, all
+    // revision data was found.
+    $results = db_select($this->revision_table, 't')->fields('t')->execute();
+    foreach ($results as $row) {
+      $this->assertEqual($row->{$this->field_name . '_value'}, $rev_values[$row->revision_id][$row->delta]['value'], "Value {$row->delta} for revision {$row->revision_id} stored correctly");
+      unset($rev_values[$row->revision_id][$row->delta]);
+      if (count($rev_values[$row->revision_id]) == 1) {
+        unset($rev_values[$row->revision_id]);
+      }
+    }
+    $this->assertTrue(empty($rev_values), "All values for all revisions are stored in revision table {$this->revision_table}");
+
+    // Check that update leaves the field data untouched if
+    // $entity->{$field_name} is absent.
+    unset($entity->{$this->field_name});
+    field_attach_update($entity_type, $entity);
+    $rows = db_select($this->table, 't')->fields('t')->execute()->fetchAllAssoc('delta', PDO::FETCH_ASSOC);
+    foreach ($values as $delta => $value) {
+      if ($delta < $this->field['cardinality']) {
+        $this->assertEqual($rows[$delta][$this->field_name . '_value'], $value['value'], format_string("Update with no field_name entry leaves value %delta untouched", array('%delta' => $delta)));
+      }
+    }
+
+    // Check that update with an empty $entity->$field_name empties the field.
+    $entity->{$this->field_name} = NULL;
+    field_attach_update($entity_type, $entity);
+    $rows = db_select($this->table, 't')->fields('t')->execute()->fetchAllAssoc('delta', PDO::FETCH_ASSOC);
+    $this->assertEqual(count($rows), 0, "Update with an empty field_name entry empties the field.");
+  }
+
+  /**
+   * Tests insert and update with missing or NULL fields.
+   */
+  function testFieldAttachSaveMissingData() {
+    $entity_type = 'test_entity';
+    $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
+    $langcode = LANGUAGE_NONE;
+
+    // Insert: Field is missing
+    field_attach_insert($entity_type, $entity);
+    $count = db_select($this->table)
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertEqual($count, 0, 'Missing field results in no inserts');
+
+    // Insert: Field is NULL
+    $entity->{$this->field_name} = NULL;
+    field_attach_insert($entity_type, $entity);
+    $count = db_select($this->table)
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertEqual($count, 0, 'NULL field results in no inserts');
+
+    // Add some real data
+    $entity->{$this->field_name}[$langcode] = array(0 => array('value' => 1));
+    field_attach_insert($entity_type, $entity);
+    $count = db_select($this->table)
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertEqual($count, 1, 'Field data saved');
+
+    // Update: Field is missing. Data should survive.
+    unset($entity->{$this->field_name});
+    field_attach_update($entity_type, $entity);
+    $count = db_select($this->table)
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertEqual($count, 1, 'Missing field leaves data in table');
+
+    // Update: Field is NULL. Data should be wiped.
+    $entity->{$this->field_name} = NULL;
+    field_attach_update($entity_type, $entity);
+    $count = db_select($this->table)
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertEqual($count, 0, 'NULL field leaves no data in table');
+
+    // Add a translation in an unavailable language.
+    $unavailable_language = 'xx';
+    db_insert($this->table)
+      ->fields(array('entity_type', 'bundle', 'deleted', 'entity_id', 'revision_id', 'delta', 'language'))
+      ->values(array($entity_type, $this->instance['bundle'], 0, 0, 0, 0, $unavailable_language))
+      ->execute();
+    $count = db_select($this->table)
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertEqual($count, 1, 'Field translation in an unavailable language saved.');
+
+    // Again add some real data.
+    $entity->{$this->field_name}[$langcode] = array(0 => array('value' => 1));
+    field_attach_insert($entity_type, $entity);
+    $count = db_select($this->table)
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertEqual($count, 2, 'Field data saved.');
+
+    // Update: Field translation is missing but field is not empty. Translation
+    // data should survive.
+    $entity->{$this->field_name}[$unavailable_language] = array(mt_rand(1, 127));
+    unset($entity->{$this->field_name}[$langcode]);
+    field_attach_update($entity_type, $entity);
+    $count = db_select($this->table)
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertEqual($count, 2, 'Missing field translation leaves data in table.');
+
+    // Update: Field translation is NULL but field is not empty. Translation
+    // data should be wiped.
+    $entity->{$this->field_name}[$langcode] = NULL;
+    field_attach_update($entity_type, $entity);
+    $count = db_select($this->table)
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertEqual($count, 1, 'NULL field translation is wiped.');
+  }
+
+  /**
+   * Test trying to update a field with data.
+   */
+  function testUpdateFieldSchemaWithData() {
+    // Create a decimal 5.2 field and add some data.
+    $field = array('field_name' => 'decimal52', 'type' => 'number_decimal', 'settings' => array('precision' => 5, 'scale' => 2));
+    $field = field_create_field($field);
+    $instance = array('field_name' => 'decimal52', 'entity_type' => 'test_entity', 'bundle' => 'test_bundle');
+    $instance = field_create_instance($instance);
+    $entity = field_test_create_stub_entity(0, 0, $instance['bundle']);
+    $entity->decimal52[LANGUAGE_NONE][0]['value'] = '1.235';
+    field_attach_insert('test_entity', $entity);
+
+    // Attempt to update the field in a way that would work without data.
+    $field['settings']['scale'] = 3;
+    try {
+      field_update_field($field);
+      $this->fail(t('Cannot update field schema with data.'));
+    }
+    catch (FieldException $e) {
+      $this->pass(t('Cannot update field schema with data.'));
+    }
+  }
+
+  /**
+   * Test that failure to create fields is handled gracefully.
+   */
+  function testFieldUpdateFailure() {
+    // Create a text field.
+    $field = array('field_name' => 'test_text', 'type' => 'text', 'settings' => array('max_length' => 255));
+    $field = field_create_field($field);
+
+    // Attempt to update the field in a way that would break the storage.
+    $prior_field = $field;
+    $field['settings']['max_length'] = -1;
+    try {
+      field_update_field($field);
+      $this->fail(t('Update succeeded.'));
+    }
+    catch (Exception $e) {
+      $this->pass(t('Update properly failed.'));
+    }
+
+    // Ensure that the field tables are still there.
+    foreach (_field_sql_storage_schema($prior_field) as $table_name => $table_info) {
+      $this->assertTrue(db_table_exists($table_name), format_string('Table %table exists.', array('%table' => $table_name)));
+    }
+  }
+
+  /**
+   * Test adding and removing indexes while data is present.
+   */
+  function testFieldUpdateIndexesWithData() {
+
+    // Create a decimal field.
+    $field_name = 'testfield';
+    $field = array('field_name' => $field_name, 'type' => 'text');
+    $field = field_create_field($field);
+    $instance = array('field_name' => $field_name, 'entity_type' => 'test_entity', 'bundle' => 'test_bundle');
+    $instance = field_create_instance($instance);
+    $tables = array(_field_sql_storage_tablename($field), _field_sql_storage_revision_tablename($field));
+
+    // Verify the indexes we will create do not exist yet.
+    foreach ($tables as $table) {
+      $this->assertFalse(Database::getConnection()->schema()->indexExists($table, 'value'), format_string("No index named value exists in %table", array('%table' => $table)));
+      $this->assertFalse(Database::getConnection()->schema()->indexExists($table, 'value_format'), format_string("No index named value_format exists in %table", array('%table' => $table)));
+    }
+
+    // Add data so the table cannot be dropped.
+    $entity = field_test_create_stub_entity(0, 0, $instance['bundle']);
+    $entity->{$field_name}[LANGUAGE_NONE][0]['value'] = 'field data';
+    field_attach_insert('test_entity', $entity);
+
+    // Add an index
+    $field = array('field_name' => $field_name, 'indexes' => array('value' => array('value')));
+    field_update_field($field);
+    foreach ($tables as $table) {
+      $this->assertTrue(Database::getConnection()->schema()->indexExists($table, "{$field_name}_value"), format_string("Index on value created in %table", array('%table' => $table)));
+    }
+
+    // Add a different index, removing the existing custom one.
+    $field = array('field_name' => $field_name, 'indexes' => array('value_format' => array('value', 'format')));
+    field_update_field($field);
+    foreach ($tables as $table) {
+      $this->assertTrue(Database::getConnection()->schema()->indexExists($table, "{$field_name}_value_format"), format_string("Index on value_format created in %table", array('%table' => $table)));
+      $this->assertFalse(Database::getConnection()->schema()->indexExists($table, "{$field_name}_value"), format_string("Index on value removed in %table", array('%table' => $table)));
+    }
+
+    // Verify that the tables were not dropped.
+    $entity = field_test_create_stub_entity(0, 0, $instance['bundle']);
+    field_attach_load('test_entity', array(0 => $entity));
+    $this->assertEqual($entity->{$field_name}[LANGUAGE_NONE][0]['value'], 'field data', "Index changes performed without dropping the tables");
+  }
+
+  /**
+   * Test the storage details.
+   */
+  function testFieldStorageDetails() {
+    $current = _field_sql_storage_tablename($this->field);
+    $revision = _field_sql_storage_revision_tablename($this->field);
+
+    // Retrieve the field and instance with field_info so the storage details are attached.
+    $field = field_info_field($this->field['field_name']);
+    $instance = field_info_instance($this->instance['entity_type'], $this->instance['field_name'], $this->instance['bundle']);
+
+    // The storage details are indexed by a storage engine type.
+    $this->assertTrue(array_key_exists('sql', $field['storage']['details']), 'The storage type is SQL.');
+
+    // The SQL details are indexed by table name.
+    $details = $field['storage']['details']['sql'];
+    $this->assertTrue(array_key_exists($current, $details[FIELD_LOAD_CURRENT]), 'Table name is available in the instance array.');
+    $this->assertTrue(array_key_exists($revision, $details[FIELD_LOAD_REVISION]), 'Revision table name is available in the instance array.');
+
+    // Test current and revision storage details together because the columns
+    // are the same.
+    foreach ((array) $this->field['columns'] as $column_name => $attributes) {
+      $storage_column_name = _field_sql_storage_columnname($this->field['field_name'], $column_name);
+      $this->assertEqual($details[FIELD_LOAD_CURRENT][$current][$column_name], $storage_column_name, format_string('Column name %value matches the definition in %bin.', array('%value' => $column_name, '%bin' => $current)));
+      $this->assertEqual($details[FIELD_LOAD_REVISION][$revision][$column_name], $storage_column_name, format_string('Column name %value matches the definition in %bin.', array('%value' => $column_name, '%bin' => $revision)));
+    }
+  }
+
+  /**
+   * Test foreign key support.
+   */
+  function testFieldSqlStorageForeignKeys() {
+    // Create a 'shape' field, with a configurable foreign key (see
+    // field_test_field_schema()).
+    $field_name = 'testfield';
+    $foreign_key_name = 'shape';
+    $field = array('field_name' => $field_name, 'type' => 'shape', 'settings' => array('foreign_key_name' => $foreign_key_name));
+    field_create_field($field);
+
+    // Retrieve the field definition and check that the foreign key is in place.
+    $field = field_info_field($field_name);
+    $this->assertEqual($field['foreign keys'][$foreign_key_name]['table'], $foreign_key_name, 'Foreign key table name preserved through CRUD');
+    $this->assertEqual($field['foreign keys'][$foreign_key_name]['columns'][$foreign_key_name], 'id', 'Foreign key column name preserved through CRUD');
+
+    // Update the field settings, it should update the foreign key definition
+    // too.
+    $foreign_key_name = 'color';
+    $field['settings']['foreign_key_name'] = $foreign_key_name;
+    field_update_field($field);
+
+    // Retrieve the field definition and check that the foreign key is in place.
+    $field = field_info_field($field_name);
+    $this->assertEqual($field['foreign keys'][$foreign_key_name]['table'], $foreign_key_name, 'Foreign key table name modified after update');
+    $this->assertEqual($field['foreign keys'][$foreign_key_name]['columns'][$foreign_key_name], 'id', 'Foreign key column name modified after update');
+
+    // Now grab the SQL schema and verify that too.
+    $schema = drupal_get_schema(_field_sql_storage_tablename($field), TRUE);
+    $this->assertEqual(count($schema['foreign keys']), 1, 'There is 1 foreign key in the schema');
+    $foreign_key = reset($schema['foreign keys']);
+    $foreign_key_column = _field_sql_storage_columnname($field['field_name'], $foreign_key_name);
+    $this->assertEqual($foreign_key['table'], $foreign_key_name, 'Foreign key table name preserved in the schema');
+    $this->assertEqual($foreign_key['columns'][$foreign_key_column], 'id', 'Foreign key column name preserved in the schema');
+  }
+}
diff --git a/htmltest/modules/field/modules/list/list.info b/htmltest/modules/field/modules/list/list.info
new file mode 100644
index 00000000..a613d3ed
--- /dev/null
+++ b/htmltest/modules/field/modules/list/list.info
@@ -0,0 +1,14 @@
+name = List
+description = Defines list field types. Use with Options to create selection lists.
+package = Core
+version = VERSION
+core = 7.x
+dependencies[] = field
+dependencies[] = options
+files[] = tests/list.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/field/modules/list/list.install b/htmltest/modules/field/modules/list/list.install
new file mode 100644
index 00000000..2386f048
--- /dev/null
+++ b/htmltest/modules/field/modules/list/list.install
@@ -0,0 +1,138 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the list module.
+ */
+
+/**
+ * Implements hook_field_schema().
+ */
+function list_field_schema($field) {
+  switch ($field['type']) {
+    case 'list_text':
+      $columns = array(
+        'value' => array(
+          'type' => 'varchar',
+          'length' => 255,
+          'not null' => FALSE,
+        ),
+      );
+      break;
+    case 'list_float':
+      $columns = array(
+        'value' => array(
+          'type' => 'float',
+          'not null' => FALSE,
+        ),
+      );
+      break;
+    case 'list_integer':
+    case 'list_boolean':
+      $columns = array(
+        'value' => array(
+          'type' => 'int',
+          'not null' => FALSE,
+        ),
+      );
+      break;
+  }
+  return array(
+    'columns' => $columns,
+    'indexes' => array(
+      'value' => array('value'),
+    ),
+  );
+}
+
+/**
+ * Rename the list field types and change 'allowed_values' format.
+ */
+function list_update_7001() {
+  $fields = _update_7000_field_read_fields(array('module' => 'list'));
+  foreach ($fields as $field) {
+    $update = array();
+
+    // Translate the old string format into the new array format.
+    $allowed_values = $field['settings']['allowed_values'];
+    if (is_string($allowed_values)) {
+      $position_keys = ($field['type'] == 'list');
+      $allowed_values = _list_update_7001_extract_allowed_values($allowed_values, $position_keys);
+
+      // Additionally, float keys need to be disambiguated ('.5' is '0.5').
+      if ($field['type'] == 'list_number' && !empty($allowed_values)) {
+        $keys = array_map(create_function('$a', 'return (string) (float) $a;'), array_keys($allowed_values));
+        $allowed_values = array_combine($keys, array_values($allowed_values));
+      }
+
+      // Place the new setting in the existing serialized 'data' column.
+      $data = db_query("SELECT data FROM {field_config} WHERE id = :id", array(':id' => $field['id']))->fetchField();
+      $data = unserialize($data);
+      $data['settings']['allowed_values'] = $allowed_values;
+      $update['data'] = serialize($data);
+    }
+
+    // Rename field types.
+    $types = array('list' => 'list_integer', 'list_number' => 'list_float');
+    if (isset($types[$field['type']])) {
+      $update['type'] = $types[$field['type']];
+    }
+
+    // Save the new data.
+    if ($update) {
+      $query = db_update('field_config')
+        ->condition('id', $field['id'])
+        ->fields($update)
+        ->execute();
+    }
+  }
+}
+
+/**
+ * Helper function for list_update_7001: extract allowed values from a string.
+ *
+ * This reproduces the parsing logic in use before D7 RC2.
+ */
+function _list_update_7001_extract_allowed_values($string, $position_keys) {
+  $values = array();
+
+  $list = explode("\n", $string);
+  $list = array_map('trim', $list);
+  $list = array_filter($list, 'strlen');
+
+  foreach ($list as $key => $value) {
+    // Check for a manually specified key.
+    if (strpos($value, '|') !== FALSE) {
+      list($key, $value) = explode('|', $value);
+    }
+    // Otherwise see if we need to use the value as the key. The "list" type
+    // will automatically convert non-keyed lines to integers.
+    elseif (!$position_keys) {
+      $key = $value;
+    }
+    $values[$key] = (isset($value) && $value !== '') ? $value : $key;
+  }
+
+  return $values;
+}
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Re-apply list_update_7001() for deleted fields.
+ */
+function list_update_7002() {
+  // See http://drupal.org/node/1022924: list_update_7001() intitally
+  // overlooked deleted fields, which then caused fatal errors when the fields
+  // were being purged.
+  // list_update_7001() has the required checks to ensure it is reentrant, so
+  // it can simply be executed once more..
+  list_update_7001();
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra".
+ */
diff --git a/htmltest/modules/field/modules/list/list.module b/htmltest/modules/field/modules/list/list.module
new file mode 100644
index 00000000..634c1348
--- /dev/null
+++ b/htmltest/modules/field/modules/list/list.module
@@ -0,0 +1,486 @@
+<?php
+
+/**
+ * @file
+ * Defines list field types that can be used with the Options module.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function list_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#list':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The List module defines various fields for storing a list of items, for use with the Field module. Usually these items are entered through a select list, checkboxes, or radio buttons. See the <a href="@field-help">Field module help page</a> for more information about fields.', array('@field-help' => url('admin/help/field'))) . '</p>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_field_info().
+ */
+function list_field_info() {
+  return array(
+    'list_integer' => array(
+      'label' => t('List (integer)'),
+      'description' => t("This field stores integer values from a list of allowed 'value => label' pairs, i.e. 'Lifetime in days': 1 => 1 day, 7 => 1 week, 31 => 1 month."),
+      'settings' => array('allowed_values' => array(), 'allowed_values_function' => ''),
+      'default_widget' => 'options_select',
+      'default_formatter' => 'list_default',
+    ),
+    'list_float' => array(
+      'label' => t('List (float)'),
+      'description' => t("This field stores float values from a list of allowed 'value => label' pairs, i.e. 'Fraction': 0 => 0, .25 => 1/4, .75 => 3/4, 1 => 1."),
+      'settings' => array('allowed_values' => array(), 'allowed_values_function' => ''),
+      'default_widget' => 'options_select',
+      'default_formatter' => 'list_default',
+    ),
+    'list_text' => array(
+      'label' => t('List (text)'),
+      'description' => t("This field stores text values from a list of allowed 'value => label' pairs, i.e. 'US States': IL => Illinois, IA => Iowa, IN => Indiana."),
+      'settings' => array('allowed_values' => array(), 'allowed_values_function' => ''),
+      'default_widget' => 'options_select',
+      'default_formatter' => 'list_default',
+    ),
+    'list_boolean' => array(
+      'label' => t('Boolean'),
+      'description' => t('This field stores simple on/off or yes/no options.'),
+      'settings' => array('allowed_values' => array(), 'allowed_values_function' => ''),
+      'default_widget' => 'options_buttons',
+      'default_formatter' => 'list_default',
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_settings_form().
+ */
+function list_field_settings_form($field, $instance, $has_data) {
+  $settings = $field['settings'];
+
+  switch ($field['type']) {
+    case 'list_integer':
+    case 'list_float':
+    case 'list_text':
+      $form['allowed_values'] = array(
+        '#type' => 'textarea',
+        '#title' => t('Allowed values list'),
+        '#default_value' => list_allowed_values_string($settings['allowed_values']),
+        '#rows' => 10,
+        '#element_validate' => array('list_allowed_values_setting_validate'),
+        '#field_has_data' => $has_data,
+        '#field' => $field,
+        '#field_type' => $field['type'],
+        '#access' => empty($settings['allowed_values_function']),
+      );
+
+      $description = '<p>' . t('The possible values this field can contain. Enter one value per line, in the format key|label.');
+      if ($field['type'] == 'list_integer' || $field['type'] == 'list_float') {
+        $description .= '<br/>' . t('The key is the stored value, and must be numeric. The label will be used in displayed values and edit forms.');
+        $description .= '<br/>' . t('The label is optional: if a line contains a single number, it will be used as key and label.');
+        $description .= '<br/>' . t('Lists of labels are also accepted (one label per line), only if the field does not hold any values yet. Numeric keys will be automatically generated from the positions in the list.');
+      }
+      else {
+        $description .= '<br/>' . t('The key is the stored value. The label will be used in displayed values and edit forms.');
+        $description .= '<br/>' . t('The label is optional: if a line contains a single string, it will be used as key and label.');
+      }
+      $description .= '</p>';
+      $form['allowed_values']['#description'] = $description;
+
+      break;
+
+    case 'list_boolean':
+      $values = $settings['allowed_values'];
+      $off_value = array_shift($values);
+      $on_value = array_shift($values);
+
+      $form['allowed_values'] = array(
+        '#type' => 'value',
+        '#description' => '',
+        '#value_callback' => 'list_boolean_allowed_values_callback',
+        '#access' => empty($settings['allowed_values_function']),
+      );
+      $form['allowed_values']['on'] = array(
+        '#type' => 'textfield',
+        '#title' => t('On value'),
+        '#default_value' => $on_value,
+        '#required' => FALSE,
+        '#description' => t('If left empty, "1" will be used.'),
+        // Change #parents to make sure the element is not saved into field
+        // settings.
+        '#parents' => array('on'),
+      );
+      $form['allowed_values']['off'] = array(
+        '#type' => 'textfield',
+        '#title' => t('Off value'),
+        '#default_value' => $off_value,
+        '#required' => FALSE,
+        '#description' => t('If left empty, "0" will be used.'),
+        // Change #parents to make sure the element is not saved into field
+        // settings.
+        '#parents' => array('off'),
+      );
+
+      // Link the allowed value to the on / off elements to prepare for the rare
+      // case of an alter changing #parents.
+      $form['allowed_values']['#on_parents'] = &$form['allowed_values']['on']['#parents'];
+      $form['allowed_values']['#off_parents'] = &$form['allowed_values']['off']['#parents'];
+
+      break;
+  }
+
+  // Alter the description for allowed values depending on the widget type.
+  if ($instance['widget']['type'] == 'options_onoff') {
+    $form['allowed_values']['#description'] .= '<p>' . t("For a 'single on/off checkbox' widget, define the 'off' value first, then the 'on' value in the <strong>Allowed values</strong> section. Note that the checkbox will be labeled with the label of the 'on' value.") . '</p>';
+  }
+  elseif ($instance['widget']['type'] == 'options_buttons') {
+    $form['allowed_values']['#description'] .= '<p>' . t("The 'checkboxes/radio buttons' widget will display checkboxes if the <em>Number of values</em> option is greater than 1 for this field, otherwise radios will be displayed.") . '</p>';
+  }
+  $form['allowed_values']['#description'] .= '<p>' . t('Allowed HTML tags in labels: @tags', array('@tags' => _field_filter_xss_display_allowed_tags())) . '</p>';
+
+  $form['allowed_values_function'] = array(
+    '#type' => 'value',
+    '#value' => $settings['allowed_values_function'],
+  );
+  $form['allowed_values_function_display'] = array(
+    '#type' => 'item',
+    '#title' => t('Allowed values list'),
+    '#markup' => t('The value of this field is being determined by the %function function and may not be changed.', array('%function' => $settings['allowed_values_function'])),
+    '#access' => !empty($settings['allowed_values_function']),
+  );
+
+  return $form;
+}
+
+/**
+ * Element validate callback; check that the entered values are valid.
+ */
+function list_allowed_values_setting_validate($element, &$form_state) {
+  $field = $element['#field'];
+  $has_data = $element['#field_has_data'];
+  $field_type = $field['type'];
+  $generate_keys = ($field_type == 'list_integer' || $field_type == 'list_float') && !$has_data;
+
+  $values = list_extract_allowed_values($element['#value'], $field['type'], $generate_keys);
+
+  if (!is_array($values)) {
+    form_error($element, t('Allowed values list: invalid input.'));
+  }
+  else {
+    // Check that keys are valid for the field type.
+    foreach ($values as $key => $value) {
+      if ($field_type == 'list_integer' && !preg_match('/^-?\d+$/', $key)) {
+        form_error($element, t('Allowed values list: keys must be integers.'));
+        break;
+      }
+      if ($field_type == 'list_float' && !is_numeric($key)) {
+        form_error($element, t('Allowed values list: each key must be a valid integer or decimal.'));
+        break;
+      }
+      elseif ($field_type == 'list_text' && drupal_strlen($key) > 255) {
+        form_error($element, t('Allowed values list: each key must be a string at most 255 characters long.'));
+        break;
+      }
+    }
+
+    // Prevent removing values currently in use.
+    if ($has_data) {
+      $lost_keys = array_diff(array_keys($field['settings']['allowed_values']), array_keys($values));
+      if (_list_values_in_use($field, $lost_keys)) {
+        form_error($element, t('Allowed values list: some values are being removed while currently in use.'));
+      }
+    }
+
+    form_set_value($element, $values, $form_state);
+  }
+}
+
+/**
+* Form element #value_callback: assembles the allowed values for 'boolean' fields.
+*/
+function list_boolean_allowed_values_callback($element, $input, $form_state) {
+  $on = drupal_array_get_nested_value($form_state['input'], $element['#on_parents']);
+  $off = drupal_array_get_nested_value($form_state['input'], $element['#off_parents']);
+  return array($off, $on);
+}
+
+/**
+ * Implements hook_field_update_field().
+ */
+function list_field_update_field($field, $prior_field, $has_data) {
+  drupal_static_reset('list_allowed_values');
+}
+
+/**
+ * Returns the array of allowed values for a list field.
+ *
+ * The strings are not safe for output. Keys and values of the array should be
+ * sanitized through field_filter_xss() before being displayed.
+ *
+ * @param $field
+ *   The field definition.
+ * @param $instance
+ *   (optional) A field instance array. Defaults to NULL.
+ * @param $entity_type
+ *   (optional) The type of entity; e.g. 'node' or 'user'. Defaults to NULL.
+ * @param $entity
+ *   (optional) The entity object. Defaults to NULL.
+ *
+ * @return
+ *   The array of allowed values. Keys of the array are the raw stored values
+ *   (number or text), values of the array are the display labels.
+ */
+function list_allowed_values($field, $instance = NULL, $entity_type = NULL, $entity = NULL) {
+  $allowed_values = &drupal_static(__FUNCTION__, array());
+
+  if (!isset($allowed_values[$field['id']])) {
+    $function = $field['settings']['allowed_values_function'];
+    // If $cacheable is FALSE, then the allowed values are not statically
+    // cached. See list_test_dynamic_values_callback() for an example of
+    // generating dynamic and uncached values.
+    $cacheable = TRUE;
+    if (!empty($function) && function_exists($function)) {
+      $values = $function($field, $instance, $entity_type, $entity, $cacheable);
+    }
+    else {
+      $values = $field['settings']['allowed_values'];
+    }
+
+    if ($cacheable) {
+      $allowed_values[$field['id']] = $values;
+    }
+    else {
+      return $values;
+    }
+  }
+
+  return $allowed_values[$field['id']];
+}
+
+/**
+ * Parses a string of 'allowed values' into an array.
+ *
+ * @param $string
+ *   The list of allowed values in string format described in
+ *   list_allowed_values_string().
+ * @param $field_type
+ *   The field type. Either 'list_number' or 'list_text'.
+ * @param $generate_keys
+ *   Boolean value indicating whether to generate keys based on the position of
+ *   the value if a key is not manually specified, and if the value cannot be
+ *   used as a key. This should only be TRUE for fields of type 'list_number'.
+ *
+ * @return
+ *   The array of extracted key/value pairs, or NULL if the string is invalid.
+ *
+ * @see list_allowed_values_string()
+ */
+function list_extract_allowed_values($string, $field_type, $generate_keys) {
+  $values = array();
+
+  $list = explode("\n", $string);
+  $list = array_map('trim', $list);
+  $list = array_filter($list, 'strlen');
+
+  $generated_keys = $explicit_keys = FALSE;
+  foreach ($list as $position => $text) {
+    $value = $key = FALSE;
+
+    // Check for an explicit key.
+    $matches = array();
+    if (preg_match('/(.*)\|(.*)/', $text, $matches)) {
+      $key = $matches[1];
+      $value = $matches[2];
+      $explicit_keys = TRUE;
+    }
+    // Otherwise see if we can use the value as the key. Detecting true integer
+    // strings takes a little trick.
+    elseif ($field_type == 'list_text'
+    || ($field_type == 'list_float' && is_numeric($text))
+    || ($field_type == 'list_integer' && is_numeric($text) && (float) $text == intval($text))) {
+      $key = $value = $text;
+      $explicit_keys = TRUE;
+    }
+    // Otherwise see if we can generate a key from the position.
+    elseif ($generate_keys) {
+      $key = (string) $position;
+      $value = $text;
+      $generated_keys = TRUE;
+    }
+    else {
+      return;
+    }
+
+    // Float keys are represented as strings and need to be disambiguated
+    // ('.5' is '0.5').
+    if ($field_type == 'list_float' && is_numeric($key)) {
+      $key = (string) (float) $key;
+    }
+
+    $values[$key] = $value;
+  }
+
+  // We generate keys only if the list contains no explicit key at all.
+  if ($explicit_keys && $generated_keys) {
+    return;
+  }
+
+  return $values;
+}
+
+/**
+ * Generates a string representation of an array of 'allowed values'.
+ *
+ * This string format is suitable for edition in a textarea.
+ *
+ * @param $values
+ *   An array of values, where array keys are values and array values are
+ *   labels.
+ *
+ * @return
+ *   The string representation of the $values array:
+ *    - Values are separated by a carriage return.
+ *    - Each value is in the format "value|label" or "value".
+ */
+function list_allowed_values_string($values) {
+  $lines = array();
+  foreach ($values as $key => $value) {
+    $lines[] = "$key|$value";
+  }
+  return implode("\n", $lines);
+}
+
+/**
+ * Implements hook_field_update_forbid().
+ */
+function list_field_update_forbid($field, $prior_field, $has_data) {
+  if ($field['module'] == 'list' && $has_data) {
+    // Forbid any update that removes allowed values with actual data.
+    $lost_keys = array_diff(array_keys($prior_field['settings']['allowed_values']), array_keys($field['settings']['allowed_values']));
+    if (_list_values_in_use($field, $lost_keys)) {
+      throw new FieldUpdateForbiddenException(t('A list field (@field_name) with existing data cannot have its keys changed.', array('@field_name' => $field['field_name'])));
+    }
+  }
+}
+
+/**
+ * Checks if a list of values are being used in actual field values.
+ */
+function _list_values_in_use($field, $values) {
+  if ($values) {
+    $query = new EntityFieldQuery();
+    $found = $query
+      ->fieldCondition($field['field_name'], 'value', $values)
+      ->range(0, 1)
+      ->execute();
+    return !empty($found);
+  }
+
+  return FALSE;
+}
+
+/**
+ * Implements hook_field_validate().
+ *
+ * Possible error codes:
+ * - 'list_illegal_value': The value is not part of the list of allowed values.
+ */
+function list_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
+  $allowed_values = list_allowed_values($field, $instance, $entity_type, $entity);
+  foreach ($items as $delta => $item) {
+    if (!empty($item['value'])) {
+      if (!empty($allowed_values) && !isset($allowed_values[$item['value']])) {
+        $errors[$field['field_name']][$langcode][$delta][] = array(
+          'error' => 'list_illegal_value',
+          'message' => t('%name: illegal value.', array('%name' => $instance['label'])),
+        );
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_is_empty().
+ */
+function list_field_is_empty($item, $field) {
+  if (empty($item['value']) && (string) $item['value'] !== '0') {
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
+ * Implements hook_field_widget_info_alter().
+ *
+ * The List module does not implement widgets of its own, but reuses the
+ * widgets defined in options.module.
+ *
+ * @see list_options_list()
+ */
+function list_field_widget_info_alter(&$info) {
+  $widgets = array(
+    'options_select' => array('list_integer', 'list_float', 'list_text'),
+    'options_buttons' => array('list_integer', 'list_float', 'list_text', 'list_boolean'),
+    'options_onoff' => array('list_boolean'),
+  );
+
+  foreach ($widgets as $widget => $field_types) {
+    $info[$widget]['field types'] = array_merge($info[$widget]['field types'], $field_types);
+  }
+}
+
+/**
+ * Implements hook_options_list().
+ */
+function list_options_list($field, $instance, $entity_type, $entity) {
+  return list_allowed_values($field, $instance, $entity_type, $entity);
+}
+
+/**
+ * Implements hook_field_formatter_info().
+ */
+function list_field_formatter_info() {
+  return array(
+    'list_default' => array(
+      'label' => t('Default'),
+      'field types' => array('list_integer', 'list_float', 'list_text', 'list_boolean'),
+    ),
+    'list_key' => array(
+      'label' => t('Key'),
+      'field types' => array('list_integer', 'list_float', 'list_text', 'list_boolean'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_formatter_view().
+ */
+function list_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  $element = array();
+
+  switch ($display['type']) {
+    case 'list_default':
+      $allowed_values = list_allowed_values($field, $instance, $entity_type, $entity);
+      foreach ($items as $delta => $item) {
+        if (isset($allowed_values[$item['value']])) {
+          $output = field_filter_xss($allowed_values[$item['value']]);
+        }
+        else {
+          // If no match was found in allowed values, fall back to the key.
+          $output = field_filter_xss($item['value']);
+        }
+        $element[$delta] = array('#markup' => $output);
+      }
+      break;
+
+    case 'list_key':
+      foreach ($items as $delta => $item) {
+        $element[$delta] = array('#markup' => field_filter_xss($item['value']));
+      }
+      break;
+  }
+
+  return $element;
+}
diff --git a/htmltest/modules/field/modules/list/tests/list.test b/htmltest/modules/field/modules/list/tests/list.test
new file mode 100644
index 00000000..84de7e89
--- /dev/null
+++ b/htmltest/modules/field/modules/list/tests/list.test
@@ -0,0 +1,457 @@
+<?php
+
+/**
+ * @file
+ * Tests for list.module.
+ */
+
+/**
+ * Tests for the 'List' field types.
+ */
+class ListFieldTestCase extends FieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'List field',
+      'description' => 'Test the List field type.',
+      'group' => 'Field types',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('field_test');
+
+    $this->field_name = 'test_list';
+    $this->field = array(
+      'field_name' => $this->field_name,
+      'type' => 'list_integer',
+      'cardinality' => 1,
+      'settings' => array(
+        'allowed_values' => array(1 => 'One', 2 => 'Two', 3 => 'Three'),
+      ),
+    );
+    $this->field = field_create_field($this->field);
+
+    $this->instance = array(
+      'field_name' => $this->field_name,
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'widget' => array(
+        'type' => 'options_buttons',
+      ),
+    );
+    $this->instance = field_create_instance($this->instance);
+  }
+
+  /**
+   * Test that allowed values can be updated.
+   */
+  function testUpdateAllowedValues() {
+    $langcode = LANGUAGE_NONE;
+
+    // All three options appear.
+    $entity = field_test_create_stub_entity();
+    $form = drupal_get_form('field_test_entity_form', $entity);
+    $this->assertTrue(!empty($form[$this->field_name][$langcode][1]), 'Option 1 exists');
+    $this->assertTrue(!empty($form[$this->field_name][$langcode][2]), 'Option 2 exists');
+    $this->assertTrue(!empty($form[$this->field_name][$langcode][3]), 'Option 3 exists');
+
+    // Use one of the values in an actual entity, and check that this value
+    // cannot be removed from the list.
+    $entity = field_test_create_stub_entity();
+    $entity->{$this->field_name}[$langcode][0] = array('value' => 1);
+    field_test_entity_save($entity);
+    $this->field['settings']['allowed_values'] = array(2 => 'Two');
+    try {
+      field_update_field($this->field);
+      $this->fail(t('Cannot update a list field to not include keys with existing data.'));
+    }
+    catch (FieldException $e) {
+      $this->pass(t('Cannot update a list field to not include keys with existing data.'));
+    }
+    // Empty the value, so that we can actually remove the option.
+    $entity->{$this->field_name}[$langcode] = array();
+    field_test_entity_save($entity);
+
+    // Removed options do not appear.
+    $this->field['settings']['allowed_values'] = array(2 => 'Two');
+    field_update_field($this->field);
+    $entity = field_test_create_stub_entity();
+    $form = drupal_get_form('field_test_entity_form', $entity);
+    $this->assertTrue(empty($form[$this->field_name][$langcode][1]), 'Option 1 does not exist');
+    $this->assertTrue(!empty($form[$this->field_name][$langcode][2]), 'Option 2 exists');
+    $this->assertTrue(empty($form[$this->field_name][$langcode][3]), 'Option 3 does not exist');
+
+    // Completely new options appear.
+    $this->field['settings']['allowed_values'] = array(10 => 'Update', 20 => 'Twenty');
+    field_update_field($this->field);
+    $form = drupal_get_form('field_test_entity_form', $entity);
+    $this->assertTrue(empty($form[$this->field_name][$langcode][1]), 'Option 1 does not exist');
+    $this->assertTrue(empty($form[$this->field_name][$langcode][2]), 'Option 2 does not exist');
+    $this->assertTrue(empty($form[$this->field_name][$langcode][3]), 'Option 3 does not exist');
+    $this->assertTrue(!empty($form[$this->field_name][$langcode][10]), 'Option 10 exists');
+    $this->assertTrue(!empty($form[$this->field_name][$langcode][20]), 'Option 20 exists');
+
+    // Options are reset when a new field with the same name is created.
+    field_delete_field($this->field_name);
+    unset($this->field['id']);
+    $this->field['settings']['allowed_values'] = array(1 => 'One', 2 => 'Two', 3 => 'Three');
+    $this->field = field_create_field($this->field);
+    $this->instance = array(
+      'field_name' => $this->field_name,
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'widget' => array(
+        'type' => 'options_buttons',
+      ),
+    );
+    $this->instance = field_create_instance($this->instance);
+    $entity = field_test_create_stub_entity();
+    $form = drupal_get_form('field_test_entity_form', $entity);
+    $this->assertTrue(!empty($form[$this->field_name][$langcode][1]), 'Option 1 exists');
+    $this->assertTrue(!empty($form[$this->field_name][$langcode][2]), 'Option 2 exists');
+    $this->assertTrue(!empty($form[$this->field_name][$langcode][3]), 'Option 3 exists');
+  }
+}
+
+/**
+ * Sets up a List field for testing allowed values functions.
+ */
+class ListDynamicValuesTestCase extends FieldTestCase {
+  function setUp() {
+    parent::setUp(array('list', 'field_test', 'list_test'));
+
+    $this->field_name = 'test_list';
+    $this->field = array(
+      'field_name' => $this->field_name,
+      'type' => 'list_text',
+      'cardinality' => 1,
+      'settings' => array(
+        'allowed_values_function' => 'list_test_dynamic_values_callback',
+      ),
+    );
+    $this->field = field_create_field($this->field);
+
+    $this->instance = array(
+      'field_name' => $this->field_name,
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'required' => TRUE,
+      'widget' => array(
+        'type' => 'options_select',
+      ),
+    );
+    $this->instance = field_create_instance($this->instance);
+    $this->test = array(
+      'id' => mt_rand(1, 10),
+      // Make sure this does not equal the ID so that
+      // list_test_dynamic_values_callback() always returns 4 values.
+      'vid' => mt_rand(20, 30),
+      'bundle' => 'test_bundle',
+      'label' => $this->randomName(),
+    );
+    $this->entity = call_user_func_array('field_test_create_stub_entity', $this->test);
+  }
+}
+
+/**
+ * Tests the List field allowed values function.
+ */
+class ListDynamicValuesValidationTestCase extends ListDynamicValuesTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'List field dynamic values',
+      'description' => 'Test the List field allowed values function.',
+      'group' => 'Field types',
+    );
+  }
+
+  /**
+   * Test that allowed values function gets the entity.
+   */
+  function testDynamicAllowedValues() {
+    // Verify that the test passes against every value we had.
+    foreach ($this->test as $key => $value) {
+      $this->entity->test_list[LANGUAGE_NONE][0]['value'] = $value;
+      try {
+        field_attach_validate('test_entity', $this->entity);
+        $this->pass("$key should pass");
+      }
+      catch (FieldValidationException $e) {
+        // This will display as an exception, no need for a separate error.
+        throw($e);
+      }
+    }
+    // Now verify that the test does not pass against anything else.
+    foreach ($this->test as $key => $value) {
+      $this->entity->test_list[LANGUAGE_NONE][0]['value'] = is_numeric($value) ? (100 - $value) : ('X' . $value);
+      $pass = FALSE;
+      try {
+        field_attach_validate('test_entity', $this->entity);
+      }
+      catch (FieldValidationException $e) {
+        $pass = TRUE;
+      }
+      $this->assertTrue($pass, $key . ' should not pass');
+    }
+  }
+}
+
+/**
+ * List module UI tests.
+ */
+class ListFieldUITestCase extends FieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'List field UI',
+      'description' => 'Test the List field UI functionality.',
+      'group' => 'Field types',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('field_test', 'field_ui');
+
+    // Create test user.
+    $admin_user = $this->drupalCreateUser(array('access content', 'administer content types', 'administer taxonomy'));
+    $this->drupalLogin($admin_user);
+
+    // Create content type, with underscores.
+    $type_name = 'test_' . strtolower($this->randomName());
+    $type = $this->drupalCreateContentType(array('name' => $type_name, 'type' => $type_name));
+    $this->type = $type->type;
+    // Store a valid URL name, with hyphens instead of underscores.
+    $this->hyphen_type = str_replace('_', '-', $this->type);
+  }
+
+  /**
+   * List (integer) : test 'allowed values' input.
+   */
+  function testListAllowedValuesInteger() {
+    $this->field_name = 'field_list_integer';
+    $this->createListField('list_integer');
+
+    // Flat list of textual values.
+    $string = "Zero\nOne";
+    $array = array('0' => 'Zero', '1' => 'One');
+    $this->assertAllowedValuesInput($string, $array, 'Unkeyed lists are accepted.');
+    // Explicit integer keys.
+    $string = "0|Zero\n2|Two";
+    $array = array('0' => 'Zero', '2' => 'Two');
+    $this->assertAllowedValuesInput($string, $array, 'Integer keys are accepted.');
+    // Check that values can be added and removed.
+    $string = "0|Zero\n1|One";
+    $array = array('0' => 'Zero', '1' => 'One');
+    $this->assertAllowedValuesInput($string, $array, 'Values can be added and removed.');
+    // Non-integer keys.
+    $this->assertAllowedValuesInput("1.1|One", 'keys must be integers', 'Non integer keys are rejected.');
+    $this->assertAllowedValuesInput("abc|abc", 'keys must be integers', 'Non integer keys are rejected.');
+    // Mixed list of keyed and unkeyed values.
+    $this->assertAllowedValuesInput("Zero\n1|One", 'invalid input', 'Mixed lists are rejected.');
+
+    // Create a node with actual data for the field.
+    $settings = array(
+      'type' => $this->type,
+      $this->field_name => array(LANGUAGE_NONE => array(array('value' => 1))),
+    );
+    $node = $this->drupalCreateNode($settings);
+
+    // Check that a flat list of values is rejected once the field has data.
+    $this->assertAllowedValuesInput( "Zero\nOne", 'invalid input', 'Unkeyed lists are rejected once the field has data.');
+
+    // Check that values can be added but values in use cannot be removed.
+    $string = "0|Zero\n1|One\n2|Two";
+    $array = array('0' => 'Zero', '1' => 'One', '2' => 'Two');
+    $this->assertAllowedValuesInput($string, $array, 'Values can be added.');
+    $string = "0|Zero\n1|One";
+    $array = array('0' => 'Zero', '1' => 'One');
+    $this->assertAllowedValuesInput($string, $array, 'Values not in use can be removed.');
+    $this->assertAllowedValuesInput("0|Zero", 'some values are being removed while currently in use', 'Values in use cannot be removed.');
+
+    // Delete the node, remove the value.
+    node_delete($node->nid);
+    $string = "0|Zero";
+    $array = array('0' => 'Zero');
+    $this->assertAllowedValuesInput($string, $array, 'Values not in use can be removed.');
+  }
+
+  /**
+   * List (float) : test 'allowed values' input.
+   */
+  function testListAllowedValuesFloat() {
+    $this->field_name = 'field_list_float';
+    $this->createListField('list_float');
+
+    // Flat list of textual values.
+    $string = "Zero\nOne";
+    $array = array('0' => 'Zero', '1' => 'One');
+    $this->assertAllowedValuesInput($string, $array, 'Unkeyed lists are accepted.');
+    // Explicit numeric keys.
+    $string = "0|Zero\n.5|Point five";
+    $array = array('0' => 'Zero', '0.5' => 'Point five');
+    $this->assertAllowedValuesInput($string, $array, 'Integer keys are accepted.');
+    // Check that values can be added and removed.
+    $string = "0|Zero\n.5|Point five\n1.0|One";
+    $array = array('0' => 'Zero', '0.5' => 'Point five', '1' => 'One');
+    $this->assertAllowedValuesInput($string, $array, 'Values can be added and removed.');
+    // Non-numeric keys.
+    $this->assertAllowedValuesInput("abc|abc\n", 'each key must be a valid integer or decimal', 'Non numeric keys are rejected.');
+    // Mixed list of keyed and unkeyed values.
+    $this->assertAllowedValuesInput("Zero\n1|One\n", 'invalid input', 'Mixed lists are rejected.');
+
+    // Create a node with actual data for the field.
+    $settings = array(
+      'type' => $this->type,
+      $this->field_name => array(LANGUAGE_NONE => array(array('value' => .5))),
+    );
+    $node = $this->drupalCreateNode($settings);
+
+    // Check that a flat list of values is rejected once the field has data.
+    $this->assertAllowedValuesInput("Zero\nOne", 'invalid input', 'Unkeyed lists are rejected once the field has data.');
+
+    // Check that values can be added but values in use cannot be removed.
+    $string = "0|Zero\n.5|Point five\n2|Two";
+    $array = array('0' => 'Zero', '0.5' => 'Point five', '2' => 'Two');
+    $this->assertAllowedValuesInput($string, $array, 'Values can be added.');
+    $string = "0|Zero\n.5|Point five";
+    $array = array('0' => 'Zero', '0.5' => 'Point five');
+    $this->assertAllowedValuesInput($string, $array, 'Values not in use can be removed.');
+    $this->assertAllowedValuesInput("0|Zero", 'some values are being removed while currently in use', 'Values in use cannot be removed.');
+
+    // Delete the node, remove the value.
+    node_delete($node->nid);
+    $string = "0|Zero";
+    $array = array('0' => 'Zero');
+    $this->assertAllowedValuesInput($string, $array, 'Values not in use can be removed.');
+  }
+
+  /**
+   * List (text) : test 'allowed values' input.
+   */
+  function testListAllowedValuesText() {
+    $this->field_name = 'field_list_text';
+    $this->createListField('list_text');
+
+    // Flat list of textual values.
+    $string = "Zero\nOne";
+    $array = array('Zero' => 'Zero', 'One' => 'One');
+    $this->assertAllowedValuesInput($string, $array, 'Unkeyed lists are accepted.');
+    // Explicit keys.
+    $string = "zero|Zero\none|One";
+    $array = array('zero' => 'Zero', 'one' => 'One');
+    $this->assertAllowedValuesInput($string, $array, 'Explicit keys are accepted.');
+    // Check that values can be added and removed.
+    $string = "zero|Zero\ntwo|Two";
+    $array = array('zero' => 'Zero', 'two' => 'Two');
+    $this->assertAllowedValuesInput($string, $array, 'Values can be added and removed.');
+    // Mixed list of keyed and unkeyed values.
+    $string = "zero|Zero\nOne\n";
+    $array = array('zero' => 'Zero', 'One' => 'One');
+    $this->assertAllowedValuesInput($string, $array, 'Mixed lists are accepted.');
+    // Overly long keys.
+    $this->assertAllowedValuesInput("zero|Zero\n" . $this->randomName(256) . "|One", 'each key must be a string at most 255 characters long', 'Overly long keys are rejected.');
+
+    // Create a node with actual data for the field.
+    $settings = array(
+      'type' => $this->type,
+      $this->field_name => array(LANGUAGE_NONE => array(array('value' => 'One'))),
+    );
+    $node = $this->drupalCreateNode($settings);
+
+    // Check that flat lists of values are still accepted once the field has
+    // data.
+    $string = "Zero\nOne";
+    $array = array('Zero' => 'Zero', 'One' => 'One');
+    $this->assertAllowedValuesInput($string, $array, 'Unkeyed lists are still accepted once the field has data.');
+
+    // Check that values can be added but values in use cannot be removed.
+    $string = "Zero\nOne\nTwo";
+    $array = array('Zero' => 'Zero', 'One' => 'One', 'Two' => 'Two');
+    $this->assertAllowedValuesInput($string, $array, 'Values can be added.');
+    $string = "Zero\nOne";
+    $array = array('Zero' => 'Zero', 'One' => 'One');
+    $this->assertAllowedValuesInput($string, $array, 'Values not in use can be removed.');
+    $this->assertAllowedValuesInput("Zero", 'some values are being removed while currently in use', 'Values in use cannot be removed.');
+
+    // Delete the node, remove the value.
+    node_delete($node->nid);
+    $string = "Zero";
+    $array = array('Zero' => 'Zero');
+    $this->assertAllowedValuesInput($string, $array, 'Values not in use can be removed.');
+  }
+
+  /**
+   * List (boolen) : test 'On/Off' values input.
+   */
+  function testListAllowedValuesBoolean() {
+    $this->field_name = 'field_list_boolean';
+    $this->createListField('list_boolean');
+
+    // Check that the separate 'On' and 'Off' form fields work.
+    $on = $this->randomName();
+    $off = $this->randomName();
+    $allowed_values = array(1 => $on, 0 => $off);
+    $edit = array(
+      'on' => $on,
+      'off' => $off,
+    );
+    $this->drupalPost($this->admin_path, $edit, t('Save settings'));
+    $this->assertText("Saved field_list_boolean configuration.", "The 'On' and 'Off' form fields work for boolean fields.");
+    // Test the allowed_values on the field settings form.
+    $this->drupalGet($this->admin_path);
+    $this->assertFieldByName('on', $on, "The 'On' value is stored correctly.");
+    $this->assertFieldByName('off', $off, "The 'Off' value is stored correctly.");
+    $field = field_info_field($this->field_name);
+    $this->assertEqual($field['settings']['allowed_values'], $allowed_values, 'The allowed value is correct');
+    $this->assertFalse(isset($field['settings']['on']), 'The on value is not saved into settings');
+    $this->assertFalse(isset($field['settings']['off']), 'The off value is not saved into settings');
+  }
+
+  /**
+   * Helper function to create list field of a given type.
+   *
+   * @param string $type
+   *   'list_integer', 'list_float', 'list_text' or 'list_boolean'
+   */
+  protected function createListField($type) {
+    // Create a test field and instance.
+    $field = array(
+      'field_name' => $this->field_name,
+      'type' => $type,
+    );
+    field_create_field($field);
+    $instance = array(
+      'field_name' => $this->field_name,
+      'entity_type' => 'node',
+      'bundle' => $this->type,
+    );
+    field_create_instance($instance);
+
+    $this->admin_path = 'admin/structure/types/manage/' . $this->hyphen_type . '/fields/' . $this->field_name;
+  }
+
+  /**
+   * Tests a string input for the 'allowed values' form element.
+   *
+   * @param $input_string
+   *   The input string, in the pipe-linefeed format expected by the form
+   *   element.
+   * @param $result
+   *   Either an expected resulting array in
+   *   $field['settings']['allowed_values'], or an expected error message.
+   * @param $message
+   *   Message to display.
+   */
+  function assertAllowedValuesInput($input_string, $result, $message) {
+    $edit = array('field[settings][allowed_values]' => $input_string);
+    $this->drupalPost($this->admin_path, $edit, t('Save settings'));
+
+    if (is_string($result)) {
+      $this->assertText($result, $message);
+    }
+    else {
+      field_info_cache_clear();
+      $field = field_info_field($this->field_name);
+      $this->assertIdentical($field['settings']['allowed_values'], $result, $message);
+    }
+  }
+}
diff --git a/htmltest/modules/field/modules/list/tests/list_test.info b/htmltest/modules/field/modules/list/tests/list_test.info
new file mode 100644
index 00000000..92f4bd04
--- /dev/null
+++ b/htmltest/modules/field/modules/list/tests/list_test.info
@@ -0,0 +1,12 @@
+name = "List test"
+description = "Support module for the List module tests."
+core = 7.x
+package = Testing
+version = VERSION
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/field/modules/list/tests/list_test.module b/htmltest/modules/field/modules/list/tests/list_test.module
new file mode 100644
index 00000000..aa533377
--- /dev/null
+++ b/htmltest/modules/field/modules/list/tests/list_test.module
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Helper module for the List module tests.
+ */
+
+/**
+ * Allowed values callback.
+ */
+function list_test_allowed_values_callback($field) {
+  $values = array(
+    'Group 1' => array(
+      0 => 'Zero',
+    ),
+    1 => 'One',
+    'Group 2' => array(
+      2 => 'Some <script>dangerous</script> & unescaped <strong>markup</strong>',
+    ),
+  );
+
+  return $values;
+}
+
+/**
+ * An entity-bound allowed values callback.
+ */
+function list_test_dynamic_values_callback($field, $instance, $entity_type, $entity, &$cacheable) {
+  $cacheable = FALSE;
+  // We need the values of the entity as keys.
+  return drupal_map_assoc(array_merge(array($entity->ftlabel), entity_extract_ids($entity_type, $entity)));
+}
diff --git a/htmltest/modules/field/modules/number/number.info b/htmltest/modules/field/modules/number/number.info
new file mode 100644
index 00000000..a2b6c974
--- /dev/null
+++ b/htmltest/modules/field/modules/number/number.info
@@ -0,0 +1,13 @@
+name = Number
+description = Defines numeric field types.
+package = Core
+version = VERSION
+core = 7.x
+dependencies[] = field
+files[] = number.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/field/modules/number/number.install b/htmltest/modules/field/modules/number/number.install
new file mode 100644
index 00000000..02c7a305
--- /dev/null
+++ b/htmltest/modules/field/modules/number/number.install
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the number module.
+ */
+
+/**
+ * Implements hook_field_schema().
+ */
+function number_field_schema($field) {
+  switch ($field['type']) {
+    case 'number_integer' :
+      $columns = array(
+        'value' => array(
+          'type' => 'int',
+          'not null' => FALSE
+        ),
+      );
+      break;
+
+    case 'number_float' :
+      $columns = array(
+        'value' => array(
+          'type' => 'float',
+          'not null' => FALSE
+        ),
+      );
+      break;
+
+    case 'number_decimal' :
+      $columns = array(
+        'value' => array(
+          'type' => 'numeric',
+          'precision' => $field['settings']['precision'],
+          'scale' => $field['settings']['scale'],
+          'not null' => FALSE
+        ),
+      );
+      break;
+  }
+  return array(
+    'columns' => $columns,
+  );
+}
diff --git a/htmltest/modules/field/modules/number/number.module b/htmltest/modules/field/modules/number/number.module
new file mode 100644
index 00000000..60465442
--- /dev/null
+++ b/htmltest/modules/field/modules/number/number.module
@@ -0,0 +1,419 @@
+<?php
+
+/**
+ * @file
+ * Defines numeric field types.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function number_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#number':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Number module defines various numeric field types for the Field module. Numbers can be in integer, decimal, or floating-point form, and they can be formatted when displayed. Number fields can be limited to a specific set of input values or to a range of values. See the <a href="@field-help">Field module help page</a> for more information about fields.', array('@field-help' => url('admin/help/field'))) . '</p>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_field_info().
+ */
+function number_field_info() {
+  return array(
+    'number_integer' => array(
+      'label' => t('Integer'),
+      'description' => t('This field stores a number in the database as an integer.'),
+      'instance_settings' => array('min' => '', 'max' => '', 'prefix' => '', 'suffix' => ''),
+      'default_widget' => 'number',
+      'default_formatter' => 'number_integer',
+    ),
+    'number_decimal' => array(
+      'label' => t('Decimal'),
+      'description' => t('This field stores a number in the database in a fixed decimal format.'),
+      'settings' => array('precision' => 10, 'scale' => 2, 'decimal_separator' => '.'),
+      'instance_settings' => array('min' => '', 'max' => '', 'prefix' => '', 'suffix' => ''),
+      'default_widget' => 'number',
+      'default_formatter' => 'number_decimal',
+    ),
+    'number_float' => array(
+      'label' => t('Float'),
+      'description' => t('This field stores a number in the database in a floating point format.'),
+      'settings' => array('decimal_separator' => '.'),
+      'instance_settings' => array('min' => '', 'max' => '', 'prefix' => '', 'suffix' => ''),
+      'default_widget' => 'number',
+      'default_formatter' => 'number_decimal',
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_settings_form().
+ */
+function number_field_settings_form($field, $instance, $has_data) {
+  $settings = $field['settings'];
+  $form = array();
+
+  if ($field['type'] == 'number_decimal') {
+    $form['precision'] = array(
+      '#type' => 'select',
+      '#title' => t('Precision'),
+      '#options' => drupal_map_assoc(range(10, 32)),
+      '#default_value' => $settings['precision'],
+      '#description' => t('The total number of digits to store in the database, including those to the right of the decimal.'),
+      '#disabled' => $has_data,
+    );
+    $form['scale'] = array(
+      '#type' => 'select',
+      '#title' => t('Scale'),
+      '#options' => drupal_map_assoc(range(0, 10)),
+      '#default_value' => $settings['scale'],
+      '#description' => t('The number of digits to the right of the decimal.'),
+      '#disabled' => $has_data,
+    );
+  }
+  if ($field['type'] == 'number_decimal' || $field['type'] == 'number_float') {
+    $form['decimal_separator'] = array(
+      '#type' => 'select',
+      '#title' => t('Decimal marker'),
+      '#options' => array('.' => t('Decimal point'), ',' => t('Comma')),
+      '#default_value' => $settings['decimal_separator'],
+      '#description' => t('The character users will input to mark the decimal point in forms.'),
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_instance_settings_form().
+ */
+function number_field_instance_settings_form($field, $instance) {
+  $settings = $instance['settings'];
+
+  $form['min'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Minimum'),
+    '#default_value' => $settings['min'],
+    '#description' => t('The minimum value that should be allowed in this field. Leave blank for no minimum.'),
+    '#element_validate' => array('element_validate_number'),
+  );
+  $form['max'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Maximum'),
+    '#default_value' => $settings['max'],
+    '#description' => t('The maximum value that should be allowed in this field. Leave blank for no maximum.'),
+    '#element_validate' => array('element_validate_number'),
+  );
+  $form['prefix'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Prefix'),
+    '#default_value' => $settings['prefix'],
+    '#size' => 60,
+    '#description' => t("Define a string that should be prefixed to the value, like '$ ' or '&euro; '. Leave blank for none. Separate singular and plural values with a pipe ('pound|pounds')."),
+  );
+  $form['suffix'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Suffix'),
+    '#default_value' => $settings['suffix'],
+    '#size' => 60,
+    '#description' => t("Define a string that should be suffixed to the value, like ' m', ' kb/s'. Leave blank for none. Separate singular and plural values with a pipe ('pound|pounds')."),
+  );
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_validate().
+ *
+ * Possible error codes:
+ * - 'number_min': The value is less than the allowed minimum value.
+ * - 'number_max': The value is greater than the allowed maximum value.
+ */
+function number_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
+  foreach ($items as $delta => $item) {
+    if ($item['value'] != '') {
+      if (is_numeric($instance['settings']['min']) && $item['value'] < $instance['settings']['min']) {
+        $errors[$field['field_name']][$langcode][$delta][] = array(
+          'error' => 'number_min',
+          'message' => t('%name: the value may be no less than %min.', array('%name' => $instance['label'], '%min' => $instance['settings']['min'])),
+        );
+      }
+      if (is_numeric($instance['settings']['max']) && $item['value'] > $instance['settings']['max']) {
+        $errors[$field['field_name']][$langcode][$delta][] = array(
+          'error' => 'number_max',
+          'message' => t('%name: the value may be no greater than %max.', array('%name' => $instance['label'], '%max' => $instance['settings']['max'])),
+        );
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_presave().
+ */
+function number_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  if ($field['type'] == 'number_decimal') {
+    // Let PHP round the value to ensure consistent behavior across storage
+    // backends.
+    foreach ($items as $delta => $item) {
+      if (isset($item['value'])) {
+        $items[$delta]['value'] = round($item['value'], $field['settings']['scale']);
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_is_empty().
+ */
+function number_field_is_empty($item, $field) {
+  if (empty($item['value']) && (string) $item['value'] !== '0') {
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
+ * Implements hook_field_formatter_info().
+ */
+function number_field_formatter_info() {
+  return array(
+    // The 'Default' formatter is different for integer fields on the one hand,
+    // and for decimal and float fields on the other hand, in order to be able
+    // to use different default values for the settings.
+    'number_integer' => array(
+      'label' => t('Default'),
+      'field types' => array('number_integer'),
+      'settings' =>  array(
+        'thousand_separator' => ' ',
+        // The 'decimal_separator' and 'scale' settings are not configurable
+        // through the UI, and will therefore keep their default values. They
+        // are only present so that the 'number_integer' and 'number_decimal'
+        // formatters can use the same code.
+        'decimal_separator' => '.',
+        'scale' => 0,
+        'prefix_suffix' => TRUE,
+      ),
+    ),
+    'number_decimal' => array(
+      'label' => t('Default'),
+      'field types' => array('number_decimal', 'number_float'),
+      'settings' =>  array(
+        'thousand_separator' => ' ',
+        'decimal_separator' => '.',
+        'scale' => 2,
+        'prefix_suffix' => TRUE,
+      ),
+    ),
+    'number_unformatted' => array(
+      'label' => t('Unformatted'),
+      'field types' => array('number_integer', 'number_decimal', 'number_float'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_formatter_settings_form().
+ */
+function number_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  if ($display['type'] == 'number_decimal' || $display['type'] == 'number_integer') {
+    $options = array(
+      ''  => t('<none>'),
+      '.' => t('Decimal point'),
+      ',' => t('Comma'),
+      ' ' => t('Space'),
+    );
+    $element['thousand_separator'] = array(
+      '#type' => 'select',
+      '#title' => t('Thousand marker'),
+      '#options' => $options,
+      '#default_value' => $settings['thousand_separator'],
+    );
+
+    if ($display['type'] == 'number_decimal') {
+      $element['decimal_separator'] = array(
+        '#type' => 'select',
+        '#title' => t('Decimal marker'),
+        '#options' => array('.' => t('Decimal point'), ',' => t('Comma')),
+        '#default_value' => $settings['decimal_separator'],
+      );
+      $element['scale'] = array(
+        '#type' => 'select',
+        '#title' => t('Scale'),
+        '#options' => drupal_map_assoc(range(0, 10)),
+        '#default_value' => $settings['scale'],
+        '#description' => t('The number of digits to the right of the decimal.'),
+      );
+    }
+
+    $element['prefix_suffix'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Display prefix and suffix.'),
+      '#default_value' => $settings['prefix_suffix'],
+    );
+  }
+
+  return $element;
+}
+
+/**
+ * Implements hook_field_formatter_settings_summary().
+ */
+function number_field_formatter_settings_summary($field, $instance, $view_mode) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $summary = array();
+  if ($display['type'] == 'number_decimal' || $display['type'] == 'number_integer') {
+    $summary[] = number_format(1234.1234567890, $settings['scale'], $settings['decimal_separator'], $settings['thousand_separator']);
+    if ($settings['prefix_suffix']) {
+      $summary[] = t('Display with prefix and suffix.');
+    }
+  }
+
+  return implode('<br />', $summary);
+}
+
+/**
+ * Implements hook_field_formatter_view().
+ */
+function number_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  $element = array();
+  $settings = $display['settings'];
+
+  switch ($display['type']) {
+    case 'number_integer':
+    case 'number_decimal':
+      foreach ($items as $delta => $item) {
+        $output = number_format($item['value'], $settings['scale'], $settings['decimal_separator'], $settings['thousand_separator']);
+        if ($settings['prefix_suffix']) {
+          $prefixes = isset($instance['settings']['prefix']) ? array_map('field_filter_xss', explode('|', $instance['settings']['prefix'])) : array('');
+          $suffixes = isset($instance['settings']['suffix']) ? array_map('field_filter_xss', explode('|', $instance['settings']['suffix'])) : array('');
+          $prefix = (count($prefixes) > 1) ? format_plural($item['value'], $prefixes[0], $prefixes[1]) : $prefixes[0];
+          $suffix = (count($suffixes) > 1) ? format_plural($item['value'], $suffixes[0], $suffixes[1]) : $suffixes[0];
+          $output = $prefix . $output . $suffix;
+        }
+        $element[$delta] = array('#markup' => $output);
+      }
+      break;
+
+    case 'number_unformatted':
+      foreach ($items as $delta => $item) {
+        $element[$delta] = array('#markup' => $item['value']);
+      }
+      break;
+  }
+
+  return $element;
+}
+
+/**
+ * Implements hook_field_widget_info().
+ */
+function number_field_widget_info() {
+  return array(
+    'number' => array(
+      'label' => t('Text field'),
+      'field types' => array('number_integer', 'number_decimal', 'number_float'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_widget_form().
+ */
+function number_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  $value = isset($items[$delta]['value']) ? $items[$delta]['value'] : '';
+  // Substitute the decimal separator.
+  if ($field['type'] == 'number_decimal' || $field['type'] == 'number_float') {
+    $value = strtr($value, '.', $field['settings']['decimal_separator']);
+  }
+
+  $element += array(
+    '#type' => 'textfield',
+    '#default_value' => $value,
+    // Allow a slightly larger size that the field length to allow for some
+    // configurations where all characters won't fit in input field.
+    '#size' => $field['type'] == 'number_decimal' ? $field['settings']['precision'] + 4 : 12,
+    // Allow two extra characters for signed values and decimal separator.
+    '#maxlength' => $field['type'] == 'number_decimal' ? $field['settings']['precision'] + 2 : 10,
+    // Extract the number type from the field type name for easier validation.
+    '#number_type' => str_replace('number_', '', $field['type']),
+  );
+
+  // Add prefix and suffix.
+  if (!empty($instance['settings']['prefix'])) {
+    $prefixes = explode('|', $instance['settings']['prefix']);
+    $element['#field_prefix'] = field_filter_xss(array_pop($prefixes));
+  }
+  if (!empty($instance['settings']['suffix'])) {
+    $suffixes = explode('|', $instance['settings']['suffix']);
+    $element['#field_suffix'] = field_filter_xss(array_pop($suffixes));
+  }
+
+  $element['#element_validate'][] = 'number_field_widget_validate';
+
+  return array('value' => $element);
+}
+
+/**
+ * FAPI validation of an individual number element.
+ */
+function number_field_widget_validate($element, &$form_state) {
+  $field = field_widget_field($element, $form_state);
+  $instance = field_widget_instance($element, $form_state);
+
+  $type = $element['#number_type'];
+  $value = $element['#value'];
+
+  // Reject invalid characters.
+  if (!empty($value)) {
+    switch ($type) {
+      case 'float':
+      case 'decimal':
+        $regexp = '@([^-0-9\\' . $field['settings']['decimal_separator'] . '])|(.-)@';
+        $message = t('Only numbers and the decimal separator (@separator) allowed in %field.', array('%field' => $instance['label'], '@separator' => $field['settings']['decimal_separator']));
+        break;
+
+      case 'integer':
+        $regexp = '@([^-0-9])|(.-)@';
+        $message = t('Only numbers are allowed in %field.', array('%field' => $instance['label']));
+        break;
+    }
+    if ($value != preg_replace($regexp, '', $value)) {
+      form_error($element, $message);
+    }
+    else {
+      if ($type == 'decimal' || $type == 'float') {
+        // Verify that only one decimal separator exists in the field.
+        if (substr_count($value, $field['settings']['decimal_separator']) > 1) {
+          $message = t('%field: There should only be one decimal separator (@separator).',
+            array(
+              '%field' => t($instance['label']),
+              '@separator' => $field['settings']['decimal_separator'],
+            )
+          );
+          form_error($element, $message);
+        }
+        else {
+          // Substitute the decimal separator; things should be fine.
+          $value = strtr($value, $field['settings']['decimal_separator'], '.');
+        }
+      }
+      form_set_value($element, $value, $form_state);
+    }
+  }
+}
+
+/**
+ * Implements hook_field_widget_error().
+ */
+function number_field_widget_error($element, $error, $form, &$form_state) {
+  form_error($element['value'], $error['message']);
+}
diff --git a/htmltest/modules/field/modules/number/number.test b/htmltest/modules/field/modules/number/number.test
new file mode 100644
index 00000000..88029cdd
--- /dev/null
+++ b/htmltest/modules/field/modules/number/number.test
@@ -0,0 +1,155 @@
+<?php
+
+/**
+ * @file
+ * Tests for number.module.
+ */
+
+/**
+ * Tests for number field types.
+ */
+class NumberFieldTestCase extends DrupalWebTestCase {
+  protected $field;
+  protected $instance;
+  protected $web_user;
+
+  public static function getInfo() {
+    return array(
+      'name'  => 'Number field',
+      'description'  => 'Test the creation of number fields.',
+      'group' => 'Field types'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('field_test');
+    $this->web_user = $this->drupalCreateUser(array('access field_test content', 'administer field_test content', 'administer content types'));
+    $this->drupalLogin($this->web_user);
+  }
+
+  /**
+   * Test number_decimal field.
+   */
+  function testNumberDecimalField() {
+    // Create a field with settings to validate.
+    $this->field = array(
+      'field_name' => drupal_strtolower($this->randomName()),
+      'type' => 'number_decimal',
+      'settings' => array(
+        'precision' => 8, 'scale' => 4, 'decimal_separator' => '.',
+      )
+    );
+    field_create_field($this->field);
+    $this->instance = array(
+      'field_name' => $this->field['field_name'],
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'widget' => array(
+        'type' => 'number',
+      ),
+      'display' => array(
+        'default' => array(
+          'type' => 'number_decimal',
+        ),
+      ),
+    );
+    field_create_instance($this->instance);
+
+    // Display creation form.
+    $this->drupalGet('test-entity/add/test-bundle');
+    $langcode = LANGUAGE_NONE;
+    $this->assertFieldByName("{$this->field['field_name']}[$langcode][0][value]", '', 'Widget is displayed');
+
+    // Submit a signed decimal value within the allowed precision and scale.
+    $value = '-1234.5678';
+    $edit = array(
+      "{$this->field['field_name']}[$langcode][0][value]" => $value,
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);
+    $id = $match[1];
+    $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), 'Entity was created');
+    $this->assertRaw(round($value, 2), 'Value is displayed.');
+
+    // Try to create entries with more than one decimal separator; assert fail.
+    $wrong_entries = array(
+      '3.14.159',
+      '0..45469',
+      '..4589',
+      '6.459.52',
+      '6.3..25',
+    );
+
+    foreach ($wrong_entries as $wrong_entry) {
+      $this->drupalGet('test-entity/add/test-bundle');
+      $edit = array(
+        "{$this->field['field_name']}[$langcode][0][value]" => $wrong_entry,
+      );
+      $this->drupalPost(NULL, $edit, t('Save'));
+      $this->assertText(
+        t('There should only be one decimal separator (@separator)',
+          array('@separator' => $this->field['settings']['decimal_separator'])),
+        'Correctly failed to save decimal value with more than one decimal point.'
+      );
+    }
+
+    // Try to create entries with minus sign not in the first position.
+    $wrong_entries = array(
+      '3-3',
+      '4-',
+      '1.3-',
+      '1.2-4',
+      '-10-10',
+    );
+
+    foreach ($wrong_entries as $wrong_entry) {
+      $this->drupalGet('test-entity/add/test-bundle');
+      $edit = array(
+        "{$this->field['field_name']}[$langcode][0][value]" => $wrong_entry,
+      );
+      $this->drupalPost(NULL, $edit, t('Save'));
+      $this->assertText(
+        t('Only numbers and the decimal separator (@separator) allowed in ',
+          array('@separator' => $this->field['settings']['decimal_separator'])),
+        'Correctly failed to save decimal value with minus sign in the wrong position.'
+      );
+    }
+  }
+
+  /**
+   * Test number_integer field.
+   */
+  function testNumberIntegerField() {
+    // Display the "Add content type" form.
+    $this->drupalGet('admin/structure/types/add');
+
+    // Add a content type.
+    $name = $this->randomName();
+    $type = drupal_strtolower($name);
+    $edit = array('name' => $name, 'type' => $type);
+    $this->drupalPost(NULL, $edit, t('Save and add fields'));
+
+    // Add an integer field to the newly-created type.
+    $label = $this->randomName();
+    $field_name = drupal_strtolower($label);
+    $edit = array(
+      'fields[_add_new_field][label]'=> $label,
+      'fields[_add_new_field][field_name]' => $field_name,
+      'fields[_add_new_field][type]' => 'number_integer',
+      'fields[_add_new_field][widget_type]' => 'number',
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+
+    // Set the formatter to "number_integer" and to "unformatted", and just
+    // check that the settings summary does not generate warnings.
+    $this->drupalGet("admin/structure/types/manage/$type/display");
+    $edit = array(
+      "fields[field_$field_name][type]" => 'number_integer',
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $edit = array(
+      "fields[field_$field_name][type]" => 'number_unformatted',
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+  }
+}
diff --git a/htmltest/modules/field/modules/options/options.api.php b/htmltest/modules/field/modules/options/options.api.php
new file mode 100644
index 00000000..86f2b129
--- /dev/null
+++ b/htmltest/modules/field/modules/options/options.api.php
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Options module.
+ */
+
+/**
+ * Returns the list of options to be displayed for a field.
+ *
+ * Field types willing to enable one or several of the widgets defined in
+ * options.module (select, radios/checkboxes, on/off checkbox) need to
+ * implement this hook to specify the list of options to display in the
+ * widgets.
+ *
+ * @param $field
+ *   The field definition.
+ * @param $instance
+ *   (optional) The instance definition. The hook might be called without an
+ *   $instance parameter in contexts where no specific instance can be targeted.
+ *   It is recommended to only use instance level properties to filter out
+ *   values from a list defined by field level properties.
+ * @param $entity_type
+ *   The entity type the field is attached to.
+ * @param $entity
+ *   The entity object the field is attached to, or NULL if no entity
+ *   exists (e.g. in field settings page).
+ *
+ * @return
+ *   The array of options for the field. Array keys are the values to be
+ *   stored, and should be of the data type (string, number...) expected by
+ *   the first 'column' for the field type. Array values are the labels to
+ *   display within the widgets. The labels should NOT be sanitized,
+ *   options.module takes care of sanitation according to the needs of each
+ *   widget. The HTML tags defined in _field_filter_xss_allowed_tags() are
+ *   allowed, other tags will be filtered.
+ */
+function hook_options_list($field, $instance, $entity_type, $entity) {
+  // Sample structure.
+  $options = array(
+    0 => t('Zero'),
+    1 => t('One'),
+    2 => t('Two'),
+    3 => t('Three'),
+  );
+
+  // Sample structure with groups. Only one level of nesting is allowed. This
+  // is only supported by the 'options_select' widget. Other widgets will
+  // flatten the array.
+  $options = array(
+    t('First group') => array(
+      0 => t('Zero'),
+    ),
+    t('Second group') => array(
+      1 => t('One'),
+      2 => t('Two'),
+    ),
+    3 => t('Three'),
+  );
+
+  // In actual implementations, the array of options will most probably depend
+  // on properties of the field. Example from taxonomy.module:
+  $options = array();
+  foreach ($field['settings']['allowed_values'] as $tree) {
+    $terms = taxonomy_get_tree($tree['vid'], $tree['parent']);
+    if ($terms) {
+      foreach ($terms as $term) {
+        $options[$term->tid] = str_repeat('-', $term->depth) . $term->name;
+      }
+    }
+  }
+
+  return $options;
+}
diff --git a/htmltest/modules/field/modules/options/options.info b/htmltest/modules/field/modules/options/options.info
new file mode 100644
index 00000000..3556ec8e
--- /dev/null
+++ b/htmltest/modules/field/modules/options/options.info
@@ -0,0 +1,13 @@
+name = Options
+description = Defines selection, check box and radio button widgets for text and numeric fields.
+package = Core
+version = VERSION
+core = 7.x
+dependencies[] = field
+files[] = options.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/field/modules/options/options.module b/htmltest/modules/field/modules/options/options.module
new file mode 100644
index 00000000..3862ba77
--- /dev/null
+++ b/htmltest/modules/field/modules/options/options.module
@@ -0,0 +1,417 @@
+<?php
+
+/**
+ * @file
+ * Defines selection, check box and radio button widgets for text and numeric fields.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function options_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#options':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Options module defines checkbox, selection, and other input widgets for the Field module. See the <a href="@field-help">Field module help page</a> for more information about fields.', array('@field-help' => url('admin/help/field'))) . '</p>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function options_theme() {
+  return array(
+    'options_none' => array(
+      'variables' => array('instance' => NULL, 'option' => NULL),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_widget_info().
+ *
+ * Field type modules willing to use those widgets should:
+ * - Use hook_field_widget_info_alter() to append their field own types to the
+ *   list of types supported by the widgets,
+ * - Implement hook_options_list() to provide the list of options.
+ * See list.module.
+ */
+function options_field_widget_info() {
+  return array(
+    'options_select' => array(
+      'label' => t('Select list'),
+      'field types' => array(),
+      'behaviors' => array(
+        'multiple values' => FIELD_BEHAVIOR_CUSTOM,
+      ),
+    ),
+    'options_buttons' => array(
+      'label' => t('Check boxes/radio buttons'),
+      'field types' => array(),
+      'behaviors' => array(
+        'multiple values' => FIELD_BEHAVIOR_CUSTOM,
+      ),
+    ),
+    'options_onoff' => array(
+      'label' => t('Single on/off checkbox'),
+      'field types' => array(),
+      'behaviors' => array(
+        'multiple values' => FIELD_BEHAVIOR_CUSTOM,
+      ),
+      'settings' => array('display_label' => 0),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_widget_form().
+ */
+function options_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  // Abstract over the actual field columns, to allow different field types to
+  // reuse those widgets.
+  $value_key = key($field['columns']);
+
+  $type = str_replace('options_', '', $instance['widget']['type']);
+  $multiple = $field['cardinality'] > 1 || $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED;
+  $required = $element['#required'];
+  $has_value = isset($items[0][$value_key]);
+  $properties = _options_properties($type, $multiple, $required, $has_value);
+
+  $entity_type = $element['#entity_type'];
+  $entity = $element['#entity'];
+
+  // Prepare the list of options.
+  $options = _options_get_options($field, $instance, $properties, $entity_type, $entity);
+
+  // Put current field values in shape.
+  $default_value = _options_storage_to_form($items, $options, $value_key, $properties);
+
+  switch ($type) {
+    case 'select':
+      $element += array(
+        '#type' => 'select',
+        '#default_value' => $default_value,
+        // Do not display a 'multiple' select box if there is only one option.
+        '#multiple' => $multiple && count($options) > 1,
+        '#options' => $options,
+      );
+      break;
+
+    case 'buttons':
+      // If required and there is one single option, preselect it.
+      if ($required && count($options) == 1) {
+        reset($options);
+        $default_value = array(key($options));
+      }
+
+      // If this is a single-value field, take the first default value, or
+      // default to NULL so that the form element is properly recognized as
+      // not having a default value.
+      if (!$multiple) {
+        $default_value = $default_value ? reset($default_value) : NULL;
+      }
+
+      $element += array(
+        '#type' => $multiple ? 'checkboxes' : 'radios',
+        // Radio buttons need a scalar value.
+        '#default_value' => $default_value,
+        '#options' => $options,
+      );
+      break;
+
+    case 'onoff':
+      $keys = array_keys($options);
+      $off_value = array_shift($keys);
+      $on_value = array_shift($keys);
+      $element += array(
+        '#type' => 'checkbox',
+        '#default_value' => (isset($default_value[0]) && $default_value[0] == $on_value) ? 1 : 0,
+        '#on_value' => $on_value,
+        '#off_value' => $off_value,
+      );
+      // Override the title from the incoming $element.
+      $element['#title'] = isset($options[$on_value]) ? $options[$on_value] : '';
+
+      if ($instance['widget']['settings']['display_label']) {
+        $element['#title'] = $instance['label'];
+      }
+      break;
+  }
+
+  $element += array(
+    '#value_key' => $value_key,
+    '#element_validate' => array('options_field_widget_validate'),
+    '#properties' => $properties,
+  );
+
+  return $element;
+}
+
+/**
+ * Implements hook_field_widget_settings_form().
+ */
+function options_field_widget_settings_form($field, $instance) {
+  $form = array();
+  if ($instance['widget']['type'] == 'options_onoff') {
+    $form['display_label'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Use field label instead of the "On value" as label'),
+      '#default_value' => $instance['widget']['settings']['display_label'],
+      '#weight' => -1,
+    );
+  }
+  return $form;
+}
+
+/**
+ * Form element validation handler for options element.
+ */
+function options_field_widget_validate($element, &$form_state) {
+  if ($element['#required'] && $element['#value'] == '_none') {
+    form_error($element, t('!name field is required.', array('!name' => $element['#title'])));
+  }
+  // Transpose selections from field => delta to delta => field, turning
+  // multiple selected options into multiple parent elements.
+  $items = _options_form_to_storage($element);
+  form_set_value($element, $items, $form_state);
+}
+
+/**
+ * Describes the preparation steps required by each widget.
+ */
+function _options_properties($type, $multiple, $required, $has_value) {
+  $base = array(
+    'filter_xss' => FALSE,
+    'strip_tags' => FALSE,
+    'empty_option' => FALSE,
+    'optgroups' => FALSE,
+  );
+
+  $properties = array();
+
+  switch ($type) {
+    case 'select':
+      $properties = array(
+        // Select boxes do not support any HTML tag.
+        'strip_tags' => TRUE,
+        'optgroups' => TRUE,
+      );
+      if ($multiple) {
+        // Multiple select: add a 'none' option for non-required fields.
+        if (!$required) {
+          $properties['empty_option'] = 'option_none';
+        }
+      }
+      else {
+        // Single select: add a 'none' option for non-required fields,
+        // and a 'select a value' option for required fields that do not come
+        // with a value selected.
+        if (!$required) {
+          $properties['empty_option'] = 'option_none';
+        }
+        elseif (!$has_value) {
+          $properties['empty_option'] = 'option_select';
+        }
+      }
+      break;
+
+    case 'buttons':
+      $properties = array(
+        'filter_xss' => TRUE,
+      );
+      // Add a 'none' option for non-required radio buttons.
+      if (!$required && !$multiple) {
+        $properties['empty_option'] = 'option_none';
+      }
+      break;
+
+    case 'onoff':
+      $properties = array(
+        'filter_xss' => TRUE,
+      );
+      break;
+  }
+
+  return $properties + $base;
+}
+
+/**
+ * Collects the options for a field.
+ */
+function _options_get_options($field, $instance, $properties, $entity_type, $entity) {
+  // Get the list of options.
+  $options = (array) module_invoke($field['module'], 'options_list', $field, $instance, $entity_type, $entity);
+
+  // Sanitize the options.
+  _options_prepare_options($options, $properties);
+
+  if (!$properties['optgroups']) {
+    $options = options_array_flatten($options);
+  }
+
+  if ($properties['empty_option']) {
+    $label = theme('options_none', array('instance' => $instance, 'option' => $properties['empty_option']));
+    $options = array('_none' => $label) + $options;
+  }
+
+  return $options;
+}
+
+/**
+ * Sanitizes the options.
+ *
+ * The function is recursive to support optgroups.
+ */
+function _options_prepare_options(&$options, $properties) {
+  foreach ($options as $value => $label) {
+    // Recurse for optgroups.
+    if (is_array($label)) {
+      _options_prepare_options($options[$value], $properties);
+    }
+    else {
+      if ($properties['strip_tags']) {
+        $options[$value] = strip_tags($label);
+      }
+      if ($properties['filter_xss']) {
+        $options[$value] = field_filter_xss($label);
+      }
+    }
+  }
+}
+
+/**
+ * Transforms stored field values into the format the widgets need.
+ */
+function _options_storage_to_form($items, $options, $column, $properties) {
+  $items_transposed = options_array_transpose($items);
+  $values = (isset($items_transposed[$column]) && is_array($items_transposed[$column])) ? $items_transposed[$column] : array();
+
+  // Discard values that are not in the current list of options. Flatten the
+  // array if needed.
+  if ($properties['optgroups']) {
+    $options = options_array_flatten($options);
+  }
+  $values = array_values(array_intersect($values, array_keys($options)));
+  return $values;
+}
+
+/**
+ * Transforms submitted form values into field storage format.
+ */
+function _options_form_to_storage($element) {
+  $values = array_values((array) $element['#value']);
+  $properties = $element['#properties'];
+
+  // On/off checkbox: transform '0 / 1' into the 'on / off' values.
+  if ($element['#type'] == 'checkbox') {
+    $values = array($values[0] ? $element['#on_value'] : $element['#off_value']);
+  }
+
+  // Filter out the 'none' option. Use a strict comparison, because
+  // 0 == 'any string'.
+  if ($properties['empty_option']) {
+    $index = array_search('_none', $values, TRUE);
+    if ($index !== FALSE) {
+      unset($values[$index]);
+    }
+  }
+
+  // Make sure we populate at least an empty value.
+  if (empty($values)) {
+    $values = array(NULL);
+  }
+
+  $result = options_array_transpose(array($element['#value_key'] => $values));
+  return $result;
+}
+
+/**
+ * Manipulates a 2D array to reverse rows and columns.
+ *
+ * The default data storage for fields is delta first, column names second.
+ * This is sometimes inconvenient for field modules, so this function can be
+ * used to present the data in an alternate format.
+ *
+ * @param $array
+ *   The array to be transposed. It must be at least two-dimensional, and
+ *   the subarrays must all have the same keys or behavior is undefined.
+ * @return
+ *   The transposed array.
+ */
+function options_array_transpose($array) {
+  $result = array();
+  if (is_array($array)) {
+    foreach ($array as $key1 => $value1) {
+      if (is_array($value1)) {
+        foreach ($value1 as $key2 => $value2) {
+          if (!isset($result[$key2])) {
+            $result[$key2] = array();
+          }
+          $result[$key2][$key1] = $value2;
+        }
+      }
+    }
+  }
+  return $result;
+}
+
+/**
+ * Flattens an array of allowed values.
+ *
+ * @param $array
+ *   A single or multidimensional array.
+ * @return
+ *   A flattened array.
+ */
+function options_array_flatten($array) {
+  $result = array();
+  if (is_array($array)) {
+    foreach ($array as $key => $value) {
+      if (is_array($value)) {
+        $result += options_array_flatten($value);
+      }
+      else {
+        $result[$key] = $value;
+      }
+    }
+  }
+  return $result;
+}
+
+/**
+ * Implements hook_field_widget_error().
+ */
+function options_field_widget_error($element, $error, $form, &$form_state) {
+  form_error($element, $error['message']);
+}
+
+/**
+ * Returns HTML for the label for the empty value for options that are not required.
+ *
+ * The default theme will display N/A for a radio list and '- None -' for a select.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - instance: An array representing the widget requesting the options.
+ *
+ * @ingroup themeable
+ */
+function theme_options_none($variables) {
+  $instance = $variables['instance'];
+  $option = $variables['option'];
+
+  $output = '';
+  switch ($instance['widget']['type']) {
+    case 'options_buttons':
+      $output = t('N/A');
+      break;
+
+    case 'options_select':
+      $output = ($option == 'option_none' ? t('- None -') : t('- Select a value -'));
+      break;
+  }
+
+  return $output;
+}
diff --git a/htmltest/modules/field/modules/options/options.test b/htmltest/modules/field/modules/options/options.test
new file mode 100644
index 00000000..7183311b
--- /dev/null
+++ b/htmltest/modules/field/modules/options/options.test
@@ -0,0 +1,553 @@
+<?php
+
+/**
+ * @file
+ * Tests for options.module.
+ */
+
+class OptionsWidgetsTestCase extends FieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Options widgets',
+      'description'  => "Test the Options widgets.",
+      'group' => 'Field types'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('field_test', 'list_test');
+
+    // Field with cardinality 1.
+    $this->card_1 = array(
+      'field_name' => 'card_1',
+      'type' => 'list_integer',
+      'cardinality' => 1,
+      'settings' => array(
+        // Make sure that 0 works as an option.
+        'allowed_values' => array(0 => 'Zero', 1 => 'One', 2 => 'Some <script>dangerous</script> & unescaped <strong>markup</strong>'),
+      ),
+    );
+    $this->card_1 = field_create_field($this->card_1);
+
+    // Field with cardinality 2.
+    $this->card_2 = array(
+      'field_name' => 'card_2',
+      'type' => 'list_integer',
+      'cardinality' => 2,
+      'settings' => array(
+        // Make sure that 0 works as an option.
+        'allowed_values' => array(0 => 'Zero', 1 => 'One', 2 => 'Some <script>dangerous</script> & unescaped <strong>markup</strong>'),
+      ),
+    );
+    $this->card_2 = field_create_field($this->card_2);
+
+    // Boolean field.
+    $this->bool = array(
+      'field_name' => 'bool',
+      'type' => 'list_boolean',
+      'cardinality' => 1,
+      'settings' => array(
+        // Make sure that 0 works as a 'on' value'.
+        'allowed_values' => array(1 => 'Zero', 0 => 'Some <script>dangerous</script> & unescaped <strong>markup</strong>'),
+      ),
+    );
+    $this->bool = field_create_field($this->bool);
+
+    // Create a web user.
+    $this->web_user = $this->drupalCreateUser(array('access field_test content', 'administer field_test content'));
+    $this->drupalLogin($this->web_user);
+  }
+
+  /**
+   * Tests the 'options_buttons' widget (single select).
+   */
+  function testRadioButtons() {
+    // Create an instance of the 'single value' field.
+    $instance = array(
+      'field_name' => $this->card_1['field_name'],
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'widget' => array(
+        'type' => 'options_buttons',
+      ),
+    );
+    $instance = field_create_instance($instance);
+    $langcode = LANGUAGE_NONE;
+
+    // Create an entity.
+    $entity_init = field_test_create_stub_entity();
+    $entity = clone $entity_init;
+    $entity->is_new = TRUE;
+    field_test_entity_save($entity);
+
+    // With no field data, no buttons are checked.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertNoFieldChecked("edit-card-1-$langcode-0");
+    $this->assertNoFieldChecked("edit-card-1-$langcode-1");
+    $this->assertNoFieldChecked("edit-card-1-$langcode-2");
+    $this->assertRaw('Some dangerous &amp; unescaped <strong>markup</strong>', 'Option text was properly filtered.');
+
+    // Select first option.
+    $edit = array("card_1[$langcode]" => 0);
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_1', $langcode, array(0));
+
+    // Check that the selected button is checked.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertFieldChecked("edit-card-1-$langcode-0");
+    $this->assertNoFieldChecked("edit-card-1-$langcode-1");
+    $this->assertNoFieldChecked("edit-card-1-$langcode-2");
+
+    // Unselect option.
+    $edit = array("card_1[$langcode]" => '_none');
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_1', $langcode, array());
+
+    // Check that required radios with one option is auto-selected.
+    $this->card_1['settings']['allowed_values'] = array(99 => 'Only allowed value');
+    field_update_field($this->card_1);
+    $instance['required'] = TRUE;
+    field_update_instance($instance);
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertFieldChecked("edit-card-1-$langcode-99");
+  }
+
+  /**
+   * Tests the 'options_buttons' widget (multiple select).
+   */
+  function testCheckBoxes() {
+    // Create an instance of the 'multiple values' field.
+    $instance = array(
+      'field_name' => $this->card_2['field_name'],
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'widget' => array(
+        'type' => 'options_buttons',
+      ),
+    );
+    $instance = field_create_instance($instance);
+    $langcode = LANGUAGE_NONE;
+
+    // Create an entity.
+    $entity_init = field_test_create_stub_entity();
+    $entity = clone $entity_init;
+    $entity->is_new = TRUE;
+    field_test_entity_save($entity);
+
+    // Display form: with no field data, nothing is checked.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertNoFieldChecked("edit-card-2-$langcode-0");
+    $this->assertNoFieldChecked("edit-card-2-$langcode-1");
+    $this->assertNoFieldChecked("edit-card-2-$langcode-2");
+    $this->assertRaw('Some dangerous &amp; unescaped <strong>markup</strong>', 'Option text was properly filtered.');
+
+    // Submit form: select first and third options.
+    $edit = array(
+      "card_2[$langcode][0]" => TRUE,
+      "card_2[$langcode][1]" => FALSE,
+      "card_2[$langcode][2]" => TRUE,
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_2', $langcode, array(0, 2));
+
+    // Display form: check that the right options are selected.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertFieldChecked("edit-card-2-$langcode-0");
+    $this->assertNoFieldChecked("edit-card-2-$langcode-1");
+    $this->assertFieldChecked("edit-card-2-$langcode-2");
+
+    // Submit form: select only first option.
+    $edit = array(
+      "card_2[$langcode][0]" => TRUE,
+      "card_2[$langcode][1]" => FALSE,
+      "card_2[$langcode][2]" => FALSE,
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_2', $langcode, array(0));
+
+    // Display form: check that the right options are selected.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertFieldChecked("edit-card-2-$langcode-0");
+    $this->assertNoFieldChecked("edit-card-2-$langcode-1");
+    $this->assertNoFieldChecked("edit-card-2-$langcode-2");
+
+    // Submit form: select the three options while the field accepts only 2.
+    $edit = array(
+      "card_2[$langcode][0]" => TRUE,
+      "card_2[$langcode][1]" => TRUE,
+      "card_2[$langcode][2]" => TRUE,
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertText('this field cannot hold more than 2 values', 'Validation error was displayed.');
+
+    // Submit form: uncheck all options.
+    $edit = array(
+      "card_2[$langcode][0]" => FALSE,
+      "card_2[$langcode][1]" => FALSE,
+      "card_2[$langcode][2]" => FALSE,
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    // Check that the value was saved.
+    $this->assertFieldValues($entity_init, 'card_2', $langcode, array());
+
+    // Required checkbox with one option is auto-selected.
+    $this->card_2['settings']['allowed_values'] = array(99 => 'Only allowed value');
+    field_update_field($this->card_2);
+    $instance['required'] = TRUE;
+    field_update_instance($instance);
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertFieldChecked("edit-card-2-$langcode-99");
+  }
+
+  /**
+   * Tests the 'options_select' widget (single select).
+   */
+  function testSelectListSingle() {
+    // Create an instance of the 'single value' field.
+    $instance = array(
+      'field_name' => $this->card_1['field_name'],
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'required' => TRUE,
+      'widget' => array(
+        'type' => 'options_select',
+      ),
+    );
+    $instance = field_create_instance($instance);
+    $langcode = LANGUAGE_NONE;
+
+    // Create an entity.
+    $entity_init = field_test_create_stub_entity();
+    $entity = clone $entity_init;
+    $entity->is_new = TRUE;
+    field_test_entity_save($entity);
+
+    // Display form.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    // A required field without any value has a "none" option.
+    $this->assertTrue($this->xpath('//select[@id=:id]//option[@value="_none" and text()=:label]', array(':id' => 'edit-card-1-' . $langcode, ':label' => t('- Select a value -'))), 'A required select list has a "Select a value" choice.');
+
+    // With no field data, nothing is selected.
+    $this->assertNoOptionSelected("edit-card-1-$langcode", '_none');
+    $this->assertNoOptionSelected("edit-card-1-$langcode", 0);
+    $this->assertNoOptionSelected("edit-card-1-$langcode", 1);
+    $this->assertNoOptionSelected("edit-card-1-$langcode", 2);
+    $this->assertRaw('Some dangerous &amp; unescaped markup', 'Option text was properly filtered.');
+
+    // Submit form: select invalid 'none' option.
+    $edit = array("card_1[$langcode]" => '_none');
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertRaw(t('!title field is required.', array('!title' => $instance['field_name'])), 'Cannot save a required field when selecting "none" from the select list.');
+
+    // Submit form: select first option.
+    $edit = array("card_1[$langcode]" => 0);
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_1', $langcode, array(0));
+
+    // Display form: check that the right options are selected.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    // A required field with a value has no 'none' option.
+    $this->assertFalse($this->xpath('//select[@id=:id]//option[@value="_none"]', array(':id' => 'edit-card-1-' . $langcode)), 'A required select list with an actual value has no "none" choice.');
+    $this->assertOptionSelected("edit-card-1-$langcode", 0);
+    $this->assertNoOptionSelected("edit-card-1-$langcode", 1);
+    $this->assertNoOptionSelected("edit-card-1-$langcode", 2);
+
+    // Make the field non required.
+    $instance['required'] = FALSE;
+    field_update_instance($instance);
+
+    // Display form.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    // A non-required field has a 'none' option.
+    $this->assertTrue($this->xpath('//select[@id=:id]//option[@value="_none" and text()=:label]', array(':id' => 'edit-card-1-' . $langcode, ':label' => t('- None -'))), 'A non-required select list has a "None" choice.');
+    // Submit form: Unselect the option.
+    $edit = array("card_1[$langcode]" => '_none');
+    $this->drupalPost('test-entity/manage/' . $entity->ftid . '/edit', $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_1', $langcode, array());
+
+    // Test optgroups.
+
+    $this->card_1['settings']['allowed_values'] = array();
+    $this->card_1['settings']['allowed_values_function'] = 'list_test_allowed_values_callback';
+    field_update_field($this->card_1);
+
+    // Display form: with no field data, nothing is selected
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertNoOptionSelected("edit-card-1-$langcode", 0);
+    $this->assertNoOptionSelected("edit-card-1-$langcode", 1);
+    $this->assertNoOptionSelected("edit-card-1-$langcode", 2);
+    $this->assertRaw('Some dangerous &amp; unescaped markup', 'Option text was properly filtered.');
+    $this->assertRaw('Group 1', 'Option groups are displayed.');
+
+    // Submit form: select first option.
+    $edit = array("card_1[$langcode]" => 0);
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_1', $langcode, array(0));
+
+    // Display form: check that the right options are selected.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertOptionSelected("edit-card-1-$langcode", 0);
+    $this->assertNoOptionSelected("edit-card-1-$langcode", 1);
+    $this->assertNoOptionSelected("edit-card-1-$langcode", 2);
+
+    // Submit form: Unselect the option.
+    $edit = array("card_1[$langcode]" => '_none');
+    $this->drupalPost('test-entity/manage/' . $entity->ftid . '/edit', $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_1', $langcode, array());
+  }
+
+  /**
+   * Tests the 'options_select' widget (multiple select).
+   */
+  function testSelectListMultiple() {
+    // Create an instance of the 'multiple values' field.
+    $instance = array(
+      'field_name' => $this->card_2['field_name'],
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'widget' => array(
+        'type' => 'options_select',
+      ),
+    );
+    $instance = field_create_instance($instance);
+    $langcode = LANGUAGE_NONE;
+
+    // Create an entity.
+    $entity_init = field_test_create_stub_entity();
+    $entity = clone $entity_init;
+    $entity->is_new = TRUE;
+    field_test_entity_save($entity);
+
+    // Display form: with no field data, nothing is selected.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertNoOptionSelected("edit-card-2-$langcode", 0);
+    $this->assertNoOptionSelected("edit-card-2-$langcode", 1);
+    $this->assertNoOptionSelected("edit-card-2-$langcode", 2);
+    $this->assertRaw('Some dangerous &amp; unescaped markup', 'Option text was properly filtered.');
+
+    // Submit form: select first and third options.
+    $edit = array("card_2[$langcode][]" => array(0 => 0, 2 => 2));
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_2', $langcode, array(0, 2));
+
+    // Display form: check that the right options are selected.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertOptionSelected("edit-card-2-$langcode", 0);
+    $this->assertNoOptionSelected("edit-card-2-$langcode", 1);
+    $this->assertOptionSelected("edit-card-2-$langcode", 2);
+
+    // Submit form: select only first option.
+    $edit = array("card_2[$langcode][]" => array(0 => 0));
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_2', $langcode, array(0));
+
+    // Display form: check that the right options are selected.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertOptionSelected("edit-card-2-$langcode", 0);
+    $this->assertNoOptionSelected("edit-card-2-$langcode", 1);
+    $this->assertNoOptionSelected("edit-card-2-$langcode", 2);
+
+    // Submit form: select the three options while the field accepts only 2.
+    $edit = array("card_2[$langcode][]" => array(0 => 0, 1 => 1, 2 => 2));
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertText('this field cannot hold more than 2 values', 'Validation error was displayed.');
+
+    // Submit form: uncheck all options.
+    $edit = array("card_2[$langcode][]" => array());
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_2', $langcode, array());
+
+    // Test the 'None' option.
+
+    // Check that the 'none' option has no effect if actual options are selected
+    // as well.
+    $edit = array("card_2[$langcode][]" => array('_none' => '_none', 0 => 0));
+    $this->drupalPost('test-entity/manage/' . $entity->ftid . '/edit', $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_2', $langcode, array(0));
+
+    // Check that selecting the 'none' option empties the field.
+    $edit = array("card_2[$langcode][]" => array('_none' => '_none'));
+    $this->drupalPost('test-entity/manage/' . $entity->ftid . '/edit', $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_2', $langcode, array());
+
+    // A required select list does not have an empty key.
+    $instance['required'] = TRUE;
+    field_update_instance($instance);
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertFalse($this->xpath('//select[@id=:id]//option[@value=""]', array(':id' => 'edit-card-2-' . $langcode)), 'A required select list does not have an empty key.');
+
+    // We do not have to test that a required select list with one option is
+    // auto-selected because the browser does it for us.
+
+    // Test optgroups.
+
+    // Use a callback function defining optgroups.
+    $this->card_2['settings']['allowed_values'] = array();
+    $this->card_2['settings']['allowed_values_function'] = 'list_test_allowed_values_callback';
+    field_update_field($this->card_2);
+    $instance['required'] = FALSE;
+    field_update_instance($instance);
+
+    // Display form: with no field data, nothing is selected.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertNoOptionSelected("edit-card-2-$langcode", 0);
+    $this->assertNoOptionSelected("edit-card-2-$langcode", 1);
+    $this->assertNoOptionSelected("edit-card-2-$langcode", 2);
+    $this->assertRaw('Some dangerous &amp; unescaped markup', 'Option text was properly filtered.');
+    $this->assertRaw('Group 1', 'Option groups are displayed.');
+
+    // Submit form: select first option.
+    $edit = array("card_2[$langcode][]" => array(0 => 0));
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_2', $langcode, array(0));
+
+    // Display form: check that the right options are selected.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertOptionSelected("edit-card-2-$langcode", 0);
+    $this->assertNoOptionSelected("edit-card-2-$langcode", 1);
+    $this->assertNoOptionSelected("edit-card-2-$langcode", 2);
+
+    // Submit form: Unselect the option.
+    $edit = array("card_2[$langcode][]" => array('_none' => '_none'));
+    $this->drupalPost('test-entity/manage/' . $entity->ftid . '/edit', $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'card_2', $langcode, array());
+  }
+
+  /**
+   * Tests the 'options_onoff' widget.
+   */
+  function testOnOffCheckbox() {
+    // Create an instance of the 'boolean' field.
+    $instance = array(
+      'field_name' => $this->bool['field_name'],
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'widget' => array(
+        'type' => 'options_onoff',
+      ),
+    );
+    $instance = field_create_instance($instance);
+    $langcode = LANGUAGE_NONE;
+
+    // Create an entity.
+    $entity_init = field_test_create_stub_entity();
+    $entity = clone $entity_init;
+    $entity->is_new = TRUE;
+    field_test_entity_save($entity);
+
+    // Display form: with no field data, option is unchecked.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertNoFieldChecked("edit-bool-$langcode");
+    $this->assertRaw('Some dangerous &amp; unescaped <strong>markup</strong>', 'Option text was properly filtered.');
+
+    // Submit form: check the option.
+    $edit = array("bool[$langcode]" => TRUE);
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'bool', $langcode, array(0));
+
+    // Display form: check that the right options are selected.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertFieldChecked("edit-bool-$langcode");
+
+    // Submit form: uncheck the option.
+    $edit = array("bool[$langcode]" => FALSE);
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertFieldValues($entity_init, 'bool', $langcode, array(1));
+
+    // Display form: with 'off' value, option is unchecked.
+    $this->drupalGet('test-entity/manage/' . $entity->ftid . '/edit');
+    $this->assertNoFieldChecked("edit-bool-$langcode");
+
+    // Create admin user.
+    $admin_user = $this->drupalCreateUser(array('access content', 'administer content types', 'administer taxonomy'));
+    $this->drupalLogin($admin_user);
+
+    // Create a test field instance.
+    $fieldUpdate = $this->bool;
+    $fieldUpdate['settings']['allowed_values'] = array(0 => 0, 1 => 'MyOnValue');
+    field_update_field($fieldUpdate);
+    $instance = array(
+      'field_name' => $this->bool['field_name'],
+      'entity_type' => 'node',
+      'bundle' => 'page',
+      'widget' => array(
+            'type' => 'options_onoff',
+            'module' => 'options',
+        ),
+    );
+    field_create_instance($instance);
+
+    // Go to the edit page and check if the default settings works as expected
+    $fieldEditUrl = 'admin/structure/types/manage/page/fields/bool';
+    $this->drupalGet($fieldEditUrl);
+
+    $this->assertText(
+      'Use field label instead of the "On value" as label ',
+      'Display setting checkbox available.'
+    );
+
+    $this->assertFieldByXPath(
+      '*//label[@for="edit-' . $this->bool['field_name'] . '-und" and text()="MyOnValue "]',
+      TRUE,
+      'Default case shows "On value"'
+    );
+
+    // Enable setting
+    $edit = array('instance[widget][settings][display_label]' => 1);
+    // Save the new Settings
+    $this->drupalPost($fieldEditUrl, $edit, t('Save settings'));
+
+    // Go again to the edit page and check if the setting
+    // is stored and has the expected effect
+    $this->drupalGet($fieldEditUrl);
+    $this->assertText(
+      'Use field label instead of the "On value" as label ',
+      'Display setting checkbox is available'
+    );
+    $this->assertFieldChecked(
+      'edit-instance-widget-settings-display-label',
+      'Display settings checkbox checked'
+    );
+    $this->assertFieldByXPath(
+      '*//label[@for="edit-' . $this->bool['field_name'] . '-und" and text()="' . $this->bool['field_name'] . ' "]',
+      TRUE,
+      'Display label changes label of the checkbox'
+    );
+  }
+}
+
+/**
+ * Test an options select on a list field with a dynamic allowed values function.
+ */
+class OptionsSelectDynamicValuesTestCase extends ListDynamicValuesTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Options select dynamic values',
+      'description' => 'Test an options select on a list field with a dynamic allowed values function.',
+      'group' => 'Field types',
+    );
+  }
+
+  /**
+   * Tests the 'options_select' widget (single select).
+   */
+  function testSelectListDynamic() {
+    // Create an entity.
+    $this->entity->is_new = TRUE;
+    field_test_entity_save($this->entity);
+    // Create a web user.
+    $web_user = $this->drupalCreateUser(array('access field_test content', 'administer field_test content'));
+    $this->drupalLogin($web_user);
+
+    // Display form.
+    $this->drupalGet('test-entity/manage/' . $this->entity->ftid . '/edit');
+    $options = $this->xpath('//select[@id="edit-test-list-und"]/option');
+    $this->assertEqual(count($options), count($this->test) + 1);
+    foreach ($options as $option) {
+      $value = (string) $option['value'];
+      if ($value != '_none') {
+        $this->assertTrue(array_search($value, $this->test));
+      }
+    }
+  }
+}
diff --git a/htmltest/modules/field/modules/text/text.info b/htmltest/modules/field/modules/text/text.info
new file mode 100644
index 00000000..774bd4ba
--- /dev/null
+++ b/htmltest/modules/field/modules/text/text.info
@@ -0,0 +1,14 @@
+name = Text
+description = Defines simple text field types.
+package = Core
+version = VERSION
+core = 7.x
+dependencies[] = field
+files[] = text.test
+required = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/field/modules/text/text.install b/htmltest/modules/field/modules/text/text.install
new file mode 100644
index 00000000..61be748a
--- /dev/null
+++ b/htmltest/modules/field/modules/text/text.install
@@ -0,0 +1,95 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the text module.
+ */
+
+/**
+ * Implements hook_field_schema().
+ */
+function text_field_schema($field) {
+  switch ($field['type']) {
+    case 'text':
+      $columns = array(
+        'value' => array(
+          'type' => 'varchar',
+          'length' => $field['settings']['max_length'],
+          'not null' => FALSE,
+        ),
+      );
+      break;
+
+    case 'text_long':
+      $columns = array(
+        'value' => array(
+          'type' => 'text',
+          'size' => 'big',
+          'not null' => FALSE,
+        ),
+      );
+      break;
+
+    case 'text_with_summary':
+      $columns = array(
+        'value' => array(
+          'type' => 'text',
+          'size' => 'big',
+          'not null' => FALSE,
+        ),
+        'summary' => array(
+          'type' => 'text',
+          'size' => 'big',
+          'not null' => FALSE,
+        ),
+      );
+      break;
+  }
+  $columns += array(
+    'format' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => FALSE,
+    ),
+  );
+  return array(
+    'columns' => $columns,
+    'indexes' => array(
+      'format' => array('format'),
+    ),
+    'foreign keys' => array(
+      'format' => array(
+        'table' => 'filter_format',
+        'columns' => array('format' => 'format'),
+      ),
+    ),
+  );
+}
+
+/**
+ * Change text field 'format' columns into varchar.
+ */
+function text_update_7000() {
+  $spec = array(
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => FALSE,
+  );
+  $fields = _update_7000_field_read_fields(array(
+    'module' => 'text',
+    'storage_type' => 'field_sql_storage',
+  ));
+  foreach ($fields as $field) {
+    if ($field['deleted']) {
+      $table = "field_deleted_data_{$field['id']}";
+      $revision_table = "field_deleted_revision_{$field['id']}";
+    }
+    else {
+      $table = "field_data_{$field['field_name']}";
+      $revision_table = "field_revision_{$field['field_name']}";
+    }
+    $column = $field['field_name'] . '_' . 'format';
+    db_change_field($table, $column, $column, $spec);
+    db_change_field($revision_table, $column, $column, $spec);
+  }
+}
diff --git a/htmltest/modules/field/modules/text/text.js b/htmltest/modules/field/modules/text/text.js
new file mode 100644
index 00000000..f3ae8943
--- /dev/null
+++ b/htmltest/modules/field/modules/text/text.js
@@ -0,0 +1,49 @@
+
+(function ($) {
+
+/**
+ * Auto-hide summary textarea if empty and show hide and unhide links.
+ */
+Drupal.behaviors.textSummary = {
+  attach: function (context, settings) {
+    $('.text-summary', context).once('text-summary', function () {
+      var $widget = $(this).closest('div.field-type-text-with-summary');
+      var $summaries = $widget.find('div.text-summary-wrapper');
+
+      $summaries.once('text-summary-wrapper').each(function(index) {
+        var $summary = $(this);
+        var $summaryLabel = $summary.find('label');
+        var $full = $widget.find('.text-full').eq(index).closest('.form-item');
+        var $fullLabel = $full.find('label');
+
+        // Create a placeholder label when the field cardinality is
+        // unlimited or greater than 1.
+        if ($fullLabel.length == 0) {
+          $fullLabel = $('<label></label>').prependTo($full);
+        }
+
+        // Setup the edit/hide summary link.
+        var $link = $('<span class="field-edit-link">(<a class="link-edit-summary" href="#">' + Drupal.t('Hide summary') + '</a>)</span>').toggle(
+          function () {
+            $summary.hide();
+            $(this).find('a').html(Drupal.t('Edit summary')).end().appendTo($fullLabel);
+            return false;
+          },
+          function () {
+            $summary.show();
+            $(this).find('a').html(Drupal.t('Hide summary')).end().appendTo($summaryLabel);
+            return false;
+          }
+        ).appendTo($summaryLabel);
+
+        // If no summary is set, hide the summary field.
+        if ($(this).find('.text-summary').val() == '') {
+          $link.click();
+        }
+        return;
+      });
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/field/modules/text/text.module b/htmltest/modules/field/modules/text/text.module
new file mode 100644
index 00000000..d73814fa
--- /dev/null
+++ b/htmltest/modules/field/modules/text/text.module
@@ -0,0 +1,611 @@
+<?php
+
+/**
+ * @file
+ * Defines simple text field types.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function text_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#text':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t("The Text module defines various text field types for the Field module. A text field may contain plain text only, or optionally, may use Drupal's <a href='@filter-help'>text filters</a> to securely manage HTML output. Text input fields may be either a single line (text field), multiple lines (text area), or for greater input control, a select box, checkbox, or radio buttons. If desired, the field can be validated, so that it is limited to a set of allowed values. See the <a href='@field-help'>Field module help page</a> for more information about fields.", array('@field-help' => url('admin/help/field'), '@filter-help' => url('admin/help/filter'))) . '</p>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_field_info().
+ *
+ * Field settings:
+ *   - max_length: the maximum length for a varchar field.
+ * Instance settings:
+ *   - text_processing: whether text input filters should be used.
+ *   - display_summary: whether the summary field should be displayed.
+ *     When empty and not displayed the summary will take its value from the
+ *     trimmed value of the main text field.
+ */
+function text_field_info() {
+  return array(
+    'text' => array(
+      'label' => t('Text'),
+      'description' => t('This field stores varchar text in the database.'),
+      'settings' => array('max_length' => 255),
+      'instance_settings' => array('text_processing' => 0),
+      'default_widget' => 'text_textfield',
+      'default_formatter' => 'text_default',
+    ),
+    'text_long' => array(
+      'label' => t('Long text'),
+      'description' => t('This field stores long text in the database.'),
+      'instance_settings' => array('text_processing' => 0),
+      'default_widget' => 'text_textarea',
+      'default_formatter' => 'text_default',
+    ),
+    'text_with_summary' => array(
+      'label' => t('Long text and summary'),
+      'description' => t('This field stores long text in the database along with optional summary text.'),
+      'instance_settings' => array('text_processing' => 1, 'display_summary' => 0),
+      'default_widget' => 'text_textarea_with_summary',
+      'default_formatter' => 'text_default',
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_settings_form().
+ */
+function text_field_settings_form($field, $instance, $has_data) {
+  $settings = $field['settings'];
+
+  $form = array();
+
+  if ($field['type'] == 'text') {
+    $form['max_length'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Maximum length'),
+      '#default_value' => $settings['max_length'],
+      '#required' => TRUE,
+      '#description' => t('The maximum length of the field in characters.'),
+      '#element_validate' => array('element_validate_integer_positive'),
+      // @todo: If $has_data, add a validate handler that only allows
+      // max_length to increase.
+      '#disabled' => $has_data,
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_instance_settings_form().
+ */
+function text_field_instance_settings_form($field, $instance) {
+  $settings = $instance['settings'];
+
+  $form['text_processing'] = array(
+    '#type' => 'radios',
+    '#title' => t('Text processing'),
+    '#default_value' => $settings['text_processing'],
+    '#options' => array(
+      t('Plain text'),
+      t('Filtered text (user selects text format)'),
+    ),
+  );
+  if ($field['type'] == 'text_with_summary') {
+    $form['display_summary'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Summary input'),
+      '#default_value' => $settings['display_summary'],
+      '#description' => t('This allows authors to input an explicit summary, to be displayed instead of the automatically trimmed text when using the "Summary or trimmed" display type.'),
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_validate().
+ *
+ * Possible error codes:
+ * - 'text_value_max_length': The value exceeds the maximum length.
+ * - 'text_summary_max_length': The summary exceeds the maximum length.
+ */
+function text_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
+  foreach ($items as $delta => $item) {
+    // @todo Length is counted separately for summary and value, so the maximum
+    //   length can be exceeded very easily.
+    foreach (array('value', 'summary') as $column) {
+      if (!empty($item[$column])) {
+        if (!empty($field['settings']['max_length']) && drupal_strlen($item[$column]) > $field['settings']['max_length']) {
+          switch ($column) {
+            case 'value':
+              $message = t('%name: the text may not be longer than %max characters.', array('%name' => $instance['label'], '%max' => $field['settings']['max_length']));
+              break;
+
+            case 'summary':
+              $message = t('%name: the summary may not be longer than %max characters.', array('%name' => $instance['label'], '%max' => $field['settings']['max_length']));
+              break;
+          }
+          $errors[$field['field_name']][$langcode][$delta][] = array(
+            'error' => "text_{$column}_length",
+            'message' => $message,
+          );
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_load().
+ *
+ * Where possible, generate the sanitized version of each field early so that
+ * it is cached in the field cache. This avoids looking up from the filter cache
+ * separately.
+ *
+ * @see text_field_formatter_view()
+ */
+function text_field_load($entity_type, $entities, $field, $instances, $langcode, &$items) {
+  foreach ($entities as $id => $entity) {
+    foreach ($items[$id] as $delta => $item) {
+      // Only process items with a cacheable format, the rest will be handled
+      // by formatters if needed.
+      if (empty($instances[$id]['settings']['text_processing']) || filter_format_allowcache($item['format'])) {
+        $items[$id][$delta]['safe_value'] = isset($item['value']) ? _text_sanitize($instances[$id], $langcode, $item, 'value') : '';
+        if ($field['type'] == 'text_with_summary') {
+          $items[$id][$delta]['safe_summary'] = isset($item['summary']) ? _text_sanitize($instances[$id], $langcode, $item, 'summary') : '';
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_is_empty().
+ */
+function text_field_is_empty($item, $field) {
+  if (!isset($item['value']) || $item['value'] === '') {
+    return !isset($item['summary']) || $item['summary'] === '';
+  }
+  return FALSE;
+}
+
+/**
+ * Implements hook_field_formatter_info().
+ */
+function text_field_formatter_info() {
+  return array(
+    'text_default' => array(
+      'label' => t('Default'),
+      'field types' => array('text', 'text_long', 'text_with_summary'),
+    ),
+    'text_plain' => array(
+      'label' => t('Plain text'),
+      'field types' => array('text', 'text_long', 'text_with_summary'),
+    ),
+
+    // The text_trimmed formatter displays the trimmed version of the
+    // full element of the field. It is intended to be used with text
+    // and text_long fields. It also works with text_with_summary
+    // fields though the text_summary_or_trimmed formatter makes more
+    // sense for that field type.
+    'text_trimmed' => array(
+      'label' => t('Trimmed'),
+      'field types' => array('text', 'text_long', 'text_with_summary'),
+      'settings' => array('trim_length' => 600),
+    ),
+
+    // The 'summary or trimmed' field formatter for text_with_summary
+    // fields displays returns the summary element of the field or, if
+    // the summary is empty, the trimmed version of the full element
+    // of the field.
+    'text_summary_or_trimmed' => array(
+      'label' => t('Summary or trimmed'),
+      'field types' => array('text_with_summary'),
+      'settings' => array('trim_length' => 600),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_formatter_settings_form().
+ */
+function text_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $element = array();
+
+  if (strpos($display['type'], '_trimmed') !== FALSE) {
+    $element['trim_length'] = array(
+      '#title' => t('Trim length'),
+      '#type' => 'textfield',
+      '#size' => 10,
+      '#default_value' => $settings['trim_length'],
+      '#element_validate' => array('element_validate_integer_positive'),
+      '#required' => TRUE,
+    );
+  }
+
+  return $element;
+}
+
+/**
+ * Implements hook_field_formatter_settings_summary().
+ */
+function text_field_formatter_settings_summary($field, $instance, $view_mode) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $summary = '';
+
+  if (strpos($display['type'], '_trimmed') !== FALSE) {
+    $summary = t('Trim length') . ': ' . $settings['trim_length'];
+  }
+
+  return $summary;
+}
+
+/**
+ * Implements hook_field_formatter_view().
+ */
+function text_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  $element = array();
+
+  switch ($display['type']) {
+    case 'text_default':
+    case 'text_trimmed':
+      foreach ($items as $delta => $item) {
+        $output = _text_sanitize($instance, $langcode, $item, 'value');
+        if ($display['type'] == 'text_trimmed') {
+          $output = text_summary($output, $instance['settings']['text_processing'] ? $item['format'] : NULL, $display['settings']['trim_length']);
+        }
+        $element[$delta] = array('#markup' => $output);
+      }
+      break;
+
+    case 'text_summary_or_trimmed':
+      foreach ($items as $delta => $item) {
+        if (!empty($item['summary'])) {
+          $output = _text_sanitize($instance, $langcode, $item, 'summary');
+        }
+        else {
+          $output = _text_sanitize($instance, $langcode, $item, 'value');
+          $output = text_summary($output, $instance['settings']['text_processing'] ? $item['format'] : NULL, $display['settings']['trim_length']);
+        }
+        $element[$delta] = array('#markup' => $output);
+      }
+      break;
+
+    case 'text_plain':
+      foreach ($items as $delta => $item) {
+        $element[$delta] = array('#markup' => strip_tags($item['value']));
+      }
+      break;
+  }
+
+  return $element;
+}
+
+/**
+ * Sanitizes the 'value' or 'summary' data of a text value.
+ *
+ * Depending on whether the field instance uses text processing, data is run
+ * through check_plain() or check_markup().
+ *
+ * @param $instance
+ *   The instance definition.
+ * @param $langcode
+ *  The language associated to $item.
+ * @param $item
+ *   The field value to sanitize.
+ * @param $column
+ *   The column to sanitize (either 'value' or 'summary').
+ *
+ * @return
+ *  The sanitized string.
+ */
+function _text_sanitize($instance, $langcode, $item, $column) {
+  // If the value uses a cacheable text format, text_field_load() precomputes
+  // the sanitized string.
+  if (isset($item["safe_$column"])) {
+    return $item["safe_$column"];
+  }
+  return $instance['settings']['text_processing'] ? check_markup($item[$column], $item['format'], $langcode) : check_plain($item[$column]);
+}
+
+/**
+ * Generate a trimmed, formatted version of a text field value.
+ *
+ * If the end of the summary is not indicated using the <!--break--> delimiter
+ * then we generate the summary automatically, trying to end it at a sensible
+ * place such as the end of a paragraph, a line break, or the end of a
+ * sentence (in that order of preference).
+ *
+ * @param $text
+ *   The content for which a summary will be generated.
+ * @param $format
+ *   The format of the content.
+ *   If the PHP filter is present and $text contains PHP code, we do not
+ *   split it up to prevent parse errors.
+ *   If the line break filter is present then we treat newlines embedded in
+ *   $text as line breaks.
+ *   If the htmlcorrector filter is present, it will be run on the generated
+ *   summary (if different from the incoming $text).
+ * @param $size
+ *   The desired character length of the summary. If omitted, the default
+ *   value will be used. Ignored if the special delimiter is present
+ *   in $text.
+ * @return
+ *   The generated summary.
+ */
+function text_summary($text, $format = NULL, $size = NULL) {
+
+  if (!isset($size)) {
+    // What used to be called 'teaser' is now called 'summary', but
+    // the variable 'teaser_length' is preserved for backwards compatibility.
+    $size = variable_get('teaser_length', 600);
+  }
+
+  // Find where the delimiter is in the body
+  $delimiter = strpos($text, '<!--break-->');
+
+  // If the size is zero, and there is no delimiter, the entire body is the summary.
+  if ($size == 0 && $delimiter === FALSE) {
+    return $text;
+  }
+
+  // If a valid delimiter has been specified, use it to chop off the summary.
+  if ($delimiter !== FALSE) {
+    return substr($text, 0, $delimiter);
+  }
+
+  // We check for the presence of the PHP evaluator filter in the current
+  // format. If the body contains PHP code, we do not split it up to prevent
+  // parse errors.
+  if (isset($format)) {
+    $filters = filter_list_format($format);
+    if (isset($filters['php_code']) && $filters['php_code']->status && strpos($text, '<?') !== FALSE) {
+      return $text;
+    }
+  }
+
+  // If we have a short body, the entire body is the summary.
+  if (drupal_strlen($text) <= $size) {
+    return $text;
+  }
+
+  // If the delimiter has not been specified, try to split at paragraph or
+  // sentence boundaries.
+
+  // The summary may not be longer than maximum length specified. Initial slice.
+  $summary = truncate_utf8($text, $size);
+
+  // Store the actual length of the UTF8 string -- which might not be the same
+  // as $size.
+  $max_rpos = strlen($summary);
+
+  // How much to cut off the end of the summary so that it doesn't end in the
+  // middle of a paragraph, sentence, or word.
+  // Initialize it to maximum in order to find the minimum.
+  $min_rpos = $max_rpos;
+
+  // Store the reverse of the summary. We use strpos on the reversed needle and
+  // haystack for speed and convenience.
+  $reversed = strrev($summary);
+
+  // Build an array of arrays of break points grouped by preference.
+  $break_points = array();
+
+  // A paragraph near the end of sliced summary is most preferable.
+  $break_points[] = array('</p>' => 0);
+
+  // If no complete paragraph then treat line breaks as paragraphs.
+  $line_breaks = array('<br />' => 6, '<br>' => 4);
+  // Newline only indicates a line break if line break converter
+  // filter is present.
+  if (isset($filters['filter_autop'])) {
+    $line_breaks["\n"] = 1;
+  }
+  $break_points[] = $line_breaks;
+
+  // If the first paragraph is too long, split at the end of a sentence.
+  $break_points[] = array('. ' => 1, '! ' => 1, '? ' => 1, '。' => 0, '؟ ' => 1);
+
+  // Iterate over the groups of break points until a break point is found.
+  foreach ($break_points as $points) {
+    // Look for each break point, starting at the end of the summary.
+    foreach ($points as $point => $offset) {
+      // The summary is already reversed, but the break point isn't.
+      $rpos = strpos($reversed, strrev($point));
+      if ($rpos !== FALSE) {
+        $min_rpos = min($rpos + $offset, $min_rpos);
+      }
+    }
+
+    // If a break point was found in this group, slice and stop searching.
+    if ($min_rpos !== $max_rpos) {
+      // Don't slice with length 0. Length must be <0 to slice from RHS.
+      $summary = ($min_rpos === 0) ? $summary : substr($summary, 0, 0 - $min_rpos);
+      break;
+    }
+  }
+
+  // If the htmlcorrector filter is present, apply it to the generated summary.
+  if (isset($filters['filter_htmlcorrector'])) {
+    $summary = _filter_htmlcorrector($summary);
+  }
+
+  return $summary;
+}
+
+/**
+ * Implements hook_field_widget_info().
+ */
+function text_field_widget_info() {
+  return array(
+    'text_textfield' => array(
+      'label' => t('Text field'),
+      'field types' => array('text'),
+      'settings' => array('size' => 60),
+    ),
+    'text_textarea' => array(
+      'label' => t('Text area (multiple rows)'),
+      'field types' => array('text_long'),
+      'settings' => array('rows' => 5),
+    ),
+    'text_textarea_with_summary' => array(
+      'label' => t('Text area with a summary'),
+      'field types' => array('text_with_summary'),
+      'settings' => array('rows' => 20, 'summary_rows' => 5),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_widget_settings_form().
+ */
+function text_field_widget_settings_form($field, $instance) {
+  $widget = $instance['widget'];
+  $settings = $widget['settings'];
+
+  if ($widget['type'] == 'text_textfield') {
+    $form['size'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Size of textfield'),
+      '#default_value' => $settings['size'],
+      '#required' => TRUE,
+      '#element_validate' => array('element_validate_integer_positive'),
+    );
+  }
+  else {
+    $form['rows'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Rows'),
+      '#default_value' => $settings['rows'],
+      '#required' => TRUE,
+      '#element_validate' => array('element_validate_integer_positive'),
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_widget_form().
+ */
+function text_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  $summary_widget = array();
+  $main_widget = array();
+
+  switch ($instance['widget']['type']) {
+    case 'text_textfield':
+      $main_widget = $element + array(
+        '#type' => 'textfield',
+        '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : NULL,
+        '#size' => $instance['widget']['settings']['size'],
+        '#maxlength' => $field['settings']['max_length'],
+        '#attributes' => array('class' => array('text-full')),
+      );
+      break;
+
+    case 'text_textarea_with_summary':
+      $display = !empty($items[$delta]['summary']) || !empty($instance['settings']['display_summary']);
+      $summary_widget = array(
+        '#type' => $display ? 'textarea' : 'value',
+        '#default_value' => isset($items[$delta]['summary']) ? $items[$delta]['summary'] : NULL,
+        '#title' => t('Summary'),
+        '#rows' => $instance['widget']['settings']['summary_rows'],
+        '#description' => t('Leave blank to use trimmed value of full text as the summary.'),
+        '#attached' => array(
+          'js' => array(drupal_get_path('module', 'text') . '/text.js'),
+        ),
+        '#attributes' => array('class' => array('text-summary')),
+        '#prefix' => '<div class="text-summary-wrapper">',
+        '#suffix' => '</div>',
+        '#weight' => -10,
+      );
+      // Fall through to the next case.
+
+    case 'text_textarea':
+      $main_widget = $element + array(
+        '#type' => 'textarea',
+        '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : NULL,
+        '#rows' => $instance['widget']['settings']['rows'],
+        '#attributes' => array('class' => array('text-full')),
+      );
+      break;
+  }
+
+  if ($main_widget) {
+    // Conditionally alter the form element's type if text processing is enabled.
+    if ($instance['settings']['text_processing']) {
+      $element = $main_widget;
+      $element['#type'] = 'text_format';
+      $element['#format'] = isset($items[$delta]['format']) ? $items[$delta]['format'] : NULL;
+      $element['#base_type'] = $main_widget['#type'];
+    }
+    else {
+      $element['value'] = $main_widget;
+    }
+  }
+  if ($summary_widget) {
+    $element['summary'] = $summary_widget;
+  }
+
+  return $element;
+}
+
+/**
+ * Implements hook_field_widget_error().
+ */
+function text_field_widget_error($element, $error, $form, &$form_state) {
+  switch ($error['error']) {
+    case 'text_summary_max_length':
+      $error_element = $element[$element['#columns'][1]];
+      break;
+
+    default:
+      $error_element = $element[$element['#columns'][0]];
+      break;
+  }
+
+  form_error($error_element, $error['message']);
+}
+
+/**
+ * Implements hook_field_prepare_translation().
+ */
+function text_field_prepare_translation($entity_type, $entity, $field, $instance, $langcode, &$items, $source_entity, $source_langcode) {
+  // If the translating user is not permitted to use the assigned text format,
+  // we must not expose the source values.
+  $field_name = $field['field_name'];
+  if (!empty($source_entity->{$field_name}[$source_langcode])) {
+    $formats = filter_formats();
+    foreach ($source_entity->{$field_name}[$source_langcode] as $delta => $item) {
+      $format_id = $item['format'];
+      if (!empty($format_id) && !filter_access($formats[$format_id])) {
+        unset($items[$delta]);
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_filter_format_update().
+ */
+function text_filter_format_update($format) {
+  field_cache_clear();
+}
+
+/**
+ * Implements hook_filter_format_disable().
+ */
+function text_filter_format_disable($format) {
+  field_cache_clear();
+}
diff --git a/htmltest/modules/field/modules/text/text.test b/htmltest/modules/field/modules/text/text.test
new file mode 100644
index 00000000..2f147382
--- /dev/null
+++ b/htmltest/modules/field/modules/text/text.test
@@ -0,0 +1,517 @@
+<?php
+
+/**
+ * @file
+ * Tests for text.module.
+ */
+
+class TextFieldTestCase extends DrupalWebTestCase {
+  protected $instance;
+  protected $admin_user;
+  protected $web_user;
+
+  public static function getInfo() {
+    return array(
+      'name'  => 'Text field',
+      'description'  => "Test the creation of text fields.",
+      'group' => 'Field types'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('field_test');
+
+    $this->admin_user = $this->drupalCreateUser(array('administer filters'));
+    $this->web_user = $this->drupalCreateUser(array('access field_test content', 'administer field_test content'));
+    $this->drupalLogin($this->web_user);
+  }
+
+  // Test fields.
+
+  /**
+   * Test text field validation.
+   */
+  function testTextFieldValidation() {
+    // Create a field with settings to validate.
+    $max_length = 3;
+    $this->field = array(
+      'field_name' => drupal_strtolower($this->randomName()),
+      'type' => 'text',
+      'settings' => array(
+        'max_length' => $max_length,
+      )
+    );
+    field_create_field($this->field);
+    $this->instance = array(
+      'field_name' => $this->field['field_name'],
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'widget' => array(
+        'type' => 'text_textfield',
+      ),
+      'display' => array(
+        'default' => array(
+          'type' => 'text_default',
+        ),
+      ),
+    );
+    field_create_instance($this->instance);
+    // Test valid and invalid values with field_attach_validate().
+    $entity = field_test_create_stub_entity();
+    $langcode = LANGUAGE_NONE;
+    for ($i = 0; $i <= $max_length + 2; $i++) {
+      $entity->{$this->field['field_name']}[$langcode][0]['value'] = str_repeat('x', $i);
+      try {
+        field_attach_validate('test_entity', $entity);
+        $this->assertTrue($i <= $max_length, "Length $i does not cause validation error when max_length is $max_length");
+      }
+      catch (FieldValidationException $e) {
+        $this->assertTrue($i > $max_length, "Length $i causes validation error when max_length is $max_length");
+      }
+    }
+  }
+
+  /**
+   * Test widgets.
+   */
+  function testTextfieldWidgets() {
+    $this->_testTextfieldWidgets('text', 'text_textfield');
+    $this->_testTextfieldWidgets('text_long', 'text_textarea');
+  }
+
+  /**
+   * Helper function for testTextfieldWidgets().
+   */
+  function _testTextfieldWidgets($field_type, $widget_type) {
+    // Setup a field and instance
+    $entity_type = 'test_entity';
+    $this->field_name = drupal_strtolower($this->randomName());
+    $this->field = array('field_name' => $this->field_name, 'type' => $field_type);
+    field_create_field($this->field);
+    $this->instance = array(
+      'field_name' => $this->field_name,
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'label' => $this->randomName() . '_label',
+      'settings' => array(
+        'text_processing' => TRUE,
+      ),
+      'widget' => array(
+        'type' => $widget_type,
+      ),
+      'display' => array(
+        'full' => array(
+          'type' => 'text_default',
+        ),
+      ),
+    );
+    field_create_instance($this->instance);
+    $langcode = LANGUAGE_NONE;
+
+    // Display creation form.
+    $this->drupalGet('test-entity/add/test-bundle');
+    $this->assertFieldByName("{$this->field_name}[$langcode][0][value]", '', 'Widget is displayed');
+    $this->assertNoFieldByName("{$this->field_name}[$langcode][0][format]", '1', 'Format selector is not displayed');
+
+    // Submit with some value.
+    $value = $this->randomName();
+    $edit = array(
+      "{$this->field_name}[$langcode][0][value]" => $value,
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);
+    $id = $match[1];
+    $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), 'Entity was created');
+
+    // Display the entity.
+    $entity = field_test_entity_test_load($id);
+    $entity->content = field_attach_view($entity_type, $entity, 'full');
+    $this->content = drupal_render($entity->content);
+    $this->assertText($value, 'Filtered tags are not displayed');
+  }
+
+  /**
+   * Test widgets + 'formatted_text' setting.
+   */
+  function testTextfieldWidgetsFormatted() {
+    $this->_testTextfieldWidgetsFormatted('text', 'text_textfield');
+    $this->_testTextfieldWidgetsFormatted('text_long', 'text_textarea');
+  }
+
+  /**
+   * Helper function for testTextfieldWidgetsFormatted().
+   */
+  function _testTextfieldWidgetsFormatted($field_type, $widget_type) {
+    // Setup a field and instance
+    $entity_type = 'test_entity';
+    $this->field_name = drupal_strtolower($this->randomName());
+    $this->field = array('field_name' => $this->field_name, 'type' => $field_type);
+    field_create_field($this->field);
+    $this->instance = array(
+      'field_name' => $this->field_name,
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'label' => $this->randomName() . '_label',
+      'settings' => array(
+        'text_processing' => TRUE,
+      ),
+      'widget' => array(
+        'type' => $widget_type,
+      ),
+      'display' => array(
+        'full' => array(
+          'type' => 'text_default',
+        ),
+      ),
+    );
+    field_create_instance($this->instance);
+    $langcode = LANGUAGE_NONE;
+
+    // Disable all text formats besides the plain text fallback format.
+    $this->drupalLogin($this->admin_user);
+    foreach (filter_formats() as $format) {
+      if ($format->format != filter_fallback_format()) {
+        $this->drupalPost('admin/config/content/formats/' . $format->format . '/disable', array(), t('Disable'));
+      }
+    }
+    $this->drupalLogin($this->web_user);
+
+    // Display the creation form. Since the user only has access to one format,
+    // no format selector will be displayed.
+    $this->drupalGet('test-entity/add/test-bundle');
+    $this->assertFieldByName("{$this->field_name}[$langcode][0][value]", '', 'Widget is displayed');
+    $this->assertNoFieldByName("{$this->field_name}[$langcode][0][format]", '', 'Format selector is not displayed');
+
+    // Submit with data that should be filtered.
+    $value = '<em>' . $this->randomName() . '</em>';
+    $edit = array(
+      "{$this->field_name}[$langcode][0][value]" => $value,
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);
+    $id = $match[1];
+    $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), 'Entity was created');
+
+    // Display the entity.
+    $entity = field_test_entity_test_load($id);
+    $entity->content = field_attach_view($entity_type, $entity, 'full');
+    $this->content = drupal_render($entity->content);
+    $this->assertNoRaw($value, 'HTML tags are not displayed.');
+    $this->assertRaw(check_plain($value), 'Escaped HTML is displayed correctly.');
+
+    // Create a new text format that does not escape HTML, and grant the user
+    // access to it.
+    $this->drupalLogin($this->admin_user);
+    $edit = array(
+      'format' => drupal_strtolower($this->randomName()),
+      'name' => $this->randomName(),
+    );
+    $this->drupalPost('admin/config/content/formats/add', $edit, t('Save configuration'));
+    filter_formats_reset();
+    $this->checkPermissions(array(), TRUE);
+    $format = filter_format_load($edit['format']);
+    $format_id = $format->format;
+    $permission = filter_permission_name($format);
+    $rid = max(array_keys($this->web_user->roles));
+    user_role_grant_permissions($rid, array($permission));
+    $this->drupalLogin($this->web_user);
+
+    // Display edition form.
+    // We should now have a 'text format' selector.
+    $this->drupalGet('test-entity/manage/' . $id . '/edit');
+    $this->assertFieldByName("{$this->field_name}[$langcode][0][value]", NULL, 'Widget is displayed');
+    $this->assertFieldByName("{$this->field_name}[$langcode][0][format]", NULL, 'Format selector is displayed');
+
+    // Edit and change the text format to the new one that was created.
+    $edit = array(
+      "{$this->field_name}[$langcode][0][format]" => $format_id,
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertRaw(t('test_entity @id has been updated.', array('@id' => $id)), 'Entity was updated');
+
+    // Display the entity.
+    $entity = field_test_entity_test_load($id);
+    $entity->content = field_attach_view($entity_type, $entity, 'full');
+    $this->content = drupal_render($entity->content);
+    $this->assertRaw($value, 'Value is displayed unfiltered');
+  }
+}
+
+class TextSummaryTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Text summary',
+      'description' => 'Test text_summary() with different strings and lengths.',
+      'group' => 'Field types',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $this->article_creator = $this->drupalCreateUser(array('create article content', 'edit own article content'));
+  }
+
+  /**
+   * Tests an edge case where the first sentence is a question and
+   * subsequent sentences are not. This edge case is documented at
+   * http://drupal.org/node/180425.
+   */
+  function testFirstSentenceQuestion() {
+    $text = 'A question? A sentence. Another sentence.';
+    $expected = 'A question? A sentence.';
+    $this->callTextSummary($text, $expected, NULL, 30);
+  }
+
+  /**
+   * Test summary with long example.
+   */
+  function testLongSentence() {
+    $text = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ' . // 125
+            'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ' . // 108
+            'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. ' . // 103
+            'Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; // 110
+    $expected = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ' .
+                'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ' .
+                'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.';
+    // First three sentences add up to: 336, so add one for space and then 3 to get half-way into next word.
+    $this->callTextSummary($text, $expected, NULL, 340);
+  }
+
+  /**
+   * Test various summary length edge cases.
+   */
+  function testLength() {
+    // This string tests a number of edge cases.
+    $text = "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>";
+
+    // The summaries we expect text_summary() to return when $size is the index
+    // of each array item.
+    // Using no text format:
+    $expected = array(
+      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
+      "<",
+      "<p",
+      "<p>",
+      "<p>\n",
+      "<p>\nH",
+      "<p>\nHi",
+      "<p>\nHi\n",
+      "<p>\nHi\n<",
+      "<p>\nHi\n</",
+      "<p>\nHi\n</p",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
+      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
+      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
+    );
+
+    // And using a text format WITH the line-break and htmlcorrector filters.
+    $expected_lb = array(
+      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
+      "",
+      "<p></p>",
+      "<p></p>",
+      "<p></p>",
+      "<p></p>",
+      "<p></p>",
+      "<p>\nHi</p>",
+      "<p>\nHi</p>",
+      "<p>\nHi</p>",
+      "<p>\nHi</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>",
+      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
+      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
+      "<p>\nHi\n</p>\n<p>\nfolks\n<br />\n!\n</p>",
+    );
+
+    // Test text_summary() for different sizes.
+    for ($i = 0; $i <= 37; $i++) {
+      $this->callTextSummary($text, $expected[$i],    NULL, $i);
+      $this->callTextSummary($text, $expected_lb[$i], 'plain_text', $i);
+      $this->callTextSummary($text, $expected_lb[$i], 'filtered_html', $i);
+    }
+  }
+
+  /**
+   * Calls text_summary() and asserts that the expected teaser is returned.
+   */
+  function callTextSummary($text, $expected, $format = NULL, $size = NULL) {
+    $summary = text_summary($text, $format, $size);
+    $this->assertIdentical($summary, $expected, format_string('Generated summary "@summary" matches expected "@expected".', array('@summary' => $summary, '@expected' => $expected)));
+  }
+
+  /**
+   * Test sending only summary.
+   */
+  function testOnlyTextSummary() {
+    // Login as article creator.
+    $this->drupalLogin($this->article_creator);
+    // Create article with summary but empty body.
+    $summary = $this->randomName();
+    $edit = array(
+      "title" => $this->randomName(),
+      "body[und][0][summary]" => $summary,
+    );
+    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $node = $this->drupalGetNodeByTitle($edit['title']);
+
+    $this->assertIdentical($node->body['und'][0]['summary'], $summary, 'Article with with summary and no body has been submitted.');
+  }
+}
+
+class TextTranslationTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Text translation',
+      'description' => 'Check if the text field is correctly prepared for translation.',
+      'group' => 'Field types',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale', 'translation');
+
+    $full_html_format = filter_format_load('full_html');
+    $this->format = $full_html_format->format;
+    $this->admin = $this->drupalCreateUser(array(
+      'administer languages',
+      'administer content types',
+      'access administration pages',
+      'bypass node access',
+      filter_permission_name($full_html_format),
+    ));
+    $this->translator = $this->drupalCreateUser(array('create article content', 'edit own article content', 'translate content'));
+
+    // Enable an additional language.
+    $this->drupalLogin($this->admin);
+    $edit = array('langcode' => 'fr');
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+    // Set "Article" content type to use multilingual support with translation.
+    $edit = array('language_content_type' => 2);
+    $this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
+    $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Article')), 'Article content type has been updated.');
+  }
+
+  /**
+   * Test that a plaintext textfield widget is correctly populated.
+   */
+  function testTextField() {
+    // Disable text processing for body.
+    $edit = array('instance[settings][text_processing]' => 0);
+    $this->drupalPost('admin/structure/types/manage/article/fields/body', $edit, t('Save settings'));
+
+    // Login as translator.
+    $this->drupalLogin($this->translator);
+
+    // Create content.
+    $langcode = LANGUAGE_NONE;
+    $body = $this->randomName();
+    $edit = array(
+      "title" => $this->randomName(),
+      "language" => 'en',
+      "body[$langcode][0][value]" => $body,
+    );
+
+    // Translate the article in french.
+    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $node = $this->drupalGetNodeByTitle($edit['title']);
+    $this->drupalGet("node/$node->nid/translate");
+    $this->clickLink(t('add translation'));
+    $this->assertFieldByXPath("//textarea[@name='body[$langcode][0][value]']", $body, 'The textfield widget is populated.');
+  }
+
+  /**
+   * Check that user that does not have access the field format cannot see the
+   * source value when creating a translation.
+   */
+  function testTextFieldFormatted() {
+    // Make node body multiple.
+    $edit = array('field[cardinality]' => -1);
+    $this->drupalPost('admin/structure/types/manage/article/fields/body', $edit, t('Save settings'));
+    $this->drupalGet('node/add/article');
+    $this->assertFieldByXPath("//input[@name='body_add_more']", t('Add another item'), 'Body field cardinality set to multiple.');
+
+    $body = array(
+      $this->randomName(),
+      $this->randomName(),
+    );
+
+    // Create an article with the first body input format set to "Full HTML".
+    $title = $this->randomName();
+    $edit = array(
+      'title' => $title,
+      'language' => 'en',
+    );
+    $this->drupalPost('node/add/article', $edit, t('Save'));
+
+    // Populate the body field: the first item gets the "Full HTML" input
+    // format, the second one "Filtered HTML".
+    $formats = array('full_html', 'filtered_html');
+    $langcode = LANGUAGE_NONE;
+    foreach ($body as $delta => $value) {
+      $edit = array(
+        "body[$langcode][$delta][value]" => $value,
+        "body[$langcode][$delta][format]" => array_shift($formats),
+      );
+      $this->drupalPost('node/1/edit', $edit, t('Save'));
+      $this->assertText($body[$delta], format_string('The body field with delta @delta has been saved.', array('@delta' => $delta)));
+    }
+
+    // Login as translator.
+    $this->drupalLogin($this->translator);
+
+    // Translate the article in french.
+    $node = $this->drupalGetNodeByTitle($title);
+    $this->drupalGet("node/$node->nid/translate");
+    $this->clickLink(t('add translation'));
+    $this->assertNoText($body[0], format_string('The body field with delta @delta is hidden.', array('@delta' => 0)));
+    $this->assertText($body[1], format_string('The body field with delta @delta is shown.', array('@delta' => 1)));
+  }
+}
diff --git a/htmltest/modules/field/tests/field.test b/htmltest/modules/field/tests/field.test
new file mode 100644
index 00000000..1e593154
--- /dev/null
+++ b/htmltest/modules/field/tests/field.test
@@ -0,0 +1,3709 @@
+<?php
+
+/**
+ * @file
+ * Tests for field.module.
+ */
+
+/**
+ * Parent class for Field API tests.
+ */
+class FieldTestCase extends DrupalWebTestCase {
+  var $default_storage = 'field_sql_storage';
+
+  /**
+   * Set the default field storage backend for fields created during tests.
+   */
+  function setUp() {
+    // Since this is a base class for many test cases, support the same
+    // flexibility that DrupalWebTestCase::setUp() has for the modules to be
+    // passed in as either an array or a variable number of string arguments.
+    $modules = func_get_args();
+    if (isset($modules[0]) && is_array($modules[0])) {
+      $modules = $modules[0];
+    }
+    parent::setUp($modules);
+    // Set default storage backend.
+    variable_set('field_storage_default', $this->default_storage);
+  }
+
+  /**
+   * Generate random values for a field_test field.
+   *
+   * @param $cardinality
+   *   Number of values to generate.
+   * @return
+   *  An array of random values, in the format expected for field values.
+   */
+  function _generateTestFieldValues($cardinality) {
+    $values = array();
+    for ($i = 0; $i < $cardinality; $i++) {
+      // field_test fields treat 0 as 'empty value'.
+      $values[$i]['value'] = mt_rand(1, 127);
+    }
+    return $values;
+  }
+
+  /**
+   * Assert that a field has the expected values in an entity.
+   *
+   * This function only checks a single column in the field values.
+   *
+   * @param $entity
+   *   The entity to test.
+   * @param $field_name
+   *   The name of the field to test
+   * @param $langcode
+   *   The language code for the values.
+   * @param $expected_values
+   *   The array of expected values.
+   * @param $column
+   *   (Optional) the name of the column to check.
+   */
+  function assertFieldValues($entity, $field_name, $langcode, $expected_values, $column = 'value') {
+    $e = clone $entity;
+    field_attach_load('test_entity', array($e->ftid => $e));
+    $values = isset($e->{$field_name}[$langcode]) ? $e->{$field_name}[$langcode] : array();
+    $this->assertEqual(count($values), count($expected_values), 'Expected number of values were saved.');
+    foreach ($expected_values as $key => $value) {
+      $this->assertEqual($values[$key][$column], $value, format_string('Value @value was saved correctly.', array('@value' => $value)));
+    }
+  }
+}
+
+class FieldAttachTestCase extends FieldTestCase {
+  function setUp() {
+    // Since this is a base class for many test cases, support the same
+    // flexibility that DrupalWebTestCase::setUp() has for the modules to be
+    // passed in as either an array or a variable number of string arguments.
+    $modules = func_get_args();
+    if (isset($modules[0]) && is_array($modules[0])) {
+      $modules = $modules[0];
+    }
+    if (!in_array('field_test', $modules)) {
+      $modules[] = 'field_test';
+    }
+    parent::setUp($modules);
+
+    $this->createFieldWithInstance();
+  }
+
+  /**
+   * Create a field and an instance of it.
+   *
+   * @param string $suffix
+   *   (optional) A string that should only contain characters that are valid in
+   *   PHP variable names as well.
+   */
+  function createFieldWithInstance($suffix = '') {
+    $field_name = 'field_name' . $suffix;
+    $field = 'field' . $suffix;
+    $field_id = 'field_id' . $suffix;
+    $instance = 'instance' . $suffix;
+
+    $this->$field_name = drupal_strtolower($this->randomName() . '_field_name' . $suffix);
+    $this->$field = array('field_name' => $this->$field_name, 'type' => 'test_field', 'cardinality' => 4);
+    $this->$field = field_create_field($this->$field);
+    $this->$field_id = $this->{$field}['id'];
+    $this->$instance = array(
+      'field_name' => $this->$field_name,
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'label' => $this->randomName() . '_label',
+      'description' => $this->randomName() . '_description',
+      'weight' => mt_rand(0, 127),
+      'settings' => array(
+        'test_instance_setting' => $this->randomName(),
+      ),
+      'widget' => array(
+        'type' => 'test_field_widget',
+        'label' => 'Test Field',
+        'settings' => array(
+          'test_widget_setting' => $this->randomName(),
+        )
+      )
+    );
+    field_create_instance($this->$instance);
+  }
+}
+
+/**
+ * Unit test class for storage-related field_attach_* functions.
+ *
+ * All field_attach_* test work with all field_storage plugins and
+ * all hook_field_attach_pre_{load,insert,update}() hooks.
+ */
+class FieldAttachStorageTestCase extends FieldAttachTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Field attach tests (storage-related)',
+      'description' => 'Test storage-related Field Attach API functions.',
+      'group' => 'Field API',
+    );
+  }
+
+  /**
+   * Check field values insert, update and load.
+   *
+   * Works independently of the underlying field storage backend. Inserts or
+   * updates random field data and then loads and verifies the data.
+   */
+  function testFieldAttachSaveLoad() {
+    // Configure the instance so that we test hook_field_load() (see
+    // field_test_field_load() in field_test.module).
+    $this->instance['settings']['test_hook_field_load'] = TRUE;
+    field_update_instance($this->instance);
+    $langcode = LANGUAGE_NONE;
+
+    $entity_type = 'test_entity';
+    $values = array();
+
+    // TODO : test empty values filtering and "compression" (store consecutive deltas).
+
+    // Preparation: create three revisions and store them in $revision array.
+    for ($revision_id = 0; $revision_id < 3; $revision_id++) {
+      $revision[$revision_id] = field_test_create_stub_entity(0, $revision_id, $this->instance['bundle']);
+      // Note: we try to insert one extra value.
+      $values[$revision_id] = $this->_generateTestFieldValues($this->field['cardinality'] + 1);
+      $current_revision = $revision_id;
+      // If this is the first revision do an insert.
+      if (!$revision_id) {
+        $revision[$revision_id]->{$this->field_name}[$langcode] = $values[$revision_id];
+        field_attach_insert($entity_type, $revision[$revision_id]);
+      }
+      else {
+        // Otherwise do an update.
+        $revision[$revision_id]->{$this->field_name}[$langcode] = $values[$revision_id];
+        field_attach_update($entity_type, $revision[$revision_id]);
+      }
+    }
+
+    // Confirm current revision loads the correct data.
+    $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
+    field_attach_load($entity_type, array(0 => $entity));
+    // Number of values per field loaded equals the field cardinality.
+    $this->assertEqual(count($entity->{$this->field_name}[$langcode]), $this->field['cardinality'], 'Current revision: expected number of values');
+    for ($delta = 0; $delta < $this->field['cardinality']; $delta++) {
+      // The field value loaded matches the one inserted or updated.
+      $this->assertEqual($entity->{$this->field_name}[$langcode][$delta]['value'] , $values[$current_revision][$delta]['value'], format_string('Current revision: expected value %delta was found.', array('%delta' => $delta)));
+      // The value added in hook_field_load() is found.
+      $this->assertEqual($entity->{$this->field_name}[$langcode][$delta]['additional_key'], 'additional_value', format_string('Current revision: extra information for value %delta was found', array('%delta' => $delta)));
+    }
+
+    // Confirm each revision loads the correct data.
+    foreach (array_keys($revision) as $revision_id) {
+      $entity = field_test_create_stub_entity(0, $revision_id, $this->instance['bundle']);
+      field_attach_load_revision($entity_type, array(0 => $entity));
+      // Number of values per field loaded equals the field cardinality.
+      $this->assertEqual(count($entity->{$this->field_name}[$langcode]), $this->field['cardinality'], format_string('Revision %revision_id: expected number of values.', array('%revision_id' => $revision_id)));
+      for ($delta = 0; $delta < $this->field['cardinality']; $delta++) {
+        // The field value loaded matches the one inserted or updated.
+        $this->assertEqual($entity->{$this->field_name}[$langcode][$delta]['value'], $values[$revision_id][$delta]['value'], format_string('Revision %revision_id: expected value %delta was found.', array('%revision_id' => $revision_id, '%delta' => $delta)));
+        // The value added in hook_field_load() is found.
+        $this->assertEqual($entity->{$this->field_name}[$langcode][$delta]['additional_key'], 'additional_value', format_string('Revision %revision_id: extra information for value %delta was found', array('%revision_id' => $revision_id, '%delta' => $delta)));
+      }
+    }
+  }
+
+  /**
+   * Test the 'multiple' load feature.
+   */
+  function testFieldAttachLoadMultiple() {
+    $entity_type = 'test_entity';
+    $langcode = LANGUAGE_NONE;
+
+    // Define 2 bundles.
+    $bundles = array(
+      1 => 'test_bundle_1',
+      2 => 'test_bundle_2',
+    );
+    field_test_create_bundle($bundles[1]);
+    field_test_create_bundle($bundles[2]);
+    // Define 3 fields:
+    // - field_1 is in bundle_1 and bundle_2,
+    // - field_2 is in bundle_1,
+    // - field_3 is in bundle_2.
+    $field_bundles_map = array(
+      1 => array(1, 2),
+      2 => array(1),
+      3 => array(2),
+    );
+    for ($i = 1; $i <= 3; $i++) {
+      $field_names[$i] = 'field_' . $i;
+      $field = array('field_name' => $field_names[$i], 'type' => 'test_field');
+      $field = field_create_field($field);
+      $field_ids[$i] = $field['id'];
+      foreach ($field_bundles_map[$i] as $bundle) {
+        $instance = array(
+          'field_name' => $field_names[$i],
+          'entity_type' => 'test_entity',
+          'bundle' => $bundles[$bundle],
+          'settings' => array(
+            // Configure the instance so that we test hook_field_load()
+            // (see field_test_field_load() in field_test.module).
+            'test_hook_field_load' => TRUE,
+          ),
+        );
+        field_create_instance($instance);
+      }
+    }
+
+    // Create one test entity per bundle, with random values.
+    foreach ($bundles as $index => $bundle) {
+      $entities[$index] = field_test_create_stub_entity($index, $index, $bundle);
+      $entity = clone($entities[$index]);
+      $instances = field_info_instances('test_entity', $bundle);
+      foreach ($instances as $field_name => $instance) {
+        $values[$index][$field_name] = mt_rand(1, 127);
+        $entity->$field_name = array($langcode => array(array('value' => $values[$index][$field_name])));
+      }
+      field_attach_insert($entity_type, $entity);
+    }
+
+    // Check that a single load correctly loads field values for both entities.
+    field_attach_load($entity_type, $entities);
+    foreach ($entities as $index => $entity) {
+      $instances = field_info_instances($entity_type, $bundles[$index]);
+      foreach ($instances as $field_name => $instance) {
+        // The field value loaded matches the one inserted.
+        $this->assertEqual($entity->{$field_name}[$langcode][0]['value'], $values[$index][$field_name], format_string('Entity %index: expected value was found.', array('%index' => $index)));
+        // The value added in hook_field_load() is found.
+        $this->assertEqual($entity->{$field_name}[$langcode][0]['additional_key'], 'additional_value', format_string('Entity %index: extra information was found', array('%index' => $index)));
+      }
+    }
+
+    // Check that the single-field load option works.
+    $entity = field_test_create_stub_entity(1, 1, $bundles[1]);
+    field_attach_load($entity_type, array(1 => $entity), FIELD_LOAD_CURRENT, array('field_id' => $field_ids[1]));
+    $this->assertEqual($entity->{$field_names[1]}[$langcode][0]['value'], $values[1][$field_names[1]], format_string('Entity %index: expected value was found.', array('%index' => 1)));
+    $this->assertEqual($entity->{$field_names[1]}[$langcode][0]['additional_key'], 'additional_value', format_string('Entity %index: extra information was found', array('%index' => 1)));
+    $this->assert(!isset($entity->{$field_names[2]}), format_string('Entity %index: field %field_name is not loaded.', array('%index' => 2, '%field_name' => $field_names[2])));
+    $this->assert(!isset($entity->{$field_names[3]}), format_string('Entity %index: field %field_name is not loaded.', array('%index' => 3, '%field_name' => $field_names[3])));
+  }
+
+  /**
+   * Test saving and loading fields using different storage backends.
+   */
+  function testFieldAttachSaveLoadDifferentStorage() {
+    $entity_type = 'test_entity';
+    $langcode = LANGUAGE_NONE;
+
+    // Create two fields using different storage backends, and their instances.
+    $fields = array(
+      array(
+        'field_name' => 'field_1',
+        'type' => 'test_field',
+        'cardinality' => 4,
+        'storage' => array('type' => 'field_sql_storage')
+      ),
+      array(
+        'field_name' => 'field_2',
+        'type' => 'test_field',
+        'cardinality' => 4,
+        'storage' => array('type' => 'field_test_storage')
+      ),
+    );
+    foreach ($fields as $field) {
+      field_create_field($field);
+      $instance = array(
+        'field_name' => $field['field_name'],
+        'entity_type' => 'test_entity',
+        'bundle' => 'test_bundle',
+      );
+      field_create_instance($instance);
+    }
+
+    $entity_init = field_test_create_stub_entity();
+
+    // Create entity and insert random values.
+    $entity = clone($entity_init);
+    $values = array();
+    foreach ($fields as $field) {
+      $values[$field['field_name']] = $this->_generateTestFieldValues($this->field['cardinality']);
+      $entity->{$field['field_name']}[$langcode] = $values[$field['field_name']];
+    }
+    field_attach_insert($entity_type, $entity);
+
+    // Check that values are loaded as expected.
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity));
+    foreach ($fields as $field) {
+      $this->assertEqual($values[$field['field_name']], $entity->{$field['field_name']}[$langcode], format_string('%storage storage: expected values were found.', array('%storage' => $field['storage']['type'])));
+    }
+  }
+
+  /**
+   * Test storage details alteration.
+   *
+   * @see field_test_storage_details_alter()
+   */
+  function testFieldStorageDetailsAlter() {
+    $field_name = 'field_test_change_my_details';
+    $field = array(
+      'field_name' => $field_name,
+      'type' => 'test_field',
+      'cardinality' => 4,
+      'storage' => array('type' => 'field_test_storage'),
+    );
+    $field = field_create_field($field);
+    $instance = array(
+      'field_name' => $field_name,
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+    );
+    field_create_instance($instance);
+
+    $field = field_info_field($instance['field_name']);
+    $instance = field_info_instance($instance['entity_type'], $instance['field_name'], $instance['bundle']);
+
+    // The storage details are indexed by a storage engine type.
+    $this->assertTrue(array_key_exists('drupal_variables', $field['storage']['details']), 'The storage type is Drupal variables.');
+
+    $details = $field['storage']['details']['drupal_variables'];
+
+    // The field_test storage details are indexed by variable name. The details
+    // are altered, so moon and mars are correct for this test.
+    $this->assertTrue(array_key_exists('moon', $details[FIELD_LOAD_CURRENT]), 'Moon is available in the instance array.');
+    $this->assertTrue(array_key_exists('mars', $details[FIELD_LOAD_REVISION]), 'Mars is available in the instance array.');
+
+    // Test current and revision storage details together because the columns
+    // are the same.
+    foreach ((array) $field['columns'] as $column_name => $attributes) {
+      $this->assertEqual($details[FIELD_LOAD_CURRENT]['moon'][$column_name], $column_name, format_string('Column name %value matches the definition in %bin.', array('%value' => $column_name, '%bin' => 'moon[FIELD_LOAD_CURRENT]')));
+      $this->assertEqual($details[FIELD_LOAD_REVISION]['mars'][$column_name], $column_name, format_string('Column name %value matches the definition in %bin.', array('%value' => $column_name, '%bin' => 'mars[FIELD_LOAD_REVISION]')));
+    }
+  }
+
+  /**
+   * Tests insert and update with missing or NULL fields.
+   */
+  function testFieldAttachSaveMissingData() {
+    $entity_type = 'test_entity';
+    $entity_init = field_test_create_stub_entity();
+    $langcode = LANGUAGE_NONE;
+
+    // Insert: Field is missing.
+    $entity = clone($entity_init);
+    field_attach_insert($entity_type, $entity);
+
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity));
+    $this->assertTrue(empty($entity->{$this->field_name}), 'Insert: missing field results in no value saved');
+
+    // Insert: Field is NULL.
+    field_cache_clear();
+    $entity = clone($entity_init);
+    $entity->{$this->field_name} = NULL;
+    field_attach_insert($entity_type, $entity);
+
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity));
+    $this->assertTrue(empty($entity->{$this->field_name}), 'Insert: NULL field results in no value saved');
+
+    // Add some real data.
+    field_cache_clear();
+    $entity = clone($entity_init);
+    $values = $this->_generateTestFieldValues(1);
+    $entity->{$this->field_name}[$langcode] = $values;
+    field_attach_insert($entity_type, $entity);
+
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity));
+    $this->assertEqual($entity->{$this->field_name}[$langcode], $values, 'Field data saved');
+
+    // Update: Field is missing. Data should survive.
+    field_cache_clear();
+    $entity = clone($entity_init);
+    field_attach_update($entity_type, $entity);
+
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity));
+    $this->assertEqual($entity->{$this->field_name}[$langcode], $values, 'Update: missing field leaves existing values in place');
+
+    // Update: Field is NULL. Data should be wiped.
+    field_cache_clear();
+    $entity = clone($entity_init);
+    $entity->{$this->field_name} = NULL;
+    field_attach_update($entity_type, $entity);
+
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity));
+    $this->assertTrue(empty($entity->{$this->field_name}), 'Update: NULL field removes existing values');
+
+    // Re-add some data.
+    field_cache_clear();
+    $entity = clone($entity_init);
+    $values = $this->_generateTestFieldValues(1);
+    $entity->{$this->field_name}[$langcode] = $values;
+    field_attach_update($entity_type, $entity);
+
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity));
+    $this->assertEqual($entity->{$this->field_name}[$langcode], $values, 'Field data saved');
+
+    // Update: Field is empty array. Data should be wiped.
+    field_cache_clear();
+    $entity = clone($entity_init);
+    $entity->{$this->field_name} = array();
+    field_attach_update($entity_type, $entity);
+
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity));
+    $this->assertTrue(empty($entity->{$this->field_name}), 'Update: empty array removes existing values');
+  }
+
+  /**
+   * Test insert with missing or NULL fields, with default value.
+   */
+  function testFieldAttachSaveMissingDataDefaultValue() {
+    // Add a default value function.
+    $this->instance['default_value_function'] = 'field_test_default_value';
+    field_update_instance($this->instance);
+
+    $entity_type = 'test_entity';
+    $entity_init = field_test_create_stub_entity();
+    $langcode = LANGUAGE_NONE;
+
+    // Insert: Field is NULL.
+    $entity = clone($entity_init);
+    $entity->{$this->field_name}[$langcode] = NULL;
+    field_attach_insert($entity_type, $entity);
+
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity));
+    $this->assertTrue(empty($entity->{$this->field_name}[$langcode]), 'Insert: NULL field results in no value saved');
+
+    // Insert: Field is missing.
+    field_cache_clear();
+    $entity = clone($entity_init);
+    field_attach_insert($entity_type, $entity);
+
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity));
+    $values = field_test_default_value($entity_type, $entity, $this->field, $this->instance);
+    $this->assertEqual($entity->{$this->field_name}[$langcode], $values, 'Insert: missing field results in default value saved');
+  }
+
+  /**
+   * Test field_attach_delete().
+   */
+  function testFieldAttachDelete() {
+    $entity_type = 'test_entity';
+    $langcode = LANGUAGE_NONE;
+    $rev[0] = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
+
+    // Create revision 0
+    $values = $this->_generateTestFieldValues($this->field['cardinality']);
+    $rev[0]->{$this->field_name}[$langcode] = $values;
+    field_attach_insert($entity_type, $rev[0]);
+
+    // Create revision 1
+    $rev[1] = field_test_create_stub_entity(0, 1, $this->instance['bundle']);
+    $rev[1]->{$this->field_name}[$langcode] = $values;
+    field_attach_update($entity_type, $rev[1]);
+
+    // Create revision 2
+    $rev[2] = field_test_create_stub_entity(0, 2, $this->instance['bundle']);
+    $rev[2]->{$this->field_name}[$langcode] = $values;
+    field_attach_update($entity_type, $rev[2]);
+
+    // Confirm each revision loads
+    foreach (array_keys($rev) as $vid) {
+      $read = field_test_create_stub_entity(0, $vid, $this->instance['bundle']);
+      field_attach_load_revision($entity_type, array(0 => $read));
+      $this->assertEqual(count($read->{$this->field_name}[$langcode]), $this->field['cardinality'], "The test entity revision $vid has {$this->field['cardinality']} values.");
+    }
+
+    // Delete revision 1, confirm the other two still load.
+    field_attach_delete_revision($entity_type, $rev[1]);
+    foreach (array(0, 2) as $vid) {
+      $read = field_test_create_stub_entity(0, $vid, $this->instance['bundle']);
+      field_attach_load_revision($entity_type, array(0 => $read));
+      $this->assertEqual(count($read->{$this->field_name}[$langcode]), $this->field['cardinality'], "The test entity revision $vid has {$this->field['cardinality']} values.");
+    }
+
+    // Confirm the current revision still loads
+    $read = field_test_create_stub_entity(0, 2, $this->instance['bundle']);
+    field_attach_load($entity_type, array(0 => $read));
+    $this->assertEqual(count($read->{$this->field_name}[$langcode]), $this->field['cardinality'], "The test entity current revision has {$this->field['cardinality']} values.");
+
+    // Delete all field data, confirm nothing loads
+    field_attach_delete($entity_type, $rev[2]);
+    foreach (array(0, 1, 2) as $vid) {
+      $read = field_test_create_stub_entity(0, $vid, $this->instance['bundle']);
+      field_attach_load_revision($entity_type, array(0 => $read));
+      $this->assertIdentical($read->{$this->field_name}, array(), "The test entity revision $vid is deleted.");
+    }
+    $read = field_test_create_stub_entity(0, 2, $this->instance['bundle']);
+    field_attach_load($entity_type, array(0 => $read));
+    $this->assertIdentical($read->{$this->field_name}, array(), 'The test entity current revision is deleted.');
+  }
+
+  /**
+   * Test field_attach_create_bundle() and field_attach_rename_bundle().
+   */
+  function testFieldAttachCreateRenameBundle() {
+    // Create a new bundle. This has to be initiated by the module so that its
+    // hook_entity_info() is consistent.
+    $new_bundle = 'test_bundle_' . drupal_strtolower($this->randomName());
+    field_test_create_bundle($new_bundle);
+
+    // Add an instance to that bundle.
+    $this->instance['bundle'] = $new_bundle;
+    field_create_instance($this->instance);
+
+    // Save an entity with data in the field.
+    $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
+    $langcode = LANGUAGE_NONE;
+    $values = $this->_generateTestFieldValues($this->field['cardinality']);
+    $entity->{$this->field_name}[$langcode] = $values;
+    $entity_type = 'test_entity';
+    field_attach_insert($entity_type, $entity);
+
+    // Verify the field data is present on load.
+    $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
+    field_attach_load($entity_type, array(0 => $entity));
+    $this->assertEqual(count($entity->{$this->field_name}[$langcode]), $this->field['cardinality'], "Data is retrieved for the new bundle");
+
+    // Rename the bundle. This has to be initiated by the module so that its
+    // hook_entity_info() is consistent.
+    $new_bundle = 'test_bundle_' . drupal_strtolower($this->randomName());
+    field_test_rename_bundle($this->instance['bundle'], $new_bundle);
+
+    // Check that the instance definition has been updated.
+    $this->instance = field_info_instance($entity_type, $this->field_name, $new_bundle);
+    $this->assertIdentical($this->instance['bundle'], $new_bundle, "Bundle name has been updated in the instance.");
+
+    // Verify the field data is present on load.
+    $entity = field_test_create_stub_entity(0, 0, $new_bundle);
+    field_attach_load($entity_type, array(0 => $entity));
+    $this->assertEqual(count($entity->{$this->field_name}[$langcode]), $this->field['cardinality'], "Bundle name has been updated in the field storage");
+  }
+
+  /**
+   * Test field_attach_delete_bundle().
+   */
+  function testFieldAttachDeleteBundle() {
+    // Create a new bundle. This has to be initiated by the module so that its
+    // hook_entity_info() is consistent.
+    $new_bundle = 'test_bundle_' . drupal_strtolower($this->randomName());
+    field_test_create_bundle($new_bundle);
+
+    // Add an instance to that bundle.
+    $this->instance['bundle'] = $new_bundle;
+    field_create_instance($this->instance);
+
+    // Create a second field for the test bundle
+    $field_name = drupal_strtolower($this->randomName() . '_field_name');
+    $field = array('field_name' => $field_name, 'type' => 'test_field', 'cardinality' => 1);
+    field_create_field($field);
+    $instance = array(
+      'field_name' => $field_name,
+      'entity_type' => 'test_entity',
+      'bundle' => $this->instance['bundle'],
+      'label' => $this->randomName() . '_label',
+      'description' => $this->randomName() . '_description',
+      'weight' => mt_rand(0, 127),
+      // test_field has no instance settings
+      'widget' => array(
+        'type' => 'test_field_widget',
+        'settings' => array(
+          'size' => mt_rand(0, 255))));
+    field_create_instance($instance);
+
+    // Save an entity with data for both fields
+    $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
+    $langcode = LANGUAGE_NONE;
+    $values = $this->_generateTestFieldValues($this->field['cardinality']);
+    $entity->{$this->field_name}[$langcode] = $values;
+    $entity->{$field_name}[$langcode] = $this->_generateTestFieldValues(1);
+    field_attach_insert('test_entity', $entity);
+
+    // Verify the fields are present on load
+    $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
+    field_attach_load('test_entity', array(0 => $entity));
+    $this->assertEqual(count($entity->{$this->field_name}[$langcode]), 4, 'First field got loaded');
+    $this->assertEqual(count($entity->{$field_name}[$langcode]), 1, 'Second field got loaded');
+
+    // Delete the bundle. This has to be initiated by the module so that its
+    // hook_entity_info() is consistent.
+    field_test_delete_bundle($this->instance['bundle']);
+
+    // Verify no data gets loaded
+    $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
+    field_attach_load('test_entity', array(0 => $entity));
+    $this->assertFalse(isset($entity->{$this->field_name}[$langcode]), 'No data for first field');
+    $this->assertFalse(isset($entity->{$field_name}[$langcode]), 'No data for second field');
+
+    // Verify that the instances are gone
+    $this->assertFalse(field_read_instance('test_entity', $this->field_name, $this->instance['bundle']), "First field is deleted");
+    $this->assertFalse(field_read_instance('test_entity', $field_name, $instance['bundle']), "Second field is deleted");
+  }
+}
+
+/**
+ * Unit test class for non-storage related field_attach_* functions.
+ */
+class FieldAttachOtherTestCase extends FieldAttachTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Field attach tests (other)',
+      'description' => 'Test other Field Attach API functions.',
+      'group' => 'Field API',
+    );
+  }
+
+  /**
+   * Test field_attach_view() and field_attach_prepare_view().
+   */
+  function testFieldAttachView() {
+    $this->createFieldWithInstance('_2');
+
+    $entity_type = 'test_entity';
+    $entity_init = field_test_create_stub_entity();
+    $langcode = LANGUAGE_NONE;
+    $options = array('field_name' => $this->field_name_2);
+
+    // Populate values to be displayed.
+    $values = $this->_generateTestFieldValues($this->field['cardinality']);
+    $entity_init->{$this->field_name}[$langcode] = $values;
+    $values_2 = $this->_generateTestFieldValues($this->field_2['cardinality']);
+    $entity_init->{$this->field_name_2}[$langcode] = $values_2;
+
+    // Simple formatter, label displayed.
+    $entity = clone($entity_init);
+    $formatter_setting = $this->randomName();
+    $this->instance['display'] = array(
+      'full' => array(
+        'label' => 'above',
+        'type' => 'field_test_default',
+        'settings' => array(
+          'test_formatter_setting' => $formatter_setting,
+        )
+      ),
+    );
+    field_update_instance($this->instance);
+    $formatter_setting_2 = $this->randomName();
+    $this->instance_2['display'] = array(
+      'full' => array(
+        'label' => 'above',
+        'type' => 'field_test_default',
+        'settings' => array(
+          'test_formatter_setting' => $formatter_setting_2,
+        )
+      ),
+    );
+    field_update_instance($this->instance_2);
+    // View all fields.
+    field_attach_prepare_view($entity_type, array($entity->ftid => $entity), 'full');
+    $entity->content = field_attach_view($entity_type, $entity, 'full');
+    $output = drupal_render($entity->content);
+    $this->content = $output;
+    $this->assertRaw($this->instance['label'], "First field's label is displayed.");
+    foreach ($values as $delta => $value) {
+      $this->content = $output;
+      $this->assertRaw("$formatter_setting|{$value['value']}", "Value $delta is displayed, formatter settings are applied.");
+    }
+    $this->assertRaw($this->instance_2['label'], "Second field's label is displayed.");
+    foreach ($values_2 as $delta => $value) {
+      $this->content = $output;
+      $this->assertRaw("$formatter_setting_2|{$value['value']}", "Value $delta is displayed, formatter settings are applied.");
+    }
+    // View single field (the second field).
+    field_attach_prepare_view($entity_type, array($entity->ftid => $entity), 'full', $langcode, $options);
+    $entity->content = field_attach_view($entity_type, $entity, 'full', $langcode, $options);
+    $output = drupal_render($entity->content);
+    $this->content = $output;
+    $this->assertNoRaw($this->instance['label'], "First field's label is not displayed.");
+    foreach ($values as $delta => $value) {
+      $this->content = $output;
+      $this->assertNoRaw("$formatter_setting|{$value['value']}", "Value $delta is displayed, formatter settings are applied.");
+    }
+    $this->assertRaw($this->instance_2['label'], "Second field's label is displayed.");
+    foreach ($values_2 as $delta => $value) {
+      $this->content = $output;
+      $this->assertRaw("$formatter_setting_2|{$value['value']}", "Value $delta is displayed, formatter settings are applied.");
+    }
+
+    // Label hidden.
+    $entity = clone($entity_init);
+    $this->instance['display']['full']['label'] = 'hidden';
+    field_update_instance($this->instance);
+    field_attach_prepare_view($entity_type, array($entity->ftid => $entity), 'full');
+    $entity->content = field_attach_view($entity_type, $entity, 'full');
+    $output = drupal_render($entity->content);
+    $this->content = $output;
+    $this->assertNoRaw($this->instance['label'], "Hidden label: label is not displayed.");
+
+    // Field hidden.
+    $entity = clone($entity_init);
+    $this->instance['display'] = array(
+      'full' => array(
+        'label' => 'above',
+        'type' => 'hidden',
+      ),
+    );
+    field_update_instance($this->instance);
+    field_attach_prepare_view($entity_type, array($entity->ftid => $entity), 'full');
+    $entity->content = field_attach_view($entity_type, $entity, 'full');
+    $output = drupal_render($entity->content);
+    $this->content = $output;
+    $this->assertNoRaw($this->instance['label'], "Hidden field: label is not displayed.");
+    foreach ($values as $delta => $value) {
+      $this->assertNoRaw("$formatter_setting|{$value['value']}", "Hidden field: value $delta is not displayed.");
+    }
+
+    // Multiple formatter.
+    $entity = clone($entity_init);
+    $formatter_setting = $this->randomName();
+    $this->instance['display'] = array(
+      'full' => array(
+        'label' => 'above',
+        'type' => 'field_test_multiple',
+        'settings' => array(
+          'test_formatter_setting_multiple' => $formatter_setting,
+        )
+      ),
+    );
+    field_update_instance($this->instance);
+    field_attach_prepare_view($entity_type, array($entity->ftid => $entity), 'full');
+    $entity->content = field_attach_view($entity_type, $entity, 'full');
+    $output = drupal_render($entity->content);
+    $display = $formatter_setting;
+    foreach ($values as $delta => $value) {
+      $display .= "|$delta:{$value['value']}";
+    }
+    $this->content = $output;
+    $this->assertRaw($display, "Multiple formatter: all values are displayed, formatter settings are applied.");
+
+    // Test a formatter that uses hook_field_formatter_prepare_view().
+    $entity = clone($entity_init);
+    $formatter_setting = $this->randomName();
+    $this->instance['display'] = array(
+      'full' => array(
+        'label' => 'above',
+        'type' => 'field_test_with_prepare_view',
+        'settings' => array(
+          'test_formatter_setting_additional' => $formatter_setting,
+        )
+      ),
+    );
+    field_update_instance($this->instance);
+    field_attach_prepare_view($entity_type, array($entity->ftid => $entity), 'full');
+    $entity->content = field_attach_view($entity_type, $entity, 'full');
+    $output = drupal_render($entity->content);
+    $this->content = $output;
+    foreach ($values as $delta => $value) {
+      $this->content = $output;
+      $expected = $formatter_setting . '|' . $value['value'] . '|' . ($value['value'] + 1);
+      $this->assertRaw($expected, "Value $delta is displayed, formatter settings are applied.");
+    }
+
+    // TODO:
+    // - check display order with several fields
+
+    // Preprocess template.
+    $variables = array();
+    field_attach_preprocess($entity_type, $entity, $entity->content, $variables);
+    $result = TRUE;
+    foreach ($values as $delta => $item) {
+      if ($variables[$this->field_name][$delta]['value'] !== $item['value']) {
+        $result = FALSE;
+        break;
+      }
+    }
+    $this->assertTrue($result, format_string('Variable $@field_name correctly populated.', array('@field_name' => $this->field_name)));
+  }
+
+  /**
+   * Tests the 'multiple entity' behavior of field_attach_prepare_view().
+   */
+  function testFieldAttachPrepareViewMultiple() {
+    $entity_type = 'test_entity';
+    $langcode = LANGUAGE_NONE;
+
+    // Set the instance to be hidden.
+    $this->instance['display']['full']['type'] = 'hidden';
+    field_update_instance($this->instance);
+
+    // Set up a second instance on another bundle, with a formatter that uses
+    // hook_field_formatter_prepare_view().
+    field_test_create_bundle('test_bundle_2');
+    $formatter_setting = $this->randomName();
+    $this->instance2 = $this->instance;
+    $this->instance2['bundle'] = 'test_bundle_2';
+    $this->instance2['display']['full'] = array(
+      'type' => 'field_test_with_prepare_view',
+      'settings' => array(
+        'test_formatter_setting_additional' => $formatter_setting,
+      )
+    );
+    field_create_instance($this->instance2);
+
+    // Create one entity in each bundle.
+    $entity1_init = field_test_create_stub_entity(1, 1, 'test_bundle');
+    $values1 = $this->_generateTestFieldValues($this->field['cardinality']);
+    $entity1_init->{$this->field_name}[$langcode] = $values1;
+
+    $entity2_init = field_test_create_stub_entity(2, 2, 'test_bundle_2');
+    $values2 = $this->_generateTestFieldValues($this->field['cardinality']);
+    $entity2_init->{$this->field_name}[$langcode] = $values2;
+
+    // Run prepare_view, and check that the entities come out as expected.
+    $entity1 = clone($entity1_init);
+    $entity2 = clone($entity2_init);
+    field_attach_prepare_view($entity_type, array($entity1->ftid => $entity1, $entity2->ftid => $entity2), 'full');
+    $this->assertFalse(isset($entity1->{$this->field_name}[$langcode][0]['additional_formatter_value']), 'Entity 1 did not run through the prepare_view hook.');
+    $this->assertTrue(isset($entity2->{$this->field_name}[$langcode][0]['additional_formatter_value']), 'Entity 2 ran through the prepare_view hook.');
+
+    // Same thing, reversed order.
+    $entity1 = clone($entity1_init);
+    $entity2 = clone($entity2_init);
+    field_attach_prepare_view($entity_type, array($entity2->ftid => $entity2, $entity1->ftid => $entity1), 'full');
+    $this->assertFalse(isset($entity1->{$this->field_name}[$langcode][0]['additional_formatter_value']), 'Entity 1 did not run through the prepare_view hook.');
+    $this->assertTrue(isset($entity2->{$this->field_name}[$langcode][0]['additional_formatter_value']), 'Entity 2 ran through the prepare_view hook.');
+  }
+
+  /**
+   * Test field cache.
+   */
+  function testFieldAttachCache() {
+    // Initialize random values and a test entity.
+    $entity_init = field_test_create_stub_entity(1, 1, $this->instance['bundle']);
+    $langcode = LANGUAGE_NONE;
+    $values = $this->_generateTestFieldValues($this->field['cardinality']);
+
+    // Non-cacheable entity type.
+    $entity_type = 'test_entity';
+    $cid = "field:$entity_type:{$entity_init->ftid}";
+
+    // Check that no initial cache entry is present.
+    $this->assertFalse(cache_get($cid, 'cache_field'), 'Non-cached: no initial cache entry');
+
+    // Save, and check that no cache entry is present.
+    $entity = clone($entity_init);
+    $entity->{$this->field_name}[$langcode] = $values;
+    field_attach_insert($entity_type, $entity);
+    $this->assertFalse(cache_get($cid, 'cache_field'), 'Non-cached: no cache entry on insert');
+
+    // Load, and check that no cache entry is present.
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity));
+    $this->assertFalse(cache_get($cid, 'cache_field'), 'Non-cached: no cache entry on load');
+
+
+    // Cacheable entity type.
+    $entity_type = 'test_cacheable_entity';
+    $cid = "field:$entity_type:{$entity_init->ftid}";
+    $instance = $this->instance;
+    $instance['entity_type'] = $entity_type;
+    field_create_instance($instance);
+
+    // Check that no initial cache entry is present.
+    $this->assertFalse(cache_get($cid, 'cache_field'), 'Cached: no initial cache entry');
+
+    // Save, and check that no cache entry is present.
+    $entity = clone($entity_init);
+    $entity->{$this->field_name}[$langcode] = $values;
+    field_attach_insert($entity_type, $entity);
+    $this->assertFalse(cache_get($cid, 'cache_field'), 'Cached: no cache entry on insert');
+
+    // Load a single field, and check that no cache entry is present.
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity), FIELD_LOAD_CURRENT, array('field_id' => $this->field_id));
+    $cache = cache_get($cid, 'cache_field');
+    $this->assertFalse(cache_get($cid, 'cache_field'), 'Cached: no cache entry on loading a single field');
+
+    // Load, and check that a cache entry is present with the expected values.
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity));
+    $cache = cache_get($cid, 'cache_field');
+    $this->assertEqual($cache->data[$this->field_name][$langcode], $values, 'Cached: correct cache entry on load');
+
+    // Update with different values, and check that the cache entry is wiped.
+    $values = $this->_generateTestFieldValues($this->field['cardinality']);
+    $entity = clone($entity_init);
+    $entity->{$this->field_name}[$langcode] = $values;
+    field_attach_update($entity_type, $entity);
+    $this->assertFalse(cache_get($cid, 'cache_field'), 'Cached: no cache entry on update');
+
+    // Load, and check that a cache entry is present with the expected values.
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity));
+    $cache = cache_get($cid, 'cache_field');
+    $this->assertEqual($cache->data[$this->field_name][$langcode], $values, 'Cached: correct cache entry on load');
+
+    // Create a new revision, and check that the cache entry is wiped.
+    $entity_init = field_test_create_stub_entity(1, 2, $this->instance['bundle']);
+    $values = $this->_generateTestFieldValues($this->field['cardinality']);
+    $entity = clone($entity_init);
+    $entity->{$this->field_name}[$langcode] = $values;
+    field_attach_update($entity_type, $entity);
+    $cache = cache_get($cid, 'cache_field');
+    $this->assertFalse(cache_get($cid, 'cache_field'), 'Cached: no cache entry on new revision creation');
+
+    // Load, and check that a cache entry is present with the expected values.
+    $entity = clone($entity_init);
+    field_attach_load($entity_type, array($entity->ftid => $entity));
+    $cache = cache_get($cid, 'cache_field');
+    $this->assertEqual($cache->data[$this->field_name][$langcode], $values, 'Cached: correct cache entry on load');
+
+    // Delete, and check that the cache entry is wiped.
+    field_attach_delete($entity_type, $entity);
+    $this->assertFalse(cache_get($cid, 'cache_field'), 'Cached: no cache entry after delete');
+  }
+
+  /**
+   * Test field_attach_validate().
+   *
+   * Verify that field_attach_validate() invokes the correct
+   * hook_field_validate.
+   */
+  function testFieldAttachValidate() {
+    $this->createFieldWithInstance('_2');
+
+    $entity_type = 'test_entity';
+    $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
+    $langcode = LANGUAGE_NONE;
+
+    // Set up all but one values of the first field to generate errors.
+    $values = array();
+    for ($delta = 0; $delta < $this->field['cardinality']; $delta++) {
+      $values[$delta]['value'] = -1;
+    }
+    // Arrange for item 1 not to generate an error
+    $values[1]['value'] = 1;
+    $entity->{$this->field_name}[$langcode] = $values;
+
+    // Set up all values of the second field to generate errors.
+    $values_2 = array();
+    for ($delta = 0; $delta < $this->field_2['cardinality']; $delta++) {
+      $values_2[$delta]['value'] = -1;
+    }
+    $entity->{$this->field_name_2}[$langcode] = $values_2;
+
+    // Validate all fields.
+    try {
+      field_attach_validate($entity_type, $entity);
+    }
+    catch (FieldValidationException $e) {
+      $errors = $e->errors;
+    }
+
+    foreach ($values as $delta => $value) {
+      if ($value['value'] != 1) {
+        $this->assertIdentical($errors[$this->field_name][$langcode][$delta][0]['error'], 'field_test_invalid', "Error set on first field's value $delta");
+        $this->assertEqual(count($errors[$this->field_name][$langcode][$delta]), 1, "Only one error set on first field's value $delta");
+        unset($errors[$this->field_name][$langcode][$delta]);
+      }
+      else {
+        $this->assertFalse(isset($errors[$this->field_name][$langcode][$delta]), "No error set on first field's value $delta");
+      }
+    }
+    foreach ($values_2 as $delta => $value) {
+      $this->assertIdentical($errors[$this->field_name_2][$langcode][$delta][0]['error'], 'field_test_invalid', "Error set on second field's value $delta");
+      $this->assertEqual(count($errors[$this->field_name_2][$langcode][$delta]), 1, "Only one error set on second field's value $delta");
+      unset($errors[$this->field_name_2][$langcode][$delta]);
+    }
+    $this->assertEqual(count($errors[$this->field_name][$langcode]), 0, 'No extraneous errors set for first field');
+    $this->assertEqual(count($errors[$this->field_name_2][$langcode]), 0, 'No extraneous errors set for second field');
+
+    // Validate a single field.
+    $options = array('field_name' => $this->field_name_2);
+    try {
+      field_attach_validate($entity_type, $entity, $options);
+    }
+    catch (FieldValidationException $e) {
+      $errors = $e->errors;
+    }
+
+    foreach ($values_2 as $delta => $value) {
+      $this->assertIdentical($errors[$this->field_name_2][$langcode][$delta][0]['error'], 'field_test_invalid', "Error set on second field's value $delta");
+      $this->assertEqual(count($errors[$this->field_name_2][$langcode][$delta]), 1, "Only one error set on second field's value $delta");
+      unset($errors[$this->field_name_2][$langcode][$delta]);
+    }
+    $this->assertFalse(isset($errors[$this->field_name]), 'No validation errors are set for the first field, despite it having errors');
+    $this->assertEqual(count($errors[$this->field_name_2][$langcode]), 0, 'No extraneous errors set for second field');
+
+    // Check that cardinality is validated.
+    $entity->{$this->field_name_2}[$langcode] = $this->_generateTestFieldValues($this->field_2['cardinality'] + 1);
+    // When validating all fields.
+    try {
+      field_attach_validate($entity_type, $entity);
+    }
+    catch (FieldValidationException $e) {
+      $errors = $e->errors;
+    }
+    $this->assertEqual($errors[$this->field_name_2][$langcode][0][0]['error'], 'field_cardinality', 'Cardinality validation failed.');
+    // When validating a single field (the second field).
+    try {
+      field_attach_validate($entity_type, $entity, $options);
+    }
+    catch (FieldValidationException $e) {
+      $errors = $e->errors;
+    }
+    $this->assertEqual($errors[$this->field_name_2][$langcode][0][0]['error'], 'field_cardinality', 'Cardinality validation failed.');
+  }
+
+  /**
+   * Test field_attach_form().
+   *
+   * This could be much more thorough, but it does verify that the correct
+   * widgets show up.
+   */
+  function testFieldAttachForm() {
+    $this->createFieldWithInstance('_2');
+
+    $entity_type = 'test_entity';
+    $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
+    $langcode = LANGUAGE_NONE;
+
+    // When generating form for all fields.
+    $form = array();
+    $form_state = form_state_defaults();
+    field_attach_form($entity_type, $entity, $form, $form_state);
+
+    $this->assertEqual($form[$this->field_name][$langcode]['#title'], $this->instance['label'], "First field's form title is {$this->instance['label']}");
+    $this->assertEqual($form[$this->field_name_2][$langcode]['#title'], $this->instance_2['label'], "Second field's form title is {$this->instance_2['label']}");
+    for ($delta = 0; $delta < $this->field['cardinality']; $delta++) {
+      // field_test_widget uses 'textfield'
+        $this->assertEqual($form[$this->field_name][$langcode][$delta]['value']['#type'], 'textfield', "First field's form delta $delta widget is textfield");
+      }
+      for ($delta = 0; $delta < $this->field_2['cardinality']; $delta++) {
+        // field_test_widget uses 'textfield'
+        $this->assertEqual($form[$this->field_name_2][$langcode][$delta]['value']['#type'], 'textfield', "Second field's form delta $delta widget is textfield");
+      }
+
+      // When generating form for a single field (the second field).
+      $options = array('field_name' => $this->field_name_2);
+      $form = array();
+      $form_state = form_state_defaults();
+      field_attach_form($entity_type, $entity, $form, $form_state, NULL, $options);
+
+      $this->assertFalse(isset($form[$this->field_name]), 'The first field does not exist in the form');
+      $this->assertEqual($form[$this->field_name_2][$langcode]['#title'], $this->instance_2['label'], "Second field's form title is {$this->instance_2['label']}");
+      for ($delta = 0; $delta < $this->field_2['cardinality']; $delta++) {
+        // field_test_widget uses 'textfield'
+        $this->assertEqual($form[$this->field_name_2][$langcode][$delta]['value']['#type'], 'textfield', "Second field's form delta $delta widget is textfield");
+      }
+  }
+
+  /**
+   * Test field_attach_submit().
+   */
+  function testFieldAttachSubmit() {
+    $this->createFieldWithInstance('_2');
+
+    $entity_type = 'test_entity';
+    $entity_init = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
+    $langcode = LANGUAGE_NONE;
+
+    // Build the form for all fields.
+    $form = array();
+    $form_state = form_state_defaults();
+    field_attach_form($entity_type, $entity_init, $form, $form_state);
+
+    // Simulate incoming values.
+    // First field.
+    $values = array();
+    $weights = array();
+    for ($delta = 0; $delta < $this->field['cardinality']; $delta++) {
+      $values[$delta]['value'] = mt_rand(1, 127);
+      // Assign random weight.
+      do {
+        $weight = mt_rand(0, $this->field['cardinality']);
+      } while (in_array($weight, $weights));
+      $weights[$delta] = $weight;
+      $values[$delta]['_weight'] = $weight;
+    }
+    // Leave an empty value. 'field_test' fields are empty if empty().
+    $values[1]['value'] = 0;
+    // Second field.
+    $values_2 = array();
+    $weights_2 = array();
+    for ($delta = 0; $delta < $this->field_2['cardinality']; $delta++) {
+      $values_2[$delta]['value'] = mt_rand(1, 127);
+      // Assign random weight.
+      do {
+        $weight = mt_rand(0, $this->field_2['cardinality']);
+      } while (in_array($weight, $weights_2));
+      $weights_2[$delta] = $weight;
+      $values_2[$delta]['_weight'] = $weight;
+    }
+    // Leave an empty value. 'field_test' fields are empty if empty().
+    $values_2[1]['value'] = 0;
+    // Pretend the form has been built.
+    drupal_prepare_form('field_test_entity_form', $form, $form_state);
+    drupal_process_form('field_test_entity_form', $form, $form_state);
+    $form_state['values'][$this->field_name][$langcode] = $values;
+    $form_state['values'][$this->field_name_2][$langcode] = $values_2;
+
+    // Call field_attach_submit() for all fields.
+    $entity = clone($entity_init);
+    field_attach_submit($entity_type, $entity, $form, $form_state);
+
+    asort($weights);
+    asort($weights_2);
+    $expected_values = array();
+    $expected_values_2 = array();
+    foreach ($weights as $key => $value) {
+      if ($key != 1) {
+        $expected_values[] = array('value' => $values[$key]['value']);
+      }
+    }
+    $this->assertIdentical($entity->{$this->field_name}[$langcode], $expected_values, 'Submit filters empty values');
+    foreach ($weights_2 as $key => $value) {
+      if ($key != 1) {
+        $expected_values_2[] = array('value' => $values_2[$key]['value']);
+      }
+    }
+    $this->assertIdentical($entity->{$this->field_name_2}[$langcode], $expected_values_2, 'Submit filters empty values');
+
+    // Call field_attach_submit() for a single field (the second field).
+    $options = array('field_name' => $this->field_name_2);
+    $entity = clone($entity_init);
+    field_attach_submit($entity_type, $entity, $form, $form_state, $options);
+    $expected_values_2 = array();
+    foreach ($weights_2 as $key => $value) {
+      if ($key != 1) {
+        $expected_values_2[] = array('value' => $values_2[$key]['value']);
+      }
+    }
+    $this->assertFalse(isset($entity->{$this->field_name}), 'The first field does not exist in the entity object');
+    $this->assertIdentical($entity->{$this->field_name_2}[$langcode], $expected_values_2, 'Submit filters empty values');
+  }
+}
+
+class FieldInfoTestCase extends FieldTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Field info tests',
+      'description' => 'Get information about existing fields, instances and bundles.',
+      'group' => 'Field API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('field_test');
+  }
+
+  /**
+   * Test that field types and field definitions are correcly cached.
+   */
+  function testFieldInfo() {
+    // Test that field_test module's fields, widgets, and formatters show up.
+
+    $field_test_info = field_test_field_info();
+    // We need to account for the existence of user_field_info_alter().
+    foreach (array_keys($field_test_info) as $name) {
+      $field_test_info[$name]['instance_settings']['user_register_form'] = FALSE;
+    }
+    $info = field_info_field_types();
+    foreach ($field_test_info as $t_key => $field_type) {
+      foreach ($field_type as $key => $val) {
+        $this->assertEqual($info[$t_key][$key], $val, format_string('Field type %t_key key %key is %value', array('%t_key' => $t_key, '%key' => $key, '%value' => print_r($val, TRUE))));
+      }
+      $this->assertEqual($info[$t_key]['module'], 'field_test',  "Field type field_test module appears");
+    }
+
+    $formatter_info = field_test_field_formatter_info();
+    $info = field_info_formatter_types();
+    foreach ($formatter_info as $f_key => $formatter) {
+      foreach ($formatter as $key => $val) {
+        $this->assertEqual($info[$f_key][$key], $val, format_string('Formatter type %f_key key %key is %value', array('%f_key' => $f_key, '%key' => $key, '%value' => print_r($val, TRUE))));
+      }
+      $this->assertEqual($info[$f_key]['module'], 'field_test',  "Formatter type field_test module appears");
+    }
+
+    $widget_info = field_test_field_widget_info();
+    $info = field_info_widget_types();
+    foreach ($widget_info as $w_key => $widget) {
+      foreach ($widget as $key => $val) {
+        $this->assertEqual($info[$w_key][$key], $val, format_string('Widget type %w_key key %key is %value', array('%w_key' => $w_key, '%key' => $key, '%value' => print_r($val, TRUE))));
+      }
+      $this->assertEqual($info[$w_key]['module'], 'field_test',  "Widget type field_test module appears");
+    }
+
+    $storage_info = field_test_field_storage_info();
+    $info = field_info_storage_types();
+    foreach ($storage_info as $s_key => $storage) {
+      foreach ($storage as $key => $val) {
+        $this->assertEqual($info[$s_key][$key], $val, format_string('Storage type %s_key key %key is %value', array('%s_key' => $s_key, '%key' => $key, '%value' => print_r($val, TRUE))));
+      }
+      $this->assertEqual($info[$s_key]['module'], 'field_test',  "Storage type field_test module appears");
+    }
+
+    // Verify that no unexpected instances exist.
+    $instances = field_info_instances('test_entity');
+    $expected = array('test_bundle' => array());
+    $this->assertIdentical($instances, $expected, format_string("field_info_instances('test_entity') returns %expected.", array('%expected' => var_export($expected, TRUE))));
+    $instances = field_info_instances('test_entity', 'test_bundle');
+    $this->assertIdentical($instances, array(), "field_info_instances('test_entity', 'test_bundle') returns an empty array.");
+
+    // Create a field, verify it shows up.
+    $core_fields = field_info_fields();
+    $field = array(
+      'field_name' => drupal_strtolower($this->randomName()),
+      'type' => 'test_field',
+    );
+    field_create_field($field);
+    $fields = field_info_fields();
+    $this->assertEqual(count($fields), count($core_fields) + 1, 'One new field exists');
+    $this->assertEqual($fields[$field['field_name']]['field_name'], $field['field_name'], 'info fields contains field name');
+    $this->assertEqual($fields[$field['field_name']]['type'], $field['type'], 'info fields contains field type');
+    $this->assertEqual($fields[$field['field_name']]['module'], 'field_test', 'info fields contains field module');
+    $settings = array('test_field_setting' => 'dummy test string');
+    foreach ($settings as $key => $val) {
+      $this->assertEqual($fields[$field['field_name']]['settings'][$key], $val, format_string('Field setting %key has correct default value %value', array('%key' => $key, '%value' => $val)));
+    }
+    $this->assertEqual($fields[$field['field_name']]['cardinality'], 1, 'info fields contains cardinality 1');
+    $this->assertEqual($fields[$field['field_name']]['active'], 1, 'info fields contains active 1');
+
+    // Create an instance, verify that it shows up
+    $instance = array(
+      'field_name' => $field['field_name'],
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'label' => $this->randomName(),
+      'description' => $this->randomName(),
+      'weight' => mt_rand(0, 127),
+      // test_field has no instance settings
+      'widget' => array(
+        'type' => 'test_field_widget',
+        'settings' => array(
+          'test_setting' => 999)));
+    field_create_instance($instance);
+
+    $info = entity_get_info('test_entity');
+    $instances = field_info_instances('test_entity', $instance['bundle']);
+    $this->assertEqual(count($instances), 1, format_string('One instance shows up in info when attached to a bundle on a @label.', array(
+      '@label' => $info['label']
+    )));
+    $this->assertTrue($instance < $instances[$instance['field_name']], 'Instance appears in info correctly');
+
+    // Test a valid entity type but an invalid bundle.
+    $instances = field_info_instances('test_entity', 'invalid_bundle');
+    $this->assertIdentical($instances, array(), "field_info_instances('test_entity', 'invalid_bundle') returns an empty array.");
+
+    // Test invalid entity type and bundle.
+    $instances = field_info_instances('invalid_entity', $instance['bundle']);
+    $this->assertIdentical($instances, array(), "field_info_instances('invalid_entity', 'test_bundle') returns an empty array.");
+
+    // Test invalid entity type, no bundle provided.
+    $instances = field_info_instances('invalid_entity');
+    $this->assertIdentical($instances, array(), "field_info_instances('invalid_entity') returns an empty array.");
+
+    // Test with an entity type that has no bundles.
+    $instances = field_info_instances('user');
+    $expected = array('user' => array());
+    $this->assertIdentical($instances, $expected, format_string("field_info_instances('user') returns %expected.", array('%expected' => var_export($expected, TRUE))));
+    $instances = field_info_instances('user', 'user');
+    $this->assertIdentical($instances, array(), "field_info_instances('user', 'user') returns an empty array.");
+
+    // Test that querying for invalid entity types does not add entries in the
+    // list returned by field_info_instances().
+    field_info_cache_clear();
+    field_info_instances('invalid_entity', 'invalid_bundle');
+    // Simulate new request by clearing static caches.
+    drupal_static_reset();
+    field_info_instances('invalid_entity', 'invalid_bundle');
+    $instances = field_info_instances();
+    $this->assertFalse(isset($instances['invalid_entity']), 'field_info_instances() does not contain entries for the invalid entity type that was queried before');
+  }
+
+  /**
+   * Test that cached field definitions are ready for current runtime context.
+   */
+  function testFieldPrepare() {
+    $field_definition = array(
+      'field_name' => 'field',
+      'type' => 'test_field',
+    );
+    field_create_field($field_definition);
+
+    // Simulate a stored field definition missing a field setting (e.g. a
+    // third-party module adding a new field setting has been enabled, and
+    // existing fields do not know the setting yet).
+    $data = db_query('SELECT data FROM {field_config} WHERE field_name = :field_name', array(':field_name' => $field_definition['field_name']))->fetchField();
+    $data = unserialize($data);
+    $data['settings'] = array();
+    db_update('field_config')
+      ->fields(array('data' => serialize($data)))
+      ->condition('field_name', $field_definition['field_name'])
+      ->execute();
+
+    field_cache_clear();
+
+    // Read the field back.
+    $field = field_info_field($field_definition['field_name']);
+
+    // Check that all expected settings are in place.
+    $field_type = field_info_field_types($field_definition['type']);
+    $this->assertIdentical($field['settings'], $field_type['settings'], 'All expected default field settings are present.');
+  }
+
+  /**
+   * Test that cached instance definitions are ready for current runtime context.
+   */
+  function testInstancePrepare() {
+    $field_definition = array(
+      'field_name' => 'field',
+      'type' => 'test_field',
+    );
+    field_create_field($field_definition);
+    $instance_definition = array(
+      'field_name' => $field_definition['field_name'],
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+    );
+    field_create_instance($instance_definition);
+
+    // Simulate a stored instance definition missing various settings (e.g. a
+    // third-party module adding instance, widget or display settings has been
+    // enabled, but existing instances do not know the new settings).
+    $data = db_query('SELECT data FROM {field_config_instance} WHERE field_name = :field_name AND bundle = :bundle', array(':field_name' => $instance_definition['field_name'], ':bundle' => $instance_definition['bundle']))->fetchField();
+    $data = unserialize($data);
+    $data['settings'] = array();
+    $data['widget']['settings'] = 'unavailable_widget';
+    $data['widget']['settings'] = array();
+    $data['display']['default']['type'] = 'unavailable_formatter';
+    $data['display']['default']['settings'] = array();
+    db_update('field_config_instance')
+      ->fields(array('data' => serialize($data)))
+      ->condition('field_name', $instance_definition['field_name'])
+      ->condition('bundle', $instance_definition['bundle'])
+      ->execute();
+
+    field_cache_clear();
+
+    // Read the instance back.
+    $instance = field_info_instance($instance_definition['entity_type'], $instance_definition['field_name'], $instance_definition['bundle']);
+
+    // Check that all expected instance settings are in place.
+    $field_type = field_info_field_types($field_definition['type']);
+    $this->assertIdentical($instance['settings'], $field_type['instance_settings'] , 'All expected instance settings are present.');
+
+    // Check that the default widget is used and expected settings are in place.
+    $this->assertIdentical($instance['widget']['type'], $field_type['default_widget'], 'Unavailable widget replaced with default widget.');
+    $widget_type = field_info_widget_types($instance['widget']['type']);
+    $this->assertIdentical($instance['widget']['settings'], $widget_type['settings'] , 'All expected widget settings are present.');
+
+    // Check that display settings are set for the 'default' mode.
+    $display = $instance['display']['default'];
+    $this->assertIdentical($display['type'], $field_type['default_formatter'], "Formatter is set for the 'default' view mode");
+    $formatter_type = field_info_formatter_types($display['type']);
+    $this->assertIdentical($display['settings'], $formatter_type['settings'] , "Formatter settings are set for the 'default' view mode");
+  }
+
+  /**
+   * Test that instances on disabled entity types are filtered out.
+   */
+  function testInstanceDisabledEntityType() {
+    // For this test the field type and the entity type must be exposed by
+    // different modules.
+    $field_definition = array(
+      'field_name' => 'field',
+      'type' => 'test_field',
+    );
+    field_create_field($field_definition);
+    $instance_definition = array(
+      'field_name' => 'field',
+      'entity_type' => 'comment',
+      'bundle' => 'comment_node_article',
+    );
+    field_create_instance($instance_definition);
+
+    // Disable coment module. This clears field_info cache.
+    module_disable(array('comment'));
+    $this->assertNull(field_info_instance('comment', 'field', 'comment_node_article'), 'No instances are returned on disabled entity types.');
+  }
+
+  /**
+   * Test field_info_field_map().
+   */
+  function testFieldMap() {
+    // We will overlook fields created by the 'standard' install profile.
+    $exclude = field_info_field_map();
+
+    // Create a new bundle for 'test_entity' entity type.
+    field_test_create_bundle('test_bundle_2');
+
+    // Create a couple fields.
+    $fields  = array(
+      array(
+        'field_name' => 'field_1',
+        'type' => 'test_field',
+      ),
+      array(
+        'field_name' => 'field_2',
+        'type' => 'hidden_test_field',
+      ),
+    );
+    foreach ($fields as $field) {
+      field_create_field($field);
+    }
+
+    // Create a couple instances.
+    $instances = array(
+      array(
+        'field_name' => 'field_1',
+        'entity_type' => 'test_entity',
+        'bundle' => 'test_bundle',
+      ),
+      array(
+        'field_name' => 'field_1',
+        'entity_type' => 'test_entity',
+        'bundle' => 'test_bundle_2',
+      ),
+      array(
+        'field_name' => 'field_2',
+        'entity_type' => 'test_entity',
+        'bundle' => 'test_bundle',
+      ),
+      array(
+        'field_name' => 'field_2',
+        'entity_type' => 'test_cacheable_entity',
+        'bundle' => 'test_bundle',
+      ),
+    );
+    foreach ($instances as $instance) {
+      field_create_instance($instance);
+    }
+
+    $expected = array(
+      'field_1' => array(
+        'type' => 'test_field',
+        'bundles' => array(
+          'test_entity' => array('test_bundle', 'test_bundle_2'),
+        ),
+      ),
+      'field_2' => array(
+        'type' => 'hidden_test_field',
+        'bundles' => array(
+          'test_entity' => array('test_bundle'),
+          'test_cacheable_entity' => array('test_bundle'),
+        ),
+      ),
+    );
+
+    // Check that the field map is correct.
+    $map = field_info_field_map();
+    $map = array_diff_key($map, $exclude);
+    $this->assertEqual($map, $expected);
+  }
+
+  /**
+   * Test that the field_info settings convenience functions work.
+   */
+  function testSettingsInfo() {
+    $info = field_test_field_info();
+    // We need to account for the existence of user_field_info_alter().
+    foreach (array_keys($info) as $name) {
+      $info[$name]['instance_settings']['user_register_form'] = FALSE;
+    }
+    foreach ($info as $type => $data) {
+      $this->assertIdentical(field_info_field_settings($type), $data['settings'], format_string("field_info_field_settings returns %type's field settings", array('%type' => $type)));
+      $this->assertIdentical(field_info_instance_settings($type), $data['instance_settings'], format_string("field_info_field_settings returns %type's field instance settings", array('%type' => $type)));
+    }
+
+    $info = field_test_field_widget_info();
+    foreach ($info as $type => $data) {
+      $this->assertIdentical(field_info_widget_settings($type), $data['settings'], format_string("field_info_widget_settings returns %type's widget settings", array('%type' => $type)));
+    }
+
+    $info = field_test_field_formatter_info();
+    foreach ($info as $type => $data) {
+      $this->assertIdentical(field_info_formatter_settings($type), $data['settings'], format_string("field_info_formatter_settings returns %type's formatter settings", array('%type' => $type)));
+    }
+  }
+
+  /**
+   * Tests that the field info cache can be built correctly.
+   */
+  function testFieldInfoCache() {
+    // Create a test field and ensure it's in the array returned by
+    // field_info_fields().
+    $field_name = drupal_strtolower($this->randomName());
+    $field = array(
+      'field_name' => $field_name,
+      'type' => 'test_field',
+    );
+    field_create_field($field);
+    $fields = field_info_fields();
+    $this->assertTrue(isset($fields[$field_name]), 'The test field is initially found in the array returned by field_info_fields().');
+
+    // Now rebuild the field info cache, and set a variable which will cause
+    // the cache to be cleared while it's being rebuilt; see
+    // field_test_entity_info(). Ensure the test field is still in the returned
+    // array.
+    field_info_cache_clear();
+    variable_set('field_test_clear_info_cache_in_hook_entity_info', TRUE);
+    $fields = field_info_fields();
+    $this->assertTrue(isset($fields[$field_name]), 'The test field is found in the array returned by field_info_fields() even if its cache is cleared while being rebuilt.');
+  }
+}
+
+class FieldFormTestCase extends FieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Field form tests',
+      'description' => 'Test Field form handling.',
+      'group' => 'Field API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('field_test');
+
+    $web_user = $this->drupalCreateUser(array('access field_test content', 'administer field_test content'));
+    $this->drupalLogin($web_user);
+
+    $this->field_single = array('field_name' => 'field_single', 'type' => 'test_field');
+    $this->field_multiple = array('field_name' => 'field_multiple', 'type' => 'test_field', 'cardinality' => 4);
+    $this->field_unlimited = array('field_name' => 'field_unlimited', 'type' => 'test_field', 'cardinality' => FIELD_CARDINALITY_UNLIMITED);
+
+    $this->instance = array(
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'label' => $this->randomName() . '_label',
+      'description' => $this->randomName() . '_description',
+      'weight' => mt_rand(0, 127),
+      'settings' => array(
+        'test_instance_setting' => $this->randomName(),
+      ),
+      'widget' => array(
+        'type' => 'test_field_widget',
+        'label' => 'Test Field',
+        'settings' => array(
+          'test_widget_setting' => $this->randomName(),
+        )
+      )
+    );
+  }
+
+  function testFieldFormSingle() {
+    $this->field = $this->field_single;
+    $this->field_name = $this->field['field_name'];
+    $this->instance['field_name'] = $this->field_name;
+    field_create_field($this->field);
+    field_create_instance($this->instance);
+    $langcode = LANGUAGE_NONE;
+
+    // Display creation form.
+    $this->drupalGet('test-entity/add/test-bundle');
+    $this->assertFieldByName("{$this->field_name}[$langcode][0][value]", '', 'Widget is displayed');
+    $this->assertNoField("{$this->field_name}[$langcode][1][value]", 'No extraneous widget is displayed');
+    // TODO : check that the widget is populated with default value ?
+
+    // Submit with invalid value (field-level validation).
+    $edit = array("{$this->field_name}[$langcode][0][value]" => -1);
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertRaw(t('%name does not accept the value -1.', array('%name' => $this->instance['label'])), 'Field validation fails with invalid input.');
+    // TODO : check that the correct field is flagged for error.
+
+    // Create an entity
+    $value = mt_rand(1, 127);
+    $edit = array("{$this->field_name}[$langcode][0][value]" => $value);
+    $this->drupalPost(NULL, $edit, t('Save'));
+    preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);
+    $id = $match[1];
+    $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), 'Entity was created');
+    $entity = field_test_entity_test_load($id);
+    $this->assertEqual($entity->{$this->field_name}[$langcode][0]['value'], $value, 'Field value was saved');
+
+    // Display edit form.
+    $this->drupalGet('test-entity/manage/' . $id . '/edit');
+    $this->assertFieldByName("{$this->field_name}[$langcode][0][value]", $value, 'Widget is displayed with the correct default value');
+    $this->assertNoField("{$this->field_name}[$langcode][1][value]", 'No extraneous widget is displayed');
+
+    // Update the entity.
+    $value = mt_rand(1, 127);
+    $edit = array("{$this->field_name}[$langcode][0][value]" => $value);
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertRaw(t('test_entity @id has been updated.', array('@id' => $id)), 'Entity was updated');
+    $entity = field_test_entity_test_load($id);
+    $this->assertEqual($entity->{$this->field_name}[$langcode][0]['value'], $value, 'Field value was updated');
+
+    // Empty the field.
+    $value = '';
+    $edit = array("{$this->field_name}[$langcode][0][value]" => $value);
+    $this->drupalPost('test-entity/manage/' . $id . '/edit', $edit, t('Save'));
+    $this->assertRaw(t('test_entity @id has been updated.', array('@id' => $id)), 'Entity was updated');
+    $entity = field_test_entity_test_load($id);
+    $this->assertIdentical($entity->{$this->field_name}, array(), 'Field was emptied');
+
+  }
+
+  function testFieldFormSingleRequired() {
+    $this->field = $this->field_single;
+    $this->field_name = $this->field['field_name'];
+    $this->instance['field_name'] = $this->field_name;
+    $this->instance['required'] = TRUE;
+    field_create_field($this->field);
+    field_create_instance($this->instance);
+    $langcode = LANGUAGE_NONE;
+
+    // Submit with missing required value.
+    $edit = array();
+    $this->drupalPost('test-entity/add/test-bundle', $edit, t('Save'));
+    $this->assertRaw(t('!name field is required.', array('!name' => $this->instance['label'])), 'Required field with no value fails validation');
+
+    // Create an entity
+    $value = mt_rand(1, 127);
+    $edit = array("{$this->field_name}[$langcode][0][value]" => $value);
+    $this->drupalPost(NULL, $edit, t('Save'));
+    preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);
+    $id = $match[1];
+    $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), 'Entity was created');
+    $entity = field_test_entity_test_load($id);
+    $this->assertEqual($entity->{$this->field_name}[$langcode][0]['value'], $value, 'Field value was saved');
+
+    // Edit with missing required value.
+    $value = '';
+    $edit = array("{$this->field_name}[$langcode][0][value]" => $value);
+    $this->drupalPost('test-entity/manage/' . $id . '/edit', $edit, t('Save'));
+    $this->assertRaw(t('!name field is required.', array('!name' => $this->instance['label'])), 'Required field with no value fails validation');
+  }
+
+//  function testFieldFormMultiple() {
+//    $this->field = $this->field_multiple;
+//    $this->field_name = $this->field['field_name'];
+//    $this->instance['field_name'] = $this->field_name;
+//    field_create_field($this->field);
+//    field_create_instance($this->instance);
+//  }
+
+  function testFieldFormUnlimited() {
+    $this->field = $this->field_unlimited;
+    $this->field_name = $this->field['field_name'];
+    $this->instance['field_name'] = $this->field_name;
+    field_create_field($this->field);
+    field_create_instance($this->instance);
+    $langcode = LANGUAGE_NONE;
+
+    // Display creation form -> 1 widget.
+    $this->drupalGet('test-entity/add/test-bundle');
+    $this->assertFieldByName("{$this->field_name}[$langcode][0][value]", '', 'Widget 1 is displayed');
+    $this->assertNoField("{$this->field_name}[$langcode][1][value]", 'No extraneous widget is displayed');
+
+    // Press 'add more' button -> 2 widgets.
+    $this->drupalPost(NULL, array(), t('Add another item'));
+    $this->assertFieldByName("{$this->field_name}[$langcode][0][value]", '', 'Widget 1 is displayed');
+    $this->assertFieldByName("{$this->field_name}[$langcode][1][value]", '', 'New widget is displayed');
+    $this->assertNoField("{$this->field_name}[$langcode][2][value]", 'No extraneous widget is displayed');
+    // TODO : check that non-field inpurs are preserved ('title')...
+
+    // Yet another time so that we can play with more values -> 3 widgets.
+    $this->drupalPost(NULL, array(), t('Add another item'));
+
+    // Prepare values and weights.
+    $count = 3;
+    $delta_range = $count - 1;
+    $values = $weights = $pattern = $expected_values = $edit = array();
+    for ($delta = 0; $delta <= $delta_range; $delta++) {
+      // Assign unique random values and weights.
+      do {
+        $value = mt_rand(1, 127);
+      } while (in_array($value, $values));
+      do {
+        $weight = mt_rand(-$delta_range, $delta_range);
+      } while (in_array($weight, $weights));
+      $edit["$this->field_name[$langcode][$delta][value]"] = $value;
+      $edit["$this->field_name[$langcode][$delta][_weight]"] = $weight;
+      // We'll need three slightly different formats to check the values.
+      $values[$delta] = $value;
+      $weights[$delta] = $weight;
+      $field_values[$weight]['value'] = (string) $value;
+      $pattern[$weight] = "<input [^>]*value=\"$value\" [^>]*";
+    }
+
+    // Press 'add more' button -> 4 widgets
+    $this->drupalPost(NULL, $edit, t('Add another item'));
+    for ($delta = 0; $delta <= $delta_range; $delta++) {
+      $this->assertFieldByName("$this->field_name[$langcode][$delta][value]", $values[$delta], "Widget $delta is displayed and has the right value");
+      $this->assertFieldByName("$this->field_name[$langcode][$delta][_weight]", $weights[$delta], "Widget $delta has the right weight");
+    }
+    ksort($pattern);
+    $pattern = implode('.*', array_values($pattern));
+    $this->assertPattern("|$pattern|s", 'Widgets are displayed in the correct order');
+    $this->assertFieldByName("$this->field_name[$langcode][$delta][value]", '', "New widget is displayed");
+    $this->assertFieldByName("$this->field_name[$langcode][$delta][_weight]", $delta, "New widget has the right weight");
+    $this->assertNoField("$this->field_name[$langcode][" . ($delta + 1) . '][value]', 'No extraneous widget is displayed');
+
+    // Submit the form and create the entity.
+    $this->drupalPost(NULL, $edit, t('Save'));
+    preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);
+    $id = $match[1];
+    $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), 'Entity was created');
+    $entity = field_test_entity_test_load($id);
+    ksort($field_values);
+    $field_values = array_values($field_values);
+    $this->assertIdentical($entity->{$this->field_name}[$langcode], $field_values, 'Field values were saved in the correct order');
+
+    // Display edit form: check that the expected number of widgets is
+    // displayed, with correct values change values, reorder, leave an empty
+    // value in the middle.
+    // Submit: check that the entity is updated with correct values
+    // Re-submit: check that the field can be emptied.
+
+    // Test with several multiple fields in a form
+  }
+
+  /**
+   * Tests widget handling of multiple required radios.
+   */
+  function testFieldFormMultivalueWithRequiredRadio() {
+    // Create a multivalue test field.
+    $this->field = $this->field_unlimited;
+    $this->field_name = $this->field['field_name'];
+    $this->instance['field_name'] = $this->field_name;
+    field_create_field($this->field);
+    field_create_instance($this->instance);
+    $langcode = LANGUAGE_NONE;
+
+    // Add a required radio field.
+    field_create_field(array(
+      'field_name' => 'required_radio_test',
+      'type' => 'list_text',
+      'settings' => array(
+        'allowed_values' => array('yes' => 'yes', 'no' => 'no'),
+      ),
+    ));
+    field_create_instance(array(
+      'field_name' => 'required_radio_test',
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'required' => TRUE,
+      'widget' => array(
+        'type' => 'options_buttons',
+      ),
+    ));
+
+    // Display creation form.
+    $this->drupalGet('test-entity/add/test-bundle');
+
+    // Press the 'Add more' button.
+    $this->drupalPost(NULL, array(), t('Add another item'));
+
+    // Verify that no error is thrown by the radio element.
+    $this->assertNoFieldByXpath('//div[contains(@class, "error")]', FALSE, 'No error message is displayed.');
+
+    // Verify that the widget is added.
+    $this->assertFieldByName("{$this->field_name}[$langcode][0][value]", '', 'Widget 1 is displayed');
+    $this->assertFieldByName("{$this->field_name}[$langcode][1][value]", '', 'New widget is displayed');
+    $this->assertNoField("{$this->field_name}[$langcode][2][value]", 'No extraneous widget is displayed');
+  }
+
+  function testFieldFormJSAddMore() {
+    $this->field = $this->field_unlimited;
+    $this->field_name = $this->field['field_name'];
+    $this->instance['field_name'] = $this->field_name;
+    field_create_field($this->field);
+    field_create_instance($this->instance);
+    $langcode = LANGUAGE_NONE;
+
+    // Display creation form -> 1 widget.
+    $this->drupalGet('test-entity/add/test-bundle');
+
+    // Press 'add more' button a couple times -> 3 widgets.
+    // drupalPostAJAX() will not work iteratively, so we add those through
+    // non-JS submission.
+    $this->drupalPost(NULL, array(), t('Add another item'));
+    $this->drupalPost(NULL, array(), t('Add another item'));
+
+    // Prepare values and weights.
+    $count = 3;
+    $delta_range = $count - 1;
+    $values = $weights = $pattern = $expected_values = $edit = array();
+    for ($delta = 0; $delta <= $delta_range; $delta++) {
+      // Assign unique random values and weights.
+      do {
+        $value = mt_rand(1, 127);
+      } while (in_array($value, $values));
+      do {
+        $weight = mt_rand(-$delta_range, $delta_range);
+      } while (in_array($weight, $weights));
+      $edit["$this->field_name[$langcode][$delta][value]"] = $value;
+      $edit["$this->field_name[$langcode][$delta][_weight]"] = $weight;
+      // We'll need three slightly different formats to check the values.
+      $values[$delta] = $value;
+      $weights[$delta] = $weight;
+      $field_values[$weight]['value'] = (string) $value;
+      $pattern[$weight] = "<input [^>]*value=\"$value\" [^>]*";
+    }
+    // Press 'add more' button through Ajax, and place the expected HTML result
+    // as the tested content.
+    $commands = $this->drupalPostAJAX(NULL, $edit, $this->field_name . '_add_more');
+    $this->content = $commands[1]['data'];
+
+    for ($delta = 0; $delta <= $delta_range; $delta++) {
+      $this->assertFieldByName("$this->field_name[$langcode][$delta][value]", $values[$delta], "Widget $delta is displayed and has the right value");
+      $this->assertFieldByName("$this->field_name[$langcode][$delta][_weight]", $weights[$delta], "Widget $delta has the right weight");
+    }
+    ksort($pattern);
+    $pattern = implode('.*', array_values($pattern));
+    $this->assertPattern("|$pattern|s", 'Widgets are displayed in the correct order');
+    $this->assertFieldByName("$this->field_name[$langcode][$delta][value]", '', "New widget is displayed");
+    $this->assertFieldByName("$this->field_name[$langcode][$delta][_weight]", $delta, "New widget has the right weight");
+    $this->assertNoField("$this->field_name[$langcode][" . ($delta + 1) . '][value]', 'No extraneous widget is displayed');
+  }
+
+  /**
+   * Tests widgets handling multiple values.
+   */
+  function testFieldFormMultipleWidget() {
+    // Create a field with fixed cardinality and an instance using a multiple
+    // widget.
+    $this->field = $this->field_multiple;
+    $this->field_name = $this->field['field_name'];
+    $this->instance['field_name'] = $this->field_name;
+    $this->instance['widget']['type'] = 'test_field_widget_multiple';
+    field_create_field($this->field);
+    field_create_instance($this->instance);
+    $langcode = LANGUAGE_NONE;
+
+    // Display creation form.
+    $this->drupalGet('test-entity/add/test-bundle');
+    $this->assertFieldByName("{$this->field_name}[$langcode]", '', 'Widget is displayed.');
+
+    // Create entity with three values.
+    $edit = array("{$this->field_name}[$langcode]" => '1, 2, 3');
+    $this->drupalPost(NULL, $edit, t('Save'));
+    preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);
+    $id = $match[1];
+
+    // Check that the values were saved.
+    $entity_init = field_test_create_stub_entity($id);
+    $this->assertFieldValues($entity_init, $this->field_name, $langcode, array(1, 2, 3));
+
+    // Display the form, check that the values are correctly filled in.
+    $this->drupalGet('test-entity/manage/' . $id . '/edit');
+    $this->assertFieldByName("{$this->field_name}[$langcode]", '1, 2, 3', 'Widget is displayed.');
+
+    // Submit the form with more values than the field accepts.
+    $edit = array("{$this->field_name}[$langcode]" => '1, 2, 3, 4, 5');
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertRaw('this field cannot hold more than 4 values', 'Form validation failed.');
+    // Check that the field values were not submitted.
+    $this->assertFieldValues($entity_init, $this->field_name, $langcode, array(1, 2, 3));
+  }
+
+  /**
+   * Tests fields with no 'edit' access.
+   */
+  function testFieldFormAccess() {
+    // Create a "regular" field.
+    $field = $this->field_single;
+    $field_name = $field['field_name'];
+    $instance = $this->instance;
+    $instance['field_name'] = $field_name;
+    field_create_field($field);
+    field_create_instance($instance);
+
+    // Create a field with no edit access - see field_test_field_access().
+    $field_no_access = array(
+      'field_name' => 'field_no_edit_access',
+      'type' => 'test_field',
+    );
+    $field_name_no_access = $field_no_access['field_name'];
+    $instance_no_access = array(
+      'field_name' => $field_name_no_access,
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'default_value' => array(0 => array('value' => 99)),
+    );
+    field_create_field($field_no_access);
+    field_create_instance($instance_no_access);
+
+    $langcode = LANGUAGE_NONE;
+
+    // Test that the form structure includes full information for each delta
+    // apart from #access.
+    $entity_type = 'test_entity';
+    $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
+
+    $form = array();
+    $form_state = form_state_defaults();
+    field_attach_form($entity_type, $entity, $form, $form_state);
+
+    $this->assertEqual($form[$field_name_no_access][$langcode][0]['value']['#entity_type'], $entity_type, 'The correct entity type is set in the field structure.');
+    $this->assertFalse($form[$field_name_no_access]['#access'], 'Field #access is FALSE for the field without edit access.');
+
+    // Display creation form.
+    $this->drupalGet('test-entity/add/test-bundle');
+    $this->assertNoFieldByName("{$field_name_no_access}[$langcode][0][value]", '', 'Widget is not displayed if field access is denied.');
+
+    // Create entity.
+    $edit = array("{$field_name}[$langcode][0][value]" => 1);
+    $this->drupalPost(NULL, $edit, t('Save'));
+    preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);
+    $id = $match[1];
+
+    // Check that the default value was saved.
+    $entity = field_test_entity_test_load($id);
+    $this->assertEqual($entity->{$field_name_no_access}[$langcode][0]['value'], 99, 'Default value was saved for the field with no edit access.');
+    $this->assertEqual($entity->{$field_name}[$langcode][0]['value'], 1, 'Entered value vas saved for the field with edit access.');
+
+    // Create a new revision.
+    $edit = array("{$field_name}[$langcode][0][value]" => 2, 'revision' => TRUE);
+    $this->drupalPost('test-entity/manage/' . $id . '/edit', $edit, t('Save'));
+
+    // Check that the new revision has the expected values.
+    $entity = field_test_entity_test_load($id);
+    $this->assertEqual($entity->{$field_name_no_access}[$langcode][0]['value'], 99, 'New revision has the expected value for the field with no edit access.');
+    $this->assertEqual($entity->{$field_name}[$langcode][0]['value'], 2, 'New revision has the expected value for the field with edit access.');
+
+    // Check that the revision is also saved in the revisions table.
+    $entity = field_test_entity_test_load($id, $entity->ftvid);
+    $this->assertEqual($entity->{$field_name_no_access}[$langcode][0]['value'], 99, 'New revision has the expected value for the field with no edit access.');
+    $this->assertEqual($entity->{$field_name}[$langcode][0]['value'], 2, 'New revision has the expected value for the field with edit access.');
+  }
+
+  /**
+   * Tests Field API form integration within a subform.
+   */
+  function testNestedFieldForm() {
+    // Add two instances on the 'test_bundle'
+    field_create_field($this->field_single);
+    field_create_field($this->field_unlimited);
+    $this->instance['field_name'] = 'field_single';
+    $this->instance['label'] = 'Single field';
+    field_create_instance($this->instance);
+    $this->instance['field_name'] = 'field_unlimited';
+    $this->instance['label'] = 'Unlimited field';
+    field_create_instance($this->instance);
+
+    // Create two entities.
+    $entity_1 = field_test_create_stub_entity(1, 1);
+    $entity_1->is_new = TRUE;
+    $entity_1->field_single[LANGUAGE_NONE][] = array('value' => 0);
+    $entity_1->field_unlimited[LANGUAGE_NONE][] = array('value' => 1);
+    field_test_entity_save($entity_1);
+
+    $entity_2 = field_test_create_stub_entity(2, 2);
+    $entity_2->is_new = TRUE;
+    $entity_2->field_single[LANGUAGE_NONE][] = array('value' => 10);
+    $entity_2->field_unlimited[LANGUAGE_NONE][] = array('value' => 11);
+    field_test_entity_save($entity_2);
+
+    // Display the 'combined form'.
+    $this->drupalGet('test-entity/nested/1/2');
+    $this->assertFieldByName('field_single[und][0][value]', 0, 'Entity 1: field_single value appears correctly is the form.');
+    $this->assertFieldByName('field_unlimited[und][0][value]', 1, 'Entity 1: field_unlimited value 0 appears correctly is the form.');
+    $this->assertFieldByName('entity_2[field_single][und][0][value]', 10, 'Entity 2: field_single value appears correctly is the form.');
+    $this->assertFieldByName('entity_2[field_unlimited][und][0][value]', 11, 'Entity 2: field_unlimited value 0 appears correctly is the form.');
+
+    // Submit the form and check that the entities are updated accordingly.
+    $edit = array(
+      'field_single[und][0][value]' => 1,
+      'field_unlimited[und][0][value]' => 2,
+      'field_unlimited[und][1][value]' => 3,
+      'entity_2[field_single][und][0][value]' => 11,
+      'entity_2[field_unlimited][und][0][value]' => 12,
+      'entity_2[field_unlimited][und][1][value]' => 13,
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    field_cache_clear();
+    $entity_1 = field_test_create_stub_entity(1);
+    $entity_2 = field_test_create_stub_entity(2);
+    $this->assertFieldValues($entity_1, 'field_single', LANGUAGE_NONE, array(1));
+    $this->assertFieldValues($entity_1, 'field_unlimited', LANGUAGE_NONE, array(2, 3));
+    $this->assertFieldValues($entity_2, 'field_single', LANGUAGE_NONE, array(11));
+    $this->assertFieldValues($entity_2, 'field_unlimited', LANGUAGE_NONE, array(12, 13));
+
+    // Submit invalid values and check that errors are reported on the
+    // correct widgets.
+    $edit = array(
+      'field_unlimited[und][1][value]' => -1,
+    );
+    $this->drupalPost('test-entity/nested/1/2', $edit, t('Save'));
+    $this->assertRaw(t('%label does not accept the value -1', array('%label' => 'Unlimited field')), 'Entity 1: the field validation error was reported.');
+    $error_field = $this->xpath('//input[@id=:id and contains(@class, "error")]', array(':id' => 'edit-field-unlimited-und-1-value'));
+    $this->assertTrue($error_field, 'Entity 1: the error was flagged on the correct element.');
+    $edit = array(
+      'entity_2[field_unlimited][und][1][value]' => -1,
+    );
+    $this->drupalPost('test-entity/nested/1/2', $edit, t('Save'));
+    $this->assertRaw(t('%label does not accept the value -1', array('%label' => 'Unlimited field')), 'Entity 2: the field validation error was reported.');
+    $error_field = $this->xpath('//input[@id=:id and contains(@class, "error")]', array(':id' => 'edit-entity-2-field-unlimited-und-1-value'));
+    $this->assertTrue($error_field, 'Entity 2: the error was flagged on the correct element.');
+
+    // Test that reordering works on both entities.
+    $edit = array(
+      'field_unlimited[und][0][_weight]' => 0,
+      'field_unlimited[und][1][_weight]' => -1,
+      'entity_2[field_unlimited][und][0][_weight]' => 0,
+      'entity_2[field_unlimited][und][1][_weight]' => -1,
+    );
+    $this->drupalPost('test-entity/nested/1/2', $edit, t('Save'));
+    field_cache_clear();
+    $this->assertFieldValues($entity_1, 'field_unlimited', LANGUAGE_NONE, array(3, 2));
+    $this->assertFieldValues($entity_2, 'field_unlimited', LANGUAGE_NONE, array(13, 12));
+
+    // Test the 'add more' buttons. Only Ajax submission is tested, because
+    // the two 'add more' buttons present in the form have the same #value,
+    // which confuses drupalPost().
+    // 'Add more' button in the first entity:
+    $this->drupalGet('test-entity/nested/1/2');
+    $this->drupalPostAJAX(NULL, array(), 'field_unlimited_add_more');
+    $this->assertFieldByName('field_unlimited[und][0][value]', 3, 'Entity 1: field_unlimited value 0 appears correctly is the form.');
+    $this->assertFieldByName('field_unlimited[und][1][value]', 2, 'Entity 1: field_unlimited value 1 appears correctly is the form.');
+    $this->assertFieldByName('field_unlimited[und][2][value]', '', 'Entity 1: field_unlimited value 2 appears correctly is the form.');
+    $this->assertFieldByName('field_unlimited[und][3][value]', '', 'Entity 1: an empty widget was added for field_unlimited value 3.');
+    // 'Add more' button in the first entity (changing field values):
+    $edit = array(
+      'entity_2[field_unlimited][und][0][value]' => 13,
+      'entity_2[field_unlimited][und][1][value]' => 14,
+      'entity_2[field_unlimited][und][2][value]' => 15,
+    );
+    $this->drupalPostAJAX(NULL, $edit, 'entity_2_field_unlimited_add_more');
+    $this->assertFieldByName('entity_2[field_unlimited][und][0][value]', 13, 'Entity 2: field_unlimited value 0 appears correctly is the form.');
+    $this->assertFieldByName('entity_2[field_unlimited][und][1][value]', 14, 'Entity 2: field_unlimited value 1 appears correctly is the form.');
+    $this->assertFieldByName('entity_2[field_unlimited][und][2][value]', 15, 'Entity 2: field_unlimited value 2 appears correctly is the form.');
+    $this->assertFieldByName('entity_2[field_unlimited][und][3][value]', '', 'Entity 2: an empty widget was added for field_unlimited value 3.');
+    // Save the form and check values are saved correclty.
+    $this->drupalPost(NULL, array(), t('Save'));
+    field_cache_clear();
+    $this->assertFieldValues($entity_1, 'field_unlimited', LANGUAGE_NONE, array(3, 2));
+    $this->assertFieldValues($entity_2, 'field_unlimited', LANGUAGE_NONE, array(13, 14, 15));
+  }
+}
+
+class FieldDisplayAPITestCase extends FieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Field Display API tests',
+      'description' => 'Test the display API.',
+      'group' => 'Field API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('field_test');
+
+    // Create a field and instance.
+    $this->field_name = 'test_field';
+    $this->label = $this->randomName();
+    $this->cardinality = 4;
+
+    $this->field = array(
+      'field_name' => $this->field_name,
+      'type' => 'test_field',
+      'cardinality' => $this->cardinality,
+    );
+    $this->instance = array(
+      'field_name' => $this->field_name,
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'label' => $this->label,
+      'display' => array(
+        'default' => array(
+          'type' => 'field_test_default',
+          'settings' => array(
+            'test_formatter_setting' => $this->randomName(),
+          ),
+        ),
+        'teaser' => array(
+          'type' => 'field_test_default',
+          'settings' => array(
+            'test_formatter_setting' => $this->randomName(),
+          ),
+        ),
+      ),
+    );
+    field_create_field($this->field);
+    field_create_instance($this->instance);
+
+    // Create an entity with values.
+    $this->values = $this->_generateTestFieldValues($this->cardinality);
+    $this->entity = field_test_create_stub_entity();
+    $this->is_new = TRUE;
+    $this->entity->{$this->field_name}[LANGUAGE_NONE] = $this->values;
+    field_test_entity_save($this->entity);
+  }
+
+  /**
+   * Test the field_view_field() function.
+   */
+  function testFieldViewField() {
+    // No display settings: check that default display settings are used.
+    $output = field_view_field('test_entity', $this->entity, $this->field_name);
+    $this->drupalSetContent(drupal_render($output));
+    $settings = field_info_formatter_settings('field_test_default');
+    $setting = $settings['test_formatter_setting'];
+    $this->assertText($this->label, 'Label was displayed.');
+    foreach ($this->values as $delta => $value) {
+      $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', array('@delta' => $delta)));
+    }
+
+    // Check that explicit display settings are used.
+    $display = array(
+      'label' => 'hidden',
+      'type' => 'field_test_multiple',
+      'settings' => array(
+        'test_formatter_setting_multiple' => $this->randomName(),
+        'alter' => TRUE,
+      ),
+    );
+    $output = field_view_field('test_entity', $this->entity, $this->field_name, $display);
+    $this->drupalSetContent(drupal_render($output));
+    $setting = $display['settings']['test_formatter_setting_multiple'];
+    $this->assertNoText($this->label, 'Label was not displayed.');
+    $this->assertText('field_test_field_attach_view_alter', 'Alter fired, display passed.');
+    $array = array();
+    foreach ($this->values as $delta => $value) {
+      $array[] = $delta . ':' . $value['value'];
+    }
+    $this->assertText($setting . '|' . implode('|', $array), 'Values were displayed with expected setting.');
+
+    // Check the prepare_view steps are invoked.
+    $display = array(
+      'label' => 'hidden',
+      'type' => 'field_test_with_prepare_view',
+      'settings' => array(
+        'test_formatter_setting_additional' => $this->randomName(),
+      ),
+    );
+    $output = field_view_field('test_entity', $this->entity, $this->field_name, $display);
+    $view = drupal_render($output);
+    $this->drupalSetContent($view);
+    $setting = $display['settings']['test_formatter_setting_additional'];
+    $this->assertNoText($this->label, 'Label was not displayed.');
+    $this->assertNoText('field_test_field_attach_view_alter', 'Alter not fired.');
+    foreach ($this->values as $delta => $value) {
+      $this->assertText($setting . '|' . $value['value'] . '|' . ($value['value'] + 1), format_string('Value @delta was displayed with expected setting.', array('@delta' => $delta)));
+    }
+
+    // View mode: check that display settings specified in the instance are
+    // used.
+    $output = field_view_field('test_entity', $this->entity, $this->field_name, 'teaser');
+    $this->drupalSetContent(drupal_render($output));
+    $setting = $this->instance['display']['teaser']['settings']['test_formatter_setting'];
+    $this->assertText($this->label, 'Label was displayed.');
+    foreach ($this->values as $delta => $value) {
+      $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', array('@delta' => $delta)));
+    }
+
+    // Unknown view mode: check that display settings for 'default' view mode
+    // are used.
+    $output = field_view_field('test_entity', $this->entity, $this->field_name, 'unknown_view_mode');
+    $this->drupalSetContent(drupal_render($output));
+    $setting = $this->instance['display']['default']['settings']['test_formatter_setting'];
+    $this->assertText($this->label, 'Label was displayed.');
+    foreach ($this->values as $delta => $value) {
+      $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', array('@delta' => $delta)));
+    }
+  }
+
+  /**
+   * Test the field_view_value() function.
+   */
+  function testFieldViewValue() {
+    // No display settings: check that default display settings are used.
+    $settings = field_info_formatter_settings('field_test_default');
+    $setting = $settings['test_formatter_setting'];
+    foreach ($this->values as $delta => $value) {
+      $item = $this->entity->{$this->field_name}[LANGUAGE_NONE][$delta];
+      $output = field_view_value('test_entity', $this->entity, $this->field_name, $item);
+      $this->drupalSetContent(drupal_render($output));
+      $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', array('@delta' => $delta)));
+    }
+
+    // Check that explicit display settings are used.
+    $display = array(
+      'type' => 'field_test_multiple',
+      'settings' => array(
+        'test_formatter_setting_multiple' => $this->randomName(),
+      ),
+    );
+    $setting = $display['settings']['test_formatter_setting_multiple'];
+    $array = array();
+    foreach ($this->values as $delta => $value) {
+      $item = $this->entity->{$this->field_name}[LANGUAGE_NONE][$delta];
+      $output = field_view_value('test_entity', $this->entity, $this->field_name, $item, $display);
+      $this->drupalSetContent(drupal_render($output));
+      $this->assertText($setting . '|0:' . $value['value'], format_string('Value @delta was displayed with expected setting.', array('@delta' => $delta)));
+    }
+
+    // Check that prepare_view steps are invoked.
+    $display = array(
+      'type' => 'field_test_with_prepare_view',
+      'settings' => array(
+        'test_formatter_setting_additional' => $this->randomName(),
+      ),
+    );
+    $setting = $display['settings']['test_formatter_setting_additional'];
+    $array = array();
+    foreach ($this->values as $delta => $value) {
+      $item = $this->entity->{$this->field_name}[LANGUAGE_NONE][$delta];
+      $output = field_view_value('test_entity', $this->entity, $this->field_name, $item, $display);
+      $this->drupalSetContent(drupal_render($output));
+      $this->assertText($setting . '|' . $value['value'] . '|' . ($value['value'] + 1), format_string('Value @delta was displayed with expected setting.', array('@delta' => $delta)));
+    }
+
+    // View mode: check that display settings specified in the instance are
+    // used.
+    $setting = $this->instance['display']['teaser']['settings']['test_formatter_setting'];
+    foreach ($this->values as $delta => $value) {
+      $item = $this->entity->{$this->field_name}[LANGUAGE_NONE][$delta];
+      $output = field_view_value('test_entity', $this->entity, $this->field_name, $item, 'teaser');
+      $this->drupalSetContent(drupal_render($output));
+      $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', array('@delta' => $delta)));
+    }
+
+    // Unknown view mode: check that display settings for 'default' view mode
+    // are used.
+    $setting = $this->instance['display']['default']['settings']['test_formatter_setting'];
+    foreach ($this->values as $delta => $value) {
+      $item = $this->entity->{$this->field_name}[LANGUAGE_NONE][$delta];
+      $output = field_view_value('test_entity', $this->entity, $this->field_name, $item, 'unknown_view_mode');
+      $this->drupalSetContent(drupal_render($output));
+      $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', array('@delta' => $delta)));
+    }
+  }
+}
+
+class FieldCrudTestCase extends FieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Field CRUD tests',
+      'description' => 'Test field create, read, update, and delete.',
+      'group' => 'Field API',
+    );
+  }
+
+  function setUp() {
+    // field_update_field() tests use number.module
+    parent::setUp('field_test', 'number');
+  }
+
+  // TODO : test creation with
+  // - a full fledged $field structure, check that all the values are there
+  // - a minimal $field structure, check all default values are set
+  // defer actual $field comparison to a helper function, used for the two cases above
+
+  /**
+   * Test the creation of a field.
+   */
+  function testCreateField() {
+    $field_definition = array(
+      'field_name' => 'field_2',
+      'type' => 'test_field',
+    );
+    field_test_memorize();
+    $field_definition = field_create_field($field_definition);
+    $mem = field_test_memorize();
+    $this->assertIdentical($mem['field_test_field_create_field'][0][0], $field_definition, 'hook_field_create_field() called with correct arguments.');
+
+    // Read the raw record from the {field_config_instance} table.
+    $result = db_query('SELECT * FROM {field_config} WHERE field_name = :field_name', array(':field_name' => $field_definition['field_name']));
+    $record = $result->fetchAssoc();
+    $record['data'] = unserialize($record['data']);
+
+    // Ensure that basic properties are preserved.
+    $this->assertEqual($record['field_name'], $field_definition['field_name'], 'The field name is properly saved.');
+    $this->assertEqual($record['type'], $field_definition['type'], 'The field type is properly saved.');
+
+    // Ensure that cardinality defaults to 1.
+    $this->assertEqual($record['cardinality'], 1, 'Cardinality defaults to 1.');
+
+    // Ensure that default settings are present.
+    $field_type = field_info_field_types($field_definition['type']);
+    $this->assertIdentical($record['data']['settings'], $field_type['settings'], 'Default field settings have been written.');
+
+    // Ensure that default storage was set.
+    $this->assertEqual($record['storage_type'], variable_get('field_storage_default'), 'The field type is properly saved.');
+
+    // Guarantee that the name is unique.
+    try {
+      field_create_field($field_definition);
+      $this->fail(t('Cannot create two fields with the same name.'));
+    }
+    catch (FieldException $e) {
+      $this->pass(t('Cannot create two fields with the same name.'));
+    }
+
+    // Check that field type is required.
+    try {
+      $field_definition = array(
+        'field_name' => 'field_1',
+      );
+      field_create_field($field_definition);
+      $this->fail(t('Cannot create a field with no type.'));
+    }
+    catch (FieldException $e) {
+      $this->pass(t('Cannot create a field with no type.'));
+    }
+
+    // Check that field name is required.
+    try {
+      $field_definition = array(
+        'type' => 'test_field'
+      );
+      field_create_field($field_definition);
+      $this->fail(t('Cannot create an unnamed field.'));
+    }
+    catch (FieldException $e) {
+      $this->pass(t('Cannot create an unnamed field.'));
+    }
+
+    // Check that field name must start with a letter or _.
+    try {
+      $field_definition = array(
+        'field_name' => '2field_2',
+        'type' => 'test_field',
+      );
+      field_create_field($field_definition);
+      $this->fail(t('Cannot create a field with a name starting with a digit.'));
+    }
+    catch (FieldException $e) {
+      $this->pass(t('Cannot create a field with a name starting with a digit.'));
+    }
+
+    // Check that field name must only contain lowercase alphanumeric or _.
+    try {
+      $field_definition = array(
+        'field_name' => 'field#_3',
+        'type' => 'test_field',
+      );
+      field_create_field($field_definition);
+      $this->fail(t('Cannot create a field with a name containing an illegal character.'));
+    }
+    catch (FieldException $e) {
+      $this->pass(t('Cannot create a field with a name containing an illegal character.'));
+    }
+
+    // Check that field name cannot be longer than 32 characters long.
+    try {
+      $field_definition = array(
+        'field_name' => '_12345678901234567890123456789012',
+        'type' => 'test_field',
+      );
+      field_create_field($field_definition);
+      $this->fail(t('Cannot create a field with a name longer than 32 characters.'));
+    }
+    catch (FieldException $e) {
+      $this->pass(t('Cannot create a field with a name longer than 32 characters.'));
+    }
+
+    // Check that field name can not be an entity key.
+    // "ftvid" is known as an entity key from the "test_entity" type.
+    try {
+      $field_definition = array(
+        'type' => 'test_field',
+        'field_name' => 'ftvid',
+      );
+      $field = field_create_field($field_definition);
+      $this->fail(t('Cannot create a field bearing the name of an entity key.'));
+    }
+    catch (FieldException $e) {
+      $this->pass(t('Cannot create a field bearing the name of an entity key.'));
+    }
+  }
+
+  /**
+   * Test failure to create a field.
+   */
+  function testCreateFieldFail() {
+    $field_name = 'duplicate';
+    $field_definition = array('field_name' => $field_name, 'type' => 'test_field', 'storage' => array('type' => 'field_test_storage_failure'));
+    $query = db_select('field_config')->condition('field_name', $field_name)->countQuery();
+
+    // The field does not appear in field_config.
+    $count = $query->execute()->fetchField();
+    $this->assertEqual($count, 0, 'A field_config row for the field does not exist.');
+
+    // Try to create the field.
+    try {
+      $field = field_create_field($field_definition);
+      $this->assertTrue(FALSE, 'Field creation (correctly) fails.');
+    }
+    catch (Exception $e) {
+      $this->assertTrue(TRUE, 'Field creation (correctly) fails.');
+    }
+
+    // The field does not appear in field_config.
+    $count = $query->execute()->fetchField();
+    $this->assertEqual($count, 0, 'A field_config row for the field does not exist.');
+  }
+
+  /**
+   * Test reading back a field definition.
+   */
+  function testReadField() {
+    $field_definition = array(
+      'field_name' => 'field_1',
+      'type' => 'test_field',
+    );
+    field_create_field($field_definition);
+
+    // Read the field back.
+    $field = field_read_field($field_definition['field_name']);
+    $this->assertTrue($field_definition < $field, 'The field was properly read.');
+  }
+
+  /**
+   * Tests reading field definitions.
+   */
+  function testReadFields() {
+    $field_definition = array(
+      'field_name' => 'field_1',
+      'type' => 'test_field',
+    );
+    field_create_field($field_definition);
+
+    // Check that 'single column' criteria works.
+    $fields = field_read_fields(array('field_name' => $field_definition['field_name']));
+    $this->assertTrue(count($fields) == 1 && isset($fields[$field_definition['field_name']]), 'The field was properly read.');
+
+    // Check that 'multi column' criteria works.
+    $fields = field_read_fields(array('field_name' => $field_definition['field_name'], 'type' => $field_definition['type']));
+    $this->assertTrue(count($fields) == 1 && isset($fields[$field_definition['field_name']]), 'The field was properly read.');
+    $fields = field_read_fields(array('field_name' => $field_definition['field_name'], 'type' => 'foo'));
+    $this->assertTrue(empty($fields), 'No field was found.');
+
+    // Create an instance of the field.
+    $instance_definition = array(
+      'field_name' => $field_definition['field_name'],
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+    );
+    field_create_instance($instance_definition);
+
+    // Check that criteria spanning over the field_config_instance table work.
+    $fields = field_read_fields(array('entity_type' => $instance_definition['entity_type'], 'bundle' => $instance_definition['bundle']));
+    $this->assertTrue(count($fields) == 1 && isset($fields[$field_definition['field_name']]), 'The field was properly read.');
+    $fields = field_read_fields(array('entity_type' => $instance_definition['entity_type'], 'field_name' => $instance_definition['field_name']));
+    $this->assertTrue(count($fields) == 1 && isset($fields[$field_definition['field_name']]), 'The field was properly read.');
+  }
+
+  /**
+   * Test creation of indexes on data column.
+   */
+  function testFieldIndexes() {
+    // Check that indexes specified by the field type are used by default.
+    $field_definition = array(
+      'field_name' => 'field_1',
+      'type' => 'test_field',
+    );
+    field_create_field($field_definition);
+    $field = field_read_field($field_definition['field_name']);
+    $expected_indexes = array('value' => array('value'));
+    $this->assertEqual($field['indexes'], $expected_indexes, 'Field type indexes saved by default');
+
+    // Check that indexes specified by the field definition override the field
+    // type indexes.
+    $field_definition = array(
+      'field_name' => 'field_2',
+      'type' => 'test_field',
+      'indexes' => array(
+        'value' => array(),
+      ),
+    );
+    field_create_field($field_definition);
+    $field = field_read_field($field_definition['field_name']);
+    $expected_indexes = array('value' => array());
+    $this->assertEqual($field['indexes'], $expected_indexes, 'Field definition indexes override field type indexes');
+
+    // Check that indexes specified by the field definition add to the field
+    // type indexes.
+    $field_definition = array(
+      'field_name' => 'field_3',
+      'type' => 'test_field',
+      'indexes' => array(
+        'value_2' => array('value'),
+      ),
+    );
+    field_create_field($field_definition);
+    $field = field_read_field($field_definition['field_name']);
+    $expected_indexes = array('value' => array('value'), 'value_2' => array('value'));
+    $this->assertEqual($field['indexes'], $expected_indexes, 'Field definition indexes are merged with field type indexes');
+  }
+
+  /**
+   * Test the deletion of a field.
+   */
+  function testDeleteField() {
+    // TODO: Also test deletion of the data stored in the field ?
+
+    // Create two fields (so we can test that only one is deleted).
+    $this->field = array('field_name' => 'field_1', 'type' => 'test_field');
+    field_create_field($this->field);
+    $this->another_field = array('field_name' => 'field_2', 'type' => 'test_field');
+    field_create_field($this->another_field);
+
+    // Create instances for each.
+    $this->instance_definition = array(
+      'field_name' => $this->field['field_name'],
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'widget' => array(
+        'type' => 'test_field_widget',
+      ),
+    );
+    field_create_instance($this->instance_definition);
+    $this->another_instance_definition = $this->instance_definition;
+    $this->another_instance_definition['field_name'] = $this->another_field['field_name'];
+    field_create_instance($this->another_instance_definition);
+
+    // Test that the first field is not deleted, and then delete it.
+    $field = field_read_field($this->field['field_name'], array('include_deleted' => TRUE));
+    $this->assertTrue(!empty($field) && empty($field['deleted']), 'A new field is not marked for deletion.');
+    field_delete_field($this->field['field_name']);
+
+    // Make sure that the field is marked as deleted when it is specifically
+    // loaded.
+    $field = field_read_field($this->field['field_name'], array('include_deleted' => TRUE));
+    $this->assertTrue(!empty($field['deleted']), 'A deleted field is marked for deletion.');
+
+    // Make sure that this field's instance is marked as deleted when it is
+    // specifically loaded.
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle'], array('include_deleted' => TRUE));
+    $this->assertTrue(!empty($instance['deleted']), 'An instance for a deleted field is marked for deletion.');
+
+    // Try to load the field normally and make sure it does not show up.
+    $field = field_read_field($this->field['field_name']);
+    $this->assertTrue(empty($field), 'A deleted field is not loaded by default.');
+
+    // Try to load the instance normally and make sure it does not show up.
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $this->assertTrue(empty($instance), 'An instance for a deleted field is not loaded by default.');
+
+    // Make sure the other field (and its field instance) are not deleted.
+    $another_field = field_read_field($this->another_field['field_name']);
+    $this->assertTrue(!empty($another_field) && empty($another_field['deleted']), 'A non-deleted field is not marked for deletion.');
+    $another_instance = field_read_instance('test_entity', $this->another_instance_definition['field_name'], $this->another_instance_definition['bundle']);
+    $this->assertTrue(!empty($another_instance) && empty($another_instance['deleted']), 'An instance of a non-deleted field is not marked for deletion.');
+
+    // Try to create a new field the same name as a deleted field and
+    // write data into it.
+    field_create_field($this->field);
+    field_create_instance($this->instance_definition);
+    $field = field_read_field($this->field['field_name']);
+    $this->assertTrue(!empty($field) && empty($field['deleted']), 'A new field with a previously used name is created.');
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $this->assertTrue(!empty($instance) && empty($instance['deleted']), 'A new instance for a previously used field name is created.');
+
+    // Save an entity with data for the field
+    $entity = field_test_create_stub_entity(0, 0, $instance['bundle']);
+    $langcode = LANGUAGE_NONE;
+    $values[0]['value'] = mt_rand(1, 127);
+    $entity->{$field['field_name']}[$langcode] = $values;
+    $entity_type = 'test_entity';
+    field_attach_insert('test_entity', $entity);
+
+    // Verify the field is present on load
+    $entity = field_test_create_stub_entity(0, 0, $this->instance_definition['bundle']);
+    field_attach_load($entity_type, array(0 => $entity));
+    $this->assertIdentical(count($entity->{$field['field_name']}[$langcode]), count($values), "Data in previously deleted field saves and loads correctly");
+    foreach ($values as $delta => $value) {
+      $this->assertEqual($entity->{$field['field_name']}[$langcode][$delta]['value'], $values[$delta]['value'], "Data in previously deleted field saves and loads correctly");
+    }
+  }
+
+  function testUpdateNonExistentField() {
+    $test_field = array('field_name' => 'does_not_exist', 'type' => 'number_decimal');
+    try {
+      field_update_field($test_field);
+      $this->fail(t('Cannot update a field that does not exist.'));
+    }
+    catch (FieldException $e) {
+      $this->pass(t('Cannot update a field that does not exist.'));
+    }
+  }
+
+  function testUpdateFieldType() {
+    $field = array('field_name' => 'field_type', 'type' => 'number_decimal');
+    $field = field_create_field($field);
+
+    $test_field = array('field_name' => 'field_type', 'type' => 'number_integer');
+    try {
+      field_update_field($test_field);
+      $this->fail(t('Cannot update a field to a different type.'));
+    }
+    catch (FieldException $e) {
+      $this->pass(t('Cannot update a field to a different type.'));
+    }
+  }
+
+  /**
+   * Test updating a field.
+   */
+  function testUpdateField() {
+    // Create a field with a defined cardinality, so that we can ensure it's
+    // respected. Since cardinality enforcement is consistent across database
+    // systems, it makes a good test case.
+    $cardinality = 4;
+    $field_definition = array(
+      'field_name' => 'field_update',
+      'type' => 'test_field',
+      'cardinality' => $cardinality,
+    );
+    $field_definition = field_create_field($field_definition);
+    $instance = array(
+      'field_name' => 'field_update',
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+    );
+    $instance = field_create_instance($instance);
+
+    do {
+      // We need a unique ID for our entity. $cardinality will do.
+      $id = $cardinality;
+      $entity = field_test_create_stub_entity($id, $id, $instance['bundle']);
+      // Fill in the entity with more values than $cardinality.
+      for ($i = 0; $i < 20; $i++) {
+        $entity->field_update[LANGUAGE_NONE][$i]['value'] = $i;
+      }
+      // Save the entity.
+      field_attach_insert('test_entity', $entity);
+      // Load back and assert there are $cardinality number of values.
+      $entity = field_test_create_stub_entity($id, $id, $instance['bundle']);
+      field_attach_load('test_entity', array($id => $entity));
+      $this->assertEqual(count($entity->field_update[LANGUAGE_NONE]), $field_definition['cardinality'], 'Cardinality is kept');
+      // Now check the values themselves.
+      for ($delta = 0; $delta < $cardinality; $delta++) {
+        $this->assertEqual($entity->field_update[LANGUAGE_NONE][$delta]['value'], $delta, 'Value is kept');
+      }
+      // Increase $cardinality and set the field cardinality to the new value.
+      $field_definition['cardinality'] = ++$cardinality;
+      field_update_field($field_definition);
+    } while ($cardinality < 6);
+  }
+
+  /**
+   * Test field type modules forbidding an update.
+   */
+  function testUpdateFieldForbid() {
+    $field = array('field_name' => 'forbidden', 'type' => 'test_field', 'settings' => array('changeable' => 0, 'unchangeable' => 0));
+    $field = field_create_field($field);
+    $field['settings']['changeable']++;
+    try {
+      field_update_field($field);
+      $this->pass(t("A changeable setting can be updated."));
+    }
+    catch (FieldException $e) {
+      $this->fail(t("An unchangeable setting cannot be updated."));
+    }
+    $field['settings']['unchangeable']++;
+    try {
+      field_update_field($field);
+      $this->fail(t("An unchangeable setting can be updated."));
+    }
+    catch (FieldException $e) {
+      $this->pass(t("An unchangeable setting cannot be updated."));
+    }
+  }
+
+  /**
+   * Test that fields are properly marked active or inactive.
+   */
+  function testActive() {
+    $field_definition = array(
+      'field_name' => 'field_1',
+      'type' => 'test_field',
+      // For this test, we need a storage backend provided by a different
+      // module than field_test.module.
+      'storage' => array(
+        'type' => 'field_sql_storage',
+      ),
+    );
+    field_create_field($field_definition);
+
+    // Test disabling and enabling:
+    // - the field type module,
+    // - the storage module,
+    // - both.
+    $this->_testActiveHelper($field_definition, array('field_test'));
+    $this->_testActiveHelper($field_definition, array('field_sql_storage'));
+    $this->_testActiveHelper($field_definition, array('field_test', 'field_sql_storage'));
+  }
+
+  /**
+   * Helper function for testActive().
+   *
+   * Test dependency between a field and a set of modules.
+   *
+   * @param $field_definition
+   *   A field definition.
+   * @param $modules
+   *   An aray of module names. The field will be tested to be inactive as long
+   *   as any of those modules is disabled.
+   */
+  function _testActiveHelper($field_definition, $modules) {
+    $field_name = $field_definition['field_name'];
+
+    // Read the field.
+    $field = field_read_field($field_name);
+    $this->assertTrue($field_definition <= $field, 'The field was properly read.');
+
+    module_disable($modules, FALSE);
+
+    $fields = field_read_fields(array('field_name' => $field_name), array('include_inactive' => TRUE));
+    $this->assertTrue(isset($fields[$field_name]) && $field_definition < $field, 'The field is properly read when explicitly fetching inactive fields.');
+
+    // Re-enable modules one by one, and check that the field is still inactive
+    // while some modules remain disabled.
+    while ($modules) {
+      $field = field_read_field($field_name);
+      $this->assertTrue(empty($field), format_string('%modules disabled. The field is marked inactive.', array('%modules' => implode(', ', $modules))));
+
+      $module = array_shift($modules);
+      module_enable(array($module), FALSE);
+    }
+
+    // Check that the field is active again after all modules have been
+    // enabled.
+    $field = field_read_field($field_name);
+    $this->assertTrue($field_definition <= $field, 'The field was was marked active.');
+  }
+}
+
+class FieldInstanceCrudTestCase extends FieldTestCase {
+  protected $field;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Field instance CRUD tests',
+      'description' => 'Create field entities by attaching fields to entities.',
+      'group' => 'Field API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('field_test');
+
+    $this->field = array(
+      'field_name' => drupal_strtolower($this->randomName()),
+      'type' => 'test_field',
+    );
+    field_create_field($this->field);
+    $this->instance_definition = array(
+      'field_name' => $this->field['field_name'],
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+    );
+  }
+
+  // TODO : test creation with
+  // - a full fledged $instance structure, check that all the values are there
+  // - a minimal $instance structure, check all default values are set
+  // defer actual $instance comparison to a helper function, used for the two cases above,
+  // and for testUpdateFieldInstance
+
+  /**
+   * Test the creation of a field instance.
+   */
+  function testCreateFieldInstance() {
+    field_create_instance($this->instance_definition);
+
+    // Read the raw record from the {field_config_instance} table.
+    $result = db_query('SELECT * FROM {field_config_instance} WHERE field_name = :field_name AND bundle = :bundle', array(':field_name' => $this->instance_definition['field_name'], ':bundle' => $this->instance_definition['bundle']));
+    $record = $result->fetchAssoc();
+    $record['data'] = unserialize($record['data']);
+
+    $field_type = field_info_field_types($this->field['type']);
+    $widget_type = field_info_widget_types($field_type['default_widget']);
+    $formatter_type = field_info_formatter_types($field_type['default_formatter']);
+
+    // Check that default values are set.
+    $this->assertIdentical($record['data']['required'], FALSE, 'Required defaults to false.');
+    $this->assertIdentical($record['data']['label'], $this->instance_definition['field_name'], 'Label defaults to field name.');
+    $this->assertIdentical($record['data']['description'], '', 'Description defaults to empty string.');
+    $this->assertIdentical($record['data']['widget']['type'], $field_type['default_widget'], 'Default widget has been written.');
+    $this->assertTrue(isset($record['data']['display']['default']), 'Display for "full" view_mode has been written.');
+    $this->assertIdentical($record['data']['display']['default']['type'], $field_type['default_formatter'], 'Default formatter for "full" view_mode has been written.');
+
+    // Check that default settings are set.
+    $this->assertIdentical($record['data']['settings'], $field_type['instance_settings'] , 'Default instance settings have been written.');
+    $this->assertIdentical($record['data']['widget']['settings'], $widget_type['settings'] , 'Default widget settings have been written.');
+    $this->assertIdentical($record['data']['display']['default']['settings'], $formatter_type['settings'], 'Default formatter settings for "full" view_mode have been written.');
+
+    // Guarantee that the field/bundle combination is unique.
+    try {
+      field_create_instance($this->instance_definition);
+      $this->fail(t('Cannot create two instances with the same field / bundle combination.'));
+    }
+    catch (FieldException $e) {
+      $this->pass(t('Cannot create two instances with the same field / bundle combination.'));
+    }
+
+    // Check that the specified field exists.
+    try {
+      $this->instance_definition['field_name'] = $this->randomName();
+      field_create_instance($this->instance_definition);
+      $this->fail(t('Cannot create an instance of a non-existing field.'));
+    }
+    catch (FieldException $e) {
+      $this->pass(t('Cannot create an instance of a non-existing field.'));
+    }
+
+    // Create a field restricted to a specific entity type.
+    $field_restricted = array(
+      'field_name' => drupal_strtolower($this->randomName()),
+      'type' => 'test_field',
+      'entity_types' => array('test_cacheable_entity'),
+    );
+    field_create_field($field_restricted);
+
+    // Check that an instance can be added to an entity type allowed
+    // by the field.
+    try {
+      $instance = $this->instance_definition;
+      $instance['field_name'] = $field_restricted['field_name'];
+      $instance['entity_type'] = 'test_cacheable_entity';
+      field_create_instance($instance);
+      $this->pass(t('Can create an instance on an entity type allowed by the field.'));
+    }
+    catch (FieldException $e) {
+      $this->fail(t('Can create an instance on an entity type allowed by the field.'));
+    }
+
+    // Check that an instance cannot be added to an entity type
+    // forbidden by the field.
+    try {
+      $instance = $this->instance_definition;
+      $instance['field_name'] = $field_restricted['field_name'];
+      field_create_instance($instance);
+      $this->fail(t('Cannot create an instance on an entity type forbidden by the field.'));
+    }
+    catch (FieldException $e) {
+      $this->pass(t('Cannot create an instance on an entity type forbidden by the field.'));
+    }
+
+    // TODO: test other failures.
+  }
+
+  /**
+   * Test reading back an instance definition.
+   */
+  function testReadFieldInstance() {
+    field_create_instance($this->instance_definition);
+
+    // Read the instance back.
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $this->assertTrue($this->instance_definition < $instance, 'The field was properly read.');
+  }
+
+  /**
+   * Test the update of a field instance.
+   */
+  function testUpdateFieldInstance() {
+    field_create_instance($this->instance_definition);
+    $field_type = field_info_field_types($this->field['type']);
+
+    // Check that basic changes are saved.
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $instance['required'] = !$instance['required'];
+    $instance['label'] = $this->randomName();
+    $instance['description'] = $this->randomName();
+    $instance['settings']['test_instance_setting'] = $this->randomName();
+    $instance['widget']['settings']['test_widget_setting'] =$this->randomName();
+    $instance['widget']['weight']++;
+    $instance['display']['default']['settings']['test_formatter_setting'] = $this->randomName();
+    $instance['display']['default']['weight']++;
+    field_update_instance($instance);
+
+    $instance_new = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $this->assertEqual($instance['required'], $instance_new['required'], '"required" change is saved');
+    $this->assertEqual($instance['label'], $instance_new['label'], '"label" change is saved');
+    $this->assertEqual($instance['description'], $instance_new['description'], '"description" change is saved');
+    $this->assertEqual($instance['widget']['settings']['test_widget_setting'], $instance_new['widget']['settings']['test_widget_setting'], 'Widget setting change is saved');
+    $this->assertEqual($instance['widget']['weight'], $instance_new['widget']['weight'], 'Widget weight change is saved');
+    $this->assertEqual($instance['display']['default']['settings']['test_formatter_setting'], $instance_new['display']['default']['settings']['test_formatter_setting'], 'Formatter setting change is saved');
+    $this->assertEqual($instance['display']['default']['weight'], $instance_new['display']['default']['weight'], 'Widget weight change is saved');
+
+    // Check that changing widget and formatter types updates the default settings.
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $instance['widget']['type'] = 'test_field_widget_multiple';
+    $instance['display']['default']['type'] = 'field_test_multiple';
+    field_update_instance($instance);
+
+    $instance_new = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $this->assertEqual($instance['widget']['type'], $instance_new['widget']['type'] , 'Widget type change is saved.');
+    $settings = field_info_widget_settings($instance_new['widget']['type']);
+    $this->assertIdentical($settings, array_intersect_key($instance_new['widget']['settings'], $settings) , 'Widget type change updates default settings.');
+    $this->assertEqual($instance['display']['default']['type'], $instance_new['display']['default']['type'] , 'Formatter type change is saved.');
+    $info = field_info_formatter_types($instance_new['display']['default']['type']);
+    $settings = $info['settings'];
+    $this->assertIdentical($settings, array_intersect_key($instance_new['display']['default']['settings'], $settings) , 'Changing formatter type updates default settings.');
+
+    // Check that adding a new view mode is saved and gets default settings.
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $instance['display']['teaser'] = array();
+    field_update_instance($instance);
+
+    $instance_new = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $this->assertTrue(isset($instance_new['display']['teaser']), 'Display for the new view_mode has been written.');
+    $this->assertIdentical($instance_new['display']['teaser']['type'], $field_type['default_formatter'], 'Default formatter for the new view_mode has been written.');
+    $info = field_info_formatter_types($instance_new['display']['teaser']['type']);
+    $settings = $info['settings'];
+    $this->assertIdentical($settings, $instance_new['display']['teaser']['settings'] , 'Default formatter settings for the new view_mode have been written.');
+
+    // TODO: test failures.
+  }
+
+  /**
+   * Test the deletion of a field instance.
+   */
+  function testDeleteFieldInstance() {
+    // TODO: Test deletion of the data stored in the field also.
+    // Need to check that data for a 'deleted' field / instance doesn't get loaded
+    // Need to check data marked deleted is cleaned on cron (not implemented yet...)
+
+    // Create two instances for the same field so we can test that only one
+    // is deleted.
+    field_create_instance($this->instance_definition);
+    $this->another_instance_definition = $this->instance_definition;
+    $this->another_instance_definition['bundle'] .= '_another_bundle';
+    $instance = field_create_instance($this->another_instance_definition);
+
+    // Test that the first instance is not deleted, and then delete it.
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle'], array('include_deleted' => TRUE));
+    $this->assertTrue(!empty($instance) && empty($instance['deleted']), 'A new field instance is not marked for deletion.');
+    field_delete_instance($instance);
+
+    // Make sure the instance is marked as deleted when the instance is
+    // specifically loaded.
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle'], array('include_deleted' => TRUE));
+    $this->assertTrue(!empty($instance['deleted']), 'A deleted field instance is marked for deletion.');
+
+    // Try to load the instance normally and make sure it does not show up.
+    $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']);
+    $this->assertTrue(empty($instance), 'A deleted field instance is not loaded by default.');
+
+    // Make sure the other field instance is not deleted.
+    $another_instance = field_read_instance('test_entity', $this->another_instance_definition['field_name'], $this->another_instance_definition['bundle']);
+    $this->assertTrue(!empty($another_instance) && empty($another_instance['deleted']), 'A non-deleted field instance is not marked for deletion.');
+
+    // Make sure the field is deleted when its last instance is deleted.
+    field_delete_instance($another_instance);
+    $field = field_read_field($another_instance['field_name'], array('include_deleted' => TRUE));
+    $this->assertTrue(!empty($field['deleted']), 'A deleted field is marked for deletion after all its instances have been marked for deletion.');
+  }
+}
+
+/**
+ * Unit test class for the multilanguage fields logic.
+ *
+ * The following tests will check the multilanguage logic of _field_invoke() and
+ * that only the correct values are returned by field_available_languages().
+ */
+class FieldTranslationsTestCase extends FieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Field translations tests',
+      'description' => 'Test multilanguage fields logic.',
+      'group' => 'Field API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale', 'field_test');
+
+    $this->field_name = drupal_strtolower($this->randomName() . '_field_name');
+
+    $this->entity_type = 'test_entity';
+
+    $field = array(
+      'field_name' => $this->field_name,
+      'type' => 'test_field',
+      'cardinality' => 4,
+      'translatable' => TRUE,
+    );
+    field_create_field($field);
+    $this->field = field_read_field($this->field_name);
+
+    $instance = array(
+      'field_name' => $this->field_name,
+      'entity_type' => $this->entity_type,
+      'bundle' => 'test_bundle',
+    );
+    field_create_instance($instance);
+    $this->instance = field_read_instance('test_entity', $this->field_name, 'test_bundle');
+
+    require_once DRUPAL_ROOT . '/includes/locale.inc';
+    for ($i = 0; $i < 3; ++$i) {
+      locale_add_language('l' . $i, $this->randomString(), $this->randomString());
+    }
+  }
+
+  /**
+   * Ensures that only valid values are returned by field_available_languages().
+   */
+  function testFieldAvailableLanguages() {
+    // Test 'translatable' fieldable info.
+    field_test_entity_info_translatable('test_entity', FALSE);
+    $field = $this->field;
+    $field['field_name'] .= '_untranslatable';
+
+    // Enable field translations for the entity.
+    field_test_entity_info_translatable('test_entity', TRUE);
+
+    // Test hook_field_languages() invocation on a translatable field.
+    variable_set('field_test_field_available_languages_alter', TRUE);
+    $enabled_languages = field_content_languages();
+    $available_languages = field_available_languages($this->entity_type, $this->field);
+    foreach ($available_languages as $delta => $langcode) {
+      if ($langcode != 'xx' && $langcode != 'en') {
+        $this->assertTrue(in_array($langcode, $enabled_languages), format_string('%language is an enabled language.', array('%language' => $langcode)));
+      }
+    }
+    $this->assertTrue(in_array('xx', $available_languages), format_string('%language was made available.', array('%language' => 'xx')));
+    $this->assertFalse(in_array('en', $available_languages), format_string('%language was made unavailable.', array('%language' => 'en')));
+
+    // Test field_available_languages() behavior for untranslatable fields.
+    $this->field['translatable'] = FALSE;
+    field_update_field($this->field);
+    $available_languages = field_available_languages($this->entity_type, $this->field);
+    $this->assertTrue(count($available_languages) == 1 && $available_languages[0] === LANGUAGE_NONE, 'For untranslatable fields only LANGUAGE_NONE is available.');
+  }
+
+  /**
+   * Test the multilanguage logic of _field_invoke().
+   */
+  function testFieldInvoke() {
+    // Enable field translations for the entity.
+    field_test_entity_info_translatable('test_entity', TRUE);
+
+    $entity_type = 'test_entity';
+    $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']);
+
+    // Populate some extra languages to check if _field_invoke() correctly uses
+    // the result of field_available_languages().
+    $values = array();
+    $extra_languages = mt_rand(1, 4);
+    $languages = $available_languages = field_available_languages($this->entity_type, $this->field);
+    for ($i = 0; $i < $extra_languages; ++$i) {
+      $languages[] = $this->randomName(2);
+    }
+
+    // For each given language provide some random values.
+    foreach ($languages as $langcode) {
+      for ($delta = 0; $delta < $this->field['cardinality']; $delta++) {
+        $values[$langcode][$delta]['value'] = mt_rand(1, 127);
+      }
+    }
+    $entity->{$this->field_name} = $values;
+
+    $results = _field_invoke('test_op', $entity_type, $entity);
+    foreach ($results as $langcode => $result) {
+      $hash = hash('sha256', serialize(array($entity_type, $entity, $this->field_name, $langcode, $values[$langcode])));
+      // Check whether the parameters passed to _field_invoke() were correctly
+      // forwarded to the callback function.
+      $this->assertEqual($hash, $result, format_string('The result for %language is correctly stored.', array('%language' => $langcode)));
+    }
+
+    $this->assertEqual(count($results), count($available_languages), 'No unavailable language has been processed.');
+  }
+
+  /**
+   * Test the multilanguage logic of _field_invoke_multiple().
+   */
+  function testFieldInvokeMultiple() {
+    // Enable field translations for the entity.
+    field_test_entity_info_translatable('test_entity', TRUE);
+
+    $values = array();
+    $options = array();
+    $entities = array();
+    $entity_type = 'test_entity';
+    $entity_count = 5;
+    $available_languages = field_available_languages($this->entity_type, $this->field);
+
+    for ($id = 1; $id <= $entity_count; ++$id) {
+      $entity = field_test_create_stub_entity($id, $id, $this->instance['bundle']);
+      $languages = $available_languages;
+
+      // Populate some extra languages to check whether _field_invoke()
+      // correctly uses the result of field_available_languages().
+      $extra_languages = mt_rand(1, 4);
+      for ($i = 0; $i < $extra_languages; ++$i) {
+        $languages[] = $this->randomName(2);
+      }
+
+      // For each given language provide some random values.
+      $language_count = count($languages);
+      for ($i = 0; $i < $language_count; ++$i) {
+        $langcode = $languages[$i];
+        // Avoid to populate at least one field translation to check that
+        // per-entity language suggestions work even when available field values
+        // are different for each language.
+        if ($i !== $id) {
+          for ($delta = 0; $delta < $this->field['cardinality']; $delta++) {
+            $values[$id][$langcode][$delta]['value'] = mt_rand(1, 127);
+          }
+        }
+        // Ensure that a language for which there is no field translation is
+        // used as display language to prepare per-entity language suggestions.
+        elseif (!isset($display_language)) {
+          $display_language = $langcode;
+        }
+      }
+
+      $entity->{$this->field_name} = $values[$id];
+      $entities[$id] = $entity;
+
+      // Store per-entity language suggestions.
+      $options['language'][$id] = field_language($entity_type, $entity, NULL, $display_language);
+    }
+
+    $grouped_results = _field_invoke_multiple('test_op_multiple', $entity_type, $entities);
+    foreach ($grouped_results as $id => $results) {
+      foreach ($results as $langcode => $result) {
+        if (isset($values[$id][$langcode])) {
+          $hash = hash('sha256', serialize(array($entity_type, $entities[$id], $this->field_name, $langcode, $values[$id][$langcode])));
+          // Check whether the parameters passed to _field_invoke_multiple()
+          // were correctly forwarded to the callback function.
+          $this->assertEqual($hash, $result, format_string('The result for entity %id/%language is correctly stored.', array('%id' => $id, '%language' => $langcode)));
+        }
+      }
+      $this->assertEqual(count($results), count($available_languages), format_string('No unavailable language has been processed for entity %id.', array('%id' => $id)));
+    }
+
+    $null = NULL;
+    $grouped_results = _field_invoke_multiple('test_op_multiple', $entity_type, $entities, $null, $null, $options);
+    foreach ($grouped_results as $id => $results) {
+      foreach ($results as $langcode => $result) {
+        $this->assertTrue(isset($options['language'][$id]), format_string('The result language %language for entity %id was correctly suggested (display language: %display_language).', array('%id' => $id, '%language' => $langcode, '%display_language' => $display_language)));
+      }
+    }
+  }
+
+  /**
+   * Test translatable fields storage/retrieval.
+   */
+  function testTranslatableFieldSaveLoad() {
+    // Enable field translations for nodes.
+    field_test_entity_info_translatable('node', TRUE);
+    $entity_info = entity_get_info('node');
+    $this->assertTrue(count($entity_info['translation']), 'Nodes are translatable.');
+
+    // Prepare the field translations.
+    field_test_entity_info_translatable('test_entity', TRUE);
+    $eid = $evid = 1;
+    $entity_type = 'test_entity';
+    $entity = field_test_create_stub_entity($eid, $evid, $this->instance['bundle']);
+    $field_translations = array();
+    $available_languages = field_available_languages($entity_type, $this->field);
+    $this->assertTrue(count($available_languages) > 1, 'Field is translatable.');
+    foreach ($available_languages as $langcode) {
+      $field_translations[$langcode] = $this->_generateTestFieldValues($this->field['cardinality']);
+    }
+
+    // Save and reload the field translations.
+    $entity->{$this->field_name} = $field_translations;
+    field_attach_insert($entity_type, $entity);
+    unset($entity->{$this->field_name});
+    field_attach_load($entity_type, array($eid => $entity));
+
+    // Check if the correct values were saved/loaded.
+    foreach ($field_translations as $langcode => $items) {
+      $result = TRUE;
+      foreach ($items as $delta => $item) {
+        $result = $result && $item['value'] == $entity->{$this->field_name}[$langcode][$delta]['value'];
+      }
+      $this->assertTrue($result, format_string('%language translation correctly handled.', array('%language' => $langcode)));
+    }
+  }
+
+  /**
+   * Tests display language logic for translatable fields.
+   */
+  function testFieldDisplayLanguage() {
+    $field_name = drupal_strtolower($this->randomName() . '_field_name');
+    $entity_type = 'test_entity';
+
+    // We need an additional field here to properly test display language
+    // suggestions.
+    $field = array(
+      'field_name' => $field_name,
+      'type' => 'test_field',
+      'cardinality' => 2,
+      'translatable' => TRUE,
+    );
+    field_create_field($field);
+
+    $instance = array(
+      'field_name' => $field['field_name'],
+      'entity_type' => $entity_type,
+      'bundle' => 'test_bundle',
+    );
+    field_create_instance($instance);
+
+    $entity = field_test_create_stub_entity(1, 1, $this->instance['bundle']);
+    $instances = field_info_instances($entity_type, $this->instance['bundle']);
+
+    $enabled_languages = field_content_languages();
+    $languages = array();
+
+    // Generate field translations for languages different from the first
+    // enabled.
+    foreach ($instances as $instance) {
+      $field_name = $instance['field_name'];
+      $field = field_info_field($field_name);
+      do {
+        // Index 0 is reserved for the requested language, this way we ensure
+        // that no field is actually populated with it.
+        $langcode = $enabled_languages[mt_rand(1, count($enabled_languages) - 1)];
+      }
+      while (isset($languages[$langcode]));
+      $languages[$langcode] = TRUE;
+      $entity->{$field_name}[$langcode] = $this->_generateTestFieldValues($field['cardinality']);
+    }
+
+    // Test multiple-fields display languages for untranslatable entities.
+    field_test_entity_info_translatable($entity_type, FALSE);
+    drupal_static_reset('field_language');
+    $requested_language = $enabled_languages[0];
+    $display_language = field_language($entity_type, $entity, NULL, $requested_language);
+    foreach ($instances as $instance) {
+      $field_name = $instance['field_name'];
+      $this->assertTrue($display_language[$field_name] == LANGUAGE_NONE, format_string('The display language for field %field_name is %language.', array('%field_name' => $field_name, '%language' => LANGUAGE_NONE)));
+    }
+
+    // Test multiple-fields display languages for translatable entities.
+    field_test_entity_info_translatable($entity_type, TRUE);
+    drupal_static_reset('field_language');
+    $display_language = field_language($entity_type, $entity, NULL, $requested_language);
+
+    foreach ($instances as $instance) {
+      $field_name = $instance['field_name'];
+      $langcode = $display_language[$field_name];
+      // As the requested language was not assinged to any field, if the
+      // returned language is defined for the current field, core fallback rules
+      // were successfully applied.
+      $this->assertTrue(isset($entity->{$field_name}[$langcode]) && $langcode != $requested_language, format_string('The display language for the field %field_name is %language.', array('%field_name' => $field_name, '%language' => $langcode)));
+    }
+
+    // Test single-field display language.
+    drupal_static_reset('field_language');
+    $langcode = field_language($entity_type, $entity, $this->field_name, $requested_language);
+    $this->assertTrue(isset($entity->{$this->field_name}[$langcode]) && $langcode != $requested_language, format_string('The display language for the (single) field %field_name is %language.', array('%field_name' => $field_name, '%language' => $langcode)));
+
+    // Test field_language() basic behavior without language fallback.
+    variable_set('field_test_language_fallback', FALSE);
+    $entity->{$this->field_name}[$requested_language] = mt_rand(1, 127);
+    drupal_static_reset('field_language');
+    $display_language = field_language($entity_type, $entity, $this->field_name, $requested_language);
+    $this->assertEqual($display_language, $requested_language, 'Display language behave correctly when language fallback is disabled');
+  }
+
+  /**
+   * Tests field translations when creating a new revision.
+   */
+  function testFieldFormTranslationRevisions() {
+    $web_user = $this->drupalCreateUser(array('access field_test content', 'administer field_test content'));
+    $this->drupalLogin($web_user);
+
+    // Prepare the field translations.
+    field_test_entity_info_translatable($this->entity_type, TRUE);
+    $eid = 1;
+    $entity = field_test_create_stub_entity($eid, $eid, $this->instance['bundle']);
+    $available_languages = array_flip(field_available_languages($this->entity_type, $this->field));
+    unset($available_languages[LANGUAGE_NONE]);
+    $field_name = $this->field['field_name'];
+
+    // Store the field translations.
+    $entity->is_new = TRUE;
+    foreach ($available_languages as $langcode => $value) {
+      $entity->{$field_name}[$langcode][0]['value'] = $value + 1;
+    }
+    field_test_entity_save($entity);
+
+    // Create a new revision.
+    $langcode = field_valid_language(NULL);
+    $edit = array("{$field_name}[$langcode][0][value]" => $entity->{$field_name}[$langcode][0]['value'], 'revision' => TRUE);
+    $this->drupalPost('test-entity/manage/' . $eid . '/edit', $edit, t('Save'));
+
+    // Check translation revisions.
+    $this->checkTranslationRevisions($eid, $eid, $available_languages);
+    $this->checkTranslationRevisions($eid, $eid + 1, $available_languages);
+  }
+
+  /**
+   * Check if the field translation attached to the entity revision identified
+   * by the passed arguments were correctly stored.
+   */
+  private function checkTranslationRevisions($eid, $evid, $available_languages) {
+    $field_name = $this->field['field_name'];
+    $entity = field_test_entity_test_load($eid, $evid);
+    foreach ($available_languages as $langcode => $value) {
+      $passed = isset($entity->{$field_name}[$langcode]) && $entity->{$field_name}[$langcode][0]['value'] == $value + 1;
+      $this->assertTrue($passed, format_string('The @language translation for revision @revision was correctly stored', array('@language' => $langcode, '@revision' => $entity->ftvid)));
+    }
+  }
+}
+
+/**
+ * Unit test class for field bulk delete and batch purge functionality.
+ */
+class FieldBulkDeleteTestCase extends FieldTestCase {
+  protected $field;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Field bulk delete tests',
+      'description' => 'Bulk delete fields and instances, and clean up afterwards.',
+      'group' => 'Field API',
+    );
+  }
+
+  /**
+   * Convenience function for Field API tests.
+   *
+   * Given an array of potentially fully-populated entities and an
+   * optional field name, generate an array of stub entities of the
+   * same fieldable type which contains the data for the field name
+   * (if given).
+   *
+   * @param $entity_type
+   *   The entity type of $entities.
+   * @param $entities
+   *   An array of entities of type $entity_type.
+   * @param $field_name
+   *   Optional; a field name whose data should be copied from
+   *   $entities into the returned stub entities.
+   * @return
+   *   An array of stub entities corresponding to $entities.
+   */
+  function _generateStubEntities($entity_type, $entities, $field_name = NULL) {
+    $stubs = array();
+    foreach ($entities as $id => $entity) {
+      $stub = entity_create_stub_entity($entity_type, entity_extract_ids($entity_type, $entity));
+      if (isset($field_name)) {
+        $stub->{$field_name} = $entity->{$field_name};
+      }
+      $stubs[$id] = $stub;
+    }
+    return $stubs;
+  }
+
+  /**
+   * Tests that the expected hooks have been invoked on the expected entities.
+   *
+   * @param $expected_hooks
+   *   An array keyed by hook name, with one entry per expected invocation.
+   *   Each entry is the value of the "$entity" parameter the hook is expected
+   *   to have been passed.
+   * @param $actual_hooks
+   *   The array of actual hook invocations recorded by field_test_memorize().
+   */
+  function checkHooksInvocations($expected_hooks, $actual_hooks) {
+    foreach ($expected_hooks as $hook => $invocations) {
+      $actual_invocations = $actual_hooks[$hook];
+
+      // Check that the number of invocations is correct.
+      $this->assertEqual(count($actual_invocations), count($invocations), "$hook() was called the expected number of times.");
+
+      // Check that the hook was called for each expected argument.
+      foreach ($invocations as $argument) {
+        $found = FALSE;
+        foreach ($actual_invocations as $actual_arguments) {
+          if ($actual_arguments[1] == $argument) {
+            $found = TRUE;
+            break;
+          }
+        }
+        $this->assertTrue($found, "$hook() was called on expected argument");
+      }
+    }
+  }
+
+  function setUp() {
+    parent::setUp('field_test');
+
+    $this->fields = array();
+    $this->instances = array();
+    $this->entities = array();
+    $this->entities_by_bundles = array();
+
+    // Create two bundles.
+    $this->bundles = array('bb_1' => 'bb_1', 'bb_2' => 'bb_2');
+    foreach ($this->bundles as $name => $desc) {
+      field_test_create_bundle($name, $desc);
+    }
+
+    // Create two fields.
+    $field = array('field_name' => 'bf_1', 'type' => 'test_field', 'cardinality' => 1);
+    $this->fields[] = field_create_field($field);
+    $field = array('field_name' => 'bf_2', 'type' => 'test_field', 'cardinality' => 4);
+    $this->fields[] = field_create_field($field);
+
+    // For each bundle, create an instance of each field, and 10
+    // entities with values for each field.
+    $id = 0;
+    $this->entity_type = 'test_entity';
+    foreach ($this->bundles as $bundle) {
+      foreach ($this->fields as $field) {
+        $instance = array(
+          'field_name' => $field['field_name'],
+          'entity_type' => $this->entity_type,
+          'bundle' => $bundle,
+          'widget' => array(
+            'type' => 'test_field_widget',
+          )
+        );
+        $this->instances[] = field_create_instance($instance);
+      }
+
+      for ($i = 0; $i < 10; $i++) {
+        $entity = field_test_create_stub_entity($id, $id, $bundle);
+        foreach ($this->fields as $field) {
+          $entity->{$field['field_name']}[LANGUAGE_NONE] = $this->_generateTestFieldValues($field['cardinality']);
+        }
+
+        $this->entities[$id] = $entity;
+        // Also keep track of the entities per bundle.
+        $this->entities_by_bundles[$bundle][$id] = $entity;
+        field_attach_insert($this->entity_type, $entity);
+        $id++;
+      }
+    }
+  }
+
+  /**
+   * Verify that deleting an instance leaves the field data items in
+   * the database and that the appropriate Field API functions can
+   * operate on the deleted data and instance.
+   *
+   * This tests how EntityFieldQuery interacts with
+   * field_delete_instance() and could be moved to FieldCrudTestCase,
+   * but depends on this class's setUp().
+   */
+  function testDeleteFieldInstance() {
+    $bundle = reset($this->bundles);
+    $field = reset($this->fields);
+
+    // There are 10 entities of this bundle.
+    $query = new EntityFieldQuery();
+    $found = $query
+      ->fieldCondition($field)
+      ->entityCondition('bundle', $bundle)
+      ->execute();
+    $this->assertEqual(count($found['test_entity']), 10, 'Correct number of entities found before deleting');
+
+    // Delete the instance.
+    $instance = field_info_instance($this->entity_type, $field['field_name'], $bundle);
+    field_delete_instance($instance);
+
+    // The instance still exists, deleted.
+    $instances = field_read_instances(array('field_id' => $field['id'], 'deleted' => 1), array('include_deleted' => 1, 'include_inactive' => 1));
+    $this->assertEqual(count($instances), 1, 'There is one deleted instance');
+    $this->assertEqual($instances[0]['bundle'], $bundle, 'The deleted instance is for the correct bundle');
+
+    // There are 0 entities of this bundle with non-deleted data.
+    $query = new EntityFieldQuery();
+    $found = $query
+      ->fieldCondition($field)
+      ->entityCondition('bundle', $bundle)
+      ->execute();
+    $this->assertTrue(!isset($found['test_entity']), 'No entities found after deleting');
+
+    // There are 10 entities of this bundle when deleted fields are allowed, and
+    // their values are correct.
+    $query = new EntityFieldQuery();
+    $found = $query
+      ->fieldCondition($field)
+      ->entityCondition('bundle', $bundle)
+      ->deleted(TRUE)
+      ->execute();
+    field_attach_load($this->entity_type, $found[$this->entity_type], FIELD_LOAD_CURRENT, array('field_id' => $field['id'], 'deleted' => 1));
+    $this->assertEqual(count($found['test_entity']), 10, 'Correct number of entities found after deleting');
+    foreach ($found['test_entity'] as $id => $entity) {
+      $this->assertEqual($this->entities[$id]->{$field['field_name']}, $entity->{$field['field_name']}, "Entity $id with deleted data loaded correctly");
+    }
+  }
+
+  /**
+   * Verify that field data items and instances are purged when an
+   * instance is deleted.
+   */
+  function testPurgeInstance() {
+    // Start recording hook invocations.
+    field_test_memorize();
+
+    $bundle = reset($this->bundles);
+    $field = reset($this->fields);
+
+    // Delete the instance.
+    $instance = field_info_instance($this->entity_type, $field['field_name'], $bundle);
+    field_delete_instance($instance);
+
+    // No field hooks were called.
+    $mem = field_test_memorize();
+    $this->assertEqual(count($mem), 0, 'No field hooks were called');
+
+    $batch_size = 2;
+    for ($count = 8; $count >= 0; $count -= $batch_size) {
+      // Purge two entities.
+      field_purge_batch($batch_size);
+
+      // There are $count deleted entities left.
+      $query = new EntityFieldQuery();
+      $found = $query
+        ->fieldCondition($field)
+        ->entityCondition('bundle', $bundle)
+        ->deleted(TRUE)
+        ->execute();
+      $this->assertEqual($count ? count($found['test_entity']) : count($found), $count, 'Correct number of entities found after purging 2');
+    }
+
+    // Check hooks invocations.
+    // - hook_field_load() (multiple hook) should have been called on all
+    // entities by pairs of two.
+    // - hook_field_delete() should have been called once for each entity in the
+    // bundle.
+    $actual_hooks = field_test_memorize();
+    $hooks = array();
+    $stubs = $this->_generateStubEntities($this->entity_type, $this->entities_by_bundles[$bundle], $field['field_name']);
+    foreach (array_chunk($stubs, $batch_size, TRUE) as $chunk) {
+      $hooks['field_test_field_load'][] = $chunk;
+    }
+    foreach ($stubs as $stub) {
+      $hooks['field_test_field_delete'][] = $stub;
+    }
+    $this->checkHooksInvocations($hooks, $actual_hooks);
+
+    // The instance still exists, deleted.
+    $instances = field_read_instances(array('field_id' => $field['id'], 'deleted' => 1), array('include_deleted' => 1, 'include_inactive' => 1));
+    $this->assertEqual(count($instances), 1, 'There is one deleted instance');
+
+    // Purge the instance.
+    field_purge_batch($batch_size);
+
+    // The instance is gone.
+    $instances = field_read_instances(array('field_id' => $field['id'], 'deleted' => 1), array('include_deleted' => 1, 'include_inactive' => 1));
+    $this->assertEqual(count($instances), 0, 'The instance is gone');
+
+    // The field still exists, not deleted, because it has a second instance.
+    $fields = field_read_fields(array('id' => $field['id']), array('include_deleted' => 1, 'include_inactive' => 1));
+    $this->assertTrue(isset($fields[$field['id']]), 'The field exists and is not deleted');
+  }
+
+  /**
+   * Verify that fields are preserved and purged correctly as multiple
+   * instances are deleted and purged.
+   */
+  function testPurgeField() {
+    // Start recording hook invocations.
+    field_test_memorize();
+
+    $field = reset($this->fields);
+
+    // Delete the first instance.
+    $bundle = reset($this->bundles);
+    $instance = field_info_instance($this->entity_type, $field['field_name'], $bundle);
+    field_delete_instance($instance);
+
+    // Assert that hook_field_delete() was not called yet.
+    $mem = field_test_memorize();
+    $this->assertEqual(count($mem), 0, 'No field hooks were called.');
+
+    // Purge the data.
+    field_purge_batch(10);
+
+    // Check hooks invocations.
+    // - hook_field_load() (multiple hook) should have been called once, for all
+    // entities in the bundle.
+    // - hook_field_delete() should have been called once for each entity in the
+    // bundle.
+    $actual_hooks = field_test_memorize();
+    $hooks = array();
+    $stubs = $this->_generateStubEntities($this->entity_type, $this->entities_by_bundles[$bundle], $field['field_name']);
+    $hooks['field_test_field_load'][] = $stubs;
+    foreach ($stubs as $stub) {
+      $hooks['field_test_field_delete'][] = $stub;
+    }
+    $this->checkHooksInvocations($hooks, $actual_hooks);
+
+    // Purge again to purge the instance.
+    field_purge_batch(0);
+
+    // The field still exists, not deleted.
+    $fields = field_read_fields(array('id' => $field['id']), array('include_deleted' => 1));
+    $this->assertTrue(isset($fields[$field['id']]) && !$fields[$field['id']]['deleted'], 'The field exists and is not deleted');
+
+    // Delete the second instance.
+    $bundle = next($this->bundles);
+    $instance = field_info_instance($this->entity_type, $field['field_name'], $bundle);
+    field_delete_instance($instance);
+
+    // Assert that hook_field_delete() was not called yet.
+    $mem = field_test_memorize();
+    $this->assertEqual(count($mem), 0, 'No field hooks were called.');
+
+    // Purge the data.
+    field_purge_batch(10);
+
+    // Check hooks invocations (same as above, for the 2nd bundle).
+    $actual_hooks = field_test_memorize();
+    $hooks = array();
+    $stubs = $this->_generateStubEntities($this->entity_type, $this->entities_by_bundles[$bundle], $field['field_name']);
+    $hooks['field_test_field_load'][] = $stubs;
+    foreach ($stubs as $stub) {
+      $hooks['field_test_field_delete'][] = $stub;
+    }
+    $this->checkHooksInvocations($hooks, $actual_hooks);
+
+    // The field still exists, deleted.
+    $fields = field_read_fields(array('id' => $field['id']), array('include_deleted' => 1));
+    $this->assertTrue(isset($fields[$field['id']]) && $fields[$field['id']]['deleted'], 'The field exists and is deleted');
+
+    // Purge again to purge the instance and the field.
+    field_purge_batch(0);
+
+    // The field is gone.
+    $fields = field_read_fields(array('id' => $field['id']), array('include_deleted' => 1, 'include_inactive' => 1));
+    $this->assertEqual(count($fields), 0, 'The field is purged.');
+  }
+}
+
+/**
+ * Tests entity properties.
+ */
+class EntityPropertiesTestCase extends FieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Entity properties',
+      'description' => 'Tests entity properties.',
+      'group' => 'Entity API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('field_test');
+  }
+
+  /**
+   * Tests label key and label callback of an entity.
+   */
+  function testEntityLabel() {
+    $entity_types = array(
+      'test_entity_no_label',
+      'test_entity_label',
+      'test_entity_label_callback',
+    );
+
+    $entity = field_test_create_stub_entity();
+
+    foreach ($entity_types as $entity_type) {
+      $label = entity_label($entity_type, $entity);
+
+      switch ($entity_type) {
+        case 'test_entity_no_label':
+          $this->assertFalse($label, 'Entity with no label property or callback returned FALSE.');
+          break;
+
+        case 'test_entity_label':
+          $this->assertEqual($label, $entity->ftlabel, 'Entity with label key returned correct label.');
+          break;
+
+        case 'test_entity_label_callback':
+          $this->assertEqual($label, 'label callback ' . $entity->ftlabel, 'Entity with label callback returned correct label.');
+          break;
+      }
+    }
+  }
+}
diff --git a/htmltest/modules/field/tests/field_test.entity.inc b/htmltest/modules/field/tests/field_test.entity.inc
new file mode 100644
index 00000000..c6686ebc
--- /dev/null
+++ b/htmltest/modules/field/tests/field_test.entity.inc
@@ -0,0 +1,500 @@
+<?php
+
+/**
+ * @file
+ * Defines an entity type.
+ */
+
+/**
+ * Implements hook_entity_info().
+ */
+function field_test_entity_info() {
+  // If requested, clear the field cache while this hook is being called. See
+  // testFieldInfoCache().
+  if (variable_get('field_test_clear_info_cache_in_hook_entity_info', FALSE)) {
+    field_info_cache_clear();
+  }
+
+  $bundles = variable_get('field_test_bundles', array('test_bundle' => array('label' => 'Test Bundle')));
+  $test_entity_modes = array(
+    'full' => array(
+      'label' => t('Full object'),
+      'custom settings' => TRUE,
+    ),
+    'teaser' => array(
+      'label' => t('Teaser'),
+      'custom settings' => TRUE,
+    ),
+  );
+
+  return array(
+    'test_entity' => array(
+      'label' => t('Test Entity'),
+      'fieldable' => TRUE,
+      'field cache' => FALSE,
+      'base table' => 'test_entity',
+      'revision table' => 'test_entity_revision',
+      'entity keys' => array(
+        'id' => 'ftid',
+        'revision' => 'ftvid',
+        'bundle' => 'fttype',
+      ),
+      'bundles' => $bundles,
+      'view modes' => $test_entity_modes,
+    ),
+    // This entity type doesn't get form handling for now...
+    'test_cacheable_entity' => array(
+      'label' => t('Test Entity, cacheable'),
+      'fieldable' => TRUE,
+      'field cache' => TRUE,
+      'entity keys' => array(
+        'id' => 'ftid',
+        'revision' => 'ftvid',
+        'bundle' => 'fttype',
+      ),
+      'bundles' => $bundles,
+      'view modes' => $test_entity_modes,
+    ),
+    'test_entity_bundle_key' => array(
+      'label' => t('Test Entity with a bundle key.'),
+      'base table' => 'test_entity_bundle_key',
+      'fieldable' => TRUE,
+      'field cache' => FALSE,
+      'entity keys' => array(
+        'id' => 'ftid',
+        'bundle' => 'fttype',
+      ),
+      'bundles' => array('bundle1' => array('label' => 'Bundle1'), 'bundle2' => array('label' => 'Bundle2')) + $bundles,
+      'view modes' => $test_entity_modes,
+    ),
+    // In this case, the bundle key is not stored in the database.
+    'test_entity_bundle' => array(
+      'label' => t('Test Entity with a specified bundle.'),
+      'base table' => 'test_entity_bundle',
+      'fieldable' => TRUE,
+      'controller class' => 'TestEntityBundleController',
+      'field cache' => FALSE,
+      'entity keys' => array(
+        'id' => 'ftid',
+        'bundle' => 'fttype',
+      ),
+      'bundles' => array('test_entity_2' => array('label' => 'Test entity 2')) + $bundles,
+      'view modes' => $test_entity_modes,
+    ),
+    // @see EntityPropertiesTestCase::testEntityLabel()
+    'test_entity_no_label' => array(
+      'label' => t('Test entity without label'),
+      'fieldable' => TRUE,
+      'field cache' => FALSE,
+      'base table' => 'test_entity',
+      'entity keys' => array(
+        'id' => 'ftid',
+        'revision' => 'ftvid',
+        'bundle' => 'fttype',
+      ),
+      'bundles' => $bundles,
+      'view modes' => $test_entity_modes,
+    ),
+    'test_entity_label' => array(
+      'label' => t('Test entity label'),
+      'fieldable' => TRUE,
+      'field cache' => FALSE,
+      'base table' => 'test_entity',
+      'entity keys' => array(
+        'id' => 'ftid',
+        'revision' => 'ftvid',
+        'bundle' => 'fttype',
+        'label' => 'ftlabel',
+      ),
+      'bundles' => $bundles,
+      'view modes' => $test_entity_modes,
+    ),
+    'test_entity_label_callback' => array(
+      'label' => t('Test entity label callback'),
+      'fieldable' => TRUE,
+      'field cache' => FALSE,
+      'base table' => 'test_entity',
+      'label callback' => 'field_test_entity_label_callback',
+      'entity keys' => array(
+        'id' => 'ftid',
+        'revision' => 'ftvid',
+        'bundle' => 'fttype',
+      ),
+      'bundles' => $bundles,
+      'view modes' => $test_entity_modes,
+    ),
+  );
+}
+
+/**
+ * Implements hook_entity_info_alter().
+ */
+function field_test_entity_info_alter(&$entity_info) {
+  // Enable/disable field_test as a translation handler.
+  foreach (field_test_entity_info_translatable() as $entity_type => $translatable) {
+    $entity_info[$entity_type]['translation']['field_test'] = $translatable;
+  }
+  // Disable locale as a translation handler.
+  foreach ($entity_info as $entity_type => $info) {
+    $entity_info[$entity_type]['translation']['locale'] = FALSE;
+  }
+}
+
+/**
+ * Helper function to enable entity translations.
+ */
+function field_test_entity_info_translatable($entity_type = NULL, $translatable = NULL) {
+  drupal_static_reset('field_has_translation_handler');
+  $stored_value = &drupal_static(__FUNCTION__, array());
+  if (isset($entity_type)) {
+    $stored_value[$entity_type] = $translatable;
+    entity_info_cache_clear();
+  }
+  return $stored_value;
+}
+
+/**
+ * Creates a new bundle for test_entity entities.
+ *
+ * @param $bundle
+ *   The machine-readable name of the bundle.
+ * @param $text
+ *   The human-readable name of the bundle. If none is provided, the machine
+ *   name will be used.
+ */
+function field_test_create_bundle($bundle, $text = NULL) {
+  $bundles = variable_get('field_test_bundles', array('test_bundle' => array('label' => 'Test Bundle')));
+  $bundles += array($bundle => array('label' => $text ? $text : $bundle));
+  variable_set('field_test_bundles', $bundles);
+
+  $info = field_test_entity_info();
+  foreach ($info as $type => $type_info) {
+    field_attach_create_bundle($type, $bundle);
+  }
+}
+
+/**
+ * Renames a bundle for test_entity entities.
+ *
+ * @param $bundle_old
+ *   The machine-readable name of the bundle to rename.
+ * @param $bundle_new
+ *   The new machine-readable name of the bundle.
+ */
+function field_test_rename_bundle($bundle_old, $bundle_new) {
+  $bundles = variable_get('field_test_bundles', array('test_bundle' => array('label' => 'Test Bundle')));
+  $bundles[$bundle_new] = $bundles[$bundle_old];
+  unset($bundles[$bundle_old]);
+  variable_set('field_test_bundles', $bundles);
+
+  $info = field_test_entity_info();
+  foreach ($info as $type => $type_info) {
+    field_attach_rename_bundle($type, $bundle_old, $bundle_new);
+  }
+}
+
+/**
+ * Deletes a bundle for test_entity objects.
+ *
+ * @param $bundle
+ *   The machine-readable name of the bundle to delete.
+ */
+function field_test_delete_bundle($bundle) {
+  $bundles = variable_get('field_test_bundles', array('test_bundle' => array('label' => 'Test Bundle')));
+  unset($bundles[$bundle]);
+  variable_set('field_test_bundles', $bundles);
+
+  $info = field_test_entity_info();
+  foreach ($info as $type => $type_info) {
+    field_attach_delete_bundle($type, $bundle);
+  }
+}
+
+/**
+ * Creates a basic test_entity entity.
+ */
+function field_test_create_stub_entity($id = 1, $vid = 1, $bundle = 'test_bundle', $label = '') {
+  $entity = new stdClass();
+  // Only set id and vid properties if they don't come as NULL (creation form).
+  if (isset($id)) {
+    $entity->ftid = $id;
+  }
+  if (isset($vid)) {
+    $entity->ftvid = $vid;
+  }
+  $entity->fttype = $bundle;
+
+  $label = !empty($label) ? $label : $bundle . ' label';
+  $entity->ftlabel = $label;
+
+  return $entity;
+}
+
+/**
+ * Loads a test_entity.
+ *
+ * @param $ftid
+ *   The id of the entity to load.
+ * @param $ftvid
+ *   (Optional) The revision id of the entity to load. If not specified, the
+ *   current revision will be used.
+ * @return
+ *   The loaded entity.
+ */
+function field_test_entity_test_load($ftid, $ftvid = NULL) {
+  // Load basic strucure.
+  $query = db_select('test_entity', 'fte', array())
+    ->condition('fte.ftid', $ftid);
+
+  if ($ftvid) {
+    $query->join('test_entity_revision', 'fter', 'fte.ftid = fter.ftid');
+    $query->addField('fte', 'ftid');
+    $query->addField('fte', 'fttype');
+    $query->addField('fter', 'ftvid');
+    $query->condition('fter.ftvid', $ftvid);
+  }
+  else {
+    $query->fields('fte');
+  }
+
+  $entities = $query->execute()->fetchAllAssoc('ftid');
+
+  // Attach fields.
+  if ($ftvid) {
+    field_attach_load_revision('test_entity', $entities);
+  }
+  else {
+    field_attach_load('test_entity', $entities);
+  }
+
+  return $entities[$ftid];
+}
+
+/**
+ * Saves a test_entity.
+ *
+ * A new entity is created if $entity->ftid and $entity->is_new are both empty.
+ * A new revision is created if $entity->revision is not empty.
+ *
+ * @param $entity
+ *   The entity to save.
+ */
+function field_test_entity_save(&$entity) {
+  field_attach_presave('test_entity', $entity);
+
+  if (!isset($entity->is_new)) {
+    $entity->is_new = empty($entity->ftid);
+  }
+
+  if (!$entity->is_new && !empty($entity->revision)) {
+    $entity->old_ftvid = $entity->ftvid;
+    unset($entity->ftvid);
+  }
+
+  $update_entity = TRUE;
+  if ($entity->is_new) {
+    drupal_write_record('test_entity', $entity);
+    drupal_write_record('test_entity_revision', $entity);
+    $op = 'insert';
+  }
+  else {
+    drupal_write_record('test_entity', $entity, 'ftid');
+    if (!empty($entity->revision)) {
+      drupal_write_record('test_entity_revision', $entity);
+    }
+    else {
+      drupal_write_record('test_entity_revision', $entity, 'ftvid');
+      $update_entity = FALSE;
+    }
+    $op = 'update';
+  }
+  if ($update_entity) {
+    db_update('test_entity')
+      ->fields(array('ftvid' => $entity->ftvid))
+      ->condition('ftid', $entity->ftid)
+      ->execute();
+  }
+
+  // Save fields.
+  $function = "field_attach_$op";
+  $function('test_entity', $entity);
+}
+
+/**
+ * Menu callback: displays the 'Add new test_entity' form.
+ */
+function field_test_entity_add($fttype) {
+  $fttype = str_replace('-', '_', $fttype);
+  $entity = (object)array('fttype' => $fttype);
+  drupal_set_title(t('Create test_entity @bundle', array('@bundle' => $fttype)), PASS_THROUGH);
+  return drupal_get_form('field_test_entity_form', $entity, TRUE);
+}
+
+/**
+ * Menu callback: displays the 'Edit exiisting test_entity' form.
+ */
+function field_test_entity_edit($entity) {
+  drupal_set_title(t('test_entity @ftid revision @ftvid', array('@ftid' => $entity->ftid, '@ftvid' => $entity->ftvid)), PASS_THROUGH);
+  return drupal_get_form('field_test_entity_form', $entity);
+}
+
+/**
+ * Test_entity form.
+ */
+function field_test_entity_form($form, &$form_state, $entity, $add = FALSE) {
+  // During initial form build, add the entity to the form state for use during
+  // form building and processing. During a rebuild, use what is in the form
+  // state.
+  if (!isset($form_state['test_entity'])) {
+    $form_state['test_entity'] = $entity;
+  }
+  else {
+    $entity = $form_state['test_entity'];
+  }
+
+  foreach (array('ftid', 'ftvid', 'fttype') as $key) {
+    $form[$key] = array(
+      '#type' => 'value',
+      '#value' => isset($entity->$key) ? $entity->$key : NULL,
+    );
+  }
+
+  // Add field widgets.
+  field_attach_form('test_entity', $entity, $form, $form_state);
+
+  if (!$add) {
+    $form['revision'] = array(
+      '#access' => user_access('administer field_test content'),
+      '#type' => 'checkbox',
+      '#title' => t('Create new revision'),
+      '#default_value' => FALSE,
+      '#weight' => 100,
+    );
+  }
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+    '#weight' => 101,
+  );
+
+  return $form;
+}
+
+/**
+ * Validate handler for field_test_entity_form().
+ */
+function field_test_entity_form_validate($form, &$form_state) {
+  entity_form_field_validate('test_entity', $form, $form_state);
+}
+
+/**
+ * Submit handler for field_test_entity_form().
+ */
+function field_test_entity_form_submit($form, &$form_state) {
+  $entity = field_test_entity_form_submit_build_test_entity($form, $form_state);
+  $insert = empty($entity->ftid);
+  field_test_entity_save($entity);
+
+  $message = $insert ? t('test_entity @id has been created.', array('@id' => $entity->ftid)) : t('test_entity @id has been updated.', array('@id' => $entity->ftid));
+  drupal_set_message($message);
+
+  if ($entity->ftid) {
+    $form_state['redirect'] = 'test-entity/manage/' . $entity->ftid . '/edit';
+  }
+  else {
+    // Error on save.
+    drupal_set_message(t('The entity could not be saved.'), 'error');
+    $form_state['rebuild'] = TRUE;
+  }
+}
+
+/**
+ * Updates the form state's entity by processing this submission's values.
+ */
+function field_test_entity_form_submit_build_test_entity($form, &$form_state) {
+  $entity = $form_state['test_entity'];
+  entity_form_submit_build_entity('test_entity', $entity, $form, $form_state);
+  return $entity;
+}
+
+/**
+ * Form combining two separate entities.
+ */
+function field_test_entity_nested_form($form, &$form_state, $entity_1, $entity_2) {
+  // First entity.
+  foreach (array('ftid', 'ftvid', 'fttype') as $key) {
+    $form[$key] = array(
+      '#type' => 'value',
+      '#value' => $entity_1->$key,
+    );
+  }
+  field_attach_form('test_entity', $entity_1, $form, $form_state);
+
+  // Second entity.
+  $form['entity_2'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Second entity'),
+    '#tree' => TRUE,
+    '#parents' => array('entity_2'),
+    '#weight' => 50,
+  );
+  foreach (array('ftid', 'ftvid', 'fttype') as $key) {
+    $form['entity_2'][$key] = array(
+      '#type' => 'value',
+      '#value' => $entity_2->$key,
+    );
+  }
+  field_attach_form('test_entity', $entity_2, $form['entity_2'], $form_state);
+
+  $form['save'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+    '#weight' => 100,
+  );
+
+  return $form;
+}
+
+/**
+ * Validate handler for field_test_entity_nested_form().
+ */
+function field_test_entity_nested_form_validate($form, &$form_state) {
+  $entity_1 = (object) $form_state['values'];
+  field_attach_form_validate('test_entity', $entity_1, $form, $form_state);
+
+  $entity_2 = (object) $form_state['values']['entity_2'];
+  field_attach_form_validate('test_entity', $entity_2, $form['entity_2'], $form_state);
+}
+
+/**
+ * Submit handler for field_test_entity_nested_form().
+ */
+function field_test_entity_nested_form_submit($form, &$form_state) {
+  $entity_1 = (object) $form_state['values'];
+  field_attach_submit('test_entity', $entity_1, $form, $form_state);
+  field_test_entity_save($entity_1);
+
+  $entity_2 = (object) $form_state['values']['entity_2'];
+  field_attach_submit('test_entity', $entity_2, $form['entity_2'], $form_state);
+  field_test_entity_save($entity_2);
+
+  drupal_set_message(t('test_entities @id_1 and @id_2 have been updated.', array('@id_1' => $entity_1->ftid, '@id_2' => $entity_2->ftid)));
+}
+
+/**
+ * Controller class for the test_entity_bundle entity type.
+ *
+ * This extends the DrupalDefaultEntityController class, adding required
+ * special handling for bundles (since they are not stored in the database).
+ */
+class TestEntityBundleController extends DrupalDefaultEntityController {
+
+  protected function attachLoad(&$entities, $revision_id = FALSE) {
+    // Add bundle information.
+    foreach ($entities as $key => $entity) {
+      $entity->fttype = 'test_entity_bundle';
+      $entities[$key] = $entity;
+    }
+    parent::attachLoad($entities, $revision_id);
+  }
+}
diff --git a/htmltest/modules/field/tests/field_test.field.inc b/htmltest/modules/field/tests/field_test.field.inc
new file mode 100644
index 00000000..1cab7739
--- /dev/null
+++ b/htmltest/modules/field/tests/field_test.field.inc
@@ -0,0 +1,413 @@
+<?php
+
+/**
+ * @file
+ * Defines a field type and its formatters and widgets.
+ */
+
+/**
+ * Implements hook_field_info().
+ */
+function field_test_field_info() {
+  return array(
+    'test_field' => array(
+      'label' => t('Test field'),
+      'description' => t('Dummy field type used for tests.'),
+      'settings' => array(
+        'test_field_setting' => 'dummy test string',
+        'changeable' => 'a changeable field setting',
+        'unchangeable' => 'an unchangeable field setting',
+      ),
+      'instance_settings' => array(
+        'test_instance_setting' => 'dummy test string',
+        'test_hook_field_load' => FALSE,
+      ),
+      'default_widget' => 'test_field_widget',
+      'default_formatter' => 'field_test_default',
+    ),
+    'shape' => array(
+      'label' => t('Shape'),
+      'description' => t('Another dummy field type.'),
+      'settings' => array(
+        'foreign_key_name' => 'shape',
+      ),
+      'instance_settings' => array(),
+      'default_widget' => 'test_field_widget',
+      'default_formatter' => 'field_test_default',
+    ),
+    'hidden_test_field' => array(
+      'no_ui' => TRUE,
+      'label' => t('Hidden from UI test field'),
+      'description' => t('Dummy hidden field type used for tests.'),
+      'settings' => array(),
+      'instance_settings' => array(),
+      'default_widget' => 'test_field_widget',
+      'default_formatter' => 'field_test_default',
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_update_forbid().
+ */
+function field_test_field_update_forbid($field, $prior_field, $has_data) {
+  if ($field['type'] == 'test_field' && $field['settings']['unchangeable'] != $prior_field['settings']['unchangeable']) {
+    throw new FieldException("field_test 'unchangeable' setting cannot be changed'");
+  }
+}
+
+/**
+ * Implements hook_field_load().
+ */
+function field_test_field_load($entity_type, $entities, $field, $instances, $langcode, &$items, $age) {
+  $args = func_get_args();
+  field_test_memorize(__FUNCTION__, $args);
+
+  foreach ($items as $id => $item) {
+    // To keep the test non-intrusive, only act for instances with the
+    // test_hook_field_load setting explicitly set to TRUE.
+    if ($instances[$id]['settings']['test_hook_field_load']) {
+      foreach ($item as $delta => $value) {
+        // Don't add anything on empty values.
+        if ($value) {
+          $items[$id][$delta]['additional_key'] = 'additional_value';
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_insert().
+ */
+function field_test_field_insert($entity_type, $entity, $field, $instance, $items) {
+  $args = func_get_args();
+  field_test_memorize(__FUNCTION__, $args);
+}
+
+/**
+ * Implements hook_field_update().
+ */
+function field_test_field_update($entity_type, $entity, $field, $instance, $items) {
+  $args = func_get_args();
+  field_test_memorize(__FUNCTION__, $args);
+}
+
+/**
+ * Implements hook_field_delete().
+ */
+function field_test_field_delete($entity_type, $entity, $field, $instance, $items) {
+  $args = func_get_args();
+  field_test_memorize(__FUNCTION__, $args);
+}
+
+/**
+ * Implements hook_field_validate().
+ *
+ * Possible error codes:
+ * - 'field_test_invalid': The value is invalid.
+ */
+function field_test_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
+  $args = func_get_args();
+  field_test_memorize(__FUNCTION__, $args);
+
+  foreach ($items as $delta => $item) {
+    if ($item['value'] == -1) {
+      $errors[$field['field_name']][$langcode][$delta][] = array(
+        'error' => 'field_test_invalid',
+        'message' => t('%name does not accept the value -1.', array('%name' => $instance['label'])),
+      );
+    }
+  }
+}
+
+/**
+ * Implements hook_field_is_empty().
+ */
+function field_test_field_is_empty($item, $field) {
+  return empty($item['value']);
+}
+
+/**
+ * Implements hook_field_settings_form().
+ */
+function field_test_field_settings_form($field, $instance, $has_data) {
+  $settings = $field['settings'];
+
+  $form['test_field_setting'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Field test field setting'),
+    '#default_value' => $settings['test_field_setting'],
+    '#required' => FALSE,
+    '#description' => t('A dummy form element to simulate field setting.'),
+  );
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_instance_settings_form().
+ */
+function field_test_field_instance_settings_form($field, $instance) {
+  $settings = $instance['settings'];
+
+  $form['test_instance_setting'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Field test field instance setting'),
+    '#default_value' => $settings['test_instance_setting'],
+    '#required' => FALSE,
+    '#description' => t('A dummy form element to simulate field instance setting.'),
+  );
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_widget_info().
+ */
+function field_test_field_widget_info() {
+  return array(
+    'test_field_widget' => array(
+      'label' => t('Test field'),
+      'field types' => array('test_field', 'hidden_test_field'),
+      'settings' => array('test_widget_setting' => 'dummy test string'),
+    ),
+    'test_field_widget_multiple' => array(
+      'label' => t('Test field 1'),
+      'field types' => array('test_field'),
+      'settings' => array('test_widget_setting_multiple' => 'dummy test string'),
+      'behaviors' => array(
+        'multiple values' => FIELD_BEHAVIOR_CUSTOM,
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_widget_form().
+ */
+function field_test_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  switch ($instance['widget']['type']) {
+    case 'test_field_widget':
+      $element += array(
+        '#type' => 'textfield',
+        '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : '',
+      );
+      return array('value' => $element);
+
+    case 'test_field_widget_multiple':
+      $values = array();
+      foreach ($items as $delta => $value) {
+        $values[] = $value['value'];
+      }
+      $element += array(
+        '#type' => 'textfield',
+        '#default_value' => implode(', ', $values),
+        '#element_validate' => array('field_test_widget_multiple_validate'),
+      );
+      return $element;
+  }
+}
+
+/**
+ * Form element validation handler for 'test_field_widget_multiple' widget.
+ */
+function field_test_widget_multiple_validate($element, &$form_state) {
+  $values = array_map('trim', explode(',', $element['#value']));
+  $items = array();
+  foreach ($values as $value) {
+    $items[] = array('value' => $value);
+  }
+  form_set_value($element, $items, $form_state);
+}
+
+/**
+ * Implements hook_field_widget_error().
+ */
+function field_test_field_widget_error($element, $error, $form, &$form_state) {
+  // @todo No easy way to differenciate widget types, we should receive it as a
+  // parameter.
+  if (isset($element['value'])) {
+    // Widget is test_field_widget.
+    $error_element = $element['value'];
+  }
+  else {
+    // Widget is test_field_widget_multiple.
+    $error_element = $element;
+  }
+
+  form_error($error_element, $error['message']);
+}
+
+/**
+ * Implements hook_field_widget_settings_form().
+ */
+function field_test_field_widget_settings_form($field, $instance) {
+  $widget = $instance['widget'];
+  $settings = $widget['settings'];
+
+  $form['test_widget_setting'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Field test field widget setting'),
+    '#default_value' => $settings['test_widget_setting'],
+    '#required' => FALSE,
+    '#description' => t('A dummy form element to simulate field widget setting.'),
+  );
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_formatter_info().
+ */
+function field_test_field_formatter_info() {
+  return array(
+    'field_test_default' => array(
+      'label' => t('Default'),
+      'description' => t('Default formatter'),
+      'field types' => array('test_field'),
+      'settings' => array(
+        'test_formatter_setting' => 'dummy test string',
+      ),
+    ),
+    'field_test_multiple' => array(
+      'label' => t('Multiple'),
+      'description' => t('Multiple formatter'),
+      'field types' => array('test_field'),
+      'settings' => array(
+        'test_formatter_setting_multiple' => 'dummy test string',
+      ),
+    ),
+    'field_test_with_prepare_view' => array(
+      'label' => t('Tests hook_field_formatter_prepare_view()'),
+      'field types' => array('test_field'),
+      'settings' => array(
+        'test_formatter_setting_additional' => 'dummy test string',
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_formatter_settings_form().
+ */
+function field_test_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $element = array();
+
+  // The name of the setting depends on the formatter type.
+  $map = array(
+    'field_test_default' => 'test_formatter_setting',
+    'field_test_multiple' => 'test_formatter_setting_multiple',
+    'field_test_with_prepare_view' => 'test_formatter_setting_additional',
+  );
+
+  if (isset($map[$display['type']])) {
+    $name = $map[$display['type']];
+
+    $element[$name] = array(
+      '#title' => t('Setting'),
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#default_value' => $settings[$name],
+      '#required' => TRUE,
+    );
+  }
+
+  return $element;
+}
+
+/**
+ * Implements hook_field_formatter_settings_summary().
+ */
+function field_test_field_formatter_settings_summary($field, $instance, $view_mode) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $summary = '';
+
+  // The name of the setting depends on the formatter type.
+  $map = array(
+    'field_test_default' => 'test_formatter_setting',
+    'field_test_multiple' => 'test_formatter_setting_multiple',
+    'field_test_with_prepare_view' => 'test_formatter_setting_additional',
+  );
+
+  if (isset($map[$display['type']])) {
+    $name = $map[$display['type']];
+    $summary = t('@setting: @value', array('@setting' => $name, '@value' => $settings[$name]));
+  }
+
+  return $summary;
+}
+
+/**
+ * Implements hook_field_formatter_prepare_view().
+ */
+function field_test_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays) {
+  foreach ($items as $id => $item) {
+    // To keep the test non-intrusive, only act on the
+    // 'field_test_with_prepare_view' formatter.
+    if ($displays[$id]['type'] == 'field_test_with_prepare_view') {
+      foreach ($item as $delta => $value) {
+        // Don't add anything on empty values.
+        if ($value) {
+          $items[$id][$delta]['additional_formatter_value'] = $value['value'] + 1;
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_formatter_view().
+ */
+function field_test_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  $element = array();
+  $settings = $display['settings'];
+
+  switch ($display['type']) {
+    case 'field_test_default':
+      foreach ($items as $delta => $item) {
+        $element[$delta] = array('#markup' => $settings['test_formatter_setting'] . '|' . $item['value']);
+      }
+      break;
+
+    case 'field_test_with_prepare_view':
+      foreach ($items as $delta => $item) {
+        $element[$delta] = array('#markup' => $settings['test_formatter_setting_additional'] . '|' . $item['value'] . '|' . $item['additional_formatter_value']);
+      }
+      break;
+
+    case 'field_test_multiple':
+      if (!empty($items)) {
+        $array = array();
+        foreach ($items as $delta => $item) {
+          $array[] = $delta . ':' . $item['value'];
+        }
+        $element[0] = array('#markup' => $settings['test_formatter_setting_multiple'] . '|' . implode('|', $array));
+      }
+      break;
+  }
+
+  return $element;
+}
+
+/**
+ * Sample 'default value' callback.
+ */
+function field_test_default_value($entity_type, $entity, $field, $instance) {
+  return array(array('value' => 99));
+}
+
+/**
+ * Implements hook_field_access().
+ */
+function field_test_field_access($op, $field, $entity_type, $entity, $account) {
+  if ($field['field_name'] == "field_no_{$op}_access") {
+    return FALSE;
+  }
+  return TRUE;
+}
diff --git a/htmltest/modules/field/tests/field_test.info b/htmltest/modules/field/tests/field_test.info
new file mode 100644
index 00000000..68e0cf41
--- /dev/null
+++ b/htmltest/modules/field/tests/field_test.info
@@ -0,0 +1,13 @@
+name = "Field API Test"
+description = "Support module for the Field API tests."
+core = 7.x
+package = Testing
+files[] = field_test.entity.inc
+version = VERSION
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/field/tests/field_test.install b/htmltest/modules/field/tests/field_test.install
new file mode 100644
index 00000000..eaf13902
--- /dev/null
+++ b/htmltest/modules/field/tests/field_test.install
@@ -0,0 +1,162 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the field_test module.
+ */
+
+/**
+ * Implements hook_install().
+ */
+function field_test_install() {
+  // hook_entity_info_alter() needs to be executed as last.
+  db_update('system')
+    ->fields(array('weight' => 1))
+    ->condition('name', 'field_test')
+    ->execute();
+}
+
+/**
+ * Implements hook_schema().
+ */
+function field_test_schema() {
+  $schema['test_entity'] = array(
+    'description' => 'The base table for test_entities.',
+    'fields' => array(
+      'ftid' => array(
+        'description' => 'The primary identifier for a test_entity.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'ftvid' => array(
+        'description' => 'The current {test_entity_revision}.ftvid version identifier.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'fttype' => array(
+        'description' => 'The type of this test_entity.',
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'ftlabel' => array(
+        'description' => 'The label of this test_entity.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+    ),
+    'unique keys' => array(
+      'ftvid' => array('ftvid'),
+    ),
+    'primary key' => array('ftid'),
+  );
+  $schema['test_entity_bundle_key'] = array(
+    'description' => 'The base table for test entities with a bundle key.',
+    'fields' => array(
+      'ftid' => array(
+        'description' => 'The primary identifier for a test_entity_bundle_key.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'fttype' => array(
+        'description' => 'The type of this test_entity.',
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => FALSE,
+        'default' => '',
+      ),
+    ),
+  );
+  $schema['test_entity_bundle'] = array(
+    'description' => 'The base table for test entities with a bundle.',
+    'fields' => array(
+      'ftid' => array(
+        'description' => 'The primary identifier for a test_entity_bundle.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+  );
+  $schema['test_entity_revision'] = array(
+    'description' => 'Stores information about each saved version of a {test_entity}.',
+    'fields' => array(
+      'ftid' => array(
+        'description' => 'The {test_entity} this version belongs to.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'ftvid' => array(
+        'description' => 'The primary identifier for this version.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+    ),
+    'indexes' => array(
+      'nid' => array('ftid'),
+    ),
+    'primary key' => array('ftvid'),
+  );
+
+  return $schema;
+}
+
+/**
+ * Implements hook_field_schema().
+ */
+function field_test_field_schema($field) {
+  if ($field['type'] == 'test_field') {
+    return array(
+      'columns' => array(
+        'value' => array(
+          'type' => 'int',
+          'size' => 'medium',
+          'not null' => FALSE,
+        ),
+      ),
+      'indexes' => array(
+        'value' => array('value'),
+      ),
+    );
+  }
+  else {
+    $foreign_keys = array();
+    // The 'foreign keys' key is not always used in tests.
+    if (!empty($field['settings']['foreign_key_name'])) {
+      $foreign_keys['foreign keys'] = array(
+      // This is a dummy foreign key definition, references a table that
+      // doesn't exist, but that's not a problem.
+      $field['settings']['foreign_key_name'] => array(
+        'table' => $field['settings']['foreign_key_name'],
+        'columns' => array($field['settings']['foreign_key_name'] => 'id'),
+        ),
+      );
+    }
+    return array(
+      'columns' => array(
+        'shape' => array(
+          'type' => 'varchar',
+          'length' => 32,
+          'not null' => FALSE,
+        ),
+        'color' => array(
+          'type' => 'varchar',
+          'length' => 32,
+          'not null' => FALSE,
+        ),
+      ),
+    ) + $foreign_keys;
+  }
+}
diff --git a/htmltest/modules/field/tests/field_test.module b/htmltest/modules/field/tests/field_test.module
new file mode 100644
index 00000000..dc2023a7
--- /dev/null
+++ b/htmltest/modules/field/tests/field_test.module
@@ -0,0 +1,269 @@
+<?php
+
+/**
+ * @file
+ * Helper module for the Field API tests.
+ *
+ * The module defines
+ * - an entity type (field_test.entity.inc)
+ * - a field type and its formatters and widgets (field_test.field.inc)
+ * - a field storage backend (field_test.storage.inc)
+ *
+ * The main field_test.module file implements generic hooks and provides some
+ * test helper functions
+ */
+
+require_once DRUPAL_ROOT . '/modules/field/tests/field_test.entity.inc';
+require_once DRUPAL_ROOT . '/modules/field/tests/field_test.field.inc';
+require_once DRUPAL_ROOT . '/modules/field/tests/field_test.storage.inc';
+
+/**
+ * Implements hook_permission().
+ */
+function field_test_permission() {
+  $perms = array(
+    'access field_test content' => array(
+      'title' => t('Access field_test content'),
+      'description' => t('View published field_test content.'),
+    ),
+    'administer field_test content' => array(
+      'title' => t('Administer field_test content'),
+      'description' => t('Manage field_test content'),
+    ),
+  );
+  return $perms;
+}
+
+/**
+ * Implements hook_menu().
+ */
+function field_test_menu() {
+  $items = array();
+  $bundles = field_info_bundles('test_entity');
+
+  foreach ($bundles as $bundle_name => $bundle_info) {
+    $bundle_url_str = str_replace('_', '-', $bundle_name);
+    $items['test-entity/add/' . $bundle_url_str] = array(
+      'title' => t('Add %bundle test_entity', array('%bundle' => $bundle_info['label'])),
+      'page callback' => 'field_test_entity_add',
+      'page arguments' => array(2),
+      'access arguments' => array('administer field_test content'),
+      'type' => MENU_NORMAL_ITEM,
+    );
+  }
+  $items['test-entity/manage/%field_test_entity_test/edit'] = array(
+    'title' => 'Edit test entity',
+    'page callback' => 'field_test_entity_edit',
+    'page arguments' => array(2),
+    'access arguments' => array('administer field_test content'),
+    'type' => MENU_NORMAL_ITEM,
+  );
+
+  $items['test-entity/nested/%field_test_entity_test/%field_test_entity_test'] = array(
+    'title' => 'Nested entity form',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('field_test_entity_nested_form', 2, 3),
+    'access arguments' => array('administer field_test content'),
+    'type' => MENU_NORMAL_ITEM,
+  );
+
+  return $items;
+}
+
+/**
+ * Generic op to test _field_invoke behavior.
+ *
+ * This simulates a field operation callback to be invoked by _field_invoke().
+ */
+function field_test_field_test_op($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  return array($langcode => hash('sha256', serialize(array($entity_type, $entity, $field['field_name'], $langcode, $items))));
+}
+
+/**
+ * Generic op to test _field_invoke_multiple behavior.
+ *
+ * This simulates a multiple field operation callback to be invoked by
+ * _field_invoke_multiple().
+ */
+function field_test_field_test_op_multiple($entity_type, $entities, $field, $instances, $langcode, &$items) {
+  $result = array();
+  foreach ($entities as $id => $entity) {
+    // Entities, instances and items are assumed to be consistently grouped by
+    // language. To verify this we try to access all the passed data structures
+    // by entity id. If they are grouped correctly, one entity, one instance and
+    // one array of items should be available for each entity id.
+    $field_name = $instances[$id]['field_name'];
+    $result[$id] = array($langcode => hash('sha256', serialize(array($entity_type, $entity, $field_name, $langcode, $items[$id]))));
+  }
+  return $result;
+}
+
+/**
+ * Implements hook_field_available_languages_alter().
+ */
+function field_test_field_available_languages_alter(&$languages, $context) {
+  if (variable_get('field_test_field_available_languages_alter', FALSE)) {
+    // Add an unavailable language.
+    $languages[] = 'xx';
+    // Remove an available language.
+    $index = array_search('en', $languages);
+    unset($languages[$index]);
+  }
+}
+
+/**
+ * Implements hook_field_language_alter().
+ */
+function field_test_field_language_alter(&$display_language, $context) {
+  if (variable_get('field_test_language_fallback', TRUE)) {
+    locale_field_language_fallback($display_language, $context['entity'], $context['language']);
+  }
+}
+
+/**
+ * Store and retrieve keyed data for later verification by unit tests.
+ *
+ * This function is a simple in-memory key-value store with the
+ * distinction that it stores all values for a given key instead of
+ * just the most recently set value. field_test module hooks call
+ * this function to record their arguments, keyed by hook name. The
+ * unit tests later call this function to verify that the correct
+ * hooks were called and were passed the correct arguments.
+ *
+ * This function ignores all calls until the first time it is called
+ * with $key of NULL. Each time it is called with $key of NULL, it
+ * erases all previously stored data from its internal cache, but also
+ * returns the previously stored data to the caller. A typical usage
+ * scenario is:
+ *
+ * @code
+ *   // calls to field_test_memorize() here are ignored
+ *
+ *   // turn on memorization
+ *   field_test_memorize();
+ *
+ *   // call some Field API functions that invoke field_test hooks
+ *   $field = field_create_field(...);
+ *
+ *   // retrieve and reset the memorized hook call data
+ *   $mem = field_test_memorize();
+ *
+ *   // make sure hook_field_create_field() is invoked correctly
+ *   assertEqual(count($mem['field_test_field_create_field']), 1);
+ *   assertEqual($mem['field_test_field_create_field'][0], array($field));
+ * @endcode
+ *
+ * @param $key
+ *   The key under which to store to $value, or NULL as described above.
+ * @param $value
+ *   A value to store for $key.
+ * @return
+ *   An array mapping each $key to an array of each $value passed in
+ *   for that key.
+ */
+function field_test_memorize($key = NULL, $value = NULL) {
+  $memorize = &drupal_static(__FUNCTION__, NULL);
+
+  if (!isset($key)) {
+    $return = $memorize;
+    $memorize = array();
+    return $return;
+  }
+  if (is_array($memorize)) {
+    $memorize[$key][] = $value;
+  }
+}
+
+/**
+ * Memorize calls to hook_field_create_field().
+ */
+function field_test_field_create_field($field) {
+  $args = func_get_args();
+  field_test_memorize(__FUNCTION__, $args);
+}
+
+/**
+ * Implements hook_entity_query_alter().
+ */
+function field_test_entity_query_alter(&$query) {
+  if (!empty($query->alterMyExecuteCallbackPlease)) {
+    $query->executeCallback = 'field_test_dummy_field_storage_query';
+  }
+}
+
+/**
+ * Pseudo-implements hook_field_storage_query().
+ */
+function field_test_dummy_field_storage_query(EntityFieldQuery $query) {
+  // Return dummy values that will be checked by the test.
+  return array(
+    'user' => array(
+      1 => entity_create_stub_entity('user', array(1, NULL, NULL)),
+    ),
+  );
+}
+
+/**
+ * Implements callback_entity_info_label().
+ *
+ * @return
+ *   The label of the entity prefixed with "label callback".
+ */
+function field_test_entity_label_callback($entity) {
+  return 'label callback ' . $entity->ftlabel;
+}
+
+/**
+ * Implements hook_field_attach_view_alter().
+ */
+function field_test_field_attach_view_alter(&$output, $context) {
+  if (!empty($context['display']['settings']['alter'])) {
+    $output['test_field'][] = array('#markup' => 'field_test_field_attach_view_alter');
+  }
+}
+
+/**
+ * Implements hook_field_widget_properties_alter().
+ */
+function field_test_field_widget_properties_alter(&$widget, $context) {
+  // Make the alter_test_text field 42 characters for nodes and comments.
+  if (in_array($context['entity_type'], array('node', 'comment')) && ($context['field']['field_name'] == 'alter_test_text')) {
+    $widget['settings']['size'] = 42;
+  }
+}
+
+/**
+ * Implements hook_field_widget_properties_ENTITY_TYPE_alter().
+ */
+function field_test_field_widget_properties_user_alter(&$widget, $context) {
+  // Always use buttons for the alter_test_options field on user forms.
+  if ($context['field']['field_name'] == 'alter_test_options') {
+    $widget['type'] = 'options_buttons';
+  }
+}
+
+/**
+ * Implements hook_field_widget_form_alter().
+ */
+function field_test_field_widget_form_alter(&$element, &$form_state, $context) {
+  switch ($context['field']['field_name']) {
+    case 'alter_test_text':
+      drupal_set_message('Field size: ' . $context['instance']['widget']['settings']['size']);
+      break;
+
+    case 'alter_test_options':
+      drupal_set_message('Widget type: ' . $context['instance']['widget']['type']);
+      break;
+  }
+}
+
+/**
+ * Implements hook_query_TAG_alter() for tag 'efq_table_prefixing_test'.
+ *
+ * @see EntityFieldQueryTestCase::testTablePrefixing()
+ */
+function field_test_query_efq_table_prefixing_test_alter(&$query) {
+  // Add an additional join onto the entity base table. This will cause an
+  // exception if the EFQ does not properly prefix the base table.
+  $query->join('test_entity','te2','%alias.ftid = test_entity.ftid');
+}
diff --git a/htmltest/modules/field/tests/field_test.storage.inc b/htmltest/modules/field/tests/field_test.storage.inc
new file mode 100644
index 00000000..a26af176
--- /dev/null
+++ b/htmltest/modules/field/tests/field_test.storage.inc
@@ -0,0 +1,473 @@
+<?php
+
+/**
+ * @file
+ * Defines a field storage backend.
+ */
+
+
+/**
+ * Implements hook_field_storage_info().
+ */
+function field_test_field_storage_info() {
+  return array(
+    'field_test_storage' => array(
+      'label' => t('Test storage'),
+      'description' => t('Dummy test storage backend. Stores field values in the variable table.'),
+    ),
+    'field_test_storage_failure' => array(
+      'label' => t('Test storage failure'),
+      'description' => t('Dummy test storage backend. Always fails to create fields.'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_storage_details().
+ */
+function field_test_field_storage_details($field) {
+  $details = array();
+
+  // Add field columns.
+  $columns = array();
+  foreach ((array) $field['columns'] as $column_name => $attributes) {
+    $columns[$column_name] = $column_name;
+  }
+  return array(
+    'drupal_variables' => array(
+      'field_test_storage_data[FIELD_LOAD_CURRENT]' => $columns,
+      'field_test_storage_data[FIELD_LOAD_REVISION]' => $columns,
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_storage_details_alter().
+ *
+ * @see FieldAttachStorageTestCase::testFieldStorageDetailsAlter()
+ */
+function field_test_field_storage_details_alter(&$details, $field) {
+
+  // For testing, storage details are changed only because of the field name.
+  if ($field['field_name'] == 'field_test_change_my_details') {
+    $columns = array();
+    foreach ((array) $field['columns'] as $column_name => $attributes) {
+      $columns[$column_name] = $column_name;
+    }
+    $details['drupal_variables'] = array(
+      FIELD_LOAD_CURRENT => array(
+        'moon' => $columns,
+      ),
+      FIELD_LOAD_REVISION => array(
+        'mars' => $columns,
+      ),
+    );
+  }
+}
+
+/**
+ * Helper function: stores or retrieves data from the 'storage backend'.
+ */
+function _field_test_storage_data($data = NULL) {
+  if (!isset($data)) {
+    return variable_get('field_test_storage_data', array());
+  }
+  else {
+    variable_set('field_test_storage_data', $data);
+  }
+}
+
+/**
+ * Implements hook_field_storage_load().
+ */
+function field_test_field_storage_load($entity_type, $entities, $age, $fields, $options) {
+  $data = _field_test_storage_data();
+
+  $load_current = $age == FIELD_LOAD_CURRENT;
+
+  foreach ($fields as $field_id => $ids) {
+    $field = field_info_field_by_id($field_id);
+    $field_name = $field['field_name'];
+    $field_data = $data[$field['id']];
+    $sub_table = $load_current ? 'current' : 'revisions';
+    $delta_count = array();
+    foreach ($field_data[$sub_table] as $row) {
+      if ($row->type == $entity_type && (!$row->deleted || $options['deleted'])) {
+        if (($load_current && in_array($row->entity_id, $ids)) || (!$load_current && in_array($row->revision_id, $ids))) {
+          if (in_array($row->language, field_available_languages($entity_type, $field))) {
+            if (!isset($delta_count[$row->entity_id][$row->language])) {
+              $delta_count[$row->entity_id][$row->language] = 0;
+            }
+            if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED || $delta_count[$row->entity_id][$row->language] < $field['cardinality']) {
+              $item = array();
+              foreach ($field['columns'] as $column => $attributes) {
+                $item[$column] = $row->{$column};
+              }
+              $entities[$row->entity_id]->{$field_name}[$row->language][] = $item;
+              $delta_count[$row->entity_id][$row->language]++;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_storage_write().
+ */
+function field_test_field_storage_write($entity_type, $entity, $op, $fields) {
+  $data = _field_test_storage_data();
+
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  foreach ($fields as $field_id) {
+    $field = field_info_field_by_id($field_id);
+    $field_name = $field['field_name'];
+    $field_data = &$data[$field_id];
+
+    $all_languages = field_available_languages($entity_type, $field);
+    $field_languages = array_intersect($all_languages, array_keys((array) $entity->$field_name));
+
+    // Delete and insert, rather than update, in case a value was added.
+    if ($op == FIELD_STORAGE_UPDATE) {
+      // Delete languages present in the incoming $entity->$field_name.
+      // Delete all languages if $entity->$field_name is empty.
+      $languages = !empty($entity->$field_name) ? $field_languages : $all_languages;
+      if ($languages) {
+        foreach ($field_data['current'] as $key => $row) {
+          if ($row->type == $entity_type && $row->entity_id == $id && in_array($row->language, $languages)) {
+            unset($field_data['current'][$key]);
+          }
+        }
+        if (isset($vid)) {
+          foreach ($field_data['revisions'] as $key => $row) {
+            if ($row->type == $entity_type && $row->revision_id == $vid) {
+              unset($field_data['revisions'][$key]);
+            }
+          }
+        }
+      }
+    }
+
+    foreach ($field_languages as $langcode) {
+      $items = (array) $entity->{$field_name}[$langcode];
+      $delta_count = 0;
+      foreach ($items as $delta => $item) {
+        $row = (object) array(
+          'field_id' => $field_id,
+          'type' => $entity_type,
+          'entity_id' => $id,
+          'revision_id' => $vid,
+          'bundle' => $bundle,
+          'delta' => $delta,
+          'deleted' => FALSE,
+          'language' => $langcode,
+        );
+        foreach ($field['columns'] as $column => $attributes) {
+          $row->{$column} = isset($item[$column]) ? $item[$column] : NULL;
+        }
+
+        $field_data['current'][] = $row;
+        if (isset($vid)) {
+          $field_data['revisions'][] = $row;
+        }
+
+        if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED && ++$delta_count == $field['cardinality']) {
+          break;
+        }
+      }
+    }
+  }
+
+  _field_test_storage_data($data);
+}
+
+/**
+ * Implements hook_field_storage_delete().
+ */
+function field_test_field_storage_delete($entity_type, $entity, $fields) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  // Note: reusing field_test_storage_purge(), like field_sql_storage.module
+  // does, is highly inefficient in our case...
+  foreach (field_info_instances($bundle) as $instance) {
+    if (isset($fields[$instance['field_id']])) {
+      $field = field_info_field_by_id($instance['field_id']);
+      field_test_field_storage_purge($entity_type, $entity, $field, $instance);
+    }
+  }
+}
+
+/**
+ * Implements hook_field_storage_purge().
+ */
+function field_test_field_storage_purge($entity_type, $entity, $field, $instance) {
+  $data = _field_test_storage_data();
+
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  $field_data = &$data[$field['id']];
+  foreach (array('current', 'revisions') as $sub_table) {
+    foreach ($field_data[$sub_table] as $key => $row) {
+      if ($row->type == $entity_type && $row->entity_id == $id) {
+        unset($field_data[$sub_table][$key]);
+      }
+    }
+  }
+
+  _field_test_storage_data($data);
+}
+
+/**
+ * Implements hook_field_storage_delete_revision().
+ */
+function field_test_field_storage_delete_revision($entity_type, $entity, $fields) {
+  $data = _field_test_storage_data();
+
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+  foreach ($fields as $field_id) {
+    $field_data = &$data[$field_id];
+    foreach (array('current', 'revisions') as $sub_table) {
+      foreach ($field_data[$sub_table] as $key => $row) {
+        if ($row->type == $entity_type && $row->entity_id == $id && $row->revision_id == $vid) {
+          unset($field_data[$sub_table][$key]);
+        }
+      }
+    }
+  }
+
+  _field_test_storage_data($data);
+}
+
+/**
+ * Implements hook_field_storage_query().
+ */
+function field_test_field_storage_query($field_id, $conditions, $count, &$cursor = NULL, $age) {
+  $data = _field_test_storage_data();
+
+  $load_current = $age == FIELD_LOAD_CURRENT;
+
+  $field = field_info_field_by_id($field_id);
+  $field_columns = array_keys($field['columns']);
+
+  $field_data = $data[$field['id']];
+  $sub_table = $load_current ? 'current' : 'revisions';
+  // We need to sort records by entity type and entity id.
+  usort($field_data[$sub_table], '_field_test_field_storage_query_sort_helper');
+
+    // Initialize results array.
+  $return = array();
+  $entity_count = 0;
+  $rows_count = 0;
+  $rows_total = count($field_data[$sub_table]);
+  $skip = $cursor;
+  $skipped = 0;
+
+  foreach ($field_data[$sub_table] as $row) {
+    if ($count != FIELD_QUERY_NO_LIMIT && $entity_count >= $count) {
+      break;
+    }
+
+    if ($row->field_id == $field['id']) {
+      $match = TRUE;
+      $condition_deleted = FALSE;
+      // Add conditions.
+      foreach ($conditions as $condition) {
+        @list($column, $value, $operator) = $condition;
+        if (empty($operator)) {
+          $operator = is_array($value) ? 'IN' : '=';
+        }
+        switch ($operator) {
+          case '=':
+            $match = $match && $row->{$column} == $value;
+            break;
+          case '<>':
+          case '<':
+          case '<=':
+          case '>':
+          case '>=':
+            eval('$match = $match && ' . $row->{$column} . ' ' . $operator . ' '. $value);
+            break;
+          case 'IN':
+            $match = $match && in_array($row->{$column}, $value);
+            break;
+          case 'NOT IN':
+            $match = $match && !in_array($row->{$column}, $value);
+            break;
+          case 'BETWEEN':
+            $match = $match && $row->{$column} >= $value[0] && $row->{$column} <= $value[1];
+            break;
+          case 'STARTS_WITH':
+          case 'ENDS_WITH':
+          case 'CONTAINS':
+            // Not supported.
+            $match = FALSE;
+            break;
+        }
+        // Track condition on 'deleted'.
+        if ($column == 'deleted') {
+          $condition_deleted = TRUE;
+        }
+      }
+
+      // Exclude deleted data unless we have a condition on it.
+      if (!$condition_deleted && $row->deleted) {
+        $match = FALSE;
+      }
+
+      if ($match) {
+        if (!isset($skip) || $skipped >= $skip) {
+          $cursor++;
+          // If querying all revisions and the entity type has revisions, we need
+          // to key the results by revision_ids.
+          $entity_type = entity_get_info($row->type);
+          $id = ($load_current || empty($entity_type['entity keys']['revision'])) ? $row->entity_id : $row->revision_id;
+
+          if (!isset($return[$row->type][$id])) {
+            $return[$row->type][$id] = entity_create_stub_entity($row->type, array($row->entity_id, $row->revision_id, $row->bundle));
+            $entity_count++;
+          }
+        }
+        else {
+          $skipped++;
+        }
+      }
+    }
+    $rows_count++;
+
+    // The query is complete if we walked the whole array.
+    if ($count != FIELD_QUERY_NO_LIMIT && $rows_count >= $rows_total) {
+      $cursor = FIELD_QUERY_COMPLETE;
+    }
+  }
+
+  return $return;
+}
+
+/**
+ * Sort helper for field_test_field_storage_query().
+ *
+ * Sorts by entity type and entity id.
+ */
+function _field_test_field_storage_query_sort_helper($a, $b) {
+  if ($a->type == $b->type) {
+    if ($a->entity_id == $b->entity_id) {
+      return 0;
+    }
+    else {
+      return $a->entity_id < $b->entity_id ? -1 : 1;
+    }
+  }
+  else {
+    return $a->type < $b->type ? -1 : 1;
+  }
+}
+
+/**
+ * Implements hook_field_storage_create_field().
+ */
+function field_test_field_storage_create_field($field) {
+  if ($field['storage']['type'] == 'field_test_storage_failure') {
+    throw new Exception('field_test_storage_failure engine always fails to create fields');
+  }
+
+  $data = _field_test_storage_data();
+
+  $data[$field['id']] = array(
+    'current' => array(),
+    'revisions' => array(),
+  );
+
+  _field_test_storage_data($data);
+}
+
+/**
+ * Implements hook_field_storage_delete_field().
+ */
+function field_test_field_storage_delete_field($field) {
+  $data = _field_test_storage_data();
+
+  $field_data = &$data[$field['id']];
+  foreach (array('current', 'revisions') as $sub_table) {
+    foreach ($field_data[$sub_table] as &$row) {
+      $row->deleted = TRUE;
+    }
+  }
+
+  _field_test_storage_data($data);
+}
+
+/**
+ * Implements hook_field_storage_delete_instance().
+ */
+function field_test_field_storage_delete_instance($instance) {
+  $data = _field_test_storage_data();
+
+  $field = field_info_field($instance['field_name']);
+  $field_data = &$data[$field['id']];
+  foreach (array('current', 'revisions') as $sub_table) {
+    foreach ($field_data[$sub_table] as &$row) {
+      if ($row->bundle == $instance['bundle']) {
+        $row->deleted = TRUE;
+      }
+    }
+  }
+
+  _field_test_storage_data($data);
+}
+
+/**
+ * Implements hook_field_attach_create_bundle().
+ */
+function field_test_field_attach_create_bundle($bundle) {
+  // We don't need to do anything here.
+}
+
+/**
+ * Implements hook_field_attach_rename_bundle().
+ */
+function field_test_field_attach_rename_bundle($bundle_old, $bundle_new) {
+  $data = _field_test_storage_data();
+
+  // We need to account for deleted or inactive fields and instances.
+  $instances = field_read_instances(array('bundle' => $bundle_new), array('include_deleted' => TRUE, 'include_inactive' => TRUE));
+  foreach ($instances as $field_name => $instance) {
+    $field = field_info_field_by_id($instance['field_id']);
+    if ($field['storage']['type'] == 'field_test_storage') {
+      $field_data = &$data[$field['id']];
+      foreach (array('current', 'revisions') as $sub_table) {
+        foreach ($field_data[$sub_table] as &$row) {
+          if ($row->bundle == $bundle_old) {
+            $row->bundle = $bundle_new;
+          }
+        }
+      }
+    }
+  }
+
+  _field_test_storage_data($data);
+}
+
+/**
+ * Implements hook_field_attach_delete_bundle().
+ */
+function field_test_field_attach_delete_bundle($entity_type, $bundle, $instances) {
+  $data = _field_test_storage_data();
+
+  foreach ($instances as $field_name => $instance) {
+    $field = field_info_field($field_name);
+    if ($field['storage']['type'] == 'field_test_storage') {
+      $field_data = &$data[$field['id']];
+      foreach (array('current', 'revisions') as $sub_table) {
+        foreach ($field_data[$sub_table] as &$row) {
+          if ($row->bundle == $bundle_old) {
+            $row->deleted = TRUE;
+          }
+        }
+      }
+    }
+  }
+
+  _field_test_storage_data($data);
+}
diff --git a/htmltest/modules/field/theme/field-rtl.css b/htmltest/modules/field/theme/field-rtl.css
new file mode 100644
index 00000000..5d35a86a
--- /dev/null
+++ b/htmltest/modules/field/theme/field-rtl.css
@@ -0,0 +1,14 @@
+
+form .field-multiple-table th.field-label {
+  padding-right: 0;
+}
+form .field-multiple-table td.field-multiple-drag {
+  padding-left: 0;
+}
+form .field-multiple-table td.field-multiple-drag a.tabledrag-handle{
+  padding-left: .5em;
+}
+.field-label-inline .field-label,
+.field-label-inline .field-items {
+  float: right;
+}
diff --git a/htmltest/modules/field/theme/field.css b/htmltest/modules/field/theme/field.css
new file mode 100644
index 00000000..9eba32f0
--- /dev/null
+++ b/htmltest/modules/field/theme/field.css
@@ -0,0 +1,28 @@
+
+/* Field display */
+.field .field-label {
+  font-weight: bold;
+}
+.field-label-inline .field-label,
+.field-label-inline .field-items {
+  float:left; /*LTR*/
+}
+
+/* Form display */
+form .field-multiple-table {
+  margin: 0;
+}
+form .field-multiple-table th.field-label {
+  padding-left: 0; /*LTR*/
+}
+form .field-multiple-table td.field-multiple-drag {
+  width: 30px;
+  padding-right: 0; /*LTR*/
+}
+form .field-multiple-table td.field-multiple-drag a.tabledrag-handle {
+  padding-right: .5em; /*LTR*/
+}
+
+form .field-add-more-submit {
+  margin: .5em 0 0;
+}
diff --git a/htmltest/modules/field/theme/field.tpl.php b/htmltest/modules/field/theme/field.tpl.php
new file mode 100644
index 00000000..f0f9d583
--- /dev/null
+++ b/htmltest/modules/field/theme/field.tpl.php
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * @file field.tpl.php
+ * Default template implementation to display the value of a field.
+ *
+ * This file is not used and is here as a starting point for customization only.
+ * @see theme_field()
+ *
+ * Available variables:
+ * - $items: An array of field values. Use render() to output them.
+ * - $label: The item label.
+ * - $label_hidden: Whether the label display is set to 'hidden'.
+ * - $classes: String of classes that can be used to style contextually through
+ *   CSS. It can be manipulated through the variable $classes_array from
+ *   preprocess functions. The default values can be one or more of the
+ *   following:
+ *   - field: The current template type, i.e., "theming hook".
+ *   - field-name-[field_name]: The current field name. For example, if the
+ *     field name is "field_description" it would result in
+ *     "field-name-field-description".
+ *   - field-type-[field_type]: The current field type. For example, if the
+ *     field type is "text" it would result in "field-type-text".
+ *   - field-label-[label_display]: The current label position. For example, if
+ *     the label position is "above" it would result in "field-label-above".
+ *
+ * Other variables:
+ * - $element['#object']: The entity to which the field is attached.
+ * - $element['#view_mode']: View mode, e.g. 'full', 'teaser'...
+ * - $element['#field_name']: The field name.
+ * - $element['#field_type']: The field type.
+ * - $element['#field_language']: The field language.
+ * - $element['#field_translatable']: Whether the field is translatable or not.
+ * - $element['#label_display']: Position of label display, inline, above, or
+ *   hidden.
+ * - $field_name_css: The css-compatible field name.
+ * - $field_type_css: The css-compatible field type.
+ * - $classes_array: Array of html class attribute values. It is flattened
+ *   into a string within the variable $classes.
+ *
+ * @see template_preprocess_field()
+ * @see theme_field()
+ *
+ * @ingroup themeable
+ */
+?>
+<!--
+THIS FILE IS NOT USED AND IS HERE AS A STARTING POINT FOR CUSTOMIZATION ONLY.
+See http://api.drupal.org/api/function/theme_field/7 for details.
+After copying this file to your theme's folder and customizing it, remove this
+HTML comment.
+-->
+<div class="<?php print $classes; ?>"<?php print $attributes; ?>>
+  <?php if (!$label_hidden): ?>
+    <div class="field-label"<?php print $title_attributes; ?>><?php print $label ?>:&nbsp;</div>
+  <?php endif; ?>
+  <div class="field-items"<?php print $content_attributes; ?>>
+    <?php foreach ($items as $delta => $item): ?>
+      <div class="field-item <?php print $delta % 2 ? 'odd' : 'even'; ?>"<?php print $item_attributes[$delta]; ?>><?php print render($item); ?></div>
+    <?php endforeach; ?>
+  </div>
+</div>
diff --git a/htmltest/modules/field_ui/field_ui-rtl.css b/htmltest/modules/field_ui/field_ui-rtl.css
new file mode 100644
index 00000000..1066baa2
--- /dev/null
+++ b/htmltest/modules/field_ui/field_ui-rtl.css
@@ -0,0 +1,9 @@
+/**
+ * @file
+ * Right-to-left specific stylesheet for the Field UI module.
+ */
+
+/* 'Manage fields' overview */
+table.field-ui-overview tr.add-new .label-input {
+  float: right;
+}
diff --git a/htmltest/modules/field_ui/field_ui.admin.inc b/htmltest/modules/field_ui/field_ui.admin.inc
new file mode 100644
index 00000000..5c6f5299
--- /dev/null
+++ b/htmltest/modules/field_ui/field_ui.admin.inc
@@ -0,0 +1,2112 @@
+<?php
+
+/**
+ * @file
+ * Administrative interface for custom field type creation.
+ */
+
+/**
+ * Menu callback; lists all defined fields for quick reference.
+ */
+function field_ui_fields_list() {
+  $instances = field_info_instances();
+  $field_types = field_info_field_types();
+  $bundles = field_info_bundles();
+
+  $modules = system_rebuild_module_data();
+
+  $header = array(t('Field name'), t('Field type'), t('Used in'));
+  $rows = array();
+  foreach ($instances as $entity_type => $type_bundles) {
+    foreach ($type_bundles as $bundle => $bundle_instances) {
+      foreach ($bundle_instances as $field_name => $instance) {
+        $field = field_info_field($field_name);
+
+        // Initialize the row if we encounter the field for the first time.
+        if (!isset($rows[$field_name])) {
+          $rows[$field_name]['class'] = $field['locked'] ? array('menu-disabled') : array('');
+          $rows[$field_name]['data'][0] = $field['locked'] ? t('@field_name (Locked)', array('@field_name' => $field_name)) : $field_name;
+          $module_name = $field_types[$field['type']]['module'];
+          $rows[$field_name]['data'][1] = $field_types[$field['type']]['label'] . ' ' . t('(module: !module)', array('!module' => $modules[$module_name]->info['name']));
+        }
+
+        // Add the current instance.
+        $admin_path = _field_ui_bundle_admin_path($entity_type, $bundle);
+        $rows[$field_name]['data'][2][] = $admin_path ? l($bundles[$entity_type][$bundle]['label'], $admin_path . '/fields') : $bundles[$entity_type][$bundle]['label'];
+      }
+    }
+  }
+  foreach ($rows as $field_name => $cell) {
+    $rows[$field_name]['data'][2] = implode(', ', $cell['data'][2]);
+  }
+  if (empty($rows)) {
+    $output = t('No fields have been defined yet.');
+  }
+  else {
+    // Sort rows by field name.
+    ksort($rows);
+    $output = theme('table', array('header' => $header, 'rows' => $rows));
+  }
+  return $output;
+}
+
+/**
+ * Displays a message listing the inactive fields of a given bundle.
+ */
+function field_ui_inactive_message($entity_type, $bundle) {
+  $inactive_instances = field_ui_inactive_instances($entity_type, $bundle);
+  if (!empty($inactive_instances)) {
+    $field_types = field_info_field_types();
+    $widget_types = field_info_widget_types();
+
+    foreach ($inactive_instances as $field_name => $instance) {
+      $list[] = t('%field (@field_name) field requires the %widget_type widget provided by %widget_module module', array(
+      '%field' => $instance['label'],
+      '@field_name' => $instance['field_name'],
+      '%widget_type' => isset($widget_types[$instance['widget']['type']]) ? $widget_types[$instance['widget']['type']]['label'] : $instance['widget']['type'],
+      '%widget_module' => $instance['widget']['module'],
+      ));
+    }
+    drupal_set_message(t('Inactive fields are not shown unless their providing modules are enabled. The following fields are not enabled: !list', array('!list' => theme('item_list', array('items' => $list)))), 'error');
+  }
+}
+
+/**
+ * Determines the rendering order of an array representing a tree.
+ *
+ * Callback for array_reduce() within field_ui_table_pre_render().
+ */
+function _field_ui_reduce_order($array, $a) {
+  $array = !isset($array) ? array() : $array;
+  if ($a['name']) {
+    $array[] = $a['name'];
+  }
+  if (!empty($a['children'])) {
+    uasort($a['children'], 'drupal_sort_weight');
+    $array = array_merge($array, array_reduce($a['children'], '_field_ui_reduce_order'));
+  }
+  return $array;
+}
+
+/**
+ * Returns the region to which a row in the 'Manage fields' screen belongs.
+ *
+ * This function is used as a #region_callback in
+ * field_ui_field_overview_form(). It is called during
+ * field_ui_table_pre_render().
+ */
+function field_ui_field_overview_row_region($row) {
+  switch ($row['#row_type']) {
+    case 'field':
+    case 'extra_field':
+      return 'main';
+    case 'add_new_field':
+      // If no input in 'label', assume the row has not been dragged out of the
+      // 'add new' section.
+      return (!empty($row['label']['#value']) ? 'main' : 'add_new');
+  }
+}
+
+/**
+ * Returns the region to which a row in the 'Manage display' screen belongs.
+ *
+ * This function is used as a #region_callback in
+ * field_ui_field_overview_form(), and is called during
+ * field_ui_table_pre_render().
+ */
+function field_ui_display_overview_row_region($row) {
+  switch ($row['#row_type']) {
+    case 'field':
+    case 'extra_field':
+      return ($row['format']['type']['#value'] == 'hidden' ? 'hidden' : 'visible');
+  }
+}
+
+/**
+ * Pre-render callback for field_ui_table elements.
+ */
+function field_ui_table_pre_render($elements) {
+  $js_settings = array();
+
+  // For each region, build the tree structure from the weight and parenting
+  // data contained in the flat form structure, to determine row order and
+  // indentation.
+  $regions = $elements['#regions'];
+  $tree = array('' => array('name' => '', 'children' => array()));
+  $trees = array_fill_keys(array_keys($regions), $tree);
+
+  $parents = array();
+  $list = drupal_map_assoc(element_children($elements));
+
+  // Iterate on rows until we can build a known tree path for all of them.
+  while ($list) {
+    foreach ($list as $name) {
+      $row = &$elements[$name];
+      $parent = $row['parent_wrapper']['parent']['#value'];
+      // Proceed if parent is known.
+      if (empty($parent) || isset($parents[$parent])) {
+        // Grab parent, and remove the row from the next iteration.
+        $parents[$name] = $parent ? array_merge($parents[$parent], array($parent)) : array();
+        unset($list[$name]);
+
+        // Determine the region for the row.
+        $function = $row['#region_callback'];
+        $region_name = $function($row);
+
+        // Add the element in the tree.
+        $target = &$trees[$region_name][''];
+        foreach ($parents[$name] as $key) {
+          $target = &$target['children'][$key];
+        }
+        $target['children'][$name] = array('name' => $name, 'weight' => $row['weight']['#value']);
+
+        // Add tabledrag indentation to the first row cell.
+        if ($depth = count($parents[$name])) {
+          $children = element_children($row);
+          $cell = current($children);
+          $row[$cell]['#prefix'] = theme('indentation', array('size' => $depth)) . (isset($row[$cell]['#prefix']) ? $row[$cell]['#prefix'] : '');
+        }
+
+        // Add row id and associate JS settings.
+        $id = drupal_html_class($name);
+        $row['#attributes']['id'] = $id;
+        if (isset($row['#js_settings'])) {
+          $row['#js_settings'] += array(
+            'rowHandler' => $row['#row_type'],
+            'name' => $name,
+            'region' => $region_name,
+          );
+          $js_settings[$id] = $row['#js_settings'];
+        }
+      }
+    }
+  }
+  // Determine rendering order from the tree structure.
+  foreach ($regions as $region_name => $region) {
+    $elements['#regions'][$region_name]['rows_order'] = array_reduce($trees[$region_name], '_field_ui_reduce_order');
+  }
+
+  $elements['#attached']['js'][] = array(
+    'type' => 'setting',
+    'data' => array('fieldUIRowsData' => $js_settings),
+  );
+
+  return $elements;
+}
+
+/**
+ * Returns HTML for Field UI overview tables.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - elements: An associative array containing a Form API structure to be
+ *     rendered as a table.
+ *
+ * @ingroup themeable
+ */
+function theme_field_ui_table($variables) {
+  $elements = $variables['elements'];
+  $table = array();
+  $js_settings = array();
+
+  // Add table headers and attributes.
+  foreach (array('header', 'attributes') as $key) {
+    if (isset($elements["#$key"])) {
+      $table[$key] = $elements["#$key"];
+    }
+  }
+
+  // Determine the colspan to use for region rows, by checking the number of
+  // columns in the headers.
+  $columns_count = 0;
+  foreach ($table['header'] as $header) {
+    $columns_count += (is_array($header) && isset($header['colspan']) ? $header['colspan'] : 1);
+  }
+
+  // Render rows, region by region.
+  foreach ($elements['#regions'] as $region_name => $region) {
+    $region_name_class = drupal_html_class($region_name);
+
+    // Add region rows.
+    if (isset($region['title'])) {
+      $table['rows'][] = array(
+        'class' => array('region-title', 'region-' . $region_name_class . '-title'),
+        'no_striping' => TRUE,
+        'data' => array(
+          array('data' => $region['title'], 'colspan' => $columns_count),
+        ),
+      );
+    }
+    if (isset($region['message'])) {
+      $class = (empty($region['rows_order']) ? 'region-empty' : 'region-populated');
+      $table['rows'][] = array(
+        'class' => array('region-message', 'region-' . $region_name_class . '-message', $class),
+        'no_striping' => TRUE,
+        'data' => array(
+          array('data' => $region['message'], 'colspan' => $columns_count),
+        ),
+      );
+    }
+
+    // Add form rows, in the order determined at pre-render time.
+    foreach ($region['rows_order'] as $name) {
+      $element = $elements[$name];
+
+      $row = array('data' => array());
+      if (isset($element['#attributes'])) {
+        $row += $element['#attributes'];
+      }
+
+      // Render children as table cells.
+      foreach (element_children($element) as $cell_key) {
+        $child = &$element[$cell_key];
+        // Do not render a cell for children of #type 'value'.
+        if (!(isset($child['#type']) && $child['#type'] == 'value')) {
+          $cell = array('data' => drupal_render($child));
+          if (isset($child['#cell_attributes'])) {
+            $cell += $child['#cell_attributes'];
+          }
+          $row['data'][] = $cell;
+        }
+      }
+      $table['rows'][] = $row;
+    }
+  }
+
+  return theme('table', $table);
+}
+
+/**
+ * Form constructor for the 'Manage fields' form of a bundle.
+ *
+ * Allows fields and pseudo-fields to be re-ordered.
+ *
+ * @see field_ui_field_overview_form_validate()
+ * @see field_ui_field_overview_form_submit()
+ * @ingroup forms
+ */
+function field_ui_field_overview_form($form, &$form_state, $entity_type, $bundle) {
+  $bundle = field_extract_bundle($entity_type, $bundle);
+
+  field_ui_inactive_message($entity_type, $bundle);
+  $admin_path = _field_ui_bundle_admin_path($entity_type, $bundle);
+
+  // When displaying the form, make sure the list of fields is up-to-date.
+  if (empty($form_state['post'])) {
+    field_info_cache_clear();
+  }
+
+  // Gather bundle information.
+  $instances = field_info_instances($entity_type, $bundle);
+  $field_types = field_info_field_types();
+  $widget_types = field_info_widget_types();
+
+  $extra_fields = field_info_extra_fields($entity_type, $bundle, 'form');
+
+  $form += array(
+    '#entity_type' => $entity_type,
+    '#bundle' => $bundle,
+    '#fields' => array_keys($instances),
+    '#extra' => array_keys($extra_fields),
+  );
+
+  $table = array(
+    '#type' => 'field_ui_table',
+    '#tree' => TRUE,
+    '#header' => array(
+      t('Label'),
+      t('Weight'),
+      t('Parent'),
+      t('Machine name'),
+      t('Field type'),
+      t('Widget'),
+      array('data' => t('Operations'), 'colspan' => 2),
+    ),
+    '#parent_options' => array(),
+    '#regions' => array(
+      'main' => array('message' => t('No fields are present yet.')),
+      'add_new' => array('title' => '&nbsp;'),
+    ),
+    '#attributes' => array(
+      'class' => array('field-ui-overview'),
+      'id' => 'field-overview',
+    ),
+  );
+
+  // Fields.
+  foreach ($instances as $name => $instance) {
+    $field = field_info_field($instance['field_name']);
+    $admin_field_path = $admin_path . '/fields/' . $instance['field_name'];
+    $table[$name] = array(
+      '#attributes' => array('class' => array('draggable', 'tabledrag-leaf')),
+      '#row_type' => 'field',
+      '#region_callback' => 'field_ui_field_overview_row_region',
+      'label' => array(
+        '#markup' => check_plain($instance['label']),
+      ),
+      'weight' => array(
+        '#type' => 'textfield',
+        '#title' => t('Weight for @title', array('@title' => $instance['label'])),
+        '#title_display' => 'invisible',
+        '#default_value' => $instance['widget']['weight'],
+        '#size' => 3,
+        '#attributes' => array('class' => array('field-weight')),
+       ),
+      'parent_wrapper' => array(
+        'parent' => array(
+          '#type' => 'select',
+          '#title' => t('Parent for @title', array('@title' => $instance['label'])),
+          '#title_display' => 'invisible',
+          '#options' => $table['#parent_options'],
+          '#empty_value' => '',
+          '#attributes' => array('class' => array('field-parent')),
+          '#parents' => array('fields', $name, 'parent'),
+        ),
+        'hidden_name' => array(
+          '#type' => 'hidden',
+          '#default_value' => $name,
+          '#attributes' => array('class' => array('field-name')),
+        ),
+      ),
+      'field_name' => array(
+        '#markup' => $instance['field_name'],
+      ),
+      'type' => array(
+        '#type' => 'link',
+        '#title' => t($field_types[$field['type']]['label']),
+        '#href' => $admin_field_path . '/field-settings',
+        '#options' => array('attributes' => array('title' => t('Edit field settings.'))),
+      ),
+      'widget_type' => array(
+        '#type' => 'link',
+        '#title' => t($widget_types[$instance['widget']['type']]['label']),
+        '#href' => $admin_field_path . '/widget-type',
+        '#options' => array('attributes' => array('title' => t('Change widget type.'))),
+      ),
+      'edit' => array(
+        '#type' => 'link',
+        '#title' => t('edit'),
+        '#href' => $admin_field_path,
+        '#options' => array('attributes' => array('title' => t('Edit instance settings.'))),
+      ),
+      'delete' => array(
+        '#type' => 'link',
+        '#title' => t('delete'),
+        '#href' => $admin_field_path . '/delete',
+        '#options' => array('attributes' => array('title' => t('Delete instance.'))),
+      ),
+    );
+
+    if (!empty($instance['locked'])) {
+      $table[$name]['edit'] = array('#value' => t('Locked'));
+      $table[$name]['delete'] = array();
+      $table[$name]['#attributes']['class'][] = 'menu-disabled';
+    }
+  }
+
+  // Non-field elements.
+  foreach ($extra_fields as $name => $extra_field) {
+    $table[$name] = array(
+      '#attributes' => array('class' => array('draggable', 'tabledrag-leaf')),
+      '#row_type' => 'extra_field',
+      '#region_callback' => 'field_ui_field_overview_row_region',
+      'label' => array(
+        '#markup' => check_plain($extra_field['label']),
+      ),
+      'weight' => array(
+        '#type' => 'textfield',
+        '#default_value' => $extra_field['weight'],
+        '#size' => 3,
+        '#attributes' => array('class' => array('field-weight')),
+        '#title_display' => 'invisible',
+        '#title' => t('Weight for @title', array('@title' => $extra_field['label'])),
+      ),
+      'parent_wrapper' => array(
+        'parent' => array(
+          '#type' => 'select',
+          '#title' => t('Parent for @title', array('@title' => $extra_field['label'])),
+          '#title_display' => 'invisible',
+          '#options' => $table['#parent_options'],
+          '#empty_value' => '',
+          '#attributes' => array('class' => array('field-parent')),
+          '#parents' => array('fields', $name, 'parent'),
+        ),
+        'hidden_name' => array(
+          '#type' => 'hidden',
+          '#default_value' => $name,
+          '#attributes' => array('class' => array('field-name')),
+        ),
+      ),
+      'field_name' => array(
+        '#markup' => $name,
+      ),
+      'type' => array(
+        '#markup' => isset($extra_field['description']) ? $extra_field['description'] : '',
+        '#cell_attributes' => array('colspan' => 2),
+      ),
+      'edit' => array(
+        '#markup' => isset($extra_field['edit']) ? $extra_field['edit'] : '',
+      ),
+      'delete' => array(
+        '#markup' => isset($extra_field['delete']) ? $extra_field['delete'] : '',
+      ),
+    );
+  }
+
+  // Additional row: add new field.
+  $max_weight = field_info_max_weight($entity_type, $bundle, 'form');
+  $field_type_options = field_ui_field_type_options();
+  $widget_type_options = field_ui_widget_type_options(NULL, TRUE);
+  if ($field_type_options && $widget_type_options) {
+    $name = '_add_new_field';
+    $table[$name] = array(
+      '#attributes' => array('class' => array('draggable', 'tabledrag-leaf', 'add-new')),
+      '#row_type' => 'add_new_field',
+      '#region_callback' => 'field_ui_field_overview_row_region',
+      'label' => array(
+        '#type' => 'textfield',
+        '#title' => t('New field label'),
+        '#title_display' => 'invisible',
+        '#size' => 15,
+        '#description' => t('Label'),
+        '#prefix' => '<div class="label-input"><div class="add-new-placeholder">' . t('Add new field') .'</div>',
+        '#suffix' => '</div>',
+      ),
+      'weight' => array(
+        '#type' => 'textfield',
+        '#default_value' => $max_weight + 1,
+        '#size' => 3,
+        '#title_display' => 'invisible',
+        '#title' => t('Weight for new field'),
+        '#attributes' => array('class' => array('field-weight')),
+        '#prefix' => '<div class="add-new-placeholder">&nbsp;</div>',
+      ),
+      'parent_wrapper' => array(
+        'parent' => array(
+          '#type' => 'select',
+          '#title' => t('Parent for new field'),
+          '#title_display' => 'invisible',
+          '#options' => $table['#parent_options'],
+          '#empty_value' => '',
+          '#attributes' => array('class' => array('field-parent')),
+          '#prefix' => '<div class="add-new-placeholder">&nbsp;</div>',
+          '#parents' => array('fields', $name, 'parent'),
+        ),
+        'hidden_name' => array(
+          '#type' => 'hidden',
+          '#default_value' => $name,
+          '#attributes' => array('class' => array('field-name')),
+        ),
+      ),
+      'field_name' => array(
+        '#type' => 'machine_name',
+        '#title' => t('New field name'),
+        '#title_display' => 'invisible',
+        // This field should stay LTR even for RTL languages.
+        '#field_prefix' => '<span dir="ltr">field_',
+        '#field_suffix' => '</span>&lrm;',
+        '#size' => 15,
+        '#description' => t('A unique machine-readable name containing letters, numbers, and underscores.'),
+        // 32 characters minus the 'field_' prefix.
+        '#maxlength' => 26,
+        '#prefix' => '<div class="add-new-placeholder">&nbsp;</div>',
+        '#machine_name' => array(
+          'source' => array('fields', $name, 'label'),
+          'exists' => '_field_ui_field_name_exists',
+          'standalone' => TRUE,
+          'label' => '',
+        ),
+        '#required' => FALSE,
+      ),
+      'type' => array(
+        '#type' => 'select',
+        '#title' => t('Type of new field'),
+        '#title_display' => 'invisible',
+        '#options' => $field_type_options,
+        '#empty_option' => t('- Select a field type -'),
+        '#description' => t('Type of data to store.'),
+        '#attributes' => array('class' => array('field-type-select')),
+        '#prefix' => '<div class="add-new-placeholder">&nbsp;</div>',
+      ),
+      'widget_type' => array(
+        '#type' => 'select',
+        '#title' => t('Widget for new field'),
+        '#title_display' => 'invisible',
+        '#options' => $widget_type_options,
+        '#empty_option' => t('- Select a widget -'),
+        '#description' => t('Form element to edit the data.'),
+        '#attributes' => array('class' => array('widget-type-select')),
+        '#cell_attributes' => array('colspan' => 3),
+        '#prefix' => '<div class="add-new-placeholder">&nbsp;</div>',
+      ),
+      // Place the 'translatable' property as an explicit value so that contrib
+      // modules can form_alter() the value for newly created fields.
+      'translatable' => array(
+        '#type' => 'value',
+        '#value' => FALSE,
+      ),
+    );
+  }
+
+  // Additional row: add existing field.
+  $existing_fields = field_ui_existing_field_options($entity_type, $bundle);
+  if ($existing_fields && $widget_type_options) {
+    // Build list of options.
+    $existing_field_options = array();
+    foreach ($existing_fields as $field_name => $info) {
+      $text = t('@type: @field (@label)', array(
+        '@type' => $info['type_label'],
+        '@label' => $info['label'],
+        '@field' => $info['field'],
+      ));
+      $existing_field_options[$field_name] = truncate_utf8($text, 80, FALSE, TRUE);
+    }
+    asort($existing_field_options);
+    $name = '_add_existing_field';
+    $table[$name] = array(
+      '#attributes' => array('class' => array('draggable', 'tabledrag-leaf', 'add-new')),
+      '#row_type' => 'add_new_field',
+      '#region_callback' => 'field_ui_field_overview_row_region',
+      'label' => array(
+        '#type' => 'textfield',
+        '#title' => t('Existing field label'),
+        '#title_display' => 'invisible',
+        '#size' => 15,
+        '#description' => t('Label'),
+        '#attributes' => array('class' => array('label-textfield')),
+        '#prefix' => '<div class="label-input"><div class="add-new-placeholder">' . t('Add existing field') .'</div>',
+        '#suffix' => '</div>',
+      ),
+      'weight' => array(
+        '#type' => 'textfield',
+        '#default_value' => $max_weight + 2,
+        '#size' => 3,
+        '#title_display' => 'invisible',
+        '#title' => t('Weight for added field'),
+        '#attributes' => array('class' => array('field-weight')),
+        '#prefix' => '<div class="add-new-placeholder">&nbsp;</div>',
+      ),
+      'parent_wrapper' => array(
+        'parent' => array(
+          '#type' => 'select',
+          '#title' => t('Parent for existing field'),
+          '#title_display' => 'invisible',
+          '#options' => $table['#parent_options'],
+          '#empty_value' => '',
+          '#attributes' => array('class' => array('field-parent')),
+          '#prefix' => '<div class="add-new-placeholder">&nbsp;</div>',
+          '#parents' => array('fields', $name, 'parent'),
+        ),
+        'hidden_name' => array(
+          '#type' => 'hidden',
+          '#default_value' => $name,
+          '#attributes' => array('class' => array('field-name')),
+        ),
+      ),
+      'field_name' => array(
+        '#type' => 'select',
+        '#title' => t('Existing field to share'),
+        '#title_display' => 'invisible',
+        '#options' => $existing_field_options,
+        '#empty_option' => t('- Select an existing field -'),
+        '#description' => t('Field to share'),
+        '#attributes' => array('class' => array('field-select')),
+        '#cell_attributes' => array('colspan' => 2),
+        '#prefix' => '<div class="add-new-placeholder">&nbsp;</div>',
+      ),
+      'widget_type' => array(
+        '#type' => 'select',
+        '#title' => t('Widget for existing field'),
+        '#title_display' => 'invisible',
+        '#options' => $widget_type_options,
+        '#empty_option' => t('- Select a widget -'),
+        '#description' => t('Form element to edit the data.'),
+        '#attributes' => array('class' => array('widget-type-select')),
+        '#cell_attributes' => array('colspan' => 3),
+        '#prefix' => '<div class="add-new-placeholder">&nbsp;</div>',
+      ),
+    );
+  }
+  $form['fields'] = $table;
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save'));
+
+  $form['#attached']['css'][] = drupal_get_path('module', 'field_ui') . '/field_ui.css';
+  $form['#attached']['js'][] = drupal_get_path('module', 'field_ui') . '/field_ui.js';
+
+  // Add settings for the update selects behavior.
+  $js_fields = array();
+  foreach ($existing_fields as $field_name => $info) {
+    $js_fields[$field_name] = array('label' => $info['label'], 'type' => $info['type'], 'widget' => $info['widget_type']);
+  }
+
+  $form['#attached']['js'][] = array(
+    'type' => 'setting',
+    'data' => array('fields' => $js_fields, 'fieldWidgetTypes' => field_ui_widget_type_options()),
+  );
+
+  // Add tabledrag behavior.
+  $form['#attached']['drupal_add_tabledrag'][] = array('field-overview', 'order', 'sibling', 'field-weight');
+  $form['#attached']['drupal_add_tabledrag'][] = array('field-overview', 'match', 'parent', 'field-parent', 'field-parent', 'field-name');
+
+  return $form;
+}
+
+/**
+ * Form validation handler for field_ui_field_overview_form().
+ *
+ * @see field_ui_field_overview_form_submit()
+ */
+function field_ui_field_overview_form_validate($form, &$form_state) {
+  _field_ui_field_overview_form_validate_add_new($form, $form_state);
+  _field_ui_field_overview_form_validate_add_existing($form, $form_state);
+}
+
+/**
+ * Validates the 'add new field' row of field_ui_field_overview_form().
+ *
+ * @see field_ui_field_overview_form_validate()
+ */
+function _field_ui_field_overview_form_validate_add_new($form, &$form_state) {
+  $field = $form_state['values']['fields']['_add_new_field'];
+
+  // Validate if any information was provided in the 'add new field' row.
+  if (array_filter(array($field['label'], $field['field_name'], $field['type'], $field['widget_type']))) {
+    // Missing label.
+    if (!$field['label']) {
+      form_set_error('fields][_add_new_field][label', t('Add new field: you need to provide a label.'));
+    }
+
+    // Missing field name.
+    if (!$field['field_name']) {
+      form_set_error('fields][_add_new_field][field_name', t('Add new field: you need to provide a field name.'));
+    }
+    // Field name validation.
+    else {
+      $field_name = $field['field_name'];
+
+      // Add the 'field_' prefix.
+      $field_name = 'field_' . $field_name;
+      form_set_value($form['fields']['_add_new_field']['field_name'], $field_name, $form_state);
+    }
+
+    // Missing field type.
+    if (!$field['type']) {
+      form_set_error('fields][_add_new_field][type', t('Add new field: you need to select a field type.'));
+    }
+
+    // Missing widget type.
+    if (!$field['widget_type']) {
+      form_set_error('fields][_add_new_field][widget_type', t('Add new field: you need to select a widget.'));
+    }
+    // Wrong widget type.
+    elseif ($field['type']) {
+      $widget_types = field_ui_widget_type_options($field['type']);
+      if (!isset($widget_types[$field['widget_type']])) {
+        form_set_error('fields][_add_new_field][widget_type', t('Add new field: invalid widget.'));
+      }
+    }
+  }
+}
+
+/**
+ * Render API callback: Checks if a field machine name is taken.
+ *
+ * @param $value
+ *   The machine name, not prefixed with 'field_'.
+ *
+ * @return
+ *   Whether or not the field machine name is taken.
+ */
+function _field_ui_field_name_exists($value) {
+  // Prefix with 'field_'.
+  $field_name = 'field_' . $value;
+
+  // We need to check inactive fields as well, so we can't use
+  // field_info_fields().
+  return (bool) field_read_fields(array('field_name' => $field_name), array('include_inactive' => TRUE));
+}
+
+/**
+ * Validates the 'add existing field' row of field_ui_field_overview_form().
+ *
+ * @see field_ui_field_overview_form_validate()
+ */
+function _field_ui_field_overview_form_validate_add_existing($form, &$form_state) {
+  // The form element might be absent if no existing fields can be added to
+  // this bundle.
+  if (isset($form_state['values']['fields']['_add_existing_field'])) {
+    $field = $form_state['values']['fields']['_add_existing_field'];
+
+    // Validate if any information was provided in the 'add existing field' row.
+    if (array_filter(array($field['label'], $field['field_name'], $field['widget_type']))) {
+      // Missing label.
+      if (!$field['label']) {
+        form_set_error('fields][_add_existing_field][label', t('Add existing field: you need to provide a label.'));
+      }
+
+      // Missing existing field name.
+      if (!$field['field_name']) {
+        form_set_error('fields][_add_existing_field][field_name', t('Add existing field: you need to select a field.'));
+      }
+
+      // Missing widget type.
+      if (!$field['widget_type']) {
+        form_set_error('fields][_add_existing_field][widget_type', t('Add existing field: you need to select a widget.'));
+      }
+      // Wrong widget type.
+      elseif ($field['field_name'] && ($existing_field = field_info_field($field['field_name']))) {
+        $widget_types = field_ui_widget_type_options($existing_field['type']);
+        if (!isset($widget_types[$field['widget_type']])) {
+          form_set_error('fields][_add_existing_field][widget_type', t('Add existing field: invalid widget.'));
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Form submission handler for field_ui_field_overview_form().
+ *
+ * @see field_ui_field_overview_form_validate()
+ */
+function field_ui_field_overview_form_submit($form, &$form_state) {
+  $form_values = $form_state['values']['fields'];
+  $entity_type = $form['#entity_type'];
+  $bundle = $form['#bundle'];
+  $admin_path = _field_ui_bundle_admin_path($entity_type, $bundle);
+
+  $bundle_settings = field_bundle_settings($entity_type, $bundle);
+
+  // Update field weights.
+  foreach ($form_values as $key => $values) {
+    if (in_array($key, $form['#fields'])) {
+      $instance = field_read_instance($entity_type, $key, $bundle);
+      $instance['widget']['weight'] = $values['weight'];
+      field_update_instance($instance);
+    }
+    elseif (in_array($key, $form['#extra'])) {
+      $bundle_settings['extra_fields']['form'][$key]['weight'] = $values['weight'];
+    }
+  }
+
+  field_bundle_settings($entity_type, $bundle, $bundle_settings);
+
+  $destinations = array();
+
+  // Create new field.
+  $field = array();
+  if (!empty($form_values['_add_new_field']['field_name'])) {
+    $values = $form_values['_add_new_field'];
+
+    $field = array(
+      'field_name' => $values['field_name'],
+      'type' => $values['type'],
+      'translatable' => $values['translatable'],
+    );
+    $instance = array(
+      'field_name' => $field['field_name'],
+      'entity_type' => $entity_type,
+      'bundle' => $bundle,
+      'label' => $values['label'],
+      'widget' => array(
+        'type' => $values['widget_type'],
+        'weight' => $values['weight'],
+      ),
+    );
+
+    // Create the field and instance.
+    try {
+      field_create_field($field);
+      field_create_instance($instance);
+
+      $destinations[] = $admin_path . '/fields/' . $field['field_name'] . '/field-settings';
+      $destinations[] = $admin_path . '/fields/' . $field['field_name'];
+
+      // Store new field information for any additional submit handlers.
+      $form_state['fields_added']['_add_new_field'] = $field['field_name'];
+    }
+    catch (Exception $e) {
+      drupal_set_message(t('There was a problem creating field %label: !message', array('%label' => $instance['label'], '!message' => $e->getMessage())), 'error');
+    }
+  }
+
+  // Add existing field.
+  if (!empty($form_values['_add_existing_field']['field_name'])) {
+    $values = $form_values['_add_existing_field'];
+    $field = field_info_field($values['field_name']);
+    if (!empty($field['locked'])) {
+      drupal_set_message(t('The field %label cannot be added because it is locked.', array('%label' => $values['label'])), 'error');
+    }
+    else {
+      $instance = array(
+        'field_name' => $field['field_name'],
+        'entity_type' => $entity_type,
+        'bundle' => $bundle,
+        'label' => $values['label'],
+        'widget' => array(
+          'type' => $values['widget_type'],
+          'weight' => $values['weight'],
+        ),
+      );
+
+      try {
+        field_create_instance($instance);
+        $destinations[] = $admin_path . '/fields/' . $instance['field_name'] . '/edit';
+        // Store new field information for any additional submit handlers.
+        $form_state['fields_added']['_add_existing_field'] = $instance['field_name'];
+      }
+      catch (Exception $e) {
+        drupal_set_message(t('There was a problem creating field instance %label: @message.', array('%label' => $instance['label'], '@message' => $e->getMessage())), 'error');
+      }
+    }
+  }
+
+  if ($destinations) {
+    $destination = drupal_get_destination();
+    $destinations[] = $destination['destination'];
+    unset($_GET['destination']);
+    $form_state['redirect'] = field_ui_get_destinations($destinations);
+  }
+  else {
+    drupal_set_message(t('Your settings have been saved.'));
+  }
+}
+
+/**
+ * Form constructor for the field display settings for a given view mode.
+ *
+ * @see field_ui_display_overview_multistep_submit()
+ * @see field_ui_display_overview_form_submit()
+ * @ingroup forms
+ */
+function field_ui_display_overview_form($form, &$form_state, $entity_type, $bundle, $view_mode) {
+  $bundle = field_extract_bundle($entity_type, $bundle);
+
+  field_ui_inactive_message($entity_type, $bundle);
+  $admin_path = _field_ui_bundle_admin_path($entity_type, $bundle);
+
+  // Gather type information.
+  $instances = field_info_instances($entity_type, $bundle);
+  $field_types = field_info_field_types();
+  $extra_fields = field_info_extra_fields($entity_type, $bundle, 'display');
+
+  $form_state += array(
+    'formatter_settings_edit' => NULL,
+  );
+
+  $form += array(
+    '#entity_type' => $entity_type,
+    '#bundle' => $bundle,
+    '#view_mode' => $view_mode,
+    '#fields' => array_keys($instances),
+    '#extra' => array_keys($extra_fields),
+  );
+
+  if (empty($instances) && empty($extra_fields)) {
+    drupal_set_message(t('There are no fields yet added. You can add new fields on the <a href="@link">Manage fields</a> page.', array('@link' => url($admin_path . '/fields'))), 'warning');
+    return $form;
+  }
+
+  $table = array(
+    '#type' => 'field_ui_table',
+    '#tree' => TRUE,
+    '#header' => array(
+      t('Field'),
+      t('Weight'),
+      t('Parent'),
+      t('Label'),
+      array('data' => t('Format'), 'colspan' => 3),
+    ),
+    '#regions' => array(
+      'visible' => array('message' => t('No field is displayed.')),
+      'hidden' => array('title' => t('Hidden'), 'message' => t('No field is hidden.')),
+    ),
+    '#parent_options' => array(),
+    '#attributes' => array(
+      'class' => array('field-ui-overview'),
+      'id' => 'field-display-overview',
+    ),
+    // Add Ajax wrapper.
+    '#prefix' => '<div id="field-display-overview-wrapper">',
+    '#suffix' => '</div>',
+  );
+
+  $field_label_options = array(
+    'above' => t('Above'),
+    'inline' => t('Inline'),
+    'hidden' => t('<Hidden>'),
+  );
+  $extra_visibility_options = array(
+    'visible' => t('Visible'),
+    'hidden' => t('Hidden'),
+  );
+
+  // Field rows.
+  foreach ($instances as $name => $instance) {
+    $field = field_info_field($instance['field_name']);
+    $display = $instance['display'][$view_mode];
+    $table[$name] = array(
+      '#attributes' => array('class' => array('draggable', 'tabledrag-leaf')),
+      '#row_type' => 'field',
+      '#region_callback' => 'field_ui_display_overview_row_region',
+      '#js_settings' => array(
+        'rowHandler' => 'field',
+        'defaultFormatter' => $field_types[$field['type']]['default_formatter'],
+      ),
+      'human_name' => array(
+        '#markup' => check_plain($instance['label']),
+      ),
+      'weight' => array(
+        '#type' => 'textfield',
+        '#title' => t('Weight for @title', array('@title' => $instance['label'])),
+        '#title_display' => 'invisible',
+        '#default_value' => $display['weight'],
+        '#size' => 3,
+        '#attributes' => array('class' => array('field-weight')),
+      ),
+      'parent_wrapper' => array(
+        'parent' => array(
+          '#type' => 'select',
+          '#title' => t('Label display for @title', array('@title' => $instance['label'])),
+          '#title_display' => 'invisible',
+          '#options' => $table['#parent_options'],
+          '#empty_value' => '',
+          '#attributes' => array('class' => array('field-parent')),
+          '#parents' => array('fields', $name, 'parent'),
+        ),
+        'hidden_name' => array(
+          '#type' => 'hidden',
+          '#default_value' => $name,
+          '#attributes' => array('class' => array('field-name')),
+        ),
+      ),
+      'label' => array(
+        '#type' => 'select',
+        '#title' => t('Label display for @title', array('@title' => $instance['label'])),
+        '#title_display' => 'invisible',
+        '#options' => $field_label_options,
+        '#default_value' => $display['label'],
+      ),
+    );
+
+    $formatter_options = field_ui_formatter_options($field['type']);
+    $formatter_options['hidden'] = t('<Hidden>');
+    $table[$name]['format'] = array(
+      'type' => array(
+        '#type' => 'select',
+        '#title' => t('Formatter for @title', array('@title' => $instance['label'])),
+        '#title_display' => 'invisible',
+        '#options' => $formatter_options,
+        '#default_value' => $display['type'],
+        '#parents' => array('fields', $name, 'type'),
+        '#attributes' => array('class' => array('field-formatter-type')),
+      ),
+      'settings_edit_form' => array(),
+    );
+
+    // Formatter settings.
+
+    // Check the currently selected formatter, and merge persisted values for
+    // formatter settings.
+    if (isset($form_state['values']['fields'][$name]['type'])) {
+      $formatter_type = $form_state['values']['fields'][$name]['type'];
+    }
+    else {
+      $formatter_type = $display['type'];
+    }
+    if (isset($form_state['formatter_settings'][$name])) {
+      $settings = $form_state['formatter_settings'][$name];
+    }
+    else {
+      $settings = $display['settings'];
+    }
+    $settings += field_info_formatter_settings($formatter_type);
+
+    $instance['display'][$view_mode]['type'] = $formatter_type;
+    $formatter = field_info_formatter_types($formatter_type);
+    $instance['display'][$view_mode]['module'] = $formatter['module'];
+    $instance['display'][$view_mode]['settings'] = $settings;
+
+    // Base button element for the various formatter settings actions.
+    $base_button = array(
+      '#submit' => array('field_ui_display_overview_multistep_submit'),
+      '#ajax' => array(
+        'callback' => 'field_ui_display_overview_multistep_js',
+        'wrapper' => 'field-display-overview-wrapper',
+        'effect' => 'fade',
+      ),
+      '#field_name' => $name,
+    );
+
+    if ($form_state['formatter_settings_edit'] == $name) {
+      // We are currently editing this field's formatter settings. Display the
+      // settings form and submit buttons.
+      $table[$name]['format']['settings_edit_form'] = array();
+
+      $settings_form = array();
+      $function = $formatter['module'] . '_field_formatter_settings_form';
+      if (function_exists($function)) {
+        $settings_form = $function($field, $instance, $view_mode, $form, $form_state);
+      }
+
+      if ($settings_form) {
+        $table[$name]['format']['#cell_attributes'] = array('colspan' => 3);
+        $table[$name]['format']['settings_edit_form'] = array(
+          '#type' => 'container',
+          '#attributes' => array('class' => array('field-formatter-settings-edit-form')),
+          '#parents' => array('fields', $name, 'settings_edit_form'),
+          'label' => array(
+            '#markup' => t('Format settings:') . ' <span class="formatter-name">' . $formatter['label'] . '</span>',
+          ),
+          'settings' => $settings_form,
+          'actions' => array(
+            '#type' => 'actions',
+            'save_settings' => $base_button + array(
+              '#type' => 'submit',
+              '#name' => $name . '_formatter_settings_update',
+              '#value' => t('Update'),
+              '#op' => 'update',
+            ),
+            'cancel_settings' => $base_button + array(
+              '#type' => 'submit',
+              '#name' => $name . '_formatter_settings_cancel',
+              '#value' => t('Cancel'),
+              '#op' => 'cancel',
+              // Do not check errors for the 'Cancel' button, but make sure we
+              // get the value of the 'formatter type' select.
+              '#limit_validation_errors' => array(array('fields', $name, 'type')),
+            ),
+          ),
+        );
+        $table[$name]['#attributes']['class'][] = 'field-formatter-settings-editing';
+      }
+    }
+    else {
+      // Display a summary of the current formatter settings.
+      $summary = module_invoke($formatter['module'], 'field_formatter_settings_summary', $field, $instance, $view_mode);
+      $table[$name]['settings_summary'] = array();
+      $table[$name]['settings_edit'] = array();
+      if ($summary) {
+        $table[$name]['settings_summary'] = array(
+          '#markup' => '<div class="field-formatter-summary">' . $summary . '</div>',
+          '#cell_attributes' => array('class' => array('field-formatter-summary-cell')),
+        );
+        $table[$name]['settings_edit'] = $base_button + array(
+          '#type' => 'image_button',
+          '#name' => $name . '_formatter_settings_edit',
+          '#src' => 'misc/configure.png',
+          '#attributes' => array('class' => array('field-formatter-settings-edit'), 'alt' => t('Edit')),
+          '#op' => 'edit',
+          // Do not check errors for the 'Edit' button, but make sure we get
+          // the value of the 'formatter type' select.
+          '#limit_validation_errors' => array(array('fields', $name, 'type')),
+          '#prefix' => '<div class="field-formatter-settings-edit-wrapper">',
+          '#suffix' => '</div>',
+        );
+      }
+    }
+  }
+
+  // Non-field elements.
+  foreach ($extra_fields as $name => $extra_field) {
+    $display = $extra_field['display'][$view_mode];
+    $table[$name] = array(
+      '#attributes' => array('class' => array('draggable', 'tabledrag-leaf')),
+      '#row_type' => 'extra_field',
+      '#region_callback' => 'field_ui_display_overview_row_region',
+      '#js_settings' => array('rowHandler' => 'field'),
+      'human_name' => array(
+        '#markup' => check_plain($extra_field['label']),
+      ),
+      'weight' => array(
+        '#type' => 'textfield',
+        '#title' => t('Weight for @title', array('@title' => $extra_field['label'])),
+        '#title_display' => 'invisible',
+        '#default_value' => $display['weight'],
+        '#size' => 3,
+        '#attributes' => array('class' => array('field-weight')),
+      ),
+      'parent_wrapper' => array(
+        'parent' => array(
+          '#type' => 'select',
+          '#title' => t('Parents for @title', array('@title' => $extra_field['label'])),
+          '#title_display' => 'invisible',
+          '#options' => $table['#parent_options'],
+          '#empty_value' => '',
+          '#attributes' => array('class' => array('field-parent')),
+          '#parents' => array('fields', $name, 'parent'),
+        ),
+        'hidden_name' => array(
+          '#type' => 'hidden',
+          '#default_value' => $name,
+          '#attributes' => array('class' => array('field-name')),
+        ),
+      ),
+      'empty_cell' => array(
+        '#markup' => '&nbsp;',
+      ),
+      'format' => array(
+        'type' => array(
+          '#type' => 'select',
+          '#title' => t('Visibility for @title', array('@title' => $extra_field['label'])),
+          '#title_display' => 'invisible',
+          '#options' => $extra_visibility_options,
+          '#default_value' => $display['visible'] ? 'visible' : 'hidden',
+          '#parents' => array('fields', $name, 'type'),
+          '#attributes' => array('class' => array('field-formatter-type')),
+        ),
+      ),
+      'settings_summary' => array(),
+      'settings_edit' => array(),
+    );
+  }
+
+  $form['fields'] = $table;
+
+  // Custom display settings.
+  if ($view_mode == 'default') {
+    $form['modes'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Custom display settings'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+    );
+    // Collect options and default values for the 'Custom display settings'
+    // checkboxes.
+    $options = array();
+    $default = array();
+    $entity_info = entity_get_info($entity_type);
+    $view_modes = $entity_info['view modes'];
+    $view_mode_settings = field_view_mode_settings($entity_type, $bundle);
+    foreach ($view_modes as $view_mode_name => $view_mode_info) {
+      $options[$view_mode_name] = $view_mode_info['label'];
+      if (!empty($view_mode_settings[$view_mode_name]['custom_settings'])) {
+        $default[] = $view_mode_name;
+      }
+    }
+    $form['modes']['view_modes_custom'] = array(
+      '#type' => 'checkboxes',
+      '#title' => t('Use custom display settings for the following view modes'),
+      '#options' => $options,
+      '#default_value' => $default,
+    );
+  }
+
+  // In overviews involving nested rows from contributed modules (i.e
+  // field_group), the 'format type' selects can trigger a series of changes in
+  // child rows. The #ajax behavior is therefore not attached directly to the
+  // selects, but triggered by the client-side script through a hidden #ajax
+  // 'Refresh' button. A hidden 'refresh_rows' input tracks the name of
+  // affected rows.
+  $form['refresh_rows'] = array('#type' => 'hidden');
+  $form['refresh'] = array(
+    '#type' => 'submit',
+    '#value' => t('Refresh'),
+    '#op' => 'refresh_table',
+    '#submit' => array('field_ui_display_overview_multistep_submit'),
+    '#ajax' => array(
+      'callback' => 'field_ui_display_overview_multistep_js',
+      'wrapper' => 'field-display-overview-wrapper',
+      'effect' => 'fade',
+      // The button stays hidden, so we hide the Ajax spinner too. Ad-hoc
+      // spinners will be added manually by the client-side script.
+      'progress' => 'none',
+    ),
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save'));
+
+  $form['#attached']['js'][] = drupal_get_path('module', 'field_ui') . '/field_ui.js';
+  $form['#attached']['css'][] = drupal_get_path('module', 'field_ui') . '/field_ui.css';
+
+  // Add tabledrag behavior.
+  $form['#attached']['drupal_add_tabledrag'][] = array('field-display-overview', 'order', 'sibling', 'field-weight');
+  $form['#attached']['drupal_add_tabledrag'][] = array('field-display-overview', 'match', 'parent', 'field-parent', 'field-parent', 'field-name');
+
+  return $form;
+}
+
+
+/**
+ * Form submission handler for buttons in field_ui_display_overview_form().
+ */
+function field_ui_display_overview_multistep_submit($form, &$form_state) {
+  $trigger = $form_state['triggering_element'];
+  $op = $trigger['#op'];
+
+  switch ($op) {
+    case 'edit':
+      // Store the field whose settings are currently being edited.
+      $field_name = $trigger['#field_name'];
+      $form_state['formatter_settings_edit'] = $field_name;
+      break;
+
+    case 'update':
+      // Store the saved settings, and set the field back to 'non edit' mode.
+      $field_name = $trigger['#field_name'];
+      $values = $form_state['values']['fields'][$field_name]['settings_edit_form']['settings'];
+      $form_state['formatter_settings'][$field_name] = $values;
+      unset($form_state['formatter_settings_edit']);
+      break;
+
+    case 'cancel':
+      // Set the field back to 'non edit' mode.
+      unset($form_state['formatter_settings_edit']);
+      break;
+
+    case 'refresh_table':
+      // If the currently edited field is one of the rows to be refreshed, set
+      // it back to 'non edit' mode.
+      $updated_rows = explode(' ', $form_state['values']['refresh_rows']);
+      if (isset($form_state['formatter_settings_edit']) && in_array($form_state['formatter_settings_edit'], $updated_rows)) {
+        unset($form_state['formatter_settings_edit']);
+      }
+      break;
+  }
+
+  $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * Ajax handler for multistep buttons on the 'Manage display' screen.
+ */
+function field_ui_display_overview_multistep_js($form, &$form_state) {
+  $trigger = $form_state['triggering_element'];
+  $op = $trigger['#op'];
+
+  // Pick the elements that need to receive the ajax-new-content effect.
+  switch ($op) {
+    case 'edit':
+      $updated_rows = array($trigger['#field_name']);
+      $updated_columns = array('format');
+      break;
+
+    case 'update':
+    case 'cancel':
+      $updated_rows = array($trigger['#field_name']);
+      $updated_columns = array('format', 'settings_summary', 'settings_edit');
+      break;
+
+    case 'refresh_table':
+      $updated_rows = array_values(explode(' ', $form_state['values']['refresh_rows']));
+      $updated_columns = array('settings_summary', 'settings_edit');
+      break;
+  }
+
+  foreach ($updated_rows as $name) {
+    foreach ($updated_columns as $key) {
+      $element = &$form['fields'][$name][$key];
+      $element['#prefix'] = '<div class="ajax-new-content">' . (isset($element['#prefix']) ? $element['#prefix'] : '');
+      $element['#suffix'] = (isset($element['#suffix']) ? $element['#suffix'] : '') . '</div>';
+    }
+  }
+
+  // Return the whole table.
+  return $form['fields'];
+}
+
+/**
+ * Form submission handler for field_ui_display_overview_form().
+ */
+function field_ui_display_overview_form_submit($form, &$form_state) {
+  $form_values = $form_state['values'];
+  $entity_type = $form['#entity_type'];
+  $bundle = $form['#bundle'];
+  $view_mode = $form['#view_mode'];
+
+  // Save data for 'regular' fields.
+  foreach ($form['#fields'] as $field_name) {
+    // Retrieve the stored instance settings to merge with the incoming values.
+    $instance = field_read_instance($entity_type, $field_name, $bundle);
+    $values = $form_values['fields'][$field_name];
+    // Get formatter settings. They lie either directly in submitted form
+    // values (if the whole form was submitted while some formatter
+    // settings were being edited), or have been persisted in
+    // $form_state.
+    $settings = array();
+    if (isset($values['settings_edit_form']['settings'])) {
+      $settings = $values['settings_edit_form']['settings'];
+    }
+    elseif (isset($form_state['formatter_settings'][$field_name])) {
+      $settings = $form_state['formatter_settings'][$field_name];
+    }
+    elseif (isset($instance['display'][$view_mode]['settings'])) {
+      $settings = $instance['display'][$view_mode]['settings'];
+    }
+
+    // Only save settings actually used by the selected formatter.
+    $default_settings = field_info_formatter_settings($values['type']);
+    $settings = array_intersect_key($settings, $default_settings);
+
+    $instance['display'][$view_mode] = array(
+      'label' => $values['label'],
+      'type' => $values['type'],
+      'weight' => $values['weight'],
+      'settings' => $settings,
+    );
+    field_update_instance($instance);
+  }
+
+  // Get current bundle settings.
+  $bundle_settings = field_bundle_settings($entity_type, $bundle);
+
+  // Save data for 'extra' fields.
+  foreach ($form['#extra'] as $name) {
+    $bundle_settings['extra_fields']['display'][$name][$view_mode] = array(
+      'weight' => $form_values['fields'][$name]['weight'],
+      'visible' => $form_values['fields'][$name]['type'] == 'visible',
+    );
+  }
+
+  // Save view modes data.
+  if ($view_mode == 'default') {
+    $entity_info = entity_get_info($entity_type);
+    foreach ($form_values['view_modes_custom'] as $view_mode_name => $value) {
+      // Display a message for each view mode newly configured to use custom
+      // settings.
+      $view_mode_settings = field_view_mode_settings($entity_type, $bundle);
+      if (!empty($value) && empty($view_mode_settings[$view_mode_name]['custom_settings'])) {
+        $view_mode_label = $entity_info['view modes'][$view_mode_name]['label'];
+        $path = _field_ui_bundle_admin_path($entity_type, $bundle) . "/display/$view_mode_name";
+        drupal_set_message(t('The %view_mode mode now uses custom display settings. You might want to <a href="@url">configure them</a>.', array('%view_mode' => $view_mode_label, '@url' => url($path))));
+        // Initialize the newly customized view mode with the display settings
+        // from the default view mode.
+        _field_ui_add_default_view_mode_settings($entity_type, $bundle, $view_mode_name, $bundle_settings);
+      }
+      $bundle_settings['view_modes'][$view_mode_name]['custom_settings'] = !empty($value);
+    }
+  }
+
+  // Save updated bundle settings.
+  field_bundle_settings($entity_type, $bundle, $bundle_settings);
+
+  drupal_set_message(t('Your settings have been saved.'));
+}
+
+/**
+ * Populates display settings for a new view mode from the default view mode.
+ *
+ * When an administrator decides to use custom display settings for a view mode,
+ * that view mode needs to be initialized with the display settings for the
+ * 'default' view mode, which it was previously using. This helper function
+ * adds the new custom display settings to this bundle's instances, and saves
+ * them. It also modifies the passed-in $settings array, which the caller can
+ * then save using field_bundle_settings().
+ *
+ * @param $entity_type
+ *   The bundle's entity type.
+ * @param $bundle
+ *   The bundle whose view mode is being customized.
+ * @param $view_mode
+ *   The view mode that the administrator has set to use custom settings.
+ * @param $settings
+ *   An associative array of bundle settings, as expected by
+ *   field_bundle_settings().
+ *
+ * @see field_ui_display_overview_form_submit().
+ * @see field_bundle_settings()
+ */
+function _field_ui_add_default_view_mode_settings($entity_type, $bundle, $view_mode, &$settings) {
+  // Update display settings for field instances.
+  $instances = field_read_instances(array('entity_type' => $entity_type, 'bundle' => $bundle));
+  foreach ($instances as $instance) {
+    // If this field instance has display settings defined for this view mode,
+    // respect those settings.
+    if (!isset($instance['display'][$view_mode])) {
+      // The instance doesn't specify anything for this view mode, so use the
+      // default display settings.
+      $instance['display'][$view_mode] = $instance['display']['default'];
+      field_update_instance($instance);
+    }
+  }
+
+  // Update display settings for 'extra fields'.
+  foreach (array_keys($settings['extra_fields']['display']) as $name) {
+    if (!isset($settings['extra_fields']['display'][$name][$view_mode])) {
+      $settings['extra_fields']['display'][$name][$view_mode] = $settings['extra_fields']['display'][$name]['default'];
+    }
+  }
+}
+
+/**
+ * Returns an array of field_type options.
+ */
+function field_ui_field_type_options() {
+  $options = &drupal_static(__FUNCTION__);
+
+  if (!isset($options)) {
+    $options = array();
+    $field_types = field_info_field_types();
+    $field_type_options = array();
+    foreach ($field_types as $name => $field_type) {
+      // Skip field types which have no widget types, or should not be add via
+      // uesr interface.
+      if (field_ui_widget_type_options($name) && empty($field_type['no_ui'])) {
+        $options[$name] = $field_type['label'];
+      }
+    }
+    asort($options);
+  }
+  return $options;
+}
+
+/**
+ * Returns an array of widget type options for a field type.
+ *
+ * If no field type is provided, returns a nested array of all widget types,
+ * keyed by field type human name.
+ */
+function field_ui_widget_type_options($field_type = NULL, $by_label = FALSE) {
+  $options = &drupal_static(__FUNCTION__);
+
+  if (!isset($options)) {
+    $options = array();
+    $field_types = field_info_field_types();
+    foreach (field_info_widget_types() as $name => $widget_type) {
+      foreach ($widget_type['field types'] as $widget_field_type) {
+        // Check that the field type exists.
+        if (isset($field_types[$widget_field_type])) {
+          $options[$widget_field_type][$name] = $widget_type['label'];
+        }
+      }
+    }
+  }
+
+  if (isset($field_type)) {
+    return !empty($options[$field_type]) ? $options[$field_type] : array();
+  }
+  if ($by_label) {
+    $field_types = field_info_field_types();
+    $options_by_label = array();
+    foreach ($options as $field_type => $widgets) {
+      $options_by_label[$field_types[$field_type]['label']] = $widgets;
+    }
+    return $options_by_label;
+  }
+  return $options;
+}
+
+/**
+ * Returns an array of formatter options for a field type.
+ *
+ * If no field type is provided, returns a nested array of all formatters, keyed
+ * by field type.
+ */
+function field_ui_formatter_options($field_type = NULL) {
+  $options = &drupal_static(__FUNCTION__);
+
+  if (!isset($options)) {
+    $field_types = field_info_field_types();
+    $options = array();
+    foreach (field_info_formatter_types() as $name => $formatter) {
+      foreach ($formatter['field types'] as $formatter_field_type) {
+        // Check that the field type exists.
+        if (isset($field_types[$formatter_field_type])) {
+          $options[$formatter_field_type][$name] = $formatter['label'];
+        }
+      }
+    }
+  }
+
+  if ($field_type) {
+    return !empty($options[$field_type]) ? $options[$field_type] : array();
+  }
+  return $options;
+}
+
+/**
+ * Returns an array of existing fields to be added to a bundle.
+ */
+function field_ui_existing_field_options($entity_type, $bundle) {
+  $info = array();
+  $field_types = field_info_field_types();
+
+  foreach (field_info_instances() as $existing_entity_type => $bundles) {
+    foreach ($bundles as $existing_bundle => $instances) {
+      // No need to look in the current bundle.
+      if (!($existing_bundle == $bundle && $existing_entity_type == $entity_type)) {
+        foreach ($instances as $instance) {
+          $field = field_info_field($instance['field_name']);
+          // Don't show
+          // - locked fields,
+          // - fields already in the current bundle,
+          // - fields that cannot be added to the entity type,
+          // - fields that should not be added via user interface.
+
+          if (empty($field['locked'])
+            && !field_info_instance($entity_type, $field['field_name'], $bundle)
+            && (empty($field['entity_types']) || in_array($entity_type, $field['entity_types']))
+            && empty($field_types[$field['type']]['no_ui'])) {
+            $info[$instance['field_name']] = array(
+              'type' => $field['type'],
+              'type_label' => $field_types[$field['type']]['label'],
+              'field' => $field['field_name'],
+              'label' => $instance['label'],
+              'widget_type' => $instance['widget']['type'],
+            );
+          }
+        }
+      }
+    }
+  }
+  return $info;
+}
+
+/**
+ * Form constructor for the field settings edit page.
+ *
+ * @see field_ui_field_settings_form_submit()
+ * @ingroup forms
+ */
+function field_ui_field_settings_form($form, &$form_state, $instance) {
+  $bundle = $instance['bundle'];
+  $entity_type = $instance['entity_type'];
+  $field = field_info_field($instance['field_name']);
+
+  drupal_set_title($instance['label']);
+
+  $description = '<p>' . t('These settings apply to the %field field everywhere it is used. These settings impact the way that data is stored in the database and cannot be changed once data has been created.', array('%field' => $instance['label'])) . '</p>';
+
+  // Create a form structure for the field values.
+  $form['field'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Field settings'),
+    '#description' => $description,
+    '#tree' => TRUE,
+  );
+
+  // See if data already exists for this field.
+  // If so, prevent changes to the field settings.
+  $has_data = field_has_data($field);
+  if ($has_data) {
+    $form['field']['#description'] = '<div class="messages error">' . t('There is data for this field in the database. The field settings can no longer be changed.') . '</div>' . $form['field']['#description'];
+  }
+
+  // Build the non-configurable field values.
+  $form['field']['field_name'] = array('#type' => 'value', '#value' => $field['field_name']);
+  $form['field']['type'] = array('#type' => 'value', '#value' => $field['type']);
+  $form['field']['module'] = array('#type' => 'value', '#value' => $field['module']);
+  $form['field']['active'] = array('#type' => 'value', '#value' => $field['active']);
+
+  // Add settings provided by the field module. The field module is
+  // responsible for not returning settings that cannot be changed if
+  // the field already has data.
+  $form['field']['settings'] = array();
+  $additions = module_invoke($field['module'], 'field_settings_form', $field, $instance, $has_data);
+  if (is_array($additions)) {
+    $form['field']['settings'] = $additions;
+  }
+  if (empty($form['field']['settings'])) {
+    $form['field']['settings'] = array(
+      '#markup' => t('%field has no field settings.', array('%field' => $instance['label'])),
+    );
+  }
+  $form['#entity_type'] = $entity_type;
+  $form['#bundle'] = $bundle;
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save field settings'));
+  return $form;
+}
+
+/**
+ * Form submission handler for field_ui_field_settings_form().
+ */
+function field_ui_field_settings_form_submit($form, &$form_state) {
+  $form_values = $form_state['values'];
+  $field_values = $form_values['field'];
+
+  // Merge incoming form values into the existing field.
+  $field = field_info_field($field_values['field_name']);
+
+  $entity_type = $form['#entity_type'];
+  $bundle = $form['#bundle'];
+  $instance = field_info_instance($entity_type, $field['field_name'], $bundle);
+
+  // Update the field.
+  $field = array_merge($field, $field_values);
+
+  try {
+    field_update_field($field);
+    drupal_set_message(t('Updated field %label field settings.', array('%label' => $instance['label'])));
+    $form_state['redirect'] = field_ui_next_destination($entity_type, $bundle);
+  }
+  catch (Exception $e) {
+    drupal_set_message(t('Attempt to update field %label failed: %message.', array('%label' => $instance['label'], '%message' => $e->getMessage())), 'error');
+  }
+}
+
+/**
+ * Form constructor for the widget selection form.
+ *
+ * Path: BUNDLE_ADMIN_PATH/fields/%field/widget-type, where BUNDLE_ADMIN_PATH is
+ * the path stored in the ['admin']['info'] property in the return value of
+ * hook_entity_info().
+ *
+ * @see field_ui_menu()
+ * @see field_ui_widget_type_form_submit()
+ * @ingroup forms
+ */
+function field_ui_widget_type_form($form, &$form_state, $instance) {
+  drupal_set_title($instance['label']);
+
+  $bundle = $instance['bundle'];
+  $entity_type = $instance['entity_type'];
+  $field_name = $instance['field_name'];
+
+  $field = field_info_field($field_name);
+  $field_type = field_info_field_types($field['type']);
+  $widget_type = field_info_widget_types($instance['widget']['type']);
+  $bundles = field_info_bundles();
+  $bundle_label = $bundles[$entity_type][$bundle]['label'];
+
+  $form = array(
+    '#bundle' => $bundle,
+    '#entity_type' => $entity_type,
+    '#field_name' => $field_name,
+  );
+
+  $form['basic'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Change widget'),
+  );
+  $form['basic']['widget_type'] = array(
+    '#type' => 'select',
+    '#title' => t('Widget type'),
+    '#required' => TRUE,
+    '#options' => field_ui_widget_type_options($field['type']),
+    '#default_value' => $instance['widget']['type'],
+    '#description' => t('The type of form element you would like to present to the user when creating this field in the %type type.', array('%type' => $bundle_label)),
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Continue'));
+
+  $form['#validate'] = array();
+  $form['#submit'] = array('field_ui_widget_type_form_submit');
+
+  return $form;
+}
+
+/**
+ * Form submission handler for field_ui_widget_type_form().
+ */
+function field_ui_widget_type_form_submit($form, &$form_state) {
+  $form_values = $form_state['values'];
+  $bundle = $form['#bundle'];
+  $entity_type = $form['#entity_type'];
+  $field_name = $form['#field_name'];
+
+  // Retrieve the stored instance settings to merge with the incoming values.
+  $instance = field_read_instance($entity_type, $field_name, $bundle);
+
+  // Set the right module information.
+  $widget_type = field_info_widget_types($form_values['widget_type']);
+  $widget_module = $widget_type['module'];
+
+  $instance['widget']['type'] = $form_values['widget_type'];
+  $instance['widget']['module'] = $widget_module;
+
+  try {
+    field_update_instance($instance);
+    drupal_set_message(t('Changed the widget for field %label.', array('%label' => $instance['label'])));
+  }
+  catch (Exception $e) {
+    drupal_set_message(t('There was a problem changing the widget for field %label.', array('%label' => $instance['label'])), 'error');
+  }
+
+  $form_state['redirect'] = field_ui_next_destination($entity_type, $bundle);
+}
+
+/**
+ * Form constructor for removing a field instance from a bundle.
+ *
+ * @see field_ui_field_delete_form_submit()
+ * @ingroup forms
+ */
+function field_ui_field_delete_form($form, &$form_state, $instance) {
+  $bundle = $instance['bundle'];
+  $entity_type = $instance['entity_type'];
+  $field = field_info_field($instance['field_name']);
+
+  $admin_path = _field_ui_bundle_admin_path($entity_type, $bundle);
+
+  $form['entity_type'] = array('#type' => 'value', '#value' => $entity_type);
+  $form['bundle'] = array('#type' => 'value', '#value' => $bundle);
+  $form['field_name'] = array('#type' => 'value', '#value' => $field['field_name']);
+
+  $output = confirm_form($form,
+    t('Are you sure you want to delete the field %field?', array('%field' => $instance['label'])),
+    $admin_path . '/fields',
+    t('If you have any content left in this field, it will be lost. This action cannot be undone.'),
+    t('Delete'), t('Cancel'),
+    'confirm'
+  );
+
+  if ($field['locked']) {
+    unset($output['actions']['submit']);
+    $output['description']['#markup'] = t('This field is <strong>locked</strong> and cannot be deleted.');
+  }
+
+  return $output;
+}
+
+/**
+ * Form submission handler for field_ui_field_delete_form().
+ *
+ * Removes a field instance from a bundle. If the field has no more instances,
+ * it will be marked as deleted too.
+ */
+function field_ui_field_delete_form_submit($form, &$form_state) {
+  $form_values = $form_state['values'];
+  $field_name = $form_values['field_name'];
+  $bundle = $form_values['bundle'];
+  $entity_type = $form_values['entity_type'];
+
+  $field = field_info_field($field_name);
+  $instance = field_info_instance($entity_type, $field_name, $bundle);
+  $bundles = field_info_bundles();
+  $bundle_label = $bundles[$entity_type][$bundle]['label'];
+
+  if (!empty($bundle) && $field && !$field['locked'] && $form_values['confirm']) {
+    field_delete_instance($instance);
+    drupal_set_message(t('The field %field has been deleted from the %type content type.', array('%field' => $instance['label'], '%type' => $bundle_label)));
+  }
+  else {
+    drupal_set_message(t('There was a problem removing the %field from the %type content type.', array('%field' => $instance['label'], '%type' => $bundle_label)), 'error');
+  }
+
+  $admin_path = _field_ui_bundle_admin_path($entity_type, $bundle);
+  $form_state['redirect'] = field_ui_get_destinations(array($admin_path . '/fields'));
+
+  // Fields are purged on cron. However field module prevents disabling modules
+  // when field types they provided are used in a field until it is fully
+  // purged. In the case that a field has minimal or no content, a single call
+  // to field_purge_batch() will remove it from the system. Call this with a
+  // low batch limit to avoid administrators having to wait for cron runs when
+  // removing instances that meet this criteria.
+  field_purge_batch(10);
+}
+
+/**
+ * Form constructor for the field instance settings form.
+ *
+ * @see field_ui_field_edit_form_validate()
+ * @see field_ui_field_edit_form_submit()
+ * @ingroup forms
+ */
+function field_ui_field_edit_form($form, &$form_state, $instance) {
+  $bundle = $instance['bundle'];
+  $entity_type = $instance['entity_type'];
+  $field = field_info_field($instance['field_name']);
+
+  drupal_set_title($instance['label']);
+
+  $form['#field'] = $field;
+  $form['#instance'] = $instance;
+
+  if (!empty($field['locked'])) {
+    $form['locked'] = array(
+      '#markup' => t('The field %field is locked and cannot be edited.', array('%field' => $instance['label'])),
+    );
+    return $form;
+  }
+
+  $field_type = field_info_field_types($field['type']);
+  $widget_type = field_info_widget_types($instance['widget']['type']);
+  $bundles = field_info_bundles();
+
+  // Create a form structure for the instance values.
+  $form['instance'] = array(
+    '#tree' => TRUE,
+    '#type' => 'fieldset',
+    '#title' => t('%type settings', array('%type' => $bundles[$entity_type][$bundle]['label'])),
+    '#description' => t('These settings apply only to the %field field when used in the %type type.', array(
+      '%field' => $instance['label'],
+      '%type' => $bundles[$entity_type][$bundle]['label'],
+    )),
+    // Ensure field_ui_field_edit_instance_pre_render() gets called in addition
+    // to, not instead of, the #pre_render function(s) needed by all fieldsets.
+    '#pre_render' => array_merge(array('field_ui_field_edit_instance_pre_render'), element_info_property('fieldset', '#pre_render', array())),
+  );
+
+  // Build the non-configurable instance values.
+  $form['instance']['field_name'] = array(
+    '#type' => 'value',
+    '#value' => $instance['field_name'],
+  );
+  $form['instance']['entity_type'] = array(
+    '#type' => 'value',
+    '#value' => $entity_type,
+  );
+  $form['instance']['bundle'] = array(
+    '#type' => 'value',
+    '#value' => $bundle,
+  );
+  $form['instance']['widget']['weight'] = array(
+    '#type' => 'value',
+    '#value' => !empty($instance['widget']['weight']) ? $instance['widget']['weight'] : 0,
+  );
+
+  // Build the configurable instance values.
+  $form['instance']['label'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Label'),
+    '#default_value' => !empty($instance['label']) ? $instance['label'] : $field['field_name'],
+    '#required' => TRUE,
+    '#weight' => -20,
+  );
+  $form['instance']['required'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Required field'),
+    '#default_value' => !empty($instance['required']),
+    '#weight' => -10,
+  );
+
+  $form['instance']['description'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Help text'),
+    '#default_value' => !empty($instance['description']) ? $instance['description'] : '',
+    '#rows' => 5,
+    '#description' => t('Instructions to present to the user below this field on the editing form.<br />Allowed HTML tags: @tags', array('@tags' => _field_filter_xss_display_allowed_tags())),
+    '#weight' => -5,
+  );
+
+  // Build the widget component of the instance.
+  $form['instance']['widget']['type'] = array(
+    '#type' => 'value',
+    '#value' => $instance['widget']['type'],
+  );
+  $form['instance']['widget']['module'] = array(
+    '#type' => 'value',
+    '#value' => $widget_type['module'],
+  );
+  $form['instance']['widget']['active'] = array(
+    '#type' => 'value',
+    '#value' => !empty($field['instance']['widget']['active']) ? 1 : 0,
+  );
+
+  // Add additional field instance settings from the field module.
+  $additions = module_invoke($field['module'], 'field_instance_settings_form', $field, $instance);
+  if (is_array($additions)) {
+    $form['instance']['settings'] = $additions;
+  }
+
+  // Add additional widget settings from the widget module.
+  $additions = module_invoke($widget_type['module'], 'field_widget_settings_form', $field, $instance);
+  if (is_array($additions)) {
+    $form['instance']['widget']['settings'] = $additions;
+    $form['instance']['widget']['active']['#value'] = 1;
+  }
+
+  // Add handling for default value if not provided by any other module.
+  if (field_behaviors_widget('default value', $instance) == FIELD_BEHAVIOR_DEFAULT && empty($instance['default_value_function'])) {
+    $form['instance']['default_value_widget'] = field_ui_default_value_widget($field, $instance, $form, $form_state);
+  }
+
+  $has_data = field_has_data($field);
+  if ($has_data) {
+    $description = '<p>' . t('These settings apply to the %field field everywhere it is used. Because the field already has data, some settings can no longer be changed.', array('%field' => $instance['label'])) . '</p>';
+  }
+  else {
+    $description = '<p>' . t('These settings apply to the %field field everywhere it is used.', array('%field' => $instance['label'])) . '</p>';
+  }
+
+  // Create a form structure for the field values.
+  $form['field'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('%field field settings', array('%field' => $instance['label'])),
+    '#description' => $description,
+    '#tree' => TRUE,
+  );
+
+  // Build the configurable field values.
+  $description = t('Maximum number of values users can enter for this field.');
+  if (field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_DEFAULT) {
+    $description .= '<br/>' . t("'Unlimited' will provide an 'Add more' button so the users can add as many values as they like.");
+  }
+  $form['field']['cardinality'] = array(
+    '#type' => 'select',
+    '#title' => t('Number of values'),
+    '#options' => array(FIELD_CARDINALITY_UNLIMITED => t('Unlimited')) + drupal_map_assoc(range(1, 10)),
+    '#default_value' => $field['cardinality'],
+    '#description' => $description,
+  );
+
+  // Add additional field type settings. The field type module is
+  // responsible for not returning settings that cannot be changed if
+  // the field already has data.
+  $additions = module_invoke($field['module'], 'field_settings_form', $field, $instance, $has_data);
+  if (is_array($additions)) {
+    $form['field']['settings'] = $additions;
+  }
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save settings'));
+  return $form;
+}
+
+/**
+ * Pre-render function for field instance settings.
+ *
+ * Combines the instance, widget, and other settings into a single fieldset so
+ * that elements within each group can be shown at different weights as if they
+ * all had the same parent.
+ */
+function field_ui_field_edit_instance_pre_render($element) {
+  // Merge the widget settings into the main form.
+  if (isset($element['widget']['settings'])) {
+    foreach (element_children($element['widget']['settings']) as $key) {
+      $element['widget_' . $key] = $element['widget']['settings'][$key];
+    }
+    unset($element['widget']['settings']);
+  }
+
+  // Merge the instance settings into the main form.
+  if (isset($element['settings'])) {
+    foreach (element_children($element['settings']) as $key) {
+      $element['instance_' . $key] = $element['settings'][$key];
+    }
+    unset($element['settings']);
+  }
+
+  return $element;
+}
+
+/**
+ * Builds the default value fieldset for a given field instance.
+ */
+function field_ui_default_value_widget($field, $instance, &$form, &$form_state) {
+  $field_name = $field['field_name'];
+
+  $element = array(
+    '#type' => 'fieldset',
+    '#title' => t('Default value'),
+    '#collapsible' => FALSE,
+    '#tree' => TRUE,
+    '#description' => t('The default value for this field, used when creating new content.'),
+    // Stick to an empty 'parents' on this form in order not to breaks widgets
+    // that do not use field_widget_[field|instance]() and still access
+    // $form_state['field'] directly.
+    '#parents' => array(),
+  );
+
+  // Insert the widget.
+  $items = $instance['default_value'];
+  $instance['required'] = FALSE;
+  $instance['description'] = '';
+
+  // @todo Allow multiple values (requires more work on 'add more' JS handler).
+  $element += field_default_form($instance['entity_type'], NULL, $field, $instance, LANGUAGE_NONE, $items, $element, $form_state, 0);
+
+  return $element;
+}
+
+/**
+ * Form validation handler for field_ui_field_edit_form().
+ *
+ * @see field_ui_field_edit_form_submit().
+ */
+function field_ui_field_edit_form_validate($form, &$form_state) {
+  // Take the incoming values as the $instance definition, so that the 'default
+  // value' gets validated using the instance settings being submitted.
+  $instance = $form_state['values']['instance'];
+  $field_name = $instance['field_name'];
+
+  if (isset($form['instance']['default_value_widget'])) {
+    $element = $form['instance']['default_value_widget'];
+
+    $field_state = field_form_get_state($element['#parents'], $field_name, LANGUAGE_NONE, $form_state);
+    $field = $field_state['field'];
+
+    // Extract the 'default value'.
+    $items = array();
+    field_default_extract_form_values(NULL, NULL, $field, $instance, LANGUAGE_NONE, $items, $element, $form_state);
+
+    // Validate the value and report errors.
+    $errors = array();
+    $function = $field['module'] . '_field_validate';
+    if (function_exists($function)) {
+      $function(NULL, NULL, $field, $instance, LANGUAGE_NONE, $items, $errors);
+    }
+    if (isset($errors[$field_name][LANGUAGE_NONE])) {
+      // Store reported errors in $form_state.
+      $field_state['errors'] = $errors[$field_name][LANGUAGE_NONE];
+      field_form_set_state($element['#parents'], $field_name, LANGUAGE_NONE, $form_state, $field_state);
+      // Assign reported errors to the correct form element.
+      field_default_form_errors(NULL, NULL, $field, $instance, LANGUAGE_NONE, $items, $element, $form_state);
+    }
+  }
+}
+
+/**
+ * Form submission handler for field_ui_field_edit_form().
+ *
+ * @see field_ui_field_edit_form_validate().
+ */
+function field_ui_field_edit_form_submit($form, &$form_state) {
+  $instance = $form_state['values']['instance'];
+  $field = $form_state['values']['field'];
+
+  // Update any field settings that have changed.
+  $field_source = field_info_field($instance['field_name']);
+  $field = array_merge($field_source, $field);
+  try {
+    field_update_field($field);
+  }
+  catch (Exception $e) {
+    drupal_set_message(t('Attempt to update field %label failed: %message.', array('%label' => $instance['label'], '%message' => $e->getMessage())), 'error');
+    return;
+  }
+
+  // Handle the default value.
+  if (isset($form['instance']['default_value_widget'])) {
+    $element = $form['instance']['default_value_widget'];
+
+    // Extract field values.
+    $items = array();
+    field_default_extract_form_values(NULL, NULL, $field, $instance, LANGUAGE_NONE, $items, $element, $form_state);
+    field_default_submit(NULL, NULL, $field, $instance, LANGUAGE_NONE, $items, $element, $form_state);
+
+    $instance['default_value'] = $items ? $items : NULL;
+  }
+
+  // Retrieve the stored instance settings to merge with the incoming values.
+  $instance_source = field_read_instance($instance['entity_type'], $instance['field_name'], $instance['bundle']);
+  $instance = array_merge($instance_source, $instance);
+  field_update_instance($instance);
+
+  drupal_set_message(t('Saved %label configuration.', array('%label' => $instance['label'])));
+
+  $form_state['redirect'] = field_ui_next_destination($instance['entity_type'], $instance['bundle']);
+}
+
+/**
+ * Extracts next redirect path from an array of multiple destinations.
+ *
+ * @see field_ui_next_destination()
+ */
+function field_ui_get_destinations($destinations) {
+  $path = array_shift($destinations);
+  $options = drupal_parse_url($path);
+  if ($destinations) {
+    $options['query']['destinations'] = $destinations;
+  }
+  return array($options['path'], $options);
+}
+
+/**
+ * Returns the next redirect path in a multipage sequence.
+ */
+function field_ui_next_destination($entity_type, $bundle) {
+  $destinations = !empty($_REQUEST['destinations']) ? $_REQUEST['destinations'] : array();
+  if (!empty($destinations)) {
+    unset($_REQUEST['destinations']);
+    return field_ui_get_destinations($destinations);
+  }
+  $admin_path = _field_ui_bundle_admin_path($entity_type, $bundle);
+  return $admin_path . '/fields';
+}
diff --git a/htmltest/modules/field_ui/field_ui.api.php b/htmltest/modules/field_ui/field_ui.api.php
new file mode 100644
index 00000000..05d9f053
--- /dev/null
+++ b/htmltest/modules/field_ui/field_ui.api.php
@@ -0,0 +1,204 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Field UI module.
+ */
+
+/**
+ * @addtogroup field_types
+ * @{
+ */
+
+/**
+ * Add settings to a field settings form.
+ *
+ * Invoked from field_ui_field_settings_form() to allow the module defining the
+ * field to add global settings (i.e. settings that do not depend on the bundle
+ * or instance) to the field settings form. If the field already has data, only
+ * include settings that are safe to change.
+ *
+ * @todo: Only the field type module knows which settings will affect the
+ * field's schema, but only the field storage module knows what schema
+ * changes are permitted once a field already has data. Probably we need an
+ * easy way for a field type module to ask whether an update to a new schema
+ * will be allowed without having to build up a fake $prior_field structure
+ * for hook_field_update_forbid().
+ *
+ * @param $field
+ *   The field structure being configured.
+ * @param $instance
+ *   The instance structure being configured.
+ * @param $has_data
+ *   TRUE if the field already has data, FALSE if not.
+ *
+ * @return
+ *   The form definition for the field settings.
+ */
+function hook_field_settings_form($field, $instance, $has_data) {
+  $settings = $field['settings'];
+  $form['max_length'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Maximum length'),
+    '#default_value' => $settings['max_length'],
+    '#required' => FALSE,
+    '#element_validate' => array('element_validate_integer_positive'),
+    '#description' => t('The maximum length of the field in characters. Leave blank for an unlimited size.'),
+  );
+  return $form;
+}
+
+/**
+ * Add settings to an instance field settings form.
+ *
+ * Invoked from field_ui_field_edit_form() to allow the module defining the
+ * field to add settings for a field instance.
+ *
+ * @param $field
+ *   The field structure being configured.
+ * @param $instance
+ *   The instance structure being configured.
+ *
+ * @return
+ *   The form definition for the field instance settings.
+ */
+function hook_field_instance_settings_form($field, $instance) {
+  $settings = $instance['settings'];
+
+  $form['text_processing'] = array(
+    '#type' => 'radios',
+    '#title' => t('Text processing'),
+    '#default_value' => $settings['text_processing'],
+    '#options' => array(
+      t('Plain text'),
+      t('Filtered text (user selects text format)'),
+    ),
+  );
+  if ($field['type'] == 'text_with_summary') {
+    $form['display_summary'] = array(
+      '#type' => 'select',
+      '#title' => t('Display summary'),
+      '#options' => array(
+        t('No'),
+        t('Yes'),
+      ),
+      '#description' => t('Display the summary to allow the user to input a summary value. Hide the summary to automatically fill it with a trimmed portion from the main post.'),
+      '#default_value' => !empty($settings['display_summary']) ? $settings['display_summary'] :  0,
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Add settings to a widget settings form.
+ *
+ * Invoked from field_ui_field_edit_form() to allow the module defining the
+ * widget to add settings for a widget instance.
+ *
+ * @param $field
+ *   The field structure being configured.
+ * @param $instance
+ *   The instance structure being configured.
+ *
+ * @return
+ *   The form definition for the widget settings.
+ */
+function hook_field_widget_settings_form($field, $instance) {
+  $widget = $instance['widget'];
+  $settings = $widget['settings'];
+
+  if ($widget['type'] == 'text_textfield') {
+    $form['size'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Size of textfield'),
+      '#default_value' => $settings['size'],
+      '#element_validate' => array('element_validate_integer_positive'),
+      '#required' => TRUE,
+    );
+  }
+  else {
+    $form['rows'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Rows'),
+      '#default_value' => $settings['rows'],
+      '#element_validate' => array('element_validate_integer_positive'),
+      '#required' => TRUE,
+    );
+  }
+
+  return $form;
+}
+
+
+/**
+ * Specify the form elements for a formatter's settings.
+ *
+ * @param $field
+ *   The field structure being configured.
+ * @param $instance
+ *   The instance structure being configured.
+ * @param $view_mode
+ *   The view mode being configured.
+ * @param $form
+ *   The (entire) configuration form array, which will usually have no use here.
+ * @param $form_state
+ *   The form state of the (entire) configuration form.
+ *
+ * @return
+ *   The form elements for the formatter settings.
+ */
+function hook_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $element = array();
+
+  if ($display['type'] == 'text_trimmed' || $display['type'] == 'text_summary_or_trimmed') {
+    $element['trim_length'] = array(
+      '#title' => t('Length'),
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#default_value' => $settings['trim_length'],
+      '#element_validate' => array('element_validate_integer_positive'),
+      '#required' => TRUE,
+    );
+  }
+
+  return $element;
+
+}
+
+/**
+ * Return a short summary for the current formatter settings of an instance.
+ *
+ * If an empty result is returned, the formatter is assumed to have no
+ * configurable settings, and no UI will be provided to display a settings
+ * form.
+ *
+ * @param $field
+ *   The field structure.
+ * @param $instance
+ *   The instance structure.
+ * @param $view_mode
+ *   The view mode for which a settings summary is requested.
+ *
+ * @return
+ *   A string containing a short summary of the formatter settings.
+ */
+function hook_field_formatter_settings_summary($field, $instance, $view_mode) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $summary = '';
+
+  if ($display['type'] == 'text_trimmed' || $display['type'] == 'text_summary_or_trimmed') {
+    $summary = t('Length: @chars chars', array('@chars' => $settings['trim_length']));
+  }
+
+  return $summary;
+}
+
+/**
+ * @} End of "addtogroup field_types".
+ */
diff --git a/htmltest/modules/field_ui/field_ui.css b/htmltest/modules/field_ui/field_ui.css
new file mode 100644
index 00000000..2184023b
--- /dev/null
+++ b/htmltest/modules/field_ui/field_ui.css
@@ -0,0 +1,71 @@
+/**
+ * @file
+ * Stylesheet for the Field UI module.
+ */
+ 
+/* 'Manage fields' and 'Manage display' overviews */
+table.field-ui-overview tr.add-new .label-input {
+  float: left; /* LTR */
+}
+table.field-ui-overview tr.add-new .tabledrag-changed {
+  display: none;
+}
+table.field-ui-overview tr.add-new .description {
+  margin-bottom: 0;
+  max-width: 250px;
+}
+table.field-ui-overview tr.add-new .form-type-machine-name .description {
+  white-space: normal;
+}
+table.field-ui-overview tr.add-new .add-new-placeholder {
+  font-weight: bold;
+  padding-bottom: .5em;
+}
+table.field-ui-overview tr.region-title td {
+  font-weight: bold;
+}
+table.field-ui-overview tr.region-message td {
+  font-style: italic;
+}
+table.field-ui-overview tr.region-populated {
+  display: none;
+}
+table.field-ui-overview tr.region-add-new-title {
+  display: none;
+}
+table.field-ui-overview tr.add-new td {
+  vertical-align: top;
+  white-space: nowrap;
+}
+
+/* 'Manage display' overview */
+#field-display-overview .field-formatter-summary-cell {
+  line-height: 1em;
+}
+#field-display-overview .field-formatter-summary {
+  float: left;
+  font-size: 0.9em;
+}
+#field-display-overview td.field-formatter-summary-cell span.warning {
+  display: block;
+  float: left;
+  margin-right: .5em;
+}
+#field-display-overview .field-formatter-settings-edit-wrapper {
+  float: right;
+}
+#field-display-overview .field-formatter-settings-edit {
+  float: right;
+}
+#field-display-overview tr.field-formatter-settings-editing td {
+  vertical-align: top;
+}
+#field-display-overview tr.field-formatter-settings-editing .field-formatter-type {
+  display: none;
+}
+#field-display-overview .field-formatter-settings-edit-form .formatter-name{
+  font-weight: bold;
+}
+#field-ui-display-overview-form #edit-refresh {
+  display:none;
+}
diff --git a/htmltest/modules/field_ui/field_ui.info b/htmltest/modules/field_ui/field_ui.info
new file mode 100644
index 00000000..7ed26b1e
--- /dev/null
+++ b/htmltest/modules/field_ui/field_ui.info
@@ -0,0 +1,13 @@
+name = Field UI
+description = User interface for the Field API.
+package = Core
+version = VERSION
+core = 7.x
+dependencies[] = field
+files[] = field_ui.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/field_ui/field_ui.js b/htmltest/modules/field_ui/field_ui.js
new file mode 100644
index 00000000..65b28d04
--- /dev/null
+++ b/htmltest/modules/field_ui/field_ui.js
@@ -0,0 +1,341 @@
+/**
+ * @file
+ * Attaches the behaviors for the Field UI module.
+ */
+ 
+(function($) {
+
+Drupal.behaviors.fieldUIFieldOverview = {
+  attach: function (context, settings) {
+    $('table#field-overview', context).once('field-overview', function () {
+      Drupal.fieldUIFieldOverview.attachUpdateSelects(this, settings);
+    });
+  }
+};
+
+Drupal.fieldUIFieldOverview = {
+  /**
+   * Implements dependent select dropdowns on the 'Manage fields' screen.
+   */
+  attachUpdateSelects: function(table, settings) {
+    var widgetTypes = settings.fieldWidgetTypes;
+    var fields = settings.fields;
+
+    // Store the default text of widget selects.
+    $('.widget-type-select', table).each(function () {
+      this.initialValue = this.options[0].text;
+    });
+
+    // 'Field type' select updates its 'Widget' select.
+    $('.field-type-select', table).each(function () {
+      this.targetSelect = $('.widget-type-select', $(this).closest('tr'));
+
+      $(this).bind('change keyup', function () {
+        var selectedFieldType = this.options[this.selectedIndex].value;
+        var options = (selectedFieldType in widgetTypes ? widgetTypes[selectedFieldType] : []);
+        this.targetSelect.fieldUIPopulateOptions(options);
+      });
+
+      // Trigger change on initial pageload to get the right widget options
+      // when field type comes pre-selected (on failed validation).
+      $(this).trigger('change', false);
+    });
+
+    // 'Existing field' select updates its 'Widget' select and 'Label' textfield.
+    $('.field-select', table).each(function () {
+      this.targetSelect = $('.widget-type-select', $(this).closest('tr'));
+      this.targetTextfield = $('.label-textfield', $(this).closest('tr'));
+      this.targetTextfield
+        .data('field_ui_edited', false)
+        .bind('keyup', function (e) {
+          $(this).data('field_ui_edited', $(this).val() != '');
+        });
+
+      $(this).bind('change keyup', function (e, updateText) {
+        var updateText = (typeof updateText == 'undefined' ? true : updateText);
+        var selectedField = this.options[this.selectedIndex].value;
+        var selectedFieldType = (selectedField in fields ? fields[selectedField].type : null);
+        var selectedFieldWidget = (selectedField in fields ? fields[selectedField].widget : null);
+        var options = (selectedFieldType && (selectedFieldType in widgetTypes) ? widgetTypes[selectedFieldType] : []);
+        this.targetSelect.fieldUIPopulateOptions(options, selectedFieldWidget);
+
+        // Only overwrite the "Label" input if it has not been manually
+        // changed, or if it is empty.
+        if (updateText && !this.targetTextfield.data('field_ui_edited')) {
+          this.targetTextfield.val(selectedField in fields ? fields[selectedField].label : '');
+        }
+      });
+
+      // Trigger change on initial pageload to get the right widget options
+      // and label when field type comes pre-selected (on failed validation).
+      $(this).trigger('change', false);
+    });
+  }
+};
+
+/**
+ * Populates options in a select input.
+ */
+jQuery.fn.fieldUIPopulateOptions = function (options, selected) {
+  return this.each(function () {
+    var disabled = false;
+    if (options.length == 0) {
+      options = [this.initialValue];
+      disabled = true;
+    }
+
+    // If possible, keep the same widget selected when changing field type.
+    // This is based on textual value, since the internal value might be
+    // different (options_buttons vs. node_reference_buttons).
+    var previousSelectedText = this.options[this.selectedIndex].text;
+
+    var html = '';
+    jQuery.each(options, function (value, text) {
+      // Figure out which value should be selected. The 'selected' param
+      // takes precedence.
+      var is_selected = ((typeof selected != 'undefined' && value == selected) || (typeof selected == 'undefined' && text == previousSelectedText));
+      html += '<option value="' + value + '"' + (is_selected ? ' selected="selected"' : '') + '>' + text + '</option>';
+    });
+
+    $(this).html(html).attr('disabled', disabled ? 'disabled' : false);
+  });
+};
+
+Drupal.behaviors.fieldUIDisplayOverview = {
+  attach: function (context, settings) {
+    $('table#field-display-overview', context).once('field-display-overview', function() {
+      Drupal.fieldUIOverview.attach(this, settings.fieldUIRowsData, Drupal.fieldUIDisplayOverview);
+    });
+  }
+};
+
+Drupal.fieldUIOverview = {
+  /**
+   * Attaches the fieldUIOverview behavior.
+   */
+  attach: function (table, rowsData, rowHandlers) {
+    var tableDrag = Drupal.tableDrag[table.id];
+
+    // Add custom tabledrag callbacks.
+    tableDrag.onDrop = this.onDrop;
+    tableDrag.row.prototype.onSwap = this.onSwap;
+
+    // Create row handlers.
+    $('tr.draggable', table).each(function () {
+      // Extract server-side data for the row.
+      var row = this;
+      if (row.id in rowsData) {
+        var data = rowsData[row.id];
+        data.tableDrag = tableDrag;
+
+        // Create the row handler, make it accessible from the DOM row element.
+        var rowHandler = new rowHandlers[data.rowHandler](row, data);
+        $(row).data('fieldUIRowHandler', rowHandler);
+      }
+    });
+  },
+
+  /**
+   * Event handler to be attached to form inputs triggering a region change.
+   */
+  onChange: function () {
+    var $trigger = $(this);
+    var row = $trigger.closest('tr').get(0);
+    var rowHandler = $(row).data('fieldUIRowHandler');
+
+    var refreshRows = {};
+    refreshRows[rowHandler.name] = $trigger.get(0);
+
+    // Handle region change.
+    var region = rowHandler.getRegion();
+    if (region != rowHandler.region) {
+      // Remove parenting.
+      $('select.field-parent', row).val('');
+      // Let the row handler deal with the region change.
+      $.extend(refreshRows, rowHandler.regionChange(region));
+      // Update the row region.
+      rowHandler.region = region;
+    }
+
+    // Ajax-update the rows.
+    Drupal.fieldUIOverview.AJAXRefreshRows(refreshRows);
+  },
+
+  /**
+   * Lets row handlers react when a row is dropped into a new region.
+   */
+  onDrop: function () {
+    var dragObject = this;
+    var row = dragObject.rowObject.element;
+    var rowHandler = $(row).data('fieldUIRowHandler');
+    if (rowHandler !== undefined) {
+      var regionRow = $(row).prevAll('tr.region-message').get(0);
+      var region = regionRow.className.replace(/([^ ]+[ ]+)*region-([^ ]+)-message([ ]+[^ ]+)*/, '$2');
+
+      if (region != rowHandler.region) {
+        // Let the row handler deal with the region change.
+        refreshRows = rowHandler.regionChange(region);
+        // Update the row region.
+        rowHandler.region = region;
+        // Ajax-update the rows.
+        Drupal.fieldUIOverview.AJAXRefreshRows(refreshRows);
+      }
+    }
+  },
+
+  /**
+   * Refreshes placeholder rows in empty regions while a row is being dragged.
+   *
+   * Copied from block.js.
+   *
+   * @param table
+   *   The table DOM element.
+   * @param rowObject
+   *   The tableDrag rowObject for the row being dragged.
+   */
+  onSwap: function (draggedRow) {
+    var rowObject = this;
+    $('tr.region-message', rowObject.table).each(function () {
+      // If the dragged row is in this region, but above the message row, swap
+      // it down one space.
+      if ($(this).prev('tr').get(0) == rowObject.group[rowObject.group.length - 1]) {
+        // Prevent a recursion problem when using the keyboard to move rows up.
+        if ((rowObject.method != 'keyboard' || rowObject.direction == 'down')) {
+          rowObject.swap('after', this);
+        }
+      }
+      // This region has become empty.
+      if ($(this).next('tr').is(':not(.draggable)') || $(this).next('tr').length == 0) {
+        $(this).removeClass('region-populated').addClass('region-empty');
+      }
+      // This region has become populated.
+      else if ($(this).is('.region-empty')) {
+        $(this).removeClass('region-empty').addClass('region-populated');
+      }
+    });
+  },
+
+  /**
+   * Triggers Ajax refresh of selected rows.
+   *
+   * The 'format type' selects can trigger a series of changes in child rows.
+   * The #ajax behavior is therefore not attached directly to the selects, but
+   * triggered manually through a hidden #ajax 'Refresh' button.
+   *
+   * @param rows
+   *   A hash object, whose keys are the names of the rows to refresh (they
+   *   will receive the 'ajax-new-content' effect on the server side), and
+   *   whose values are the DOM element in the row that should get an Ajax
+   *   throbber.
+   */
+  AJAXRefreshRows: function (rows) {
+    // Separate keys and values.
+    var rowNames = [];
+    var ajaxElements = [];
+    $.each(rows, function (rowName, ajaxElement) {
+      rowNames.push(rowName);
+      ajaxElements.push(ajaxElement);
+    });
+
+    if (rowNames.length) {
+      // Add a throbber next each of the ajaxElements.
+      var $throbber = $('<div class="ajax-progress ajax-progress-throbber"><div class="throbber">&nbsp;</div></div>');
+      $(ajaxElements)
+        .addClass('progress-disabled')
+        .after($throbber);
+
+      // Fire the Ajax update.
+      $('input[name=refresh_rows]').val(rowNames.join(' '));
+      $('input#edit-refresh').mousedown();
+
+      // Disabled elements do not appear in POST ajax data, so we mark the
+      // elements disabled only after firing the request.
+      $(ajaxElements).attr('disabled', true);
+    }
+  }
+};
+
+
+/**
+ * Row handlers for the 'Manage display' screen.
+ */
+Drupal.fieldUIDisplayOverview = {};
+
+/**
+ * Constructor for a 'field' row handler.
+ *
+ * This handler is used for both fields and 'extra fields' rows.
+ *
+ * @param row
+ *   The row DOM element.
+ * @param data
+ *   Additional data to be populated in the constructed object.
+ */
+Drupal.fieldUIDisplayOverview.field = function (row, data) {
+  this.row = row;
+  this.name = data.name;
+  this.region = data.region;
+  this.tableDrag = data.tableDrag;
+
+  // Attach change listener to the 'formatter type' select.
+  this.$formatSelect = $('select.field-formatter-type', row);
+  this.$formatSelect.change(Drupal.fieldUIOverview.onChange);
+
+  return this;
+};
+
+Drupal.fieldUIDisplayOverview.field.prototype = {
+  /**
+   * Returns the region corresponding to the current form values of the row.
+   */
+  getRegion: function () {
+    return (this.$formatSelect.val() == 'hidden') ? 'hidden' : 'visible';
+  },
+
+  /**
+   * Reacts to a row being changed regions.
+   *
+   * This function is called when the row is moved to a different region, as a
+   * result of either :
+   * - a drag-and-drop action (the row's form elements then probably need to be
+   *   updated accordingly)
+   * - user input in one of the form elements watched by the
+   *   Drupal.fieldUIOverview.onChange change listener.
+   *
+   * @param region
+   *   The name of the new region for the row.
+   * @return
+   *   A hash object indicating which rows should be Ajax-updated as a result
+   *   of the change, in the format expected by
+   *   Drupal.displayOverview.AJAXRefreshRows().
+   */
+  regionChange: function (region) {
+
+    // When triggered by a row drag, the 'format' select needs to be adjusted
+    // to the new region.
+    var currentValue = this.$formatSelect.val();
+    switch (region) {
+      case 'visible':
+        if (currentValue == 'hidden') {
+          // Restore the formatter back to the default formatter. Pseudo-fields do
+          // not have default formatters, we just return to 'visible' for those.
+          var value = (this.defaultFormatter != undefined) ? this.defaultFormatter : 'visible';
+        }
+        break;
+
+      default:
+        var value = 'hidden';
+        break;
+    }
+    if (value != undefined) {
+      this.$formatSelect.val(value);
+    }
+
+    var refreshRows = {};
+    refreshRows[this.name] = this.$formatSelect.get(0);
+
+    return refreshRows;
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/field_ui/field_ui.module b/htmltest/modules/field_ui/field_ui.module
new file mode 100644
index 00000000..ed833feb
--- /dev/null
+++ b/htmltest/modules/field_ui/field_ui.module
@@ -0,0 +1,394 @@
+<?php
+/**
+ * @file
+ * Allows administrators to attach custom fields to fieldable types.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function field_ui_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#field_ui':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Field UI module provides an administrative user interface (UI) for attaching and managing fields. Fields can be defined at the content-type level for content items and comments, at the vocabulary level for taxonomy terms, and at the site level for user accounts. Other modules may also enable fields to be defined for their data. Field types (text, image, number, etc.) are defined by modules, and collected and managed by the <a href="@field">Field module</a>. For more information, see the online handbook entry for <a href="@field_ui" target="_blank">Field UI module</a>.', array('@field' => url('admin/help/field'), '@field_ui' => 'http://drupal.org/documentation/modules/field-ui')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Planning fields') . '</dt>';
+      $output .= '<dd>' . t('There are several decisions you will need to make before defining a field for content, comments, etc.:') . '<dl>';
+      $output .= '<dt>' . t('What the field will be called') . '</dt>';
+      $output .= '<dd>' . t('A field has a <em>label</em> (the name displayed in the user interface) and a <em>machine name</em> (the name used internally). The label can be changed after you create the field, if needed, but the machine name cannot be changed after you have created the field.') . '</li>';
+      $output .= '<dt>' . t('What type of data the field will store') . '</dt>';
+      $output .= '<dd>' . t('Each field can store one type of data (text, number, file, etc.). When you define a field, you choose a particular <em>field type</em>, which corresponds to the type of data you want to store. The field type cannot be changed after you have created the field.') . '</dd>';
+      $output .= '<dt>' . t('How the data will be input and displayed') . '</dt>';
+      $output .= '<dd>' . t('Each field type has one or more available <em>widgets</em> associated with it; each widget provides a mechanism for data input when you are editing (text box, select list, file upload, etc.). Each field type also has one or more display options, which determine how the field is displayed to site visitors. The widget and display options can be changed after you have created the field.') . '</dd>';
+      $output .= '<dt>' . t('How many values the field will store') . '</dt>';
+      $output .= '<dd>' . t('You can store one value, a specific maximum number of values, or an unlimited number of values in each field. For example, an employee identification number field might store a single number, whereas a phone number field might store multiple phone numbers. This setting can be changed after you have created the field, but if you reduce the maximum number of values, you may lose information.') . '</dd>';
+      $output .= '</dl>';
+      $output .= '<dt>' . t('Reusing fields') . '</dt>';
+      $output .= '<dd>' . t('Once you have defined a field, you can reuse it. For example, if you define a custom image field for one content type, and you need to have an image field with the same parameters on another content type, you can add the same field to the second content type, in the <em>Add existing field</em> area of the user interface. You could also add this field to a taxonomy vocabulary, comments, user accounts, etc.') . '</dd>';
+      $output .= '<dd>' . t('Some settings of a reused field are unique to each use of the field; others are shared across all places you use the field. For example, the label of a text field is unique to each use, while the setting for the number of values is shared.') . '</dd>';
+      $output .= '<dd>' . t('There are two main reasons for reusing fields. First, reusing fields can save you time over defining new fields. Second, reusing fields also allows you to display, filter, group, and sort content together by field across content types. For example, the contributed Views module allows you to create lists and tables of content. So if you use the same field on multiple content types, you can create a View containing all of those content types together displaying that field, sorted by that field, and/or filtered by that field.') . '</dd>';
+      $output .= '<dt>' . t('Fields on content items') . '</dt>';
+      $output .= '<dd>' . t('Fields on content items are defined at the content-type level, on the <em>Manage fields</em> tab of the content type edit page (which you can reach from the <a href="@types">Content types page</a>). When you define a field for a content type, each content item of that type will have that field added to it. Some fields, such as the Title and Body, are provided for you when you create a content type, or are provided on content types created by your installation profile.', array('@types' => url('admin/structure/types'))) . '</dd>';
+      $output .= '<dt>' . t('Fields on taxonomy terms') . '</dt>';
+      $output .= '<dd>' . t('Fields on taxonomy terms are defined at the taxonomy vocabulary level, on the <em>Manage fields</em> tab of the vocabulary edit page (which you can reach from the <a href="@taxonomy">Taxonomy page</a>). When you define a field for a vocabulary, each term in that vocabulary will have that field added to it. For example, you could define an image field for a vocabulary to store an icon with each term.', array('@taxonomy' => url('admin/structure/taxonomy'))) . '</dd>';
+      $output .= '<dt>' . t('Fields on user accounts') . '</dt>';
+      $output .= '<dd>' . t('Fields on user accounts are defined on a site-wide basis on the <a href="@fields">Manage fields tab</a> of the <a href="@accounts">Account settings</a> page. When you define a field for user accounts, each user account will have that field added to it. For example, you could add a long text field to allow users to include a biography.', array('@fields' => url('admin/config/people/accounts/fields'), '@accounts' => url('admin/config/people/accounts'))) . '</dd>';
+      $output .= '<dt>' . t('Fields on comments') . '</dt>';
+      $output .= '<dd>' . t('Fields on comments are defined at the content-type level, on the <em>Comment fields</em> tab of the content type edit page (which you can reach from the <a href="@types">Content types page</a>). When you add a field for comments, each comment on a content item of that type will have that field added to it. For example, you could add a website field to the comments on forum posts, to allow forum commenters to add a link to their website.', array('@types' => url('admin/structure/types'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+
+    case 'admin/reports/fields':
+      return '<p>' . t('This list shows all fields currently in use for easy reference.') . '</p>';
+  }
+}
+
+/**
+ * Implements hook_field_attach_rename_bundle().
+ */
+function field_ui_field_attach_rename_bundle($entity_type, $bundle_old, $bundle_new) {
+  // The Field UI relies on entity_get_info() to build menu items for entity
+  // field administration pages. Clear the entity info cache and ensure that
+  // the menu is rebuilt.
+  entity_info_cache_clear();
+  menu_rebuild();
+}
+
+/**
+ * Implements hook_menu().
+ */
+function field_ui_menu() {
+  $items['admin/reports/fields'] = array(
+    'title' => 'Field list',
+    'description' => 'Overview of fields on all entity types.',
+    'page callback' => 'field_ui_fields_list',
+    'access arguments' => array('administer content types'),
+    'type' => MENU_NORMAL_ITEM,
+    'file' => 'field_ui.admin.inc',
+  );
+
+  // Ensure the following is not executed until field_bundles is working and
+  // tables are updated. Needed to avoid errors on initial installation.
+  if (defined('MAINTENANCE_MODE')) {
+    return $items;
+  }
+
+  // Create tabs for all possible bundles.
+  foreach (entity_get_info() as $entity_type => $entity_info) {
+    if ($entity_info['fieldable']) {
+      foreach ($entity_info['bundles'] as $bundle_name => $bundle_info) {
+        if (isset($bundle_info['admin'])) {
+          // Extract path information from the bundle.
+          $path = $bundle_info['admin']['path'];
+          // Different bundles can appear on the same path (e.g. %node_type and
+          // %comment_node_type). To allow field_ui_menu_load() to extract the
+          // actual bundle object from the translated menu router path
+          // arguments, we need to identify the argument position of the bundle
+          // name string ('bundle argument') and pass that position to the menu
+          // loader. The position needs to be casted into a string; otherwise it
+          // would be replaced with the bundle name string.
+          if (isset($bundle_info['admin']['bundle argument'])) {
+            $bundle_arg = $bundle_info['admin']['bundle argument'];
+            $bundle_pos = (string) $bundle_arg;
+          }
+          else {
+            $bundle_arg = $bundle_name;
+            $bundle_pos = '0';
+          }
+          // This is the position of the %field_ui_menu placeholder in the
+          // items below.
+          $field_position = count(explode('/', $path)) + 1;
+
+          // Extract access information, providing defaults.
+          $access = array_intersect_key($bundle_info['admin'], drupal_map_assoc(array('access callback', 'access arguments')));
+          $access += array(
+            'access callback' => 'user_access',
+            'access arguments' => array('administer site configuration'),
+          );
+
+          $items["$path/fields"] = array(
+            'title' => 'Manage fields',
+            'page callback' => 'drupal_get_form',
+            'page arguments' => array('field_ui_field_overview_form', $entity_type, $bundle_arg),
+            'type' => MENU_LOCAL_TASK,
+            'weight' => 1,
+            'file' => 'field_ui.admin.inc',
+          ) + $access;
+          $items["$path/fields/%field_ui_menu"] = array(
+            'load arguments' => array($entity_type, $bundle_arg, $bundle_pos, '%map'),
+            'title callback' => 'field_ui_menu_title',
+            'title arguments' => array($field_position),
+            'page callback' => 'drupal_get_form',
+            'page arguments' => array('field_ui_field_edit_form', $field_position),
+            'file' => 'field_ui.admin.inc',
+          ) + $access;
+          $items["$path/fields/%field_ui_menu/edit"] = array(
+            'load arguments' => array($entity_type, $bundle_arg, $bundle_pos, '%map'),
+            'title' => 'Edit',
+            'page callback' => 'drupal_get_form',
+            'page arguments' => array('field_ui_field_edit_form', $field_position),
+            'type' => MENU_DEFAULT_LOCAL_TASK,
+            'file' => 'field_ui.admin.inc',
+          ) + $access;
+          $items["$path/fields/%field_ui_menu/field-settings"] = array(
+            'load arguments' => array($entity_type, $bundle_arg, $bundle_pos, '%map'),
+            'title' => 'Field settings',
+            'page callback' => 'drupal_get_form',
+            'page arguments' => array('field_ui_field_settings_form', $field_position),
+            'type' => MENU_LOCAL_TASK,
+            'file' => 'field_ui.admin.inc',
+          ) + $access;
+          $items["$path/fields/%field_ui_menu/widget-type"] = array(
+            'load arguments' => array($entity_type, $bundle_arg, $bundle_pos, '%map'),
+            'title' => 'Widget type',
+            'page callback' => 'drupal_get_form',
+            'page arguments' => array('field_ui_widget_type_form', $field_position),
+            'type' => MENU_LOCAL_TASK,
+            'file' => 'field_ui.admin.inc',
+          ) + $access;
+          $items["$path/fields/%field_ui_menu/delete"] = array(
+            'load arguments' => array($entity_type, $bundle_arg, $bundle_pos, '%map'),
+            'title' => 'Delete',
+            'page callback' => 'drupal_get_form',
+            'page arguments' => array('field_ui_field_delete_form', $field_position),
+            'type' => MENU_LOCAL_TASK,
+            'weight' => 10,
+            'file' => 'field_ui.admin.inc',
+          ) + $access;
+
+          // 'Manage display' tab.
+          $items["$path/display"] = array(
+            'title' => 'Manage display',
+            'page callback' => 'drupal_get_form',
+            'page arguments' => array('field_ui_display_overview_form', $entity_type, $bundle_arg, 'default'),
+            'type' => MENU_LOCAL_TASK,
+            'weight' => 2,
+            'file' => 'field_ui.admin.inc',
+          ) + $access;
+
+          // View modes secondary tabs.
+          // The same base $path for the menu item (with a placeholder) can be
+          // used for all bundles of a given entity type; but depending on
+          // administrator settings, each bundle has a different set of view
+          // modes available for customisation. So we define menu items for all
+          // view modes, and use an access callback to determine which ones are
+          // actually visible for a given bundle.
+          $weight = 0;
+          $view_modes = array('default' => array('label' => t('Default'))) + $entity_info['view modes'];
+          foreach ($view_modes as $view_mode => $view_mode_info) {
+            $items["$path/display/$view_mode"] = array(
+              'title' => $view_mode_info['label'],
+              'page arguments' => array('field_ui_display_overview_form', $entity_type, $bundle_arg, $view_mode),
+              // The access callback needs to check both the current 'custom
+              // display' setting for the view mode, and the overall access
+              // rules for the bundle admin pages.
+              'access callback' => '_field_ui_view_mode_menu_access',
+              'access arguments' => array_merge(array($entity_type, $bundle_arg, $view_mode, $access['access callback']), $access['access arguments']),
+              'type' => ($view_mode == 'default' ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK),
+              'weight' => ($view_mode == 'default' ? -10 : $weight++),
+              'file' => 'field_ui.admin.inc',
+            );
+          }
+        }
+      }
+    }
+  }
+  return $items;
+}
+
+/**
+ * Menu loader; Load a field instance based on field and bundle name.
+ *
+ * @param $field_name
+ *   The name of the field, as contained in the path.
+ * @param $entity_type
+ *   The name of the entity.
+ * @param $bundle_name
+ *   The name of the bundle, as contained in the path.
+ * @param $bundle_pos
+ *   The position of $bundle_name in $map.
+ * @param $map
+ *   The translated menu router path argument map.
+ *
+ * @return
+ *   The field instance array.
+ *
+ * @ingroup field
+ */
+function field_ui_menu_load($field_name, $entity_type, $bundle_name, $bundle_pos, $map) {
+  // Extract the actual bundle name from the translated argument map.
+  // The menu router path to manage fields of an entity can be shared among
+  // multiple bundles. For example:
+  // - admin/structure/types/manage/%node_type/fields/%field_ui_menu
+  // - admin/structure/types/manage/%comment_node_type/fields/%field_ui_menu
+  // The menu system will automatically load the correct bundle depending on the
+  // actual path arguments, but this menu loader function only receives the node
+  // type string as $bundle_name, which is not the bundle name for comments.
+  // We therefore leverage the dynamically translated $map provided by the menu
+  // system to retrieve the actual bundle and bundle name for the current path.
+  if ($bundle_pos > 0) {
+    $bundle = $map[$bundle_pos];
+    $bundle_name = field_extract_bundle($entity_type, $bundle);
+  }
+  // Check whether the field exists at all.
+  if ($field = field_info_field($field_name)) {
+    // Only return the field if a field instance exists for the given entity
+    // type and bundle.
+    if ($instance = field_info_instance($entity_type, $field_name, $bundle_name)) {
+      return $instance;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Menu title callback.
+ */
+function field_ui_menu_title($instance) {
+  return $instance['label'];
+}
+
+/**
+ * Menu access callback for the 'view mode display settings' pages.
+ */
+function _field_ui_view_mode_menu_access($entity_type, $bundle, $view_mode, $access_callback) {
+  // First, determine visibility according to the 'use custom display'
+  // setting for the view mode.
+  $bundle = field_extract_bundle($entity_type, $bundle);
+  $view_mode_settings = field_view_mode_settings($entity_type, $bundle);
+  $visibility = ($view_mode == 'default') || !empty($view_mode_settings[$view_mode]['custom_settings']);
+
+  // Then, determine access according to the $access parameter. This duplicates
+  // part of _menu_check_access().
+  if ($visibility) {
+    // Grab the variable 'access arguments' part.
+    $all_args = func_get_args();
+    $args = array_slice($all_args, 4);
+    $callback = empty($access_callback) ? 0 : trim($access_callback);
+    if (is_numeric($callback)) {
+      return (bool) $callback;
+    }
+    else {
+      // As call_user_func_array() is quite slow and user_access is a very
+      // common callback, it is worth making a special case for it.
+      if ($access_callback == 'user_access') {
+        return (count($args) == 1) ? user_access($args[0]) : user_access($args[0], $args[1]);
+      }
+      elseif (function_exists($access_callback)) {
+        return call_user_func_array($access_callback, $args);
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function field_ui_theme() {
+  return array(
+    'field_ui_table' => array(
+      'render element' => 'elements',
+    ),
+  );
+}
+
+/**
+ * Implements hook_element_info().
+ */
+function field_ui_element_info() {
+  return array(
+    'field_ui_table' => array(
+      '#theme' => 'field_ui_table',
+      '#pre_render' => array('field_ui_table_pre_render'),
+      '#regions' => array('' => array()),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_attach_create_bundle().
+ */
+function field_ui_field_attach_create_bundle($entity_type, $bundle) {
+  // When a new bundle is created, the menu needs to be rebuilt to add our
+  // menu item tabs.
+  variable_set('menu_rebuild_needed', TRUE);
+}
+
+/**
+ * Determines the administration path for a bundle.
+ */
+function _field_ui_bundle_admin_path($entity_type, $bundle_name) {
+  $bundles = field_info_bundles($entity_type);
+  $bundle_info = $bundles[$bundle_name];
+  if (isset($bundle_info['admin'])) {
+    return isset($bundle_info['admin']['real path']) ? $bundle_info['admin']['real path'] : $bundle_info['admin']['path'];
+  }
+}
+
+/**
+ * Identifies inactive fields within a bundle.
+ */
+function field_ui_inactive_instances($entity_type, $bundle_name = NULL) {
+  $params = array('entity_type' => $entity_type);
+
+  if (empty($bundle_name)) {
+    $active = field_info_instances($entity_type);
+    $inactive = array();
+  }
+  else {
+    // Restrict to the specified bundle. For consistency with the case where
+    // $bundle_name is NULL, the $active and  $inactive arrays are keyed by
+    // bundle name first.
+    $params['bundle'] = $bundle_name;
+    $active = array($bundle_name => field_info_instances($entity_type, $bundle_name));
+    $inactive = array($bundle_name => array());
+  }
+
+  // Iterate on existing definitions, and spot those that do not appear in the
+  // $active list collected earlier.
+  $all_instances = field_read_instances($params, array('include_inactive' => TRUE));
+  foreach ($all_instances as $instance) {
+    if (!isset($active[$instance['bundle']][$instance['field_name']])) {
+      $inactive[$instance['bundle']][$instance['field_name']] = $instance;
+    }
+  }
+
+  if (!empty($bundle_name)) {
+    return $inactive[$bundle_name];
+  }
+  return $inactive;
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Adds a button 'Save and add fields' to the 'Create content type' form.
+ *
+ * @see node_type_form()
+ * @see field_ui_form_node_type_form_submit()
+ */
+function field_ui_form_node_type_form_alter(&$form, $form_state) {
+  // We want to display the button only on add page.
+  if (empty($form['#node_type']->type)) {
+    $form['actions']['save_continue'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save and add fields'),
+      '#weight' => 45,
+    );
+    $form['#submit'][] = 'field_ui_form_node_type_form_submit';
+  }
+}
+
+/**
+ * Form submission handler for the 'Save and add fields' button.
+ *
+ * @see field_ui_form_node_type_form_alter()
+ */
+function field_ui_form_node_type_form_submit($form, &$form_state) {
+  if ($form_state['triggering_element']['#parents'][0] === 'save_continue') {
+    $form_state['redirect'] = _field_ui_bundle_admin_path('node', $form_state['values']['type']) .'/fields';
+  }
+}
diff --git a/htmltest/modules/field_ui/field_ui.test b/htmltest/modules/field_ui/field_ui.test
new file mode 100644
index 00000000..21767d64
--- /dev/null
+++ b/htmltest/modules/field_ui/field_ui.test
@@ -0,0 +1,751 @@
+<?php
+
+/**
+ * @file
+ * Tests for field_ui.module.
+ */
+
+/**
+ * Provides common functionality for the Field UI test classes.
+ */
+class FieldUITestCase extends DrupalWebTestCase {
+
+  function setUp() {
+    // Since this is a base class for many test cases, support the same
+    // flexibility that DrupalWebTestCase::setUp() has for the modules to be
+    // passed in as either an array or a variable number of string arguments.
+    $modules = func_get_args();
+    if (isset($modules[0]) && is_array($modules[0])) {
+      $modules = $modules[0];
+    }
+    $modules[] = 'field_test';
+    parent::setUp($modules);
+
+    // Create test user.
+    $admin_user = $this->drupalCreateUser(array('access content', 'administer content types', 'administer taxonomy'));
+    $this->drupalLogin($admin_user);
+
+    // Create content type, with underscores.
+    $type_name = strtolower($this->randomName(8)) . '_test';
+    $type = $this->drupalCreateContentType(array('name' => $type_name, 'type' => $type_name));
+    $this->type = $type->type;
+    // Store a valid URL name, with hyphens instead of underscores.
+    $this->hyphen_type = str_replace('_', '-', $this->type);
+  }
+
+  /**
+   * Creates a new field through the Field UI.
+   *
+   * @param $bundle_path
+   *   Admin path of the bundle that the new field is to be attached to.
+   * @param $initial_edit
+   *   $edit parameter for drupalPost() on the first step ('Manage fields'
+   *   screen).
+   * @param $field_edit
+   *   $edit parameter for drupalPost() on the second step ('Field settings'
+   *   form).
+   * @param $instance_edit
+   *   $edit parameter for drupalPost() on the third step ('Instance settings'
+   *   form).
+   */
+  function fieldUIAddNewField($bundle_path, $initial_edit, $field_edit = array(), $instance_edit = array()) {
+    // Use 'test_field' field type by default.
+    $initial_edit += array(
+      'fields[_add_new_field][type]' => 'test_field',
+      'fields[_add_new_field][widget_type]' => 'test_field_widget',
+    );
+    $label = $initial_edit['fields[_add_new_field][label]'];
+    $field_name = $initial_edit['fields[_add_new_field][field_name]'];
+
+    // First step : 'Add new field' on the 'Manage fields' page.
+    $this->drupalPost("$bundle_path/fields",  $initial_edit, t('Save'));
+    $this->assertRaw(t('These settings apply to the %label field everywhere it is used.', array('%label' => $label)), 'Field settings page was displayed.');
+
+    // Second step : 'Field settings' form.
+    $this->drupalPost(NULL, $field_edit, t('Save field settings'));
+    $this->assertRaw(t('Updated field %label field settings.', array('%label' => $label)), 'Redirected to instance and widget settings page.');
+
+    // Third step : 'Instance settings' form.
+    $this->drupalPost(NULL, $instance_edit, t('Save settings'));
+    $this->assertRaw(t('Saved %label configuration.', array('%label' => $label)), 'Redirected to "Manage fields" page.');
+
+    // Check that the field appears in the overview form.
+    $this->assertFieldByXPath('//table[@id="field-overview"]//td[1]', $label, 'Field was created and appears in the overview page.');
+  }
+
+  /**
+   * Adds an existing field through the Field UI.
+   *
+   * @param $bundle_path
+   *   Admin path of the bundle that the field is to be attached to.
+   * @param $initial_edit
+   *   $edit parameter for drupalPost() on the first step ('Manage fields'
+   *   screen).
+   * @param $instance_edit
+   *   $edit parameter for drupalPost() on the second step ('Instance settings'
+   *   form).
+   */
+  function fieldUIAddExistingField($bundle_path, $initial_edit, $instance_edit = array()) {
+    // Use 'test_field_widget' by default.
+    $initial_edit += array(
+      'fields[_add_existing_field][widget_type]' => 'test_field_widget',
+    );
+    $label = $initial_edit['fields[_add_existing_field][label]'];
+    $field_name = $initial_edit['fields[_add_existing_field][field_name]'];
+
+    // First step : 'Add existing field' on the 'Manage fields' page.
+    $this->drupalPost("$bundle_path/fields", $initial_edit, t('Save'));
+
+    // Second step : 'Instance settings' form.
+    $this->drupalPost(NULL, $instance_edit, t('Save settings'));
+    $this->assertRaw(t('Saved %label configuration.', array('%label' => $label)), 'Redirected to "Manage fields" page.');
+
+    // Check that the field appears in the overview form.
+    $this->assertFieldByXPath('//table[@id="field-overview"]//td[1]', $label, 'Field was created and appears in the overview page.');
+  }
+
+  /**
+   * Deletes a field instance through the Field UI.
+   *
+   * @param $bundle_path
+   *   Admin path of the bundle that the field instance is to be deleted from.
+   * @param $field_name
+   *   The name of the field.
+   * @param $label
+   *   The label of the field.
+   * @param $bundle_label
+   *   The label of the bundle.
+   */
+  function fieldUIDeleteField($bundle_path, $field_name, $label, $bundle_label) {
+    // Display confirmation form.
+    $this->drupalGet("$bundle_path/fields/$field_name/delete");
+    $this->assertRaw(t('Are you sure you want to delete the field %label', array('%label' => $label)), 'Delete confirmation was found.');
+
+    // Submit confirmation form.
+    $this->drupalPost(NULL, array(), t('Delete'));
+    $this->assertRaw(t('The field %label has been deleted from the %type content type.', array('%label' => $label, '%type' => $bundle_label)), 'Delete message was found.');
+
+    // Check that the field does not appear in the overview form.
+    $this->assertNoFieldByXPath('//table[@id="field-overview"]//span[@class="label-field"]', $label, 'Field does not appear in the overview page.');
+  }
+}
+
+/**
+ * Tests the functionality of the 'Manage fields' screen.
+ */
+class FieldUIManageFieldsTestCase extends FieldUITestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Manage fields',
+      'description' => 'Test the Field UI "Manage fields" screen.',
+      'group' => 'Field UI',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Create random field name.
+    $this->field_label = $this->randomName(8);
+    $this->field_name_input =  strtolower($this->randomName(8));
+    $this->field_name = 'field_'. $this->field_name_input;
+  }
+
+  /**
+   * Runs the field CRUD tests.
+   *
+   * In order to act on the same fields, and not create the fields over and over
+   * again the following tests create, update and delete the same fields.
+   */
+  function testCRUDFields() {
+    $this->manageFieldsPage();
+    $this->createField();
+    $this->updateField();
+    $this->addExistingField();
+  }
+
+  /**
+   * Tests the manage fields page.
+   */
+  function manageFieldsPage() {
+    $this->drupalGet('admin/structure/types/manage/' . $this->hyphen_type . '/fields');
+    // Check all table columns.
+    $table_headers = array(
+      t('Label'),
+      t('Machine name'),
+      t('Field type'),
+      t('Widget'),
+      t('Operations'),
+    );
+    foreach ($table_headers as $table_header) {
+      // We check that the label appear in the table headings.
+      $this->assertRaw($table_header . '</th>', format_string('%table_header table header was found.', array('%table_header' => $table_header)));
+    }
+
+    // "Add new field" and "Add existing field" aren't a table heading so just
+    // test the text.
+    foreach (array('Add new field', 'Add existing field') as $element) {
+      $this->assertText($element, format_string('"@element" was found.', array('@element' => $element)));
+    }
+  }
+
+  /**
+   * Tests adding a new field.
+   *
+   * @todo Assert properties can bet set in the form and read back in $field and
+   * $instances.
+   */
+  function createField() {
+    // Create a test field.
+    $edit = array(
+      'fields[_add_new_field][label]' => $this->field_label,
+      'fields[_add_new_field][field_name]' => $this->field_name_input,
+    );
+    $this->fieldUIAddNewField('admin/structure/types/manage/' . $this->hyphen_type, $edit);
+
+    // Assert the field appears in the "add existing field" section for
+    // different entity types; e.g. if a field was added in a node entity, it
+    // should also appear in the 'taxonomy term' entity.
+    $vocabulary = taxonomy_vocabulary_load(1);
+    $this->drupalGet('admin/structure/taxonomy/' . $vocabulary->machine_name . '/fields');
+    $this->assertTrue($this->xpath('//select[@name="fields[_add_existing_field][field_name]"]//option[@value="' . $this->field_name . '"]'), 'Existing field was found in account settings.');
+  }
+
+  /**
+   * Tests editing an existing field.
+   */
+  function updateField() {
+    // Go to the field edit page.
+    $this->drupalGet('admin/structure/types/manage/' . $this->hyphen_type . '/fields/' . $this->field_name);
+
+    // Populate the field settings with new settings.
+    $string = 'updated dummy test string';
+    $edit = array(
+      'field[settings][test_field_setting]' => $string,
+      'instance[settings][test_instance_setting]' => $string,
+      'instance[widget][settings][test_widget_setting]' => $string,
+    );
+    $this->drupalPost(NULL, $edit, t('Save settings'));
+
+    // Assert the field settings are correct.
+    $this->assertFieldSettings($this->type, $this->field_name, $string);
+
+    // Assert redirection back to the "manage fields" page.
+    $this->assertText(t('Saved @label configuration.', array('@label' => $this->field_label)), 'Redirected to "Manage fields" page.');
+  }
+
+  /**
+   * Tests adding an existing field in another content type.
+   */
+  function addExistingField() {
+    // Check "Add existing field" appears.
+    $this->drupalGet('admin/structure/types/manage/page/fields');
+    $this->assertRaw(t('Add existing field'), '"Add existing field" was found.');
+
+    // Check that the list of options respects entity type restrictions on
+    // fields. The 'comment' field is restricted to the 'comment' entity type
+    // and should not appear in the list.
+    $this->assertFalse($this->xpath('//select[@id="edit-add-existing-field-field-name"]//option[@value="comment"]'), 'The list of options respects entity type restrictions.');
+
+    // Add a new field based on an existing field.
+    $edit = array(
+      'fields[_add_existing_field][label]' => $this->field_label . '_2',
+      'fields[_add_existing_field][field_name]' => $this->field_name,
+    );
+    $this->fieldUIAddExistingField("admin/structure/types/manage/page", $edit);
+  }
+
+  /**
+   * Asserts field settings are as expected.
+   *
+   * @param $bundle
+   *   The bundle name for the instance.
+   * @param $field_name
+   *   The field name for the instance.
+   * @param $string
+   *   The settings text.
+   * @param $entity_type
+   *   The entity type for the instance.
+   */
+  function assertFieldSettings($bundle, $field_name, $string = 'dummy test string', $entity_type = 'node') {
+    // Reset the fields info.
+    field_info_cache_clear();
+    // Assert field settings.
+    $field = field_info_field($field_name);
+    $this->assertTrue($field['settings']['test_field_setting'] == $string, 'Field settings were found.');
+
+    // Assert instance and widget settings.
+    $instance = field_info_instance($entity_type, $field_name, $bundle);
+    $this->assertTrue($instance['settings']['test_instance_setting'] == $string, 'Field instance settings were found.');
+    $this->assertTrue($instance['widget']['settings']['test_widget_setting'] == $string, 'Field widget settings were found.');
+  }
+
+  /**
+   * Tests that default value is correctly validated and saved.
+   */
+  function testDefaultValue() {
+    // Create a test field and instance.
+    $field_name = 'test';
+    $field = array(
+      'field_name' => $field_name,
+      'type' => 'test_field'
+    );
+    field_create_field($field);
+    $instance = array(
+      'field_name' => $field_name,
+      'entity_type' => 'node',
+      'bundle' => $this->type,
+    );
+    field_create_instance($instance);
+
+    $langcode = LANGUAGE_NONE;
+    $admin_path = 'admin/structure/types/manage/' . $this->hyphen_type . '/fields/' . $field_name;
+    $element_id = "edit-$field_name-$langcode-0-value";
+    $element_name = "{$field_name}[$langcode][0][value]";
+    $this->drupalGet($admin_path);
+    $this->assertFieldById($element_id, '', 'The default value widget was empty.');
+
+    // Check that invalid default values are rejected.
+    $edit = array($element_name => '-1');
+    $this->drupalPost($admin_path, $edit, t('Save settings'));
+    $this->assertText("$field_name does not accept the value -1", 'Form vaildation failed.');
+
+    // Check that the default value is saved.
+    $edit = array($element_name => '1');
+    $this->drupalPost($admin_path, $edit, t('Save settings'));
+    $this->assertText("Saved $field_name configuration", 'The form was successfully submitted.');
+    $instance = field_info_instance('node', $field_name, $this->type);
+    $this->assertEqual($instance['default_value'], array(array('value' => 1)), 'The default value was correctly saved.');
+
+    // Check that the default value shows up in the form
+    $this->drupalGet($admin_path);
+    $this->assertFieldById($element_id, '1', 'The default value widget was displayed with the correct value.');
+
+    // Check that the default value can be emptied.
+    $edit = array($element_name => '');
+    $this->drupalPost(NULL, $edit, t('Save settings'));
+    $this->assertText("Saved $field_name configuration", 'The form was successfully submitted.');
+    field_info_cache_clear();
+    $instance = field_info_instance('node', $field_name, $this->type);
+    $this->assertEqual($instance['default_value'], NULL, 'The default value was correctly saved.');
+  }
+
+  /**
+   * Tests that deletion removes fields and instances as expected.
+   */
+  function testDeleteField() {
+    // Create a new field.
+    $bundle_path1 = 'admin/structure/types/manage/' . $this->hyphen_type;
+    $edit1 = array(
+      'fields[_add_new_field][label]' => $this->field_label,
+      'fields[_add_new_field][field_name]' => $this->field_name_input,
+    );
+    $this->fieldUIAddNewField($bundle_path1, $edit1);
+
+    // Create an additional node type.
+    $type_name2 = strtolower($this->randomName(8)) . '_test';
+    $type2 = $this->drupalCreateContentType(array('name' => $type_name2, 'type' => $type_name2));
+    $type_name2 = $type2->type;
+    $hyphen_type2 = str_replace('_', '-', $type_name2);
+
+    // Add an instance to the second node type.
+    $bundle_path2 = 'admin/structure/types/manage/' . $hyphen_type2;
+    $edit2 = array(
+      'fields[_add_existing_field][label]' => $this->field_label,
+      'fields[_add_existing_field][field_name]' => $this->field_name,
+    );
+    $this->fieldUIAddExistingField($bundle_path2, $edit2);
+
+    // Delete the first instance.
+    $this->fieldUIDeleteField($bundle_path1, $this->field_name, $this->field_label, $this->type);
+
+    // Reset the fields info.
+    field_info_cache_clear();
+    // Check that the field instance was deleted.
+    $this->assertNull(field_info_instance('node', $this->field_name, $this->type), 'Field instance was deleted.');
+    // Check that the field was not deleted
+    $this->assertNotNull(field_info_field($this->field_name), 'Field was not deleted.');
+
+    // Delete the second instance.
+    $this->fieldUIDeleteField($bundle_path2, $this->field_name, $this->field_label, $type_name2);
+
+    // Reset the fields info.
+    field_info_cache_clear();
+    // Check that the field instance was deleted.
+    $this->assertNull(field_info_instance('node', $this->field_name, $type_name2), 'Field instance was deleted.');
+    // Check that the field was deleted too.
+    $this->assertNull(field_info_field($this->field_name), 'Field was deleted.');
+  }
+
+  /**
+   * Tests that Field UI respects the 'no_ui' option in hook_field_info().
+   */
+  function testHiddenFields() {
+    $bundle_path = 'admin/structure/types/manage/' . $this->hyphen_type . '/fields/';
+
+    // Check that the field type is not available in the 'add new field' row.
+    $this->drupalGet($bundle_path);
+    $this->assertFalse($this->xpath('//select[@id="edit-add-new-field-type"]//option[@value="hidden_test_field"]'), "The 'add new field' select respects field types 'no_ui' property.");
+
+    // Create a field and an instance programmatically.
+    $field_name = 'hidden_test_field';
+    field_create_field(array('field_name' => $field_name, 'type' => $field_name));
+    $instance = array(
+      'field_name' => $field_name,
+      'bundle' => $this->type,
+      'entity_type' => 'node',
+      'label' => t('Hidden field'),
+      'widget' => array('type' => 'test_field_widget'),
+    );
+    field_create_instance($instance);
+    $this->assertTrue(field_read_instance('node', $field_name, $this->type), format_string('An instance of the field %field was created programmatically.', array('%field' => $field_name)));
+
+    // Check that the newly added instance appears on the 'Manage Fields'
+    // screen.
+    $this->drupalGet($bundle_path);
+    $this->assertFieldByXPath('//table[@id="field-overview"]//td[1]', $instance['label'], 'Field was created and appears in the overview page.');
+
+    // Check that the instance does not appear in the 'add existing field' row
+    // on other bundles.
+    $bundle_path = 'admin/structure/types/manage/article/fields/';
+    $this->drupalGet($bundle_path);
+    $this->assertFalse($this->xpath('//select[@id="edit-add-existing-field-field-name"]//option[@value=:field_name]', array(':field_name' => $field_name)), "The 'add existing field' select respects field types 'no_ui' property.");
+  }
+
+  /**
+   * Tests renaming a bundle.
+   */
+  function testRenameBundle() {
+    $type2 = strtolower($this->randomName(8)) . '_' .'test';
+    $hyphen_type2 = str_replace('_', '-', $type2);
+
+    $options = array(
+      'type' => $type2,
+    );
+    $this->drupalPost('admin/structure/types/manage/' . $this->hyphen_type, $options, t('Save content type'));
+
+    $this->drupalGet('admin/structure/types/manage/' . $hyphen_type2 . '/fields');
+  }
+
+  /**
+   * Tests that a duplicate field name is caught by validation.
+   */
+  function testDuplicateFieldName() {
+    // field_tags already exists, so we're expecting an error when trying to
+    // create a new field with the same name.
+    $edit = array(
+      'fields[_add_new_field][field_name]' => 'tags',
+      'fields[_add_new_field][label]' => $this->randomName(),
+      'fields[_add_new_field][type]' => 'taxonomy_term_reference',
+      'fields[_add_new_field][widget_type]' => 'options_select',
+    );
+    $url = 'admin/structure/types/manage/' . $this->hyphen_type . '/fields';
+    $this->drupalPost($url, $edit, t('Save'));
+
+    $this->assertText(t('The machine-readable name is already in use. It must be unique.'));
+    $this->assertUrl($url, array(), 'Stayed on the same page.');
+  }
+}
+
+/**
+ * Tests the functionality of the 'Manage display' screens.
+ */
+class FieldUIManageDisplayTestCase extends FieldUITestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Manage display',
+      'description' => 'Test the Field UI "Manage display" screens.',
+      'group' => 'Field UI',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('search'));
+  }
+
+  /**
+   * Tests formatter settings.
+   */
+  function testFormatterUI() {
+    $manage_fields = 'admin/structure/types/manage/' . $this->hyphen_type;
+    $manage_display = $manage_fields . '/display';
+
+    // Create a field, and a node with some data for the field.
+    $edit = array(
+      'fields[_add_new_field][label]' => 'Test field',
+      'fields[_add_new_field][field_name]' => 'test',
+    );
+    $this->fieldUIAddNewField($manage_fields, $edit);
+
+    // Clear the test-side cache and get the saved field instance.
+    field_info_cache_clear();
+    $instance = field_info_instance('node', 'field_test', $this->type);
+    $format = $instance['display']['default']['type'];
+    $default_settings = field_info_formatter_settings($format);
+    $setting_name = key($default_settings);
+    $setting_value = $instance['display']['default']['settings'][$setting_name];
+
+    // Display the "Manage display" screen and check that the expected formatter is
+    // selected.
+    $this->drupalGet($manage_display);
+    $this->assertFieldByName('fields[field_test][type]', $format, 'The expected formatter is selected.');
+    $this->assertText("$setting_name: $setting_value", 'The expected summary is displayed.');
+
+    // Change the formatter and check that the summary is updated.
+    $edit = array('fields[field_test][type]' => 'field_test_multiple', 'refresh_rows' => 'field_test');
+    $this->drupalPostAJAX(NULL, $edit, array('op' => t('Refresh')));
+    $format = 'field_test_multiple';
+    $default_settings = field_info_formatter_settings($format);
+    $setting_name = key($default_settings);
+    $setting_value = $default_settings[$setting_name];
+    $this->assertFieldByName('fields[field_test][type]', $format, 'The expected formatter is selected.');
+    $this->assertText("$setting_name: $setting_value", 'The expected summary is displayed.');
+
+    // Submit the form and check that the instance is updated.
+    $this->drupalPost(NULL, array(), t('Save'));
+    field_info_cache_clear();
+    $instance = field_info_instance('node', 'field_test', $this->type);
+    $current_format = $instance['display']['default']['type'];
+    $current_setting_value = $instance['display']['default']['settings'][$setting_name];
+    $this->assertEqual($current_format, $format, 'The formatter was updated.');
+    $this->assertEqual($current_setting_value, $setting_value, 'The setting was updated.');
+  }
+
+  /**
+   * Tests switching view modes to use custom or 'default' settings'.
+   */
+  function testViewModeCustom() {
+    // Create a field, and a node with some data for the field.
+    $edit = array(
+      'fields[_add_new_field][label]' => 'Test field',
+      'fields[_add_new_field][field_name]' => 'test',
+    );
+    $this->fieldUIAddNewField('admin/structure/types/manage/' . $this->hyphen_type, $edit);
+    // For this test, use a formatter setting value that is an integer unlikely
+    // to appear in a rendered node other than as part of the field being tested
+    // (for example, unlikely to be part of the "Submitted by ... on ..." line).
+    $value = 12345;
+    $settings = array(
+      'type' => $this->type,
+      'field_test' => array(LANGUAGE_NONE => array(array('value' => $value))),
+    );
+    $node = $this->drupalCreateNode($settings);
+
+    // Gather expected output values with the various formatters.
+    $formatters = field_info_formatter_types();
+    $output = array(
+      'field_test_default' => $formatters['field_test_default']['settings']['test_formatter_setting'] . '|' . $value,
+      'field_test_with_prepare_view' => $formatters['field_test_with_prepare_view']['settings']['test_formatter_setting_additional'] . '|' . $value. '|' . ($value + 1),
+    );
+
+    // Check that the field is displayed with the default formatter in 'rss'
+    // mode (uses 'default'), and hidden in 'teaser' mode (uses custom settings).
+    $this->assertNodeViewText($node, 'rss', $output['field_test_default'], "The field is displayed as expected in view modes that use 'default' settings.");
+    $this->assertNodeViewNoText($node, 'teaser', $value, "The field is hidden in view modes that use custom settings.");
+
+    // Change fomatter for 'default' mode, check that the field is displayed
+    // accordingly in 'rss' mode.
+    $edit = array(
+      'fields[field_test][type]' => 'field_test_with_prepare_view',
+    );
+    $this->drupalPost('admin/structure/types/manage/' . $this->hyphen_type . '/display', $edit, t('Save'));
+    $this->assertNodeViewText($node, 'rss', $output['field_test_with_prepare_view'], "The field is displayed as expected in view modes that use 'default' settings.");
+
+    // Specialize the 'rss' mode, check that the field is displayed the same.
+    $edit = array(
+      "view_modes_custom[rss]" => TRUE,
+    );
+    $this->drupalPost('admin/structure/types/manage/' . $this->hyphen_type . '/display', $edit, t('Save'));
+    $this->assertNodeViewText($node, 'rss', $output['field_test_with_prepare_view'], "The field is displayed as expected in newly specialized 'rss' mode.");
+
+    // Set the field to 'hidden' in the view mode, check that the field is
+    // hidden.
+    $edit = array(
+      'fields[field_test][type]' => 'hidden',
+    );
+    $this->drupalPost('admin/structure/types/manage/' . $this->hyphen_type . '/display/rss', $edit, t('Save'));
+    $this->assertNodeViewNoText($node, 'rss', $value, "The field is hidden in 'rss' mode.");
+
+    // Set the view mode back to 'default', check that the field is displayed
+    // accordingly.
+    $edit = array(
+      "view_modes_custom[rss]" => FALSE,
+    );
+    $this->drupalPost('admin/structure/types/manage/' . $this->hyphen_type . '/display', $edit, t('Save'));
+    $this->assertNodeViewText($node, 'rss', $output['field_test_with_prepare_view'], "The field is displayed as expected when 'rss' mode is set back to 'default' settings.");
+
+    // Specialize the view mode again.
+    $edit = array(
+      "view_modes_custom[rss]" => TRUE,
+    );
+    $this->drupalPost('admin/structure/types/manage/' . $this->hyphen_type . '/display', $edit, t('Save'));
+    // Check that the previous settings for the view mode have been kept.
+    $this->assertNodeViewNoText($node, 'rss', $value, "The previous settings are kept when 'rss' mode is specialized again.");
+  }
+
+  /**
+   * Asserts that a string is found in the rendered node in a view mode.
+   *
+   * @param $node
+   *   The node.
+   * @param $view_mode
+   *   The view mode in which the node should be displayed.
+   * @param $text
+   *   Plain text to look for.
+   * @param $message
+   *   Message to display.
+   *
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  function assertNodeViewText($node, $view_mode, $text, $message) {
+    return $this->assertNodeViewTextHelper($node, $view_mode, $text, $message, FALSE);
+  }
+
+  /**
+   * Asserts that a string is not found in the rendered node in a view mode.
+   *
+   * @param $node
+   *   The node.
+   * @param $view_mode
+   *   The view mode in which the node should be displayed.
+   * @param $text
+   *   Plain text to look for.
+   * @param $message
+   *   Message to display.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  function assertNodeViewNoText($node, $view_mode, $text, $message) {
+    return $this->assertNodeViewTextHelper($node, $view_mode, $text, $message, TRUE);
+  }
+
+  /**
+   * Asserts that a string is (not) found in the rendered nodein a view mode.
+   *
+   * This helper function is used by assertNodeViewText() and
+   * assertNodeViewNoText().
+   *
+   * @param $node
+   *   The node.
+   * @param $view_mode
+   *   The view mode in which the node should be displayed.
+   * @param $text
+   *   Plain text to look for.
+   * @param $message
+   *   Message to display.
+   * @param $not_exists
+   *   TRUE if this text should not exist, FALSE if it should.
+   *
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  function assertNodeViewTextHelper($node, $view_mode, $text, $message, $not_exists) {
+    // Make sure caches on the tester side are refreshed after changes
+    // submitted on the tested side.
+    field_info_cache_clear();
+
+    // Save current content so that we can restore it when we're done.
+    $old_content = $this->drupalGetContent();
+
+    // Render a cloned node, so that we do not alter the original.
+    $clone = clone $node;
+    $element = node_view($clone, $view_mode);
+    $output = drupal_render($element);
+    $this->verbose(t('Rendered node - view mode: @view_mode', array('@view_mode' => $view_mode)) . '<hr />'. $output);
+
+    // Assign content so that DrupalWebTestCase functions can be used.
+    $this->drupalSetContent($output);
+    $method = ($not_exists ? 'assertNoText' : 'assertText');
+    $return = $this->{$method}((string) $text, $message);
+
+    // Restore previous content.
+    $this->drupalSetContent($old_content);
+
+    return $return;
+  }
+}
+
+/**
+ * Tests custom widget hooks and callbacks on the field administration pages.
+ */
+class FieldUIAlterTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Widget customization',
+      'description' => 'Test custom field widget hooks and callbacks on field administration pages.',
+      'group' => 'Field UI',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('field_test'));
+
+    // Create test user.
+    $admin_user = $this->drupalCreateUser(array('access content', 'administer content types', 'administer users'));
+    $this->drupalLogin($admin_user);
+  }
+
+  /**
+   * Tests hook_field_widget_properties_alter() on the default field widget.
+   *
+   * @see field_test_field_widget_properties_alter()
+   * @see field_test_field_widget_properties_user_alter()
+   * @see field_test_field_widget_form_alter()
+   */
+  function testDefaultWidgetPropertiesAlter() {
+    // Create the alter_test_text field and an instance on article nodes.
+    field_create_field(array(
+      'field_name' => 'alter_test_text',
+      'type' => 'text',
+    ));
+    field_create_instance(array(
+      'field_name' => 'alter_test_text',
+      'entity_type' => 'node',
+      'bundle' => 'article',
+      'widget' => array(
+        'type' => 'text_textfield',
+        'size' => 60,
+      ),
+    ));
+
+    // Test that field_test_field_widget_properties_alter() sets the size to
+    // 42 and that field_test_field_widget_form_alter() reports the correct
+    // size when the form is displayed.
+    $this->drupalGet('admin/structure/types/manage/article/fields/alter_test_text');
+    $this->assertText('Field size: 42', 'Altered field size is found in hook_field_widget_form_alter().');
+
+    // Create the alter_test_options field.
+    field_create_field(array(
+      'field_name' => 'alter_test_options',
+      'type' => 'list_text'
+    ));
+    // Create instances on users and page nodes.
+    field_create_instance(array(
+      'field_name' => 'alter_test_options',
+      'entity_type' => 'user',
+      'bundle' => 'user',
+      'widget' => array(
+        'type' => 'options_select',
+      )
+    ));
+    field_create_instance(array(
+      'field_name' => 'alter_test_options',
+      'entity_type' => 'node',
+      'bundle' => 'page',
+      'widget' => array(
+        'type' => 'options_select',
+      )
+    ));
+
+    // Test that field_test_field_widget_properties_user_alter() replaces
+    // the widget and that field_test_field_widget_form_alter() reports the
+    // correct widget name when the form is displayed.
+    $this->drupalGet('admin/config/people/accounts/fields/alter_test_options');
+    $this->assertText('Widget type: options_buttons', 'Widget type is altered for users in hook_field_widget_form_alter().');
+
+    // Test that the widget is not altered on page nodes.
+    $this->drupalGet('admin/structure/types/manage/page/fields/alter_test_options');
+    $this->assertText('Widget type: options_select', 'Widget type is not altered for pages in hook_field_widget_form_alter().');
+  }
+}
diff --git a/htmltest/modules/file/file.api.php b/htmltest/modules/file/file.api.php
new file mode 100644
index 00000000..df178c6f
--- /dev/null
+++ b/htmltest/modules/file/file.api.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Hooks for file module.
+ */
+
+/**
+ * Control download access to files.
+ *
+ * The hook is typically implemented to limit access based on the entity the
+ * file is referenced, e.g., only users with access to a node should be allowed
+ * to download files attached to that node.
+ *
+ * @param array $file_item
+ *   The array of information about the file to check access for.
+ * @param $entity_type
+ *   The type of $entity; for example, 'node' or 'user'.
+ * @param $entity
+ *   The $entity to which $file is referenced.
+ *
+ * @return
+ *   TRUE is access should be allowed by this entity or FALSE if denied. Note
+ *   that denial may be overridden by another entity controller, making this
+ *   grant permissive rather than restrictive.
+ *
+ * @see hook_field_access().
+ */
+function hook_file_download_access($file_item, $entity_type, $entity) {
+  if ($entity_type == 'node') {
+    return node_access('view', $entity);
+  }
+}
+
+/**
+ * Alter the access rules applied to a file download.
+ *
+ * Entities that implement file management set the access rules for their
+ * individual files. Module may use this hook to create custom access rules
+ * for file downloads.
+ *
+ * @see hook_file_download_access().
+ *
+ * @param $grants
+ *   An array of grants gathered by hook_file_download_access(). The array is
+ *   keyed by the module that defines the entity type's access control; the
+ *   values are Boolean grant responses for each module.
+ * @param array $file_item
+ *   The array of information about the file to alter access for.
+ * @param $entity_type
+ *   The type of $entity; for example, 'node' or 'user'.
+ * @param $entity
+ *   The $entity to which $file is referenced.
+ */
+function hook_file_download_access_alter(&$grants, $file_item, $entity_type, $entity) {
+  // For our example module, we always enforce the rules set by node module.
+  if (isset($grants['node'])) {
+    $grants = array('node' => $grants['node']);
+  }
+}
diff --git a/htmltest/modules/file/file.css b/htmltest/modules/file/file.css
new file mode 100644
index 00000000..bd4a0597
--- /dev/null
+++ b/htmltest/modules/file/file.css
@@ -0,0 +1,35 @@
+/**
+ * @file
+ * Admin stylesheet for file module.
+ */
+
+/**
+ * Managed file element styles.
+ */
+.form-managed-file .form-file,
+.form-managed-file .form-submit {
+  margin: 0;
+}
+
+.form-managed-file input.progress-disabled {
+  float: none;
+  display: inline;
+}
+
+.form-managed-file div.ajax-progress,
+.form-managed-file div.throbber {
+  display: inline;
+  float: none;
+  padding: 1px 5px 2px 5px;
+}
+
+.form-managed-file div.ajax-progress-bar {
+  display: none;
+  margin-top: 4px;
+  width: 28em;
+  padding: 0;
+}
+
+.form-managed-file div.ajax-progress-bar div.bar {
+  margin: 0;
+}
diff --git a/htmltest/modules/file/file.field.inc b/htmltest/modules/file/file.field.inc
new file mode 100644
index 00000000..d540c0aa
--- /dev/null
+++ b/htmltest/modules/file/file.field.inc
@@ -0,0 +1,1024 @@
+<?php
+
+/**
+ * @file
+ * Field module functionality for the File module.
+ */
+
+/**
+ * Implements hook_field_info().
+ */
+function file_field_info() {
+  return array(
+    'file' => array(
+      'label' => t('File'),
+      'description' => t('This field stores the ID of a file as an integer value.'),
+      'settings' => array(
+        'display_field' => 0,
+        'display_default' => 0,
+        'uri_scheme' => variable_get('file_default_scheme', 'public'),
+      ),
+      'instance_settings' => array(
+        'file_extensions' => 'txt',
+        'file_directory' => '',
+        'max_filesize' => '',
+        'description_field' => 0,
+      ),
+      'default_widget' => 'file_generic',
+      'default_formatter' => 'file_default',
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_settings_form().
+ */
+function file_field_settings_form($field, $instance, $has_data) {
+  $defaults = field_info_field_settings($field['type']);
+  $settings = array_merge($defaults, $field['settings']);
+
+  $form['#attached']['js'][] = drupal_get_path('module', 'file') . '/file.js';
+
+  $form['display_field'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable <em>Display</em> field'),
+    '#default_value' => $settings['display_field'],
+    '#description' => t('The display option allows users to choose if a file should be shown when viewing the content.'),
+  );
+  $form['display_default'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Files displayed by default'),
+    '#default_value' => $settings['display_default'],
+    '#description' => t('This setting only has an effect if the display option is enabled.'),
+  );
+
+  $scheme_options = array();
+  foreach (file_get_stream_wrappers(STREAM_WRAPPERS_WRITE_VISIBLE) as $scheme => $stream_wrapper) {
+    $scheme_options[$scheme] = $stream_wrapper['name'];
+  }
+  $form['uri_scheme'] = array(
+    '#type' => 'radios',
+    '#title' => t('Upload destination'),
+    '#options' => $scheme_options,
+    '#default_value' => $settings['uri_scheme'],
+    '#description' => t('Select where the final files should be stored. Private file storage has significantly more overhead than public files, but allows restricted access to files within this field.'),
+    '#disabled' => $has_data,
+  );
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_instance_settings_form().
+ */
+function file_field_instance_settings_form($field, $instance) {
+  $settings = $instance['settings'];
+
+  $form['file_directory'] = array(
+    '#type' => 'textfield',
+    '#title' => t('File directory'),
+    '#default_value' => $settings['file_directory'],
+    '#description' => t('Optional subdirectory within the upload destination where files will be stored. Do not include preceding or trailing slashes.'),
+    '#element_validate' => array('_file_generic_settings_file_directory_validate'),
+    '#weight' => 3,
+  );
+
+  // Make the extension list a little more human-friendly by comma-separation.
+  $extensions = str_replace(' ', ', ', $settings['file_extensions']);
+  $form['file_extensions'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Allowed file extensions'),
+    '#default_value' => $extensions,
+    '#description' => t('Separate extensions with a space or comma and do not include the leading dot.'),
+    '#element_validate' => array('_file_generic_settings_extensions'),
+    '#weight' => 1,
+    // By making this field required, we prevent a potential security issue
+    // that would allow files of any type to be uploaded.
+    '#required' => TRUE,
+  );
+
+  $form['max_filesize'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Maximum upload size'),
+    '#default_value' => $settings['max_filesize'],
+    '#description' => t('Enter a value like "512" (bytes), "80 KB" (kilobytes) or "50 MB" (megabytes) in order to restrict the allowed file size. If left empty the file sizes will be limited only by PHP\'s maximum post and file upload sizes (current limit <strong>%limit</strong>).', array('%limit' => format_size(file_upload_max_size()))),
+    '#size' => 10,
+    '#element_validate' => array('_file_generic_settings_max_filesize'),
+    '#weight' => 5,
+  );
+
+  $form['description_field'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable <em>Description</em> field'),
+    '#default_value' => isset($settings['description_field']) ? $settings['description_field'] : '',
+    '#description' => t('The description field allows users to enter a description about the uploaded file.'),
+    '#parents' => array('instance', 'settings', 'description_field'),
+    '#weight' => 11,
+  );
+
+  return $form;
+}
+
+/**
+ * Element validate callback for the maximum upload size field.
+ *
+ * Ensure a size that can be parsed by parse_size() has been entered.
+ */
+function _file_generic_settings_max_filesize($element, &$form_state) {
+  if (!empty($element['#value']) && !is_numeric(parse_size($element['#value']))) {
+    form_error($element, t('The "!name" option must contain a valid value. You may either leave the text field empty or enter a string like "512" (bytes), "80 KB" (kilobytes) or "50 MB" (megabytes).', array('!name' => t($element['title']))));
+  }
+}
+
+/**
+ * Element validate callback for the allowed file extensions field.
+ *
+ * This doubles as a convenience clean-up function and a validation routine.
+ * Commas are allowed by the end-user, but ultimately the value will be stored
+ * as a space-separated list for compatibility with file_validate_extensions().
+ */
+function _file_generic_settings_extensions($element, &$form_state) {
+  if (!empty($element['#value'])) {
+    $extensions = preg_replace('/([, ]+\.?)/', ' ', trim(strtolower($element['#value'])));
+    $extensions = array_filter(explode(' ', $extensions));
+    $extensions = implode(' ', array_unique($extensions));
+    if (!preg_match('/^([a-z0-9]+([.][a-z0-9])* ?)+$/', $extensions)) {
+      form_error($element, t('The list of allowed extensions is not valid, be sure to exclude leading dots and to separate extensions with a comma or space.'));
+    }
+    else {
+      form_set_value($element, $extensions, $form_state);
+    }
+  }
+}
+
+/**
+ * Element validate callback for the file destination field.
+ *
+ * Remove slashes from the beginning and end of the destination value and ensure
+ * that the file directory path is not included at the beginning of the value.
+ */
+function _file_generic_settings_file_directory_validate($element, &$form_state) {
+  // Strip slashes from the beginning and end of $widget['file_directory'].
+  $value = trim($element['#value'], '\\/');
+  form_set_value($element, $value, $form_state);
+}
+
+/**
+ * Implements hook_field_load().
+ */
+function file_field_load($entity_type, $entities, $field, $instances, $langcode, &$items, $age) {
+
+  $fids = array();
+  foreach ($entities as $id => $entity) {
+    // Load the files from the files table.
+    foreach ($items[$id] as $delta => $item) {
+      if (!empty($item['fid'])) {
+        $fids[] = $item['fid'];
+      }
+    }
+  }
+  $files = file_load_multiple($fids);
+
+  foreach ($entities as $id => $entity) {
+    foreach ($items[$id] as $delta => $item) {
+      // If the file does not exist, mark the entire item as empty.
+      if (empty($item['fid']) || !isset($files[$item['fid']])) {
+        $items[$id][$delta] = NULL;
+      }
+      else {
+        $items[$id][$delta] = array_merge((array) $files[$item['fid']], $item);
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_prepare_view().
+ */
+function file_field_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items) {
+  // Remove files specified to not be displayed.
+  foreach ($entities as $id => $entity) {
+    foreach ($items[$id] as $delta => $item) {
+      if (!file_field_displayed($item, $field)) {
+        unset($items[$id][$delta]);
+      }
+    }
+    // Ensure consecutive deltas.
+    $items[$id] = array_values($items[$id]);
+  }
+}
+
+/**
+ * Implements hook_field_presave().
+ */
+function file_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  // Make sure that each file which will be saved with this object has a
+  // permanent status, so that it will not be removed when temporary files are
+  // cleaned up.
+  foreach ($items as $delta => $item) {
+    if (empty($item['fid'])) {
+      unset($items[$delta]);
+      continue;
+    }
+    $file = file_load($item['fid']);
+    if (empty($file)) {
+      unset($items[$delta]);
+      continue;
+    }
+    if (!$file->status) {
+      $file->status = FILE_STATUS_PERMANENT;
+      file_save($file);
+    }
+  }
+}
+
+/**
+ * Implements hook_field_insert().
+ */
+function file_field_insert($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  // Add a new usage of each uploaded file.
+  foreach ($items as $item) {
+    $file = (object) $item;
+    file_usage_add($file, 'file', $entity_type, $id);
+  }
+}
+
+/**
+ * Implements hook_field_update().
+ *
+ * Checks for files that have been removed from the object.
+ */
+function file_field_update($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  // On new revisions, all files are considered to be a new usage and no
+  // deletion of previous file usages are necessary.
+  if (!empty($entity->revision)) {
+    foreach ($items as $item) {
+      $file = (object) $item;
+      file_usage_add($file, 'file', $entity_type, $id);
+    }
+    return;
+  }
+
+  // Build a display of the current FIDs.
+  $current_fids = array();
+  foreach ($items as $item) {
+    $current_fids[] = $item['fid'];
+  }
+
+  // Compare the original field values with the ones that are being saved. Use
+  // $entity->original to check this when possible, but if it isn't available,
+  // create a bare-bones entity and load its previous values instead.
+  if (isset($entity->original)) {
+    $original = $entity->original;
+  }
+  else {
+    $original = entity_create_stub_entity($entity_type, array($id, $vid, $bundle));
+    field_attach_load($entity_type, array($id => $original), FIELD_LOAD_CURRENT, array('field_id' => $field['id']));
+  }
+  $original_fids = array();
+  if (!empty($original->{$field['field_name']}[$langcode])) {
+    foreach ($original->{$field['field_name']}[$langcode] as $original_item) {
+      $original_fids[] = $original_item['fid'];
+      if (isset($original_item['fid']) && !in_array($original_item['fid'], $current_fids)) {
+        // Decrement the file usage count by 1 and delete the file if possible.
+        file_field_delete_file($original_item, $field, $entity_type, $id);
+      }
+    }
+  }
+
+  // Add new usage entries for newly added files.
+  foreach ($items as $item) {
+    if (!in_array($item['fid'], $original_fids)) {
+      $file = (object) $item;
+      file_usage_add($file, 'file', $entity_type, $id);
+    }
+  }
+}
+
+/**
+ * Implements hook_field_delete().
+ */
+function file_field_delete($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+
+  // Delete all file usages within this entity.
+  foreach ($items as $delta => $item) {
+    file_field_delete_file($item, $field, $entity_type, $id, 0);
+  }
+}
+
+/**
+ * Implements hook_field_delete_revision().
+ */
+function file_field_delete_revision($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+  foreach ($items as $delta => $item) {
+    // Decrement the file usage count by 1 and delete the file if possible.
+    if (file_field_delete_file($item, $field, $entity_type, $id)) {
+      $items[$delta] = NULL;
+    }
+  }
+}
+
+/**
+ * Decrements the usage count for a file and attempts to delete it.
+ *
+ * This function only has an effect if the file being deleted is used only by
+ * File module.
+ *
+ * @param $item
+ *   The field item that contains a file array.
+ * @param $field
+ *   The field structure for the operation.
+ * @param $entity_type
+ *   The type of $entity.
+ * @param $id
+ *   The entity ID which contains the file being deleted.
+ * @param $count
+ *   (optional) The number of references to decrement from the object
+ *   containing the file. Defaults to 1.
+ *
+ * @return
+ *   Boolean TRUE if the file was deleted, or an array of remaining references
+ *   if the file is still in use by other modules. Boolean FALSE if an error
+ *   was encountered.
+ */
+function file_field_delete_file($item, $field, $entity_type, $id, $count = 1) {
+  // To prevent the file field from deleting files it doesn't know about, check
+  // the file reference count. Temporary files can be deleted because they
+  // are not yet associated with any content at all.
+  $file = (object) $item;
+  $file_usage = file_usage_list($file);
+  if ($file->status == 0 || !empty($file_usage['file'])) {
+    file_usage_delete($file, 'file', $entity_type, $id, $count);
+    return file_delete($file);
+  }
+
+  // Even if the file is not deleted, return TRUE to indicate the file field
+  // record can be removed from the field database tables.
+  return TRUE;
+}
+
+/**
+ * Implements hook_field_is_empty().
+ */
+function file_field_is_empty($item, $field) {
+  return empty($item['fid']);
+}
+
+/**
+ * Determines whether a file should be displayed when outputting field content.
+ *
+ * @param $item
+ *   A field item array.
+ * @param $field
+ *   A field array.
+ *
+ * @return
+ *   Boolean TRUE if the file will be displayed, FALSE if the file is hidden.
+ */
+function file_field_displayed($item, $field) {
+  if (!empty($field['settings']['display_field'])) {
+    return (bool) $item['display'];
+  }
+  return TRUE;
+}
+
+/**
+ * Implements hook_field_formatter_info().
+ */
+function file_field_formatter_info() {
+  return array(
+    'file_default' => array(
+      'label' => t('Generic file'),
+      'field types' => array('file'),
+    ),
+    'file_table' => array(
+      'label' => t('Table of files'),
+      'field types' => array('file'),
+    ),
+    'file_url_plain' => array(
+      'label' => t('URL to file'),
+      'field types' => array('file'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_widget_info().
+ */
+function file_field_widget_info() {
+  return array(
+    'file_generic' => array(
+      'label' => t('File'),
+      'field types' => array('file'),
+      'settings' => array(
+        'progress_indicator' => 'throbber',
+      ),
+      'behaviors' => array(
+        'multiple values' => FIELD_BEHAVIOR_CUSTOM,
+        'default value' => FIELD_BEHAVIOR_NONE,
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_widget_settings_form().
+ */
+function file_field_widget_settings_form($field, $instance) {
+  $widget = $instance['widget'];
+  $settings = $widget['settings'];
+
+  $form['progress_indicator'] = array(
+    '#type' => 'radios',
+    '#title' => t('Progress indicator'),
+    '#options' => array(
+      'throbber' => t('Throbber'),
+      'bar' => t('Bar with progress meter'),
+    ),
+    '#default_value' => $settings['progress_indicator'],
+    '#description' => t('The throbber display does not show the status of uploads but takes up less space. The progress bar is helpful for monitoring progress on large uploads.'),
+    '#weight' => 16,
+    '#access' => file_progress_implementation(),
+  );
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_widget_form().
+ */
+function file_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+
+  $defaults = array(
+    'fid' => 0,
+    'display' => !empty($field['settings']['display_default']),
+    'description' => '',
+  );
+
+  // Load the items for form rebuilds from the field state as they might not be
+  // in $form_state['values'] because of validation limitations. Also, they are
+  // only passed in as $items when editing existing entities.
+  $field_state = field_form_get_state($element['#field_parents'], $field['field_name'], $langcode, $form_state);
+  if (isset($field_state['items'])) {
+    $items = $field_state['items'];
+  }
+
+  // Essentially we use the managed_file type, extended with some enhancements.
+  $element_info = element_info('managed_file');
+  $element += array(
+    '#type' => 'managed_file',
+    '#upload_location' => file_field_widget_uri($field, $instance),
+    '#upload_validators' => file_field_widget_upload_validators($field, $instance),
+    '#value_callback' => 'file_field_widget_value',
+    '#process' => array_merge($element_info['#process'], array('file_field_widget_process')),
+    '#progress_indicator' => $instance['widget']['settings']['progress_indicator'],
+    // Allows this field to return an array instead of a single value.
+    '#extended' => TRUE,
+  );
+
+  if ($field['cardinality'] == 1) {
+    // Set the default value.
+    $element['#default_value'] = !empty($items) ? $items[0] : $defaults;
+    // If there's only one field, return it as delta 0.
+    if (empty($element['#default_value']['fid'])) {
+      $element['#description'] = theme('file_upload_help', array('description' => $element['#description'], 'upload_validators' => $element['#upload_validators']));
+    }
+    $elements = array($element);
+  }
+  else {
+    // If there are multiple values, add an element for each existing one.
+    foreach ($items as $item) {
+      $elements[$delta] = $element;
+      $elements[$delta]['#default_value'] = $item;
+      $elements[$delta]['#weight'] = $delta;
+      $delta++;
+    }
+    // And then add one more empty row for new uploads except when this is a
+    // programmed form as it is not necessary.
+    if (($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED || $delta < $field['cardinality']) && empty($form_state['programmed'])) {
+      $elements[$delta] = $element;
+      $elements[$delta]['#default_value'] = $defaults;
+      $elements[$delta]['#weight'] = $delta;
+      $elements[$delta]['#required'] = ($element['#required'] && $delta == 0);
+    }
+    // The group of elements all-together need some extra functionality
+    // after building up the full list (like draggable table rows).
+    $elements['#file_upload_delta'] = $delta;
+    $elements['#theme'] = 'file_widget_multiple';
+    $elements['#theme_wrappers'] = array('fieldset');
+    $elements['#process'] = array('file_field_widget_process_multiple');
+    $elements['#title'] = $element['#title'];
+    $elements['#description'] = $element['#description'];
+    $elements['#field_name'] = $element['#field_name'];
+    $elements['#language'] = $element['#language'];
+    $elements['#display_field'] = $field['settings']['display_field'];
+
+    // Add some properties that will eventually be added to the file upload
+    // field. These are added here so that they may be referenced easily through
+    // a hook_form_alter().
+    $elements['#file_upload_title'] = t('Add a new file');
+    $elements['#file_upload_description'] = theme('file_upload_help', array('description' => '', 'upload_validators' => $elements[0]['#upload_validators']));
+  }
+
+  return $elements;
+}
+
+/**
+ * Retrieves the upload validators for a file field.
+ *
+ * @param $field
+ *   A field array.
+ *
+ * @return
+ *   An array suitable for passing to file_save_upload() or the file field
+ *   element's '#upload_validators' property.
+ */
+function file_field_widget_upload_validators($field, $instance) {
+  // Cap the upload size according to the PHP limit.
+  $max_filesize = parse_size(file_upload_max_size());
+  if (!empty($instance['settings']['max_filesize']) && parse_size($instance['settings']['max_filesize']) < $max_filesize) {
+    $max_filesize = parse_size($instance['settings']['max_filesize']);
+  }
+
+  $validators = array();
+
+  // There is always a file size limit due to the PHP server limit.
+  $validators['file_validate_size'] = array($max_filesize);
+
+  // Add the extension check if necessary.
+  if (!empty($instance['settings']['file_extensions'])) {
+    $validators['file_validate_extensions'] = array($instance['settings']['file_extensions']);
+  }
+
+  return $validators;
+}
+
+/**
+ * Determines the URI for a file field instance.
+ *
+ * @param $field
+ *   A field array.
+ * @param $instance
+ *   A field instance array.
+ * @param $data
+ *   An array of token objects to pass to token_replace().
+ *
+ * @return
+ *   A file directory URI with tokens replaced.
+ *
+ * @see token_replace()
+ */
+function file_field_widget_uri($field, $instance, $data = array()) {
+  $destination = trim($instance['settings']['file_directory'], '/');
+
+  // Replace tokens.
+  $destination = token_replace($destination, $data);
+
+  return $field['settings']['uri_scheme'] . '://' . $destination;
+}
+
+/**
+ * The #value_callback for the file_generic field element.
+ */
+function file_field_widget_value($element, $input = FALSE, $form_state) {
+  if ($input) {
+    // Checkboxes lose their value when empty.
+    // If the display field is present make sure its unchecked value is saved.
+    $field = field_widget_field($element, $form_state);
+    if (empty($input['display'])) {
+      $input['display'] = $field['settings']['display_field'] ? 0 : 1;
+    }
+  }
+
+  // We depend on the managed file element to handle uploads.
+  $return = file_managed_file_value($element, $input, $form_state);
+
+  // Ensure that all the required properties are returned even if empty.
+  $return += array(
+    'fid' => 0,
+    'display' => 1,
+    'description' => '',
+  );
+
+  return $return;
+}
+
+/**
+ * An element #process callback for the file_generic field type.
+ *
+ * Expands the file_generic type to include the description and display fields.
+ */
+function file_field_widget_process($element, &$form_state, $form) {
+  $item = $element['#value'];
+  $item['fid'] = $element['fid']['#value'];
+
+  $field = field_widget_field($element, $form_state);
+  $instance = field_widget_instance($element, $form_state);
+  $settings = $instance['widget']['settings'];
+
+  $element['#theme'] = 'file_widget';
+
+  // Add the display field if enabled.
+  if (!empty($field['settings']['display_field']) && $item['fid']) {
+    $element['display'] = array(
+      '#type' => empty($item['fid']) ? 'hidden' : 'checkbox',
+      '#title' => t('Include file in display'),
+      '#value' => isset($item['display']) ? $item['display'] : $field['settings']['display_default'],
+      '#attributes' => array('class' => array('file-display')),
+    );
+  }
+  else {
+    $element['display'] = array(
+      '#type' => 'hidden',
+      '#value' => '1',
+    );
+  }
+
+  // Add the description field if enabled.
+  if (!empty($instance['settings']['description_field']) && $item['fid']) {
+    $element['description'] = array(
+      '#type' => variable_get('file_description_type', 'textfield'),
+      '#title' => t('Description'),
+      '#value' => isset($item['description']) ? $item['description'] : '',
+      '#maxlength' => variable_get('file_description_length', 128),
+      '#description' => t('The description may be used as the label of the link to the file.'),
+    );
+  }
+
+  // Adjust the Ajax settings so that on upload and remove of any individual
+  // file, the entire group of file fields is updated together.
+  if ($field['cardinality'] != 1) {
+    $parents = array_slice($element['#array_parents'], 0, -1);
+    $new_path = 'file/ajax/' . implode('/', $parents) . '/' . $form['form_build_id']['#value'];
+    $field_element = drupal_array_get_nested_value($form, $parents);
+    $new_wrapper = $field_element['#id'] . '-ajax-wrapper';
+    foreach (element_children($element) as $key) {
+      if (isset($element[$key]['#ajax'])) {
+        $element[$key]['#ajax']['path'] = $new_path;
+        $element[$key]['#ajax']['wrapper'] = $new_wrapper;
+      }
+    }
+    unset($element['#prefix'], $element['#suffix']);
+  }
+
+  // Add another submit handler to the upload and remove buttons, to implement
+  // functionality needed by the field widget. This submit handler, along with
+  // the rebuild logic in file_field_widget_form() requires the entire field,
+  // not just the individual item, to be valid.
+  foreach (array('upload_button', 'remove_button') as $key) {
+    $element[$key]['#submit'][] = 'file_field_widget_submit';
+    $element[$key]['#limit_validation_errors'] = array(array_slice($element['#parents'], 0, -1));
+  }
+
+  return $element;
+}
+
+/**
+ * An element #process callback for a group of file_generic fields.
+ *
+ * Adds the weight field to each row so it can be ordered and adds a new Ajax
+ * wrapper around the entire group so it can be replaced all at once.
+ */
+function file_field_widget_process_multiple($element, &$form_state, $form) {
+  $element_children = element_children($element, TRUE);
+  $count = count($element_children);
+
+  foreach ($element_children as $delta => $key) {
+    if ($key != $element['#file_upload_delta']) {
+      $description = _file_field_get_description_from_element($element[$key]);
+      $element[$key]['_weight'] = array(
+        '#type' => 'weight',
+        '#title' => $description ? t('Weight for @title', array('@title' => $description)) : t('Weight for new file'),
+        '#title_display' => 'invisible',
+        '#delta' => $count,
+        '#default_value' => $delta,
+      );
+    }
+    else {
+      // The title needs to be assigned to the upload field so that validation
+      // errors include the correct widget label.
+      $element[$key]['#title'] = $element['#title'];
+      $element[$key]['_weight'] = array(
+        '#type' => 'hidden',
+        '#default_value' => $delta,
+      );
+    }
+  }
+
+  // Add a new wrapper around all the elements for Ajax replacement.
+  $element['#prefix'] = '<div id="' . $element['#id'] . '-ajax-wrapper">';
+  $element['#suffix'] = '</div>';
+
+  return $element;
+}
+
+/**
+ * Retrieves the file description from a field field element.
+ *
+ * This helper function is used by file_field_widget_process_multiple().
+ *
+ * @param $element
+ *   The element being processed.
+ *
+ * @return
+ *   A description of the file suitable for use in the administrative interface.
+ */
+function _file_field_get_description_from_element($element) {
+  // Use the actual file description, if it's available.
+  if (!empty($element['#default_value']['description'])) {
+    return $element['#default_value']['description'];
+  }
+  // Otherwise, fall back to the filename.
+  if (!empty($element['#default_value']['filename'])) {
+    return $element['#default_value']['filename'];
+  }
+  // This is probably a newly uploaded file; no description is available.
+  return FALSE;
+}
+
+/**
+ * Form submission handler for upload/remove button of file_field_widget_form().
+ *
+ * This runs in addition to and after file_managed_file_submit().
+ *
+ * @see file_managed_file_submit()
+ * @see file_field_widget_form()
+ * @see file_field_widget_process()
+ */
+function file_field_widget_submit($form, &$form_state) {
+  // During the form rebuild, file_field_widget_form() will create field item
+  // widget elements using re-indexed deltas, so clear out $form_state['input']
+  // to avoid a mismatch between old and new deltas. The rebuilt elements will
+  // have #default_value set appropriately for the current state of the field,
+  // so nothing is lost in doing this.
+  $parents = array_slice($form_state['triggering_element']['#parents'], 0, -2);
+  drupal_array_set_nested_value($form_state['input'], $parents, NULL);
+
+  $button = $form_state['triggering_element'];
+
+  // Go one level up in the form, to the widgets container.
+  $element = drupal_array_get_nested_value($form, array_slice($button['#array_parents'], 0, -1));
+  $field_name = $element['#field_name'];
+  $langcode = $element['#language'];
+  $parents = $element['#field_parents'];
+
+  $submitted_values = drupal_array_get_nested_value($form_state['values'], array_slice($button['#array_parents'], 0, -2));
+  foreach ($submitted_values as $delta => $submitted_value) {
+    if (!$submitted_value['fid']) {
+      unset($submitted_values[$delta]);
+    }
+  }
+
+  // Re-index deltas after removing empty items.
+  $submitted_values = array_values($submitted_values);
+
+  // Update form_state values.
+  drupal_array_set_nested_value($form_state['values'], array_slice($button['#array_parents'], 0, -2), $submitted_values);
+
+  // Update items.
+  $field_state = field_form_get_state($parents, $field_name, $langcode, $form_state);
+  $field_state['items'] = $submitted_values;
+  field_form_set_state($parents, $field_name, $langcode, $form_state, $field_state);
+}
+
+/**
+ * Returns HTML for an individual file upload widget.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: A render element representing the widget.
+ *
+ * @ingroup themeable
+ */
+function theme_file_widget($variables) {
+  $element = $variables['element'];
+  $output = '';
+
+  // The "form-managed-file" class is required for proper Ajax functionality.
+  $output .= '<div class="file-widget form-managed-file clearfix">';
+  if ($element['fid']['#value'] != 0) {
+    // Add the file size after the file name.
+    $element['filename']['#markup'] .= ' <span class="file-size">(' . format_size($element['#file']->filesize) . ')</span> ';
+  }
+  $output .= drupal_render_children($element);
+  $output .= '</div>';
+
+  return $output;
+}
+
+/**
+ * Returns HTML for a group of file upload widgets.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: A render element representing the widgets.
+ *
+ * @ingroup themeable
+ */
+function theme_file_widget_multiple($variables) {
+  $element = $variables['element'];
+
+  // Special ID and classes for draggable tables.
+  $weight_class = $element['#id'] . '-weight';
+  $table_id = $element['#id'] . '-table';
+
+  // Build up a table of applicable fields.
+  $headers = array();
+  $headers[] = t('File information');
+  if ($element['#display_field']) {
+    $headers[] = array(
+      'data' => t('Display'),
+      'class' => array('checkbox'),
+    );
+  }
+  $headers[] = t('Weight');
+  $headers[] = t('Operations');
+
+  // Get our list of widgets in order (needed when the form comes back after
+  // preview or failed validation).
+  $widgets = array();
+  foreach (element_children($element) as $key) {
+    $widgets[] = &$element[$key];
+  }
+  usort($widgets, '_field_sort_items_value_helper');
+
+  $rows = array();
+  foreach ($widgets as $key => &$widget) {
+    // Save the uploading row for last.
+    if ($widget['#file'] == FALSE) {
+      $widget['#title'] = $element['#file_upload_title'];
+      $widget['#description'] = $element['#file_upload_description'];
+      continue;
+    }
+
+    // Delay rendering of the buttons, so that they can be rendered later in the
+    // "operations" column.
+    $operations_elements = array();
+    foreach (element_children($widget) as $sub_key) {
+      if (isset($widget[$sub_key]['#type']) && $widget[$sub_key]['#type'] == 'submit') {
+        hide($widget[$sub_key]);
+        $operations_elements[] = &$widget[$sub_key];
+      }
+    }
+
+    // Delay rendering of the "Display" option and the weight selector, so that
+    // each can be rendered later in its own column.
+    if ($element['#display_field']) {
+      hide($widget['display']);
+    }
+    hide($widget['_weight']);
+
+    // Render everything else together in a column, without the normal wrappers.
+    $widget['#theme_wrappers'] = array();
+    $information = drupal_render($widget);
+
+    // Render the previously hidden elements, using render() instead of
+    // drupal_render(), to undo the earlier hide().
+    $operations = '';
+    foreach ($operations_elements as $operation_element) {
+      $operations .= render($operation_element);
+    }
+    $display = '';
+    if ($element['#display_field']) {
+      unset($widget['display']['#title']);
+      $display = array(
+        'data' => render($widget['display']),
+        'class' => array('checkbox'),
+      );
+    }
+    $widget['_weight']['#attributes']['class'] = array($weight_class);
+    $weight = render($widget['_weight']);
+
+    // Arrange the row with all of the rendered columns.
+    $row = array();
+    $row[] = $information;
+    if ($element['#display_field']) {
+      $row[] = $display;
+    }
+    $row[] = $weight;
+    $row[] = $operations;
+    $rows[] = array(
+      'data' => $row,
+      'class' => isset($widget['#attributes']['class']) ? array_merge($widget['#attributes']['class'], array('draggable')) : array('draggable'),
+    );
+  }
+
+  drupal_add_tabledrag($table_id, 'order', 'sibling', $weight_class);
+
+  $output = '';
+  $output = empty($rows) ? '' : theme('table', array('header' => $headers, 'rows' => $rows, 'attributes' => array('id' => $table_id)));
+  $output .= drupal_render_children($element);
+  return $output;
+}
+
+
+/**
+ * Returns HTML for help text based on file upload validators.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - description: The normal description for this field, specified by the
+ *     user.
+ *   - upload_validators: An array of upload validators as used in
+ *     $element['#upload_validators'].
+ *
+ * @ingroup themeable
+ */
+function theme_file_upload_help($variables) {
+  $description = $variables['description'];
+  $upload_validators = $variables['upload_validators'];
+
+  $descriptions = array();
+
+  if (strlen($description)) {
+    $descriptions[] = $description;
+  }
+  if (isset($upload_validators['file_validate_size'])) {
+    $descriptions[] = t('Files must be less than !size.', array('!size' => '<strong>' . format_size($upload_validators['file_validate_size'][0]) . '</strong>'));
+  }
+  if (isset($upload_validators['file_validate_extensions'])) {
+    $descriptions[] = t('Allowed file types: !extensions.', array('!extensions' => '<strong>' . check_plain($upload_validators['file_validate_extensions'][0]) . '</strong>'));
+  }
+  if (isset($upload_validators['file_validate_image_resolution'])) {
+    $max = $upload_validators['file_validate_image_resolution'][0];
+    $min = $upload_validators['file_validate_image_resolution'][1];
+    if ($min && $max && $min == $max) {
+      $descriptions[] = t('Images must be exactly !size pixels.', array('!size' => '<strong>' . $max . '</strong>'));
+    }
+    elseif ($min && $max) {
+      $descriptions[] = t('Images must be between !min and !max pixels.', array('!min' => '<strong>' . $min . '</strong>', '!max' => '<strong>' . $max . '</strong>'));
+    }
+    elseif ($min) {
+      $descriptions[] = t('Images must be larger than !min pixels.', array('!min' => '<strong>' . $min . '</strong>'));
+    }
+    elseif ($max) {
+      $descriptions[] = t('Images must be smaller than !max pixels.', array('!max' => '<strong>' . $max . '</strong>'));
+    }
+  }
+
+  return implode('<br />', $descriptions);
+}
+
+/**
+ * Implements hook_field_formatter_view().
+ */
+function file_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  $element = array();
+
+  switch ($display['type']) {
+    case 'file_default':
+      foreach ($items as $delta => $item) {
+        $element[$delta] = array(
+          '#theme' => 'file_link',
+          '#file' => (object) $item,
+        );
+      }
+      break;
+
+    case 'file_url_plain':
+      foreach ($items as $delta => $item) {
+        $element[$delta] = array('#markup' => empty($item['uri']) ? '' : file_create_url($item['uri']));
+      }
+      break;
+
+    case 'file_table':
+      if (!empty($items)) {
+        // Display all values in a single element..
+        $element[0] = array(
+          '#theme' => 'file_formatter_table',
+          '#items' => $items,
+        );
+      }
+      break;
+  }
+
+  return $element;
+}
+
+/**
+ * Returns HTML for a file attachments table.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - items: An array of file attachments.
+ *
+ * @ingroup themeable
+ */
+function theme_file_formatter_table($variables) {
+  $header = array(t('Attachment'), t('Size'));
+  $rows = array();
+  foreach ($variables['items'] as $delta => $item) {
+    $rows[] = array(
+      theme('file_link', array('file' => (object) $item)),
+      format_size($item['filesize']),
+    );
+  }
+
+  return empty($rows) ? '' : theme('table', array('header' => $header, 'rows' => $rows));
+}
diff --git a/htmltest/modules/file/file.info b/htmltest/modules/file/file.info
new file mode 100644
index 00000000..4b364a79
--- /dev/null
+++ b/htmltest/modules/file/file.info
@@ -0,0 +1,13 @@
+name = File
+description = Defines a file field type.
+package = Core
+version = VERSION
+core = 7.x
+dependencies[] = field
+files[] = tests/file.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/file/file.install b/htmltest/modules/file/file.install
new file mode 100644
index 00000000..47ee4fd0
--- /dev/null
+++ b/htmltest/modules/file/file.install
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for File module.
+ */
+
+/**
+ * Implements hook_field_schema().
+ */
+function file_field_schema($field) {
+  return array(
+    'columns' => array(
+      'fid' => array(
+        'description' => 'The {file_managed}.fid being referenced in this field.',
+        'type' => 'int',
+        'not null' => FALSE,
+        'unsigned' => TRUE,
+      ),
+      'display' => array(
+        'description' => 'Flag to control whether this file should be displayed when viewing content.',
+        'type' => 'int',
+        'size' => 'tiny',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 1,
+      ),
+      'description' => array(
+        'description' => 'A description of the file.',
+        'type' => 'text',
+        'not null' => FALSE,
+      ),
+    ),
+    'indexes' => array(
+      'fid' => array('fid'),
+    ),
+    'foreign keys' => array(
+      'fid' => array(
+        'table' => 'file_managed',
+        'columns' => array('fid' => 'fid'),
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_requirements().
+ *
+ * Display information about getting upload progress bars working.
+ */
+function file_requirements($phase) {
+  $requirements = array();
+
+  // Check the server's ability to indicate upload progress.
+  if ($phase == 'runtime') {
+    $implementation = file_progress_implementation();
+    $apache = strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== FALSE;
+    $fastcgi = strpos($_SERVER['SERVER_SOFTWARE'], 'mod_fastcgi') !== FALSE || strpos($_SERVER["SERVER_SOFTWARE"], 'mod_fcgi') !== FALSE;
+    $description = NULL;
+    if (!$apache) {
+      $value = t('Not enabled');
+      $description = t('Your server is not capable of displaying file upload progress. File upload progress requires an Apache server running PHP with mod_php.');
+      $severity = REQUIREMENT_INFO;
+    }
+    elseif ($fastcgi) {
+      $value = t('Not enabled');
+      $description = t('Your server is not capable of displaying file upload progress. File upload progress requires PHP be run with mod_php and not as FastCGI.');
+      $severity = REQUIREMENT_INFO;
+    }
+    elseif (!$implementation && extension_loaded('apc')) {
+      $value = t('Not enabled');
+      $description = t('Your server is capable of displaying file upload progress through APC, but it is not enabled. Add <code>apc.rfc1867 = 1</code> to your php.ini configuration. Alternatively, it is recommended to use <a href="http://pecl.php.net/package/uploadprogress">PECL uploadprogress</a>, which supports more than one simultaneous upload.');
+      $severity = REQUIREMENT_INFO;
+    }
+    elseif (!$implementation) {
+      $value = t('Not enabled');
+      $description = t('Your server is capable of displaying file upload progress, but does not have the required libraries. It is recommended to install the <a href="http://pecl.php.net/package/uploadprogress">PECL uploadprogress library</a> (preferred) or to install <a href="http://us2.php.net/apc">APC</a>.');
+      $severity = REQUIREMENT_INFO;
+    }
+    elseif ($implementation == 'apc') {
+      $value = t('Enabled (<a href="http://php.net/manual/en/apc.configuration.php#ini.apc.rfc1867">APC RFC1867</a>)');
+      $description = t('Your server is capable of displaying file upload progress using APC RFC1867. Note that only one upload at a time is supported. It is recommended to use the <a href="http://pecl.php.net/package/uploadprogress">PECL uploadprogress library</a> if possible.');
+      $severity = REQUIREMENT_OK;
+    }
+    elseif ($implementation == 'uploadprogress') {
+      $value = t('Enabled (<a href="http://pecl.php.net/package/uploadprogress">PECL uploadprogress</a>)');
+      $severity = REQUIREMENT_OK;
+    }
+    $requirements['file_progress'] = array(
+      'title' => t('Upload progress'),
+      'value' => $value,
+      'severity' => $severity,
+      'description' => $description,
+    );
+  }
+
+  return $requirements;
+}
diff --git a/htmltest/modules/file/file.js b/htmltest/modules/file/file.js
new file mode 100644
index 00000000..0135a3b2
--- /dev/null
+++ b/htmltest/modules/file/file.js
@@ -0,0 +1,155 @@
+/**
+ * @file
+ * Provides JavaScript additions to the managed file field type.
+ *
+ * This file provides progress bar support (if available), popup windows for
+ * file previews, and disabling of other file fields during Ajax uploads (which
+ * prevents separate file fields from accidentally uploading files).
+ */
+
+(function ($) {
+
+/**
+ * Attach behaviors to managed file element upload fields.
+ */
+Drupal.behaviors.fileValidateAutoAttach = {
+  attach: function (context, settings) {
+    if (settings.file && settings.file.elements) {
+      $.each(settings.file.elements, function(selector) {
+        var extensions = settings.file.elements[selector];
+        $(selector, context).bind('change', {extensions: extensions}, Drupal.file.validateExtension);
+      });
+    }
+  },
+  detach: function (context, settings) {
+    if (settings.file && settings.file.elements) {
+      $.each(settings.file.elements, function(selector) {
+        $(selector, context).unbind('change', Drupal.file.validateExtension);
+      });
+    }
+  }
+};
+
+/**
+ * Attach behaviors to the file upload and remove buttons.
+ */
+Drupal.behaviors.fileButtons = {
+  attach: function (context) {
+    $('input.form-submit', context).bind('mousedown', Drupal.file.disableFields);
+    $('div.form-managed-file input.form-submit', context).bind('mousedown', Drupal.file.progressBar);
+  },
+  detach: function (context) {
+    $('input.form-submit', context).unbind('mousedown', Drupal.file.disableFields);
+    $('div.form-managed-file input.form-submit', context).unbind('mousedown', Drupal.file.progressBar);
+  }
+};
+
+/**
+ * Attach behaviors to links within managed file elements.
+ */
+Drupal.behaviors.filePreviewLinks = {
+  attach: function (context) {
+    $('div.form-managed-file .file a, .file-widget .file a', context).bind('click',Drupal.file.openInNewWindow);
+  },
+  detach: function (context){
+    $('div.form-managed-file .file a, .file-widget .file a', context).unbind('click', Drupal.file.openInNewWindow);
+  }
+};
+
+/**
+ * File upload utility functions.
+ */
+Drupal.file = Drupal.file || {
+  /**
+   * Client-side file input validation of file extensions.
+   */
+  validateExtension: function (event) {
+    // Remove any previous errors.
+    $('.file-upload-js-error').remove();
+
+    // Add client side validation for the input[type=file].
+    var extensionPattern = event.data.extensions.replace(/,\s*/g, '|');
+    if (extensionPattern.length > 1 && this.value.length > 0) {
+      var acceptableMatch = new RegExp('\\.(' + extensionPattern + ')$', 'gi');
+      if (!acceptableMatch.test(this.value)) {
+        var error = Drupal.t("The selected file %filename cannot be uploaded. Only files with the following extensions are allowed: %extensions.", {
+          // According to the specifications of HTML5, a file upload control
+          // should not reveal the real local path to the file that a user
+          // has selected. Some web browsers implement this restriction by
+          // replacing the local path with "C:\fakepath\", which can cause
+          // confusion by leaving the user thinking perhaps Drupal could not
+          // find the file because it messed up the file path. To avoid this
+          // confusion, therefore, we strip out the bogus fakepath string.
+          '%filename': this.value.replace('C:\\fakepath\\', ''),
+          '%extensions': extensionPattern.replace(/\|/g, ', ')
+        });
+        $(this).closest('div.form-managed-file').prepend('<div class="messages error file-upload-js-error">' + error + '</div>');
+        this.value = '';
+        return false;
+      }
+    }
+  },
+  /**
+   * Prevent file uploads when using buttons not intended to upload.
+   */
+  disableFields: function (event){
+    var clickedButton = this;
+
+    // Only disable upload fields for Ajax buttons.
+    if (!$(clickedButton).hasClass('ajax-processed')) {
+      return;
+    }
+
+    // Check if we're working with an "Upload" button.
+    var $enabledFields = [];
+    if ($(this).closest('div.form-managed-file').length > 0) {
+      $enabledFields = $(this).closest('div.form-managed-file').find('input.form-file');
+    }
+
+    // Temporarily disable upload fields other than the one we're currently
+    // working with. Filter out fields that are already disabled so that they
+    // do not get enabled when we re-enable these fields at the end of behavior
+    // processing. Re-enable in a setTimeout set to a relatively short amount
+    // of time (1 second). All the other mousedown handlers (like Drupal's Ajax
+    // behaviors) are excuted before any timeout functions are called, so we
+    // don't have to worry about the fields being re-enabled too soon.
+    // @todo If the previous sentence is true, why not set the timeout to 0?
+    var $fieldsToTemporarilyDisable = $('div.form-managed-file input.form-file').not($enabledFields).not(':disabled');
+    $fieldsToTemporarilyDisable.attr('disabled', 'disabled');
+    setTimeout(function (){
+      $fieldsToTemporarilyDisable.attr('disabled', false);
+    }, 1000);
+  },
+  /**
+   * Add progress bar support if possible.
+   */
+  progressBar: function (event) {
+    var clickedButton = this;
+    var $progressId = $(clickedButton).closest('div.form-managed-file').find('input.file-progress');
+    if ($progressId.length) {
+      var originalName = $progressId.attr('name');
+
+      // Replace the name with the required identifier.
+      $progressId.attr('name', originalName.match(/APC_UPLOAD_PROGRESS|UPLOAD_IDENTIFIER/)[0]);
+
+      // Restore the original name after the upload begins.
+      setTimeout(function () {
+        $progressId.attr('name', originalName);
+      }, 1000);
+    }
+    // Show the progress bar if the upload takes longer than half a second.
+    setTimeout(function () {
+      $(clickedButton).closest('div.form-managed-file').find('div.ajax-progress-bar').slideDown();
+    }, 500);
+  },
+  /**
+   * Open links to files within forms in a new window.
+   */
+  openInNewWindow: function (event) {
+    $(this).attr('target', '_blank');
+    window.open(this.href, 'filePreview', 'toolbar=0,scrollbars=1,location=1,statusbar=1,menubar=0,resizable=1,width=500,height=550');
+    return false;
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/file/file.module b/htmltest/modules/file/file.module
new file mode 100644
index 00000000..3d351fa2
--- /dev/null
+++ b/htmltest/modules/file/file.module
@@ -0,0 +1,1013 @@
+<?php
+
+/**
+ * @file
+ * Defines a "managed_file" Form API field and a "file" field for Field module.
+ */
+
+// Load all Field module hooks for File.
+require_once DRUPAL_ROOT . '/modules/file/file.field.inc';
+
+/**
+ * Implements hook_help().
+ */
+function file_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#file':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The File module defines a <em>File</em> field type for the Field module, which lets you manage and validate uploaded files attached to content on your site (see the <a href="@field-help">Field module help page</a> for more information about fields). For more information, see the online handbook entry for <a href="@file">File module</a>.', array('@field-help' => url('admin/help/field'), '@file' => 'http://drupal.org/documentation/modules/file')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Attaching files to content') . '</dt>';
+      $output .= '<dd>' . t('The File module allows users to attach files to content (e.g., PDF files, spreadsheets, etc.), when a <em>File</em> field is added to a given content type using the <a href="@fieldui-help">Field UI module</a>. You can add validation options to your File field, such as specifying a maximum file size and allowed file extensions.', array('@fieldui-help' => url('admin/help/field_ui'))) . '</dd>';
+      $output .= '<dt>' . t('Managing attachment display') . '</dt>';
+      $output .= '<dd>' . t('When you attach a file to content, you can specify whether it is <em>listed</em> or not. Listed files are displayed automatically in a section at the bottom of your content; non-listed files are available for embedding in your content, but are not included in the list at the bottom.') . '</dd>';
+      $output .= '<dt>' . t('Managing file locations') . '</dt>';
+      $output .= '<dd>' . t("When you create a File field, you can specify a directory where the files will be stored, which can be within either the <em>public</em> or <em>private</em> files directory. Files in the public directory can be accessed directly through the web server; when public files are listed, direct links to the files are used, and anyone who knows a file's URL can download the file. Files in the private directory are not accessible directly through the web server; when private files are listed, the links are Drupal path requests. This adds to server load and download time, since Drupal must start up and resolve the path for each file download request, but allows for access restrictions.") . '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function file_menu() {
+  $items = array();
+
+  $items['file/ajax'] = array(
+    'page callback' => 'file_ajax_upload',
+    'delivery callback' => 'ajax_deliver',
+    'access arguments' => array('access content'),
+    'theme callback' => 'ajax_base_page_theme',
+    'type' => MENU_CALLBACK,
+  );
+  $items['file/progress'] = array(
+    'page callback' => 'file_ajax_progress',
+    'access arguments' => array('access content'),
+    'theme callback' => 'ajax_base_page_theme',
+    'type' => MENU_CALLBACK,
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_element_info().
+ *
+ * The managed file element may be used anywhere in Drupal.
+ */
+function file_element_info() {
+  $file_path = drupal_get_path('module', 'file');
+  $types['managed_file'] = array(
+    '#input' => TRUE,
+    '#process' => array('file_managed_file_process'),
+    '#value_callback' => 'file_managed_file_value',
+    '#element_validate' => array('file_managed_file_validate'),
+    '#pre_render' => array('file_managed_file_pre_render'),
+    '#theme' => 'file_managed_file',
+    '#theme_wrappers' => array('form_element'),
+    '#progress_indicator' => 'throbber',
+    '#progress_message' => NULL,
+    '#upload_validators' => array(),
+    '#upload_location' => NULL,
+    '#size' => 22,
+    '#extended' => FALSE,
+    '#attached' => array(
+      'css' => array($file_path . '/file.css'),
+      'js' => array($file_path . '/file.js'),
+    ),
+  );
+  return $types;
+}
+
+/**
+ * Implements hook_theme().
+ */
+function file_theme() {
+  return array(
+    // file.module.
+    'file_link' => array(
+      'variables' => array('file' => NULL, 'icon_directory' => NULL),
+    ),
+    'file_icon' => array(
+      'variables' => array('file' => NULL, 'icon_directory' => NULL),
+    ),
+    'file_managed_file' => array(
+      'render element' => 'element',
+    ),
+
+    // file.field.inc.
+    'file_widget' => array(
+      'render element' => 'element',
+    ),
+    'file_widget_multiple' => array(
+      'render element' => 'element',
+    ),
+    'file_formatter_table' => array(
+      'variables' => array('items' => NULL),
+    ),
+    'file_upload_help' => array(
+      'variables' => array('description' => NULL, 'upload_validators' => NULL),
+    ),
+  );
+}
+
+/**
+ * Implements hook_file_download().
+ *
+ * This function takes an extra parameter $field_type so that it may
+ * be re-used by other File-like modules, such as Image.
+ */
+function file_file_download($uri, $field_type = 'file') {
+  global $user;
+
+  // Get the file record based on the URI. If not in the database just return.
+  $files = file_load_multiple(array(), array('uri' => $uri));
+  if (count($files)) {
+    foreach ($files as $item) {
+      // Since some database servers sometimes use a case-insensitive comparison
+      // by default, double check that the filename is an exact match.
+      if ($item->uri === $uri) {
+        $file = $item;
+        break;
+      }
+    }
+  }
+  if (!isset($file)) {
+    return;
+  }
+
+  // Find out which (if any) fields of this type contain the file.
+  $references = file_get_file_references($file, NULL, FIELD_LOAD_CURRENT, $field_type);
+
+  // Stop processing if there are no references in order to avoid returning
+  // headers for files controlled by other modules. Make an exception for
+  // temporary files where the host entity has not yet been saved (for example,
+  // an image preview on a node/add form) in which case, allow download by the
+  // file's owner.
+  if (empty($references) && ($file->status == FILE_STATUS_PERMANENT || $file->uid != $user->uid)) {
+      return;
+  }
+
+  // Default to allow access.
+  $denied = FALSE;
+  // Loop through all references of this file. If a reference explicitly allows
+  // access to the field to which this file belongs, no further checks are done
+  // and download access is granted. If a reference denies access, eventually
+  // existing additional references are checked. If all references were checked
+  // and no reference denied access, access is granted as well. If at least one
+  // reference denied access, access is denied.
+  foreach ($references as $field_name => $field_references) {
+    foreach ($field_references as $entity_type => $type_references) {
+      foreach ($type_references as $id => $reference) {
+        // Try to load $entity and $field.
+        $entity = entity_load($entity_type, array($id));
+        $entity = reset($entity);
+        $field = field_info_field($field_name);
+
+        // Load the field item that references the file.
+        $field_item = NULL;
+        if ($entity) {
+          // Load all field items for that entity.
+          $field_items = field_get_items($entity_type, $entity, $field_name);
+
+          // Find the field item with the matching URI.
+          foreach ($field_items as $item) {
+            if ($item['uri'] == $uri) {
+              $field_item = $item;
+              break;
+            }
+          }
+        }
+
+        // Check that $entity, $field and $field_item were loaded successfully
+        // and check if access to that field is not disallowed. If any of these
+        // checks fail, stop checking access for this reference.
+        if (empty($entity) || empty($field) || empty($field_item) || !field_access('view', $field, $entity_type, $entity)) {
+          $denied = TRUE;
+          break;
+        }
+
+        // Invoke hook and collect grants/denies for download access.
+        // Default to FALSE and let entities overrule this ruling.
+        $grants = array('system' => FALSE);
+        foreach (module_implements('file_download_access') as $module) {
+          $grants = array_merge($grants, array($module => module_invoke($module, 'file_download_access', $field_item, $entity_type, $entity)));
+        }
+        // Allow other modules to alter the returned grants/denies.
+        drupal_alter('file_download_access', $grants, $field_item, $entity_type, $entity);
+
+        if (in_array(TRUE, $grants)) {
+          // If TRUE is returned, access is granted and no further checks are
+          // necessary.
+          $denied = FALSE;
+          break 3;
+        }
+
+        if (in_array(FALSE, $grants)) {
+          // If an implementation returns FALSE, access to this entity is denied
+          // but the file could belong to another entity to which the user might
+          // have access. Continue with these.
+          $denied = TRUE;
+        }
+      }
+    }
+  }
+
+  // Access specifically denied.
+  if ($denied) {
+    return -1;
+  }
+
+  // Access is granted.
+  $headers = file_get_content_headers($file);
+  return $headers;
+}
+
+/**
+ * Menu callback; Shared Ajax callback for file uploads and deletions.
+ *
+ * This rebuilds the form element for a particular field item. As long as the
+ * form processing is properly encapsulated in the widget element the form
+ * should rebuild correctly using FAPI without the need for additional callbacks
+ * or processing.
+ */
+function file_ajax_upload() {
+  $form_parents = func_get_args();
+  $form_build_id = (string) array_pop($form_parents);
+
+  if (empty($_POST['form_build_id']) || $form_build_id != $_POST['form_build_id']) {
+    // Invalid request.
+    drupal_set_message(t('An unrecoverable error occurred. The uploaded file likely exceeded the maximum file size (@size) that this server supports.', array('@size' => format_size(file_upload_max_size()))), 'error');
+    $commands = array();
+    $commands[] = ajax_command_replace(NULL, theme('status_messages'));
+    return array('#type' => 'ajax', '#commands' => $commands);
+  }
+
+  list($form, $form_state) = ajax_get_form();
+
+  if (!$form) {
+    // Invalid form_build_id.
+    drupal_set_message(t('An unrecoverable error occurred. Use of this form has expired. Try reloading the page and submitting again.'), 'error');
+    $commands = array();
+    $commands[] = ajax_command_replace(NULL, theme('status_messages'));
+    return array('#type' => 'ajax', '#commands' => $commands);
+  }
+
+  // Get the current element and count the number of files.
+  $current_element = $form;
+  foreach ($form_parents as $parent) {
+    $current_element = $current_element[$parent];
+  }
+  $current_file_count = isset($current_element['#file_upload_delta']) ? $current_element['#file_upload_delta'] : 0;
+
+  // Process user input. $form and $form_state are modified in the process.
+  drupal_process_form($form['#form_id'], $form, $form_state);
+
+  // Retrieve the element to be rendered.
+  foreach ($form_parents as $parent) {
+    $form = $form[$parent];
+  }
+
+  // Add the special Ajax class if a new file was added.
+  if (isset($form['#file_upload_delta']) && $current_file_count < $form['#file_upload_delta']) {
+    $form[$current_file_count]['#attributes']['class'][] = 'ajax-new-content';
+  }
+  // Otherwise just add the new content class on a placeholder.
+  else {
+    $form['#suffix'] .= '<span class="ajax-new-content"></span>';
+  }
+
+  $output = theme('status_messages') . drupal_render($form);
+  $js = drupal_add_js();
+  $settings = call_user_func_array('array_merge_recursive', $js['settings']['data']);
+
+  $commands = array();
+  $commands[] = ajax_command_replace(NULL, $output, $settings);
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Menu callback for upload progress.
+ *
+ * @param $key
+ *   The unique key for this upload process.
+ */
+function file_ajax_progress($key) {
+  $progress = array(
+    'message' => t('Starting upload...'),
+    'percentage' => -1,
+  );
+
+  $implementation = file_progress_implementation();
+  if ($implementation == 'uploadprogress') {
+    $status = uploadprogress_get_info($key);
+    if (isset($status['bytes_uploaded']) && !empty($status['bytes_total'])) {
+      $progress['message'] = t('Uploading... (@current of @total)', array('@current' => format_size($status['bytes_uploaded']), '@total' => format_size($status['bytes_total'])));
+      $progress['percentage'] = round(100 * $status['bytes_uploaded'] / $status['bytes_total']);
+    }
+  }
+  elseif ($implementation == 'apc') {
+    $status = apc_fetch('upload_' . $key);
+    if (isset($status['current']) && !empty($status['total'])) {
+      $progress['message'] = t('Uploading... (@current of @total)', array('@current' => format_size($status['current']), '@total' => format_size($status['total'])));
+      $progress['percentage'] = round(100 * $status['current'] / $status['total']);
+    }
+  }
+
+  drupal_json_output($progress);
+}
+
+/**
+ * Determines the preferred upload progress implementation.
+ *
+ * @return
+ *   A string indicating which upload progress system is available. Either "apc"
+ *   or "uploadprogress". If neither are available, returns FALSE.
+ */
+function file_progress_implementation() {
+  static $implementation;
+  if (!isset($implementation)) {
+    $implementation = FALSE;
+
+    // We prefer the PECL extension uploadprogress because it supports multiple
+    // simultaneous uploads. APC only supports one at a time.
+    if (extension_loaded('uploadprogress')) {
+      $implementation = 'uploadprogress';
+    }
+    elseif (extension_loaded('apc') && ini_get('apc.rfc1867')) {
+      $implementation = 'apc';
+    }
+  }
+  return $implementation;
+}
+
+/**
+ * Implements hook_file_delete().
+ */
+function file_file_delete($file) {
+  // TODO: Remove references to a file that is in-use.
+}
+
+/**
+ * Process function to expand the managed_file element type.
+ *
+ * Expands the file type to include Upload and Remove buttons, as well as
+ * support for a default value.
+ */
+function file_managed_file_process($element, &$form_state, $form) {
+  $fid = isset($element['#value']['fid']) ? $element['#value']['fid'] : 0;
+
+  // Set some default element properties.
+  $element['#progress_indicator'] = empty($element['#progress_indicator']) ? 'none' : $element['#progress_indicator'];
+  $element['#file'] = $fid ? file_load($fid) : FALSE;
+  $element['#tree'] = TRUE;
+
+  $ajax_settings = array(
+    'path' => 'file/ajax/' . implode('/', $element['#array_parents']) . '/' . $form['form_build_id']['#value'],
+    'wrapper' => $element['#id'] . '-ajax-wrapper',
+    'effect' => 'fade',
+    'progress' => array(
+      'type' => $element['#progress_indicator'],
+      'message' => $element['#progress_message'],
+    ),
+  );
+
+  // Set up the buttons first since we need to check if they were clicked.
+  $element['upload_button'] = array(
+    '#name' => implode('_', $element['#parents']) . '_upload_button',
+    '#type' => 'submit',
+    '#value' => t('Upload'),
+    '#validate' => array(),
+    '#submit' => array('file_managed_file_submit'),
+    '#limit_validation_errors' => array($element['#parents']),
+    '#ajax' => $ajax_settings,
+    '#weight' => -5,
+  );
+
+  // Force the progress indicator for the remove button to be either 'none' or
+  // 'throbber', even if the upload button is using something else.
+  $ajax_settings['progress']['type'] = ($element['#progress_indicator'] == 'none') ? 'none' : 'throbber';
+  $ajax_settings['progress']['message'] = NULL;
+  $ajax_settings['effect'] = 'none';
+  $element['remove_button'] = array(
+    '#name' => implode('_', $element['#parents']) . '_remove_button',
+    '#type' => 'submit',
+    '#value' => t('Remove'),
+    '#validate' => array(),
+    '#submit' => array('file_managed_file_submit'),
+    '#limit_validation_errors' => array($element['#parents']),
+    '#ajax' => $ajax_settings,
+    '#weight' => -5,
+  );
+
+  $element['fid'] = array(
+    '#type' => 'hidden',
+    '#value' => $fid,
+  );
+
+  // Add progress bar support to the upload if possible.
+  if ($element['#progress_indicator'] == 'bar' && $implementation = file_progress_implementation()) {
+    $upload_progress_key = mt_rand();
+
+    if ($implementation == 'uploadprogress') {
+      $element['UPLOAD_IDENTIFIER'] = array(
+        '#type' => 'hidden',
+        '#value' => $upload_progress_key,
+        '#attributes' => array('class' => array('file-progress')),
+        // Uploadprogress extension requires this field to be at the top of the
+        // form.
+        '#weight' => -20,
+      );
+    }
+    elseif ($implementation == 'apc') {
+      $element['APC_UPLOAD_PROGRESS'] = array(
+        '#type' => 'hidden',
+        '#value' => $upload_progress_key,
+        '#attributes' => array('class' => array('file-progress')),
+        // Uploadprogress extension requires this field to be at the top of the
+        // form.
+        '#weight' => -20,
+      );
+    }
+
+    // Add the upload progress callback.
+    $element['upload_button']['#ajax']['progress']['path'] = 'file/progress/' . $upload_progress_key;
+  }
+
+  // The file upload field itself.
+  $element['upload'] = array(
+    '#name' => 'files[' . implode('_', $element['#parents']) . ']',
+    '#type' => 'file',
+    '#title' => t('Choose a file'),
+    '#title_display' => 'invisible',
+    '#size' => $element['#size'],
+    '#theme_wrappers' => array(),
+    '#weight' => -10,
+  );
+
+  if ($fid && $element['#file']) {
+    $element['filename'] = array(
+      '#type' => 'markup',
+      '#markup' => theme('file_link', array('file' => $element['#file'])) . ' ',
+      '#weight' => -10,
+    );
+  }
+
+  // Add the extension list to the page as JavaScript settings.
+  if (isset($element['#upload_validators']['file_validate_extensions'][0])) {
+    $extension_list = implode(',', array_filter(explode(' ', $element['#upload_validators']['file_validate_extensions'][0])));
+    $element['upload']['#attached']['js'] = array(
+      array(
+        'type' => 'setting',
+        'data' => array('file' => array('elements' => array('#' . $element['#id'] . '-upload' => $extension_list)))
+      )
+    );
+  }
+
+  // Prefix and suffix used for Ajax replacement.
+  $element['#prefix'] = '<div id="' . $element['#id'] . '-ajax-wrapper">';
+  $element['#suffix'] = '</div>';
+
+  return $element;
+}
+
+/**
+ * The #value_callback for a managed_file type element.
+ */
+function file_managed_file_value(&$element, $input = FALSE, $form_state = NULL) {
+  $fid = 0;
+
+  // Find the current value of this field from the form state.
+  $form_state_fid = $form_state['values'];
+  foreach ($element['#parents'] as $parent) {
+    $form_state_fid = isset($form_state_fid[$parent]) ? $form_state_fid[$parent] : 0;
+  }
+
+  if ($element['#extended'] && isset($form_state_fid['fid'])) {
+    $fid = $form_state_fid['fid'];
+  }
+  elseif (is_numeric($form_state_fid)) {
+    $fid = $form_state_fid;
+  }
+
+  // Process any input and save new uploads.
+  if ($input !== FALSE) {
+    $return = $input;
+
+    // Uploads take priority over all other values.
+    if ($file = file_managed_file_save_upload($element)) {
+      $fid = $file->fid;
+    }
+    else {
+      // Check for #filefield_value_callback values.
+      // Because FAPI does not allow multiple #value_callback values like it
+      // does for #element_validate and #process, this fills the missing
+      // functionality to allow File fields to be extended through FAPI.
+      if (isset($element['#file_value_callbacks'])) {
+        foreach ($element['#file_value_callbacks'] as $callback) {
+          $callback($element, $input, $form_state);
+        }
+      }
+      // Load file if the FID has changed to confirm it exists.
+      if (isset($input['fid']) && $file = file_load($input['fid'])) {
+        $fid = $file->fid;
+      }
+    }
+  }
+
+  // If there is no input, set the default value.
+  else {
+    if ($element['#extended']) {
+      $default_fid = isset($element['#default_value']['fid']) ? $element['#default_value']['fid'] : 0;
+      $return = isset($element['#default_value']) ? $element['#default_value'] : array('fid' => 0);
+    }
+    else {
+      $default_fid = isset($element['#default_value']) ? $element['#default_value'] : 0;
+      $return = array('fid' => 0);
+    }
+
+    // Confirm that the file exists when used as a default value.
+    if ($default_fid && $file = file_load($default_fid)) {
+      $fid = $file->fid;
+    }
+  }
+
+  $return['fid'] = $fid;
+
+  return $return;
+}
+
+/**
+ * An #element_validate callback for the managed_file element.
+ */
+function file_managed_file_validate(&$element, &$form_state) {
+  // If referencing an existing file, only allow if there are existing
+  // references. This prevents unmanaged files from being deleted if this
+  // item were to be deleted.
+  $clicked_button = end($form_state['triggering_element']['#parents']);
+  if ($clicked_button != 'remove_button' && !empty($element['fid']['#value'])) {
+    if ($file = file_load($element['fid']['#value'])) {
+      if ($file->status == FILE_STATUS_PERMANENT) {
+        $references = file_usage_list($file);
+        if (empty($references)) {
+          form_error($element, t('The file used in the !name field may not be referenced.', array('!name' => $element['#title'])));
+        }
+      }
+    }
+    else {
+      form_error($element, t('The file referenced by the !name field does not exist.', array('!name' => $element['#title'])));
+    }
+  }
+
+  // Check required property based on the FID.
+  if ($element['#required'] && empty($element['fid']['#value']) && !in_array($clicked_button, array('upload_button', 'remove_button'))) {
+    form_error($element['upload'], t('!name field is required.', array('!name' => $element['#title'])));
+  }
+
+  // Consolidate the array value of this field to a single FID.
+  if (!$element['#extended']) {
+    form_set_value($element, $element['fid']['#value'], $form_state);
+  }
+}
+
+/**
+ * Form submission handler for upload / remove buttons of managed_file elements.
+ *
+ * @see file_managed_file_process()
+ */
+function file_managed_file_submit($form, &$form_state) {
+  // Determine whether it was the upload or the remove button that was clicked,
+  // and set $element to the managed_file element that contains that button.
+  $parents = $form_state['triggering_element']['#array_parents'];
+  $button_key = array_pop($parents);
+  $element = drupal_array_get_nested_value($form, $parents);
+
+  // No action is needed here for the upload button, because all file uploads on
+  // the form are processed by file_managed_file_value() regardless of which
+  // button was clicked. Action is needed here for the remove button, because we
+  // only remove a file in response to its remove button being clicked.
+  if ($button_key == 'remove_button') {
+    // If it's a temporary file we can safely remove it immediately, otherwise
+    // it's up to the implementing module to clean up files that are in use.
+    if ($element['#file'] && $element['#file']->status == 0) {
+      file_delete($element['#file']);
+    }
+    // Update both $form_state['values'] and $form_state['input'] to reflect
+    // that the file has been removed, so that the form is rebuilt correctly.
+    // $form_state['values'] must be updated in case additional submit handlers
+    // run, and for form building functions that run during the rebuild, such as
+    // when the managed_file element is part of a field widget.
+    // $form_state['input'] must be updated so that file_managed_file_value()
+    // has correct information during the rebuild.
+    $values_element = $element['#extended'] ? $element['fid'] : $element;
+    form_set_value($values_element, NULL, $form_state);
+    drupal_array_set_nested_value($form_state['input'], $values_element['#parents'], NULL);
+  }
+
+  // Set the form to rebuild so that $form is correctly updated in response to
+  // processing the file removal. Since this function did not change $form_state
+  // if the upload button was clicked, a rebuild isn't necessary in that
+  // situation and setting $form_state['redirect'] to FALSE would suffice.
+  // However, we choose to always rebuild, to keep the form processing workflow
+  // consistent between the two buttons.
+  $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * Saves any files that have been uploaded into a managed_file element.
+ *
+ * @param $element
+ *   The FAPI element whose values are being saved.
+ *
+ * @return
+ *   The file object representing the file that was saved, or FALSE if no file
+ *   was saved.
+ */
+function file_managed_file_save_upload($element) {
+  $upload_name = implode('_', $element['#parents']);
+  if (empty($_FILES['files']['name'][$upload_name])) {
+    return FALSE;
+  }
+
+  $destination = isset($element['#upload_location']) ? $element['#upload_location'] : NULL;
+  if (isset($destination) && !file_prepare_directory($destination, FILE_CREATE_DIRECTORY)) {
+    watchdog('file', 'The upload directory %directory for the file field !name could not be created or is not accessible. A newly uploaded file could not be saved in this directory as a consequence, and the upload was canceled.', array('%directory' => $destination, '!name' => $element['#field_name']));
+    form_set_error($upload_name, t('The file could not be uploaded.'));
+    return FALSE;
+  }
+
+  if (!$file = file_save_upload($upload_name, $element['#upload_validators'], $destination)) {
+    watchdog('file', 'The file upload failed. %upload', array('%upload' => $upload_name));
+    form_set_error($upload_name, t('The file in the !name field was unable to be uploaded.', array('!name' => $element['#title'])));
+    return FALSE;
+  }
+
+  return $file;
+}
+
+/**
+ * Returns HTML for a managed file element.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: A render element representing the file.
+ *
+ * @ingroup themeable
+ */
+function theme_file_managed_file($variables) {
+  $element = $variables['element'];
+
+  $attributes = array();
+  if (isset($element['#id'])) {
+    $attributes['id'] = $element['#id'];
+  }
+  if (!empty($element['#attributes']['class'])) {
+    $attributes['class'] = (array) $element['#attributes']['class'];
+  }
+  $attributes['class'][] = 'form-managed-file';
+
+  // This wrapper is required to apply JS behaviors and CSS styling.
+  $output = '';
+  $output .= '<div' . drupal_attributes($attributes) . '>';
+  $output .= drupal_render_children($element);
+  $output .= '</div>';
+  return $output;
+}
+
+/**
+ * #pre_render callback to hide display of the upload or remove controls.
+ *
+ * Upload controls are hidden when a file is already uploaded. Remove controls
+ * are hidden when there is no file attached. Controls are hidden here instead
+ * of in file_managed_file_process(), because #access for these buttons depends
+ * on the managed_file element's #value. See the documentation of form_builder()
+ * for more detailed information about the relationship between #process,
+ * #value, and #access.
+ *
+ * Because #access is set here, it affects display only and does not prevent
+ * JavaScript or other untrusted code from submitting the form as though access
+ * were enabled. The form processing functions for these elements should not
+ * assume that the buttons can't be "clicked" just because they are not
+ * displayed.
+ *
+ * @see file_managed_file_process()
+ * @see form_builder()
+ */
+function file_managed_file_pre_render($element) {
+  // If we already have a file, we don't want to show the upload controls.
+  if (!empty($element['#value']['fid'])) {
+    $element['upload']['#access'] = FALSE;
+    $element['upload_button']['#access'] = FALSE;
+  }
+  // If we don't already have a file, there is nothing to remove.
+  else {
+    $element['remove_button']['#access'] = FALSE;
+  }
+  return $element;
+}
+
+/**
+ * Returns HTML for a link to a file.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - file: A file object to which the link will be created.
+ *   - icon_directory: (optional) A path to a directory of icons to be used for
+ *     files. Defaults to the value of the "file_icon_directory" variable.
+ *
+ * @ingroup themeable
+ */
+function theme_file_link($variables) {
+  $file = $variables['file'];
+  $icon_directory = $variables['icon_directory'];
+
+  $url = file_create_url($file->uri);
+  $icon = theme('file_icon', array('file' => $file, 'icon_directory' => $icon_directory));
+
+  // Set options as per anchor format described at
+  // http://microformats.org/wiki/file-format-examples
+  $options = array(
+    'attributes' => array(
+      'type' => $file->filemime . '; length=' . $file->filesize,
+    ),
+  );
+
+  // Use the description as the link text if available.
+  if (empty($file->description)) {
+    $link_text = $file->filename;
+  }
+  else {
+    $link_text = $file->description;
+    $options['attributes']['title'] = check_plain($file->filename);
+  }
+
+  return '<span class="file">' . $icon . ' ' . l($link_text, $url, $options) . '</span>';
+}
+
+/**
+ * Returns HTML for an image with an appropriate icon for the given file.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - file: A file object for which to make an icon.
+ *   - icon_directory: (optional) A path to a directory of icons to be used for
+ *     files. Defaults to the value of the "file_icon_directory" variable.
+ *
+ * @ingroup themeable
+ */
+function theme_file_icon($variables) {
+  $file = $variables['file'];
+  $icon_directory = $variables['icon_directory'];
+
+  $mime = check_plain($file->filemime);
+  $icon_url = file_icon_url($file, $icon_directory);
+  return '<img class="file-icon" alt="" title="' . $mime . '" src="' . $icon_url . '" />';
+}
+
+/**
+ * Creates a URL to the icon for a file object.
+ *
+ * @param $file
+ *   A file object.
+ * @param $icon_directory
+ *   (optional) A path to a directory of icons to be used for files. Defaults to
+ *   the value of the "file_icon_directory" variable.
+ *
+ * @return
+ *   A URL string to the icon, or FALSE if an appropriate icon cannot be found.
+ */
+function file_icon_url($file, $icon_directory = NULL) {
+  if ($icon_path = file_icon_path($file, $icon_directory)) {
+    return base_path() . $icon_path;
+  }
+  return FALSE;
+}
+
+/**
+ * Creates a path to the icon for a file object.
+ *
+ * @param $file
+ *   A file object.
+ * @param $icon_directory
+ *   (optional) A path to a directory of icons to be used for files. Defaults to
+ *   the value of the "file_icon_directory" variable.
+ *
+ * @return
+ *   A string to the icon as a local path, or FALSE if an appropriate icon could
+ *   not be found.
+ */
+function file_icon_path($file, $icon_directory = NULL) {
+  // Use the default set of icons if none specified.
+  if (!isset($icon_directory)) {
+    $icon_directory = variable_get('file_icon_directory', drupal_get_path('module', 'file') . '/icons');
+  }
+
+  // If there's an icon matching the exact mimetype, go for it.
+  $dashed_mime = strtr($file->filemime, array('/' => '-'));
+  $icon_path = $icon_directory . '/' . $dashed_mime . '.png';
+  if (file_exists($icon_path)) {
+    return $icon_path;
+  }
+
+  // For a few mimetypes, we can "manually" map to a generic icon.
+  $generic_mime = (string) file_icon_map($file);
+  $icon_path = $icon_directory . '/' . $generic_mime . '.png';
+  if ($generic_mime && file_exists($icon_path)) {
+    return $icon_path;
+  }
+
+  // Use generic icons for each category that provides such icons.
+  foreach (array('audio', 'image', 'text', 'video') as $category) {
+    if (strpos($file->filemime, $category . '/') === 0) {
+      $icon_path = $icon_directory . '/' . $category . '-x-generic.png';
+      if (file_exists($icon_path)) {
+        return $icon_path;
+      }
+    }
+  }
+
+  // Try application-octet-stream as last fallback.
+  $icon_path = $icon_directory . '/application-octet-stream.png';
+  if (file_exists($icon_path)) {
+    return $icon_path;
+  }
+
+  // No icon can be found.
+  return FALSE;
+}
+
+/**
+ * Determines the generic icon MIME package based on a file's MIME type.
+ *
+ * @param $file
+ *   A file object.
+ *
+ * @return
+ *   The generic icon MIME package expected for this file.
+ */
+function file_icon_map($file) {
+  switch ($file->filemime) {
+    // Word document types.
+    case 'application/msword':
+    case 'application/vnd.ms-word.document.macroEnabled.12':
+    case 'application/vnd.oasis.opendocument.text':
+    case 'application/vnd.oasis.opendocument.text-template':
+    case 'application/vnd.oasis.opendocument.text-master':
+    case 'application/vnd.oasis.opendocument.text-web':
+    case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':
+    case 'application/vnd.stardivision.writer':
+    case 'application/vnd.sun.xml.writer':
+    case 'application/vnd.sun.xml.writer.template':
+    case 'application/vnd.sun.xml.writer.global':
+    case 'application/vnd.wordperfect':
+    case 'application/x-abiword':
+    case 'application/x-applix-word':
+    case 'application/x-kword':
+    case 'application/x-kword-crypt':
+      return 'x-office-document';
+
+    // Spreadsheet document types.
+    case 'application/vnd.ms-excel':
+    case 'application/vnd.ms-excel.sheet.macroEnabled.12':
+    case 'application/vnd.oasis.opendocument.spreadsheet':
+    case 'application/vnd.oasis.opendocument.spreadsheet-template':
+    case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
+    case 'application/vnd.stardivision.calc':
+    case 'application/vnd.sun.xml.calc':
+    case 'application/vnd.sun.xml.calc.template':
+    case 'application/vnd.lotus-1-2-3':
+    case 'application/x-applix-spreadsheet':
+    case 'application/x-gnumeric':
+    case 'application/x-kspread':
+    case 'application/x-kspread-crypt':
+      return 'x-office-spreadsheet';
+
+    // Presentation document types.
+    case 'application/vnd.ms-powerpoint':
+    case 'application/vnd.ms-powerpoint.presentation.macroEnabled.12':
+    case 'application/vnd.oasis.opendocument.presentation':
+    case 'application/vnd.oasis.opendocument.presentation-template':
+    case 'application/vnd.openxmlformats-officedocument.presentationml.presentation':
+    case 'application/vnd.stardivision.impress':
+    case 'application/vnd.sun.xml.impress':
+    case 'application/vnd.sun.xml.impress.template':
+    case 'application/x-kpresenter':
+      return 'x-office-presentation';
+
+    // Compressed archive types.
+    case 'application/zip':
+    case 'application/x-zip':
+    case 'application/stuffit':
+    case 'application/x-stuffit':
+    case 'application/x-7z-compressed':
+    case 'application/x-ace':
+    case 'application/x-arj':
+    case 'application/x-bzip':
+    case 'application/x-bzip-compressed-tar':
+    case 'application/x-compress':
+    case 'application/x-compressed-tar':
+    case 'application/x-cpio-compressed':
+    case 'application/x-deb':
+    case 'application/x-gzip':
+    case 'application/x-java-archive':
+    case 'application/x-lha':
+    case 'application/x-lhz':
+    case 'application/x-lzop':
+    case 'application/x-rar':
+    case 'application/x-rpm':
+    case 'application/x-tzo':
+    case 'application/x-tar':
+    case 'application/x-tarz':
+    case 'application/x-tgz':
+      return 'package-x-generic';
+
+    // Script file types.
+    case 'application/ecmascript':
+    case 'application/javascript':
+    case 'application/mathematica':
+    case 'application/vnd.mozilla.xul+xml':
+    case 'application/x-asp':
+    case 'application/x-awk':
+    case 'application/x-cgi':
+    case 'application/x-csh':
+    case 'application/x-m4':
+    case 'application/x-perl':
+    case 'application/x-php':
+    case 'application/x-ruby':
+    case 'application/x-shellscript':
+    case 'text/vnd.wap.wmlscript':
+    case 'text/x-emacs-lisp':
+    case 'text/x-haskell':
+    case 'text/x-literate-haskell':
+    case 'text/x-lua':
+    case 'text/x-makefile':
+    case 'text/x-matlab':
+    case 'text/x-python':
+    case 'text/x-sql':
+    case 'text/x-tcl':
+      return 'text-x-script';
+
+    // HTML aliases.
+    case 'application/xhtml+xml':
+      return 'text-html';
+
+    // Executable types.
+    case 'application/x-macbinary':
+    case 'application/x-ms-dos-executable':
+    case 'application/x-pef-executable':
+      return 'application-x-executable';
+
+    default:
+      return FALSE;
+  }
+}
+
+/**
+ * @defgroup file-module-api File module public API functions
+ * @{
+ * These functions may be used to determine if and where a file is in use.
+ */
+
+/**
+ * Retrieves a list of references to a file.
+ *
+ * @param $file
+ *   A file object.
+ * @param $field
+ *   (optional) A field array to be used for this check. If given, limits the
+ *   reference check to the given field.
+ * @param $age
+ *   (optional) A constant that specifies which references to count. Use
+ *   FIELD_LOAD_REVISION to retrieve all references within all revisions or
+ *   FIELD_LOAD_CURRENT to retrieve references only in the current revisions.
+ * @param $field_type
+ *   (optional) The name of a field type. If given, limits the reference check
+ *   to fields of the given type.
+ *
+ * @return
+ *   An integer value.
+ */
+function file_get_file_references($file, $field = NULL, $age = FIELD_LOAD_REVISION, $field_type = 'file') {
+  $references = drupal_static(__FUNCTION__, array());
+  $fields = isset($field) ? array($field['field_name'] => $field) : field_info_fields();
+
+  foreach ($fields as $field_name => $file_field) {
+    if ((empty($field_type) || $file_field['type'] == $field_type) && !isset($references[$field_name])) {
+      // Get each time this file is used within a field.
+      $query = new EntityFieldQuery();
+      $query
+        ->fieldCondition($file_field, 'fid', $file->fid)
+        ->age($age);
+      $references[$field_name] = $query->execute();
+    }
+  }
+
+  return isset($field) ? $references[$field['field_name']] : array_filter($references);
+}
+
+/**
+ * @} End of "defgroup file-module-api".
+ */
diff --git a/htmltest/modules/file/icons/application-octet-stream.png b/htmltest/modules/file/icons/application-octet-stream.png
new file mode 100644
index 00000000..d5453217
Binary files /dev/null and b/htmltest/modules/file/icons/application-octet-stream.png differ
diff --git a/htmltest/modules/file/icons/application-pdf.png b/htmltest/modules/file/icons/application-pdf.png
new file mode 100644
index 00000000..36107d6e
Binary files /dev/null and b/htmltest/modules/file/icons/application-pdf.png differ
diff --git a/htmltest/modules/file/icons/application-x-executable.png b/htmltest/modules/file/icons/application-x-executable.png
new file mode 100644
index 00000000..d5453217
Binary files /dev/null and b/htmltest/modules/file/icons/application-x-executable.png differ
diff --git a/htmltest/modules/file/icons/audio-x-generic.png b/htmltest/modules/file/icons/audio-x-generic.png
new file mode 100644
index 00000000..28d7f508
Binary files /dev/null and b/htmltest/modules/file/icons/audio-x-generic.png differ
diff --git a/htmltest/modules/file/icons/image-x-generic.png b/htmltest/modules/file/icons/image-x-generic.png
new file mode 100644
index 00000000..c1b814f7
Binary files /dev/null and b/htmltest/modules/file/icons/image-x-generic.png differ
diff --git a/htmltest/modules/file/icons/package-x-generic.png b/htmltest/modules/file/icons/package-x-generic.png
new file mode 100644
index 00000000..21fc382c
Binary files /dev/null and b/htmltest/modules/file/icons/package-x-generic.png differ
diff --git a/htmltest/modules/file/icons/text-html.png b/htmltest/modules/file/icons/text-html.png
new file mode 100644
index 00000000..9c7c7932
Binary files /dev/null and b/htmltest/modules/file/icons/text-html.png differ
diff --git a/htmltest/modules/file/icons/text-plain.png b/htmltest/modules/file/icons/text-plain.png
new file mode 100644
index 00000000..06804849
Binary files /dev/null and b/htmltest/modules/file/icons/text-plain.png differ
diff --git a/htmltest/modules/file/icons/text-x-generic.png b/htmltest/modules/file/icons/text-x-generic.png
new file mode 100644
index 00000000..06804849
Binary files /dev/null and b/htmltest/modules/file/icons/text-x-generic.png differ
diff --git a/htmltest/modules/file/icons/text-x-script.png b/htmltest/modules/file/icons/text-x-script.png
new file mode 100644
index 00000000..f9ecca81
Binary files /dev/null and b/htmltest/modules/file/icons/text-x-script.png differ
diff --git a/htmltest/modules/file/icons/video-x-generic.png b/htmltest/modules/file/icons/video-x-generic.png
new file mode 100644
index 00000000..a2b71f95
Binary files /dev/null and b/htmltest/modules/file/icons/video-x-generic.png differ
diff --git a/htmltest/modules/file/icons/x-office-document.png b/htmltest/modules/file/icons/x-office-document.png
new file mode 100644
index 00000000..40db538f
Binary files /dev/null and b/htmltest/modules/file/icons/x-office-document.png differ
diff --git a/htmltest/modules/file/icons/x-office-presentation.png b/htmltest/modules/file/icons/x-office-presentation.png
new file mode 100644
index 00000000..fb119e5b
Binary files /dev/null and b/htmltest/modules/file/icons/x-office-presentation.png differ
diff --git a/htmltest/modules/file/icons/x-office-spreadsheet.png b/htmltest/modules/file/icons/x-office-spreadsheet.png
new file mode 100644
index 00000000..9af7b61e
Binary files /dev/null and b/htmltest/modules/file/icons/x-office-spreadsheet.png differ
diff --git a/htmltest/modules/file/tests/file.test b/htmltest/modules/file/tests/file.test
new file mode 100644
index 00000000..69e711a3
--- /dev/null
+++ b/htmltest/modules/file/tests/file.test
@@ -0,0 +1,1171 @@
+<?php
+
+/**
+ * @file
+ * Tests for file.module.
+ */
+
+/**
+ * Provides methods specifically for testing File module's field handling.
+ */
+class FileFieldTestCase extends DrupalWebTestCase {
+  protected $admin_user;
+
+  function setUp() {
+    // Since this is a base class for many test cases, support the same
+    // flexibility that DrupalWebTestCase::setUp() has for the modules to be
+    // passed in as either an array or a variable number of string arguments.
+    $modules = func_get_args();
+    if (isset($modules[0]) && is_array($modules[0])) {
+      $modules = $modules[0];
+    }
+    $modules[] = 'file';
+    $modules[] = 'file_module_test';
+    parent::setUp($modules);
+    $this->admin_user = $this->drupalCreateUser(array('access content', 'access administration pages', 'administer site configuration', 'administer users', 'administer permissions', 'administer content types', 'administer nodes', 'bypass node access'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Retrieves a sample file of the specified type.
+   */
+  function getTestFile($type_name, $size = NULL) {
+    // Get a file to upload.
+    $file = current($this->drupalGetTestFiles($type_name, $size));
+
+    // Add a filesize property to files as would be read by file_load().
+    $file->filesize = filesize($file->uri);
+
+    return $file;
+  }
+
+  /**
+   * Retrieves the fid of the last inserted file.
+   */
+  function getLastFileId() {
+    return (int) db_query('SELECT MAX(fid) FROM {file_managed}')->fetchField();
+  }
+
+  /**
+   * Creates a new file field.
+   *
+   * @param $name
+   *   The name of the new field (all lowercase), exclude the "field_" prefix.
+   * @param $type_name
+   *   The node type that this field will be added to.
+   * @param $field_settings
+   *   A list of field settings that will be added to the defaults.
+   * @param $instance_settings
+   *   A list of instance settings that will be added to the instance defaults.
+   * @param $widget_settings
+   *   A list of widget settings that will be added to the widget defaults.
+   */
+  function createFileField($name, $type_name, $field_settings = array(), $instance_settings = array(), $widget_settings = array()) {
+    $field = array(
+      'field_name' => $name,
+      'type' => 'file',
+      'settings' => array(),
+      'cardinality' => !empty($field_settings['cardinality']) ? $field_settings['cardinality'] : 1,
+    );
+    $field['settings'] = array_merge($field['settings'], $field_settings);
+    field_create_field($field);
+
+    $this->attachFileField($name, 'node', $type_name, $instance_settings, $widget_settings);
+  }
+
+  /**
+   * Attaches a file field to an entity.
+   *
+   * @param $name
+   *   The name of the new field (all lowercase), exclude the "field_" prefix.
+   * @param $entity_type
+   *   The entity type this field will be added to.
+   * @param $bundle
+   *   The bundle this field will be added to.
+   * @param $field_settings
+   *   A list of field settings that will be added to the defaults.
+   * @param $instance_settings
+   *   A list of instance settings that will be added to the instance defaults.
+   * @param $widget_settings
+   *   A list of widget settings that will be added to the widget defaults.
+   */
+  function attachFileField($name, $entity_type, $bundle, $instance_settings = array(), $widget_settings = array()) {
+    $instance = array(
+      'field_name' => $name,
+      'label' => $name,
+      'entity_type' => $entity_type,
+      'bundle' => $bundle,
+      'required' => !empty($instance_settings['required']),
+      'settings' => array(),
+      'widget' => array(
+        'type' => 'file_generic',
+        'settings' => array(),
+      ),
+    );
+    $instance['settings'] = array_merge($instance['settings'], $instance_settings);
+    $instance['widget']['settings'] = array_merge($instance['widget']['settings'], $widget_settings);
+    field_create_instance($instance);
+  }
+
+  /**
+   * Updates an existing file field with new settings.
+   */
+  function updateFileField($name, $type_name, $instance_settings = array(), $widget_settings = array()) {
+    $instance = field_info_instance('node', $name, $type_name);
+    $instance['settings'] = array_merge($instance['settings'], $instance_settings);
+    $instance['widget']['settings'] = array_merge($instance['widget']['settings'], $widget_settings);
+
+    field_update_instance($instance);
+  }
+
+  /**
+   * Uploads a file to a node.
+   */
+  function uploadNodeFile($file, $field_name, $nid_or_type, $new_revision = TRUE, $extras = array()) {
+    $langcode = LANGUAGE_NONE;
+    $edit = array(
+      "title" => $this->randomName(),
+      'revision' => (string) (int) $new_revision,
+    );
+
+    if (is_numeric($nid_or_type)) {
+      $nid = $nid_or_type;
+    }
+    else {
+      // Add a new node.
+      $extras['type'] = $nid_or_type;
+      $node = $this->drupalCreateNode($extras);
+      $nid = $node->nid;
+      // Save at least one revision to better simulate a real site.
+      $this->drupalCreateNode(get_object_vars($node));
+      $node = node_load($nid, NULL, TRUE);
+      $this->assertNotEqual($nid, $node->vid, 'Node revision exists.');
+    }
+
+    // Attach a file to the node.
+    $edit['files[' . $field_name . '_' . $langcode . '_0]'] = drupal_realpath($file->uri);
+    $this->drupalPost("node/$nid/edit", $edit, t('Save'));
+
+    return $nid;
+  }
+
+  /**
+   * Removes a file from a node.
+   *
+   * Note that if replacing a file, it must first be removed then added again.
+   */
+  function removeNodeFile($nid, $new_revision = TRUE) {
+    $edit = array(
+      'revision' => (string) (int) $new_revision,
+    );
+
+    $this->drupalPost('node/' . $nid . '/edit', array(), t('Remove'));
+    $this->drupalPost(NULL, $edit, t('Save'));
+  }
+
+  /**
+   * Replaces a file within a node.
+   */
+  function replaceNodeFile($file, $field_name, $nid, $new_revision = TRUE) {
+    $edit = array(
+      'files[' . $field_name . '_' . LANGUAGE_NONE . '_0]' => drupal_realpath($file->uri),
+      'revision' => (string) (int) $new_revision,
+    );
+
+    $this->drupalPost('node/' . $nid . '/edit', array(), t('Remove'));
+    $this->drupalPost(NULL, $edit, t('Save'));
+  }
+
+  /**
+   * Asserts that a file exists physically on disk.
+   */
+  function assertFileExists($file, $message = NULL) {
+    $message = isset($message) ? $message : format_string('File %file exists on the disk.', array('%file' => $file->uri));
+    $this->assertTrue(is_file($file->uri), $message);
+  }
+
+  /**
+   * Asserts that a file exists in the database.
+   */
+  function assertFileEntryExists($file, $message = NULL) {
+    entity_get_controller('file')->resetCache();
+    $db_file = file_load($file->fid);
+    $message = isset($message) ? $message : format_string('File %file exists in database at the correct path.', array('%file' => $file->uri));
+    $this->assertEqual($db_file->uri, $file->uri, $message);
+  }
+
+  /**
+   * Asserts that a file does not exist on disk.
+   */
+  function assertFileNotExists($file, $message = NULL) {
+    $message = isset($message) ? $message : format_string('File %file exists on the disk.', array('%file' => $file->uri));
+    $this->assertFalse(is_file($file->uri), $message);
+  }
+
+  /**
+   * Asserts that a file does not exist in the database.
+   */
+  function assertFileEntryNotExists($file, $message) {
+    entity_get_controller('file')->resetCache();
+    $message = isset($message) ? $message : format_string('File %file exists in database at the correct path.', array('%file' => $file->uri));
+    $this->assertFalse(file_load($file->fid), $message);
+  }
+
+  /**
+   * Asserts that a file's status is set to permanent in the database.
+   */
+  function assertFileIsPermanent($file, $message = NULL) {
+    $message = isset($message) ? $message : format_string('File %file is permanent.', array('%file' => $file->uri));
+    $this->assertTrue($file->status == FILE_STATUS_PERMANENT, $message);
+  }
+}
+
+/**
+ * Tests the 'managed_file' element type.
+ *
+ * @todo Create a FileTestCase base class and move FileFieldTestCase methods
+ *   that aren't related to fields into it.
+ */
+class FileManagedFileElementTestCase extends FileFieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Managed file element test',
+      'description' => 'Tests the managed_file element type.',
+      'group' => 'File',
+    );
+  }
+
+  /**
+   * Tests the managed_file element type.
+   */
+  function testManagedFile() {
+    // Check that $element['#size'] is passed to the child upload element.
+    $this->drupalGet('file/test');
+    $this->assertFieldByXpath('//input[@name="files[nested_file]" and @size="13"]', NULL, 'The custom #size attribute is passed to the child upload element.');
+
+    // Perform the tests with all permutations of $form['#tree'] and
+    // $element['#extended'].
+    foreach (array(0, 1) as $tree) {
+      foreach (array(0, 1) as $extended) {
+        $test_file = $this->getTestFile('text');
+        $path = 'file/test/' . $tree . '/' . $extended;
+        $input_base_name = $tree ? 'nested_file' : 'file';
+
+        // Submit without a file.
+        $this->drupalPost($path, array(), t('Save'));
+        $this->assertRaw(t('The file id is %fid.', array('%fid' => 0)), 'Submitted without a file.');
+
+        // Submit a new file, without using the Upload button.
+        $last_fid_prior = $this->getLastFileId();
+        $edit = array('files[' . $input_base_name . ']' => drupal_realpath($test_file->uri));
+        $this->drupalPost($path, $edit, t('Save'));
+        $last_fid = $this->getLastFileId();
+        $this->assertTrue($last_fid > $last_fid_prior, 'New file got saved.');
+        $this->assertRaw(t('The file id is %fid.', array('%fid' => $last_fid)), 'Submit handler has correct file info.');
+
+        // Submit no new input, but with a default file.
+        $this->drupalPost($path . '/' . $last_fid, array(), t('Save'));
+        $this->assertRaw(t('The file id is %fid.', array('%fid' => $last_fid)), 'Empty submission did not change an existing file.');
+
+        // Now, test the Upload and Remove buttons, with and without Ajax.
+        foreach (array(FALSE, TRUE) as $ajax) {
+          // Upload, then Submit.
+          $last_fid_prior = $this->getLastFileId();
+          $this->drupalGet($path);
+          $edit = array('files[' . $input_base_name . ']' => drupal_realpath($test_file->uri));
+          if ($ajax) {
+            $this->drupalPostAJAX(NULL, $edit, $input_base_name . '_upload_button');
+          }
+          else {
+            $this->drupalPost(NULL, $edit, t('Upload'));
+          }
+          $last_fid = $this->getLastFileId();
+          $this->assertTrue($last_fid > $last_fid_prior, 'New file got uploaded.');
+          $this->drupalPost(NULL, array(), t('Save'));
+          $this->assertRaw(t('The file id is %fid.', array('%fid' => $last_fid)), 'Submit handler has correct file info.');
+
+          // Remove, then Submit.
+          $this->drupalGet($path . '/' . $last_fid);
+          if ($ajax) {
+            $this->drupalPostAJAX(NULL, array(), $input_base_name . '_remove_button');
+          }
+          else {
+            $this->drupalPost(NULL, array(), t('Remove'));
+          }
+          $this->drupalPost(NULL, array(), t('Save'));
+          $this->assertRaw(t('The file id is %fid.', array('%fid' => 0)), 'Submission after file removal was successful.');
+
+          // Upload, then Remove, then Submit.
+          $this->drupalGet($path);
+          $edit = array('files[' . $input_base_name . ']' => drupal_realpath($test_file->uri));
+          if ($ajax) {
+            $this->drupalPostAJAX(NULL, $edit, $input_base_name . '_upload_button');
+            $this->drupalPostAJAX(NULL, array(), $input_base_name . '_remove_button');
+          }
+          else {
+            $this->drupalPost(NULL, $edit, t('Upload'));
+            $this->drupalPost(NULL, array(), t('Remove'));
+          }
+          $this->drupalPost(NULL, array(), t('Save'));
+          $this->assertRaw(t('The file id is %fid.', array('%fid' => 0)), 'Submission after file upload and removal was successful.');
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Tests file field widget.
+ */
+class FileFieldWidgetTestCase extends FileFieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File field widget test',
+      'description' => 'Tests the file field widget, single and multi-valued, with and without AJAX, with public and private files.',
+      'group' => 'File',
+    );
+  }
+
+  /**
+   * Tests upload and remove buttons for a single-valued File field.
+   */
+  function testSingleValuedWidget() {
+    // Use 'page' instead of 'article', so that the 'article' image field does
+    // not conflict with this test. If in the future the 'page' type gets its
+    // own default file or image field, this test can be made more robust by
+    // using a custom node type.
+    $type_name = 'page';
+    $field_name = strtolower($this->randomName());
+    $this->createFileField($field_name, $type_name);
+    $field = field_info_field($field_name);
+    $instance = field_info_instance('node', $field_name, $type_name);
+
+    $test_file = $this->getTestFile('text');
+
+    foreach (array('nojs', 'js') as $type) {
+      // Create a new node with the uploaded file and ensure it got uploaded
+      // successfully.
+      // @todo This only tests a 'nojs' submission, because drupalPostAJAX()
+      //   does not yet support file uploads.
+      $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
+      $node = node_load($nid, NULL, TRUE);
+      $node_file = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+      $this->assertFileExists($node_file, 'New file saved to disk on node creation.');
+
+      // Ensure the file can be downloaded.
+      $this->drupalGet(file_create_url($node_file->uri));
+      $this->assertResponse(200, 'Confirmed that the generated URL is correct by downloading the shipped file.');
+
+      // Ensure the edit page has a remove button instead of an upload button.
+      $this->drupalGet("node/$nid/edit");
+      $this->assertNoFieldByXPath('//input[@type="submit"]', t('Upload'), 'Node with file does not display the "Upload" button.');
+      $this->assertFieldByXpath('//input[@type="submit"]', t('Remove'), 'Node with file displays the "Remove" button.');
+
+      // "Click" the remove button (emulating either a nojs or js submission).
+      switch ($type) {
+        case 'nojs':
+          $this->drupalPost(NULL, array(), t('Remove'));
+          break;
+        case 'js':
+          $button = $this->xpath('//input[@type="submit" and @value="' . t('Remove') . '"]');
+          $this->drupalPostAJAX(NULL, array(), array((string) $button[0]['name'] => (string) $button[0]['value']));
+          break;
+      }
+
+      // Ensure the page now has an upload button instead of a remove button.
+      $this->assertNoFieldByXPath('//input[@type="submit"]', t('Remove'), 'After clicking the "Remove" button, it is no longer displayed.');
+      $this->assertFieldByXpath('//input[@type="submit"]', t('Upload'), 'After clicking the "Remove" button, the "Upload" button is displayed.');
+
+      // Save the node and ensure it does not have the file.
+      $this->drupalPost(NULL, array(), t('Save'));
+      $node = node_load($nid, NULL, TRUE);
+      $this->assertTrue(empty($node->{$field_name}[LANGUAGE_NONE][0]['fid']), 'File was successfully removed from the node.');
+    }
+  }
+
+  /**
+   * Tests upload and remove buttons for multiple multi-valued File fields.
+   */
+  function testMultiValuedWidget() {
+    // Use 'page' instead of 'article', so that the 'article' image field does
+    // not conflict with this test. If in the future the 'page' type gets its
+    // own default file or image field, this test can be made more robust by
+    // using a custom node type.
+    $type_name = 'page';
+    $field_name = strtolower($this->randomName());
+    $field_name2 = strtolower($this->randomName());
+    $this->createFileField($field_name, $type_name, array('cardinality' => 3));
+    $this->createFileField($field_name2, $type_name, array('cardinality' => 3));
+
+    $field = field_info_field($field_name);
+    $instance = field_info_instance('node', $field_name, $type_name);
+
+    $field2 = field_info_field($field_name2);
+    $instance2 = field_info_instance('node', $field_name2, $type_name);
+
+    $test_file = $this->getTestFile('text');
+
+    foreach (array('nojs', 'js') as $type) {
+      // Visit the node creation form, and upload 3 files for each field. Since
+      // the field has cardinality of 3, ensure the "Upload" button is displayed
+      // until after the 3rd file, and after that, isn't displayed. Because
+      // SimpleTest triggers the last button with a given name, so upload to the
+      // second field first.
+      // @todo This is only testing a non-Ajax upload, because drupalPostAJAX()
+      //   does not yet emulate jQuery's file upload.
+      //
+      $this->drupalGet("node/add/$type_name");
+      foreach (array($field_name2, $field_name) as $each_field_name) {
+        for ($delta = 0; $delta < 3; $delta++) {
+          $edit = array('files[' . $each_field_name . '_' . LANGUAGE_NONE . '_' . $delta . ']' => drupal_realpath($test_file->uri));
+          // If the Upload button doesn't exist, drupalPost() will automatically
+          // fail with an assertion message.
+          $this->drupalPost(NULL, $edit, t('Upload'));
+        }
+      }
+      $this->assertNoFieldByXpath('//input[@type="submit"]', t('Upload'), 'After uploading 3 files for each field, the "Upload" button is no longer displayed.');
+
+      $num_expected_remove_buttons = 6;
+
+      foreach (array($field_name, $field_name2) as $current_field_name) {
+        // How many uploaded files for the current field are remaining.
+        $remaining = 3;
+        // Test clicking each "Remove" button. For extra robustness, test them out
+        // of sequential order. They are 0-indexed, and get renumbered after each
+        // iteration, so array(1, 1, 0) means:
+        // - First remove the 2nd file.
+        // - Then remove what is then the 2nd file (was originally the 3rd file).
+        // - Then remove the first file.
+        foreach (array(1,1,0) as $delta) {
+          // Ensure we have the expected number of Remove buttons, and that they
+          // are numbered sequentially.
+          $buttons = $this->xpath('//input[@type="submit" and @value="Remove"]');
+          $this->assertTrue(is_array($buttons) && count($buttons) === $num_expected_remove_buttons, format_string('There are %n "Remove" buttons displayed (JSMode=%type).', array('%n' => $num_expected_remove_buttons, '%type' => $type)));
+          foreach ($buttons as $i => $button) {
+            $key = $i >= $remaining ? $i - $remaining : $i;
+            $check_field_name = $field_name2;
+            if ($current_field_name == $field_name && $i < $remaining) {
+              $check_field_name = $field_name;
+            }
+
+            $this->assertIdentical((string) $button['name'], $check_field_name . '_' . LANGUAGE_NONE . '_' . $key. '_remove_button');
+          }
+
+          // "Click" the remove button (emulating either a nojs or js submission).
+          $button_name = $current_field_name . '_' . LANGUAGE_NONE . '_' . $delta . '_remove_button';
+          switch ($type) {
+            case 'nojs':
+              // drupalPost() takes a $submit parameter that is the value of the
+              // button whose click we want to emulate. Since we have multiple
+              // buttons with the value "Remove", and want to control which one we
+              // use, we change the value of the other ones to something else.
+              // Since non-clicked buttons aren't included in the submitted POST
+              // data, and since drupalPost() will result in $this being updated
+              // with a newly rebuilt form, this doesn't cause problems.
+              foreach ($buttons as $button) {
+                if ($button['name'] != $button_name) {
+                  $button['value'] = 'DUMMY';
+                }
+              }
+              $this->drupalPost(NULL, array(), t('Remove'));
+              break;
+            case 'js':
+              // drupalPostAJAX() lets us target the button precisely, so we don't
+              // require the workaround used above for nojs.
+              $this->drupalPostAJAX(NULL, array(), array($button_name => t('Remove')));
+              break;
+          }
+          $num_expected_remove_buttons--;
+          $remaining--;
+
+          // Ensure an "Upload" button for the current field is displayed with the
+          // correct name.
+          $upload_button_name = $current_field_name . '_' . LANGUAGE_NONE . '_' . $remaining . '_upload_button';
+          $buttons = $this->xpath('//input[@type="submit" and @value="Upload" and @name=:name]', array(':name' => $upload_button_name));
+          $this->assertTrue(is_array($buttons) && count($buttons) == 1, format_string('The upload button is displayed with the correct name (JSMode=%type).', array('%type' => $type)));
+
+          // Ensure only at most one button per field is displayed.
+          $buttons = $this->xpath('//input[@type="submit" and @value="Upload"]');
+          $expected = $current_field_name == $field_name ? 1 : 2;
+          $this->assertTrue(is_array($buttons) && count($buttons) == $expected, format_string('After removing a file, only one "Upload" button for each possible field is displayed (JSMode=%type).', array('%type' => $type)));
+        }
+      }
+
+      // Ensure the page now has no Remove buttons.
+      $this->assertNoFieldByXPath('//input[@type="submit"]', t('Remove'), format_string('After removing all files, there is no "Remove" button displayed (JSMode=%type).', array('%type' => $type)));
+
+      // Save the node and ensure it does not have any files.
+      $this->drupalPost(NULL, array('title' => $this->randomName()), t('Save'));
+      $matches = array();
+      preg_match('/node\/([0-9]+)/', $this->getUrl(), $matches);
+      $nid = $matches[1];
+      $node = node_load($nid, NULL, TRUE);
+      $this->assertTrue(empty($node->{$field_name}[LANGUAGE_NONE][0]['fid']), 'Node was successfully saved without any files.');
+    }
+  }
+
+  /**
+   * Tests a file field with a "Private files" upload destination setting.
+   */
+  function testPrivateFileSetting() {
+    // Use 'page' instead of 'article', so that the 'article' image field does
+    // not conflict with this test. If in the future the 'page' type gets its
+    // own default file or image field, this test can be made more robust by
+    // using a custom node type.
+    $type_name = 'page';
+    $field_name = strtolower($this->randomName());
+    $this->createFileField($field_name, $type_name);
+    $field = field_info_field($field_name);
+    $instance = field_info_instance('node', $field_name, $type_name);
+
+    $test_file = $this->getTestFile('text');
+
+    // Change the field setting to make its files private, and upload a file.
+    $edit = array('field[settings][uri_scheme]' => 'private');
+    $this->drupalPost("admin/structure/types/manage/$type_name/fields/$field_name", $edit, t('Save settings'));
+    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
+    $node = node_load($nid, NULL, TRUE);
+    $node_file = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    $this->assertFileExists($node_file, 'New file saved to disk on node creation.');
+
+    // Ensure the private file is available to the user who uploaded it.
+    $this->drupalGet(file_create_url($node_file->uri));
+    $this->assertResponse(200, 'Confirmed that the generated URL is correct by downloading the shipped file.');
+
+    // Ensure we can't change 'uri_scheme' field settings while there are some
+    // entities with uploaded files.
+    $this->drupalGet("admin/structure/types/manage/$type_name/fields/$field_name");
+    $this->assertFieldByXpath('//input[@id="edit-field-settings-uri-scheme-public" and @disabled="disabled"]', 'public', 'Upload destination setting disabled.');
+
+    // Delete node and confirm that setting could be changed.
+    node_delete($nid);
+    $this->drupalGet("admin/structure/types/manage/$type_name/fields/$field_name");
+    $this->assertFieldByXpath('//input[@id="edit-field-settings-uri-scheme-public" and not(@disabled)]', 'public', 'Upload destination setting enabled.');
+  }
+
+  /**
+   * Tests that download restrictions on private files work on comments.
+   */
+  function testPrivateFileComment() {
+    $user = $this->drupalCreateUser(array('access comments'));
+
+    // Remove access comments permission from anon user.
+    $edit = array(
+      DRUPAL_ANONYMOUS_RID . '[access comments]' => FALSE,
+    );
+    $this->drupalPost('admin/people/permissions', $edit, t('Save permissions'));
+
+    // Create a new field.
+    $edit = array(
+      'fields[_add_new_field][label]' => $label = $this->randomName(),
+      'fields[_add_new_field][field_name]' => $name = strtolower($this->randomName()),
+      'fields[_add_new_field][type]' => 'file',
+      'fields[_add_new_field][widget_type]' => 'file_generic',
+    );
+    $this->drupalPost('admin/structure/types/manage/article/comment/fields', $edit, t('Save'));
+    $edit = array('field[settings][uri_scheme]' => 'private');
+    $this->drupalPost(NULL, $edit, t('Save field settings'));
+    $this->drupalPost(NULL, array(), t('Save settings'));
+
+    // Create node.
+    $text_file = $this->getTestFile('text');
+    $edit = array(
+      'title' => $this->randomName(),
+    );
+    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $node = $this->drupalGetNodeByTitle($edit['title']);
+
+    // Add a comment with a file.
+    $text_file = $this->getTestFile('text');
+    $edit = array(
+      'files[field_' . $name . '_' . LANGUAGE_NONE . '_' . 0 . ']' => drupal_realpath($text_file->uri),
+      'comment_body[' . LANGUAGE_NONE . '][0][value]' => $comment_body = $this->randomName(),
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+
+    // Get the comment ID.
+    preg_match('/comment-([0-9]+)/', $this->getUrl(), $matches);
+    $cid = $matches[1];
+
+    // Log in as normal user.
+    $this->drupalLogin($user);
+
+    $comment = comment_load($cid);
+    $comment_file = (object) $comment->{'field_' . $name}[LANGUAGE_NONE][0];
+    $this->assertFileExists($comment_file, 'New file saved to disk on node creation.');
+    // Test authenticated file download.
+    $url = file_create_url($comment_file->uri);
+    $this->assertNotEqual($url, NULL, 'Confirmed that the URL is valid');
+    $this->drupalGet(file_create_url($comment_file->uri));
+    $this->assertResponse(200, 'Confirmed that the generated URL is correct by downloading the shipped file.');
+
+    // Test anonymous file download.
+    $this->drupalLogout();
+    $this->drupalGet(file_create_url($comment_file->uri));
+    $this->assertResponse(403, 'Confirmed that access is denied for the file without the needed permission.');
+
+    // Unpublishes node.
+    $this->drupalLogin($this->admin_user);
+    $edit = array(
+      'status' => FALSE,
+    );
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    // Ensures normal user can no longer download the file.
+    $this->drupalLogin($user);
+    $this->drupalGet(file_create_url($comment_file->uri));
+    $this->assertResponse(403, 'Confirmed that access is denied for the file without the needed permission.');
+  }
+
+}
+
+/**
+ * Tests file handling with node revisions.
+ */
+class FileFieldRevisionTestCase extends FileFieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File field revision test',
+      'description' => 'Test creating and deleting revisions with files attached.',
+      'group' => 'File',
+    );
+  }
+
+  /**
+   * Tests creating multiple revisions of a node and managing attached files.
+   *
+   * Expected behaviors:
+   *  - Adding a new revision will make another entry in the field table, but
+   *    the original file will not be duplicated.
+   *  - Deleting a revision should not delete the original file if the file
+   *    is in use by another revision.
+   *  - When the last revision that uses a file is deleted, the original file
+   *    should be deleted also.
+   */
+  function testRevisions() {
+    $type_name = 'article';
+    $field_name = strtolower($this->randomName());
+    $this->createFileField($field_name, $type_name);
+    $field = field_info_field($field_name);
+    $instance = field_info_instance('node', $field_name, $type_name);
+
+    // Attach the same fields to users.
+    $this->attachFileField($field_name, 'user', 'user');
+
+    $test_file = $this->getTestFile('text');
+
+    // Create a new node with the uploaded file.
+    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
+
+    // Check that the file exists on disk and in the database.
+    $node = node_load($nid, NULL, TRUE);
+    $node_file_r1 = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    $node_vid_r1 = $node->vid;
+    $this->assertFileExists($node_file_r1, 'New file saved to disk on node creation.');
+    $this->assertFileEntryExists($node_file_r1, 'File entry exists in database on node creation.');
+    $this->assertFileIsPermanent($node_file_r1, 'File is permanent.');
+
+    // Upload another file to the same node in a new revision.
+    $this->replaceNodeFile($test_file, $field_name, $nid);
+    $node = node_load($nid, NULL, TRUE);
+    $node_file_r2 = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    $node_vid_r2 = $node->vid;
+    $this->assertFileExists($node_file_r2, 'Replacement file exists on disk after creating new revision.');
+    $this->assertFileEntryExists($node_file_r2, 'Replacement file entry exists in database after creating new revision.');
+    $this->assertFileIsPermanent($node_file_r2, 'Replacement file is permanent.');
+
+    // Check that the original file is still in place on the first revision.
+    $node = node_load($nid, $node_vid_r1, TRUE);
+    $this->assertEqual($node_file_r1, (object) $node->{$field_name}[LANGUAGE_NONE][0], 'Original file still in place after replacing file in new revision.');
+    $this->assertFileExists($node_file_r1, 'Original file still in place after replacing file in new revision.');
+    $this->assertFileEntryExists($node_file_r1, 'Original file entry still in place after replacing file in new revision');
+    $this->assertFileIsPermanent($node_file_r1, 'Original file is still permanent.');
+
+    // Save a new version of the node without any changes.
+    // Check that the file is still the same as the previous revision.
+    $this->drupalPost('node/' . $nid . '/edit', array('revision' => '1'), t('Save'));
+    $node = node_load($nid, NULL, TRUE);
+    $node_file_r3 = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    $node_vid_r3 = $node->vid;
+    $this->assertEqual($node_file_r2, $node_file_r3, 'Previous revision file still in place after creating a new revision without a new file.');
+    $this->assertFileIsPermanent($node_file_r3, 'New revision file is permanent.');
+
+    // Revert to the first revision and check that the original file is active.
+    $this->drupalPost('node/' . $nid . '/revisions/' . $node_vid_r1 . '/revert', array(), t('Revert'));
+    $node = node_load($nid, NULL, TRUE);
+    $node_file_r4 = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    $node_vid_r4 = $node->vid;
+    $this->assertEqual($node_file_r1, $node_file_r4, 'Original revision file still in place after reverting to the original revision.');
+    $this->assertFileIsPermanent($node_file_r4, 'Original revision file still permanent after reverting to the original revision.');
+
+    // Delete the second revision and check that the file is kept (since it is
+    // still being used by the third revision).
+    $this->drupalPost('node/' . $nid . '/revisions/' . $node_vid_r2 . '/delete', array(), t('Delete'));
+    $this->assertFileExists($node_file_r3, 'Second file is still available after deleting second revision, since it is being used by the third revision.');
+    $this->assertFileEntryExists($node_file_r3, 'Second file entry is still available after deleting second revision, since it is being used by the third revision.');
+    $this->assertFileIsPermanent($node_file_r3, 'Second file entry is still permanent after deleting second revision, since it is being used by the third revision.');
+
+    // Attach the second file to a user.
+    $user = $this->drupalCreateUser();
+    $edit = (array) $user;
+    $edit[$field_name][LANGUAGE_NONE][0] = (array) $node_file_r3;
+    user_save($user, $edit);
+    $this->drupalGet('user/' . $user->uid . '/edit');
+
+    // Delete the third revision and check that the file is not deleted yet.
+    $this->drupalPost('node/' . $nid . '/revisions/' . $node_vid_r3 . '/delete', array(), t('Delete'));
+    $this->assertFileExists($node_file_r3, 'Second file is still available after deleting third revision, since it is being used by the user.');
+    $this->assertFileEntryExists($node_file_r3, 'Second file entry is still available after deleting third revision, since it is being used by the user.');
+    $this->assertFileIsPermanent($node_file_r3, 'Second file entry is still permanent after deleting third revision, since it is being used by the user.');
+
+    // Delete the user and check that the file is also deleted.
+    user_delete($user->uid);
+    // TODO: This seems like a bug in File API. Clearing the stat cache should
+    // not be necessary here. The file really is deleted, but stream wrappers
+    // doesn't seem to think so unless we clear the PHP file stat() cache.
+    clearstatcache();
+    $this->assertFileNotExists($node_file_r3, 'Second file is now deleted after deleting third revision, since it is no longer being used by any other nodes.');
+    $this->assertFileEntryNotExists($node_file_r3, 'Second file entry is now deleted after deleting third revision, since it is no longer being used by any other nodes.');
+
+    // Delete the entire node and check that the original file is deleted.
+    $this->drupalPost('node/' . $nid . '/delete', array(), t('Delete'));
+    $this->assertFileNotExists($node_file_r1, 'Original file is deleted after deleting the entire node with two revisions remaining.');
+    $this->assertFileEntryNotExists($node_file_r1, 'Original file entry is deleted after deleting the entire node with two revisions remaining.');
+  }
+}
+
+/**
+ * Tests that formatters are working properly.
+ */
+class FileFieldDisplayTestCase extends FileFieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File field display tests',
+      'description' => 'Test the display of file fields in node and views.',
+      'group' => 'File',
+    );
+  }
+
+  /**
+   * Tests normal formatter display on node display.
+   */
+  function testNodeDisplay() {
+    $field_name = strtolower($this->randomName());
+    $type_name = 'article';
+    $field_settings = array(
+      'display_field' => '1',
+      'display_default' => '1',
+    );
+    $instance_settings = array(
+      'description_field' => '1',
+    );
+    $widget_settings = array();
+    $this->createFileField($field_name, $type_name, $field_settings, $instance_settings, $widget_settings);
+    $field = field_info_field($field_name);
+    $instance = field_info_instance('node', $field_name, $type_name);
+
+    // Create a new node *without* the file field set, and check that the field
+    // is not shown for each node display.
+    $node = $this->drupalCreateNode(array('type' => $type_name));
+    $file_formatters = array('file_default', 'file_table', 'file_url_plain', 'hidden');
+    foreach ($file_formatters as $formatter) {
+      $edit = array(
+        "fields[$field_name][type]" => $formatter,
+      );
+      $this->drupalPost("admin/structure/types/manage/$type_name/display", $edit, t('Save'));
+      $this->drupalGet('node/' . $node->nid);
+      $this->assertNoText($field_name, format_string('Field label is hidden when no file attached for formatter %formatter', array('%formatter' => $formatter)));
+    }
+
+    $test_file = $this->getTestFile('text');
+
+    // Create a new node with the uploaded file.
+    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
+    $this->drupalGet('node/' . $nid . '/edit');
+
+    // Check that the default formatter is displaying with the file name.
+    $node = node_load($nid, NULL, TRUE);
+    $node_file = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    $default_output = theme('file_link', array('file' => $node_file));
+    $this->assertRaw($default_output, 'Default formatter displaying correctly on full node view.');
+
+    // Turn the "display" option off and check that the file is no longer displayed.
+    $edit = array($field_name . '[' . LANGUAGE_NONE . '][0][display]' => FALSE);
+    $this->drupalPost('node/' . $nid . '/edit', $edit, t('Save'));
+
+    $this->assertNoRaw($default_output, 'Field is hidden when "display" option is unchecked.');
+
+  }
+}
+
+/**
+ * Tests various validations.
+ */
+class FileFieldValidateTestCase extends FileFieldTestCase {
+  protected $field;
+  protected $node_type;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'File field validation tests',
+      'description' => 'Tests validation functions such as file type, max file size, max size per node, and required.',
+      'group' => 'File',
+    );
+  }
+
+  /**
+   * Tests the required property on file fields.
+   */
+  function testRequired() {
+    $type_name = 'article';
+    $field_name = strtolower($this->randomName());
+    $this->createFileField($field_name, $type_name, array(), array('required' => '1'));
+    $field = field_info_field($field_name);
+    $instance = field_info_instance('node', $field_name, $type_name);
+
+    $test_file = $this->getTestFile('text');
+
+    // Try to post a new node without uploading a file.
+    $langcode = LANGUAGE_NONE;
+    $edit = array("title" => $this->randomName());
+    $this->drupalPost('node/add/' . $type_name, $edit, t('Save'));
+    $this->assertRaw(t('!title field is required.', array('!title' => $instance['label'])), 'Node save failed when required file field was empty.');
+
+    // Create a new node with the uploaded file.
+    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
+    $this->assertTrue($nid !== FALSE, format_string('uploadNodeFile(@test_file, @field_name, @type_name) succeeded', array('@test_file' => $test_file->uri, '@field_name' => $field_name, '@type_name' => $type_name)));
+
+    $node = node_load($nid, NULL, TRUE);
+
+    $node_file = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    $this->assertFileExists($node_file, 'File exists after uploading to the required field.');
+    $this->assertFileEntryExists($node_file, 'File entry exists after uploading to the required field.');
+
+    // Try again with a multiple value field.
+    field_delete_field($field_name);
+    $this->createFileField($field_name, $type_name, array('cardinality' => FIELD_CARDINALITY_UNLIMITED), array('required' => '1'));
+
+    // Try to post a new node without uploading a file in the multivalue field.
+    $edit = array('title' => $this->randomName());
+    $this->drupalPost('node/add/' . $type_name, $edit, t('Save'));
+    $this->assertRaw(t('!title field is required.', array('!title' => $instance['label'])), 'Node save failed when required multiple value file field was empty.');
+
+    // Create a new node with the uploaded file into the multivalue field.
+    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
+    $node = node_load($nid, NULL, TRUE);
+    $node_file = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    $this->assertFileExists($node_file, 'File exists after uploading to the required multiple value field.');
+    $this->assertFileEntryExists($node_file, 'File entry exists after uploading to the required multipel value field.');
+
+    // Remove our file field.
+    field_delete_field($field_name);
+  }
+
+  /**
+   * Tests the max file size validator.
+   */
+  function testFileMaxSize() {
+    $type_name = 'article';
+    $field_name = strtolower($this->randomName());
+    $this->createFileField($field_name, $type_name, array(), array('required' => '1'));
+    $field = field_info_field($field_name);
+    $instance = field_info_instance('node', $field_name, $type_name);
+
+    $small_file = $this->getTestFile('text', 131072); // 128KB.
+    $large_file = $this->getTestFile('text', 1310720); // 1.2MB
+
+    // Test uploading both a large and small file with different increments.
+    $sizes = array(
+      '1M' => 1048576,
+      '1024K' => 1048576,
+      '1048576' => 1048576,
+    );
+
+    foreach ($sizes as $max_filesize => $file_limit) {
+      // Set the max file upload size.
+      $this->updateFileField($field_name, $type_name, array('max_filesize' => $max_filesize));
+      $instance = field_info_instance('node', $field_name, $type_name);
+
+      // Create a new node with the small file, which should pass.
+      $nid = $this->uploadNodeFile($small_file, $field_name, $type_name);
+      $node = node_load($nid, NULL, TRUE);
+      $node_file = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+      $this->assertFileExists($node_file, format_string('File exists after uploading a file (%filesize) under the max limit (%maxsize).', array('%filesize' => format_size($small_file->filesize), '%maxsize' => $max_filesize)));
+      $this->assertFileEntryExists($node_file, format_string('File entry exists after uploading a file (%filesize) under the max limit (%maxsize).', array('%filesize' => format_size($small_file->filesize), '%maxsize' => $max_filesize)));
+
+      // Check that uploading the large file fails (1M limit).
+      $nid = $this->uploadNodeFile($large_file, $field_name, $type_name);
+      $error_message = t('The file is %filesize exceeding the maximum file size of %maxsize.', array('%filesize' => format_size($large_file->filesize), '%maxsize' => format_size($file_limit)));
+      $this->assertRaw($error_message, format_string('Node save failed when file (%filesize) exceeded the max upload size (%maxsize).', array('%filesize' => format_size($large_file->filesize), '%maxsize' => $max_filesize)));
+    }
+
+    // Turn off the max filesize.
+    $this->updateFileField($field_name, $type_name, array('max_filesize' => ''));
+
+    // Upload the big file successfully.
+    $nid = $this->uploadNodeFile($large_file, $field_name, $type_name);
+    $node = node_load($nid, NULL, TRUE);
+    $node_file = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    $this->assertFileExists($node_file, format_string('File exists after uploading a file (%filesize) with no max limit.', array('%filesize' => format_size($large_file->filesize))));
+    $this->assertFileEntryExists($node_file, format_string('File entry exists after uploading a file (%filesize) with no max limit.', array('%filesize' => format_size($large_file->filesize))));
+
+    // Remove our file field.
+    field_delete_field($field_name);
+  }
+
+  /**
+   * Tests file extension checking.
+   */
+  function testFileExtension() {
+    $type_name = 'article';
+    $field_name = strtolower($this->randomName());
+    $this->createFileField($field_name, $type_name);
+    $field = field_info_field($field_name);
+    $instance = field_info_instance('node', $field_name, $type_name);
+
+    $test_file = $this->getTestFile('image');
+    list(, $test_file_extension) = explode('.', $test_file->filename);
+
+    // Disable extension checking.
+    $this->updateFileField($field_name, $type_name, array('file_extensions' => ''));
+
+    // Check that the file can be uploaded with no extension checking.
+    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
+    $node = node_load($nid, NULL, TRUE);
+    $node_file = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    $this->assertFileExists($node_file, 'File exists after uploading a file with no extension checking.');
+    $this->assertFileEntryExists($node_file, 'File entry exists after uploading a file with no extension checking.');
+
+    // Enable extension checking for text files.
+    $this->updateFileField($field_name, $type_name, array('file_extensions' => 'txt'));
+
+    // Check that the file with the wrong extension cannot be uploaded.
+    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
+    $error_message = t('Only files with the following extensions are allowed: %files-allowed.', array('%files-allowed' => 'txt'));
+    $this->assertRaw($error_message, 'Node save failed when file uploaded with the wrong extension.');
+
+    // Enable extension checking for text and image files.
+    $this->updateFileField($field_name, $type_name, array('file_extensions' => "txt $test_file_extension"));
+
+    // Check that the file can be uploaded with extension checking.
+    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
+    $node = node_load($nid, NULL, TRUE);
+    $node_file = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    $this->assertFileExists($node_file, 'File exists after uploading a file with extension checking.');
+    $this->assertFileEntryExists($node_file, 'File entry exists after uploading a file with extension checking.');
+
+    // Remove our file field.
+    field_delete_field($field_name);
+  }
+}
+
+/**
+ * Tests that files are uploaded to proper locations.
+ */
+class FileFieldPathTestCase extends FileFieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File field file path tests',
+      'description' => 'Test that files are uploaded to the proper location with token support.',
+      'group' => 'File',
+    );
+  }
+
+  /**
+   * Tests the normal formatter display on node display.
+   */
+  function testUploadPath() {
+    $field_name = strtolower($this->randomName());
+    $type_name = 'article';
+    $field = $this->createFileField($field_name, $type_name);
+    $test_file = $this->getTestFile('text');
+
+    // Create a new node.
+    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
+
+    // Check that the file was uploaded to the file root.
+    $node = node_load($nid, NULL, TRUE);
+    $node_file = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    $this->assertPathMatch('public://' . $test_file->filename, $node_file->uri, format_string('The file %file was uploaded to the correct path.', array('%file' => $node_file->uri)));
+
+    // Change the path to contain multiple subdirectories.
+    $field = $this->updateFileField($field_name, $type_name, array('file_directory' => 'foo/bar/baz'));
+
+    // Upload a new file into the subdirectories.
+    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
+
+    // Check that the file was uploaded into the subdirectory.
+    $node = node_load($nid, NULL, TRUE);
+    $node_file = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    $this->assertPathMatch('public://foo/bar/baz/' . $test_file->filename, $node_file->uri, format_string('The file %file was uploaded to the correct path.', array('%file' => $node_file->uri)));
+
+    // Check the path when used with tokens.
+    // Change the path to contain multiple token directories.
+    $field = $this->updateFileField($field_name, $type_name, array('file_directory' => '[current-user:uid]/[current-user:name]'));
+
+    // Upload a new file into the token subdirectories.
+    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
+
+    // Check that the file was uploaded into the subdirectory.
+    $node = node_load($nid, NULL, TRUE);
+    $node_file = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    // Do token replacement using the same user which uploaded the file, not
+    // the user running the test case.
+    $data = array('user' => $this->admin_user);
+    $subdirectory = token_replace('[user:uid]/[user:name]', $data);
+    $this->assertPathMatch('public://' . $subdirectory . '/' . $test_file->filename, $node_file->uri, format_string('The file %file was uploaded to the correct path with token replacements.', array('%file' => $node_file->uri)));
+  }
+
+  /**
+   * Asserts that a file is uploaded to the right location.
+   *
+   * @param $expected_path
+   *   The location where the file is expected to be uploaded. Duplicate file
+   *   names to not need to be taken into account.
+   * @param $actual_path
+   *   Where the file was actually uploaded.
+   * @param $message
+   *   The message to display with this assertion.
+   */
+  function assertPathMatch($expected_path, $actual_path, $message) {
+    // Strip off the extension of the expected path to allow for _0, _1, etc.
+    // suffixes when the file hits a duplicate name.
+    $pos = strrpos($expected_path, '.');
+    $base_path = substr($expected_path, 0, $pos);
+    $extension = substr($expected_path, $pos + 1);
+
+    $result = preg_match('/' . preg_quote($base_path, '/') . '(_[0-9]+)?\.' . preg_quote($extension, '/') . '/', $actual_path);
+    $this->assertTrue($result, $message);
+  }
+}
+
+/**
+ * Tests the file token replacement in strings.
+ */
+class FileTokenReplaceTestCase extends FileFieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File token replacement',
+      'description' => 'Generates text using placeholders for dummy content to check file token replacement.',
+      'group' => 'File',
+    );
+  }
+
+  /**
+   * Creates a file, then tests the tokens generated from it.
+   */
+  function testFileTokenReplacement() {
+    global $language;
+    $url_options = array(
+      'absolute' => TRUE,
+      'language' => $language,
+    );
+
+    // Create file field.
+    $type_name = 'article';
+    $field_name = 'field_' . strtolower($this->randomName());
+    $this->createFileField($field_name, $type_name);
+    $field = field_info_field($field_name);
+    $instance = field_info_instance('node', $field_name, $type_name);
+
+    $test_file = $this->getTestFile('text');
+    // Coping a file to test uploads with non-latin filenames.
+    $filename = drupal_dirname($test_file->uri) . '/текстовый файл.txt';
+    $test_file = file_copy($test_file, $filename);
+
+    // Create a new node with the uploaded file.
+    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
+
+    // Load the node and the file.
+    $node = node_load($nid, NULL, TRUE);
+    $file = file_load($node->{$field_name}[LANGUAGE_NONE][0]['fid']);
+
+    // Generate and test sanitized tokens.
+    $tests = array();
+    $tests['[file:fid]'] = $file->fid;
+    $tests['[file:name]'] = check_plain($file->filename);
+    $tests['[file:path]'] = check_plain($file->uri);
+    $tests['[file:mime]'] = check_plain($file->filemime);
+    $tests['[file:size]'] = format_size($file->filesize);
+    $tests['[file:url]'] = check_plain(file_create_url($file->uri));
+    $tests['[file:timestamp]'] = format_date($file->timestamp, 'medium', '', NULL, $language->language);
+    $tests['[file:timestamp:short]'] = format_date($file->timestamp, 'short', '', NULL, $language->language);
+    $tests['[file:owner]'] = check_plain(format_username($this->admin_user));
+    $tests['[file:owner:uid]'] = $file->uid;
+
+    // Test to make sure that we generated something for each token.
+    $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('file' => $file), array('language' => $language));
+      $this->assertEqual($output, $expected, format_string('Sanitized file token %token replaced.', array('%token' => $input)));
+    }
+
+    // Generate and test unsanitized tokens.
+    $tests['[file:name]'] = $file->filename;
+    $tests['[file:path]'] = $file->uri;
+    $tests['[file:mime]'] = $file->filemime;
+    $tests['[file:size]'] = format_size($file->filesize);
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('file' => $file), array('language' => $language, 'sanitize' => FALSE));
+      $this->assertEqual($output, $expected, format_string('Unsanitized file token %token replaced.', array('%token' => $input)));
+    }
+  }
+}
+
+/**
+ * Tests file access on private nodes.
+ */
+class FilePrivateTestCase extends FileFieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Private file test',
+      'description' => 'Uploads a test to a private node and checks access.',
+      'group' => 'File',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('node_access_test', 'field_test'));
+    node_access_rebuild();
+    variable_set('node_access_test_private', TRUE);
+  }
+
+  /**
+   * Tests file access for file uploaded to a private node.
+   */
+  function testPrivateFile() {
+    // Use 'page' instead of 'article', so that the 'article' image field does
+    // not conflict with this test. If in the future the 'page' type gets its
+    // own default file or image field, this test can be made more robust by
+    // using a custom node type.
+    $type_name = 'page';
+    $field_name = strtolower($this->randomName());
+    $this->createFileField($field_name, $type_name, array('uri_scheme' => 'private'));
+
+    // Create a field with no view access - see field_test_field_access().
+    $no_access_field_name = 'field_no_view_access';
+    $this->createFileField($no_access_field_name, $type_name, array('uri_scheme' => 'private'));
+
+    $test_file = $this->getTestFile('text');
+    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name, TRUE, array('private' => TRUE));
+    $node = node_load($nid, NULL, TRUE);
+    $node_file = (object) $node->{$field_name}[LANGUAGE_NONE][0];
+    // Ensure the file can be downloaded.
+    $this->drupalGet(file_create_url($node_file->uri));
+    $this->assertResponse(200, 'Confirmed that the generated URL is correct by downloading the shipped file.');
+    $this->drupalLogOut();
+    $this->drupalGet(file_create_url($node_file->uri));
+    $this->assertResponse(403, 'Confirmed that access is denied for the file without the needed permission.');
+
+    // Test with the field that should deny access through field access.
+    $this->drupalLogin($this->admin_user);
+    $nid = $this->uploadNodeFile($test_file, $no_access_field_name, $type_name, TRUE, array('private' => TRUE));
+    $node = node_load($nid, NULL, TRUE);
+    $node_file = (object) $node->{$no_access_field_name}[LANGUAGE_NONE][0];
+    // Ensure the file cannot be downloaded.
+    $this->drupalGet(file_create_url($node_file->uri));
+    $this->assertResponse(403, 'Confirmed that access is denied for the file without view field access permission.');
+  }
+}
diff --git a/htmltest/modules/file/tests/file_module_test.info b/htmltest/modules/file/tests/file_module_test.info
new file mode 100644
index 00000000..1194c773
--- /dev/null
+++ b/htmltest/modules/file/tests/file_module_test.info
@@ -0,0 +1,12 @@
+name = File test
+description = Provides hooks for testing File module functionality.
+package = Core
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/file/tests/file_module_test.module b/htmltest/modules/file/tests/file_module_test.module
new file mode 100644
index 00000000..f66c749d
--- /dev/null
+++ b/htmltest/modules/file/tests/file_module_test.module
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * @file
+ * Provides File module pages for testing purposes.
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function file_module_test_menu() {
+  $items = array();
+
+  $items['file/test'] = array(
+    'title' => 'Managed file test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('file_module_test_form'),
+    'access arguments' => array('access content'),
+  );
+
+  return $items;
+}
+
+/**
+ * Form constructor for testing a 'managed_file' element.
+ *
+ * @see file_module_test_form_submit()
+ * @ingroup forms
+ */
+function file_module_test_form($form, &$form_state, $tree = TRUE, $extended = FALSE, $default_fid = NULL) {
+  $form['#tree'] = (bool) $tree;
+
+  $form['nested']['file'] = array(
+    '#type' => 'managed_file',
+    '#title' => t('Managed file'),
+    '#upload_location' => 'public://test',
+    '#progress_message' => t('Please wait...'),
+    '#extended' => (bool) $extended,
+    '#size' => 13,
+  );
+  if ($default_fid) {
+    $form['nested']['file']['#default_value'] = $extended ? array('fid' => $default_fid) : $default_fid;
+  }
+
+  $form['textfield'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Type a value and ensure it stays'),
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form submission handler for file_module_test_form().
+ */
+function file_module_test_form_submit($form, &$form_state) {
+  if ($form['#tree']) {
+    $fid = $form['nested']['file']['#extended'] ? $form_state['values']['nested']['file']['fid'] : $form_state['values']['nested']['file'];
+  }
+  else {
+    $fid = $form['nested']['file']['#extended'] ? $form_state['values']['file']['fid'] : $form_state['values']['file'];
+  }
+  drupal_set_message(t('The file id is %fid.', array('%fid' => $fid)));
+}
diff --git a/htmltest/modules/filter/filter.admin.inc b/htmltest/modules/filter/filter.admin.inc
new file mode 100644
index 00000000..60284d99
--- /dev/null
+++ b/htmltest/modules/filter/filter.admin.inc
@@ -0,0 +1,408 @@
+<?php
+
+/**
+ * @file
+ * Administrative page callbacks for the Filter module.
+ */
+
+/**
+ * Page callback: Form constructor for a form to list and reorder text formats.
+ *
+ * @ingroup forms
+ * @see filter_menu()
+ * @see filter_admin_overview_submit()
+ */
+function filter_admin_overview($form) {
+  // Overview of all formats.
+  $formats = filter_formats();
+  $fallback_format = filter_fallback_format();
+
+  $form['#tree'] = TRUE;
+  foreach ($formats as $id => $format) {
+    // Check whether this is the fallback text format. This format is available
+    // to all roles and cannot be disabled via the admin interface.
+    $form['formats'][$id]['#is_fallback'] = ($id == $fallback_format);
+    if ($form['formats'][$id]['#is_fallback']) {
+      $form['formats'][$id]['name'] = array('#markup' => drupal_placeholder($format->name));
+      $roles_markup = drupal_placeholder(t('All roles may use this format'));
+    }
+    else {
+      $form['formats'][$id]['name'] = array('#markup' => check_plain($format->name));
+      $roles = array_map('check_plain', filter_get_roles_by_format($format));
+      $roles_markup = $roles ? implode(', ', $roles) : t('No roles may use this format');
+    }
+    $form['formats'][$id]['roles'] = array('#markup' => $roles_markup);
+    $form['formats'][$id]['configure'] = array('#type' => 'link', '#title' => t('configure'), '#href' => 'admin/config/content/formats/' . $id);
+    $form['formats'][$id]['disable'] = array('#type' => 'link', '#title' => t('disable'), '#href' => 'admin/config/content/formats/' . $id . '/disable', '#access' => !$form['formats'][$id]['#is_fallback']);
+    $form['formats'][$id]['weight'] = array(
+      '#type' => 'weight',
+      '#title' => t('Weight for @title', array('@title' => $format->name)),
+      '#title_display' => 'invisible',
+      '#default_value' => $format->weight,
+    );
+  }
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save changes'));
+  return $form;
+}
+
+/**
+ * Form submission handler for filter_admin_overview().
+ */
+function filter_admin_overview_submit($form, &$form_state) {
+  foreach ($form_state['values']['formats'] as $id => $data) {
+    if (is_array($data) && isset($data['weight'])) {
+      // Only update if this is a form element with weight.
+      db_update('filter_format')
+        ->fields(array('weight' => $data['weight']))
+        ->condition('format', $id)
+        ->execute();
+    }
+  }
+  filter_formats_reset();
+  drupal_set_message(t('The text format ordering has been saved.'));
+}
+
+/**
+ * Returns HTML for the text format administration overview form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_filter_admin_overview($variables) {
+  $form = $variables['form'];
+
+  $rows = array();
+  foreach (element_children($form['formats']) as $id) {
+    $form['formats'][$id]['weight']['#attributes']['class'] = array('text-format-order-weight');
+    $rows[] = array(
+      'data' => array(
+        drupal_render($form['formats'][$id]['name']),
+        drupal_render($form['formats'][$id]['roles']),
+        drupal_render($form['formats'][$id]['weight']),
+        drupal_render($form['formats'][$id]['configure']),
+        drupal_render($form['formats'][$id]['disable']),
+      ),
+      'class' => array('draggable'),
+    );
+  }
+  $header = array(t('Name'), t('Roles'), t('Weight'), array('data' => t('Operations'), 'colspan' => 2));
+  $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'text-format-order')));
+  $output .= drupal_render_children($form);
+
+  drupal_add_tabledrag('text-format-order', 'order', 'sibling', 'text-format-order-weight');
+
+  return $output;
+}
+
+/**
+ * Page callback: Displays the text format add/edit form.
+ *
+ * @param object|null $format
+ *   (optional) An object representing a format, with the following properties:
+ *   - format: A machine-readable name representing the ID of the text format
+ *     to save. If this corresponds to an existing text format, that format
+ *     will be updated; otherwise, a new format will be created.
+ *   - name: The title of the text format.
+ *   - cache: (optional) An integer indicating whether the text format is
+ *     cacheable (1) or not (0). Defaults to 1.
+ *   - status: (optional) An integer indicating whether the text format is
+ *     enabled (1) or not (0). Defaults to 1.
+ *   - weight: (optional) The weight of the text format, which controls its
+ *     placement in text format lists. If omitted, the weight is set to 0.
+ *     Defaults to NULL.
+ *
+ * @return
+ *   A form array.
+ *
+ * @see filter_menu()
+ */
+function filter_admin_format_page($format = NULL) {
+  if (!isset($format->name)) {
+    drupal_set_title(t('Add text format'));
+    $format = (object) array(
+      'format' => NULL,
+      'name' => '',
+    );
+  }
+  return drupal_get_form('filter_admin_format_form', $format);
+}
+
+/**
+ * Form constructor for the text format add/edit form.
+ *
+ * @param $format
+ *   A format object having the properties:
+ *   - format: A machine-readable name representing the ID of the text format to
+ *     save. If this corresponds to an existing text format, that format will be
+ *     updated; otherwise, a new format will be created.
+ *   - name: The title of the text format.
+ *   - cache: An integer indicating whether the text format is cacheable (1) or
+ *     not (0). Defaults to 1.
+ *   - status: (optional) An integer indicating whether the text format is
+ *     enabled (1) or not (0). Defaults to 1.
+ *   - weight: (optional) The weight of the text format, which controls its
+ *     placement in text format lists. If omitted, the weight is set to 0.
+ *
+ * @see filter_admin_format_form_validate()
+ * @see filter_admin_format_form_submit()
+ * @ingroup forms
+ */
+function filter_admin_format_form($form, &$form_state, $format) {
+  $is_fallback = ($format->format == filter_fallback_format());
+
+  $form['#format'] = $format;
+  $form['#tree'] = TRUE;
+  $form['#attached']['js'][] = drupal_get_path('module', 'filter') . '/filter.admin.js';
+  $form['#attached']['css'][] = drupal_get_path('module', 'filter') . '/filter.css';
+
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Name'),
+    '#default_value' => $format->name,
+    '#required' => TRUE,
+  );
+  $form['format'] = array(
+    '#type' => 'machine_name',
+    '#required' => TRUE,
+    '#default_value' => $format->format,
+    '#maxlength' => 255,
+    '#machine_name' => array(
+      'exists' => 'filter_format_exists',
+    ),
+    '#disabled' => !empty($format->format),
+  );
+
+  // Add user role access selection.
+  $form['roles'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Roles'),
+    '#options' => array_map('check_plain', user_roles()),
+    '#disabled' => $is_fallback,
+  );
+  if ($is_fallback) {
+    $form['roles']['#description'] = t('All roles for this text format must be enabled and cannot be changed.');
+  }
+  if (!empty($format->format)) {
+    // If editing an existing text format, pre-select its current permissions.
+    $form['roles']['#default_value'] = array_keys(filter_get_roles_by_format($format));
+  }
+  elseif ($admin_role = variable_get('user_admin_role', 0)) {
+    // If adding a new text format and the site has an administrative role,
+    // pre-select that role so as to grant administrators access to the new
+    // text format permission by default.
+    $form['roles']['#default_value'] = array($admin_role);
+  }
+
+  // Retrieve available filters and load all configured filters for existing
+  // text formats.
+  $filter_info = filter_get_filters();
+  $filters = !empty($format->format) ? filter_list_format($format->format) : array();
+
+  // Prepare filters for form sections.
+  foreach ($filter_info as $name => $filter) {
+    // Create an empty filter object for new/unconfigured filters.
+    if (!isset($filters[$name])) {
+      $filters[$name] = new stdClass();
+      $filters[$name]->format = $format->format;
+      $filters[$name]->module = $filter['module'];
+      $filters[$name]->name = $name;
+      $filters[$name]->status = 0;
+      $filters[$name]->weight = $filter['weight'];
+      $filters[$name]->settings = array();
+    }
+  }
+  $form['#filters'] = $filters;
+
+  // Filter status.
+  $form['filters']['status'] = array(
+    '#type' => 'item',
+    '#title' => t('Enabled filters'),
+    '#prefix' => '<div id="filters-status-wrapper">',
+    '#suffix' => '</div>',
+  );
+  foreach ($filter_info as $name => $filter) {
+    $form['filters']['status'][$name] = array(
+      '#type' => 'checkbox',
+      '#title' => $filter['title'],
+      '#default_value' => $filters[$name]->status,
+      '#parents' => array('filters', $name, 'status'),
+      '#description' => $filter['description'],
+      '#weight' => $filter['weight'],
+    );
+  }
+
+  // Filter order (tabledrag).
+  $form['filters']['order'] = array(
+    '#type' => 'item',
+    '#title' => t('Filter processing order'),
+    '#theme' => 'filter_admin_format_filter_order',
+  );
+  foreach ($filter_info as $name => $filter) {
+    $form['filters']['order'][$name]['filter'] = array(
+      '#markup' => $filter['title'],
+    );
+    $form['filters']['order'][$name]['weight'] = array(
+      '#type' => 'weight',
+      '#title' => t('Weight for @title', array('@title' => $filter['title'])),
+      '#title_display' => 'invisible',
+      '#delta' => 50,
+      '#default_value' => $filters[$name]->weight,
+      '#parents' => array('filters', $name, 'weight'),
+    );
+    $form['filters']['order'][$name]['#weight'] = $filters[$name]->weight;
+  }
+
+  // Filter settings.
+  $form['filter_settings_title'] = array(
+    '#type' => 'item',
+    '#title' => t('Filter settings'),
+  );
+  $form['filter_settings'] = array(
+    '#type' => 'vertical_tabs',
+  );
+
+  foreach ($filter_info as $name => $filter) {
+    if (isset($filter['settings callback']) && function_exists($filter['settings callback'])) {
+      $function = $filter['settings callback'];
+      // Pass along stored filter settings and default settings, but also the
+      // format object and all filters to allow for complex implementations.
+      $defaults = (isset($filter['default settings']) ? $filter['default settings'] : array());
+      $settings_form = $function($form, $form_state, $filters[$name], $format, $defaults, $filters);
+      if (!empty($settings_form)) {
+        $form['filters']['settings'][$name] = array(
+          '#type' => 'fieldset',
+          '#title' => $filter['title'],
+          '#parents' => array('filters', $name, 'settings'),
+          '#weight' => $filter['weight'],
+          '#group' => 'filter_settings',
+        );
+        $form['filters']['settings'][$name] += $settings_form;
+      }
+    }
+  }
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
+
+  return $form;
+}
+
+/**
+ * Returns HTML for a text format's filter order form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_filter_admin_format_filter_order($variables) {
+  $element = $variables['element'];
+
+  // Filter order (tabledrag).
+  $rows = array();
+  foreach (element_children($element, TRUE) as $name) {
+    $element[$name]['weight']['#attributes']['class'][] = 'filter-order-weight';
+    $rows[] = array(
+      'data' => array(
+        drupal_render($element[$name]['filter']),
+        drupal_render($element[$name]['weight']),
+      ),
+      'class' => array('draggable'),
+    );
+  }
+  $output = drupal_render_children($element);
+  $output .= theme('table', array('rows' => $rows, 'attributes' => array('id' => 'filter-order')));
+  drupal_add_tabledrag('filter-order', 'order', 'sibling', 'filter-order-weight', NULL, NULL, TRUE);
+
+  return $output;
+}
+
+/**
+ * Form validation handler for filter_admin_format_form().
+ *
+ * @see filter_admin_format_form_submit()
+ */
+function filter_admin_format_form_validate($form, &$form_state) {
+  $format_format = trim($form_state['values']['format']);
+  $format_name = trim($form_state['values']['name']);
+
+  // Ensure that the values to be saved later are exactly the ones validated.
+  form_set_value($form['format'], $format_format, $form_state);
+  form_set_value($form['name'], $format_name, $form_state);
+
+  $result = db_query("SELECT format FROM {filter_format} WHERE name = :name AND format <> :format", array(':name' => $format_name, ':format' => $format_format))->fetchField();
+  if ($result) {
+    form_set_error('name', t('Text format names must be unique. A format named %name already exists.', array('%name' => $format_name)));
+  }
+}
+
+/**
+ * Form submission handler for filter_admin_format_form().
+ *
+ * @see filter_admin_format_form_validate()
+ */
+function filter_admin_format_form_submit($form, &$form_state) {
+  // Remove unnecessary values.
+  form_state_values_clean($form_state);
+
+  // Add the submitted form values to the text format, and save it.
+  $format = $form['#format'];
+  foreach ($form_state['values'] as $key => $value) {
+    $format->$key = $value;
+  }
+  $status = filter_format_save($format);
+
+  // Save user permissions.
+  if ($permission = filter_permission_name($format)) {
+    foreach ($format->roles as $rid => $enabled) {
+      user_role_change_permissions($rid, array($permission => $enabled));
+    }
+  }
+
+  switch ($status) {
+    case SAVED_NEW:
+      drupal_set_message(t('Added text format %format.', array('%format' => $format->name)));
+      break;
+
+    case SAVED_UPDATED:
+      drupal_set_message(t('The text format %format has been updated.', array('%format' => $format->name)));
+      break;
+  }
+}
+
+/**
+ * Form constructor for the text format deletion confirmation form.
+ *
+ * @param $format
+ *   An object representing a text format.
+ *
+ * @see filter_menu()
+ * @see filter_admin_disable_submit()
+ * @ingroup forms
+ */
+function filter_admin_disable($form, &$form_state, $format) {
+  $form['#format'] = $format;
+
+  return confirm_form($form,
+    t('Are you sure you want to disable the text format %format?', array('%format' => $format->name)),
+    'admin/config/content/formats',
+    t('Disabled text formats are completely removed from the administrative interface, and any content stored with that format will not be displayed. This action cannot be undone.'),
+    t('Disable')
+  );
+}
+
+/**
+ * Form submission handler for filter_admin_disable().
+ */
+function filter_admin_disable_submit($form, &$form_state) {
+  $format = $form['#format'];
+  filter_format_disable($format);
+  drupal_set_message(t('Disabled text format %format.', array('%format' => $format->name)));
+
+  $form_state['redirect'] = 'admin/config/content/formats';
+}
diff --git a/htmltest/modules/filter/filter.admin.js b/htmltest/modules/filter/filter.admin.js
new file mode 100644
index 00000000..3bc62337
--- /dev/null
+++ b/htmltest/modules/filter/filter.admin.js
@@ -0,0 +1,44 @@
+(function ($) {
+
+Drupal.behaviors.filterStatus = {
+  attach: function (context, settings) {
+    $('#filters-status-wrapper input.form-checkbox', context).once('filter-status', function () {
+      var $checkbox = $(this);
+      // Retrieve the tabledrag row belonging to this filter.
+      var $row = $('#' + $checkbox.attr('id').replace(/-status$/, '-weight'), context).closest('tr');
+      // Retrieve the vertical tab belonging to this filter.
+      var tab = $('#' + $checkbox.attr('id').replace(/-status$/, '-settings'), context).data('verticalTab');
+
+      // Bind click handler to this checkbox to conditionally show and hide the
+      // filter's tableDrag row and vertical tab pane.
+      $checkbox.bind('click.filterUpdate', function () {
+        if ($checkbox.is(':checked')) {
+          $row.show();
+          if (tab) {
+            tab.tabShow().updateSummary();
+          }
+        }
+        else {
+          $row.hide();
+          if (tab) {
+            tab.tabHide().updateSummary();
+          }
+        }
+        // Restripe table after toggling visibility of table row.
+        Drupal.tableDrag['filter-order'].restripeTable();
+      });
+
+      // Attach summary for configurable filters (only for screen-readers).
+      if (tab) {
+        tab.fieldset.drupalSetSummary(function (tabContext) {
+          return $checkbox.is(':checked') ? Drupal.t('Enabled') : Drupal.t('Disabled');
+        });
+      }
+
+      // Trigger our bound click handler to update elements to initial state.
+      $checkbox.triggerHandler('click.filterUpdate');
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/filter/filter.api.php b/htmltest/modules/filter/filter.api.php
new file mode 100644
index 00000000..2901eb95
--- /dev/null
+++ b/htmltest/modules/filter/filter.api.php
@@ -0,0 +1,323 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Filter module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Define content filters.
+ *
+ * User submitted content is passed through a group of filters before it is
+ * output in HTML, in order to remove insecure or unwanted parts, correct or
+ * enhance the formatting, transform special keywords, etc. A group of filters
+ * is referred to as a "text format". Administrators can create as many text
+ * formats as needed. Individual filters can be enabled and configured
+ * differently for each text format.
+ *
+ * This hook is invoked by filter_get_filters() and allows modules to register
+ * input filters they provide.
+ *
+ * Filtering is a two-step process. First, the content is 'prepared' by calling
+ * the 'prepare callback' function for every filter. The purpose of the 'prepare
+ * callback' is to escape HTML-like structures. For example, imagine a filter
+ * which allows the user to paste entire chunks of programming code without
+ * requiring manual escaping of special HTML characters like < or &. If the
+ * programming code were left untouched, then other filters could think it was
+ * HTML and change it. For many filters, the prepare step is not necessary.
+ *
+ * The second step is the actual processing step. The result from passing the
+ * text through all the filters' prepare steps gets passed to all the filters
+ * again, this time with the 'process callback' function. The process callbacks
+ * should then actually change the content: transform URLs into hyperlinks,
+ * convert smileys into images, etc.
+ *
+ * For performance reasons content is only filtered once; the result is stored
+ * in the cache table and retrieved from the cache the next time the same piece
+ * of content is displayed. If a filter's output is dynamic, it can override the
+ * cache mechanism, but obviously this should be used with caution: having one
+ * filter that does not support caching in a particular text format disables
+ * caching for the entire format, not just for one filter.
+ *
+ * Beware of the filter cache when developing your module: it is advised to set
+ * your filter to 'cache' => FALSE while developing, but be sure to remove that
+ * setting if it's not needed, when you are no longer in development mode.
+ *
+ * @return
+ *   An associative array of filters, whose keys are internal filter names,
+ *   which should be unique and therefore prefixed with the name of the module.
+ *   Each value is an associative array describing the filter, with the
+ *   following elements (all are optional except as noted):
+ *   - title: (required) An administrative summary of what the filter does.
+ *   - description: Additional administrative information about the filter's
+ *     behavior, if needed for clarification.
+ *   - settings callback: The name of a function that returns configuration form
+ *     elements for the filter. See callback_filter_settings() for details.
+ *   - default settings: An associative array containing default settings for
+ *     the filter, to be applied when the filter has not been configured yet.
+ *   - prepare callback: The name of a function that escapes the content before
+ *     the actual filtering happens. See callback_filter_prepare() for
+ *     details.
+ *   - process callback: (required) The name the function that performs the
+ *     actual filtering. See callback_filter_process() for details.
+ *   - cache (default TRUE): Specifies whether the filtered text can be cached.
+ *     Note that setting this to FALSE makes the entire text format not
+ *     cacheable, which may have an impact on the site's overall performance.
+ *     See filter_format_allowcache() for details.
+ *   - tips callback: The name of a function that returns end-user-facing filter
+ *     usage guidelines for the filter. See callback_filter_tips() for
+ *     details.
+ *   - weight: A default weight for the filter in new text formats.
+ *
+ * @see filter_example.module
+ * @see hook_filter_info_alter()
+ */
+function hook_filter_info() {
+  $filters['filter_html'] = array(
+    'title' => t('Limit allowed HTML tags'),
+    'description' => t('Allows you to restrict the HTML tags the user can use. It will also remove harmful content such as JavaScript events, JavaScript URLs and CSS styles from those tags that are not removed.'),
+    'process callback' => '_filter_html',
+    'settings callback' => '_filter_html_settings',
+    'default settings' => array(
+      'allowed_html' => '<a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>',
+      'filter_html_help' => 1,
+      'filter_html_nofollow' => 0,
+    ),
+    'tips callback' => '_filter_html_tips',
+  );
+  $filters['filter_autop'] = array(
+    'title' => t('Convert line breaks'),
+    'description' => t('Converts line breaks into HTML (i.e. &lt;br&gt; and &lt;p&gt;) tags.'),
+    'process callback' => '_filter_autop',
+    'tips callback' => '_filter_autop_tips',
+  );
+  return $filters;
+}
+
+/**
+ * Perform alterations on filter definitions.
+ *
+ * @param $info
+ *   Array of information on filters exposed by hook_filter_info()
+ *   implementations.
+ */
+function hook_filter_info_alter(&$info) {
+  // Replace the PHP evaluator process callback with an improved
+  // PHP evaluator provided by a module.
+  $info['php_code']['process callback'] = 'my_module_php_evaluator';
+
+  // Alter the default settings of the URL filter provided by core.
+  $info['filter_url']['default settings'] = array(
+    'filter_url_length' => 100,
+  );
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
+
+/**
+ * Provide a settings form for filter settings.
+ *
+ * Callback for hook_filter_info().
+ *
+ * This callback function is used to provide a settings form for filter
+ * settings, for filters that need settings on a per-text-format basis. This
+ * function should return the form elements for the settings; the filter
+ * module will take care of saving the settings in the database.
+ *
+ * If the filter's behavior depends on an extensive list and/or external data
+ * (e.g. a list of smileys, a list of glossary terms), then the filter module
+ * can choose to provide a separate, global configuration page rather than
+ * per-text-format settings. In that case, the settings callback function
+ * should provide a link to the separate settings page.
+ *
+ * @param $form
+ *   The prepopulated form array of the filter administration form.
+ * @param $form_state
+ *   The state of the (entire) configuration form.
+ * @param $filter
+ *   The filter object containing the current settings for the given format,
+ *   in $filter->settings.
+ * @param $format
+ *   The format object being configured.
+ * @param $defaults
+ *   The default settings for the filter, as defined in 'default settings' in
+ *   hook_filter_info(). These should be combined with $filter->settings to
+ *   define the form element defaults.
+ * @param $filters
+ *   The complete list of filter objects that are enabled for the given format.
+ *
+ * @return
+ *   An array of form elements defining settings for the filter. Array keys
+ *   should match the array keys in $filter->settings and $defaults.
+ *
+ * @ingroup callbacks
+ */
+function callback_filter_settings($form, &$form_state, $filter, $format, $defaults, $filters) {
+  $filter->settings += $defaults;
+
+  $elements = array();
+  $elements['nofollow'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Add rel="nofollow" to all links'),
+    '#default_value' => $filter->settings['nofollow'],
+  );
+  return $elements;
+}
+
+/**
+ * Provide prepared text with special characters escaped.
+ *
+ * Callback for hook_filter_info().
+ *
+ * See hook_filter_info() for a description of the filtering process. Filters
+ * should not use the 'prepare callback' step for anything other than escaping,
+ * because that would short-circuit the control the user has over the order in
+ * which filters are applied.
+ *
+ * @param $text
+ *   The text string to be filtered.
+ * @param $filter
+ *   The filter object containing settings for the given format.
+ * @param $format
+ *   The text format object assigned to the text to be filtered.
+ * @param $langcode
+ *   The language code of the text to be filtered.
+ * @param $cache
+ *   A Boolean indicating whether the filtered text is going to be cached in
+ *   {cache_filter}.
+ * @param $cache_id
+ *   The ID of the filtered text in {cache_filter}, if $cache is TRUE.
+ *
+ * @return
+ *   The prepared, escaped text.
+ *
+ * @ingroup callbacks
+ */
+function callback_filter_prepare($text, $filter, $format, $langcode, $cache, $cache_id) {
+  // Escape <code> and </code> tags.
+  $text = preg_replace('|<code>(.+?)</code>|se', "[codefilter_code]$1[/codefilter_code]", $text);
+  return $text;
+}
+
+/**
+ * Provide text filtered to conform to the supplied format.
+ *
+ * Callback for hook_filter_info().
+ *
+ * See hook_filter_info() for a description of the filtering process. This step
+ * is where the filter actually transforms the text.
+ *
+ * @param $text
+ *   The text string to be filtered.
+ * @param $filter
+ *   The filter object containing settings for the given format.
+ * @param $format
+ *   The text format object assigned to the text to be filtered.
+ * @param $langcode
+ *   The language code of the text to be filtered.
+ * @param $cache
+ *   A Boolean indicating whether the filtered text is going to be cached in
+ *   {cache_filter}.
+ * @param $cache_id
+ *   The ID of the filtered text in {cache_filter}, if $cache is TRUE.
+ *
+ * @return
+ *   The filtered text.
+ *
+ * @ingroup callbacks
+ */
+function callback_filter_process($text, $filter, $format, $langcode, $cache, $cache_id) {
+  $text = preg_replace('|\[codefilter_code\](.+?)\[/codefilter_code\]|se', "<pre>$1</pre>", $text);
+
+  return $text;
+}
+
+/**
+ * Return help text for a filter.
+ *
+ * Callback for hook_filter_info().
+ *
+ * A filter's tips should be informative and to the point. Short tips are
+ * preferably one-liners.
+ *
+ * @param $filter
+ *   An object representing the filter.
+ * @param $format
+ *   An object representing the text format the filter is contained in.
+ * @param $long
+ *   Whether this callback should return a short tip to display in a form
+ *   (FALSE), or whether a more elaborate filter tips should be returned for
+ *   theme_filter_tips() (TRUE).
+ *
+ * @return
+ *   Translated text to display as a tip.
+ *
+ * @ingroup callbacks
+ */
+function callback_filter_tips($filter, $format, $long) {
+ if ($long) {
+    return t('Lines and paragraphs are automatically recognized. The &lt;br /&gt; line break, &lt;p&gt; paragraph and &lt;/p&gt; close paragraph tags are inserted automatically. If paragraphs are not recognized simply add a couple blank lines.');
+  }
+  else {
+    return t('Lines and paragraphs break automatically.');
+  }
+}
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Perform actions when a new text format has been created.
+ *
+ * @param $format
+ *   The format object of the format being updated.
+ *
+ * @see hook_filter_format_update()
+ * @see hook_filter_format_disable()
+ */
+function hook_filter_format_insert($format) {
+  mymodule_cache_rebuild();
+}
+
+/**
+ * Perform actions when a text format has been updated.
+ *
+ * This hook allows modules to act when a text format has been updated in any
+ * way. For example, when filters have been reconfigured, disabled, or
+ * re-arranged in the text format.
+ *
+ * @param $format
+ *   The format object of the format being updated.
+ *
+ * @see hook_filter_format_insert()
+ * @see hook_filter_format_disable()
+ */
+function hook_filter_format_update($format) {
+  mymodule_cache_rebuild();
+}
+
+/**
+ * Perform actions when a text format has been disabled.
+ *
+ * @param $format
+ *   The format object of the format being disabled.
+ *
+ * @see hook_filter_format_insert()
+ * @see hook_filter_format_update()
+ */
+function hook_filter_format_disable($format) {
+  mymodule_cache_rebuild();
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/filter/filter.css b/htmltest/modules/filter/filter.css
new file mode 100644
index 00000000..f7317338
--- /dev/null
+++ b/htmltest/modules/filter/filter.css
@@ -0,0 +1,53 @@
+
+.text-format-wrapper .form-item {
+  margin-bottom: 0;
+}
+.filter-wrapper {
+  border-top: 0;
+  margin: 0;
+  padding: 1.5em 0 1.5em;
+}
+.filter-wrapper .form-item {
+  float: left;
+  padding: 0 0 0.5em 1.5em;
+}
+.filter-wrapper .form-item label {
+  display: inline;
+}
+.filter-help {
+  float: right;
+  padding: 0 1.5em 0.5em;
+}
+.filter-help p {
+  margin: 0;
+}
+.filter-help a {
+  background: transparent url(../../misc/help.png) right center no-repeat;
+  padding: 0 20px;
+}
+.filter-guidelines {
+  clear: left;
+  padding: 0 1.5em;
+}
+.text-format-wrapper .description {
+  margin-top: 0.5em;
+}
+
+#filter-order tr .form-item {
+  padding: 0.5em 0 0 3em;
+  white-space: normal;
+}
+#filter-order tr .form-type-checkbox .description {
+  padding: 0 0 0 2.5em;
+}
+input#edit-filters-filter-html-settings-allowed-html {
+  width: 100%;
+}
+
+.tips {
+  margin-top: 0;
+  margin-bottom: 0;
+  padding-top: 0;
+  padding-bottom: 0;
+  font-size: 0.9em;
+}
diff --git a/htmltest/modules/filter/filter.info b/htmltest/modules/filter/filter.info
new file mode 100644
index 00000000..759d9267
--- /dev/null
+++ b/htmltest/modules/filter/filter.info
@@ -0,0 +1,14 @@
+name = Filter
+description = Filters content in preparation for display.
+package = Core
+version = VERSION
+core = 7.x
+files[] = filter.test
+required = TRUE
+configure = admin/config/content/formats
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/filter/filter.install b/htmltest/modules/filter/filter.install
new file mode 100644
index 00000000..71ba97b0
--- /dev/null
+++ b/htmltest/modules/filter/filter.install
@@ -0,0 +1,494 @@
+<?php
+
+/**
+ * @file
+ * Install, update, and uninstall functions for the Filter module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function filter_schema() {
+  $schema['filter'] = array(
+    'description' => 'Table that maps filters (HTML corrector) to text formats (Filtered HTML).',
+    'fields' => array(
+      'format' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'description' => 'Foreign key: The {filter_format}.format to which this filter is assigned.',
+      ),
+      'module' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The origin module of the filter.',
+      ),
+      'name' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Name of the filter being referenced.',
+      ),
+      'weight' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Weight of filter within format.',
+      ),
+      'status' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Filter enabled status. (1 = enabled, 0 = disabled)',
+      ),
+      'settings' => array(
+        'type' => 'blob',
+        'not null' => FALSE,
+        'size' => 'big',
+        'serialize' => TRUE,
+        'description' => 'A serialized array of name value pairs that store the filter settings for the specific format.',
+      ),
+    ),
+    'primary key' => array('format', 'name'),
+    'indexes' => array(
+      'list' => array('weight', 'module', 'name'),
+    ),
+  );
+  $schema['filter_format'] = array(
+    'description' => 'Stores text formats: custom groupings of filters, such as Filtered HTML.',
+    'fields' => array(
+      'format' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique machine name of the format.',
+      ),
+      'name' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Name of the text format (Filtered HTML).',
+        'translatable' => TRUE,
+      ),
+      'cache' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'Flag to indicate whether format is cacheable. (1 = cacheable, 0 = not cacheable)',
+      ),
+      'status' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 1,
+        'size' => 'tiny',
+        'description' => 'The status of the text format. (1 = enabled, 0 = disabled)',
+      ),
+      'weight' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Weight of text format to use when listing.',
+      ),
+    ),
+    'primary key' => array('format'),
+    'unique keys' => array(
+      'name' => array('name'),
+    ),
+    'indexes' => array(
+      'status_weight' => array('status', 'weight'),
+    ),
+  );
+
+  $schema['cache_filter'] = drupal_get_schema_unprocessed('system', 'cache');
+  $schema['cache_filter']['description'] = 'Cache table for the Filter module to store already filtered pieces of text, identified by text format and hash of the text.';
+
+  return $schema;
+}
+
+/**
+ * Implements hook_install().
+ */
+function filter_install() {
+  // All sites require at least one text format (the fallback format) that all
+  // users have access to, so add it here. We initialize it as a simple, safe
+  // plain text format with very basic formatting, but it can be modified by
+  // installation profiles to have other properties.
+  $plain_text_format = array(
+    'format' => 'plain_text',
+    'name' => 'Plain text',
+    'weight' => 10,
+    'filters' => array(
+      // Escape all HTML.
+      'filter_html_escape' => array(
+        'weight' => 0,
+        'status' => 1,
+      ),
+      // URL filter.
+      'filter_url' => array(
+        'weight' => 1,
+        'status' => 1,
+      ),
+      // Line break filter.
+      'filter_autop' => array(
+        'weight' => 2,
+        'status' => 1,
+      ),
+    ),
+  );
+  $plain_text_format = (object) $plain_text_format;
+  filter_format_save($plain_text_format);
+
+  // Set the fallback format to plain text.
+  variable_set('filter_fallback_format', $plain_text_format->format);
+}
+
+/**
+ * Implements hook_update_dependencies().
+ */
+function filter_update_dependencies() {
+  // filter_update_7005() migrates role permissions and therefore must run
+  // after the {role} and {role_permission} tables are properly set up, which
+  // happens in user_update_7007().
+  $dependencies['filter'][7005] = array(
+    'user' => 7007,
+  );
+
+  return $dependencies;
+}
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Upgrade the {filter_formats} table and rename it to {filter_format}.
+ */
+function filter_update_7000() {
+  db_rename_table('filter_formats', 'filter_format');
+
+  // Add the new {filter_format}.status and {filter_format}.weight column.
+  db_add_field('filter_format', 'status', array(
+    'type' => 'int',
+    'unsigned' => TRUE,
+    'not null' => TRUE,
+    'default' => 1,
+    'size' => 'tiny',
+    'description' => 'The status of the text format. (1 = enabled, 0 = disabled)',
+  ));
+  db_add_field('filter_format', 'weight', array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'description' => 'Weight of text format to use when listing.',
+  ), array(
+    'indexes' => array(
+      'status_weight' => array('status', 'weight'),
+    ),
+  ));
+}
+
+/**
+ * Break out "escape HTML filter" option to its own filter.
+ */
+function filter_update_7001() {
+  $result = db_query("SELECT format FROM {filter_format}")->fetchCol();
+  $insert = db_insert('filters')->fields(array('format', 'module', 'delta', 'weight'));
+
+  foreach ($result as $format_id) {
+    // Deprecated constants FILTER_HTML_STRIP = 1 and FILTER_HTML_ESCAPE = 2.
+    if (variable_get('filter_html_' . $format_id, 1) == 2) {
+      $insert->values(array(
+        'format' => $format_id,
+        'module' => 'filter',
+        'delta' => 4,
+        'weight' => 0,
+      ));
+    }
+    variable_del('filter_html_' . $format_id);
+  }
+
+  $insert->execute();
+}
+
+/**
+ * Upgrade the {filter} table for core filters.
+ */
+function filter_update_7003() {
+  // Duplicates the {filters} table since core cannot take care of the potential
+  // contributed module filters.
+  db_rename_table('filters', 'd6_upgrade_filter');
+  // Creates the Drupal 7 filter table.
+  $filter_table =  array(
+    'description' => 'Table that maps filters (HTML corrector) to text formats (Filtered HTML).',
+    'fields' => array(
+      'format' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Foreign key: The {filter_format}.format to which this filter is assigned.',
+      ),
+      'module' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The origin module of the filter.',
+      ),
+      'name' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Name of the filter being referenced.',
+      ),
+      'weight' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Weight of filter within format.',
+      ),
+      'status' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Filter enabled status. (1 = enabled, 0 = disabled)',
+      ),
+      'settings' => array(
+        'type' => 'blob',
+        'not null' => FALSE,
+        'size' => 'big',
+        'serialize' => TRUE,
+        'description' => 'A serialized array of name value pairs that store the filter settings for the specific format.',
+      ),
+    ),
+    'primary key' => array('format', 'name'),
+    'indexes' => array(
+      'list' => array('weight', 'module', 'name'),
+    ),
+  );
+  db_create_table('filter', $filter_table);
+
+  // Get an array of the renamed filter deltas, organized by module.
+  $renamed_deltas = array(
+    'filter' => array(
+      '0' => 'filter_html',
+      '1' => 'filter_autop',
+      '2' => 'filter_url',
+      '3' => 'filter_htmlcorrector',
+      '4' => 'filter_html_escape',
+    ),
+    'php' => array(
+      '0' => 'php_code',
+    ),
+  );
+
+  // Loop through each filter and make changes to the core filter table by
+  // each record from the old to the new table.
+  foreach ($renamed_deltas as $module => $deltas) {
+    foreach ($deltas as $old_delta => $new_name) {
+      $query = db_select('d6_upgrade_filter')
+        ->fields('d6_upgrade_filter', array('format', 'weight'))
+        ->condition('module', $module)
+        ->condition('delta', $old_delta)
+        ->distinct();
+
+      foreach ($query->execute() as $record) {
+        // Port the filter settings.
+        $settings = array();
+        if ($new_name == 'filter_html') {
+          if ($setting = variable_get("allowed_html_{$record->format}", NULL)) {
+            $settings['allowed_html'] = $setting;
+            variable_del("allowed_html_{$record->format}");
+          }
+          if ($setting = variable_get("filter_html_help_{$record->format}", NULL)) {
+            $settings['filter_html_help'] = $setting;
+            variable_del("filter_html_help_{$record->format}");
+          }
+          if ($setting = variable_get("filter_html_nofollow_{$record->format}", NULL)) {
+            $settings['filter_html_nofollow'] = $setting;
+            variable_del("filter_html_nofollow_{$record->format}");
+          }
+        }
+        elseif ($new_name == 'filter_url') {
+          if ($setting = variable_get("filter_url_length_{$record->format}", NULL)) {
+            $settings['filter_url_length'] = $setting;
+            variable_del("filter_url_length_{$record->format}");
+          }
+        }
+
+        db_insert('filter')
+          ->fields(array(
+            'format' => $record->format,
+            'module' => $module,
+            'name' => $new_name,
+            'weight' => $record->weight,
+            'settings' => serialize($settings),
+            'status' => 1,
+          ))
+          ->execute();
+      }
+      db_delete('d6_upgrade_filter')
+        ->condition('module', $module)
+        ->condition('delta', $old_delta)
+        ->execute();
+    }
+  }
+}
+
+/**
+ * Integrate text formats with the user permissions system.
+ *
+ * This function converts text format role assignments to use the new text
+ * format permissions introduced in Drupal 7, creates a fallback (plain text)
+ * format that is available to all users, and explicitly sets the text format
+ * in cases that used to rely on a single site-wide default.
+ */
+function filter_update_7005() {
+  // Move role data from the filter system to the user permission system.
+  $all_roles = array_keys(user_roles());
+  $default_format = variable_get('filter_default_format', 1);
+  $result = db_query("SELECT * FROM {filter_format}");
+  foreach ($result as $format) {
+    // We need to assign the default format to all roles (regardless of what
+    // was stored in the database) to preserve the behavior of the site at the
+    // moment of the upgrade.
+    $format_roles = ($format->format == $default_format ? $all_roles : explode(',', $format->roles));
+    foreach ($format_roles as $format_role) {
+      if (in_array($format_role, $all_roles)) {
+        _update_7000_user_role_grant_permissions($format_role, array('use text format ' . $format->format), 'filter');
+      }
+    }
+  }
+
+  // Drop the roles field from the {filter_format} table.
+  db_drop_field('filter_format', 'roles');
+
+  // Add a fallback text format which outputs plain text and appears last on
+  // the list for all users. Generate a unique name for it, starting with
+  // "Plain text".
+  $start_name = 'Plain text';
+  $format_name = $start_name;
+  while ($format = db_query('SELECT format FROM {filter_format} WHERE name = :name', array(':name' => $format_name))->fetchField()) {
+    $id = empty($id) ? 2 : $id + 1;
+    $format_name = $start_name . ' ' . $id;
+  }
+
+  // Insert the filter format.
+  $format_id = db_insert('filter_format')
+    ->fields(array(
+      'name' => $format_name,
+      'cache' => 1,
+      'weight' => 1,
+      'status' => 1,
+    ))
+    ->execute();
+
+  // This format should output plain text, so we escape all HTML and apply the
+  // line break and URL filters only.
+  db_insert('filter')
+    ->fields(array(
+      'format',
+      'name',
+      'weight',
+      'status',
+      'module',
+      'settings',
+    ))
+    ->values(array(
+      'format' => $format_id,
+      'name' => 'filter_html_escape',
+      'weight' => 0,
+      'status' => 1,
+      'module' => 'filter',
+      'settings' => serialize(array()),
+    ))
+    ->values(array(
+      'format' => $format_id,
+      'name' => 'filter_url',
+      'weight' => 1,
+      'status' => 1,
+      'module' => 'filter',
+      'settings' => serialize(array()),
+    ))
+    ->values(array(
+      'format' => $format_id,
+      'name' => 'filter_autop',
+      'weight' => 2,
+      'status' => 1,
+      'module' => 'filter',
+      'settings' => serialize(array()),
+    ))
+    ->execute();
+
+  variable_set('filter_fallback_format', $format_id);
+  drupal_set_message('A new <em>Plain text</em> format has been created which will be available to all users. You can configure this text format on the <a href="' . url('admin/config/content/formats/' . $format) . '">text format configuration page</a>.');
+
+  // Move the former site-wide default text format to the top of the list, so
+  // that it continues to be the default text format for all users.
+  db_update('filter_format')
+    ->fields(array('weight' => -1))
+    ->condition('format', $default_format)
+    ->execute();
+
+  // We do not delete the 'filter_default_format' variable, since other modules
+  // need it in their update functions; for an example, see user_update_7010().
+  // @todo This variable can be deleted in Drupal 8.
+}
+
+/**
+ * Grant usage of all text formats to user roles having the 'administer filters' permission.
+ */
+function filter_update_7008() {
+  // Build the list of permissions to grant.
+  $permissions = array();
+  foreach (db_query('SELECT format FROM {filter_format}')->fetchCol() as $format_id) {
+    if ($format_id != variable_get('filter_fallback_format')) {
+      $permissions[] = 'use text format ' . $format_id;
+    }
+  }
+  // Grant text format permissions to all roles that can 'administer filters'.
+  // Albeit anonymous users *should not* have the permission, we cannot presume
+  // that they do not or must not.
+  if ($roles = user_roles(FALSE, 'administer filters')) {
+    foreach ($roles as $rid => $name) {
+      _update_7000_user_role_grant_permissions($rid, $permissions, 'filter');
+    }
+  }
+}
+
+/**
+ * Converts fields that store serialized variables from text to blob.
+ */
+function filter_update_7009() {
+  $schema = system_schema_cache_7054();
+  db_drop_table('cache_filter');
+  db_create_table('cache_filter', $schema);
+}
+
+/**
+ * Change {filter_format}.format and {filter}.format into varchar.
+ */
+function filter_update_7010() {
+  db_change_field('filter_format', 'format', 'format', array(
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => TRUE,
+    'description' => 'Primary Key: Unique machine name of the format.',
+  ));
+  db_change_field('filter', 'format', 'format', array(
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => TRUE,
+    'description' => 'Foreign key: The {filter_format}.format to which this filter is assigned.',
+  ));
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x".
+ */
diff --git a/htmltest/modules/filter/filter.js b/htmltest/modules/filter/filter.js
new file mode 100644
index 00000000..c286159f
--- /dev/null
+++ b/htmltest/modules/filter/filter.js
@@ -0,0 +1,20 @@
+(function ($) {
+
+/**
+ * Automatically display the guidelines of the selected text format.
+ */
+Drupal.behaviors.filterGuidelines = {
+  attach: function (context) {
+    $('.filter-guidelines', context).once('filter-guidelines')
+      .find(':header').hide()
+      .closest('.filter-wrapper').find('select.filter-list')
+      .bind('change', function () {
+        $(this).closest('.filter-wrapper')
+          .find('.filter-guidelines-item').hide()
+          .siblings('.filter-guidelines-' + this.value).show();
+      })
+      .change();
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/filter/filter.module b/htmltest/modules/filter/filter.module
new file mode 100644
index 00000000..2afe901e
--- /dev/null
+++ b/htmltest/modules/filter/filter.module
@@ -0,0 +1,1786 @@
+<?php
+
+/**
+ * @file
+ * Framework for handling the filtering of content.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function filter_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#filter':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Filter module allows administrators to configure text formats. A text format defines the HTML tags, codes, and other input allowed in content and comments, and is a key feature in guarding against potentially damaging input from malicious users. For more information, see the online handbook entry for <a href="@filter">Filter module</a>.', array('@filter' => 'http://drupal.org/documentation/modules/filter/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Configuring text formats') . '</dt>';
+      $output .= '<dd>' . t('Configure text formats on the <a href="@formats">Text formats page</a>. <strong>Improper text format configuration is a security risk</strong>. To ensure security, untrusted users should only have access to text formats that restrict them to either plain text or a safe set of HTML tags, since certain HTML tags can allow embedding malicious links or scripts in text. More trusted registered users may be granted permission to use less restrictive text formats in order to create rich content.', array('@formats' => url('admin/config/content/formats'))) . '</dd>';
+      $output .= '<dt>' . t('Applying filters to text') . '</dt>';
+      $output .= '<dd>' . t('Each text format uses filters to manipulate text, and most formats apply several different filters to text in a specific order. Each filter is designed for a specific purpose, and generally either adds, removes, or transforms elements within user-entered text before it is displayed. A filter does not change the actual content, but instead, modifies it temporarily before it is displayed. One filter may remove unapproved HTML tags, while another automatically adds HTML to make URLs display as clickable links.') . '</dd>';
+      $output .= '<dt>' . t('Defining text formats') . '</dt>';
+      $output .= '<dd>' . t('One format is included by default: <em>Plain text</em> (which removes all HTML tags). Additional formats may be created by your installation profile when you install Drupal, and more can be created by an administrator on the <a href="@text-formats">Text formats page</a>.', array('@text-formats' => url('admin/config/content/formats'))) . '</dd>';
+      $output .= '<dt>' . t('Choosing a text format') . '</dt>';
+      $output .= '<dd>' . t('Users with access to more than one text format can use the <em>Text format</em> fieldset to choose between available text formats when creating or editing multi-line content. Administrators can define the text formats available to each user role, and control the order of formats listed in the <em>Text format</em> fieldset on the <a href="@text-formats">Text formats page</a>.', array('@text-formats' => url('admin/config/content/formats'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+
+    case 'admin/config/content/formats':
+      $output = '<p>' . t('Text formats define the HTML tags, code, and other formatting that can be used when entering text. <strong>Improper text format configuration is a security risk</strong>. Learn more on the <a href="@filterhelp">Filter module help page</a>.', array('@filterhelp' => url('admin/help/filter'))) . '</p>';
+      $output .= '<p>' . t('Text formats are presented on content editing pages in the order defined on this page. The first format available to a user will be selected by default.') . '</p>';
+      return $output;
+
+    case 'admin/config/content/formats/%':
+      $output = '<p>' . t('A text format contains filters that change the user input, for example stripping out malicious HTML or making URLs clickable. Filters are executed from top to bottom and the order is important, since one filter may prevent another filter from doing its job. For example, when URLs are converted into links before disallowed HTML tags are removed, all links may be removed. When this happens, the order of filters may need to be re-arranged.') . '</p>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function filter_theme() {
+  return array(
+    'filter_admin_overview' => array(
+      'render element' => 'form',
+      'file' => 'filter.admin.inc',
+    ),
+    'filter_admin_format_filter_order' => array(
+      'render element' => 'element',
+      'file' => 'filter.admin.inc',
+    ),
+    'filter_tips' => array(
+      'variables' => array('tips' => NULL, 'long' => FALSE),
+      'file' => 'filter.pages.inc',
+    ),
+    'text_format_wrapper' => array(
+      'render element' => 'element',
+    ),
+    'filter_tips_more_info' => array(
+      'variables' => array(),
+    ),
+    'filter_guidelines' => array(
+      'variables' => array('format' => NULL),
+    ),
+  );
+}
+
+/**
+ * Implements hook_element_info().
+ *
+ * @see filter_process_format()
+ * @see text_format_wrapper()
+ */
+function filter_element_info() {
+  $type['text_format'] = array(
+    '#process' => array('filter_process_format'),
+    '#base_type' => 'textarea',
+    '#theme_wrappers' => array('text_format_wrapper'),
+  );
+  return $type;
+}
+
+/**
+ * Implements hook_menu().
+ */
+function filter_menu() {
+  $items['filter/tips'] = array(
+    'title' => 'Compose tips',
+    'page callback' => 'filter_tips_long',
+    'access callback' => TRUE,
+    'type' => MENU_SUGGESTED_ITEM,
+    'file' => 'filter.pages.inc',
+  );
+  $items['admin/config/content/formats'] = array(
+    'title' => 'Text formats',
+    'description' => 'Configure how content input by users is filtered, including allowed HTML tags. Also allows enabling of module-provided filters.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('filter_admin_overview'),
+    'access arguments' => array('administer filters'),
+    'file' => 'filter.admin.inc',
+  );
+  $items['admin/config/content/formats/list'] = array(
+    'title' => 'List',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $items['admin/config/content/formats/add'] = array(
+    'title' => 'Add text format',
+    'page callback' => 'filter_admin_format_page',
+    'access arguments' => array('administer filters'),
+    'type' => MENU_LOCAL_ACTION,
+    'weight' => 1,
+    'file' => 'filter.admin.inc',
+  );
+  $items['admin/config/content/formats/%filter_format'] = array(
+    'title callback' => 'filter_admin_format_title',
+    'title arguments' => array(4),
+    'page callback' => 'filter_admin_format_page',
+    'page arguments' => array(4),
+    'access arguments' => array('administer filters'),
+    'file' => 'filter.admin.inc',
+  );
+  $items['admin/config/content/formats/%filter_format/disable'] = array(
+    'title' => 'Disable text format',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('filter_admin_disable', 4),
+    'access callback' => '_filter_disable_format_access',
+    'access arguments' => array(4),
+    'file' => 'filter.admin.inc',
+  );
+  return $items;
+}
+
+/**
+ * Access callback: Checks access for disabling text formats.
+ *
+ * @param $format
+ *   A text format object.
+ *
+ * @return
+ *   TRUE if the text format can be disabled by the current user, FALSE
+ *   otherwise.
+ *
+ * @see filter_menu()
+ */
+function _filter_disable_format_access($format) {
+  // The fallback format can never be disabled.
+  return user_access('administer filters') && ($format->format != filter_fallback_format());
+}
+
+/**
+ * Loads a text format object from the database.
+ *
+ * @param $format_id
+ *   The format ID.
+ *
+ * @return
+ *   A fully-populated text format object, if the requested format exists and
+ *   is enabled. If the format does not exist, or exists in the database but
+ *   has been marked as disabled, FALSE is returned.
+ *
+ * @see filter_format_exists()
+ */
+function filter_format_load($format_id) {
+  $formats = filter_formats();
+  return isset($formats[$format_id]) ? $formats[$format_id] : FALSE;
+}
+
+/**
+ * Saves a text format object to the database.
+ *
+ * @param $format
+ *   A format object having the properties:
+ *   - format: A machine-readable name representing the ID of the text format
+ *     to save. If this corresponds to an existing text format, that format
+ *     will be updated; otherwise, a new format will be created.
+ *   - name: The title of the text format.
+ *   - status: (optional) An integer indicating whether the text format is
+ *     enabled (1) or not (0). Defaults to 1.
+ *   - weight: (optional) The weight of the text format, which controls its
+ *     placement in text format lists. If omitted, the weight is set to 0.
+ *   - filters: (optional) An associative, multi-dimensional array of filters
+ *     assigned to the text format, keyed by the name of each filter and using
+ *     the properties:
+ *     - weight: (optional) The weight of the filter in the text format. If
+ *       omitted, either the currently stored weight is retained (if there is
+ *       one), or the filter is assigned a weight of 10, which will usually
+ *       put it at the bottom of the list.
+ *     - status: (optional) A boolean indicating whether the filter is
+ *       enabled in the text format. If omitted, the filter will be disabled.
+ *     - settings: (optional) An array of configured settings for the filter.
+ *       See hook_filter_info() for details.
+ *
+ * @return
+ *   SAVED_NEW or SAVED_UPDATED.
+ */
+function filter_format_save($format) {
+  $format->name = trim($format->name);
+  $format->cache = _filter_format_is_cacheable($format);
+  if (!isset($format->status)) {
+    $format->status = 1;
+  }
+  if (!isset($format->weight)) {
+    $format->weight = 0;
+  }
+
+  // Insert or update the text format.
+  $return = db_merge('filter_format')
+    ->key(array('format' => $format->format))
+    ->fields(array(
+      'name' => $format->name,
+      'cache' => (int) $format->cache,
+      'status' => (int) $format->status,
+      'weight' => (int) $format->weight,
+    ))
+    ->execute();
+
+  // Programmatic saves may not contain any filters.
+  if (!isset($format->filters)) {
+    $format->filters = array();
+  }
+  $filter_info = filter_get_filters();
+  foreach ($filter_info as $name => $filter) {
+    // If the format does not specify an explicit weight for a filter, assign
+    // a default weight, either defined in hook_filter_info(), or the default of
+    // 0 by filter_get_filters()
+    if (!isset($format->filters[$name]['weight'])) {
+      $format->filters[$name]['weight'] = $filter['weight'];
+    }
+    $format->filters[$name]['status'] = isset($format->filters[$name]['status']) ? $format->filters[$name]['status'] : 0;
+    $format->filters[$name]['module'] = $filter['module'];
+
+    // If settings were passed, only ensure default settings.
+    if (isset($format->filters[$name]['settings'])) {
+      if (isset($filter['default settings'])) {
+        $format->filters[$name]['settings'] = array_merge($filter['default settings'], $format->filters[$name]['settings']);
+      }
+    }
+    // Otherwise, use default settings or fall back to an empty array.
+    else {
+      $format->filters[$name]['settings'] = isset($filter['default settings']) ? $filter['default settings'] : array();
+    }
+
+    $fields = array();
+    $fields['weight'] = $format->filters[$name]['weight'];
+    $fields['status'] = $format->filters[$name]['status'];
+    $fields['module'] = $format->filters[$name]['module'];
+    $fields['settings'] = serialize($format->filters[$name]['settings']);
+
+    db_merge('filter')
+      ->key(array(
+        'format' => $format->format,
+        'name' => $name,
+      ))
+      ->fields($fields)
+      ->execute();
+  }
+
+  if ($return == SAVED_NEW) {
+    module_invoke_all('filter_format_insert', $format);
+  }
+  else {
+    module_invoke_all('filter_format_update', $format);
+    // Explicitly indicate that the format was updated. We need to do this
+    // since if the filters were updated but the format object itself was not,
+    // the merge query above would not return an indication that anything had
+    // changed.
+    $return = SAVED_UPDATED;
+
+    // Clear the filter cache whenever a text format is updated.
+    cache_clear_all($format->format . ':', 'cache_filter', TRUE);
+  }
+
+  filter_formats_reset();
+
+  return $return;
+}
+
+/**
+ * Disables a text format.
+ *
+ * There is no core facility to re-enable a disabled format. It is not deleted
+ * to keep information for contrib and to make sure the format ID is never
+ * reused. As there might be content using the disabled format, this would lead
+ * to data corruption.
+ *
+ * @param $format
+ *   The text format object to be disabled.
+ */
+function filter_format_disable($format) {
+  db_update('filter_format')
+    ->fields(array('status' => 0))
+    ->condition('format', $format->format)
+    ->execute();
+
+  // Allow modules to react on text format deletion.
+  module_invoke_all('filter_format_disable', $format);
+
+  // Clear the filter cache whenever a text format is disabled.
+  filter_formats_reset();
+  cache_clear_all($format->format . ':', 'cache_filter', TRUE);
+}
+
+/**
+ * Determines if a text format exists.
+ *
+ * @param $format_id
+ *   The ID of the text format to check.
+ *
+ * @return
+ *   TRUE if the text format exists, FALSE otherwise. Note that for disabled
+ *   formats filter_format_exists() will return TRUE while filter_format_load()
+ *   will return FALSE.
+ *
+ * @see filter_format_load()
+ */
+function filter_format_exists($format_id) {
+  return (bool) db_query_range('SELECT 1 FROM {filter_format} WHERE format = :format', 0, 1, array(':format' => $format_id))->fetchField();
+}
+
+/**
+ * Displays a text format form title.
+ *
+ * @param object $format
+ *   A format object.
+ *
+ * @return string
+ *   The name of the format.
+ *
+ * @see filter_menu()
+ */
+function filter_admin_format_title($format) {
+  return $format->name;
+}
+
+/**
+ * Implements hook_permission().
+ */
+function filter_permission() {
+  $perms['administer filters'] = array(
+    'title' => t('Administer text formats and filters'),
+    'restrict access' => TRUE,
+  );
+
+  // Generate permissions for each text format. Warn the administrator that any
+  // of them are potentially unsafe.
+  foreach (filter_formats() as $format) {
+    $permission = filter_permission_name($format);
+    if (!empty($permission)) {
+      // Only link to the text format configuration page if the user who is
+      // viewing this will have access to that page.
+      $format_name_replacement = user_access('administer filters') ? l($format->name, 'admin/config/content/formats/' . $format->format) : drupal_placeholder($format->name);
+      $perms[$permission] = array(
+        'title' => t("Use the !text_format text format", array('!text_format' => $format_name_replacement,)),
+        'description' => drupal_placeholder(t('Warning: This permission may have security implications depending on how the text format is configured.')),
+      );
+    }
+  }
+  return $perms;
+}
+
+/**
+ * Returns the machine-readable permission name for a provided text format.
+ *
+ * @param $format
+ *   An object representing a text format.
+ *
+ * @return
+ *   The machine-readable permission name, or FALSE if the provided text format
+ *   is malformed or is the fallback format (which is available to all users).
+ */
+function filter_permission_name($format) {
+  if (isset($format->format) && $format->format != filter_fallback_format()) {
+    return 'use text format ' . $format->format;
+  }
+  return FALSE;
+}
+
+/**
+ * Implements hook_modules_enabled().
+ */
+function filter_modules_enabled($modules) {
+  // Reset the static cache of module-provided filters, in case any of the
+  // newly enabled modules defines a new filter or alters existing ones.
+  drupal_static_reset('filter_get_filters');
+}
+
+/**
+ * Implements hook_modules_disabled().
+ */
+function filter_modules_disabled($modules) {
+  // Reset the static cache of module-provided filters, in case any of the
+  // newly disabled modules defined or altered any filters.
+  drupal_static_reset('filter_get_filters');
+}
+
+/**
+ * Retrieves a list of text formats, ordered by weight.
+ *
+ * @param $account
+ *   (optional) If provided, only those formats that are allowed for this user
+ *   account will be returned. All formats will be returned otherwise. Defaults
+ *   to NULL.
+ *
+ * @return
+ *   An array of text format objects, keyed by the format ID and ordered by
+ *   weight.
+ *
+ * @see filter_formats_reset()
+ */
+function filter_formats($account = NULL) {
+  global $language;
+  $formats = &drupal_static(__FUNCTION__, array());
+
+  // All available formats are cached for performance.
+  if (!isset($formats['all'])) {
+    if ($cache = cache_get("filter_formats:{$language->language}")) {
+      $formats['all'] = $cache->data;
+    }
+    else {
+      $formats['all'] = db_select('filter_format', 'ff')
+        ->addTag('translatable')
+        ->fields('ff')
+        ->condition('status', 1)
+        ->orderBy('weight')
+        ->execute()
+        ->fetchAllAssoc('format');
+
+      cache_set("filter_formats:{$language->language}", $formats['all']);
+    }
+  }
+
+  // Build a list of user-specific formats.
+  if (isset($account) && !isset($formats['user'][$account->uid])) {
+    $formats['user'][$account->uid] = array();
+    foreach ($formats['all'] as $format) {
+      if (filter_access($format, $account)) {
+        $formats['user'][$account->uid][$format->format] = $format;
+      }
+    }
+  }
+
+  return isset($account) ? $formats['user'][$account->uid] : $formats['all'];
+}
+
+/**
+ * Resets the text format caches.
+ *
+ * @see filter_formats()
+ */
+function filter_formats_reset() {
+  cache_clear_all('filter_formats', 'cache', TRUE);
+  cache_clear_all('filter_list_format', 'cache', TRUE);
+  drupal_static_reset('filter_list_format');
+  drupal_static_reset('filter_formats');
+}
+
+/**
+ * Retrieves a list of roles that are allowed to use a given text format.
+ *
+ * @param $format
+ *   An object representing the text format.
+ *
+ * @return
+ *   An array of role names, keyed by role ID.
+ */
+function filter_get_roles_by_format($format) {
+  // Handle the fallback format upfront (all roles have access to this format).
+  if ($format->format == filter_fallback_format()) {
+    return user_roles();
+  }
+  // Do not list any roles if the permission does not exist.
+  $permission = filter_permission_name($format);
+  return !empty($permission) ? user_roles(FALSE, $permission) : array();
+}
+
+/**
+ * Retrieves a list of text formats that are allowed for a given role.
+ *
+ * @param $rid
+ *   The user role ID to retrieve text formats for.
+ *
+ * @return
+ *   An array of text format objects that are allowed for the role, keyed by
+ *   the text format ID and ordered by weight.
+ */
+function filter_get_formats_by_role($rid) {
+  $formats = array();
+  foreach (filter_formats() as $format) {
+    $roles = filter_get_roles_by_format($format);
+    if (isset($roles[$rid])) {
+      $formats[$format->format] = $format;
+    }
+  }
+  return $formats;
+}
+
+/**
+ * Returns the ID of the default text format for a particular user.
+ *
+ * The default text format is the first available format that the user is
+ * allowed to access, when the formats are ordered by weight. It should
+ * generally be used as a default choice when presenting the user with a list
+ * of possible text formats (for example, in a node creation form).
+ *
+ * Conversely, when existing content that does not have an assigned text format
+ * needs to be filtered for display, the default text format is the wrong
+ * choice, because it is not guaranteed to be consistent from user to user, and
+ * some trusted users may have an unsafe text format set by default, which
+ * should not be used on text of unknown origin. Instead, the fallback format
+ * returned by filter_fallback_format() should be used, since that is intended
+ * to be a safe, consistent format that is always available to all users.
+ *
+ * @param $account
+ *   (optional) The user account to check. Defaults to the currently logged-in
+ *   user. Defaults to NULL.
+ *
+ * @return
+ *   The ID of the user's default text format.
+ *
+ * @see filter_fallback_format()
+ */
+function filter_default_format($account = NULL) {
+  global $user;
+  if (!isset($account)) {
+    $account = $user;
+  }
+  // Get a list of formats for this user, ordered by weight. The first one
+  // available is the user's default format.
+  $formats = filter_formats($account);
+  $format = reset($formats);
+  return $format->format;
+}
+
+/**
+ * Returns the ID of the fallback text format that all users have access to.
+ *
+ * The fallback text format is a regular text format in every respect, except
+ * it does not participate in the filter permission system and cannot be
+ * disabled. It needs to exist because any user who has permission to create
+ * formatted content must always have at least one text format they can use.
+ *
+ * Because the fallback format is available to all users, it should always be
+ * configured securely. For example, when the Filter module is installed, this
+ * format is initialized to output plain text. Installation profiles and site
+ * administrators have the freedom to configure it further.
+ *
+ * Note that the fallback format is completely distinct from the default format,
+ * which differs per user and is simply the first format which that user has
+ * access to. The default and fallback formats are only guaranteed to be the
+ * same for users who do not have access to any other format; otherwise, the
+ * fallback format's weight determines its placement with respect to the user's
+ * other formats.
+ *
+ * Any modules implementing a format deletion functionality must not delete this
+ * format.
+ *
+ * @return
+ *   The ID of the fallback text format.
+ *
+ * @see hook_filter_format_disable()
+ * @see filter_default_format()
+ */
+function filter_fallback_format() {
+  // This variable is automatically set in the database for all installations
+  // of Drupal. In the event that it gets disabled or deleted somehow, there
+  // is no safe default to return, since we do not want to risk making an
+  // existing (and potentially unsafe) text format on the site automatically
+  // available to all users. Returning NULL at least guarantees that this
+  // cannot happen.
+  return variable_get('filter_fallback_format');
+}
+
+/**
+ * Returns the title of the fallback text format.
+ *
+ * @return string
+ *   The title of the fallback text format.
+ */
+function filter_fallback_format_title() {
+  $fallback_format = filter_format_load(filter_fallback_format());
+  return filter_admin_format_title($fallback_format);
+}
+
+/**
+ * Returns a list of all filters provided by modules.
+ *
+ * @return array
+ *   An array of filter formats.
+ */
+function filter_get_filters() {
+  $filters = &drupal_static(__FUNCTION__, array());
+
+  if (empty($filters)) {
+    foreach (module_implements('filter_info') as $module) {
+      $info = module_invoke($module, 'filter_info');
+      if (isset($info) && is_array($info)) {
+        // Assign the name of the module implementing the filters and ensure
+        // default values.
+        foreach (array_keys($info) as $name) {
+          $info[$name]['module'] = $module;
+          $info[$name] += array(
+            'description' => '',
+            'weight' => 0,
+          );
+        }
+        $filters = array_merge($filters, $info);
+      }
+    }
+    // Allow modules to alter filter definitions.
+    drupal_alter('filter_info', $filters);
+
+    uasort($filters, '_filter_list_cmp');
+  }
+
+  return $filters;
+}
+
+/**
+ * Sorts an array of filters by filter name.
+ *
+ * Callback for uasort() within filter_get_filters().
+ */
+function _filter_list_cmp($a, $b) {
+  return strcmp($a['title'], $b['title']);
+}
+
+/**
+ * Checks if the text in a certain text format is allowed to be cached.
+ *
+ * This function can be used to check whether the result of the filtering
+ * process can be cached. A text format may allow caching depending on the
+ * filters enabled.
+ *
+ * @param $format_id
+ *   The text format ID to check.
+ *
+ * @return
+ *   TRUE if the given text format allows caching, FALSE otherwise.
+ */
+function filter_format_allowcache($format_id) {
+  $format = filter_format_load($format_id);
+  return !empty($format->cache);
+}
+
+/**
+ * Helper function to determine whether the output of a given text format can be cached.
+ *
+ * The output of a given text format can be cached when all enabled filters in
+ * the text format allow caching.
+ *
+ * @param $format
+ *   The text format object to check.
+ *
+ * @return
+ *   TRUE if all the filters enabled in the given text format allow caching,
+ *   FALSE otherwise.
+ *
+ * @see filter_format_save()
+ */
+function _filter_format_is_cacheable($format) {
+  if (empty($format->filters)) {
+    return TRUE;
+  }
+  $filter_info = filter_get_filters();
+  foreach ($format->filters as $name => $filter) {
+    // By default, 'cache' is TRUE for all filters unless specified otherwise.
+    if (!empty($filter['status']) && isset($filter_info[$name]['cache']) && !$filter_info[$name]['cache']) {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+
+/**
+ * Retrieves a list of filters for a given text format.
+ *
+ * Note that this function returns all associated filters regardless of whether
+ * they are enabled or disabled. All functions working with the filter
+ * information outside of filter administration should test for $filter->status
+ * before performing actions with the filter.
+ *
+ * @param $format_id
+ *   The format ID to retrieve filters for.
+ *
+ * @return
+ *   An array of filter objects associated to the given text format, keyed by
+ *   filter name.
+ */
+function filter_list_format($format_id) {
+  $filters = &drupal_static(__FUNCTION__, array());
+  $filter_info = filter_get_filters();
+
+  if (!isset($filters['all'])) {
+    if ($cache = cache_get('filter_list_format')) {
+      $filters['all'] = $cache->data;
+    }
+    else {
+      $result = db_query('SELECT * FROM {filter} ORDER BY weight, module, name');
+      foreach ($result as $record) {
+        $filters['all'][$record->format][$record->name] = $record;
+      }
+      cache_set('filter_list_format', $filters['all']);
+    }
+  }
+
+  if (!isset($filters[$format_id])) {
+    $format_filters = array();
+    $filter_map = isset($filters['all'][$format_id]) ? $filters['all'][$format_id] : array();
+    foreach ($filter_map as $name => $filter) {
+      if (isset($filter_info[$name])) {
+        $filter->title = $filter_info[$name]['title'];
+        // Unpack stored filter settings.
+        $filter->settings = (isset($filter->settings) ? unserialize($filter->settings) : array());
+        // Merge in default settings.
+        if (isset($filter_info[$name]['default settings'])) {
+          $filter->settings += $filter_info[$name]['default settings'];
+        }
+
+        $format_filters[$name] = $filter;
+      }
+    }
+    $filters[$format_id] = $format_filters;
+  }
+
+  return isset($filters[$format_id]) ? $filters[$format_id] : array();
+}
+
+/**
+ * Runs all the enabled filters on a piece of text.
+ *
+ * Note: Because filters can inject JavaScript or execute PHP code, security is
+ * vital here. When a user supplies a text format, you should validate it using
+ * filter_access() before accepting/using it. This is normally done in the
+ * validation stage of the Form API. You should for example never make a preview
+ * of content in a disallowed format.
+ *
+ * @param $text
+ *   The text to be filtered.
+ * @param $format_id
+ *   (optional) The format ID of the text to be filtered. If no format is
+ *   assigned, the fallback format will be used. Defaults to NULL.
+ * @param $langcode
+ *   (optional) The language code of the text to be filtered, e.g. 'en' for
+ *   English. This allows filters to be language aware so language specific
+ *   text replacement can be implemented. Defaults to an empty string.
+ * @param $cache
+ *   (optional) A Boolean indicating whether to cache the filtered output in the
+ *   {cache_filter} table. The caller may set this to FALSE when the output is
+ *   already cached elsewhere to avoid duplicate cache lookups and storage.
+ *   Defaults to FALSE.
+ *
+ * @return
+ *   The filtered text.
+ *
+ * @ingroup sanitization
+ */
+function check_markup($text, $format_id = NULL, $langcode = '', $cache = FALSE) {
+  if (!isset($format_id)) {
+    $format_id = filter_fallback_format();
+  }
+  // If the requested text format does not exist, the text cannot be filtered.
+  if (!$format = filter_format_load($format_id)) {
+    watchdog('filter', 'Missing text format: %format.', array('%format' => $format_id), WATCHDOG_ALERT);
+    return '';
+  }
+
+  // Check for a cached version of this piece of text.
+  $cache = $cache && !empty($format->cache);
+  $cache_id = '';
+  if ($cache) {
+    $cache_id = $format->format . ':' . $langcode . ':' . hash('sha256', $text);
+    if ($cached = cache_get($cache_id, 'cache_filter')) {
+      return $cached->data;
+    }
+  }
+
+  // Convert all Windows and Mac newlines to a single newline, so filters only
+  // need to deal with one possibility.
+  $text = str_replace(array("\r\n", "\r"), "\n", $text);
+
+  // Get a complete list of filters, ordered properly.
+  $filters = filter_list_format($format->format);
+  $filter_info = filter_get_filters();
+
+  // Give filters the chance to escape HTML-like data such as code or formulas.
+  foreach ($filters as $name => $filter) {
+    if ($filter->status && isset($filter_info[$name]['prepare callback']) && function_exists($filter_info[$name]['prepare callback'])) {
+      $function = $filter_info[$name]['prepare callback'];
+      $text = $function($text, $filter, $format, $langcode, $cache, $cache_id);
+    }
+  }
+
+  // Perform filtering.
+  foreach ($filters as $name => $filter) {
+    if ($filter->status && isset($filter_info[$name]['process callback']) && function_exists($filter_info[$name]['process callback'])) {
+      $function = $filter_info[$name]['process callback'];
+      $text = $function($text, $filter, $format, $langcode, $cache, $cache_id);
+    }
+  }
+
+  // Cache the filtered text. This cache is infinitely valid. It becomes
+  // obsolete when $text changes (which leads to a new $cache_id). It is
+  // automatically flushed when the text format is updated.
+  // @see filter_format_save()
+  if ($cache) {
+    cache_set($cache_id, $text, 'cache_filter');
+  }
+
+  return $text;
+}
+
+/**
+ * Expands an element into a base element with text format selector attached.
+ *
+ * The form element will be expanded into two separate form elements, one
+ * holding the original element, and the other holding the text format selector:
+ * - value: Holds the original element, having its #type changed to the value of
+ *   #base_type or 'textarea' by default.
+ * - format: Holds the text format fieldset and the text format selection, using
+ *   the text format id specified in #format or the user's default format by
+ *   default, if NULL.
+ *
+ * The resulting value for the element will be an array holding the value and
+ * the format. For example, the value for the body element will be:
+ * @code
+ *   $form_state['values']['body']['value'] = 'foo';
+ *   $form_state['values']['body']['format'] = 'foo';
+ * @endcode
+ *
+ * @param $element
+ *   The form element to process. Properties used:
+ *   - #base_type: The form element #type to use for the 'value' element.
+ *     'textarea' by default.
+ *   - #format: (optional) The text format ID to preselect. If NULL or not set,
+ *     the default format for the current user will be used.
+ *
+ * @return
+ *   The expanded element.
+ */
+function filter_process_format($element) {
+  global $user;
+
+  // Ensure that children appear as subkeys of this element.
+  $element['#tree'] = TRUE;
+  $blacklist = array(
+    // Make form_builder() regenerate child properties.
+    '#parents',
+    '#id',
+    '#name',
+    // Do not copy this #process function to prevent form_builder() from
+    // recursing infinitely.
+    '#process',
+    // Description is handled by theme_text_format_wrapper().
+    '#description',
+    // Ensure proper ordering of children.
+    '#weight',
+    // Properties already processed for the parent element.
+    '#prefix',
+    '#suffix',
+    '#attached',
+    '#processed',
+    '#theme_wrappers',
+  );
+  // Move this element into sub-element 'value'.
+  unset($element['value']);
+  foreach (element_properties($element) as $key) {
+    if (!in_array($key, $blacklist)) {
+      $element['value'][$key] = $element[$key];
+    }
+  }
+
+  $element['value']['#type'] = $element['#base_type'];
+  $element['value'] += element_info($element['#base_type']);
+
+  // Turn original element into a text format wrapper.
+  $path = drupal_get_path('module', 'filter');
+  $element['#attached']['js'][] = $path . '/filter.js';
+  $element['#attached']['css'][] = $path . '/filter.css';
+
+  // Setup child container for the text format widget.
+  $element['format'] = array(
+    '#type' => 'fieldset',
+    '#attributes' => array('class' => array('filter-wrapper')),
+  );
+
+  // Prepare text format guidelines.
+  $element['format']['guidelines'] = array(
+    '#type' => 'container',
+    '#attributes' => array('class' => array('filter-guidelines')),
+    '#weight' => 20,
+  );
+  // Get a list of formats that the current user has access to.
+  $formats = filter_formats($user);
+  foreach ($formats as $format) {
+    $options[$format->format] = $format->name;
+    $element['format']['guidelines'][$format->format] = array(
+      '#theme' => 'filter_guidelines',
+      '#format' => $format,
+    );
+  }
+
+  // Use the default format for this user if none was selected.
+  if (!isset($element['#format'])) {
+    $element['#format'] = filter_default_format($user);
+  }
+
+  $element['format']['format'] = array(
+    '#type' => 'select',
+    '#title' => t('Text format'),
+    '#options' => $options,
+    '#default_value' => $element['#format'],
+    '#access' => count($formats) > 1,
+    '#weight' => 10,
+    '#attributes' => array('class' => array('filter-list')),
+    '#parents' => array_merge($element['#parents'], array('format')),
+  );
+
+  $element['format']['help'] = array(
+    '#type' => 'container',
+    '#theme' => 'filter_tips_more_info',
+    '#attributes' => array('class' => array('filter-help')),
+    '#weight' => 0,
+  );
+
+  $all_formats = filter_formats();
+  $format_exists = isset($all_formats[$element['#format']]);
+  $user_has_access = isset($formats[$element['#format']]);
+  $user_is_admin = user_access('administer filters');
+
+  // If the stored format does not exist, administrators have to assign a new
+  // format.
+  if (!$format_exists && $user_is_admin) {
+    $element['format']['format']['#required'] = TRUE;
+    $element['format']['format']['#default_value'] = NULL;
+    // Force access to the format selector (it may have been denied above if
+    // the user only has access to a single format).
+    $element['format']['format']['#access'] = TRUE;
+  }
+  // Disable this widget, if the user is not allowed to use the stored format,
+  // or if the stored format does not exist. The 'administer filters' permission
+  // only grants access to the filter administration, not to all formats.
+  elseif (!$user_has_access || !$format_exists) {
+    // Overload default values into #value to make them unalterable.
+    $element['value']['#value'] = $element['value']['#default_value'];
+    $element['format']['format']['#value'] = $element['format']['format']['#default_value'];
+
+    // Prepend #pre_render callback to replace field value with user notice
+    // prior to rendering.
+    $element['value'] += array('#pre_render' => array());
+    array_unshift($element['value']['#pre_render'], 'filter_form_access_denied');
+
+    // Cosmetic adjustments.
+    if (isset($element['value']['#rows'])) {
+      $element['value']['#rows'] = 3;
+    }
+    $element['value']['#disabled'] = TRUE;
+    $element['value']['#resizable'] = FALSE;
+
+    // Hide the text format selector and any other child element (such as text
+    // field's summary).
+    foreach (element_children($element) as $key) {
+      if ($key != 'value') {
+        $element[$key]['#access'] = FALSE;
+      }
+    }
+  }
+
+  return $element;
+}
+
+/**
+ * Render API callback: Hides the field value of 'text_format' elements.
+ *
+ * To not break form processing and previews if a user does not have access to a
+ * stored text format, the expanded form elements in filter_process_format() are
+ * forced to take over the stored #default_values for 'value' and 'format'.
+ * However, to prevent the unfiltered, original #value from being displayed to
+ * the user, we replace it with a friendly notice here.
+ *
+ * @see filter_process_format()
+ */
+function filter_form_access_denied($element) {
+  $element['#value'] = t('This field has been disabled because you do not have sufficient permissions to edit it.');
+  return $element;
+}
+
+/**
+ * Returns HTML for a text format-enabled form element.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: A render element containing #children and #description.
+ *
+ * @ingroup themeable
+ */
+function theme_text_format_wrapper($variables) {
+  $element = $variables['element'];
+  $output = '<div class="text-format-wrapper">';
+  $output .= $element['#children'];
+  if (!empty($element['#description'])) {
+    $output .= '<div class="description">' . $element['#description'] . '</div>';
+  }
+  $output .= "</div>\n";
+
+  return $output;
+}
+
+/**
+ * Checks if a user has access to a particular text format.
+ *
+ * @param $format
+ *   An object representing the text format.
+ * @param $account
+ *   (optional) The user account to check access for; if omitted, the currently
+ *   logged-in user is used. Defaults to NULL.
+ *
+ * @return
+ *   Boolean TRUE if the user is allowed to access the given format.
+ */
+function filter_access($format, $account = NULL) {
+  global $user;
+  if (!isset($account)) {
+    $account = $user;
+  }
+  // Handle special cases up front. All users have access to the fallback
+  // format.
+  if ($format->format == filter_fallback_format()) {
+    return TRUE;
+  }
+  // Check the permission if one exists; otherwise, we have a non-existent
+  // format so we return FALSE.
+  $permission = filter_permission_name($format);
+  return !empty($permission) && user_access($permission, $account);
+}
+
+/**
+ * Retrieves the filter tips.
+ *
+ * @param $format_id
+ *   The ID of the text format for which to retrieve tips, or -1 to return tips
+ *   for all formats accessible to the current user.
+ * @param $long
+ *   (optional) Boolean indicating whether the long form of tips should be
+ *   returned. Defaults to FALSE.
+ *
+ * @return
+ *   An associative array of filtering tips, keyed by filter name. Each
+ *   filtering tip is an associative array with elements:
+ *   - tip: Tip text.
+ *   - id: Filter ID.
+ */
+function _filter_tips($format_id, $long = FALSE) {
+  global $user;
+
+  $formats = filter_formats($user);
+  $filter_info = filter_get_filters();
+
+  $tips = array();
+
+  // If only listing one format, extract it from the $formats array.
+  if ($format_id != -1) {
+    $formats = array($formats[$format_id]);
+  }
+
+  foreach ($formats as $format) {
+    $filters = filter_list_format($format->format);
+    $tips[$format->name] = array();
+    foreach ($filters as $name => $filter) {
+      if ($filter->status && isset($filter_info[$name]['tips callback']) && function_exists($filter_info[$name]['tips callback'])) {
+        $tip = $filter_info[$name]['tips callback']($filter, $format, $long);
+        if (isset($tip)) {
+          $tips[$format->name][$name] = array('tip' => $tip, 'id' => $name);
+        }
+      }
+    }
+  }
+
+  return $tips;
+}
+
+/**
+ * Parses an HTML snippet and returns it as a DOM object.
+ *
+ * This function loads the body part of a partial (X)HTML document and returns
+ * a full DOMDocument object that represents this document. You can use
+ * filter_dom_serialize() to serialize this DOMDocument back to a XHTML
+ * snippet.
+ *
+ * @param $text
+ *   The partial (X)HTML snippet to load. Invalid mark-up will be corrected on
+ *   import.
+ * @return
+ *   A DOMDocument that represents the loaded (X)HTML snippet.
+ */
+function filter_dom_load($text) {
+  $dom_document = new DOMDocument();
+  // Ignore warnings during HTML soup loading.
+  @$dom_document->loadHTML('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body>' . $text . '</body></html>');
+
+  return $dom_document;
+}
+
+/**
+ * Converts a DOM object back to an HTML snippet.
+ *
+ * The function serializes the body part of a DOMDocument back to an XHTML
+ * snippet. The resulting XHTML snippet will be properly formatted to be
+ * compatible with HTML user agents.
+ *
+ * @param $dom_document
+ *   A DOMDocument object to serialize, only the tags below
+ *   the first <body> node will be converted.
+ *
+ * @return
+ *   A valid (X)HTML snippet, as a string.
+ */
+function filter_dom_serialize($dom_document) {
+  $body_node = $dom_document->getElementsByTagName('body')->item(0);
+  $body_content = '';
+
+  foreach ($body_node->getElementsByTagName('script') as $node) {
+    filter_dom_serialize_escape_cdata_element($dom_document, $node);
+  }
+
+  foreach ($body_node->getElementsByTagName('style') as $node) {
+    filter_dom_serialize_escape_cdata_element($dom_document, $node, '/*', '*/');
+  }
+
+  foreach ($body_node->childNodes as $child_node) {
+    $body_content .= $dom_document->saveXML($child_node);
+  }
+  return preg_replace('|<([^> ]*)/>|i', '<$1 />', $body_content);
+}
+
+/**
+ * Adds comments around the <!CDATA section in a dom element.
+ *
+ * DOMDocument::loadHTML in filter_dom_load() makes CDATA sections from the
+ * contents of inline script and style tags.  This can cause HTML 4 browsers to
+ * throw exceptions.
+ *
+ * This function attempts to solve the problem by creating a DocumentFragment
+ * and imitating the behavior in drupal_get_js(), commenting the CDATA tag.
+ *
+ * @param $dom_document
+ *   The DOMDocument containing the $dom_element.
+ * @param $dom_element
+ *   The element potentially containing a CDATA node.
+ * @param $comment_start
+ *   (optional) A string to use as a comment start marker to escape the CDATA
+ *   declaration. Defaults to '//'.
+ * @param $comment_end
+ *   (optional) A string to use as a comment end marker to escape the CDATA
+ *   declaration. Defaults to an empty string.
+ */
+function filter_dom_serialize_escape_cdata_element($dom_document, $dom_element, $comment_start = '//', $comment_end = '') {
+  foreach ($dom_element->childNodes as $node) {
+    if (get_class($node) == 'DOMCdataSection') {
+      // See drupal_get_js().  This code is more or less duplicated there.
+      $embed_prefix = "\n<!--{$comment_start}--><![CDATA[{$comment_start} ><!--{$comment_end}\n";
+      $embed_suffix = "\n{$comment_start}--><!]]>{$comment_end}\n";
+
+      // Prevent invalid cdata escaping as this would throw a DOM error.
+      // This is the same behavior as found in libxml2.
+      // Related W3C standard: http://www.w3.org/TR/REC-xml/#dt-cdsection
+      // Fix explanation: http://en.wikipedia.org/wiki/CDATA#Nesting
+      $data = str_replace(']]>', ']]]]><![CDATA[>', $node->data);
+
+      $fragment = $dom_document->createDocumentFragment();
+      $fragment->appendXML($embed_prefix . $data . $embed_suffix);
+      $dom_element->appendChild($fragment);
+      $dom_element->removeChild($node);
+    }
+  }
+}
+
+/**
+ * Returns HTML for a link to the more extensive filter tips.
+ *
+ * @ingroup themeable
+ */
+function theme_filter_tips_more_info() {
+  return '<p>' . l(t('More information about text formats'), 'filter/tips', array('attributes' => array('target' => '_blank'))) . '</p>';
+}
+
+/**
+ * Returns HTML for guidelines for a text format.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - format: An object representing a text format.
+ *
+ * @ingroup themeable
+ */
+function theme_filter_guidelines($variables) {
+  $format = $variables['format'];
+  $attributes['class'][] = 'filter-guidelines-item';
+  $attributes['class'][] = 'filter-guidelines-' . $format->format;
+  $output = '<div' . drupal_attributes($attributes) . '>';
+  $output .= '<h3>' . check_plain($format->name) . '</h3>';
+  $output .= theme('filter_tips', array('tips' => _filter_tips($format->format, FALSE)));
+  $output .= '</div>';
+  return $output;
+}
+
+/**
+ * @defgroup standard_filters Standard filters
+ * @{
+ * Filters implemented by the Filter module.
+ */
+
+/**
+ * Implements hook_filter_info().
+ */
+function filter_filter_info() {
+  $filters['filter_html'] = array(
+    'title' => t('Limit allowed HTML tags'),
+    'process callback' => '_filter_html',
+    'settings callback' => '_filter_html_settings',
+    'default settings' => array(
+      'allowed_html' => '<a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>',
+      'filter_html_help' => 1,
+      'filter_html_nofollow' => 0,
+    ),
+    'tips callback' => '_filter_html_tips',
+    'weight' => -10,
+  );
+  $filters['filter_autop'] = array(
+    'title' => t('Convert line breaks into HTML (i.e. <code>&lt;br&gt;</code> and <code>&lt;p&gt;</code>)'),
+    'process callback' => '_filter_autop',
+    'tips callback' => '_filter_autop_tips',
+  );
+  $filters['filter_url'] = array(
+    'title' => t('Convert URLs into links'),
+    'process callback' => '_filter_url',
+    'settings callback' => '_filter_url_settings',
+    'default settings' => array(
+      'filter_url_length' => 72,
+    ),
+    'tips callback' => '_filter_url_tips',
+  );
+  $filters['filter_htmlcorrector'] = array(
+    'title' =>  t('Correct faulty and chopped off HTML'),
+    'process callback' => '_filter_htmlcorrector',
+    'weight' => 10,
+  );
+  $filters['filter_html_escape'] = array(
+    'title' => t('Display any HTML as plain text'),
+    'process callback' => '_filter_html_escape',
+    'tips callback' => '_filter_html_escape_tips',
+    'weight' => -10,
+  );
+  return $filters;
+}
+
+/**
+ * Implements callback_filter_settings().
+ *
+ * Filter settings callback for the HTML content filter.
+ */
+function _filter_html_settings($form, &$form_state, $filter, $format, $defaults) {
+  $filter->settings += $defaults;
+
+  $settings['allowed_html'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Allowed HTML tags'),
+    '#default_value' => $filter->settings['allowed_html'],
+    '#maxlength' => 1024,
+    '#description' => t('A list of HTML tags that can be used. JavaScript event attributes, JavaScript URLs, and CSS are always stripped.'),
+  );
+  $settings['filter_html_help'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Display basic HTML help in long filter tips'),
+    '#default_value' => $filter->settings['filter_html_help'],
+  );
+  $settings['filter_html_nofollow'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Add rel="nofollow" to all links'),
+    '#default_value' => $filter->settings['filter_html_nofollow'],
+  );
+  return $settings;
+}
+
+/**
+ * Implements callback_filter_process().
+ *
+ * Provides filtering of input into accepted HTML.
+ */
+function _filter_html($text, $filter) {
+  $allowed_tags = preg_split('/\s+|<|>/', $filter->settings['allowed_html'], -1, PREG_SPLIT_NO_EMPTY);
+  $text = filter_xss($text, $allowed_tags);
+
+  if ($filter->settings['filter_html_nofollow']) {
+    $html_dom = filter_dom_load($text);
+    $links = $html_dom->getElementsByTagName('a');
+    foreach ($links as $link) {
+      $link->setAttribute('rel', 'nofollow');
+    }
+    $text = filter_dom_serialize($html_dom);
+  }
+
+  return trim($text);
+}
+
+/**
+ * Implements callback_filter_tips().
+ *
+ * Provides help for the HTML filter.
+ *
+ * @see filter_filter_info()
+ */
+function _filter_html_tips($filter, $format, $long = FALSE) {
+  global $base_url;
+
+  if (!($allowed_html = $filter->settings['allowed_html'])) {
+    return;
+  }
+  $output = t('Allowed HTML tags: @tags', array('@tags' => $allowed_html));
+  if (!$long) {
+    return $output;
+  }
+
+  $output = '<p>' . $output . '</p>';
+  if (!$filter->settings['filter_html_help']) {
+    return $output;
+  }
+
+  $output .= '<p>' . t('This site allows HTML content. While learning all of HTML may feel intimidating, learning how to use a very small number of the most basic HTML "tags" is very easy. This table provides examples for each tag that is enabled on this site.') . '</p>';
+  $output .= '<p>' . t('For more information see W3C\'s <a href="@html-specifications">HTML Specifications</a> or use your favorite search engine to find other sites that explain HTML.', array('@html-specifications' => 'http://www.w3.org/TR/html/')) . '</p>';
+  $tips = array(
+    'a' => array(t('Anchors are used to make links to other pages.'), '<a href="' . $base_url . '">' . check_plain(variable_get('site_name', 'Drupal')) . '</a>'),
+    'br' => array(t('By default line break tags are automatically added, so use this tag to add additional ones. Use of this tag is different because it is not used with an open/close pair like all the others. Use the extra " /" inside the tag to maintain XHTML 1.0 compatibility'), t('Text with <br />line break')),
+    'p' => array(t('By default paragraph tags are automatically added, so use this tag to add additional ones.'), '<p>' . t('Paragraph one.') . '</p> <p>' . t('Paragraph two.') . '</p>'),
+    'strong' => array(t('Strong', array(), array('context' => 'Font weight')), '<strong>' . t('Strong', array(), array('context' => 'Font weight')) . '</strong>'),
+    'em' => array(t('Emphasized'), '<em>' . t('Emphasized') . '</em>'),
+    'cite' => array(t('Cited'), '<cite>' . t('Cited') . '</cite>'),
+    'code' => array(t('Coded text used to show programming source code'), '<code>' . t('Coded') . '</code>'),
+    'b' => array(t('Bolded'), '<b>' . t('Bolded') . '</b>'),
+    'u' => array(t('Underlined'), '<u>' . t('Underlined') . '</u>'),
+    'i' => array(t('Italicized'), '<i>' . t('Italicized') . '</i>'),
+    'sup' => array(t('Superscripted'), t('<sup>Super</sup>scripted')),
+    'sub' => array(t('Subscripted'), t('<sub>Sub</sub>scripted')),
+    'pre' => array(t('Preformatted'), '<pre>' . t('Preformatted') . '</pre>'),
+    'abbr' => array(t('Abbreviation'), t('<abbr title="Abbreviation">Abbrev.</abbr>')),
+    'acronym' => array(t('Acronym'), t('<acronym title="Three-Letter Acronym">TLA</acronym>')),
+    'blockquote' => array(t('Block quoted'), '<blockquote>' . t('Block quoted') . '</blockquote>'),
+    'q' => array(t('Quoted inline'), '<q>' . t('Quoted inline') . '</q>'),
+    // Assumes and describes tr, td, th.
+    'table' => array(t('Table'), '<table> <tr><th>' . t('Table header') . '</th></tr> <tr><td>' . t('Table cell') . '</td></tr> </table>'),
+    'tr' => NULL, 'td' => NULL, 'th' => NULL,
+    'del' => array(t('Deleted'), '<del>' . t('Deleted') . '</del>'),
+    'ins' => array(t('Inserted'), '<ins>' . t('Inserted') . '</ins>'),
+     // Assumes and describes li.
+    'ol' => array(t('Ordered list - use the &lt;li&gt; to begin each list item'), '<ol> <li>' . t('First item') . '</li> <li>' . t('Second item') . '</li> </ol>'),
+    'ul' => array(t('Unordered list - use the &lt;li&gt; to begin each list item'), '<ul> <li>' . t('First item') . '</li> <li>' . t('Second item') . '</li> </ul>'),
+    'li' => NULL,
+    // Assumes and describes dt and dd.
+    'dl' => array(t('Definition lists are similar to other HTML lists. &lt;dl&gt; begins the definition list, &lt;dt&gt; begins the definition term and &lt;dd&gt; begins the definition description.'), '<dl> <dt>' . t('First term') . '</dt> <dd>' . t('First definition') . '</dd> <dt>' . t('Second term') . '</dt> <dd>' . t('Second definition') . '</dd> </dl>'),
+    'dt' => NULL, 'dd' => NULL,
+    'h1' => array(t('Heading'), '<h1>' . t('Title') . '</h1>'),
+    'h2' => array(t('Heading'), '<h2>' . t('Subtitle') . '</h2>'),
+    'h3' => array(t('Heading'), '<h3>' . t('Subtitle three') . '</h3>'),
+    'h4' => array(t('Heading'), '<h4>' . t('Subtitle four') . '</h4>'),
+    'h5' => array(t('Heading'), '<h5>' . t('Subtitle five') . '</h5>'),
+    'h6' => array(t('Heading'), '<h6>' . t('Subtitle six') . '</h6>')
+  );
+  $header = array(t('Tag Description'), t('You Type'), t('You Get'));
+  preg_match_all('/<([a-z0-9]+)[^a-z0-9]/i', $allowed_html, $out);
+  foreach ($out[1] as $tag) {
+    if (!empty($tips[$tag])) {
+      $rows[] = array(
+        array('data' => $tips[$tag][0], 'class' => array('description')),
+        array('data' => '<code>' . check_plain($tips[$tag][1]) . '</code>', 'class' => array('type')),
+        array('data' => $tips[$tag][1], 'class' => array('get'))
+      );
+    }
+    else {
+      $rows[] = array(
+        array('data' => t('No help provided for tag %tag.', array('%tag' => $tag)), 'class' => array('description'), 'colspan' => 3),
+      );
+    }
+  }
+  $output .= theme('table', array('header' => $header, 'rows' => $rows));
+
+  $output .= '<p>' . t('Most unusual characters can be directly entered without any problems.') . '</p>';
+  $output .= '<p>' . t('If you do encounter problems, try using HTML character entities. A common example looks like &amp;amp; for an ampersand &amp; character. For a full list of entities see HTML\'s <a href="@html-entities">entities</a> page. Some of the available characters include:', array('@html-entities' => 'http://www.w3.org/TR/html4/sgml/entities.html')) . '</p>';
+
+  $entities = array(
+    array(t('Ampersand'), '&amp;'),
+    array(t('Greater than'), '&gt;'),
+    array(t('Less than'), '&lt;'),
+    array(t('Quotation mark'), '&quot;'),
+  );
+  $header = array(t('Character Description'), t('You Type'), t('You Get'));
+  unset($rows);
+  foreach ($entities as $entity) {
+    $rows[] = array(
+      array('data' => $entity[0], 'class' => array('description')),
+      array('data' => '<code>' . check_plain($entity[1]) . '</code>', 'class' => array('type')),
+      array('data' => $entity[1], 'class' => array('get'))
+    );
+  }
+  $output .= theme('table', array('header' => $header, 'rows' => $rows));
+  return $output;
+}
+
+/**
+ * Implements callback_filter_settings().
+ *
+ * Provides settings for the URL filter.
+ *
+ * @see filter_filter_info()
+ */
+function _filter_url_settings($form, &$form_state, $filter, $format, $defaults) {
+  $filter->settings += $defaults;
+
+  $settings['filter_url_length'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Maximum link text length'),
+    '#default_value' => $filter->settings['filter_url_length'],
+    '#size' => 5,
+    '#maxlength' => 4,
+    '#field_suffix' => t('characters'),
+    '#description' => t('URLs longer than this number of characters will be truncated to prevent long strings that break formatting. The link itself will be retained; just the text portion of the link will be truncated.'),
+    '#element_validate' => array('element_validate_integer_positive'),
+  );
+  return $settings;
+}
+
+/**
+ * Implements callback_filter_process().
+ *
+ * Converts text into hyperlinks automatically.
+ *
+ * This filter identifies and makes clickable three types of "links".
+ * - URLs like http://example.com.
+ * - E-mail addresses like name@example.com.
+ * - Web addresses without the "http://" protocol defined, like www.example.com.
+ * Each type must be processed separately, as there is no one regular
+ * expression that could possibly match all of the cases in one pass.
+ */
+function _filter_url($text, $filter) {
+  // Tags to skip and not recurse into.
+  $ignore_tags = 'a|script|style|code|pre';
+
+  // Pass length to regexp callback.
+  _filter_url_trim(NULL, $filter->settings['filter_url_length']);
+
+  // Create an array which contains the regexps for each type of link.
+  // The key to the regexp is the name of a function that is used as
+  // callback function to process matches of the regexp. The callback function
+  // is to return the replacement for the match. The array is used and
+  // matching/replacement done below inside some loops.
+  $tasks = array();
+
+  // Prepare protocols pattern for absolute URLs.
+  // check_url() will replace any bad protocols with HTTP, so we need to support
+  // the identical list. While '//' is technically optional for MAILTO only,
+  // we cannot cleanly differ between protocols here without hard-coding MAILTO,
+  // so '//' is optional for all protocols.
+  // @see filter_xss_bad_protocol()
+  $protocols = variable_get('filter_allowed_protocols', array('ftp', 'http', 'https', 'irc', 'mailto', 'news', 'nntp', 'rtsp', 'sftp', 'ssh', 'tel', 'telnet', 'webcal'));
+  $protocols = implode(':(?://)?|', $protocols) . ':(?://)?';
+
+  // Prepare domain name pattern.
+  // The ICANN seems to be on track towards accepting more diverse top level
+  // domains, so this pattern has been "future-proofed" to allow for TLDs
+  // of length 2-64.
+  $domain = '(?:[A-Za-z0-9._+-]+\.)?[A-Za-z]{2,64}\b';
+  $ip = '(?:[0-9]{1,3}\.){3}[0-9]{1,3}';
+  $auth = '[a-zA-Z0-9:%_+*~#?&=.,/;-]+@';
+  $trail = '[a-zA-Z0-9:%_+*~#&\[\]=/;?!\.,-]*[a-zA-Z0-9:%_+*~#&\[\]=/;-]';
+
+  // Prepare pattern for optional trailing punctuation.
+  // Even these characters could have a valid meaning for the URL, such usage is
+  // rare compared to using a URL at the end of or within a sentence, so these
+  // trailing characters are optionally excluded.
+  $punctuation = '[\.,?!]*?';
+
+  // Match absolute URLs.
+  $url_pattern = "(?:$auth)?(?:$domain|$ip)/?(?:$trail)?";
+  $pattern = "`((?:$protocols)(?:$url_pattern))($punctuation)`";
+  $tasks['_filter_url_parse_full_links'] = $pattern;
+
+  // Match e-mail addresses.
+  $url_pattern = "[A-Za-z0-9._-]{1,254}@(?:$domain)";
+  $pattern = "`($url_pattern)`";
+  $tasks['_filter_url_parse_email_links'] = $pattern;
+
+  // Match www domains.
+  $url_pattern = "www\.(?:$domain)/?(?:$trail)?";
+  $pattern = "`($url_pattern)($punctuation)`";
+  $tasks['_filter_url_parse_partial_links'] = $pattern;
+
+  // Each type of URL needs to be processed separately. The text is joined and
+  // re-split after each task, since all injected HTML tags must be correctly
+  // protected before the next task.
+  foreach ($tasks as $task => $pattern) {
+    // HTML comments need to be handled separately, as they may contain HTML
+    // markup, especially a '>'. Therefore, remove all comment contents and add
+    // them back later.
+    _filter_url_escape_comments('', TRUE);
+    $text = preg_replace_callback('`<!--(.*?)-->`s', '_filter_url_escape_comments', $text);
+
+    // Split at all tags; ensures that no tags or attributes are processed.
+    $chunks = preg_split('/(<.+?>)/is', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
+    // PHP ensures that the array consists of alternating delimiters and
+    // literals, and begins and ends with a literal (inserting NULL as
+    // required). Therefore, the first chunk is always text:
+    $chunk_type = 'text';
+    // If a tag of $ignore_tags is found, it is stored in $open_tag and only
+    // removed when the closing tag is found. Until the closing tag is found,
+    // no replacements are made.
+    $open_tag = '';
+
+    for ($i = 0; $i < count($chunks); $i++) {
+      if ($chunk_type == 'text') {
+        // Only process this text if there are no unclosed $ignore_tags.
+        if ($open_tag == '') {
+          // If there is a match, inject a link into this chunk via the callback
+          // function contained in $task.
+          $chunks[$i] = preg_replace_callback($pattern, $task, $chunks[$i]);
+        }
+        // Text chunk is done, so next chunk must be a tag.
+        $chunk_type = 'tag';
+      }
+      else {
+        // Only process this tag if there are no unclosed $ignore_tags.
+        if ($open_tag == '') {
+          // Check whether this tag is contained in $ignore_tags.
+          if (preg_match("`<($ignore_tags)(?:\s|>)`i", $chunks[$i], $matches)) {
+            $open_tag = $matches[1];
+          }
+        }
+        // Otherwise, check whether this is the closing tag for $open_tag.
+        else {
+          if (preg_match("`<\/$open_tag>`i", $chunks[$i], $matches)) {
+            $open_tag = '';
+          }
+        }
+        // Tag chunk is done, so next chunk must be text.
+        $chunk_type = 'text';
+      }
+    }
+
+    $text = implode($chunks);
+    // Revert back to the original comment contents
+    _filter_url_escape_comments('', FALSE);
+    $text = preg_replace_callback('`<!--(.*?)-->`', '_filter_url_escape_comments', $text);
+  }
+
+  return $text;
+}
+
+/**
+ * Makes links out of absolute URLs.
+ *
+ * Callback for preg_replace_callback() within _filter_url().
+ */
+function _filter_url_parse_full_links($match) {
+  // The $i:th parenthesis in the regexp contains the URL.
+  $i = 1;
+
+  $match[$i] = decode_entities($match[$i]);
+  $caption = check_plain(_filter_url_trim($match[$i]));
+  $match[$i] = check_plain($match[$i]);
+  return '<a href="' . $match[$i] . '">' . $caption . '</a>' . $match[$i + 1];
+}
+
+/**
+ * Makes links out of e-mail addresses.
+ *
+ * Callback for preg_replace_callback() within _filter_url().
+ */
+function _filter_url_parse_email_links($match) {
+  // The $i:th parenthesis in the regexp contains the URL.
+  $i = 0;
+
+  $match[$i] = decode_entities($match[$i]);
+  $caption = check_plain(_filter_url_trim($match[$i]));
+  $match[$i] = check_plain($match[$i]);
+  return '<a href="mailto:' . $match[$i] . '">' . $caption . '</a>';
+}
+
+/**
+ * Makes links out of domain names starting with "www."
+ *
+ * Callback for preg_replace_callback() within _filter_url().
+ */
+function _filter_url_parse_partial_links($match) {
+  // The $i:th parenthesis in the regexp contains the URL.
+  $i = 1;
+
+  $match[$i] = decode_entities($match[$i]);
+  $caption = check_plain(_filter_url_trim($match[$i]));
+  $match[$i] = check_plain($match[$i]);
+  return '<a href="http://' . $match[$i] . '">' . $caption . '</a>' . $match[$i + 1];
+}
+
+/**
+ * Escapes the contents of HTML comments.
+ *
+ * Callback for preg_replace_callback() within _filter_url().
+ *
+ * @param $match
+ *   An array containing matches to replace from preg_replace_callback(),
+ *   whereas $match[1] is expected to contain the content to be filtered.
+ * @param $escape
+ *   (optional) A Boolean indicating whether to escape (TRUE) or unescape
+ *   comments (FALSE). Defaults to NULL, indicating neither. If TRUE, statically
+ *   cached $comments are reset.
+ */
+function _filter_url_escape_comments($match, $escape = NULL) {
+  static $mode, $comments = array();
+
+  if (isset($escape)) {
+    $mode = $escape;
+    if ($escape){
+      $comments = array();
+    }
+    return;
+  }
+
+  // Replace all HTML coments with a '<!-- [hash] -->' placeholder.
+  if ($mode) {
+    $content = $match[1];
+    $hash = md5($content);
+    $comments[$hash] = $content;
+    return "<!-- $hash -->";
+  }
+  // Or replace placeholders with actual comment contents.
+  else {
+    $hash = $match[1];
+    $hash = trim($hash);
+    $content = $comments[$hash];
+    return "<!--$content-->";
+  }
+}
+
+/**
+ * Shortens long URLs to http://www.example.com/long/url...
+ */
+function _filter_url_trim($text, $length = NULL) {
+  static $_length;
+  if ($length !== NULL) {
+    $_length = $length;
+  }
+
+  // Use +3 for '...' string length.
+  if ($_length && strlen($text) > $_length + 3) {
+    $text = substr($text, 0, $_length) . '...';
+  }
+
+  return $text;
+}
+
+/**
+ * Implements callback_filter_tips().
+ *
+ * Provides help for the URL filter.
+ *
+ * @see filter_filter_info()
+ */
+function _filter_url_tips($filter, $format, $long = FALSE) {
+  return t('Web page addresses and e-mail addresses turn into links automatically.');
+}
+
+/**
+ * Implements callback_filter_process().
+ *
+ * Scans the input and makes sure that HTML tags are properly closed.
+ */
+function _filter_htmlcorrector($text) {
+  return filter_dom_serialize(filter_dom_load($text));
+}
+
+/**
+ * Implements callback_filter_process().
+ *
+ * Converts line breaks into <p> and <br> in an intelligent fashion.
+ *
+ * Based on: http://photomatt.net/scripts/autop
+ */
+function _filter_autop($text) {
+  // All block level tags
+  $block = '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|p|h[1-6]|hr)';
+
+  // Split at opening and closing PRE, SCRIPT, STYLE, OBJECT, IFRAME tags
+  // and comments. We don't apply any processing to the contents of these tags
+  // to avoid messing up code. We look for matched pairs and allow basic
+  // nesting. For example:
+  // "processed <pre> ignored <script> ignored </script> ignored </pre> processed"
+  $chunks = preg_split('@(<!--.*?-->|</?(?:pre|script|style|object|iframe|!--)[^>]*>)@i', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
+  // Note: PHP ensures the array consists of alternating delimiters and literals
+  // and begins and ends with a literal (inserting NULL as required).
+  $ignore = FALSE;
+  $ignoretag = '';
+  $output = '';
+  foreach ($chunks as $i => $chunk) {
+    if ($i % 2) {
+      $comment = (substr($chunk, 0, 4) == '<!--');
+      if ($comment) {
+        // Nothing to do, this is a comment.
+        $output .= $chunk;
+        continue;
+      }
+      // Opening or closing tag?
+      $open = ($chunk[1] != '/');
+      list($tag) = preg_split('/[ >]/', substr($chunk, 2 - $open), 2);
+      if (!$ignore) {
+        if ($open) {
+          $ignore = TRUE;
+          $ignoretag = $tag;
+        }
+      }
+      // Only allow a matching tag to close it.
+      elseif (!$open && $ignoretag == $tag) {
+        $ignore = FALSE;
+        $ignoretag = '';
+      }
+    }
+    elseif (!$ignore) {
+      $chunk = preg_replace('|\n*$|', '', $chunk) . "\n\n"; // just to make things a little easier, pad the end
+      $chunk = preg_replace('|<br />\s*<br />|', "\n\n", $chunk);
+      $chunk = preg_replace('!(<' . $block . '[^>]*>)!', "\n$1", $chunk); // Space things out a little
+      $chunk = preg_replace('!(</' . $block . '>)!', "$1\n\n", $chunk); // Space things out a little
+      $chunk = preg_replace("/\n\n+/", "\n\n", $chunk); // take care of duplicates
+      $chunk = preg_replace('/^\n|\n\s*\n$/', '', $chunk);
+      $chunk = '<p>' . preg_replace('/\n\s*\n\n?(.)/', "</p>\n<p>$1", $chunk) . "</p>\n"; // make paragraphs, including one at the end
+      $chunk = preg_replace("|<p>(<li.+?)</p>|", "$1", $chunk); // problem with nested lists
+      $chunk = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $chunk);
+      $chunk = str_replace('</blockquote></p>', '</p></blockquote>', $chunk);
+      $chunk = preg_replace('|<p>\s*</p>\n?|', '', $chunk); // under certain strange conditions it could create a P of entirely whitespace
+      $chunk = preg_replace('!<p>\s*(</?' . $block . '[^>]*>)!', "$1", $chunk);
+      $chunk = preg_replace('!(</?' . $block . '[^>]*>)\s*</p>!', "$1", $chunk);
+      $chunk = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $chunk); // make line breaks
+      $chunk = preg_replace('!(</?' . $block . '[^>]*>)\s*<br />!', "$1", $chunk);
+      $chunk = preg_replace('!<br />(\s*</?(?:p|li|div|th|pre|td|ul|ol)>)!', '$1', $chunk);
+      $chunk = preg_replace('/&([^#])(?![A-Za-z0-9]{1,8};)/', '&amp;$1', $chunk);
+    }
+    $output .= $chunk;
+  }
+  return $output;
+}
+
+/**
+ * Implements callback_filter_tips().
+ *
+ * Provides help for the auto-paragraph filter.
+ *
+ * @see filter_filter_info()
+ */
+function _filter_autop_tips($filter, $format, $long = FALSE) {
+  if ($long) {
+    return t('Lines and paragraphs are automatically recognized. The &lt;br /&gt; line break, &lt;p&gt; paragraph and &lt;/p&gt; close paragraph tags are inserted automatically. If paragraphs are not recognized simply add a couple blank lines.');
+  }
+  else {
+    return t('Lines and paragraphs break automatically.');
+  }
+}
+
+/**
+ * Implements callback_filter_process().
+ *
+ * Escapes all HTML tags, so they will be visible instead of being effective.
+ */
+function _filter_html_escape($text) {
+  return trim(check_plain($text));
+}
+
+/**
+ * Implements callback_filter_tips().
+ *
+ * Provides help for the HTML escaping filter.
+ *
+ * @see filter_filter_info()
+ */
+function _filter_html_escape_tips($filter, $format, $long = FALSE) {
+  return t('No HTML tags allowed.');
+}
+
+/**
+ * @} End of "Standard filters".
+ */
diff --git a/htmltest/modules/filter/filter.pages.inc b/htmltest/modules/filter/filter.pages.inc
new file mode 100644
index 00000000..50f81177
--- /dev/null
+++ b/htmltest/modules/filter/filter.pages.inc
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * @file
+ * User page callbacks for the Filter module.
+ */
+
+/**
+ * Page callback: Displays a page with long filter tips.
+ *
+ * @return string
+ *   An HTML-formatted string.
+ *
+ * @see filter_menu()
+ * @see theme_filter_tips()
+ */
+function filter_tips_long() {
+  $format_id = arg(2);
+  if ($format_id) {
+    $output = theme('filter_tips', array('tips' => _filter_tips($format_id, TRUE), 'long' => TRUE));
+  }
+  else {
+    $output = theme('filter_tips', array('tips' => _filter_tips(-1, TRUE), 'long' => TRUE));
+  }
+  return $output;
+}
+
+/**
+ * Returns HTML for a set of filter tips.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - tips: An array containing descriptions and a CSS ID in the form of
+ *     'module-name/filter-id' (only used when $long is TRUE) for each
+ *     filter in one or more text formats. Example:
+ *     @code
+ *       array(
+ *         'Full HTML' => array(
+ *           0 => array(
+ *             'tip' => 'Web page addresses and e-mail addresses turn into links automatically.',
+ *             'id' => 'filter/2',
+ *           ),
+ *         ),
+ *       );
+ *     @endcode
+ *   - long: (optional) Whether the passed-in filter tips contain extended
+ *     explanations, i.e. intended to be output on the path 'filter/tips'
+ *     (TRUE), or are in a short format, i.e. suitable to be displayed below a
+ *     form element. Defaults to FALSE.
+ *
+ * @see _filter_tips()
+ * @ingroup themeable
+ */
+function theme_filter_tips($variables) {
+  $tips = $variables['tips'];
+  $long = $variables['long'];
+  $output = '';
+
+  $multiple = count($tips) > 1;
+  if ($multiple) {
+    $output = '<h2>' . t('Text Formats') . '</h2>';
+  }
+
+  if (count($tips)) {
+    if ($multiple) {
+      $output .= '<div class="compose-tips">';
+    }
+    foreach ($tips as $name => $tiplist) {
+      if ($multiple) {
+        $output .= '<div class="filter-type filter-' . drupal_html_class($name) . '">';
+        $output .= '<h3>' . $name . '</h3>';
+      }
+
+      if (count($tiplist) > 0) {
+        $output .= '<ul class="tips">';
+        foreach ($tiplist as $tip) {
+          $output .= '<li' . ($long ? ' id="filter-' . str_replace("/", "-", $tip['id']) . '">' : '>') . $tip['tip'] . '</li>';
+        }
+        $output .= '</ul>';
+      }
+
+      if ($multiple) {
+        $output .= '</div>';
+      }
+    }
+    if ($multiple) {
+      $output .= '</div>';
+    }
+  }
+
+  return $output;
+}
diff --git a/htmltest/modules/filter/filter.test b/htmltest/modules/filter/filter.test
new file mode 100644
index 00000000..cc0295b5
--- /dev/null
+++ b/htmltest/modules/filter/filter.test
@@ -0,0 +1,1972 @@
+<?php
+
+/**
+ * @file
+ * Tests for filter.module.
+ */
+
+/**
+ * Tests for text format and filter CRUD operations.
+ */
+class FilterCRUDTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Filter CRUD operations',
+      'description' => 'Test creation, loading, updating, deleting of text formats and filters.',
+      'group' => 'Filter',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('filter_test');
+  }
+
+  /**
+   * Tests CRUD operations for text formats and filters.
+   */
+  function testTextFormatCRUD() {
+    // Add a text format with minimum data only.
+    $format = new stdClass();
+    $format->format = 'empty_format';
+    $format->name = 'Empty format';
+    filter_format_save($format);
+    $this->verifyTextFormat($format);
+    $this->verifyFilters($format);
+
+    // Add another text format specifying all possible properties.
+    $format = new stdClass();
+    $format->format = 'custom_format';
+    $format->name = 'Custom format';
+    $format->filters = array(
+      'filter_url' => array(
+        'status' => 1,
+        'settings' => array(
+          'filter_url_length' => 30,
+        ),
+      ),
+    );
+    filter_format_save($format);
+    $this->verifyTextFormat($format);
+    $this->verifyFilters($format);
+
+    // Alter some text format properties and save again.
+    $format->name = 'Altered format';
+    $format->filters['filter_url']['status'] = 0;
+    $format->filters['filter_autop']['status'] = 1;
+    filter_format_save($format);
+    $this->verifyTextFormat($format);
+    $this->verifyFilters($format);
+
+    // Add a uncacheable filter and save again.
+    $format->filters['filter_test_uncacheable']['status'] = 1;
+    filter_format_save($format);
+    $this->verifyTextFormat($format);
+    $this->verifyFilters($format);
+
+    // Disable the text format.
+    filter_format_disable($format);
+
+    $db_format = db_query("SELECT * FROM {filter_format} WHERE format = :format", array(':format' => $format->format))->fetchObject();
+    $this->assertFalse($db_format->status, 'Database: Disabled text format is marked as disabled.');
+    $formats = filter_formats();
+    $this->assertTrue(!isset($formats[$format->format]), 'filter_formats: Disabled text format no longer exists.');
+  }
+
+  /**
+   * Verifies that a text format is properly stored.
+   */
+  function verifyTextFormat($format) {
+    $t_args = array('%format' => $format->name);
+    // Verify text format database record.
+    $db_format = db_select('filter_format', 'ff')
+      ->fields('ff')
+      ->condition('format', $format->format)
+      ->execute()
+      ->fetchObject();
+    $this->assertEqual($db_format->format, $format->format, format_string('Database: Proper format id for text format %format.', $t_args));
+    $this->assertEqual($db_format->name, $format->name, format_string('Database: Proper title for text format %format.', $t_args));
+    $this->assertEqual($db_format->cache, $format->cache, format_string('Database: Proper cache indicator for text format %format.', $t_args));
+    $this->assertEqual($db_format->weight, $format->weight, format_string('Database: Proper weight for text format %format.', $t_args));
+
+    // Verify filter_format_load().
+    $filter_format = filter_format_load($format->format);
+    $this->assertEqual($filter_format->format, $format->format, format_string('filter_format_load: Proper format id for text format %format.', $t_args));
+    $this->assertEqual($filter_format->name, $format->name, format_string('filter_format_load: Proper title for text format %format.', $t_args));
+    $this->assertEqual($filter_format->cache, $format->cache, format_string('filter_format_load: Proper cache indicator for text format %format.', $t_args));
+    $this->assertEqual($filter_format->weight, $format->weight, format_string('filter_format_load: Proper weight for text format %format.', $t_args));
+
+    // Verify the 'cache' text format property according to enabled filters.
+    $filter_info = filter_get_filters();
+    $filters = filter_list_format($filter_format->format);
+    $cacheable = TRUE;
+    foreach ($filters as $name => $filter) {
+      // If this filter is not cacheable, update $cacheable accordingly, so we
+      // can verify $format->cache after iterating over all filters.
+      if ($filter->status && isset($filter_info[$name]['cache']) && !$filter_info[$name]['cache']) {
+        $cacheable = FALSE;
+        break;
+      }
+    }
+    $this->assertEqual($filter_format->cache, $cacheable, 'Text format contains proper cache property.');
+  }
+
+  /**
+   * Verifies that filters are properly stored for a text format.
+   */
+  function verifyFilters($format) {
+    // Verify filter database records.
+    $filters = db_query("SELECT * FROM {filter} WHERE format = :format", array(':format' => $format->format))->fetchAllAssoc('name');
+    $format_filters = $format->filters;
+    foreach ($filters as $name => $filter) {
+      $t_args = array('%format' => $format->name, '%filter' => $name);
+
+      // Verify that filter status is properly stored.
+      $this->assertEqual($filter->status, $format_filters[$name]['status'], format_string('Database: Proper status for %filter in text format %format.', $t_args));
+
+      // Verify that filter settings were properly stored.
+      $this->assertEqual(unserialize($filter->settings), isset($format_filters[$name]['settings']) ? $format_filters[$name]['settings'] : array(), format_string('Database: Proper filter settings for %filter in text format %format.', $t_args));
+
+      // Verify that each filter has a module name assigned.
+      $this->assertTrue(!empty($filter->module), format_string('Database: Proper module name for %filter in text format %format.', $t_args));
+
+      // Remove the filter from the copy of saved $format to check whether all
+      // filters have been processed later.
+      unset($format_filters[$name]);
+    }
+    // Verify that all filters have been processed.
+    $this->assertTrue(empty($format_filters), 'Database contains values for all filters in the saved format.');
+
+    // Verify filter_list_format().
+    $filters = filter_list_format($format->format);
+    $format_filters = $format->filters;
+    foreach ($filters as $name => $filter) {
+      $t_args = array('%format' => $format->name, '%filter' => $name);
+
+      // Verify that filter status is properly stored.
+      $this->assertEqual($filter->status, $format_filters[$name]['status'], format_string('filter_list_format: Proper status for %filter in text format %format.', $t_args));
+
+      // Verify that filter settings were properly stored.
+      $this->assertEqual($filter->settings, isset($format_filters[$name]['settings']) ? $format_filters[$name]['settings'] : array(), format_string('filter_list_format: Proper filter settings for %filter in text format %format.', $t_args));
+
+      // Verify that each filter has a module name assigned.
+      $this->assertTrue(!empty($filter->module), format_string('filter_list_format: Proper module name for %filter in text format %format.', $t_args));
+
+      // Remove the filter from the copy of saved $format to check whether all
+      // filters have been processed later.
+      unset($format_filters[$name]);
+    }
+    // Verify that all filters have been processed.
+    $this->assertTrue(empty($format_filters), 'filter_list_format: Loaded filters contain values for all filters in the saved format.');
+  }
+}
+
+/**
+ * Tests the administrative functionality of the Filter module.
+ */
+class FilterAdminTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Filter administration functionality',
+      'description' => 'Thoroughly test the administrative interface of the filter module.',
+      'group' => 'Filter',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Create users.
+    $filtered_html_format = filter_format_load('filtered_html');
+    $full_html_format = filter_format_load('full_html');
+    $this->admin_user = $this->drupalCreateUser(array(
+      'administer filters',
+      filter_permission_name($filtered_html_format),
+      filter_permission_name($full_html_format),
+    ));
+
+    $this->web_user = $this->drupalCreateUser(array('create page content', 'edit own page content'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Tests the format administration functionality.
+   */
+  function testFormatAdmin() {
+    // Add text format.
+    $this->drupalGet('admin/config/content/formats');
+    $this->clickLink('Add text format');
+    $format_id = drupal_strtolower($this->randomName());
+    $name = $this->randomName();
+    $edit = array(
+      'format' => $format_id,
+      'name' => $name,
+    );
+    $this->drupalPost(NULL, $edit, t('Save configuration'));
+
+    // Verify default weight of the text format.
+    $this->drupalGet('admin/config/content/formats');
+    $this->assertFieldByName("formats[$format_id][weight]", 0, 'Text format weight was saved.');
+
+    // Change the weight of the text format.
+    $edit = array(
+      "formats[$format_id][weight]" => 5,
+    );
+    $this->drupalPost('admin/config/content/formats', $edit, t('Save changes'));
+    $this->assertFieldByName("formats[$format_id][weight]", 5, 'Text format weight was saved.');
+
+    // Edit text format.
+    $this->drupalGet('admin/config/content/formats');
+    $this->assertLinkByHref('admin/config/content/formats/' . $format_id);
+    $this->drupalGet('admin/config/content/formats/' . $format_id);
+    $this->drupalPost(NULL, array(), t('Save configuration'));
+
+    // Verify that the custom weight of the text format has been retained.
+    $this->drupalGet('admin/config/content/formats');
+    $this->assertFieldByName("formats[$format_id][weight]", 5, 'Text format weight was retained.');
+
+    // Disable text format.
+    $this->assertLinkByHref('admin/config/content/formats/' . $format_id . '/disable');
+    $this->drupalGet('admin/config/content/formats/' . $format_id . '/disable');
+    $this->drupalPost(NULL, array(), t('Disable'));
+
+    // Verify that disabled text format no longer exists.
+    $this->drupalGet('admin/config/content/formats/' . $format_id);
+    $this->assertResponse(404, 'Disabled text format no longer exists.');
+
+    // Attempt to create a format of the same machine name as the disabled
+    // format but with a different human readable name.
+    $edit = array(
+      'format' => $format_id,
+      'name' => 'New format',
+    );
+    $this->drupalPost('admin/config/content/formats/add', $edit, t('Save configuration'));
+    $this->assertText('The machine-readable name is already in use. It must be unique.');
+
+    // Attempt to create a format of the same human readable name as the
+    // disabled format but with a different machine name.
+    $edit = array(
+      'format' => 'new_format',
+      'name' => $name,
+    );
+    $this->drupalPost('admin/config/content/formats/add', $edit, t('Save configuration'));
+    $this->assertRaw(t('Text format names must be unique. A format named %name already exists.', array(
+      '%name' => $name,
+    )));
+  }
+
+  /**
+   * Tests filter administration functionality.
+   */
+  function testFilterAdmin() {
+    // URL filter.
+    $first_filter = 'filter_url';
+    // Line filter.
+    $second_filter = 'filter_autop';
+
+    $filtered = 'filtered_html';
+    $full = 'full_html';
+    $plain = 'plain_text';
+
+    // Check that the fallback format exists and cannot be disabled.
+    $this->assertTrue($plain == filter_fallback_format(), 'The fallback format is set to plain text.');
+    $this->drupalGet('admin/config/content/formats');
+    $this->assertNoRaw('admin/config/content/formats/' . $plain . '/disable', 'Disable link for the fallback format not found.');
+    $this->drupalGet('admin/config/content/formats/' . $plain . '/disable');
+    $this->assertResponse(403, 'The fallback format cannot be disabled.');
+
+    // Verify access permissions to Full HTML format.
+    $this->assertTrue(filter_access(filter_format_load($full), $this->admin_user), 'Admin user may use Full HTML.');
+    $this->assertFalse(filter_access(filter_format_load($full), $this->web_user), 'Web user may not use Full HTML.');
+
+    // Add an additional tag.
+    $edit = array();
+    $edit['filters[filter_html][settings][allowed_html]'] = '<a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <quote>';
+    $this->drupalPost('admin/config/content/formats/' . $filtered, $edit, t('Save configuration'));
+    $this->assertFieldByName('filters[filter_html][settings][allowed_html]', $edit['filters[filter_html][settings][allowed_html]'], 'Allowed HTML tag added.');
+
+    $result = db_query('SELECT * FROM {cache_filter}')->fetchObject();
+    $this->assertFalse($result, 'Cache cleared.');
+
+    $elements = $this->xpath('//select[@name=:first]/following::select[@name=:second]', array(
+      ':first' => 'filters[' . $first_filter . '][weight]',
+      ':second' => 'filters[' . $second_filter . '][weight]',
+    ));
+    $this->assertTrue(!empty($elements), 'Order confirmed in admin interface.');
+
+    // Reorder filters.
+    $edit = array();
+    $edit['filters[' . $second_filter . '][weight]'] = 1;
+    $edit['filters[' . $first_filter . '][weight]'] = 2;
+    $this->drupalPost(NULL, $edit, t('Save configuration'));
+    $this->assertFieldByName('filters[' . $second_filter . '][weight]', 1, 'Order saved successfully.');
+    $this->assertFieldByName('filters[' . $first_filter . '][weight]', 2, 'Order saved successfully.');
+
+    $elements = $this->xpath('//select[@name=:first]/following::select[@name=:second]', array(
+      ':first' => 'filters[' . $second_filter . '][weight]',
+      ':second' => 'filters[' . $first_filter . '][weight]',
+    ));
+    $this->assertTrue(!empty($elements), 'Reorder confirmed in admin interface.');
+
+    $result = db_query('SELECT * FROM {filter} WHERE format = :format ORDER BY weight ASC', array(':format' => $filtered));
+    $filters = array();
+    foreach ($result as $filter) {
+      if ($filter->name == $second_filter || $filter->name == $first_filter) {
+        $filters[] = $filter;
+      }
+    }
+    $this->assertTrue(($filters[0]->name == $second_filter && $filters[1]->name == $first_filter), 'Order confirmed in database.');
+
+    // Add format.
+    $edit = array();
+    $edit['format'] = drupal_strtolower($this->randomName());
+    $edit['name'] = $this->randomName();
+    $edit['roles[' . DRUPAL_AUTHENTICATED_RID . ']'] = 1;
+    $edit['filters[' . $second_filter . '][status]'] = TRUE;
+    $edit['filters[' . $first_filter . '][status]'] = TRUE;
+    $this->drupalPost('admin/config/content/formats/add', $edit, t('Save configuration'));
+    $this->assertRaw(t('Added text format %format.', array('%format' => $edit['name'])), 'New filter created.');
+
+    drupal_static_reset('filter_formats');
+    $format = filter_format_load($edit['format']);
+    $this->assertNotNull($format, 'Format found in database.');
+
+    $this->assertFieldByName('roles[' . DRUPAL_AUTHENTICATED_RID . ']', '', 'Role found.');
+    $this->assertFieldByName('filters[' . $second_filter . '][status]', '', 'Line break filter found.');
+    $this->assertFieldByName('filters[' . $first_filter . '][status]', '', 'Url filter found.');
+
+    // Disable new filter.
+    $this->drupalPost('admin/config/content/formats/' . $format->format . '/disable', array(), t('Disable'));
+    $this->assertRaw(t('Disabled text format %format.', array('%format' => $edit['name'])), 'Format successfully disabled.');
+
+    // Allow authenticated users on full HTML.
+    $format = filter_format_load($full);
+    $edit = array();
+    $edit['roles[' . DRUPAL_ANONYMOUS_RID . ']'] = 0;
+    $edit['roles[' . DRUPAL_AUTHENTICATED_RID . ']'] = 1;
+    $this->drupalPost('admin/config/content/formats/' . $full, $edit, t('Save configuration'));
+    $this->assertRaw(t('The text format %format has been updated.', array('%format' => $format->name)), 'Full HTML format successfully updated.');
+
+    // Switch user.
+    $this->drupalLogout();
+    $this->drupalLogin($this->web_user);
+
+    $this->drupalGet('node/add/page');
+    $this->assertRaw('<option value="' . $full . '">Full HTML</option>', 'Full HTML filter accessible.');
+
+    // Use filtered HTML and see if it removes tags that are not allowed.
+    $body = '<em>' . $this->randomName() . '</em>';
+    $extra_text = 'text';
+    $text = $body . '<random>' . $extra_text . '</random>';
+
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = $this->randomName();
+    $edit["body[$langcode][0][value]"] = $text;
+    $edit["body[$langcode][0][format]"] = $filtered;
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->assertRaw(t('Basic page %title has been created.', array('%title' => $edit["title"])), 'Filtered node created.');
+
+    $node = $this->drupalGetNodeByTitle($edit["title"]);
+    $this->assertTrue($node, 'Node found in database.');
+
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw($body . $extra_text, 'Filter removed invalid tag.');
+
+    // Use plain text and see if it escapes all tags, whether allowed or not.
+    $edit = array();
+    $edit["body[$langcode][0][format]"] = $plain;
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText(check_plain($text), 'The "Plain text" text format escapes all HTML tags.');
+
+    // Switch user.
+    $this->drupalLogout();
+    $this->drupalLogin($this->admin_user);
+
+    // Clean up.
+    // Allowed tags.
+    $edit = array();
+    $edit['filters[filter_html][settings][allowed_html]'] = '<a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>';
+    $this->drupalPost('admin/config/content/formats/' . $filtered, $edit, t('Save configuration'));
+    $this->assertFieldByName('filters[filter_html][settings][allowed_html]', $edit['filters[filter_html][settings][allowed_html]'], 'Changes reverted.');
+
+    // Full HTML.
+    $edit = array();
+    $edit['roles[' . DRUPAL_AUTHENTICATED_RID . ']'] = FALSE;
+    $this->drupalPost('admin/config/content/formats/' . $full, $edit, t('Save configuration'));
+    $this->assertRaw(t('The text format %format has been updated.', array('%format' => $format->name)), 'Full HTML format successfully reverted.');
+    $this->assertFieldByName('roles[' . DRUPAL_AUTHENTICATED_RID . ']', $edit['roles[' . DRUPAL_AUTHENTICATED_RID . ']'], 'Changes reverted.');
+
+    // Filter order.
+    $edit = array();
+    $edit['filters[' . $second_filter . '][weight]'] = 2;
+    $edit['filters[' . $first_filter . '][weight]'] = 1;
+    $this->drupalPost('admin/config/content/formats/' . $filtered, $edit, t('Save configuration'));
+    $this->assertFieldByName('filters[' . $second_filter . '][weight]', $edit['filters[' . $second_filter . '][weight]'], 'Changes reverted.');
+    $this->assertFieldByName('filters[' . $first_filter . '][weight]', $edit['filters[' . $first_filter . '][weight]'], 'Changes reverted.');
+  }
+
+  /**
+   * Tests the URL filter settings form is properly validated.
+   */
+  function testUrlFilterAdmin() {
+    // The form does not save with an invalid filter URL length.
+    $edit = array(
+      'filters[filter_url][settings][filter_url_length]' => $this->randomName(4),
+    );
+    $this->drupalPost('admin/config/content/formats/filtered_html', $edit, t('Save configuration'));
+    $this->assertNoRaw(t('The text format %format has been updated.', array('%format' => 'Filtered HTML')));
+  }
+}
+
+/**
+ * Tests the filter format access functionality in the Filter module.
+ */
+class FilterFormatAccessTestCase extends DrupalWebTestCase {
+  /**
+   * A user with administrative permissions.
+   *
+   * @var object
+   */
+  protected $admin_user;
+
+  /**
+   * A user with 'administer filters' permission.
+   *
+   * @var object
+   */
+  protected $filter_admin_user;
+
+  /**
+   * A user with permission to create and edit own content.
+   *
+   * @var object
+   */
+  protected $web_user;
+
+  /**
+   * An object representing an allowed text format.
+   *
+   * @var object
+   */
+  protected $allowed_format;
+
+  /**
+   * An object representing a disallowed text format.
+   *
+   * @var object
+   */
+  protected $disallowed_format;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Filter format access',
+      'description' => 'Tests access to text formats.',
+      'group' => 'Filter',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Create a user who can administer text formats, but does not have
+    // specific permission to use any of them.
+    $this->filter_admin_user = $this->drupalCreateUser(array(
+      'administer filters',
+      'create page content',
+      'edit any page content',
+    ));
+
+    // Create two text formats.
+    $this->drupalLogin($this->filter_admin_user);
+    $formats = array();
+    for ($i = 0; $i < 2; $i++) {
+      $edit = array(
+        'format' => drupal_strtolower($this->randomName()),
+        'name' => $this->randomName(),
+      );
+      $this->drupalPost('admin/config/content/formats/add', $edit, t('Save configuration'));
+      $this->resetFilterCaches();
+      $formats[] = filter_format_load($edit['format']);
+    }
+    list($this->allowed_format, $this->disallowed_format) = $formats;
+    $this->drupalLogout();
+
+    // Create a regular user with access to one of the formats.
+    $this->web_user = $this->drupalCreateUser(array(
+      'create page content',
+      'edit any page content',
+      filter_permission_name($this->allowed_format),
+    ));
+
+    // Create an administrative user who has access to use both formats.
+    $this->admin_user = $this->drupalCreateUser(array(
+      'administer filters',
+      'create page content',
+      'edit any page content',
+      filter_permission_name($this->allowed_format),
+      filter_permission_name($this->disallowed_format),
+    ));
+  }
+
+  /**
+   * Tests the Filter format access permissions functionality.
+   */
+  function testFormatPermissions() {
+    // Make sure that a regular user only has access to the text format they
+    // were granted access to, as well to the fallback format.
+    $this->assertTrue(filter_access($this->allowed_format, $this->web_user), 'A regular user has access to a text format they were granted access to.');
+    $this->assertFalse(filter_access($this->disallowed_format, $this->web_user), 'A regular user does not have access to a text format they were not granted access to.');
+    $this->assertTrue(filter_access(filter_format_load(filter_fallback_format()), $this->web_user), 'A regular user has access to the fallback format.');
+
+    // Perform similar checks as above, but now against the entire list of
+    // available formats for this user.
+    $this->assertTrue(in_array($this->allowed_format->format, array_keys(filter_formats($this->web_user))), 'The allowed format appears in the list of available formats for a regular user.');
+    $this->assertFalse(in_array($this->disallowed_format->format, array_keys(filter_formats($this->web_user))), 'The disallowed format does not appear in the list of available formats for a regular user.');
+    $this->assertTrue(in_array(filter_fallback_format(), array_keys(filter_formats($this->web_user))), 'The fallback format appears in the list of available formats for a regular user.');
+
+    // Make sure that a regular user only has permission to use the format
+    // they were granted access to.
+    $this->assertTrue(user_access(filter_permission_name($this->allowed_format), $this->web_user), 'A regular user has permission to use the allowed text format.');
+    $this->assertFalse(user_access(filter_permission_name($this->disallowed_format), $this->web_user), 'A regular user does not have permission to use the disallowed text format.');
+
+    // Make sure that the allowed format appears on the node form and that
+    // the disallowed format does not.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('node/add/page');
+    $langcode = LANGUAGE_NONE;
+    $elements = $this->xpath('//select[@name=:name]/option', array(
+      ':name' => "body[$langcode][0][format]",
+      ':option' => $this->allowed_format->format,
+    ));
+    $options = array();
+    foreach ($elements as $element) {
+      $options[(string) $element['value']] = $element;
+    }
+    $this->assertTrue(isset($options[$this->allowed_format->format]), 'The allowed text format appears as an option when adding a new node.');
+    $this->assertFalse(isset($options[$this->disallowed_format->format]), 'The disallowed text format does not appear as an option when adding a new node.');
+    $this->assertTrue(isset($options[filter_fallback_format()]), 'The fallback format appears as an option when adding a new node.');
+  }
+
+  /**
+   * Tests if text format is available to a role.
+   */
+  function testFormatRoles() {
+    // Get the role ID assigned to the regular user; it must be the maximum.
+    $rid = max(array_keys($this->web_user->roles));
+
+    // Check that this role appears in the list of roles that have access to an
+    // allowed text format, but does not appear in the list of roles that have
+    // access to a disallowed text format.
+    $this->assertTrue(in_array($rid, array_keys(filter_get_roles_by_format($this->allowed_format))), 'A role which has access to a text format appears in the list of roles that have access to that format.');
+    $this->assertFalse(in_array($rid, array_keys(filter_get_roles_by_format($this->disallowed_format))), 'A role which does not have access to a text format does not appear in the list of roles that have access to that format.');
+
+    // Check that the correct text format appears in the list of formats
+    // available to that role.
+    $this->assertTrue(in_array($this->allowed_format->format, array_keys(filter_get_formats_by_role($rid))), 'A text format which a role has access to appears in the list of formats available to that role.');
+    $this->assertFalse(in_array($this->disallowed_format->format, array_keys(filter_get_formats_by_role($rid))), 'A text format which a role does not have access to does not appear in the list of formats available to that role.');
+
+    // Check that the fallback format is always allowed.
+    $this->assertEqual(filter_get_roles_by_format(filter_format_load(filter_fallback_format())), user_roles(), 'All roles have access to the fallback format.');
+    $this->assertTrue(in_array(filter_fallback_format(), array_keys(filter_get_formats_by_role($rid))), 'The fallback format appears in the list of allowed formats for any role.');
+  }
+
+  /**
+   * Tests editing a page using a disallowed text format.
+   *
+   * Verifies that regular users and administrators are able to edit a page, but
+   * not allowed to change the fields which use an inaccessible text format.
+   * Also verifies that fields which use a text format that does not exist can
+   * be edited by administrators only, but that the administrator is forced to
+   * choose a new format before saving the page.
+   */
+  function testFormatWidgetPermissions() {
+    $langcode = LANGUAGE_NONE;
+    $title_key = "title";
+    $body_value_key = "body[$langcode][0][value]";
+    $body_format_key = "body[$langcode][0][format]";
+
+    // Create node to edit.
+    $this->drupalLogin($this->admin_user);
+    $edit = array();
+    $edit['title'] = $this->randomName(8);
+    $edit[$body_value_key] = $this->randomName(16);
+    $edit[$body_format_key] = $this->disallowed_format->format;
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $node = $this->drupalGetNodeByTitle($edit['title']);
+
+    // Try to edit with a less privileged user.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('node/' . $node->nid);
+    $this->clickLink(t('Edit'));
+
+    // Verify that body field is read-only and contains replacement value.
+    $this->assertFieldByXPath("//textarea[@name='$body_value_key' and @disabled='disabled']", t('This field has been disabled because you do not have sufficient permissions to edit it.'), 'Text format access denied message found.');
+
+    // Verify that title can be changed, but preview displays original body.
+    $new_edit = array();
+    $new_edit['title'] = $this->randomName(8);
+    $this->drupalPost(NULL, $new_edit, t('Preview'));
+    $this->assertText($edit[$body_value_key], 'Old body found in preview.');
+
+    // Save and verify that only the title was changed.
+    $this->drupalPost(NULL, $new_edit, t('Save'));
+    $this->assertNoText($edit['title'], 'Old title not found.');
+    $this->assertText($new_edit['title'], 'New title found.');
+    $this->assertText($edit[$body_value_key], 'Old body found.');
+
+    // Check that even an administrator with "administer filters" permission
+    // cannot edit the body field if they do not have specific permission to
+    // use its stored format. (This must be disallowed so that the
+    // administrator is never forced to switch the text format to something
+    // else.)
+    $this->drupalLogin($this->filter_admin_user);
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertFieldByXPath("//textarea[@name='$body_value_key' and @disabled='disabled']", t('This field has been disabled because you do not have sufficient permissions to edit it.'), 'Text format access denied message found.');
+
+    // Disable the text format used above.
+    filter_format_disable($this->disallowed_format);
+    $this->resetFilterCaches();
+
+    // Log back in as the less privileged user and verify that the body field
+    // is still disabled, since the less privileged user should not be able to
+    // edit content that does not have an assigned format.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertFieldByXPath("//textarea[@name='$body_value_key' and @disabled='disabled']", t('This field has been disabled because you do not have sufficient permissions to edit it.'), 'Text format access denied message found.');
+
+    // Log back in as the filter administrator and verify that the body field
+    // can be edited.
+    $this->drupalLogin($this->filter_admin_user);
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertNoFieldByXPath("//textarea[@name='$body_value_key' and @disabled='disabled']", NULL, 'Text format access denied message not found.');
+    $this->assertFieldByXPath("//select[@name='$body_format_key']", NULL, 'Text format selector found.');
+
+    // Verify that trying to save the node without selecting a new text format
+    // produces an error message, and does not result in the node being saved.
+    $old_title = $new_edit['title'];
+    $new_title = $this->randomName(8);
+    $edit = array('title' => $new_title);
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->assertText(t('!name field is required.', array('!name' => t('Text format'))), 'Error message is displayed.');
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($old_title, 'Old title found.');
+    $this->assertNoText($new_title, 'New title not found.');
+
+    // Now select a new text format and make sure the node can be saved.
+    $edit[$body_format_key] = filter_fallback_format();
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->assertUrl('node/' . $node->nid);
+    $this->assertText($new_title, 'New title found.');
+    $this->assertNoText($old_title, 'Old title not found.');
+
+    // Switch the text format to a new one, then disable that format and all
+    // other formats on the site (leaving only the fallback format).
+    $this->drupalLogin($this->admin_user);
+    $edit = array($body_format_key => $this->allowed_format->format);
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->assertUrl('node/' . $node->nid);
+    foreach (filter_formats() as $format) {
+      if ($format->format != filter_fallback_format()) {
+        filter_format_disable($format);
+      }
+    }
+
+    // Since there is now only one available text format, the widget for
+    // selecting a text format would normally not display when the content is
+    // edited. However, we need to verify that the filter administrator still
+    // is forced to make a conscious choice to reassign the text to a different
+    // format.
+    $this->drupalLogin($this->filter_admin_user);
+    $old_title = $new_title;
+    $new_title = $this->randomName(8);
+    $edit = array('title' => $new_title);
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->assertText(t('!name field is required.', array('!name' => t('Text format'))), 'Error message is displayed.');
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($old_title, 'Old title found.');
+    $this->assertNoText($new_title, 'New title not found.');
+    $edit[$body_format_key] = filter_fallback_format();
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->assertUrl('node/' . $node->nid);
+    $this->assertText($new_title, 'New title found.');
+    $this->assertNoText($old_title, 'Old title not found.');
+  }
+
+  /**
+   * Rebuilds text format and permission caches in the thread running the tests.
+   */
+  protected function resetFilterCaches() {
+    filter_formats_reset();
+    $this->checkPermissions(array(), TRUE);
+  }
+}
+
+/**
+ * Tests the default filter functionality in the Filter module.
+ */
+class FilterDefaultFormatTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Default text format functionality',
+      'description' => 'Test the default text formats for different users.',
+      'group' => 'Filter',
+    );
+  }
+
+  /**
+   * Tests if the default text format is accessible to users.
+   */
+  function testDefaultTextFormats() {
+    // Create two text formats, and two users. The first user has access to
+    // both formats, but the second user only has access to the second one.
+    $admin_user = $this->drupalCreateUser(array('administer filters'));
+    $this->drupalLogin($admin_user);
+    $formats = array();
+    for ($i = 0; $i < 2; $i++) {
+      $edit = array(
+        'format' => drupal_strtolower($this->randomName()),
+        'name' => $this->randomName(),
+      );
+      $this->drupalPost('admin/config/content/formats/add', $edit, t('Save configuration'));
+      $this->resetFilterCaches();
+      $formats[] = filter_format_load($edit['format']);
+    }
+    list($first_format, $second_format) = $formats;
+    $first_user = $this->drupalCreateUser(array(filter_permission_name($first_format), filter_permission_name($second_format)));
+    $second_user = $this->drupalCreateUser(array(filter_permission_name($second_format)));
+
+    // Adjust the weights so that the first and second formats (in that order)
+    // are the two lowest weighted formats available to any user.
+    $minimum_weight = db_query("SELECT MIN(weight) FROM {filter_format}")->fetchField();
+    $edit = array();
+    $edit['formats[' . $first_format->format . '][weight]'] = $minimum_weight - 2;
+    $edit['formats[' . $second_format->format . '][weight]'] = $minimum_weight - 1;
+    $this->drupalPost('admin/config/content/formats', $edit, t('Save changes'));
+    $this->resetFilterCaches();
+
+    // Check that each user's default format is the lowest weighted format that
+    // the user has access to.
+    $this->assertEqual(filter_default_format($first_user), $first_format->format, "The first user's default format is the lowest weighted format that the user has access to.");
+    $this->assertEqual(filter_default_format($second_user), $second_format->format, "The second user's default format is the lowest weighted format that the user has access to, and is different than the first user's.");
+
+    // Reorder the two formats, and check that both users now have the same
+    // default.
+    $edit = array();
+    $edit['formats[' . $second_format->format . '][weight]'] = $minimum_weight - 3;
+    $this->drupalPost('admin/config/content/formats', $edit, t('Save changes'));
+    $this->resetFilterCaches();
+    $this->assertEqual(filter_default_format($first_user), filter_default_format($second_user), 'After the formats are reordered, both users have the same default format.');
+  }
+
+  /**
+   * Rebuilds text format and permission caches in the thread running the tests.
+   */
+  protected function resetFilterCaches() {
+    filter_formats_reset();
+    $this->checkPermissions(array(), TRUE);
+  }
+}
+
+/**
+ * Tests the behavior of check_markup() when it is called without text format.
+ */
+class FilterNoFormatTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Unassigned text format functionality',
+      'description' => 'Test the behavior of check_markup() when it is called without a text format.',
+      'group' => 'Filter',
+    );
+  }
+
+  /**
+   * Tests text without format.
+   *
+   * Tests if text with no format is filtered the same way as text in the
+   * fallback format.
+   */
+  function testCheckMarkupNoFormat() {
+    // Create some text. Include some HTML and line breaks, so we get a good
+    // test of the filtering that is applied to it.
+    $text = "<strong>" . $this->randomName(32) . "</strong>\n\n<div>" . $this->randomName(32) . "</div>";
+
+    // Make sure that when this text is run through check_markup() with no text
+    // format, it is filtered as though it is in the fallback format.
+    $this->assertEqual(check_markup($text), check_markup($text, filter_fallback_format()), 'Text with no format is filtered the same as text in the fallback format.');
+  }
+}
+
+/**
+ * Security tests for missing/vanished text formats or filters.
+ */
+class FilterSecurityTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Security',
+      'description' => 'Test the behavior of check_markup() when a filter or text format vanishes.',
+      'group' => 'Filter',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('php', 'filter_test');
+    $this->admin_user = $this->drupalCreateUser(array('administer modules', 'administer filters', 'administer site configuration'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Tests removal of filtered content when an active filter is disabled.
+   *
+   * Tests that filtered content is emptied when an actively used filter module
+   * is disabled.
+   */
+  function testDisableFilterModule() {
+    // Create a new node.
+    $node = $this->drupalCreateNode(array('promote' => 1));
+    $body_raw = $node->body[LANGUAGE_NONE][0]['value'];
+    $format_id = $node->body[LANGUAGE_NONE][0]['format'];
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($body_raw, 'Node body found.');
+
+    // Enable the filter_test_replace filter.
+    $edit = array(
+      'filters[filter_test_replace][status]' => 1,
+    );
+    $this->drupalPost('admin/config/content/formats/' . $format_id, $edit, t('Save configuration'));
+
+    // Verify that filter_test_replace filter replaced the content.
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertNoText($body_raw, 'Node body not found.');
+    $this->assertText('Filter: Testing filter', 'Testing filter output found.');
+
+    // Disable the text format entirely.
+    $this->drupalPost('admin/config/content/formats/' . $format_id . '/disable', array(), t('Disable'));
+
+    // Verify that the content is empty, because the text format does not exist.
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertNoText($body_raw, 'Node body not found.');
+  }
+}
+
+/**
+ * Unit tests for core filters.
+ */
+class FilterUnitTestCase extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Filter module filters',
+      'description' => 'Tests Filter module filters individually.',
+      'group' => 'Filter',
+    );
+  }
+
+  /**
+   * Tests the line break filter.
+   */
+  function testLineBreakFilter() {
+    // Setup dummy filter object.
+    $filter = new stdClass();
+    $filter->callback = '_filter_autop';
+
+    // Since the line break filter naturally needs plenty of newlines in test
+    // strings and expectations, we're using "\n" instead of regular newlines
+    // here.
+    $tests = array(
+      // Single line breaks should be changed to <br /> tags, while paragraphs
+      // separated with double line breaks should be enclosed with <p></p> tags.
+      "aaa\nbbb\n\nccc" => array(
+        "<p>aaa<br />\nbbb</p>\n<p>ccc</p>" => TRUE,
+      ),
+      // Skip contents of certain block tags entirely.
+      "<script>aaa\nbbb\n\nccc</script>
+<style>aaa\nbbb\n\nccc</style>
+<pre>aaa\nbbb\n\nccc</pre>
+<object>aaa\nbbb\n\nccc</object>
+<iframe>aaa\nbbb\n\nccc</iframe>
+" => array(
+        "<script>aaa\nbbb\n\nccc</script>" => TRUE,
+        "<style>aaa\nbbb\n\nccc</style>" => TRUE,
+        "<pre>aaa\nbbb\n\nccc</pre>" => TRUE,
+        "<object>aaa\nbbb\n\nccc</object>" => TRUE,
+        "<iframe>aaa\nbbb\n\nccc</iframe>" => TRUE,
+      ),
+      // Skip comments entirely.
+      "One. <!-- comment --> Two.\n<!--\nThree.\n-->\n" => array(
+        '<!-- comment -->' => TRUE,
+        "<!--\nThree.\n-->" => TRUE,
+      ),
+      // Resulting HTML should produce matching paragraph tags.
+      '<p><div>  </div></p>' => array(
+        "<p>\n<div>  </div>\n</p>" => TRUE,
+      ),
+      '<div><p>  </p></div>' => array(
+        "<div>\n</div>" => TRUE,
+      ),
+      '<blockquote><pre>aaa</pre></blockquote>' => array(
+        "<blockquote><pre>aaa</pre></blockquote>" => TRUE,
+      ),
+      "<pre>aaa\nbbb\nccc</pre>\nddd\neee" => array(
+        "<pre>aaa\nbbb\nccc</pre>" => TRUE,
+        "<p>ddd<br />\neee</p>" => TRUE,
+      ),
+      // Comments remain unchanged and subsequent lines/paragraphs are
+      // transformed normally.
+      "aaa<!--comment-->\n\nbbb\n\nccc\n\nddd<!--comment\nwith linebreak-->\n\neee\n\nfff" => array(
+        "<p>aaa</p>\n<!--comment--><p>\nbbb</p>\n<p>ccc</p>\n<p>ddd</p>" => TRUE,
+        "<!--comment\nwith linebreak--><p>\neee</p>\n<p>fff</p>" => TRUE,
+      ),
+      // Check that a comment in a PRE will result that the text after
+      // the comment, but still in PRE, is not transformed.
+      "<pre>aaa\nbbb<!-- comment -->\n\nccc</pre>\nddd" => array(
+        "<pre>aaa\nbbb<!-- comment -->\n\nccc</pre>" => TRUE,
+      ),
+      // Bug 810824, paragraphs were appearing around iframe tags.
+      "<iframe>aaa</iframe>\n\n" => array(
+        "<p><iframe>aaa</iframe></p>" => FALSE,
+      ),
+    );
+    $this->assertFilteredString($filter, $tests);
+
+    // Very long string hitting PCRE limits.
+    $limit = max(ini_get('pcre.backtrack_limit'), ini_get('pcre.recursion_limit'));
+    $source = $this->randomName($limit);
+    $result = _filter_autop($source);
+    $success = $this->assertEqual($result, '<p>' . $source . "</p>\n", 'Line break filter can process very long strings.');
+    if (!$success) {
+      $this->verbose("\n" . $source . "\n<hr />\n" . $result);
+    }
+  }
+
+  /**
+   * Tests limiting allowed tags and XSS prevention.
+   *
+   * XSS tests assume that script is disallowed by default and src is allowed
+   * by default, but on* and style attributes are disallowed.
+   *
+   * Script injection vectors mostly adopted from http://ha.ckers.org/xss.html.
+   *
+   * Relevant CVEs:
+   * - CVE-2002-1806, ~CVE-2005-0682, ~CVE-2005-2106, CVE-2005-3973,
+   *   CVE-2006-1226 (= rev. 1.112?), CVE-2008-0273, CVE-2008-3740.
+   */
+  function testFilterXSS() {
+    // Tag stripping, different ways to work around removal of HTML tags.
+    $f = filter_xss('<script>alert(0)</script>');
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping -- simple script without special characters.');
+
+    $f = filter_xss('<script src="http://www.example.com" />');
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping -- empty script with source.');
+
+    $f = filter_xss('<ScRipt sRc=http://www.example.com/>');
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping evasion -- varying case.');
+
+    $f = filter_xss("<script\nsrc\n=\nhttp://www.example.com/\n>");
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping evasion -- multiline tag.');
+
+    $f = filter_xss('<script/a src=http://www.example.com/a.js></script>');
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping evasion -- non whitespace character after tag name.');
+
+    $f = filter_xss('<script/src=http://www.example.com/a.js></script>');
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping evasion -- no space between tag and attribute.');
+
+    // Null between < and tag name works at least with IE6.
+    $f = filter_xss("<\0scr\0ipt>alert(0)</script>");
+    $this->assertNoNormalized($f, 'ipt', 'HTML tag stripping evasion -- breaking HTML with nulls.');
+
+    $f = filter_xss("<scrscriptipt src=http://www.example.com/a.js>");
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping evasion -- filter just removing "script".');
+
+    $f = filter_xss('<<script>alert(0);//<</script>');
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping evasion -- double opening brackets.');
+
+    $f = filter_xss('<script src=http://www.example.com/a.js?<b>');
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping evasion -- no closing tag.');
+
+    // DRUPAL-SA-2008-047: This doesn't seem exploitable, but the filter should
+    // work consistently.
+    $f = filter_xss('<script>>');
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping evasion -- double closing tag.');
+
+    $f = filter_xss('<script src=//www.example.com/.a>');
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping evasion -- no scheme or ending slash.');
+
+    $f = filter_xss('<script src=http://www.example.com/.a');
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping evasion -- no closing bracket.');
+
+    $f = filter_xss('<script src=http://www.example.com/ <');
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping evasion -- opening instead of closing bracket.');
+
+    $f = filter_xss('<nosuchtag attribute="newScriptInjectionVector">');
+    $this->assertNoNormalized($f, 'nosuchtag', 'HTML tag stripping evasion -- unknown tag.');
+
+    $f = filter_xss('<?xml:namespace ns="urn:schemas-microsoft-com:time">');
+    $this->assertTrue(stripos($f, '<?xml') === FALSE, 'HTML tag stripping evasion -- starting with a question sign (processing instructions).');
+
+    $f = filter_xss('<t:set attributeName="innerHTML" to="&lt;script defer&gt;alert(0)&lt;/script&gt;">');
+    $this->assertNoNormalized($f, 't:set', 'HTML tag stripping evasion -- colon in the tag name (namespaces\' tricks).');
+
+    $f = filter_xss('<img """><script>alert(0)</script>', array('img'));
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping evasion -- a malformed image tag.');
+
+    $f = filter_xss('<blockquote><script>alert(0)</script></blockquote>', array('blockquote'));
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping evasion -- script in a blockqoute.');
+
+    $f = filter_xss("<!--[if true]><script>alert(0)</script><![endif]-->");
+    $this->assertNoNormalized($f, 'script', 'HTML tag stripping evasion -- script within a comment.');
+
+    // Dangerous attributes removal.
+    $f = filter_xss('<p onmouseover="http://www.example.com/">', array('p'));
+    $this->assertNoNormalized($f, 'onmouseover', 'HTML filter attributes removal -- events, no evasion.');
+
+    $f = filter_xss('<li style="list-style-image: url(javascript:alert(0))">', array('li'));
+    $this->assertNoNormalized($f, 'style', 'HTML filter attributes removal -- style, no evasion.');
+
+    $f = filter_xss('<img onerror   =alert(0)>', array('img'));
+    $this->assertNoNormalized($f, 'onerror', 'HTML filter attributes removal evasion -- spaces before equals sign.');
+
+    $f = filter_xss('<img onabort!#$%&()*~+-_.,:;?@[/|\]^`=alert(0)>', array('img'));
+    $this->assertNoNormalized($f, 'onabort', 'HTML filter attributes removal evasion -- non alphanumeric characters before equals sign.');
+
+    $f = filter_xss('<img oNmediAError=alert(0)>', array('img'));
+    $this->assertNoNormalized($f, 'onmediaerror', 'HTML filter attributes removal evasion -- varying case.');
+
+    // Works at least with IE6.
+    $f = filter_xss("<img o\0nfocus\0=alert(0)>", array('img'));
+    $this->assertNoNormalized($f, 'focus', 'HTML filter attributes removal evasion -- breaking with nulls.');
+
+    // Only whitelisted scheme names allowed in attributes.
+    $f = filter_xss('<img src="javascript:alert(0)">', array('img'));
+    $this->assertNoNormalized($f, 'javascript', 'HTML scheme clearing -- no evasion.');
+
+    $f = filter_xss('<img src=javascript:alert(0)>', array('img'));
+    $this->assertNoNormalized($f, 'javascript', 'HTML scheme clearing evasion -- no quotes.');
+
+    // A bit like CVE-2006-0070.
+    $f = filter_xss('<img src="javascript:confirm(0)">', array('img'));
+    $this->assertNoNormalized($f, 'javascript', 'HTML scheme clearing evasion -- no alert ;)');
+
+    $f = filter_xss('<img src=`javascript:alert(0)`>', array('img'));
+    $this->assertNoNormalized($f, 'javascript', 'HTML scheme clearing evasion -- grave accents.');
+
+    $f = filter_xss('<img dynsrc="javascript:alert(0)">', array('img'));
+    $this->assertNoNormalized($f, 'javascript', 'HTML scheme clearing -- rare attribute.');
+
+    $f = filter_xss('<table background="javascript:alert(0)">', array('table'));
+    $this->assertNoNormalized($f, 'javascript', 'HTML scheme clearing -- another tag.');
+
+    $f = filter_xss('<base href="javascript:alert(0);//">', array('base'));
+    $this->assertNoNormalized($f, 'javascript', 'HTML scheme clearing -- one more attribute and tag.');
+
+    $f = filter_xss('<img src="jaVaSCriPt:alert(0)">', array('img'));
+    $this->assertNoNormalized($f, 'javascript', 'HTML scheme clearing evasion -- varying case.');
+
+    $f = filter_xss('<img src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#48;&#41;>', array('img'));
+    $this->assertNoNormalized($f, 'javascript', 'HTML scheme clearing evasion -- UTF-8 decimal encoding.');
+
+    $f = filter_xss('<img src=&#00000106&#0000097&#00000118&#0000097&#00000115&#0000099&#00000114&#00000105&#00000112&#00000116&#0000058&#0000097&#00000108&#00000101&#00000114&#00000116&#0000040&#0000048&#0000041>', array('img'));
+    $this->assertNoNormalized($f, 'javascript', 'HTML scheme clearing evasion -- long UTF-8 encoding.');
+
+    $f = filter_xss('<img src=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x30&#x29>', array('img'));
+    $this->assertNoNormalized($f, 'javascript', 'HTML scheme clearing evasion -- UTF-8 hex encoding.');
+
+    $f = filter_xss("<img src=\"jav\tascript:alert(0)\">", array('img'));
+    $this->assertNoNormalized($f, 'script', 'HTML scheme clearing evasion -- an embedded tab.');
+
+    $f = filter_xss('<img src="jav&#x09;ascript:alert(0)">', array('img'));
+    $this->assertNoNormalized($f, 'script', 'HTML scheme clearing evasion -- an encoded, embedded tab.');
+
+    $f = filter_xss('<img src="jav&#x000000A;ascript:alert(0)">', array('img'));
+    $this->assertNoNormalized($f, 'script', 'HTML scheme clearing evasion -- an encoded, embedded newline.');
+
+    // With &#xD; this test would fail, but the entity gets turned into
+    // &amp;#xD;, so it's OK.
+    $f = filter_xss('<img src="jav&#x0D;ascript:alert(0)">', array('img'));
+    $this->assertNoNormalized($f, 'script', 'HTML scheme clearing evasion -- an encoded, embedded carriage return.');
+
+    $f = filter_xss("<img src=\"\n\n\nj\na\nva\ns\ncript:alert(0)\">", array('img'));
+    $this->assertNoNormalized($f, 'cript', 'HTML scheme clearing evasion -- broken into many lines.');
+
+    $f = filter_xss("<img src=\"jav\0a\0\0cript:alert(0)\">", array('img'));
+    $this->assertNoNormalized($f, 'cript', 'HTML scheme clearing evasion -- embedded nulls.');
+
+    $f = filter_xss('<img src=" &#14;  javascript:alert(0)">', array('img'));
+    $this->assertNoNormalized($f, 'javascript', 'HTML scheme clearing evasion -- spaces and metacharacters before scheme.');
+
+    $f = filter_xss('<img src="vbscript:msgbox(0)">', array('img'));
+    $this->assertNoNormalized($f, 'vbscript', 'HTML scheme clearing evasion -- another scheme.');
+
+    $f = filter_xss('<img src="nosuchscheme:notice(0)">', array('img'));
+    $this->assertNoNormalized($f, 'nosuchscheme', 'HTML scheme clearing evasion -- unknown scheme.');
+
+    // Netscape 4.x javascript entities.
+    $f = filter_xss('<br size="&{alert(0)}">', array('br'));
+    $this->assertNoNormalized($f, 'alert', 'Netscape 4.x javascript entities.');
+
+    // DRUPAL-SA-2008-006: Invalid UTF-8, these only work as reflected XSS with
+    // Internet Explorer 6.
+    $f = filter_xss("<p arg=\"\xe0\">\" style=\"background-image: url(javascript:alert(0));\"\xe0<p>", array('p'));
+    $this->assertNoNormalized($f, 'style', 'HTML filter -- invalid UTF-8.');
+
+    $f = filter_xss("\xc0aaa");
+    $this->assertEqual($f, '', 'HTML filter -- overlong UTF-8 sequences.');
+
+    $f = filter_xss("Who&#039;s Online");
+    $this->assertNormalized($f, "who's online", 'HTML filter -- html entity number');
+
+    $f = filter_xss("Who&amp;#039;s Online");
+    $this->assertNormalized($f, "who&#039;s online", 'HTML filter -- encoded html entity number');
+
+    $f = filter_xss("Who&amp;amp;#039; Online");
+    $this->assertNormalized($f, "who&amp;#039; online", 'HTML filter -- double encoded html entity number');
+  }
+
+  /**
+   * Tests filter settings, defaults, access restrictions and similar.
+   *
+   * @todo This is for functions like filter_filter and check_markup, whose
+   *   functionality is not completely focused on filtering. Some ideas:
+   *   restricting formats according to user permissions, proper cache
+   *   handling, defaults -- allowed tags/attributes/protocols.
+   *
+   * @todo It is possible to add script, iframe etc. to allowed tags, but this
+   *   makes HTML filter completely ineffective.
+   *
+   * @todo Class, id, name and xmlns should be added to disallowed attributes,
+   *   or better a whitelist approach should be used for that too.
+   */
+  function testHtmlFilter() {
+    // Setup dummy filter object.
+    $filter = new stdClass();
+    $filter->settings = array(
+      'allowed_html' => '<a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>',
+      'filter_html_help' => 1,
+      'filter_html_nofollow' => 0,
+    );
+
+    // HTML filter is not able to secure some tags, these should never be
+    // allowed.
+    $f = _filter_html('<script />', $filter);
+    $this->assertNoNormalized($f, 'script', 'HTML filter should always remove script tags.');
+
+    $f = _filter_html('<iframe />', $filter);
+    $this->assertNoNormalized($f, 'iframe', 'HTML filter should always remove iframe tags.');
+
+    $f = _filter_html('<object />', $filter);
+    $this->assertNoNormalized($f, 'object', 'HTML filter should always remove object tags.');
+
+    $f = _filter_html('<style />', $filter);
+    $this->assertNoNormalized($f, 'style', 'HTML filter should always remove style tags.');
+
+    // Some tags make CSRF attacks easier, let the user take the risk herself.
+    $f = _filter_html('<img />', $filter);
+    $this->assertNoNormalized($f, 'img', 'HTML filter should remove img tags on default.');
+
+    $f = _filter_html('<input />', $filter);
+    $this->assertNoNormalized($f, 'img', 'HTML filter should remove input tags on default.');
+
+    // Filtering content of some attributes is infeasible, these shouldn't be
+    // allowed too.
+    $f = _filter_html('<p style="display: none;" />', $filter);
+    $this->assertNoNormalized($f, 'style', 'HTML filter should remove style attribute on default.');
+
+    $f = _filter_html('<p onerror="alert(0);" />', $filter);
+    $this->assertNoNormalized($f, 'onerror', 'HTML filter should remove on* attributes on default.');
+
+    $f = _filter_html('<code onerror>&nbsp;</code>', $filter);
+    $this->assertNoNormalized($f, 'onerror', 'HTML filter should remove empty on* attributes on default.');
+  }
+
+  /**
+   * Tests the spam deterrent.
+   */
+  function testNoFollowFilter() {
+    // Setup dummy filter object.
+    $filter = new stdClass();
+    $filter->settings = array(
+      'allowed_html' => '<a>',
+      'filter_html_help' => 1,
+      'filter_html_nofollow' => 1,
+    );
+
+    // Test if the rel="nofollow" attribute is added, even if we try to prevent
+    // it.
+    $f = _filter_html('<a href="http://www.example.com/">text</a>', $filter);
+    $this->assertNormalized($f, 'rel="nofollow"', 'Spam deterrent -- no evasion.');
+
+    $f = _filter_html('<A href="http://www.example.com/">text</a>', $filter);
+    $this->assertNormalized($f, 'rel="nofollow"', 'Spam deterrent evasion -- capital A.');
+
+    $f = _filter_html("<a/href=\"http://www.example.com/\">text</a>", $filter);
+    $this->assertNormalized($f, 'rel="nofollow"', 'Spam deterrent evasion -- non whitespace character after tag name.');
+
+    $f = _filter_html("<\0a\0 href=\"http://www.example.com/\">text</a>", $filter);
+    $this->assertNormalized($f, 'rel="nofollow"', 'Spam deterrent evasion -- some nulls.');
+
+    $f = _filter_html('<a href="http://www.example.com/" rel="follow">text</a>', $filter);
+    $this->assertNoNormalized($f, 'rel="follow"', 'Spam deterrent evasion -- with rel set - rel="follow" removed.');
+    $this->assertNormalized($f, 'rel="nofollow"', 'Spam deterrent evasion -- with rel set - rel="nofollow" added.');
+  }
+
+  /**
+   * Tests the loose, admin HTML filter.
+   */
+  function testFilterXSSAdmin() {
+    // DRUPAL-SA-2008-044
+    $f = filter_xss_admin('<object />');
+    $this->assertNoNormalized($f, 'object', 'Admin HTML filter -- should not allow object tag.');
+
+    $f = filter_xss_admin('<script />');
+    $this->assertNoNormalized($f, 'script', 'Admin HTML filter -- should not allow script tag.');
+
+    $f = filter_xss_admin('<style /><iframe /><frame /><frameset /><meta /><link /><embed /><applet /><param /><layer />');
+    $this->assertEqual($f, '', 'Admin HTML filter -- should never allow some tags.');
+  }
+
+  /**
+   * Tests the HTML escaping filter.
+   *
+   * check_plain() is not tested here.
+   */
+  function testHtmlEscapeFilter() {
+    // Setup dummy filter object.
+    $filter = new stdClass();
+    $filter->callback = '_filter_html_escape';
+
+    $tests = array(
+      "   One. <!-- \"comment\" --> Two'.\n<p>Three.</p>\n    " => array(
+        "One. &lt;!-- &quot;comment&quot; --&gt; Two&#039;.\n&lt;p&gt;Three.&lt;/p&gt;" => TRUE,
+        '   One.' => FALSE,
+        "</p>\n    " => FALSE,
+      ),
+    );
+    $this->assertFilteredString($filter, $tests);
+  }
+
+  /**
+   * Tests the URL filter.
+   */
+  function testUrlFilter() {
+    // Setup dummy filter object.
+    $filter = new stdClass();
+    $filter->callback = '_filter_url';
+    $filter->settings = array(
+      'filter_url_length' => 496,
+    );
+    // @todo Possible categories:
+    // - absolute, mail, partial
+    // - characters/encoding, surrounding markup, security
+
+    // Create a e-mail that is too long.
+    $long_email = str_repeat('a', 254) . '@example.com';
+    $too_long_email = str_repeat('b', 255) . '@example.com';
+
+
+    // Filter selection/pattern matching.
+    $tests = array(
+      // HTTP URLs.
+      '
+http://example.com or www.example.com
+' => array(
+        '<a href="http://example.com">http://example.com</a>' => TRUE,
+        '<a href="http://www.example.com">www.example.com</a>' => TRUE,
+      ),
+      // MAILTO URLs.
+      '
+person@example.com or mailto:person2@example.com or ' . $long_email . ' but not ' . $too_long_email . '
+' => array(
+        '<a href="mailto:person@example.com">person@example.com</a>' => TRUE,
+        '<a href="mailto:person2@example.com">mailto:person2@example.com</a>' => TRUE,
+        '<a href="mailto:' . $long_email . '">' . $long_email . '</a>' => TRUE,
+        '<a href="mailto:' . $too_long_email . '">' . $too_long_email . '</a>' => FALSE,
+      ),
+      // URI parts and special characters.
+      '
+http://trailingslash.com/ or www.trailingslash.com/
+http://host.com/some/path?query=foo&bar[baz]=beer#fragment or www.host.com/some/path?query=foo&bar[baz]=beer#fragment
+http://twitter.com/#!/example/status/22376963142324226
+ftp://user:pass@ftp.example.com/~home/dir1
+sftp://user@nonstandardport:222/dir
+ssh://192.168.0.100/srv/git/drupal.git
+' => array(
+        '<a href="http://trailingslash.com/">http://trailingslash.com/</a>' => TRUE,
+        '<a href="http://www.trailingslash.com/">www.trailingslash.com/</a>' => TRUE,
+        '<a href="http://host.com/some/path?query=foo&amp;bar[baz]=beer#fragment">http://host.com/some/path?query=foo&amp;bar[baz]=beer#fragment</a>' => TRUE,
+        '<a href="http://www.host.com/some/path?query=foo&amp;bar[baz]=beer#fragment">www.host.com/some/path?query=foo&amp;bar[baz]=beer#fragment</a>' => TRUE,
+        '<a href="http://twitter.com/#!/example/status/22376963142324226">http://twitter.com/#!/example/status/22376963142324226</a>' => TRUE,
+        '<a href="ftp://user:pass@ftp.example.com/~home/dir1">ftp://user:pass@ftp.example.com/~home/dir1</a>' => TRUE,
+        '<a href="sftp://user@nonstandardport:222/dir">sftp://user@nonstandardport:222/dir</a>' => TRUE,
+        '<a href="ssh://192.168.0.100/srv/git/drupal.git">ssh://192.168.0.100/srv/git/drupal.git</a>' => TRUE,
+      ),
+      // Encoding.
+      '
+http://ampersand.com/?a=1&b=2
+http://encoded.com/?a=1&amp;b=2
+' => array(
+        '<a href="http://ampersand.com/?a=1&amp;b=2">http://ampersand.com/?a=1&amp;b=2</a>' => TRUE,
+        '<a href="http://encoded.com/?a=1&amp;b=2">http://encoded.com/?a=1&amp;b=2</a>' => TRUE,
+      ),
+      // Domain name length.
+      '
+www.ex.ex or www.example.example or www.toolongdomainexampledomainexampledomainexampledomainexampledomain or
+me@me.tv
+' => array(
+        '<a href="http://www.ex.ex">www.ex.ex</a>' => TRUE,
+        '<a href="http://www.example.example">www.example.example</a>' => TRUE,
+        'http://www.toolong' => FALSE,
+        '<a href="mailto:me@me.tv">me@me.tv</a>' => TRUE,
+      ),
+      // Absolute URL protocols.
+      // The list to test is found in the beginning of _filter_url() at
+      // $protocols = variable_get('filter_allowed_protocols'... (approx line 1325).
+      '
+https://example.com,
+ftp://ftp.example.com,
+news://example.net,
+telnet://example,
+irc://example.host,
+ssh://odd.geek,
+sftp://secure.host?,
+webcal://calendar,
+rtsp://127.0.0.1,
+not foo://disallowed.com.
+' => array(
+        'href="https://example.com"' => TRUE,
+        'href="ftp://ftp.example.com"' => TRUE,
+        'href="news://example.net"' => TRUE,
+        'href="telnet://example"' => TRUE,
+        'href="irc://example.host"' => TRUE,
+        'href="ssh://odd.geek"' => TRUE,
+        'href="sftp://secure.host"' => TRUE,
+        'href="webcal://calendar"' => TRUE,
+        'href="rtsp://127.0.0.1"' => TRUE,
+        'href="foo://disallowed.com"' => FALSE,
+        'not foo://disallowed.com.' => TRUE,
+      ),
+    );
+    $this->assertFilteredString($filter, $tests);
+
+    // Surrounding text/punctuation.
+    $tests = array(
+      '
+Partial URL with trailing period www.partial.com.
+E-mail with trailing comma person@example.com,
+Absolute URL with trailing question http://www.absolute.com?
+Query string with trailing exclamation www.query.com/index.php?a=!
+Partial URL with 3 trailing www.partial.periods...
+E-mail with 3 trailing exclamations@example.com!!!
+Absolute URL and query string with 2 different punctuation characters (http://www.example.com/q=abc).
+' => array(
+        'period <a href="http://www.partial.com">www.partial.com</a>.' => TRUE,
+        'comma <a href="mailto:person@example.com">person@example.com</a>,' => TRUE,
+        'question <a href="http://www.absolute.com">http://www.absolute.com</a>?' => TRUE,
+        'exclamation <a href="http://www.query.com/index.php?a=">www.query.com/index.php?a=</a>!' => TRUE,
+        'trailing <a href="http://www.partial.periods">www.partial.periods</a>...' => TRUE,
+        'trailing <a href="mailto:exclamations@example.com">exclamations@example.com</a>!!!' => TRUE,
+        'characters (<a href="http://www.example.com/q=abc">http://www.example.com/q=abc</a>).' => TRUE,
+      ),
+      '
+(www.parenthesis.com/dir?a=1&b=2#a)
+' => array(
+        '(<a href="http://www.parenthesis.com/dir?a=1&amp;b=2#a">www.parenthesis.com/dir?a=1&amp;b=2#a</a>)' => TRUE,
+      ),
+    );
+    $this->assertFilteredString($filter, $tests);
+
+    // Surrounding markup.
+    $tests = array(
+      '
+<p xmlns="www.namespace.com" />
+<p xmlns="http://namespace.com">
+An <a href="http://example.com" title="Read more at www.example.info...">anchor</a>.
+</p>
+' => array(
+        '<p xmlns="www.namespace.com" />' => TRUE,
+        '<p xmlns="http://namespace.com">' => TRUE,
+        'href="http://www.namespace.com"' => FALSE,
+        'href="http://namespace.com"' => FALSE,
+        'An <a href="http://example.com" title="Read more at www.example.info...">anchor</a>.' => TRUE,
+      ),
+      '
+Not <a href="foo">www.relative.com</a> or <a href="http://absolute.com">www.absolute.com</a>
+but <strong>http://www.strong.net</strong> or <em>www.emphasis.info</em>
+' => array(
+        '<a href="foo">www.relative.com</a>' => TRUE,
+        'href="http://www.relative.com"' => FALSE,
+        '<a href="http://absolute.com">www.absolute.com</a>' => TRUE,
+        '<strong><a href="http://www.strong.net">http://www.strong.net</a></strong>' => TRUE,
+        '<em><a href="http://www.emphasis.info">www.emphasis.info</a></em>' => TRUE,
+      ),
+      '
+Test <code>using www.example.com the code tag</code>.
+' => array(
+        'href' => FALSE,
+        'http' => FALSE,
+      ),
+      '
+Intro.
+<blockquote>
+Quoted text linking to www.example.com, written by person@example.com, originating from http://origin.example.com. <code>@see www.usage.example.com or <em>www.example.info</em> bla bla</code>.
+</blockquote>
+
+Outro.
+' => array(
+        'href="http://www.example.com"' => TRUE,
+        'href="mailto:person@example.com"' => TRUE,
+        'href="http://origin.example.com"' => TRUE,
+        'http://www.usage.example.com' => FALSE,
+        'http://www.example.info' => FALSE,
+        'Intro.' => TRUE,
+        'Outro.' => TRUE,
+      ),
+      '
+Unknown tag <x>containing x and www.example.com</x>? And a tag <pooh>beginning with p and containing www.example.pooh with p?</pooh>
+' => array(
+        'href="http://www.example.com"' => TRUE,
+        'href="http://www.example.pooh"' => TRUE,
+      ),
+      '
+<p>Test &lt;br/&gt;: This is a www.example17.com example <strong>with</strong> various http://www.example18.com tags. *<br/>
+ It is important www.example19.com to *<br/>test different URLs and http://www.example20.com in the same paragraph. *<br>
+HTML www.example21.com soup by person@example22.com can litererally http://www.example23.com contain *img*<img> anything. Just a www.example24.com with http://www.example25.com thrown in. www.example26.com from person@example27.com with extra http://www.example28.com.
+' => array(
+        'href="http://www.example17.com"' => TRUE,
+        'href="http://www.example18.com"' => TRUE,
+        'href="http://www.example19.com"' => TRUE,
+        'href="http://www.example20.com"' => TRUE,
+        'href="http://www.example21.com"' => TRUE,
+        'href="mailto:person@example22.com"' => TRUE,
+        'href="http://www.example23.com"' => TRUE,
+        'href="http://www.example24.com"' => TRUE,
+        'href="http://www.example25.com"' => TRUE,
+        'href="http://www.example26.com"' => TRUE,
+        'href="mailto:person@example27.com"' => TRUE,
+        'href="http://www.example28.com"' => TRUE,
+      ),
+      '
+<script>
+<!--
+  // @see www.example.com
+  var exampleurl = "http://example.net";
+-->
+<!--//--><![CDATA[//><!--
+  // @see www.example.com
+  var exampleurl = "http://example.net";
+//--><!]]>
+</script>
+' => array(
+        'href="http://www.example.com"' => FALSE,
+        'href="http://example.net"' => FALSE,
+      ),
+      '
+<style>body {
+  background: url(http://example.com/pixel.gif);
+}</style>
+' => array(
+        'href' => FALSE,
+      ),
+      '
+<!-- Skip any URLs like www.example.com in comments -->
+' => array(
+        'href' => FALSE,
+      ),
+      '
+<!-- Skip any URLs like
+www.example.com with a newline in comments -->
+' => array(
+        'href' => FALSE,
+      ),
+      '
+<!-- Skip any URLs like www.comment.com in comments. <p>Also ignore http://commented.out/markup.</p> -->
+' => array(
+        'href' => FALSE,
+      ),
+      '
+<dl>
+<dt>www.example.com</dt>
+<dd>http://example.com</dd>
+<dd>person@example.com</dd>
+<dt>Check www.example.net</dt>
+<dd>Some text around http://www.example.info by person@example.info?</dd>
+</dl>
+' => array(
+        'href="http://www.example.com"' => TRUE,
+        'href="http://example.com"' => TRUE,
+        'href="mailto:person@example.com"' => TRUE,
+        'href="http://www.example.net"' => TRUE,
+        'href="http://www.example.info"' => TRUE,
+        'href="mailto:person@example.info"' => TRUE,
+      ),
+      '
+<div>www.div.com</div>
+<ul>
+<li>http://listitem.com</li>
+<li class="odd">www.class.listitem.com</li>
+</ul>
+' => array(
+        '<div><a href="http://www.div.com">www.div.com</a></div>' => TRUE,
+        '<li><a href="http://listitem.com">http://listitem.com</a></li>' => TRUE,
+        '<li class="odd"><a href="http://www.class.listitem.com">www.class.listitem.com</a></li>' => TRUE,
+      ),
+    );
+    $this->assertFilteredString($filter, $tests);
+
+    // URL trimming.
+    $filter->settings['filter_url_length'] = 20;
+    $tests = array(
+      'www.trimmed.com/d/ff.ext?a=1&b=2#a1' => array(
+        '<a href="http://www.trimmed.com/d/ff.ext?a=1&amp;b=2#a1">www.trimmed.com/d/ff...</a>' => TRUE,
+      ),
+    );
+    $this->assertFilteredString($filter, $tests);
+  }
+
+  /**
+   * Asserts multiple filter output expectations for multiple input strings.
+   *
+   * @param $filter
+   *   A input filter object.
+   * @param $tests
+   *   An associative array, whereas each key is an arbitrary input string and
+   *   each value is again an associative array whose keys are filter output
+   *   strings and whose values are Booleans indicating whether the output is
+   *   expected or not.
+   *
+   * For example:
+   * @code
+   * $tests = array(
+   *   'Input string' => array(
+   *     '<p>Input string</p>' => TRUE,
+   *     'Input string<br' => FALSE,
+   *   ),
+   * );
+   * @endcode
+   */
+  function assertFilteredString($filter, $tests) {
+    foreach ($tests as $source => $tasks) {
+      $function = $filter->callback;
+      $result = $function($source, $filter);
+      foreach ($tasks as $value => $is_expected) {
+        // Not using assertIdentical, since combination with strpos() is hard to grok.
+        if ($is_expected) {
+          $success = $this->assertTrue(strpos($result, $value) !== FALSE, format_string('@source: @value found.', array(
+            '@source' => var_export($source, TRUE),
+            '@value' => var_export($value, TRUE),
+          )));
+        }
+        else {
+          $success = $this->assertTrue(strpos($result, $value) === FALSE, format_string('@source: @value not found.', array(
+            '@source' => var_export($source, TRUE),
+            '@value' => var_export($value, TRUE),
+          )));
+        }
+        if (!$success) {
+          $this->verbose('Source:<pre>' . check_plain(var_export($source, TRUE)) . '</pre>'
+            . '<hr />' . 'Result:<pre>' . check_plain(var_export($result, TRUE)) . '</pre>'
+            . '<hr />' . ($is_expected ? 'Expected:' : 'Not expected:')
+            . '<pre>' . check_plain(var_export($value, TRUE)) . '</pre>'
+          );
+        }
+      }
+    }
+  }
+
+  /**
+   * Tests URL filter on longer content.
+   *
+   * Filters based on regular expressions should also be tested with a more
+   * complex content than just isolated test lines.
+   * The most common errors are:
+   * - accidental '*' (greedy) match instead of '*?' (minimal) match.
+   * - only matching first occurrence instead of all.
+   * - newlines not matching '.*'.
+   *
+   * This test covers:
+   * - Document with multiple newlines and paragraphs (two newlines).
+   * - Mix of several HTML tags, invalid non-HTML tags, tags to ignore and HTML
+   *   comments.
+   * - Empty HTML tags (BR, IMG).
+   * - Mix of absolute and partial URLs, and e-mail addresses in one content.
+   */
+  function testUrlFilterContent() {
+    // Setup dummy filter object.
+    $filter = new stdClass();
+    $filter->settings = array(
+      'filter_url_length' => 496,
+    );
+    $path = drupal_get_path('module', 'filter') . '/tests';
+
+    $input = file_get_contents($path . '/filter.url-input.txt');
+    $expected = file_get_contents($path . '/filter.url-output.txt');
+    $result = _filter_url($input, $filter);
+    $this->assertIdentical($result, $expected, 'Complex HTML document was correctly processed.');
+  }
+
+  /**
+   * Tests the HTML corrector filter.
+   *
+   * @todo This test could really use some validity checking function.
+   */
+  function testHtmlCorrectorFilter() {
+    // Tag closing.
+    $f = _filter_htmlcorrector('<p>text');
+    $this->assertEqual($f, '<p>text</p>', 'HTML corrector -- tag closing at the end of input.');
+
+    $f = _filter_htmlcorrector('<p>text<p><p>text');
+    $this->assertEqual($f, '<p>text</p><p></p><p>text</p>', 'HTML corrector -- tag closing.');
+
+    $f = _filter_htmlcorrector("<ul><li>e1<li>e2");
+    $this->assertEqual($f, "<ul><li>e1</li><li>e2</li></ul>", 'HTML corrector -- unclosed list tags.');
+
+    $f = _filter_htmlcorrector('<div id="d">content');
+    $this->assertEqual($f, '<div id="d">content</div>', 'HTML corrector -- unclosed tag with attribute.');
+
+    // XHTML slash for empty elements.
+    $f = _filter_htmlcorrector('<hr><br>');
+    $this->assertEqual($f, '<hr /><br />', 'HTML corrector -- XHTML closing slash.');
+
+    $f = _filter_htmlcorrector('<P>test</P>');
+    $this->assertEqual($f, '<p>test</p>', 'HTML corrector -- Convert uppercased tags to proper lowercased ones.');
+
+    $f = _filter_htmlcorrector('<P>test</p>');
+    $this->assertEqual($f, '<p>test</p>', 'HTML corrector -- Convert uppercased tags to proper lowercased ones.');
+
+    $f = _filter_htmlcorrector('test<hr />');
+    $this->assertEqual($f, 'test<hr />', 'HTML corrector -- Let proper XHTML pass through.');
+
+    $f = _filter_htmlcorrector('test<hr/>');
+    $this->assertEqual($f, 'test<hr />', 'HTML corrector -- Let proper XHTML pass through, but ensure there is a single space before the closing slash.');
+
+    $f = _filter_htmlcorrector('test<hr    />');
+    $this->assertEqual($f, 'test<hr />', 'HTML corrector -- Let proper XHTML pass through, but ensure there are not too many spaces before the closing slash.');
+
+    $f = _filter_htmlcorrector('<span class="test" />');
+    $this->assertEqual($f, '<span class="test"></span>', 'HTML corrector -- Convert XHTML that is properly formed but that would not be compatible with typical HTML user agents.');
+
+    $f = _filter_htmlcorrector('test1<br class="test">test2');
+    $this->assertEqual($f, 'test1<br class="test" />test2', 'HTML corrector -- Automatically close single tags.');
+
+    $f = _filter_htmlcorrector('line1<hr>line2');
+    $this->assertEqual($f, 'line1<hr />line2', 'HTML corrector -- Automatically close single tags.');
+
+    $f = _filter_htmlcorrector('line1<HR>line2');
+    $this->assertEqual($f, 'line1<hr />line2', 'HTML corrector -- Automatically close single tags.');
+
+    $f = _filter_htmlcorrector('<img src="http://example.com/test.jpg">test</img>');
+    $this->assertEqual($f, '<img src="http://example.com/test.jpg" />test', 'HTML corrector -- Automatically close single tags.');
+
+    $f = _filter_htmlcorrector('<br></br>');
+    $this->assertEqual($f, '<br />', "HTML corrector -- Transform empty tags to a single closed tag if the tag's content model is EMPTY.");
+
+    $f = _filter_htmlcorrector('<div></div>');
+    $this->assertEqual($f, '<div></div>', "HTML corrector -- Do not transform empty tags to a single closed tag if the tag's content model is not EMPTY.");
+
+    $f = _filter_htmlcorrector('<p>line1<br/><hr/>line2</p>');
+    $this->assertEqual($f, '<p>line1<br /></p><hr />line2', 'HTML corrector -- Move non-inline elements outside of inline containers.');
+
+    $f = _filter_htmlcorrector('<p>line1<div>line2</div></p>');
+    $this->assertEqual($f, '<p>line1</p><div>line2</div>', 'HTML corrector -- Move non-inline elements outside of inline containers.');
+
+    $f = _filter_htmlcorrector('<p>test<p>test</p>\n');
+    $this->assertEqual($f, '<p>test</p><p>test</p>\n', 'HTML corrector -- Auto-close improperly nested tags.');
+
+    $f = _filter_htmlcorrector('<p>Line1<br><STRONG>bold stuff</b>');
+    $this->assertEqual($f, '<p>Line1<br /><strong>bold stuff</strong></p>', 'HTML corrector -- Properly close unclosed tags, and remove useless closing tags.');
+
+    $f = _filter_htmlcorrector('test <!-- this is a comment -->');
+    $this->assertEqual($f, 'test <!-- this is a comment -->', 'HTML corrector -- Do not touch HTML comments.');
+
+    $f = _filter_htmlcorrector('test <!--this is a comment-->');
+    $this->assertEqual($f, 'test <!--this is a comment-->', 'HTML corrector -- Do not touch HTML comments.');
+
+    $f = _filter_htmlcorrector('test <!-- comment <p>another
+    <strong>multiple</strong> line
+    comment</p> -->');
+    $this->assertEqual($f, 'test <!-- comment <p>another
+    <strong>multiple</strong> line
+    comment</p> -->', 'HTML corrector -- Do not touch HTML comments.');
+
+    $f = _filter_htmlcorrector('test <!-- comment <p>another comment</p> -->');
+    $this->assertEqual($f, 'test <!-- comment <p>another comment</p> -->', 'HTML corrector -- Do not touch HTML comments.');
+
+    $f = _filter_htmlcorrector('test <!--break-->');
+    $this->assertEqual($f, 'test <!--break-->', 'HTML corrector -- Do not touch HTML comments.');
+
+    $f = _filter_htmlcorrector('<p>test\n</p>\n');
+    $this->assertEqual($f, '<p>test\n</p>\n', 'HTML corrector -- New-lines are accepted and kept as-is.');
+
+    $f = _filter_htmlcorrector('<p>دروبال');
+    $this->assertEqual($f, '<p>دروبال</p>', 'HTML corrector -- Encoding is correctly kept.');
+
+    $f = _filter_htmlcorrector('<script type="text/javascript">alert("test")</script>');
+    $this->assertEqual($f, '<script type="text/javascript">
+<!--//--><![CDATA[// ><!--
+alert("test")
+//--><!]]>
+</script>', 'HTML corrector -- CDATA added to script element');
+
+    $f = _filter_htmlcorrector('<p><script type="text/javascript">alert("test")</script></p>');
+    $this->assertEqual($f, '<p><script type="text/javascript">
+<!--//--><![CDATA[// ><!--
+alert("test")
+//--><!]]>
+</script></p>', 'HTML corrector -- CDATA added to a nested script element');
+
+    $f = _filter_htmlcorrector('<p><style> /* Styling */ body {color:red}</style></p>');
+    $this->assertEqual($f, '<p><style>
+<!--/*--><![CDATA[/* ><!--*/
+ /* Styling */ body {color:red}
+/*--><!]]>*/
+</style></p>', 'HTML corrector -- CDATA added to a style element.');
+
+    $filtered_data = _filter_htmlcorrector('<p><style>
+/*<![CDATA[*/
+/* Styling */
+body {color:red}
+/*]]>*/
+</style></p>');
+    $this->assertEqual($filtered_data, '<p><style>
+<!--/*--><![CDATA[/* ><!--*/
+
+/*<![CDATA[*/
+/* Styling */
+body {color:red}
+/*]]]]><![CDATA[>*/
+
+/*--><!]]>*/
+</style></p>',
+      format_string('HTML corrector -- Existing cdata section @pattern_name properly escaped', array('@pattern_name' => '/*<![CDATA[*/'))
+    );
+
+    $filtered_data = _filter_htmlcorrector('<p><style>
+  <!--/*--><![CDATA[/* ><!--*/
+  /* Styling */
+  body {color:red}
+  /*--><!]]>*/
+</style></p>');
+    $this->assertEqual($filtered_data, '<p><style>
+<!--/*--><![CDATA[/* ><!--*/
+
+  <!--/*--><![CDATA[/* ><!--*/
+  /* Styling */
+  body {color:red}
+  /*--><!]]]]><![CDATA[>*/
+
+/*--><!]]>*/
+</style></p>',
+      format_string('HTML corrector -- Existing cdata section @pattern_name properly escaped', array('@pattern_name' => '<!--/*--><![CDATA[/* ><!--*/'))
+    );
+
+    $filtered_data = _filter_htmlcorrector('<p><script type="text/javascript">
+<!--//--><![CDATA[// ><!--
+  alert("test");
+//--><!]]>
+</script></p>');
+    $this->assertEqual($filtered_data, '<p><script type="text/javascript">
+<!--//--><![CDATA[// ><!--
+
+<!--//--><![CDATA[// ><!--
+  alert("test");
+//--><!]]]]><![CDATA[>
+
+//--><!]]>
+</script></p>',
+      format_string('HTML corrector -- Existing cdata section @pattern_name properly escaped', array('@pattern_name' => '<!--//--><![CDATA[// ><!--'))
+    );
+
+    $filtered_data = _filter_htmlcorrector('<p><script type="text/javascript">
+// <![CDATA[
+  alert("test");
+// ]]>
+</script></p>');
+    $this->assertEqual($filtered_data, '<p><script type="text/javascript">
+<!--//--><![CDATA[// ><!--
+
+// <![CDATA[
+  alert("test");
+// ]]]]><![CDATA[>
+
+//--><!]]>
+</script></p>',
+      format_string('HTML corrector -- Existing cdata section @pattern_name properly escaped', array('@pattern_name' => '// <![CDATA['))
+    );
+
+  }
+
+  /**
+   * Asserts that a text transformed to lowercase with HTML entities decoded does contains a given string.
+   *
+   * Otherwise fails the test with a given message, similar to all the
+   * SimpleTest assert* functions.
+   *
+   * Note that this does not remove nulls, new lines and other characters that
+   * could be used to obscure a tag or an attribute name.
+   *
+   * @param $haystack
+   *   Text to look in.
+   * @param $needle
+   *   Lowercase, plain text to look for.
+   * @param $message
+   *   (optional) Message to display if failed. Defaults to an empty string.
+   * @param $group
+   *   (optional) The group this message belongs to. Defaults to 'Other'.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  function assertNormalized($haystack, $needle, $message = '', $group = 'Other') {
+    return $this->assertTrue(strpos(strtolower(decode_entities($haystack)), $needle) !== FALSE, $message, $group);
+  }
+
+  /**
+   * Asserts that text transformed to lowercase with HTML entities decoded does not contain a given string.
+   *
+   * Otherwise fails the test with a given message, similar to all the
+   * SimpleTest assert* functions.
+   *
+   * Note that this does not remove nulls, new lines, and other character that
+   * could be used to obscure a tag or an attribute name.
+   *
+   * @param $haystack
+   *   Text to look in.
+   * @param $needle
+   *   Lowercase, plain text to look for.
+   * @param $message
+   *   (optional) Message to display if failed. Defaults to an empty string.
+   * @param $group
+   *   (optional) The group this message belongs to. Defaults to 'Other'.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  function assertNoNormalized($haystack, $needle, $message = '', $group = 'Other') {
+    return $this->assertTrue(strpos(strtolower(decode_entities($haystack)), $needle) === FALSE, $message, $group);
+  }
+}
+
+/**
+ * Tests for Filter's hook invocations.
+ */
+class FilterHooksTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Filter format hooks',
+      'description' => 'Test hooks for text formats insert/update/disable.',
+      'group' => 'Filter',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('block', 'filter_test');
+    $admin_user = $this->drupalCreateUser(array('administer filters', 'administer blocks'));
+    $this->drupalLogin($admin_user);
+  }
+
+  /**
+   * Tests hooks on format management.
+   *
+   * Tests that hooks run correctly on creating, editing, and deleting a text
+   * format.
+   */
+  function testFilterHooks() {
+    // Add a text format.
+    $name = $this->randomName();
+    $edit = array();
+    $edit['format'] = drupal_strtolower($this->randomName());
+    $edit['name'] = $name;
+    $edit['roles[' . DRUPAL_ANONYMOUS_RID . ']'] = 1;
+    $this->drupalPost('admin/config/content/formats/add', $edit, t('Save configuration'));
+    $this->assertRaw(t('Added text format %format.', array('%format' => $name)), 'New format created.');
+    $this->assertText('hook_filter_format_insert invoked.', 'hook_filter_format_insert was invoked.');
+
+    $format_id = $edit['format'];
+
+    // Update text format.
+    $edit = array();
+    $edit['roles[' . DRUPAL_AUTHENTICATED_RID . ']'] = 1;
+    $this->drupalPost('admin/config/content/formats/' . $format_id, $edit, t('Save configuration'));
+    $this->assertRaw(t('The text format %format has been updated.', array('%format' => $name)), 'Format successfully updated.');
+    $this->assertText('hook_filter_format_update invoked.', 'hook_filter_format_update() was invoked.');
+
+    // Add a new custom block.
+    $custom_block = array();
+    $custom_block['info'] = $this->randomName(8);
+    $custom_block['title'] = $this->randomName(8);
+    $custom_block['body[value]'] = $this->randomName(32);
+    // Use the format created.
+    $custom_block['body[format]'] = $format_id;
+    $this->drupalPost('admin/structure/block/add', $custom_block, t('Save block'));
+    $this->assertText(t('The block has been created.'), 'New block successfully created.');
+
+    // Verify the new block is in the database.
+    $bid = db_query("SELECT bid FROM {block_custom} WHERE info = :info", array(':info' => $custom_block['info']))->fetchField();
+    $this->assertNotNull($bid, 'New block found in database');
+
+    // Disable the text format.
+    $this->drupalPost('admin/config/content/formats/' . $format_id . '/disable', array(), t('Disable'));
+    $this->assertRaw(t('Disabled text format %format.', array('%format' => $name)), 'Format successfully disabled.');
+    $this->assertText('hook_filter_format_disable invoked.', 'hook_filter_format_disable() was invoked.');
+  }
+}
+
+/**
+ * Tests filter settings.
+ */
+class FilterSettingsTestCase extends DrupalWebTestCase {
+  /**
+   * The installation profile to use with this test class.
+   *
+   * @var string
+   */
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Filter settings',
+      'description' => 'Tests filter settings.',
+      'group' => 'Filter',
+    );
+  }
+
+  /**
+   * Tests explicit and implicit default settings for filters.
+   */
+  function testFilterDefaults() {
+    $filter_info = filter_filter_info();
+    $filters = array_fill_keys(array_keys($filter_info), array());
+
+    // Create text format using filter default settings.
+    $filter_defaults_format = (object) array(
+      'format' => 'filter_defaults',
+      'name' => 'Filter defaults',
+      'filters' => $filters,
+    );
+    filter_format_save($filter_defaults_format);
+
+    // Verify that default weights defined in hook_filter_info() were applied.
+    $saved_settings = array();
+    foreach ($filter_defaults_format->filters as $name => $settings) {
+      $expected_weight = (isset($filter_info[$name]['weight']) ? $filter_info[$name]['weight'] : 0);
+      $this->assertEqual($settings['weight'], $expected_weight, format_string('@name filter weight %saved equals %default', array(
+        '@name' => $name,
+        '%saved' => $settings['weight'],
+        '%default' => $expected_weight,
+      )));
+      $saved_settings[$name]['weight'] = $expected_weight;
+    }
+
+    // Re-save the text format.
+    filter_format_save($filter_defaults_format);
+    // Reload it from scratch.
+    filter_formats_reset();
+    $filter_defaults_format = filter_format_load($filter_defaults_format->format);
+    $filter_defaults_format->filters = filter_list_format($filter_defaults_format->format);
+
+    // Verify that saved filter settings have not been changed.
+    foreach ($filter_defaults_format->filters as $name => $settings) {
+      $this->assertEqual($settings->weight, $saved_settings[$name]['weight'], format_string('@name filter weight %saved equals %previous', array(
+        '@name' => $name,
+        '%saved' => $settings->weight,
+        '%previous' => $saved_settings[$name]['weight'],
+      )));
+    }
+  }
+}
diff --git a/htmltest/modules/filter/tests/filter.url-input.txt b/htmltest/modules/filter/tests/filter.url-input.txt
new file mode 100644
index 00000000..7b33af56
--- /dev/null
+++ b/htmltest/modules/filter/tests/filter.url-input.txt
@@ -0,0 +1,36 @@
+This is just a www.test.com. paragraph with person@test.com. some http://www.test.com. urls thrown in and also <code>using www.test.com the code tag</code>.
+
+<blockquote>
+This is just a www.test.com. paragraph with person@test.com. some http://www.test.com. urls thrown in and also <code>using www.test.com the code tag</code>.
+</blockquote>
+
+<code>Testing code tag http://www.test.com abc</code>
+
+http://www.test.com
+www.test.com
+person@test.com
+<code>www.test.com</code>
+
+What about tags that don't exist <x>like x say www.test.com</x>? And what about tag <pooh>beginning www.test.com with p?</pooh>
+
+Test &lt;br/&gt;: This is just a www.test.com. paragraph <strong>with</strong> some http://www.test.com urls thrown in. *<br/> This is just a www.test.com paragraph *<br/> with some http://www.test.com urls thrown in. *<br/>This is just a www.test.com paragraph person@test.com with some http://www.test.com urls *img*<img/> thrown in. This is just a www.test.com paragraph with some http://www.test.com urls thrown in. This is just a www.test.com paragraph person@test.com with some http://www.test.com urls thrown in.
+
+This is just a www.test.com paragraph <strong>with</strong> some http://www.test.com urls thrown in. <br /> This is just a www.test.com paragraph with some http://www.test.com urls thrown in. This is just a www.test.com paragraph person@test.com with some http://www.test.com urls thrown in. This is just a www.test.com paragraph with some http://www.test.com urls thrown in. This is just a www.test.com paragraph person@test.com with some http://www.test.com urls thrown in.
+
+The old URL filter has problems with <a title="kind of link www.example.com with text" href="http://www.example.com">this kind of link</a> with www address as part of text in title. www.test.com
+
+<!-- This url www.test.com is inside a comment -->
+
+<dl>
+<dt>www.test.com</dt>
+<dd>http://www.test.com</dd>
+<dd>person@test.com</dd>
+<dt>check www.test.com</dt>
+<dd>this with some text around: http://www.test.com not so easy person@test.com now?</dd>
+</dl>
+
+<!-- <p>This url http://www.test.com is
+ inside a comment containing newlines and 
+<em>html</em> tags.</p> -->
+
+This is the end!
\ No newline at end of file
diff --git a/htmltest/modules/filter/tests/filter.url-output.txt b/htmltest/modules/filter/tests/filter.url-output.txt
new file mode 100644
index 00000000..9cc50730
--- /dev/null
+++ b/htmltest/modules/filter/tests/filter.url-output.txt
@@ -0,0 +1,36 @@
+This is just a <a href="http://www.test.com">www.test.com</a>. paragraph with <a href="mailto:person@test.com">person@test.com</a>. some <a href="http://www.test.com">http://www.test.com</a>. urls thrown in and also <code>using www.test.com the code tag</code>.
+
+<blockquote>
+This is just a <a href="http://www.test.com">www.test.com</a>. paragraph with <a href="mailto:person@test.com">person@test.com</a>. some <a href="http://www.test.com">http://www.test.com</a>. urls thrown in and also <code>using www.test.com the code tag</code>.
+</blockquote>
+
+<code>Testing code tag http://www.test.com abc</code>
+
+<a href="http://www.test.com">http://www.test.com</a>
+<a href="http://www.test.com">www.test.com</a>
+<a href="mailto:person@test.com">person@test.com</a>
+<code>www.test.com</code>
+
+What about tags that don't exist <x>like x say <a href="http://www.test.com">www.test.com</a></x>? And what about tag <pooh>beginning <a href="http://www.test.com">www.test.com</a> with p?</pooh>
+
+Test &lt;br/&gt;: This is just a <a href="http://www.test.com">www.test.com</a>. paragraph <strong>with</strong> some <a href="http://www.test.com">http://www.test.com</a> urls thrown in. *<br/> This is just a <a href="http://www.test.com">www.test.com</a> paragraph *<br/> with some <a href="http://www.test.com">http://www.test.com</a> urls thrown in. *<br/>This is just a <a href="http://www.test.com">www.test.com</a> paragraph <a href="mailto:person@test.com">person@test.com</a> with some <a href="http://www.test.com">http://www.test.com</a> urls *img*<img/> thrown in. This is just a <a href="http://www.test.com">www.test.com</a> paragraph with some <a href="http://www.test.com">http://www.test.com</a> urls thrown in. This is just a <a href="http://www.test.com">www.test.com</a> paragraph <a href="mailto:person@test.com">person@test.com</a> with some <a href="http://www.test.com">http://www.test.com</a> urls thrown in.
+
+This is just a <a href="http://www.test.com">www.test.com</a> paragraph <strong>with</strong> some <a href="http://www.test.com">http://www.test.com</a> urls thrown in. <br /> This is just a <a href="http://www.test.com">www.test.com</a> paragraph with some <a href="http://www.test.com">http://www.test.com</a> urls thrown in. This is just a <a href="http://www.test.com">www.test.com</a> paragraph <a href="mailto:person@test.com">person@test.com</a> with some <a href="http://www.test.com">http://www.test.com</a> urls thrown in. This is just a <a href="http://www.test.com">www.test.com</a> paragraph with some <a href="http://www.test.com">http://www.test.com</a> urls thrown in. This is just a <a href="http://www.test.com">www.test.com</a> paragraph <a href="mailto:person@test.com">person@test.com</a> with some <a href="http://www.test.com">http://www.test.com</a> urls thrown in.
+
+The old URL filter has problems with <a title="kind of link www.example.com with text" href="http://www.example.com">this kind of link</a> with www address as part of text in title. <a href="http://www.test.com">www.test.com</a>
+
+<!-- This url www.test.com is inside a comment -->
+
+<dl>
+<dt><a href="http://www.test.com">www.test.com</a></dt>
+<dd><a href="http://www.test.com">http://www.test.com</a></dd>
+<dd><a href="mailto:person@test.com">person@test.com</a></dd>
+<dt>check <a href="http://www.test.com">www.test.com</a></dt>
+<dd>this with some text around: <a href="http://www.test.com">http://www.test.com</a> not so easy <a href="mailto:person@test.com">person@test.com</a> now?</dd>
+</dl>
+
+<!-- <p>This url http://www.test.com is
+ inside a comment containing newlines and 
+<em>html</em> tags.</p> -->
+
+This is the end!
\ No newline at end of file
diff --git a/htmltest/modules/forum/forum-icon.tpl.php b/htmltest/modules/forum/forum-icon.tpl.php
new file mode 100644
index 00000000..fd1cd130
--- /dev/null
+++ b/htmltest/modules/forum/forum-icon.tpl.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Displays an appropriate icon for a forum post.
+ *
+ * Available variables:
+ * - $new_posts: Indicates whether or not the topic contains new posts.
+ * - $icon_class: The icon to display. May be one of 'hot', 'hot-new', 'new',
+ *   'default', 'closed', or 'sticky'.
+ * - $first_new: Indicates whether this is the first topic with new posts.
+ *
+ * @see template_preprocess_forum_icon()
+ * @see theme_forum_icon()
+ *
+ * @ingroup themeable
+ */
+?>
+<div class="topic-status-<?php print $icon_class ?>" title="<?php print $icon_title ?>">
+<?php if ($first_new): ?>
+  <a id="new"></a>
+<?php endif; ?>
+
+  <span class="element-invisible"><?php print $icon_title ?></span>
+
+</div>
diff --git a/htmltest/modules/forum/forum-list.tpl.php b/htmltest/modules/forum/forum-list.tpl.php
new file mode 100644
index 00000000..01c74a34
--- /dev/null
+++ b/htmltest/modules/forum/forum-list.tpl.php
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * @file
+ * Displays a list of forums and containers.
+ *
+ * Available variables:
+ * - $forums: An array of forums and containers to display. It is keyed to the
+ *   numeric IDs of all child forums and containers. Each $forum in $forums
+ *   contains:
+ *   - $forum->is_container: TRUE if the forum can contain other forums. FALSE
+ *     if the forum can contain only topics.
+ *   - $forum->depth: How deep the forum is in the current hierarchy.
+ *   - $forum->zebra: 'even' or 'odd' string used for row class.
+ *   - $forum->icon_class: 'default' or 'new' string used for forum icon class.
+ *   - $forum->icon_title: Text alternative for the forum icon.
+ *   - $forum->name: The name of the forum.
+ *   - $forum->link: The URL to link to this forum.
+ *   - $forum->description: The description of this forum.
+ *   - $forum->new_topics: TRUE if the forum contains unread posts.
+ *   - $forum->new_url: A URL to the forum's unread posts.
+ *   - $forum->new_text: Text for the above URL, which tells how many new posts.
+ *   - $forum->old_topics: A count of posts that have already been read.
+ *   - $forum->num_posts: The total number of posts in the forum.
+ *   - $forum->last_reply: Text representing the last time a forum was posted or
+ *     commented in.
+ * - $forum_id: Forum ID for the current forum. Parent to all items within the
+ *   $forums array.
+ *
+ * @see template_preprocess_forum_list()
+ * @see theme_forum_list()
+ *
+ * @ingroup themeable
+ */
+?>
+<table id="forum-<?php print $forum_id; ?>">
+  <thead>
+    <tr>
+      <th><?php print t('Forum'); ?></th>
+      <th><?php print t('Topics');?></th>
+      <th><?php print t('Posts'); ?></th>
+      <th><?php print t('Last post'); ?></th>
+    </tr>
+  </thead>
+  <tbody>
+  <?php foreach ($forums as $child_id => $forum): ?>
+    <tr id="forum-list-<?php print $child_id; ?>" class="<?php print $forum->zebra; ?>">
+      <td <?php print $forum->is_container ? 'colspan="4" class="container"' : 'class="forum"'; ?>>
+        <?php /* Enclose the contents of this cell with X divs, where X is the
+               * depth this forum resides at. This will allow us to use CSS
+               * left-margin for indenting.
+               */ ?>
+        <?php print str_repeat('<div class="indent">', $forum->depth); ?>
+          <div class="icon forum-status-<?php print $forum->icon_class; ?>" title="<?php print $forum->icon_title; ?>">
+            <span class="element-invisible"><?php print $forum->icon_title; ?></span>
+          </div>
+          <div class="name"><a href="<?php print $forum->link; ?>"><?php print $forum->name; ?></a></div>
+          <?php if ($forum->description): ?>
+            <div class="description"><?php print $forum->description; ?></div>
+          <?php endif; ?>
+        <?php print str_repeat('</div>', $forum->depth); ?>
+      </td>
+      <?php if (!$forum->is_container): ?>
+        <td class="topics">
+          <?php print $forum->num_topics ?>
+          <?php if ($forum->new_topics): ?>
+            <br />
+            <a href="<?php print $forum->new_url; ?>"><?php print $forum->new_text; ?></a>
+          <?php endif; ?>
+        </td>
+        <td class="posts"><?php print $forum->num_posts ?></td>
+        <td class="last-reply"><?php print $forum->last_reply ?></td>
+      <?php endif; ?>
+    </tr>
+  <?php endforeach; ?>
+  </tbody>
+</table>
diff --git a/htmltest/modules/forum/forum-rtl.css b/htmltest/modules/forum/forum-rtl.css
new file mode 100644
index 00000000..3f2a88b3
--- /dev/null
+++ b/htmltest/modules/forum/forum-rtl.css
@@ -0,0 +1,24 @@
+/**
+ * @file
+ * Right-to-left styling for the Forum module.
+ */
+
+#forum td.forum .icon {
+  float: right;
+  margin: 0 0 0 9px;
+}
+#forum div.indent {
+  margin-left: 0;
+  margin-right: 20px;
+}
+.forum-topic-navigation {
+  padding: 1em 3em 0 0;
+}
+.forum-topic-navigation .topic-previous {
+  text-align: left;
+  float: right;
+}
+.forum-topic-navigation .topic-next {
+  text-align: right;
+  float: left;
+}
diff --git a/htmltest/modules/forum/forum-submitted.tpl.php b/htmltest/modules/forum/forum-submitted.tpl.php
new file mode 100644
index 00000000..18fea8f1
--- /dev/null
+++ b/htmltest/modules/forum/forum-submitted.tpl.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Formats a forum post submission string.
+ *
+ * The submission string indicates when and by whom a topic was submitted.
+ *
+ * Available variables:
+ * - $author: The author of the post.
+ * - $time: How long ago the post was created.
+ * - $topic: An object with the raw data of the post. Potentially unsafe. Be
+ *   sure to clean this data before printing.
+ *
+ * @see template_preprocess_forum_submitted()
+ * @see theme_forum_submitted()
+ *
+ * @ingroup themeable
+ */
+?>
+<?php if ($time): ?>
+  <span class="submitted">
+  <?php print t('By !author @time ago', array(
+    '@time' => $time,
+    '!author' => $author,
+    )); ?>
+  </span>
+<?php else: ?>
+  <?php print t('n/a'); ?>
+<?php endif; ?>
diff --git a/htmltest/modules/forum/forum-topic-list.tpl.php b/htmltest/modules/forum/forum-topic-list.tpl.php
new file mode 100644
index 00000000..64278141
--- /dev/null
+++ b/htmltest/modules/forum/forum-topic-list.tpl.php
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * @file
+ * Displays a list of forum topics.
+ *
+ * Available variables:
+ * - $header: The table header. This is pre-generated with click-sorting
+ *   information. If you need to change this, see
+ *   template_preprocess_forum_topic_list().
+ * - $pager: The pager to display beneath the table.
+ * - $topics: An array of topics to be displayed. Each $topic in $topics
+ *   contains:
+ *   - $topic->icon: The icon to display.
+ *   - $topic->moved: A flag to indicate whether the topic has been moved to
+ *     another forum.
+ *   - $topic->title: The title of the topic. Safe to output.
+ *   - $topic->message: If the topic has been moved, this contains an
+ *     explanation and a link.
+ *   - $topic->zebra: 'even' or 'odd' string used for row class.
+ *   - $topic->comment_count: The number of replies on this topic.
+ *   - $topic->new_replies: A flag to indicate whether there are unread
+ *     comments.
+ *   - $topic->new_url: If there are unread replies, this is a link to them.
+ *   - $topic->new_text: Text containing the translated, properly pluralized
+ *     count.
+ *   - $topic->created: A string representing when the topic was posted. Safe
+ *     to output.
+ *   - $topic->last_reply: An outputtable string representing when the topic was
+ *     last replied to.
+ *   - $topic->timestamp: The raw timestamp this topic was posted.
+ * - $topic_id: Numeric ID for the current forum topic.
+ *
+ * @see template_preprocess_forum_topic_list()
+ * @see theme_forum_topic_list()
+ *
+ * @ingroup themeable
+ */
+?>
+<table id="forum-topic-<?php print $topic_id; ?>">
+  <thead>
+    <tr><?php print $header; ?></tr>
+  </thead>
+  <tbody>
+  <?php foreach ($topics as $topic): ?>
+    <tr class="<?php print $topic->zebra;?>">
+      <td class="icon"><?php print $topic->icon; ?></td>
+      <td class="title">
+        <div>
+          <?php print $topic->title; ?>
+        </div>
+        <div>
+          <?php print $topic->created; ?>
+        </div>
+      </td>
+    <?php if ($topic->moved): ?>
+      <td colspan="3"><?php print $topic->message; ?></td>
+    <?php else: ?>
+      <td class="replies">
+        <?php print $topic->comment_count; ?>
+        <?php if ($topic->new_replies): ?>
+          <br />
+          <a href="<?php print $topic->new_url; ?>"><?php print $topic->new_text; ?></a>
+        <?php endif; ?>
+      </td>
+      <td class="last-reply"><?php print $topic->last_reply; ?></td>
+    <?php endif; ?>
+    </tr>
+  <?php endforeach; ?>
+  </tbody>
+</table>
+<?php print $pager; ?>
diff --git a/htmltest/modules/forum/forum.admin.inc b/htmltest/modules/forum/forum.admin.inc
new file mode 100644
index 00000000..712cf546
--- /dev/null
+++ b/htmltest/modules/forum/forum.admin.inc
@@ -0,0 +1,352 @@
+<?php
+
+/**
+ * @file
+ * Administrative page callbacks for the Forum module.
+ */
+
+/**
+ * Page callback: Returns a form for creating a new forum or container.
+ *
+ * @param $type
+ *   What is being added. Possible values are 'forum' and 'container'.
+ * @param $edit
+ *   (optional) Associative array containing a forum term to be edited.
+ *   Defaults to an empty array.
+ *
+ * @return
+ *   A form for creating a new forum or container.
+ *
+ * @see forum_menu()
+ */
+function forum_form_main($type, $edit = array()) {
+  $edit = (array) $edit;
+  if ((isset($_POST['op']) && $_POST['op'] == t('Delete')) || !empty($_POST['confirm'])) {
+    return drupal_get_form('forum_confirm_delete', $edit['tid']);
+  }
+  switch ($type) {
+    case 'forum':
+      return drupal_get_form('forum_form_forum', $edit);
+      break;
+    case 'container':
+      return drupal_get_form('forum_form_container', $edit);
+      break;
+  }
+}
+
+/**
+ * Form constructor for adding and editing a forum.
+ *
+ * @param $edit
+ *   (optional) Associative array containing a forum term to be added or edited.
+ *   Defaults to an empty array.
+ *
+ * @see forum_form_submit()
+ * @ingroup forms
+ */
+function forum_form_forum($form, &$form_state, $edit = array()) {
+  $edit += array(
+    'name' => '',
+    'description' => '',
+    'tid' => NULL,
+    'weight' => 0,
+  );
+  $form['name'] = array('#type' => 'textfield',
+    '#title' => t('Forum name'),
+    '#default_value' => $edit['name'],
+    '#maxlength' => 255,
+    '#description' => t('Short but meaningful name for this collection of threaded discussions.'),
+    '#required' => TRUE,
+  );
+  $form['description'] = array('#type' => 'textarea',
+    '#title' => t('Description'),
+    '#default_value' => $edit['description'],
+    '#description' => t('Description and guidelines for discussions within this forum.'),
+  );
+  $form['parent']['#tree'] = TRUE;
+  $form['parent'][0] = _forum_parent_select($edit['tid'], t('Parent'), 'forum');
+  $form['weight'] = array('#type' => 'weight',
+    '#title' => t('Weight'),
+    '#default_value' => $edit['weight'],
+    '#description' => t('Forums are displayed in ascending order by weight (forums with equal weights are displayed alphabetically).'),
+  );
+
+  $form['vid'] = array('#type' => 'hidden', '#value' => variable_get('forum_nav_vocabulary', ''));
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save'));
+  if ($edit['tid']) {
+    $form['actions']['delete'] = array('#type' => 'submit', '#value' => t('Delete'));
+    $form['tid'] = array('#type' => 'hidden', '#value' => $edit['tid']);
+  }
+  $form['#submit'][] = 'forum_form_submit';
+  $form['#theme'] = 'forum_form';
+
+  return $form;
+}
+
+/**
+ * Form submission handler for forum_form_forum() and forum_form_container().
+ */
+function forum_form_submit($form, &$form_state) {
+  if ($form['form_id']['#value'] == 'forum_form_container') {
+    $container = TRUE;
+    $type = t('forum container');
+  }
+  else {
+    $container = FALSE;
+    $type = t('forum');
+  }
+
+  $term = (object) $form_state['values'];
+  $status = taxonomy_term_save($term);
+  switch ($status) {
+    case SAVED_NEW:
+      if ($container) {
+        $containers = variable_get('forum_containers', array());
+        $containers[] = $term->tid;
+        variable_set('forum_containers', $containers);
+      }
+      $form_state['values']['tid'] = $term->tid;
+      drupal_set_message(t('Created new @type %term.', array('%term' => $form_state['values']['name'], '@type' => $type)));
+      break;
+    case SAVED_UPDATED:
+      drupal_set_message(t('The @type %term has been updated.', array('%term' => $form_state['values']['name'], '@type' => $type)));
+      // Clear the page and block caches to avoid stale data.
+      cache_clear_all();
+      break;
+  }
+  $form_state['redirect'] = 'admin/structure/forum';
+  return;
+}
+
+/**
+ * Returns HTML for a forum form.
+ *
+ * By default this does not alter the appearance of a form at all, but is
+ * provided as a convenience for themers.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_forum_form($variables) {
+  return drupal_render_children($variables['form']);
+}
+
+/**
+ * Form constructor for adding and editing forum containers.
+ *
+ * @param $edit
+ *   (optional) Associative array containing a container term to be added or edited.
+ *   Defaults to an empty array.
+ *
+ * @see forum_form_submit()
+ * @ingroup forms
+ */
+function forum_form_container($form, &$form_state, $edit = array()) {
+  $edit += array(
+    'name' => '',
+    'description' => '',
+    'tid' => NULL,
+    'weight' => 0,
+  );
+  // Handle a delete operation.
+  $form['name'] = array(
+    '#title' => t('Container name'),
+    '#type' => 'textfield',
+    '#default_value' => $edit['name'],
+    '#maxlength' => 255,
+    '#description' => t('Short but meaningful name for this collection of related forums.'),
+    '#required' => TRUE
+  );
+
+  $form['description'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Description'),
+    '#default_value' => $edit['description'],
+    '#description' => t('Description and guidelines for forums within this container.')
+  );
+  $form['parent']['#tree'] = TRUE;
+  $form['parent'][0] = _forum_parent_select($edit['tid'], t('Parent'), 'container');
+  $form['weight'] = array(
+    '#type' => 'weight',
+    '#title' => t('Weight'),
+    '#default_value' => $edit['weight'],
+    '#description' => t('Containers are displayed in ascending order by weight (containers with equal weights are displayed alphabetically).')
+  );
+
+  $form['vid'] = array(
+    '#type' => 'hidden',
+    '#value' => variable_get('forum_nav_vocabulary', ''),
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save')
+  );
+  if ($edit['tid']) {
+    $form['actions']['delete'] = array('#type' => 'submit', '#value' => t('Delete'));
+    $form['tid'] = array('#type' => 'value', '#value' => $edit['tid']);
+  }
+  $form['#submit'][] = 'forum_form_submit';
+  $form['#theme'] = 'forum_form';
+
+  return $form;
+}
+
+/**
+ * Form constructor for confirming deletion of a forum taxonomy term.
+ *
+ * @param $tid
+ *   ID of the term to be deleted.
+ *
+ * @see forum_confirm_delete_submit()
+ * @ingroup forms
+ */
+function forum_confirm_delete($form, &$form_state, $tid) {
+  $term = taxonomy_term_load($tid);
+
+  $form['tid'] = array('#type' => 'value', '#value' => $tid);
+  $form['name'] = array('#type' => 'value', '#value' => $term->name);
+
+  return confirm_form($form, t('Are you sure you want to delete the forum %name?', array('%name' => $term->name)), 'admin/structure/forum', t('Deleting a forum or container will also delete its sub-forums, if any. To delete posts in this forum, visit <a href="@content">content administration</a> first. This action cannot be undone.', array('@content' => url('admin/content'))), t('Delete'), t('Cancel'));
+}
+
+/**
+ * Form submission handler for forum_confirm_delete().
+ */
+function forum_confirm_delete_submit($form, &$form_state) {
+  taxonomy_term_delete($form_state['values']['tid']);
+  drupal_set_message(t('The forum %term and all sub-forums have been deleted.', array('%term' => $form_state['values']['name'])));
+  watchdog('content', 'forum: deleted %term and all its sub-forums.', array('%term' => $form_state['values']['name']));
+
+  $form_state['redirect'] = 'admin/structure/forum';
+  return;
+}
+
+/**
+ * Form constructor for the forum settings page.
+ *
+ * @see forum_menu()
+ * @see system_settings_form()
+ * @ingroup forms
+ */
+function forum_admin_settings($form) {
+  $number = drupal_map_assoc(array(5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100, 150, 200, 250, 300, 350, 400, 500));
+  $form['forum_hot_topic'] = array('#type' => 'select',
+    '#title' => t('Hot topic threshold'),
+    '#default_value' => variable_get('forum_hot_topic', 15),
+    '#options' => $number,
+    '#description' => t('The number of replies a topic must have to be considered "hot".'),
+  );
+  $number = drupal_map_assoc(array(10, 25, 50, 75, 100));
+  $form['forum_per_page'] = array('#type' => 'select',
+    '#title' => t('Topics per page'),
+    '#default_value' => variable_get('forum_per_page', 25),
+    '#options' => $number,
+    '#description' => t('Default number of forum topics displayed per page.'),
+  );
+  $forder = array(1 => t('Date - newest first'), 2 => t('Date - oldest first'), 3 => t('Posts - most active first'), 4 => t('Posts - least active first'));
+  $form['forum_order'] = array('#type' => 'radios',
+    '#title' => t('Default order'),
+    '#default_value' => variable_get('forum_order', 1),
+    '#options' => $forder,
+    '#description' => t('Default display order for topics.'),
+  );
+  return system_settings_form($form);
+}
+
+/**
+ * Form constructor for the forum overview form.
+ *
+ * Returns a form for controlling the hierarchy of existing forums and
+ * containers.
+ *
+ * @see forum_menu()
+ * @ingroup forms
+ */
+function forum_overview($form, &$form_state) {
+  module_load_include('inc', 'taxonomy', 'taxonomy.admin');
+
+  $vid = variable_get('forum_nav_vocabulary', '');
+  $vocabulary = taxonomy_vocabulary_load($vid);
+  $form = taxonomy_overview_terms($form, $form_state, $vocabulary);
+
+  foreach (element_children($form) as $key) {
+    if (isset($form[$key]['#term'])) {
+      $term = $form[$key]['#term'];
+      $form[$key]['view']['#href'] = 'forum/' . $term['tid'];
+      if (in_array($form[$key]['#term']['tid'], variable_get('forum_containers', array()))) {
+        $form[$key]['edit']['#title'] = t('edit container');
+        $form[$key]['edit']['#href'] = 'admin/structure/forum/edit/container/' . $term['tid'];
+      }
+      else {
+        $form[$key]['edit']['#title'] = t('edit forum');
+        $form[$key]['edit']['#href'] = 'admin/structure/forum/edit/forum/' . $term['tid'];
+      }
+    }
+  }
+
+  // Remove the alphabetical reset.
+  unset($form['actions']['reset_alphabetical']);
+
+  // The form needs to have submit and validate handlers set explicitly.
+  $form['#theme'] = 'taxonomy_overview_terms';
+  $form['#submit'] = array('taxonomy_overview_terms_submit'); // Use the existing taxonomy overview submit handler.
+  $form['#empty_text'] = t('No containers or forums available. <a href="@container">Add container</a> or <a href="@forum">Add forum</a>.', array('@container' => url('admin/structure/forum/add/container'), '@forum' => url('admin/structure/forum/add/forum')));
+  return $form;
+}
+
+/**
+ * Returns a select box for available parent terms.
+ *
+ * @param $tid
+ *   ID of the term that is being added or edited.
+ * @param $title
+ *   Title for the select box.
+ * @param $child_type
+ *   Whether the child is a forum or a container.
+ *
+ * @return
+ *   A select form element.
+ */
+function _forum_parent_select($tid, $title, $child_type) {
+
+  $parents = taxonomy_get_parents($tid);
+  if ($parents) {
+    $parent = array_shift($parents);
+    $parent = $parent->tid;
+  }
+  else {
+    $parent = 0;
+  }
+
+  $vid = variable_get('forum_nav_vocabulary', '');
+  $children = taxonomy_get_tree($vid, $tid);
+
+  // A term can't be the child of itself, nor of its children.
+  foreach ($children as $child) {
+    $exclude[] = $child->tid;
+  }
+  $exclude[] = $tid;
+
+  $tree = taxonomy_get_tree($vid);
+  $options[0] = '<' . t('root') . '>';
+  if ($tree) {
+    foreach ($tree as $term) {
+      if (!in_array($term->tid, $exclude)) {
+        $options[$term->tid] = str_repeat(' -- ', $term->depth) . $term->name;
+      }
+    }
+  }
+  if ($child_type == 'container') {
+    $description = t('Containers are usually placed at the top (root) level, but may also be placed inside another container or forum.');
+  }
+  elseif ($child_type == 'forum') {
+    $description = t('Forums may be placed at the top (root) level, or inside another container or forum.');
+  }
+
+  return array('#type' => 'select', '#title' => $title, '#default_value' => $parent, '#options' => $options, '#description' => $description, '#required' => TRUE);
+}
diff --git a/htmltest/modules/forum/forum.css b/htmltest/modules/forum/forum.css
new file mode 100644
index 00000000..480e07bf
--- /dev/null
+++ b/htmltest/modules/forum/forum.css
@@ -0,0 +1,54 @@
+/**
+ * @file
+ * Styling for the Forum module.
+ */
+
+#forum .description {
+  font-size: 0.9em;
+  margin: 0.5em;
+}
+#forum td.created,
+#forum td.posts,
+#forum td.topics,
+#forum td.last-reply,
+#forum td.replies,
+#forum td.pager {
+  white-space: nowrap;
+}
+
+#forum td.forum .icon {
+  background-image: url(../../misc/forum-icons.png);
+  background-repeat: no-repeat;
+  float: left; /* LTR */
+  height: 24px;
+  margin: 0 9px 0 0; /* LTR */
+  width: 24px;
+}
+#forum td.forum .forum-status-new {
+  background-position: -24px 0;
+}
+
+#forum div.indent {
+  margin-left: 20px; /* LTR */
+}
+#forum .icon div {
+  background-image: url(../../misc/forum-icons.png);
+  background-repeat: no-repeat;
+  width: 24px;
+  height: 24px;
+}
+#forum .icon .topic-status-new {
+  background-position: -24px 0;
+}
+#forum .icon .topic-status-hot {
+  background-position: -48px 0;
+}
+#forum .icon .topic-status-hot-new {
+  background-position: -72px 0;
+}
+#forum .icon .topic-status-sticky {
+  background-position: -96px 0;
+}
+#forum .icon .topic-status-closed {
+  background-position: -120px 0;
+}
diff --git a/htmltest/modules/forum/forum.info b/htmltest/modules/forum/forum.info
new file mode 100644
index 00000000..25f4f34a
--- /dev/null
+++ b/htmltest/modules/forum/forum.info
@@ -0,0 +1,16 @@
+name = Forum
+description = Provides discussion forums.
+dependencies[] = taxonomy
+dependencies[] = comment
+package = Core
+version = VERSION
+core = 7.x
+files[] = forum.test
+configure = admin/structure/forum
+stylesheets[all][] = forum.css
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/forum/forum.install b/htmltest/modules/forum/forum.install
new file mode 100644
index 00000000..57e116b7
--- /dev/null
+++ b/htmltest/modules/forum/forum.install
@@ -0,0 +1,467 @@
+<?php
+
+/**
+ * @file
+ * Install, update, and uninstall functions for the Forum module.
+ */
+
+/**
+ * Implements hook_install().
+ */
+function forum_install() {
+  // Set the weight of the forum.module to 1 so it is loaded after the taxonomy.module.
+  db_update('system')
+    ->fields(array('weight' => 1))
+    ->condition('name', 'forum')
+    ->execute();
+  // Forum topics are published by default, but do not have any other default
+  // options set (for example, they are not promoted to the front page).
+  variable_set('node_options_forum', array('status'));
+}
+
+/**
+ * Implements hook_enable().
+ */
+function forum_enable() {
+  // If we enable forum at the same time as taxonomy we need to call
+  // field_associate_fields() as otherwise the field won't be enabled until
+  // hook modules_enabled is called which takes place after hook_enable events.
+  field_associate_fields('taxonomy');
+  // Create the forum vocabulary if it does not exist.
+  $vocabulary = taxonomy_vocabulary_load(variable_get('forum_nav_vocabulary', 0));
+  if (!$vocabulary) {
+    $edit = array(
+      'name' => t('Forums'),
+      'machine_name' => 'forums',
+      'description' => t('Forum navigation vocabulary'),
+      'hierarchy' => 1,
+      'module' => 'forum',
+      'weight' => -10,
+    );
+    $vocabulary = (object) $edit;
+    taxonomy_vocabulary_save($vocabulary);
+    variable_set('forum_nav_vocabulary', $vocabulary->vid);
+  }
+
+  // Create the 'taxonomy_forums' field if it doesn't already exist.
+  if (!field_info_field('taxonomy_forums')) {
+    $field = array(
+      'field_name' => 'taxonomy_forums',
+      'type' => 'taxonomy_term_reference',
+      'settings' => array(
+        'allowed_values' => array(
+          array(
+            'vocabulary' => $vocabulary->machine_name,
+            'parent' => 0,
+          ),
+        ),
+      ),
+    );
+    field_create_field($field);
+
+    // Create a default forum so forum posts can be created.
+    $edit = array(
+      'name' => t('General discussion'),
+      'description' => '',
+      'parent' => array(0),
+      'vid' => $vocabulary->vid,
+    );
+    $term = (object) $edit;
+    taxonomy_term_save($term);
+
+    // Create the instance on the bundle.
+    $instance = array(
+      'field_name' => 'taxonomy_forums',
+      'entity_type' => 'node',
+      'label' => $vocabulary->name,
+      'bundle' => 'forum',
+      'required' => TRUE,
+      'widget' => array(
+        'type' => 'options_select',
+      ),
+      'display' => array(
+        'default' => array(
+          'type' => 'taxonomy_term_reference_link',
+         'weight' => 10,
+        ),
+        'teaser' => array(
+          'type' => 'taxonomy_term_reference_link',
+         'weight' => 10,
+        ),
+      ),
+    );
+    field_create_instance($instance);
+  }
+
+  // Ensure the forum node type is available.
+  node_types_rebuild();
+  $types = node_type_get_types();
+  node_add_body_field($types['forum']);
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function forum_uninstall() {
+  // Load the dependent Taxonomy module, in case it has been disabled.
+  drupal_load('module', 'taxonomy');
+
+  variable_del('forum_containers');
+  variable_del('forum_hot_topic');
+  variable_del('forum_per_page');
+  variable_del('forum_order');
+  variable_del('forum_block_num_active');
+  variable_del('forum_block_num_new');
+  variable_del('node_options_forum');
+
+  field_delete_field('taxonomy_forums');
+  // Purge field data now to allow taxonomy module to be uninstalled
+  // if this is the only field remaining.
+  field_purge_batch(10);
+}
+
+/**
+ * Implements hook_schema().
+ */
+function forum_schema() {
+  $schema['forum'] = array(
+    'description' => 'Stores the relationship of nodes to forum terms.',
+    'fields' => array(
+      'nid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {node}.nid of the node.',
+      ),
+      'vid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Primary Key: The {node}.vid of the node.',
+      ),
+      'tid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {taxonomy_term_data}.tid of the forum term assigned to the node.',
+      ),
+    ),
+    'indexes' => array(
+      'forum_topic' => array('nid', 'tid'),
+      'tid' => array('tid'),
+    ),
+    'primary key' => array('vid'),
+    'foreign keys' => array(
+      'forum_node' => array(
+        'table' => 'node',
+        'columns' => array(
+          'nid' => 'nid',
+          'vid' => 'vid',
+        ),
+      ),
+    ),
+  );
+
+  $schema['forum_index'] = array(
+    'description' => 'Maintains denormalized information about node/term relationships.',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The {node}.nid this record tracks.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'title' => array(
+        'description' => 'The title of this node, always treated as non-markup plain text.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'tid' => array(
+         'description' => 'The term ID.',
+         'type' => 'int',
+         'unsigned' => TRUE,
+         'not null' => TRUE,
+         'default' => 0,
+      ),
+      'sticky' => array(
+        'description' => 'Boolean indicating whether the node is sticky.',
+        'type' => 'int',
+        'not null' => FALSE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'created' => array(
+        'description' => 'The Unix timestamp when the node was created.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default'=> 0,
+      ),
+      'last_comment_timestamp' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The Unix timestamp of the last comment that was posted within this node, from {comment}.timestamp.',
+      ),
+      'comment_count' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The total number of comments on this node.',
+      ),
+    ),
+    'indexes' => array(
+      'forum_topics' => array('nid', 'tid', 'sticky', 'last_comment_timestamp'),
+      'created' => array('created'),
+      'last_comment_timestamp' => array('last_comment_timestamp'),
+    ),
+    'foreign keys' => array(
+      'tracked_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+      'term' => array(
+        'table' => 'taxonomy_term_data',
+        'columns' => array(
+          'tid' => 'tid',
+        ),
+      ),
+    ),
+  );
+
+
+  return $schema;
+}
+
+/**
+ * Implements hook_update_dependencies().
+ */
+function forum_update_dependencies() {
+  $dependencies['forum'][7003] = array(
+    // Forum update 7003 uses field API update functions, so must run after
+    // Field API has been enabled.
+    'system' => 7020,
+    // Forum update 7003 relies on updated taxonomy module schema. Ensure it
+    // runs after all taxonomy updates.
+    'taxonomy' => 7010,
+  );
+  return $dependencies;
+}
+
+/**
+ * Add new index to forum table.
+ */
+function forum_update_7000() {
+  db_drop_index('forum', 'nid');
+  db_add_index('forum', 'forum_topic', array('nid', 'tid'));
+}
+
+/**
+ * Create new {forum_index} table.
+ */
+function forum_update_7001() {
+  $forum_index = array(
+    'description' => 'Maintains denormalized information about node/term relationships.',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The {node}.nid this record tracks.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'title' => array(
+        'description' => 'The title of this node, always treated as non-markup plain text.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'tid' => array(
+         'description' => 'The term ID.',
+         'type' => 'int',
+         'unsigned' => TRUE,
+         'not null' => TRUE,
+         'default' => 0,
+      ),
+      'sticky' => array(
+        'description' => 'Boolean indicating whether the node is sticky.',
+        'type' => 'int',
+        'not null' => FALSE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'created' => array(
+        'description' => 'The Unix timestamp when the node was created.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default'=> 0,
+      ),
+      'last_comment_timestamp' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The Unix timestamp of the last comment that was posted within this node, from {comment}.timestamp.',
+      ),
+      'comment_count' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The total number of comments on this node.',
+      ),
+    ),
+    'indexes' => array(
+      'forum_topics' => array('tid', 'sticky', 'last_comment_timestamp'),
+    ),
+    'foreign keys' => array(
+      'tracked_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+      'term' => array(
+        'table' => 'taxonomy_term_data',
+        'columns' => array(
+          'tid' => 'tid',
+        ),
+      ),
+    ),
+  );
+  db_create_table('forum_index', $forum_index);
+
+  $select = db_select('node', 'n');
+  $forum_alias = $select->join('forum', 'f', 'n.vid = f.vid');
+  $ncs_alias = $select->join('node_comment_statistics', 'ncs', 'n.nid = ncs.nid');
+  $select
+    ->fields('n', array('nid', 'title', 'sticky', 'created'))
+    ->fields($forum_alias, array('tid'))
+    ->fields($ncs_alias, array('last_comment_timestamp', 'comment_count'));
+
+  db_insert('forum_index')
+    ->fields(array('nid', 'title', 'sticky', 'created', 'tid', 'last_comment_timestamp', 'comment_count'))
+    ->from($select)
+    ->execute();
+}
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Add new index to forum_index table.
+ */
+function forum_update_7002() {
+  db_drop_index('forum_index', 'forum_topics');
+  db_add_index('forum_index', 'forum_topics', array('nid', 'tid', 'sticky', 'last_comment_timestamp'));
+}
+
+/**
+ * Rename field to 'taxonomy_forums'.
+ */
+function forum_update_7003() {
+  $messages = array();
+
+  $new_field_name = 'taxonomy_forums';
+
+  // Test to see if the taxonomy_forums field exists.
+  $fields = _update_7000_field_read_fields(array('field_name' => $new_field_name));
+  if ($fields) {
+    // Since the field exists, we're done.
+    return;
+  }
+
+  // Calculate the old field name.
+  $vid = variable_get('forum_nav_vocabulary', 0);
+  $vocabulary_machine_name = db_select('taxonomy_vocabulary', 'tv')
+    ->fields('tv', array('machine_name'))
+    ->condition('vid', $vid)
+    ->execute()
+    ->fetchField();
+  $old_field_name = 'taxonomy_' . $vocabulary_machine_name;
+
+  // Read the old fields.
+  $old_fields = _update_7000_field_read_fields(array('field_name' => $old_field_name));
+  foreach ($old_fields as $old_field) {
+    if ($old_field['storage']['type'] != 'field_sql_storage') {
+      $messages[] = t('Cannot rename field %id (%old_field_name) to %new_field_name because it does not use the field_sql_storage storage type.', array(
+        '%id' => $old_field['id'],
+        '%old_field_name' => $old_field_name,
+        '%new_field_name' => $new_field_name,
+      ));
+      continue;
+    }
+
+    // Update {field_config}.
+    db_update('field_config')
+      ->fields(array('field_name' => $new_field_name))
+      ->condition('id', $old_field['id'])
+      ->execute();
+
+    // Update {field_config_instance}.
+    db_update('field_config_instance')
+      ->fields(array('field_name' => $new_field_name))
+      ->condition('field_id', $old_field['id'])
+      ->execute();
+
+    // The tables that need updating in the form 'old_name' => 'new_name'.
+    $tables = array(
+      'field_data_' . $old_field_name => 'field_data_' . $new_field_name,
+      'field_revision_' . $old_field_name => 'field_revision_' . $new_field_name,
+    );
+    foreach ($tables as $old_table => $new_table) {
+      $old_column_name = $old_field_name . '_tid';
+      $new_column_name = $new_field_name . '_tid';
+
+      // Rename the column.
+      db_drop_index($old_table, $old_column_name);
+      db_change_field($old_table, $old_column_name, $new_column_name, array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => FALSE,
+      ));
+      db_drop_index($old_table, $new_column_name);
+      db_add_index($old_table, $new_column_name, array($new_column_name));
+
+      // Rename the table.
+      db_rename_table($old_table, $new_table);
+    }
+  }
+
+  cache_clear_all('*', 'cache_field', TRUE);
+
+  return $messages;
+}
+
+/**
+ * Update {forum_index} so that only published nodes are indexed.
+ */
+function forum_update_7011() {
+  $select = db_select('node', 'n')
+    ->fields('n', array('nid'))
+    ->condition('status', 0 );
+
+  db_delete('forum_index')
+    ->condition('nid', $select, 'IN')
+    ->execute();
+}
+
+/**
+ * Add 'created' and 'last_comment_timestamp' indexes.
+ */
+function forum_update_7012() {
+  db_add_index('forum_index', 'created', array('created'));
+  db_add_index('forum_index', 'last_comment_timestamp', array('last_comment_timestamp'));
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra".
+ */
diff --git a/htmltest/modules/forum/forum.module b/htmltest/modules/forum/forum.module
new file mode 100644
index 00000000..575de36a
--- /dev/null
+++ b/htmltest/modules/forum/forum.module
@@ -0,0 +1,1396 @@
+<?php
+
+/**
+ * @file
+ * Provides discussion forums.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function forum_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#forum':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Forum module lets you create threaded discussion forums with functionality similar to other message board systems. Forums are useful because they allow community members to discuss topics with one another while ensuring those conversations are archived for later reference. In a forum, users post topics and threads in nested hierarchies, allowing discussions to be categorized and grouped. The forum hierarchy consists of:') . '</p>';
+      $output .= '<ul>';
+      $output .= '<li>' . t('Optional containers (for example, <em>Support</em>), which can hold:') . '</li>';
+      $output .= '<ul><li>' . t('Forums (for example, <em>Installing Drupal</em>), which can hold:') . '</li>';
+      $output .= '<ul><li>' . t('Forum topics submitted by users (for example, <em>How to start a Drupal 6 Multisite</em>), which start discussions and are starting points for:') . '</li>';
+      $output .= '<ul><li>' . t('Threaded comments submitted by users (for example, <em>You have these options...</em>).') . '</li>';
+      $output .= '</ul>';
+      $output .= '</ul>';
+      $output .= '</ul>';
+      $output .= '</ul>';
+      $output .= '<p>' . t('For more information, see the online handbook entry for <a href="@forum">Forum module</a>.', array('@forum' => 'http://drupal.org/documentation/modules/forum')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Setting up forum structure') . '</dt>';
+      $output .= '<dd>' . t('Visit the <a href="@forums">Forums page</a> to set up containers and forums to hold your discussion topics.', array('@forums' => url('admin/structure/forum'))) . '</dd>';
+      $output .= '<dt>' . t('Starting a discussion') . '</dt>';
+      $output .= '<dd>' . t('The <a href="@create-topic">Forum topic</a> link on the <a href="@content-add">Add new content</a> page creates the first post of a new threaded discussion, or thread.', array('@create-topic' => url('node/add/forum'), '@content-add' => url('node/add'))) . '</dd>';
+      $output .= '<dt>' . t('Navigation') . '</dt>';
+      $output .= '<dd>' . t('Enabling the Forum module provides a default <em>Forums</em> menu item in the navigation menu that links to the <a href="@forums">Forums page</a>.', array('@forums' => url('forum'))) . '</dd>';
+      $output .= '<dt>' . t('Moving forum topics') . '</dt>';
+      $output .= '<dd>' . t('A forum topic (and all of its comments) may be moved between forums by selecting a different forum while editing a forum topic. When moving a forum topic between forums, the <em>Leave shadow copy</em> option creates a link in the original forum pointing to the new location.') . '</dd>';
+      $output .= '<dt>' . t('Locking and disabling comments') . '</dt>';
+      $output .= '<dd>' . t('Selecting <em>Closed</em> under <em>Comment settings</em> while editing a forum topic will lock (prevent new comments on) the thread. Selecting <em>Hidden</em> under <em>Comment settings</em> while editing a forum topic will hide all existing comments on the thread, and prevent new ones.') . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'admin/structure/forum':
+      $output = '<p>' . t('Forums contain forum topics. Use containers to group related forums.') . '</p>';
+      $output .= theme('more_help_link', array('url' => 'admin/help/forum'));
+      return $output;
+    case 'admin/structure/forum/add/container':
+      return '<p>' . t('Use containers to group related forums.') . '</p>';
+    case 'admin/structure/forum/add/forum':
+      return '<p>' . t('A forum holds related forum topics.') . '</p>';
+    case 'admin/structure/forum/settings':
+      return '<p>' . t('Adjust the display of your forum topics. Organize the forums on the <a href="@forum-structure">forum structure page</a>.', array('@forum-structure' => url('admin/structure/forum'))) . '</p>';
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function forum_theme() {
+  return array(
+    'forums' => array(
+      'template' => 'forums',
+      'variables' => array('forums' => NULL, 'topics' => NULL, 'parents' => NULL, 'tid' => NULL, 'sortby' => NULL, 'forum_per_page' => NULL),
+    ),
+    'forum_list' => array(
+      'template' => 'forum-list',
+      'variables' => array('forums' => NULL, 'parents' => NULL, 'tid' => NULL),
+    ),
+    'forum_topic_list' => array(
+      'template' => 'forum-topic-list',
+      'variables' => array('tid' => NULL, 'topics' => NULL, 'sortby' => NULL, 'forum_per_page' => NULL),
+    ),
+    'forum_icon' => array(
+      'template' => 'forum-icon',
+      'variables' => array('new_posts' => NULL, 'num_posts' => 0, 'comment_mode' => 0, 'sticky' => 0, 'first_new' => FALSE),
+    ),
+    'forum_submitted' => array(
+      'template' => 'forum-submitted',
+      'variables' => array('topic' => NULL),
+    ),
+    'forum_form' => array(
+      'render element' => 'form',
+      'file' => 'forum.admin.inc',
+    ),
+  );
+}
+
+/**
+ * Implements hook_menu().
+ */
+function forum_menu() {
+  $items['forum'] = array(
+    'title' => 'Forums',
+    'page callback' => 'forum_page',
+    'access arguments' => array('access content'),
+    'file' => 'forum.pages.inc',
+  );
+  $items['forum/%forum_forum'] = array(
+    'title' => 'Forums',
+    'page callback' => 'forum_page',
+    'page arguments' => array(1),
+    'access arguments' => array('access content'),
+    'file' => 'forum.pages.inc',
+  );
+  $items['admin/structure/forum'] = array(
+    'title' => 'Forums',
+    'description' => 'Control forum hierarchy settings.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('forum_overview'),
+    'access arguments' => array('administer forums'),
+    'file' => 'forum.admin.inc',
+  );
+  $items['admin/structure/forum/list'] = array(
+    'title' => 'List',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['admin/structure/forum/add/container'] = array(
+    'title' => 'Add container',
+    'page callback' => 'forum_form_main',
+    'page arguments' => array('container'),
+    'access arguments' => array('administer forums'),
+    'type' => MENU_LOCAL_ACTION,
+    'parent' => 'admin/structure/forum',
+    'file' => 'forum.admin.inc',
+  );
+  $items['admin/structure/forum/add/forum'] = array(
+    'title' => 'Add forum',
+    'page callback' => 'forum_form_main',
+    'page arguments' => array('forum'),
+    'access arguments' => array('administer forums'),
+    'type' => MENU_LOCAL_ACTION,
+    'parent' => 'admin/structure/forum',
+    'file' => 'forum.admin.inc',
+  );
+  $items['admin/structure/forum/settings'] = array(
+    'title' => 'Settings',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('forum_admin_settings'),
+    'access arguments' => array('administer forums'),
+    'weight' => 5,
+    'type' => MENU_LOCAL_TASK,
+    'parent' => 'admin/structure/forum',
+    'file' => 'forum.admin.inc',
+  );
+  $items['admin/structure/forum/edit/container/%taxonomy_term'] = array(
+    'title' => 'Edit container',
+    'page callback' => 'forum_form_main',
+    'page arguments' => array('container', 5),
+    'access arguments' => array('administer forums'),
+    'file' => 'forum.admin.inc',
+  );
+  $items['admin/structure/forum/edit/forum/%taxonomy_term'] = array(
+    'title' => 'Edit forum',
+    'page callback' => 'forum_form_main',
+    'page arguments' => array('forum', 5),
+    'access arguments' => array('administer forums'),
+    'file' => 'forum.admin.inc',
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_menu_local_tasks_alter().
+ */
+function forum_menu_local_tasks_alter(&$data, $router_item, $root_path) {
+  global $user;
+
+  // Add action link to 'node/add/forum' on 'forum' sub-pages.
+  if ($root_path == 'forum' || $root_path == 'forum/%') {
+    $tid = (isset($router_item['page_arguments'][0]) ? $router_item['page_arguments'][0]->tid : 0);
+    $forum_term = forum_forum_load($tid);
+    if ($forum_term) {
+      $links = array();
+      // Loop through all bundles for forum taxonomy vocabulary field.
+      $field = field_info_field('taxonomy_forums');
+      foreach ($field['bundles']['node'] as $type) {
+        if (node_access('create', $type)) {
+          $links[$type] = array(
+            '#theme' => 'menu_local_action',
+            '#link' => array(
+              'title' => t('Add new @node_type', array('@node_type' => node_type_get_name($type))),
+              'href' => 'node/add/' . str_replace('_', '-', $type) . '/' . $forum_term->tid,
+            ),
+          );
+        }
+      }
+      if (empty($links)) {
+        // Authenticated user does not have access to create new topics.
+        if ($user->uid) {
+          $links['disallowed'] = array(
+            '#theme' => 'menu_local_action',
+            '#link' => array(
+              'title' => t('You are not allowed to post new content in the forum.'),
+            ),
+          );
+        }
+        // Anonymous user does not have access to create new topics.
+        else {
+          $links['login'] = array(
+            '#theme' => 'menu_local_action',
+            '#link' => array(
+              'title' => t('<a href="@login">Log in</a> to post new content in the forum.', array(
+                '@login' => url('user/login', array('query' => drupal_get_destination())),
+              )),
+              'localized_options' => array('html' => TRUE),
+            ),
+          );
+        }
+      }
+      $data['actions']['output'] = array_merge($data['actions']['output'], $links);
+    }
+  }
+}
+
+/**
+ * Implements hook_entity_info_alter().
+ */
+function forum_entity_info_alter(&$info) {
+  // Take over URI construction for taxonomy terms that are forums.
+  if ($vid = variable_get('forum_nav_vocabulary', 0)) {
+    // Within hook_entity_info(), we can't invoke entity_load() as that would
+    // cause infinite recursion, so we call taxonomy_vocabulary_get_names()
+    // instead of taxonomy_vocabulary_load(). All we need is the machine name
+    // of $vid, so retrieving and iterating all the vocabulary names is somewhat
+    // inefficient, but entity info is cached across page requests, and an
+    // iteration of all vocabularies once per cache clearing isn't a big deal,
+    // and is done as part of taxonomy_entity_info() anyway.
+    foreach (taxonomy_vocabulary_get_names() as $machine_name => $vocabulary) {
+      if ($vid == $vocabulary->vid) {
+        $info['taxonomy_term']['bundles'][$machine_name]['uri callback'] = 'forum_uri';
+      }
+    }
+  }
+}
+
+/**
+ * Implements callback_entity_info_uri().
+ *
+ * Entity URI callback used in forum_entity_info_alter().
+ */
+function forum_uri($forum) {
+  return array(
+    'path' => 'forum/' . $forum->tid,
+  );
+}
+
+/**
+ * Checks whether a node can be used in a forum, based on its content type.
+ *
+ * @param $node
+ *   A node object.
+ *
+ * @return
+ *   Boolean indicating if the node can be assigned to a forum.
+ */
+function _forum_node_check_node_type($node) {
+  // Fetch information about the forum field.
+  $field = field_info_instance('node', 'taxonomy_forums', $node->type);
+
+  return is_array($field);
+}
+
+/**
+ * Implements hook_node_view().
+ */
+function forum_node_view($node, $view_mode) {
+  $vid = variable_get('forum_nav_vocabulary', 0);
+  $vocabulary = taxonomy_vocabulary_load($vid);
+  if (_forum_node_check_node_type($node)) {
+    if ($view_mode == 'full' && node_is_page($node)) {
+      // Breadcrumb navigation
+      $breadcrumb[] = l(t('Home'), NULL);
+      $breadcrumb[] = l($vocabulary->name, 'forum');
+      if ($parents = taxonomy_get_parents_all($node->forum_tid)) {
+        $parents = array_reverse($parents);
+        foreach ($parents as $parent) {
+          $breadcrumb[] = l($parent->name, 'forum/' . $parent->tid);
+        }
+      }
+      drupal_set_breadcrumb($breadcrumb);
+
+    }
+  }
+}
+
+/**
+ * Implements hook_node_validate().
+ *
+ * Checks in particular that the node is assigned only a "leaf" term in the
+ * forum taxonomy.
+ */
+function forum_node_validate($node, $form) {
+  if (_forum_node_check_node_type($node)) {
+    $langcode = $form['taxonomy_forums']['#language'];
+    // vocabulary is selected, not a "container" term.
+    if (!empty($node->taxonomy_forums[$langcode])) {
+      // Extract the node's proper topic ID.
+      $containers = variable_get('forum_containers', array());
+      foreach ($node->taxonomy_forums[$langcode] as $delta => $item) {
+        // If no term was selected (e.g. when no terms exist yet), remove the
+        // item.
+        if (empty($item['tid'])) {
+          unset($node->taxonomy_forums[$langcode][$delta]);
+          continue;
+        }
+        $term = taxonomy_term_load($item['tid']);
+        if (!$term) {
+          form_set_error('taxonomy_forums', t('Select a forum.'));
+          continue;
+        }
+        $used = db_query_range('SELECT 1 FROM {taxonomy_term_data} WHERE tid = :tid AND vid = :vid',0 , 1, array(
+          ':tid' => $term->tid,
+          ':vid' => $term->vid,
+        ))->fetchField();
+        if ($used && in_array($term->tid, $containers)) {
+          form_set_error('taxonomy_forums', t('The item %forum is a forum container, not a forum. Select one of the forums below instead.', array('%forum' => $term->name)));
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_node_presave().
+ *
+ * Assigns the forum taxonomy when adding a topic from within a forum.
+ */
+function forum_node_presave($node) {
+  if (_forum_node_check_node_type($node)) {
+    // Make sure all fields are set properly:
+    $node->icon = !empty($node->icon) ? $node->icon : '';
+    reset($node->taxonomy_forums);
+    $langcode = key($node->taxonomy_forums);
+    if (!empty($node->taxonomy_forums[$langcode])) {
+      $node->forum_tid = $node->taxonomy_forums[$langcode][0]['tid'];
+      if (isset($node->nid)) {
+        $old_tid = db_query_range("SELECT f.tid FROM {forum} f INNER JOIN {node} n ON f.vid = n.vid WHERE n.nid = :nid ORDER BY f.vid DESC", 0, 1, array(':nid' => $node->nid))->fetchField();
+        if ($old_tid && isset($node->forum_tid) && ($node->forum_tid != $old_tid) && !empty($node->shadow)) {
+          // A shadow copy needs to be created. Retain new term and add old term.
+          $node->taxonomy_forums[$langcode][] = array('tid' => $old_tid);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_node_update().
+ */
+function forum_node_update($node) {
+  if (_forum_node_check_node_type($node)) {
+    if (empty($node->revision) && db_query('SELECT tid FROM {forum} WHERE nid=:nid', array(':nid' => $node->nid))->fetchField()) {
+      if (!empty($node->forum_tid)) {
+        db_update('forum')
+          ->fields(array('tid' => $node->forum_tid))
+          ->condition('vid', $node->vid)
+          ->execute();
+      }
+      // The node is removed from the forum.
+      else {
+        db_delete('forum')
+          ->condition('nid', $node->nid)
+          ->execute();
+      }
+    }
+    else {
+      if (!empty($node->forum_tid)) {
+        db_insert('forum')
+          ->fields(array(
+            'tid' => $node->forum_tid,
+            'vid' => $node->vid,
+            'nid' => $node->nid,
+          ))
+          ->execute();
+      }
+    }
+    // If the node has a shadow forum topic, update the record for this
+    // revision.
+    if (!empty($node->shadow)) {
+      db_delete('forum')
+        ->condition('nid', $node->nid)
+        ->condition('vid', $node->vid)
+        ->execute();
+      db_insert('forum')
+        ->fields(array(
+          'nid' => $node->nid,
+          'vid' => $node->vid,
+          'tid' => $node->forum_tid,
+        ))
+        ->execute();
+     }
+  }
+}
+
+/**
+ * Implements hook_node_insert().
+ */
+function forum_node_insert($node) {
+  if (_forum_node_check_node_type($node)) {
+    if (!empty($node->forum_tid)) {
+      $nid = db_insert('forum')
+        ->fields(array(
+          'tid' => $node->forum_tid,
+          'vid' => $node->vid,
+          'nid' => $node->nid,
+        ))
+        ->execute();
+    }
+  }
+}
+
+/**
+ * Implements hook_node_delete().
+ */
+function forum_node_delete($node) {
+  if (_forum_node_check_node_type($node)) {
+    db_delete('forum')
+      ->condition('nid', $node->nid)
+      ->execute();
+    db_delete('forum_index')
+      ->condition('nid', $node->nid)
+      ->execute();
+  }
+}
+
+/**
+ * Implements hook_node_load().
+ */
+function forum_node_load($nodes) {
+  $node_vids = array();
+  foreach ($nodes as $node) {
+    if (_forum_node_check_node_type($node)) {
+      $node_vids[] = $node->vid;
+    }
+  }
+  if (!empty($node_vids)) {
+    $query = db_select('forum', 'f');
+    $query
+      ->fields('f', array('nid', 'tid'))
+      ->condition('f.vid', $node_vids);
+    $result = $query->execute();
+    foreach ($result as $record) {
+      $nodes[$record->nid]->forum_tid = $record->tid;
+    }
+  }
+}
+
+/**
+ * Implements hook_node_info().
+ */
+function forum_node_info() {
+  return array(
+    'forum' => array(
+      'name' => t('Forum topic'),
+      'base' => 'forum',
+      'description' => t('A <em>forum topic</em> starts a new discussion thread within a forum.'),
+      'title_label' => t('Subject'),
+    )
+  );
+}
+
+/**
+ * Implements hook_permission().
+ */
+function forum_permission() {
+  $perms = array(
+    'administer forums' => array(
+      'title' => t('Administer forums'),
+    ),
+  );
+  return $perms;
+}
+
+/**
+ * Implements hook_taxonomy_term_delete().
+ */
+function forum_taxonomy_term_delete($term) {
+  // For containers, remove the tid from the forum_containers variable.
+  $containers = variable_get('forum_containers', array());
+  $key = array_search($term->tid, $containers);
+  if ($key !== FALSE) {
+    unset($containers[$key]);
+  }
+  variable_set('forum_containers', $containers);
+}
+
+/**
+ * Implements hook_comment_publish().
+ *
+ * This actually handles the insertion and update of published nodes since
+ * comment_save() calls hook_comment_publish() for all published comments.
+ */
+function forum_comment_publish($comment) {
+  _forum_update_forum_index($comment->nid);
+}
+
+/**
+ * Implements hook_comment_update().
+ *
+ * The Comment module doesn't call hook_comment_unpublish() when saving
+ * individual comments, so we need to check for those here.
+ */
+function forum_comment_update($comment) {
+  // comment_save() calls hook_comment_publish() for all published comments,
+  // so we need to handle all other values here.
+  if (!$comment->status) {
+    _forum_update_forum_index($comment->nid);
+  }
+}
+
+/**
+ * Implements hook_comment_unpublish().
+ */
+function forum_comment_unpublish($comment) {
+  _forum_update_forum_index($comment->nid);
+}
+
+/**
+ * Implements hook_comment_delete().
+ */
+function forum_comment_delete($comment) {
+  _forum_update_forum_index($comment->nid);
+}
+
+/**
+ * Implements hook_field_storage_pre_insert().
+ */
+function forum_field_storage_pre_insert($entity_type, $entity, &$skip_fields) {
+  if ($entity_type == 'node' && $entity->status && _forum_node_check_node_type($entity)) {
+    $query = db_insert('forum_index')->fields(array('nid', 'title', 'tid', 'sticky', 'created', 'comment_count', 'last_comment_timestamp'));
+    foreach ($entity->taxonomy_forums as $language) {
+      foreach ($language as $item) {
+        $query->values(array(
+          'nid' => $entity->nid,
+          'title' => $entity->title,
+          'tid' => $item['tid'],
+          'sticky' => $entity->sticky,
+          'created' => $entity->created,
+          'comment_count' => 0,
+          'last_comment_timestamp' => $entity->created,
+        ));
+      }
+    }
+    $query->execute();
+  }
+}
+
+/**
+ * Implements hook_field_storage_pre_update().
+ */
+function forum_field_storage_pre_update($entity_type, $entity, &$skip_fields) {
+  $first_call = &drupal_static(__FUNCTION__, array());
+
+  if ($entity_type == 'node' && _forum_node_check_node_type($entity)) {
+
+    // If the node is published, update the forum index.
+    if ($entity->status) {
+
+      // We don't maintain data for old revisions, so clear all previous values
+      // from the table. Since this hook runs once per field, per object, make
+      // sure we only wipe values once.
+      if (!isset($first_call[$entity->nid])) {
+        $first_call[$entity->nid] = FALSE;
+        db_delete('forum_index')->condition('nid', $entity->nid)->execute();
+      }
+      $query = db_insert('forum_index')->fields(array('nid', 'title', 'tid', 'sticky', 'created', 'comment_count', 'last_comment_timestamp'));
+      foreach ($entity->taxonomy_forums as $language) {
+        foreach ($language as $item) {
+          $query->values(array(
+            'nid' => $entity->nid,
+            'title' => $entity->title,
+            'tid' => $item['tid'],
+            'sticky' => $entity->sticky,
+            'created' => $entity->created,
+            'comment_count' => 0,
+            'last_comment_timestamp' => $entity->created,
+          ));
+        }
+      }
+      $query->execute();
+      // The logic for determining last_comment_count is fairly complex, so
+      // call _forum_update_forum_index() too.
+      _forum_update_forum_index($entity->nid);
+    }
+
+    // When a forum node is unpublished, remove it from the forum_index table.
+    else {
+      db_delete('forum_index')->condition('nid', $entity->nid)->execute();
+    }
+
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter() for taxonomy_form_vocabulary().
+ */
+function forum_form_taxonomy_form_vocabulary_alter(&$form, &$form_state, $form_id) {
+  $vid = variable_get('forum_nav_vocabulary', 0);
+  if (isset($form['vid']['#value']) && $form['vid']['#value'] == $vid) {
+    $form['help_forum_vocab'] = array(
+      '#markup' => t('This is the designated forum vocabulary. Some of the normal vocabulary options have been removed.'),
+      '#weight' => -1,
+    );
+    // Forum's vocabulary always has single hierarchy. Forums and containers
+    // have only one parent or no parent for root items. By default this value
+    // is 0.
+    $form['hierarchy']['#value'] = 1;
+    // Do not allow to delete forum's vocabulary.
+    $form['actions']['delete']['#access'] = FALSE;
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter() for taxonomy_form_term().
+ */
+function forum_form_taxonomy_form_term_alter(&$form, &$form_state, $form_id) {
+   $vid = variable_get('forum_nav_vocabulary', 0);
+   if (isset($form['vid']['#value']) && $form['vid']['#value'] == $vid) {
+    // Hide multiple parents select from forum terms.
+    $form['relations']['parent']['#access'] = FALSE;
+  }
+}
+
+/**
+ * Implements hook_form_BASE_FORM_ID_alter() for node_form().
+ */
+function forum_form_node_form_alter(&$form, &$form_state, $form_id) {
+  if (isset($form['taxonomy_forums'])) {
+    $langcode = $form['taxonomy_forums']['#language'];
+    // Make the vocabulary required for 'real' forum-nodes.
+    $form['taxonomy_forums'][$langcode]['#required'] = TRUE;
+    $form['taxonomy_forums'][$langcode]['#multiple'] = FALSE;
+    if (empty($form['taxonomy_forums'][$langcode]['#default_value'])) {
+      // If there is no default forum already selected, try to get the forum
+      // ID from the URL (e.g., if we are on a page like node/add/forum/2, we
+      // expect "2" to be the ID of the forum that was requested).
+      $requested_forum_id = arg(3);
+      $form['taxonomy_forums'][$langcode]['#default_value'] = is_numeric($requested_forum_id) ? $requested_forum_id : '';
+    }
+  }
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function forum_block_info() {
+  $blocks['active'] = array(
+    'info' => t('Active forum topics'),
+    'cache' => DRUPAL_CACHE_CUSTOM,
+    'properties' => array('administrative' => TRUE),
+  );
+  $blocks['new'] = array(
+    'info' => t('New forum topics'),
+    'cache' => DRUPAL_CACHE_CUSTOM,
+    'properties' => array('administrative' => TRUE),
+  );
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_configure().
+ */
+function forum_block_configure($delta = '') {
+  $form['forum_block_num_' . $delta] = array(
+    '#type' => 'select',
+    '#title' => t('Number of topics'),
+    '#default_value' => variable_get('forum_block_num_' . $delta, '5'),
+    '#options' => drupal_map_assoc(range(2, 20))
+  );
+  return $form;
+}
+
+/**
+ * Implements hook_block_save().
+ */
+function forum_block_save($delta = '', $edit = array()) {
+  variable_set('forum_block_num_' . $delta, $edit['forum_block_num_' . $delta]);
+}
+
+/**
+ * Implements hook_block_view().
+ *
+ * Generates a block containing the currently active forum topics and the most
+ * recently added forum topics.
+ */
+function forum_block_view($delta = '') {
+  $query = db_select('forum_index', 'f')
+    ->fields('f')
+    ->addTag('node_access');
+  switch ($delta) {
+    case 'active':
+      $title = t('Active forum topics');
+      $query
+        ->orderBy('f.last_comment_timestamp', 'DESC')
+        ->range(0, variable_get('forum_block_num_active', '5'));
+      break;
+
+    case 'new':
+      $title = t('New forum topics');
+      $query
+        ->orderBy('f.created', 'DESC')
+        ->range(0, variable_get('forum_block_num_new', '5'));
+      break;
+  }
+
+  $block['subject'] = $title;
+  // Cache based on the altered query. Enables us to cache with node access enabled.
+  $block['content'] = drupal_render_cache_by_query($query, 'forum_block_view');
+  $block['content']['#access'] = user_access('access content');
+  return $block;
+}
+
+/**
+ * Render API callback: Lists nodes based on the element's #query property.
+ *
+ * This function can be used as a #pre_render callback.
+ *
+ * @see forum_block_view()
+ */
+function forum_block_view_pre_render($elements) {
+  $result = $elements['#query']->execute();
+  if ($node_title_list = node_title_list($result)) {
+    $elements['forum_list'] = $node_title_list;
+    $elements['forum_more'] = array('#theme' => 'more_link', '#url' => 'forum', '#title' => t('Read the latest forum topics.'));
+  }
+  return $elements;
+}
+
+/**
+ * Implements hook_form().
+ */
+function forum_form($node, $form_state) {
+  $type = node_type_get_type($node);
+  $form['title'] = array(
+    '#type' => 'textfield',
+    '#title' => check_plain($type->title_label),
+    '#default_value' => !empty($node->title) ? $node->title : '',
+    '#required' => TRUE, '#weight' => -5
+  );
+
+  if (!empty($node->nid)) {
+    $forum_terms = $node->taxonomy_forums;
+    // If editing, give option to leave shadows.
+    $shadow = (count($forum_terms) > 1);
+    $form['shadow'] = array('#type' => 'checkbox', '#title' => t('Leave shadow copy'), '#default_value' => $shadow, '#description' => t('If you move this topic, you can leave a link in the old forum to the new forum.'));
+    $form['forum_tid'] = array('#type' => 'value', '#value' => $node->forum_tid);
+  }
+
+  return $form;
+}
+
+/**
+ * Returns a tree of all forums for a given taxonomy term ID.
+ *
+ * @param $tid
+ *   (optional) Taxonomy term ID of the forum. If not given all forums will be
+ *   returned.
+ *
+ * @return
+ *   A tree of taxonomy objects, with the following additional properties:
+ *   - num_topics: Number of topics in the forum.
+ *   - num_posts: Total number of posts in all topics.
+ *   - last_post: Most recent post for the forum.
+ *   - forums: An array of child forums.
+ */
+function forum_forum_load($tid = NULL) {
+  $cache = &drupal_static(__FUNCTION__, array());
+
+  // Return a cached forum tree if available.
+  if (!isset($tid)) {
+    $tid = 0;
+  }
+  if (isset($cache[$tid])) {
+    return $cache[$tid];
+  }
+
+  $vid = variable_get('forum_nav_vocabulary', 0);
+
+  // Load and validate the parent term.
+  if ($tid) {
+    $forum_term = taxonomy_term_load($tid);
+    if (!$forum_term || ($forum_term->vid != $vid)) {
+      return $cache[$tid] = FALSE;
+    }
+  }
+  // If $tid is 0, create an empty object to hold the child terms.
+  elseif ($tid === 0) {
+    $forum_term = (object) array(
+      'tid' => 0,
+    );
+  }
+
+  // Determine if the requested term is a container.
+  if (!$forum_term->tid || in_array($forum_term->tid, variable_get('forum_containers', array()))) {
+    $forum_term->container = 1;
+  }
+
+  // Load parent terms.
+  $forum_term->parents = taxonomy_get_parents_all($forum_term->tid);
+
+  // Load the tree below.
+  $forums = array();
+  $_forums = taxonomy_get_tree($vid, $tid);
+
+  if (count($_forums)) {
+    $query = db_select('node', 'n');
+    $query->join('node_comment_statistics', 'ncs', 'n.nid = ncs.nid');
+    $query->join('forum', 'f', 'n.vid = f.vid');
+    $query->addExpression('COUNT(n.nid)', 'topic_count');
+    $query->addExpression('SUM(ncs.comment_count)', 'comment_count');
+    $counts = $query
+      ->fields('f', array('tid'))
+      ->condition('n.status', 1)
+      ->groupBy('tid')
+      ->addTag('node_access')
+      ->execute()
+      ->fetchAllAssoc('tid');
+  }
+
+  foreach ($_forums as $forum) {
+    // Determine if the child term is a container.
+    if (in_array($forum->tid, variable_get('forum_containers', array()))) {
+      $forum->container = 1;
+    }
+
+    // Merge in the topic and post counters.
+    if (!empty($counts[$forum->tid])) {
+      $forum->num_topics = $counts[$forum->tid]->topic_count;
+      $forum->num_posts = $counts[$forum->tid]->topic_count + $counts[$forum->tid]->comment_count;
+    }
+    else {
+      $forum->num_topics = 0;
+      $forum->num_posts = 0;
+    }
+
+    // Query "Last Post" information for this forum.
+    $query = db_select('node', 'n');
+    $query->join('users', 'u1', 'n.uid = u1.uid');
+    $query->join('forum', 'f', 'n.vid = f.vid AND f.tid = :tid', array(':tid' => $forum->tid));
+    $query->join('node_comment_statistics', 'ncs', 'n.nid = ncs.nid');
+    $query->join('users', 'u2', 'ncs.last_comment_uid = u2.uid');
+    $query->addExpression('CASE ncs.last_comment_uid WHEN 0 THEN ncs.last_comment_name ELSE u2.name END', 'last_comment_name');
+
+    $topic = $query
+      ->fields('ncs', array('last_comment_timestamp', 'last_comment_uid'))
+      ->condition('n.status', 1)
+      ->orderBy('last_comment_timestamp', 'DESC')
+      ->range(0, 1)
+      ->addTag('node_access')
+      ->execute()
+      ->fetchObject();
+
+    // Merge in the "Last Post" information.
+    $last_post = new stdClass();
+    if (!empty($topic->last_comment_timestamp)) {
+      $last_post->created = $topic->last_comment_timestamp;
+      $last_post->name = $topic->last_comment_name;
+      $last_post->uid = $topic->last_comment_uid;
+    }
+    $forum->last_post = $last_post;
+
+    $forums[$forum->tid] = $forum;
+  }
+
+  // Cache the result, and return the tree.
+  $forum_term->forums = $forums;
+  $cache[$tid] = $forum_term;
+  return $forum_term;
+}
+
+/**
+ * Calculates the number of new posts in a forum that the user has not yet read.
+ *
+ * Nodes are new if they are newer than NODE_NEW_LIMIT.
+ *
+ * @param $term
+ *   The term ID of the forum.
+ * @param $uid
+ *   The user ID.
+ *
+ * @return
+ *   The number of new posts in the forum that have not been read by the user.
+ */
+function _forum_topics_unread($term, $uid) {
+  $query = db_select('node', 'n');
+  $query->join('forum', 'f', 'n.vid = f.vid AND f.tid = :tid', array(':tid' => $term));
+  $query->leftJoin('history', 'h', 'n.nid = h.nid AND h.uid = :uid', array(':uid' => $uid));
+  $query->addExpression('COUNT(n.nid)', 'count');
+  return $query
+    ->condition('status', 1)
+    ->condition('n.created', NODE_NEW_LIMIT, '>')
+    ->isNull('h.nid')
+    ->addTag('node_access')
+    ->execute()
+    ->fetchField();
+}
+
+/**
+ * Gets all the topics in a forum.
+ *
+ * @param $tid
+ *   The term ID of the forum.
+ * @param $sortby
+ *   One of the following integers indicating the sort criteria:
+ *   - 1: Date - newest first.
+ *   - 2: Date - oldest first.
+ *   - 3: Posts with the most comments first.
+ *   - 4: Posts with the least comments first.
+ * @param $forum_per_page
+ *   The maximum number of topics to display per page.
+ *
+ * @return
+ *   A list of all the topics in a forum.
+ */
+function forum_get_topics($tid, $sortby, $forum_per_page) {
+  global $user, $forum_topic_list_header;
+
+  $forum_topic_list_header = array(
+    NULL,
+    array('data' => t('Topic'), 'field' => 'f.title'),
+    array('data' => t('Replies'), 'field' => 'f.comment_count'),
+    array('data' => t('Last reply'), 'field' => 'f.last_comment_timestamp'),
+  );
+
+  $order = _forum_get_topic_order($sortby);
+  for ($i = 0; $i < count($forum_topic_list_header); $i++) {
+    if ($forum_topic_list_header[$i]['field'] == $order['field']) {
+      $forum_topic_list_header[$i]['sort'] = $order['sort'];
+    }
+  }
+
+  $query = db_select('forum_index', 'f')->extend('PagerDefault')->extend('TableSort');
+  $query->fields('f');
+  $query
+    ->condition('f.tid', $tid)
+    ->addTag('node_access')
+    ->orderBy('f.sticky', 'DESC')
+    ->orderByHeader($forum_topic_list_header)
+    ->limit($forum_per_page);
+
+  $count_query = db_select('forum_index', 'f');
+  $count_query->condition('f.tid', $tid);
+  $count_query->addExpression('COUNT(*)');
+  $count_query->addTag('node_access');
+
+  $query->setCountQuery($count_query);
+  $result = $query->execute();
+  $nids = array();
+  foreach ($result as $record) {
+    $nids[] = $record->nid;
+  }
+  if ($nids) {
+    $query = db_select('node', 'n')->extend('TableSort');
+    $query->fields('n', array('title', 'nid', 'type', 'sticky', 'created', 'uid'));
+    $query->addField('n', 'comment', 'comment_mode');
+
+    $query->join('node_comment_statistics', 'ncs', 'n.nid = ncs.nid');
+    $query->fields('ncs', array('cid', 'last_comment_uid', 'last_comment_timestamp', 'comment_count'));
+
+    $query->join('forum_index', 'f', 'f.nid = ncs.nid');
+    $query->addField('f', 'tid', 'forum_tid');
+
+    $query->join('users', 'u', 'n.uid = u.uid');
+    $query->addField('u', 'name');
+
+    $query->join('users', 'u2', 'ncs.last_comment_uid = u2.uid');
+
+    $query->addExpression('CASE ncs.last_comment_uid WHEN 0 THEN ncs.last_comment_name ELSE u2.name END', 'last_comment_name');
+
+    $query
+      ->orderBy('f.sticky', 'DESC')
+      ->orderByHeader($forum_topic_list_header)
+      ->condition('n.nid', $nids);
+
+    $result = $query->execute();
+  }
+  else {
+    $result = array();
+  }
+
+  $topics = array();
+  $first_new_found = FALSE;
+  foreach ($result as $topic) {
+    if ($user->uid) {
+      // A forum is new if the topic is new, or if there are new comments since
+      // the user's last visit.
+      if ($topic->forum_tid != $tid) {
+        $topic->new = 0;
+      }
+      else {
+        $history = _forum_user_last_visit($topic->nid);
+        $topic->new_replies = comment_num_new($topic->nid, $history);
+        $topic->new = $topic->new_replies || ($topic->last_comment_timestamp > $history);
+      }
+    }
+    else {
+      // Do not track "new replies" status for topics if the user is anonymous.
+      $topic->new_replies = 0;
+      $topic->new = 0;
+    }
+
+    // Make sure only one topic is indicated as the first new topic.
+    $topic->first_new = FALSE;
+    if ($topic->new != 0 && !$first_new_found) {
+      $topic->first_new = TRUE;
+      $first_new_found = TRUE;
+    }
+
+    if ($topic->comment_count > 0) {
+      $last_reply = new stdClass();
+      $last_reply->created = $topic->last_comment_timestamp;
+      $last_reply->name = $topic->last_comment_name;
+      $last_reply->uid = $topic->last_comment_uid;
+      $topic->last_reply = $last_reply;
+    }
+    $topics[] = $topic;
+  }
+
+  return $topics;
+}
+
+/**
+ * Preprocesses variables for forums.tpl.php.
+ *
+ * @param $variables
+ *   An array containing the following elements:
+ *   - forums: An array of all forum objects to display for the given taxonomy
+ *     term ID. If tid = 0 then all the top-level forums are displayed.
+ *   - topics: An array of all the topics in the current forum.
+ *   - parents: An array of taxonomy term objects that are ancestors of the
+ *     current term ID.
+ *   - tid: Taxonomy term ID of the current forum.
+ *   - sortby: One of the following integers indicating the sort criteria:
+ *     - 1: Date - newest first.
+ *     - 2: Date - oldest first.
+ *     - 3: Posts with the most comments first.
+ *     - 4: Posts with the least comments first.
+ *   - forum_per_page: The maximum number of topics to display per page.
+ *
+ * @see forums.tpl.php
+ */
+function template_preprocess_forums(&$variables) {
+  global $user;
+
+  $vid = variable_get('forum_nav_vocabulary', 0);
+  $vocabulary = taxonomy_vocabulary_load($vid);
+  $title = !empty($vocabulary->name) ? $vocabulary->name : '';
+
+  // Breadcrumb navigation:
+  $breadcrumb[] = l(t('Home'), NULL);
+  if ($variables['tid']) {
+    $breadcrumb[] = l($vocabulary->name, 'forum');
+  }
+  if ($variables['parents']) {
+    $variables['parents'] = array_reverse($variables['parents']);
+    foreach ($variables['parents'] as $p) {
+      if ($p->tid == $variables['tid']) {
+        $title = $p->name;
+      }
+      else {
+        $breadcrumb[] = l($p->name, 'forum/' . $p->tid);
+      }
+    }
+  }
+  drupal_set_breadcrumb($breadcrumb);
+  drupal_set_title($title);
+
+  if ($variables['forums_defined'] = count($variables['forums']) || count($variables['parents'])) {
+    if (!empty($variables['forums'])) {
+      $variables['forums'] = theme('forum_list', $variables);
+    }
+    else {
+      $variables['forums'] = '';
+    }
+
+    if ($variables['tid'] && !in_array($variables['tid'], variable_get('forum_containers', array()))) {
+      $variables['topics'] = theme('forum_topic_list', $variables);
+      drupal_add_feed('taxonomy/term/' . $variables['tid'] . '/feed', 'RSS - ' . $title);
+    }
+    else {
+      $variables['topics'] = '';
+    }
+
+    // Provide separate template suggestions based on what's being output. Topic id is also accounted for.
+    // Check both variables to be safe then the inverse. Forums with topic ID's take precedence.
+    if ($variables['forums'] && !$variables['topics']) {
+      $variables['theme_hook_suggestions'][] = 'forums__containers';
+      $variables['theme_hook_suggestions'][] = 'forums__' . $variables['tid'];
+      $variables['theme_hook_suggestions'][] = 'forums__containers__' . $variables['tid'];
+    }
+    elseif (!$variables['forums'] && $variables['topics']) {
+      $variables['theme_hook_suggestions'][] = 'forums__topics';
+      $variables['theme_hook_suggestions'][] = 'forums__' . $variables['tid'];
+      $variables['theme_hook_suggestions'][] = 'forums__topics__' . $variables['tid'];
+    }
+    else {
+      $variables['theme_hook_suggestions'][] = 'forums__' . $variables['tid'];
+    }
+
+  }
+  else {
+    drupal_set_title(t('No forums defined'));
+    $variables['forums'] = '';
+    $variables['topics'] = '';
+  }
+}
+
+/**
+ * Preprocesses variables for forum-list.tpl.php.
+ *
+ * @param $variables
+ *   An array containing the following elements:
+ *   - forums: An array of all forum objects to display for the given taxonomy
+ *     term ID. If tid = 0 then all the top-level forums are displayed.
+ *   - parents: An array of taxonomy term objects that are ancestors of the
+ *     current term ID.
+ *   - tid: Taxonomy term ID of the current forum.
+ *
+ * @see forum-list.tpl.php
+ * @see theme_forum_list()
+ */
+function template_preprocess_forum_list(&$variables) {
+  global $user;
+  $row = 0;
+  // Sanitize each forum so that the template can safely print the data.
+  foreach ($variables['forums'] as $id => $forum) {
+    $variables['forums'][$id]->description = !empty($forum->description) ? filter_xss_admin($forum->description) : '';
+    $variables['forums'][$id]->link = url("forum/$forum->tid");
+    $variables['forums'][$id]->name = check_plain($forum->name);
+    $variables['forums'][$id]->is_container = !empty($forum->container);
+    $variables['forums'][$id]->zebra = $row % 2 == 0 ? 'odd' : 'even';
+    $row++;
+
+    $variables['forums'][$id]->new_text = '';
+    $variables['forums'][$id]->new_url = '';
+    $variables['forums'][$id]->new_topics = 0;
+    $variables['forums'][$id]->old_topics = $forum->num_topics;
+    $variables['forums'][$id]->icon_class = 'default';
+    $variables['forums'][$id]->icon_title = t('No new posts');
+    if ($user->uid) {
+      $variables['forums'][$id]->new_topics = _forum_topics_unread($forum->tid, $user->uid);
+      if ($variables['forums'][$id]->new_topics) {
+        $variables['forums'][$id]->new_text = format_plural($variables['forums'][$id]->new_topics, '1 new', '@count new');
+        $variables['forums'][$id]->new_url = url("forum/$forum->tid", array('fragment' => 'new'));
+        $variables['forums'][$id]->icon_class = 'new';
+        $variables['forums'][$id]->icon_title = t('New posts');
+      }
+      $variables['forums'][$id]->old_topics = $forum->num_topics - $variables['forums'][$id]->new_topics;
+    }
+    $variables['forums'][$id]->last_reply = theme('forum_submitted', array('topic' => $forum->last_post));
+  }
+  // Give meaning to $tid for themers. $tid actually stands for term id.
+  $variables['forum_id'] = $variables['tid'];
+  unset($variables['tid']);
+}
+
+/**
+ * Preprocesses variables for forum-topic-list.tpl.php.
+ *
+ * @param $variables
+ *   An array containing the following elements:
+ *   - tid: Taxonomy term ID of the current forum.
+ *   - topics: An array of all the topics in the current forum.
+ *   - forum_per_page: The maximum number of topics to display per page.
+ *
+ * @see forum-topic-list.tpl.php
+ * @see theme_forum_topic_list()
+ */
+function template_preprocess_forum_topic_list(&$variables) {
+  global $forum_topic_list_header;
+
+  // Create the tablesorting header.
+  $ts = tablesort_init($forum_topic_list_header);
+  $header = '';
+  foreach ($forum_topic_list_header as $cell) {
+    $cell = tablesort_header($cell, $forum_topic_list_header, $ts);
+    $header .= _theme_table_cell($cell, TRUE);
+  }
+  $variables['header'] = $header;
+
+  if (!empty($variables['topics'])) {
+    $row = 0;
+    foreach ($variables['topics'] as $id => $topic) {
+      $variables['topics'][$id]->icon = theme('forum_icon', array('new_posts' => $topic->new, 'num_posts' => $topic->comment_count, 'comment_mode' => $topic->comment_mode, 'sticky' => $topic->sticky, 'first_new' => $topic->first_new));
+      $variables['topics'][$id]->zebra = $row % 2 == 0 ? 'odd' : 'even';
+      $row++;
+
+      // We keep the actual tid in forum table, if it's different from the
+      // current tid then it means the topic appears in two forums, one of
+      // them is a shadow copy.
+      if ($variables['tid'] != $topic->forum_tid) {
+        $variables['topics'][$id]->moved = TRUE;
+        $variables['topics'][$id]->title = check_plain($topic->title);
+        $variables['topics'][$id]->message = l(t('This topic has been moved'), "forum/$topic->forum_tid");
+      }
+      else {
+        $variables['topics'][$id]->moved = FALSE;
+        $variables['topics'][$id]->title = l($topic->title, "node/$topic->nid");
+        $variables['topics'][$id]->message = '';
+      }
+      $variables['topics'][$id]->created = theme('forum_submitted', array('topic' => $topic));
+      $variables['topics'][$id]->last_reply = theme('forum_submitted', array('topic' => isset($topic->last_reply) ? $topic->last_reply : NULL));
+
+      $variables['topics'][$id]->new_text = '';
+      $variables['topics'][$id]->new_url = '';
+      if ($topic->new_replies) {
+        $variables['topics'][$id]->new_text = format_plural($topic->new_replies, '1 new', '@count new');
+        $variables['topics'][$id]->new_url = url("node/$topic->nid", array('query' => comment_new_page_count($topic->comment_count, $topic->new_replies, $topic), 'fragment' => 'new'));
+      }
+
+    }
+  }
+  else {
+    // Make this safe for the template.
+    $variables['topics'] = array();
+  }
+  // Give meaning to $tid for themers. $tid actually stands for term id.
+  $variables['topic_id'] = $variables['tid'];
+  unset($variables['tid']);
+
+  $variables['pager'] = theme('pager');
+}
+
+/**
+ * Preprocesses variables for forum-icon.tpl.php.
+ *
+ * @param $variables
+ *   An array containing the following elements:
+ *   - new_posts: Indicates whether or not the topic contains new posts.
+ *   - num_posts: The total number of posts in all topics.
+ *   - comment_mode: An integer indicating whether comments are open, closed,
+ *     or hidden.
+ *   - sticky: Indicates whether the topic is sticky.
+ *   - first_new: Indicates whether this is the first topic with new posts.
+ *
+ * @see forum-icon.tpl.php
+ * @see theme_forum_icon()
+ */
+function template_preprocess_forum_icon(&$variables) {
+  $variables['hot_threshold'] = variable_get('forum_hot_topic', 15);
+  if ($variables['num_posts'] > $variables['hot_threshold']) {
+    $variables['icon_class'] = $variables['new_posts'] ? 'hot-new' : 'hot';
+    $variables['icon_title'] = $variables['new_posts'] ? t('Hot topic, new comments') : t('Hot topic');
+  }
+  else {
+    $variables['icon_class'] = $variables['new_posts'] ? 'new' : 'default';
+    $variables['icon_title'] = $variables['new_posts'] ? t('New comments') : t('Normal topic');
+  }
+
+  if ($variables['comment_mode'] == COMMENT_NODE_CLOSED || $variables['comment_mode'] == COMMENT_NODE_HIDDEN) {
+    $variables['icon_class'] = 'closed';
+    $variables['icon_title'] = t('Closed topic');
+  }
+
+  if ($variables['sticky'] == 1) {
+    $variables['icon_class'] = 'sticky';
+    $variables['icon_title'] = t('Sticky topic');
+  }
+}
+
+/**
+ * Preprocesses variables for forum-submitted.tpl.php.
+ *
+ * The submission information will be displayed in the forum list and topic
+ * list.
+ *
+ * @param $variables
+ *   An array containing the following elements:
+ *   - topic: The topic object.
+ *
+ * @see forum-submitted.tpl.php
+ * @see theme_forum_submitted()
+ */
+function template_preprocess_forum_submitted(&$variables) {
+  $variables['author'] = isset($variables['topic']->uid) ? theme('username', array('account' => $variables['topic'])) : '';
+  $variables['time'] = isset($variables['topic']->created) ? format_interval(REQUEST_TIME - $variables['topic']->created) : '';
+}
+
+/**
+ * Gets the last time the user viewed a node.
+ *
+ * @param $nid
+ *   The node ID.
+ *
+ * @return
+ *   The timestamp when the user last viewed this node, if the user has
+ *   previously viewed the node; otherwise NODE_NEW_LIMIT.
+ */
+function _forum_user_last_visit($nid) {
+  global $user;
+  $history = &drupal_static(__FUNCTION__, array());
+
+  if (empty($history)) {
+    $result = db_query('SELECT nid, timestamp FROM {history} WHERE uid = :uid', array(':uid' => $user->uid));
+    foreach ($result as $t) {
+      $history[$t->nid] = $t->timestamp > NODE_NEW_LIMIT ? $t->timestamp : NODE_NEW_LIMIT;
+    }
+  }
+  return isset($history[$nid]) ? $history[$nid] : NODE_NEW_LIMIT;
+}
+
+/**
+ * Gets topic sorting information based on an integer code.
+ *
+ * @param $sortby
+ *   One of the following integers indicating the sort criteria:
+ *   - 1: Date - newest first.
+ *   - 2: Date - oldest first.
+ *   - 3: Posts with the most comments first.
+ *   - 4: Posts with the least comments first.
+ *
+ * @return
+ *   An array with the following values:
+ *   - field: A field for an SQL query.
+ *   - sort: 'asc' or 'desc'.
+ */
+function _forum_get_topic_order($sortby) {
+  switch ($sortby) {
+    case 1:
+      return array('field' => 'f.last_comment_timestamp', 'sort' => 'desc');
+      break;
+    case 2:
+      return array('field' => 'f.last_comment_timestamp', 'sort' => 'asc');
+      break;
+    case 3:
+      return array('field' => 'f.comment_count', 'sort' => 'desc');
+      break;
+    case 4:
+      return array('field' => 'f.comment_count', 'sort' => 'asc');
+      break;
+  }
+}
+
+/**
+ * Updates the taxonomy index for a given node.
+ *
+ * @param $nid
+ *   The ID of the node to update.
+ */
+function _forum_update_forum_index($nid) {
+  $count = db_query('SELECT COUNT(cid) FROM {comment} c INNER JOIN {forum_index} i ON c.nid = i.nid WHERE c.nid = :nid AND c.status = :status', array(
+    ':nid' => $nid,
+    ':status' => COMMENT_PUBLISHED,
+  ))->fetchField();
+
+  if ($count > 0) {
+    // Comments exist.
+    $last_reply = db_query_range('SELECT cid, name, created, uid FROM {comment} WHERE nid = :nid AND status = :status ORDER BY cid DESC', 0, 1, array(
+      ':nid' => $nid,
+      ':status' => COMMENT_PUBLISHED,
+    ))->fetchObject();
+    db_update('forum_index')
+      ->fields( array(
+        'comment_count' => $count,
+        'last_comment_timestamp' => $last_reply->created,
+      ))
+      ->condition('nid', $nid)
+      ->execute();
+  }
+  else {
+    // Comments do not exist.
+    $node = db_query('SELECT uid, created FROM {node} WHERE nid = :nid', array(':nid' => $nid))->fetchObject();
+    db_update('forum_index')
+      ->fields( array(
+        'comment_count' => 0,
+        'last_comment_timestamp' => $node->created,
+      ))
+      ->condition('nid', $nid)
+      ->execute();
+  }
+}
+
+/**
+ * Implements hook_rdf_mapping().
+ */
+function forum_rdf_mapping() {
+  return array(
+    array(
+      'type' => 'node',
+      'bundle' => 'forum',
+      'mapping' => array(
+        'rdftype' => array('sioc:Post', 'sioct:BoardPost'),
+        'taxonomy_forums' => array(
+          'predicates' => array('sioc:has_container'),
+          'type' => 'rel',
+        ),
+      ),
+    ),
+    array(
+      'type' => 'taxonomy_term',
+      'bundle' => 'forums',
+      'mapping' => array(
+        'rdftype' => array('sioc:Container', 'sioc:Forum'),
+      ),
+    ),
+  );
+}
diff --git a/htmltest/modules/forum/forum.pages.inc b/htmltest/modules/forum/forum.pages.inc
new file mode 100644
index 00000000..8538310a
--- /dev/null
+++ b/htmltest/modules/forum/forum.pages.inc
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * User page callbacks for the Forum module.
+ */
+
+/**
+ * Page callback: Prints a forum listing.
+ *
+ * @param $forum_term
+ *   A tree of all forums for a given taxonomy term ID. Defaults to NULL. See
+ *   the return object of forum_forum_load() for a complete definition.
+ *
+ * @return
+ *   A string containing HTML representing the themed forum listing.
+ *
+ * @see forum_menu()
+ */
+function forum_page($forum_term = NULL) {
+  if (!isset($forum_term)) {
+    // On the main page, display all the top-level forums.
+    $forum_term = forum_forum_load(0);
+  }
+
+  $forum_per_page = variable_get('forum_per_page', 25);
+  $sortby = variable_get('forum_order', 1);
+
+  if (empty($forum_term->container)) {
+    $topics = forum_get_topics($forum_term->tid, $sortby, $forum_per_page);
+  }
+  else {
+    $topics = '';
+  }
+
+  return theme('forums', array('forums' => $forum_term->forums, 'topics' => $topics, 'parents' => $forum_term->parents, 'tid' => $forum_term->tid, 'sortby' => $sortby, 'forums_per_page' => $forum_per_page));
+}
diff --git a/htmltest/modules/forum/forum.test b/htmltest/modules/forum/forum.test
new file mode 100644
index 00000000..bc68a3e8
--- /dev/null
+++ b/htmltest/modules/forum/forum.test
@@ -0,0 +1,687 @@
+<?php
+
+/**
+ * @file
+ * Tests for forum.module.
+ */
+
+/**
+ * Provides automated tests for the Forum module.
+ */
+class ForumTestCase extends DrupalWebTestCase {
+
+  /**
+   * A user with various administrative privileges.
+   */
+  protected $admin_user;
+
+  /**
+   * A user that can create forum topics and edit its own topics.
+   */
+  protected $edit_own_topics_user;
+
+  /**
+   * A user that can create, edit, and delete forum topics.
+   */
+  protected $edit_any_topics_user;
+
+  /**
+   * A user with no special privileges.
+   */
+  protected $web_user;
+
+  /**
+   * An array representing a container.
+   */
+  protected $container;
+
+  /**
+   * An array representing a forum.
+   */
+  protected $forum;
+
+  /**
+   * An array representing a root forum.
+   */
+  protected $root_forum;
+
+  /**
+   * An array of forum topic node IDs.
+   */
+  protected $nids;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Forum functionality',
+      'description' => 'Create, view, edit, delete, and change forum entries and verify its consistency in the database.',
+      'group' => 'Forum',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('taxonomy', 'comment', 'forum');
+    // Create users.
+    $this->admin_user = $this->drupalCreateUser(array(
+      'access administration pages',
+      'administer modules',
+      'administer blocks',
+      'administer forums',
+      'administer menu',
+      'administer taxonomy',
+      'create forum content',
+    ));
+    $this->edit_any_topics_user = $this->drupalCreateUser(array(
+      'access administration pages',
+      'create forum content',
+      'edit any forum content',
+      'delete any forum content',
+    ));
+    $this->edit_own_topics_user = $this->drupalCreateUser(array(
+      'create forum content',
+      'edit own forum content',
+      'delete own forum content',
+    ));
+    $this->web_user = $this->drupalCreateUser(array());
+  }
+
+  /**
+   * Tests disabling and re-enabling the Forum module.
+   */
+  function testEnableForumField() {
+    $this->drupalLogin($this->admin_user);
+
+    // Disable the Forum module.
+    $edit = array();
+    $edit['modules[Core][forum][enable]'] = FALSE;
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'Modules status has been updated.');
+    module_list(TRUE);
+    $this->assertFalse(module_exists('forum'), 'Forum module is not enabled.');
+
+    // Attempt to re-enable the Forum module and ensure it does not try to
+    // recreate the taxonomy_forums field.
+    $edit = array();
+    $edit['modules[Core][forum][enable]'] = 'forum';
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'Modules status has been updated.');
+    module_list(TRUE);
+    $this->assertTrue(module_exists('forum'), 'Forum module is enabled.');
+  }
+
+  /**
+   * Tests forum functionality through the admin and user interfaces.
+   */
+  function testForum() {
+    //Check that the basic forum install creates a default forum topic
+    $this->drupalGet("/forum");
+    // Look for the "General discussion" default forum
+    $this->assertText(t("General discussion"), "Found the default forum at the /forum listing");
+
+    // Do the admin tests.
+    $this->doAdminTests($this->admin_user);
+    // Generate topics to populate the active forum block.
+    $this->generateForumTopics($this->forum);
+
+    // Login an unprivileged user to view the forum topics and generate an
+    // active forum topics list.
+    $this->drupalLogin($this->web_user);
+    // Verify that this user is shown a message that they may not post content.
+    $this->drupalGet('forum/' . $this->forum['tid']);
+    $this->assertText(t('You are not allowed to post new content in the forum'), "Authenticated user without permission to post forum content is shown message in local tasks to that effect.");
+
+    $this->viewForumTopics($this->nids);
+
+    // Log in, and do basic tests for a user with permission to edit any forum
+    // content.
+    $this->doBasicTests($this->edit_any_topics_user, TRUE);
+    // Create a forum node authored by this user.
+    $any_topics_user_node = $this->createForumTopic($this->forum, FALSE);
+
+    // Log in, and do basic tests for a user with permission to edit only its
+    // own forum content.
+    $this->doBasicTests($this->edit_own_topics_user, FALSE);
+    // Create a forum node authored by this user.
+    $own_topics_user_node = $this->createForumTopic($this->forum, FALSE);
+    // Verify that this user cannot edit forum content authored by another user.
+    $this->verifyForums($this->edit_any_topics_user, $any_topics_user_node, FALSE, 403);
+
+    // Verify that this user is shown a local task to add new forum content.
+    $this->drupalGet('forum');
+    $this->assertLink(t('Add new Forum topic'));
+    $this->drupalGet('forum/' . $this->forum['tid']);
+    $this->assertLink(t('Add new Forum topic'));
+
+    // Login a user with permission to edit any forum content.
+    $this->drupalLogin($this->edit_any_topics_user);
+    // Verify that this user can edit forum content authored by another user.
+    $this->verifyForums($this->edit_own_topics_user, $own_topics_user_node, TRUE);
+
+    // Verify the topic and post counts on the forum page.
+    $this->drupalGet('forum');
+
+    // Verify row for testing forum.
+    $forum_arg = array(':forum' => 'forum-list-' . $this->forum['tid']);
+
+    // Topics cell contains number of topics and number of unread topics.
+    $xpath = $this->buildXPathQuery('//tr[@id=:forum]//td[@class="topics"]', $forum_arg);
+    $topics = $this->xpath($xpath);
+    $topics = trim($topics[0]);
+    $this->assertEqual($topics, '6', 'Number of topics found.');
+
+    // Verify the number of unread topics.
+    $unread_topics = _forum_topics_unread($this->forum['tid'], $this->edit_any_topics_user->uid);
+    $unread_topics = format_plural($unread_topics, '1 new', '@count new');
+    $xpath = $this->buildXPathQuery('//tr[@id=:forum]//td[@class="topics"]//a', $forum_arg);
+    $this->assertFieldByXPath($xpath, $unread_topics, 'Number of unread topics found.');
+
+    // Verify total number of posts in forum.
+    $xpath = $this->buildXPathQuery('//tr[@id=:forum]//td[@class="posts"]', $forum_arg);
+    $this->assertFieldByXPath($xpath, '6', 'Number of posts found.');
+
+    // Test loading multiple forum nodes on the front page.
+    $this->drupalLogin($this->drupalCreateUser(array('administer content types', 'create forum content')));
+    $this->drupalPost('admin/structure/types/manage/forum', array('node_options[promote]' => 'promote'), t('Save content type'));
+    $this->createForumTopic($this->forum, FALSE);
+    $this->createForumTopic($this->forum, FALSE);
+    $this->drupalGet('node');
+
+    // Test adding a comment to a forum topic.
+    $node = $this->createForumTopic($this->forum, FALSE);
+    $edit = array();
+    $edit['comment_body[' . LANGUAGE_NONE . '][0][value]'] = $this->randomName();
+    $this->drupalPost("node/$node->nid", $edit, t('Save'));
+    $this->assertResponse(200);
+
+    // Test editing a forum topic that has a comment.
+    $this->drupalLogin($this->edit_any_topics_user);
+    $this->drupalGet('forum/' . $this->forum['tid']);
+    $this->drupalPost("node/$node->nid/edit", array(), t('Save'));
+    $this->assertResponse(200);
+
+    // Make sure constructing a forum node programmatically produces no notices.
+    $node = new stdClass;
+    $node->type = 'forum';
+    $node->title = 'Test forum notices';
+    $node->uid = 1;
+    $node->taxonomy_forums[LANGUAGE_NONE][0]['tid'] = $this->root_forum['tid'];
+    node_save($node);
+  }
+
+  /**
+   * Tests that forum nodes can't be added without a parent.
+   *
+   * Verifies that forum nodes are not created without choosing "forum" from the
+   * select list.
+   */
+  function testAddOrphanTopic() {
+    // Must remove forum topics to test creating orphan topics.
+    $vid = variable_get('forum_nav_vocabulary');
+    $tree = taxonomy_get_tree($vid);
+    foreach ($tree as $term) {
+      taxonomy_term_delete($term->tid);
+    }
+
+    // Create an orphan forum item.
+    $this->drupalLogin($this->admin_user);
+    $this->drupalPost('node/add/forum', array('title' => $this->randomName(10), 'body[' . LANGUAGE_NONE .'][0][value]' => $this->randomName(120)), t('Save'));
+
+    $nid_count = db_query('SELECT COUNT(nid) FROM {node}')->fetchField();
+    $this->assertEqual(0, $nid_count, 'A forum node was not created when missing a forum vocabulary.');
+
+    // Reset the defaults for future tests.
+    module_enable(array('forum'));
+  }
+
+  /**
+   * Runs admin tests on the admin user.
+   *
+   * @param object $user
+   *   The logged in user.
+   */
+  private function doAdminTests($user) {
+    // Login the user.
+    $this->drupalLogin($user);
+
+    // Enable the active forum block.
+    $edit = array();
+    $edit['blocks[forum_active][region]'] = 'sidebar_second';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->assertResponse(200);
+    $this->assertText(t('The block settings have been updated.'), 'Active forum topics forum block was enabled');
+
+    // Enable the new forum block.
+    $edit = array();
+    $edit['blocks[forum_new][region]'] = 'sidebar_second';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->assertResponse(200);
+    $this->assertText(t('The block settings have been updated.'), '[New forum topics] Forum block was enabled');
+
+    // Retrieve forum menu id.
+    $mlid = db_query_range("SELECT mlid FROM {menu_links} WHERE link_path = 'forum' AND menu_name = 'navigation' AND module = 'system' ORDER BY mlid ASC", 0, 1)->fetchField();
+
+    // Add forum to navigation menu.
+    $edit = array();
+    $this->drupalPost('admin/structure/menu/manage/navigation', $edit, t('Save configuration'));
+    $this->assertResponse(200);
+
+    // Edit forum taxonomy.
+    // Restoration of the settings fails and causes subsequent tests to fail.
+    $this->container = $this->editForumTaxonomy();
+    // Create forum container.
+    $this->container = $this->createForum('container');
+    // Verify "edit container" link exists and functions correctly.
+    $this->drupalGet('admin/structure/forum');
+    $this->clickLink('edit container');
+    $this->assertRaw('Edit container', 'Followed the link to edit the container');
+    // Create forum inside the forum container.
+    $this->forum = $this->createForum('forum', $this->container['tid']);
+    // Verify the "edit forum" link exists and functions correctly.
+    $this->drupalGet('admin/structure/forum');
+    $this->clickLink('edit forum');
+    $this->assertRaw('Edit forum', 'Followed the link to edit the forum');
+    // Navigate back to forum structure page.
+    $this->drupalGet('admin/structure/forum');
+    // Create second forum in container.
+    $this->delete_forum = $this->createForum('forum', $this->container['tid']);
+    // Save forum overview.
+    $this->drupalPost('admin/structure/forum/', array(), t('Save'));
+    $this->assertRaw(t('The configuration options have been saved.'));
+    // Delete this second forum.
+    $this->deleteForum($this->delete_forum['tid']);
+    // Create forum at the top (root) level.
+    $this->root_forum = $this->createForum('forum');
+
+    // Test vocabulary form alterations.
+    $this->drupalGet('admin/structure/taxonomy/forums/edit');
+    $this->assertFieldByName('op', t('Save'), 'Save button found.');
+    $this->assertNoFieldByName('op', t('Delete'), 'Delete button not found.');
+
+    // Test term edit form alterations.
+    $this->drupalGet('taxonomy/term/' . $this->container['tid'] . '/edit');
+    // Test parent field been hidden by forum module.
+    $this->assertNoField('parent[]', 'Parent field not found.');
+
+    // Test tags vocabulary form is not affected.
+    $this->drupalGet('admin/structure/taxonomy/tags/edit');
+    $this->assertFieldByName('op', t('Save'), 'Save button found.');
+    $this->assertFieldByName('op', t('Delete'), 'Delete button found.');
+    // Test tags vocabulary term form is not affected.
+    $this->drupalGet('admin/structure/taxonomy/tags/add');
+    $this->assertField('parent[]', 'Parent field found.');
+    // Test relations fieldset exists.
+    $relations_fieldset = $this->xpath("//fieldset[@id='edit-relations']");
+    $this->assertTrue(isset($relations_fieldset[0]), 'Relations fieldset element found.');
+  }
+
+  /**
+   * Edits the forum taxonomy.
+   */
+  function editForumTaxonomy() {
+    // Backup forum taxonomy.
+    $vid = variable_get('forum_nav_vocabulary', '');
+    $original_settings = taxonomy_vocabulary_load($vid);
+
+    // Generate a random name/description.
+    $title = $this->randomName(10);
+    $description = $this->randomName(100);
+
+    $edit = array(
+      'name' => $title,
+      'description' => $description,
+      'machine_name' => drupal_strtolower(drupal_substr($this->randomName(), 3, 9)),
+    );
+
+    // Edit the vocabulary.
+    $this->drupalPost('admin/structure/taxonomy/' . $original_settings->machine_name . '/edit', $edit, t('Save'));
+    $this->assertResponse(200);
+    $this->assertRaw(t('Updated vocabulary %name.', array('%name' => $title)), 'Vocabulary was edited');
+
+    // Grab the newly edited vocabulary.
+    entity_get_controller('taxonomy_vocabulary')->resetCache();
+    $current_settings = taxonomy_vocabulary_load($vid);
+
+    // Make sure we actually edited the vocabulary properly.
+    $this->assertEqual($current_settings->name, $title, 'The name was updated');
+    $this->assertEqual($current_settings->description, $description, 'The description was updated');
+
+    // Restore the original vocabulary.
+    taxonomy_vocabulary_save($original_settings);
+    drupal_static_reset('taxonomy_vocabulary_load');
+    $current_settings = taxonomy_vocabulary_load($vid);
+    $this->assertEqual($current_settings->name, $original_settings->name, 'The original vocabulary settings were restored');
+  }
+
+  /**
+   * Creates a forum container or a forum.
+   *
+   * @param $type
+   *   The forum type (forum container or forum).
+   * @param $parent
+   *   The forum parent. This defaults to 0, indicating a root forum.
+   *   another forum).
+   *
+   * @return
+   *   The created taxonomy term data.
+   */
+  function createForum($type, $parent = 0) {
+    // Generate a random name/description.
+    $name = $this->randomName(10);
+    $description = $this->randomName(100);
+
+    $edit = array(
+      'name' => $name,
+      'description' => $description,
+      'parent[0]' => $parent,
+      'weight' => '0',
+    );
+
+    // Create forum.
+    $this->drupalPost('admin/structure/forum/add/' . $type, $edit, t('Save'));
+    $this->assertResponse(200);
+    $type = ($type == 'container') ? 'forum container' : 'forum';
+    $this->assertRaw(t('Created new @type %term.', array('%term' => $name, '@type' => t($type))), format_string('@type was created', array('@type' => ucfirst($type))));
+
+    // Verify forum.
+    $term = db_query("SELECT * FROM {taxonomy_term_data} t WHERE t.vid = :vid AND t.name = :name AND t.description = :desc", array(':vid' => variable_get('forum_nav_vocabulary', ''), ':name' => $name, ':desc' => $description))->fetchAssoc();
+    $this->assertTrue(!empty($term), 'The ' . $type . ' exists in the database');
+
+    // Verify forum hierarchy.
+    $tid = $term['tid'];
+    $parent_tid = db_query("SELECT t.parent FROM {taxonomy_term_hierarchy} t WHERE t.tid = :tid", array(':tid' => $tid))->fetchField();
+    $this->assertTrue($parent == $parent_tid, 'The ' . $type . ' is linked to its container');
+
+    return $term;
+  }
+
+  /**
+   * Deletes a forum.
+   *
+   * @param $tid
+   *   The forum ID.
+   */
+  function deleteForum($tid) {
+    // Delete the forum.
+    $this->drupalPost('admin/structure/forum/edit/forum/' . $tid, array(), t('Delete'));
+    $this->drupalPost(NULL, array(), t('Delete'));
+
+    // Assert that the forum no longer exists.
+    $this->drupalGet('forum/' . $tid);
+    $this->assertResponse(404, 'The forum was not found');
+
+    // Assert that the associated term has been removed from the
+    // forum_containers variable.
+    $containers = variable_get('forum_containers', array());
+    $this->assertFalse(in_array($tid, $containers), 'The forum_containers variable has been updated.');
+  }
+
+  /**
+   * Runs basic tests on the indicated user.
+   *
+   * @param $user
+   *   The logged in user.
+   * @param $admin
+   *   User has 'access administration pages' privilege.
+   */
+  private function doBasicTests($user, $admin) {
+    // Login the user.
+    $this->drupalLogin($user);
+    // Attempt to create forum topic under a container.
+    $this->createForumTopic($this->container, TRUE);
+    // Create forum node.
+    $node = $this->createForumTopic($this->forum, FALSE);
+    // Verify the user has access to all the forum nodes.
+    $this->verifyForums($user, $node, $admin);
+  }
+
+  /**
+   * Creates forum topic.
+   *
+   * @param array $forum
+   *   A forum array.
+   * @param boolean $container
+   *   TRUE if $forum is a container; FALSE otherwise.
+   *
+   * @return object
+   *   The created topic node.
+   */
+  function createForumTopic($forum, $container = FALSE) {
+    // Generate a random subject/body.
+    $title = $this->randomName(20);
+    $body = $this->randomName(200);
+
+    $langcode = LANGUAGE_NONE;
+    $edit = array(
+      "title" => $title,
+      "body[$langcode][0][value]" => $body,
+    );
+    $tid = $forum['tid'];
+
+    // Create the forum topic, preselecting the forum ID via a URL parameter.
+    $this->drupalPost('node/add/forum/' . $tid, $edit, t('Save'));
+
+    $type = t('Forum topic');
+    if ($container) {
+      $this->assertNoRaw(t('@type %title has been created.', array('@type' => $type, '%title' => $title)), 'Forum topic was not created');
+      $this->assertRaw(t('The item %title is a forum container, not a forum.', array('%title' => $forum['name'])), 'Error message was shown');
+      return;
+    }
+    else {
+      $this->assertRaw(t('@type %title has been created.', array('@type' => $type, '%title' => $title)), 'Forum topic was created');
+      $this->assertNoRaw(t('The item %title is a forum container, not a forum.', array('%title' => $forum['name'])), 'No error message was shown');
+    }
+
+    // Retrieve node object, ensure that the topic was created and in the proper forum.
+    $node = $this->drupalGetNodeByTitle($title);
+    $this->assertTrue($node != NULL, format_string('Node @title was loaded', array('@title' => $title)));
+    $this->assertEqual($node->taxonomy_forums[LANGUAGE_NONE][0]['tid'], $tid, 'Saved forum topic was in the expected forum');
+
+    // View forum topic.
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw($title, 'Subject was found');
+    $this->assertRaw($body, 'Body was found');
+
+    return $node;
+  }
+
+  /**
+   * Verifies that the logged in user has access to a forum nodes.
+   *
+   * @param $node_user
+   *   The user who creates the node.
+   * @param $node
+   *   The node being checked.
+   * @param $admin
+   *   Boolean to indicate whether the user can 'access administration pages'.
+   * @param $response
+   *   The exptected HTTP response code.
+   */
+  private function verifyForums($node_user, $node, $admin, $response = 200) {
+    $response2 = ($admin) ? 200 : 403;
+
+    // View forum help node.
+    $this->drupalGet('admin/help/forum');
+    $this->assertResponse($response2);
+    if ($response2 == 200) {
+      $this->assertTitle(t('Forum | Drupal'), 'Forum help title was displayed');
+      $this->assertText(t('Forum'), 'Forum help node was displayed');
+    }
+
+    // Verify the forum blocks were displayed.
+    $this->drupalGet('');
+    $this->assertResponse(200);
+    $this->assertText(t('New forum topics'), '[New forum topics] Forum block was displayed');
+
+    // View forum container page.
+    $this->verifyForumView($this->container);
+    // View forum page.
+    $this->verifyForumView($this->forum, $this->container);
+    // View root forum page.
+    $this->verifyForumView($this->root_forum);
+
+    // View forum node.
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertResponse(200);
+    $this->assertTitle($node->title . ' | Drupal', 'Forum node was displayed');
+    $breadcrumb = array(
+      l(t('Home'), NULL),
+      l(t('Forums'), 'forum'),
+      l($this->container['name'], 'forum/' . $this->container['tid']),
+      l($this->forum['name'], 'forum/' . $this->forum['tid']),
+    );
+    $this->assertRaw(theme('breadcrumb', array('breadcrumb' => $breadcrumb)), 'Breadcrumbs were displayed');
+
+    // View forum edit node.
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertResponse($response);
+    if ($response == 200) {
+      $this->assertTitle('Edit Forum topic ' . $node->title . ' | Drupal', 'Forum edit node was displayed');
+    }
+
+    if ($response == 200) {
+      // Edit forum node (including moving it to another forum).
+      $edit = array();
+      $langcode = LANGUAGE_NONE;
+      $edit["title"] = 'node/' . $node->nid;
+      $edit["body[$langcode][0][value]"] = $this->randomName(256);
+      // Assume the topic is initially associated with $forum.
+      $edit["taxonomy_forums[$langcode]"] = $this->root_forum['tid'];
+      $edit['shadow'] = TRUE;
+      $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+      $this->assertRaw(t('Forum topic %title has been updated.', array('%title' => $edit["title"])), 'Forum node was edited');
+
+      // Verify topic was moved to a different forum.
+      $forum_tid = db_query("SELECT tid FROM {forum} WHERE nid = :nid AND vid = :vid", array(
+        ':nid' => $node->nid,
+        ':vid' => $node->vid,
+      ))->fetchField();
+      $this->assertTrue($forum_tid == $this->root_forum['tid'], 'The forum topic is linked to a different forum');
+
+      // Delete forum node.
+      $this->drupalPost('node/' . $node->nid . '/delete', array(), t('Delete'));
+      $this->assertResponse($response);
+      $this->assertRaw(t('Forum topic %title has been deleted.', array('%title' => $edit['title'])), 'Forum node was deleted');
+    }
+  }
+
+  /**
+   * Verifies display of forum page.
+   *
+   * @param $forum
+   *   A row from the taxonomy_term_data table in an array.
+   * @param $parent
+   *   (optional) An array representing the forum's parent.
+   */
+  private function verifyForumView($forum, $parent = NULL) {
+    // View forum page.
+    $this->drupalGet('forum/' . $forum['tid']);
+    $this->assertResponse(200);
+    $this->assertTitle($forum['name'] . ' | Drupal', 'Forum name was displayed');
+
+    $breadcrumb = array(
+      l(t('Home'), NULL),
+      l(t('Forums'), 'forum'),
+    );
+    if (isset($parent)) {
+      $breadcrumb[] = l($parent['name'], 'forum/' . $parent['tid']);
+    }
+
+    $this->assertRaw(theme('breadcrumb', array('breadcrumb' => $breadcrumb)), 'Breadcrumbs were displayed');
+  }
+
+  /**
+   * Generates forum topics to test the display of an active forum block.
+   *
+   * @param array $forum
+   *   The foorum array (a row from taxonomy_term_data table).
+   */
+  private function generateForumTopics($forum) {
+    $this->nids = array();
+    for ($i = 0; $i < 5; $i++) {
+      $node = $this->createForumTopic($this->forum, FALSE);
+      $this->nids[] = $node->nid;
+    }
+  }
+
+  /**
+   * Views forum topics to test the display of an active forum block.
+   *
+   * @todo The logic here is completely incorrect, since the active forum topics
+   *   block is determined by comments on the node, not by views.
+   * @todo DIE
+   *
+   * @param $nids
+   *   An array of forum node IDs.
+   */
+  private function viewForumTopics($nids) {
+    for ($i = 0; $i < 2; $i++) {
+      foreach ($nids as $nid) {
+        $this->drupalGet('node/' . $nid);
+        $this->drupalGet('node/' . $nid);
+        $this->drupalGet('node/' . $nid);
+      }
+    }
+  }
+}
+
+/**
+ * Tests the forum index listing.
+ */
+class ForumIndexTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Forum index',
+      'description' => 'Tests the forum index listing.',
+      'group' => 'Forum',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('taxonomy', 'comment', 'forum');
+
+    // Create a test user.
+    $web_user = $this->drupalCreateUser(array('create forum content', 'edit own forum content', 'edit any forum content', 'administer nodes'));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Tests the forum index for published and unpublished nodes.
+   */
+  function testForumIndexStatus() {
+
+    $langcode = LANGUAGE_NONE;
+
+    // The forum ID to use.
+    $tid = 1;
+
+    // Create a test node.
+    $title = $this->randomName(20);
+    $edit = array(
+      "title" => $title,
+      "body[$langcode][0][value]" => $this->randomName(200),
+    );
+
+    // Create the forum topic, preselecting the forum ID via a URL parameter.
+    $this->drupalPost('node/add/forum/' . $tid, $edit, t('Save'));
+
+    // Check that the node exists in the database.
+    $node = $this->drupalGetNodeByTitle($title);
+    $this->assertTrue(!empty($node), 'New forum node found in database.');
+
+    // Verify that the node appears on the index.
+    $this->drupalGet('forum/' . $tid);
+    $this->assertText($title, 'Published forum topic appears on index.');
+
+    // Unpublish the node.
+    $edit = array(
+      'status' => FALSE,
+    );
+    $this->drupalPost("node/{$node->nid}/edit", $edit, t('Save'));
+    $this->drupalGet("node/{$node->nid}");
+    $this->assertText(t('Access denied'), 'Unpublished node is no longer accessible.');
+
+    // Verify that the node no longer appears on the index.
+    $this->drupalGet('forum/' . $tid);
+    $this->assertNoText($title, 'Unpublished forum topic no longer appears on index.');
+  }
+}
diff --git a/htmltest/modules/forum/forums.tpl.php b/htmltest/modules/forum/forums.tpl.php
new file mode 100644
index 00000000..6a0e02e6
--- /dev/null
+++ b/htmltest/modules/forum/forums.tpl.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @file
+ * Displays a forum.
+ *
+ * May contain forum containers as well as forum topics.
+ *
+ * Available variables:
+ * - $forums: The forums to display (as processed by forum-list.tpl.php).
+ * - $topics: The topics to display (as processed by forum-topic-list.tpl.php).
+ * - $forums_defined: A flag to indicate that the forums are configured.
+ *
+ * @see template_preprocess_forums()
+ *
+ * @ingroup themeable
+ */
+?>
+<?php if ($forums_defined): ?>
+<div id="forum">
+  <?php print $forums; ?>
+  <?php print $topics; ?>
+</div>
+<?php endif; ?>
diff --git a/htmltest/modules/help/help-rtl.css b/htmltest/modules/help/help-rtl.css
new file mode 100644
index 00000000..8e40a8c2
--- /dev/null
+++ b/htmltest/modules/help/help-rtl.css
@@ -0,0 +1,10 @@
+
+.help-items {
+  float: right;
+  padding-right: 0;
+  padding-left: 3%;
+}
+.help-items-last {
+  padding-right: 0;
+  padding-left: 0;
+}
diff --git a/htmltest/modules/help/help.admin.inc b/htmltest/modules/help/help.admin.inc
new file mode 100644
index 00000000..ec1a18e3
--- /dev/null
+++ b/htmltest/modules/help/help.admin.inc
@@ -0,0 +1,86 @@
+<?php
+
+/**
+ * @file
+ * Admin page callbacks for the help module.
+ */
+
+/**
+ * Menu callback; prints a page listing a glossary of Drupal terminology.
+ */
+function help_main() {
+  // Add CSS
+  drupal_add_css(drupal_get_path('module', 'help') . '/help.css');
+  $output = '<h2>' . t('Help topics') . '</h2><p>' . t('Help is available on the following items:') . '</p>' . help_links_as_list();
+  return $output;
+}
+
+/**
+ * Menu callback; prints a page listing general help for a module.
+ *
+ * @param $name
+ *   A module name to display a help page for.
+ */
+function help_page($name) {
+  $output = '';
+  if (module_hook($name, 'help')) {
+    $info = system_get_info('module');
+    drupal_set_title($info[$name]['name']);
+
+    $temp = module_invoke($name, 'help', "admin/help#$name", drupal_help_arg());
+    if (empty($temp)) {
+      $output .= t("No help is available for module %module.", array('%module' => $info[$name]['name']));
+    }
+    else {
+      $output .= $temp;
+    }
+
+    // Only print list of administration pages if the module in question has
+    // any such pages associated to it.
+    $admin_tasks = system_get_module_admin_tasks($name, $info[$name]);
+    if (!empty($admin_tasks)) {
+      $links = array();
+      foreach ($admin_tasks as $task) {
+        $links[] = l($task['title'], $task['link_path'], $task['localized_options']);
+      }
+      $output .= theme('item_list', array('items' => $links, 'title' => t('@module administration pages', array('@module' => $info[$name]['name']))));
+    }
+  }
+  return $output;
+}
+
+/**
+ * Provides a formatted list of available help topics.
+ *
+ * @return
+ *   A string containing the formatted list.
+ */
+function help_links_as_list() {
+  $empty_arg = drupal_help_arg();
+  $module_info = system_rebuild_module_data();
+
+  $modules = array();
+  foreach (module_implements('help', TRUE) as $module) {
+    if (module_invoke($module, 'help', "admin/help#$module", $empty_arg)) {
+      $modules[$module] = $module_info[$module]->info['name'];
+    }
+  }
+  asort($modules);
+
+  // Output pretty four-column list.
+  $count = count($modules);
+  $break = ceil($count / 4);
+  $output = '<div class="clearfix"><div class="help-items"><ul>';
+  $i = 0;
+  foreach ($modules as $module => $name) {
+    $output .= '<li>' . l($name, 'admin/help/' . $module) . '</li>';
+    if (($i + 1) % $break == 0 && ($i + 1) != $count) {
+      $output .= '</ul></div><div class="help-items' . ($i + 1 == $break * 3 ? ' help-items-last' : '') . '"><ul>';
+    }
+    $i++;
+  }
+  $output .= '</ul></div></div>';
+
+  return $output;
+}
+
diff --git a/htmltest/modules/help/help.api.php b/htmltest/modules/help/help.api.php
new file mode 100644
index 00000000..f7d9c08b
--- /dev/null
+++ b/htmltest/modules/help/help.api.php
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Help module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Provide online user help.
+ *
+ * By implementing hook_help(), a module can make documentation available to
+ * the user for the module as a whole, or for specific paths.  Help for
+ * developers should usually be provided via function header comments in the
+ * code, or in special API example files.
+ *
+ * For a detailed usage example, see page_example.module.
+ *
+ * @param $path
+ *   The router menu path, as defined in hook_menu(), for the help that is
+ *   being requested; e.g., 'admin/people' or 'user/register'.  If the router
+ *   path includes a wildcard, then this will appear in $path as %, even if it
+ *   is a named %autoloader wildcard in the hook_menu() implementation; for
+ *   example, node pages would have $path equal to 'node/%' or 'node/%/view'.
+ *   To provide a help page for a whole module with a listing on admin/help,
+ *   your hook implementation should match a path with a special descriptor
+ *   after a "#" sign:
+ *     'admin/help#modulename'
+ *       The main module help text, displayed on the admin/help/modulename
+ *       page and linked to from the admin/help page.
+ * @param $arg
+ *   An array that corresponds to the return value of the arg() function, for
+ *   modules that want to provide help that is specific to certain values
+ *   of wildcards in $path. For example, you could provide help for the path
+ *   'user/1' by looking for the path 'user/%' and $arg[1] == '1'. This given
+ *   array should always be used rather than directly invoking arg(), because
+ *   your hook implementation may be called for other purposes besides building
+ *   the current page's help. Note that depending on which module is invoking
+ *   hook_help, $arg may contain only empty strings. Regardless, $arg[0] to
+ *   $arg[11] will always be set.
+ *
+ * @return
+ *   A localized string containing the help text.
+ */
+function hook_help($path, $arg) {
+  switch ($path) {
+    // Main module help for the block module
+    case 'admin/help#block':
+      return '<p>' . t('Blocks are boxes of content rendered into an area, or region, of a web page. The default theme Bartik, for example, implements the regions "Sidebar first", "Sidebar second", "Featured", "Content", "Header", "Footer", etc., and a block may appear in any one of these areas. The <a href="@blocks">blocks administration page</a> provides a drag-and-drop interface for assigning a block to a region, and for controlling the order of blocks within regions.', array('@blocks' => url('admin/structure/block'))) . '</p>';
+
+    // Help for another path in the block module
+    case 'admin/structure/block':
+      return '<p>' . t('This page provides a drag-and-drop interface for assigning a block to a region, and for controlling the order of blocks within regions. Since not all themes implement the same regions, or display regions in the same way, blocks are positioned on a per-theme basis. Remember that your changes will not be saved until you click the <em>Save blocks</em> button at the bottom of the page.') . '</p>';
+  }
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/help/help.css b/htmltest/modules/help/help.css
new file mode 100644
index 00000000..92281707
--- /dev/null
+++ b/htmltest/modules/help/help.css
@@ -0,0 +1,9 @@
+
+.help-items {
+  float: left; /* LTR */
+  width: 22%;
+  padding-right: 3%; /* LTR */
+}
+.help-items-last {
+  padding-right: 0; /* LTR */
+}
diff --git a/htmltest/modules/help/help.info b/htmltest/modules/help/help.info
new file mode 100644
index 00000000..2743a4f2
--- /dev/null
+++ b/htmltest/modules/help/help.info
@@ -0,0 +1,12 @@
+name = Help
+description = Manages the display of online help.
+package = Core
+version = VERSION
+core = 7.x
+files[] = help.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/help/help.module b/htmltest/modules/help/help.module
new file mode 100644
index 00000000..53a9f716
--- /dev/null
+++ b/htmltest/modules/help/help.module
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @file
+ * Manages displaying online help.
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function help_menu() {
+  $items['admin/help'] = array(
+    'title' => 'Help',
+    'description' => 'Reference for usage, configuration, and modules.',
+    'page callback' => 'help_main',
+    'access arguments' => array('access administration pages'),
+    'weight' => 9,
+    'file' => 'help.admin.inc',
+  );
+
+  foreach (module_implements('help', TRUE) as $module) {
+    $items['admin/help/' . $module] = array(
+      'title' => $module,
+      'page callback' => 'help_page',
+      'page arguments' => array(2),
+      'access arguments' => array('access administration pages'),
+      'type' => MENU_VISIBLE_IN_BREADCRUMB,
+      'file' => 'help.admin.inc',
+    );
+  }
+
+  return $items;
+}
+
+/**
+ * Implements hook_help().
+ */
+function help_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help':
+      $output = '<p>' . t('Follow these steps to set up and start using your website:') . '</p>';
+      $output .= '<ol>';
+      $output .= '<li>' . t('<strong>Configure your website</strong> Once logged in, visit the <a href="@admin">administration section</a>, where you can <a href="@config">customize and configure</a> all aspects of your website.', array('@admin' => url('admin'), '@config' => url('admin/config'))) . '</li>';
+      $output .= '<li>' . t('<strong>Enable additional functionality</strong> Next, visit the <a href="@modules">module list</a> and enable features which suit your specific needs. You can find additional modules in the <a href="@download_modules">Drupal modules download section</a>.', array('@modules' => url('admin/modules'), '@download_modules' => 'http://drupal.org/project/modules')) . '</li>';
+      $output .= '<li>' . t('<strong>Customize your website design</strong> To change the "look and feel" of your website, visit the <a href="@themes">themes section</a>. You may choose from one of the included themes or download additional themes from the <a href="@download_themes">Drupal themes download section</a>.', array('@themes' => url('admin/appearance'), '@download_themes' => 'http://drupal.org/project/themes')) . '</li>';
+      $output .= '<li>' . t('<strong>Start posting content</strong> Finally, you can <a href="@content">add new content</a> for your website.', array('@content' => url('node/add'))) . '</li>';
+      $output .= '</ol>';
+      $output .= '<p>' . t('For more information, refer to the specific topics listed in the next section or to the <a href="@handbook">online Drupal handbooks</a>. You may also post at the <a href="@forum">Drupal forum</a> or view the wide range of <a href="@support">other support options</a> available.', array('@help' => url('admin/help'), '@handbook' => 'http://drupal.org/documentation', '@forum' => 'http://drupal.org/forum', '@support' => 'http://drupal.org/support')) . '</p>';
+      return $output;
+    case 'admin/help#help':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Help module provides <a href="@help-page">Help reference pages</a> and context-sensitive advice to guide you through the use and configuration of modules. It is a starting point for the online <a href="@handbook">Drupal handbooks</a>. The handbooks contain more extensive and up-to-date information, are annotated with user-contributed comments, and serve as the definitive reference point for all Drupal documentation. For more information, see the online handbook entry for the <a href="@help">Help module</a>.', array('@help' => 'http://drupal.org/documentation/modules/help/', '@handbook' => 'http://drupal.org/documentation', '@help-page' => url('admin/help'))) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Providing a help reference') . '</dt>';
+      $output .= '<dd>' . t('The Help module displays explanations for using each module listed on the main <a href="@help">Help reference page</a>.', array('@help' => url('admin/help'))) . '</dd>';
+      $output .= '<dt>' . t('Providing context-sensitive help') . '</dt>';
+      $output .= '<dd>' . t('The Help module displays context-sensitive advice and explanations on various pages.') . '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
diff --git a/htmltest/modules/help/help.test b/htmltest/modules/help/help.test
new file mode 100644
index 00000000..da12ccc5
--- /dev/null
+++ b/htmltest/modules/help/help.test
@@ -0,0 +1,137 @@
+<?php
+
+/**
+ * @file
+ * Tests for help.module.
+ */
+
+/**
+ * Tests help display and user access for all modules implementing help.
+ */
+class HelpTestCase extends DrupalWebTestCase {
+  /**
+   * The admin user that will be created.
+   */
+  protected $big_user;
+
+  /**
+   * The anonymous user that will be created.
+   */
+  protected $any_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Help functionality',
+      'description' => 'Verify help display and user access to help based on permissions.',
+      'group' => 'Help',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('blog', 'poll');
+
+    $this->getModuleList();
+
+    // Create users.
+    $this->big_user = $this->drupalCreateUser(array('access administration pages', 'view the administration theme', 'administer permissions'));
+    $this->any_user = $this->drupalCreateUser(array());
+  }
+
+  /**
+   * Logs in users, creates dblog events, and tests dblog functionality.
+   */
+  function testHelp() {
+    // Login the admin user.
+    $this->drupalLogin($this->big_user);
+    $this->verifyHelp();
+
+    // Login the regular user.
+    $this->drupalLogin($this->any_user);
+    $this->verifyHelp(403);
+
+    // Check for css on admin/help.
+    $this->drupalLogin($this->big_user);
+    $this->drupalGet('admin/help');
+    $this->assertRaw(drupal_get_path('module', 'help') . '/help.css', 'The help.css file is present in the HTML.');
+
+    // Verify that introductory help text exists, goes for 100% module coverage.
+    $this->assertRaw(t('For more information, refer to the specific topics listed in the next section or to the <a href="@drupal">online Drupal handbooks</a>.', array('@drupal' => 'http://drupal.org/documentation')), 'Help intro text correctly appears.');
+
+    // Verify that help topics text appears.
+    $this->assertRaw('<h2>' . t('Help topics') . '</h2><p>' . t('Help is available on the following items:') . '</p>', 'Help topics text correctly appears.');
+
+    // Make sure links are properly added for modules implementing hook_help().
+    foreach ($this->modules as $module => $name) {
+      $this->assertLink($name, 0, format_string('Link properly added to @name (admin/help/@module)', array('@module' => $module, '@name' => $name)));
+    }
+  }
+
+  /**
+   * Verifies the logged in user has access to the various help nodes.
+   *
+   * @param integer $response
+   *   An HTTP response code.
+   */
+  protected function verifyHelp($response = 200) {
+    foreach ($this->modules as $module => $name) {
+      // View module help node.
+      $this->drupalGet('admin/help/' . $module);
+      $this->assertResponse($response);
+      if ($response == 200) {
+        $this->assertTitle($name . ' | Drupal', format_string('%module title was displayed', array('%module' => $module)));
+        $this->assertRaw('<h1 class="page-title">' . t($name) . '</h1>', format_string('%module heading was displayed', array('%module' => $module)));
+       }
+    }
+  }
+
+  /**
+   * Gets the list of enabled modules that implement hook_help().
+   *
+   * @return array
+   *   A list of enabled modules.
+   */
+  protected function getModuleList() {
+    $this->modules = array();
+    $result = db_query("SELECT name, filename, info FROM {system} WHERE type = 'module' AND status = 1 ORDER BY weight ASC, filename ASC");
+    foreach ($result as $module) {
+      if (file_exists($module->filename) && function_exists($module->name . '_help')) {
+        $fullname = unserialize($module->info);
+        $this->modules[$module->name] = $fullname['name'];
+      }
+    }
+  }
+}
+
+/**
+ * Tests a module without help to verify it is not listed in the help page.
+ */
+class NoHelpTestCase extends DrupalWebTestCase {
+  /**
+   * The user who will be created.
+   */
+  protected $big_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'No help',
+      'description' => 'Verify no help is displayed for modules not providing any help.',
+      'group' => 'Help',
+    );
+  }
+
+  function setUp() {
+    // Use one of the test modules that do not implement hook_help().
+    parent::setUp('menu_test');
+    $this->big_user = $this->drupalCreateUser(array('access administration pages'));
+  }
+
+  /**
+   * Ensures modules not implementing help do not appear on admin/help.
+   */
+  function testMainPageNoHelp() {
+    $this->drupalLogin($this->big_user);
+
+    $this->drupalGet('admin/help');
+    $this->assertNoText('Hook menu tests', 'Making sure the test module menu_test does not display a help link in admin/help');
+  }
+}
diff --git a/htmltest/modules/image/image-rtl.css b/htmltest/modules/image/image-rtl.css
new file mode 100644
index 00000000..2a7a855e
--- /dev/null
+++ b/htmltest/modules/image/image-rtl.css
@@ -0,0 +1,11 @@
+
+/**
+ * Image upload widget.
+ */
+div.image-preview {
+  float: right;
+  padding: 0 0 10px 10px;
+}
+div.image-widget-data {
+  float: right;
+}
diff --git a/htmltest/modules/image/image.admin.css b/htmltest/modules/image/image.admin.css
new file mode 100644
index 00000000..3115c8dc
--- /dev/null
+++ b/htmltest/modules/image/image.admin.css
@@ -0,0 +1,60 @@
+
+/**
+ * Image style configuration pages.
+ */
+div.image-style-new,
+div.image-style-new div {
+  display: inline;
+}
+div.image-style-preview div.preview-image-wrapper {
+  float: left;
+  padding-bottom: 2em;
+  text-align: center;
+  top: 50%;
+  width: 48%;
+}
+div.image-style-preview div.preview-image {
+  margin: auto;
+  position: relative;
+}
+div.image-style-preview div.preview-image div.width {
+  border: 1px solid #666;
+  border-top: none;
+  height: 2px;
+  left: -1px;
+  bottom: -6px;
+  position: absolute;
+}
+div.image-style-preview div.preview-image div.width span {
+  position: relative;
+  top: 4px;
+}
+div.image-style-preview div.preview-image div.height {
+  border: 1px solid #666;
+  border-left: none;
+  position: absolute;
+  right: -6px;
+  top: -1px;
+  width: 2px;
+}
+div.image-style-preview div.preview-image div.height span {
+  height: 2em;
+  left: 10px;
+  margin-top: -1em;
+  position: absolute;
+  top: 50%;
+}
+
+/**
+ * Image anchor element.
+ */
+table.image-anchor {
+  width: auto;
+}
+table.image-anchor tr.even,
+table.image-anchor tr.odd {
+  background: none;
+}
+table.image-anchor td {
+  border: 1px solid #CCC;
+}
diff --git a/htmltest/modules/image/image.admin.inc b/htmltest/modules/image/image.admin.inc
new file mode 100644
index 00000000..7e626219
--- /dev/null
+++ b/htmltest/modules/image/image.admin.inc
@@ -0,0 +1,925 @@
+<?php
+
+/**
+ * @file
+ * Administration pages for image settings.
+ */
+
+/**
+ * Menu callback; Listing of all current image styles.
+ */
+function image_style_list() {
+  $page = array();
+
+  $styles = image_styles();
+  $page['image_style_list'] = array(
+    '#markup' => theme('image_style_list', array('styles' => $styles)),
+    '#attached' => array(
+      'css' => array(drupal_get_path('module', 'image') . '/image.admin.css' => array()),
+    ),
+  );
+
+  return $page;
+
+}
+
+/**
+ * Form builder; Edit an image style name and effects order.
+ *
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param $style
+ *   An image style array.
+ * @ingroup forms
+ * @see image_style_form_submit()
+ */
+function image_style_form($form, &$form_state, $style) {
+  $title = t('Edit %name style', array('%name' => $style['label']));
+  drupal_set_title($title, PASS_THROUGH);
+
+  // Adjust this form for styles that must be overridden to edit.
+  $editable = (bool) ($style['storage'] & IMAGE_STORAGE_EDITABLE);
+
+  if (!$editable && empty($form_state['input'])) {
+    drupal_set_message(t('This image style is currently being provided by a module. Click the "Override defaults" button to change its settings.'), 'warning');
+  }
+
+  $form_state['image_style'] = $style;
+  $form['#tree'] = TRUE;
+  $form['#attached']['css'][drupal_get_path('module', 'image') . '/image.admin.css'] = array();
+
+  // Show the thumbnail preview.
+  $form['preview'] = array(
+    '#type' => 'item',
+    '#title' => t('Preview'),
+    '#markup' => theme('image_style_preview', array('style' => $style)),
+  );
+
+  // Show the Image Style label.
+  $form['label'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Image style name'),
+    '#default_value' => $style['label'],
+    '#disabled' => !$editable,
+    '#required' => TRUE,
+  );
+
+  // Allow the name of the style to be changed, unless this style is
+  // provided by a module's hook_default_image_styles().
+  $form['name'] = array(
+    '#type' => 'machine_name',
+    '#size' => '64',
+    '#default_value' => $style['name'],
+    '#disabled' => !$editable,
+    '#description' => t('The name is used in URLs for generated images. Use only lowercase alphanumeric characters, underscores (_), and hyphens (-).'),
+    '#required' => TRUE,
+    '#machine_name' => array(
+      'exists' => 'image_style_load',
+      'source' => array('label'),
+      'replace_pattern' => '[^0-9a-z_\-]',
+      'error' => t('Please only use lowercase alphanumeric characters, underscores (_), and hyphens (-) for style names.'),
+    ),
+  );
+
+  // Build the list of existing image effects for this image style.
+  $form['effects'] = array(
+    '#theme' => 'image_style_effects',
+  );
+  foreach ($style['effects'] as $key => $effect) {
+    $form['effects'][$key]['#weight'] = isset($form_state['input']['effects']) ? $form_state['input']['effects'][$key]['weight'] : NULL;
+    $form['effects'][$key]['label'] = array(
+      '#markup' => $effect['label'],
+    );
+    $form['effects'][$key]['summary'] = array(
+      '#markup' => isset($effect['summary theme']) ? theme($effect['summary theme'], array('data' => $effect['data'])) : '',
+    );
+    $form['effects'][$key]['weight'] = array(
+      '#type' => 'weight',
+      '#title' => t('Weight for @title', array('@title' => $effect['label'])),
+      '#title_display' => 'invisible',
+      '#default_value' => $effect['weight'],
+      '#access' => $editable,
+    );
+
+    // Only attempt to display these fields for editable styles as the 'ieid'
+    // key is not set for styles defined in code.
+    if ($editable) {
+      $form['effects'][$key]['configure'] = array(
+        '#type' => 'link',
+        '#title' => t('edit'),
+        '#href' => 'admin/config/media/image-styles/edit/' . $style['name'] . '/effects/' . $effect['ieid'],
+        '#access' => $editable && isset($effect['form callback']),
+      );
+      $form['effects'][$key]['remove'] = array(
+        '#type' => 'link',
+        '#title' => t('delete'),
+        '#href' => 'admin/config/media/image-styles/edit/' . $style['name'] . '/effects/' . $effect['ieid'] . '/delete',
+        '#access' => $editable,
+      );
+    }
+  }
+
+  // Build the new image effect addition form and add it to the effect list.
+  $new_effect_options = array();
+  foreach (image_effect_definitions() as $effect => $definition) {
+    $new_effect_options[$effect] = check_plain($definition['label']);
+  }
+  $form['effects']['new'] = array(
+    '#tree' => FALSE,
+    '#weight' => isset($form_state['input']['weight']) ? $form_state['input']['weight'] : NULL,
+    '#access' => $editable,
+  );
+  $form['effects']['new']['new'] = array(
+    '#type' => 'select',
+    '#title' => t('Effect'),
+    '#title_display' => 'invisible',
+    '#options' => $new_effect_options,
+    '#empty_option' => t('Select a new effect'),
+  );
+  $form['effects']['new']['weight'] = array(
+    '#type' => 'weight',
+    '#title' => t('Weight for new effect'),
+    '#title_display' => 'invisible',
+    '#default_value' => count($form['effects']) - 1,
+  );
+  $form['effects']['new']['add'] = array(
+    '#type' => 'submit',
+    '#value' => t('Add'),
+    '#validate' => array('image_style_form_add_validate'),
+    '#submit' => array('image_style_form_submit', 'image_style_form_add_submit'),
+  );
+
+  // Show the Override or Submit button for this style.
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['override'] = array(
+    '#type' => 'submit',
+    '#value' => t('Override defaults'),
+    '#validate' => array(),
+    '#submit' => array('image_style_form_override_submit'),
+    '#access' => !$editable,
+  );
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Update style'),
+    '#access' => $editable,
+  );
+
+  return $form;
+}
+
+/**
+ * Validate handler for adding a new image effect to an image style.
+ */
+function image_style_form_add_validate($form, &$form_state) {
+  if (!$form_state['values']['new']) {
+    form_error($form['effects']['new']['new'], t('Select an effect to add.'));
+  }
+}
+
+/**
+ * Submit handler for adding a new image effect to an image style.
+ */
+function image_style_form_add_submit($form, &$form_state) {
+  $style = $form_state['image_style'];
+  // Check if this field has any configuration options.
+  $effect = image_effect_definition_load($form_state['values']['new']);
+
+  // Load the configuration form for this option.
+  if (isset($effect['form callback'])) {
+    $path = 'admin/config/media/image-styles/edit/' . $form_state['image_style']['name'] . '/add/' . $form_state['values']['new'];
+    $form_state['redirect'] = array($path, array('query' => array('weight' => $form_state['values']['weight'])));
+  }
+  // If there's no form, immediately add the image effect.
+  else {
+    $effect['isid'] = $style['isid'];
+    $effect['weight'] = $form_state['values']['weight'];
+    image_effect_save($effect);
+    drupal_set_message(t('The image effect was successfully applied.'));
+  }
+}
+
+/**
+ * Submit handler for overriding a module-defined style.
+ */
+function image_style_form_override_submit($form, &$form_state) {
+  drupal_set_message(t('The %style style has been overridden, allowing you to change its settings.', array('%style' => $form_state['image_style']['label'])));
+  image_default_style_save($form_state['image_style']);
+}
+
+/**
+ * Submit handler for saving an image style.
+ */
+function image_style_form_submit($form, &$form_state) {
+  // Update the image style.
+  $style = $form_state['image_style'];
+  $style['name'] = $form_state['values']['name'];
+  $style['label'] = $form_state['values']['label'];
+
+  // Update image effect weights.
+  if (!empty($form_state['values']['effects'])) {
+    foreach ($form_state['values']['effects'] as $ieid => $effect_data) {
+      if (isset($style['effects'][$ieid])) {
+        $effect = $style['effects'][$ieid];
+        $effect['weight'] = $effect_data['weight'];
+        image_effect_save($effect);
+      }
+    }
+  }
+
+  image_style_save($style);
+  if ($form_state['values']['op'] == t('Update style')) {
+    drupal_set_message(t('Changes to the style have been saved.'));
+  }
+  $form_state['redirect'] = 'admin/config/media/image-styles/edit/' . $style['name'];
+}
+
+/**
+ * Form builder; Form for adding a new image style.
+ *
+ * @ingroup forms
+ * @see image_style_add_form_submit()
+ */
+function image_style_add_form($form, &$form_state) {
+  $form['label'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Style name'),
+    '#default_value' => '',
+    '#required' => TRUE,
+  );
+  $form['name'] = array(
+    '#type' => 'machine_name',
+    '#description' => t('The name is used in URLs for generated images. Use only lowercase alphanumeric characters, underscores (_), and hyphens (-).'),
+    '#size' => '64',
+    '#required' => TRUE,
+    '#machine_name' => array(
+      'exists' => 'image_style_load',
+      'source' => array('label'),
+      'replace_pattern' => '[^0-9a-z_\-]',
+      'error' => t('Please only use lowercase alphanumeric characters, underscores (_), and hyphens (-) for style names.'),
+    ),
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Create new style'),
+  );
+
+  return $form;
+}
+
+/**
+ * Submit handler for adding a new image style.
+ */
+function image_style_add_form_submit($form, &$form_state) {
+  $style = array(
+    'name' => $form_state['values']['name'],
+    'label' => $form_state['values']['label'],
+  );
+  $style = image_style_save($style);
+  drupal_set_message(t('Style %name was created.', array('%name' => $style['label'])));
+  $form_state['redirect'] = 'admin/config/media/image-styles/edit/' . $style['name'];
+}
+
+/**
+ * Element validate function to ensure unique, URL safe style names.
+ *
+ * This function is no longer used in Drupal core since image style names are
+ * now validated using #machine_name functionality. It is kept for backwards
+ * compatibility (since non-core modules may be using it) and will be removed
+ * in Drupal 8.
+ */
+function image_style_name_validate($element, $form_state) {
+  // Check for duplicates.
+  $styles = image_styles();
+  if (isset($styles[$element['#value']]) && (!isset($form_state['image_style']['isid']) || $styles[$element['#value']]['isid'] != $form_state['image_style']['isid'])) {
+    form_set_error($element['#name'], t('The image style name %name is already in use.', array('%name' => $element['#value'])));
+  }
+
+  // Check for illegal characters in image style names.
+  if (preg_match('/[^0-9a-z_\-]/', $element['#value'])) {
+    form_set_error($element['#name'], t('Please only use lowercase alphanumeric characters, underscores (_), and hyphens (-) for style names.'));
+  }
+}
+
+/**
+ * Form builder; Form for deleting an image style.
+ *
+ * @param $style
+ *   An image style array.
+ *
+ * @ingroup forms
+ * @see image_style_delete_form_submit()
+ */
+function image_style_delete_form($form, &$form_state, $style) {
+  $form_state['image_style'] = $style;
+
+  $replacement_styles = array_diff_key(image_style_options(TRUE, PASS_THROUGH), array($style['name'] => ''));
+  $form['replacement'] = array(
+    '#title' => t('Replacement style'),
+    '#type' => 'select',
+    '#options' => $replacement_styles,
+    '#empty_option' => t('No replacement, just delete'),
+  );
+
+  return confirm_form(
+    $form,
+    t('Optionally select a style before deleting %style', array('%style' => $style['label'])),
+    'admin/config/media/image-styles',
+    t('If this style is in use on the site, you may select another style to replace it. All images that have been generated for this style will be permanently deleted.'),
+    t('Delete'),  t('Cancel')
+  );
+}
+
+/**
+ * Submit handler to delete an image style.
+ */
+function image_style_delete_form_submit($form, &$form_state) {
+  $style = $form_state['image_style'];
+
+  image_style_delete($style, $form_state['values']['replacement']);
+  drupal_set_message(t('Style %name was deleted.', array('%name' => $style['label'])));
+  $form_state['redirect'] = 'admin/config/media/image-styles';
+}
+
+/**
+ * Confirmation form to revert a database style to its default.
+ */
+function image_style_revert_form($form, &$form_state, $style) {
+  $form_state['image_style'] = $style;
+
+  return confirm_form(
+    $form,
+    t('Revert the %style style?', array('%style' => $style['label'])),
+    'admin/config/media/image-styles',
+    t('Reverting this style will delete the customized settings and restore the defaults provided by the @module module.', array('@module' => $style['module'])),
+    t('Revert'),  t('Cancel')
+  );
+}
+
+/**
+ * Submit handler to convert an overridden style to its default.
+ */
+function image_style_revert_form_submit($form, &$form_state) {
+  drupal_set_message(t('The %style style has been reverted to its defaults.', array('%style' => $form_state['image_style']['label'])));
+  image_default_style_revert($form_state['image_style']);
+  $form_state['redirect'] = 'admin/config/media/image-styles';
+}
+
+/**
+ * Form builder; Form for adding and editing image effects.
+ *
+ * This form is used universally for editing all image effects. Each effect adds
+ * its own custom section to the form by calling the form function specified in
+ * hook_image_effects().
+ *
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param $style
+ *   An image style array.
+ * @param $effect
+ *   An image effect array.
+ *
+ * @ingroup forms
+ * @see hook_image_effects()
+ * @see image_effects()
+ * @see image_resize_form()
+ * @see image_scale_form()
+ * @see image_rotate_form()
+ * @see image_crop_form()
+ * @see image_effect_form_submit()
+ */
+function image_effect_form($form, &$form_state, $style, $effect) {
+  if (!empty($effect['data'])) {
+    $title = t('Edit %label effect', array('%label' => $effect['label']));
+  }
+  else{
+    $title = t('Add %label effect', array('%label' => $effect['label']));
+  }
+  drupal_set_title($title, PASS_THROUGH);
+
+  $form_state['image_style'] = $style;
+  $form_state['image_effect'] = $effect;
+
+  // If no configuration for this image effect, return to the image style page.
+  if (!isset($effect['form callback'])) {
+    drupal_goto('admin/config/media/image-styles/edit/' . $style['name']);
+  }
+
+  $form['#tree'] = TRUE;
+  $form['#attached']['css'][drupal_get_path('module', 'image') . '/image.admin.css'] = array();
+  if (function_exists($effect['form callback'])) {
+    $form['data'] = call_user_func($effect['form callback'], $effect['data']);
+  }
+
+  // Check the URL for a weight, then the image effect, otherwise use default.
+  $form['weight'] = array(
+    '#type' => 'hidden',
+    '#value' => isset($_GET['weight']) ? intval($_GET['weight']) : (isset($effect['weight']) ? $effect['weight'] : count($style['effects'])),
+  );
+
+  $form['actions'] = array('#tree' => FALSE, '#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => isset($effect['ieid']) ? t('Update effect') : t('Add effect'),
+  );
+  $form['actions']['cancel'] = array(
+    '#type' => 'link',
+    '#title' => t('Cancel'),
+    '#href' => 'admin/config/media/image-styles/edit/' . $style['name'],
+  );
+
+  return $form;
+}
+
+/**
+ * Submit handler for updating an image effect.
+ */
+function image_effect_form_submit($form, &$form_state) {
+  $style = $form_state['image_style'];
+  $effect = array_merge($form_state['image_effect'], $form_state['values']);
+  $effect['isid'] = $style['isid'];
+  image_effect_save($effect);
+  drupal_set_message(t('The image effect was successfully applied.'));
+  $form_state['redirect'] = 'admin/config/media/image-styles/edit/' . $style['name'];
+}
+
+/**
+ * Form builder; Form for deleting an image effect.
+ *
+ * @param $style
+ *   Name of the image style from which the image effect will be removed.
+ * @param $effect
+ *   Name of the image effect to remove.
+ * @ingroup forms
+ * @see image_effect_delete_form_submit()
+ */
+function image_effect_delete_form($form, &$form_state, $style, $effect) {
+  $form_state['image_style'] = $style;
+  $form_state['image_effect'] = $effect;
+
+  $question = t('Are you sure you want to delete the @effect effect from the %style style?', array('%style' => $style['label'], '@effect' => $effect['label']));
+  return confirm_form($form, $question, 'admin/config/media/image-styles/edit/' . $style['name'], '', t('Delete'));
+}
+
+/**
+ * Submit handler to delete an image effect.
+ */
+function image_effect_delete_form_submit($form, &$form_state) {
+  $style = $form_state['image_style'];
+  $effect = $form_state['image_effect'];
+
+  image_effect_delete($effect);
+  drupal_set_message(t('The image effect %name has been deleted.', array('%name' => $effect['label'])));
+  $form_state['redirect'] = 'admin/config/media/image-styles/edit/' . $style['name'];
+}
+
+/**
+ * Element validate handler to ensure an integer pixel value.
+ *
+ * The property #allow_negative = TRUE may be set to allow negative integers.
+ */
+function image_effect_integer_validate($element, &$form_state) {
+  $value = empty($element['#allow_negative']) ? $element['#value'] : preg_replace('/^-/', '', $element['#value']);
+  if ($element['#value'] != '' && (!is_numeric($value) || intval($value) <= 0)) {
+    if (empty($element['#allow_negative'])) {
+      form_error($element, t('!name must be an integer.', array('!name' => $element['#title'])));
+    }
+    else {
+      form_error($element, t('!name must be a positive integer.', array('!name' => $element['#title'])));
+    }
+  }
+}
+
+/**
+ * Element validate handler to ensure a hexadecimal color value.
+ */
+function image_effect_color_validate($element, &$form_state) {
+  if ($element['#value'] != '') {
+    $hex_value = preg_replace('/^#/', '', $element['#value']);
+    if (!preg_match('/^#[0-9A-F]{3}([0-9A-F]{3})?$/', $element['#value'])) {
+      form_error($element, t('!name must be a hexadecimal color value.', array('!name' => $element['#title'])));
+    }
+  }
+}
+
+/**
+ * Element validate handler to ensure that either a height or a width is
+ * specified.
+ */
+function image_effect_scale_validate($element, &$form_state) {
+  if (empty($element['width']['#value']) && empty($element['height']['#value'])) {
+    form_error($element, t('Width and height can not both be blank.'));
+  }
+}
+
+/**
+ * Form structure for the image resize form.
+ *
+ * Note that this is not a complete form, it only contains the portion of the
+ * form for configuring the resize options. Therefore it does not not need to
+ * include metadata about the effect, nor a submit button.
+ *
+ * @param $data
+ *   The current configuration for this resize effect.
+ */
+function image_resize_form($data) {
+  $form['width'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Width'),
+    '#default_value' => isset($data['width']) ? $data['width'] : '',
+    '#field_suffix' => ' ' . t('pixels'),
+    '#required' => TRUE,
+    '#size' => 10,
+    '#element_validate' => array('image_effect_integer_validate'),
+    '#allow_negative' => FALSE,
+  );
+  $form['height'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Height'),
+    '#default_value' => isset($data['height']) ? $data['height'] : '',
+    '#field_suffix' => ' ' . t('pixels'),
+    '#required' => TRUE,
+    '#size' => 10,
+    '#element_validate' => array('image_effect_integer_validate'),
+    '#allow_negative' => FALSE,
+  );
+  return $form;
+}
+
+/**
+ * Form structure for the image scale form.
+ *
+ * Note that this is not a complete form, it only contains the portion of the
+ * form for configuring the scale options. Therefore it does not not need to
+ * include metadata about the effect, nor a submit button.
+ *
+ * @param $data
+ *   The current configuration for this scale effect.
+ */
+function image_scale_form($data) {
+  $form = image_resize_form($data);
+  $form['#element_validate'] = array('image_effect_scale_validate');
+  $form['width']['#required'] = FALSE;
+  $form['height']['#required'] = FALSE;
+  $form['upscale'] = array(
+    '#type' => 'checkbox',
+    '#default_value' => (isset($data['upscale'])) ? $data['upscale'] : 0,
+    '#title' => t('Allow Upscaling'),
+    '#description' => t('Let scale make images larger than their original size'),
+  );
+  return $form;
+}
+
+/**
+ * Form structure for the image crop form.
+ *
+ * Note that this is not a complete form, it only contains the portion of the
+ * form for configuring the crop options. Therefore it does not not need to
+ * include metadata about the effect, nor a submit button.
+ *
+ * @param $data
+ *   The current configuration for this crop effect.
+ */
+function image_crop_form($data) {
+  $data += array(
+    'width' => '',
+    'height' => '',
+    'anchor' => 'center-center',
+  );
+
+  $form = image_resize_form($data);
+  $form['anchor'] = array(
+    '#type' => 'radios',
+    '#title' => t('Anchor'),
+    '#options' => array(
+      'left-top'      => t('Top') . ' ' . t('Left'),
+      'center-top'    => t('Top') . ' ' . t('Center'),
+      'right-top'     => t('Top') . ' ' . t('Right'),
+      'left-center'   => t('Center') . ' ' . t('Left'),
+      'center-center' => t('Center'),
+      'right-center'  => t('Center') . ' ' . t('Right'),
+      'left-bottom'   => t('Bottom') . ' ' . t('Left'),
+      'center-bottom' => t('Bottom') . ' ' . t('Center'),
+      'right-bottom'  => t('Bottom') . ' ' . t('Right'),
+    ),
+    '#theme' => 'image_anchor',
+    '#default_value' => $data['anchor'],
+    '#description' => t('The part of the image that will be retained during the crop.'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form structure for the image rotate form.
+ *
+ * Note that this is not a complete form, it only contains the portion of the
+ * form for configuring the rotate options. Therefore it does not not need to
+ * include metadata about the effect, nor a submit button.
+ *
+ * @param $data
+ *   The current configuration for this rotate effect.
+ */
+function image_rotate_form($data) {
+  $form['degrees'] = array(
+    '#type' => 'textfield',
+    '#default_value' => (isset($data['degrees'])) ? $data['degrees'] : 0,
+    '#title' => t('Rotation angle'),
+    '#description' => t('The number of degrees the image should be rotated. Positive numbers are clockwise, negative are counter-clockwise.'),
+    '#field_suffix' => '&deg;',
+    '#required' => TRUE,
+    '#size' => 6,
+    '#maxlength' => 4,
+    '#element_validate' => array('image_effect_integer_validate'),
+    '#allow_negative' => TRUE,
+  );
+  $form['bgcolor'] = array(
+    '#type' => 'textfield',
+    '#default_value' => (isset($data['bgcolor'])) ? $data['bgcolor'] : '#FFFFFF',
+    '#title' => t('Background color'),
+    '#description' => t('The background color to use for exposed areas of the image. Use web-style hex colors (#FFFFFF for white, #000000 for black). Leave blank for transparency on image types that support it.'),
+    '#size' => 7,
+    '#maxlength' => 7,
+    '#element_validate' => array('image_effect_color_validate'),
+  );
+  $form['random'] = array(
+    '#type' => 'checkbox',
+    '#default_value' => (isset($data['random'])) ? $data['random'] : 0,
+    '#title' => t('Randomize'),
+    '#description' => t('Randomize the rotation angle for each image. The angle specified above is used as a maximum.'),
+  );
+  return $form;
+}
+
+/**
+ * Returns HTML for the page containing the list of image styles.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - styles: An array of all the image styles returned by image_get_styles().
+ *
+ * @see image_get_styles()
+ * @ingroup themeable
+ */
+function theme_image_style_list($variables) {
+  $styles = $variables['styles'];
+
+  $header = array(t('Style name'), t('Settings'), array('data' => t('Operations'), 'colspan' => 3));
+  $rows = array();
+  foreach ($styles as $style) {
+    $row = array();
+    $row[] = l($style['label'], 'admin/config/media/image-styles/edit/' . $style['name']);
+    $link_attributes = array(
+      'attributes' => array(
+        'class' => array('image-style-link'),
+      ),
+    );
+    if ($style['storage'] == IMAGE_STORAGE_NORMAL) {
+      $row[] = t('Custom');
+      $row[] = l(t('edit'), 'admin/config/media/image-styles/edit/' . $style['name'], $link_attributes);
+      $row[] = l(t('delete'), 'admin/config/media/image-styles/delete/' . $style['name'], $link_attributes);
+    }
+    elseif ($style['storage'] == IMAGE_STORAGE_OVERRIDE) {
+      $row[] = t('Overridden');
+      $row[] = l(t('edit'), 'admin/config/media/image-styles/edit/' . $style['name'], $link_attributes);
+      $row[] = l(t('revert'), 'admin/config/media/image-styles/revert/' . $style['name'], $link_attributes);
+    }
+    else {
+      $row[] = t('Default');
+      $row[] = l(t('edit'), 'admin/config/media/image-styles/edit/' . $style['name'], $link_attributes);
+      $row[] = '';
+    }
+    $rows[] = $row;
+  }
+
+  if (empty($rows)) {
+    $rows[] = array(array(
+      'colspan' => 4,
+      'data' => t('There are currently no styles. <a href="!url">Add a new one</a>.', array('!url' => url('admin/config/media/image-styles/add'))),
+    ));
+  }
+
+  return theme('table', array('header' => $header, 'rows' => $rows));
+}
+
+/**
+ * Returns HTML for a listing of the effects within a specific image style.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_image_style_effects($variables) {
+  $form = $variables['form'];
+
+  $rows = array();
+
+  foreach (element_children($form) as $key) {
+    $row = array();
+    $form[$key]['weight']['#attributes']['class'] = array('image-effect-order-weight');
+    if (is_numeric($key)) {
+      $summary = drupal_render($form[$key]['summary']);
+      $row[] = drupal_render($form[$key]['label']) . (empty($summary) ? '' : ' ' . $summary);
+      $row[] = drupal_render($form[$key]['weight']);
+      $row[] = drupal_render($form[$key]['configure']);
+      $row[] = drupal_render($form[$key]['remove']);
+    }
+    else {
+      // Add the row for adding a new image effect.
+      $row[] = '<div class="image-style-new">' . drupal_render($form['new']['new']) . drupal_render($form['new']['add']) . '</div>';
+      $row[] = drupal_render($form['new']['weight']);
+      $row[] = array('data' => '', 'colspan' => 2);
+    }
+
+    if (!isset($form[$key]['#access']) || $form[$key]['#access']) {
+      $rows[] = array(
+        'data' => $row,
+        'class' => !empty($form[$key]['weight']['#access']) || $key == 'new' ? array('draggable') : array(),
+      );
+    }
+  }
+
+  $header = array(
+    t('Effect'),
+    t('Weight'),
+    array('data' => t('Operations'), 'colspan' => 2),
+  );
+
+  if (count($rows) == 1 && $form['new']['#access']) {
+    array_unshift($rows, array(array(
+      'data' => t('There are currently no effects in this style. Add one by selecting an option below.'),
+      'colspan' => 4,
+    )));
+  }
+
+  $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'image-style-effects')));
+  drupal_add_tabledrag('image-style-effects', 'order', 'sibling', 'image-effect-order-weight');
+  return $output;
+}
+
+/**
+ * Returns HTML for a preview of an image style.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - style: The image style array being previewed.
+ *
+ * @ingroup themeable
+ */
+function theme_image_style_preview($variables) {
+  $style = $variables['style'];
+
+  $sample_image = variable_get('image_style_preview_image', drupal_get_path('module', 'image') . '/sample.png');
+  $sample_width = 160;
+  $sample_height = 160;
+
+  // Set up original file information.
+  $original_path = $sample_image;
+  $original_image = image_get_info($original_path);
+  if ($original_image['width'] > $original_image['height']) {
+    $original_width = min($original_image['width'], $sample_width);
+    $original_height = round($original_width / $original_image['width'] * $original_image['height']);
+  }
+  else {
+    $original_height = min($original_image['height'], $sample_height);
+    $original_width = round($original_height / $original_image['height'] * $original_image['width']);
+  }
+  $original_attributes = array_intersect_key($original_image, array('width' => '', 'height' => ''));
+  $original_attributes['style'] = 'width: ' . $original_width . 'px; height: ' . $original_height . 'px;';
+
+  // Set up preview file information.
+  $preview_file = image_style_path($style['name'], $original_path);
+  if (!file_exists($preview_file)) {
+    image_style_create_derivative($style, $original_path, $preview_file);
+  }
+  $preview_image = image_get_info($preview_file);
+  if ($preview_image['width'] > $preview_image['height']) {
+    $preview_width = min($preview_image['width'], $sample_width);
+    $preview_height = round($preview_width / $preview_image['width'] * $preview_image['height']);
+  }
+  else {
+    $preview_height = min($preview_image['height'], $sample_height);
+    $preview_width = round($preview_height / $preview_image['height'] * $preview_image['width']);
+  }
+  $preview_attributes = array_intersect_key($preview_image, array('width' => '', 'height' => ''));
+  $preview_attributes['style'] = 'width: ' . $preview_width . 'px; height: ' . $preview_height . 'px;';
+
+  // In the previews, timestamps are added to prevent caching of images.
+  $output = '<div class="image-style-preview preview clearfix">';
+
+  // Build the preview of the original image.
+  $original_url = file_create_url($original_path);
+  $output .= '<div class="preview-image-wrapper">';
+  $output .= t('original') . ' (' . l(t('view actual size'), $original_url) . ')';
+  $output .= '<div class="preview-image original-image" style="' . $original_attributes['style'] . '">';
+  $output .= '<a href="' . $original_url . '">' . theme('image', array('path' => $original_path, 'alt' => t('Sample original image'), 'title' => '', 'attributes' => $original_attributes)) . '</a>';
+  $output .= '<div class="height" style="height: ' . $original_height . 'px"><span>' . $original_image['height'] . 'px</span></div>';
+  $output .= '<div class="width" style="width: ' . $original_width . 'px"><span>' . $original_image['width'] . 'px</span></div>';
+  $output .= '</div>'; // End preview-image.
+  $output .= '</div>'; // End preview-image-wrapper.
+
+  // Build the preview of the image style.
+  $preview_url = file_create_url($preview_file) . '?cache_bypass=' . REQUEST_TIME;
+  $output .= '<div class="preview-image-wrapper">';
+  $output .= check_plain($style['label']) . ' (' . l(t('view actual size'), file_create_url($preview_file) . '?' . time()) . ')';
+  $output .= '<div class="preview-image modified-image" style="' . $preview_attributes['style'] . '">';
+  $output .= '<a href="' . file_create_url($preview_file) . '?' . time() . '">' . theme('image', array('path' => $preview_url, 'alt' => t('Sample modified image'), 'title' => '', 'attributes' => $preview_attributes)) . '</a>';
+  $output .= '<div class="height" style="height: ' . $preview_height . 'px"><span>' . $preview_image['height'] . 'px</span></div>';
+  $output .= '<div class="width" style="width: ' . $preview_width . 'px"><span>' . $preview_image['width'] . 'px</span></div>';
+  $output .= '</div>'; // End preview-image.
+  $output .= '</div>'; // End preview-image-wrapper.
+
+  $output .= '</div>'; // End image-style-preview.
+
+  return $output;
+}
+
+/**
+ * Returns HTML for a 3x3 grid of checkboxes for image anchors.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: A render element containing radio buttons.
+ *
+ * @ingroup themeable
+ */
+function theme_image_anchor($variables) {
+  $element = $variables['element'];
+
+  $rows = array();
+  $row = array();
+  foreach (element_children($element) as $n => $key) {
+    $element[$key]['#attributes']['title'] = $element[$key]['#title'];
+    unset($element[$key]['#title']);
+    $row[] = drupal_render($element[$key]);
+    if ($n % 3 == 3 - 1) {
+      $rows[] = $row;
+      $row = array();
+    }
+  }
+
+  return theme('table', array('header' => array(), 'rows' => $rows, 'attributes' => array('class' => array('image-anchor'))));
+}
+
+/**
+ * Returns HTML for a summary of an image resize effect.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - data: The current configuration for this resize effect.
+ *
+ * @ingroup themeable
+ */
+function theme_image_resize_summary($variables) {
+  $data = $variables['data'];
+
+  if ($data['width'] && $data['height']) {
+    return check_plain($data['width']) . 'x' . check_plain($data['height']);
+  }
+  else {
+    return ($data['width']) ? t('width @width', array('@width' => $data['width'])) : t('height @height', array('@height' => $data['height']));
+  }
+}
+
+/**
+ * Returns HTML for a summary of an image scale effect.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - data: The current configuration for this scale effect.
+ *
+ * @ingroup themeable
+ */
+function theme_image_scale_summary($variables) {
+  $data = $variables['data'];
+  return theme('image_resize_summary', array('data' => $data)) . ' ' . ($data['upscale'] ? '(' . t('upscaling allowed') . ')' : '');
+}
+
+/**
+ * Returns HTML for a summary of an image crop effect.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - data: The current configuration for this crop effect.
+ *
+ * @ingroup themeable
+ */
+function theme_image_crop_summary($variables) {
+  return theme('image_resize_summary', $variables);
+}
+
+/**
+ * Returns HTML for a summary of an image rotate effect.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - data: The current configuration for this rotate effect.
+ *
+ * @ingroup themeable
+ */
+function theme_image_rotate_summary($variables) {
+  $data = $variables['data'];
+  return ($data['random']) ? t('random between -@degrees&deg and @degrees&deg', array('@degrees' => str_replace('-', '', $data['degrees']))) : t('@degrees&deg', array('@degrees' => $data['degrees']));
+}
diff --git a/htmltest/modules/image/image.api.php b/htmltest/modules/image/image.api.php
new file mode 100644
index 00000000..81151169
--- /dev/null
+++ b/htmltest/modules/image/image.api.php
@@ -0,0 +1,200 @@
+<?php
+
+/**
+ * @file
+ * Hooks related to image styles and effects.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Define information about image effects provided by a module.
+ *
+ * This hook enables modules to define image manipulation effects for use with
+ * an image style.
+ *
+ * @return
+ *   An array of image effects. This array is keyed on the machine-readable
+ *   effect name. Each effect is defined as an associative array containing the
+ *   following items:
+ *   - "label": The human-readable name of the effect.
+ *   - "effect callback": The function to call to perform this image effect.
+ *   - "dimensions passthrough": (optional) Set this item if the effect doesn't
+ *     change the dimensions of the image.
+ *   - "dimensions callback": (optional) The function to call to transform
+ *     dimensions for this effect.
+ *   - "help": (optional) A brief description of the effect that will be shown
+ *     when adding or configuring this image effect.
+ *   - "form callback": (optional) The name of a function that will return a
+ *     $form array providing a configuration form for this image effect.
+ *   - "summary theme": (optional) The name of a theme function that will output
+ *     a summary of this image effect's configuration.
+ *
+ * @see hook_image_effect_info_alter()
+ */
+function hook_image_effect_info() {
+  $effects = array();
+
+  $effects['mymodule_resize'] = array(
+    'label' => t('Resize'),
+    'help' => t('Resize an image to an exact set of dimensions, ignoring aspect ratio.'),
+    'effect callback' => 'mymodule_resize_effect',
+    'dimensions callback' => 'mymodule_resize_dimensions',
+    'form callback' => 'mymodule_resize_form',
+    'summary theme' => 'mymodule_resize_summary',
+  );
+
+  return $effects;
+}
+
+/**
+ * Alter the information provided in hook_image_effect_info().
+ *
+ * @param $effects
+ *   The array of image effects, keyed on the machine-readable effect name.
+ *
+ * @see hook_image_effect_info()
+ */
+function hook_image_effect_info_alter(&$effects) {
+  // Override the Image module's crop effect with more options.
+  $effects['image_crop']['effect callback'] = 'mymodule_crop_effect';
+  $effects['image_crop']['dimensions callback'] = 'mymodule_crop_dimensions';
+  $effects['image_crop']['form callback'] = 'mymodule_crop_form';
+}
+
+/**
+ * Respond to image style updating.
+ *
+ * This hook enables modules to update settings that might be affected by
+ * changes to an image. For example, updating a module specific variable to
+ * reflect a change in the image style's name.
+ *
+ * @param $style
+ *   The image style array that is being updated.
+ */
+function hook_image_style_save($style) {
+  // If a module defines an image style and that style is renamed by the user
+  // the module should update any references to that style.
+  if (isset($style['old_name']) && $style['old_name'] == variable_get('mymodule_image_style', '')) {
+    variable_set('mymodule_image_style', $style['name']);
+  }
+}
+
+/**
+ * Respond to image style deletion.
+ *
+ * This hook enables modules to update settings when a image style is being
+ * deleted. If a style is deleted, a replacement name may be specified in
+ * $style['name'] and the style being deleted will be specified in
+ * $style['old_name'].
+ *
+ * @param $style
+ *   The image style array that being deleted.
+ */
+function hook_image_style_delete($style) {
+  // Administrators can choose an optional replacement style when deleting.
+  // Update the modules style variable accordingly.
+  if (isset($style['old_name']) && $style['old_name'] == variable_get('mymodule_image_style', '')) {
+    variable_set('mymodule_image_style', $style['name']);
+  }
+}
+
+/**
+ * Respond to image style flushing.
+ *
+ * This hook enables modules to take effect when a style is being flushed (all
+ * images are being deleted from the server and regenerated). Any
+ * module-specific caches that contain information related to the style should
+ * be cleared using this hook. This hook is called whenever a style is updated,
+ * deleted, or any effect associated with the style is update or deleted.
+ *
+ * @param $style
+ *   The image style array that is being flushed.
+ */
+function hook_image_style_flush($style) {
+  // Empty cached data that contains information about the style.
+  cache_clear_all('*', 'cache_mymodule', TRUE);
+}
+
+/**
+ * Modify any image styles provided by other modules or the user.
+ *
+ * This hook allows modules to modify, add, or remove image styles. This may
+ * be useful to modify default styles provided by other modules or enforce
+ * that a specific effect is always enabled on a style. Note that modifications
+ * to these styles may negatively affect the user experience, such as if an
+ * effect is added to a style through this hook, the user may attempt to remove
+ * the effect but it will be immediately be re-added.
+ *
+ * The best use of this hook is usually to modify default styles, which are not
+ * editable by the user until they are overridden, so such interface
+ * contradictions will not occur. This hook can target default (or user) styles
+ * by checking the $style['storage'] property.
+ *
+ * If your module needs to provide a new style (rather than modify an existing
+ * one) use hook_image_default_styles() instead.
+ *
+ * @see hook_image_default_styles()
+ */
+function hook_image_styles_alter(&$styles) {
+  // Check that we only affect a default style.
+  if ($styles['thumbnail']['storage'] == IMAGE_STORAGE_DEFAULT) {
+    // Add an additional effect to the thumbnail style.
+    $styles['thumbnail']['effects'][] = array(
+      'name' => 'image_desaturate',
+      'data' => array(),
+      'weight' => 1,
+      'effect callback' => 'image_desaturate_effect',
+    );
+  }
+}
+
+/**
+ * Provide module-based image styles for reuse throughout Drupal.
+ *
+ * This hook allows your module to provide image styles. This may be useful if
+ * you require images to fit within exact dimensions. Note that you should
+ * attempt to re-use the default styles provided by Image module whenever
+ * possible, rather than creating image styles that are specific to your module.
+ * Image provides the styles "thumbnail", "medium", and "large".
+ *
+ * You may use this hook to more easily manage your site's changes by moving
+ * existing image styles from the database to a custom module. Note however that
+ * moving image styles to code instead storing them in the database has a
+ * negligible effect on performance, since custom image styles are loaded
+ * from the database all at once. Even if all styles are pulled from modules,
+ * Image module will still perform the same queries to check the database for
+ * any custom styles.
+ *
+ * @return
+ *   An array of image styles, keyed by the style name.
+ * @see image_image_default_styles()
+ */
+function hook_image_default_styles() {
+  $styles = array();
+
+  $styles['mymodule_preview'] = array(
+    'label' => 'My module preview',
+    'effects' => array(
+      array(
+        'name' => 'image_scale',
+        'data' => array('width' => 400, 'height' => 400, 'upscale' => 1),
+        'weight' => 0,
+      ),
+      array(
+        'name' => 'image_desaturate',
+        'data' => array(),
+        'weight' => 1,
+      ),
+    ),
+  );
+
+  return $styles;
+}
+
+ /**
+  * @} End of "addtogroup hooks".
+  */
diff --git a/htmltest/modules/image/image.css b/htmltest/modules/image/image.css
new file mode 100644
index 00000000..7db307bf
--- /dev/null
+++ b/htmltest/modules/image/image.css
@@ -0,0 +1,14 @@
+
+/**
+ * Image upload widget.
+ */
+div.image-preview {
+  float: left; /* LTR */
+  padding: 0 10px 10px 0; /* LTR */
+}
+div.image-widget-data {
+  float: left; /* LTR */
+}
+div.image-widget-data input.text-field {
+  width: auto;
+}
diff --git a/htmltest/modules/image/image.effects.inc b/htmltest/modules/image/image.effects.inc
new file mode 100644
index 00000000..35a6a74c
--- /dev/null
+++ b/htmltest/modules/image/image.effects.inc
@@ -0,0 +1,314 @@
+<?php
+
+/**
+ * @file
+ * Functions needed to execute image effects provided by Image module.
+ */
+
+/**
+ * Implements hook_image_effect_info().
+ */
+function image_image_effect_info() {
+  $effects = array(
+    'image_resize' => array(
+      'label' => t('Resize'),
+      'help' => t('Resizing will make images an exact set of dimensions. This may cause images to be stretched or shrunk disproportionately.'),
+      'effect callback' => 'image_resize_effect',
+      'dimensions callback' => 'image_resize_dimensions',
+      'form callback' => 'image_resize_form',
+      'summary theme' => 'image_resize_summary',
+    ),
+    'image_scale' => array(
+      'label' => t('Scale'),
+      'help' => t('Scaling will maintain the aspect-ratio of the original image. If only a single dimension is specified, the other dimension will be calculated.'),
+      'effect callback' => 'image_scale_effect',
+      'dimensions callback' => 'image_scale_dimensions',
+      'form callback' => 'image_scale_form',
+      'summary theme' => 'image_scale_summary',
+    ),
+    'image_scale_and_crop' => array(
+      'label' => t('Scale and crop'),
+      'help' => t('Scale and crop will maintain the aspect-ratio of the original image, then crop the larger dimension. This is most useful for creating perfectly square thumbnails without stretching the image.'),
+      'effect callback' => 'image_scale_and_crop_effect',
+      'dimensions callback' => 'image_resize_dimensions',
+      'form callback' => 'image_resize_form',
+      'summary theme' => 'image_resize_summary',
+    ),
+    'image_crop' => array(
+      'label' => t('Crop'),
+      'help' => t('Cropping will remove portions of an image to make it the specified dimensions.'),
+      'effect callback' => 'image_crop_effect',
+      'dimensions callback' => 'image_resize_dimensions',
+      'form callback' => 'image_crop_form',
+      'summary theme' => 'image_crop_summary',
+    ),
+    'image_desaturate' => array(
+      'label' => t('Desaturate'),
+      'help' => t('Desaturate converts an image to grayscale.'),
+      'effect callback' => 'image_desaturate_effect',
+      'dimensions passthrough' => TRUE,
+    ),
+    'image_rotate' => array(
+      'label' => t('Rotate'),
+      'help' => t('Rotating an image may cause the dimensions of an image to increase to fit the diagonal.'),
+      'effect callback' => 'image_rotate_effect',
+      'dimensions callback' => 'image_rotate_dimensions',
+      'form callback' => 'image_rotate_form',
+      'summary theme' => 'image_rotate_summary',
+    ),
+  );
+
+  return $effects;
+}
+
+/**
+ * Image effect callback; Resize an image resource.
+ *
+ * @param $image
+ *   An image object returned by image_load().
+ * @param $data
+ *   An array of attributes to use when performing the resize effect with the
+ *   following items:
+ *   - "width": An integer representing the desired width in pixels.
+ *   - "height": An integer representing the desired height in pixels.
+ *
+ * @return
+ *   TRUE on success. FALSE on failure to resize image.
+ *
+ * @see image_resize()
+ */
+function image_resize_effect(&$image, $data) {
+  if (!image_resize($image, $data['width'], $data['height'])) {
+    watchdog('image', 'Image resize failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->toolkit, '%path' => $image->source, '%mimetype' => $image->info['mime_type'], '%dimensions' => $image->info['width'] . 'x' . $image->info['height']), WATCHDOG_ERROR);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+/**
+ * Image dimensions callback; Resize.
+ *
+ * @param $dimensions
+ *   Dimensions to be modified - an array with components width and height, in
+ *   pixels.
+ * @param $data
+ *   An array of attributes to use when performing the resize effect with the
+ *   following items:
+ *   - "width": An integer representing the desired width in pixels.
+ *   - "height": An integer representing the desired height in pixels.
+ */
+function image_resize_dimensions(array &$dimensions, array $data) {
+  // The new image will have the exact dimensions defined for the effect.
+  $dimensions['width'] = $data['width'];
+  $dimensions['height'] = $data['height'];
+}
+
+/**
+ * Image effect callback; Scale an image resource.
+ *
+ * @param $image
+ *   An image object returned by image_load().
+ * @param $data
+ *   An array of attributes to use when performing the scale effect with the
+ *   following items:
+ *   - "width": An integer representing the desired width in pixels.
+ *   - "height": An integer representing the desired height in pixels.
+ *   - "upscale": A boolean indicating that the image should be upscaled if the
+ *     dimensions are larger than the original image.
+ *
+ * @return
+ *   TRUE on success. FALSE on failure to scale image.
+ *
+ * @see image_scale()
+ */
+function image_scale_effect(&$image, $data) {
+  // Set sane default values.
+  $data += array(
+    'width' => NULL,
+    'height' => NULL,
+    'upscale' => FALSE,
+  );
+
+  if (!image_scale($image, $data['width'], $data['height'], $data['upscale'])) {
+    watchdog('image', 'Image scale failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->toolkit, '%path' => $image->source, '%mimetype' => $image->info['mime_type'], '%dimensions' => $image->info['width'] . 'x' . $image->info['height']), WATCHDOG_ERROR);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+/**
+ * Image dimensions callback; Scale.
+ *
+ * @param $dimensions
+ *   Dimensions to be modified - an array with components width and height, in
+ *   pixels.
+ * @param $data
+ *   An array of attributes to use when performing the scale effect with the
+ *   following items:
+ *   - "width": An integer representing the desired width in pixels.
+ *   - "height": An integer representing the desired height in pixels.
+ *   - "upscale": A boolean indicating that the image should be upscaled if the
+ *     dimensions are larger than the original image.
+ */
+function image_scale_dimensions(array &$dimensions, array $data) {
+  if ($dimensions['width'] && $dimensions['height']) {
+    image_dimensions_scale($dimensions, $data['width'], $data['height'], $data['upscale']);
+  }
+}
+
+/**
+ * Image effect callback; Crop an image resource.
+ *
+ * @param $image
+ *   An image object returned by image_load().
+ * @param $data
+ *   An array of attributes to use when performing the crop effect with the
+ *   following items:
+ *   - "width": An integer representing the desired width in pixels.
+ *   - "height": An integer representing the desired height in pixels.
+ *   - "anchor": A string describing where the crop should originate in the form
+ *     of "XOFFSET-YOFFSET". XOFFSET is either a number of pixels or
+ *     "left", "center", "right" and YOFFSET is either a number of pixels or
+ *     "top", "center", "bottom".
+ * @return
+ *   TRUE on success. FALSE on failure to crop image.
+ * @see image_crop()
+ */
+function image_crop_effect(&$image, $data) {
+  // Set sane default values.
+  $data += array(
+    'anchor' => 'center-center',
+  );
+
+  list($x, $y) = explode('-', $data['anchor']);
+  $x = image_filter_keyword($x, $image->info['width'], $data['width']);
+  $y = image_filter_keyword($y, $image->info['height'], $data['height']);
+  if (!image_crop($image, $x, $y, $data['width'], $data['height'])) {
+    watchdog('image', 'Image crop failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->toolkit, '%path' => $image->source, '%mimetype' => $image->info['mime_type'], '%dimensions' => $image->info['width'] . 'x' . $image->info['height']), WATCHDOG_ERROR);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+/**
+ * Image effect callback; Scale and crop an image resource.
+ *
+ * @param $image
+ *   An image object returned by image_load().
+ * @param $data
+ *   An array of attributes to use when performing the scale and crop effect
+ *   with the following items:
+ *   - "width": An integer representing the desired width in pixels.
+ *   - "height": An integer representing the desired height in pixels.
+ * @return
+ *   TRUE on success. FALSE on failure to scale and crop image.
+ * @see image_scale_and_crop()
+ */
+function image_scale_and_crop_effect(&$image, $data) {
+  if (!image_scale_and_crop($image, $data['width'], $data['height'])) {
+    watchdog('image', 'Image scale and crop failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->toolkit, '%path' => $image->source, '%mimetype' => $image->info['mime_type'], '%dimensions' => $image->info['width'] . 'x' . $image->info['height']), WATCHDOG_ERROR);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+/**
+ * Image effect callback; Desaturate (grayscale) an image resource.
+ *
+ * @param $image
+ *   An image object returned by image_load().
+ * @param $data
+ *   An array of attributes to use when performing the desaturate effect.
+ * @return
+ *   TRUE on success. FALSE on failure to desaturate image.
+ * @see image_desaturate()
+ */
+function image_desaturate_effect(&$image, $data) {
+  if (!image_desaturate($image)) {
+    watchdog('image', 'Image desaturate failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->toolkit, '%path' => $image->source, '%mimetype' => $image->info['mime_type'], '%dimensions' => $image->info['width'] . 'x' . $image->info['height']), WATCHDOG_ERROR);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+/**
+ * Image effect callback; Rotate an image resource.
+ *
+ * @param $image
+ *   An image object returned by image_load().
+ * @param $data
+ *   An array of attributes to use when performing the rotate effect containing
+ *   the following items:
+ *   - "degrees": The number of (clockwise) degrees to rotate the image.
+ *   - "random": A boolean indicating that a random rotation angle should be
+ *     used for this image. The angle specified in "degrees" is used as a
+ *     positive and negative maximum.
+ *   - "bgcolor": The background color to use for exposed areas of the image.
+ *     Use web-style hex colors (#FFFFFF for white, #000000 for black). Leave
+ *     blank for transparency on image types that support it.
+ * @return
+ *   TRUE on success. FALSE on failure to rotate image.
+ * @see image_rotate().
+ */
+function image_rotate_effect(&$image, $data) {
+  // Set sane default values.
+  $data += array(
+    'degrees' => 0,
+    'bgcolor' => NULL,
+    'random' => FALSE,
+  );
+
+  // Convert short #FFF syntax to full #FFFFFF syntax.
+  if (strlen($data['bgcolor']) == 4) {
+    $c = $data['bgcolor'];
+    $data['bgcolor'] = $c[0] . $c[1] . $c[1] . $c[2] . $c[2] . $c[3] . $c[3];
+  }
+
+  // Convert #FFFFFF syntax to hexadecimal colors.
+  if ($data['bgcolor'] != '') {
+    $data['bgcolor'] = hexdec(str_replace('#', '0x', $data['bgcolor']));
+  }
+  else {
+    $data['bgcolor'] = NULL;
+  }
+
+  if (!empty($data['random'])) {
+    $degrees = abs((float) $data['degrees']);
+    $data['degrees'] = rand(-1 * $degrees, $degrees);
+  }
+
+  if (!image_rotate($image, $data['degrees'], $data['bgcolor'])) {
+    watchdog('image', 'Image rotate failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image->toolkit, '%path' => $image->source, '%mimetype' => $image->info['mime_type'], '%dimensions' => $image->info['width'] . 'x' . $image->info['height']), WATCHDOG_ERROR);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+/**
+ * Image dimensions callback; Rotate.
+ *
+ * @param $dimensions
+ *   Dimensions to be modified - an array with components width and height, in
+ *   pixels.
+ * @param $data
+ *   An array of attributes to use when performing the rotate effect containing
+ *   the following items:
+ *   - "degrees": The number of (clockwise) degrees to rotate the image.
+ *   - "random": A boolean indicating that a random rotation angle should be
+ *     used for this image. The angle specified in "degrees" is used as a
+ *     positive and negative maximum.
+ */
+function image_rotate_dimensions(array &$dimensions, array $data) {
+  // If the rotate is not random and the angle is a multiple of 90 degrees,
+  // then the new dimensions can be determined.
+  if (!$data['random'] && ((int) ($data['degrees']) == $data['degrees']) && ($data['degrees'] % 90 == 0)) {
+    if ($data['degrees'] % 180 != 0) {
+      $temp = $dimensions['width'];
+      $dimensions['width'] = $dimensions['height'];
+      $dimensions['height'] = $temp;
+    }
+  }
+  else {
+    $dimensions['width'] = $dimensions['height'] = NULL;
+  }
+}
diff --git a/htmltest/modules/image/image.field.inc b/htmltest/modules/image/image.field.inc
new file mode 100644
index 00000000..6d1867cb
--- /dev/null
+++ b/htmltest/modules/image/image.field.inc
@@ -0,0 +1,642 @@
+<?php
+
+/**
+ * @file
+ * Implement an image field, based on the file module's file field.
+ */
+
+/**
+ * Implements hook_field_info().
+ */
+function image_field_info() {
+  return array(
+    'image' => array(
+      'label' => t('Image'),
+      'description' => t('This field stores the ID of an image file as an integer value.'),
+      'settings' => array(
+        'uri_scheme' => variable_get('file_default_scheme', 'public'),
+        'default_image' => 0,
+      ),
+      'instance_settings' => array(
+        'file_extensions' => 'png gif jpg jpeg',
+        'file_directory' => '',
+        'max_filesize' => '',
+        'alt_field' => 0,
+        'title_field' => 0,
+        'max_resolution' => '',
+        'min_resolution' => '',
+        'default_image' => 0,
+      ),
+      'default_widget' => 'image_image',
+      'default_formatter' => 'image',
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_settings_form().
+ */
+function image_field_settings_form($field, $instance) {
+  $defaults = field_info_field_settings($field['type']);
+  $settings = array_merge($defaults, $field['settings']);
+
+  $scheme_options = array();
+  foreach (file_get_stream_wrappers(STREAM_WRAPPERS_WRITE_VISIBLE) as $scheme => $stream_wrapper) {
+    $scheme_options[$scheme] = $stream_wrapper['name'];
+  }
+  $form['uri_scheme'] = array(
+    '#type' => 'radios',
+    '#title' => t('Upload destination'),
+    '#options' => $scheme_options,
+    '#default_value' => $settings['uri_scheme'],
+    '#description' => t('Select where the final files should be stored. Private file storage has significantly more overhead than public files, but allows restricted access to files within this field.'),
+  );
+
+  // When the user sets the scheme on the UI, even for the first time, it's
+  // updating a field because fields are created on the "Manage fields"
+  // page. So image_field_update_field() can handle this change.
+  $form['default_image'] = array(
+    '#title' => t('Default image'),
+    '#type' => 'managed_file',
+    '#description' => t('If no image is uploaded, this image will be shown on display.'),
+    '#default_value' => $field['settings']['default_image'],
+    '#upload_location' => $settings['uri_scheme'] . '://default_images/',
+  );
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_instance_settings_form().
+ */
+function image_field_instance_settings_form($field, $instance) {
+  $settings = $instance['settings'];
+
+  // Use the file field instance settings form as a basis.
+  $form = file_field_instance_settings_form($field, $instance);
+
+  // Add maximum and minimum resolution settings.
+  $max_resolution = explode('x', $settings['max_resolution']) + array('', '');
+  $form['max_resolution'] = array(
+    '#type' => 'item',
+    '#title' => t('Maximum image resolution'),
+    '#element_validate' => array('_image_field_resolution_validate'),
+    '#weight' => 4.1,
+    '#field_prefix' => '<div class="container-inline">',
+    '#field_suffix' => '</div>',
+    '#description' => t('The maximum allowed image size expressed as WIDTHxHEIGHT (e.g. 640x480). Leave blank for no restriction. If a larger image is uploaded, it will be resized to reflect the given width and height. Resizing images on upload will cause the loss of <a href="http://en.wikipedia.org/wiki/Exchangeable_image_file_format">EXIF data</a> in the image.'),
+  );
+  $form['max_resolution']['x'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Maximum width'),
+    '#title_display' => 'invisible',
+    '#default_value' => $max_resolution[0],
+    '#size' => 5,
+    '#maxlength' => 5,
+    '#field_suffix' => ' x ',
+  );
+  $form['max_resolution']['y'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Maximum height'),
+    '#title_display' => 'invisible',
+    '#default_value' => $max_resolution[1],
+    '#size' => 5,
+    '#maxlength' => 5,
+    '#field_suffix' => ' ' . t('pixels'),
+  );
+
+  $min_resolution = explode('x', $settings['min_resolution']) + array('', '');
+  $form['min_resolution'] = array(
+    '#type' => 'item',
+    '#title' => t('Minimum image resolution'),
+    '#element_validate' => array('_image_field_resolution_validate'),
+    '#weight' => 4.2,
+    '#field_prefix' => '<div class="container-inline">',
+    '#field_suffix' => '</div>',
+    '#description' => t('The minimum allowed image size expressed as WIDTHxHEIGHT (e.g. 640x480). Leave blank for no restriction. If a smaller image is uploaded, it will be rejected.'),
+  );
+  $form['min_resolution']['x'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Minimum width'),
+    '#title_display' => 'invisible',
+    '#default_value' => $min_resolution[0],
+    '#size' => 5,
+    '#maxlength' => 5,
+    '#field_suffix' => ' x ',
+  );
+  $form['min_resolution']['y'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Minimum height'),
+    '#title_display' => 'invisible',
+    '#default_value' => $min_resolution[1],
+    '#size' => 5,
+    '#maxlength' => 5,
+    '#field_suffix' => ' ' . t('pixels'),
+  );
+
+  // Remove the description option.
+  unset($form['description_field']);
+
+  // Add title and alt configuration options.
+  $form['alt_field'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable <em>Alt</em> field'),
+    '#default_value' => $settings['alt_field'],
+    '#description' => t('The alt attribute may be used by search engines, screen readers, and when the image cannot be loaded.'),
+    '#weight' => 10,
+  );
+  $form['title_field'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable <em>Title</em> field'),
+    '#default_value' => $settings['title_field'],
+    '#description' => t('The title attribute is used as a tooltip when the mouse hovers over the image.'),
+    '#weight' => 11,
+  );
+
+  // Add the default image to the instance.
+  $form['default_image'] = array(
+    '#title' => t('Default image'),
+    '#type' => 'managed_file',
+    '#description' => t("If no image is uploaded, this image will be shown on display and will override the field's default image."),
+    '#default_value' => $settings['default_image'],
+    '#upload_location' => $field['settings']['uri_scheme'] . '://default_images/',
+  );
+
+  return $form;
+}
+
+/**
+ * Element validate function for resolution fields.
+ */
+function _image_field_resolution_validate($element, &$form_state) {
+  if (!empty($element['x']['#value']) || !empty($element['y']['#value'])) {
+    foreach (array('x', 'y') as $dimension) {
+      $value = $element[$dimension]['#value'];
+      if (!is_numeric($value)) {
+        form_error($element[$dimension], t('Height and width values must be numeric.'));
+        return;
+      }
+      if (intval($value) == 0) {
+        form_error($element[$dimension], t('Both a height and width value must be specified in the !name field.', array('!name' => $element['#title'])));
+        return;
+      }
+    }
+    form_set_value($element, intval($element['x']['#value']) . 'x' . intval($element['y']['#value']), $form_state);
+  }
+  else {
+    form_set_value($element, '', $form_state);
+  }
+}
+
+/**
+ * Implements hook_field_load().
+ */
+function image_field_load($entity_type, $entities, $field, $instances, $langcode, &$items, $age) {
+  file_field_load($entity_type, $entities, $field, $instances, $langcode, $items, $age);
+}
+
+/**
+ * Implements hook_field_prepare_view().
+ */
+function image_field_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items) {
+  // If there are no files specified at all, use the default.
+  foreach ($entities as $id => $entity) {
+    if (empty($items[$id])) {
+      $fid = 0;
+      // Use the default for the instance if one is available.
+      if (!empty($instances[$id]['settings']['default_image'])) {
+        $fid = $instances[$id]['settings']['default_image'];
+      }
+      // Otherwise, use the default for the field.
+      elseif (!empty($field['settings']['default_image'])) {
+        $fid = $field['settings']['default_image'];
+      }
+
+      // Add the default image if one is found.
+      if ($fid && ($file = file_load($fid))) {
+        $items[$id][0] = (array) $file + array(
+          'is_default' => TRUE,
+          'alt' => '',
+          'title' => '',
+        );
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_presave().
+ */
+function image_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  file_field_presave($entity_type, $entity, $field, $instance, $langcode, $items);
+
+  // Determine the dimensions if necessary.
+  foreach ($items as &$item) {
+    if (!isset($item['width']) || !isset($item['height'])) {
+      $info = image_get_info(file_load($item['fid'])->uri);
+
+      if (is_array($info)) {
+        $item['width'] = $info['width'];
+        $item['height'] = $info['height'];
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_insert().
+ */
+function image_field_insert($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  file_field_insert($entity_type, $entity, $field, $instance, $langcode, $items);
+}
+
+/**
+ * Implements hook_field_update().
+ */
+function image_field_update($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  file_field_update($entity_type, $entity, $field, $instance, $langcode, $items);
+}
+
+/**
+ * Implements hook_field_delete().
+ */
+function image_field_delete($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  file_field_delete($entity_type, $entity, $field, $instance, $langcode, $items);
+}
+
+/**
+ * Implements hook_field_delete_revision().
+ */
+function image_field_delete_revision($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  file_field_delete_revision($entity_type, $entity, $field, $instance, $langcode, $items);
+}
+
+/**
+ * Implements hook_field_is_empty().
+ */
+function image_field_is_empty($item, $field) {
+  return file_field_is_empty($item, $field);
+}
+
+/**
+ * Implements hook_field_widget_info().
+ */
+function image_field_widget_info() {
+  return array(
+    'image_image' => array(
+      'label' => t('Image'),
+      'field types' => array('image'),
+      'settings' => array(
+        'progress_indicator' => 'throbber',
+        'preview_image_style' => 'thumbnail',
+      ),
+      'behaviors' => array(
+        'multiple values' => FIELD_BEHAVIOR_CUSTOM,
+        'default value' => FIELD_BEHAVIOR_NONE,
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_widget_settings_form().
+ */
+function image_field_widget_settings_form($field, $instance) {
+  $widget = $instance['widget'];
+  $settings = $widget['settings'];
+
+  // Use the file widget settings form.
+  $form = file_field_widget_settings_form($field, $instance);
+
+  $form['preview_image_style'] = array(
+    '#title' => t('Preview image style'),
+    '#type' => 'select',
+    '#options' => image_style_options(FALSE, PASS_THROUGH),
+    '#empty_option' => '<' . t('no preview') . '>',
+    '#default_value' => $settings['preview_image_style'],
+    '#description' => t('The preview image will be shown while editing the content.'),
+    '#weight' => 15,
+  );
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_widget_form().
+ */
+function image_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+
+  // Add display_field setting to field because file_field_widget_form() assumes it is set.
+  $field['settings']['display_field'] = 0;
+
+  $elements = file_field_widget_form($form, $form_state, $field, $instance, $langcode, $items, $delta, $element);
+  $settings = $instance['settings'];
+
+  foreach (element_children($elements) as $delta) {
+    // Add upload resolution validation.
+    if ($settings['max_resolution'] || $settings['min_resolution']) {
+      $elements[$delta]['#upload_validators']['file_validate_image_resolution'] = array($settings['max_resolution'], $settings['min_resolution']);
+    }
+
+    // If not using custom extension validation, ensure this is an image.
+    $supported_extensions = array('png', 'gif', 'jpg', 'jpeg');
+    $extensions = isset($elements[$delta]['#upload_validators']['file_validate_extensions'][0]) ? $elements[$delta]['#upload_validators']['file_validate_extensions'][0] : implode(' ', $supported_extensions);
+    $extensions = array_intersect(explode(' ', $extensions), $supported_extensions);
+    $elements[$delta]['#upload_validators']['file_validate_extensions'][0] = implode(' ', $extensions);
+
+    // Add all extra functionality provided by the image widget.
+    $elements[$delta]['#process'][] = 'image_field_widget_process';
+  }
+
+  if ($field['cardinality'] == 1) {
+    // If there's only one field, return it as delta 0.
+    if (empty($elements[0]['#default_value']['fid'])) {
+      $elements[0]['#description'] = theme('file_upload_help', array('description' => field_filter_xss($instance['description']), 'upload_validators' => $elements[0]['#upload_validators']));
+    }
+  }
+  else {
+    $elements['#file_upload_description'] = theme('file_upload_help', array('upload_validators' => $elements[0]['#upload_validators']));
+  }
+  return $elements;
+}
+
+/**
+ * An element #process callback for the image_image field type.
+ *
+ * Expands the image_image type to include the alt and title fields.
+ */
+function image_field_widget_process($element, &$form_state, $form) {
+  $item = $element['#value'];
+  $item['fid'] = $element['fid']['#value'];
+
+  $instance = field_widget_instance($element, $form_state);
+
+  $settings = $instance['settings'];
+  $widget_settings = $instance['widget']['settings'];
+
+  $element['#theme'] = 'image_widget';
+  $element['#attached']['css'][] = drupal_get_path('module', 'image') . '/image.css';
+
+  // Add the image preview.
+  if ($element['#file'] && $widget_settings['preview_image_style']) {
+    $variables = array(
+      'style_name' => $widget_settings['preview_image_style'],
+      'path' => $element['#file']->uri,
+    );
+
+    // Determine image dimensions.
+    if (isset($element['#value']['width']) && isset($element['#value']['height'])) {
+      $variables['width'] = $element['#value']['width'];
+      $variables['height'] = $element['#value']['height'];
+    }
+    else {
+      $info = image_get_info($element['#file']->uri);
+
+      if (is_array($info)) {
+        $variables['width'] = $info['width'];
+        $variables['height'] = $info['height'];
+      }
+      else {
+        $variables['width'] = $variables['height'] = NULL;
+      }
+    }
+
+    $element['preview'] = array(
+      '#type' => 'markup',
+      '#markup' => theme('image_style', $variables),
+    );
+
+    // Store the dimensions in the form so the file doesn't have to be accessed
+    // again. This is important for remote files.
+    $element['width'] = array(
+      '#type' => 'hidden',
+      '#value' => $variables['width'],
+    );
+    $element['height'] = array(
+      '#type' => 'hidden',
+      '#value' => $variables['height'],
+    );
+  }
+
+  // Add the additional alt and title fields.
+  $element['alt'] = array(
+    '#title' => t('Alternate text'),
+    '#type' => 'textfield',
+    '#default_value' => isset($item['alt']) ? $item['alt'] : '',
+    '#description' => t('This text will be used by screen readers, search engines, or when the image cannot be loaded.'),
+    // @see http://www.gawds.org/show.php?contentid=28
+    '#maxlength' => 512,
+    '#weight' => -2,
+    '#access' => (bool) $item['fid'] && $settings['alt_field'],
+  );
+  $element['title'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Title'),
+    '#default_value' => isset($item['title']) ? $item['title'] : '',
+    '#description' => t('The title is used as a tool tip when the user hovers the mouse over the image.'),
+    '#maxlength' => 1024,
+    '#weight' => -1,
+    '#access' => (bool) $item['fid'] && $settings['title_field'],
+  );
+
+  return $element;
+}
+
+/**
+ * Returns HTML for an image field widget.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: A render element representing the image field widget.
+ *
+ * @ingroup themeable
+ */
+function theme_image_widget($variables) {
+  $element = $variables['element'];
+  $output = '';
+  $output .= '<div class="image-widget form-managed-file clearfix">';
+
+  if (isset($element['preview'])) {
+    $output .= '<div class="image-preview">';
+    $output .= drupal_render($element['preview']);
+    $output .= '</div>';
+  }
+
+  $output .= '<div class="image-widget-data">';
+  if ($element['fid']['#value'] != 0) {
+    $element['filename']['#markup'] .= ' <span class="file-size">(' . format_size($element['#file']->filesize) . ')</span> ';
+  }
+  $output .= drupal_render_children($element);
+  $output .= '</div>';
+  $output .= '</div>';
+
+  return $output;
+}
+
+/**
+ * Implements hook_field_formatter_info().
+ */
+function image_field_formatter_info() {
+  $formatters = array(
+    'image' => array(
+      'label' => t('Image'),
+      'field types' => array('image'),
+      'settings' => array('image_style' => '', 'image_link' => ''),
+    ),
+  );
+
+  return $formatters;
+}
+
+/**
+ * Implements hook_field_formatter_settings_form().
+ */
+function image_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $image_styles = image_style_options(FALSE, PASS_THROUGH);
+  $element['image_style'] = array(
+    '#title' => t('Image style'),
+    '#type' => 'select',
+    '#default_value' => $settings['image_style'],
+    '#empty_option' => t('None (original image)'),
+    '#options' => $image_styles,
+  );
+
+  $link_types = array(
+    'content' => t('Content'),
+    'file' => t('File'),
+  );
+  $element['image_link'] = array(
+    '#title' => t('Link image to'),
+    '#type' => 'select',
+    '#default_value' => $settings['image_link'],
+    '#empty_option' => t('Nothing'),
+    '#options' => $link_types,
+  );
+
+  return $element;
+}
+
+/**
+ * Implements hook_field_formatter_settings_summary().
+ */
+function image_field_formatter_settings_summary($field, $instance, $view_mode) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $summary = array();
+
+  $image_styles = image_style_options(FALSE, PASS_THROUGH);
+  // Unset possible 'No defined styles' option.
+  unset($image_styles['']);
+  // Styles could be lost because of enabled/disabled modules that defines
+  // their styles in code.
+  if (isset($image_styles[$settings['image_style']])) {
+    $summary[] = t('Image style: @style', array('@style' => $image_styles[$settings['image_style']]));
+  }
+  else {
+    $summary[] = t('Original image');
+  }
+
+  $link_types = array(
+    'content' => t('Linked to content'),
+    'file' => t('Linked to file'),
+  );
+  // Display this setting only if image is linked.
+  if (isset($link_types[$settings['image_link']])) {
+    $summary[] = $link_types[$settings['image_link']];
+  }
+
+  return implode('<br />', $summary);
+}
+
+/**
+ * Implements hook_field_formatter_view().
+ */
+function image_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  $element = array();
+
+  // Check if the formatter involves a link.
+  if ($display['settings']['image_link'] == 'content') {
+    $uri = entity_uri($entity_type, $entity);
+  }
+  elseif ($display['settings']['image_link'] == 'file') {
+    $link_file = TRUE;
+  }
+
+  foreach ($items as $delta => $item) {
+    if (isset($link_file)) {
+      $uri = array(
+        'path' => file_create_url($item['uri']),
+        'options' => array(),
+      );
+    }
+    $element[$delta] = array(
+      '#theme' => 'image_formatter',
+      '#item' => $item,
+      '#image_style' => $display['settings']['image_style'],
+      '#path' => isset($uri) ? $uri : '',
+    );
+  }
+
+  return $element;
+}
+
+/**
+ * Returns HTML for an image field formatter.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - item: Associative array of image data, which may include "uri", "alt",
+ *     "width", "height", "title" and "attributes".
+ *   - image_style: An optional image style.
+ *   - path: An array containing the link 'path' and link 'options'.
+ *
+ * @ingroup themeable
+ */
+function theme_image_formatter($variables) {
+  $item = $variables['item'];
+  $image = array(
+    'path' => $item['uri'],
+  );
+
+  if (array_key_exists('alt', $item)) {
+    $image['alt'] = $item['alt'];
+  }
+
+  if (isset($item['attributes'])) {
+    $image['attributes'] = $item['attributes'];
+  }
+
+  if (isset($item['width']) && isset($item['height'])) {
+    $image['width'] = $item['width'];
+    $image['height'] = $item['height'];
+  }
+
+  // Do not output an empty 'title' attribute.
+  if (isset($item['title']) && drupal_strlen($item['title']) > 0) {
+    $image['title'] = $item['title'];
+  }
+
+  if ($variables['image_style']) {
+    $image['style_name'] = $variables['image_style'];
+    $output = theme('image_style', $image);
+  }
+  else {
+    $output = theme('image', $image);
+  }
+
+  // The link path and link options are both optional, but for the options to be
+  // processed, the link path must at least be an empty string.
+  if (isset($variables['path']['path'])) {
+    $path = $variables['path']['path'];
+    $options = isset($variables['path']['options']) ? $variables['path']['options'] : array();
+    // When displaying an image inside a link, the html option must be TRUE.
+    $options['html'] = TRUE;
+    $output = l($output, $path, $options);
+  }
+
+  return $output;
+}
diff --git a/htmltest/modules/image/image.info b/htmltest/modules/image/image.info
new file mode 100644
index 00000000..003b93d5
--- /dev/null
+++ b/htmltest/modules/image/image.info
@@ -0,0 +1,14 @@
+name = Image
+description = Provides image manipulation tools.
+package = Core
+version = VERSION
+core = 7.x
+dependencies[] = file
+files[] = image.test
+configure = admin/config/media/image-styles
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/image/image.install b/htmltest/modules/image/image.install
new file mode 100644
index 00000000..45bcbbb6
--- /dev/null
+++ b/htmltest/modules/image/image.install
@@ -0,0 +1,522 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the image module.
+ */
+
+/**
+ * Implements hook_install().
+ */
+function image_install() {
+  // Create the styles directory and ensure it's writable.
+  $directory = file_default_scheme() . '://styles';
+  file_prepare_directory($directory, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function image_uninstall() {
+  // Remove the styles directory and generated images.
+  file_unmanaged_delete_recursive(file_default_scheme() . '://styles');
+}
+
+/**
+ * Implements hook_schema().
+ */
+function image_schema() {
+  $schema = array();
+
+  $schema['cache_image'] = drupal_get_schema_unprocessed('system', 'cache');
+  $schema['cache_image']['description'] = 'Cache table used to store information about image manipulations that are in-progress.';
+
+  $schema['image_styles'] = array(
+    'description' => 'Stores configuration options for image styles.',
+    'fields' => array(
+      'isid' => array(
+        'description' => 'The primary identifier for an image style.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'name' => array(
+        'description' => 'The style machine name.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+      ),
+      'label' => array(
+        'description' => 'The style administrative name.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+    ),
+    'primary key' => array('isid'),
+    'unique keys' => array(
+      'name' => array('name'),
+    ),
+  );
+
+  $schema['image_effects'] = array(
+    'description' => 'Stores configuration options for image effects.',
+    'fields' => array(
+      'ieid' => array(
+        'description' => 'The primary identifier for an image effect.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'isid' => array(
+        'description' => 'The {image_styles}.isid for an image style.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'weight' => array(
+        'description' => 'The weight of the effect in the style.',
+        'type' => 'int',
+        'unsigned' => FALSE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'name' => array(
+        'description' => 'The unique name of the effect to be executed.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+      ),
+      'data' => array(
+        'description' => 'The configuration data for the effect.',
+        'type' => 'blob',
+        'not null' => TRUE,
+        'size' => 'big',
+        'serialize' => TRUE,
+      ),
+    ),
+    'primary key' => array('ieid'),
+    'indexes' => array(
+      'isid' => array('isid'),
+      'weight' => array('weight'),
+    ),
+    'foreign keys' => array(
+      'image_style' => array(
+        'table' => 'image_styles',
+        'columns' => array('isid' => 'isid'),
+      ),
+    ),
+  );
+
+  return $schema;
+}
+
+/**
+ * Implements hook_field_schema().
+ */
+function image_field_schema($field) {
+  return array(
+    'columns' => array(
+      'fid' => array(
+        'description' => 'The {file_managed}.fid being referenced in this field.',
+        'type' => 'int',
+        'not null' => FALSE,
+        'unsigned' => TRUE,
+      ),
+      'alt' => array(
+        'description' => "Alternative image text, for the image's 'alt' attribute.",
+        'type' => 'varchar',
+        'length' => 512,
+        'not null' => FALSE,
+      ),
+      'title' => array(
+        'description' => "Image title text, for the image's 'title' attribute.",
+        'type' => 'varchar',
+        'length' => 1024,
+        'not null' => FALSE,
+      ),
+      'width' => array(
+        'description' => 'The width of the image in pixels.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+      ),
+      'height' => array(
+        'description' => 'The height of the image in pixels.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+      ),
+    ),
+    'indexes' => array(
+      'fid' => array('fid'),
+    ),
+    'foreign keys' => array(
+      'fid' => array(
+        'table' => 'file_managed',
+        'columns' => array('fid' => 'fid'),
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_update_dependencies().
+ */
+function image_update_dependencies() {
+  $dependencies['image'][7002] = array(
+    // Image update 7002 uses field API functions, so must run after
+    // Field API has been enabled.
+    'system' => 7020,
+  );
+  return $dependencies;
+}
+
+/**
+ * Install the schema for users upgrading from the contributed module.
+ */
+function image_update_7000() {
+  if (!db_table_exists('image_styles')) {
+    $schema = array();
+
+    $schema['cache_image'] = system_schema_cache_7054();
+    $schema['cache_image']['description'] = 'Cache table used to store information about image manipulations that are in-progress.';
+
+    $schema['image_styles'] = array(
+      'description' => 'Stores configuration options for image styles.',
+      'fields' => array(
+        'isid' => array(
+          'description' => 'The primary identifier for an image style.',
+          'type' => 'serial',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+        ),
+        'name' => array(
+          'description' => 'The style name.',
+          'type' => 'varchar',
+          'length' => 255,
+          'not null' => TRUE,
+        ),
+      ),
+      'primary key' => array('isid'),
+      'unique keys' => array(
+        'name' => array('name'),
+      ),
+    );
+
+    $schema['image_effects'] = array(
+      'description' => 'Stores configuration options for image effects.',
+      'fields' => array(
+        'ieid' => array(
+          'description' => 'The primary identifier for an image effect.',
+          'type' => 'serial',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+        ),
+        'isid' => array(
+          'description' => 'The {image_styles}.isid for an image style.',
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+          'default' => 0,
+        ),
+        'weight' => array(
+          'description' => 'The weight of the effect in the style.',
+          'type' => 'int',
+          'unsigned' => FALSE,
+          'not null' => TRUE,
+          'default' => 0,
+        ),
+        'name' => array(
+          'description' => 'The unique name of the effect to be executed.',
+          'type' => 'varchar',
+          'length' => 255,
+          'not null' => TRUE,
+        ),
+        'data' => array(
+          'description' => 'The configuration data for the effect.',
+          'type' => 'blob',
+          'not null' => TRUE,
+          'size' => 'big',
+          'serialize' => TRUE,
+        ),
+      ),
+      'primary key' => array('ieid'),
+      'indexes' => array(
+        'isid' => array('isid'),
+        'weight' => array('weight'),
+      ),
+      'foreign keys' => array(
+        'image_style' => array(
+          'table' => 'image_styles',
+          'columns' => array('isid' => 'isid'),
+        ),
+      ),
+    );
+
+    db_create_table('cache_image', $schema['cache_image']);
+    db_create_table('image_styles', $schema['image_styles']);
+    db_create_table('image_effects', $schema['image_effects']);
+  }
+}
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Rename possibly misnamed {image_effect} table to {image_effects}.
+ */
+function image_update_7001() {
+  // Due to a bug in earlier versions of image_update_7000() it is possible
+  // to end up with an {image_effect} table where there should be an
+  // {image_effects} table.
+  if (!db_table_exists('image_effects') && db_table_exists('image_effect')) {
+    db_rename_table('image_effect', 'image_effects');
+  }
+}
+
+/**
+ * Add width and height columns to a specific table.
+ *
+ * @param $table
+ *   The name of the database table to be updated.
+ * @param $columns
+ *   Keyed array of columns this table is supposed to have.
+ */
+function _image_update_7002_add_columns($table, $field_name) {
+  $spec = array(
+    'type' => 'int',
+    'unsigned' => TRUE,
+  );
+
+  $spec['description'] = 'The width of the image in pixels.';
+  db_add_field($table, $field_name . '_width', $spec);
+
+  $spec['description'] = 'The height of the image in pixels.';
+  db_add_field($table, $field_name . '_height', $spec);
+}
+
+/**
+ * Populate image dimensions in a specific table.
+ *
+ * @param $table
+ *   The name of the database table to be updated.
+ * @param $columns
+ *   Keyed array of columns this table is supposed to have.
+ * @param $last_fid
+ *   The fid of the last image to have been processed.
+ *
+ * @return
+ *   The number of images that were processed.
+ */
+function _image_update_7002_populate_dimensions($table, $field_name, &$last_fid) {
+  // Define how many images to process per pass.
+  $images_per_pass = 100;
+
+  // Query the database for fid / URI pairs.
+  $query = db_select($table, NULL, array('fetch' => PDO::FETCH_ASSOC));
+  $query->join('file_managed', NULL, $table . '.' . $field_name . '_fid = file_managed.fid');
+
+  if ($last_fid) {
+    $query->condition('file_managed.fid', $last_fid, '>');
+  }
+
+  $result = $query->fields('file_managed', array('fid', 'uri'))
+    ->orderBy('file_managed.fid')
+    ->range(0, $images_per_pass)
+    ->execute();
+
+  $count = 0;
+  foreach ($result as $file) {
+    $count++;
+    $info = image_get_info($file['uri']);
+
+    if (is_array($info)) {
+      db_update($table)
+        ->fields(array(
+          $field_name . '_width' => $info['width'],
+          $field_name . '_height' => $info['height'],
+        ))
+        ->condition($field_name . '_fid', $file['fid'])
+        ->execute();
+    }
+  }
+
+  // If less than the requested number of rows were returned then this table
+  // has been fully processed.
+  $last_fid = ($count < $images_per_pass) ? NULL : $file['fid'];
+  return $count;
+}
+
+/**
+ * Add width and height columns to image field schema and populate.
+ */
+function image_update_7002(array &$sandbox) {
+  if (empty($sandbox)) {
+    // Setup the sandbox.
+    $sandbox = array(
+      'tables' => array(),
+      'total' => 0,
+      'processed' => 0,
+      'last_fid' => NULL,
+    );
+
+    $fields = _update_7000_field_read_fields(array(
+      'module' => 'image',
+      'storage_type' => 'field_sql_storage',
+      'deleted' => 0,
+    ));
+
+    foreach ($fields as $field) {
+      $tables = array(
+        _field_sql_storage_tablename($field),
+        _field_sql_storage_revision_tablename($field),
+      );
+      foreach ($tables as $table) {
+        // Add the width and height columns to the table.
+        _image_update_7002_add_columns($table, $field['field_name']);
+
+        // How many rows need dimensions populated?
+        $count = db_select($table)->countQuery()->execute()->fetchField();
+
+        if (!$count) {
+          continue;
+        }
+
+        $sandbox['total'] += $count;
+        $sandbox['tables'][$table] = $field['field_name'];
+      }
+    }
+
+    // If no tables need rows populated with dimensions then we are done.
+    if (empty($sandbox['tables'])) {
+      $sandbox = array();
+      return;
+    }
+  }
+
+  // Process the table at the top of the list.
+  $keys = array_keys($sandbox['tables']);
+  $table = reset($keys);
+  $sandbox['processed'] += _image_update_7002_populate_dimensions($table, $sandbox['tables'][$table], $sandbox['last_fid']);
+
+  // Has the table been fully processed?
+  if (!$sandbox['last_fid']) {
+    unset($sandbox['tables'][$table]);
+  }
+
+  $sandbox['#finished'] = count($sandbox['tables']) ? ($sandbox['processed'] / $sandbox['total']) : 1;
+}
+
+/**
+ * Remove the variables that set alt and title length since they were not
+ * used for database column size and could cause PDO exceptions.
+ */
+function image_update_7003() {
+  variable_del('image_alt_length');
+  variable_del('image_title_length');
+}
+
+/**
+ * Use a large setting (512 and 1024 characters) for the length of the image alt
+ * and title fields.
+ */
+function image_update_7004() {
+  $alt_spec = array(
+    'type' => 'varchar',
+    'length' => 512,
+    'not null' => FALSE,
+  );
+
+  $title_spec = array(
+    'type' => 'varchar',
+    'length' => 1024,
+    'not null' => FALSE,
+  );
+
+  $fields = _update_7000_field_read_fields(array(
+    'module' => 'image',
+    'storage_type' => 'field_sql_storage',
+  ));
+
+  foreach ($fields as $field_name => $field) {
+    $tables = array(
+      _field_sql_storage_tablename($field),
+      _field_sql_storage_revision_tablename($field),
+    );
+    $alt_column = $field['field_name'] . '_alt';
+    $title_column = $field['field_name'] . '_title';
+    foreach ($tables as $table) {
+      db_change_field($table, $alt_column, $alt_column, $alt_spec);
+      db_change_field($table, $title_column, $title_column, $title_spec);
+    }
+  }
+}
+
+/**
+ * Add a column to the 'image_style' table to store administrative labels.
+ */
+function image_update_7005() {
+  $field = array(
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => TRUE,
+    'default' => '',
+    'description' => 'The style administrative name.',
+  );
+  db_add_field('image_styles', 'label', $field);
+
+  // Do a direct query here, rather than calling image_styles(),
+  // in case Image module is disabled.
+  $styles = db_query('SELECT name FROM {image_styles}')->fetchCol();
+  foreach ($styles as $style) {
+    db_update('image_styles')
+      ->fields(array('label' => $style))
+      ->condition('name', $style)
+      ->execute();
+  }
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra".
+ */
+
+/**
+ * Implements hook_requirements() to check the PHP GD Library.
+ *
+ * @param $phase
+ */
+function image_requirements($phase) {
+  $requirements = array();
+
+  if ($phase == 'runtime') {
+    // Check for the PHP GD library.
+    if (function_exists('imagegd2')) {
+      $info = gd_info();
+      $requirements['image_gd'] = array(
+        'value' => $info['GD Version'],
+      );
+
+      // Check for filter and rotate support.
+      if (function_exists('imagefilter') && function_exists('imagerotate')) {
+        $requirements['image_gd']['severity'] = REQUIREMENT_OK;
+      }
+      else {
+        $requirements['image_gd']['severity'] = REQUIREMENT_WARNING;
+        $requirements['image_gd']['description'] = t('The GD Library for PHP is enabled, but was compiled without support for functions used by the rotate and desaturate effects. It was probably compiled using the official GD libraries from http://www.libgd.org instead of the GD library bundled with PHP. You should recompile PHP --with-gd using the bundled GD library. See <a href="http://www.php.net/manual/book.image.php">the PHP manual</a>.');
+      }
+    }
+    else {
+      $requirements['image_gd'] = array(
+        'value' => t('Not installed'),
+        'severity' => REQUIREMENT_ERROR,
+        'description' => t('The GD library for PHP is missing or outdated. Check the <a href="@url">PHP image documentation</a> for information on how to correct this.', array('@url' => 'http://www.php.net/manual/book.image.php')),
+      );
+    }
+    $requirements['image_gd']['title'] = t('GD library rotate and desaturate effects');
+  }
+
+  return $requirements;
+}
diff --git a/htmltest/modules/image/image.module b/htmltest/modules/image/image.module
new file mode 100644
index 00000000..c6a23f25
--- /dev/null
+++ b/htmltest/modules/image/image.module
@@ -0,0 +1,1393 @@
+<?php
+
+/**
+ * @file
+ * Exposes global functionality for creating image styles.
+ */
+
+/**
+ * Image style constant for user presets in the database.
+ */
+define('IMAGE_STORAGE_NORMAL', 1);
+
+/**
+ * Image style constant for user presets that override module-defined presets.
+ */
+define('IMAGE_STORAGE_OVERRIDE', 2);
+
+/**
+ * Image style constant for module-defined presets in code.
+ */
+define('IMAGE_STORAGE_DEFAULT', 4);
+
+/**
+ * Image style constant to represent an editable preset.
+ */
+define('IMAGE_STORAGE_EDITABLE', IMAGE_STORAGE_NORMAL | IMAGE_STORAGE_OVERRIDE);
+
+/**
+ * Image style constant to represent any module-based preset.
+ */
+define('IMAGE_STORAGE_MODULE', IMAGE_STORAGE_OVERRIDE | IMAGE_STORAGE_DEFAULT);
+
+/**
+ * The name of the query parameter for image derivative tokens.
+ */
+define('IMAGE_DERIVATIVE_TOKEN', 'itok');
+
+// Load all Field module hooks for Image.
+require_once DRUPAL_ROOT . '/modules/image/image.field.inc';
+
+/**
+ * Implements hook_help().
+ */
+function image_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#image':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Image module allows you to manipulate images on your website. It exposes a setting for using the <em>Image toolkit</em>, allows you to configure <em>Image styles</em> that can be used for resizing or adjusting images on display, and provides an <em>Image</em> field for attaching images to content. For more information, see the online handbook entry for <a href="@image">Image module</a>.', array('@image' => 'http://drupal.org/documentation/modules/image')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Manipulating images') . '</dt>';
+      $output .= '<dd>' . t('With the Image module you can scale, crop, resize, rotate and desaturate images without affecting the original image using <a href="@image">image styles</a>. When you change an image style, the module automatically refreshes all created images. Every image style must have a name, which will be used in the URL of the generated images. There are two common approaches to naming image styles (which you use will depend on how the image style is being applied):',array('@image' => url('admin/config/media/image-styles')));
+      $output .= '<ul><li>' . t('Based on where it will be used: eg. <em>profile-picture</em>') . '</li>';
+      $output .= '<li>' . t('Describing its appearance: eg. <em>square-85x85</em>') . '</li></ul>';
+      $output .=  t('After you create an image style, you can add effects: crop, scale, resize, rotate, and desaturate (other contributed modules provide additional effects). For example, by combining effects as crop, scale, and desaturate, you can create square, grayscale thumbnails.') . '<dd>';
+      $output .= '<dt>' . t('Attaching images to content as fields') . '</dt>';
+      $output .= '<dd>' . t("Image module also allows you to attach images to content as fields. To add an image field to a <a href='@content-type'>content type</a>, go to the content type's <em>manage fields</em> page, and add a new field of type <em>Image</em>. Attaching images to content this way allows image styles to be applied and maintained, and also allows you more flexibility when theming.", array('@content-type' => url('admin/structure/types'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'admin/config/media/image-styles':
+      return '<p>' . t('Image styles commonly provide thumbnail sizes by scaling and cropping images, but can also add various effects before an image is displayed. When an image is displayed with a style, a new file is created and the original image is left unchanged.') . '</p>';
+    case 'admin/config/media/image-styles/edit/%/add/%':
+      $effect = image_effect_definition_load($arg[7]);
+      return isset($effect['help']) ? ('<p>' . $effect['help'] . '</p>') : NULL;
+    case 'admin/config/media/image-styles/edit/%/effects/%':
+      $effect = ($arg[5] == 'add') ? image_effect_definition_load($arg[6]) : image_effect_load($arg[6], $arg[4]);
+      return isset($effect['help']) ? ('<p>' . $effect['help'] . '</p>') : NULL;
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function image_menu() {
+  $items = array();
+
+  // Generate image derivatives of publicly available files.
+  // If clean URLs are disabled, image derivatives will always be served
+  // through the menu system.
+  // If clean URLs are enabled and the image derivative already exists,
+  // PHP will be bypassed.
+  $directory_path = file_stream_wrapper_get_instance_by_scheme('public')->getDirectoryPath();
+  $items[$directory_path . '/styles/%image_style'] = array(
+    'title' => 'Generate image style',
+    'page callback' => 'image_style_deliver',
+    'page arguments' => array(count(explode('/', $directory_path)) + 1),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  // Generate and deliver image derivatives of private files.
+  // These image derivatives are always delivered through the menu system.
+  $items['system/files/styles/%image_style'] = array(
+    'title' => 'Generate image style',
+    'page callback' => 'image_style_deliver',
+    'page arguments' => array(3),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['admin/config/media/image-styles'] = array(
+    'title' => 'Image styles',
+    'description' => 'Configure styles that can be used for resizing or adjusting images on display.',
+    'page callback' => 'image_style_list',
+    'access arguments' => array('administer image styles'),
+    'file' => 'image.admin.inc',
+  );
+  $items['admin/config/media/image-styles/list'] = array(
+    'title' => 'List',
+    'description' => 'List the current image styles on the site.',
+    'page callback' => 'image_style_list',
+    'access arguments' => array('administer image styles'),
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => 1,
+    'file' => 'image.admin.inc',
+  );
+  $items['admin/config/media/image-styles/add'] = array(
+    'title' => 'Add style',
+    'description' => 'Add a new image style.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('image_style_add_form'),
+    'access arguments' => array('administer image styles'),
+    'type' => MENU_LOCAL_ACTION,
+    'weight' => 2,
+    'file' => 'image.admin.inc',
+  );
+  $items['admin/config/media/image-styles/edit/%image_style'] = array(
+    'title' => 'Edit style',
+    'description' => 'Configure an image style.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('image_style_form', 5),
+    'access arguments' => array('administer image styles'),
+    'file' => 'image.admin.inc',
+  );
+  $items['admin/config/media/image-styles/delete/%image_style'] = array(
+    'title' => 'Delete style',
+    'description' => 'Delete an image style.',
+    'load arguments' => array(NULL, (string) IMAGE_STORAGE_NORMAL),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('image_style_delete_form', 5),
+    'access arguments' => array('administer image styles'),
+    'file' => 'image.admin.inc',
+  );
+  $items['admin/config/media/image-styles/revert/%image_style'] = array(
+    'title' => 'Revert style',
+    'description' => 'Revert an image style.',
+    'load arguments' => array(NULL, (string) IMAGE_STORAGE_OVERRIDE),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('image_style_revert_form', 5),
+    'access arguments' => array('administer image styles'),
+    'file' => 'image.admin.inc',
+  );
+  $items['admin/config/media/image-styles/edit/%image_style/effects/%image_effect'] = array(
+    'title' => 'Edit image effect',
+    'description' => 'Edit an existing effect within a style.',
+    'load arguments' => array(5, (string) IMAGE_STORAGE_EDITABLE),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('image_effect_form', 5, 7),
+    'access arguments' => array('administer image styles'),
+    'file' => 'image.admin.inc',
+  );
+  $items['admin/config/media/image-styles/edit/%image_style/effects/%image_effect/delete'] = array(
+    'title' => 'Delete image effect',
+    'description' => 'Delete an existing effect from a style.',
+    'load arguments' => array(5, (string) IMAGE_STORAGE_EDITABLE),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('image_effect_delete_form', 5, 7),
+    'access arguments' => array('administer image styles'),
+    'file' => 'image.admin.inc',
+  );
+  $items['admin/config/media/image-styles/edit/%image_style/add/%image_effect_definition'] = array(
+    'title' => 'Add image effect',
+    'description' => 'Add a new effect to a style.',
+    'load arguments' => array(5),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('image_effect_form', 5, 7),
+    'access arguments' => array('administer image styles'),
+    'file' => 'image.admin.inc',
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_theme().
+ */
+function image_theme() {
+  return array(
+    // Theme functions in image.module.
+    'image_style' => array(
+      'variables' => array(
+        'style_name' => NULL,
+        'path' => NULL,
+        'width' => NULL,
+        'height' => NULL,
+        'alt' => '',
+        'title' => NULL,
+        'attributes' => array(),
+      ),
+    ),
+
+    // Theme functions in image.admin.inc.
+    'image_style_list' => array(
+      'variables' => array('styles' => NULL),
+    ),
+    'image_style_effects' => array(
+      'render element' => 'form',
+    ),
+    'image_style_preview' => array(
+      'variables' => array('style' => NULL),
+    ),
+    'image_anchor' => array(
+      'render element' => 'element',
+    ),
+    'image_resize_summary' => array(
+      'variables' => array('data' => NULL),
+    ),
+    'image_scale_summary' => array(
+      'variables' => array('data' => NULL),
+    ),
+    'image_crop_summary' => array(
+      'variables' => array('data' => NULL),
+    ),
+    'image_rotate_summary' => array(
+      'variables' => array('data' => NULL),
+    ),
+
+    // Theme functions in image.field.inc.
+    'image_widget' => array(
+      'render element' => 'element',
+    ),
+    'image_formatter' => array(
+      'variables' => array('item' => NULL, 'path' => NULL, 'image_style' => NULL),
+    ),
+  );
+}
+
+/**
+ * Implements hook_permission().
+ */
+function image_permission() {
+  return array(
+    'administer image styles' => array(
+      'title' => t('Administer image styles'),
+      'description' => t('Create and modify styles for generating image modifications such as thumbnails.'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function image_form_system_file_system_settings_alter(&$form, &$form_state) {
+  $form['#submit'][] = 'image_system_file_system_settings_submit';
+}
+
+/**
+ * Form submission handler for system_file_system_settings().
+ *
+ * Adds a menu rebuild after the public file path has been changed, so that the
+ * menu router item depending on that file path will be regenerated.
+ */
+function image_system_file_system_settings_submit($form, &$form_state) {
+  if ($form['file_public_path']['#default_value'] !== $form_state['values']['file_public_path']) {
+    variable_set('menu_rebuild_needed', TRUE);
+  }
+}
+
+/**
+ * Implements hook_flush_caches().
+ */
+function image_flush_caches() {
+  return array('cache_image');
+}
+
+/**
+ * Implements hook_file_download().
+ *
+ * Control the access to files underneath the styles directory.
+ */
+function image_file_download($uri) {
+  $path = file_uri_target($uri);
+
+  // Private file access for image style derivatives.
+  if (strpos($path, 'styles/') === 0) {
+    $args = explode('/', $path);
+    // Discard the first part of the path (styles).
+    array_shift($args);
+    // Get the style name from the second part.
+    $style_name = array_shift($args);
+    // Remove the scheme from the path.
+    array_shift($args);
+
+    // Then the remaining parts are the path to the image.
+    $original_uri = file_uri_scheme($uri) . '://' . implode('/', $args);
+
+    // Check that the file exists and is an image.
+    if ($info = image_get_info($uri)) {
+      // Check the permissions of the original to grant access to this image.
+      $headers = module_invoke_all('file_download', $original_uri);
+      // Confirm there's at least one module granting access and none denying access.
+      if (!empty($headers) && !in_array(-1, $headers)) {
+        return array(
+          // Send headers describing the image's size, and MIME-type...
+          'Content-Type' => $info['mime_type'],
+          'Content-Length' => $info['file_size'],
+          // By not explicitly setting them here, this uses normal Drupal
+          // Expires, Cache-Control and ETag headers to prevent proxy or
+          // browser caching of private images.
+        );
+      }
+    }
+    return -1;
+  }
+
+  // Private file access for the original files. Note that we only check access
+  // for non-temporary images, since file.module will grant access for all
+  // temporary files.
+  $files = file_load_multiple(array(), array('uri' => $uri));
+  if (count($files)) {
+    $file = reset($files);
+    if ($file->status) {
+      return file_file_download($uri, 'image');
+    }
+  }
+}
+
+/**
+ * Implements hook_file_move().
+ */
+function image_file_move($file, $source) {
+  // Delete any image derivatives at the original image path.
+  image_path_flush($source->uri);
+}
+
+/**
+ * Implements hook_file_delete().
+ */
+function image_file_delete($file) {
+  // Delete any image derivatives of this image.
+  image_path_flush($file->uri);
+}
+
+/**
+ * Implements hook_image_default_styles().
+ */
+function image_image_default_styles() {
+  $styles = array();
+
+  $styles['thumbnail'] = array(
+    'label' => 'Thumbnail (100x100)',
+    'effects' => array(
+      array(
+        'name' => 'image_scale',
+        'data' => array('width' => 100, 'height' => 100, 'upscale' => 1),
+        'weight' => 0,
+      ),
+    )
+  );
+
+  $styles['medium'] = array(
+    'label' => 'Medium (220x220)',
+    'effects' => array(
+      array(
+        'name' => 'image_scale',
+        'data' => array('width' => 220, 'height' => 220, 'upscale' => 1),
+        'weight' => 0,
+      ),
+    )
+  );
+
+  $styles['large'] = array(
+    'label' => 'Large (480x480)',
+    'effects' => array(
+      array(
+        'name' => 'image_scale',
+        'data' => array('width' => 480, 'height' => 480, 'upscale' => 0),
+        'weight' => 0,
+      ),
+    )
+  );
+
+  return $styles;
+}
+
+/**
+ * Implements hook_image_style_save().
+ */
+function image_image_style_save($style) {
+  if (isset($style['old_name']) && $style['old_name'] != $style['name']) {
+    $instances = field_read_instances();
+    // Loop through all fields searching for image fields.
+    foreach ($instances as $instance) {
+      if ($instance['widget']['module'] == 'image') {
+        $instance_changed = FALSE;
+        foreach ($instance['display'] as $view_mode => $display) {
+          // Check if the formatter involves an image style.
+          if ($display['type'] == 'image' && $display['settings']['image_style'] == $style['old_name']) {
+            // Update display information for any instance using the image
+            // style that was just deleted.
+            $instance['display'][$view_mode]['settings']['image_style'] = $style['name'];
+            $instance_changed = TRUE;
+          }
+        }
+        if ($instance['widget']['settings']['preview_image_style'] == $style['old_name']) {
+          $instance['widget']['settings']['preview_image_style'] = $style['name'];
+          $instance_changed = TRUE;
+        }
+        if ($instance_changed) {
+          field_update_instance($instance);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_image_style_delete().
+ */
+function image_image_style_delete($style) {
+  image_image_style_save($style);
+}
+
+/**
+ * Implements hook_field_delete_field().
+ */
+function image_field_delete_field($field) {
+  if ($field['type'] != 'image') {
+    return;
+  }
+
+  // The value of a managed_file element can be an array if #extended == TRUE.
+  $fid = (is_array($field['settings']['default_image']) ? $field['settings']['default_image']['fid'] : $field['settings']['default_image']);
+  if ($fid && ($file = file_load($fid))) {
+    file_usage_delete($file, 'image', 'default_image', $field['id']);
+  }
+}
+
+/**
+ * Implements hook_field_update_field().
+ */
+function image_field_update_field($field, $prior_field, $has_data) {
+  if ($field['type'] != 'image') {
+    return;
+  }
+
+  // The value of a managed_file element can be an array if #extended == TRUE.
+  $fid_new = (is_array($field['settings']['default_image']) ? $field['settings']['default_image']['fid'] : $field['settings']['default_image']);
+  $fid_old = (is_array($prior_field['settings']['default_image']) ? $prior_field['settings']['default_image']['fid'] : $prior_field['settings']['default_image']);
+
+  $file_new = $fid_new ? file_load($fid_new) : FALSE;
+
+  if ($fid_new != $fid_old) {
+
+    // Is there a new file?
+    if ($file_new) {
+      $file_new->status = FILE_STATUS_PERMANENT;
+      file_save($file_new);
+      file_usage_add($file_new, 'image', 'default_image', $field['id']);
+    }
+
+    // Is there an old file?
+    if ($fid_old && ($file_old = file_load($fid_old))) {
+      file_usage_delete($file_old, 'image', 'default_image', $field['id']);
+    }
+  }
+
+  // If the upload destination changed, then move the file.
+  if ($file_new && (file_uri_scheme($file_new->uri) != $field['settings']['uri_scheme'])) {
+    $directory = $field['settings']['uri_scheme'] . '://default_images/';
+    file_prepare_directory($directory, FILE_CREATE_DIRECTORY);
+    file_move($file_new, $directory . $file_new->filename);
+  }
+}
+
+/**
+ * Implements hook_field_delete_instance().
+ */
+function image_field_delete_instance($instance) {
+  // Only act on image fields.
+  $field = field_read_field($instance['field_name']);
+  if ($field['type'] != 'image') {
+    return;
+  }
+
+  // The value of a managed_file element can be an array if the #extended
+  // property is set to TRUE.
+  $fid = $instance['settings']['default_image'];
+  if (is_array($fid)) {
+    $fid = $fid['fid'];
+  }
+
+  // Remove the default image when the instance is deleted.
+  if ($fid && ($file = file_load($fid))) {
+    file_usage_delete($file, 'image', 'default_image', $instance['id']);
+  }
+}
+
+/**
+ * Implements hook_field_update_instance().
+ */
+function image_field_update_instance($instance, $prior_instance) {
+  // Only act on image fields.
+  $field = field_read_field($instance['field_name']);
+  if ($field['type'] != 'image') {
+    return;
+  }
+
+  // The value of a managed_file element can be an array if the #extended
+  // property is set to TRUE.
+  $fid_new = $instance['settings']['default_image'];
+  if (is_array($fid_new)) {
+    $fid_new = $fid_new['fid'];
+  }
+  $fid_old = $prior_instance['settings']['default_image'];
+  if (is_array($fid_old)) {
+    $fid_old = $fid_old['fid'];
+  }
+
+  // If the old and new files do not match, update the default accordingly.
+  $file_new = $fid_new ? file_load($fid_new) : FALSE;
+  if ($fid_new != $fid_old) {
+    // Save the new file, if present.
+    if ($file_new) {
+      $file_new->status = FILE_STATUS_PERMANENT;
+      file_save($file_new);
+      file_usage_add($file_new, 'image', 'default_image', $instance['id']);
+    }
+    // Delete the old file, if present.
+    if ($fid_old && ($file_old = file_load($fid_old))) {
+      file_usage_delete($file_old, 'image', 'default_image', $instance['id']);
+    }
+  }
+
+  // If the upload destination changed, then move the file.
+  if ($file_new && (file_uri_scheme($file_new->uri) != $field['settings']['uri_scheme'])) {
+    $directory = $field['settings']['uri_scheme'] . '://default_images/';
+    file_prepare_directory($directory, FILE_CREATE_DIRECTORY);
+    file_move($file_new, $directory . $file_new->filename);
+  }
+}
+
+/**
+ * Clears cached versions of a specific file in all styles.
+ *
+ * @param $path
+ *   The Drupal file path to the original image.
+ */
+function image_path_flush($path) {
+  $styles = image_styles();
+  foreach ($styles as $style) {
+    $image_path = image_style_path($style['name'], $path);
+    if (file_exists($image_path)) {
+      file_unmanaged_delete($image_path);
+    }
+  }
+}
+
+/**
+ * Gets an array of all styles and their settings.
+ *
+ * @return
+ *   An array of styles keyed by the image style ID (isid).
+ * @see image_style_load()
+ */
+function image_styles() {
+  $styles = &drupal_static(__FUNCTION__);
+
+  // Grab from cache or build the array.
+  if (!isset($styles)) {
+    if ($cache = cache_get('image_styles', 'cache')) {
+      $styles = $cache->data;
+    }
+    else {
+      $styles = array();
+
+      // Select the module-defined styles.
+      foreach (module_implements('image_default_styles') as $module) {
+        $module_styles = module_invoke($module, 'image_default_styles');
+        foreach ($module_styles as $style_name => $style) {
+          $style['name'] = $style_name;
+          $style['label'] = empty($style['label']) ? $style_name : $style['label'];
+          $style['module'] = $module;
+          $style['storage'] = IMAGE_STORAGE_DEFAULT;
+          foreach ($style['effects'] as $key => $effect) {
+            $definition = image_effect_definition_load($effect['name']);
+            $effect = array_merge($definition, $effect);
+            $style['effects'][$key] = $effect;
+          }
+          $styles[$style_name] = $style;
+        }
+      }
+
+      // Select all the user-defined styles.
+      $user_styles = db_select('image_styles', NULL, array('fetch' => PDO::FETCH_ASSOC))
+        ->fields('image_styles')
+        ->orderBy('name')
+        ->execute()
+        ->fetchAllAssoc('name', PDO::FETCH_ASSOC);
+
+      // Allow the user styles to override the module styles.
+      foreach ($user_styles as $style_name => $style) {
+        $style['module'] = NULL;
+        $style['storage'] = IMAGE_STORAGE_NORMAL;
+        $style['effects'] = image_style_effects($style);
+        if (isset($styles[$style_name]['module'])) {
+          $style['module'] = $styles[$style_name]['module'];
+          $style['storage'] = IMAGE_STORAGE_OVERRIDE;
+        }
+        $styles[$style_name] = $style;
+      }
+
+      drupal_alter('image_styles', $styles);
+      cache_set('image_styles', $styles);
+    }
+  }
+
+  return $styles;
+}
+
+/**
+ * Loads a style by style name or ID.
+ *
+ * May be used as a loader for menu items.
+ *
+ * @param $name
+ *   The name of the style.
+ * @param $isid
+ *   Optional. The numeric id of a style if the name is not known.
+ * @param $include
+ *   If set, this loader will restrict to a specific type of image style, may be
+ *   one of the defined Image style storage constants.
+ *
+ * @return
+ *   An image style array containing the following keys:
+ *   - "isid": The unique image style ID.
+ *   - "name": The unique image style name.
+ *   - "effects": An array of image effects within this image style.
+ *   If the image style name or ID is not valid, an empty array is returned.
+ * @see image_effect_load()
+ */
+function image_style_load($name = NULL, $isid = NULL, $include = NULL) {
+  $styles = image_styles();
+
+  // If retrieving by name.
+  if (isset($name) && isset($styles[$name])) {
+    $style = $styles[$name];
+  }
+
+  // If retrieving by image style id.
+  if (!isset($name) && isset($isid)) {
+    foreach ($styles as $name => $database_style) {
+      if (isset($database_style['isid']) && $database_style['isid'] == $isid) {
+        $style = $database_style;
+        break;
+      }
+    }
+  }
+
+  // Restrict to the specific type of flag. This bitwise operation basically
+  // states "if the storage is X, then allow".
+  if (isset($style) && (!isset($include) || ($style['storage'] & (int) $include))) {
+    return $style;
+  }
+
+  // Otherwise the style was not found.
+  return FALSE;
+}
+
+/**
+ * Saves an image style.
+ *
+ * @param array $style
+ *   An image style array containing:
+ *   - name: A unique name for the style.
+ *   - isid: (optional) An image style ID.
+ *
+ * @return array
+ *   An image style array containing:
+ *   - name: An unique name for the style.
+ *   - old_name: The original name for the style.
+ *   - isid: An image style ID.
+ *   - is_new: TRUE if this is a new style, and FALSE if it is an existing
+ *     style.
+ */
+function image_style_save($style) {
+  if (isset($style['isid']) && is_numeric($style['isid'])) {
+    // Load the existing style to make sure we account for renamed styles.
+    $old_style = image_style_load(NULL, $style['isid']);
+    image_style_flush($old_style);
+    drupal_write_record('image_styles', $style, 'isid');
+    if ($old_style['name'] != $style['name']) {
+      $style['old_name'] = $old_style['name'];
+    }
+  }
+  else {
+    // Add a default label when not given.
+    if (empty($style['label'])) {
+      $style['label'] = $style['name'];
+    }
+    drupal_write_record('image_styles', $style);
+    $style['is_new'] = TRUE;
+  }
+
+  // Let other modules update as necessary on save.
+  module_invoke_all('image_style_save', $style);
+
+  // Clear all caches and flush.
+  image_style_flush($style);
+
+  return $style;
+}
+
+/**
+ * Deletes an image style.
+ *
+ * @param $style
+ *   An image style array.
+ * @param $replacement_style_name
+ *   (optional) When deleting a style, specify a replacement style name so
+ *   that existing settings (if any) may be converted to a new style.
+ *
+ * @return
+ *   TRUE on success.
+ */
+function image_style_delete($style, $replacement_style_name = '') {
+  image_style_flush($style);
+
+  db_delete('image_effects')->condition('isid', $style['isid'])->execute();
+  db_delete('image_styles')->condition('isid', $style['isid'])->execute();
+
+  // Let other modules update as necessary on save.
+  $style['old_name'] = $style['name'];
+  $style['name'] = $replacement_style_name;
+  module_invoke_all('image_style_delete', $style);
+
+  return TRUE;
+}
+
+/**
+ * Loads all the effects for an image style.
+ *
+ * @param array $style
+ *   An image style array containing:
+ *   - isid: The unique image style ID that contains this image effect.
+ *
+ * @return array
+ *   An array of image effects associated with specified image style in the
+ *   format array('isid' => array()), or an empty array if the specified style
+ *   has no effects.
+ * @see image_effects()
+ */
+function image_style_effects($style) {
+  $effects = image_effects();
+  $style_effects = array();
+  foreach ($effects as $effect) {
+    if ($style['isid'] == $effect['isid']) {
+      $style_effects[$effect['ieid']] = $effect;
+    }
+  }
+
+  return $style_effects;
+}
+
+/**
+ * Gets an array of image styles suitable for using as select list options.
+ *
+ * @param $include_empty
+ *   If TRUE a <none> option will be inserted in the options array.
+ * @param $output
+ *   Optional flag determining how the options will be sanitized on output.
+ *   Leave this at the default (CHECK_PLAIN) if you are using the output of
+ *   this function directly in an HTML context, such as for checkbox or radio
+ *   button labels, and do not plan to sanitize it on your own. If using the
+ *   output of this function as select list options (its primary use case), you
+ *   should instead set this flag to PASS_THROUGH to avoid double-escaping of
+ *   the output (the form API sanitizes select list options by default).
+ *
+ * @return
+ *   Array of image styles with the machine name as key and the label as value.
+ */
+function image_style_options($include_empty = TRUE, $output = CHECK_PLAIN) {
+  $styles = image_styles();
+  $options = array();
+  if ($include_empty && !empty($styles)) {
+    $options[''] = t('<none>');
+  }
+  foreach ($styles as $name => $style) {
+    $options[$name] = ($output == PASS_THROUGH) ? $style['label'] : check_plain($style['label']);
+  }
+
+  if (empty($options)) {
+    $options[''] = t('No defined styles');
+  }
+  return $options;
+}
+
+/**
+ * Page callback: Generates a derivative, given a style and image path.
+ *
+ * After generating an image, transfer it to the requesting agent.
+ *
+ * @param $style
+ *   The image style
+ */
+function image_style_deliver($style, $scheme) {
+  $args = func_get_args();
+  array_shift($args);
+  array_shift($args);
+  $target = implode('/', $args);
+
+  // Check that the style is defined, the scheme is valid, and the image
+  // derivative token is valid. (Sites which require image derivatives to be
+  // generated without a token can set the 'image_allow_insecure_derivatives'
+  // variable to TRUE to bypass the latter check, but this will increase the
+  // site's vulnerability to denial-of-service attacks. To prevent this
+  // variable from leaving the site vulnerable to the most serious attacks, a
+  // token is always required when a derivative of a derivative is requested.)
+  $valid = !empty($style) && file_stream_wrapper_valid_scheme($scheme);
+  if (!variable_get('image_allow_insecure_derivatives', FALSE) || strpos(ltrim($target, '\/'), 'styles/') === 0) {
+    $valid = $valid && isset($_GET[IMAGE_DERIVATIVE_TOKEN]) && $_GET[IMAGE_DERIVATIVE_TOKEN] === image_style_path_token($style['name'], $scheme . '://' . $target);
+  }
+  if (!$valid) {
+    return MENU_ACCESS_DENIED;
+  }
+
+  $image_uri = $scheme . '://' . $target;
+  $derivative_uri = image_style_path($style['name'], $image_uri);
+
+  // If using the private scheme, let other modules provide headers and
+  // control access to the file.
+  if ($scheme == 'private') {
+    if (file_exists($derivative_uri)) {
+      file_download($scheme, file_uri_target($derivative_uri));
+    }
+    else {
+      $headers = module_invoke_all('file_download', $image_uri);
+      if (in_array(-1, $headers) || empty($headers)) {
+        return MENU_ACCESS_DENIED;
+      }
+      if (count($headers)) {
+        foreach ($headers as $name => $value) {
+          drupal_add_http_header($name, $value);
+        }
+      }
+    }
+  }
+
+  // Don't start generating the image if the derivative already exists or if
+  // generation is in progress in another thread.
+  $lock_name = 'image_style_deliver:' . $style['name'] . ':' . drupal_hash_base64($image_uri);
+  if (!file_exists($derivative_uri)) {
+    $lock_acquired = lock_acquire($lock_name);
+    if (!$lock_acquired) {
+      // Tell client to retry again in 3 seconds. Currently no browsers are known
+      // to support Retry-After.
+      drupal_add_http_header('Status', '503 Service Unavailable');
+      drupal_add_http_header('Retry-After', 3);
+      print t('Image generation in progress. Try again shortly.');
+      drupal_exit();
+    }
+  }
+
+  // Try to generate the image, unless another thread just did it while we were
+  // acquiring the lock.
+  $success = file_exists($derivative_uri) || image_style_create_derivative($style, $image_uri, $derivative_uri);
+
+  if (!empty($lock_acquired)) {
+    lock_release($lock_name);
+  }
+
+  if ($success) {
+    $image = image_load($derivative_uri);
+    file_transfer($image->source, array('Content-Type' => $image->info['mime_type'], 'Content-Length' => $image->info['file_size']));
+  }
+  else {
+    watchdog('image', 'Unable to generate the derived image located at %path.', array('%path' => $derivative_uri));
+    drupal_add_http_header('Status', '500 Internal Server Error');
+    print t('Error generating image.');
+    drupal_exit();
+  }
+}
+
+/**
+ * Creates a new image derivative based on an image style.
+ *
+ * Generates an image derivative by creating the destination folder (if it does
+ * not already exist), applying all image effects defined in $style['effects'],
+ * and saving a cached version of the resulting image.
+ *
+ * @param $style
+ *   An image style array.
+ * @param $source
+ *   Path of the source file.
+ * @param $destination
+ *   Path or URI of the destination file.
+ *
+ * @return
+ *   TRUE if an image derivative was generated, or FALSE if the image derivative
+ *   could not be generated.
+ *
+ * @see image_style_load()
+ */
+function image_style_create_derivative($style, $source, $destination) {
+  // If the source file doesn't exist, return FALSE without creating folders.
+  if (!$image = image_load($source)) {
+    return FALSE;
+  }
+
+  // Get the folder for the final location of this style.
+  $directory = drupal_dirname($destination);
+
+  // Build the destination folder tree if it doesn't already exist.
+  if (!file_prepare_directory($directory, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS)) {
+    watchdog('image', 'Failed to create style directory: %directory', array('%directory' => $directory), WATCHDOG_ERROR);
+    return FALSE;
+  }
+
+  foreach ($style['effects'] as $effect) {
+    image_effect_apply($image, $effect);
+  }
+
+  if (!image_save($image, $destination)) {
+    if (file_exists($destination)) {
+      watchdog('image', 'Cached image file %destination already exists. There may be an issue with your rewrite configuration.', array('%destination' => $destination), WATCHDOG_ERROR);
+    }
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+/**
+ * Determines the dimensions of the styled image.
+ *
+ * Applies all of an image style's effects to $dimensions.
+ *
+ * @param $style_name
+ *   The name of the style to be applied.
+ * @param $dimensions
+ *   Dimensions to be modified - an array with components width and height, in
+ *   pixels.
+ */
+function image_style_transform_dimensions($style_name, array &$dimensions) {
+  module_load_include('inc', 'image', 'image.effects');
+  $style = image_style_load($style_name);
+
+  if (!is_array($style)) {
+    return;
+  }
+
+  foreach ($style['effects'] as $effect) {
+    if (isset($effect['dimensions passthrough'])) {
+      continue;
+    }
+
+    if (isset($effect['dimensions callback'])) {
+      $effect['dimensions callback']($dimensions, $effect['data']);
+    }
+    else {
+      $dimensions['width'] = $dimensions['height'] = NULL;
+    }
+  }
+}
+
+/**
+ * Flushes cached media for a style.
+ *
+ * @param $style
+ *   An image style array.
+ */
+function image_style_flush($style) {
+  // Delete the style directory in each registered wrapper.
+  $wrappers = file_get_stream_wrappers(STREAM_WRAPPERS_WRITE_VISIBLE);
+  foreach ($wrappers as $wrapper => $wrapper_data) {
+    if (file_exists($directory = $wrapper . '://styles/' . $style['name'])) {
+      file_unmanaged_delete_recursive($directory);
+    }
+  }
+
+  // Let other modules update as necessary on flush.
+  module_invoke_all('image_style_flush', $style);
+
+  // Clear image style and effect caches.
+  cache_clear_all('image_styles', 'cache');
+  cache_clear_all('image_effects:', 'cache', TRUE);
+  drupal_static_reset('image_styles');
+  drupal_static_reset('image_effects');
+
+  // Clear field caches so that formatters may be added for this style.
+  field_info_cache_clear();
+  drupal_theme_rebuild();
+
+  // Clear page caches when flushing.
+  if (module_exists('block')) {
+    cache_clear_all('*', 'cache_block', TRUE);
+  }
+  cache_clear_all('*', 'cache_page', TRUE);
+}
+
+/**
+ * Returns the URL for an image derivative given a style and image path.
+ *
+ * @param $style_name
+ *   The name of the style to be used with this image.
+ * @param $path
+ *   The path to the image.
+ *
+ * @return
+ *   The absolute URL where a style image can be downloaded, suitable for use
+ *   in an <img> tag. Requesting the URL will cause the image to be created.
+ * @see image_style_deliver()
+ */
+function image_style_url($style_name, $path) {
+  $uri = image_style_path($style_name, $path);
+
+  // The passed-in $path variable can be either a relative path or a full URI.
+  $original_uri = file_uri_scheme($path) ? file_stream_wrapper_uri_normalize($path) : file_build_uri($path);
+
+  // The token query is added even if the 'image_allow_insecure_derivatives'
+  // variable is TRUE, so that the emitted links remain valid if it is changed
+  // back to the default FALSE.
+  $token_query = array(IMAGE_DERIVATIVE_TOKEN => image_style_path_token($style_name, $original_uri));
+
+  // If not using clean URLs, the image derivative callback is only available
+  // with the query string. If the file does not exist, use url() to ensure
+  // that it is included. Once the file exists it's fine to fall back to the
+  // actual file path, this avoids bootstrapping PHP once the files are built.
+  if (!variable_get('clean_url') && file_uri_scheme($uri) == 'public' && !file_exists($uri)) {
+    $directory_path = file_stream_wrapper_get_instance_by_uri($uri)->getDirectoryPath();
+    return url($directory_path . '/' . file_uri_target($uri), array('absolute' => TRUE, 'query' => $token_query));
+  }
+
+  $file_url = file_create_url($uri);
+  // Append the query string with the token.
+  return $file_url . (strpos($file_url, '?') !== FALSE ? '&' : '?') . drupal_http_build_query($token_query);
+}
+
+/**
+ * Generates a token to protect an image style derivative.
+ *
+ * This prevents unauthorized generation of an image style derivative,
+ * which can be costly both in CPU time and disk space.
+ *
+ * @param $style_name
+ *   The name of the image style.
+ * @param $uri
+ *   The URI of the image for this style, for example as returned by
+ *   image_style_path().
+ *
+ * @return
+ *   An eight-character token which can be used to protect image style
+ *   derivatives against denial-of-service attacks.
+ */
+function image_style_path_token($style_name, $uri) {
+  // Return the first eight characters.
+  return substr(drupal_hmac_base64($style_name . ':' . $uri, drupal_get_private_key() . drupal_get_hash_salt()), 0, 8);
+}
+
+/**
+ * Returns the URI of an image when using a style.
+ *
+ * The path returned by this function may not exist. The default generation
+ * method only creates images when they are requested by a user's browser.
+ *
+ * @param $style_name
+ *   The name of the style to be used with this image.
+ * @param $uri
+ *   The URI or path to the image.
+ *
+ * @return
+ *   The URI to an image style image.
+ * @see image_style_url()
+ */
+function image_style_path($style_name, $uri) {
+  $scheme = file_uri_scheme($uri);
+  if ($scheme) {
+    $path = file_uri_target($uri);
+  }
+  else {
+    $path = $uri;
+    $scheme = file_default_scheme();
+  }
+  return $scheme . '://styles/' . $style_name . '/' . $scheme . '/' . $path;
+}
+
+/**
+ * Saves a default image style to the database.
+ *
+ * @param style
+ *   An image style array provided by a module.
+ *
+ * @return
+ *   An image style array. The returned style array will include the new 'isid'
+ *   assigned to the style.
+ */
+function image_default_style_save($style) {
+  $style = image_style_save($style);
+  $effects = array();
+  foreach ($style['effects'] as $effect) {
+    $effect['isid'] = $style['isid'];
+    $effect = image_effect_save($effect);
+    $effects[$effect['ieid']] = $effect;
+  }
+  $style['effects'] = $effects;
+  return $style;
+}
+
+/**
+ * Reverts the changes made by users to a default image style.
+ *
+ * @param style
+ *   An image style array.
+ * @return
+ *   Boolean TRUE if the operation succeeded.
+ */
+function image_default_style_revert($style) {
+  image_style_flush($style);
+
+  db_delete('image_effects')->condition('isid', $style['isid'])->execute();
+  db_delete('image_styles')->condition('isid', $style['isid'])->execute();
+
+  return TRUE;
+}
+
+/**
+ * Returns a set of image effects.
+ *
+ * These image effects are exposed by modules implementing
+ * hook_image_effect_info().
+ *
+ * @return
+ *   An array of image effects to be used when transforming images.
+ * @see hook_image_effect_info()
+ * @see image_effect_definition_load()
+ */
+function image_effect_definitions() {
+  global $language;
+
+  // hook_image_effect_info() includes translated strings, so each language is
+  // cached separately.
+  $langcode = $language->language;
+
+  $effects = &drupal_static(__FUNCTION__);
+
+  if (!isset($effects)) {
+    if ($cache = cache_get("image_effects:$langcode")) {
+      $effects = $cache->data;
+    }
+    else {
+      $effects = array();
+      include_once DRUPAL_ROOT . '/modules/image/image.effects.inc';
+      foreach (module_implements('image_effect_info') as $module) {
+        foreach (module_invoke($module, 'image_effect_info') as $name => $effect) {
+          // Ensure the current toolkit supports the effect.
+          $effect['module'] = $module;
+          $effect['name'] = $name;
+          $effect['data'] = isset($effect['data']) ? $effect['data'] : array();
+          $effects[$name] = $effect;
+        }
+      }
+      uasort($effects, '_image_effect_definitions_sort');
+      drupal_alter('image_effect_info', $effects);
+      cache_set("image_effects:$langcode", $effects);
+    }
+  }
+
+  return $effects;
+}
+
+/**
+ * Loads the definition for an image effect.
+ *
+ * The effect definition is a set of core properties for an image effect, not
+ * containing any user-settings. The definition defines various functions to
+ * call when configuring or executing an image effect. This loader is mostly for
+ * internal use within image.module. Use image_effect_load() or
+ * image_style_load() to get image effects that contain configuration.
+ *
+ * @param $effect
+ *   The name of the effect definition to load.
+ * @param $style
+ *   An image style array to which this effect will be added.
+ *
+ * @return
+ *   An array containing the image effect definition with the following keys:
+ *   - "effect": The unique name for the effect being performed. Usually prefixed
+ *     with the name of the module providing the effect.
+ *   - "module": The module providing the effect.
+ *   - "help": A description of the effect.
+ *   - "function": The name of the function that will execute the effect.
+ *   - "form": (optional) The name of a function to configure the effect.
+ *   - "summary": (optional) The name of a theme function that will display a
+ *     one-line summary of the effect. Does not include the "theme_" prefix.
+ */
+function image_effect_definition_load($effect, $style_name = NULL) {
+  $definitions = image_effect_definitions();
+
+  // If a style is specified, do not allow loading of default style
+  // effects.
+  if (isset($style_name)) {
+    $style = image_style_load($style_name, NULL);
+    if ($style['storage'] == IMAGE_STORAGE_DEFAULT) {
+      return FALSE;
+    }
+  }
+
+  return isset($definitions[$effect]) ? $definitions[$effect] : FALSE;
+}
+
+/**
+ * Loads all image effects from the database.
+ *
+ * @return
+ *   An array of all image effects.
+ * @see image_effect_load()
+ */
+function image_effects() {
+  $effects = &drupal_static(__FUNCTION__);
+
+  if (!isset($effects)) {
+    $effects = array();
+
+    // Add database image effects.
+    $result = db_select('image_effects', NULL, array('fetch' => PDO::FETCH_ASSOC))
+      ->fields('image_effects')
+      ->orderBy('image_effects.weight', 'ASC')
+      ->execute();
+    foreach ($result as $effect) {
+      $effect['data'] = unserialize($effect['data']);
+      $definition = image_effect_definition_load($effect['name']);
+      // Do not load image effects whose definition cannot be found.
+      if ($definition) {
+        $effect = array_merge($definition, $effect);
+        $effects[$effect['ieid']] = $effect;
+      }
+    }
+  }
+
+  return $effects;
+}
+
+/**
+ * Loads a single image effect.
+ *
+ * @param $ieid
+ *   The image effect ID.
+ * @param $style_name
+ *   The image style name.
+ * @param $include
+ *   If set, this loader will restrict to a specific type of image style, may be
+ *   one of the defined Image style storage constants.
+ *
+ * @return
+ *   An image effect array, consisting of the following keys:
+ *   - "ieid": The unique image effect ID.
+ *   - "isid": The unique image style ID that contains this image effect.
+ *   - "weight": The weight of this image effect within the image style.
+ *   - "name": The name of the effect definition that powers this image effect.
+ *   - "data": An array of configuration options for this image effect.
+ *   Besides these keys, the entirety of the image definition is merged into
+ *   the image effect array. Returns FALSE if the specified effect cannot be
+ *   found.
+ * @see image_style_load()
+ * @see image_effect_definition_load()
+ */
+function image_effect_load($ieid, $style_name, $include = NULL) {
+  if (($style = image_style_load($style_name, NULL, $include)) && isset($style['effects'][$ieid])) {
+    return $style['effects'][$ieid];
+  }
+  return FALSE;
+}
+
+/**
+ * Saves an image effect.
+ *
+ * @param $effect
+ *   An image effect array.
+ *
+ * @return
+ *   An image effect array. In the case of a new effect, 'ieid' will be set.
+ */
+function image_effect_save($effect) {
+  if (!empty($effect['ieid'])) {
+    drupal_write_record('image_effects', $effect, 'ieid');
+  }
+  else {
+    drupal_write_record('image_effects', $effect);
+  }
+  $style = image_style_load(NULL, $effect['isid']);
+  image_style_flush($style);
+  return $effect;
+}
+
+/**
+ * Deletes an image effect.
+ *
+ * @param $effect
+ *   An image effect array.
+ */
+function image_effect_delete($effect) {
+  db_delete('image_effects')->condition('ieid', $effect['ieid'])->execute();
+  $style = image_style_load(NULL, $effect['isid']);
+  image_style_flush($style);
+}
+
+/**
+ * Applies an image effect to the image object.
+ *
+ * @param $image
+ *   An image object returned by image_load().
+ * @param $effect
+ *   An image effect array.
+ *
+ * @return
+ *   TRUE on success. FALSE if unable to perform the image effect on the image.
+ */
+function image_effect_apply($image, $effect) {
+  module_load_include('inc', 'image', 'image.effects');
+  $function = $effect['effect callback'];
+  if (function_exists($function)) {
+    return $function($image, $effect['data']);
+  }
+  return FALSE;
+}
+
+/**
+ * Returns HTML for an image using a specific image style.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - style_name: The name of the style to be used to alter the original image.
+ *   - path: The path of the image file relative to the Drupal files directory.
+ *     This function does not work with images outside the files directory nor
+ *     with remotely hosted images. This should be in a format such as
+ *     'images/image.jpg', or using a stream wrapper such as
+ *     'public://images/image.jpg'.
+ *   - width: The width of the source image (if known).
+ *   - height: The height of the source image (if known).
+ *   - alt: The alternative text for text-based browsers.
+ *   - title: The title text is displayed when the image is hovered in some
+ *     popular browsers.
+ *   - attributes: Associative array of attributes to be placed in the img tag.
+ *
+ * @ingroup themeable
+ */
+function theme_image_style($variables) {
+  // Determine the dimensions of the styled image.
+  $dimensions = array(
+    'width' => $variables['width'],
+    'height' => $variables['height'],
+  );
+
+  image_style_transform_dimensions($variables['style_name'], $dimensions);
+
+  $variables['width'] = $dimensions['width'];
+  $variables['height'] = $dimensions['height'];
+
+  // Determine the URL for the styled image.
+  $variables['path'] = image_style_url($variables['style_name'], $variables['path']);
+  return theme('image', $variables);
+}
+
+/**
+ * Accepts a keyword (center, top, left, etc) and returns it as a pixel offset.
+ *
+ * @param $value
+ * @param $current_pixels
+ * @param $new_pixels
+ */
+function image_filter_keyword($value, $current_pixels, $new_pixels) {
+  switch ($value) {
+    case 'top':
+    case 'left':
+      return 0;
+
+    case 'bottom':
+    case 'right':
+      return $current_pixels - $new_pixels;
+
+    case 'center':
+      return $current_pixels / 2 - $new_pixels / 2;
+  }
+  return $value;
+}
+
+/**
+ * Internal function for sorting image effect definitions through uasort().
+ *
+ * @see image_effect_definitions()
+ */
+function _image_effect_definitions_sort($a, $b) {
+  return strcasecmp($a['name'], $b['name']);
+}
diff --git a/htmltest/modules/image/image.test b/htmltest/modules/image/image.test
new file mode 100644
index 00000000..4a4aab05
--- /dev/null
+++ b/htmltest/modules/image/image.test
@@ -0,0 +1,1865 @@
+<?php
+
+/**
+ * @file
+ * Tests for image.module.
+ */
+
+/**
+ * TODO: Test the following functions.
+ *
+ * image.effects.inc:
+ *   image_style_generate()
+ *   image_style_create_derivative()
+ *
+ * image.module:
+ *   image_style_load()
+ *   image_style_save()
+ *   image_style_delete()
+ *   image_style_options()
+ *   image_effect_definition_load()
+ *   image_effect_load()
+ *   image_effect_save()
+ *   image_effect_delete()
+ *   image_filter_keyword()
+ */
+
+/**
+ * This class provides methods specifically for testing Image's field handling.
+ */
+class ImageFieldTestCase extends DrupalWebTestCase {
+  protected $admin_user;
+
+  function setUp() {
+    parent::setUp('image');
+    $this->admin_user = $this->drupalCreateUser(array('access content', 'access administration pages', 'administer site configuration', 'administer content types', 'administer nodes', 'create article content', 'edit any article content', 'delete any article content', 'administer image styles'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Create a new image field.
+   *
+   * @param $name
+   *   The name of the new field (all lowercase), exclude the "field_" prefix.
+   * @param $type_name
+   *   The node type that this field will be added to.
+   * @param $field_settings
+   *   A list of field settings that will be added to the defaults.
+   * @param $instance_settings
+   *   A list of instance settings that will be added to the instance defaults.
+   * @param $widget_settings
+   *   A list of widget settings that will be added to the widget defaults.
+   */
+  function createImageField($name, $type_name, $field_settings = array(), $instance_settings = array(), $widget_settings = array()) {
+    $field = array(
+      'field_name' => $name,
+      'type' => 'image',
+      'settings' => array(),
+      'cardinality' => !empty($field_settings['cardinality']) ? $field_settings['cardinality'] : 1,
+    );
+    $field['settings'] = array_merge($field['settings'], $field_settings);
+    field_create_field($field);
+
+    $instance = array(
+      'field_name' => $field['field_name'],
+      'entity_type' => 'node',
+      'label' => $name,
+      'bundle' => $type_name,
+      'required' => !empty($instance_settings['required']),
+      'settings' => array(),
+      'widget' => array(
+        'type' => 'image_image',
+        'settings' => array(),
+      ),
+    );
+    $instance['settings'] = array_merge($instance['settings'], $instance_settings);
+    $instance['widget']['settings'] = array_merge($instance['widget']['settings'], $widget_settings);
+    return field_create_instance($instance);
+  }
+
+  /**
+   * Upload an image to a node.
+   *
+   * @param $image
+   *   A file object representing the image to upload.
+   * @param $field_name
+   *   Name of the image field the image should be attached to.
+   * @param $type
+   *   The type of node to create.
+   */
+  function uploadNodeImage($image, $field_name, $type) {
+    $edit = array(
+      'title' => $this->randomName(),
+    );
+    $edit['files[' . $field_name . '_' . LANGUAGE_NONE . '_0]'] = drupal_realpath($image->uri);
+    $this->drupalPost('node/add/' . $type, $edit, t('Save'));
+
+    // Retrieve ID of the newly created node from the current URL.
+    $matches = array();
+    preg_match('/node\/([0-9]+)/', $this->getUrl(), $matches);
+    return isset($matches[1]) ? $matches[1] : FALSE;
+  }
+}
+
+/**
+ * Tests the functions for generating paths and URLs for image styles.
+ */
+class ImageStylesPathAndUrlTestCase extends DrupalWebTestCase {
+  protected $style_name;
+  protected $image_info;
+  protected $image_filepath;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Image styles path and URL functions',
+      'description' => 'Tests functions for generating paths and URLs to image styles.',
+      'group' => 'Image',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('image_module_test');
+
+    $this->style_name = 'style_foo';
+    image_style_save(array('name' => $this->style_name, 'label' => $this->randomString()));
+  }
+
+  /**
+   * Test image_style_path().
+   */
+  function testImageStylePath() {
+    $scheme = 'public';
+    $actual = image_style_path($this->style_name, "$scheme://foo/bar.gif");
+    $expected = "$scheme://styles/" . $this->style_name . "/$scheme/foo/bar.gif";
+    $this->assertEqual($actual, $expected, 'Got the path for a file URI.');
+
+    $actual = image_style_path($this->style_name, 'foo/bar.gif');
+    $expected = "$scheme://styles/" . $this->style_name . "/$scheme/foo/bar.gif";
+    $this->assertEqual($actual, $expected, 'Got the path for a relative file path.');
+  }
+
+  /**
+   * Test image_style_url() with a file using the "public://" scheme.
+   */
+  function testImageStyleUrlAndPathPublic() {
+    $this->_testImageStyleUrlAndPath('public');
+  }
+
+  /**
+   * Test image_style_url() with a file using the "private://" scheme.
+   */
+  function testImageStyleUrlAndPathPrivate() {
+    $this->_testImageStyleUrlAndPath('private');
+  }
+
+  /**
+   * Test image_style_url() with the "public://" scheme and unclean URLs.
+   */
+   function testImageStylUrlAndPathPublicUnclean() {
+     $this->_testImageStyleUrlAndPath('public', FALSE);
+   }
+
+  /**
+   * Test image_style_url() with the "private://" schema and unclean URLs.
+   */
+  function testImageStyleUrlAndPathPrivateUnclean() {
+    $this->_testImageStyleUrlAndPath('private', FALSE);
+  }
+
+  /**
+   * Test image_style_url() with a file URL that has an extra slash in it.
+   */
+  function testImageStyleUrlExtraSlash() {
+    $this->_testImageStyleUrlAndPath('public', TRUE, TRUE);
+  }
+
+  /**
+   * Test image_style_url().
+   */
+  function _testImageStyleUrlAndPath($scheme, $clean_url = TRUE, $extra_slash = FALSE) {
+    // Make the default scheme neither "public" nor "private" to verify the
+    // functions work for other than the default scheme.
+    variable_set('file_default_scheme', 'temporary');
+    variable_set('clean_url', $clean_url);
+
+    // Create the directories for the styles.
+    $directory = $scheme . '://styles/' . $this->style_name;
+    $status = file_prepare_directory($directory, FILE_CREATE_DIRECTORY);
+    $this->assertNotIdentical(FALSE, $status, 'Created the directory for the generated images for the test style.');
+
+    // Create a working copy of the file.
+    $files = $this->drupalGetTestFiles('image');
+    $file = array_shift($files);
+    $image_info = image_get_info($file->uri);
+    $original_uri = file_unmanaged_copy($file->uri, $scheme . '://', FILE_EXISTS_RENAME);
+    // Let the image_module_test module know about this file, so it can claim
+    // ownership in hook_file_download().
+    variable_set('image_module_test_file_download', $original_uri);
+    $this->assertNotIdentical(FALSE, $original_uri, 'Created the generated image file.');
+
+    // Get the URL of a file that has not been generated and try to create it.
+    $generated_uri = image_style_path($this->style_name, $original_uri);
+    $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
+    $generate_url = image_style_url($this->style_name, $original_uri);
+
+    // Ensure that the tests still pass when the file is generated by accessing
+    // a poorly constructed (but still valid) file URL that has an extra slash
+    // in it.
+    if ($extra_slash) {
+      $modified_uri = str_replace('://', ':///', $original_uri);
+      $this->assertNotEqual($original_uri, $modified_uri, 'An extra slash was added to the generated file URI.');
+      $generate_url = image_style_url($this->style_name, $modified_uri);
+    }
+
+    if (!$clean_url) {
+      $this->assertTrue(strpos($generate_url, '?q=') !== FALSE, 'When using non-clean URLS, the system path contains the query string.');
+    }
+    // Add some extra chars to the token.
+    $this->drupalGet(str_replace(IMAGE_DERIVATIVE_TOKEN . '=', IMAGE_DERIVATIVE_TOKEN . '=Zo', $generate_url));
+    $this->assertResponse(403, 'Image was inaccessible at the URL with an invalid token.');
+    // Change the parameter name so the token is missing.
+    $this->drupalGet(str_replace(IMAGE_DERIVATIVE_TOKEN . '=', 'wrongparam=', $generate_url));
+    $this->assertResponse(403, 'Image was inaccessible at the URL with a missing token.');
+
+    // Check that the generated URL is the same when we pass in a relative path
+    // rather than a URI. We need to temporarily switch the default scheme to
+    // match the desired scheme before testing this, then switch it back to the
+    // "temporary" scheme used throughout this test afterwards.
+    variable_set('file_default_scheme', $scheme);
+    $relative_path = file_uri_target($original_uri);
+    $generate_url_from_relative_path = image_style_url($this->style_name, $relative_path);
+    $this->assertEqual($generate_url, $generate_url_from_relative_path, 'Generated URL is the same regardless of whether it came from a relative path or a file URI.');
+    variable_set('file_default_scheme', 'temporary');
+
+    // Fetch the URL that generates the file.
+    $this->drupalGet($generate_url);
+    $this->assertResponse(200, 'Image was generated at the URL.');
+    $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
+    $this->assertRaw(file_get_contents($generated_uri), 'URL returns expected file.');
+    $generated_image_info = image_get_info($generated_uri);
+    $this->assertEqual($this->drupalGetHeader('Content-Type'), $generated_image_info['mime_type'], 'Expected Content-Type was reported.');
+    $this->assertEqual($this->drupalGetHeader('Content-Length'), $generated_image_info['file_size'], 'Expected Content-Length was reported.');
+    if ($scheme == 'private') {
+      $this->assertEqual($this->drupalGetHeader('Expires'), 'Sun, 19 Nov 1978 05:00:00 GMT', 'Expires header was sent.');
+      $this->assertEqual($this->drupalGetHeader('Cache-Control'), 'no-cache, must-revalidate, post-check=0, pre-check=0', 'Cache-Control header was set to prevent caching.');
+      $this->assertEqual($this->drupalGetHeader('X-Image-Owned-By'), 'image_module_test', 'Expected custom header has been added.');
+
+      // Make sure that a second request to the already existing derivate works
+      // too.
+      $this->drupalGet($generate_url);
+      $this->assertResponse(200, 'Image was generated at the URL.');
+
+      // Make sure that access is denied for existing style files if we do not
+      // have access.
+      variable_del('image_module_test_file_download');
+      $this->drupalGet($generate_url);
+      $this->assertResponse(403, 'Confirmed that access is denied for the private image style.');
+
+      // Repeat this with a different file that we do not have access to and
+      // make sure that access is denied.
+      $file_noaccess = array_shift($files);
+      $original_uri_noaccess = file_unmanaged_copy($file_noaccess->uri, $scheme . '://', FILE_EXISTS_RENAME);
+      $generated_uri_noaccess = $scheme . '://styles/' . $this->style_name . '/' . $scheme . '/'. drupal_basename($original_uri_noaccess);
+      $this->assertFalse(file_exists($generated_uri_noaccess), 'Generated file does not exist.');
+      $generate_url_noaccess = image_style_url($this->style_name, $original_uri_noaccess);
+
+      $this->drupalGet($generate_url_noaccess);
+      $this->assertResponse(403, 'Confirmed that access is denied for the private image style.');
+      // Verify that images are not appended to the response. Currently this test only uses PNG images.
+      if (strpos($generate_url, '.png') === FALSE ) {
+        $this->fail('Confirming that private image styles are not appended require PNG file.');
+      }
+      else {
+        // Check for PNG-Signature (cf. http://www.libpng.org/pub/png/book/chapter08.html#png.ch08.div.2) in the
+        // response body.
+        $this->assertNoRaw( chr(137) . chr(80) . chr(78) . chr(71) . chr(13) . chr(10) . chr(26) . chr(10), 'No PNG signature found in the response body.');
+      }
+    }
+    elseif ($clean_url) {
+      // Add some extra chars to the token.
+      $this->drupalGet(str_replace(IMAGE_DERIVATIVE_TOKEN . '=', IMAGE_DERIVATIVE_TOKEN . '=Zo', $generate_url));
+      $this->assertResponse(200, 'Existing image was accessible at the URL with an invalid token.');
+    }
+
+    // Allow insecure image derivatives to be created for the remainder of this
+    // test.
+    variable_set('image_allow_insecure_derivatives', TRUE);
+
+    // Create another working copy of the file.
+    $files = $this->drupalGetTestFiles('image');
+    $file = array_shift($files);
+    $image_info = image_get_info($file->uri);
+    $original_uri = file_unmanaged_copy($file->uri, $scheme . '://', FILE_EXISTS_RENAME);
+    // Let the image_module_test module know about this file, so it can claim
+    // ownership in hook_file_download().
+    variable_set('image_module_test_file_download', $original_uri);
+
+    // Get the URL of a file that has not been generated and try to create it.
+    $generated_uri = image_style_path($this->style_name, $original_uri);
+    $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
+    $generate_url = image_style_url($this->style_name, $original_uri);
+
+    // Check that the image is accessible even without the security token.
+    $this->drupalGet(str_replace(IMAGE_DERIVATIVE_TOKEN . '=', 'wrongparam=', $generate_url));
+    $this->assertResponse(200, 'Image was accessible at the URL with a missing token.');
+
+    // Check that a security token is still required when generating a second
+    // image derivative using the first one as a source.
+    $nested_uri = image_style_path($this->style_name, $generated_uri);
+    $nested_url = image_style_url($this->style_name, $generated_uri);
+    $nested_url_with_wrong_token = str_replace(IMAGE_DERIVATIVE_TOKEN . '=', 'wrongparam=', $nested_url);
+    $this->drupalGet($nested_url_with_wrong_token);
+    $this->assertResponse(403, 'Image generated from an earlier derivative was inaccessible at the URL with a missing token.');
+    // Check that this restriction cannot be bypassed by adding extra slashes
+    // to the URL.
+    $this->drupalGet(substr_replace($nested_url_with_wrong_token, '//styles/', strrpos($nested_url_with_wrong_token, '/styles/'), strlen('/styles/')));
+    $this->assertResponse(403, 'Image generated from an earlier derivative was inaccessible at the URL with a missing token, even with an extra forward slash in the URL.');
+    $this->drupalGet(substr_replace($nested_url_with_wrong_token, '/\styles/', strrpos($nested_url_with_wrong_token, '/styles/'), strlen('/styles/')));
+    $this->assertResponse(403, 'Image generated from an earlier derivative was inaccessible at the URL with a missing token, even with an extra backslash in the URL.');
+    // Make sure the image can still be generated if a correct token is used.
+    $this->drupalGet($nested_url);
+    $this->assertResponse(200, 'Image was accessible when a correct token was provided in the URL.');
+
+    // Check that requesting a nonexistent image does not create any new
+    // directories in the file system.
+    $directory = $scheme . '://styles/' . $this->style_name . '/' . $scheme . '/' . $this->randomName();
+    $this->drupalGet(file_create_url($directory . '/' . $this->randomName()));
+    $this->assertFalse(file_exists($directory), 'New directory was not created in the filesystem when requesting an unauthorized image.');
+  }
+}
+
+/**
+ * Use the image_test.module's mock toolkit to ensure that the effects are
+ * properly passing parameters to the image toolkit.
+ */
+class ImageEffectsUnitTest extends ImageToolkitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Image effects',
+      'description' => 'Test that the image effects pass parameters to the toolkit correctly.',
+      'group' => 'Image',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('image_module_test');
+    module_load_include('inc', 'image', 'image.effects');
+  }
+
+  /**
+   * Test the image_resize_effect() function.
+   */
+  function testResizeEffect() {
+    $this->assertTrue(image_resize_effect($this->image, array('width' => 1, 'height' => 2)), 'Function returned the expected value.');
+    $this->assertToolkitOperationsCalled(array('resize'));
+
+    // Check the parameters.
+    $calls = image_test_get_all_calls();
+    $this->assertEqual($calls['resize'][0][1], 1, 'Width was passed correctly');
+    $this->assertEqual($calls['resize'][0][2], 2, 'Height was passed correctly');
+  }
+
+  /**
+   * Test the image_scale_effect() function.
+   */
+  function testScaleEffect() {
+    // @todo: need to test upscaling.
+    $this->assertTrue(image_scale_effect($this->image, array('width' => 10, 'height' => 10)), 'Function returned the expected value.');
+    $this->assertToolkitOperationsCalled(array('resize'));
+
+    // Check the parameters.
+    $calls = image_test_get_all_calls();
+    $this->assertEqual($calls['resize'][0][1], 10, 'Width was passed correctly');
+    $this->assertEqual($calls['resize'][0][2], 5, 'Height was based off aspect ratio and passed correctly');
+  }
+
+  /**
+   * Test the image_crop_effect() function.
+   */
+  function testCropEffect() {
+    // @todo should test the keyword offsets.
+    $this->assertTrue(image_crop_effect($this->image, array('anchor' => 'top-1', 'width' => 3, 'height' => 4)), 'Function returned the expected value.');
+    $this->assertToolkitOperationsCalled(array('crop'));
+
+    // Check the parameters.
+    $calls = image_test_get_all_calls();
+    $this->assertEqual($calls['crop'][0][1], 0, 'X was passed correctly');
+    $this->assertEqual($calls['crop'][0][2], 1, 'Y was passed correctly');
+    $this->assertEqual($calls['crop'][0][3], 3, 'Width was passed correctly');
+    $this->assertEqual($calls['crop'][0][4], 4, 'Height was passed correctly');
+  }
+
+  /**
+   * Test the image_scale_and_crop_effect() function.
+   */
+  function testScaleAndCropEffect() {
+    $this->assertTrue(image_scale_and_crop_effect($this->image, array('width' => 5, 'height' => 10)), 'Function returned the expected value.');
+    $this->assertToolkitOperationsCalled(array('resize', 'crop'));
+
+    // Check the parameters.
+    $calls = image_test_get_all_calls();
+    $this->assertEqual($calls['crop'][0][1], 7.5, 'X was computed and passed correctly');
+    $this->assertEqual($calls['crop'][0][2], 0, 'Y was computed and passed correctly');
+    $this->assertEqual($calls['crop'][0][3], 5, 'Width was computed and passed correctly');
+    $this->assertEqual($calls['crop'][0][4], 10, 'Height was computed and passed correctly');
+  }
+
+  /**
+   * Test the image_desaturate_effect() function.
+   */
+  function testDesaturateEffect() {
+    $this->assertTrue(image_desaturate_effect($this->image, array()), 'Function returned the expected value.');
+    $this->assertToolkitOperationsCalled(array('desaturate'));
+
+    // Check the parameters.
+    $calls = image_test_get_all_calls();
+    $this->assertEqual(count($calls['desaturate'][0]), 1, 'Only the image was passed.');
+  }
+
+  /**
+   * Test the image_rotate_effect() function.
+   */
+  function testRotateEffect() {
+    // @todo: need to test with 'random' => TRUE
+    $this->assertTrue(image_rotate_effect($this->image, array('degrees' => 90, 'bgcolor' => '#fff')), 'Function returned the expected value.');
+    $this->assertToolkitOperationsCalled(array('rotate'));
+
+    // Check the parameters.
+    $calls = image_test_get_all_calls();
+    $this->assertEqual($calls['rotate'][0][1], 90, 'Degrees were passed correctly');
+    $this->assertEqual($calls['rotate'][0][2], 0xffffff, 'Background color was passed correctly');
+  }
+
+  /**
+   * Test image effect caching.
+   */
+  function testImageEffectsCaching() {
+    $image_effect_definitions_called = &drupal_static('image_module_test_image_effect_info_alter');
+
+    // First call should grab a fresh copy of the data.
+    $effects = image_effect_definitions();
+    $this->assertTrue($image_effect_definitions_called === 1, 'image_effect_definitions() generated data.');
+
+    // Second call should come from cache.
+    drupal_static_reset('image_effect_definitions');
+    drupal_static_reset('image_module_test_image_effect_info_alter');
+    $cached_effects = image_effect_definitions();
+    $this->assertTrue(is_null($image_effect_definitions_called), 'image_effect_definitions() returned data from cache.');
+
+    $this->assertTrue($effects == $cached_effects, 'Cached effects are the same as generated effects.');
+  }
+}
+
+/**
+ * Tests creation, deletion, and editing of image styles and effects.
+ */
+class ImageAdminStylesUnitTest extends ImageFieldTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Image styles and effects UI configuration',
+      'description' => 'Tests creation, deletion, and editing of image styles and effects at the UI level.',
+      'group' => 'Image',
+    );
+  }
+
+  /**
+   * Given an image style, generate an image.
+   */
+  function createSampleImage($style) {
+    static $file_path;
+
+    // First, we need to make sure we have an image in our testing
+    // file directory. Copy over an image on the first run.
+    if (!isset($file_path)) {
+      $files = $this->drupalGetTestFiles('image');
+      $file = reset($files);
+      $file_path = file_unmanaged_copy($file->uri);
+    }
+
+    return image_style_url($style['name'], $file_path) ? $file_path : FALSE;
+  }
+
+  /**
+   * Count the number of images currently create for a style.
+   */
+  function getImageCount($style) {
+    return count(file_scan_directory('public://styles/' . $style['name'], '/.*/'));
+  }
+
+  /**
+   * Test creating an image style with a numeric name and ensuring it can be
+   * applied to an image.
+   */
+  function testNumericStyleName() {
+    $style_name = rand();
+    $style_label = $this->randomString();
+    $edit = array(
+      'name' => $style_name,
+      'label' => $style_label,
+    );
+    $this->drupalPost('admin/config/media/image-styles/add', $edit, t('Create new style'));
+    $this->assertRaw(t('Style %name was created.', array('%name' => $style_label)), 'Image style successfully created.');
+    $options = image_style_options();
+    $this->assertTrue(array_key_exists($style_name, $options), format_string('Array key %key exists.', array('%key' => $style_name)));
+  }
+
+  /**
+   * General test to add a style, add/remove/edit effects to it, then delete it.
+   */
+  function testStyle() {
+    // Setup a style to be created and effects to add to it.
+    $style_name = strtolower($this->randomName(10));
+    $style_label = $this->randomString();
+    $style_path = 'admin/config/media/image-styles/edit/' . $style_name;
+    $effect_edits = array(
+      'image_resize' => array(
+        'data[width]' => 100,
+        'data[height]' => 101,
+      ),
+      'image_scale' => array(
+        'data[width]' => 110,
+        'data[height]' => 111,
+        'data[upscale]' => 1,
+      ),
+      'image_scale_and_crop' => array(
+        'data[width]' => 120,
+        'data[height]' => 121,
+      ),
+      'image_crop' => array(
+        'data[width]' => 130,
+        'data[height]' => 131,
+        'data[anchor]' => 'center-center',
+      ),
+      'image_desaturate' => array(
+        // No options for desaturate.
+      ),
+      'image_rotate' => array(
+        'data[degrees]' => 5,
+        'data[random]' => 1,
+        'data[bgcolor]' => '#FFFF00',
+      ),
+    );
+
+    // Add style form.
+
+    $edit = array(
+      'name' => $style_name,
+      'label' => $style_label,
+    );
+    $this->drupalPost('admin/config/media/image-styles/add', $edit, t('Create new style'));
+    $this->assertRaw(t('Style %name was created.', array('%name' => $style_label)), 'Image style successfully created.');
+
+    // Add effect form.
+
+    // Add each sample effect to the style.
+    foreach ($effect_edits as $effect => $edit) {
+      // Add the effect.
+      $this->drupalPost($style_path, array('new' => $effect), t('Add'));
+      if (!empty($edit)) {
+        $this->drupalPost(NULL, $edit, t('Add effect'));
+      }
+    }
+
+    // Edit effect form.
+
+    // Revisit each form to make sure the effect was saved.
+    drupal_static_reset('image_styles');
+    $style = image_style_load($style_name);
+
+    foreach ($style['effects'] as $ieid => $effect) {
+      $this->drupalGet($style_path . '/effects/' . $ieid);
+      foreach ($effect_edits[$effect['name']] as $field => $value) {
+        $this->assertFieldByName($field, $value, format_string('The %field field in the %effect effect has the correct value of %value.', array('%field' => $field, '%effect' => $effect['name'], '%value' => $value)));
+      }
+    }
+
+    // Image style overview form (ordering and renaming).
+
+    // Confirm the order of effects is maintained according to the order we
+    // added the fields.
+    $effect_edits_order = array_keys($effect_edits);
+    $effects_order = array_values($style['effects']);
+    $order_correct = TRUE;
+    foreach ($effects_order as $index => $effect) {
+      if ($effect_edits_order[$index] != $effect['name']) {
+        $order_correct = FALSE;
+      }
+    }
+    $this->assertTrue($order_correct, 'The order of the effects is correctly set by default.');
+
+    // Test the style overview form.
+    // Change the name of the style and adjust the weights of effects.
+    $style_name = strtolower($this->randomName(10));
+    $style_label = $this->randomString();
+    $weight = count($effect_edits);
+    $edit = array(
+      'name' => $style_name,
+      'label' => $style_label,
+    );
+    foreach ($style['effects'] as $ieid => $effect) {
+      $edit['effects[' . $ieid . '][weight]'] = $weight;
+      $weight--;
+    }
+
+    // Create an image to make sure it gets flushed after saving.
+    $image_path = $this->createSampleImage($style);
+    $this->assertEqual($this->getImageCount($style), 1, format_string('Image style %style image %file successfully generated.', array('%style' => $style['label'], '%file' => $image_path)));
+
+    $this->drupalPost($style_path, $edit, t('Update style'));
+
+    // Note that after changing the style name, the style path is changed.
+    $style_path = 'admin/config/media/image-styles/edit/' . $style_name;
+
+    // Check that the URL was updated.
+    $this->drupalGet($style_path);
+    $this->assertResponse(200, format_string('Image style %original renamed to %new', array('%original' => $style['label'], '%new' => $style_label)));
+
+    // Check that the image was flushed after updating the style.
+    // This is especially important when renaming the style. Make sure that
+    // the old image directory has been deleted.
+    $this->assertEqual($this->getImageCount($style), 0, format_string('Image style %style was flushed after renaming the style and updating the order of effects.', array('%style' => $style['label'])));
+
+    // Load the style by the new name with the new weights.
+    drupal_static_reset('image_styles');
+    $style = image_style_load($style_name, NULL);
+
+    // Confirm the new style order was saved.
+    $effect_edits_order = array_reverse($effect_edits_order);
+    $effects_order = array_values($style['effects']);
+    $order_correct = TRUE;
+    foreach ($effects_order as $index => $effect) {
+      if ($effect_edits_order[$index] != $effect['name']) {
+        $order_correct = FALSE;
+      }
+    }
+    $this->assertTrue($order_correct, 'The order of the effects is correctly set by default.');
+
+    // Image effect deletion form.
+
+    // Create an image to make sure it gets flushed after deleting an effect.
+    $image_path = $this->createSampleImage($style);
+    $this->assertEqual($this->getImageCount($style), 1, format_string('Image style %style image %file successfully generated.', array('%style' => $style['label'], '%file' => $image_path)));
+
+    // Test effect deletion form.
+    $effect = array_pop($style['effects']);
+    $this->drupalPost($style_path . '/effects/' . $effect['ieid'] . '/delete', array(), t('Delete'));
+    $this->assertRaw(t('The image effect %name has been deleted.', array('%name' => $effect['label'])), 'Image effect deleted.');
+
+    // Style deletion form.
+
+    // Delete the style.
+    $this->drupalPost('admin/config/media/image-styles/delete/' . $style_name, array(), t('Delete'));
+
+    // Confirm the style directory has been removed.
+    $directory = file_default_scheme() . '://styles/' . $style_name;
+    $this->assertFalse(is_dir($directory), format_string('Image style %style directory removed on style deletion.', array('%style' => $style['label'])));
+
+    drupal_static_reset('image_styles');
+    $this->assertFalse(image_style_load($style_name), format_string('Image style %style successfully deleted.', array('%style' => $style['label'])));
+
+  }
+
+  /**
+   * Test to override, edit, then revert a style.
+   */
+  function testDefaultStyle() {
+    // Setup a style to be created and effects to add to it.
+    $style_name = 'thumbnail';
+    $style_label = 'Thumbnail (100x100)';
+    $edit_path = 'admin/config/media/image-styles/edit/' . $style_name;
+    $delete_path = 'admin/config/media/image-styles/delete/' . $style_name;
+    $revert_path = 'admin/config/media/image-styles/revert/' . $style_name;
+
+    // Ensure deleting a default is not possible.
+    $this->drupalGet($delete_path);
+    $this->assertText(t('Page not found'), 'Default styles may not be deleted.');
+
+    // Ensure that editing a default is not possible (without overriding).
+    $this->drupalGet($edit_path);
+    $disabled_field = $this->xpath('//input[@id=:id and @disabled="disabled"]', array(':id' => 'edit-name'));
+    $this->assertTrue($disabled_field, 'Default styles may not be renamed.');
+    $this->assertNoField('edit-submit', 'Default styles may not be edited.');
+    $this->assertNoField('edit-add', 'Default styles may not have new effects added.');
+
+    // Create an image to make sure the default works before overriding.
+    drupal_static_reset('image_styles');
+    $style = image_style_load($style_name);
+    $image_path = $this->createSampleImage($style);
+    $this->assertEqual($this->getImageCount($style), 1, format_string('Image style %style image %file successfully generated.', array('%style' => $style['name'], '%file' => $image_path)));
+
+    // Verify that effects attached to a default style do not have an ieid key.
+    foreach ($style['effects'] as $effect) {
+      $this->assertFalse(isset($effect['ieid']), format_string('The %effect effect does not have an ieid.', array('%effect' => $effect['name'])));
+    }
+
+    // Override the default.
+    $this->drupalPost($edit_path, array(), t('Override defaults'));
+    $this->assertRaw(t('The %style style has been overridden, allowing you to change its settings.', array('%style' => $style_label)), 'Default image style may be overridden.');
+
+    // Add sample effect to the overridden style.
+    $this->drupalPost($edit_path, array('new' => 'image_desaturate'), t('Add'));
+    drupal_static_reset('image_styles');
+    $style = image_style_load($style_name);
+
+    // Verify that effects attached to the style have an ieid now.
+    foreach ($style['effects'] as $effect) {
+      $this->assertTrue(isset($effect['ieid']), format_string('The %effect effect has an ieid.', array('%effect' => $effect['name'])));
+    }
+
+    // The style should now have 2 effect, the original scale provided by core
+    // and the desaturate effect we added in the override.
+    $effects = array_values($style['effects']);
+    $this->assertEqual($effects[0]['name'], 'image_scale', 'The default effect still exists in the overridden style.');
+    $this->assertEqual($effects[1]['name'], 'image_desaturate', 'The added effect exists in the overridden style.');
+
+    // Check that we are able to rename an overridden style.
+    $this->drupalGet($edit_path);
+    $disabled_field = $this->xpath('//input[@id=:id and @disabled="disabled"]', array(':id' => 'edit-name'));
+    $this->assertFalse($disabled_field, 'Overridden styles may be renamed.');
+
+    // Create an image to ensure the override works properly.
+    $image_path = $this->createSampleImage($style);
+    $this->assertEqual($this->getImageCount($style), 1, format_string('Image style %style image %file successfully generated.', array('%style' => $style['label'], '%file' => $image_path)));
+
+    // Revert the image style.
+    $this->drupalPost($revert_path, array(), t('Revert'));
+    drupal_static_reset('image_styles');
+    $style = image_style_load($style_name);
+
+    // The style should now have the single effect for scale.
+    $effects = array_values($style['effects']);
+    $this->assertEqual($effects[0]['name'], 'image_scale', 'The default effect still exists in the reverted style.');
+    $this->assertFalse(array_key_exists(1, $effects), 'The added effect has been removed in the reverted style.');
+  }
+
+  /**
+   * Test deleting a style and choosing a replacement style.
+   */
+  function testStyleReplacement() {
+    // Create a new style.
+    $style_name = strtolower($this->randomName(10));
+    $style_label = $this->randomString();
+    image_style_save(array('name' => $style_name, 'label' => $style_label));
+    $style_path = 'admin/config/media/image-styles/edit/' . $style_name;
+
+    // Create an image field that uses the new style.
+    $field_name = strtolower($this->randomName(10));
+    $this->createImageField($field_name, 'article');
+    $instance = field_info_instance('node', $field_name, 'article');
+    $instance['display']['default']['type'] = 'image';
+    $instance['display']['default']['settings']['image_style'] = $style_name;
+    field_update_instance($instance);
+
+    // Create a new node with an image attached.
+    $test_image = current($this->drupalGetTestFiles('image'));
+    $nid = $this->uploadNodeImage($test_image, $field_name, 'article');
+    $node = node_load($nid);
+
+    // Test that image is displayed using newly created style.
+    $this->drupalGet('node/' . $nid);
+    $this->assertRaw(check_plain(image_style_url($style_name, $node->{$field_name}[LANGUAGE_NONE][0]['uri'])), format_string('Image displayed using style @style.', array('@style' => $style_name)));
+
+    // Rename the style and make sure the image field is updated.
+    $new_style_name = strtolower($this->randomName(10));
+    $new_style_label = $this->randomString();
+    $edit = array(
+      'name' => $new_style_name,
+      'label' => $new_style_label,
+    );
+    $this->drupalPost('admin/config/media/image-styles/edit/' . $style_name, $edit, t('Update style'));
+    $this->assertText(t('Changes to the style have been saved.'), format_string('Style %name was renamed to %new_name.', array('%name' => $style_name, '%new_name' => $new_style_name)));
+    $this->drupalGet('node/' . $nid);
+    $this->assertRaw(check_plain(image_style_url($new_style_name, $node->{$field_name}[LANGUAGE_NONE][0]['uri'])), format_string('Image displayed using style replacement style.'));
+
+    // Delete the style and choose a replacement style.
+    $edit = array(
+      'replacement' => 'thumbnail',
+    );
+    $this->drupalPost('admin/config/media/image-styles/delete/' . $new_style_name, $edit, t('Delete'));
+    $message = t('Style %name was deleted.', array('%name' => $new_style_label));
+    $this->assertRaw($message, $message);
+
+    $this->drupalGet('node/' . $nid);
+    $this->assertRaw(check_plain(image_style_url('thumbnail', $node->{$field_name}[LANGUAGE_NONE][0]['uri'])), format_string('Image displayed using style replacement style.'));
+  }
+}
+
+/**
+ * Test class to check that formatters and display settings are working.
+ */
+class ImageFieldDisplayTestCase extends ImageFieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Image field display tests',
+      'description' => 'Test the display of image fields.',
+      'group' => 'Image',
+    );
+  }
+
+  /**
+   * Test image formatters on node display for public files.
+   */
+  function testImageFieldFormattersPublic() {
+    $this->_testImageFieldFormatters('public');
+  }
+
+  /**
+   * Test image formatters on node display for private files.
+   */
+  function testImageFieldFormattersPrivate() {
+    // Remove access content permission from anonymous users.
+    user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array('access content' => FALSE));
+    $this->_testImageFieldFormatters('private');
+  }
+
+  /**
+   * Test image formatters on node display.
+   */
+  function _testImageFieldFormatters($scheme) {
+    $field_name = strtolower($this->randomName());
+    $this->createImageField($field_name, 'article', array('uri_scheme' => $scheme));
+    // Create a new node with an image attached.
+    $test_image = current($this->drupalGetTestFiles('image'));
+    $nid = $this->uploadNodeImage($test_image, $field_name, 'article');
+    $node = node_load($nid, NULL, TRUE);
+
+    // Test that the default formatter is being used.
+    $image_uri = $node->{$field_name}[LANGUAGE_NONE][0]['uri'];
+    $image_info = array(
+      'path' => $image_uri,
+      'width' => 40,
+      'height' => 20,
+    );
+    $default_output = theme('image', $image_info);
+    $this->assertRaw($default_output, 'Default formatter displaying correctly on full node view.');
+
+    // Test the image linked to file formatter.
+    $instance = field_info_instance('node', $field_name, 'article');
+    $instance['display']['default']['type'] = 'image';
+    $instance['display']['default']['settings']['image_link'] = 'file';
+    field_update_instance($instance);
+    $default_output = l(theme('image', $image_info), file_create_url($image_uri), array('html' => TRUE));
+    $this->drupalGet('node/' . $nid);
+    $this->assertRaw($default_output, 'Image linked to file formatter displaying correctly on full node view.');
+    // Verify that the image can be downloaded.
+    $this->assertEqual(file_get_contents($test_image->uri), $this->drupalGet(file_create_url($image_uri)), 'File was downloaded successfully.');
+    if ($scheme == 'private') {
+      // Only verify HTTP headers when using private scheme and the headers are
+      // sent by Drupal.
+      $this->assertEqual($this->drupalGetHeader('Content-Type'), 'image/png', 'Content-Type header was sent.');
+      $this->assertEqual($this->drupalGetHeader('Cache-Control'), 'private', 'Cache-Control header was sent.');
+
+      // Log out and try to access the file.
+      $this->drupalLogout();
+      $this->drupalGet(file_create_url($image_uri));
+      $this->assertResponse('403', 'Access denied to original image as anonymous user.');
+
+      // Log in again.
+      $this->drupalLogin($this->admin_user);
+    }
+
+    // Test the image linked to content formatter.
+    $instance['display']['default']['settings']['image_link'] = 'content';
+    field_update_instance($instance);
+    $default_output = l(theme('image', $image_info), 'node/' . $nid, array('html' => TRUE, 'attributes' => array('class' => 'active')));
+    $this->drupalGet('node/' . $nid);
+    $this->assertRaw($default_output, 'Image linked to content formatter displaying correctly on full node view.');
+
+    // Test the image style 'thumbnail' formatter.
+    $instance['display']['default']['settings']['image_link'] = '';
+    $instance['display']['default']['settings']['image_style'] = 'thumbnail';
+    field_update_instance($instance);
+    // Ensure the derivative image is generated so we do not have to deal with
+    // image style callback paths.
+    $this->drupalGet(image_style_url('thumbnail', $image_uri));
+    // Need to create the URL again since it will change if clean URLs
+    // are disabled.
+    $image_info['path'] = image_style_url('thumbnail', $image_uri);
+    $image_info['width'] = 100;
+    $image_info['height'] = 50;
+    $default_output = theme('image', $image_info);
+    $this->drupalGet('node/' . $nid);
+    $this->assertRaw($default_output, 'Image style thumbnail formatter displaying correctly on full node view.');
+
+    if ($scheme == 'private') {
+      // Log out and try to access the file.
+      $this->drupalLogout();
+      $this->drupalGet(image_style_url('thumbnail', $image_uri));
+      $this->assertResponse('403', 'Access denied to image style thumbnail as anonymous user.');
+    }
+  }
+
+  /**
+   * Tests for image field settings.
+   */
+  function testImageFieldSettings() {
+    $test_image = current($this->drupalGetTestFiles('image'));
+    list(, $test_image_extension) = explode('.', $test_image->filename);
+    $field_name = strtolower($this->randomName());
+    $instance_settings = array(
+      'alt_field' => 1,
+      'file_extensions' => $test_image_extension,
+      'max_filesize' => '50 KB',
+      'max_resolution' => '100x100',
+      'min_resolution' => '10x10',
+      'title_field' => 1,
+    );
+    $widget_settings = array(
+      'preview_image_style' => 'medium',
+    );
+    $field = $this->createImageField($field_name, 'article', array(), $instance_settings, $widget_settings);
+    $field['deleted'] = 0;
+    $table = _field_sql_storage_tablename($field);
+    $schema = drupal_get_schema($table, TRUE);
+    $instance = field_info_instance('node', $field_name, 'article');
+
+    $this->drupalGet('node/add/article');
+    $this->assertText(t('Files must be less than 50 KB.'), 'Image widget max file size is displayed on article form.');
+    $this->assertText(t('Allowed file types: ' . $test_image_extension . '.'), 'Image widget allowed file types displayed on article form.');
+    $this->assertText(t('Images must be between 10x10 and 100x100 pixels.'), 'Image widget allowed resolution displayed on article form.');
+
+    // We have to create the article first and then edit it because the alt
+    // and title fields do not display until the image has been attached.
+    $nid = $this->uploadNodeImage($test_image, $field_name, 'article');
+    $this->drupalGet('node/' . $nid . '/edit');
+    $this->assertFieldByName($field_name . '[' . LANGUAGE_NONE . '][0][alt]', '', 'Alt field displayed on article form.');
+    $this->assertFieldByName($field_name . '[' . LANGUAGE_NONE . '][0][title]', '', 'Title field displayed on article form.');
+    // Verify that the attached image is being previewed using the 'medium'
+    // style.
+    $node = node_load($nid, NULL, TRUE);
+    $image_info = array(
+      'path' => image_style_url('medium', $node->{$field_name}[LANGUAGE_NONE][0]['uri']),
+      'width' => 220,
+      'height' => 110,
+    );
+    $default_output = theme('image', $image_info);
+    $this->assertRaw($default_output, "Preview image is displayed using 'medium' style.");
+
+    // Add alt/title fields to the image and verify that they are displayed.
+    $image_info = array(
+      'path' => $node->{$field_name}[LANGUAGE_NONE][0]['uri'],
+      'alt' => $this->randomName(),
+      'title' => $this->randomName(),
+      'width' => 40,
+      'height' => 20,
+    );
+    $edit = array(
+      $field_name . '[' . LANGUAGE_NONE . '][0][alt]' => $image_info['alt'],
+      $field_name . '[' . LANGUAGE_NONE . '][0][title]' => $image_info['title'],
+    );
+    $this->drupalPost('node/' . $nid . '/edit', $edit, t('Save'));
+    $default_output = theme('image', $image_info);
+    $this->assertRaw($default_output, 'Image displayed using user supplied alt and title attributes.');
+
+    // Verify that alt/title longer than allowed results in a validation error.
+    $test_size = 2000;
+    $edit = array(
+      $field_name . '[' . LANGUAGE_NONE . '][0][alt]' => $this->randomName($test_size),
+      $field_name . '[' . LANGUAGE_NONE . '][0][title]' => $this->randomName($test_size),
+    );
+    $this->drupalPost('node/' . $nid . '/edit', $edit, t('Save'));
+    $this->assertRaw(t('Alternate text cannot be longer than %max characters but is currently %length characters long.', array(
+      '%max' => $schema['fields'][$field_name .'_alt']['length'],
+      '%length' => $test_size,
+    )));
+    $this->assertRaw(t('Title cannot be longer than %max characters but is currently %length characters long.', array(
+      '%max' => $schema['fields'][$field_name .'_title']['length'],
+      '%length' => $test_size,
+    )));
+  }
+
+  /**
+   * Test passing attributes into the image field formatters.
+   */
+  function testImageFieldFormatterAttributes() {
+    $image = theme('image_formatter', array(
+      'item' => array(
+        'uri' => 'http://example.com/example.png',
+        'attributes' => array(
+          'data-image-field-formatter' => 'testFound',
+        ),
+        'alt' => t('Image field formatter attribute test.'),
+        'title' => t('Image field formatter'),
+      ),
+    ));
+    $this->assertTrue(stripos($image, 'testFound') > 0, 'Image field formatters can have attributes.');
+  }
+
+  /**
+   * Test use of a default image with an image field.
+   */
+  function testImageFieldDefaultImage() {
+    // Create a new image field.
+    $field_name = strtolower($this->randomName());
+    $this->createImageField($field_name, 'article');
+
+    // Create a new node, with no images and verify that no images are
+    // displayed.
+    $node = $this->drupalCreateNode(array('type' => 'article'));
+    $this->drupalGet('node/' . $node->nid);
+    // Verify that no image is displayed on the page by checking for the class
+    // that would be used on the image field.
+    $this->assertNoPattern('<div class="(.*?)field-name-' . strtr($field_name, '_', '-') . '(.*?)">', 'No image displayed when no image is attached and no default image specified.');
+
+    // Add a default image to the public imagefield instance.
+    $images = $this->drupalGetTestFiles('image');
+    $edit = array(
+      'files[field_settings_default_image]' => drupal_realpath($images[0]->uri),
+    );
+    $this->drupalPost('admin/structure/types/manage/article/fields/' . $field_name, $edit, t('Save settings'));
+    // Clear field info cache so the new default image is detected.
+    field_info_cache_clear();
+    $field = field_info_field($field_name);
+    $image = file_load($field['settings']['default_image']);
+    $this->assertTrue($image->status == FILE_STATUS_PERMANENT, 'The default image status is permanent.');
+    $default_output = theme('image', array('path' => $image->uri));
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw($default_output, 'Default image displayed when no user supplied image is present.');
+
+    // Create a node with an image attached and ensure that the default image
+    // is not displayed.
+    $nid = $this->uploadNodeImage($images[1], $field_name, 'article');
+    $node = node_load($nid, NULL, TRUE);
+    $image_info = array(
+      'path' => $node->{$field_name}[LANGUAGE_NONE][0]['uri'],
+      'width' => 40,
+      'height' => 20,
+    );
+    $image_output = theme('image', $image_info);
+    $this->drupalGet('node/' . $nid);
+    $this->assertNoRaw($default_output, 'Default image is not displayed when user supplied image is present.');
+    $this->assertRaw($image_output, 'User supplied image is displayed.');
+
+    // Remove default image from the field and make sure it is no longer used.
+    $edit = array(
+      'field[settings][default_image][fid]' => 0,
+    );
+    $this->drupalPost('admin/structure/types/manage/article/fields/' . $field_name, $edit, t('Save settings'));
+    // Clear field info cache so the new default image is detected.
+    field_info_cache_clear();
+    $field = field_info_field($field_name);
+    $this->assertFalse($field['settings']['default_image'], 'Default image removed from field.');
+    // Create an image field that uses the private:// scheme and test that the
+    // default image works as expected.
+    $private_field_name = strtolower($this->randomName());
+    $this->createImageField($private_field_name, 'article', array('uri_scheme' => 'private'));
+    // Add a default image to the new field.
+    $edit = array(
+      'files[field_settings_default_image]' => drupal_realpath($images[1]->uri),
+    );
+    $this->drupalPost('admin/structure/types/manage/article/fields/' . $private_field_name, $edit, t('Save settings'));
+    $private_field = field_info_field($private_field_name);
+    $image = file_load($private_field['settings']['default_image']);
+    $this->assertEqual('private', file_uri_scheme($image->uri), 'Default image uses private:// scheme.');
+    $this->assertTrue($image->status == FILE_STATUS_PERMANENT, 'The default image status is permanent.');
+    // Create a new node with no image attached and ensure that default private
+    // image is displayed.
+    $node = $this->drupalCreateNode(array('type' => 'article'));
+    $default_output = theme('image', array('path' => $image->uri));
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw($default_output, 'Default private image displayed when no user supplied image is present.');
+  }
+}
+
+/**
+ * Test class to check for various validations.
+ */
+class ImageFieldValidateTestCase extends ImageFieldTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Image field validation tests',
+      'description' => 'Tests validation functions such as min/max resolution.',
+      'group' => 'Image',
+    );
+  }
+
+  /**
+   * Test min/max resolution settings.
+   */
+  function testResolution() {
+    $field_name = strtolower($this->randomName());
+    $min_resolution = 50;
+    $max_resolution = 100;
+    $instance_settings = array(
+      'max_resolution' => $max_resolution . 'x' . $max_resolution,
+      'min_resolution' => $min_resolution . 'x' . $min_resolution,
+    );
+    $this->createImageField($field_name, 'article', array(), $instance_settings);
+
+    // We want a test image that is too small, and a test image that is too
+    // big, so cycle through test image files until we have what we need.
+    $image_that_is_too_big = FALSE;
+    $image_that_is_too_small = FALSE;
+    foreach ($this->drupalGetTestFiles('image') as $image) {
+      $info = image_get_info($image->uri);
+      if ($info['width'] > $max_resolution) {
+        $image_that_is_too_big = $image;
+      }
+      if ($info['width'] < $min_resolution) {
+        $image_that_is_too_small = $image;
+      }
+      if ($image_that_is_too_small && $image_that_is_too_big) {
+        break;
+      }
+    }
+    $nid = $this->uploadNodeImage($image_that_is_too_small, $field_name, 'article');
+    $this->assertText(t('The specified file ' . $image_that_is_too_small->filename . ' could not be uploaded. The image is too small; the minimum dimensions are 50x50 pixels.'), 'Node save failed when minimum image resolution was not met.');
+    $nid = $this->uploadNodeImage($image_that_is_too_big, $field_name, 'article');
+    $this->assertText(t('The image was resized to fit within the maximum allowed dimensions of 100x100 pixels.'), 'Image exceeding max resolution was properly resized.');
+  }
+}
+
+/**
+ * Tests that images have correct dimensions when styled.
+ */
+class ImageDimensionsTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Image dimensions',
+      'description' => 'Tests that images have correct dimensions when styled.',
+      'group' => 'Image',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('image_module_test');
+  }
+
+  /**
+   * Test styled image dimensions cumulatively.
+   */
+  function testImageDimensions() {
+    // Create a working copy of the file.
+    $files = $this->drupalGetTestFiles('image');
+    $file = reset($files);
+    $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME);
+
+    // Create a style.
+    $style = image_style_save(array('name' => 'test', 'label' => 'Test'));
+    $generated_uri = 'public://styles/test/public/'. drupal_basename($original_uri);
+    $url = image_style_url('test', $original_uri);
+
+    $variables = array(
+      'style_name' => 'test',
+      'path' => $original_uri,
+      'width' => 40,
+      'height' => 20,
+    );
+
+    // Scale an image that is wider than it is high.
+    $effect = array(
+      'name' => 'image_scale',
+      'data' => array(
+        'width' => 120,
+        'height' => 90,
+        'upscale' => TRUE,
+      ),
+      'isid' => $style['isid'],
+    );
+
+    image_effect_save($effect);
+    $img_tag = theme_image_style($variables);
+    $this->assertEqual($img_tag, '<img typeof="foaf:Image" src="' . check_plain($url) . '" width="120" height="60" alt="" />', 'Expected img tag was found.');
+    $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
+    $this->drupalGet($url);
+    $this->assertResponse(200, 'Image was generated at the URL.');
+    $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
+    $image_info = image_get_info($generated_uri);
+    $this->assertEqual($image_info['width'], 120, 'Expected width was found.');
+    $this->assertEqual($image_info['height'], 60, 'Expected height was found.');
+
+    // Rotate 90 degrees anticlockwise.
+    $effect = array(
+      'name' => 'image_rotate',
+      'data' => array(
+        'degrees' => -90,
+        'random' => FALSE,
+      ),
+      'isid' => $style['isid'],
+    );
+
+    image_effect_save($effect);
+    $img_tag = theme_image_style($variables);
+    $this->assertEqual($img_tag, '<img typeof="foaf:Image" src="' . check_plain($url) . '" width="60" height="120" alt="" />', 'Expected img tag was found.');
+    $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
+    $this->drupalGet($url);
+    $this->assertResponse(200, 'Image was generated at the URL.');
+    $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
+    $image_info = image_get_info($generated_uri);
+    $this->assertEqual($image_info['width'], 60, 'Expected width was found.');
+    $this->assertEqual($image_info['height'], 120, 'Expected height was found.');
+
+    // Scale an image that is higher than it is wide (rotated by previous effect).
+    $effect = array(
+      'name' => 'image_scale',
+      'data' => array(
+        'width' => 120,
+        'height' => 90,
+        'upscale' => TRUE,
+      ),
+      'isid' => $style['isid'],
+    );
+
+    image_effect_save($effect);
+    $img_tag = theme_image_style($variables);
+    $this->assertEqual($img_tag, '<img typeof="foaf:Image" src="' . check_plain($url) . '" width="45" height="90" alt="" />', 'Expected img tag was found.');
+    $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
+    $this->drupalGet($url);
+    $this->assertResponse(200, 'Image was generated at the URL.');
+    $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
+    $image_info = image_get_info($generated_uri);
+    $this->assertEqual($image_info['width'], 45, 'Expected width was found.');
+    $this->assertEqual($image_info['height'], 90, 'Expected height was found.');
+
+    // Test upscale disabled.
+    $effect = array(
+      'name' => 'image_scale',
+      'data' => array(
+        'width' => 400,
+        'height' => 200,
+        'upscale' => FALSE,
+      ),
+      'isid' => $style['isid'],
+    );
+
+    image_effect_save($effect);
+    $img_tag = theme_image_style($variables);
+    $this->assertEqual($img_tag, '<img typeof="foaf:Image" src="' . check_plain($url) . '" width="45" height="90" alt="" />', 'Expected img tag was found.');
+    $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
+    $this->drupalGet($url);
+    $this->assertResponse(200, 'Image was generated at the URL.');
+    $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
+    $image_info = image_get_info($generated_uri);
+    $this->assertEqual($image_info['width'], 45, 'Expected width was found.');
+    $this->assertEqual($image_info['height'], 90, 'Expected height was found.');
+
+    // Add a desaturate effect.
+    $effect = array(
+      'name' => 'image_desaturate',
+      'data' => array(),
+      'isid' => $style['isid'],
+    );
+
+    image_effect_save($effect);
+    $img_tag = theme_image_style($variables);
+    $this->assertEqual($img_tag, '<img typeof="foaf:Image" src="' . check_plain($url) . '" width="45" height="90" alt="" />', 'Expected img tag was found.');
+    $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
+    $this->drupalGet($url);
+    $this->assertResponse(200, 'Image was generated at the URL.');
+    $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
+    $image_info = image_get_info($generated_uri);
+    $this->assertEqual($image_info['width'], 45, 'Expected width was found.');
+    $this->assertEqual($image_info['height'], 90, 'Expected height was found.');
+
+    // Add a random rotate effect.
+    $effect = array(
+      'name' => 'image_rotate',
+      'data' => array(
+        'degrees' => 180,
+        'random' => TRUE,
+      ),
+      'isid' => $style['isid'],
+    );
+
+    image_effect_save($effect);
+    $img_tag = theme_image_style($variables);
+    $this->assertEqual($img_tag, '<img typeof="foaf:Image" src="' . check_plain($url) . '" alt="" />', 'Expected img tag was found.');
+    $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
+    $this->drupalGet($url);
+    $this->assertResponse(200, 'Image was generated at the URL.');
+    $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
+
+
+    // Add a crop effect.
+    $effect = array(
+      'name' => 'image_crop',
+      'data' => array(
+        'width' => 30,
+        'height' => 30,
+        'anchor' => 'center-center',
+      ),
+      'isid' => $style['isid'],
+    );
+
+    image_effect_save($effect);
+    $img_tag = theme_image_style($variables);
+    $this->assertEqual($img_tag, '<img typeof="foaf:Image" src="' . check_plain($url) . '" width="30" height="30" alt="" />', 'Expected img tag was found.');
+    $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
+    $this->drupalGet($url);
+    $this->assertResponse(200, 'Image was generated at the URL.');
+    $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
+    $image_info = image_get_info($generated_uri);
+    $this->assertEqual($image_info['width'], 30, 'Expected width was found.');
+    $this->assertEqual($image_info['height'], 30, 'Expected height was found.');
+
+    // Rotate to a non-multiple of 90 degrees.
+    $effect = array(
+      'name' => 'image_rotate',
+      'data' => array(
+        'degrees' => 57,
+        'random' => FALSE,
+      ),
+      'isid' => $style['isid'],
+    );
+
+    $effect = image_effect_save($effect);
+    $img_tag = theme_image_style($variables);
+    $this->assertEqual($img_tag, '<img typeof="foaf:Image" src="' . check_plain($url) . '" alt="" />', 'Expected img tag was found.');
+    $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
+    $this->drupalGet($url);
+    $this->assertResponse(200, 'Image was generated at the URL.');
+    $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
+
+    image_effect_delete($effect);
+
+    // Ensure that an effect with no dimensions callback unsets the dimensions.
+    // This ensures compatibility with 7.0 contrib modules.
+    $effect = array(
+      'name' => 'image_module_test_null',
+      'data' => array(),
+      'isid' => $style['isid'],
+    );
+
+    image_effect_save($effect);
+    $img_tag = theme_image_style($variables);
+    $this->assertEqual($img_tag, '<img typeof="foaf:Image" src="' . check_plain($url) . '" alt="" />', 'Expected img tag was found.');
+  }
+}
+
+/**
+ * Tests image_dimensions_scale().
+ */
+class ImageDimensionsScaleTestCase extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'image_dimensions_scale()',
+      'description' => 'Tests all control flow branches in image_dimensions_scale().',
+      'group' => 'Image',
+    );
+  }
+
+  /**
+   * Tests all control flow branches in image_dimensions_scale().
+   */
+  function testImageDimensionsScale() {
+    // Define input / output datasets to test different branch conditions.
+    $test = array();
+
+    // Test branch conditions:
+    // - No height.
+    // - Upscale, don't need to upscale.
+    $tests[] = array(
+      'input' => array(
+        'dimensions' => array(
+          'width' => 1000,
+          'height' => 2000,
+        ),
+        'width' => 200,
+        'height' => NULL,
+        'upscale' => TRUE,
+      ),
+      'output' => array(
+        'dimensions' => array(
+          'width' => 200,
+          'height' => 400,
+        ),
+        'return_value' => TRUE,
+      ),
+    );
+
+    // Test branch conditions:
+    // - No width.
+    // - Don't upscale, don't need to upscale.
+    $tests[] = array(
+      'input' => array(
+        'dimensions' => array(
+          'width' => 1000,
+          'height' => 800,
+        ),
+        'width' => NULL,
+        'height' => 140,
+        'upscale' => FALSE,
+      ),
+      'output' => array(
+        'dimensions' => array(
+          'width' => 175,
+          'height' => 140,
+        ),
+        'return_value' => TRUE,
+      ),
+    );
+
+    // Test branch conditions:
+    // - Source aspect ratio greater than target.
+    // - Upscale, need to upscale.
+    $tests[] = array(
+      'input' => array(
+        'dimensions' => array(
+          'width' => 8,
+          'height' => 20,
+        ),
+        'width' => 200,
+        'height' => 140,
+        'upscale' => TRUE,
+      ),
+      'output' => array(
+        'dimensions' => array(
+          'width' => 56,
+          'height' => 140,
+        ),
+        'return_value' => TRUE,
+      ),
+    );
+
+    // Test branch condition: target aspect ratio greater than source.
+    $tests[] = array(
+      'input' => array(
+        'dimensions' => array(
+          'width' => 2000,
+          'height' => 800,
+        ),
+        'width' => 200,
+        'height' => 140,
+        'upscale' => FALSE,
+      ),
+      'output' => array(
+        'dimensions' => array(
+          'width' => 200,
+          'height' => 80,
+        ),
+        'return_value' => TRUE,
+      ),
+    );
+
+    // Test branch condition: don't upscale, need to upscale.
+    $tests[] = array(
+      'input' => array(
+        'dimensions' => array(
+          'width' => 100,
+          'height' => 50,
+        ),
+        'width' => 200,
+        'height' => 140,
+        'upscale' => FALSE,
+      ),
+      'output' => array(
+        'dimensions' => array(
+          'width' => 100,
+          'height' => 50,
+        ),
+        'return_value' => FALSE,
+      ),
+    );
+
+    foreach ($tests as $test) {
+      // Process the test dataset.
+      $return_value = image_dimensions_scale($test['input']['dimensions'], $test['input']['width'], $test['input']['height'], $test['input']['upscale']);
+
+      // Check the width.
+      $this->assertEqual($test['output']['dimensions']['width'], $test['input']['dimensions']['width'], format_string('Computed width (@computed_width) equals expected width (@expected_width)', array('@computed_width' => $test['output']['dimensions']['width'], '@expected_width' => $test['input']['dimensions']['width'])));
+
+      // Check the height.
+      $this->assertEqual($test['output']['dimensions']['height'], $test['input']['dimensions']['height'], format_string('Computed height (@computed_height) equals expected height (@expected_height)', array('@computed_height' => $test['output']['dimensions']['height'], '@expected_height' => $test['input']['dimensions']['height'])));
+
+      // Check the return value.
+      $this->assertEqual($test['output']['return_value'], $return_value, 'Correct return value.');
+    }
+  }
+}
+
+/**
+ * Tests default image settings.
+ */
+class ImageFieldDefaultImagesTestCase extends ImageFieldTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Image field default images tests',
+      'description' => 'Tests setting up default images both to the field and field instance.',
+      'group' => 'Image',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('field_ui'));
+  }
+
+  /**
+   * Tests CRUD for fields and fields instances with default images.
+   */
+  function testDefaultImages() {
+    // Create files to use as the default images.
+    $files = $this->drupalGetTestFiles('image');
+    $default_images = array();
+    foreach (array('field', 'instance', 'instance2', 'field_new', 'instance_new') as $image_target) {
+      $file = array_pop($files);
+      $file = file_save($file);
+      $default_images[$image_target] = $file;
+    }
+
+    // Create an image field and add an instance to the article content type.
+    $field_name = strtolower($this->randomName());
+    $field_settings = array(
+      'default_image' => $default_images['field']->fid,
+    );
+    $instance_settings = array(
+      'default_image' => $default_images['instance']->fid,
+    );
+    $widget_settings = array(
+      'preview_image_style' => 'medium',
+    );
+    $this->createImageField($field_name, 'article', $field_settings, $instance_settings, $widget_settings);
+    $field = field_info_field($field_name);
+    $instance = field_info_instance('node', $field_name, 'article');
+
+    // Add another instance with another default image to the page content type.
+    $instance2 = array_merge($instance, array(
+      'bundle' => 'page',
+      'settings' => array(
+        'default_image' => $default_images['instance2']->fid,
+      ),
+    ));
+    field_create_instance($instance2);
+    $instance2 = field_info_instance('node', $field_name, 'page');
+
+
+    // Confirm the defaults are present on the article field admin form.
+    $this->drupalGet("admin/structure/types/manage/article/fields/$field_name");
+    $this->assertFieldByXpath(
+      '//input[@name="field[settings][default_image][fid]"]',
+      $default_images['field']->fid,
+      format_string(
+        'Article image field default equals expected file ID of @fid.',
+        array('@fid' => $default_images['field']->fid)
+      )
+    );
+    $this->assertFieldByXpath(
+      '//input[@name="instance[settings][default_image][fid]"]',
+      $default_images['instance']->fid,
+      format_string(
+        'Article image field instance default equals expected file ID of @fid.',
+        array('@fid' => $default_images['instance']->fid)
+      )
+    );
+
+    // Confirm the defaults are present on the page field admin form.
+    $this->drupalGet("admin/structure/types/manage/page/fields/$field_name");
+    $this->assertFieldByXpath(
+      '//input[@name="field[settings][default_image][fid]"]',
+      $default_images['field']->fid,
+      format_string(
+        'Page image field default equals expected file ID of @fid.',
+        array('@fid' => $default_images['field']->fid)
+      )
+    );
+    $this->assertFieldByXpath(
+      '//input[@name="instance[settings][default_image][fid]"]',
+      $default_images['instance2']->fid,
+      format_string(
+        'Page image field instance default equals expected file ID of @fid.',
+        array('@fid' => $default_images['instance2']->fid)
+      )
+    );
+
+    // Confirm that the image default is shown for a new article node.
+    $article = $this->drupalCreateNode(array('type' => 'article'));
+    $article_built = node_view($article);
+    $this->assertEqual(
+      $article_built[$field_name]['#items'][0]['fid'],
+      $default_images['instance']->fid,
+      format_string(
+        'A new article node without an image has the expected default image file ID of @fid.',
+        array('@fid' => $default_images['instance']->fid)
+      )
+    );
+
+    // Confirm that the image default is shown for a new page node.
+    $page = $this->drupalCreateNode(array('type' => 'page'));
+    $page_built = node_view($page);
+    $this->assertEqual(
+      $page_built[$field_name]['#items'][0]['fid'],
+      $default_images['instance2']->fid,
+      format_string(
+        'A new page node without an image has the expected default image file ID of @fid.',
+        array('@fid' => $default_images['instance2']->fid)
+      )
+    );
+
+    // Upload a new default for the field.
+    $field['settings']['default_image'] = $default_images['field_new']->fid;
+    field_update_field($field);
+
+    // Confirm that the new field default is used on the article admin form.
+    $this->drupalGet("admin/structure/types/manage/article/fields/$field_name");
+    $this->assertFieldByXpath(
+      '//input[@name="field[settings][default_image][fid]"]',
+      $default_images['field_new']->fid,
+      format_string(
+        'Updated image field default equals expected file ID of @fid.',
+        array('@fid' => $default_images['field_new']->fid)
+      )
+    );
+
+    // Reload the nodes and confirm the field instance defaults are used.
+    $article_built = node_view($article = node_load($article->nid, NULL, $reset = TRUE));
+    $page_built = node_view($page = node_load($page->nid, NULL, $reset = TRUE));
+    $this->assertEqual(
+      $article_built[$field_name]['#items'][0]['fid'],
+      $default_images['instance']->fid,
+      format_string(
+        'An existing article node without an image has the expected default image file ID of @fid.',
+        array('@fid' => $default_images['instance']->fid)
+      )
+    );
+    $this->assertEqual(
+      $page_built[$field_name]['#items'][0]['fid'],
+      $default_images['instance2']->fid,
+      format_string(
+        'An existing page node without an image has the expected default image file ID of @fid.',
+        array('@fid' => $default_images['instance2']->fid)
+      )
+    );
+
+    // Upload a new default for the article's field instance.
+    $instance['settings']['default_image'] = $default_images['instance_new']->fid;
+    field_update_instance($instance);
+
+    // Confirm the new field instance default is used on the article field
+    // admin form.
+    $this->drupalGet("admin/structure/types/manage/article/fields/$field_name");
+    $this->assertFieldByXpath(
+      '//input[@name="instance[settings][default_image][fid]"]',
+      $default_images['instance_new']->fid,
+      format_string(
+        'Updated article image field instance default equals expected file ID of @fid.',
+        array('@fid' => $default_images['instance_new']->fid)
+      )
+    );
+
+    // Reload the nodes.
+    $article_built = node_view($article = node_load($article->nid, NULL, $reset = TRUE));
+    $page_built = node_view($page = node_load($page->nid, NULL, $reset = TRUE));
+
+    // Confirm the article uses the new default.
+    $this->assertEqual(
+      $article_built[$field_name]['#items'][0]['fid'],
+      $default_images['instance_new']->fid,
+      format_string(
+        'An existing article node without an image has the expected default image file ID of @fid.',
+        array('@fid' => $default_images['instance_new']->fid)
+      )
+    );
+    // Confirm the page remains unchanged.
+    $this->assertEqual(
+      $page_built[$field_name]['#items'][0]['fid'],
+      $default_images['instance2']->fid,
+      format_string(
+        'An existing page node without an image has the expected default image file ID of @fid.',
+        array('@fid' => $default_images['instance2']->fid)
+      )
+    );
+
+    // Remove the instance default from articles.
+    $instance['settings']['default_image'] = NULL;
+    field_update_instance($instance);
+
+    // Confirm the article field instance default has been removed.
+    $this->drupalGet("admin/structure/types/manage/article/fields/$field_name");
+    $this->assertFieldByXpath(
+      '//input[@name="instance[settings][default_image][fid]"]',
+      '',
+      'Updated article image field instance default has been successfully removed.'
+    );
+
+    // Reload the nodes.
+    $article_built = node_view($article = node_load($article->nid, NULL, $reset = TRUE));
+    $page_built = node_view($page = node_load($page->nid, NULL, $reset = TRUE));
+    // Confirm the article uses the new field (not instance) default.
+    $this->assertEqual(
+      $article_built[$field_name]['#items'][0]['fid'],
+      $default_images['field_new']->fid,
+      format_string(
+        'An existing article node without an image has the expected default image file ID of @fid.',
+        array('@fid' => $default_images['field_new']->fid)
+      )
+    );
+    // Confirm the page remains unchanged.
+    $this->assertEqual(
+      $page_built[$field_name]['#items'][0]['fid'],
+      $default_images['instance2']->fid,
+      format_string(
+        'An existing page node without an image has the expected default image file ID of @fid.',
+        array('@fid' => $default_images['instance2']->fid)
+      )
+    );
+  }
+
+}
+
+/**
+ * Tests image theme functions.
+ */
+class ImageThemeFunctionWebTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Image theme functions',
+      'description' => 'Test that the image theme functions work correctly.',
+      'group' => 'Image',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('image'));
+  }
+
+  /**
+   * Tests usage of the image field formatters.
+   */
+  function testImageFormatterTheme() {
+    // Create an image.
+    $files = $this->drupalGetTestFiles('image');
+    $file = reset($files);
+    $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME);
+
+    // Create a style.
+    image_style_save(array('name' => 'test', 'label' => 'Test'));
+    $url = image_style_url('test', $original_uri);
+
+    // Test using theme_image_formatter() without an image title, alt text, or
+    // link options.
+    $path = $this->randomName();
+    $element = array(
+      '#theme' => 'image_formatter',
+      '#image_style' => 'test',
+      '#item' => array(
+        'uri' => $original_uri,
+      ),
+      '#path' => array(
+        'path' => $path,
+      ),
+    );
+    $rendered_element = render($element);
+    $expected_result = '<a href="' . url($path) . '"><img typeof="foaf:Image" src="' . check_plain($url) . '" alt="" /></a>';
+    $this->assertEqual($expected_result, $rendered_element, 'theme_image_formatter() correctly renders without title, alt, or path options.');
+
+    // Link the image to a fragment on the page, and not a full URL.
+    $fragment = $this->randomName();
+    $element['#path']['path'] = '';
+    $element['#path']['options'] = array(
+      'external' => TRUE,
+      'fragment' => $fragment,
+    );
+    $rendered_element = render($element);
+    $expected_result = '<a href="#' . $fragment . '"><img typeof="foaf:Image" src="' . check_plain($url) . '" alt="" /></a>';
+    $this->assertEqual($expected_result, $rendered_element, 'theme_image_formatter() correctly renders a link fragment.');
+  }
+
+}
+
+/**
+ * Tests flushing of image styles.
+ */
+class ImageStyleFlushTest extends ImageFieldTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Image style flushing',
+      'description' => 'Tests flushing of image styles.',
+      'group' => 'Image',
+    );
+  }
+
+  /**
+   * Given an image style and a wrapper, generate an image.
+   */
+  function createSampleImage($style, $wrapper) {
+    static $file;
+
+    if (!isset($file)) {
+      $files = $this->drupalGetTestFiles('image');
+      $file = reset($files);
+    }
+
+    // Make sure we have an image in our wrapper testing file directory.
+    $source_uri = file_unmanaged_copy($file->uri, $wrapper . '://');
+    // Build the derivative image.
+    $derivative_uri = image_style_path($style['name'], $source_uri);
+    $derivative = image_style_create_derivative($style, $source_uri, $derivative_uri);
+
+    return $derivative ? $derivative_uri : FALSE;
+  }
+
+  /**
+   * Count the number of images currently created for a style in a wrapper.
+   */
+  function getImageCount($style, $wrapper) {
+    return count(file_scan_directory($wrapper . '://styles/' . $style['name'], '/.*/'));
+  }
+
+  /**
+   * General test to flush a style.
+   */
+  function testFlush() {
+
+    // Setup a style to be created and effects to add to it.
+    $style_name = strtolower($this->randomName(10));
+    $style_label = $this->randomString();
+    $style_path = 'admin/config/media/image-styles/edit/' . $style_name;
+    $effect_edits = array(
+      'image_resize' => array(
+        'data[width]' => 100,
+        'data[height]' => 101,
+      ),
+      'image_scale' => array(
+        'data[width]' => 110,
+        'data[height]' => 111,
+        'data[upscale]' => 1,
+      ),
+    );
+
+    // Add style form.
+    $edit = array(
+      'name' => $style_name,
+      'label' => $style_label,
+    );
+    $this->drupalPost('admin/config/media/image-styles/add', $edit, t('Create new style'));
+    // Add each sample effect to the style.
+    foreach ($effect_edits as $effect => $edit) {
+      // Add the effect.
+      $this->drupalPost($style_path, array('new' => $effect), t('Add'));
+      if (!empty($edit)) {
+        $this->drupalPost(NULL, $edit, t('Add effect'));
+      }
+    }
+
+    // Load the saved image style.
+    $style = image_style_load($style_name);
+
+    // Create an image for the 'public' wrapper.
+    $image_path = $this->createSampleImage($style, 'public');
+    // Expecting to find 2 images, one is the sample.png image shown in
+    // image style preview.
+    $this->assertEqual($this->getImageCount($style, 'public'), 2, format_string('Image style %style image %file successfully generated.', array('%style' => $style['name'], '%file' => $image_path)));
+
+    // Create an image for the 'private' wrapper.
+    $image_path = $this->createSampleImage($style, 'private');
+    $this->assertEqual($this->getImageCount($style, 'private'), 1, format_string('Image style %style image %file successfully generated.', array('%style' => $style['name'], '%file' => $image_path)));
+
+    // Remove the 'image_scale' effect and updates the style, which in turn
+    // forces an image style flush.
+    $effect = array_pop($style['effects']);
+    $this->drupalPost($style_path . '/effects/' . $effect['ieid'] . '/delete', array(), t('Delete'));
+    $this->assertResponse(200);
+    $this->drupalPost($style_path, array(), t('Update style'));
+    $this->assertResponse(200);
+
+    // Post flush, expected 1 image in the 'public' wrapper (sample.png).
+    $this->assertEqual($this->getImageCount($style, 'public'), 1, format_string('Image style %style flushed correctly for %wrapper wrapper.', array('%style' => $style['name'], '%wrapper' => 'public')));
+
+    // Post flush, expected no image in the 'private' wrapper.
+    $this->assertEqual($this->getImageCount($style, 'private'), 0, format_string('Image style %style flushed correctly for %wrapper wrapper.', array('%style' => $style['name'], '%wrapper' => 'private')));
+  }
+}
diff --git a/htmltest/modules/image/sample.png b/htmltest/modules/image/sample.png
new file mode 100644
index 00000000..f22e0df9
Binary files /dev/null and b/htmltest/modules/image/sample.png differ
diff --git a/htmltest/modules/image/tests/image_module_test.info b/htmltest/modules/image/tests/image_module_test.info
new file mode 100644
index 00000000..4afbc582
--- /dev/null
+++ b/htmltest/modules/image/tests/image_module_test.info
@@ -0,0 +1,13 @@
+name = Image test
+description = Provides hook implementations for testing Image module functionality.
+package = Core
+version = VERSION
+core = 7.x
+files[] = image_module_test.module
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/image/tests/image_module_test.module b/htmltest/modules/image/tests/image_module_test.module
new file mode 100644
index 00000000..8a322fb9
--- /dev/null
+++ b/htmltest/modules/image/tests/image_module_test.module
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Provides Image module hook implementations for testing purposes.
+ */
+
+function image_module_test_file_download($uri) {
+  if (variable_get('image_module_test_file_download', FALSE) == $uri) {
+    return array('X-Image-Owned-By' => 'image_module_test');
+  }
+}
+
+/**
+ * Implements hook_image_effect_info().
+ */
+function image_module_test_image_effect_info() {
+  $effects = array(
+    'image_module_test_null' => array(
+    'effect callback' => 'image_module_test_null_effect',
+    ),
+  );
+
+  return $effects;
+}
+
+/**
+ * Image effect callback; Null.
+ *
+ * @param $image
+ *   An image object returned by image_load().
+ * @param $data
+ *   An array with no attributes.
+ *
+ * @return
+ *   TRUE
+ */
+function image_module_test_null_effect(array &$image, array $data) {
+  return TRUE;
+}
+
+/**
+ * Implements hook_image_effect_info_alter().
+ *
+ * Used to keep a count of cache misses in image_effect_definitions().
+ */
+function image_module_test_image_effect_info_alter(&$effects) {
+  $image_effects_definition_called = &drupal_static(__FUNCTION__, 0);
+  $image_effects_definition_called++;
+}
diff --git a/htmltest/modules/locale/locale-rtl.css b/htmltest/modules/locale/locale-rtl.css
new file mode 100644
index 00000000..aaf1988d
--- /dev/null
+++ b/htmltest/modules/locale/locale-rtl.css
@@ -0,0 +1,12 @@
+
+#locale-translation-filter-form .form-item-language,
+#locale-translation-filter-form .form-item-translation,
+#locale-translation-filter-form .form-item-group {
+  float: right;
+  padding-left: .8em;
+  padding-right: 0;
+}
+#locale-translation-filter-form .form-actions {
+  float: right;
+  padding: 3ex 1em 0 0;
+}
diff --git a/htmltest/modules/locale/locale.admin.inc b/htmltest/modules/locale/locale.admin.inc
new file mode 100644
index 00000000..b736f79b
--- /dev/null
+++ b/htmltest/modules/locale/locale.admin.inc
@@ -0,0 +1,1436 @@
+<?php
+
+/**
+ * @file
+ * Administration functions for locale.module.
+ */
+
+/**
+ * @defgroup locale-language-administration Language administration interface
+ * @{
+ * Administration interface for languages.
+ *
+ * These functions provide the user interface to show, add, edit and
+ * delete languages as well as providing options for language negotiation.
+ */
+
+/**
+ * User interface for the language overview screen.
+ */
+function locale_languages_overview_form() {
+  drupal_static_reset('language');
+  $languages = language_list('language');
+
+  $options = array();
+  $form['weight'] = array('#tree' => TRUE);
+  foreach ($languages as $langcode => $language) {
+
+    $options[$langcode] = '';
+    if ($language->enabled) {
+      $enabled[] = $langcode;
+    }
+    $form['weight'][$langcode] = array(
+      '#type' => 'weight',
+      '#title' => t('Weight for @title', array('@title' => $language->name)),
+      '#title_display' => 'invisible',
+      '#default_value' => $language->weight,
+      '#attributes' => array('class' => array('language-order-weight')),
+    );
+    $form['name'][$langcode] = array('#markup' => check_plain($language->name));
+    $form['native'][$langcode] = array('#markup' => check_plain($language->native));
+    $form['direction'][$langcode] = array('#markup' => ($language->direction == LANGUAGE_RTL ? t('Right to left') : t('Left to right')));
+  }
+  $form['enabled'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Enabled languages'),
+    '#title_display' => 'invisible',
+    '#options' => $options,
+    '#default_value' => $enabled,
+  );
+  $form['site_default'] = array(
+    '#type' => 'radios',
+    '#title' => t('Default language'),
+    '#title_display' => 'invisible',
+    '#options' => $options,
+    '#default_value' => language_default('language'),
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
+  $form['#theme'] = 'locale_languages_overview_form';
+
+  return $form;
+}
+
+/**
+ * Returns HTML for the language overview form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_locale_languages_overview_form($variables) {
+  $form = $variables['form'];
+  $default = language_default();
+  foreach ($form['name'] as $key => $element) {
+    // Do not take form control structures.
+    if (is_array($element) && element_child($key)) {
+      // Disable checkbox for the default language, because it cannot be disabled.
+      if ($key == $default->language) {
+        $form['enabled'][$key]['#attributes']['disabled'] = 'disabled';
+      }
+
+      // Add invisible labels for the checkboxes and radio buttons in the table
+      // for accessibility. These changes are only required and valid when the
+      // form is themed as a table, so it would be wrong to perform them in the
+      // form constructor.
+      $title = drupal_render($form['name'][$key]);
+      $form['enabled'][$key]['#title'] = t('Enable !title', array('!title' => $title));
+      $form['enabled'][$key]['#title_display'] = 'invisible';
+      $form['site_default'][$key]['#title'] = t('Set !title as default', array('!title' => $title));
+      $form['site_default'][$key]['#title_display'] = 'invisible';
+      $rows[] = array(
+        'data' => array(
+          '<strong>' . $title . '</strong>',
+          drupal_render($form['native'][$key]),
+          check_plain($key),
+          drupal_render($form['direction'][$key]),
+          array('data' => drupal_render($form['enabled'][$key]), 'align' => 'center'),
+          drupal_render($form['site_default'][$key]),
+          drupal_render($form['weight'][$key]),
+          l(t('edit'), 'admin/config/regional/language/edit/' . $key) . (($key != 'en' && $key != $default->language) ? ' ' . l(t('delete'), 'admin/config/regional/language/delete/' . $key) : '')
+        ),
+        'class' => array('draggable'),
+      );
+    }
+  }
+  $header = array(array('data' => t('English name')), array('data' => t('Native name')), array('data' => t('Code')), array('data' => t('Direction')), array('data' => t('Enabled')), array('data' => t('Default')), array('data' => t('Weight')), array('data' => t('Operations')));
+  $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'language-order')));
+  $output .= drupal_render_children($form);
+
+  drupal_add_tabledrag('language-order', 'order', 'sibling', 'language-order-weight');
+
+  return $output;
+}
+
+/**
+ * Process language overview form submissions, updating existing languages.
+ */
+function locale_languages_overview_form_submit($form, &$form_state) {
+  $languages = language_list();
+  $default = language_default();
+  $url_prefixes = variable_get('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX) == LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX;
+  $enabled_count = 0;
+
+  foreach ($languages as $langcode => $language) {
+    if ($form_state['values']['site_default'] == $langcode || $default->language == $langcode) {
+      // Automatically enable the default language and the language
+      // which was default previously (because we will not get the
+      // value from that disabled checkbox).
+      $form_state['values']['enabled'][$langcode] = 1;
+    }
+
+    // If language URL prefixes are enabled we must clear language domains and
+    // assign a valid prefix to each non-default language.
+    if ($url_prefixes) {
+      $language->domain = '';
+      if (empty($language->prefix) && $form_state['values']['site_default'] != $langcode) {
+        $language->prefix = $langcode;
+      }
+    }
+
+    if ($form_state['values']['enabled'][$langcode]) {
+      $enabled_count++;
+      $language->enabled = 1;
+    }
+    else {
+      $language->enabled = 0;
+    }
+
+    $language->weight = $form_state['values']['weight'][$langcode];
+
+    db_update('languages')
+      ->fields(array(
+        'enabled' => $language->enabled,
+        'weight' => $language->weight,
+        'prefix' => $language->prefix,
+        'domain' => $language->domain,
+      ))
+      ->condition('language', $langcode)
+      ->execute();
+
+    $languages[$langcode] = $language;
+  }
+
+  variable_set('language_default', $languages[$form_state['values']['site_default']]);
+  variable_set('language_count', $enabled_count);
+  drupal_set_message(t('Configuration saved.'));
+
+  // Changing the language settings impacts the interface.
+  cache_clear_all('*', 'cache_page', TRUE);
+  module_invoke_all('multilingual_settings_changed');
+
+  $form_state['redirect'] = 'admin/config/regional/language';
+  return;
+}
+
+/**
+ * User interface for the language addition screen.
+ */
+function locale_languages_add_screen() {
+  $build['predefined'] = drupal_get_form('locale_languages_predefined_form');
+  $build['custom'] = drupal_get_form('locale_languages_custom_form');
+  return $build;
+}
+
+/**
+ * Predefined language setup form.
+ */
+function locale_languages_predefined_form($form) {
+  $predefined = _locale_prepare_predefined_list();
+  $form['language list'] = array('#type' => 'fieldset',
+    '#title' => t('Predefined language'),
+    '#collapsible' => TRUE,
+  );
+  $form['language list']['langcode'] = array('#type' => 'select',
+    '#title' => t('Language name'),
+    '#default_value' => key($predefined),
+    '#options' => $predefined,
+    '#description' => t('Use the <em>Custom language</em> section below if your desired language does not appear in this list.'),
+  );
+  $form['language list']['actions'] = array('#type' => 'actions');
+  $form['language list']['actions']['submit'] = array('#type' => 'submit', '#value' => t('Add language'));
+  return $form;
+}
+
+/**
+ * Custom language addition form.
+ */
+function locale_languages_custom_form($form) {
+  $form['custom language'] = array('#type' => 'fieldset',
+    '#title' => t('Custom language'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  _locale_languages_common_controls($form['custom language']);
+  $form['custom language']['actions'] = array('#type' => 'actions');
+  $form['custom language']['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Add custom language')
+  );
+  // Reuse the validation and submit functions of the predefined language setup form.
+  $form['#submit'][] = 'locale_languages_predefined_form_submit';
+  $form['#validate'][] = 'locale_languages_predefined_form_validate';
+  return $form;
+}
+
+/**
+ * Editing screen for a particular language.
+ *
+ * @param $langcode
+ *   Language code of the language to edit.
+ */
+function locale_languages_edit_form($form, &$form_state, $langcode) {
+  if ($language = db_query("SELECT * FROM {languages} WHERE language = :language", array(':language' => $langcode))->fetchObject()) {
+    _locale_languages_common_controls($form, $language);
+    $form['actions'] = array('#type' => 'actions');
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save language')
+    );
+    $form['#submit'][] = 'locale_languages_edit_form_submit';
+    $form['#validate'][] = 'locale_languages_edit_form_validate';
+    return $form;
+  }
+  else {
+    drupal_not_found();
+    drupal_exit();
+  }
+}
+
+/**
+ * Common elements of the language addition and editing form.
+ *
+ * @param $form
+ *   A parent form item (or empty array) to add items below.
+ * @param $language
+ *   Language object to edit.
+ */
+function _locale_languages_common_controls(&$form, $language = NULL) {
+  if (!is_object($language)) {
+    $language = new stdClass();
+  }
+  if (isset($language->language)) {
+    $form['langcode_view'] = array(
+      '#type' => 'item',
+      '#title' => t('Language code'),
+      '#markup' => $language->language
+    );
+    $form['langcode'] = array(
+      '#type' => 'value',
+      '#value' => $language->language
+    );
+  }
+  else {
+    $form['langcode'] = array('#type' => 'textfield',
+      '#title' => t('Language code'),
+      '#maxlength' => 12,
+      '#required' => TRUE,
+      '#default_value' => @$language->language,
+      '#disabled' => (isset($language->language)),
+      '#description' => t('<a href="@rfc4646">RFC 4646</a> compliant language identifier. Language codes typically use a country code, and optionally, a script or regional variant name. <em>Examples: "en", "en-US" and "zh-Hant".</em>', array('@rfc4646' => 'http://www.ietf.org/rfc/rfc4646.txt')),
+    );
+  }
+  $form['name'] = array('#type' => 'textfield',
+    '#title' => t('Language name in English'),
+    '#maxlength' => 64,
+    '#default_value' => @$language->name,
+    '#required' => TRUE,
+    '#description' => t('Name of the language in English. Will be available for translation in all languages.'),
+  );
+  $form['native'] = array('#type' => 'textfield',
+    '#title' => t('Native language name'),
+    '#maxlength' => 64,
+    '#default_value' => @$language->native,
+    '#required' => TRUE,
+    '#description' => t('Name of the language in the language being added.'),
+  );
+  $form['prefix'] = array('#type' => 'textfield',
+    '#title' => t('Path prefix language code'),
+    '#maxlength' => 64,
+    '#default_value' => @$language->prefix,
+    '#description' => t('Language code or other custom text to use as a path prefix for URL language detection, if your <em>Detection and selection</em> settings use URL path prefixes. For the default language, this value may be left blank. <strong>Modifying this value may break existing URLs. Use with caution in a production environment.</strong> Example: Specifying "deutsch" as the path prefix code for German results in URLs like "example.com/deutsch/contact".')
+  );
+  $form['domain'] = array('#type' => 'textfield',
+    '#title' => t('Language domain'),
+    '#maxlength' => 128,
+    '#default_value' => @$language->domain,
+    '#description' => t('The domain name to use for this language if URL domains are used for <em>Detection and selection</em>. Leave blank for the default language. <strong>Changing this value may break existing URLs.</strong> Example: Specifying "de.example.com" as language domain for German will result in an URL like "http://de.example.com/contact".'),
+  );
+  $form['direction'] = array('#type' => 'radios',
+    '#title' => t('Direction'),
+    '#required' => TRUE,
+    '#description' => t('Direction that text in this language is presented.'),
+    '#default_value' => @$language->direction,
+    '#options' => array(LANGUAGE_LTR => t('Left to right'), LANGUAGE_RTL => t('Right to left'))
+  );
+  return $form;
+}
+
+/**
+ * Validate the language addition form.
+ */
+function locale_languages_predefined_form_validate($form, &$form_state) {
+  $langcode = $form_state['values']['langcode'];
+
+  if (($duplicate = db_query("SELECT COUNT(*) FROM {languages} WHERE language = :language", array(':language' => $langcode))->fetchField()) != 0) {
+    form_set_error('langcode', t('The language %language (%code) already exists.', array('%language' => $form_state['values']['name'], '%code' => $langcode)));
+  }
+
+  if (!isset($form_state['values']['name'])) {
+    // Predefined language selection.
+    include_once DRUPAL_ROOT . '/includes/iso.inc';
+    $predefined = _locale_get_predefined_list();
+    if (!isset($predefined[$langcode])) {
+      form_set_error('langcode', t('Invalid language code.'));
+    }
+  }
+  else {
+    // Reuse the editing form validation routine if we add a custom language.
+    locale_languages_edit_form_validate($form, $form_state);
+  }
+}
+
+/**
+ * Process the language addition form submission.
+ */
+function locale_languages_predefined_form_submit($form, &$form_state) {
+  $langcode = $form_state['values']['langcode'];
+  if (isset($form_state['values']['name'])) {
+    // Custom language form.
+    locale_add_language($langcode, $form_state['values']['name'], $form_state['values']['native'], $form_state['values']['direction'], $form_state['values']['domain'], $form_state['values']['prefix']);
+    drupal_set_message(t('The language %language has been created and can now be used. More information is available on the <a href="@locale-help">help screen</a>.', array('%language' => t($form_state['values']['name']), '@locale-help' => url('admin/help/locale'))));
+  }
+  else {
+    // Predefined language selection.
+    include_once DRUPAL_ROOT . '/includes/iso.inc';
+    $predefined = _locale_get_predefined_list();
+    locale_add_language($langcode);
+    drupal_set_message(t('The language %language has been created and can now be used. More information is available on the <a href="@locale-help">help screen</a>.', array('%language' => t($predefined[$langcode][0]), '@locale-help' => url('admin/help/locale'))));
+  }
+
+  // See if we have language files to import for the newly added
+  // language, collect and import them.
+  if ($batch = locale_batch_by_language($langcode, '_locale_batch_language_finished')) {
+    batch_set($batch);
+  }
+
+  $form_state['redirect'] = 'admin/config/regional/language';
+}
+
+/**
+ * Validate the language editing form. Reused for custom language addition too.
+ */
+function locale_languages_edit_form_validate($form, &$form_state) {
+  // Ensure sane field values for langcode, name, and native.
+  if (!isset($form['langcode_view']) && preg_match('@[^a-zA-Z_-]@', $form_state['values']['langcode'])) {
+    form_set_error('langcode', t('%field may only contain characters a-z, underscores, or hyphens.', array('%field' => $form['langcode']['#title'])));
+  }
+  if ($form_state['values']['name'] != check_plain($form_state['values']['name'])) {
+    form_set_error('name', t('%field cannot contain any markup.', array('%field' => $form['name']['#title'])));
+  }
+  if ($form_state['values']['native'] != check_plain($form_state['values']['native'])) {
+    form_set_error('native', t('%field cannot contain any markup.', array('%field' => $form['native']['#title'])));
+  }
+
+  if (!empty($form_state['values']['domain']) && !empty($form_state['values']['prefix'])) {
+    form_set_error('prefix', t('Domain and path prefix values should not be set at the same time.'));
+  }
+  if (!empty($form_state['values']['domain']) && $duplicate = db_query("SELECT language FROM {languages} WHERE domain = :domain AND language <> :language", array(':domain' => $form_state['values']['domain'], ':language' => $form_state['values']['langcode']))->fetchField()) {
+    form_set_error('domain', t('The domain (%domain) is already tied to a language (%language).', array('%domain' => $form_state['values']['domain'], '%language' => $duplicate)));
+  }
+  if (empty($form_state['values']['prefix']) && language_default('language') != $form_state['values']['langcode'] && empty($form_state['values']['domain'])) {
+    form_set_error('prefix', t('Only the default language can have both the domain and prefix empty.'));
+  }
+  if (!empty($form_state['values']['prefix']) && $duplicate = db_query("SELECT language FROM {languages} WHERE prefix = :prefix AND language <> :language", array(':prefix' => $form_state['values']['prefix'], ':language' => $form_state['values']['langcode']))->fetchField()) {
+    form_set_error('prefix', t('The prefix (%prefix) is already tied to a language (%language).', array('%prefix' => $form_state['values']['prefix'], '%language' => $duplicate)));
+  }
+}
+
+/**
+ * Process the language editing form submission.
+ */
+function locale_languages_edit_form_submit($form, &$form_state) {
+  db_update('languages')
+    ->fields(array(
+      'name' => $form_state['values']['name'],
+      'native' => $form_state['values']['native'],
+      'domain' => $form_state['values']['domain'],
+      'prefix' => $form_state['values']['prefix'],
+      'direction' => $form_state['values']['direction'],
+    ))
+    ->condition('language',  $form_state['values']['langcode'])
+    ->execute();
+  $default = language_default();
+  if ($default->language == $form_state['values']['langcode']) {
+    $properties = array('name', 'native', 'direction', 'enabled', 'plurals', 'formula', 'domain', 'prefix', 'weight');
+    foreach ($properties as $keyname) {
+      if (isset($form_state['values'][$keyname])) {
+        $default->$keyname = $form_state['values'][$keyname];
+      }
+    }
+    variable_set('language_default', $default);
+  }
+  $form_state['redirect'] = 'admin/config/regional/language';
+  return;
+}
+
+/**
+ * User interface for the language deletion confirmation screen.
+ */
+function locale_languages_delete_form($form, &$form_state, $langcode) {
+
+  // Do not allow deletion of English locale.
+  if ($langcode == 'en') {
+    drupal_set_message(t('The English language cannot be deleted.'));
+    drupal_goto('admin/config/regional/language');
+  }
+
+  if (language_default('language') == $langcode) {
+    drupal_set_message(t('The default language cannot be deleted.'));
+    drupal_goto('admin/config/regional/language');
+  }
+
+  // For other languages, warn user that data loss is ahead.
+  $languages = language_list();
+
+  if (!isset($languages[$langcode])) {
+    drupal_not_found();
+    drupal_exit();
+  }
+  else {
+    $form['langcode'] = array('#type' => 'value', '#value' => $langcode);
+    return confirm_form($form, t('Are you sure you want to delete the language %name?', array('%name' => t($languages[$langcode]->name))), 'admin/config/regional/language', t('Deleting a language will remove all interface translations associated with it, and posts in this language will be set to be language neutral. This action cannot be undone.'), t('Delete'), t('Cancel'));
+  }
+}
+
+/**
+ * Process language deletion submissions.
+ */
+function locale_languages_delete_form_submit($form, &$form_state) {
+  $languages = language_list();
+  if (isset($languages[$form_state['values']['langcode']])) {
+    // Remove translations first.
+    db_delete('locales_target')
+      ->condition('language', $form_state['values']['langcode'])
+      ->execute();
+    cache_clear_all('locale:' . $form_state['values']['langcode'], 'cache');
+    // With no translations, this removes existing JavaScript translations file.
+    _locale_rebuild_js($form_state['values']['langcode']);
+    // Remove the language.
+    db_delete('languages')
+      ->condition('language', $form_state['values']['langcode'])
+      ->execute();
+    db_update('node')
+      ->fields(array('language' => ''))
+      ->condition('language', $form_state['values']['langcode'])
+      ->execute();
+    if ($languages[$form_state['values']['langcode']]->enabled) {
+      variable_set('language_count', variable_get('language_count', 1) - 1);
+    }
+    module_invoke_all('multilingual_settings_changed');
+    $variables = array('%locale' => $languages[$form_state['values']['langcode']]->name);
+    drupal_set_message(t('The language %locale has been removed.', $variables));
+    watchdog('locale', 'The language %locale has been removed.', $variables);
+  }
+
+  // Changing the language settings impacts the interface:
+  cache_clear_all('*', 'cache_page', TRUE);
+
+  $form_state['redirect'] = 'admin/config/regional/language';
+  return;
+}
+
+/**
+ * Setting for language negotiation options
+ */
+function locale_languages_configure_form() {
+  include_once DRUPAL_ROOT . '/includes/language.inc';
+
+  $form = array(
+    '#submit' => array('locale_languages_configure_form_submit'),
+    '#theme' => 'locale_languages_configure_form',
+    '#language_types' => language_types_configurable(FALSE),
+    '#language_types_info' => language_types_info(),
+    '#language_providers' => language_negotiation_info(),
+  );
+
+  foreach ($form['#language_types'] as $type) {
+    _locale_languages_configure_form_language_table($form, $type);
+  }
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save settings'),
+  );
+
+  return $form;
+}
+
+/**
+ * Helper function to build a language provider table.
+ */
+function _locale_languages_configure_form_language_table(&$form, $type) {
+  $info = $form['#language_types_info'][$type];
+
+  $table_form = array(
+    '#title' => t('@type language detection', array('@type' => $info['name'])),
+    '#tree' => TRUE,
+    '#description' => $info['description'],
+    '#language_providers' => array(),
+    '#show_operations' => FALSE,
+    'weight' => array('#tree' => TRUE),
+    'enabled' => array('#tree' => TRUE),
+  );
+
+  $language_providers = $form['#language_providers'];
+  $enabled_providers = variable_get("language_negotiation_$type", array());
+  $providers_weight = variable_get("locale_language_providers_weight_$type", array());
+
+  // Add missing data to the providers lists.
+  foreach ($language_providers as $id => $provider) {
+    if (!isset($providers_weight[$id])) {
+      $providers_weight[$id] = language_provider_weight($provider);
+    }
+  }
+
+  // Order providers list by weight.
+  asort($providers_weight);
+
+  foreach ($providers_weight as $id => $weight) {
+    // A language provider might be no more available if the defining module has
+    // been disabled after the last configuration saving.
+    if (!isset($language_providers[$id])) {
+      continue;
+    }
+
+    $enabled = isset($enabled_providers[$id]);
+    $provider = $language_providers[$id];
+
+    // List the provider only if the current type is defined in its 'types' key.
+    // If it is not defined default to all the configurable language types.
+    $types = array_flip(isset($provider['types']) ? $provider['types'] : $form['#language_types']);
+
+    if (isset($types[$type])) {
+      $table_form['#language_providers'][$id] = $provider;
+
+      $table_form['weight'][$id] = array(
+        '#type' => 'weight',
+        '#title' => t('Weight for @title', array('@title' => $provider['name'])),
+        '#title_display' => 'invisible',
+        '#default_value' => $weight,
+        '#attributes' => array('class' => array("language-provider-weight-$type")),
+      );
+
+      $table_form['title'][$id] = array('#markup' => check_plain($provider['name']));
+
+      $table_form['enabled'][$id] = array(
+        '#type' => 'checkbox',
+        '#title' => t('@title language provider', array('@title' => $provider['name'])),
+        '#title_display' => 'invisible',
+        '#default_value' => $enabled,
+      );
+      if ($id === LANGUAGE_NEGOTIATION_DEFAULT) {
+        $table_form['enabled'][$id]['#default_value'] = TRUE;
+        $table_form['enabled'][$id]['#attributes'] = array('disabled' => 'disabled');
+      }
+
+      $table_form['description'][$id] = array('#markup' => filter_xss_admin($provider['description']));
+
+      $config_op = array();
+      if (isset($provider['config'])) {
+        $config_op = array('#type' => 'link', '#title' => t('Configure'), '#href' => $provider['config']);
+        // If there is at least one operation enabled show the operation column.
+        $table_form['#show_operations'] = TRUE;
+      }
+      $table_form['operation'][$id] = $config_op;
+    }
+  }
+
+  $form[$type] = $table_form;
+}
+
+/**
+ * Returns HTML for a language configuration form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_locale_languages_configure_form($variables) {
+  $form = $variables['form'];
+  $output = '';
+
+  foreach ($form['#language_types'] as $type) {
+    $rows = array();
+    $info = $form['#language_types_info'][$type];
+    $title = '<label>' . $form[$type]['#title'] . '</label>';
+    $description = '<div class="description">' . $form[$type]['#description'] . '</div>';
+
+    foreach ($form[$type]['title'] as $id => $element) {
+      // Do not take form control structures.
+      if (is_array($element) && element_child($id)) {
+        $row = array(
+          'data' => array(
+            '<strong>' . drupal_render($form[$type]['title'][$id]) . '</strong>',
+            drupal_render($form[$type]['description'][$id]),
+            drupal_render($form[$type]['enabled'][$id]),
+            drupal_render($form[$type]['weight'][$id]),
+          ),
+          'class' => array('draggable'),
+        );
+        if ($form[$type]['#show_operations']) {
+          $row['data'][] = drupal_render($form[$type]['operation'][$id]);
+        }
+        $rows[] = $row;
+      }
+    }
+
+    $header = array(
+      array('data' => t('Detection method')),
+      array('data' => t('Description')),
+      array('data' => t('Enabled')),
+      array('data' => t('Weight')),
+    );
+
+    // If there is at least one operation enabled show the operation column.
+    if ($form[$type]['#show_operations']) {
+      $header[] = array('data' => t('Operations'));
+    }
+
+    $variables = array(
+      'header' => $header,
+      'rows' => $rows,
+      'attributes' => array('id' => "language-negotiation-providers-$type"),
+    );
+    $table  = theme('table', $variables);
+    $table .= drupal_render_children($form[$type]);
+
+    drupal_add_tabledrag("language-negotiation-providers-$type", 'order', 'sibling', "language-provider-weight-$type");
+
+    $output .= '<div class="form-item">' . $title . $description . $table . '</div>';
+  }
+
+  $output .= drupal_render_children($form);
+  return $output;
+}
+
+/**
+ * Submit handler for language negotiation settings.
+ */
+function locale_languages_configure_form_submit($form, &$form_state) {
+  $configurable_types = $form['#language_types'];
+
+  foreach ($configurable_types as $type) {
+    $negotiation = array();
+    $enabled_providers = $form_state['values'][$type]['enabled'];
+    $enabled_providers[LANGUAGE_NEGOTIATION_DEFAULT] = TRUE;
+    $providers_weight = $form_state['values'][$type]['weight'];
+
+    foreach ($providers_weight as $id => $weight) {
+      if ($enabled_providers[$id]) {
+        $provider = $form[$type]['#language_providers'][$id];
+        $provider['weight'] = $weight;
+        $negotiation[$id] = $provider;
+      }
+    }
+
+    language_negotiation_set($type, $negotiation);
+    variable_set("locale_language_providers_weight_$type", $providers_weight);
+  }
+
+  // Update non-configurable language types and the related language negotiation
+  // configuration.
+  language_types_set();
+
+  $form_state['redirect'] = 'admin/config/regional/language/configure';
+  drupal_set_message(t('Language negotiation configuration saved.'));
+}
+
+/**
+ * The URL language provider configuration form.
+ */
+function locale_language_providers_url_form($form, &$form_state) {
+  $form['locale_language_negotiation_url_part'] = array(
+    '#title' => t('Part of the URL that determines language'),
+    '#type' => 'radios',
+    '#options' => array(
+      LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX => t('Path prefix'),
+      LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN => t('Domain'),
+    ),
+    '#default_value' => variable_get('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX),
+    '#description' => t('<em>Path prefix</em>: URLs like http://example.com/de/contact set language to German (de). <em>Domain</em>: URLs like http://de.example.com/contact set the language to German. <strong>Warning: Changing this setting may break incoming URLs. Use with caution on a production site.</strong>'),
+  );
+
+  $form_state['redirect'] = 'admin/config/regional/language/configure';
+
+  return system_settings_form($form);
+}
+
+/**
+ * The URL language provider configuration form.
+ */
+function locale_language_providers_session_form($form, &$form_state) {
+  $form['locale_language_negotiation_session_param'] = array(
+    '#title' => t('Request/session parameter'),
+    '#type' => 'textfield',
+    '#default_value' => variable_get('locale_language_negotiation_session_param', 'language'),
+    '#description' => t('Name of the request/session parameter used to determine the desired language.'),
+  );
+
+  $form_state['redirect'] = 'admin/config/regional/language/configure';
+
+  return system_settings_form($form);
+}
+
+/**
+ * @} End of "locale-language-administration"
+ */
+
+/**
+ * @defgroup locale-translate-administration-screens Translation administration screens
+ * @{
+ * Screens for translation administration.
+ *
+ * These functions provide various screens as administration interface
+ * to import, export and view translations.
+ */
+
+/**
+ * Overview screen for translations.
+ */
+function locale_translate_overview_screen() {
+  drupal_static_reset('language_list');
+  $languages = language_list('language');
+  $groups = module_invoke_all('locale', 'groups');
+
+  // Build headers with all groups in order.
+  $headers = array_merge(array(t('Language')), array_values($groups));
+
+  // Collect summaries of all source strings in all groups.
+  $sums = db_query("SELECT COUNT(*) AS strings, textgroup FROM {locales_source} GROUP BY textgroup");
+  $groupsums = array();
+  foreach ($sums as $group) {
+    $groupsums[$group->textgroup] = $group->strings;
+  }
+
+  // Set up overview table with default values, ensuring common order for values.
+  $rows = array();
+  foreach ($languages as $langcode => $language) {
+    $rows[$langcode] = array('name' => ($langcode == 'en' ? t('English (built-in)') : t($language->name)));
+    foreach ($groups as $group => $name) {
+      $rows[$langcode][$group] = ($langcode == 'en' ? t('n/a') : '0/' . (isset($groupsums[$group]) ? $groupsums[$group] : 0) . ' (0%)');
+    }
+  }
+
+  // Languages with at least one record in the locale table.
+  $translations = db_query("SELECT COUNT(*) AS translation, t.language, s.textgroup FROM {locales_source} s INNER JOIN {locales_target} t ON s.lid = t.lid GROUP BY textgroup, language");
+  foreach ($translations as $data) {
+    $ratio = (!empty($groupsums[$data->textgroup]) && $data->translation > 0) ? round(($data->translation/$groupsums[$data->textgroup]) * 100.0, 2) : 0;
+    $rows[$data->language][$data->textgroup] = $data->translation . '/' . $groupsums[$data->textgroup] . " ($ratio%)";
+  }
+
+  return theme('table', array('header' => $headers, 'rows' => $rows));
+}
+
+/**
+ * String search screen.
+ */
+function locale_translate_seek_screen() {
+  // Add CSS.
+  drupal_add_css(drupal_get_path('module', 'locale') . '/locale.css');
+
+  $elements = drupal_get_form('locale_translation_filter_form');
+  $output = drupal_render($elements);
+  $output .= _locale_translate_seek();
+  return $output;
+}
+
+/**
+ * List locale translation filters that can be applied.
+ */
+function locale_translation_filters() {
+  $filters = array();
+
+  // Get all languages, except English
+  drupal_static_reset('language_list');
+  $languages = locale_language_list('name');
+  unset($languages['en']);
+
+  $filters['string'] = array(
+    'title' => t('String contains'),
+    'description' => t('Leave blank to show all strings. The search is case sensitive.'),
+  );
+
+  $filters['language'] = array(
+    'title' => t('Language'),
+    'options' => array_merge(array('all' => t('All languages'), 'en' => t('English (provided by Drupal)')), $languages),
+  );
+
+  $filters['translation'] = array(
+    'title' => t('Search in'),
+    'options' => array('all' => t('Both translated and untranslated strings'), 'translated' => t('Only translated strings'), 'untranslated' => t('Only untranslated strings')),
+  );
+
+  $groups = module_invoke_all('locale', 'groups');
+  $filters['group'] = array(
+    'title' => t('Limit search to'),
+    'options' => array_merge(array('all' => t('All text groups')), $groups),
+  );
+
+  return $filters;
+}
+
+/**
+ * Return form for locale translation filters.
+ *
+ * @ingroup forms
+ */
+function locale_translation_filter_form() {
+  $filters = locale_translation_filters();
+
+  $form['filters'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Filter translatable strings'),
+    '#collapsible' => TRUE,
+    '#collapsed' => FALSE,
+  );
+  foreach ($filters as $key => $filter) {
+    // Special case for 'string' filter.
+    if ($key == 'string') {
+      $form['filters']['status']['string'] = array(
+        '#type' => 'textfield',
+        '#title' => $filter['title'],
+        '#description' => $filter['description'],
+      );
+    }
+    else {
+      $form['filters']['status'][$key] = array(
+        '#title' => $filter['title'],
+        '#type' => 'select',
+        '#empty_value' => 'all',
+        '#empty_option' => $filter['options']['all'],
+        '#size' => 0,
+        '#options' => $filter['options'],
+      );
+    }
+    if (!empty($_SESSION['locale_translation_filter'][$key])) {
+      $form['filters']['status'][$key]['#default_value'] = $_SESSION['locale_translation_filter'][$key];
+    }
+  }
+
+  $form['filters']['actions'] = array(
+    '#type' => 'actions',
+    '#attributes' => array('class' => array('container-inline')),
+  );
+  $form['filters']['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Filter'),
+  );
+  if (!empty($_SESSION['locale_translation_filter'])) {
+    $form['filters']['actions']['reset'] = array(
+      '#type' => 'submit',
+      '#value' => t('Reset')
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Validate result from locale translation filter form.
+ */
+function locale_translation_filter_form_validate($form, &$form_state) {
+  if ($form_state['values']['op'] == t('Filter') && empty($form_state['values']['language']) && empty($form_state['values']['group'])) {
+    form_set_error('type', t('You must select something to filter by.'));
+  }
+}
+
+/**
+ * Process result from locale translation filter form.
+ */
+function locale_translation_filter_form_submit($form, &$form_state) {
+  $op = $form_state['values']['op'];
+  $filters = locale_translation_filters();
+  switch ($op) {
+    case t('Filter'):
+      foreach ($filters as $name => $filter) {
+        if (isset($form_state['values'][$name])) {
+          $_SESSION['locale_translation_filter'][$name] = $form_state['values'][$name];
+        }
+      }
+      break;
+    case t('Reset'):
+      $_SESSION['locale_translation_filter'] = array();
+      break;
+  }
+
+  $form_state['redirect'] = 'admin/config/regional/translate/translate';
+}
+
+/**
+ * User interface for the translation import screen.
+ */
+function locale_translate_import_form($form) {
+  // Get all languages, except English
+  drupal_static_reset('language_list');
+  $names = locale_language_list('name');
+  unset($names['en']);
+
+  if (!count($names)) {
+    $languages = _locale_prepare_predefined_list();
+    $default = key($languages);
+  }
+  else {
+    $languages = array(
+      t('Already added languages') => $names,
+      t('Languages not yet added') => _locale_prepare_predefined_list()
+    );
+    $default = key($names);
+  }
+
+  $form['import'] = array('#type' => 'fieldset',
+    '#title' => t('Import translation'),
+  );
+  $form['import']['file'] = array('#type' => 'file',
+    '#title' => t('Language file'),
+    '#size' => 50,
+    '#description' => t('A Gettext Portable Object (<em>.po</em>) file.'),
+  );
+  $form['import']['langcode'] = array('#type' => 'select',
+    '#title' => t('Import into'),
+    '#options' => $languages,
+    '#default_value' => $default,
+    '#description' => t('Choose the language you want to add strings into. If you choose a language which is not yet set up, it will be added.'),
+  );
+  $form['import']['group'] = array('#type' => 'radios',
+    '#title' => t('Text group'),
+    '#default_value' => 'default',
+    '#options' => module_invoke_all('locale', 'groups'),
+    '#description' => t('Imported translations will be added to this text group.'),
+  );
+  $form['import']['mode'] = array('#type' => 'radios',
+    '#title' => t('Mode'),
+    '#default_value' => LOCALE_IMPORT_KEEP,
+    '#options' => array(
+      LOCALE_IMPORT_OVERWRITE => t('Strings in the uploaded file replace existing ones, new ones are added. The plural format is updated.'),
+      LOCALE_IMPORT_KEEP => t('Existing strings and the plural format are kept, only new strings are added.')
+    ),
+  );
+  $form['import']['submit'] = array('#type' => 'submit', '#value' => t('Import'));
+
+  return $form;
+}
+
+/**
+ * Process the locale import form submission.
+ */
+function locale_translate_import_form_submit($form, &$form_state) {
+  $validators = array('file_validate_extensions' => array('po'));
+  // Ensure we have the file uploaded
+  if ($file = file_save_upload('file', $validators)) {
+
+    // Add language, if not yet supported
+    drupal_static_reset('language_list');
+    $languages = language_list('language');
+    $langcode = $form_state['values']['langcode'];
+    if (!isset($languages[$langcode])) {
+      include_once DRUPAL_ROOT . '/includes/iso.inc';
+      $predefined = _locale_get_predefined_list();
+      locale_add_language($langcode);
+      drupal_set_message(t('The language %language has been created.', array('%language' => t($predefined[$langcode][0]))));
+    }
+
+    // Now import strings into the language
+    if ($return = _locale_import_po($file, $langcode, $form_state['values']['mode'], $form_state['values']['group']) == FALSE) {
+      $variables = array('%filename' => $file->filename);
+      drupal_set_message(t('The translation import of %filename failed.', $variables), 'error');
+      watchdog('locale', 'The translation import of %filename failed.', $variables, WATCHDOG_ERROR);
+    }
+  }
+  else {
+    drupal_set_message(t('File to import not found.'), 'error');
+    $form_state['redirect'] = 'admin/config/regional/translate/import';
+    return;
+  }
+
+  $form_state['redirect'] = 'admin/config/regional/translate';
+  return;
+}
+
+/**
+ * User interface for the translation export screen.
+ */
+function locale_translate_export_screen() {
+  // Get all languages, except English
+  drupal_static_reset('language_list');
+  $names = locale_language_list('name');
+  unset($names['en']);
+  $output = '';
+  // Offer translation export if any language is set up.
+  if (count($names)) {
+    $elements = drupal_get_form('locale_translate_export_po_form', $names);
+    $output = drupal_render($elements);
+  }
+  $elements = drupal_get_form('locale_translate_export_pot_form');
+  $output .= drupal_render($elements);
+  return $output;
+}
+
+/**
+ * Form to export PO files for the languages provided.
+ *
+ * @param $names
+ *   An associate array with localized language names
+ */
+function locale_translate_export_po_form($form, &$form_state, $names) {
+  $form['export_title'] = array('#type' => 'item',
+    '#title' => t('Export translation'),
+  );
+  $form['langcode'] = array('#type' => 'select',
+    '#title' => t('Language name'),
+    '#options' => $names,
+    '#description' => t('Select the language to export in Gettext Portable Object (<em>.po</em>) format.'),
+  );
+  $form['group'] = array('#type' => 'radios',
+    '#title' => t('Text group'),
+    '#default_value' => 'default',
+    '#options' => module_invoke_all('locale', 'groups'),
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Export'));
+  return $form;
+}
+
+/**
+ * Translation template export form.
+ */
+function locale_translate_export_pot_form() {
+  // Complete template export of the strings
+  $form['export_title'] = array('#type' => 'item',
+    '#title' => t('Export template'),
+    '#description' => t('Generate a Gettext Portable Object Template (<em>.pot</em>) file with all strings from the Drupal locale database.'),
+  );
+  $form['group'] = array('#type' => 'radios',
+    '#title' => t('Text group'),
+    '#default_value' => 'default',
+    '#options' => module_invoke_all('locale', 'groups'),
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Export'));
+  // Reuse PO export submission callback.
+  $form['#submit'][] = 'locale_translate_export_po_form_submit';
+  return $form;
+}
+
+/**
+ * Process a translation (or template) export form submission.
+ */
+function locale_translate_export_po_form_submit($form, &$form_state) {
+  // If template is required, language code is not given.
+  $language = NULL;
+  if (isset($form_state['values']['langcode'])) {
+    $languages = language_list();
+    $language = $languages[$form_state['values']['langcode']];
+  }
+  _locale_export_po($language, _locale_export_po_generate($language, _locale_export_get_strings($language, $form_state['values']['group'])));
+}
+/**
+ * @} End of "locale-translate-administration-screens"
+ */
+
+/**
+ * @defgroup locale-translate-edit-delete Translation editing/deletion interface
+ * @{
+ * Edit and delete translation strings.
+ *
+ * These functions provide the user interface to edit and delete
+ * translation strings.
+ */
+
+/**
+ * User interface for string editing.
+ */
+function locale_translate_edit_form($form, &$form_state, $lid) {
+  // Fetch source string, if possible.
+  $source = db_query('SELECT source, context, textgroup, location FROM {locales_source} WHERE lid = :lid', array(':lid' => $lid))->fetchObject();
+  if (!$source) {
+    drupal_set_message(t('String not found.'), 'error');
+    drupal_goto('admin/config/regional/translate/translate');
+  }
+
+  // Add original text to the top and some values for form altering.
+  $form['original'] = array(
+    '#type'  => 'item',
+    '#title' => t('Original text'),
+    '#markup' => check_plain(wordwrap($source->source, 0)),
+  );
+  if (!empty($source->context)) {
+    $form['context'] = array(
+      '#type' => 'item',
+      '#title' => t('Context'),
+      '#markup' => check_plain($source->context),
+    );
+  }
+  $form['lid'] = array(
+    '#type'  => 'value',
+    '#value' => $lid
+  );
+  $form['textgroup'] = array(
+    '#type'  => 'value',
+    '#value' => $source->textgroup,
+  );
+  $form['location'] = array(
+    '#type'  => 'value',
+    '#value' => $source->location
+  );
+
+  // Include default form controls with empty values for all languages.
+  // This ensures that the languages are always in the same order in forms.
+  $languages = language_list();
+  $default = language_default();
+  // We don't need the default language value, that value is in $source.
+  $omit = $source->textgroup == 'default' ? 'en' : $default->language;
+  unset($languages[($omit)]);
+  $form['translations'] = array('#tree' => TRUE);
+  // Approximate the number of rows to use in the default textarea.
+  $rows = min(ceil(str_word_count($source->source) / 12), 10);
+  foreach ($languages as $langcode => $language) {
+    $form['translations'][$langcode] = array(
+      '#type' => 'textarea',
+      '#title' => t($language->name),
+      '#rows' => $rows,
+      '#default_value' => '',
+    );
+  }
+
+  // Fetch translations and fill in default values in the form.
+  $result = db_query("SELECT DISTINCT translation, language FROM {locales_target} WHERE lid = :lid AND language <> :omit", array(':lid' => $lid, ':omit' => $omit));
+  foreach ($result as $translation) {
+    $form['translations'][$translation->language]['#default_value'] = $translation->translation;
+  }
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save translations'));
+  return $form;
+}
+
+/**
+ * Validate string editing form submissions.
+ */
+function locale_translate_edit_form_validate($form, &$form_state) {
+  // Locale string check is needed for default textgroup only.
+  $safe_check_needed = $form_state['values']['textgroup'] == 'default';
+  foreach ($form_state['values']['translations'] as $key => $value) {
+    if ($safe_check_needed && !locale_string_is_safe($value)) {
+      form_set_error('translations', t('The submitted string contains disallowed HTML: %string', array('%string' => $value)));
+      watchdog('locale', 'Attempted submission of a translation string with disallowed HTML: %string', array('%string' => $value), WATCHDOG_WARNING);
+    }
+  }
+}
+
+/**
+ * Process string editing form submissions.
+ *
+ * Saves all translations of one string submitted from a form.
+ */
+function locale_translate_edit_form_submit($form, &$form_state) {
+  $lid = $form_state['values']['lid'];
+  foreach ($form_state['values']['translations'] as $key => $value) {
+    $translation = db_query("SELECT translation FROM {locales_target} WHERE lid = :lid AND language = :language", array(':lid' => $lid, ':language' => $key))->fetchField();
+    if (!empty($value)) {
+      // Only update or insert if we have a value to use.
+      if (!empty($translation)) {
+        db_update('locales_target')
+          ->fields(array(
+            'translation' => $value,
+          ))
+          ->condition('lid', $lid)
+          ->condition('language', $key)
+          ->execute();
+      }
+      else {
+        db_insert('locales_target')
+          ->fields(array(
+            'lid' => $lid,
+            'translation' => $value,
+            'language' => $key,
+          ))
+          ->execute();
+      }
+    }
+    elseif (!empty($translation)) {
+      // Empty translation entered: remove existing entry from database.
+      db_delete('locales_target')
+        ->condition('lid', $lid)
+        ->condition('language', $key)
+        ->execute();
+    }
+
+    // Force JavaScript translation file recreation for this language.
+    _locale_invalidate_js($key);
+  }
+
+  drupal_set_message(t('The string has been saved.'));
+
+  // Clear locale cache.
+  _locale_invalidate_js();
+  cache_clear_all('locale:', 'cache', TRUE);
+
+  $form_state['redirect'] = 'admin/config/regional/translate/translate';
+  return;
+}
+
+/**
+ * String deletion confirmation page.
+ */
+function locale_translate_delete_page($lid) {
+  if ($source = db_query('SELECT lid, source FROM {locales_source} WHERE lid = :lid', array(':lid' => $lid))->fetchObject()) {
+    return drupal_get_form('locale_translate_delete_form', $source);
+  }
+  return MENU_NOT_FOUND;
+}
+
+/**
+ * User interface for the string deletion confirmation screen.
+ */
+function locale_translate_delete_form($form, &$form_state, $source) {
+  $form['lid'] = array('#type' => 'value', '#value' => $source->lid);
+  return confirm_form($form, t('Are you sure you want to delete the string "%source"?', array('%source' => $source->source)), 'admin/config/regional/translate/translate', t('Deleting the string will remove all translations of this string in all languages. This action cannot be undone.'), t('Delete'), t('Cancel'));
+}
+
+/**
+ * Process string deletion submissions.
+ */
+function locale_translate_delete_form_submit($form, &$form_state) {
+  db_delete('locales_source')
+    ->condition('lid', $form_state['values']['lid'])
+    ->execute();
+  db_delete('locales_target')
+    ->condition('lid', $form_state['values']['lid'])
+    ->execute();
+  // Force JavaScript translation file recreation for all languages.
+  _locale_invalidate_js();
+  cache_clear_all('locale:', 'cache', TRUE);
+  drupal_set_message(t('The string has been removed.'));
+  $form_state['redirect'] = 'admin/config/regional/translate/translate';
+}
+/**
+ * @} End of "locale-translate-edit-delete"
+ */
+
+/**
+ * Returns HTML for a locale date format form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_locale_date_format_form($variables) {
+  $form = $variables['form'];
+  $header = array(
+    t('Date type'),
+    t('Format'),
+  );
+
+  foreach (element_children($form['date_formats']) as $key) {
+    $row = array();
+    $row[] = $form['date_formats'][$key]['#title'];
+    unset($form['date_formats'][$key]['#title']);
+    $row[] = array('data' => drupal_render($form['date_formats'][$key]));
+    $rows[] = $row;
+  }
+
+  $output = drupal_render($form['language']);
+  $output .= theme('table', array('header' => $header, 'rows' => $rows));
+  $output .= drupal_render_children($form);
+
+  return $output;
+}
+
+/**
+ * Display edit date format links for each language.
+ */
+function locale_date_format_language_overview_page() {
+  $header = array(
+    t('Language'),
+    array('data' => t('Operations'), 'colspan' => '2'),
+  );
+
+  // Get list of languages.
+  $languages = locale_language_list('native');
+
+  foreach ($languages as $langcode => $info) {
+    $row = array();
+    $row[] = $languages[$langcode];
+    $row[] = l(t('edit'), 'admin/config/regional/date-time/locale/' . $langcode . '/edit');
+    $row[] = l(t('reset'), 'admin/config/regional/date-time/locale/' . $langcode . '/reset');
+    $rows[] = $row;
+  }
+
+  return theme('table', array('header' => $header, 'rows' => $rows));
+}
+
+/**
+ * Provide date localization configuration options to users.
+ */
+function locale_date_format_form($form, &$form_state, $langcode) {
+  $languages = locale_language_list('native');
+  $language_name = $languages[$langcode];
+
+  // Display the current language name.
+  $form['language'] = array(
+    '#type' => 'item',
+    '#title' => t('Language'),
+    '#markup' => check_plain($language_name),
+    '#weight' => -10,
+  );
+  $form['langcode'] = array(
+    '#type' => 'value',
+    '#value' => $langcode,
+  );
+
+  // Get list of date format types.
+  $types = system_get_date_types();
+
+  // Get list of available formats.
+  $formats = system_get_date_formats();
+  $choices = array();
+  foreach ($formats as $type => $list) {
+    foreach ($list as $f => $format) {
+      $choices[$f] = format_date(REQUEST_TIME, 'custom', $f);
+    }
+  }
+  reset($formats);
+
+  // Get configured formats for each language.
+  $locale_formats = system_date_format_locale($langcode);
+  // Display a form field for each format type.
+  foreach ($types as $type => $type_info) {
+    if (!empty($locale_formats) && in_array($type, array_keys($locale_formats))) {
+      $default = $locale_formats[$type];
+    }
+    else {
+      $default = variable_get('date_format_' . $type, key($formats));
+    }
+
+    // Show date format select list.
+    $form['date_formats']['date_format_' . $type] = array(
+      '#type' => 'select',
+      '#title' => check_plain($type_info['title']),
+      '#attributes' => array('class' => array('date-format')),
+      '#default_value' => (isset($choices[$default]) ? $default : 'custom'),
+      '#options' => $choices,
+    );
+  }
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save configuration'),
+  );
+
+  return $form;
+}
+
+/**
+ * Submit handler for configuring localized date formats on the locale_date_format_form.
+ */
+function locale_date_format_form_submit($form, &$form_state) {
+  include_once DRUPAL_ROOT . '/includes/locale.inc';
+  $langcode = $form_state['values']['langcode'];
+
+  // Get list of date format types.
+  $types = system_get_date_types();
+  foreach ($types as $type => $type_info) {
+    $format = $form_state['values']['date_format_' . $type];
+    if ($format == 'custom') {
+      $format = $form_state['values']['date_format_' . $type . '_custom'];
+    }
+    locale_date_format_save($langcode, $type, $format);
+  }
+  drupal_set_message(t('Configuration saved.'));
+  $form_state['redirect'] = 'admin/config/regional/date-time/locale';
+}
+
+/**
+ * Reset locale specific date formats to the global defaults.
+ *
+ * @param $langcode
+ *   Language code, e.g. 'en'.
+ */
+function locale_date_format_reset_form($form, &$form_state, $langcode) {
+  $form['langcode'] = array('#type' => 'value', '#value' => $langcode);
+  $languages = language_list();
+  return confirm_form($form,
+    t('Are you sure you want to reset the date formats for %language to the global defaults?', array('%language' => $languages[$langcode]->name)),
+    'admin/config/regional/date-time/locale',
+    t('Resetting will remove all localized date formats for this language. This action cannot be undone.'),
+    t('Reset'), t('Cancel'));
+}
+
+/**
+ * Reset date formats for a specific language to global defaults.
+ */
+function locale_date_format_reset_form_submit($form, &$form_state) {
+  db_delete('date_format_locale')
+    ->condition('language', $form_state['values']['langcode'])
+    ->execute();
+  $form_state['redirect'] = 'admin/config/regional/date-time/locale';
+}
diff --git a/htmltest/modules/locale/locale.api.php b/htmltest/modules/locale/locale.api.php
new file mode 100644
index 00000000..1f11fc90
--- /dev/null
+++ b/htmltest/modules/locale/locale.api.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Locale module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Allows modules to define their own text groups that can be translated.
+ *
+ * @param $op
+ *   Type of operation. Currently, only supports 'groups'.
+ */
+function hook_locale($op = 'groups') {
+  switch ($op) {
+    case 'groups':
+      return array('custom' => t('Custom'));
+  }
+}
+
+/**
+ * Allow modules to react to language settings changes.
+ *
+ * Every module needing to act when the number of enabled languages changes
+ * should implement this. This is an "internal" hook and should not be invoked
+ * elsewhere. The typical implementation would trigger some kind of rebuilding,
+ * this way system components could properly react to the change of the enabled
+ * languages number.
+ */
+function hook_multilingual_settings_changed() {
+  field_info_cache_clear();
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/locale/locale.css b/htmltest/modules/locale/locale.css
new file mode 100644
index 00000000..38112b50
--- /dev/null
+++ b/htmltest/modules/locale/locale.css
@@ -0,0 +1,32 @@
+
+.locale-untranslated {
+  font-style: normal;
+  text-decoration: line-through;
+}
+
+#locale-translation-filter-form .form-item-language,
+#locale-translation-filter-form .form-item-translation,
+#locale-translation-filter-form .form-item-group {
+  float: left; /* LTR */
+  padding-right: .8em; /* LTR */
+  margin: 0.1em;
+  /**
+   * In Opera 9, DOM elements with the property of "overflow: auto"
+   * will partially hide its contents with unnecessary scrollbars when
+   * its immediate child is floated without an explicit width set.
+   */
+  width: 15em;
+}
+#locale-translation-filter-form .form-type-select select {
+  width: 100%;
+}
+#locale-translation-filter-form .form-actions {
+  float: left; /* LTR */
+  padding: 3ex 0 0 1em; /* LTR */
+}
+.language-switcher-locale-session a.active {
+  color: #0062A0;
+}
+.language-switcher-locale-session a.session-active {
+  color: #000000;
+}
diff --git a/htmltest/modules/locale/locale.datepicker.js b/htmltest/modules/locale/locale.datepicker.js
new file mode 100644
index 00000000..f8192823
--- /dev/null
+++ b/htmltest/modules/locale/locale.datepicker.js
@@ -0,0 +1,79 @@
+(function ($) {
+
+/**
+ * Attaches language support to the jQuery UI datepicker component.
+ */
+Drupal.behaviors.localeDatepicker = {
+  attach: function(context, settings) {
+    // This code accesses Drupal.settings and localized strings via Drupal.t().
+    // So this code should run after these are initialized. By placing it in an
+    // attach behavior this is assured.
+    $.datepicker.regional['drupal-locale'] = $.extend({
+      closeText: Drupal.t('Done'),
+      prevText: Drupal.t('Prev'),
+      nextText: Drupal.t('Next'),
+      currentText: Drupal.t('Today'),
+      monthNames: [
+        Drupal.t('January'),
+        Drupal.t('February'),
+        Drupal.t('March'),
+        Drupal.t('April'),
+        Drupal.t('May'),
+        Drupal.t('June'),
+        Drupal.t('July'),
+        Drupal.t('August'),
+        Drupal.t('September'),
+        Drupal.t('October'),
+        Drupal.t('November'),
+        Drupal.t('December')
+      ],
+      monthNamesShort: [
+        Drupal.t('Jan'),
+        Drupal.t('Feb'),
+        Drupal.t('Mar'),
+        Drupal.t('Apr'),
+        Drupal.t('May'),
+        Drupal.t('Jun'),
+        Drupal.t('Jul'),
+        Drupal.t('Aug'),
+        Drupal.t('Sep'),
+        Drupal.t('Oct'),
+        Drupal.t('Nov'),
+        Drupal.t('Dec')
+      ],
+      dayNames: [
+        Drupal.t('Sunday'),
+        Drupal.t('Monday'),
+        Drupal.t('Tuesday'),
+        Drupal.t('Wednesday'),
+        Drupal.t('Thursday'),
+        Drupal.t('Friday'),
+        Drupal.t('Saturday')
+      ],
+      dayNamesShort: [
+        Drupal.t('Sun'),
+        Drupal.t('Mon'),
+        Drupal.t('Tue'),
+        Drupal.t('Wed'),
+        Drupal.t('Thu'),
+        Drupal.t('Fri'),
+        Drupal.t('Sat')
+      ],
+      dayNamesMin: [
+        Drupal.t('Su'),
+        Drupal.t('Mo'),
+        Drupal.t('Tu'),
+        Drupal.t('We'),
+        Drupal.t('Th'),
+        Drupal.t('Fr'),
+        Drupal.t('Sa')
+      ],
+      dateFormat: Drupal.t('mm/dd/yy'),
+      firstDay: 0,
+      isRTL: 0
+    }, Drupal.settings.jquery.ui.datepicker);
+    $.datepicker.setDefaults($.datepicker.regional['drupal-locale']);
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/locale/locale.info b/htmltest/modules/locale/locale.info
new file mode 100644
index 00000000..a3ddef44
--- /dev/null
+++ b/htmltest/modules/locale/locale.info
@@ -0,0 +1,13 @@
+name = Locale
+description = Adds language handling functionality and enables the translation of the user interface to languages other than English.
+package = Core
+version = VERSION
+core = 7.x
+files[] = locale.test
+configure = admin/config/regional/language
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/locale/locale.install b/htmltest/modules/locale/locale.install
new file mode 100644
index 00000000..b4db757f
--- /dev/null
+++ b/htmltest/modules/locale/locale.install
@@ -0,0 +1,457 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the locale module.
+ */
+
+/**
+ * Implements hook_install().
+ */
+function locale_install() {
+  // locales_source.source and locales_target.target are not used as binary
+  // fields; non-MySQL database servers need to ensure the field type is text
+  // and that LIKE produces a case-sensitive comparison.
+
+  db_insert('languages')
+    ->fields(array(
+      'language' => 'en',
+      'name' => 'English',
+      'native' => 'English',
+      'direction' => 0,
+      'enabled' => 1,
+      'weight' => 0,
+      'javascript' => '',
+    ))
+    ->execute();
+}
+
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Add context field index and allow longer location.
+ */
+function locale_update_7000() {
+  db_drop_index('locales_source', 'source');
+  db_add_index('locales_source', 'source_context', array(array('source', 30), 'context'));
+
+  // Also drop the 'textgroup_location' index added by the i18nstrings module
+  // of the i18n project, which prevents the below schema update from running.
+  if (db_index_exists('locales_source', 'textgroup_location')) {
+    db_drop_index('locales_source', 'textgroup_location');
+  }
+
+  db_change_field('locales_source', 'location', 'location', array(
+    'type' => 'text',
+    'not null' => FALSE,
+    'size' => 'big',
+    'description' => 'Drupal path in case of online discovered translations or file path in case of imported strings.',
+  ));
+}
+
+/**
+ * Upgrade language negotiation settings.
+ */
+function locale_update_7001() {
+  require_once DRUPAL_ROOT . '/includes/language.inc';
+  require_once DRUPAL_ROOT . '/includes/locale.inc';
+  require_once DRUPAL_ROOT . '/modules/locale/locale.module';
+
+  switch (variable_get('language_negotiation', 0)) {
+    // LANGUAGE_NEGOTIATION_NONE.
+    case 0:
+      $negotiation = array();
+      break;
+
+    // LANGUAGE_NEGOTIATION_PATH_DEFAULT.
+    case 1:
+      $negotiation = array(LOCALE_LANGUAGE_NEGOTIATION_URL);
+      // In Drupal 6 path prefixes are shown for the default language only when
+      // language negotiation is set to LANGUAGE_NEGOTIATION_PATH, while in
+      // Drupal 7 path prefixes are always shown if not empty. Hence we need to
+      // ensure that the default language has an empty prefix to avoid breaking
+      // the site URLs with a prefix that previously was missing.
+      $default = language_default();
+      $default->prefix = '';
+      variable_set('language_default', $default);
+      db_update('languages')
+        ->fields(array('prefix' => $default->prefix))
+        ->condition('language', $default->language)
+        ->execute();
+      break;
+
+    // LANGUAGE_NEGOTIATION_PATH.
+    case 2:
+      $negotiation = array(LOCALE_LANGUAGE_NEGOTIATION_URL, LOCALE_LANGUAGE_NEGOTIATION_USER, LOCALE_LANGUAGE_NEGOTIATION_BROWSER);
+      break;
+
+    // LANGUAGE_NEGOTIATION_DOMAIN.
+    case 3:
+      variable_set('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN);
+      $negotiation = array(LOCALE_LANGUAGE_NEGOTIATION_URL);
+      break;
+  }
+
+  // Save the new language negotiation options.
+  language_negotiation_set(LANGUAGE_TYPE_INTERFACE, array_flip($negotiation));
+  language_negotiation_set(LANGUAGE_TYPE_CONTENT, array(LOCALE_LANGUAGE_NEGOTIATION_INTERFACE => 0));
+  language_negotiation_set(LANGUAGE_TYPE_URL, array(LOCALE_LANGUAGE_NEGOTIATION_URL => 0));
+
+  // Save admininstration UI settings.
+  $type = LANGUAGE_TYPE_INTERFACE;
+  $provider_weights = array_flip(array_keys(locale_language_negotiation_info()));
+  variable_set("locale_language_providers_weight_$type", $provider_weights);
+
+  // Unset the old language negotiation system variable.
+  variable_del('language_negotiation');
+
+  return array();
+}
+
+/**
+ * Updates URL language negotiation by adding the URL fallback detection method.
+ */
+function locale_update_7002() {
+  // language.inc may not have been included during bootstrap if there is not
+  // more than one language currently enabled.
+  require_once DRUPAL_ROOT . '/includes/language.inc';
+  $language_types_info = language_types_info();
+  $info = $language_types_info[LANGUAGE_TYPE_URL];
+  if (isset($info['fixed'])) {
+    language_negotiation_set(LANGUAGE_TYPE_URL, array_flip($info['fixed']));
+  }
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x".
+ */
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Update "language_count" variable.
+ */
+function locale_update_7003() {
+  $languages = language_list('enabled');
+  variable_set('language_count', count($languages[1]));
+}
+
+/**
+ * Remove duplicates in {locales_source}.
+ */
+function locale_update_7004() {
+  // Look up all duplicates. For each set of duplicates, we select the row
+  // with the lowest lid as the "master" that will be preserved.
+  $result_source = db_query("SELECT MIN(lid) AS lid, source, context FROM {locales_source} WHERE textgroup = 'default' GROUP BY source, context HAVING COUNT(*) > 1");
+
+  $conflict = FALSE;
+  foreach ($result_source as $source) {
+    // Find all rows in {locales_target} that are translations of the same
+    // string (incl. context).
+    $result_target = db_query("SELECT t.lid, t.language, t.plural, t.translation FROM {locales_source} s JOIN {locales_target} t ON s.lid = t.lid WHERE s.source = :source AND s.context = :context AND s.textgroup = 'default' ORDER BY lid", array(
+      ':source' => $source->source,
+      ':context' => $source->context,
+    ));
+
+    $translations = array();
+    $keep_lids = array($source->lid);
+    foreach ($result_target as $target) {
+      if (!isset($translations[$target->language])) {
+        $translations[$target->language] = $target->translation;
+        if ($target->lid != $source->lid) {
+          // Move translation to the master lid.
+          db_query('UPDATE {locales_target} SET lid = :new_lid WHERE lid = :old_lid', array(
+            ':new_lid' => $source->lid,
+            ':old_lid' => $target->lid));
+        }
+      }
+      elseif ($translations[$target->language] == $target->translation) {
+        // Delete duplicate translation.
+        db_query('DELETE FROM {locales_target} WHERE lid = :lid AND language = :language', array(
+          ':lid' => $target->lid,
+          ':language' => $target->language));
+      }
+      else {
+        // The same string is translated into several different strings in one
+        // language. We do not know which is the preferred, so we keep them all.
+        $keep_lids[] = $target->lid;
+        $conflict = TRUE;
+      }
+    }
+
+    // Delete rows in {locales_source} that are no longer referenced from
+    // {locales_target}.
+    db_delete('locales_source')
+      ->condition('source', $source->source)
+      ->condition('context', $source->context)
+      ->condition('textgroup', 'default')
+      ->condition('lid', $keep_lids, 'NOT IN')
+      ->execute();
+  }
+
+  if ($conflict) {
+    $url = 'http://drupal.org/node/746240';
+    drupal_set_message('Your {locales_source} table contains duplicates that could not be removed automatically. See <a href="' . $url .'" target="_blank">' . $url . '</a> for more information.', 'warning');
+  }
+}
+
+/**
+ * Increase {locales_languages}.formula column's length.
+ */
+function locale_update_7005() {
+  db_change_field('languages', 'formula', 'formula', array(
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => TRUE,
+    'default' => '',
+    'description' => 'Plural formula in PHP code to evaluate to get plural indexes.',
+  ));
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra".
+ */
+
+/**
+ * Implements hook_uninstall().
+ */
+function locale_uninstall() {
+  // Delete all JavaScript translation files.
+  $locale_js_directory = 'public://' . variable_get('locale_js_directory', 'languages');
+
+  if (is_dir($locale_js_directory)) {
+    $files = db_query('SELECT language, javascript FROM {languages}');
+    foreach ($files as $file) {
+      if (!empty($file->javascript)) {
+        file_unmanaged_delete($locale_js_directory . '/' . $file->language . '_' . $file->javascript . '.js');
+      }
+    }
+    // Delete the JavaScript translations directory if empty.
+    if (!file_scan_directory($locale_js_directory, '/.*/')) {
+      drupal_rmdir($locale_js_directory);
+    }
+  }
+
+  // Clear variables.
+  variable_del('language_default');
+  variable_del('language_count');
+  variable_del('language_types');
+  variable_del('locale_language_negotiation_url_part');
+  variable_del('locale_language_negotiation_session_param');
+  variable_del('language_content_type_default');
+  variable_del('language_content_type_negotiation');
+  variable_del('locale_cache_strings');
+  variable_del('locale_js_directory');
+  variable_del('javascript_parsed');
+  variable_del('locale_field_language_fallback');
+  variable_del('locale_cache_length');
+
+  foreach (language_types() as $type) {
+    variable_del("language_negotiation_$type");
+    variable_del("locale_language_providers_weight_$type");
+  }
+
+  foreach (node_type_get_types() as $type => $content_type) {
+    $setting = variable_del("language_content_type_$type");
+  }
+
+  // Switch back to English: with a $language->language value different from 'en'
+  // successive calls of t() might result in calling locale(), which in turn might
+  // try to query the unexisting {locales_source} and {locales_target} tables.
+  drupal_language_initialize();
+
+}
+
+/**
+ * Implements hook_schema().
+ */
+function locale_schema() {
+  $schema['languages'] = array(
+    'description' => 'List of all available languages in the system.',
+    'fields' => array(
+      'language' => array(
+        'type' => 'varchar',
+        'length' => 12,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => "Language code, e.g. 'de' or 'en-US'.",
+      ),
+      'name' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Language name in English.',
+      ),
+      'native' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Native language name.',
+      ),
+      'direction' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Direction of language (Left-to-Right = 0, Right-to-Left = 1).',
+      ),
+      'enabled' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Enabled flag (1 = Enabled, 0 = Disabled).',
+      ),
+      'plurals' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Number of plural indexes in this language.',
+      ),
+      'formula' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Plural formula in PHP code to evaluate to get plural indexes.',
+      ),
+      'domain' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Domain to use for this language.',
+      ),
+      'prefix' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Path prefix to use for this language.',
+      ),
+      'weight' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Weight, used in lists of languages.',
+      ),
+      'javascript' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Location of JavaScript translation file.',
+      ),
+    ),
+    'primary key' => array('language'),
+    'indexes' => array(
+      'list' => array('weight', 'name'),
+    ),
+  );
+
+  $schema['locales_source'] = array(
+    'description' => 'List of English source strings.',
+    'fields' => array(
+      'lid' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Unique identifier of this string.',
+      ),
+      'location' => array(
+        'type' => 'text',
+        'not null' => FALSE,
+        'size' => 'big',
+        'description' => 'Drupal path in case of online discovered translations or file path in case of imported strings.',
+      ),
+      'textgroup' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => 'default',
+        'description' => 'A module defined group of translations, see hook_locale().',
+      ),
+      'source' => array(
+        'type' => 'text',
+        'mysql_type' => 'blob',
+        'not null' => TRUE,
+        'description' => 'The original string in English.',
+      ),
+      'context' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The context this string applies to.',
+      ),
+      'version' => array(
+        'type' => 'varchar',
+        'length' => 20,
+        'not null' => TRUE,
+        'default' => 'none',
+        'description' => 'Version of Drupal, where the string was last used (for locales optimization).',
+      ),
+    ),
+    'primary key' => array('lid'),
+    'indexes' => array(
+      'source_context' => array(array('source', 30), 'context'),
+    ),
+  );
+
+  $schema['locales_target'] = array(
+    'description' => 'Stores translated versions of strings.',
+    'fields' => array(
+      'lid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Source string ID. References {locales_source}.lid.',
+      ),
+      'translation' => array(
+        'type' => 'text',
+        'mysql_type' => 'blob',
+        'not null' => TRUE,
+        'description' => 'Translation string value in this language.',
+      ),
+      'language' => array(
+        'type' => 'varchar',
+        'length' => 12,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Language code. References {languages}.language.',
+      ),
+      'plid' => array(
+        'type' => 'int',
+        'not null' => TRUE, // This should be NULL for no referenced string, not zero.
+        'default' => 0,
+        'description' => 'Parent lid (lid of the previous string in the plural chain) in case of plural strings. References {locales_source}.lid.',
+      ),
+      'plural' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Plural index number in case of plural strings.',
+      ),
+    ),
+    'primary key' => array('language', 'lid', 'plural'),
+    'foreign keys' => array(
+      'locales_source' => array(
+        'table' => 'locales_source',
+        'columns' => array('lid' => 'lid'),
+      ),
+    ),
+    'indexes' => array(
+      'lid'      => array('lid'),
+      'plid'     => array('plid'),
+      'plural'   => array('plural'),
+    ),
+  );
+
+  return $schema;
+}
+
diff --git a/htmltest/modules/locale/locale.module b/htmltest/modules/locale/locale.module
new file mode 100644
index 00000000..768fead6
--- /dev/null
+++ b/htmltest/modules/locale/locale.module
@@ -0,0 +1,1098 @@
+<?php
+
+/**
+ * @file
+ *   Add language handling functionality and enables the translation of the
+ *   user interface to languages other than English.
+ *
+ *   When enabled, multiple languages can be set up. The site interface
+ *   can be displayed in different languages, as well as nodes can have languages
+ *   assigned. The setup of languages and translations is completely web based.
+ *   Gettext portable object files are supported.
+ */
+
+// ---------------------------------------------------------------------------------
+// Hook implementations
+
+/**
+ * Implements hook_help().
+ */
+function locale_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#locale':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Locale module allows your Drupal site to be presented in languages other than the default English, and to be multilingual. The Locale module works by maintaining a database of translations, and examining text as it is about to be displayed. When a translation of the text is available in the language to be displayed, the translation is displayed rather than the original text. When a translation is unavailable, the original text is displayed, and then stored for review by a translator. For more information, see the online handbook entry for <a href="@locale">Locale module</a>.', array('@locale' => 'http://drupal.org/documentation/modules/locale/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Translating interface text') . '</dt>';
+      $output .= '<dd>' . t('Translations of text in the Drupal interface may be provided by:');
+      $output .= '<ul>';
+      $output .= '<li>' . t("Translating within your site, using the Locale module's integrated <a href='@translate'>translation interface</a>.", array('@translate' => url('admin/config/regional/translate'))) . '</li>';
+      $output .= '<li>' . t('Importing files from a set of existing translations, known as a translation package. A translation package enables the display of a specific version of Drupal in a specific language, and contains files in the Gettext Portable Object (<em>.po</em>) format. Although not all languages are available for every version of Drupal, translation packages for many languages are available for download from the <a href="@translations">Drupal translations page</a>.', array('@translations' => 'http://localize.drupal.org')) . '</li>';
+      $output .= '<li>' . t("If an existing translation package does not meet your needs, the Gettext Portable Object (<em>.po</em>) files within a package may be modified, or new <em>.po</em> files may be created, using a desktop Gettext editor. The Locale module's <a href='@import'>import</a> feature allows the translated strings from a new or modified <em>.po</em> file to be added to your site. The Locale module's <a href='@export'>export</a> feature generates files from your site's translated strings, that can either be shared with others or edited offline by a Gettext translation editor.", array('@import' => url('admin/config/regional/translate/import'), '@export' => url('admin/config/regional/translate/export'))) . '</li>';
+      $output .= '</ul></dd>';
+      $output .= '<dt>' . t('Configuring a multilingual site') . '</dt>';
+      $output .= '<dd>' . t("Language negotiation allows your site to automatically change language based on the domain or path used for each request. Users may (optionally) select their preferred language on their <em>My account</em> page, and your site can be configured to honor a web browser's preferred language settings. Site content can be translated using the <a href='@content-help'>Content translation module</a>.", array('@content-help' => url('admin/help/translation'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'admin/config/regional/language':
+      $output = '<p>' . t('With multiple languages enabled, interface text can be translated, registered users may select their preferred language, and authors can assign a specific language to content. <a href="@translations">Download contributed translations</a> from Drupal.org.', array('@translations' => 'http://localize.drupal.org')) . '</p>';
+      return $output;
+    case 'admin/config/regional/language/add':
+      return '<p>' . t('Add a language to be supported by your site. If your desired language is not available in the <em>Language name</em> drop-down, click <em>Custom language</em> and provide a language code and other details manually. When providing a language code manually, be sure to enter a standardized language code, since this code may be used by browsers to determine an appropriate display language.') . '</p>';
+    case 'admin/config/regional/language/configure':
+      $output = '<p>' . t("Define how to decide which language is used to display page elements (primarily text provided by Drupal and modules, such as field labels and help text). This decision is made by evaluating a series of detection methods for languages; the first detection method that gets a result will determine which language is used for that type of text. Define the order of evaluation of language detection methods on this page.") . '</p>';
+      return $output;
+    case 'admin/config/regional/language/configure/session':
+      $output = '<p>' . t('Determine the language from a request/session parameter. Example: "http://example.com?language=de" sets language to German based on the use of "de" within the "language" parameter.') . '</p>';
+      return $output;
+    case 'admin/config/regional/translate':
+      $output = '<p>' . t('This page provides an overview of available translatable strings. Drupal displays translatable strings in text groups; modules may define additional text groups containing other translatable strings. Because text groups provide a method of grouping related strings, they are often used to focus translation efforts on specific areas of the Drupal interface.') . '</p>';
+      $output .= '<p>' . t('See the <a href="@languages">Languages page</a> for more information on adding support for additional languages.', array('@languages' => url('admin/config/regional/language'))) . '</p>';
+      return $output;
+    case 'admin/config/regional/translate/import':
+      $output = '<p>' . t('This page imports the translated strings contained in an individual Gettext Portable Object (<em>.po</em>) file. Normally distributed as part of a translation package (each translation package may contain several <em>.po</em> files), a <em>.po</em> file may need to be imported after offline editing in a Gettext translation editor. Importing an individual <em>.po</em> file may be a lengthy process.') . '</p>';
+      $output .= '<p>' . t('Note that the <em>.po</em> files within a translation package are imported automatically (if available) when new modules or themes are enabled, or as new languages are added. Since this page only allows the import of one <em>.po</em> file at a time, it may be simpler to download and extract a translation package into your Drupal installation directory and <a href="@language-add">add the language</a> (which automatically imports all <em>.po</em> files within the package). Translation packages are available for download on the <a href="@translations">Drupal translation page</a>.', array('@language-add' => url('admin/config/regional/language/add'), '@translations' => 'http://localize.drupal.org')) . '</p>';
+      return $output;
+    case 'admin/config/regional/translate/export':
+      return '<p>' . t('This page exports the translated strings used by your site. An export file may be in Gettext Portable Object (<em>.po</em>) form, which includes both the original string and the translation (used to share translations with others), or in Gettext Portable Object Template (<em>.pot</em>) form, which includes the original strings only (used to create new translations with a Gettext translation editor).') . '</p>';
+    case 'admin/config/regional/translate/translate':
+      return '<p>' . t('This page allows a translator to search for specific translated and untranslated strings, and is used when creating or editing translations. (Note: For translation tasks involving many strings, it may be more convenient to <a href="@export">export</a> strings for offline editing in a desktop Gettext translation editor.) Searches may be limited to strings found within a specific text group or in a specific language.', array('@export' => url('admin/config/regional/translate/export'))) . '</p>';
+    case 'admin/structure/block/manage/%/%':
+      if ($arg[4] == 'locale' && $arg[5] == 'language') {
+        return '<p>' . t('This block is only shown if <a href="@languages">at least two languages are enabled</a> and <a href="@configuration">language negotiation</a> is set to <em>URL</em> or <em>Session</em>.', array('@languages' => url('admin/config/regional/language'), '@configuration' => url('admin/config/regional/language/configure'))) . '</p>';
+      }
+      break;
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function locale_menu() {
+  // Manage languages
+  $items['admin/config/regional/language'] = array(
+    'title' => 'Languages',
+    'description' => 'Configure languages for content and the user interface.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('locale_languages_overview_form'),
+    'access arguments' => array('administer languages'),
+    'file' => 'locale.admin.inc',
+    'weight' => -10,
+  );
+  $items['admin/config/regional/language/overview'] = array(
+    'title' => 'List',
+    'weight' => 0,
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $items['admin/config/regional/language/add'] = array(
+    'title' => 'Add language',
+    'page callback' => 'locale_languages_add_screen', // two forms concatenated
+    'access arguments' => array('administer languages'),
+    'weight' => 5,
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'locale.admin.inc',
+  );
+  $items['admin/config/regional/language/configure'] = array(
+    'title' => 'Detection and selection',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('locale_languages_configure_form'),
+    'access arguments' => array('administer languages'),
+    'weight' => 10,
+    'file' => 'locale.admin.inc',
+    'type' => MENU_LOCAL_TASK,
+  );
+  $items['admin/config/regional/language/configure/url'] = array(
+    'title' => 'URL language detection configuration',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('locale_language_providers_url_form'),
+    'access arguments' => array('administer languages'),
+    'file' => 'locale.admin.inc',
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+  );
+  $items['admin/config/regional/language/configure/session'] = array(
+    'title' => 'Session language detection configuration',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('locale_language_providers_session_form'),
+    'access arguments' => array('administer languages'),
+    'file' => 'locale.admin.inc',
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+  );
+  $items['admin/config/regional/language/edit/%'] = array(
+    'title' => 'Edit language',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('locale_languages_edit_form', 5),
+    'access arguments' => array('administer languages'),
+    'file' => 'locale.admin.inc',
+  );
+  $items['admin/config/regional/language/delete/%'] = array(
+    'title' => 'Confirm',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('locale_languages_delete_form', 5),
+    'access arguments' => array('administer languages'),
+    'file' => 'locale.admin.inc',
+  );
+
+  // Translation functionality
+  $items['admin/config/regional/translate'] = array(
+    'title' => 'Translate interface',
+    'description' => 'Translate the built in interface and optionally other text.',
+    'page callback' => 'locale_translate_overview_screen',
+    'access arguments' => array('translate interface'),
+    'file' => 'locale.admin.inc',
+    'weight' => -5,
+  );
+  $items['admin/config/regional/translate/overview'] = array(
+    'title' => 'Overview',
+    'weight' => 0,
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $items['admin/config/regional/translate/translate'] = array(
+    'title' => 'Translate',
+    'weight' => 10,
+    'type' => MENU_LOCAL_TASK,
+    'page callback' => 'locale_translate_seek_screen', // search results and form concatenated
+    'access arguments' => array('translate interface'),
+    'file' => 'locale.admin.inc',
+  );
+  $items['admin/config/regional/translate/import'] = array(
+    'title' => 'Import',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('locale_translate_import_form'),
+    'access arguments' => array('translate interface'),
+    'weight' => 20,
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'locale.admin.inc',
+  );
+  $items['admin/config/regional/translate/export'] = array(
+    'title' => 'Export',
+    'page callback' => 'locale_translate_export_screen',  // possibly multiple forms concatenated
+    'access arguments' => array('translate interface'),
+    'weight' => 30,
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'locale.admin.inc',
+  );
+  $items['admin/config/regional/translate/edit/%'] = array(
+    'title' => 'Edit string',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('locale_translate_edit_form', 5),
+    'access arguments' => array('translate interface'),
+    'file' => 'locale.admin.inc',
+  );
+  $items['admin/config/regional/translate/delete/%'] = array(
+    'title' => 'Delete string',
+    'page callback' => 'locale_translate_delete_page',
+    'page arguments' => array(5),
+    'access arguments' => array('translate interface'),
+    'file' => 'locale.admin.inc',
+  );
+
+  // Localize date formats.
+  $items['admin/config/regional/date-time/locale'] = array(
+    'title' => 'Localize',
+    'description' => 'Configure date formats for each locale',
+    'page callback' => 'locale_date_format_language_overview_page',
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => -8,
+    'file' => 'locale.admin.inc',
+  );
+  $items['admin/config/regional/date-time/locale/%/edit'] = array(
+    'title' => 'Localize date formats',
+    'description' => 'Configure date formats for each locale',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('locale_date_format_form', 5),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'locale.admin.inc',
+  );
+  $items['admin/config/regional/date-time/locale/%/reset'] = array(
+    'title' => 'Reset date formats',
+    'description' => 'Reset localized date formats to global defaults',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('locale_date_format_reset_form', 5),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'locale.admin.inc',
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_init().
+ *
+ * Initialize date formats according to the user's current locale.
+ */
+function locale_init() {
+  global $conf, $language;
+  include_once DRUPAL_ROOT . '/includes/locale.inc';
+
+  // For each date type (e.g. long, short), get the localized date format
+  // for the user's current language and override the default setting for it
+  // in $conf. This should happen on all pages except the date and time formats
+  // settings page, where we want to display the site default and not the
+  // localized version.
+  if (strpos($_GET['q'], 'admin/config/regional/date-time/formats') !== 0) {
+    $languages = array($language->language);
+
+    // Setup appropriate date formats for this locale.
+    $formats = locale_get_localized_date_format($languages);
+    foreach ($formats as $format_type => $format) {
+      $conf[$format_type] = $format;
+    }
+  }
+}
+
+/**
+ * Implements hook_permission().
+ */
+function locale_permission() {
+  return array(
+    'administer languages' => array(
+      'title' => t('Administer languages'),
+    ),
+    'translate interface' => array(
+      'title' => t('Translate interface texts'),
+      'restrict access' => TRUE,
+    ),
+  );
+}
+
+/**
+ * Implements hook_locale().
+ */
+function locale_locale($op = 'groups') {
+  switch ($op) {
+    case 'groups':
+      return array('default' => t('Built-in interface'));
+  }
+}
+
+/**
+ * Form builder callback to display language selection widget.
+ *
+ * @ingroup forms
+ * @see locale_form_alter()
+ */
+function locale_language_selector_form(&$form, &$form_state, $user) {
+  global $language;
+  $languages = language_list('enabled');
+  $languages = $languages[1];
+
+  // If the user is being created, we set the user language to the page language.
+  $user_preferred_language = $user->uid ? user_preferred_language($user) : $language;
+
+  $names = array();
+  foreach ($languages as $langcode => $item) {
+    $name = t($item->name);
+    $names[$langcode] = $name . ($item->native != $name ? ' (' . $item->native . ')' : '');
+  }
+  $form['locale'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Language settings'),
+    '#weight' => 1,
+    '#access' => ($form['#user_category'] == 'account' || ($form['#user_category'] == 'register' && user_access('administer users'))),
+  );
+
+  // Get language negotiation settings.
+  $mode = language_negotiation_get(LANGUAGE_TYPE_INTERFACE) != LANGUAGE_NEGOTIATION_DEFAULT;
+  $form['locale']['language'] = array(
+    '#type' => (count($names) <= 5 ? 'radios' : 'select'),
+    '#title' => t('Language'),
+    '#default_value' => $user_preferred_language->language,
+    '#options' => $names,
+    '#description' => $mode ? t("This account's default language for e-mails, and preferred language for site presentation.") : t("This account's default language for e-mails."),
+  );
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function locale_form_path_admin_form_alter(&$form, &$form_state) {
+  $form['language'] = array(
+    '#type' => 'select',
+    '#title' => t('Language'),
+    '#options' => array(LANGUAGE_NONE => t('All languages')) + locale_language_list('name'),
+    '#default_value' => $form['language']['#value'],
+    '#weight' => -10,
+    '#description' => t('A path alias set for a specific language will always be used when displaying this page in that language, and takes precedence over path aliases set for <em>All languages</em>.'),
+  );
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function locale_form_node_type_form_alter(&$form, &$form_state) {
+  if (isset($form['type'])) {
+    $form['workflow']['language_content_type'] = array(
+      '#type' => 'radios',
+      '#title' => t('Multilingual support'),
+      '#default_value' => variable_get('language_content_type_' . $form['#node_type']->type, 0),
+      '#options' => array(t('Disabled'), t('Enabled')),
+      '#description' => t('Enable multilingual support for this content type. If enabled, a language selection field will be added to the editing form, allowing you to select from one of the <a href="!languages">enabled languages</a>. If disabled, new posts are saved with the default language. Existing content will not be affected by changing this option.', array('!languages' => url('admin/config/regional/language'))),
+    );
+  }
+}
+
+/**
+ * Return whether the given content type has multilingual support.
+ *
+ * @return
+ *   True if multilingual support is enabled.
+ */
+function locale_multilingual_node_type($type_name) {
+  return (bool) variable_get('language_content_type_' . $type_name, 0);
+}
+
+/**
+ * Implements hook_form_alter().
+ *
+ * Adds language fields to user forms.
+ */
+function locale_form_alter(&$form, &$form_state, $form_id) {
+  // Only alter user forms if there is more than one language.
+  if (drupal_multilingual()) {
+    // Display language selector when either creating a user on the admin
+    // interface or editing a user account.
+    if ($form_id == 'user_register_form' || ($form_id == 'user_profile_form' && $form['#user_category'] == 'account')) {
+      locale_language_selector_form($form, $form_state, $form['#user']);
+    }
+  }
+}
+
+/**
+ * Implements hook_form_BASE_FORM_ID_alter().
+ */
+function locale_form_node_form_alter(&$form, &$form_state) {
+  if (isset($form['#node']->type) && locale_multilingual_node_type($form['#node']->type)) {
+    $form['language'] = array(
+      '#type' => 'select',
+      '#title' => t('Language'),
+      '#default_value' => (isset($form['#node']->language) ? $form['#node']->language : ''),
+      '#options' => array(LANGUAGE_NONE => t('Language neutral')) + locale_language_list('name'),
+    );
+  }
+  // Node type without language selector: assign the default for new nodes
+  elseif (!isset($form['#node']->nid)) {
+    $default = language_default();
+    $form['language'] = array(
+      '#type' => 'value',
+      '#value' => $default->language
+    );
+  }
+  $form['#submit'][] = 'locale_field_node_form_submit';
+}
+
+/**
+ * Form submit handler for node_form().
+ *
+ * This submit handler needs to run before entity_form_submit_build_entity()
+ * is invoked by node_form_submit_build_node(), because it alters the values of
+ * attached fields. Therefore, it cannot be a hook_node_submit() implementation.
+ */
+function locale_field_node_form_submit($form, &$form_state) {
+  locale_field_entity_form_submit('node', $form, $form_state);
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function locale_form_comment_form_alter(&$form, &$form_state, $form_id) {
+  // If a content type has multilingual support we set the content language as
+  // comment language.
+  if ($form['language']['#value'] == LANGUAGE_NONE && locale_multilingual_node_type($form['#node']->type)) {
+    global $language_content;
+    $form['language']['#value'] = $language_content->language;
+    $submit_callback = 'locale_field_comment_form_submit';
+    array_unshift($form['actions']['preview']['#submit'], $submit_callback);
+    array_unshift($form['#submit'], $submit_callback);
+  }
+}
+
+/**
+ * Form submit handler for comment_form().
+ *
+ * This submit handler needs to run before entity_form_submit_build_entity()
+ * is invoked by comment_form_submit_build_comment(), because it alters the
+ * values of attached fields.
+ */
+function locale_field_comment_form_submit($form, &$form_state) {
+  locale_field_entity_form_submit('comment', $form, $form_state);
+}
+
+/**
+ * Handles field language on submit for the given entity type.
+ *
+ * Checks if Locale is registered as a translation handler and handle possible
+ * language changes.
+ */
+function locale_field_entity_form_submit($entity_type, $form, &$form_state ) {
+  if (field_has_translation_handler($entity_type, 'locale')) {
+    $entity = (object) $form_state['values'];
+    $current_language = entity_language($entity_type, $entity);
+    list(, , $bundle) = entity_extract_ids($entity_type, $entity);
+
+    foreach (field_info_instances($entity_type, $bundle) as $instance) {
+      $field_name = $instance['field_name'];
+      $field = field_info_field($field_name);
+      $previous_language = $form[$field_name]['#language'];
+
+      // Handle a possible language change: new language values are inserted,
+      // previous ones are deleted.
+      if ($field['translatable'] && $previous_language != $current_language) {
+        $form_state['values'][$field_name][$current_language] = $entity->{$field_name}[$previous_language];
+        $form_state['values'][$field_name][$previous_language] = array();
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function locale_theme() {
+  return array(
+    'locale_languages_overview_form' => array(
+      'render element' => 'form',
+    ),
+    'locale_languages_configure_form' => array(
+      'render element' => 'form',
+    ),
+    'locale_date_format_form' => array(
+      'render element' => 'form',
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_language_alter().
+ */
+function locale_field_language_alter(&$display_language, $context) {
+  // Do not apply core language fallback rules if they are disabled or if Locale
+  // is not registered as a translation handler.
+  if (variable_get('locale_field_language_fallback', TRUE) && field_has_translation_handler($context['entity_type'], 'locale')) {
+    locale_field_language_fallback($display_language, $context['entity'], $context['language']);
+  }
+}
+
+/**
+ * Applies language fallback rules to the fields attached to the given entity.
+ *
+ * Core language fallback rules simply check if fields have a field translation
+ * for the requested language code. If so the requested language is returned,
+ * otherwise all the fallback candidates are inspected to see if there is a
+ * field translation available in another language.
+ * By default this is called by locale_field_language_alter(), but this
+ * behavior can be disabled by setting the 'locale_field_language_fallback'
+ * variable to FALSE.
+ *
+ * @param $display_language
+ *   A reference to an array of language codes keyed by field name.
+ * @param $entity
+ *   The entity to be displayed.
+ * @param $langcode
+ *   The language code $entity has to be displayed in.
+ */
+function locale_field_language_fallback(&$display_language, $entity, $langcode) {
+  // Lazily init fallback candidates to avoid unnecessary calls.
+  $fallback_candidates = NULL;
+  $field_languages = array();
+
+  foreach ($display_language as $field_name => $field_language) {
+    // If the requested language is defined for the current field use it,
+    // otherwise search for a fallback value among the fallback candidates.
+    if (isset($entity->{$field_name}[$langcode])) {
+      $display_language[$field_name] = $langcode;
+    }
+    elseif (!empty($entity->{$field_name})) {
+      if (!isset($fallback_candidates)) {
+        require_once DRUPAL_ROOT . '/includes/language.inc';
+        $fallback_candidates = language_fallback_get_candidates();
+      }
+      foreach ($fallback_candidates as $fallback_language) {
+        if (isset($entity->{$field_name}[$fallback_language])) {
+          $display_language[$field_name] = $fallback_language;
+          break;
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_entity_info_alter().
+ */
+function locale_entity_info_alter(&$entity_info) {
+  $entity_info['node']['translation']['locale'] = TRUE;
+  if (isset($entity_info['comment'])) {
+    $entity_info['comment']['translation']['locale'] = TRUE;
+  }
+}
+
+/**
+ * Implements hook_language_types_info().
+ *
+ * Defines the three core language types:
+ * - Interface language is the only configurable language type in core. It is
+ *   used by t() as the default language if none is specified.
+ * - Content language is by default non-configurable and inherits the interface
+ *   language negotiated value. It is used by the Field API to determine the
+ *   display language for fields if no explicit value is specified.
+ * - URL language is by default non-configurable and is determined through the
+ *   URL language provider or the URL fallback provider if no language can be
+ *   detected. It is used by l() as the default language if none is specified.
+ */
+function locale_language_types_info() {
+  require_once DRUPAL_ROOT . '/includes/locale.inc';
+  return array(
+    LANGUAGE_TYPE_INTERFACE => array(
+      'name' => t('User interface text'),
+      'description' => t('Order of language detection methods for user interface text. If a translation of user interface text is available in the detected language, it will be displayed.'),
+    ),
+    LANGUAGE_TYPE_CONTENT => array(
+      'name' => t('Content'),
+      'description' => t('Order of language detection methods for content. If a version of content is available in the detected language, it will be displayed.'),
+      'fixed' => array(LOCALE_LANGUAGE_NEGOTIATION_INTERFACE),
+    ),
+    LANGUAGE_TYPE_URL => array(
+      'fixed' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LOCALE_LANGUAGE_NEGOTIATION_URL_FALLBACK),
+    ),
+  );
+}
+
+/**
+ * Implements hook_language_negotiation_info().
+ */
+function locale_language_negotiation_info() {
+  $file = 'includes/locale.inc';
+  $providers = array();
+
+  $providers[LOCALE_LANGUAGE_NEGOTIATION_URL] = array(
+    'types' => array(LANGUAGE_TYPE_CONTENT, LANGUAGE_TYPE_INTERFACE, LANGUAGE_TYPE_URL),
+    'callbacks' => array(
+      'language' => 'locale_language_from_url',
+      'switcher' => 'locale_language_switcher_url',
+      'url_rewrite' => 'locale_language_url_rewrite_url',
+    ),
+    'file' => $file,
+    'weight' => -8,
+    'name' => t('URL'),
+    'description' => t('Determine the language from the URL (Path prefix or domain).'),
+    'config' => 'admin/config/regional/language/configure/url',
+  );
+
+  $providers[LOCALE_LANGUAGE_NEGOTIATION_SESSION] = array(
+    'callbacks' => array(
+      'language' => 'locale_language_from_session',
+      'switcher' => 'locale_language_switcher_session',
+      'url_rewrite' => 'locale_language_url_rewrite_session',
+    ),
+    'file' => $file,
+    'weight' => -6,
+    'name' => t('Session'),
+    'description' => t('Determine the language from a request/session parameter.'),
+    'config' => 'admin/config/regional/language/configure/session',
+  );
+
+  $providers[LOCALE_LANGUAGE_NEGOTIATION_USER] = array(
+    'callbacks' => array('language' => 'locale_language_from_user'),
+    'file' => $file,
+    'weight' => -4,
+    'name' => t('User'),
+    'description' => t("Follow the user's language preference."),
+  );
+
+  $providers[LOCALE_LANGUAGE_NEGOTIATION_BROWSER] = array(
+    'callbacks' => array('language' => 'locale_language_from_browser'),
+    'file' => $file,
+    'weight' => -2,
+    'cache' => 0,
+    'name' => t('Browser'),
+    'description' => t("Determine the language from the browser's language settings."),
+  );
+
+  $providers[LOCALE_LANGUAGE_NEGOTIATION_INTERFACE] = array(
+    'types' => array(LANGUAGE_TYPE_CONTENT),
+    'callbacks' => array('language' => 'locale_language_from_interface'),
+    'file' => $file,
+    'weight' => 8,
+    'name' => t('Interface'),
+    'description' => t('Use the detected interface language.'),
+  );
+
+  $providers[LOCALE_LANGUAGE_NEGOTIATION_URL_FALLBACK] = array(
+    'types' => array(LANGUAGE_TYPE_URL),
+    'callbacks' => array('language' => 'locale_language_url_fallback'),
+    'file' => $file,
+    'weight' => 8,
+    'name' => t('URL fallback'),
+    'description' => t('Use an already detected language for URLs if none is found.'),
+  );
+
+  return $providers;
+}
+
+/**
+ * Implements hook_modules_enabled().
+ */
+function locale_modules_enabled($modules) {
+  include_once DRUPAL_ROOT . '/includes/language.inc';
+  language_types_set();
+  language_negotiation_purge();
+}
+
+/**
+ * Implements hook_modules_disabled().
+ */
+function locale_modules_disabled($modules) {
+  locale_modules_enabled($modules);
+}
+
+// ---------------------------------------------------------------------------------
+// Locale core functionality
+
+/**
+ * Provides interface translation services.
+ *
+ * This function is called from t() to translate a string if needed.
+ *
+ * @param $string
+ *   A string to look up translation for. If omitted, all the
+ *   cached strings will be returned in all languages already
+ *   used on the page.
+ * @param $context
+ *   The context of this string.
+ * @param $langcode
+ *   Language code to use for the lookup.
+ */
+function locale($string = NULL, $context = NULL, $langcode = NULL) {
+  global $language;
+
+  // Use the advanced drupal_static() pattern, since this is called very often.
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['locale'] = &drupal_static(__FUNCTION__);
+  }
+  $locale_t = &$drupal_static_fast['locale'];
+
+
+  if (!isset($string)) {
+    // Return all cached strings if no string was specified
+    return $locale_t;
+  }
+
+  $langcode = isset($langcode) ? $langcode : $language->language;
+
+  // Store database cached translations in a static variable. Only build the
+  // cache after $language has been set to avoid an unnecessary cache rebuild.
+  if (!isset($locale_t[$langcode]) && isset($language)) {
+    $locale_t[$langcode] = array();
+    // Disabling the usage of string caching allows a module to watch for
+    // the exact list of strings used on a page. From a performance
+    // perspective that is a really bad idea, so we have no user
+    // interface for this. Be careful when turning this option off!
+    if (variable_get('locale_cache_strings', 1) == 1) {
+      if ($cache = cache_get('locale:' . $langcode, 'cache')) {
+        $locale_t[$langcode] = $cache->data;
+      }
+      elseif (lock_acquire('locale_cache_' . $langcode)) {
+        // Refresh database stored cache of translations for given language.
+        // We only store short strings used in current version, to improve
+        // performance and consume less memory.
+        $result = db_query("SELECT s.source, s.context, t.translation, t.language FROM {locales_source} s LEFT JOIN {locales_target} t ON s.lid = t.lid AND t.language = :language WHERE s.textgroup = 'default' AND s.version = :version AND LENGTH(s.source) < :length", array(':language' => $langcode, ':version' => VERSION, ':length' => variable_get('locale_cache_length', 75)));
+        foreach ($result as $data) {
+          $locale_t[$langcode][$data->context][$data->source] = (empty($data->translation) ? TRUE : $data->translation);
+        }
+        cache_set('locale:' . $langcode, $locale_t[$langcode]);
+        lock_release('locale_cache_' . $langcode);
+      }
+    }
+  }
+
+  // If we have the translation cached, skip checking the database
+  if (!isset($locale_t[$langcode][$context][$string])) {
+
+    // We do not have this translation cached, so get it from the DB.
+    $translation = db_query("SELECT s.lid, t.translation, s.version FROM {locales_source} s LEFT JOIN {locales_target} t ON s.lid = t.lid AND t.language = :language WHERE s.source = :source AND s.context = :context AND s.textgroup = 'default'", array(
+      ':language' => $langcode,
+      ':source' => $string,
+      ':context' => (string) $context,
+    ))->fetchObject();
+    if ($translation) {
+      // We have the source string at least.
+      // Cache translation string or TRUE if no translation exists.
+      $locale_t[$langcode][$context][$string] = (empty($translation->translation) ? TRUE : $translation->translation);
+
+      if ($translation->version != VERSION) {
+        // This is the first use of this string under current Drupal version. Save version
+        // and clear cache, to include the string into caching next time. Saved version is
+        // also a string-history information for later pruning of the tables.
+        db_update('locales_source')
+          ->fields(array('version' => VERSION))
+          ->condition('lid', $translation->lid)
+          ->execute();
+        cache_clear_all('locale:', 'cache', TRUE);
+      }
+    }
+    else {
+      // We don't have the source string, cache this as untranslated.
+      db_merge('locales_source')
+        ->insertFields(array(
+          'location' => request_uri(),
+          'version' => VERSION,
+        ))
+        ->key(array(
+          'source' => $string,
+          'context' => (string) $context,
+          'textgroup' => 'default',
+        ))
+        ->execute();
+      $locale_t[$langcode][$context][$string] = TRUE;
+      // Clear locale cache so this string can be added in a later request.
+      cache_clear_all('locale:', 'cache', TRUE);
+    }
+  }
+
+  return ($locale_t[$langcode][$context][$string] === TRUE ? $string : $locale_t[$langcode][$context][$string]);
+}
+
+/**
+ * Reset static variables used by locale().
+ */
+function locale_reset() {
+  drupal_static_reset('locale');
+}
+
+/**
+ * Returns plural form index for a specific number.
+ *
+ * The index is computed from the formula of this language.
+ *
+ * @param $count
+ *   Number to return plural for.
+ * @param $langcode
+ *   Optional language code to translate to a language other than
+ *   what is used to display the page.
+ *
+ * @return
+ *   The numeric index of the plural variant to use for this $langcode and
+ *   $count combination or -1 if the language was not found or does not have a
+ *   plural formula.
+ */
+function locale_get_plural($count, $langcode = NULL) {
+  global $language;
+
+  // Used to locally cache the plural formulas for all languages.
+  $plural_formulas = &drupal_static(__FUNCTION__, array());
+
+  // Used to store precomputed plural indexes corresponding to numbers
+  // individually for each language.
+  $plural_indexes = &drupal_static(__FUNCTION__ . ':plurals', array());
+
+  $langcode = $langcode ? $langcode : $language->language;
+
+  if (!isset($plural_indexes[$langcode][$count])) {
+    // Retrieve and statically cache the plural formulas for all languages.
+    if (empty($plural_formulas)) {
+      foreach (language_list() as $installed_language) {
+        $plural_formulas[$installed_language->language] = $installed_language->formula;
+      }
+    }
+    // If there is a plural formula for the language, evaluate it for the given
+    // $count and statically cache the result for the combination of language
+    // and count, since the result will always be identical.
+    if (!empty($plural_formulas[$langcode])) {
+      // $n is used inside the expression in the eval().
+      $n = $count;
+      $plural_indexes[$langcode][$count] = @eval('return intval(' . $plural_formulas[$langcode] . ');');
+    }
+    // In case there is no plural formula for English (no imported translation
+    // for English), use a default formula.
+    elseif ($langcode == 'en') {
+      $plural_indexes[$langcode][$count] = (int) ($count != 1);
+    }
+    // Otherwise, return -1 (unknown).
+    else {
+      $plural_indexes[$langcode][$count] = -1;
+    }
+  }
+  return $plural_indexes[$langcode][$count];
+}
+
+
+/**
+ * Returns a language name
+ */
+function locale_language_name($lang) {
+  $list = &drupal_static(__FUNCTION__);
+  if (!isset($list)) {
+    $list = locale_language_list();
+  }
+  return ($lang && isset($list[$lang])) ? $list[$lang] : t('All');
+}
+
+/**
+ * Returns array of language names
+ *
+ * @param $field
+ *   'name' => names in current language, localized
+ *   'native' => native names
+ * @param $all
+ *   Boolean to return all languages or only enabled ones
+ */
+function locale_language_list($field = 'name', $all = FALSE) {
+  if ($all) {
+    $languages = language_list();
+  }
+  else {
+    $languages = language_list('enabled');
+    $languages = $languages[1];
+  }
+  $list = array();
+  foreach ($languages as $language) {
+    $list[$language->language] = ($field == 'name') ? t($language->name) : $language->$field;
+  }
+  return $list;
+}
+
+/**
+ * Implements hook_modules_installed().
+ */
+function locale_modules_installed($modules) {
+  locale_system_update($modules);
+}
+
+/**
+ * Implements hook_themes_enabled().
+ *
+ * @todo This is technically wrong. We must not import upon enabling, but upon
+ *   initial installation. The theme system is missing an installation hook.
+ */
+function locale_themes_enabled($themes) {
+  locale_system_update($themes);
+}
+
+/**
+ * Imports translations when new modules or themes are installed.
+ *
+ * This function will either import translation for the component change
+ * right away, or start a batch if more files need to be imported.
+ *
+ * @param $components
+ *   An array of component (theme and/or module) names to import
+ *   translations for.
+ */
+function locale_system_update($components) {
+  include_once DRUPAL_ROOT . '/includes/locale.inc';
+  if ($batch = locale_batch_by_component($components)) {
+    batch_set($batch);
+  }
+}
+
+/**
+ * Implements hook_js_alter().
+ *
+ * This function checks all JavaScript files currently added via drupal_add_js()
+ * and invokes parsing if they have not yet been parsed for Drupal.t()
+ * and Drupal.formatPlural() calls. Also refreshes the JavaScript translation
+ * file if necessary, and adds it to the page.
+ */
+function locale_js_alter(&$javascript) {
+  global $language;
+
+  $dir = 'public://' . variable_get('locale_js_directory', 'languages');
+  $parsed = variable_get('javascript_parsed', array());
+  $files = $new_files = FALSE;
+
+  // Require because locale_js_alter() could be called without locale_init().
+  require_once DRUPAL_ROOT . '/includes/locale.inc';
+
+  foreach ($javascript as $item) {
+    if ($item['type'] == 'file') {
+      $files = TRUE;
+      $filepath = $item['data'];
+      if (!in_array($filepath, $parsed)) {
+        // Don't parse our own translations files.
+        if (substr($filepath, 0, strlen($dir)) != $dir) {
+          _locale_parse_js_file($filepath);
+          $parsed[] = $filepath;
+          $new_files = TRUE;
+        }
+      }
+    }
+  }
+
+  // If there are any new source files we parsed, invalidate existing
+  // JavaScript translation files for all languages, adding the refresh
+  // flags into the existing array.
+  if ($new_files) {
+    $parsed += _locale_invalidate_js();
+  }
+
+  // If necessary, rebuild the translation file for the current language.
+  if (!empty($parsed['refresh:' . $language->language])) {
+    // Don't clear the refresh flag on failure, so that another try will
+    // be performed later.
+    if (_locale_rebuild_js()) {
+      unset($parsed['refresh:' . $language->language]);
+    }
+    // Store any changes after refresh was attempted.
+    variable_set('javascript_parsed', $parsed);
+  }
+  // If no refresh was attempted, but we have new source files, we need
+  // to store them too. This occurs if current page is in English.
+  elseif ($new_files) {
+    variable_set('javascript_parsed', $parsed);
+  }
+
+  // Add the translation JavaScript file to the page.
+  if ($files && !empty($language->javascript)) {
+    // Add the translation JavaScript file to the page.
+    $file = $dir . '/' . $language->language . '_' . $language->javascript . '.js';
+    $javascript[$file] = drupal_js_defaults($file);
+  }
+}
+
+/**
+ * Implements hook_css_alter().
+ *
+ * This function checks all CSS files currently added via drupal_add_css() and
+ * and checks to see if a related right to left CSS file should be included.
+ */
+function locale_css_alter(&$css) {
+  global $language;
+
+  // If the current language is RTL, add the CSS file with the RTL overrides.
+  if ($language->direction == LANGUAGE_RTL) {
+    foreach ($css as $data => $item) {
+      // Only provide RTL overrides for files.
+      if ($item['type'] == 'file') {
+        $rtl_path = str_replace('.css', '-rtl.css', $item['data']);
+        if (file_exists($rtl_path) && !isset($css[$rtl_path])) {
+          // Replicate the same item, but with the RTL path and a little larger
+          // weight so that it appears directly after the original CSS file.
+          $item['data'] = $rtl_path;
+          $item['weight'] += 0.0001;
+          $css[$rtl_path] = $item;
+        }
+      }
+    }
+  }
+}
+
+ /**
+ * Implement hook_library_alter().
+ *
+ * Provides the language support for the jQuery UI Date Picker.
+ */
+function locale_library_alter(&$libraries, $module) {
+  if ($module == 'system' && isset($libraries['ui.datepicker'])) {
+    global $language;
+    // locale.datepicker.js should be added in the JS_LIBRARY group, so that
+    // this attach behavior will execute early. JS_LIBRARY is the default for
+    // hook_library_info_alter(), thus does not have to be specified explicitly.
+    $datepicker = drupal_get_path('module', 'locale') . '/locale.datepicker.js';
+    $libraries['ui.datepicker']['js'][$datepicker] = array();
+    $libraries['ui.datepicker']['js'][] = array(
+      'data' => array(
+        'jquery' => array(
+          'ui' => array(
+            'datepicker' => array(
+              'isRTL' => $language->direction == LANGUAGE_RTL,
+              'firstDay' => variable_get('date_first_day', 0),
+            ),
+          ),
+        ),
+      ),
+      'type' => 'setting',
+    );
+  }
+}
+
+// ---------------------------------------------------------------------------------
+// Language switcher block
+
+/**
+ * Implements hook_block_info().
+ */
+function locale_block_info() {
+  include_once DRUPAL_ROOT . '/includes/language.inc';
+  $block = array();
+  $info = language_types_info();
+  foreach (language_types_configurable(FALSE) as $type) {
+    $block[$type] = array(
+      'info' => t('Language switcher (@type)', array('@type' => $info[$type]['name'])),
+      // Not worth caching.
+      'cache' => DRUPAL_NO_CACHE,
+    );
+  }
+  return $block;
+}
+
+/**
+ * Implements hook_block_view().
+ *
+ * Displays a language switcher. Only show if we have at least two languages.
+ */
+function locale_block_view($type) {
+  if (drupal_multilingual()) {
+    $path = drupal_is_front_page() ? '<front>' : $_GET['q'];
+    $links = language_negotiation_get_switch_links($type, $path);
+
+    if (isset($links->links)) {
+      drupal_add_css(drupal_get_path('module', 'locale') . '/locale.css');
+      $class = "language-switcher-{$links->provider}";
+      $variables = array('links' => $links->links, 'attributes' => array('class' => array($class)));
+      $block['content'] = theme('links__locale_block', $variables);
+      $block['subject'] = t('Languages');
+      return $block;
+    }
+  }
+}
+
+/**
+ * Implements hook_url_outbound_alter().
+ *
+ * Rewrite outbound URLs with language based prefixes.
+ */
+function locale_url_outbound_alter(&$path, &$options, $original_path) {
+  // Only modify internal URLs.
+  if (!$options['external'] && drupal_multilingual()) {
+    static $drupal_static_fast;
+    if (!isset($drupal_static_fast)) {
+      $drupal_static_fast['callbacks'] = &drupal_static(__FUNCTION__);
+    }
+    $callbacks = &$drupal_static_fast['callbacks'];
+
+    if (!isset($callbacks)) {
+      $callbacks = array();
+      include_once DRUPAL_ROOT . '/includes/language.inc';
+
+      foreach (language_types_configurable() as $type) {
+        // Get URL rewriter callbacks only from enabled language providers.
+        $negotiation = variable_get("language_negotiation_$type", array());
+
+        foreach ($negotiation as $id => $provider) {
+          if (isset($provider['callbacks']['url_rewrite'])) {
+            if (isset($provider['file'])) {
+              require_once DRUPAL_ROOT . '/' . $provider['file'];
+            }
+            // Avoid duplicate callback entries.
+            $callbacks[$provider['callbacks']['url_rewrite']] = TRUE;
+          }
+        }
+      }
+
+      $callbacks = array_keys($callbacks);
+    }
+
+    foreach ($callbacks as $callback) {
+      $callback($path, $options);
+    }
+
+    // No language dependent path allowed in this mode.
+    if (empty($callbacks)) {
+      unset($options['language']);
+    }
+  }
+}
diff --git a/htmltest/modules/locale/locale.test b/htmltest/modules/locale/locale.test
new file mode 100644
index 00000000..9ffec9f1
--- /dev/null
+++ b/htmltest/modules/locale/locale.test
@@ -0,0 +1,3143 @@
+<?php
+
+/**
+ * @file
+ * Tests for locale.module.
+ *
+ * The test file includes:
+ *  - a functional test for the language configuration forms;
+ *  - functional tests for the translation functionalities, including searching;
+ *  - a functional test for the PO files import feature, including validation;
+ *  - functional tests for translations and templates export feature;
+ *  - functional tests for the uninstall process;
+ *  - a functional test for the language switching feature;
+ *  - a functional test for a user's ability to change their default language;
+ *  - a functional test for configuring a different path alias per language;
+ *  - a functional test for configuring a different path alias per language;
+ *  - a functional test for multilingual support by content type and on nodes.
+ *  - a functional test for multilingual fields.
+ *  - a functional test for comment language.
+ *  - a functional test fot language types/negotiation info.
+ */
+
+
+/**
+ * Functional tests for the language configuration forms.
+ */
+class LocaleConfigurationTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Language configuration',
+      'description' => 'Adds a new locale and tests changing its status and the default language.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale');
+  }
+
+  /**
+   * Functional tests for adding, editing and deleting languages.
+   */
+  function testLanguageConfiguration() {
+    global $base_url;
+
+    // User to add and remove language.
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages'));
+    $this->drupalLogin($admin_user);
+
+    // Add predefined language.
+    $edit = array(
+      'langcode' => 'fr',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+    $this->assertText('fr', 'Language added successfully.');
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
+
+    // Add custom language.
+    // Code for the language.
+    $langcode = 'xx';
+    // The English name for the language.
+    $name = $this->randomName(16);
+    // The native name for the language.
+    $native = $this->randomName(16);
+    // The domain prefix.
+    $prefix = $langcode;
+    $edit = array(
+      'langcode' => $langcode,
+      'name' => $name,
+      'native' => $native,
+      'prefix' => $prefix,
+      'direction' => '0',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->assertText($langcode, 'Language code found.');
+    $this->assertText($name, 'Name found.');
+    $this->assertText($native, 'Native found.');
+    $this->assertText($native, 'Test language added.');
+
+    // Check if we can change the default language.
+    $path = 'admin/config/regional/language';
+    $this->drupalGet($path);
+    $this->assertFieldChecked('edit-site-default-en', 'English is the default language.');
+    // Change the default language.
+    $edit = array(
+      'site_default' => $langcode,
+    );
+    $this->drupalPost(NULL, $edit, t('Save configuration'));
+    $this->assertNoFieldChecked('edit-site-default-en', 'Default language updated.');
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
+
+    // Check if a valid language prefix is added after changing the default
+    // language.
+    $this->drupalGet('admin/config/regional/language/edit/en');
+    $this->assertFieldByXPath('//input[@name="prefix"]', 'en', 'A valid path prefix has been added to the previous default language.');
+
+    // Ensure we can't delete the default language.
+    $this->drupalGet('admin/config/regional/language/delete/' . $langcode);
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->assertText(t('The default language cannot be deleted.'), 'Failed to delete the default language.');
+
+    // Check if we can disable a language.
+    $edit = array(
+      'enabled[en]' => FALSE,
+    );
+    $this->drupalPost($path, $edit, t('Save configuration'));
+    $this->assertNoFieldChecked('edit-enabled-en', 'Language disabled.');
+
+    // Set disabled language to be the default and ensure it is re-enabled.
+    $edit = array(
+      'site_default' => 'en',
+    );
+    $this->drupalPost(NULL, $edit, t('Save configuration'));
+    $this->assertFieldChecked('edit-enabled-en', 'Default language re-enabled.');
+
+    // Ensure 'edit' link works.
+    $this->clickLink(t('edit'));
+    $this->assertTitle(t('Edit language | Drupal'), 'Page title is "Edit language".');
+    // Edit a language.
+    $name = $this->randomName(16);
+    $edit = array(
+      'name' => $name,
+    );
+    $this->drupalPost('admin/config/regional/language/edit/' . $langcode, $edit, t('Save language'));
+    $this->assertRaw($name, 'The language has been updated.');
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
+
+    // Ensure 'delete' link works.
+    $this->drupalGet('admin/config/regional/language');
+    $this->clickLink(t('delete'));
+    $this->assertText(t('Are you sure you want to delete the language'), '"delete" link is correct.');
+    // Delete an enabled language.
+    $this->drupalGet('admin/config/regional/language/delete/' . $langcode);
+    // First test the 'cancel' link.
+    $this->clickLink(t('Cancel'));
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->assertRaw($name, 'The language was not deleted.');
+    // Delete the language for real. This a confirm form, we do not need any
+    // fields changed.
+    $this->drupalPost('admin/config/regional/language/delete/' . $langcode, array(), t('Delete'));
+    // We need raw here because %locale will add HTML.
+    $this->assertRaw(t('The language %locale has been removed.', array('%locale' => $name)), 'The test language has been removed.');
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
+    // Verify that language is no longer found.
+    $this->drupalGet('admin/config/regional/language/delete/' . $langcode);
+    $this->assertResponse(404, 'Language no longer found.');
+    // Make sure the "language_count" variable has been updated correctly.
+    drupal_static_reset('language_list');
+    $enabled = language_list('enabled');
+    $this->assertEqual(variable_get('language_count', 1), count($enabled[1]), 'Language count is correct.');
+    // Delete a disabled language.
+    // Disable an enabled language.
+    $edit = array(
+      'enabled[fr]' => FALSE,
+    );
+    $this->drupalPost($path, $edit, t('Save configuration'));
+    $this->assertNoFieldChecked('edit-enabled-fr', 'French language disabled.');
+    // Get the count of enabled languages.
+    drupal_static_reset('language_list');
+    $enabled = language_list('enabled');
+    // Delete the disabled language.
+    $this->drupalPost('admin/config/regional/language/delete/fr', array(), t('Delete'));
+    // We need raw here because %locale will add HTML.
+    $this->assertRaw(t('The language %locale has been removed.', array('%locale' => 'French')), 'Disabled language has been removed.');
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
+    // Verify that language is no longer found.
+    $this->drupalGet('admin/config/regional/language/delete/fr');
+    $this->assertResponse(404, 'Language no longer found.');
+    // Make sure the "language_count" variable has not changed.
+    $this->assertEqual(variable_get('language_count', 1), count($enabled[1]), 'Language count is correct.');
+
+
+    // Ensure we can't delete the English language.
+    $this->drupalGet('admin/config/regional/language/delete/en');
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->assertText(t('The English language cannot be deleted.'), 'Failed to delete English language.');
+  }
+
+}
+
+/**
+ * Tests localization of the JavaScript libraries.
+ *
+ * Currently, only the jQuery datepicker is localized using Drupal translations.
+ */
+class LocaleLibraryInfoAlterTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Javascript library localisation',
+      'description' => 'Tests the localisation of JavaScript libraries.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale', 'locale_test');
+  }
+
+  /**
+   * Verifies that the datepicker can be localized.
+   *
+   * @see locale_library_info_alter()
+   */
+  public function testLibraryInfoAlter() {
+    drupal_add_library('system', 'ui.datepicker');
+    $scripts = drupal_get_js();
+    $this->assertTrue(strpos($scripts, 'locale.datepicker.js'), 'locale.datepicker.js added to scripts.');
+  }
+}
+
+/**
+ * Functional tests for JavaScript parsing for translatable strings.
+ */
+class LocaleJavascriptTranslationTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Javascript translation',
+      'description' => 'Tests parsing js files for translatable strings',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale', 'locale_test');
+  }
+
+  function testFileParsing() {
+
+    $filename = drupal_get_path('module', 'locale_test') . '/locale_test.js';
+
+    // Parse the file to look for source strings.
+    _locale_parse_js_file($filename);
+
+    // Get all of the source strings that were found.
+    $source_strings = db_select('locales_source', 's')
+      ->fields('s', array('source', 'context'))
+      ->condition('s.location', $filename)
+      ->execute()
+      ->fetchAllKeyed();
+
+    // List of all strings that should be in the file.
+    $test_strings = array(
+      "Standard Call t" => '',
+      "Whitespace Call t" => '',
+
+      "Single Quote t" => '',
+      "Single Quote \\'Escaped\\' t" => '',
+      "Single Quote Concat strings t" => '',
+
+      "Double Quote t" => '',
+      "Double Quote \\\"Escaped\\\" t" => '',
+      "Double Quote Concat strings t" => '',
+
+      "Context !key Args t" => "Context string",
+
+      "Context Unquoted t" => "Context string unquoted",
+      "Context Single Quoted t" => "Context string single quoted",
+      "Context Double Quoted t" => "Context string double quoted",
+
+      "Standard Call plural" => '',
+      "Standard Call @count plural" => '',
+      "Whitespace Call plural" => '',
+      "Whitespace Call @count plural" => '',
+
+      "Single Quote plural" => '',
+      "Single Quote @count plural" => '',
+      "Single Quote \\'Escaped\\' plural" => '',
+      "Single Quote \\'Escaped\\' @count plural" => '',
+
+      "Double Quote plural" => '',
+      "Double Quote @count plural" => '',
+      "Double Quote \\\"Escaped\\\" plural" => '',
+      "Double Quote \\\"Escaped\\\" @count plural" => '',
+
+      "Context !key Args plural" => "Context string",
+      "Context !key Args @count plural" => "Context string",
+
+      "Context Unquoted plural" => "Context string unquoted",
+      "Context Unquoted @count plural" => "Context string unquoted",
+      "Context Single Quoted plural" => "Context string single quoted",
+      "Context Single Quoted @count plural" => "Context string single quoted",
+      "Context Double Quoted plural" => "Context string double quoted",
+      "Context Double Quoted @count plural" => "Context string double quoted",
+    );
+
+    // Assert that all strings were found properly.
+    foreach ($test_strings as $str => $context) {
+      $args = array('%source' => $str, '%context' => $context);
+
+      // Make sure that the string was found in the file.
+      $this->assertTrue(isset($source_strings[$str]), format_string('Found source string: %source', $args));
+
+      // Make sure that the proper context was matched.
+      $this->assertTrue(isset($source_strings[$str]) && $source_strings[$str] === $context, strlen($context) > 0 ? format_string('Context for %source is %context', $args) : format_string('Context for %source is blank', $args));
+    }
+
+    $this->assertEqual(count($source_strings), count($test_strings), 'Found correct number of source strings.');
+  }
+}
+/**
+ * Functional test for string translation and validation.
+ */
+class LocaleTranslationFunctionalTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'String translate, search and validate',
+      'description' => 'Adds a new locale and translates its name. Checks the validation of translation strings and search results.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale');
+  }
+
+  /**
+   * Adds a language and tests string translation by users with the appropriate permissions.
+   */
+  function testStringTranslation() {
+    global $base_url;
+
+    // User to add and remove language.
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages'));
+    // User to translate and delete string.
+    $translate_user = $this->drupalCreateUser(array('translate interface', 'access administration pages'));
+    // Code for the language.
+    $langcode = 'xx';
+    // The English name for the language. This will be translated.
+    $name = $this->randomName(16);
+    // The native name for the language.
+    $native = $this->randomName(16);
+    // The domain prefix.
+    $prefix = $langcode;
+    // This is the language indicator on the translation search screen for
+    // untranslated strings. Copied straight from locale.inc.
+    $language_indicator = "<em class=\"locale-untranslated\">$langcode</em> ";
+    // This will be the translation of $name.
+    $translation = $this->randomName(16);
+
+    // Add custom language.
+    $this->drupalLogin($admin_user);
+    $edit = array(
+      'langcode' => $langcode,
+      'name' => $name,
+      'native' => $native,
+      'prefix' => $prefix,
+      'direction' => '0',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
+    // Add string.
+    t($name, array(), array('langcode' => $langcode));
+    // Reset locale cache.
+    locale_reset();
+    $this->assertText($langcode, 'Language code found.');
+    $this->assertText($name, 'Name found.');
+    $this->assertText($native, 'Native found.');
+    // No t() here, we do not want to add this string to the database and it's
+    // surely not translated yet.
+    $this->assertText($native, 'Test language added.');
+    $this->drupalLogout();
+
+    // Search for the name and translate it.
+    $this->drupalLogin($translate_user);
+    $search = array(
+      'string' => $name,
+      'language' => 'all',
+      'translation' => 'all',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    // assertText() seems to remove the input field where $name always could be
+    // found, so this is not a false assert. See how assertNoText succeeds
+    // later.
+    $this->assertText($name, 'Search found the name.');
+    $this->assertRaw($language_indicator, 'Name is untranslated.');
+    // Assume this is the only result, given the random name.
+    $this->clickLink(t('edit'));
+    // We save the lid from the path.
+    $matches = array();
+    preg_match('!admin/config/regional/translate/edit/(\d+)!', $this->getUrl(), $matches);
+    $lid = $matches[1];
+    // No t() here, it's surely not translated yet.
+    $this->assertText($name, 'name found on edit screen.');
+    $edit = array(
+      "translations[$langcode]" => $translation,
+    );
+    $this->drupalPost(NULL, $edit, t('Save translations'));
+    $this->assertText(t('The string has been saved.'), 'The string has been saved.');
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/translate', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->assertTrue($name != $translation && t($name, array(), array('langcode' => $langcode)) == $translation, 't() works.');
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    // The indicator should not be here.
+    $this->assertNoRaw($language_indicator, 'String is translated.');
+
+    // Try to edit a non-existent string and ensure we're redirected correctly.
+    // Assuming we don't have 999,999 strings already.
+    $random_lid = 999999;
+    $this->drupalGet('admin/config/regional/translate/edit/' . $random_lid);
+    $this->assertText(t('String not found'), 'String not found.');
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/translate', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->drupalLogout();
+
+    // Delete the language.
+    $this->drupalLogin($admin_user);
+    $path = 'admin/config/regional/language/delete/' . $langcode;
+    // This a confirm form, we do not need any fields changed.
+    $this->drupalPost($path, array(), t('Delete'));
+    // We need raw here because %locale will add HTML.
+    $this->assertRaw(t('The language %locale has been removed.', array('%locale' => $name)), 'The test language has been removed.');
+    // Reload to remove $name.
+    $this->drupalGet($path);
+    // Verify that language is no longer found.
+    $this->assertResponse(404, 'Language no longer found.');
+    $this->drupalLogout();
+
+    // Delete the string.
+    $this->drupalLogin($translate_user);
+    $search = array(
+      'string' => $name,
+      'language' => 'all',
+      'translation' => 'all',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    // Assume this is the only result, given the random name.
+    $this->clickLink(t('delete'));
+    $this->assertText(t('Are you sure you want to delete the string'), '"delete" link is correct.');
+    // Delete the string.
+    $path = 'admin/config/regional/translate/delete/' . $lid;
+    $this->drupalGet($path);
+    // First test the 'cancel' link.
+    $this->clickLink(t('Cancel'));
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/translate', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->assertRaw($name, 'The string was not deleted.');
+    // Delete the name string.
+    $this->drupalPost('admin/config/regional/translate/delete/' . $lid, array(), t('Delete'));
+    $this->assertText(t('The string has been removed.'), 'The string has been removed message.');
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/translate', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertNoText($name, 'Search now can not find the name.');
+  }
+
+  /*
+   * Adds a language and checks that the JavaScript translation files are
+   * properly created and rebuilt on deletion.
+   */
+  function testJavaScriptTranslation() {
+    $user = $this->drupalCreateUser(array('translate interface', 'administer languages', 'access administration pages'));
+    $this->drupalLogin($user);
+
+    $langcode = 'xx';
+    // The English name for the language. This will be translated.
+    $name = $this->randomName(16);
+    // The native name for the language.
+    $native = $this->randomName(16);
+    // The domain prefix.
+    $prefix = $langcode;
+
+    // Add custom language.
+    $edit = array(
+      'langcode' => $langcode,
+      'name' => $name,
+      'native' => $native,
+      'prefix' => $prefix,
+      'direction' => '0',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
+    drupal_static_reset('language_list');
+
+    // Build the JavaScript translation file.
+    $this->drupalGet('admin/config/regional/translate/translate');
+
+    // Retrieve the id of the first string available in the {locales_source}
+    // table and translate it.
+    $query = db_select('locales_source', 'l');
+    $query->addExpression('min(l.lid)', 'lid');
+    $result = $query->condition('l.location', '%.js%', 'LIKE')
+      ->condition('l.textgroup', 'default')
+      ->execute();
+    $url = 'admin/config/regional/translate/edit/' . $result->fetchObject()->lid;
+    $edit = array('translations['. $langcode .']' => $this->randomName());
+    $this->drupalPost($url, $edit, t('Save translations'));
+
+    // Trigger JavaScript translation parsing and building.
+    require_once DRUPAL_ROOT . '/includes/locale.inc';
+    _locale_rebuild_js($langcode);
+
+    // Retrieve the JavaScript translation hash code for the custom language to
+    // check that the translation file has been properly built.
+    $file = db_select('languages', 'l')
+      ->fields('l', array('javascript'))
+      ->condition('language', $langcode)
+      ->execute()
+      ->fetchObject();
+    $js_file = 'public://' . variable_get('locale_js_directory', 'languages') . '/' . $langcode . '_' . $file->javascript . '.js';
+    $this->assertTrue($result = file_exists($js_file), format_string('JavaScript file created: %file', array('%file' => $result ? $js_file : 'not found')));
+
+    // Test JavaScript translation rebuilding.
+    file_unmanaged_delete($js_file);
+    $this->assertTrue($result = !file_exists($js_file), format_string('JavaScript file deleted: %file', array('%file' => $result ? $js_file : 'found')));
+    cache_clear_all();
+    _locale_rebuild_js($langcode);
+    $this->assertTrue($result = file_exists($js_file), format_string('JavaScript file rebuilt: %file', array('%file' => $result ? $js_file : 'not found')));
+  }
+
+  /**
+   * Tests the validation of the translation input.
+   */
+  function testStringValidation() {
+    global $base_url;
+
+    // User to add language and strings.
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages', 'translate interface'));
+    $this->drupalLogin($admin_user);
+    $langcode = 'xx';
+    // The English name for the language. This will be translated.
+    $name = $this->randomName(16);
+    // The native name for the language.
+    $native = $this->randomName(16);
+    // The domain prefix.
+    $prefix = $langcode;
+    // This is the language indicator on the translation search screen for
+    // untranslated strings. Copied straight from locale.inc.
+    $language_indicator = "<em class=\"locale-untranslated\">$langcode</em> ";
+    // These will be the invalid translations of $name.
+    $key = $this->randomName(16);
+    $bad_translations[$key] = "<script>alert('xss');</script>" . $key;
+    $key = $this->randomName(16);
+    $bad_translations[$key] = '<img SRC="javascript:alert(\'xss\');">' . $key;
+    $key = $this->randomName(16);
+    $bad_translations[$key] = '<<SCRIPT>alert("xss");//<</SCRIPT>' . $key;
+    $key = $this->randomName(16);
+    $bad_translations[$key] ="<BODY ONLOAD=alert('xss')>" . $key;
+
+    // Add custom language.
+    $edit = array(
+      'langcode' => $langcode,
+      'name' => $name,
+      'native' => $native,
+      'prefix' => $prefix,
+      'direction' => '0',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
+    // Add string.
+    t($name, array(), array('langcode' => $langcode));
+    // Reset locale cache.
+    $search = array(
+      'string' => $name,
+      'language' => 'all',
+      'translation' => 'all',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    // Find the edit path.
+    $content = $this->drupalGetContent();
+    $this->assertTrue(preg_match('@(admin/config/regional/translate/edit/[0-9]+)@', $content, $matches), 'Found the edit path.');
+    $path = $matches[0];
+    foreach ($bad_translations as $key => $translation) {
+      $edit = array(
+        "translations[$langcode]" => $translation,
+      );
+      $this->drupalPost($path, $edit, t('Save translations'));
+      // Check for a form error on the textarea.
+      $form_class = $this->xpath('//form[@id="locale-translate-edit-form"]//textarea/@class');
+      $this->assertNotIdentical(FALSE, strpos($form_class[0], 'error'), 'The string was rejected as unsafe.');
+      $this->assertNoText(t('The string has been saved.'), 'The string was not saved.');
+    }
+  }
+
+  /**
+   * Tests translation search form.
+   */
+  function testStringSearch() {
+    global $base_url;
+
+    // User to add and remove language.
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages'));
+    // User to translate and delete string.
+    $translate_user = $this->drupalCreateUser(array('translate interface', 'access administration pages'));
+
+    // Code for the language.
+    $langcode = 'xx';
+    // The English name for the language. This will be translated.
+    $name = $this->randomName(16);
+    // The native name for the language.
+    $native = $this->randomName(16);
+    // The domain prefix.
+    $prefix = $langcode;
+    // This is the language indicator on the translation search screen for
+    // untranslated strings. Copied straight from locale.inc.
+    $language_indicator = "<em class=\"locale-untranslated\">$langcode</em> ";
+    // This will be the translation of $name.
+    $translation = $this->randomName(16);
+
+    // Add custom language.
+    $this->drupalLogin($admin_user);
+    $edit = array(
+      'langcode' => $langcode,
+      'name' => $name,
+      'native' => $native,
+      'prefix' => $prefix,
+      'direction' => '0',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
+    // Add string.
+    t($name, array(), array('langcode' => $langcode));
+    // Reset locale cache.
+    locale_reset();
+    $this->drupalLogout();
+
+    // Search for the name.
+    $this->drupalLogin($translate_user);
+    $search = array(
+      'string' => $name,
+      'language' => 'all',
+      'translation' => 'all',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    // assertText() seems to remove the input field where $name always could be
+    // found, so this is not a false assert. See how assertNoText succeeds
+    // later.
+    $this->assertText($name, 'Search found the string.');
+
+    // Ensure untranslated string doesn't appear if searching on 'only
+    // translated strings'.
+    $search = array(
+      'string' => $name,
+      'language' => 'all',
+      'translation' => 'translated',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertText(t('No strings available.'), "Search didn't find the string.");
+
+    // Ensure untranslated string appears if searching on 'only untranslated
+    // strings' in "all" (hasn't been translated to any language).
+    $search = array(
+      'string' => $name,
+      'language' => 'all',
+      'translation' => 'untranslated',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertNoText(t('No strings available.'), 'Search found the string.');
+
+    // Ensure untranslated string appears if searching on 'only untranslated
+    // strings' in the custom language (hasn't been translated to that specific language).
+    $search = array(
+      'string' => $name,
+      'language' => $langcode,
+      'translation' => 'untranslated',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertNoText(t('No strings available.'), 'Search found the string.');
+
+    // Add translation.
+    // Assume this is the only result, given the random name.
+    $this->clickLink(t('edit'));
+    // We save the lid from the path.
+    $matches = array();
+    preg_match('!admin/config/regional/translate/edit/(\d)+!', $this->getUrl(), $matches);
+    $lid = $matches[1];
+    $edit = array(
+      "translations[$langcode]" => $translation,
+    );
+    $this->drupalPost(NULL, $edit, t('Save translations'));
+
+    // Ensure translated string does appear if searching on 'only
+    // translated strings'.
+    $search = array(
+      'string' => $translation,
+      'language' => 'all',
+      'translation' => 'translated',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertNoText(t('No strings available.'), 'Search found the translation.');
+
+    // Ensure translated source string doesn't appear if searching on 'only
+    // untranslated strings'.
+    $search = array(
+      'string' => $name,
+      'language' => 'all',
+      'translation' => 'untranslated',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertText(t('No strings available.'), "Search didn't find the source string.");
+
+    // Ensure translated string doesn't appear if searching on 'only
+    // untranslated strings'.
+    $search = array(
+      'string' => $translation,
+      'language' => 'all',
+      'translation' => 'untranslated',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertText(t('No strings available.'), "Search didn't find the translation.");
+
+    // Ensure translated string does appear if searching on the custom language.
+    $search = array(
+      'string' => $translation,
+      'language' => $langcode,
+      'translation' => 'all',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertNoText(t('No strings available.'), 'Search found the translation.');
+
+    // Ensure translated string doesn't appear if searching on English.
+    $search = array(
+      'string' => $translation,
+      'language' => 'en',
+      'translation' => 'all',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertText(t('No strings available.'), "Search didn't find the translation.");
+
+    // Search for a string that isn't in the system.
+    $unavailable_string = $this->randomName(16);
+    $search = array(
+      'string' => $unavailable_string,
+      'language' => 'all',
+      'translation' => 'all',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertText(t('No strings available.'), "Search didn't find the invalid string.");
+  }
+}
+
+/**
+ * Tests plural index computation functionality.
+ */
+class LocalePluralFormatTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Plural formula evaluation',
+      'description' => 'Tests plural formula evaluation for various languages.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale', 'locale_test');
+
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'translate interface', 'access administration pages'));
+    $this->drupalLogin($admin_user);
+
+    // Import some .po files with formulas to set up the environment.
+    // These will also add the languages to the system and enable them.
+    $this->importPoFile($this->getPoFileWithSimplePlural(), array(
+      'langcode' => 'fr',
+    ));
+    $this->importPoFile($this->getPoFileWithComplexPlural(), array(
+      'langcode' => 'hr',
+    ));
+  }
+
+  /**
+   * Tests locale_get_plural() functionality.
+   */
+  function testGetPluralFormat() {
+    $this->drupalGet('locale_test_plural_format_page');
+    $tests = _locale_test_plural_format_tests();
+    $result = array();
+    foreach ($tests as $test) {
+      $this->assertPluralFormat($test['count'], $test['language'], $test['expected-result']);
+    }
+  }
+
+  /**
+   * Helper assert to test locale_get_plural page.
+   *
+   * @param $count
+   *  Number for testing.
+   * @param $lang
+   *  Language for testing
+   * @param $expected_result
+   *   Expected result.
+   * @param $message
+   */
+  function assertPluralFormat($count, $lang, $expected_result) {
+    $message_param =  array(
+      '@lang' => $lang,
+      '@count' => $count,
+      '@expected_result' => $expected_result,
+    );
+    $message = t("Computed plural index for '@lang' with count @count is @expected_result.", $message_param);
+
+    $message_param = array(
+      '@lang' => $lang,
+      '@expected_result' => $expected_result,
+    );
+    $this->assertText(format_string('Language: @lang, locale_get_plural: @expected_result.', $message_param, $message));
+  }
+
+  /**
+   * Imports a standalone .po file in a given language.
+   *
+   * @param $contents
+   *   Contents of the .po file to import.
+   * @param $options
+   *   Additional options to pass to the translation import form.
+   */
+  function importPoFile($contents, array $options = array()) {
+    $name = tempnam('temporary://', "po_") . '.po';
+    file_put_contents($name, $contents);
+    $options['files[file]'] = $name;
+    $this->drupalPost('admin/config/regional/translate/import', $options, t('Import'));
+    drupal_unlink($name);
+  }
+
+  /**
+   * Returns a .po file with a simple plural formula.
+   */
+  function getPoFileWithSimplePlural() {
+    return <<< EOF
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 7\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\\n"
+
+msgid "One sheep"
+msgid_plural "@count sheep"
+msgstr[0] "un mouton"
+msgstr[1] "@count moutons"
+
+msgid "Monday"
+msgstr "lundi"
+EOF;
+  }
+
+  /**
+   * Returns a .po file with a complex plural formula.
+   */
+  function getPoFileWithComplexPlural() {
+    return <<< EOF
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 7\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n"
+
+msgid "1 hour"
+msgid_plural "@count hours"
+msgstr[0] "@count sat"
+msgstr[1] "@count sata"
+msgstr[2] "@count sati"
+
+msgid "Monday"
+msgstr "Ponedjeljak"
+EOF;
+  }
+}
+
+/**
+ * Functional tests for the import of translation files.
+ */
+class LocaleImportFunctionalTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Translation import',
+      'description' => 'Tests the import of locale files.',
+      'group' => 'Locale',
+    );
+  }
+
+  /**
+   * A user able to create languages and import translations.
+   */
+  protected $admin_user = NULL;
+
+  function setUp() {
+    parent::setUp('locale', 'locale_test');
+
+    $this->admin_user = $this->drupalCreateUser(array('administer languages', 'translate interface', 'access administration pages'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Test import of standalone .po files.
+   */
+  function testStandalonePoFile() {
+    // Try importing a .po file.
+    $this->importPoFile($this->getPoFile(), array(
+      'langcode' => 'fr',
+    ));
+
+    // The import should automatically create the corresponding language.
+    $this->assertRaw(t('The language %language has been created.', array('%language' => 'French')), 'The language has been automatically created.');
+
+    // The import should have created 7 strings.
+    $this->assertRaw(t('The translation was successfully imported. There are %number newly created translated strings, %update strings were updated and %delete strings were removed.', array('%number' => 9, '%update' => 0, '%delete' => 0)), 'The translation file was successfully imported.');
+
+    // This import should have saved plural forms to have 2 variants.
+    $this->assert(db_query("SELECT plurals FROM {languages} WHERE language = 'fr'")->fetchField() == 2, 'Plural number initialized.');
+
+    // Ensure we were redirected correctly.
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/translate', array('absolute' => TRUE)), 'Correct page redirection.');
+
+
+    // Try importing a .po file with invalid tags in the default text group.
+    $this->importPoFile($this->getBadPoFile(), array(
+      'langcode' => 'fr',
+    ));
+
+    // The import should have created 1 string and rejected 2.
+    $this->assertRaw(t('The translation was successfully imported. There are %number newly created translated strings, %update strings were updated and %delete strings were removed.', array('%number' => 1, '%update' => 0, '%delete' => 0)), 'The translation file was successfully imported.');
+    $skip_message = format_plural(2, 'One translation string was skipped because it contains disallowed HTML.', '@count translation strings were skipped because they contain disallowed HTML.');
+    $this->assertRaw($skip_message, 'Unsafe strings were skipped.');
+
+
+    // Try importing a .po file with invalid tags in a non default text group.
+    $this->importPoFile($this->getBadPoFile(), array(
+      'langcode' => 'fr',
+      'group' => 'custom',
+    ));
+
+    // The import should have created 3 strings.
+    $this->assertRaw(t('The translation was successfully imported. There are %number newly created translated strings, %update strings were updated and %delete strings were removed.', array('%number' => 3, '%update' => 0, '%delete' => 0)), 'The translation file was successfully imported.');
+
+
+    // Try importing a .po file which doesn't exist.
+    $name = $this->randomName(16);
+    $this->drupalPost('admin/config/regional/translate/import', array(
+      'langcode' => 'fr',
+      'files[file]' => $name,
+      'group' => 'custom',
+    ), t('Import'));
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/import', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->assertText(t('File to import not found.'), 'File to import not found message.');
+
+
+    // Try importing a .po file with overriding strings, and ensure existing
+    // strings are kept.
+    $this->importPoFile($this->getOverwritePoFile(), array(
+      'langcode' => 'fr',
+      'mode' => 1, // Existing strings are kept, only new strings are added.
+    ));
+
+    // The import should have created 1 string.
+    $this->assertRaw(t('The translation was successfully imported. There are %number newly created translated strings, %update strings were updated and %delete strings were removed.', array('%number' => 1, '%update' => 0, '%delete' => 0)), 'The translation file was successfully imported.');
+    // Ensure string wasn't overwritten.
+    $search = array(
+      'string' => 'Montag',
+      'language' => 'fr',
+      'translation' => 'translated',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertText(t('No strings available.'), 'String not overwritten by imported string.');
+
+    // This import should not have changed number of plural forms.
+    $this->assert(db_query("SELECT plurals FROM {languages} WHERE language = 'fr'")->fetchField() == 2, 'Plural numbers untouched.');
+
+    $this->importPoFile($this->getPoFileWithBrokenPlural(), array(
+      'langcode' => 'fr',
+      'mode' => 1, // Existing strings are kept, only new strings are added.
+    ));
+
+    // Attempt to import broken .po file as well to prove that this
+    // will not overwrite the proper plural formula imported above.
+    $this->assert(db_query("SELECT plurals FROM {languages} WHERE language = 'fr'")->fetchField() == 2, 'Broken plurals: plural numbers untouched.');
+
+    $this->importPoFile($this->getPoFileWithMissingPlural(), array(
+      'langcode' => 'fr',
+      'mode' => 1, // Existing strings are kept, only new strings are added.
+    ));
+
+    // Attempt to import .po file which has no plurals and prove that this
+    // will not overwrite the proper plural formula imported above.
+    $this->assert(db_query("SELECT plurals FROM {languages} WHERE language = 'fr'")->fetchField() == 2, 'No plurals: plural numbers untouched.');
+
+
+    // Try importing a .po file with overriding strings, and ensure existing
+    // strings are overwritten.
+    $this->importPoFile($this->getOverwritePoFile(), array(
+      'langcode' => 'fr',
+      'mode' => 0, // Strings in the uploaded file replace existing ones, new ones are added.
+    ));
+
+    // The import should have updated 2 strings.
+    $this->assertRaw(t('The translation was successfully imported. There are %number newly created translated strings, %update strings were updated and %delete strings were removed.', array('%number' => 0, '%update' => 2, '%delete' => 0)), 'The translation file was successfully imported.');
+    // Ensure string was overwritten.
+    $search = array(
+      'string' => 'Montag',
+      'language' => 'fr',
+      'translation' => 'translated',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertNoText(t('No strings available.'), 'String overwritten by imported string.');
+    // This import should have changed number of plural forms.
+    $this->assert(db_query("SELECT plurals FROM {languages} WHERE language = 'fr'")->fetchField() == 3, 'Plural numbers changed.');
+  }
+
+  /**
+   * Test automatic import of a module's translation files when a language is
+   * enabled.
+   */
+  function testAutomaticModuleTranslationImportLanguageEnable() {
+    // Code for the language - manually set to match the test translation file.
+    $langcode = 'xx';
+    // The English name for the language.
+    $name = $this->randomName(16);
+    // The native name for the language.
+    $native = $this->randomName(16);
+    // The domain prefix.
+    $prefix = $langcode;
+
+    // Create a custom language.
+    $edit = array(
+      'langcode' => $langcode,
+      'name' => $name,
+      'native' => $native,
+      'prefix' => $prefix,
+      'direction' => '0',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
+
+    // Ensure the translation file was automatically imported when language was
+    // added.
+    $this->assertText(t('One translation file imported for the enabled modules.'), 'Language file automatically imported.');
+
+    // Ensure strings were successfully imported.
+    $search = array(
+      'string' => 'lundi',
+      'language' => $langcode,
+      'translation' => 'translated',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    $this->assertNoText(t('No strings available.'), 'String successfully imported.');
+  }
+
+  /**
+   * Test msgctxt context support.
+   */
+  function testLanguageContext() {
+    // Try importing a .po file.
+    $this->importPoFile($this->getPoFileWithContext(), array(
+      'langcode' => 'hr',
+    ));
+
+    $this->assertIdentical(t('May', array(), array('langcode' => 'hr', 'context' => 'Long month name')), 'Svibanj', 'Long month name context is working.');
+    $this->assertIdentical(t('May', array(), array('langcode' => 'hr')), 'Svi.', 'Default context is working.');
+  }
+
+  /**
+   * Test empty msgstr at end of .po file see #611786.
+   */
+  function testEmptyMsgstr() {
+    $langcode = 'hu';
+
+    // Try importing a .po file.
+    $this->importPoFile($this->getPoFileWithMsgstr(), array(
+      'langcode' => $langcode,
+    ));
+
+    $this->assertRaw(t('The translation was successfully imported. There are %number newly created translated strings, %update strings were updated and %delete strings were removed.', array('%number' => 1, '%update' => 0, '%delete' => 0)), 'The translation file was successfully imported.');
+    $this->assertIdentical(t('Operations', array(), array('langcode' => $langcode)), 'Műveletek', 'String imported and translated.');
+
+    // Try importing a .po file.
+    $this->importPoFile($this->getPoFileWithEmptyMsgstr(), array(
+      'langcode' => $langcode,
+      'mode' => 0,
+    ));
+    $this->assertRaw(t('The translation was successfully imported. There are %number newly created translated strings, %update strings were updated and %delete strings were removed.', array('%number' => 0, '%update' => 0, '%delete' => 1)), 'The translation file was successfully imported.');
+    // This is the language indicator on the translation search screen for
+    // untranslated strings. Copied straight from locale.inc.
+    $language_indicator = "<em class=\"locale-untranslated\">$langcode</em> ";
+    $str = "Operations";
+    $search = array(
+      'string' => $str,
+      'language' => 'all',
+      'translation' => 'all',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    // assertText() seems to remove the input field where $str always could be
+    // found, so this is not a false assert.
+    $this->assertText($str, 'Search found the string.');
+    $this->assertRaw($language_indicator, 'String is untranslated again.');
+  }
+
+  /**
+   * Helper function: import a standalone .po file in a given language.
+   *
+   * @param $contents
+   *   Contents of the .po file to import.
+   * @param $options
+   *   Additional options to pass to the translation import form.
+   */
+  function importPoFile($contents, array $options = array()) {
+    $name = tempnam('temporary://', "po_") . '.po';
+    file_put_contents($name, $contents);
+    $options['files[file]'] = $name;
+    $this->drupalPost('admin/config/regional/translate/import', $options, t('Import'));
+    drupal_unlink($name);
+  }
+
+  /**
+   * Helper function that returns a proper .po file.
+   */
+  function getPoFile() {
+    return <<< EOF
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 7\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\\n"
+
+msgid "One sheep"
+msgid_plural "@count sheep"
+msgstr[0] "un mouton"
+msgstr[1] "@count moutons"
+
+msgid "Monday"
+msgstr "lundi"
+
+msgid "Tuesday"
+msgstr "mardi"
+
+msgid "Wednesday"
+msgstr "mercredi"
+
+msgid "Thursday"
+msgstr "jeudi"
+
+msgid "Friday"
+msgstr "vendredi"
+
+msgid "Saturday"
+msgstr "samedi"
+
+msgid "Sunday"
+msgstr "dimanche"
+EOF;
+  }
+
+  /**
+   * Helper function that returns a bad .po file.
+   */
+  function getBadPoFile() {
+    return <<< EOF
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 7\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\\n"
+
+msgid "Save configuration"
+msgstr "Enregistrer la configuration"
+
+msgid "edit"
+msgstr "modifier<img SRC="javascript:alert(\'xss\');">"
+
+msgid "delete"
+msgstr "supprimer<script>alert('xss');</script>"
+
+EOF;
+  }
+
+  /**
+   * Helper function that returns a proper .po file, for testing overwriting
+   * existing translations.
+   */
+  function getOverwritePoFile() {
+    return <<< EOF
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 7\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n"
+
+msgid "Monday"
+msgstr "Montag"
+
+msgid "Day"
+msgstr "Jour"
+EOF;
+  }
+
+  /**
+   * Helper function that returns a .po file with context.
+   */
+  function getPoFileWithContext() {
+    // Croatian (code hr) is one the the languages that have a different
+    // form for the full name and the abbreviated name for the month May.
+    return <<< EOF
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 7\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n"
+
+msgctxt "Long month name"
+msgid "May"
+msgstr "Svibanj"
+
+msgid "May"
+msgstr "Svi."
+EOF;
+  }
+
+  /**
+   * Helper function that returns a .po file with an empty last item.
+   */
+  function getPoFileWithEmptyMsgstr() {
+    return <<< EOF
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 7\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\\n"
+
+msgid "Operations"
+msgstr ""
+
+EOF;
+  }
+  /**
+   * Helper function that returns a .po file with an empty last item.
+   */
+  function getPoFileWithMsgstr() {
+    return <<< EOF
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 7\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\\n"
+
+msgid "Operations"
+msgstr "Műveletek"
+
+msgid "Will not appear in Drupal core, so we can ensure the test passes"
+msgstr ""
+
+EOF;
+  }
+
+
+  /**
+   * Returns a .po file with a missing plural formula.
+   */
+  function getPoFileWithMissingPlural() {
+    return <<< EOF
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 7\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+
+msgid "Monday"
+msgstr "Ponedjeljak"
+EOF;
+  }
+
+  /**
+   * Returns a .po file with a broken plural formula.
+   */
+  function getPoFileWithBrokenPlural() {
+    return <<< EOF
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 7\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"Plural-Forms: broken, will not parse\\n"
+
+msgid "Monday"
+msgstr "lundi"
+EOF;
+  }
+
+}
+
+/**
+ * Functional tests for the export of translation files.
+ */
+class LocaleExportFunctionalTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Translation export',
+      'description' => 'Tests the exportation of locale files.',
+      'group' => 'Locale',
+    );
+  }
+
+  /**
+   * A user able to create languages and export translations.
+   */
+  protected $admin_user = NULL;
+
+  function setUp() {
+    parent::setUp('locale', 'locale_test');
+
+    $this->admin_user = $this->drupalCreateUser(array('administer languages', 'translate interface', 'access administration pages'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Test exportation of translations.
+   */
+  function testExportTranslation() {
+    // First import some known translations.
+    // This will also automatically enable the 'fr' language.
+    $name = tempnam('temporary://', "po_") . '.po';
+    file_put_contents($name, $this->getPoFile());
+    $this->drupalPost('admin/config/regional/translate/import', array(
+      'langcode' => 'fr',
+      'files[file]' => $name,
+    ), t('Import'));
+    drupal_unlink($name);
+
+    // Get the French translations.
+    $this->drupalPost('admin/config/regional/translate/export', array(
+      'langcode' => 'fr',
+    ), t('Export'));
+
+    // Ensure we have a translation file.
+    $this->assertRaw('# French translation of Drupal', 'Exported French translation file.');
+    // Ensure our imported translations exist in the file.
+    $this->assertRaw('msgstr "lundi"', 'French translations present in exported file.');
+  }
+
+  /**
+   * Test exportation of translation template file.
+   */
+  function testExportTranslationTemplateFile() {
+    // Get the translation template file.
+    // There are two 'Export' buttons on this page, but it somehow works.  It'd
+    // be better if we could use the submit button id like documented but that
+    // doesn't work.
+    $this->drupalPost('admin/config/regional/translate/export', array(), t('Export'));
+    // Ensure we have a translation file.
+    $this->assertRaw('# LANGUAGE translation of PROJECT', 'Exported translation template file.');
+  }
+
+  /**
+   * Helper function that returns a proper .po file.
+   */
+  function getPoFile() {
+    return <<< EOF
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 6\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\\n"
+
+msgid "Monday"
+msgstr "lundi"
+EOF;
+  }
+
+}
+
+/**
+ * Tests for the st() function.
+ */
+class LocaleInstallTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'String translation using st()',
+      'description' => 'Tests that st() works like t().',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale');
+
+    // st() lives in install.inc, so ensure that it is loaded for all tests.
+    require_once DRUPAL_ROOT . '/includes/install.inc';
+  }
+
+  /**
+   * Verify that function signatures of t() and st() are equal.
+   */
+  function testFunctionSignatures() {
+    $reflector_t = new ReflectionFunction('t');
+    $reflector_st = new ReflectionFunction('st');
+    $this->assertEqual($reflector_t->getParameters(), $reflector_st->getParameters(), 'Function signatures of t() and st() are equal.');
+  }
+}
+
+/**
+ * Locale uninstall with English UI functional test.
+ */
+class LocaleUninstallFunctionalTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Locale uninstall (EN)',
+      'description' => 'Tests the uninstall process using the built-in UI language.',
+      'group' => 'Locale',
+    );
+  }
+
+  /**
+   * The default language set for the UI before uninstall.
+   */
+  protected $language;
+
+  function setUp() {
+    parent::setUp('locale');
+    $this->language = 'en';
+  }
+
+  /**
+   * Check if the values of the Locale variables are correct after uninstall.
+   */
+  function testUninstallProcess() {
+    $locale_module = array('locale');
+
+    // Add a new language and optionally set it as default.
+    require_once DRUPAL_ROOT . '/includes/locale.inc';
+    locale_add_language('fr', 'French', 'Français', LANGUAGE_LTR, '', '', TRUE, $this->language == 'fr');
+
+    // Check the UI language.
+    drupal_language_initialize();
+    global $language;
+    $this->assertEqual($language->language, $this->language, format_string('Current language: %lang', array('%lang' => $language->language)));
+
+    // Enable multilingual workflow option for articles.
+    variable_set('language_content_type_article', 1);
+
+    // Change JavaScript translations directory.
+    variable_set('locale_js_directory', 'js_translations');
+
+    // Build the JavaScript translation file for French.
+    $user = $this->drupalCreateUser(array('translate interface', 'access administration pages'));
+    $this->drupalLogin($user);
+    $this->drupalGet('admin/config/regional/translate/translate');
+    $string = db_query('SELECT min(lid) AS lid FROM {locales_source} WHERE location LIKE :location AND textgroup = :textgroup', array(
+      ':location' => '%.js%',
+      ':textgroup' => 'default',
+    ))->fetchObject();
+    $edit = array('translations[fr]' => 'french translation');
+    $this->drupalPost('admin/config/regional/translate/edit/' . $string->lid, $edit, t('Save translations'));
+    _locale_rebuild_js('fr');
+    $file = db_query('SELECT javascript FROM {languages} WHERE language = :language', array(':language' => 'fr'))->fetchObject();
+    $js_file = 'public://' . variable_get('locale_js_directory', 'languages') . '/fr_' . $file->javascript . '.js';
+    $this->assertTrue($result = file_exists($js_file), format_string('JavaScript file created: %file', array('%file' => $result ? $js_file : 'none')));
+
+    // Disable string caching.
+    variable_set('locale_cache_strings', 0);
+
+    // Change language negotiation options.
+    drupal_load('module', 'locale');
+    variable_set('language_types', drupal_language_types() + array('language_custom' => TRUE));
+    variable_set('language_negotiation_' . LANGUAGE_TYPE_INTERFACE, locale_language_negotiation_info());
+    variable_set('language_negotiation_' . LANGUAGE_TYPE_CONTENT, locale_language_negotiation_info());
+    variable_set('language_negotiation_' . LANGUAGE_TYPE_URL, locale_language_negotiation_info());
+
+    // Change language providers settings.
+    variable_set('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX);
+    variable_set('locale_language_negotiation_session_param', TRUE);
+
+    // Uninstall Locale.
+    module_disable($locale_module);
+    drupal_uninstall_modules($locale_module);
+
+    // Visit the front page.
+    $this->drupalGet('');
+
+    // Check the init language logic.
+    drupal_language_initialize();
+    $this->assertEqual($language->language, 'en', format_string('Language after uninstall: %lang', array('%lang' => $language->language)));
+
+    // Check JavaScript files deletion.
+    $this->assertTrue($result = !file_exists($js_file), format_string('JavaScript file deleted: %file', array('%file' => $result ? $js_file : 'found')));
+
+    // Check language count.
+    $language_count = variable_get('language_count', 1);
+    $this->assertEqual($language_count, 1, format_string('Language count: %count', array('%count' => $language_count)));
+
+    // Check language negotiation.
+    require_once DRUPAL_ROOT . '/includes/language.inc';
+    $this->assertTrue(count(language_types()) == count(drupal_language_types()), 'Language types reset');
+    $language_negotiation = language_negotiation_get(LANGUAGE_TYPE_INTERFACE) == LANGUAGE_NEGOTIATION_DEFAULT;
+    $this->assertTrue($language_negotiation, format_string('Interface language negotiation: %setting', array('%setting' => $language_negotiation ? 'none' : 'set')));
+    $language_negotiation = language_negotiation_get(LANGUAGE_TYPE_CONTENT) == LANGUAGE_NEGOTIATION_DEFAULT;
+    $this->assertTrue($language_negotiation, format_string('Content language negotiation: %setting', array('%setting' => $language_negotiation ? 'none' : 'set')));
+    $language_negotiation = language_negotiation_get(LANGUAGE_TYPE_URL) == LANGUAGE_NEGOTIATION_DEFAULT;
+    $this->assertTrue($language_negotiation, format_string('URL language negotiation: %setting', array('%setting' => $language_negotiation ? 'none' : 'set')));
+
+    // Check language providers settings.
+    $this->assertFalse(variable_get('locale_language_negotiation_url_part', FALSE), 'URL language provider indicator settings cleared.');
+    $this->assertFalse(variable_get('locale_language_negotiation_session_param', FALSE), 'Visit language provider settings cleared.');
+
+    // Check JavaScript parsed.
+    $javascript_parsed_count = count(variable_get('javascript_parsed', array()));
+    $this->assertEqual($javascript_parsed_count, 0, format_string('JavaScript parsed count: %count', array('%count' => $javascript_parsed_count)));
+
+    // Check multilingual workflow option for articles.
+    $multilingual = variable_get('language_content_type_article', 0);
+    $this->assertEqual($multilingual, 0, format_string('Multilingual workflow option: %status', array('%status' => $multilingual ? 'enabled': 'disabled')));
+
+    // Check JavaScript translations directory.
+    $locale_js_directory = variable_get('locale_js_directory', 'languages');
+    $this->assertEqual($locale_js_directory, 'languages', format_string('JavaScript translations directory: %dir', array('%dir' => $locale_js_directory)));
+
+    // Check string caching.
+    $locale_cache_strings = variable_get('locale_cache_strings', 1);
+    $this->assertEqual($locale_cache_strings, 1, format_string('String caching: %status', array('%status' => $locale_cache_strings ? 'enabled': 'disabled')));
+  }
+}
+
+/**
+ * Locale uninstall with French UI functional test.
+ *
+ * Because this class extends LocaleUninstallFunctionalTest, it doesn't require a new
+ * test of its own. Rather, it switches the default UI language in setUp and then
+ * runs the testUninstallProcess (which it inherits from LocaleUninstallFunctionalTest)
+ * to test with this new language.
+ */
+class LocaleUninstallFrenchFunctionalTest extends LocaleUninstallFunctionalTest {
+  public static function getInfo() {
+    return array(
+      'name' => 'Locale uninstall (FR)',
+      'description' => 'Tests the uninstall process using French as interface language.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $this->language = 'fr';
+  }
+}
+
+/**
+ * Functional tests for the language switching feature.
+ */
+class LocaleLanguageSwitchingFunctionalTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Language switching',
+      'description' => 'Tests for the language switching feature.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale');
+
+    // Create and login user.
+    $admin_user = $this->drupalCreateUser(array('administer blocks', 'administer languages', 'translate interface', 'access administration pages'));
+    $this->drupalLogin($admin_user);
+  }
+
+  /**
+   * Functional tests for the language switcher block.
+   */
+  function testLanguageBlock() {
+    // Enable the language switching block.
+    $language_type = LANGUAGE_TYPE_INTERFACE;
+    $edit = array(
+      "blocks[locale_{$language_type}][region]" => 'sidebar_first',
+    );
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+
+    // Add language.
+    $edit = array(
+      'langcode' => 'fr',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+    // Enable URL language detection and selection.
+    $edit = array('language[enabled][locale-url]' => '1');
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+
+    // Assert that the language switching block is displayed on the frontpage.
+    $this->drupalGet('');
+    $this->assertText(t('Languages'), 'Language switcher block found.');
+
+    // Assert that only the current language is marked as active.
+    list($language_switcher) = $this->xpath('//div[@id=:id]/div[@class="content"]', array(':id' => 'block-locale-' . $language_type));
+    $links = array(
+      'active' => array(),
+      'inactive' => array(),
+    );
+    $anchors = array(
+      'active' => array(),
+      'inactive' => array(),
+    );
+    foreach ($language_switcher->ul->li as $link) {
+      $classes = explode(" ", (string) $link['class']);
+      list($language) = array_intersect($classes, array('en', 'fr'));
+      if (in_array('active', $classes)) {
+        $links['active'][] = $language;
+      }
+      else {
+        $links['inactive'][] = $language;
+      }
+      $anchor_classes = explode(" ", (string) $link->a['class']);
+      if (in_array('active', $anchor_classes)) {
+        $anchors['active'][] = $language;
+      }
+      else {
+        $anchors['inactive'][] = $language;
+      }
+    }
+    $this->assertIdentical($links, array('active' => array('en'), 'inactive' => array('fr')), 'Only the current language list item is marked as active on the language switcher block.');
+    $this->assertIdentical($anchors, array('active' => array('en'), 'inactive' => array('fr')), 'Only the current language anchor is marked as active on the language switcher block.');
+  }
+}
+
+/**
+ * Test browser language detection.
+ */
+class LocaleBrowserDetectionTest extends DrupalUnitTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Browser language detection',
+      'description' => 'Tests for the browser language detection.',
+      'group' => 'Locale',
+    );
+  }
+
+  /**
+   * Unit tests for the locale_language_from_browser() function.
+   */
+  function testLanguageFromBrowser() {
+    // Load the required functions.
+    require_once DRUPAL_ROOT . '/includes/locale.inc';
+
+    $languages = array(
+      // In our test case, 'en' has priority over 'en-US'.
+      'en' => (object) array(
+        'language' => 'en',
+      ),
+      'en-US' => (object) array(
+        'language' => 'en-US',
+      ),
+      // But 'fr-CA' has priority over 'fr'.
+      'fr-CA' => (object) array(
+        'language' => 'fr-CA',
+      ),
+      'fr' => (object) array(
+        'language' => 'fr',
+      ),
+      // 'es-MX' is alone.
+      'es-MX' => (object) array(
+        'language' => 'es-MX',
+      ),
+      // 'pt' is alone.
+      'pt' => (object) array(
+        'language' => 'pt',
+      ),
+      // Language codes with more then one dash are actually valid.
+      // eh-oh-laa-laa is the official language code of the Teletubbies.
+      'eh-oh-laa-laa' => (object) array(
+        'language' => 'eh-oh-laa-laa',
+      ),
+    );
+
+    $test_cases = array(
+      // Equal qvalue for each language, choose the site preferred one.
+      'en,en-US,fr-CA,fr,es-MX' => 'en',
+      'en-US,en,fr-CA,fr,es-MX' => 'en',
+      'fr,en' => 'en',
+      'en,fr' => 'en',
+      'en-US,fr' => 'en',
+      'fr,en-US' => 'en',
+      'fr,fr-CA' => 'fr-CA',
+      'fr-CA,fr' => 'fr-CA',
+      'fr' => 'fr-CA',
+      'fr;q=1' => 'fr-CA',
+      'fr,es-MX' => 'fr-CA',
+      'fr,es' => 'fr-CA',
+      'es,fr' => 'fr-CA',
+      'es-MX,de' => 'es-MX',
+      'de,es-MX' => 'es-MX',
+
+      // Different cases and whitespace.
+      'en' => 'en',
+      'En' => 'en',
+      'EN' => 'en',
+      ' en' => 'en',
+      'en ' => 'en',
+      'en, fr' => 'en',
+
+      // A less specific language from the browser matches a more specific one
+      // from the website, and the other way around for compatibility with
+      // some versions of Internet Explorer.
+      'es' => 'es-MX',
+      'es-MX' => 'es-MX',
+      'pt' => 'pt',
+      'pt-PT' => 'pt',
+      'pt-PT;q=0.5,pt-BR;q=1,en;q=0.7' => 'en',
+      'pt-PT;q=1,pt-BR;q=0.5,en;q=0.7' => 'en',
+      'pt-PT;q=0.4,pt-BR;q=0.1,en;q=0.7' => 'en',
+      'pt-PT;q=0.1,pt-BR;q=0.4,en;q=0.7' => 'en',
+
+      // Language code with several dashes are valid. The less specific language
+      // from the browser matches the more specific one from the website.
+      'eh-oh-laa-laa' => 'eh-oh-laa-laa',
+      'eh-oh-laa' => 'eh-oh-laa-laa',
+      'eh-oh' => 'eh-oh-laa-laa',
+      'eh' => 'eh-oh-laa-laa',
+
+      // Different qvalues.
+      'fr,en;q=0.5' => 'fr-CA',
+      'fr,en;q=0.5,fr-CA;q=0.25' => 'fr',
+
+      // Silly wildcards are also valid.
+      '*,fr-CA;q=0.5' => 'en',
+      '*,en;q=0.25' => 'fr-CA',
+      'en,en-US;q=0.5,fr;q=0.25' => 'en',
+      'en-US,en;q=0.5,fr;q=0.25' => 'en-US',
+
+      // Unresolvable cases.
+      '' => FALSE,
+      'de,pl' => FALSE,
+      'iecRswK4eh' => FALSE,
+      $this->randomName(10) => FALSE,
+    );
+
+    foreach ($test_cases as $accept_language => $expected_result) {
+      $_SERVER['HTTP_ACCEPT_LANGUAGE'] = $accept_language;
+      $result = locale_language_from_browser($languages);
+      $this->assertIdentical($result, $expected_result, format_string("Language selection '@accept-language' selects '@result', result = '@actual'", array('@accept-language' => $accept_language, '@result' => $expected_result, '@actual' => isset($result) ? $result : 'none')));
+    }
+  }
+}
+
+/**
+ * Functional tests for a user's ability to change their default language.
+ */
+class LocaleUserLanguageFunctionalTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'User language settings',
+      'description' => "Tests user's ability to change their default language.",
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale');
+  }
+
+  /**
+   * Test if user can change their default language.
+   */
+  function testUserLanguageConfiguration() {
+    global $base_url;
+
+    // User to add and remove language.
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages'));
+    // User to change their default language.
+    $web_user = $this->drupalCreateUser();
+
+    // Add custom language.
+    $this->drupalLogin($admin_user);
+    // Code for the language.
+    $langcode = 'xx';
+    // The English name for the language.
+    $name = $this->randomName(16);
+    // The native name for the language.
+    $native = $this->randomName(16);
+    // The domain prefix.
+    $prefix = 'xx';
+    $edit = array(
+      'langcode' => $langcode,
+      'name' => $name,
+      'native' => $native,
+      'prefix' => $prefix,
+      'direction' => '0',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
+
+    // Add custom language and disable it.
+    // Code for the language.
+    $langcode_disabled = 'xx-yy';
+    // The English name for the language. This will be translated.
+    $name_disabled = $this->randomName(16);
+    // The native name for the language.
+    $native_disabled = $this->randomName(16);
+    // The domain prefix.
+    $prefix_disabled = $langcode_disabled;
+    $edit = array(
+      'langcode' => $langcode_disabled,
+      'name' => $name_disabled,
+      'native' => $native_disabled,
+      'prefix' => $prefix_disabled,
+      'direction' => '0',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
+    // Disable the language.
+    $edit = array(
+      'enabled[' . $langcode_disabled . ']' => FALSE,
+    );
+    $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
+    $this->drupalLogout();
+
+    // Login as normal user and edit account settings.
+    $this->drupalLogin($web_user);
+    $path = 'user/' . $web_user->uid . '/edit';
+    $this->drupalGet($path);
+    // Ensure language settings fieldset is available.
+    $this->assertText(t('Language settings'), 'Language settings available.');
+    // Ensure custom language is present.
+    $this->assertText($name, 'Language present on form.');
+    // Ensure disabled language isn't present.
+    $this->assertNoText($name_disabled, 'Disabled language not present on form.');
+    // Switch to our custom language.
+    $edit = array(
+      'language' => $langcode,
+    );
+    $this->drupalPost($path, $edit, t('Save'));
+    // Ensure form was submitted successfully.
+    $this->assertText(t('The changes have been saved.'), 'Changes were saved.');
+    // Check if language was changed.
+    $elements = $this->xpath('//input[@id=:id]', array(':id' => 'edit-language-' . $langcode));
+    $this->assertTrue(isset($elements[0]) && !empty($elements[0]['checked']), 'Default language successfully updated.');
+
+    $this->drupalLogout();
+  }
+}
+
+/**
+ * Functional test for language handling during user creation.
+ */
+class LocaleUserCreationTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'User creation',
+      'description' => 'Tests whether proper language is stored for new users and access to language selector.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale');
+    variable_set('user_register', USER_REGISTER_VISITORS);
+  }
+
+  /**
+   * Functional test for language handling during user creation.
+   */
+  function testLocalUserCreation() {
+    // User to add and remove language and create new users.
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages', 'administer users'));
+    $this->drupalLogin($admin_user);
+
+    // Add predefined language.
+    $langcode = 'fr';
+    $edit = array(
+      'langcode' => 'fr',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+    $this->assertText($langcode, 'Language added successfully.');
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
+
+    // Set language negotiation.
+    $edit = array(
+      'language[enabled][locale-url]' => TRUE,
+    );
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+    $this->assertText(t('Language negotiation configuration saved.'), 'Set language negotiation.');
+
+    // Check if the language selector is available on admin/people/create and
+    // set to the currently active language.
+    $this->drupalGet($langcode . '/admin/people/create');
+    $this->assertFieldChecked("edit-language-$langcode", 'Global language set in the language selector.');
+
+    // Create a user with the admin/people/create form and check if the correct
+    // language is set.
+    $username = $this->randomName(10);
+    $edit = array(
+      'name' => $username,
+      'mail' => $this->randomName(4) . '@example.com',
+      'pass[pass1]' => $username,
+      'pass[pass2]' => $username,
+    );
+
+    $this->drupalPost($langcode . '/admin/people/create', $edit, t('Create new account'));
+
+    $user = user_load_by_name($username);
+    $this->assertEqual($user->language, $langcode, 'New user has correct language set.');
+
+    // Register a new user and check if the language selector is hidden.
+    $this->drupalLogout();
+
+    $this->drupalGet($langcode . '/user/register');
+    $this->assertNoFieldByName('language[fr]', 'Language selector is not accessible.');
+
+    $username = $this->randomName(10);
+    $edit = array(
+      'name' => $username,
+      'mail' => $this->randomName(4) . '@example.com',
+    );
+
+    $this->drupalPost($langcode . '/user/register', $edit, t('Create new account'));
+
+    $user = user_load_by_name($username);
+    $this->assertEqual($user->language, $langcode, 'New user has correct language set.');
+
+    // Test if the admin can use the language selector and if the
+    // correct language is was saved.
+    $user_edit = $langcode . '/user/' . $user->uid . '/edit';
+
+    $this->drupalLogin($admin_user);
+    $this->drupalGet($user_edit);
+    $this->assertFieldChecked("edit-language-$langcode", 'Language selector is accessible and correct language is selected.');
+
+    // Set pass_raw so we can login the new user.
+    $user->pass_raw = $this->randomName(10);
+    $edit = array(
+      'pass[pass1]' => $user->pass_raw,
+      'pass[pass2]' => $user->pass_raw,
+    );
+
+    $this->drupalPost($user_edit, $edit, t('Save'));
+
+    $this->drupalLogin($user);
+    $this->drupalGet($user_edit);
+    $this->assertFieldChecked("edit-language-$langcode", 'Language selector is accessible and correct language is selected.');
+  }
+}
+
+/**
+ * Functional tests for configuring a different path alias per language.
+ */
+class LocalePathFunctionalTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Path language settings',
+      'description' => 'Checks you can configure a language for individual URL aliases.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale', 'path');
+  }
+
+  /**
+   * Test if a language can be associated with a path alias.
+   */
+  function testPathLanguageConfiguration() {
+    global $base_url;
+
+    // User to add and remove language.
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'create page content', 'administer url aliases', 'create url aliases', 'access administration pages'));
+
+    // Add custom language.
+    $this->drupalLogin($admin_user);
+    // Code for the language.
+    $langcode = 'xx';
+    // The English name for the language.
+    $name = $this->randomName(16);
+    // The native name for the language.
+    $native = $this->randomName(16);
+    // The domain prefix.
+    $prefix = $langcode;
+    $edit = array(
+      'langcode' => $langcode,
+      'name' => $name,
+      'native' => $native,
+      'prefix' => $prefix,
+      'direction' => '0',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
+
+    // Check that the "xx" front page is not available when path prefixes are
+    // not enabled yet.
+    $this->drupalPost('admin/config/regional/language/configure', array(), t('Save settings'));
+    $this->drupalGet($prefix);
+    $this->assertResponse(404, 'The "xx" front page is not available yet.');
+
+    // Enable URL language detection and selection.
+    $edit = array('language[enabled][locale-url]' => 1);
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+
+    // Create a node.
+    $node = $this->drupalCreateNode(array('type' => 'page'));
+
+    // Create a path alias in default language (English).
+    $path = 'admin/config/search/path/add';
+    $english_path = $this->randomName(8);
+    $edit = array(
+      'source'   => 'node/' . $node->nid,
+      'alias'    => $english_path,
+      'language' => 'en',
+    );
+    $this->drupalPost($path, $edit, t('Save'));
+
+    // Create a path alias in new custom language.
+    $custom_language_path = $this->randomName(8);
+    $edit = array(
+      'source'   => 'node/' . $node->nid,
+      'alias'    => $custom_language_path,
+      'language' => $langcode,
+    );
+    $this->drupalPost($path, $edit, t('Save'));
+
+    // Confirm English language path alias works.
+    $this->drupalGet($english_path);
+    $this->assertText($node->title, 'English alias works.');
+
+    // Confirm custom language path alias works.
+    $this->drupalGet($prefix . '/' . $custom_language_path);
+    $this->assertText($node->title, 'Custom language alias works.');
+
+    // Create a custom path.
+    $custom_path = $this->randomName(8);
+
+    // Check priority of language for alias by source path.
+    $edit = array(
+      'source'   => 'node/' . $node->nid,
+      'alias'    => $custom_path,
+      'language' => LANGUAGE_NONE,
+    );
+    path_save($edit);
+    $lookup_path = drupal_lookup_path('alias', 'node/' . $node->nid, 'en');
+    $this->assertEqual($english_path, $lookup_path, 'English language alias has priority.');
+    // Same check for language 'xx'.
+    $lookup_path = drupal_lookup_path('alias', 'node/' . $node->nid, $prefix);
+    $this->assertEqual($custom_language_path, $lookup_path, 'Custom language alias has priority.');
+    path_delete($edit);
+
+    // Create language nodes to check priority of aliases.
+    $first_node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+    $second_node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+
+    // Assign a custom path alias to the first node with the English language.
+    $edit = array(
+      'source'   => 'node/' . $first_node->nid,
+      'alias'    => $custom_path,
+      'language' => 'en',
+    );
+    path_save($edit);
+
+    // Assign a custom path alias to second node with LANGUAGE_NONE.
+    $edit = array(
+      'source'   => 'node/' . $second_node->nid,
+      'alias'    => $custom_path,
+      'language' => LANGUAGE_NONE,
+    );
+    path_save($edit);
+
+    // Test that both node titles link to our path alias.
+    $this->drupalGet('<front>');
+    $custom_path_url = base_path() . (variable_get('clean_url', 0) ? $custom_path : '?q=' . $custom_path);
+    $elements = $this->xpath('//a[@href=:href and .=:title]', array(':href' => $custom_path_url, ':title' => $first_node->title));
+    $this->assertTrue(!empty($elements), 'First node links to the path alias.');
+    $elements = $this->xpath('//a[@href=:href and .=:title]', array(':href' => $custom_path_url, ':title' => $second_node->title));
+    $this->assertTrue(!empty($elements), 'Second node links to the path alias.');
+
+    // Confirm that the custom path leads to the first node.
+    $this->drupalGet($custom_path);
+    $this->assertText($first_node->title, 'Custom alias returns first node.');
+
+    // Confirm that the custom path with prefix leads to the second node.
+    $this->drupalGet($prefix . '/' . $custom_path);
+    $this->assertText($second_node->title, 'Custom alias with prefix returns second node.');
+  }
+}
+
+/**
+ * Functional tests for multilingual support on nodes.
+ */
+class LocaleContentFunctionalTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Content language settings',
+      'description' => 'Checks you can enable multilingual support on content types and configure a language for a node.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale');
+  }
+
+  /**
+   * Verifies that machine name fields are always LTR.
+   */
+  function testMachineNameLTR() {
+    // User to add and remove language.
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'administer content types', 'access administration pages'));
+
+    // Log in as admin.
+    $this->drupalLogin($admin_user);
+
+    // Verify that the machine name field is LTR for a new content type.
+    $this->drupalGet('admin/structure/types/add');
+    $this->assertFieldByXpath('//input[@name="type" and @dir="ltr"]', NULL, 'The machine name field is LTR when no additional language is configured.');
+
+    // Install the Arabic language (which is RTL) and configure as the default.
+    $edit = array();
+    $edit['langcode'] = 'ar';
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+    $edit = array();
+    $edit['site_default'] = 'ar';
+    $this->drupalPost(NULL, $edit, t('Save configuration'));
+
+    // Verify that the machine name field is still LTR for a new content type.
+    $this->drupalGet('admin/structure/types/add');
+    $this->assertFieldByXpath('//input[@name="type" and @dir="ltr"]', NULL, 'The machine name field is LTR when the default language is RTL.');
+  }
+
+  /**
+   * Test if a content type can be set to multilingual and language setting is
+   * present on node add and edit forms.
+   */
+  function testContentTypeLanguageConfiguration() {
+    global $base_url;
+
+    // User to add and remove language.
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'administer content types', 'access administration pages'));
+    // User to create a node.
+    $web_user = $this->drupalCreateUser(array('create article content', 'create page content', 'edit any page content'));
+
+    // Add custom language.
+    $this->drupalLogin($admin_user);
+    // Code for the language.
+    $langcode = 'xx';
+    // The English name for the language.
+    $name = $this->randomName(16);
+    // The native name for the language.
+    $native = $this->randomName(16);
+    // The domain prefix.
+    $prefix = $langcode;
+    $edit = array(
+      'langcode' => $langcode,
+      'name' => $name,
+      'native' => $native,
+      'prefix' => $prefix,
+      'direction' => '0',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
+
+    // Add disabled custom language.
+    // Code for the language.
+    $langcode_disabled = 'xx-yy';
+    // The English name for the language.
+    $name_disabled = $this->randomName(16);
+    // The native name for the language.
+    $native_disabled = $this->randomName(16);
+    // The domain prefix.
+    $prefix_disabled = $langcode_disabled;
+    $edit = array(
+      'langcode' => $langcode_disabled,
+      'name' => $name_disabled,
+      'native' => $native_disabled,
+      'prefix' => $prefix_disabled,
+      'direction' => '0',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
+    // Disable second custom language.
+    $path = 'admin/config/regional/language';
+    $edit = array(
+      'enabled[' . $langcode_disabled . ']' => FALSE,
+    );
+    $this->drupalPost($path, $edit, t('Save configuration'));
+
+    // Set "Basic page" content type to use multilingual support.
+    $this->drupalGet('admin/structure/types/manage/page');
+    $this->assertText(t('Multilingual support'), 'Multilingual support fieldset present on content type configuration form.');
+    $edit = array(
+      'language_content_type' => 1,
+    );
+    $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
+    $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), 'Basic page content type has been updated.');
+    $this->drupalLogout();
+
+    // Verify language selection is not present on add article form.
+    $this->drupalLogin($web_user);
+    $this->drupalGet('node/add/article');
+    // Verify language select list is not present.
+    $this->assertNoFieldByName('language', NULL, 'Language select not present on add article form.');
+
+    // Verify language selection appears on add "Basic page" form.
+    $this->drupalGet('node/add/page');
+    // Verify language select list is present.
+    $this->assertFieldByName('language', NULL, 'Language select present on add Basic page form.');
+    // Ensure enabled language appears.
+    $this->assertText($name, 'Enabled language present.');
+    // Ensure disabled language doesn't appear.
+    $this->assertNoText($name_disabled, 'Disabled language not present.');
+
+    // Create "Basic page" content.
+    $node_title = $this->randomName();
+    $node_body =  $this->randomName();
+    $edit = array(
+      'type' => 'page',
+      'title' => $node_title,
+      'body' => array($langcode => array(array('value' => $node_body))),
+      'language' => $langcode,
+    );
+    $node = $this->drupalCreateNode($edit);
+    // Edit the content and ensure correct language is selected.
+    $path = 'node/' . $node->nid . '/edit';
+    $this->drupalGet($path);
+    $this->assertRaw('<option value="' . $langcode . '" selected="selected">' .  $name . '</option>', 'Correct language selected.');
+    // Ensure we can change the node language.
+    $edit = array(
+      'language' => 'en',
+    );
+    $this->drupalPost($path, $edit, t('Save'));
+    $this->assertRaw(t('%title has been updated.', array('%title' => $node_title)), 'Basic page content updated.');
+
+    $this->drupalLogout();
+  }
+}
+
+/**
+ * Test UI language negotiation
+ * 1. URL (PATH) > DEFAULT
+ *    UI Language base on URL prefix, browser language preference has no
+ *    influence:
+ *      admin/config
+ *        UI in site default language
+ *      zh-hans/admin/config
+ *        UI in Chinese
+ *      blah-blah/admin/config
+ *        404
+ * 2. URL (PATH) > BROWSER > DEFAULT
+ *        admin/config
+ *          UI in user's browser language preference if the site has that
+ *          language enabled, if not, the default language
+ *        zh-hans/admin/config
+ *          UI in Chinese
+ *        blah-blah/admin/config
+ *          404
+ * 3. URL (DOMAIN) > DEFAULT
+ *        http://example.com/admin/config
+ *          UI language in site default
+ *        http://example.cn/admin/config
+ *          UI language in Chinese
+ */
+class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'UI language negotiation',
+      'description' => 'Test UI language switching by URL path prefix and domain.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale', 'locale_test');
+    require_once DRUPAL_ROOT . '/includes/language.inc';
+    drupal_load('module', 'locale');
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'translate interface', 'access administration pages', 'administer blocks'));
+    $this->drupalLogin($admin_user);
+  }
+
+  /**
+   * Tests for language switching by URL path.
+   */
+  function testUILanguageNegotiation() {
+    // A few languages to switch to.
+    // This one is unknown, should get the default lang version.
+    $language_unknown = 'blah-blah';
+    // For testing browser lang preference.
+    $language_browser_fallback = 'vi';
+    // For testing path prefix.
+    $language = 'zh-hans';
+    // For setting browser language preference to 'vi'.
+    $http_header_browser_fallback = array("Accept-Language: $language_browser_fallback;q=1");
+    // For setting browser language preference to some unknown.
+    $http_header_blah = array("Accept-Language: blah;q=1");
+
+    // This domain should switch the UI to Chinese.
+    $language_domain = 'example.cn';
+
+    // Setup the site languages by installing two languages.
+    require_once DRUPAL_ROOT . '/includes/locale.inc';
+    locale_add_language($language_browser_fallback);
+    locale_add_language($language);
+
+    // We will look for this string in the admin/config screen to see if the
+    // corresponding translated string is shown.
+    $default_string = 'Configure languages for content and the user interface';
+
+    // Set the default language in order for the translated string to be registered
+    // into database when seen by t(). Without doing this, our target string
+    // is for some reason not found when doing translate search. This might
+    // be some bug.
+    drupal_static_reset('language_list');
+    $languages = language_list('enabled');
+    variable_set('language_default', $languages[1]['vi']);
+    // First visit this page to make sure our target string is searchable.
+    $this->drupalGet('admin/config');
+    // Now the t()'ed string is in db so switch the language back to default.
+    variable_del('language_default');
+
+    // Translate the string.
+    $language_browser_fallback_string = "In $language_browser_fallback In $language_browser_fallback In $language_browser_fallback";
+    $language_string = "In $language In $language In $language";
+    // Do a translate search of our target string.
+    $edit = array( 'string' => $default_string);
+    $this->drupalPost('admin/config/regional/translate/translate', $edit, t('Filter'));
+    // Should find the string and now click edit to post translated string.
+    $this->clickLink('edit');
+    $edit = array(
+      "translations[$language_browser_fallback]" => $language_browser_fallback_string,
+      "translations[$language]" => $language_string,
+    );
+    $this->drupalPost(NULL, $edit, t('Save translations'));
+
+    // Configure URL language rewrite.
+    variable_set('locale_language_negotiation_url_type', LANGUAGE_TYPE_INTERFACE);
+
+    $tests = array(
+      // Default, browser preference should have no influence.
+      array(
+        'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
+        'path' => 'admin/config',
+        'expect' => $default_string,
+        'expected_provider' => LANGUAGE_NEGOTIATION_DEFAULT,
+        'http_header' => $http_header_browser_fallback,
+        'message' => 'URL (PATH) > DEFAULT: no language prefix, UI language is default and the browser language preference setting is not used.',
+      ),
+      // Language prefix.
+      array(
+        'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
+        'path' => "$language/admin/config",
+        'expect' => $language_string,
+        'expected_provider' => LOCALE_LANGUAGE_NEGOTIATION_URL,
+        'http_header' => $http_header_browser_fallback,
+        'message' => 'URL (PATH) > DEFAULT: with language prefix, UI language is switched based on path prefix',
+      ),
+      // Default, go by browser preference.
+      array(
+        'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LOCALE_LANGUAGE_NEGOTIATION_BROWSER),
+        'path' => 'admin/config',
+        'expect' => $language_browser_fallback_string,
+        'expected_provider' => LOCALE_LANGUAGE_NEGOTIATION_BROWSER,
+        'http_header' => $http_header_browser_fallback,
+        'message' => 'URL (PATH) > BROWSER: no language prefix, UI language is determined by browser language preference',
+      ),
+      // Prefix, switch to the language.
+      array(
+        'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LOCALE_LANGUAGE_NEGOTIATION_BROWSER),
+        'path' => "$language/admin/config",
+        'expect' => $language_string,
+        'expected_provider' => LOCALE_LANGUAGE_NEGOTIATION_URL,
+        'http_header' => $http_header_browser_fallback,
+        'message' => 'URL (PATH) > BROWSER: with langage prefix, UI language is based on path prefix',
+      ),
+      // Default, browser language preference is not one of site's lang.
+      array(
+        'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LOCALE_LANGUAGE_NEGOTIATION_BROWSER, LANGUAGE_NEGOTIATION_DEFAULT),
+        'path' => 'admin/config',
+        'expect' => $default_string,
+        'expected_provider' => LANGUAGE_NEGOTIATION_DEFAULT,
+        'http_header' => $http_header_blah,
+        'message' => 'URL (PATH) > BROWSER > DEFAULT: no language prefix and browser language preference set to unknown language should use default language',
+      ),
+    );
+
+    foreach ($tests as $test) {
+      $this->runTest($test);
+    }
+
+    // Unknown language prefix should return 404.
+    variable_set('language_negotiation_' . LANGUAGE_TYPE_INTERFACE, locale_language_negotiation_info());
+    $this->drupalGet("$language_unknown/admin/config", array(), $http_header_browser_fallback);
+    $this->assertResponse(404, "Unknown language path prefix should return 404");
+
+    // Setup for domain negotiation, first configure the language to have domain
+    // URL. We use HTTPS and a port to make sure that only the domain name is used.
+    $edit = array('prefix' => '', 'domain' => "https://$language_domain:99");
+    $this->drupalPost("admin/config/regional/language/edit/$language", $edit, t('Save language'));
+    // Set the site to use domain language negotiation.
+
+    $tests = array(
+      // Default domain, browser preference should have no influence.
+      array(
+        'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
+        'locale_language_negotiation_url_part' => LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN,
+        'path' => 'admin/config',
+        'expect' => $default_string,
+        'expected_provider' => LANGUAGE_NEGOTIATION_DEFAULT,
+        'http_header' => $http_header_browser_fallback,
+        'message' => 'URL (DOMAIN) > DEFAULT: default domain should get default language',
+      ),
+      // Language domain specific URL, we set the $_SERVER['HTTP_HOST'] in
+      // locale_test.module hook_boot() to simulate this.
+      array(
+        'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
+        'locale_language_negotiation_url_part' => LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN,
+        'locale_test_domain' => $language_domain . ':88',
+        'path' => 'admin/config',
+        'expect' => $language_string,
+        'expected_provider' => LOCALE_LANGUAGE_NEGOTIATION_URL,
+        'http_header' => $http_header_browser_fallback,
+        'message' => 'URL (DOMAIN) > DEFAULT: domain example.cn should switch to Chinese',
+      ),
+    );
+
+    foreach ($tests as $test) {
+      $this->runTest($test);
+    }
+  }
+
+  private function runTest($test) {
+    if (!empty($test['language_negotiation'])) {
+      $negotiation = array_flip($test['language_negotiation']);
+      language_negotiation_set(LANGUAGE_TYPE_INTERFACE, $negotiation);
+    }
+    if (!empty($test['locale_language_negotiation_url_part'])) {
+      variable_set('locale_language_negotiation_url_part', $test['locale_language_negotiation_url_part']);
+    }
+    if (!empty($test['locale_test_domain'])) {
+      variable_set('locale_test_domain', $test['locale_test_domain']);
+    }
+    $this->drupalGet($test['path'], array(), $test['http_header']);
+    $this->assertText($test['expect'], $test['message']);
+    $this->assertText(t('Language negotiation provider: @name', array('@name' => $test['expected_provider'])));
+  }
+
+  /**
+   * Test URL language detection when the requested URL has no language.
+   */
+  function testUrlLanguageFallback() {
+    // Add the Italian language.
+    $language_browser_fallback = 'it';
+    locale_add_language($language_browser_fallback);
+    $languages = language_list();
+
+    // Enable the path prefix for the default language: this way any unprefixed
+    // URL must have a valid fallback value.
+    $edit = array('prefix' => 'en');
+    $this->drupalPost('admin/config/regional/language/edit/en', $edit, t('Save language'));
+
+    // Enable browser and URL language detection.
+    $edit = array(
+      'language[enabled][locale-browser]' => TRUE,
+      'language[enabled][locale-url]' => TRUE,
+      'language[weight][locale-browser]' => -8,
+      'language[weight][locale-url]' => -10,
+    );
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+    $this->drupalGet('admin/config/regional/language/configure');
+
+    // Enable the language switcher block.
+    $edit = array('blocks[locale_language][region]' => 'sidebar_first');
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+
+    // Access the front page without specifying any valid URL language prefix
+    // and having as browser language preference a non-default language.
+    $http_header = array("Accept-Language: $language_browser_fallback;q=1");
+    $this->drupalGet('', array(), $http_header);
+
+    // Check that the language switcher active link matches the given browser
+    // language.
+    $args = array(':url' => base_path() . (!empty($GLOBALS['conf']['clean_url']) ? $language_browser_fallback : "?q=$language_browser_fallback"));
+    $fields = $this->xpath('//div[@id="block-locale-language"]//a[@class="language-link active" and @href=:url]', $args);
+    $this->assertTrue($fields[0] == $languages[$language_browser_fallback]->native, 'The browser language is the URL active language');
+
+    // Check that URLs are rewritten using the given browser language.
+    $fields = $this->xpath('//div[@id="site-name"]//a[@rel="home" and @href=:url]//span', $args);
+    $this->assertTrue($fields[0] == 'Drupal', 'URLs are rewritten using the browser language.');
+  }
+
+  /**
+   * Tests url() when separate domains are used for multiple languages.
+   */
+  function testLanguageDomain() {
+    // Add the Italian language, without protocol.
+    $langcode = 'it';
+    locale_add_language($langcode, 'Italian', 'Italian', LANGUAGE_LTR, 'it.example.com', '', TRUE, FALSE);
+
+    // Add the French language, with protocol.
+    $langcode = 'fr';
+    locale_add_language($langcode, 'French', 'French', LANGUAGE_LTR, 'http://fr.example.com', '', TRUE, FALSE);
+
+    // Enable language URL detection.
+    $negotiation = array_flip(array(LOCALE_LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT));
+    language_negotiation_set(LANGUAGE_TYPE_INTERFACE, $negotiation);
+
+    variable_set('locale_language_negotiation_url_part', 1);
+
+    global $is_https;
+    $languages = language_list();
+
+    foreach (array('it', 'fr') as $langcode) {
+      // Build the link we're going to test based on the clean URL setting.
+      $link = (!empty($GLOBALS['conf']['clean_url'])) ? $langcode . '.example.com/admin' : $langcode . '.example.com/?q=admin';
+
+      // Test URL in another language.
+      // Base path gives problems on the testbot, so $correct_link is hard-coded.
+      // @see UrlAlterFunctionalTest::assertUrlOutboundAlter (path.test).
+      $url = url('admin', array('language' => $languages[$langcode]));
+      $url_scheme = ($is_https) ? 'https://' : 'http://';
+      $correct_link = $url_scheme . $link;
+      $this->assertTrue($url == $correct_link, format_string('The url() function returns the right url (@url) in accordance with the chosen language', array('@url' => $url . " == " . $correct_link)));
+
+      // Test HTTPS via options.
+      variable_set('https', TRUE);
+      $url = url('admin', array('https' => TRUE, 'language' => $languages[$langcode]));
+      $correct_link = 'https://' . $link;
+      $this->assertTrue($url == $correct_link, format_string('The url() function returns the right https url (via options) (@url) in accordance with the chosen language', array('@url' => $url . " == " . $correct_link)));
+      variable_set('https', FALSE);
+
+      // Test HTTPS via current URL scheme.
+      $temp_https = $is_https;
+      $is_https = TRUE;
+      $url = url('admin', array('language' => $languages[$langcode]));
+      $correct_link = 'https://' . $link;
+      $this->assertTrue($url == $correct_link, format_string('The url() function returns the right url (via current url scheme) (@url) in accordance with the chosen language', array('@url' => $url . " == " . $correct_link)));
+      $is_https = $temp_https;
+    }
+  }
+}
+
+/**
+ * Test that URL rewriting works as expected.
+ */
+class LocaleUrlRewritingTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'URL rewriting',
+      'description' => 'Test that URL rewriting works as expected.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale');
+
+    // Create and login user.
+    $this->web_user = $this->drupalCreateUser(array('administer languages', 'access administration pages'));
+    $this->drupalLogin($this->web_user);
+
+    // Install French language.
+    $edit = array();
+    $edit['langcode'] = 'fr';
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+    // Install Italian language.
+    $edit = array();
+    $edit['langcode'] = 'it';
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+    // Disable Italian language.
+    $edit = array('enabled[it]' => FALSE);
+    $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
+
+    // Enable URL language detection and selection.
+    $edit = array('language[enabled][locale-url]' => 1);
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+
+    // Reset static caching.
+    drupal_static_reset('language_list');
+    drupal_static_reset('locale_url_outbound_alter');
+    drupal_static_reset('locale_language_url_rewrite_url');
+  }
+
+  /**
+   * Check that disabled or non-installed languages are not considered.
+   */
+  function testUrlRewritingEdgeCases() {
+    // Check URL rewriting with a disabled language.
+    $languages = language_list();
+    $this->checkUrl($languages['it'], 'Path language is ignored if language is disabled.', 'URL language negotiation does not work with disabled languages');
+
+    // Check URL rewriting with a non-installed language.
+    $non_existing = language_default();
+    $non_existing->language = $this->randomName();
+    $non_existing->prefix = $this->randomName();
+    $this->checkUrl($non_existing, 'Path language is ignored if language is not installed.', 'URL language negotiation does not work with non-installed languages');
+  }
+
+  /**
+   * Check URL rewriting for the given language.
+   *
+   * The test is performed with a fixed URL (the default front page) to simply
+   * check that language prefixes are not added to it and that the prefixed URL
+   * is actually not working.
+   *
+   * @param string $language
+   *   The language prefix, e.g. 'es'.
+   * @param string $message1
+   *   Message to display in assertion that language prefixes are not added.
+   * @param string $message2
+   *   The message to display confirming prefixed URL is not working.
+   */
+  private function checkUrl($language, $message1, $message2) {
+    $options = array('language' => $language);
+    $base_path = trim(base_path(), '/');
+    $rewritten_path = trim(str_replace(array('?q=', $base_path), '', url('node', $options)), '/');
+    $segments = explode('/', $rewritten_path, 2);
+    $prefix = $segments[0];
+    $path = isset($segments[1]) ? $segments[1] : $prefix;
+    // If the rewritten URL has not a language prefix we pick the right one from
+    // the language object so we can always check the prefixed URL.
+    if ($this->assertNotEqual($language->prefix, $prefix, $message1)) {
+      $prefix = $language->prefix;
+    }
+    $this->drupalGet("$prefix/$path");
+    $this->assertResponse(404, $message2);
+  }
+}
+
+/**
+ * Functional test for multilingual fields.
+ */
+class LocaleMultilingualFieldsFunctionalTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Multilingual fields',
+      'description' => 'Test multilingual support for fields.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale');
+    // Setup users.
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'administer content types', 'access administration pages', 'create page content', 'edit own page content'));
+    $this->drupalLogin($admin_user);
+
+    // Add a new language.
+    require_once DRUPAL_ROOT . '/includes/locale.inc';
+    locale_add_language('it', 'Italian', 'Italiano', LANGUAGE_LTR, '', '', TRUE, FALSE);
+
+    // Enable URL language detection and selection.
+    $edit = array('language[enabled][locale-url]' => '1');
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+
+    // Set "Basic page" content type to use multilingual support.
+    $edit = array(
+      'language_content_type' => 1,
+    );
+    $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
+    $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), 'Basic page content type has been updated.');
+
+    // Make node body translatable.
+    $field = field_info_field('body');
+    $field['translatable'] = TRUE;
+    field_update_field($field);
+  }
+
+  /**
+   * Test if field languages are correctly set through the node form.
+   */
+  function testMultilingualNodeForm() {
+    // Create "Basic page" content.
+    $langcode = LANGUAGE_NONE;
+    $title_key = "title";
+    $title_value = $this->randomName(8);
+    $body_key = "body[$langcode][0][value]";
+    $body_value = $this->randomName(16);
+
+    // Create node to edit.
+    $edit = array();
+    $edit[$title_key] = $title_value;
+    $edit[$body_key] = $body_value;
+    $edit['language'] = 'en';
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+
+    // Check that the node exists in the database.
+    $node = $this->drupalGetNodeByTitle($edit[$title_key]);
+    $this->assertTrue($node, 'Node found in database.');
+
+    $assert = isset($node->body['en']) && !isset($node->body[LANGUAGE_NONE]) && $node->body['en'][0]['value'] == $body_value;
+    $this->assertTrue($assert, 'Field language correctly set.');
+
+    // Change node language.
+    $this->drupalGet("node/$node->nid/edit");
+    $edit = array(
+      $title_key => $this->randomName(8),
+      'language' => 'it'
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $node = $this->drupalGetNodeByTitle($edit[$title_key]);
+    $this->assertTrue($node, 'Node found in database.');
+
+    $assert = isset($node->body['it']) && !isset($node->body['en']) && $node->body['it'][0]['value'] == $body_value;
+    $this->assertTrue($assert, 'Field language correctly changed.');
+
+    // Enable content language URL detection.
+    language_negotiation_set(LANGUAGE_TYPE_CONTENT, array(LOCALE_LANGUAGE_NEGOTIATION_URL => 0));
+
+    // Test multilingual field language fallback logic.
+    $this->drupalGet("it/node/$node->nid");
+    $this->assertRaw($body_value, 'Body correctly displayed using Italian as requested language');
+
+    $this->drupalGet("node/$node->nid");
+    $this->assertRaw($body_value, 'Body correctly displayed using English as requested language');
+  }
+
+  /*
+   * Test multilingual field display settings.
+   */
+  function testMultilingualDisplaySettings() {
+    // Create "Basic page" content.
+    $langcode = LANGUAGE_NONE;
+    $title_key = "title";
+    $title_value = $this->randomName(8);
+    $body_key = "body[$langcode][0][value]";
+    $body_value = $this->randomName(16);
+
+    // Create node to edit.
+    $edit = array();
+    $edit[$title_key] = $title_value;
+    $edit[$body_key] = $body_value;
+    $edit['language'] = 'en';
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+
+    // Check that the node exists in the database.
+    $node = $this->drupalGetNodeByTitle($edit[$title_key]);
+    $this->assertTrue($node, 'Node found in database.');
+
+    // Check if node body is showed.
+    $this->drupalGet("node/$node->nid");
+    $body = $this->xpath('//div[@id=:id]//div[@property="content:encoded"]/p', array(':id' => 'node-' . $node->nid));
+    $this->assertEqual(current($body), $node->body['en'][0]['value'], 'Node body is correctly showed.');
+  }
+}
+
+/**
+ * Functional tests for comment language.
+ */
+class LocaleCommentLanguageFunctionalTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment language',
+      'description' => 'Tests for comment language.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale', 'locale_test');
+
+    // Create and login user.
+    $admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer languages', 'access administration pages', 'administer content types', 'administer comments', 'create article content'));
+    $this->drupalLogin($admin_user);
+
+    // Add language.
+    $edit = array('langcode' => 'fr');
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+    // Set "Article" content type to use multilingual support.
+    $edit = array('language_content_type' => 1);
+    $this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
+
+    // Enable content language negotiation UI.
+    variable_set('locale_test_content_language_type', TRUE);
+
+    // Set interface language detection to user and content language detection
+    // to URL. Disable inheritance from interface language to ensure content
+    // language will fall back to the default language if no URL language can be
+    // detected.
+    $edit = array(
+      'language[enabled][locale-user]' => TRUE,
+      'language_content[enabled][locale-url]' => TRUE,
+      'language_content[enabled][locale-interface]' => FALSE,
+    );
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+
+    // Change user language preference, this way interface language is always
+    // French no matter what path prefix the URLs have.
+    $edit = array('language' => 'fr');
+    $this->drupalPost("user/{$admin_user->uid}/edit", $edit, t('Save'));
+
+    // Make comment body translatable.
+    $field = field_info_field('comment_body');
+    $field['translatable'] = TRUE;
+    field_update_field($field);
+    $this->assertTrue(field_is_translatable('comment', $field), 'Comment body is translatable.');
+  }
+
+  /**
+   * Test that comment language is properly set.
+   */
+  function testCommentLanguage() {
+    drupal_static_reset('language_list');
+
+    // Create two nodes, one for english and one for french, and comment each
+    // node using both english and french as content language by changing URL
+    // language prefixes. Meanwhile interface language is always French, which
+    // is the user language preference. This way we can ensure that node
+    // language and interface language do not influence comment language, as
+    // only content language has to.
+    foreach (language_list() as $node_langcode => $node_language) {
+      $language_none = LANGUAGE_NONE;
+
+      // Create "Article" content.
+      $title = $this->randomName();
+      $edit = array(
+        "title" => $title,
+        "body[$language_none][0][value]" => $this->randomName(),
+        "language" => $node_langcode,
+      );
+      $this->drupalPost("node/add/article", $edit, t('Save'));
+      $node = $this->drupalGetNodeByTitle($title);
+
+      foreach (language_list() as $langcode => $language) {
+        // Post a comment with content language $langcode.
+        $prefix = empty($language->prefix) ? '' : $language->prefix . '/';
+        $comment_values[$node_langcode][$langcode] = $this->randomName();
+        // Initially field form widgets have no language.
+        $edit = array(
+          'subject' => $this->randomName(),
+          "comment_body[$language_none][0][value]" => $comment_values[$node_langcode][$langcode],
+        );
+        $this->drupalPost("{$prefix}node/{$node->nid}", $edit, t('Preview'));
+        // After the first submit the submitted entity language is taken into
+        // account.
+        $edit = array(
+          'subject' => $edit['subject'],
+          "comment_body[$langcode][0][value]" => $comment_values[$node_langcode][$langcode],
+        );
+        $this->drupalPost(NULL, $edit, t('Save'));
+
+        // Check that comment language matches the current content language.
+        $cid = db_select('comment', 'c')
+          ->fields('c', array('cid'))
+          ->condition('nid', $node->nid)
+          ->orderBy('cid', 'DESC')
+          ->range(0, 1)
+          ->execute()
+          ->fetchField();
+        $comment = comment_load($cid);
+        $comment_langcode = entity_language('comment', $comment);
+        $args = array('%node_language' => $node_langcode, '%comment_language' => $comment_langcode, '%langcode' => $langcode);
+        $this->assertEqual($comment_langcode, $langcode, format_string('The comment posted with content language %langcode and belonging to the node with language %node_language has language %comment_language', $args));
+        $this->assertEqual($comment->comment_body[$langcode][0]['value'], $comment_values[$node_langcode][$langcode], 'Comment body correctly stored.');
+      }
+    }
+
+    // Check that comment bodies appear in the administration UI.
+    $this->drupalGet('admin/content/comment');
+    foreach ($comment_values as $node_values) {
+      foreach ($node_values as $value) {
+        $this->assertRaw($value);
+      }
+    }
+  }
+
+}
+
+/**
+ * Functional tests for localizing date formats.
+ */
+class LocaleDateFormatsFunctionalTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Localize date formats',
+      'description' => 'Tests for the localization of date formats.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale');
+
+    // Create and login user.
+    $admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer languages', 'access administration pages', 'create article content'));
+    $this->drupalLogin($admin_user);
+  }
+
+  /**
+   * Functional tests for localizing date formats.
+   */
+  function testLocalizeDateFormats() {
+    // Add language.
+    $edit = array(
+      'langcode' => 'fr',
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+    // Set language negotiation.
+    $language_type = LANGUAGE_TYPE_INTERFACE;
+    $edit = array(
+      "{$language_type}[enabled][locale-url]" => TRUE,
+    );
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+
+    // Configure date formats.
+    $this->drupalGet('admin/config/regional/date-time/locale');
+    $this->assertText('Français', 'Configured languages appear.');
+    $edit = array(
+      'date_format_long' => 'd.m.Y - H:i',
+      'date_format_medium' => 'd.m.Y - H:i',
+      'date_format_short' => 'd.m.Y - H:i',
+    );
+    $this->drupalPost('admin/config/regional/date-time/locale/fr/edit', $edit, t('Save configuration'));
+    $this->assertText(t('Configuration saved.'), 'French date formats updated.');
+    $edit = array(
+      'date_format_long' => 'j M Y - g:ia',
+      'date_format_medium' => 'j M Y - g:ia',
+      'date_format_short' => 'j M Y - g:ia',
+    );
+    $this->drupalPost('admin/config/regional/date-time/locale/en/edit', $edit, t('Save configuration'));
+    $this->assertText(t('Configuration saved.'), 'English date formats updated.');
+
+    // Create node content.
+    $node = $this->drupalCreateNode(array('type' => 'article'));
+
+    // Configure format for the node posted date changes with the language.
+    $this->drupalGet('node/' . $node->nid);
+    $english_date = format_date($node->created, 'custom', 'j M Y');
+    $this->assertText($english_date, 'English date format appears');
+    $this->drupalGet('fr/node/' . $node->nid);
+    $french_date = format_date($node->created, 'custom', 'd.m.Y');
+    $this->assertText($french_date, 'French date format appears');
+  }
+}
+
+/**
+ * Functional test for language types/negotiation info.
+ */
+class LocaleLanguageNegotiationInfoFunctionalTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Language negotiation info',
+      'description' => 'Tests alterations to language types/negotiation info.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale');
+    require_once DRUPAL_ROOT .'/includes/language.inc';
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages', 'view the administration theme'));
+    $this->drupalLogin($admin_user);
+    $this->drupalPost('admin/config/regional/language/add', array('langcode' => 'it'), t('Add language'));
+  }
+
+  /**
+   * Tests alterations to language types/negotiation info.
+   */
+  function testInfoAlterations() {
+    // Enable language type/negotiation info alterations.
+    variable_set('locale_test_language_types', TRUE);
+    variable_set('locale_test_language_negotiation_info', TRUE);
+    $this->languageNegotiationUpdate();
+
+    // Check that fixed language types are properly configured without the need
+    // of saving the language negotiation settings.
+    $this->checkFixedLanguageTypes();
+
+    // Make the content language type configurable by updating the language
+    // negotiation settings with the proper flag enabled.
+    variable_set('locale_test_content_language_type', TRUE);
+    $this->languageNegotiationUpdate();
+    $type = LANGUAGE_TYPE_CONTENT;
+    $language_types = variable_get('language_types', drupal_language_types());
+    $this->assertTrue($language_types[$type], 'Content language type is configurable.');
+
+    // Enable some core and custom language providers. The test language type is
+    // supposed to be configurable.
+    $test_type = 'test_language_type';
+    $provider = LOCALE_LANGUAGE_NEGOTIATION_INTERFACE;
+    $test_provider = 'test_language_provider';
+    $form_field = $type . '[enabled]['. $provider .']';
+    $edit = array(
+      $form_field => TRUE,
+      $type . '[enabled][' . $test_provider . ']' => TRUE,
+      $test_type . '[enabled][' . $test_provider . ']' => TRUE,
+    );
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+
+    // Remove the interface language provider by updating the language
+    // negotiation settings with the proper flag enabled.
+    variable_set('locale_test_language_negotiation_info_alter', TRUE);
+    $this->languageNegotiationUpdate();
+    $negotiation = variable_get("language_negotiation_$type", array());
+    $this->assertFalse(isset($negotiation[$provider]), 'Interface language provider removed from the stored settings.');
+    $this->assertNoFieldByXPath("//input[@name=\"$form_field\"]", NULL, 'Interface language provider unavailable.');
+
+    // Check that type-specific language providers can be assigned only to the
+    // corresponding language types.
+    foreach (language_types_configurable() as $type) {
+      $form_field = $type . '[enabled][test_language_provider_ts]';
+      if ($type == $test_type) {
+        $this->assertFieldByXPath("//input[@name=\"$form_field\"]", NULL, format_string('Type-specific test language provider available for %type.', array('%type' => $type)));
+      }
+      else {
+        $this->assertNoFieldByXPath("//input[@name=\"$form_field\"]", NULL, format_string('Type-specific test language provider unavailable for %type.', array('%type' => $type)));
+      }
+    }
+
+    // Check language negotiation results.
+    $this->drupalGet('');
+    $last = variable_get('locale_test_language_negotiation_last', array());
+    foreach (language_types() as $type) {
+      $langcode = $last[$type];
+      $value = $type == LANGUAGE_TYPE_CONTENT || strpos($type, 'test') !== FALSE ? 'it' : 'en';
+      $this->assertEqual($langcode, $value, format_string('The negotiated language for %type is %language', array('%type' => $type, '%language' => $langcode)));
+    }
+
+    // Disable locale_test and check that everything is set back to the original
+    // status.
+    $this->languageNegotiationUpdate('disable');
+
+    // Check that only the core language types are available.
+    foreach (language_types() as $type) {
+      $this->assertTrue(strpos($type, 'test') === FALSE, format_string('The %type language is still available', array('%type' => $type)));
+    }
+
+    // Check that fixed language types are properly configured, even those
+    // previously set to configurable.
+    $this->checkFixedLanguageTypes();
+
+    // Check that unavailable language providers are not present in the
+    // negotiation settings.
+    $negotiation = variable_get("language_negotiation_$type", array());
+    $this->assertFalse(isset($negotiation[$test_provider]), 'The disabled test language provider is not part of the content language negotiation settings.');
+
+    // Check that configuration page presents the correct options and settings.
+    $this->assertNoRaw(t('Test language detection'), 'No test language type configuration available.');
+    $this->assertNoRaw(t('This is a test language provider'), 'No test language provider available.');
+  }
+
+  /**
+   * Update language types/negotiation information.
+   *
+   * Manually invoke locale_modules_enabled()/locale_modules_disabled() since
+   * they would not be invoked after enabling/disabling locale_test the first
+   * time.
+   */
+  private function languageNegotiationUpdate($op = 'enable') {
+    static $last_op = NULL;
+    $modules = array('locale_test');
+
+    // Enable/disable locale_test only if we did not already before.
+    if ($last_op != $op) {
+      $function = "module_{$op}";
+      $function($modules);
+      // Reset hook implementation cache.
+      module_implements(NULL, FALSE, TRUE);
+    }
+
+    drupal_static_reset('language_types_info');
+    drupal_static_reset('language_negotiation_info');
+    $function = "locale_modules_{$op}d";
+    if (function_exists($function)) {
+      $function($modules);
+    }
+
+    $this->drupalGet('admin/config/regional/language/configure');
+  }
+
+  /**
+   * Check that language negotiation for fixed types matches the stored one.
+   */
+  private function checkFixedLanguageTypes() {
+    drupal_static_reset('language_types_info');
+    foreach (language_types_info() as $type => $info) {
+      if (isset($info['fixed'])) {
+        $negotiation = variable_get("language_negotiation_$type", array());
+        $equal = count($info['fixed']) == count($negotiation);
+        while ($equal && list($id) = each($negotiation)) {
+          list(, $info_id) = each($info['fixed']);
+          $equal = $info_id == $id;
+        }
+        $this->assertTrue($equal, format_string('language negotiation for %type is properly set up', array('%type' => $type)));
+      }
+    }
+  }
+}
+
+/**
+ * Functional tests for CSS alter functions.
+ */
+class LocaleCSSAlterTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'CSS altering',
+      'description' => 'Test CSS alter functions.',
+      'group' => 'Locale',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale');
+  }
+
+  /**
+   * Verifies that -rtl.css file is added directly after LTR .css file.
+   */
+  function testCSSFilesOrderInRTLMode() {
+    global $base_url;
+
+    // User to add and remove language.
+    $admin_user = $this->drupalCreateUser(array('administer languages', 'administer content types', 'access administration pages'));
+
+    // Log in as admin.
+    $this->drupalLogin($admin_user);
+
+    // Install the Arabic language (which is RTL) and configure as the default.
+    $edit = array();
+    $edit['langcode'] = 'ar';
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+    $edit = array();
+    $edit['site_default'] = 'ar';
+    $this->drupalPost(NULL, $edit, t('Save configuration'));
+
+    // Verify that the -rtl.css file is added directly after LTR file.
+    $this->drupalGet('');
+    $query_string = '?' . variable_get('css_js_query_string', '0');
+    $this->assertRaw('@import url("' . $base_url . '/modules/system/system.base.css' . $query_string . '");' . "\n" . '@import url("' . $base_url . '/modules/system/system.base-rtl.css' . $query_string . '");' . "\n", 'CSS: system.base-rtl.css is added directly after system.base.css.');
+    $this->assertRaw('@import url("' . $base_url . '/modules/system/system.menus.css' . $query_string . '");' . "\n" . '@import url("' . $base_url . '/modules/system/system.menus-rtl.css' . $query_string . '");' . "\n", 'CSS: system.menus-rtl.css is added directly after system.menus.css.');
+    $this->assertRaw('@import url("' . $base_url . '/modules/system/system.messages.css' . $query_string . '");' . "\n" . '@import url("' . $base_url . '/modules/system/system.messages-rtl.css' . $query_string . '");' . "\n", 'CSS: system.messages-rtl.css is added directly after system.messages.css.');
+  }
+}
diff --git a/htmltest/modules/locale/tests/locale_test.info b/htmltest/modules/locale/tests/locale_test.info
new file mode 100644
index 00000000..f5a7f2ba
--- /dev/null
+++ b/htmltest/modules/locale/tests/locale_test.info
@@ -0,0 +1,12 @@
+name = "Locale Test"
+description = "Support module for the locale layer tests."
+core = 7.x
+package = Testing
+version = VERSION
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/locale/tests/locale_test.js b/htmltest/modules/locale/tests/locale_test.js
new file mode 100644
index 00000000..0693bcad
--- /dev/null
+++ b/htmltest/modules/locale/tests/locale_test.js
@@ -0,0 +1,46 @@
+
+Drupal.t("Standard Call t");
+Drupal
+.
+t
+(
+"Whitespace Call t"
+)
+;
+
+Drupal.t('Single Quote t');
+Drupal.t('Single Quote \'Escaped\' t');
+Drupal.t('Single Quote ' + 'Concat ' + 'strings ' + 't');
+
+Drupal.t("Double Quote t");
+Drupal.t("Double Quote \"Escaped\" t");
+Drupal.t("Double Quote " + "Concat " + "strings " + "t");
+
+Drupal.t("Context Unquoted t", {}, {context: "Context string unquoted"});
+Drupal.t("Context Single Quoted t", {}, {'context': "Context string single quoted"});
+Drupal.t("Context Double Quoted t", {}, {"context": "Context string double quoted"});
+
+Drupal.t("Context !key Args t", {'!key': 'value'}, {context: "Context string"});
+
+Drupal.formatPlural(1, "Standard Call plural", "Standard Call @count plural");
+Drupal
+.
+formatPlural
+(
+1,
+"Whitespace Call plural",
+"Whitespace Call @count plural"
+)
+;
+
+Drupal.formatPlural(1, 'Single Quote plural', 'Single Quote @count plural');
+Drupal.formatPlural(1, 'Single Quote \'Escaped\' plural', 'Single Quote \'Escaped\' @count plural');
+
+Drupal.formatPlural(1, "Double Quote plural", "Double Quote @count plural");
+Drupal.formatPlural(1, "Double Quote \"Escaped\" plural", "Double Quote \"Escaped\" @count plural");
+
+Drupal.formatPlural(1, "Context Unquoted plural", "Context Unquoted @count plural", {}, {context: "Context string unquoted"});
+Drupal.formatPlural(1, "Context Single Quoted plural", "Context Single Quoted @count plural", {}, {'context': "Context string single quoted"});
+Drupal.formatPlural(1, "Context Double Quoted plural", "Context Double Quoted @count plural", {}, {"context": "Context string double quoted"});
+
+Drupal.formatPlural(1, "Context !key Args plural", "Context !key Args @count plural", {'!key': 'value'}, {context: "Context string"});
diff --git a/htmltest/modules/locale/tests/locale_test.module b/htmltest/modules/locale/tests/locale_test.module
new file mode 100644
index 00000000..64f4aed5
--- /dev/null
+++ b/htmltest/modules/locale/tests/locale_test.module
@@ -0,0 +1,242 @@
+<?php
+
+/**
+ * @file
+ * Mock module for locale layer tests.
+ */
+
+/**
+ * Implements hook_locale().
+ */
+function locale_test_locale($op = 'groups') {
+  switch ($op) {
+    case 'groups':
+      return array('custom' => t('Custom'));
+  }
+}
+
+/**
+ * Implements hook_boot().
+ *
+ * For testing domain language negotiation, we fake it by setting
+ * the HTTP_HOST here
+ */
+function locale_test_boot() {
+  if (variable_get('locale_test_domain')) {
+    $_SERVER['HTTP_HOST'] = variable_get('locale_test_domain');
+  }
+}
+
+/**
+ * Implements hook_init().
+ */
+function locale_test_init() {
+  locale_test_store_language_negotiation();
+  if (isset($GLOBALS['language']) && isset($GLOBALS['language']->provider)) {
+    drupal_set_message(t('Language negotiation provider: @name', array('@name' => $GLOBALS['language']->provider)));
+  }
+}
+
+/**
+ * Implements hook_language_types_info().
+ */
+function locale_test_language_types_info() {
+  if (variable_get('locale_test_language_types', FALSE)) {
+    return array(
+      'test_language_type' => array(
+        'name' => t('Test'),
+        'description' => t('A test language type.'),
+      ),
+      'fixed_test_language_type' => array(
+        'fixed' => array('test_language_provider'),
+      ),
+    );
+  }
+}
+
+/**
+ * Implements hook_menu().
+ *
+ * @return array
+ */
+function locale_test_menu() {
+  $items = array();
+  $items['locale_test_plural_format_page'] = array(
+    'page callback' => 'locale_test_plural_format_page',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_language_types_info_alter().
+ */
+function locale_test_language_types_info_alter(array &$language_types) {
+  if (variable_get('locale_test_content_language_type', FALSE)) {
+    unset($language_types[LANGUAGE_TYPE_CONTENT]['fixed']);
+  }
+}
+
+/**
+ * Implements hook_language_negotiation_info().
+ */
+function locale_test_language_negotiation_info() {
+  if (variable_get('locale_test_language_negotiation_info', FALSE)) {
+    $info = array(
+      'callbacks' => array(
+        'language' => 'locale_test_language_provider',
+      ),
+      'file' => drupal_get_path('module', 'locale_test') .'/locale_test.module',
+      'weight' => -10,
+      'description' => t('This is a test language provider.'),
+    );
+
+    return array(
+      'test_language_provider' => array(
+        'name' => t('Test'),
+        'types' => array(LANGUAGE_TYPE_CONTENT, 'test_language_type', 'fixed_test_language_type'),
+      ) + $info,
+      'test_language_provider_ts' => array(
+        'name' => t('Type-specific test'),
+        'types' => array('test_language_type'),
+      ) + $info,
+    );
+  }
+}
+
+/**
+ * Implements hook_language_negotiation_info_alter().
+ */
+function locale_test_language_negotiation_info_alter(array &$language_providers) {
+  if (variable_get('locale_test_language_negotiation_info_alter', FALSE)) {
+    unset($language_providers[LOCALE_LANGUAGE_NEGOTIATION_INTERFACE]);
+  }
+}
+
+/**
+ * Store the last negotiated languages.
+ */
+function locale_test_store_language_negotiation() {
+  $last = array();
+  foreach (language_types() as $type) {
+    $last[$type] = $GLOBALS[$type]->language;
+  }
+  variable_set('locale_test_language_negotiation_last', $last);
+}
+
+/**
+ * Test language provider.
+ */
+function locale_test_language_provider($languages) {
+  return 'it';
+}
+
+/**
+ * Returns markup for locale_get_plural testing.
+ *
+ * @return array
+ */
+function locale_test_plural_format_page() {
+  $tests = _locale_test_plural_format_tests();
+  $result = array();
+  foreach ($tests as $test) {
+    $string_param = array(
+      '@lang' => $test['language'],
+      '@locale_get_plural' => locale_get_plural($test['count'], $test['language'])
+    );
+    $result[] = array(
+      '#prefix' => '<br/>',
+      '#markup' => format_string('Language: @lang, locale_get_plural: @locale_get_plural.', $string_param),
+    );
+  }
+  return $result;
+}
+
+/**
+ * Helper function with list of test cases
+ *
+ * @return array
+ */
+function _locale_test_plural_format_tests() {
+  return array(
+    // Test data for English (no formula present).
+    array(
+      'count' => 1,
+      'language' => 'en',
+      'expected-result' => 0,
+    ),
+    array(
+      'count' => 0,
+      'language' => 'en',
+      'expected-result' => 1,
+    ),
+    array(
+      'count' => 5,
+      'language' => 'en',
+      'expected-result' => 1,
+    ),
+
+    // Test data for French (simpler formula).
+    array(
+      'count' => 1,
+      'language' => 'fr',
+      'expected-result' => 0,
+    ),
+    array(
+      'count' => 0,
+      'language' => 'fr',
+      'expected-result' => 1,
+    ),
+    array(
+      'count' => 5,
+      'language' => 'fr',
+      'expected-result' => 1,
+    ),
+
+    // Test data for Croatian (more complex formula).
+    array(
+      'count' => 1,
+      'language' => 'hr',
+      'expected-result' => 0,
+    ),
+    array(
+      'count' => 21,
+      'language' => 'hr',
+      'expected-result' => 0,
+    ),
+    array(
+      'count' => 0,
+      'language' => 'hr',
+      'expected-result' => 2,
+    ),
+    array(
+      'count' => 2,
+      'language' => 'hr',
+      'expected-result' => 1,
+    ),
+    array(
+      'count' => 8,
+      'language' => 'hr',
+      'expected-result' => 2,
+    ),
+
+    // Test data for Hungarian (nonexistent language).
+    array(
+      'count' => 1,
+      'language' => 'hu',
+      'expected-result' => -1,
+    ),
+    array(
+      'count' => 21,
+      'language' => 'hu',
+      'expected-result' => -1,
+    ),
+    array(
+      'count' => 0,
+      'language' => 'hu',
+      'expected-result' => -1,
+    ),
+  );
+}
diff --git a/htmltest/modules/locale/tests/translations/test.xx.po b/htmltest/modules/locale/tests/translations/test.xx.po
new file mode 100644
index 00000000..659a6e3f
--- /dev/null
+++ b/htmltest/modules/locale/tests/translations/test.xx.po
@@ -0,0 +1,28 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal 7\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=UTF-8\\n"
+"Content-Transfer-Encoding: 8bit\\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\\n"
+
+msgid "Monday"
+msgstr "lundi"
+
+msgid "Tuesday"
+msgstr "mardi"
+
+msgid "Wednesday"
+msgstr "mercredi"
+
+msgid "Thursday"
+msgstr "jeudi"
+
+msgid "Friday"
+msgstr "vendredi"
+
+msgid "Saturday"
+msgstr "samedi"
+
+msgid "Sunday"
+msgstr "dimanche"
diff --git a/htmltest/modules/menu/menu.admin.inc b/htmltest/modules/menu/menu.admin.inc
new file mode 100644
index 00000000..66bd6f3b
--- /dev/null
+++ b/htmltest/modules/menu/menu.admin.inc
@@ -0,0 +1,700 @@
+<?php
+
+/**
+ * @file
+ * Administrative page callbacks for menu module.
+ */
+
+/**
+ * Menu callback which shows an overview page of all the custom menus and their descriptions.
+ */
+function menu_overview_page() {
+  $result = db_query("SELECT * FROM {menu_custom} ORDER BY title", array(), array('fetch' => PDO::FETCH_ASSOC));
+  $header = array(t('Title'), array('data' => t('Operations'), 'colspan' => '3'));
+  $rows = array();
+  foreach ($result as $menu) {
+    $row = array(theme('menu_admin_overview', array('title' => $menu['title'], 'name' => $menu['menu_name'], 'description' => $menu['description'])));
+    $row[] = array('data' => l(t('list links'), 'admin/structure/menu/manage/' . $menu['menu_name']));
+    $row[] = array('data' => l(t('edit menu'), 'admin/structure/menu/manage/' . $menu['menu_name'] . '/edit'));
+    $row[] = array('data' => l(t('add link'), 'admin/structure/menu/manage/' . $menu['menu_name'] . '/add'));
+    $rows[] = $row;
+  }
+
+  return theme('table', array('header' => $header, 'rows' => $rows));
+}
+
+/**
+ * Returns HTML for a menu title and description for the menu overview page.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - title: The menu's title.
+ *   - description: The menu's description.
+ *
+ * @ingroup themeable
+ */
+function theme_menu_admin_overview($variables) {
+  $output = check_plain($variables['title']);
+  $output .= '<div class="description">' . filter_xss_admin($variables['description']) . '</div>';
+
+  return $output;
+}
+
+/**
+ * Form for editing an entire menu tree at once.
+ *
+ * Shows for one menu the menu links accessible to the current user and
+ * relevant operations.
+ */
+function menu_overview_form($form, &$form_state, $menu) {
+  global $menu_admin;
+  $form['#attached']['css'] = array(drupal_get_path('module', 'menu') . '/menu.css');
+  $sql = "
+    SELECT m.load_functions, m.to_arg_functions, m.access_callback, m.access_arguments, m.page_callback, m.page_arguments, m.delivery_callback, m.title, m.title_callback, m.title_arguments, m.type, m.description, ml.*
+    FROM {menu_links} ml LEFT JOIN {menu_router} m ON m.path = ml.router_path
+    WHERE ml.menu_name = :menu
+    ORDER BY p1 ASC, p2 ASC, p3 ASC, p4 ASC, p5 ASC, p6 ASC, p7 ASC, p8 ASC, p9 ASC";
+  $result = db_query($sql, array(':menu' => $menu['menu_name']), array('fetch' => PDO::FETCH_ASSOC));
+  $links = array();
+  foreach ($result as $item) {
+    $links[] = $item;
+  }
+  $tree = menu_tree_data($links);
+  $node_links = array();
+  menu_tree_collect_node_links($tree, $node_links);
+  // We indicate that a menu administrator is running the menu access check.
+  $menu_admin = TRUE;
+  menu_tree_check_access($tree, $node_links);
+  $menu_admin = FALSE;
+
+  $form = array_merge($form, _menu_overview_tree_form($tree));
+  $form['#menu'] =  $menu;
+
+  if (element_children($form)) {
+    $form['actions'] = array('#type' => 'actions');
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save configuration'),
+    );
+  }
+  else {
+    $form['#empty_text'] = t('There are no menu links yet. <a href="@link">Add link</a>.', array('@link' => url('admin/structure/menu/manage/'. $form['#menu']['menu_name'] .'/add')));
+  }
+  return $form;
+}
+
+/**
+ * Recursive helper function for menu_overview_form().
+ *
+ * @param $tree
+ *   The menu_tree retrieved by menu_tree_data.
+ */
+function _menu_overview_tree_form($tree) {
+  $form = &drupal_static(__FUNCTION__, array('#tree' => TRUE));
+  foreach ($tree as $data) {
+    $title = '';
+    $item = $data['link'];
+    // Don't show callbacks; these have $item['hidden'] < 0.
+    if ($item && $item['hidden'] >= 0) {
+      $mlid = 'mlid:' . $item['mlid'];
+      $form[$mlid]['#item'] = $item;
+      $form[$mlid]['#attributes'] = $item['hidden'] ? array('class' => array('menu-disabled')) : array('class' => array('menu-enabled'));
+      $form[$mlid]['title']['#markup'] = l($item['title'], $item['href'], $item['localized_options']);
+      if ($item['hidden']) {
+        $form[$mlid]['title']['#markup'] .= ' (' . t('disabled') . ')';
+      }
+      elseif ($item['link_path'] == 'user' && $item['module'] == 'system') {
+        $form[$mlid]['title']['#markup'] .= ' (' . t('logged in users only') . ')';
+      }
+
+      $form[$mlid]['hidden'] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Enable @title menu link', array('@title' => $item['title'])),
+        '#title_display' => 'invisible',
+        '#default_value' => !$item['hidden'],
+      );
+      $form[$mlid]['weight'] = array(
+        '#type' => 'weight',
+        '#delta' => 50,
+        '#default_value' => $item['weight'],
+        '#title_display' => 'invisible',
+        '#title' => t('Weight for @title', array('@title' => $item['title'])),
+      );
+      $form[$mlid]['mlid'] = array(
+        '#type' => 'hidden',
+        '#value' => $item['mlid'],
+      );
+      $form[$mlid]['plid'] = array(
+        '#type' => 'hidden',
+        '#default_value' => $item['plid'],
+      );
+      // Build a list of operations.
+      $operations = array();
+      $operations['edit'] = array('#type' => 'link', '#title' => t('edit'), '#href' => 'admin/structure/menu/item/' . $item['mlid'] . '/edit');
+      // Only items created by the menu module can be deleted.
+      if ($item['module'] == 'menu' || $item['updated'] == 1) {
+        $operations['delete'] = array('#type' => 'link', '#title' => t('delete'), '#href' => 'admin/structure/menu/item/' . $item['mlid'] . '/delete');
+      }
+      // Set the reset column.
+      elseif ($item['module'] == 'system' && $item['customized']) {
+        $operations['reset'] = array('#type' => 'link', '#title' => t('reset'), '#href' => 'admin/structure/menu/item/' . $item['mlid'] . '/reset');
+      }
+      $form[$mlid]['operations'] = $operations;
+    }
+
+    if ($data['below']) {
+      _menu_overview_tree_form($data['below']);
+    }
+  }
+  return $form;
+}
+
+/**
+ * Submit handler for the menu overview form.
+ *
+ * This function takes great care in saving parent items first, then items
+ * underneath them. Saving items in the incorrect order can break the menu tree.
+ *
+ * @see menu_overview_form()
+ */
+function menu_overview_form_submit($form, &$form_state) {
+  // When dealing with saving menu items, the order in which these items are
+  // saved is critical. If a changed child item is saved before its parent,
+  // the child item could be saved with an invalid path past its immediate
+  // parent. To prevent this, save items in the form in the same order they
+  // are sent by $_POST, ensuring parents are saved first, then their children.
+  // See http://drupal.org/node/181126#comment-632270
+  $order = array_flip(array_keys($form_state['input'])); // Get the $_POST order.
+  $form = array_merge($order, $form); // Update our original form with the new order.
+
+  $updated_items = array();
+  $fields = array('weight', 'plid');
+  foreach (element_children($form) as $mlid) {
+    if (isset($form[$mlid]['#item'])) {
+      $element = $form[$mlid];
+      // Update any fields that have changed in this menu item.
+      foreach ($fields as $field) {
+        if ($element[$field]['#value'] != $element[$field]['#default_value']) {
+          $element['#item'][$field] = $element[$field]['#value'];
+          $updated_items[$mlid] = $element['#item'];
+        }
+      }
+      // Hidden is a special case, the value needs to be reversed.
+      if ($element['hidden']['#value'] != $element['hidden']['#default_value']) {
+        // Convert to integer rather than boolean due to PDO cast to string.
+        $element['#item']['hidden'] = $element['hidden']['#value'] ? 0 : 1;
+        $updated_items[$mlid] = $element['#item'];
+      }
+    }
+  }
+
+  // Save all our changed items to the database.
+  foreach ($updated_items as $item) {
+    $item['customized'] = 1;
+    menu_link_save($item);
+  }
+  drupal_set_message(t('Your configuration has been saved.'));
+}
+
+/**
+ * Returns HTML for the menu overview form into a table.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_menu_overview_form($variables) {
+  $form = $variables['form'];
+
+  drupal_add_tabledrag('menu-overview', 'match', 'parent', 'menu-plid', 'menu-plid', 'menu-mlid', TRUE, MENU_MAX_DEPTH - 1);
+  drupal_add_tabledrag('menu-overview', 'order', 'sibling', 'menu-weight');
+
+  $header = array(
+    t('Menu link'),
+    array('data' => t('Enabled'), 'class' => array('checkbox')),
+    t('Weight'),
+    array('data' => t('Operations'), 'colspan' => '3'),
+  );
+
+  $rows = array();
+  foreach (element_children($form) as $mlid) {
+    if (isset($form[$mlid]['hidden'])) {
+      $element = &$form[$mlid];
+      // Build a list of operations.
+      $operations = array();
+      foreach (element_children($element['operations']) as $op) {
+        $operations[] = array('data' => drupal_render($element['operations'][$op]), 'class' => array('menu-operations'));
+      }
+      while (count($operations) < 2) {
+        $operations[] = '';
+      }
+
+      // Add special classes to be used for tabledrag.js.
+      $element['plid']['#attributes']['class'] = array('menu-plid');
+      $element['mlid']['#attributes']['class'] = array('menu-mlid');
+      $element['weight']['#attributes']['class'] = array('menu-weight');
+
+      // Change the parent field to a hidden. This allows any value but hides the field.
+      $element['plid']['#type'] = 'hidden';
+
+      $row = array();
+      $row[] = theme('indentation', array('size' => $element['#item']['depth'] - 1)) . drupal_render($element['title']);
+      $row[] = array('data' => drupal_render($element['hidden']), 'class' => array('checkbox', 'menu-enabled'));
+      $row[] = drupal_render($element['weight']) . drupal_render($element['plid']) . drupal_render($element['mlid']);
+      $row = array_merge($row, $operations);
+
+      $row = array_merge(array('data' => $row), $element['#attributes']);
+      $row['class'][] = 'draggable';
+      $rows[] = $row;
+    }
+  }
+  $output = '';
+  if (empty($rows)) {
+    $rows[] = array(array('data' => $form['#empty_text'], 'colspan' => '7'));
+  }
+  $output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'menu-overview')));
+  $output .= drupal_render_children($form);
+  return $output;
+}
+
+/**
+ * Menu callback; Build the menu link editing form.
+ */
+function menu_edit_item($form, &$form_state, $type, $item, $menu) {
+  if ($type == 'add' || empty($item)) {
+    // This is an add form, initialize the menu link.
+    $item = array('link_title' => '', 'mlid' => 0, 'plid' => 0, 'menu_name' => $menu['menu_name'], 'weight' => 0, 'link_path' => '', 'options' => array(), 'module' => 'menu', 'expanded' => 0, 'hidden' => 0, 'has_children' => 0);
+  }
+  else {
+    // Get the human-readable menu title from the given menu name.
+    $titles = menu_get_menus();
+    $current_title = $titles[$item['menu_name']];
+
+    // Get the current breadcrumb and add a link to that menu's overview page.
+    $breadcrumb = menu_get_active_breadcrumb();
+    $breadcrumb[] = l($current_title, 'admin/structure/menu/manage/' . $item['menu_name']);
+    drupal_set_breadcrumb($breadcrumb);
+  }
+  $form['actions'] = array('#type' => 'actions');
+  $form['link_title'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Menu link title'),
+    '#default_value' => $item['link_title'],
+    '#description' => t('The text to be used for this link in the menu.'),
+    '#required' => TRUE,
+  );
+  foreach (array('link_path', 'mlid', 'module', 'has_children', 'options') as $key) {
+    $form[$key] = array('#type' => 'value', '#value' => $item[$key]);
+  }
+  // Any item created or edited via this interface is considered "customized".
+  $form['customized'] = array('#type' => 'value', '#value' => 1);
+  $form['original_item'] = array('#type' => 'value', '#value' => $item);
+
+  $path = $item['link_path'];
+  if (isset($item['options']['query'])) {
+    $path .= '?' . drupal_http_build_query($item['options']['query']);
+  }
+  if (isset($item['options']['fragment'])) {
+    $path .= '#' . $item['options']['fragment'];
+  }
+  if ($item['module'] == 'menu') {
+    $form['link_path'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Path'),
+      '#maxlength' => 255,
+      '#default_value' => $path,
+      '#description' => t('The path for this menu link. This can be an internal Drupal path such as %add-node or an external URL such as %drupal. Enter %front to link to the front page.', array('%front' => '<front>', '%add-node' => 'node/add', '%drupal' => 'http://drupal.org')),
+      '#required' => TRUE,
+    );
+    $form['actions']['delete'] = array(
+      '#type' => 'submit',
+      '#value' => t('Delete'),
+      '#access' => $item['mlid'],
+      '#submit' => array('menu_item_delete_submit'),
+      '#weight' => 10,
+    );
+  }
+  else {
+    $form['_path'] = array(
+      '#type' => 'item',
+      '#title' => t('Path'),
+      '#description' => l($item['link_title'], $item['href'], $item['options']),
+    );
+  }
+  $form['description'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Description'),
+    '#default_value' => isset($item['options']['attributes']['title']) ? $item['options']['attributes']['title'] : '',
+    '#rows' => 1,
+    '#description' => t('Shown when hovering over the menu link.'),
+  );
+  $form['enabled'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enabled'),
+    '#default_value' => !$item['hidden'],
+    '#description' => t('Menu links that are not enabled will not be listed in any menu.'),
+  );
+  $form['expanded'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Show as expanded'),
+    '#default_value' => $item['expanded'],
+    '#description' => t('If selected and this menu link has children, the menu will always appear expanded.'),
+  );
+
+  // Generate a list of possible parents (not including this link or descendants).
+  $options = menu_parent_options(menu_get_menus(), $item);
+  $default = $item['menu_name'] . ':' . $item['plid'];
+  if (!isset($options[$default])) {
+    $default = 'navigation:0';
+  }
+  $form['parent'] = array(
+    '#type' => 'select',
+    '#title' => t('Parent link'),
+    '#default_value' => $default,
+    '#options' => $options,
+    '#description' => t('The maximum depth for a link and all its children is fixed at !maxdepth. Some menu links may not be available as parents if selecting them would exceed this limit.', array('!maxdepth' => MENU_MAX_DEPTH)),
+    '#attributes' => array('class' => array('menu-title-select')),
+  );
+  $form['weight'] = array(
+    '#type' => 'weight',
+    '#title' => t('Weight'),
+    '#delta' => 50,
+    '#default_value' => $item['weight'],
+    '#description' => t('Optional. In the menu, the heavier links will sink and the lighter links will be positioned nearer the top.'),
+  );
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save'));
+
+  return $form;
+}
+
+/**
+ * Validate form values for a menu link being added or edited.
+ */
+function menu_edit_item_validate($form, &$form_state) {
+  $item = &$form_state['values'];
+  $normal_path = drupal_get_normal_path($item['link_path']);
+  if ($item['link_path'] != $normal_path) {
+    drupal_set_message(t('The menu system stores system paths only, but will use the URL alias for display. %link_path has been stored as %normal_path', array('%link_path' => $item['link_path'], '%normal_path' => $normal_path)));
+    $item['link_path'] = $normal_path;
+  }
+  if (!url_is_external($item['link_path'])) {
+    $parsed_link = parse_url($item['link_path']);
+    if (isset($parsed_link['query'])) {
+      $item['options']['query'] = drupal_get_query_array($parsed_link['query']);
+    }
+    else {
+      // Use unset() rather than setting to empty string
+      // to avoid redundant serialized data being stored.
+      unset($item['options']['query']);
+    }
+    if (isset($parsed_link['fragment'])) {
+      $item['options']['fragment'] = $parsed_link['fragment'];
+    }
+    else {
+      unset($item['options']['fragment']);
+    }
+    if (isset($parsed_link['path']) && $item['link_path'] != $parsed_link['path']) {
+      $item['link_path'] = $parsed_link['path'];
+    }
+  }
+  if (!trim($item['link_path']) || !drupal_valid_path($item['link_path'], TRUE)) {
+    form_set_error('link_path', t("The path '@link_path' is either invalid or you do not have access to it.", array('@link_path' => $item['link_path'])));
+  }
+}
+
+/**
+ * Submit function for the delete button on the menu item editing form.
+ */
+function menu_item_delete_submit($form, &$form_state) {
+  $form_state['redirect'] = 'admin/structure/menu/item/' . $form_state['values']['mlid'] . '/delete';
+}
+
+/**
+ * Process menu and menu item add/edit form submissions.
+ */
+function menu_edit_item_submit($form, &$form_state) {
+  $item = &$form_state['values'];
+
+  // The value of "hidden" is the opposite of the value
+  // supplied by the "enabled" checkbox.
+  $item['hidden'] = (int) !$item['enabled'];
+  unset($item['enabled']);
+
+  $item['options']['attributes']['title'] = $item['description'];
+  list($item['menu_name'], $item['plid']) = explode(':', $item['parent']);
+  if (!menu_link_save($item)) {
+    drupal_set_message(t('There was an error saving the menu link.'), 'error');
+  }
+  else {
+    drupal_set_message(t('Your configuration has been saved.'));
+  }
+  $form_state['redirect'] = 'admin/structure/menu/manage/' . $item['menu_name'];
+}
+
+/**
+ * Menu callback; Build the form that handles the adding/editing of a custom menu.
+ */
+function menu_edit_menu($form, &$form_state, $type, $menu = array()) {
+  $system_menus = menu_list_system_menus();
+  $menu += array(
+    'menu_name' => '',
+    'old_name' => !empty($menu['menu_name']) ? $menu['menu_name'] : '',
+    'title' => '',
+    'description' => '',
+  );
+  // Allow menu_edit_menu_submit() and other form submit handlers to determine
+  // whether the menu already exists.
+  $form['#insert'] = empty($menu['old_name']);
+  $form['old_name'] = array(
+    '#type' => 'value',
+    '#value' => $menu['old_name'],
+  );
+
+  $form['title'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Title'),
+    '#default_value' => $menu['title'],
+    '#required' => TRUE,
+    // The title of a system menu cannot be altered.
+    '#access' => !isset($system_menus[$menu['menu_name']]),
+  );
+
+  $form['menu_name'] = array(
+    '#type' => 'machine_name',
+    '#title' => t('Menu name'),
+    '#default_value' => $menu['menu_name'],
+    '#maxlength' => MENU_MAX_MENU_NAME_LENGTH_UI,
+    '#description' => t('A unique name to construct the URL for the menu. It must only contain lowercase letters, numbers and hyphens.'),
+    '#machine_name' => array(
+      'exists' => 'menu_edit_menu_name_exists',
+      'source' => array('title'),
+      'replace_pattern' => '[^a-z0-9-]+',
+      'replace' => '-',
+    ),
+    // A menu's machine name cannot be changed.
+    '#disabled' => !empty($menu['old_name']) || isset($system_menus[$menu['menu_name']]),
+  );
+
+  $form['description'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Description'),
+    '#default_value' => $menu['description'],
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+  );
+  // Only custom menus may be deleted.
+  $form['actions']['delete'] = array(
+    '#type' => 'submit',
+    '#value' => t('Delete'),
+    '#access' => $type == 'edit' && !isset($system_menus[$menu['menu_name']]),
+    '#submit' => array('menu_custom_delete_submit'),
+  );
+
+  return $form;
+}
+
+/**
+ * Submit function for the 'Delete' button on the menu editing form.
+ */
+function menu_custom_delete_submit($form, &$form_state) {
+  $form_state['redirect'] = 'admin/structure/menu/manage/' . $form_state['values']['menu_name'] . '/delete';
+}
+
+/**
+ * Menu callback; check access and get a confirm form for deletion of a custom menu.
+ */
+function menu_delete_menu_page($menu) {
+  // System-defined menus may not be deleted.
+  $system_menus = menu_list_system_menus();
+  if (isset($system_menus[$menu['menu_name']])) {
+    return MENU_ACCESS_DENIED;
+  }
+  return drupal_get_form('menu_delete_menu_confirm', $menu);
+}
+
+/**
+ * Build a confirm form for deletion of a custom menu.
+ */
+function menu_delete_menu_confirm($form, &$form_state, $menu) {
+  $form['#menu'] = $menu;
+  $caption = '';
+  $num_links = db_query("SELECT COUNT(*) FROM {menu_links} WHERE menu_name = :menu", array(':menu' => $menu['menu_name']))->fetchField();
+  if ($num_links) {
+    $caption .= '<p>' . format_plural($num_links, '<strong>Warning:</strong> There is currently 1 menu link in %title. It will be deleted (system-defined items will be reset).', '<strong>Warning:</strong> There are currently @count menu links in %title. They will be deleted (system-defined links will be reset).', array('%title' => $menu['title'])) . '</p>';
+  }
+  $caption .= '<p>' . t('This action cannot be undone.') . '</p>';
+  return confirm_form($form, t('Are you sure you want to delete the custom menu %title?', array('%title' => $menu['title'])), 'admin/structure/menu/manage/' . $menu['menu_name'], $caption, t('Delete'));
+}
+
+/**
+ * Delete a custom menu and all links in it.
+ */
+function menu_delete_menu_confirm_submit($form, &$form_state) {
+  $menu = $form['#menu'];
+  $form_state['redirect'] = 'admin/structure/menu';
+
+  // System-defined menus may not be deleted - only menus defined by this module.
+  $system_menus = menu_list_system_menus();
+  if (isset($system_menus[$menu['menu_name']])  || !(db_query("SELECT 1 FROM {menu_custom} WHERE menu_name = :menu", array(':menu' => $menu['menu_name']))->fetchField())) {
+    return;
+  }
+
+  // Reset all the menu links defined by the system via hook_menu().
+  $result = db_query("SELECT * FROM {menu_links} ml INNER JOIN {menu_router} m ON ml.router_path = m.path WHERE ml.menu_name = :menu AND ml.module = 'system' ORDER BY m.number_parts ASC", array(':menu' => $menu['menu_name']), array('fetch' => PDO::FETCH_ASSOC));
+  foreach ($result as $link) {
+    menu_reset_item($link);
+  }
+
+  // Delete all links to the overview page for this menu.
+  $result = db_query("SELECT mlid FROM {menu_links} ml WHERE ml.link_path = :link", array(':link' => 'admin/structure/menu/manage/' . $menu['menu_name']), array('fetch' => PDO::FETCH_ASSOC));
+  foreach ($result as $link) {
+    menu_link_delete($link['mlid']);
+  }
+
+  // Delete the custom menu and all its menu links.
+  menu_delete($menu);
+
+  $t_args = array('%title' => $menu['title']);
+  drupal_set_message(t('The custom menu %title has been deleted.', $t_args));
+  watchdog('menu', 'Deleted custom menu %title and all its menu links.', $t_args, WATCHDOG_NOTICE);
+}
+
+/**
+ * Returns whether a menu name already exists.
+ *
+ * @see menu_edit_menu()
+ * @see form_validate_machine_name()
+ */
+function menu_edit_menu_name_exists($value) {
+  // 'menu-' is added to the menu name to avoid name-space conflicts.
+  $value = 'menu-' . $value;
+  $custom_exists = db_query_range('SELECT 1 FROM {menu_custom} WHERE menu_name = :menu', 0, 1, array(':menu' => $value))->fetchField();
+  $link_exists = db_query_range("SELECT 1 FROM {menu_links} WHERE menu_name = :menu", 0, 1, array(':menu' => $value))->fetchField();
+
+  return $custom_exists || $link_exists;
+}
+
+/**
+ * Submit function for adding or editing a custom menu.
+ */
+function menu_edit_menu_submit($form, &$form_state) {
+  $menu = $form_state['values'];
+  $path = 'admin/structure/menu/manage/';
+  if ($form['#insert']) {
+    // Add 'menu-' to the menu name to help avoid name-space conflicts.
+    $menu['menu_name'] = 'menu-' . $menu['menu_name'];
+    $link['link_title'] = $menu['title'];
+    $link['link_path'] = $path . $menu['menu_name'];
+    $link['router_path'] = $path . '%';
+    $link['module'] = 'menu';
+    $link['plid'] = db_query("SELECT mlid FROM {menu_links} WHERE link_path = :link AND module = :module", array(
+      ':link' => 'admin/structure/menu',
+      ':module' => 'system'
+    ))
+    ->fetchField();
+
+    menu_link_save($link);
+    menu_save($menu);
+  }
+  else {
+    menu_save($menu);
+    $result = db_query("SELECT mlid FROM {menu_links} WHERE link_path = :path", array(':path' => $path . $menu['menu_name']), array('fetch' => PDO::FETCH_ASSOC));
+    foreach ($result as $m) {
+      $link = menu_link_load($m['mlid']);
+      $link['link_title'] = $menu['title'];
+      menu_link_save($link);
+    }
+  }
+  drupal_set_message(t('Your configuration has been saved.'));
+  $form_state['redirect'] = $path . $menu['menu_name'];
+}
+
+/**
+ * Menu callback; Check access and present a confirm form for deleting a menu link.
+ */
+function menu_item_delete_page($item) {
+  // Links defined via hook_menu may not be deleted. Updated items are an
+  // exception, as they can be broken.
+  if ($item['module'] == 'system' && !$item['updated']) {
+    return MENU_ACCESS_DENIED;
+  }
+  return drupal_get_form('menu_item_delete_form', $item);
+}
+
+/**
+ * Build a confirm form for deletion of a single menu link.
+ */
+function menu_item_delete_form($form, &$form_state, $item) {
+  $form['#item'] = $item;
+  return confirm_form($form, t('Are you sure you want to delete the custom menu link %item?', array('%item' => $item['link_title'])), 'admin/structure/menu/manage/' . $item['menu_name']);
+}
+
+/**
+ * Process menu delete form submissions.
+ */
+function menu_item_delete_form_submit($form, &$form_state) {
+  $item = $form['#item'];
+  menu_link_delete($item['mlid']);
+  $t_args = array('%title' => $item['link_title']);
+  drupal_set_message(t('The menu link %title has been deleted.', $t_args));
+  watchdog('menu', 'Deleted menu link %title.', $t_args, WATCHDOG_NOTICE);
+  $form_state['redirect'] = 'admin/structure/menu/manage/' . $item['menu_name'];
+}
+
+/**
+ * Menu callback; reset a single modified menu link.
+ */
+function menu_reset_item_confirm($form, &$form_state, $item) {
+  $form['item'] = array('#type' => 'value', '#value' => $item);
+  return confirm_form($form, t('Are you sure you want to reset the link %item to its default values?', array('%item' => $item['link_title'])), 'admin/structure/menu/manage/' . $item['menu_name'], t('Any customizations will be lost. This action cannot be undone.'), t('Reset'));
+}
+
+/**
+ * Process menu reset item form submissions.
+ */
+function menu_reset_item_confirm_submit($form, &$form_state) {
+  $item = $form_state['values']['item'];
+  $new_item = menu_reset_item($item);
+  drupal_set_message(t('The menu link was reset to its default settings.'));
+  $form_state['redirect'] = 'admin/structure/menu/manage/' . $new_item['menu_name'];
+}
+
+/**
+ * Menu callback; Build the form presenting menu configuration options.
+ */
+function menu_configure() {
+  $form['intro'] = array(
+    '#type' => 'item',
+    '#markup' => t('The menu module allows on-the-fly creation of menu links in the content authoring forms. To configure these settings for a particular content type, visit the <a href="@content-types">Content types</a> page, click the <em>edit</em> link for the content type, and go to the <em>Menu settings</em> section.', array('@content-types' => url('admin/structure/types'))),
+  );
+
+  $menu_options = menu_get_menus();
+
+  $main = variable_get('menu_main_links_source', 'main-menu');
+  $form['menu_main_links_source'] = array(
+    '#type' => 'select',
+    '#title' => t('Source for the Main links'),
+    '#default_value' => variable_get('menu_main_links_source', 'main-menu'),
+    '#empty_option' => t('No Main links'),
+    '#options' => $menu_options,
+    '#tree' => FALSE,
+    '#description' => t('Select what should be displayed as the Main links (typically at the top of the page).'),
+  );
+
+  $form['menu_secondary_links_source'] = array(
+    '#type' => 'select',
+    '#title' => t('Source for the Secondary links'),
+    '#default_value' => variable_get('menu_secondary_links_source', 'user-menu'),
+    '#empty_option' => t('No Secondary links'),
+    '#options' => $menu_options,
+    '#tree' => FALSE,
+    '#description' => t('Select the source for the Secondary links. An advanced option allows you to use the same source for both Main links (currently %main) and Secondary links: if your source menu has two levels of hierarchy, the top level menu links will appear in the Main links, and the children of the active link will appear in the Secondary links.', array('%main' => $main ? $menu_options[$main] : t('none'))),
+  );
+
+  return system_settings_form($form);
+}
diff --git a/htmltest/modules/menu/menu.admin.js b/htmltest/modules/menu/menu.admin.js
new file mode 100644
index 00000000..4fa094e7
--- /dev/null
+++ b/htmltest/modules/menu/menu.admin.js
@@ -0,0 +1,46 @@
+(function ($) {
+
+Drupal.behaviors.menuChangeParentItems = {
+  attach: function (context, settings) {
+    $('fieldset#edit-menu input').each(function () {
+      $(this).change(function () {
+        // Update list of available parent menu items.
+        Drupal.menu_update_parent_list();
+      });
+    });
+  }
+};
+
+/**
+ * Function to set the options of the menu parent item dropdown.
+ */
+Drupal.menu_update_parent_list = function () {
+  var values = [];
+
+  $('input:checked', $('fieldset#edit-menu')).each(function () {
+    // Get the names of all checked menus.
+    values.push(Drupal.checkPlain($.trim($(this).val())));
+  });
+
+  var url = Drupal.settings.basePath + 'admin/structure/menu/parents';
+  $.ajax({
+    url: location.protocol + '//' + location.host + url,
+    type: 'POST',
+    data: {'menus[]' : values},
+    dataType: 'json',
+    success: function (options) {
+      // Save key of last selected element.
+      var selected = $('fieldset#edit-menu #edit-menu-parent :selected').val();
+      // Remove all exisiting options from dropdown.
+      $('fieldset#edit-menu #edit-menu-parent').children().remove();
+      // Add new options to dropdown.
+      jQuery.each(options, function(index, value) {
+        $('fieldset#edit-menu #edit-menu-parent').append(
+          $('<option ' + (index == selected ? ' selected="selected"' : '') + '></option>').val(index).text(value)
+        );
+      });
+    }
+  });
+};
+
+})(jQuery);
diff --git a/htmltest/modules/menu/menu.api.php b/htmltest/modules/menu/menu.api.php
new file mode 100644
index 00000000..22d93ef3
--- /dev/null
+++ b/htmltest/modules/menu/menu.api.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Menu module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Respond to a custom menu creation.
+ *
+ * This hook is used to notify modules that a custom menu has been created.
+ * Contributed modules may use the information to perform actions based on the
+ * information entered into the menu system.
+ *
+ * @param $menu
+ *   An array representing a custom menu:
+ *   - menu_name: The unique name of the custom menu.
+ *   - title: The human readable menu title.
+ *   - description: The custom menu description.
+ *
+ * @see hook_menu_update()
+ * @see hook_menu_delete()
+ */
+function hook_menu_insert($menu) {
+  // For example, we track available menus in a variable.
+  $my_menus = variable_get('my_module_menus', array());
+  $my_menus[$menu['menu_name']] = $menu['menu_name'];
+  variable_set('my_module_menus', $my_menus);
+}
+
+/**
+ * Respond to a custom menu update.
+ *
+ * This hook is used to notify modules that a custom menu has been updated.
+ * Contributed modules may use the information to perform actions based on the
+ * information entered into the menu system.
+ *
+ * @param $menu
+ *   An array representing a custom menu:
+ *   - menu_name: The unique name of the custom menu.
+ *   - title: The human readable menu title.
+ *   - description: The custom menu description.
+ *   - old_name: The current 'menu_name'. Note that internal menu names cannot
+ *     be changed after initial creation.
+ *
+ * @see hook_menu_insert()
+ * @see hook_menu_delete()
+ */
+function hook_menu_update($menu) {
+  // For example, we track available menus in a variable.
+  $my_menus = variable_get('my_module_menus', array());
+  $my_menus[$menu['menu_name']] = $menu['menu_name'];
+  variable_set('my_module_menus', $my_menus);
+}
+
+/**
+ * Respond to a custom menu deletion.
+ *
+ * This hook is used to notify modules that a custom menu along with all links
+ * contained in it (if any) has been deleted. Contributed modules may use the
+ * information to perform actions based on the information entered into the menu
+ * system.
+ *
+ * @param $menu
+ *   An array representing a custom menu:
+ *   - menu_name: The unique name of the custom menu.
+ *   - title: The human readable menu title.
+ *   - description: The custom menu description.
+ *
+ * @see hook_menu_insert()
+ * @see hook_menu_update()
+ */
+function hook_menu_delete($menu) {
+  // Delete the record from our variable.
+  $my_menus = variable_get('my_module_menus', array());
+  unset($my_menus[$menu['menu_name']]);
+  variable_set('my_module_menus', $my_menus);
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/menu/menu.css b/htmltest/modules/menu/menu.css
new file mode 100644
index 00000000..96f861ad
--- /dev/null
+++ b/htmltest/modules/menu/menu.css
@@ -0,0 +1,12 @@
+
+.menu-operations {
+  width: 100px;
+}
+
+.menu-enabled {
+  width: 70px;
+}
+
+.menu-enabled input {
+  margin-left:25px;
+}
diff --git a/htmltest/modules/menu/menu.info b/htmltest/modules/menu/menu.info
new file mode 100644
index 00000000..b5b4d2d1
--- /dev/null
+++ b/htmltest/modules/menu/menu.info
@@ -0,0 +1,13 @@
+name = Menu
+description = Allows administrators to customize the site navigation menu.
+package = Core
+version = VERSION
+core = 7.x
+files[] = menu.test
+configure = admin/structure/menu
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/menu/menu.install b/htmltest/modules/menu/menu.install
new file mode 100644
index 00000000..346edf9f
--- /dev/null
+++ b/htmltest/modules/menu/menu.install
@@ -0,0 +1,210 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the menu module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function menu_schema() {
+  $schema['menu_custom'] = array(
+    'description' => 'Holds definitions for top-level custom menus (for example, Main menu).',
+    'fields' => array(
+      'menu_name' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Primary Key: Unique key for menu. This is used as a block delta so length is 32.',
+      ),
+      'title' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Menu title; displayed at top of block.',
+        'translatable' => TRUE,
+      ),
+      'description' => array(
+        'type' => 'text',
+        'not null' => FALSE,
+        'description' => 'Menu description.',
+        'translatable' => TRUE,
+      ),
+    ),
+    'primary key' => array('menu_name'),
+  );
+
+  return $schema;
+}
+
+/**
+ * Implements hook_install().
+ */
+function menu_install() {
+  $system_menus = menu_list_system_menus();
+  $t = get_t();
+  $descriptions = array(
+    'navigation' => $t('The <em>Navigation</em> menu contains links intended for site visitors. Links are added to the <em>Navigation</em> menu automatically by some modules.'),
+    'user-menu' => $t("The <em>User</em> menu contains links related to the user's account, as well as the 'Log out' link."),
+    'management' => $t('The <em>Management</em> menu contains links for administrative tasks.'),
+    'main-menu' => $t('The <em>Main</em> menu is used on many sites to show the major sections of the site, often in a top navigation bar.'),
+  );
+  foreach ($system_menus as $menu_name => $title) {
+    $menu = array(
+      'menu_name' => $menu_name,
+      'title' => $t($title),
+      'description' => $descriptions[$menu_name],
+    );
+    menu_save($menu);
+  }
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function menu_uninstall() {
+  menu_rebuild();
+}
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Migrate the "Default menu for content" setting to individual node types.
+ */
+function menu_update_7000() {
+  // Act only on sites originally on Drupal 6 that have a custom "Default menu
+  // for content" setting.
+  $default_node_menu = variable_get('menu_default_node_menu');
+  if (isset($default_node_menu)) {
+    // Remove variable no longer used in Drupal 7.
+    variable_del('menu_default_node_menu');
+
+    // Make sure the menu chosen as the default still exists.
+    $defined_menus = db_query('SELECT * FROM {menu_custom}')->fetchAllAssoc('menu_name', PDO::FETCH_ASSOC);
+    // If the menu does not exist, do nothing; nodes will use the default D7
+    // node menu settings.
+    if (!isset($defined_menus[$default_node_menu])) {
+      return;
+    }
+
+    // Update the menu settings for each node type.
+    foreach (_update_7000_node_get_types() as $type => $type_object) {
+      $type_menus = variable_get('menu_options_' . $type);
+      // If the site already has a custom menu setting for this node type (set
+      // on the initial upgrade to Drupal 7.0), don't override it.
+      if (!isset($type_menus)) {
+        // Set up this node type so that the Drupal 6 "Default menu for content"
+        // is still available in the "Menu settings" section.
+        variable_set('menu_options_' . $type, array($default_node_menu));
+        variable_set('menu_parent_' . $type, $default_node_menu . ':0');
+      }
+    }
+  }
+}
+
+/**
+ * Rename "Primary Links" and "Secondary Links" to their Drupal 7 equivalents.
+ */
+function menu_update_7001() {
+  // Migrate D6 menu_primary_links_source to D7 menu_main_links_source (without
+  // renaming).
+  if (variable_get('menu_primary_links_source') !== NULL) {
+    variable_set('menu_main_links_source', variable_get('menu_primary_links_source'));
+    variable_del('menu_primary_links_source');
+  }
+
+  // Rename each menu, and any settings that refer to the old menu name.
+  // - "Primary Links" has become system menu "Main menu".
+  // - "Secondary Links" has become a new custom menu "Secondary menu".
+  $rename = array(
+    'primary-links' => array('main-menu', 'Main menu'),
+    'secondary-links' => array('secondary-menu', 'Secondary menu'),
+  );
+  foreach ($rename as $from_menu => $to) {
+    list($to_menu, $to_title) = $to;
+    // Rename the menu, and links in the menu.
+    db_update('menu_custom')
+      ->fields(array('menu_name' => $to_menu, 'title' => $to_title))
+      ->condition('menu_name', $from_menu)
+      ->execute();
+    db_update('menu_links')
+      ->fields(array('menu_name' => $to_menu))
+      ->condition('menu_name', $from_menu)
+      ->execute();
+
+    // Update any content type that used this menu as a default menu.
+    // Note: these variables may be unset/default, in which case we leave them
+    // alone. See menu_update_7000()
+    foreach (_update_7000_node_get_types() as $type => $type_object) {
+      $menu_options = variable_get('menu_options_' . $type);
+      if ($menu_options !== NULL) {
+        variable_set('menu_options_' . $type, str_replace($from_menu, $to_menu, $menu_options));
+        if (variable_get('menu_parent_' . $type) == $from_menu . ':0') {
+          variable_set('menu_parent_' . $type, $to_menu . ':0');
+        }
+      }
+    }
+
+    // Update the "source for primary links" and "source for secondary links" to
+    // follow.
+    if (variable_get('menu_main_links_source') == $from_menu) {
+      variable_set('menu_main_links_source', $to_menu);
+    }
+    if (variable_get('menu_secondary_links_source') == $from_menu) {
+      variable_set('menu_secondary_links_source', $to_menu);
+    }
+  }
+}
+
+/**
+ * Rename the primary/secondary menu blocks to match previously renamed menus.
+ */
+function menu_update_7002(&$sandbox) {
+  // Check for the presence of old or new table names.
+  if (db_table_exists('blocks') || db_table_exists('block')) {
+    $renamed_deltas = array(
+      'menu' => array(
+        'primary-links' => 'main-menu',
+        'secondary-links' => 'secondary-menu',
+      ),
+    );
+
+    $moved_deltas = array(
+      'menu' => array('main-menu' => 'system'),
+    );
+
+    update_fix_d7_block_deltas($sandbox, $renamed_deltas, $moved_deltas);
+  }
+}
+/**
+ * Add missing custom menus to active menus list.
+ */
+function menu_update_7003(&$sandbox) {
+  // Make sure all custom menus are present in the active menus variable so that
+  // their items may appear in the active trail.
+  // @see menu_set_active_menu_names()
+  $active_menus = variable_get('menu_default_active_menus', array_keys(menu_list_system_menus()));
+  $update_variable = FALSE;
+  foreach (menu_get_names() as $menu_name) {
+    if (!in_array($menu_name, $active_menus) && (strpos($menu_name, 'menu-') === 0)) {
+      $active_menus[] = $menu_name;
+      $update_variable = TRUE;
+    }
+  }
+  if ($update_variable) {
+    variable_set('menu_default_active_menus', $active_menus);
+  }
+  // Clear the menu cache.
+  cache_clear_all(NULL, 'cache_menu');
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra".
+ * The next series of updates should start at 8000.
+ */
diff --git a/htmltest/modules/menu/menu.js b/htmltest/modules/menu/menu.js
new file mode 100644
index 00000000..ff4ef1e1
--- /dev/null
+++ b/htmltest/modules/menu/menu.js
@@ -0,0 +1,65 @@
+(function ($) {
+
+Drupal.behaviors.menuFieldsetSummaries = {
+  attach: function (context) {
+    $('fieldset.menu-link-form', context).drupalSetSummary(function (context) {
+      if ($('.form-item-menu-enabled input', context).is(':checked')) {
+        return Drupal.checkPlain($('.form-item-menu-link-title input', context).val());
+      }
+      else {
+        return Drupal.t('Not in menu');
+      }
+    });
+  }
+};
+
+/**
+ * Automatically fill in a menu link title, if possible.
+ */
+Drupal.behaviors.menuLinkAutomaticTitle = {
+  attach: function (context) {
+    $('fieldset.menu-link-form', context).each(function () {
+      // Try to find menu settings widget elements as well as a 'title' field in
+      // the form, but play nicely with user permissions and form alterations.
+      var $checkbox = $('.form-item-menu-enabled input', this);
+      var $link_title = $('.form-item-menu-link-title input', context);
+      var $title = $(this).closest('form').find('.form-item-title input');
+      // Bail out if we do not have all required fields.
+      if (!($checkbox.length && $link_title.length && $title.length)) {
+        return;
+      }
+      // If there is a link title already, mark it as overridden. The user expects
+      // that toggling the checkbox twice will take over the node's title.
+      if ($checkbox.is(':checked') && $link_title.val().length) {
+        $link_title.data('menuLinkAutomaticTitleOveridden', true);
+      }
+      // Whenever the value is changed manually, disable this behavior.
+      $link_title.keyup(function () {
+        $link_title.data('menuLinkAutomaticTitleOveridden', true);
+      });
+      // Global trigger on checkbox (do not fill-in a value when disabled).
+      $checkbox.change(function () {
+        if ($checkbox.is(':checked')) {
+          if (!$link_title.data('menuLinkAutomaticTitleOveridden')) {
+            $link_title.val($title.val());
+          }
+        }
+        else {
+          $link_title.val('');
+          $link_title.removeData('menuLinkAutomaticTitleOveridden');
+        }
+        $checkbox.closest('fieldset.vertical-tabs-pane').trigger('summaryUpdated');
+        $checkbox.trigger('formUpdated');
+      });
+      // Take over any title change.
+      $title.keyup(function () {
+        if (!$link_title.data('menuLinkAutomaticTitleOveridden') && $checkbox.is(':checked')) {
+          $link_title.val($title.val());
+          $link_title.val($title.val()).trigger('formUpdated');
+        }
+      });
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/menu/menu.module b/htmltest/modules/menu/menu.module
new file mode 100644
index 00000000..64447912
--- /dev/null
+++ b/htmltest/modules/menu/menu.module
@@ -0,0 +1,794 @@
+<?php
+
+/**
+ * @file
+ * Allows administrators to customize the site's navigation menus.
+ *
+ * A menu (in this context) is a hierarchical collection of links, generally
+ * used for navigation. This is not to be confused with the
+ * @link menu Menu system @endlink of menu.inc and hook_menu(), which defines
+ * page routing requests for Drupal, and also allows the defined page routing
+ * URLs to be added to the main site navigation menu.
+ */
+
+/**
+ * Maximum length of menu name as entered by the user. Database length is 32
+ * and we add a menu- prefix.
+ */
+define('MENU_MAX_MENU_NAME_LENGTH_UI', 27);
+
+/**
+ * Implements hook_help().
+ */
+function menu_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#menu':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Menu module provides an interface for managing menus. A menu is a hierarchical collection of links, which can be within or external to the site, generally used for navigation. Each menu is rendered in a block that can be enabled and positioned through the <a href="@blocks">Blocks administration page</a>. You can view and manage menus on the <a href="@menus">Menus administration page</a>. For more information, see the online handbook entry for the <a href="@menu">Menu module</a>.', array('@blocks' => url('admin/structure/block'), '@menus' => url('admin/structure/menu'), '@menu' => 'http://drupal.org/documentation/modules/menu/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Managing menus') . '</dt>';
+      $output .= '<dd>' . t('Users with the <em>Administer menus and menu items</em> permission can add, edit and delete custom menus on the <a href="@menu">Menus administration page</a>. Custom menus can be special site menus, menus of external links, or any combination of internal and external links. You may create an unlimited number of additional menus, each of which will automatically have an associated block. By selecting <em>list links</em>, you can add, edit, or delete links for a given menu. The links listing page provides a drag-and-drop interface for controlling the order of links, and creating a hierarchy within the menu.', array('@menu' => url('admin/structure/menu'), '@add-menu' => url('admin/structure/menu/add'))) . '</dd>';
+      $output .= '<dt>' . t('Displaying menus') . '</dt>';
+      $output .= '<dd>' . t('After you have created a menu, you must enable and position the associated block on the <a href="@blocks">Blocks administration page</a>.', array('@blocks' => url('admin/structure/block'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'admin/structure/menu/add':
+      return '<p>' . t('You can enable the newly-created block for this menu on the <a href="@blocks">Blocks administration page</a>.', array('@blocks' => url('admin/structure/block'))) . '</p>';
+  }
+  if ($path == 'admin/structure/menu' && module_exists('block')) {
+    return '<p>' . t('Each menu has a corresponding block that is managed on the <a href="@blocks">Blocks administration page</a>.', array('@blocks' => url('admin/structure/block'))) . '</p>';
+  }
+}
+
+/**
+ * Implements hook_permission().
+ */
+function menu_permission() {
+  return array(
+    'administer menu' => array(
+      'title' => t('Administer menus and menu items'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_menu().
+ */
+function menu_menu() {
+  $items['admin/structure/menu'] = array(
+    'title' => 'Menus',
+    'description' => 'Add new menus to your site, edit existing menus, and rename and reorganize menu links.',
+    'page callback' => 'menu_overview_page',
+    'access callback' => 'user_access',
+    'access arguments' => array('administer menu'),
+    'file' => 'menu.admin.inc',
+  );
+  $items['admin/structure/menu/parents'] = array(
+    'title' => 'Parent menu items',
+    'page callback' => 'menu_parent_options_js',
+    'type' => MENU_CALLBACK,
+    'access arguments' => array(TRUE),
+  );
+  $items['admin/structure/menu/list'] = array(
+    'title' => 'List menus',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['admin/structure/menu/add'] = array(
+    'title' => 'Add menu',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('menu_edit_menu', 'add'),
+    'access arguments' => array('administer menu'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'menu.admin.inc',
+  );
+  $items['admin/structure/menu/settings'] = array(
+    'title' => 'Settings',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('menu_configure'),
+    'access arguments' => array('administer menu'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 5,
+    'file' => 'menu.admin.inc',
+  );
+  $items['admin/structure/menu/manage/%menu'] = array(
+    'title' => 'Customize menu',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('menu_overview_form', 4),
+    'title callback' => 'menu_overview_title',
+    'title arguments' => array(4),
+    'access arguments' => array('administer menu'),
+    'file' => 'menu.admin.inc',
+  );
+  $items['admin/structure/menu/manage/%menu/list'] = array(
+    'title' => 'List links',
+    'weight' => -10,
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
+  );
+  $items['admin/structure/menu/manage/%menu/add'] = array(
+    'title' => 'Add link',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('menu_edit_item', 'add', NULL, 4),
+    'access arguments' => array('administer menu'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'menu.admin.inc',
+  );
+  $items['admin/structure/menu/manage/%menu/edit'] = array(
+    'title' => 'Edit menu',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('menu_edit_menu', 'edit', 4),
+    'access arguments' => array('administer menu'),
+    'type' => MENU_LOCAL_TASK,
+    'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
+    'file' => 'menu.admin.inc',
+  );
+  $items['admin/structure/menu/manage/%menu/delete'] = array(
+    'title' => 'Delete menu',
+    'page callback' => 'menu_delete_menu_page',
+    'page arguments' => array(4),
+    'access arguments' => array('administer menu'),
+    'file' => 'menu.admin.inc',
+  );
+  $items['admin/structure/menu/item/%menu_link/edit'] = array(
+    'title' => 'Edit menu link',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('menu_edit_item', 'edit', 4, NULL),
+    'access arguments' => array('administer menu'),
+    'file' => 'menu.admin.inc',
+  );
+  $items['admin/structure/menu/item/%menu_link/reset'] = array(
+    'title' => 'Reset menu link',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('menu_reset_item_confirm', 4),
+    'access arguments' => array('administer menu'),
+    'file' => 'menu.admin.inc',
+  );
+  $items['admin/structure/menu/item/%menu_link/delete'] = array(
+    'title' => 'Delete menu link',
+    'page callback' => 'menu_item_delete_page',
+    'page arguments' => array(4),
+    'access arguments' => array('administer menu'),
+    'file' => 'menu.admin.inc',
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_theme().
+ */
+function menu_theme() {
+  return array(
+    'menu_overview_form' => array(
+      'file' => 'menu.admin.inc',
+      'render element' => 'form',
+    ),
+    'menu_admin_overview' => array(
+      'file' => 'menu.admin.inc',
+      'variables' => array('title' => NULL, 'name' => NULL, 'description' => NULL),
+    ),
+  );
+}
+
+/**
+ * Implements hook_enable().
+ *
+ * Add a link for each custom menu.
+ */
+function menu_enable() {
+  menu_rebuild();
+  $base_link = db_query("SELECT mlid AS plid, menu_name FROM {menu_links} WHERE link_path = 'admin/structure/menu' AND module = 'system'")->fetchAssoc();
+  $base_link['router_path'] = 'admin/structure/menu/manage/%';
+  $base_link['module'] = 'menu';
+  $result = db_query("SELECT * FROM {menu_custom}", array(), array('fetch' => PDO::FETCH_ASSOC));
+  foreach ($result as $menu) {
+    // $link is passed by reference to menu_link_save(), so we make a copy of $base_link.
+    $link = $base_link;
+    $link['mlid'] = 0;
+    $link['link_title'] = $menu['title'];
+    $link['link_path'] = 'admin/structure/menu/manage/' . $menu['menu_name'];
+    $menu_link = db_query("SELECT mlid FROM {menu_links} WHERE link_path = :path AND plid = :plid", array(
+      ':path' => $link['link_path'],
+      ':plid' => $link['plid']
+    ))
+    ->fetchField();
+    if (!$menu_link) {
+      menu_link_save($link);
+    }
+  }
+  menu_cache_clear_all();
+}
+
+/**
+ * Title callback for the menu overview page and links.
+ */
+function menu_overview_title($menu) {
+  return $menu['title'];
+}
+
+/**
+ * Load the data for a single custom menu.
+ *
+ * @param $menu_name
+ *   The unique name of a custom menu to load.
+ * @return
+ *   Array defining the custom menu, or FALSE if the menu doesn't exist.
+ */
+function menu_load($menu_name) {
+  $all_menus = menu_load_all();
+  return isset($all_menus[$menu_name]) ? $all_menus[$menu_name] : FALSE;
+}
+
+/**
+ * Load all custom menu data.
+ *
+ * @return
+ *   Array of custom menu data.
+ */
+function menu_load_all() {
+  $custom_menus = &drupal_static(__FUNCTION__);
+  if (!isset($custom_menus)) {
+    if ($cached = cache_get('menu_custom', 'cache_menu')) {
+      $custom_menus = $cached->data;
+    }
+    else {
+      $custom_menus = db_query('SELECT * FROM {menu_custom}')->fetchAllAssoc('menu_name', PDO::FETCH_ASSOC);
+      cache_set('menu_custom', $custom_menus, 'cache_menu');
+    }
+  }
+  return $custom_menus;
+}
+
+/**
+ * Save a custom menu.
+ *
+ * @param $menu
+ *   An array representing a custom menu:
+ *   - menu_name: The unique name of the custom menu (composed of lowercase
+ *     letters, numbers, and hyphens).
+ *   - title: The human readable menu title.
+ *   - description: The custom menu description.
+ *
+ * Modules should always pass a fully populated $menu when saving a custom
+ * menu, so other modules are able to output proper status or watchdog messages.
+ *
+ * @see menu_load()
+ */
+function menu_save($menu) {
+  $status = db_merge('menu_custom')
+    ->key(array('menu_name' => $menu['menu_name']))
+    ->fields(array(
+      'title' => $menu['title'],
+      'description' => $menu['description'],
+    ))
+    ->execute();
+  menu_cache_clear_all();
+
+  switch ($status) {
+    case SAVED_NEW:
+      // Make sure the menu is present in the active menus variable so that its
+      // items may appear in the menu active trail.
+      // @see menu_set_active_menu_names()
+      $active_menus = variable_get('menu_default_active_menus', array_keys(menu_get_menus()));
+      if (!in_array($menu['menu_name'], $active_menus)) {
+        $active_menus[] = $menu['menu_name'];
+        variable_set('menu_default_active_menus', $active_menus);
+      }
+
+      module_invoke_all('menu_insert', $menu);
+      break;
+
+    case SAVED_UPDATED:
+      module_invoke_all('menu_update', $menu);
+      break;
+  }
+}
+
+/**
+ * Delete a custom menu and all contained links.
+ *
+ * Note that this function deletes all menu links in a custom menu. While menu
+ * links derived from router paths may be restored by rebuilding the menu, all
+ * customized and custom links will be irreversibly gone. Therefore, this
+ * function should usually be called from a user interface (form submit) handler
+ * only, which allows the user to confirm the action.
+ *
+ * @param $menu
+ *   An array representing a custom menu:
+ *   - menu_name: The unique name of the custom menu.
+ *   - title: The human readable menu title.
+ *   - description: The custom menu description.
+ *
+ * Modules should always pass a fully populated $menu when deleting a custom
+ * menu, so other modules are able to output proper status or watchdog messages.
+ *
+ * @see menu_load()
+ *
+ * menu_delete_links() will take care of clearing the page cache. Other modules
+ * should take care of their menu-related data by implementing
+ * hook_menu_delete().
+ */
+function menu_delete($menu) {
+  // Delete all links from the menu.
+  menu_delete_links($menu['menu_name']);
+
+  // Remove menu from active menus variable.
+  $active_menus = variable_get('menu_default_active_menus', array_keys(menu_get_menus()));
+  foreach ($active_menus as $i => $menu_name) {
+    if ($menu['menu_name'] == $menu_name) {
+      unset($active_menus[$i]);
+      variable_set('menu_default_active_menus', $active_menus);
+    }
+  }
+
+  // Delete the custom menu.
+  db_delete('menu_custom')
+    ->condition('menu_name', $menu['menu_name'])
+    ->execute();
+
+  menu_cache_clear_all();
+  module_invoke_all('menu_delete', $menu);
+}
+
+/**
+ * Return a list of menu items that are valid possible parents for the given menu item.
+ *
+ * @param $menus
+ *   An array of menu names and titles, such as from menu_get_menus().
+ * @param $item
+ *   The menu item or the node type for which to generate a list of parents.
+ *   If $item['mlid'] == 0 then the complete tree is returned.
+ * @param $type
+ *   The node type for which to generate a list of parents.
+ *   If $item itself is a node type then $type is ignored.
+ * @return
+ *   An array of menu link titles keyed on the a string containing the menu name
+ *   and mlid. The list excludes the given item and its children.
+ *
+ * @todo This has to be turned into a #process form element callback. The
+ *   'menu_override_parent_selector' variable is entirely superfluous.
+ */
+function menu_parent_options($menus, $item, $type = '') {
+  // The menu_links table can be practically any size and we need a way to
+  // allow contrib modules to provide more scalable pattern choosers.
+  // hook_form_alter is too late in itself because all the possible parents are
+  // retrieved here, unless menu_override_parent_selector is set to TRUE.
+  if (variable_get('menu_override_parent_selector', FALSE)) {
+    return array();
+  }
+
+  $available_menus = array();
+  if (!is_array($item)) {
+    // If $item is not an array then it is a node type.
+    // Use it as $type and prepare a dummy menu item for _menu_get_options().
+    $type = $item;
+    $item = array('mlid' => 0);
+  }
+  if (empty($type)) {
+    // If no node type is set, use all menus given to this function.
+    $available_menus = $menus;
+  }
+  else {
+    // If a node type is set, use all available menus for this type.
+    $type_menus = variable_get('menu_options_' . $type, array('main-menu' => 'main-menu'));
+    foreach ($type_menus as $menu) {
+      $available_menus[$menu] = $menu;
+    }
+  }
+
+  return _menu_get_options($menus, $available_menus, $item);
+}
+
+/**
+ * Page callback.
+ * Get all the available menus and menu items as a JavaScript array.
+ */
+function menu_parent_options_js() {
+  $available_menus = array();
+  if (isset($_POST['menus']) && count($_POST['menus'])) {
+    foreach ($_POST['menus'] as $menu) {
+      $available_menus[$menu] = $menu;
+    }
+  }
+  $options = _menu_get_options(menu_get_menus(), $available_menus, array('mlid' => 0));
+
+  drupal_json_output($options);
+}
+
+/**
+ * Helper function to get the items of the given menu.
+ */
+function _menu_get_options($menus, $available_menus, $item) {
+  // If the item has children, there is an added limit to the depth of valid parents.
+  if (isset($item['parent_depth_limit'])) {
+    $limit = $item['parent_depth_limit'];
+  }
+  else {
+    $limit = _menu_parent_depth_limit($item);
+  }
+
+  $options = array();
+  foreach ($menus as $menu_name => $title) {
+    if (isset($available_menus[$menu_name])) {
+      $tree = menu_tree_all_data($menu_name, NULL);
+      $options[$menu_name . ':0'] = '<' . $title . '>';
+      _menu_parents_recurse($tree, $menu_name, '--', $options, $item['mlid'], $limit);
+    }
+  }
+  return $options;
+}
+
+/**
+ * Recursive helper function for menu_parent_options().
+ */
+function _menu_parents_recurse($tree, $menu_name, $indent, &$options, $exclude, $depth_limit) {
+  foreach ($tree as $data) {
+    if ($data['link']['depth'] > $depth_limit) {
+      // Don't iterate through any links on this level.
+      break;
+    }
+    if ($data['link']['mlid'] != $exclude && $data['link']['hidden'] >= 0) {
+      $title = $indent . ' ' . truncate_utf8($data['link']['title'], 30, TRUE, FALSE);
+      if ($data['link']['hidden']) {
+        $title .= ' (' . t('disabled') . ')';
+      }
+      $options[$menu_name . ':' . $data['link']['mlid']] = $title;
+      if ($data['below']) {
+        _menu_parents_recurse($data['below'], $menu_name, $indent . '--', $options, $exclude, $depth_limit);
+      }
+    }
+  }
+}
+
+/**
+ * Reset a system-defined menu link.
+ */
+function menu_reset_item($link) {
+  // To reset the link to its original values, we need to retrieve its
+  // definition from hook_menu(). Otherwise, for example, the link's menu would
+  // not be reset, because properties like the original 'menu_name' are not
+  // stored anywhere else. Since resetting a link happens rarely and this is a
+  // one-time operation, retrieving the full menu router does no harm.
+  $menu = menu_get_router();
+  $router_item = $menu[$link['router_path']];
+  $new_link = _menu_link_build($router_item);
+  // Merge existing menu link's ID and 'has_children' property.
+  foreach (array('mlid', 'has_children') as $key) {
+    $new_link[$key] = $link[$key];
+  }
+  menu_link_save($new_link);
+  return $new_link;
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function menu_block_info() {
+  $menus = menu_get_menus(FALSE);
+
+  $blocks = array();
+  foreach ($menus as $name => $title) {
+    $blocks[$name]['info'] = check_plain($title);
+    // Menu blocks can't be cached because each menu item can have
+    // a custom access callback. menu.inc manages its own caching.
+    $blocks[$name]['cache'] = DRUPAL_NO_CACHE;
+  }
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_view().
+ */
+function menu_block_view($delta = '') {
+  $menus = menu_get_menus(FALSE);
+  $data['subject'] = check_plain($menus[$delta]);
+  $data['content'] = menu_tree($delta);
+  // Add contextual links for this block.
+  if (!empty($data['content'])) {
+    $data['content']['#contextual_links']['menu'] = array('admin/structure/menu/manage', array($delta));
+  }
+  return $data;
+}
+
+/**
+ * Implements hook_block_view_alter().
+ */
+function menu_block_view_alter(&$data, $block) {
+  // Add contextual links for system menu blocks.
+  if ($block->module == 'system' && !empty($data['content'])) {
+    $system_menus = menu_list_system_menus();
+    if (isset($system_menus[$block->delta])) {
+      $data['content']['#contextual_links']['menu'] = array('admin/structure/menu/manage', array($block->delta));
+    }
+  }
+}
+
+/**
+ * Implements hook_node_insert().
+ */
+function menu_node_insert($node) {
+  menu_node_save($node);
+}
+
+/**
+ * Implements hook_node_update().
+ */
+function menu_node_update($node) {
+  menu_node_save($node);
+}
+
+/**
+ * Helper for hook_node_insert() and hook_node_update().
+ */
+function menu_node_save($node) {
+  if (isset($node->menu)) {
+    $link = &$node->menu;
+    if (empty($link['enabled'])) {
+      if (!empty($link['mlid'])) {
+        menu_link_delete($link['mlid']);
+      }
+    }
+    elseif (trim($link['link_title'])) {
+      $link['link_title'] = trim($link['link_title']);
+      $link['link_path'] = "node/$node->nid";
+      if (trim($link['description'])) {
+        $link['options']['attributes']['title'] = trim($link['description']);
+      }
+      else {
+        // If the description field was left empty, remove the title attribute
+        // from the menu link.
+        unset($link['options']['attributes']['title']);
+      }
+      if (!menu_link_save($link)) {
+        drupal_set_message(t('There was an error saving the menu link.'), 'error');
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_node_delete().
+ */
+function menu_node_delete($node) {
+  // Delete all menu module links that point to this node.
+  $result = db_query("SELECT mlid FROM {menu_links} WHERE link_path = :path AND module = 'menu'", array(':path' => 'node/' . $node->nid), array('fetch' => PDO::FETCH_ASSOC));
+  foreach ($result as $m) {
+    menu_link_delete($m['mlid']);
+  }
+}
+
+/**
+ * Implements hook_node_prepare().
+ */
+function menu_node_prepare($node) {
+  if (empty($node->menu)) {
+    // Prepare the node for the edit form so that $node->menu always exists.
+    $menu_name = strtok(variable_get('menu_parent_' . $node->type, 'main-menu:0'), ':');
+    $item = array();
+    if (isset($node->nid)) {
+      $mlid = FALSE;
+      // Give priority to the default menu
+      $type_menus = variable_get('menu_options_' . $node->type, array('main-menu' => 'main-menu'));
+      if (in_array($menu_name, $type_menus)) {
+        $mlid = db_query_range("SELECT mlid FROM {menu_links} WHERE link_path = :path AND menu_name = :menu_name AND module = 'menu' ORDER BY mlid ASC", 0, 1, array(
+          ':path' => 'node/' . $node->nid,
+          ':menu_name' => $menu_name,
+        ))->fetchField();
+      }
+      // Check all allowed menus if a link does not exist in the default menu.
+      if (!$mlid && !empty($type_menus)) {
+        $mlid = db_query_range("SELECT mlid FROM {menu_links} WHERE link_path = :path AND module = 'menu' AND menu_name IN (:type_menus) ORDER BY mlid ASC", 0, 1, array(
+          ':path' => 'node/' . $node->nid,
+          ':type_menus' => array_values($type_menus),
+        ))->fetchField();
+      }
+      if ($mlid) {
+        $item = menu_link_load($mlid);
+      }
+    }
+    // Set default values.
+    $node->menu = $item + array(
+      'link_title' => '',
+      'mlid' => 0,
+      'plid' => 0,
+      'menu_name' => $menu_name,
+      'weight' => 0,
+      'options' => array(),
+      'module' => 'menu',
+      'expanded' => 0,
+      'hidden' => 0,
+      'has_children' => 0,
+      'customized' => 0,
+    );
+  }
+  // Find the depth limit for the parent select.
+  if (!isset($node->menu['parent_depth_limit'])) {
+    $node->menu['parent_depth_limit'] = _menu_parent_depth_limit($node->menu);
+  }
+}
+
+/**
+ * Find the depth limit for items in the parent select.
+ */
+function _menu_parent_depth_limit($item) {
+  return MENU_MAX_DEPTH - 1 - (($item['mlid'] && $item['has_children']) ? menu_link_children_relative_depth($item) : 0);
+}
+
+/**
+ * Implements hook_form_BASE_FORM_ID_alter().
+ *
+ * Adds menu item fields to the node form.
+ *
+ * @see menu_node_submit()
+ */
+function menu_form_node_form_alter(&$form, $form_state) {
+  // Generate a list of possible parents (not including this link or descendants).
+  // @todo This must be handled in a #process handler.
+  $link = $form['#node']->menu;
+  $type = $form['#node']->type;
+  // menu_parent_options() is goofy and can actually handle either a menu link
+  // or a node type both as second argument. Pick based on whether there is
+  // a link already (menu_node_prepare() sets mlid default to 0).
+  $options = menu_parent_options(menu_get_menus(), $link['mlid'] ? $link : $type, $type);
+  // If no possible parent menu items were found, there is nothing to display.
+  if (empty($options)) {
+    return;
+  }
+
+  $form['menu'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Menu settings'),
+    '#access' => user_access('administer menu'),
+    '#collapsible' => TRUE,
+    '#collapsed' => !$link['link_title'],
+    '#group' => 'additional_settings',
+    '#attached' => array(
+      'js' => array(drupal_get_path('module', 'menu') . '/menu.js'),
+    ),
+    '#tree' => TRUE,
+    '#weight' => -2,
+    '#attributes' => array('class' => array('menu-link-form')),
+  );
+  $form['menu']['enabled'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Provide a menu link'),
+    '#default_value' => (int) (bool) $link['mlid'],
+  );
+  $form['menu']['link'] = array(
+    '#type' => 'container',
+    '#parents' => array('menu'),
+    '#states' => array(
+      'invisible' => array(
+        'input[name="menu[enabled]"]' => array('checked' => FALSE),
+      ),
+    ),
+  );
+
+  // Populate the element with the link data.
+  foreach (array('mlid', 'module', 'hidden', 'has_children', 'customized', 'options', 'expanded', 'hidden', 'parent_depth_limit') as $key) {
+    $form['menu']['link'][$key] = array('#type' => 'value', '#value' => $link[$key]);
+  }
+
+  $form['menu']['link']['link_title'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Menu link title'),
+    '#default_value' => $link['link_title'],
+  );
+
+  $form['menu']['link']['description'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Description'),
+    '#default_value' => isset($link['options']['attributes']['title']) ? $link['options']['attributes']['title'] : '',
+    '#rows' => 1,
+    '#description' => t('Shown when hovering over the menu link.'),
+  );
+
+  $default = ($link['mlid'] ? $link['menu_name'] . ':' . $link['plid'] : variable_get('menu_parent_' . $type, 'main-menu:0'));
+  // If the current parent menu item is not present in options, use the first
+  // available option as default value.
+  // @todo User should not be allowed to access menu link settings in such a
+  // case.
+  if (!isset($options[$default])) {
+    $array = array_keys($options);
+    $default = reset($array);
+  }
+  $form['menu']['link']['parent'] = array(
+    '#type' => 'select',
+    '#title' => t('Parent item'),
+    '#default_value' => $default,
+    '#options' => $options,
+    '#attributes' => array('class' => array('menu-parent-select')),
+  );
+  $form['menu']['link']['weight'] = array(
+    '#type' => 'weight',
+    '#title' => t('Weight'),
+    '#delta' => 50,
+    '#default_value' => $link['weight'],
+    '#description' => t('Menu links with smaller weights are displayed before links with larger weights.'),
+  );
+}
+
+/**
+ * Implements hook_node_submit().
+ *
+ * @see menu_form_node_form_alter()
+ */
+function menu_node_submit($node, $form, $form_state) {
+  // Decompose the selected menu parent option into 'menu_name' and 'plid', if
+  // the form used the default parent selection widget.
+  if (!empty($form_state['values']['menu']['parent'])) {
+    list($node->menu['menu_name'], $node->menu['plid']) = explode(':', $form_state['values']['menu']['parent']);
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Adds menu options to the node type form.
+ */
+function menu_form_node_type_form_alter(&$form, $form_state) {
+  $menu_options = menu_get_menus();
+  $type = $form['#node_type'];
+  $form['menu'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Menu settings'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#attached' => array(
+      'js' => array(drupal_get_path('module', 'menu') . '/menu.admin.js'),
+    ),
+    '#group' => 'additional_settings',
+  );
+  $form['menu']['menu_options'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Available menus'),
+    '#default_value' => variable_get('menu_options_' . $type->type, array('main-menu')),
+    '#options' => $menu_options,
+    '#description' => t('The menus available to place links in for this content type.'),
+  );
+  // To avoid an 'illegal option' error after saving the form we have to load
+  // all available menu items.
+  // Otherwise it is not possible to dynamically add options to the list.
+  // @todo Convert menu_parent_options() into a #process callback.
+  $options = menu_parent_options(menu_get_menus(), array('mlid' => 0));
+  $form['menu']['menu_parent'] = array(
+    '#type' => 'select',
+    '#title' => t('Default parent item'),
+    '#default_value' => variable_get('menu_parent_' . $type->type, 'main-menu:0'),
+    '#options' => $options,
+    '#description' => t('Choose the menu item to be the default parent for a new link in the content authoring form.'),
+    '#attributes' => array('class' => array('menu-title-select')),
+  );
+
+  // Call Drupal.menu_update_parent_list() to filter the list of
+  // available default parent menu items based on the selected menus.
+  drupal_add_js(
+    '(function ($) { Drupal.menu_update_parent_list(); })(jQuery);',
+    array('scope' => 'footer', 'type' => 'inline')
+  );
+}
+
+/**
+ * Return an associative array of the custom menus names.
+ *
+ * @param $all
+ *   If FALSE return only user-added menus, or if TRUE also include
+ *   the menus defined by the system.
+ * @return
+ *   An array with the machine-readable names as the keys, and human-readable
+ *   titles as the values.
+ */
+function menu_get_menus($all = TRUE) {
+  if ($custom_menus = menu_load_all()) {
+    if (!$all) {
+      $custom_menus = array_diff_key($custom_menus, menu_list_system_menus());
+    }
+    foreach ($custom_menus as $menu_name => $menu) {
+      $custom_menus[$menu_name] = t($menu['title']);
+    }
+    asort($custom_menus);
+  }
+  return $custom_menus;
+}
diff --git a/htmltest/modules/menu/menu.test b/htmltest/modules/menu/menu.test
new file mode 100644
index 00000000..95e0ee9e
--- /dev/null
+++ b/htmltest/modules/menu/menu.test
@@ -0,0 +1,724 @@
+<?php
+
+/**
+ * @file
+ * Tests for menu.module.
+ */
+
+class MenuTestCase extends DrupalWebTestCase {
+  protected $big_user;
+  protected $std_user;
+  protected $menu;
+  protected $items;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Menu link creation/deletion',
+      'description' => 'Add a custom menu, add menu links to the custom menu and Navigation menu, check their data, and delete them using the menu module UI.',
+      'group' => 'Menu'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('menu');
+    // Create users.
+    $this->big_user = $this->drupalCreateUser(array('access administration pages', 'administer blocks', 'administer menu', 'create article content'));
+    $this->std_user = $this->drupalCreateUser(array());
+  }
+
+  /**
+   * Login users, add menus and menu links, and test menu functionality through the admin and user interfaces.
+   */
+  function testMenu() {
+    // Login the user.
+    $this->drupalLogin($this->big_user);
+    $this->items = array();
+
+    // Do standard menu tests.
+    $this->doStandardMenuTests();
+
+    // Do custom menu tests.
+    $this->doCustomMenuTests();
+
+    // Do standard user tests.
+    // Login the user.
+    $this->drupalLogin($this->std_user);
+    $this->verifyAccess(403);
+    foreach ($this->items as $item) {
+      $node = node_load(substr($item['link_path'], 5)); // Paths were set as 'node/$nid'.
+      $this->verifyMenuLink($item, $node);
+    }
+
+    // Login the user.
+    $this->drupalLogin($this->big_user);
+
+    // Delete menu links.
+    foreach ($this->items as $item) {
+      $this->deleteMenuLink($item);
+    }
+
+    // Delete custom menu.
+    $this->deleteCustomMenu($this->menu);
+
+    // Modify and reset a standard menu link.
+    $item = $this->getStandardMenuLink();
+    $old_title = $item['link_title'];
+    $this->modifyMenuLink($item);
+    $item = menu_link_load($item['mlid']);
+    // Verify that a change to the description is saved.
+    $description = $this->randomName(16);
+    $item['options']['attributes']['title']  = $description;
+    menu_link_save($item);
+    $saved_item = menu_link_load($item['mlid']);
+    $this->assertEqual($description, $saved_item['options']['attributes']['title'], 'Saving an existing link updates the description (title attribute)');
+    $this->resetMenuLink($item, $old_title);
+  }
+
+  /**
+   * Test standard menu functionality using navigation menu.
+   *
+   */
+  function doStandardMenuTests() {
+    $this->doMenuTests();
+    $this->addInvalidMenuLink();
+  }
+
+  /**
+   * Test custom menu functionality using navigation menu.
+   *
+   */
+  function doCustomMenuTests() {
+    $this->menu = $this->addCustomMenu();
+    $this->doMenuTests($this->menu['menu_name']);
+    $this->addInvalidMenuLink($this->menu['menu_name']);
+    $this->addCustomMenuCRUD();
+  }
+
+  /**
+   * Add custom menu using CRUD functions.
+   */
+  function addCustomMenuCRUD() {
+    // Add a new custom menu.
+    $menu_name = substr(hash('sha256', $this->randomName(16)), 0, MENU_MAX_MENU_NAME_LENGTH_UI);
+    $title = $this->randomName(16);
+
+    $menu = array(
+      'menu_name' => $menu_name,
+      'title' => $title,
+      'description' => 'Description text',
+    );
+    menu_save($menu);
+
+    // Assert the new menu.
+    $this->drupalGet('admin/structure/menu/manage/' . $menu_name . '/edit');
+    $this->assertRaw($title, 'Custom menu was added.');
+
+    // Edit the menu.
+    $new_title = $this->randomName(16);
+    $menu['title'] = $new_title;
+    menu_save($menu);
+    $this->drupalGet('admin/structure/menu/manage/' . $menu_name . '/edit');
+    $this->assertRaw($new_title, 'Custom menu was edited.');
+  }
+
+  /**
+   * Add custom menu.
+   */
+  function addCustomMenu() {
+    // Add custom menu.
+
+    // Try adding a menu using a menu_name that is too long.
+    $this->drupalGet('admin/structure/menu/add');
+    $menu_name = substr(hash('sha256', $this->randomName(16)), 0, MENU_MAX_MENU_NAME_LENGTH_UI + 1);
+    $title = $this->randomName(16);
+    $edit = array(
+      'menu_name' => $menu_name,
+      'description' => '',
+      'title' =>  $title,
+    );
+    $this->drupalPost('admin/structure/menu/add', $edit, t('Save'));
+
+    // Verify that using a menu_name that is too long results in a validation message.
+    $this->assertRaw(t('!name cannot be longer than %max characters but is currently %length characters long.', array(
+      '!name' => t('Menu name'),
+      '%max' => MENU_MAX_MENU_NAME_LENGTH_UI,
+      '%length' => drupal_strlen($menu_name),
+    )));
+
+    // Change the menu_name so it no longer exceeds the maximum length.
+    $menu_name = substr(hash('sha256', $this->randomName(16)), 0, MENU_MAX_MENU_NAME_LENGTH_UI);
+    $edit['menu_name'] = $menu_name;
+    $this->drupalPost('admin/structure/menu/add', $edit, t('Save'));
+
+    // Verify that no validation error is given for menu_name length.
+    $this->assertNoRaw(t('!name cannot be longer than %max characters but is currently %length characters long.', array(
+      '!name' => t('Menu name'),
+      '%max' => MENU_MAX_MENU_NAME_LENGTH_UI,
+      '%length' => drupal_strlen($menu_name),
+    )));
+    // Unlike most other modules, there is no confirmation message displayed.
+
+    $this->drupalGet('admin/structure/menu');
+    $this->assertText($title, 'Menu created');
+
+    // Enable the custom menu block.
+    $menu_name = 'menu-' . $menu_name; // Drupal prepends the name with 'menu-'.
+    $edit = array();
+    $edit['blocks[menu_' . $menu_name . '][region]'] = 'sidebar_first';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->assertResponse(200);
+    $this->assertText(t('The block settings have been updated.'), 'Custom menu block was enabled');
+
+    return menu_load($menu_name);
+  }
+
+  /**
+   * Delete custom menu.
+   *
+   * @param string $menu_name Custom menu name.
+   */
+  function deleteCustomMenu($menu) {
+    $menu_name = $this->menu['menu_name'];
+    $title = $this->menu['title'];
+
+    // Delete custom menu.
+    $this->drupalPost("admin/structure/menu/manage/$menu_name/delete", array(), t('Delete'));
+    $this->assertResponse(200);
+    $this->assertRaw(t('The custom menu %title has been deleted.', array('%title' => $title)), 'Custom menu was deleted');
+    $this->assertFalse(menu_load($menu_name), 'Custom menu was deleted');
+    // Test if all menu links associated to the menu were removed from database.
+    $result = db_query("SELECT menu_name FROM {menu_links} WHERE menu_name = :menu_name", array(':menu_name' => $menu_name))->fetchField();
+    $this->assertFalse($result, 'All menu links associated to the custom menu were deleted.');
+  }
+
+  /**
+   * Test menu functionality using navigation menu.
+   *
+   */
+  function doMenuTests($menu_name = 'navigation') {
+    // Add nodes to use as links for menu links.
+    $node1 = $this->drupalCreateNode(array('type' => 'article'));
+    $node2 = $this->drupalCreateNode(array('type' => 'article'));
+    $node3 = $this->drupalCreateNode(array('type' => 'article'));
+    $node4 = $this->drupalCreateNode(array('type' => 'article'));
+    $node5 = $this->drupalCreateNode(array('type' => 'article'));
+
+    // Add menu links.
+    $item1 = $this->addMenuLink(0, 'node/' . $node1->nid, $menu_name);
+    $item2 = $this->addMenuLink($item1['mlid'], 'node/' . $node2->nid, $menu_name, FALSE);
+    $item3 = $this->addMenuLink($item2['mlid'], 'node/' . $node3->nid, $menu_name);
+    $this->assertMenuLink($item1['mlid'], array('depth' => 1, 'has_children' => 1, 'p1' => $item1['mlid'], 'p2' => 0));
+    $this->assertMenuLink($item2['mlid'], array('depth' => 2, 'has_children' => 1, 'p1' => $item1['mlid'], 'p2' => $item2['mlid'], 'p3' => 0));
+    $this->assertMenuLink($item3['mlid'], array('depth' => 3, 'has_children' => 0, 'p1' => $item1['mlid'], 'p2' => $item2['mlid'], 'p3' => $item3['mlid'], 'p4' => 0));
+
+    // Verify menu links.
+    $this->verifyMenuLink($item1, $node1);
+    $this->verifyMenuLink($item2, $node2, $item1, $node1);
+    $this->verifyMenuLink($item3, $node3, $item2, $node2);
+
+    // Add more menu links.
+    $item4 = $this->addMenuLink(0, 'node/' . $node4->nid, $menu_name);
+    $item5 = $this->addMenuLink($item4['mlid'], 'node/' . $node5->nid, $menu_name);
+    $this->assertMenuLink($item4['mlid'], array('depth' => 1, 'has_children' => 1, 'p1' => $item4['mlid'], 'p2' => 0));
+    $this->assertMenuLink($item5['mlid'], array('depth' => 2, 'has_children' => 0, 'p1' => $item4['mlid'], 'p2' => $item5['mlid'], 'p3' => 0));
+
+    // Modify menu links.
+    $this->modifyMenuLink($item1);
+    $this->modifyMenuLink($item2);
+
+    // Toggle menu links.
+    $this->toggleMenuLink($item1);
+    $this->toggleMenuLink($item2);
+
+    // Move link and verify that descendants are updated.
+    $this->moveMenuLink($item2, $item5['mlid'], $menu_name);
+    $this->assertMenuLink($item1['mlid'], array('depth' => 1, 'has_children' => 0, 'p1' => $item1['mlid'], 'p2' => 0));
+    $this->assertMenuLink($item4['mlid'], array('depth' => 1, 'has_children' => 1, 'p1' => $item4['mlid'], 'p2' => 0));
+    $this->assertMenuLink($item5['mlid'], array('depth' => 2, 'has_children' => 1, 'p1' => $item4['mlid'], 'p2' => $item5['mlid'], 'p3' => 0));
+    $this->assertMenuLink($item2['mlid'], array('depth' => 3, 'has_children' => 1, 'p1' => $item4['mlid'], 'p2' => $item5['mlid'], 'p3' => $item2['mlid'], 'p4' => 0));
+    $this->assertMenuLink($item3['mlid'], array('depth' => 4, 'has_children' => 0, 'p1' => $item4['mlid'], 'p2' => $item5['mlid'], 'p3' => $item2['mlid'], 'p4' => $item3['mlid'], 'p5' => 0));
+
+    // Enable a link via the overview form.
+    $this->disableMenuLink($item1);
+    $edit = array();
+
+    // Note in the UI the 'mlid:x[hidden]' form element maps to enabled, or
+    // NOT hidden.
+    $edit['mlid:' . $item1['mlid'] . '[hidden]'] = TRUE;
+    $this->drupalPost('admin/structure/menu/manage/' . $item1['menu_name'], $edit, t('Save configuration'));
+
+    // Verify in the database.
+    $this->assertMenuLink($item1['mlid'], array('hidden' => 0));
+
+    // Save menu links for later tests.
+    $this->items[] = $item1;
+    $this->items[] = $item2;
+  }
+
+  /**
+   * Add and remove a menu link with a query string and fragment.
+   */
+  function testMenuQueryAndFragment() {
+    $this->drupalLogin($this->big_user);
+
+    // Make a path with query and fragment on.
+    $path = 'node?arg1=value1&arg2=value2';
+    $item = $this->addMenuLink(0, $path);
+
+    $this->drupalGet('admin/structure/menu/item/' . $item['mlid'] . '/edit');
+    $this->assertFieldByName('link_path', $path, 'Path is found with both query and fragment.');
+
+    // Now change the path to something without query and fragment.
+    $path = 'node';
+    $this->drupalPost('admin/structure/menu/item/' . $item['mlid'] . '/edit', array('link_path' => $path), t('Save'));
+    $this->drupalGet('admin/structure/menu/item/' . $item['mlid'] . '/edit');
+    $this->assertFieldByName('link_path', $path, 'Path no longer has query or fragment.');
+  }
+
+  /**
+   * Add a menu link using the menu module UI.
+   *
+   * @param integer $plid Parent menu link id.
+   * @param string $link Link path.
+   * @param string $menu_name Menu name.
+   * @return array Menu link created.
+   */
+  function addMenuLink($plid = 0, $link = '<front>', $menu_name = 'navigation', $expanded = TRUE) {
+    // View add menu link page.
+    $this->drupalGet("admin/structure/menu/manage/$menu_name/add");
+    $this->assertResponse(200);
+
+    $title = '!link_' . $this->randomName(16);
+    $edit = array(
+      'link_path' => $link,
+      'link_title' => $title,
+      'description' => '',
+      'enabled' => TRUE, // Use this to disable the menu and test.
+      'expanded' => $expanded, // Setting this to true should test whether it works when we do the std_user tests.
+      'parent' =>  $menu_name . ':' . $plid,
+      'weight' => '0',
+    );
+
+    // Add menu link.
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertResponse(200);
+    // Unlike most other modules, there is no confirmation message displayed.
+    $this->assertText($title, 'Menu link was added');
+
+    $item = db_query('SELECT * FROM {menu_links} WHERE link_title = :title', array(':title' => $title))->fetchAssoc();
+    $this->assertTrue(t('Menu link was found in database.'));
+    $this->assertMenuLink($item['mlid'], array('menu_name' => $menu_name, 'link_path' => $link, 'has_children' => 0, 'plid' => $plid));
+
+    return $item;
+  }
+
+  /**
+   * Attempt to add menu link with invalid path or no access permission.
+   *
+   * @param string $menu_name Menu name.
+   */
+  function addInvalidMenuLink($menu_name = 'navigation') {
+    foreach (array('-&-', 'admin/people/permissions', '#') as $link_path) {
+      $edit = array(
+        'link_path' => $link_path,
+        'link_title' => 'title',
+      );
+      $this->drupalPost("admin/structure/menu/manage/$menu_name/add", $edit, t('Save'));
+      $this->assertRaw(t("The path '@path' is either invalid or you do not have access to it.", array('@path' => $link_path)), 'Menu link was not created');
+    }
+  }
+
+  /**
+   * Verify a menu link using the menu module UI.
+   *
+   * @param array $item Menu link.
+   * @param object $item_node Menu link content node.
+   * @param array $parent Parent menu link.
+   * @param object $parent_node Parent menu link content node.
+   */
+  function verifyMenuLink($item, $item_node, $parent = NULL, $parent_node = NULL) {
+    // View home page.
+    $this->drupalGet('');
+    $this->assertResponse(200);
+
+    // Verify parent menu link.
+    if (isset($parent)) {
+      // Verify menu link.
+      $title = $parent['link_title'];
+      $this->assertLink($title, 0, 'Parent menu link was displayed');
+
+      // Verify menu link link.
+      $this->clickLink($title);
+      $title = $parent_node->title;
+      $this->assertTitle(t("@title | Drupal", array('@title' => $title)), 'Parent menu link link target was correct');
+    }
+
+    // Verify menu link.
+    $title = $item['link_title'];
+    $this->assertLink($title, 0, 'Menu link was displayed');
+
+    // Verify menu link link.
+    $this->clickLink($title);
+    $title = $item_node->title;
+    $this->assertTitle(t("@title | Drupal", array('@title' => $title)), 'Menu link link target was correct');
+  }
+
+  /**
+   * Change the parent of a menu link using the menu module UI.
+   */
+  function moveMenuLink($item, $plid, $menu_name) {
+    $mlid = $item['mlid'];
+
+    $edit = array(
+      'parent' => $menu_name . ':' . $plid,
+    );
+    $this->drupalPost("admin/structure/menu/item/$mlid/edit", $edit, t('Save'));
+    $this->assertResponse(200);
+  }
+
+  /**
+   * Modify a menu link using the menu module UI.
+   *
+   * @param array $item Menu link passed by reference.
+   */
+  function modifyMenuLink(&$item) {
+    $item['link_title'] = $this->randomName(16);
+
+    $mlid = $item['mlid'];
+    $title = $item['link_title'];
+
+    // Edit menu link.
+    $edit = array();
+    $edit['link_title'] = $title;
+    $this->drupalPost("admin/structure/menu/item/$mlid/edit", $edit, t('Save'));
+    $this->assertResponse(200);
+    // Unlike most other modules, there is no confirmation message displayed.
+
+    // Verify menu link.
+    $this->drupalGet('admin/structure/menu/manage/' . $item['menu_name']);
+    $this->assertText($title, 'Menu link was edited');
+  }
+
+  /**
+   * Reset a standard menu link using the menu module UI.
+   *
+   * @param array $item Menu link.
+   * @param string $old_title Original title for menu link.
+   */
+  function resetMenuLink($item, $old_title) {
+    $mlid = $item['mlid'];
+    $title = $item['link_title'];
+
+    // Reset menu link.
+    $this->drupalPost("admin/structure/menu/item/$mlid/reset", array(), t('Reset'));
+    $this->assertResponse(200);
+    $this->assertRaw(t('The menu link was reset to its default settings.'), 'Menu link was reset');
+
+    // Verify menu link.
+    $this->drupalGet('');
+    $this->assertNoText($title, 'Menu link was reset');
+    $this->assertText($old_title, 'Menu link was reset');
+  }
+
+  /**
+   * Delete a menu link using the menu module UI.
+   *
+   * @param array $item Menu link.
+   */
+  function deleteMenuLink($item) {
+    $mlid = $item['mlid'];
+    $title = $item['link_title'];
+
+    // Delete menu link.
+    $this->drupalPost("admin/structure/menu/item/$mlid/delete", array(), t('Confirm'));
+    $this->assertResponse(200);
+    $this->assertRaw(t('The menu link %title has been deleted.', array('%title' => $title)), 'Menu link was deleted');
+
+    // Verify deletion.
+    $this->drupalGet('');
+    $this->assertNoText($title, 'Menu link was deleted');
+  }
+
+  /**
+   * Alternately disable and enable a menu link.
+   *
+   * @param $item
+   *   Menu link.
+   */
+  function toggleMenuLink($item) {
+    $this->disableMenuLink($item);
+
+    // Verify menu link is absent.
+    $this->drupalGet('');
+    $this->assertNoText($item['link_title'], 'Menu link was not displayed');
+    $this->enableMenuLink($item);
+
+    // Verify menu link is displayed.
+    $this->drupalGet('');
+    $this->assertText($item['link_title'], 'Menu link was displayed');
+  }
+
+  /**
+   * Disable a menu link.
+   *
+   * @param $item
+   *   Menu link.
+   */
+  function disableMenuLink($item) {
+    $mlid = $item['mlid'];
+    $edit['enabled'] = FALSE;
+    $this->drupalPost("admin/structure/menu/item/$mlid/edit", $edit, t('Save'));
+
+    // Unlike most other modules, there is no confirmation message displayed.
+    // Verify in the database.
+    $this->assertMenuLink($mlid, array('hidden' => 1));
+  }
+
+  /**
+   * Enable a menu link.
+   *
+   * @param $item
+   *   Menu link.
+   */
+  function enableMenuLink($item) {
+    $mlid = $item['mlid'];
+    $edit['enabled'] = TRUE;
+    $this->drupalPost("admin/structure/menu/item/$mlid/edit", $edit, t('Save'));
+
+    // Verify in the database.
+    $this->assertMenuLink($mlid, array('hidden' => 0));
+  }
+
+  /**
+   * Fetch the menu item from the database and compare it to the specified
+   * array.
+   *
+   * @param $mlid
+   *   Menu item id.
+   * @param $item
+   *   Array containing properties to verify.
+   */
+  function assertMenuLink($mlid, array $expected_item) {
+    // Retrieve menu link.
+    $item = db_query('SELECT * FROM {menu_links} WHERE mlid = :mlid', array(':mlid' => $mlid))->fetchAssoc();
+    $options = unserialize($item['options']);
+    if (!empty($options['query'])) {
+      $item['link_path'] .= '?' . drupal_http_build_query($options['query']);
+    }
+    if (!empty($options['fragment'])) {
+      $item['link_path'] .= '#' . $options['fragment'];
+    }
+    foreach ($expected_item as $key => $value) {
+      $this->assertEqual($item[$key], $value, format_string('Parameter %key had expected value.', array('%key' => $key)));
+    }
+  }
+
+  /**
+   * Get standard menu link.
+   */
+  private function getStandardMenuLink() {
+    // Retrieve menu link id of the Log out menu link, which will always be on the front page.
+    $mlid = db_query("SELECT mlid FROM {menu_links} WHERE module = 'system' AND router_path = 'user/logout'")->fetchField();
+    $this->assertTrue($mlid > 0, 'Standard menu link id was found');
+    // Load menu link.
+    // Use api function so that link is translated for rendering.
+    $item = menu_link_load($mlid);
+    $this->assertTrue((bool) $item, 'Standard menu link was loaded');
+    return $item;
+  }
+
+  /**
+   * Verify the logged in user has the desired access to the various menu nodes.
+   *
+   * @param integer $response HTTP response code.
+   */
+  private function verifyAccess($response = 200) {
+    // View menu help node.
+    $this->drupalGet('admin/help/menu');
+    $this->assertResponse($response);
+    if ($response == 200) {
+      $this->assertText(t('Menu'), 'Menu help was displayed');
+    }
+
+    // View menu build overview node.
+    $this->drupalGet('admin/structure/menu');
+    $this->assertResponse($response);
+    if ($response == 200) {
+      $this->assertText(t('Menus'), 'Menu build overview node was displayed');
+    }
+
+    // View navigation menu customization node.
+    $this->drupalGet('admin/structure/menu/manage/navigation');
+        $this->assertResponse($response);
+    if ($response == 200) {
+      $this->assertText(t('Navigation'), 'Navigation menu node was displayed');
+    }
+
+    // View menu edit node.
+    $item = $this->getStandardMenuLink();
+    $this->drupalGet('admin/structure/menu/item/' . $item['mlid'] . '/edit');
+    $this->assertResponse($response);
+    if ($response == 200) {
+      $this->assertText(t('Edit menu item'), 'Menu edit node was displayed');
+    }
+
+    // View menu settings node.
+    $this->drupalGet('admin/structure/menu/settings');
+    $this->assertResponse($response);
+    if ($response == 200) {
+      $this->assertText(t('Menus'), 'Menu settings node was displayed');
+    }
+
+    // View add menu node.
+    $this->drupalGet('admin/structure/menu/add');
+    $this->assertResponse($response);
+    if ($response == 200) {
+      $this->assertText(t('Menus'), 'Add menu node was displayed');
+    }
+  }
+}
+
+/**
+ * Test menu settings for nodes.
+ */
+class MenuNodeTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Menu settings for nodes',
+      'description' => 'Add, edit, and delete a node with menu link.',
+      'group' => 'Menu',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('menu');
+
+    $this->admin_user = $this->drupalCreateUser(array(
+      'access administration pages',
+      'administer content types',
+      'administer menu',
+      'create page content',
+      'edit any page content',
+      'delete any page content',
+    ));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Test creating, editing, deleting menu links via node form widget.
+   */
+  function testMenuNodeFormWidget() {
+    // Enable Navigation menu as available menu.
+    $edit = array(
+      'menu_options[navigation]' => 1,
+    );
+    $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
+    // Change default parent item to Navigation menu, so we can assert more
+    // easily.
+    $edit = array(
+      'menu_parent' => 'navigation:0',
+    );
+    $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
+
+    // Create a node.
+    $node_title = $this->randomName();
+    $language = LANGUAGE_NONE;
+    $edit = array(
+      "title" => $node_title,
+      "body[$language][0][value]" => $this->randomString(),
+    );
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $node = $this->drupalGetNodeByTitle($node_title);
+    // Assert that there is no link for the node.
+    $this->drupalGet('');
+    $this->assertNoLink($node_title);
+
+    // Edit the node, enable the menu link setting, but skip the link title.
+    $edit = array(
+      'menu[enabled]' => 1,
+    );
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    // Assert that there is no link for the node.
+    $this->drupalGet('');
+    $this->assertNoLink($node_title);
+
+    // Edit the node and create a menu link.
+    $edit = array(
+      'menu[enabled]' => 1,
+      'menu[link_title]' => $node_title,
+      'menu[weight]' => 17,
+    );
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    // Assert that the link exists.
+    $this->drupalGet('');
+    $this->assertLink($node_title);
+
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertOptionSelected('edit-menu-weight', 17, 'Menu weight correct in edit form');
+
+    // Edit the node and remove the menu link.
+    $edit = array(
+      'menu[enabled]' => FALSE,
+    );
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    // Assert that there is no link for the node.
+    $this->drupalGet('');
+    $this->assertNoLink($node_title);
+
+    // Add a menu link to the Management menu.
+    $item = array(
+      'link_path' => 'node/' . $node->nid,
+      'link_title' => $this->randomName(16),
+      'menu_name' => 'management',
+    );
+    menu_link_save($item);
+
+    // Assert that disabled Management menu is not shown on the node/$nid/edit page.
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertText('Provide a menu link', 'Link in not allowed menu not shown in node edit form');
+    // Assert that the link is still in the management menu after save.
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $link = menu_link_load($item['mlid']);
+    $this->assertTrue($link, 'Link in not allowed menu still exists after saving node');
+
+    // Move the menu link back to the Navigation menu.
+    $item['menu_name'] = 'navigation';
+    menu_link_save($item);
+    // Create a second node.
+    $child_node = $this->drupalCreateNode(array('type' => 'article'));
+    // Assign a menu link to the second node, being a child of the first one.
+    $child_item = array(
+      'link_path' => 'node/'. $child_node->nid,
+      'link_title' => $this->randomName(16),
+      'plid' => $item['mlid'],
+    );
+    menu_link_save($child_item);
+    // Edit the first node.
+    $this->drupalGet('node/'. $node->nid .'/edit');
+    // Assert that it is not possible to set the parent of the first node to itself or the second node.
+    $this->assertNoOption('edit-menu-parent', 'navigation:'. $item['mlid']);
+    $this->assertNoOption('edit-menu-parent', 'navigation:'. $child_item['mlid']);
+    // Assert that unallowed Management menu is not available in options.
+    $this->assertNoOption('edit-menu-parent', 'management:0');
+  }
+
+  /**
+   * Asserts that a select option in the current page does not exist.
+   *
+   * @param $id
+   *   Id of select field to assert.
+   * @param $option
+   *   Option to assert.
+   * @param $message
+   *   Message to display.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   *
+   * @todo move to simpletest drupal_web_test_case.php.
+   */
+  protected function assertNoOption($id, $option, $message = '') {
+    $selects = $this->xpath('//select[@id=:id]', array(':id' => $id));
+    $options = $this->xpath('//select[@id=:id]//option[@value=:option]', array(':id' => $id, ':option' => $option));
+    return $this->assertTrue(isset($selects[0]) && !isset($options[0]), $message ? $message : t('Option @option for field @id does not exist.', array('@option' => $option, '@id' => $id)), t('Browser'));
+  }
+}
diff --git a/htmltest/modules/node/content_types.inc b/htmltest/modules/node/content_types.inc
new file mode 100644
index 00000000..55af6670
--- /dev/null
+++ b/htmltest/modules/node/content_types.inc
@@ -0,0 +1,450 @@
+<?php
+
+/**
+ * @file
+ * Content type editing user interface.
+ */
+
+/**
+ * Displays the content type admin overview page.
+ */
+function node_overview_types() {
+  $types = node_type_get_types();
+  $names = node_type_get_names();
+  $field_ui = module_exists('field_ui');
+  $header = array(t('Name'), array('data' => t('Operations'), 'colspan' => $field_ui ? '4' : '2'));
+  $rows = array();
+
+  foreach ($names as $key => $name) {
+    $type = $types[$key];
+    if (node_hook($type->type, 'form')) {
+      $type_url_str = str_replace('_', '-', $type->type);
+      $row = array(theme('node_admin_overview', array('name' => $name, 'type' => $type)));
+      // Set the edit column.
+      $row[] = array('data' => l(t('edit'), 'admin/structure/types/manage/' . $type_url_str));
+
+      if ($field_ui) {
+        // Manage fields.
+        $row[] = array('data' => l(t('manage fields'), 'admin/structure/types/manage/' . $type_url_str . '/fields'));
+
+        // Display fields.
+        $row[] = array('data' => l(t('manage display'), 'admin/structure/types/manage/' . $type_url_str . '/display'));
+      }
+
+      // Set the delete column.
+      if ($type->custom) {
+        $row[] = array('data' => l(t('delete'), 'admin/structure/types/manage/' . $type_url_str . '/delete'));
+      }
+      else {
+        $row[] = array('data' => '');
+      }
+
+      $rows[] = $row;
+    }
+  }
+
+  $build['node_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#empty' => t('No content types available. <a href="@link">Add content type</a>.', array('@link' => url('admin/structure/types/add'))),
+  );
+
+  return $build;
+}
+
+/**
+ * Returns HTML for a node type description for the content type admin overview page.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - name: The human-readable name of the content type.
+ *   - type: An object containing the 'type' (machine name) and 'description' of
+ *     the content type.
+ *
+ * @ingroup themeable
+ */
+function theme_node_admin_overview($variables) {
+  $name = $variables['name'];
+  $type = $variables['type'];
+
+  $output = check_plain($name);
+  $output .= ' <small>' . t('(Machine name: @type)', array('@type' => $type->type)) . '</small>';
+  $output .= '<div class="description">' . filter_xss_admin($type->description) . '</div>';
+  return $output;
+}
+
+/**
+ * Form constructor for the node type editing form.
+ *
+ * @param $type
+ *   (optional) An object representing the node type, when editing an existing
+ *   node type.
+ *
+ * @see node_type_form_validate()
+ * @see node_type_form_submit()
+ * @ingroup forms
+ */
+function node_type_form($form, &$form_state, $type = NULL) {
+  if (!isset($type->type)) {
+    // This is a new type. Node module managed types are custom and unlocked.
+    $type = node_type_set_defaults(array('custom' => 1, 'locked' => 0));
+  }
+
+  // Make the type object available to implementations of hook_form_alter.
+  $form['#node_type'] = $type;
+
+  $form['name'] = array(
+    '#title' => t('Name'),
+    '#type' => 'textfield',
+    '#default_value' => $type->name,
+    '#description' => t('The human-readable name of this content type. This text will be displayed as part of the list on the <em>Add new content</em> page. It is recommended that this name begin with a capital letter and contain only letters, numbers, and spaces. This name must be unique.'),
+    '#required' => TRUE,
+    '#size' => 30,
+  );
+
+  $form['type'] = array(
+    '#type' => 'machine_name',
+    '#default_value' => $type->type,
+    '#maxlength' => 32,
+    '#disabled' => $type->locked,
+    '#machine_name' => array(
+      'exists' => 'node_type_load',
+    ),
+    '#description' => t('A unique machine-readable name for this content type. It must only contain lowercase letters, numbers, and underscores. This name will be used for constructing the URL of the %node-add page, in which underscores will be converted into hyphens.', array(
+      '%node-add' => t('Add new content'),
+    )),
+  );
+
+  $form['description'] = array(
+    '#title' => t('Description'),
+    '#type' => 'textarea',
+    '#default_value' => $type->description,
+    '#description' => t('Describe this content type. The text will be displayed on the <em>Add new content</em> page.'),
+  );
+
+  $form['additional_settings'] = array(
+    '#type' => 'vertical_tabs',
+    '#attached' => array(
+      'js' => array(drupal_get_path('module', 'node') . '/content_types.js'),
+    ),
+  );
+
+  $form['submission'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Submission form settings'),
+    '#collapsible' => TRUE,
+    '#group' => 'additional_settings',
+  );
+  $form['submission']['title_label'] = array(
+    '#title' => t('Title field label'),
+    '#type' => 'textfield',
+    '#default_value' => $type->title_label,
+    '#required' => TRUE,
+  );
+  if (!$type->has_title) {
+    // Avoid overwriting a content type that intentionally does not have a
+    // title field.
+    $form['submission']['title_label']['#attributes'] = array('disabled' => 'disabled');
+    $form['submission']['title_label']['#description'] = t('This content type does not have a title field.');
+    $form['submission']['title_label']['#required'] = FALSE;
+  }
+  $form['submission']['node_preview'] = array(
+    '#type' => 'radios',
+    '#title' => t('Preview before submitting'),
+    '#default_value' => variable_get('node_preview_' . $type->type, DRUPAL_OPTIONAL),
+    '#options' => array(
+      DRUPAL_DISABLED => t('Disabled'),
+      DRUPAL_OPTIONAL => t('Optional'),
+      DRUPAL_REQUIRED => t('Required'),
+    ),
+  );
+  $form['submission']['help']  = array(
+    '#type' => 'textarea',
+    '#title' => t('Explanation or submission guidelines'),
+    '#default_value' => $type->help,
+    '#description' => t('This text will be displayed at the top of the page when creating or editing content of this type.'),
+  );
+  $form['workflow'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Publishing options'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#group' => 'additional_settings',
+  );
+  $form['workflow']['node_options'] = array('#type' => 'checkboxes',
+    '#title' => t('Default options'),
+    '#default_value' => variable_get('node_options_' . $type->type, array('status', 'promote')),
+    '#options' => array(
+      'status' => t('Published'),
+      'promote' => t('Promoted to front page'),
+      'sticky' => t('Sticky at top of lists'),
+      'revision' => t('Create new revision'),
+    ),
+    '#description' => t('Users with the <em>Administer content</em> permission will be able to override these options.'),
+  );
+  $form['display'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Display settings'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#group' => 'additional_settings',
+  );
+  $form['display']['node_submitted'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Display author and date information.'),
+    '#default_value' => variable_get('node_submitted_' . $type->type, TRUE),
+    '#description' => t('Author username and publish date will be displayed.'),
+  );
+  $form['old_type'] = array(
+    '#type' => 'value',
+    '#value' => $type->type,
+  );
+  $form['orig_type'] = array(
+    '#type' => 'value',
+    '#value' => isset($type->orig_type) ? $type->orig_type : '',
+  );
+  $form['base'] = array(
+    '#type' => 'value',
+    '#value' => $type->base,
+  );
+  $form['custom'] = array(
+    '#type' => 'value',
+    '#value' => $type->custom,
+  );
+  $form['modified'] = array(
+    '#type' => 'value',
+    '#value' => $type->modified,
+  );
+  $form['locked'] = array(
+    '#type' => 'value',
+    '#value' => $type->locked,
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save content type'),
+    '#weight' => 40,
+  );
+
+  if ($type->custom) {
+    if (!empty($type->type)) {
+      $form['actions']['delete'] = array(
+        '#type' => 'submit',
+        '#value' => t('Delete content type'),
+        '#weight' => 45,
+      );
+    }
+  }
+
+  return $form;
+}
+
+/**
+ * Helper function for teaser length choices.
+ */
+function _node_characters($length) {
+  return ($length == 0) ? t('Unlimited') : format_plural($length, '1 character', '@count characters');
+}
+
+/**
+ * Form validation handler for node_type_form().
+ *
+ * @see node_type_form_submit()
+ */
+function node_type_form_validate($form, &$form_state) {
+  $type = new stdClass();
+  $type->type = $form_state['values']['type'];
+  $type->name = trim($form_state['values']['name']);
+
+  // Work out what the type was before the user submitted this form
+  $old_type = $form_state['values']['old_type'];
+
+  $types = node_type_get_names();
+
+  if (!$form_state['values']['locked']) {
+    // 'theme' conflicts with theme_node_form().
+    // '0' is invalid, since elsewhere we check it using empty().
+    if (in_array($type->type, array('0', 'theme'))) {
+      form_set_error('type', t("Invalid machine-readable name. Enter a name other than %invalid.", array('%invalid' => $type->type)));
+    }
+  }
+
+  $names = array_flip($types);
+
+  if (isset($names[$type->name]) && $names[$type->name] != $old_type) {
+    form_set_error('name', t('The human-readable name %name is already taken.', array('%name' => $type->name)));
+  }
+}
+
+/**
+ * Form submission handler for node_type_form().
+ *
+ * @see node_type_form_validate()
+ */
+function node_type_form_submit($form, &$form_state) {
+  $op = isset($form_state['values']['op']) ? $form_state['values']['op'] : '';
+
+  $type = node_type_set_defaults();
+
+  $type->type = $form_state['values']['type'];
+  $type->name = trim($form_state['values']['name']);
+  $type->orig_type = trim($form_state['values']['orig_type']);
+  $type->old_type = isset($form_state['values']['old_type']) ? $form_state['values']['old_type'] : $type->type;
+
+  $type->description = $form_state['values']['description'];
+  $type->help = $form_state['values']['help'];
+  $type->title_label = $form_state['values']['title_label'];
+  // title_label is required in core; has_title will always be true, unless a
+  // module alters the title field.
+  $type->has_title = ($type->title_label != '');
+
+  $type->base = !empty($form_state['values']['base']) ? $form_state['values']['base'] : 'node_content';
+  $type->custom = $form_state['values']['custom'];
+  $type->modified = TRUE;
+  $type->locked = $form_state['values']['locked'];
+  if (isset($form['#node_type']->module)) {
+    $type->module = $form['#node_type']->module;
+  }
+
+  if ($op == t('Delete content type')) {
+    $form_state['redirect'] = 'admin/structure/types/manage/' . str_replace('_', '-', $type->old_type) . '/delete';
+    return;
+  }
+
+  $variables = $form_state['values'];
+
+  // Remove everything that's been saved already - whatever's left is assumed
+  // to be a persistent variable.
+  foreach ($variables as $key => $value) {
+    if (isset($type->$key)) {
+      unset($variables[$key]);
+    }
+  }
+
+  unset($variables['form_token'], $variables['op'], $variables['submit'], $variables['delete'], $variables['reset'], $variables['form_id'], $variables['form_build_id']);
+
+  // Save or reset persistent variable values.
+  foreach ($variables as $key => $value) {
+    $variable_new = $key . '_' . $type->type;
+    $variable_old = $key . '_' . $type->old_type;
+
+    if (is_array($value)) {
+      $value = array_keys(array_filter($value));
+    }
+    variable_set($variable_new, $value);
+
+    if ($variable_new != $variable_old) {
+      variable_del($variable_old);
+    }
+  }
+
+  // Saving the content type after saving the variables allows modules to act
+  // on those variables via hook_node_type_insert().
+  $status = node_type_save($type);
+
+  node_types_rebuild();
+  menu_rebuild();
+  $t_args = array('%name' => $type->name);
+
+  if ($status == SAVED_UPDATED) {
+    drupal_set_message(t('The content type %name has been updated.', $t_args));
+  }
+  elseif ($status == SAVED_NEW) {
+    node_add_body_field($type);
+    drupal_set_message(t('The content type %name has been added.', $t_args));
+    watchdog('node', 'Added content type %name.', $t_args, WATCHDOG_NOTICE, l(t('view'), 'admin/structure/types'));
+  }
+
+  $form_state['redirect'] = 'admin/structure/types';
+  return;
+}
+
+/**
+ * Implements hook_node_type_insert().
+ */
+function node_node_type_insert($info) {
+  if (!empty($info->old_type) && $info->old_type != $info->type) {
+    $update_count = node_type_update_nodes($info->old_type, $info->type);
+
+    if ($update_count) {
+      drupal_set_message(format_plural($update_count, 'Changed the content type of 1 post from %old-type to %type.', 'Changed the content type of @count posts from %old-type to %type.', array('%old-type' => $info->old_type, '%type' => $info->type)));
+    }
+  }
+}
+
+/**
+ * Implements hook_node_type_update().
+ */
+function node_node_type_update($info) {
+  if (!empty($info->old_type) && $info->old_type != $info->type) {
+    $update_count = node_type_update_nodes($info->old_type, $info->type);
+
+    if ($update_count) {
+      drupal_set_message(format_plural($update_count, 'Changed the content type of 1 post from %old-type to %type.', 'Changed the content type of @count posts from %old-type to %type.', array('%old-type' => $info->old_type, '%type' => $info->type)));
+    }
+  }
+}
+
+/**
+ * Resets relevant fields of a module-defined node type to their default values.
+ *
+ * @param $type
+ *   The node type to reset. The node type is passed back by reference with its
+ *   resetted values. If there is no module-defined info for this node type,
+ *   then nothing happens.
+ */
+function node_type_reset($type) {
+  $info_array = module_invoke_all('node_info');
+  if (isset($info_array[$type->orig_type])) {
+    $info_array[$type->orig_type]['type'] = $type->orig_type;
+    $info = node_type_set_defaults($info_array[$type->orig_type]);
+
+    foreach ($info as $field => $value) {
+      $type->$field = $value;
+    }
+  }
+}
+
+/**
+ * Menu callback; delete a single content type.
+ *
+ * @ingroup forms
+ */
+function node_type_delete_confirm($form, &$form_state, $type) {
+  $form['type'] = array('#type' => 'value', '#value' => $type->type);
+  $form['name'] = array('#type' => 'value', '#value' => $type->name);
+
+  $message = t('Are you sure you want to delete the content type %type?', array('%type' => $type->name));
+  $caption = '';
+
+  $num_nodes = db_query("SELECT COUNT(*) FROM {node} WHERE type = :type", array(':type' => $type->type))->fetchField();
+  if ($num_nodes) {
+    $caption .= '<p>' . format_plural($num_nodes, '%type is used by 1 piece of content on your site. If you remove this content type, you will not be able to edit the %type content and it may not display correctly.', '%type is used by @count pieces of content on your site. If you remove %type, you will not be able to edit the %type content and it may not display correctly.', array('%type' => $type->name)) . '</p>';
+  }
+
+  $caption .= '<p>' . t('This action cannot be undone.') . '</p>';
+
+  return confirm_form($form, $message, 'admin/structure/types', $caption, t('Delete'));
+}
+
+/**
+ * Process content type delete confirm submissions.
+ *
+ * @see node_type_delete_confirm()
+ */
+function node_type_delete_confirm_submit($form, &$form_state) {
+  node_type_delete($form_state['values']['type']);
+
+  variable_del('node_preview_' . $form_state['values']['type']);
+  $t_args = array('%name' => $form_state['values']['name']);
+  drupal_set_message(t('The content type %name has been deleted.', $t_args));
+  watchdog('node', 'Deleted content type %name.', $t_args, WATCHDOG_NOTICE);
+
+  node_types_rebuild();
+  menu_rebuild();
+
+  $form_state['redirect'] = 'admin/structure/types';
+  return;
+}
diff --git a/htmltest/modules/node/content_types.js b/htmltest/modules/node/content_types.js
new file mode 100644
index 00000000..0031c323
--- /dev/null
+++ b/htmltest/modules/node/content_types.js
@@ -0,0 +1,34 @@
+(function ($) {
+
+Drupal.behaviors.contentTypes = {
+  attach: function (context) {
+    // Provide the vertical tab summaries.
+    $('fieldset#edit-submission', context).drupalSetSummary(function(context) {
+      var vals = [];
+      vals.push(Drupal.checkPlain($('#edit-title-label', context).val()) || Drupal.t('Requires a title'));
+      return vals.join(', ');
+    });
+    $('fieldset#edit-workflow', context).drupalSetSummary(function(context) {
+      var vals = [];
+      $("input[name^='node_options']:checked", context).parent().each(function() {
+        vals.push(Drupal.checkPlain($(this).text()));
+      });
+      if (!$('#edit-node-options-status', context).is(':checked')) {
+        vals.unshift(Drupal.t('Not published'));
+      }
+      return vals.join(', ');
+    });
+    $('fieldset#edit-display', context).drupalSetSummary(function(context) {
+      var vals = [];
+      $('input:checked', context).next('label').each(function() {
+        vals.push(Drupal.checkPlain($(this).text()));
+      });
+      if (!$('#edit-node-submitted', context).is(':checked')) {
+        vals.unshift(Drupal.t("Don't display post information"));
+      }
+      return vals.join(', ');
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/node/node.admin.inc b/htmltest/modules/node/node.admin.inc
new file mode 100644
index 00000000..0d0bbc09
--- /dev/null
+++ b/htmltest/modules/node/node.admin.inc
@@ -0,0 +1,704 @@
+<?php
+
+/**
+ * @file
+ * Content administration and module settings UI.
+ */
+
+/**
+ * Menu callback: confirm rebuilding of permissions.
+ *
+ * @see node_configure_rebuild_confirm_submit()
+ * @see node_menu()
+ * @ingroup forms
+ */
+function node_configure_rebuild_confirm() {
+  return confirm_form(array(), t('Are you sure you want to rebuild the permissions on site content?'),
+                  'admin/reports/status', t('This action rebuilds all permissions on site content, and may be a lengthy process. This action cannot be undone.'), t('Rebuild permissions'), t('Cancel'));
+}
+
+/**
+ * Handler for wipe confirmation
+ *
+ * @see node_configure_rebuild_confirm()
+ */
+function node_configure_rebuild_confirm_submit($form, &$form_state) {
+  node_access_rebuild(TRUE);
+  $form_state['redirect'] = 'admin/reports/status';
+}
+
+/**
+ * Implements hook_node_operations().
+ */
+function node_node_operations() {
+  $operations = array(
+    'publish' => array(
+      'label' => t('Publish selected content'),
+      'callback' => 'node_mass_update',
+      'callback arguments' => array('updates' => array('status' => NODE_PUBLISHED)),
+    ),
+    'unpublish' => array(
+      'label' => t('Unpublish selected content'),
+      'callback' => 'node_mass_update',
+      'callback arguments' => array('updates' => array('status' => NODE_NOT_PUBLISHED)),
+    ),
+    'promote' => array(
+      'label' => t('Promote selected content to front page'),
+      'callback' => 'node_mass_update',
+      'callback arguments' => array('updates' => array('status' => NODE_PUBLISHED, 'promote' => NODE_PROMOTED)),
+    ),
+    'demote' => array(
+      'label' => t('Demote selected content from front page'),
+      'callback' => 'node_mass_update',
+      'callback arguments' => array('updates' => array('promote' => NODE_NOT_PROMOTED)),
+    ),
+    'sticky' => array(
+      'label' => t('Make selected content sticky'),
+      'callback' => 'node_mass_update',
+      'callback arguments' => array('updates' => array('status' => NODE_PUBLISHED, 'sticky' => NODE_STICKY)),
+    ),
+    'unsticky' => array(
+      'label' => t('Make selected content not sticky'),
+      'callback' => 'node_mass_update',
+      'callback arguments' => array('updates' => array('sticky' => NODE_NOT_STICKY)),
+    ),
+    'delete' => array(
+      'label' => t('Delete selected content'),
+      'callback' => NULL,
+    ),
+  );
+  return $operations;
+}
+
+/**
+ * List node administration filters that can be applied.
+ *
+ * @return
+ *   An associative array of filters.
+ */
+function node_filters() {
+  // Regular filters
+  $filters['status'] = array(
+    'title' => t('status'),
+    'options' => array(
+      '[any]' => t('any'),
+      'status-1' => t('published'),
+      'status-0' => t('not published'),
+      'promote-1' => t('promoted'),
+      'promote-0' => t('not promoted'),
+      'sticky-1' => t('sticky'),
+      'sticky-0' => t('not sticky'),
+    ),
+  );
+  // Include translation states if we have this module enabled
+  if (module_exists('translation')) {
+    $filters['status']['options'] += array(
+      'translate-0' => t('Up to date translation'),
+      'translate-1' => t('Outdated translation'),
+    );
+  }
+
+  $filters['type'] = array(
+    'title' => t('type'),
+    'options' => array(
+      '[any]' => t('any'),
+    ) + node_type_get_names(),
+  );
+
+  // Language filter if there is a list of languages
+  if ($languages = module_invoke('locale', 'language_list')) {
+    $languages = array(LANGUAGE_NONE => t('Language neutral')) + $languages;
+    $filters['language'] = array(
+      'title' => t('language'),
+      'options' => array(
+        '[any]' => t('any'),
+      ) + $languages,
+    );
+  }
+  return $filters;
+}
+
+/**
+ * Applies filters for node administration filters based on session.
+ *
+ * @param $query
+ *   A SelectQuery to which the filters should be applied.
+ */
+function node_build_filter_query(SelectQueryInterface $query) {
+  // Build query
+  $filter_data = isset($_SESSION['node_overview_filter']) ? $_SESSION['node_overview_filter'] : array();
+  foreach ($filter_data as $index => $filter) {
+    list($key, $value) = $filter;
+    switch ($key) {
+      case 'status':
+        // Note: no exploitable hole as $key/$value have already been checked when submitted
+        list($key, $value) = explode('-', $value, 2);
+      case 'type':
+      case 'language':
+        $query->condition('n.' . $key, $value);
+        break;
+    }
+  }
+}
+
+/**
+ * Returns the node administration filters form array to node_admin_content().
+ *
+ * @see node_admin_nodes()
+ * @see node_admin_nodes_submit()
+ * @see node_admin_nodes_validate()
+ * @see node_filter_form_submit()
+ * @see node_multiple_delete_confirm()
+ * @see node_multiple_delete_confirm_submit()
+ *
+ * @ingroup forms
+ */
+function node_filter_form() {
+  $session = isset($_SESSION['node_overview_filter']) ? $_SESSION['node_overview_filter'] : array();
+  $filters = node_filters();
+
+  $i = 0;
+  $form['filters'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Show only items where'),
+    '#theme' => 'exposed_filters__node',
+  );
+  foreach ($session as $filter) {
+    list($type, $value) = $filter;
+    if ($type == 'term') {
+      // Load term name from DB rather than search and parse options array.
+      $value = module_invoke('taxonomy', 'term_load', $value);
+      $value = $value->name;
+    }
+    elseif ($type == 'language') {
+      $value = $value == LANGUAGE_NONE ? t('Language neutral') : module_invoke('locale', 'language_name', $value);
+    }
+    else {
+      $value = $filters[$type]['options'][$value];
+    }
+    $t_args = array('%property' => $filters[$type]['title'], '%value' => $value);
+    if ($i++) {
+      $form['filters']['current'][] = array('#markup' => t('and where %property is %value', $t_args));
+    }
+    else {
+      $form['filters']['current'][] = array('#markup' => t('where %property is %value', $t_args));
+    }
+    if (in_array($type, array('type', 'language'))) {
+      // Remove the option if it is already being filtered on.
+      unset($filters[$type]);
+    }
+  }
+
+  $form['filters']['status'] = array(
+    '#type' => 'container',
+    '#attributes' => array('class' => array('clearfix')),
+    '#prefix' => ($i ? '<div class="additional-filters">' . t('and where') . '</div>' : ''),
+  );
+  $form['filters']['status']['filters'] = array(
+    '#type' => 'container',
+    '#attributes' => array('class' => array('filters')),
+  );
+  foreach ($filters as $key => $filter) {
+    $form['filters']['status']['filters'][$key] = array(
+      '#type' => 'select',
+      '#options' => $filter['options'],
+      '#title' => $filter['title'],
+      '#default_value' => '[any]',
+    );
+  }
+
+  $form['filters']['status']['actions'] = array(
+    '#type' => 'actions',
+    '#attributes' => array('class' => array('container-inline')),
+  );
+  $form['filters']['status']['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => count($session) ? t('Refine') : t('Filter'),
+  );
+  if (count($session)) {
+    $form['filters']['status']['actions']['undo'] = array('#type' => 'submit', '#value' => t('Undo'));
+    $form['filters']['status']['actions']['reset'] = array('#type' => 'submit', '#value' => t('Reset'));
+  }
+
+  drupal_add_js('misc/form.js');
+
+  return $form;
+}
+
+/**
+ * Form submission handler for node_filter_form().
+ *
+ * @see node_admin_content()
+ * @see node_admin_nodes()
+ * @see node_admin_nodes_submit()
+ * @see node_admin_nodes_validate()
+ * @see node_filter_form()
+ * @see node_multiple_delete_confirm()
+ * @see node_multiple_delete_confirm_submit()
+ */
+function node_filter_form_submit($form, &$form_state) {
+  $filters = node_filters();
+  switch ($form_state['values']['op']) {
+    case t('Filter'):
+    case t('Refine'):
+      // Apply every filter that has a choice selected other than 'any'.
+      foreach ($filters as $filter => $options) {
+        if (isset($form_state['values'][$filter]) && $form_state['values'][$filter] != '[any]') {
+          // Flatten the options array to accommodate hierarchical/nested options.
+          $flat_options = form_options_flatten($filters[$filter]['options']);
+          // Only accept valid selections offered on the dropdown, block bad input.
+          if (isset($flat_options[$form_state['values'][$filter]])) {
+            $_SESSION['node_overview_filter'][] = array($filter, $form_state['values'][$filter]);
+          }
+        }
+      }
+      break;
+    case t('Undo'):
+      array_pop($_SESSION['node_overview_filter']);
+      break;
+    case t('Reset'):
+      $_SESSION['node_overview_filter'] = array();
+      break;
+  }
+}
+
+/**
+ * Make mass update of nodes, changing all nodes in the $nodes array
+ * to update them with the field values in $updates.
+ *
+ * IMPORTANT NOTE: This function is intended to work when called from a form
+ * submission handler. Calling it outside of the form submission process may not
+ * work correctly.
+ *
+ * @param array $nodes
+ *   Array of node nids to update.
+ * @param array $updates
+ *   Array of key/value pairs with node field names and the value to update that
+ *   field to.
+ */
+function node_mass_update($nodes, $updates) {
+  // We use batch processing to prevent timeout when updating a large number
+  // of nodes.
+  if (count($nodes) > 10) {
+    $batch = array(
+      'operations' => array(
+        array('_node_mass_update_batch_process', array($nodes, $updates))
+      ),
+      'finished' => '_node_mass_update_batch_finished',
+      'title' => t('Processing'),
+      // We use a single multi-pass operation, so the default
+      // 'Remaining x of y operations' message will be confusing here.
+      'progress_message' => '',
+      'error_message' => t('The update has encountered an error.'),
+      // The operations do not live in the .module file, so we need to
+      // tell the batch engine which file to load before calling them.
+      'file' => drupal_get_path('module', 'node') . '/node.admin.inc',
+    );
+    batch_set($batch);
+  }
+  else {
+    foreach ($nodes as $nid) {
+      _node_mass_update_helper($nid, $updates);
+    }
+    drupal_set_message(t('The update has been performed.'));
+  }
+}
+
+/**
+ * Updates individual nodes when fewer than 10 are queued.
+ *
+ * @param $nid
+ *   ID of node to update.
+ * @param $updates
+ *   Associative array of updates.
+ *
+ * @return object
+ *   An updated node object.
+ *
+ * @see node_mass_update()
+ */
+function _node_mass_update_helper($nid, $updates) {
+  $node = node_load($nid, NULL, TRUE);
+  // For efficiency manually save the original node before applying any changes.
+  $node->original = clone $node;
+  foreach ($updates as $name => $value) {
+    $node->$name = $value;
+  }
+  node_save($node);
+  return $node;
+}
+
+/**
+ * Executes a batch operation for node_mass_update().
+ *
+ * @param array $nodes
+ *   An array of node IDs.
+ * @param array $updates
+ *   Associative array of updates.
+ * @param array $context
+ *   An array of contextual key/values.
+ */
+function _node_mass_update_batch_process($nodes, $updates, &$context) {
+  if (!isset($context['sandbox']['progress'])) {
+    $context['sandbox']['progress'] = 0;
+    $context['sandbox']['max'] = count($nodes);
+    $context['sandbox']['nodes'] = $nodes;
+  }
+
+  // Process nodes by groups of 5.
+  $count = min(5, count($context['sandbox']['nodes']));
+  for ($i = 1; $i <= $count; $i++) {
+    // For each nid, load the node, reset the values, and save it.
+    $nid = array_shift($context['sandbox']['nodes']);
+    $node = _node_mass_update_helper($nid, $updates);
+
+    // Store result for post-processing in the finished callback.
+    $context['results'][] = l($node->title, 'node/' . $node->nid);
+
+    // Update our progress information.
+    $context['sandbox']['progress']++;
+  }
+
+  // Inform the batch engine that we are not finished,
+  // and provide an estimation of the completion level we reached.
+  if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
+    $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
+  }
+}
+
+/**
+ * Menu callback: Reports the status of batch operation for node_mass_update().
+ *
+ * @param bool $success
+ *   A boolean indicating whether the batch mass update operation successfully
+ *   concluded.
+ * @param int $results
+ *   The number of nodes updated via the batch mode process.
+ * @param array $operations
+ *   An array of function calls (not used in this function).
+ */
+function _node_mass_update_batch_finished($success, $results, $operations) {
+  if ($success) {
+    drupal_set_message(t('The update has been performed.'));
+  }
+  else {
+    drupal_set_message(t('An error occurred and processing did not complete.'), 'error');
+    $message = format_plural(count($results), '1 item successfully processed:', '@count items successfully processed:');
+    $message .= theme('item_list', array('items' => $results));
+    drupal_set_message($message);
+  }
+}
+
+/**
+ * Page callback: Form constructor for the content administration form.
+ *
+ * @see node_admin_nodes()
+ * @see node_admin_nodes_submit()
+ * @see node_admin_nodes_validate()
+ * @see node_filter_form()
+ * @see node_filter_form_submit()
+ * @see node_menu()
+ * @see node_multiple_delete_confirm()
+ * @see node_multiple_delete_confirm_submit()
+ * @ingroup forms
+ */
+function node_admin_content($form, $form_state) {
+  if (isset($form_state['values']['operation']) && $form_state['values']['operation'] == 'delete') {
+    return node_multiple_delete_confirm($form, $form_state, array_filter($form_state['values']['nodes']));
+  }
+  $form['filter'] = node_filter_form();
+  $form['#submit'][] = 'node_filter_form_submit';
+  $form['admin'] = node_admin_nodes();
+
+  return $form;
+}
+
+/**
+ * Form builder: Builds the node administration overview.
+ *
+ * @see node_admin_nodes_submit()
+ * @see node_admin_nodes_validate()
+ * @see node_filter_form()
+ * @see node_filter_form_submit()
+ * @see node_multiple_delete_confirm()
+ * @see node_multiple_delete_confirm_submit()
+ *
+ * @ingroup forms
+ */
+function node_admin_nodes() {
+  $admin_access = user_access('administer nodes');
+
+  // Build the 'Update options' form.
+  $form['options'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Update options'),
+    '#attributes' => array('class' => array('container-inline')),
+    '#access' => $admin_access,
+  );
+  $options = array();
+  foreach (module_invoke_all('node_operations') as $operation => $array) {
+    $options[$operation] = $array['label'];
+  }
+  $form['options']['operation'] = array(
+    '#type' => 'select',
+    '#title' => t('Operation'),
+    '#title_display' => 'invisible',
+    '#options' => $options,
+    '#default_value' => 'approve',
+  );
+  $form['options']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Update'),
+    '#validate' => array('node_admin_nodes_validate'),
+    '#submit' => array('node_admin_nodes_submit'),
+  );
+
+  // Enable language column if translation module is enabled or if we have any
+  // node with language.
+  $multilanguage = (module_exists('translation') || db_query_range("SELECT 1 FROM {node} WHERE language <> :language", 0, 1, array(':language' => LANGUAGE_NONE))->fetchField());
+
+  // Build the sortable table header.
+  $header = array(
+    'title' => array('data' => t('Title'), 'field' => 'n.title'),
+    'type' => array('data' => t('Type'), 'field' => 'n.type'),
+    'author' => t('Author'),
+    'status' => array('data' => t('Status'), 'field' => 'n.status'),
+    'changed' => array('data' => t('Updated'), 'field' => 'n.changed', 'sort' => 'desc')
+  );
+  if ($multilanguage) {
+    $header['language'] = array('data' => t('Language'), 'field' => 'n.language');
+  }
+  $header['operations'] = array('data' => t('Operations'));
+
+  $query = db_select('node', 'n')->extend('PagerDefault')->extend('TableSort');
+  node_build_filter_query($query);
+
+  if (!user_access('bypass node access')) {
+    // If the user is able to view their own unpublished nodes, allow them
+    // to see these in addition to published nodes. Check that they actually
+    // have some unpublished nodes to view before adding the condition.
+    if (user_access('view own unpublished content') && $own_unpublished = db_query('SELECT nid FROM {node} WHERE uid = :uid AND status = :status', array(':uid' => $GLOBALS['user']->uid, ':status' => 0))->fetchCol()) {
+      $query->condition(db_or()
+        ->condition('n.status', 1)
+        ->condition('n.nid', $own_unpublished, 'IN')
+      );
+    }
+    else {
+      // If not, restrict the query to published nodes.
+      $query->condition('n.status', 1);
+    }
+  }
+  $nids = $query
+    ->fields('n',array('nid'))
+    ->limit(50)
+    ->orderByHeader($header)
+    ->addTag('node_access')
+    ->execute()
+    ->fetchCol();
+  $nodes = node_load_multiple($nids);
+
+  // Prepare the list of nodes.
+  $languages = language_list();
+  $destination = drupal_get_destination();
+  $options = array();
+  foreach ($nodes as $node) {
+    $langcode = entity_language('node', $node);
+    $l_options = $langcode != LANGUAGE_NONE && isset($languages[$langcode]) ? array('language' => $languages[$langcode]) : array();
+    $options[$node->nid] = array(
+      'title' => array(
+        'data' => array(
+          '#type' => 'link',
+          '#title' => $node->title,
+          '#href' => 'node/' . $node->nid,
+          '#options' => $l_options,
+          '#suffix' => ' ' . theme('mark', array('type' => node_mark($node->nid, $node->changed))),
+        ),
+      ),
+      'type' => check_plain(node_type_get_name($node)),
+      'author' => theme('username', array('account' => $node)),
+      'status' => $node->status ? t('published') : t('not published'),
+      'changed' => format_date($node->changed, 'short'),
+    );
+    if ($multilanguage) {
+      if ($langcode == LANGUAGE_NONE || isset($languages[$langcode])) {
+        $options[$node->nid]['language'] = $langcode == LANGUAGE_NONE ? t('Language neutral') : t($languages[$langcode]->name);
+      }
+      else {
+        $options[$node->nid]['language'] = t('Undefined language (@langcode)', array('@langcode' => $langcode));
+      }
+    }
+    // Build a list of all the accessible operations for the current node.
+    $operations = array();
+    if (node_access('update', $node)) {
+      $operations['edit'] = array(
+        'title' => t('edit'),
+        'href' => 'node/' . $node->nid . '/edit',
+        'query' => $destination,
+      );
+    }
+    if (node_access('delete', $node)) {
+      $operations['delete'] = array(
+        'title' => t('delete'),
+        'href' => 'node/' . $node->nid . '/delete',
+        'query' => $destination,
+      );
+    }
+    $options[$node->nid]['operations'] = array();
+    if (count($operations) > 1) {
+      // Render an unordered list of operations links.
+      $options[$node->nid]['operations'] = array(
+        'data' => array(
+          '#theme' => 'links__node_operations',
+          '#links' => $operations,
+          '#attributes' => array('class' => array('links', 'inline')),
+        ),
+      );
+    }
+    elseif (!empty($operations)) {
+      // Render the first and only operation as a link.
+      $link = reset($operations);
+      $options[$node->nid]['operations'] = array(
+        'data' => array(
+          '#type' => 'link',
+          '#title' => $link['title'],
+          '#href' => $link['href'],
+          '#options' => array('query' => $link['query']),
+        ),
+      );
+    }
+  }
+
+  // Only use a tableselect when the current user is able to perform any
+  // operations.
+  if ($admin_access) {
+    $form['nodes'] = array(
+      '#type' => 'tableselect',
+      '#header' => $header,
+      '#options' => $options,
+      '#empty' => t('No content available.'),
+    );
+  }
+  // Otherwise, use a simple table.
+  else {
+    $form['nodes'] = array(
+      '#theme' => 'table',
+      '#header' => $header,
+      '#rows' => $options,
+      '#empty' => t('No content available.'),
+    );
+  }
+
+  $form['pager'] = array('#markup' => theme('pager'));
+  return $form;
+}
+
+/**
+ * Validate node_admin_nodes form submissions.
+ *
+ * Checks whether any nodes have been selected to perform the chosen 'Update
+ * option' on.
+ *
+ * @see node_admin_nodes()
+ * @see node_admin_nodes_submit()
+ * @see node_filter_form()
+ * @see node_filter_form_submit()
+ * @see node_multiple_delete_confirm()
+ * @see node_multiple_delete_confirm_submit()
+ */
+function node_admin_nodes_validate($form, &$form_state) {
+  // Error if there are no items to select.
+  if (!is_array($form_state['values']['nodes']) || !count(array_filter($form_state['values']['nodes']))) {
+    form_set_error('', t('No items selected.'));
+  }
+}
+
+/**
+ * Process node_admin_nodes form submissions.
+ *
+ * Executes the chosen 'Update option' on the selected nodes.
+ *
+ * @see node_admin_nodes()
+ * @see node_admin_nodes_validate()
+ * @see node_filter_form()
+ * @see node_filter_form_submit()
+ * @see node_multiple_delete_confirm()
+ * @see node_multiple_delete_confirm_submit()
+ */
+function node_admin_nodes_submit($form, &$form_state) {
+  $operations = module_invoke_all('node_operations');
+  $operation = $operations[$form_state['values']['operation']];
+  // Filter out unchecked nodes
+  $nodes = array_filter($form_state['values']['nodes']);
+  if ($function = $operation['callback']) {
+    // Add in callback arguments if present.
+    if (isset($operation['callback arguments'])) {
+      $args = array_merge(array($nodes), $operation['callback arguments']);
+    }
+    else {
+      $args = array($nodes);
+    }
+    call_user_func_array($function, $args);
+
+    cache_clear_all();
+  }
+  else {
+    // We need to rebuild the form to go to a second step. For example, to
+    // show the confirmation form for the deletion of nodes.
+    $form_state['rebuild'] = TRUE;
+  }
+}
+
+/**
+ * Multiple node deletion confirmation form for node_admin_content().
+ *
+ * @see node_admin_nodes()
+ * @see node_admin_nodes_submit()
+ * @see node_admin_nodes_validate()
+ * @see node_filter_form()
+ * @see node_filter_form_submit()
+ * @see node_multiple_delete_confirm_submit()
+ * @ingroup forms
+ */
+function node_multiple_delete_confirm($form, &$form_state, $nodes) {
+  $form['nodes'] = array('#prefix' => '<ul>', '#suffix' => '</ul>', '#tree' => TRUE);
+  // array_filter returns only elements with TRUE values
+  foreach ($nodes as $nid => $value) {
+    $title = db_query('SELECT title FROM {node} WHERE nid = :nid', array(':nid' => $nid))->fetchField();
+    $form['nodes'][$nid] = array(
+      '#type' => 'hidden',
+      '#value' => $nid,
+      '#prefix' => '<li>',
+      '#suffix' => check_plain($title) . "</li>\n",
+    );
+  }
+  $form['operation'] = array('#type' => 'hidden', '#value' => 'delete');
+  $form['#submit'][] = 'node_multiple_delete_confirm_submit';
+  $confirm_question = format_plural(count($nodes),
+                                  'Are you sure you want to delete this item?',
+                                  'Are you sure you want to delete these items?');
+  return confirm_form($form,
+                    $confirm_question,
+                    'admin/content', t('This action cannot be undone.'),
+                    t('Delete'), t('Cancel'));
+}
+
+/**
+ * Form submission handler for node_multiple_delete_confirm().
+ *
+ * @see node_admin_nodes()
+ * @see node_admin_nodes_submit()
+ * @see node_admin_nodes_validate()
+ * @see node_filter_form()
+ * @see node_filter_form_submit()
+ * @see node_multiple_delete_confirm()
+ */
+function node_multiple_delete_confirm_submit($form, &$form_state) {
+  if ($form_state['values']['confirm']) {
+    node_delete_multiple(array_keys($form_state['values']['nodes']));
+    cache_clear_all();
+    $count = count($form_state['values']['nodes']);
+    watchdog('content', 'Deleted @count posts.', array('@count' => $count));
+    drupal_set_message(format_plural($count, 'Deleted 1 post.', 'Deleted @count posts.'));
+  }
+  $form_state['redirect'] = 'admin/content';
+}
diff --git a/htmltest/modules/node/node.api.php b/htmltest/modules/node/node.api.php
new file mode 100644
index 00000000..f8dcfdef
--- /dev/null
+++ b/htmltest/modules/node/node.api.php
@@ -0,0 +1,1298 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Node module.
+ */
+
+/**
+ * @defgroup node_api_hooks Node API Hooks
+ * @{
+ * Functions to define and modify content types.
+ *
+ * Each content type is maintained by a primary module, which is either
+ * node.module (for content types created in the user interface) or the module
+ * that implements hook_node_info() to define the content type.
+ *
+ * During node operations (create, update, view, delete, etc.), there are
+ * several sets of hooks that get invoked to allow modules to modify the base
+ * node operation:
+ * - Node-type-specific hooks: These hooks are only invoked on the primary
+ *   module, using the "base" return component of hook_node_info() as the
+ *   function prefix.  For example, poll.module defines the base for the Poll
+ *   content type as "poll", so during creation of a poll node, hook_insert() is
+ *   only invoked by calling poll_insert().
+ * - All-module hooks: This set of hooks is invoked on all implementing modules,
+ *   to allow other modules to modify what the primary node module is doing. For
+ *   example, hook_node_insert() is invoked on all modules when creating a poll
+ *   node.
+ * - Field hooks: Hooks related to the fields attached to the node. These are
+ *   invoked from the field operations functions described below, and can be
+ *   either field-type-specific or all-module hooks.
+ * - Entity hooks: Generic hooks for "entity" operations. These are always
+ *   invoked on all modules.
+ *
+ * Here is a list of the node and entity hooks that are invoked, field
+ * operations, and other steps that take place during node operations:
+ * - Creating a new node (calling node_save() on a new node):
+ *   - field_attach_presave()
+ *   - hook_node_presave() (all)
+ *   - hook_entity_presave() (all)
+ *   - Node and revision records are written to the database
+ *   - hook_insert() (node-type-specific)
+ *   - field_attach_insert()
+ *   - hook_node_insert() (all)
+ *   - hook_entity_insert() (all)
+ *   - hook_node_access_records() (all)
+ *   - hook_node_access_records_alter() (all)
+ * - Updating an existing node (calling node_save() on an existing node):
+ *   - field_attach_presave()
+ *   - hook_node_presave() (all)
+ *   - hook_entity_presave() (all)
+ *   - Node and revision records are written to the database
+ *   - hook_update() (node-type-specific)
+ *   - field_attach_update()
+ *   - hook_node_update() (all)
+ *   - hook_entity_update() (all)
+ *   - hook_node_access_records() (all)
+ *   - hook_node_access_records_alter() (all)
+ * - Loading a node (calling node_load(), node_load_multiple() or entity_load()
+ *   with $entity_type of 'node'):
+ *   - Node and revision information is read from database.
+ *   - hook_load() (node-type-specific)
+ *   - field_attach_load_revision() and field_attach_load()
+ *   - hook_entity_load() (all)
+ *   - hook_node_load() (all)
+ * - Viewing a single node (calling node_view() - note that the input to
+ *   node_view() is a loaded node, so the Loading steps above are already done):
+ *   - hook_view() (node-type-specific)
+ *   - field_attach_prepare_view()
+ *   - hook_entity_prepare_view() (all)
+ *   - field_attach_view()
+ *   - hook_node_view() (all)
+ *   - hook_entity_view() (all)
+ *   - hook_node_view_alter() (all)
+ *   - hook_entity_view_alter() (all)
+ * - Viewing multiple nodes (calling node_view_multiple() - note that the input
+ *   to node_view_multiple() is a set of loaded nodes, so the Loading steps
+ *   above are already done):
+ *   - field_attach_prepare_view()
+ *   - hook_entity_prepare_view() (all)
+ *   - hook_view() (node-type-specific)
+ *   - field_attach_view()
+ *   - hook_node_view() (all)
+ *   - hook_entity_view() (all)
+ *   - hook_node_view_alter() (all)
+ *   - hook_entity_view_alter() (all)
+ * - Deleting a node (calling node_delete() or node_delete_multiple()):
+ *   - Node is loaded (see Loading section above)
+ *   - hook_delete() (node-type-specific)
+ *   - hook_node_delete() (all)
+ *   - hook_entity_delete() (all)
+ *   - field_attach_delete()
+ *   - Node and revision information are deleted from database
+ * - Deleting a node revision (calling node_revision_delete()):
+ *   - Node is loaded (see Loading section above)
+ *   - Revision information is deleted from database
+ *   - hook_node_revision_delete() (all)
+ *   - field_attach_delete_revision()
+ * - Preparing a node for editing (calling node_form() - note that if it is an
+ *   existing node, it will already be loaded; see the Loading section above):
+ *   - hook_prepare() (node-type-specific)
+ *   - hook_node_prepare() (all)
+ *   - hook_form() (node-type-specific)
+ *   - field_attach_form()
+ * - Validating a node during editing form submit (calling
+ *   node_form_validate()):
+ *   - hook_validate() (node-type-specific)
+ *   - hook_node_validate() (all)
+ *   - field_attach_form_validate()
+ * - Searching (calling node_search_execute()):
+ *   - hook_ranking() (all)
+ *   - Query is executed to find matching nodes
+ *   - Resulting node is loaded (see Loading section above)
+ *   - Resulting node is prepared for viewing (see Viewing a single node above)
+ *   - comment_node_update_index() is called.
+ *   - hook_node_search_result() (all)
+ * - Search indexing (calling node_update_index()):
+ *   - Node is loaded (see Loading section above)
+ *   - Node is prepared for viewing (see Viewing a single node above)
+ *   - hook_node_update_index() (all)
+ * @}
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Inform the node access system what permissions the user has.
+ *
+ * This hook is for implementation by node access modules. In this hook,
+ * the module grants a user different "grant IDs" within one or more
+ * "realms". In hook_node_access_records(), the realms and grant IDs are
+ * associated with permission to view, edit, and delete individual nodes.
+ *
+ * The realms and grant IDs can be arbitrarily defined by your node access
+ * module; it is common to use role IDs as grant IDs, but that is not required.
+ * Your module could instead maintain its own list of users, where each list has
+ * an ID. In that case, the return value of this hook would be an array of the
+ * list IDs that this user is a member of.
+ *
+ * A node access module may implement as many realms as necessary to properly
+ * define the access privileges for the nodes. Note that the system makes no
+ * distinction between published and unpublished nodes. It is the module's
+ * responsibility to provide appropriate realms to limit access to unpublished
+ * content.
+ *
+ * Node access records are stored in the {node_access} table and define which
+ * grants are required to access a node. There is a special case for the view
+ * operation -- a record with node ID 0 corresponds to a "view all" grant for
+ * the realm and grant ID of that record. If there are no node access modules
+ * enabled, the core node module adds a node ID 0 record for realm 'all'. Node
+ * access modules can also grant "view all" permission on their custom realms;
+ * for example, a module could create a record in {node_access} with:
+ * @code
+ * $record = array(
+ *   'nid' => 0,
+ *   'gid' => 888,
+ *   'realm' => 'example_realm',
+ *   'grant_view' => 1,
+ *   'grant_update' => 0,
+ *   'grant_delete' => 0,
+ * );
+ * drupal_write_record('node_access', $record);
+ * @endcode
+ * And then in its hook_node_grants() implementation, it would need to return:
+ * @code
+ * if ($op == 'view') {
+ *   $grants['example_realm'] = array(888);
+ * }
+ * @endcode
+ * If you decide to do this, be aware that the node_access_rebuild() function
+ * will erase any node ID 0 entry when it is called, so you will need to make
+ * sure to restore your {node_access} record after node_access_rebuild() is
+ * called.
+ *
+ * @see node_access_view_all_nodes()
+ * @see node_access_rebuild()
+ *
+ * @param $account
+ *   The user object whose grants are requested.
+ * @param $op
+ *   The node operation to be performed, such as 'view', 'update', or 'delete'.
+ *
+ * @return
+ *   An array whose keys are "realms" of grants, and whose values are arrays of
+ *   the grant IDs within this realm that this user is being granted.
+ *
+ * For a detailed example, see node_access_example.module.
+ *
+ * @ingroup node_access
+ */
+function hook_node_grants($account, $op) {
+  if (user_access('access private content', $account)) {
+    $grants['example'] = array(1);
+  }
+  $grants['example_owner'] = array($account->uid);
+  return $grants;
+}
+
+/**
+ * Set permissions for a node to be written to the database.
+ *
+ * When a node is saved, a module implementing hook_node_access_records() will
+ * be asked if it is interested in the access permissions for a node. If it is
+ * interested, it must respond with an array of permissions arrays for that
+ * node.
+ *
+ * Node access grants apply regardless of the published or unpublished status
+ * of the node. Implementations must make sure not to grant access to
+ * unpublished nodes if they don't want to change the standard access control
+ * behavior. Your module may need to create a separate access realm to handle
+ * access to unpublished nodes.
+ *
+ * Note that the grant values in the return value from your hook must be
+ * integers and not boolean TRUE and FALSE.
+ *
+ * Each permissions item in the array is an array with the following elements:
+ * - 'realm': The name of a realm that the module has defined in
+ *   hook_node_grants().
+ * - 'gid': A 'grant ID' from hook_node_grants().
+ * - 'grant_view': If set to 1 a user that has been identified as a member
+ *   of this gid within this realm can view this node. This should usually be
+ *   set to $node->status. Failure to do so may expose unpublished content
+ *   to some users.
+ * - 'grant_update': If set to 1 a user that has been identified as a member
+ *   of this gid within this realm can edit this node.
+ * - 'grant_delete': If set to 1 a user that has been identified as a member
+ *   of this gid within this realm can delete this node.
+ * - 'priority': If multiple modules seek to set permissions on a node, the
+ *   realms that have the highest priority will win out, and realms with a lower
+ *   priority will not be written. If there is any doubt, it is best to
+ *   leave this 0.
+ *
+ *
+ * When an implementation is interested in a node but want to deny access to
+ * everyone, it may return a "deny all" grant:
+ *
+ * @code
+ * $grants[] = array(
+ *   'realm' => 'all',
+ *   'gid' => 0,
+ *   'grant_view' => 0,
+ *   'grant_update' => 0,
+ *   'grant_delete' => 0,
+ *   'priority' => 1,
+ * );
+ * @endcode
+ *
+ * Setting the priority should cancel out other grants. In the case of a
+ * conflict between modules, it is safer to use hook_node_access_records_alter()
+ * to return only the deny grant.
+ *
+ * Note: a deny all grant is not written to the database; denies are implicit.
+ *
+ * @see node_access_write_grants()
+ *
+ * @param $node
+ *   The node that has just been saved.
+ *
+ * @return
+ *   An array of grants as defined above.
+ *
+ * @see hook_node_access_records_alter()
+ * @ingroup node_access
+ */
+function hook_node_access_records($node) {
+  // We only care about the node if it has been marked private. If not, it is
+  // treated just like any other node and we completely ignore it.
+  if ($node->private) {
+    $grants = array();
+    // Only published nodes should be viewable to all users. If we allow access
+    // blindly here, then all users could view an unpublished node.
+    if ($node->status) {
+      $grants[] = array(
+        'realm' => 'example',
+        'gid' => 1,
+        'grant_view' => 1,
+        'grant_update' => 0,
+        'grant_delete' => 0,
+        'priority' => 0,
+      );
+    }
+    // For the example_author array, the GID is equivalent to a UID, which
+    // means there are many groups of just 1 user.
+    // Note that an author can always view his or her nodes, even if they
+    // have status unpublished.
+    $grants[] = array(
+      'realm' => 'example_author',
+      'gid' => $node->uid,
+      'grant_view' => 1,
+      'grant_update' => 1,
+      'grant_delete' => 1,
+      'priority' => 0,
+    );
+
+    return $grants;
+  }
+}
+
+/**
+ * Alter permissions for a node before it is written to the database.
+ *
+ * Node access modules establish rules for user access to content. Node access
+ * records are stored in the {node_access} table and define which permissions
+ * are required to access a node. This hook is invoked after node access modules
+ * returned their requirements via hook_node_access_records(); doing so allows
+ * modules to modify the $grants array by reference before it is stored, so
+ * custom or advanced business logic can be applied.
+ *
+ * @see hook_node_access_records()
+ *
+ * Upon viewing, editing or deleting a node, hook_node_grants() builds a
+ * permissions array that is compared against the stored access records. The
+ * user must have one or more matching permissions in order to complete the
+ * requested operation.
+ *
+ * A module may deny all access to a node by setting $grants to an empty array.
+ *
+ * @see hook_node_grants()
+ * @see hook_node_grants_alter()
+ *
+ * @param $grants
+ *   The $grants array returned by hook_node_access_records().
+ * @param $node
+ *   The node for which the grants were acquired.
+ *
+ * The preferred use of this hook is in a module that bridges multiple node
+ * access modules with a configurable behavior, as shown in the example with the
+ * 'is_preview' field.
+ *
+ * @ingroup node_access
+ */
+function hook_node_access_records_alter(&$grants, $node) {
+  // Our module allows editors to mark specific articles with the 'is_preview'
+  // field. If the node being saved has a TRUE value for that field, then only
+  // our grants are retained, and other grants are removed. Doing so ensures
+  // that our rules are enforced no matter what priority other grants are given.
+  if ($node->is_preview) {
+    // Our module grants are set in $grants['example'].
+    $temp = $grants['example'];
+    // Now remove all module grants but our own.
+    $grants = array('example' => $temp);
+  }
+}
+
+/**
+ * Alter user access rules when trying to view, edit or delete a node.
+ *
+ * Node access modules establish rules for user access to content.
+ * hook_node_grants() defines permissions for a user to view, edit or delete
+ * nodes by building a $grants array that indicates the permissions assigned to
+ * the user by each node access module. This hook is called to allow modules to
+ * modify the $grants array by reference, so the interaction of multiple node
+ * access modules can be altered or advanced business logic can be applied.
+ *
+ * @see hook_node_grants()
+ *
+ * The resulting grants are then checked against the records stored in the
+ * {node_access} table to determine if the operation may be completed.
+ *
+ * A module may deny all access to a user by setting $grants to an empty array.
+ *
+ * @see hook_node_access_records()
+ * @see hook_node_access_records_alter()
+ *
+ * @param $grants
+ *   The $grants array returned by hook_node_grants().
+ * @param $account
+ *   The user account requesting access to content.
+ * @param $op
+ *   The operation being performed, 'view', 'update' or 'delete'.
+ *
+ * Developers may use this hook to either add additional grants to a user or to
+ * remove existing grants. These rules are typically based on either the
+ * permissions assigned to a user role, or specific attributes of a user
+ * account.
+ *
+ * @ingroup node_access
+ */
+function hook_node_grants_alter(&$grants, $account, $op) {
+  // Our sample module never allows certain roles to edit or delete
+  // content. Since some other node access modules might allow this
+  // permission, we expressly remove it by returning an empty $grants
+  // array for roles specified in our variable setting.
+
+  // Get our list of banned roles.
+  $restricted = variable_get('example_restricted_roles', array());
+
+  if ($op != 'view' && !empty($restricted)) {
+    // Now check the roles for this account against the restrictions.
+    foreach ($restricted as $role_id) {
+      if (isset($account->roles[$role_id])) {
+        $grants = array();
+      }
+    }
+  }
+}
+
+/**
+ * Add mass node operations.
+ *
+ * This hook enables modules to inject custom operations into the mass
+ * operations dropdown found at admin/content, by associating a callback
+ * function with the operation, which is called when the form is submitted. The
+ * callback function receives one initial argument, which is an array of the
+ * checked nodes.
+ *
+ * @return
+ *   An array of operations. Each operation is an associative array that may
+ *   contain the following key-value pairs:
+ *   - label: (required) The label for the operation, displayed in the dropdown
+ *     menu.
+ *   - callback: (required) The function to call for the operation.
+ *   - callback arguments: (optional) An array of additional arguments to pass
+ *     to the callback function.
+ */
+function hook_node_operations() {
+  $operations = array(
+    'publish' => array(
+      'label' => t('Publish selected content'),
+      'callback' => 'node_mass_update',
+      'callback arguments' => array('updates' => array('status' => NODE_PUBLISHED)),
+    ),
+    'unpublish' => array(
+      'label' => t('Unpublish selected content'),
+      'callback' => 'node_mass_update',
+      'callback arguments' => array('updates' => array('status' => NODE_NOT_PUBLISHED)),
+    ),
+    'promote' => array(
+      'label' => t('Promote selected content to front page'),
+      'callback' => 'node_mass_update',
+      'callback arguments' => array('updates' => array('status' => NODE_PUBLISHED, 'promote' => NODE_PROMOTED)),
+    ),
+    'demote' => array(
+      'label' => t('Demote selected content from front page'),
+      'callback' => 'node_mass_update',
+      'callback arguments' => array('updates' => array('promote' => NODE_NOT_PROMOTED)),
+    ),
+    'sticky' => array(
+      'label' => t('Make selected content sticky'),
+      'callback' => 'node_mass_update',
+      'callback arguments' => array('updates' => array('status' => NODE_PUBLISHED, 'sticky' => NODE_STICKY)),
+    ),
+    'unsticky' => array(
+      'label' => t('Make selected content not sticky'),
+      'callback' => 'node_mass_update',
+      'callback arguments' => array('updates' => array('sticky' => NODE_NOT_STICKY)),
+    ),
+    'delete' => array(
+      'label' => t('Delete selected content'),
+      'callback' => NULL,
+    ),
+  );
+  return $operations;
+}
+
+/**
+ * Respond to node deletion.
+ *
+ * This hook is invoked from node_delete_multiple() after the type-specific
+ * hook_delete() has been invoked, but before hook_entity_delete and
+ * field_attach_delete() are called, and before the node is removed from the
+ * node table in the database.
+ *
+ * @param $node
+ *   The node that is being deleted.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_node_delete($node) {
+  db_delete('mytable')
+    ->condition('nid', $node->nid)
+    ->execute();
+}
+
+/**
+ * Respond to deletion of a node revision.
+ *
+ * This hook is invoked from node_revision_delete() after the revision has been
+ * removed from the node_revision table, and before
+ * field_attach_delete_revision() is called.
+ *
+ * @param $node
+ *   The node revision (node object) that is being deleted.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_node_revision_delete($node) {
+  db_delete('mytable')
+    ->condition('vid', $node->vid)
+    ->execute();
+}
+
+/**
+ * Respond to creation of a new node.
+ *
+ * This hook is invoked from node_save() after the database query that will
+ * insert the node into the node table is scheduled for execution, after the
+ * type-specific hook_insert() is invoked, and after field_attach_insert() is
+ * called.
+ *
+ * Note that when this hook is invoked, the changes have not yet been written to
+ * the database, because a database transaction is still in progress. The
+ * transaction is not finalized until the save operation is entirely completed
+ * and node_save() goes out of scope. You should not rely on data in the
+ * database at this time as it is not updated yet. You should also note that any
+ * write/update database queries executed from this hook are also not committed
+ * immediately. Check node_save() and db_transaction() for more info.
+ *
+ * @param $node
+ *   The node that is being created.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_node_insert($node) {
+  db_insert('mytable')
+    ->fields(array(
+      'nid' => $node->nid,
+      'extra' => $node->extra,
+    ))
+    ->execute();
+}
+
+/**
+ * Act on arbitrary nodes being loaded from the database.
+ *
+ * This hook should be used to add information that is not in the node or node
+ * revisions table, not to replace information that is in these tables (which
+ * could interfere with the entity cache). For performance reasons, information
+ * for all available nodes should be loaded in a single query where possible.
+ *
+ * This hook is invoked during node loading, which is handled by entity_load(),
+ * via classes NodeController and DrupalDefaultEntityController. After the node
+ * information is read from the database or the entity cache, hook_load() is
+ * invoked on the node's content type module, then field_attach_load_revision()
+ * or field_attach_load() is called, then hook_entity_load() is invoked on all
+ * implementing modules, and finally hook_node_load() is invoked on all
+ * implementing modules.
+ *
+ * @param $nodes
+ *   An array of the nodes being loaded, keyed by nid.
+ * @param $types
+ *   An array containing the node types present in $nodes. Allows for an early
+ *   return for modules that only support certain node types. However, if your
+ *   module defines a content type, you can use hook_load() to respond to
+ *   loading of just that content type.
+ *
+ * For a detailed usage example, see nodeapi_example.module.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_node_load($nodes, $types) {
+  // Decide whether any of $types are relevant to our purposes.
+  if (count(array_intersect($types_we_want_to_process, $types))) {
+    // Gather our extra data for each of these nodes.
+    $result = db_query('SELECT nid, foo FROM {mytable} WHERE nid IN(:nids)', array(':nids' => array_keys($nodes)));
+    // Add our extra data to the node objects.
+    foreach ($result as $record) {
+      $nodes[$record->nid]->foo = $record->foo;
+    }
+  }
+}
+
+/**
+ * Control access to a node.
+ *
+ * Modules may implement this hook if they want to have a say in whether or not
+ * a given user has access to perform a given operation on a node.
+ *
+ * The administrative account (user ID #1) always passes any access check, so
+ * this hook is not called in that case. Users with the "bypass node access"
+ * permission may always view and edit content through the administrative
+ * interface.
+ *
+ * Note that not all modules will want to influence access on all node types. If
+ * your module does not want to actively grant or block access, return
+ * NODE_ACCESS_IGNORE or simply return nothing. Blindly returning FALSE will
+ * break other node access modules.
+ *
+ * Also note that this function isn't called for node listings (e.g., RSS feeds,
+ * the default home page at path 'node', a recent content block, etc.) See
+ * @link node_access Node access rights @endlink for a full explanation.
+ *
+ * @param $node
+ *   Either a node object or the machine name of the content type on which to
+ *   perform the access check.
+ * @param $op
+ *   The operation to be performed. Possible values:
+ *   - "create"
+ *   - "delete"
+ *   - "update"
+ *   - "view"
+ * @param $account
+ *   The user object to perform the access check operation on.
+ *
+ * @return
+ *   - NODE_ACCESS_ALLOW: if the operation is to be allowed.
+ *   - NODE_ACCESS_DENY: if the operation is to be denied.
+ *   - NODE_ACCESS_IGNORE: to not affect this operation at all.
+ *
+ * @ingroup node_access
+ */
+function hook_node_access($node, $op, $account) {
+  $type = is_string($node) ? $node : $node->type;
+
+  if (in_array($type, node_permissions_get_configured_types())) {
+    if ($op == 'create' && user_access('create ' . $type . ' content', $account)) {
+      return NODE_ACCESS_ALLOW;
+    }
+
+    if ($op == 'update') {
+      if (user_access('edit any ' . $type . ' content', $account) || (user_access('edit own ' . $type . ' content', $account) && ($account->uid == $node->uid))) {
+        return NODE_ACCESS_ALLOW;
+      }
+    }
+
+    if ($op == 'delete') {
+      if (user_access('delete any ' . $type . ' content', $account) || (user_access('delete own ' . $type . ' content', $account) && ($account->uid == $node->uid))) {
+        return NODE_ACCESS_ALLOW;
+      }
+    }
+  }
+
+  // Returning nothing from this function would have the same effect.
+  return NODE_ACCESS_IGNORE;
+}
+
+
+/**
+ * Act on a node object about to be shown on the add/edit form.
+ *
+ * This hook is invoked from node_object_prepare() after the type-specific
+ * hook_prepare() is invoked.
+ *
+ * @param $node
+ *   The node that is about to be shown on the add/edit form.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_node_prepare($node) {
+  if (!isset($node->comment)) {
+    $node->comment = variable_get("comment_$node->type", COMMENT_NODE_OPEN);
+  }
+}
+
+/**
+ * Act on a node being displayed as a search result.
+ *
+ * This hook is invoked from node_search_execute(), after node_load() and
+ * node_view() have been called.
+ *
+ * @param $node
+ *   The node being displayed in a search result.
+ *
+ * @return array
+ *   Extra information to be displayed with search result. This information
+ *   should be presented as an associative array. It will be concatenated with
+ *   the post information (last updated, author) in the default search result
+ *   theming.
+ *
+ * @see template_preprocess_search_result()
+ * @see search-result.tpl.php
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_node_search_result($node) {
+  $comments = db_query('SELECT comment_count FROM {node_comment_statistics} WHERE nid = :nid', array('nid' => $node->nid))->fetchField();
+  return array('comment' => format_plural($comments, '1 comment', '@count comments'));
+}
+
+/**
+ * Act on a node being inserted or updated.
+ *
+ * This hook is invoked from node_save() before the node is saved to the
+ * database.
+ *
+ * @param $node
+ *   The node that is being inserted or updated.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_node_presave($node) {
+  if ($node->nid && $node->moderate) {
+    // Reset votes when node is updated:
+    $node->score = 0;
+    $node->users = '';
+    $node->votes = 0;
+  }
+}
+
+/**
+ * Respond to updates to a node.
+ *
+ * This hook is invoked from node_save() after the database query that will
+ * update node in the node table is scheduled for execution, after the
+ * type-specific hook_update() is invoked, and after field_attach_update() is
+ * called.
+ *
+ * Note that when this hook is invoked, the changes have not yet been written to
+ * the database, because a database transaction is still in progress. The
+ * transaction is not finalized until the save operation is entirely completed
+ * and node_save() goes out of scope. You should not rely on data in the
+ * database at this time as it is not updated yet. You should also note that any
+ * write/update database queries executed from this hook are also not committed
+ * immediately. Check node_save() and db_transaction() for more info.
+ *
+ * @param $node
+ *   The node that is being updated.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_node_update($node) {
+  db_update('mytable')
+    ->fields(array('extra' => $node->extra))
+    ->condition('nid', $node->nid)
+    ->execute();
+}
+
+/**
+ * Act on a node being indexed for searching.
+ *
+ * This hook is invoked during search indexing, after node_load(), and after the
+ * result of node_view() is added as $node->rendered to the node object.
+ *
+ * @param $node
+ *   The node being indexed.
+ *
+ * @return string
+ *   Additional node information to be indexed.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_node_update_index($node) {
+  $text = '';
+  $comments = db_query('SELECT subject, comment, format FROM {comment} WHERE nid = :nid AND status = :status', array(':nid' => $node->nid, ':status' => COMMENT_PUBLISHED));
+  foreach ($comments as $comment) {
+    $text .= '<h2>' . check_plain($comment->subject) . '</h2>' . check_markup($comment->comment, $comment->format, '', TRUE);
+  }
+  return $text;
+}
+
+/**
+ * Perform node validation before a node is created or updated.
+ *
+ * This hook is invoked from node_validate(), after a user has has finished
+ * editing the node and is previewing or submitting it. It is invoked at the
+ * end of all the standard validation steps, and after the type-specific
+ * hook_validate() is invoked.
+ *
+ * To indicate a validation error, use form_set_error().
+ *
+ * Note: Changes made to the $node object within your hook implementation will
+ * have no effect.  The preferred method to change a node's content is to use
+ * hook_node_presave() instead. If it is really necessary to change the node at
+ * the validate stage, you can use form_set_value().
+ *
+ * @param $node
+ *   The node being validated.
+ * @param $form
+ *   The form being used to edit the node.
+ * @param $form_state
+ *   The form state array.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_node_validate($node, $form, &$form_state) {
+  if (isset($node->end) && isset($node->start)) {
+    if ($node->start > $node->end) {
+      form_set_error('time', t('An event may not end before it starts.'));
+    }
+  }
+}
+
+/**
+ * Act on a node after validated form values have been copied to it.
+ *
+ * This hook is invoked when a node form is submitted with either the "Save" or
+ * "Preview" button, after form values have been copied to the form state's node
+ * object, but before the node is saved or previewed. It is a chance for modules
+ * to adjust the node's properties from what they are simply after a copy from
+ * $form_state['values']. This hook is intended for adjusting non-field-related
+ * properties. See hook_field_attach_submit() for customizing field-related
+ * properties.
+ *
+ * @param $node
+ *   The node object being updated in response to a form submission.
+ * @param $form
+ *   The form being used to edit the node.
+ * @param $form_state
+ *   The form state array.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_node_submit($node, $form, &$form_state) {
+  // Decompose the selected menu parent option into 'menu_name' and 'plid', if
+  // the form used the default parent selection widget.
+  if (!empty($form_state['values']['menu']['parent'])) {
+    list($node->menu['menu_name'], $node->menu['plid']) = explode(':', $form_state['values']['menu']['parent']);
+  }
+}
+
+/**
+ * Act on a node that is being assembled before rendering.
+ *
+ * The module may add elements to $node->content prior to rendering. This hook
+ * will be called after hook_view(). The structure of $node->content is a
+ * renderable array as expected by drupal_render().
+ *
+ * When $view_mode is 'rss', modules can also add extra RSS elements and
+ * namespaces to $node->rss_elements and $node->rss_namespaces respectively for
+ * the RSS item generated for this node.
+ * For details on how this is used, see node_feed().
+ *
+ * @see blog_node_view()
+ * @see forum_node_view()
+ * @see comment_node_view()
+ *
+ * @param $node
+ *   The node that is being assembled for rendering.
+ * @param $view_mode
+ *   The $view_mode parameter from node_view().
+ * @param $langcode
+ *   The language code used for rendering.
+ *
+ * @see hook_entity_view()
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_node_view($node, $view_mode, $langcode) {
+  $node->content['my_additional_field'] = array(
+    '#markup' => $additional_field,
+    '#weight' => 10,
+    '#theme' => 'mymodule_my_additional_field',
+  );
+}
+
+/**
+ * Alter the results of node_view().
+ *
+ * This hook is called after the content has been assembled in a structured
+ * array and may be used for doing processing which requires that the complete
+ * node content structure has been built.
+ *
+ * If the module wishes to act on the rendered HTML of the node rather than the
+ * structured content array, it may use this hook to add a #post_render
+ * callback.  Alternatively, it could also implement hook_preprocess_node(). See
+ * drupal_render() and theme() documentation respectively for details.
+ *
+ * @param $build
+ *   A renderable array representing the node content.
+ *
+ * @see node_view()
+ * @see hook_entity_view_alter()
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_node_view_alter(&$build) {
+  if ($build['#view_mode'] == 'full' && isset($build['an_additional_field'])) {
+    // Change its weight.
+    $build['an_additional_field']['#weight'] = -10;
+  }
+
+  // Add a #post_render callback to act on the rendered HTML of the node.
+  $build['#post_render'][] = 'my_module_node_post_render';
+}
+
+/**
+ * Define module-provided node types.
+ *
+ * This hook allows a module to define one or more of its own node types. For
+ * example, the blog module uses it to define a blog node-type named "Blog
+ * entry." The name and attributes of each desired node type are specified in an
+ * array returned by the hook.
+ *
+ * Only module-provided node types should be defined through this hook. User-
+ * provided (or 'custom') node types should be defined only in the 'node_type'
+ * database table, and should be maintained by using the node_type_save() and
+ * node_type_delete() functions.
+ *
+ * @return
+ *   An array of information defining the module's node types. The array
+ *   contains a sub-array for each node type, with the machine-readable type
+ *   name as the key. Each sub-array has up to 10 attributes. Possible
+ *   attributes:
+ *   - name: (required) The human-readable name of the node type.
+ *   - base: (required) The base string used to construct callbacks
+ *     corresponding to this node type (for example, if base is defined as
+ *     example_foo, then example_foo_insert will be called when inserting a node
+ *     of that type). This string is usually the name of the module, but not
+ *     always.
+ *   - description: (required) A brief description of the node type.
+ *   - help: (optional) Help information shown to the user when creating a node
+ *     of this type.
+ *   - has_title: (optional) A Boolean indicating whether or not this node type
+ *     has a title field.
+ *   - title_label: (optional) The label for the title field of this content
+ *     type.
+ *   - locked: (optional) A Boolean indicating whether the administrator can
+ *     change the machine name of this type. FALSE = changeable (not locked),
+ *     TRUE = unchangeable (locked).
+ *
+ * The machine name of a node type should contain only letters, numbers, and
+ * underscores. Underscores will be converted into hyphens for the purpose of
+ * constructing URLs.
+ *
+ * All attributes of a node type that are defined through this hook (except for
+ * 'locked') can be edited by a site administrator. This includes the
+ * machine-readable name of a node type, if 'locked' is set to FALSE.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_node_info() {
+  return array(
+    'blog' => array(
+      'name' => t('Blog entry'),
+      'base' => 'blog',
+      'description' => t('Use for multi-user blogs. Every user gets a personal blog.'),
+    )
+  );
+}
+
+/**
+ * Provide additional methods of scoring for core search results for nodes.
+ *
+ * A node's search score is used to rank it among other nodes matched by the
+ * search, with the highest-ranked nodes appearing first in the search listing.
+ *
+ * For example, a module allowing users to vote on content could expose an
+ * option to allow search results' rankings to be influenced by the average
+ * voting score of a node.
+ *
+ * All scoring mechanisms are provided as options to site administrators, and
+ * may be tweaked based on individual sites or disabled altogether if they do
+ * not make sense. Individual scoring mechanisms, if enabled, are assigned a
+ * weight from 1 to 10. The weight represents the factor of magnification of
+ * the ranking mechanism, with higher-weighted ranking mechanisms having more
+ * influence. In order for the weight system to work, each scoring mechanism
+ * must return a value between 0 and 1 for every node. That value is then
+ * multiplied by the administrator-assigned weight for the ranking mechanism,
+ * and then the weighted scores from all ranking mechanisms are added, which
+ * brings about the same result as a weighted average.
+ *
+ * @return
+ *   An associative array of ranking data. The keys should be strings,
+ *   corresponding to the internal name of the ranking mechanism, such as
+ *   'recent', or 'comments'. The values should be arrays themselves, with the
+ *   following keys available:
+ *   - title: (required) The human readable name of the ranking mechanism.
+ *   - join: (optional) The part of a query string to join to any additional
+ *     necessary table. This is not necessary if the table required is already
+ *     joined to by the base query, such as for the {node} table. Other tables
+ *     should use the full table name as an alias to avoid naming collisions.
+ *   - score: (required) The part of a query string to calculate the score for
+ *     the ranking mechanism based on values in the database. This does not need
+ *     to be wrapped in parentheses, as it will be done automatically; it also
+ *     does not need to take the weighted system into account, as it will be
+ *     done automatically. It does, however, need to calculate a decimal between
+ *     0 and 1; be careful not to cast the entire score to an integer by
+ *     inadvertently introducing a variable argument.
+ *   - arguments: (optional) If any arguments are required for the score, they
+ *     can be specified in an array here.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_ranking() {
+  // If voting is disabled, we can avoid returning the array, no hard feelings.
+  if (variable_get('vote_node_enabled', TRUE)) {
+    return array(
+      'vote_average' => array(
+        'title' => t('Average vote'),
+        // Note that we use i.sid, the search index's search item id, rather than
+        // n.nid.
+        'join' => 'LEFT JOIN {vote_node_data} vote_node_data ON vote_node_data.nid = i.sid',
+        // The highest possible score should be 1, and the lowest possible score,
+        // always 0, should be 0.
+        'score' => 'vote_node_data.average / CAST(%f AS DECIMAL)',
+        // Pass in the highest possible voting score as a decimal argument.
+        'arguments' => array(variable_get('vote_score_max', 5)),
+      ),
+    );
+  }
+}
+
+
+/**
+ * Respond to node type creation.
+ *
+ * This hook is invoked from node_type_save() after the node type is added to
+ * the database.
+ *
+ * @param $info
+ *   The node type object that is being created.
+ */
+function hook_node_type_insert($info) {
+  drupal_set_message(t('You have just created a content type with a machine name %type.', array('%type' => $info->type)));
+}
+
+/**
+ * Respond to node type updates.
+ *
+ * This hook is invoked from node_type_save() after the node type is updated in
+ * the database.
+ *
+ * @param $info
+ *   The node type object that is being updated.
+ */
+function hook_node_type_update($info) {
+  if (!empty($info->old_type) && $info->old_type != $info->type) {
+    $setting = variable_get('comment_' . $info->old_type, COMMENT_NODE_OPEN);
+    variable_del('comment_' . $info->old_type);
+    variable_set('comment_' . $info->type, $setting);
+  }
+}
+
+/**
+ * Respond to node type deletion.
+ *
+ * This hook is invoked from node_type_delete() after the node type is removed
+ * from the database.
+ *
+ * @param $info
+ *   The node type object that is being deleted.
+ */
+function hook_node_type_delete($info) {
+  variable_del('comment_' . $info->type);
+}
+
+/**
+ * Respond to node deletion.
+ *
+ * This hook is invoked only on the module that defines the node's content type
+ * (use hook_node_delete() to respond to all node deletions).
+ *
+ * This hook is invoked from node_delete_multiple() after the node has been
+ * removed from the node table in the database, before hook_node_delete() is
+ * invoked, and before field_attach_delete() is called.
+ *
+ * @param $node
+ *   The node that is being deleted.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_delete($node) {
+  db_delete('mytable')
+    ->condition('nid', $node->nid)
+    ->execute();
+}
+
+/**
+ * Act on a node object about to be shown on the add/edit form.
+ *
+ * This hook is invoked only on the module that defines the node's content type
+ * (use hook_node_prepare() to act on all node preparations).
+ *
+ * This hook is invoked from node_object_prepare() before the general
+ * hook_node_prepare() is invoked.
+ *
+ * @param $node
+ *   The node that is about to be shown on the add/edit form.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_prepare($node) {
+  if ($file = file_check_upload($field_name)) {
+    $file = file_save_upload($field_name, _image_filename($file->filename, NULL, TRUE));
+    if ($file) {
+      if (!image_get_info($file->uri)) {
+        form_set_error($field_name, t('Uploaded file is not a valid image'));
+        return;
+      }
+    }
+    else {
+      return;
+    }
+    $node->images['_original'] = $file->uri;
+    _image_build_derivatives($node, TRUE);
+    $node->new_file = TRUE;
+  }
+}
+
+/**
+ * Display a node editing form.
+ *
+ * This hook, implemented by node modules, is called to retrieve the form
+ * that is displayed to create or edit a node. This form is displayed at path
+ * node/add/[node type] or node/[node ID]/edit.
+ *
+ * The submit and preview buttons, administrative and display controls, and
+ * sections added by other modules (such as path settings, menu settings,
+ * comment settings, and fields managed by the Field UI module) are
+ * displayed automatically by the node module. This hook just needs to
+ * return the node title and form editing fields specific to the node type.
+ *
+ * @param $node
+ *   The node being added or edited.
+ * @param $form_state
+ *   The form state array.
+ *
+ * @return
+ *   An array containing the title and any custom form elements to be displayed
+ *   in the node editing form.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_form($node, &$form_state) {
+  $type = node_type_get_type($node);
+
+  $form['title'] = array(
+    '#type' => 'textfield',
+    '#title' => check_plain($type->title_label),
+    '#default_value' => !empty($node->title) ? $node->title : '',
+    '#required' => TRUE, '#weight' => -5
+  );
+
+  $form['field1'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Custom field'),
+    '#default_value' => $node->field1,
+    '#maxlength' => 127,
+  );
+  $form['selectbox'] = array(
+    '#type' => 'select',
+    '#title' => t('Select box'),
+    '#default_value' => $node->selectbox,
+    '#options' => array(
+      1 => 'Option A',
+      2 => 'Option B',
+      3 => 'Option C',
+    ),
+    '#description' => t('Choose an option.'),
+  );
+
+  return $form;
+}
+
+/**
+ * Respond to creation of a new node.
+ *
+ * This hook is invoked only on the module that defines the node's content type
+ * (use hook_node_insert() to act on all node insertions).
+ *
+ * This hook is invoked from node_save() after the node is inserted into the
+ * node table in the database, before field_attach_insert() is called, and
+ * before hook_node_insert() is invoked.
+ *
+ * @param $node
+ *   The node that is being created.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_insert($node) {
+  db_insert('mytable')
+    ->fields(array(
+      'nid' => $node->nid,
+      'extra' => $node->extra,
+    ))
+    ->execute();
+}
+
+/**
+ * Act on nodes being loaded from the database.
+ *
+ * This hook is invoked only on the module that defines the node's content type
+ * (use hook_node_load() to respond to all node loads).
+ *
+ * This hook is invoked during node loading, which is handled by entity_load(),
+ * via classes NodeController and DrupalDefaultEntityController. After the node
+ * information is read from the database or the entity cache, hook_load() is
+ * invoked on the node's content type module, then field_attach_node_revision()
+ * or field_attach_load() is called, then hook_entity_load() is invoked on all
+ * implementing modules, and finally hook_node_load() is invoked on all
+ * implementing modules.
+ *
+ * This hook should only be used to add information that is not in the node or
+ * node revisions table, not to replace information that is in these tables
+ * (which could interfere with the entity cache). For performance reasons,
+ * information for all available nodes should be loaded in a single query where
+ * possible.
+ *
+ * @param $nodes
+ *   An array of the nodes being loaded, keyed by nid.
+ *
+ * For a detailed usage example, see node_example.module.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_load($nodes) {
+  $result = db_query('SELECT nid, foo FROM {mytable} WHERE nid IN (:nids)', array(':nids' => array_keys($nodes)));
+  foreach ($result as $record) {
+    $nodes[$record->nid]->foo = $record->foo;
+  }
+}
+
+/**
+ * Respond to updates to a node.
+ *
+ * This hook is invoked only on the module that defines the node's content type
+ * (use hook_node_update() to act on all node updates).
+ *
+ * This hook is invoked from node_save() after the node is updated in the
+ * node table in the database, before field_attach_update() is called, and
+ * before hook_node_update() is invoked.
+ *
+ * @param $node
+ *   The node that is being updated.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_update($node) {
+  db_update('mytable')
+    ->fields(array('extra' => $node->extra))
+    ->condition('nid', $node->nid)
+    ->execute();
+}
+
+/**
+ * Perform node validation before a node is created or updated.
+ *
+ * This hook is invoked only on the module that defines the node's content type
+ * (use hook_node_validate() to act on all node validations).
+ *
+ * This hook is invoked from node_validate(), after a user has finished
+ * editing the node and is previewing or submitting it. It is invoked at the end
+ * of all the standard validation steps, and before hook_node_validate() is
+ * invoked.
+ *
+ * To indicate a validation error, use form_set_error().
+ *
+ * Note: Changes made to the $node object within your hook implementation will
+ * have no effect.  The preferred method to change a node's content is to use
+ * hook_node_presave() instead.
+ *
+ * @param $node
+ *   The node being validated.
+ * @param $form
+ *   The form being used to edit the node.
+ * @param $form_state
+ *   The form state array.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_validate($node, $form, &$form_state) {
+  if (isset($node->end) && isset($node->start)) {
+    if ($node->start > $node->end) {
+      form_set_error('time', t('An event may not end before it starts.'));
+    }
+  }
+}
+
+/**
+ * Display a node.
+ *
+ * This hook is invoked only on the module that defines the node's content type
+ * (use hook_node_view() to act on all node views).
+ *
+ * This hook is invoked during node viewing after the node is fully loaded, so
+ * that the node type module can define a custom method for display, or add to
+ * the default display.
+ *
+ * @param $node
+ *   The node to be displayed, as returned by node_load().
+ * @param $view_mode
+ *   View mode, e.g. 'full', 'teaser', ...
+ * @return
+ *   The passed $node parameter should be modified as necessary and returned so
+ *   it can be properly presented. Nodes are prepared for display by assembling
+ *   a structured array, formatted as in the Form API, in $node->content. As
+ *   with Form API arrays, the #weight property can be used to control the
+ *   relative positions of added elements. After this hook is invoked,
+ *   node_view() calls field_attach_view() to add field views to $node->content,
+ *   and then invokes hook_node_view() and hook_node_view_alter(), so if you
+ *   want to affect the final view of the node, you might consider implementing
+ *   one of these hooks instead.
+ *
+ * @ingroup node_api_hooks
+ */
+function hook_view($node, $view_mode) {
+  if ($view_mode == 'full' && node_is_page($node)) {
+    $breadcrumb = array();
+    $breadcrumb[] = l(t('Home'), NULL);
+    $breadcrumb[] = l(t('Example'), 'example');
+    $breadcrumb[] = l($node->field1, 'example/' . $node->field1);
+    drupal_set_breadcrumb($breadcrumb);
+  }
+
+  $node->content['myfield'] = array(
+    '#markup' => theme('mymodule_myfield', $node->myfield),
+    '#weight' => 1,
+  );
+
+  return $node;
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/node/node.css b/htmltest/modules/node/node.css
new file mode 100644
index 00000000..07540fa9
--- /dev/null
+++ b/htmltest/modules/node/node.css
@@ -0,0 +1,10 @@
+
+.node-unpublished {
+  background-color: #fff4f4;
+}
+.preview .node {
+  background-color: #ffffea;
+}
+td.revision-current {
+  background: #ffc;
+}
diff --git a/htmltest/modules/node/node.info b/htmltest/modules/node/node.info
new file mode 100644
index 00000000..24f8ae98
--- /dev/null
+++ b/htmltest/modules/node/node.info
@@ -0,0 +1,16 @@
+name = Node
+description = Allows content to be submitted to the site and displayed on pages.
+package = Core
+version = VERSION
+core = 7.x
+files[] = node.module
+files[] = node.test
+required = TRUE
+configure = admin/structure/types
+stylesheets[all][] = node.css
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/node/node.install b/htmltest/modules/node/node.install
new file mode 100644
index 00000000..76c2aec2
--- /dev/null
+++ b/htmltest/modules/node/node.install
@@ -0,0 +1,938 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the node module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function node_schema() {
+  $schema['node'] = array(
+    'description' => 'The base table for nodes.',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The primary identifier for a node.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      // Defaults to NULL in order to avoid a brief period of potential
+      // deadlocks on the index.
+      'vid' => array(
+        'description' => 'The current {node_revision}.vid version identifier.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => FALSE,
+        'default' => NULL,
+      ),
+      'type' => array(
+        'description' => 'The {node_type}.type of this node.',
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'language' => array(
+        'description' => 'The {languages}.language of this node.',
+        'type' => 'varchar',
+        'length' => 12,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'title' => array(
+        'description' => 'The title of this node, always treated as non-markup plain text.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'uid' => array(
+        'description' => 'The {users}.uid that owns this node; initially, this is the user that created it.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'status' => array(
+        'description' => 'Boolean indicating whether the node is published (visible to non-administrators).',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 1,
+      ),
+      'created' => array(
+        'description' => 'The Unix timestamp when the node was created.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'changed' => array(
+        'description' => 'The Unix timestamp when the node was most recently saved.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'comment' => array(
+        'description' => 'Whether comments are allowed on this node: 0 = no, 1 = closed (read only), 2 = open (read/write).',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'promote' => array(
+        'description' => 'Boolean indicating whether the node should be displayed on the front page.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'sticky' => array(
+        'description' => 'Boolean indicating whether the node should be displayed at the top of lists in which it appears.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'tnid' => array(
+        'description' => 'The translation set id for this node, which equals the node id of the source post in each set.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'translate' => array(
+        'description' => 'A boolean indicating whether this translation page needs to be updated.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'indexes' => array(
+      'node_changed'        => array('changed'),
+      'node_created'        => array('created'),
+      'node_frontpage'      => array('promote', 'status', 'sticky', 'created'),
+      'node_status_type'    => array('status', 'type', 'nid'),
+      'node_title_type'     => array('title', array('type', 4)),
+      'node_type'           => array(array('type', 4)),
+      'uid'                 => array('uid'),
+      'tnid'                => array('tnid'),
+      'translate'           => array('translate'),
+      'language'            => array('language'),
+    ),
+    'unique keys' => array(
+      'vid' => array('vid'),
+    ),
+    'foreign keys' => array(
+      'node_revision' => array(
+        'table' => 'node_revision',
+        'columns' => array('vid' => 'vid'),
+      ),
+      'node_author' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid'),
+      ),
+    ),
+    'primary key' => array('nid'),
+  );
+
+  $schema['node_access'] = array(
+    'description' => 'Identifies which realm/grant pairs a user must possess in order to view, update, or delete specific nodes.',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The {node}.nid this record affects.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'gid' => array(
+        'description' => "The grant ID a user must possess in the specified realm to gain this row's privileges on the node.",
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'realm' => array(
+        'description' => 'The realm in which the user must possess the grant ID. Each node access node can define one or more realms.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'grant_view' => array(
+        'description' => 'Boolean indicating whether a user with the realm/grant pair can view this node.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'grant_update' => array(
+        'description' => 'Boolean indicating whether a user with the realm/grant pair can edit this node.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'grant_delete' => array(
+        'description' => 'Boolean indicating whether a user with the realm/grant pair can delete this node.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+    ),
+    'primary key' => array('nid', 'gid', 'realm'),
+    'foreign keys' => array(
+      'affected_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+     ),
+  );
+
+  $schema['node_revision'] = array(
+    'description' => 'Stores information about each saved version of a {node}.',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The {node} this version belongs to.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'vid' => array(
+        'description' => 'The primary identifier for this version.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'uid' => array(
+        'description' => 'The {users}.uid that created this version.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'title' => array(
+        'description' => 'The title of this version.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'log' => array(
+        'description' => 'The log entry explaining the changes in this version.',
+        'type' => 'text',
+        'not null' => TRUE,
+        'size' => 'big',
+      ),
+      'timestamp' => array(
+        'description' => 'A Unix timestamp indicating when this version was created.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'status' => array(
+        'description' => 'Boolean indicating whether the node (at the time of this revision) is published (visible to non-administrators).',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 1,
+      ),
+      'comment' => array(
+        'description' => 'Whether comments are allowed on this node (at the time of this revision): 0 = no, 1 = closed (read only), 2 = open (read/write).',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'promote' => array(
+        'description' => 'Boolean indicating whether the node (at the time of this revision) should be displayed on the front page.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'sticky' => array(
+        'description' => 'Boolean indicating whether the node (at the time of this revision) should be displayed at the top of lists in which it appears.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'indexes' => array(
+      'nid' => array('nid'),
+      'uid' => array('uid'),
+    ),
+    'primary key' => array('vid'),
+    'foreign keys' => array(
+      'versioned_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+      'version_author' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid'),
+      ),
+    ),
+  );
+
+  $schema['node_type'] = array(
+    'description' => 'Stores information about all defined {node} types.',
+    'fields' => array(
+      'type' => array(
+        'description' => 'The machine-readable name of this type.',
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+      ),
+      'name' => array(
+        'description' => 'The human-readable name of this type.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'translatable' => TRUE,
+      ),
+      'base' => array(
+        'description' => 'The base string used to construct callbacks corresponding to this node type.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+      ),
+      'module' => array(
+        'description' => 'The module defining this node type.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+      ),
+      'description' => array(
+        'description' => 'A brief description of this type.',
+        'type' => 'text',
+        'not null' => TRUE,
+        'size' => 'medium',
+        'translatable' => TRUE,
+      ),
+      'help' => array(
+        'description' => 'Help information shown to the user when creating a {node} of this type.',
+        'type' => 'text',
+        'not null' => TRUE,
+        'size' => 'medium',
+        'translatable' => TRUE,
+      ),
+      'has_title' => array(
+        'description' => 'Boolean indicating whether this type uses the {node}.title field.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'size' => 'tiny',
+      ),
+      'title_label' => array(
+        'description' => 'The label displayed for the title field on the edit form.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'translatable' => TRUE,
+      ),
+      'custom' => array(
+        'description' => 'A boolean indicating whether this type is defined by a module (FALSE) or by a user via Add content type (TRUE).',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'modified' => array(
+        'description' => 'A boolean indicating whether this type has been modified by an administrator; currently not used in any way.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'locked' => array(
+        'description' => 'A boolean indicating whether the administrator can change the machine name of this type.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'disabled' => array(
+        'description' => 'A boolean indicating whether the node type is disabled.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny'
+      ),
+      'orig_type' => array(
+        'description' => 'The original machine-readable name of this node type. This may be different from the current type name if the locked field is 0.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+    ),
+    'primary key' => array('type'),
+  );
+
+  $schema['block_node_type'] = array(
+    'description' => 'Sets up display criteria for blocks based on content types',
+    'fields' => array(
+      'module' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'description' => "The block's origin module, from {block}.module.",
+      ),
+      'delta' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'description' => "The block's unique delta within module, from {block}.delta.",
+      ),
+      'type' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'description' => "The machine-readable name of this type from {node_type}.type.",
+      ),
+    ),
+    'primary key' => array('module', 'delta', 'type'),
+    'indexes' => array(
+      'type' => array('type'),
+    ),
+  );
+
+  $schema['history'] = array(
+    'description' => 'A record of which {users} have read which {node}s.',
+    'fields' => array(
+      'uid' => array(
+        'description' => 'The {users}.uid that read the {node} nid.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'nid' => array(
+        'description' => 'The {node}.nid that was read.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'timestamp' => array(
+        'description' => 'The Unix timestamp at which the read occurred.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'primary key' => array('uid', 'nid'),
+    'indexes' => array(
+      'nid' => array('nid'),
+    ),
+  );
+
+  return $schema;
+}
+
+/**
+ * Implements hook_install().
+ */
+function node_install() {
+  // Populate the node access table.
+  db_insert('node_access')
+    ->fields(array(
+      'nid' => 0,
+      'gid' => 0,
+      'realm' => 'all',
+      'grant_view' => 1,
+      'grant_update' => 0,
+      'grant_delete' => 0,
+    ))
+    ->execute();
+}
+
+/**
+ * Implements hook_update_dependencies().
+ */
+function node_update_dependencies() {
+  // node_update_7006() migrates node data to fields and therefore must run
+  // after all Field modules have been enabled, which happens in
+  // system_update_7027(). It also needs to query the {filter_format} table to
+  // get a list of existing text formats, so it must run after
+  // filter_update_7000(), which creates that table.
+  $dependencies['node'][7006] = array(
+    'system' => 7027,
+    'filter' => 7000,
+  );
+
+  // node_update_7008() migrates role permissions and therefore must run after
+  // the {role} and {role_permission} tables are properly set up, which happens
+  // in user_update_7007().
+  $dependencies['node'][7008] = array(
+    'user' => 7007,
+  );
+
+  return $dependencies;
+}
+
+/**
+ * Utility function: fetch the node types directly from the database.
+ *
+ * This function is valid for a database schema version 7000.
+ *
+ * @ingroup update_api
+ */
+function _update_7000_node_get_types() {
+  $node_types = db_query('SELECT * FROM {node_type}')->fetchAllAssoc('type', PDO::FETCH_OBJ);
+
+  // Create default settings for orphan nodes.
+  $all_types = db_query('SELECT DISTINCT type FROM {node}')->fetchCol();
+  $extra_types = array_diff($all_types, array_keys($node_types));
+
+  foreach ($extra_types as $type) {
+    $type_object = new stdClass();
+    $type_object->type = $type;
+
+    // In Drupal 6, whether you have a body field or not is a flag in the node
+    // type table. If it's enabled, nodes may or may not have an empty string
+    // for the bodies. As we can't detect what this setting should be in
+    // Drupal 7 without access to the Drupal 6 node type settings, we assume
+    // the default, which is to enable the body field.
+    $type_object->has_body = 1;
+    $type_object->body_label = 'Body';
+    $node_types[$type_object->type] = $type_object;
+  }
+  return $node_types;
+}
+
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Upgrade the node type table and fix node type 'module' attribute to avoid name-space conflicts.
+ */
+function node_update_7000() {
+  // Rename the module column to base.
+  db_change_field('node_type', 'module', 'base', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE));
+
+  db_add_field('node_type', 'module', array(
+    'description' => 'The module defining this node type.',
+    'type' => 'varchar',
+    'default' => '',
+    'length' => 255,
+    'not null' => TRUE,
+  ));
+
+  db_add_field('node_type', 'disabled', array(
+    'description' => 'A boolean indicating whether the node type is disabled.',
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'size' => 'tiny'
+  ));
+
+  $modules = db_select('system', 's')
+    ->fields('s', array('name'))
+    ->condition('type', 'module');
+  db_update('node_type')
+    ->expression('module', 'base')
+    ->condition('base', $modules, 'IN')
+    ->execute();
+
+  db_update('node_type')
+    ->fields(array('base' => 'node_content'))
+    ->condition('base', 'node')
+    ->execute();
+}
+
+/**
+ * Rename {node_revisions} table to {node_revision}.
+ */
+function node_update_7001() {
+  db_rename_table('node_revisions', 'node_revision');
+}
+
+/**
+ * Extend the node_promote_status index to include all fields required for the node page query.
+ */
+function node_update_7002() {
+  db_drop_index('node', 'node_promote_status');
+  db_add_index('node', 'node_frontpage', array('promote', 'status', 'sticky', 'created'));
+}
+
+/**
+ * Remove the node_counter if the statistics module is uninstalled.
+ */
+function node_update_7003() {
+  if (drupal_get_installed_schema_version('statistics') == SCHEMA_UNINSTALLED) {
+    db_drop_table('node_counter');
+  }
+}
+
+/**
+ * Extend the existing default preview and teaser settings to all node types.
+ */
+function node_update_7004() {
+  // Get original settings and all types.
+  $original_length = variable_get('teaser_length', 600);
+  $original_preview = variable_get('node_preview', 0);
+
+  // Map old preview setting to new values order.
+  $original_preview ? $original_preview = 2 : $original_preview = 1;
+  node_type_cache_reset();
+
+  // Apply original settings to all types.
+  foreach (_update_7000_node_get_types() as $type => $type_object) {
+    variable_set('teaser_length_' . $type, $original_length);
+    variable_set('node_preview_' . $type, $original_preview);
+  }
+  // Delete old variable but leave 'teaser_length' for aggregator module upgrade.
+  variable_del('node_preview');
+}
+
+/**
+ * Add status/comment/promote and sticky columns to the {node_revision} table.
+ */
+function node_update_7005() {
+  foreach (array('status', 'comment', 'promote', 'sticky') as $column) {
+    db_add_field('node_revision', $column, array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ));
+  }
+}
+
+/**
+ * Convert body and teaser from node properties to fields, and migrate status/comment/promote and sticky columns to the {node_revision} table.
+ */
+function node_update_7006(&$sandbox) {
+  $sandbox['#finished'] = 0;
+
+  // Get node type info for every invocation.
+  node_type_cache_reset();
+
+  if (!isset($sandbox['total'])) {
+    // Initial invocation.
+
+    // First, create the body field.
+    $body_field = array(
+      'field_name' => 'body',
+      'type' => 'text_with_summary',
+      'module' => 'text',
+      'cardinality' => 1,
+      'entity_types' => array('node'),
+      'translatable' => TRUE,
+    );
+    _update_7000_field_create_field($body_field);
+
+    $default_trim_length = variable_get('teaser_length', 600);
+
+    // Get node type info, specifically the body field settings.
+    $node_types = _update_7000_node_get_types();
+
+    // Add body field instances for existing node types.
+    foreach ($node_types as $node_type) {
+      if ($node_type->has_body) {
+        $trim_length = variable_get('teaser_length_' . $node_type->type, $default_trim_length);
+
+        $instance = array(
+          'entity_type' => 'node',
+          'bundle' => $node_type->type,
+          'label' => $node_type->body_label,
+          'description' => isset($node_type->description) ? $node_type->description : '',
+          'required' => (isset($node_type->min_word_count) && $node_type->min_word_count > 0) ? 1 : 0,
+          'widget' => array(
+            'type' => 'text_textarea_with_summary',
+            'settings' => array(
+              'rows' => 20,
+              'summary_rows' => 5,
+            ),
+            'weight' => -4,
+            'module' => 'text',
+          ),
+          'settings' => array('display_summary' => TRUE),
+          'display' => array(
+            'default' => array(
+              'label' => 'hidden',
+              'type' => 'text_default',
+            ),
+            'teaser' => array(
+              'label' => 'hidden',
+              'type' => 'text_summary_or_trimmed',
+              'trim_length' => $trim_length,
+            ),
+          ),
+        );
+        _update_7000_field_create_instance($body_field, $instance);
+        variable_del('teaser_length_' . $node_type->type);
+      }
+      // Leave 'teaser_length' variable for aggregator module upgrade.
+
+      $sandbox['node_types_info'][$node_type->type] = array(
+        'has_body' => $node_type->has_body,
+      );
+    }
+
+    // Used below when updating the stored text format of each node body.
+    $sandbox['existing_text_formats'] = db_query("SELECT format FROM {filter_format}")->fetchCol();
+
+    // Initialize state for future calls.
+    $sandbox['last'] = 0;
+    $sandbox['count'] = 0;
+
+    $query = db_select('node', 'n');
+    $query->join('node_revision', 'nr', 'n.nid = nr.nid');
+    $sandbox['total'] = $query->countQuery()->execute()->fetchField();
+
+    $sandbox['body_field_id'] = $body_field['id'];
+  }
+  else {
+    // Subsequent invocations.
+
+    $found = FALSE;
+    if ($sandbox['total']) {
+      // Operate on every revision of every node (whee!), in batches.
+      $batch_size = 200;
+      $query = db_select('node_revision', 'nr');
+      $query->innerJoin('node', 'n', 'n.nid = nr.nid');
+      $query
+        ->fields('nr', array('nid', 'vid', 'body', 'teaser', 'format'))
+        ->fields('n', array('type', 'status', 'comment', 'promote', 'sticky', 'language'))
+        ->condition('nr.vid', $sandbox['last'], '>')
+        ->orderBy('nr.vid', 'ASC')
+        ->range(0, $batch_size);
+      $revisions = $query->execute();
+
+      // Load each revision of each node, set up 'body'
+      // appropriately, and save the node's field data.  Note that
+      // node_load() will not return the body or teaser values from
+      // {node_revision} because those columns have been removed from the
+      // schema structure in memory (but not yet from the database),
+      // so we get the values from the explicit query of the table
+      // instead.
+      foreach ($revisions as $revision) {
+        $found = TRUE;
+
+        if ($sandbox['node_types_info'][$revision->type]['has_body']) {
+          $node = (object) array(
+            'nid' => $revision->nid,
+            'vid' => $revision->vid,
+            'type' => $revision->type,
+          );
+          // After node_update_7009() we will always have LANGUAGE_NONE as
+          // language neutral language code, but here we still have empty
+          // strings.
+          $langcode = empty($revision->language) ? LANGUAGE_NONE : $revision->language;
+          if (!empty($revision->teaser) && $revision->teaser != text_summary($revision->body)) {
+            $node->body[$langcode][0]['summary'] = $revision->teaser;
+          }
+          // Do this after text_summary() above.
+          $break = '<!--break-->';
+          if (substr($revision->body, 0, strlen($break)) == $break) {
+            $revision->body = substr($revision->body, strlen($break));
+          }
+          $node->body[$langcode][0]['value'] = $revision->body;
+          // Update the revision's text format for the changes to the Drupal 7
+          // filter system. This uses the same kind of logic that occurs, for
+          // example, in user_update_7010(), but we do this here rather than
+          // via a separate set of database queries, since we are already
+          // migrating the data.
+          if (empty($revision->body) && empty($revision->format)) {
+            $node->body[$langcode][0]['format'] = NULL;
+          }
+          elseif (!in_array($revision->format, $sandbox['existing_text_formats'])) {
+            $node->body[$langcode][0]['format'] = variable_get('filter_default_format', 1);
+          }
+          else {
+            $node->body[$langcode][0]['format'] = $revision->format;
+          }
+          // This is a core update and no contrib modules are enabled yet, so
+          // we can assume default field storage for a faster update.
+          _update_7000_field_sql_storage_write('node', $node->type, $node->nid, $node->vid, 'body', $node->body);
+        }
+
+        // Migrate the status columns to the {node_revision} table.
+        db_update('node_revision')
+          ->fields(array(
+            'status' => $revision->status,
+            'comment' => $revision->comment,
+            'promote' => $revision->promote,
+            'sticky' => $revision->sticky,
+          ))
+          ->condition('vid', $revision->vid)
+          ->execute();
+
+        $sandbox['last'] = $revision->vid;
+        $sandbox['count'] += 1;
+      }
+
+      $sandbox['#finished'] = min(0.99, $sandbox['count'] / $sandbox['total']);
+    }
+
+    if (!$found) {
+      // All nodes are processed.
+
+      // Remove the now-obsolete body info from node_revision.
+      db_drop_field('node_revision', 'body');
+      db_drop_field('node_revision', 'teaser');
+      db_drop_field('node_revision', 'format');
+
+      // Remove node_type properties related to the former 'body'.
+      db_drop_field('node_type', 'has_body');
+      db_drop_field('node_type', 'body_label');
+
+      // We're done.
+      $sandbox['#finished'] = 1;
+    }
+  }
+}
+
+/**
+ * Remove column min_word_count.
+ */
+function node_update_7007() {
+  db_drop_field('node_type', 'min_word_count');
+}
+
+/**
+ * Split the 'administer nodes' permission from 'access content overview'.
+ */
+function node_update_7008() {
+  $roles = user_roles(FALSE, 'administer nodes');
+  foreach ($roles as $rid => $role) {
+    _update_7000_user_role_grant_permissions($rid, array('access content overview'), 'node');
+  }
+}
+
+/**
+ * Convert node languages from the empty string to LANGUAGE_NONE.
+ */
+function node_update_7009() {
+  db_update('node')
+    ->fields(array('language' => LANGUAGE_NONE))
+    ->condition('language', '')
+    ->execute();
+}
+
+/**
+ * Add the {block_node_type} table.
+ */
+function node_update_7010() {
+  $schema['block_node_type'] = array(
+    'description' => 'Sets up display criteria for blocks based on content types',
+    'fields' => array(
+      'module' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'description' => "The block's origin module, from {block}.module.",
+      ),
+      'delta' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'description' => "The block's unique delta within module, from {block}.delta.",
+      ),
+      'type' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'description' => "The machine-readable name of this type from {node_type}.type.",
+      ),
+    ),
+    'primary key' => array('module', 'delta', 'type'),
+    'indexes' => array(
+      'type' => array('type'),
+    ),
+  );
+
+  db_create_table('block_node_type', $schema['block_node_type']);
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x".
+ */
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Update the database from Drupal 6 to match the schema.
+ */
+function node_update_7011() {
+  // Drop node moderation field.
+  db_drop_field('node', 'moderate');
+  db_drop_index('node', 'node_moderate');
+
+  // Change {node_revision}.status field to default to 1.
+  db_change_field('node_revision', 'status', 'status', array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 1,
+  ));
+
+  // Change {node_type}.module field default.
+  db_change_field('node_type', 'module', 'module', array(
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => TRUE,
+  ));
+}
+
+/**
+ * Switches body fields to untranslatable while upgrading from D6 and makes them language neutral.
+ */
+function node_update_7012() {
+  // If we are upgrading from D6, then body fields should be set back to
+  // untranslatable, as D6 did not know about the idea of translating fields,
+  // but only nodes. If a D7 > D7 update is running we need to skip this update,
+  // as it is a valid use case to have translatable body fields in this context.
+  if (variable_get('update_d6', FALSE)) {
+    // Make node bodies untranslatable: field_update_field() cannot be used
+    // throughout the upgrade process and we do not have an update counterpart
+    // for _update_7000_field_create_field(). Hence we are forced to update the
+    // 'field_config' table directly. This is a safe operation since it is
+    // being performed while upgrading from D6. Perfoming the same operation
+    // during a D7 update is highly discouraged.
+    db_update('field_config')
+      ->fields(array('translatable' => 0))
+      ->condition('field_name', 'body')
+      ->execute();
+
+    // Switch field languages to LANGUAGE_NONE, since initially they were
+    // assigned the node language.
+    foreach (array('field_data_body', 'field_revision_body') as $table) {
+      db_update($table)
+        ->fields(array('language' => LANGUAGE_NONE))
+        ->execute();
+    }
+
+    node_type_cache_reset();
+  }
+}
+
+/**
+ * Change {node}.vid default value from 0 to NULL to avoid deadlock issues on MySQL.
+ */
+function node_update_7013() {
+  db_drop_unique_key('node', 'vid');
+  db_change_field('node', 'vid', 'vid', array(
+    'description' => 'The current {node_revision}.vid version identifier.',
+    'type' => 'int',
+    'unsigned' => TRUE,
+    'not null' => FALSE,
+    'default' => NULL,
+  ));
+  db_add_unique_key('node', 'vid', array('vid'));
+}
+
+/**
+ * Add an index on {node}.language.
+ */
+function node_update_7014() {
+  db_add_index('node', 'language', array('language'));
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra".
+ */
diff --git a/htmltest/modules/node/node.js b/htmltest/modules/node/node.js
new file mode 100644
index 00000000..ebf68eb3
--- /dev/null
+++ b/htmltest/modules/node/node.js
@@ -0,0 +1,43 @@
+
+(function ($) {
+
+Drupal.behaviors.nodeFieldsetSummaries = {
+  attach: function (context) {
+    $('fieldset.node-form-revision-information', context).drupalSetSummary(function (context) {
+      var revisionCheckbox = $('.form-item-revision input', context);
+
+      // Return 'New revision' if the 'Create new revision' checkbox is checked,
+      // or if the checkbox doesn't exist, but the revision log does. For users
+      // without the "Administer content" permission the checkbox won't appear,
+      // but the revision log will if the content type is set to auto-revision.
+      if (revisionCheckbox.is(':checked') || (!revisionCheckbox.length && $('.form-item-log textarea', context).length)) {
+        return Drupal.t('New revision');
+      }
+
+      return Drupal.t('No revision');
+    });
+
+    $('fieldset.node-form-author', context).drupalSetSummary(function (context) {
+      var name = $('.form-item-name input', context).val() || Drupal.settings.anonymous,
+        date = $('.form-item-date input', context).val();
+      return date ?
+        Drupal.t('By @name on @date', { '@name': name, '@date': date }) :
+        Drupal.t('By @name', { '@name': name });
+    });
+
+    $('fieldset.node-form-options', context).drupalSetSummary(function (context) {
+      var vals = [];
+
+      $('input:checked', context).parent().each(function () {
+        vals.push(Drupal.checkPlain($.trim($(this).text())));
+      });
+
+      if (!$('.form-item-status input', context).is(':checked')) {
+        vals.unshift(Drupal.t('Not published'));
+      }
+      return vals.join(', ');
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/node/node.module b/htmltest/modules/node/node.module
new file mode 100644
index 00000000..8f247cdc
--- /dev/null
+++ b/htmltest/modules/node/node.module
@@ -0,0 +1,4174 @@
+<?php
+
+/**
+ * @file
+ * The core that allows content to be submitted to the site. Modules and
+ * scripts may programmatically submit nodes using the usual form API pattern.
+ */
+
+/**
+ * Node is not published.
+ */
+define('NODE_NOT_PUBLISHED', 0);
+
+/**
+ * Node is published.
+ */
+define('NODE_PUBLISHED', 1);
+
+/**
+ * Node is not promoted to front page.
+ */
+define('NODE_NOT_PROMOTED', 0);
+
+/**
+ * Node is promoted to front page.
+ */
+define('NODE_PROMOTED', 1);
+
+/**
+ * Node is not sticky at top of the page.
+ */
+define('NODE_NOT_STICKY', 0);
+
+/**
+ * Node is sticky at top of the page.
+ */
+define('NODE_STICKY', 1);
+
+/**
+ * Nodes changed before this time are always marked as read.
+ *
+ * Nodes changed after this time may be marked new, updated, or read, depending
+ * on their state for the current user. Defaults to 30 days ago.
+ */
+define('NODE_NEW_LIMIT', REQUEST_TIME - 30 * 24 * 60 * 60);
+
+/**
+ * Modules should return this value from hook_node_access() to allow access to a node.
+ */
+define('NODE_ACCESS_ALLOW', 'allow');
+
+/**
+ * Modules should return this value from hook_node_access() to deny access to a node.
+ */
+define('NODE_ACCESS_DENY', 'deny');
+
+/**
+ * Modules should return this value from hook_node_access() to not affect node access.
+ */
+define('NODE_ACCESS_IGNORE', NULL);
+
+/**
+ * Implements hook_help().
+ */
+function node_help($path, $arg) {
+  // Remind site administrators about the {node_access} table being flagged
+  // for rebuild. We don't need to issue the message on the confirm form, or
+  // while the rebuild is being processed.
+  if ($path != 'admin/reports/status/rebuild' && $path != 'batch' && strpos($path, '#') === FALSE
+      && user_access('access administration pages') && node_access_needs_rebuild()) {
+    if ($path == 'admin/reports/status') {
+      $message = t('The content access permissions need to be rebuilt.');
+    }
+    else {
+      $message = t('The content access permissions need to be rebuilt. <a href="@node_access_rebuild">Rebuild permissions</a>.', array('@node_access_rebuild' => url('admin/reports/status/rebuild')));
+    }
+    drupal_set_message($message, 'error');
+  }
+
+  switch ($path) {
+    case 'admin/help#node':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Node module manages the creation, editing, deletion, settings, and display of the main site content. Content items managed by the Node module are typically displayed as pages on your site, and include a title, some meta-data (author, creation time, content type, etc.), and optional fields containing text or other data (fields are managed by the <a href="@field">Field module</a>). For more information, see the online handbook entry for <a href="@node">Node module</a>.', array('@node' => 'http://drupal.org/documentation/modules/node', '@field' => url('admin/help/field'))) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Creating content') . '</dt>';
+      $output .= '<dd>' . t('When new content is created, the Node module records basic information about the content, including the author, date of creation, and the <a href="@content-type">Content type</a>. It also manages the <em>publishing options</em>, which define whether or not the content is published, promoted to the front page of the site, and/or sticky at the top of content lists. Default settings can be configured for each <a href="@content-type">type of content</a> on your site.', array('@content-type' => url('admin/structure/types'))) . '</dd>';
+      $output .= '<dt>' . t('Creating custom content types') . '</dt>';
+      $output .= '<dd>' . t('The Node module gives users with the <em>Administer content types</em> permission the ability to <a href="@content-new">create new content types</a> in addition to the default ones already configured. Creating custom content types allows you the flexibility to add <a href="@field">fields</a> and configure default settings that suit the differing needs of various site content.', array('@content-new' => url('admin/structure/types/add'), '@field' => url('admin/help/field'))) . '</dd>';
+      $output .= '<dt>' . t('Administering content') . '</dt>';
+      $output .= '<dd>' . t('The <a href="@content">Content administration page</a> allows you to review and bulk manage your site content.', array('@content' => url('admin/content'))) . '</dd>';
+      $output .= '<dt>' . t('Creating revisions') . '</dt>';
+      $output .= '<dd>' . t('The Node module also enables you to create multiple versions of any content, and revert to older versions using the <em>Revision information</em> settings.') . '</dd>';
+      $output .= '<dt>' . t('User permissions') . '</dt>';
+      $output .= '<dd>' . t('The Node module makes a number of permissions available for each content type, which can be set by role on the <a href="@permissions">permissions page</a>.', array('@permissions' => url('admin/people/permissions', array('fragment' => 'module-node')))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+
+    case 'admin/structure/types/add':
+      return '<p>' . t('Individual content types can have different fields, behaviors, and permissions assigned to them.') . '</p>';
+
+    case 'admin/structure/types/manage/%/display':
+      return '<p>' . t('Content items can be displayed using different view modes: Teaser, Full content, Print, RSS, etc. <em>Teaser</em> is a short format that is typically used in lists of multiple content items. <em>Full content</em> is typically used when the content is displayed on its own page.') . '</p>' .
+        '<p>' . t('Here, you can define which fields are shown and hidden when %type content is displayed in each view mode, and define how the fields are displayed in each view mode.', array('%type' => node_type_get_name($arg[4]))) . '</p>';
+
+    case 'node/%/revisions':
+      return '<p>' . t('Revisions allow you to track differences between multiple versions of your content, and revert back to older versions.') . '</p>';
+
+    case 'node/%/edit':
+      $node = node_load($arg[1]);
+      $type = node_type_get_type($node);
+      return (!empty($type->help) ? '<p>' . filter_xss_admin($type->help) . '</p>' : '');
+  }
+
+  if ($arg[0] == 'node' && $arg[1] == 'add' && $arg[2]) {
+    $type = node_type_get_type(str_replace('-', '_', $arg[2]));
+    return (!empty($type->help) ? '<p>' . filter_xss_admin($type->help) . '</p>' : '');
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function node_theme() {
+  return array(
+    'node' => array(
+      'render element' => 'elements',
+      'template' => 'node',
+    ),
+    'node_search_admin' => array(
+      'render element' => 'form',
+    ),
+    'node_add_list' => array(
+      'variables' => array('content' => NULL),
+      'file' => 'node.pages.inc',
+    ),
+    'node_preview' => array(
+      'variables' => array('node' => NULL),
+      'file' => 'node.pages.inc',
+    ),
+    'node_admin_overview' => array(
+      'variables' => array('name' => NULL, 'type' => NULL),
+      'file' => 'content_types.inc',
+    ),
+    'node_recent_block' => array(
+      'variables' => array('nodes' => NULL),
+    ),
+    'node_recent_content' => array(
+      'variables' => array('node' => NULL),
+    ),
+  );
+}
+
+/**
+ * Implements hook_cron().
+ */
+function node_cron() {
+  db_delete('history')
+    ->condition('timestamp', NODE_NEW_LIMIT, '<')
+    ->execute();
+}
+
+/**
+ * Implements hook_entity_info().
+ */
+function node_entity_info() {
+  $return = array(
+    'node' => array(
+      'label' => t('Node'),
+      'controller class' => 'NodeController',
+      'base table' => 'node',
+      'revision table' => 'node_revision',
+      'uri callback' => 'node_uri',
+      'fieldable' => TRUE,
+      'entity keys' => array(
+        'id' => 'nid',
+        'revision' => 'vid',
+        'bundle' => 'type',
+        'label' => 'title',
+        'language' => 'language',
+      ),
+      'bundle keys' => array(
+        'bundle' => 'type',
+      ),
+      'bundles' => array(),
+      'view modes' => array(
+        'full' => array(
+          'label' => t('Full content'),
+          'custom settings' => FALSE,
+        ),
+        'teaser' => array(
+          'label' => t('Teaser'),
+          'custom settings' => TRUE,
+        ),
+        'rss' => array(
+          'label' => t('RSS'),
+          'custom settings' => FALSE,
+        ),
+      ),
+    ),
+  );
+
+  // Search integration is provided by node.module, so search-related view modes
+  // for nodes are defined here and not in search.module.
+  if (module_exists('search')) {
+    $return['node']['view modes'] += array(
+      'search_index' => array(
+        'label' => t('Search index'),
+        'custom settings' => FALSE,
+      ),
+      'search_result' => array(
+        'label' => t('Search result'),
+        'custom settings' => FALSE,
+      ),
+    );
+  }
+
+  // Bundles must provide a human readable name so we can create help and error
+  // messages, and the path to attach Field admin pages to.
+  foreach (node_type_get_names() as $type => $name) {
+    $return['node']['bundles'][$type] = array(
+      'label' => $name,
+      'admin' => array(
+        'path' => 'admin/structure/types/manage/%node_type',
+        'real path' => 'admin/structure/types/manage/' . str_replace('_', '-', $type),
+        'bundle argument' => 4,
+        'access arguments' => array('administer content types'),
+      ),
+    );
+  }
+
+  return $return;
+}
+
+/**
+ * Implements hook_field_display_ENTITY_TYPE_alter().
+ */
+function node_field_display_node_alter(&$display, $context) {
+  // Hide field labels in search index.
+  if ($context['view_mode'] == 'search_index') {
+    $display['label'] = 'hidden';
+  }
+}
+
+/**
+ * Implements callback_entity_info_uri().
+ */
+function node_uri($node) {
+  return array(
+    'path' => 'node/' . $node->nid,
+  );
+}
+
+/**
+ * Implements hook_admin_paths().
+ */
+function node_admin_paths() {
+  if (variable_get('node_admin_theme')) {
+    $paths = array(
+      'node/*/edit' => TRUE,
+      'node/*/delete' => TRUE,
+      'node/*/revisions' => TRUE,
+      'node/*/revisions/*/revert' => TRUE,
+      'node/*/revisions/*/delete' => TRUE,
+      'node/add' => TRUE,
+      'node/add/*' => TRUE,
+    );
+    return $paths;
+  }
+}
+
+/**
+ * Gathers a listing of links to nodes.
+ *
+ * @param $result
+ *   A database result object from a query to fetch node entities. If your
+ *   query joins the {node_comment_statistics} table so that the comment_count
+ *   field is available, a title attribute will be added to show the number of
+ *   comments.
+ * @param $title
+ *   A heading for the resulting list.
+ *
+ * @return
+ *   A renderable array containing a list of linked node titles fetched from
+ *   $result, or FALSE if there are no rows in $result.
+ */
+function node_title_list($result, $title = NULL) {
+  $items = array();
+  $num_rows = FALSE;
+  foreach ($result as $node) {
+    $items[] = l($node->title, 'node/' . $node->nid, !empty($node->comment_count) ? array('attributes' => array('title' => format_plural($node->comment_count, '1 comment', '@count comments'))) : array());
+    $num_rows = TRUE;
+  }
+
+  return $num_rows ? array('#theme' => 'item_list__node', '#items' => $items, '#title' => $title) : FALSE;
+}
+
+/**
+ * Updates the 'last viewed' timestamp of the specified node for current user.
+ *
+ * @param $node
+ *   A node object.
+ */
+function node_tag_new($node) {
+  global $user;
+  if ($user->uid) {
+    db_merge('history')
+      ->key(array(
+        'uid' => $user->uid,
+        'nid' => $node->nid,
+      ))
+      ->fields(array('timestamp' => REQUEST_TIME))
+      ->execute();
+   }
+}
+
+/**
+ * Retrieves the timestamp for the current user's last view of a specified node.
+ *
+ * @param $nid
+ *   A node ID.
+ *
+ * @return
+ *   If a node has been previously viewed by the user, the timestamp in seconds
+ *   of when the last view occurred; otherwise, zero.
+ */
+function node_last_viewed($nid) {
+  global $user;
+  $history = &drupal_static(__FUNCTION__, array());
+
+  if (!isset($history[$nid])) {
+    $history[$nid] = db_query("SELECT timestamp FROM {history} WHERE uid = :uid AND nid = :nid", array(':uid' => $user->uid, ':nid' => $nid))->fetchObject();
+  }
+
+  return (isset($history[$nid]->timestamp) ? $history[$nid]->timestamp : 0);
+}
+
+/**
+ * Determines the type of marker to be displayed for a given node.
+ *
+ * @param $nid
+ *   Node ID whose history supplies the "last viewed" timestamp.
+ * @param $timestamp
+ *   Time which is compared against node's "last viewed" timestamp.
+ *
+ * @return
+ *   One of the MARK constants.
+ */
+function node_mark($nid, $timestamp) {
+  global $user;
+  $cache = &drupal_static(__FUNCTION__, array());
+
+  if (!$user->uid) {
+    return MARK_READ;
+  }
+  if (!isset($cache[$nid])) {
+    $cache[$nid] = node_last_viewed($nid);
+  }
+  if ($cache[$nid] == 0 && $timestamp > NODE_NEW_LIMIT) {
+    return MARK_NEW;
+  }
+  elseif ($timestamp > $cache[$nid] && $timestamp > NODE_NEW_LIMIT) {
+    return MARK_UPDATED;
+  }
+  return MARK_READ;
+}
+
+/**
+ * Extracts the type name.
+ *
+ * @param $node
+ *   Either a string or object, containing the node type information.
+ *
+ * @return
+ *   Node type of the passed-in data.
+ */
+function _node_extract_type($node) {
+  return is_object($node) ? $node->type : $node;
+}
+
+/**
+ * Returns a list of all the available node types.
+ *
+ * This list can include types that are queued for addition or deletion.
+ * See _node_types_build() for details.
+ *
+ * @return
+ *   An array of node types, as objects, keyed by the type.
+ *
+ * @see node_type_get_type()
+ */
+function node_type_get_types() {
+  return _node_types_build()->types;
+}
+
+/**
+ * Returns the node type of the passed node or node type string.
+ *
+ * @param $node
+ *   A node object or string that indicates the node type to return.
+ *
+ * @return
+ *   A single node type, as an object, or FALSE if the node type is not found.
+ *   The node type is an object containing fields from hook_node_info() return
+ *   values, as well as the field 'type' (the machine-readable type) and other
+ *   fields used internally and defined in _node_types_build(),
+ *   hook_node_info(), and node_type_set_defaults().
+ */
+function node_type_get_type($node) {
+  $type = _node_extract_type($node);
+  $types = _node_types_build()->types;
+  return isset($types[$type]) ? $types[$type] : FALSE;
+}
+
+/**
+ * Returns the node type base of the passed node or node type string.
+ *
+ * The base indicates which module implements this node type and is used to
+ * execute node-type-specific hooks. For types defined in the user interface
+ * and managed by node.module, the base is 'node_content'.
+ *
+ * @param $node
+ *   A node object or string that indicates the node type to return.
+ *
+ * @return
+ *   The node type base or FALSE if the node type is not found.
+ *
+ * @see node_invoke()
+ */
+function node_type_get_base($node) {
+  $type = _node_extract_type($node);
+  $types = _node_types_build()->types;
+  return isset($types[$type]) && isset($types[$type]->base) ? $types[$type]->base : FALSE;
+}
+
+/**
+ * Returns a list of available node type names.
+ *
+ * This list can include types that are queued for addition or deletion.
+ * See _node_types_build() for details.
+ *
+ * @return
+ *   An array of node type names, keyed by the type.
+ */
+function node_type_get_names() {
+  return _node_types_build()->names;
+}
+
+/**
+ * Returns the node type name of the passed node or node type string.
+ *
+ * @param $node
+ *   A node object or string that indicates the node type to return.
+ *
+ * @return
+ *   The node type name or FALSE if the node type is not found.
+ */
+function node_type_get_name($node) {
+  $type = _node_extract_type($node);
+  $types = _node_types_build()->names;
+  return isset($types[$type]) ? $types[$type] : FALSE;
+}
+
+/**
+ * Updates the database cache of node types.
+ *
+ * All new module-defined node types are saved to the database via a call to
+ * node_type_save(), and obsolete ones are deleted via a call to
+ * node_type_delete(). See _node_types_build() for an explanation of the new
+ * and obsolete types.
+ *
+ * @see _node_types_build()
+ */
+function node_types_rebuild() {
+  _node_types_build(TRUE);
+}
+
+/**
+ * Menu argument loader: loads a node type by string.
+ *
+ * @param $name
+ *   The machine-readable name of a node type to load, where '_' is replaced
+ *   with '-'.
+ *
+ * @return
+ *   A node type object or FALSE if $name does not exist.
+ */
+function node_type_load($name) {
+  return node_type_get_type(strtr($name, array('-' => '_')));
+}
+
+/**
+ * Saves a node type to the database.
+ *
+ * @param object $info
+ *   The node type to save; an object with the following properties:
+ *   - type: A string giving the machine name of the node type.
+ *   - name: A string giving the human-readable name of the node type.
+ *   - base: A string that indicates the base string for hook functions. For
+ *     example, 'node_content' is the value used by the UI when creating a new
+ *     node type.
+ *   - description: A string that describes the node type.
+ *   - help: A string giving the help information shown to the user when
+ *     creating a node of this type.
+ *   - custom: TRUE or FALSE indicating whether this type is defined by a module
+ *     (FALSE) or by a user (TRUE) via Add Content Type.
+ *   - modified: TRUE or FALSE indicating whether this type has been modified by
+ *     an administrator. Currently not used in any way.
+ *   - locked: TRUE or FALSE indicating whether the administrator can change the
+ *     machine name of this type.
+ *   - disabled: TRUE or FALSE indicating whether this type has been disabled.
+ *   - has_title: TRUE or FALSE indicating whether this type uses the node title
+ *     field.
+ *   - title_label: A string containing the label for the title.
+ *   - module: A string giving the module defining this type of node.
+ *   - orig_type: A string giving the original machine-readable name of this
+ *     node type. This may be different from the current type name if the
+ *     'locked' key is FALSE.
+ *
+ * @return int
+ *   A status flag indicating the outcome of the operation, either SAVED_NEW or
+ *   SAVED_UPDATED.
+ */
+function node_type_save($info) {
+  $existing_type = !empty($info->old_type) ? $info->old_type : $info->type;
+  $is_existing = (bool) db_query_range('SELECT 1 FROM {node_type} WHERE type = :type', 0, 1, array(':type' => $existing_type))->fetchField();
+  $type = node_type_set_defaults($info);
+
+  $fields = array(
+    'type' => (string) $type->type,
+    'name' => (string) $type->name,
+    'base' => (string) $type->base,
+    'has_title' => (int) $type->has_title,
+    'title_label' => (string) $type->title_label,
+    'description' => (string) $type->description,
+    'help' => (string) $type->help,
+    'custom' => (int) $type->custom,
+    'modified' => (int) $type->modified,
+    'locked' => (int) $type->locked,
+    'disabled' => (int) $type->disabled,
+    'module' => $type->module,
+  );
+
+  if ($is_existing) {
+    db_update('node_type')
+      ->fields($fields)
+      ->condition('type', $existing_type)
+      ->execute();
+
+    if (!empty($type->old_type) && $type->old_type != $type->type) {
+      field_attach_rename_bundle('node', $type->old_type, $type->type);
+    }
+    module_invoke_all('node_type_update', $type);
+    $status = SAVED_UPDATED;
+  }
+  else {
+    $fields['orig_type'] = (string) $type->orig_type;
+    db_insert('node_type')
+      ->fields($fields)
+      ->execute();
+
+    field_attach_create_bundle('node', $type->type);
+
+    module_invoke_all('node_type_insert', $type);
+    $status = SAVED_NEW;
+  }
+
+  // Clear the node type cache.
+  node_type_cache_reset();
+
+  return $status;
+}
+
+/**
+ * Adds default body field to a node type.
+ *
+ * @param $type
+ *   A node type object.
+ * @param $label
+ *   The label for the body instance.
+ *
+ * @return
+ *   Body field instance.
+ */
+function node_add_body_field($type, $label = 'Body') {
+   // Add or remove the body field, as needed.
+  $field = field_info_field('body');
+  $instance = field_info_instance('node', 'body', $type->type);
+  if (empty($field)) {
+    $field = array(
+      'field_name' => 'body',
+      'type' => 'text_with_summary',
+      'entity_types' => array('node'),
+    );
+    $field = field_create_field($field);
+  }
+  if (empty($instance)) {
+    $instance = array(
+      'field_name' => 'body',
+      'entity_type' => 'node',
+      'bundle' => $type->type,
+      'label' => $label,
+      'widget' => array('type' => 'text_textarea_with_summary'),
+      'settings' => array('display_summary' => TRUE),
+      'display' => array(
+        'default' => array(
+          'label' => 'hidden',
+          'type' => 'text_default',
+        ),
+        'teaser' => array(
+          'label' => 'hidden',
+          'type' => 'text_summary_or_trimmed',
+        ),
+      ),
+    );
+    $instance = field_create_instance($instance);
+  }
+  return $instance;
+}
+
+/**
+ * Implements hook_field_extra_fields().
+ */
+function node_field_extra_fields() {
+  $extra = array();
+
+  foreach (node_type_get_types() as $type) {
+    if ($type->has_title) {
+      $extra['node'][$type->type] = array(
+        'form' => array(
+          'title' => array(
+            'label' => $type->title_label,
+            'description' => t('Node module element'),
+            'weight' => -5,
+          ),
+        ),
+      );
+    }
+  }
+
+  return $extra;
+}
+
+/**
+ * Deletes a node type from the database.
+ *
+ * @param $type
+ *   The machine-readable name of the node type to be deleted.
+ */
+function node_type_delete($type) {
+  $info = node_type_get_type($type);
+  db_delete('node_type')
+    ->condition('type', $type)
+    ->execute();
+  field_attach_delete_bundle('node', $type);
+  module_invoke_all('node_type_delete', $info);
+
+  // Clear the node type cache.
+  node_type_cache_reset();
+}
+
+/**
+ * Updates all nodes of one type to be of another type.
+ *
+ * @param $old_type
+ *   The current node type of the nodes.
+ * @param $type
+ *   The new node type of the nodes.
+ *
+ * @return
+ *   The number of nodes whose node type field was modified.
+ */
+function node_type_update_nodes($old_type, $type) {
+  return db_update('node')
+    ->fields(array('type' => $type))
+    ->condition('type', $old_type)
+    ->execute();
+}
+
+/**
+ * Builds and returns the list of available node types.
+ *
+ * The list of types is built by invoking hook_node_info() on all modules and
+ * comparing this information with the node types in the {node_type} table.
+ * These two information sources are not synchronized during module installation
+ * until node_types_rebuild() is called.
+ *
+ * @param $rebuild
+ *  TRUE to rebuild node types. Equivalent to calling node_types_rebuild().
+ *
+ * @return
+ *   An object with two properties:
+ *   - names: Associative array of the names of node types, keyed by the type.
+ *   - types: Associative array of node type objects, keyed by the type.
+ *   Both of these arrays will include new types that have been defined by
+ *   hook_node_info() implementations but not yet saved in the {node_type}
+ *   table. These are indicated in the type object by $type->is_new being set
+ *   to the value 1. These arrays will also include obsolete types: types that
+ *   were previously defined by modules that have now been disabled, or for
+ *   whatever reason are no longer being defined in hook_node_info()
+ *   implementations, but are still in the database. These are indicated in the
+ *   type object by $type->disabled being set to TRUE.
+ */
+function _node_types_build($rebuild = FALSE) {
+  $cid = 'node_types:' . $GLOBALS['language']->language;
+
+  if (!$rebuild) {
+    $_node_types = &drupal_static(__FUNCTION__);
+    if (isset($_node_types)) {
+      return $_node_types;
+    }
+    if ($cache = cache_get($cid)) {
+      $_node_types = $cache->data;
+      return $_node_types;
+    }
+  }
+
+  $_node_types = (object) array('types' => array(), 'names' => array());
+
+  foreach (module_implements('node_info') as $module) {
+    $info_array = module_invoke($module, 'node_info');
+    foreach ($info_array as $type => $info) {
+      $info['type'] = $type;
+      $_node_types->types[$type] = node_type_set_defaults($info);
+      $_node_types->types[$type]->module = $module;
+      $_node_types->names[$type] = $info['name'];
+    }
+  }
+  $query = db_select('node_type', 'nt')
+    ->addTag('translatable')
+    ->addTag('node_type_access')
+    ->fields('nt')
+    ->orderBy('nt.type', 'ASC');
+  if (!$rebuild) {
+    $query->condition('disabled', 0);
+  }
+  foreach ($query->execute() as $type_object) {
+    $type_db = $type_object->type;
+    // Original disabled value.
+    $disabled = $type_object->disabled;
+    // Check for node types from disabled modules and mark their types for removal.
+    // Types defined by the node module in the database (rather than by a separate
+    // module using hook_node_info) have a base value of 'node_content'. The isset()
+    // check prevents errors on old (pre-Drupal 7) databases.
+    if (isset($type_object->base) && $type_object->base != 'node_content' && empty($_node_types->types[$type_db])) {
+      $type_object->disabled = TRUE;
+    }
+    if (isset($_node_types->types[$type_db])) {
+      $type_object->disabled = FALSE;
+    }
+    if (!isset($_node_types->types[$type_db]) || $type_object->modified) {
+      $_node_types->types[$type_db] = $type_object;
+      $_node_types->names[$type_db] = $type_object->name;
+
+      if ($type_db != $type_object->orig_type) {
+        unset($_node_types->types[$type_object->orig_type]);
+        unset($_node_types->names[$type_object->orig_type]);
+      }
+    }
+    $_node_types->types[$type_db]->disabled = $type_object->disabled;
+    $_node_types->types[$type_db]->disabled_changed = $disabled != $type_object->disabled;
+  }
+
+  if ($rebuild) {
+    foreach ($_node_types->types as $type => $type_object) {
+      if (!empty($type_object->is_new) || !empty($type_object->disabled_changed)) {
+        node_type_save($type_object);
+      }
+    }
+  }
+
+  asort($_node_types->names);
+
+  cache_set($cid, $_node_types);
+
+  return $_node_types;
+}
+
+/**
+ * Clears the node type cache.
+ */
+function node_type_cache_reset() {
+  cache_clear_all('node_types:', 'cache', TRUE);
+  drupal_static_reset('_node_types_build');
+}
+
+/**
+ * Sets the default values for a node type.
+ *
+ * The defaults are appropriate for a type defined through hook_node_info(),
+ * since 'custom' is TRUE for types defined in the user interface, and FALSE
+ * for types defined by modules. (The 'custom' flag prevents types from being
+ * deleted through the user interface.) Also, the default for 'locked' is TRUE,
+ * which prevents users from changing the machine name of the type.
+ *
+ * @param $info
+ *   (optional) An object or array containing values to override the defaults.
+ *   See hook_node_info() for details on what the array elements mean. Defaults
+ *   to an empty array.
+ *
+ * @return
+ *   A node type object, with missing values in $info set to their defaults.
+ */
+function node_type_set_defaults($info = array()) {
+  $info = (array) $info;
+  $new_type = $info + array(
+    'type' => '',
+    'name' => '',
+    'base' => '',
+    'description' => '',
+    'help' => '',
+    'custom' => 0,
+    'modified' => 0,
+    'locked' => 1,
+    'disabled' => 0,
+    'is_new' => 1,
+    'has_title' => 1,
+    'title_label' => 'Title',
+  );
+  $new_type = (object) $new_type;
+
+  // If the type has no title, set an empty label.
+  if (!$new_type->has_title) {
+    $new_type->title_label = '';
+  }
+  if (empty($new_type->module)) {
+    $new_type->module = $new_type->base == 'node_content' ? 'node' : '';
+  }
+  $new_type->orig_type = isset($info['type']) ? $info['type'] : '';
+
+  return $new_type;
+}
+
+/**
+ * Implements hook_rdf_mapping().
+ */
+function node_rdf_mapping() {
+  return array(
+    array(
+      'type' => 'node',
+      'bundle' => RDF_DEFAULT_BUNDLE,
+      'mapping' => array(
+        'rdftype' => array('sioc:Item', 'foaf:Document'),
+        'title' => array(
+          'predicates' => array('dc:title'),
+        ),
+        'created' => array(
+          'predicates' => array('dc:date', 'dc:created'),
+          'datatype' => 'xsd:dateTime',
+          'callback' => 'date_iso8601',
+        ),
+        'changed' => array(
+          'predicates' => array('dc:modified'),
+          'datatype' => 'xsd:dateTime',
+          'callback' => 'date_iso8601',
+        ),
+        'body' => array(
+          'predicates' => array('content:encoded'),
+        ),
+        'uid' => array(
+          'predicates' => array('sioc:has_creator'),
+          'type' => 'rel',
+        ),
+        'name' => array(
+          'predicates' => array('foaf:name'),
+        ),
+        'comment_count' => array(
+          'predicates' => array('sioc:num_replies'),
+          'datatype' => 'xsd:integer',
+        ),
+        'last_activity' => array(
+          'predicates' => array('sioc:last_activity_date'),
+          'datatype' => 'xsd:dateTime',
+          'callback' => 'date_iso8601',
+        ),
+      ),
+    ),
+  );
+}
+
+/**
+ * Determines whether a node hook exists.
+ *
+ * @param $node
+ *   A node object or a string containing the node type.
+ * @param $hook
+ *   A string containing the name of the hook.
+ *
+ * @return
+ *   TRUE if the $hook exists in the node type of $node.
+ */
+function node_hook($node, $hook) {
+  $base = node_type_get_base($node);
+  return module_hook($base, $hook);
+}
+
+/**
+ * Invokes a node hook.
+ *
+ * @param $node
+ *   A node object or a string containing the node type.
+ * @param $hook
+ *   A string containing the name of the hook.
+ * @param $a2, $a3, $a4
+ *   Arguments to pass on to the hook, after the $node argument.
+ *
+ * @return
+ *   The returned value of the invoked hook.
+ */
+function node_invoke($node, $hook, $a2 = NULL, $a3 = NULL, $a4 = NULL) {
+  if (node_hook($node, $hook)) {
+    $base = node_type_get_base($node);
+    $function = $base . '_' . $hook;
+    return ($function($node, $a2, $a3, $a4));
+  }
+}
+
+/**
+ * Loads node entities from the database.
+ *
+ * This function should be used whenever you need to load more than one node
+ * from the database. Nodes are loaded into memory and will not require database
+ * access if loaded again during the same page request.
+ *
+ * @see entity_load()
+ * @see EntityFieldQuery
+ *
+ * @param $nids
+ *   An array of node IDs.
+ * @param $conditions
+ *   (deprecated) An associative array of conditions on the {node}
+ *   table, where the keys are the database fields and the values are the
+ *   values those fields must have. Instead, it is preferable to use
+ *   EntityFieldQuery to retrieve a list of entity IDs loadable by
+ *   this function.
+ * @param $reset
+ *   Whether to reset the internal node_load cache.
+ *
+ * @return
+ *   An array of node objects indexed by nid.
+ *
+ * @todo Remove $conditions in Drupal 8.
+ */
+function node_load_multiple($nids = array(), $conditions = array(), $reset = FALSE) {
+  return entity_load('node', $nids, $conditions, $reset);
+}
+
+/**
+ * Loads a node object from the database.
+ *
+ * @param $nid
+ *   The node ID.
+ * @param $vid
+ *   The revision ID.
+ * @param $reset
+ *   Whether to reset the node_load_multiple cache.
+ *
+ * @return
+ *   A fully-populated node object, or FALSE if the node is not found.
+ */
+function node_load($nid = NULL, $vid = NULL, $reset = FALSE) {
+  $nids = (isset($nid) ? array($nid) : array());
+  $conditions = (isset($vid) ? array('vid' => $vid) : array());
+  $node = node_load_multiple($nids, $conditions, $reset);
+  return $node ? reset($node) : FALSE;
+}
+
+/**
+ * Prepares a node object for editing.
+ *
+ * Fills in a few default values, and then invokes hook_prepare() on the node
+ * type module, and hook_node_prepare() on all modules.
+ *
+ * @param $node
+ *   A node object.
+ */
+function node_object_prepare($node) {
+  // Set up default values, if required.
+  $node_options = variable_get('node_options_' . $node->type, array('status', 'promote'));
+  // If this is a new node, fill in the default values.
+  if (!isset($node->nid) || isset($node->is_new)) {
+    foreach (array('status', 'promote', 'sticky') as $key) {
+      // Multistep node forms might have filled in something already.
+      if (!isset($node->$key)) {
+        $node->$key = (int) in_array($key, $node_options);
+      }
+    }
+    global $user;
+    $node->uid = $user->uid;
+    $node->created = REQUEST_TIME;
+  }
+  else {
+    $node->date = format_date($node->created, 'custom', 'Y-m-d H:i:s O');
+    // Remove the log message from the original node object.
+    $node->log = NULL;
+  }
+  // Always use the default revision setting.
+  $node->revision = in_array('revision', $node_options);
+
+  node_invoke($node, 'prepare');
+  module_invoke_all('node_prepare', $node);
+}
+
+/**
+ * Implements hook_validate().
+ *
+ * Performs validation checks on the given node.
+ */
+function node_validate($node, $form, &$form_state) {
+  if (isset($node->nid) && (node_last_changed($node->nid) > $node->changed)) {
+    form_set_error('changed', t('The content on this page has either been modified by another user, or you have already submitted modifications using this form. As a result, your changes cannot be saved.'));
+  }
+
+  // Validate the "authored by" field.
+  if (!empty($node->name) && !($account = user_load_by_name($node->name))) {
+    // The use of empty() is mandatory in the context of usernames
+    // as the empty string denotes the anonymous user. In case we
+    // are dealing with an anonymous user we set the user ID to 0.
+    form_set_error('name', t('The username %name does not exist.', array('%name' => $node->name)));
+  }
+
+  // Validate the "authored on" field.
+  if (!empty($node->date) && strtotime($node->date) === FALSE) {
+    form_set_error('date', t('You have to specify a valid date.'));
+  }
+
+  // Invoke hook_validate() for node type specific validation and
+  // hook_node_validate() for miscellaneous validation needed by modules. Can't
+  // use node_invoke() or module_invoke_all(), because $form_state must be
+  // receivable by reference.
+  $function = node_type_get_base($node) . '_validate';
+  if (function_exists($function)) {
+    $function($node, $form, $form_state);
+  }
+  foreach (module_implements('node_validate') as $module) {
+    $function = $module . '_node_validate';
+    $function($node, $form, $form_state);
+  }
+}
+
+/**
+ * Prepares node for saving by populating author and creation date.
+ *
+ * @param $node
+ *   A node object.
+ *
+ * @return
+ *   An updated node object.
+ */
+function node_submit($node) {
+  // A user might assign the node author by entering a user name in the node
+  // form, which we then need to translate to a user ID.
+  if (isset($node->name)) {
+    if ($account = user_load_by_name($node->name)) {
+      $node->uid = $account->uid;
+    }
+    else {
+      $node->uid = 0;
+    }
+  }
+
+  $node->created = !empty($node->date) ? strtotime($node->date) : REQUEST_TIME;
+  $node->validated = TRUE;
+
+  return $node;
+}
+
+/**
+ * Saves changes to a node or adds a new node.
+ *
+ * @param $node
+ *   The $node object to be saved. If $node->nid is
+ *   omitted (or $node->is_new is TRUE), a new node will be added.
+ */
+function node_save($node) {
+  $transaction = db_transaction();
+
+  try {
+    // Load the stored entity, if any.
+    if (!empty($node->nid) && !isset($node->original)) {
+      $node->original = entity_load_unchanged('node', $node->nid);
+    }
+
+    field_attach_presave('node', $node);
+    global $user;
+
+    // Determine if we will be inserting a new node.
+    if (!isset($node->is_new)) {
+      $node->is_new = empty($node->nid);
+    }
+
+    // Set the timestamp fields.
+    if (empty($node->created)) {
+      $node->created = REQUEST_TIME;
+    }
+    // The changed timestamp is always updated for bookkeeping purposes,
+    // for example: revisions, searching, etc.
+    $node->changed = REQUEST_TIME;
+
+    $node->timestamp = REQUEST_TIME;
+    $update_node = TRUE;
+
+    // Let modules modify the node before it is saved to the database.
+    module_invoke_all('node_presave', $node);
+    module_invoke_all('entity_presave', $node, 'node');
+
+    if ($node->is_new || !empty($node->revision)) {
+      // When inserting either a new node or a new node revision, $node->log
+      // must be set because {node_revision}.log is a text column and therefore
+      // cannot have a default value. However, it might not be set at this
+      // point (for example, if the user submitting a node form does not have
+      // permission to create revisions), so we ensure that it is at least an
+      // empty string in that case.
+      // @todo: Make the {node_revision}.log column nullable so that we can
+      // remove this check.
+      if (!isset($node->log)) {
+        $node->log = '';
+      }
+    }
+    elseif (!isset($node->log) || $node->log === '') {
+      // If we are updating an existing node without adding a new revision, we
+      // need to make sure $node->log is unset whenever it is empty. As long as
+      // $node->log is unset, drupal_write_record() will not attempt to update
+      // the existing database column when re-saving the revision; therefore,
+      // this code allows us to avoid clobbering an existing log entry with an
+      // empty one.
+      unset($node->log);
+    }
+
+    // When saving a new node revision, unset any existing $node->vid so as to
+    // ensure that a new revision will actually be created, then store the old
+    // revision ID in a separate property for use by node hook implementations.
+    if (!$node->is_new && !empty($node->revision) && $node->vid) {
+      $node->old_vid = $node->vid;
+      unset($node->vid);
+    }
+
+    // Save the node and node revision.
+    if ($node->is_new) {
+      // For new nodes, save new records for both the node itself and the node
+      // revision.
+      drupal_write_record('node', $node);
+      _node_save_revision($node, $user->uid);
+      $op = 'insert';
+    }
+    else {
+      // For existing nodes, update the node record which matches the value of
+      // $node->nid.
+      drupal_write_record('node', $node, 'nid');
+      // Then, if a new node revision was requested, save a new record for
+      // that; otherwise, update the node revision record which matches the
+      // value of $node->vid.
+      if (!empty($node->revision)) {
+        _node_save_revision($node, $user->uid);
+      }
+      else {
+        _node_save_revision($node, $user->uid, 'vid');
+        $update_node = FALSE;
+      }
+      $op = 'update';
+    }
+    if ($update_node) {
+      db_update('node')
+        ->fields(array('vid' => $node->vid))
+        ->condition('nid', $node->nid)
+        ->execute();
+    }
+
+    // Call the node specific callback (if any). This can be
+    // node_invoke($node, 'insert') or
+    // node_invoke($node, 'update').
+    node_invoke($node, $op);
+
+    // Save fields.
+    $function = "field_attach_$op";
+    $function('node', $node);
+
+    module_invoke_all('node_' . $op, $node);
+    module_invoke_all('entity_' . $op, $node, 'node');
+
+    // Update the node access table for this node.
+    node_access_acquire_grants($node);
+
+    // Clear internal properties.
+    unset($node->is_new);
+    unset($node->original);
+    // Clear the static loading cache.
+    entity_get_controller('node')->resetCache(array($node->nid));
+
+    // Ignore slave server temporarily to give time for the
+    // saved node to be propagated to the slave.
+    db_ignore_slave();
+  }
+  catch (Exception $e) {
+    $transaction->rollback();
+    watchdog_exception('node', $e);
+    throw $e;
+  }
+}
+
+/**
+ * Helper function to save a revision with the uid of the current user.
+ *
+ * The resulting revision ID is available afterward in $node->vid.
+ *
+ * @param $node
+ *   A node object.
+ * @param $uid
+ *   The current user's UID.
+ * @param $update
+ *   (optional) An array of primary keys' field names to update.
+ */
+function _node_save_revision($node, $uid, $update = NULL) {
+  $temp_uid = $node->uid;
+  $node->uid = $uid;
+  if (isset($update)) {
+    drupal_write_record('node_revision', $node, $update);
+  }
+  else {
+    drupal_write_record('node_revision', $node);
+  }
+  // Have node object still show node owner's uid, not revision author's.
+  $node->uid = $temp_uid;
+}
+
+/**
+ * Deletes a node.
+ *
+ * @param $nid
+ *   A node ID.
+ */
+function node_delete($nid) {
+  node_delete_multiple(array($nid));
+}
+
+/**
+ * Deletes multiple nodes.
+ *
+ * @param $nids
+ *   An array of node IDs.
+ */
+function node_delete_multiple($nids) {
+  $transaction = db_transaction();
+  if (!empty($nids)) {
+    $nodes = node_load_multiple($nids, array());
+
+    try {
+      foreach ($nodes as $nid => $node) {
+        // Call the node-specific callback (if any):
+        node_invoke($node, 'delete');
+        module_invoke_all('node_delete', $node);
+        module_invoke_all('entity_delete', $node, 'node');
+        field_attach_delete('node', $node);
+
+        // Remove this node from the search index if needed.
+        // This code is implemented in node module rather than in search module,
+        // because node module is implementing search module's API, not the other
+        // way around.
+        if (module_exists('search')) {
+          search_reindex($nid, 'node');
+        }
+      }
+
+      // Delete after calling hooks so that they can query node tables as needed.
+      db_delete('node')
+        ->condition('nid', $nids, 'IN')
+        ->execute();
+      db_delete('node_revision')
+        ->condition('nid', $nids, 'IN')
+        ->execute();
+      db_delete('history')
+        ->condition('nid', $nids, 'IN')
+        ->execute();
+      db_delete('node_access')
+       ->condition('nid', $nids, 'IN')
+       ->execute();
+    }
+    catch (Exception $e) {
+      $transaction->rollback();
+      watchdog_exception('node', $e);
+      throw $e;
+    }
+
+    // Clear the page and block and node_load_multiple caches.
+    entity_get_controller('node')->resetCache();
+  }
+}
+
+/**
+ * Deletes a node revision.
+ *
+ * @param $revision_id
+ *   The revision ID to delete.
+ */
+function node_revision_delete($revision_id) {
+  if ($revision = node_load(NULL, $revision_id)) {
+    // Prevent deleting the current revision.
+    $node = node_load($revision->nid);
+    if ($revision_id == $node->vid) {
+      return FALSE;
+    }
+
+    db_delete('node_revision')
+      ->condition('nid', $revision->nid)
+      ->condition('vid', $revision->vid)
+      ->execute();
+    module_invoke_all('node_revision_delete', $revision);
+    field_attach_delete_revision('node', $revision);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
+ * Generates an array for rendering the given node.
+ *
+ * @param $node
+ *   A node object.
+ * @param $view_mode
+ *   View mode, e.g. 'full', 'teaser'...
+ * @param $langcode
+ *   (optional) A language code to use for rendering. Defaults to the global
+ *   content language of the current request.
+ *
+ * @return
+ *   An array as expected by drupal_render().
+ */
+function node_view($node, $view_mode = 'full', $langcode = NULL) {
+  if (!isset($langcode)) {
+    $langcode = $GLOBALS['language_content']->language;
+  }
+
+  // Populate $node->content with a render() array.
+  node_build_content($node, $view_mode, $langcode);
+
+  $build = $node->content;
+  // We don't need duplicate rendering info in node->content.
+  unset($node->content);
+
+  $build += array(
+    '#theme' => 'node',
+    '#node' => $node,
+    '#view_mode' => $view_mode,
+    '#language' => $langcode,
+  );
+
+  // Add contextual links for this node, except when the node is already being
+  // displayed on its own page. Modules may alter this behavior (for example,
+  // to restrict contextual links to certain view modes) by implementing
+  // hook_node_view_alter().
+  if (!empty($node->nid) && !($view_mode == 'full' && node_is_page($node))) {
+    $build['#contextual_links']['node'] = array('node', array($node->nid));
+  }
+
+  // Allow modules to modify the structured node.
+  $type = 'node';
+  drupal_alter(array('node_view', 'entity_view'), $build, $type);
+
+  return $build;
+}
+
+/**
+ * Builds a structured array representing the node's content.
+ *
+ * The content built for the node (field values, comments, file attachments or
+ * other node components) will vary depending on the $view_mode parameter.
+ *
+ * Drupal core defines the following view modes for nodes, with the following
+ * default use cases:
+ *   - full (default): node is being displayed on its own page (node/123)
+ *   - teaser: node is being displayed on the default home page listing, on
+ *     taxonomy listing pages, or on blog listing pages.
+ *   - rss: node displayed in an RSS feed.
+ *   If search.module is enabled:
+ *   - search_index: node is being indexed for search.
+ *   - search_result: node is being displayed as a search result.
+ *   If book.module is enabled:
+ *   - print: node is being displayed in print-friendly mode.
+ * Contributed modules might define additional view modes, or use existing
+ * view modes in additional contexts.
+ *
+ * @param $node
+ *   A node object.
+ * @param $view_mode
+ *   View mode, e.g. 'full', 'teaser'...
+ * @param $langcode
+ *   (optional) A language code to use for rendering. Defaults to the global
+ *   content language of the current request.
+ */
+function node_build_content($node, $view_mode = 'full', $langcode = NULL) {
+  if (!isset($langcode)) {
+    $langcode = $GLOBALS['language_content']->language;
+  }
+
+  // Remove previously built content, if exists.
+  $node->content = array();
+
+  // Allow modules to change the view mode.
+  $context = array(
+    'entity_type' => 'node',
+    'entity' => $node,
+    'langcode' => $langcode,
+  );
+  drupal_alter('entity_view_mode', $view_mode, $context);
+
+  // The 'view' hook can be implemented to overwrite the default function
+  // to display nodes.
+  if (node_hook($node, 'view')) {
+    $node = node_invoke($node, 'view', $view_mode, $langcode);
+  }
+
+  // Build fields content.
+  // In case of a multiple view, node_view_multiple() already ran the
+  // 'prepare_view' step. An internal flag prevents the operation from running
+  // twice.
+  field_attach_prepare_view('node', array($node->nid => $node), $view_mode, $langcode);
+  entity_prepare_view('node', array($node->nid => $node), $langcode);
+  $node->content += field_attach_view('node', $node, $view_mode, $langcode);
+
+  // Always display a read more link on teasers because we have no way to know
+  // when a teaser view is different than a full view.
+  $links = array();
+  $node->content['links'] = array(
+    '#theme' => 'links__node',
+    '#pre_render' => array('drupal_pre_render_links'),
+    '#attributes' => array('class' => array('links', 'inline')),
+  );
+  if ($view_mode == 'teaser') {
+    $node_title_stripped = strip_tags($node->title);
+    $links['node-readmore'] = array(
+      'title' => t('Read more<span class="element-invisible"> about @title</span>', array('@title' => $node_title_stripped)),
+      'href' => 'node/' . $node->nid,
+      'html' => TRUE,
+      'attributes' => array('rel' => 'tag', 'title' => $node_title_stripped),
+    );
+  }
+  $node->content['links']['node'] = array(
+    '#theme' => 'links__node__node',
+    '#links' => $links,
+    '#attributes' => array('class' => array('links', 'inline')),
+  );
+
+  // Allow modules to make their own additions to the node.
+  module_invoke_all('node_view', $node, $view_mode, $langcode);
+  module_invoke_all('entity_view', $node, 'node', $view_mode, $langcode);
+
+  // Make sure the current view mode is stored if no module has already
+  // populated the related key.
+  $node->content += array('#view_mode' => $view_mode);
+}
+
+/**
+ * Generates an array which displays a node detail page.
+ *
+ * @param $node
+ *   A node object.
+ * @param $message
+ *   A flag which sets a page title relevant to the revision being viewed.
+ *
+ * @return
+ *   A $page element suitable for use by drupal_render().
+ */
+function node_show($node, $message = FALSE) {
+  if ($message) {
+    drupal_set_title(t('Revision of %title from %date', array('%title' => $node->title, '%date' => format_date($node->revision_timestamp))), PASS_THROUGH);
+  }
+
+  // For markup consistency with other pages, use node_view_multiple() rather than node_view().
+  $nodes = node_view_multiple(array($node->nid => $node), 'full');
+
+  // Update the history table, stating that this user viewed this node.
+  node_tag_new($node);
+
+  return $nodes;
+}
+
+/**
+ * Returns whether the current page is the full page view of the passed-in node.
+ *
+ * @param $node
+ *   A node object.
+ *
+ * @return
+ *   The ID of the node if this is a full page view, otherwise FALSE.
+ */
+function node_is_page($node) {
+  $page_node = menu_get_object();
+  return (!empty($page_node) ? $page_node->nid == $node->nid : FALSE);
+}
+
+/**
+ * Processes variables for node.tpl.php
+ *
+ * Most themes utilize their own copy of node.tpl.php. The default is located
+ * inside "modules/node/node.tpl.php". Look in there for the full list of
+ * variables.
+ *
+ * The $variables array contains the following arguments:
+ * - $node
+ * - $view_mode
+ * - $page
+ *
+ * @see node.tpl.php
+ */
+function template_preprocess_node(&$variables) {
+  $variables['view_mode'] = $variables['elements']['#view_mode'];
+  // Provide a distinct $teaser boolean.
+  $variables['teaser'] = $variables['view_mode'] == 'teaser';
+  $variables['node'] = $variables['elements']['#node'];
+  $node = $variables['node'];
+
+  $variables['date']      = format_date($node->created);
+  $variables['name']      = theme('username', array('account' => $node));
+
+  $uri = entity_uri('node', $node);
+  $variables['node_url']  = url($uri['path'], $uri['options']);
+  $variables['title']     = check_plain($node->title);
+  $variables['page']      = $variables['view_mode'] == 'full' && node_is_page($node);
+
+  // Flatten the node object's member fields.
+  $variables = array_merge((array) $node, $variables);
+
+  // Helpful $content variable for templates.
+  $variables += array('content' => array());
+  foreach (element_children($variables['elements']) as $key) {
+    $variables['content'][$key] = $variables['elements'][$key];
+  }
+
+  // Make the field variables available with the appropriate language.
+  field_attach_preprocess('node', $node, $variables['content'], $variables);
+
+  // Display post information only on certain node types.
+  if (variable_get('node_submitted_' . $node->type, TRUE)) {
+    $variables['display_submitted'] = TRUE;
+    $variables['submitted'] = t('Submitted by !username on !datetime', array('!username' => $variables['name'], '!datetime' => $variables['date']));
+    $variables['user_picture'] = theme_get_setting('toggle_node_user_picture') ? theme('user_picture', array('account' => $node)) : '';
+  }
+  else {
+    $variables['display_submitted'] = FALSE;
+    $variables['submitted'] = '';
+    $variables['user_picture'] = '';
+  }
+
+  // Gather node classes.
+  $variables['classes_array'][] = drupal_html_class('node-' . $node->type);
+  if ($variables['promote']) {
+    $variables['classes_array'][] = 'node-promoted';
+  }
+  if ($variables['sticky']) {
+    $variables['classes_array'][] = 'node-sticky';
+  }
+  if (!$variables['status']) {
+    $variables['classes_array'][] = 'node-unpublished';
+  }
+  if ($variables['teaser']) {
+    $variables['classes_array'][] = 'node-teaser';
+  }
+  if (isset($variables['preview'])) {
+    $variables['classes_array'][] = 'node-preview';
+  }
+
+  // Clean up name so there are no underscores.
+  $variables['theme_hook_suggestions'][] = 'node__' . $node->type;
+  $variables['theme_hook_suggestions'][] = 'node__' . $node->nid;
+}
+
+/**
+ * Implements hook_permission().
+ */
+function node_permission() {
+  $perms = array(
+    'bypass node access' => array(
+      'title' => t('Bypass content access control'),
+      'description' => t('View, edit and delete all content regardless of permission restrictions.'),
+      'restrict access' => TRUE,
+    ),
+    'administer content types' => array(
+      'title' => t('Administer content types'),
+      'restrict access' => TRUE,
+    ),
+    'administer nodes' => array(
+      'title' => t('Administer content'),
+      'restrict access' => TRUE,
+    ),
+    'access content overview' => array(
+      'title' => t('Access the content overview page'),
+      'description' => user_access('access content overview')
+        ? t('Get an overview of <a href="@url">all content</a>.', array('@url' => url('admin/content')))
+        : t('Get an overview of all content.'),
+    ),
+    'access content' => array(
+      'title' => t('View published content'),
+    ),
+    'view own unpublished content' => array(
+      'title' => t('View own unpublished content'),
+    ),
+    'view revisions' => array(
+      'title' => t('View content revisions'),
+    ),
+    'revert revisions' => array(
+      'title' => t('Revert content revisions'),
+    ),
+    'delete revisions' => array(
+      'title' => t('Delete content revisions'),
+    ),
+  );
+
+  // Generate standard node permissions for all applicable node types.
+  foreach (node_permissions_get_configured_types() as $type) {
+    $perms += node_list_permissions($type);
+  }
+
+  return $perms;
+}
+
+/**
+ * Gathers the rankings from the the hook_ranking() implementations.
+ *
+ * @param $query
+ *   A query object that has been extended with the Search DB Extender.
+ */
+function _node_rankings(SelectQueryExtender $query) {
+  if ($ranking = module_invoke_all('ranking')) {
+    $tables = &$query->getTables();
+    foreach ($ranking as $rank => $values) {
+      if ($node_rank = variable_get('node_rank_' . $rank, 0)) {
+        // If the table defined in the ranking isn't already joined, then add it.
+        if (isset($values['join']) && !isset($tables[$values['join']['alias']])) {
+          $query->addJoin($values['join']['type'], $values['join']['table'], $values['join']['alias'], $values['join']['on']);
+        }
+        $arguments = isset($values['arguments']) ? $values['arguments'] : array();
+        $query->addScore($values['score'], $arguments, $node_rank);
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_search_info().
+ */
+function node_search_info() {
+  return array(
+    'title' => 'Content',
+    'path' => 'node',
+  );
+}
+
+/**
+ * Implements hook_search_access().
+ */
+function node_search_access() {
+  return user_access('access content');
+}
+
+/**
+ * Implements hook_search_reset().
+ */
+function node_search_reset() {
+  db_update('search_dataset')
+    ->fields(array('reindex' => REQUEST_TIME))
+    ->condition('type', 'node')
+    ->execute();
+}
+
+/**
+ * Implements hook_search_status().
+ */
+function node_search_status() {
+  $total = db_query('SELECT COUNT(*) FROM {node}')->fetchField();
+  $remaining = db_query("SELECT COUNT(*) FROM {node} n LEFT JOIN {search_dataset} d ON d.type = 'node' AND d.sid = n.nid WHERE d.sid IS NULL OR d.reindex <> 0")->fetchField();
+  return array('remaining' => $remaining, 'total' => $total);
+}
+
+/**
+ * Implements hook_search_admin().
+ */
+function node_search_admin() {
+  // Output form for defining rank factor weights.
+  $form['content_ranking'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Content ranking'),
+  );
+  $form['content_ranking']['#theme'] = 'node_search_admin';
+  $form['content_ranking']['info'] = array(
+    '#value' => '<em>' . t('The following numbers control which properties the content search should favor when ordering the results. Higher numbers mean more influence, zero means the property is ignored. Changing these numbers does not require the search index to be rebuilt. Changes take effect immediately.') . '</em>'
+  );
+
+  // Note: reversed to reflect that higher number = higher ranking.
+  $options = drupal_map_assoc(range(0, 10));
+  foreach (module_invoke_all('ranking') as $var => $values) {
+    $form['content_ranking']['factors']['node_rank_' . $var] = array(
+      '#title' => $values['title'],
+      '#type' => 'select',
+      '#options' => $options,
+      '#default_value' => variable_get('node_rank_' . $var, 0),
+    );
+  }
+  return $form;
+}
+
+/**
+ * Implements hook_search_execute().
+ */
+function node_search_execute($keys = NULL, $conditions = NULL) {
+  // Build matching conditions
+  $query = db_select('search_index', 'i', array('target' => 'slave'))->extend('SearchQuery')->extend('PagerDefault');
+  $query->join('node', 'n', 'n.nid = i.sid');
+  $query
+    ->condition('n.status', 1)
+    ->addTag('node_access')
+    ->searchExpression($keys, 'node');
+
+  // Insert special keywords.
+  $query->setOption('type', 'n.type');
+  $query->setOption('language', 'n.language');
+  if ($query->setOption('term', 'ti.tid')) {
+    $query->join('taxonomy_index', 'ti', 'n.nid = ti.nid');
+  }
+  // Only continue if the first pass query matches.
+  if (!$query->executeFirstPass()) {
+    return array();
+  }
+
+  // Add the ranking expressions.
+  _node_rankings($query);
+
+  // Load results.
+  $find = $query
+    ->limit(10)
+    ->execute();
+  $results = array();
+  foreach ($find as $item) {
+    // Render the node.
+    $node = node_load($item->sid);
+    $build = node_view($node, 'search_result');
+    unset($build['#theme']);
+    $node->rendered = drupal_render($build);
+
+    // Fetch comments for snippet.
+    $node->rendered .= ' ' . module_invoke('comment', 'node_update_index', $node);
+
+    $extra = module_invoke_all('node_search_result', $node);
+
+    $uri = entity_uri('node', $node);
+    $results[] = array(
+      'link' => url($uri['path'], array_merge($uri['options'], array('absolute' => TRUE))),
+      'type' => check_plain(node_type_get_name($node)),
+      'title' => $node->title,
+      'user' => theme('username', array('account' => $node)),
+      'date' => $node->changed,
+      'node' => $node,
+      'extra' => $extra,
+      'score' => $item->calculated_score,
+      'snippet' => search_excerpt($keys, $node->rendered),
+      'language' => entity_language('node', $node),
+    );
+  }
+  return $results;
+}
+
+/**
+ * Implements hook_ranking().
+ */
+function node_ranking() {
+  // Create the ranking array and add the basic ranking options.
+  $ranking = array(
+    'relevance' => array(
+      'title' => t('Keyword relevance'),
+      // Average relevance values hover around 0.15
+      'score' => 'i.relevance',
+    ),
+    'sticky' => array(
+      'title' => t('Content is sticky at top of lists'),
+      // The sticky flag is either 0 or 1, which is automatically normalized.
+      'score' => 'n.sticky',
+    ),
+    'promote' => array(
+      'title' => t('Content is promoted to the front page'),
+      // The promote flag is either 0 or 1, which is automatically normalized.
+      'score' => 'n.promote',
+    ),
+  );
+
+  // Add relevance based on creation or changed date.
+  if ($node_cron_last = variable_get('node_cron_last', 0)) {
+    $ranking['recent'] = array(
+      'title' => t('Recently posted'),
+      // Exponential decay with half-life of 6 months, starting at last indexed node
+      'score' => 'POW(2.0, (GREATEST(n.created, n.changed) - :node_cron_last) * 6.43e-8)',
+      'arguments' => array(':node_cron_last' => $node_cron_last),
+    );
+  }
+  return $ranking;
+}
+
+/**
+ * Implements hook_user_cancel().
+ */
+function node_user_cancel($edit, $account, $method) {
+  switch ($method) {
+    case 'user_cancel_block_unpublish':
+      // Unpublish nodes (current revisions).
+      module_load_include('inc', 'node', 'node.admin');
+      $nodes = db_select('node', 'n')
+        ->fields('n', array('nid'))
+        ->condition('uid', $account->uid)
+        ->execute()
+        ->fetchCol();
+      node_mass_update($nodes, array('status' => 0));
+      break;
+
+    case 'user_cancel_reassign':
+      // Anonymize nodes (current revisions).
+      module_load_include('inc', 'node', 'node.admin');
+      $nodes = db_select('node', 'n')
+        ->fields('n', array('nid'))
+        ->condition('uid', $account->uid)
+        ->execute()
+        ->fetchCol();
+      node_mass_update($nodes, array('uid' => 0));
+      // Anonymize old revisions.
+      db_update('node_revision')
+        ->fields(array('uid' => 0))
+        ->condition('uid', $account->uid)
+        ->execute();
+      // Clean history.
+      db_delete('history')
+        ->condition('uid', $account->uid)
+        ->execute();
+      break;
+  }
+}
+
+/**
+ * Implements hook_user_delete().
+ */
+function node_user_delete($account) {
+  // Delete nodes (current revisions).
+  // @todo Introduce node_mass_delete() or make node_mass_update() more flexible.
+  $nodes = db_select('node', 'n')
+    ->fields('n', array('nid'))
+    ->condition('uid', $account->uid)
+    ->execute()
+    ->fetchCol();
+  node_delete_multiple($nodes);
+  // Delete old revisions.
+  $revisions = db_query('SELECT vid FROM {node_revision} WHERE uid = :uid', array(':uid' => $account->uid))->fetchCol();
+  foreach ($revisions as $revision) {
+    node_revision_delete($revision);
+  }
+  // Clean history.
+  db_delete('history')
+    ->condition('uid', $account->uid)
+    ->execute();
+}
+
+/**
+ * Returns HTML for the content ranking part of the search settings admin page.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @see node_search_admin()
+ * @ingroup themeable
+ */
+function theme_node_search_admin($variables) {
+  $form = $variables['form'];
+
+  $output = drupal_render($form['info']);
+
+  $header = array(t('Factor'), t('Weight'));
+  foreach (element_children($form['factors']) as $key) {
+    $row = array();
+    $row[] = $form['factors'][$key]['#title'];
+    $form['factors'][$key]['#title_display'] = 'invisible';
+    $row[] = drupal_render($form['factors'][$key]);
+    $rows[] = $row;
+  }
+  $output .= theme('table', array('header' => $header, 'rows' => $rows));
+
+  $output .= drupal_render_children($form);
+  return $output;
+}
+
+/**
+ * Access callback: Checks node revision access.
+ *
+ * @param $node
+ *   The node to check.
+ * @param $op
+ *   (optional) The specific operation being checked. Defaults to 'view.'
+ * @param object $account
+ *   (optional) A user object representing the user for whom the operation is
+ *   to be performed. Determines access for a user other than the current user.
+ *
+ * @return
+ *   TRUE if the operation may be performed, FALSE otherwise.
+ *
+ * @see node_menu()
+ */
+function _node_revision_access($node, $op = 'view', $account = NULL) {
+  $access = &drupal_static(__FUNCTION__, array());
+
+  $map = array(
+    'view' => 'view revisions',
+    'update' => 'revert revisions',
+    'delete' => 'delete revisions',
+  );
+
+  if (!$node || !isset($map[$op])) {
+    // If there was no node to check against, or the $op was not one of the
+    // supported ones, we return access denied.
+    return FALSE;
+  }
+
+  if (!isset($account)) {
+    $account = $GLOBALS['user'];
+  }
+
+  // Statically cache access by revision ID, user account ID, and operation.
+  $cid = $node->vid . ':' . $account->uid . ':' . $op;
+
+  if (!isset($access[$cid])) {
+    // Perform basic permission checks first.
+    if (!user_access($map[$op], $account) && !user_access('administer nodes', $account)) {
+      return $access[$cid] = FALSE;
+    }
+
+    $node_current_revision = node_load($node->nid);
+    $is_current_revision = $node_current_revision->vid == $node->vid;
+
+    // There should be at least two revisions. If the vid of the given node and
+    // the vid of the current revision differ, then we already have two
+    // different revisions so there is no need for a separate database check.
+    // Also, if you try to revert to or delete the current revision, that's not
+    // good.
+    if ($is_current_revision && (db_query('SELECT COUNT(vid) FROM {node_revision} WHERE nid = :nid', array(':nid' => $node->nid))->fetchField() == 1 || $op == 'update' || $op == 'delete')) {
+      $access[$cid] = FALSE;
+    }
+    elseif (user_access('administer nodes', $account)) {
+      $access[$cid] = TRUE;
+    }
+    else {
+      // First check the access to the current revision and finally, if the node
+      // passed in is not the current revision then access to that, too.
+      $access[$cid] = node_access($op, $node_current_revision, $account) && ($is_current_revision || node_access($op, $node, $account));
+    }
+  }
+
+  return $access[$cid];
+}
+
+/**
+ * Access callback: Checks whether the user has permission to add a node.
+ *
+ * @return
+ *   TRUE if the user has add permission, otherwise FALSE.
+ *
+ * @see node_menu()
+ */
+function _node_add_access() {
+  $types = node_type_get_types();
+  foreach ($types as $type) {
+    if (node_hook($type->type, 'form') && node_access('create', $type->type)) {
+      return TRUE;
+    }
+  }
+  if (user_access('administer content types')) {
+    // There are no content types defined that the user has permission to create,
+    // but the user does have the permission to administer the content types, so
+    // grant them access to the page anyway.
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
+ * Implements hook_menu().
+ */
+function node_menu() {
+  $items['admin/content'] = array(
+    'title' => 'Content',
+    'description' => 'Find and manage content.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('node_admin_content'),
+    'access arguments' => array('access content overview'),
+    'weight' => -10,
+    'file' => 'node.admin.inc',
+  );
+  $items['admin/content/node'] = array(
+    'title' => 'Content',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+
+  $items['admin/reports/status/rebuild'] = array(
+    'title' => 'Rebuild permissions',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('node_configure_rebuild_confirm'),
+    // Any user than can potentially trigger a node_access_needs_rebuild(TRUE)
+    // has to be allowed access to the 'node access rebuild' confirm form.
+    'access arguments' => array('access administration pages'),
+    'type' => MENU_CALLBACK,
+    'file' => 'node.admin.inc',
+  );
+
+  $items['admin/structure/types'] = array(
+    'title' => 'Content types',
+    'description' => 'Manage content types, including default status, front page promotion, comment settings, etc.',
+    'page callback' => 'node_overview_types',
+    'access arguments' => array('administer content types'),
+    'file' => 'content_types.inc',
+  );
+  $items['admin/structure/types/list'] = array(
+    'title' => 'List',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['admin/structure/types/add'] = array(
+    'title' => 'Add content type',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('node_type_form'),
+    'access arguments' => array('administer content types'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'content_types.inc',
+  );
+  $items['admin/structure/types/manage/%node_type'] = array(
+    'title' => 'Edit content type',
+    'title callback' => 'node_type_page_title',
+    'title arguments' => array(4),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('node_type_form', 4),
+    'access arguments' => array('administer content types'),
+    'file' => 'content_types.inc',
+  );
+  $items['admin/structure/types/manage/%node_type/edit'] = array(
+    'title' => 'Edit',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $items['admin/structure/types/manage/%node_type/delete'] = array(
+    'title' => 'Delete',
+    'page arguments' => array('node_type_delete_confirm', 4),
+    'access arguments' => array('administer content types'),
+    'file' => 'content_types.inc',
+  );
+
+  $items['node'] = array(
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+    'menu_name' => 'navigation',
+    'type' => MENU_CALLBACK,
+  );
+  $items['node/add'] = array(
+    'title' => 'Add content',
+    'page callback' => 'node_add_page',
+    'access callback' => '_node_add_access',
+    'file' => 'node.pages.inc',
+  );
+  $items['rss.xml'] = array(
+    'title' => 'RSS feed',
+    'page callback' => 'node_feed',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+    // Pass a FALSE and array argument to ensure that additional path components
+    // are not passed to node_feed().
+    'page arguments' => array(FALSE, array()),
+  );
+  // @todo Remove this loop when we have a 'description callback' property.
+  // Reset internal static cache of _node_types_build(), forces to rebuild the
+  // node type information.
+  node_type_cache_reset();
+  foreach (node_type_get_types() as $type) {
+    $type_url_str = str_replace('_', '-', $type->type);
+    $items['node/add/' . $type_url_str] = array(
+      'title' => $type->name,
+      'title callback' => 'check_plain',
+      'page callback' => 'node_add',
+      'page arguments' => array($type->type),
+      'access callback' => 'node_access',
+      'access arguments' => array('create', $type->type),
+      'description' => $type->description,
+      'file' => 'node.pages.inc',
+    );
+  }
+  $items['node/%node'] = array(
+    'title callback' => 'node_page_title',
+    'title arguments' => array(1),
+    // The page callback also invokes drupal_set_title() in case
+    // the menu router's title is overridden by a menu link.
+    'page callback' => 'node_page_view',
+    'page arguments' => array(1),
+    'access callback' => 'node_access',
+    'access arguments' => array('view', 1),
+  );
+  $items['node/%node/view'] = array(
+    'title' => 'View',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['node/%node/edit'] = array(
+    'title' => 'Edit',
+    'page callback' => 'node_page_edit',
+    'page arguments' => array(1),
+    'access callback' => 'node_access',
+    'access arguments' => array('update', 1),
+    'weight' => 0,
+    'type' => MENU_LOCAL_TASK,
+    'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
+    'file' => 'node.pages.inc',
+  );
+  $items['node/%node/delete'] = array(
+    'title' => 'Delete',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('node_delete_confirm', 1),
+    'access callback' => 'node_access',
+    'access arguments' => array('delete', 1),
+    'weight' => 1,
+    'type' => MENU_LOCAL_TASK,
+    'context' => MENU_CONTEXT_INLINE,
+    'file' => 'node.pages.inc',
+  );
+  $items['node/%node/revisions'] = array(
+    'title' => 'Revisions',
+    'page callback' => 'node_revision_overview',
+    'page arguments' => array(1),
+    'access callback' => '_node_revision_access',
+    'access arguments' => array(1),
+    'weight' => 2,
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'node.pages.inc',
+  );
+  $items['node/%node/revisions/%/view'] = array(
+    'title' => 'Revisions',
+    'load arguments' => array(3),
+    'page callback' => 'node_show',
+    'page arguments' => array(1, TRUE),
+    'access callback' => '_node_revision_access',
+    'access arguments' => array(1),
+  );
+  $items['node/%node/revisions/%/revert'] = array(
+    'title' => 'Revert to earlier revision',
+    'load arguments' => array(3),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('node_revision_revert_confirm', 1),
+    'access callback' => '_node_revision_access',
+    'access arguments' => array(1, 'update'),
+    'file' => 'node.pages.inc',
+  );
+  $items['node/%node/revisions/%/delete'] = array(
+    'title' => 'Delete earlier revision',
+    'load arguments' => array(3),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('node_revision_delete_confirm', 1),
+    'access callback' => '_node_revision_access',
+    'access arguments' => array(1, 'delete'),
+    'file' => 'node.pages.inc',
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_menu_local_tasks_alter().
+ */
+function node_menu_local_tasks_alter(&$data, $router_item, $root_path) {
+  // Add action link to 'node/add' on 'admin/content' page.
+  if ($root_path == 'admin/content') {
+    $item = menu_get_item('node/add');
+    if ($item['access']) {
+      $data['actions']['output'][] = array(
+        '#theme' => 'menu_local_action',
+        '#link' => $item,
+      );
+    }
+  }
+}
+
+/**
+ * Title callback: Returns the unsanitized title of the node type edit form.
+ *
+ * @param $type
+ *   The node type object.
+ *
+ * @return string
+ *   An unsanitized string that is the title of the node type edit form.
+ *
+ * @see node_menu()
+ */
+function node_type_page_title($type) {
+  return $type->name;
+}
+
+/**
+ * Title callback: Returns the title of the node.
+ *
+ * @param $node
+ *   The node object.
+ *
+ * @return
+ *   An unsanitized string that is the title of the node.
+ *
+ * @see node_menu()
+ */
+function node_page_title($node) {
+  return $node->title;
+}
+
+/**
+ * Finds the last time a node was changed.
+ *
+ * @param $nid
+ *   The ID of a node.
+ *
+ * @return
+ *   A unix timestamp indicating the last time the node was changed.
+ */
+function node_last_changed($nid) {
+  return db_query('SELECT changed FROM {node} WHERE nid = :nid', array(':nid' => $nid))->fetch()->changed;
+}
+
+/**
+ * Returns a list of all the existing revision numbers.
+ *
+ * @param $node
+ *   The node object.
+ *
+ * @return
+ *   An associative array keyed by node revision number.
+ */
+function node_revision_list($node) {
+  $revisions = array();
+  $result = db_query('SELECT r.vid, r.title, r.log, r.uid, n.vid AS current_vid, r.timestamp, u.name FROM {node_revision} r LEFT JOIN {node} n ON n.vid = r.vid INNER JOIN {users} u ON u.uid = r.uid WHERE r.nid = :nid ORDER BY r.vid DESC', array(':nid' => $node->nid));
+  foreach ($result as $revision) {
+    $revisions[$revision->vid] = $revision;
+  }
+
+  return $revisions;
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function node_block_info() {
+  $blocks['syndicate']['info'] = t('Syndicate');
+  // Not worth caching.
+  $blocks['syndicate']['cache'] = DRUPAL_NO_CACHE;
+
+  $blocks['recent']['info'] = t('Recent content');
+  $blocks['recent']['properties']['administrative'] = TRUE;
+
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_view().
+ */
+function node_block_view($delta = '') {
+  $block = array();
+
+  switch ($delta) {
+    case 'syndicate':
+      $block['subject'] = t('Syndicate');
+      $block['content'] = theme('feed_icon', array('url' => 'rss.xml', 'title' => t('Syndicate')));
+      break;
+
+    case 'recent':
+      if (user_access('access content')) {
+        $block['subject'] = t('Recent content');
+        if ($nodes = node_get_recent(variable_get('node_recent_block_count', 10))) {
+          $block['content'] = theme('node_recent_block', array(
+            'nodes' => $nodes,
+          ));
+        } else {
+          $block['content'] = t('No content available.');
+        }
+      }
+      break;
+  }
+  return $block;
+}
+
+/**
+ * Implements hook_block_configure().
+ */
+function node_block_configure($delta = '') {
+  $form = array();
+  if ($delta == 'recent') {
+    $form['node_recent_block_count'] = array(
+      '#type' => 'select',
+      '#title' => t('Number of recent content items to display'),
+      '#default_value' => variable_get('node_recent_block_count', 10),
+      '#options' => drupal_map_assoc(array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 30)),
+    );
+  }
+  return $form;
+}
+
+/**
+ * Implements hook_block_save().
+ */
+function node_block_save($delta = '', $edit = array()) {
+  if ($delta == 'recent') {
+    variable_set('node_recent_block_count', $edit['node_recent_block_count']);
+  }
+}
+
+/**
+ * Finds the most recently changed nodes that are available to the current user.
+ *
+ * @param $number
+ *   (optional) The maximum number of nodes to find. Defaults to 10.
+ *
+ * @return
+ *   An array of node entities or an empty array if there are no recent nodes
+ *   visible to the current user.
+ */
+function node_get_recent($number = 10) {
+  $query = db_select('node', 'n');
+
+  if (!user_access('bypass node access')) {
+    // If the user is able to view their own unpublished nodes, allow them to
+    // see these in addition to published nodes. Check that they actually have
+    // some unpublished nodes to view before adding the condition.
+    if (user_access('view own unpublished content') && $own_unpublished = db_query('SELECT nid FROM {node} WHERE uid = :uid AND status = :status', array(':uid' => $GLOBALS['user']->uid, ':status' => NODE_NOT_PUBLISHED))->fetchCol()) {
+      $query->condition(db_or()
+        ->condition('n.status', NODE_PUBLISHED)
+        ->condition('n.nid', $own_unpublished, 'IN')
+      );
+    }
+    else {
+      // If not, restrict the query to published nodes.
+      $query->condition('n.status', NODE_PUBLISHED);
+    }
+  }
+  $nids = $query
+    ->fields('n', array('nid'))
+    ->orderBy('n.changed', 'DESC')
+    ->range(0, $number)
+    ->addTag('node_access')
+    ->execute()
+    ->fetchCol();
+
+  $nodes = node_load_multiple($nids);
+
+  return $nodes ? $nodes : array();
+}
+
+/**
+ * Returns HTML for a list of recent content.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - nodes: An array of recent node objects.
+ *
+ * @ingroup themeable
+ */
+function theme_node_recent_block($variables) {
+  $rows = array();
+  $output = '';
+
+  $l_options = array('query' => drupal_get_destination());
+  foreach ($variables['nodes'] as $node) {
+    $row = array();
+    $row[] = array(
+      'data' => theme('node_recent_content', array('node' => $node)),
+      'class' => 'title-author',
+    );
+    $row[] = array(
+      'data' => node_access('update', $node) ? l(t('edit'), 'node/' . $node->nid . '/edit', $l_options) : '',
+      'class' => 'edit',
+    );
+    $row[] = array(
+      'data' => node_access('delete', $node) ? l(t('delete'), 'node/' . $node->nid . '/delete', $l_options) : '',
+      'class' => 'delete',
+    );
+    $rows[] = $row;
+  }
+
+  if ($rows) {
+    $output = theme('table', array('rows' => $rows));
+    if (user_access('access content overview')) {
+      $output .= theme('more_link', array('url' => 'admin/content', 'title' => t('Show more content')));
+    }
+  }
+
+  return $output;
+}
+
+/**
+ * Returns HTML for a recent node to be displayed in the recent content block.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - node: A node object.
+ *
+ * @ingroup themeable
+ */
+function theme_node_recent_content($variables) {
+  $node = $variables['node'];
+
+  $output = '<div class="node-title">';
+  $output .= l($node->title, 'node/' . $node->nid);
+  $output .= theme('mark', array('type' => node_mark($node->nid, $node->changed)));
+  $output .= '</div><div class="node-author">';
+  $output .= theme('username', array('account' => user_load($node->uid)));
+  $output .= '</div>';
+
+  return $output;
+}
+
+/**
+ * Implements hook_form_FORMID_alter().
+ *
+ * Adds node-type specific visibility options to add block form.
+ *
+ * @see block_add_block_form()
+ */
+function node_form_block_add_block_form_alter(&$form, &$form_state) {
+  node_form_block_admin_configure_alter($form, $form_state);
+}
+
+/**
+ * Implements hook_form_FORMID_alter().
+ *
+ * Adds node-type specific visibility options to block configuration form.
+ *
+ * @see block_admin_configure()
+ */
+function node_form_block_admin_configure_alter(&$form, &$form_state) {
+  $default_type_options = db_query("SELECT type FROM {block_node_type} WHERE module = :module AND delta = :delta", array(
+    ':module' => $form['module']['#value'],
+    ':delta' => $form['delta']['#value'],
+  ))->fetchCol();
+  $form['visibility']['node_type'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Content types'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#group' => 'visibility',
+    '#weight' => 5,
+  );
+  $form['visibility']['node_type']['types'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Show block for specific content types'),
+    '#default_value' => $default_type_options,
+    '#options' => node_type_get_names(),
+    '#description' => t('Show this block only on pages that display content of the given type(s). If you select no types, there will be no type-specific limitation.'),
+  );
+  $form['#submit'][] = 'node_form_block_admin_configure_submit';
+}
+
+/**
+ * Form submission handler for node_form_block_admin_configure_alter().
+ *
+ * @see node_form_block_admin_configure_alter()
+ */
+function node_form_block_admin_configure_submit($form, &$form_state) {
+  db_delete('block_node_type')
+    ->condition('module', $form_state['values']['module'])
+    ->condition('delta', $form_state['values']['delta'])
+    ->execute();
+  $query = db_insert('block_node_type')->fields(array('type', 'module', 'delta'));
+  foreach (array_filter($form_state['values']['types']) as $type) {
+    $query->values(array(
+      'type' => $type,
+      'module' => $form_state['values']['module'],
+      'delta' => $form_state['values']['delta'],
+    ));
+  }
+  $query->execute();
+}
+
+/**
+ * Implements hook_form_FORMID_alter().
+ *
+ * Adds node specific submit handler to delete custom block form.
+ *
+ * @see block_custom_block_delete()
+ */
+function node_form_block_custom_block_delete_alter(&$form, &$form_state) {
+  $form['#submit'][] = 'node_form_block_custom_block_delete_submit';
+}
+
+/**
+ * Form submission handler for node_form_block_custom_block_delete_alter().
+ *
+ * @see node_form_block_custom_block_delete_alter()
+ */
+function node_form_block_custom_block_delete_submit($form, &$form_state) {
+  db_delete('block_node_type')
+    ->condition('module', 'block')
+    ->condition('delta', $form_state['values']['bid'])
+    ->execute();
+}
+
+/**
+ * Implements hook_modules_uninstalled().
+ *
+ * Cleanup {block_node_type} table from modules' blocks.
+ */
+function node_modules_uninstalled($modules) {
+  db_delete('block_node_type')
+    ->condition('module', $modules, 'IN')
+    ->execute();
+}
+
+/**
+ * Implements hook_block_list_alter().
+ *
+ * Check the content type specific visibilty settings. Remove the block if the
+ * visibility conditions are not met.
+ */
+function node_block_list_alter(&$blocks) {
+  global $theme_key;
+
+  // Build an array of node types for each block.
+  $block_node_types = array();
+  $result = db_query('SELECT module, delta, type FROM {block_node_type}');
+  foreach ($result as $record) {
+    $block_node_types[$record->module][$record->delta][$record->type] = TRUE;
+  }
+
+  $node = menu_get_object();
+  $node_types = node_type_get_types();
+  if (arg(0) == 'node' && arg(1) == 'add' && arg(2)) {
+    $node_add_arg = strtr(arg(2), '-', '_');
+  }
+  foreach ($blocks as $key => $block) {
+    if (!isset($block->theme) || !isset($block->status) || $block->theme != $theme_key || $block->status != 1) {
+      // This block was added by a contrib module, leave it in the list.
+      continue;
+    }
+
+    // If a block has no node types associated, it is displayed for every type.
+    // For blocks with node types associated, if the node type does not match
+    // the settings from this block, remove it from the block list.
+    if (isset($block_node_types[$block->module][$block->delta])) {
+      if (!empty($node)) {
+        // This is a node or node edit page.
+        if (!isset($block_node_types[$block->module][$block->delta][$node->type])) {
+          // This block should not be displayed for this node type.
+          unset($blocks[$key]);
+          continue;
+        }
+      }
+      elseif (isset($node_add_arg) && isset($node_types[$node_add_arg])) {
+        // This is a node creation page
+        if (!isset($block_node_types[$block->module][$block->delta][$node_add_arg])) {
+          // This block should not be displayed for this node type.
+          unset($blocks[$key]);
+          continue;
+        }
+      }
+      else {
+        // This is not a node page, remove the block.
+        unset($blocks[$key]);
+        continue;
+      }
+    }
+  }
+}
+
+/**
+ * Generates and prints an RSS feed.
+ *
+ * Generates an RSS feed from an array of node IDs, and prints it with an HTTP
+ * header, with Content Type set to RSS/XML.
+ *
+ * @param $nids
+ *   An array of node IDs (nid). Defaults to FALSE so empty feeds can be
+ *   generated with passing an empty array, if no items are to be added
+ *   to the feed.
+ * @param $channel
+ *   An associative array containing title, link, description and other keys,
+ *   to be parsed by format_rss_channel() and format_xml_elements().
+ *   A list of channel elements can be found at the
+ *   @link http://cyber.law.harvard.edu/rss/rss.html RSS 2.0 Specification. @endlink
+ *   The link should be an absolute URL.
+ */
+function node_feed($nids = FALSE, $channel = array()) {
+  global $base_url, $language_content;
+
+  if ($nids === FALSE) {
+    $nids = db_select('node', 'n')
+      ->fields('n', array('nid', 'created'))
+      ->condition('n.promote', 1)
+      ->condition('n.status', 1)
+      ->orderBy('n.created', 'DESC')
+      ->range(0, variable_get('feed_default_items', 10))
+      ->addTag('node_access')
+      ->execute()
+      ->fetchCol();
+  }
+
+  $item_length = variable_get('feed_item_length', 'fulltext');
+  $namespaces = array('xmlns:dc' => 'http://purl.org/dc/elements/1.1/');
+
+  // Load all nodes to be rendered.
+  $nodes = node_load_multiple($nids);
+  $items = '';
+  foreach ($nodes as $node) {
+    $item_text = '';
+
+    $node->link = url("node/$node->nid", array('absolute' => TRUE));
+    $node->rss_namespaces = array();
+    $node->rss_elements = array(
+      array('key' => 'pubDate', 'value' => gmdate('r', $node->created)),
+      array('key' => 'dc:creator', 'value' => $node->name),
+      array('key' => 'guid', 'value' => $node->nid . ' at ' . $base_url, 'attributes' => array('isPermaLink' => 'false'))
+    );
+
+    // The node gets built and modules add to or modify $node->rss_elements
+    // and $node->rss_namespaces.
+    $build = node_view($node, 'rss');
+    unset($build['#theme']);
+
+    if (!empty($node->rss_namespaces)) {
+      $namespaces = array_merge($namespaces, $node->rss_namespaces);
+    }
+
+    if ($item_length != 'title') {
+      // We render node contents and force links to be last.
+      $build['links']['#weight'] = 1000;
+      $item_text .= drupal_render($build);
+    }
+
+    $items .= format_rss_item($node->title, $node->link, $item_text, $node->rss_elements);
+  }
+
+  $channel_defaults = array(
+    'version'     => '2.0',
+    'title'       => variable_get('site_name', 'Drupal'),
+    'link'        => $base_url,
+    'description' => variable_get('feed_description', ''),
+    'language'    => $language_content->language
+  );
+  $channel_extras = array_diff_key($channel, $channel_defaults);
+  $channel = array_merge($channel_defaults, $channel);
+
+  $output = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
+  $output .= "<rss version=\"" . $channel["version"] . "\" xml:base=\"" . $base_url . "\" " . drupal_attributes($namespaces) . ">\n";
+  $output .= format_rss_channel($channel['title'], $channel['link'], $channel['description'], $items, $channel['language'], $channel_extras);
+  $output .= "</rss>\n";
+
+  drupal_add_http_header('Content-Type', 'application/rss+xml; charset=utf-8');
+  print $output;
+}
+
+/**
+ * Constructs a drupal_render() style array from an array of loaded nodes.
+ *
+ * @param $nodes
+ *   An array of nodes as returned by node_load_multiple().
+ * @param $view_mode
+ *   View mode, e.g. 'full', 'teaser'...
+ * @param $weight
+ *   An integer representing the weight of the first node in the list.
+ * @param $langcode
+ *   (optional) A language code to use for rendering. Defaults to NULL which is
+ *   the global content language of the current request.
+ *
+ * @return
+ *   An array in the format expected by drupal_render().
+ */
+function node_view_multiple($nodes, $view_mode = 'teaser', $weight = 0, $langcode = NULL) {
+  field_attach_prepare_view('node', $nodes, $view_mode, $langcode);
+  entity_prepare_view('node', $nodes, $langcode);
+  $build = array();
+  foreach ($nodes as $node) {
+    $build['nodes'][$node->nid] = node_view($node, $view_mode, $langcode);
+    $build['nodes'][$node->nid]['#weight'] = $weight;
+    $weight++;
+  }
+  $build['nodes']['#sorted'] = TRUE;
+  return $build;
+}
+
+/**
+ * Menu callback: Generates a listing of promoted nodes.
+ *
+ * @return array
+ *   An array in the format expected by drupal_render().
+ *
+ * @see node_menu()
+ */
+function node_page_default() {
+  $select = db_select('node', 'n')
+    ->fields('n', array('nid', 'sticky', 'created'))
+    ->condition('n.promote', 1)
+    ->condition('n.status', 1)
+    ->orderBy('n.sticky', 'DESC')
+    ->orderBy('n.created', 'DESC')
+    ->extend('PagerDefault')
+    ->limit(variable_get('default_nodes_main', 10))
+    ->addTag('node_access');
+
+  $nids = $select->execute()->fetchCol();
+
+  if (!empty($nids)) {
+    $nodes = node_load_multiple($nids);
+    $build = node_view_multiple($nodes);
+
+    // 'rss.xml' is a path, not a file, registered in node_menu().
+    drupal_add_feed('rss.xml', variable_get('site_name', 'Drupal') . ' ' . t('RSS'));
+    $build['pager'] = array(
+      '#theme' => 'pager',
+      '#weight' => 5,
+    );
+    drupal_set_title('');
+  }
+  else {
+    drupal_set_title(t('Welcome to @site-name', array('@site-name' => variable_get('site_name', 'Drupal'))), PASS_THROUGH);
+
+    $default_message = '<p>' . t('No front page content has been created yet.') . '</p>';
+
+    $default_links = array();
+    if (_node_add_access()) {
+      $default_links[] = l(t('Add new content'), 'node/add');
+    }
+    if (!empty($default_links)) {
+      $default_message .= theme('item_list', array('items' => $default_links));
+    }
+
+    $build['default_message'] = array(
+      '#markup' => $default_message,
+      '#prefix' => '<div id="first-time">',
+      '#suffix' => '</div>',
+    );
+  }
+  return $build;
+}
+
+/**
+ * Menu callback: Displays a single node.
+ *
+ * @param $node
+ *   The node object.
+ *
+ * @return
+ *   A page array suitable for use by drupal_render().
+ *
+ * @see node_menu()
+ */
+function node_page_view($node) {
+  // If there is a menu link to this node, the link becomes the last part
+  // of the active trail, and the link name becomes the page title.
+  // Thus, we must explicitly set the page title to be the node title.
+  drupal_set_title($node->title);
+  $uri = entity_uri('node', $node);
+  // Set the node path as the canonical URL to prevent duplicate content.
+  drupal_add_html_head_link(array('rel' => 'canonical', 'href' => url($uri['path'], $uri['options'])), TRUE);
+  // Set the non-aliased path as a default shortlink.
+  drupal_add_html_head_link(array('rel' => 'shortlink', 'href' => url($uri['path'], array_merge($uri['options'], array('alias' => TRUE)))), TRUE);
+  return node_show($node);
+}
+
+/**
+ * Implements hook_update_index().
+ */
+function node_update_index() {
+  $limit = (int)variable_get('search_cron_limit', 100);
+
+  $result = db_query_range("SELECT n.nid FROM {node} n LEFT JOIN {search_dataset} d ON d.type = 'node' AND d.sid = n.nid WHERE d.sid IS NULL OR d.reindex <> 0 ORDER BY d.reindex ASC, n.nid ASC", 0, $limit, array(), array('target' => 'slave'));
+
+  foreach ($result as $node) {
+    _node_index_node($node);
+  }
+}
+
+/**
+ * Indexes a single node.
+ *
+ * @param $node
+ *   The node to index.
+ */
+function _node_index_node($node) {
+  $node = node_load($node->nid);
+
+  // Save the changed time of the most recent indexed node, for the search
+  // results half-life calculation.
+  variable_set('node_cron_last', $node->changed);
+
+  // Render the node.
+  $build = node_view($node, 'search_index');
+  unset($build['#theme']);
+  $node->rendered = drupal_render($build);
+
+  $text = '<h1>' . check_plain($node->title) . '</h1>' . $node->rendered;
+
+  // Fetch extra data normally not visible
+  $extra = module_invoke_all('node_update_index', $node);
+  foreach ($extra as $t) {
+    $text .= $t;
+  }
+
+  // Update index
+  search_index($node->nid, 'node', $text);
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function node_form_search_form_alter(&$form, $form_state) {
+  if (isset($form['module']) && $form['module']['#value'] == 'node' && user_access('use advanced search')) {
+    // Keyword boxes:
+    $form['advanced'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Advanced search'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+      '#attributes' => array('class' => array('search-advanced')),
+    );
+    $form['advanced']['keywords'] = array(
+      '#prefix' => '<div class="criterion">',
+      '#suffix' => '</div>',
+    );
+    $form['advanced']['keywords']['or'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Containing any of the words'),
+      '#size' => 30,
+      '#maxlength' => 255,
+    );
+    $form['advanced']['keywords']['phrase'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Containing the phrase'),
+      '#size' => 30,
+      '#maxlength' => 255,
+    );
+    $form['advanced']['keywords']['negative'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Containing none of the words'),
+      '#size' => 30,
+      '#maxlength' => 255,
+    );
+
+    // Node types:
+    $types = array_map('check_plain', node_type_get_names());
+    $form['advanced']['type'] = array(
+      '#type' => 'checkboxes',
+      '#title' => t('Only of the type(s)'),
+      '#prefix' => '<div class="criterion">',
+      '#suffix' => '</div>',
+      '#options' => $types,
+    );
+    $form['advanced']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Advanced search'),
+      '#prefix' => '<div class="action">',
+      '#suffix' => '</div>',
+      '#weight' => 100,
+    );
+
+    // Languages:
+    $language_options = array();
+    foreach (language_list('language') as $key => $entity) {
+      if ($entity->enabled) {
+        $language_options[$key] = $entity->name;
+      }
+    }
+    if (count($language_options) > 1) {
+      $form['advanced']['language'] = array(
+        '#type' => 'checkboxes',
+        '#title' => t('Languages'),
+        '#prefix' => '<div class="criterion">',
+        '#suffix' => '</div>',
+        '#options' => $language_options,
+      );
+    }
+
+    $form['#validate'][] = 'node_search_validate';
+  }
+}
+
+/**
+ * Form validation handler for node_form_alter().
+ */
+function node_search_validate($form, &$form_state) {
+  // Initialize using any existing basic search keywords.
+  $keys = $form_state['values']['processed_keys'];
+
+  // Insert extra restrictions into the search keywords string.
+  if (isset($form_state['values']['type']) && is_array($form_state['values']['type'])) {
+    // Retrieve selected types - Form API sets the value of unselected
+    // checkboxes to 0.
+    $form_state['values']['type'] = array_filter($form_state['values']['type']);
+    if (count($form_state['values']['type'])) {
+      $keys = search_expression_insert($keys, 'type', implode(',', array_keys($form_state['values']['type'])));
+    }
+  }
+
+  if (isset($form_state['values']['term']) && is_array($form_state['values']['term']) && count($form_state['values']['term'])) {
+    $keys = search_expression_insert($keys, 'term', implode(',', $form_state['values']['term']));
+  }
+  if (isset($form_state['values']['language']) && is_array($form_state['values']['language'])) {
+    $languages = array_filter($form_state['values']['language']);
+    if (count($languages)) {
+      $keys = search_expression_insert($keys, 'language', implode(',', $languages));
+    }
+  }
+  if ($form_state['values']['or'] != '') {
+    if (preg_match_all('/ ("[^"]+"|[^" ]+)/i', ' ' . $form_state['values']['or'], $matches)) {
+      $keys .= ' ' . implode(' OR ', $matches[1]);
+    }
+  }
+  if ($form_state['values']['negative'] != '') {
+    if (preg_match_all('/ ("[^"]+"|[^" ]+)/i', ' ' . $form_state['values']['negative'], $matches)) {
+      $keys .= ' -' . implode(' -', $matches[1]);
+    }
+  }
+  if ($form_state['values']['phrase'] != '') {
+    $keys .= ' "' . str_replace('"', ' ', $form_state['values']['phrase']) . '"';
+  }
+  if (!empty($keys)) {
+    form_set_value($form['basic']['processed_keys'], trim($keys), $form_state);
+  }
+}
+
+/**
+ * @defgroup node_access Node access rights
+ * @{
+ * The node access system determines who can do what to which nodes.
+ *
+ * In determining access rights for a node, node_access() first checks whether
+ * the user has the "bypass node access" permission. Such users have
+ * unrestricted access to all nodes. user 1 will always pass this check.
+ *
+ * Next, all implementations of hook_node_access() will be called. Each
+ * implementation may explicitly allow, explicitly deny, or ignore the access
+ * request. If at least one module says to deny the request, it will be rejected.
+ * If no modules deny the request and at least one says to allow it, the request
+ * will be permitted.
+ *
+ * If all modules ignore the access request, then the node_access table is used
+ * to determine access. All node access modules are queried using
+ * hook_node_grants() to assemble a list of "grant IDs" for the user. This list
+ * is compared against the table. If any row contains the node ID in question
+ * (or 0, which stands for "all nodes"), one of the grant IDs returned, and a
+ * value of TRUE for the operation in question, then access is granted. Note
+ * that this table is a list of grants; any matching row is sufficient to
+ * grant access to the node.
+ *
+ * In node listings (lists of nodes generated from a select query, such as the
+ * default home page at path 'node', an RSS feed, a recent content block, etc.),
+ * the process above is followed except that hook_node_access() is not called on
+ * each node for performance reasons and for proper functioning of the pager
+ * system. When adding a node listing to your module, be sure to use a dynamic
+ * query created by db_select() and add a tag of "node_access". This will allow
+ * modules dealing with node access to ensure only nodes to which the user has
+ * access are retrieved, through the use of hook_query_TAG_alter().
+ *
+ * Note: Even a single module returning NODE_ACCESS_DENY from hook_node_access()
+ * will block access to the node. Therefore, implementers should take care to
+ * not deny access unless they really intend to. Unless a module wishes to
+ * actively deny access it should return NODE_ACCESS_IGNORE (or simply return
+ * nothing) to allow other modules or the node_access table to control access.
+ *
+ * To see how to write a node access module of your own, see
+ * node_access_example.module.
+ */
+
+/**
+ * Determines whether the current user may perform the operation on the node.
+ *
+ * @param $op
+ *   The operation to be performed on the node. Possible values are:
+ *   - "view"
+ *   - "update"
+ *   - "delete"
+ *   - "create"
+ * @param $node
+ *   The node object on which the operation is to be performed, or node type
+ *   (e.g. 'forum') for "create" operation.
+ * @param $account
+ *   Optional, a user object representing the user for whom the operation is to
+ *   be performed. Determines access for a user other than the current user.
+ *
+ * @return
+ *   TRUE if the operation may be performed, FALSE otherwise.
+ */
+function node_access($op, $node, $account = NULL) {
+  $rights = &drupal_static(__FUNCTION__, array());
+
+  if (!$node || !in_array($op, array('view', 'update', 'delete', 'create'), TRUE)) {
+    // If there was no node to check against, or the $op was not one of the
+    // supported ones, we return access denied.
+    return FALSE;
+  }
+  // If no user object is supplied, the access check is for the current user.
+  if (empty($account)) {
+    $account = $GLOBALS['user'];
+  }
+
+  // $node may be either an object or a node type. Since node types cannot be
+  // an integer, use either nid or type as the static cache id.
+
+  $cid = is_object($node) ? $node->nid : $node;
+
+  // If we've already checked access for this node, user and op, return from
+  // cache.
+  if (isset($rights[$account->uid][$cid][$op])) {
+    return $rights[$account->uid][$cid][$op];
+  }
+
+  if (user_access('bypass node access', $account)) {
+    $rights[$account->uid][$cid][$op] = TRUE;
+    return TRUE;
+  }
+  if (!user_access('access content', $account)) {
+    $rights[$account->uid][$cid][$op] = FALSE;
+    return FALSE;
+  }
+
+  // We grant access to the node if both of the following conditions are met:
+  // - No modules say to deny access.
+  // - At least one module says to grant access.
+  // If no module specified either allow or deny, we fall back to the
+  // node_access table.
+  $access = module_invoke_all('node_access', $node, $op, $account);
+  if (in_array(NODE_ACCESS_DENY, $access, TRUE)) {
+    $rights[$account->uid][$cid][$op] = FALSE;
+    return FALSE;
+  }
+  elseif (in_array(NODE_ACCESS_ALLOW, $access, TRUE)) {
+    $rights[$account->uid][$cid][$op] = TRUE;
+    return TRUE;
+  }
+
+  // Check if authors can view their own unpublished nodes.
+  if ($op == 'view' && !$node->status && user_access('view own unpublished content', $account) && $account->uid == $node->uid && $account->uid != 0) {
+    $rights[$account->uid][$cid][$op] = TRUE;
+    return TRUE;
+  }
+
+  // If the module did not override the access rights, use those set in the
+  // node_access table.
+  if ($op != 'create' && $node->nid) {
+    if (module_implements('node_grants')) {
+      $query = db_select('node_access');
+      $query->addExpression('1');
+      $query->condition('grant_' . $op, 1, '>=');
+      $nids = db_or()->condition('nid', $node->nid);
+      if ($node->status) {
+        $nids->condition('nid', 0);
+      }
+      $query->condition($nids);
+      $query->range(0, 1);
+
+      $grants = db_or();
+      foreach (node_access_grants($op, $account) as $realm => $gids) {
+        foreach ($gids as $gid) {
+          $grants->condition(db_and()
+            ->condition('gid', $gid)
+            ->condition('realm', $realm)
+          );
+        }
+      }
+      if (count($grants) > 0) {
+        $query->condition($grants);
+      }
+      $result =  (bool) $query
+        ->execute()
+        ->fetchField();
+      $rights[$account->uid][$cid][$op] = $result;
+      return $result;
+    }
+    elseif (is_object($node) && $op == 'view' && $node->status) {
+      // If no modules implement hook_node_grants(), the default behavior is to
+      // allow all users to view published nodes, so reflect that here.
+      $rights[$account->uid][$cid][$op] = TRUE;
+      return TRUE;
+    }
+  }
+
+  return FALSE;
+}
+
+/**
+ * Implements hook_node_access().
+ */
+function node_node_access($node, $op, $account) {
+  $type = is_string($node) ? $node : $node->type;
+
+  if (in_array($type, node_permissions_get_configured_types())) {
+    if ($op == 'create' && user_access('create ' . $type . ' content', $account)) {
+      return NODE_ACCESS_ALLOW;
+    }
+
+    if ($op == 'update') {
+      if (user_access('edit any ' . $type . ' content', $account) || (user_access('edit own ' . $type . ' content', $account) && ($account->uid == $node->uid))) {
+        return NODE_ACCESS_ALLOW;
+      }
+    }
+
+    if ($op == 'delete') {
+      if (user_access('delete any ' . $type . ' content', $account) || (user_access('delete own ' . $type . ' content', $account) && ($account->uid == $node->uid))) {
+        return NODE_ACCESS_ALLOW;
+      }
+    }
+  }
+
+  return NODE_ACCESS_IGNORE;
+}
+
+/**
+ * Helper function to generate standard node permission list for a given type.
+ *
+ * @param $type
+ *   The machine-readable name of the node type.
+ *
+ * @return array
+ *   An array of permission names and descriptions.
+ */
+function node_list_permissions($type) {
+  $info = node_type_get_type($type);
+
+  // Build standard list of node permissions for this type.
+  $perms = array(
+    "create $type content" => array(
+      'title' => t('%type_name: Create new content', array('%type_name' => $info->name)),
+    ),
+    "edit own $type content" => array(
+      'title' => t('%type_name: Edit own content', array('%type_name' => $info->name)),
+    ),
+    "edit any $type content" => array(
+      'title' => t('%type_name: Edit any content', array('%type_name' => $info->name)),
+    ),
+    "delete own $type content" => array(
+      'title' => t('%type_name: Delete own content', array('%type_name' => $info->name)),
+    ),
+    "delete any $type content" => array(
+      'title' => t('%type_name: Delete any content', array('%type_name' => $info->name)),
+    ),
+  );
+
+  return $perms;
+}
+
+/**
+ * Returns an array of node types that should be managed by permissions.
+ *
+ * By default, this will include all node types in the system. To exclude a
+ * specific node from getting permissions defined for it, set the
+ * node_permissions_$type variable to 0. Core does not provide an interface for
+ * doing so. However, contrib modules may exclude their own nodes in
+ * hook_install(). Alternatively, contrib modules may configure all node types
+ * at once, or decide to apply some other hook_node_access() implementation to
+ * some or all node types.
+ *
+ * @return
+ *   An array of node types managed by this module.
+ */
+function node_permissions_get_configured_types() {
+
+  $configured_types = array();
+
+  foreach (node_type_get_types() as $type => $info) {
+    if (variable_get('node_permissions_' . $type, 1)) {
+      $configured_types[] = $type;
+    }
+  }
+
+  return $configured_types;
+}
+
+/**
+ * Fetches an array of permission IDs granted to the given user ID.
+ *
+ * The implementation here provides only the universal "all" grant. A node
+ * access module should implement hook_node_grants() to provide a grant list for
+ * the user.
+ *
+ * After the default grants have been loaded, we allow modules to alter the
+ * grants array by reference. This hook allows for complex business logic to be
+ * applied when integrating multiple node access modules.
+ *
+ * @param $op
+ *   The operation that the user is trying to perform.
+ * @param $account
+ *   The user object for the user performing the operation. If omitted, the
+ *   current user is used.
+ *
+ * @return
+ *   An associative array in which the keys are realms, and the values are
+ *   arrays of grants for those realms.
+ */
+function node_access_grants($op, $account = NULL) {
+
+  if (!isset($account)) {
+    $account = $GLOBALS['user'];
+  }
+
+  // Fetch node access grants from other modules.
+  $grants = module_invoke_all('node_grants', $account, $op);
+  // Allow modules to alter the assigned grants.
+  drupal_alter('node_grants', $grants, $account, $op);
+
+  return array_merge(array('all' => array(0)), $grants);
+}
+
+/**
+ * Determines whether the user has a global viewing grant for all nodes.
+ *
+ * Checks to see whether any module grants global 'view' access to a user
+ * account; global 'view' access is encoded in the {node_access} table as a
+ * grant with nid=0. If no node access modules are enabled, node.module defines
+ * such a global 'view' access grant.
+ *
+ * This function is called when a node listing query is tagged with
+ * 'node_access'; when this function returns TRUE, no node access joins are
+ * added to the query.
+ *
+ * @param $account
+ *   The user object for the user whose access is being checked. If omitted,
+ *   the current user is used.
+ *
+ * @return
+ *   TRUE if 'view' access to all nodes is granted, FALSE otherwise.
+ *
+ * @see hook_node_grants()
+ * @see _node_query_node_access_alter()
+ */
+function node_access_view_all_nodes($account = NULL) {
+  global $user;
+  if (!$account) {
+    $account = $user;
+  }
+
+  // Statically cache results in an array keyed by $account->uid.
+  $access = &drupal_static(__FUNCTION__);
+  if (isset($access[$account->uid])) {
+    return $access[$account->uid];
+  }
+
+  // If no modules implement the node access system, access is always TRUE.
+  if (!module_implements('node_grants')) {
+    $access[$account->uid] = TRUE;
+  }
+  else {
+    $query = db_select('node_access');
+    $query->addExpression('COUNT(*)');
+    $query
+      ->condition('nid', 0)
+      ->condition('grant_view', 1, '>=');
+
+    $grants = db_or();
+    foreach (node_access_grants('view', $account) as $realm => $gids) {
+      foreach ($gids as $gid) {
+        $grants->condition(db_and()
+          ->condition('gid', $gid)
+          ->condition('realm', $realm)
+        );
+      }
+    }
+    if (count($grants) > 0 ) {
+      $query->condition($grants);
+    }
+    $access[$account->uid] = $query
+      ->execute()
+      ->fetchField();
+  }
+
+  return $access[$account->uid];
+}
+
+
+/**
+ * Implements hook_query_TAG_alter().
+ *
+ * This is the hook_query_alter() for queries tagged with 'node_access'. It adds
+ * node access checks for the user account given by the 'account' meta-data (or
+ * global $user if not provided), for an operation given by the 'op' meta-data
+ * (or 'view' if not provided; other possible values are 'update' and 'delete').
+ */
+function node_query_node_access_alter(QueryAlterableInterface $query) {
+  _node_query_node_access_alter($query, 'node');
+}
+
+/**
+ * Implements hook_query_TAG_alter().
+ *
+ * This function implements the same functionality as
+ * node_query_node_access_alter() for the SQL field storage engine. Node access
+ * conditions are added for field values belonging to nodes only.
+ */
+function node_query_entity_field_access_alter(QueryAlterableInterface $query) {
+  _node_query_node_access_alter($query, 'entity');
+}
+
+/**
+ * Helper for node access functions.
+ *
+ * @param $query
+ *   The query to add conditions to.
+ * @param $type
+ *   Either 'node' or 'entity' depending on what sort of query it is. See
+ *   node_query_node_access_alter() and node_query_entity_field_access_alter()
+ *   for more.
+ */
+function _node_query_node_access_alter($query, $type) {
+  global $user;
+
+  // Read meta-data from query, if provided.
+  if (!$account = $query->getMetaData('account')) {
+    $account = $user;
+  }
+  if (!$op = $query->getMetaData('op')) {
+    $op = 'view';
+  }
+
+  // If $account can bypass node access, or there are no node access modules,
+  // or the operation is 'view' and the $account has a global view grant
+  // (such as a view grant for node ID 0), we don't need to alter the query.
+  if (user_access('bypass node access', $account)) {
+    return;
+  }
+  if (!count(module_implements('node_grants'))) {
+    return;
+  }
+  if ($op == 'view' && node_access_view_all_nodes($account)) {
+    return;
+  }
+
+  $tables = $query->getTables();
+  $base_table = $query->getMetaData('base_table');
+  // If no base table is specified explicitly, search for one.
+  if (!$base_table) {
+    $fallback = '';
+    foreach ($tables as $alias => $table_info) {
+      if (!($table_info instanceof SelectQueryInterface)) {
+        $table = $table_info['table'];
+        // If the node table is in the query, it wins immediately.
+        if ($table == 'node') {
+          $base_table = $table;
+          break;
+        }
+        // Check whether the table has a foreign key to node.nid. If it does,
+        // do not run this check again as we found a base table and only node
+        // can triumph that.
+        if (!$base_table) {
+          // The schema is cached.
+          $schema = drupal_get_schema($table);
+          if (isset($schema['fields']['nid'])) {
+            if (isset($schema['foreign keys'])) {
+              foreach ($schema['foreign keys'] as $relation) {
+                if ($relation['table'] === 'node' && $relation['columns'] === array('nid' => 'nid')) {
+                  $base_table = $table;
+                }
+              }
+            }
+            else {
+              // At least it's a nid. A table with a field called nid is very
+              // very likely to be a node.nid in a node access query.
+              $fallback = $table;
+            }
+          }
+        }
+      }
+    }
+    // If there is nothing else, use the fallback.
+    if (!$base_table) {
+      if ($fallback) {
+        watchdog('security', 'Your node listing query is using @fallback as a base table in a query tagged for node access. This might not be secure and might not even work. Specify foreign keys in your schema to node.nid ', array('@fallback' => $fallback), WATCHDOG_WARNING);
+        $base_table = $fallback;
+      }
+      else {
+        throw new Exception(t('Query tagged for node access but there is no nid. Add foreign keys to node.nid in schema to fix.'));
+      }
+    }
+  }
+
+  // Find all instances of the base table being joined -- could appear
+  // more than once in the query, and could be aliased. Join each one to
+  // the node_access table.
+
+  $grants = node_access_grants($op, $account);
+  if ($type == 'entity') {
+    // The original query looked something like:
+    // @code
+    //  SELECT nid FROM sometable s
+    //  INNER JOIN node_access na ON na.nid = s.nid
+    //  WHERE ($node_access_conditions)
+    // @endcode
+    //
+    // Our query will look like:
+    // @code
+    //  SELECT entity_type, entity_id
+    //  FROM field_data_something s
+    //  LEFT JOIN node_access na ON s.entity_id = na.nid
+    //  WHERE (entity_type = 'node' AND $node_access_conditions) OR (entity_type <> 'node')
+    // @endcode
+    //
+    // So instead of directly adding to the query object, we need to collect
+    // all of the node access conditions in a separate db_and() object and
+    // then add it to the query at the end.
+    $node_conditions = db_and();
+  }
+  foreach ($tables as $nalias => $tableinfo) {
+    $table = $tableinfo['table'];
+    if (!($table instanceof SelectQueryInterface) && $table == $base_table) {
+      // Set the subquery.
+      $subquery = db_select('node_access', 'na')
+       ->fields('na', array('nid'));
+
+      $grant_conditions = db_or();
+      // If any grant exists for the specified user, then user has access
+      // to the node for the specified operation.
+      foreach ($grants as $realm => $gids) {
+        foreach ($gids as $gid) {
+          $grant_conditions->condition(db_and()
+            ->condition('na.gid', $gid)
+            ->condition('na.realm', $realm)
+          );
+        }
+      }
+
+      // Attach conditions to the subquery for nodes.
+      if (count($grant_conditions->conditions())) {
+        $subquery->condition($grant_conditions);
+      }
+      $subquery->condition('na.grant_' . $op, 1, '>=');
+      $field = 'nid';
+      // Now handle entities.
+      if ($type == 'entity') {
+        // Set a common alias for entities.
+        $base_alias = $nalias;
+        $field = 'entity_id';
+      }
+      $subquery->where("$nalias.$field = na.nid");
+
+      // For an entity query, attach the subquery to entity conditions.
+      if ($type == 'entity') {
+        $node_conditions->exists($subquery);
+      }
+      // Otherwise attach it to the node query itself.
+      else {
+        $query->exists($subquery);
+      }
+    }
+  }
+
+  if ($type == 'entity' && count($subquery->conditions())) {
+    // All the node access conditions are only for field values belonging to
+    // nodes.
+    $node_conditions->condition("$base_alias.entity_type", 'node');
+    $or = db_or();
+    $or->condition($node_conditions);
+    // If the field value belongs to a non-node entity type then this function
+    // does not do anything with it.
+    $or->condition("$base_alias.entity_type", 'node', '<>');
+    // Add the compiled set of rules to the query.
+    $query->condition($or);
+  }
+
+}
+
+/**
+ * Gets the list of node access grants and writes them to the database.
+ *
+ * This function is called when a node is saved, and can also be called by
+ * modules if something other than a node save causes node access permissions to
+ * change. It collects all node access grants for the node from
+ * hook_node_access_records() implementations, allows these grants to be altered
+ * via hook_node_access_records_alter() implementations, and saves the collected
+ * and altered grants to the database.
+ *
+ * @param $node
+ *   The $node to acquire grants for.
+ *
+ * @param $delete
+ *   Whether to delete existing node access records before inserting new ones.
+ *   Defaults to TRUE.
+ */
+function node_access_acquire_grants($node, $delete = TRUE) {
+  $grants = module_invoke_all('node_access_records', $node);
+  // Let modules alter the grants.
+  drupal_alter('node_access_records', $grants, $node);
+  // If no grants are set and the node is published, then use the default grant.
+  if (empty($grants) && !empty($node->status)) {
+    $grants[] = array('realm' => 'all', 'gid' => 0, 'grant_view' => 1, 'grant_update' => 0, 'grant_delete' => 0);
+  }
+  else {
+    // Retain grants by highest priority.
+    $grant_by_priority = array();
+    foreach ($grants as $g) {
+      $grant_by_priority[intval($g['priority'])][] = $g;
+    }
+    krsort($grant_by_priority);
+    $grants = array_shift($grant_by_priority);
+  }
+
+  node_access_write_grants($node, $grants, NULL, $delete);
+}
+
+/**
+ * Writes a list of grants to the database, deleting any previously saved ones.
+ *
+ * If a realm is provided, it will only delete grants from that realm, but it
+ * will always delete a grant from the 'all' realm. Modules that utilize
+ * node_access() can use this function when doing mass updates due to widespread
+ * permission changes.
+ *
+ * Note: Don't call this function directly from a contributed module. Call
+ * node_access_acquire_grants() instead.
+ *
+ * @param $node
+ *   The node whose grants are being written.
+ * @param $grants
+ *   A list of grants to write. Each grant is an array that must contain the
+ *   following keys: realm, gid, grant_view, grant_update, grant_delete.
+ *   The realm is specified by a particular module; the gid is as well, and
+ *   is a module-defined id to define grant privileges. each grant_* field
+ *   is a boolean value.
+ * @param $realm
+ *   (optional) If provided, read/write grants for that realm only. Defaults to
+ *   NULL.
+ * @param $delete
+ *   (optional) If false, does not delete records. This is only for optimization
+ *   purposes, and assumes the caller has already performed a mass delete of
+ *   some form. Defaults to TRUE.
+ *
+ * @see node_access_acquire_grants()
+ */
+function node_access_write_grants($node, $grants, $realm = NULL, $delete = TRUE) {
+  if ($delete) {
+    $query = db_delete('node_access')->condition('nid', $node->nid);
+    if ($realm) {
+      $query->condition('realm', array($realm, 'all'), 'IN');
+    }
+    $query->execute();
+  }
+
+  // Only perform work when node_access modules are active.
+  if (!empty($grants) && count(module_implements('node_grants'))) {
+    $query = db_insert('node_access')->fields(array('nid', 'realm', 'gid', 'grant_view', 'grant_update', 'grant_delete'));
+    foreach ($grants as $grant) {
+      if ($realm && $realm != $grant['realm']) {
+        continue;
+      }
+      // Only write grants; denies are implicit.
+      if ($grant['grant_view'] || $grant['grant_update'] || $grant['grant_delete']) {
+        $grant['nid'] = $node->nid;
+        $query->values($grant);
+      }
+    }
+    $query->execute();
+  }
+}
+
+/**
+ * Flags or unflags the node access grants for rebuilding.
+ *
+ * If the argument isn't specified, the current value of the flag is returned.
+ * When the flag is set, a message is displayed to users with 'access
+ * administration pages' permission, pointing to the 'rebuild' confirm form.
+ * This can be used as an alternative to direct node_access_rebuild calls,
+ * allowing administrators to decide when they want to perform the actual
+ * (possibly time consuming) rebuild. When unsure if the current user is an
+ * administrator, node_access_rebuild() should be used instead.
+ *
+ * @param $rebuild
+ *   (Optional) The boolean value to be written.
+ *
+ * @return
+ *   The current value of the flag if no value was provided for $rebuild.
+ *
+ * @see node_access_rebuild()
+ */
+function node_access_needs_rebuild($rebuild = NULL) {
+  if (!isset($rebuild)) {
+    return variable_get('node_access_needs_rebuild', FALSE);
+  }
+  elseif ($rebuild) {
+    variable_set('node_access_needs_rebuild', TRUE);
+  }
+  else {
+    variable_del('node_access_needs_rebuild');
+  }
+}
+
+/**
+ * Rebuilds the node access database.
+ *
+ * This is occasionally needed by modules that make system-wide changes to
+ * access levels. When the rebuild is required by an admin-triggered action (e.g
+ * module settings form), calling node_access_needs_rebuild(TRUE) instead of
+ * node_access_rebuild() lets the user perform his changes and actually
+ * rebuild only once he is done.
+ *
+ * Note: As of Drupal 6, node access modules are not required to (and actually
+ * should not) call node_access_rebuild() in hook_enable/disable anymore.
+ *
+ * @see node_access_needs_rebuild()
+ *
+ * @param $batch_mode
+ *   Set to TRUE to process in 'batch' mode, spawning processing over several
+ *   HTTP requests (thus avoiding the risk of PHP timeout if the site has a
+ *   large number of nodes).
+ *   hook_update_N and any form submit handler are safe contexts to use the
+ *   'batch mode'. Less decidable cases (such as calls from hook_user,
+ *   hook_taxonomy, etc...) might consider using the non-batch mode.
+ */
+function node_access_rebuild($batch_mode = FALSE) {
+  db_delete('node_access')->execute();
+  // Only recalculate if the site is using a node_access module.
+  if (count(module_implements('node_grants'))) {
+    if ($batch_mode) {
+      $batch = array(
+        'title' => t('Rebuilding content access permissions'),
+        'operations' => array(
+          array('_node_access_rebuild_batch_operation', array()),
+        ),
+        'finished' => '_node_access_rebuild_batch_finished'
+      );
+      batch_set($batch);
+    }
+    else {
+      // Try to allocate enough time to rebuild node grants
+      drupal_set_time_limit(240);
+
+      $nids = db_query("SELECT nid FROM {node}")->fetchCol();
+      foreach ($nids as $nid) {
+        $node = node_load($nid, NULL, TRUE);
+        // To preserve database integrity, only acquire grants if the node
+        // loads successfully.
+        if (!empty($node)) {
+          node_access_acquire_grants($node);
+        }
+      }
+    }
+  }
+  else {
+    // Not using any node_access modules. Add the default grant.
+    db_insert('node_access')
+      ->fields(array(
+        'nid' => 0,
+        'realm' => 'all',
+        'gid' => 0,
+        'grant_view' => 1,
+        'grant_update' => 0,
+        'grant_delete' => 0,
+      ))
+      ->execute();
+  }
+
+  if (!isset($batch)) {
+    drupal_set_message(t('Content permissions have been rebuilt.'));
+    node_access_needs_rebuild(FALSE);
+    cache_clear_all();
+  }
+}
+
+/**
+ * Performs batch operation for node_access_rebuild().
+ *
+ * This is a multistep operation: we go through all nodes by packs of 20. The
+ * batch processing engine interrupts processing and sends progress feedback
+ * after 1 second execution time.
+ *
+ * @param array $context
+ *   An array of contextual key/value information for rebuild batch process.
+ */
+function _node_access_rebuild_batch_operation(&$context) {
+  if (empty($context['sandbox'])) {
+    // Initiate multistep processing.
+    $context['sandbox']['progress'] = 0;
+    $context['sandbox']['current_node'] = 0;
+    $context['sandbox']['max'] = db_query('SELECT COUNT(DISTINCT nid) FROM {node}')->fetchField();
+  }
+
+  // Process the next 20 nodes.
+  $limit = 20;
+  $nids = db_query_range("SELECT nid FROM {node} WHERE nid > :nid ORDER BY nid ASC", 0, $limit, array(':nid' => $context['sandbox']['current_node']))->fetchCol();
+  $nodes = node_load_multiple($nids, array(), TRUE);
+  foreach ($nodes as $nid => $node) {
+    // To preserve database integrity, only acquire grants if the node
+    // loads successfully.
+    if (!empty($node)) {
+      node_access_acquire_grants($node);
+    }
+    $context['sandbox']['progress']++;
+    $context['sandbox']['current_node'] = $nid;
+  }
+
+  // Multistep processing : report progress.
+  if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
+    $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
+  }
+}
+
+/**
+ * Performs post-processing for node_access_rebuild().
+ *
+ * @param bool $success
+ *   A boolean indicating whether the re-build process has completed.
+ * @param array $results
+ *   An array of results information.
+ * @param array $operations
+ *   An array of function calls (not used in this function).
+ */
+function _node_access_rebuild_batch_finished($success, $results, $operations) {
+  if ($success) {
+    drupal_set_message(t('The content access permissions have been rebuilt.'));
+    node_access_needs_rebuild(FALSE);
+  }
+  else {
+    drupal_set_message(t('The content access permissions have not been properly rebuilt.'), 'error');
+  }
+  cache_clear_all();
+}
+
+/**
+ * @} End of "defgroup node_access".
+ */
+
+/**
+ * @defgroup node_content Hook implementations for user-created content types
+ * @{
+ * Functions that implement hooks for user-created content types.
+ */
+
+/**
+ * Implements hook_form().
+ */
+function node_content_form($node, $form_state) {
+  // It is impossible to define a content type without implementing hook_form()
+  // @todo: remove this requirement.
+  $form = array();
+  $type = node_type_get_type($node);
+
+  if ($type->has_title) {
+    $form['title'] = array(
+      '#type' => 'textfield',
+      '#title' => check_plain($type->title_label),
+      '#required' => TRUE,
+      '#default_value' => $node->title,
+      '#maxlength' => 255,
+      '#weight' => -5,
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * @} End of "defgroup node_content".
+ */
+
+/**
+ * Implements hook_forms().
+ *
+ * All node forms share the same form handler.
+ */
+function node_forms() {
+  $forms = array();
+  if ($types = node_type_get_types()) {
+    foreach (array_keys($types) as $type) {
+      $forms[$type . '_node_form']['callback'] = 'node_form';
+    }
+  }
+  return $forms;
+}
+
+/**
+ * Implements hook_action_info().
+ */
+function node_action_info() {
+  return array(
+    'node_publish_action' => array(
+      'type' => 'node',
+      'label' => t('Publish content'),
+      'configurable' => FALSE,
+      'behavior' => array('changes_property'),
+      'triggers' => array('node_presave', 'comment_insert', 'comment_update', 'comment_delete'),
+    ),
+    'node_unpublish_action' => array(
+      'type' => 'node',
+      'label' => t('Unpublish content'),
+      'configurable' => FALSE,
+      'behavior' => array('changes_property'),
+      'triggers' => array('node_presave', 'comment_insert', 'comment_update', 'comment_delete'),
+    ),
+    'node_make_sticky_action' => array(
+      'type' => 'node',
+      'label' => t('Make content sticky'),
+      'configurable' => FALSE,
+      'behavior' => array('changes_property'),
+      'triggers' => array('node_presave', 'comment_insert', 'comment_update', 'comment_delete'),
+    ),
+    'node_make_unsticky_action' => array(
+      'type' => 'node',
+      'label' => t('Make content unsticky'),
+      'configurable' => FALSE,
+      'behavior' => array('changes_property'),
+      'triggers' => array('node_presave', 'comment_insert', 'comment_update', 'comment_delete'),
+    ),
+    'node_promote_action' => array(
+      'type' => 'node',
+      'label' => t('Promote content to front page'),
+      'configurable' => FALSE,
+      'behavior' => array('changes_property'),
+      'triggers' => array('node_presave', 'comment_insert', 'comment_update', 'comment_delete'),
+    ),
+    'node_unpromote_action' => array(
+      'type' => 'node',
+      'label' => t('Remove content from front page'),
+      'configurable' => FALSE,
+      'behavior' => array('changes_property'),
+      'triggers' => array('node_presave', 'comment_insert', 'comment_update', 'comment_delete'),
+    ),
+    'node_assign_owner_action' => array(
+      'type' => 'node',
+      'label' => t('Change the author of content'),
+      'configurable' => TRUE,
+      'behavior' => array('changes_property'),
+      'triggers' => array('node_presave', 'comment_insert', 'comment_update', 'comment_delete'),
+    ),
+    'node_save_action' => array(
+      'type' => 'node',
+      'label' => t('Save content'),
+      'configurable' => FALSE,
+      'triggers' => array('comment_insert', 'comment_update', 'comment_delete'),
+    ),
+    'node_unpublish_by_keyword_action' => array(
+      'type' => 'node',
+      'label' => t('Unpublish content containing keyword(s)'),
+      'configurable' => TRUE,
+      'triggers' => array('node_presave', 'node_insert', 'node_update'),
+    ),
+  );
+}
+
+/**
+ * Sets the status of a node to 1 (published).
+ *
+ * @param $node
+ *   A node object.
+ * @param $context
+ *   (optional) Array of additional information about what triggered the action.
+ *   Not used for this action.
+ *
+ * @ingroup actions
+ */
+function node_publish_action($node, $context = array()) {
+  $node->status = NODE_PUBLISHED;
+  watchdog('action', 'Set @type %title to published.', array('@type' => node_type_get_name($node), '%title' => $node->title));
+}
+
+/**
+ * Sets the status of a node to 0 (unpublished).
+ *
+ * @param $node
+ *   A node object.
+ * @param $context
+ *   (optional) Array of additional information about what triggered the action.
+ *   Not used for this action.
+ *
+ * @ingroup actions
+ */
+function node_unpublish_action($node, $context = array()) {
+  $node->status = NODE_NOT_PUBLISHED;
+  watchdog('action', 'Set @type %title to unpublished.', array('@type' => node_type_get_name($node), '%title' => $node->title));
+}
+
+/**
+ * Sets the sticky-at-top-of-list property of a node to 1.
+ *
+ * @param $node
+ *   A node object.
+ * @param $context
+ *   (optional) Array of additional information about what triggered the action.
+ *   Not used for this action.
+ *
+ * @ingroup actions
+ */
+function node_make_sticky_action($node, $context = array()) {
+  $node->sticky = NODE_STICKY;
+  watchdog('action', 'Set @type %title to sticky.', array('@type' => node_type_get_name($node), '%title' => $node->title));
+}
+
+/**
+ * Sets the sticky-at-top-of-list property of a node to 0.
+ *
+ * @param $node
+ *   A node object.
+ * @param $context
+ *   (optional) Array of additional information about what triggered the action.
+ *   Not used for this action.
+ *
+ * @ingroup actions
+ */
+function node_make_unsticky_action($node, $context = array()) {
+  $node->sticky = NODE_NOT_STICKY;
+  watchdog('action', 'Set @type %title to unsticky.', array('@type' => node_type_get_name($node), '%title' => $node->title));
+}
+
+/**
+ * Sets the promote property of a node to 1.
+ *
+ * @param $node
+ *   A node object.
+ * @param $context
+ *   (optional) Array of additional information about what triggered the action.
+ *   Not used for this action.
+ *
+ * @ingroup actions
+ */
+function node_promote_action($node, $context = array()) {
+  $node->promote = NODE_PROMOTED;
+  watchdog('action', 'Promoted @type %title to front page.', array('@type' => node_type_get_name($node), '%title' => $node->title));
+}
+
+/**
+ * Sets the promote property of a node to 0.
+ *
+ * @param $node
+ *   A node object.
+ * @param $context
+ *   (optional) Array of additional information about what triggered the action.
+ *   Not used for this action.
+ *
+ * @ingroup actions
+ */
+function node_unpromote_action($node, $context = array()) {
+  $node->promote = NODE_NOT_PROMOTED;
+  watchdog('action', 'Removed @type %title from front page.', array('@type' => node_type_get_name($node), '%title' => $node->title));
+}
+
+/**
+ * Saves a node.
+ *
+ * @param $node
+ *   The node to be saved.
+ *
+ * @ingroup actions
+ */
+function node_save_action($node) {
+  node_save($node);
+  watchdog('action', 'Saved @type %title', array('@type' => node_type_get_name($node), '%title' => $node->title));
+}
+
+/**
+ * Assigns ownership of a node to a user.
+ *
+ * @param $node
+ *   A node object to modify.
+ * @param $context
+ *   Array with the following elements:
+ *   - 'owner_uid': User ID to assign to the node.
+ *
+ * @see node_assign_owner_action_form()
+ * @see node_assign_owner_action_validate()
+ * @see node_assign_owner_action_submit()
+ * @ingroup actions
+ */
+function node_assign_owner_action($node, $context) {
+  $node->uid = $context['owner_uid'];
+  $owner_name = db_query("SELECT name FROM {users} WHERE uid = :uid", array(':uid' => $context['owner_uid']))->fetchField();
+  watchdog('action', 'Changed owner of @type %title to uid %name.', array('@type' =>  node_type_get_name($node), '%title' => $node->title, '%name' => $owner_name));
+}
+
+/**
+ * Generates the settings form for node_assign_owner_action().
+ *
+ * @param $context
+ *   Array of additional information about what triggered the action. Includes
+ *   the following elements:
+ *   - 'owner_uid': User ID to assign to the node.
+ *
+ * @see node_assign_owner_action_submit()
+ * @see node_assign_owner_action_validate()
+ *
+ * @ingroup forms
+ */
+function node_assign_owner_action_form($context) {
+  $description = t('The username of the user to which you would like to assign ownership.');
+  $count = db_query("SELECT COUNT(*) FROM {users}")->fetchField();
+  $owner_name = '';
+  if (isset($context['owner_uid'])) {
+    $owner_name = db_query("SELECT name FROM {users} WHERE uid = :uid", array(':uid' => $context['owner_uid']))->fetchField();
+  }
+
+  // Use dropdown for fewer than 200 users; textbox for more than that.
+  if (intval($count) < 200) {
+    $options = array();
+    $result = db_query("SELECT uid, name FROM {users} WHERE uid > 0 ORDER BY name");
+    foreach ($result as $data) {
+      $options[$data->name] = $data->name;
+    }
+    $form['owner_name'] = array(
+      '#type' => 'select',
+      '#title' => t('Username'),
+      '#default_value' => $owner_name,
+      '#options' => $options,
+      '#description' => $description,
+    );
+  }
+  else {
+    $form['owner_name'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Username'),
+      '#default_value' => $owner_name,
+      '#autocomplete_path' => 'user/autocomplete',
+      '#size' => '6',
+      '#maxlength' => '60',
+      '#description' => $description,
+    );
+  }
+  return $form;
+}
+
+/**
+ * Validates settings form for node_assign_owner_action().
+ *
+ * @see node_assign_owner_action_submit()
+ */
+function node_assign_owner_action_validate($form, $form_state) {
+  $exists = (bool) db_query_range('SELECT 1 FROM {users} WHERE name = :name', 0, 1, array(':name' => $form_state['values']['owner_name']))->fetchField();
+  if (!$exists) {
+    form_set_error('owner_name', t('Enter a valid username.'));
+  }
+}
+
+/**
+ * Saves settings form for node_assign_owner_action().
+ *
+ * @see node_assign_owner_action_validate()
+ */
+function node_assign_owner_action_submit($form, $form_state) {
+  // Username can change, so we need to store the ID, not the username.
+  $uid = db_query('SELECT uid from {users} WHERE name = :name', array(':name' => $form_state['values']['owner_name']))->fetchField();
+  return array('owner_uid' => $uid);
+}
+
+/**
+ * Generates settings form for node_unpublish_by_keyword_action().
+ *
+ * @param array $context
+ *   Array of additional information about what triggered this action.
+ *
+ * @return array
+ *   A form array.
+ *
+ * @see node_unpublish_by_keyword_action_submit()
+ */
+function node_unpublish_by_keyword_action_form($context) {
+  $form['keywords'] = array(
+    '#title' => t('Keywords'),
+    '#type' => 'textarea',
+    '#description' => t('The content will be unpublished if it contains any of the phrases above. Use a case-sensitive, comma-separated list of phrases. Example: funny, bungee jumping, "Company, Inc."'),
+    '#default_value' => isset($context['keywords']) ? drupal_implode_tags($context['keywords']) : '',
+  );
+  return $form;
+}
+
+/**
+ * Saves settings form for node_unpublish_by_keyword_action().
+ */
+function node_unpublish_by_keyword_action_submit($form, $form_state) {
+  return array('keywords' => drupal_explode_tags($form_state['values']['keywords']));
+}
+
+/**
+ * Unpublishes a node containing certain keywords.
+ *
+ * @param $node
+ *   A node object to modify.
+ * @param $context
+ *   Array with the following elements:
+ *   - 'keywords': Array of keywords. If any keyword is present in the rendered
+ *     node, the node's status flag is set to unpublished.
+ *
+ * @ingroup actions
+ */
+function node_unpublish_by_keyword_action($node, $context) {
+  foreach ($context['keywords'] as $keyword) {
+    $elements = node_view(clone $node);
+    if (strpos(drupal_render($elements), $keyword) !== FALSE || strpos($node->title, $keyword) !== FALSE) {
+      $node->status = NODE_NOT_PUBLISHED;
+      watchdog('action', 'Set @type %title to unpublished.', array('@type' => node_type_get_name($node), '%title' => $node->title));
+      break;
+    }
+  }
+}
+
+/**
+ * Implements hook_requirements().
+ */
+function node_requirements($phase) {
+  $requirements = array();
+  if ($phase === 'runtime') {
+    // Only show rebuild button if there are either 0, or 2 or more, rows
+    // in the {node_access} table, or if there are modules that
+    // implement hook_node_grants().
+    $grant_count = db_query('SELECT COUNT(*) FROM {node_access}')->fetchField();
+    if ($grant_count != 1 || count(module_implements('node_grants')) > 0) {
+      $value = format_plural($grant_count, 'One permission in use', '@count permissions in use', array('@count' => $grant_count));
+    }
+    else {
+      $value = t('Disabled');
+    }
+    $description = t('If the site is experiencing problems with permissions to content, you may have to rebuild the permissions cache. Rebuilding will remove all privileges to content and replace them with permissions based on the current modules and settings. Rebuilding may take some time if there is a lot of content or complex permission settings. After rebuilding has completed, content will automatically use the new permissions.');
+
+    $requirements['node_access'] = array(
+      'title' => t('Node Access Permissions'),
+      'value' => $value,
+      'description' => $description . ' ' . l(t('Rebuild permissions'), 'admin/reports/status/rebuild'),
+    );
+  }
+  return $requirements;
+}
+
+/**
+ * Implements hook_modules_enabled().
+ */
+function node_modules_enabled($modules) {
+  // Check if any of the newly enabled modules require the node_access table to
+  // be rebuilt.
+  if (!node_access_needs_rebuild() && array_intersect($modules, module_implements('node_grants'))) {
+    node_access_needs_rebuild(TRUE);
+  }
+}
+
+/**
+ * Controller class for nodes.
+ *
+ * This extends the DrupalDefaultEntityController class, adding required
+ * special handling for node objects.
+ */
+class NodeController extends DrupalDefaultEntityController {
+
+  protected function attachLoad(&$nodes, $revision_id = FALSE) {
+    // Create an array of nodes for each content type and pass this to the
+    // object type specific callback.
+    $typed_nodes = array();
+    foreach ($nodes as $id => $entity) {
+      $typed_nodes[$entity->type][$id] = $entity;
+    }
+
+    // Call object type specific callbacks on each typed array of nodes.
+    foreach ($typed_nodes as $node_type => $nodes_of_type) {
+      if (node_hook($node_type, 'load')) {
+        $function = node_type_get_base($node_type) . '_load';
+        $function($nodes_of_type);
+      }
+    }
+    // Besides the list of nodes, pass one additional argument to
+    // hook_node_load(), containing a list of node types that were loaded.
+    $argument = array_keys($typed_nodes);
+    $this->hookLoadArguments = array($argument);
+    parent::attachLoad($nodes, $revision_id);
+  }
+
+  protected function buildQuery($ids, $conditions = array(), $revision_id = FALSE) {
+    // Ensure that uid is taken from the {node} table,
+    // alias timestamp to revision_timestamp and add revision_uid.
+    $query = parent::buildQuery($ids, $conditions, $revision_id);
+    $fields =& $query->getFields();
+    unset($fields['timestamp']);
+    $query->addField('revision', 'timestamp', 'revision_timestamp');
+    $fields['uid']['table'] = 'base';
+    $query->addField('revision', 'uid', 'revision_uid');
+    return $query;
+  }
+}
+
+/**
+ * Implements hook_file_download_access().
+ */
+function node_file_download_access($field, $entity_type, $entity) {
+  if ($entity_type == 'node') {
+    return node_access('view', $entity);
+  }
+}
diff --git a/htmltest/modules/node/node.pages.inc b/htmltest/modules/node/node.pages.inc
new file mode 100644
index 00000000..62674636
--- /dev/null
+++ b/htmltest/modules/node/node.pages.inc
@@ -0,0 +1,678 @@
+<?php
+
+/**
+ * @file
+ * Page callbacks for adding, editing, deleting, and revisions management for content.
+ */
+
+/**
+ * Menu callback; presents the node editing form.
+ */
+function node_page_edit($node) {
+  $type_name = node_type_get_name($node);
+  drupal_set_title(t('<em>Edit @type</em> @title', array('@type' => $type_name, '@title' => $node->title)), PASS_THROUGH);
+  return drupal_get_form($node->type . '_node_form', $node);
+}
+
+/**
+ * Page callback: Displays add content links for available content types.
+ *
+ * Redirects to node/add/[type] if only one content type is available.
+ *
+ * @see node_menu()
+ */
+function node_add_page() {
+  $item = menu_get_item();
+  $content = system_admin_menu_block($item);
+  // Bypass the node/add listing if only one content type is available.
+  if (count($content) == 1) {
+    $item = array_shift($content);
+    drupal_goto($item['href']);
+  }
+  return theme('node_add_list', array('content' => $content));
+}
+
+/**
+ * Returns HTML for a list of available node types for node creation.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - content: An array of content types.
+ *
+ * @ingroup themeable
+ */
+function theme_node_add_list($variables) {
+  $content = $variables['content'];
+  $output = '';
+
+  if ($content) {
+    $output = '<dl class="node-type-list">';
+    foreach ($content as $item) {
+      $output .= '<dt>' . l($item['title'], $item['href'], $item['localized_options']) . '</dt>';
+      $output .= '<dd>' . filter_xss_admin($item['description']) . '</dd>';
+    }
+    $output .= '</dl>';
+  }
+  else {
+    $output = '<p>' . t('You have not created any content types yet. Go to the <a href="@create-content">content type creation page</a> to add a new content type.', array('@create-content' => url('admin/structure/types/add'))) . '</p>';
+  }
+  return $output;
+}
+
+
+/**
+ * Returns a node submission form.
+ *
+ * @param $type
+ *   The node type for the submitted node.
+ *
+ * @return
+ *   The themed form.
+ */
+function node_add($type) {
+  global $user;
+
+  $types = node_type_get_types();
+  $node = (object) array('uid' => $user->uid, 'name' => (isset($user->name) ? $user->name : ''), 'type' => $type, 'language' => LANGUAGE_NONE);
+  drupal_set_title(t('Create @name', array('@name' => $types[$type]->name)), PASS_THROUGH);
+  $output = drupal_get_form($type . '_node_form', $node);
+
+  return $output;
+}
+
+/**
+ * Form validation handler for node_form().
+ *
+ * @see node_form()
+ * @see node_form_submit()
+ */
+function node_form_validate($form, &$form_state) {
+  // $form_state['node'] contains the actual entity being edited, but we must
+  // not update it with form values that have not yet been validated, so we
+  // create a pseudo-entity to use during validation.
+  $node = (object) $form_state['values'];
+  node_validate($node, $form, $form_state);
+  entity_form_field_validate('node', $form, $form_state);
+}
+
+/**
+ * Form constructor for the node add/edit form.
+ *
+ * @see node_form_validate()
+ * @see node_form_submit()
+ * @see node_form_build_preview()
+ * @see node_form_delete_submit()
+ * @ingroup forms
+ */
+function node_form($form, &$form_state, $node) {
+  global $user;
+
+  // During initial form build, add the node entity to the form state for use
+  // during form building and processing. During a rebuild, use what is in the
+  // form state.
+  if (!isset($form_state['node'])) {
+    if (!isset($node->title)) {
+      $node->title = NULL;
+    }
+    node_object_prepare($node);
+    $form_state['node'] = $node;
+  }
+  else {
+    $node = $form_state['node'];
+  }
+
+  // Some special stuff when previewing a node.
+  if (isset($form_state['node_preview'])) {
+    $form['#prefix'] = $form_state['node_preview'];
+    $node->in_preview = TRUE;
+  }
+  else {
+    unset($node->in_preview);
+  }
+
+  // Identify this as a node edit form.
+  // @todo D8: Remove. Modules can implement hook_form_BASE_FORM_ID_alter() now.
+  $form['#node_edit_form'] = TRUE;
+
+  $form['#attributes']['class'][] = 'node-form';
+  if (!empty($node->type)) {
+    $form['#attributes']['class'][] = 'node-' . $node->type . '-form';
+  }
+
+  // Basic node information.
+  // These elements are just values so they are not even sent to the client.
+  foreach (array('nid', 'vid', 'uid', 'created', 'type', 'language') as $key) {
+    $form[$key] = array(
+      '#type' => 'value',
+      '#value' => isset($node->$key) ? $node->$key : NULL,
+    );
+  }
+
+  // Changed must be sent to the client, for later overwrite error checking.
+  $form['changed'] = array(
+    '#type' => 'hidden',
+    '#default_value' => isset($node->changed) ? $node->changed : NULL,
+  );
+  // Invoke hook_form() to get the node-specific bits. Can't use node_invoke(),
+  // because hook_form() needs to be able to receive $form_state by reference.
+  // @todo hook_form() implementations are unable to add #validate or #submit
+  //   handlers to the form buttons below. Remove hook_form() entirely.
+  $function = node_type_get_base($node) . '_form';
+  if (function_exists($function) && ($extra = $function($node, $form_state))) {
+    $form = array_merge_recursive($form, $extra);
+  }
+  // If the node type has a title, and the node type form defined no special
+  // weight for it, we default to a weight of -5 for consistency.
+  if (isset($form['title']) && !isset($form['title']['#weight'])) {
+    $form['title']['#weight'] = -5;
+  }
+  // @todo D8: Remove. Modules should access the node using $form_state['node'].
+  $form['#node'] = $node;
+
+  $form['additional_settings'] = array(
+    '#type' => 'vertical_tabs',
+    '#weight' => 99,
+  );
+
+  // Add a log field if the "Create new revision" option is checked, or if the
+  // current user has the ability to check that option.
+  $form['revision_information'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Revision information'),
+    '#collapsible' => TRUE,
+    // Collapsed by default when "Create new revision" is unchecked
+    '#collapsed' => !$node->revision,
+    '#group' => 'additional_settings',
+    '#attributes' => array(
+      'class' => array('node-form-revision-information'),
+    ),
+    '#attached' => array(
+      'js' => array(drupal_get_path('module', 'node') . '/node.js'),
+    ),
+    '#weight' => 20,
+    '#access' => $node->revision || user_access('administer nodes'),
+  );
+  $form['revision_information']['revision'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Create new revision'),
+    '#default_value' => $node->revision,
+    '#access' => user_access('administer nodes'),
+  );
+  // Check the revision log checkbox when the log textarea is filled in.
+  // This must not happen if "Create new revision" is enabled by default, since
+  // the state would auto-disable the checkbox otherwise.
+  if (!$node->revision) {
+    $form['revision_information']['revision']['#states'] = array(
+      'checked' => array(
+        'textarea[name="log"]' => array('empty' => FALSE),
+      ),
+    );
+  }
+  $form['revision_information']['log'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Revision log message'),
+    '#rows' => 4,
+    '#default_value' => !empty($node->log) ? $node->log : '',
+    '#description' => t('Provide an explanation of the changes you are making. This will help other authors understand your motivations.'),
+  );
+
+  // Node author information for administrators
+  $form['author'] = array(
+    '#type' => 'fieldset',
+    '#access' => user_access('administer nodes'),
+    '#title' => t('Authoring information'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#group' => 'additional_settings',
+    '#attributes' => array(
+      'class' => array('node-form-author'),
+    ),
+    '#attached' => array(
+      'js' => array(
+        drupal_get_path('module', 'node') . '/node.js',
+        array(
+          'type' => 'setting',
+          'data' => array('anonymous' => variable_get('anonymous', t('Anonymous'))),
+        ),
+      ),
+    ),
+    '#weight' => 90,
+  );
+  $form['author']['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Authored by'),
+    '#maxlength' => 60,
+    '#autocomplete_path' => 'user/autocomplete',
+    '#default_value' => !empty($node->name) ? $node->name : '',
+    '#weight' => -1,
+    '#description' => t('Leave blank for %anonymous.', array('%anonymous' => variable_get('anonymous', t('Anonymous')))),
+  );
+  $form['author']['date'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Authored on'),
+    '#maxlength' => 25,
+    '#description' => t('Format: %time. The date format is YYYY-MM-DD and %timezone is the time zone offset from UTC. Leave blank to use the time of form submission.', array('%time' => !empty($node->date) ? date_format(date_create($node->date), 'Y-m-d H:i:s O') : format_date($node->created, 'custom', 'Y-m-d H:i:s O'), '%timezone' => !empty($node->date) ? date_format(date_create($node->date), 'O') : format_date($node->created, 'custom', 'O'))),
+    '#default_value' => !empty($node->date) ? $node->date : '',
+  );
+
+  // Node options for administrators
+  $form['options'] = array(
+    '#type' => 'fieldset',
+    '#access' => user_access('administer nodes'),
+    '#title' => t('Publishing options'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#group' => 'additional_settings',
+    '#attributes' => array(
+      'class' => array('node-form-options'),
+    ),
+    '#attached' => array(
+      'js' => array(drupal_get_path('module', 'node') . '/node.js'),
+    ),
+    '#weight' => 95,
+  );
+  $form['options']['status'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Published'),
+    '#default_value' => $node->status,
+  );
+  $form['options']['promote'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Promoted to front page'),
+    '#default_value' => $node->promote,
+  );
+  $form['options']['sticky'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Sticky at top of lists'),
+    '#default_value' => $node->sticky,
+  );
+
+  // Add the buttons.
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#access' => variable_get('node_preview_' . $node->type, DRUPAL_OPTIONAL) != DRUPAL_REQUIRED || (!form_get_errors() && isset($form_state['node_preview'])),
+    '#value' => t('Save'),
+    '#weight' => 5,
+    '#submit' => array('node_form_submit'),
+  );
+  $form['actions']['preview'] = array(
+    '#access' => variable_get('node_preview_' . $node->type, DRUPAL_OPTIONAL) != DRUPAL_DISABLED,
+    '#type' => 'submit',
+    '#value' => t('Preview'),
+    '#weight' => 10,
+    '#submit' => array('node_form_build_preview'),
+  );
+  if (!empty($node->nid) && node_access('delete', $node)) {
+    $form['actions']['delete'] = array(
+      '#type' => 'submit',
+      '#value' => t('Delete'),
+      '#weight' => 15,
+      '#submit' => array('node_form_delete_submit'),
+    );
+  }
+  // This form uses a button-level #submit handler for the form's main submit
+  // action. node_form_submit() manually invokes all form-level #submit handlers
+  // of the form. Without explicitly setting #submit, Form API would auto-detect
+  // node_form_submit() as submit handler, but that is the button-level #submit
+  // handler for the 'Save' action. To maintain backwards compatibility, a
+  // #submit handler is auto-suggested for custom node type modules.
+  $form['#validate'][] = 'node_form_validate';
+  if (!isset($form['#submit']) && function_exists($node->type . '_node_form_submit')) {
+    $form['#submit'][] = $node->type . '_node_form_submit';
+  }
+  $form += array('#submit' => array());
+
+  field_attach_form('node', $node, $form, $form_state, entity_language('node', $node));
+  return $form;
+}
+
+/**
+ * Form submission handler for node_form().
+ *
+ * Handles the 'Delete' button on the node form.
+ *
+ * @see node_form()
+ * @see node_form_validate()
+ */
+function node_form_delete_submit($form, &$form_state) {
+  $destination = array();
+  if (isset($_GET['destination'])) {
+    $destination = drupal_get_destination();
+    unset($_GET['destination']);
+  }
+  $node = $form['#node'];
+  $form_state['redirect'] = array('node/' . $node->nid . '/delete', array('query' => $destination));
+}
+
+/**
+ * Form submission handler for node_form().
+ *
+ * Handles the 'Preview' button on the node form.
+ *
+ * @see node_form()
+ * @see node_form_validate()
+ */
+function node_form_build_preview($form, &$form_state) {
+  $node = node_form_submit_build_node($form, $form_state);
+  $form_state['node_preview'] = node_preview($node);
+  $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * Generates a node preview.
+ *
+ * @param $node
+ *   The node to preview.
+ *
+ * @return
+ *   An HTML-formatted string of a node preview.
+ *
+ * @see node_form_build_preview()
+ */
+function node_preview($node) {
+  if (node_access('create', $node) || node_access('update', $node)) {
+    _field_invoke_multiple('load', 'node', array($node->nid => $node));
+    // Load the user's name when needed.
+    if (isset($node->name)) {
+      // The use of isset() is mandatory in the context of user IDs, because
+      // user ID 0 denotes the anonymous user.
+      if ($user = user_load_by_name($node->name)) {
+        $node->uid = $user->uid;
+        $node->picture = $user->picture;
+      }
+      else {
+        $node->uid = 0; // anonymous user
+      }
+    }
+    elseif ($node->uid) {
+      $user = user_load($node->uid);
+      $node->name = $user->name;
+      $node->picture = $user->picture;
+    }
+
+    $node->changed = REQUEST_TIME;
+    $nodes = array($node->nid => $node);
+    field_attach_prepare_view('node', $nodes, 'full');
+
+    // Display a preview of the node.
+    if (!form_get_errors()) {
+      $node->in_preview = TRUE;
+      $output = theme('node_preview', array('node' => $node));
+      unset($node->in_preview);
+    }
+    drupal_set_title(t('Preview'), PASS_THROUGH);
+
+    return $output;
+  }
+}
+
+/**
+ * Returns HTML for a node preview for display during node creation and editing.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - node: The node object which is being previewed.
+ *
+ * @see node_preview()
+ * @ingroup themeable
+ */
+function theme_node_preview($variables) {
+  $node = $variables['node'];
+
+  $output = '<div class="preview">';
+
+  $preview_trimmed_version = FALSE;
+
+  $elements = node_view(clone $node, 'teaser');
+  $trimmed = drupal_render($elements);
+  $elements = node_view($node, 'full');
+  $full = drupal_render($elements);
+
+  // Do we need to preview trimmed version of post as well as full version?
+  if ($trimmed != $full) {
+    drupal_set_message(t('The trimmed version of your post shows what your post looks like when promoted to the main page or when exported for syndication.<span class="no-js"> You can insert the delimiter "&lt;!--break--&gt;" (without the quotes) to fine-tune where your post gets split.</span>'));
+    $output .= '<h3>' . t('Preview trimmed version') . '</h3>';
+    $output .= $trimmed;
+    $output .= '<h3>' . t('Preview full version') . '</h3>';
+    $output .= $full;
+  }
+  else {
+    $output .= $full;
+  }
+  $output .= "</div>\n";
+
+  return $output;
+}
+
+/**
+ * Form submission handler for node_form().
+ *
+ * @see node_form()
+ * @see node_form_validate()
+ */
+function node_form_submit($form, &$form_state) {
+  $node = node_form_submit_build_node($form, $form_state);
+  $insert = empty($node->nid);
+  node_save($node);
+  $node_link = l(t('view'), 'node/' . $node->nid);
+  $watchdog_args = array('@type' => $node->type, '%title' => $node->title);
+  $t_args = array('@type' => node_type_get_name($node), '%title' => $node->title);
+
+  if ($insert) {
+    watchdog('content', '@type: added %title.', $watchdog_args, WATCHDOG_NOTICE, $node_link);
+    drupal_set_message(t('@type %title has been created.', $t_args));
+  }
+  else {
+    watchdog('content', '@type: updated %title.', $watchdog_args, WATCHDOG_NOTICE, $node_link);
+    drupal_set_message(t('@type %title has been updated.', $t_args));
+  }
+  if ($node->nid) {
+    $form_state['values']['nid'] = $node->nid;
+    $form_state['nid'] = $node->nid;
+    $form_state['redirect'] = node_access('view', $node) ? 'node/' . $node->nid : '<front>';
+  }
+  else {
+    // In the unlikely case something went wrong on save, the node will be
+    // rebuilt and node form redisplayed the same way as in preview.
+    drupal_set_message(t('The post could not be saved.'), 'error');
+    $form_state['rebuild'] = TRUE;
+  }
+  // Clear the page and block caches.
+  cache_clear_all();
+}
+
+/**
+ * Updates the form state's node entity by processing this submission's values.
+ *
+ * This is the default builder function for the node form. It is called
+ * during the "Save" and "Preview" submit handlers to retrieve the entity to
+ * save or preview. This function can also be called by a "Next" button of a
+ * wizard to update the form state's entity with the current step's values
+ * before proceeding to the next step.
+ *
+ * @see node_form()
+ */
+function node_form_submit_build_node($form, &$form_state) {
+  // @todo Legacy support for modules that extend the node form with form-level
+  //   submit handlers that adjust $form_state['values'] prior to those values
+  //   being used to update the entity. Module authors are encouraged to instead
+  //   adjust the node directly within a hook_node_submit() implementation. For
+  //   Drupal 8, evaluate whether the pattern of triggering form-level submit
+  //   handlers during button-level submit processing is worth supporting
+  //   properly, and if so, add a Form API function for doing so.
+  unset($form_state['submit_handlers']);
+  form_execute_handlers('submit', $form, $form_state);
+
+  $node = $form_state['node'];
+  entity_form_submit_build_entity('node', $node, $form, $form_state);
+
+  node_submit($node);
+  foreach (module_implements('node_submit') as $module) {
+    $function = $module . '_node_submit';
+    $function($node, $form, $form_state);
+  }
+  return $node;
+}
+
+/**
+ * Form constructor for the node deletion confirmation form.
+ *
+ * @see node_delete_confirm_submit()
+ */
+function node_delete_confirm($form, &$form_state, $node) {
+  $form['#node'] = $node;
+  // Always provide entity id in the same form key as in the entity edit form.
+  $form['nid'] = array('#type' => 'value', '#value' => $node->nid);
+  return confirm_form($form,
+    t('Are you sure you want to delete %title?', array('%title' => $node->title)),
+    'node/' . $node->nid,
+    t('This action cannot be undone.'),
+    t('Delete'),
+    t('Cancel')
+  );
+}
+
+/**
+ * Executes node deletion.
+ *
+ * @see node_delete_confirm()
+ */
+function node_delete_confirm_submit($form, &$form_state) {
+  if ($form_state['values']['confirm']) {
+    $node = node_load($form_state['values']['nid']);
+    node_delete($form_state['values']['nid']);
+    cache_clear_all();
+    watchdog('content', '@type: deleted %title.', array('@type' => $node->type, '%title' => $node->title));
+    drupal_set_message(t('@type %title has been deleted.', array('@type' => node_type_get_name($node), '%title' => $node->title)));
+  }
+
+  $form_state['redirect'] = '<front>';
+}
+
+/**
+ * Generates an overview table of older revisions of a node.
+ *
+ * @param $node
+ *   A node object.
+ *
+ * @return array
+ *   An array as expected by drupal_render().
+ *
+ * @see node_menu()
+ */
+function node_revision_overview($node) {
+  drupal_set_title(t('Revisions for %title', array('%title' => $node->title)), PASS_THROUGH);
+
+  $header = array(t('Revision'), array('data' => t('Operations'), 'colspan' => 2));
+
+  $revisions = node_revision_list($node);
+
+  $rows = array();
+  $revert_permission = FALSE;
+  if ((user_access('revert revisions') || user_access('administer nodes')) && node_access('update', $node)) {
+    $revert_permission = TRUE;
+  }
+  $delete_permission = FALSE;
+  if ((user_access('delete revisions') || user_access('administer nodes')) && node_access('delete', $node)) {
+    $delete_permission = TRUE;
+  }
+  foreach ($revisions as $revision) {
+    $row = array();
+    $operations = array();
+
+    if ($revision->current_vid > 0) {
+      $row[] = array('data' => t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'short'), "node/$node->nid"), '!username' => theme('username', array('account' => $revision))))
+                               . (($revision->log != '') ? '<p class="revision-log">' . filter_xss($revision->log) . '</p>' : ''),
+                     'class' => array('revision-current'));
+      $operations[] = array('data' => drupal_placeholder(t('current revision')), 'class' => array('revision-current'), 'colspan' => 2);
+    }
+    else {
+      $row[] = t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'short'), "node/$node->nid/revisions/$revision->vid/view"), '!username' => theme('username', array('account' => $revision))))
+               . (($revision->log != '') ? '<p class="revision-log">' . filter_xss($revision->log) . '</p>' : '');
+      if ($revert_permission) {
+        $operations[] = l(t('revert'), "node/$node->nid/revisions/$revision->vid/revert");
+      }
+      if ($delete_permission) {
+        $operations[] = l(t('delete'), "node/$node->nid/revisions/$revision->vid/delete");
+      }
+    }
+    $rows[] = array_merge($row, $operations);
+  }
+
+  $build['node_revisions_table'] = array(
+    '#theme' => 'table',
+    '#rows' => $rows,
+    '#header' => $header,
+  );
+
+  return $build;
+}
+
+/**
+ * Asks for confirmation of the reversion to prevent against CSRF attacks.
+ *
+ * @param int $node_revision
+ *   The node revision ID.
+ *
+ * @return array
+ *   An array as expected by drupal_render().
+ *
+ * @see node_menu()
+ * @see node_revision_revert_confirm_submit()
+ * @ingroup forms
+ */
+function node_revision_revert_confirm($form, $form_state, $node_revision) {
+  $form['#node_revision'] = $node_revision;
+  return confirm_form($form, t('Are you sure you want to revert to the revision from %revision-date?', array('%revision-date' => format_date($node_revision->revision_timestamp))), 'node/' . $node_revision->nid . '/revisions', '', t('Revert'), t('Cancel'));
+}
+
+/**
+ * Form submission handler for node_revision_revert_confirm().
+ */
+function node_revision_revert_confirm_submit($form, &$form_state) {
+  $node_revision = $form['#node_revision'];
+  $node_revision->revision = 1;
+  $node_revision->log = t('Copy of the revision from %date.', array('%date' => format_date($node_revision->revision_timestamp)));
+
+  node_save($node_revision);
+
+  watchdog('content', '@type: reverted %title revision %revision.', array('@type' => $node_revision->type, '%title' => $node_revision->title, '%revision' => $node_revision->vid));
+  drupal_set_message(t('@type %title has been reverted back to the revision from %revision-date.', array('@type' => node_type_get_name($node_revision), '%title' => $node_revision->title, '%revision-date' => format_date($node_revision->revision_timestamp))));
+  $form_state['redirect'] = 'node/' . $node_revision->nid . '/revisions';
+}
+
+/**
+ * Form constructor for the revision deletion confirmation form.
+ *
+ * This form prevents against CSRF attacks.
+ *
+ * @param $node_revision
+ *   The node revision ID.
+ *
+ * @return
+ *   An array as expected by drupal_render().
+ *
+ * @see node_menu()
+ * @see node_revision_delete_confirm_submit()
+ * @ingroup forms
+ */
+function node_revision_delete_confirm($form, $form_state, $node_revision) {
+  $form['#node_revision'] = $node_revision;
+  return confirm_form($form, t('Are you sure you want to delete the revision from %revision-date?', array('%revision-date' => format_date($node_revision->revision_timestamp))), 'node/' . $node_revision->nid . '/revisions', t('This action cannot be undone.'), t('Delete'), t('Cancel'));
+}
+
+/**
+ * Form submission handler for node_revision_delete_confirm().
+ */
+function node_revision_delete_confirm_submit($form, &$form_state) {
+  $node_revision = $form['#node_revision'];
+  node_revision_delete($node_revision->vid);
+
+  watchdog('content', '@type: deleted %title revision %revision.', array('@type' => $node_revision->type, '%title' => $node_revision->title, '%revision' => $node_revision->vid));
+  drupal_set_message(t('Revision from %revision-date of @type %title has been deleted.', array('%revision-date' => format_date($node_revision->revision_timestamp), '@type' => node_type_get_name($node_revision), '%title' => $node_revision->title)));
+  $form_state['redirect'] = 'node/' . $node_revision->nid;
+  if (db_query('SELECT COUNT(vid) FROM {node_revision} WHERE nid = :nid', array(':nid' => $node_revision->nid))->fetchField() > 1) {
+    $form_state['redirect'] .= '/revisions';
+  }
+}
diff --git a/htmltest/modules/node/node.test b/htmltest/modules/node/node.test
new file mode 100644
index 00000000..bfe37175
--- /dev/null
+++ b/htmltest/modules/node/node.test
@@ -0,0 +1,2848 @@
+<?php
+
+/**
+ * @file
+ * Tests for node.module.
+ */
+
+/**
+ * Defines a base class for testing the Node module.
+ */
+class NodeWebTestCase extends DrupalWebTestCase {
+  function setUp() {
+    $modules = func_get_args();
+    if (isset($modules[0]) && is_array($modules[0])) {
+      $modules = $modules[0];
+    }
+    $modules[] = 'node';
+    parent::setUp($modules);
+
+    // Create Basic page and Article node types.
+    if ($this->profile != 'standard') {
+      $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page'));
+      $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article'));
+    }
+  }
+}
+
+/**
+ * Test the node_load_multiple() function.
+ */
+class NodeLoadMultipleTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Load multiple nodes',
+      'description' => 'Test the loading of multiple nodes.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $web_user = $this->drupalCreateUser(array('create article content', 'create page content'));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Create four nodes and ensure they're loaded correctly.
+   */
+  function testNodeMultipleLoad() {
+    $node1 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+    $node2 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+    $node3 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 0));
+    $node4 = $this->drupalCreateNode(array('type' => 'page', 'promote' => 0));
+
+    // Confirm that promoted nodes appear in the default node listing.
+    $this->drupalGet('node');
+    $this->assertText($node1->title, 'Node title appears on the default listing.');
+    $this->assertText($node2->title, 'Node title appears on the default listing.');
+    $this->assertNoText($node3->title, 'Node title does not appear in the default listing.');
+    $this->assertNoText($node4->title, 'Node title does not appear in the default listing.');
+
+    // Load nodes with only a condition. Nodes 3 and 4 will be loaded.
+    $nodes = node_load_multiple(NULL, array('promote' => 0));
+    $this->assertEqual($node3->title, $nodes[$node3->nid]->title, 'Node was loaded.');
+    $this->assertEqual($node4->title, $nodes[$node4->nid]->title, 'Node was loaded.');
+    $count = count($nodes);
+    $this->assertTrue($count == 2, format_string('@count nodes loaded.', array('@count' => $count)));
+
+    // Load nodes by nid. Nodes 1, 2 and 4 will be loaded.
+    $nodes = node_load_multiple(array(1, 2, 4));
+    $count = count($nodes);
+    $this->assertTrue(count($nodes) == 3, format_string('@count nodes loaded', array('@count' => $count)));
+    $this->assertTrue(isset($nodes[$node1->nid]), 'Node is correctly keyed in the array');
+    $this->assertTrue(isset($nodes[$node2->nid]), 'Node is correctly keyed in the array');
+    $this->assertTrue(isset($nodes[$node4->nid]), 'Node is correctly keyed in the array');
+    foreach ($nodes as $node) {
+      $this->assertTrue(is_object($node), 'Node is an object');
+    }
+
+    // Load nodes by nid, where type = article. Nodes 1, 2 and 3 will be loaded.
+    $nodes = node_load_multiple(array(1, 2, 3, 4), array('type' => 'article'));
+    $count = count($nodes);
+    $this->assertTrue($count == 3, format_string('@count nodes loaded', array('@count' => $count)));
+    $this->assertEqual($nodes[$node1->nid]->title, $node1->title, 'Node successfully loaded.');
+    $this->assertEqual($nodes[$node2->nid]->title, $node2->title, 'Node successfully loaded.');
+    $this->assertEqual($nodes[$node3->nid]->title, $node3->title, 'Node successfully loaded.');
+    $this->assertFalse(isset($nodes[$node4->nid]));
+
+    // Now that all nodes have been loaded into the static cache, ensure that
+    // they are loaded correctly again when a condition is passed.
+    $nodes = node_load_multiple(array(1, 2, 3, 4), array('type' => 'article'));
+    $count = count($nodes);
+    $this->assertTrue($count == 3, format_string('@count nodes loaded.', array('@count' => $count)));
+    $this->assertEqual($nodes[$node1->nid]->title, $node1->title, 'Node successfully loaded');
+    $this->assertEqual($nodes[$node2->nid]->title, $node2->title, 'Node successfully loaded');
+    $this->assertEqual($nodes[$node3->nid]->title, $node3->title, 'Node successfully loaded');
+    $this->assertFalse(isset($nodes[$node4->nid]), 'Node was not loaded');
+
+    // Load nodes by nid, where type = article and promote = 0.
+    $nodes = node_load_multiple(array(1, 2, 3, 4), array('type' => 'article', 'promote' => 0));
+    $count = count($nodes);
+    $this->assertTrue($count == 1, format_string('@count node loaded', array('@count' => $count)));
+    $this->assertEqual($nodes[$node3->nid]->title, $node3->title, 'Node successfully loaded.');
+  }
+}
+
+/**
+ * Tests for the hooks invoked during node_load().
+ */
+class NodeLoadHooksTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node load hooks',
+      'description' => 'Test the hooks invoked when a node is being loaded.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('node_test');
+  }
+
+  /**
+   * Test that hook_node_load() is invoked correctly.
+   */
+  function testHookNodeLoad() {
+    // Create some sample articles and pages.
+    $node1 = $this->drupalCreateNode(array('type' => 'article', 'status' => NODE_PUBLISHED));
+    $node2 = $this->drupalCreateNode(array('type' => 'article', 'status' => NODE_PUBLISHED));
+    $node3 = $this->drupalCreateNode(array('type' => 'article', 'status' => NODE_NOT_PUBLISHED));
+    $node4 = $this->drupalCreateNode(array('type' => 'page', 'status' => NODE_NOT_PUBLISHED));
+
+    // Check that when a set of nodes that only contains articles is loaded,
+    // the properties added to the node by node_test_load_node() correctly
+    // reflect the expected values.
+    $nodes = node_load_multiple(array(), array('status' => NODE_PUBLISHED));
+    $loaded_node = end($nodes);
+    $this->assertEqual($loaded_node->node_test_loaded_nids, array($node1->nid, $node2->nid), 'hook_node_load() received the correct list of node IDs the first time it was called.');
+    $this->assertEqual($loaded_node->node_test_loaded_types, array('article'), 'hook_node_load() received the correct list of node types the first time it was called.');
+
+    // Now, as part of the same page request, load a set of nodes that contain
+    // both articles and pages, and make sure the parameters passed to
+    // node_test_node_load() are correctly updated.
+    $nodes = node_load_multiple(array(), array('status' => NODE_NOT_PUBLISHED));
+    $loaded_node = end($nodes);
+    $this->assertEqual($loaded_node->node_test_loaded_nids, array($node3->nid, $node4->nid), 'hook_node_load() received the correct list of node IDs the second time it was called.');
+    $this->assertEqual($loaded_node->node_test_loaded_types, array('article', 'page'), 'hook_node_load() received the correct list of node types the second time it was called.');
+  }
+}
+
+/**
+ * Tests the node revision functionality.
+ */
+class NodeRevisionsTestCase extends DrupalWebTestCase {
+
+  /**
+   * Nodes used by the test.
+   *
+   * @var array
+   */
+  protected $nodes;
+
+  /**
+   * The revision messages for node revisions created in the test.
+   *
+   * @var array
+   */
+  protected $logs;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Node revisions',
+      'description' => 'Create a node with revisions and test viewing, saving, reverting, and deleting revisions.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Create and login user.
+    $web_user = $this->drupalCreateUser(array('view revisions', 'revert revisions', 'edit any page content',
+                                               'delete revisions', 'delete any page content'));
+    $this->drupalLogin($web_user);
+
+    // Create initial node.
+    $node = $this->drupalCreateNode();
+    $settings = get_object_vars($node);
+    $settings['revision'] = 1;
+
+    $nodes = array();
+    $logs = array();
+
+    // Get original node.
+    $nodes[] = $node;
+
+    // Create three revisions.
+    $revision_count = 3;
+    for ($i = 0; $i < $revision_count; $i++) {
+      $logs[] = $settings['log'] = $this->randomName(32);
+
+      // Create revision with random title and body and update variables.
+      $this->drupalCreateNode($settings);
+      $node = node_load($node->nid); // Make sure we get revision information.
+      $settings = get_object_vars($node);
+
+      $nodes[] = $node;
+    }
+
+    $this->nodes = $nodes;
+    $this->logs = $logs;
+  }
+
+  /**
+   * Checks node revision related operations.
+   */
+  function testRevisions() {
+    $nodes = $this->nodes;
+    $logs = $this->logs;
+
+    // Get last node for simple checks.
+    $node = $nodes[3];
+
+    // Confirm the correct revision text appears on "view revisions" page.
+    $this->drupalGet("node/$node->nid/revisions/$node->vid/view");
+    $this->assertText($node->body[LANGUAGE_NONE][0]['value'], 'Correct text displays for version.');
+
+    // Confirm the correct log message appears on "revisions overview" page.
+    $this->drupalGet("node/$node->nid/revisions");
+    foreach ($logs as $log) {
+      $this->assertText($log, 'Log message found.');
+    }
+
+    // Confirm that revisions revert properly.
+    $this->drupalPost("node/$node->nid/revisions/{$nodes[1]->vid}/revert", array(), t('Revert'));
+    $this->assertRaw(t('@type %title has been reverted back to the revision from %revision-date.',
+                        array('@type' => 'Basic page', '%title' => $nodes[1]->title,
+                              '%revision-date' => format_date($nodes[1]->revision_timestamp))), 'Revision reverted.');
+    $reverted_node = node_load($node->nid);
+    $this->assertTrue(($nodes[1]->body[LANGUAGE_NONE][0]['value'] == $reverted_node->body[LANGUAGE_NONE][0]['value']), 'Node reverted correctly.');
+
+    // Confirm revisions delete properly.
+    $this->drupalPost("node/$node->nid/revisions/{$nodes[1]->vid}/delete", array(), t('Delete'));
+    $this->assertRaw(t('Revision from %revision-date of @type %title has been deleted.',
+                        array('%revision-date' => format_date($nodes[1]->revision_timestamp),
+                              '@type' => 'Basic page', '%title' => $nodes[1]->title)), 'Revision deleted.');
+    $this->assertTrue(db_query('SELECT COUNT(vid) FROM {node_revision} WHERE nid = :nid and vid = :vid', array(':nid' => $node->nid, ':vid' => $nodes[1]->vid))->fetchField() == 0, 'Revision not found.');
+  }
+
+  /**
+   * Checks that revisions are correctly saved without log messages.
+   */
+  function testNodeRevisionWithoutLogMessage() {
+    // Create a node with an initial log message.
+    $log = $this->randomName(10);
+    $node = $this->drupalCreateNode(array('log' => $log));
+
+    // Save over the same revision and explicitly provide an empty log message
+    // (for example, to mimic the case of a node form submitted with no text in
+    // the "log message" field), and check that the original log message is
+    // preserved.
+    $new_title = $this->randomName(10) . 'testNodeRevisionWithoutLogMessage1';
+    $updated_node = (object) array(
+      'nid' => $node->nid,
+      'vid' => $node->vid,
+      'uid' => $node->uid,
+      'type' => $node->type,
+      'title' => $new_title,
+      'log' => '',
+    );
+    node_save($updated_node);
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($new_title, 'New node title appears on the page.');
+    $node_revision = node_load($node->nid, NULL, TRUE);
+    $this->assertEqual($node_revision->log, $log, 'After an existing node revision is re-saved without a log message, the original log message is preserved.');
+
+    // Create another node with an initial log message.
+    $node = $this->drupalCreateNode(array('log' => $log));
+
+    // Save a new node revision without providing a log message, and check that
+    // this revision has an empty log message.
+    $new_title = $this->randomName(10) . 'testNodeRevisionWithoutLogMessage2';
+    $updated_node = (object) array(
+      'nid' => $node->nid,
+      'vid' => $node->vid,
+      'uid' => $node->uid,
+      'type' => $node->type,
+      'title' => $new_title,
+      'revision' => 1,
+    );
+    node_save($updated_node);
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($new_title, 'New node title appears on the page.');
+    $node_revision = node_load($node->nid, NULL, TRUE);
+    $this->assertTrue(empty($node_revision->log), 'After a new node revision is saved with an empty log message, the log message for the node is empty.');
+  }
+}
+
+/**
+ * Tests the node edit functionality.
+ */
+class PageEditTestCase extends DrupalWebTestCase {
+
+  /**
+   * A user with permission to create and edit own page content.
+   *
+   * @var object
+   */
+  protected $web_user;
+
+  /**
+   * A user with permission to bypass node access and administer nodes.
+   *
+   * @var object
+   */
+  protected $admin_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Node edit',
+      'description' => 'Create a node and test node edit functionality.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    $this->web_user = $this->drupalCreateUser(array('edit own page content', 'create page content'));
+    $this->admin_user = $this->drupalCreateUser(array('bypass node access', 'administer nodes'));
+  }
+
+  /**
+   * Checks node edit functionality.
+   */
+  function testPageEdit() {
+    $this->drupalLogin($this->web_user);
+
+    $langcode = LANGUAGE_NONE;
+    $title_key = "title";
+    $body_key = "body[$langcode][0][value]";
+    // Create node to edit.
+    $edit = array();
+    $edit[$title_key] = $this->randomName(8);
+    $edit[$body_key] = $this->randomName(16);
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+
+    // Check that the node exists in the database.
+    $node = $this->drupalGetNodeByTitle($edit[$title_key]);
+    $this->assertTrue($node, 'Node found in database.');
+
+    // Check that "edit" link points to correct page.
+    $this->clickLink(t('Edit'));
+    $edit_url = url("node/$node->nid/edit", array('absolute' => TRUE));
+    $actual_url = $this->getURL();
+    $this->assertEqual($edit_url, $actual_url, 'On edit page.');
+
+    // Check that the title and body fields are displayed with the correct values.
+    $active = '<span class="element-invisible">' . t('(active tab)') . '</span>';
+    $link_text = t('!local-task-title!active', array('!local-task-title' => t('Edit'), '!active' => $active));
+    $this->assertText(strip_tags($link_text), 0, 'Edit tab found and marked active.');
+    $this->assertFieldByName($title_key, $edit[$title_key], 'Title field displayed.');
+    $this->assertFieldByName($body_key, $edit[$body_key], 'Body field displayed.');
+
+    // Edit the content of the node.
+    $edit = array();
+    $edit[$title_key] = $this->randomName(8);
+    $edit[$body_key] = $this->randomName(16);
+    // Stay on the current page, without reloading.
+    $this->drupalPost(NULL, $edit, t('Save'));
+
+    // Check that the title and body fields are displayed with the updated values.
+    $this->assertText($edit[$title_key], 'Title displayed.');
+    $this->assertText($edit[$body_key], 'Body displayed.');
+
+    // Login as a second administrator user.
+    $second_web_user = $this->drupalCreateUser(array('administer nodes', 'edit any page content'));
+    $this->drupalLogin($second_web_user);
+    // Edit the same node, creating a new revision.
+    $this->drupalGet("node/$node->nid/edit");
+    $edit = array();
+    $edit['title'] = $this->randomName(8);
+    $edit[$body_key] = $this->randomName(16);
+    $edit['revision'] = TRUE;
+    $this->drupalPost(NULL, $edit, t('Save'));
+
+    // Ensure that the node revision has been created.
+    $revised_node = $this->drupalGetNodeByTitle($edit['title']);
+    $this->assertNotIdentical($node->vid, $revised_node->vid, 'A new revision has been created.');
+    // Ensure that the node author is preserved when it was not changed in the
+    // edit form.
+    $this->assertIdentical($node->uid, $revised_node->uid, 'The node author has been preserved.');
+    // Ensure that the revision authors are different since the revisions were
+    // made by different users.
+    $first_node_version = node_load($node->nid, $node->vid);
+    $second_node_version = node_load($node->nid, $revised_node->vid);
+    $this->assertNotIdentical($first_node_version->revision_uid, $second_node_version->revision_uid, 'Each revision has a distinct user.');
+  }
+
+  /**
+   * Tests changing a node's "authored by" field.
+   */
+  function testPageAuthoredBy() {
+    $this->drupalLogin($this->admin_user);
+
+    // Create node to edit.
+    $langcode = LANGUAGE_NONE;
+    $body_key = "body[$langcode][0][value]";
+    $edit = array();
+    $edit['title'] = $this->randomName(8);
+    $edit[$body_key] = $this->randomName(16);
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+
+    // Check that the node was authored by the currently logged in user.
+    $node = $this->drupalGetNodeByTitle($edit['title']);
+    $this->assertIdentical($node->uid, $this->admin_user->uid, 'Node authored by admin user.');
+
+    // Try to change the 'authored by' field to an invalid user name.
+    $edit = array(
+      'name' => 'invalid-name',
+    );
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->assertText('The username invalid-name does not exist.');
+
+    // Change the authored by field to an empty string, which should assign
+    // authorship to the anonymous user (uid 0).
+    $edit['name'] = '';
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $node = node_load($node->nid, NULL, TRUE);
+    $this->assertIdentical($node->uid, '0', 'Node authored by anonymous user.');
+
+    // Change the authored by field to another user's name (that is not
+    // logged in).
+    $edit['name'] = $this->web_user->name;
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $node = node_load($node->nid, NULL, TRUE);
+    $this->assertIdentical($node->uid, $this->web_user->uid, 'Node authored by normal user.');
+
+    // Check that normal users cannot change the authored by information.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertNoFieldByName('name');
+  }
+}
+
+/**
+ * Tests the node entity preview functionality.
+ */
+class PagePreviewTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node preview',
+      'description' => 'Test node preview functionality.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    $web_user = $this->drupalCreateUser(array('edit own page content', 'create page content'));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Checks the node preview functionality.
+   */
+  function testPagePreview() {
+    $langcode = LANGUAGE_NONE;
+    $title_key = "title";
+    $body_key = "body[$langcode][0][value]";
+
+    // Fill in node creation form and preview node.
+    $edit = array();
+    $edit[$title_key] = $this->randomName(8);
+    $edit[$body_key] = $this->randomName(16);
+    $this->drupalPost('node/add/page', $edit, t('Preview'));
+
+    // Check that the preview is displaying the title and body.
+    $this->assertTitle(t('Preview | Drupal'), 'Basic page title is preview.');
+    $this->assertText($edit[$title_key], 'Title displayed.');
+    $this->assertText($edit[$body_key], 'Body displayed.');
+
+    // Check that the title and body fields are displayed with the correct values.
+    $this->assertFieldByName($title_key, $edit[$title_key], 'Title field displayed.');
+    $this->assertFieldByName($body_key, $edit[$body_key], 'Body field displayed.');
+  }
+
+  /**
+   * Checks the node preview functionality, when using revisions.
+   */
+  function testPagePreviewWithRevisions() {
+    $langcode = LANGUAGE_NONE;
+    $title_key = "title";
+    $body_key = "body[$langcode][0][value]";
+    // Force revision on "Basic page" content.
+    variable_set('node_options_page', array('status', 'revision'));
+
+    // Fill in node creation form and preview node.
+    $edit = array();
+    $edit[$title_key] = $this->randomName(8);
+    $edit[$body_key] = $this->randomName(16);
+    $edit['log'] = $this->randomName(32);
+    $this->drupalPost('node/add/page', $edit, t('Preview'));
+
+    // Check that the preview is displaying the title and body.
+    $this->assertTitle(t('Preview | Drupal'), 'Basic page title is preview.');
+    $this->assertText($edit[$title_key], 'Title displayed.');
+    $this->assertText($edit[$body_key], 'Body displayed.');
+
+    // Check that the title and body fields are displayed with the correct values.
+    $this->assertFieldByName($title_key, $edit[$title_key], 'Title field displayed.');
+    $this->assertFieldByName($body_key, $edit[$body_key], 'Body field displayed.');
+
+    // Check that the log field has the correct value.
+    $this->assertFieldByName('log', $edit['log'], 'Log field displayed.');
+  }
+}
+
+/**
+ * Tests creating and saving a node.
+ */
+class NodeCreationTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node creation',
+      'description' => 'Create a node and test saving it.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    // Enable dummy module that implements hook_node_insert for exceptions.
+    parent::setUp('node_test_exception');
+
+    $web_user = $this->drupalCreateUser(array('create page content', 'edit own page content'));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Creates a "Basic page" node and verifies its consistency in the database.
+   */
+  function testNodeCreation() {
+    // Create a node.
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = $this->randomName(8);
+    $edit["body[$langcode][0][value]"] = $this->randomName(16);
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+
+    // Check that the Basic page has been created.
+    $this->assertRaw(t('!post %title has been created.', array('!post' => 'Basic page', '%title' => $edit["title"])), 'Basic page created.');
+
+    // Check that the node exists in the database.
+    $node = $this->drupalGetNodeByTitle($edit["title"]);
+    $this->assertTrue($node, 'Node found in database.');
+  }
+
+  /**
+   * Verifies that a transaction rolls back the failed creation.
+   */
+  function testFailedPageCreation() {
+    // Create a node.
+    $edit = array(
+      'uid'      => $this->loggedInUser->uid,
+      'name'     => $this->loggedInUser->name,
+      'type'     => 'page',
+      'language' => LANGUAGE_NONE,
+      'title'    => 'testing_transaction_exception',
+    );
+
+    try {
+      node_save((object) $edit);
+      $this->fail(t('Expected exception has not been thrown.'));
+    }
+    catch (Exception $e) {
+      $this->pass(t('Expected exception has been thrown.'));
+    }
+
+    if (Database::getConnection()->supportsTransactions()) {
+      // Check that the node does not exist in the database.
+      $node = $this->drupalGetNodeByTitle($edit['title']);
+      $this->assertFalse($node, 'Transactions supported, and node not found in database.');
+    }
+    else {
+      // Check that the node exists in the database.
+      $node = $this->drupalGetNodeByTitle($edit['title']);
+      $this->assertTrue($node, 'Transactions not supported, and node found in database.');
+
+      // Check that the failed rollback was logged.
+      $records = db_query("SELECT wid FROM {watchdog} WHERE message LIKE 'Explicit rollback failed%'")->fetchAll();
+      $this->assertTrue(count($records) > 0, 'Transactions not supported, and rollback error logged to watchdog.');
+    }
+
+    // Check that the rollback error was logged.
+    $records = db_query("SELECT wid FROM {watchdog} WHERE variables LIKE '%Test exception for rollback.%'")->fetchAll();
+    $this->assertTrue(count($records) > 0, 'Rollback explanatory error logged to watchdog.');
+  }
+
+  /**
+   * Create an unpublished node and confirm correct redirect behavior.
+   */
+  function testUnpublishedNodeCreation() {
+    // Set "Basic page" content type to be unpublished by default.
+    variable_set('node_options_page', array());
+    // Set the front page to the default "node" page.
+    variable_set('site_frontpage', 'node');
+
+    // Create a node.
+    $edit = array();
+    $edit["title"] = $this->randomName(8);
+    $edit["body[" . LANGUAGE_NONE . "][0][value]"] = $this->randomName(16);
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+
+    // Check that the user was redirected to the home page.
+    $this->assertText(t('Welcome to Drupal'), t('The user is redirected to the home page.'));
+  }
+}
+
+/**
+ * Tests the functionality of node entity edit permissions.
+ */
+class PageViewTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node edit permissions',
+      'description' => 'Create a node and test edit permissions.',
+      'group' => 'Node',
+    );
+  }
+
+  /**
+   * Tests an anonymous and unpermissioned user attempting to edit the node.
+   */
+  function testPageView() {
+    // Create a node to view.
+    $node = $this->drupalCreateNode();
+    $this->assertTrue(node_load($node->nid), 'Node created.');
+
+    // Try to edit with anonymous user.
+    $html = $this->drupalGet("node/$node->nid/edit");
+    $this->assertResponse(403);
+
+    // Create a user without permission to edit node.
+    $web_user = $this->drupalCreateUser(array('access content'));
+    $this->drupalLogin($web_user);
+
+    // Attempt to access edit page.
+    $this->drupalGet("node/$node->nid/edit");
+    $this->assertResponse(403);
+
+    // Create user with permission to edit node.
+    $web_user = $this->drupalCreateUser(array('bypass node access'));
+    $this->drupalLogin($web_user);
+
+    // Attempt to access edit page.
+    $this->drupalGet("node/$node->nid/edit");
+    $this->assertResponse(200);
+  }
+}
+
+/**
+ * Tests the summary length functionality.
+ */
+class SummaryLengthTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Summary length',
+      'description' => 'Test summary length.',
+      'group' => 'Node',
+    );
+  }
+
+  /**
+   * Tests the node summary length functionality.
+   */
+  function testSummaryLength() {
+    // Create a node to view.
+    $settings = array(
+      'body' => array(LANGUAGE_NONE => array(array('value' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam vitae arcu at leo cursus laoreet. Curabitur dui tortor, adipiscing malesuada tempor in, bibendum ac diam. Cras non tellus a libero pellentesque condimentum. What is a Drupalism? Suspendisse ac lacus libero. Ut non est vel nisl faucibus interdum nec sed leo. Pellentesque sem risus, vulputate eu semper eget, auctor in libero. Ut fermentum est vitae metus convallis scelerisque. Phasellus pellentesque rhoncus tellus, eu dignissim purus posuere id. Quisque eu fringilla ligula. Morbi ullamcorper, lorem et mattis egestas, tortor neque pretium velit, eget eleifend odio turpis eu purus. Donec vitae metus quis leo pretium tincidunt a pulvinar sem. Morbi adipiscing laoreet mauris vel placerat. Nullam elementum, nisl sit amet scelerisque malesuada, dolor nunc hendrerit quam, eu ultrices erat est in orci. Curabitur feugiat egestas nisl sed accumsan.'))),
+      'promote' => 1,
+    );
+    $node = $this->drupalCreateNode($settings);
+    $this->assertTrue(node_load($node->nid), 'Node created.');
+
+    // Create user with permission to view the node.
+    $web_user = $this->drupalCreateUser(array('access content', 'administer content types'));
+    $this->drupalLogin($web_user);
+
+    // Attempt to access the front page.
+    $this->drupalGet("node");
+    // The node teaser when it has 600 characters in length
+    $expected = 'What is a Drupalism?';
+    $this->assertRaw($expected, 'Check that the summary is 600 characters in length', 'Node');
+
+    // Change the teaser length for "Basic page" content type.
+    $instance = field_info_instance('node', 'body', $node->type);
+    $instance['display']['teaser']['settings']['trim_length'] = 200;
+    field_update_instance($instance);
+
+    // Attempt to access the front page again and check if the summary is now only 200 characters in length.
+    $this->drupalGet("node");
+    $this->assertNoRaw($expected, 'Check that the summary is not longer than 200 characters', 'Node');
+  }
+}
+
+/**
+ * Tests XSS functionality with a node entity.
+ */
+class NodeTitleXSSTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node title XSS filtering',
+      'description' => 'Create a node with dangerous tags in its title and test that they are escaped.',
+      'group' => 'Node',
+    );
+  }
+
+  /**
+   * Tests XSS functionality with a node entity.
+   */
+  function testNodeTitleXSS() {
+    // Prepare a user to do the stuff.
+    $web_user = $this->drupalCreateUser(array('create page content', 'edit any page content'));
+    $this->drupalLogin($web_user);
+
+    $xss = '<script>alert("xss")</script>';
+    $title = $xss . $this->randomName();
+    $edit = array("title" => $title);
+
+    $this->drupalPost('node/add/page', $edit, t('Preview'));
+    $this->assertNoRaw($xss, 'Harmful tags are escaped when previewing a node.');
+
+    $settings = array('title' => $title);
+    $node = $this->drupalCreateNode($settings);
+
+    $this->drupalGet('node/' . $node->nid);
+    // assertTitle() decodes HTML-entities inside the <title> element.
+    $this->assertTitle($edit["title"] . ' | Drupal', 'Title is diplayed when viewing a node.');
+    $this->assertNoRaw($xss, 'Harmful tags are escaped when viewing a node.');
+
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertNoRaw($xss, 'Harmful tags are escaped when editing a node.');
+  }
+}
+
+/**
+ * Tests the availability of the syndicate block.
+ */
+class NodeBlockTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Block availability',
+      'description' => 'Check if the syndicate block is available.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Create and login user
+    $admin_user = $this->drupalCreateUser(array('administer blocks'));
+    $this->drupalLogin($admin_user);
+  }
+
+  /**
+   * Tests that the "Syndicate" block is shown when enabled.
+   */
+  function testSyndicateBlock() {
+    // Set block title to confirm that the interface is available.
+    $this->drupalPost('admin/structure/block/manage/node/syndicate/configure', array('title' => $this->randomName(8)), t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), 'Block configuration set.');
+
+    // Set the block to a region to confirm block is available.
+    $edit = array();
+    $edit['blocks[node_syndicate][region]'] = 'footer';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->assertText(t('The block settings have been updated.'), 'Block successfully move to footer region.');
+  }
+}
+
+/**
+ * Checks that the post information displays when enabled for a content type.
+ */
+class NodePostSettingsTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node post information display',
+      'description' => 'Check that the post information (submitted by Username on date) text displays appropriately.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    $web_user = $this->drupalCreateUser(array('create page content', 'administer content types', 'access user profiles'));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Confirms "Basic page" content type and post information is on a new node.
+   */
+  function testPagePostInfo() {
+
+    // Set "Basic page" content type to display post information.
+    $edit = array();
+    $edit['node_submitted'] = TRUE;
+    $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
+
+    // Create a node.
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = $this->randomName(8);
+    $edit["body[$langcode][0][value]"] = $this->randomName(16);
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+
+    // Check that the post information is displayed.
+    $node = $this->drupalGetNodeByTitle($edit["title"]);
+    $elements = $this->xpath('//div[contains(@class,:class)]', array(':class' => 'submitted'));
+    $this->assertEqual(count($elements), 1, 'Post information is displayed.');
+  }
+
+  /**
+   * Confirms absence of post information on a new node.
+   */
+  function testPageNotPostInfo() {
+
+    // Set "Basic page" content type to display post information.
+    $edit = array();
+    $edit['node_submitted'] = FALSE;
+    $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
+
+    // Create a node.
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = $this->randomName(8);
+    $edit["body[$langcode][0][value]"] = $this->randomName(16);
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+
+    // Check that the post information is displayed.
+    $node = $this->drupalGetNodeByTitle($edit["title"]);
+    $this->assertNoRaw('<span class="submitted">', 'Post information is not displayed.');
+  }
+}
+
+/**
+ * Ensures that data added to nodes by other modules appears in RSS feeds.
+ *
+ * Create a node, enable the node_test module to ensure that extra data is
+ * added to the node->content array, then verify that the data appears on the
+ * sitewide RSS feed at rss.xml.
+ */
+class NodeRSSContentTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node RSS Content',
+      'description' => 'Ensure that data added to nodes by other modules appears in RSS feeds.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    // Enable dummy module that implements hook_node_view.
+    parent::setUp('node_test');
+
+    // Use bypass node access permission here, because the test class uses
+    // hook_grants_alter() to deny access to everyone on node_access
+    // queries.
+    $user = $this->drupalCreateUser(array('bypass node access', 'access content', 'create article content'));
+    $this->drupalLogin($user);
+  }
+
+  /**
+   * Ensures that a new node includes the custom data when added to an RSS feed.
+   */
+  function testNodeRSSContent() {
+    // Create a node.
+    $node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+
+    $this->drupalGet('rss.xml');
+
+    // Check that content added in 'rss' view mode appear in RSS feed.
+    $rss_only_content = t('Extra data that should appear only in the RSS feed for node !nid.', array('!nid' => $node->nid));
+    $this->assertText($rss_only_content, 'Node content designated for RSS appear in RSS feed.');
+
+    // Check that content added in view modes other than 'rss' doesn't
+    // appear in RSS feed.
+    $non_rss_content = t('Extra data that should appear everywhere except the RSS feed for node !nid.', array('!nid' => $node->nid));
+    $this->assertNoText($non_rss_content, 'Node content not designed for RSS doesn\'t appear in RSS feed.');
+
+    // Check that extra RSS elements and namespaces are added to RSS feed.
+    $test_element = array(
+      'key' => 'testElement',
+      'value' => t('Value of testElement RSS element for node !nid.', array('!nid' => $node->nid)),
+    );
+    $test_ns = 'xmlns:drupaltest="http://example.com/test-namespace"';
+    $this->assertRaw(format_xml_elements(array($test_element)), 'Extra RSS elements appear in RSS feed.');
+    $this->assertRaw($test_ns, 'Extra namespaces appear in RSS feed.');
+
+    // Check that content added in 'rss' view mode doesn't appear when
+    // viewing node.
+    $this->drupalGet("node/$node->nid");
+    $this->assertNoText($rss_only_content, 'Node content designed for RSS doesn\'t appear when viewing node.');
+
+    // Check that the node feed page does not try to interpret additional path
+    // components as arguments for node_feed() and returns default content.
+    $this->drupalGet('rss.xml/' . $this->randomName() . '/' . $this->randomName());
+    $this->assertText($rss_only_content, 'Ignore page arguments when delivering rss.xml.');
+  }
+}
+
+/**
+ * Tests basic node_access functionality.
+ *
+ * Note that hook_node_access_records() is covered in another test class.
+ *
+ * @todo Cover hook_node_access in a separate test class.
+ */
+class NodeAccessTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node access',
+      'description' => 'Test node_access function',
+      'group' => 'Node',
+    );
+  }
+
+  /**
+   * Asserts node_access() correctly grants or denies access.
+   */
+  function assertNodeAccess($ops, $node, $account) {
+    foreach ($ops as $op => $result) {
+      $msg = format_string("node_access returns @result with operation '@op'.", array('@result' => $result ? 'true' : 'false', '@op' => $op));
+      $this->assertEqual($result, node_access($op, $node, $account), $msg);
+    }
+  }
+
+  function setUp() {
+    parent::setUp();
+    // Clear permissions for authenticated users.
+    db_delete('role_permission')
+      ->condition('rid', DRUPAL_AUTHENTICATED_RID)
+      ->execute();
+  }
+
+  /**
+   * Runs basic tests for node_access function.
+   */
+  function testNodeAccess() {
+    // Ensures user without 'access content' permission can do nothing.
+    $web_user1 = $this->drupalCreateUser(array('create page content', 'edit any page content', 'delete any page content'));
+    $node1 = $this->drupalCreateNode(array('type' => 'page'));
+    $this->assertNodeAccess(array('create' => FALSE), 'page', $web_user1);
+    $this->assertNodeAccess(array('view' => FALSE, 'update' => FALSE, 'delete' => FALSE), $node1, $web_user1);
+
+    // Ensures user with 'bypass node access' permission can do everything.
+    $web_user2 = $this->drupalCreateUser(array('bypass node access'));
+    $node2 = $this->drupalCreateNode(array('type' => 'page'));
+    $this->assertNodeAccess(array('create' => TRUE), 'page', $web_user2);
+    $this->assertNodeAccess(array('view' => TRUE, 'update' => TRUE, 'delete' => TRUE), $node2, $web_user2);
+
+    // User cannot 'view own unpublished content'.
+    $web_user3 = $this->drupalCreateUser(array('access content'));
+    $node3 = $this->drupalCreateNode(array('status' => 0, 'uid' => $web_user3->uid));
+    $this->assertNodeAccess(array('view' => FALSE), $node3, $web_user3);
+
+    // User cannot create content without permission.
+    $this->assertNodeAccess(array('create' => FALSE), 'page', $web_user3);
+
+    // User can 'view own unpublished content', but another user cannot.
+    $web_user4 = $this->drupalCreateUser(array('access content', 'view own unpublished content'));
+    $web_user5 = $this->drupalCreateUser(array('access content', 'view own unpublished content'));
+    $node4 = $this->drupalCreateNode(array('status' => 0, 'uid' => $web_user4->uid));
+    $this->assertNodeAccess(array('view' => TRUE, 'update' => FALSE), $node4, $web_user4);
+    $this->assertNodeAccess(array('view' => FALSE), $node4, $web_user5);
+
+    // Tests the default access provided for a published node.
+    $node5 = $this->drupalCreateNode();
+    $this->assertNodeAccess(array('view' => TRUE, 'update' => FALSE, 'delete' => FALSE), $node5, $web_user3);
+  }
+}
+
+/**
+ * Tests hook_node_access_records() functionality.
+ */
+class NodeAccessRecordsTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node access records',
+      'description' => 'Test hook_node_access_records when acquiring grants.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    // Enable dummy module that implements hook_node_grants(),
+    // hook_node_access_records(), hook_node_grants_alter() and
+    // hook_node_access_records_alter().
+    parent::setUp('node_test');
+  }
+
+  /**
+   * Creates a node and tests the creation of node access rules.
+   */
+  function testNodeAccessRecords() {
+    // Create an article node.
+    $node1 = $this->drupalCreateNode(array('type' => 'article'));
+    $this->assertTrue(node_load($node1->nid), 'Article node created.');
+
+    // Check to see if grants added by node_test_node_access_records made it in.
+    $records = db_query('SELECT realm, gid FROM {node_access} WHERE nid = :nid', array(':nid' => $node1->nid))->fetchAll();
+    $this->assertEqual(count($records), 1, 'Returned the correct number of rows.');
+    $this->assertEqual($records[0]->realm, 'test_article_realm', 'Grant with article_realm acquired for node without alteration.');
+    $this->assertEqual($records[0]->gid, 1, 'Grant with gid = 1 acquired for node without alteration.');
+
+    // Create an unpromoted "Basic page" node.
+    $node2 = $this->drupalCreateNode(array('type' => 'page', 'promote' => 0));
+    $this->assertTrue(node_load($node2->nid), 'Unpromoted basic page node created.');
+
+    // Check to see if grants added by node_test_node_access_records made it in.
+    $records = db_query('SELECT realm, gid FROM {node_access} WHERE nid = :nid', array(':nid' => $node2->nid))->fetchAll();
+    $this->assertEqual(count($records), 1, 'Returned the correct number of rows.');
+    $this->assertEqual($records[0]->realm, 'test_page_realm', 'Grant with page_realm acquired for node without alteration.');
+    $this->assertEqual($records[0]->gid, 1, 'Grant with gid = 1 acquired for node without alteration.');
+
+    // Create an unpromoted, unpublished "Basic page" node.
+    $node3 = $this->drupalCreateNode(array('type' => 'page', 'promote' => 0, 'status' => 0));
+    $this->assertTrue(node_load($node3->nid), 'Unpromoted, unpublished basic page node created.');
+
+    // Check to see if grants added by node_test_node_access_records made it in.
+    $records = db_query('SELECT realm, gid FROM {node_access} WHERE nid = :nid', array(':nid' => $node3->nid))->fetchAll();
+    $this->assertEqual(count($records), 1, 'Returned the correct number of rows.');
+    $this->assertEqual($records[0]->realm, 'test_page_realm', 'Grant with page_realm acquired for node without alteration.');
+    $this->assertEqual($records[0]->gid, 1, 'Grant with gid = 1 acquired for node without alteration.');
+
+    // Create a promoted "Basic page" node.
+    $node4 = $this->drupalCreateNode(array('type' => 'page', 'promote' => 1));
+    $this->assertTrue(node_load($node4->nid), 'Promoted basic page node created.');
+
+    // Check to see if grant added by node_test_node_access_records was altered
+    // by node_test_node_access_records_alter.
+    $records = db_query('SELECT realm, gid FROM {node_access} WHERE nid = :nid', array(':nid' => $node4->nid))->fetchAll();
+    $this->assertEqual(count($records), 1, 'Returned the correct number of rows.');
+    $this->assertEqual($records[0]->realm, 'test_alter_realm', 'Altered grant with alter_realm acquired for node.');
+    $this->assertEqual($records[0]->gid, 2, 'Altered grant with gid = 2 acquired for node.');
+
+    // Check to see if we can alter grants with hook_node_grants_alter().
+    $operations = array('view', 'update', 'delete');
+    // Create a user that is allowed to access content.
+    $web_user = $this->drupalCreateUser(array('access content'));
+    foreach ($operations as $op) {
+      $grants = node_test_node_grants($op, $web_user);
+      $altered_grants = $grants;
+      drupal_alter('node_grants', $altered_grants, $web_user, $op);
+      $this->assertNotEqual($grants, $altered_grants, format_string('Altered the %op grant for a user.', array('%op' => $op)));
+    }
+
+    // Check that core does not grant access to an unpublished node when an
+    // empty $grants array is returned.
+    $node6 = $this->drupalCreateNode(array('status' => 0, 'disable_node_access' => TRUE));
+    $records = db_query('SELECT realm, gid FROM {node_access} WHERE nid = :nid', array(':nid' => $node6->nid))->fetchAll();
+    $this->assertEqual(count($records), 0, 'Returned no records for unpublished node.');
+  }
+}
+
+/**
+ * Tests for Node Access with a non-node base table.
+ */
+class NodeAccessBaseTableTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Node Access on any table',
+      'description' => 'Checks behavior of the node access subsystem if the base table is not node.',
+      'group' => 'Node',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp('node_access_test');
+    node_access_rebuild();
+    variable_set('node_access_test_private', TRUE);
+  }
+
+  /**
+   * Tests the "private" node access functionality.
+   *
+   * - Create 2 users with "access content" and "create article" permissions.
+   * - Each user creates one private and one not private article.
+
+   * - Test that each user can view the other user's non-private article.
+   * - Test that each user cannot view the other user's private article.
+   * - Test that each user finds only appropriate (non-private + own private)
+   *   in taxonomy listing.
+   * - Create another user with 'view any private content'.
+   * - Test that user 4 can view all content created above.
+   * - Test that user 4 can view all content on taxonomy listing.
+   */
+  function testNodeAccessBasic() {
+    $num_simple_users = 2;
+    $simple_users = array();
+
+    // nodes keyed by uid and nid: $nodes[$uid][$nid] = $is_private;
+    $this->nodesByUser = array();
+    $titles = array(); // Titles keyed by nid
+    $private_nodes = array(); // Array of nids marked private.
+    for ($i = 0; $i < $num_simple_users; $i++) {
+      $simple_users[$i] = $this->drupalCreateUser(array('access content', 'create article content'));
+    }
+    foreach ($simple_users as $this->webUser) {
+      $this->drupalLogin($this->webUser);
+      foreach (array(0 => 'Public', 1 => 'Private') as $is_private => $type) {
+        $edit = array(
+          'title' => t('@private_public Article created by @user', array('@private_public' => $type, '@user' => $this->webUser->name)),
+        );
+        if ($is_private) {
+          $edit['private'] = TRUE;
+          $edit['body[und][0][value]'] = 'private node';
+          $edit['field_tags[und]'] = 'private';
+        }
+        else {
+          $edit['body[und][0][value]'] = 'public node';
+          $edit['field_tags[und]'] = 'public';
+        }
+
+        $this->drupalPost('node/add/article', $edit, t('Save'));
+        $nid = db_query('SELECT nid FROM {node} WHERE title = :title', array(':title' => $edit['title']))->fetchField();
+        $private_status = db_query('SELECT private FROM {node_access_test} where nid = :nid', array(':nid' => $nid))->fetchField();
+        $this->assertTrue($is_private == $private_status, 'The private status of the node was properly set in the node_access_test table.');
+        if ($is_private) {
+          $private_nodes[] = $nid;
+        }
+        $titles[$nid] = $edit['title'];
+        $this->nodesByUser[$this->webUser->uid][$nid] = $is_private;
+      }
+    }
+    $this->publicTid = db_query('SELECT tid FROM {taxonomy_term_data} WHERE name = :name', array(':name' => 'public'))->fetchField();
+    $this->privateTid = db_query('SELECT tid FROM {taxonomy_term_data} WHERE name = :name', array(':name' => 'private'))->fetchField();
+    $this->assertTrue($this->publicTid, 'Public tid was found');
+    $this->assertTrue($this->privateTid, 'Private tid was found');
+    foreach ($simple_users as $this->webUser) {
+      $this->drupalLogin($this->webUser);
+      // Check own nodes to see that all are readable.
+      foreach ($this->nodesByUser as $uid => $data) {
+        foreach ($data as $nid => $is_private) {
+          $this->drupalGet('node/' . $nid);
+          if ($is_private) {
+            $should_be_visible = $uid == $this->webUser->uid;
+          }
+          else {
+            $should_be_visible = TRUE;
+          }
+          $this->assertResponse($should_be_visible ? 200 : 403, strtr('A %private node by user %uid is %visible for user %current_uid.', array(
+            '%private' => $is_private ? 'private' : 'public',
+            '%uid' => $uid,
+            '%visible' => $should_be_visible ? 'visible' : 'not visible',
+            '%current_uid' => $this->webUser->uid,
+          )));
+        }
+      }
+
+      // Check to see that the correct nodes are shown on taxonomy/private
+      // and taxonomy/public.
+      $this->assertTaxonomyPage(FALSE);
+    }
+
+    // Now test that a user with 'access any private content' can view content.
+    $access_user = $this->drupalCreateUser(array('access content', 'create article content', 'node test view', 'search content'));
+    $this->drupalLogin($access_user);
+
+    foreach ($this->nodesByUser as $uid => $private_status) {
+      foreach ($private_status as $nid => $is_private) {
+        $this->drupalGet('node/' . $nid);
+        $this->assertResponse(200);
+      }
+    }
+
+    // This user should be able to see all of the nodes on the relevant
+    // taxonomy pages.
+    $this->assertTaxonomyPage(TRUE);
+  }
+
+  /**
+   * Checks taxonomy/term listings to ensure only accessible nodes are listed.
+   *
+   * @param $is_admin
+   *   A boolean indicating whether the current user is an administrator. If
+   *   TRUE, all nodes should be listed. If FALSE, only public nodes and the
+   *   user's own private nodes should be listed.
+   */
+  protected function assertTaxonomyPage($is_admin) {
+    foreach (array($this->publicTid, $this->privateTid) as $tid_is_private => $tid) {
+      $this->drupalGet("taxonomy/term/$tid");
+      $this->nids_visible = array();
+      foreach ($this->xpath("//a[text()='Read more']") as $link) {
+        $this->assertTrue(preg_match('|node/(\d+)$|', (string) $link['href'], $matches), 'Read more points to a node');
+        $this->nids_visible[$matches[1]] = TRUE;
+      }
+      foreach ($this->nodesByUser as $uid => $data) {
+        foreach ($data as $nid => $is_private) {
+          // Private nodes should be visible on the private term page,
+          // public nodes should be visible on the public term page.
+          $should_be_visible = $tid_is_private == $is_private;
+          // Non-administrators can only see their own nodes on the private
+          // term page.
+          if (!$is_admin && $tid_is_private) {
+            $should_be_visible = $should_be_visible && $uid == $this->webUser->uid;
+          }
+          $this->assertIdentical(isset($this->nids_visible[$nid]), $should_be_visible, strtr('A %private node by user %uid is %visible for user %current_uid on the %tid_is_private page.', array(
+            '%private' => $is_private ? 'private' : 'public',
+            '%uid' => $uid,
+            '%visible' => isset($this->nids_visible[$nid]) ? 'visible' : 'not visible',
+            '%current_uid' => $this->webUser->uid,
+            '%tid_is_private' => $tid_is_private ? 'private' : 'public',
+          )));
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Tests node save related functionality, including import-save.
+ */
+class NodeSaveTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Node save',
+      'description' => 'Test node_save() for saving content.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('node_test');
+    // Create a user that is allowed to post; we'll use this to test the submission.
+    $web_user = $this->drupalCreateUser(array('create article content'));
+    $this->drupalLogin($web_user);
+    $this->web_user = $web_user;
+  }
+
+  /**
+   * Checks whether custom node IDs are saved properly during an import operation.
+   *
+   * Workflow:
+   *  - first create a piece of content
+   *  - save the content
+   *  - check if node exists
+   */
+  function testImport() {
+    // Node ID must be a number that is not in the database.
+    $max_nid = db_query('SELECT MAX(nid) FROM {node}')->fetchField();
+    $test_nid = $max_nid + mt_rand(1000, 1000000);
+    $title = $this->randomName(8);
+    $node = array(
+      'title' => $title,
+      'body' => array(LANGUAGE_NONE => array(array('value' => $this->randomName(32)))),
+      'uid' => $this->web_user->uid,
+      'type' => 'article',
+      'nid' => $test_nid,
+      'is_new' => TRUE,
+    );
+    $node = node_submit((object) $node);
+
+    // Verify that node_submit did not overwrite the user ID.
+    $this->assertEqual($node->uid, $this->web_user->uid, 'Function node_submit() preserves user ID');
+
+    node_save($node);
+    // Test the import.
+    $node_by_nid = node_load($test_nid);
+    $this->assertTrue($node_by_nid, 'Node load by node ID.');
+
+    $node_by_title = $this->drupalGetNodeByTitle($title);
+    $this->assertTrue($node_by_title, 'Node load by node title.');
+  }
+
+  /**
+   * Verifies accuracy of the "created" and "changed" timestamp functionality.
+   */
+  function testTimestamps() {
+    // Use the default timestamps.
+    $edit = array(
+      'uid' => $this->web_user->uid,
+      'type' => 'article',
+      'title' => $this->randomName(8),
+    );
+
+    node_save((object) $edit);
+    $node = $this->drupalGetNodeByTitle($edit['title']);
+    $this->assertEqual($node->created, REQUEST_TIME, 'Creating a node sets default "created" timestamp.');
+    $this->assertEqual($node->changed, REQUEST_TIME, 'Creating a node sets default "changed" timestamp.');
+
+    // Store the timestamps.
+    $created = $node->created;
+    $changed = $node->changed;
+
+    node_save($node);
+    $node = $this->drupalGetNodeByTitle($edit['title'], TRUE);
+    $this->assertEqual($node->created, $created, 'Updating a node preserves "created" timestamp.');
+
+    // Programmatically set the timestamps using hook_node_presave.
+    $node->title = 'testing_node_presave';
+
+    node_save($node);
+    $node = $this->drupalGetNodeByTitle('testing_node_presave', TRUE);
+    $this->assertEqual($node->created, 280299600, 'Saving a node uses "created" timestamp set in presave hook.');
+    $this->assertEqual($node->changed, 979534800, 'Saving a node uses "changed" timestamp set in presave hook.');
+
+    // Programmatically set the timestamps on the node.
+    $edit = array(
+      'uid' => $this->web_user->uid,
+      'type' => 'article',
+      'title' => $this->randomName(8),
+      'created' => 280299600, // Sun, 19 Nov 1978 05:00:00 GMT
+      'changed' => 979534800, // Drupal 1.0 release.
+    );
+
+    node_save((object) $edit);
+    $node = $this->drupalGetNodeByTitle($edit['title']);
+    $this->assertEqual($node->created, 280299600, 'Creating a node uses user-set "created" timestamp.');
+    $this->assertNotEqual($node->changed, 979534800, 'Creating a node doesn\'t use user-set "changed" timestamp.');
+
+    // Update the timestamps.
+    $node->created = 979534800;
+    $node->changed = 280299600;
+
+    node_save($node);
+    $node = $this->drupalGetNodeByTitle($edit['title'], TRUE);
+    $this->assertEqual($node->created, 979534800, 'Updating a node uses user-set "created" timestamp.');
+    $this->assertNotEqual($node->changed, 280299600, 'Updating a node doesn\'t use user-set "changed" timestamp.');
+  }
+
+  /**
+   * Tests determing changes in hook_node_presave() and verifies the static node
+   * load cache is cleared upon save.
+   */
+  function testDeterminingChanges() {
+    // Initial creation.
+    $node = (object) array(
+      'uid' => $this->web_user->uid,
+      'type' => 'article',
+      'title' => 'test_changes',
+    );
+    node_save($node);
+
+    // Update the node without applying changes.
+    node_save($node);
+    $this->assertEqual($node->title, 'test_changes', 'No changes have been determined.');
+
+    // Apply changes.
+    $node->title = 'updated';
+    node_save($node);
+
+    // The hook implementations node_test_node_presave() and
+    // node_test_node_update() determine changes and change the title.
+    $this->assertEqual($node->title, 'updated_presave_update', 'Changes have been determined.');
+
+    // Test the static node load cache to be cleared.
+    $node = node_load($node->nid);
+    $this->assertEqual($node->title, 'updated_presave', 'Static cache has been cleared.');
+  }
+
+  /**
+   * Tests saving a node on node insert.
+   *
+   * This test ensures that a node has been fully saved when hook_node_insert()
+   * is invoked, so that the node can be saved again in a hook implementation
+   * without errors.
+   *
+   * @see node_test_node_insert()
+   */
+  function testNodeSaveOnInsert() {
+    // node_test_node_insert() tiggers a save on insert if the title equals
+    // 'new'.
+    $node = $this->drupalCreateNode(array('title' => 'new'));
+    $this->assertEqual($node->title, 'Node ' . $node->nid, 'Node saved on node insert.');
+  }
+}
+
+/**
+ * Tests related to node types.
+ */
+class NodeTypeTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node types',
+      'description' => 'Ensures that node type functions work correctly.',
+      'group' => 'Node',
+    );
+  }
+
+  /**
+   * Ensures that node type functions (node_type_get_*) work correctly.
+   *
+   * Load available node types and validate the returned data.
+   */
+  function testNodeTypeGetFunctions() {
+    $node_types = node_type_get_types();
+    $node_names = node_type_get_names();
+
+    $this->assertTrue(isset($node_types['article']), 'Node type article is available.');
+    $this->assertTrue(isset($node_types['page']), 'Node type basic page is available.');
+
+    $this->assertEqual($node_types['article']->name, $node_names['article'], 'Correct node type base has been returned.');
+
+    $this->assertEqual($node_types['article'], node_type_get_type('article'), 'Correct node type has been returned.');
+    $this->assertEqual($node_types['article']->name, node_type_get_name('article'), 'Correct node type name has been returned.');
+    $this->assertEqual($node_types['page']->base, node_type_get_base('page'), 'Correct node type base has been returned.');
+  }
+
+  /**
+   * Tests creating a content type programmatically and via a form.
+   */
+  function testNodeTypeCreation() {
+    // Create a content type programmaticaly.
+    $type = $this->drupalCreateContentType();
+
+    $type_exists = db_query('SELECT 1 FROM {node_type} WHERE type = :type', array(':type' => $type->type))->fetchField();
+    $this->assertTrue($type_exists, 'The new content type has been created in the database.');
+
+    // Login a test user.
+    $web_user = $this->drupalCreateUser(array('create ' . $type->name . ' content'));
+    $this->drupalLogin($web_user);
+
+    $this->drupalGet('node/add/' . str_replace('_', '-', $type->name));
+    $this->assertResponse(200, 'The new content type can be accessed at node/add.');
+
+    // Create a content type via the user interface.
+    $web_user = $this->drupalCreateUser(array('bypass node access', 'administer content types'));
+    $this->drupalLogin($web_user);
+    $edit = array(
+      'name' => 'foo',
+      'title_label' => 'title for foo',
+      'type' => 'foo',
+    );
+    $this->drupalPost('admin/structure/types/add', $edit, t('Save content type'));
+    $type_exists = db_query('SELECT 1 FROM {node_type} WHERE type = :type', array(':type' => 'foo'))->fetchField();
+    $this->assertTrue($type_exists, 'The new content type has been created in the database.');
+  }
+
+  /**
+   * Tests editing a node type using the UI.
+   */
+  function testNodeTypeEditing() {
+    $web_user = $this->drupalCreateUser(array('bypass node access', 'administer content types'));
+    $this->drupalLogin($web_user);
+
+    $instance = field_info_instance('node', 'body', 'page');
+    $this->assertEqual($instance['label'], 'Body', 'Body field was found.');
+
+    // Verify that title and body fields are displayed.
+    $this->drupalGet('node/add/page');
+    $this->assertRaw('Title', 'Title field was found.');
+    $this->assertRaw('Body', 'Body field was found.');
+
+    // Rename the title field.
+    $edit = array(
+      'title_label' => 'Foo',
+    );
+    $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
+    // Refresh the field information for the rest of the test.
+    field_info_cache_clear();
+
+    $this->drupalGet('node/add/page');
+    $this->assertRaw('Foo', 'New title label was displayed.');
+    $this->assertNoRaw('Title', 'Old title label was not displayed.');
+
+    // Change the name, machine name and description.
+    $edit = array(
+      'name' => 'Bar',
+      'type' => 'bar',
+      'description' => 'Lorem ipsum.',
+    );
+    $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
+    field_info_cache_clear();
+
+    $this->drupalGet('node/add');
+    $this->assertRaw('Bar', 'New name was displayed.');
+    $this->assertRaw('Lorem ipsum', 'New description was displayed.');
+    $this->clickLink('Bar');
+    $this->assertEqual(url('node/add/bar', array('absolute' => TRUE)), $this->getUrl(), 'New machine name was used in URL.');
+    $this->assertRaw('Foo', 'Title field was found.');
+    $this->assertRaw('Body', 'Body field was found.');
+
+    // Remove the body field.
+    $this->drupalPost('admin/structure/types/manage/bar/fields/body/delete', NULL, t('Delete'));
+    // Resave the settings for this type.
+    $this->drupalPost('admin/structure/types/manage/bar', array(), t('Save content type'));
+    // Check that the body field doesn't exist.
+    $this->drupalGet('node/add/bar');
+    $this->assertNoRaw('Body', 'Body field was not found.');
+  }
+
+  /**
+   * Tests that node_types_rebuild() correctly handles the 'disabled' flag.
+   */
+  function testNodeTypeStatus() {
+    // Enable all core node modules, and all types should be active.
+    module_enable(array('blog', 'book', 'poll'), FALSE);
+    node_types_rebuild();
+    $types = node_type_get_types();
+    foreach (array('blog', 'book', 'poll', 'article', 'page') as $type) {
+      $this->assertTrue(isset($types[$type]), format_string('%type is found in node types.', array('%type' => $type)));
+      $this->assertTrue(isset($types[$type]->disabled) && empty($types[$type]->disabled), format_string('%type type is enabled.', array('%type' => $type)));
+    }
+
+    // Disable poll module and the respective type should be marked as disabled.
+    module_disable(array('poll'), FALSE);
+    node_types_rebuild();
+    $types = node_type_get_types();
+    $this->assertTrue(!empty($types['poll']->disabled), "Poll module's node type disabled.");
+    $this->assertTrue(isset($types['blog']) && empty($types['blog']->disabled), "Blog module's node type still active.");
+
+    // Disable blog module and the respective type should be marked as disabled.
+    module_disable(array('blog'), FALSE);
+    node_types_rebuild();
+    $types = node_type_get_types();
+    $this->assertTrue(!empty($types['blog']->disabled), "Blog module's node type disabled.");
+    $this->assertTrue(!empty($types['poll']->disabled), "Poll module's node type still disabled.");
+
+    // Disable book module and the respective type should still be active, since
+    // it is not provided by hook_node_info().
+    module_disable(array('book'), FALSE);
+    node_types_rebuild();
+    $types = node_type_get_types();
+    $this->assertTrue(isset($types['book']) && empty($types['book']->disabled), "Book module's node type still active.");
+    $this->assertTrue(!empty($types['blog']->disabled), "Blog module's node type still disabled.");
+    $this->assertTrue(!empty($types['poll']->disabled), "Poll module's node type still disabled.");
+    $this->assertTrue(isset($types['article']) && empty($types['article']->disabled), "Article node type still active.");
+    $this->assertTrue(isset($types['page']) && empty($types['page']->disabled), "Basic page node type still active.");
+
+    // Re-enable the modules and verify that the types are active again.
+    module_enable(array('blog', 'book', 'poll'), FALSE);
+    node_types_rebuild();
+    $types = node_type_get_types();
+    foreach (array('blog', 'book', 'poll', 'article', 'page') as $type) {
+      $this->assertTrue(isset($types[$type]), format_string('%type is found in node types.', array('%type' => $type)));
+      $this->assertTrue(isset($types[$type]->disabled) && empty($types[$type]->disabled), format_string('%type type is enabled.', array('%type' => $type)));
+    }
+  }
+}
+
+/**
+ * Test node type customizations persistence.
+ */
+class NodeTypePersistenceTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node type persist',
+      'description' => 'Ensures that node type customization survives module enabling and disabling.',
+      'group' => 'Node',
+    );
+  }
+
+  /**
+   * Tests that node type customizations persist through disable and uninstall.
+   */
+  function testNodeTypeCustomizationPersistence() {
+    $web_user = $this->drupalCreateUser(array('bypass node access', 'administer content types', 'administer modules'));
+    $this->drupalLogin($web_user);
+    $poll_key = 'modules[Core][poll][enable]';
+    $poll_enable = array($poll_key => "1");
+    $poll_disable = array($poll_key => FALSE);
+
+    // Enable poll and verify that the node type is in the DB and is not
+    // disabled.
+    $this->drupalPost('admin/modules', $poll_enable, t('Save configuration'));
+    $disabled = db_query('SELECT disabled FROM {node_type} WHERE type = :type', array(':type' => 'poll'))->fetchField();
+    $this->assertNotIdentical($disabled, FALSE, 'Poll node type found in the database');
+    $this->assertEqual($disabled, 0, 'Poll node type is not disabled');
+
+    // Check that poll node type (uncustomized) shows up.
+    $this->drupalGet('node/add');
+    $this->assertText('poll', 'poll type is found on node/add');
+
+    // Customize poll description.
+    $description = $this->randomName();
+    $edit = array('description' => $description);
+    $this->drupalPost('admin/structure/types/manage/poll', $edit, t('Save content type'));
+
+    // Check that poll node type customization shows up.
+    $this->drupalGet('node/add');
+    $this->assertText($description, 'Customized description found');
+
+    // Disable poll and check that the node type gets disabled.
+    $this->drupalPost('admin/modules', $poll_disable, t('Save configuration'));
+    $disabled = db_query('SELECT disabled FROM {node_type} WHERE type = :type', array(':type' => 'poll'))->fetchField();
+    $this->assertEqual($disabled, 1, 'Poll node type is disabled');
+    $this->drupalGet('node/add');
+    $this->assertNoText('poll', 'poll type is not found on node/add');
+
+    // Reenable poll and check that the customization survived the module
+    // disable.
+    $this->drupalPost('admin/modules', $poll_enable, t('Save configuration'));
+    $disabled = db_query('SELECT disabled FROM {node_type} WHERE type = :type', array(':type' => 'poll'))->fetchField();
+    $this->assertNotIdentical($disabled, FALSE, 'Poll node type found in the database');
+    $this->assertEqual($disabled, 0, 'Poll node type is not disabled');
+    $this->drupalGet('node/add');
+    $this->assertText($description, 'Customized description found');
+
+    // Disable and uninstall poll.
+    $this->drupalPost('admin/modules', $poll_disable, t('Save configuration'));
+    $edit = array('uninstall[poll]' => 'poll');
+    $this->drupalPost('admin/modules/uninstall', $edit, t('Uninstall'));
+    $this->drupalPost(NULL, array(), t('Uninstall'));
+    $disabled = db_query('SELECT disabled FROM {node_type} WHERE type = :type', array(':type' => 'poll'))->fetchField();
+    $this->assertTrue($disabled, 'Poll node type is in the database and is disabled');
+    $this->drupalGet('node/add');
+    $this->assertNoText('poll', 'poll type is no longer found on node/add');
+
+    // Reenable poll and check that the customization survived the module
+    // uninstall.
+    $this->drupalPost('admin/modules', $poll_enable, t('Save configuration'));
+    $this->drupalGet('node/add');
+    $this->assertText($description, 'Customized description is found even after uninstall and reenable.');
+  }
+}
+
+/**
+ * Verifies the rebuild functionality for the node_access table.
+ */
+class NodeAccessRebuildTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node access rebuild',
+      'description' => 'Ensures that node access rebuild functions work correctly.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    $web_user = $this->drupalCreateUser(array('administer site configuration', 'access administration pages', 'access site reports'));
+    $this->drupalLogin($web_user);
+    $this->web_user = $web_user;
+  }
+
+  /**
+   * Tests rebuilding the node access permissions table.
+   */
+  function testNodeAccessRebuild() {
+    $this->drupalGet('admin/reports/status');
+    $this->clickLink(t('Rebuild permissions'));
+    $this->drupalPost(NULL, array(), t('Rebuild permissions'));
+    $this->assertText(t('Content permissions have been rebuilt.'));
+  }
+}
+
+/**
+ * Tests node administration page functionality.
+ */
+class NodeAdminTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node administration',
+      'description' => 'Test node administration page functionality.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Remove the "view own unpublished content" permission which is set
+    // by default for authenticated users so we can test this permission
+    // correctly.
+    user_role_revoke_permissions(DRUPAL_AUTHENTICATED_RID, array('view own unpublished content'));
+
+    $this->admin_user = $this->drupalCreateUser(array('access administration pages', 'access content overview', 'administer nodes', 'bypass node access'));
+    $this->base_user_1 = $this->drupalCreateUser(array('access content overview'));
+    $this->base_user_2 = $this->drupalCreateUser(array('access content overview', 'view own unpublished content'));
+    $this->base_user_3 = $this->drupalCreateUser(array('access content overview', 'bypass node access'));
+  }
+
+  /**
+   * Tests that the table sorting works on the content admin pages.
+   */
+  function testContentAdminSort() {
+    $this->drupalLogin($this->admin_user);
+    foreach (array('dd', 'aa', 'DD', 'bb', 'cc', 'CC', 'AA', 'BB') as $prefix) {
+      $this->drupalCreateNode(array('title' => $prefix . $this->randomName(6)));
+    }
+
+    // Test that the default sort by node.changed DESC actually fires properly.
+    $nodes_query = db_select('node', 'n')
+      ->fields('n', array('nid'))
+      ->orderBy('changed', 'DESC')
+      ->execute()
+      ->fetchCol();
+
+    $nodes_form = array();
+    $this->drupalGet('admin/content');
+    foreach ($this->xpath('//table/tbody/tr/td/div/input/@value') as $input) {
+      $nodes_form[] = $input;
+    }
+    $this->assertEqual($nodes_query, $nodes_form, 'Nodes are sorted in the form according to the default query.');
+
+    // Compare the rendered HTML node list to a query for the nodes ordered by
+    // title to account for possible database-dependent sort order.
+    $nodes_query = db_select('node', 'n')
+      ->fields('n', array('nid'))
+      ->orderBy('title')
+      ->execute()
+      ->fetchCol();
+
+    $nodes_form = array();
+    $this->drupalGet('admin/content', array('query' => array('sort' => 'asc', 'order' => 'Title')));
+    foreach ($this->xpath('//table/tbody/tr/td/div/input/@value') as $input) {
+      $nodes_form[] = $input;
+    }
+    $this->assertEqual($nodes_query, $nodes_form, 'Nodes are sorted in the form the same as they are in the query.');
+  }
+
+  /**
+   * Tests content overview with different user permissions.
+   *
+   * Taxonomy filters are tested separately.
+   *
+   * @see TaxonomyNodeFilterTestCase
+   */
+  function testContentAdminPages() {
+    $this->drupalLogin($this->admin_user);
+
+    $nodes['published_page'] = $this->drupalCreateNode(array('type' => 'page'));
+    $nodes['published_article'] = $this->drupalCreateNode(array('type' => 'article'));
+    $nodes['unpublished_page_1'] = $this->drupalCreateNode(array('type' => 'page', 'uid' => $this->base_user_1->uid, 'status' => 0));
+    $nodes['unpublished_page_2'] = $this->drupalCreateNode(array('type' => 'page', 'uid' => $this->base_user_2->uid, 'status' => 0));
+
+    // Verify view, edit, and delete links for any content.
+    $this->drupalGet('admin/content');
+    $this->assertResponse(200);
+    foreach ($nodes as $node) {
+      $this->assertLinkByHref('node/' . $node->nid);
+      $this->assertLinkByHref('node/' . $node->nid . '/edit');
+      $this->assertLinkByHref('node/' . $node->nid . '/delete');
+      // Verify tableselect.
+      $this->assertFieldByName('nodes[' . $node->nid . ']', '', 'Tableselect found.');
+    }
+
+    // Verify filtering by publishing status.
+    $edit = array(
+      'status' => 'status-1',
+    );
+    $this->drupalPost(NULL, $edit, t('Filter'));
+
+    $this->assertRaw(t('where %property is %value', array('%property' => t('status'), '%value' => 'published')), 'Content list is filtered by status.');
+
+    $this->assertLinkByHref('node/' . $nodes['published_page']->nid . '/edit');
+    $this->assertLinkByHref('node/' . $nodes['published_article']->nid . '/edit');
+    $this->assertNoLinkByHref('node/' . $nodes['unpublished_page_1']->nid . '/edit');
+
+    // Verify filtering by status and content type.
+    $edit = array(
+      'type' => 'page',
+    );
+    $this->drupalPost(NULL, $edit, t('Refine'));
+
+    $this->assertRaw(t('where %property is %value', array('%property' => t('status'), '%value' => 'published')), 'Content list is filtered by status.');
+    $this->assertRaw(t('and where %property is %value', array('%property' => t('type'), '%value' => 'Basic page')), 'Content list is filtered by content type.');
+
+    $this->assertLinkByHref('node/' . $nodes['published_page']->nid . '/edit');
+    $this->assertNoLinkByHref('node/' . $nodes['published_article']->nid . '/edit');
+
+    // Verify no operation links are displayed for regular users.
+    $this->drupalLogout();
+    $this->drupalLogin($this->base_user_1);
+    $this->drupalGet('admin/content');
+    $this->assertResponse(200);
+    $this->assertLinkByHref('node/' . $nodes['published_page']->nid);
+    $this->assertLinkByHref('node/' . $nodes['published_article']->nid);
+    $this->assertNoLinkByHref('node/' . $nodes['published_page']->nid . '/edit');
+    $this->assertNoLinkByHref('node/' . $nodes['published_page']->nid . '/delete');
+    $this->assertNoLinkByHref('node/' . $nodes['published_article']->nid . '/edit');
+    $this->assertNoLinkByHref('node/' . $nodes['published_article']->nid . '/delete');
+
+    // Verify no unpublished content is displayed without permission.
+    $this->assertNoLinkByHref('node/' . $nodes['unpublished_page_1']->nid);
+    $this->assertNoLinkByHref('node/' . $nodes['unpublished_page_1']->nid . '/edit');
+    $this->assertNoLinkByHref('node/' . $nodes['unpublished_page_1']->nid . '/delete');
+
+    // Verify no tableselect.
+    $this->assertNoFieldByName('nodes[' . $nodes['published_page']->nid . ']', '', 'No tableselect found.');
+
+    // Verify unpublished content is displayed with permission.
+    $this->drupalLogout();
+    $this->drupalLogin($this->base_user_2);
+    $this->drupalGet('admin/content');
+    $this->assertResponse(200);
+    $this->assertLinkByHref('node/' . $nodes['unpublished_page_2']->nid);
+    // Verify no operation links are displayed.
+    $this->assertNoLinkByHref('node/' . $nodes['unpublished_page_2']->nid . '/edit');
+    $this->assertNoLinkByHref('node/' . $nodes['unpublished_page_2']->nid . '/delete');
+
+    // Verify user cannot see unpublished content of other users.
+    $this->assertNoLinkByHref('node/' . $nodes['unpublished_page_1']->nid);
+    $this->assertNoLinkByHref('node/' . $nodes['unpublished_page_1']->nid . '/edit');
+    $this->assertNoLinkByHref('node/' . $nodes['unpublished_page_1']->nid . '/delete');
+
+    // Verify no tableselect.
+    $this->assertNoFieldByName('nodes[' . $nodes['unpublished_page_2']->nid . ']', '', 'No tableselect found.');
+
+    // Verify node access can be bypassed.
+    $this->drupalLogout();
+    $this->drupalLogin($this->base_user_3);
+    $this->drupalGet('admin/content');
+    $this->assertResponse(200);
+    foreach ($nodes as $node) {
+      $this->assertLinkByHref('node/' . $node->nid);
+      $this->assertLinkByHref('node/' . $node->nid . '/edit');
+      $this->assertLinkByHref('node/' . $node->nid . '/delete');
+    }
+  }
+}
+
+/**
+ * Tests node title functionality.
+ */
+class NodeTitleTestCase extends DrupalWebTestCase {
+
+  /**
+   * A user with permission to create and edit content and to administer nodes.
+   *
+   * @var object
+   */
+  protected $admin_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Node title',
+      'description' => 'Test node title.',
+      'group' => 'Node'
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $this->admin_user = $this->drupalCreateUser(array('administer nodes', 'create article content', 'create page content'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   *  Creates one node and tests if the node title has the correct value.
+   */
+  function testNodeTitle() {
+    // Create "Basic page" content with title.
+    // Add the node to the frontpage so we can test if teaser links are clickable.
+    $settings = array(
+      'title' => $this->randomName(8),
+      'promote' => 1,
+    );
+    $node = $this->drupalCreateNode($settings);
+
+    // Test <title> tag.
+    $this->drupalGet("node/$node->nid");
+    $xpath = '//title';
+    $this->assertEqual(current($this->xpath($xpath)), $node->title .' | Drupal', 'Page title is equal to node title.', 'Node');
+
+    // Test breadcrumb in comment preview.
+    $this->drupalGet("comment/reply/$node->nid");
+    $xpath = '//div[@class="breadcrumb"]/a[last()]';
+    $this->assertEqual(current($this->xpath($xpath)), $node->title, 'Node breadcrumb is equal to node title.', 'Node');
+
+    // Test node title in comment preview.
+    $this->assertEqual(current($this->xpath('//div[@id=:id]/h2/a', array(':id' => 'node-' . $node->nid))), $node->title, 'Node preview title is equal to node title.', 'Node');
+
+    // Test node title is clickable on teaser list (/node).
+    $this->drupalGet('node');
+    $this->clickLink($node->title);
+  }
+}
+
+/**
+ * Test the node_feed() functionality.
+ */
+class NodeFeedTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node feed',
+      'description' => 'Ensures that node_feed() functions correctly.',
+      'group' => 'Node',
+   );
+  }
+
+  /**
+   * Ensures that node_feed() accepts and prints extra channel elements.
+   */
+  function testNodeFeedExtraChannelElements() {
+    ob_start();
+    node_feed(array(), array('copyright' => 'Drupal is a registered trademark of Dries Buytaert.'));
+    $output = ob_get_clean();
+
+    $this->assertTrue(strpos($output, '<copyright>Drupal is a registered trademark of Dries Buytaert.</copyright>') !== FALSE);
+  }
+}
+
+/**
+ * Functional tests for the node module blocks.
+ */
+class NodeBlockFunctionalTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node blocks',
+      'description' => 'Test node block functionality.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('node', 'block');
+
+    // Create users and test node.
+    $this->admin_user = $this->drupalCreateUser(array('administer content types', 'administer nodes', 'administer blocks'));
+    $this->web_user = $this->drupalCreateUser(array('access content', 'create article content'));
+  }
+
+  /**
+   * Tests the recent comments block.
+   */
+  function testRecentNodeBlock() {
+    $this->drupalLogin($this->admin_user);
+
+    // Disallow anonymous users to view content.
+    user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
+      'access content' => FALSE,
+    ));
+
+    // Set the block to a region to confirm block is available.
+    $edit = array(
+      'blocks[node_recent][region]' => 'sidebar_first',
+    );
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->assertText(t('The block settings have been updated.'), 'Block saved to first sidebar region.');
+
+    // Set block title and variables.
+    $block = array(
+      'title' => $this->randomName(),
+      'node_recent_block_count' => 2,
+    );
+    $this->drupalPost('admin/structure/block/manage/node/recent/configure', $block, t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), 'Block saved.');
+
+    // Test that block is not visible without nodes
+    $this->drupalGet('');
+    $this->assertText(t('No content available.'), 'Block with "No content available." found.');
+
+    // Add some test nodes.
+    $default_settings = array('uid' => $this->web_user->uid, 'type' => 'article');
+    $node1 = $this->drupalCreateNode($default_settings);
+    $node2 = $this->drupalCreateNode($default_settings);
+    $node3 = $this->drupalCreateNode($default_settings);
+
+    // Change the changed time for node so that we can test ordering.
+    db_update('node')
+      ->fields(array(
+        'changed' => $node1->changed + 100,
+      ))
+      ->condition('nid', $node2->nid)
+      ->execute();
+    db_update('node')
+      ->fields(array(
+        'changed' => $node1->changed + 200,
+      ))
+      ->condition('nid', $node3->nid)
+      ->execute();
+
+    // Test that a user without the 'access content' permission cannot
+    // see the block.
+    $this->drupalLogout();
+    $this->drupalGet('');
+    $this->assertNoText($block['title'], 'Block was not found.');
+
+    // Test that only the 2 latest nodes are shown.
+    $this->drupalLogin($this->web_user);
+    $this->assertNoText($node1->title, 'Node not found in block.');
+    $this->assertText($node2->title, 'Node found in block.');
+    $this->assertText($node3->title, 'Node found in block.');
+
+    // Check to make sure nodes are in the right order.
+    $this->assertTrue($this->xpath('//div[@id="block-node-recent"]/div/table/tbody/tr[position() = 1]/td/div/a[text() = "' . $node3->title . '"]'), 'Nodes were ordered correctly in block.');
+
+    // Set the number of recent nodes to show to 10.
+    $this->drupalLogout();
+    $this->drupalLogin($this->admin_user);
+    $block = array(
+      'node_recent_block_count' => 10,
+    );
+    $this->drupalPost('admin/structure/block/manage/node/recent/configure', $block, t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), 'Block saved.');
+
+    // Post an additional node.
+    $node4 = $this->drupalCreateNode($default_settings);
+
+    // Test that all four nodes are shown.
+    $this->drupalGet('');
+    $this->assertText($node1->title, 'Node found in block.');
+    $this->assertText($node2->title, 'Node found in block.');
+    $this->assertText($node3->title, 'Node found in block.');
+    $this->assertText($node4->title, 'Node found in block.');
+
+    // Create the custom block.
+    $custom_block = array();
+    $custom_block['info'] = $this->randomName();
+    $custom_block['title'] = $this->randomName();
+    $custom_block['types[article]'] = TRUE;
+    $custom_block['body[value]'] = $this->randomName(32);
+    $custom_block['regions[' . variable_get('theme_default', 'bartik') . ']'] = 'content';
+    if ($admin_theme = variable_get('admin_theme')) {
+      $custom_block['regions[' . $admin_theme . ']'] = 'content';
+    }
+    $this->drupalPost('admin/structure/block/add', $custom_block, t('Save block'));
+
+    $bid = db_query("SELECT bid FROM {block_custom} WHERE info = :info", array(':info' => $custom_block['info']))->fetchField();
+    $this->assertTrue($bid, 'Custom block with visibility rule was created.');
+
+    // Verify visibility rules.
+    $this->drupalGet('');
+    $this->assertNoText($custom_block['title'], 'Block was displayed on the front page.');
+    $this->drupalGet('node/add/article');
+    $this->assertText($custom_block['title'], 'Block was displayed on the node/add/article page.');
+    $this->drupalGet('node/' . $node1->nid);
+    $this->assertText($custom_block['title'], 'Block was displayed on the node/N.');
+
+    // Delete the created custom block & verify that it's been deleted.
+    $this->drupalPost('admin/structure/block/manage/block/' . $bid . '/delete', array(), t('Delete'));
+    $bid = db_query("SELECT 1 FROM {block_node_type} WHERE module = 'block' AND delta = :delta", array(':delta' => $bid))->fetchField();
+    $this->assertFalse($bid, 'Custom block was deleted.');
+  }
+}
+/**
+ * Tests basic options of multi-step node forms.
+ */
+class MultiStepNodeFormBasicOptionsTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Multistep node form basic options',
+      'description' => 'Test the persistence of basic options through multiple steps.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('poll');
+    $web_user = $this->drupalCreateUser(array('administer nodes', 'create poll content'));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Tests changing the default values of basic options to ensure they persist.
+   */
+  function testMultiStepNodeFormBasicOptions() {
+    $edit = array(
+      'title' => 'a',
+      'status' => FALSE,
+      'promote' => FALSE,
+      'sticky' => 1,
+      'choice[new:0][chtext]' => 'a',
+      'choice[new:1][chtext]' => 'a',
+    );
+    $this->drupalPost('node/add/poll', $edit, t('More choices'));
+    $this->assertNoFieldChecked('edit-status', 'status stayed unchecked');
+    $this->assertNoFieldChecked('edit-promote', 'promote stayed unchecked');
+    $this->assertFieldChecked('edit-sticky', 'sticky stayed checked');
+  }
+}
+
+/**
+ * Test to ensure that a node's content is always rebuilt.
+ */
+class NodeBuildContent extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Rebuild content',
+      'description' => 'Test the rebuilding of content for different build modes.',
+      'group' => 'Node',
+    );
+  }
+
+ /**
+  * Ensures that content array is rebuilt on every call to node_build_content().
+  */
+  function testNodeRebuildContent() {
+    $node = $this->drupalCreateNode();
+
+    // Set a property in the content array so we can test for its existence later on.
+    $node->content['test_content_property'] = array('#value' => $this->randomString());
+    $content = node_build_content($node);
+
+    // If the property doesn't exist it means the node->content was rebuilt.
+    $this->assertFalse(isset($content['test_content_property']), 'Node content was emptied prior to being built.');
+  }
+}
+
+/**
+ * Tests node_query_node_access_alter().
+ */
+class NodeQueryAlter extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Node query alter',
+      'description' => 'Test that node access queries are properly altered by the node module.',
+      'group' => 'Node',
+    );
+  }
+
+  /**
+   * User with permission to view content.
+   *
+   * @var object
+   */
+  protected $accessUser;
+
+  /**
+   * User without permission to view content.
+   *
+   * @var object
+   */
+  protected $noAccessUser;
+
+  function setUp() {
+    parent::setUp('node_access_test');
+    node_access_rebuild();
+
+    // Create some content.
+    $this->drupalCreateNode();
+    $this->drupalCreateNode();
+    $this->drupalCreateNode();
+    $this->drupalCreateNode();
+
+    // Create user with simple node access permission. The 'node test view'
+    // permission is implemented and granted by the node_access_test module.
+    $this->accessUser = $this->drupalCreateUser(array('access content overview', 'access content', 'node test view'));
+    $this->noAccessUser = $this->drupalCreateUser(array('access content overview', 'access content'));
+    $this->noAccessUser2 = $this->drupalCreateUser(array('access content overview', 'access content'));
+  }
+
+  /**
+   * Tests that node access permissions are followed.
+   */
+  function testNodeQueryAlterWithUI() {
+    // Verify that a user with access permission can see at least one node.
+    $this->drupalLogin($this->accessUser);
+    $this->drupalGet('node_access_test_page');
+    $this->assertText('Yes, 4 nodes', "4 nodes were found for access user");
+    $this->assertNoText('Exception', "No database exception");
+
+    // Test the content overview page.
+    $this->drupalGet('admin/content');
+    $table_rows = $this->xpath('//tbody/tr');
+    $this->assertEqual(4, count($table_rows), "4 nodes were found for access user");
+
+    // Verify that a user with no access permission cannot see nodes.
+    $this->drupalLogin($this->noAccessUser);
+    $this->drupalGet('node_access_test_page');
+    $this->assertText('No nodes', "No nodes were found for no access user");
+    $this->assertNoText('Exception', "No database exception");
+
+    $this->drupalGet('admin/content');
+    $this->assertText(t('No content available.'));
+  }
+
+  /**
+   * Tests 'node_access' query alter, for user with access.
+   *
+   * Verifies that a non-standard table alias can be used, and that a user with
+   * node access can view the nodes.
+   */
+  function testNodeQueryAlterLowLevelWithAccess() {
+    // User with access should be able to view 4 nodes.
+    try {
+      $query = db_select('node', 'mytab')
+        ->fields('mytab');
+      $query->addTag('node_access');
+      $query->addMetaData('op', 'view');
+      $query->addMetaData('account', $this->accessUser);
+
+      $result = $query->execute()->fetchAll();
+      $this->assertEqual(count($result), 4, 'User with access can see correct nodes');
+    }
+    catch (Exception $e) {
+      $this->fail(t('Altered query is malformed'));
+    }
+  }
+
+  /**
+   * Tests 'node_access' query alter, for user without access.
+   *
+   * Verifies that a non-standard table alias can be used, and that a user
+   * without node access cannot view the nodes.
+   */
+  function testNodeQueryAlterLowLevelNoAccess() {
+    // User without access should be able to view 0 nodes.
+    try {
+      $query = db_select('node', 'mytab')
+        ->fields('mytab');
+      $query->addTag('node_access');
+      $query->addMetaData('op', 'view');
+      $query->addMetaData('account', $this->noAccessUser);
+
+      $result = $query->execute()->fetchAll();
+      $this->assertEqual(count($result), 0, 'User with no access cannot see nodes');
+    }
+    catch (Exception $e) {
+      $this->fail(t('Altered query is malformed'));
+    }
+  }
+
+  /**
+   * Tests 'node_access' query alter, for edit access.
+   *
+   * Verifies that a non-standard table alias can be used, and that a user with
+   * view-only node access cannot edit the nodes.
+   */
+  function testNodeQueryAlterLowLevelEditAccess() {
+    // User with view-only access should not be able to edit nodes.
+    try {
+      $query = db_select('node', 'mytab')
+        ->fields('mytab');
+      $query->addTag('node_access');
+      $query->addMetaData('op', 'update');
+      $query->addMetaData('account', $this->accessUser);
+
+      $result = $query->execute()->fetchAll();
+      $this->assertEqual(count($result), 0, 'User with view-only access cannot edit nodes');
+    }
+    catch (Exception $e) {
+      $this->fail($e->getMessage());
+      $this->fail((string) $query);
+      $this->fail(t('Altered query is malformed'));
+    }
+  }
+
+  /**
+   * Tests 'node_access' query alter override.
+   *
+   * Verifies that node_access_view_all_nodes() is called from
+   * node_query_node_access_alter(). We do this by checking that a user who
+   * normally would not have view privileges is able to view the nodes when we
+   * add a record to {node_access} paired with a corresponding privilege in
+   * hook_node_grants().
+   */
+  function testNodeQueryAlterOverride() {
+    $record = array(
+      'nid' => 0,
+      'gid' => 0,
+      'realm' => 'node_access_all',
+      'grant_view' => 1,
+      'grant_update' => 0,
+      'grant_delete' => 0,
+    );
+    drupal_write_record('node_access', $record);
+
+    // Test that the noAccessUser still doesn't have the 'view'
+    // privilege after adding the node_access record.
+    drupal_static_reset('node_access_view_all_nodes');
+    try {
+      $query = db_select('node', 'mytab')
+        ->fields('mytab');
+      $query->addTag('node_access');
+      $query->addMetaData('op', 'view');
+      $query->addMetaData('account', $this->noAccessUser);
+
+      $result = $query->execute()->fetchAll();
+      $this->assertEqual(count($result), 0, 'User view privileges are not overridden');
+    }
+    catch (Exception $e) {
+      $this->fail(t('Altered query is malformed'));
+    }
+
+    // Have node_test_node_grants return a node_access_all privilege,
+    // to grant the noAccessUser 'view' access.  To verify that
+    // node_access_view_all_nodes is properly checking the specified
+    // $account instead of the global $user, we will log in as
+    // noAccessUser2.
+    $this->drupalLogin($this->noAccessUser2);
+    variable_set('node_test_node_access_all_uid', $this->noAccessUser->uid);
+    drupal_static_reset('node_access_view_all_nodes');
+    try {
+      $query = db_select('node', 'mytab')
+        ->fields('mytab');
+      $query->addTag('node_access');
+      $query->addMetaData('op', 'view');
+      $query->addMetaData('account', $this->noAccessUser);
+
+      $result = $query->execute()->fetchAll();
+      $this->assertEqual(count($result), 4, 'User view privileges are overridden');
+    }
+    catch (Exception $e) {
+      $this->fail(t('Altered query is malformed'));
+    }
+    variable_del('node_test_node_access_all_uid');
+  }
+}
+
+
+/**
+ * Tests node_query_entity_field_access_alter().
+ */
+class NodeEntityFieldQueryAlter extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Node entity query alter',
+      'description' => 'Test that node access entity queries are properly altered by the node module.',
+      'group' => 'Node',
+    );
+  }
+
+  /**
+   * User with permission to view content.
+   *
+   * @var object
+   */
+  protected $accessUser;
+
+  /**
+   * User without permission to view content.
+   *
+   * @var object
+   */
+  protected $noAccessUser;
+
+  function setUp() {
+    parent::setUp('node_access_test');
+    node_access_rebuild();
+
+    // Creating 4 nodes with an entity field so we can test that sort of query
+    // alter. All field values starts with 'A' so we can identify and fetch them
+    // in the node_access_test module.
+    $settings = array('language' => LANGUAGE_NONE);
+    for ($i = 0; $i < 4; $i++) {
+      $body = array(
+        'value' => 'A' . $this->randomName(32),
+        'format' => filter_default_format(),
+      );
+      $settings['body'][LANGUAGE_NONE][0] = $body;
+      $this->drupalCreateNode($settings);
+    }
+
+    // Create user with simple node access permission. The 'node test view'
+    // permission is implemented and granted by the node_access_test module.
+    $this->accessUser = $this->drupalCreateUser(array('access content', 'node test view'));
+    $this->noAccessUser = $this->drupalCreateUser(array('access content'));
+  }
+
+  /**
+   * Tests that node access permissions are followed.
+   */
+  function testNodeQueryAlterWithUI() {
+    // Verify that a user with access permission can see at least one node.
+    $this->drupalLogin($this->accessUser);
+    $this->drupalGet('node_access_entity_test_page');
+    $this->assertText('Yes, 4 nodes', "4 nodes were found for access user");
+    $this->assertNoText('Exception', "No database exception");
+
+    // Verify that a user with no access permission cannot see nodes.
+    $this->drupalLogin($this->noAccessUser);
+    $this->drupalGet('node_access_entity_test_page');
+    $this->assertText('No nodes', "No nodes were found for no access user");
+    $this->assertNoText('Exception', "No database exception");
+  }
+}
+
+/**
+ * Test node token replacement in strings.
+ */
+class NodeTokenReplaceTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Node token replacement',
+      'description' => 'Generates text using placeholders for dummy content to check node token replacement.',
+      'group' => 'Node',
+    );
+  }
+
+  /**
+   * Creates a node, then tests the tokens generated from it.
+   */
+  function testNodeTokenReplacement() {
+    global $language;
+    $url_options = array(
+      'absolute' => TRUE,
+      'language' => $language,
+    );
+
+    // Create a user and a node.
+    $account = $this->drupalCreateUser();
+    $settings = array(
+      'type' => 'article',
+      'uid' => $account->uid,
+      'title' => '<blink>Blinking Text</blink>',
+      'body' => array(LANGUAGE_NONE => array(array('value' => $this->randomName(32), 'summary' => $this->randomName(16)))),
+    );
+    $node = $this->drupalCreateNode($settings);
+
+    // Load node so that the body and summary fields are structured properly.
+    $node = node_load($node->nid);
+    $instance = field_info_instance('node', 'body', $node->type);
+
+    // Generate and test sanitized tokens.
+    $tests = array();
+    $langcode = entity_language('node', $node);
+    $tests['[node:nid]'] = $node->nid;
+    $tests['[node:vid]'] = $node->vid;
+    $tests['[node:tnid]'] = $node->tnid;
+    $tests['[node:type]'] = 'article';
+    $tests['[node:type-name]'] = 'Article';
+    $tests['[node:title]'] = check_plain($node->title);
+    $tests['[node:body]'] = _text_sanitize($instance, $langcode, $node->body[$langcode][0], 'value');
+    $tests['[node:summary]'] = _text_sanitize($instance, $langcode, $node->body[$langcode][0], 'summary');
+    $tests['[node:language]'] = check_plain($langcode);
+    $tests['[node:url]'] = url('node/' . $node->nid, $url_options);
+    $tests['[node:edit-url]'] = url('node/' . $node->nid . '/edit', $url_options);
+    $tests['[node:author]'] = check_plain(format_username($account));
+    $tests['[node:author:uid]'] = $node->uid;
+    $tests['[node:author:name]'] = check_plain(format_username($account));
+    $tests['[node:created:since]'] = format_interval(REQUEST_TIME - $node->created, 2, $language->language);
+    $tests['[node:changed:since]'] = format_interval(REQUEST_TIME - $node->changed, 2, $language->language);
+
+    // Test to make sure that we generated something for each token.
+    $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('node' => $node), array('language' => $language));
+      $this->assertEqual($output, $expected, format_string('Sanitized node token %token replaced.', array('%token' => $input)));
+    }
+
+    // Generate and test unsanitized tokens.
+    $tests['[node:title]'] = $node->title;
+    $tests['[node:body]'] = $node->body[$langcode][0]['value'];
+    $tests['[node:summary]'] = $node->body[$langcode][0]['summary'];
+    $tests['[node:language]'] = $langcode;
+    $tests['[node:author:name]'] = format_username($account);
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('node' => $node), array('language' => $language, 'sanitize' => FALSE));
+      $this->assertEqual($output, $expected, format_string('Unsanitized node token %token replaced.', array('%token' => $input)));
+    }
+  }
+}
+
+/**
+ * Tests user permissions for node revisions.
+ */
+class NodeRevisionPermissionsTestCase extends DrupalWebTestCase {
+
+  /**
+   * Nodes used by the test.
+   *
+   * @var array
+   */
+  protected $node_revisions = array();
+
+  /**
+   * Users with different revision permission used by the test.
+   *
+   * @var array
+   */
+  protected $accounts = array();
+
+  /**
+   * Map revision permission names to node revision access ops.
+   *
+   * @var array
+   */
+  protected $map = array(
+    'view' => 'view revisions',
+    'update' => 'revert revisions',
+    'delete' => 'delete revisions',
+  );
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Node revision permissions',
+      'description' => 'Tests user permissions for node revision operations.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Create a node with several revisions.
+    $node = $this->drupalCreateNode();
+    $this->node_revisions[] = $node;
+
+    for ($i = 0; $i < 3; $i++) {
+      // Create a revision for the same nid and settings with a random log.
+      $revision = clone $node;
+      $revision->revision = 1;
+      $revision->log = $this->randomName(32);
+      node_save($revision);
+      $this->node_revisions[] = $revision;
+    }
+
+    // Create three users, one with each revision permission.
+    foreach ($this->map as $op => $permission) {
+      // Create the user.
+      $account = $this->drupalCreateUser(
+        array(
+          'access content',
+          'edit any page content',
+          'delete any page content',
+          $permission,
+        )
+      );
+      $account->op = $op;
+      $this->accounts[] = $account;
+    }
+
+    // Create an admin account (returns TRUE for all revision permissions).
+    $admin_account = $this->drupalCreateUser(array('access content', 'administer nodes'));
+    $admin_account->is_admin = TRUE;
+    $this->accounts['admin'] = $admin_account;
+
+    // Create a normal account (returns FALSE for all revision permissions).
+    $normal_account = $this->drupalCreateUser();
+    $normal_account->op = FALSE;
+    $this->accounts[] = $normal_account;
+  }
+
+  /**
+   * Tests the _node_revision_access() function.
+   */
+  function testNodeRevisionAccess() {
+    $revision = $this->node_revisions[1];
+
+    $parameters = array(
+      'op' => array_keys($this->map),
+      'account' => $this->accounts,
+    );
+
+    $permutations = $this->generatePermutations($parameters);
+    foreach ($permutations as $case) {
+      if (!empty($case['account']->is_admin) || $case['op'] == $case['account']->op) {
+        $this->assertTrue(_node_revision_access($revision, $case['op'], $case['account']), "{$this->map[$case['op']]} granted.");
+      }
+      else {
+        $this->assertFalse(_node_revision_access($revision, $case['op'], $case['account']), "{$this->map[$case['op']]} not granted.");
+      }
+    }
+
+    // Test that access is FALSE for a node administrator with an invalid $node
+    // or $op parameters.
+    $admin_account = $this->accounts['admin'];
+    $this->assertFalse(_node_revision_access(FALSE, 'view', $admin_account), '_node_revision_access() returns FALSE with an invalid node.');
+    $this->assertFalse(_node_revision_access($revision, 'invalid-op', $admin_account), '_node_revision_access() returns FALSE with an invalid op.');
+
+    // Test that the $account parameter defaults to the "logged in" user.
+    $original_user = $GLOBALS['user'];
+    $GLOBALS['user'] = $admin_account;
+    $this->assertTrue(_node_revision_access($revision, 'view'), '_node_revision_access() returns TRUE when used with global user.');
+    $GLOBALS['user'] = $original_user;
+  }
+}
+
+/**
+ * Tests pagination with a node access module enabled.
+ */
+class NodeAccessPagerTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Node access pagination',
+      'description' => 'Test access controlled node views have the right amount of comment pages.',
+      'group' => 'Node',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp('node_access_test', 'comment', 'forum');
+    node_access_rebuild();
+    $this->web_user = $this->drupalCreateUser(array('access content', 'access comments', 'node test view'));
+  }
+
+  /**
+   * Tests the comment pager for nodes with multiple grants per realm.
+   */
+  public function testCommentPager() {
+    // Create a node.
+    $node = $this->drupalCreateNode();
+
+    // Create 60 comments.
+    for ($i = 0; $i < 60; $i++) {
+      $comment = new stdClass();
+      $comment->cid = 0;
+      $comment->pid = 0;
+      $comment->uid = $this->web_user->uid;
+      $comment->nid = $node->nid;
+      $comment->subject = $this->randomName();
+      $comment->comment_body = array(
+        LANGUAGE_NONE => array(
+          array('value' => $this->randomName()),
+        ),
+      );
+      comment_save($comment);
+    }
+
+    $this->drupalLogin($this->web_user);
+
+    // View the node page. With the default 50 comments per page there should
+    // be two pages (0, 1) but no third (2) page.
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($node->title);
+    $this->assertText(t('Comments'));
+    $this->assertRaw('page=1');
+    $this->assertNoRaw('page=2');
+  }
+
+  /**
+   * Tests the forum node pager for nodes with multiple grants per realm.
+   */
+  public function testForumPager() {
+    // Look up the forums vocabulary ID.
+    $vid = variable_get('forum_nav_vocabulary', 0);
+    $this->assertTrue($vid, 'Forum navigation vocabulary ID is set.');
+
+    // Look up the general discussion term.
+    $tree = taxonomy_get_tree($vid, 0, 1);
+    $tid = reset($tree)->tid;
+    $this->assertTrue($tid, 'General discussion term is found in the forum vocabulary.');
+
+    // Create 30 nodes.
+    for ($i = 0; $i < 30; $i++) {
+      $this->drupalCreateNode(array(
+        'nid' => NULL,
+        'type' => 'forum',
+        'taxonomy_forums' => array(
+          LANGUAGE_NONE => array(
+            array('tid' => $tid, 'vid' => $vid, 'vocabulary_machine_name' => 'forums'),
+          ),
+        ),
+      ));
+    }
+
+    // View the general discussion forum page. With the default 25 nodes per
+    // page there should be two pages for 30 nodes, no more.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('forum/' . $tid);
+    $this->assertRaw('page=1');
+    $this->assertNoRaw('page=2');
+  }
+}
+
+
+/**
+ * Tests the interaction of the node access system with fields.
+ */
+class NodeAccessFieldTestCase extends NodeWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Node access and fields',
+      'description' => 'Tests the interaction of the node access system with fields.',
+      'group' => 'Node',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp('node_access_test', 'field_ui');
+    node_access_rebuild();
+
+    // Create some users.
+    $this->admin_user = $this->drupalCreateUser(array('access content', 'bypass node access'));
+    $this->content_admin_user = $this->drupalCreateUser(array('access content', 'administer content types'));
+
+    // Add a custom field to the page content type.
+    $this->field_name = drupal_strtolower($this->randomName() . '_field_name');
+    $this->field = field_create_field(array('field_name' => $this->field_name, 'type' => 'text'));
+    $this->instance = field_create_instance(array(
+      'field_name' => $this->field_name,
+      'entity_type' => 'node',
+      'bundle' => 'page',
+    ));
+  }
+
+  /**
+   * Tests administering fields when node access is restricted.
+   */
+  function testNodeAccessAdministerField() {
+    // Create a page node.
+    $langcode = LANGUAGE_NONE;
+    $field_data = array();
+    $value = $field_data[$langcode][0]['value'] = $this->randomName();
+    $node = $this->drupalCreateNode(array($this->field_name => $field_data));
+
+    // Log in as the administrator and confirm that the field value is present.
+    $this->drupalLogin($this->admin_user);
+    $this->drupalGet("node/{$node->nid}");
+    $this->assertText($value, 'The saved field value is visible to an administrator.');
+
+    // Log in as the content admin and try to view the node.
+    $this->drupalLogin($this->content_admin_user);
+    $this->drupalGet("node/{$node->nid}");
+    $this->assertText('Access denied', 'Access is denied for the content admin.');
+
+    // Modify the field default as the content admin.
+    $edit = array();
+    $default = 'Sometimes words have two meanings';
+    $edit["{$this->field_name}[$langcode][0][value]"] = $default;
+    $this->drupalPost(
+      "admin/structure/types/manage/page/fields/{$this->field_name}",
+      $edit,
+      t('Save settings')
+    );
+
+    // Log in as the administrator.
+    $this->drupalLogin($this->admin_user);
+
+    // Confirm that the existing node still has the correct field value.
+    $this->drupalGet("node/{$node->nid}");
+    $this->assertText($value, 'The original field value is visible to an administrator.');
+
+    // Confirm that the new default value appears when creating a new node.
+    $this->drupalGet('node/add/page');
+    $this->assertRaw($default, 'The updated default value is displayed when creating a new node.');
+  }
+}
+
+/**
+ * Tests changing view modes for nodes.
+ */
+class NodeEntityViewModeAlterTest extends NodeWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Node entity view mode',
+      'description' => 'Test changing view mode.',
+      'group' => 'Node'
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('node_test'));
+  }
+
+  /**
+   * Create a "Basic page" node and verify its consistency in the database.
+   */
+  function testNodeViewModeChange() {
+    $web_user = $this->drupalCreateUser(array('create page content', 'edit own page content'));
+    $this->drupalLogin($web_user);
+
+    // Create a node.
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = $this->randomName(8);
+    $edit["body[$langcode][0][value]"] = t('Data that should appear only in the body for the node.');
+    $edit["body[$langcode][0][summary]"] = t('Extra data that should appear only in the teaser for the node.');
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+
+    $node = $this->drupalGetNodeByTitle($edit["title"]);
+
+    // Set the flag to alter the view mode and view the node.
+    variable_set('node_test_change_view_mode', 'teaser');
+    $this->drupalGet('node/' . $node->nid);
+
+    // Check that teaser mode is viewed.
+    $this->assertText('Extra data that should appear only in the teaser for the node.', 'Teaser text present');
+    // Make sure body text is not present.
+    $this->assertNoText('Data that should appear only in the body for the node.', 'Body text not present');
+
+    // Test that the correct build mode has been set.
+    $build = node_view($node);
+    $this->assertEqual($build['#view_mode'], 'teaser', 'The view mode has correctly been set to teaser.');
+  }
+}
+
+/**
+ * Tests the cache invalidation of node operations.
+ */
+class NodePageCacheTest extends NodeWebTestCase {
+
+  /**
+   * An admin user with administrative permissions for nodes.
+   */
+  protected $admin_user;
+
+  public static function getInfo() {
+    return array(
+        'name' => 'Node page cache test',
+        'description' => 'Test cache invalidation of node operations.',
+        'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    variable_set('cache', 1);
+    variable_set('page_cache_maximum_age', 300);
+
+    $this->admin_user = $this->drupalCreateUser(array(
+        'bypass node access',
+        'access content overview',
+        'administer nodes',
+    ));
+  }
+
+  /**
+   * Tests deleting nodes clears page cache.
+   */
+  public function testNodeDelete() {
+    $node_path = 'node/' . $this->drupalCreateNode()->nid;
+
+    // Populate page cache.
+    $this->drupalGet($node_path);
+
+    // Login and delete the node.
+    $this->drupalLogin($this->admin_user);
+    $this->drupalPost($node_path . '/delete', array(), t('Delete'));
+
+    // Logout and check the node is not available.
+    $this->drupalLogout();
+    $this->drupalGet($node_path);
+    $this->assertResponse(404);
+
+    // Create two new nodes.
+    $nodes[0] = $this->drupalCreateNode();
+    $nodes[1] = $this->drupalCreateNode();
+    $node_path = 'node/' . $nodes[0]->nid;
+
+    // Populate page cache.
+    $this->drupalGet($node_path);
+
+    // Login and delete the nodes.
+    $this->drupalLogin($this->admin_user);
+    $this->drupalGet('admin/content');
+    $edit = array(
+        'operation' => 'delete',
+        'nodes[' . $nodes[0]->nid . ']' => TRUE,
+        'nodes[' . $nodes[1]->nid . ']' => TRUE,
+    );
+    $this->drupalPost(NULL, $edit, t('Update'));
+    $this->drupalPost(NULL, array(), t('Delete'));
+
+    // Logout and check the node is not available.
+    $this->drupalLogout();
+    $this->drupalGet($node_path);
+    $this->assertResponse(404);
+  }
+}
diff --git a/htmltest/modules/node/node.tokens.inc b/htmltest/modules/node/node.tokens.inc
new file mode 100644
index 00000000..e43db5e7
--- /dev/null
+++ b/htmltest/modules/node/node.tokens.inc
@@ -0,0 +1,191 @@
+<?php
+
+/**
+ * @file
+ * Builds placeholder replacement tokens for node-related data.
+ */
+
+
+
+/**
+ * Implements hook_token_info().
+ */
+function node_token_info() {
+  $type = array(
+    'name' => t('Nodes'),
+    'description' => t('Tokens related to individual content items, or "nodes".'),
+    'needs-data' => 'node',
+  );
+
+  // Core tokens for nodes.
+  $node['nid'] = array(
+    'name' => t("Content ID"),
+    'description' => t('The unique ID of the content item, or "node".'),
+  );
+  $node['vid'] = array(
+    'name' => t("Revision ID"),
+    'description' => t("The unique ID of the node's latest revision."),
+  );
+  $node['tnid'] = array(
+    'name' => t("Translation set ID"),
+    'description' => t("The unique ID of the original-language version of this node, if one exists."),
+  );
+  $node['type'] = array(
+    'name' => t("Content type"),
+    'description' => t("The type of the node."),
+  );
+  $node['type-name'] = array(
+    'name' => t("Content type name"),
+    'description' => t("The human-readable name of the node type."),
+  );
+  $node['title'] = array(
+    'name' => t("Title"),
+    'description' => t("The title of the node."),
+  );
+  $node['body'] = array(
+    'name' => t("Body"),
+    'description' => t("The main body text of the node."),
+  );
+  $node['summary'] = array(
+    'name' => t("Summary"),
+    'description' => t("The summary of the node's main body text."),
+  );
+  $node['language'] = array(
+    'name' => t("Language"),
+    'description' => t("The language the node is written in."),
+  );
+  $node['url'] = array(
+    'name' => t("URL"),
+    'description' => t("The URL of the node."),
+  );
+  $node['edit-url'] = array(
+    'name' => t("Edit URL"),
+    'description' => t("The URL of the node's edit page."),
+  );
+
+  // Chained tokens for nodes.
+  $node['created'] = array(
+    'name' => t("Date created"),
+    'description' => t("The date the node was posted."),
+    'type' => 'date',
+  );
+  $node['changed'] = array(
+    'name' => t("Date changed"),
+    'description' => t("The date the node was most recently updated."),
+    'type' => 'date',
+  );
+  $node['author'] = array(
+    'name' => t("Author"),
+    'description' => t("The author of the node."),
+    'type' => 'user',
+  );
+
+  return array(
+    'types' => array('node' => $type),
+    'tokens' => array('node' => $node),
+  );
+}
+
+/**
+ * Implements hook_tokens().
+ */
+function node_tokens($type, $tokens, array $data = array(), array $options = array()) {
+  $url_options = array('absolute' => TRUE);
+  if (isset($options['language'])) {
+    $url_options['language'] = $options['language'];
+    $language_code = $options['language']->language;
+  }
+  else {
+    $language_code = NULL;
+  }
+  $sanitize = !empty($options['sanitize']);
+
+  $replacements = array();
+
+  if ($type == 'node' && !empty($data['node'])) {
+    $node = $data['node'];
+
+    foreach ($tokens as $name => $original) {
+      switch ($name) {
+        // Simple key values on the node.
+        case 'nid':
+          $replacements[$original] = $node->nid;
+          break;
+
+        case 'vid':
+          $replacements[$original] = $node->vid;
+          break;
+
+        case 'tnid':
+          $replacements[$original] = $node->tnid;
+          break;
+
+        case 'type':
+          $replacements[$original] = $sanitize ? check_plain($node->type) : $node->type;
+          break;
+
+        case 'type-name':
+          $type_name = node_type_get_name($node);
+          $replacements[$original] = $sanitize ? check_plain($type_name) : $type_name;
+          break;
+
+        case 'title':
+          $replacements[$original] = $sanitize ? check_plain($node->title) : $node->title;
+          break;
+
+        case 'body':
+        case 'summary':
+          if ($items = field_get_items('node', $node, 'body', $language_code)) {
+            $column = ($name == 'body') ? 'value' : 'summary';
+            $instance = field_info_instance('node', 'body', $node->type);
+            $field_langcode = field_language('node', $node, 'body', $language_code);
+            $replacements[$original] = $sanitize ? _text_sanitize($instance, $field_langcode, $items[0], $column) : $items[0][$column];
+          }
+          break;
+
+        case 'language':
+          $langcode = entity_language('node', $node);
+          $replacements[$original] = $sanitize ? check_plain($langcode) : $langcode;
+          break;
+
+        case 'url':
+          $replacements[$original] = url('node/' . $node->nid, $url_options);
+          break;
+
+        case 'edit-url':
+          $replacements[$original] = url('node/' . $node->nid . '/edit', $url_options);
+          break;
+
+        // Default values for the chained tokens handled below.
+        case 'author':
+          $account = user_load($node->uid);
+          $name = format_username($account);
+          $replacements[$original] = $sanitize ? check_plain($name) : $name;
+          break;
+
+        case 'created':
+          $replacements[$original] = format_date($node->created, 'medium', '', NULL, $language_code);
+          break;
+
+        case 'changed':
+          $replacements[$original] = format_date($node->changed, 'medium', '', NULL, $language_code);
+          break;
+      }
+    }
+
+    if ($author_tokens = token_find_with_prefix($tokens, 'author')) {
+      $author = user_load($node->uid);
+      $replacements += token_generate('user', $author_tokens, array('user' => $author), $options);
+    }
+
+    if ($created_tokens = token_find_with_prefix($tokens, 'created')) {
+      $replacements += token_generate('date', $created_tokens, array('date' => $node->created), $options);
+    }
+
+    if ($changed_tokens = token_find_with_prefix($tokens, 'changed')) {
+      $replacements += token_generate('date', $changed_tokens, array('date' => $node->changed), $options);
+    }
+  }
+
+  return $replacements;
+}
diff --git a/htmltest/modules/node/node.tpl.php b/htmltest/modules/node/node.tpl.php
new file mode 100644
index 00000000..4c358a16
--- /dev/null
+++ b/htmltest/modules/node/node.tpl.php
@@ -0,0 +1,112 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to display a node.
+ *
+ * Available variables:
+ * - $title: the (sanitized) title of the node.
+ * - $content: An array of node items. Use render($content) to print them all,
+ *   or print a subset such as render($content['field_example']). Use
+ *   hide($content['field_example']) to temporarily suppress the printing of a
+ *   given element.
+ * - $user_picture: The node author's picture from user-picture.tpl.php.
+ * - $date: Formatted creation date. Preprocess functions can reformat it by
+ *   calling format_date() with the desired parameters on the $created variable.
+ * - $name: Themed username of node author output from theme_username().
+ * - $node_url: Direct URL of the current node.
+ * - $display_submitted: Whether submission information should be displayed.
+ * - $submitted: Submission information created from $name and $date during
+ *   template_preprocess_node().
+ * - $classes: String of classes that can be used to style contextually through
+ *   CSS. It can be manipulated through the variable $classes_array from
+ *   preprocess functions. The default values can be one or more of the
+ *   following:
+ *   - node: The current template type; for example, "theming hook".
+ *   - node-[type]: The current node type. For example, if the node is a
+ *     "Blog entry" it would result in "node-blog". Note that the machine
+ *     name will often be in a short form of the human readable label.
+ *   - node-teaser: Nodes in teaser form.
+ *   - node-preview: Nodes in preview mode.
+ *   The following are controlled through the node publishing options.
+ *   - node-promoted: Nodes promoted to the front page.
+ *   - node-sticky: Nodes ordered above other non-sticky nodes in teaser
+ *     listings.
+ *   - node-unpublished: Unpublished nodes visible only to administrators.
+ * - $title_prefix (array): An array containing additional output populated by
+ *   modules, intended to be displayed in front of the main title tag that
+ *   appears in the template.
+ * - $title_suffix (array): An array containing additional output populated by
+ *   modules, intended to be displayed after the main title tag that appears in
+ *   the template.
+ *
+ * Other variables:
+ * - $node: Full node object. Contains data that may not be safe.
+ * - $type: Node type; for example, story, page, blog, etc.
+ * - $comment_count: Number of comments attached to the node.
+ * - $uid: User ID of the node author.
+ * - $created: Time the node was published formatted in Unix timestamp.
+ * - $classes_array: Array of html class attribute values. It is flattened
+ *   into a string within the variable $classes.
+ * - $zebra: Outputs either "even" or "odd". Useful for zebra striping in
+ *   teaser listings.
+ * - $id: Position of the node. Increments each time it's output.
+ *
+ * Node status variables:
+ * - $view_mode: View mode; for example, "full", "teaser".
+ * - $teaser: Flag for the teaser state (shortcut for $view_mode == 'teaser').
+ * - $page: Flag for the full page state.
+ * - $promote: Flag for front page promotion state.
+ * - $sticky: Flags for sticky post setting.
+ * - $status: Flag for published status.
+ * - $comment: State of comment settings for the node.
+ * - $readmore: Flags true if the teaser content of the node cannot hold the
+ *   main body content.
+ * - $is_front: Flags true when presented in the front page.
+ * - $logged_in: Flags true when the current user is a logged-in member.
+ * - $is_admin: Flags true when the current user is an administrator.
+ *
+ * Field variables: for each field instance attached to the node a corresponding
+ * variable is defined; for example, $node->body becomes $body. When needing to
+ * access a field's raw values, developers/themers are strongly encouraged to
+ * use these variables. Otherwise they will have to explicitly specify the
+ * desired field language; for example, $node->body['en'], thus overriding any
+ * language negotiation rule that was previously applied.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_node()
+ * @see template_process()
+ *
+ * @ingroup themeable
+ */
+?>
+<div id="node-<?php print $node->nid; ?>" class="<?php print $classes; ?> clearfix"<?php print $attributes; ?>>
+
+  <?php print $user_picture; ?>
+
+  <?php print render($title_prefix); ?>
+  <?php if (!$page): ?>
+    <h2<?php print $title_attributes; ?>><a href="<?php print $node_url; ?>"><?php print $title; ?></a></h2>
+  <?php endif; ?>
+  <?php print render($title_suffix); ?>
+
+  <?php if ($display_submitted): ?>
+    <div class="submitted">
+      <?php print $submitted; ?>
+    </div>
+  <?php endif; ?>
+
+  <div class="content"<?php print $content_attributes; ?>>
+    <?php
+      // We hide the comments and links now so that we can render them later.
+      hide($content['comments']);
+      hide($content['links']);
+      print render($content);
+    ?>
+  </div>
+
+  <?php print render($content['links']); ?>
+
+  <?php print render($content['comments']); ?>
+
+</div>
diff --git a/htmltest/modules/node/tests/node_access_test.info b/htmltest/modules/node/tests/node_access_test.info
new file mode 100644
index 00000000..73698e5c
--- /dev/null
+++ b/htmltest/modules/node/tests/node_access_test.info
@@ -0,0 +1,12 @@
+name = "Node module access tests"
+description = "Support module for node permission testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/node/tests/node_access_test.install b/htmltest/modules/node/tests/node_access_test.install
new file mode 100644
index 00000000..1f33d51b
--- /dev/null
+++ b/htmltest/modules/node/tests/node_access_test.install
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the node_access_test module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function node_access_test_schema() {
+  $schema['node_access_test'] = array(
+    'description' => 'The base table for node_access_test.',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The {node}.nid this record affects.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'private' => array(
+        'description' => 'Boolean indicating whether the node is private (visible to administrator) or not (visible to non-administrators).',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'indexes' => array(
+      'nid' => array('nid'),
+    ),
+    'primary key' => array('nid'),
+    'foreign keys' => array(
+      'versioned_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+    ),
+  );
+
+  return $schema;
+}
diff --git a/htmltest/modules/node/tests/node_access_test.module b/htmltest/modules/node/tests/node_access_test.module
new file mode 100644
index 00000000..ec35c41f
--- /dev/null
+++ b/htmltest/modules/node/tests/node_access_test.module
@@ -0,0 +1,230 @@
+<?php
+
+/**
+ * @file
+ * A dummy module implementing node access related hooks for testing purposes.
+ *
+ * A dummy module implementing node access related hooks to test API interaction
+ * with the Node module. This module restricts view permission to those with
+ * a special 'node test view' permission.
+ */
+
+/**
+ * Implements hook_node_grants().
+ */
+function node_access_test_node_grants($account, $op) {
+  $grants = array();
+  // First grant a grant to the author for own content.
+  $grants['node_access_test_author'] = array($account->uid);
+  if ($op == 'view' && user_access('node test view', $account)) {
+    $grants['node_access_test'] = array(8888, 8889);
+  }
+  if ($op == 'view' && $account->uid == variable_get('node_test_node_access_all_uid', 0)) {
+    $grants['node_access_all'] = array(0);
+  }
+  return $grants;
+}
+
+/**
+ * Implements hook_node_access_records().
+ */
+function node_access_test_node_access_records($node) {
+  $grants = array();
+  // For NodeAccessBaseTableTestCase, only set records for private nodes.
+  if (!variable_get('node_access_test_private') || $node->private) {
+    $grants[] = array(
+      'realm' => 'node_access_test',
+      'gid' => 8888,
+      'grant_view' => 1,
+      'grant_update' => 0,
+      'grant_delete' => 0,
+      'priority' => 0,
+    );
+    $grants[] = array(
+      'realm' => 'node_access_test',
+      'gid' => 8889,
+      'grant_view' => 1,
+      'grant_update' => 0,
+      'grant_delete' => 0,
+      'priority' => 0,
+    );
+    // For the author realm, the GID is equivalent to a UID, which
+    // means there are many many groups of just 1 user.
+    $grants[] = array(
+      'realm' => 'node_access_test_author',
+      'gid' => $node->uid,
+      'grant_view' => 1,
+      'grant_update' => 1,
+      'grant_delete' => 1,
+      'priority' => 0,
+    );
+  }
+
+  return $grants;
+}
+
+/**
+ * Implements hook_permission().
+ *
+ * Sets up permissions for this module.
+ */
+function node_access_test_permission() {
+  return array('node test view' => array('title' => 'View content'));
+}
+
+/**
+ * Implements hook_menu().
+ *
+ * Sets up a page that lists nodes.
+ */
+function node_access_test_menu() {
+  $items = array();
+  $items['node_access_test_page'] = array(
+    'title' => 'Node access test',
+    'page callback' => 'node_access_test_page',
+    'access arguments' => array('access content'),
+    'type' => MENU_SUGGESTED_ITEM,
+  );
+  $items['node_access_entity_test_page'] = array(
+    'title' => 'Node access test',
+    'page callback' => 'node_access_entity_test_page',
+    'access arguments' => array('access content'),
+    'type' => MENU_SUGGESTED_ITEM,
+  );
+  return $items;
+}
+
+/**
+ * Page callback for node access test page.
+ *
+ * Page should say "No nodes" if there are no nodes, and "Yes, # nodes" (with
+ * the number filled in) if there were nodes the user could access. Also, the
+ * database query is shown, and a list of the node IDs, for debugging purposes.
+ * And if there is a query exception, the page says "Exception" and gives the
+ * error.
+ */
+function node_access_test_page() {
+  $output = '';
+
+  try {
+    $query = db_select('node', 'mytab')
+      ->fields('mytab');
+    $query->addTag('node_access');
+    $result = $query->execute()->fetchAll();
+
+    if (count($result)) {
+      $output .= '<p>Yes, ' . count($result) . ' nodes</p>';
+      $output .= '<ul>';
+      foreach ($result as $item) {
+        $output .= '<li>' . $item->nid . '</li>';
+      }
+      $output .= '</ul>';
+    }
+    else {
+      $output .= '<p>No nodes</p>';
+    }
+
+    $output .= '<p>' . ((string) $query ) . '</p>';
+  }
+  catch (Exception $e) {
+    $output = '<p>Exception</p>';
+    $output .= '<p>' . $e->getMessage() . '</p>';
+  }
+
+  return $output;
+}
+
+/**
+ * Page callback for node access entity test page.
+ *
+ * Page should say "No nodes" if there are no nodes, and "Yes, # nodes" (with
+ * the number filled in) if there were nodes the user could access. Also, the
+ * database query is shown, and a list of the node IDs, for debugging purposes.
+ * And if there is a query exception, the page says "Exception" and gives the
+ * error.
+ *
+ * @see node_access_test_menu()
+ */
+function node_access_entity_test_page() {
+  $output = '';
+  try {
+    $query = new EntityFieldQuery;
+    $result = $query->fieldCondition('body', 'value', 'A', 'STARTS_WITH')->execute();
+    if (!empty($result['node'])) {
+      $output .= '<p>Yes, ' . count($result['node']) . ' nodes</p>';
+      $output .= '<ul>';
+      foreach ($result['node'] as $nid => $v) {
+        $output .= '<li>' . $nid . '</li>';
+      }
+      $output .= '</ul>';
+    }
+    else {
+      $output .= '<p>No nodes</p>';
+    }
+  }
+  catch (Exception $e) {
+    $output = '<p>Exception</p>';
+    $output .= '<p>' . $e->getMessage() . '</p>';
+  }
+
+  return $output;
+}
+
+/**
+ * Implements hook_form_BASE_FORM_ID_alter().
+ */
+function node_access_test_form_node_form_alter(&$form, $form_state) {
+  // Only show this checkbox for NodeAccessBaseTableTestCase.
+  if (variable_get('node_access_test_private')) {
+    $form['private'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Private'),
+      '#description' => t('Check here if this content should be set private and only shown to privileged users.'),
+      '#default_value' => isset($form['#node']->private) ? $form['#node']->private : FALSE,
+    );
+  }
+}
+
+/**
+ * Implements hook_node_load().
+ */
+function node_access_test_node_load($nodes, $types) {
+  $result = db_query('SELECT nid, private FROM {node_access_test} WHERE nid IN(:nids)', array(':nids' => array_keys($nodes)));
+  foreach ($result as $record) {
+    $nodes[$record->nid]->private = $record->private;
+  }
+}
+
+/**
+ * Implements hook_node_delete().
+ */
+
+function node_access_test_node_delete($node) {
+  db_delete('node_access_test')->condition('nid', $node->nid)->execute();
+}
+
+/**
+ * Implements hook_node_insert().
+ */
+function node_access_test_node_insert($node) {
+  _node_access_test_node_write($node);
+}
+
+/**
+ * Implements hook_nodeapi_update().
+ */
+function node_access_test_node_update($node) {
+  _node_access_test_node_write($node);
+}
+
+/**
+ * Helper for node insert/update.
+ */
+function _node_access_test_node_write($node) {
+  if (isset($node->private)) {
+    db_merge('node_access_test')
+      ->key(array('nid' => $node->nid))
+      ->fields(array('private' => (int) $node->private))
+      ->execute();
+  }
+}
diff --git a/htmltest/modules/node/tests/node_test.info b/htmltest/modules/node/tests/node_test.info
new file mode 100644
index 00000000..a5db7ea7
--- /dev/null
+++ b/htmltest/modules/node/tests/node_test.info
@@ -0,0 +1,12 @@
+name = "Node module tests"
+description = "Support module for node related testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/node/tests/node_test.module b/htmltest/modules/node/tests/node_test.module
new file mode 100644
index 00000000..edc175f1
--- /dev/null
+++ b/htmltest/modules/node/tests/node_test.module
@@ -0,0 +1,181 @@
+<?php
+
+/**
+ * @file
+ * A dummy module for testing node related hooks.
+ *
+ * This is a dummy module that implements node related hooks to test API
+ * interaction with the Node module.
+ */
+
+/**
+ * Implements hook_node_load().
+ */
+function node_test_node_load($nodes, $types) {
+  // Add properties to each loaded node which record the parameters that were
+  // passed in to this function, so the tests can check that (a) this hook was
+  // called, and (b) the parameters were what we expected them to be.
+  $nids = array_keys($nodes);
+  ksort($nids);
+  sort($types);
+  foreach ($nodes as $node) {
+    $node->node_test_loaded_nids = $nids;
+    $node->node_test_loaded_types = $types;
+  }
+}
+
+/**
+ * Implements hook_node_view().
+ */
+function node_test_node_view($node, $view_mode) {
+  if ($view_mode == 'rss') {
+    // Add RSS elements and namespaces when building the RSS feed.
+    $node->rss_elements[] = array(
+      'key' => 'testElement',
+      'value' => t('Value of testElement RSS element for node !nid.', array('!nid' => $node->nid)),
+    );
+    $node->rss_namespaces['xmlns:drupaltest'] = 'http://example.com/test-namespace';
+
+    // Add content that should be displayed only in the RSS feed.
+    $node->content['extra_feed_content'] = array(
+      '#markup' => '<p>' . t('Extra data that should appear only in the RSS feed for node !nid.', array('!nid' => $node->nid)) . '</p>',
+      '#weight' => 10,
+    );
+  }
+
+  if ($view_mode != 'rss') {
+    // Add content that should NOT be displayed in the RSS feed.
+    $node->content['extra_non_feed_content'] = array(
+      '#markup' => '<p>' . t('Extra data that should appear everywhere except the RSS feed for node !nid.', array('!nid' => $node->nid)) . '</p>',
+    );
+  }
+}
+
+/**
+ * Implements hook_node_grants().
+ */
+function node_test_node_grants($account, $op) {
+  // Give everyone full grants so we don't break other node tests.
+  // Our node access tests asserts three realms of access.
+  // See testGrantAlter().
+  return array(
+    'test_article_realm' => array(1),
+    'test_page_realm' => array(1),
+    'test_alter_realm' => array(2),
+  );
+}
+
+/**
+ * Implements hook_node_access_records().
+ */
+function node_test_node_access_records($node) {
+  // Return nothing when testing for empty responses.
+  if (!empty($node->disable_node_access)) {
+    return;
+  }
+  $grants = array();
+  if ($node->type == 'article') {
+    // Create grant in arbitrary article_realm for article nodes.
+    $grants[] = array(
+      'realm' => 'test_article_realm',
+      'gid' => 1,
+      'grant_view' => 1,
+      'grant_update' => 0,
+      'grant_delete' => 0,
+      'priority' => 0,
+    );
+  }
+  elseif ($node->type == 'page') {
+    // Create grant in arbitrary page_realm for page nodes.
+    $grants[] = array(
+      'realm' => 'test_page_realm',
+      'gid' => 1,
+      'grant_view' => 1,
+      'grant_update' => 0,
+      'grant_delete' => 0,
+      'priority' => 0,
+    );
+  }
+  return $grants;
+}
+
+/**
+ * Implements hook_node_access_records_alter().
+ */
+function node_test_node_access_records_alter(&$grants, $node) {
+  if (!empty($grants)) {
+    foreach ($grants as $key => $grant) {
+      // Alter grant from test_page_realm to test_alter_realm and modify the gid.
+      if ($grant['realm'] == 'test_page_realm' && $node->promote) {
+        $grants[$key]['realm'] = 'test_alter_realm';
+        $grants[$key]['gid'] = 2;
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_node_grants_alter().
+ */
+function node_test_node_grants_alter(&$grants, $account, $op) {
+  // Return an empty array of grants to prove that we can alter by reference.
+  $grants = array();
+}
+
+/**
+ * Implements hook_node_presave().
+ */
+function node_test_node_presave($node) {
+  if ($node->title == 'testing_node_presave') {
+    // Sun, 19 Nov 1978 05:00:00 GMT
+    $node->created = 280299600;
+    // Drupal 1.0 release.
+    $node->changed = 979534800;
+  }
+  // Determine changes.
+  if (!empty($node->original) && $node->original->title == 'test_changes') {
+    if ($node->original->title != $node->title) {
+      $node->title .= '_presave';
+    }
+  }
+}
+
+/**
+ * Implements hook_node_update().
+ */
+function node_test_node_update($node) {
+  // Determine changes on update.
+  if (!empty($node->original) && $node->original->title == 'test_changes') {
+    if ($node->original->title != $node->title) {
+      $node->title .= '_update';
+    }
+  }
+}
+
+/**
+ * Implements hook_entity_view_mode_alter().
+ */
+function node_test_entity_view_mode_alter(&$view_mode, $context) {
+  // Only alter the view mode if we are on the test callback.
+  if ($change_view_mode = variable_get('node_test_change_view_mode', '')) {
+    $view_mode = $change_view_mode;
+  }
+}
+
+/**
+ * Implements hook_node_insert().
+ *
+ * This tests saving a node on node insert.
+ *
+ * @see NodeSaveTest::testNodeSaveOnInsert()
+ */
+function node_test_node_insert($node) {
+  // Set the node title to the node ID and save.
+  if ($node->title == 'new') {
+    $node->title = 'Node '. $node->nid;
+    // Remove the is_new flag, so that the node is updated and not inserted
+    // again.
+    unset($node->is_new);
+    node_save($node);
+  }
+}
diff --git a/htmltest/modules/node/tests/node_test_exception.info b/htmltest/modules/node/tests/node_test_exception.info
new file mode 100644
index 00000000..00f9a9ad
--- /dev/null
+++ b/htmltest/modules/node/tests/node_test_exception.info
@@ -0,0 +1,12 @@
+name = "Node module exception tests"
+description = "Support module for node related exception testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/node/tests/node_test_exception.module b/htmltest/modules/node/tests/node_test_exception.module
new file mode 100644
index 00000000..66bc7174
--- /dev/null
+++ b/htmltest/modules/node/tests/node_test_exception.module
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * @file
+ * A module implementing node related hooks to test API interaction.
+ */
+
+/**
+ * Implements hook_node_insert().
+ */
+function node_test_exception_node_insert($node) {
+  if ($node->title == 'testing_transaction_exception') {
+    throw new Exception('Test exception for rollback.');
+  }
+}
diff --git a/htmltest/modules/openid/login-bg.png b/htmltest/modules/openid/login-bg.png
new file mode 100644
index 00000000..532614ff
Binary files /dev/null and b/htmltest/modules/openid/login-bg.png differ
diff --git a/htmltest/modules/openid/openid-rtl.css b/htmltest/modules/openid/openid-rtl.css
new file mode 100644
index 00000000..861f6d7d
--- /dev/null
+++ b/htmltest/modules/openid/openid-rtl.css
@@ -0,0 +1,18 @@
+
+#edit-openid-identifier {
+  background-position: right 50%;
+  padding-left: 0;
+  padding-right: 20px;
+}
+#user-login .openid-links {
+  padding-right: 0;
+}
+html.js #user-login-form li.openid-link,
+html.js #user-login li.openid-link {
+  margin-right: 0;
+}
+#user-login-form li.openid-link a,
+#user-login li.openid-link a {
+  background-position: right top;
+  padding: 0 1.5em 0 0;
+}
diff --git a/htmltest/modules/openid/openid.api.php b/htmltest/modules/openid/openid.api.php
new file mode 100644
index 00000000..5e3d15d9
--- /dev/null
+++ b/htmltest/modules/openid/openid.api.php
@@ -0,0 +1,116 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the OpenID module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Allow modules to modify the OpenID request parameters.
+ *
+ * @param $op
+ *   The operation to be performed.
+ *   Possible values:
+ *   - request: Modify parameters before they are sent to the OpenID provider.
+ * @param $request
+ *   An associative array of parameter defaults to which to modify or append.
+ * @return
+ *   An associative array of parameters to be merged with the default list.
+ *
+ */
+function hook_openid($op, $request) {
+  if ($op == 'request') {
+    $request['openid.identity'] = 'http://myname.myopenid.com/';
+  }
+  return $request;
+}
+
+/**
+ * Allow modules to act upon a successful OpenID login.
+ *
+ * @param $response
+ *   Response values from the OpenID Provider.
+ * @param $account
+ *   The Drupal user account that logged in
+ *
+ */
+function hook_openid_response($response, $account) {
+  if (isset($response['openid.ns.ax'])) {
+    _mymodule_store_ax_fields($response, $account);
+  }
+}
+
+/**
+ * Allow modules to declare OpenID discovery methods.
+ *
+ * The discovery function callbacks will be called in turn with an unique
+ * parameter, the claimed identifier. They have to return an associative array
+ * with array of services and claimed identifier in the same form as returned by
+ * openid_discover(). The resulting array must contain following keys:
+ *   - 'services' (required) an array of discovered services (including OpenID
+ *   version, endpoint URI, etc).
+ *   - 'claimed_id' (optional) new claimed identifer, found by following HTTP
+ *   redirects during the services discovery.
+ *
+ * The first discovery method that succeed (return at least one services) will
+ * stop the discovery process.
+ *
+ * @return
+ *   An associative array which keys are the name of the discovery methods and
+ *   values are function callbacks.
+ *
+ * @see hook_openid_discovery_method_info_alter()
+ */
+function hook_openid_discovery_method_info() {
+  return array(
+    'new_discovery_idea' => '_my_discovery_method',
+  );
+}
+
+/**
+ * Allow modules to alter discovery methods.
+ */
+function hook_openid_discovery_method_info_alter(&$methods) {
+  // Remove XRI discovery scheme.
+  unset($methods['xri']);
+}
+
+/**
+ * Allow modules to declare OpenID normalization methods.
+ *
+ * The discovery function callbacks will be called in turn with an unique
+ * parameter, the identifier to normalize. They have to return a normalized
+ * identifier, or NULL if the identifier is not in a form they can handle.
+ *
+ * The first normalization method that succeed (return a value that is not NULL)
+ * will stop the normalization process.
+ *
+ * @return
+ *   An array with a set of function callbacks, that will be called in turn
+ *   when normalizing an OpenID identifier. The normalization functions have
+ *   to return a normalized identifier, or NULL if the identifier is not in
+ *   a form they can handle.
+ * @see hook_openid_normalization_method_info_alter()
+ */
+function hook_openid_normalization_method_info() {
+  return array(
+    'new_normalization_idea' => '_my_normalization_method',
+  );
+}
+
+/**
+ * Allow modules to alter normalization methods.
+ */
+function hook_openid_normalization_method_info_alter(&$methods) {
+  // Remove Google IDP normalization.
+  unset($methods['google_idp']);
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/openid/openid.css b/htmltest/modules/openid/openid.css
new file mode 100644
index 00000000..48b170fb
--- /dev/null
+++ b/htmltest/modules/openid/openid.css
@@ -0,0 +1,46 @@
+
+#edit-openid-identifier {
+  background-image: url("login-bg.png");
+  background-position: left 50%; /* LTR */
+  background-repeat: no-repeat;
+  padding-left: 20px; /* LTR */
+}
+div.form-item-openid-identifier {
+  display: block;
+}
+html.js #user-login-form div.form-item-openid-identifier,
+html.js #user-login div.form-item-openid-identifier {
+  display: none;
+}
+#user-login-form ul {
+  margin-top: 0;
+}
+#user-login ul {
+  margin: 0 0 5px;
+}
+#user-login ul li {
+  margin: 0;
+}
+#user-login-form .openid-links {
+  padding-bottom: 0;
+}
+#user-login .openid-links {
+  padding-left: 0; /* LTR */
+}
+#user-login-form .openid-links li,
+#user-login .openid-links li {
+  display: none;
+  list-style: none;
+}
+html.js #user-login-form li.openid-link,
+html.js #user-login li.openid-link {
+  display: block;
+  margin-left: 0; /* LTR */
+}
+#user-login-form li.openid-link a,
+#user-login li.openid-link a {
+  background-image: url("login-bg.png");
+  background-position: left top; /* LTR */
+  background-repeat: no-repeat;
+  padding: 0 0 0 1.5em; /* LTR */
+}
diff --git a/htmltest/modules/openid/openid.inc b/htmltest/modules/openid/openid.inc
new file mode 100644
index 00000000..d7ef663b
--- /dev/null
+++ b/htmltest/modules/openid/openid.inc
@@ -0,0 +1,894 @@
+<?php
+
+/**
+ * @file
+ * OpenID utility functions.
+ */
+
+/**
+ * Diffie-Hellman Key Exchange Default Value.
+ *
+ * This is used to establish an association between the Relying Party and the
+ * OpenID Provider.
+ *
+ * See RFC 2631: http://www.ietf.org/rfc/rfc2631.txt
+ */
+define('OPENID_DH_DEFAULT_MOD', '155172898181473697471232257763715539915724801' .
+       '966915404479707795314057629378541917580651227423698188993727816152646631' .
+       '438561595825688188889951272158842675419950341258706556549803580104870537' .
+       '681476726513255747040765857479291291572334510643245094715007229621094194' .
+       '349783925984760375594985848253359305585439638443');
+
+/**
+ * Diffie-Hellman generator; used for Diffie-Hellman key exchange computations.
+ */
+define('OPENID_DH_DEFAULT_GEN', '2');
+
+/**
+ * SHA-1 hash block size; used for Diffie-Hellman key exchange computations.
+ */
+define('OPENID_SHA1_BLOCKSIZE', 64);
+
+/**
+ * Random number generator; used for Diffie-Hellman key exchange computations.
+ */
+define('OPENID_RAND_SOURCE', '/dev/urandom');
+
+/**
+ * OpenID Authentication 2.0 namespace URL.
+ */
+define('OPENID_NS_2_0', 'http://specs.openid.net/auth/2.0');
+
+/**
+ * OpenID Authentication 1.1 namespace URL; used for backwards-compatibility.
+ */
+define('OPENID_NS_1_1', 'http://openid.net/signon/1.1');
+
+/**
+ * OpenID Authentication 1.0 namespace URL; used for backwards-compatibility.
+ */
+define('OPENID_NS_1_0', 'http://openid.net/signon/1.0');
+
+/**
+ * OpenID namespace used in Yadis documents.
+ */
+define('OPENID_NS_OPENID', 'http://openid.net/xmlns/1.0');
+
+/**
+ * OpenID Simple Registration extension.
+ */
+define('OPENID_NS_SREG', 'http://openid.net/extensions/sreg/1.1');
+
+/**
+ * OpenID Attribute Exchange extension.
+ */
+define('OPENID_NS_AX', 'http://openid.net/srv/ax/1.0');
+
+/**
+ * Extensible Resource Descriptor documents.
+ */
+define('OPENID_NS_XRD', 'xri://$xrd*($v*2.0)');
+
+/**
+ * Performs an HTTP 302 redirect (for the 1.x protocol).
+ */
+function openid_redirect_http($url, $message) {
+  $query = array();
+  foreach ($message as $key => $val) {
+    $query[] = $key . '=' . urlencode($val);
+  }
+
+  $sep = (strpos($url, '?') === FALSE) ? '?' : '&';
+  header('Location: ' . $url . $sep . implode('&', $query), TRUE, 302);
+
+  drupal_exit();
+}
+
+/**
+ * Creates a js auto-submit redirect for (for the 2.x protocol)
+ */
+function openid_redirect($url, $message) {
+  global $language;
+
+  $output = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">' . "\n";
+  $output .= '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="' . $language->language . '" lang="' . $language->language . '">' . "\n";
+  $output .= "<head>\n";
+  $output .= "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n";
+  $output .= "<title>" . t('OpenID redirect') . "</title>\n";
+  $output .= "</head>\n";
+  $output .= "<body>\n";
+  $elements = drupal_get_form('openid_redirect_form', $url, $message);
+  $output .= drupal_render($elements);
+  $output .= '<script type="text/javascript">document.getElementById("openid-redirect-form").submit();</script>' . "\n";
+  $output .= "</body>\n";
+  $output .= "</html>\n";
+  print $output;
+
+  drupal_exit();
+}
+
+function openid_redirect_form($form, &$form_state, $url, $message) {
+  $form['#action'] = $url;
+  $form['#method'] = "post";
+  foreach ($message as $key => $value) {
+    $form[$key] = array(
+      '#type' => 'hidden',
+      '#name' => $key,
+      '#value' => $value,
+    );
+  }
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#prefix' => '<noscript><div>',
+    '#suffix' => '</div></noscript>',
+    '#value' => t('Send'),
+  );
+
+  return $form;
+}
+
+/**
+ * Parse an XRDS document.
+ *
+ * @param $raw_xml
+ *   A string containing the XRDS document.
+ * @return
+ *   An array of service entries.
+ */
+function _openid_xrds_parse($raw_xml) {
+  $services = array();
+
+  // For PHP version >= 5.2.11, we can use this function to protect against
+  // malicious doctype declarations and other unexpected entity loading.
+  // However, we will not rely on it, and reject any XML with a DOCTYPE.
+  $disable_entity_loader = function_exists('libxml_disable_entity_loader');
+  if ($disable_entity_loader) {
+    $load_entities = libxml_disable_entity_loader(TRUE);
+  }
+
+  // Load the XML into a DOM document.
+  $dom = new DOMDocument();
+  @$dom->loadXML($raw_xml);
+
+  // Since DOCTYPE declarations from an untrusted source could be malicious, we
+  // stop parsing here and treat the XML as invalid since XRDS documents do not
+  // require, and are not expected to have, a DOCTYPE.
+  if (isset($dom->doctype)) {
+    return array();
+  }
+
+  // Parse the DOM document for the information we need.
+  if ($xml = simplexml_import_dom($dom)) {
+    foreach ($xml->children(OPENID_NS_XRD)->XRD as $xrd) {
+      foreach ($xrd->children(OPENID_NS_XRD)->Service as $service_element) {
+        $service = array(
+          'priority' => $service_element->attributes()->priority ? (int)$service_element->attributes()->priority : PHP_INT_MAX,
+          'types' => array(),
+          'uri' => (string)$service_element->children(OPENID_NS_XRD)->URI,
+          'service' => $service_element,
+          'xrd' => $xrd,
+        );
+        foreach ($service_element->Type as $type) {
+          $service['types'][] = (string)$type;
+        }
+        if ($service_element->children(OPENID_NS_XRD)->LocalID) {
+          $service['identity'] = (string)$service_element->children(OPENID_NS_XRD)->LocalID;
+        }
+        elseif ($service_element->children(OPENID_NS_OPENID)->Delegate) {
+          $service['identity'] = (string)$service_element->children(OPENID_NS_OPENID)->Delegate;
+        }
+        else {
+          $service['identity'] = FALSE;
+        }
+        $services[] = $service;
+      }
+    }
+  }
+
+  // Return the LIBXML options to the previous state before returning.
+  if ($disable_entity_loader) {
+    libxml_disable_entity_loader($load_entities);
+  }
+
+  return $services;
+}
+
+/**
+ * Select a service element.
+ *
+ * The procedure is described in OpenID Authentication 2.0, section 7.3.2.
+ *
+ * A new entry is added to the returned array with the key 'version' and the
+ * value 1 or 2 specifying the protocol version used by the service.
+ *
+ * @param $services
+ *   An array of service arrays as returned by openid_discovery().
+ * @return
+ *   The selected service array, or NULL if no valid services were found.
+ */
+function _openid_select_service(array $services) {
+  // Extensible Resource Identifier (XRI) Resolution Version 2.0, section 4.3.3:
+  // Find the service with the highest priority (lowest integer value). If there
+  // is a tie, select a random one, not just the first in the XML document.
+  shuffle($services);
+  $selected_service = NULL;
+  $selected_type_priority = FALSE;
+
+  // Search for an OP Identifier Element.
+  foreach ($services as $service) {
+    if (!empty($service['uri'])) {
+      $type_priority = FALSE;
+      if (in_array('http://specs.openid.net/auth/2.0/server', $service['types'])) {
+        $service['version'] = 2;
+        $type_priority = 1;
+      }
+      elseif (in_array('http://specs.openid.net/auth/2.0/signon', $service['types'])) {
+        $service['version'] = 2;
+        $type_priority = 2;
+      }
+      elseif (in_array(OPENID_NS_1_0, $service['types']) || in_array(OPENID_NS_1_1, $service['types'])) {
+        $service['version'] = 1;
+        $type_priority = 3;
+      }
+
+      if ($type_priority
+          && (!$selected_service
+              || $type_priority < $selected_type_priority
+              || ($type_priority == $selected_type_priority && $service['priority'] < $selected_service['priority']))) {
+        $selected_service = $service;
+        $selected_type_priority = $type_priority;
+      }
+    }
+  }
+
+  if ($selected_service) {
+    // Unset SimpleXMLElement instances that cannot be saved in $_SESSION.
+    unset($selected_service['xrd']);
+    unset($selected_service['service']);
+  }
+
+  return $selected_service;
+}
+
+/**
+ * Determine if the given identifier is an XRI ID.
+ */
+function _openid_is_xri($identifier) {
+  // Strip the xri:// scheme from the identifier if present.
+  if (stripos($identifier, 'xri://') === 0) {
+    $identifier = substr($identifier, 6);
+  }
+
+  // Test whether the identifier starts with an XRI global context symbol or (.
+  $firstchar = substr($identifier, 0, 1);
+  if (strpos("=@+$!(", $firstchar) !== FALSE) {
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+/**
+ * Normalize the given identifier.
+ *
+ * The procedure is described in OpenID Authentication 2.0, section 7.2.
+ */
+function openid_normalize($identifier) {
+  $methods = module_invoke_all('openid_normalization_method_info');
+  drupal_alter('openid_normalization_method_info', $methods);
+
+  // Execute each method in turn, stopping after the first method accepted
+  // the identifier.
+  foreach ($methods as $method) {
+    $result = $method($identifier);
+    if ($result !== NULL) {
+      $identifier = $result;
+      break;
+    }
+  }
+
+  return $identifier;
+}
+
+/**
+ * OpenID normalization method: normalize XRI identifiers.
+ */
+function _openid_xri_normalize($identifier) {
+  if (_openid_is_xri($identifier)) {
+    if (stristr($identifier, 'xri://') !== FALSE) {
+      $identifier = substr($identifier, 6);
+    }
+    return $identifier;
+  }
+}
+
+/**
+ * OpenID normalization method: normalize URL identifiers.
+ */
+function _openid_url_normalize($url) {
+  $normalized_url = $url;
+
+  if (stristr($url, '://') === FALSE) {
+    $normalized_url = 'http://' . $url;
+  }
+
+  // Strip the fragment and fragment delimiter if present.
+  $normalized_url = strtok($normalized_url, '#');
+
+  if (substr_count($normalized_url, '/') < 3) {
+    $normalized_url .= '/';
+  }
+
+  return $normalized_url;
+}
+
+/**
+ * Create a serialized message packet as per spec: $key:$value\n .
+ */
+function _openid_create_message($data) {
+  $serialized = '';
+
+  foreach ($data as $key => $value) {
+    if ((strpos($key, ':') !== FALSE) || (strpos($key, "\n") !== FALSE) || (strpos($value, "\n") !== FALSE)) {
+      return NULL;
+    }
+    $serialized .= "$key:$value\n";
+  }
+  return $serialized;
+}
+
+/**
+ * Encode a message from _openid_create_message for HTTP Post
+ */
+function _openid_encode_message($message) {
+  $encoded_message = '';
+
+  $items = explode("\n", $message);
+  foreach ($items as $item) {
+    $parts = explode(':', $item, 2);
+
+    if (count($parts) == 2) {
+      if ($encoded_message != '') {
+        $encoded_message .= '&';
+      }
+      $encoded_message .= rawurlencode(trim($parts[0])) . '=' . rawurlencode(trim($parts[1]));
+    }
+  }
+
+  return $encoded_message;
+}
+
+/**
+ * Convert a direct communication message
+ * into an associative array.
+ */
+function _openid_parse_message($message) {
+  $parsed_message = array();
+
+  $items = explode("\n", $message);
+  foreach ($items as $item) {
+    $parts = explode(':', $item, 2);
+
+    if (count($parts) == 2) {
+      $parsed_message[$parts[0]] = $parts[1];
+    }
+  }
+
+  return $parsed_message;
+}
+
+/**
+ * Return a nonce value - formatted per OpenID spec.
+ *
+ * NOTE: This nonce is not cryptographically secure and only suitable for use
+ * by the test framework.
+ */
+function _openid_nonce() {
+  // YYYY-MM-DDThh:mm:ssZ, plus some optional extra unique characters.
+  return gmdate('Y-m-d\TH:i:s\Z') .
+    chr(mt_rand(0, 25) + 65) .
+    chr(mt_rand(0, 25) + 65) .
+    chr(mt_rand(0, 25) + 65) .
+    chr(mt_rand(0, 25) + 65);
+}
+
+/**
+ * Pull the href attribute out of an html link element.
+ */
+function _openid_link_href($rel, $html) {
+  $rel = preg_quote($rel);
+  preg_match('|<link\s+rel=["\'](.*)' . $rel . '(.*)["\'](.*)/?>|iUs', $html, $matches);
+  if (isset($matches[3])) {
+    preg_match('|href=["\']([^"]+)["\']|iU', $matches[3], $href);
+    return trim($href[1]);
+  }
+  return FALSE;
+}
+
+/**
+ * Pull the http-equiv attribute out of an html meta element
+ */
+function _openid_meta_httpequiv($equiv, $html) {
+  preg_match('|<meta\s+http-equiv=["\']' . $equiv . '["\'](.*)/?>|iUs', $html, $matches);
+  if (isset($matches[1])) {
+    preg_match('|content=["\']([^"]+)["\']|iUs', $matches[1], $content);
+    if (isset($content[1])) {
+      return $content[1];
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Sign certain keys in a message
+ * @param $association - object loaded from openid_association or openid_server_association table
+ *              - important fields are ->assoc_type and ->mac_key
+ * @param $message_array - array of entire message about to be sent
+ * @param $keys_to_sign - keys in the message to include in signature (without
+ *  'openid.' appended)
+ */
+function _openid_signature($association, $message_array, $keys_to_sign) {
+  $signature = '';
+  $sign_data = array();
+
+  foreach ($keys_to_sign as $key) {
+    if (isset($message_array['openid.' . $key])) {
+      $sign_data[$key] = $message_array['openid.' . $key];
+    }
+  }
+
+  $message = _openid_create_message($sign_data);
+  $secret = base64_decode($association->mac_key);
+  $signature = _openid_hmac($secret, $message);
+
+  return base64_encode($signature);
+}
+
+function _openid_hmac($key, $text) {
+  if (strlen($key) > OPENID_SHA1_BLOCKSIZE) {
+    $key = sha1($key, TRUE);
+  }
+
+  $key = str_pad($key, OPENID_SHA1_BLOCKSIZE, chr(0x00));
+  $ipad = str_repeat(chr(0x36), OPENID_SHA1_BLOCKSIZE);
+  $opad = str_repeat(chr(0x5c), OPENID_SHA1_BLOCKSIZE);
+  $hash1 = sha1(($key ^ $ipad) . $text, TRUE);
+  $hmac = sha1(($key ^ $opad) . $hash1, TRUE);
+
+  return $hmac;
+}
+
+function _openid_dh_base64_to_long($str) {
+  $b64 = base64_decode($str);
+
+  return _openid_dh_binary_to_long($b64);
+}
+
+function _openid_dh_long_to_base64($str) {
+  return base64_encode(_openid_dh_long_to_binary($str));
+}
+
+function _openid_dh_binary_to_long($str) {
+  $bytes = array_merge(unpack('C*', $str));
+
+  $n = 0;
+  foreach ($bytes as $byte) {
+    $n = _openid_math_mul($n, pow(2, 8));
+    $n = _openid_math_add($n, $byte);
+  }
+
+  return $n;
+}
+
+function _openid_dh_long_to_binary($long) {
+  $cmp = _openid_math_cmp($long, 0);
+  if ($cmp < 0) {
+    return FALSE;
+  }
+
+  if ($cmp == 0) {
+    return "\x00";
+  }
+
+  $bytes = array();
+
+  while (_openid_math_cmp($long, 0) > 0) {
+    array_unshift($bytes, _openid_math_mod($long, 256));
+    $long = _openid_math_div($long, pow(2, 8));
+  }
+
+  if ($bytes && ($bytes[0] > 127)) {
+    array_unshift($bytes, 0);
+  }
+
+  $string = '';
+  foreach ($bytes as $byte) {
+    $string .= pack('C', $byte);
+  }
+
+  return $string;
+}
+
+function _openid_dh_xorsecret($shared, $secret) {
+  $dh_shared_str = _openid_dh_long_to_binary($shared);
+  $sha1_dh_shared = sha1($dh_shared_str, TRUE);
+  $xsecret = "";
+  for ($i = 0; $i < strlen($secret); $i++) {
+    $xsecret .= chr(ord($secret[$i]) ^ ord($sha1_dh_shared[$i]));
+  }
+
+  return $xsecret;
+}
+
+function _openid_dh_rand($stop) {
+  $duplicate_cache = &drupal_static(__FUNCTION__, array());
+
+  // Used as the key for the duplicate cache
+  $rbytes = _openid_dh_long_to_binary($stop);
+
+  if (isset($duplicate_cache[$rbytes])) {
+    list($duplicate, $nbytes) = $duplicate_cache[$rbytes];
+  }
+  else {
+    if ($rbytes[0] == "\x00") {
+      $nbytes = strlen($rbytes) - 1;
+    }
+    else {
+      $nbytes = strlen($rbytes);
+    }
+
+    $mxrand = _openid_math_pow(256, $nbytes);
+
+    // If we get a number less than this, then it is in the
+    // duplicated range.
+    $duplicate = _openid_math_mod($mxrand, $stop);
+
+    if (count($duplicate_cache) > 10) {
+      $duplicate_cache = array();
+    }
+
+    $duplicate_cache[$rbytes] = array($duplicate, $nbytes);
+  }
+
+  do {
+    $bytes = "\x00" . drupal_random_bytes($nbytes);
+    $n = _openid_dh_binary_to_long($bytes);
+    // Keep looping if this value is in the low duplicated range.
+  } while (_openid_math_cmp($n, $duplicate) < 0);
+
+  return _openid_math_mod($n, $stop);
+}
+
+function _openid_get_bytes($num_bytes) {
+  return drupal_random_bytes($num_bytes);
+}
+
+function _openid_response($str = NULL) {
+  $data = array();
+
+  if (isset($_SERVER['REQUEST_METHOD'])) {
+    $data = _openid_get_params($_SERVER['QUERY_STRING']);
+
+    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+      $str = file_get_contents('php://input');
+
+      $post = array();
+      if ($str !== FALSE) {
+        $post = _openid_get_params($str);
+      }
+
+      $data = array_merge($data, $post);
+    }
+  }
+
+  return $data;
+}
+
+function _openid_get_params($str) {
+  $chunks = explode("&", $str);
+
+  $data = array();
+  foreach ($chunks as $chunk) {
+    $parts = explode("=", $chunk, 2);
+
+    if (count($parts) == 2) {
+      list($k, $v) = $parts;
+      $data[$k] = urldecode($v);
+    }
+  }
+  return $data;
+}
+
+/**
+ * Extract all the parameters belonging to an extension in a response message.
+ *
+ * OpenID 2.0 defines a simple extension mechanism, based on a namespace prefix.
+ *
+ * Each request or response can define a prefix using:
+ * @code
+ *   openid.ns.[prefix] = [extension_namespace]
+ *   openid.[prefix].[key1] = [value1]
+ *   openid.[prefix].[key2] = [value2]
+ *   ...
+ * @endcode
+ *
+ * This function extracts all the keys belonging to an extension namespace in a
+ * response, optionally using a fallback prefix if none is provided in the response.
+ *
+ * Note that you cannot assume that a given extension namespace will use the same
+ * prefix on the response and the request: each party may use a different prefix
+ * to refer to the same namespace.
+ *
+ * @param $response
+ *   The response array.
+ * @param $extension_namespace
+ *   The namespace of the extension.
+ * @param $fallback_prefix
+ *   An optional prefix that will be used in case no prefix is found for the
+ *   target extension namespace.
+ * @param $only_signed
+ *   Return only keys that are included in the message signature in openid.sig.
+ *   Unsigned fields may have been modified or added by other parties than the
+ *   OpenID Provider.
+ *
+ * @return
+ *   An associative array containing all the parameters in the response message
+ *   that belong to the extension. The keys are stripped from their namespace
+ *   prefix.
+ *
+ * @see http://openid.net/specs/openid-authentication-2_0.html#extensions
+ */
+function openid_extract_namespace($response, $extension_namespace, $fallback_prefix = NULL, $only_signed = FALSE) {
+  $signed_keys = explode(',', $response['openid.signed']);
+
+  // Find the namespace prefix.
+  $prefix = $fallback_prefix;
+  foreach ($response as $key => $value) {
+    if ($value == $extension_namespace && preg_match('/^openid\.ns\.([^.]+)$/', $key, $matches)) {
+      $prefix = $matches[1];
+      if ($only_signed && !in_array('ns.' . $matches[1], $signed_keys)) {
+        // The namespace was defined but was not signed as required. In this
+        // case we do not fall back to $fallback_prefix.
+        $prefix = NULL;
+      }
+      break;
+    }
+  }
+
+  // Now extract the namespace keys from the response.
+  $output = array();
+  if (!isset($prefix)) {
+    return $output;
+  }
+  foreach ($response as $key => $value) {
+    if (preg_match('/^openid\.' . $prefix . '\.(.+)$/', $key, $matches)) {
+      $local_key = $matches[1];
+      if (!$only_signed || in_array($prefix . '.' . $local_key, $signed_keys)) {
+        $output[$local_key] = $value;
+      }
+    }
+  }
+
+  return $output;
+}
+
+/**
+ * Extracts values from an OpenID AX Response.
+ *
+ * The values can be returned in two forms:
+ *   - only openid.ax.value.<alias> (for single-valued answers)
+ *   - both openid.ax.count.<alias> and openid.ax.value.<alias>.<count> (for both
+ *     single and multiple-valued answers)
+ *
+ * @param $values
+ *   An array as returned by openid_extract_namespace(..., OPENID_NS_AX).
+ * @param $uris
+ *   An array of identifier URIs.
+ * @return
+ *   An array of values.
+ * @see http://openid.net/specs/openid-attribute-exchange-1_0.html#fetch_response
+ */
+function openid_extract_ax_values($values, $uris) {
+  $output = array();
+  foreach ($values as $key => $value) {
+    if (in_array($value, $uris) && preg_match('/^type\.([^.]+)$/', $key, $matches)) {
+      $alias = $matches[1];
+      if (isset($values['count.' . $alias])) {
+        for ($i = 1; $i <= $values['count.' . $alias]; $i++) {
+          $output[] = $values['value.' . $alias . '.' . $i];
+        }
+      }
+      elseif (isset($values['value.' . $alias])) {
+        $output[] = $values['value.' . $alias];
+      }
+      break;
+    }
+  }
+  return $output;
+}
+
+/**
+ * Determine the available math library GMP vs. BCMath, favouring GMP for performance.
+ */
+function _openid_get_math_library() {
+  // Not drupal_static(), because a function is not going to disappear and
+  // change the output of this under any circumstances.
+  static $library;
+
+  if (empty($library)) {
+    if (function_exists('gmp_add')) {
+      $library =  'gmp';
+    }
+    elseif (function_exists('bcadd')) {
+      $library = 'bcmath';
+    }
+  }
+
+  return $library;
+}
+
+/**
+ * Calls the add function from the available math library for OpenID.
+ */
+function _openid_math_add($x, $y) {
+  $library = _openid_get_math_library();
+  switch ($library) {
+    case 'gmp':
+      return gmp_strval(gmp_add($x, $y));
+    case 'bcmath':
+      return bcadd($x, $y);
+  }
+}
+
+/**
+ * Calls the mul function from the available math library for OpenID.
+ */
+function _openid_math_mul($x, $y) {
+  $library = _openid_get_math_library();
+  switch ($library) {
+    case 'gmp':
+      return gmp_mul($x, $y);
+    case 'bcmath':
+      return bcmul($x, $y);
+  }
+}
+
+/**
+ * Calls the div function from the available math library for OpenID.
+ */
+function _openid_math_div($x, $y) {
+  $library = _openid_get_math_library();
+  switch ($library) {
+    case 'gmp':
+      return gmp_div($x, $y);
+    case 'bcmath':
+      return bcdiv($x, $y);
+  }
+}
+
+/**
+ * Calls the cmp function from the available math library for OpenID.
+ */
+function _openid_math_cmp($x, $y) {
+  $library = _openid_get_math_library();
+  switch ($library) {
+    case 'gmp':
+      return gmp_cmp($x, $y);
+    case 'bcmath':
+      return bccomp($x, $y);
+  }
+}
+
+/**
+ * Calls the mod function from the available math library for OpenID.
+ */
+function _openid_math_mod($x, $y) {
+  $library = _openid_get_math_library();
+  switch ($library) {
+    case 'gmp':
+      return gmp_mod($x, $y);
+    case 'bcmath':
+      return bcmod($x, $y);
+  }
+}
+
+/**
+ * Calls the pow function from the available math library for OpenID.
+ */
+function _openid_math_pow($x, $y) {
+  $library = _openid_get_math_library();
+  switch ($library) {
+    case 'gmp':
+      return gmp_pow($x, $y);
+    case 'bcmath':
+      return bcpow($x, $y);
+  }
+}
+
+/**
+ * Calls the mul function from the available math library for OpenID.
+ */
+function _openid_math_powmod($x, $y, $z) {
+  $library = _openid_get_math_library();
+  switch ($library) {
+    case 'gmp':
+      return gmp_powm($x, $y, $z);
+    case 'bcmath':
+      return bcpowmod($x, $y, $z);
+  }
+}
+
+/**
+ * Provides transition for accounts with possibly invalid OpenID identifiers in authmap.
+ *
+ * This function provides a less safe but more unobtrusive procedure for users
+ * who cannot login with their OpenID identifiers. OpenID identifiers in the
+ * authmap could be incomplete due to invalid OpenID implementation in previous
+ * versions of Drupal (e.g. fragment part of the identifier could be missing).
+ * For more information see http://drupal.org/node/1120290.
+ *
+ * @param string $identity
+ *   The user's claimed OpenID identifier.
+ *
+ * @return
+ *   A fully-loaded user object if the user is found or FALSE if not found.
+ */
+function _openid_invalid_openid_transition($identity, $response) {
+  $account = FALSE;
+  $fallback_account = NULL;
+  $fallback_identity = $identity;
+
+  // Try to strip the fragment if it is present.
+  if (strpos($fallback_identity, '#') !== FALSE) {
+    $fallback_identity = preg_replace('/#.*/', '', $fallback_identity);
+    $fallback_account = user_external_load($fallback_identity);
+  }
+
+  // Try to replace HTTPS with HTTP. OpenID providers often redirect
+  // from http to https, but Drupal didn't follow the redirect.
+  if (!$fallback_account && strpos($fallback_identity, 'https://') !== FALSE) {
+    $fallback_identity = str_replace('https://', 'http://', $fallback_identity);
+    $fallback_account = user_external_load($fallback_identity);
+  }
+
+  // Try to use original identifier.
+  if (!$fallback_account && isset($_SESSION['openid']['user_login_values']['openid_identifier'])) {
+    $fallback_identity = openid_normalize($_SESSION['openid']['user_login_values']['openid_identifier']);
+    $fallback_account = user_external_load($fallback_identity);
+  }
+
+  if ($fallback_account) {
+    // Try to extract e-mail address from Simple Registration (SREG) or
+    // Attribute Exchanges (AX) keys.
+    $email = '';
+    $sreg_values = openid_extract_namespace($response, OPENID_NS_SREG, 'sreg', TRUE);
+    $ax_values = openid_extract_namespace($response, OPENID_NS_AX, 'ax', TRUE);
+    if (!empty($sreg_values['email']) && valid_email_address($sreg_values['email'])) {
+      $email = $sreg_values['email'];
+    }
+    elseif ($ax_mail_values = openid_extract_ax_values($ax_values, array('http://axschema.org/contact/email', 'http://schema.openid.net/contact/email'))) {
+      $email = current($ax_mail_values);
+    }
+
+    // If this e-mail address is the same as the e-mail address found in user
+    // account, login the user and update the claimed identifier.
+    if ($email && ($email == $fallback_account->mail || $email == $fallback_account->init)) {
+      $query = db_insert('authmap')
+        ->fields(array(
+          'authname' => $identity,
+          'uid' => $fallback_account->uid,
+          'module' => 'openid',
+        ))
+        ->execute();
+      drupal_set_message(t('New OpenID identifier %identity was added as a replacement for invalid identifier %invalid_identity. To finish the invalid OpenID transition process, please go to your <a href="@openid_url">OpenID identities page</a> and remove the old identifier %invalid_identity.', array('%invalid_identity' => $fallback_identity, '%identity' => $identity, '@openid_url' => 'user/' . $fallback_account->uid . '/openid')));
+      // Set the account to the found one.
+      $account = $fallback_account;
+    }
+    else {
+      drupal_set_message(t('There is already an existing account associated with the OpenID identifier that you have provided. However, due to a bug in the previous version of the authentication system, we can\'t be sure that this account belongs to you. If you are new on this site, please continue registering the new user account. If you already have a registered account on this site associated with the provided OpenID identifier, please try to <a href="@url_password">reset the password</a> or contact the site administrator.', array('@url_password' => 'user/password')), 'warning');
+    }
+  }
+
+  return $account;
+}
diff --git a/htmltest/modules/openid/openid.info b/htmltest/modules/openid/openid.info
new file mode 100644
index 00000000..172f0f72
--- /dev/null
+++ b/htmltest/modules/openid/openid.info
@@ -0,0 +1,12 @@
+name = OpenID
+description = "Allows users to log into your site using OpenID."
+version = VERSION
+package = Core
+core = 7.x
+files[] = openid.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/openid/openid.install b/htmltest/modules/openid/openid.install
new file mode 100644
index 00000000..4b77b710
--- /dev/null
+++ b/htmltest/modules/openid/openid.install
@@ -0,0 +1,160 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the openid module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function openid_schema() {
+  $schema['openid_association'] = array(
+    'description' => 'Stores temporary shared key association information for OpenID authentication.',
+    'fields' => array(
+      'idp_endpoint_uri' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'description' => 'URI of the OpenID Provider endpoint.',
+      ),
+      'assoc_handle' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'description' => 'Primary Key: Used to refer to this association in subsequent messages.',
+      ),
+      'assoc_type' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'description' => 'The signature algorithm used: one of HMAC-SHA1 or HMAC-SHA256.',
+      ),
+      'session_type' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'description' => 'Valid association session types: "no-encryption", "DH-SHA1", and "DH-SHA256".',
+      ),
+      'mac_key' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'description' => 'The MAC key (shared secret) for this association.',
+      ),
+      'created' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'UNIX timestamp for when the association was created.',
+      ),
+      'expires_in' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The lifetime, in seconds, of this association.',
+      ),
+    ),
+    'primary key' => array('assoc_handle'),
+  );
+
+  $schema['openid_nonce'] = array(
+    'description' => 'Stores received openid.response_nonce per OpenID endpoint URL to prevent replay attacks.',
+    'fields' => array(
+      'idp_endpoint_uri' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'description' => 'URI of the OpenID Provider endpoint.',
+      ),
+      'nonce' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'description' => 'The value of openid.response_nonce.',
+      ),
+      'expires' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'A Unix timestamp indicating when the entry should expire.',
+      ),
+    ),
+    'indexes' => array(
+      'nonce' => array('nonce'),
+      'expires' => array('expires'),
+    ),
+  );
+
+  return $schema;
+}
+
+/**
+ * Implements hook_requirements().
+ */
+function openid_requirements($phase) {
+  $requirements = array();
+
+  if ($phase == 'runtime') {
+    // Check for the PHP BC Math library.
+    if (!function_exists('bcadd') && !function_exists('gmp_add')) {
+      $requirements['openid_math'] = array(
+        'value' => t('Not installed'),
+        'severity' => REQUIREMENT_ERROR,
+        'description' => t('OpenID suggests the use of either the <a href="@gmp">GMP Math</a> (recommended for performance) or <a href="@bc">BC Math</a> libraries to enable OpenID associations.', array('@gmp' => 'http://php.net/manual/en/book.gmp.php', '@bc' => 'http://www.php.net/manual/en/book.bc.php')),
+      );
+    }
+    elseif (!function_exists('gmp_add')) {
+      $requirements['openid_math'] = array(
+        'value' => t('Not optimized'),
+        'severity' => REQUIREMENT_WARNING,
+        'description' => t('OpenID suggests the use of the GMP Math library for PHP for optimal performance. Check the <a href="@url">GMP Math Library documentation</a> for installation instructions.', array('@url' => 'http://www.php.net/manual/en/book.gmp.php')),
+      );
+    }
+    else {
+      $requirements['openid_math'] = array(
+        'value' => t('Installed'),
+        'severity' => REQUIREMENT_OK,
+      );
+    }
+    $requirements['openid_math']['title'] = t('OpenID Math library');
+  }
+
+  return $requirements;
+}
+
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Add a table to store nonces.
+ */
+function openid_update_6000() {
+  $schema['openid_nonce'] = array(
+    'description' => 'Stores received openid.response_nonce per OpenID endpoint URL to prevent replay attacks.',
+    'fields' => array(
+      'idp_endpoint_uri' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'description' => 'URI of the OpenID Provider endpoint.',
+      ),
+      'nonce' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'description' => 'The value of openid.response_nonce'
+        ),
+      'expires' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'A Unix timestamp indicating when the entry should expire.',
+        ),
+      ),
+    'indexes' => array(
+      'nonce' => array('nonce'),
+      'expires' => array('expires'),
+    ),
+  );
+
+  db_create_table('openid_nonce', $schema['openid_nonce']);
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x".
+ */
diff --git a/htmltest/modules/openid/openid.js b/htmltest/modules/openid/openid.js
new file mode 100644
index 00000000..4a09e5a4
--- /dev/null
+++ b/htmltest/modules/openid/openid.js
@@ -0,0 +1,49 @@
+(function ($) {
+
+Drupal.behaviors.openid = {
+  attach: function (context) {
+    var loginElements = $('.form-item-name, .form-item-pass, li.openid-link');
+    var openidElements = $('.form-item-openid-identifier, li.user-link');
+    var cookie = $.cookie('Drupal.visitor.openid_identifier');
+
+    // This behavior attaches by ID, so is only valid once on a page.
+    if (!$('#edit-openid-identifier.openid-processed').length) {
+      if (cookie) {
+        $('#edit-openid-identifier').val(cookie);
+      }
+      if ($('#edit-openid-identifier').val() || location.hash == '#openid-login') {
+        $('#edit-openid-identifier').addClass('openid-processed');
+        loginElements.hide();
+        // Use .css('display', 'block') instead of .show() to be Konqueror friendly.
+        openidElements.css('display', 'block');
+      }
+    }
+
+    $('li.openid-link:not(.openid-processed)', context)
+      .addClass('openid-processed')
+      .click(function () {
+         loginElements.hide();
+         openidElements.css('display', 'block');
+        // Remove possible error message.
+        $('#edit-name, #edit-pass').removeClass('error');
+        $('div.messages.error').hide();
+        // Set focus on OpenID Identifier field.
+        $('#edit-openid-identifier')[0].focus();
+        return false;
+      });
+    $('li.user-link:not(.openid-processed)', context)
+      .addClass('openid-processed')
+      .click(function () {
+         openidElements.hide();
+         loginElements.css('display', 'block');
+        // Clear OpenID Identifier field and remove possible error message.
+        $('#edit-openid-identifier').val('').removeClass('error');
+        $('div.messages.error').css('display', 'block');
+        // Set focus on username field.
+        $('#edit-name')[0].focus();
+        return false;
+      });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/openid/openid.module b/htmltest/modules/openid/openid.module
new file mode 100644
index 00000000..1f764e04
--- /dev/null
+++ b/htmltest/modules/openid/openid.module
@@ -0,0 +1,1033 @@
+<?php
+
+/**
+ * @file
+ * Implement OpenID Relying Party support for Drupal
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function openid_menu() {
+  $items['openid/authenticate'] = array(
+    'title' => 'OpenID Login',
+    'page callback' => 'openid_authentication_page',
+    'access callback' => 'user_is_anonymous',
+    'type' => MENU_CALLBACK,
+    'file' => 'openid.pages.inc',
+  );
+  $items['user/%user/openid'] = array(
+    'title' => 'OpenID identities',
+    'page callback' => 'openid_user_identities',
+    'page arguments' => array(1),
+    'access callback' => 'user_edit_access',
+    'access arguments' => array(1),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'openid.pages.inc',
+  );
+  $items['user/%user/openid/delete'] = array(
+    'title' => 'Delete OpenID',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('openid_user_delete_form', 1),
+    'access callback' => 'user_edit_access',
+    'access arguments' => array(1),
+    'file' => 'openid.pages.inc',
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_menu_site_status_alter().
+ */
+function openid_menu_site_status_alter(&$menu_site_status, $path) {
+  // Allow access to openid/authenticate even if site is in offline mode.
+  if ($menu_site_status == MENU_SITE_OFFLINE && user_is_anonymous() && $path == 'openid/authenticate') {
+    $menu_site_status = MENU_SITE_ONLINE;
+  }
+}
+
+/**
+ * Implements hook_admin_paths().
+ */
+function openid_admin_paths() {
+  $paths = array(
+    'user/*/openid' => TRUE,
+    'user/*/openid/delete' => TRUE,
+  );
+  return $paths;
+}
+
+/**
+ * Implements hook_help().
+ */
+function openid_help($path, $arg) {
+  switch ($path) {
+    case 'user/%/openid':
+      $output = '<p>' . t('This site supports <a href="@openid-net">OpenID</a>, a secure way to log in to many websites using a single username and password. OpenID can reduce the necessity of managing many usernames and passwords for many websites.', array('@openid-net' => 'http://openid.net')) . '</p>';
+      $output .= '<p>' . t('To use OpenID you must first establish an identity on a public or private OpenID server. If you do not have an OpenID and would like one, look into one of the <a href="@openid-providers">free public providers</a>. You can find out more about OpenID at <a href="@openid-net">this website</a>.', array('@openid-providers' => 'http://openid.net/get/', '@openid-net' => 'http://openid.net')) . '</p>';
+      $output .= '<p>' . t('If you already have an OpenID, enter the URL to your OpenID server below (e.g. myusername.openidprovider.com). Next time you log in, you will be able to use this URL instead of a regular username and password. You can have multiple OpenID servers if you like; just keep adding them here.') . '</p>';
+      return $output;
+    case 'admin/help#openid':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The OpenID module allows users to log in using the OpenID single sign on service. <a href="@openid-net">OpenID</a> is a secure method for logging into many websites with a single username and password. It does not require special software, and it does not share passwords with any site to which it is associated, including the site being logged into. The main benefit to users is that they can have a single password that they can use on many websites. This means they can easily update their single password from a centralized location, rather than having to change dozens of passwords individually. For more information, see the online handbook entry for <a href="@handbook">OpenID module</a>.', array('@openid-net' => 'http://openid.net', '@handbook' => 'http://drupal.org/documentation/modules/openid')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Logging in with OpenID') . '</dt>';
+      $output .= '<dd>' . t("To log in using OpenID, a user must already have an OpenID account. Users can then create site accounts using their OpenID, assign one or more OpenIDs to an existing account, and log in using an OpenID. This lowers the barrier to registration, which helps increase the user base, and offers convenience and security to the users. Because OpenID cannot guarantee a user is legitimate, email verification is still necessary. When logging in, users are presented with the option of entering their OpenID URL, which will look like <em>myusername.openidprovider.com</em>. The site then communicates with the OpenID server, asking it to verify the identity of the user. If the user is logged into their OpenID server, the server communicates back to your site, verifying the user. If they are not logged in, the OpenID server will ask the user for their password. At no point does the site being logged into record the user's OpenID password.") . '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_user_insert().
+ */
+function openid_user_insert(&$edit, $account, $category) {
+  if (!empty($edit['openid_claimed_id'])) {
+    // The user has registered after trying to log in via OpenID.
+    if (variable_get('user_email_verification', TRUE)) {
+      drupal_set_message(t('Once you have verified your e-mail address, you may log in via OpenID.'));
+    }
+    user_set_authmaps($account, array('authname_openid' => $edit['openid_claimed_id']));
+    unset($_SESSION['openid']);
+    unset($edit['openid_claimed_id']);
+  }
+}
+
+/**
+ * Implements hook_user_login().
+ *
+ * Save openid_identifier to visitor cookie.
+ */
+function openid_user_login(&$edit, $account) {
+  if (isset($_SESSION['openid'])) {
+    // The user has logged in via OpenID.
+    user_cookie_save(array_intersect_key($_SESSION['openid']['user_login_values'], array_flip(array('openid_identifier'))));
+    unset($_SESSION['openid']);
+  }
+}
+
+/**
+ * Implements hook_user_logout().
+ *
+ * Delete any openid_identifier in visitor cookie.
+ */
+function openid_user_logout($account) {
+  if (isset($_COOKIE['Drupal_visitor_openid_identifier'])) {
+    user_cookie_delete('openid_identifier');
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function openid_form_user_login_block_alter(&$form, &$form_state) {
+  _openid_user_login_form_alter($form, $form_state);
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function openid_form_user_login_alter(&$form, &$form_state) {
+  _openid_user_login_form_alter($form, $form_state);
+}
+
+function _openid_user_login_form_alter(&$form, &$form_state) {
+  $form['#attached']['css'][] = drupal_get_path('module', 'openid') . '/openid.css';
+  $form['#attached']['js'][] = drupal_get_path('module', 'openid') . '/openid.js';
+  $form['#attached']['library'][] = array('system', 'jquery.cookie');
+  if (!empty($form_state['input']['openid_identifier'])) {
+    $form['name']['#required'] = FALSE;
+    $form['pass']['#required'] = FALSE;
+    unset($form['#submit']);
+    $form['#validate'] = array('openid_login_validate');
+  }
+
+  $items = array();
+  $items[] = array(
+    'data' => l(t('Log in using OpenID'), '#openid-login', array('external' => TRUE)),
+    'class' => array('openid-link'),
+  );
+  $items[] = array(
+    'data' => l(t('Cancel OpenID login'), '#', array('external' => TRUE)),
+    'class' => array('user-link'),
+  );
+
+  $form['openid_links'] = array(
+    '#theme' => 'item_list',
+    '#items' => $items,
+    '#attributes' => array('class' => array('openid-links')),
+    '#weight' => 1,
+  );
+
+  $form['links']['#weight'] = 2;
+
+  $form['openid_identifier'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Log in using OpenID'),
+    '#size' => $form['name']['#size'],
+    '#maxlength' => 255,
+    '#weight' => -1,
+    '#description' => l(t('What is OpenID?'), 'http://openid.net/', array('external' => TRUE)),
+  );
+  $form['openid.return_to'] = array('#type' => 'hidden', '#value' => url('openid/authenticate', array('absolute' => TRUE, 'query' => user_login_destination())));
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Prefills the login form with values acquired via OpenID.
+ */
+function openid_form_user_register_form_alter(&$form, &$form_state) {
+  if (isset($_SESSION['openid']['response'])) {
+    module_load_include('inc', 'openid');
+
+    $response = $_SESSION['openid']['response'];
+
+    // Extract Simple Registration keys from the response. We only include
+    // signed keys as required by OpenID Simple Registration Extension 1.0,
+    // section 4.
+    $sreg_values = openid_extract_namespace($response, OPENID_NS_SREG, 'sreg', TRUE);
+    // Extract Attribute Exchanges keys from the response. We only include
+    // signed keys. This is not required by the specification, but it is
+    // recommended by Google, see
+    // http://googlecode.blogspot.com/2011/05/security-advisory-to-websites-using.html
+    $ax_values = openid_extract_namespace($response, OPENID_NS_AX, 'ax', TRUE);
+
+    if (!empty($sreg_values['nickname'])) {
+      // Use the nickname returned by Simple Registration if available.
+      $form['account']['name']['#default_value'] = $sreg_values['nickname'];
+    }
+    elseif ($ax_name_values = openid_extract_ax_values($ax_values, array('http://axschema.org/namePerson/friendly', 'http://schema.openid.net/namePerson/friendly'))) {
+      // Else, use the first nickname returned by AX if available.
+      $form['account']['name']['#default_value'] = current($ax_name_values);
+    }
+    else {
+      $form['account']['name']['#default_value'] = '';
+    }
+
+    if (!empty($sreg_values['email'])) {
+      // Use the email returned by Simple Registration if available.
+      $form['account']['mail']['#default_value'] = $sreg_values['email'];
+    }
+    elseif ($ax_mail_values = openid_extract_ax_values($ax_values, array('http://axschema.org/contact/email', 'http://schema.openid.net/contact/email'))) {
+      // Else, use the first nickname returned by AX if available.
+      $form['account']['mail']['#default_value'] = current($ax_mail_values);
+    }
+
+    // If user_email_verification is off, hide the password field and just fill
+    // with random password to avoid confusion.
+    if (!variable_get('user_email_verification', TRUE)) {
+      $form['account']['pass']['#type'] = 'hidden';
+      $form['account']['pass']['#value'] = user_password();
+    }
+
+    $form['openid_claimed_id'] = array(
+      '#type' => 'value',
+      '#default_value' => $response['openid.claimed_id'],
+    );
+    $form['openid_display'] = array(
+      '#type' => 'item',
+      '#title' => t('Your OpenID'),
+      '#description' => t('This OpenID will be attached to your account after registration.'),
+      '#markup' => check_plain($response['openid.claimed_id']),
+    );
+  }
+}
+
+/**
+ * Login form _validate hook
+ */
+function openid_login_validate($form, &$form_state) {
+  $return_to = $form_state['values']['openid.return_to'];
+  if (empty($return_to)) {
+    $return_to = url('', array('absolute' => TRUE));
+  }
+
+  openid_begin($form_state['values']['openid_identifier'], $return_to, $form_state['values']);
+}
+
+/**
+ * The initial step of OpenID authentication responsible for the following:
+ *  - Perform discovery on the claimed OpenID.
+ *  - If possible, create an association with the Provider's endpoint.
+ *  - Create the authentication request.
+ *  - Perform the appropriate redirect.
+ *
+ * @param $claimed_id The OpenID to authenticate
+ * @param $return_to The endpoint to return to from the OpenID Provider
+ */
+function openid_begin($claimed_id, $return_to = '', $form_values = array()) {
+  module_load_include('inc', 'openid');
+
+  $service = NULL;
+  $claimed_id = openid_normalize($claimed_id);
+  $discovery = openid_discovery($claimed_id);
+
+  if (!empty($discovery['services'])) {
+    $service = _openid_select_service($discovery['services']);
+  }
+
+  // Quit if the discovery result was empty or if we can't select any service.
+  if (!$discovery || !$service) {
+    form_set_error('openid_identifier', t('Sorry, that is not a valid OpenID. Ensure you have spelled your ID correctly.'));
+    return;
+  }
+
+  // Set claimed id from discovery.
+  if (!empty($discovery['claimed_id'])) {
+    $claimed_id = $discovery['claimed_id'];
+  }
+
+  // Store discovered information in the users' session so we don't have to rediscover.
+  $_SESSION['openid']['service'] = $service;
+  // Store the claimed id
+  $_SESSION['openid']['claimed_id'] = $claimed_id;
+  // Store the login form values so we can pass them to
+  // user_exteral_login later.
+  $_SESSION['openid']['user_login_values'] = $form_values;
+
+  // If a supported math library is present, then create an association.
+  $assoc_handle = '';
+  if (_openid_get_math_library()) {
+    $assoc_handle = openid_association($service['uri']);
+  }
+
+  if (in_array('http://specs.openid.net/auth/2.0/server', $service['types'])) {
+    // User entered an OP Identifier.
+    $claimed_id = $identity = 'http://specs.openid.net/auth/2.0/identifier_select';
+  }
+  else {
+    // Use Claimed ID and/or OP-Local Identifier from service description, if
+    // available.
+    if (!empty($service['claimed_id'])) {
+      $claimed_id = $service['claimed_id'];
+    }
+    $identity = !empty($service['identity']) ? $service['identity'] : $claimed_id;
+  }
+  $request = openid_authentication_request($claimed_id, $identity, $return_to, $assoc_handle, $service);
+
+  if ($service['version'] == 2) {
+    openid_redirect($service['uri'], $request);
+  }
+  else {
+    openid_redirect_http($service['uri'], $request);
+  }
+}
+
+/**
+ * Completes OpenID authentication by validating returned data from the OpenID
+ * Provider.
+ *
+ * @param $response Array of returned values from the OpenID Provider.
+ *
+ * @return $response Response values for further processing with
+ *   $response['status'] set to one of 'success', 'failed' or 'cancel'.
+ */
+function openid_complete($response = array()) {
+  module_load_include('inc', 'openid');
+
+  if (count($response) == 0) {
+    $response = _openid_response();
+  }
+
+  // Default to failed response
+  $response['status'] = 'failed';
+  if (isset($_SESSION['openid']['service']['uri']) && isset($_SESSION['openid']['claimed_id'])) {
+    $service = $_SESSION['openid']['service'];
+    $claimed_id = $_SESSION['openid']['claimed_id'];
+    unset($_SESSION['openid']['service']);
+    unset($_SESSION['openid']['claimed_id']);
+    if (isset($response['openid.mode'])) {
+      if ($response['openid.mode'] == 'cancel') {
+        $response['status'] = 'cancel';
+      }
+      else {
+        if (openid_verify_assertion($service, $response)) {
+          // OpenID Authentication, section 7.3.2.3 and Appendix A.5:
+          // The CanonicalID specified in the XRDS document must be used as the
+          // account key. We rely on the XRI proxy resolver to verify that the
+          // provider is authorized to respond on behalf of the specified
+          // identifer (required per Extensible Resource Identifier (XRI)
+          // (XRI) Resolution Version 2.0, section 14.3):
+          if (!empty($service['claimed_id'])) {
+            $response['openid.claimed_id'] = $service['claimed_id'];
+          }
+          elseif ($service['version'] == 2) {
+            // Returned Claimed Identifier could contain unique fragment
+            // identifier to allow identifier recycling so we need to preserve
+            // it in the response.
+            $response_claimed_id = openid_normalize($response['openid.claimed_id']);
+
+            // OpenID Authentication, section 11.2:
+            // If the returned Claimed Identifier is different from the one sent
+            // to the OpenID Provider, we need to do discovery on the returned
+            // identififer to make sure that the provider is authorized to
+            // respond on behalf of this.
+            if ($response_claimed_id != $claimed_id) {
+              $discovery = openid_discovery($response['openid.claimed_id']);
+              if ($discovery && !empty($discovery['services'])) {
+                $uris = array();
+                foreach ($discovery['services'] as $discovered_service) {
+                  if (in_array('http://specs.openid.net/auth/2.0/server', $discovered_service['types']) || in_array('http://specs.openid.net/auth/2.0/signon', $discovered_service['types'])) {
+                    $uris[] = $discovered_service['uri'];
+                  }
+                }
+              }
+              if (!in_array($service['uri'], $uris)) {
+                return $response;
+              }
+            }
+          }
+          else {
+            $response['openid.claimed_id'] = $claimed_id;
+          }
+          $response['status'] = 'success';
+        }
+      }
+    }
+  }
+  return $response;
+}
+
+/**
+ * Perform discovery on a claimed ID to determine the OpenID provider endpoint.
+ *
+ * Discovery methods are provided by the hook_openid_discovery_method_info and
+ * could be further altered using the hook_openid_discovery_method_info_alter.
+ *
+ * @param $claimed_id
+ *   The OpenID URL to perform discovery on.
+ *
+ * @return
+ *   The resulting discovery array from the first successful discovery method,
+ *   which must contain following keys:
+ *   - 'services' (required) an array of discovered services (including OpenID
+ *   version, endpoint URI, etc).
+ *   - 'claimed_id' (optional) new claimed identifer, found by following HTTP
+ *   redirects during the services discovery.
+ *   If all the discovery method fails or if no appropriate discovery method is
+ *   found, FALSE is returned.
+ */
+function openid_discovery($claimed_id) {
+  module_load_include('inc', 'openid');
+
+  $methods = module_invoke_all('openid_discovery_method_info');
+  drupal_alter('openid_discovery_method_info', $methods);
+
+  // Execute each method in turn and return first successful discovery.
+  foreach ($methods as $method) {
+    $discovery = $method($claimed_id);
+    if (!empty($discovery)) {
+      return $discovery;
+    }
+  }
+
+  return FALSE;
+}
+
+/**
+ * Implements hook_openid_discovery_method_info().
+ *
+ * Define standard discovery methods.
+ */
+function openid_openid_discovery_method_info() {
+  // The discovery process will stop as soon as one discovery method succeed.
+  // We first attempt to discover XRI-based identifiers, then standard XRDS
+  // identifiers via Yadis and HTML-based discovery, conforming to the OpenID 2.0
+  // specification.
+  return array(
+    'xri' => '_openid_xri_discovery',
+    'xrds' => '_openid_xrds_discovery',
+  );
+}
+
+/**
+ * OpenID discovery method: perform an XRI discovery.
+ *
+ * @see http://openid.net/specs/openid-authentication-2_0.html#discovery
+ * @see hook_openid_discovery_method_info()
+ * @see openid_discovery()
+ *
+ * @return
+ *   An array of discovered services and claimed identifier or NULL. See
+ *   openid_discovery() for more specific information.
+ */
+function _openid_xri_discovery($claimed_id) {
+  if (_openid_is_xri($claimed_id)) {
+    // Resolve XRI using a proxy resolver (Extensible Resource Identifier (XRI)
+    // Resolution Version 2.0, section 11.2 and 14.3).
+    $xrds_url = variable_get('xri_proxy_resolver', 'http://xri.net/') . rawurlencode($claimed_id) . '?_xrd_r=application/xrds+xml';
+    $discovery = _openid_xrds_discovery($xrds_url);
+    if (!empty($discovery['services']) && is_array($discovery['services'])) {
+      foreach ($discovery['services'] as $i => &$service) {
+        $status = $service['xrd']->children(OPENID_NS_XRD)->Status;
+        if ($status && $status->attributes()->cid == 'verified') {
+          $service['claimed_id'] = openid_normalize((string)$service['xrd']->children(OPENID_NS_XRD)->CanonicalID);
+        }
+        else {
+          // Ignore service if the Canonical ID could not be verified.
+          unset($discovery['services'][$i]);
+        }
+      }
+      if (!empty($discovery['services'])) {
+        return $discovery;
+      }
+    }
+  }
+}
+
+/**
+ * OpenID discovery method: perform a XRDS discovery.
+ *
+ * @see http://openid.net/specs/openid-authentication-2_0.html#discovery
+ * @see hook_openid_discovery_method_info()
+ * @see openid_discovery()
+ *
+ * @return
+ *   An array of discovered services and claimed identifier or NULL. See
+ *   openid_discovery() for more specific information.
+ */
+function _openid_xrds_discovery($claimed_id) {
+  $services = array();
+
+  $xrds_url = $claimed_id;
+  $scheme = @parse_url($xrds_url, PHP_URL_SCHEME);
+  if ($scheme == 'http' || $scheme == 'https') {
+    // For regular URLs, try Yadis resolution first, then HTML-based discovery
+    $headers = array('Accept' => 'application/xrds+xml');
+    $result = drupal_http_request($xrds_url, array('headers' => $headers));
+
+    // Check for HTTP error and make sure, that we reach the target. If the
+    // maximum allowed redirects are exhausted, final destination URL isn't
+    // reached, but drupal_http_request() doesn't return any error.
+    // @todo Remove the check for 200 HTTP result code after the following issue
+    // will be fixed: http://drupal.org/node/1096890.
+    if (!isset($result->error) && $result->code == 200) {
+
+      // Replace the user-entered claimed_id if we received a redirect.
+      if (!empty($result->redirect_url)) {
+        $claimed_id = openid_normalize($result->redirect_url);
+      }
+
+      if (isset($result->headers['content-type']) && preg_match("/application\/xrds\+xml/", $result->headers['content-type'])) {
+        // Parse XML document to find URL
+        $services = _openid_xrds_parse($result->data);
+      }
+      else {
+        $xrds_url = NULL;
+        if (isset($result->headers['x-xrds-location'])) {
+          $xrds_url = $result->headers['x-xrds-location'];
+        }
+        else {
+          // Look for meta http-equiv link in HTML head
+          $xrds_url = _openid_meta_httpequiv('X-XRDS-Location', $result->data);
+        }
+        if (!empty($xrds_url)) {
+          $headers = array('Accept' => 'application/xrds+xml');
+          $xrds_result = drupal_http_request($xrds_url, array('headers' => $headers));
+          if (!isset($xrds_result->error)) {
+            $services = _openid_xrds_parse($xrds_result->data);
+          }
+        }
+      }
+
+      // Check for HTML delegation
+      if (count($services) == 0) {
+        // Look for 2.0 links
+        $uri = _openid_link_href('openid2.provider', $result->data);
+        $identity = _openid_link_href('openid2.local_id', $result->data);
+        $type = 'http://specs.openid.net/auth/2.0/signon';
+
+        // 1.x links
+        if (empty($uri)) {
+          $uri = _openid_link_href('openid.server', $result->data);
+          $identity = _openid_link_href('openid.delegate', $result->data);
+          $type = 'http://openid.net/signon/1.1';
+        }
+        if (!empty($uri)) {
+          $services[] = array(
+            'uri' => $uri,
+            'identity' => $identity,
+            'types' => array($type),
+          );
+        }
+      }
+    }
+  }
+
+  if (!empty($services)) {
+    return array(
+      'services' => $services,
+      'claimed_id' => $claimed_id,
+    );
+  }
+}
+
+/**
+ * Implements hook_openid_normalization_method_info().
+ *
+ * Define standard normalization methods.
+ */
+function openid_openid_normalization_method_info() {
+  // OpenID Authentication 2.0, section 7.2:
+  // If the User-supplied Identifier looks like an XRI, treat it as such;
+  // otherwise treat it as an HTTP URL.
+  return array(
+    'xri' => '_openid_xri_normalize',
+    'url' => '_openid_url_normalize',
+  );
+}
+
+/**
+ * Attempt to create a shared secret with the OpenID Provider.
+ *
+ * @param $op_endpoint URL of the OpenID Provider endpoint.
+ *
+ * @return $assoc_handle The association handle.
+ */
+function openid_association($op_endpoint) {
+  module_load_include('inc', 'openid');
+
+  // Remove Old Associations:
+  db_delete('openid_association')
+    ->where('created + expires_in < :request_time', array(':request_time' => REQUEST_TIME))
+    ->execute();
+
+  // Check to see if we have an association for this IdP already
+  $assoc_handle = db_query("SELECT assoc_handle FROM {openid_association} WHERE idp_endpoint_uri = :endpoint", array(':endpoint' => $op_endpoint))->fetchField();
+  if (empty($assoc_handle)) {
+    $mod = OPENID_DH_DEFAULT_MOD;
+    $gen = OPENID_DH_DEFAULT_GEN;
+    $r = _openid_dh_rand($mod);
+    $private = _openid_math_add($r, 1);
+    $public = _openid_math_powmod($gen, $private, $mod);
+
+    // If there is no existing association, then request one
+    $assoc_request = openid_association_request($public);
+    $assoc_message = _openid_encode_message(_openid_create_message($assoc_request));
+    $assoc_options = array(
+      'headers' => array('Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8'),
+      'method' => 'POST',
+      'data' => $assoc_message,
+    );
+    $assoc_result = drupal_http_request($op_endpoint, $assoc_options);
+    if (isset($assoc_result->error)) {
+      return FALSE;
+    }
+
+    $assoc_response = _openid_parse_message($assoc_result->data);
+    if (isset($assoc_response['mode']) && $assoc_response['mode'] == 'error') {
+      return FALSE;
+    }
+
+    if ($assoc_response['session_type'] == 'DH-SHA1') {
+      $spub = _openid_dh_base64_to_long($assoc_response['dh_server_public']);
+      $enc_mac_key = base64_decode($assoc_response['enc_mac_key']);
+      $shared = _openid_math_powmod($spub, $private, $mod);
+      $assoc_response['mac_key'] = base64_encode(_openid_dh_xorsecret($shared, $enc_mac_key));
+    }
+    db_insert('openid_association')
+      ->fields(array(
+        'idp_endpoint_uri' => $op_endpoint,
+        'session_type' => $assoc_response['session_type'],
+        'assoc_handle' => $assoc_response['assoc_handle'],
+        'assoc_type' => $assoc_response['assoc_type'],
+        'expires_in' => $assoc_response['expires_in'],
+        'mac_key' => $assoc_response['mac_key'],
+        'created' => REQUEST_TIME,
+      ))
+      ->execute();
+    $assoc_handle = $assoc_response['assoc_handle'];
+  }
+  return $assoc_handle;
+}
+
+/**
+ * Authenticate a user or attempt registration.
+ *
+ * @param $response Response values from the OpenID Provider.
+ */
+function openid_authentication($response) {
+  $identity = $response['openid.claimed_id'];
+  $account = user_external_load($identity);
+
+  // Tries to load user account if user_external_load fails due to possibly
+  // incompletely stored OpenID identifier in the authmap.
+  if (!isset($account->uid) && variable_get('openid_less_obtrusive_transition', FALSE)) {
+    module_load_include('inc', 'openid');
+    $account = _openid_invalid_openid_transition($identity, $response);
+  }
+
+  if (isset($account->uid)) {
+    if (!variable_get('user_email_verification', TRUE) || $account->login) {
+      // Check if user is blocked.
+      $state['values']['name'] = $account->name;
+      user_login_name_validate(array(), $state);
+      if (!form_get_errors()) {
+        // Load global $user and perform final login tasks.
+        $form_state['uid'] = $account->uid;
+        user_login_submit(array(), $form_state);
+        // Let other modules act on OpenID login
+        module_invoke_all('openid_response', $response, $account);
+      }
+    }
+    else {
+      drupal_set_message(t('You must validate your email address for this account before logging in via OpenID.'));
+    }
+  }
+  elseif (variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL)) {
+    // Register new user.
+
+    // Save response for use in openid_form_user_register_form_alter().
+    $_SESSION['openid']['response'] = $response;
+
+    $form_state['values'] = array();
+    $form_state['values']['op'] = t('Create new account');
+    drupal_form_submit('user_register_form', $form_state);
+
+    if (!empty($form_state['user'])) {
+      module_invoke_all('openid_response', $response, $form_state['user']);
+      drupal_goto();
+    }
+
+    $messages = drupal_get_messages('error');
+    if (empty($form_state['values']['name']) || empty($form_state['values']['mail'])) {
+      // If the OpenID provider did not provide both a user name and an email
+      // address, ask the user to complete the registration manually instead of
+      // showing the error messages about the missing values generated by FAPI.
+      drupal_set_message(t('Complete the registration by filling out the form below. If you already have an account, you can <a href="@login">log in</a> now and add your OpenID under "My account".', array('@login' => url('user/login'))), 'warning');
+    }
+    else {
+      drupal_set_message(t('Account registration using the information provided by your OpenID provider failed due to the reasons listed below. Complete the registration by filling out the form below. If you already have an account, you can <a href="@login">log in</a> now and add your OpenID under "My account".', array('@login' => url('user/login'))), 'warning');
+      // Append form validation errors below the above warning.
+      foreach ($messages['error'] as $message) {
+        drupal_set_message($message, 'error');
+      }
+    }
+
+    // We were unable to register a valid new user. Redirect to the normal
+    // registration page and prefill with the values we received.
+    $destination = drupal_get_destination();
+    unset($_GET['destination']);
+    drupal_goto('user/register', array('query' => $destination));
+  }
+  else {
+    drupal_set_message(t('Only site administrators can create new user accounts.'), 'error');
+  }
+  drupal_goto();
+}
+
+function openid_association_request($public) {
+  module_load_include('inc', 'openid');
+
+  $request = array(
+    'openid.ns' => OPENID_NS_2_0,
+    'openid.mode' => 'associate',
+    'openid.session_type' => 'DH-SHA1',
+    'openid.assoc_type' => 'HMAC-SHA1'
+  );
+
+  if ($request['openid.session_type'] == 'DH-SHA1' || $request['openid.session_type'] == 'DH-SHA256') {
+    $cpub = _openid_dh_long_to_base64($public);
+    $request['openid.dh_consumer_public'] = $cpub;
+  }
+
+  return $request;
+}
+
+function openid_authentication_request($claimed_id, $identity, $return_to = '', $assoc_handle = '', $service) {
+  global $base_url;
+
+  module_load_include('inc', 'openid');
+
+  $request =  array(
+    'openid.mode' => 'checkid_setup',
+    'openid.identity' => $identity,
+    'openid.assoc_handle' => $assoc_handle,
+    'openid.return_to' => $return_to,
+  );
+
+  if ($service['version'] == 2) {
+    $request['openid.ns'] = OPENID_NS_2_0;
+    $request['openid.claimed_id'] = $claimed_id;
+    $request['openid.realm'] = $base_url .'/';
+  }
+  else {
+    $request['openid.trust_root'] = $base_url .'/';
+  }
+
+  // Always request Simple Registration. The specification doesn't mandate
+  // that the Endpoint advertise OPENID_NS_SREG in the service description.
+  $request['openid.ns.sreg'] = OPENID_NS_SREG;
+  $request['openid.sreg.required'] = 'nickname,email';
+
+  // Request Attribute Exchange, if available.
+  // We only request the minimum attributes we need here, contributed modules
+  // can alter the request to add more attribute, and map them to profile fields.
+  if (in_array(OPENID_NS_AX, $service['types'])) {
+    $request['openid.ns.ax'] = OPENID_NS_AX;
+    $request['openid.ax.mode'] = 'fetch_request';
+    $request['openid.ax.required'] = 'mail_ao,name_ao,mail_son,name_son';
+
+    // Implementors disagree on which URIs to use, even for simple
+    // attributes like name and email (*sigh*). We ask for both axschema.org
+    // attributes (which are supposed to be newer), and schema.openid.net ones
+    // (which are supposed to be legacy).
+
+    // Attributes as defined by axschema.org.
+    $request['openid.ax.type.mail_ao'] = 'http://axschema.org/contact/email';
+    $request['openid.ax.type.name_ao'] = 'http://axschema.org/namePerson/friendly';
+
+    // Attributes as defined by schema.openid.net.
+    $request['openid.ax.type.mail_son'] = 'http://schema.openid.net/contact/email';
+    $request['openid.ax.type.name_son'] = 'http://schema.openid.net/namePerson/friendly';
+  }
+
+  $request = array_merge($request, module_invoke_all('openid', 'request', $request));
+
+  // module_invoke_all() uses array_merge_recursive() which might return nested
+  // arrays if two or more modules alter a given parameter, resulting in an
+  // invalid request format. To ensure this doesn't happen, we flatten the returned
+  // value by taking the last entry in the array if an array is returned.
+  $flattened_request = array();
+  foreach ($request as $key => $value) {
+    if (is_array($value)) {
+      $flattened_request[$key] = end($value);
+    }
+    else {
+      $flattened_request[$key] = $value;
+    }
+  }
+
+  return $flattened_request;
+}
+
+/**
+ * Attempt to verify the response received from the OpenID Provider.
+ *
+ * @param $service
+ *   Array describing the OpenID provider.
+ * @param $response
+ *   Array of response values from the provider.
+ *
+ * @return boolean
+ * @see http://openid.net/specs/openid-authentication-2_0.html#rfc.section.11.4
+ */
+function openid_verify_assertion($service, $response) {
+  module_load_include('inc', 'openid');
+
+  // http://openid.net/specs/openid-authentication-2_0.html#rfc.section.11.3
+  // Check the Nonce to protect against replay attacks.
+  if (!openid_verify_assertion_nonce($service, $response)) {
+    return FALSE;
+  }
+
+  // http://openid.net/specs/openid-authentication-2_0.html#rfc.section.11.1
+  // Verifying the return URL.
+  if (!openid_verify_assertion_return_url($service, $response)) {
+    return FALSE;
+  }
+
+  // http://openid.net/specs/openid-authentication-2_0.html#rfc.section.11.4
+  // Verify the signatures.
+  $valid = FALSE;
+  $association = FALSE;
+
+  // If the OP returned a openid.invalidate_handle, we have to proceed with
+  // direct verification: ignore the openid.assoc_handle, even if present.
+  // See http://openid.net/specs/openid-authentication-2_0.html#rfc.section.11.4.1
+  if (!empty($response['openid.assoc_handle']) && empty($response['openid.invalidate_handle'])) {
+    $association = db_query("SELECT * FROM {openid_association} WHERE assoc_handle = :assoc_handle", array(':assoc_handle' => $response['openid.assoc_handle']))->fetchObject();
+  }
+
+  if ($association && isset($association->session_type)) {
+    // http://openid.net/specs/openid-authentication-2_0.html#rfc.section.11.4.2
+    // Verification using an association.
+    $valid = openid_verify_assertion_signature($service, $association, $response);
+  }
+  else {
+    // http://openid.net/specs/openid-authentication-2_0.html#rfc.section.11.4.2
+    // Direct verification.
+    // The verification requests contain all the fields from the response,
+    // except openid.mode.
+    $request = $response;
+    $request['openid.mode'] = 'check_authentication';
+    $message = _openid_create_message($request);
+    $options = array(
+      'headers' => array('Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8'),
+      'method' => 'POST',
+      'data' => _openid_encode_message($message),
+    );
+    $result = drupal_http_request($service['uri'], $options);
+    if (!isset($result->error)) {
+      $response = _openid_parse_message($result->data);
+
+      if (strtolower(trim($response['is_valid'])) == 'true') {
+        $valid = TRUE;
+        if (!empty($response['invalidate_handle'])) {
+          // This association handle has expired on the OP side, remove it from the
+          // database to avoid reusing it again on a subsequent authentication request.
+          // See http://openid.net/specs/openid-authentication-2_0.html#rfc.section.11.4.2.2
+          db_delete('openid_association')
+            ->condition('assoc_handle', $response['invalidate_handle'])
+            ->execute();
+        }
+      }
+      else {
+        $valid = FALSE;
+      }
+    }
+  }
+  return $valid;
+}
+
+
+/**
+ * Verify the signature of the response received from the OpenID provider.
+ *
+ * @param $service
+ *   Array describing the OpenID provider.
+ * @param $association
+ *   Information on the association with the OpenID provider.
+ * @param $response
+ *   Array of response values from the provider.
+ *
+ * @return
+ *   TRUE if the signature is valid and covers all fields required to be signed.
+ * @see http://openid.net/specs/openid-authentication-2_0.html#rfc.section.11.4
+ */
+function openid_verify_assertion_signature($service, $association, $response) {
+  if ($service['version'] == 2) {
+    // OpenID Authentication 2.0, section 10.1:
+    // These keys must always be signed.
+    $mandatory_keys = array('op_endpoint', 'return_to', 'response_nonce', 'assoc_handle');
+    if (isset($response['openid.claimed_id'])) {
+      // If present, these two keys must also be signed. According to the spec,
+      // they are either both present or both absent.
+      $mandatory_keys[] = 'claimed_id';
+      $mandatory_keys[] = 'identity';
+    }
+  }
+  else {
+    // OpenID Authentication 1.1. section 4.3.3.
+    $mandatory_keys = array('identity', 'return_to');
+  }
+
+  $keys_to_sign = explode(',', $response['openid.signed']);
+
+  if (count(array_diff($mandatory_keys, $keys_to_sign)) > 0) {
+    return FALSE;
+  }
+
+  return _openid_signature($association, $response, $keys_to_sign) === $response['openid.sig'];
+}
+
+/**
+ * Verify that the nonce has not been used in earlier assertions from the same OpenID provider.
+ *
+ * @param $service
+ *   Array describing the OpenID provider.
+ * @param $response
+ *   Array of response values from the provider.
+ *
+ * @return
+ *   TRUE if the nonce has not expired and has not been used earlier.
+ */
+function openid_verify_assertion_nonce($service, $response) {
+  if ($service['version'] != 2) {
+    return TRUE;
+  }
+
+  if (preg_match('/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z/', $response['openid.response_nonce'], $matches)) {
+    list(, $year, $month, $day, $hour, $minutes, $seconds) = $matches;
+    $nonce_timestamp = gmmktime($hour, $minutes, $seconds, $month, $day, $year);
+  }
+  else {
+    watchdog('openid', 'Nonce from @endpoint rejected because it is not correctly formatted, nonce: @nonce.', array('@endpoint' => $service['uri'], '@nonce' => $response['openid.response_nonce']), WATCHDOG_WARNING);
+    return FALSE;
+  }
+
+  // A nonce with a timestamp to far in the past or future will already have
+  // been removed and cannot be checked for single use anymore.
+  $time = time();
+  $expiry = 900;
+  if ($nonce_timestamp <= $time - $expiry || $nonce_timestamp >= $time + $expiry) {
+    watchdog('openid', 'Nonce received from @endpoint is out of range (time difference: @intervals). Check possible clock skew.', array('@endpoint' => $service['uri'], '@interval' => $time - $nonce_timestamp), WATCHDOG_WARNING);
+    return FALSE;
+  }
+
+  // Record that this nonce was used.
+  db_insert('openid_nonce')
+    ->fields(array(
+      'idp_endpoint_uri' => $service['uri'],
+      'nonce' => $response['openid.response_nonce'],
+      'expires' => $nonce_timestamp + $expiry,
+    ))
+    ->execute();
+
+  // Count the number of times this nonce was used.
+  $count_used = db_query("SELECT COUNT(*) FROM {openid_nonce} WHERE nonce = :nonce AND idp_endpoint_uri = :idp_endpoint_uri", array(
+    ':nonce' => $response['openid.response_nonce'],
+    ':idp_endpoint_uri' => $service['uri'],
+  ))->fetchField();
+
+  if ($count_used == 1) {
+    return TRUE;
+  }
+  else {
+    watchdog('openid', 'Nonce replay attempt blocked from @ip, nonce: @nonce.', array('@ip' => ip_address(), '@nonce' => $response['openid.response_nonce']), WATCHDOG_CRITICAL);
+    return FALSE;
+  }
+}
+
+
+/**
+ * Verify that openid.return_to matches the current URL.
+ *
+ * See OpenID  Authentication 2.0, section 11.1. While OpenID Authentication
+ * 1.1, section 4.3 does not mandate return_to verification, the received
+ * return_to should still match these constraints.
+ *
+ * @param $service
+ *   Array describing the OpenID provider.
+ * @param $response
+ *   Array of response values from the provider.
+ *
+ * @return
+ *   TRUE if return_to is valid, FALSE otherwise.
+ */
+function openid_verify_assertion_return_url($service, $response) {
+  global $base_url;
+
+  $return_to_parts = parse_url($response['openid.return_to']);
+
+  $base_url_parts = parse_url($base_url);
+  $current_parts = parse_url($base_url_parts['scheme'] .'://'. $base_url_parts['host'] . request_uri());
+
+  if ($return_to_parts['scheme'] != $current_parts['scheme'] || $return_to_parts['host'] != $current_parts['host'] || $return_to_parts['path'] != $current_parts['path']) {
+    return FALSE;
+  }
+  // Verify that all query parameters in the openid.return_to URL have
+  // the same value in the current URL. In addition, the current URL
+  // contains a number of other parameters added by the OpenID Provider.
+  parse_str(isset($return_to_parts['query']) ? $return_to_parts['query'] : '', $return_to_query_parameters);
+  foreach ($return_to_query_parameters as $name => $value) {
+    if (!isset($_GET[$name]) || $_GET[$name] != $value) {
+      return FALSE;
+    }
+  }
+  return TRUE;
+}
+
+/**
+ * Remove expired nonces from the database.
+ *
+ * Implements hook_cron().
+ */
+function openid_cron() {
+  db_delete('openid_nonce')
+    ->condition('expires', REQUEST_TIME, '<')
+    ->execute();
+}
diff --git a/htmltest/modules/openid/openid.pages.inc b/htmltest/modules/openid/openid.pages.inc
new file mode 100644
index 00000000..8a52f204
--- /dev/null
+++ b/htmltest/modules/openid/openid.pages.inc
@@ -0,0 +1,116 @@
+<?php
+
+/**
+ * @file
+ * User page callbacks for the openid module.
+ */
+
+/**
+ * Menu callback; Process an OpenID authentication.
+ */
+function openid_authentication_page() {
+  $result = openid_complete();
+  switch ($result['status']) {
+    case 'success':
+      return openid_authentication($result);
+    case 'failed':
+      drupal_set_message(t('OpenID login failed.'), 'error');
+      break;
+    case 'cancel':
+      drupal_set_message(t('OpenID login cancelled.'));
+      break;
+  }
+  drupal_goto();
+}
+
+/**
+ * Menu callback; Manage OpenID identities for the specified user.
+ */
+function openid_user_identities($account) {
+  drupal_set_title(format_username($account));
+  drupal_add_css(drupal_get_path('module', 'openid') . '/openid.css');
+
+  // Check to see if we got a response
+  $result = openid_complete();
+  if ($result['status'] == 'success') {
+    $identity = $result['openid.claimed_id'];
+    $query = db_insert('authmap')
+      ->fields(array(
+        'uid' => $account->uid,
+        'authname' => $identity,
+        'module' => 'openid',
+      ))
+      ->execute();
+    drupal_set_message(t('Successfully added %identity', array('%identity' => $identity)));
+  }
+
+  $header = array(t('OpenID'), t('Operations'));
+  $rows = array();
+
+  $result = db_query("SELECT * FROM {authmap} WHERE module='openid' AND uid=:uid", array(':uid' => $account->uid));
+  foreach ($result as $identity) {
+    $rows[] = array(check_plain($identity->authname), l(t('Delete'), 'user/' . $account->uid . '/openid/delete/' . $identity->aid));
+  }
+
+  $build['openid_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#empty' => t('No OpenID identities available for this account.'),
+  );
+  $build['openid_user_add'] = drupal_get_form('openid_user_add');
+  return $build;
+}
+
+/**
+ * Form builder; Add an OpenID identity.
+ *
+ * @ingroup forms
+ * @see openid_user_add_validate()
+ */
+function openid_user_add() {
+  $form['openid_identifier'] = array(
+    '#type' => 'textfield',
+    '#title' => t('OpenID'),
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Add an OpenID'));
+  return $form;
+}
+
+function openid_user_add_validate($form, &$form_state) {
+  // Check for existing entries.
+  $claimed_id = openid_normalize($form_state['values']['openid_identifier']);
+  if (db_query("SELECT authname FROM {authmap} WHERE authname = :authname", (array(':authname' => $claimed_id)))->fetchField()) {
+    form_set_error('openid_identifier', t('That OpenID is already in use on this site.'));
+  }
+}
+
+function openid_user_add_submit($form, &$form_state) {
+  $return_to = url('user/' . arg(1) . '/openid', array('absolute' => TRUE));
+  openid_begin($form_state['values']['openid_identifier'], $return_to);
+}
+
+/**
+ * Menu callback; Delete the specified OpenID identity from the system.
+ */
+function openid_user_delete_form($form, $form_state, $account, $aid = 0) {
+  $authname = db_query("SELECT authname FROM {authmap} WHERE uid = :uid AND aid = :aid AND module = 'openid'", array(
+    ':uid' => $account->uid,
+    ':aid' => $aid,
+  ))
+  ->fetchField();
+  return confirm_form(array(), t('Are you sure you want to delete the OpenID %authname for %user?', array('%authname' => $authname, '%user' => $account->name)), 'user/' . $account->uid . '/openid');
+}
+
+function openid_user_delete_form_submit($form, &$form_state) {
+  $query = db_delete('authmap')
+    ->condition('uid', $form_state['build_info']['args'][0]->uid)
+    ->condition('aid', $form_state['build_info']['args'][1])
+    ->condition('module', 'openid')
+    ->execute();
+  if ($query) {
+    drupal_set_message(t('OpenID deleted.'));
+  }
+  $form_state['redirect'] = 'user/' . $form_state['build_info']['args'][0]->uid . '/openid';
+}
diff --git a/htmltest/modules/openid/openid.test b/htmltest/modules/openid/openid.test
new file mode 100644
index 00000000..41af3f82
--- /dev/null
+++ b/htmltest/modules/openid/openid.test
@@ -0,0 +1,802 @@
+<?php
+
+/**
+ * @file
+ * Tests for openid.module.
+ */
+
+/**
+ * Base class for OpenID tests.
+ */
+abstract class OpenIDWebTestCase extends DrupalWebTestCase {
+
+  /**
+   * Initiates the login procedure using the specified User-supplied Identity.
+   */
+  function submitLoginForm($identity) {
+    // Fill out and submit the login form.
+    $edit = array('openid_identifier' => $identity);
+    $this->drupalPost('', $edit, t('Log in'));
+
+    // Check we are on the OpenID redirect form.
+    $this->assertTitle(t('OpenID redirect'), 'OpenID redirect page was displayed.');
+
+    // Submit form to the OpenID Provider Endpoint.
+    $this->drupalPost(NULL, array(), t('Send'));
+  }
+
+  /**
+   * Parses the last sent e-mail and returns the one-time login link URL.
+   */
+  function getPasswordResetURLFromMail() {
+    $mails = $this->drupalGetMails();
+    $mail = end($mails);
+    preg_match('@.+user/reset/.+@', $mail['body'], $matches);
+    return $matches[0];
+  }
+}
+
+/**
+ * Test discovery and login using OpenID
+ */
+class OpenIDFunctionalTestCase extends OpenIDWebTestCase {
+  protected $web_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'OpenID discovery and login',
+      'description' => "Adds an identity to a user's profile and uses it to log in.",
+      'group' => 'OpenID'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('openid', 'openid_test');
+
+    // User doesn't need special permissions; only the ability to log in.
+    $this->web_user = $this->drupalCreateUser(array());
+  }
+
+  /**
+   * Test discovery of OpenID Provider Endpoint via Yadis and HTML.
+   */
+  function testDiscovery() {
+    $this->drupalLogin($this->web_user);
+
+    // The User-supplied Identifier entered by the user may indicate the URL of
+    // the OpenID Provider Endpoint in various ways, as described in OpenID
+    // Authentication 2.0 and Yadis Specification 1.0.
+    // Note that all of the tested identifiers refer to the same endpoint, so
+    // only the first will trigger an associate request in openid_association()
+    // (association is only done the first time Drupal encounters a given
+    // endpoint).
+
+
+    // Yadis discovery (see Yadis Specification 1.0, section 6.2.5):
+    // If the User-supplied Identifier is a URL, it may be a direct or indirect
+    // reference to an XRDS document (a Yadis Resource Descriptor) that contains
+    // the URL of the OpenID Provider Endpoint.
+
+    // Identifier is the URL of an XRDS document.
+    // On HTTP test environments, the URL scheme is stripped in order to test
+    // that the supplied identifier is normalized in openid_begin().
+    $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
+    $this->addIdentity(preg_replace('@^http://@', '', $identity), 2, 'http://example.com/xrds', $identity);
+
+    $identity = url('openid-test/yadis/xrds/delegate', array('absolute' => TRUE));
+    $this->addIdentity(preg_replace('@^http://@', '', $identity), 2, 'http://example.com/xrds-delegate', $identity);
+
+    // Identifier is the URL of an XRDS document containing an OP Identifier
+    // Element. The Relying Party sends the special value
+    // "http://specs.openid.net/auth/2.0/identifier_select" as Claimed
+    // Identifier. The OpenID Provider responds with the actual identifier
+    // including the fragment.
+    $identity = url('openid-test/yadis/xrds/dummy-user', array('absolute' => TRUE, 'fragment' => $this->randomName()));
+    // Tell openid_test.module to respond with this identifier. If the fragment
+    // part is present in the identifier, it should be retained.
+    variable_set('openid_test_response', array('openid.claimed_id' => $identity));
+    $this->addIdentity(url('openid-test/yadis/xrds/server', array('absolute' => TRUE)), 2, 'http://specs.openid.net/auth/2.0/identifier_select', $identity);
+    variable_set('openid_test_response', array());
+
+    // Identifier is the URL of an HTML page that is sent with an HTTP header
+    // that contains the URL of an XRDS document.
+    $this->addIdentity(url('openid-test/yadis/x-xrds-location', array('absolute' => TRUE)), 2);
+
+    // Identifier is the URL of an HTML page containing a <meta http-equiv=...>
+    // element that contains the URL of an XRDS document.
+    $this->addIdentity(url('openid-test/yadis/http-equiv', array('absolute' => TRUE)), 2);
+
+    // Identifier is an XRI. Resolve using our own dummy proxy resolver.
+    variable_set('xri_proxy_resolver', url('openid-test/yadis/xrds/xri', array('absolute' => TRUE)) . '/');
+    $this->addIdentity('@example*résumé;%25', 2, 'http://example.com/xrds', 'http://example.com/user');
+
+    // Make sure that unverified CanonicalID are not trusted.
+    variable_set('openid_test_canonical_id_status', 'bad value');
+    $this->addIdentity('@example*résumé;%25', 2, FALSE, FALSE);
+
+    // HTML-based discovery:
+    // If the User-supplied Identifier is a URL of an HTML page, the page may
+    // contain a <link rel=...> element containing the URL of the OpenID
+    // Provider Endpoint. OpenID 1 and 2 describe slightly different formats.
+
+    // OpenID Authentication 1.1, section 3.1:
+    $this->addIdentity(url('openid-test/html/openid1', array('absolute' => TRUE)), 1, 'http://example.com/html-openid1');
+
+    // OpenID Authentication 2.0, section 7.3.3:
+    $this->addIdentity(url('openid-test/html/openid2', array('absolute' => TRUE)), 2, 'http://example.com/html-openid2');
+
+    // OpenID Authentication 2.0, section 7.2.4:
+    // URL Identifiers MUST then be further normalized by both (1) following
+    // redirects when retrieving their content and finally (2) applying the
+    // rules in Section 6 of RFC3986 to the final destination URL. This final
+    // URL MUST be noted by the Relying Party as the Claimed Identifier and be
+    // used when requesting authentication.
+
+    // Single redirect.
+    $identity = $expected_claimed_id = url('openid-test/redirected/yadis/xrds/1', array('absolute' => TRUE));
+    $this->addRedirectedIdentity($identity, 2, 'http://example.com/xrds', $expected_claimed_id, 0);
+
+    // Exact 3 redirects (default value for the 'max_redirects' option in
+    // drupal_http_request()).
+    $identity = $expected_claimed_id = url('openid-test/redirected/yadis/xrds/2', array('absolute' => TRUE));
+    $this->addRedirectedIdentity($identity, 2, 'http://example.com/xrds', $expected_claimed_id, 2);
+
+    // Fails because there are more than 3 redirects (default value for the
+    // 'max_redirects' option in drupal_http_request()).
+    $identity = url('openid-test/redirected/yadis/xrds/3', array('absolute' => TRUE));
+    $expected_claimed_id = FALSE;
+    $this->addRedirectedIdentity($identity, 2, 'http://example.com/xrds', $expected_claimed_id, 3);
+  }
+
+  /**
+   * Test login using OpenID.
+   */
+  function testLogin() {
+    $this->drupalLogin($this->web_user);
+
+    // Use a User-supplied Identity that is the URL of an XRDS document.
+    $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
+    $this->addIdentity($identity);
+
+    $this->drupalLogout();
+
+    // Test logging in via the login block on the front page.
+    $this->submitLoginForm($identity);
+    $this->assertLink(t('Log out'), 0, 'User was logged in.');
+
+    $this->drupalLogout();
+
+    // Test logging in via the user/login page.
+    $edit = array('openid_identifier' => $identity);
+    $this->drupalPost('user/login', $edit, t('Log in'));
+
+    // Check we are on the OpenID redirect form.
+    $this->assertTitle(t('OpenID redirect'), 'OpenID redirect page was displayed.');
+
+    // Submit form to the OpenID Provider Endpoint.
+    $this->drupalPost(NULL, array(), t('Send'));
+
+    $this->assertLink(t('Log out'), 0, 'User was logged in.');
+
+    // Verify user was redirected away from user/login to an accessible page.
+    $this->assertResponse(200);
+
+    $this->drupalLogout();
+    // Use a User-supplied Identity that is the URL of an XRDS document.
+    // Tell the test module to add a doctype. This should fail.
+    $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE, 'query' => array('doctype' => 1)));
+    // Test logging in via the login block on the front page.
+    $edit = array('openid_identifier' => $identity);
+    $this->drupalPost('', $edit, t('Log in'));
+    $this->assertRaw(t('Sorry, that is not a valid OpenID. Ensure you have spelled your ID correctly.'), 'XML with DOCTYPE was rejected.');
+  }
+
+  /**
+   * Test login using OpenID during maintenance mode.
+   */
+  function testLoginMaintenanceMode() {
+    $this->web_user = $this->drupalCreateUser(array('access site in maintenance mode'));
+    $this->drupalLogin($this->web_user);
+
+    // Use a User-supplied Identity that is the URL of an XRDS document.
+    $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
+    $this->addIdentity($identity);
+    $this->drupalLogout();
+
+    // Enable maintenance mode.
+    variable_set('maintenance_mode', 1);
+
+    // Test logging in via the user/login page while the site is offline.
+    $edit = array('openid_identifier' => $identity);
+    $this->drupalPost('user/login', $edit, t('Log in'));
+
+    // Check we are on the OpenID redirect form.
+    $this->assertTitle(t('OpenID redirect'), 'OpenID redirect page was displayed.');
+
+    // Submit form to the OpenID Provider Endpoint.
+    $this->drupalPost(NULL, array(), t('Send'));
+
+    $this->assertLink(t('Log out'), 0, 'User was logged in.');
+
+    // Verify user was redirected away from user/login to an accessible page.
+    $this->assertText(t('Operating in maintenance mode.'));
+    $this->assertResponse(200);
+  }
+
+  /**
+   * Test deleting an OpenID identity from a user's profile.
+   */
+  function testDelete() {
+    $this->drupalLogin($this->web_user);
+
+    // Add identity to user's profile.
+    $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
+    $this->addIdentity($identity);
+    $this->assertText($identity, 'Identity appears in list.');
+
+    // Delete the newly added identity.
+    $this->clickLink(t('Delete'));
+    $this->drupalPost(NULL, array(), t('Confirm'));
+
+    $this->assertText(t('OpenID deleted.'), 'Identity deleted');
+    $this->assertNoText($identity, 'Identity no longer appears in list.');
+  }
+
+  /**
+   * Test that a blocked user cannot log in.
+   */
+  function testBlockedUserLogin() {
+    // Use a User-supplied Identity that is the URL of an XRDS document.
+    $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
+
+    // Log in and add an OpenID Identity to the account.
+    $this->drupalLogin($this->web_user);
+    $this->addIdentity($identity);
+    $this->drupalLogout();
+
+    // Log in as an admin user and block the account.
+    $admin_user = $this->drupalCreateUser(array('administer users'));
+    $this->drupalLogin($admin_user);
+    $this->drupalGet('admin/people');
+    $edit = array(
+      'operation' => 'block',
+      'accounts[' . $this->web_user->uid . ']' => TRUE,
+    );
+    $this->drupalPost('admin/people', $edit, t('Update'));
+    $this->assertRaw('The update has been performed.', 'Account was blocked.');
+    $this->drupalLogout();
+
+    $this->submitLoginForm($identity);
+    $this->assertRaw(t('The username %name has not been activated or is blocked.', array('%name' => $this->web_user->name)), 'User login was blocked.');
+  }
+
+  /**
+   * Add OpenID identity to user's profile.
+   *
+   * @param $identity
+   *   The User-supplied Identifier.
+   * @param $version
+   *   The protocol version used by the service.
+   * @param $local_id
+   *   The expected OP-Local Identifier found during discovery.
+   * @param $claimed_id
+   *   The expected Claimed Identifier returned by the OpenID Provider, or FALSE
+   *   if the discovery is expected to fail.
+   */
+  function addIdentity($identity, $version = 2, $local_id = 'http://example.com/xrds', $claimed_id = NULL) {
+    // Tell openid_test.module to only accept this OP-Local Identifier.
+    variable_set('openid_test_identity', $local_id);
+
+    $edit = array('openid_identifier' => $identity);
+    $this->drupalPost('user/' . $this->web_user->uid . '/openid', $edit, t('Add an OpenID'));
+
+    if ($claimed_id === FALSE) {
+      $this->assertRaw(t('Sorry, that is not a valid OpenID. Ensure you have spelled your ID correctly.'), 'Invalid identity was rejected.');
+      return;
+    }
+
+    // OpenID 1 used a HTTP redirect, OpenID 2 uses a HTML form that is submitted automatically using JavaScript.
+    if ($version == 2) {
+      // Check we are on the OpenID redirect form.
+      $this->assertTitle(t('OpenID redirect'), 'OpenID redirect page was displayed.');
+
+      // Submit form to the OpenID Provider Endpoint.
+      $this->drupalPost(NULL, array(), t('Send'));
+    }
+
+    if (!isset($claimed_id)) {
+      $claimed_id = $identity;
+    }
+    $this->assertRaw(t('Successfully added %identity', array('%identity' => $claimed_id)), format_string('Identity %identity was added.', array('%identity' => $identity)));
+  }
+
+  /**
+   * Add OpenID identity, changed by the following redirects, to user's profile.
+   *
+   * According to OpenID Authentication 2.0, section 7.2.4, URL Identifiers MUST
+   * be further normalized by following redirects when retrieving their content
+   * and this final URL MUST be noted by the Relying Party as the Claimed
+   * Identifier and be used when requesting authentication.
+   *
+   * @param $identity
+   *   The User-supplied Identifier.
+   * @param $version
+   *   The protocol version used by the service.
+   * @param $local_id
+   *   The expected OP-Local Identifier found during discovery.
+   * @param $claimed_id
+   *   The expected Claimed Identifier returned by the OpenID Provider, or FALSE
+   *   if the discovery is expected to fail.
+   * @param $redirects
+   *   The number of redirects.
+   */
+  function addRedirectedIdentity($identity, $version = 2, $local_id = 'http://example.com/xrds', $claimed_id = NULL, $redirects = 0) {
+    // Set the final destination URL which is the same as the Claimed
+    // Identifier, we insert the same identifier also to the provider response,
+    // but provider could further change the Claimed ID actually (e.g. it could
+    // add unique fragment).
+    variable_set('openid_test_redirect_url', $identity);
+    variable_set('openid_test_response', array('openid.claimed_id' => $identity));
+
+    $this->addIdentity(url('openid-test/redirect/' . $redirects, array('absolute' => TRUE)), $version, $local_id, $claimed_id);
+
+    // Clean up.
+    variable_del('openid_test_redirect_url');
+    variable_del('openid_test_response');
+  }
+
+  /**
+   * Tests that openid.signed is verified.
+   */
+  function testSignatureValidation() {
+    // Use a User-supplied Identity that is the URL of an XRDS document.
+    $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
+
+    // Respond with an invalid signature.
+    variable_set('openid_test_response', array('openid.sig' => 'this-is-an-invalid-signature'));
+    $this->submitLoginForm($identity);
+    $this->assertRaw('OpenID login failed.');
+
+    // Do not sign the mandatory field openid.assoc_handle.
+    variable_set('openid_test_response', array('openid.signed' => 'op_endpoint,claimed_id,identity,return_to,response_nonce'));
+    $this->submitLoginForm($identity);
+    $this->assertRaw('OpenID login failed.');
+
+    // Sign all mandatory fields and a custom field.
+    $keys_to_sign = array('op_endpoint', 'claimed_id', 'identity', 'return_to', 'response_nonce', 'assoc_handle', 'foo');
+    $association = new stdClass();
+    $association->mac_key = variable_get('mac_key');
+    $response = array(
+      'openid.op_endpoint' => url('openid-test/endpoint', array('absolute' => TRUE)),
+      'openid.claimed_id' => $identity,
+      'openid.identity' => $identity,
+      'openid.return_to' => url('openid/authenticate', array('absolute' => TRUE)),
+      'openid.response_nonce' => _openid_nonce(),
+      'openid.assoc_handle' => 'openid-test',
+      'openid.foo' => 123,
+      'openid.signed' => implode(',', $keys_to_sign),
+    );
+    $response['openid.sig'] = _openid_signature($association, $response, $keys_to_sign);
+    variable_set('openid_test_response', $response);
+    $this->submitLoginForm($identity);
+    $this->assertNoRaw('OpenID login failed.');
+    $this->assertFieldByName('name', '', 'No username was supplied by provider.');
+    $this->assertFieldByName('mail', '', 'No e-mail address was supplied by provider.');
+
+    // Check that unsigned SREG fields are ignored.
+    $response = array(
+      'openid.signed' => 'op_endpoint,claimed_id,identity,return_to,response_nonce,assoc_handle,sreg.nickname',
+      'openid.sreg.nickname' => 'john',
+      'openid.sreg.email' => 'john@example.com',
+    );
+    variable_set('openid_test_response', $response);
+    $this->submitLoginForm($identity);
+    $this->assertNoRaw('OpenID login failed.');
+    $this->assertFieldByName('name', 'john', 'Username was supplied by provider.');
+    $this->assertFieldByName('mail', '', 'E-mail address supplied by provider was ignored.');
+  }
+}
+
+/**
+ * Test account registration using Simple Registration and Attribute Exchange.
+ */
+class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'OpenID account registration',
+      'description' => 'Creates a user account using auto-registration.',
+      'group' => 'OpenID'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('openid', 'openid_test');
+    variable_set('user_register', USER_REGISTER_VISITORS);
+  }
+
+  /**
+   * Test OpenID auto-registration with e-mail verification enabled.
+   */
+  function testRegisterUserWithEmailVerification() {
+    variable_set('user_email_verification', TRUE);
+
+    // Tell openid_test.module to respond with these SREG fields.
+    variable_set('openid_test_response', array('openid.sreg.nickname' => 'john', 'openid.sreg.email' => 'john@example.com'));
+
+    // Use a User-supplied Identity that is the URL of an XRDS document.
+    $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
+    $this->submitLoginForm($identity);
+    $this->assertRaw(t('Once you have verified your e-mail address, you may log in via OpenID.'), 'User was asked to verify e-mail address.');
+    $this->assertRaw(t('A welcome message with further instructions has been sent to your e-mail address.'), 'A welcome message was sent to the user.');
+    $reset_url = $this->getPasswordResetURLFromMail();
+
+    $user = user_load_by_name('john');
+    $this->assertTrue($user, 'User was registered with right username.');
+    $this->assertEqual($user->mail, 'john@example.com', 'User was registered with right email address.');
+    $this->assertFalse($user->data, 'No additional user info was saved.');
+
+    $this->submitLoginForm($identity);
+    $this->assertRaw(t('You must validate your email address for this account before logging in via OpenID.'));
+
+    // Follow the one-time login that was sent in the welcome e-mail.
+    $this->drupalGet($reset_url);
+    $this->drupalPost(NULL, array(), t('Log in'));
+
+    $this->drupalLogout();
+
+    // Verify that the account was activated.
+    $this->submitLoginForm($identity);
+    $this->assertLink(t('Log out'), 0, 'User was logged in.');
+  }
+
+  /**
+   * Test OpenID auto-registration with e-mail verification disabled.
+   */
+  function testRegisterUserWithoutEmailVerification() {
+    variable_set('user_email_verification', FALSE);
+
+    // Tell openid_test.module to respond with these SREG fields.
+    variable_set('openid_test_response', array('openid.sreg.nickname' => 'john', 'openid.sreg.email' => 'john@example.com'));
+
+    // Use a User-supplied Identity that is the URL of an XRDS document.
+    $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
+    $this->submitLoginForm($identity);
+    $this->assertLink(t('Log out'), 0, 'User was logged in.');
+
+    $user = user_load_by_name('john');
+    $this->assertTrue($user, 'User was registered with right username.');
+    $this->assertEqual($user->mail, 'john@example.com', 'User was registered with right email address.');
+    $this->assertFalse($user->data, 'No additional user info was saved.');
+
+    $this->drupalLogout();
+
+    $this->submitLoginForm($identity);
+    $this->assertLink(t('Log out'), 0, 'User was logged in.');
+  }
+
+  /**
+   * Test OpenID auto-registration with a provider that supplies invalid SREG
+   * information (a username that is already taken, and no e-mail address).
+   */
+  function testRegisterUserWithInvalidSreg() {
+    // Tell openid_test.module to respond with these SREG fields.
+    $web_user = $this->drupalCreateUser(array());
+    variable_set('openid_test_response', array('openid.sreg.nickname' => $web_user->name, 'openid.sreg.email' => 'mail@invalid#'));
+
+    // Use a User-supplied Identity that is the URL of an XRDS document.
+    $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
+    $this->submitLoginForm($identity);
+
+    $this->assertRaw(t('Account registration using the information provided by your OpenID provider failed due to the reasons listed below. Complete the registration by filling out the form below. If you already have an account, you can <a href="@login">log in</a> now and add your OpenID under "My account".', array('@login' => url('user/login'))), 'User was asked to complete the registration process manually.');
+    $this->assertRaw(t('The name %name is already taken.', array('%name' => $web_user->name)), 'Form validation error for username was displayed.');
+    $this->assertRaw(t('The e-mail address %mail is not valid.', array('%mail' => 'mail@invalid#')), 'Form validation error for e-mail address was displayed.');
+
+    // Enter username and e-mail address manually.
+    $edit = array('name' => 'john', 'mail' => 'john@example.com');
+    $this->drupalPost(NULL, $edit, t('Create new account'));
+    $this->assertRaw(t('Once you have verified your e-mail address, you may log in via OpenID.'), 'User was asked to verify e-mail address.');
+    $reset_url = $this->getPasswordResetURLFromMail();
+
+    $user = user_load_by_name('john');
+    $this->assertTrue($user, 'User was registered with right username.');
+    $this->assertFalse($user->data, 'No additional user info was saved.');
+
+    // Follow the one-time login that was sent in the welcome e-mail.
+    $this->drupalGet($reset_url);
+    $this->drupalPost(NULL, array(), t('Log in'));
+
+    // The user is taken to user/%uid/edit.
+    $this->assertFieldByName('mail', 'john@example.com', 'User was registered with right e-mail address.');
+
+    $this->clickLink(t('OpenID identities'));
+    $this->assertRaw($identity, 'OpenID identity was registered.');
+  }
+
+  /**
+   * Test OpenID auto-registration with a provider that does not supply SREG
+   * information (i.e. no username or e-mail address).
+   */
+  function testRegisterUserWithoutSreg() {
+    // Load the front page to get the user login block.
+    $this->drupalGet('');
+
+    // Use a User-supplied Identity that is the URL of an XRDS document.
+    $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
+    $this->submitLoginForm($identity);
+    $this->assertRaw(t('Complete the registration by filling out the form below. If you already have an account, you can <a href="@login">log in</a> now and add your OpenID under "My account".', array('@login' => url('user/login'))), 'User was asked to complete the registration process manually.');
+    $this->assertNoRaw(t('You must enter a username.'), 'Form validation error for username was not displayed.');
+    $this->assertNoRaw(t('You must enter an e-mail address.'), 'Form validation error for e-mail address was not displayed.');
+
+    // Enter username and e-mail address manually.
+    $edit = array('name' => 'john', 'mail' => 'john@example.com');
+    $this->drupalPost(NULL, $edit, t('Create new account'));
+    $this->assertRaw(t('Once you have verified your e-mail address, you may log in via OpenID.'), 'User was asked to verify e-mail address.');
+    $reset_url = $this->getPasswordResetURLFromMail();
+
+    $user = user_load_by_name('john');
+    $this->assertTrue($user, 'User was registered with right username.');
+    $this->assertFalse($user->data, 'No additional user info was saved.');
+
+    // Follow the one-time login that was sent in the welcome e-mail.
+    $this->drupalGet($reset_url);
+    $this->drupalPost(NULL, array(), t('Log in'));
+
+    // The user is taken to user/%uid/edit.
+    $this->assertFieldByName('mail', 'john@example.com', 'User was registered with right e-mail address.');
+
+    $this->clickLink(t('OpenID identities'));
+    $this->assertRaw($identity, 'OpenID identity was registered.');
+  }
+
+  /**
+   * Test OpenID auto-registration with a provider that supplies AX information,
+   * but no SREG.
+   */
+  function testRegisterUserWithAXButNoSREG() {
+    variable_set('user_email_verification', FALSE);
+
+    // Tell openid_test.module to respond with these AX fields.
+    variable_set('openid_test_response', array(
+      'openid.ns.ext123' => 'http://openid.net/srv/ax/1.0',
+      'openid.ext123.type.mail456' => 'http://axschema.org/contact/email',
+      'openid.ext123.value.mail456' => 'john@example.com',
+      'openid.ext123.type.name789' => 'http://schema.openid.net/namePerson/friendly',
+      'openid.ext123.count.name789' => '1',
+      'openid.ext123.value.name789.1' => 'john',
+    ));
+
+    // Use a User-supplied Identity that is the URL of an XRDS document.
+    $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
+    $this->submitLoginForm($identity);
+    $this->assertLink(t('Log out'), 0, 'User was logged in.');
+
+    $user = user_load_by_name('john');
+    $this->assertTrue($user, 'User was registered with right username.');
+    $this->assertEqual($user->mail, 'john@example.com', 'User was registered with right email address.');
+  }
+}
+
+/**
+ * Test account registration using Simple Registration and Attribute Exchange.
+ */
+class OpenIDInvalidIdentifierTransitionTestCase extends OpenIDFunctionalTestCase  {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'OpenID account update',
+      'description' => 'Tries to correct OpenID identifiers attached to accounts if their identifiers were stripped.',
+      'group' => 'OpenID',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('openid', 'openid_test');
+    variable_set('user_register', USER_REGISTER_VISITORS);
+    variable_set('openid_less_obtrusive_transition', TRUE);
+  }
+
+  /**
+   * Test OpenID transition with e-mail mismatch.
+   */
+  function testStrippedFragmentAccountEmailMismatch() {
+    $this->drupalLogin($this->web_user);
+
+    // Use a User-supplied Identity that is the URL of an XRDS document.
+    $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE, 'fragment' => $this->randomName()));
+    $identity_stripped = preg_replace('/#.*/', '', $identity);
+
+    // Add invalid identifier to the authmap (identifier has stripped fragment).
+    $this->addIdentity($identity_stripped);
+    $this->drupalLogout();
+
+    // Test logging in via the login form, provider will respond with full
+    // identifier (including fragment) but with different email, so we can't
+    // provide auto-update.
+    variable_set('openid_test_response', array(
+      'openid.claimed_id' => $identity,
+      'openid.sreg.nickname' => $this->web_user->name,
+      'openid.sreg.email' => 'invalid-' . $this->web_user->mail));
+
+    $edit = array('openid_identifier' => $identity_stripped);
+    $this->submitLoginForm($identity_stripped);
+
+    // Verify user was redirected away from user login to an accessible page.
+    $this->assertResponse(200);
+
+    // Verify the message.
+    $this->assertRaw(t('There is already an existing account associated with the OpenID identifier that you have provided.'), 'Message that OpenID identifier must be updated manually was displayed.');
+  }
+
+  /**
+   * Test OpenID auto transition with e-mail.
+   */
+  function testStrippedFragmentAccountAutoUpdateSreg() {
+    $this->drupalLogin($this->web_user);
+
+    // Use a User-supplied Identity that is the URL of an XRDS document.
+    $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE, 'fragment' => $this->randomName()));
+    $identity_stripped = preg_replace('/#.*/', '', $identity);
+
+    // Add invalid identifier to the authmap (identifier has stripped fragment).
+    $this->addIdentity($identity_stripped);
+    $this->drupalLogout();
+
+    // Test logging in via the login form, provider will respond with full
+    // identifier (including fragment) but with different email, so we can't
+    // provide auto-update.
+    variable_set('openid_test_response', array(
+      'openid.claimed_id' => $identity,
+      'openid.sreg.nickname' => $this->web_user->name,
+      'openid.sreg.email' => $this->web_user->mail));
+
+    $this->submitLoginForm($identity_stripped);
+
+    // Verify user was redirected away from user login to an accessible page.
+    $this->assertResponse(200);
+
+    // Verify the message.
+    $this->assertRaw(t('New OpenID identifier %identity was added as a replacement for invalid identifier %invalid_identity.', array('%invalid_identity' => $identity_stripped, '%identity' => $identity)), 'Message that OpenID identifier was added automatically was displayed.');
+  }
+}
+
+/**
+ * Test internal helper functions.
+ */
+class OpenIDTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'OpenID helper functions',
+      'description' => 'Test OpenID helper functions.',
+      'group' => 'OpenID'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('openid');
+    module_load_include('inc', 'openid');
+  }
+
+  /**
+   * Test _openid_dh_XXX_to_XXX() functions.
+   */
+  function testConversion() {
+    $this->assertEqual(_openid_dh_long_to_base64('12345678901234567890123456789012345678901234567890'), 'CHJ/Y2mq+DyhUCZ0evjH8ZbOPwrS', '_openid_dh_long_to_base64() returned expected result.');
+    $this->assertEqual(_openid_dh_base64_to_long('BsH/g8Nrpn2dtBSdu/sr1y8hxwyx'), '09876543210987654321098765432109876543210987654321', '_openid_dh_base64_to_long() returned expected result.');
+
+    $this->assertEqual(_openid_dh_long_to_binary('12345678901234567890123456789012345678901234567890'), "\x08r\x7fci\xaa\xf8<\xa1P&tz\xf8\xc7\xf1\x96\xce?\x0a\xd2", '_openid_dh_long_to_binary() returned expected result.');
+    $this->assertEqual(_openid_dh_binary_to_long("\x06\xc1\xff\x83\xc3k\xa6}\x9d\xb4\x14\x9d\xbb\xfb+\xd7/!\xc7\x0c\xb1"), '09876543210987654321098765432109876543210987654321', '_openid_dh_binary_to_long() returned expected result.');
+  }
+
+  /**
+   * Test _openid_dh_xorsecret().
+   */
+  function testOpenidDhXorsecret() {
+    $this->assertEqual(_openid_dh_xorsecret('123456790123456790123456790', "abc123ABC\x00\xFF"), "\xa4'\x06\xbe\xf1.\x00y\xff\xc2\xc1", '_openid_dh_xorsecret() returned expected result.');
+  }
+
+  /**
+   * Test _openid_signature().
+   */
+  function testOpenidSignature() {
+    // Test that signature is calculated according to OpenID Authentication 2.0,
+    // section 6.1. In the following array, only the two first entries should be
+    // included in the calculation, because the substring following the period
+    // is mentioned in the third argument for _openid_signature(). The last
+    // entry should not be included, because it does not start with "openid.".
+    $response = array(
+      'openid.foo' => 'abc1',
+      'openid.bar' => 'abc2',
+      'openid.baz' => 'abc3',
+      'foobar.foo' => 'abc4',
+    );
+    $association = new stdClass();
+    $association->mac_key = "1234567890abcdefghij\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9";
+    $this->assertEqual(_openid_signature($association, $response, array('foo', 'bar')), 'QnKZQzSFstT+GNiJDFOptdcZjrc=', 'Expected signature calculated.');
+  }
+
+  /**
+   * Test _openid_is_xri().
+   */
+  function testOpenidXRITest() {
+    // Test that the XRI test is according to OpenID Authentication 2.0,
+    // section 7.2. If the user-supplied string starts with xri:// it should be
+    // stripped and the resulting string should be treated as an XRI when it
+    // starts with "=", "@", "+", "$", "!" or "(".
+    $this->assertTrue(_openid_is_xri('xri://=foo'), '_openid_is_xri() returned expected result for an xri identifier with xri scheme.');
+    $this->assertTrue(_openid_is_xri('xri://@foo'), '_openid_is_xri() returned expected result for an xri identifier with xri scheme.');
+    $this->assertTrue(_openid_is_xri('xri://+foo'), '_openid_is_xri() returned expected result for an xri identifier with xri scheme.');
+    $this->assertTrue(_openid_is_xri('xri://$foo'), '_openid_is_xri() returned expected result for an xri identifier with xri scheme.');
+    $this->assertTrue(_openid_is_xri('xri://!foo'), '_openid_is_xri() returned expected result for an xri identifier with xri scheme..');
+    $this->assertTrue(_openid_is_xri('xri://(foo'), '_openid_is_xri() returned expected result for an xri identifier with xri scheme..');
+
+    $this->assertTrue(_openid_is_xri('=foo'), '_openid_is_xri() returned expected result for an xri identifier.');
+    $this->assertTrue(_openid_is_xri('@foo'), '_openid_is_xri() returned expected result for an xri identifier.');
+    $this->assertTrue(_openid_is_xri('+foo'), '_openid_is_xri() returned expected result for an xri identifier.');
+    $this->assertTrue(_openid_is_xri('$foo'), '_openid_is_xri() returned expected result for an xri identifier.');
+    $this->assertTrue(_openid_is_xri('!foo'), '_openid_is_xri() returned expected result for an xri identifier.');
+    $this->assertTrue(_openid_is_xri('(foo'), '_openid_is_xri() returned expected result for an xri identifier.');
+
+    $this->assertFalse(_openid_is_xri('foo'), '_openid_is_xri() returned expected result for an http URL.');
+    $this->assertFalse(_openid_is_xri('xri://foo'), '_openid_is_xri() returned expected result for an http URL.');
+    $this->assertFalse(_openid_is_xri('http://foo/'), '_openid_is_xri() returned expected result for an http URL.');
+    $this->assertFalse(_openid_is_xri('http://example.com/'), '_openid_is_xri() returned expected result for an http URL.');
+    $this->assertFalse(_openid_is_xri('user@example.com/'), '_openid_is_xri() returned expected result for an http URL.');
+    $this->assertFalse(_openid_is_xri('http://user@example.com/'), '_openid_is_xri() returned expected result for an http URL.');
+  }
+
+  /**
+   * Test openid_normalize().
+   */
+  function testOpenidNormalize() {
+    // Test that the normalization is according to OpenID Authentication 2.0,
+    // section 7.2 and 11.5.2.
+
+    $this->assertEqual(openid_normalize('$foo'), '$foo', 'openid_normalize() correctly normalized an XRI.');
+    $this->assertEqual(openid_normalize('xri://$foo'), '$foo', 'openid_normalize() correctly normalized an XRI with an xri:// scheme.');
+
+    $this->assertEqual(openid_normalize('example.com/'), 'http://example.com/', 'openid_normalize() correctly normalized a URL with a missing scheme.');
+    $this->assertEqual(openid_normalize('example.com'), 'http://example.com/', 'openid_normalize() correctly normalized a URL with a missing scheme and empty path.');
+    $this->assertEqual(openid_normalize('http://example.com'), 'http://example.com/', 'openid_normalize() correctly normalized a URL with an empty path.');
+
+    $this->assertEqual(openid_normalize('http://example.com/path'), 'http://example.com/path', 'openid_normalize() correctly normalized a URL with a path.');
+
+    $this->assertEqual(openid_normalize('http://example.com/path#fragment'), 'http://example.com/path', 'openid_normalize() correctly normalized a URL with a fragment.');
+  }
+
+  /**
+   * Test openid_extract_namespace().
+   */
+  function testOpenidExtractNamespace() {
+    $response = array(
+      'openid.sreg.nickname' => 'john',
+      'openid.ns.ext1' => OPENID_NS_SREG,
+      'openid.ext1.nickname' => 'george',
+      'openid.ext1.email' => 'george@example.com',
+      'openid.ns.ext2' => 'http://example.com/ns/ext2',
+      'openid.ext2.foo' => '123',
+      'openid.ext2.bar' => '456',
+      'openid.signed' => 'sreg.nickname,ns.ext1,ext1.email,ext2.foo',
+    );
+
+    $values = openid_extract_namespace($response, 'http://example.com/ns/dummy', NULL, FALSE);
+    $this->assertEqual($values, array(), 'Nothing found for unused namespace.');
+
+    $values = openid_extract_namespace($response, 'http://example.com/ns/dummy', 'sreg', FALSE);
+    $this->assertEqual($values, array('nickname' => 'john'), 'Value found for fallback prefix.');
+
+    $values = openid_extract_namespace($response, OPENID_NS_SREG, 'sreg', FALSE);
+    $this->assertEqual($values, array('nickname' => 'george', 'email' => 'george@example.com'), 'Namespace takes precedence over fallback prefix.');
+
+    // ext1.email is signed, but ext1.nickname is not.
+    $values = openid_extract_namespace($response, OPENID_NS_SREG, 'sreg', TRUE);
+    $this->assertEqual($values, array('email' => 'george@example.com'), 'Unsigned namespaced fields ignored.');
+
+    $values = openid_extract_namespace($response, 'http://example.com/ns/ext2', 'sreg', FALSE);
+    $this->assertEqual($values, array('foo' => '123', 'bar' => '456'), 'Unsigned fields found.');
+
+    // ext2.foo and ext2.bar are ignored, because ns.ext2 is not signed. The
+    // fallback prefix is not used, because the namespace is specified.
+    $values = openid_extract_namespace($response, 'http://example.com/ns/ext2', 'sreg', TRUE);
+    $this->assertEqual($values, array(), 'Unsigned fields ignored.');
+  }
+}
diff --git a/htmltest/modules/openid/tests/openid_test.info b/htmltest/modules/openid/tests/openid_test.info
new file mode 100644
index 00000000..9951cd39
--- /dev/null
+++ b/htmltest/modules/openid/tests/openid_test.info
@@ -0,0 +1,13 @@
+name = OpenID dummy provider
+description = "OpenID provider used for testing."
+package = Testing
+version = VERSION
+core = 7.x
+dependencies[] = openid
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/openid/tests/openid_test.install b/htmltest/modules/openid/tests/openid_test.install
new file mode 100644
index 00000000..d30e2dc4
--- /dev/null
+++ b/htmltest/modules/openid/tests/openid_test.install
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the openid_test module.
+ */
+
+/**
+ * Implements hook_install().
+ */
+function openid_test_install() {
+  module_load_include('inc', 'openid');
+  // Generate a MAC key (Message Authentication Code) used for signing messages.
+  // The variable is base64-encoded, because variables cannot contain non-UTF-8
+  // data.
+  variable_set('openid_test_mac_key', drupal_random_key(20));
+}
diff --git a/htmltest/modules/openid/tests/openid_test.module b/htmltest/modules/openid/tests/openid_test.module
new file mode 100644
index 00000000..bcf9f425
--- /dev/null
+++ b/htmltest/modules/openid/tests/openid_test.module
@@ -0,0 +1,367 @@
+<?php
+
+/**
+ * @file
+ * Dummy OpenID Provider used with SimpleTest.
+ *
+ * The provider simply responds positively to all authentication requests. In
+ * addition to a Provider Endpoint (a URL used for Drupal to communicate with
+ * the provider using the OpenID Authentication protocol) the module provides
+ * URLs used by the various discovery mechanisms.
+ *
+ * When a user enters an OpenID identity, the Relying Party (in the testing
+ * scenario, this is the OpenID module) looks up the URL of the Provider
+ * Endpoint using one of several discovery mechanisms. The Relying Party then
+ * redirects the user to Provider Endpoint. The provider verifies the user's
+ * identity and redirects the user back to the Relying Party accompanied by a
+ * signed message confirming the identity. Before redirecting to a provider for
+ * the first time, the Relying Party fetches a secret MAC key from the provider
+ * by doing a direct "associate" HTTP request to the Provider Endpoint. This
+ * key is used for verifying the signed messages from the provider.
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function openid_test_menu() {
+  $items['openid-test/yadis/xrds'] = array(
+    'title' => 'XRDS service document',
+    'page callback' => 'openid_test_yadis_xrds',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['openid-test/yadis/x-xrds-location'] = array(
+    'title' => 'Yadis discovery using X-XRDS-Location header',
+    'page callback' => 'openid_test_yadis_x_xrds_location',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['openid-test/yadis/http-equiv'] = array(
+    'title' => 'Yadis discovery using <meta http-equiv="X-XRDS-Location" ...>',
+    'page callback' => 'openid_test_yadis_http_equiv',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['openid-test/html/openid1'] = array(
+    'title' => 'HTML-based discovery using <link rel="openid.server" ...>',
+    'page callback' => 'openid_test_html_openid1',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['openid-test/html/openid2'] = array(
+    'title' => 'HTML-based discovery using <link rel="openid2.provider" ...>',
+    'page callback' => 'openid_test_html_openid2',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['openid-test/endpoint'] = array(
+    'title' => 'OpenID Provider Endpoint',
+    'page callback' => 'openid_test_endpoint',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['openid-test/redirect'] = array(
+    'title' => 'OpenID Provider Redirection Point',
+    'page callback' => 'openid_test_redirect',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['openid-test/redirected/%/%'] = array(
+    'title' => 'OpenID Provider Final URL',
+    'page callback' => 'openid_test_redirected_method',
+    'page arguments' => array(2, 3),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_menu_site_status_alter().
+ */
+function openid_test_menu_site_status_alter(&$menu_site_status, $path) {
+  // Allow access to openid endpoint and identity even in offline mode.
+  if ($menu_site_status == MENU_SITE_OFFLINE && user_is_anonymous() && in_array($path, array('openid-test/yadis/xrds', 'openid-test/endpoint'))) {
+    $menu_site_status = MENU_SITE_ONLINE;
+  }
+}
+
+/**
+ * Menu callback; XRDS document that references the OP Endpoint URL.
+ */
+function openid_test_yadis_xrds() {
+  if ($_SERVER['HTTP_ACCEPT'] == 'application/xrds+xml') {
+    // Only respond to XRI requests for one specific XRI. The is used to verify
+    // that the XRI has been properly encoded. The "+" sign in the _xrd_r query
+    // parameter is decoded to a space by PHP.
+    if (arg(3) == 'xri') {
+      if (variable_get('clean_url', 0)) {
+        if (arg(4) != '@example*résumé;%25' || $_GET['_xrd_r'] != 'application/xrds xml') {
+          drupal_not_found();
+        }
+      }
+      else {
+        // Drupal cannot properly emulate an XRI proxy resolver using unclean
+        // URLs, so the arguments gets messed up.
+        if (arg(4) . '/' . arg(5) != '@example*résumé;%25?_xrd_r=application/xrds xml') {
+          drupal_not_found();
+        }
+      }
+    }
+    drupal_add_http_header('Content-Type', 'application/xrds+xml');
+    print '<?xml version="1.0" encoding="UTF-8"?>';
+    if (!empty($_GET['doctype'])) {
+      print "\n<!DOCTYPE dct [ <!ELEMENT blue (#PCDATA)> ]>\n";
+    }
+    print '
+      <xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)" xmlns:openid="http://openid.net/xmlns/1.0">
+        <XRD>
+          <Status cid="' . check_plain(variable_get('openid_test_canonical_id_status', 'verified')) . '"/>
+          <ProviderID>xri://@</ProviderID>
+          <CanonicalID>http://example.com/user</CanonicalID>
+          <Service>
+            <Type>http://example.com/this-is-ignored</Type>
+          </Service>
+          <Service priority="5">
+            <Type>http://openid.net/signon/1.0</Type>
+            <URI>http://example.com/this-is-only-openid-1.0</URI>
+          </Service>
+          <Service priority="10">
+            <Type>http://specs.openid.net/auth/2.0/signon</Type>
+            <Type>http://openid.net/srv/ax/1.0</Type>
+            <URI>' . url('openid-test/endpoint', array('absolute' => TRUE)) . '</URI>
+            <LocalID>http://example.com/xrds</LocalID>
+          </Service>
+          <Service priority="15">
+            <Type>http://specs.openid.net/auth/2.0/signon</Type>
+            <URI>http://example.com/this-has-too-low-priority</URI>
+          </Service>
+          <Service>
+            <Type>http://specs.openid.net/auth/2.0/signon</Type>
+            <URI>http://example.com/this-has-too-low-priority</URI>
+          </Service>
+          ';
+    if (arg(3) == 'server') {
+      print '
+          <Service>
+            <Type>http://specs.openid.net/auth/2.0/server</Type>
+            <URI>http://example.com/this-has-too-low-priority</URI>
+          </Service>
+          <Service priority="20">
+            <Type>http://specs.openid.net/auth/2.0/server</Type>
+            <URI>' . url('openid-test/endpoint', array('absolute' => TRUE)) . '</URI>
+          </Service>';
+    }
+    elseif (arg(3) == 'delegate') {
+      print '
+          <Service priority="0">
+            <Type>http://specs.openid.net/auth/2.0/signon</Type>
+            <Type>http://openid.net/srv/ax/1.0</Type>
+            <URI>' . url('openid-test/endpoint', array('absolute' => TRUE)) . '</URI>
+            <openid:Delegate>http://example.com/xrds-delegate</openid:Delegate>
+          </Service>';
+    }
+    print '
+        </XRD>
+      </xrds:XRDS>';
+  }
+  else {
+    return t('This is a regular HTML page. If the client sends an Accept: application/xrds+xml header when requesting this URL, an XRDS document is returned.');
+  }
+}
+
+/**
+ * Menu callback; regular HTML page with an X-XRDS-Location HTTP header.
+ */
+function openid_test_yadis_x_xrds_location() {
+  drupal_add_http_header('X-XRDS-Location', url('openid-test/yadis/xrds', array('absolute' => TRUE)));
+  return t('This page includes an X-RDS-Location HTTP header containing the URL of an XRDS document.');
+}
+
+/**
+ * Menu callback; regular HTML page with <meta> element.
+ */
+function openid_test_yadis_http_equiv() {
+  $element = array(
+    '#tag' => 'meta',
+    '#attributes' => array(
+      'http-equiv' => 'X-XRDS-Location',
+      'content' => url('openid-test/yadis/xrds', array('absolute' => TRUE)),
+    ),
+  );
+  drupal_add_html_head($element, 'openid_test_yadis_http_equiv');
+  return t('This page includes a &lt;meta equiv=...&gt; element containing the URL of an XRDS document.');
+}
+
+/**
+ * Menu callback; regular HTML page with OpenID 1.0 <link> element.
+ */
+function openid_test_html_openid1() {
+  drupal_add_html_head_link(array('rel' => 'openid.server', 'href' => url('openid-test/endpoint', array('absolute' => TRUE))));
+  drupal_add_html_head_link(array('rel' => 'openid.delegate', 'href' => 'http://example.com/html-openid1'));
+  return t('This page includes a &lt;link rel=...&gt; element containing the URL of an OpenID Provider Endpoint.');
+}
+
+/**
+ * Menu callback; regular HTML page with OpenID 2.0 <link> element.
+ */
+function openid_test_html_openid2() {
+  drupal_add_html_head_link(array('rel' => 'openid2.provider', 'href' => url('openid-test/endpoint', array('absolute' => TRUE))));
+  drupal_add_html_head_link(array('rel' => 'openid2.local_id', 'href' => 'http://example.com/html-openid2'));
+  return t('This page includes a &lt;link rel=...&gt; element containing the URL of an OpenID Provider Endpoint.');
+}
+
+/**
+ * Menu callback; OpenID Provider Endpoint.
+ *
+ * It accepts "associate" requests directly from the Relying Party, and
+ * "checkid_setup" requests made by the user's browser based on HTTP redirects
+ * (in OpenID 1) or HTML forms (in OpenID 2) generated by the Relying Party.
+ */
+function openid_test_endpoint() {
+  switch ($_REQUEST['openid_mode']) {
+    case 'associate':
+      _openid_test_endpoint_associate();
+      break;
+    case 'checkid_setup':
+      _openid_test_endpoint_authenticate();
+      break;
+  }
+}
+
+/**
+ * Menu callback; redirect during Normalization/Discovery.
+ */
+function openid_test_redirect($count = 0) {
+  if ($count == 0) {
+    $url = variable_get('openid_test_redirect_url', '');
+  }
+  else {
+    $url = url('openid-test/redirect/' . --$count, array('absolute' => TRUE));
+  }
+  $http_response_code = variable_get('openid_test_redirect_http_reponse_code', 301);
+  header('Location: ' . $url, TRUE, $http_response_code);
+  exit();
+}
+
+/**
+ * Menu callback; respond with appropriate callback.
+ */
+function openid_test_redirected_method($method1, $method2) {
+  return call_user_func('openid_test_' . $method1 . '_' . $method2);
+}
+
+/**
+ * OpenID endpoint; handle "associate" requests (see OpenID Authentication 2.0,
+ * section 8).
+ *
+ * The purpose of association is to send the secret MAC key to the Relying Party
+ * using Diffie-Hellman key exchange. The MAC key is used in subsequent
+ * "authenticate" requests. The "associate" request is made by the Relying Party
+ * (in the testing scenario, this is the OpenID module that communicates with
+ * the endpoint using drupal_http_request()).
+ */
+function _openid_test_endpoint_associate() {
+  module_load_include('inc', 'openid');
+
+  // Use default parameters for Diffie-Helmann key exchange.
+  $mod = OPENID_DH_DEFAULT_MOD;
+  $gen = OPENID_DH_DEFAULT_GEN;
+
+  // Generate private Diffie-Helmann key.
+  $r = _openid_dh_rand($mod);
+  $private = _openid_math_add($r, 1);
+
+  // Calculate public Diffie-Helmann key.
+  $public = _openid_math_powmod($gen, $private, $mod);
+
+  // Calculate shared secret based on Relying Party's public key.
+  $cpub = _openid_dh_base64_to_long($_REQUEST['openid_dh_consumer_public']);
+  $shared = _openid_math_powmod($cpub, $private, $mod);
+
+  // Encrypt the MAC key using the shared secret.
+  $enc_mac_key = base64_encode(_openid_dh_xorsecret($shared, base64_decode(variable_get('mac_key'))));
+
+  // Generate response including our public key and the MAC key. Using our
+  // public key and its own private key, the Relying Party can calculate the
+  // shared secret, and with this it can decrypt the encrypted MAC key.
+  $response = array(
+    'ns' => 'http://specs.openid.net/auth/2.0',
+    'assoc_handle' => 'openid-test',
+    'session_type' => $_REQUEST['openid_session_type'],
+    'assoc_type' => $_REQUEST['openid_assoc_type'],
+    'expires_in' => '3600',
+    'dh_server_public' => _openid_dh_long_to_base64($public),
+    'enc_mac_key' => $enc_mac_key,
+  );
+
+  // Respond to Relying Party in the special Key-Value Form Encoding (see OpenID
+  // Authentication 1.0, section 4.1.1).
+  drupal_add_http_header('Content-Type', 'text/plain');
+  print _openid_create_message($response);
+}
+
+/**
+ * OpenID endpoint; handle "authenticate" requests.
+ *
+ * All requests result in a successful response. The request is a GET or POST
+ * made by the user's browser based on an HTML form or HTTP redirect generated
+ * by the Relying Party. The user is redirected back to the Relying Party using
+ * a URL containing a signed message in the query string confirming the user's
+ * identity.
+ */
+function _openid_test_endpoint_authenticate() {
+  module_load_include('inc', 'openid');
+
+  $expected_identity = variable_get('openid_test_identity');
+  if ($expected_identity && $_REQUEST['openid_identity'] != $expected_identity) {
+    $response = variable_get('openid_test_response', array()) + array(
+      'openid.ns' => OPENID_NS_2_0,
+      'openid.mode' => 'error',
+      'openid.error' => 'Unexpted identity',
+    );
+    drupal_add_http_header('Content-Type', 'text/plain');
+    header('Location: ' . url($_REQUEST['openid_return_to'], array('query' => $response, 'external' => TRUE)));
+    return;
+  }
+
+  // Generate unique identifier for this authentication.
+  $nonce = _openid_nonce();
+
+  // Generate response containing the user's identity.
+  $response = variable_get('openid_test_response', array()) + array(
+    'openid.ns' => OPENID_NS_2_0,
+    'openid.mode' => 'id_res',
+    'openid.op_endpoint' => url('openid-test/endpoint', array('absolute' => TRUE)),
+    'openid.claimed_id' => !empty($_REQUEST['openid_claimed_id']) ? $_REQUEST['openid_claimed_id'] : '',
+    'openid.identity' => $_REQUEST['openid_identity'],
+    'openid.return_to' => $_REQUEST['openid_return_to'],
+    'openid.response_nonce' => $nonce,
+    'openid.assoc_handle' => 'openid-test',
+  );
+
+  if (isset($response['openid.signed'])) {
+    $keys_to_sign = explode(',', $response['openid.signed']);
+  }
+  else {
+    // Unless openid.signed is explicitly defined, all keys are signed.
+    $keys_to_sign = array();
+    foreach ($response as $key => $value) {
+      // Strip off the "openid." prefix.
+      $keys_to_sign[] = substr($key, 7);
+    }
+    $response['openid.signed'] = implode(',', $keys_to_sign);
+  }
+
+  // Sign the message using the MAC key that was exchanged during association.
+  $association = new stdClass();
+  $association->mac_key = variable_get('mac_key');
+  if (!isset($response['openid.sig'])) {
+    $response['openid.sig'] = _openid_signature($association, $response, $keys_to_sign);
+  }
+
+  // Put the signed message into the query string of a URL supplied by the
+  // Relying Party, and redirect the user.
+  drupal_add_http_header('Content-Type', 'text/plain');
+  header('Location: ' . url($_REQUEST['openid_return_to'], array('query' => $response, 'external' => TRUE)));
+}
diff --git a/htmltest/modules/overlay/images/background.png b/htmltest/modules/overlay/images/background.png
new file mode 100644
index 00000000..9be21936
Binary files /dev/null and b/htmltest/modules/overlay/images/background.png differ
diff --git a/htmltest/modules/overlay/images/close-rtl.png b/htmltest/modules/overlay/images/close-rtl.png
new file mode 100644
index 00000000..ae05d111
Binary files /dev/null and b/htmltest/modules/overlay/images/close-rtl.png differ
diff --git a/htmltest/modules/overlay/images/close.png b/htmltest/modules/overlay/images/close.png
new file mode 100644
index 00000000..436985e2
Binary files /dev/null and b/htmltest/modules/overlay/images/close.png differ
diff --git a/htmltest/modules/overlay/overlay-child-rtl.css b/htmltest/modules/overlay/overlay-child-rtl.css
new file mode 100644
index 00000000..2e5a267c
--- /dev/null
+++ b/htmltest/modules/overlay/overlay-child-rtl.css
@@ -0,0 +1,40 @@
+
+/**
+ * @file
+ * RTL styling for Overlay child pages.
+ */
+
+html {
+  direction: rtl;
+}
+
+#overlay-title {
+  float: right;
+  left: auto;
+}
+#overlay {
+  padding: 0.2em;
+  padding-left: 26px;
+}
+#overlay-close-wrapper {
+  left: 0;
+  right: auto;
+}
+#overlay-close,
+#overlay-close:hover {
+  background: transparent url(images/close-rtl.png) no-repeat;
+  -moz-border-radius-topright: 0;
+  -webkit-border-top-right-radius: 0;
+  border-top-right-radius: 0;
+}
+
+/**
+ * Tabs on the overlay.
+ */
+#overlay-tabs {
+  left: 20px;
+  right: auto;
+}
+#overlay-tabs li {
+  margin: 0 -3px 0 0;
+}
diff --git a/htmltest/modules/overlay/overlay-child.css b/htmltest/modules/overlay/overlay-child.css
new file mode 100644
index 00000000..959ebddb
--- /dev/null
+++ b/htmltest/modules/overlay/overlay-child.css
@@ -0,0 +1,172 @@
+
+/**
+ * @file
+ * Basic styling for the Overlay child pages.
+ */
+
+html.js {
+  background: transparent !important;
+  overflow-y: scroll;
+}
+html.js body {
+  background: transparent !important;
+  margin-left: 0;
+  margin-right: 0;
+  padding: 20px 0;
+}
+
+#overlay {
+  display: table;
+  margin: 0 auto;
+  min-height: 100px;
+  min-width: 700px;
+  position: relative;
+  padding: .2em;
+  padding-bottom: 2em;
+  padding-right: 26px; /* LTR */
+  width: 88%;
+}
+#overlay-titlebar {
+  padding: 0 20px;
+  position: relative;
+  white-space: nowrap;
+  z-index: 100;
+}
+#overlay-content {
+  background: #fff;
+  clear: both;
+  color: #000;
+  padding: .5em 1em;
+  position: relative;
+}
+
+#overlay-title-wrapper {
+  overflow: hidden;
+}
+#overlay-title {
+  color: #fff;
+  float: left; /* LTR */
+  font-size: 20px;
+  margin: 0;
+  padding: 0.3em 0;
+}
+#overlay-title:active,
+#overlay-title:focus {
+  outline: 0;
+}
+
+.overlay #skip-link {
+  margin-top: -20px;
+}
+.overlay #skip-link a {
+  color: #fff; /* This is white to contrast with the dark background behind it. */
+}
+
+#overlay-close-wrapper {
+  position: absolute;
+  right: 0; /* LTR */
+}
+#overlay-close,
+#overlay-close:hover {
+  background: transparent url(images/close.png) no-repeat; /* LTR */
+  -moz-border-radius-topleft: 0; /* LTR */
+  -webkit-border-top-left-radius: 0; /* LTR */
+  border-top-left-radius: 0; /* LTR */
+  display: block;
+  height: 26px;
+  margin: 0;
+  padding: 0;
+  /* Replace with position:fixed to get a scrolling close button. */
+  position: absolute;
+  width: 26px;
+}
+
+/**
+ * Tabs on the overlay.
+ */
+#overlay-tabs {
+  line-height: 27px;
+  margin: -28px 0 0 0;
+  position: absolute;
+  right: 20px; /* LTR */
+  text-transform: uppercase;
+}
+#overlay-tabs li {
+  display: inline;
+  list-style: none;
+  margin: 0 0 0 -3px; /* LTR */
+  padding: 0;
+}
+#overlay-tabs li a,
+#overlay-tabs li a:active,
+#overlay-tabs li a:visited,
+#overlay-tabs li a:hover {
+  background-color: #a6a7a2;
+  -moz-border-radius: 8px 8px 0 0;
+  -webkit-border-top-left-radius: 8px;
+  -webkit-border-top-right-radius: 8px;
+  border-radius: 8px 8px 0 0;
+  color: #000;
+  display: inline-block;
+  font-size: 11px;
+  font-weight: bold;
+  margin: 0 0 2px 0;
+  outline: 0;
+  padding: 0 14px;
+  text-decoration: none;
+}
+#overlay-tabs li.active a,
+#overlay-tabs li.active a.active,
+#overlay-tabs li.active a:active,
+#overlay-tabs li.active a:visited {
+  background-color: #fff;
+  margin: 0;
+  padding-bottom: 2px;
+}
+#overlay-tabs li a:focus,
+#overlay-tabs li a:hover {
+  color: #fff;
+}
+#overlay-tabs li.active a:focus,
+#overlay-tabs li.active a:hover {
+  color: #000;
+}
+
+/**
+ * Add to shortcuts link
+ */
+#overlay-titlebar .add-or-remove-shortcuts {
+  padding-top: 0.9em;
+}
+
+/**
+ * IE6 shows elements with position:fixed as position:static so replace
+ * it with position:absolute;
+ */
+* html #overlay-close,
+* html #overlay-close:hover {
+  position: absolute;
+}
+
+/**
+ * Disable message.
+ */
+#overlay-disable-message {
+  background-color: #fff;
+  margin: -20px auto 20px;
+  width: 80%;
+  -moz-border-radius: 0 0 8px 8px;
+  -webkit-border-bottom-left-radius: 8px;
+  -webkit-border-bottom-right-radius: 8px;
+  border-radius: 0 0 8px 8px;
+}
+.overlay-disable-message-focused {
+  padding: 0.5em;
+}
+.overlay-disable-message-focused a {
+  display: block;
+  float: left;
+}
+.overlay-disable-message-focused #overlay-dismiss-message {
+  float: right;
+}
diff --git a/htmltest/modules/overlay/overlay-child.js b/htmltest/modules/overlay/overlay-child.js
new file mode 100644
index 00000000..4ff6cf0c
--- /dev/null
+++ b/htmltest/modules/overlay/overlay-child.js
@@ -0,0 +1,196 @@
+/**
+ * @file
+ * Attaches the behaviors for the Overlay child pages.
+ */
+
+(function ($) {
+
+/**
+ * Attach the child dialog behavior to new content.
+ */
+Drupal.behaviors.overlayChild = {
+  attach: function (context, settings) {
+    // Make sure this behavior is not processed more than once.
+    if (this.processed) {
+      return;
+    }
+    this.processed = true;
+
+    // If we cannot reach the parent window, break out of the overlay.
+    if (!parent.Drupal || !parent.Drupal.overlay) {
+      window.location = window.location.href.replace(/([?&]?)render=overlay&?/g, '$1').replace(/\?$/, '');
+    }
+
+    var settings = settings.overlayChild || {};
+
+    // If the entire parent window should be refreshed when the overlay is
+    // closed, pass that information to the parent window.
+    if (settings.refreshPage) {
+      parent.Drupal.overlay.refreshPage = true;
+    }
+
+    // If a form has been submitted successfully, then the server side script
+    // may have decided to tell the parent window to close the popup dialog.
+    if (settings.closeOverlay) {
+      parent.Drupal.overlay.bindChild(window, true);
+      // Use setTimeout to close the child window from a separate thread,
+      // because the current one is busy processing Drupal behaviors.
+      setTimeout(function () {
+        if (typeof settings.redirect == 'string') {
+          parent.Drupal.overlay.redirect(settings.redirect);
+        }
+        else {
+          parent.Drupal.overlay.close();
+        }
+      }, 1);
+      return;
+    }
+
+    // If one of the regions displaying outside the overlay needs to be
+    // reloaded immediately, let the parent window know.
+    if (settings.refreshRegions) {
+      parent.Drupal.overlay.refreshRegions(settings.refreshRegions);
+    }
+
+    // Ok, now we can tell the parent window we're ready.
+    parent.Drupal.overlay.bindChild(window);
+
+    // IE8 crashes on certain pages if this isn't called; reason unknown.
+    window.scrollTo(window.scrollX, window.scrollY);
+
+    // Attach child related behaviors to the iframe document.
+    Drupal.overlayChild.attachBehaviors(context, settings);
+
+    // There are two links within the message that informs people about the
+    // overlay and how to disable it. Make sure both links are visible when
+    // either one has focus and add a class to the wrapper for styling purposes.
+    $('#overlay-disable-message', context)
+      .focusin(function () {
+        $(this).addClass('overlay-disable-message-focused');
+        $('a.element-focusable', this).removeClass('element-invisible');
+      })
+      .focusout(function () {
+        $(this).removeClass('overlay-disable-message-focused');
+        $('a.element-focusable', this).addClass('element-invisible');
+      });
+  }
+};
+
+/**
+ * Overlay object for child windows.
+ */
+Drupal.overlayChild = Drupal.overlayChild || {
+  behaviors: {}
+};
+
+Drupal.overlayChild.prototype = {};
+
+/**
+ * Attach child related behaviors to the iframe document.
+ */
+Drupal.overlayChild.attachBehaviors = function (context, settings) {
+  $.each(this.behaviors, function () {
+    this(context, settings);
+  });
+};
+
+/**
+ * Capture and handle clicks.
+ *
+ * Instead of binding a click event handler to every link we bind one to the
+ * document and handle events that bubble up. This also allows other scripts
+ * to bind their own handlers to links and also to prevent overlay's handling.
+ */
+Drupal.overlayChild.behaviors.addClickHandler = function (context, settings) {
+  $(document).bind('click.drupal-overlay mouseup.drupal-overlay', $.proxy(parent.Drupal.overlay, 'eventhandlerOverrideLink'));
+};
+
+/**
+ * Modify forms depending on their relation to the overlay.
+ *
+ * By default, forms are assumed to keep the flow in the overlay. Thus their
+ * action attribute get a ?render=overlay suffix.
+ */
+Drupal.overlayChild.behaviors.parseForms = function (context, settings) {
+  $('form', context).once('overlay', function () {
+    // Obtain the action attribute of the form.
+    var action = $(this).attr('action');
+    // Keep internal forms in the overlay.
+    if (action == undefined || (action.indexOf('http') != 0 && action.indexOf('https') != 0)) {
+      action += (action.indexOf('?') > -1 ? '&' : '?') + 'render=overlay';
+      $(this).attr('action', action);
+    }
+    // Submit external forms into a new window.
+    else {
+      $(this).attr('target', '_new');
+    }
+  });
+};
+
+/**
+ * Replace the overlay title with a message while loading another page.
+ */
+Drupal.overlayChild.behaviors.loading = function (context, settings) {
+  var $title;
+  var text = Drupal.t('Loading');
+  var dots = '';
+
+  $(document).bind('drupalOverlayBeforeLoad.drupal-overlay.drupal-overlay-child-loading', function () {
+    $title = $('#overlay-title').text(text);
+    var id = setInterval(function () {
+      dots = (dots.length > 10) ? '' : dots + '.';
+      $title.text(text + dots);
+    }, 500);
+  });
+};
+
+/**
+ * Switch active tab immediately.
+ */
+Drupal.overlayChild.behaviors.tabs = function (context, settings) {
+  var $tabsLinks = $('#overlay-tabs > li > a');
+
+  $('#overlay-tabs > li > a').bind('click.drupal-overlay', function () {
+    var active_tab = Drupal.t('(active tab)');
+    $tabsLinks.parent().siblings().removeClass('active').find('element-invisible:contains(' + active_tab + ')').appendTo(this);
+    $(this).parent().addClass('active');
+  });
+};
+
+/**
+ * If the shortcut add/delete button exists, move it to the overlay titlebar.
+ */
+Drupal.overlayChild.behaviors.shortcutAddLink = function (context, settings) {
+  // Remove any existing shortcut button markup from the titlebar.
+  $('#overlay-titlebar').find('.add-or-remove-shortcuts').remove();
+  // If the shortcut add/delete button exists, move it to the titlebar.
+  var $addToShortcuts = $('.add-or-remove-shortcuts');
+  if ($addToShortcuts.length) {
+    $addToShortcuts.insertAfter('#overlay-title');
+  }
+
+  $(document).bind('drupalOverlayBeforeLoad.drupal-overlay.drupal-overlay-child-loading', function () {
+    $('#overlay-titlebar').find('.add-or-remove-shortcuts').remove();
+  });
+};
+
+/**
+ * Use displacement from parent window.
+ */
+Drupal.overlayChild.behaviors.alterTableHeaderOffset = function (context, settings) {
+  if (Drupal.settings.tableHeaderOffset) {
+    Drupal.overlayChild.prevTableHeaderOffset = Drupal.settings.tableHeaderOffset;
+  }
+  Drupal.settings.tableHeaderOffset = 'Drupal.overlayChild.tableHeaderOffset';
+};
+
+/**
+ * Callback for Drupal.settings.tableHeaderOffset.
+ */
+Drupal.overlayChild.tableHeaderOffset = function () {
+  var topOffset = Drupal.overlayChild.prevTableHeaderOffset ? eval(Drupal.overlayChild.prevTableHeaderOffset + '()') : 0;
+
+  return topOffset + parseInt($(document.body).css('marginTop'));
+};
+
+})(jQuery);
diff --git a/htmltest/modules/overlay/overlay-parent.css b/htmltest/modules/overlay/overlay-parent.css
new file mode 100644
index 00000000..9459a7af
--- /dev/null
+++ b/htmltest/modules/overlay/overlay-parent.css
@@ -0,0 +1,55 @@
+
+/**
+ * @file
+ * Basic styling for the Overlay module.
+ */
+
+html.overlay-open,
+html.overlay-open body {
+  height: 100%;
+  overflow: hidden;
+}
+
+#overlay-container,
+.overlay-modal-background,
+.overlay-element {
+  height: 100%;
+  left: 0;
+  position: absolute;
+  top: 0;
+  width: 100%;
+  z-index: 500;
+}
+
+.overlay-modal-background {
+  /* Using a transparent png renders faster than using opacity */
+  background: transparent url(images/background.png) repeat;
+}
+
+.overlay-element {
+  background: transparent;
+  left: -200%;
+  z-index: 501;
+}
+.overlay-element.overlay-active {
+  left: 0;
+}
+
+html.overlay-open .displace-top,
+html.overlay-open .displace-bottom {
+  z-index: 600;
+}
+
+/**
+ * Within the overlay parent, the message about disabling the overlay is for
+ * screen-reader users only. It is always kept invisible with the
+ * element-invisible class, and removed from the tab order. Overlay-child.css
+ * contains styling for the same message appearing within the overlay, and
+ * intended for sighted users.
+ */
+#overlay-disable-message {
+  display: none;
+}
+html.overlay-open #overlay-disable-message {
+  display: block;
+}
diff --git a/htmltest/modules/overlay/overlay-parent.js b/htmltest/modules/overlay/overlay-parent.js
new file mode 100644
index 00000000..7452a515
--- /dev/null
+++ b/htmltest/modules/overlay/overlay-parent.js
@@ -0,0 +1,1015 @@
+/**
+ * @file
+ * Attaches the behaviors for the Overlay parent pages.
+ */
+
+(function ($) {
+
+/**
+ * Open the overlay, or load content into it, when an admin link is clicked.
+ */
+Drupal.behaviors.overlayParent = {
+  attach: function (context, settings) {
+    if (Drupal.overlay.isOpen) {
+      Drupal.overlay.makeDocumentUntabbable(context);
+    }
+
+    if (this.processed) {
+      return;
+    }
+    this.processed = true;
+
+    $(window)
+      // When the hash (URL fragment) changes, open the overlay if needed.
+      .bind('hashchange.drupal-overlay', $.proxy(Drupal.overlay, 'eventhandlerOperateByURLFragment'))
+      // Trigger the hashchange handler once, after the page is loaded, so that
+      // permalinks open the overlay.
+      .triggerHandler('hashchange.drupal-overlay');
+
+    $(document)
+      // Instead of binding a click event handler to every link we bind one to
+      // the document and only handle events that bubble up. This allows other
+      // scripts to bind their own handlers to links and also to prevent
+      // overlay's handling.
+      .bind('click.drupal-overlay mouseup.drupal-overlay', $.proxy(Drupal.overlay, 'eventhandlerOverrideLink'));
+  }
+};
+
+/**
+ * Overlay object for parent windows.
+ *
+ * Events
+ * Overlay triggers a number of events that can be used by other scripts.
+ * - drupalOverlayOpen: This event is triggered when the overlay is opened.
+ * - drupalOverlayBeforeClose: This event is triggered when the overlay attempts
+ *   to close. If an event handler returns false, the close will be prevented.
+ * - drupalOverlayClose: This event is triggered when the overlay is closed.
+ * - drupalOverlayBeforeLoad: This event is triggered right before a new URL
+ *   is loaded into the overlay.
+ * - drupalOverlayReady: This event is triggered when the DOM of the overlay
+ *   child document is fully loaded.
+ * - drupalOverlayLoad: This event is triggered when the overlay is finished
+ *   loading.
+ * - drupalOverlayResize: This event is triggered when the overlay is being
+ *   resized to match the parent window.
+ */
+Drupal.overlay = Drupal.overlay || {
+  isOpen: false,
+  isOpening: false,
+  isClosing: false,
+  isLoading: false
+};
+
+Drupal.overlay.prototype = {};
+
+/**
+ * Open the overlay.
+ *
+ * @param url
+ *   The URL of the page to open in the overlay.
+ *
+ * @return
+ *   TRUE if the overlay was opened, FALSE otherwise.
+ */
+Drupal.overlay.open = function (url) {
+  // Just one overlay is allowed.
+  if (this.isOpen || this.isOpening) {
+    return this.load(url);
+  }
+  this.isOpening = true;
+  // Store the original document title.
+  this.originalTitle = document.title;
+
+  // Create the dialog and related DOM elements.
+  this.create();
+
+  this.isOpening = false;
+  this.isOpen = true;
+  $(document.documentElement).addClass('overlay-open');
+  this.makeDocumentUntabbable();
+
+  // Allow other scripts to respond to this event.
+  $(document).trigger('drupalOverlayOpen');
+
+  return this.load(url);
+};
+
+/**
+ * Create the underlying markup and behaviors for the overlay.
+ */
+Drupal.overlay.create = function () {
+  this.$container = $(Drupal.theme('overlayContainer'))
+    .appendTo(document.body);
+
+  // Overlay uses transparent iframes that cover the full parent window.
+  // When the overlay is open the scrollbar of the parent window is hidden.
+  // Because some browsers show a white iframe background for a short moment
+  // while loading a page into an iframe, overlay uses two iframes. By loading
+  // the page in a hidden (inactive) iframe the user doesn't see the white
+  // background. When the page is loaded the active and inactive iframes
+  // are switched.
+  this.activeFrame = this.$iframeA = $(Drupal.theme('overlayElement'))
+    .appendTo(this.$container);
+
+  this.inactiveFrame = this.$iframeB = $(Drupal.theme('overlayElement'))
+    .appendTo(this.$container);
+
+  this.$iframeA.bind('load.drupal-overlay', { self: this.$iframeA[0], sibling: this.$iframeB }, $.proxy(this, 'loadChild'));
+  this.$iframeB.bind('load.drupal-overlay', { self: this.$iframeB[0], sibling: this.$iframeA }, $.proxy(this, 'loadChild'));
+
+  // Add a second class "drupal-overlay-open" to indicate these event handlers
+  // should only be bound when the overlay is open.
+  var eventClass = '.drupal-overlay.drupal-overlay-open';
+  $(window)
+    .bind('resize' + eventClass, $.proxy(this, 'eventhandlerOuterResize'));
+  $(document)
+    .bind('drupalOverlayLoad' + eventClass, $.proxy(this, 'eventhandlerOuterResize'))
+    .bind('drupalOverlayReady' + eventClass +
+          ' drupalOverlayClose' + eventClass, $.proxy(this, 'eventhandlerSyncURLFragment'))
+    .bind('drupalOverlayClose' + eventClass, $.proxy(this, 'eventhandlerRefreshPage'))
+    .bind('drupalOverlayBeforeClose' + eventClass +
+          ' drupalOverlayBeforeLoad' + eventClass +
+          ' drupalOverlayResize' + eventClass, $.proxy(this, 'eventhandlerDispatchEvent'));
+
+  if ($('.overlay-displace-top, .overlay-displace-bottom').length) {
+    $(document)
+      .bind('drupalOverlayResize' + eventClass, $.proxy(this, 'eventhandlerAlterDisplacedElements'))
+      .bind('drupalOverlayClose' + eventClass, $.proxy(this, 'eventhandlerRestoreDisplacedElements'));
+  }
+};
+
+/**
+ * Load the given URL into the overlay iframe.
+ *
+ * Use this method to change the URL being loaded in the overlay if it is
+ * already open.
+ *
+ * @return
+ *   TRUE if URL is loaded into the overlay, FALSE otherwise.
+ */
+Drupal.overlay.load = function (url) {
+  if (!this.isOpen) {
+    return false;
+  }
+
+  // Allow other scripts to respond to this event.
+  $(document).trigger('drupalOverlayBeforeLoad');
+
+  $(document.documentElement).addClass('overlay-loading');
+
+  // The contentDocument property is not supported in IE until IE8.
+  var iframeDocument = this.inactiveFrame[0].contentDocument || this.inactiveFrame[0].contentWindow.document;
+
+  // location.replace doesn't create a history entry. location.href does.
+  // In this case, we want location.replace, as we're creating the history
+  // entry using URL fragments.
+  iframeDocument.location.replace(url);
+
+  return true;
+};
+
+/**
+ * Close the overlay and remove markup related to it from the document.
+ *
+ * @return
+ *   TRUE if the overlay was closed, FALSE otherwise.
+ */
+Drupal.overlay.close = function () {
+  // Prevent double execution when close is requested more than once.
+  if (!this.isOpen || this.isClosing) {
+    return false;
+  }
+
+  // Allow other scripts to respond to this event.
+  var event = $.Event('drupalOverlayBeforeClose');
+  $(document).trigger(event);
+  // If a handler returned false, the close will be prevented.
+  if (event.isDefaultPrevented()) {
+    return false;
+  }
+
+  this.isClosing = true;
+  this.isOpen = false;
+  $(document.documentElement).removeClass('overlay-open');
+  // Restore the original document title.
+  document.title = this.originalTitle;
+  this.makeDocumentTabbable();
+
+  // Allow other scripts to respond to this event.
+  $(document).trigger('drupalOverlayClose');
+
+  // When the iframe is still loading don't destroy it immediately but after
+  // the content is loaded (see Drupal.overlay.loadChild).
+  if (!this.isLoading) {
+    this.destroy();
+    this.isClosing = false;
+  }
+  return true;
+};
+
+/**
+ * Destroy the overlay.
+ */
+Drupal.overlay.destroy = function () {
+  $([document, window]).unbind('.drupal-overlay-open');
+  this.$container.remove();
+
+  this.$container = null;
+  this.$iframeA = null;
+  this.$iframeB = null;
+
+  this.iframeWindow = null;
+};
+
+/**
+ * Redirect the overlay parent window to the given URL.
+ *
+ * @param url
+ *   Can be an absolute URL or a relative link to the domain root.
+ */
+Drupal.overlay.redirect = function (url) {
+  // Create a native Link object, so we can use its object methods.
+  var link = $(url.link(url)).get(0);
+
+  // If the link is already open, force the hashchange event to simulate reload.
+  if (window.location.href == link.href) {
+    $(window).triggerHandler('hashchange.drupal-overlay');
+  }
+
+  window.location.href = link.href;
+  return true;
+};
+
+/**
+ * Bind the child window.
+ *
+ * Note that this function is fired earlier than Drupal.overlay.loadChild.
+ */
+Drupal.overlay.bindChild = function (iframeWindow, isClosing) {
+  this.iframeWindow = iframeWindow;
+
+  // We are done if the child window is closing.
+  if (isClosing || this.isClosing || !this.isOpen) {
+    return;
+  }
+
+  // Allow other scripts to respond to this event.
+  $(document).trigger('drupalOverlayReady');
+};
+
+/**
+ * Event handler: load event handler for the overlay iframe.
+ *
+ * @param event
+ *   Event being triggered, with the following restrictions:
+ *   - event.type: load
+ *   - event.currentTarget: iframe
+ */
+Drupal.overlay.loadChild = function (event) {
+  var iframe = event.data.self;
+  var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
+  var iframeWindow = iframeDocument.defaultView || iframeDocument.parentWindow;
+  if (iframeWindow.location == 'about:blank') {
+    return;
+  }
+
+  this.isLoading = false;
+  $(document.documentElement).removeClass('overlay-loading');
+  event.data.sibling.removeClass('overlay-active').attr({ 'tabindex': -1 });
+
+  // Only continue when overlay is still open and not closing.
+  if (this.isOpen && !this.isClosing) {
+    // And child document is an actual overlayChild.
+    if (iframeWindow.Drupal && iframeWindow.Drupal.overlayChild) {
+      // Replace the document title with title of iframe.
+      document.title = iframeWindow.document.title;
+
+      this.activeFrame = $(iframe)
+        .addClass('overlay-active')
+        // Add a title attribute to the iframe for accessibility.
+        .attr('title', Drupal.t('@title dialog', { '@title': iframeWindow.jQuery('#overlay-title').text() })).removeAttr('tabindex');
+      this.inactiveFrame = event.data.sibling;
+
+      // Load an empty document into the inactive iframe.
+      (this.inactiveFrame[0].contentDocument || this.inactiveFrame[0].contentWindow.document).location.replace('about:blank');
+
+      // Move the focus to just before the "skip to main content" link inside
+      // the overlay.
+      this.activeFrame.focus();
+      var skipLink = iframeWindow.jQuery('a:first');
+      Drupal.overlay.setFocusBefore(skipLink, iframeWindow.document);
+
+      // Allow other scripts to respond to this event.
+      $(document).trigger('drupalOverlayLoad');
+    }
+    else {
+      window.location = iframeWindow.location.href.replace(/([?&]?)render=overlay&?/g, '$1').replace(/\?$/, '');
+    }
+  }
+  else {
+    this.destroy();
+  }
+};
+
+/**
+ * Creates a placeholder element to receive document focus.
+ *
+ * Setting the document focus to a link will make it visible, even if it's a
+ * "skip to main content" link that should normally be visible only when the
+ * user tabs to it. This function can be used to set the document focus to
+ * just before such an invisible link.
+ *
+ * @param $element
+ *   The jQuery element that should receive focus on the next tab press.
+ * @param document
+ *   The iframe window element to which the placeholder should be added. The
+ *   placeholder element has to be created inside the same iframe as the element
+ *   it precedes, to keep IE happy. (http://bugs.jquery.com/ticket/4059)
+ */
+Drupal.overlay.setFocusBefore = function ($element, document) {
+  // Create an anchor inside the placeholder document.
+  var placeholder = document.createElement('a');
+  var $placeholder = $(placeholder).addClass('element-invisible').attr('href', '#');
+  // Put the placeholder where it belongs, and set the document focus to it.
+  $placeholder.insertBefore($element);
+  $placeholder.focus();
+  // Make the placeholder disappear as soon as it loses focus, so that it
+  // doesn't appear in the tab order again.
+  $placeholder.one('blur', function () {
+    $(this).remove();
+  });
+};
+
+/**
+ * Check if the given link is in the administrative section of the site.
+ *
+ * @param url
+ *   The URL to be tested.
+ *
+ * @return boolean
+ *   TRUE if the URL represents an administrative link, FALSE otherwise.
+ */
+Drupal.overlay.isAdminLink = function (url) {
+  if (Drupal.overlay.isExternalLink(url)) {
+    return false;
+  }
+
+  var path = this.getPath(url);
+
+  // Turn the list of administrative paths into a regular expression.
+  if (!this.adminPathRegExp) {
+    var prefix = '';
+    if (Drupal.settings.overlay.pathPrefixes.length) {
+      // Allow path prefixes used for language negatiation followed by slash,
+      // and the empty string.
+      prefix = '(' + Drupal.settings.overlay.pathPrefixes.join('/|') + '/|)';
+    }
+    var adminPaths = '^' + prefix + '(' + Drupal.settings.overlay.paths.admin.replace(/\s+/g, '|') + ')$';
+    var nonAdminPaths = '^' + prefix + '(' + Drupal.settings.overlay.paths.non_admin.replace(/\s+/g, '|') + ')$';
+    adminPaths = adminPaths.replace(/\*/g, '.*');
+    nonAdminPaths = nonAdminPaths.replace(/\*/g, '.*');
+    this.adminPathRegExp = new RegExp(adminPaths);
+    this.nonAdminPathRegExp = new RegExp(nonAdminPaths);
+  }
+
+  return this.adminPathRegExp.exec(path) && !this.nonAdminPathRegExp.exec(path);
+};
+
+/**
+ * Determine whether a link is external to the site.
+ *
+ * @param url
+ *   The URL to be tested.
+ *
+ * @return boolean
+ *   TRUE if the URL is external to the site, FALSE otherwise.
+ */
+Drupal.overlay.isExternalLink = function (url) {
+  var re = RegExp('^((f|ht)tps?:)?//(?!' + window.location.host + ')');
+  return re.test(url);
+};
+
+/**
+ * Event handler: resizes overlay according to the size of the parent window.
+ *
+ * @param event
+ *   Event being triggered, with the following restrictions:
+ *   - event.type: any
+ *   - event.currentTarget: any
+ */
+Drupal.overlay.eventhandlerOuterResize = function (event) {
+  // Proceed only if the overlay still exists.
+  if (!(this.isOpen || this.isOpening) || this.isClosing || !this.iframeWindow) {
+    return;
+  }
+
+  // IE6 uses position:absolute instead of position:fixed.
+  if (typeof document.body.style.maxHeight != 'string') {
+    this.activeFrame.height($(window).height());
+  }
+
+  // Allow other scripts to respond to this event.
+  $(document).trigger('drupalOverlayResize');
+};
+
+/**
+ * Event handler: resizes displaced elements so they won't overlap the scrollbar
+ * of overlay's iframe.
+ *
+ * @param event
+ *   Event being triggered, with the following restrictions:
+ *   - event.type: any
+ *   - event.currentTarget: any
+ */
+Drupal.overlay.eventhandlerAlterDisplacedElements = function (event) {
+  // Proceed only if the overlay still exists.
+  if (!(this.isOpen || this.isOpening) || this.isClosing || !this.iframeWindow) {
+    return;
+  }
+
+  $(this.iframeWindow.document.body).css({
+    marginTop: Drupal.overlay.getDisplacement('top'),
+    marginBottom: Drupal.overlay.getDisplacement('bottom')
+  })
+  // IE7 isn't reflowing the document immediately.
+  // @todo This might be fixed in a cleaner way.
+  .addClass('overlay-trigger-reflow').removeClass('overlay-trigger-reflow');
+
+  var documentHeight = this.iframeWindow.document.body.clientHeight;
+  var documentWidth = this.iframeWindow.document.body.clientWidth;
+  // IE6 doesn't support maxWidth, use width instead.
+  var maxWidthName = (typeof document.body.style.maxWidth == 'string') ? 'maxWidth' : 'width';
+
+  if (Drupal.overlay.leftSidedScrollbarOffset === undefined && $(document.documentElement).attr('dir') === 'rtl') {
+    // We can't use element.clientLeft to detect whether scrollbars are placed
+    // on the left side of the element when direction is set to "rtl" as most
+    // browsers dont't support it correctly.
+    // http://www.gtalbot.org/BugzillaSection/DocumentAllDHTMLproperties.html
+    // There seems to be absolutely no way to detect whether the scrollbar
+    // is on the left side in Opera; always expect scrollbar to be on the left.
+    if ($.browser.opera) {
+      Drupal.overlay.leftSidedScrollbarOffset = document.documentElement.clientWidth - this.iframeWindow.document.documentElement.clientWidth + this.iframeWindow.document.documentElement.clientLeft;
+    }
+    else if (this.iframeWindow.document.documentElement.clientLeft) {
+      Drupal.overlay.leftSidedScrollbarOffset = this.iframeWindow.document.documentElement.clientLeft;
+    }
+    else {
+      var el1 = $('<div style="direction: rtl; overflow: scroll;"></div>').appendTo(document.body);
+      var el2 = $('<div></div>').appendTo(el1);
+      Drupal.overlay.leftSidedScrollbarOffset = parseInt(el2[0].offsetLeft - el1[0].offsetLeft);
+      el1.remove();
+    }
+  }
+
+  // Consider any element that should be visible above the overlay (such as
+  // a toolbar).
+  $('.overlay-displace-top, .overlay-displace-bottom').each(function () {
+    var data = $(this).data();
+    var maxWidth = documentWidth;
+    // In IE, Shadow filter makes element to overlap the scrollbar with 1px.
+    if (this.filters && this.filters.length && this.filters.item('DXImageTransform.Microsoft.Shadow')) {
+      maxWidth -= 1;
+    }
+
+    if (Drupal.overlay.leftSidedScrollbarOffset) {
+      $(this).css('left', Drupal.overlay.leftSidedScrollbarOffset);
+    }
+
+    // Prevent displaced elements overlapping window's scrollbar.
+    var currentMaxWidth = parseInt($(this).css(maxWidthName));
+    if ((data.drupalOverlay && data.drupalOverlay.maxWidth) || isNaN(currentMaxWidth) || currentMaxWidth > maxWidth || currentMaxWidth <= 0) {
+      $(this).css(maxWidthName, maxWidth);
+      (data.drupalOverlay = data.drupalOverlay || {}).maxWidth = true;
+    }
+
+    // Use a more rigorous approach if the displaced element still overlaps
+    // window's scrollbar; clip the element on the right.
+    var offset = $(this).offset();
+    var offsetRight = offset.left + $(this).outerWidth();
+    if ((data.drupalOverlay && data.drupalOverlay.clip) || offsetRight > maxWidth) {
+      if (Drupal.overlay.leftSidedScrollbarOffset) {
+        $(this).css('clip', 'rect(auto, auto, ' + (documentHeight - offset.top) + 'px, ' + (Drupal.overlay.leftSidedScrollbarOffset + 2) + 'px)');
+      }
+      else {
+        $(this).css('clip', 'rect(auto, ' + (maxWidth - offset.left) + 'px, ' + (documentHeight - offset.top) + 'px, auto)');
+      }
+      (data.drupalOverlay = data.drupalOverlay || {}).clip = true;
+    }
+  });
+};
+
+/**
+ * Event handler: restores size of displaced elements as they were before
+ * overlay was opened.
+ *
+ * @param event
+ *   Event being triggered, with the following restrictions:
+ *   - event.type: any
+ *   - event.currentTarget: any
+ */
+Drupal.overlay.eventhandlerRestoreDisplacedElements = function (event) {
+  var $displacedElements = $('.overlay-displace-top, .overlay-displace-bottom');
+  try {
+    $displacedElements.css({ maxWidth: '', clip: '' });
+  }
+  // IE bug that doesn't allow unsetting style.clip (http://dev.jquery.com/ticket/6512).
+  catch (err) {
+    $displacedElements.attr('style', function (index, attr) {
+      return attr.replace(/clip\s*:\s*rect\([^)]+\);?/i, '');
+    });
+  }
+};
+
+/**
+ * Event handler: overrides href of administrative links to be opened in
+ * the overlay.
+ *
+ * This click event handler should be bound to any document (for example the
+ * overlay iframe) of which you want links to open in the overlay.
+ *
+ * @param event
+ *   Event being triggered, with the following restrictions:
+ *   - event.type: click, mouseup
+ *   - event.currentTarget: document
+ *
+ * @see Drupal.overlayChild.behaviors.addClickHandler
+ */
+Drupal.overlay.eventhandlerOverrideLink = function (event) {
+  // In some browsers the click event isn't fired for right-clicks. Use the
+  // mouseup event for right-clicks and the click event for everything else.
+  if ((event.type == 'click' && event.button == 2) || (event.type == 'mouseup' && event.button != 2)) {
+    return;
+  }
+
+  var $target = $(event.target);
+
+  // Only continue if clicked target (or one of its parents) is a link.
+  if (!$target.is('a')) {
+    $target = $target.closest('a');
+    if (!$target.length) {
+      return;
+    }
+  }
+
+  // Never open links in the overlay that contain the overlay-exclude class.
+  if ($target.hasClass('overlay-exclude')) {
+    return;
+  }
+
+  // Close the overlay when the link contains the overlay-close class.
+  if ($target.hasClass('overlay-close')) {
+    // Clearing the overlay URL fragment will close the overlay.
+    $.bbq.removeState('overlay');
+    return;
+  }
+
+  var target = $target[0];
+  var href = target.href;
+  // Only handle links that have an href attribute and use the HTTP(S) protocol.
+  if (href != undefined && href != '' && target.protocol.match(/^https?\:/)) {
+    var anchor = href.replace(target.ownerDocument.location.href, '');
+    // Skip anchor links.
+    if (anchor.length == 0 || anchor.charAt(0) == '#') {
+      return;
+    }
+    // Open admin links in the overlay.
+    else if (this.isAdminLink(href)) {
+      // If the link contains the overlay-restore class and the overlay-context
+      // state is set, also update the parent window's location.
+      var parentLocation = ($target.hasClass('overlay-restore') && typeof $.bbq.getState('overlay-context') == 'string')
+        ? Drupal.settings.basePath + $.bbq.getState('overlay-context')
+        : null;
+      href = this.fragmentizeLink($target.get(0), parentLocation);
+      // Only override default behavior when left-clicking and user is not
+      // pressing the ALT, CTRL, META (Command key on the Macintosh keyboard)
+      // or SHIFT key.
+      if (event.button == 0 && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) {
+        // Redirect to a fragmentized href. This will trigger a hashchange event.
+        this.redirect(href);
+        // Prevent default action and further propagation of the event.
+        return false;
+      }
+      // Otherwise alter clicked link's href. This is being picked up by
+      // the default action handler.
+      else {
+        $target
+          // Restore link's href attribute on blur or next click.
+          .one('blur mousedown', { target: target, href: target.href }, function (event) { $(event.data.target).attr('href', event.data.href); })
+          .attr('href', href);
+      }
+    }
+    // Non-admin links should close the overlay and open in the main window,
+    // which is the default action for a link. We only need to handle them
+    // if the overlay is open and the clicked link is inside the overlay iframe.
+    else if (this.isOpen && target.ownerDocument === this.iframeWindow.document) {
+      // Open external links in the immediate parent of the frame, unless the
+      // link already has a different target.
+      if (target.hostname != window.location.hostname) {
+        if (!$target.attr('target')) {
+          $target.attr('target', '_parent');
+        }
+      }
+      else {
+        // Add the overlay-context state to the link, so "overlay-restore" links
+        // can restore the context.
+        if ($target[0].hash) {
+          // Leave links with an existing fragment alone. Adding an extra
+          // parameter to a link like "node/1#section-1" breaks the link.
+        }
+        else {
+          // For links with no existing fragment, add the overlay context.
+          $target.attr('href', $.param.fragment(href, { 'overlay-context': this.getPath(window.location) + window.location.search }));
+        }
+
+        // When the link has a destination query parameter and that destination
+        // is an admin link we need to fragmentize it. This will make it reopen
+        // in the overlay.
+        var params = $.deparam.querystring(href);
+        if (params.destination && this.isAdminLink(params.destination)) {
+          var fragmentizedDestination = $.param.fragment(this.getPath(window.location), { overlay: params.destination });
+          $target.attr('href', $.param.querystring(href, { destination: fragmentizedDestination }));
+        }
+
+        // Make the link open in the immediate parent of the frame, unless the
+        // link already has a different target.
+        if (!$target.attr('target')) {
+          $target.attr('target', '_parent');
+        }
+      }
+    }
+  }
+};
+
+/**
+ * Event handler: opens or closes the overlay based on the current URL fragment.
+ *
+ * @param event
+ *   Event being triggered, with the following restrictions:
+ *   - event.type: hashchange
+ *   - event.currentTarget: document
+ */
+Drupal.overlay.eventhandlerOperateByURLFragment = function (event) {
+  // If we changed the hash to reflect an internal redirect in the overlay,
+  // its location has already been changed, so don't do anything.
+  if ($.data(window.location, window.location.href) === 'redirect') {
+    $.data(window.location, window.location.href, null);
+    return;
+  }
+
+  // Get the overlay URL from the current URL fragment.
+  var state = $.bbq.getState('overlay');
+  if (state) {
+    // Append render variable, so the server side can choose the right
+    // rendering and add child frame code to the page if needed.
+    var url = $.param.querystring(Drupal.settings.basePath + state, { render: 'overlay' });
+
+    this.open(url);
+    this.resetActiveClass(this.getPath(Drupal.settings.basePath + state));
+  }
+  // If there is no overlay URL in the fragment and the overlay is (still)
+  // open, close the overlay.
+  else if (this.isOpen && !this.isClosing) {
+    this.close();
+    this.resetActiveClass(this.getPath(window.location));
+  }
+};
+
+/**
+ * Event handler: makes sure the internal overlay URL is reflected in the parent
+ * URL fragment.
+ *
+ * Normally the parent URL fragment determines the overlay location. However, if
+ * the overlay redirects internally, the parent doesn't get informed, and the
+ * parent URL fragment will be out of date. This is a sanity check to make
+ * sure we're in the right place.
+ *
+ * The parent URL fragment is also not updated automatically when overlay's
+ * open, close or load functions are used directly (instead of through
+ * eventhandlerOperateByURLFragment).
+ *
+ * @param event
+ *   Event being triggered, with the following restrictions:
+ *   - event.type: drupalOverlayReady, drupalOverlayClose
+ *   - event.currentTarget: document
+ */
+Drupal.overlay.eventhandlerSyncURLFragment = function (event) {
+  if (this.isOpen) {
+    var expected = $.bbq.getState('overlay');
+    // This is just a sanity check, so we're comparing paths, not query strings.
+    if (this.getPath(Drupal.settings.basePath + expected) != this.getPath(this.iframeWindow.document.location)) {
+      // There may have been a redirect inside the child overlay window that the
+      // parent wasn't aware of. Update the parent URL fragment appropriately.
+      var newLocation = Drupal.overlay.fragmentizeLink(this.iframeWindow.document.location);
+      // Set a 'redirect' flag on the new location so the hashchange event handler
+      // knows not to change the overlay's content.
+      $.data(window.location, newLocation, 'redirect');
+      // Use location.replace() so we don't create an extra history entry.
+      window.location.replace(newLocation);
+    }
+  }
+  else {
+    $.bbq.removeState('overlay');
+  }
+};
+
+/**
+ * Event handler: if the child window suggested that the parent refresh on
+ * close, force a page refresh.
+ *
+ * @param event
+ *   Event being triggered, with the following restrictions:
+ *   - event.type: drupalOverlayClose
+ *   - event.currentTarget: document
+ */
+Drupal.overlay.eventhandlerRefreshPage = function (event) {
+  if (Drupal.overlay.refreshPage) {
+    window.location.reload(true);
+  }
+};
+
+/**
+ * Event handler: dispatches events to the overlay document.
+ *
+ * @param event
+ *   Event being triggered, with the following restrictions:
+ *   - event.type: any
+ *   - event.currentTarget: any
+ */
+Drupal.overlay.eventhandlerDispatchEvent = function (event) {
+  if (this.iframeWindow && this.iframeWindow.document) {
+    this.iframeWindow.jQuery(this.iframeWindow.document).trigger(event);
+  }
+};
+
+/**
+ * Make a regular admin link into a URL that will trigger the overlay to open.
+ *
+ * @param link
+ *   A JavaScript Link object (i.e. an <a> element).
+ * @param parentLocation
+ *   (optional) URL to override the parent window's location with.
+ *
+ * @return
+ *   A URL that will trigger the overlay (in the form
+ *   /node/1#overlay=admin/config).
+ */
+Drupal.overlay.fragmentizeLink = function (link, parentLocation) {
+  // Don't operate on links that are already overlay-ready.
+  var params = $.deparam.fragment(link.href);
+  if (params.overlay) {
+    return link.href;
+  }
+
+  // Determine the link's original destination. Set ignorePathFromQueryString to
+  // true to prevent transforming this link into a clean URL while clean URLs
+  // may be disabled.
+  var path = this.getPath(link, true);
+  // Preserve existing query and fragment parameters in the URL, except for
+  // "render=overlay" which is re-added in Drupal.overlay.eventhandlerOperateByURLFragment.
+  var destination = path + link.search.replace(/&?render=overlay/, '').replace(/\?$/, '') + link.hash;
+
+  // Assemble and return the overlay-ready link.
+  return $.param.fragment(parentLocation || window.location.href, { overlay: destination });
+};
+
+/**
+ * Refresh any regions of the page that are displayed outside the overlay.
+ *
+ * @param data
+ *   An array of objects with information on the page regions to be refreshed.
+ *   For each object, the key is a CSS class identifying the region to be
+ *   refreshed, and the value represents the section of the Drupal $page array
+ *   corresponding to this region.
+ */
+Drupal.overlay.refreshRegions = function (data) {
+  $.each(data, function () {
+    var region_info = this;
+    $.each(region_info, function (regionClass) {
+      var regionName = region_info[regionClass];
+      var regionSelector = '.' + regionClass;
+      // Allow special behaviors to detach.
+      Drupal.detachBehaviors($(regionSelector));
+      $.get(Drupal.settings.basePath + Drupal.settings.overlay.ajaxCallback + '/' + regionName, function (newElement) {
+        $(regionSelector).replaceWith($(newElement));
+        Drupal.attachBehaviors($(regionSelector), Drupal.settings);
+      });
+    });
+  });
+};
+
+/**
+ * Reset the active class on links in displaced elements according to
+ * given path.
+ *
+ * @param activePath
+ *   Path to match links against.
+ */
+Drupal.overlay.resetActiveClass = function(activePath) {
+  var self = this;
+  var windowDomain = window.location.protocol + window.location.hostname;
+
+  $('.overlay-displace-top, .overlay-displace-bottom')
+  .find('a[href]')
+  // Remove active class from all links in displaced elements.
+  .removeClass('active')
+  // Add active class to links that match activePath.
+  .each(function () {
+    var linkDomain = this.protocol + this.hostname;
+    var linkPath = self.getPath(this);
+
+    // A link matches if it is part of the active trail of activePath, except
+    // for frontpage links.
+    if (linkDomain == windowDomain && (activePath + '/').indexOf(linkPath + '/') === 0 && (linkPath !== '' || activePath === '')) {
+      $(this).addClass('active');
+    }
+  });
+};
+
+/**
+ * Helper function to get the (corrected) Drupal path of a link.
+ *
+ * @param link
+ *   Link object or string to get the Drupal path from.
+ * @param ignorePathFromQueryString
+ *   Boolean whether to ignore path from query string if path appears empty.
+ *
+ * @return
+ *   The Drupal path.
+ */
+Drupal.overlay.getPath = function (link, ignorePathFromQueryString) {
+  if (typeof link == 'string') {
+    // Create a native Link object, so we can use its object methods.
+    link = $(link.link(link)).get(0);
+  }
+
+  var path = link.pathname;
+  // Ensure a leading slash on the path, omitted in some browsers.
+  if (path.charAt(0) != '/') {
+    path = '/' + path;
+  }
+  path = path.replace(new RegExp(Drupal.settings.basePath + '(?:index.php)?'), '');
+  if (path == '' && !ignorePathFromQueryString) {
+    // If the path appears empty, it might mean the path is represented in the
+    // query string (clean URLs are not used).
+    var match = new RegExp('([?&])q=(.+)([&#]|$)').exec(link.search);
+    if (match && match.length == 4) {
+      path = match[2];
+    }
+  }
+
+  return path;
+};
+
+/**
+ * Get the total displacement of given region.
+ *
+ * @param region
+ *   Region name. Either "top" or "bottom".
+ *
+ * @return
+ *   The total displacement of given region in pixels.
+ */
+Drupal.overlay.getDisplacement = function (region) {
+  var displacement = 0;
+  var lastDisplaced = $('.overlay-displace-' + region + ':last');
+  if (lastDisplaced.length) {
+    displacement = lastDisplaced.offset().top + lastDisplaced.outerHeight();
+
+    // In modern browsers (including IE9), when box-shadow is defined, use the
+    // normal height.
+    var cssBoxShadowValue = lastDisplaced.css('box-shadow');
+    var boxShadow = (typeof cssBoxShadowValue !== 'undefined' && cssBoxShadowValue !== 'none');
+    // In IE8 and below, we use the shadow filter to apply box-shadow styles to
+    // the toolbar. It adds some extra height that we need to remove.
+    if (!boxShadow && /DXImageTransform\.Microsoft\.Shadow/.test(lastDisplaced.css('filter'))) {
+      displacement -= lastDisplaced[0].filters.item('DXImageTransform.Microsoft.Shadow').strength;
+      displacement = Math.max(0, displacement);
+    }
+  }
+  return displacement;
+};
+
+/**
+ * Makes elements outside the overlay unreachable via the tab key.
+ *
+ * @param context
+ *   The part of the DOM that should have its tabindexes changed. Defaults to
+ *   the entire page.
+ */
+Drupal.overlay.makeDocumentUntabbable = function (context) {
+  // Manipulating tabindexes for the entire document is unacceptably slow in IE6
+  // and IE7, so in those browsers, the underlying page will still be reachable
+  // via the tab key. However, we still make the links within the Disable
+  // message unreachable, because the same message also exists within the
+  // child document. The duplicate copy in the underlying document is only for
+  // assisting screen-reader users navigating the document with reading commands
+  // that follow markup order rather than tab order.
+  if (jQuery.browser.msie && parseInt(jQuery.browser.version, 10) < 8) {
+    $('#overlay-disable-message a', context).attr('tabindex', -1);
+    return;
+  }
+
+  context = context || document.body;
+  var $overlay, $tabbable, $hasTabindex;
+
+  // Determine which elements on the page already have a tabindex.
+  $hasTabindex = $('[tabindex] :not(.overlay-element)', context);
+  // Record the tabindex for each element, so we can restore it later.
+  $hasTabindex.each(Drupal.overlay._recordTabindex);
+  // Add the tabbable elements from the current context to any that we might
+  // have previously recorded.
+  Drupal.overlay._hasTabindex = $hasTabindex.add(Drupal.overlay._hasTabindex);
+
+  // Set tabindex to -1 on everything outside the overlay and toolbars, so that
+  // the underlying page is unreachable.
+
+  // By default, browsers make a, area, button, input, object, select, textarea,
+  // and iframe elements reachable via the tab key.
+  $tabbable = $('a, area, button, input, object, select, textarea, iframe');
+  // If another element (like a div) has a tabindex, it's also tabbable.
+  $tabbable = $tabbable.add($hasTabindex);
+  // Leave links inside the overlay and toolbars alone.
+  $overlay = $('.overlay-element, #overlay-container, .overlay-displace-top, .overlay-displace-bottom').find('*');
+  $tabbable = $tabbable.not($overlay);
+  // We now have a list of everything in the underlying document that could
+  // possibly be reachable via the tab key. Make it all unreachable.
+  $tabbable.attr('tabindex', -1);
+};
+
+/**
+ * Restores the original tabindex value of a group of elements.
+ *
+ * @param context
+ *   The part of the DOM that should have its tabindexes restored. Defaults to
+ *   the entire page.
+ */
+Drupal.overlay.makeDocumentTabbable = function (context) {
+  // Manipulating tabindexes is unacceptably slow in IE6 and IE7. In those
+  // browsers, the underlying page was never made unreachable via tab, so
+  // there is no work to be done here.
+  if (jQuery.browser.msie && parseInt(jQuery.browser.version, 10) < 8) {
+    return;
+  }
+
+  var $needsTabindex;
+  context = context || document.body;
+
+  // Make the underlying document tabbable again by removing all existing
+  // tabindex attributes.
+  var $tabindex = $('[tabindex]', context);
+  if (jQuery.browser.msie && parseInt(jQuery.browser.version, 10) < 8) {
+    // removeAttr('tabindex') is broken in IE6-7, but the DOM function
+    // removeAttribute works.
+    var i;
+    var length = $tabindex.length;
+    for (i = 0; i < length; i++) {
+      $tabindex[i].removeAttribute('tabIndex');
+    }
+  }
+  else {
+    $tabindex.removeAttr('tabindex');
+  }
+
+  // Restore the tabindex attributes that existed before the overlay was opened.
+  $needsTabindex = $(Drupal.overlay._hasTabindex, context);
+  $needsTabindex.each(Drupal.overlay._restoreTabindex);
+  Drupal.overlay._hasTabindex = Drupal.overlay._hasTabindex.not($needsTabindex);
+};
+
+/**
+ * Record the tabindex for an element, using $.data.
+ *
+ * Meant to be used as a jQuery.fn.each callback.
+ */
+Drupal.overlay._recordTabindex = function () {
+  var $element = $(this);
+  var tabindex = $(this).attr('tabindex');
+  $element.data('drupalOverlayOriginalTabIndex', tabindex);
+};
+
+/**
+ * Restore an element's original tabindex.
+ *
+ * Meant to be used as a jQuery.fn.each callback.
+ */
+Drupal.overlay._restoreTabindex = function () {
+  var $element = $(this);
+  var tabindex = $element.data('drupalOverlayOriginalTabIndex');
+  $element.attr('tabindex', tabindex);
+};
+
+/**
+ * Theme function to create the overlay iframe element.
+ */
+Drupal.theme.prototype.overlayContainer = function () {
+  return '<div id="overlay-container"><div class="overlay-modal-background"></div></div>';
+};
+
+/**
+ * Theme function to create an overlay iframe element.
+ */
+Drupal.theme.prototype.overlayElement = function (url) {
+  return '<iframe class="overlay-element" frameborder="0" scrolling="auto" allowtransparency="true"></iframe>';
+};
+
+})(jQuery);
diff --git a/htmltest/modules/overlay/overlay.api.php b/htmltest/modules/overlay/overlay.api.php
new file mode 100644
index 00000000..bc23546d
--- /dev/null
+++ b/htmltest/modules/overlay/overlay.api.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by Overlay module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Allow modules to act when an overlay parent window is initialized.
+ *
+ * The parent window is initialized when a page is displayed in which the
+ * overlay might be required to be displayed, so modules can act here if they
+ * need to take action to accommodate the possibility of the overlay appearing
+ * within a Drupal page.
+ */
+function hook_overlay_parent_initialize() {
+  // Add our custom JavaScript.
+  drupal_add_js(drupal_get_path('module', 'hook') . '/hook-overlay.js');
+}
+
+/**
+ * Allow modules to act when an overlay child window is initialized.
+ *
+ * The child window is initialized when a page is displayed from within the
+ * overlay, so modules can act here if they need to take action to work from
+ * within the confines of the overlay.
+ */
+function hook_overlay_child_initialize() {
+  // Add our custom JavaScript.
+  drupal_add_js(drupal_get_path('module', 'hook') . '/hook-overlay-child.js');
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/overlay/overlay.info b/htmltest/modules/overlay/overlay.info
new file mode 100644
index 00000000..1f2ad9bc
--- /dev/null
+++ b/htmltest/modules/overlay/overlay.info
@@ -0,0 +1,11 @@
+name = Overlay
+description = Displays the Drupal administration interface in an overlay.
+package = Core
+version = VERSION
+core = 7.x
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/overlay/overlay.install b/htmltest/modules/overlay/overlay.install
new file mode 100644
index 00000000..2df860b5
--- /dev/null
+++ b/htmltest/modules/overlay/overlay.install
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * @file
+ * Install, update, and uninstall functions for the Overlay module.
+ */
+
+/**
+ * Implements hook_enable().
+ *
+ * If the module is being enabled through the admin UI, and not from an
+ * installation profile, reopen the modules page in an overlay.
+ */
+function overlay_enable() {
+  if (strpos(current_path(), 'admin/modules') === 0) {
+    // Flag for a redirect to <front>#overlay=admin/modules on hook_init().
+    $_SESSION['overlay_enable_redirect'] = 1;
+  }
+}
diff --git a/htmltest/modules/overlay/overlay.module b/htmltest/modules/overlay/overlay.module
new file mode 100644
index 00000000..7b2fc939
--- /dev/null
+++ b/htmltest/modules/overlay/overlay.module
@@ -0,0 +1,1010 @@
+<?php
+
+/**
+ * @file
+ * Displays the Drupal administration interface in an overlay.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function overlay_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#overlay':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Overlay module makes the administration pages on your site display in a JavaScript overlay of the page you were viewing when you clicked the administrative link, instead of replacing the page in your browser window. Use the close link on the overlay to return to the page you were viewing when you clicked the link. For more information, see the online handbook entry for <a href="@overlay">Overlay module</a>.', array('@overlay' => 'http://drupal.org/documentation/modules/overlay')) . '</p>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function overlay_menu() {
+  $items['overlay-ajax/%'] = array(
+    'title' => '',
+    'page callback' => 'overlay_ajax_render_region',
+    'page arguments' => array(1),
+    'access arguments' => array('access overlay'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['overlay/dismiss-message'] = array(
+    'title' => '',
+    'page callback' => 'overlay_user_dismiss_message',
+    'access arguments' => array('access overlay'),
+    'type' => MENU_CALLBACK,
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_admin_paths().
+ */
+function overlay_admin_paths() {
+  $paths = array(
+    // This is marked as an administrative path so that if it is visited from
+    // within the overlay, the user will stay within the overlay while the
+    // callback is being processed.
+    'overlay/dismiss-message' => TRUE,
+  );
+  return $paths;
+}
+
+/**
+ * Implements hook_permission().
+ */
+function overlay_permission() {
+  return array(
+    'access overlay' => array(
+      'title' => t('Access the administrative overlay'),
+      'description' => t('View administrative pages in the overlay.'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_theme().
+ */
+function overlay_theme() {
+  return array(
+    'overlay' => array(
+      'render element' => 'page',
+      'template' => 'overlay',
+    ),
+    'overlay_disable_message' => array(
+      'render element' => 'element',
+    ),
+  );
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function overlay_form_user_profile_form_alter(&$form, &$form_state) {
+  if ($form['#user_category'] == 'account') {
+    $account = $form['#user'];
+    if (user_access('access overlay', $account)) {
+      $form['overlay_control'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('Administrative overlay'),
+        '#weight' => 4,
+        '#collapsible' => TRUE,
+      );
+
+      $form['overlay_control']['overlay'] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Use the overlay for administrative pages.'),
+        '#description' => t('Show administrative pages on top of the page you started from.'),
+        '#default_value' => isset($account->data['overlay']) ? $account->data['overlay'] : 1,
+      );
+    }
+  }
+}
+
+/**
+ * Implements hook_user_presave().
+ */
+function overlay_user_presave(&$edit, $account, $category) {
+  if (isset($edit['overlay'])) {
+    $edit['data']['overlay'] = $edit['overlay'];
+  }
+}
+
+/**
+ * Implements hook_init().
+ *
+ * Determine whether the current page request is destined to appear in the
+ * parent window or in the overlay window, and format the page accordingly.
+ *
+ * @see overlay_set_mode()
+ */
+function overlay_init() {
+  global $user;
+
+  $mode = overlay_get_mode();
+
+  // Only act if the user has access to the overlay and a mode was not already
+  // set. Other modules can also enable the overlay directly for other uses.
+  $use_overlay = !isset($user->data['overlay']) || $user->data['overlay'];
+  if (empty($mode) && user_access('access overlay') && $use_overlay) {
+    $current_path = current_path();
+    // After overlay is enabled on the modules page, redirect to
+    // <front>#overlay=admin/modules to actually enable the overlay.
+    if (isset($_SESSION['overlay_enable_redirect']) && $_SESSION['overlay_enable_redirect']) {
+      unset($_SESSION['overlay_enable_redirect']);
+      drupal_goto('<front>', array('fragment' => 'overlay=' . $current_path));
+    }
+
+    if (isset($_GET['render']) && $_GET['render'] == 'overlay') {
+      // If a previous page requested that we close the overlay, close it and
+      // redirect to the final destination.
+      if (isset($_SESSION['overlay_close_dialog'])) {
+        call_user_func_array('overlay_close_dialog', $_SESSION['overlay_close_dialog']);
+        unset($_SESSION['overlay_close_dialog']);
+      }
+      // If this page shouldn't be rendered inside the overlay, redirect to the
+      // parent.
+      elseif (!path_is_admin($current_path)) {
+        // Prevent open redirects by ensuring the current path is not an absolute URL.
+        if (url_is_external($current_path)) {
+          $current_path = '<front>';
+        }
+        overlay_close_dialog($current_path, array('query' => drupal_get_query_parameters(NULL, array('q', 'render'))));
+      }
+
+      // Indicate that we are viewing an overlay child page.
+      overlay_set_mode('child');
+
+      // Unset the render parameter to avoid it being included in URLs on the page.
+      unset($_GET['render']);
+    }
+    // Do not enable the overlay if we already are on an admin page.
+    elseif (!path_is_admin($current_path)) {
+      // Otherwise add overlay parent code and our behavior.
+      overlay_set_mode('parent');
+    }
+  }
+}
+
+/**
+ * Implements hook_exit().
+ *
+ * When viewing an overlay child page, check if we need to trigger a refresh of
+ * the supplemental regions of the overlay on the next page request.
+ */
+function overlay_exit() {
+  // Check that we are in an overlay child page. Note that this should never
+  // return TRUE on a cached page view, since the child mode is not set until
+  // overlay_init() is called.
+  if (overlay_get_mode() == 'child') {
+    // Load any markup that was stored earlier in the page request, via calls
+    // to overlay_store_rendered_content(). If none was stored, this is not a
+    // page request where we expect any changes to the overlay supplemental
+    // regions to have occurred, so we do not need to proceed any further.
+    $original_markup = overlay_get_rendered_content();
+    if (!empty($original_markup)) {
+      // Compare the original markup to the current markup that we get from
+      // rendering each overlay supplemental region now. If they don't match,
+      // something must have changed, so we request a refresh of that region
+      // within the parent window on the next page request.
+      foreach (overlay_supplemental_regions() as $region) {
+        if (!isset($original_markup[$region]) || $original_markup[$region] != overlay_render_region($region)) {
+          overlay_request_refresh($region);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_library().
+ */
+function overlay_library() {
+  $module_path = drupal_get_path('module', 'overlay');
+
+  // Overlay parent.
+  $libraries['parent'] = array(
+    'title' => 'Overlay: Parent',
+    'website' => 'http://drupal.org/documentation/modules/overlay',
+    'version' => '1.0',
+    'js' => array(
+      $module_path . '/overlay-parent.js' => array(),
+    ),
+    'css' => array(
+      $module_path . '/overlay-parent.css' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui'),
+      array('system', 'jquery.bbq'),
+    ),
+  );
+  // Overlay child.
+  $libraries['child'] = array(
+    'title' => 'Overlay: Child',
+    'website' => 'http://drupal.org/documentation/modules/overlay',
+    'version' => '1.0',
+    'js' => array(
+      $module_path . '/overlay-child.js' => array(),
+    ),
+    'css' => array(
+      $module_path . '/overlay-child.css' => array(),
+    ),
+  );
+
+  return $libraries;
+}
+
+/**
+ * Implements hook_drupal_goto_alter().
+ */
+function overlay_drupal_goto_alter(&$path, &$options, &$http_response_code) {
+  if (overlay_get_mode() == 'child') {
+    // The authorize.php script bootstraps Drupal to a very low level, where
+    // the PHP code that is necessary to close the overlay properly will not be
+    // loaded. Therefore, if we are redirecting to authorize.php inside the
+    // overlay, instead redirect back to the current page with instructions to
+    // close the overlay there before redirecting to the final destination; see
+    // overlay_init().
+    if ($path == system_authorized_get_url() || $path == system_authorized_batch_processing_url()) {
+      $_SESSION['overlay_close_dialog'] = array($path, $options);
+      $path = current_path();
+      $options = drupal_get_query_parameters();
+    }
+
+    // If the current page request is inside the overlay, add ?render=overlay
+    // to the new path, so that it appears correctly inside the overlay.
+    if (isset($options['query'])) {
+      $options['query'] += array('render' => 'overlay');
+    }
+    else {
+      $options['query'] = array('render' => 'overlay');
+    }
+  }
+}
+
+/**
+ * Implements hook_batch_alter().
+ *
+ * If the current page request is inside the overlay, add ?render=overlay to
+ * the success callback URL, so that it appears correctly within the overlay.
+ *
+ * @see overlay_get_mode()
+ */
+function overlay_batch_alter(&$batch) {
+  if (overlay_get_mode() == 'child') {
+    if (isset($batch['url_options']['query'])) {
+      $batch['url_options']['query']['render'] = 'overlay';
+    }
+    else {
+      $batch['url_options']['query'] = array('render' => 'overlay');
+    }
+  }
+}
+
+/**
+ * Implements hook_page_alter().
+ */
+function overlay_page_alter(&$page) {
+  // If we are limiting rendering to a subset of page regions, deny access to
+  // all other regions so that they will not be processed.
+  if ($regions_to_render = overlay_get_regions_to_render()) {
+    $skipped_regions = array_diff(element_children($page), $regions_to_render);
+    foreach ($skipped_regions as $skipped_region) {
+      $page[$skipped_region]['#access'] = FALSE;
+    }
+  }
+
+  $mode = overlay_get_mode();
+  if ($mode == 'child') {
+    // Add the overlay wrapper before the html wrapper.
+    array_unshift($page['#theme_wrappers'], 'overlay');
+  }
+  elseif ($mode == 'parent' && ($message = overlay_disable_message())) {
+    $page['page_top']['disable_overlay'] = $message;
+  }
+}
+
+/**
+ * Page callback: Dismisses the overlay accessibility message for this user.
+ *
+ * @return
+ *   A render array for a page containing a list of content.
+ */
+function overlay_user_dismiss_message() {
+  global $user;
+  // It's unlikely, but possible that "access overlay" permission is granted to
+  // the anonymous role. In this case, we do not display the message to disable
+  // the overlay, so there is nothing to dismiss. Also, protect against
+  // cross-site request forgeries by validating a token.
+  if (empty($user->uid) || !isset($_GET['token']) || !drupal_valid_token($_GET['token'], 'overlay')) {
+    return MENU_ACCESS_DENIED;
+  }
+  else {
+    user_save(user_load($user->uid), array('data' => array('overlay_message_dismissed' => 1)));
+    drupal_set_message(t('The message has been dismissed. You can change your overlay settings at any time by visiting your profile page.'));
+    // Destination is normally given. Go to the user profile as a fallback.
+    drupal_goto('user/' . $user->uid . '/edit');
+  }
+}
+
+/**
+ * Returns a renderable array representing a message for disabling the overlay.
+ *
+ * If the current user can access the overlay and has not previously indicated
+ * that this message should be dismissed, this function returns a message
+ * containing a link to disable the overlay. Nothing is returned for anonymous
+ * users, because the links control per-user settings. Because some screen
+ * readers are unable to properly read overlay contents, site builders are
+ * discouraged from granting the "access overlay" permission to the anonymous
+ * role.
+ *
+ * @see http://drupal.org/node/890284
+ */
+function overlay_disable_message() {
+  global $user;
+
+  if (!empty($user->uid) && empty($user->data['overlay_message_dismissed']) && (!isset($user->data['overlay']) || $user->data['overlay']) && user_access('access overlay')) {
+    $build = array(
+      '#theme' => 'overlay_disable_message',
+      '#weight' => -99,
+      // Link to the user's profile page, where the overlay can be disabled.
+      'profile_link' => array(
+        '#type' => 'link',
+        '#title' => t('If you have problems accessing administrative pages on this site, disable the overlay on your profile page.'),
+        '#href' => 'user/' . $user->uid . '/edit',
+        '#options' => array(
+          'query' => drupal_get_destination(),
+          'fragment' => 'edit-overlay-control',
+          'attributes' => array(
+            'id' => 'overlay-profile-link',
+            // Prevent the target page from being opened in the overlay.
+            'class' => array('overlay-exclude'),
+          ),
+        ),
+      ),
+      // Link to a menu callback that allows this message to be permanently
+      // dismissed for the current user.
+      'dismiss_message_link' => array(
+        '#type' => 'link',
+        '#title' => t('Dismiss this message.'),
+        '#href' => 'overlay/dismiss-message',
+        '#options' => array(
+          'query' => drupal_get_destination() + array(
+            // Add a token to protect against cross-site request forgeries.
+            'token' => drupal_get_token('overlay'),
+          ),
+          'attributes' => array(
+            'id' => 'overlay-dismiss-message',
+            // If this message is being displayed outside the overlay, prevent
+            // this link from opening the overlay.
+            'class' => (overlay_get_mode() == 'parent') ? array('overlay-exclude') : array(),
+          ),
+        ),
+      )
+    );
+  }
+  else {
+    $build = array();
+  }
+
+  return $build;
+}
+
+/**
+ * Returns the HTML for the message about how to disable the overlay.
+ *
+ * @param $variables
+ *   An associative array with an 'element' element, which itself is an
+ *   associative array containing:
+ *   - profile_link: The link to this user's account.
+ *   - dismiss_message_link: The link to dismiss the overlay.
+ *
+ * @ingroup themeable
+ */
+function theme_overlay_disable_message($variables) {
+  $element = $variables['element'];
+
+  // Add CSS classes to hide the links from most sighted users, while keeping
+  // them accessible to screen-reader users and keyboard-only users. To assist
+  // screen-reader users, this message appears in both the parent and child
+  // documents, but only the one in the child document is part of the tab order.
+  foreach (array('profile_link', 'dismiss_message_link') as $key) {
+    $element[$key]['#options']['attributes']['class'][] = 'element-invisible';
+    if (overlay_get_mode() == 'child') {
+      $element[$key]['#options']['attributes']['class'][] = 'element-focusable';
+    }
+  }
+
+  // Render the links.
+  $output = drupal_render($element['profile_link']) . ' ' . drupal_render($element['dismiss_message_link']);
+
+  // Add a heading for screen-reader users. The heading doesn't need to be seen
+  // by sighted users.
+  $output = '<h3 class="element-invisible">' . t('Options for the administrative overlay') . '</h3>' . $output;
+
+  // Wrap in a container for styling.
+  $output = '<div id="overlay-disable-message" class="clearfix">' . $output . '</div>';
+
+  return $output;
+}
+
+/**
+ * Implements hook_block_list_alter().
+ */
+function overlay_block_list_alter(&$blocks) {
+  // If we are limiting rendering to a subset of page regions, hide all blocks
+  // which appear in regions not on that list. Note that overlay_page_alter()
+  // does a more comprehensive job of preventing unwanted regions from being
+  // displayed (regardless of whether they contain blocks or not), but the
+  // reason for duplicating effort here is performance; we do not even want
+  // these blocks to be built if they are not going to be displayed.
+  if ($regions_to_render = overlay_get_regions_to_render()) {
+    foreach ($blocks as $bid => $block) {
+      if (!in_array($block->region, $regions_to_render)) {
+        unset($blocks[$bid]);
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_system_info_alter().
+ *
+ * Add default regions for the overlay.
+ */
+function overlay_system_info_alter(&$info, $file, $type) {
+  if ($type == 'theme') {
+    $info['overlay_regions'][] = 'content';
+    $info['overlay_regions'][] = 'help';
+  }
+}
+
+/**
+ * Implements hook_preprocess_html().
+ *
+ * If the current page request is inside the overlay, add appropriate classes
+ * to the <body> element, and simplify the page title.
+ *
+ * @see overlay_get_mode()
+ */
+function overlay_preprocess_html(&$variables) {
+  if (overlay_get_mode() == 'child') {
+    // Add overlay class, so themes can react to being displayed in the overlay.
+    $variables['classes_array'][] = 'overlay';
+  }
+}
+
+/**
+ * Implements hook_preprocess_maintenance_page().
+ *
+ * If the current page request is inside the overlay, add appropriate classes
+ * to the <body> element, and simplify the page title.
+ *
+ * @see overlay_preprocess_maintenance_page()
+ */
+function overlay_preprocess_maintenance_page(&$variables) {
+  overlay_preprocess_html($variables);
+}
+
+/**
+ * Implements template_preprocess_HOOK() for overlay.tpl.php
+ *
+ * If the current page request is inside the overlay, add appropriate classes
+ * to the <body> element, and simplify the page title.
+ *
+ * @see template_process_overlay()
+ * @see overlay.tpl.php
+ */
+function template_preprocess_overlay(&$variables) {
+  $variables['tabs'] = menu_primary_local_tasks();
+  $variables['title'] = drupal_get_title();
+  $variables['disable_overlay'] = overlay_disable_message();
+  $variables['content_attributes_array']['class'][] = 'clearfix';
+}
+
+/**
+ * Implements template_process_HOOK() for overlay.tpl.php
+ *
+ * Places the rendered HTML for the page body into a top level variable.
+ *
+ * @see template_preprocess_overlay()
+ * @see overlay.tpl.php
+ */
+function template_process_overlay(&$variables) {
+  $variables['page'] = $variables['page']['#children'];
+}
+
+/**
+ * Implements hook_preprocess_page().
+ *
+ * If the current page request is inside the overlay, hide the tabs.
+ *
+ * @see overlay_get_mode()
+ */
+function overlay_preprocess_page(&$variables) {
+  if (overlay_get_mode() == 'child') {
+    unset($variables['tabs']['#primary']);
+  }
+}
+
+/**
+ * Stores and returns whether an empty page override is needed.
+ *
+ * This is used to prevent a page request which closes the overlay (for
+ * example, a form submission) from being fully re-rendered before the overlay
+ * is closed. Instead, we store a variable which will cause the page to be
+ * rendered by a delivery callback function that does not actually print
+ * visible HTML (but rather only the bare minimum scripts and styles necessary
+ * to trigger the overlay to close), thereby allowing the dialog to be closed
+ * faster and with less interruption, and also allowing the display of messages
+ * to be deferred to the parent window (rather than displaying them in the
+ * child window, which will close before the user has had a chance to read
+ * them).
+ *
+ * @param $value
+ *   By default, an empty page will not be displayed. Set to TRUE to request
+ *   an empty page display, or FALSE to disable the empty page display (if it
+ *   was previously enabled on this page request).
+ *
+ * @return
+ *   TRUE if the current behavior is to display an empty page, or FALSE if not.
+ *
+ * @see overlay_page_delivery_callback_alter()
+ */
+function overlay_display_empty_page($value = NULL) {
+  $display_empty_page = &drupal_static(__FUNCTION__, FALSE);
+  if (isset($value)) {
+    $display_empty_page = $value;
+  }
+  return $display_empty_page;
+}
+
+/**
+ * Implements hook_page_delivery_callback_alter().
+ */
+function overlay_page_delivery_callback_alter(&$callback) {
+  if (overlay_display_empty_page()) {
+    $callback = 'overlay_deliver_empty_page';
+  }
+}
+
+/**
+ * Prints an empty page.
+ *
+ * This function is used to print out a bare minimum empty page which still has
+ * the scripts and styles necessary in order to trigger the overlay to close.
+ */
+function overlay_deliver_empty_page() {
+  $empty_page = '<html><head><title></title>' . drupal_get_css() . drupal_get_js() . '</head><body class="overlay"></body></html>';
+  print $empty_page;
+  drupal_exit();
+}
+
+/**
+ * Gets the current overlay mode.
+ *
+ * @see overlay_set_mode()
+ */
+function overlay_get_mode() {
+  return overlay_set_mode(NULL);
+}
+
+/**
+ * Sets the overlay mode and adds proper JavaScript and styles to the page.
+ *
+ * Note that since setting the overlay mode triggers a variety of behaviors
+ * (including hooks being invoked), it can only be done once per page request.
+ * Therefore, the first call to this function which passes along a value of the
+ * $mode parameter controls the overlay mode that will be used.
+ *
+ * @param $mode
+ *   To set the mode, pass in one of the following values:
+ *   - 'parent': This is used in the context of a parent window (a regular
+ *     browser window). If set, JavaScript is added so that administrative
+ *     links in the parent window will open in an overlay.
+ *   - 'child': This is used in the context of the child overlay window (the
+ *     page actually appearing within the overlay iframe). If set, JavaScript
+ *     and CSS are added so that Drupal behaves nicely from within the overlay.
+ *   - 'none': This is used to avoid adding any overlay-related code to the
+ *     page at all. Modules can set this to explicitly prevent the overlay from
+ *     being used. For example, since the overlay module itself sets the mode
+ *     to 'parent' or 'child' in overlay_init() when certain conditions are
+ *     met, other modules which want to override that behavior can do so by
+ *     setting the mode to 'none' earlier in the page request - e.g., in their
+ *     own hook_init() implementations, if they have a lower weight.
+ *   This parameter is optional, and if omitted, the current mode will be
+ *   returned with no action taken.
+ *
+ * @return
+ *   The current mode, if any has been set, or NULL if no mode has been set.
+ *
+ * @ingroup overlay_api
+ * @see overlay_init()
+ */
+function overlay_set_mode($mode = NULL) {
+  global $base_path;
+  $overlay_mode = &drupal_static(__FUNCTION__);
+
+  // Make sure external resources are not included more than once. Also return
+  // the current mode, if no mode was specified.
+  if (isset($overlay_mode) || !isset($mode)) {
+    return $overlay_mode;
+  }
+  $overlay_mode = $mode;
+
+  switch ($overlay_mode) {
+    case 'parent':
+      drupal_add_library('overlay', 'parent');
+
+      // Allow modules to act upon overlay events.
+      module_invoke_all('overlay_parent_initialize');
+      break;
+
+    case 'child':
+      drupal_add_library('overlay', 'child');
+
+      // Allow modules to act upon overlay events.
+      module_invoke_all('overlay_child_initialize');
+      break;
+  }
+  return $overlay_mode;
+}
+
+/**
+ * Implements hook_overlay_parent_initialize().
+ */
+function overlay_overlay_parent_initialize() {
+  // Let the client side know which paths are administrative.
+  $paths = path_get_admin_paths();
+  foreach ($paths as &$type) {
+    $type = str_replace('<front>', variable_get('site_frontpage', 'node'), $type);
+  }
+  drupal_add_js(array('overlay' => array('paths' => $paths)), 'setting');
+  $path_prefixes = array();
+  if (module_exists('locale') && variable_get('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX) == LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX) {
+    // Get languages grouped by status and select only the enabled ones.
+    $languages = language_list('enabled');
+    $languages = $languages[1];
+
+    $path_prefixes = array();
+    foreach ($languages as $language) {
+      if ($language->prefix) {
+        $path_prefixes[] = $language->prefix;
+      }
+    }
+  }
+  drupal_add_js(array('overlay' => array('pathPrefixes' => $path_prefixes)), 'setting');
+  // Pass along the Ajax callback for rerendering sections of the parent window.
+  drupal_add_js(array('overlay' => array('ajaxCallback' => 'overlay-ajax')), 'setting');
+}
+
+/**
+ * Implements hook_overlay_child_initialize().
+ */
+function overlay_overlay_child_initialize() {
+  // Check if the parent window needs to refresh any page regions on this page
+  // request.
+  overlay_trigger_refresh();
+  // If this is a POST request, or a GET request with a token parameter, we
+  // have an indication that something in the supplemental regions of the
+  // overlay might change during the current page request. We therefore store
+  // the initial rendered content of those regions here, so that we can compare
+  // it to the same content rendered in overlay_exit(), at the end of the page
+  // request. This allows us to check if anything actually did change, and, if
+  // so, trigger an immediate Ajax refresh of the parent window.
+  if (!empty($_POST) || isset($_GET['token'])) {
+    foreach (overlay_supplemental_regions() as $region) {
+      overlay_store_rendered_content($region, overlay_render_region($region));
+    }
+    // In addition, notify the parent window that when the overlay closes,
+    // the entire parent window should be refreshed.
+    overlay_request_page_refresh();
+  }
+  // Indicate that when the main page rendering occurs later in the page
+  // request, only the regions that appear within the overlay should be
+  // rendered.
+  overlay_set_regions_to_render(overlay_regions());
+}
+
+/**
+ * Requests that the overlay closes when the page is displayed.
+ *
+ * @param $redirect
+ *   (optional) The path that should open in the parent window after the
+ *   overlay closes. If not set, no redirect will be performed on the parent
+ *   window.
+ *
+ * @param $redirect_options
+ *   (optional) An associative array of options to use when generating the
+ *   redirect URL.
+ */
+function overlay_close_dialog($redirect = NULL, $redirect_options = array()) {
+  $settings = array(
+    'overlayChild' => array(
+      'closeOverlay' => TRUE,
+    ),
+  );
+
+  // Tell the child window to perform the redirection when requested to.
+  if (isset($redirect)) {
+    $settings['overlayChild']['redirect'] = url($redirect, $redirect_options);
+  }
+
+  drupal_add_js($settings, array('type' => 'setting'));
+
+  // Since we are closing the overlay as soon as the page is displayed, we do
+  // not want to show any of the page's actual content.
+  overlay_display_empty_page(TRUE);
+}
+
+/**
+ * Returns a list of page regions that appear in the overlay.
+ *
+ * Overlay regions correspond to the entire contents of the overlay child
+ * window and are refreshed each time a new page request is made within the
+ * overlay.
+ *
+ * @return
+ *   An array of region names that correspond to those which appear in the
+ *   overlay, within the theme that is being used to display the current page.
+ *
+ * @see overlay_supplemental_regions()
+ */
+function overlay_regions() {
+  return _overlay_region_list('overlay_regions');
+}
+
+/**
+ * Returns a list of supplemental page regions for the overlay.
+ *
+ * Supplemental overlay regions are those which are technically part of the
+ * parent window, but appear to the user as being related to the overlay
+ * (usually because they are displayed next to, rather than underneath, the
+ * main overlay regions) and therefore need to be dynamically refreshed if any
+ * administrative actions taken within the overlay change their contents.
+ *
+ * An example of a typical overlay supplemental region would be the 'page_top'
+ * region, in the case where a toolbar is being displayed there.
+ *
+ * @return
+ *   An array of region names that correspond to supplemental overlay regions,
+ *   within the theme that is being used to display the current page.
+ *
+ * @see overlay_regions()
+ */
+function overlay_supplemental_regions() {
+  return _overlay_region_list('overlay_supplemental_regions');
+}
+
+/**
+ * Returns a list of page regions related to the overlay.
+ *
+ * @param $type
+ *   The type of regions to return. This can either be 'overlay_regions' or
+ *   'overlay_supplemental_regions'.
+ *
+ * @return
+ *   An array of region names of the given type, within the theme that is being
+ *   used to display the current page.
+ *
+ * @see overlay_regions()
+ * @see overlay_supplemental_regions()
+ */
+function _overlay_region_list($type) {
+  // Obtain the current theme. We need to first make sure the theme system is
+  // initialized, since this function can be called early in the page request.
+  drupal_theme_initialize();
+  $themes = list_themes();
+  $theme = $themes[$GLOBALS['theme']];
+  // Return the list of regions stored within the theme's info array, or an
+  // empty array if no regions of the appropriate type are defined.
+  return !empty($theme->info[$type]) ? $theme->info[$type] : array();
+}
+
+/**
+ * Returns a list of page regions that rendering should be limited to.
+ *
+ * @return
+ *   An array containing the names of the regions that will be rendered when
+ *   drupal_render_page() is called. If empty, then no limits will be imposed,
+ *   and all regions of the page will be rendered.
+ *
+ * @see overlay_page_alter()
+ * @see overlay_block_list_alter()
+ * @see overlay_set_regions_to_render()
+ */
+function overlay_get_regions_to_render() {
+  return overlay_set_regions_to_render();
+}
+
+/**
+ * Sets the regions of the page that rendering will be limited to.
+ *
+ * @param $regions
+ *   (Optional) An array containing the names of the regions that should be
+ *   rendered when drupal_render_page() is called. Pass in an empty array to
+ *   remove all limits and cause drupal_render_page() to render all page
+ *   regions (the default behavior). If this parameter is omitted, no change
+ *   will be made to the current list of regions to render.
+ *
+ * @return
+ *   The current list of regions to render, or an empty array if the regions
+ *   are not being limited.
+ *
+ * @see overlay_page_alter()
+ * @see overlay_block_list_alter()
+ * @see overlay_get_regions_to_render()
+ */
+function overlay_set_regions_to_render($regions = NULL) {
+  $regions_to_render = &drupal_static(__FUNCTION__, array());
+  if (isset($regions)) {
+    $regions_to_render = $regions;
+  }
+  return $regions_to_render;
+}
+
+/**
+ * Renders an individual page region.
+ *
+ * This function is primarily intended to be used for checking the content of
+ * supplemental overlay regions (e.g., a region containing a toolbar). Passing
+ * in a region that is intended to display the main page content is not
+ * supported; the region will be rendered by this function, but the main page
+ * content will not appear in it. In addition, although this function returns
+ * the rendered HTML for the provided region, it does not place it on the final
+ * page, nor add any of its associated JavaScript or CSS to the page.
+ *
+ * @param $region
+ *   The name of the page region that should be rendered.
+ *
+ * @return
+ *   The rendered HTML of the provided region.
+ */
+function overlay_render_region($region) {
+  // Indicate the region that we will be rendering, so that other regions will
+  // be hidden by overlay_page_alter() and overlay_block_list_alter().
+  overlay_set_regions_to_render(array($region));
+  // Do what is necessary to force drupal_render_page() to only display HTML
+  // from the requested region. Specifically, declare that the main page
+  // content does not need to automatically be added to the page, and pass in
+  // a page array that has all theme functions removed (so that overall HTML
+  // for the page will not be added either).
+  $system_main_content_added = &drupal_static('system_main_content_added');
+  $system_main_content_added = TRUE;
+  $page = array(
+    '#type' => 'page',
+    '#theme' => NULL,
+    '#theme_wrappers' => array(),
+  );
+  // Render the region, but do not cache any JavaScript or CSS associated with
+  // it. This region might not be included the next time drupal_render_page()
+  // is called, and we do not want its JavaScript or CSS to erroneously appear
+  // on the final rendered page.
+  $original_js = drupal_add_js();
+  $original_css = drupal_add_css();
+  $original_libraries = drupal_static('drupal_add_library');
+  $js = &drupal_static('drupal_add_js');
+  $css = &drupal_static('drupal_add_css');
+  $libraries = &drupal_static('drupal_add_library');
+  $markup = drupal_render_page($page);
+  $js = $original_js;
+  $css = $original_css;
+  $libraries = $original_libraries;
+  // Indicate that the main page content has not, in fact, been displayed, so
+  // that future calls to drupal_render_page() will be able to render it
+  // correctly.
+  $system_main_content_added = FALSE;
+  // Restore the original behavior of rendering all regions for the next time
+  // drupal_render_page() is called.
+  overlay_set_regions_to_render(array());
+  return $markup;
+}
+
+/**
+ * Returns any rendered content that was stored earlier in the page request.
+ *
+ * @return
+ *   An array of all rendered HTML that was stored earlier in the page request,
+ *   keyed by the identifier with which it was stored. If no content was
+ *   stored, an empty array is returned.
+ *
+ * @see overlay_store_rendered_content()
+ */
+function overlay_get_rendered_content() {
+  return overlay_store_rendered_content();
+}
+
+/**
+ * Stores strings representing rendered HTML content.
+ *
+ * This function is used to keep a static cache of rendered content that can be
+ * referred to later in the page request.
+ *
+ * @param $id
+ *   (Optional) An identifier for the content which is being stored, which will
+ *   be used as an array key in the returned array. If omitted, no change will
+ *   be made to the current stored data.
+ * @param $content
+ *   (Optional) A string representing the rendered data to store. This only has
+ *   an effect if $id is also provided.
+ *
+ * @return
+ *   An array representing all data that is currently being stored, or an empty
+ *   array if there is none.
+ *
+ * @see overlay_get_rendered_content()
+ */
+function overlay_store_rendered_content($id = NULL, $content = NULL) {
+  $rendered_content = &drupal_static(__FUNCTION__, array());
+  if (isset($id)) {
+    $rendered_content[$id] = $content;
+  }
+  return $rendered_content;
+}
+
+/**
+ * Requests that the parent window refreshes a particular page region.
+ *
+ * @param $region
+ *   The name of the page region to refresh. The parent window will trigger a
+ *   refresh of this region on the next page load.
+ *
+ * @see overlay_trigger_refresh()
+ * @see Drupal.overlay.refreshRegions()
+ */
+function overlay_request_refresh($region) {
+  $class = drupal_region_class($region);
+  $_SESSION['overlay_regions_to_refresh'][] = array($class => $region);
+}
+
+/**
+ * Requests that the entire parent window is reloaded when the overlay closes.
+ *
+ * @see overlay_trigger_refresh()
+ */
+function overlay_request_page_refresh() {
+  $_SESSION['overlay_refresh_parent'] = TRUE;
+}
+
+/**
+ * Checks if the parent window needs to be refreshed on this page load.
+ *
+ * If the previous page load requested that any page regions be refreshed, or
+ * if it requested that the entire page be refreshed when the overlay closes,
+ * pass that request via JavaScript to the child window, so it can in turn pass
+ * the request to the parent window.
+ *
+ * @see overlay_request_refresh()
+ * @see overlay_request_page_refresh()
+ * @see Drupal.overlay.refreshRegions()
+ */
+function overlay_trigger_refresh() {
+  if (!empty($_SESSION['overlay_regions_to_refresh'])) {
+    $settings = array(
+      'overlayChild' => array(
+        'refreshRegions' => $_SESSION['overlay_regions_to_refresh'],
+      ),
+    );
+    drupal_add_js($settings, array('type' => 'setting'));
+    unset($_SESSION['overlay_regions_to_refresh']);
+  }
+  if (!empty($_SESSION['overlay_refresh_parent'])) {
+    drupal_add_js(array('overlayChild' => array('refreshPage' => TRUE)), array('type' => 'setting'));
+    unset($_SESSION['overlay_refresh_parent']);
+  }
+}
+
+/**
+ * Prints the markup obtained by rendering a single region of the page.
+ *
+ * This function is intended to be called via Ajax.
+ *
+ * @param $region
+ *   The name of the page region to render.
+ *
+ * @see Drupal.overlay.refreshRegions()
+ */
+function overlay_ajax_render_region($region) {
+  print overlay_render_region($region);
+}
diff --git a/htmltest/modules/overlay/overlay.tpl.php b/htmltest/modules/overlay/overlay.tpl.php
new file mode 100644
index 00000000..df863375
--- /dev/null
+++ b/htmltest/modules/overlay/overlay.tpl.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to display a page in the overlay.
+ *
+ * Available variables:
+ * - $title: the (sanitized) title of the page.
+ * - $page: The rendered page content.
+ * - $tabs (array): Tabs linking to any sub-pages beneath the current page
+ *   (e.g., the view and edit tabs when displaying a node).
+ *
+ * Helper variables:
+ * - $classes_array: Array of html class attribute values. It is flattened
+ *   into a string within the variable $classes.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_overlay()
+ * @see template_process()
+ *
+ * @ingroup themeable
+ */
+?>
+
+<?php print render($disable_overlay); ?>
+<div id="overlay" <?php print $attributes; ?>>
+  <div id="overlay-titlebar" class="clearfix">
+    <div id="overlay-title-wrapper" class="clearfix">
+      <h1 id="overlay-title"<?php print $title_attributes; ?>><?php print $title; ?></h1>
+    </div>
+    <div id="overlay-close-wrapper">
+      <a id="overlay-close" href="#" class="overlay-close"><span class="element-invisible"><?php print t('Close overlay'); ?></span></a>
+    </div>
+    <?php if ($tabs): ?><h2 class="element-invisible"><?php print t('Primary tabs'); ?></h2><ul id="overlay-tabs"><?php print render($tabs); ?></ul><?php endif; ?>
+  </div>
+  <div id="overlay-content"<?php print $content_attributes; ?>>
+    <?php print $page; ?>
+  </div>
+</div>
diff --git a/htmltest/modules/path/path.admin.inc b/htmltest/modules/path/path.admin.inc
new file mode 100644
index 00000000..28b06189
--- /dev/null
+++ b/htmltest/modules/path/path.admin.inc
@@ -0,0 +1,314 @@
+<?php
+
+/**
+ * @file
+ * Administrative page callbacks for the path module.
+ */
+
+/**
+ * Returns a listing of all defined URL aliases.
+ *
+ * When filter key passed, perform a standard search on the given key,
+ * and return the list of matching URL aliases.
+ */
+function path_admin_overview($keys = NULL) {
+  // Add the filter form above the overview table.
+  $build['path_admin_filter_form'] = drupal_get_form('path_admin_filter_form', $keys);
+  // Enable language column if locale is enabled or if we have any alias with language
+  $alias_exists = (bool) db_query_range('SELECT 1 FROM {url_alias} WHERE language <> :language', 0, 1, array(':language' => LANGUAGE_NONE))->fetchField();
+  $multilanguage = (module_exists('locale') || $alias_exists);
+
+  $header = array();
+  $header[] = array('data' => t('Alias'), 'field' => 'alias', 'sort' => 'asc');
+  $header[] = array('data' => t('System'), 'field' => 'source');
+  if ($multilanguage) {
+    $header[] = array('data' => t('Language'), 'field' => 'language');
+  }
+  $header[] = array('data' => t('Operations'));
+
+  $query = db_select('url_alias')->extend('PagerDefault')->extend('TableSort');
+  if ($keys) {
+    // Replace wildcards with PDO wildcards.
+    $query->condition('alias', '%' . preg_replace('!\*+!', '%', $keys) . '%', 'LIKE');
+  }
+  $result = $query
+    ->fields('url_alias')
+    ->orderByHeader($header)
+    ->limit(50)
+    ->execute();
+
+  $rows = array();
+  $destination = drupal_get_destination();
+  foreach ($result as $data) {
+    $row = array();
+    $row['data']['alias'] = l($data->alias, $data->source);
+    $row['data']['source'] = l($data->source, $data->source, array('alias' => TRUE));
+    if ($multilanguage) {
+      $row['data']['language'] = module_invoke('locale', 'language_name', $data->language);
+    }
+
+    $operations = array();
+    $operations['edit'] = array(
+      'title' => t('edit'),
+      'href' => "admin/config/search/path/edit/$data->pid",
+      'query' => $destination,
+    );
+    $operations['delete'] = array(
+      'title' => t('delete'),
+      'href' => "admin/config/search/path/delete/$data->pid",
+      'query' => $destination,
+    );
+    $row['data']['operations'] = array(
+      'data' => array(
+        '#theme' => 'links',
+        '#links' => $operations,
+        '#attributes' => array('class' => array('links', 'inline', 'nowrap')),
+      ),
+    );
+
+    // If the system path maps to a different URL alias, highlight this table
+    // row to let the user know of old aliases.
+    if ($data->alias != drupal_get_path_alias($data->source, $data->language)) {
+      $row['class'] = array('warning');
+    }
+
+    $rows[] = $row;
+  }
+
+  $build['path_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#empty' => t('No URL aliases available. <a href="@link">Add URL alias</a>.', array('@link' => url('admin/config/search/path/add'))),
+  );
+  $build['path_pager'] = array('#theme' => 'pager');
+
+  return $build;
+}
+
+/**
+ * Page callback: Returns a form creating or editing a path alias.
+ *
+ * @param $path
+ *   An array containing the path ID, source, alias, and language code.
+ *
+ * @return
+ *   A form for adding or editing a URL alias.
+ *
+ * @see path_menu()
+ */
+function path_admin_edit($path = array()) {
+  if ($path) {
+    drupal_set_title($path['alias']);
+    $output = drupal_get_form('path_admin_form', $path);
+  }
+  else {
+    $output = drupal_get_form('path_admin_form');
+  }
+
+  return $output;
+}
+
+/**
+ * Form constructor for the path administration form.
+ *
+ * @param $path
+ *   An array containing the path ID, source, alias, and language code.
+ *
+ * @ingroup forms
+ * @see path_admin_form_validate()
+ * @see path_admin_form_submit()
+ * @see path_admin_form_delete_submit()
+ */
+function path_admin_form($form, &$form_state, $path = array('source' => '', 'alias' => '', 'language' => LANGUAGE_NONE, 'pid' => NULL)) {
+  $form['source'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Existing system path'),
+    '#default_value' => $path['source'],
+    '#maxlength' => 255,
+    '#size' => 45,
+    '#description' => t('Specify the existing path you wish to alias. For example: node/28, forum/1, taxonomy/term/1.'),
+    '#field_prefix' => url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q='),
+    '#required' => TRUE,
+  );
+  $form['alias'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Path alias'),
+    '#default_value' => $path['alias'],
+    '#maxlength' => 255,
+    '#size' => 45,
+    '#description' => t('Specify an alternative path by which this data can be accessed. For example, type "about" when writing an about page. Use a relative path and don\'t add a trailing slash or the URL alias won\'t work.'),
+    '#field_prefix' => url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q='),
+    '#required' => TRUE,
+  );
+
+  // This will be a hidden value unless locale module is enabled.
+  $form['language'] = array(
+    '#type' => 'value',
+    '#value' => $path['language']
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+  );
+  if ($path['pid']) {
+    $form['pid'] = array(
+      '#type' => 'hidden',
+      '#value' => $path['pid'],
+    );
+    $form['actions']['delete'] = array(
+      '#type' => 'submit',
+      '#value' => t('Delete'),
+      '#submit' => array('path_admin_form_delete_submit'),
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Form submission handler for the 'Delete' button on path_admin_form().
+ *
+ * @see path_admin_form_validate()
+ * @see path_admin_form_submit()
+ */
+function path_admin_form_delete_submit($form, &$form_state) {
+  $destination = array();
+  if (isset($_GET['destination'])) {
+    $destination = drupal_get_destination();
+    unset($_GET['destination']);
+  }
+  $form_state['redirect'] = array('admin/config/search/path/delete/' . $form_state['values']['pid'], array('query' => $destination));
+}
+
+/**
+ * Form validation handler for path_admin_form().
+ *
+ * @see path_admin_form_submit()
+ * @see path_admin_form_delete_submit()
+ */
+function path_admin_form_validate($form, &$form_state) {
+  $source = &$form_state['values']['source'];
+  $source = drupal_get_normal_path($source);
+  $alias = $form_state['values']['alias'];
+  $pid = isset($form_state['values']['pid']) ? $form_state['values']['pid'] : 0;
+  // Language is only set if locale module is enabled, otherwise save for all languages.
+  $language = isset($form_state['values']['language']) ? $form_state['values']['language'] : LANGUAGE_NONE;
+
+  $has_alias = db_query("SELECT COUNT(alias) FROM {url_alias} WHERE pid <> :pid AND alias = :alias AND language = :language", array(
+      ':pid' => $pid,
+      ':alias' => $alias,
+      ':language' => $language,
+    ))
+    ->fetchField();
+
+  if ($has_alias) {
+    form_set_error('alias', t('The alias %alias is already in use in this language.', array('%alias' => $alias)));
+  }
+  if (!drupal_valid_path($source)) {
+    form_set_error('source', t("The path '@link_path' is either invalid or you do not have access to it.", array('@link_path' => $source)));
+  }
+}
+
+/**
+ * Form submission handler for path_admin_form().
+ *
+ * @see path_admin_form_validate()
+ * @see path_admin_form_delete_submit()
+ */
+function path_admin_form_submit($form, &$form_state) {
+  // Remove unnecessary values.
+  form_state_values_clean($form_state);
+
+  path_save($form_state['values']);
+
+  drupal_set_message(t('The alias has been saved.'));
+  $form_state['redirect'] = 'admin/config/search/path';
+}
+
+/**
+ * Form constructor for the path deletion form.
+ *
+ * @param $path
+ *   The path alias that will be deleted.
+ *
+ * @see path_admin_delete_confirm_submit()
+ */
+function path_admin_delete_confirm($form, &$form_state, $path) {
+  if (user_access('administer url aliases')) {
+    $form_state['path'] = $path;
+    return confirm_form(
+      $form,
+      t('Are you sure you want to delete path alias %title?',
+      array('%title' => $path['alias'])),
+      'admin/config/search/path'
+    );
+  }
+  return array();
+}
+
+/**
+ * Form submission handler for path_admin_delete_confirm().
+ */
+function path_admin_delete_confirm_submit($form, &$form_state) {
+  if ($form_state['values']['confirm']) {
+    path_delete($form_state['path']['pid']);
+    $form_state['redirect'] = 'admin/config/search/path';
+  }
+}
+
+/**
+ * Form constructor for the path admin overview filter form.
+ *
+ * @ingroup forms
+ * @see path_admin_filter_form_submit_filter()
+ * @see path_admin_filter_form_submit_reset()
+ */
+function path_admin_filter_form($form, &$form_state, $keys = '') {
+  $form['#attributes'] = array('class' => array('search-form'));
+  $form['basic'] = array('#type' => 'fieldset',
+    '#title' => t('Filter aliases'),
+    '#attributes' => array('class' => array('container-inline')),
+  );
+  $form['basic']['filter'] = array(
+    '#type' => 'textfield',
+    '#title' => 'Path alias',
+    '#title_display' => 'invisible',
+    '#default_value' => $keys,
+    '#maxlength' => 128,
+    '#size' => 25,
+  );
+  $form['basic']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Filter'),
+    '#submit' => array('path_admin_filter_form_submit_filter'),
+    );
+  if ($keys) {
+    $form['basic']['reset'] = array(
+      '#type' => 'submit',
+      '#value' => t('Reset'),
+      '#submit' => array('path_admin_filter_form_submit_reset'),
+    );
+  }
+  return $form;
+}
+
+/**
+ * Form submission handler for the path_admin_filter_form() Filter button.
+ *
+ * @see path_admin_filter_form_submit_reset()
+ */
+function path_admin_filter_form_submit_filter($form, &$form_state) {
+  $form_state['redirect'] = 'admin/config/search/path/list/' . trim($form_state['values']['filter']);
+}
+
+/**
+ * Form submission handler for the path_admin_filter_form() Reset button.
+ *
+ * @see path_admin_filter_form_submit_filter()
+ */
+function path_admin_filter_form_submit_reset($form, &$form_state) {
+  $form_state['redirect'] = 'admin/config/search/path/list';
+}
diff --git a/htmltest/modules/path/path.api.php b/htmltest/modules/path/path.api.php
new file mode 100644
index 00000000..0a17e2c6
--- /dev/null
+++ b/htmltest/modules/path/path.api.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Path module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Respond to a path being inserted.
+ *
+ * @param $path
+ *   An associative array containing the following keys:
+ *   - source: The internal system path.
+ *   - alias: The URL alias.
+ *   - pid: Unique path alias identifier.
+ *   - language: The language of the alias.
+ *
+ * @see path_save()
+ */
+function hook_path_insert($path) {
+  db_insert('mytable')
+    ->fields(array(
+      'alias' => $path['alias'],
+      'pid' => $path['pid'],
+    ))
+    ->execute();
+}
+
+/**
+ * Respond to a path being updated.
+ *
+ * @param $path
+ *   An associative array containing the following keys:
+ *   - source: The internal system path.
+ *   - alias: The URL alias.
+ *   - pid: Unique path alias identifier.
+ *   - language: The language of the alias.
+ *
+ * @see path_save()
+ */
+function hook_path_update($path) {
+  db_update('mytable')
+    ->fields(array('alias' => $path['alias']))
+    ->condition('pid', $path['pid'])
+    ->execute();
+}
+
+/**
+ * Respond to a path being deleted.
+ *
+ * @param $path
+ *   An associative array containing the following keys:
+ *   - source: The internal system path.
+ *   - alias: The URL alias.
+ *   - pid: Unique path alias identifier.
+ *   - language: The language of the alias.
+ *
+ * @see path_delete()
+ */
+function hook_path_delete($path) {
+  db_delete('mytable')
+    ->condition('pid', $path['pid'])
+    ->execute();
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/path/path.info b/htmltest/modules/path/path.info
new file mode 100644
index 00000000..d4392ede
--- /dev/null
+++ b/htmltest/modules/path/path.info
@@ -0,0 +1,13 @@
+name = Path
+description = Allows users to rename URLs.
+package = Core
+version = VERSION
+core = 7.x
+files[] = path.test
+configure = admin/config/search/path
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/path/path.js b/htmltest/modules/path/path.js
new file mode 100644
index 00000000..c4f3cd00
--- /dev/null
+++ b/htmltest/modules/path/path.js
@@ -0,0 +1,21 @@
+
+/**
+ * @file
+ * Attaches behaviors for the Path module.
+ */
+
+(function ($) {
+
+Drupal.behaviors.pathFieldsetSummaries = {
+  attach: function (context) {
+    $('fieldset.path-form', context).drupalSetSummary(function (context) {
+      var path = $('.form-item-path-alias input').val();
+
+      return path ?
+        Drupal.t('Alias: @alias', { '@alias': path }) :
+        Drupal.t('No alias');
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/path/path.module b/htmltest/modules/path/path.module
new file mode 100644
index 00000000..81c7bb2c
--- /dev/null
+++ b/htmltest/modules/path/path.module
@@ -0,0 +1,313 @@
+<?php
+
+/**
+ * @file
+ * Enables users to rename URLs.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function path_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#path':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Path module allows you to specify an alias, or custom URL, for any existing internal system path. Aliases should not be confused with URL redirects, which allow you to forward a changed or inactive URL to a new URL. In addition to making URLs more readable, aliases also help search engines index content more effectively. Multiple aliases may be used for a single internal system path. To automate the aliasing of paths, you can install the contributed module <a href="@pathauto">Pathauto</a>. For more information, see the online handbook entry for the <a href="@path">Path module</a>.', array('@path' => 'http://drupal.org/documentation/modules/path', '@pathauto' => 'http://drupal.org/project/pathauto')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Creating aliases') . '</dt>';
+      $output .= '<dd>' . t('Users with sufficient <a href="@permissions">permissions</a> can create aliases under the <em>URL path settings</em> section when they create or edit content. Some examples of aliases are: ', array('@permissions' => url('admin/people/permissions', array('fragment' => 'module-path'))));
+      $output .= '<ul><li>' . t('<em>member/jane-smith</em> aliased to internal path <em>user/123</em>') . '</li>';
+      $output .= '<li>' . t('<em>about-us/team</em> aliased to internal path <em>node/456</em>') . '</li>';
+      $output .= '</ul></dd>';
+      $output .= '<dt>' . t('Managing aliases') . '</dt>';
+      $output .= '<dd>' . t('The Path module provides a way to search and view a <a href="@aliases">list of all aliases</a> that are in use on your website. Aliases can be added, edited and deleted through this list.', array('@aliases' => url('admin/config/search/path'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+
+    case 'admin/config/search/path':
+      return '<p>' . t("An alias defines a different name for an existing URL path - for example, the alias 'about' for the URL path 'node/1'. A URL path can have multiple aliases.") . '</p>';
+
+    case 'admin/config/search/path/add':
+      return '<p>' . t('Enter the path you wish to create the alias for, followed by the name of the new alias.') . '</p>';
+  }
+}
+
+/**
+ * Implements hook_permission().
+ */
+function path_permission() {
+  return array(
+    'administer url aliases' => array(
+      'title' => t('Administer URL aliases'),
+    ),
+    'create url aliases' => array(
+      'title' => t('Create and edit URL aliases'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_menu().
+ */
+function path_menu() {
+  $items['admin/config/search/path'] = array(
+    'title' => 'URL aliases',
+    'description' => "Change your site's URL paths by aliasing them.",
+    'page callback' => 'path_admin_overview',
+    'access arguments' => array('administer url aliases'),
+    'weight' => -5,
+    'file' => 'path.admin.inc',
+  );
+  $items['admin/config/search/path/edit/%path'] = array(
+    'title' => 'Edit alias',
+    'page callback' => 'path_admin_edit',
+    'page arguments' => array(5),
+    'access arguments' => array('administer url aliases'),
+    'file' => 'path.admin.inc',
+  );
+  $items['admin/config/search/path/delete/%path'] = array(
+    'title' => 'Delete alias',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('path_admin_delete_confirm', 5),
+    'access arguments' => array('administer url aliases'),
+    'file' => 'path.admin.inc',
+  );
+  $items['admin/config/search/path/list'] = array(
+    'title' => 'List',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['admin/config/search/path/add'] = array(
+    'title' => 'Add alias',
+    'page callback' => 'path_admin_edit',
+    'access arguments' => array('administer url aliases'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'path.admin.inc',
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_form_BASE_FORM_ID_alter() for node_form().
+ *
+ * @see path_form_element_validate()
+ */
+function path_form_node_form_alter(&$form, $form_state) {
+  $path = array();
+  if (!empty($form['#node']->nid)) {
+    $conditions = array('source' => 'node/' . $form['#node']->nid);
+    $langcode = entity_language('node', $form['#node']);
+    if ($langcode != LANGUAGE_NONE) {
+      $conditions['language'] = $langcode;
+    }
+    $path = path_load($conditions);
+    if ($path === FALSE) {
+      $path = array();
+    }
+  }
+  $path += array(
+    'pid' => NULL,
+    'source' => isset($form['#node']->nid) ? 'node/' . $form['#node']->nid : NULL,
+    'alias' => '',
+    'language' => isset($langcode) ? $langcode : LANGUAGE_NONE,
+  );
+
+  $form['path'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('URL path settings'),
+    '#collapsible' => TRUE,
+    '#collapsed' => empty($path['alias']),
+    '#group' => 'additional_settings',
+    '#attributes' => array(
+      'class' => array('path-form'),
+    ),
+    '#attached' => array(
+      'js' => array(drupal_get_path('module', 'path') . '/path.js'),
+    ),
+    '#access' => user_access('create url aliases') || user_access('administer url aliases'),
+    '#weight' => 30,
+    '#tree' => TRUE,
+    '#element_validate' => array('path_form_element_validate'),
+  );
+  $form['path']['alias'] = array(
+    '#type' => 'textfield',
+    '#title' => t('URL alias'),
+    '#default_value' => $path['alias'],
+    '#maxlength' => 255,
+    '#description' => t('Optionally specify an alternative URL by which this content can be accessed. For example, type "about" when writing an about page. Use a relative path and don\'t add a trailing slash or the URL alias won\'t work.'),
+  );
+  $form['path']['pid'] = array('#type' => 'value', '#value' => $path['pid']);
+  $form['path']['source'] = array('#type' => 'value', '#value' => $path['source']);
+  $form['path']['language'] = array('#type' => 'value', '#value' => $path['language']);
+}
+
+/**
+ * Form element validation handler for URL alias form element.
+ *
+ * @see path_form_node_form_alter()
+ */
+function path_form_element_validate($element, &$form_state, $complete_form) {
+  // Trim the submitted value.
+  $alias = trim($form_state['values']['path']['alias']);
+  if (!empty($alias)) {
+    form_set_value($element['alias'], $alias, $form_state);
+    // Node language (Locale module) needs special care. Since the language of
+    // the URL alias depends on the node language, and the node language can be
+    // switched right within the same form, we need to conditionally overload
+    // the originally assigned URL alias language.
+    // @todo Remove this after converting Path module to a field, and, after
+    //   stopping Locale module from abusing the content language system.
+    if (isset($form_state['values']['language'])) {
+      form_set_value($element['language'], $form_state['values']['language'], $form_state);
+    }
+
+    $path = $form_state['values']['path'];
+
+    // Ensure that the submitted alias does not exist yet.
+    $query = db_select('url_alias')
+      ->condition('alias', $path['alias'])
+      ->condition('language', $path['language']);
+    if (!empty($path['source'])) {
+      $query->condition('source', $path['source'], '<>');
+    }
+    $query->addExpression('1');
+    $query->range(0, 1);
+    if ($query->execute()->fetchField()) {
+      form_error($element, t('The alias is already in use.'));
+    }
+  }
+}
+
+/**
+ * Implements hook_node_insert().
+ */
+function path_node_insert($node) {
+  if (isset($node->path)) {
+    $path = $node->path;
+    $path['alias'] = trim($path['alias']);
+    // Only save a non-empty alias.
+    if (!empty($path['alias'])) {
+      // Ensure fields for programmatic executions.
+      $langcode = entity_language('node', $node);
+      $path['source'] = 'node/' . $node->nid;
+      $path['language'] = isset($langcode) ? $langcode : LANGUAGE_NONE;
+      path_save($path);
+    }
+  }
+}
+
+/**
+ * Implements hook_node_update().
+ */
+function path_node_update($node) {
+  if (isset($node->path)) {
+    $path = $node->path;
+    $path['alias'] = trim($path['alias']);
+    // Delete old alias if user erased it.
+    if (!empty($path['pid']) && empty($path['alias'])) {
+      path_delete($path['pid']);
+    }
+    path_node_insert($node);
+  }
+}
+
+/**
+ * Implements hook_node_delete().
+ */
+function path_node_delete($node) {
+  // Delete all aliases associated with this node.
+  path_delete(array('source' => 'node/' . $node->nid));
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter() for taxonomy_form_term().
+ */
+function path_form_taxonomy_form_term_alter(&$form, $form_state) {
+  // Make sure this does not show up on the delete confirmation form.
+  if (empty($form_state['confirm_delete'])) {
+    $langcode = entity_language('taxonomy_term', (object) $form['#term']);
+    $langcode = !empty($langcode) ? $langcode : LANGUAGE_NONE;
+    $conditions = array('source' => 'taxonomy/term/' . $form['#term']['tid'], 'language' => $langcode);
+    $path = (isset($form['#term']['tid']) ? path_load($conditions) : array());
+    if ($path === FALSE) {
+      $path = array();
+    }
+    $path += array(
+      'pid' => NULL,
+      'source' => isset($form['#term']['tid']) ? 'taxonomy/term/' . $form['#term']['tid'] : NULL,
+      'alias' => '',
+      'language' => $langcode,
+    );
+    $form['path'] = array(
+      '#access' => user_access('create url aliases') || user_access('administer url aliases'),
+      '#tree' => TRUE,
+      '#element_validate' => array('path_form_element_validate'),
+    );
+    $form['path']['alias'] = array(
+      '#type' => 'textfield',
+      '#title' => t('URL alias'),
+      '#default_value' => $path['alias'],
+      '#maxlength' => 255,
+      '#weight' => 0,
+      '#description' => t("Optionally specify an alternative URL by which this term can be accessed. Use a relative path and don't add a trailing slash or the URL alias won't work."),
+    );
+    $form['path']['pid'] = array('#type' => 'value', '#value' => $path['pid']);
+    $form['path']['source'] = array('#type' => 'value', '#value' => $path['source']);
+    $form['path']['language'] = array('#type' => 'value', '#value' => $path['language']);
+  }
+}
+
+/**
+ * Implements hook_taxonomy_term_insert().
+ */
+function path_taxonomy_term_insert($term) {
+  if (isset($term->path)) {
+    $path = $term->path;
+    $path['alias'] = trim($path['alias']);
+    // Only save a non-empty alias.
+    if (!empty($path['alias'])) {
+      // Ensure fields for programmatic executions.
+      $path['source'] = 'taxonomy/term/' . $term->tid;
+      // Core does not provide a way to store the term language but contrib
+      // modules can do it so we need to take this into account.
+      $langcode = entity_language('taxonomy_term', $term);
+      $path['language'] = !empty($langcode) ? $langcode : LANGUAGE_NONE;
+      path_save($path);
+    }
+  }
+}
+
+/**
+ * Implements hook_taxonomy_term_update().
+ */
+function path_taxonomy_term_update($term) {
+  if (isset($term->path)) {
+    $path = $term->path;
+    $path['alias'] = trim($path['alias']);
+    // Delete old alias if user erased it.
+    if (!empty($path['pid']) && empty($path['alias'])) {
+      path_delete($path['pid']);
+    }
+    // Only save a non-empty alias.
+    if (!empty($path['alias'])) {
+      // Ensure fields for programmatic executions.
+      $path['source'] = 'taxonomy/term/' . $term->tid;
+      // Core does not provide a way to store the term language but contrib
+      // modules can do it so we need to take this into account.
+      $langcode = entity_language('taxonomy_term', $term);
+      $path['language'] = !empty($langcode) ? $langcode : LANGUAGE_NONE;
+      path_save($path);
+    }
+  }
+}
+
+/**
+ * Implements hook_taxonomy_term_delete().
+ */
+function path_taxonomy_term_delete($term) {
+  // Delete all aliases associated with this term.
+  path_delete(array('source' => 'taxonomy/term/' . $term->tid));
+}
diff --git a/htmltest/modules/path/path.test b/htmltest/modules/path/path.test
new file mode 100644
index 00000000..edecff5c
--- /dev/null
+++ b/htmltest/modules/path/path.test
@@ -0,0 +1,537 @@
+<?php
+
+/**
+ * @file
+ * Tests for the Path module.
+ */
+
+/**
+ * Provides a base class for testing the Path module.
+ */
+class PathTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Path alias functionality',
+      'description' => 'Add, edit, delete, and change alias and verify its consistency in the database.',
+      'group' => 'Path',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('path');
+
+    // Create test user and login.
+    $web_user = $this->drupalCreateUser(array('create page content', 'edit own page content', 'administer url aliases', 'create url aliases'));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Tests the path cache.
+   */
+  function testPathCache() {
+    // Create test node.
+    $node1 = $this->drupalCreateNode();
+
+    // Create alias.
+    $edit = array();
+    $edit['source'] = 'node/' . $node1->nid;
+    $edit['alias'] = $this->randomName(8);
+    $this->drupalPost('admin/config/search/path/add', $edit, t('Save'));
+
+    // Visit the system path for the node and confirm a cache entry is
+    // created.
+    cache_clear_all('*', 'cache_path', TRUE);
+    $this->drupalGet($edit['source']);
+    $this->assertTrue(cache_get($edit['source'], 'cache_path'), 'Cache entry was created.');
+
+    // Visit the alias for the node and confirm a cache entry is created.
+    cache_clear_all('*', 'cache_path', TRUE);
+    $this->drupalGet($edit['alias']);
+    $this->assertTrue(cache_get($edit['source'], 'cache_path'), 'Cache entry was created.');
+  }
+
+  /**
+   * Tests alias functionality through the admin interfaces.
+   */
+  function testAdminAlias() {
+    // Create test node.
+    $node1 = $this->drupalCreateNode();
+
+    // Create alias.
+    $edit = array();
+    $edit['source'] = 'node/' . $node1->nid;
+    $edit['alias'] = $this->randomName(8);
+    $this->drupalPost('admin/config/search/path/add', $edit, t('Save'));
+
+    // Confirm that the alias works.
+    $this->drupalGet($edit['alias']);
+    $this->assertText($node1->title, 'Alias works.');
+    $this->assertResponse(200);
+
+    // Change alias to one containing "exotic" characters.
+    $pid = $this->getPID($edit['alias']);
+
+    $previous = $edit['alias'];
+    $edit['alias'] = "- ._~!$'\"()*@[]?&+%#,;=:" . // "Special" ASCII characters.
+      "%23%25%26%2B%2F%3F" . // Characters that look like a percent-escaped string.
+      "éøïвβ中國書۞"; // Characters from various non-ASCII alphabets.
+    $this->drupalPost('admin/config/search/path/edit/' . $pid, $edit, t('Save'));
+
+    // Confirm that the alias works.
+    $this->drupalGet($edit['alias']);
+    $this->assertText($node1->title, 'Changed alias works.');
+    $this->assertResponse(200);
+
+    drupal_static_reset('drupal_lookup_path');
+    // Confirm that previous alias no longer works.
+    $this->drupalGet($previous);
+    $this->assertNoText($node1->title, 'Previous alias no longer works.');
+    $this->assertResponse(404);
+
+    // Create second test node.
+    $node2 = $this->drupalCreateNode();
+
+    // Set alias to second test node.
+    $edit['source'] = 'node/' . $node2->nid;
+    // leave $edit['alias'] the same
+    $this->drupalPost('admin/config/search/path/add', $edit, t('Save'));
+
+    // Confirm no duplicate was created.
+    $this->assertRaw(t('The alias %alias is already in use in this language.', array('%alias' => $edit['alias'])), 'Attempt to move alias was rejected.');
+
+    // Delete alias.
+    $this->drupalPost('admin/config/search/path/edit/' . $pid, array(), t('Delete'));
+    $this->drupalPost(NULL, array(), t('Confirm'));
+
+    // Confirm that the alias no longer works.
+    $this->drupalGet($edit['alias']);
+    $this->assertNoText($node1->title, 'Alias was successfully deleted.');
+    $this->assertResponse(404);
+  }
+
+  /**
+   * Tests alias functionality through the node interfaces.
+   */
+  function testNodeAlias() {
+    // Create test node.
+    $node1 = $this->drupalCreateNode();
+
+    // Create alias.
+    $edit = array();
+    $edit['path[alias]'] = $this->randomName(8);
+    $this->drupalPost('node/' . $node1->nid . '/edit', $edit, t('Save'));
+
+    // Confirm that the alias works.
+    $this->drupalGet($edit['path[alias]']);
+    $this->assertText($node1->title, 'Alias works.');
+    $this->assertResponse(200);
+
+    // Change alias to one containing "exotic" characters.
+    $previous = $edit['path[alias]'];
+    $edit['path[alias]'] = "- ._~!$'\"()*@[]?&+%#,;=:" . // "Special" ASCII characters.
+      "%23%25%26%2B%2F%3F" . // Characters that look like a percent-escaped string.
+      "éøïвβ中國書۞"; // Characters from various non-ASCII alphabets.
+    $this->drupalPost('node/' . $node1->nid . '/edit', $edit, t('Save'));
+
+    // Confirm that the alias works.
+    $this->drupalGet($edit['path[alias]']);
+    $this->assertText($node1->title, 'Changed alias works.');
+    $this->assertResponse(200);
+
+    // Make sure that previous alias no longer works.
+    $this->drupalGet($previous);
+    $this->assertNoText($node1->title, 'Previous alias no longer works.');
+    $this->assertResponse(404);
+
+    // Create second test node.
+    $node2 = $this->drupalCreateNode();
+
+    // Set alias to second test node.
+    // Leave $edit['path[alias]'] the same.
+    $this->drupalPost('node/' . $node2->nid . '/edit', $edit, t('Save'));
+
+    // Confirm that the alias didn't make a duplicate.
+    $this->assertText(t('The alias is already in use.'), 'Attempt to moved alias was rejected.');
+
+    // Delete alias.
+    $this->drupalPost('node/' . $node1->nid . '/edit', array('path[alias]' => ''), t('Save'));
+
+    // Confirm that the alias no longer works.
+    $this->drupalGet($edit['path[alias]']);
+    $this->assertNoText($node1->title, 'Alias was successfully deleted.');
+    $this->assertResponse(404);
+  }
+
+  /**
+   * Returns the path ID.
+   *
+   * @param $alias
+   *   A string containing an aliased path.
+   *
+   * @return int
+   *   Integer representing the path ID.
+   */
+  function getPID($alias) {
+    return db_query("SELECT pid FROM {url_alias} WHERE alias = :alias", array(':alias' => $alias))->fetchField();
+  }
+
+  /**
+   * Tests that duplicate aliases fail validation.
+   */
+  function testDuplicateNodeAlias() {
+    // Create one node with a random alias.
+    $node_one = $this->drupalCreateNode();
+    $edit = array();
+    $edit['path[alias]'] = $this->randomName();
+    $this->drupalPost('node/' . $node_one->nid . '/edit', $edit, t('Save'));
+
+    // Now create another node and try to set the same alias.
+    $node_two = $this->drupalCreateNode();
+    $this->drupalPost('node/' . $node_two->nid . '/edit', $edit, t('Save'));
+    $this->assertText(t('The alias is already in use.'));
+    $this->assertFieldByXPath("//input[@name='path[alias]' and contains(@class, 'error')]", $edit['path[alias]'], 'Textfield exists and has the error class.');
+  }
+}
+
+/**
+ * Tests URL aliases for taxonomy terms.
+ */
+class PathTaxonomyTermTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Taxonomy term URL aliases',
+      'description' => 'Tests URL aliases for taxonomy terms.',
+      'group' => 'Path',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('path', 'taxonomy');
+
+    // Create and login user.
+    $web_user = $this->drupalCreateUser(array('administer url aliases', 'administer taxonomy', 'access administration pages'));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Tests alias functionality through the admin interfaces.
+   */
+  function testTermAlias() {
+    // Create a term in the default 'Tags' vocabulary with URL alias.
+    $vocabulary = taxonomy_vocabulary_load(1);
+    $description = $this->randomName();;
+    $edit = array();
+    $edit['name'] = $this->randomName();
+    $edit['description[value]'] = $description;
+    $edit['path[alias]'] = $this->randomName();
+    $this->drupalPost('admin/structure/taxonomy/' . $vocabulary->machine_name . '/add', $edit, t('Save'));
+
+    // Confirm that the alias works.
+    $this->drupalGet($edit['path[alias]']);
+    $this->assertText($description, 'Term can be accessed on URL alias.');
+
+    // Change the term's URL alias.
+    $tid = db_query("SELECT tid FROM {taxonomy_term_data} WHERE name = :name", array(':name' => $edit['name']))->fetchField();
+    $edit2 = array();
+    $edit2['path[alias]'] = $this->randomName();
+    $this->drupalPost('taxonomy/term/' . $tid . '/edit', $edit2, t('Save'));
+
+    // Confirm that the changed alias works.
+    $this->drupalGet($edit2['path[alias]']);
+    $this->assertText($description, 'Term can be accessed on changed URL alias.');
+
+    // Confirm that the old alias no longer works.
+    $this->drupalGet($edit['path[alias]']);
+    $this->assertNoText($description, 'Old URL alias has been removed after altering.');
+    $this->assertResponse(404, 'Old URL alias returns 404.');
+
+    // Remove the term's URL alias.
+    $edit3 = array();
+    $edit3['path[alias]'] = '';
+    $this->drupalPost('taxonomy/term/' . $tid . '/edit', $edit3, t('Save'));
+
+    // Confirm that the alias no longer works.
+    $this->drupalGet($edit2['path[alias]']);
+    $this->assertNoText($description, 'Old URL alias has been removed after altering.');
+    $this->assertResponse(404, 'Old URL alias returns 404.');
+  }
+}
+
+/**
+ * Tests URL aliases for translated nodes.
+ */
+class PathLanguageTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Path aliases with translated nodes',
+      'description' => 'Confirm that paths work with translated nodes',
+      'group' => 'Path',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('path', 'locale', 'translation');
+
+    // Create and login user.
+    $this->web_user = $this->drupalCreateUser(array('edit any page content', 'create page content', 'administer url aliases', 'create url aliases', 'administer languages', 'translate content', 'access administration pages'));
+    $this->drupalLogin($this->web_user);
+
+    // Enable French language.
+    $edit = array();
+    $edit['langcode'] = 'fr';
+
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+    // Enable URL language detection and selection.
+    $edit = array('language[enabled][locale-url]' => 1);
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+  }
+
+  /**
+   * Test alias functionality through the admin interfaces.
+   */
+  function testAliasTranslation() {
+    // Set 'page' content type to enable translation.
+    variable_set('language_content_type_page', 2);
+
+    $english_node = $this->drupalCreateNode(array('type' => 'page'));
+    $english_alias = $this->randomName();
+
+    // Edit the node to set language and path.
+    $edit = array();
+    $edit['language'] = 'en';
+    $edit['path[alias]'] = $english_alias;
+    $this->drupalPost('node/' . $english_node->nid . '/edit', $edit, t('Save'));
+
+    // Confirm that the alias works.
+    $this->drupalGet($english_alias);
+    $this->assertText($english_node->title, 'Alias works.');
+
+    // Translate the node into French.
+    $this->drupalGet('node/' . $english_node->nid . '/translate');
+    $this->clickLink(t('add translation'));
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = $this->randomName();
+    $edit["body[$langcode][0][value]"] = $this->randomName();
+    $french_alias = $this->randomName();
+    $edit['path[alias]'] = $french_alias;
+    $this->drupalPost(NULL, $edit, t('Save'));
+
+    // Clear the path lookup cache.
+    drupal_lookup_path('wipe');
+
+    // Ensure the node was created.
+    $french_node = $this->drupalGetNodeByTitle($edit["title"]);
+    $this->assertTrue(($french_node), 'Node found in database.');
+
+    // Confirm that the alias works.
+    $this->drupalGet('fr/' . $edit['path[alias]']);
+    $this->assertText($french_node->title, 'Alias for French translation works.');
+
+    // Confirm that the alias is returned by url().
+    drupal_static_reset('language_list');
+    drupal_static_reset('locale_url_outbound_alter');
+    $languages = language_list();
+    $url = url('node/' . $french_node->nid, array('language' => $languages[$french_node->language]));
+    $this->assertTrue(strpos($url, $edit['path[alias]']), 'URL contains the path alias.');
+
+    // Confirm that the alias works even when changing language negotiation
+    // options. Enable User language detection and selection over URL one.
+    $edit = array(
+      'language[enabled][locale-user]' => 1,
+      'language[weight][locale-user]' => -9,
+      'language[enabled][locale-url]' => 1,
+      'language[weight][locale-url]' => -8,
+    );
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+
+    // Change user language preference.
+    $edit = array('language' => 'fr');
+    $this->drupalPost("user/{$this->web_user->uid}/edit", $edit, t('Save'));
+
+    // Check that the English alias works. In this situation French is the
+    // current UI and content language, while URL language is English (since we
+    // do not have a path prefix we fall back to the site's default language).
+    // We need to ensure that the user language preference is not taken into
+    // account while determining the path alias language, because if this
+    // happens we have no way to check that the path alias is valid: there is no
+    // path alias for French matching the english alias. So drupal_lookup_path()
+    // needs to use the URL language to check whether the alias is valid.
+    $this->drupalGet($english_alias);
+    $this->assertText($english_node->title, 'Alias for English translation works.');
+
+    // Check that the French alias works.
+    $this->drupalGet("fr/$french_alias");
+    $this->assertText($french_node->title, 'Alias for French translation works.');
+
+    // Disable URL language negotiation.
+    $edit = array('language[enabled][locale-url]' => FALSE);
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+
+    // Check that the English alias still works.
+    $this->drupalGet($english_alias);
+    $this->assertText($english_node->title, 'Alias for English translation works.');
+
+    // Check that the French alias is not available. We check the unprefixed
+    // alias because we disabled URL language negotiation above. In this
+    // situation only aliases in the default language and language neutral ones
+    // should keep working.
+    $this->drupalGet($french_alias);
+    $this->assertResponse(404, 'Alias for French translation is unavailable when URL language negotiation is disabled.');
+
+    // drupal_lookup_path() has an internal static cache. Check to see that
+    // it has the appropriate contents at this point.
+    drupal_lookup_path('wipe');
+    $french_node_path = drupal_lookup_path('source', $french_alias, $french_node->language);
+    $this->assertEqual($french_node_path, 'node/' . $french_node->nid, 'Normal path works.');
+    // Second call should return the same path.
+    $french_node_path = drupal_lookup_path('source', $french_alias, $french_node->language);
+    $this->assertEqual($french_node_path, 'node/' . $french_node->nid, 'Normal path is the same.');
+
+    // Confirm that the alias works.
+    $french_node_alias = drupal_lookup_path('alias', 'node/' . $french_node->nid, $french_node->language);
+    $this->assertEqual($french_node_alias, $french_alias, 'Alias works.');
+    // Second call should return the same alias.
+    $french_node_alias = drupal_lookup_path('alias', 'node/' . $french_node->nid, $french_node->language);
+    $this->assertEqual($french_node_alias, $french_alias, 'Alias is the same.');
+  }
+}
+
+/**
+ * Tests the user interface for creating path aliases, with languages.
+ */
+class PathLanguageUITestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Path aliases with languages',
+      'description' => 'Confirm that the Path module user interface works with languages.',
+      'group' => 'Path',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('path', 'locale');
+
+    // Create and login user.
+    $web_user = $this->drupalCreateUser(array('edit any page content', 'create page content', 'administer url aliases', 'create url aliases', 'administer languages', 'access administration pages'));
+    $this->drupalLogin($web_user);
+
+    // Enable French language.
+    $edit = array();
+    $edit['langcode'] = 'fr';
+
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+    // Enable URL language detection and selection.
+    $edit = array('language[enabled][locale-url]' => 1);
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+  }
+
+  /**
+   * Tests that a language-neutral URL alias works.
+   */
+  function testLanguageNeutralURLs() {
+    $name = $this->randomName(8);
+    $edit = array();
+    $edit['source'] = 'admin/config/search/path';
+    $edit['alias'] = $name;
+    $this->drupalPost('admin/config/search/path/add', $edit, t('Save'));
+
+    $this->drupalGet($name);
+    $this->assertText(t('Filter aliases'), 'Language-neutral URL alias works');
+  }
+
+  /**
+   * Tests that a default language URL alias works.
+   */
+  function testDefaultLanguageURLs() {
+    $name = $this->randomName(8);
+    $edit = array();
+    $edit['source'] = 'admin/config/search/path';
+    $edit['alias'] = $name;
+    $edit['language'] = 'en';
+    $this->drupalPost('admin/config/search/path/add', $edit, t('Save'));
+
+    $this->drupalGet($name);
+    $this->assertText(t('Filter aliases'), 'English URL alias works');
+  }
+
+  /**
+   * Tests that a non-default language URL alias works.
+   */
+  function testNonDefaultURLs() {
+    $name = $this->randomName(8);
+    $edit = array();
+    $edit['source'] = 'admin/config/search/path';
+    $edit['alias'] = $name;
+    $edit['language'] = 'fr';
+    $this->drupalPost('admin/config/search/path/add', $edit, t('Save'));
+
+    $this->drupalGet('fr/' . $name);
+    $this->assertText(t('Filter aliases'), 'Foreign URL alias works');
+  }
+
+}
+
+/**
+ * Tests that paths are not prefixed on a monolingual site.
+ */
+class PathMonolingualTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Paths on non-English monolingual sites',
+      'description' => 'Confirm that paths are not changed on monolingual non-English sites',
+      'group' => 'Path',
+    );
+  }
+
+  function setUp() {
+    global $language;
+    parent::setUp('path', 'locale', 'translation');
+
+    // Create and login user.
+    $web_user = $this->drupalCreateUser(array('administer languages', 'access administration pages'));
+    $this->drupalLogin($web_user);
+
+    // Enable French language.
+    $edit = array();
+    $edit['langcode'] = 'fr';
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+    // Make French the default language.
+    $edit = array('site_default' => 'fr');
+    $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
+
+    // Disable English.
+    $edit = array('enabled[en]' => FALSE);
+    $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
+
+    // Verify that French is the only language.
+    $this->assertFalse(drupal_multilingual(), 'Site is mono-lingual');
+    $this->assertEqual(language_default('language'), 'fr', 'French is the default language');
+
+    // Set language detection to URL.
+    $edit = array('language[enabled][locale-url]' => TRUE);
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+
+    // Force languages to be initialized.
+    drupal_language_initialize();
+  }
+
+  /**
+   * Verifies that links do not have language prefixes in them.
+   */
+  function testPageLinks() {
+    // Navigate to 'admin/config' path.
+    $this->drupalGet('admin/config');
+
+    // Verify that links in this page do not have a 'fr/' prefix.
+    $this->assertNoLinkByHref('/fr/', 'Links do not contain language prefix');
+
+    // Verify that links in this page can be followed and work.
+    $this->clickLink(t('Languages'));
+    $this->assertResponse(200, 'Clicked link results in a valid page');
+    $this->assertText(t('Add language'), 'Page contains the add language text');
+  }
+}
diff --git a/htmltest/modules/php/php.info b/htmltest/modules/php/php.info
new file mode 100644
index 00000000..1cb7000c
--- /dev/null
+++ b/htmltest/modules/php/php.info
@@ -0,0 +1,12 @@
+name = PHP filter
+description = Allows embedded PHP code/snippets to be evaluated.
+package = Core
+version = VERSION
+core = 7.x
+files[] = php.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/php/php.install b/htmltest/modules/php/php.install
new file mode 100644
index 00000000..12944ddd
--- /dev/null
+++ b/htmltest/modules/php/php.install
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the php module.
+ */
+
+/**
+ * Implements hook_enable().
+ */
+function php_enable() {
+  $format_exists = (bool) db_query_range('SELECT 1 FROM {filter_format} WHERE name = :name', 0, 1, array(':name' => 'PHP code'))->fetchField();
+  // Add a PHP code text format, if it does not exist. Do this only for the
+  // first install (or if the format has been manually deleted) as there is no
+  // reliable method to identify the format in an uninstall hook or in
+  // subsequent clean installs.
+  if (!$format_exists) {
+    $php_format = array(
+      'format' => 'php_code',
+      'name' => 'PHP code',
+      // 'Plain text' format is installed with a weight of 10 by default. Use a
+      // higher weight here to ensure that this format will not be the default
+      // format for anyone.
+      'weight' => 11,
+      'filters' => array(
+        // Enable the PHP evaluator filter.
+        'php_code' => array(
+          'weight' => 0,
+          'status' => 1,
+        ),
+      ),
+    );
+    $php_format = (object) $php_format;
+    filter_format_save($php_format);
+
+    drupal_set_message(t('A <a href="@php-code">PHP code</a> text format has been created.', array('@php-code' => url('admin/config/content/formats/' . $php_format->format))));
+  }
+}
+
+/**
+ * Implements hook_disable().
+ */
+function php_disable() {
+  drupal_set_message(t('The PHP module has been disabled. Any existing content that was using the PHP filter will now be visible in plain text. This might pose a security risk by exposing sensitive information, if any, used in the PHP code.'));
+}
diff --git a/htmltest/modules/php/php.module b/htmltest/modules/php/php.module
new file mode 100644
index 00000000..67616f6b
--- /dev/null
+++ b/htmltest/modules/php/php.module
@@ -0,0 +1,147 @@
+<?php
+
+/**
+ * @file
+ * Additional filter for PHP input.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function php_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#php':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The PHP filter module adds a PHP filter to your site, for use with <a href="@filter">text formats</a>. This filter adds the ability to execute PHP code in any text field that uses a text format (such as the body of a content item or the text of a comment). <a href="@php-net">PHP</a> is a general-purpose scripting language widely-used for web development, and is the language with which Drupal has been developed. For more information, see the online handbook entry for the <a href="@php">PHP filter module</a>.', array('@filter' => url('admin/help/filter'), '@php-net' => 'http://www.php.net', '@php' => 'http://drupal.org/documentation/modules/php/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Enabling execution of PHP in text fields') . '</dt>';
+      $output .= '<dd>' . t('The PHP filter module allows users with the proper permissions to include custom PHP code that will get executed when pages of your site are processed. While this is a powerful and flexible feature if used by a trusted user with PHP experience, it is a significant and dangerous security risk in the hands of a malicious or inexperienced user. Even a trusted user may accidentally compromise the site by entering malformed or incorrect PHP code. Only the most trusted users should be granted permission to use the PHP filter, and all PHP code added through the PHP filter should be carefully examined before use. <a href="@php-snippets">Example PHP snippets</a> can be found on Drupal.org.', array('@php-snippets' => url('http://drupal.org/documentation/customization/php-snippets'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_permission().
+ */
+function php_permission() {
+  return array(
+    'use PHP for settings' => array(
+      'title' => t('Use PHP for settings'),
+      'restrict access' => TRUE,
+    ),
+  );
+}
+
+/**
+ * Evaluates a string of PHP code.
+ *
+ * This is a wrapper around PHP's eval(). It uses output buffering to capture
+ * both returned and printed text. Unlike eval(), we require code to be
+ * surrounded by <?php ?> tags; in other words, we evaluate the code as if it
+ * were a stand-alone PHP file.
+ *
+ * Using this wrapper also ensures that the PHP code which is evaluated can not
+ * overwrite any variables in the calling code, unlike a regular eval() call.
+ *
+ * This function is also used as an implementation of
+ * callback_filter_process().
+ *
+ * @param $code
+ *   The code to evaluate.
+ *
+ * @return
+ *   A string containing the printed output of the code, followed by the
+ *   returned output of the code.
+ *
+ * @ingroup php_wrappers
+ *
+ * @see php_filter_info()
+ */
+function php_eval($code) {
+  global $theme_path, $theme_info, $conf;
+
+  // Store current theme path.
+  $old_theme_path = $theme_path;
+
+  // Restore theme_path to the theme, as long as php_eval() executes,
+  // so code evaluated will not see the caller module as the current theme.
+  // If theme info is not initialized get the path from theme_default.
+  if (!isset($theme_info)) {
+    $theme_path = drupal_get_path('theme', $conf['theme_default']);
+  }
+  else {
+    $theme_path = dirname($theme_info->filename);
+  }
+
+  ob_start();
+  print eval('?>' . $code);
+  $output = ob_get_contents();
+  ob_end_clean();
+
+  // Recover original theme path.
+  $theme_path = $old_theme_path;
+
+  return $output;
+}
+
+/**
+ * Implements callback_filter_tips().
+ *
+ * @see php_filter_info()
+ */
+function _php_filter_tips($filter, $format, $long = FALSE) {
+  global $base_url;
+  if ($long) {
+    $output = '<h4>' . t('Using custom PHP code') . '</h4>';
+    $output .= '<p>' . t('Custom PHP code may be embedded in some types of site content, including posts and blocks. While embedding PHP code inside a post or block is a powerful and flexible feature when used by a trusted user with PHP experience, it is a significant and dangerous security risk when used improperly. Even a small mistake when posting PHP code may accidentally compromise your site.') . '</p>';
+    $output .= '<p>' . t('If you are unfamiliar with PHP, SQL, or Drupal, avoid using custom PHP code within posts. Experimenting with PHP may corrupt your database, render your site inoperable, or significantly compromise security.') . '</p>';
+    $output .= '<p>' . t('Notes:') . '</p>';
+    $output .= '<ul><li>' . t('Remember to double-check each line for syntax and logic errors <strong>before</strong> saving.') . '</li>';
+    $output .= '<li>' . t('Statements must be correctly terminated with semicolons.') . '</li>';
+    $output .= '<li>' . t('Global variables used within your PHP code retain their values after your script executes.') . '</li>';
+    $output .= '<li>' . t('<code>register_globals</code> is <strong>turned off</strong>. If you need to use forms, understand and use the functions in <a href="@formapi">the Drupal Form API</a>.', array('@formapi' => url('http://api.drupal.org/api/group/form_api/7'))) . '</li>';
+    $output .= '<li>' . t('Use a <code>print</code> or <code>return</code> statement in your code to output content.') . '</li>';
+    $output .= '<li>' . t('Develop and test your PHP code using a separate test script and sample database before deploying on a production site.') . '</li>';
+    $output .= '<li>' . t('Consider including your custom PHP code within a site-specific module or <code>template.php</code> file rather than embedding it directly into a post or block.') . '</li>';
+    $output .= '<li>' . t('Be aware that the ability to embed PHP code within content is provided by the PHP Filter module. If this module is disabled or deleted, then blocks and posts with embedded PHP may display, rather than execute, the PHP code.') . '</li></ul>';
+    $output .= '<p>' . t('A basic example: <em>Creating a "Welcome" block that greets visitors with a simple message.</em>') . '</p>';
+    $output .= '<ul><li>' . t('<p>Add a custom block to your site, named "Welcome" . With its text format set to "PHP code" (or another format supporting PHP input), add the following in the Block body:</p>
+<pre>
+print t(\'Welcome visitor! Thank you for visiting.\');
+</pre>') . '</li>';
+    $output .= '<li>' . t('<p>To display the name of a registered user, use this instead:</p>
+<pre>
+global $user;
+if ($user->uid) {
+  print t(\'Welcome @name! Thank you for visiting.\', array(\'@name\' => format_username($user)));
+}
+else {
+  print t(\'Welcome visitor! Thank you for visiting.\');
+}
+</pre>') . '</li></ul>';
+    $output .= '<p>' . t('<a href="@drupal">Drupal.org</a> offers <a href="@php-snippets">some example PHP snippets</a>, or you can create your own with some PHP experience and knowledge of the Drupal system.', array('@drupal' => url('http://drupal.org'), '@php-snippets' => url('http://drupal.org/documentation/customization/php-snippets'))) . '</p>';
+    return $output;
+  }
+  else {
+    return t('You may post PHP code. You should include &lt;?php ?&gt; tags.');
+  }
+}
+
+/**
+ * Implements hook_filter_info().
+ *
+ * Provide PHP code filter. Use with care.
+ */
+function php_filter_info() {
+  $filters['php_code'] = array(
+    'title' => t('PHP evaluator'),
+    'description' => t('Executes a piece of PHP code. The usage of this filter should be restricted to administrators only!'),
+    'process callback' => 'php_eval',
+    'tips callback' => '_php_filter_tips',
+    'cache' => FALSE,
+  );
+  return $filters;
+}
diff --git a/htmltest/modules/php/php.test b/htmltest/modules/php/php.test
new file mode 100644
index 00000000..3b11b481
--- /dev/null
+++ b/htmltest/modules/php/php.test
@@ -0,0 +1,120 @@
+<?php
+
+/**
+ * @file
+ * Tests for php.module.
+ */
+
+/**
+ * Defines a base PHP test case class.
+ */
+class PHPTestCase extends DrupalWebTestCase {
+  protected $php_code_format;
+
+  function setUp() {
+    parent::setUp('php');
+
+    // Create and login admin user.
+    $admin_user = $this->drupalCreateUser(array('administer filters'));
+    $this->drupalLogin($admin_user);
+
+    // Verify that the PHP code text format was inserted.
+    $php_format_id = 'php_code';
+    $this->php_code_format = filter_format_load($php_format_id);
+    $this->assertEqual($this->php_code_format->name, 'PHP code', 'PHP code text format was created.');
+
+    // Verify that the format has the PHP code filter enabled.
+    $filters = filter_list_format($php_format_id);
+    $this->assertTrue($filters['php_code']->status, 'PHP code filter is enabled.');
+
+    // Verify that the format exists on the administration page.
+    $this->drupalGet('admin/config/content/formats');
+    $this->assertText('PHP code', 'PHP code text format was created.');
+
+    // Verify that anonymous and authenticated user roles do not have access.
+    $this->drupalGet('admin/config/content/formats/' . $php_format_id);
+    $this->assertFieldByName('roles[' . DRUPAL_ANONYMOUS_RID . ']', FALSE, 'Anonymous users do not have access to PHP code format.');
+    $this->assertFieldByName('roles[' . DRUPAL_AUTHENTICATED_RID . ']', FALSE, 'Authenticated users do not have access to PHP code format.');
+  }
+
+  /**
+   * Creates a test node with PHP code in the body.
+   *
+   * @return stdObject Node object.
+   */
+  function createNodeWithCode() {
+    return $this->drupalCreateNode(array('body' => array(LANGUAGE_NONE => array(array('value' => '<?php print "SimpleTest PHP was executed!"; ?>')))));
+  }
+}
+
+/**
+ * Tests to make sure the PHP filter actually evaluates PHP code when used.
+ */
+class PHPFilterTestCase extends PHPTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'PHP filter functionality',
+      'description' => 'Make sure that PHP filter properly evaluates PHP code when enabled.',
+      'group' => 'PHP',
+    );
+  }
+
+  /**
+   * Makes sure that the PHP filter evaluates PHP code when used.
+   */
+  function testPHPFilter() {
+    // Log in as a user with permission to use the PHP code text format.
+    $php_code_permission = filter_permission_name(filter_format_load('php_code'));
+    $web_user = $this->drupalCreateUser(array('access content', 'create page content', 'edit own page content', $php_code_permission));
+    $this->drupalLogin($web_user);
+
+    // Create a node with PHP code in it.
+    $node = $this->createNodeWithCode();
+
+    // Make sure that the PHP code shows up as text.
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText('print "SimpleTest PHP was executed!"', 'PHP code is displayed.');
+
+    // Change filter to PHP filter and see that PHP code is evaluated.
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["body[$langcode][0][format]"] = $this->php_code_format->format;
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->assertRaw(t('Basic page %title has been updated.', array('%title' => $node->title)), 'PHP code filter turned on.');
+
+    // Make sure that the PHP code shows up as text.
+    $this->assertNoText('print "SimpleTest PHP was executed!"', "PHP code isn't displayed.");
+    $this->assertText('SimpleTest PHP was executed!', 'PHP code has been evaluated.');
+  }
+}
+
+/**
+ * Tests to make sure access to the PHP filter is properly restricted.
+ */
+class PHPAccessTestCase extends PHPTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'PHP filter access check',
+      'description' => 'Make sure that users who don\'t have access to the PHP filter can\'t see it.',
+      'group' => 'PHP',
+    );
+  }
+
+  /**
+   * Makes sure that the user can't use the PHP filter when not given access.
+   */
+  function testNoPrivileges() {
+    // Create node with PHP filter enabled.
+    $web_user = $this->drupalCreateUser(array('access content', 'create page content', 'edit own page content'));
+    $this->drupalLogin($web_user);
+    $node = $this->createNodeWithCode();
+
+    // Make sure that the PHP code shows up as text.
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText('print', 'PHP code was not evaluated.');
+
+    // Make sure that user doesn't have access to filter.
+    $this->drupalGet('node/' . $node->nid . '/edit');
+    $this->assertNoRaw('<option value="' . $this->php_code_format->format . '">', 'PHP code format not available.');
+  }
+}
diff --git a/htmltest/modules/poll/poll-bar--block.tpl.php b/htmltest/modules/poll/poll-bar--block.tpl.php
new file mode 100644
index 00000000..3b91afc3
--- /dev/null
+++ b/htmltest/modules/poll/poll-bar--block.tpl.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to display the bar for a single choice in a
+ * poll.
+ *
+ * Variables available:
+ * - $title: The title of the poll.
+ * - $votes: The number of votes for this choice
+ * - $total_votes: The number of votes for this choice
+ * - $percentage: The percentage of votes for this choice.
+ * - $vote: The choice number of the current user's vote.
+ * - $voted: Set to TRUE if the user voted for this choice.
+ *
+ * @see template_preprocess_poll_bar()
+ */
+?>
+
+<div class="text"><?php print $title; ?></div>
+<div class="bar">
+  <div style="width: <?php print $percentage; ?>%;" class="foreground"></div>
+</div>
+<div class="percent">
+  <?php print $percentage; ?>%
+</div>
diff --git a/htmltest/modules/poll/poll-bar.tpl.php b/htmltest/modules/poll/poll-bar.tpl.php
new file mode 100644
index 00000000..9426ff59
--- /dev/null
+++ b/htmltest/modules/poll/poll-bar.tpl.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to display the bar for a single choice in a
+ * poll.
+ *
+ * Variables available:
+ * - $title: The title of the poll.
+ * - $votes: The number of votes for this choice
+ * - $total_votes: The number of votes for this choice
+ * - $percentage: The percentage of votes for this choice.
+ * - $vote: The choice number of the current user's vote.
+ * - $voted: Set to TRUE if the user voted for this choice.
+ *
+ * @see template_preprocess_poll_bar()
+ */
+?>
+
+<div class="text"><?php print $title; ?></div>
+<div class="bar">
+  <div style="width: <?php print $percentage; ?>%;" class="foreground"></div>
+</div>
+<div class="percent">
+  <?php print $percentage; ?>% (<?php print format_plural($votes, '1 vote', '@count votes'); ?>)
+</div>
diff --git a/htmltest/modules/poll/poll-results--block.tpl.php b/htmltest/modules/poll/poll-results--block.tpl.php
new file mode 100644
index 00000000..f8387f56
--- /dev/null
+++ b/htmltest/modules/poll/poll-results--block.tpl.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * @file
+ * Default theme implementation to display the poll results in a block.
+ *
+ * Variables available:
+ * - $title: The title of the poll.
+ * - $results: The results of the poll.
+ * - $votes: The total results in the poll.
+ * - $links: Links in the poll.
+ * - $nid: The nid of the poll
+ * - $cancel_form: A form to cancel the user's vote, if allowed.
+ * - $raw_links: The raw array of links. Should be run through theme('links')
+ *   if used.
+ * - $vote: The choice number of the current user's vote.
+ *
+ * @see template_preprocess_poll_results()
+ */
+?>
+
+<div class="poll">
+  <div class="title"><?php print $title ?></div>
+  <?php print $results ?>
+  <div class="total">
+    <?php print t('Total votes: @votes', array('@votes' => $votes)); ?>
+  </div>
+</div>
+<div class="links"><?php print $links; ?></div>
diff --git a/htmltest/modules/poll/poll-results.tpl.php b/htmltest/modules/poll/poll-results.tpl.php
new file mode 100644
index 00000000..678bc2b1
--- /dev/null
+++ b/htmltest/modules/poll/poll-results.tpl.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to display the poll results in a block.
+ *
+ * Variables available:
+ * - $title: The title of the poll.
+ * - $results: The results of the poll.
+ * - $votes: The total results in the poll.
+ * - $links: Links in the poll.
+ * - $nid: The nid of the poll
+ * - $cancel_form: A form to cancel the user's vote, if allowed.
+ * - $raw_links: The raw array of links.
+ * - $vote: The choice number of the current user's vote.
+ *
+ * @see template_preprocess_poll_results()
+ *
+ * @ingroup themeable
+ */
+?>
+<div class="poll">
+  <?php print $results; ?>
+  <div class="total">
+    <?php print t('Total votes: @votes', array('@votes' => $votes)); ?>
+  </div>
+  <?php if (!empty($cancel_form)): ?>
+    <?php print $cancel_form; ?>
+  <?php endif; ?>
+</div>
diff --git a/htmltest/modules/poll/poll-rtl.css b/htmltest/modules/poll/poll-rtl.css
new file mode 100644
index 00000000..14d42e69
--- /dev/null
+++ b/htmltest/modules/poll/poll-rtl.css
@@ -0,0 +1,10 @@
+
+.poll .bar .foreground {
+  float: right;
+}
+.poll .percent {
+  text-align: left;
+}
+.poll .vote-form .choices {
+  text-align: right;
+}
diff --git a/htmltest/modules/poll/poll-vote.tpl.php b/htmltest/modules/poll/poll-vote.tpl.php
new file mode 100644
index 00000000..699a26d4
--- /dev/null
+++ b/htmltest/modules/poll/poll-vote.tpl.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to display voting form for a poll.
+ *
+ * - $choice: The radio buttons for the choices in the poll.
+ * - $title: The title of the poll.
+ * - $block: True if this is being displayed as a block.
+ * - $vote: The vote button
+ * - $rest: Anything else in the form that may have been added via
+ *   form_alter hooks.
+ *
+ * @see template_preprocess_poll_vote()
+ *
+ * @ingroup themeable
+ */
+?>
+<div class="poll">
+  <div class="vote-form">
+    <div class="choices">
+      <?php if ($block): ?>
+        <div class="title"><?php print $title; ?></div>
+      <?php endif; ?>
+      <?php print $choice; ?>
+    </div>
+    <?php print $vote; ?>
+  </div>
+  <?php // This is the 'rest' of the form, in case items have been added. ?>
+  <?php print $rest ?>
+</div>
diff --git a/htmltest/modules/poll/poll.css b/htmltest/modules/poll/poll.css
new file mode 100644
index 00000000..8b04e380
--- /dev/null
+++ b/htmltest/modules/poll/poll.css
@@ -0,0 +1,51 @@
+
+.poll {
+  overflow: hidden;
+}
+.poll .bar {
+  height: 1em;
+  margin: 1px 0;
+  background-color: #ddd;
+}
+.poll .bar .foreground {
+  background-color: #000;
+  height: 1em;
+  float: left; /* LTR */
+}
+.poll .links {
+  text-align: center;
+}
+.poll .percent {
+  text-align: right; /* LTR */
+}
+.poll .total {
+  text-align: center;
+}
+.poll .vote-form {
+  text-align: center;
+}
+.poll .vote-form .choices {
+  text-align: left; /* LTR */
+  margin: 0 auto;
+  display: table;
+}
+.poll .vote-form .choices .title {
+  font-weight: bold;
+}
+.node-form #edit-poll-more {
+  margin: 0;
+}
+.node-form #poll-choice-table .form-text {
+  display: inline;
+  width: auto;
+}
+.node-form #poll-choice-table td.choice-flag {
+  white-space: nowrap;
+  width: 4em;
+}
+td.poll-chtext {
+  width: 80%;
+}
+td.poll-chvotes .form-text {
+  width: 85%;
+}
diff --git a/htmltest/modules/poll/poll.info b/htmltest/modules/poll/poll.info
new file mode 100644
index 00000000..9144dc03
--- /dev/null
+++ b/htmltest/modules/poll/poll.info
@@ -0,0 +1,13 @@
+name = Poll
+description = Allows your site to capture votes on different topics in the form of multiple choice questions.
+package = Core
+version = VERSION
+core = 7.x
+files[] = poll.test
+stylesheets[all][] = poll.css
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/poll/poll.install b/htmltest/modules/poll/poll.install
new file mode 100644
index 00000000..8c58025b
--- /dev/null
+++ b/htmltest/modules/poll/poll.install
@@ -0,0 +1,215 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the poll module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function poll_schema() {
+  $schema['poll'] = array(
+    'description' => 'Stores poll-specific information for poll nodes.',
+    'fields' => array(
+      'nid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => "The poll's {node}.nid.",
+      ),
+      'runtime' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The number of seconds past {node}.created during which the poll is open.',
+      ),
+      'active' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Boolean indicating whether or not the poll is open.',
+      ),
+    ),
+    'primary key' => array('nid'),
+    'foreign keys' => array(
+      'poll_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+    ),
+  );
+
+  $schema['poll_choice'] = array(
+    'description' => 'Stores information about all choices for all {poll}s.',
+    'fields' => array(
+      'chid' => array(
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'Unique identifier for a poll choice.',
+      ),
+      'nid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {node}.nid this choice belongs to.',
+      ),
+      'chtext' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The text for this choice.',
+        'translatable' => TRUE,
+      ),
+      'chvotes' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The total number of votes this choice has received by all users.',
+      ),
+      'weight' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The sort order of this choice among all choices for the same node.',
+      ),
+    ),
+    'indexes' => array(
+      'nid' => array('nid'),
+    ),
+    'primary key' => array('chid'),
+    'foreign keys' => array(
+      'choice_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+    ),
+  );
+
+  $schema['poll_vote'] = array(
+    'description' => 'Stores per-{users} votes for each {poll}.',
+    'fields' => array(
+      'chid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => "The {users}'s vote for this poll.",
+      ),
+      'nid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'The {poll} node this vote is for.',
+      ),
+      'uid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {users}.uid this vote is from unless the voter was anonymous.',
+      ),
+      'hostname' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The IP address this vote is from unless the voter was logged in.',
+      ),
+      'timestamp' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The timestamp of the vote creation.',
+      ),
+    ),
+    'primary key' => array('nid', 'uid', 'hostname'),
+    'foreign keys' => array(
+      'poll_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+      'voter' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid'),
+      ),
+    ),
+    'indexes' => array(
+      'chid'     => array('chid'),
+      'hostname' => array('hostname'),
+      'uid' => array('uid'),
+    ),
+  );
+
+  return $schema;
+}
+
+/**
+ * Use the poll_choice primary key to record votes in poll_votes rather than
+ * the choice order. Rename chorder to weight.
+ *
+ * Rename {poll_choices} table to {poll_choice} and {poll_votes} to {poll_vote}.
+ */
+function poll_update_7001() {
+  // Add chid column and convert existing votes.
+  db_add_field('poll_votes', 'chid', array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0));
+  db_add_index('poll_votes', 'chid', array('chid'));
+  db_update('poll_votes')
+    ->expression('chid', Database::getConnection()->prefixTables('COALESCE((SELECT chid FROM {poll_choices} c WHERE {poll_votes}.chorder = c.chorder AND {poll_votes}.nid = c.nid), 0)'))
+    ->execute();
+  // Delete invalid votes.
+  db_delete('poll_votes')->condition('chid', 0)->execute();
+  // Remove old chorder column.
+  db_drop_field('poll_votes', 'chorder');
+
+  // Change the chorder column to weight in poll_choices.
+  db_change_field('poll_choices', 'chorder', 'weight', array('type' => 'int', 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'));
+
+  db_rename_table('poll_votes', 'poll_vote');
+  db_rename_table('poll_choices', 'poll_choice');
+}
+
+/**
+ * Add timestamp field to {poll_vote}.
+ */
+function poll_update_7002() {
+  $field = array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+  );
+  db_add_field('poll_vote', 'timestamp', $field);
+}
+
+/**
+ * Change the weight column to normal int.
+ */
+function poll_update_7003() {
+  db_change_field('poll_choice', 'weight', 'weight', array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'description' => 'The sort order of this choice among all choices for the same node.',
+  ));
+}
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Update the database to match the schema.
+ */
+function poll_update_7004() {
+  // Remove field default.
+  db_change_field('poll_vote', 'chid', 'chid', array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE));
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra".
+ */
diff --git a/htmltest/modules/poll/poll.module b/htmltest/modules/poll/poll.module
new file mode 100644
index 00000000..70eb65dc
--- /dev/null
+++ b/htmltest/modules/poll/poll.module
@@ -0,0 +1,1019 @@
+<?php
+
+/**
+ * @file
+ * Enables your site to capture votes on different topics in the form of multiple
+ * choice questions.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function poll_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#poll':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Poll module can be used to create simple surveys or questionnaires that display cumulative results. A poll is a good way to receive feedback from site users and community members. For more information, see the online handbook entry for the <a href="@poll">Poll module</a>.', array('@poll' => 'http://drupal.org/documentation/modules/poll/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Creating a poll') . '</dt>';
+      $output .= '<dd>' . t('Users can create a poll by clicking on Poll on the <a href="@add-content">Add new content</a> page, and entering the question being posed, the answer choices, and beginning vote counts for each choice. The status (closed or active) and duration (length of time the poll remains active for new votes) can also be specified.', array('@add-content' => url('node/add'))) . '</dd>';
+      $output .= '<dt>' . t('Viewing polls') . '</dt>';
+      $output .= '<dd>' . t('You can visit the <a href="@poll">Polls</a> page to view all current polls, or alternately enable the <em>Most recent poll</em> block on the <a href="@blocks">Blocks administration page</a>. To vote in or view the results of a specific poll, you can click on the poll itself.', array('@poll' => url('poll'), '@blocks' => url('admin/structure/block'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function poll_theme() {
+  $theme_hooks = array(
+    'poll_vote' => array(
+      'template' => 'poll-vote',
+      'render element' => 'form',
+    ),
+    'poll_choices' => array(
+      'render element' => 'form',
+    ),
+    'poll_results' => array(
+      'template' => 'poll-results',
+      'variables' => array('raw_title' => NULL, 'results' => NULL, 'votes' => NULL, 'raw_links' => NULL, 'block' => NULL, 'nid' => NULL, 'vote' => NULL),
+    ),
+    'poll_bar' => array(
+      'template' => 'poll-bar',
+      'variables' => array('title' => NULL, 'votes' => NULL, 'total_votes' => NULL, 'vote' => NULL, 'block' => NULL),
+    ),
+  );
+  // The theme system automatically discovers the theme's functions and
+  // templates that implement more targeted "suggestions" of generic theme
+  // hooks. But suggestions implemented by a module must be explicitly
+  // registered.
+  $theme_hooks += array(
+    'poll_results__block' => array(
+      'template' => 'poll-results--block',
+      'variables' => $theme_hooks['poll_results']['variables'],
+    ),
+    'poll_bar__block' => array(
+      'template' => 'poll-bar--block',
+      'variables' => $theme_hooks['poll_bar']['variables'],
+    ),
+  );
+  return $theme_hooks;
+}
+
+/**
+ * Implements hook_permission().
+ */
+function poll_permission() {
+  $perms = array(
+    'vote on polls' => array(
+      'title' => t('Vote on polls'),
+    ),
+    'cancel own vote' => array(
+      'title' => t('Cancel and change own votes'),
+    ),
+    'inspect all votes' => array(
+      'title' => t('View details for all votes'),
+    ),
+  );
+
+  return $perms;
+}
+
+/**
+ * Implements hook_menu().
+ */
+function poll_menu() {
+  $items['poll'] = array(
+    'title' => 'Polls',
+    'page callback' => 'poll_page',
+    'access arguments' => array('access content'),
+    'type' => MENU_SUGGESTED_ITEM,
+    'file' => 'poll.pages.inc',
+  );
+
+  $items['node/%node/votes'] = array(
+    'title' => 'Votes',
+    'page callback' => 'poll_votes',
+    'page arguments' => array(1),
+    'access callback' => '_poll_menu_access',
+    'access arguments' => array(1, 'inspect all votes', FALSE),
+    'weight' => 3,
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'poll.pages.inc',
+  );
+
+  $items['node/%node/results'] = array(
+    'title' => 'Results',
+    'page callback' => 'poll_results',
+    'page arguments' => array(1),
+    'access callback' => '_poll_menu_access',
+    'access arguments' => array(1, 'access content', TRUE),
+    'weight' => 3,
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'poll.pages.inc',
+  );
+
+  return $items;
+}
+
+/**
+ * Callback function to see if a node is acceptable for poll menu items.
+ */
+function _poll_menu_access($node, $perm, $inspect_allowvotes) {
+  return user_access($perm) && ($node->type == 'poll') && ($node->allowvotes || !$inspect_allowvotes);
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function poll_block_info() {
+  $blocks['recent']['info'] = t('Most recent poll');
+  $blocks['recent']['properties']['administrative'] = TRUE;
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_view().
+ *
+ * Generates a block containing the latest poll.
+ */
+function poll_block_view($delta = '') {
+  if (user_access('access content')) {
+    // Retrieve the latest poll.
+    $select = db_select('node', 'n');
+    $select->join('poll', 'p', 'p.nid = n.nid');
+    $select->fields('n', array('nid'))
+      ->condition('n.status', 1)
+      ->condition('p.active', 1)
+      ->orderBy('n.created', 'DESC')
+      ->range(0, 1)
+      ->addTag('node_access');
+
+    $record = $select->execute()->fetchObject();
+    if ($record) {
+      $poll = node_load($record->nid);
+      if ($poll->nid) {
+        $poll = poll_block_latest_poll_view($poll);
+        $block['subject'] = t('Poll');
+        $block['content'] = $poll->content;
+        return $block;
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_cron().
+ *
+ * Closes polls that have exceeded their allowed runtime.
+ */
+function poll_cron() {
+  $nids = db_query('SELECT p.nid FROM {poll} p INNER JOIN {node} n ON p.nid = n.nid WHERE (n.created + p.runtime) < :request_time AND p.active = :active AND p.runtime <> :runtime', array(':request_time' => REQUEST_TIME, ':active' => 1, ':runtime' => 0))->fetchCol();
+  if (!empty($nids)) {
+    db_update('poll')
+      ->fields(array('active' => 0))
+      ->condition('nid', $nids, 'IN')
+      ->execute();
+  }
+}
+
+/**
+ * Implements hook_node_info().
+ */
+function poll_node_info() {
+  return array(
+    'poll' => array(
+      'name' => t('Poll'),
+      'base' => 'poll',
+      'description' => t('A <em>poll</em> is a question with a set of possible responses. A <em>poll</em>, once created, automatically provides a simple running count of the number of votes received for each response.'),
+      'title_label' => t('Question'),
+      'has_body' => FALSE,
+    )
+  );
+}
+
+/**
+ * Implements hook_field_extra_fields().
+ */
+function poll_field_extra_fields() {
+  $extra['node']['poll'] = array(
+    'form' => array(
+      'choice_wrapper' => array(
+        'label' => t('Poll choices'),
+        'description' => t('Poll choices'),
+        'weight' => -4,
+      ),
+      'settings' => array(
+        'label' => t('Poll settings'),
+        'description' => t('Poll module settings'),
+        'weight' => -3,
+      ),
+    ),
+    'display' => array(
+      'poll_view_voting' => array(
+        'label' => t('Poll vote'),
+        'description' => t('Poll vote'),
+        'weight' => 0,
+      ),
+      'poll_view_results' => array(
+        'label' => t('Poll results'),
+        'description' => t('Poll results'),
+        'weight' => 0,
+      ),
+    )
+  );
+
+  return $extra;
+}
+
+/**
+ * Implements hook_form().
+ */
+function poll_form($node, &$form_state) {
+  global $user;
+
+  $admin = user_access('bypass node access') || user_access('edit any poll content') || (user_access('edit own poll content') && $user->uid == $node->uid);
+
+  $type = node_type_get_type($node);
+
+  // The submit handlers to add more poll choices require that this form is
+  // cached, regardless of whether Ajax is used.
+  $form_state['cache'] = TRUE;
+
+  $form['title'] = array(
+    '#type' => 'textfield',
+    '#title' => check_plain($type->title_label),
+    '#required' => TRUE,
+    '#default_value' => $node->title,
+    '#weight' => -5,
+  );
+
+  if (isset($form_state['choice_count'])) {
+    $choice_count = $form_state['choice_count'];
+  }
+  else {
+    $choice_count = max(2, empty($node->choice) ? 2 : count($node->choice));
+  }
+
+  // Add a wrapper for the choices and more button.
+  $form['choice_wrapper'] = array(
+    '#tree' => FALSE,
+    '#weight' => -4,
+    '#prefix' => '<div class="clearfix" id="poll-choice-wrapper">',
+    '#suffix' => '</div>',
+  );
+
+  // Container for just the poll choices.
+  $form['choice_wrapper']['choice'] = array(
+    '#prefix' => '<div id="poll-choices">',
+    '#suffix' => '</div>',
+    '#theme' => 'poll_choices',
+  );
+
+  // Add the current choices to the form.
+  $delta = 0;
+  $weight = 0;
+  if (isset($node->choice)) {
+    $delta = count($node->choice);
+    foreach ($node->choice as $chid => $choice) {
+      $key = 'chid:' . $chid;
+      $form['choice_wrapper']['choice'][$key] = _poll_choice_form($key, $choice['chid'], $choice['chtext'], $choice['chvotes'], $choice['weight'], $choice_count);
+      $weight = max($choice['weight'], $weight);
+    }
+  }
+
+  // Add initial or additional choices.
+  $existing_delta = $delta;
+  for ($delta; $delta < $choice_count; $delta++) {
+    $key = 'new:' . ($delta - $existing_delta);
+    // Increase the weight of each new choice.
+    $weight++;
+    $form['choice_wrapper']['choice'][$key] = _poll_choice_form($key, NULL, '', 0, $weight, $choice_count);
+  }
+
+  // We name our button 'poll_more' to avoid conflicts with other modules using
+  // Ajax-enabled buttons with the id 'more'.
+  $form['choice_wrapper']['poll_more'] = array(
+    '#type' => 'submit',
+    '#value' => t('More choices'),
+    '#attributes' => array(
+      'title' => t("If the amount of boxes above isn't enough, click here to add more choices."),
+    ),
+    '#weight' => 1,
+    '#limit_validation_errors' => array(array('choice')),
+    '#submit' => array('poll_more_choices_submit'),
+    '#ajax' => array(
+      'callback' => 'poll_choice_js',
+      'wrapper' => 'poll-choices',
+      'effect' => 'fade',
+    ),
+  );
+
+  // Poll attributes
+  $duration = array(
+    // 1-6 days.
+    86400, 2 * 86400, 3 * 86400, 4 * 86400, 5 * 86400, 6 * 86400,
+    // 1-3 weeks (7 days).
+    604800, 2 * 604800, 3 * 604800,
+    // 1-3,6,9 months (30 days).
+    2592000, 2 * 2592000, 3 * 2592000, 6 * 2592000, 9 * 2592000,
+    // 1 year (365 days).
+    31536000,
+  );
+  $duration = array(0 => t('Unlimited')) + drupal_map_assoc($duration, 'format_interval');
+  $active = array(0 => t('Closed'), 1 => t('Active'));
+
+  $form['settings'] = array(
+    '#type' => 'fieldset',
+    '#collapsible' => TRUE,
+    '#title' => t('Poll settings'),
+    '#weight' => -3,
+    '#access' => $admin,
+  );
+
+  $form['settings']['active'] = array(
+    '#type' => 'radios',
+    '#title' => t('Poll status'),
+    '#default_value' => isset($node->active) ? $node->active : 1,
+    '#options' => $active,
+    '#description' => t('When a poll is closed, visitors can no longer vote for it.'),
+    '#access' => $admin,
+  );
+  $form['settings']['runtime'] = array(
+    '#type' => 'select',
+    '#title' => t('Poll duration'),
+    '#default_value' => isset($node->runtime) ? $node->runtime : 0,
+    '#options' => $duration,
+    '#description' => t('After this period, the poll will be closed automatically.'),
+  );
+
+  return $form;
+}
+
+/**
+ * Submit handler to add more choices to a poll form.
+ *
+ * This handler is run regardless of whether JS is enabled or not. It makes
+ * changes to the form state. If the button was clicked with JS disabled, then
+ * the page is reloaded with the complete rebuilt form. If the button was
+ * clicked with JS enabled, then ajax_form_callback() calls poll_choice_js() to
+ * return just the changed part of the form.
+ */
+function poll_more_choices_submit($form, &$form_state) {
+  // If this is a Ajax POST, add 1, otherwise add 5 more choices to the form.
+  if ($form_state['values']['poll_more']) {
+    $n = $_GET['q'] == 'system/ajax' ? 1 : 5;
+    $form_state['choice_count'] = count($form_state['values']['choice']) + $n;
+  }
+  // Renumber the choices. This invalidates the corresponding key/value
+  // associations in $form_state['input'], so clear that out. This requires
+  // poll_form() to rebuild the choices with the values in
+  // $form_state['node']->choice, which it does.
+  $form_state['node']->choice = array_values($form_state['values']['choice']);
+  unset($form_state['input']['choice']);
+  $form_state['rebuild'] = TRUE;
+}
+
+function _poll_choice_form($key, $chid = NULL, $value = '', $votes = 0, $weight = 0, $size = 10) {
+  $form = array(
+    '#tree' => TRUE,
+    '#weight' => $weight,
+  );
+
+  // We'll manually set the #parents property of these fields so that
+  // their values appear in the $form_state['values']['choice'] array.
+  $form['chid'] = array(
+    '#type' => 'value',
+    '#value' => $chid,
+    '#parents' => array('choice', $key, 'chid'),
+  );
+
+  $form['chtext'] = array(
+    '#type' => 'textfield',
+    '#title' => $value !== '' ? t('Choice label') : t('New choice label'),
+    '#title_display' => 'invisible',
+    '#default_value' => $value,
+    '#parents' => array('choice', $key, 'chtext'),
+  );
+
+  $form['chvotes'] = array(
+    '#type' => 'textfield',
+    '#title' => $value !== '' ? t('Vote count for choice @label', array('@label' => $value)) : t('Vote count for new choice'),
+    '#title_display' => 'invisible',
+    '#default_value' => $votes,
+    '#size' => 5,
+    '#maxlength' => 7,
+    '#parents' => array('choice', $key, 'chvotes'),
+    '#access' => user_access('administer nodes'),
+    '#element_validate' => array('element_validate_integer'),
+  );
+
+  $form['weight'] = array(
+    '#type' => 'weight',
+    '#title' => $value !== '' ? t('Weight for choice @label', array('@label' => $value)) : t('Weight for new choice'),
+    '#title_display' => 'invisible',
+    '#default_value' => $weight,
+    '#delta' => $size,
+    '#parents' => array('choice', $key, 'weight'),
+  );
+
+  return $form;
+}
+
+/**
+ * Ajax callback in response to new choices being added to the form.
+ *
+ * This returns the new page content to replace the page content made obsolete
+ * by the form submission.
+ *
+ * @see poll_more_choices_submit()
+ */
+function poll_choice_js($form, $form_state) {
+  return $form['choice_wrapper']['choice'];
+}
+
+/**
+ * Form submit handler for node_form().
+ *
+ * Upon preview and final submission, we need to renumber poll choices and
+ * create a teaser output.
+ */
+function poll_node_form_submit(&$form, &$form_state) {
+  // Renumber choices.
+  $form_state['values']['choice'] = array_values($form_state['values']['choice']);
+  $form_state['values']['teaser'] = poll_teaser((object) $form_state['values']);
+}
+
+/**
+ * Implements hook_validate().
+ */
+function poll_validate($node, $form) {
+  if (isset($node->title)) {
+    // Check for at least two options and validate amount of votes.
+    $realchoices = 0;
+    foreach ($node->choice as $i => $choice) {
+      if ($choice['chtext'] != '') {
+        $realchoices++;
+      }
+      if (isset($choice['chvotes']) && $choice['chvotes'] < 0) {
+        form_set_error("choice][$i][chvotes", t('Negative values are not allowed.'));
+      }
+    }
+
+    if ($realchoices < 2) {
+      form_set_error("choice][$realchoices][chtext", t('You must fill in at least two choices.'));
+    }
+  }
+}
+
+/**
+ * Implements hook_field_attach_prepare_translation_alter().
+ */
+function poll_field_attach_prepare_translation_alter(&$entity, $context) {
+  if ($context['entity_type'] == 'node' && $entity->type == 'poll') {
+    $entity->choice = $context['source_entity']->choice;
+    foreach ($entity->choice as $i => $options) {
+      $entity->choice[$i]['chvotes'] = 0;
+    }
+  }
+}
+
+/**
+ * Implements hook_load().
+ */
+function poll_load($nodes) {
+  global $user;
+  foreach ($nodes as $node) {
+    $poll = db_query("SELECT runtime, active FROM {poll} WHERE nid = :nid", array(':nid' => $node->nid))->fetchObject();
+
+    if (empty($poll)) {
+      $poll = new stdClass();
+    }
+
+    // Load the appropriate choices into the $poll object.
+    $poll->choice = db_select('poll_choice', 'c')
+      ->addTag('translatable')
+      ->fields('c', array('chid', 'chtext', 'chvotes', 'weight'))
+      ->condition('c.nid', $node->nid)
+      ->orderBy('weight')
+      ->execute()->fetchAllAssoc('chid', PDO::FETCH_ASSOC);
+
+    // Determine whether or not this user is allowed to vote.
+    $poll->allowvotes = FALSE;
+    if (user_access('vote on polls') && $poll->active) {
+      if ($user->uid) {
+        // If authenticated, find existing vote based on uid.
+        $poll->vote = db_query('SELECT chid FROM {poll_vote} WHERE nid = :nid AND uid = :uid', array(':nid' => $node->nid, ':uid' => $user->uid))->fetchField();
+        if (empty($poll->vote)) {
+          $poll->vote = -1;
+          $poll->allowvotes = TRUE;
+        }
+      }
+      elseif (!empty($_SESSION['poll_vote'][$node->nid])) {
+        // Otherwise the user is anonymous. Look for an existing vote in the
+        // user's session.
+        $poll->vote = $_SESSION['poll_vote'][$node->nid];
+      }
+      else {
+        // Finally, query the database for an existing vote based on anonymous
+        // user's hostname.
+        $poll->allowvotes = !db_query("SELECT 1 FROM {poll_vote} WHERE nid = :nid AND hostname = :hostname AND uid = 0", array(':nid' => $node->nid, ':hostname' => ip_address()))->fetchField();
+      }
+    }
+    foreach ($poll as $key => $value) {
+      $nodes[$node->nid]->$key = $value;
+    }
+  }
+}
+
+/**
+ * Implements hook_insert().
+ */
+function poll_insert($node) {
+  if (!user_access('administer nodes')) {
+    // Make sure all votes are 0 initially
+    foreach ($node->choice as $i => $choice) {
+      $node->choice[$i]['chvotes'] = 0;
+    }
+    $node->active = 1;
+  }
+
+  db_insert('poll')
+    ->fields(array(
+      'nid' => $node->nid,
+      'runtime' => $node->runtime,
+      'active' => $node->active,
+    ))
+    ->execute();
+
+  foreach ($node->choice as $choice) {
+    if ($choice['chtext'] != '') {
+      db_insert('poll_choice')
+        ->fields(array(
+          'nid' => $node->nid,
+          'chtext' => $choice['chtext'],
+          'chvotes' => $choice['chvotes'],
+          'weight' => $choice['weight'],
+        ))
+        ->execute();
+    }
+  }
+}
+
+/**
+ * Implements hook_update().
+ */
+function poll_update($node) {
+  // Update poll settings.
+  db_update('poll')
+    ->fields(array(
+      'runtime' => $node->runtime,
+      'active' => $node->active,
+    ))
+    ->condition('nid', $node->nid)
+    ->execute();
+
+  // Poll choices with empty titles signifies removal. We remove all votes to
+  // the removed options, so people who voted on them can vote again.
+  foreach ($node->choice as $key => $choice) {
+    if (!empty($choice['chtext'])) {
+      db_merge('poll_choice')
+        ->key(array('chid' => $choice['chid']))
+        ->fields(array(
+          'chtext' => $choice['chtext'],
+          'chvotes' => (int) $choice['chvotes'],
+          'weight' => $choice['weight'],
+        ))
+        ->insertFields(array(
+          'nid' => $node->nid,
+          'chtext' => $choice['chtext'],
+          'chvotes' => (int) $choice['chvotes'],
+          'weight' => $choice['weight'],
+        ))
+        ->execute();
+    }
+    else {
+      db_delete('poll_vote')
+        ->condition('nid', $node->nid)
+        ->condition('chid', $key)
+        ->execute();
+      db_delete('poll_choice')
+        ->condition('nid', $node->nid)
+        ->condition('chid', $choice['chid'])
+        ->execute();
+    }
+  }
+}
+
+/**
+ * Implements hook_delete().
+ */
+function poll_delete($node) {
+  db_delete('poll')
+    ->condition('nid', $node->nid)
+    ->execute();
+  db_delete('poll_choice')
+    ->condition('nid', $node->nid)
+    ->execute();
+  db_delete('poll_vote')
+    ->condition('nid', $node->nid)
+    ->execute();
+}
+
+/**
+ * Return content for 'latest poll' block.
+ *
+ * @param $node
+ *   The node object to load.
+ */
+function poll_block_latest_poll_view($node) {
+  global $user;
+  $output = '';
+
+  // This is necessary for shared objects because PHP doesn't copy objects, but
+  // passes them by reference.  So when the objects are cached it can result in
+  // the wrong output being displayed on subsequent calls.  The cloning and
+  // unsetting of $node->content prevents the block output from being the same
+  // as the node output.
+  $node = clone $node;
+  unset($node->content);
+
+  // No 'read more' link.
+  $node->readmore = FALSE;
+  $node->teaser = '';
+
+  $links = array();
+  $links[] = array('title' => t('Older polls'), 'href' => 'poll', 'attributes' => array('title' => t('View the list of polls on this site.')));
+  if ($node->allowvotes) {
+    $links[] = array('title' => t('Results'), 'href' => 'node/' . $node->nid . '/results', 'attributes' => array('title' => t('View the current poll results.')));
+  }
+
+  $node->links = $links;
+
+  if (!empty($node->allowvotes)) {
+    $node->content['poll_view_voting'] = drupal_get_form('poll_view_voting', $node, TRUE);
+    $node->content['links'] = array(
+      '#theme' => 'links',
+      '#links' => $node->links,
+      '#weight' => 5,
+    );
+  }
+  else {
+    $node->content['poll_view_results'] = array('#markup' => poll_view_results($node, TRUE, TRUE));
+  }
+
+  return $node;
+}
+
+
+/**
+ * Implements hook_view().
+ */
+function poll_view($node, $view_mode) {
+  global $user;
+  $output = '';
+
+  if (!empty($node->allowvotes) && empty($node->show_results)) {
+    $node->content['poll_view_voting'] = drupal_get_form('poll_view_voting', $node);
+  }
+  else {
+    $node->content['poll_view_results'] = array('#markup' => poll_view_results($node, $view_mode));
+  }
+  return $node;
+}
+
+/**
+ * Creates a simple teaser that lists all the choices.
+ *
+ * This is primarily used for RSS.
+ */
+function poll_teaser($node) {
+  $teaser = NULL;
+  if (is_array($node->choice)) {
+    foreach ($node->choice as $k => $choice) {
+      if ($choice['chtext'] != '') {
+        $teaser .= '* ' . check_plain($choice['chtext']) . "\n";
+      }
+    }
+  }
+  return $teaser;
+}
+
+/**
+ * Generates the voting form for a poll.
+ *
+ * @ingroup forms
+ * @see poll_vote()
+ * @see phptemplate_preprocess_poll_vote()
+ */
+function poll_view_voting($form, &$form_state, $node, $block = FALSE) {
+  if ($node->choice) {
+    $list = array();
+    foreach ($node->choice as $i => $choice) {
+      $list[$i] = check_plain($choice['chtext']);
+    }
+    $form['choice'] = array(
+      '#type' => 'radios',
+      '#title' => t('Choices'),
+      '#title_display' => 'invisible',
+      '#default_value' => -1,
+      '#options' => $list,
+    );
+  }
+
+  $form['vote'] = array(
+    '#type' => 'submit',
+    '#value' => t('Vote'),
+    '#submit' => array('poll_vote'),
+  );
+
+  // Store the node so we can get to it in submit functions.
+  $form['#node'] = $node;
+  $form['#block'] = $block;
+
+  // Set form caching because we could have multiple of these forms on
+  // the same page, and we want to ensure the right one gets picked.
+  $form_state['cache'] = TRUE;
+
+  // Provide a more cleanly named voting form theme.
+  $form['#theme'] = 'poll_vote';
+  return $form;
+}
+
+/**
+ * Validation function for processing votes
+ */
+function poll_view_voting_validate($form, &$form_state) {
+  if ($form_state['values']['choice'] == -1) {
+    form_set_error( 'choice', t('Your vote could not be recorded because you did not select any of the choices.'));
+  }
+}
+
+/**
+ * Submit handler for processing a vote.
+ */
+function poll_vote($form, &$form_state) {
+  $node = $form['#node'];
+  $choice = $form_state['values']['choice'];
+
+  global $user;
+  db_insert('poll_vote')
+    ->fields(array(
+      'nid' => $node->nid,
+      'chid' => $choice,
+      'uid' => $user->uid,
+      'hostname' => ip_address(),
+      'timestamp' => REQUEST_TIME,
+    ))
+    ->execute();
+
+  // Add one to the votes.
+  db_update('poll_choice')
+    ->expression('chvotes', 'chvotes + 1')
+    ->condition('chid', $choice)
+    ->execute();
+
+  cache_clear_all();
+
+  if (!$user->uid) {
+    // The vote is recorded so the user gets the result view instead of the
+    // voting form when viewing the poll. Saving a value in $_SESSION has the
+    // convenient side effect of preventing the user from hitting the page
+    // cache. When anonymous voting is allowed, the page cache should only
+    // contain the voting form, not the results.
+    $_SESSION['poll_vote'][$node->nid] = $choice;
+  }
+
+  drupal_set_message(t('Your vote was recorded.'));
+
+  // Return the user to whatever page they voted from.
+}
+
+/**
+ * Themes the voting form for a poll.
+ *
+ * Inputs: $form
+ */
+function template_preprocess_poll_vote(&$variables) {
+  $form = $variables['form'];
+  $variables['choice'] = drupal_render($form['choice']);
+  $variables['title'] = check_plain($form['#node']->title);
+  $variables['vote'] = drupal_render($form['vote']);
+  $variables['rest'] = drupal_render_children($form);
+  $variables['block'] = $form['#block'];
+  if ($variables['block']) {
+    $variables['theme_hook_suggestions'][] = 'poll_vote__block';
+  }
+}
+
+/**
+ * Generates a graphical representation of the results of a poll.
+ */
+function poll_view_results($node, $view_mode, $block = FALSE) {
+  // Make sure that choices are ordered by their weight.
+  uasort($node->choice, 'drupal_sort_weight');
+
+  // Count the votes and find the maximum.
+  $total_votes = 0;
+  $max_votes = 0;
+  foreach ($node->choice as $choice) {
+    if (isset($choice['chvotes'])) {
+      $total_votes += $choice['chvotes'];
+      $max_votes = max($max_votes, $choice['chvotes']);
+    }
+  }
+
+  $poll_results = '';
+  foreach ($node->choice as $i => $choice) {
+    if (!empty($choice['chtext'])) {
+      $chvotes = isset($choice['chvotes']) ? $choice['chvotes'] : NULL;
+      $poll_results .= theme('poll_bar', array('title' => $choice['chtext'], 'votes' => $chvotes, 'total_votes' => $total_votes, 'vote' => isset($node->vote) && $node->vote == $i, 'block' => $block));
+    }
+  }
+
+  return theme('poll_results', array('raw_title' => $node->title, 'results' => $poll_results, 'votes' => $total_votes, 'raw_links' => isset($node->links) ? $node->links : array(), 'block' => $block, 'nid' => $node->nid, 'vote' => isset($node->vote) ? $node->vote : NULL));
+}
+
+
+/**
+ * Returns HTML for an admin poll form for choices.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_poll_choices($variables) {
+  $form = $variables['form'];
+
+  drupal_add_tabledrag('poll-choice-table', 'order', 'sibling', 'poll-weight');
+
+  $is_admin= user_access('administer nodes');
+  $delta = 0;
+  $rows = array();
+  $headers = array('', t('Choice'));
+  if ($is_admin) {
+    $headers[] = t('Vote count');
+  }
+  $headers[] = t('Weight');
+
+  foreach (element_children($form) as $key) {
+    $delta++;
+    // Set special classes for drag and drop updating.
+    $form[$key]['weight']['#attributes']['class'] = array('poll-weight');
+
+    // Build the table row.
+    $row = array(
+      'data' => array(
+        array('class' => array('choice-flag')),
+        drupal_render($form[$key]['chtext']),
+      ),
+      'class' => array('draggable'),
+    );
+    if ($is_admin) {
+      $row['data'][] = drupal_render($form[$key]['chvotes']);
+    }
+    $row['data'][] = drupal_render($form[$key]['weight']);
+
+    // Add any additional classes set on the row.
+    if (!empty($form[$key]['#attributes']['class'])) {
+      $row['class'] = array_merge($row['class'], $form[$key]['#attributes']['class']);
+    }
+
+    $rows[] = $row;
+  }
+
+  $output = theme('table', array('header' => $headers, 'rows' => $rows, 'attributes' => array('id' => 'poll-choice-table')));
+  $output .= drupal_render_children($form);
+  return $output;
+}
+
+/**
+ * Preprocess the poll_results theme hook.
+ *
+ * Inputs: $raw_title, $results, $votes, $raw_links, $block, $nid, $vote. The
+ * $raw_* inputs to this are naturally unsafe; often safe versions are
+ * made to simply overwrite the raw version, but in this case it seems likely
+ * that the title and the links may be overridden by the theme layer, so they
+ * are left in with a different name for that purpose.
+ *
+ * @see poll-results.tpl.php
+ * @see poll-results--block.tpl.php
+ */
+function template_preprocess_poll_results(&$variables) {
+  $variables['links'] = theme('links__poll_results', array('links' => $variables['raw_links']));
+  if (isset($variables['vote']) && $variables['vote'] > -1 && user_access('cancel own vote')) {
+    $elements = drupal_get_form('poll_cancel_form', $variables['nid']);
+    $variables['cancel_form'] = drupal_render($elements);
+  }
+  $variables['title'] = check_plain($variables['raw_title']);
+
+  if ($variables['block']) {
+    $variables['theme_hook_suggestions'][] = 'poll_results__block';
+  }
+}
+
+/**
+ * Preprocess the poll_bar theme hook.
+ *
+ * Inputs: $title, $votes, $total_votes, $voted, $block
+ *
+ * @see poll-bar.tpl.php
+ * @see poll-bar--block.tpl.php
+ * @see theme_poll_bar()
+ */
+function template_preprocess_poll_bar(&$variables) {
+  if ($variables['block']) {
+    $variables['theme_hook_suggestions'][] = 'poll_bar__block';
+  }
+  $variables['title'] = check_plain($variables['title']);
+  $variables['percentage'] = round($variables['votes'] * 100 / max($variables['total_votes'], 1));
+}
+
+/**
+ * Builds the cancel form for a poll.
+ *
+ * @ingroup forms
+ * @see poll_cancel()
+ */
+function poll_cancel_form($form, &$form_state, $nid) {
+  $form_state['cache'] = TRUE;
+
+  // Store the nid so we can get to it in submit functions.
+  $form['#nid'] = $nid;
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Cancel your vote'),
+    '#submit' => array('poll_cancel')
+  );
+
+  return $form;
+}
+
+/**
+ * Submit callback for poll_cancel_form().
+ */
+function poll_cancel($form, &$form_state) {
+  global $user;
+  $node = node_load($form['#nid']);
+
+  db_delete('poll_vote')
+    ->condition('nid', $node->nid)
+    ->condition($user->uid ? 'uid' : 'hostname', $user->uid ? $user->uid : ip_address())
+    ->execute();
+
+  // Subtract from the votes.
+  db_update('poll_choice')
+    ->expression('chvotes', 'chvotes - 1')
+    ->condition('chid', $node->vote)
+    ->execute();
+
+  unset($_SESSION['poll_vote'][$node->nid]);
+
+  drupal_set_message(t('Your vote was cancelled.'));
+}
+
+/**
+ * Implements hook_user_cancel().
+ */
+function poll_user_cancel($edit, $account, $method) {
+  switch ($method) {
+    case 'user_cancel_reassign':
+      db_update('poll_vote')
+        ->fields(array('uid' => 0))
+        ->condition('uid', $account->uid)
+        ->execute();
+      break;
+  }
+}
+
+/**
+ * Implements hook_user_delete().
+ */
+function poll_user_delete($account) {
+  db_delete('poll_vote')
+    ->condition('uid', $account->uid)
+    ->execute();
+}
+
+/**
+ * Implements hook_rdf_mapping().
+ */
+function poll_rdf_mapping() {
+  return array(
+    array(
+      'type' => 'node',
+      'bundle' => 'poll',
+      'mapping' => array(
+        'rdftype' => array('sioc:Post', 'sioct:Poll'),
+      ),
+    ),
+  );
+}
diff --git a/htmltest/modules/poll/poll.pages.inc b/htmltest/modules/poll/poll.pages.inc
new file mode 100644
index 00000000..15f3ba79
--- /dev/null
+++ b/htmltest/modules/poll/poll.pages.inc
@@ -0,0 +1,97 @@
+<?php
+
+/**
+ * @file
+ * User page callbacks for the poll module.
+ */
+
+/**
+ * Menu callback to provide a simple list of all polls available.
+ */
+function poll_page() {
+  $polls_per_page = 15;
+
+  $count_select = db_select('node', 'n');
+  $count_select->addExpression('COUNT(*)', 'expression');
+  $count_select->join('poll', 'p', 'p.nid = n.nid');
+  $count_select->condition('n.status', 1);
+
+  // List all polls.
+  $select = db_select('node', 'n');
+  $select->join('poll', 'p', 'p.nid = n.nid');
+  $select->join('poll_choice', 'c', 'c.nid = n.nid');
+  $select->addExpression('SUM(c.chvotes)', 'votes');
+  $select = $select->fields('n', array('nid', 'title', 'created'))
+    ->fields('p', array('active'))
+    ->condition('n.status', 1)
+    ->orderBy('n.created', 'DESC')
+    ->groupBy('n.nid')
+    ->groupBy('n.title')
+    ->groupBy('p.active')
+    ->groupBy('n.created')
+    ->extend('PagerDefault')
+    ->limit($polls_per_page)
+    ->addTag('node_access');
+  $select->setCountQuery($count_select);
+  $queried_nodes = $select->execute()
+    ->fetchAllAssoc('nid');
+
+  $output = '<ul>';
+  foreach ($queried_nodes as $node) {
+    $output .= '<li>' . l($node->title, "node/$node->nid") . ' - ' . format_plural($node->votes, '1 vote', '@count votes') . ' - ' . ($node->active ? t('open') : t('closed')) . '</li>';
+  }
+  $output .= '</ul>';
+  $output .= theme('pager');
+  return $output;
+}
+
+/**
+ * Callback for the 'votes' tab for polls you can see other votes on
+ */
+function poll_votes($node) {
+  $votes_per_page = 20;
+  drupal_set_title($node->title);
+
+  $header[] = array('data' => t('Visitor'), 'field' => 'u.name');
+  $header[] = array('data' => t('Vote'), 'field' => 'pc.chtext');
+  $header[] = array('data' => t('Timestamp'), 'field' => 'pv.timestamp', 'sort' => 'desc');
+
+  $select = db_select('poll_vote', 'pv')->extend('PagerDefault')->extend('TableSort');
+  $select->join('poll_choice', 'pc', 'pv.chid = pc.chid');
+  $select->join('users', 'u', 'pv.uid = u.uid');
+  $queried_votes = $select
+    ->addTag('translatable')
+    ->fields('pv', array('chid', 'uid', 'hostname', 'timestamp', 'nid'))
+    ->fields('pc', array('chtext'))
+    ->fields('u', array('name'))
+    ->condition('pv.nid', $node->nid)
+    ->limit($votes_per_page)
+    ->orderByHeader($header)
+    ->execute();
+
+  $rows = array();
+  foreach ($queried_votes as $vote) {
+    $rows[] = array(
+      $vote->name ? theme('username', array('account' => $vote)) : check_plain($vote->hostname),
+      check_plain($vote->chtext),
+      format_date($vote->timestamp),
+    );
+  }
+  $build['poll_votes_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#prefix' => t('This table lists all the recorded votes for this poll. If anonymous users are allowed to vote, they will be identified by the IP address of the computer they used when they voted.'),
+  );
+  $build['poll_votes_pager'] = array('#theme' => 'pager');
+  return $build;
+}
+
+/**
+ * Callback for the 'results' tab for polls you can vote on
+ */
+function poll_results($node) {
+  drupal_set_title($node->title);
+  $node->show_results = TRUE;
+  return node_show($node);
+}
diff --git a/htmltest/modules/poll/poll.test b/htmltest/modules/poll/poll.test
new file mode 100644
index 00000000..35eea223
--- /dev/null
+++ b/htmltest/modules/poll/poll.test
@@ -0,0 +1,872 @@
+<?php
+
+/**
+ * @file
+ * Tests for poll.module.
+ */
+
+class PollTestCase extends DrupalWebTestCase {
+
+  /**
+   * Creates a poll.
+   *
+   * @param string $title
+   *   The title of the poll.
+   * @param array $choices
+   *   A list of choice labels.
+   * @param boolean $preview
+   *   (optional) Whether to test if the preview is working or not. Defaults to
+   *   TRUE.
+   *
+   * @return
+   *   The node id of the created poll, or FALSE on error.
+   */
+  function pollCreate($title, $choices, $preview = TRUE) {
+    $this->assertTrue(TRUE, 'Create a poll');
+
+    $admin_user = $this->drupalCreateUser(array('create poll content', 'administer nodes'));
+    $web_user = $this->drupalCreateUser(array('create poll content', 'access content', 'edit own poll content'));
+    $this->drupalLogin($admin_user);
+
+    // Get the form first to initialize the state of the internal browser.
+    $this->drupalGet('node/add/poll');
+
+    // Prepare a form with two choices.
+    list($edit, $index) = $this->_pollGenerateEdit($title, $choices);
+
+    // Verify that the vote count element only allows non-negative integers.
+    $edit['choice[new:1][chvotes]'] = -1;
+    $edit['choice[new:0][chvotes]'] = $this->randomString(7);
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertText(t('Negative values are not allowed.'));
+    $this->assertText(t('Vote count for new choice must be an integer.'));
+
+    // Repeat steps for initializing the state of the internal browser.
+    $this->drupalLogin($web_user);
+    $this->drupalGet('node/add/poll');
+    list($edit, $index) = $this->_pollGenerateEdit($title, $choices);
+
+    // Re-submit the form until all choices are filled in.
+    if (count($choices) > 2) {
+      while ($index < count($choices)) {
+        $this->drupalPost(NULL, $edit, t('More choices'));
+        $this->assertPollChoiceOrder($choices, $index);
+        list($edit, $index) = $this->_pollGenerateEdit($title, $choices, $index);
+      }
+    }
+
+    if ($preview) {
+      $this->drupalPost(NULL, $edit, t('Preview'));
+      $this->assertPollChoiceOrder($choices, $index, TRUE);
+      list($edit, $index) = $this->_pollGenerateEdit($title, $choices, $index);
+    }
+
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $node = $this->drupalGetNodeByTitle($title);
+    $this->assertText(t('@type @title has been created.', array('@type' => node_type_get_name('poll'), '@title' => $title)), 'Poll has been created.');
+    $this->assertTrue($node->nid, 'Poll has been found in the database.');
+
+    return isset($node->nid) ? $node->nid : FALSE;
+  }
+
+  /**
+   * Generates POST values for the poll node form, specifically poll choices.
+   *
+   * @param $title
+   *   The title for the poll node.
+   * @param $choices
+   *   An array containing poll choices, as generated by
+   *   PollTestCase::_generateChoices().
+   * @param $index
+   *   (optional) The amount/number of already submitted poll choices. Defaults
+   *   to 0.
+   *
+   * @return
+   *   An indexed array containing:
+   *   - The generated POST values, suitable for
+   *     DrupalWebTestCase::drupalPost().
+   *   - The number of poll choices contained in 'edit', for potential re-usage
+   *     in subsequent invocations of this function.
+   */
+  function _pollGenerateEdit($title, array $choices, $index = 0) {
+    $max_new_choices = ($index == 0 ? 2 : 5);
+    $already_submitted_choices = array_slice($choices, 0, $index);
+    $new_choices = array_values(array_slice($choices, $index, $max_new_choices));
+
+    $edit = array(
+      'title' => $title,
+    );
+    foreach ($already_submitted_choices as $k => $text) {
+      $edit['choice[chid:' . $k . '][chtext]'] = $text;
+    }
+    foreach ($new_choices as $k => $text) {
+      $edit['choice[new:' . $k . '][chtext]'] = $text;
+    }
+    return array($edit, count($already_submitted_choices) + count($new_choices));
+  }
+
+  function _generateChoices($count = 7) {
+    $choices = array();
+    for ($i = 1; $i <= $count; $i++) {
+      $choices[] = $this->randomName();
+    }
+    return $choices;
+  }
+
+  /**
+   * Assert correct poll choice order in the node form after submission.
+   *
+   * Verifies both the order in the DOM and in the 'weight' form elements.
+   *
+   * @param $choices
+   *   An array containing poll choices, as generated by
+   *   PollTestCase::_generateChoices().
+   * @param $index
+   *   (optional) The amount/number of already submitted poll choices. Defaults
+   *   to 0.
+   * @param $preview
+   *   (optional) Whether to also check the poll preview.
+   *
+   * @see PollTestCase::_pollGenerateEdit()
+   */
+  function assertPollChoiceOrder(array $choices, $index = 0, $preview = FALSE) {
+    $expected = array();
+    $weight = 0;
+    foreach ($choices as $id => $label) {
+      if ($id < $index) {
+        // The expected weight of each choice is higher than the previous one.
+        $weight++;
+        // Directly assert the weight form element value for this choice.
+        $this->assertFieldByName('choice[chid:' . $id . '][weight]', $weight, format_string('Found choice @id with weight @weight.', array(
+          '@id' => $id,
+          '@weight' => $weight,
+        )));
+        // Append to our (to be reversed) stack of labels.
+        $expected[$weight] = $label;
+      }
+    }
+    ksort($expected);
+
+    // Verify DOM order of poll choices (i.e., #weight of form elements).
+    $elements = $this->xpath('//input[starts-with(@name, :prefix) and contains(@name, :suffix)]', array(
+      ':prefix' => 'choice[chid:',
+      ':suffix' => '][chtext]',
+    ));
+    $expected_order = $expected;
+    foreach ($elements as $element) {
+      $next_label = array_shift($expected_order);
+      $this->assertEqual((string) $element['value'], $next_label);
+    }
+
+    // If requested, also verify DOM order in preview.
+    if ($preview) {
+      $elements = $this->xpath('//div[contains(@class, :teaser)]/descendant::div[@class=:text]', array(
+        ':teaser' => 'node-teaser',
+        ':text' => 'text',
+      ));
+      $expected_order = $expected;
+      foreach ($elements as $element) {
+        $next_label = array_shift($expected_order);
+        $this->assertEqual((string) $element, $next_label, format_string('Found choice @label in preview.', array(
+          '@label' => $next_label,
+        )));
+      }
+    }
+  }
+
+  function pollUpdate($nid, $title, $edit) {
+    // Edit the poll node.
+    $this->drupalPost('node/' . $nid . '/edit', $edit, t('Save'));
+    $this->assertText(t('@type @title has been updated.', array('@type' => node_type_get_name('poll'), '@title' => $title)), 'Poll has been updated.');
+  }
+}
+
+class PollCreateTestCase extends PollTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Poll create',
+      'description' => 'Adds "more choices", previews and creates a poll.',
+      'group' => 'Poll'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('poll');
+  }
+
+  function testPollCreate() {
+    $title = $this->randomName();
+    $choices = $this->_generateChoices(7);
+    $poll_nid = $this->pollCreate($title, $choices, TRUE);
+
+    // Verify poll appears on 'poll' page.
+    $this->drupalGet('poll');
+    $this->assertText($title, 'Poll appears in poll list.');
+    $this->assertText('open', 'Poll is active.');
+
+    // Click on the poll title to go to node page.
+    $this->clickLink($title);
+    $this->assertText('Total votes: 0', 'Link to poll correct.');
+
+    // Now add a new option to make sure that when we update the node the
+    // option is displayed.
+    $node = node_load($poll_nid);
+
+    $new_option = $this->randomName();
+
+    $vote_count = '2000';
+    $node->choice[] = array(
+      'chid' => '',
+      'chtext' => $new_option,
+      'chvotes' => (int) $vote_count,
+      'weight' => 1000,
+    );
+
+    node_save($node);
+
+    $this->drupalGet('poll');
+    $this->clickLink($title);
+    $this->assertText($new_option, 'New option found.');
+
+    $option = $this->xpath('//div[@id="node-1"]//div[@class="poll"]//div[@class="text"]');
+    $this->assertEqual(end($option), $new_option, 'Last item is equal to new option.');
+
+    $votes = $this->xpath('//div[@id="node-1"]//div[@class="poll"]//div[@class="percent"]');
+    $this->assertTrue(strpos(end($votes), $vote_count) > 0, "Votes saved.");
+  }
+
+  function testPollClose() {
+    $content_user = $this->drupalCreateUser(array('create poll content', 'edit any poll content', 'access content'));
+    $vote_user = $this->drupalCreateUser(array('cancel own vote', 'inspect all votes', 'vote on polls', 'access content'));
+
+    // Create poll.
+    $title = $this->randomName();
+    $choices = $this->_generateChoices(7);
+    $poll_nid = $this->pollCreate($title, $choices, FALSE);
+
+    $this->drupalLogout();
+    $this->drupalLogin($content_user);
+
+    // Edit the poll node and close the poll.
+    $close_edit = array('active' => 0);
+    $this->pollUpdate($poll_nid, $title, $close_edit);
+
+    // Verify 'Vote' button no longer appears.
+    $this->drupalGet('node/' . $poll_nid);
+    $elements = $this->xpath('//input[@id="edit-vote"]');
+    $this->assertTrue(empty($elements), "Vote button doesn't appear.");
+
+    // Verify status on 'poll' page is 'closed'.
+    $this->drupalGet('poll');
+    $this->assertText($title, 'Poll appears in poll list.');
+    $this->assertText('closed', 'Poll is closed.');
+
+    // Edit the poll node and re-activate.
+    $open_edit = array('active' => 1);
+    $this->pollUpdate($poll_nid, $title, $open_edit);
+
+    // Vote on the poll.
+    $this->drupalLogout();
+    $this->drupalLogin($vote_user);
+    $vote_edit = array('choice' => '1');
+    $this->drupalPost('node/' . $poll_nid, $vote_edit, t('Vote'));
+    $this->assertText('Your vote was recorded.', 'Your vote was recorded.');
+    $elements = $this->xpath('//input[@value="Cancel your vote"]');
+    $this->assertTrue(isset($elements[0]), "'Cancel your vote' button appears.");
+
+    // Edit the poll node and close the poll.
+    $this->drupalLogout();
+    $this->drupalLogin($content_user);
+    $close_edit = array('active' => 0);
+    $this->pollUpdate($poll_nid, $title, $close_edit);
+
+    // Verify 'Cancel your vote' button no longer appears.
+    $this->drupalGet('node/' . $poll_nid);
+    $elements = $this->xpath('//input[@value="Cancel your vote"]');
+    $this->assertTrue(empty($elements), "'Cancel your vote' button no longer appears.");
+  }
+}
+
+class PollVoteTestCase extends PollTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Poll vote',
+      'description' => 'Vote on a poll',
+      'group' => 'Poll'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('poll');
+  }
+
+  function tearDown() {
+    parent::tearDown();
+  }
+
+  function testPollVote() {
+    $title = $this->randomName();
+    $choices = $this->_generateChoices(7);
+    $poll_nid = $this->pollCreate($title, $choices, FALSE);
+    $this->drupalLogout();
+
+    $vote_user = $this->drupalCreateUser(array('cancel own vote', 'inspect all votes', 'vote on polls', 'access content'));
+    $restricted_vote_user = $this->drupalCreateUser(array('vote on polls', 'access content'));
+
+    $this->drupalLogin($vote_user);
+
+    // Record a vote for the first choice.
+    $edit = array(
+      'choice' => '1',
+    );
+    $this->drupalPost('node/' . $poll_nid, $edit, t('Vote'));
+    $this->assertText('Your vote was recorded.', 'Your vote was recorded.');
+    $this->assertText('Total votes: 1', 'Vote count updated correctly.');
+    $elements = $this->xpath('//input[@value="Cancel your vote"]');
+    $this->assertTrue(isset($elements[0]), "'Cancel your vote' button appears.");
+
+    $this->drupalGet("node/$poll_nid/votes");
+    $this->assertText(t('This table lists all the recorded votes for this poll. If anonymous users are allowed to vote, they will be identified by the IP address of the computer they used when they voted.'), 'Vote table text.');
+    $this->assertText($choices[0], 'Vote recorded');
+
+    // Ensure poll listing page has correct number of votes.
+    $this->drupalGet('poll');
+    $this->assertText($title, 'Poll appears in poll list.');
+    $this->assertText('1 vote', 'Poll has 1 vote.');
+
+    // Cancel a vote.
+    $this->drupalPost('node/' . $poll_nid, array(), t('Cancel your vote'));
+    $this->assertText('Your vote was cancelled.', 'Your vote was cancelled.');
+    $this->assertNoText('Cancel your vote', "Cancel vote button doesn't appear.");
+
+    $this->drupalGet("node/$poll_nid/votes");
+    $this->assertNoText($choices[0], 'Vote cancelled');
+
+    // Ensure poll listing page has correct number of votes.
+    $this->drupalGet('poll');
+    $this->assertText($title, 'Poll appears in poll list.');
+    $this->assertText('0 votes', 'Poll has 0 votes.');
+
+    // Log in as a user who can only vote on polls.
+    $this->drupalLogout();
+    $this->drupalLogin($restricted_vote_user);
+
+    // Vote on a poll.
+    $edit = array(
+      'choice' => '1',
+    );
+    $this->drupalPost('node/' . $poll_nid, $edit, t('Vote'));
+    $this->assertText('Your vote was recorded.', 'Your vote was recorded.');
+    $this->assertText('Total votes: 1', 'Vote count updated correctly.');
+    $elements = $this->xpath('//input[@value="Cancel your vote"]');
+    $this->assertTrue(empty($elements), "'Cancel your vote' button does not appear.");
+  }
+}
+
+class PollBlockTestCase extends PollTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Block availability',
+      'description' => 'Check if the most recent poll block is available.',
+      'group' => 'Poll',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('poll');
+
+    // Create and login user
+    $admin_user = $this->drupalCreateUser(array('administer blocks'));
+    $this->drupalLogin($admin_user);
+  }
+
+  function testRecentBlock() {
+    // Set block title to confirm that the interface is available.
+    $this->drupalPost('admin/structure/block/manage/poll/recent/configure', array('title' => $this->randomName(8)), t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), 'Block configuration set.');
+
+    // Set the block to a region to confirm block is available.
+    $edit = array();
+    $edit['blocks[poll_recent][region]'] = 'footer';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->assertText(t('The block settings have been updated.'), 'Block successfully move to footer region.');
+
+    // Create a poll which should appear in recent polls block.
+    $title = $this->randomName();
+    $choices = $this->_generateChoices(7);
+    $poll_nid = $this->pollCreate($title, $choices, TRUE);
+
+    // Verify poll appears in a block.
+    // View user page so we're not matching the poll node on front page.
+    $this->drupalGet('user');
+    // If a 'block' view not generated, this title would not appear even though
+    // the choices might.
+    $this->assertText($title, 'Poll appears in block.');
+
+    // Logout and login back in as a user who can vote.
+    $this->drupalLogout();
+    $vote_user = $this->drupalCreateUser(array('cancel own vote', 'inspect all votes', 'vote on polls', 'access content'));
+    $this->drupalLogin($vote_user);
+
+    // Verify we can vote via the block.
+    $edit = array(
+      'choice' => '1',
+    );
+    $this->drupalPost('user/' . $vote_user->uid, $edit, t('Vote'));
+    $this->assertText('Your vote was recorded.', 'Your vote was recorded.');
+    $this->assertText('Total votes: 1', 'Vote count updated correctly.');
+    $this->assertText('Older polls', 'Link to older polls appears.');
+    $this->clickLink('Older polls');
+    $this->assertText('1 vote - open', 'Link to poll listing correct.');
+
+    // Close the poll and verify block doesn't appear.
+    $content_user = $this->drupalCreateUser(array('create poll content', 'edit any poll content', 'access content'));
+    $this->drupalLogout();
+    $this->drupalLogin($content_user);
+    $close_edit = array('active' => 0);
+    $this->pollUpdate($poll_nid, $title, $close_edit);
+    $this->drupalGet('user/' . $content_user->uid);
+    $this->assertNoText($title, 'Poll no longer appears in block.');
+  }
+}
+
+/**
+ * Test adding new choices.
+ */
+class PollJSAddChoice extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Poll add choice',
+      'description' => 'Submits a POST request for an additional poll choice.',
+      'group' => 'Poll'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('poll');
+  }
+
+  /**
+   * Test adding a new choice.
+   */
+  function testAddChoice() {
+    $web_user = $this->drupalCreateUser(array('create poll content', 'access content'));
+    $this->drupalLogin($web_user);
+    $this->drupalGet('node/add/poll');
+    $edit = array(
+      "title" => $this->randomName(),
+      'choice[new:0][chtext]' => $this->randomName(),
+      'choice[new:1][chtext]' => $this->randomName(),
+    );
+
+    // Press 'add choice' button through Ajax, and place the expected HTML result
+    // as the tested content.
+    $commands = $this->drupalPostAJAX(NULL, $edit, array('op' => t('More choices')));
+    $this->content = $commands[1]['data'];
+
+    $this->assertFieldByName('choice[chid:0][chtext]', $edit['choice[new:0][chtext]'], format_string('Field !i found', array('!i' => 0)));
+    $this->assertFieldByName('choice[chid:1][chtext]', $edit['choice[new:1][chtext]'], format_string('Field !i found', array('!i' => 1)));
+    $this->assertFieldByName('choice[new:0][chtext]', '', format_string('Field !i found', array('!i' => 2)));
+  }
+}
+
+class PollVoteCheckHostname extends PollTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'User poll vote capability.',
+      'description' => 'Check that users and anonymous users from specified ip-address can only vote once.',
+      'group' => 'Poll'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('poll');
+
+    // Create and login user.
+    $this->admin_user = $this->drupalCreateUser(array('administer permissions', 'create poll content'));
+    $this->drupalLogin($this->admin_user);
+
+    // Allow anonymous users to vote on polls.
+    user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
+      'access content' => TRUE,
+      'vote on polls' => TRUE,
+      'cancel own vote' => TRUE,
+    ));
+
+    // Enable page cache to verify that the result page is not saved in the
+    // cache when anonymous voting is allowed.
+    variable_set('cache', 1);
+
+    // Create poll.
+    $title = $this->randomName();
+    $choices = $this->_generateChoices(3);
+    $this->poll_nid = $this->pollCreate($title, $choices, FALSE);
+
+    $this->drupalLogout();
+
+    // Create web users.
+    $this->web_user1 = $this->drupalCreateUser(array('access content', 'vote on polls', 'cancel own vote'));
+    $this->web_user2 = $this->drupalCreateUser(array('access content', 'vote on polls'));
+  }
+
+  /**
+   * Check that anonymous users with same ip cannot vote on poll more than once
+   * unless user is logged in.
+   */
+  function testHostnamePollVote() {
+    // Login User1.
+    $this->drupalLogin($this->web_user1);
+
+    $edit = array(
+      'choice' => '1',
+    );
+
+    // User1 vote on Poll.
+    $this->drupalPost('node/' . $this->poll_nid, $edit, t('Vote'));
+    $this->assertText(t('Your vote was recorded.'), format_string('%user vote was recorded.', array('%user' => $this->web_user1->name)));
+    $this->assertText(t('Total votes: @votes', array('@votes' => 1)), 'Vote count updated correctly.');
+
+    // Check to make sure User1 cannot vote again.
+    $this->drupalGet('node/' . $this->poll_nid);
+    $elements = $this->xpath('//input[@value="Vote"]');
+    $this->assertTrue(empty($elements), format_string("%user is not able to vote again.", array('%user' => $this->web_user1->name)));
+    $elements = $this->xpath('//input[@value="Cancel your vote"]');
+    $this->assertTrue(!empty($elements), "'Cancel your vote' button appears.");
+
+    // Logout User1.
+    $this->drupalLogout();
+
+    // Fill the page cache by requesting the poll.
+    $this->drupalGet('node/' . $this->poll_nid);
+    $this->assertEqual($this->drupalGetHeader('x-drupal-cache'), 'MISS', 'Page was cacheable but was not in the cache.');
+    $this->drupalGet('node/' . $this->poll_nid);
+    $this->assertEqual($this->drupalGetHeader('x-drupal-cache'), 'HIT', 'Page was cached.');
+
+    // Anonymous user vote on Poll.
+    $this->drupalPost(NULL, $edit, t('Vote'));
+    $this->assertText(t('Your vote was recorded.'), 'Anonymous vote was recorded.');
+    $this->assertText(t('Total votes: @votes', array('@votes' => 2)), 'Vote count updated correctly.');
+    $elements = $this->xpath('//input[@value="Cancel your vote"]');
+    $this->assertTrue(!empty($elements), "'Cancel your vote' button appears.");
+
+    // Check to make sure Anonymous user cannot vote again.
+    $this->drupalGet('node/' . $this->poll_nid);
+    $this->assertFalse($this->drupalGetHeader('x-drupal-cache'), 'Page was not cacheable.');
+    $elements = $this->xpath('//input[@value="Vote"]');
+    $this->assertTrue(empty($elements), "Anonymous is not able to vote again.");
+    $elements = $this->xpath('//input[@value="Cancel your vote"]');
+    $this->assertTrue(!empty($elements), "'Cancel your vote' button appears.");
+
+    // Login User2.
+    $this->drupalLogin($this->web_user2);
+
+    // User2 vote on poll.
+    $this->drupalPost('node/' . $this->poll_nid, $edit, t('Vote'));
+    $this->assertText(t('Your vote was recorded.'), format_string('%user vote was recorded.', array('%user' => $this->web_user2->name)));
+    $this->assertText(t('Total votes: @votes', array('@votes' => 3)), 'Vote count updated correctly.');
+    $elements = $this->xpath('//input[@value="Cancel your vote"]');
+    $this->assertTrue(empty($elements), "'Cancel your vote' button does not appear.");
+
+    // Logout User2.
+    $this->drupalLogout();
+
+    // Change host name for anonymous users.
+    db_update('poll_vote')
+      ->fields(array(
+        'hostname' => '123.456.789.1',
+      ))
+      ->condition('hostname', '', '<>')
+      ->execute();
+
+    // Check to make sure Anonymous user can vote again with a new session after
+    // a hostname change.
+    $this->drupalGet('node/' . $this->poll_nid);
+    $this->assertEqual($this->drupalGetHeader('x-drupal-cache'), 'MISS', 'Page was cacheable but was not in the cache.');
+    $this->drupalPost(NULL, $edit, t('Vote'));
+    $this->assertText(t('Your vote was recorded.'), format_string('%user vote was recorded.', array('%user' => $this->web_user2->name)));
+    $this->assertText(t('Total votes: @votes', array('@votes' => 4)), 'Vote count updated correctly.');
+    $elements = $this->xpath('//input[@value="Cancel your vote"]');
+    $this->assertTrue(!empty($elements), "'Cancel your vote' button appears.");
+
+    // Check to make sure Anonymous user cannot vote again with a new session,
+    // and that the vote from the previous session cannot be cancelledd.
+    $this->curlClose();
+    $this->drupalGet('node/' . $this->poll_nid);
+    $this->assertEqual($this->drupalGetHeader('x-drupal-cache'), 'MISS', 'Page was cacheable but was not in the cache.');
+    $elements = $this->xpath('//input[@value="Vote"]');
+    $this->assertTrue(empty($elements), 'Anonymous is not able to vote again.');
+    $elements = $this->xpath('//input[@value="Cancel your vote"]');
+    $this->assertTrue(empty($elements), "'Cancel your vote' button does not appear.");
+
+    // Login User1.
+    $this->drupalLogin($this->web_user1);
+
+    // Check to make sure User1 still cannot vote even after hostname changed.
+    $this->drupalGet('node/' . $this->poll_nid);
+    $elements = $this->xpath('//input[@value="Vote"]');
+    $this->assertTrue(empty($elements), format_string("%user is not able to vote again.", array('%user' => $this->web_user1->name)));
+    $elements = $this->xpath('//input[@value="Cancel your vote"]');
+    $this->assertTrue(!empty($elements), "'Cancel your vote' button appears.");
+  }
+}
+
+/**
+ * Test poll token replacement in strings.
+ */
+class PollTokenReplaceTestCase extends PollTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Poll token replacement',
+      'description' => 'Generates text using placeholders for dummy content to check poll token replacement.',
+      'group' => 'Poll',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('poll');
+  }
+
+  /**
+   * Creates a poll, then tests the tokens generated from it.
+   */
+  function testPollTokenReplacement() {
+    global $language;
+
+    // Craete a poll with three choices.
+    $title = $this->randomName();
+    $choices = $this->_generateChoices(3);
+    $poll_nid = $this->pollCreate($title, $choices, FALSE);
+    $this->drupalLogout();
+
+    // Create four users and have each of them vote.
+    $vote_user1 = $this->drupalCreateUser(array('vote on polls', 'access content'));
+    $this->drupalLogin($vote_user1);
+    $edit = array(
+      'choice' => '1',
+    );
+    $this->drupalPost('node/' . $poll_nid, $edit, t('Vote'));
+    $this->drupalLogout();
+
+    $vote_user2 = $this->drupalCreateUser(array('vote on polls', 'access content'));
+    $this->drupalLogin($vote_user2);
+    $edit = array(
+      'choice' => '1',
+    );
+    $this->drupalPost('node/' . $poll_nid, $edit, t('Vote'));
+    $this->drupalLogout();
+
+    $vote_user3 = $this->drupalCreateUser(array('vote on polls', 'access content'));
+    $this->drupalLogin($vote_user3);
+    $edit = array(
+      'choice' => '2',
+    );
+    $this->drupalPost('node/' . $poll_nid, $edit, t('Vote'));
+    $this->drupalLogout();
+
+    $vote_user4 = $this->drupalCreateUser(array('vote on polls', 'access content'));
+    $this->drupalLogin($vote_user4);
+    $edit = array(
+      'choice' => '3',
+    );
+    $this->drupalPost('node/' . $poll_nid, $edit, t('Vote'));
+    $this->drupalLogout();
+
+    $poll = node_load($poll_nid, NULL, TRUE);
+
+    // Generate and test sanitized tokens.
+    $tests = array();
+    $tests['[node:poll-votes]'] = 4;
+    $tests['[node:poll-winner]'] = filter_xss($poll->choice[1]['chtext']);
+    $tests['[node:poll-winner-votes]'] = 2;
+    $tests['[node:poll-winner-percent]'] = 50;
+    $tests['[node:poll-duration]'] = format_interval($poll->runtime, 1, $language->language);
+
+    // Test to make sure that we generated something for each token.
+    $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('node' => $poll), array('language' => $language));
+      $this->assertEqual($output, $expected, format_string('Sanitized poll token %token replaced.', array('%token' => $input)));
+    }
+
+    // Generate and test unsanitized tokens.
+    $tests['[node:poll-winner]'] = $poll->choice[1]['chtext'];
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('node' => $poll), array('language' => $language, 'sanitize' => FALSE));
+      $this->assertEqual($output, $expected, format_string('Unsanitized poll token %token replaced.', array('%token' => $input)));
+    }
+  }
+}
+
+class PollExpirationTestCase extends PollTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Poll expiration',
+      'description' => 'Test the poll auto-expiration logic.',
+      'group' => 'Poll',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('poll');
+  }
+
+  function testAutoExpire() {
+    // Set up a poll.
+    $title = $this->randomName();
+    $choices = $this->_generateChoices(2);
+    $poll_nid = $this->pollCreate($title, $choices, FALSE);
+    $this->assertTrue($poll_nid, 'Poll for auto-expire test created.');
+
+    // Visit the poll edit page and verify that by default, expiration
+    // is set to unlimited.
+    $this->drupalGet("node/$poll_nid/edit");
+    $this->assertField('runtime', 'Poll expiration setting found.');
+    $elements = $this->xpath('//select[@id="edit-runtime"]/option[@selected="selected"]');
+    $this->assertTrue(isset($elements[0]['value']) && $elements[0]['value'] == 0, 'Poll expiration set to unlimited.');
+
+    // Set the expiration to one week.
+    $edit = array();
+    $poll_expiration = 604800; // One week.
+    $edit['runtime'] = $poll_expiration;
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertRaw(t('Poll %title has been updated.', array('%title' => $title)), 'Poll expiration settings saved.');
+
+    // Make sure that the changed expiration settings is kept.
+    $this->drupalGet("node/$poll_nid/edit");
+    $elements = $this->xpath('//select[@id="edit-runtime"]/option[@selected="selected"]');
+    $this->assertTrue(isset($elements[0]['value']) && $elements[0]['value'] == $poll_expiration, 'Poll expiration set to unlimited.');
+
+    // Force a cron run. Since the expiration date has not yet been reached,
+    // the poll should remain active.
+    drupal_cron_run();
+    $this->drupalGet("node/$poll_nid/edit");
+    $elements = $this->xpath('//input[@id="edit-active-1"]');
+    $this->assertTrue(isset($elements[0]) && !empty($elements[0]['checked']), 'Poll is still active.');
+
+    // Test expiration. Since REQUEST_TIME is a constant and we don't
+    // want to keep SimpleTest waiting until the moment of expiration arrives,
+    // we forcibly change the expiration date in the database.
+    $created = db_query('SELECT created FROM {node} WHERE nid = :nid', array(':nid' => $poll_nid))->fetchField();
+    db_update('node')
+      ->fields(array('created' => $created - ($poll_expiration * 1.01)))
+      ->condition('nid', $poll_nid)
+      ->execute();
+
+    // Run cron and verify that the poll is now marked as "closed".
+    drupal_cron_run();
+    $this->drupalGet("node/$poll_nid/edit");
+    $elements = $this->xpath('//input[@id="edit-active-0"]');
+    $this->assertTrue(isset($elements[0]) && !empty($elements[0]['checked']), 'Poll has expired.');
+  }
+}
+
+class PollDeleteChoiceTestCase extends PollTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Poll choice deletion',
+      'description' => 'Test the poll choice deletion logic.',
+      'group' => 'Poll',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('poll');
+  }
+
+  function testChoiceRemoval() {
+    // Set up a poll with three choices.
+    $title = $this->randomName();
+    $choices = array('First choice', 'Second choice', 'Third choice');
+    $poll_nid = $this->pollCreate($title, $choices, FALSE);
+    $this->assertTrue($poll_nid, 'Poll for choice deletion logic test created.');
+
+    // Edit the poll, and try to delete first poll choice.
+    $this->drupalGet("node/$poll_nid/edit");
+    $edit['choice[chid:1][chtext]'] = '';
+    $this->drupalPost(NULL, $edit, t('Save'));
+
+    // Click on the poll title to go to node page.
+    $this->drupalGet('poll');
+    $this->clickLink($title);
+
+    // Check the first poll choice is deleted, while the others remain.
+    $this->assertNoText('First choice', 'First choice removed.');
+    $this->assertText('Second choice', 'Second choice remains.');
+    $this->assertText('Third choice', 'Third choice remains.');
+  }
+}
+
+/**
+ * Tests poll translation logic.
+ */
+class PollTranslateTestCase extends PollTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Poll translation',
+      'description' => 'Test the poll translation logic.',
+      'group' => 'Poll',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('poll', 'translation');
+  }
+
+  /**
+   * Tests poll creation and translation.
+   *
+   * Checks that the choice names get copied from the original poll and that
+   * the vote count values are set to 0.
+   */
+  function testPollTranslate() {
+    $admin_user = $this->drupalCreateUser(array('administer content types', 'administer languages', 'edit any poll content', 'create poll content', 'administer nodes', 'translate content'));
+
+    // Set up a poll with two choices.
+    $title = $this->randomName();
+    $choices = array($this->randomName(), $this->randomName());
+    $poll_nid = $this->pollCreate($title, $choices, FALSE);
+    $this->assertTrue($poll_nid, 'Poll for translation logic test created.');
+
+    $this->drupalLogout();
+    $this->drupalLogin($admin_user);
+
+    // Enable a second language.
+    $this->drupalGet('admin/config/regional/language');
+    $edit = array();
+    $edit['langcode'] = 'nl';
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+    $this->assertRaw(t('The language %language has been created and can now be used.', array('%language' => 'Dutch')), 'Language Dutch has been created.');
+
+    // Set "Poll" content type to use multilingual support with translation.
+    $this->drupalGet('admin/structure/types/manage/poll');
+    $edit = array();
+    $edit['language_content_type'] = 2;
+    $this->drupalPost('admin/structure/types/manage/poll', $edit, t('Save content type'));
+    $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Poll')), 'Poll content type has been updated.');
+
+    // Edit poll.
+    $this->drupalGet("node/$poll_nid/edit");
+    $edit = array();
+    // Set the poll's first choice count to 200.
+    $edit['choice[chid:1][chvotes]'] = 200;
+    // Set the language to Dutch.
+    $edit['language'] = 'nl';
+    $this->drupalPost(NULL, $edit, t('Save'));
+
+    // Translate the Dutch poll.
+    $this->drupalGet('node/add/poll', array('query' => array('translation' => $poll_nid, 'target' => 'en')));
+
+    $dutch_poll = node_load($poll_nid);
+
+    // Check that the vote count values didn't get copied from the Dutch poll
+    // and are set to 0.
+    $this->assertFieldByName('choice[chid:1][chvotes]', '0', ('Found choice with vote count 0'));
+    $this->assertFieldByName('choice[chid:2][chvotes]', '0', ('Found choice with vote count 0'));
+    // Check that the choice names got copied from the Dutch poll.
+    $this->assertFieldByName('choice[chid:1][chtext]', $dutch_poll->choice[1]['chtext'], format_string('Found choice with text @text', array('@text' => $dutch_poll->choice[1]['chtext'])));
+    $this->assertFieldByName('choice[chid:2][chtext]', $dutch_poll->choice[2]['chtext'], format_string('Found choice with text @text', array('@text' => $dutch_poll->choice[2]['chtext'])));
+  }
+}
diff --git a/htmltest/modules/poll/poll.tokens.inc b/htmltest/modules/poll/poll.tokens.inc
new file mode 100644
index 00000000..eda628ba
--- /dev/null
+++ b/htmltest/modules/poll/poll.tokens.inc
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * @file
+ * Builds placeholder replacement tokens for values specific to Poll nodes.
+ */
+
+/**
+ * Implements hook_token_info().
+ */
+function poll_token_info() {
+  $node['poll-votes'] = array(
+    'name' => t("Poll votes"),
+    'description' => t("The number of votes that have been cast on a poll."),
+  );
+  $node['poll-winner'] = array(
+    'name' => t("Poll winner"),
+    'description' => t("The winning poll answer."),
+  );
+  $node['poll-winner-votes'] = array(
+    'name' => t("Poll winner votes"),
+    'description' => t("The number of votes received by the winning poll answer."),
+  );
+  $node['poll-winner-percent'] = array(
+    'name' => t("Poll winner percent"),
+    'description' => t("The percentage of votes received by the winning poll answer."),
+  );
+  $node['poll-duration'] = array(
+    'name' => t("Poll duration"),
+    'description' => t("The length of time the poll is set to run."),
+  );
+
+  return array(
+    'tokens' => array('node' => $node),
+  );
+}
+
+/**
+ * Implements hook_tokens().
+ */
+function poll_tokens($type, $tokens, array $data = array(), array $options = array()) {
+  $sanitize = !empty($options['sanitize']);
+  if (isset($options['language'])) {
+    $url_options['language'] = $options['language'];
+    $language_code = $options['language']->language;
+  }
+  else {
+    $language_code = NULL;
+  }
+
+  $replacements = array();
+
+  if ($type == 'node' && !empty($data['node']) && $data['node']->type == 'poll') {
+    $node = $data['node'];
+
+    $total_votes = 0;
+    $highest_votes = 0;
+    foreach ($node->choice as $choice) {
+      if ($choice['chvotes'] > $highest_votes) {
+        $winner = $choice;
+        $highest_votes = $choice['chvotes'];
+      }
+      $total_votes = $total_votes + $choice['chvotes'];
+    }
+    foreach ($tokens as $name => $original) {
+      switch ($name) {
+        case 'poll-votes':
+          $replacements[$original] = $total_votes;
+          break;
+
+        case 'poll-winner':
+          if (isset($winner)) {
+            $replacements[$original] = $sanitize ? filter_xss($winner['chtext']) : $winner['chtext'];
+          }
+          else {
+            $replacements[$original] = '';
+          }
+          break;
+
+        case 'poll-winner-votes':
+          if (isset($winner)) {
+            $replacements[$original] = $winner['chvotes'];
+          }
+          else {
+            $replacements[$original] = '';
+          }
+          break;
+
+        case 'poll-winner-percent':
+          if (isset($winner)) {
+            $percent = ($winner['chvotes'] / $total_votes) * 100;
+            $replacements[$original] = number_format($percent, 0);
+          }
+          else {
+            $replacements[$original] = '';
+          }
+          break;
+
+        case 'poll-duration':
+          $replacements[$original] = format_interval($node->runtime, 1, $language_code);
+          break;
+      }
+    }
+  }
+
+  return $replacements;
+}
diff --git a/htmltest/modules/profile/profile-block.tpl.php b/htmltest/modules/profile/profile-block.tpl.php
new file mode 100644
index 00000000..dbdbcd84
--- /dev/null
+++ b/htmltest/modules/profile/profile-block.tpl.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation for displaying a users profile within a
+ * block. It only shows in relation to a node displayed as a full page.
+ *
+ * Available variables:
+ * - $user_picture: Image configured for the account linking to the users page.
+ * - $profile: Keyed array of all profile fields that have a value.
+ *
+ * Each $field in $profile contains:
+ * - $field->title: Title of the profile field.
+ * - $field->value: Value of the profile field.
+ * - $field->type: Type of the profile field, i.e., checkbox, textfield,
+ *   textarea, selection, list, url or date.
+ *
+ * Since $profile is keyed, a direct print of the field is possible. Not
+ * all accounts may have a value for a profile so do a check first. If a field
+ * of "last_name" was set for the site, the following can be used.
+ *
+ *  <?php if (isset($profile['last_name'])): ?>
+ *    <div class="field last-name">
+ *      <?php print $profile['last_name']->title; ?>:<br />
+ *      <?php print $profile['last_name']->value; ?>
+ *    </div>
+ *  <?php endif; ?>
+ *
+ * @see template_preprocess_profile_block()
+ */
+?>
+<?php print $user_picture; ?>
+
+<?php foreach ($profile as $field): ?>
+  <p>
+    <?php if ($field->type != 'checkbox'): ?>
+      <strong><?php print $field->title; ?></strong><br />
+    <?php endif; ?>
+    <?php print $field->value; ?>
+  </p>
+<?php endforeach; ?>
diff --git a/htmltest/modules/profile/profile-listing.tpl.php b/htmltest/modules/profile/profile-listing.tpl.php
new file mode 100644
index 00000000..d8b835af
--- /dev/null
+++ b/htmltest/modules/profile/profile-listing.tpl.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation for displaying a user and their profile data
+ * for member listing pages.
+ *
+ * @see profile-wrapper.tpl.php
+ *      where all the data is collected and printed out.
+ *
+ * Available variables:
+ * - $account: User's account object.
+ * - $user_picture: Image configured for the account linking to the users page.
+ * - $name: User's account name linking to the users page.
+ * - $profile: Keyed array of all profile fields that are set as visible
+ *   in member list pages (configured by site administrators). It also needs
+ *   to have a value in order to be present.
+ *
+ * Each $field in $profile contains:
+ * - $field->title: Title of the profile field.
+ * - $field->value: Value of the profile field.
+ * - $field->type: Type of the profile field, i.e., checkbox, textfield,
+ *   textarea, selection, list, url or date.
+ *
+ * Since $profile is keyed, a direct print of the field is possible. Not
+ * all accounts may have a value for a profile so do a check first. If a field
+ * of "last_name" was set for the site, the following can be used.
+ *
+ *  <?php if (isset($profile['last_name'])): ?>
+ *    <div class="field last-name">
+ *      <?php print $profile['last_name']->title; ?>:<br />
+ *      <?php print $profile['last_name']->value; ?>
+ *    </div>
+ *  <?php endif; ?>
+ *
+ * @see template_preprocess_profile_listing()
+ */
+?>
+<div class="profile clearfix">
+  <?php print $user_picture; ?>
+
+  <div class="name">
+    <?php print $name; ?>
+  </div>
+
+  <?php foreach ($profile as $field): ?>
+    <div class="field">
+      <?php print $field->value; ?>
+    </div>
+  <?php endforeach; ?>
+
+</div>
diff --git a/htmltest/modules/profile/profile-wrapper.tpl.php b/htmltest/modules/profile/profile-wrapper.tpl.php
new file mode 100644
index 00000000..3940ba02
--- /dev/null
+++ b/htmltest/modules/profile/profile-wrapper.tpl.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation for wrapping member listings and their
+ * profiles.
+ *
+ * This template is used when viewing a list of users. It can be a general
+ * list for viewing all users with the URL of "example.com/profile" or when
+ * viewing a set of users who share a specific value for a profile such
+ * as "example.com/profile/country/belgium".
+ *
+ * Available variables:
+ * - $content: User account profiles iterated through profile-listing.tpl.php.
+ * - $current_field: The named field being browsed. Provided here for context.
+ *   The above example would result in "last_name". An alternate template name
+ *   is also based on this, e.g., "profile-wrapper-last_name.tpl.php".
+ *
+ * @see template_preprocess_profile_wrapper()
+ */
+?>
+<div id="profile">
+  <?php print $content; ?>
+</div>
diff --git a/htmltest/modules/profile/profile.admin.inc b/htmltest/modules/profile/profile.admin.inc
new file mode 100644
index 00000000..d6ac3c31
--- /dev/null
+++ b/htmltest/modules/profile/profile.admin.inc
@@ -0,0 +1,446 @@
+<?php
+
+/**
+ * @file
+ * Administrative page callbacks for the profile module.
+ */
+
+/**
+ * Form builder to display a listing of all editable profile fields.
+ *
+ * @ingroup forms
+ * @see profile_admin_overview_submit()
+ */
+function profile_admin_overview($form) {
+  $result = db_query('SELECT title, name, type, category, fid, weight FROM {profile_field} ORDER BY category, weight');
+
+  $categories = array();
+  foreach ($result as $field) {
+    // Collect all category information
+    $categories[] = $field->category;
+
+    // Save all field information
+    $form[$field->fid]['name'] = array('#markup' => check_plain($field->name));
+    $form[$field->fid]['title'] = array('#markup' => check_plain($field->title));
+    $form[$field->fid]['type'] = array('#markup' => $field->type);
+    $form[$field->fid]['category'] = array(
+      '#type' => 'select',
+      '#title' => t('Category for @title', array('@title' => $field->title)),
+      '#title_display' => 'invisible',
+      '#default_value' => $field->category,
+      '#options' => array(),
+    );
+    $form[$field->fid]['weight'] = array(
+      '#type' => 'weight',
+      '#title' => t('Weight for @title', array('@title' => $field->title)),
+      '#title_display' => 'invisible',
+      '#default_value' => $field->weight,
+    );
+    $form[$field->fid]['edit'] = array('#type' => 'link', '#title' => t('edit'), '#href' => "admin/config/people/profile/edit/$field->fid");
+    $form[$field->fid]['delete'] = array('#type' => 'link', '#title' => t('delete'), '#href' => "admin/config/people/profile/delete/$field->fid");
+  }
+
+  // Add the category combo boxes
+  $categories = array_unique($categories);
+  foreach ($form as $fid => $field) {
+    foreach ($categories as $cat => $category) {
+      $form[$fid]['category']['#options'][$category] = $category;
+    }
+  }
+
+  // Display the submit button only when there's more than one field
+  if (count($form) > 1) {
+    $form['actions'] = array('#type' => 'actions');
+    $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
+  }
+  else {
+    // Disable combo boxes when there isn't a submit button
+    foreach ($form as $fid => $field) {
+      unset($form[$fid]['weight']);
+      $form[$fid]['category']['#type'] = 'value';
+    }
+  }
+  $form['#tree'] = TRUE;
+
+  // @todo: Any reason this isn't done using an element with #theme = 'links'?
+  $addnewfields = '<h2>' . t('Add new field') . '</h2>';
+  $addnewfields .= '<ul>';
+  foreach (_profile_field_types() as $key => $value) {
+    $addnewfields .= '<li>' . l($value, "admin/config/people/profile/add/$key") . '</li>';
+  }
+  $addnewfields .= '</ul>';
+  $form['addnewfields'] = array('#markup' => $addnewfields);
+
+  return $form;
+}
+
+/**
+ * Submit handler to update changed profile field weights and categories.
+ *
+ * @see profile_admin_overview()
+ */
+function profile_admin_overview_submit($form, &$form_state) {
+  foreach (element_children($form_state['values']) as $fid) {
+    if (is_numeric($fid)) {
+      $weight = $form_state['values'][$fid]['weight'];
+      $category = $form_state['values'][$fid]['category'];
+      if ($weight != $form[$fid]['weight']['#default_value'] || $category != $form[$fid]['category']['#default_value']) {
+        db_update('profile_field')
+          ->fields(array(
+            'weight' => $weight,
+            'category' => $category,
+          ))
+          ->condition('fid', $fid)
+          ->execute();
+      }
+    }
+  }
+
+  drupal_set_message(t('Profile fields have been updated.'));
+  cache_clear_all();
+  menu_rebuild();
+}
+
+/**
+ * Returns HTML for the profile field overview form into a drag and drop enabled table.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @see profile_admin_overview()
+ * @ingroup themeable
+ */
+function theme_profile_admin_overview($variables) {
+  $form = $variables['form'];
+
+  drupal_add_css(drupal_get_path('module', 'profile') . '/profile.css');
+  // Add javascript if there's more than one field.
+  if (isset($form['actions'])) {
+    drupal_add_js(drupal_get_path('module', 'profile') . '/profile.js');
+  }
+
+  $rows = array();
+  $categories = array();
+  $category_number = 0;
+  foreach (element_children($form) as $key) {
+    // Don't take form control structures.
+    if (isset($form[$key]['category'])) {
+      $field = &$form[$key];
+      $category = $field['category']['#default_value'];
+
+      if (!isset($categories[$category])) {
+        // Category classes are given numeric IDs because there's no guarantee
+        // class names won't contain invalid characters.
+        $categories[$category] = $category_number;
+        $category_field['#attributes']['class'] = array('profile-category', 'profile-category-' . $category_number);
+        $rows[] = array(array('data' => check_plain($category), 'colspan' => 7, 'class' => array('category')));
+        $rows[] = array('data' => array(array('data' => '<em>' . t('No fields in this category. If this category remains empty when saved, it will be removed.') . '</em>', 'colspan' => 7)), 'class' => array('category-' . $category_number . '-message', 'category-message', 'category-populated'));
+
+        // Make it draggable only if there is more than one field
+        if (isset($form['actions'])) {
+          drupal_add_tabledrag('profile-fields', 'order', 'sibling', 'profile-weight', 'profile-weight-' . $category_number);
+          drupal_add_tabledrag('profile-fields', 'match', 'sibling', 'profile-category', 'profile-category-' . $category_number);
+        }
+        $category_number++;
+      }
+
+      // Add special drag and drop classes that group fields together.
+      $field['weight']['#attributes']['class'] = array('profile-weight', 'profile-weight-' . $categories[$category]);
+      $field['category']['#attributes']['class'] = array('profile-category', 'profile-category-' . $categories[$category]);
+
+      // Add the row
+      $row = array();
+      $row[] = drupal_render($field['title']);
+      $row[] = drupal_render($field['name']);
+      $row[] = drupal_render($field['type']);
+      if (isset($form['actions'])) {
+        $row[] = drupal_render($field['category']);
+        $row[] = drupal_render($field['weight']);
+      }
+      $row[] = drupal_render($field['edit']);
+      $row[] = drupal_render($field['delete']);
+      $rows[] = array('data' => $row, 'class' => array('draggable'));
+    }
+  }
+
+  $header = array(t('Title'), t('Name'), t('Type'));
+  if (isset($form['actions'])) {
+    $header[] = t('Category');
+    $header[] = t('Weight');
+  }
+  $header[] = array('data' => t('Operations'), 'colspan' => 2);
+
+  $output = theme('table', array('header' => $header, 'rows' => $rows, 'empty' => t('No fields available.'), 'attributes' => array('id' => 'profile-fields')));
+  $output .= drupal_render_children($form);
+
+  return $output;
+}
+
+/**
+ * Menu callback: Generate a form to add/edit a user profile field.
+ *
+ * @ingroup forms
+ * @see profile_field_form_validate()
+ * @see profile_field_form_submit()
+ */
+function profile_field_form($form, &$form_state, $arg = NULL) {
+  if (arg(4) == 'edit') {
+    if (is_numeric($arg)) {
+      $fid = $arg;
+
+      $edit = db_query('SELECT * FROM {profile_field} WHERE fid = :fid', array('fid' => $fid))->fetchAssoc();
+
+      if (!$edit) {
+        drupal_not_found();
+        return;
+      }
+      drupal_set_title(t('Edit %title', array('%title' => $edit['title'])), PASS_THROUGH);
+      $form['fid'] = array('#type' => 'value',
+        '#value' => $fid,
+      );
+      $type = $edit['type'];
+    }
+    else {
+      drupal_not_found();
+      return;
+    }
+  }
+  else {
+    $types = _profile_field_types();
+    if (!isset($types[$arg])) {
+      drupal_not_found();
+      return;
+    }
+    $type = $arg;
+    drupal_set_title(t('Add new %type', array('%type' => $types[$type])), PASS_THROUGH);
+    $edit = array('name' => 'profile_');
+    $form['type'] = array('#type' => 'value', '#value' => $type);
+  }
+  $edit += array(
+    'category' => '',
+    'title' => '',
+    'explanation' => '',
+    'weight' => 0,
+    'page' => '',
+    'autocomplete' => '',
+    'required' => '',
+    'register' => '',
+  );
+  $form['category'] = array('#type' => 'textfield',
+    '#title' => t('Category'),
+    '#default_value' => $edit['category'],
+    '#autocomplete_path' => 'admin/config/people/profile/autocomplete',
+    '#description' => t('The category the new field should be part of. Categories are used to group fields logically. An example category is "Personal information".'),
+    '#required' => TRUE,
+  );
+  $form['title'] = array('#type' => 'textfield',
+    '#title' => t('Title'),
+    '#default_value' => $edit['title'],
+    '#description' => t('The title of the new field. The title will be shown to the user. An example title is "Favorite color".'),
+    '#required' => TRUE,
+  );
+  $form['name'] = array('#type' => 'textfield',
+    '#title' => t('Form name'),
+    '#default_value' => $edit['name'],
+    '#description' => t('The name of the field. The form name is not shown to the user but used internally in the HTML code and URLs.
+Unless you know what you are doing, it is highly recommended that you prefix the form name with <code>profile_</code> to avoid name clashes with other fields. Spaces or any other special characters except dash (-) and underscore (_) are not allowed. An example name is "profile_favorite_color" or perhaps just "profile_color".'),
+    '#required' => TRUE,
+  );
+  $form['explanation'] = array('#type' => 'textarea',
+    '#title' => t('Explanation'),
+    '#default_value' => $edit['explanation'],
+    '#description' => t('An optional explanation to go with the new field. The explanation will be shown to the user.'),
+  );
+  if ($type == 'selection') {
+    $form['fields']['options'] = array('#type' => 'textarea',
+      '#title' => t('Selection options'),
+      '#default_value' => isset($edit['options']) ? $edit['options'] : '',
+      '#description' => t('A list of all options. Put each option on a separate line. Example options are "red", "blue", "green", etc.'),
+    );
+  }
+  $form['visibility'] = array('#type' => 'radios',
+    '#title' => t('Visibility'),
+    '#default_value' => isset($edit['visibility']) ? $edit['visibility'] : PROFILE_PUBLIC,
+    '#options' => array(PROFILE_HIDDEN => t('Hidden profile field, only accessible by administrators, modules and themes.'), PROFILE_PRIVATE => t('Private field, content only available to privileged users.'), PROFILE_PUBLIC => t('Public field, content shown on profile page but not used on member list pages.'), PROFILE_PUBLIC_LISTINGS => t('Public field, content shown on profile page and on member list pages.')),
+  );
+  if ($type == 'selection' || $type == 'list' || $type == 'textfield') {
+    $form['fields']['page'] = array('#type' => 'textfield',
+      '#title' => t('Page title'),
+      '#default_value' => $edit['page'],
+      '#description' => t('To enable browsing this field by value, enter a title for the resulting page. The word <code>%value</code> will be substituted with the corresponding value. An example page title is "People whose favorite color is %value" . This is only applicable for a public field.'),
+    );
+  }
+  elseif ($type == 'checkbox') {
+    $form['fields']['page'] = array('#type' => 'textfield',
+      '#title' => t('Page title'),
+      '#default_value' => $edit['page'],
+      '#description' => t('To enable browsing this field by value, enter a title for the resulting page. An example page title is "People who are employed" . This is only applicable for a public field.'),
+    );
+  }
+  $form['weight'] = array('#type' => 'weight',
+    '#title' => t('Weight'),
+    '#default_value' => $edit['weight'],
+    '#description' => t('The weights define the order in which the form fields are shown. Lighter fields "float up" towards the top of the category.'),
+  );
+  $form['autocomplete'] = array('#type' => 'checkbox',
+    '#title' => t('Form will auto-complete while user is typing.'),
+    '#default_value' => $edit['autocomplete'],
+    '#description' => t('For security, auto-complete will be disabled if the user does not have access to user profiles.'),
+  );
+  $form['required'] = array('#type' => 'checkbox',
+    '#title' => t('The user must enter a value.'),
+    '#default_value' => $edit['required'],
+  );
+  $form['register'] = array('#type' => 'checkbox',
+    '#title' => t('Visible in user registration form.'),
+    '#default_value' => $edit['register'],
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit',
+    '#value' => t('Save field'),
+  );
+  return $form;
+}
+
+/**
+ * Validate profile_field_form submissions.
+ */
+function profile_field_form_validate($form, &$form_state) {
+  // Validate the 'field name':
+  if (preg_match('/[^a-zA-Z0-9_-]/', $form_state['values']['name'])) {
+    form_set_error('name', t('The specified form name contains one or more illegal characters. Spaces or any other special characters except dash (-) and underscore (_) are not allowed.'));
+  }
+
+  $users_table = drupal_get_schema('users');
+  if (!empty($users_table['fields'][$form_state['values']['name']])) {
+    form_set_error('name', t('The specified form name is reserved for use by Drupal.'));
+  }
+  // Validate the category:
+  if (!$form_state['values']['category']) {
+    form_set_error('category', t('You must enter a category.'));
+  }
+  if (strtolower($form_state['values']['category']) == 'account') {
+    form_set_error('category', t('The specified category name is reserved for use by Drupal.'));
+  }
+  $query = db_select('profile_field');
+  $query->fields('profile_field', array('fid'));
+
+  if (isset($form_state['values']['fid'])) {
+    $query->condition('fid', $form_state['values']['fid'], '<>');
+  }
+  $query_name = clone $query;
+
+  $title = $query
+    ->condition('title', $form_state['values']['title'])
+    ->condition('category', $form_state['values']['category'])
+    ->execute()
+    ->fetchField();
+  if ($title) {
+    form_set_error('title', t('The specified title is already in use.'));
+  }
+  $name = $query_name
+    ->condition('name', $form_state['values']['name'])
+    ->execute()
+    ->fetchField();
+  if ($name) {
+    form_set_error('name', t('The specified name is already in use.'));
+  }
+  if ($form_state['values']['visibility'] == PROFILE_HIDDEN) {
+    if ($form_state['values']['required']) {
+      form_set_error('required', t('A hidden field cannot be required.'));
+    }
+    if ($form_state['values']['register']) {
+      form_set_error('register', t('A hidden field cannot be set to visible on the user registration form.'));
+    }
+  }
+}
+
+/**
+ * Process profile_field_form submissions.
+ */
+function profile_field_form_submit($form, &$form_state) {
+  if (!isset($form_state['values']['options'])) {
+    $form_state['values']['options'] = '';
+  }
+  if (!isset($form_state['values']['page'])) {
+    $form_state['values']['page'] = '';
+  }
+  // Remove all elements that are not profile_field columns.
+  $values = array_intersect_key($form_state['values'], array_flip(array('type', 'category', 'title', 'name', 'explanation', 'visibility', 'page', 'weight', 'autocomplete', 'required', 'register', 'options')));
+  if (!isset($form_state['values']['fid'])) {
+    db_insert('profile_field')
+      ->fields($values)
+      ->execute();
+    drupal_set_message(t('The field has been created.'));
+    watchdog('profile', 'Profile field %field added under category %category.', array('%field' => $form_state['values']['title'], '%category' => $form_state['values']['category']), WATCHDOG_NOTICE, l(t('view'), 'admin/config/people/profile'));
+  }
+  else {
+    db_update('profile_field')
+      ->fields($values)
+      ->condition('fid', $form_state['values']['fid'])
+      ->execute();
+    drupal_set_message(t('The field has been updated.'));
+  }
+  cache_clear_all();
+  menu_rebuild();
+
+  $form_state['redirect'] = 'admin/config/people/profile';
+  return;
+}
+
+/**
+ * Menu callback; deletes a field from all user profiles.
+ */
+function profile_field_delete($form, &$form_state, $fid) {
+  $field = db_query("SELECT title FROM {profile_field} WHERE fid = :fid", array(':fid' => $fid))->fetchObject();
+  if (!$field) {
+    drupal_not_found();
+    return;
+  }
+  $form['fid'] = array('#type' => 'value', '#value' => $fid);
+  $form['title'] = array('#type' => 'value', '#value' => $field->title);
+
+  return confirm_form($form,
+    t('Are you sure you want to delete the field %field?', array('%field' => $field->title)), 'admin/config/people/profile',
+    t('This action cannot be undone. If users have entered values into this field in their profile, these entries will also be deleted. If you want to keep the user-entered data, instead of deleting the field you may wish to <a href="@edit-field">edit this field</a> and change it to a hidden profile field so that it may only be accessed by administrators.', array('@edit-field' => url('admin/config/people/profile/edit/' . $fid))),
+    t('Delete'), t('Cancel'));
+}
+
+/**
+ * Process a field delete form submission.
+ */
+function profile_field_delete_submit($form, &$form_state) {
+  db_delete('profile_field')
+    ->condition('fid', $form_state['values']['fid'])
+    ->execute();
+  db_delete('profile_value')
+    ->condition('fid', $form_state['values']['fid'])
+    ->execute();
+
+  cache_clear_all();
+
+  drupal_set_message(t('The field %field has been deleted.', array('%field' => $form_state['values']['title'])));
+  watchdog('profile', 'Profile field %field deleted.', array('%field' => $form_state['values']['title']), WATCHDOG_NOTICE, l(t('view'), 'admin/config/people/profile'));
+
+  $form_state['redirect'] = 'admin/config/people/profile';
+  return;
+}
+
+/**
+ * Retrieve a pipe delimited string of autocomplete suggestions for profile categories
+ */
+function profile_admin_settings_autocomplete($string) {
+  $matches = array();
+  $result = db_select('profile_field')
+    ->fields('profile_field', array('category'))
+    ->condition('category', db_like($string) . '%', 'LIKE')
+    ->range(0, 10)
+    ->execute();
+
+  foreach ($result as $data) {
+    $matches[$data->category] = check_plain($data->category);
+  }
+  drupal_json_output($matches);
+}
diff --git a/htmltest/modules/profile/profile.css b/htmltest/modules/profile/profile.css
new file mode 100644
index 00000000..c3132f99
--- /dev/null
+++ b/htmltest/modules/profile/profile.css
@@ -0,0 +1,10 @@
+
+#profile-fields td.category {
+  font-weight: bold;
+}
+#profile-fields tr.category-message {
+  color: #999;
+}
+#profile-fields tr.category-populated {
+  display: none;
+}
diff --git a/htmltest/modules/profile/profile.info b/htmltest/modules/profile/profile.info
new file mode 100644
index 00000000..d8dccd13
--- /dev/null
+++ b/htmltest/modules/profile/profile.info
@@ -0,0 +1,18 @@
+name = Profile
+description = Supports configurable user profiles.
+package = Core
+version = VERSION
+core = 7.x
+files[] = profile.test
+configure = admin/config/people/profile
+; The Profile module is deprecated, and included in Drupal 7 for legacy
+; purposes only. By default, the module will be hidden from the UI unless you
+; are upgrading a site that uses the Profile module to extend user profiles.
+; See user_system_info_alter().
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/profile/profile.install b/htmltest/modules/profile/profile.install
new file mode 100644
index 00000000..5e4a17c2
--- /dev/null
+++ b/htmltest/modules/profile/profile.install
@@ -0,0 +1,172 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the profile module.
+ */
+
+/**
+ * Implements hook_uninstall().
+ */
+function profile_uninstall() {
+  variable_del('profile_block_author_fields');
+}
+
+/**
+ * Implements hook_schema().
+ */
+function profile_schema() {
+  $schema['profile_field'] = array(
+    'description' => 'Stores profile field information.',
+    'fields' => array(
+      'fid' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique profile field ID.',
+      ),
+      'title' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => FALSE,
+        'description' => 'Title of the field shown to the end user.',
+      ),
+      'name' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Internal name of the field used in the form HTML and URLs.',
+      ),
+      'explanation' => array(
+        'type' => 'text',
+        'not null' => FALSE,
+        'description' => 'Explanation of the field to end users.',
+      ),
+      'category' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => FALSE,
+        'description' => 'Profile category that the field will be grouped under.',
+      ),
+      'page' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => FALSE,
+        'description' => "Title of page used for browsing by the field's value",
+      ),
+      'type' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => FALSE,
+        'description' => 'Type of form field.',
+      ),
+      'weight' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Weight of field in relation to other profile fields.',
+      ),
+      'required' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'Whether the user is required to enter a value. (0 = no, 1 = yes)',
+      ),
+      'register' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'Whether the field is visible in the user registration form. (1 = yes, 0 = no)',
+      ),
+      'visibility' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'The level of visibility for the field. (0 = hidden, 1 = private, 2 = public on profile but not member list pages, 3 = public on profile and list pages)',
+      ),
+      'autocomplete' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'Whether form auto-completion is enabled. (0 = disabled, 1 = enabled)',
+      ),
+      'options' => array(
+        'type' => 'text',
+        'not null' => FALSE,
+        'description' => 'List of options to be used in a list selection field.',
+      ),
+    ),
+    'indexes' => array(
+      'category' => array('category'),
+    ),
+    'unique keys' => array(
+      'name' => array('name'),
+    ),
+    'primary key' => array('fid'),
+  );
+
+  $schema['profile_value'] = array(
+    'description' => 'Stores values for profile fields.',
+    'fields' => array(
+      'fid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {profile_field}.fid of the field.',
+      ),
+      'uid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {users}.uid of the profile user.',
+      ),
+      'value' => array(
+        'type' => 'text',
+        'not null' => FALSE,
+        'description' => 'The value for the field.',
+      ),
+    ),
+    'primary key' => array('uid', 'fid'),
+    'indexes' => array(
+      'fid' => array('fid'),
+    ),
+    'foreign keys' => array(
+      'profile_field' => array(
+        'table' => 'profile_field',
+        'columns' => array('fid' => 'fid'),
+      ),
+      'profile_user' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid'),
+      ),
+    ),
+  );
+
+  return $schema;
+}
+
+/**
+ * Rename {profile_fields} table to {profile_field} and {profile_values} to {profile_value}.
+ */
+function profile_update_7001() {
+  db_rename_table('profile_fields', 'profile_field');
+  db_rename_table('profile_values', 'profile_value');
+}
+
+/**
+ * Change the weight column to normal int.
+ */
+function profile_update_7002() {
+  db_change_field('profile_field', 'weight', 'weight', array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'description' => 'Weight of field in relation to other profile fields.',
+  ));
+}
diff --git a/htmltest/modules/profile/profile.js b/htmltest/modules/profile/profile.js
new file mode 100644
index 00000000..f262560d
--- /dev/null
+++ b/htmltest/modules/profile/profile.js
@@ -0,0 +1,58 @@
+(function ($) {
+
+/**
+ * Add functionality to the profile drag and drop table.
+ *
+ * This behavior is dependent on the tableDrag behavior, since it uses the
+ * objects initialized in that behavior to update the row. It shows and hides
+ * a warning message when removing the last field from a profile category.
+ */
+Drupal.behaviors.profileDrag = {
+  attach: function (context, settings) {
+    var table = $('#profile-fields');
+    var tableDrag = Drupal.tableDrag['profile-fields']; // Get the profile tableDrag object.
+
+    // Add a handler for when a row is swapped, update empty categories.
+    tableDrag.row.prototype.onSwap = function (swappedRow) {
+      var rowObject = this;
+      $('tr.category-message', table).each(function () {
+        // If the dragged row is in this category, but above the message row, swap it down one space.
+        if ($(this).prev('tr').get(0) == rowObject.element) {
+          // Prevent a recursion problem when using the keyboard to move rows up.
+          if ((rowObject.method != 'keyboard' || rowObject.direction == 'down')) {
+            rowObject.swap('after', this);
+          }
+        }
+        // This category has become empty
+        if ($(this).next('tr').is(':not(.draggable)') || $(this).next('tr').length == 0) {
+          $(this).removeClass('category-populated').addClass('category-empty');
+        }
+        // This category has become populated.
+        else if ($(this).is('.category-empty')) {
+          $(this).removeClass('category-empty').addClass('category-populated');
+        }
+      });
+    };
+
+    // Add a handler so when a row is dropped, update fields dropped into new categories.
+    tableDrag.onDrop = function () {
+      dragObject = this;
+      if ($(dragObject.rowObject.element).prev('tr').is('.category-message')) {
+        var categoryRow = $(dragObject.rowObject.element).prev('tr').get(0);
+        var categoryNum = categoryRow.className.replace(/([^ ]+[ ]+)*category-([^ ]+)-message([ ]+[^ ]+)*/, '$2');
+        var categoryField = $('select.profile-category', dragObject.rowObject.element);
+        var weightField = $('select.profile-weight', dragObject.rowObject.element);
+        var oldcategoryNum = weightField[0].className.replace(/([^ ]+[ ]+)*profile-weight-([^ ]+)([ ]+[^ ]+)*/, '$2');
+
+        if (!categoryField.is('.profile-category-' + categoryNum)) {
+          categoryField.removeClass('profile-category-' + oldcategoryNum).addClass('profile-category-' + categoryNum);
+          weightField.removeClass('profile-weight-' + oldcategoryNum).addClass('profile-weight-' + categoryNum);
+
+          categoryField.val(categoryField[0].options[categoryNum].value);
+        }
+      }
+    };
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/profile/profile.module b/htmltest/modules/profile/profile.module
new file mode 100644
index 00000000..39cf030a
--- /dev/null
+++ b/htmltest/modules/profile/profile.module
@@ -0,0 +1,630 @@
+<?php
+
+/**
+ * @file
+ * Support for configurable user profiles.
+ */
+
+/**
+ * Private field, content only available to privileged users.
+ */
+define('PROFILE_PRIVATE', 1);
+
+/**
+ * Public field, content shown on profile page but not used on member list pages.
+ */
+define('PROFILE_PUBLIC', 2);
+
+/**
+ * Public field, content shown on profile page and on member list pages.
+ */
+define('PROFILE_PUBLIC_LISTINGS', 3);
+
+/**
+ * Hidden profile field, only accessible by administrators, modules and themes.
+ */
+define('PROFILE_HIDDEN', 4);
+
+/**
+ * Implements hook_help().
+ */
+function profile_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#profile':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Profile module allows site administrators to define custom fields (such as country, full name, or age) for user profiles, which are then displayed in the <a href="@user">My Account</a> section. This permits users of a site to share more information about themselves, and can help community-based sites organize users around specific information. For more information, see the online handbook entry for <a href="@profile">Profile module</a>.', array('@user' => url('user'), '@profile' => 'http://drupal.org/documentation/modules/profile/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Adding fields to the default profile') . '</dt>';
+      $output .= '<dd>' . t('To provide the ability for users to enter more information about themselves, the Profile module allows additional fields to be added to the default user profile. Examples of common additions would be <em>Location</em>, <em>Company</em>, <em>Age</em>, or <em>About me</em>.') . '</dd>';
+      $output .= '<dt>' . t('User information pages') . '</dt>';
+      $output .= '<dd>' . t('The Profile module enables links to see further information about site users. You can view both a main <a href="@profile">User list page</a>, and more specified pages by clicking on linked fields in any profile. For example, the <a href="@profile-country">People who live in Canada</a> listing on Drupal.org displays all users who have entered <em>Canada</em> in the <em>Country</em> field on their user profile.', array('@profile' => url('profile'), '@profile-country' => 'http://drupal.org/profile/country/Canada')) . '</dd>';
+      $output .= '<dt>' . t('Author information block') . '</dt>';
+      $output .= '<dd>' . t('The <em>Author information block</em> is a default block created by the Profile module that can be enabled on the <a href="@blocks">Blocks administration page</a>. It shows visitors of your website information about the author of the page they are reading.', array('@blocks' => url('admin/structure/block'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'admin/config/people/profile':
+      return '<p>' . t("This page displays a list of the existing custom profile fields to be displayed on a user's <em>My account</em> page. To provide structure, similar or related fields may be placed inside a category. To add a new category (or edit an existing one), edit a profile field and provide a new category name.") . '</p>';
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function profile_theme() {
+  return array(
+    'profile_block' => array(
+      'variables' => array('account' => NULL, 'fields' => array()),
+      'template' => 'profile-block',
+    ),
+    'profile_listing' => array(
+      'variables' => array('account' => NULL, 'fields' => array()),
+      'template' => 'profile-listing',
+    ),
+    'profile_wrapper' => array(
+      'variables' => array('content' => NULL),
+      'template' => 'profile-wrapper',
+    ),
+    'profile_admin_overview' => array(
+      'render element' => 'form',
+      'file' => 'profile.admin.inc',
+    )
+  );
+}
+
+/**
+ * Implements hook_menu().
+ */
+function profile_menu() {
+  $items['profile'] = array(
+    'title' => 'User list',
+    'page callback' => 'profile_browse',
+    'access arguments' => array('access user profiles'),
+    'file' => 'profile.pages.inc',
+    'type' => MENU_SUGGESTED_ITEM,
+  );
+  $items['admin/config/people/profile'] = array(
+    'title' => 'Profiles',
+    'description' => 'Create customizable fields for your users.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('profile_admin_overview'),
+    'access arguments' => array('administer users'),
+    'file' => 'profile.admin.inc',
+  );
+  $items['admin/config/people/profile/add'] = array(
+    'title' => 'Add field',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('profile_field_form'),
+    'access arguments' => array('administer users'),
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+    'file' => 'profile.admin.inc',
+  );
+  $items['admin/config/people/profile/autocomplete'] = array(
+    'title' => 'Profile category autocomplete',
+    'page callback' => 'profile_admin_settings_autocomplete',
+    'access arguments' => array('administer users'),
+    'file' => 'profile.admin.inc',
+    'type' => MENU_CALLBACK,
+  );
+  $items['admin/config/people/profile/edit'] = array(
+    'title' => 'Edit field',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('profile_field_form'),
+    'access arguments' => array('administer users'),
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+    'file' => 'profile.admin.inc',
+  );
+  $items['admin/config/people/profile/delete'] = array(
+    'title' => 'Delete field',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('profile_field_delete'),
+    'access arguments' => array('administer users'),
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+    'file' => 'profile.admin.inc',
+  );
+  $items['profile/autocomplete'] = array(
+    'title' => 'Profile autocomplete',
+    'page callback' => 'profile_autocomplete',
+    'access arguments' => array('access user profiles'),
+    'file' => 'profile.pages.inc',
+    'type' => MENU_CALLBACK,
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_block_info().
+ */
+ function profile_block_info() {
+  $blocks['author-information']['info'] = t('Author information');
+  $blocks['author-information']['cache'] = DRUPAL_CACHE_PER_PAGE | DRUPAL_CACHE_PER_ROLE;
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_configure().
+ */
+function profile_block_configure($delta = '') {
+  // Compile a list of fields to show
+  $fields = array();
+  $result = db_query('SELECT name, title, weight, visibility FROM {profile_field} WHERE visibility IN (:visibility) ORDER BY weight', array(':visibility' => array(PROFILE_PUBLIC, PROFILE_PUBLIC_LISTINGS)));
+  foreach ($result as $record) {
+    $fields[$record->name] = check_plain($record->title);
+  }
+  $fields['user_profile'] = t('Link to full user profile');
+  $form['profile_block_author_fields'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Profile fields to display'),
+    '#default_value' => variable_get('profile_block_author_fields', array()),
+    '#options' => $fields,
+    '#description' => t('Select which profile fields you wish to display in the block. Only fields designated as public in the <a href="@profile-admin">profile field configuration</a> are available.', array('@profile-admin' => url('admin/config/people/profile'))),
+  );
+  return $form;
+}
+
+/**
+ * Implements hook_block_save().
+ */
+function profile_block_save($delta = '', $edit = array()) {
+  variable_set('profile_block_author_fields', $edit['profile_block_author_fields']);
+}
+
+/**
+ * Implements hook_block_view().
+ */
+function profile_block_view($delta = '') {
+  if (user_access('access user profiles')) {
+    $output = '';
+    if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == NULL) {
+      $node = node_load(arg(1));
+      $account = user_load($node->uid);
+
+      if ($use_fields = variable_get('profile_block_author_fields', array())) {
+        // Compile a list of fields to show.
+        $fields = array();
+        $result = db_query('SELECT * FROM {profile_field} WHERE visibility IN (:visibility) ORDER BY weight', array(':visibility' => array(PROFILE_PUBLIC, PROFILE_PUBLIC_LISTINGS)));
+        foreach ($result as $record) {
+          // Ensure that field is displayed only if it is among the defined block fields and, if it is private, the user has appropriate permissions.
+          if (isset($use_fields[$record->name]) && $use_fields[$record->name]) {
+            $fields[] = $record;
+          }
+        }
+      }
+
+      if (!empty($fields)) {
+        $profile = _profile_update_user_fields($fields, $account);
+        $output .= theme('profile_block', array('account' => $account, 'fields' => $profile));
+      }
+
+      if (isset($use_fields['user_profile']) && $use_fields['user_profile']) {
+        $output .= '<div>' . l(t('View full user profile'), 'user/' . $account->uid) . '</div>';
+      }
+    }
+
+    if ($output) {
+      $block['subject'] = t('About %name', array('%name' => format_username($account)));
+      $block['content'] = $output;
+      return $block;
+    }
+  }
+}
+
+/**
+ * Implements hook_user_presave().
+ */
+function profile_user_presave(&$edit, $account, $category) {
+  if (!empty($account->uid)) {
+    profile_save_profile($edit, $account, $category);
+  }
+}
+
+/**
+ * Implements hook_user_insert().
+ */
+function profile_user_insert(&$edit, $account, $category) {
+  profile_save_profile($edit, $account, $category, TRUE);
+}
+
+/**
+ * Implements hook_user_cancel().
+ */
+function profile_user_cancel($edit, $account, $method) {
+  switch ($method) {
+    case 'user_cancel_reassign':
+      db_delete('profile_value')
+        ->condition('uid', $account->uid)
+        ->execute();
+  }
+}
+
+/**
+ * Implements hook_user_delete().
+ */
+function profile_user_delete($account) {
+  db_delete('profile_value')
+    ->condition('uid', $account->uid)
+    ->execute();
+}
+
+/**
+ * Implements hook_user_load().
+ */
+function profile_user_load($users) {
+  $result = db_query('SELECT f.name, f.type, v.uid, v.value FROM {profile_field} f INNER JOIN {profile_value} v ON f.fid = v.fid WHERE uid IN (:uids)', array(':uids' => array_keys($users)));
+  foreach ($result as $record) {
+    if (empty($users[$record->uid]->{$record->name})) {
+      $users[$record->uid]->{$record->name} = _profile_field_serialize($record->type) ? unserialize($record->value) : $record->value;
+    }
+  }
+}
+
+function profile_save_profile(&$edit, $account, $category, $register = FALSE) {
+  $result = _profile_get_fields($category, $register);
+  foreach ($result as $field) {
+    if (_profile_field_serialize($field->type)) {
+      $edit[$field->name] = serialize($edit[$field->name]);
+    }
+    db_merge('profile_value')
+      ->key(array(
+        'fid' => $field->fid,
+        'uid' => $account->uid,
+      ))
+      ->fields(array('value' => $edit[$field->name]))
+      ->execute();
+  }
+}
+
+function profile_view_field($account, $field) {
+  // Only allow browsing of private fields for admins, if browsing is enabled,
+  // and if a user has permission to view profiles. Note that this check is
+  // necessary because a user may always see their own profile.
+  $browse = user_access('access user profiles')
+        && (user_access('administer users') || $field->visibility != PROFILE_PRIVATE)
+        && !empty($field->page);
+
+  if (isset($account->{$field->name}) && $value = $account->{$field->name}) {
+    switch ($field->type) {
+      case 'textarea':
+        return check_markup($value, filter_default_format($account), '', TRUE);
+      case 'textfield':
+      case 'selection':
+        return $browse ? l($value, 'profile/' . $field->name . '/' . $value) : check_plain($value);
+      case 'checkbox':
+        return $browse ? l($field->title, 'profile/' . $field->name) : check_plain($field->title);
+      case 'url':
+        return '<a href="' . check_url($value) . '">' . check_plain($value) . '</a>';
+      case 'date':
+        $format = substr(variable_get('date_format_short', 'm/d/Y - H:i'), 0, 5);
+        // Note: Avoid PHP's date() because it does not handle dates before
+        // 1970 on Windows. This would make the date field useless for e.g.
+        // birthdays.
+        $replace = array(
+          'd' => sprintf('%02d', $value['day']),
+          'j' => $value['day'],
+          'm' => sprintf('%02d', $value['month']),
+          'M' => map_month($value['month']),
+          'Y' => $value['year'],
+          'H:i' => NULL,
+          'g:ia' => NULL,
+        );
+        return strtr($format, $replace);
+      case 'list':
+        $values = preg_split("/[,\n\r]/", $value);
+        $fields = array();
+        foreach ($values as $value) {
+          if ($value = trim($value)) {
+            $fields[] = $browse ? l($value, 'profile/' . $field->name . '/' . $value) : check_plain($value);
+          }
+        }
+        return implode(', ', $fields);
+    }
+  }
+}
+
+/**
+ * Implements hook_user_view().
+ */
+function profile_user_view($account) {
+  // Show private fields to administrators and people viewing their own account.
+  if (user_access('administer users') || $GLOBALS['user']->uid == $account->uid) {
+    $result = db_query('SELECT * FROM {profile_field} WHERE visibility <> :hidden ORDER BY category, weight', array(':hidden' => PROFILE_HIDDEN));
+  }
+  else {
+    $result = db_query('SELECT * FROM {profile_field} WHERE visibility <> :private AND visibility <> :hidden ORDER BY category, weight', array(':private' => PROFILE_PRIVATE, ':hidden' => PROFILE_HIDDEN));
+  }
+
+  $fields = array();
+  foreach ($result as $field) {
+    if ($value = profile_view_field($account, $field)) {
+      $title = ($field->type != 'checkbox') ? check_plain($field->title) : NULL;
+
+      // Create a single fieldset for each category.
+      if (!isset($account->content[$field->category])) {
+        $account->content[$field->category] = array(
+          '#type' => 'user_profile_category',
+          '#title' => $field->category,
+        );
+      }
+
+      $account->content[$field->category][$field->name] = array(
+        '#type' => 'user_profile_item',
+        '#title' => $title,
+        '#markup' => $value,
+        '#weight' => $field->weight,
+        '#attributes' => array('class' => array('profile-' . $field->name)),
+      );
+    }
+  }
+}
+
+function _profile_form_explanation($field) {
+  $output = filter_xss_admin($field->explanation);
+
+  if ($field->type == 'list') {
+    $output .= ' ' . t('Put each item on a separate line or separate them by commas. No HTML allowed.');
+  }
+
+  if ($field->visibility == PROFILE_PRIVATE) {
+    $output .= ' ' . t('The content of this field is kept private and will not be shown publicly.');
+  }
+
+  return $output;
+}
+
+/**
+ * Implements hook_form_alter().
+ */
+function profile_form_alter(&$form, &$form_state, $form_id) {
+  if (!($form_id == 'user_register_form' || $form_id == 'user_profile_form')) {
+    return;
+  }
+  $form['#validate'][] = 'profile_user_form_validate';
+  $account = $form['#user'];
+  $result = _profile_get_fields($form['#user_category'], $form['#user_category'] == 'register');
+  $weight = 1;
+  foreach ($result as $field) {
+    $category = $field->category;
+    if (!isset($form[$category])) {
+      $form[$category] = array('#type' => 'fieldset', '#title' => check_plain($category), '#weight' => $weight++);
+    }
+    switch ($field->type) {
+      case 'textfield':
+      case 'url':
+        $form[$category][$field->name] = array(
+          '#type' => 'textfield',
+          '#title' => check_plain($field->title),
+          '#default_value' => isset($account->{$field->name}) ? $account->{$field->name} : '',
+          '#maxlength' => 255,
+          '#description' => _profile_form_explanation($field),
+          '#required' => $field->required,
+        );
+        if ($field->autocomplete) {
+          $form[$category][$field->name]['#autocomplete_path'] = "profile/autocomplete/" . $field->fid;
+        }
+        break;
+
+      case 'textarea':
+        $form[$category][$field->name] = array(
+          '#type' => 'textarea',
+          '#title' => check_plain($field->title),
+          '#default_value' => isset($account->{$field->name}) ? $account->{$field->name} : '',
+          '#description' => _profile_form_explanation($field),
+          '#required' => $field->required,
+        );
+        break;
+
+      case 'list':
+        $form[$category][$field->name] = array(
+          '#type' => 'textarea',
+          '#title' => check_plain($field->title),
+          '#default_value' => isset($account->{$field->name}) ? $account->{$field->name} : '',
+          '#description' => _profile_form_explanation($field),
+          '#required' => $field->required,
+        );
+        break;
+
+      case 'checkbox':
+        $form[$category][$field->name] = array(
+          '#type' => 'checkbox',
+          '#title' => check_plain($field->title),
+          '#default_value' => isset($account->{$field->name}) ? $account->{$field->name} : '',
+          '#description' => _profile_form_explanation($field),
+          '#required' => $field->required,
+        );
+        break;
+
+      case 'selection':
+        $options = array();
+        $lines = preg_split("/[\n\r]/", $field->options);
+        foreach ($lines as $line) {
+          if ($line = trim($line)) {
+            $options[$line] = $line;
+          }
+        }
+        $form[$category][$field->name] = array(
+          '#type' => 'select',
+          '#title' => check_plain($field->title),
+          '#default_value' => isset($account->{$field->name}) ? $account->{$field->name} : '',
+          '#options' => $options,
+          '#description' => _profile_form_explanation($field),
+          '#required' => $field->required,
+          '#empty_value' => 0,
+        );
+        break;
+
+      case 'date':
+        $form[$category][$field->name] = array(
+          '#type' => 'date',
+          '#title' => check_plain($field->title),
+          '#default_value' => isset($account->{$field->name}) ? $account->{$field->name} : '',
+          '#description' => _profile_form_explanation($field),
+          '#required' => $field->required,
+        );
+        break;
+    }
+  }
+}
+
+/**
+ * Helper function: update an array of user fields by calling profile_view_field
+ */
+function _profile_update_user_fields($fields, $account) {
+  foreach ($fields as $key => $field) {
+    $fields[$key]->value = profile_view_field($account, $field);
+  }
+  return $fields;
+}
+
+/**
+ * Form validation handler for the user register/profile form.
+ *
+ * @see profile_form_alter()
+ */
+function profile_user_form_validate($form, &$form_state) {
+  $result = _profile_get_fields($form['#user_category'], $form['#user_category'] == 'register');
+  foreach ($result as $field) {
+    if (!empty($form_state['values'][$field->name])) {
+      if ($field->type == 'url' && !valid_url($form_state['values'][$field->name], TRUE)) {
+        form_set_error($field->name, t('The value provided for %field is not a valid URL.', array('%field' => $field->title)));
+      }
+    }
+    elseif ($field->required && !user_access('administer users')) {
+      form_set_error($field->name, t('The field %field is required.', array('%field' => $field->title)));
+    }
+  }
+}
+
+/**
+ * Implements hook_user_categories().
+ */
+function profile_user_categories() {
+  $result = db_query("SELECT DISTINCT(category) FROM {profile_field}");
+  $data = array();
+  foreach ($result as $category) {
+    $data[] = array(
+      'name' => $category->category,
+      'title' => $category->category,
+      'weight' => 3,
+      'access callback' => 'profile_category_access',
+      'access arguments' => array(1, $category->category)
+    );
+  }
+  return $data;
+}
+
+/**
+ * Menu item access callback - check if a user has access to a profile category.
+ */
+function profile_category_access($account, $category) {
+  if (user_access('administer users') && $account->uid > 0) {
+    return TRUE;
+  }
+  else {
+    $category_visible = (bool) db_query_range('SELECT 1 FROM {profile_field} WHERE category = :category AND visibility <> :visibility', 0, 1, array(
+      ':category' => $category,
+      ':visibility' => PROFILE_HIDDEN
+    ))->fetchField();
+    return user_edit_access($account) && $category_visible;
+  }
+}
+
+/**
+ * Process variables for profile-block.tpl.php.
+ *
+ * The $variables array contains the following arguments:
+ * - $account
+ * - $fields
+ *
+ * @see profile-block.tpl.php
+ */
+function template_preprocess_profile_block(&$variables) {
+
+  $variables['user_picture'] = theme('user_picture', array('account' => $variables['account']));
+  $variables['profile'] = array();
+  // Supply filtered version of $fields that have values.
+  foreach ($variables['fields'] as $field) {
+    if ($field->value) {
+      $variables['profile'][$field->name] = new stdClass();
+      $variables['profile'][$field->name]->title = check_plain($field->title);
+      $variables['profile'][$field->name]->value = $field->value;
+      $variables['profile'][$field->name]->type = $field->type;
+    }
+  }
+
+}
+
+/**
+ * Process variables for profile-listing.tpl.php.
+ *
+ * The $variables array contains the following arguments:
+ * - $account
+ * - $fields
+ *
+ * @see profile-listing.tpl.php
+ */
+function template_preprocess_profile_listing(&$variables) {
+
+  $variables['user_picture'] = theme('user_picture', array('account' => $variables['account']));
+  $variables['name'] = theme('username', array('account' => $variables['account']));
+  $variables['profile'] = array();
+  // Supply filtered version of $fields that have values.
+  foreach ($variables['fields'] as $field) {
+    if ($field->value) {
+      $variables['profile'][$field->name] = new stdClass();
+      $variables['profile'][$field->name]->title = $field->title;
+      $variables['profile'][$field->name]->value = $field->value;
+      $variables['profile'][$field->name]->type = $field->type;
+    }
+  }
+
+}
+
+/**
+ * Process variables for profile-wrapper.tpl.php.
+ *
+ * The $variables array contains the following arguments:
+ * - $content
+ *
+ * @see profile-wrapper.tpl.php
+ */
+function template_preprocess_profile_wrapper(&$variables) {
+  $variables['current_field'] = '';
+  if ($field = arg(1)) {
+    $variables['current_field'] = $field;
+    $variables['theme_hook_suggestions'][] = 'profile_wrapper__' . $field;
+  }
+}
+
+function _profile_field_types($type = NULL) {
+  $types = array('textfield' => t('single-line textfield'),
+                 'textarea' => t('multi-line textfield'),
+                 'checkbox' => t('checkbox'),
+                 'selection' => t('list selection'),
+                 'list' => t('freeform list'),
+                 'url' => t('URL'),
+                 'date' => t('date'));
+  return isset($type) ? $types[$type] : $types;
+}
+
+function _profile_field_serialize($type = NULL) {
+  return $type == 'date';
+}
+
+function _profile_get_fields($category, $register = FALSE) {
+  $query = db_select('profile_field');
+  if ($register) {
+    $query->condition('register', 1);
+  }
+  else {
+    $query->condition('category', db_like($category), 'LIKE');
+  }
+  if (!user_access('administer users')) {
+    $query->condition('visibility', PROFILE_HIDDEN, '<>');
+  }
+  return $query
+    ->fields('profile_field')
+    ->orderBy('category', 'ASC')
+    ->orderBy('weight', 'ASC')
+    ->execute();
+}
diff --git a/htmltest/modules/profile/profile.pages.inc b/htmltest/modules/profile/profile.pages.inc
new file mode 100644
index 00000000..056015a3
--- /dev/null
+++ b/htmltest/modules/profile/profile.pages.inc
@@ -0,0 +1,136 @@
+<?php
+
+/**
+ * @file
+ * User page callbacks for the profile module.
+ */
+
+/**
+ * Menu callback; display a list of user information.
+ */
+function profile_browse() {
+  // Ensure that the path is converted to 3 levels always.
+  list(, $name, $value) = array_pad(explode('/', $_GET['q'], 3), 3, '');
+
+  $field = db_query("SELECT DISTINCT(fid), type, title, page, visibility FROM {profile_field} WHERE name = :name", array(':name' => $name))->fetchObject();
+
+  if ($name && $field->fid) {
+    // Only allow browsing of fields that have a page title set.
+    if (empty($field->page)) {
+      return MENU_NOT_FOUND;
+    }
+    // Do not allow browsing of private and hidden fields by non-admins.
+    if (!user_access('administer users') && ($field->visibility == PROFILE_PRIVATE || $field->visibility == PROFILE_HIDDEN)) {
+      return MENU_ACCESS_DENIED;
+    }
+
+    // Compile a list of fields to show.
+    $fields = db_query('SELECT name, title, type, weight, page, visibility FROM {profile_field} WHERE fid <> :fid AND visibility = :visibility ORDER BY weight', array(
+      ':fid' => $field->fid,
+      ':visibility' => PROFILE_PUBLIC_LISTINGS,
+    ))->fetchAll();
+
+    $query = db_select('users', 'u')->extend('PagerDefault');
+    $query->join('profile_value', 'v', 'u.uid = v.uid');
+    $query
+      ->fields('u', array('uid', 'access'))
+      ->condition('v.fid', $field->fid)
+      ->condition('u.status', 0, '<>')
+      ->orderBy('u.access', 'DESC');
+
+    // Determine what query to use:
+    $arguments = array($field->fid);
+    switch ($field->type) {
+      case 'checkbox':
+        $query->condition('v.value', 1);
+        break;
+      case 'textfield':
+      case 'selection':
+        $query->condition('v.value', $value);
+        break;
+      case 'list':
+        $query->condition('v.value', '%' . db_like($value) . '%', 'LIKE');
+        break;
+      default:
+        return MENU_NOT_FOUND;
+    }
+
+    $uids = $query
+      ->limit(20)
+      ->execute()
+      ->fetchCol();
+
+    // Load the users.
+    $users = user_load_multiple($uids);
+
+    $content = '';
+    foreach ($users as $account) {
+      $profile = _profile_update_user_fields($fields, $account);
+      $content .= theme('profile_listing', array('account' => $account, 'fields' => $profile));
+    }
+    $output = theme('profile_wrapper', array('content' => $content));
+    $output .= theme('pager');
+
+    if ($field->type == 'selection' || $field->type == 'list' || $field->type == 'textfield') {
+      $title = strtr(check_plain($field->page), array('%value' => drupal_placeholder($value)));
+    }
+    else {
+      $title = check_plain($field->page);
+    }
+
+    drupal_set_title($title, PASS_THROUGH);
+    return $output;
+  }
+  elseif ($name && !$field->fid) {
+    return MENU_NOT_FOUND;
+  }
+  else {
+    // Compile a list of fields to show.
+    $fields = db_query('SELECT name, title, type, weight, page, visibility FROM {profile_field} WHERE visibility = :visibility ORDER BY category, weight', array(':visibility' => PROFILE_PUBLIC_LISTINGS))->fetchAll();
+
+    // Extract the affected users:
+    $query = db_select('users', 'u')->extend('PagerDefault');
+    $uids = $query
+      ->fields('u', array('uid', 'access'))
+      ->condition('u.uid', 0, '>')
+      ->condition('u.status', 0, '>')
+      ->orderBy('u.access', 'DESC')
+      ->limit(20)
+      ->execute()
+      ->fetchCol();
+    $users = user_load_multiple($uids);
+    $content = '';
+    foreach ($users as $account) {
+      $profile = _profile_update_user_fields($fields, $account);
+      $content .= theme('profile_listing', array('account' => $account, 'fields' => $profile));
+    }
+    $output = theme('profile_wrapper', array('content' => $content));
+    $output .= theme('pager');
+
+    drupal_set_title(t('User list'));
+    return $output;
+  }
+}
+
+/**
+ * Callback to allow autocomplete of profile text fields.
+ */
+function profile_autocomplete($field, $string) {
+  $matches = array();
+  $autocomplete_field = (bool) db_query_range("SELECT 1 FROM {profile_field} WHERE fid = :fid AND autocomplete = 1", 0, 1, array(':fid' => $field))->fetchField();
+  if ($autocomplete_field) {
+    $values = db_select('profile_value')
+      ->fields('profile_value', array('value'))
+      ->condition('fid', $field)
+      ->condition('value', db_like($string) . '%', 'LIKE')
+      ->groupBy('value')
+      ->orderBy('value')
+      ->range(0, 10)
+      ->execute()->fetchCol();
+    foreach ($values as $value) {
+      $matches[$value] = check_plain($value);
+    }
+  }
+
+  drupal_json_output($matches);
+}
diff --git a/htmltest/modules/profile/profile.test b/htmltest/modules/profile/profile.test
new file mode 100644
index 00000000..42a1a42d
--- /dev/null
+++ b/htmltest/modules/profile/profile.test
@@ -0,0 +1,530 @@
+<?php
+
+/**
+ * @file
+ * Tests for profile.module.
+ */
+
+/**
+ * A class for common methods for testing profile fields.
+ */
+class ProfileTestCase extends DrupalWebTestCase {
+  protected $admin_user;
+  protected $normal_user;
+
+  function setUp() {
+    parent::setUp('profile');
+    variable_set('user_register', USER_REGISTER_VISITORS);
+
+    $this->admin_user = $this->drupalCreateUser(array('administer users', 'access user profiles', 'administer blocks'));
+
+    // This is the user whose profile will be edited.
+    $this->normal_user = $this->drupalCreateUser();
+  }
+
+  /**
+   * Create a profile field.
+   *
+   * @param $type
+   *   The field type to be created.
+   * @param $category
+   *   The category in which the field should be created.
+   * @param $edit
+   *   Additional parameters to be submitted.
+   * @return
+   *   The fid of the field that was just created.
+   */
+  function createProfileField($type = 'textfield', $category = 'simpletest', $edit = array()) {
+    $edit['title'] = $title = $this->randomName(8);
+    $edit['name'] = $form_name = 'profile_' . $title;
+    $edit['category'] = $category;
+    $edit['explanation'] = $this->randomName(50);
+
+    $this->drupalPost('admin/config/people/profile/add/' . $type, $edit, t('Save field'));
+    $fid = db_query("SELECT fid FROM {profile_field} WHERE title = :title", array(':title' => $title))->fetchField();
+    $this->assertTrue($fid, 'New Profile field has been entered in the database');
+
+    // Check that the new field is appearing on the user edit form.
+    $this->drupalGet('user/' . $this->admin_user->uid . '/edit/' . $category);
+
+    // Checking field.
+    if ($type == 'date') {
+      $this->assertField($form_name . '[month]', 'Found month selection field');
+      $this->assertField($form_name . '[day]', 'Found day selection field');
+      $this->assertField($form_name . '[year]', 'Found day selection field');
+    }
+    else {
+      $this->assertField($form_name , format_string('Found form named @name', array('@name' => $form_name)));
+    }
+
+    // Checking name.
+    $this->assertText($title, format_string('Checking title for field %title', array('%title' => $title)));
+    // Checking explanation.
+    $this->assertText($edit['explanation'], format_string('Checking explanation for field %title', array('%title' => $title)));
+
+    return array(
+      'fid' => $fid,
+      'type' => $type,
+      'form_name' => $form_name,
+      'title' => $title,
+      'category' => $category,
+    );
+  }
+
+  /**
+   * Update a profile field.
+   *
+   * @param $fid
+   *   The fid of the field to be updated.
+   * @param $type
+   *   The type of field to be updated.
+   * @param $edit
+   *   Field parameters to be submitted.
+   * @return
+   *   Array representation of the updated field.
+   */
+  function updateProfileField($fid, $type = 'textfield', $edit = array()) {
+
+    $form_name = $edit['name'];
+    $title = $edit['title'];
+    $category = $edit['category'];
+
+    $this->drupalPost('admin/config/people/profile/edit/' . $fid, $edit, t('Save field'));
+
+    // Check that the updated field is appearing on the user edit form.
+    $this->drupalGet('user/' . $this->admin_user->uid . '/edit/' . $category);
+
+    // Checking field.
+    if ($type == 'date') {
+      $this->assertField($form_name . '[month]', 'Found month selection field');
+      $this->assertField($form_name . '[day]', 'Found day selection field');
+      $this->assertField($form_name . '[year]', 'Found day selection field');
+    }
+    else {
+      $this->assertField($form_name , format_string('Found form named @name', array('@name' => $form_name)));
+    }
+
+    // Checking name.
+    $this->assertText($title, format_string('Checking title for field %title', array('%title' => $title)));
+    // Checking explanation.
+    $this->assertText($edit['explanation'], format_string('Checking explanation for field %title', array('%title' => $title)));
+
+    return array(
+      'fid' => $fid,
+      'type' => $type,
+      'form_name' => $form_name,
+      'title' => $title,
+      'category' => $category,
+    );
+  }
+
+  /**
+   * Set the profile field to a random value
+   *
+   * @param $field
+   *   The field that should be set.
+   * @param $value
+   *   The value for the field, defaults to a random string.
+   * @return
+   *   The value that has been assigned to
+   */
+  function setProfileField($field, $value = NULL) {
+
+    if (!isset($value)) {
+      $value = $this->randomName();
+    }
+
+    $edit = array(
+      $field['form_name'] => $value,
+    );
+    $this->drupalPost('user/' . $this->normal_user->uid . '/edit/' . $field['category'], $edit, t('Save'));
+
+    // Check profile page.
+    $content = $this->drupalGet('user/' . $this->normal_user->uid);
+    $this->assertText($field['title'], format_string('Found profile field with title %title', array('%title' => $field['title'])));
+
+    if ($field['type'] != 'checkbox') {
+      // $value must be cast to a string in order to be found by assertText.
+      $this->assertText("$value", format_string('Found profile field with value %value', array('%value' => $value)));
+    }
+
+    return $value;
+  }
+
+  /**
+   * Delete a profile field.
+   *
+   * @param $field
+   *   The field to be deleted.
+   */
+  function deleteProfileField($field) {
+    $this->drupalPost('admin/config/people/profile/delete/' . $field['fid'], array(), t('Delete'));
+    $this->drupalGet('admin/config/people/profile');
+    $this->assertNoText($field['title'], format_string('Checking deleted field %title', array('%title' => $field['title'])));
+  }
+}
+
+class ProfileTestFields extends ProfileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Test single fields',
+      'description' => 'Testing profile module with add/edit/delete textfield, textarea, list, checkbox, and url fields into profile page',
+      'group' => 'Profile'
+    );
+  }
+
+  /**
+   * Test each of the field types. List selection and date fields are tested
+   * separately because they need some special handling.
+   */
+  function testProfileFields() {
+    $this->drupalLogin($this->admin_user);
+
+    // Set test values for every field type.
+    $field_types = array(
+      'textfield' => $this->randomName(),
+      'textarea' => $this->randomName(),
+      'list' => $this->randomName(),
+      'checkbox' => 1,
+      // An underscore is an invalid character in a domain name. The method randomName can
+      // return an underscore.
+      'url' => 'http://www.' . str_replace('_', '', $this->randomName(10)) . '.org',
+    );
+
+    // For each field type, create a field, give it a value, update the field,
+    // and delete the field.
+    foreach ($field_types as $type => $value) {
+      $field = $this->createProfileField($type);
+      $this->setProfileField($field, $value);
+      $edit = array(
+        'name' => $field['form_name'],
+        'title' => $this->randomName(),
+        'category' => $field['category'],
+        'explanation' => $this->randomName(),
+      );
+      $field = $this->updateProfileField($field['fid'], $field['type'], $edit);
+      $this->deleteProfileField($field);
+    }
+  }
+}
+
+class ProfileTestSelect extends ProfileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Test select field',
+      'description' => 'Testing profile module with add/edit/delete a select field',
+      'group' => 'Profile'
+    );
+  }
+
+  /**
+   * Create a list selection field, give it a value, update and delete the field.
+   */
+  function testProfileSelectionField() {
+    $this->drupalLogin($this->admin_user);
+
+    $edit = array(
+      'options' => implode("\n", range(1, 10)),
+    );
+    $field = $this->createProfileField('selection', 'simpletest', $edit);
+
+    $this->setProfileField($field, rand(1, 10));
+
+    $edit = array(
+      'name' => $field['form_name'],
+      'title' => $this->randomName(),
+      'category' => $field['category'],
+      'explanation' => $this->randomName(),
+    );
+    $field = $this->updateProfileField($field['fid'], $field['type'], $edit);
+    $this->deleteProfileField($field);
+  }
+}
+
+class ProfileTestDate extends ProfileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Test date field',
+      'description' => 'Testing profile module with add/edit/delete a date field',
+      'group' => 'Profile'
+    );
+  }
+
+  /**
+   * Create a date field, give it a value, update and delete the field.
+   */
+  function testProfileDateField() {
+    $this->drupalLogin($this->admin_user);
+
+    variable_set('date_format_short', 'm/d/Y - H:i');
+    $field = $this->createProfileField('date');
+
+    // Set date to January 09, 1983
+    $edit = array(
+      $field['form_name'] . '[month]' => 1,
+      $field['form_name'] . '[day]' => 9,
+      $field['form_name'] . '[year]' => 1983,
+    );
+
+    $this->drupalPost('user/' . $this->normal_user->uid . '/edit/' . $field['category'], $edit, t('Save'));
+
+    // Check profile page.
+    $this->drupalGet('user/' . $this->normal_user->uid);
+    $this->assertText($field['title'], format_string('Found profile field with title %title', array('%title' => $field['title'])));
+
+    $this->assertText('01/09/1983', 'Found date profile field.');
+
+    $edit = array(
+      'name' => $field['form_name'],
+      'title' => $this->randomName(),
+      'category' => $field['category'],
+      'explanation' => $this->randomName(),
+    );
+    $field = $this->updateProfileField($field['fid'], $field['type'], $edit);
+    $this->deleteProfileField($field);
+  }
+}
+
+class ProfileTestWeights extends ProfileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Test field weights',
+      'description' => 'Testing profile modules weigting of fields',
+      'group' => 'Profile'
+    );
+  }
+
+  function testProfileFieldWeights() {
+    $this->drupalLogin($this->admin_user);
+
+    $category = $this->randomName();
+    $field1 = $this->createProfileField('textfield', $category, array('weight' => 1));
+    $field2 = $this->createProfileField('textfield', $category, array('weight' => -1));
+
+    $this->setProfileField($field1, $this->randomName(8));
+    $this->setProfileField($field2, $this->randomName(8));
+
+    $profile_edit = $this->drupalGet('user/' . $this->normal_user->uid . '/edit/' . $category);
+    $this->assertTrue(strpos($profile_edit, $field1['title']) > strpos($profile_edit, $field2['title']), 'Profile field weights are respected on the user edit form.');
+
+    $profile_page = $this->drupalGet('user/' . $this->normal_user->uid);
+    $this->assertTrue(strpos($profile_page, $field1['title']) > strpos($profile_page, $field2['title']), 'Profile field weights are respected on the user profile page.');
+  }
+}
+
+/**
+ * Test profile field autocompletion and access.
+ */
+class ProfileTestAutocomplete extends ProfileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Autocompletion',
+      'description' => 'Test profile fields with autocompletion.',
+      'group' => 'Profile'
+    );
+  }
+
+  /**
+   * Tests profile field autocompletion and access.
+   */
+  function testAutocomplete() {
+    $this->drupalLogin($this->admin_user);
+
+    // Create a new profile field with autocompletion enabled.
+    $category = $this->randomName();
+    $field = $this->createProfileField('textfield', $category, array('weight' => 1, 'autocomplete' => 1));
+
+    // Enter profile field value.
+    $field['value'] = $this->randomName();
+    $this->setProfileField($field, $field['value']);
+
+    // Set some html for what we want to see in the page output later.
+    $autocomplete_html = '<input type="hidden" id="' . drupal_html_id('edit-' . $field['form_name'] . '-autocomplete') . '" value="' . url('profile/autocomplete/' . $field['fid'], array('absolute' => TRUE)) . '" disabled="disabled" class="autocomplete" />';
+    $field_html = '<input type="text" maxlength="255" name="' . $field['form_name'] . '" id="' . drupal_html_id('edit-' . $field['form_name']) . '" size="60" value="' . $field['value'] . '" class="form-text form-autocomplete required" />';
+
+    // Check that autocompletion html is found on the user's profile edit page.
+    $this->drupalGet('user/' . $this->admin_user->uid . '/edit/' . $category);
+    $this->assertRaw($autocomplete_html, 'Autocomplete found.');
+    $this->assertRaw('misc/autocomplete.js', 'Autocomplete JavaScript found.');
+    $this->assertRaw('class="form-text form-autocomplete"', 'Autocomplete form element class found.');
+
+    // Check the autocompletion path using the first letter of our user's profile
+    // field value to make sure access is allowed and a valid result if found.
+    $this->drupalGet('profile/autocomplete/' . $field['fid'] . '/' . $field['value'][0]);
+    $this->assertResponse(200, 'Autocomplete path allowed to user with permission.');
+    $this->assertRaw($field['value'], 'Autocomplete value found.');
+
+    // Logout and login with a user without the 'access user profiles' permission.
+    $this->drupalLogout();
+    $this->drupalLogin($this->normal_user);
+
+    // Check that autocompletion html is not found on the user's profile edit page.
+    $this->drupalGet('user/' . $this->normal_user->uid . '/edit/' . $category);
+    $this->assertNoRaw($autocomplete_html, 'Autocomplete not found.');
+
+    // User should be denied access to the profile autocomplete path.
+    $this->drupalGet('profile/autocomplete/' . $field['fid'] . '/' . $field['value'][0]);
+    $this->assertResponse(403, 'Autocomplete path denied to user without permission.');
+  }
+}
+
+class ProfileBlockTestCase extends ProfileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Block availability',
+      'description' => 'Check if the Author Information block is available.',
+      'group' => 'Profile',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Login the admin user.
+    $this->drupalLogin($this->admin_user);
+
+    // Create two fields.
+    $category = $this->randomName();
+    $this->field1 = $this->createProfileField('textfield', $category, array('weight' => 0));
+    $this->field2 = $this->createProfileField('textfield', $category, array('weight' => 1));
+
+    // Assign values to those fields.
+    $this->value1 = $this->setProfileField($this->field1);
+    $this->value2 = $this->setProfileField($this->field2);
+
+    // Create a node authored by the normal user.
+    $this->node = $this->drupalCreateNode(array(
+      'uid' => $this->normal_user->uid,
+    ));
+  }
+
+  function testAuthorInformationBlock() {
+    // Set the block to a region to confirm the block is available.
+    $edit = array();
+    $edit['blocks[profile_author-information][region]'] = 'footer';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->assertText(t('The block settings have been updated.'), 'Block successfully move to footer region.');
+
+    // Enable field 1.
+    $this->drupalPost('admin/structure/block/manage/profile/author-information/configure', array(
+      'profile_block_author_fields[' . $this->field1['form_name'] . ']' => TRUE,
+    ), t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), 'Block configuration set.');
+
+    // Visit the node and confirm that the field is displayed.
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->assertRaw($this->value1, 'Field 1 is displayed');
+    $this->assertNoRaw($this->value2, 'Field 2 is not displayed');
+
+    // Enable only field 2.
+    $this->drupalPost('admin/structure/block/manage/profile/author-information/configure', array(
+      'profile_block_author_fields[' . $this->field1['form_name'] . ']' => FALSE,
+      'profile_block_author_fields[' . $this->field2['form_name'] . ']' => TRUE,
+    ), t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), 'Block configuration set.');
+
+    // Visit the node and confirm that the field is displayed.
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->assertNoRaw($this->value1, 'Field 1 is not displayed');
+    $this->assertRaw($this->value2, 'Field 2 is displayed');
+
+    // Enable both fields.
+    $this->drupalPost('admin/structure/block/manage/profile/author-information/configure', array(
+      'profile_block_author_fields[' . $this->field1['form_name'] . ']' => TRUE,
+      'profile_block_author_fields[' . $this->field2['form_name'] . ']' => TRUE,
+    ), t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), 'Block configuration set.');
+
+    // Visit the node and confirm that the field is displayed.
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->assertRaw($this->value1, 'Field 1 is displayed');
+    $this->assertRaw($this->value2, 'Field 2 is displayed');
+
+    // Enable the link to the user profile.
+    $this->drupalPost('admin/structure/block/manage/profile/author-information/configure', array(
+      'profile_block_author_fields[user_profile]' => TRUE,
+    ), t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), 'Block configuration set.');
+
+    // Visit the node and confirm that the user profile link is displayed.
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->clickLink(t('View full user profile'));
+    $this->assertEqual($this->getUrl(), url('user/' . $this->normal_user->uid, array('absolute' => TRUE)));
+  }
+}
+
+/**
+ * Test profile browsing.
+ */
+class ProfileTestBrowsing extends ProfileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Profile browsing',
+      'description' => 'Test profile browsing.',
+      'group' => 'Profile',
+    );
+  }
+
+  /**
+   * Test profile browsing.
+   */
+  function testProfileBrowsing() {
+    $this->drupalLogin($this->admin_user);
+    $field = $this->createProfileField('list', 'simpletest', array('page' => '%value'));
+
+    // Set a random value for the profile field.
+    $value = $this->setProfileField($field);
+
+    // Check that user is found on the profile browse page.
+    $this->drupalGet("profile/{$field['form_name']}/$value");
+    $this->assertText($this->normal_user->name);
+  }
+}
+
+/**
+ * Test profile integration with user CRUD operations.
+ */
+class ProfileCrudTestCase extends ProfileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Profile CRUD tests',
+      'description' => 'Test profile integration with user create, read, update, delete.',
+      'group' => 'Profile',
+    );
+  }
+
+  /**
+   * Test profile integration with user CRUD operations.
+   */
+  public function testUserCRUD() {
+    // @todo Add profile fields in addition to base user properties.
+    $edit = array(
+      'name' => 'Test user',
+      'mail' => 'test@example.com',
+    );
+
+    // Create.
+    // @todo Add assertions.
+    $account = user_save(NULL, $edit);
+
+    // Read.
+    // @todo Add assertions.
+    $account = user_load($account->uid);
+
+    // Update.
+    // @todo Add assertions.
+    $account = user_save($account, $edit);
+
+    // Delete.
+    // @todo Add assertions.
+    user_delete($account->uid);
+  }
+}
+
+  /**
+   * TODO:
+   * - Test field visibility
+   * - Test required fields
+   * - Test fields on registration form
+   * - Test updating fields
+   */
diff --git a/htmltest/modules/rdf/rdf.api.php b/htmltest/modules/rdf/rdf.api.php
new file mode 100644
index 00000000..691f7efa
--- /dev/null
+++ b/htmltest/modules/rdf/rdf.api.php
@@ -0,0 +1,106 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the RDF module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Allow modules to define RDF mappings for field bundles.
+ *
+ * Modules defining their own field bundles can specify which RDF semantics
+ * should be used to annotate these bundles. These mappings are then used for
+ * automatic RDFa output in the HTML code.
+ *
+ * @return
+ *   A list of mapping structures, where each mapping is an associative array:
+ *   - type: The name of an entity type (e.g., 'node', 'comment', and so on.)
+ *   - bundle: The name of the bundle (e.g., 'page', 'blog', or
+ *     RDF_DEFAULT_BUNDLE for default mappings.)
+ *   - mapping: The mapping structure which applies to the entity type and
+ *     bundle. A mapping structure is an array with keys corresponding to
+ *     existing field instances in the bundle. Each field is then described in
+ *     terms of the RDF mapping:
+ *     - predicates: An array of RDF predicates which describe the relation
+ *       between the bundle (RDF subject) and the value of the field (RDF
+ *       object). This value is either some text, another bundle, or a URI in
+ *       general.
+ *     - datatype: Is used along with 'callback' to format data so that it is
+ *       readable by machines. A typical example is a date which can be written
+ *       in many different formats but should be translated into a uniform
+ *       format for machine consumption.
+ *     - callback: A function name to invoke for 'datatype'.
+ *     - type: A string used to determine the type of RDFa markup which will be
+ *       used in the final HTML output, depending on whether the RDF object is a
+ *       literal text or another RDF resource.
+ *     - rdftype: A special property used to define the type of the instance.
+ *       Its value should be an array of RDF classes.
+ *
+ *       @ingroup rdf
+ */
+function hook_rdf_mapping() {
+  return array(
+    array(
+      'type' => 'node',
+      'bundle' => 'blog',
+      'mapping' => array(
+        'rdftype' => array('sioct:Weblog'),
+        'title' => array(
+          'predicates' => array('dc:title'),
+        ),
+        'created' => array(
+          'predicates' => array('dc:date', 'dc:created'),
+          'datatype' => 'xsd:dateTime',
+          'callback' => 'date_iso8601',
+        ),
+        'body' => array(
+          'predicates' => array('content:encoded'),
+        ),
+        'uid' => array(
+          'predicates' => array('sioc:has_creator'),
+          'type' => 'rel',
+        ),
+        'name' => array(
+          'predicates' => array('foaf:name'),
+        ),
+      ),
+    ),
+  );
+}
+
+/**
+ * Allow modules to define namespaces for RDF mappings.
+ *
+ * Many common namespace prefixes are defined in rdf_rdf_namespaces(). However,
+ * if a module implements hook_rdf_mapping() and uses a prefix that is not
+ * defined in rdf_rdf_namespaces(), this hook should be used to define the new
+ * namespace prefix.
+ *
+ * @return
+ *   An associative array of namespaces where the key is the namespace prefix
+ *   and the value is the namespace URI.
+ *
+ * @ingroup rdf
+ */
+function hook_rdf_namespaces() {
+  return array(
+    'content'  => 'http://purl.org/rss/1.0/modules/content/',
+    'dc'       => 'http://purl.org/dc/terms/',
+    'foaf'     => 'http://xmlns.com/foaf/0.1/',
+    'og'       => 'http://ogp.me/ns#',
+    'rdfs'     => 'http://www.w3.org/2000/01/rdf-schema#',
+    'sioc'     => 'http://rdfs.org/sioc/ns#',
+    'sioct'    => 'http://rdfs.org/sioc/types#',
+    'skos'     => 'http://www.w3.org/2004/02/skos/core#',
+    'xsd'      => 'http://www.w3.org/2001/XMLSchema#',
+  );
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/rdf/rdf.info b/htmltest/modules/rdf/rdf.info
new file mode 100644
index 00000000..1c8651b1
--- /dev/null
+++ b/htmltest/modules/rdf/rdf.info
@@ -0,0 +1,12 @@
+name = RDF
+description = Enriches your content with metadata to let other applications (e.g. search engines, aggregators) better understand its relationships and attributes.
+package = Core
+version = VERSION
+core = 7.x
+files[] = rdf.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/rdf/rdf.install b/htmltest/modules/rdf/rdf.install
new file mode 100644
index 00000000..10d3f8d9
--- /dev/null
+++ b/htmltest/modules/rdf/rdf.install
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the rdf module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function rdf_schema() {
+  $schema['rdf_mapping'] = array(
+    'description' => 'Stores custom RDF mappings for user defined content types or overriden module-defined mappings',
+    'fields' => array(
+      'type' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'description' => 'The name of the entity type a mapping applies to (node, user, comment, etc.).',
+      ),
+      'bundle' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'description' => 'The name of the bundle a mapping applies to.',
+      ),
+      'mapping' => array(
+        'description' => 'The serialized mapping of the bundle type and fields to RDF terms.',
+        'type' => 'blob',
+        'not null' => FALSE,
+        'size' => 'big',
+        'serialize' => TRUE,
+      ),
+    ),
+    'primary key' => array('type', 'bundle'),
+  );
+
+  return $schema;
+}
+
+/**
+ * Implements hook_install().
+ */
+function rdf_install() {
+  // Collect any RDF mappings that were declared by modules installed before
+  // this one.
+  $modules = module_implements('rdf_mapping');
+  rdf_modules_installed($modules);
+}
diff --git a/htmltest/modules/rdf/rdf.module b/htmltest/modules/rdf/rdf.module
new file mode 100644
index 00000000..877b598c
--- /dev/null
+++ b/htmltest/modules/rdf/rdf.module
@@ -0,0 +1,878 @@
+<?php
+
+/**
+ * @file
+ * Enables semantically enriched output for Drupal sites in the form of RDFa.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function rdf_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#rdf':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The RDF module enriches your content with metadata to let other applications (e.g., search engines, aggregators, and so on) better understand its relationships and attributes. This semantically enriched, machine-readable output for Drupal sites uses the <a href="@rdfa">RDFa specification</a> which allows RDF data to be embedded in HTML markup. Other modules can define mappings of their data to RDF terms, and the RDF module makes this RDF data available to the theme. The core Drupal modules define RDF mappings for their data model, and the core Drupal themes output this RDF metadata information along with the human-readable visual information. For more information, see the online handbook entry for <a href="@rdf">RDF module</a>.', array('@rdfa' => 'http://www.w3.org/TR/xhtml-rdfa-primer/', '@rdf' => 'http://drupal.org/documentation/modules/rdf')) . '</p>';
+      return $output;
+  }
+}
+
+/**
+ * @defgroup rdf RDF Mapping API
+ * @{
+ * Functions to describe entities and bundles in RDF.
+ *
+ * The RDF module introduces RDF and RDFa to Drupal. RDF is a W3C standard to
+ * describe structured data. RDF can be serialized as RDFa in XHTML attributes
+ * to augment visual data with machine-readable hints.
+ * @see http://www.w3.org/RDF/
+ * @see http://www.w3.org/TR/xhtml-rdfa-primer/
+ *
+ * Modules can provide mappings of their bundles' data and metadata to RDF
+ * classes and properties. This module takes care of injecting these mappings
+ * into variables available to theme functions and templates. All Drupal core
+ * themes are coded to be RDFa compatible.
+ *
+ * Example mapping from node.module:
+ * @code
+ *   array(
+ *     'type' => 'node',
+ *     'bundle' => RDF_DEFAULT_BUNDLE,
+ *     'mapping' => array(
+ *       'rdftype' => array('sioc:Item', 'foaf:Document'),
+ *       'title' => array(
+ *         'predicates' => array('dc:title'),
+ *       ),
+ *       'created' => array(
+ *         'predicates' => array('dc:date', 'dc:created'),
+ *         'datatype' => 'xsd:dateTime',
+ *         'callback' => 'date_iso8601',
+ *       ),
+ *      'body' => array(
+ *         'predicates' => array('content:encoded'),
+ *       ),
+ *       'uid' => array(
+ *         'predicates' => array('sioc:has_creator'),
+ *       ),
+ *       'name' => array(
+ *         'predicates' => array('foaf:name'),
+ *       ),
+ *     ),
+ *   );
+ * @endcode
+ */
+
+/**
+ * RDF bundle flag: Default bundle.
+ *
+ * Implementations of hook_rdf_mapping() should use this constant for the
+ * 'bundle' key when defining a default set of RDF mappings for an entity type.
+ * Each bundle will inherit the default mappings defined for the entity type
+ * unless the bundle defines its own specific mappings.
+ */
+define('RDF_DEFAULT_BUNDLE', '');
+
+/**
+ * Implements hook_rdf_namespaces().
+ */
+function rdf_rdf_namespaces() {
+  return array(
+    'content'  => 'http://purl.org/rss/1.0/modules/content/',
+    'dc'       => 'http://purl.org/dc/terms/',
+    'foaf'     => 'http://xmlns.com/foaf/0.1/',
+    'og'       => 'http://ogp.me/ns#',
+    'rdfs'     => 'http://www.w3.org/2000/01/rdf-schema#',
+    'sioc'     => 'http://rdfs.org/sioc/ns#',
+    'sioct'    => 'http://rdfs.org/sioc/types#',
+    'skos'     => 'http://www.w3.org/2004/02/skos/core#',
+    'xsd'      => 'http://www.w3.org/2001/XMLSchema#',
+  );
+}
+
+/**
+ * Returns an array of RDF namespaces defined in modules that implement
+ * hook_rdf_namespaces().
+ */
+function rdf_get_namespaces() {
+  $rdf_namespaces = module_invoke_all('rdf_namespaces');
+  // module_invoke_all() uses array_merge_recursive() which might return nested
+  // arrays if several modules redefine the same prefix multiple times. We need
+  // to ensure the array of namespaces is flat and only contains strings as
+  // URIs.
+  foreach ($rdf_namespaces as $prefix => $uri) {
+    if (is_array($uri)) {
+      if (count(array_unique($uri)) == 1) {
+        // All namespaces declared for this prefix are the same, merge them all
+        // into a single namespace.
+        $rdf_namespaces[$prefix] = $uri[0];
+      }
+      else {
+        // There are conflicting namespaces for this prefix, do not include
+        // duplicates in order to avoid asserting any inaccurate RDF
+        // statements.
+        unset($rdf_namespaces[$prefix]);
+      }
+    }
+  }
+  return $rdf_namespaces;
+}
+
+/**
+ * Returns the mapping for attributes of a given entity type/bundle pair.
+ *
+ * @param $type
+ *   An entity type.
+ * @param $bundle
+ *   (optional) A bundle name.
+ *
+ * @return
+ *   The mapping corresponding to the requested entity type/bundle pair or an
+ *   empty array.
+ */
+function rdf_mapping_load($type, $bundle = RDF_DEFAULT_BUNDLE) {
+  // Retrieves the bundle-specific mapping from the entity info.
+  $entity_info = entity_get_info($type);
+  if (!empty($entity_info['bundles'][$bundle]['rdf_mapping'])) {
+    return $entity_info['bundles'][$bundle]['rdf_mapping'];
+  }
+  // If there is no mapping defined for this bundle, we return the default
+  // mapping that is defined for this entity type.
+  else {
+    return _rdf_get_default_mapping($type);
+  }
+}
+
+/**
+ * @} End of "defgroup rdf".
+ */
+
+/**
+ * Helper function to get the default RDF mapping for a given entity type.
+ *
+ * @param $type
+ *   An entity type, e.g. 'node' or 'comment'.
+ *
+ * @return
+ *   The RDF mapping or an empty array if no mapping is defined for this entity
+ *   type.
+ */
+function _rdf_get_default_mapping($type) {
+  $default_mappings = &drupal_static(__FUNCTION__);
+
+  if (!isset($default_mappings)) {
+    // Get all of the modules that implement hook_rdf_mapping().
+    $modules = module_implements('rdf_mapping');
+
+    // Only consider the default entity mapping definitions.
+    foreach ($modules as $module) {
+      $mappings = module_invoke($module, 'rdf_mapping');
+      foreach ($mappings as $mapping) {
+        if ($mapping['bundle'] === RDF_DEFAULT_BUNDLE) {
+          $default_mappings[$mapping['type']] = $mapping['mapping'];
+        }
+      }
+    }
+  }
+
+  return isset($default_mappings[$type]) ? $default_mappings[$type] : array();
+}
+
+/**
+ * Helper function to retrieve an RDF mapping from the database.
+ *
+ * @param $type
+ *   The entity type the mapping refers to.
+ * @param $bundle
+ *   The bundle the mapping refers to.
+ *
+ * @return
+ *   An RDF mapping structure or an empty array if no record was found.
+ */
+function _rdf_mapping_load($type, $bundle) {
+  $mapping = db_select('rdf_mapping')
+    ->fields(NULL, array('mapping'))
+    ->condition('type', $type)
+    ->condition('bundle', $bundle)
+    ->execute()
+    ->fetchField();
+
+  if (!$mapping) {
+    return array();
+  }
+  return unserialize($mapping);
+}
+
+/**
+ * @addtogroup rdf
+ * @{
+ */
+
+/**
+ * Saves an RDF mapping to the database.
+ *
+ * Takes a mapping structure returned by hook_rdf_mapping() implementations
+ * and creates or updates a record mapping for each encountered entity
+ * type/bundle pair. If available, adds default values for non-existent mapping
+ * keys.
+ *
+ * @param $mapping
+ *   The RDF mapping to save, as an array.
+ *
+ * @return
+ *   Status flag indicating the outcome of the operation.
+ */
+function rdf_mapping_save($mapping) {
+  // In the case where a field has a mapping defined in the default entity
+  // mapping, but a mapping is not specified in the bundle-specific mapping,
+  // then use the default mapping for that field.
+  $mapping['mapping'] += _rdf_get_default_mapping($mapping['type']);
+
+  $status = db_merge('rdf_mapping')
+    ->key(array(
+      'type' => $mapping['type'],
+      'bundle' => $mapping['bundle'],
+    ))
+    ->fields(array(
+      'mapping' => serialize($mapping['mapping']),
+    ))
+    ->execute();
+
+  entity_info_cache_clear();
+
+  return $status;
+}
+
+/**
+ * Deletes the mapping for the given bundle from the database.
+ *
+ * @param $type
+ *   The entity type the mapping refers to.
+ * @param $bundle
+ *   The bundle the mapping refers to.
+ *
+ * @return
+ *   Return boolean TRUE if mapping deleted, FALSE if not.
+ */
+function rdf_mapping_delete($type, $bundle) {
+  $num_rows = db_delete('rdf_mapping')
+    ->condition('type', $type)
+    ->condition('bundle', $bundle)
+    ->execute();
+
+  return (bool) ($num_rows > 0);
+}
+
+/**
+ * Builds an array of RDFa attributes for a given mapping. This array will
+ * typically be passed through drupal_attributes() to create the attributes
+ * variables that are available to template files. These include $attributes,
+ * $title_attributes, $content_attributes and the field-specific
+ * $item_attributes variables. For more information, see
+ * theme_rdf_template_variable_wrapper().
+ *
+ * @param $mapping
+ *   An array containing a mandatory 'predicates' key and optional 'datatype',
+ *   'callback' and 'type' keys. For example:
+ *   @code
+ *     array(
+ *       'predicates' => array('dc:created'),
+ *       'datatype' => 'xsd:dateTime',
+ *       'callback' => 'date_iso8601',
+ *       ),
+ *     );
+ *   @endcode
+ * @param $data
+ *   A value that needs to be converted by the provided callback function.
+ *
+ * @return
+ *   An array containing RDFa attributes suitable for drupal_attributes().
+ */
+function rdf_rdfa_attributes($mapping, $data = NULL) {
+  // The type of mapping defaults to 'property'.
+  $type = isset($mapping['type']) ? $mapping['type'] : 'property';
+
+  switch ($type) {
+    // The mapping expresses the relationship between two resources.
+    case 'rel':
+    case 'rev':
+      $attributes[$type] = $mapping['predicates'];
+      break;
+
+    // The mapping expresses the relationship between a resource and some
+    // literal text.
+    case 'property':
+      $attributes['property'] = $mapping['predicates'];
+      // Convert $data to a specific format as per the callback function.
+      if (isset($data) && isset($mapping['callback']) && function_exists($mapping['callback'])) {
+        $callback = $mapping['callback'];
+        $attributes['content'] = $callback($data);
+      }
+      if (isset($mapping['datatype'])) {
+        $attributes['datatype'] = $mapping['datatype'];
+      }
+      break;
+  }
+
+  return $attributes;
+}
+
+/**
+ * @} End of "addtogroup rdf".
+ */
+
+/**
+ * Implements hook_modules_installed().
+ *
+ * Checks if the installed modules have any RDF mapping definitions to declare
+ * and stores them in the rdf_mapping table.
+ *
+ * While both default entity mappings and specific bundle mappings can be
+ * defined in hook_rdf_mapping(), default entity mappings are not stored in the
+ * database. Only overridden mappings are stored in the database. The default
+ * entity mappings can be overriden by specific bundle mappings which are
+ * stored in the database and can be altered via the RDF CRUD mapping API.
+ */
+function rdf_modules_installed($modules) {
+  foreach ($modules as $module) {
+    $function = $module . '_rdf_mapping';
+    if (function_exists($function)) {
+      foreach ($function() as $mapping) {
+        // Only the bundle mappings are saved in the database.
+        if ($mapping['bundle'] !== RDF_DEFAULT_BUNDLE) {
+          rdf_mapping_save($mapping);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_modules_uninstalled().
+ */
+function rdf_modules_uninstalled($modules) {
+  // @todo Remove RDF mappings of uninstalled modules.
+}
+
+/**
+ * Implements hook_entity_info_alter().
+ *
+ * Adds the proper RDF mapping to each entity type/bundle pair.
+ *
+ * @todo May need to move the comment below to another place.
+ * This hook should not be used by modules to alter the bundle mappings.
+ * The UI should always be authoritative. UI mappings are stored in the
+ * database and if hook_entity_info_alter was used to override module defined
+ * mappings, it would override the user defined mapping as well.
+ */
+function rdf_entity_info_alter(&$entity_info) {
+  // Loop through each entity type and its bundles.
+  foreach ($entity_info as $entity_type => $entity_type_info) {
+    if (isset($entity_type_info['bundles'])) {
+      foreach ($entity_type_info['bundles'] as $bundle => $bundle_info) {
+        if ($mapping = _rdf_mapping_load($entity_type, $bundle)) {
+          $entity_info[$entity_type]['bundles'][$bundle]['rdf_mapping'] = $mapping;
+        }
+        else {
+          // If no mapping was found in the database, assign the default RDF
+          // mapping for this entity type.
+          $entity_info[$entity_type]['bundles'][$bundle]['rdf_mapping'] = _rdf_get_default_mapping($entity_type);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_entity_load().
+ */
+function rdf_entity_load($entities, $type) {
+  foreach ($entities as $entity) {
+    // Extracts the bundle of the entity being loaded.
+    list($id, $vid, $bundle) = entity_extract_ids($type, $entity);
+    $entity->rdf_mapping = rdf_mapping_load($type, $bundle);
+  }
+}
+
+/**
+ * Implements hook_comment_load().
+ */
+function rdf_comment_load($comments) {
+  foreach ($comments as $comment) {
+    // Pages with many comments can show poor performance. This information
+    // isn't needed until rdf_preprocess_comment() is called, but set it here
+    // to optimize performance for websites that implement an entity cache.
+    $comment->rdf_data['date'] = rdf_rdfa_attributes($comment->rdf_mapping['created'], $comment->created);
+    $comment->rdf_data['nid_uri'] = url('node/' . $comment->nid);
+    if ($comment->pid) {
+      $comment->rdf_data['pid_uri'] = url('comment/' . $comment->pid, array('fragment' => 'comment-' . $comment->pid));
+    }
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function rdf_theme() {
+  return array(
+    'rdf_template_variable_wrapper' => array(
+      'variables' => array('content' => NULL, 'attributes' => array(), 'context' => array(), 'inline' => TRUE),
+    ),
+    'rdf_metadata' => array(
+      'variables' => array('metadata' => array()),
+    ),
+  );
+}
+
+/**
+ * Template process function for adding extra tags to hold RDFa attributes.
+ *
+ * Since template files already have built-in support for $attributes,
+ * $title_attributes, and $content_attributes, and field templates have support
+ * for $item_attributes, we try to leverage those as much as possible. However,
+ * in some cases additional attributes are needed not covered by these. We deal
+ * with those here.
+ */
+function rdf_process(&$variables, $hook) {
+  // Handles attributes needed for content not covered by title, content,
+  // and field items. It does this by adjusting the variable sent to the
+  // template so that the template doesn't have to worry about it. See
+  // theme_rdf_template_variable_wrapper().
+  if (!empty($variables['rdf_template_variable_attributes_array'])) {
+    foreach ($variables['rdf_template_variable_attributes_array'] as $variable_name => $attributes) {
+      $context = array(
+        'hook' => $hook,
+        'variable_name' => $variable_name,
+        'variables' => $variables,
+      );
+      $variables[$variable_name] = theme('rdf_template_variable_wrapper', array('content' => $variables[$variable_name], 'attributes' => $attributes, 'context' => $context));
+    }
+  }
+  // Handles additional attributes about a template entity that for RDF parsing
+  // reasons, can't be placed into that template's $attributes variable. This
+  // is "meta" information that is related to particular content, so render it
+  // close to that content.
+  if (!empty($variables['rdf_metadata_attributes_array'])) {
+    if (!isset($variables['content']['#prefix'])) {
+      $variables['content']['#prefix'] = '';
+    }
+    $variables['content']['#prefix'] = theme('rdf_metadata', array('metadata' => $variables['rdf_metadata_attributes_array'])) . $variables['content']['#prefix'];
+  }
+}
+
+/**
+ * Implements MODULE_preprocess_HOOK().
+ */
+function rdf_preprocess_node(&$variables) {
+  // Adds RDFa markup to the node container. The about attribute specifies the
+  // URI of the resource described within the HTML element, while the @typeof
+  // attribute indicates its RDF type (e.g., foaf:Document, sioc:Person, and so
+  // on.)
+  $variables['attributes_array']['about'] = empty($variables['node_url']) ? NULL: $variables['node_url'];
+  $variables['attributes_array']['typeof'] = empty($variables['node']->rdf_mapping['rdftype']) ? NULL : $variables['node']->rdf_mapping['rdftype'];
+
+  // Adds RDFa markup to the title of the node. Because the RDFa markup is
+  // added to the <h2> tag which might contain HTML code, we specify an empty
+  // datatype to ensure the value of the title read by the RDFa parsers is a
+  // literal.
+  $variables['title_attributes_array']['property'] = empty($variables['node']->rdf_mapping['title']['predicates']) ? NULL : $variables['node']->rdf_mapping['title']['predicates'];
+  $variables['title_attributes_array']['datatype'] = '';
+
+  // In full node mode, the title is not displayed by node.tpl.php so it is
+  // added in the <head> tag of the HTML page.
+  if ($variables['page']) {
+    $element = array(
+      '#tag' => 'meta',
+      '#attributes' => array(
+        'content' => $variables['node']->title,
+        'about' => $variables['node_url'],
+      ),
+    );
+    if (!empty($variables['node']->rdf_mapping['title']['predicates'])) {
+      $element['#attributes']['property'] = $variables['node']->rdf_mapping['title']['predicates'];
+    }
+    drupal_add_html_head($element, 'rdf_node_title');
+  }
+
+  // Adds RDFa markup for the date.
+  if (!empty($variables['rdf_mapping']['created'])) {
+    $date_attributes_array = rdf_rdfa_attributes($variables['rdf_mapping']['created'], $variables['created']);
+    $variables['rdf_template_variable_attributes_array']['date'] = $date_attributes_array;
+    if ($variables['submitted']) {
+      $variables['rdf_template_variable_attributes_array']['submitted'] = $date_attributes_array;
+    }
+  }
+  // Adds RDFa markup for the relation between the node and its author.
+  if (!empty($variables['rdf_mapping']['uid'])) {
+    $variables['rdf_template_variable_attributes_array']['name']['rel'] = $variables['rdf_mapping']['uid']['predicates'];
+    if ($variables['submitted']) {
+      $variables['rdf_template_variable_attributes_array']['submitted']['rel'] = $variables['rdf_mapping']['uid']['predicates'];
+    }
+  }
+
+  // Adds RDFa markup annotating the number of comments a node has.
+  if (isset($variables['node']->comment_count) && !empty($variables['node']->rdf_mapping['comment_count']['predicates'])) {
+    // Annotates the 'x comments' link in teaser view.
+    if (isset($variables['content']['links']['comment']['#links']['comment-comments'])) {
+      $comment_count_attributes['property'] = $variables['node']->rdf_mapping['comment_count']['predicates'];
+      $comment_count_attributes['content'] = $variables['node']->comment_count;
+      $comment_count_attributes['datatype'] = $variables['node']->rdf_mapping['comment_count']['datatype'];
+      // According to RDFa parsing rule number 4, a new subject URI is created
+      // from the href attribute if no rel/rev attribute is present. To get the
+      // original node URL from the about attribute of the parent container we
+      // set an empty rel attribute which triggers rule number 5. See
+      // http://www.w3.org/TR/rdfa-syntax/#sec_5.5.
+      $comment_count_attributes['rel'] = '';
+      $variables['content']['links']['comment']['#links']['comment-comments']['attributes'] += $comment_count_attributes;
+    }
+    // In full node view, the number of comments is not displayed by
+    // node.tpl.php so it is expressed in RDFa in the <head> tag of the HTML
+    // page.
+    if ($variables['page'] && user_access('access comments')) {
+      $element = array(
+        '#tag' => 'meta',
+        '#attributes' => array(
+          'about' => $variables['node_url'],
+          'property' => $variables['node']->rdf_mapping['comment_count']['predicates'],
+          'content' => $variables['node']->comment_count,
+          'datatype' => $variables['node']->rdf_mapping['comment_count']['datatype'],
+        ),
+      );
+      drupal_add_html_head($element, 'rdf_node_comment_count');
+    }
+  }
+}
+
+/**
+ * Implements MODULE_preprocess_HOOK().
+ */
+function rdf_preprocess_field(&$variables) {
+  $element = $variables['element'];
+  $mapping = rdf_mapping_load($element['#entity_type'], $element['#bundle']);
+  $field_name = $element['#field_name'];
+
+  if (!empty($mapping) && !empty($mapping[$field_name])) {
+    foreach ($element['#items'] as $delta => $item) {
+      $variables['item_attributes_array'][$delta] = rdf_rdfa_attributes($mapping[$field_name], $item);
+      // If this field is an image, RDFa will not output correctly when the
+      // image is in a containing <a> tag. If the field is a file, RDFa will
+      // not output correctly if the filetype icon comes before the link to the
+      // file. We correct this by adding a resource attribute to the div if
+      // this field has a URI.
+      if (isset($item['uri'])) {
+        if (!empty($element[$delta]['#image_style'])) {
+          $variables['item_attributes_array'][$delta]['resource'] = image_style_url($element[$delta]['#image_style'], $item['uri']);
+        }
+        else {
+          $variables['item_attributes_array'][$delta]['resource'] = file_create_url($item['uri']);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements MODULE_preprocess_HOOK().
+ */
+function rdf_preprocess_user_profile(&$variables) {
+  $account = $variables['elements']['#account'];
+  $uri = entity_uri('user', $account);
+
+  // Adds RDFa markup to the user profile page. Fields displayed in this page
+  // will automatically describe the user.
+  if (!empty($account->rdf_mapping['rdftype'])) {
+    $variables['attributes_array']['typeof'] = $account->rdf_mapping['rdftype'];
+    $variables['attributes_array']['about'] = url($uri['path'], $uri['options']);
+  }
+  // Adds the relationship between the sioc:UserAccount and the foaf:Person who
+  // holds the account.
+  $account_holder_meta = array(
+    '#tag' => 'meta',
+    '#attributes' => array(
+      'about' => url($uri['path'], array_merge($uri['options'], array('fragment' => 'me'))),
+      'typeof' => array('foaf:Person'),
+      'rel' => array('foaf:account'),
+      'resource' => url($uri['path'], $uri['options']),
+    ),
+  );
+  // Adds the markup for username.
+  $username_meta = array(
+    '#tag' => 'meta',
+    '#attributes' => array(
+      'about' => url($uri['path'], $uri['options']),
+      'property' => $account->rdf_mapping['name']['predicates'],
+      'content' => $account->name,
+    )
+  );
+  drupal_add_html_head($account_holder_meta, 'rdf_user_account_holder');
+  drupal_add_html_head($username_meta, 'rdf_user_username');
+}
+
+/**
+ * Implements MODULE_preprocess_HOOK().
+ */
+function rdf_preprocess_username(&$variables) {
+  // Because xml:lang is set on the HTML element that wraps the page, the
+  // username inherits this language attribute. However, since the username
+  // might not be transliterated to the same language that the content is in,
+  // we do not want it to inherit the language attribute, so we set the
+  // attribute to an empty string.
+  if (empty($variables['attributes_array']['xml:lang'])) {
+    $variables['attributes_array']['xml:lang'] = '';
+  }
+
+  // $variables['account'] is a pseudo account object, and as such, does not
+  // contain the RDF mappings for the user. In the case of nodes and comments,
+  // it contains the mappings for the node or comment object instead. However,
+  // while the RDF mappings are available from a full user_load(), this should
+  // be avoided for performance reasons. Since the type and bundle for users is
+  // already known, call rdf_mapping_load() directly.
+  $rdf_mapping = rdf_mapping_load('user', 'user');
+
+  // The profile URI is used to identify the user account. The about attribute
+  // is used to set the URI as the default subject of the predicates embedded
+  // as RDFa in the child elements. Even if the user profile is not accessible
+  // to the current user, we use its URI in order to identify the user in RDF.
+  // We do not use this attribute for the anonymous user because we do not have
+  // a user profile URI for it (only a homepage which cannot be used as user
+  // profile in RDF.)
+  if ($variables['uid'] > 0) {
+    $variables['attributes_array']['about'] = url('user/' . $variables['uid']);
+  }
+
+  $attributes = array();
+  // The typeof attribute specifies the RDF type(s) of this resource. They
+  // are defined in the 'rdftype' property of the user RDF mapping.
+  if (!empty($rdf_mapping['rdftype'])) {
+    $attributes['typeof'] = $rdf_mapping['rdftype'];
+  }
+  // Annotate the username in RDFa. A property attribute is used with an empty
+  // datatype attribute to ensure the username is parsed as a plain literal
+  // in RDFa 1.0 and 1.1.
+  if (!empty($rdf_mapping['name'])) {
+    $attributes['property'] = $rdf_mapping['name']['predicates'];
+    $attributes['datatype'] = '';
+  }
+  // Add the homepage RDFa markup if present.
+  if (!empty($variables['homepage']) && !empty($rdf_mapping['homepage'])) {
+    $attributes['rel'] = $rdf_mapping['homepage']['predicates'];
+  }
+  // The remaining attributes can have multiple values listed, with whitespace
+  // separating the values in the RDFa attributes
+  // (see http://www.w3.org/TR/rdfa-syntax/#rdfa-attributes).
+  // Therefore, merge rather than override so as not to clobber values set by
+  // earlier preprocess functions.
+  $variables['attributes_array'] = array_merge_recursive($variables['attributes_array'], $attributes);
+}
+
+/**
+ * Implements MODULE_preprocess_HOOK().
+ */
+function rdf_preprocess_comment(&$variables) {
+  $comment = $variables['comment'];
+  if (!empty($comment->rdf_mapping['rdftype'])) {
+    // Adds RDFa markup to the comment container. The about attribute specifies
+    // the URI of the resource described within the HTML element, while the
+    // typeof attribute indicates its RDF type (e.g., sioc:Post, foaf:Document,
+    // and so on.)
+    $uri = entity_uri('comment', $comment);
+    $variables['attributes_array']['about'] = url($uri['path'], $uri['options']);
+    $variables['attributes_array']['typeof'] = $comment->rdf_mapping['rdftype'];
+  }
+
+  // Adds RDFa markup for the date of the comment.
+  if (!empty($comment->rdf_mapping['created'])) {
+    // The comment date is precomputed as part of the rdf_data so that it can be
+    // cached as part of the entity.
+    $date_attributes_array = $comment->rdf_data['date'];
+    $variables['rdf_template_variable_attributes_array']['created'] = $date_attributes_array;
+    $variables['rdf_template_variable_attributes_array']['submitted'] = $date_attributes_array;
+  }
+  // Adds RDFa markup for the relation between the comment and its author.
+  if (!empty($comment->rdf_mapping['uid'])) {
+    $variables['rdf_template_variable_attributes_array']['author']['rel'] = $comment->rdf_mapping['uid']['predicates'];
+    $variables['rdf_template_variable_attributes_array']['submitted']['rel'] = $comment->rdf_mapping['uid']['predicates'];
+  }
+  if (!empty($comment->rdf_mapping['title'])) {
+    // Adds RDFa markup to the subject of the comment. Because the RDFa markup
+    // is added to an <h3> tag which might contain HTML code, we specify an
+    // empty datatype to ensure the value of the title read by the RDFa parsers
+    // is a literal.
+    $variables['title_attributes_array']['property'] = $comment->rdf_mapping['title']['predicates'];
+    $variables['title_attributes_array']['datatype'] = '';
+  }
+
+  // Annotates the parent relationship between the current comment and the node
+  // it belongs to. If available, the parent comment is also annotated.
+  if (!empty($comment->rdf_mapping['pid'])) {
+    // Adds the relation to the parent node.
+    $parent_node_attributes['rel'] = $comment->rdf_mapping['pid']['predicates'];
+    // The parent node URI is precomputed as part of the rdf_data so that it can
+    // be cached as part of the entity.
+    $parent_node_attributes['resource'] = $comment->rdf_data['nid_uri'];
+    $variables['rdf_metadata_attributes_array'][] = $parent_node_attributes;
+
+    // Adds the relation to parent comment, if it exists.
+    if ($comment->pid != 0) {
+      $parent_comment_attributes['rel'] = $comment->rdf_mapping['pid']['predicates'];
+      // The parent comment URI is precomputed as part of the rdf_data so that
+      // it can be cached as part of the entity.
+      $parent_comment_attributes['resource'] = $comment->rdf_data['pid_uri'];
+      $variables['rdf_metadata_attributes_array'][] = $parent_comment_attributes;
+    }
+  }
+}
+
+/**
+ * Implements MODULE_preprocess_HOOK().
+ */
+function rdf_preprocess_taxonomy_term(&$variables) {
+  // Adds the RDF type of the term and the term name in a <meta> tag.
+  $term = $variables['term'];
+  $term_label_meta = array(
+      '#tag' => 'meta',
+      '#attributes' => array(
+        'about' => url('taxonomy/term/' . $term->tid),
+        'typeof' => $term->rdf_mapping['rdftype'],
+        'property' => $term->rdf_mapping['name']['predicates'],
+        'content' => $term->name,
+      ),
+    );
+  drupal_add_html_head($term_label_meta, 'rdf_term_label');
+}
+
+/**
+ * Implements hook_field_attach_view_alter().
+ */
+function rdf_field_attach_view_alter(&$output, $context) {
+  // Append term mappings on displayed taxonomy links.
+  foreach (element_children($output) as $field_name) {
+    $element = &$output[$field_name];
+    if ($element['#field_type'] == 'taxonomy_term_reference' && $element['#formatter'] == 'taxonomy_term_reference_link') {
+      foreach ($element['#items'] as $delta => $item) {
+        // This function is invoked during entity preview when taxonomy term
+        // reference items might contain free-tagging terms that do not exist
+        // yet and thus have no $item['taxonomy_term'].
+        if (isset($item['taxonomy_term'])) {
+          $term = $item['taxonomy_term'];
+          if (!empty($term->rdf_mapping['rdftype'])) {
+            $element[$delta]['#options']['attributes']['typeof'] = $term->rdf_mapping['rdftype'];
+          }
+          if (!empty($term->rdf_mapping['name']['predicates'])) {
+            // A property attribute is used with an empty datatype attribute so
+            // the term name is parsed as a plain literal in RDFa 1.0 and 1.1.
+            $element[$delta]['#options']['attributes']['property'] = $term->rdf_mapping['name']['predicates'];
+            $element[$delta]['#options']['attributes']['datatype'] = '';
+          }
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements MODULE_preprocess_HOOK().
+ */
+function rdf_preprocess_image(&$variables) {
+  // Adds the RDF type for image. We cannot use the usual entity-based mapping
+  // to get 'foaf:Image' because image does not have its own entity type or
+  // bundle.
+  $variables['attributes']['typeof'] = array('foaf:Image');
+}
+
+/**
+ * Returns HTML for a template variable wrapped in an HTML element with the
+ * RDF attributes.
+ *
+ * This is called by rdf_process() shortly before the theme system renders
+ * a template file. It is called once for each template variable for which
+ * additional attributes are needed. While template files are responsible for
+ * rendering the attributes for the template's primary object (via the
+ * $attributes variable), title (via the $title_attributes variable), and
+ * content (via the $content_attributes variable), additional template
+ * variables that need containing attributes are routed through this function,
+ * allowing the template file to receive properly wrapped variables.
+ *
+ * Tip for themers: if you're already outputting a wrapper element around a
+ * particular template variable in your template file, and if you don't want
+ * an extra wrapper element, you can override this function to not wrap that
+ * variable and instead print the following inside your template file:
+ * @code
+ *   drupal_attributes($rdf_template_variable_attributes_array[$variable_name])
+ * @endcode
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - content: A string of content to be wrapped with attributes.
+ *   - attributes: An array of attributes to be placed on the wrapping element.
+ *   - context: An array of context information about the content to be wrapped:
+ *     - hook: The theme hook that will use the wrapped content. This
+ *       corresponds to the key within the theme registry for this template.
+ *       For example, if this content is about to be used in node.tpl.php or
+ *       node-[type].tpl.php, then the 'hook' is 'node'.
+ *     - variable_name: The name of the variable by which the template will
+ *       refer to this content. Each template file has documentation about
+ *       the variables it uses. For example, if this function is called in
+ *       preparing the $author variable for comment.tpl.php, then the
+ *       'variable_name' is 'author'.
+ *     - variables: The full array of variables about to be passed to the
+ *       template.
+ *   - inline: TRUE if the content contains only inline HTML elements and
+ *     therefore can be validly wrapped by a <span> tag. FALSE if the content
+ *     might contain block level HTML elements and therefore cannot be validly
+ *     wrapped by a <span> tag. Modules implementing preprocess functions that
+ *     set 'rdf_template_variable_attributes_array' for a particular template
+ *     variable that might contain block level HTML must also implement
+ *     hook_preprocess_rdf_template_variable_wrapper() and set 'inline' to FALSE
+ *     for that context. Themes that render normally inline content with block
+ *     level HTML must similarly implement
+ *     hook_preprocess_rdf_template_variable_wrapper() and set 'inline'
+ *     accordingly.
+ *
+ * @see rdf_process()
+ * @ingroup themeable
+ * @ingroup rdf
+ */
+function theme_rdf_template_variable_wrapper($variables) {
+  $output = $variables['content'];
+  if (!empty($output) && !empty($variables['attributes'])) {
+    $attributes = drupal_attributes($variables['attributes']);
+    $output = $variables['inline'] ? "<span$attributes>$output</span>" : "<div$attributes>$output</div>";
+  }
+  return $output;
+}
+
+/**
+ * Returns HTML for a series of empty spans for exporting RDF metadata in RDFa.
+ *
+ * Sometimes it is useful to export data which is not semantically present in
+ * the HTML output. For example, a hierarchy of comments is visible for a human
+ * but not for machines because this hiearchy is not present in the DOM tree.
+ * We can express it in RDFa via empty <span> tags. These aren't visible and
+ * give machines extra information about the content and its structure.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - metadata: An array of attribute arrays. Each item in the array
+ *     corresponds to its own set of attributes, and therefore, needs its own
+ *     element.
+ *
+ * @see rdf_process()
+ * @ingroup themeable
+ * @ingroup rdf
+ */
+function theme_rdf_metadata($variables) {
+  $output = '';
+  foreach ($variables['metadata'] as $attributes) {
+    // Add a class so that developers viewing the HTML source can see why there
+    // are empty <span> tags in the document. The class can also be used to set
+    // a CSS display:none rule in a theme where empty spans affect display.
+    $attributes['class'][] = 'rdf-meta';
+    // The XHTML+RDFa doctype allows either <span></span> or <span /> syntax to
+    // be used, but for maximum browser compatibility, W3C recommends the
+    // former when serving pages using the text/html media type, see
+    // http://www.w3.org/TR/xhtml1/#C_3.
+    $output .= '<span' . drupal_attributes($attributes) . '></span>';
+  }
+  return $output;
+}
diff --git a/htmltest/modules/rdf/rdf.test b/htmltest/modules/rdf/rdf.test
new file mode 100644
index 00000000..370dbb25
--- /dev/null
+++ b/htmltest/modules/rdf/rdf.test
@@ -0,0 +1,720 @@
+<?php
+
+/**
+ * @file
+ * Tests for rdf.module.
+ */
+
+class RdfMappingHookTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'RDF mapping hook',
+      'description' => 'Test hook_rdf_mapping().',
+      'group' => 'RDF',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('rdf', 'rdf_test', 'field_test');
+  }
+
+  /**
+   * Test that hook_rdf_mapping() correctly returns and processes mapping.
+   */
+  function testMapping() {
+    // Test that the mapping is returned correctly by the hook.
+    $mapping = rdf_mapping_load('test_entity', 'test_bundle');
+    $this->assertIdentical($mapping['rdftype'], array('sioc:Post'), 'Mapping for rdftype is sioc:Post.');
+    $this->assertIdentical($mapping['title'], array('predicates' => array('dc:title')), 'Mapping for title is dc:title.');
+    $this->assertIdentical($mapping['created'], array(
+      'predicates' => array('dc:created'),
+      'datatype' => 'xsd:dateTime',
+      'callback' => 'date_iso8601',
+    ), t('Mapping for created is dc:created with datatype xsd:dateTime and callback date_iso8601.'));
+    $this->assertIdentical($mapping['uid'], array('predicates' => array('sioc:has_creator', 'dc:creator'), 'type' => 'rel'), 'Mapping for uid is sioc:has_creator and dc:creator, and type is rel.');
+
+    $mapping = rdf_mapping_load('test_entity', 'test_bundle_no_mapping');
+    $this->assertEqual($mapping, array(), 'Empty array returned when an entity type, bundle pair has no mapping.');
+  }
+}
+
+/**
+ * Test RDFa markup generation.
+ */
+class RdfRdfaMarkupTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'RDFa markup',
+      'description' => 'Test RDFa markup generation.',
+      'group' => 'RDF',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('rdf', 'field_test', 'rdf_test');
+  }
+
+  /**
+   * Test rdf_rdfa_attributes().
+   */
+  function testDrupalRdfaAttributes() {
+    // Same value as the one in the HTML tag (no callback function).
+    $expected_attributes = array(
+      'property' => array('dc:title'),
+    );
+    $mapping = rdf_mapping_load('test_entity', 'test_bundle');
+    $attributes = rdf_rdfa_attributes($mapping['title']);
+    ksort($expected_attributes);
+    ksort($attributes);
+    $this->assertEqual($expected_attributes, $attributes);
+
+    // Value different from the one in the HTML tag (callback function).
+    $date = 1252750327;
+    $isoDate = date('c', $date);
+    $expected_attributes = array(
+      'datatype' => 'xsd:dateTime',
+      'property' => array('dc:created'),
+      'content' => $isoDate,
+    );
+    $mapping = rdf_mapping_load('test_entity', 'test_bundle');
+    $attributes = rdf_rdfa_attributes($mapping['created'], $date);
+    ksort($expected_attributes);
+    ksort($attributes);
+    $this->assertEqual($expected_attributes, $attributes);
+
+    // Same value as the one in the HTML tag with datatype.
+    $expected_attributes = array(
+      'datatype' => 'foo:bar1type',
+      'property' => array('foo:bar1'),
+    );
+    $mapping = rdf_mapping_load('test_entity', 'test_bundle');
+    $attributes = rdf_rdfa_attributes($mapping['foobar1']);
+    ksort($expected_attributes);
+    ksort($attributes);
+    $this->assertEqual($expected_attributes, $attributes);
+
+    // ObjectProperty mapping (rel).
+    $expected_attributes = array(
+      'rel' => array('sioc:has_creator', 'dc:creator'),
+    );
+    $mapping = rdf_mapping_load('test_entity', 'test_bundle');
+    $attributes = rdf_rdfa_attributes($mapping['foobar_objproperty1']);
+    ksort($expected_attributes);
+    ksort($attributes);
+    $this->assertEqual($expected_attributes, $attributes);
+
+    // Inverse ObjectProperty mapping (rev).
+    $expected_attributes = array(
+      'rev' => array('sioc:reply_of'),
+    );
+    $mapping = rdf_mapping_load('test_entity', 'test_bundle');
+    $attributes = rdf_rdfa_attributes($mapping['foobar_objproperty2']);
+    ksort($expected_attributes);
+    ksort($attributes);
+    $this->assertEqual($expected_attributes, $attributes);
+  }
+
+  /**
+   * Ensure that file fields have the correct resource as the object in RDFa
+   * when displayed as a teaser.
+   */
+  function testAttributesInMarkupFile() {
+    // Create a user to post the image.
+    $admin_user = $this->drupalCreateUser(array('edit own article content', 'revert revisions', 'administer content types'));
+    $this->drupalLogin($admin_user);
+
+    $langcode = LANGUAGE_NONE;
+    $bundle_name = "article";
+
+    $field_name = 'file_test';
+    $field = array(
+      'field_name' => $field_name,
+      'type' => 'file',
+    );
+    field_create_field($field);
+    $instance = array(
+      'field_name' => $field_name,
+      'entity_type' => 'node',
+      'bundle' => $bundle_name,
+      'display' => array(
+        'teaser' => array(
+          'type' => 'file_default',
+        ),
+      ),
+    );
+    field_create_instance($instance);
+
+    // Set the RDF mapping for the new field.
+    $rdf_mapping = rdf_mapping_load('node', $bundle_name);
+    $rdf_mapping += array($field_name => array('predicates' => array('rdfs:seeAlso'), 'type' => 'rel'));
+    $rdf_mapping_save = array('mapping' => $rdf_mapping, 'type' => 'node', 'bundle' => $bundle_name);
+    rdf_mapping_save($rdf_mapping_save);
+
+    // Get the test file that simpletest provides.
+    $file = current($this->drupalGetTestFiles('text'));
+
+    // Prepare image variables.
+    $image_field = "field_image";
+    // Get the test image that simpletest provides.
+    $image = current($this->drupalGetTestFiles('image'));
+
+    // Create an array for drupalPost with the field names as the keys and
+    // the URIs for the test files as the values.
+    $edit = array("files[" . $field_name . "_" . $langcode . "_0]" => drupal_realpath($file->uri),
+                  "files[" . $image_field . "_" . $langcode . "_0]" => drupal_realpath($image->uri));
+
+    // Create node and save, then edit node to upload files.
+    $node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    // Get filenames and nid for comparison with HTML output.
+    $file_filename = $file->filename;
+    $image_filename = $image->filename;
+    $nid = $node->nid;
+    // Navigate to front page, where node is displayed in teaser form.
+    $this->drupalGet('node');
+
+    // We only check to make sure that the resource attribute contains '.txt'
+    // instead of the full file name because the filename is altered on upload.
+    $file_rel = $this->xpath('//div[contains(@about, :node-uri)]//div[contains(@rel, "rdfs:seeAlso") and contains(@resource, ".txt")]', array(
+      ':node-uri' => 'node/' . $nid,
+    ));
+    $this->assertTrue(!empty($file_rel), "Attribute 'rel' set on file field. Attribute 'resource' is also set.");
+    $image_rel = $this->xpath('//div[contains(@about, :node-uri)]//div[contains(@rel, "rdfs:seeAlso") and contains(@resource, :image)]//img[contains(@typeof, "foaf:Image")]', array(
+      ':node-uri' => 'node/' . $nid,
+      ':image' => $image_filename,
+    ));
+
+    $this->assertTrue(!empty($image_rel), "Attribute 'rel' set on image field. Attribute 'resource' is also set.");
+
+    // Edits the node to add tags.
+    $tag1 = $this->randomName(8);
+    $tag2 = $this->randomName(8);
+    $edit = array();
+    $edit['field_tags[' . LANGUAGE_NONE . ']'] = "$tag1, $tag2";
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    // Ensures the RDFa markup for the relationship between the node and its
+    // tags is correct.
+    $term_rdfa_meta = $this->xpath('//div[@about=:node-url and contains(@typeof, "sioc:Item") and contains(@typeof, "foaf:Document")]//ul[@class="links"]/li[@rel="dc:subject"]/a[@typeof="skos:Concept" and @datatype="" and text()=:term-name]', array(
+      ':node-url' => url('node/' . $node->nid),
+      ':term-name' => $tag1,
+    ));
+    $this->assertTrue(!empty($term_rdfa_meta), 'Property dc:subject is present for the tag1 field item.');
+    $term_rdfa_meta = $this->xpath('//div[@about=:node-url and contains(@typeof, "sioc:Item") and contains(@typeof, "foaf:Document")]//ul[@class="links"]/li[@rel="dc:subject"]/a[@typeof="skos:Concept" and @datatype="" and text()=:term-name]', array(
+      ':node-url' => url('node/' . $node->nid),
+      ':term-name' => $tag2,
+    ));
+    $this->assertTrue(!empty($term_rdfa_meta), 'Property dc:subject is present for the tag2 field item.');
+  }
+}
+
+class RdfCrudTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'RDF mapping CRUD functions',
+      'description' => 'Test the RDF mapping CRUD functions.',
+      'group' => 'RDF',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('rdf', 'rdf_test');
+  }
+
+  /**
+   * Test inserting, loading, updating, and deleting RDF mappings.
+   */
+  function testCRUD() {
+    // Verify loading of a default mapping.
+    $mapping = _rdf_mapping_load('test_entity', 'test_bundle');
+    $this->assertTrue(count($mapping), 'Default mapping was found.');
+
+    // Verify saving a mapping.
+    $mapping = array(
+      'type' => 'crud_test_entity',
+      'bundle' => 'crud_test_bundle',
+      'mapping' => array(
+        'rdftype' => array('sioc:Post'),
+        'title' => array(
+          'predicates' => array('dc:title'),
+        ),
+        'uid' => array(
+          'predicates' => array('sioc:has_creator', 'dc:creator'),
+          'type' => 'rel',
+        ),
+      ),
+    );
+    $this->assertTrue(rdf_mapping_save($mapping) === SAVED_NEW, 'Mapping was saved.');
+
+    // Read the raw record from the {rdf_mapping} table.
+    $result = db_query('SELECT * FROM {rdf_mapping} WHERE type = :type AND bundle = :bundle', array(':type' => $mapping['type'], ':bundle' => $mapping['bundle']));
+    $stored_mapping = $result->fetchAssoc();
+    $stored_mapping['mapping'] = unserialize($stored_mapping['mapping']);
+    $this->assertEqual($mapping, $stored_mapping, 'Mapping was stored properly in the {rdf_mapping} table.');
+
+    // Verify loading of saved mapping.
+    $this->assertEqual($mapping['mapping'], _rdf_mapping_load($mapping['type'], $mapping['bundle']), 'Saved mapping loaded successfully.');
+
+    // Verify updating of mapping.
+    $mapping['mapping']['title'] = array(
+      'predicates' => array('dc2:bar2'),
+    );
+    $this->assertTrue(rdf_mapping_save($mapping) === SAVED_UPDATED, 'Mapping was updated.');
+
+    // Read the raw record from the {rdf_mapping} table.
+    $result = db_query('SELECT * FROM {rdf_mapping} WHERE type = :type AND bundle = :bundle', array(':type' => $mapping['type'], ':bundle' => $mapping['bundle']));
+    $stored_mapping = $result->fetchAssoc();
+    $stored_mapping['mapping'] = unserialize($stored_mapping['mapping']);
+    $this->assertEqual($mapping, $stored_mapping, 'Updated mapping was stored properly in the {rdf_mapping} table.');
+
+    // Verify loading of saved mapping.
+    $this->assertEqual($mapping['mapping'], _rdf_mapping_load($mapping['type'], $mapping['bundle']), 'Saved mapping loaded successfully.');
+
+    // Verify deleting of mapping.
+    $this->assertTrue(rdf_mapping_delete($mapping['type'], $mapping['bundle']), 'Mapping was deleted.');
+    $this->assertFalse(_rdf_mapping_load($mapping['type'], $mapping['bundle']), 'Deleted mapping is no longer found in the database.');
+  }
+}
+
+class RdfMappingDefinitionTestCase extends TaxonomyWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'RDF mapping definition functionality',
+      'description' => 'Test the different types of RDF mappings and ensure the proper RDFa markup in included in nodes and user profile pages.',
+      'group' => 'RDF',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('rdf', 'rdf_test', 'blog');
+  }
+
+  /**
+   * Create a node of type blog and test whether the RDF mapping defined for
+   * this node type in rdf_test.module is used in the node page.
+   */
+  function testAttributesInMarkup1() {
+    $node = $this->drupalCreateNode(array('type' => 'blog'));
+    $isoDate = date('c', $node->changed);
+    $url = url('node/' . $node->nid);
+    $this->drupalGet('node/' . $node->nid);
+
+    // Ensure the default bundle mapping for node is used. These attributes come
+    // from the node default bundle definition.
+    $blog_title = $this->xpath("//meta[@property='dc:title' and @content='$node->title']");
+    $blog_meta = $this->xpath("//div[(@about='$url') and (@typeof='sioct:Weblog')]//span[contains(@property, 'dc:date') and contains(@property, 'dc:created') and @datatype='xsd:dateTime' and @content='$isoDate']");
+    $this->assertTrue(!empty($blog_title), 'Property dc:title is present in meta tag.');
+    $this->assertTrue(!empty($blog_meta), 'RDF type is present on post. Properties dc:date and dc:created are present on post date.');
+  }
+
+  /**
+   * Create a content type and a node of type test_bundle_hook_install and test
+   * whether the RDF mapping defined in rdf_test.install is used.
+   */
+  function testAttributesInMarkup2() {
+    $type = $this->drupalCreateContentType(array('type' => 'test_bundle_hook_install'));
+    // Create node with single quotation mark title to ensure it does not get
+    // escaped more than once.
+    $node = $this->drupalCreateNode(array(
+      'type' => 'test_bundle_hook_install',
+      'title' => $this->randomName(8) . "'",
+    ));
+    $isoDate = date('c', $node->changed);
+    $url = url('node/' . $node->nid);
+    $this->drupalGet('node/' . $node->nid);
+
+    // Ensure the mapping defined in rdf_module.test is used.
+    $test_bundle_title = $this->xpath('//meta[@property="dc:title" and @content="' . $node->title . '"]');
+    $test_bundle_meta = $this->xpath("//div[(@about='$url') and contains(@typeof, 'foo:mapping_install1') and contains(@typeof, 'bar:mapping_install2')]//span[contains(@property, 'dc:date') and contains(@property, 'dc:created') and @datatype='xsd:dateTime' and @content='$isoDate']");
+    $this->assertTrue(!empty($test_bundle_title), 'Property dc:title is present in meta tag.');
+    $this->assertTrue(!empty($test_bundle_meta), 'RDF type is present on post. Properties dc:date and dc:created are present on post date.');
+  }
+
+  /**
+   * Create a random content type and node and ensure the default mapping for
+   * node is used.
+   */
+  function testAttributesInMarkup3() {
+    $type = $this->drupalCreateContentType();
+    $node = $this->drupalCreateNode(array('type' => $type->type));
+    $isoDate = date('c', $node->changed);
+    $url = url('node/' . $node->nid);
+    $this->drupalGet('node/' . $node->nid);
+
+    // Ensure the default bundle mapping for node is used. These attributes come
+    // from the node default bundle definition.
+    $random_bundle_title = $this->xpath("//meta[@property='dc:title' and @content='$node->title']");
+    $random_bundle_meta = $this->xpath("//div[(@about='$url') and contains(@typeof, 'sioc:Item') and contains(@typeof, 'foaf:Document')]//span[contains(@property, 'dc:date') and contains(@property, 'dc:created') and @datatype='xsd:dateTime' and @content='$isoDate']");
+    $this->assertTrue(!empty($random_bundle_title), 'Property dc:title is present in meta tag.');
+    $this->assertTrue(!empty($random_bundle_meta), 'RDF type is present on post. Properties dc:date and dc:created are present on post date.');
+  }
+
+  /**
+   * Create a random user and ensure the default mapping for user is used.
+   */
+  function testUserAttributesInMarkup() {
+    // Create two users, one with access to user profiles.
+    $user1 = $this->drupalCreateUser(array('access user profiles'));
+    $user2 = $this->drupalCreateUser();
+    $username = $user2->name;
+    $this->drupalLogin($user1);
+    // Browse to the user profile page.
+    $this->drupalGet('user/' . $user2->uid);
+    // Ensure the default bundle mapping for user is used on the user profile
+    // page. These attributes come from the user default bundle definition.
+    $account_uri = url('user/' . $user2->uid);
+    $person_uri = url('user/' . $user2->uid, array('fragment' => 'me'));
+
+    $user2_profile_about = $this->xpath('//div[@class="profile" and @typeof="sioc:UserAccount" and @about=:account-uri]', array(
+      ':account-uri' => $account_uri,
+    ));
+    $this->assertTrue(!empty($user2_profile_about), 'RDFa markup found on user profile page');
+
+    $user_account_holder = $this->xpath('//meta[contains(@typeof, "foaf:Person") and @about=:person-uri and @resource=:account-uri and contains(@rel, "foaf:account")]', array(
+      ':person-uri' => $person_uri,
+      ':account-uri' => $account_uri,
+    ));
+    $this->assertTrue(!empty($user_account_holder), 'URI created for account holder and username set on sioc:UserAccount.');
+
+    $user_username = $this->xpath('//meta[@about=:account-uri and contains(@property, "foaf:name") and @content=:username]', array(
+      ':account-uri' => $account_uri,
+      ':username' => $username,
+    ));
+    $this->assertTrue(!empty($user_username), 'foaf:name set on username.');
+
+    // User 2 creates node.
+    $this->drupalLogin($user2);
+    $node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+    $this->drupalLogin($user1);
+    $this->drupalGet('node/' . $node->nid);
+    // Ensures the default bundle mapping for user is used on the Authored By
+    // information on the node.
+    $author_about = $this->xpath('//a[@typeof="sioc:UserAccount" and @about=:account-uri and @property="foaf:name" and @datatype="" and contains(@xml:lang, "")]', array(
+      ':account-uri' => $account_uri,
+    ));
+    $this->assertTrue(!empty($author_about), 'RDFa markup found on author information on post. xml:lang on username is set to empty string.');
+  }
+
+  /**
+   * Creates a random term and ensures the right RDFa markup is used.
+   */
+  function testTaxonomyTermRdfaAttributes() {
+    $vocabulary = $this->createVocabulary();
+    $term = $this->createTerm($vocabulary);
+
+    // Views the term and checks that the RDFa markup is correct.
+    $this->drupalGet('taxonomy/term/' . $term->tid);
+    $term_url = url('taxonomy/term/' . $term->tid);
+    $term_name = $term->name;
+    $term_rdfa_meta = $this->xpath('//meta[@typeof="skos:Concept" and @about=:term-url and contains(@property, "rdfs:label") and contains(@property, "skos:prefLabel") and @content=:term-name]', array(
+      ':term-url' => $term_url,
+      ':term-name' => $term_name,
+    ));
+    $this->assertTrue(!empty($term_rdfa_meta), 'RDFa markup found on term page.');
+  }
+}
+
+class RdfCommentAttributesTestCase extends CommentHelperCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'RDF comment mapping',
+      'description' => 'Tests the RDFa markup of comments.',
+      'group' => 'RDF',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp('comment', 'rdf', 'rdf_test');
+
+    $this->admin_user = $this->drupalCreateUser(array('administer content types', 'administer comments', 'administer permissions', 'administer blocks'));
+    $this->web_user = $this->drupalCreateUser(array('access comments', 'post comments', 'create article content', 'access user profiles'));
+
+    // Enables anonymous user comments.
+    user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
+      'access comments' => TRUE,
+      'post comments' => TRUE,
+      'skip comment approval' => TRUE,
+    ));
+    // Allows anonymous to leave their contact information.
+    $this->setCommentAnonymous(COMMENT_ANONYMOUS_MAY_CONTACT);
+    $this->setCommentPreview(DRUPAL_OPTIONAL);
+    $this->setCommentForm(TRUE);
+    $this->setCommentSubject(TRUE);
+    $this->setCommentSettings('comment_default_mode', COMMENT_MODE_THREADED, 'Comment paging changed.');
+
+    // Creates the nodes on which the test comments will be posted.
+    $this->drupalLogin($this->web_user);
+    $this->node1 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+    $this->node2 = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+    $this->drupalLogout();
+  }
+
+  /**
+   * Tests the presence of the RDFa markup for the number of comments.
+   */
+  public function testNumberOfCommentsRdfaMarkup() {
+    // Posts 2 comments as a registered user.
+    $this->drupalLogin($this->web_user);
+    $this->postComment($this->node1, $this->randomName(), $this->randomName());
+    $this->postComment($this->node1, $this->randomName(), $this->randomName());
+
+    // Tests number of comments in teaser view.
+    $this->drupalGet('node');
+    $comment_count_teaser = $this->xpath('//div[contains(@typeof, "sioc:Item")]//li[contains(@class, "comment-comments")]/a[contains(@property, "sioc:num_replies") and contains(@content, "2") and @datatype="xsd:integer"]');
+    $this->assertTrue(!empty($comment_count_teaser), 'RDFa markup for the number of comments found on teaser view.');
+    $comment_count_link = $this->xpath('//div[@about=:url]//a[contains(@property, "sioc:num_replies") and @rel=""]', array(':url' => url("node/{$this->node1->nid}")));
+    $this->assertTrue(!empty($comment_count_link), 'Empty rel attribute found in comment count link.');
+
+    // Tests number of comments in full node view.
+    $this->drupalGet('node/' . $this->node1->nid);
+    $node_url = url('node/' . $this->node1->nid);
+    $comment_count_teaser = $this->xpath('/html/head/meta[@about=:node-url and @property="sioc:num_replies" and @content="2" and @datatype="xsd:integer"]', array(':node-url' => $node_url));
+    $this->assertTrue(!empty($comment_count_teaser), 'RDFa markup for the number of comments found on full node view.');
+  }
+
+  /**
+   * Tests the presence of the RDFa markup for the title, date and author and
+   * homepage on registered users and anonymous comments.
+   */
+  public function testCommentRdfaMarkup() {
+
+    // Posts comment #1 as a registered user.
+    $this->drupalLogin($this->web_user);
+    $comment1_subject = $this->randomName();
+    $comment1_body = $this->randomName();
+    $comment1 = $this->postComment($this->node1, $comment1_body, $comment1_subject);
+
+    // Tests comment #1 with access to the user profile.
+    $this->drupalGet('node/' . $this->node1->nid);
+    $this->_testBasicCommentRdfaMarkup($comment1);
+
+    // Tests comment #1 with no access to the user profile (as anonymous user).
+    $this->drupalLogout();
+    $this->drupalGet('node/' . $this->node1->nid);
+    $this->_testBasicCommentRdfaMarkup($comment1);
+
+    // Posts comment #2 as anonymous user.
+    $comment2_subject = $this->randomName();
+    $comment2_body = $this->randomName();
+    $anonymous_user = array();
+    $anonymous_user['name'] = $this->randomName();
+    $anonymous_user['mail'] = 'tester@simpletest.org';
+    $anonymous_user['homepage'] = 'http://example.org/';
+    $comment2 = $this->postComment($this->node2, $comment2_body, $comment2_subject, $anonymous_user);
+    $this->drupalGet('node/' . $this->node2->nid);
+
+    // Tests comment #2 as anonymous user.
+    $this->_testBasicCommentRdfaMarkup($comment2, $anonymous_user);
+    // Tests the RDFa markup for the homepage (specific to anonymous comments).
+    $comment_homepage = $this->xpath('//div[contains(@class, "comment") and contains(@typeof, "sioct:Comment")]//span[@rel="sioc:has_creator"]/a[contains(@class, "username") and @typeof="sioc:UserAccount" and @property="foaf:name" and @datatype="" and @href="http://example.org/" and contains(@rel, "foaf:page")]');
+    $this->assertTrue(!empty($comment_homepage), 'RDFa markup for the homepage of anonymous user found.');
+    // There should be no about attribute on anonymous comments.
+    $comment_homepage = $this->xpath('//div[contains(@class, "comment") and contains(@typeof, "sioct:Comment")]//span[@rel="sioc:has_creator"]/a[@about]');
+    $this->assertTrue(empty($comment_homepage), 'No about attribute is present on anonymous user comment.');
+
+    // Tests comment #2 as logged in user.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('node/' . $this->node2->nid);
+    $this->_testBasicCommentRdfaMarkup($comment2, $anonymous_user);
+    // Tests the RDFa markup for the homepage (specific to anonymous comments).
+    $comment_homepage = $this->xpath('//div[contains(@class, "comment") and contains(@typeof, "sioct:Comment")]//span[@rel="sioc:has_creator"]/a[contains(@class, "username") and @typeof="sioc:UserAccount" and @property="foaf:name" and @datatype="" and @href="http://example.org/" and contains(@rel, "foaf:page")]');
+    $this->assertTrue(!empty($comment_homepage), "RDFa markup for the homepage of anonymous user found.");
+    // There should be no about attribute on anonymous comments.
+    $comment_homepage = $this->xpath('//div[contains(@class, "comment") and contains(@typeof, "sioct:Comment")]//span[@rel="sioc:has_creator"]/a[@about]');
+    $this->assertTrue(empty($comment_homepage), "No about attribute is present on anonymous user comment.");
+  }
+
+  /**
+   * Test RDF comment replies.
+   */
+  public function testCommentReplyOfRdfaMarkup() {
+    // Posts comment #1 as a registered user.
+    $this->drupalLogin($this->web_user);
+    $comments[] = $this->postComment($this->node1, $this->randomName(), $this->randomName());
+
+    // Tests the reply_of relationship of a first level comment.
+    $result = $this->xpath("(id('comments')//div[contains(@class,'comment ')])[position()=1]//span[@rel='sioc:reply_of' and @resource=:node]", array(':node' => url("node/{$this->node1->nid}")));
+    $this->assertEqual(1, count($result), 'RDFa markup referring to the node is present.');
+    $result = $this->xpath("(id('comments')//div[contains(@class,'comment ')])[position()=1]//span[@rel='sioc:reply_of' and @resource=:comment]", array(':comment' => url('comment/1#comment-1')));
+    $this->assertFalse($result, 'No RDFa markup referring to the comment itself is present.');
+
+    // Posts a reply to the first comment.
+    $this->drupalGet('comment/reply/' . $this->node1->nid . '/' . $comments[0]->id);
+    $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
+
+    // Tests the reply_of relationship of a second level comment.
+    $result = $this->xpath("(id('comments')//div[contains(@class,'comment ')])[position()=2]//span[@rel='sioc:reply_of' and @resource=:node]", array(':node' => url("node/{$this->node1->nid}")));
+    $this->assertEqual(1, count($result), 'RDFa markup referring to the node is present.');
+    $result = $this->xpath("(id('comments')//div[contains(@class,'comment ')])[position()=2]//span[@rel='sioc:reply_of' and @resource=:comment]", array(':comment' => url('comment/1', array('fragment' => 'comment-1'))));
+    $this->assertEqual(1, count($result), 'RDFa markup referring to the parent comment is present.');
+    $comments = $this->xpath("(id('comments')//div[contains(@class,'comment ')])[position()=2]");
+  }
+
+  /**
+   * Helper function for testCommentRdfaMarkup().
+   *
+   * Tests the current page for basic comment RDFa markup.
+   *
+   * @param $comment
+   *   Comment object.
+   * @param $account
+   *   An array containing information about an anonymous user.
+   */
+  function _testBasicCommentRdfaMarkup($comment, $account = array()) {
+    $comment_container = $this->xpath('//div[contains(@class, "comment") and contains(@typeof, "sioct:Comment")]');
+    $this->assertTrue(!empty($comment_container), "Comment RDF type for comment found.");
+    $comment_title = $this->xpath('//div[contains(@class, "comment") and contains(@typeof, "sioct:Comment")]//h3[@property="dc:title"]');
+    $this->assertEqual((string)$comment_title[0]->a, $comment->subject, "RDFa markup for the comment title found.");
+    $comment_date = $this->xpath('//div[contains(@class, "comment") and contains(@typeof, "sioct:Comment")]//*[contains(@property, "dc:date") and contains(@property, "dc:created")]');
+    $this->assertTrue(!empty($comment_date), "RDFa markup for the date of the comment found.");
+    // The author tag can be either a or span
+    $comment_author = $this->xpath('//div[contains(@class, "comment") and contains(@typeof, "sioct:Comment")]//span[@rel="sioc:has_creator"]/*[contains(@class, "username") and @typeof="sioc:UserAccount" and @property="foaf:name" and @datatype=""]');
+    $name = empty($account["name"]) ? $this->web_user->name : $account["name"] . " (not verified)";
+    $this->assertEqual((string)$comment_author[0], $name, "RDFa markup for the comment author found.");
+    $comment_body = $this->xpath('//div[contains(@class, "comment") and contains(@typeof, "sioct:Comment")]//div[@class="content"]//div[contains(@class, "comment-body")]//div[@property="content:encoded"]');
+    $this->assertEqual((string)$comment_body[0]->p, $comment->comment, "RDFa markup for the comment body found.");
+  }
+}
+
+class RdfTrackerAttributesTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'RDF tracker page mapping',
+      'description' => 'Test the mapping for the tracker page and ensure the proper RDFa markup in included.',
+      'group' => 'RDF',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('rdf', 'rdf_test', 'tracker');
+    // Enable anonymous posting of content.
+    user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
+      'create article content' => TRUE,
+      'access comments' => TRUE,
+      'post comments' => TRUE,
+      'skip comment approval' => TRUE,
+    ));
+  }
+
+  /**
+   * Create nodes as both admin and anonymous user and test for correct RDFa
+   * markup on the tracker page for those nodes and their comments.
+   */
+  function testAttributesInTracker() {
+    // Create node as anonymous user.
+    $node_anon = $this->drupalCreateNode(array('type' => 'article', 'uid' => 0));
+    // Create node as admin user.
+    $node_admin = $this->drupalCreateNode(array('type' => 'article', 'uid' => 1));
+
+    // Pass both the anonymously posted node and the administrator posted node
+    // through to test for the RDF attributes.
+    $this->_testBasicTrackerRdfaMarkup($node_anon);
+    $this->_testBasicTrackerRdfaMarkup($node_admin);
+
+  }
+
+  /**
+   * Helper function for testAttributesInTracker().
+   *
+   * Tests the tracker page for RDFa markup.
+   *
+   * @param $node
+   * The node just created.
+   */
+  function _testBasicTrackerRdfaMarkup($node) {
+    $url = url('node/' . $node->nid);
+
+    $user = ($node->uid == 0) ? 'Anonymous user' : 'Registered user';
+
+    // Navigate to tracker page.
+    $this->drupalGet('tracker');
+
+    // Tests whether the about property is applied. This is implicit in the
+    // success of the following tests, but making it explicit will make
+    // debugging easier in case of failure.
+    $tracker_about = $this->xpath('//tr[@about=:url]', array(':url' => $url));
+    $this->assertTrue(!empty($tracker_about), format_string('About attribute found on table row for @user content.', array('@user'=> $user)));
+
+    // Tests whether the title has the correct property attribute.
+    $tracker_title = $this->xpath('//tr[@about=:url]/td[@property="dc:title" and @datatype=""]', array(':url' => $url));
+    $this->assertTrue(!empty($tracker_title), format_string('Title property attribute found on @user content.', array('@user'=> $user)));
+
+    // Tests whether the relationship between the content and user has been set.
+    $tracker_user = $this->xpath('//tr[@about=:url]//td[contains(@rel, "sioc:has_creator")]//*[contains(@typeof, "sioc:UserAccount") and contains(@property, "foaf:name")]', array(':url' => $url));
+    $this->assertTrue(!empty($tracker_user), format_string('Typeof and name property attributes found on @user.', array('@user'=> $user)));
+    // There should be an about attribute on logged in users and no about
+    // attribute for anonymous users.
+    $tracker_user = $this->xpath('//tr[@about=:url]//td[@rel="sioc:has_creator"]/*[@about]', array(':url' => $url));
+    if ($node->uid == 0) {
+      $this->assertTrue(empty($tracker_user), format_string('No about attribute is present on @user.', array('@user'=> $user)));
+    }
+    elseif ($node->uid > 0) {
+      $this->assertTrue(!empty($tracker_user), format_string('About attribute is present on @user.', array('@user'=> $user)));
+    }
+
+    // Tests whether the property has been set for number of comments.
+    $tracker_replies = $this->xpath('//tr[@about=:url]//td[contains(@property, "sioc:num_replies") and contains(@content, "0") and @datatype="xsd:integer"]', array(':url' => $url));
+    $this->assertTrue($tracker_replies, format_string('Num replies property and content attributes found on @user content.', array('@user'=> $user)));
+
+    // Tests that the appropriate RDFa markup to annotate the latest activity
+    // date has been added to the tracker output before comments have been
+    // posted, meaning the latest activity reflects changes to the node itself.
+    $isoDate = date('c', $node->changed);
+    $tracker_activity = $this->xpath('//tr[@about=:url]//td[contains(@property, "dc:modified") and contains(@property, "sioc:last_activity_date") and contains(@datatype, "xsd:dateTime") and @content=:date]', array(':url' => $url, ':date' => $isoDate));
+    $this->assertTrue(!empty($tracker_activity), format_string('Latest activity date and changed properties found when there are no comments on @user content. Latest activity date content is correct.', array('@user'=> $user)));
+
+    // Tests that the appropriate RDFa markup to annotate the latest activity
+    // date has been added to the tracker output after a comment is posted.
+    $comment = array(
+      'subject' => $this->randomName(),
+      'comment_body[' . LANGUAGE_NONE . '][0][value]' => $this->randomName(),
+    );
+    $this->drupalPost('comment/reply/' . $node->nid, $comment, t('Save'));
+    $this->drupalGet('tracker');
+
+    // Tests whether the property has been set for number of comments.
+    $tracker_replies = $this->xpath('//tr[@about=:url]//td[contains(@property, "sioc:num_replies") and contains(@content, "1") and @datatype="xsd:integer"]', array(':url' => $url));
+    $this->assertTrue($tracker_replies, format_string('Num replies property and content attributes found on @user content.', array('@user'=> $user)));
+
+    // Need to query database directly to obtain last_activity_date because
+    // it cannot be accessed via node_load().
+    $result = db_query('SELECT t.changed FROM {tracker_node} t WHERE t.nid = (:nid)', array(':nid' => $node->nid));
+    foreach ($result as $node) {
+      $expected_last_activity_date = $node->changed;
+    }
+    $isoDate = date('c', $expected_last_activity_date);
+    $tracker_activity = $this->xpath('//tr[@about=:url]//td[@property="sioc:last_activity_date" and @datatype="xsd:dateTime" and @content=:date]', array(':url' => $url, ':date' => $isoDate));
+    $this->assertTrue(!empty($tracker_activity), format_string('Latest activity date found when there are comments on @user content. Latest activity date content is correct.', array('@user'=> $user)));
+  }
+}
+
+/**
+ * Tests for RDF namespaces declaration with hook_rdf_namespaces().
+ */
+class RdfGetRdfNamespacesTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'RDF namespaces',
+      'description' => 'Test hook_rdf_namespaces() and ensure only "safe" namespaces are returned.',
+      'group' => 'RDF',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('rdf', 'rdf_test');
+  }
+
+  /**
+   * Test getting RDF namesapces.
+   */
+  function testGetRdfNamespaces() {
+    // Get all RDF namespaces.
+    $ns = rdf_get_namespaces();
+
+    $this->assertEqual($ns['rdfs'], 'http://www.w3.org/2000/01/rdf-schema#', 'A prefix declared once is included.');
+    $this->assertEqual($ns['foaf'], 'http://xmlns.com/foaf/0.1/', 'The same prefix declared in several implementations of hook_rdf_namespaces() is valid as long as all the namespaces are the same.');
+    $this->assertEqual($ns['foaf1'], 'http://xmlns.com/foaf/0.1/', 'Two prefixes can be assigned the same namespace.');
+    $this->assertTrue(!isset($ns['dc']), 'A prefix with conflicting namespaces is discarded.');
+  }
+}
diff --git a/htmltest/modules/rdf/tests/rdf_test.info b/htmltest/modules/rdf/tests/rdf_test.info
new file mode 100644
index 00000000..e3bc49d7
--- /dev/null
+++ b/htmltest/modules/rdf/tests/rdf_test.info
@@ -0,0 +1,12 @@
+name = "RDF module tests"
+description = "Support module for RDF module testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/rdf/tests/rdf_test.install b/htmltest/modules/rdf/tests/rdf_test.install
new file mode 100644
index 00000000..91a33927
--- /dev/null
+++ b/htmltest/modules/rdf/tests/rdf_test.install
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the rdf module.
+ */
+
+/**
+ * Implements hook_install().
+ */
+function rdf_test_install() {
+  $rdf_mappings = array(
+    array(
+      'type' => 'node',
+      'bundle' => 'test_bundle_hook_install',
+      'mapping' => array(
+        'rdftype' => array('foo:mapping_install1', 'bar:mapping_install2'),
+      ),
+    ),
+  );
+
+  foreach ($rdf_mappings as $rdf_mapping) {
+    rdf_mapping_save($rdf_mapping);
+  }
+}
diff --git a/htmltest/modules/rdf/tests/rdf_test.module b/htmltest/modules/rdf/tests/rdf_test.module
new file mode 100644
index 00000000..c133a33e
--- /dev/null
+++ b/htmltest/modules/rdf/tests/rdf_test.module
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * @file
+ * Test API interaction with the RDF module.
+ */
+
+/**
+ * Implements hook_rdf_mapping().
+ */
+function rdf_test_rdf_mapping() {
+  return array(
+    array(
+      'type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'mapping' => array(
+        'rdftype' => array('sioc:Post'),
+        'title' => array(
+          'predicates' => array('dc:title'),
+        ),
+        'created' => array(
+          'predicates' => array('dc:created'),
+          'datatype' => 'xsd:dateTime',
+          'callback' => 'date_iso8601',
+        ),
+        'uid' => array(
+          'predicates' => array('sioc:has_creator', 'dc:creator'),
+          'type' => 'rel',
+        ),
+        'foobar' => array(
+          'predicates' => array('foo:bar'),
+        ),
+        'foobar1' => array(
+          'datatype' => 'foo:bar1type',
+          'predicates' => array('foo:bar1'),
+        ),
+        'foobar_objproperty1' => array(
+          'predicates' => array('sioc:has_creator', 'dc:creator'),
+          'type' => 'rel',
+        ),
+        'foobar_objproperty2' => array(
+          'predicates' => array('sioc:reply_of'),
+          'type' => 'rev',
+        ),
+      ),
+    ),
+    array(
+      'type' => 'node',
+      'bundle' => 'blog',
+      'mapping' => array(
+        'rdftype' => array('sioct:Weblog'),
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_rdf_namespaces().
+ */
+function rdf_test_rdf_namespaces() {
+  return array(
+    'dc'       => 'http://purl.org/conflicting/namespace',
+    'foaf'     => 'http://xmlns.com/foaf/0.1/',
+    'foaf1'    => 'http://xmlns.com/foaf/0.1/',
+  );
+}
diff --git a/htmltest/modules/search/search-block-form.tpl.php b/htmltest/modules/search/search-block-form.tpl.php
new file mode 100644
index 00000000..da58403c
--- /dev/null
+++ b/htmltest/modules/search/search-block-form.tpl.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Displays the search form block.
+ *
+ * Available variables:
+ * - $search_form: The complete search form ready for print.
+ * - $search: Associative array of search elements. Can be used to print each
+ *   form element separately.
+ *
+ * Default elements within $search:
+ * - $search['search_block_form']: Text input area wrapped in a div.
+ * - $search['actions']: Rendered form buttons.
+ * - $search['hidden']: Hidden form elements. Used to validate forms when
+ *   submitted.
+ *
+ * Modules can add to the search form, so it is recommended to check for their
+ * existence before printing. The default keys will always exist. To check for
+ * a module-provided field, use code like this:
+ * @code
+ *   <?php if (isset($search['extra_field'])): ?>
+ *     <div class="extra-field">
+ *       <?php print $search['extra_field']; ?>
+ *     </div>
+ *   <?php endif; ?>
+ * @endcode
+ *
+ * @see template_preprocess_search_block_form()
+ */
+?>
+<div class="container-inline">
+  <?php if (empty($variables['form']['#block']->subject)): ?>
+    <h2 class="element-invisible"><?php print t('Search form'); ?></h2>
+  <?php endif; ?>
+  <?php print $search_form; ?>
+</div>
diff --git a/htmltest/modules/search/search-result.tpl.php b/htmltest/modules/search/search-result.tpl.php
new file mode 100644
index 00000000..5f2e8bd2
--- /dev/null
+++ b/htmltest/modules/search/search-result.tpl.php
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation for displaying a single search result.
+ *
+ * This template renders a single search result and is collected into
+ * search-results.tpl.php. This and the parent template are
+ * dependent to one another sharing the markup for definition lists.
+ *
+ * Available variables:
+ * - $url: URL of the result.
+ * - $title: Title of the result.
+ * - $snippet: A small preview of the result. Does not apply to user searches.
+ * - $info: String of all the meta information ready for print. Does not apply
+ *   to user searches.
+ * - $info_split: Contains same data as $info, split into a keyed array.
+ * - $module: The machine-readable name of the module (tab) being searched, such
+ *   as "node" or "user".
+ * - $title_prefix (array): An array containing additional output populated by
+ *   modules, intended to be displayed in front of the main title tag that
+ *   appears in the template.
+ * - $title_suffix (array): An array containing additional output populated by
+ *   modules, intended to be displayed after the main title tag that appears in
+ *   the template.
+ *
+ * Default keys within $info_split:
+ * - $info_split['module']: The module that implemented the search query.
+ * - $info_split['user']: Author of the node linked to users profile. Depends
+ *   on permission.
+ * - $info_split['date']: Last update of the node. Short formatted.
+ * - $info_split['comment']: Number of comments output as "% comments", %
+ *   being the count. Depends on comment.module.
+ *
+ * Other variables:
+ * - $classes_array: Array of HTML class attribute values. It is flattened
+ *   into a string within the variable $classes.
+ * - $title_attributes_array: Array of HTML attributes for the title. It is
+ *   flattened into a string within the variable $title_attributes.
+ * - $content_attributes_array: Array of HTML attributes for the content. It is
+ *   flattened into a string within the variable $content_attributes.
+ *
+ * Since $info_split is keyed, a direct print of the item is possible.
+ * This array does not apply to user searches so it is recommended to check
+ * for its existence before printing. The default keys of 'type', 'user' and
+ * 'date' always exist for node searches. Modules may provide other data.
+ * @code
+ *   <?php if (isset($info_split['comment'])): ?>
+ *     <span class="info-comment">
+ *       <?php print $info_split['comment']; ?>
+ *     </span>
+ *   <?php endif; ?>
+ * @endcode
+ *
+ * To check for all available data within $info_split, use the code below.
+ * @code
+ *   <?php print '<pre>'. check_plain(print_r($info_split, 1)) .'</pre>'; ?>
+ * @endcode
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_search_result()
+ * @see template_process()
+ *
+ * @ingroup themeable
+ */
+?>
+<li class="<?php print $classes; ?>"<?php print $attributes; ?>>
+  <?php print render($title_prefix); ?>
+  <h3 class="title"<?php print $title_attributes; ?>>
+    <a href="<?php print $url; ?>"><?php print $title; ?></a>
+  </h3>
+  <?php print render($title_suffix); ?>
+  <div class="search-snippet-info">
+    <?php if ($snippet): ?>
+      <p class="search-snippet"<?php print $content_attributes; ?>><?php print $snippet; ?></p>
+    <?php endif; ?>
+    <?php if ($info): ?>
+      <p class="search-info"><?php print $info; ?></p>
+    <?php endif; ?>
+  </div>
+</li>
diff --git a/htmltest/modules/search/search-results.tpl.php b/htmltest/modules/search/search-results.tpl.php
new file mode 100644
index 00000000..aa9bf8d4
--- /dev/null
+++ b/htmltest/modules/search/search-results.tpl.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation for displaying search results.
+ *
+ * This template collects each invocation of theme_search_result(). This and
+ * the child template are dependent to one another sharing the markup for
+ * definition lists.
+ *
+ * Note that modules may implement their own search type and theme function
+ * completely bypassing this template.
+ *
+ * Available variables:
+ * - $search_results: All results as it is rendered through
+ *   search-result.tpl.php
+ * - $module: The machine-readable name of the module (tab) being searched, such
+ *   as "node" or "user".
+ *
+ *
+ * @see template_preprocess_search_results()
+ *
+ * @ingroup themeable
+ */
+?>
+<?php if ($search_results): ?>
+  <h2><?php print t('Search results');?></h2>
+  <ol class="search-results <?php print $module; ?>-results">
+    <?php print $search_results; ?>
+  </ol>
+  <?php print $pager; ?>
+<?php else : ?>
+  <h2><?php print t('Your search yielded no results');?></h2>
+  <?php print search_help('search#noresults', drupal_help_arg()); ?>
+<?php endif; ?>
diff --git a/htmltest/modules/search/search-rtl.css b/htmltest/modules/search/search-rtl.css
new file mode 100644
index 00000000..da9e8d9d
--- /dev/null
+++ b/htmltest/modules/search/search-rtl.css
@@ -0,0 +1,13 @@
+
+.search-advanced .criterion {
+  float: right;
+  margin-right: 0;
+  margin-left: 2em;
+}
+.search-advanced .action {
+  float: right;
+  clear: right;
+}
+.search-results .search-snippet-info {
+  padding-right: 1em; /* LTR */
+}
\ No newline at end of file
diff --git a/htmltest/modules/search/search.admin.inc b/htmltest/modules/search/search.admin.inc
new file mode 100644
index 00000000..a609485a
--- /dev/null
+++ b/htmltest/modules/search/search.admin.inc
@@ -0,0 +1,186 @@
+<?php
+
+/**
+ * @file
+ * Admin page callbacks for the search module.
+ */
+
+/**
+ * Menu callback: confirm wiping of the index.
+ */
+function search_reindex_confirm() {
+  return confirm_form(array(), t('Are you sure you want to re-index the site?'),
+                  'admin/config/search/settings', t('The search index is not cleared but systematically updated to reflect the new settings. Searching will continue to work but new content won\'t be indexed until all existing content has been re-indexed. This action cannot be undone.'), t('Re-index site'), t('Cancel'));
+}
+
+/**
+ * Handler for wipe confirmation
+ */
+function search_reindex_confirm_submit(&$form, &$form_state) {
+  if ($form['confirm']) {
+    search_reindex();
+    drupal_set_message(t('The index will be rebuilt.'));
+    $form_state['redirect'] = 'admin/config/search/settings';
+    return;
+  }
+}
+
+/**
+ * Helper function to get real module names.
+ */
+function _search_get_module_names() {
+
+  $search_info = search_get_info(TRUE);
+  $system_info = system_get_info('module');
+  $names = array();
+  foreach ($search_info as $module => $info) {
+    $names[$module] = $system_info[$module]['name'];
+  }
+  asort($names, SORT_STRING);
+  return $names;
+}
+
+/**
+ * Menu callback: displays the search module settings page.
+ *
+ * @ingroup forms
+ *
+ * @see search_admin_settings_validate()
+ * @see search_admin_settings_submit()
+ * @see search_admin_reindex_submit()
+ */
+function search_admin_settings($form) {
+  // Collect some stats
+  $remaining = 0;
+  $total = 0;
+  foreach (variable_get('search_active_modules', array('node', 'user')) as $module) {
+    if ($status = module_invoke($module, 'search_status')) {
+      $remaining += $status['remaining'];
+      $total += $status['total'];
+    }
+  }
+
+  $count = format_plural($remaining, 'There is 1 item left to index.', 'There are @count items left to index.');
+  $percentage = ((int)min(100, 100 * ($total - $remaining) / max(1, $total))) . '%';
+  $status = '<p><strong>' . t('%percentage of the site has been indexed.', array('%percentage' => $percentage)) . ' ' . $count . '</strong></p>';
+  $form['status'] = array('#type' => 'fieldset', '#title' => t('Indexing status'));
+  $form['status']['status'] = array('#markup' => $status);
+  $form['status']['wipe'] = array('#type' => 'submit', '#value' => t('Re-index site'), '#submit' => array('search_admin_reindex_submit'));
+
+  $items = drupal_map_assoc(array(10, 20, 50, 100, 200, 500));
+
+  // Indexing throttle:
+  $form['indexing_throttle'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Indexing throttle')
+  );
+  $form['indexing_throttle']['search_cron_limit'] = array(
+    '#type' => 'select',
+    '#title' => t('Number of items to index per cron run'),
+    '#default_value' => variable_get('search_cron_limit', 100),
+    '#options' => $items,
+    '#description' => t('The maximum number of items indexed in each pass of a <a href="@cron">cron maintenance task</a>. If necessary, reduce the number of items to prevent timeouts and memory errors while indexing.', array('@cron' => url('admin/reports/status')))
+  );
+  // Indexing settings:
+  $form['indexing_settings'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Indexing settings')
+  );
+  $form['indexing_settings']['info'] = array(
+    '#markup' => t('<p><em>Changing the settings below will cause the site index to be rebuilt. The search index is not cleared but systematically updated to reflect the new settings. Searching will continue to work but new content won\'t be indexed until all existing content has been re-indexed.</em></p><p><em>The default settings should be appropriate for the majority of sites.</em></p>')
+  );
+  $form['indexing_settings']['minimum_word_size'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Minimum word length to index'),
+    '#default_value' => variable_get('minimum_word_size', 3),
+    '#size' => 5,
+    '#maxlength' => 3,
+    '#description' => t('The number of characters a word has to be to be indexed. A lower setting means better search result ranking, but also a larger database. Each search query must contain at least one keyword that is this size (or longer).'),
+    '#element_validate' => array('element_validate_integer_positive'),
+  );
+  $form['indexing_settings']['overlap_cjk'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Simple CJK handling'),
+    '#default_value' => variable_get('overlap_cjk', TRUE),
+    '#description' => t('Whether to apply a simple Chinese/Japanese/Korean tokenizer based on overlapping sequences. Turn this off if you want to use an external preprocessor for this instead. Does not affect other languages.')
+  );
+
+  $form['active'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Active search modules')
+  );
+  $module_options = _search_get_module_names();
+  $form['active']['search_active_modules'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Active modules'),
+    '#title_display' => 'invisible',
+    '#default_value' => variable_get('search_active_modules', array('node', 'user')),
+    '#options' => $module_options,
+    '#description' => t('Choose which search modules are active from the available modules.')
+  );
+  $form['active']['search_default_module'] = array(
+    '#title' => t('Default search module'),
+    '#type' => 'radios',
+    '#default_value' => variable_get('search_default_module', 'node'),
+    '#options' => $module_options,
+    '#description' => t('Choose which search module is the default.')
+  );
+  $form['#validate'][] = 'search_admin_settings_validate';
+  $form['#submit'][] = 'search_admin_settings_submit';
+
+  // Per module settings
+  foreach (variable_get('search_active_modules', array('node', 'user')) as $module) {
+    $added_form = module_invoke($module, 'search_admin');
+    if (is_array($added_form)) {
+      $form = array_merge($form, $added_form);
+    }
+  }
+
+  return system_settings_form($form);
+}
+
+/**
+ * Form validation handler for search_admin_settings().
+ */
+function search_admin_settings_validate($form, &$form_state) {
+  // Check whether we selected a valid default.
+  if ($form_state['triggering_element']['#value'] != t('Reset to defaults')) {
+    $new_modules = array_filter($form_state['values']['search_active_modules']);
+    $default = $form_state['values']['search_default_module'];
+    if (!in_array($default, $new_modules, TRUE)) {
+      form_set_error('search_default_module', t('Your default search module is not selected as an active module.'));
+    }
+  }
+}
+
+/**
+ * Form submission handler for search_admin_settings().
+ */
+function search_admin_settings_submit($form, &$form_state) {
+  // If these settings change, the index needs to be rebuilt.
+  if ((variable_get('minimum_word_size', 3) != $form_state['values']['minimum_word_size']) ||
+      (variable_get('overlap_cjk', TRUE) != $form_state['values']['overlap_cjk'])) {
+    drupal_set_message(t('The index will be rebuilt.'));
+    search_reindex();
+  }
+  $current_modules = variable_get('search_active_modules', array('node', 'user'));
+  // Check whether we are resetting the values.
+  if ($form_state['triggering_element']['#value'] == t('Reset to defaults')) {
+    $new_modules = array('node', 'user');
+  }
+  else {
+    $new_modules = array_filter($form_state['values']['search_active_modules']);
+  }
+  if (array_diff($current_modules, $new_modules)) {
+    drupal_set_message(t('The active search modules have been changed.'));
+    variable_set('menu_rebuild_needed', TRUE);
+  }
+}
+
+/**
+ * Form submission handler for reindex button on search_admin_settings_form().
+ */
+function search_admin_reindex_submit($form, &$form_state) {
+  // send the user to the confirmation page
+  $form_state['redirect'] = 'admin/config/search/settings/reindex';
+}
diff --git a/htmltest/modules/search/search.api.php b/htmltest/modules/search/search.api.php
new file mode 100644
index 00000000..62d53b85
--- /dev/null
+++ b/htmltest/modules/search/search.api.php
@@ -0,0 +1,376 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Search module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Define a custom search type.
+ *
+ * This hook allows a module to tell search.module that it wishes to perform
+ * searches on content it defines (custom node types, users, or comments for
+ * example) when a site search is performed.
+ *
+ * In order for the search to do anything, your module must also implement
+ * hook_search_execute(), which is called when someone requests a search
+ * on your module's type of content. If you want to have your content
+ * indexed in the standard search index, your module should also implement
+ * hook_update_index(). If your search type has settings, you can implement
+ * hook_search_admin() to add them to the search settings page. You can use
+ * hook_form_FORM_ID_alter(), with FORM_ID set to 'search_form', to add fields
+ * to the search form (see node_form_search_form_alter() for an example).
+ * You can use hook_search_access() to limit access to searching,
+ * and hook_search_page() to override how search results are displayed.
+ *
+ * @return
+ *   Array with optional keys:
+ *   - title: Title for the tab on the search page for this module. Defaults
+ *     to the module name if not given.
+ *   - path: Path component after 'search/' for searching with this module.
+ *     Defaults to the module name if not given.
+ *   - conditions_callback: An implementation of callback_search_conditions().
+ *
+ * @ingroup search
+ */
+function hook_search_info() {
+  return array(
+    'title' => 'Content',
+    'path' => 'node',
+    'conditions_callback' => 'callback_search_conditions',
+  );
+}
+
+/**
+ * Define access to a custom search routine.
+ *
+ * This hook allows a module to define permissions for a search tab.
+ *
+ * @ingroup search
+ */
+function hook_search_access() {
+  return user_access('access content');
+}
+
+/**
+ * Take action when the search index is going to be rebuilt.
+ *
+ * Modules that use hook_update_index() should update their indexing
+ * bookkeeping so that it starts from scratch the next time
+ * hook_update_index() is called.
+ *
+ * @ingroup search
+ */
+function hook_search_reset() {
+  db_update('search_dataset')
+    ->fields(array('reindex' => REQUEST_TIME))
+    ->condition('type', 'node')
+    ->execute();
+}
+
+/**
+ * Report the status of indexing.
+ *
+ * The core search module only invokes this hook on active modules.
+ * Implementing modules do not need to check whether they are active when
+ * calculating their return values.
+ *
+ * @return
+ *  An associative array with the key-value pairs:
+ *  - 'remaining': The number of items left to index.
+ *  - 'total': The total number of items to index.
+ *
+ * @ingroup search
+ */
+function hook_search_status() {
+  $total = db_query('SELECT COUNT(*) FROM {node} WHERE status = 1')->fetchField();
+  $remaining = db_query("SELECT COUNT(*) FROM {node} n LEFT JOIN {search_dataset} d ON d.type = 'node' AND d.sid = n.nid WHERE n.status = 1 AND d.sid IS NULL OR d.reindex <> 0")->fetchField();
+  return array('remaining' => $remaining, 'total' => $total);
+}
+
+/**
+ * Add elements to the search settings form.
+ *
+ * @return
+ *   Form array for the Search settings page at admin/config/search/settings.
+ *
+ * @ingroup search
+ */
+function hook_search_admin() {
+  // Output form for defining rank factor weights.
+  $form['content_ranking'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Content ranking'),
+  );
+  $form['content_ranking']['#theme'] = 'node_search_admin';
+  $form['content_ranking']['info'] = array(
+    '#value' => '<em>' . t('The following numbers control which properties the content search should favor when ordering the results. Higher numbers mean more influence, zero means the property is ignored. Changing these numbers does not require the search index to be rebuilt. Changes take effect immediately.') . '</em>'
+  );
+
+  // Note: reversed to reflect that higher number = higher ranking.
+  $options = drupal_map_assoc(range(0, 10));
+  foreach (module_invoke_all('ranking') as $var => $values) {
+    $form['content_ranking']['factors']['node_rank_' . $var] = array(
+      '#title' => $values['title'],
+      '#type' => 'select',
+      '#options' => $options,
+      '#default_value' => variable_get('node_rank_' . $var, 0),
+    );
+  }
+  return $form;
+}
+
+/**
+ * Execute a search for a set of key words.
+ *
+ * Use database API with the 'PagerDefault' query extension to perform your
+ * search.
+ *
+ * If your module uses hook_update_index() and search_index() to index its
+ * items, use table 'search_index' aliased to 'i' as the main table in your
+ * query, with the 'SearchQuery' extension. You can join to your module's table
+ * using the 'i.sid' field, which will contain the $sid values you provided to
+ * search_index(). Add the main keywords to the query by using method
+ * searchExpression(). The functions search_expression_extract() and
+ * search_expression_insert() may also be helpful for adding custom search
+ * parameters to the search expression.
+ *
+ * See node_search_execute() for an example of a module that uses the search
+ * index, and user_search_execute() for an example that doesn't use the search
+ * index.
+ *
+ * @param $keys
+ *   The search keywords as entered by the user.
+ * @param $conditions
+ *   An optional array of additional conditions, such as filters.
+ *
+ * @return
+ *   An array of search results. To use the default search result
+ *   display, each item should have the following keys':
+ *   - 'link': Required. The URL of the found item.
+ *   - 'type': The type of item (such as the content type).
+ *   - 'title': Required. The name of the item.
+ *   - 'user': The author of the item.
+ *   - 'date': A timestamp when the item was last modified.
+ *   - 'extra': An array of optional extra information items.
+ *   - 'snippet': An excerpt or preview to show with the result (can be
+ *     generated with search_excerpt()).
+ *   - 'language': Language code for the item (usually two characters).
+ *
+ * @ingroup search
+ */
+function hook_search_execute($keys = NULL, $conditions = NULL) {
+  // Build matching conditions
+  $query = db_select('search_index', 'i', array('target' => 'slave'))->extend('SearchQuery')->extend('PagerDefault');
+  $query->join('node', 'n', 'n.nid = i.sid');
+  $query
+    ->condition('n.status', 1)
+    ->addTag('node_access')
+    ->searchExpression($keys, 'node');
+
+  // Insert special keywords.
+  $query->setOption('type', 'n.type');
+  $query->setOption('language', 'n.language');
+  if ($query->setOption('term', 'ti.tid')) {
+    $query->join('taxonomy_index', 'ti', 'n.nid = ti.nid');
+  }
+  // Only continue if the first pass query matches.
+  if (!$query->executeFirstPass()) {
+    return array();
+  }
+
+  // Add the ranking expressions.
+  _node_rankings($query);
+
+  // Load results.
+  $find = $query
+    ->limit(10)
+    ->execute();
+  $results = array();
+  foreach ($find as $item) {
+    // Build the node body.
+    $node = node_load($item->sid);
+    node_build_content($node, 'search_result');
+    $node->body = drupal_render($node->content);
+
+    // Fetch comments for snippet.
+    $node->rendered .= ' ' . module_invoke('comment', 'node_update_index', $node);
+    // Fetch terms for snippet.
+    $node->rendered .= ' ' . module_invoke('taxonomy', 'node_update_index', $node);
+
+    $extra = module_invoke_all('node_search_result', $node);
+
+    $results[] = array(
+      'link' => url('node/' . $item->sid, array('absolute' => TRUE)),
+      'type' => check_plain(node_type_get_name($node)),
+      'title' => $node->title,
+      'user' => theme('username', array('account' => $node)),
+      'date' => $node->changed,
+      'node' => $node,
+      'extra' => $extra,
+      'score' => $item->calculated_score,
+      'snippet' => search_excerpt($keys, $node->body),
+    );
+  }
+  return $results;
+}
+
+/**
+ * Override the rendering of search results.
+ *
+ * A module that implements hook_search_info() to define a type of search may
+ * implement this hook in order to override the default theming of its search
+ * results, which is otherwise themed using theme('search_results').
+ *
+ * Note that by default, theme('search_results') and theme('search_result')
+ * work together to create an ordered list (OL). So your hook_search_page()
+ * implementation should probably do this as well.
+ *
+ * @param $results
+ *   An array of search results.
+ *
+ * @return
+ *   A renderable array, which will render the formatted search results with a
+ *   pager included.
+ *
+ * @see search-result.tpl.php
+ * @see search-results.tpl.php
+ */
+function hook_search_page($results) {
+  $output['prefix']['#markup'] = '<ol class="search-results">';
+
+  foreach ($results as $entry) {
+    $output[] = array(
+      '#theme' => 'search_result',
+      '#result' => $entry,
+      '#module' => 'my_module_name',
+    );
+  }
+  $output['suffix']['#markup'] = '</ol>' . theme('pager');
+
+  return $output;
+}
+
+/**
+ * Preprocess text for search.
+ *
+ * This hook is called to preprocess both the text added to the search index and
+ * the keywords users have submitted for searching.
+ *
+ * Possible uses:
+ * - Adding spaces between words of Chinese or Japanese text.
+ * - Stemming words down to their root words to allow matches between, for
+ *   instance, walk, walked, walking, and walks in searching.
+ * - Expanding abbreviations and acronymns that occur in text.
+ *
+ * @param $text
+ *   The text to preprocess. This is a single piece of plain text extracted
+ *   from between two HTML tags or from the search query. It will not contain
+ *   any HTML entities or HTML tags.
+ *
+ * @return
+ *   The text after preprocessing. Note that if your module decides not to alter
+ *   the text, it should return the original text. Also, after preprocessing,
+ *   words in the text should be separated by a space.
+ *
+ * @ingroup search
+ */
+function hook_search_preprocess($text) {
+  // Do processing on $text
+  return $text;
+}
+
+/**
+ * Update the search index for this module.
+ *
+ * This hook is called every cron run if search.module is enabled, your
+ * module has implemented hook_search_info(), and your module has been set as
+ * an active search module on the Search settings page
+ * (admin/config/search/settings). It allows your module to add items to the
+ * built-in search index using search_index(), or to add them to your module's
+ * own indexing mechanism.
+ *
+ * When implementing this hook, your module should index content items that
+ * were modified or added since the last run. PHP has a time limit
+ * for cron, though, so it is advisable to limit how many items you index
+ * per run using variable_get('search_cron_limit') (see example below). Also,
+ * since the cron run could time out and abort in the middle of your run, you
+ * should update your module's internal bookkeeping on when items have last
+ * been indexed as you go rather than waiting to the end of indexing.
+ *
+ * @ingroup search
+ */
+function hook_update_index() {
+  $limit = (int)variable_get('search_cron_limit', 100);
+
+  $result = db_query_range("SELECT n.nid FROM {node} n LEFT JOIN {search_dataset} d ON d.type = 'node' AND d.sid = n.nid WHERE d.sid IS NULL OR d.reindex <> 0 ORDER BY d.reindex ASC, n.nid ASC", 0, $limit);
+
+  foreach ($result as $node) {
+    $node = node_load($node->nid);
+
+    // Save the changed time of the most recent indexed node, for the search
+    // results half-life calculation.
+    variable_set('node_cron_last', $node->changed);
+
+    // Render the node.
+    node_build_content($node, 'search_index');
+    $node->rendered = drupal_render($node->content);
+
+    $text = '<h1>' . check_plain($node->title) . '</h1>' . $node->rendered;
+
+    // Fetch extra data normally not visible
+    $extra = module_invoke_all('node_update_index', $node);
+    foreach ($extra as $t) {
+      $text .= $t;
+    }
+
+    // Update index
+    search_index($node->nid, 'node', $text);
+  }
+}
+/**
+ * @} End of "addtogroup hooks".
+ */
+
+/**
+ * Provide search query conditions.
+ *
+ * Callback for hook_search_info().
+ *
+ * This callback is invoked by search_view() to get an array of additional
+ * search conditions to pass to search_data(). For example, a search module
+ * may get additional keywords, filters, or modifiers for the search from
+ * the query string.
+ *
+ * This example pulls additional search keywords out of the $_REQUEST variable,
+ * (i.e. from the query string of the request). The conditions may also be
+ * generated internally - for example based on a module's settings.
+ *
+ * @param $keys
+ *   The search keywords string.
+ *
+ * @return
+ *   An array of additional conditions, such as filters.
+ *
+ * @ingroup callbacks
+ * @ingroup search
+ */
+function callback_search_conditions($keys) {
+  $conditions = array();
+
+  if (!empty($_REQUEST['keys'])) {
+    $conditions['keys'] = $_REQUEST['keys'];
+  }
+  if (!empty($_REQUEST['sample_search_keys'])) {
+    $conditions['sample_search_keys'] = $_REQUEST['sample_search_keys'];
+  }
+  if ($force_keys = config('sample_search.settings')->get('force_keywords')) {
+    $conditions['sample_search_force_keywords'] = $force_keys;
+  }
+  return $conditions;
+}
diff --git a/htmltest/modules/search/search.css b/htmltest/modules/search/search.css
new file mode 100644
index 00000000..ff7230fb
--- /dev/null
+++ b/htmltest/modules/search/search.css
@@ -0,0 +1,34 @@
+
+.search-form {
+  margin-bottom: 1em;
+}
+.search-form input {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.search-results {
+  list-style: none;
+}
+.search-results p {
+  margin-top: 0;
+}
+.search-results .title {
+  font-size: 1.2em;
+}
+.search-results li {
+  margin-bottom: 1em;
+}
+.search-results .search-snippet-info {
+  padding-left: 1em; /* LTR */
+}
+.search-results .search-info {
+  font-size: 0.85em;
+}
+.search-advanced .criterion {
+  float: left; /* LTR */
+  margin-right: 2em; /* LTR */
+}
+.search-advanced .action {
+  float: left; /* LTR */
+  clear: left; /* LTR */
+}
diff --git a/htmltest/modules/search/search.extender.inc b/htmltest/modules/search/search.extender.inc
new file mode 100644
index 00000000..67094666
--- /dev/null
+++ b/htmltest/modules/search/search.extender.inc
@@ -0,0 +1,536 @@
+<?php
+
+/**
+ * @file
+ * Search query extender and helper functions.
+ */
+
+/**
+ * Do a query on the full-text search index for a word or words.
+ *
+ * This function is normally only called by each module that supports the
+ * indexed search (and thus, implements hook_update_index()).
+ *
+ * Results are retrieved in two logical passes. However, the two passes are
+ * joined together into a single query. And in the case of most simple
+ * queries the second pass is not even used.
+ *
+ * The first pass selects a set of all possible matches, which has the benefit
+ * of also providing the exact result set for simple "AND" or "OR" searches.
+ *
+ * The second portion of the query further refines this set by verifying
+ * advanced text conditions (such as negative or phrase matches).
+ *
+ * The used query object has the tag 'search_$module' and can be further
+ * extended with hook_query_alter().
+ */
+class SearchQuery extends SelectQueryExtender {
+  /**
+   * The search query that is used for searching.
+   *
+   * @var string
+   */
+  protected $searchExpression;
+
+  /**
+   * Type of search (search module).
+   *
+   * This maps to the value of the type column in search_index, and is equal
+   * to the machine-readable name of the module that implements
+   * hook_search_info().
+   *
+   * @var string
+   */
+  protected $type;
+
+  /**
+   * Positive and negative search keys.
+   *
+   * @var array
+   */
+  protected $keys = array('positive' => array(), 'negative' => array());
+
+  /**
+   * Indicates whether the first pass query requires complex conditions (LIKE).
+   *
+   * @var boolean.
+   */
+  protected $simple = TRUE;
+
+  /**
+   * Conditions that are used for exact searches.
+   *
+   * This is always used for the second pass query but not for the first pass,
+   * unless $this->simple is FALSE.
+   *
+   * @var DatabaseCondition
+   */
+  protected $conditions;
+
+  /**
+   * Indicates how many matches for a search query are necessary.
+   *
+   * @var int
+   */
+  protected $matches = 0;
+
+  /**
+   * Array of search words.
+   *
+   * These words have to match against {search_index}.word.
+   *
+   * @var array
+   */
+  protected $words = array();
+
+  /**
+   * Multiplier for the normalized search score.
+   *
+   * This value is calculated by the first pass query and multiplied with the
+   * actual score of a specific word to make sure that the resulting calculated
+   * score is between 0 and 1.
+   *
+   * @var float
+   */
+  protected $normalize;
+
+  /**
+   * Indicates whether the first pass query has been executed.
+   *
+   * @var boolean
+   */
+  protected $executedFirstPass = FALSE;
+
+  /**
+   * Stores score expressions.
+   *
+   * @var array
+   *
+   * @see addScore()
+   */
+  protected $scores = array();
+
+  /**
+   * Stores arguments for score expressions.
+   *
+   * @var array
+   */
+  protected $scoresArguments = array();
+
+  /**
+   * Stores multipliers for score expressions.
+   *
+   * @var array
+   */
+  protected $multiply = array();
+
+  /**
+   * Whether or not search expressions were ignored.
+   *
+   * The maximum number of AND/OR combinations exceeded can be configured to
+   * avoid Denial-of-Service attacks. Expressions beyond the limit are ignored.
+   *
+   * @var boolean
+   */
+  protected $expressionsIgnored = FALSE;
+
+  /**
+   * Sets up the search query expression.
+   *
+   * @param $query
+   *   A search query string, which can contain options.
+   * @param $module
+   *   The search module. This maps to {search_index}.type in the database.
+   *
+   * @return
+   *   The SearchQuery object.
+   */
+  public function searchExpression($expression, $module) {
+    $this->searchExpression = $expression;
+    $this->type = $module;
+
+    return $this;
+  }
+
+  /**
+   * Applies a search option and removes it from the search query string.
+   *
+   * These options are in the form option:value,value2,value3.
+   *
+   * @param $option
+   *   Name of the option.
+   * @param $column
+   *   Name of the database column to which the value should be applied.
+   *
+   * @return
+   *   TRUE if a value for that option was found, FALSE if not.
+   */
+  public function setOption($option, $column) {
+    if ($values = search_expression_extract($this->searchExpression, $option)) {
+      $or = db_or();
+      foreach (explode(',', $values) as $value) {
+        $or->condition($column, $value);
+      }
+      $this->condition($or);
+      $this->searchExpression = search_expression_insert($this->searchExpression, $option);
+      return TRUE;
+    }
+    return FALSE;
+  }
+
+  /**
+   * Parses the search query into SQL conditions.
+   *
+   * We build two queries that match the dataset bodies.
+   */
+  protected function parseSearchExpression() {
+    // Matchs words optionally prefixed by a dash. A word in this case is
+    // something between two spaces, optionally quoted.
+    preg_match_all('/ (-?)("[^"]+"|[^" ]+)/i', ' ' .  $this->searchExpression , $keywords, PREG_SET_ORDER);
+
+    if (count($keywords) ==  0) {
+      return;
+    }
+
+    // Classify tokens.
+    $or = FALSE;
+    $warning = '';
+    $limit_combinations = variable_get('search_and_or_limit', 7);
+    // The first search expression does not count as AND.
+    $and_count = -1;
+    $or_count = 0;
+    foreach ($keywords as $match) {
+      if ($or_count && $and_count + $or_count >= $limit_combinations) {
+        // Ignore all further search expressions to prevent Denial-of-Service
+        // attacks using a high number of AND/OR combinations.
+        $this->expressionsIgnored = TRUE;
+        break;
+      }
+      $phrase = FALSE;
+      // Strip off phrase quotes.
+      if ($match[2]{0} == '"') {
+        $match[2] = substr($match[2], 1, -1);
+        $phrase = TRUE;
+        $this->simple = FALSE;
+      }
+      // Simplify keyword according to indexing rules and external
+      // preprocessors. Use same process as during search indexing, so it
+      // will match search index.
+      $words = search_simplify($match[2]);
+      // Re-explode in case simplification added more words, except when
+      // matching a phrase.
+      $words = $phrase ? array($words) : preg_split('/ /', $words, -1, PREG_SPLIT_NO_EMPTY);
+      // Negative matches.
+      if ($match[1] == '-') {
+        $this->keys['negative'] = array_merge($this->keys['negative'], $words);
+      }
+      // OR operator: instead of a single keyword, we store an array of all
+      // OR'd keywords.
+      elseif ($match[2] == 'OR' && count($this->keys['positive'])) {
+        $last = array_pop($this->keys['positive']);
+        // Starting a new OR?
+        if (!is_array($last)) {
+          $last = array($last);
+        }
+        $this->keys['positive'][] = $last;
+        $or = TRUE;
+        $or_count++;
+        continue;
+      }
+      // AND operator: implied, so just ignore it.
+      elseif ($match[2] == 'AND' || $match[2] == 'and') {
+        $warning = $match[2];
+        continue;
+      }
+
+      // Plain keyword.
+      else {
+        if ($match[2] == 'or') {
+          $warning = $match[2];
+        }
+        if ($or) {
+          // Add to last element (which is an array).
+          $this->keys['positive'][count($this->keys['positive']) - 1] = array_merge($this->keys['positive'][count($this->keys['positive']) - 1], $words);
+        }
+        else {
+          $this->keys['positive'] = array_merge($this->keys['positive'], $words);
+          $and_count++;
+        }
+      }
+      $or = FALSE;
+    }
+
+    // Convert keywords into SQL statements.
+    $this->conditions = db_and();
+    $simple_and = FALSE;
+    $simple_or = FALSE;
+    // Positive matches.
+    foreach ($this->keys['positive'] as $key) {
+      // Group of ORed terms.
+      if (is_array($key) && count($key)) {
+        $simple_or = TRUE;
+        $any = FALSE;
+        $queryor = db_or();
+        foreach ($key as $or) {
+          list($num_new_scores) = $this->parseWord($or);
+          $any |= $num_new_scores;
+          $queryor->condition('d.data', "% $or %", 'LIKE');
+        }
+        if (count($queryor)) {
+          $this->conditions->condition($queryor);
+          // A group of OR keywords only needs to match once.
+          $this->matches += ($any > 0);
+        }
+      }
+      // Single ANDed term.
+      else {
+        $simple_and = TRUE;
+        list($num_new_scores, $num_valid_words) = $this->parseWord($key);
+        $this->conditions->condition('d.data', "% $key %", 'LIKE');
+        if (!$num_valid_words) {
+          $this->simple = FALSE;
+        }
+        // Each AND keyword needs to match at least once.
+        $this->matches += $num_new_scores;
+      }
+    }
+    if ($simple_and && $simple_or) {
+      $this->simple = FALSE;
+    }
+    // Negative matches.
+    foreach ($this->keys['negative'] as $key) {
+      $this->conditions->condition('d.data', "% $key %", 'NOT LIKE');
+      $this->simple = FALSE;
+    }
+
+    if ($warning == 'or') {
+      drupal_set_message(t('Search for either of the two terms with uppercase <strong>OR</strong>. For example, <strong>cats OR dogs</strong>.'));
+    }
+  }
+
+  /**
+   * Helper function for parseQuery().
+   */
+  protected function parseWord($word) {
+    $num_new_scores = 0;
+    $num_valid_words = 0;
+    // Determine the scorewords of this word/phrase.
+    $split = explode(' ', $word);
+    foreach ($split as $s) {
+      $num = is_numeric($s);
+      if ($num || drupal_strlen($s) >= variable_get('minimum_word_size', 3)) {
+        if (!isset($this->words[$s])) {
+          $this->words[$s] = $s;
+          $num_new_scores++;
+        }
+        $num_valid_words++;
+      }
+    }
+    // Return matching snippet and number of added words.
+    return array($num_new_scores, $num_valid_words);
+  }
+
+  /**
+   * Executes the first pass query.
+   *
+   * This can either be done explicitly, so that additional scores and
+   * conditions can be applied to the second pass query, or implicitly by
+   * addScore() or execute().
+   *
+   * @return
+   *   TRUE if search items exist, FALSE if not.
+   */
+  public function executeFirstPass() {
+    $this->parseSearchExpression();
+
+    if (count($this->words) == 0) {
+      form_set_error('keys', format_plural(variable_get('minimum_word_size', 3), 'You must include at least one positive keyword with 1 character or more.', 'You must include at least one positive keyword with @count characters or more.'));
+      return FALSE;
+    }
+    if ($this->expressionsIgnored) {
+      drupal_set_message(t('Your search used too many AND/OR expressions. Only the first @count terms were included in this search.', array('@count' => variable_get('search_and_or_limit', 7))), 'warning');
+    }
+    $this->executedFirstPass = TRUE;
+
+    if (!empty($this->words)) {
+      $or = db_or();
+      foreach ($this->words as $word) {
+        $or->condition('i.word', $word);
+      }
+      $this->condition($or);
+    }
+    // Build query for keyword normalization.
+    $this->join('search_total', 't', 'i.word = t.word');
+    $this
+      ->condition('i.type', $this->type)
+      ->groupBy('i.type')
+      ->groupBy('i.sid')
+      ->having('COUNT(*) >= :matches', array(':matches' => $this->matches));
+
+    // Clone the query object to do the firstPass query;
+    $first = clone $this->query;
+
+    // For complex search queries, add the LIKE conditions to the first pass query.
+    if (!$this->simple) {
+      $first->join('search_dataset', 'd', 'i.sid = d.sid AND i.type = d.type');
+      $first->condition($this->conditions);
+    }
+
+    // Calculate maximum keyword relevance, to normalize it.
+    $first->addExpression('SUM(i.score * t.count)', 'calculated_score');
+    $this->normalize = $first
+      ->range(0, 1)
+      ->orderBy('calculated_score', 'DESC')
+      ->execute()
+      ->fetchField();
+
+    if ($this->normalize) {
+      return TRUE;
+    }
+    return FALSE;
+  }
+
+  /**
+   * Adds a custom score expression to the search query.
+   *
+   * Score expressions are used to order search results. If no calls to
+   * addScore() have taken place, a default keyword relevance score will be
+   * used. However, if at least one call to addScore() has taken place, the
+   * keyword relevance score is not automatically added.
+   *
+   * Also note that if you call orderBy() directly on the query, search scores
+   * will not automatically be used to order search results. Your orderBy()
+   * expression can reference 'calculated_score', which will be the total
+   * calculated score value.
+   *
+   * @param $score
+   *   The score expression, which should evaluate to a number between 0 and 1.
+   *   The string 'i.relevance' in a score expression will be replaced by a
+   *   measure of keyword relevance between 0 and 1.
+   * @param $arguments
+   *   Query arguments needed to provide values to the score expression.
+   * @param $multiply
+   *   If set, the score is multiplied with this value. However, all scores
+   *   with multipliers are then divided by the total of all multipliers, so
+   *   that overall, the normalization is maintained.
+   *
+   * @return object
+   *   The updated query object.
+   */
+  public function addScore($score, $arguments = array(), $multiply = FALSE) {
+    if ($multiply) {
+      $i = count($this->multiply);
+      // Modify the score expression so it is multiplied by the multiplier,
+      // with a divisor to renormalize.
+      $score = "CAST(:multiply_$i AS DECIMAL) * COALESCE(( " . $score . "), 0) / CAST(:total_$i AS DECIMAL)";
+      // Add an argument for the multiplier. The :total_$i argument is taken
+      // care of in the execute() method, which is when the total divisor is
+      // calculated.
+      $arguments[':multiply_' . $i] = $multiply;
+      $this->multiply[] = $multiply;
+    }
+
+    $this->scores[] = $score;
+    $this->scoresArguments += $arguments;
+
+    return $this;
+  }
+
+  /**
+   * Executes the search.
+   *
+   * If not already done, this executes the first pass query. Then the complex
+   * conditions are applied to the query including score expressions and
+   * ordering.
+   *
+   * @return
+   *   FALSE if the first pass query returned no results, and a database result
+   *   set if there were results.
+   */
+  public function execute()
+  {
+    if (!$this->executedFirstPass) {
+      $this->executeFirstPass();
+    }
+    if (!$this->normalize) {
+      return new DatabaseStatementEmpty();
+    }
+
+    // Add conditions to query.
+    $this->join('search_dataset', 'd', 'i.sid = d.sid AND i.type = d.type');
+    $this->condition($this->conditions);
+
+    if (empty($this->scores)) {
+      // Add default score.
+      $this->addScore('i.relevance');
+    }
+
+    if (count($this->multiply)) {
+      // Re-normalize scores with multipliers by dividing by the total of all
+      // multipliers. The expressions were altered in addScore(), so here just
+      // add the arguments for the total.
+      $i = 0;
+      $sum = array_sum($this->multiply);
+      foreach ($this->multiply as $total) {
+        $this->scoresArguments[':total_' . $i] = $sum;
+        $i++;
+      }
+    }
+
+    // Replace the pseudo-expression 'i.relevance' with a measure of keyword
+    // relevance in all score expressions, using string replacement. Careful
+    // though! If you just print out a float, some locales use ',' as the
+    // decimal separator in PHP, while SQL always uses '.'. So, make sure to
+    // set the number format correctly.
+    $relevance = number_format((1.0 / $this->normalize), 10, '.', '');
+    $this->scores = str_replace('i.relevance', '(' . $relevance . ' * i.score * t.count)', $this->scores);
+
+    // Add all scores together to form a query field.
+    $this->addExpression('SUM(' . implode(' + ', $this->scores) . ')', 'calculated_score', $this->scoresArguments);
+
+    // If an order has not yet been set for this query, add a default order
+    // that sorts by the calculated sum of scores.
+    if (count($this->getOrderBy()) == 0) {
+      $this->orderBy('calculated_score', 'DESC');
+    }
+
+    // Add tag and useful metadata.
+    $this
+      ->addTag('search_' . $this->type)
+      ->addMetaData('normalize', $this->normalize)
+      ->fields('i', array('type', 'sid'));
+
+    return $this->query->execute();
+  }
+
+  /**
+   * Builds the default count query for SearchQuery.
+   *
+   * Since SearchQuery always uses GROUP BY, we can default to a subquery. We
+   * also add the same conditions as execute() because countQuery() is called
+   * first.
+   */
+  public function countQuery() {
+    // Clone the inner query.
+    $inner = clone $this->query;
+
+    // Add conditions to query.
+    $inner->join('search_dataset', 'd', 'i.sid = d.sid AND i.type = d.type');
+    $inner->condition($this->conditions);
+
+    // Remove existing fields and expressions, they are not needed for a count
+    // query.
+    $fields =& $inner->getFields();
+    $fields = array();
+    $expressions =& $inner->getExpressions();
+    $expressions = array();
+
+    // Add the sid as the only field and count them as a subquery.
+    $count = db_select($inner->fields('i', array('sid')), NULL, array('target' => 'slave'));
+
+    // Add the COUNT() expression.
+    $count->addExpression('COUNT(*)');
+
+    return $count;
+  }
+}
diff --git a/htmltest/modules/search/search.info b/htmltest/modules/search/search.info
new file mode 100644
index 00000000..eff404f3
--- /dev/null
+++ b/htmltest/modules/search/search.info
@@ -0,0 +1,15 @@
+name = Search
+description = Enables site-wide keyword searching.
+package = Core
+version = VERSION
+core = 7.x
+files[] = search.extender.inc
+files[] = search.test
+configure = admin/config/search/settings
+stylesheets[all][] = search.css
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/search/search.install b/htmltest/modules/search/search.install
new file mode 100644
index 00000000..f0113b3f
--- /dev/null
+++ b/htmltest/modules/search/search.install
@@ -0,0 +1,182 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the search module.
+ */
+
+/**
+ * Implements hook_uninstall().
+ */
+function search_uninstall() {
+  variable_del('minimum_word_size');
+  variable_del('overlap_cjk');
+  variable_del('search_cron_limit');
+}
+
+/**
+ * Implements hook_schema().
+ */
+function search_schema() {
+  $schema['search_dataset'] = array(
+    'description' => 'Stores items that will be searched.',
+    'fields' => array(
+      'sid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Search item ID, e.g. node ID for nodes.',
+      ),
+      'type' => array(
+        'type' => 'varchar',
+        'length' => 16,
+        'not null' => TRUE,
+        'description' => 'Type of item, e.g. node.',
+      ),
+      'data' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'size' => 'big',
+        'description' => 'List of space-separated words from the item.',
+      ),
+      'reindex' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Set to force node reindexing.',
+      ),
+    ),
+    'primary key' => array('sid', 'type'),
+  );
+
+  $schema['search_index'] = array(
+    'description' => 'Stores the search index, associating words, items and scores.',
+    'fields' => array(
+      'word' => array(
+        'type' => 'varchar',
+        'length' => 50,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The {search_total}.word that is associated with the search item.',
+      ),
+      'sid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {search_dataset}.sid of the searchable item to which the word belongs.',
+      ),
+      'type' => array(
+        'type' => 'varchar',
+        'length' => 16,
+        'not null' => TRUE,
+        'description' => 'The {search_dataset}.type of the searchable item to which the word belongs.',
+      ),
+      'score' => array(
+        'type' => 'float',
+        'not null' => FALSE,
+        'description' => 'The numeric score of the word, higher being more important.',
+      ),
+    ),
+    'indexes' => array(
+      'sid_type' => array('sid', 'type'),
+    ),
+    'foreign keys' => array(
+      'search_dataset' => array(
+        'table' => 'search_dataset',
+        'columns' => array(
+          'sid' => 'sid',
+          'type' => 'type',
+        ),
+      ),
+    ),
+    'primary key' => array('word', 'sid', 'type'),
+  );
+
+  $schema['search_total'] = array(
+    'description' => 'Stores search totals for words.',
+    'fields' => array(
+      'word' => array(
+        'description' => 'Primary Key: Unique word in the search index.',
+        'type' => 'varchar',
+        'length' => 50,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'count' => array(
+        'description' => "The count of the word in the index using Zipf's law to equalize the probability distribution.",
+        'type' => 'float',
+        'not null' => FALSE,
+      ),
+    ),
+    'primary key' => array('word'),
+  );
+
+  $schema['search_node_links'] = array(
+    'description' => 'Stores items (like nodes) that link to other nodes, used to improve search scores for nodes that are frequently linked to.',
+    'fields' => array(
+      'sid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {search_dataset}.sid of the searchable item containing the link to the node.',
+      ),
+      'type' => array(
+        'type' => 'varchar',
+        'length' => 16,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The {search_dataset}.type of the searchable item containing the link to the node.',
+      ),
+      'nid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {node}.nid that this item links to.',
+      ),
+      'caption' => array(
+        'type' => 'text',
+        'size' => 'big',
+        'not null' => FALSE,
+        'description' => 'The text used to link to the {node}.nid.',
+      ),
+    ),
+    'primary key' => array('sid', 'type', 'nid'),
+    'indexes' => array(
+      'nid' => array('nid'),
+    ),
+  );
+
+  return $schema;
+}
+
+/**
+ * Replace unique keys in 'search_dataset' and 'search_index' by primary keys.
+ */
+function search_update_7000() {
+  db_drop_unique_key('search_dataset', 'sid_type');
+  $dataset_type_spec = array(
+    'type' => 'varchar',
+    'length' => 16,
+    'not null' => TRUE,
+    'description' => 'Type of item, e.g. node.',
+  );
+  db_change_field('search_dataset', 'type', 'type', $dataset_type_spec);
+  db_add_primary_key('search_dataset', array('sid', 'type'));
+
+  db_drop_index('search_index', 'word');
+  db_drop_unique_key('search_index', 'word_sid_type');
+  $index_type_spec = array(
+    'type' => 'varchar',
+    'length' => 16,
+    'not null' => TRUE,
+    'description' => 'The {search_dataset}.type of the searchable item to which the word belongs.',
+  );
+  db_change_field('search_index', 'type', 'type', $index_type_spec);
+  db_add_primary_key('search_index', array('word', 'sid', 'type'));
+}
+
diff --git a/htmltest/modules/search/search.module b/htmltest/modules/search/search.module
new file mode 100644
index 00000000..7542f989
--- /dev/null
+++ b/htmltest/modules/search/search.module
@@ -0,0 +1,1356 @@
+<?php
+
+/**
+ * @file
+ * Enables site-wide keyword searching.
+ */
+
+/**
+ * Matches all 'N' Unicode character classes (numbers)
+ */
+define('PREG_CLASS_NUMBERS',
+  '\x{30}-\x{39}\x{b2}\x{b3}\x{b9}\x{bc}-\x{be}\x{660}-\x{669}\x{6f0}-\x{6f9}' .
+  '\x{966}-\x{96f}\x{9e6}-\x{9ef}\x{9f4}-\x{9f9}\x{a66}-\x{a6f}\x{ae6}-\x{aef}' .
+  '\x{b66}-\x{b6f}\x{be7}-\x{bf2}\x{c66}-\x{c6f}\x{ce6}-\x{cef}\x{d66}-\x{d6f}' .
+  '\x{e50}-\x{e59}\x{ed0}-\x{ed9}\x{f20}-\x{f33}\x{1040}-\x{1049}\x{1369}-' .
+  '\x{137c}\x{16ee}-\x{16f0}\x{17e0}-\x{17e9}\x{17f0}-\x{17f9}\x{1810}-\x{1819}' .
+  '\x{1946}-\x{194f}\x{2070}\x{2074}-\x{2079}\x{2080}-\x{2089}\x{2153}-\x{2183}' .
+  '\x{2460}-\x{249b}\x{24ea}-\x{24ff}\x{2776}-\x{2793}\x{3007}\x{3021}-\x{3029}' .
+  '\x{3038}-\x{303a}\x{3192}-\x{3195}\x{3220}-\x{3229}\x{3251}-\x{325f}\x{3280}-' .
+  '\x{3289}\x{32b1}-\x{32bf}\x{ff10}-\x{ff19}');
+
+/**
+ * Matches all 'P' Unicode character classes (punctuation)
+ */
+define('PREG_CLASS_PUNCTUATION',
+  '\x{21}-\x{23}\x{25}-\x{2a}\x{2c}-\x{2f}\x{3a}\x{3b}\x{3f}\x{40}\x{5b}-\x{5d}' .
+  '\x{5f}\x{7b}\x{7d}\x{a1}\x{ab}\x{b7}\x{bb}\x{bf}\x{37e}\x{387}\x{55a}-\x{55f}' .
+  '\x{589}\x{58a}\x{5be}\x{5c0}\x{5c3}\x{5f3}\x{5f4}\x{60c}\x{60d}\x{61b}\x{61f}' .
+  '\x{66a}-\x{66d}\x{6d4}\x{700}-\x{70d}\x{964}\x{965}\x{970}\x{df4}\x{e4f}' .
+  '\x{e5a}\x{e5b}\x{f04}-\x{f12}\x{f3a}-\x{f3d}\x{f85}\x{104a}-\x{104f}\x{10fb}' .
+  '\x{1361}-\x{1368}\x{166d}\x{166e}\x{169b}\x{169c}\x{16eb}-\x{16ed}\x{1735}' .
+  '\x{1736}\x{17d4}-\x{17d6}\x{17d8}-\x{17da}\x{1800}-\x{180a}\x{1944}\x{1945}' .
+  '\x{2010}-\x{2027}\x{2030}-\x{2043}\x{2045}-\x{2051}\x{2053}\x{2054}\x{2057}' .
+  '\x{207d}\x{207e}\x{208d}\x{208e}\x{2329}\x{232a}\x{23b4}-\x{23b6}\x{2768}-' .
+  '\x{2775}\x{27e6}-\x{27eb}\x{2983}-\x{2998}\x{29d8}-\x{29db}\x{29fc}\x{29fd}' .
+  '\x{3001}-\x{3003}\x{3008}-\x{3011}\x{3014}-\x{301f}\x{3030}\x{303d}\x{30a0}' .
+  '\x{30fb}\x{fd3e}\x{fd3f}\x{fe30}-\x{fe52}\x{fe54}-\x{fe61}\x{fe63}\x{fe68}' .
+  '\x{fe6a}\x{fe6b}\x{ff01}-\x{ff03}\x{ff05}-\x{ff0a}\x{ff0c}-\x{ff0f}\x{ff1a}' .
+  '\x{ff1b}\x{ff1f}\x{ff20}\x{ff3b}-\x{ff3d}\x{ff3f}\x{ff5b}\x{ff5d}\x{ff5f}-' .
+  '\x{ff65}');
+
+/**
+ * Matches CJK (Chinese, Japanese, Korean) letter-like characters.
+ *
+ * This list is derived from the "East Asian Scripts" section of
+ * http://www.unicode.org/charts/index.html, as well as a comment on
+ * http://unicode.org/reports/tr11/tr11-11.html listing some character
+ * ranges that are reserved for additional CJK ideographs.
+ *
+ * The character ranges do not include numbers, punctuation, or symbols, since
+ * these are handled separately in search. Note that radicals and strokes are
+ * considered symbols. (See
+ * http://www.unicode.org/Public/UNIDATA/extracted/DerivedGeneralCategory.txt)
+ *
+ * @see search_expand_cjk()
+ */
+define('PREG_CLASS_CJK', '\x{1100}-\x{11FF}\x{3040}-\x{309F}\x{30A1}-\x{318E}' .
+  '\x{31A0}-\x{31B7}\x{31F0}-\x{31FF}\x{3400}-\x{4DBF}\x{4E00}-\x{9FCF}' .
+  '\x{A000}-\x{A48F}\x{A4D0}-\x{A4FD}\x{A960}-\x{A97F}\x{AC00}-\x{D7FF}' .
+  '\x{F900}-\x{FAFF}\x{FF21}-\x{FF3A}\x{FF41}-\x{FF5A}\x{FF66}-\x{FFDC}' .
+  '\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}');
+
+/**
+ * Implements hook_help().
+ */
+function search_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#search':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Search module provides the ability to index and search for content by exact keywords, and for users by username or e-mail. For more information, see the online handbook entry for <a href="@search-module">Search module</a>.', array('@search-module' => 'http://drupal.org/documentation/modules/search/', '@search' => url('search'))) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Searching content and users') . '</dt>';
+      $output .= '<dd>' . t('Users with <em>Use search</em> permission can use the search block and <a href="@search">Search page</a>. Users with the <em>View published content</em> permission can search for content containing exact keywords. Users with the <em>View user profiles</em> permission can search for users containing the keyword anywhere in the user name, and users with the <em>Administer users</em> permission can search for users by email address. Additionally, users with <em>Use advanced search</em> permission can find content using more complex search methods and filtering by choosing the <em>Advanced search</em> option on the <a href="@search">Search page</a>.', array('@search' => url('search'))) . '</dd>';
+      $output .= '<dt>' . t('Indexing content with cron') . '</dt>';
+      $output .= '<dd>' . t('To provide keyword searching, the search engine maintains an index of words found in the content and its fields, along with text added to your content by other modules (such as comments from the core Comment module, and taxonomy terms from the core Taxonomy module). To build and maintain this index, a correctly configured <a href="@cron">cron maintenance task</a> is required. Users with <em>Administer search</em> permission can further configure the cron settings on the <a href="@searchsettings">Search settings page</a>.', array('@cron' => 'http://drupal.org/cron', '@searchsettings' => url('admin/config/search/settings'))) . '</dd>';
+      $output .= '<dt>' . t('Content reindexing') . '</dt>';
+      $output .= '<dd>' . t('Content-related actions on your site (creating, editing, or deleting content and comments) automatically cause affected content items to be marked for indexing or reindexing at the next cron run. When content is marked for reindexing, the previous content remains in the index until cron runs, at which time it is replaced by the new content. Unlike content-related actions, actions related to the structure of your site do not cause affected content to be marked for reindexing. Examples of structure-related actions that affect content include deleting or editing taxonomy terms, enabling or disabling modules that add text to content (such as Taxonomy, Comment, and field-providing modules), and modifying the fields or display parameters of your content types. If you take one of these actions and you want to ensure that the search index is updated to reflect your changed site structure, you can mark all content for reindexing by clicking the "Re-index site" button on the <a href="@searchsettings">Search settings page</a>. If you have a lot of content on your site, it may take several cron runs for the content to be reindexed.', array('@searchsettings' => url('admin/config/search/settings'))) . '</dd>';
+      $output .= '<dt>' . t('Configuring search settings') . '</dt>';
+      $output .= '<dd>' . t('Indexing behavior can be adjusted using the <a href="@searchsettings">Search settings page</a>. Users with <em>Administer search</em> permission can control settings such as the <em>Number of items to index per cron run</em>, <em>Indexing settings</em> (word length), <em>Active search modules</em>, and <em>Content ranking</em>, which lets you adjust the priority in which indexed content is returned in results.', array('@searchsettings' => url('admin/config/search/settings'))) . '</dd>';
+      $output .= '<dt>' . t('Search block') . '</dt>';
+      $output .= '<dd>' . t('The Search module includes a default <em>Search form</em> block, which can be enabled and configured on the <a href="@blocks">Blocks administration page</a>. The block is available to users with the <em>Search content</em> permission.', array('@blocks' => url('admin/structure/block'))) . '</dd>';
+      $output .= '<dt>' . t('Extending Search module') . '</dt>';
+      $output .= '<dd>' . t('By default, the Search module only supports exact keyword matching in content searches. You can modify this behavior by installing a language-specific stemming module for your language (such as <a href="http://drupal.org/project/porterstemmer">Porter Stemmer</a> for American English), which allows words such as walk, walking, and walked to be matched in the Search module. Another approach is to use a third-party search technology with stemming or partial word matching features built in, such as <a href="http://drupal.org/project/apachesolr">Apache Solr</a> or <a href="http://drupal.org/project/sphinx">Sphinx</a>. These and other <a href="@contrib-search">search-related contributed modules</a> can be downloaded by visiting Drupal.org.', array('@contrib-search' => 'http://drupal.org/project/modules?filters=tid%3A105')) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'admin/config/search/settings':
+      return '<p>' . t('The search engine maintains an index of words found in your site\'s content. To build and maintain this index, a correctly configured <a href="@cron">cron maintenance task</a> is required. Indexing behavior can be adjusted using the settings below.', array('@cron' => url('admin/reports/status'))) . '</p>';
+    case 'search#noresults':
+      return t('<ul>
+<li>Check if your spelling is correct.</li>
+<li>Remove quotes around phrases to search for each word individually. <em>bike shed</em> will often show more results than <em>&quot;bike shed&quot;</em>.</li>
+<li>Consider loosening your query with <em>OR</em>. <em>bike OR shed</em> will often show more results than <em>bike shed</em>.</li>
+</ul>');
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function search_theme() {
+  return array(
+    'search_block_form' => array(
+      'render element' => 'form',
+      'template' => 'search-block-form',
+    ),
+    'search_result' => array(
+      'variables' => array('result' => NULL, 'module' => NULL),
+      'file' => 'search.pages.inc',
+      'template' => 'search-result',
+    ),
+    'search_results' => array(
+      'variables' => array('results' => NULL, 'module' => NULL),
+      'file' => 'search.pages.inc',
+      'template' => 'search-results',
+    ),
+  );
+}
+
+/**
+ * Implements hook_permission().
+ */
+function search_permission() {
+  return array(
+    'administer search' => array(
+      'title' => t('Administer search'),
+    ),
+    'search content' => array(
+      'title' => t('Use search'),
+    ),
+    'use advanced search' => array(
+      'title' => t('Use advanced search'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function search_block_info() {
+  $blocks['form']['info'] = t('Search form');
+  // Not worth caching.
+  $blocks['form']['cache'] = DRUPAL_NO_CACHE;
+  $blocks['form']['properties']['administrative'] = TRUE;
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_view().
+ */
+function search_block_view($delta = '') {
+  if (user_access('search content')) {
+    $block['content'] = drupal_get_form('search_block_form');
+    return $block;
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function search_menu() {
+  $items['search'] = array(
+    'title' => 'Search',
+    'page callback' => 'search_view',
+    'access callback' => 'search_is_active',
+    'type' => MENU_SUGGESTED_ITEM,
+    'file' => 'search.pages.inc',
+  );
+  $items['admin/config/search/settings'] = array(
+    'title' => 'Search settings',
+    'description' => 'Configure relevance settings for search and other indexing options.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('search_admin_settings'),
+    'access arguments' => array('administer search'),
+    'weight' => -10,
+    'file' => 'search.admin.inc',
+  );
+  $items['admin/config/search/settings/reindex'] = array(
+    'title' => 'Clear index',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('search_reindex_confirm'),
+    'access arguments' => array('administer search'),
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+    'file' => 'search.admin.inc',
+  );
+
+  // Add paths for searching. We add each module search path twice: once without
+  // and once with %menu_tail appended. The reason for this is that we want to
+  // preserve keywords when switching tabs, and also to have search tabs
+  // highlighted properly. The only way to do that within the Drupal menu
+  // system appears to be having two sets of tabs. See discussion on issue
+  // http://drupal.org/node/245103 for details.
+
+  drupal_static_reset('search_get_info');
+  $default_info = search_get_default_module_info();
+  if ($default_info) {
+    foreach (search_get_info() as $module => $search_info) {
+      $path = 'search/' . $search_info['path'];
+      $items[$path] = array(
+        'title' => $search_info['title'],
+        'page callback' => 'search_view',
+        'page arguments' => array($module, ''),
+        'access callback' => '_search_menu_access',
+        'access arguments' => array($module),
+        'type' => MENU_LOCAL_TASK,
+        'file' => 'search.pages.inc',
+        'weight' => $module == $default_info['module'] ? -10 : 0,
+      );
+      $items["$path/%menu_tail"] = array(
+        'title' => $search_info['title'],
+        'load arguments' => array('%map', '%index'),
+        'page callback' => 'search_view',
+        'page arguments' => array($module, 2),
+        'access callback' => '_search_menu_access',
+        'access arguments' => array($module),
+        // The default local task points to its parent, but this item points to
+        // where it should so it should not be changed.
+        'type' => MENU_LOCAL_TASK,
+        'file' => 'search.pages.inc',
+        'weight' => 0,
+        // These tabs are not subtabs.
+        'tab_root' => 'search/' . $default_info['path'] . '/%',
+        // These tabs need to display at the same level.
+        'tab_parent' => 'search/' . $default_info['path'],
+      );
+    }
+  }
+  return $items;
+}
+
+/**
+ * Determines access for the ?q=search path.
+ */
+function search_is_active() {
+  // This path cannot be accessed if there are no active modules.
+  return user_access('search content') && search_get_info();
+}
+
+/**
+ * Returns information about available search modules.
+ *
+ * @param $all
+ *   If TRUE, information about all enabled modules implementing
+ *   hook_search_info() will be returned. If FALSE (default), only modules that
+ *   have been set to active on the search settings page will be returned.
+ *
+ * @return
+ *   Array of hook_search_info() return values, keyed by module name. The
+ *   'title' and 'path' array elements will be set to defaults for each module
+ *   if not supplied by hook_search_info(), and an additional array element of
+ *   'module' will be added (set to the module name).
+ */
+function search_get_info($all = FALSE) {
+  $search_hooks = &drupal_static(__FUNCTION__);
+
+  if (!isset($search_hooks)) {
+    foreach (module_implements('search_info') as $module) {
+      $search_hooks[$module] = call_user_func($module . '_search_info');
+      // Use module name as the default value.
+      $search_hooks[$module] += array('title' => $module, 'path' => $module);
+      // Include the module name itself in the array.
+      $search_hooks[$module]['module'] = $module;
+    }
+  }
+
+  if ($all) {
+    return $search_hooks;
+  }
+
+  $active = variable_get('search_active_modules', array('node', 'user'));
+  return array_intersect_key($search_hooks, array_flip($active));
+}
+
+/**
+ * Returns information about the default search module.
+ *
+ * @return
+ *    The search_get_info() array element for the default search module, if any.
+ */
+function search_get_default_module_info() {
+  $info = search_get_info();
+  $default = variable_get('search_default_module', 'node');
+  if (isset($info[$default])) {
+    return $info[$default];
+  }
+  // The variable setting does not match any active module, so just return
+  // the info for the first active module (if any).
+  return reset($info);
+}
+
+/**
+ * Access callback for search tabs.
+ */
+function _search_menu_access($name) {
+  return user_access('search content') && (!function_exists($name . '_search_access') || module_invoke($name, 'search_access'));
+}
+
+/**
+ * Clears a part of or the entire search index.
+ *
+ * @param $sid
+ *   (optional) The ID of the item to remove from the search index. If
+ *   specified, $module must also be given. Omit both $sid and $module to clear
+ *   the entire search index.
+ * @param $module
+ *   (optional) The machine-readable name of the module for the item to remove
+ *   from the search index.
+ */
+function search_reindex($sid = NULL, $module = NULL, $reindex = FALSE) {
+  if ($module == NULL && $sid == NULL) {
+    module_invoke_all('search_reset');
+  }
+  else {
+    db_delete('search_dataset')
+      ->condition('sid', $sid)
+      ->condition('type', $module)
+      ->execute();
+    db_delete('search_index')
+      ->condition('sid', $sid)
+      ->condition('type', $module)
+      ->execute();
+    // Don't remove links if re-indexing.
+    if (!$reindex) {
+      db_delete('search_node_links')
+        ->condition('sid', $sid)
+        ->condition('type', $module)
+        ->execute();
+    }
+  }
+}
+
+/**
+ * Marks a word as "dirty" (changed), or retrieves the list of dirty words.
+ *
+ * This is used during indexing (cron). Words that are dirty have outdated
+ * total counts in the search_total table, and need to be recounted.
+ */
+function search_dirty($word = NULL) {
+  $dirty = &drupal_static(__FUNCTION__, array());
+  if ($word !== NULL) {
+    $dirty[$word] = TRUE;
+  }
+  else {
+    return $dirty;
+  }
+}
+
+/**
+ * Implements hook_cron().
+ *
+ * Fires hook_update_index() in all modules and cleans up dirty words.
+ *
+ * @see search_dirty()
+ */
+function search_cron() {
+  // We register a shutdown function to ensure that search_total is always up
+  // to date.
+  drupal_register_shutdown_function('search_update_totals');
+
+  foreach (variable_get('search_active_modules', array('node', 'user')) as $module) {
+    // Update word index
+    module_invoke($module, 'update_index');
+  }
+}
+
+/**
+ * Updates the {search_total} database table.
+ *
+ * This function is called on shutdown to ensure that {search_total} is always
+ * up to date (even if cron times out or otherwise fails).
+ */
+function search_update_totals() {
+  // Update word IDF (Inverse Document Frequency) counts for new/changed words.
+  foreach (search_dirty() as $word => $dummy) {
+    // Get total count
+    $total = db_query("SELECT SUM(score) FROM {search_index} WHERE word = :word", array(':word' => $word), array('target' => 'slave'))->fetchField();
+    // Apply Zipf's law to equalize the probability distribution.
+    $total = log10(1 + 1/(max(1, $total)));
+    db_merge('search_total')
+      ->key(array('word' => $word))
+      ->fields(array('count' => $total))
+      ->execute();
+  }
+  // Find words that were deleted from search_index, but are still in
+  // search_total. We use a LEFT JOIN between the two tables and keep only the
+  // rows which fail to join.
+  $result = db_query("SELECT t.word AS realword, i.word FROM {search_total} t LEFT JOIN {search_index} i ON t.word = i.word WHERE i.word IS NULL", array(), array('target' => 'slave'));
+  $or = db_or();
+  foreach ($result as $word) {
+    $or->condition('word', $word->realword);
+  }
+  if (count($or) > 0) {
+    db_delete('search_total')
+      ->condition($or)
+      ->execute();
+  }
+}
+
+/**
+ * Simplifies a string according to indexing rules.
+ *
+ * @param $text
+ *   Text to simplify.
+ *
+ * @return
+ *   Simplified text.
+ *
+ * @see hook_search_preprocess()
+ */
+function search_simplify($text) {
+  // Decode entities to UTF-8
+  $text = decode_entities($text);
+
+  // Lowercase
+  $text = drupal_strtolower($text);
+
+  // Call an external processor for word handling.
+  search_invoke_preprocess($text);
+
+  // Simple CJK handling
+  if (variable_get('overlap_cjk', TRUE)) {
+    $text = preg_replace_callback('/[' . PREG_CLASS_CJK . ']+/u', 'search_expand_cjk', $text);
+  }
+
+  // To improve searching for numerical data such as dates, IP addresses
+  // or version numbers, we consider a group of numerical characters
+  // separated only by punctuation characters to be one piece.
+  // This also means that searching for e.g. '20/03/1984' also returns
+  // results with '20-03-1984' in them.
+  // Readable regexp: ([number]+)[punctuation]+(?=[number])
+  $text = preg_replace('/([' . PREG_CLASS_NUMBERS . ']+)[' . PREG_CLASS_PUNCTUATION . ']+(?=[' . PREG_CLASS_NUMBERS . '])/u', '\1', $text);
+
+  // Multiple dot and dash groups are word boundaries and replaced with space.
+  // No need to use the unicode modifer here because 0-127 ASCII characters
+  // can't match higher UTF-8 characters as the leftmost bit of those are 1.
+  $text = preg_replace('/[.-]{2,}/', ' ', $text);
+
+  // The dot, underscore and dash are simply removed. This allows meaningful
+  // search behavior with acronyms and URLs. See unicode note directly above.
+  $text = preg_replace('/[._-]+/', '', $text);
+
+  // With the exception of the rules above, we consider all punctuation,
+  // marks, spacers, etc, to be a word boundary.
+  $text = preg_replace('/[' . PREG_CLASS_UNICODE_WORD_BOUNDARY . ']+/u', ' ', $text);
+
+  // Truncate everything to 50 characters.
+  $words = explode(' ', $text);
+  array_walk($words, '_search_index_truncate');
+  $text = implode(' ', $words);
+
+  return $text;
+}
+
+/**
+ * Splits CJK (Chinese, Japanese, Korean) text into tokens.
+ *
+ * The Search module matches exact words, where a word is defined to be a
+ * sequence of characters delimited by spaces or punctuation. CJK languages are
+ * written in long strings of characters, though, not split up into words. So
+ * in order to allow search matching, we split up CJK text into tokens
+ * consisting of consecutive, overlapping sequences of characters whose length
+ * is equal to the 'minimum_word_size' variable. This tokenizing is only done if
+ * the 'overlap_cjk' variable is TRUE.
+ *
+ * @param $matches
+ *   This function is a callback for preg_replace_callback(), which is called
+ *   from search_simplify(). So, $matches is an array of regular expression
+ *   matches, which means that $matches[0] contains the matched text -- a string
+ *   of CJK characters to tokenize.
+ *
+ * @return
+ *   Tokenized text, starting and ending with a space character.
+ */
+function search_expand_cjk($matches) {
+  $min = variable_get('minimum_word_size', 3);
+  $str = $matches[0];
+  $length = drupal_strlen($str);
+  // If the text is shorter than the minimum word size, don't tokenize it.
+  if ($length <= $min) {
+    return ' ' . $str . ' ';
+  }
+  $tokens = ' ';
+  // Build a FIFO queue of characters.
+  $chars = array();
+  for ($i = 0; $i < $length; $i++) {
+    // Add the next character off the beginning of the string to the queue.
+    $current = drupal_substr($str, 0, 1);
+    $str = substr($str, strlen($current));
+    $chars[] = $current;
+    if ($i >= $min - 1) {
+      // Make a token of $min characters, and add it to the token string.
+      $tokens .= implode('', $chars) . ' ';
+      // Shift out the first character in the queue.
+      array_shift($chars);
+    }
+  }
+  return $tokens;
+}
+
+/**
+ * Simplifies and splits a string into tokens for indexing.
+ */
+function search_index_split($text) {
+  $last = &drupal_static(__FUNCTION__);
+  $lastsplit = &drupal_static(__FUNCTION__ . ':lastsplit');
+
+  if ($last == $text) {
+    return $lastsplit;
+  }
+  // Process words
+  $text = search_simplify($text);
+  $words = explode(' ', $text);
+
+  // Save last keyword result
+  $last = $text;
+  $lastsplit = $words;
+
+  return $words;
+}
+
+/**
+ * Helper function for array_walk in search_index_split.
+ */
+function _search_index_truncate(&$text) {
+  if (is_numeric($text)) {
+    $text = ltrim($text, '0');
+  }
+  $text = truncate_utf8($text, 50);
+}
+
+/**
+ * Invokes hook_search_preprocess() in modules.
+ */
+function search_invoke_preprocess(&$text) {
+  foreach (module_implements('search_preprocess') as $module) {
+    $text = module_invoke($module, 'search_preprocess', $text);
+  }
+}
+
+/**
+ * Update the full-text search index for a particular item.
+ *
+ * @param $sid
+ *   An ID number identifying this particular item (e.g., node ID).
+ * @param $module
+ *   The machine-readable name of the module that this item comes from (a module
+ *   that implements hook_search_info()).
+ * @param $text
+ *   The content of this item. Must be a piece of HTML or plain text.
+ *
+ * @ingroup search
+ */
+function search_index($sid, $module, $text) {
+  $minimum_word_size = variable_get('minimum_word_size', 3);
+
+  // Link matching
+  global $base_url;
+  $node_regexp = '@href=[\'"]?(?:' . preg_quote($base_url, '@') . '/|' . preg_quote(base_path(), '@') . ')(?:\?q=)?/?((?![a-z]+:)[^\'">]+)[\'">]@i';
+
+  // Multipliers for scores of words inside certain HTML tags. The weights are stored
+  // in a variable so that modules can overwrite the default weights.
+  // Note: 'a' must be included for link ranking to work.
+  $tags = variable_get('search_tag_weights', array(
+    'h1' => 25,
+    'h2' => 18,
+    'h3' => 15,
+    'h4' => 12,
+    'h5' => 9,
+    'h6' => 6,
+    'u' => 3,
+    'b' => 3,
+    'i' => 3,
+    'strong' => 3,
+    'em' => 3,
+    'a' => 10));
+
+  // Strip off all ignored tags to speed up processing, but insert space before/after
+  // them to keep word boundaries.
+  $text = str_replace(array('<', '>'), array(' <', '> '), $text);
+  $text = strip_tags($text, '<' . implode('><', array_keys($tags)) . '>');
+
+  // Split HTML tags from plain text.
+  $split = preg_split('/\s*<([^>]+?)>\s*/', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
+  // Note: PHP ensures the array consists of alternating delimiters and literals
+  // and begins and ends with a literal (inserting $null as required).
+
+  $tag = FALSE; // Odd/even counter. Tag or no tag.
+  $link = FALSE; // State variable for link analyzer
+  $score = 1; // Starting score per word
+  $accum = ' '; // Accumulator for cleaned up data
+  $tagstack = array(); // Stack with open tags
+  $tagwords = 0; // Counter for consecutive words
+  $focus = 1; // Focus state
+
+  $results = array(0 => array()); // Accumulator for words for index
+
+  foreach ($split as $value) {
+    if ($tag) {
+      // Increase or decrease score per word based on tag
+      list($tagname) = explode(' ', $value, 2);
+      $tagname = drupal_strtolower($tagname);
+      // Closing or opening tag?
+      if ($tagname[0] == '/') {
+        $tagname = substr($tagname, 1);
+        // If we encounter unexpected tags, reset score to avoid incorrect boosting.
+        if (!count($tagstack) || $tagstack[0] != $tagname) {
+          $tagstack = array();
+          $score = 1;
+        }
+        else {
+          // Remove from tag stack and decrement score
+          $score = max(1, $score - $tags[array_shift($tagstack)]);
+        }
+        if ($tagname == 'a') {
+          $link = FALSE;
+        }
+      }
+      else {
+        if (isset($tagstack[0]) && $tagstack[0] == $tagname) {
+          // None of the tags we look for make sense when nested identically.
+          // If they are, it's probably broken HTML.
+          $tagstack = array();
+          $score = 1;
+        }
+        else {
+          // Add to open tag stack and increment score
+          array_unshift($tagstack, $tagname);
+          $score += $tags[$tagname];
+        }
+        if ($tagname == 'a') {
+          // Check if link points to a node on this site
+          if (preg_match($node_regexp, $value, $match)) {
+            $path = drupal_get_normal_path($match[1]);
+            if (preg_match('!(?:node|book)/(?:view/)?([0-9]+)!i', $path, $match)) {
+              $linknid = $match[1];
+              if ($linknid > 0) {
+                $node = db_query('SELECT title, nid, vid FROM {node} WHERE nid = :nid', array(':nid' => $linknid), array('target' => 'slave'))->fetchObject();
+                $link = TRUE;
+                $linktitle = $node->title;
+              }
+            }
+          }
+        }
+      }
+      // A tag change occurred, reset counter.
+      $tagwords = 0;
+    }
+    else {
+      // Note: use of PREG_SPLIT_DELIM_CAPTURE above will introduce empty values
+      if ($value != '') {
+        if ($link) {
+          // Check to see if the node link text is its URL. If so, we use the target node title instead.
+          if (preg_match('!^https?://!i', $value)) {
+            $value = $linktitle;
+          }
+        }
+        $words = search_index_split($value);
+        foreach ($words as $word) {
+          // Add word to accumulator
+          $accum .= $word . ' ';
+          // Check wordlength
+          if (is_numeric($word) || drupal_strlen($word) >= $minimum_word_size) {
+            // Links score mainly for the target.
+            if ($link) {
+              if (!isset($results[$linknid])) {
+                $results[$linknid] = array();
+              }
+              $results[$linknid][] = $word;
+              // Reduce score of the link caption in the source.
+              $focus *= 0.2;
+            }
+            // Fall-through
+            if (!isset($results[0][$word])) {
+              $results[0][$word] = 0;
+            }
+            $results[0][$word] += $score * $focus;
+
+            // Focus is a decaying value in terms of the amount of unique words up to this point.
+            // From 100 words and more, it decays, to e.g. 0.5 at 500 words and 0.3 at 1000 words.
+            $focus = min(1, .01 + 3.5 / (2 + count($results[0]) * .015));
+          }
+          $tagwords++;
+          // Too many words inside a single tag probably mean a tag was accidentally left open.
+          if (count($tagstack) && $tagwords >= 15) {
+            $tagstack = array();
+            $score = 1;
+          }
+        }
+      }
+    }
+    $tag = !$tag;
+  }
+
+  search_reindex($sid, $module, TRUE);
+
+  // Insert cleaned up data into dataset
+  db_insert('search_dataset')
+    ->fields(array(
+      'sid' => $sid,
+      'type' => $module,
+      'data' => $accum,
+      'reindex' => 0,
+    ))
+    ->execute();
+
+  // Insert results into search index
+  foreach ($results[0] as $word => $score) {
+    // If a word already exists in the database, its score gets increased
+    // appropriately. If not, we create a new record with the appropriate
+    // starting score.
+    db_merge('search_index')
+      ->key(array(
+        'word' => $word,
+        'sid' => $sid,
+        'type' => $module,
+      ))
+      ->fields(array('score' => $score))
+      ->expression('score', 'score + :score', array(':score' => $score))
+      ->execute();
+    search_dirty($word);
+  }
+  unset($results[0]);
+
+  // Get all previous links from this item.
+  $result = db_query("SELECT nid, caption FROM {search_node_links} WHERE sid = :sid AND type = :type", array(
+    ':sid' => $sid,
+    ':type' => $module
+  ), array('target' => 'slave'));
+  $links = array();
+  foreach ($result as $link) {
+    $links[$link->nid] = $link->caption;
+  }
+
+  // Now store links to nodes.
+  foreach ($results as $nid => $words) {
+    $caption = implode(' ', $words);
+    if (isset($links[$nid])) {
+      if ($links[$nid] != $caption) {
+        // Update the existing link and mark the node for reindexing.
+        db_update('search_node_links')
+          ->fields(array('caption' => $caption))
+          ->condition('sid', $sid)
+          ->condition('type', $module)
+          ->condition('nid', $nid)
+          ->execute();
+        search_touch_node($nid);
+      }
+      // Unset the link to mark it as processed.
+      unset($links[$nid]);
+    }
+    elseif ($sid != $nid || $module != 'node') {
+      // Insert the existing link and mark the node for reindexing, but don't
+      // reindex if this is a link in a node pointing to itself.
+      db_insert('search_node_links')
+        ->fields(array(
+          'caption' => $caption,
+          'sid' => $sid,
+          'type' => $module,
+          'nid' => $nid,
+        ))
+        ->execute();
+      search_touch_node($nid);
+    }
+  }
+  // Any left-over links in $links no longer exist. Delete them and mark the nodes for reindexing.
+  foreach ($links as $nid => $caption) {
+    db_delete('search_node_links')
+      ->condition('sid', $sid)
+      ->condition('type', $module)
+      ->condition('nid', $nid)
+      ->execute();
+    search_touch_node($nid);
+  }
+}
+
+/**
+ * Changes a node's changed timestamp to 'now' to force reindexing.
+ *
+ * @param $nid
+ *   The node ID of the node that needs reindexing.
+ */
+function search_touch_node($nid) {
+  db_update('search_dataset')
+    ->fields(array('reindex' => REQUEST_TIME))
+    ->condition('type', 'node')
+    ->condition('sid', $nid)
+    ->execute();
+}
+
+/**
+ * Implements hook_node_update_index().
+ */
+function search_node_update_index($node) {
+  // Transplant links to a node into the target node.
+  $result = db_query("SELECT caption FROM {search_node_links} WHERE nid = :nid", array(':nid' => $node->nid), array('target' => 'slave'));
+  $output = array();
+  foreach ($result as $link) {
+    $output[] = $link->caption;
+  }
+  if (count($output)) {
+    return '<a>(' . implode(', ', $output) . ')</a>';
+  }
+}
+
+/**
+ * Implements hook_node_update().
+ */
+function search_node_update($node) {
+  // Reindex the node when it is updated. The node is automatically indexed
+  // when it is added, simply by being added to the node table.
+  search_touch_node($node->nid);
+}
+
+/**
+ * Implements hook_comment_insert().
+ */
+function search_comment_insert($comment) {
+  // Reindex the node when comments are added.
+  search_touch_node($comment->nid);
+}
+
+/**
+ * Implements hook_comment_update().
+ */
+function search_comment_update($comment) {
+  // Reindex the node when comments are changed.
+  search_touch_node($comment->nid);
+}
+
+/**
+ * Implements hook_comment_delete().
+ */
+function search_comment_delete($comment) {
+  // Reindex the node when comments are deleted.
+  search_touch_node($comment->nid);
+}
+
+/**
+ * Implements hook_comment_publish().
+ */
+function search_comment_publish($comment) {
+  // Reindex the node when comments are published.
+  search_touch_node($comment->nid);
+}
+
+/**
+ * Implements hook_comment_unpublish().
+ */
+function search_comment_unpublish($comment) {
+  // Reindex the node when comments are unpublished.
+  search_touch_node($comment->nid);
+}
+
+/**
+ * Extracts a module-specific search option from a search expression.
+ *
+ * Search options are added using search_expression_insert(), and retrieved
+ * using search_expression_extract(). They take the form option:value, and
+ * are added to the ordinary keywords in the search expression.
+ *
+ * @param $expression
+ *   The search expression to extract from.
+ * @param $option
+ *   The name of the option to retrieve from the search expression.
+ *
+ * @return
+ *   The value previously stored in the search expression for option $option,
+ *   if any. Trailing spaces in values will not be included.
+ */
+function search_expression_extract($expression, $option) {
+  if (preg_match('/(^| )' . $option . ':([^ ]*)( |$)/i', $expression, $matches)) {
+    return $matches[2];
+  }
+}
+
+/**
+ * Adds a module-specific search option to a search expression.
+ *
+ * Search options are added using search_expression_insert(), and retrieved
+ * using search_expression_extract(). They take the form option:value, and
+ * are added to the ordinary keywords in the search expression.
+ *
+ * @param $expression
+ *   The search expression to add to.
+ * @param $option
+ *   The name of the option to add to the search expression.
+ * @param $value
+ *   The value to add for the option. If present, it will replace any previous
+ *   value added for the option. Cannot contain any spaces or | characters, as
+ *   these are used as delimiters. If you want to add a blank value $option: to
+ *   the search expression, pass in an empty string or a string that is composed
+ *   of only spaces. To clear a previously-stored option without adding a
+ *   replacement, pass in NULL for $value or omit.
+ *
+ * @return
+ *   $expression, with any previous value for this option removed, and a new
+ *   $option:$value pair added if $value was provided.
+ */
+function search_expression_insert($expression, $option, $value = NULL) {
+  // Remove any previous values stored with $option.
+  $expression = trim(preg_replace('/(^| )' . $option . ':[^ ]*/i', '', $expression));
+
+  // Set new value, if provided.
+  if (isset($value)) {
+    $expression .= ' ' . $option . ':' . trim($value);
+  }
+  return $expression;
+}
+
+/**
+ * @defgroup search Search interface
+ * @{
+ * The Drupal search interface manages a global search mechanism.
+ *
+ * Modules may plug into this system to provide searches of different types of
+ * data. Most of the system is handled by search.module, so this must be enabled
+ * for all of the search features to work.
+ *
+ * There are three ways to interact with the search system:
+ * - Specifically for searching nodes, you can implement
+ *   hook_node_update_index() and hook_node_search_result(). However, note that
+ *   the search system already indexes all visible output of a node; i.e.,
+ *   everything displayed normally by hook_view() and hook_node_view(). This is
+ *   usually sufficient. You should only use this mechanism if you want
+ *   additional, non-visible data to be indexed.
+ * - Implement hook_search_info(). This will create a search tab for your module
+ *   on the /search page with a simple keyword search form. You will also need
+ *   to implement hook_search_execute() to perform the search.
+ * - Implement hook_update_index(). This allows your module to use Drupal's
+ *   HTML indexing mechanism for searching full text efficiently.
+ *
+ * If your module needs to provide a more complicated search form, then you need
+ * to implement it yourself without hook_search_info(). In that case, you should
+ * define it as a local task (tab) under the /search page (e.g. /search/mymodule)
+ * so that users can easily find it.
+ */
+
+/**
+ * Builds a search form.
+ *
+ * @param $action
+ *   Form action. Defaults to "search/$path", where $path is the search path
+ *   associated with the module in its hook_search_info(). This will be
+ *   run through url().
+ * @param $keys
+ *   The search string entered by the user, containing keywords for the search.
+ * @param $module
+ *   The search module to render the form for: a module that implements
+ *   hook_search_info(). If not supplied, the default search module is used.
+ * @param $prompt
+ *   Label for the keywords field. Defaults to t('Enter your keywords') if NULL.
+ *   Supply '' to omit.
+ *
+ * @return
+ *   A Form API array for the search form.
+ */
+function search_form($form, &$form_state, $action = '', $keys = '', $module = NULL, $prompt = NULL) {
+  $module_info = FALSE;
+  if (!$module) {
+    $module_info = search_get_default_module_info();
+  }
+  else {
+    $info = search_get_info();
+    $module_info = isset($info[$module]) ? $info[$module] : FALSE;
+  }
+
+  // Sanity check.
+  if (!$module_info) {
+    form_set_error(NULL, t('Search is currently disabled.'), 'error');
+    return $form;
+  }
+
+  if (!$action) {
+    $action = 'search/' . $module_info['path'];
+  }
+  if (!isset($prompt)) {
+    $prompt = t('Enter your keywords');
+  }
+
+  $form['#action'] = url($action);
+  // Record the $action for later use in redirecting.
+  $form_state['action'] = $action;
+  $form['#attributes']['class'][] = 'search-form';
+  $form['module'] = array('#type' => 'value', '#value' => $module);
+  $form['basic'] = array('#type' => 'container', '#attributes' => array('class' => array('container-inline')));
+  $form['basic']['keys'] = array(
+    '#type' => 'textfield',
+    '#title' => $prompt,
+    '#default_value' => $keys,
+    '#size' => $prompt ? 40 : 20,
+    '#maxlength' => 255,
+  );
+  // processed_keys is used to coordinate keyword passing between other forms
+  // that hook into the basic search form.
+  $form['basic']['processed_keys'] = array('#type' => 'value', '#value' => '');
+  $form['basic']['submit'] = array('#type' => 'submit', '#value' => t('Search'));
+
+  return $form;
+}
+
+/**
+ * Form builder; Output a search form for the search block's search box.
+ *
+ * @ingroup forms
+ * @see search_box_form_submit()
+ * @see search-block-form.tpl.php
+ */
+function search_box($form, &$form_state, $form_id) {
+  $form[$form_id] = array(
+    '#type' => 'textfield',
+    '#title' => t('Search'),
+    '#title_display' => 'invisible',
+    '#size' => 15,
+    '#default_value' => '',
+    '#attributes' => array('title' => t('Enter the terms you wish to search for.')),
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Search'));
+  $form['#submit'][] = 'search_box_form_submit';
+
+  return $form;
+}
+
+/**
+ * Process a block search form submission.
+ */
+function search_box_form_submit($form, &$form_state) {
+  // The search form relies on control of the redirect destination for its
+  // functionality, so we override any static destination set in the request,
+  // for example by drupal_access_denied() or drupal_not_found()
+  // (see http://drupal.org/node/292565).
+  if (isset($_GET['destination'])) {
+    unset($_GET['destination']);
+  }
+
+  // Check to see if the form was submitted empty.
+  // If it is empty, display an error message.
+  // (This method is used instead of setting #required to TRUE for this field
+  // because that results in a confusing error message.  It would say a plain
+  // "field is required" because the search keywords field has no title.
+  // The error message would also complain about a missing #title field.)
+  if ($form_state['values']['search_block_form'] == '') {
+    form_set_error('keys', t('Please enter some keywords.'));
+  }
+
+  $form_id = $form['form_id']['#value'];
+  $info = search_get_default_module_info();
+  if ($info) {
+    $form_state['redirect'] = 'search/' . $info['path'] . '/' . trim($form_state['values'][$form_id]);
+  }
+  else {
+    form_set_error(NULL, t('Search is currently disabled.'), 'error');
+  }
+}
+
+/**
+ * Process variables for search-block-form.tpl.php.
+ *
+ * The $variables array contains the following arguments:
+ * - $form
+ *
+ * @see search-block-form.tpl.php
+ */
+function template_preprocess_search_block_form(&$variables) {
+  $variables['search'] = array();
+  $hidden = array();
+  // Provide variables named after form keys so themers can print each element independently.
+  foreach (element_children($variables['form']) as $key) {
+    $type = isset($variables['form'][$key]['#type']) ? $variables['form'][$key]['#type'] : '';
+    if ($type == 'hidden' || $type == 'token') {
+      $hidden[] = drupal_render($variables['form'][$key]);
+    }
+    else {
+      $variables['search'][$key] = drupal_render($variables['form'][$key]);
+    }
+  }
+  // Hidden form elements have no value to themers. No need for separation.
+  $variables['search']['hidden'] = implode($hidden);
+  // Collect all form elements to make it easier to print the whole form.
+  $variables['search_form'] = implode($variables['search']);
+}
+
+/**
+ * Performs a search by calling hook_search_execute().
+ *
+ * @param $keys
+ *   Keyword query to search on.
+ * @param $module
+ *   Search module to search.
+ * @param $conditions
+ *   Optional array of additional search conditions.
+ *
+ * @return
+ *   Renderable array of search results. No return value if $keys are not
+ *   supplied or if the given search module is not active.
+ */
+function search_data($keys, $module, $conditions = NULL) {
+  if (module_hook($module, 'search_execute')) {
+    $results = module_invoke($module, 'search_execute', $keys, $conditions);
+    if (module_hook($module, 'search_page')) {
+      return module_invoke($module, 'search_page', $results);
+    }
+    else {
+      return array(
+        '#theme' => 'search_results',
+        '#results' => $results,
+        '#module' => $module,
+      );
+    }
+  }
+}
+
+/**
+ * Returns snippets from a piece of text, with certain keywords highlighted.
+ * Used for formatting search results.
+ *
+ * @param $keys
+ *   A string containing a search query.
+ *
+ * @param $text
+ *   The text to extract fragments from.
+ *
+ * @return
+ *   A string containing HTML for the excerpt.
+ */
+function search_excerpt($keys, $text) {
+  // We highlight around non-indexable or CJK characters.
+  $boundary = '(?:(?<=[' . PREG_CLASS_UNICODE_WORD_BOUNDARY . PREG_CLASS_CJK . '])|(?=[' . PREG_CLASS_UNICODE_WORD_BOUNDARY . PREG_CLASS_CJK . ']))';
+
+  // Extract positive keywords and phrases
+  preg_match_all('/ ("([^"]+)"|(?!OR)([^" ]+))/', ' ' . $keys, $matches);
+  $keys = array_merge($matches[2], $matches[3]);
+
+  // Prepare text by stripping HTML tags and decoding HTML entities.
+  $text = strip_tags(str_replace(array('<', '>'), array(' <', '> '), $text));
+  $text = decode_entities($text);
+
+  // Slash-escape quotes in the search keyword string.
+  array_walk($keys, '_search_excerpt_replace');
+  $workkeys = $keys;
+
+  // Extract fragments around keywords.
+  // First we collect ranges of text around each keyword, starting/ending
+  // at spaces, trying to get to 256 characters.
+  // If the sum of all fragments is too short, we look for second occurrences.
+  $ranges = array();
+  $included = array();
+  $foundkeys = array();
+  $length = 0;
+  while ($length < 256 && count($workkeys)) {
+    foreach ($workkeys as $k => $key) {
+      if (strlen($key) == 0) {
+        unset($workkeys[$k]);
+        unset($keys[$k]);
+        continue;
+      }
+      if ($length >= 256) {
+        break;
+      }
+      // Remember occurrence of key so we can skip over it if more occurrences
+      // are desired.
+      if (!isset($included[$key])) {
+        $included[$key] = 0;
+      }
+      // Locate a keyword (position $p, always >0 because $text starts with a
+      // space). First try bare keyword, but if that doesn't work, try to find a
+      // derived form from search_simplify().
+      $p = 0;
+      if (preg_match('/' . $boundary . $key . $boundary . '/iu', $text, $match, PREG_OFFSET_CAPTURE, $included[$key])) {
+        $p = $match[0][1];
+      }
+      else {
+        $info = search_simplify_excerpt_match($key, $text, $included[$key], $boundary);
+        if ($info['where']) {
+          $p = $info['where'];
+          if ($info['keyword']) {
+            $foundkeys[] = $info['keyword'];
+          }
+        }
+      }
+      // Now locate a space in front (position $q) and behind it (position $s),
+      // leaving about 60 characters extra before and after for context.
+      // Note that a space was added to the front and end of $text above.
+      if ($p) {
+        if (($q = strpos(' ' . $text, ' ', max(0, $p - 61))) !== FALSE) {
+          $end = substr($text . ' ', $p, 80);
+          if (($s = strrpos($end, ' ')) !== FALSE) {
+            // Account for the added spaces.
+            $q = max($q - 1, 0);
+            $s = min($s, strlen($end) - 1);
+            $ranges[$q] = $p + $s;
+            $length += $p + $s - $q;
+            $included[$key] = $p + 1;
+          }
+          else {
+            unset($workkeys[$k]);
+          }
+        }
+        else {
+          unset($workkeys[$k]);
+        }
+      }
+      else {
+        unset($workkeys[$k]);
+      }
+    }
+  }
+
+  if (count($ranges) == 0) {
+    // We didn't find any keyword matches, so just return the first part of the
+    // text. We also need to re-encode any HTML special characters that we
+    // entity-decoded above.
+    return check_plain(truncate_utf8($text, 256, TRUE, TRUE));
+  }
+
+  // Sort the text ranges by starting position.
+  ksort($ranges);
+
+  // Now we collapse overlapping text ranges into one. The sorting makes it O(n).
+  $newranges = array();
+  foreach ($ranges as $from2 => $to2) {
+    if (!isset($from1)) {
+      $from1 = $from2;
+      $to1 = $to2;
+      continue;
+    }
+    if ($from2 <= $to1) {
+      $to1 = max($to1, $to2);
+    }
+    else {
+      $newranges[$from1] = $to1;
+      $from1 = $from2;
+      $to1 = $to2;
+    }
+  }
+  $newranges[$from1] = $to1;
+
+  // Fetch text
+  $out = array();
+  foreach ($newranges as $from => $to) {
+    $out[] = substr($text, $from, $to - $from);
+  }
+
+  // Let translators have the ... separator text as one chunk.
+  $dots = explode('!excerpt', t('... !excerpt ... !excerpt ...'));
+
+  $text = (isset($newranges[0]) ? '' : $dots[0]) . implode($dots[1], $out) . $dots[2];
+  $text = check_plain($text);
+
+  // Slash-escape quotes in keys found in a derived form and merge with original keys.
+  array_walk($foundkeys, '_search_excerpt_replace');
+  $keys = array_merge($keys, $foundkeys);
+
+  // Highlight keywords. Must be done at once to prevent conflicts ('strong' and '<strong>').
+  $text = preg_replace('/' . $boundary . '(' . implode('|', $keys) . ')' . $boundary . '/iu', '<strong>\0</strong>', $text);
+  return $text;
+}
+
+/**
+ * @} End of "defgroup search".
+ */
+
+/**
+ * Helper function for array_walk() in search_excerpt().
+ */
+function _search_excerpt_replace(&$text) {
+  $text = preg_quote($text, '/');
+}
+
+/**
+ * Find words in the original text that matched via search_simplify().
+ *
+ * This is called in search_excerpt() if an exact match is not found in the
+ * text, so that we can find the derived form that matches.
+ *
+ * @param $key
+ *   The keyword to find.
+ * @param $text
+ *   The text to search for the keyword.
+ * @param $offset
+ *   Offset position in $text to start searching at.
+ * @param $boundary
+ *   Text to include in a regular expression that will match a word boundary.
+ *
+ * @return
+ *   FALSE if no match is found. If a match is found, return an associative
+ *   array with element 'where' giving the position of the match, and element
+ *   'keyword' giving the actual word found in the text at that position.
+ */
+function search_simplify_excerpt_match($key, $text, $offset, $boundary) {
+  $pos = NULL;
+  $simplified_key = search_simplify($key);
+  $simplified_text = search_simplify($text);
+
+  // Return immediately if simplified key or text are empty.
+  if (!$simplified_key || !$simplified_text) {
+    return FALSE;
+  }
+
+  // Check if we have a match after simplification in the text.
+  if (!preg_match('/' . $boundary . $simplified_key . $boundary . '/iu', $simplified_text, $match, PREG_OFFSET_CAPTURE, $offset)) {
+    return FALSE;
+  }
+
+  // If we get here, we have a match. Now find the exact location of the match
+  // and the original text that matched. Start by splitting up the text by all
+  // potential starting points of the matching text and iterating through them.
+  $split = array_filter(preg_split('/' . $boundary . '/iu', $text, -1, PREG_SPLIT_OFFSET_CAPTURE), '_search_excerpt_match_filter');
+  foreach ($split as $value) {
+    // Skip starting points before the offset.
+    if ($value[1] < $offset) {
+      continue;
+    }
+
+    // Check a window of 80 characters after the starting point for a match,
+    // based on the size of the excerpt window.
+    $window = substr($text, $value[1], 80);
+    $simplified_window = search_simplify($window);
+    if (strpos($simplified_window, $simplified_key) === 0) {
+      // We have a match in this window. Store the position of the match.
+      $pos = $value[1];
+      // Iterate through the text in the window until we find the full original
+      // matching text.
+      $length = strlen($window);
+      for ($i = 1; $i <= $length; $i++) {
+        $keyfound = substr($text, $value[1], $i);
+        if ($simplified_key == search_simplify($keyfound)) {
+          break;
+        }
+      }
+      break;
+    }
+  }
+
+  return $pos ? array('where' => $pos, 'keyword' => $keyfound) : FALSE;
+}
+
+/**
+ * Helper function for array_filter() in search_search_excerpt_match().
+ */
+function _search_excerpt_match_filter($var) {
+  return strlen(trim($var[0]));
+}
+
+/**
+ * Implements hook_forms().
+ */
+function search_forms() {
+  $forms['search_block_form']= array(
+    'callback' => 'search_box',
+    'callback arguments' => array('search_block_form'),
+  );
+  return $forms;
+}
+
diff --git a/htmltest/modules/search/search.pages.inc b/htmltest/modules/search/search.pages.inc
new file mode 100644
index 00000000..9dd00a6d
--- /dev/null
+++ b/htmltest/modules/search/search.pages.inc
@@ -0,0 +1,158 @@
+<?php
+
+/**
+ * @file
+ * User page callbacks for the search module.
+ */
+
+/**
+ * Menu callback; presents the search form and/or search results.
+ *
+ * @param $module
+ *   Search module to use for the search.
+ * @param $keys
+ *   Keywords to use for the search.
+ */
+function search_view($module = NULL, $keys = '') {
+  $info = FALSE;
+  $keys = trim($keys);
+  // Also try to pull search keywords out of the $_REQUEST variable to
+  // support old GET format of searches for existing links.
+  if (!$keys && !empty($_REQUEST['keys'])) {
+    $keys = trim($_REQUEST['keys']);
+  }
+
+  if (!empty($module)) {
+    $active_module_info = search_get_info();
+    if (isset($active_module_info[$module])) {
+      $info = $active_module_info[$module];
+    }
+  }
+
+  if (empty($info)) {
+    // No path or invalid path: find the default module. Note that if there
+    // are no enabled search modules, this function should never be called,
+    // since hook_menu() would not have defined any search paths.
+    $info = search_get_default_module_info();
+    // Redirect from bare /search or an invalid path to the default search path.
+    $path = 'search/' . $info['path'];
+    if ($keys) {
+      $path .= '/' . $keys;
+    }
+    drupal_goto($path);
+  }
+
+  // Default results output is an empty string.
+  $results = array('#markup' => '');
+  // Process the search form. Note that if there is $_POST data,
+  // search_form_submit() will cause a redirect to search/[module path]/[keys],
+  // which will get us back to this page callback. In other words, the search
+  // form submits with POST but redirects to GET. This way we can keep
+  // the search query URL clean as a whistle.
+  if (empty($_POST['form_id']) || $_POST['form_id'] != 'search_form') {
+    $conditions =  NULL;
+    if (isset($info['conditions_callback']) && function_exists($info['conditions_callback'])) {
+      // Build an optional array of more search conditions.
+      $conditions = call_user_func($info['conditions_callback'], $keys);
+    }
+    // Only search if there are keywords or non-empty conditions.
+    if ($keys || !empty($conditions)) {
+      // Log the search keys.
+      watchdog('search', 'Searched %type for %keys.', array('%keys' => $keys, '%type' => $info['title']), WATCHDOG_NOTICE, l(t('results'), 'search/' . $info['path'] . '/' . $keys));
+
+      // Collect the search results.
+      $results = search_data($keys, $info['module'], $conditions);
+    }
+  }
+  // The form may be altered based on whether the search was run.
+  $build['search_form'] = drupal_get_form('search_form', NULL, $keys, $info['module']);
+  $build['search_results'] = $results;
+
+  return $build;
+}
+
+/**
+ * Process variables for search-results.tpl.php.
+ *
+ * The $variables array contains the following arguments:
+ * - $results: Search results array.
+ * - $module: Module the search results came from (module implementing
+ *   hook_search_info()).
+ *
+ * @see search-results.tpl.php
+ */
+function template_preprocess_search_results(&$variables) {
+  $variables['search_results'] = '';
+  if (!empty($variables['module'])) {
+    $variables['module'] = check_plain($variables['module']);
+  }
+  foreach ($variables['results'] as $result) {
+    $variables['search_results'] .= theme('search_result', array('result' => $result, 'module' => $variables['module']));
+  }
+  $variables['pager'] = theme('pager', array('tags' => NULL));
+  $variables['theme_hook_suggestions'][] = 'search_results__' . $variables['module'];
+}
+
+/**
+ * Process variables for search-result.tpl.php.
+ *
+ * The $variables array contains the following arguments:
+ * - $result
+ * - $module
+ *
+ * @see search-result.tpl.php
+ */
+function template_preprocess_search_result(&$variables) {
+  global $language;
+
+  $result = $variables['result'];
+  $variables['url'] = check_url($result['link']);
+  $variables['title'] = check_plain($result['title']);
+  if (isset($result['language']) && $result['language'] != $language->language && $result['language'] != LANGUAGE_NONE) {
+    $variables['title_attributes_array']['xml:lang'] = $result['language'];
+    $variables['content_attributes_array']['xml:lang'] = $result['language'];
+  }
+
+  $info = array();
+  if (!empty($result['module'])) {
+    $info['module'] = check_plain($result['module']);
+  }
+  if (!empty($result['user'])) {
+    $info['user'] = $result['user'];
+  }
+  if (!empty($result['date'])) {
+    $info['date'] = format_date($result['date'], 'short');
+  }
+  if (isset($result['extra']) && is_array($result['extra'])) {
+    $info = array_merge($info, $result['extra']);
+  }
+  // Check for existence. User search does not include snippets.
+  $variables['snippet'] = isset($result['snippet']) ? $result['snippet'] : '';
+  // Provide separated and grouped meta information..
+  $variables['info_split'] = $info;
+  $variables['info'] = implode(' - ', $info);
+  $variables['theme_hook_suggestions'][] = 'search_result__' . $variables['module'];
+}
+
+/**
+ * As the search form collates keys from other modules hooked in via
+ * hook_form_alter, the validation takes place in _submit.
+ * search_form_validate() is used solely to set the 'processed_keys' form
+ * value for the basic search form.
+ */
+function search_form_validate($form, &$form_state) {
+  form_set_value($form['basic']['processed_keys'], trim($form_state['values']['keys']), $form_state);
+}
+
+/**
+ * Process a search form submission.
+ */
+function search_form_submit($form, &$form_state) {
+  $keys = $form_state['values']['processed_keys'];
+  if ($keys == '') {
+    form_set_error('keys', t('Please enter some keywords.'));
+    // Fall through to the form redirect.
+  }
+
+  $form_state['redirect'] = $form_state['action'] . '/' . $keys;
+}
diff --git a/htmltest/modules/search/search.test b/htmltest/modules/search/search.test
new file mode 100644
index 00000000..09c879b1
--- /dev/null
+++ b/htmltest/modules/search/search.test
@@ -0,0 +1,2079 @@
+<?php
+
+/**
+ * @file
+ * Tests for search.module.
+ */
+
+// The search index can contain different types of content. Typically the type is 'node'.
+// Here we test with _test_ and _test2_ as the type.
+define('SEARCH_TYPE', '_test_');
+define('SEARCH_TYPE_2', '_test2_');
+define('SEARCH_TYPE_JPN', '_test3_');
+
+class SearchMatchTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Search engine queries',
+      'description' => 'Indexes content and queries it.',
+      'group' => 'Search',
+    );
+  }
+
+  /**
+   * Implementation setUp().
+   */
+  function setUp() {
+    parent::setUp('search');
+  }
+
+  /**
+   * Test search indexing.
+   */
+  function testMatching() {
+    $this->_setup();
+    $this->_testQueries();
+  }
+
+  /**
+   * Set up a small index of items to test against.
+   */
+  function _setup() {
+    variable_set('minimum_word_size', 3);
+
+    for ($i = 1; $i <= 7; ++$i) {
+      search_index($i, SEARCH_TYPE, $this->getText($i));
+    }
+    for ($i = 1; $i <= 5; ++$i) {
+      search_index($i + 7, SEARCH_TYPE_2, $this->getText2($i));
+    }
+    // No getText builder function for Japanese text; just a simple array.
+    foreach (array(
+      13 => '以呂波耳・ほへとち。リヌルヲ。',
+      14 => 'ドルーパルが大好きよ！',
+      15 => 'コーヒーとケーキ',
+    ) as $i => $jpn) {
+      search_index($i, SEARCH_TYPE_JPN, $jpn);
+    }
+    search_update_totals();
+  }
+
+  /**
+   * _test_: Helper method for generating snippets of content.
+   *
+   * Generated items to test against:
+   *   1  ipsum
+   *   2  dolore sit
+   *   3  sit am ut
+   *   4  am ut enim am
+   *   5  ut enim am minim veniam
+   *   6  enim am minim veniam es cillum
+   *   7  am minim veniam es cillum dolore eu
+   */
+  function getText($n) {
+    $words = explode(' ', "Ipsum dolore sit am. Ut enim am minim veniam. Es cillum dolore eu.");
+    return implode(' ', array_slice($words, $n - 1, $n));
+  }
+
+  /**
+   * _test2_: Helper method for generating snippets of content.
+   *
+   * Generated items to test against:
+   *   8  dear
+   *   9  king philip
+   *   10 philip came over
+   *   11 came over from germany
+   *   12 over from germany swimming
+   */
+  function getText2($n) {
+    $words = explode(' ', "Dear King Philip came over from Germany swimming.");
+    return implode(' ', array_slice($words, $n - 1, $n));
+  }
+
+  /**
+   * Run predefine queries looking for indexed terms.
+   */
+  function _testQueries() {
+    /*
+      Note: OR queries that include short words in OR groups are only accepted
+      if the ORed terms are ANDed with at least one long word in the rest of the query.
+
+      e.g. enim dolore OR ut = enim (dolore OR ut) = (enim dolor) OR (enim ut) -> good
+      e.g. dolore OR ut = (dolore) OR (ut) -> bad
+
+      This is a design limitation to avoid full table scans.
+    */
+    $queries = array(
+      // Simple AND queries.
+      'ipsum' => array(1),
+      'enim' => array(4, 5, 6),
+      'xxxxx' => array(),
+      'enim minim' => array(5, 6),
+      'enim xxxxx' => array(),
+      'dolore eu' => array(7),
+      'dolore xx' => array(),
+      'ut minim' => array(5),
+      'xx minim' => array(),
+      'enim veniam am minim ut' => array(5),
+      // Simple OR queries.
+      'dolore OR ipsum' => array(1, 2, 7),
+      'dolore OR xxxxx' => array(2, 7),
+      'dolore OR ipsum OR enim' => array(1, 2, 4, 5, 6, 7),
+      'ipsum OR dolore sit OR cillum' => array(2, 7),
+      'minim dolore OR ipsum' => array(7),
+      'dolore OR ipsum veniam' => array(7),
+      'minim dolore OR ipsum OR enim' => array(5, 6, 7),
+      'dolore xx OR yy' => array(),
+      'xxxxx dolore OR ipsum' => array(),
+      // Negative queries.
+      'dolore -sit' => array(7),
+      'dolore -eu' => array(2),
+      'dolore -xxxxx' => array(2, 7),
+      'dolore -xx' => array(2, 7),
+      // Phrase queries.
+      '"dolore sit"' => array(2),
+      '"sit dolore"' => array(),
+      '"am minim veniam es"' => array(6, 7),
+      '"minim am veniam es"' => array(),
+      // Mixed queries.
+      '"am minim veniam es" OR dolore' => array(2, 6, 7),
+      '"minim am veniam es" OR "dolore sit"' => array(2),
+      '"minim am veniam es" OR "sit dolore"' => array(),
+      '"am minim veniam es" -eu' => array(6),
+      '"am minim veniam" -"cillum dolore"' => array(5, 6),
+      '"am minim veniam" -"dolore cillum"' => array(5, 6, 7),
+      'xxxxx "minim am veniam es" OR dolore' => array(),
+      'xx "minim am veniam es" OR dolore' => array()
+    );
+    foreach ($queries as $query => $results) {
+      $result = db_select('search_index', 'i')
+        ->extend('SearchQuery')
+        ->searchExpression($query, SEARCH_TYPE)
+        ->execute();
+
+      $set = $result ? $result->fetchAll() : array();
+      $this->_testQueryMatching($query, $set, $results);
+      $this->_testQueryScores($query, $set, $results);
+    }
+
+    // These queries are run against the second index type, SEARCH_TYPE_2.
+    $queries = array(
+      // Simple AND queries.
+      'ipsum' => array(),
+      'enim' => array(),
+      'enim minim' => array(),
+      'dear' => array(8),
+      'germany' => array(11, 12),
+    );
+    foreach ($queries as $query => $results) {
+      $result = db_select('search_index', 'i')
+        ->extend('SearchQuery')
+        ->searchExpression($query, SEARCH_TYPE_2)
+        ->execute();
+
+      $set = $result ? $result->fetchAll() : array();
+      $this->_testQueryMatching($query, $set, $results);
+      $this->_testQueryScores($query, $set, $results);
+    }
+
+    // These queries are run against the third index type, SEARCH_TYPE_JPN.
+    $queries = array(
+      // Simple AND queries.
+      '呂波耳' => array(13),
+      '以呂波耳' => array(13),
+      'ほへと　ヌルヲ' => array(13),
+      'とちリ' => array(),
+      'ドルーパル' => array(14),
+      'パルが大' => array(14),
+      'コーヒー' => array(15),
+      'ヒーキ' => array(),
+    );
+    foreach ($queries as $query => $results) {
+      $result = db_select('search_index', 'i')
+        ->extend('SearchQuery')
+        ->searchExpression($query, SEARCH_TYPE_JPN)
+        ->execute();
+
+      $set = $result ? $result->fetchAll() : array();
+      $this->_testQueryMatching($query, $set, $results);
+      $this->_testQueryScores($query, $set, $results);
+    }
+  }
+
+  /**
+   * Test the matching abilities of the engine.
+   *
+   * Verify if a query produces the correct results.
+   */
+  function _testQueryMatching($query, $set, $results) {
+    // Get result IDs.
+    $found = array();
+    foreach ($set as $item) {
+      $found[] = $item->sid;
+    }
+
+    // Compare $results and $found.
+    sort($found);
+    sort($results);
+    $this->assertEqual($found, $results, "Query matching '$query'");
+  }
+
+  /**
+   * Test the scoring abilities of the engine.
+   *
+   * Verify if a query produces normalized, monotonous scores.
+   */
+  function _testQueryScores($query, $set, $results) {
+    // Get result scores.
+    $scores = array();
+    foreach ($set as $item) {
+      $scores[] = $item->calculated_score;
+    }
+
+    // Check order.
+    $sorted = $scores;
+    sort($sorted);
+    $this->assertEqual($scores, array_reverse($sorted), "Query order '$query'");
+
+    // Check range.
+    $this->assertEqual(!count($scores) || (min($scores) > 0.0 && max($scores) <= 1.0001), TRUE, "Query scoring '$query'");
+  }
+}
+
+/**
+ * Tests the bike shed text on no results page, and text on the search page.
+ */
+class SearchPageText extends DrupalWebTestCase {
+  protected $searching_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Search page text',
+      'description' => 'Tests the bike shed text on the no results page, and various other text on search pages.',
+      'group' => 'Search'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search');
+
+    // Create user.
+    $this->searching_user = $this->drupalCreateUser(array('search content', 'access user profiles'));
+  }
+
+  /**
+   * Tests the failed search text, and various other text on the search page.
+   */
+  function testSearchText() {
+    $this->drupalLogin($this->searching_user);
+    $this->drupalGet('search/node');
+    $this->assertText(t('Enter your keywords'));
+    $this->assertText(t('Search'));
+    $title = t('Search') . ' | Drupal';
+    $this->assertTitle($title, 'Search page title is correct');
+
+    $edit = array();
+    $edit['keys'] = 'bike shed ' . $this->randomName();
+    $this->drupalPost('search/node', $edit, t('Search'));
+    $this->assertText(t('Consider loosening your query with OR. bike OR shed will often show more results than bike shed.'), 'Help text is displayed when search returns no results.');
+    $this->assertText(t('Search'));
+    $this->assertTitle($title, 'Search page title is correct');
+
+    $edit['keys'] = $this->searching_user->name;
+    $this->drupalPost('search/user', $edit, t('Search'));
+    $this->assertText(t('Search'));
+    $this->assertTitle($title, 'Search page title is correct');
+
+    // Test that search keywords containing slashes are correctly loaded
+    // from the path and displayed in the search form.
+    $arg = $this->randomName() . '/' . $this->randomName();
+    $this->drupalGet('search/node/' . $arg);
+    $input = $this->xpath("//input[@id='edit-keys' and @value='{$arg}']");
+    $this->assertFalse(empty($input), 'Search keys with a / are correctly set as the default value in the search box.');
+
+    // Test a search input exceeding the limit of AND/OR combinations to test
+    // the Denial-of-Service protection.
+    $limit = variable_get('search_and_or_limit', 7);
+    $keys = array();
+    for ($i = 0; $i < $limit + 1; $i++) {
+      $keys[] = $this->randomName(3);
+      if ($i % 2 == 0) {
+        $keys[] = 'OR';
+      }
+    }
+    $edit['keys'] = implode(' ', $keys);
+    $this->drupalPost('search/node', $edit, t('Search'));
+    $this->assertRaw(t('Your search used too many AND/OR expressions. Only the first @count terms were included in this search.', array('@count' => $limit)));
+  }
+}
+
+class SearchAdvancedSearchForm extends DrupalWebTestCase {
+  protected $node;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Advanced search form',
+      'description' => 'Indexes content and tests the advanced search form.',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search');
+    // Create and login user.
+    $test_user = $this->drupalCreateUser(array('access content', 'search content', 'use advanced search', 'administer nodes'));
+    $this->drupalLogin($test_user);
+
+    // Create initial node.
+    $node = $this->drupalCreateNode();
+    $this->node = $this->drupalCreateNode();
+
+    // First update the index. This does the initial processing.
+    node_update_index();
+
+    // Then, run the shutdown function. Testing is a unique case where indexing
+    // and searching has to happen in the same request, so running the shutdown
+    // function manually is needed to finish the indexing process.
+    search_update_totals();
+  }
+
+  /**
+   * Test using the search form with GET and POST queries.
+   * Test using the advanced search form to limit search to nodes of type "Basic page".
+   */
+  function testNodeType() {
+    $this->assertTrue($this->node->type == 'page', 'Node type is Basic page.');
+
+    // Assert that the dummy title doesn't equal the real title.
+    $dummy_title = 'Lorem ipsum';
+    $this->assertNotEqual($dummy_title, $this->node->title, "Dummy title doesn't equal node title");
+
+    // Search for the dummy title with a GET query.
+    $this->drupalGet('search/node/' . $dummy_title);
+    $this->assertNoText($this->node->title, 'Basic page node is not found with dummy title.');
+
+    // Search for the title of the node with a GET query.
+    $this->drupalGet('search/node/' . $this->node->title);
+    $this->assertText($this->node->title, 'Basic page node is found with GET query.');
+
+    // Search for the title of the node with a POST query.
+    $edit = array('or' => $this->node->title);
+    $this->drupalPost('search/node', $edit, t('Advanced search'));
+    $this->assertText($this->node->title, 'Basic page node is found with POST query.');
+
+    // Advanced search type option.
+    $this->drupalPost('search/node', array_merge($edit, array('type[page]' => 'page')), t('Advanced search'));
+    $this->assertText($this->node->title, 'Basic page node is found with POST query and type:page.');
+
+    $this->drupalPost('search/node', array_merge($edit, array('type[article]' => 'article')), t('Advanced search'));
+    $this->assertText('bike shed', 'Article node is not found with POST query and type:article.');
+  }
+}
+
+class SearchRankingTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Search engine ranking',
+      'description' => 'Indexes content and tests ranking factors.',
+      'group' => 'Search',
+    );
+  }
+
+  /**
+   * Implementation setUp().
+   */
+  function setUp() {
+    parent::setUp('search', 'statistics', 'comment');
+  }
+
+  function testRankings() {
+    // Login with sufficient privileges.
+    $this->drupalLogin($this->drupalCreateUser(array('skip comment approval', 'create page content')));
+
+    // Build a list of the rankings to test.
+    $node_ranks = array('sticky', 'promote', 'relevance', 'recent', 'comments', 'views');
+
+    // Create nodes for testing.
+    foreach ($node_ranks as $node_rank) {
+      $settings = array(
+        'type' => 'page',
+        'title' => 'Drupal rocks',
+        'body' => array(LANGUAGE_NONE => array(array('value' => "Drupal's search rocks"))),
+      );
+      foreach (array(0, 1) as $num) {
+        if ($num == 1) {
+          switch ($node_rank) {
+            case 'sticky':
+            case 'promote':
+              $settings[$node_rank] = 1;
+              break;
+            case 'relevance':
+              $settings['body'][LANGUAGE_NONE][0]['value'] .= " really rocks";
+              break;
+            case 'recent':
+              $settings['created'] = REQUEST_TIME + 3600;
+              break;
+            case 'comments':
+              $settings['comment'] = 2;
+              break;
+          }
+        }
+        $nodes[$node_rank][$num] = $this->drupalCreateNode($settings);
+      }
+    }
+
+    // Update the search index.
+    module_invoke_all('update_index');
+    search_update_totals();
+
+    // Refresh variables after the treatment.
+    $this->refreshVariables();
+
+    // Add a comment to one of the nodes.
+    $edit = array();
+    $edit['subject'] = 'my comment title';
+    $edit['comment_body[' . LANGUAGE_NONE . '][0][value]'] = 'some random comment';
+    $this->drupalGet('comment/reply/' . $nodes['comments'][1]->nid);
+    $this->drupalPost(NULL, $edit, t('Preview'));
+    $this->drupalPost(NULL, $edit, t('Save'));
+
+    // Enable counting of statistics.
+    variable_set('statistics_count_content_views', 1);
+
+    // Then View one of the nodes a bunch of times.
+    for ($i = 0; $i < 5; $i ++) {
+      $this->drupalGet('node/' . $nodes['views'][1]->nid);
+    }
+
+    // Test each of the possible rankings.
+    foreach ($node_ranks as $node_rank) {
+      // Disable all relevancy rankings except the one we are testing.
+      foreach ($node_ranks as $var) {
+        variable_set('node_rank_' . $var, $var == $node_rank ? 10 : 0);
+      }
+
+      // Do the search and assert the results.
+      $set = node_search_execute('rocks');
+      $this->assertEqual($set[0]['node']->nid, $nodes[$node_rank][1]->nid, 'Search ranking "' . $node_rank . '" order.');
+    }
+  }
+
+  /**
+   * Test rankings of HTML tags.
+   */
+  function testHTMLRankings() {
+    // Login with sufficient privileges.
+    $this->drupalLogin($this->drupalCreateUser(array('create page content')));
+
+    // Test HTML tags with different weights.
+    $sorted_tags = array('h1', 'h2', 'h3', 'h4', 'a', 'h5', 'h6', 'notag');
+    $shuffled_tags = $sorted_tags;
+
+    // Shuffle tags to ensure HTML tags are ranked properly.
+    shuffle($shuffled_tags);
+    $settings = array(
+      'type' => 'page',
+      'title' => 'Simple node',
+    );
+    foreach ($shuffled_tags as $tag) {
+      switch ($tag) {
+        case 'a':
+          $settings['body'] = array(LANGUAGE_NONE => array(array('value' => l('Drupal Rocks', 'node'), 'format' => 'full_html')));
+          break;
+        case 'notag':
+          $settings['body'] = array(LANGUAGE_NONE => array(array('value' => 'Drupal Rocks')));
+          break;
+        default:
+          $settings['body'] = array(LANGUAGE_NONE => array(array('value' => "<$tag>Drupal Rocks</$tag>", 'format' => 'full_html')));
+          break;
+      }
+      $nodes[$tag] = $this->drupalCreateNode($settings);
+    }
+
+    // Update the search index.
+    module_invoke_all('update_index');
+    search_update_totals();
+
+    // Refresh variables after the treatment.
+    $this->refreshVariables();
+
+    // Disable all other rankings.
+    $node_ranks = array('sticky', 'promote', 'recent', 'comments', 'views');
+    foreach ($node_ranks as $node_rank) {
+      variable_set('node_rank_' . $node_rank, 0);
+    }
+    $set = node_search_execute('rocks');
+
+    // Test the ranking of each tag.
+    foreach ($sorted_tags as $tag_rank => $tag) {
+      // Assert the results.
+      if ($tag == 'notag') {
+        $this->assertEqual($set[$tag_rank]['node']->nid, $nodes[$tag]->nid, 'Search tag ranking for plain text order.');
+      } else {
+        $this->assertEqual($set[$tag_rank]['node']->nid, $nodes[$tag]->nid, 'Search tag ranking for "&lt;' . $sorted_tags[$tag_rank] . '&gt;" order.');
+      }
+    }
+
+    // Test tags with the same weight against the sorted tags.
+    $unsorted_tags = array('u', 'b', 'i', 'strong', 'em');
+    foreach ($unsorted_tags as $tag) {
+      $settings['body'] = array(LANGUAGE_NONE => array(array('value' => "<$tag>Drupal Rocks</$tag>", 'format' => 'full_html')));
+      $node = $this->drupalCreateNode($settings);
+
+      // Update the search index.
+      module_invoke_all('update_index');
+      search_update_totals();
+
+      // Refresh variables after the treatment.
+      $this->refreshVariables();
+
+      $set = node_search_execute('rocks');
+
+      // Ranking should always be second to last.
+      $set = array_slice($set, -2, 1);
+
+      // Assert the results.
+      $this->assertEqual($set[0]['node']->nid, $node->nid, 'Search tag ranking for "&lt;' . $tag . '&gt;" order.');
+
+      // Delete node so it doesn't show up in subsequent search results.
+      node_delete($node->nid);
+    }
+  }
+
+  /**
+   * Verifies that if we combine two rankings, search still works.
+   *
+   * See issue http://drupal.org/node/771596
+   */
+  function testDoubleRankings() {
+    // Login with sufficient privileges.
+    $this->drupalLogin($this->drupalCreateUser(array('skip comment approval', 'create page content')));
+
+    // See testRankings() above - build a node that will rank high for sticky.
+    $settings = array(
+      'type' => 'page',
+      'title' => 'Drupal rocks',
+      'body' => array(LANGUAGE_NONE => array(array('value' => "Drupal's search rocks"))),
+      'sticky' => 1,
+    );
+
+    $node = $this->drupalCreateNode($settings);
+
+    // Update the search index.
+    module_invoke_all('update_index');
+    search_update_totals();
+
+    // Refresh variables after the treatment.
+    $this->refreshVariables();
+
+    // Set up for ranking sticky and lots of comments; make sure others are
+    // disabled.
+    $node_ranks = array('sticky', 'promote', 'relevance', 'recent', 'comments', 'views');
+    foreach ($node_ranks as $var) {
+      $value = ($var == 'sticky' || $var == 'comments') ? 10 : 0;
+      variable_set('node_rank_' . $var, $value);
+    }
+
+    // Do the search and assert the results.
+    $set = node_search_execute('rocks');
+    $this->assertEqual($set[0]['node']->nid, $node->nid, 'Search double ranking order.');
+  }
+}
+
+class SearchBlockTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Block availability',
+      'description' => 'Check if the search form block is available.',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search');
+
+    // Create and login user
+    $admin_user = $this->drupalCreateUser(array('administer blocks', 'search content'));
+    $this->drupalLogin($admin_user);
+  }
+
+  function testSearchFormBlock() {
+    // Set block title to confirm that the interface is available.
+    $this->drupalPost('admin/structure/block/manage/search/form/configure', array('title' => $this->randomName(8)), t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), 'Block configuration set.');
+
+    // Set the block to a region to confirm block is available.
+    $edit = array();
+    $edit['blocks[search_form][region]'] = 'footer';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->assertText(t('The block settings have been updated.'), 'Block successfully move to footer region.');
+  }
+
+  /**
+   * Test that the search block form works correctly.
+   */
+  function testBlock() {
+    // Enable the block, and place it in the 'content' region so that it isn't
+    // hidden on 404 pages.
+    $edit = array('blocks[search_form][region]' => 'content');
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+
+    // Test a normal search via the block form, from the front page.
+    $terms = array('search_block_form' => 'test');
+    $this->drupalPost('node', $terms, t('Search'));
+    $this->assertText('Your search yielded no results');
+
+    // Test a search from the block on a 404 page.
+    $this->drupalGet('foo');
+    $this->assertResponse(404);
+    $this->drupalPost(NULL, $terms, t('Search'));
+    $this->assertResponse(200);
+    $this->assertText('Your search yielded no results');
+
+    // Test a search from the block when it doesn't appear on the search page.
+    $edit = array('pages' => 'search');
+    $this->drupalPost('admin/structure/block/manage/search/form/configure', $edit, t('Save block'));
+    $this->drupalPost('node', $terms, t('Search'));
+    $this->assertText('Your search yielded no results');
+
+    // Confirm that the user is redirected to the search page.
+    $this->assertEqual(
+      $this->getUrl(),
+      url('search/node/' . $terms['search_block_form'], array('absolute' => TRUE)),
+      'Redirected to correct url.'
+    );
+
+    // Test an empty search via the block form, from the front page.
+    $terms = array('search_block_form' => '');
+    $this->drupalPost('node', $terms, t('Search'));
+    $this->assertText('Please enter some keywords');
+
+    // Confirm that the user is redirected to the search page, when form is submitted empty.
+    $this->assertEqual(
+      $this->getUrl(),
+      url('search/node/', array('absolute' => TRUE)),
+      'Redirected to correct url.'
+    );
+  }
+}
+
+/**
+ * Tests that searching for a phrase gets the correct page count.
+ */
+class SearchExactTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Search engine phrase queries',
+      'description' => 'Tests that searching for a phrase gets the correct page count.',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search');
+  }
+
+  /**
+   * Tests that the correct number of pager links are found for both keywords and phrases.
+   */
+  function testExactQuery() {
+    // Login with sufficient privileges.
+    $this->drupalLogin($this->drupalCreateUser(array('create page content', 'search content')));
+
+    $settings = array(
+      'type' => 'page',
+      'title' => 'Simple Node',
+    );
+    // Create nodes with exact phrase.
+    for ($i = 0; $i <= 17; $i++) {
+      $settings['body'] = array(LANGUAGE_NONE => array(array('value' => 'love pizza')));
+      $this->drupalCreateNode($settings);
+    }
+    // Create nodes containing keywords.
+    for ($i = 0; $i <= 17; $i++) {
+      $settings['body'] = array(LANGUAGE_NONE => array(array('value' => 'love cheesy pizza')));
+      $this->drupalCreateNode($settings);
+    }
+
+    // Update the search index.
+    module_invoke_all('update_index');
+    search_update_totals();
+
+    // Refresh variables after the treatment.
+    $this->refreshVariables();
+
+    // Test that the correct number of pager links are found for keyword search.
+    $edit = array('keys' => 'love pizza');
+    $this->drupalPost('search/node', $edit, t('Search'));
+    $this->assertLinkByHref('page=1', 0, '2nd page link is found for keyword search.');
+    $this->assertLinkByHref('page=2', 0, '3rd page link is found for keyword search.');
+    $this->assertLinkByHref('page=3', 0, '4th page link is found for keyword search.');
+    $this->assertNoLinkByHref('page=4', '5th page link is not found for keyword search.');
+
+    // Test that the correct number of pager links are found for exact phrase search.
+    $edit = array('keys' => '"love pizza"');
+    $this->drupalPost('search/node', $edit, t('Search'));
+    $this->assertLinkByHref('page=1', 0, '2nd page link is found for exact phrase search.');
+    $this->assertNoLinkByHref('page=2', '3rd page link is not found for exact phrase search.');
+  }
+}
+
+/**
+ * Test integration searching comments.
+ */
+class SearchCommentTestCase extends DrupalWebTestCase {
+  protected $admin_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment Search tests',
+      'description' => 'Verify text formats and filters used elsewhere.',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('comment', 'search');
+
+    // Create and log in an administrative user having access to the Full HTML
+    // text format.
+    $full_html_format = filter_format_load('full_html');
+    $permissions = array(
+      'administer filters',
+      filter_permission_name($full_html_format),
+      'administer permissions',
+      'create page content',
+      'skip comment approval',
+      'access comments',
+    );
+    $this->admin_user = $this->drupalCreateUser($permissions);
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Verify that comments are rendered using proper format in search results.
+   */
+  function testSearchResultsComment() {
+    $comment_body = 'Test comment body';
+
+    variable_set('comment_preview_article', DRUPAL_OPTIONAL);
+    // Enable check_plain() for 'Filtered HTML' text format.
+    $filtered_html_format_id = 'filtered_html';
+    $edit = array(
+      'filters[filter_html_escape][status]' => TRUE,
+    );
+    $this->drupalPost('admin/config/content/formats/' . $filtered_html_format_id, $edit, t('Save configuration'));
+    // Allow anonymous users to search content.
+    $edit = array(
+      DRUPAL_ANONYMOUS_RID . '[search content]' => 1,
+      DRUPAL_ANONYMOUS_RID . '[access comments]' => 1,
+      DRUPAL_ANONYMOUS_RID . '[post comments]' => 1,
+    );
+    $this->drupalPost('admin/people/permissions', $edit, t('Save permissions'));
+
+    // Create a node.
+    $node = $this->drupalCreateNode(array('type' => 'article'));
+    // Post a comment using 'Full HTML' text format.
+    $edit_comment = array();
+    $edit_comment['subject'] = 'Test comment subject';
+    $edit_comment['comment_body[' . LANGUAGE_NONE . '][0][value]'] = '<h1>' . $comment_body . '</h1>';
+    $full_html_format_id = 'full_html';
+    $edit_comment['comment_body[' . LANGUAGE_NONE . '][0][format]'] = $full_html_format_id;
+    $this->drupalPost('comment/reply/' . $node->nid, $edit_comment, t('Save'));
+
+    // Invoke search index update.
+    $this->drupalLogout();
+    $this->cronRun();
+
+    // Search for the comment subject.
+    $edit = array(
+      'search_block_form' => "'" . $edit_comment['subject'] . "'",
+    );
+    $this->drupalPost('', $edit, t('Search'));
+    $this->assertText($node->title, 'Node found in search results.');
+    $this->assertText($edit_comment['subject'], 'Comment subject found in search results.');
+
+    // Search for the comment body.
+    $edit = array(
+      'search_block_form' => "'" . $comment_body . "'",
+    );
+    $this->drupalPost('', $edit, t('Search'));
+    $this->assertText($node->title, 'Node found in search results.');
+
+    // Verify that comment is rendered using proper format.
+    $this->assertText($comment_body, 'Comment body text found in search results.');
+    $this->assertNoRaw(t('n/a'), 'HTML in comment body is not hidden.');
+    $this->assertNoRaw(check_plain($edit_comment['comment_body[' . LANGUAGE_NONE . '][0][value]']), 'HTML in comment body is not escaped.');
+
+    // Hide comments.
+    $this->drupalLogin($this->admin_user);
+    $node->comment = 0;
+    node_save($node);
+
+    // Invoke search index update.
+    $this->drupalLogout();
+    $this->cronRun();
+
+    // Search for $title.
+    $this->drupalPost('', $edit, t('Search'));
+    $this->assertNoText($comment_body, 'Comment body text not found in search results.');
+  }
+
+  /**
+   * Verify access rules for comment indexing with different permissions.
+   */
+  function testSearchResultsCommentAccess() {
+    $comment_body = 'Test comment body';
+    $this->comment_subject = 'Test comment subject';
+    $this->admin_role = $this->admin_user->roles;
+    unset($this->admin_role[DRUPAL_AUTHENTICATED_RID]);
+    $this->admin_role = key($this->admin_role);
+
+    // Create a node.
+    variable_set('comment_preview_article', DRUPAL_OPTIONAL);
+    $this->node = $this->drupalCreateNode(array('type' => 'article'));
+
+    // Post a comment using 'Full HTML' text format.
+    $edit_comment = array();
+    $edit_comment['subject'] = $this->comment_subject;
+    $edit_comment['comment_body[' . LANGUAGE_NONE . '][0][value]'] = '<h1>' . $comment_body . '</h1>';
+    $this->drupalPost('comment/reply/' . $this->node->nid, $edit_comment, t('Save'));
+
+    $this->drupalLogout();
+    $this->setRolePermissions(DRUPAL_ANONYMOUS_RID);
+    $this->checkCommentAccess('Anon user has search permission but no access comments permission, comments should not be indexed');
+
+    $this->setRolePermissions(DRUPAL_ANONYMOUS_RID, TRUE);
+    $this->checkCommentAccess('Anon user has search permission and access comments permission, comments should be indexed', TRUE);
+
+    $this->drupalLogin($this->admin_user);
+    $this->drupalGet('admin/people/permissions');
+
+    // Disable search access for authenticated user to test admin user.
+    $this->setRolePermissions(DRUPAL_AUTHENTICATED_RID, FALSE, FALSE);
+
+    $this->setRolePermissions($this->admin_role);
+    $this->checkCommentAccess('Admin user has search permission but no access comments permission, comments should not be indexed');
+
+    $this->setRolePermissions($this->admin_role, TRUE);
+    $this->checkCommentAccess('Admin user has search permission and access comments permission, comments should be indexed', TRUE);
+
+    $this->setRolePermissions(DRUPAL_AUTHENTICATED_RID);
+    $this->checkCommentAccess('Authenticated user has search permission but no access comments permission, comments should not be indexed');
+
+    $this->setRolePermissions(DRUPAL_AUTHENTICATED_RID, TRUE);
+    $this->checkCommentAccess('Authenticated user has search permission and access comments permission, comments should be indexed', TRUE);
+
+    // Verify that access comments permission is inherited from the
+    // authenticated role.
+    $this->setRolePermissions(DRUPAL_AUTHENTICATED_RID, TRUE, FALSE);
+    $this->setRolePermissions($this->admin_role);
+    $this->checkCommentAccess('Admin user has search permission and no access comments permission, but comments should be indexed because admin user inherits authenticated user\'s permission to access comments', TRUE);
+
+    // Verify that search content permission is inherited from the authenticated
+    // role.
+    $this->setRolePermissions(DRUPAL_AUTHENTICATED_RID, TRUE, TRUE);
+    $this->setRolePermissions($this->admin_role, TRUE, FALSE);
+    $this->checkCommentAccess('Admin user has access comments permission and no search permission, but comments should be indexed because admin user inherits authenticated user\'s permission to search', TRUE);
+
+  }
+
+  /**
+   * Set permissions for role.
+   */
+  function setRolePermissions($rid, $access_comments = FALSE, $search_content = TRUE) {
+    $permissions = array(
+      'access comments' => $access_comments,
+      'search content' => $search_content,
+    );
+    user_role_change_permissions($rid, $permissions);
+  }
+
+  /**
+   * Update search index and search for comment.
+   */
+  function checkCommentAccess($message, $assume_access = FALSE) {
+    // Invoke search index update.
+    search_touch_node($this->node->nid);
+    $this->cronRun();
+
+    // Search for the comment subject.
+    $edit = array(
+      'search_block_form' => "'" . $this->comment_subject . "'",
+    );
+    $this->drupalPost('', $edit, t('Search'));
+    $method = $assume_access ? 'assertText' : 'assertNoText';
+    $verb = $assume_access ? 'found' : 'not found';
+    $this->{$method}($this->node->title, "Node $verb in search results: " . $message);
+    $this->{$method}($this->comment_subject, "Comment subject $verb in search results: " . $message);
+  }
+
+  /**
+   * Verify that 'add new comment' does not appear in search results or index.
+   */
+  function testAddNewComment() {
+    // Create a node with a short body.
+    $settings = array(
+      'type' => 'article',
+      'title' => 'short title',
+      'body' => array(LANGUAGE_NONE => array(array('value' => 'short body text'))),
+    );
+
+    $user = $this->drupalCreateUser(array('search content', 'create article content', 'access content'));
+    $this->drupalLogin($user);
+
+    $node = $this->drupalCreateNode($settings);
+    // Verify that if you view the node on its own page, 'add new comment'
+    // is there.
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText(t('Add new comment'), 'Add new comment appears on node page');
+
+    // Run cron to index this page.
+    $this->drupalLogout();
+    $this->cronRun();
+
+    // Search for 'comment'. Should be no results.
+    $this->drupalLogin($user);
+    $this->drupalPost('search/node', array('keys' => 'comment'), t('Search'));
+    $this->assertText(t('Your search yielded no results'), 'No results searching for the word comment');
+
+    // Search for the node title. Should be found, and 'Add new comment' should
+    // not be part of the search snippet.
+    $this->drupalPost('search/node', array('keys' => 'short'), t('Search'));
+    $this->assertText($node->title, 'Search for keyword worked');
+    $this->assertNoText(t('Add new comment'), 'Add new comment does not appear on search results page');
+  }
+
+}
+
+/**
+ * Tests search_expression_insert() and search_expression_extract().
+ *
+ * @see http://drupal.org/node/419388 (issue)
+ */
+class SearchExpressionInsertExtractTestCase extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Search expression insert/extract',
+      'description' => 'Tests the functions search_expression_insert() and search_expression_extract()',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    drupal_load('module', 'search');
+    parent::setUp();
+  }
+
+  /**
+   * Tests search_expression_insert() and search_expression_extract().
+   */
+  function testInsertExtract() {
+    $base_expression = "mykeyword";
+    // Build an array of option, value, what should be in the expression, what
+    // should be retrieved from expression.
+    $cases = array(
+      array('foo', 'bar', 'foo:bar', 'bar'), // Normal case.
+      array('foo', NULL, '', NULL), // Empty value: shouldn't insert.
+      array('foo', ' ', 'foo:', ''), // Space as value: should insert but retrieve empty string.
+      array('foo', '', 'foo:', ''), // Empty string as value: should insert but retrieve empty string.
+      array('foo', '0', 'foo:0', '0'), // String zero as value: should insert.
+      array('foo', 0, 'foo:0', '0'), // Numeric zero as value: should insert.
+    );
+
+    foreach ($cases as $index => $case) {
+      $after_insert = search_expression_insert($base_expression, $case[0], $case[1]);
+      if (empty($case[2])) {
+        $this->assertEqual($after_insert, $base_expression, "Empty insert does not change expression in case $index");
+      }
+      else {
+        $this->assertEqual($after_insert, $base_expression . ' ' . $case[2], "Insert added correct expression for case $index");
+      }
+
+      $retrieved = search_expression_extract($after_insert, $case[0]);
+      if (!isset($case[3])) {
+        $this->assertFalse(isset($retrieved), "Empty retrieval results in unset value in case $index");
+      }
+      else {
+        $this->assertEqual($retrieved, $case[3], "Value is retrieved for case $index");
+      }
+
+      $after_clear = search_expression_insert($after_insert, $case[0]);
+      $this->assertEqual(trim($after_clear), $base_expression, "After clearing, base expression is restored for case $index");
+
+      $cleared = search_expression_extract($after_clear, $case[0]);
+      $this->assertFalse(isset($cleared), "After clearing, value could not be retrieved for case $index");
+    }
+  }
+}
+
+/**
+ * Tests that comment count display toggles properly on comment status of node
+ *
+ * Issue 537278
+ *
+ * - Nodes with comment status set to Open should always how comment counts
+ * - Nodes with comment status set to Closed should show comment counts
+ *     only when there are comments
+ * - Nodes with comment status set to Hidden should never show comment counts
+ */
+class SearchCommentCountToggleTestCase extends DrupalWebTestCase {
+  protected $searching_user;
+  protected $searchable_nodes;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Comment count toggle',
+      'description' => 'Verify that comment count display toggles properly on comment status of node.',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search');
+
+    // Create searching user.
+    $this->searching_user = $this->drupalCreateUser(array('search content', 'access content', 'access comments', 'skip comment approval'));
+
+    // Create initial nodes.
+    $node_params = array('type' => 'article', 'body' => array(LANGUAGE_NONE => array(array('value' => 'SearchCommentToggleTestCase'))));
+
+    $this->searchable_nodes['1 comment'] = $this->drupalCreateNode($node_params);
+    $this->searchable_nodes['0 comments'] = $this->drupalCreateNode($node_params);
+
+    // Login with sufficient privileges.
+    $this->drupalLogin($this->searching_user);
+
+    // Create a comment array
+    $edit_comment = array();
+    $edit_comment['subject'] = $this->randomName();
+    $edit_comment['comment_body[' . LANGUAGE_NONE . '][0][value]'] = $this->randomName();
+    $filtered_html_format_id = 'filtered_html';
+    $edit_comment['comment_body[' . LANGUAGE_NONE . '][0][format]'] = $filtered_html_format_id;
+
+    // Post comment to the test node with comment
+    $this->drupalPost('comment/reply/' . $this->searchable_nodes['1 comment']->nid, $edit_comment, t('Save'));
+
+    // First update the index. This does the initial processing.
+    node_update_index();
+
+    // Then, run the shutdown function. Testing is a unique case where indexing
+    // and searching has to happen in the same request, so running the shutdown
+    // function manually is needed to finish the indexing process.
+    search_update_totals();
+  }
+
+  /**
+   * Verify that comment count display toggles properly on comment status of node
+   */
+  function testSearchCommentCountToggle() {
+    // Search for the nodes by string in the node body.
+    $edit = array(
+      'search_block_form' => "'SearchCommentToggleTestCase'",
+    );
+
+    // Test comment count display for nodes with comment status set to Open
+    $this->drupalPost('', $edit, t('Search'));
+    $this->assertText(t('0 comments'), 'Empty comment count displays for nodes with comment status set to Open');
+    $this->assertText(t('1 comment'), 'Non-empty comment count displays for nodes with comment status set to Open');
+
+    // Test comment count display for nodes with comment status set to Closed
+    $this->searchable_nodes['0 comments']->comment = COMMENT_NODE_CLOSED;
+    node_save($this->searchable_nodes['0 comments']);
+    $this->searchable_nodes['1 comment']->comment = COMMENT_NODE_CLOSED;
+    node_save($this->searchable_nodes['1 comment']);
+
+    $this->drupalPost('', $edit, t('Search'));
+    $this->assertNoText(t('0 comments'), 'Empty comment count does not display for nodes with comment status set to Closed');
+    $this->assertText(t('1 comment'), 'Non-empty comment count displays for nodes with comment status set to Closed');
+
+    // Test comment count display for nodes with comment status set to Hidden
+    $this->searchable_nodes['0 comments']->comment = COMMENT_NODE_HIDDEN;
+    node_save($this->searchable_nodes['0 comments']);
+    $this->searchable_nodes['1 comment']->comment = COMMENT_NODE_HIDDEN;
+    node_save($this->searchable_nodes['1 comment']);
+
+    $this->drupalPost('', $edit, t('Search'));
+    $this->assertNoText(t('0 comments'), 'Empty comment count does not display for nodes with comment status set to Hidden');
+    $this->assertNoText(t('1 comment'), 'Non-empty comment count does not display for nodes with comment status set to Hidden');
+  }
+}
+
+/**
+ * Test search_simplify() on every Unicode character, and some other cases.
+ */
+class SearchSimplifyTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Search simplify',
+      'description' => 'Check that the search_simply() function works as intended.',
+      'group' => 'Search',
+    );
+  }
+
+  /**
+   * Tests that all Unicode characters simplify correctly.
+   */
+  function testSearchSimplifyUnicode() {
+    // This test uses a file that was constructed so that the even lines are
+    // boundary characters, and the odd lines are valid word characters. (It
+    // was generated as a sequence of all the Unicode characters, and then the
+    // boundary chararacters (punctuation, spaces, etc.) were split off into
+    // their own lines).  So the even-numbered lines should simplify to nothing,
+    // and the odd-numbered lines we need to split into shorter chunks and
+    // verify that simplification doesn't lose any characters.
+    $input = file_get_contents(DRUPAL_ROOT . '/modules/search/tests/UnicodeTest.txt');
+    $basestrings = explode(chr(10), $input);
+    $strings = array();
+    foreach ($basestrings as $key => $string) {
+      if ($key %2) {
+        // Even line - should simplify down to a space.
+        $simplified = search_simplify($string);
+        $this->assertIdentical($simplified, ' ', "Line $key is excluded from the index");
+      }
+      else {
+        // Odd line, should be word characters.
+        // Split this into 30-character chunks, so we don't run into limits
+        // of truncation in search_simplify().
+        $start = 0;
+        while ($start < drupal_strlen($string)) {
+          $newstr = drupal_substr($string, $start, 30);
+          // Special case: leading zeros are removed from numeric strings,
+          // and there's one string in this file that is numbers starting with
+          // zero, so prepend a 1 on that string.
+          if (preg_match('/^[0-9]+$/', $newstr)) {
+            $newstr = '1' . $newstr;
+          }
+          $strings[] = $newstr;
+          $start += 30;
+        }
+      }
+    }
+    foreach ($strings as $key => $string) {
+      $simplified = search_simplify($string);
+      $this->assertTrue(drupal_strlen($simplified) >= drupal_strlen($string), "Nothing is removed from string $key.");
+    }
+
+    // Test the low-numbered ASCII control characters separately. They are not
+    // in the text file because they are problematic for diff, especially \0.
+    $string = '';
+    for ($i = 0; $i < 32; $i++) {
+      $string .= chr($i);
+    }
+    $this->assertIdentical(' ', search_simplify($string), 'Search simplify works for ASCII control characters.');
+  }
+
+  /**
+   * Tests that search_simplify() does the right thing with punctuation.
+   */
+  function testSearchSimplifyPunctuation() {
+    $cases = array(
+      array('20.03/94-28,876', '20039428876', 'Punctuation removed from numbers'),
+      array('great...drupal--module', 'great drupal module', 'Multiple dot and dashes are word boundaries'),
+      array('very_great-drupal.module', 'verygreatdrupalmodule', 'Single dot, dash, underscore are removed'),
+      array('regular,punctuation;word', 'regular punctuation word', 'Punctuation is a word boundary'),
+    );
+
+    foreach ($cases as $case) {
+      $out = trim(search_simplify($case[0]));
+      $this->assertEqual($out, $case[1], $case[2]);
+    }
+  }
+}
+
+
+/**
+ * Tests keywords and conditions.
+ */
+class SearchKeywordsConditions extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Keywords and conditions',
+      'description' => 'Verify the search pulls in keywords and extra conditions.',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search', 'search_extra_type');
+    // Create searching user.
+    $this->searching_user = $this->drupalCreateUser(array('search content', 'access content', 'access comments', 'skip comment approval'));
+    // Login with sufficient privileges.
+    $this->drupalLogin($this->searching_user);
+    // Test with all search modules enabled.
+    variable_set('search_active_modules', array('node' => 'node', 'user' => 'user', 'search_extra_type' => 'search_extra_type'));
+    menu_rebuild();
+  }
+
+  /**
+   * Verify the kewords are captured and conditions respected.
+   */
+  function testSearchKeyswordsConditions() {
+    // No keys, not conditions - no results.
+    $this->drupalGet('search/dummy_path');
+    $this->assertNoText('Dummy search snippet to display');
+    // With keys - get results.
+    $keys = 'bike shed ' . $this->randomName();
+    $this->drupalGet("search/dummy_path/{$keys}");
+    $this->assertText("Dummy search snippet to display. Keywords: {$keys}");
+    $keys = 'blue drop ' . $this->randomName();
+    $this->drupalGet("search/dummy_path", array('query' => array('keys' => $keys)));
+    $this->assertText("Dummy search snippet to display. Keywords: {$keys}");
+    // Add some conditions and keys.
+    $keys = 'moving drop ' . $this->randomName();
+    $this->drupalGet("search/dummy_path/bike", array('query' => array('search_conditions' => $keys)));
+    $this->assertText("Dummy search snippet to display.");
+    $this->assertRaw(print_r(array('search_conditions' => $keys), TRUE));
+    // Add some conditions and no keys.
+    $keys = 'drop kick ' . $this->randomName();
+    $this->drupalGet("search/dummy_path", array('query' => array('search_conditions' => $keys)));
+    $this->assertText("Dummy search snippet to display.");
+    $this->assertRaw(print_r(array('search_conditions' => $keys), TRUE));
+  }
+}
+
+/**
+ * Tests that numbers can be searched.
+ */
+class SearchNumbersTestCase extends DrupalWebTestCase {
+  protected $test_user;
+  protected $numbers;
+  protected $nodes;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Search numbers',
+      'description' => 'Check that numbers can be searched',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search');
+
+    $this->test_user = $this->drupalCreateUser(array('search content', 'access content', 'administer nodes', 'access site reports'));
+    $this->drupalLogin($this->test_user);
+
+    // Create content with various numbers in it.
+    // Note: 50 characters is the current limit of the search index's word
+    // field.
+    $this->numbers = array(
+      'ISBN' => '978-0446365383',
+      'UPC' => '036000 291452',
+      'EAN bar code' => '5901234123457',
+      'negative' => '-123456.7890',
+      'quoted negative' => '"-123456.7890"',
+      'leading zero' => '0777777777',
+      'tiny' => '111',
+      'small' => '22222222222222',
+      'medium' => '333333333333333333333333333',
+      'large' => '444444444444444444444444444444444444444',
+      'gigantic' => '5555555555555555555555555555555555555555555555555',
+      'over fifty characters' => '666666666666666666666666666666666666666666666666666666666666',
+      'date', '01/02/2009',
+      'commas', '987,654,321',
+    );
+
+    foreach ($this->numbers as $doc => $num) {
+      $info = array(
+        'body' => array(LANGUAGE_NONE => array(array('value' => $num))),
+        'type' => 'page',
+        'language' => LANGUAGE_NONE,
+        'title' => $doc . ' number',
+      );
+      $this->nodes[$doc] = $this->drupalCreateNode($info);
+    }
+
+    // Run cron to ensure the content is indexed.
+    $this->cronRun();
+    $this->drupalGet('admin/reports/dblog');
+    $this->assertText(t('Cron run completed'), 'Log shows cron run completed');
+  }
+
+  /**
+   * Tests that all the numbers can be searched.
+   */
+  function testNumberSearching() {
+    $types = array_keys($this->numbers);
+
+    foreach ($types as $type) {
+      $number = $this->numbers[$type];
+      // If the number is negative, remove the - sign, because - indicates
+      // "not keyword" when searching.
+      $number = ltrim($number, '-');
+      $node = $this->nodes[$type];
+
+      // Verify that the node title does not appear on the search page
+      // with a dummy search.
+      $this->drupalPost('search/node',
+        array('keys' => 'foo'),
+        t('Search'));
+      $this->assertNoText($node->title, $type . ': node title not shown in dummy search');
+
+      // Verify that the node title does appear as a link on the search page
+      // when searching for the number.
+      $this->drupalPost('search/node',
+        array('keys' => $number),
+        t('Search'));
+      $this->assertText($node->title, format_string('%type: node title shown (search found the node) in search for number %number.', array('%type' => $type, '%number' => $number)));
+    }
+  }
+}
+
+/**
+ * Tests that numbers can be searched, with more complex matching.
+ */
+class SearchNumberMatchingTestCase extends DrupalWebTestCase {
+  protected $test_user;
+  protected $numbers;
+  protected $nodes;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Search number matching',
+      'description' => 'Check that numbers can be searched with more complex matching',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search');
+
+    $this->test_user = $this->drupalCreateUser(array('search content', 'access content', 'administer nodes', 'access site reports'));
+    $this->drupalLogin($this->test_user);
+
+    // Define a group of numbers that should all match each other --
+    // numbers with internal punctuation should match each other, as well
+    // as numbers with and without leading zeros and leading/trailing
+    // . and -.
+    $this->numbers = array(
+      '123456789',
+      '12/34/56789',
+      '12.3456789',
+      '12-34-56789',
+      '123,456,789',
+      '-123456789',
+      '0123456789',
+    );
+
+    foreach ($this->numbers as $num) {
+      $info = array(
+        'body' => array(LANGUAGE_NONE => array(array('value' => $num))),
+        'type' => 'page',
+        'language' => LANGUAGE_NONE,
+      );
+      $this->nodes[] = $this->drupalCreateNode($info);
+    }
+
+    // Run cron to ensure the content is indexed.
+    $this->cronRun();
+    $this->drupalGet('admin/reports/dblog');
+    $this->assertText(t('Cron run completed'), 'Log shows cron run completed');
+  }
+
+  /**
+   * Tests that all the numbers can be searched.
+   */
+  function testNumberSearching() {
+    for ($i = 0; $i < count($this->numbers); $i++) {
+      $node = $this->nodes[$i];
+
+      // Verify that the node title does not appear on the search page
+      // with a dummy search.
+      $this->drupalPost('search/node',
+        array('keys' => 'foo'),
+        t('Search'));
+      $this->assertNoText($node->title, format_string('%number: node title not shown in dummy search', array('%number' => $i)));
+
+      // Now verify that we can find node i by searching for any of the
+      // numbers.
+      for ($j = 0; $j < count($this->numbers); $j++) {
+        $number = $this->numbers[$j];
+        // If the number is negative, remove the - sign, because - indicates
+        // "not keyword" when searching.
+        $number = ltrim($number, '-');
+
+        $this->drupalPost('search/node',
+          array('keys' => $number),
+          t('Search'));
+        $this->assertText($node->title, format_string('%i: node title shown (search found the node) in search for number %number', array('%i' => $i, '%number' => $number)));
+      }
+    }
+
+  }
+}
+
+/**
+ * Test config page.
+ */
+class SearchConfigSettingsForm extends DrupalWebTestCase {
+  public $search_user;
+  public $search_node;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Config settings form',
+      'description' => 'Verify the search config settings form.',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search', 'search_extra_type');
+
+    // Login as a user that can create and search content.
+    $this->search_user = $this->drupalCreateUser(array('search content', 'administer search', 'administer nodes', 'bypass node access', 'access user profiles', 'administer users', 'administer blocks'));
+    $this->drupalLogin($this->search_user);
+
+    // Add a single piece of content and index it.
+    $node = $this->drupalCreateNode();
+    $this->search_node = $node;
+    // Link the node to itself to test that it's only indexed once. The content
+    // also needs the word "pizza" so we can use it as the search keyword.
+    $langcode = LANGUAGE_NONE;
+    $body_key = "body[$langcode][0][value]";
+    $edit[$body_key] = l($node->title, 'node/' . $node->nid) . ' pizza sandwich';
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    node_update_index();
+    search_update_totals();
+
+    // Enable the search block.
+    $edit = array();
+    $edit['blocks[search_form][region]'] = 'content';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+  }
+
+  /**
+   * Verify the search settings form.
+   */
+  function testSearchSettingsPage() {
+
+    // Test that the settings form displays the correct count of items left to index.
+    $this->drupalGet('admin/config/search/settings');
+    $this->assertText(t('There are @count items left to index.', array('@count' => 0)));
+
+    // Test the re-index button.
+    $this->drupalPost('admin/config/search/settings', array(), t('Re-index site'));
+    $this->assertText(t('Are you sure you want to re-index the site'));
+    $this->drupalPost('admin/config/search/settings/reindex', array(), t('Re-index site'));
+    $this->assertText(t('The index will be rebuilt'));
+    $this->drupalGet('admin/config/search/settings');
+    $this->assertText(t('There is 1 item left to index.'));
+
+    // Test that the form saves with the default values.
+    $this->drupalPost('admin/config/search/settings', array(), t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'Form saves with the default values.');
+
+    // Test that the form does not save with an invalid word length.
+    $edit = array(
+      'minimum_word_size' => $this->randomName(3),
+    );
+    $this->drupalPost('admin/config/search/settings', $edit, t('Save configuration'));
+    $this->assertNoText(t('The configuration options have been saved.'), 'Form does not save with an invalid word length.');
+  }
+
+  /**
+   * Verify that you can disable individual search modules.
+   */
+  function testSearchModuleDisabling() {
+    // Array of search modules to test: 'path' is the search path, 'title' is
+    // the tab title, 'keys' are the keywords to search for, and 'text' is
+    // the text to assert is on the results page.
+    $module_info = array(
+      'node' => array(
+        'path' => 'node',
+        'title' => 'Content',
+        'keys' => 'pizza',
+        'text' => $this->search_node->title,
+      ),
+      'user' => array(
+        'path' => 'user',
+        'title' => 'User',
+        'keys' => $this->search_user->name,
+        'text' => $this->search_user->mail,
+      ),
+      'search_extra_type' => array(
+        'path' => 'dummy_path',
+        'title' => 'Dummy search type',
+        'keys' => 'foo',
+        'text' => 'Dummy search snippet to display',
+      ),
+    );
+    $modules = array_keys($module_info);
+
+    // Test each module if it's enabled as the only search module.
+    foreach ($modules as $module) {
+      // Enable the one module and disable other ones.
+      $info = $module_info[$module];
+      $edit = array();
+      foreach ($modules as $other) {
+        $edit['search_active_modules[' . $other . ']'] = (($other == $module) ? $module : FALSE);
+      }
+      $edit['search_default_module'] = $module;
+      $this->drupalPost('admin/config/search/settings', $edit, t('Save configuration'));
+
+      // Run a search from the correct search URL.
+      $this->drupalGet('search/' . $info['path'] . '/' . $info['keys']);
+      $this->assertNoText('no results', $info['title'] . ' search found results');
+      $this->assertText($info['text'], 'Correct search text found');
+
+      // Verify that other module search tab titles are not visible.
+      foreach ($modules as $other) {
+        if ($other != $module) {
+          $title = $module_info[$other]['title'];
+          $this->assertNoText($title, $title . ' search tab is not shown');
+        }
+      }
+
+      // Run a search from the search block on the node page. Verify you get
+      // to this module's search results page.
+      $terms = array('search_block_form' => $info['keys']);
+      $this->drupalPost('node', $terms, t('Search'));
+      $this->assertEqual(
+        $this->getURL(),
+        url('search/' . $info['path'] . '/' . $info['keys'], array('absolute' => TRUE)),
+        'Block redirected to right search page');
+
+      // Try an invalid search path. Should redirect to our active module.
+      $this->drupalGet('search/not_a_module_path');
+      $this->assertEqual(
+        $this->getURL(),
+        url('search/' . $info['path'], array('absolute' => TRUE)),
+        'Invalid search path redirected to default search page');
+    }
+
+    // Test with all search modules enabled. When you go to the search
+    // page or run search, all modules should be shown.
+    $edit = array();
+    foreach ($modules as $module) {
+      $edit['search_active_modules[' . $module . ']'] = $module;
+    }
+    $edit['search_default_module'] = 'node';
+
+    $this->drupalPost('admin/config/search/settings', $edit, t('Save configuration'));
+
+    foreach (array('search/node/pizza', 'search/node') as $path) {
+      $this->drupalGet($path);
+      foreach ($modules as $module) {
+        $title = $module_info[$module]['title'];
+        $this->assertText($title, format_string('%title search tab is shown', array('%title' => $title)));
+      }
+    }
+  }
+}
+
+/**
+ * Tests the search_excerpt() function.
+ */
+class SearchExcerptTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Search excerpt extraction',
+      'description' => 'Tests that the search_excerpt() function works.',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search');
+  }
+
+  /**
+   * Tests search_excerpt() with several simulated search keywords.
+   *
+   * Passes keywords and a sample marked up string, "The quick
+   * brown fox jumps over the lazy dog", and compares it to the
+   * correctly marked up string. The correctly marked up string
+   * contains either highlighted keywords or the original marked
+   * up string if no keywords matched the string.
+   */
+  function testSearchExcerpt() {
+    // Make some text with entities and tags.
+    $text = 'The <strong>quick</strong> <a href="#">brown</a> fox &amp; jumps <h2>over</h2> the lazy dog';
+    // Note: The search_excerpt() function adds some extra spaces -- not
+    // important for HTML formatting. Remove these for comparison.
+    $expected = 'The quick brown fox &amp; jumps over the lazy dog';
+    $result = preg_replace('| +|', ' ', search_excerpt('nothing', $text));
+    $this->assertEqual(preg_replace('| +|', ' ', $result), $expected, 'Entire string is returned when keyword is not found in short string');
+
+    $result = preg_replace('| +|', ' ', search_excerpt('fox', $text));
+    $this->assertEqual($result, 'The quick brown <strong>fox</strong> &amp; jumps over the lazy dog ...', 'Found keyword is highlighted');
+
+    $longtext = str_repeat($text . ' ', 10);
+    $result = preg_replace('| +|', ' ', search_excerpt('nothing', $longtext));
+    $this->assertTrue(strpos($result, $expected) === 0, 'When keyword is not found in long string, return value starts as expected');
+
+    $entities = str_repeat('k&eacute;sz&iacute;t&eacute;se ', 20);
+    $result = preg_replace('| +|', ' ', search_excerpt('nothing', $entities));
+    $this->assertFalse(strpos($result, '&'), 'Entities are not present in excerpt');
+    $this->assertTrue(strpos($result, 'í') > 0, 'Entities are converted in excerpt');
+
+    // The node body that will produce this rendered $text is:
+    // 123456789 HTMLTest +123456789+&lsquo;  +&lsquo;  +&lsquo;  +&lsquo;  +12345678  &nbsp;&nbsp;  +&lsquo;  +&lsquo;  +&lsquo;   &lsquo;
+    $text = "<div class=\"field field-name-body field-type-text-with-summary field-label-hidden\"><div class=\"field-items\"><div class=\"field-item even\" property=\"content:encoded\"><p>123456789 HTMLTest +123456789+‘  +‘  +‘  +‘  +12345678      +‘  +‘  +‘   ‘</p>\n</div></div></div> ";
+    $result = search_excerpt('HTMLTest', $text);
+    $this->assertFalse(empty($result),  'Rendered Multi-byte HTML encodings are not corrupted in search excerpts');
+  }
+
+  /**
+   * Tests search_excerpt() with search keywords matching simplified words.
+   *
+   * Excerpting should handle keywords that are matched only after going through
+   * search_simplify(). This test passes keywords that match simplified words
+   * and compares them with strings that contain the original unsimplified word.
+   */
+  function testSearchExcerptSimplified() {
+    $lorem1 = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam vitae arcu at leo cursus laoreet. Curabitur dui tortor, adipiscing malesuada tempor in, bibendum ac diam. Cras non tellus a libero pellentesque condimentum. What is a Drupalism? Suspendisse ac lacus libero. Ut non est vel nisl faucibus interdum nec sed leo. Pellentesque sem risus, vulputate eu semper eget, auctor in libero.';
+    $lorem2 = 'Ut fermentum est vitae metus convallis scelerisque. Phasellus pellentesque rhoncus tellus, eu dignissim purus posuere id. Quisque eu fringilla ligula. Morbi ullamcorper, lorem et mattis egestas, tortor neque pretium velit, eget eleifend odio turpis eu purus. Donec vitae metus quis leo pretium tincidunt a pulvinar sem. Morbi adipiscing laoreet mauris vel placerat. Nullam elementum, nisl sit amet scelerisque malesuada, dolor nunc hendrerit quam, eu ultrices erat est in orci.';
+
+    // Make some text with some keywords that will get simplified.
+    $text = $lorem1 . ' Number: 123456.7890 Hyphenated: one-two abc,def ' . $lorem2;
+    // Note: The search_excerpt() function adds some extra spaces -- not
+    // important for HTML formatting. Remove these for comparison.
+    $result = preg_replace('| +|', ' ', search_excerpt('123456.7890', $text));
+    $this->assertTrue(strpos($result, 'Number: <strong>123456.7890</strong>') !== FALSE, 'Numeric keyword is highlighted with exact match');
+
+    $result = preg_replace('| +|', ' ', search_excerpt('1234567890', $text));
+    $this->assertTrue(strpos($result, 'Number: <strong>123456.7890</strong>') !== FALSE, 'Numeric keyword is highlighted with simplified match');
+
+    $result = preg_replace('| +|', ' ', search_excerpt('Number 1234567890', $text));
+    $this->assertTrue(strpos($result, '<strong>Number</strong>: <strong>123456.7890</strong>') !== FALSE, 'Punctuated and numeric keyword is highlighted with simplified match');
+
+    $result = preg_replace('| +|', ' ', search_excerpt('"Number 1234567890"', $text));
+    $this->assertTrue(strpos($result, '<strong>Number: 123456.7890</strong>') !== FALSE, 'Phrase with punctuated and numeric keyword is highlighted with simplified match');
+
+    $result = preg_replace('| +|', ' ', search_excerpt('"Hyphenated onetwo"', $text));
+    $this->assertTrue(strpos($result, '<strong>Hyphenated: one-two</strong>') !== FALSE, 'Phrase with punctuated and hyphenated keyword is highlighted with simplified match');
+
+    $result = preg_replace('| +|', ' ', search_excerpt('"abc def"', $text));
+    $this->assertTrue(strpos($result, '<strong>abc,def</strong>') !== FALSE, 'Phrase with keyword simplified into two separate words is highlighted with simplified match');
+
+    // Test phrases with characters which are being truncated.
+    $result = preg_replace('| +|', ' ', search_excerpt('"ipsum _"', $text));
+    $this->assertTrue(strpos($result, '<strong>ipsum </strong>') !== FALSE, 'Only valid part of the phrase is highlighted and invalid part containing "_" is ignored.');
+
+    $result = preg_replace('| +|', ' ', search_excerpt('"ipsum 0000"', $text));
+    $this->assertTrue(strpos($result, '<strong>ipsum </strong>') !== FALSE, 'Only valid part of the phrase is highlighted and invalid part "0000" is ignored.');
+
+    // Test combination of the valid keyword and keyword containing only
+    // characters which are being truncated during simplification.
+    $result = preg_replace('| +|', ' ', search_excerpt('ipsum _', $text));
+    $this->assertTrue(strpos($result, '<strong>ipsum</strong>') !== FALSE, 'Only valid keyword is highlighted and invalid keyword "_" is ignored.');
+
+    $result = preg_replace('| +|', ' ', search_excerpt('ipsum 0000', $text));
+    $this->assertTrue(strpos($result, '<strong>ipsum</strong>') !== FALSE, 'Only valid keyword is highlighted and invalid keyword "0000" is ignored.');
+  }
+}
+
+/**
+ * Test the CJK tokenizer.
+ */
+class SearchTokenizerTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'CJK tokenizer',
+      'description' => 'Check that CJK tokenizer works as intended.',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search');
+  }
+
+  /**
+   * Verifies that strings of CJK characters are tokenized.
+   *
+   * The search_simplify() function does special things with numbers, symbols,
+   * and punctuation. So we only test that CJK characters that are not in these
+   * character classes are tokenized properly. See PREG_CLASS_CKJ for more
+   * information.
+   */
+  function testTokenizer() {
+    // Set the minimum word size to 1 (to split all CJK characters) and make
+    // sure CJK tokenizing is turned on.
+    variable_set('minimum_word_size', 1);
+    variable_set('overlap_cjk', TRUE);
+    $this->refreshVariables();
+
+    // Create a string of CJK characters from various character ranges in
+    // the Unicode tables.
+
+    // Beginnings of the character ranges.
+    $starts = array(
+      'CJK unified' => 0x4e00,
+      'CJK Ext A' => 0x3400,
+      'CJK Compat' => 0xf900,
+      'Hangul Jamo' => 0x1100,
+      'Hangul Ext A' => 0xa960,
+      'Hangul Ext B' => 0xd7b0,
+      'Hangul Compat' => 0x3131,
+      'Half non-punct 1' => 0xff21,
+      'Half non-punct 2' => 0xff41,
+      'Half non-punct 3' => 0xff66,
+      'Hangul Syllables' => 0xac00,
+      'Hiragana' => 0x3040,
+      'Katakana' => 0x30a1,
+      'Katakana Ext' => 0x31f0,
+      'CJK Reserve 1' => 0x20000,
+      'CJK Reserve 2' => 0x30000,
+      'Bomofo' => 0x3100,
+      'Bomofo Ext' => 0x31a0,
+      'Lisu' => 0xa4d0,
+      'Yi' => 0xa000,
+    );
+
+    // Ends of the character ranges.
+    $ends = array(
+      'CJK unified' => 0x9fcf,
+      'CJK Ext A' => 0x4dbf,
+      'CJK Compat' => 0xfaff,
+      'Hangul Jamo' => 0x11ff,
+      'Hangul Ext A' => 0xa97f,
+      'Hangul Ext B' => 0xd7ff,
+      'Hangul Compat' => 0x318e,
+      'Half non-punct 1' => 0xff3a,
+      'Half non-punct 2' => 0xff5a,
+      'Half non-punct 3' => 0xffdc,
+      'Hangul Syllables' => 0xd7af,
+      'Hiragana' => 0x309f,
+      'Katakana' => 0x30ff,
+      'Katakana Ext' => 0x31ff,
+      'CJK Reserve 1' => 0x2fffd,
+      'CJK Reserve 2' => 0x3fffd,
+      'Bomofo' => 0x312f,
+      'Bomofo Ext' => 0x31b7,
+      'Lisu' => 0xa4fd,
+      'Yi' => 0xa48f,
+    );
+
+    // Generate characters consisting of starts, midpoints, and ends.
+    $chars = array();
+    $charcodes = array();
+    foreach ($starts as $key => $value) {
+      $charcodes[] = $starts[$key];
+      $chars[] = $this->code2utf($starts[$key]);
+      $mid = round(0.5 * ($starts[$key] + $ends[$key]));
+      $charcodes[] = $mid;
+      $chars[] = $this->code2utf($mid);
+      $charcodes[] = $ends[$key];
+      $chars[] = $this->code2utf($ends[$key]);
+    }
+
+    // Merge into a string and tokenize.
+    $string = implode('', $chars);
+    $out = trim(search_simplify($string));
+    $expected = drupal_strtolower(implode(' ', $chars));
+
+    // Verify that the output matches what we expect.
+    $this->assertEqual($out, $expected, 'CJK tokenizer worked on all supplied CJK characters');
+  }
+
+  /**
+   * Verifies that strings of non-CJK characters are not tokenized.
+   *
+   * This is just a sanity check - it verifies that strings of letters are
+   * not tokenized.
+   */
+  function testNoTokenizer() {
+    // Set the minimum word size to 1 (to split all CJK characters) and make
+    // sure CJK tokenizing is turned on.
+    variable_set('minimum_word_size', 1);
+    variable_set('overlap_cjk', TRUE);
+    $this->refreshVariables();
+
+    $letters = 'abcdefghijklmnopqrstuvwxyz';
+    $out = trim(search_simplify($letters));
+
+    $this->assertEqual($letters, $out, 'Letters are not CJK tokenized');
+  }
+
+  /**
+   * Like PHP chr() function, but for unicode characters.
+   *
+   * chr() only works for ASCII characters up to character 255. This function
+   * converts a number to the corresponding unicode character. Adapted from
+   * functions supplied in comments on several functions on php.net.
+   */
+  function code2utf($num) {
+    if ($num < 128) {
+      return chr($num);
+    }
+
+    if ($num < 2048) {
+      return chr(($num >> 6) + 192) . chr(($num & 63) + 128);
+    }
+
+    if ($num < 65536) {
+      return chr(($num >> 12) + 224) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128);
+    }
+
+    if ($num < 2097152) {
+      return chr(($num >> 18) + 240) . chr((($num >> 12) & 63) + 128) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128);
+    }
+
+    return '';
+  }
+}
+
+/**
+ * Tests that we can embed a form in search results and submit it.
+ */
+class SearchEmbedForm extends DrupalWebTestCase {
+  /**
+   * Node used for testing.
+   */
+  public $node;
+
+  /**
+   * Count of how many times the form has been submitted.
+   */
+  public $submit_count = 0;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Embedded forms',
+      'description' => 'Verifies that a form embedded in search results works',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search', 'search_embedded_form');
+
+    // Create a user and a node, and update the search index.
+    $test_user = $this->drupalCreateUser(array('access content', 'search content', 'administer nodes'));
+    $this->drupalLogin($test_user);
+
+    $this->node = $this->drupalCreateNode();
+
+    node_update_index();
+    search_update_totals();
+
+    // Set up a dummy initial count of times the form has been submitted.
+    $this->submit_count = 12;
+    variable_set('search_embedded_form_submitted', $this->submit_count);
+    $this->refreshVariables();
+  }
+
+  /**
+   * Tests that the embedded form appears and can be submitted.
+   */
+  function testEmbeddedForm() {
+    // First verify we can submit the form from the module's page.
+    $this->drupalPost('search_embedded_form',
+      array('name' => 'John'),
+      t('Send away'));
+    $this->assertText(t('Test form was submitted'), 'Form message appears');
+    $count = variable_get('search_embedded_form_submitted', 0);
+    $this->assertEqual($this->submit_count + 1, $count, 'Form submission count is correct');
+    $this->submit_count = $count;
+
+    // Now verify that we can see and submit the form from the search results.
+    $this->drupalGet('search/node/' . $this->node->title);
+    $this->assertText(t('Your name'), 'Form is visible');
+    $this->drupalPost('search/node/' . $this->node->title,
+      array('name' => 'John'),
+      t('Send away'));
+    $this->assertText(t('Test form was submitted'), 'Form message appears');
+    $count = variable_get('search_embedded_form_submitted', 0);
+    $this->assertEqual($this->submit_count + 1, $count, 'Form submission count is correct');
+    $this->submit_count = $count;
+
+    // Now verify that if we submit the search form, it doesn't count as
+    // our form being submitted.
+    $this->drupalPost('search',
+      array('keys' => 'foo'),
+      t('Search'));
+    $this->assertNoText(t('Test form was submitted'), 'Form message does not appear');
+    $count = variable_get('search_embedded_form_submitted', 0);
+    $this->assertEqual($this->submit_count, $count, 'Form submission count is correct');
+    $this->submit_count = $count;
+  }
+}
+
+/**
+ * Tests that hook_search_page runs.
+ */
+class SearchPageOverride extends DrupalWebTestCase {
+  public $search_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Search page override',
+      'description' => 'Verify that hook_search_page can override search page display.',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search', 'search_extra_type');
+
+    // Login as a user that can create and search content.
+    $this->search_user = $this->drupalCreateUser(array('search content', 'administer search'));
+    $this->drupalLogin($this->search_user);
+
+    // Enable the extra type module for searching.
+    variable_set('search_active_modules', array('node' => 'node', 'user' => 'user', 'search_extra_type' => 'search_extra_type'));
+    menu_rebuild();
+  }
+
+  function testSearchPageHook() {
+    $keys = 'bike shed ' . $this->randomName();
+    $this->drupalGet("search/dummy_path/{$keys}");
+    $this->assertText('Dummy search snippet', 'Dummy search snippet is shown');
+    $this->assertText('Test page text is here', 'Page override is working');
+  }
+}
+
+/**
+ * Test node search with multiple languages.
+ */
+class SearchLanguageTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Search language selection',
+      'description' => 'Tests advanced search with different languages enabled.',
+      'group' => 'Search',
+    );
+  }
+
+  /**
+   * Implementation setUp().
+   */
+  function setUp() {
+    parent::setUp('search', 'locale');
+
+    // Create and login user.
+    $test_user = $this->drupalCreateUser(array('access content', 'search content', 'use advanced search', 'administer nodes', 'administer languages', 'access administration pages'));
+    $this->drupalLogin($test_user);
+  }
+
+  function testLanguages() {
+    // Check that there are initially no languages displayed.
+    $this->drupalGet('search/node');
+    $this->assertNoText(t('Languages'), 'No languages to choose from.');
+
+    // Add predefined language.
+    $edit = array('langcode' => 'fr');
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+    $this->assertText('fr', 'Language added successfully.');
+
+    // Now we should have languages displayed.
+    $this->drupalGet('search/node');
+    $this->assertText(t('Languages'), 'Languages displayed to choose from.');
+    $this->assertText(t('English'), 'English is a possible choice.');
+    $this->assertText(t('French'), 'French is a possible choice.');
+
+    // Ensure selecting no language does not make the query different.
+    $this->drupalPost('search/node', array(), t('Advanced search'));
+    $this->assertEqual($this->getUrl(), url('search/node/', array('absolute' => TRUE)), 'Correct page redirection, no language filtering.');
+
+    // Pick French and ensure it is selected.
+    $edit = array('language[fr]' => TRUE);
+    $this->drupalPost('search/node', $edit, t('Advanced search'));
+    $this->assertFieldByXPath('//input[@name="keys"]', 'language:fr', 'Language filter added to query.');
+
+    // Change the default language and disable English.
+    $path = 'admin/config/regional/language';
+    $this->drupalGet($path);
+    $this->assertFieldChecked('edit-site-default-en', 'English is the default language.');
+    $edit = array('site_default' => 'fr');
+    $this->drupalPost(NULL, $edit, t('Save configuration'));
+    $this->assertNoFieldChecked('edit-site-default-en', 'Default language updated.');
+    $edit = array('enabled[en]' => FALSE);
+    $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
+    $this->assertNoFieldChecked('edit-enabled-en', 'Language disabled.');
+
+    // Check that there are again no languages displayed.
+    $this->drupalGet('search/node');
+    $this->assertNoText(t('Languages'), 'No languages to choose from.');
+  }
+}
+
+/**
+ * Tests node search with node access control.
+ */
+class SearchNodeAccessTest extends DrupalWebTestCase {
+  public $test_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Search and node access',
+      'description' => 'Tests search functionality with node access control.',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search', 'node_access_test');
+    node_access_rebuild();
+
+    // Create a test user and log in.
+    $this->test_user = $this->drupalCreateUser(array('access content', 'search content', 'use advanced search'));
+    $this->drupalLogin($this->test_user);
+  }
+
+  /**
+   * Tests that search returns results with punctuation in the search phrase.
+   */
+  function testPhraseSearchPunctuation() {
+    $node = $this->drupalCreateNode(array('body' => array(LANGUAGE_NONE => array(array('value' => "The bunny's ears were fuzzy.")))));
+
+    // Update the search index.
+    module_invoke_all('update_index');
+    search_update_totals();
+
+    // Refresh variables after the treatment.
+    $this->refreshVariables();
+
+    // Submit a phrase wrapped in double quotes to include the punctuation.
+    $edit = array('keys' => '"bunny\'s"');
+    $this->drupalPost('search/node', $edit, t('Search'));
+    $this->assertText($node->title);
+  }
+}
+
+/**
+ * Tests searching with locale values set.
+ */
+class SearchSetLocaleTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Search with numeric locale set',
+      'description' => 'Check that search works with numeric locale settings',
+      'group' => 'Search',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('search');
+
+    // Create a simple node so something will be put in the index.
+    $info = array(
+      'body' => array(LANGUAGE_NONE => array(array('value' => 'Tapir'))),
+    );
+    $this->drupalCreateNode($info);
+
+    // Run cron to index.
+    $this->cronRun();
+  }
+
+  /**
+   * Verify that search works with a numeric locale set.
+   */
+  public function testSearchWithNumericLocale() {
+    // French decimal point is comma.
+    setlocale(LC_NUMERIC, 'fr_FR');
+
+    // An exception will be thrown if a float in the wrong format occurs in the
+    // query to the database, so an assertion is not necessary here.
+    db_select('search_index', 'i')
+      ->extend('searchquery')
+      ->searchexpression('tapir', 'node')
+      ->execute();
+  }
+}
diff --git a/htmltest/modules/search/tests/UnicodeTest.txt b/htmltest/modules/search/tests/UnicodeTest.txt
new file mode 100644
index 00000000..af8a65c7
--- /dev/null
+++ b/htmltest/modules/search/tests/UnicodeTest.txt
@@ -0,0 +1,333 @@
+
+ !"#$%&'()*+,-./
+0123456789
+:;<=>?@
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+[\]^_`
+abcdefghijklmnopqrstuvwxyz
+{|}~ ¡¢£¤¥¦§¨©
+ª
+«¬­®¯°±
+²³
+´
+µ
+¶·¸
+¹º
+»
+¼½¾
+¿
+ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ
+×
+ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö
+÷
+øùúûüýþÿĀāĂăĄąĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıĲĳĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňŉŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſƀƁƂƃƄƅƆƇƈƉƊƋƌƍƎƏƐƑƒƓƔƕƖƗƘƙƚƛƜƝƞƟƠơƢƣƤƥƦƧƨƩƪƫƬƭƮƯưƱƲƳƴƵƶƷƸƹƺƻƼƽƾƿǀǁǂǃǄǅǆǇǈǉǊǋǌǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰǱǲǳǴǵǶǷǸǹǺǻǼǽǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘșȚțȜȝȞȟȠȡȢȣȤȥȦȧȨȩȪȫȬȭȮȯȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿɀɁɂɃɄɅɆɇɈɉɊɋɌɍɎɏɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯʰʱʲʳʴʵʶʷʸʹʺʻʼʽʾʿˀˁ
+˂˃˄˅
+ˆˇˈˉˊˋˌˍˎˏːˑ
+˒˓˔˕˖˗˘˙˚˛˜˝˞˟
+ˠˡˢˣˤ
+˥˦˧˨˩˪˫
+ˬ
+˭
+ˮ
+˯˰˱˲˳˴˵˶˷˸˹˺˻˼˽˾˿
+̴̵̶̷̸̡̢̧̨̛̖̗̘̙̜̝̞̟̠̣̤̥̦̩̪̫̬̭̮̯̰̱̲̳̹̺̻̼͇͈͉͍͎̀́̂̃̄̅̆̇̈̉̊̋̌̍̎̏̐̑̒̓̔̽̾̿̀́͂̓̈́͆͊͋͌̕̚ͅ͏͓͔͕͖͙͚͐͑͒͗͛ͣͤͥͦͧͨͩͪͫͬͭͮͯ͘͜͟͢͝͞͠͡ͰͱͲͳʹ
+͵
+Ͷͷͺͻͼͽ
+;΄΅
+Ά
+·
+ΈΉΊΌΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϏϐϑϒϓϔϕϖϗϘϙϚϛϜϝϞϟϠϡϢϣϤϥϦϧϨϩϪϫϬϭϮϯϰϱϲϳϴϵ
+϶
+ϷϸϹϺϻϼϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿҀҁ
+҂
+҃҄҅҆҇҈҉ҊҋҌҍҎҏҐґҒғҔҕҖҗҘҙҚқҜҝҞҟҠҡҢңҤҥҦҧҨҩҪҫҬҭҮүҰұҲҳҴҵҶҷҸҹҺһҼҽҾҿӀӁӂӃӄӅӆӇӈӉӊӋӌӍӎӏӐӑӒӓӔӕӖӗӘәӚӛӜӝӞӟӠӡӢӣӤӥӦӧӨөӪӫӬӭӮӯӰӱӲӳӴӵӶӷӸӹӺӻӼӽӾӿԀԁԂԃԄԅԆԇԈԉԊԋԌԍԎԏԐԑԒԓԔԕԖԗԘԙԚԛԜԝԞԟԠԡԢԣԤԥԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖՙ
+՚՛՜՝՞՟
+աբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆև
+։֊
+ְֱֲֳִֵֶַָֹֺֻּֽ֑֖֛֢֣֤֥֦֧֪֚֭֮֒֓֔֕֗֘֙֜֝֞֟֠֡֨֩֫֬֯
+־
+ֿ
+׀
+ׁׂ
+׃
+ׅׄ
+׆
+ׇאבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ
+׳״؀؁؂؃؆؇؈؉؊؋،؍؎؏
+ؘؙؚؐؑؒؓؔؕؖؗ
+؛؞؟
+ءآأؤإئابةتثجحخدذرزسشصضطظعغػؼؽؾؿـفقكلمنهوىيًٌٍَُِّْٕٖٜٓٔٗ٘ٙٚٛٝٞ٠١٢٣٤٥٦٧٨٩
+٪٫٬٭
+ٮٯٰٱٲٳٴٵٶٷٸٹٺٻټٽپٿڀځڂڃڄڅچڇڈډڊڋڌڍڎڏڐڑڒړڔڕږڗژڙښڛڜڝڞڟڠڡڢڣڤڥڦڧڨکڪګڬڭڮگڰڱڲڳڴڵڶڷڸڹںڻڼڽھڿۀہۂۃۄۅۆۇۈۉۊۋیۍێۏېۑےۓ
+۔
+ەۖۗۘۙۚۛۜ
+۝
+۞ۣ۟۠ۡۢۤۥۦۧۨ
+۩
+۪ۭ۫۬ۮۯ۰۱۲۳۴۵۶۷۸۹ۺۻۼ
+۽۾
+ۿ
+܀܁܂܃܄܅܆܇܈܉܊܋܌܍܏
+ܐܑܒܓܔܕܖܗܘܙܚܛܜܝܞܟܠܡܢܣܤܥܦܧܨܩܪܫܬܭܮܯܱܴܷܸܹܻܼܾ݂݄݆݈ܰܲܳܵܶܺܽܿ݀݁݃݅݇݉݊ݍݎݏݐݑݒݓݔݕݖݗݘݙݚݛݜݝݞݟݠݡݢݣݤݥݦݧݨݩݪݫݬݭݮݯݰݱݲݳݴݵݶݷݸݹݺݻݼݽݾݿހށނރބޅކއވމފދތލގޏސޑޒޓޔޕޖޗޘޙޚޛޜޝޞޟޠޡޢޣޤޥަާިީުޫެޭޮޯްޱ߀߁߂߃߄߅߆߇߈߉ߊߋߌߍߎߏߐߑߒߓߔߕߖߗߘߙߚߛߜߝߞߟߠߡߢߣߤߥߦߧߨߩߪ߲߫߬߭߮߯߰߱߳ߴߵ
+߶߷߸߹
+ߺࠀࠁࠂࠃࠄࠅࠆࠇࠈࠉࠊࠋࠌࠍࠎࠏࠐࠑࠒࠓࠔࠕࠖࠗ࠘࠙ࠚࠛࠜࠝࠞࠟࠠࠡࠢࠣࠤࠥࠦࠧࠨࠩࠪࠫࠬ࠭
+࠰࠱࠲࠳࠴࠵࠶࠷࠸࠹࠺࠻࠼࠽࠾
+ऀँंःऄअआइईउऊऋऌऍऎएऐऑऒओऔकखगघङचछजझञटठडढणतथदधनऩपफबभमयरऱलळऴवशषसह़ऽािीुूृॄॅॆेैॉॊोौ्ॎॐ॒॑॓॔ॕक़ख़ग़ज़ड़ढ़फ़य़ॠॡॢॣ
+।॥
+०१२३४५६७८९
+॰
+ॱॲॹॺॻॼॽॾॿঁংঃঅআইঈউঊঋঌএঐওঔকখগঘঙচছজঝঞটঠডঢণতথদধনপফবভমযরলশষসহ়ঽািীুূৃৄেৈোৌ্ৎৗড়ঢ়য়ৠৡৢৣ০১২৩৪৫৬৭৮৯ৰৱ
+৲৳
+৴৵৶৷৸৹
+৺৻
+ਁਂਃਅਆਇਈਉਊਏਐਓਔਕਖਗਘਙਚਛਜਝਞਟਠਡਢਣਤਥਦਧਨਪਫਬਭਮਯਰਲਲ਼ਵਸ਼ਸਹ਼ਾਿੀੁੂੇੈੋੌ੍ੑਖ਼ਗ਼ਜ਼ੜਫ਼੦੧੨੩੪੫੬੭੮੯ੰੱੲੳੴੵઁંઃઅઆઇઈઉઊઋઌઍએઐઑઓઔકખગઘઙચછજઝઞટઠડઢણતથદધનપફબભમયરલળવશષસહ઼ઽાિીુૂૃૄૅેૈૉોૌ્ૐૠૡૢૣ૦૧૨૩૪૫૬૭૮૯
+૱
+ଁଂଃଅଆଇଈଉଊଋଌଏଐଓଔକଖଗଘଙଚଛଜଝଞଟଠଡଢଣତଥଦଧନପଫବଭମଯରଲଳଵଶଷସହ଼ଽାିୀୁୂୃୄେୈୋୌ୍ୖୗଡ଼ଢ଼ୟୠୡୢୣ୦୧୨୩୪୫୬୭୮୯
+୰
+ୱஂஃஅஆஇஈஉஊஎஏஐஒஓஔகஙசஜஞடணதநனபமயரறலளழவஶஷஸஹாிீுூெேைொோௌ்ௐௗ௦௧௨௩௪௫௬௭௮௯௰௱௲
+௳௴௵௶௷௸௹௺
+ఁంఃఅఆఇఈఉఊఋఌఎఏఐఒఓఔకఖగఘఙచఛజఝఞటఠడఢణతథదధనపఫబభమయరఱలళవశషసహఽాిీుూృౄెేైొోౌ్ౕౖౘౙౠౡౢౣ౦౧౨౩౪౫౬౭౮౯౸౹౺౻౼౽౾
+౿
+ಂಃಅಆಇಈಉಊಋಌಎಏಐಒಓಔಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಱಲಳವಶಷಸಹ಼ಽಾಿೀುೂೃೄೆೇೈೊೋೌ್ೕೖೞೠೡೢೣ೦೧೨೩೪೫೬೭೮೯
+ೱೲ
+ംഃഅആഇഈഉഊഋഌഎഏഐഒഓഔകഖഗഘങചഛജഝഞടഠഡഢണതഥദധനപഫബഭമയരറലളഴവശഷസഹഽാിീുൂൃൄെേൈൊോൌ്ൗൠൡൢൣ൦൧൨൩൪൫൬൭൮൯൰൱൲൳൴൵
+൹
+ൺൻർൽൾൿංඃඅආඇඈඉඊඋඌඍඎඏඐඑඒඓඔඕඖකඛගඝඞඟචඡජඣඤඥඦටඨඩඪණඬතථදධනඳපඵබභමඹයරලවශෂසහළෆ්ාැෑිීුූෘෙේෛොෝෞෟෲෳ
+෴
+กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู
+฿
+เแโใไๅๆ็่้๊๋์ํ๎
+๏
+๐๑๒๓๔๕๖๗๘๙
+๚๛
+ກຂຄງຈຊຍດຕຖທນບປຜຝພຟມຢຣລວສຫອຮຯະັາຳິີຶືຸູົຼຽເແໂໃໄໆ່້໊໋໌ໍ໐໑໒໓໔໕໖໗໘໙ໜໝༀ
+༁༂༃༄༅༆༇༈༉༊་༌།༎༏༐༑༒༓༔༕༖༗
+༘༙
+༚༛༜༝༞༟
+༠༡༢༣༤༥༦༧༨༩༪༫༬༭༮༯༰༱༲༳
+༴
+༵
+༶
+༷
+༸
+༹
+༺༻༼༽
+༾༿ཀཁགགྷངཅཆཇཉཊཋཌཌྷཎཏཐདདྷནཔཕབབྷམཙཚཛཛྷཝཞཟའཡརལཤཥསཧཨཀྵཪཫཬཱཱཱིིུུྲྀཷླྀཹེཻོཽཾཿ྄ཱྀྀྂྃ
+྅
+྆྇ྈྉྊྋྐྑྒྒྷྔྕྖྗྙྚྛྜྜྷྞྟྠྡྡྷྣྤྥྦྦྷྨྩྪྫྫྷྭྮྯྰྱྲླྴྵྶྷྸྐྵྺྻྼ
+྾྿࿀࿁࿂࿃࿄࿅
+࿆
+࿇࿈࿉࿊࿋࿌࿎࿏࿐࿑࿒࿓࿔࿕࿖࿗࿘
+ကခဂဃငစဆဇဈဉညဋဌဍဎဏတထဒဓနပဖဗဘမယရလဝသဟဠအဢဣဤဥဦဧဨဩဪါာိီုူေဲဳဴဵံ့း္်ျြွှဿ၀၁၂၃၄၅၆၇၈၉
+၊။၌၍၎၏
+ၐၑၒၓၔၕၖၗၘၙၚၛၜၝၞၟၠၡၢၣၤၥၦၧၨၩၪၫၬၭၮၯၰၱၲၳၴၵၶၷၸၹၺၻၼၽၾၿႀႁႂႃႄႅႆႇႈႉႊႋႌႍႎႏ႐႑႒႓႔႕႖႗႘႙ႚႛႜႝ
+႞႟
+ႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅაბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶჷჸჹჺ
+჻
+ჼᄀᄁᄂᄃᄄᄅᄆᄇᄈᄉᄊᄋᄌᄍᄎᄏᄐᄑᄒᄓᄔᄕᄖᄗᄘᄙᄚᄛᄜᄝᄞᄟᄠᄡᄢᄣᄤᄥᄦᄧᄨᄩᄪᄫᄬᄭᄮᄯᄰᄱᄲᄳᄴᄵᄶᄷᄸᄹᄺᄻᄼᄽᄾᄿᅀᅁᅂᅃᅄᅅᅆᅇᅈᅉᅊᅋᅌᅍᅎᅏᅐᅑᅒᅓᅔᅕᅖᅗᅘᅙᅚᅛᅜᅝᅞᅟᅠᅡᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵᅶᅷᅸᅹᅺᅻᅼᅽᅾᅿᆀᆁᆂᆃᆄᆅᆆᆇᆈᆉᆊᆋᆌᆍᆎᆏᆐᆑᆒᆓᆔᆕᆖᆗᆘᆙᆚᆛᆜᆝᆞᆟᆠᆡᆢᆣᆤᆥᆦᆧᆨᆩᆪᆫᆬᆭᆮᆯᆰᆱᆲᆳᆴᆵᆶᆷᆸᆹᆺᆻᆼᆽᆾᆿᇀᇁᇂᇃᇄᇅᇆᇇᇈᇉᇊᇋᇌᇍᇎᇏᇐᇑᇒᇓᇔᇕᇖᇗᇘᇙᇚᇛᇜᇝᇞᇟᇠᇡᇢᇣᇤᇥᇦᇧᇨᇩᇪᇫᇬᇭᇮᇯᇰᇱᇲᇳᇴᇵᇶᇷᇸᇹᇺᇻᇼᇽᇾᇿሀሁሂሃሄህሆሇለሉሊላሌልሎሏሐሑሒሓሔሕሖሗመሙሚማሜምሞሟሠሡሢሣሤሥሦሧረሩሪራሬርሮሯሰሱሲሳሴስሶሷሸሹሺሻሼሽሾሿቀቁቂቃቄቅቆቇቈቊቋቌቍቐቑቒቓቔቕቖቘቚቛቜቝበቡቢባቤብቦቧቨቩቪቫቬቭቮቯተቱቲታቴትቶቷቸቹቺቻቼችቾቿኀኁኂኃኄኅኆኇኈኊኋኌኍነኑኒናኔንኖኗኘኙኚኛኜኝኞኟአኡኢኣኤእኦኧከኩኪካኬክኮኯኰኲኳኴኵኸኹኺኻኼኽኾዀዂዃዄዅወዉዊዋዌውዎዏዐዑዒዓዔዕዖዘዙዚዛዜዝዞዟዠዡዢዣዤዥዦዧየዩዪያዬይዮዯደዱዲዳዴድዶዷዸዹዺዻዼዽዾዿጀጁጂጃጄጅጆጇገጉጊጋጌግጎጏጐጒጓጔጕጘጙጚጛጜጝጞጟጠጡጢጣጤጥጦጧጨጩጪጫጬጭጮጯጰጱጲጳጴጵጶጷጸጹጺጻጼጽጾጿፀፁፂፃፄፅፆፇፈፉፊፋፌፍፎፏፐፑፒፓፔፕፖፗፘፙፚ፟
+፠፡።፣፤፥፦፧፨
+፩፪፫፬፭፮፯፰፱፲፳፴፵፶፷፸፹፺፻፼ᎀᎁᎂᎃᎄᎅᎆᎇᎈᎉᎊᎋᎌᎍᎎᎏ
+᎐᎑᎒᎓᎔᎕᎖᎗᎘᎙
+ᎠᎡᎢᎣᎤᎥᎦᎧᎨᎩᎪᎫᎬᎭᎮᎯᎰᎱᎲᎳᎴᎵᎶᎷᎸᎹᎺᎻᎼᎽᎾᎿᏀᏁᏂᏃᏄᏅᏆᏇᏈᏉᏊᏋᏌᏍᏎᏏᏐᏑᏒᏓᏔᏕᏖᏗᏘᏙᏚᏛᏜᏝᏞᏟᏠᏡᏢᏣᏤᏥᏦᏧᏨᏩᏪᏫᏬᏭᏮᏯᏰᏱᏲᏳᏴ
+᐀
+ᐁᐂᐃᐄᐅᐆᐇᐈᐉᐊᐋᐌᐍᐎᐏᐐᐑᐒᐓᐔᐕᐖᐗᐘᐙᐚᐛᐜᐝᐞᐟᐠᐡᐢᐣᐤᐥᐦᐧᐨᐩᐪᐫᐬᐭᐮᐯᐰᐱᐲᐳᐴᐵᐶᐷᐸᐹᐺᐻᐼᐽᐾᐿᑀᑁᑂᑃᑄᑅᑆᑇᑈᑉᑊᑋᑌᑍᑎᑏᑐᑑᑒᑓᑔᑕᑖᑗᑘᑙᑚᑛᑜᑝᑞᑟᑠᑡᑢᑣᑤᑥᑦᑧᑨᑩᑪᑫᑬᑭᑮᑯᑰᑱᑲᑳᑴᑵᑶᑷᑸᑹᑺᑻᑼᑽᑾᑿᒀᒁᒂᒃᒄᒅᒆᒇᒈᒉᒊᒋᒌᒍᒎᒏᒐᒑᒒᒓᒔᒕᒖᒗᒘᒙᒚᒛᒜᒝᒞᒟᒠᒡᒢᒣᒤᒥᒦᒧᒨᒩᒪᒫᒬᒭᒮᒯᒰᒱᒲᒳᒴᒵᒶᒷᒸᒹᒺᒻᒼᒽᒾᒿᓀᓁᓂᓃᓄᓅᓆᓇᓈᓉᓊᓋᓌᓍᓎᓏᓐᓑᓒᓓᓔᓕᓖᓗᓘᓙᓚᓛᓜᓝᓞᓟᓠᓡᓢᓣᓤᓥᓦᓧᓨᓩᓪᓫᓬᓭᓮᓯᓰᓱᓲᓳᓴᓵᓶᓷᓸᓹᓺᓻᓼᓽᓾᓿᔀᔁᔂᔃᔄᔅᔆᔇᔈᔉᔊᔋᔌᔍᔎᔏᔐᔑᔒᔓᔔᔕᔖᔗᔘᔙᔚᔛᔜᔝᔞᔟᔠᔡᔢᔣᔤᔥᔦᔧᔨᔩᔪᔫᔬᔭᔮᔯᔰᔱᔲᔳᔴᔵᔶᔷᔸᔹᔺᔻᔼᔽᔾᔿᕀᕁᕂᕃᕄᕅᕆᕇᕈᕉᕊᕋᕌᕍᕎᕏᕐᕑᕒᕓᕔᕕᕖᕗᕘᕙᕚᕛᕜᕝᕞᕟᕠᕡᕢᕣᕤᕥᕦᕧᕨᕩᕪᕫᕬᕭᕮᕯᕰᕱᕲᕳᕴᕵᕶᕷᕸᕹᕺᕻᕼᕽᕾᕿᖀᖁᖂᖃᖄᖅᖆᖇᖈᖉᖊᖋᖌᖍᖎᖏᖐᖑᖒᖓᖔᖕᖖᖗᖘᖙᖚᖛᖜᖝᖞᖟᖠᖡᖢᖣᖤᖥᖦᖧᖨᖩᖪᖫᖬᖭᖮᖯᖰᖱᖲᖳᖴᖵᖶᖷᖸᖹᖺᖻᖼᖽᖾᖿᗀᗁᗂᗃᗄᗅᗆᗇᗈᗉᗊᗋᗌᗍᗎᗏᗐᗑᗒᗓᗔᗕᗖᗗᗘᗙᗚᗛᗜᗝᗞᗟᗠᗡᗢᗣᗤᗥᗦᗧᗨᗩᗪᗫᗬᗭᗮᗯᗰᗱᗲᗳᗴᗵᗶᗷᗸᗹᗺᗻᗼᗽᗾᗿᘀᘁᘂᘃᘄᘅᘆᘇᘈᘉᘊᘋᘌᘍᘎᘏᘐᘑᘒᘓᘔᘕᘖᘗᘘᘙᘚᘛᘜᘝᘞᘟᘠᘡᘢᘣᘤᘥᘦᘧᘨᘩᘪᘫᘬᘭᘮᘯᘰᘱᘲᘳᘴᘵᘶᘷᘸᘹᘺᘻᘼᘽᘾᘿᙀᙁᙂᙃᙄᙅᙆᙇᙈᙉᙊᙋᙌᙍᙎᙏᙐᙑᙒᙓᙔᙕᙖᙗᙘᙙᙚᙛᙜᙝᙞᙟᙠᙡᙢᙣᙤᙥᙦᙧᙨᙩᙪᙫᙬ
+᙭᙮
+ᙯᙰᙱᙲᙳᙴᙵᙶᙷᙸᙹᙺᙻᙼᙽᙾᙿ
+ 
+ᚁᚂᚃᚄᚅᚆᚇᚈᚉᚊᚋᚌᚍᚎᚏᚐᚑᚒᚓᚔᚕᚖᚗᚘᚙᚚ
+᚛᚜
+ᚠᚡᚢᚣᚤᚥᚦᚧᚨᚩᚪᚫᚬᚭᚮᚯᚰᚱᚲᚳᚴᚵᚶᚷᚸᚹᚺᚻᚼᚽᚾᚿᛀᛁᛂᛃᛄᛅᛆᛇᛈᛉᛊᛋᛌᛍᛎᛏᛐᛑᛒᛓᛔᛕᛖᛗᛘᛙᛚᛛᛜᛝᛞᛟᛠᛡᛢᛣᛤᛥᛦᛧᛨᛩᛪ
+᛫᛬᛭
+ᛮᛯᛰᜀᜁᜂᜃᜄᜅᜆᜇᜈᜉᜊᜋᜌᜎᜏᜐᜑᜒᜓ᜔ᜠᜡᜢᜣᜤᜥᜦᜧᜨᜩᜪᜫᜬᜭᜮᜯᜰᜱᜲᜳ᜴
+᜵᜶
+ᝀᝁᝂᝃᝄᝅᝆᝇᝈᝉᝊᝋᝌᝍᝎᝏᝐᝑᝒᝓᝠᝡᝢᝣᝤᝥᝦᝧᝨᝩᝪᝫᝬᝮᝯᝰᝲᝳកខគឃងចឆជឈញដឋឌឍណតថទធនបផពភមយរលវឝឞសហឡអឣឤឥឦឧឨឩឪឫឬឭឮឯឰឱឲឳ
+឴឵
+ាិីឹឺុូួើឿៀេែៃោៅំះៈ៉៊់៌៍៎៏័៑្៓
+។៕៖
+ៗ
+៘៙៚៛
+ៜ៝០១២៣៤៥៦៧៨៩៰៱៲៳៴៵៶៷៸៹
+᠀᠁᠂᠃᠄᠅᠆᠇᠈᠉᠊
+᠋᠌᠍
+᠎
+᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙ᠠᠡᠢᠣᠤᠥᠦᠧᠨᠩᠪᠫᠬᠭᠮᠯᠰᠱᠲᠳᠴᠵᠶᠷᠸᠹᠺᠻᠼᠽᠾᠿᡀᡁᡂᡃᡄᡅᡆᡇᡈᡉᡊᡋᡌᡍᡎᡏᡐᡑᡒᡓᡔᡕᡖᡗᡘᡙᡚᡛᡜᡝᡞᡟᡠᡡᡢᡣᡤᡥᡦᡧᡨᡩᡪᡫᡬᡭᡮᡯᡰᡱᡲᡳᡴᡵᡶᡷᢀᢁᢂᢃᢄᢅᢆᢇᢈᢉᢊᢋᢌᢍᢎᢏᢐᢑᢒᢓᢔᢕᢖᢗᢘᢙᢚᢛᢜᢝᢞᢟᢠᢡᢢᢣᢤᢥᢦᢧᢨᢩᢪᢰᢱᢲᢳᢴᢵᢶᢷᢸᢹᢺᢻᢼᢽᢾᢿᣀᣁᣂᣃᣄᣅᣆᣇᣈᣉᣊᣋᣌᣍᣎᣏᣐᣑᣒᣓᣔᣕᣖᣗᣘᣙᣚᣛᣜᣝᣞᣟᣠᣡᣢᣣᣤᣥᣦᣧᣨᣩᣪᣫᣬᣭᣮᣯᣰᣱᣲᣳᣴᣵᤀᤁᤂᤃᤄᤅᤆᤇᤈᤉᤊᤋᤌᤍᤎᤏᤐᤑᤒᤓᤔᤕᤖᤗᤘᤙᤚᤛᤜᤠᤡᤢᤣᤤᤥᤦᤧᤨᤩᤪᤫᤰᤱᤲᤳᤴᤵᤶᤷᤸ᤻᤹᤺
+᥀᥄᥅
+᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏ᥐᥑᥒᥓᥔᥕᥖᥗᥘᥙᥚᥛᥜᥝᥞᥟᥠᥡᥢᥣᥤᥥᥦᥧᥨᥩᥪᥫᥬᥭᥰᥱᥲᥳᥴᦀᦁᦂᦃᦄᦅᦆᦇᦈᦉᦊᦋᦌᦍᦎᦏᦐᦑᦒᦓᦔᦕᦖᦗᦘᦙᦚᦛᦜᦝᦞᦟᦠᦡᦢᦣᦤᦥᦦᦧᦨᦩᦪᦫᦰᦱᦲᦳᦴᦵᦶᦷᦸᦹᦺᦻᦼᦽᦾᦿᧀᧁᧂᧃᧄᧅᧆᧇᧈᧉ᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙᧚
+᧞᧟᧠᧡᧢᧣᧤᧥᧦᧧᧨᧩᧪᧫᧬᧭᧮᧯᧰᧱᧲᧳᧴᧵᧶᧷᧸᧹᧺᧻᧼᧽᧾᧿
+ᨀᨁᨂᨃᨄᨅᨆᨇᨈᨉᨊᨋᨌᨍᨎᨏᨐᨑᨒᨓᨔᨕᨖᨘᨗᨙᨚᨛ
+᨞᨟
+ᨠᨡᨢᨣᨤᨥᨦᨧᨨᨩᨪᨫᨬᨭᨮᨯᨰᨱᨲᨳᨴᨵᨶᨷᨸᨹᨺᨻᨼᨽᨾᨿᩀᩁᩂᩃᩄᩅᩆᩇᩈᩉᩊᩋᩌᩍᩎᩏᩐᩑᩒᩓᩔᩕᩖᩗᩘᩙᩚᩛᩜᩝᩞ᩠ᩡᩢᩣᩤᩥᩦᩧᩨᩩᩪᩫᩬᩭᩮᩯᩰᩱᩲᩳᩴ᩿᩵᩶᩷᩸᩹᩺᩻᩼᪀᪁᪂᪃᪄᪅᪆᪇᪈᪉᪐᪑᪒᪓᪔᪕᪖᪗᪘᪙
+᪠᪡᪢᪣᪤᪥᪦
+ᪧ
+᪨᪩᪪᪫᪬᪭
+ᬀᬁᬂᬃᬄᬅᬆᬇᬈᬉᬊᬋᬌᬍᬎᬏᬐᬑᬒᬓᬔᬕᬖᬗᬘᬙᬚᬛᬜᬝᬞᬟᬠᬡᬢᬣᬤᬥᬦᬧᬨᬩᬪᬫᬬᬭᬮᬯᬰᬱᬲᬳ᬴ᬵᬶᬷᬸᬹᬺᬻᬼᬽᬾᬿᭀᭁᭂᭃ᭄ᭅᭆᭇᭈᭉᭊᭋ᭐᭑᭒᭓᭔᭕᭖᭗᭘᭙
+᭚᭛᭜᭝᭞᭟᭠᭡᭢᭣᭤᭥᭦᭧᭨᭩᭪
+᭬᭫᭭᭮᭯᭰᭱᭲᭳
+᭴᭵᭶᭷᭸᭹᭺᭻᭼
+ᮀᮁᮂᮃᮄᮅᮆᮇᮈᮉᮊᮋᮌᮍᮎᮏᮐᮑᮒᮓᮔᮕᮖᮗᮘᮙᮚᮛᮜᮝᮞᮟᮠᮡᮢᮣᮤᮥᮦᮧᮨᮩ᮪ᮮᮯ᮰᮱᮲᮳᮴᮵᮶᮷᮸᮹ᰀᰁᰂᰃᰄᰅᰆᰇᰈᰉᰊᰋᰌᰍᰎᰏᰐᰑᰒᰓᰔᰕᰖᰗᰘᰙᰚᰛᰜᰝᰞᰟᰠᰡᰢᰣᰤᰥᰦᰧᰨᰩᰪᰫᰬᰭᰮᰯᰰᰱᰲᰳᰴᰵᰶ᰷
+᰻᰼᰽᰾᰿
+᱀᱁᱂᱃᱄᱅᱆᱇᱈᱉ᱍᱎᱏ᱐᱑᱒᱓᱔᱕᱖᱗᱘᱙ᱚᱛᱜᱝᱞᱟᱠᱡᱢᱣᱤᱥᱦᱧᱨᱩᱪᱫᱬᱭᱮᱯᱰᱱᱲᱳᱴᱵᱶᱷᱸᱹᱺᱻᱼᱽ
+᱾᱿
+᳐᳑᳒
+᳓
+᳔᳕᳖᳗᳘᳙᳜᳝᳞᳟᳚᳛᳠᳡᳢᳣᳤᳥᳦᳧᳨ᳩᳪᳫᳬ᳭ᳮᳯᳰᳱᳲᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᴬᴭᴮᴯᴰᴱᴲᴳᴴᴵᴶᴷᴸᴹᴺᴻᴼᴽᴾᴿᵀᵁᵂᵃᵄᵅᵆᵇᵈᵉᵊᵋᵌᵍᵎᵏᵐᵑᵒᵓᵔᵕᵖᵗᵘᵙᵚᵛᵜᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵸᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚᶛᶜᶝᶞᶟᶠᶡᶢᶣᶤᶥᶦᶧᶨᶩᶪᶫᶬᶭᶮᶯᶰᶱᶲᶳᶴᶵᶶᶷᶸᶹᶺᶻᶼᶽᶾᶿ᷐᷎᷂᷊᷏᷽᷿᷀᷁᷃᷄᷅᷆᷇᷈᷉᷋᷌᷑᷒ᷓᷔᷕᷖᷗᷘᷙᷚᷛᷜᷝᷞᷟᷠᷡᷢᷣᷤᷥᷦ᷾᷍ḀḁḂḃḄḅḆḇḈḉḊḋḌḍḎḏḐḑḒḓḔḕḖḗḘḙḚḛḜḝḞḟḠḡḢḣḤḥḦḧḨḩḪḫḬḭḮḯḰḱḲḳḴḵḶḷḸḹḺḻḼḽḾḿṀṁṂṃṄṅṆṇṈṉṊṋṌṍṎṏṐṑṒṓṔṕṖṗṘṙṚṛṜṝṞṟṠṡṢṣṤṥṦṧṨṩṪṫṬṭṮṯṰṱṲṳṴṵṶṷṸṹṺṻṼṽṾṿẀẁẂẃẄẅẆẇẈẉẊẋẌẍẎẏẐẑẒẓẔẕẖẗẘẙẚẛẜẝẞẟẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮữỰựỲỳỴỵỶỷỸỹỺỻỼỽỾỿἀἁἂἃἄἅἆἇἈἉἊἋἌἍἎἏἐἑἒἓἔἕἘἙἚἛἜἝἠἡἢἣἤἥἦἧἨἩἪἫἬἭἮἯἰἱἲἳἴἵἶἷἸἹἺἻἼἽἾἿὀὁὂὃὄὅὈὉὊὋὌὍὐὑὒὓὔὕὖὗὙὛὝὟὠὡὢὣὤὥὦὧὨὩὪὫὬὭὮὯὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾈᾉᾊᾋᾌᾍᾎᾏᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾞᾟᾠᾡᾢᾣᾤᾥᾦᾧᾨᾩᾪᾫᾬᾭᾮᾯᾰᾱᾲᾳᾴᾶᾷᾸᾹᾺΆᾼ
+᾽
+ι
+᾿῀῁
+ῂῃῄῆῇῈΈῊΉῌ
+῍῎῏
+ῐῑῒΐῖῗῘῙῚΊ
+῝῞῟
+ῠῡῢΰῤῥῦῧῨῩῪΎῬ
+῭΅`
+ῲῳῴῶῷῸΌῺΏῼ
+´῾           ​‌‍‎‏‐‑‒–—―‖‗‘’‚‛“”„‟†‡•‣․‥…‧  ‪‫‬‭‮ ‰‱′″‴‵‶‷‸‹›※‼‽‾‿⁀⁁⁂⁃⁄⁅⁆⁇⁈⁉⁊⁋⁌⁍⁎⁏⁐⁑⁒⁓⁔⁕⁖⁗⁘⁙⁚⁛⁜⁝⁞ ⁠⁡⁢⁣⁤⁪⁫⁬⁭⁮⁯
+⁰ⁱ⁴⁵⁶⁷⁸⁹
+⁺⁻⁼⁽⁾
+ⁿ₀₁₂₃₄₅₆₇₈₉
+₊₋₌₍₎
+ₐₑₒₓₔ
+₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯₰₱₲₳₴₵₶₷₸
+⃒⃓⃘⃙⃚⃐⃑⃔⃕⃖⃗⃛⃜⃝⃞⃟⃠⃡⃢⃣⃤⃥⃦⃪⃫⃨⃬⃭⃮⃯⃧⃩⃰
+℀℁
+ℂ
+℃℄℅℆
+ℇ
+℈℉
+ℊℋℌℍℎℏℐℑℒℓ
+℔
+ℕ
+№℗℘
+ℙℚℛℜℝ
+℞℟℠℡™℣
+ℤ
+℥
+Ω
+℧
+ℨ
+℩
+KÅℬℭ
+℮
+ℯℰℱℲℳℴℵℶℷℸℹ
+℺℻
+ℼℽℾℿ
+⅀⅁⅂⅃⅄
+ⅅⅆⅇⅈⅉ
+⅊⅋⅌⅍
+ⅎ
+⅏
+⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿↀↁↂↃↄↅↆↇↈ↉
+←↑→↓↔↕↖↗↘↙↚↛↜↝↞↟↠↡↢↣↤↥↦↧↨↩↪↫↬↭↮↯↰↱↲↳↴↵↶↷↸↹↺↻↼↽↾↿⇀⇁⇂⇃⇄⇅⇆⇇⇈⇉⇊⇋⇌⇍⇎⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇚⇛⇜⇝⇞⇟⇠⇡⇢⇣⇤⇥⇦⇧⇨⇩⇪⇫⇬⇭⇮⇯⇰⇱⇲⇳⇴⇵⇶⇷⇸⇹⇺⇻⇼⇽⇾⇿∀∁∂∃∄∅∆∇∈∉∊∋∌∍∎∏∐∑−∓∔∕∖∗∘∙√∛∜∝∞∟∠∡∢∣∤∥∦∧∨∩∪∫∬∭∮∯∰∱∲∳∴∵∶∷∸∹∺∻∼∽∾∿≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≠≡≢≣≤≥≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊙⊚⊛⊜⊝⊞⊟⊠⊡⊢⊣⊤⊥⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷⊸⊹⊺⊻⊼⊽⊾⊿⋀⋁⋂⋃⋄⋅⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋔⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⌀⌁⌂⌃⌄⌅⌆⌇⌈⌉⌊⌋⌌⌍⌎⌏⌐⌑⌒⌓⌔⌕⌖⌗⌘⌙⌚⌛⌜⌝⌞⌟⌠⌡⌢⌣⌤⌥⌦⌧⌨〈〉⌫⌬⌭⌮⌯⌰⌱⌲⌳⌴⌵⌶⌷⌸⌹⌺⌻⌼⌽⌾⌿⍀⍁⍂⍃⍄⍅⍆⍇⍈⍉⍊⍋⍌⍍⍎⍏⍐⍑⍒⍓⍔⍕⍖⍗⍘⍙⍚⍛⍜⍝⍞⍟⍠⍡⍢⍣⍤⍥⍦⍧⍨⍩⍪⍫⍬⍭⍮⍯⍰⍱⍲⍳⍴⍵⍶⍷⍸⍹⍺⍻⍼⍽⍾⍿⎀⎁⎂⎃⎄⎅⎆⎇⎈⎉⎊⎋⎌⎍⎎⎏⎐⎑⎒⎓⎔⎕⎖⎗⎘⎙⎚⎛⎜⎝⎞⎟⎠⎡⎢⎣⎤⎥⎦⎧⎨⎩⎪⎫⎬⎭⎮⎯⎰⎱⎲⎳⎴⎵⎶⎷⎸⎹⎺⎻⎼⎽⎾⎿⏀⏁⏂⏃⏄⏅⏆⏇⏈⏉⏊⏋⏌⏍⏎⏏⏐⏑⏒⏓⏔⏕⏖⏗⏘⏙⏚⏛⏜⏝⏞⏟⏠⏡⏢⏣⏤⏥⏦⏧⏨␀␁␂␃␄␅␆␇␈␉␊␋␌␍␎␏␐␑␒␓␔␕␖␗␘␙␚␛␜␝␞␟␠␡␢␣␤␥␦⑀⑁⑂⑃⑄⑅⑆⑇⑈⑉⑊
+①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛
+⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ
+⓪⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾⓿
+─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿◀◁◂◃◄◅◆◇◈◉◊○◌◍◎●◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿☀☁☂☃☄★☆☇☈☉☊☋☌☍☎☏☐☑☒☓☔☕☖☗☘☙☚☛☜☝☞☟☠☡☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☺☻☼☽☾☿♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♠♡♢♣♤♥♦♧♨♩♪♫♬♭♮♯♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓⚔⚕⚖⚗⚘⚙⚚⚛⚜⚝⚞⚟⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯⚰⚱⚲⚳⚴⚵⚶⚷⚸⚹⚺⚻⚼⚽⚾⚿⛀⛁⛂⛃⛄⛅⛆⛇⛈⛉⛊⛋⛌⛍⛏⛐⛑⛒⛓⛔⛕⛖⛗⛘⛙⛚⛛⛜⛝⛞⛟⛠⛡⛣⛨⛩⛪⛫⛬⛭⛮⛯⛰⛱⛲⛳⛴⛵⛶⛷⛸⛹⛺⛻⛼⛽⛾⛿✁✂✃✄✆✇✈✉✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡✢✣✤✥✦✧✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋❍❏❐❑❒❖❗❘❙❚❛❜❝❞❡❢❣❤❥❦❧❨❩❪❫❬❭❮❯❰❱❲❳❴❵
+❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓
+➔➘➙➚➛➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➱➲➳➴➵➶➷➸➹➺➻➼➽➾⟀⟁⟂⟃⟄⟅⟆⟇⟈⟉⟊⟌⟐⟑⟒⟓⟔⟕⟖⟗⟘⟙⟚⟛⟜⟝⟞⟟⟠⟡⟢⟣⟤⟥⟦⟧⟨⟩⟪⟫⟬⟭⟮⟯⟰⟱⟲⟳⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽⟾⟿⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿⡀⡁⡂⡃⡄⡅⡆⡇⡈⡉⡊⡋⡌⡍⡎⡏⡐⡑⡒⡓⡔⡕⡖⡗⡘⡙⡚⡛⡜⡝⡞⡟⡠⡡⡢⡣⡤⡥⡦⡧⡨⡩⡪⡫⡬⡭⡮⡯⡰⡱⡲⡳⡴⡵⡶⡷⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⢈⢉⢊⢋⢌⢍⢎⢏⢐⢑⢒⢓⢔⢕⢖⢗⢘⢙⢚⢛⢜⢝⢞⢟⢠⢡⢢⢣⢤⢥⢦⢧⢨⢩⢪⢫⢬⢭⢮⢯⢰⢱⢲⢳⢴⢵⢶⢷⢸⢹⢺⢻⢼⢽⢾⢿⣀⣁⣂⣃⣄⣅⣆⣇⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿⤀⤁⤂⤃⤄⤅⤆⤇⤈⤉⤊⤋⤌⤍⤎⤏⤐⤑⤒⤓⤔⤕⤖⤗⤘⤙⤚⤛⤜⤝⤞⤟⤠⤡⤢⤣⤤⤥⤦⤧⤨⤩⤪⤫⤬⤭⤮⤯⤰⤱⤲⤳⤴⤵⤶⤷⤸⤹⤺⤻⤼⤽⤾⤿⥀⥁⥂⥃⥄⥅⥆⥇⥈⥉⥊⥋⥌⥍⥎⥏⥐⥑⥒⥓⥔⥕⥖⥗⥘⥙⥚⥛⥜⥝⥞⥟⥠⥡⥢⥣⥤⥥⥦⥧⥨⥩⥪⥫⥬⥭⥮⥯⥰⥱⥲⥳⥴⥵⥶⥷⥸⥹⥺⥻⥼⥽⥾⥿⦀⦁⦂⦃⦄⦅⦆⦇⦈⦉⦊⦋⦌⦍⦎⦏⦐⦑⦒⦓⦔⦕⦖⦗⦘⦙⦚⦛⦜⦝⦞⦟⦠⦡⦢⦣⦤⦥⦦⦧⦨⦩⦪⦫⦬⦭⦮⦯⦰⦱⦲⦳⦴⦵⦶⦷⦸⦹⦺⦻⦼⦽⦾⦿⧀⧁⧂⧃⧄⧅⧆⧇⧈⧉⧊⧋⧌⧍⧎⧏⧐⧑⧒⧓⧔⧕⧖⧗⧘⧙⧚⧛⧜⧝⧞⧟⧠⧡⧢⧣⧤⧥⧦⧧⧨⧩⧪⧫⧬⧭⧮⧯⧰⧱⧲⧳⧴⧵⧶⧷⧸⧹⧺⧻⧼⧽⧾⧿⨀⨁⨂⨃⨄⨅⨆⨇⨈⨉⨊⨋⨌⨍⨎⨏⨐⨑⨒⨓⨔⨕⨖⨗⨘⨙⨚⨛⨜⨝⨞⨟⨠⨡⨢⨣⨤⨥⨦⨧⨨⨩⨪⨫⨬⨭⨮⨯⨰⨱⨲⨳⨴⨵⨶⨷⨸⨹⨺⨻⨼⨽⨾⨿⩀⩁⩂⩃⩄⩅⩆⩇⩈⩉⩊⩋⩌⩍⩎⩏⩐⩑⩒⩓⩔⩕⩖⩗⩘⩙⩚⩛⩜⩝⩞⩟⩠⩡⩢⩣⩤⩥⩦⩧⩨⩩⩪⩫⩬⩭⩮⩯⩰⩱⩲⩳⩴⩵⩶⩷⩸⩹⩺⩻⩼⩽⩾⩿⪀⪁⪂⪃⪄⪅⪆⪇⪈⪉⪊⪋⪌⪍⪎⪏⪐⪑⪒⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪝⪞⪟⪠⪡⪢⪣⪤⪥⪦⪧⪨⪩⪪⪫⪬⪭⪮⪯⪰⪱⪲⪳⪴⪵⪶⪷⪸⪹⪺⪻⪼⪽⪾⪿⫀⫁⫂⫃⫄⫅⫆⫇⫈⫉⫊⫋⫌⫍⫎⫏⫐⫑⫒⫓⫔⫕⫖⫗⫘⫙⫚⫛⫝̸⫝⫞⫟⫠⫡⫢⫣⫤⫥⫦⫧⫨⫩⫪⫫⫬⫭⫮⫯⫰⫱⫲⫳⫴⫵⫶⫷⫸⫹⫺⫻⫼⫽⫾⫿⬀⬁⬂⬃⬄⬅⬆⬇⬈⬉⬊⬋⬌⬍⬎⬏⬐⬑⬒⬓⬔⬕⬖⬗⬘⬙⬚⬛⬜⬝⬞⬟⬠⬡⬢⬣⬤⬥⬦⬧⬨⬩⬪⬫⬬⬭⬮⬯⬰⬱⬲⬳⬴⬵⬶⬷⬸⬹⬺⬻⬼⬽⬾⬿⭀⭁⭂⭃⭄⭅⭆⭇⭈⭉⭊⭋⭌⭐⭑⭒⭓⭔⭕⭖⭗⭘⭙
+ⰀⰁⰂⰃⰄⰅⰆⰇⰈⰉⰊⰋⰌⰍⰎⰏⰐⰑⰒⰓⰔⰕⰖⰗⰘⰙⰚⰛⰜⰝⰞⰟⰠⰡⰢⰣⰤⰥⰦⰧⰨⰩⰪⰫⰬⰭⰮⰰⰱⰲⰳⰴⰵⰶⰷⰸⰹⰺⰻⰼⰽⰾⰿⱀⱁⱂⱃⱄⱅⱆⱇⱈⱉⱊⱋⱌⱍⱎⱏⱐⱑⱒⱓⱔⱕⱖⱗⱘⱙⱚⱛⱜⱝⱞⱠⱡⱢⱣⱤⱥⱦⱧⱨⱩⱪⱫⱬⱭⱮⱯⱰⱱⱲⱳⱴⱵⱶⱷⱸⱹⱺⱻⱼⱽⱾⱿⲀⲁⲂⲃⲄⲅⲆⲇⲈⲉⲊⲋⲌⲍⲎⲏⲐⲑⲒⲓⲔⲕⲖⲗⲘⲙⲚⲛⲜⲝⲞⲟⲠⲡⲢⲣⲤⲥⲦⲧⲨⲩⲪⲫⲬⲭⲮⲯⲰⲱⲲⲳⲴⲵⲶⲷⲸⲹⲺⲻⲼⲽⲾⲿⳀⳁⳂⳃⳄⳅⳆⳇⳈⳉⳊⳋⳌⳍⳎⳏⳐⳑⳒⳓⳔⳕⳖⳗⳘⳙⳚⳛⳜⳝⳞⳟⳠⳡⳢⳣⳤ
+⳥⳦⳧⳨⳩⳪
+ⳫⳬⳭⳮ⳯⳰⳱
+⳹⳺⳻⳼
+⳽
+⳾⳿
+ⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡⴢⴣⴤⴥⴰⴱⴲⴳⴴⴵⴶⴷⴸⴹⴺⴻⴼⴽⴾⴿⵀⵁⵂⵃⵄⵅⵆⵇⵈⵉⵊⵋⵌⵍⵎⵏⵐⵑⵒⵓⵔⵕⵖⵗⵘⵙⵚⵛⵜⵝⵞⵟⵠⵡⵢⵣⵤⵥⵯⶀⶁⶂⶃⶄⶅⶆⶇⶈⶉⶊⶋⶌⶍⶎⶏⶐⶑⶒⶓⶔⶕⶖⶠⶡⶢⶣⶤⶥⶦⶨⶩⶪⶫⶬⶭⶮⶰⶱⶲⶳⶴⶵⶶⶸⶹⶺⶻⶼⶽⶾⷀⷁⷂⷃⷄⷅⷆⷈⷉⷊⷋⷌⷍⷎⷐⷑⷒⷓⷔⷕⷖⷘⷙⷚⷛⷜⷝⷞⷠⷡⷢⷣⷤⷥⷦⷧⷨⷩⷪⷫⷬⷭⷮⷯⷰⷱⷲⷳⷴⷵⷶⷷⷸⷹⷺⷻⷼⷽⷾⷿ
+⸀⸁⸂⸃⸄⸅⸆⸇⸈⸉⸊⸋⸌⸍⸎⸏⸐⸑⸒⸓⸔⸕⸖⸗⸘⸙⸚⸛⸜⸝⸞⸟⸠⸡⸢⸣⸤⸥⸦⸧⸨⸩⸪⸫⸬⸭⸮
+ⸯ
+⸰⸱⺀⺁⺂⺃⺄⺅⺆⺇⺈⺉⺊⺋⺌⺍⺎⺏⺐⺑⺒⺓⺔⺕⺖⺗⺘⺙⺛⺜⺝⺞⺟⺠⺡⺢⺣⺤⺥⺦⺧⺨⺩⺪⺫⺬⺭⺮⺯⺰⺱⺲⺳⺴⺵⺶⺷⺸⺹⺺⺻⺼⺽⺾⺿⻀⻁⻂⻃⻄⻅⻆⻇⻈⻉⻊⻋⻌⻍⻎⻏⻐⻑⻒⻓⻔⻕⻖⻗⻘⻙⻚⻛⻜⻝⻞⻟⻠⻡⻢⻣⻤⻥⻦⻧⻨⻩⻪⻫⻬⻭⻮⻯⻰⻱⻲⻳⼀⼁⼂⼃⼄⼅⼆⼇⼈⼉⼊⼋⼌⼍⼎⼏⼐⼑⼒⼓⼔⼕⼖⼗⼘⼙⼚⼛⼜⼝⼞⼟⼠⼡⼢⼣⼤⼥⼦⼧⼨⼩⼪⼫⼬⼭⼮⼯⼰⼱⼲⼳⼴⼵⼶⼷⼸⼹⼺⼻⼼⼽⼾⼿⽀⽁⽂⽃⽄⽅⽆⽇⽈⽉⽊⽋⽌⽍⽎⽏⽐⽑⽒⽓⽔⽕⽖⽗⽘⽙⽚⽛⽜⽝⽞⽟⽠⽡⽢⽣⽤⽥⽦⽧⽨⽩⽪⽫⽬⽭⽮⽯⽰⽱⽲⽳⽴⽵⽶⽷⽸⽹⽺⽻⽼⽽⽾⽿⾀⾁⾂⾃⾄⾅⾆⾇⾈⾉⾊⾋⾌⾍⾎⾏⾐⾑⾒⾓⾔⾕⾖⾗⾘⾙⾚⾛⾜⾝⾞⾟⾠⾡⾢⾣⾤⾥⾦⾧⾨⾩⾪⾫⾬⾭⾮⾯⾰⾱⾲⾳⾴⾵⾶⾷⾸⾹⾺⾻⾼⾽⾾⾿⿀⿁⿂⿃⿄⿅⿆⿇⿈⿉⿊⿋⿌⿍⿎⿏⿐⿑⿒⿓⿔⿕⿰⿱⿲⿳⿴⿵⿶⿷⿸⿹⿺⿻　、。〃〄
+々〆〇
+〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟〠
+〡〢〣〤〥〦〧〨〩〪〭〮〯〫〬
+〰
+〱〲〳〴〵
+〶〷
+〸〹〺〻〼
+〽〾〿
+ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖ゙゚
+゛゜
+ゝゞゟ
+゠
+ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ
+・
+ーヽヾヿㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩㄪㄫㄬㄭㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㅤㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ
+㆐㆑
+㆒㆓㆔㆕
+㆖㆗㆘㆙㆚㆛㆜㆝㆞㆟
+ㆠㆡㆢㆣㆤㆥㆦㆧㆨㆩㆪㆫㆬㆭㆮㆯㆰㆱㆲㆳㆴㆵㆶㆷ
+㇀㇁㇂㇃㇄㇅㇆㇇㇈㇉㇊㇋㇌㇍㇎㇏㇐㇑㇒㇓㇔㇕㇖㇗㇘㇙㇚㇛㇜㇝㇞㇟㇠㇡㇢㇣
+ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ
+㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛㈜㈝㈞
+㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩
+㈪㈫㈬㈭㈮㈯㈰㈱㈲㈳㈴㈵㈶㈷㈸㈹㈺㈻㈼㈽㈾㈿㉀㉁㉂㉃㉄㉅㉆㉇㉈㉉㉊㉋㉌㉍㉎㉏㉐
+㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟
+㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻㉼㉽㉾㉿
+㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉
+㊊㊋㊌㊍㊎㊏㊐㊑㊒㊓㊔㊕㊖㊗㊘㊙㊚㊛㊜㊝㊞㊟㊠㊡㊢㊣㊤㊥㊦㊧㊨㊩㊪㊫㊬㊭㊮㊯㊰
+㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿
+㋀㋁㋂㋃㋄㋅㋆㋇㋈㋉㋊㋋㋌㋍㋎㋏㋐㋑㋒㋓㋔㋕㋖㋗㋘㋙㋚㋛㋜㋝㋞㋟㋠㋡㋢㋣㋤㋥㋦㋧㋨㋩㋪㋫㋬㋭㋮㋯㋰㋱㋲㋳㋴㋵㋶㋷㋸㋹㋺㋻㋼㋽㋾㌀㌁㌂㌃㌄㌅㌆㌇㌈㌉㌊㌋㌌㌍㌎㌏㌐㌑㌒㌓㌔㌕㌖㌗㌘㌙㌚㌛㌜㌝㌞㌟㌠㌡㌢㌣㌤㌥㌦㌧㌨㌩㌪㌫㌬㌭㌮㌯㌰㌱㌲㌳㌴㌵㌶㌷㌸㌹㌺㌻㌼㌽㌾㌿㍀㍁㍂㍃㍄㍅㍆㍇㍈㍉㍊㍋㍌㍍㍎㍏㍐㍑㍒㍓㍔㍕㍖㍗㍘㍙㍚㍛㍜㍝㍞㍟㍠㍡㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㍱㍲㍳㍴㍵㍶㍷㍸㍹㍺㍻㍼㍽㍾㍿㎀㎁㎂㎃㎄㎅㎆㎇㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏋㏌㏍㏎㏏㏐㏑㏒㏓㏔㏕㏖㏗㏘㏙㏚㏛㏜㏝㏞㏟㏠㏡㏢㏣㏤㏥㏦㏧㏨㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽㏾㏿
+㐀䶵
+䷀䷁䷂䷃䷄䷅䷆䷇䷈䷉䷊䷋䷌䷍䷎䷏䷐䷑䷒䷓䷔䷕䷖䷗䷘䷙䷚䷛䷜䷝䷞䷟䷠䷡䷢䷣䷤䷥䷦䷧䷨䷩䷪䷫䷬䷭䷮䷯䷰䷱䷲䷳䷴䷵䷶䷷䷸䷹䷺䷻䷼䷽䷾䷿
+一鿋ꀀꀁꀂꀃꀄꀅꀆꀇꀈꀉꀊꀋꀌꀍꀎꀏꀐꀑꀒꀓꀔꀕꀖꀗꀘꀙꀚꀛꀜꀝꀞꀟꀠꀡꀢꀣꀤꀥꀦꀧꀨꀩꀪꀫꀬꀭꀮꀯꀰꀱꀲꀳꀴꀵꀶꀷꀸꀹꀺꀻꀼꀽꀾꀿꁀꁁꁂꁃꁄꁅꁆꁇꁈꁉꁊꁋꁌꁍꁎꁏꁐꁑꁒꁓꁔꁕꁖꁗꁘꁙꁚꁛꁜꁝꁞꁟꁠꁡꁢꁣꁤꁥꁦꁧꁨꁩꁪꁫꁬꁭꁮꁯꁰꁱꁲꁳꁴꁵꁶꁷꁸꁹꁺꁻꁼꁽꁾꁿꂀꂁꂂꂃꂄꂅꂆꂇꂈꂉꂊꂋꂌꂍꂎꂏꂐꂑꂒꂓꂔꂕꂖꂗꂘꂙꂚꂛꂜꂝꂞꂟꂠꂡꂢꂣꂤꂥꂦꂧꂨꂩꂪꂫꂬꂭꂮꂯꂰꂱꂲꂳꂴꂵꂶꂷꂸꂹꂺꂻꂼꂽꂾꂿꃀꃁꃂꃃꃄꃅꃆꃇꃈꃉꃊꃋꃌꃍꃎꃏꃐꃑꃒꃓꃔꃕꃖꃗꃘꃙꃚꃛꃜꃝꃞꃟꃠꃡꃢꃣꃤꃥꃦꃧꃨꃩꃪꃫꃬꃭꃮꃯꃰꃱꃲꃳꃴꃵꃶꃷꃸꃹꃺꃻꃼꃽꃾꃿꄀꄁꄂꄃꄄꄅꄆꄇꄈꄉꄊꄋꄌꄍꄎꄏꄐꄑꄒꄓꄔꄕꄖꄗꄘꄙꄚꄛꄜꄝꄞꄟꄠꄡꄢꄣꄤꄥꄦꄧꄨꄩꄪꄫꄬꄭꄮꄯꄰꄱꄲꄳꄴꄵꄶꄷꄸꄹꄺꄻꄼꄽꄾꄿꅀꅁꅂꅃꅄꅅꅆꅇꅈꅉꅊꅋꅌꅍꅎꅏꅐꅑꅒꅓꅔꅕꅖꅗꅘꅙꅚꅛꅜꅝꅞꅟꅠꅡꅢꅣꅤꅥꅦꅧꅨꅩꅪꅫꅬꅭꅮꅯꅰꅱꅲꅳꅴꅵꅶꅷꅸꅹꅺꅻꅼꅽꅾꅿꆀꆁꆂꆃꆄꆅꆆꆇꆈꆉꆊꆋꆌꆍꆎꆏꆐꆑꆒꆓꆔꆕꆖꆗꆘꆙꆚꆛꆜꆝꆞꆟꆠꆡꆢꆣꆤꆥꆦꆧꆨꆩꆪꆫꆬꆭꆮꆯꆰꆱꆲꆳꆴꆵꆶꆷꆸꆹꆺꆻꆼꆽꆾꆿꇀꇁꇂꇃꇄꇅꇆꇇꇈꇉꇊꇋꇌꇍꇎꇏꇐꇑꇒꇓꇔꇕꇖꇗꇘꇙꇚꇛꇜꇝꇞꇟꇠꇡꇢꇣꇤꇥꇦꇧꇨꇩꇪꇫꇬꇭꇮꇯꇰꇱꇲꇳꇴꇵꇶꇷꇸꇹꇺꇻꇼꇽꇾꇿꈀꈁꈂꈃꈄꈅꈆꈇꈈꈉꈊꈋꈌꈍꈎꈏꈐꈑꈒꈓꈔꈕꈖꈗꈘꈙꈚꈛꈜꈝꈞꈟꈠꈡꈢꈣꈤꈥꈦꈧꈨꈩꈪꈫꈬꈭꈮꈯꈰꈱꈲꈳꈴꈵꈶꈷꈸꈹꈺꈻꈼꈽꈾꈿꉀꉁꉂꉃꉄꉅꉆꉇꉈꉉꉊꉋꉌꉍꉎꉏꉐꉑꉒꉓꉔꉕꉖꉗꉘꉙꉚꉛꉜꉝꉞꉟꉠꉡꉢꉣꉤꉥꉦꉧꉨꉩꉪꉫꉬꉭꉮꉯꉰꉱꉲꉳꉴꉵꉶꉷꉸꉹꉺꉻꉼꉽꉾꉿꊀꊁꊂꊃꊄꊅꊆꊇꊈꊉꊊꊋꊌꊍꊎꊏꊐꊑꊒꊓꊔꊕꊖꊗꊘꊙꊚꊛꊜꊝꊞꊟꊠꊡꊢꊣꊤꊥꊦꊧꊨꊩꊪꊫꊬꊭꊮꊯꊰꊱꊲꊳꊴꊵꊶꊷꊸꊹꊺꊻꊼꊽꊾꊿꋀꋁꋂꋃꋄꋅꋆꋇꋈꋉꋊꋋꋌꋍꋎꋏꋐꋑꋒꋓꋔꋕꋖꋗꋘꋙꋚꋛꋜꋝꋞꋟꋠꋡꋢꋣꋤꋥꋦꋧꋨꋩꋪꋫꋬꋭꋮꋯꋰꋱꋲꋳꋴꋵꋶꋷꋸꋹꋺꋻꋼꋽꋾꋿꌀꌁꌂꌃꌄꌅꌆꌇꌈꌉꌊꌋꌌꌍꌎꌏꌐꌑꌒꌓꌔꌕꌖꌗꌘꌙꌚꌛꌜꌝꌞꌟꌠꌡꌢꌣꌤꌥꌦꌧꌨꌩꌪꌫꌬꌭꌮꌯꌰꌱꌲꌳꌴꌵꌶꌷꌸꌹꌺꌻꌼꌽꌾꌿꍀꍁꍂꍃꍄꍅꍆꍇꍈꍉꍊꍋꍌꍍꍎꍏꍐꍑꍒꍓꍔꍕꍖꍗꍘꍙꍚꍛꍜꍝꍞꍟꍠꍡꍢꍣꍤꍥꍦꍧꍨꍩꍪꍫꍬꍭꍮꍯꍰꍱꍲꍳꍴꍵꍶꍷꍸꍹꍺꍻꍼꍽꍾꍿꎀꎁꎂꎃꎄꎅꎆꎇꎈꎉꎊꎋꎌꎍꎎꎏꎐꎑꎒꎓꎔꎕꎖꎗꎘꎙꎚꎛꎜꎝꎞꎟꎠꎡꎢꎣꎤꎥꎦꎧꎨꎩꎪꎫꎬꎭꎮꎯꎰꎱꎲꎳꎴꎵꎶꎷꎸꎹꎺꎻꎼꎽꎾꎿꏀꏁꏂꏃꏄꏅꏆꏇꏈꏉꏊꏋꏌꏍꏎꏏꏐꏑꏒꏓꏔꏕꏖꏗꏘꏙꏚꏛꏜꏝꏞꏟꏠꏡꏢꏣꏤꏥꏦꏧꏨꏩꏪꏫꏬꏭꏮꏯꏰꏱꏲꏳꏴꏵꏶꏷꏸꏹꏺꏻꏼꏽꏾꏿꐀꐁꐂꐃꐄꐅꐆꐇꐈꐉꐊꐋꐌꐍꐎꐏꐐꐑꐒꐓꐔꐕꐖꐗꐘꐙꐚꐛꐜꐝꐞꐟꐠꐡꐢꐣꐤꐥꐦꐧꐨꐩꐪꐫꐬꐭꐮꐯꐰꐱꐲꐳꐴꐵꐶꐷꐸꐹꐺꐻꐼꐽꐾꐿꑀꑁꑂꑃꑄꑅꑆꑇꑈꑉꑊꑋꑌꑍꑎꑏꑐꑑꑒꑓꑔꑕꑖꑗꑘꑙꑚꑛꑜꑝꑞꑟꑠꑡꑢꑣꑤꑥꑦꑧꑨꑩꑪꑫꑬꑭꑮꑯꑰꑱꑲꑳꑴꑵꑶꑷꑸꑹꑺꑻꑼꑽꑾꑿꒀꒁꒂꒃꒄꒅꒆꒇꒈꒉꒊꒋꒌ
+꒐꒑꒒꒓꒔꒕꒖꒗꒘꒙꒚꒛꒜꒝꒞꒟꒠꒡꒢꒣꒤꒥꒦꒧꒨꒩꒪꒫꒬꒭꒮꒯꒰꒱꒲꒳꒴꒵꒶꒷꒸꒹꒺꒻꒼꒽꒾꒿꓀꓁꓂꓃꓄꓅꓆
+ꓐꓑꓒꓓꓔꓕꓖꓗꓘꓙꓚꓛꓜꓝꓞꓟꓠꓡꓢꓣꓤꓥꓦꓧꓨꓩꓪꓫꓬꓭꓮꓯꓰꓱꓲꓳꓴꓵꓶꓷꓸꓹꓺꓻꓼꓽ
+꓾꓿
+ꔀꔁꔂꔃꔄꔅꔆꔇꔈꔉꔊꔋꔌꔍꔎꔏꔐꔑꔒꔓꔔꔕꔖꔗꔘꔙꔚꔛꔜꔝꔞꔟꔠꔡꔢꔣꔤꔥꔦꔧꔨꔩꔪꔫꔬꔭꔮꔯꔰꔱꔲꔳꔴꔵꔶꔷꔸꔹꔺꔻꔼꔽꔾꔿꕀꕁꕂꕃꕄꕅꕆꕇꕈꕉꕊꕋꕌꕍꕎꕏꕐꕑꕒꕓꕔꕕꕖꕗꕘꕙꕚꕛꕜꕝꕞꕟꕠꕡꕢꕣꕤꕥꕦꕧꕨꕩꕪꕫꕬꕭꕮꕯꕰꕱꕲꕳꕴꕵꕶꕷꕸꕹꕺꕻꕼꕽꕾꕿꖀꖁꖂꖃꖄꖅꖆꖇꖈꖉꖊꖋꖌꖍꖎꖏꖐꖑꖒꖓꖔꖕꖖꖗꖘꖙꖚꖛꖜꖝꖞꖟꖠꖡꖢꖣꖤꖥꖦꖧꖨꖩꖪꖫꖬꖭꖮꖯꖰꖱꖲꖳꖴꖵꖶꖷꖸꖹꖺꖻꖼꖽꖾꖿꗀꗁꗂꗃꗄꗅꗆꗇꗈꗉꗊꗋꗌꗍꗎꗏꗐꗑꗒꗓꗔꗕꗖꗗꗘꗙꗚꗛꗜꗝꗞꗟꗠꗡꗢꗣꗤꗥꗦꗧꗨꗩꗪꗫꗬꗭꗮꗯꗰꗱꗲꗳꗴꗵꗶꗷꗸꗹꗺꗻꗼꗽꗾꗿꘀꘁꘂꘃꘄꘅꘆꘇꘈꘉꘊꘋꘌ
+꘍꘎꘏
+ꘐꘑꘒꘓꘔꘕꘖꘗꘘꘙꘚꘛꘜꘝꘞꘟ꘠꘡꘢꘣꘤꘥꘦꘧꘨꘩ꘪꘫꙀꙁꙂꙃꙄꙅꙆꙇꙈꙉꙊꙋꙌꙍꙎꙏꙐꙑꙒꙓꙔꙕꙖꙗꙘꙙꙚꙛꙜꙝꙞꙟꙢꙣꙤꙥꙦꙧꙨꙩꙪꙫꙬꙭꙮ꙯꙰꙱꙲
+꙳
+꙼꙽
+꙾
+ꙿꚀꚁꚂꚃꚄꚅꚆꚇꚈꚉꚊꚋꚌꚍꚎꚏꚐꚑꚒꚓꚔꚕꚖꚗꚠꚡꚢꚣꚤꚥꚦꚧꚨꚩꚪꚫꚬꚭꚮꚯꚰꚱꚲꚳꚴꚵꚶꚷꚸꚹꚺꚻꚼꚽꚾꚿꛀꛁꛂꛃꛄꛅꛆꛇꛈꛉꛊꛋꛌꛍꛎꛏꛐꛑꛒꛓꛔꛕꛖꛗꛘꛙꛚꛛꛜꛝꛞꛟꛠꛡꛢꛣꛤꛥꛦꛧꛨꛩꛪꛫꛬꛭꛮꛯ꛰꛱
+꛲꛳꛴꛵꛶꛷꜀꜁꜂꜃꜄꜅꜆꜇꜈꜉꜊꜋꜌꜍꜎꜏꜐꜑꜒꜓꜔꜕꜖
+ꜗꜘꜙꜚꜛꜜꜝꜞꜟ
+꜠꜡
+ꜢꜣꜤꜥꜦꜧꜨꜩꜪꜫꜬꜭꜮꜯꜰꜱꜲꜳꜴꜵꜶꜷꜸꜹꜺꜻꜼꜽꜾꜿꝀꝁꝂꝃꝄꝅꝆꝇꝈꝉꝊꝋꝌꝍꝎꝏꝐꝑꝒꝓꝔꝕꝖꝗꝘꝙꝚꝛꝜꝝꝞꝟꝠꝡꝢꝣꝤꝥꝦꝧꝨꝩꝪꝫꝬꝭꝮꝯꝰꝱꝲꝳꝴꝵꝶꝷꝸꝹꝺꝻꝼꝽꝾꝿꞀꞁꞂꞃꞄꞅꞆꞇꞈ
+꞉꞊
+Ꞌꞌꟻꟼꟽꟾꟿꠀꠁꠂꠃꠄꠅ꠆ꠇꠈꠉꠊꠋꠌꠍꠎꠏꠐꠑꠒꠓꠔꠕꠖꠗꠘꠙꠚꠛꠜꠝꠞꠟꠠꠡꠢꠣꠤꠥꠦꠧ
+꠨꠩꠪꠫
+꠰꠱꠲꠳꠴꠵
+꠶꠷꠸꠹
+ꡀꡁꡂꡃꡄꡅꡆꡇꡈꡉꡊꡋꡌꡍꡎꡏꡐꡑꡒꡓꡔꡕꡖꡗꡘꡙꡚꡛꡜꡝꡞꡟꡠꡡꡢꡣꡤꡥꡦꡧꡨꡩꡪꡫꡬꡭꡮꡯꡰꡱꡲꡳ
+꡴꡵꡶꡷
+ꢀꢁꢂꢃꢄꢅꢆꢇꢈꢉꢊꢋꢌꢍꢎꢏꢐꢑꢒꢓꢔꢕꢖꢗꢘꢙꢚꢛꢜꢝꢞꢟꢠꢡꢢꢣꢤꢥꢦꢧꢨꢩꢪꢫꢬꢭꢮꢯꢰꢱꢲꢳꢴꢵꢶꢷꢸꢹꢺꢻꢼꢽꢾꢿꣀꣁꣂꣃ꣄
+꣎꣏
+꣐꣑꣒꣓꣔꣕꣖꣗꣘꣙꣠꣡꣢꣣꣤꣥꣦꣧꣨꣩꣪꣫꣬꣭꣮꣯꣰꣱ꣲꣳꣴꣵꣶꣷ
+꣸꣹꣺
+ꣻ꤀꤁꤂꤃꤄꤅꤆꤇꤈꤉ꤊꤋꤌꤍꤎꤏꤐꤑꤒꤓꤔꤕꤖꤗꤘꤙꤚꤛꤜꤝꤞꤟꤠꤡꤢꤣꤤꤥꤦꤧꤨꤩꤪ꤫꤬꤭
+꤮꤯
+ꤰꤱꤲꤳꤴꤵꤶꤷꤸꤹꤺꤻꤼꤽꤾꤿꥀꥁꥂꥃꥄꥅꥆꥇꥈꥉꥊꥋꥌꥍꥎꥏꥐꥑꥒ꥓
+꥟
+ꥠꥡꥢꥣꥤꥥꥦꥧꥨꥩꥪꥫꥬꥭꥮꥯꥰꥱꥲꥳꥴꥵꥶꥷꥸꥹꥺꥻꥼꦀꦁꦂꦃꦄꦅꦆꦇꦈꦉꦊꦋꦌꦍꦎꦏꦐꦑꦒꦓꦔꦕꦖꦗꦘꦙꦚꦛꦜꦝꦞꦟꦠꦡꦢꦣꦤꦥꦦꦧꦨꦩꦪꦫꦬꦭꦮꦯꦰꦱꦲ꦳ꦴꦵꦶꦷꦸꦹꦺꦻꦼꦽꦾꦿ꧀
+꧁꧂꧃꧄꧅꧆꧇꧈꧉꧊꧋꧌꧍
+ꧏ꧐꧑꧒꧓꧔꧕꧖꧗꧘꧙
+꧞꧟
+ꨀꨁꨂꨃꨄꨅꨆꨇꨈꨉꨊꨋꨌꨍꨎꨏꨐꨑꨒꨓꨔꨕꨖꨗꨘꨙꨚꨛꨜꨝꨞꨟꨠꨡꨢꨣꨤꨥꨦꨧꨨꨩꨪꨫꨬꨭꨮꨯꨰꨱꨲꨳꨴꨵꨶꩀꩁꩂꩃꩄꩅꩆꩇꩈꩉꩊꩋꩌꩍ꩐꩑꩒꩓꩔꩕꩖꩗꩘꩙
+꩜꩝꩞꩟
+ꩠꩡꩢꩣꩤꩥꩦꩧꩨꩩꩪꩫꩬꩭꩮꩯꩰꩱꩲꩳꩴꩵꩶ
+꩷꩸꩹
+ꩺꩻꪀꪁꪂꪃꪄꪅꪆꪇꪈꪉꪊꪋꪌꪍꪎꪏꪐꪑꪒꪓꪔꪕꪖꪗꪘꪙꪚꪛꪜꪝꪞꪟꪠꪡꪢꪣꪤꪥꪦꪧꪨꪩꪪꪫꪬꪭꪮꪯꪰꪱꪴꪲꪳꪵꪶꪷꪸꪹꪺꪻꪼꪽꪾ꪿ꫀ꫁ꫂꫛꫜꫝ
+꫞꫟
+ꯀꯁꯂꯃꯄꯅꯆꯇꯈꯉꯊꯋꯌꯍꯎꯏꯐꯑꯒꯓꯔꯕꯖꯗꯘꯙꯚꯛꯜꯝꯞꯟꯠꯡꯢꯣꯤꯥꯦꯧꯨꯩꯪ
+꯫
+꯬꯭꯰꯱꯲꯳꯴꯵꯶꯷꯸꯹가힣ힰힱힲힳힴힵힶힷힸힹힺힻힼힽힾힿퟀퟁퟂퟃퟄퟅퟆퟋퟌퟍퟎퟏퟐퟑퟒퟓퟔퟕퟖퟗퟘퟙퟚퟛퟜퟝퟞퟟퟠퟡퟢퟣퟤퟥퟦퟧퟨퟩퟪퟫퟬퟭퟮퟯퟰퟱퟲퟳퟴퟵퟶퟷퟸퟹퟺퟻ
+
+豈更車賈滑串句龜龜契金喇奈懶癩羅蘿螺裸邏樂洛烙珞落酪駱亂卵欄爛蘭鸞嵐濫藍襤拉臘蠟廊朗浪狼郎來冷勞擄櫓爐盧老蘆虜路露魯鷺碌祿綠菉錄鹿論壟弄籠聾牢磊賂雷壘屢樓淚漏累縷陋勒肋凜凌稜綾菱陵讀拏樂諾丹寧怒率異北磻便復不泌數索參塞省葉說殺辰沈拾若掠略亮兩凉梁糧良諒量勵呂女廬旅濾礪閭驪麗黎力曆歷轢年憐戀撚漣煉璉秊練聯輦蓮連鍊列劣咽烈裂說廉念捻殮簾獵令囹寧嶺怜玲瑩羚聆鈴零靈領例禮醴隸惡了僚寮尿料樂燎療蓼遼龍暈阮劉杻柳流溜琉留硫紐類六戮陸倫崙淪輪律慄栗率隆利吏履易李梨泥理痢罹裏裡里離匿溺吝燐璘藺隣鱗麟林淋臨立笠粒狀炙識什茶刺切度拓糖宅洞暴輻行降見廓兀嗀﨎﨏塚﨑晴﨓﨔凞猪益礼神祥福靖精羽﨟蘒﨡諸﨣﨤逸都﨧﨨﨩飯飼館鶴侮僧免勉勤卑喝嘆器塀墨層屮悔慨憎懲敏既暑梅海渚漢煮爫琢碑社祉祈祐祖祝禍禎穀突節練縉繁署者臭艹艹著褐視謁謹賓贈辶逸難響頻恵𤋮舘並况全侀充冀勇勺喝啕喙嗢塚墳奄奔婢嬨廒廙彩徭惘慎愈憎慠懲戴揄搜摒敖晴朗望杖歹殺流滛滋漢瀞煮瞧爵犯猪瑱甆画瘝瘟益盛直睊着磌窱節类絛練缾者荒華蝹襁覆視調諸請謁諾諭謹變贈輸遲醙鉶陼難靖韛響頋頻鬒龜𢡊𢡄𣏕㮝䀘䀹𥉉𥳐𧻓齃龎ﬀﬁﬂﬃﬄﬅﬆﬓﬔﬕﬖﬗיִﬞײַﬠﬡﬢﬣﬤﬥﬦﬧﬨ
+﬩
+שׁשׂשּׁשּׂאַאָאּבּגּדּהּוּזּטּיּךּכּלּמּנּסּףּפּצּקּרּשּתּוֹבֿכֿפֿﭏﭐﭑﭒﭓﭔﭕﭖﭗﭘﭙﭚﭛﭜﭝﭞﭟﭠﭡﭢﭣﭤﭥﭦﭧﭨﭩﭪﭫﭬﭭﭮﭯﭰﭱﭲﭳﭴﭵﭶﭷﭸﭹﭺﭻﭼﭽﭾﭿﮀﮁﮂﮃﮄﮅﮆﮇﮈﮉﮊﮋﮌﮍﮎﮏﮐﮑﮒﮓﮔﮕﮖﮗﮘﮙﮚﮛﮜﮝﮞﮟﮠﮡﮢﮣﮤﮥﮦﮧﮨﮩﮪﮫﮬﮭﮮﮯﮰﮱﯓﯔﯕﯖﯗﯘﯙﯚﯛﯜﯝﯞﯟﯠﯡﯢﯣﯤﯥﯦﯧﯨﯩﯪﯫﯬﯭﯮﯯﯰﯱﯲﯳﯴﯵﯶﯷﯸﯹﯺﯻﯼﯽﯾﯿﰀﰁﰂﰃﰄﰅﰆﰇﰈﰉﰊﰋﰌﰍﰎﰏﰐﰑﰒﰓﰔﰕﰖﰗﰘﰙﰚﰛﰜﰝﰞﰟﰠﰡﰢﰣﰤﰥﰦﰧﰨﰩﰪﰫﰬﰭﰮﰯﰰﰱﰲﰳﰴﰵﰶﰷﰸﰹﰺﰻﰼﰽﰾﰿﱀﱁﱂﱃﱄﱅﱆﱇﱈﱉﱊﱋﱌﱍﱎﱏﱐﱑﱒﱓﱔﱕﱖﱗﱘﱙﱚﱛﱜﱝﱞﱟﱠﱡﱢﱣﱤﱥﱦﱧﱨﱩﱪﱫﱬﱭﱮﱯﱰﱱﱲﱳﱴﱵﱶﱷﱸﱹﱺﱻﱼﱽﱾﱿﲀﲁﲂﲃﲄﲅﲆﲇﲈﲉﲊﲋﲌﲍﲎﲏﲐﲑﲒﲓﲔﲕﲖﲗﲘﲙﲚﲛﲜﲝﲞﲟﲠﲡﲢﲣﲤﲥﲦﲧﲨﲩﲪﲫﲬﲭﲮﲯﲰﲱﲲﲳﲴﲵﲶﲷﲸﲹﲺﲻﲼﲽﲾﲿﳀﳁﳂﳃﳄﳅﳆﳇﳈﳉﳊﳋﳌﳍﳎﳏﳐﳑﳒﳓﳔﳕﳖﳗﳘﳙﳚﳛﳜﳝﳞﳟﳠﳡﳢﳣﳤﳥﳦﳧﳨﳩﳪﳫﳬﳭﳮﳯﳰﳱﳲﳳﳴﳵﳶﳷﳸﳹﳺﳻﳼﳽﳾﳿﴀﴁﴂﴃﴄﴅﴆﴇﴈﴉﴊﴋﴌﴍﴎﴏﴐﴑﴒﴓﴔﴕﴖﴗﴘﴙﴚﴛﴜﴝﴞﴟﴠﴡﴢﴣﴤﴥﴦﴧﴨﴩﴪﴫﴬﴭﴮﴯﴰﴱﴲﴳﴴﴵﴶﴷﴸﴹﴺﴻﴼﴽ
+﴾﴿
+ﵐﵑﵒﵓﵔﵕﵖﵗﵘﵙﵚﵛﵜﵝﵞﵟﵠﵡﵢﵣﵤﵥﵦﵧﵨﵩﵪﵫﵬﵭﵮﵯﵰﵱﵲﵳﵴﵵﵶﵷﵸﵹﵺﵻﵼﵽﵾﵿﶀﶁﶂﶃﶄﶅﶆﶇﶈﶉﶊﶋﶌﶍﶎﶏﶒﶓﶔﶕﶖﶗﶘﶙﶚﶛﶜﶝﶞﶟﶠﶡﶢﶣﶤﶥﶦﶧﶨﶩﶪﶫﶬﶭﶮﶯﶰﶱﶲﶳﶴﶵﶶﶷﶸﶹﶺﶻﶼﶽﶾﶿﷀﷁﷂﷃﷄﷅﷆﷇﷰﷱﷲﷳﷴﷵﷶﷷﷸﷹﷺﷻ
+﷼﷽
+︀︁︂︃︄︅︆︇︈︉︊︋︌︍︎️
+︐︑︒︓︔︕︖︗︘︙
+︠︡︢︣︤︥︦
+︰︱︲︳︴︵︶︷︸︹︺︻︼︽︾︿﹀﹁﹂﹃﹄﹅﹆﹇﹈﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹘﹙﹚﹛﹜﹝﹞﹟﹠﹡﹢﹣﹤﹥﹦﹨﹩﹪﹫
+ﹰﹱﹲﹳﹴﹶﹷﹸﹹﹺﹻﹼﹽﹾﹿﺀﺁﺂﺃﺄﺅﺆﺇﺈﺉﺊﺋﺌﺍﺎﺏﺐﺑﺒﺓﺔﺕﺖﺗﺘﺙﺚﺛﺜﺝﺞﺟﺠﺡﺢﺣﺤﺥﺦﺧﺨﺩﺪﺫﺬﺭﺮﺯﺰﺱﺲﺳﺴﺵﺶﺷﺸﺹﺺﺻﺼﺽﺾﺿﻀﻁﻂﻃﻄﻅﻆﻇﻈﻉﻊﻋﻌﻍﻎﻏﻐﻑﻒﻓﻔﻕﻖﻗﻘﻙﻚﻛﻜﻝﻞﻟﻠﻡﻢﻣﻤﻥﻦﻧﻨﻩﻪﻫﻬﻭﻮﻯﻰﻱﻲﻳﻴﻵﻶﻷﻸﻹﻺﻻﻼ
+﻿！＂＃＄％＆＇（）＊＋，－．／
+０１２３４５６７８９
+：；＜＝＞？＠
+ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ
+［＼］＾＿｀
+ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ
+｛｜｝～｟｠｡｢｣､･
+ｦｧｨｩｪｫｬｭｮｯｰｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜﾝﾞﾟﾠﾡﾢﾣﾤﾥﾦﾧﾨﾩﾪﾫﾬﾭﾮﾯﾰﾱﾲﾳﾴﾵﾶﾷﾸﾹﾺﾻﾼﾽﾾￂￃￄￅￆￇￊￋￌￍￎￏￒￓￔￕￖￗￚￛￜ
+￠￡￢￣￤￥￦￨￩￪￫￬￭￮￹￺￻￼�
+𐀀
\ No newline at end of file
diff --git a/htmltest/modules/search/tests/search_embedded_form.info b/htmltest/modules/search/tests/search_embedded_form.info
new file mode 100644
index 00000000..7925f7e1
--- /dev/null
+++ b/htmltest/modules/search/tests/search_embedded_form.info
@@ -0,0 +1,12 @@
+name = "Search embedded form"
+description = "Support module for search module testing of embedded forms."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/search/tests/search_embedded_form.module b/htmltest/modules/search/tests/search_embedded_form.module
new file mode 100644
index 00000000..48457967
--- /dev/null
+++ b/htmltest/modules/search/tests/search_embedded_form.module
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * @file
+ * Test module implementing a form that can be embedded in search results.
+ *
+ * Embedded form are important, for example, for ecommerce sites where each
+ * search result may included an embedded form with buttons like "Add to cart"
+ * for each individual product (node) listed in the search results.
+ */
+
+/**
+  * Implements hook_menu().
+  */
+function search_embedded_form_menu() {
+  $items['search_embedded_form'] = array(
+    'title' => 'Search_Embed_Form',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('search_embedded_form_form'),
+    'access arguments' => array('search content'),
+    'type' => MENU_CALLBACK,
+  );
+
+  return $items;
+}
+
+/**
+ * Builds a form for embedding in search results for testing.
+ *
+ * @see search_embedded_form_form_submit().
+ */
+function search_embedded_form_form($form, &$form_state) {
+  $count = variable_get('search_embedded_form_submitted', 0);
+
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Your name'),
+    '#maxlength' => 255,
+    '#default_value' => '',
+    '#required' => TRUE,
+    '#description' => t('Times form has been submitted: %count', array('%count' => $count)),
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Send away'),
+  );
+
+  $form['#submit'][] = 'search_embedded_form_form_submit';
+
+  return $form;
+}
+
+/**
+ * Submit handler for search_embedded_form_form().
+ */
+function search_embedded_form_form_submit($form, &$form_state) {
+  $count = variable_get('search_embedded_form_submitted', 0) + 1;
+  variable_set('search_embedded_form_submitted', $count);
+  drupal_set_message(t('Test form was submitted'));
+}
+
+/**
+ * Adds the test form to search results.
+ */
+function search_embedded_form_preprocess_search_result(&$variables) {
+  $form = drupal_get_form('search_embedded_form_form');
+  $variables['snippet'] .= drupal_render($form);
+}
diff --git a/htmltest/modules/search/tests/search_extra_type.info b/htmltest/modules/search/tests/search_extra_type.info
new file mode 100644
index 00000000..5b4fcb5c
--- /dev/null
+++ b/htmltest/modules/search/tests/search_extra_type.info
@@ -0,0 +1,12 @@
+name = "Test search type"
+description = "Support module for search module testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/search/tests/search_extra_type.module b/htmltest/modules/search/tests/search_extra_type.module
new file mode 100644
index 00000000..80c050c2
--- /dev/null
+++ b/htmltest/modules/search/tests/search_extra_type.module
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * @file
+ * Dummy module implementing a search type for search module testing.
+ */
+
+/**
+ * Implements hook_search_info().
+ */
+function search_extra_type_search_info() {
+  return array(
+    'title' => 'Dummy search type',
+    'path' => 'dummy_path',
+    'conditions_callback' => 'search_extra_type_conditions',
+  );
+}
+
+/**
+ * Test conditions callback for hook_search_info().
+ */
+function search_extra_type_conditions() {
+  $conditions = array();
+
+  if (!empty($_REQUEST['search_conditions'])) {
+    $conditions['search_conditions'] = $_REQUEST['search_conditions'];
+  }
+  return $conditions;
+}
+
+/**
+ * Implements hook_search_execute().
+ *
+ * This is a dummy search, so when search "executes", we just return a dummy
+ * result containing the keywords and a list of conditions.
+ */
+function search_extra_type_search_execute($keys = NULL, $conditions = NULL) {
+  if (!$keys) {
+    $keys = '';
+  }
+  return array(
+    array(
+      'link' => url('node'),
+      'type' => 'Dummy result type',
+      'title' => 'Dummy title',
+      'snippet' => "Dummy search snippet to display. Keywords: {$keys}\n\nConditions: " . print_r($conditions, TRUE),
+    ),
+  );
+}
+
+/**
+ * Implements hook_search_page().
+ *
+ * Adds some text to the search page so we can verify that it runs.
+ */
+function search_extra_type_search_page($results) {
+  $output['prefix']['#markup'] = '<h2>Test page text is here</h2> <ol class="search-results">';
+
+  foreach ($results as $entry) {
+    $output[] = array(
+      '#theme' => 'search_result',
+      '#result' => $entry,
+      '#module' => 'search_extra_type',
+    );
+  }
+  $output['suffix']['#markup'] = '</ol>' . theme('pager');
+
+  return $output;
+}
diff --git a/htmltest/modules/shortcut/shortcut-rtl.css b/htmltest/modules/shortcut/shortcut-rtl.css
new file mode 100644
index 00000000..5dec9570
--- /dev/null
+++ b/htmltest/modules/shortcut/shortcut-rtl.css
@@ -0,0 +1,48 @@
+
+div#toolbar a#edit-shortcuts {
+  position: absolute;
+  left: 0;
+  top: 0;
+  padding: 5px 5px 5px 10px;
+}
+div#toolbar div.toolbar-shortcuts ul {
+  float: none;
+  margin-right: 5px;
+  margin-left: 10em;
+}
+div#toolbar div.toolbar-shortcuts ul li a {
+  margin-left: 5px;
+  margin-right: 0;
+  padding: 0 5px;
+}
+div#toolbar div.toolbar-shortcuts span.icon {
+  float: right;
+}
+div.add-or-remove-shortcuts a span.icon {
+  float: right;
+  margin-right: 8px;
+  margin-left: 0;
+}
+div.add-or-remove-shortcuts a span.text {
+  float: right;
+  padding-right: 10px;
+  padding-left: 0;
+}
+div.add-or-remove-shortcuts a:focus span.text,
+div.add-or-remove-shortcuts a:hover span.text {
+  -moz-border-radius: 5px 0 0 5px;
+  -webkit-border-top-left-radius: 5px;
+  -webkit-border-bottom-left-radius: 5px;
+  border-radius: 5px 0 0 5px;
+  padding-left: 6px;
+}
+#shortcut-set-switch .form-item-new {
+  padding-right: 17px;
+  padding-left: 0;
+}
+div.add-shortcut a:hover span.icon {
+  background-position: 0 -24px;
+}
+div.remove-shortcut a:hover span.icon {
+  background-position: -12px -24px;
+}
diff --git a/htmltest/modules/shortcut/shortcut.admin.css b/htmltest/modules/shortcut/shortcut.admin.css
new file mode 100644
index 00000000..8ca03be8
--- /dev/null
+++ b/htmltest/modules/shortcut/shortcut.admin.css
@@ -0,0 +1,8 @@
+
+.shortcut-slot-hidden {
+  display: none;
+}
+
+div.form-item-set div.form-item-new {
+  display: inline;
+}
diff --git a/htmltest/modules/shortcut/shortcut.admin.inc b/htmltest/modules/shortcut/shortcut.admin.inc
new file mode 100644
index 00000000..2e8ddb43
--- /dev/null
+++ b/htmltest/modules/shortcut/shortcut.admin.inc
@@ -0,0 +1,788 @@
+<?php
+
+/**
+ * @file
+ * Administrative page callbacks for the shortcut module.
+ */
+
+/**
+ * Returns the maximum number of shortcut "slots" available per shortcut set.
+ *
+ * This is used as a limitation in the user interface only.
+ *
+ * @return
+ *   The maximum number of shortcuts allowed to be added to a shortcut set.
+ */
+function shortcut_max_slots() {
+  return variable_get('shortcut_max_slots', 7);
+}
+
+/**
+ * Form callback: builds the form for switching shortcut sets.
+ *
+ * @param $form
+ *   An associative array containing the structure of the form.
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param $account
+ *   (optional) The user account whose shortcuts will be switched. Defaults to
+ *   the current logged-in user.
+ *
+ * @return
+ *   An array representing the form definition.
+ *
+ * @ingroup forms
+ * @see shortcut_set_switch_validate()
+ * @see shortcut_set_switch_submit()
+ */
+function shortcut_set_switch($form, &$form_state, $account = NULL) {
+  global $user;
+  if (!isset($account)) {
+    $account = $user;
+  }
+
+  // Prepare the list of shortcut sets.
+  $sets = shortcut_sets();
+  $current_set = shortcut_current_displayed_set($account);
+
+  $options = array();
+  foreach ($sets as $name => $set) {
+    $options[$name] = check_plain($set->title);
+  }
+
+  // Only administrators can add shortcut sets.
+  $add_access = user_access('administer shortcuts');
+  if ($add_access) {
+    $options['new'] = t('New set');
+  }
+
+  if (count($options) > 1) {
+    $form['account'] = array(
+      '#type' => 'value',
+      '#value' => $account,
+    );
+
+    $form['set'] = array(
+      '#type' => 'radios',
+      '#title' => $user->uid == $account->uid ? t('Choose a set of shortcuts to use') : t('Choose a set of shortcuts for this user'),
+      '#options' => $options,
+      '#default_value' => $current_set->set_name,
+    );
+
+    $form['new'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Name'),
+      '#title_display' => 'invisible',
+      '#description' => t('The new set is created by copying items from your default shortcut set.'),
+      '#access' => $add_access,
+    );
+
+    if ($user->uid != $account->uid) {
+      $default_set = shortcut_default_set($account);
+      $form['new']['#description'] = t('The new set is created by copying items from the %default set.', array('%default' => $default_set->title));
+    }
+
+    $form['#attached'] = array(
+      'css' => array(drupal_get_path('module', 'shortcut') . '/shortcut.admin.css'),
+      'js' => array(drupal_get_path('module', 'shortcut') . '/shortcut.admin.js'),
+    );
+
+    $form['actions'] = array('#type' => 'actions');
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Change set'),
+    );
+  }
+  else {
+    // There is only 1 option, so output a message in the $form array.
+    $form['info'] = array(
+      '#markup' => '<p>' . t('You are currently using the %set-name shortcut set.', array('%set-name' => $current_set->title)) . '</p>',
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Validation handler for shortcut_set_switch().
+ */
+function shortcut_set_switch_validate($form, &$form_state) {
+  if ($form_state['values']['set'] == 'new') {
+    // Check to prevent creating a shortcut set with an empty title.
+    if (trim($form_state['values']['new']) == '') {
+      form_set_error('new', t('The new set name is required.'));
+    }
+    // Check to prevent a duplicate title.
+    if (shortcut_set_title_exists($form_state['values']['new'])) {
+      form_set_error('new', t('The shortcut set %name already exists. Choose another name.', array('%name' => $form_state['values']['new'])));
+    }
+  }
+}
+
+/**
+ * Submit handler for shortcut_set_switch().
+ */
+function shortcut_set_switch_submit($form, &$form_state) {
+  global $user;
+  $account = $form_state['values']['account'];
+
+  if ($form_state['values']['set'] == 'new') {
+    // Save a new shortcut set with links copied from the user's default set.
+    $default_set = shortcut_default_set($account);
+    $set = (object) array(
+      'title' => $form_state['values']['new'],
+      'links' => menu_links_clone($default_set->links),
+    );
+    shortcut_set_save($set);
+    $replacements = array(
+      '%user' => $account->name,
+      '%set_name' => $set->title,
+      '@switch-url' => url(current_path()),
+    );
+    if ($account->uid == $user->uid) {
+      // Only administrators can create new shortcut sets, so we know they have
+      // access to switch back.
+      drupal_set_message(t('You are now using the new %set_name shortcut set. You can edit it from this page or <a href="@switch-url">switch back to a different one.</a>', $replacements));
+    }
+    else {
+      drupal_set_message(t('%user is now using a new shortcut set called %set_name. You can edit it from this page.', $replacements));
+    }
+    $form_state['redirect'] = 'admin/config/user-interface/shortcut/' . $set->set_name;
+  }
+  else {
+    // Switch to a different shortcut set.
+    $set = shortcut_set_load($form_state['values']['set']);
+    $replacements = array(
+      '%user' => $account->name,
+      '%set_name' => $set->title,
+    );
+    drupal_set_message($account->uid == $user->uid ? t('You are now using the %set_name shortcut set.', $replacements) : t('%user is now using the %set_name shortcut set.', $replacements));
+  }
+
+  // Assign the shortcut set to the provided user account.
+  shortcut_set_assign_user($set, $account);
+}
+
+/**
+ * Menu page callback: builds the page for administering shortcut sets.
+ */
+function shortcut_set_admin() {
+  $shortcut_sets = shortcut_sets();
+  $header = array(t('Name'), array('data' => t('Operations'), 'colspan' => 4));
+
+  $rows = array();
+  foreach ($shortcut_sets as $set) {
+    $row = array(
+      check_plain($set->title),
+      l(t('list links'), "admin/config/user-interface/shortcut/$set->set_name"),
+      l(t('edit set name'), "admin/config/user-interface/shortcut/$set->set_name/edit"),
+    );
+    if (shortcut_set_delete_access($set)) {
+      $row[] = l(t('delete set'), "admin/config/user-interface/shortcut/$set->set_name/delete");
+    }
+    else {
+      $row[] = '';
+    }
+
+    $rows[] = $row;
+  }
+
+  return theme('table', array('header' => $header, 'rows' => $rows));
+}
+
+/**
+ * Form callback: builds the form for adding a shortcut set.
+ *
+ * @param $form
+ *   An associative array containing the structure of the form.
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ *
+ * @return
+ *   An array representing the form definition.
+ *
+ * @ingroup forms
+ * @see shortcut_set_add_form_validate()
+ * @see shortcut_set_add_form_submit()
+ */
+function shortcut_set_add_form($form, &$form_state) {
+  $form['new'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Set name'),
+    '#description' => t('The new set is created by copying items from your default shortcut set.'),
+    '#required' => TRUE,
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Create new set'),
+  );
+
+  return $form;
+}
+
+/**
+ * Validation handler for shortcut_set_add_form().
+ */
+function shortcut_set_add_form_validate($form, &$form_state) {
+  // Check to prevent a duplicate title.
+  if (shortcut_set_title_exists($form_state['values']['new'])) {
+    form_set_error('new', t('The shortcut set %name already exists. Choose another name.', array('%name' => $form_state['values']['new'])));
+  }
+}
+
+/**
+ * Submit handler for shortcut_set_add_form().
+ */
+function shortcut_set_add_form_submit($form, &$form_state) {
+  // Save a new shortcut set with links copied from the user's default set.
+  $default_set = shortcut_default_set();
+  $set = (object) array(
+    'title' => $form_state['values']['new'],
+    'links' => menu_links_clone($default_set->links),
+  );
+  shortcut_set_save($set);
+  drupal_set_message(t('The %set_name shortcut set has been created. You can edit it from this page.', array('%set_name' => $set->title)));
+  $form_state['redirect'] = 'admin/config/user-interface/shortcut/' . $set->set_name;
+}
+
+/**
+ * Form callback: builds the form for customizing shortcut sets.
+ *
+ * @param $form
+ *   An associative array containing the structure of the form.
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param $shortcut_set
+ *   An object representing the shortcut set which is being edited.
+ *
+ * @return
+ *   An array representing the form definition.
+ *
+ * @ingroup forms
+ * @see shortcut_set_customize_submit()
+ */
+function shortcut_set_customize($form, &$form_state, $shortcut_set) {
+  $form['#shortcut_set_name'] = $shortcut_set->set_name;
+  $form['shortcuts'] = array(
+    '#tree' => TRUE,
+    '#weight' => -20,
+    'enabled' => array(),
+    'disabled' => array(),
+  );
+
+  foreach ($shortcut_set->links as $link) {
+    $mlid = $link['mlid'];
+    $status = $link['hidden'] ? 'disabled' : 'enabled';
+    $form['shortcuts'][$status][$mlid]['name']['#markup'] = l($link['link_title'], $link['link_path']);
+    $form['shortcuts'][$status][$mlid]['weight'] = array(
+      '#type' => 'weight',
+      '#title' => t('Weight'),
+      '#delta' => 50,
+      '#default_value' => $link['weight'],
+      '#attributes' => array('class' => array('shortcut-weight')),
+    );
+    $form['shortcuts'][$status][$mlid]['status'] = array(
+      '#type' => 'select',
+      '#title' => t('Status'),
+      '#options' => array('disabled' => t('Disabled'), 'enabled' => t('Enabled')),
+      '#default_value' => $status,
+      '#attributes' => array('class' => array('shortcut-status-select')),
+    );
+
+    $form['shortcuts'][$status][$mlid]['edit']['#markup'] = l(t('edit'), 'admin/config/user-interface/shortcut/link/' . $mlid);
+    $form['shortcuts'][$status][$mlid]['delete']['#markup'] = l(t('delete'), 'admin/config/user-interface/shortcut/link/' . $mlid . '/delete');
+  }
+
+  $form['#attached'] = array(
+    'css' => array(drupal_get_path('module', 'shortcut') . '/shortcut.admin.css'),
+    'js' => array(drupal_get_path('module', 'shortcut') . '/shortcut.admin.js'),
+  );
+
+  $form['actions'] = array(
+    '#type' => 'actions',
+    '#access' => !empty($shortcut_set->links),
+  );
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save changes'),
+  );
+
+  return $form;
+}
+
+/**
+ * Submit handler for shortcut_set_customize().
+ */
+function shortcut_set_customize_submit($form, &$form_state) {
+  foreach ($form_state['values']['shortcuts'] as $group => $links) {
+    foreach ($links as $mlid => $data) {
+      $link = menu_link_load($mlid);
+      $link['hidden'] = $data['status'] == 'enabled' ? 0 : 1;
+      $link['weight'] = $data['weight'];
+      menu_link_save($link);
+    }
+  }
+  drupal_set_message(t('The shortcut set has been updated.'));
+}
+
+/**
+ * Returns HTML for a shortcut set customization form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @see shortcut_set_customize()
+ * @ingroup themeable
+ */
+function theme_shortcut_set_customize($variables) {
+  $form = $variables['form'];
+  $map = array('disabled' => t('Disabled'), 'enabled' => t('Enabled'));
+  $shortcuts_by_status = array(
+    'enabled' => element_children($form['shortcuts']['enabled']),
+    'disabled' => element_children($form['shortcuts']['disabled']),
+  );
+  // Do not add any rows to the table if there are no shortcuts to display.
+  $statuses = empty($shortcuts_by_status['enabled']) && empty($shortcuts_by_status['disabled']) ? array() : array_keys($shortcuts_by_status);
+
+  $rows = array();
+  foreach ($statuses as $status) {
+    drupal_add_tabledrag('shortcuts', 'match', 'sibling', 'shortcut-status-select');
+    drupal_add_tabledrag('shortcuts', 'order', 'sibling', 'shortcut-weight');
+    $rows[] = array(
+      'data' => array(array(
+        'colspan' => 5,
+        'data' => '<strong>' . $map[$status] . '</strong>',
+      )),
+      'class' => array('shortcut-status', 'shortcut-status-' . $status),
+    );
+
+    foreach ($shortcuts_by_status[$status] as $key) {
+      $shortcut = &$form['shortcuts'][$status][$key];
+      $row = array();
+      $row[] = drupal_render($shortcut['name']);
+      $row[] = drupal_render($shortcut['weight']);
+      $row[] = drupal_render($shortcut['status']);
+      $row[] = drupal_render($shortcut['edit']);
+      $row[] = drupal_render($shortcut['delete']);
+      $rows[] = array(
+        'data' => $row,
+        'class' => array('draggable'),
+      );
+    }
+
+    if ($status == 'enabled') {
+      for ($i = 0; $i < shortcut_max_slots(); $i++) {
+        $rows['empty-' . $i] = array(
+          'data' => array(array(
+            'colspan' => 5,
+            'data' => '<em>' . t('Empty') . '</em>',
+          )),
+          'class' => array('shortcut-slot-empty'),
+        );
+      }
+      $count_shortcuts = count($shortcuts_by_status[$status]);
+      if (!empty($count_shortcuts)) {
+        for ($i = 0; $i < min($count_shortcuts, shortcut_max_slots()); $i++) {
+          $rows['empty-' . $i]['class'][] = 'shortcut-slot-hidden';
+        }
+      }
+    }
+  }
+
+  $header = array(t('Name'), t('Weight'), t('Status'), array('data' => t('Operations'), 'colspan' => 2));
+  $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'shortcuts'), 'empty' => t('No shortcuts available. <a href="@link">Add a shortcut</a>.', array('@link' => url('admin/config/user-interface/shortcut/' . $form['#shortcut_set_name'] . '/add-link')))));
+  $output .= drupal_render($form['actions']);
+  $output = drupal_render_children($form) . $output;
+  return $output;
+}
+
+/**
+ * Form callback: builds the form for adding a new shortcut link.
+ *
+ * @param $form
+ *   An associative array containing the structure of the form.
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param $shortcut_set
+ *   An object representing the shortcut set to which the link will be added.
+ *
+ * @return
+ *   An array representing the form definition.
+ *
+ * @ingroup forms
+ * @see shortcut_link_edit_validate()
+ * @see shortcut_link_add_submit()
+ */
+function shortcut_link_add($form, &$form_state, $shortcut_set) {
+  drupal_set_title(t('Add new shortcut'));
+  $form['shortcut_set'] = array(
+    '#type' => 'value',
+    '#value' => $shortcut_set,
+  );
+  $form += _shortcut_link_form_elements();
+  return $form;
+}
+
+/**
+ * Form callback: builds the form for editing a shortcut link.
+ *
+ * @param $form
+ *   An associative array containing the structure of the form.
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param $shortcut_link
+ *   An array representing the link that is being edited.
+ *
+ * @return
+ *   An array representing the form definition.
+ *
+ * @ingroup forms
+ * @see shortcut_link_edit_validate()
+ * @see shortcut_link_edit_submit()
+ */
+function shortcut_link_edit($form, &$form_state, $shortcut_link) {
+  drupal_set_title(t('Editing @shortcut', array('@shortcut' => $shortcut_link['link_title'])));
+  $form['original_shortcut_link'] = array(
+    '#type' => 'value',
+    '#value' => $shortcut_link,
+  );
+  $form += _shortcut_link_form_elements($shortcut_link);
+  return $form;
+}
+
+/**
+ * Helper function for building a form for adding or editing shortcut links.
+ *
+ * @param $shortcut_link
+ *   (optional) An array representing the shortcut link that will be edited. If
+ *   not provided, a new link will be created.
+ *
+ * @return
+ *   An array of form elements.
+ */
+function _shortcut_link_form_elements($shortcut_link = NULL) {
+  if (!isset($shortcut_link)) {
+    $shortcut_link = array(
+      'link_title' => '',
+      'link_path' => ''
+    );
+  }
+  else {
+    $shortcut_link['link_path'] = ($shortcut_link['link_path'] == '<front>') ? '' : drupal_get_path_alias($shortcut_link['link_path']);
+  }
+
+  $form['shortcut_link']['#tree'] = TRUE;
+  $form['shortcut_link']['link_title'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Name'),
+    '#description' => t('The name of the shortcut.'),
+    '#size' => 40,
+    '#maxlength' => 255,
+    '#default_value' => $shortcut_link['link_title'],
+    '#required' => TRUE,
+  );
+
+  $form['shortcut_link']['link_path'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Path'),
+    '#description' => t('The path to the shortcut.'),
+    '#size' => 40,
+    '#maxlength' => 255,
+    '#field_prefix' => url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q='),
+    '#default_value' => $shortcut_link['link_path'],
+  );
+
+  $form['#validate'][] = 'shortcut_link_edit_validate';
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+  );
+
+  return $form;
+}
+
+/**
+ * Validation handler for the shortcut link add and edit forms.
+ */
+function shortcut_link_edit_validate($form, &$form_state) {
+  if (!shortcut_valid_link($form_state['values']['shortcut_link']['link_path'])) {
+    form_set_error('shortcut_link][link_path', t('The link must correspond to a valid path on the site.'));
+  }
+}
+
+/**
+ * Submit handler for shortcut_link_edit().
+ */
+function shortcut_link_edit_submit($form, &$form_state) {
+  // Normalize the path in case it is an alias.
+  $shortcut_path = drupal_get_normal_path($form_state['values']['shortcut_link']['link_path']);
+  if (empty($shortcut_path)) {
+    $shortcut_path = '<front>';
+  }
+  $form_state['values']['shortcut_link']['link_path'] = $shortcut_path;
+
+  $shortcut_link = array_merge($form_state['values']['original_shortcut_link'], $form_state['values']['shortcut_link']);
+
+  menu_link_save($shortcut_link);
+  $form_state['redirect'] = 'admin/config/user-interface/shortcut/' . $shortcut_link['menu_name'];
+  drupal_set_message(t('The shortcut %link has been updated.', array('%link' => $shortcut_link['link_title'])));
+}
+
+/**
+ * Submit handler for shortcut_link_add().
+ */
+function shortcut_link_add_submit($form, &$form_state) {
+  // Add the shortcut link to the set.
+  $shortcut_set = $form_state['values']['shortcut_set'];
+  $shortcut_link = $form_state['values']['shortcut_link'];
+  $shortcut_link['menu_name'] = $shortcut_set->set_name;
+  shortcut_admin_add_link($shortcut_link, $shortcut_set, shortcut_max_slots());
+  shortcut_set_save($shortcut_set);
+  $form_state['redirect'] = 'admin/config/user-interface/shortcut/' . $shortcut_link['menu_name'];
+  drupal_set_message(t('Added a shortcut for %title.', array('%title' => $shortcut_link['link_title'])));
+}
+
+/**
+ * Adds a link to the end of a shortcut set, keeping within a prescribed limit.
+ *
+ * @param $link
+ *   An array representing a shortcut link.
+ * @param $shortcut_set
+ *   An object representing the shortcut set which the link will be added to.
+ *   The links in the shortcut set will be re-weighted so that the new link is
+ *   at the end, and some existing links may be disabled (if the $limit
+ *   parameter is provided).
+ * @param $limit
+ *   (optional) The maximum number of links that are allowed to be enabled for
+ *   this shortcut set. If provided, existing links at the end of the list that
+ *   exceed the limit will be automatically disabled. If not provided, no limit
+ *   will be enforced.
+ */
+function shortcut_admin_add_link($shortcut_link, &$shortcut_set, $limit = NULL) {
+  if (isset($limit)) {
+    // Disable any existing links at the end of the list that would cause the
+    // limit to be exceeded. Take into account whether or not the new link will
+    // be enabled and count towards the total.
+    $number_enabled = !empty($shortcut_link['hidden']) ? 0 : 1;
+    foreach ($shortcut_set->links as &$link) {
+      if (!$link['hidden']) {
+        $number_enabled++;
+        if ($number_enabled > $limit) {
+          $link['hidden'] = 1;
+        }
+      }
+    }
+  }
+
+  // Normalize the path in case it is an alias.
+  $shortcut_link['link_path'] = drupal_get_normal_path($shortcut_link['link_path']);
+  if (empty($shortcut_link['link_path'])) {
+    $shortcut_link['link_path'] = '<front>';
+  }
+
+  // Add the link to the end of the list.
+  $shortcut_set->links[] = $shortcut_link;
+  shortcut_set_reset_link_weights($shortcut_set);
+}
+
+/**
+ * Form callback: builds the form for editing the shortcut set name.
+ *
+ * @param $form
+ *   An associative array containing the structure of the form.
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param object $shortcut_set
+ *   An object representing the shortcut set, as returned from
+ *   shortcut_set_load().
+ *
+ * @return
+ *   An array representing the form definition.
+ *
+ * @ingroup forms
+ * @see shortcut_set_edit_form_validate()
+ * @see shortcut_set_edit_form_submit()
+ */
+function shortcut_set_edit_form($form, &$form_state, $shortcut_set) {
+  $form['shortcut_set'] = array(
+    '#type' => 'value',
+    '#value' => $shortcut_set,
+  );
+  $form['title'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Set name'),
+    '#default_value' => $shortcut_set->title,
+    '#maxlength' => 255,
+    '#required' => TRUE,
+    '#weight' => -5,
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+    '#weight' => 5,
+  );
+
+  return $form;
+}
+
+/**
+ * Validation handler for shortcut_set_edit_form().
+ */
+function shortcut_set_edit_form_validate($form, &$form_state) {
+  // Check to prevent a duplicate title, if the title was edited from its
+  // original value.
+  if ($form_state['values']['title'] != $form_state['values']['shortcut_set']->title && shortcut_set_title_exists($form_state['values']['title'])) {
+    form_set_error('title', t('The shortcut set %name already exists. Choose another name.', array('%name' => $form_state['values']['title'])));
+  }
+}
+
+/**
+ * Submit handler for shortcut_set_edit_form().
+ */
+function shortcut_set_edit_form_submit($form, &$form_state) {
+  $shortcut_set = $form_state['values']['shortcut_set'];
+  $shortcut_set->title = $form_state['values']['title'];
+  shortcut_set_save($shortcut_set);
+  drupal_set_message(t('Updated set name to %set-name.', array('%set-name' => $shortcut_set->title)));
+  $form_state['redirect'] = "admin/config/user-interface/shortcut/$shortcut_set->set_name";
+}
+
+/**
+ * Form callback: builds the confirmation form for deleting a shortcut set.
+ *
+ * @param $form
+ *   An associative array containing the structure of the form.
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param object $shortcut_set
+ *   An object representing the shortcut set, as returned from
+ *   shortcut_set_load().
+ *
+ * @return
+ *   An array representing the form definition.
+ *
+ * @ingroup forms
+ * @see shortcut_set_delete_form_submit()
+ */
+function shortcut_set_delete_form($form, &$form_state, $shortcut_set) {
+  $form['shortcut_set'] = array(
+    '#type' => 'value',
+    '#value' => $shortcut_set->set_name,
+  );
+
+  // Find out how many users are directly assigned to this shortcut set, and
+  // make a message.
+  $number = db_query('SELECT COUNT(*) FROM {shortcut_set_users} WHERE set_name = :name', array(':name' => $shortcut_set->set_name))->fetchField();
+  $info = '';
+  if ($number) {
+    $info .= '<p>' . format_plural($number,
+      '1 user has chosen or been assigned to this shortcut set.',
+      '@count users have chosen or been assigned to this shortcut set.') . '</p>';
+  }
+
+  // Also, if a module implements hook_shortcut_default_set(), it's possible
+  // that this set is being used as a default set. Add a message about that too.
+  if (count(module_implements('shortcut_default_set')) > 0) {
+    $info .= '<p>' . t('If you have chosen this shortcut set as the default for some or all users, they may also be affected by deleting it.') . '</p>';
+  }
+
+  $form['info'] = array(
+    '#markup' => $info,
+  );
+
+  return confirm_form(
+    $form,
+    t('Are you sure you want to delete the shortcut set %title?', array('%title' => $shortcut_set->title)),
+    'admin/config/user-interface/shortcut/' . $shortcut_set->set_name,
+    t('This action cannot be undone.'),
+    t('Delete'),
+    t('Cancel')
+  );
+}
+
+/**
+ * Submit handler for shortcut_set_delete_form().
+ */
+function shortcut_set_delete_form_submit($form, &$form_state) {
+  $shortcut_set = shortcut_set_load($form_state['values']['shortcut_set']);
+  shortcut_set_delete($shortcut_set);
+  $form_state['redirect'] = 'admin/config/user-interface/shortcut';
+  drupal_set_message(t('The shortcut set %title has been deleted.', array('%title' => $shortcut_set->title)));
+}
+
+/**
+ * Form callback: builds the confirmation form for deleting a shortcut link.
+ *
+ * @param $form
+ *   An associative array containing the structure of the form.
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ * @param $shortcut_link
+ *   An array representing the link that will be deleted.
+ *
+ * @return
+ *   An array representing the form definition.
+ *
+ * @ingroup forms
+ * @see shortcut_link_delete_submit()
+ */
+function shortcut_link_delete($form, &$form_state, $shortcut_link) {
+  $form['shortcut_link'] = array(
+    '#type' => 'value',
+    '#value' => $shortcut_link,
+  );
+
+  return confirm_form(
+    $form,
+    t('Are you sure you want to delete the shortcut %title?', array('%title' => $shortcut_link['link_title'])),
+    'admin/config/user-interface/shortcut/' . $shortcut_link['menu_name'],
+    t('This action cannot be undone.'),
+    t('Delete'),
+    t('Cancel')
+  );
+}
+
+/**
+ * Submit handler for shortcut_link_delete_submit().
+ */
+function shortcut_link_delete_submit($form, &$form_state) {
+  $shortcut_link = $form_state['values']['shortcut_link'];
+  menu_link_delete($shortcut_link['mlid']);
+  $form_state['redirect'] = 'admin/config/user-interface/shortcut/' . $shortcut_link['menu_name'];
+  drupal_set_message(t('The shortcut %title has been deleted.', array('%title' => $shortcut_link['link_title'])));
+}
+
+/**
+ * Menu page callback: creates a new link in the provided shortcut set.
+ *
+ * After completion, redirects the user back to where they came from.
+ *
+ * @param $shortcut_set
+ *   Returned from shortcut_set_load().
+ */
+function shortcut_link_add_inline($shortcut_set) {
+  if (isset($_REQUEST['token']) && drupal_valid_token($_REQUEST['token'], 'shortcut-add-link') && shortcut_valid_link($_GET['link'])) {
+    $item = menu_get_item($_GET['link']);
+    $title = ($item && $item['title']) ? $item['title'] : $_GET['name'];
+    $link = array(
+      'link_title' => $title,
+      'link_path' => $_GET['link'],
+    );
+    shortcut_admin_add_link($link, $shortcut_set, shortcut_max_slots());
+    if (shortcut_set_save($shortcut_set)) {
+      drupal_set_message(t('Added a shortcut for %title.', array('%title' => $link['link_title'])));
+    }
+    else {
+      drupal_set_message(t('Unable to add a shortcut for %title.', array('%title' => $link['link_title'])));
+    }
+    drupal_goto();
+  }
+
+  return MENU_ACCESS_DENIED;
+}
diff --git a/htmltest/modules/shortcut/shortcut.admin.js b/htmltest/modules/shortcut/shortcut.admin.js
new file mode 100644
index 00000000..422cc4ce
--- /dev/null
+++ b/htmltest/modules/shortcut/shortcut.admin.js
@@ -0,0 +1,115 @@
+(function ($) {
+
+/**
+ * Handle the concept of a fixed number of slots.
+ *
+ * This behavior is dependent on the tableDrag behavior, since it uses the
+ * objects initialized in that behavior to update the row.
+ */
+Drupal.behaviors.shortcutDrag = {
+  attach: function (context, settings) {
+    if (Drupal.tableDrag) {
+      var table = $('table#shortcuts'),
+        visibleLength = 0,
+        slots = 0,
+        tableDrag = Drupal.tableDrag.shortcuts;
+      $('> tbody > tr, > tr', table)
+        .filter(':visible')
+          .filter(':odd').filter('.odd')
+            .removeClass('odd').addClass('even')
+          .end().end()
+          .filter(':even').filter('.even')
+            .removeClass('even').addClass('odd')
+          .end().end()
+        .end()
+        .filter('.shortcut-slot-empty').each(function(index) {
+          if ($(this).is(':visible')) {
+            visibleLength++;
+          }
+          slots++;
+        });
+
+      // Add a handler for when a row is swapped.
+      tableDrag.row.prototype.onSwap = function (swappedRow) {
+        var disabledIndex = $(table).find('tr').index($(table).find('tr.shortcut-status-disabled')) - slots - 2,
+          count = 0;
+        $(table).find('tr.shortcut-status-enabled').nextAll(':not(.shortcut-slot-empty)').each(function(index) {
+          if (index < disabledIndex) {
+            count++;
+          }
+        });
+        var total = slots - count;
+        if (total == -1) {
+          var disabled = $(table).find('tr.shortcut-status-disabled');
+          // To maintain the shortcut links limit, we need to move the last
+          // element from the enabled section to the disabled section.
+          var changedRow = disabled.prevAll(':not(.shortcut-slot-empty)').not($(this.element)).get(0);
+          disabled.after(changedRow);
+          if ($(changedRow).hasClass('draggable')) {
+            // The dropped element will automatically be marked as changed by
+            // the tableDrag system. However, the row that swapped with it
+            // has moved to the "disabled" section, so we need to force its
+            // status to be disabled and mark it also as changed.
+            var changedRowObject = new tableDrag.row(changedRow, 'mouse', false, 0, true);
+            changedRowObject.markChanged();
+            tableDrag.rowStatusChange(changedRowObject);
+          }
+        }
+        else if (total != visibleLength) {
+          if (total > visibleLength) {
+            // Less slots on screen than needed.
+            $('.shortcut-slot-empty:hidden:last').show();
+            visibleLength++;
+          }
+          else {
+            // More slots on screen than needed.
+            $('.shortcut-slot-empty:visible:last').hide();
+            visibleLength--;
+          }
+        }
+      };
+
+      // Add a handler so when a row is dropped, update fields dropped into new regions.
+      tableDrag.onDrop = function () {
+        tableDrag.rowStatusChange(this.rowObject);
+        return true;
+      };
+
+      tableDrag.rowStatusChange = function (rowObject) {
+        // Use "status-message" row instead of "status" row because
+        // "status-{status_name}-message" is less prone to regexp match errors.
+        var statusRow = $(rowObject.element).prevAll('tr.shortcut-status').get(0);
+        var statusName = statusRow.className.replace(/([^ ]+[ ]+)*shortcut-status-([^ ]+)([ ]+[^ ]+)*/, '$2');
+        var statusField = $('select.shortcut-status-select', rowObject.element);
+        statusField.val(statusName);
+      };
+
+      tableDrag.restripeTable = function () {
+        // :even and :odd are reversed because jQuery counts from 0 and
+        // we count from 1, so we're out of sync.
+        // Match immediate children of the parent element to allow nesting.
+        $('> tbody > tr:visible, > tr:visible', this.table)
+          .filter(':odd').filter('.odd')
+            .removeClass('odd').addClass('even')
+          .end().end()
+          .filter(':even').filter('.even')
+            .removeClass('even').addClass('odd');
+      };
+    }
+  }
+};
+
+/**
+ * Make it so when you enter text into the "New set" textfield, the
+ * corresponding radio button gets selected.
+ */
+Drupal.behaviors.newSet = {
+  attach: function (context, settings) {
+    var selectDefault = function() {
+      $(this).closest('form').find('.form-item-set .form-type-radio:last input').attr('checked', 'checked');
+    };
+    $('div.form-item-new input').focus(selectDefault).keyup(selectDefault);
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/shortcut/shortcut.api.php b/htmltest/modules/shortcut/shortcut.api.php
new file mode 100644
index 00000000..717a7c92
--- /dev/null
+++ b/htmltest/modules/shortcut/shortcut.api.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Shortcut module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Return the name of a default shortcut set for the provided user account.
+ *
+ * This hook allows modules to define default shortcut sets for a particular
+ * user that differ from the site-wide default (for example, a module may want
+ * to define default shortcuts on a per-role basis).
+ *
+ * The default shortcut set is used only when the user does not have any other
+ * shortcut set explicitly assigned to them.
+ *
+ * Note that only one default shortcut set can exist per user, so when multiple
+ * modules implement this hook, the last (i.e., highest weighted) module which
+ * returns a valid shortcut set name will prevail.
+ *
+ * @param $account
+ *   The user account whose default shortcut set is being requested.
+ * @return
+ *   The name of the shortcut set that this module recommends for that user, if
+ *   there is one.
+ */
+function hook_shortcut_default_set($account) {
+  // Use a special set of default shortcuts for administrators only.
+  if (in_array(variable_get('user_admin_role', 0), $account->roles)) {
+    return variable_get('mymodule_shortcut_admin_default_set');
+  }
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/shortcut/shortcut.css b/htmltest/modules/shortcut/shortcut.css
new file mode 100644
index 00000000..3afcb943
--- /dev/null
+++ b/htmltest/modules/shortcut/shortcut.css
@@ -0,0 +1,106 @@
+div#toolbar a#edit-shortcuts {
+  float: right;
+  padding: 5px 10px 5px 5px;
+  line-height: 24px;
+  color: #fefefe;
+}
+div#toolbar a#edit-shortcuts:focus,
+div#toolbar a#edit-shortcuts:hover,
+div#toolbar a#edit-shortcuts.active {
+  color: #fff;
+  text-decoration: underline;
+}
+
+div#toolbar div.toolbar-shortcuts ul {
+  padding: 5px 0 2px 0;
+  height: 28px;
+  line-height: 24px;
+  float: left; /* LTR */
+  margin-left:5px; /* LTR */
+}
+
+div#toolbar div.toolbar-shortcuts ul li a {
+  padding: 0 5px 0 5px;
+  margin-right: 5px; /* LTR */
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  border-radius: 5px;
+}
+
+div#toolbar div.toolbar-shortcuts ul li a:focus,
+div#toolbar div.toolbar-shortcuts ul li a:hover,
+div#toolbar div.toolbar-shortcuts ul li a.active:focus {
+  background: #555;
+}
+
+div#toolbar div.toolbar-shortcuts ul li a.active:hover,
+div#toolbar div.toolbar-shortcuts ul li a.active {
+  background: #000;
+}
+
+div#toolbar div.toolbar-shortcuts span.icon {
+  float: left; /* LTR */
+  background: #444;
+  width: 30px;
+  height: 30px;
+  margin-right: 5px; /* LTR */
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  border-radius: 5px;
+}
+
+div.add-or-remove-shortcuts {
+  padding-top: 5px;
+}
+
+div.add-or-remove-shortcuts a span.icon {
+  display: block;
+  width: 12px;
+  background: transparent url(shortcut.png) no-repeat scroll 0 0;
+  height: 12px;
+  float: left;
+  margin-left:8px;
+}
+
+div.add-shortcut a:focus span.icon,
+div.add-shortcut a:hover span.icon {
+  background-position: 0 -12px;
+}
+div.remove-shortcut a span.icon {
+  background-position: -12px 0;
+}
+div.remove-shortcut a:focus span.icon,
+div.remove-shortcut a:hover span.icon {
+  background-position: -12px -12px;
+}
+
+div.add-or-remove-shortcuts a span.text {
+  float: left;
+  padding-left:10px;
+  display: none;
+}
+
+div.add-or-remove-shortcuts a:focus span.text,
+div.add-or-remove-shortcuts a:hover span.text {
+  font-size: 10px;
+  line-height: 12px;
+  color: #fff;
+  background-color: #5f605b;
+  display: block;
+  padding-right: 6px; /* LTR */
+  cursor: pointer;
+  -moz-border-radius: 0 5px 5px 0; /* LTR */
+  -webkit-border-top-right-radius: 5px; /* LTR */
+  -webkit-border-bottom-right-radius: 5px; /* LTR */
+  border-radius: 0 5px 5px 0; /* LTR */
+}
+
+#shortcut-set-switch .form-type-radios {
+  padding-bottom: 0;
+  margin-bottom: 0;
+}
+
+#shortcut-set-switch .form-item-new {
+  padding-top: 0;
+  padding-left: 17px; /* LTR */
+}
diff --git a/htmltest/modules/shortcut/shortcut.info b/htmltest/modules/shortcut/shortcut.info
new file mode 100644
index 00000000..35a43ba6
--- /dev/null
+++ b/htmltest/modules/shortcut/shortcut.info
@@ -0,0 +1,13 @@
+name = Shortcut
+description = Allows users to manage customizable lists of shortcut links.
+package = Core
+version = VERSION
+core = 7.x
+files[] = shortcut.test
+configure = admin/config/user-interface/shortcut
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/shortcut/shortcut.install b/htmltest/modules/shortcut/shortcut.install
new file mode 100644
index 00000000..60ee6be8
--- /dev/null
+++ b/htmltest/modules/shortcut/shortcut.install
@@ -0,0 +1,115 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the shortcut module.
+ */
+
+/**
+ * Implements hook_install().
+ */
+function shortcut_install() {
+  $t = get_t();
+  // Create an initial default shortcut set.
+  $shortcut_set = new stdClass();
+  $shortcut_set->title = $t('Default');
+  $shortcut_set->links = array(
+    array(
+      'link_path' => 'node/add',
+      'link_title' => $t('Add content'),
+      'weight' => -20,
+    ),
+    array(
+      'link_path' => 'admin/content',
+      'link_title' => $t('Find content'),
+      'weight' => -19,
+    ),
+  );
+  // If Drupal is being installed, rebuild the menu before saving the shortcut
+  // set, to make sure the links defined above can be correctly saved. (During
+  // installation, the menu might not have been built at all yet, or it might
+  // have been built but without the node module's links in it.)
+  if (drupal_installation_attempted()) {
+    menu_rebuild();
+  }
+  shortcut_set_save($shortcut_set);
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function shortcut_uninstall() {
+  drupal_load('module', 'shortcut');
+  // Delete the menu links associated with each shortcut set.
+  foreach (shortcut_sets() as $shortcut_set) {
+    menu_delete_links($shortcut_set->set_name);
+  }
+}
+
+/**
+ * Implements hook_schema().
+ */
+function shortcut_schema() {
+  $schema['shortcut_set'] = array(
+    'description' => 'Stores information about sets of shortcuts links.',
+    'fields' => array(
+      'set_name' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => "Primary Key: The {menu_links}.menu_name under which the set's links are stored.",
+      ),
+      'title' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The title of the set.',
+      ),
+    ),
+    'primary key' => array('set_name'),
+    'foreign keys' => array(
+      'menu_name' => array(
+        'table' => 'menu_links',
+        'columns' => array('set_name' => 'menu_name'),
+      ),
+    ),
+  );
+
+  $schema['shortcut_set_users'] = array(
+    'description' => 'Maps users to shortcut sets.',
+    'fields' => array(
+      'uid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {users}.uid for this set.',
+      ),
+      'set_name' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => "The {shortcut_set}.set_name that will be displayed for this user.",
+      ),
+    ),
+    'primary key' => array('uid'),
+    'indexes' => array(
+      'set_name' => array('set_name'),
+    ),
+    'foreign keys' => array(
+      'set_user' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid'),
+      ),
+      'set_name' => array(
+        'table' => 'shortcut_set',
+        'columns' => array('set_name' => 'set_name'),
+      ),
+    ),
+  );
+
+  return $schema;
+}
diff --git a/htmltest/modules/shortcut/shortcut.module b/htmltest/modules/shortcut/shortcut.module
new file mode 100644
index 00000000..2f6db0ad
--- /dev/null
+++ b/htmltest/modules/shortcut/shortcut.module
@@ -0,0 +1,767 @@
+<?php
+
+/**
+ * @file
+ * Allows users to manage customizable lists of shortcut links.
+ */
+
+/**
+ * The name of the default shortcut set.
+ *
+ * This set will be displayed to any user that does not have another set
+ * assigned, unless overridden by a hook_shortcut_default_set() implementation.
+ */
+define('SHORTCUT_DEFAULT_SET_NAME', 'shortcut-set-1');
+
+/**
+ * Implements hook_help().
+ */
+function shortcut_help($path, $arg) {
+  global $user;
+
+  switch ($path) {
+    case 'admin/help#shortcut':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Shortcut module allows users to create sets of <em>shortcut</em> links to commonly-visited pages of the site. Shortcuts are contained within <em>sets</em>. Each user with <em>Select any shortcut set</em> permission can select a shortcut set created by anyone at the site. For more information, see the online handbook entry for <a href="@shortcut">Shortcut module</a>.', array('@shortcut' => 'http://drupal.org/documentation/modules/shortcut/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl><dt>' . t('Administering shortcuts') . '</dt>';
+      $output .= '<dd>' . t('Users with the <em>Administer shortcuts</em> permission can manage shortcut sets and edit the shortcuts within sets from the <a href="@shortcuts">Shortcuts administration page</a>.', array('@shortcuts' => url('admin/config/user-interface/shortcut'))) . '</dd>';
+      $output .= '<dt>' . t('Choosing shortcut sets') . '</dt>';
+      $output .= '<dd>' . t('Users with permission to switch shortcut sets can choose a shortcut set to use from the Shortcuts tab of their user account page.') . '</dd>';
+      $output .= '<dt>' . t('Adding and removing shortcuts') . '</dt>';
+      $output .= '<dd>' . t('The Shortcut module creates an add/remove link for each page on your site; the link lets you add or remove the current page from the currently-enabled set of shortcuts (if your theme displays it and you have permission to edit your shortcut set). The core Seven administration theme displays this link next to the page title, as a small + or - sign. If you click on the + sign, you will add that page to your preferred set of shortcuts. If the page is already part of your shortcut set, the link will be a - sign, and will allow you to remove the current page from your shortcut set.') . '</dd>';
+      $output .= '<dt>' . t('Displaying shortcuts') . '</dt>';
+      $output .= '<dd>' . t('You can display your shortcuts by enabling the Shortcuts block on the <a href="@blocks">Blocks administration page</a>. Certain administrative modules also display your shortcuts; for example, the core <a href="@toolbar-help">Toolbar module</a> displays them near the top of the page, along with an <em>Edit shortcuts</em> link.', array('@blocks' => url('admin/structure/block'), '@toolbar-help' => url('admin/help/toolbar'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+
+    case 'admin/config/user-interface/shortcut':
+    case 'admin/config/user-interface/shortcut/%':
+      if (user_access('switch shortcut sets')) {
+        $output = '<p>' . t('Define which shortcut set you are using on the <a href="@shortcut-link">Shortcuts tab</a> of your account page.', array('@shortcut-link' => url("user/{$user->uid}/shortcuts"))) . '</p>';
+        return $output;
+      }
+  }
+}
+
+/**
+ * Implements hook_permission().
+ */
+function shortcut_permission() {
+  return array(
+    'administer shortcuts' => array(
+      'title' => t('Administer shortcuts'),
+    ),
+    'customize shortcut links' => array(
+      'title' => t('Edit current shortcut set'),
+      'description' => t('Editing the current shortcut set will affect other users if that set has been assigned to or selected by other users. Granting "Select any shortcut set" permission along with this permission will grant permission to edit any shortcut set.'),
+    ),
+    'switch shortcut sets' => array(
+      'title' => t('Select any shortcut set'),
+      'description' => t('From all shortcut sets, select one to be own active set. Without this permission, an administrator selects shortcut sets for users.'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_menu().
+ */
+function shortcut_menu() {
+  $items['admin/config/user-interface/shortcut'] = array(
+    'title' => 'Shortcuts',
+    'description' => 'Add and modify shortcut sets.',
+    'page callback' => 'shortcut_set_admin',
+    'access arguments' => array('administer shortcuts'),
+    'file' => 'shortcut.admin.inc',
+  );
+  $items['admin/config/user-interface/shortcut/add-set'] = array(
+    'title' => 'Add shortcut set',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('shortcut_set_add_form'),
+    'access arguments' => array('administer shortcuts'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'shortcut.admin.inc',
+  );
+  $items['admin/config/user-interface/shortcut/%shortcut_set'] = array(
+    'title' => 'Edit shortcuts',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('shortcut_set_customize', 4),
+    'title callback' => 'shortcut_set_title_callback',
+    'title arguments' => array(4),
+    'access callback' => 'shortcut_set_edit_access',
+    'access arguments' => array(4),
+    'file' => 'shortcut.admin.inc',
+  );
+  $items['admin/config/user-interface/shortcut/%shortcut_set/links'] = array(
+    'title' => 'List links',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $items['admin/config/user-interface/shortcut/%shortcut_set/edit'] = array(
+    'title' => 'Edit set name',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('shortcut_set_edit_form', 4),
+    'access callback' => 'shortcut_set_edit_access',
+    'access arguments' => array(4),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'shortcut.admin.inc',
+    'weight' => 10,
+  );
+  $items['admin/config/user-interface/shortcut/%shortcut_set/delete'] = array(
+    'title' => 'Delete shortcut set',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('shortcut_set_delete_form', 4),
+    'access callback' => 'shortcut_set_delete_access',
+    'access arguments' => array(4),
+    'file' => 'shortcut.admin.inc',
+  );
+  $items['admin/config/user-interface/shortcut/%shortcut_set/add-link'] = array(
+    'title' => 'Add shortcut',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('shortcut_link_add', 4),
+    'access callback' => 'shortcut_set_edit_access',
+    'access arguments' => array(4),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'shortcut.admin.inc',
+  );
+  $items['admin/config/user-interface/shortcut/%shortcut_set/add-link-inline'] = array(
+    'title' => 'Add shortcut',
+    'page callback' => 'shortcut_link_add_inline',
+    'page arguments' => array(4),
+    'access callback' => 'shortcut_set_edit_access',
+    'access arguments' => array(4),
+    'type' => MENU_CALLBACK,
+    'file' => 'shortcut.admin.inc',
+  );
+  $items['admin/config/user-interface/shortcut/link/%menu_link'] = array(
+    'title' => 'Edit shortcut',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('shortcut_link_edit', 5),
+    'access callback' => 'shortcut_link_access',
+    'access arguments' => array(5),
+    'file' => 'shortcut.admin.inc',
+  );
+  $items['admin/config/user-interface/shortcut/link/%menu_link/delete'] = array(
+    'title' => 'Delete shortcut',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('shortcut_link_delete', 5),
+    'access callback' => 'shortcut_link_access',
+    'access arguments' => array(5),
+    'file' => 'shortcut.admin.inc',
+  );
+  $items['user/%user/shortcuts'] = array(
+    'title' => 'Shortcuts',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('shortcut_set_switch', 1),
+    'access callback' => 'shortcut_set_switch_access',
+    'access arguments' => array(1),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'shortcut.admin.inc',
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_admin_paths().
+ */
+function shortcut_admin_paths() {
+  $paths = array(
+    'user/*/shortcuts' => TRUE,
+  );
+  return $paths;
+}
+
+/**
+ * Implements hook_theme().
+ */
+function shortcut_theme() {
+  return array(
+    'shortcut_set_customize' => array(
+      'render element' => 'form',
+      'file' => 'shortcut.admin.inc',
+    ),
+  );
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function shortcut_block_info() {
+  $blocks['shortcuts']['info'] = t('Shortcuts');
+  // Shortcut blocks can't be cached because each menu item can have a custom
+  // access callback. menu.inc manages its own caching.
+  $blocks['shortcuts']['cache'] = DRUPAL_NO_CACHE;
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_view().
+ */
+function shortcut_block_view($delta = '') {
+  if ($delta == 'shortcuts') {
+    $shortcut_set = shortcut_current_displayed_set();
+    $data['subject'] = t('@shortcut_set shortcuts', array('@shortcut_set' => $shortcut_set->title));
+    $data['content'] = shortcut_renderable_links($shortcut_set);
+    return $data;
+  }
+}
+
+/**
+ * Access callback for editing a shortcut set.
+ *
+ * @param object $shortcut_set
+ *   (optional) The shortcut set to be edited. If not set, the current user's
+ *   shortcut set will be used.
+ *
+ * @return
+ *   TRUE if the current user has access to edit the shortcut set, FALSE
+ *   otherwise.
+ */
+function shortcut_set_edit_access($shortcut_set = NULL) {
+  // Sufficiently-privileged users can edit their currently displayed shortcut
+  // set, but not other sets. Shortcut administrators can edit any set.
+  if (user_access('administer shortcuts')) {
+    return TRUE;
+  }
+  if (user_access('customize shortcut links')) {
+    return !isset($shortcut_set) || $shortcut_set == shortcut_current_displayed_set();
+  }
+  return FALSE;
+}
+
+/**
+ * Access callback for deleting a shortcut set.
+ *
+ * @param $shortcut_set
+ *   The shortcut set to be deleted.
+ *
+ * @return
+ *   TRUE if the current user has access to delete shortcut sets and this is
+ *   not the site-wide default set; FALSE otherwise.
+ */
+function shortcut_set_delete_access($shortcut_set) {
+  // Only admins can delete sets.
+  if (!user_access('administer shortcuts')) {
+    return FALSE;
+  }
+
+  // Never let the default shortcut set be deleted.
+  if ($shortcut_set->set_name == SHORTCUT_DEFAULT_SET_NAME) {
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+/**
+ * Access callback for switching the shortcut set assigned to a user account.
+ *
+ * @param object $account
+ *   (optional) The user account whose shortcuts will be switched. If not set,
+ *   permissions will be checked for switching the logged-in user's own
+ *   shortcut set.
+ *
+ * @return
+ *   TRUE if the current user has access to switch the shortcut set of the
+ *   provided account, FALSE otherwise.
+ */
+function shortcut_set_switch_access($account = NULL) {
+  global $user;
+
+  if (user_access('administer shortcuts')) {
+    // Administrators can switch anyone's shortcut set.
+    return TRUE;
+  }
+
+  if (!user_access('switch shortcut sets')) {
+    // The user has no permission to switch anyone's shortcut set.
+    return FALSE;
+  }
+
+  if (!isset($account) || $user->uid == $account->uid) {
+    // Users with the 'switch shortcut sets' permission can switch their own
+    // shortcuts sets.
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+/**
+ * Access callback for editing a link in a shortcut set.
+ */
+function shortcut_link_access($menu_link) {
+  // The link must belong to a shortcut set that the current user has access
+  // to edit.
+  if ($shortcut_set = shortcut_set_load($menu_link['menu_name'])) {
+    return shortcut_set_edit_access($shortcut_set);
+  }
+  return FALSE;
+}
+
+/**
+ * Loads the data for a shortcut set.
+ *
+ * @param $set_name
+ *   The name of the shortcut set to load.
+ *
+ * @return object
+ *   If the shortcut set exists, an object containing the following properties:
+ *   - 'set_name': The internal name of the shortcut set.
+ *   - 'title': The title of the shortcut set.
+ *   - 'links': An array of links associated with this shortcut set.
+ *   If the shortcut set does not exist, the function returns FALSE.
+ */
+function shortcut_set_load($set_name) {
+  $set = db_select('shortcut_set', 'ss')
+  ->fields('ss')
+  ->condition('set_name', $set_name)
+  ->execute()
+  ->fetchObject();
+  if (!$set) {
+    return FALSE;
+  }
+  $set->links = menu_load_links($set_name);
+  return $set;
+}
+
+/**
+ * Saves a shortcut set.
+ *
+ * @param $shortcut_set
+ *   An object containing the following properties:
+ *   - 'title': The title of the shortcut set.
+ *   - 'set_name': (optional) The internal name of the shortcut set. If
+ *     omitted, a new shortcut set will be created, and the 'set_name' property
+ *     will be added to the passed-in object.
+ *   - 'links': (optional) An array of menu links to save for the shortcut set.
+ *     Each link is an array containing at least the following keys (which will
+ *     be expanded to fill in other default values after the shortcut set is
+ *     saved):
+ *     - 'link_path': The Drupal path or external path that the link points to.
+ *     - 'link_title': The title of the link.
+ *     Any other keys accepted by menu_link_save() may also be provided.
+ *
+ * @return
+ *   A constant which is either SAVED_NEW or SAVED_UPDATED depending on whether
+ *   a new set was created or an existing one was updated.
+ *
+ * @see menu_link_save()
+ */
+function shortcut_set_save(&$shortcut_set) {
+  // First save the shortcut set itself.
+  if (isset($shortcut_set->set_name)) {
+    $return = drupal_write_record('shortcut_set', $shortcut_set, 'set_name');
+  }
+  else {
+    $shortcut_set->set_name = shortcut_set_get_unique_name();
+    $return = drupal_write_record('shortcut_set', $shortcut_set);
+  }
+  // If links were provided for the set, save them.
+  if (isset($shortcut_set->links)) {
+    foreach ($shortcut_set->links as &$link) {
+      // Do not specifically associate these links with the shortcut module,
+      // since other modules may make them editable via the menu system.
+      // However, we do need to specify the correct menu name.
+      $link['menu_name'] = $shortcut_set->set_name;
+      $link['plid'] = 0;
+      menu_link_save($link);
+    }
+    // Make sure that we have a return value, since if the links were updated
+    // but the shortcut set was not, the call to drupal_write_record() above
+    // would not return an indication that anything had changed.
+    if (empty($return)) {
+      $return = SAVED_UPDATED;
+    }
+  }
+  return $return;
+}
+
+/**
+ * Deletes a shortcut set.
+ *
+ * Note that the default set cannot be deleted.
+ *
+ * @param $shortcut_set
+ *   An object representing the shortcut set to delete.
+ *
+ * @return
+ *   TRUE if the set was deleted, FALSE otherwise.
+ */
+function shortcut_set_delete($shortcut_set) {
+  // Don't allow deletion of the system default shortcut set.
+  if ($shortcut_set->set_name == SHORTCUT_DEFAULT_SET_NAME) {
+    return FALSE;
+  }
+
+  // First, delete any user assignments for this set, so that each of these
+  // users will go back to using whatever default set applies.
+  db_delete('shortcut_set_users')
+    ->condition('set_name', $shortcut_set->set_name)
+    ->execute();
+
+  // Next, delete the menu links for this set.
+  menu_delete_links($shortcut_set->set_name);
+
+  // Finally, delete the set itself.
+  $deleted = db_delete('shortcut_set')
+    ->condition('set_name', $shortcut_set->set_name)
+    ->execute();
+
+  return (bool) $deleted;
+}
+
+/**
+ * Resets the link weights in a shortcut set to match their current order.
+ *
+ * This function can be used, for example, when a new shortcut link is added to
+ * the set. If the link is added to the end of the array and this function is
+ * called, it will force that link to display at the end of the list.
+ *
+ * @param object $shortcut_set
+ *   An object representing a shortcut set. The link weights of the passed-in
+ *   object will be reset as described above.
+ */
+function shortcut_set_reset_link_weights(&$shortcut_set) {
+  $weight = -50;
+  foreach ($shortcut_set->links as &$link) {
+    $link['weight'] = $weight;
+    $weight++;
+  }
+}
+
+/**
+ * Assigns a user to a particular shortcut set.
+ *
+ * @param $shortcut_set
+ *   An object representing the shortcut set.
+ * @param $account
+ *   A user account that will be assigned to use the set.
+ */
+function shortcut_set_assign_user($shortcut_set, $account) {
+  db_merge('shortcut_set_users')
+    ->key(array('uid' => $account->uid))
+    ->fields(array('set_name' => $shortcut_set->set_name))
+    ->execute();
+  drupal_static_reset('shortcut_current_displayed_set');
+}
+
+/**
+ * Unassigns a user from any shortcut set they may have been assigned to.
+ *
+ * The user will go back to using whatever default set applies.
+ *
+ * @param $account
+ *   A user account that will be removed from the shortcut set assignment.
+ *
+ * @return
+ *   TRUE if the user was previously assigned to a shortcut set and has been
+ *   successfully removed from it. FALSE if the user was already not assigned
+ *   to any set.
+ */
+function shortcut_set_unassign_user($account) {
+  $deleted = db_delete('shortcut_set_users')
+    ->condition('uid', $account->uid)
+    ->execute();
+  return (bool) $deleted;
+}
+
+/**
+ * Returns the current displayed shortcut set for the provided user account.
+ *
+ * @param $account
+ *   (optional) The user account whose shortcuts will be returned. Defaults to
+ *   the currently logged-in user.
+ *
+ * @return
+ *   An object representing the shortcut set that should be displayed to the
+ *   current user. If the user does not have an explicit shortcut set defined,
+ *   the default set is returned.
+ */
+function shortcut_current_displayed_set($account = NULL) {
+  $shortcut_sets = &drupal_static(__FUNCTION__, array());
+  global $user;
+  if (!isset($account)) {
+    $account = $user;
+  }
+  // Try to return a shortcut set from the static cache.
+  if (isset($shortcut_sets[$account->uid])) {
+    return $shortcut_sets[$account->uid];
+  }
+  // If none was found, try to find a shortcut set that is explicitly assigned
+  // to this user.
+  $query = db_select('shortcut_set', 's');
+  $query->addField('s', 'set_name');
+  $query->join('shortcut_set_users', 'u', 's.set_name = u.set_name');
+  $query->condition('u.uid', $account->uid);
+  $shortcut_set_name = $query->execute()->fetchField();
+  if ($shortcut_set_name) {
+    $shortcut_set = shortcut_set_load($shortcut_set_name);
+  }
+  // Otherwise, use the default set.
+  else {
+    $shortcut_set = shortcut_default_set($account);
+  }
+
+  $shortcut_sets[$account->uid] = $shortcut_set;
+  return $shortcut_set;
+}
+
+/**
+ * Returns the default shortcut set for a given user account.
+ *
+ * @param object $account
+ *   (optional) The user account whose default shortcut set will be returned.
+ *   If not provided, the function will return the currently logged-in user's
+ *   default shortcut set.
+ *
+ * @return
+ *   An object representing the default shortcut set.
+ */
+function shortcut_default_set($account = NULL) {
+  global $user;
+  if (!isset($account)) {
+    $account = $user;
+  }
+
+  // Allow modules to return a default shortcut set name. Since we can only
+  // have one, we allow the last module which returns a valid result to take
+  // precedence. If no module returns a valid set, fall back on the site-wide
+  // default, which is the lowest-numbered shortcut set.
+  $suggestions = array_reverse(module_invoke_all('shortcut_default_set', $account));
+  $suggestions[] = SHORTCUT_DEFAULT_SET_NAME;
+  foreach ($suggestions as $name) {
+    if ($shortcut_set = shortcut_set_load($name)) {
+      break;
+    }
+  }
+
+  return $shortcut_set;
+}
+
+/**
+ * Returns a unique, machine-readable shortcut set name.
+ */
+function shortcut_set_get_unique_name() {
+  // Shortcut sets are numbered sequentially, so we keep trying until we find
+  // one that is available. For better performance, we start with a number
+  // equal to one more than the current number of shortcut sets, so that if
+  // no shortcut sets have been deleted from the database, this will
+  // automatically give us the correct one.
+  $number = db_query("SELECT COUNT(*) FROM {shortcut_set}")->fetchField() + 1;
+  do {
+    $name = shortcut_set_name($number);
+    $number++;
+  } while ($shortcut_set = shortcut_set_load($name));
+  return $name;
+}
+
+/**
+ * Returns the name of a shortcut set, based on a provided number.
+ *
+ * All shortcut sets have names like "shortcut-set-N" so that they can be
+ * matched with a properly-namespaced entry in the {menu_links} table.
+ *
+ * @param $number
+ *   A number representing the shortcut set whose name should be retrieved.
+ *
+ * @return
+ *   A string representing the expected shortcut name.
+ */
+function shortcut_set_name($number) {
+  return "shortcut-set-$number";
+}
+
+/**
+ * Returns an array of all shortcut sets, keyed by the set name.
+ *
+ * @return
+ *   An array of shortcut sets. Note that only the basic shortcut set
+ *   properties (name and title) are returned by this function, not the list
+ *   of menu links that belong to the set.
+ */
+function shortcut_sets() {
+  return db_select('shortcut_set', 'ss')
+  ->fields('ss')
+  ->execute()
+  ->fetchAllAssoc('set_name');
+}
+
+/**
+ * Check to see if a shortcut set with the given title already exists.
+ *
+ * @param $title
+ *   Human-readable name of the shortcut set to check.
+ *
+ * @return
+ *   TRUE if a shortcut set with that title exists; FALSE otherwise.
+ */
+function shortcut_set_title_exists($title) {
+  return (bool) db_query_range('SELECT 1 FROM {shortcut_set} WHERE title = :title', 0, 1, array(':title' => $title))->fetchField();
+}
+
+/**
+ * Determines if a path corresponds to a valid shortcut link.
+ *
+ * @param $path
+ *   The path to the link.
+ * @return
+ *   TRUE if the shortcut link is valid, FALSE otherwise. Valid links are ones
+ *   that correspond to actual paths on the site.
+ *
+ * @see menu_edit_item_validate()
+ */
+function shortcut_valid_link($path) {
+  // Do not use URL aliases.
+  $normal_path = drupal_get_normal_path($path);
+  if ($path != $normal_path) {
+    $path = $normal_path;
+  }
+  // An empty path is valid too and will be converted to <front>.
+  return (!url_is_external($path) && menu_get_item($path)) || empty($path) || $path == '<front>';
+}
+
+/**
+ * Returns an array of shortcut links, suitable for rendering.
+ *
+ * @param $shortcut_set
+ *   (optional) An object representing the set whose links will be displayed.
+ *   If not provided, the user's current set will be displayed.
+ * @return
+ *   An array of shortcut links, in the format returned by the menu system.
+ *
+ * @see menu_tree()
+ */
+function shortcut_renderable_links($shortcut_set = NULL) {
+  if (!isset($shortcut_set)) {
+    $shortcut_set = shortcut_current_displayed_set();
+  }
+  return menu_tree($shortcut_set->set_name);
+}
+
+/**
+ * Implements hook_preprocess_page().
+ */
+function shortcut_preprocess_page(&$variables) {
+  // Only display the shortcut link if the user has the ability to edit
+  // shortcuts and if the page's actual content is being shown (for example,
+  // we do not want to display it on "access denied" or "page not found"
+  // pages).
+  if (shortcut_set_edit_access() && ($item = menu_get_item()) && $item['access']) {
+    $link = $_GET['q'];
+    $query_parameters = drupal_get_query_parameters();
+    if (!empty($query_parameters)) {
+     $link .= '?' . drupal_http_build_query($query_parameters);
+    }
+    $query = array(
+     'link' => $link,
+     'name' => drupal_get_title(),
+    );
+    $query += drupal_get_destination();
+
+    $shortcut_set = shortcut_current_displayed_set();
+
+    // Check if $link is already a shortcut and set $link_mode accordingly.
+    foreach ($shortcut_set->links as $shortcut) {
+      if ($link == $shortcut['link_path']) {
+        $mlid = $shortcut['mlid'];
+        break;
+      }
+    }
+    $link_mode = isset($mlid) ? "remove" : "add";
+
+    if ($link_mode == "add") {
+      $query['token'] = drupal_get_token('shortcut-add-link');
+      $link_text = shortcut_set_switch_access() ? t('Add to %shortcut_set shortcuts', array('%shortcut_set' => $shortcut_set->title)) : t('Add to shortcuts');
+      $link_path = 'admin/config/user-interface/shortcut/' . $shortcut_set->set_name . '/add-link-inline';
+    }
+    else {
+      $query['mlid'] = $mlid;
+      $link_text = shortcut_set_switch_access() ? t('Remove from %shortcut_set shortcuts', array('%shortcut_set' => $shortcut_set->title)) : t('Remove from shortcuts');
+      $link_path = 'admin/config/user-interface/shortcut/link/' . $mlid . '/delete';
+    }
+
+    if (theme_get_setting('shortcut_module_link')) {
+      $variables['title_suffix']['add_or_remove_shortcut'] = array(
+        '#attached' => array('css' => array(drupal_get_path('module', 'shortcut') . '/shortcut.css')),
+        '#prefix' => '<div class="add-or-remove-shortcuts ' . $link_mode . '-shortcut">',
+        '#type' => 'link',
+        '#title' => '<span class="icon"></span><span class="text">' . $link_text . '</span>',
+        '#href' => $link_path,
+        '#options' => array('query' => $query, 'html' => TRUE),
+        '#suffix' => '</div>',
+      );
+    }
+  }
+}
+
+/**
+ * Implements hook_page_alter().
+ */
+function shortcut_page_alter(&$page) {
+  if (isset($page['page_top']['toolbar'])) {
+    // If the toolbar is available, add a pre-render function to display the
+    // current shortcuts in the toolbar drawer.
+    $page['page_top']['toolbar']['#pre_render'][] = 'shortcut_toolbar_pre_render';
+  }
+}
+
+/**
+ * Pre-render function for adding shortcuts to the toolbar drawer.
+ */
+function shortcut_toolbar_pre_render($toolbar) {
+  $links = shortcut_renderable_links();
+  $links['#attached'] = array('css' => array(drupal_get_path('module', 'shortcut') . '/shortcut.css'));
+  $links['#prefix'] = '<div class="toolbar-shortcuts">';
+  $links['#suffix'] = '</div>';
+  $shortcut_set = shortcut_current_displayed_set();
+  $configure_link = NULL;
+  if (shortcut_set_edit_access($shortcut_set)) {
+    $configure_link = array(
+      '#type' => 'link',
+      '#title' => t('Edit shortcuts'),
+      '#href' => 'admin/config/user-interface/shortcut/' . $shortcut_set->set_name,
+      '#options' => array('attributes' => array('id' => 'edit-shortcuts')),
+    );
+  }
+
+  $drawer = array(
+    'shortcuts' => $links,
+    'configure' => $configure_link,
+  );
+
+  $toolbar['toolbar_drawer'][] = $drawer;
+  return $toolbar;
+}
+
+/**
+ * Returns the sanitized title of a shortcut set.
+ *
+ * Deprecated. This function was previously used as a menu item title callback
+ * but has been replaced by shortcut_set_title_callback() (which does not
+ * sanitize the title, since the menu system does that automatically). In
+ * Drupal 7, use that function for title callbacks, and call check_plain()
+ * directly if you need a sanitized title. In Drupal 8, this function will be
+ * restored as a title callback and therefore will no longer sanitize its
+ * output.
+ *
+ * @param $shortcut_set
+ *   An object representing the shortcut set, as returned by
+ *   shortcut_set_load().
+ */
+function shortcut_set_title($shortcut_set) {
+  return check_plain($shortcut_set->title);
+}
+
+/**
+ * Returns the title of a shortcut set.
+ *
+ * Title callback for the editing pages for shortcut sets.
+ *
+ * @param $shortcut_set
+ *   An object representing the shortcut set, as returned by
+ *   shortcut_set_load().
+ */
+function shortcut_set_title_callback($shortcut_set) {
+  return $shortcut_set->title;
+}
diff --git a/htmltest/modules/shortcut/shortcut.png b/htmltest/modules/shortcut/shortcut.png
new file mode 100644
index 00000000..2924557b
Binary files /dev/null and b/htmltest/modules/shortcut/shortcut.png differ
diff --git a/htmltest/modules/shortcut/shortcut.test b/htmltest/modules/shortcut/shortcut.test
new file mode 100644
index 00000000..2bd9605c
--- /dev/null
+++ b/htmltest/modules/shortcut/shortcut.test
@@ -0,0 +1,371 @@
+<?php
+
+/**
+ * @file
+ * Tests for shortcut.module.
+ */
+
+/**
+ * Defines base class for shortcut test cases.
+ */
+class ShortcutTestCase extends DrupalWebTestCase {
+
+  /**
+   * User with permission to administer shortcuts.
+   */
+  protected $admin_user;
+
+  /**
+   * User with permission to use shortcuts, but not administer them.
+   */
+  protected $shortcut_user;
+
+  /**
+   * Generic node used for testing.
+   */
+  protected $node;
+
+  /**
+   * Site-wide default shortcut set.
+   */
+  protected $set;
+
+  function setUp() {
+    parent::setUp('toolbar', 'shortcut');
+    // Create users.
+    $this->admin_user = $this->drupalCreateUser(array('access toolbar', 'administer shortcuts', 'view the administration theme', 'create article content', 'create page content', 'access content overview'));
+    $this->shortcut_user = $this->drupalCreateUser(array('customize shortcut links', 'switch shortcut sets'));
+
+    // Create a node.
+    $this->node = $this->drupalCreateNode(array('type' => 'article'));
+
+    // Log in as admin and grab the default shortcut set.
+    $this->drupalLogin($this->admin_user);
+    $this->set = shortcut_set_load(SHORTCUT_DEFAULT_SET_NAME);
+    shortcut_set_assign_user($this->set, $this->admin_user);
+  }
+
+  /**
+   * Creates a generic shortcut set.
+   */
+  function generateShortcutSet($title = '', $default_links = TRUE) {
+    $set = new stdClass();
+    $set->title = empty($title) ? $this->randomName(10) : $title;
+    if ($default_links) {
+      $set->links = array();
+      $set->links[] = $this->generateShortcutLink('node/add');
+      $set->links[] = $this->generateShortcutLink('admin/content');
+    }
+    shortcut_set_save($set);
+
+    return $set;
+  }
+
+  /**
+   * Creates a generic shortcut link.
+   */
+  function generateShortcutLink($path, $title = '') {
+    $link = array(
+      'link_path' => $path,
+      'link_title' => !empty($title) ? $title : $this->randomName(10),
+    );
+
+    return $link;
+  }
+
+  /**
+   * Extracts information from shortcut set links.
+   * 
+   * @param object $set
+   *   The shortcut set object to extract information from.
+   * @param string $key
+   *   The array key indicating what information to extract from each link:
+   *    - 'link_path': Extract link paths.
+   *    - 'link_title': Extract link titles.
+   *    - 'mlid': Extract the menu link item ID numbers.
+   *
+   * @return array
+   *   Array of the requested information from each link.
+   */
+  function getShortcutInformation($set, $key) {
+    $info = array();
+    foreach ($set->links as $link) {
+      $info[] = $link[$key];
+    }
+    return $info;
+  }
+}
+
+/**
+ * Defines shortcut links test cases.
+ */
+class ShortcutLinksTestCase extends ShortcutTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Shortcut link functionality',
+      'description' => 'Create, view, edit, delete, and change shortcut links.',
+      'group' => 'Shortcut',
+    );
+  }
+
+  /**
+   * Tests that creating a shortcut works properly.
+   */
+  function testShortcutLinkAdd() {
+    $set = $this->set;
+
+    // Create an alias for the node so we can test aliases.
+    $path = array(
+      'source' => 'node/' . $this->node->nid,
+      'alias' => $this->randomName(8),
+    );
+    path_save($path);
+
+    // Create some paths to test.
+    $test_cases = array(
+      array('path' => ''),
+      array('path' => 'admin'),
+      array('path' => 'admin/config/system/site-information'),
+      array('path' => "node/{$this->node->nid}/edit"),
+      array('path' => $path['alias']),
+    );
+
+    // Check that each new shortcut links where it should.
+    foreach ($test_cases as $test) {
+      $title = $this->randomName(10);
+      $form_data = array(
+        'shortcut_link[link_title]' => $title,
+        'shortcut_link[link_path]'  => $test['path'],
+      );
+      $this->drupalPost('admin/config/user-interface/shortcut/' . $set->set_name . '/add-link', $form_data, t('Save'));
+      $this->assertResponse(200);
+      $saved_set = shortcut_set_load($set->set_name);
+      $paths = $this->getShortcutInformation($saved_set, 'link_path');
+      $test_path = empty($test['path']) ? '<front>' : $test['path'];
+      $this->assertTrue(in_array(drupal_get_normal_path($test_path), $paths), 'Shortcut created: '. $test['path']);
+      $this->assertLink($title, 0, 'Shortcut link found on the page.');
+    }
+  }
+
+  /**
+   * Tests that the "add to shortcut" link changes to "remove shortcut".
+   */
+  function testShortcutQuickLink() {
+    $this->drupalGet($this->set->links[0]['link_path']);
+    $this->assertRaw(t('Remove from %title shortcuts', array('%title' => $this->set->title)), '"Add to shortcuts" link properly switched to "Remove from shortcuts".');
+  }
+
+  /**
+   * Tests that shortcut links can be renamed.
+   */
+  function testShortcutLinkRename() {
+    $set = $this->set;
+
+    // Attempt to rename shortcut link.
+    $new_link_name = $this->randomName(10);
+
+    $this->drupalPost('admin/config/user-interface/shortcut/link/' . $set->links[0]['mlid'], array('shortcut_link[link_title]' => $new_link_name, 'shortcut_link[link_path]' => $set->links[0]['link_path']), t('Save'));
+    $saved_set = shortcut_set_load($set->set_name);
+    $titles = $this->getShortcutInformation($saved_set, 'link_title');
+    $this->assertTrue(in_array($new_link_name, $titles), 'Shortcut renamed: ' . $new_link_name);
+    $this->assertLink($new_link_name, 0, 'Renamed shortcut link appears on the page.');
+  }
+
+  /**
+   * Tests that changing the path of a shortcut link works.
+   */
+  function testShortcutLinkChangePath() {
+    $set = $this->set;
+
+    // Tests changing a shortcut path.
+    $new_link_path = 'admin/config';
+
+    $this->drupalPost('admin/config/user-interface/shortcut/link/' . $set->links[0]['mlid'], array('shortcut_link[link_title]' => $set->links[0]['link_title'], 'shortcut_link[link_path]' => $new_link_path), t('Save'));
+    $saved_set = shortcut_set_load($set->set_name);
+    $paths = $this->getShortcutInformation($saved_set, 'link_path');
+    $this->assertTrue(in_array($new_link_path, $paths), 'Shortcut path changed: ' . $new_link_path);
+    $this->assertLinkByHref($new_link_path, 0, 'Shortcut with new path appears on the page.');
+  }
+
+  /**
+   * Tests deleting a shortcut link.
+   */
+  function testShortcutLinkDelete() {
+    $set = $this->set;
+
+    $this->drupalPost('admin/config/user-interface/shortcut/link/' . $set->links[0]['mlid'] . '/delete', array(), 'Delete');
+    $saved_set = shortcut_set_load($set->set_name);
+    $mlids = $this->getShortcutInformation($saved_set, 'mlid');
+    $this->assertFalse(in_array($set->links[0]['mlid'], $mlids), 'Successfully deleted a shortcut.');
+  }
+
+  /**
+   * Tests that the add shortcut link is not displayed for 404/403 errors.
+   *
+   * Tests that the "Add to shortcuts" link is not displayed on a page not
+   * found or a page the user does not have access to.
+   */
+  function testNoShortcutLink() {
+    // Change to a theme that displays shortcuts.
+    variable_set('theme_default', 'seven');
+
+    $this->drupalGet('page-that-does-not-exist');
+    $this->assertNoRaw('add-shortcut', 'Add to shortcuts link was not shown on a page not found.');
+
+    // The user does not have access to this path.
+    $this->drupalGet('admin/modules');
+    $this->assertNoRaw('add-shortcut', 'Add to shortcuts link was not shown on a page the user does not have access to.');
+
+    // Verify that the testing mechanism works by verifying the shortcut
+    // link appears on admin/content/node.
+    $this->drupalGet('admin/content/node');
+    $this->assertRaw('add-shortcut', 'Add to shortcuts link was shown on a page the user does have access to.');
+  }
+}
+
+/**
+ * Defines shortcut set test cases.
+ */
+class ShortcutSetsTestCase extends ShortcutTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Shortcut set functionality',
+      'description' => 'Create, view, edit, delete, and change shortcut sets.',
+      'group' => 'Shortcut',
+    );
+  }
+
+  /**
+   * Tests creating a shortcut set.
+   */
+  function testShortcutSetAdd() {
+    $new_set = $this->generateShortcutSet($this->randomName(10));
+    $sets = shortcut_sets();
+    $this->assertTrue(isset($sets[$new_set->set_name]), 'Successfully created a shortcut set.');
+    $this->drupalGet('user/' . $this->admin_user->uid . '/shortcuts');
+    $this->assertText($new_set->title, 'Generated shortcut set was listed as a choice on the user account page.');
+  }
+
+  /**
+   * Tests switching a user's own shortcut set.
+   */
+  function testShortcutSetSwitchOwn() {
+    $new_set = $this->generateShortcutSet($this->randomName(10));
+
+    // Attempt to switch the default shortcut set to the newly created shortcut
+    // set.
+    $this->drupalPost('user/' . $this->admin_user->uid . '/shortcuts', array('set' => $new_set->set_name), t('Change set'));
+    $this->assertResponse(200);
+    $current_set = shortcut_current_displayed_set($this->admin_user);
+    $this->assertTrue($new_set->set_name == $current_set->set_name, 'Successfully switched own shortcut set.');
+  }
+
+  /**
+   * Tests switching another user's shortcut set.
+   */
+  function testShortcutSetAssign() {
+    $new_set = $this->generateShortcutSet($this->randomName(10));
+
+    shortcut_set_assign_user($new_set, $this->shortcut_user);
+    $current_set = shortcut_current_displayed_set($this->shortcut_user);
+    $this->assertTrue($new_set->set_name == $current_set->set_name, "Successfully switched another user's shortcut set.");
+  }
+
+  /**
+   * Tests switching a user's shortcut set and creating one at the same time.
+   */
+  function testShortcutSetSwitchCreate() {
+    $edit = array(
+      'set' => 'new',
+      'new' => $this->randomName(10),
+    );
+    $this->drupalPost('user/' . $this->admin_user->uid . '/shortcuts', $edit, t('Change set'));
+    $current_set = shortcut_current_displayed_set($this->admin_user);
+    $this->assertNotEqual($current_set->set_name, $this->set->set_name, 'A shortcut set can be switched to at the same time as it is created.');
+    $this->assertEqual($current_set->title, $edit['new'], 'The new set is correctly assigned to the user.');
+  }
+
+  /**
+   * Tests switching a user's shortcut set without providing a new set name.
+   */
+  function testShortcutSetSwitchNoSetName() {
+    $edit = array('set' => 'new');
+    $this->drupalPost('user/' . $this->admin_user->uid . '/shortcuts', $edit, t('Change set'));
+    $this->assertText(t('The new set name is required.'));
+    $current_set = shortcut_current_displayed_set($this->admin_user);
+    $this->assertEqual($current_set->set_name, $this->set->set_name, 'Attempting to switch to a new shortcut set without providing a set name does not succeed.');
+  }
+
+  /**
+   * Tests that shortcut_set_save() correctly updates existing links.
+   */
+  function testShortcutSetSave() {
+    $set = $this->set;
+    $old_mlids = $this->getShortcutInformation($set, 'mlid');
+
+    $set->links[] = $this->generateShortcutLink('admin', $this->randomName(10));
+    shortcut_set_save($set);
+    $saved_set = shortcut_set_load($set->set_name);
+
+    $new_mlids = $this->getShortcutInformation($saved_set, 'mlid');
+    $this->assertTrue(count(array_intersect($old_mlids, $new_mlids)) == count($old_mlids), 'shortcut_set_save() did not inadvertently change existing mlids.');
+  }
+
+  /**
+   * Tests renaming a shortcut set.
+   */
+  function testShortcutSetRename() {
+    $set = $this->set;
+    
+    $new_title = $this->randomName(10);
+    $this->drupalPost('admin/config/user-interface/shortcut/' . $set->set_name . '/edit', array('title' => $new_title), t('Save'));
+    $set = shortcut_set_load($set->set_name);
+    $this->assertTrue($set->title == $new_title, 'Shortcut set has been successfully renamed.');
+  }
+
+  /**
+   * Tests renaming a shortcut set to the same name as another set.
+   */
+  function testShortcutSetRenameAlreadyExists() {
+    $set = $this->generateShortcutSet($this->randomName(10));
+    $existing_title = $this->set->title;
+    $this->drupalPost('admin/config/user-interface/shortcut/' . $set->set_name . '/edit', array('title' => $existing_title), t('Save'));
+    $this->assertRaw(t('The shortcut set %name already exists. Choose another name.', array('%name' => $existing_title)));
+    $set = shortcut_set_load($set->set_name);
+    $this->assertNotEqual($set->title, $existing_title, format_string('The shortcut set %title cannot be renamed to %new-title because a shortcut set with that title already exists.', array('%title' => $set->title, '%new-title' => $existing_title)));
+  }
+
+  /**
+   * Tests unassigning a shortcut set.
+   */
+  function testShortcutSetUnassign() {
+    $new_set = $this->generateShortcutSet($this->randomName(10));
+
+    shortcut_set_assign_user($new_set, $this->shortcut_user);
+    shortcut_set_unassign_user($this->shortcut_user);
+    $current_set = shortcut_current_displayed_set($this->shortcut_user);
+    $default_set = shortcut_default_set($this->shortcut_user);
+    $this->assertTrue($current_set->set_name == $default_set->set_name, "Successfully unassigned another user's shortcut set.");
+  }
+
+  /**
+   * Tests deleting a shortcut set.
+   */
+  function testShortcutSetDelete() {
+    $new_set = $this->generateShortcutSet($this->randomName(10));
+
+    $this->drupalPost('admin/config/user-interface/shortcut/' . $new_set->set_name . '/delete', array(), t('Delete'));
+    $sets = shortcut_sets();
+    $this->assertFalse(isset($sets[$new_set->set_name]), 'Successfully deleted a shortcut set.');
+  }
+
+  /**
+   * Tests deleting the default shortcut set.
+   */
+  function testShortcutSetDeleteDefault() {
+    $this->drupalGet('admin/config/user-interface/shortcut/' . SHORTCUT_DEFAULT_SET_NAME . '/delete');
+    $this->assertResponse(403);
+  }
+}
diff --git a/htmltest/modules/simpletest/drupal_web_test_case.php b/htmltest/modules/simpletest/drupal_web_test_case.php
new file mode 100644
index 00000000..6d0e59a4
--- /dev/null
+++ b/htmltest/modules/simpletest/drupal_web_test_case.php
@@ -0,0 +1,3706 @@
+<?php
+
+/**
+ * Global variable that holds information about the tests being run.
+ *
+ * An array, with the following keys:
+ *  - 'test_run_id': the ID of the test being run, in the form 'simpletest_%"
+ *  - 'in_child_site': TRUE if the current request is a cURL request from
+ *     the parent site.
+ *
+ * @var array
+ */
+global $drupal_test_info;
+
+/**
+ * Base class for Drupal tests.
+ *
+ * Do not extend this class, use one of the subclasses in this file.
+ */
+abstract class DrupalTestCase {
+  /**
+   * The test run ID.
+   *
+   * @var string
+   */
+  protected $testId;
+
+  /**
+   * The database prefix of this test run.
+   *
+   * @var string
+   */
+  protected $databasePrefix = NULL;
+
+  /**
+   * The original file directory, before it was changed for testing purposes.
+   *
+   * @var string
+   */
+  protected $originalFileDirectory = NULL;
+
+  /**
+   * Time limit for the test.
+   */
+  protected $timeLimit = 500;
+
+  /**
+   * Current results of this test case.
+   *
+   * @var Array
+   */
+  public $results = array(
+    '#pass' => 0,
+    '#fail' => 0,
+    '#exception' => 0,
+    '#debug' => 0,
+  );
+
+  /**
+   * Assertions thrown in that test case.
+   *
+   * @var Array
+   */
+  protected $assertions = array();
+
+  /**
+   * This class is skipped when looking for the source of an assertion.
+   *
+   * When displaying which function an assert comes from, it's not too useful
+   * to see "drupalWebTestCase->drupalLogin()', we would like to see the test
+   * that called it. So we need to skip the classes defining these helper
+   * methods.
+   */
+  protected $skipClasses = array(__CLASS__ => TRUE);
+
+  /**
+   * Flag to indicate whether the test has been set up.
+   *
+   * The setUp() method isolates the test from the parent Drupal site by
+   * creating a random prefix for the database and setting up a clean file
+   * storage directory. The tearDown() method then cleans up this test
+   * environment. We must ensure that setUp() has been run. Otherwise,
+   * tearDown() will act on the parent Drupal site rather than the test
+   * environment, destroying live data.
+   */
+  protected $setup = FALSE;
+
+  protected $setupDatabasePrefix = FALSE;
+
+  protected $setupEnvironment = FALSE;
+
+  /**
+   * Constructor for DrupalTestCase.
+   *
+   * @param $test_id
+   *   Tests with the same id are reported together.
+   */
+  public function __construct($test_id = NULL) {
+    $this->testId = $test_id;
+  }
+
+  /**
+   * Internal helper: stores the assert.
+   *
+   * @param $status
+   *   Can be 'pass', 'fail', 'exception'.
+   *   TRUE is a synonym for 'pass', FALSE for 'fail'.
+   * @param $message
+   *   The message string.
+   * @param $group
+   *   Which group this assert belongs to.
+   * @param $caller
+   *   By default, the assert comes from a function whose name starts with
+   *   'test'. Instead, you can specify where this assert originates from
+   *   by passing in an associative array as $caller. Key 'file' is
+   *   the name of the source file, 'line' is the line number and 'function'
+   *   is the caller function itself.
+   */
+  protected function assert($status, $message = '', $group = 'Other', array $caller = NULL) {
+    // Convert boolean status to string status.
+    if (is_bool($status)) {
+      $status = $status ? 'pass' : 'fail';
+    }
+
+    // Increment summary result counter.
+    $this->results['#' . $status]++;
+
+    // Get the function information about the call to the assertion method.
+    if (!$caller) {
+      $caller = $this->getAssertionCall();
+    }
+
+    // Creation assertion array that can be displayed while tests are running.
+    $this->assertions[] = $assertion = array(
+      'test_id' => $this->testId,
+      'test_class' => get_class($this),
+      'status' => $status,
+      'message' => $message,
+      'message_group' => $group,
+      'function' => $caller['function'],
+      'line' => $caller['line'],
+      'file' => $caller['file'],
+    );
+
+    // Store assertion for display after the test has completed.
+    try {
+      $connection = Database::getConnection('default', 'simpletest_original_default');
+    }
+    catch (DatabaseConnectionNotDefinedException $e) {
+      // If the test was not set up, the simpletest_original_default
+      // connection does not exist.
+      $connection = Database::getConnection('default', 'default');
+    }
+    $connection
+      ->insert('simpletest')
+      ->fields($assertion)
+      ->execute();
+
+    // We do not use a ternary operator here to allow a breakpoint on
+    // test failure.
+    if ($status == 'pass') {
+      return TRUE;
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  /**
+   * Store an assertion from outside the testing context.
+   *
+   * This is useful for inserting assertions that can only be recorded after
+   * the test case has been destroyed, such as PHP fatal errors. The caller
+   * information is not automatically gathered since the caller is most likely
+   * inserting the assertion on behalf of other code. In all other respects
+   * the method behaves just like DrupalTestCase::assert() in terms of storing
+   * the assertion.
+   *
+   * @return
+   *   Message ID of the stored assertion.
+   *
+   * @see DrupalTestCase::assert()
+   * @see DrupalTestCase::deleteAssert()
+   */
+  public static function insertAssert($test_id, $test_class, $status, $message = '', $group = 'Other', array $caller = array()) {
+    // Convert boolean status to string status.
+    if (is_bool($status)) {
+      $status = $status ? 'pass' : 'fail';
+    }
+
+    $caller += array(
+      'function' => t('Unknown'),
+      'line' => 0,
+      'file' => t('Unknown'),
+    );
+
+    $assertion = array(
+      'test_id' => $test_id,
+      'test_class' => $test_class,
+      'status' => $status,
+      'message' => $message,
+      'message_group' => $group,
+      'function' => $caller['function'],
+      'line' => $caller['line'],
+      'file' => $caller['file'],
+    );
+
+    return db_insert('simpletest')
+      ->fields($assertion)
+      ->execute();
+  }
+
+  /**
+   * Delete an assertion record by message ID.
+   *
+   * @param $message_id
+   *   Message ID of the assertion to delete.
+   * @return
+   *   TRUE if the assertion was deleted, FALSE otherwise.
+   *
+   * @see DrupalTestCase::insertAssert()
+   */
+  public static function deleteAssert($message_id) {
+    return (bool) db_delete('simpletest')
+      ->condition('message_id', $message_id)
+      ->execute();
+  }
+
+  /**
+   * Cycles through backtrace until the first non-assertion method is found.
+   *
+   * @return
+   *   Array representing the true caller.
+   */
+  protected function getAssertionCall() {
+    $backtrace = debug_backtrace();
+
+    // The first element is the call. The second element is the caller.
+    // We skip calls that occurred in one of the methods of our base classes
+    // or in an assertion function.
+   while (($caller = $backtrace[1]) &&
+         ((isset($caller['class']) && isset($this->skipClasses[$caller['class']])) ||
+           substr($caller['function'], 0, 6) == 'assert')) {
+      // We remove that call.
+      array_shift($backtrace);
+    }
+
+    return _drupal_get_last_caller($backtrace);
+  }
+
+  /**
+   * Check to see if a value is not false (not an empty string, 0, NULL, or FALSE).
+   *
+   * @param $value
+   *   The value on which the assertion is to be done.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertTrue($value, $message = '', $group = 'Other') {
+    return $this->assert((bool) $value, $message ? $message : t('Value @value is TRUE.', array('@value' => var_export($value, TRUE))), $group);
+  }
+
+  /**
+   * Check to see if a value is false (an empty string, 0, NULL, or FALSE).
+   *
+   * @param $value
+   *   The value on which the assertion is to be done.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertFalse($value, $message = '', $group = 'Other') {
+    return $this->assert(!$value, $message ? $message : t('Value @value is FALSE.', array('@value' => var_export($value, TRUE))), $group);
+  }
+
+  /**
+   * Check to see if a value is NULL.
+   *
+   * @param $value
+   *   The value on which the assertion is to be done.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertNull($value, $message = '', $group = 'Other') {
+    return $this->assert(!isset($value), $message ? $message : t('Value @value is NULL.', array('@value' => var_export($value, TRUE))), $group);
+  }
+
+  /**
+   * Check to see if a value is not NULL.
+   *
+   * @param $value
+   *   The value on which the assertion is to be done.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertNotNull($value, $message = '', $group = 'Other') {
+    return $this->assert(isset($value), $message ? $message : t('Value @value is not NULL.', array('@value' => var_export($value, TRUE))), $group);
+  }
+
+  /**
+   * Check to see if two values are equal.
+   *
+   * @param $first
+   *   The first value to check.
+   * @param $second
+   *   The second value to check.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertEqual($first, $second, $message = '', $group = 'Other') {
+    return $this->assert($first == $second, $message ? $message : t('Value @first is equal to value @second.', array('@first' => var_export($first, TRUE), '@second' => var_export($second, TRUE))), $group);
+  }
+
+  /**
+   * Check to see if two values are not equal.
+   *
+   * @param $first
+   *   The first value to check.
+   * @param $second
+   *   The second value to check.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertNotEqual($first, $second, $message = '', $group = 'Other') {
+    return $this->assert($first != $second, $message ? $message : t('Value @first is not equal to value @second.', array('@first' => var_export($first, TRUE), '@second' => var_export($second, TRUE))), $group);
+  }
+
+  /**
+   * Check to see if two values are identical.
+   *
+   * @param $first
+   *   The first value to check.
+   * @param $second
+   *   The second value to check.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertIdentical($first, $second, $message = '', $group = 'Other') {
+    return $this->assert($first === $second, $message ? $message : t('Value @first is identical to value @second.', array('@first' => var_export($first, TRUE), '@second' => var_export($second, TRUE))), $group);
+  }
+
+  /**
+   * Check to see if two values are not identical.
+   *
+   * @param $first
+   *   The first value to check.
+   * @param $second
+   *   The second value to check.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertNotIdentical($first, $second, $message = '', $group = 'Other') {
+    return $this->assert($first !== $second, $message ? $message : t('Value @first is not identical to value @second.', array('@first' => var_export($first, TRUE), '@second' => var_export($second, TRUE))), $group);
+  }
+
+  /**
+   * Fire an assertion that is always positive.
+   *
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE.
+   */
+  protected function pass($message = NULL, $group = 'Other') {
+    return $this->assert(TRUE, $message, $group);
+  }
+
+  /**
+   * Fire an assertion that is always negative.
+   *
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   FALSE.
+   */
+  protected function fail($message = NULL, $group = 'Other') {
+    return $this->assert(FALSE, $message, $group);
+  }
+
+  /**
+   * Fire an error assertion.
+   *
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @param $caller
+   *   The caller of the error.
+   * @return
+   *   FALSE.
+   */
+  protected function error($message = '', $group = 'Other', array $caller = NULL) {
+    if ($group == 'User notice') {
+      // Since 'User notice' is set by trigger_error() which is used for debug
+      // set the message to a status of 'debug'.
+      return $this->assert('debug', $message, 'Debug', $caller);
+    }
+
+    return $this->assert('exception', $message, $group, $caller);
+  }
+
+  /**
+   * Logs verbose message in a text file.
+   *
+   * The a link to the vebose message will be placed in the test results via
+   * as a passing assertion with the text '[verbose message]'.
+   *
+   * @param $message
+   *   The verbose message to be stored.
+   *
+   * @see simpletest_verbose()
+   */
+  protected function verbose($message) {
+    if ($id = simpletest_verbose($message)) {
+      $class_safe = str_replace('\\', '_', get_class($this));
+      $url = file_create_url($this->originalFileDirectory . '/simpletest/verbose/' . $class_safe . '-' . $id . '.html');
+      $this->error(l(t('Verbose message'), $url, array('attributes' => array('target' => '_blank'))), 'User notice');
+    }
+  }
+
+  /**
+   * Run all tests in this class.
+   *
+   * Regardless of whether $methods are passed or not, only method names
+   * starting with "test" are executed.
+   *
+   * @param $methods
+   *   (optional) A list of method names in the test case class to run; e.g.,
+   *   array('testFoo', 'testBar'). By default, all methods of the class are
+   *   taken into account, but it can be useful to only run a few selected test
+   *   methods during debugging.
+   */
+  public function run(array $methods = array()) {
+    // Initialize verbose debugging.
+    $class = get_class($this);
+    simpletest_verbose(NULL, variable_get('file_public_path', conf_path() . '/files'), str_replace('\\', '_', $class));
+
+    // HTTP auth settings (<username>:<password>) for the simpletest browser
+    // when sending requests to the test site.
+    $this->httpauth_method = variable_get('simpletest_httpauth_method', CURLAUTH_BASIC);
+    $username = variable_get('simpletest_httpauth_username', NULL);
+    $password = variable_get('simpletest_httpauth_password', NULL);
+    if ($username && $password) {
+      $this->httpauth_credentials = $username . ':' . $password;
+    }
+
+    set_error_handler(array($this, 'errorHandler'));
+    // Iterate through all the methods in this class, unless a specific list of
+    // methods to run was passed.
+    $class_methods = get_class_methods($class);
+    if ($methods) {
+      $class_methods = array_intersect($class_methods, $methods);
+    }
+    foreach ($class_methods as $method) {
+      // If the current method starts with "test", run it - it's a test.
+      if (strtolower(substr($method, 0, 4)) == 'test') {
+        // Insert a fail record. This will be deleted on completion to ensure
+        // that testing completed.
+        $method_info = new ReflectionMethod($class, $method);
+        $caller = array(
+          'file' => $method_info->getFileName(),
+          'line' => $method_info->getStartLine(),
+          'function' => $class . '->' . $method . '()',
+        );
+        $completion_check_id = DrupalTestCase::insertAssert($this->testId, $class, FALSE, t('The test did not complete due to a fatal error.'), 'Completion check', $caller);
+        $this->setUp();
+        if ($this->setup) {
+          try {
+            $this->$method();
+            // Finish up.
+          }
+          catch (Exception $e) {
+            $this->exceptionHandler($e);
+          }
+          $this->tearDown();
+        }
+        else {
+          $this->fail(t("The test cannot be executed because it has not been set up properly."));
+        }
+        // Remove the completion check record.
+        DrupalTestCase::deleteAssert($completion_check_id);
+      }
+    }
+    // Clear out the error messages and restore error handler.
+    drupal_get_messages();
+    restore_error_handler();
+  }
+
+  /**
+   * Handle errors during test runs.
+   *
+   * Because this is registered in set_error_handler(), it has to be public.
+   * @see set_error_handler
+   */
+  public function errorHandler($severity, $message, $file = NULL, $line = NULL) {
+    if ($severity & error_reporting()) {
+      $error_map = array(
+        E_STRICT => 'Run-time notice',
+        E_WARNING => 'Warning',
+        E_NOTICE => 'Notice',
+        E_CORE_ERROR => 'Core error',
+        E_CORE_WARNING => 'Core warning',
+        E_USER_ERROR => 'User error',
+        E_USER_WARNING => 'User warning',
+        E_USER_NOTICE => 'User notice',
+        E_RECOVERABLE_ERROR => 'Recoverable error',
+      );
+
+      // PHP 5.3 adds new error logging constants. Add these conditionally for
+      // backwards compatibility with PHP 5.2.
+      if (defined('E_DEPRECATED')) {
+        $error_map += array(
+          E_DEPRECATED => 'Deprecated',
+          E_USER_DEPRECATED => 'User deprecated',
+        );
+      }
+
+      $backtrace = debug_backtrace();
+      $this->error($message, $error_map[$severity], _drupal_get_last_caller($backtrace));
+    }
+    return TRUE;
+  }
+
+  /**
+   * Handle exceptions.
+   *
+   * @see set_exception_handler
+   */
+  protected function exceptionHandler($exception) {
+    $backtrace = $exception->getTrace();
+    // Push on top of the backtrace the call that generated the exception.
+    array_unshift($backtrace, array(
+      'line' => $exception->getLine(),
+      'file' => $exception->getFile(),
+    ));
+    require_once DRUPAL_ROOT . '/includes/errors.inc';
+    // The exception message is run through check_plain() by _drupal_decode_exception().
+    $this->error(t('%type: !message in %function (line %line of %file).', _drupal_decode_exception($exception)), 'Uncaught exception', _drupal_get_last_caller($backtrace));
+  }
+
+  /**
+   * Generates a random string of ASCII characters of codes 32 to 126.
+   *
+   * The generated string includes alpha-numeric characters and common
+   * miscellaneous characters. Use this method when testing general input
+   * where the content is not restricted.
+   *
+   * Do not use this method when special characters are not possible (e.g., in
+   * machine or file names that have already been validated); instead,
+   * use DrupalWebTestCase::randomName().
+   *
+   * @param $length
+   *   Length of random string to generate.
+   *
+   * @return
+   *   Randomly generated string.
+   *
+   * @see DrupalWebTestCase::randomName()
+   */
+  public static function randomString($length = 8) {
+    $str = '';
+    for ($i = 0; $i < $length; $i++) {
+      $str .= chr(mt_rand(32, 126));
+    }
+    return $str;
+  }
+
+  /**
+   * Generates a random string containing letters and numbers.
+   *
+   * The string will always start with a letter. The letters may be upper or
+   * lower case. This method is better for restricted inputs that do not
+   * accept certain characters. For example, when testing input fields that
+   * require machine readable values (i.e. without spaces and non-standard
+   * characters) this method is best.
+   *
+   * Do not use this method when testing unvalidated user input. Instead, use
+   * DrupalWebTestCase::randomString().
+   *
+   * @param $length
+   *   Length of random string to generate.
+   *
+   * @return
+   *   Randomly generated string.
+   *
+   * @see DrupalWebTestCase::randomString()
+   */
+  public static function randomName($length = 8) {
+    $values = array_merge(range(65, 90), range(97, 122), range(48, 57));
+    $max = count($values) - 1;
+    $str = chr(mt_rand(97, 122));
+    for ($i = 1; $i < $length; $i++) {
+      $str .= chr($values[mt_rand(0, $max)]);
+    }
+    return $str;
+  }
+
+  /**
+   * Converts a list of possible parameters into a stack of permutations.
+   *
+   * Takes a list of parameters containing possible values, and converts all of
+   * them into a list of items containing every possible permutation.
+   *
+   * Example:
+   * @code
+   * $parameters = array(
+   *   'one' => array(0, 1),
+   *   'two' => array(2, 3),
+   * );
+   * $permutations = DrupalTestCase::generatePermutations($parameters)
+   * // Result:
+   * $permutations == array(
+   *   array('one' => 0, 'two' => 2),
+   *   array('one' => 1, 'two' => 2),
+   *   array('one' => 0, 'two' => 3),
+   *   array('one' => 1, 'two' => 3),
+   * )
+   * @endcode
+   *
+   * @param $parameters
+   *   An associative array of parameters, keyed by parameter name, and whose
+   *   values are arrays of parameter values.
+   *
+   * @return
+   *   A list of permutations, which is an array of arrays. Each inner array
+   *   contains the full list of parameters that have been passed, but with a
+   *   single value only.
+   */
+  public static function generatePermutations($parameters) {
+    $all_permutations = array(array());
+    foreach ($parameters as $parameter => $values) {
+      $new_permutations = array();
+      // Iterate over all values of the parameter.
+      foreach ($values as $value) {
+        // Iterate over all existing permutations.
+        foreach ($all_permutations as $permutation) {
+          // Add the new parameter value to existing permutations.
+          $new_permutations[] = $permutation + array($parameter => $value);
+        }
+      }
+      // Replace the old permutations with the new permutations.
+      $all_permutations = $new_permutations;
+    }
+    return $all_permutations;
+  }
+}
+
+/**
+ * Test case for Drupal unit tests.
+ *
+ * These tests can not access the database nor files. Calling any Drupal
+ * function that needs the database will throw exceptions. These include
+ * watchdog(), module_implements(), module_invoke_all() etc.
+ */
+class DrupalUnitTestCase extends DrupalTestCase {
+
+  /**
+   * Constructor for DrupalUnitTestCase.
+   */
+  function __construct($test_id = NULL) {
+    parent::__construct($test_id);
+    $this->skipClasses[__CLASS__] = TRUE;
+  }
+
+  /**
+   * Sets up unit test environment.
+   *
+   * Unlike DrupalWebTestCase::setUp(), DrupalUnitTestCase::setUp() does not
+   * install modules because tests are performed without accessing the database.
+   * Any required files must be explicitly included by the child class setUp()
+   * method.
+   */
+  protected function setUp() {
+    global $conf;
+
+    // Store necessary current values before switching to the test environment.
+    $this->originalFileDirectory = variable_get('file_public_path', conf_path() . '/files');
+
+    // Reset all statics so that test is performed with a clean environment.
+    drupal_static_reset();
+
+    // Generate temporary prefixed database to ensure that tests have a clean starting point.
+    $this->databasePrefix = Database::getConnection()->prefixTables('{simpletest' . mt_rand(1000, 1000000) . '}');
+
+    // Create test directory.
+    $public_files_directory = $this->originalFileDirectory . '/simpletest/' . substr($this->databasePrefix, 10);
+    file_prepare_directory($public_files_directory, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
+    $conf['file_public_path'] = $public_files_directory;
+
+    // Clone the current connection and replace the current prefix.
+    $connection_info = Database::getConnectionInfo('default');
+    Database::renameConnection('default', 'simpletest_original_default');
+    foreach ($connection_info as $target => $value) {
+      $connection_info[$target]['prefix'] = array(
+        'default' => $value['prefix']['default'] . $this->databasePrefix,
+      );
+    }
+    Database::addConnectionInfo('default', 'default', $connection_info['default']);
+
+    // Set user agent to be consistent with web test case.
+    $_SERVER['HTTP_USER_AGENT'] = $this->databasePrefix;
+
+    // If locale is enabled then t() will try to access the database and
+    // subsequently will fail as the database is not accessible.
+    $module_list = module_list();
+    if (isset($module_list['locale'])) {
+      // Transform the list into the format expected as input to module_list().
+      foreach ($module_list as &$module) {
+        $module = array('filename' => drupal_get_filename('module', $module));
+      }
+      $this->originalModuleList = $module_list;
+      unset($module_list['locale']);
+      module_list(TRUE, FALSE, FALSE, $module_list);
+    }
+    $this->setup = TRUE;
+  }
+
+  protected function tearDown() {
+    global $conf;
+
+    // Get back to the original connection.
+    Database::removeConnection('default');
+    Database::renameConnection('simpletest_original_default', 'default');
+
+    $conf['file_public_path'] = $this->originalFileDirectory;
+    // Restore modules if necessary.
+    if (isset($this->originalModuleList)) {
+      module_list(TRUE, FALSE, FALSE, $this->originalModuleList);
+    }
+  }
+}
+
+/**
+ * Test case for typical Drupal tests.
+ */
+class DrupalWebTestCase extends DrupalTestCase {
+  /**
+   * The profile to install as a basis for testing.
+   *
+   * @var string
+   */
+  protected $profile = 'standard';
+
+  /**
+   * The URL currently loaded in the internal browser.
+   *
+   * @var string
+   */
+  protected $url;
+
+  /**
+   * The handle of the current cURL connection.
+   *
+   * @var resource
+   */
+  protected $curlHandle;
+
+  /**
+   * The headers of the page currently loaded in the internal browser.
+   *
+   * @var Array
+   */
+  protected $headers;
+
+  /**
+   * The content of the page currently loaded in the internal browser.
+   *
+   * @var string
+   */
+  protected $content;
+
+  /**
+   * The content of the page currently loaded in the internal browser (plain text version).
+   *
+   * @var string
+   */
+  protected $plainTextContent;
+
+  /**
+   * The value of the Drupal.settings JavaScript variable for the page currently loaded in the internal browser.
+   *
+   * @var Array
+   */
+  protected $drupalSettings;
+
+  /**
+   * The parsed version of the page.
+   *
+   * @var SimpleXMLElement
+   */
+  protected $elements = NULL;
+
+  /**
+   * The current user logged in using the internal browser.
+   *
+   * @var bool
+   */
+  protected $loggedInUser = FALSE;
+
+  /**
+   * The current cookie file used by cURL.
+   *
+   * We do not reuse the cookies in further runs, so we do not need a file
+   * but we still need cookie handling, so we set the jar to NULL.
+   */
+  protected $cookieFile = NULL;
+
+  /**
+   * Additional cURL options.
+   *
+   * DrupalWebTestCase itself never sets this but always obeys what is set.
+   */
+  protected $additionalCurlOptions = array();
+
+  /**
+   * The original user, before it was changed to a clean uid = 1 for testing purposes.
+   *
+   * @var object
+   */
+  protected $originalUser = NULL;
+
+  /**
+   * The original shutdown handlers array, before it was cleaned for testing purposes.
+   *
+   * @var array
+   */
+  protected $originalShutdownCallbacks = array();
+
+  /**
+   * HTTP authentication method
+   */
+  protected $httpauth_method = CURLAUTH_BASIC;
+
+  /**
+   * HTTP authentication credentials (<username>:<password>).
+   */
+  protected $httpauth_credentials = NULL;
+
+  /**
+   * The current session name, if available.
+   */
+  protected $session_name = NULL;
+
+  /**
+   * The current session ID, if available.
+   */
+  protected $session_id = NULL;
+
+  /**
+   * Whether the files were copied to the test files directory.
+   */
+  protected $generatedTestFiles = FALSE;
+
+  /**
+   * The number of redirects followed during the handling of a request.
+   */
+  protected $redirect_count;
+
+  /**
+   * Constructor for DrupalWebTestCase.
+   */
+  function __construct($test_id = NULL) {
+    parent::__construct($test_id);
+    $this->skipClasses[__CLASS__] = TRUE;
+  }
+
+  /**
+   * Get a node from the database based on its title.
+   *
+   * @param $title
+   *   A node title, usually generated by $this->randomName().
+   * @param $reset
+   *   (optional) Whether to reset the internal node_load() cache.
+   *
+   * @return
+   *   A node object matching $title.
+   */
+  function drupalGetNodeByTitle($title, $reset = FALSE) {
+    $nodes = node_load_multiple(array(), array('title' => $title), $reset);
+    // Load the first node returned from the database.
+    $returned_node = reset($nodes);
+    return $returned_node;
+  }
+
+  /**
+   * Creates a node based on default settings.
+   *
+   * @param $settings
+   *   An associative array of settings to change from the defaults, keys are
+   *   node properties, for example 'title' => 'Hello, world!'.
+   * @return
+   *   Created node object.
+   */
+  protected function drupalCreateNode($settings = array()) {
+    // Populate defaults array.
+    $settings += array(
+      'body'      => array(LANGUAGE_NONE => array(array())),
+      'title'     => $this->randomName(8),
+      'comment'   => 2,
+      'changed'   => REQUEST_TIME,
+      'moderate'  => 0,
+      'promote'   => 0,
+      'revision'  => 1,
+      'log'       => '',
+      'status'    => 1,
+      'sticky'    => 0,
+      'type'      => 'page',
+      'revisions' => NULL,
+      'language'  => LANGUAGE_NONE,
+    );
+
+    // Use the original node's created time for existing nodes.
+    if (isset($settings['created']) && !isset($settings['date'])) {
+      $settings['date'] = format_date($settings['created'], 'custom', 'Y-m-d H:i:s O');
+    }
+
+    // If the node's user uid is not specified manually, use the currently
+    // logged in user if available, or else the user running the test.
+    if (!isset($settings['uid'])) {
+      if ($this->loggedInUser) {
+        $settings['uid'] = $this->loggedInUser->uid;
+      }
+      else {
+        global $user;
+        $settings['uid'] = $user->uid;
+      }
+    }
+
+    // Merge body field value and format separately.
+    $body = array(
+      'value' => $this->randomName(32),
+      'format' => filter_default_format(),
+    );
+    $settings['body'][$settings['language']][0] += $body;
+
+    $node = (object) $settings;
+    node_save($node);
+
+    // Small hack to link revisions to our test user.
+    db_update('node_revision')
+      ->fields(array('uid' => $node->uid))
+      ->condition('vid', $node->vid)
+      ->execute();
+    return $node;
+  }
+
+  /**
+   * Creates a custom content type based on default settings.
+   *
+   * @param $settings
+   *   An array of settings to change from the defaults.
+   *   Example: 'type' => 'foo'.
+   * @return
+   *   Created content type.
+   */
+  protected function drupalCreateContentType($settings = array()) {
+    // Find a non-existent random type name.
+    do {
+      $name = strtolower($this->randomName(8));
+    } while (node_type_get_type($name));
+
+    // Populate defaults array.
+    $defaults = array(
+      'type' => $name,
+      'name' => $name,
+      'base' => 'node_content',
+      'description' => '',
+      'help' => '',
+      'title_label' => 'Title',
+      'body_label' => 'Body',
+      'has_title' => 1,
+      'has_body' => 1,
+    );
+    // Imposed values for a custom type.
+    $forced = array(
+      'orig_type' => '',
+      'old_type' => '',
+      'module' => 'node',
+      'custom' => 1,
+      'modified' => 1,
+      'locked' => 0,
+    );
+    $type = $forced + $settings + $defaults;
+    $type = (object) $type;
+
+    $saved_type = node_type_save($type);
+    node_types_rebuild();
+    menu_rebuild();
+    node_add_body_field($type);
+
+    $this->assertEqual($saved_type, SAVED_NEW, t('Created content type %type.', array('%type' => $type->type)));
+
+    // Reset permissions so that permissions for this content type are available.
+    $this->checkPermissions(array(), TRUE);
+
+    return $type;
+  }
+
+  /**
+   * Get a list files that can be used in tests.
+   *
+   * @param $type
+   *   File type, possible values: 'binary', 'html', 'image', 'javascript', 'php', 'sql', 'text'.
+   * @param $size
+   *   File size in bytes to match. Please check the tests/files folder.
+   * @return
+   *   List of files that match filter.
+   */
+  protected function drupalGetTestFiles($type, $size = NULL) {
+    if (empty($this->generatedTestFiles)) {
+      // Generate binary test files.
+      $lines = array(64, 1024);
+      $count = 0;
+      foreach ($lines as $line) {
+        simpletest_generate_file('binary-' . $count++, 64, $line, 'binary');
+      }
+
+      // Generate text test files.
+      $lines = array(16, 256, 1024, 2048, 20480);
+      $count = 0;
+      foreach ($lines as $line) {
+        simpletest_generate_file('text-' . $count++, 64, $line);
+      }
+
+      // Copy other test files from simpletest.
+      $original = drupal_get_path('module', 'simpletest') . '/files';
+      $files = file_scan_directory($original, '/(html|image|javascript|php|sql)-.*/');
+      foreach ($files as $file) {
+        file_unmanaged_copy($file->uri, variable_get('file_public_path', conf_path() . '/files'));
+      }
+
+      $this->generatedTestFiles = TRUE;
+    }
+
+    $files = array();
+    // Make sure type is valid.
+    if (in_array($type, array('binary', 'html', 'image', 'javascript', 'php', 'sql', 'text'))) {
+      $files = file_scan_directory('public://', '/' . $type . '\-.*/');
+
+      // If size is set then remove any files that are not of that size.
+      if ($size !== NULL) {
+        foreach ($files as $file) {
+          $stats = stat($file->uri);
+          if ($stats['size'] != $size) {
+            unset($files[$file->uri]);
+          }
+        }
+      }
+    }
+    usort($files, array($this, 'drupalCompareFiles'));
+    return $files;
+  }
+
+  /**
+   * Compare two files based on size and file name.
+   */
+  protected function drupalCompareFiles($file1, $file2) {
+    $compare_size = filesize($file1->uri) - filesize($file2->uri);
+    if ($compare_size) {
+      // Sort by file size.
+      return $compare_size;
+    }
+    else {
+      // The files were the same size, so sort alphabetically.
+      return strnatcmp($file1->name, $file2->name);
+    }
+  }
+
+  /**
+   * Create a user with a given set of permissions.
+   *
+   * @param array $permissions
+   *   Array of permission names to assign to user. Note that the user always
+   *   has the default permissions derived from the "authenticated users" role.
+   *
+   * @return object|false
+   *   A fully loaded user object with pass_raw property, or FALSE if account
+   *   creation fails.
+   */
+  protected function drupalCreateUser(array $permissions = array()) {
+    // Create a role with the given permission set, if any.
+    $rid = FALSE;
+    if ($permissions) {
+      $rid = $this->drupalCreateRole($permissions);
+      if (!$rid) {
+        return FALSE;
+      }
+    }
+
+    // Create a user assigned to that role.
+    $edit = array();
+    $edit['name']   = $this->randomName();
+    $edit['mail']   = $edit['name'] . '@example.com';
+    $edit['pass']   = user_password();
+    $edit['status'] = 1;
+    if ($rid) {
+      $edit['roles'] = array($rid => $rid);
+    }
+
+    $account = user_save(drupal_anonymous_user(), $edit);
+
+    $this->assertTrue(!empty($account->uid), t('User created with name %name and pass %pass', array('%name' => $edit['name'], '%pass' => $edit['pass'])), t('User login'));
+    if (empty($account->uid)) {
+      return FALSE;
+    }
+
+    // Add the raw password so that we can log in as this user.
+    $account->pass_raw = $edit['pass'];
+    return $account;
+  }
+
+  /**
+   * Internal helper function; Create a role with specified permissions.
+   *
+   * @param $permissions
+   *   Array of permission names to assign to role.
+   * @param $name
+   *   (optional) String for the name of the role.  Defaults to a random string.
+   * @return
+   *   Role ID of newly created role, or FALSE if role creation failed.
+   */
+  protected function drupalCreateRole(array $permissions, $name = NULL) {
+    // Generate random name if it was not passed.
+    if (!$name) {
+      $name = $this->randomName();
+    }
+
+    // Check the all the permissions strings are valid.
+    if (!$this->checkPermissions($permissions)) {
+      return FALSE;
+    }
+
+    // Create new role.
+    $role = new stdClass();
+    $role->name = $name;
+    user_role_save($role);
+    user_role_grant_permissions($role->rid, $permissions);
+
+    $this->assertTrue(isset($role->rid), t('Created role of name: @name, id: @rid', array('@name' => $name, '@rid' => (isset($role->rid) ? $role->rid : t('-n/a-')))), t('Role'));
+    if ($role && !empty($role->rid)) {
+      $count = db_query('SELECT COUNT(*) FROM {role_permission} WHERE rid = :rid', array(':rid' => $role->rid))->fetchField();
+      $this->assertTrue($count == count($permissions), t('Created permissions: @perms', array('@perms' => implode(', ', $permissions))), t('Role'));
+      return $role->rid;
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  /**
+   * Check to make sure that the array of permissions are valid.
+   *
+   * @param $permissions
+   *   Permissions to check.
+   * @param $reset
+   *   Reset cached available permissions.
+   * @return
+   *   TRUE or FALSE depending on whether the permissions are valid.
+   */
+  protected function checkPermissions(array $permissions, $reset = FALSE) {
+    $available = &drupal_static(__FUNCTION__);
+
+    if (!isset($available) || $reset) {
+      $available = array_keys(module_invoke_all('permission'));
+    }
+
+    $valid = TRUE;
+    foreach ($permissions as $permission) {
+      if (!in_array($permission, $available)) {
+        $this->fail(t('Invalid permission %permission.', array('%permission' => $permission)), t('Role'));
+        $valid = FALSE;
+      }
+    }
+    return $valid;
+  }
+
+  /**
+   * Log in a user with the internal browser.
+   *
+   * If a user is already logged in, then the current user is logged out before
+   * logging in the specified user.
+   *
+   * Please note that neither the global $user nor the passed-in user object is
+   * populated with data of the logged in user. If you need full access to the
+   * user object after logging in, it must be updated manually. If you also need
+   * access to the plain-text password of the user (set by drupalCreateUser()),
+   * e.g. to log in the same user again, then it must be re-assigned manually.
+   * For example:
+   * @code
+   *   // Create a user.
+   *   $account = $this->drupalCreateUser(array());
+   *   $this->drupalLogin($account);
+   *   // Load real user object.
+   *   $pass_raw = $account->pass_raw;
+   *   $account = user_load($account->uid);
+   *   $account->pass_raw = $pass_raw;
+   * @endcode
+   *
+   * @param $account
+   *   User object representing the user to log in.
+   *
+   * @see drupalCreateUser()
+   */
+  protected function drupalLogin(stdClass $account) {
+    if ($this->loggedInUser) {
+      $this->drupalLogout();
+    }
+
+    $edit = array(
+      'name' => $account->name,
+      'pass' => $account->pass_raw
+    );
+    $this->drupalPost('user', $edit, t('Log in'));
+
+    // If a "log out" link appears on the page, it is almost certainly because
+    // the login was successful.
+    $pass = $this->assertLink(t('Log out'), 0, t('User %name successfully logged in.', array('%name' => $account->name)), t('User login'));
+
+    if ($pass) {
+      $this->loggedInUser = $account;
+    }
+  }
+
+  /**
+   * Generate a token for the currently logged in user.
+   */
+  protected function drupalGetToken($value = '') {
+    $private_key = drupal_get_private_key();
+    return drupal_hmac_base64($value, $this->session_id . $private_key);
+  }
+
+  /*
+   * Logs a user out of the internal browser, then check the login page to confirm logout.
+   */
+  protected function drupalLogout() {
+    // Make a request to the logout page, and redirect to the user page, the
+    // idea being if you were properly logged out you should be seeing a login
+    // screen.
+    $this->drupalGet('user/logout');
+    $this->drupalGet('user');
+    $pass = $this->assertField('name', t('Username field found.'), t('Logout'));
+    $pass = $pass && $this->assertField('pass', t('Password field found.'), t('Logout'));
+
+    if ($pass) {
+      $this->loggedInUser = FALSE;
+    }
+  }
+
+  /**
+   * Generates a database prefix for running tests.
+   *
+   * The generated database table prefix is used for the Drupal installation
+   * being performed for the test. It is also used as user agent HTTP header
+   * value by the cURL-based browser of DrupalWebTestCase, which is sent
+   * to the Drupal installation of the test. During early Drupal bootstrap, the
+   * user agent HTTP header is parsed, and if it matches, all database queries
+   * use the database table prefix that has been generated here.
+   *
+   * @see DrupalWebTestCase::curlInitialize()
+   * @see drupal_valid_test_ua()
+   * @see DrupalWebTestCase::setUp()
+   */
+  protected function prepareDatabasePrefix() {
+    $this->databasePrefix = 'simpletest' . mt_rand(1000, 1000000);
+
+    // As soon as the database prefix is set, the test might start to execute.
+    // All assertions as well as the SimpleTest batch operations are associated
+    // with the testId, so the database prefix has to be associated with it.
+    db_update('simpletest_test_id')
+      ->fields(array('last_prefix' => $this->databasePrefix))
+      ->condition('test_id', $this->testId)
+      ->execute();
+  }
+
+  /**
+   * Changes the database connection to the prefixed one.
+   *
+   * @see DrupalWebTestCase::setUp()
+   */
+  protected function changeDatabasePrefix() {
+    if (empty($this->databasePrefix)) {
+      $this->prepareDatabasePrefix();
+      // If $this->prepareDatabasePrefix() failed to work, return without
+      // setting $this->setupDatabasePrefix to TRUE, so setUp() methods will
+      // know to bail out.
+      if (empty($this->databasePrefix)) {
+        return;
+      }
+    }
+
+    // Clone the current connection and replace the current prefix.
+    $connection_info = Database::getConnectionInfo('default');
+    Database::renameConnection('default', 'simpletest_original_default');
+    foreach ($connection_info as $target => $value) {
+      $connection_info[$target]['prefix'] = array(
+        'default' => $value['prefix']['default'] . $this->databasePrefix,
+      );
+    }
+    Database::addConnectionInfo('default', 'default', $connection_info['default']);
+
+    // Indicate the database prefix was set up correctly.
+    $this->setupDatabasePrefix = TRUE;
+  }
+
+  /**
+   * Prepares the current environment for running the test.
+   *
+   * Backups various current environment variables and resets them, so they do
+   * not interfere with the Drupal site installation in which tests are executed
+   * and can be restored in tearDown().
+   *
+   * Also sets up new resources for the testing environment, such as the public
+   * filesystem and configuration directories.
+   *
+   * @see DrupalWebTestCase::setUp()
+   * @see DrupalWebTestCase::tearDown()
+   */
+  protected function prepareEnvironment() {
+    global $user, $language, $conf;
+
+    // Store necessary current values before switching to prefixed database.
+    $this->originalLanguage = $language;
+    $this->originalLanguageDefault = variable_get('language_default');
+    $this->originalFileDirectory = variable_get('file_public_path', conf_path() . '/files');
+    $this->originalProfile = drupal_get_profile();
+    $this->originalCleanUrl = variable_get('clean_url', 0);
+    $this->originalUser = $user;
+
+    // Set to English to prevent exceptions from utf8_truncate() from t()
+    // during install if the current language is not 'en'.
+    // The following array/object conversion is copied from language_default().
+    $language = (object) array('language' => 'en', 'name' => 'English', 'native' => 'English', 'direction' => 0, 'enabled' => 1, 'plurals' => 0, 'formula' => '', 'domain' => '', 'prefix' => '', 'weight' => 0, 'javascript' => '');
+
+    // Save and clean the shutdown callbacks array because it is static cached
+    // and will be changed by the test run. Otherwise it will contain callbacks
+    // from both environments and the testing environment will try to call the
+    // handlers defined by the original one.
+    $callbacks = &drupal_register_shutdown_function();
+    $this->originalShutdownCallbacks = $callbacks;
+    $callbacks = array();
+
+    // Create test directory ahead of installation so fatal errors and debug
+    // information can be logged during installation process.
+    // Use temporary files directory with the same prefix as the database.
+    $this->public_files_directory = $this->originalFileDirectory . '/simpletest/' . substr($this->databasePrefix, 10);
+    $this->private_files_directory = $this->public_files_directory . '/private';
+    $this->temp_files_directory = $this->private_files_directory . '/temp';
+
+    // Create the directories
+    file_prepare_directory($this->public_files_directory, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
+    file_prepare_directory($this->private_files_directory, FILE_CREATE_DIRECTORY);
+    file_prepare_directory($this->temp_files_directory, FILE_CREATE_DIRECTORY);
+    $this->generatedTestFiles = FALSE;
+
+    // Log fatal errors.
+    ini_set('log_errors', 1);
+    ini_set('error_log', $this->public_files_directory . '/error.log');
+
+    // Set the test information for use in other parts of Drupal.
+    $test_info = &$GLOBALS['drupal_test_info'];
+    $test_info['test_run_id'] = $this->databasePrefix;
+    $test_info['in_child_site'] = FALSE;
+
+    // Indicate the environment was set up correctly.
+    $this->setupEnvironment = TRUE;
+  }
+
+  /**
+   * Sets up a Drupal site for running functional and integration tests.
+   *
+   * Generates a random database prefix and installs Drupal with the specified
+   * installation profile in DrupalWebTestCase::$profile into the
+   * prefixed database. Afterwards, installs any additional modules specified by
+   * the test.
+   *
+   * After installation all caches are flushed and several configuration values
+   * are reset to the values of the parent site executing the test, since the
+   * default values may be incompatible with the environment in which tests are
+   * being executed.
+   *
+   * @param ...
+   *   List of modules to enable for the duration of the test. This can be
+   *   either a single array or a variable number of string arguments.
+   *
+   * @see DrupalWebTestCase::prepareDatabasePrefix()
+   * @see DrupalWebTestCase::changeDatabasePrefix()
+   * @see DrupalWebTestCase::prepareEnvironment()
+   */
+  protected function setUp() {
+    global $user, $language, $conf;
+
+    // Create the database prefix for this test.
+    $this->prepareDatabasePrefix();
+
+    // Prepare the environment for running tests.
+    $this->prepareEnvironment();
+    if (!$this->setupEnvironment) {
+      return FALSE;
+    }
+
+    // Reset all statics and variables to perform tests in a clean environment.
+    $conf = array();
+    drupal_static_reset();
+
+    // Change the database prefix.
+    // All static variables need to be reset before the database prefix is
+    // changed, since DrupalCacheArray implementations attempt to
+    // write back to persistent caches when they are destructed.
+    $this->changeDatabasePrefix();
+    if (!$this->setupDatabasePrefix) {
+      return FALSE;
+    }
+
+    // Preset the 'install_profile' system variable, so the first call into
+    // system_rebuild_module_data() (in drupal_install_system()) will register
+    // the test's profile as a module. Without this, the installation profile of
+    // the parent site (executing the test) is registered, and the test
+    // profile's hook_install() and other hook implementations are never invoked.
+    $conf['install_profile'] = $this->profile;
+
+    // Perform the actual Drupal installation.
+    include_once DRUPAL_ROOT . '/includes/install.inc';
+    drupal_install_system();
+
+    $this->preloadRegistry();
+
+    // Set path variables.
+    variable_set('file_public_path', $this->public_files_directory);
+    variable_set('file_private_path', $this->private_files_directory);
+    variable_set('file_temporary_path', $this->temp_files_directory);
+
+    // Set the 'simpletest_parent_profile' variable to add the parent profile's
+    // search path to the child site's search paths.
+    // @see drupal_system_listing()
+    // @todo This may need to be primed like 'install_profile' above.
+    variable_set('simpletest_parent_profile', $this->originalProfile);
+
+    // Include the testing profile.
+    variable_set('install_profile', $this->profile);
+    $profile_details = install_profile_info($this->profile, 'en');
+
+    // Install the modules specified by the testing profile.
+    module_enable($profile_details['dependencies'], FALSE);
+
+    // Install modules needed for this test. This could have been passed in as
+    // either a single array argument or a variable number of string arguments.
+    // @todo Remove this compatibility layer in Drupal 8, and only accept
+    // $modules as a single array argument.
+    $modules = func_get_args();
+    if (isset($modules[0]) && is_array($modules[0])) {
+      $modules = $modules[0];
+    }
+    if ($modules) {
+      $success = module_enable($modules, TRUE);
+      $this->assertTrue($success, t('Enabled modules: %modules', array('%modules' => implode(', ', $modules))));
+    }
+
+    // Run the profile tasks.
+    $install_profile_module_exists = db_query("SELECT 1 FROM {system} WHERE type = 'module' AND name = :name", array(
+      ':name' => $this->profile,
+    ))->fetchField();
+    if ($install_profile_module_exists) {
+      module_enable(array($this->profile), FALSE);
+    }
+
+    // Reset/rebuild all data structures after enabling the modules.
+    $this->resetAll();
+
+    // Run cron once in that environment, as install.php does at the end of
+    // the installation process.
+    drupal_cron_run();
+
+    // Ensure that the session is not written to the new environment and replace
+    // the global $user session with uid 1 from the new test site.
+    drupal_save_session(FALSE);
+    // Login as uid 1.
+    $user = user_load(1);
+
+    // Restore necessary variables.
+    variable_set('install_task', 'done');
+    variable_set('clean_url', $this->originalCleanUrl);
+    variable_set('site_mail', 'simpletest@example.com');
+    variable_set('date_default_timezone', date_default_timezone_get());
+
+    // Set up English language.
+    unset($conf['language_default']);
+    $language = language_default();
+
+    // Use the test mail class instead of the default mail handler class.
+    variable_set('mail_system', array('default-system' => 'TestingMailSystem'));
+
+    drupal_set_time_limit($this->timeLimit);
+    $this->setup = TRUE;
+  }
+
+  /**
+   * Preload the registry from the testing site.
+   *
+   * This method is called by DrupalWebTestCase::setUp(), and preloads the
+   * registry from the testing site to cut down on the time it takes to
+   * set up a clean environment for the current test run.
+   */
+  protected function preloadRegistry() {
+    // Use two separate queries, each with their own connections: copy the
+    // {registry} and {registry_file} tables over from the parent installation
+    // to the child installation.
+    $original_connection = Database::getConnection('default', 'simpletest_original_default');
+    $test_connection = Database::getConnection();
+
+    foreach (array('registry', 'registry_file') as $table) {
+      // Find the records from the parent database.
+      $source_query = $original_connection
+        ->select($table, array(), array('fetch' => PDO::FETCH_ASSOC))
+        ->fields($table);
+
+      $dest_query = $test_connection->insert($table);
+
+      $first = TRUE;
+      foreach ($source_query->execute() as $row) {
+        if ($first) {
+          $dest_query->fields(array_keys($row));
+          $first = FALSE;
+        }
+        // Insert the records into the child database.
+        $dest_query->values($row);
+      }
+
+      $dest_query->execute();
+    }
+  }
+
+  /**
+   * Reset all data structures after having enabled new modules.
+   *
+   * This method is called by DrupalWebTestCase::setUp() after enabling
+   * the requested modules. It must be called again when additional modules
+   * are enabled later.
+   */
+  protected function resetAll() {
+    // Reset all static variables.
+    drupal_static_reset();
+    // Reset the list of enabled modules.
+    module_list(TRUE);
+
+    // Reset cached schema for new database prefix. This must be done before
+    // drupal_flush_all_caches() so rebuilds can make use of the schema of
+    // modules enabled on the cURL side.
+    drupal_get_schema(NULL, TRUE);
+
+    // Perform rebuilds and flush remaining caches.
+    drupal_flush_all_caches();
+
+    // Reload global $conf array and permissions.
+    $this->refreshVariables();
+    $this->checkPermissions(array(), TRUE);
+  }
+
+  /**
+   * Refresh the in-memory set of variables. Useful after a page request is made
+   * that changes a variable in a different thread.
+   *
+   * In other words calling a settings page with $this->drupalPost() with a changed
+   * value would update a variable to reflect that change, but in the thread that
+   * made the call (thread running the test) the changed variable would not be
+   * picked up.
+   *
+   * This method clears the variables cache and loads a fresh copy from the database
+   * to ensure that the most up-to-date set of variables is loaded.
+   */
+  protected function refreshVariables() {
+    global $conf;
+    cache_clear_all('variables', 'cache_bootstrap');
+    $conf = variable_initialize();
+  }
+
+  /**
+   * Delete created files and temporary files directory, delete the tables created by setUp(),
+   * and reset the database prefix.
+   */
+  protected function tearDown() {
+    global $user, $language;
+
+    // In case a fatal error occurred that was not in the test process read the
+    // log to pick up any fatal errors.
+    simpletest_log_read($this->testId, $this->databasePrefix, get_class($this), TRUE);
+
+    $emailCount = count(variable_get('drupal_test_email_collector', array()));
+    if ($emailCount) {
+      $message = format_plural($emailCount, '1 e-mail was sent during this test.', '@count e-mails were sent during this test.');
+      $this->pass($message, t('E-mail'));
+    }
+
+    // Delete temporary files directory.
+    file_unmanaged_delete_recursive($this->originalFileDirectory . '/simpletest/' . substr($this->databasePrefix, 10));
+
+    // Remove all prefixed tables.
+    $tables = db_find_tables($this->databasePrefix . '%');
+    $connection_info = Database::getConnectionInfo('default');
+    $tables = db_find_tables($connection_info['default']['prefix']['default'] . '%');
+    if (empty($tables)) {
+      $this->fail('Failed to find test tables to drop.');
+    }
+    $prefix_length = strlen($connection_info['default']['prefix']['default']);
+    foreach ($tables as $table) {
+      if (db_drop_table(substr($table, $prefix_length))) {
+        unset($tables[$table]);
+      }
+    }
+    if (!empty($tables)) {
+      $this->fail('Failed to drop all prefixed tables.');
+    }
+
+    // Get back to the original connection.
+    Database::removeConnection('default');
+    Database::renameConnection('simpletest_original_default', 'default');
+
+    // Restore original shutdown callbacks array to prevent original
+    // environment of calling handlers from test run.
+    $callbacks = &drupal_register_shutdown_function();
+    $callbacks = $this->originalShutdownCallbacks;
+
+    // Return the user to the original one.
+    $user = $this->originalUser;
+    drupal_save_session(TRUE);
+
+    // Ensure that internal logged in variable and cURL options are reset.
+    $this->loggedInUser = FALSE;
+    $this->additionalCurlOptions = array();
+
+    // Reload module list and implementations to ensure that test module hooks
+    // aren't called after tests.
+    module_list(TRUE);
+    module_implements('', FALSE, TRUE);
+
+    // Reset the Field API.
+    field_cache_clear();
+
+    // Rebuild caches.
+    $this->refreshVariables();
+
+    // Reset public files directory.
+    $GLOBALS['conf']['file_public_path'] = $this->originalFileDirectory;
+
+    // Reset language.
+    $language = $this->originalLanguage;
+    if ($this->originalLanguageDefault) {
+      $GLOBALS['conf']['language_default'] = $this->originalLanguageDefault;
+    }
+
+    // Close the CURL handler.
+    $this->curlClose();
+  }
+
+  /**
+   * Initializes the cURL connection.
+   *
+   * If the simpletest_httpauth_credentials variable is set, this function will
+   * add HTTP authentication headers. This is necessary for testing sites that
+   * are protected by login credentials from public access.
+   * See the description of $curl_options for other options.
+   */
+  protected function curlInitialize() {
+    global $base_url;
+
+    if (!isset($this->curlHandle)) {
+      $this->curlHandle = curl_init();
+
+      // Some versions/configurations of cURL break on a NULL cookie jar, so
+      // supply a real file.
+      if (empty($this->cookieFile)) {
+        $this->cookieFile = $this->public_files_directory . '/cookie.jar';
+      }
+
+      $curl_options = array(
+        CURLOPT_COOKIEJAR => $this->cookieFile,
+        CURLOPT_URL => $base_url,
+        CURLOPT_FOLLOWLOCATION => FALSE,
+        CURLOPT_RETURNTRANSFER => TRUE,
+        CURLOPT_SSL_VERIFYPEER => FALSE, // Required to make the tests run on HTTPS.
+        CURLOPT_SSL_VERIFYHOST => FALSE, // Required to make the tests run on HTTPS.
+        CURLOPT_HEADERFUNCTION => array(&$this, 'curlHeaderCallback'),
+        CURLOPT_USERAGENT => $this->databasePrefix,
+      );
+      if (isset($this->httpauth_credentials)) {
+        $curl_options[CURLOPT_HTTPAUTH] = $this->httpauth_method;
+        $curl_options[CURLOPT_USERPWD] = $this->httpauth_credentials;
+      }
+      // curl_setopt_array() returns FALSE if any of the specified options
+      // cannot be set, and stops processing any further options.
+      $result = curl_setopt_array($this->curlHandle, $this->additionalCurlOptions + $curl_options);
+      if (!$result) {
+        throw new Exception('One or more cURL options could not be set.');
+      }
+
+      // By default, the child session name should be the same as the parent.
+      $this->session_name = session_name();
+    }
+    // We set the user agent header on each request so as to use the current
+    // time and a new uniqid.
+    if (preg_match('/simpletest\d+/', $this->databasePrefix, $matches)) {
+      curl_setopt($this->curlHandle, CURLOPT_USERAGENT, drupal_generate_test_ua($matches[0]));
+    }
+  }
+
+  /**
+   * Initializes and executes a cURL request.
+   *
+   * @param $curl_options
+   *   An associative array of cURL options to set, where the keys are constants
+   *   defined by the cURL library. For a list of valid options, see
+   *   http://www.php.net/manual/function.curl-setopt.php
+   * @param $redirect
+   *   FALSE if this is an initial request, TRUE if this request is the result
+   *   of a redirect.
+   *
+   * @return
+   *   The content returned from the call to curl_exec().
+   *
+   * @see curlInitialize()
+   */
+  protected function curlExec($curl_options, $redirect = FALSE) {
+    $this->curlInitialize();
+
+    // cURL incorrectly handles URLs with a fragment by including the
+    // fragment in the request to the server, causing some web servers
+    // to reject the request citing "400 - Bad Request". To prevent
+    // this, we strip the fragment from the request.
+    // TODO: Remove this for Drupal 8, since fixed in curl 7.20.0.
+    if (!empty($curl_options[CURLOPT_URL]) && strpos($curl_options[CURLOPT_URL], '#')) {
+      $original_url = $curl_options[CURLOPT_URL];
+      $curl_options[CURLOPT_URL] = strtok($curl_options[CURLOPT_URL], '#');
+    }
+
+    $url = empty($curl_options[CURLOPT_URL]) ? curl_getinfo($this->curlHandle, CURLINFO_EFFECTIVE_URL) : $curl_options[CURLOPT_URL];
+
+    if (!empty($curl_options[CURLOPT_POST])) {
+      // This is a fix for the Curl library to prevent Expect: 100-continue
+      // headers in POST requests, that may cause unexpected HTTP response
+      // codes from some webservers (like lighttpd that returns a 417 error
+      // code). It is done by setting an empty "Expect" header field that is
+      // not overwritten by Curl.
+      $curl_options[CURLOPT_HTTPHEADER][] = 'Expect:';
+    }
+    curl_setopt_array($this->curlHandle, $this->additionalCurlOptions + $curl_options);
+
+    if (!$redirect) {
+      // Reset headers, the session ID and the redirect counter.
+      $this->session_id = NULL;
+      $this->headers = array();
+      $this->redirect_count = 0;
+    }
+
+    $content = curl_exec($this->curlHandle);
+    $status = curl_getinfo($this->curlHandle, CURLINFO_HTTP_CODE);
+
+    // cURL incorrectly handles URLs with fragments, so instead of
+    // letting cURL handle redirects we take of them ourselves to
+    // to prevent fragments being sent to the web server as part
+    // of the request.
+    // TODO: Remove this for Drupal 8, since fixed in curl 7.20.0.
+    if (in_array($status, array(300, 301, 302, 303, 305, 307)) && $this->redirect_count < variable_get('simpletest_maximum_redirects', 5)) {
+      if ($this->drupalGetHeader('location')) {
+        $this->redirect_count++;
+        $curl_options = array();
+        $curl_options[CURLOPT_URL] = $this->drupalGetHeader('location');
+        $curl_options[CURLOPT_HTTPGET] = TRUE;
+        return $this->curlExec($curl_options, TRUE);
+      }
+    }
+
+    $this->drupalSetContent($content, isset($original_url) ? $original_url : curl_getinfo($this->curlHandle, CURLINFO_EFFECTIVE_URL));
+    $message_vars = array(
+      '!method' => !empty($curl_options[CURLOPT_NOBODY]) ? 'HEAD' : (empty($curl_options[CURLOPT_POSTFIELDS]) ? 'GET' : 'POST'),
+      '@url' => isset($original_url) ? $original_url : $url,
+      '@status' => $status,
+      '!length' => format_size(strlen($this->drupalGetContent()))
+    );
+    $message = t('!method @url returned @status (!length).', $message_vars);
+    $this->assertTrue($this->drupalGetContent() !== FALSE, $message, t('Browser'));
+    return $this->drupalGetContent();
+  }
+
+  /**
+   * Reads headers and registers errors received from the tested site.
+   *
+   * @see _drupal_log_error().
+   *
+   * @param $curlHandler
+   *   The cURL handler.
+   * @param $header
+   *   An header.
+   */
+  protected function curlHeaderCallback($curlHandler, $header) {
+    // Header fields can be extended over multiple lines by preceding each
+    // extra line with at least one SP or HT. They should be joined on receive.
+    // Details are in RFC2616 section 4.
+    if ($header[0] == ' ' || $header[0] == "\t") {
+      // Normalize whitespace between chucks.
+      $this->headers[] = array_pop($this->headers) . ' ' . trim($header);
+    }
+    else {
+      $this->headers[] = $header;
+    }
+
+    // Errors are being sent via X-Drupal-Assertion-* headers,
+    // generated by _drupal_log_error() in the exact form required
+    // by DrupalWebTestCase::error().
+    if (preg_match('/^X-Drupal-Assertion-[0-9]+: (.*)$/', $header, $matches)) {
+      // Call DrupalWebTestCase::error() with the parameters from the header.
+      call_user_func_array(array(&$this, 'error'), unserialize(urldecode($matches[1])));
+    }
+
+    // Save cookies.
+    if (preg_match('/^Set-Cookie: ([^=]+)=(.+)/', $header, $matches)) {
+      $name = $matches[1];
+      $parts = array_map('trim', explode(';', $matches[2]));
+      $value = array_shift($parts);
+      $this->cookies[$name] = array('value' => $value, 'secure' => in_array('secure', $parts));
+      if ($name == $this->session_name) {
+        if ($value != 'deleted') {
+          $this->session_id = $value;
+        }
+        else {
+          $this->session_id = NULL;
+        }
+      }
+    }
+
+    // This is required by cURL.
+    return strlen($header);
+  }
+
+  /**
+   * Close the cURL handler and unset the handler.
+   */
+  protected function curlClose() {
+    if (isset($this->curlHandle)) {
+      curl_close($this->curlHandle);
+      unset($this->curlHandle);
+    }
+  }
+
+  /**
+   * Parse content returned from curlExec using DOM and SimpleXML.
+   *
+   * @return
+   *   A SimpleXMLElement or FALSE on failure.
+   */
+  protected function parse() {
+    if (!$this->elements) {
+      // DOM can load HTML soup. But, HTML soup can throw warnings, suppress
+      // them.
+      $htmlDom = new DOMDocument();
+      @$htmlDom->loadHTML($this->drupalGetContent());
+      if ($htmlDom) {
+        $this->pass(t('Valid HTML found on "@path"', array('@path' => $this->getUrl())), t('Browser'));
+        // It's much easier to work with simplexml than DOM, luckily enough
+        // we can just simply import our DOM tree.
+        $this->elements = simplexml_import_dom($htmlDom);
+      }
+    }
+    if (!$this->elements) {
+      $this->fail(t('Parsed page successfully.'), t('Browser'));
+    }
+
+    return $this->elements;
+  }
+
+  /**
+   * Retrieves a Drupal path or an absolute path.
+   *
+   * @param $path
+   *   Drupal path or URL to load into internal browser
+   * @param $options
+   *   Options to be forwarded to url().
+   * @param $headers
+   *   An array containing additional HTTP request headers, each formatted as
+   *   "name: value".
+   * @return
+   *   The retrieved HTML string, also available as $this->drupalGetContent()
+   */
+  protected function drupalGet($path, array $options = array(), array $headers = array()) {
+    $options['absolute'] = TRUE;
+
+    // We re-using a CURL connection here. If that connection still has certain
+    // options set, it might change the GET into a POST. Make sure we clear out
+    // previous options.
+    $out = $this->curlExec(array(CURLOPT_HTTPGET => TRUE, CURLOPT_URL => url($path, $options), CURLOPT_NOBODY => FALSE, CURLOPT_HTTPHEADER => $headers));
+    $this->refreshVariables(); // Ensure that any changes to variables in the other thread are picked up.
+
+    // Replace original page output with new output from redirected page(s).
+    if ($new = $this->checkForMetaRefresh()) {
+      $out = $new;
+    }
+    $this->verbose('GET request to: ' . $path .
+                   '<hr />Ending URL: ' . $this->getUrl() .
+                   '<hr />' . $out);
+    return $out;
+  }
+
+  /**
+   * Retrieve a Drupal path or an absolute path and JSON decode the result.
+   */
+  protected function drupalGetAJAX($path, array $options = array(), array $headers = array()) {
+    return drupal_json_decode($this->drupalGet($path, $options, $headers));
+  }
+
+  /**
+   * Execute a POST request on a Drupal page.
+   * It will be done as usual POST request with SimpleBrowser.
+   *
+   * @param $path
+   *   Location of the post form. Either a Drupal path or an absolute path or
+   *   NULL to post to the current page. For multi-stage forms you can set the
+   *   path to NULL and have it post to the last received page. Example:
+   *
+   *   @code
+   *   // First step in form.
+   *   $edit = array(...);
+   *   $this->drupalPost('some_url', $edit, t('Save'));
+   *
+   *   // Second step in form.
+   *   $edit = array(...);
+   *   $this->drupalPost(NULL, $edit, t('Save'));
+   *   @endcode
+   * @param  $edit
+   *   Field data in an associative array. Changes the current input fields
+   *   (where possible) to the values indicated. A checkbox can be set to
+   *   TRUE to be checked and FALSE to be unchecked. Note that when a form
+   *   contains file upload fields, other fields cannot start with the '@'
+   *   character.
+   *
+   *   Multiple select fields can be set using name[] and setting each of the
+   *   possible values. Example:
+   *   @code
+   *   $edit = array();
+   *   $edit['name[]'] = array('value1', 'value2');
+   *   @endcode
+   * @param $submit
+   *   Value of the submit button whose click is to be emulated. For example,
+   *   t('Save'). The processing of the request depends on this value. For
+   *   example, a form may have one button with the value t('Save') and another
+   *   button with the value t('Delete'), and execute different code depending
+   *   on which one is clicked.
+   *
+   *   This function can also be called to emulate an Ajax submission. In this
+   *   case, this value needs to be an array with the following keys:
+   *   - path: A path to submit the form values to for Ajax-specific processing,
+   *     which is likely different than the $path parameter used for retrieving
+   *     the initial form. Defaults to 'system/ajax'.
+   *   - triggering_element: If the value for the 'path' key is 'system/ajax' or
+   *     another generic Ajax processing path, this needs to be set to the name
+   *     of the element. If the name doesn't identify the element uniquely, then
+   *     this should instead be an array with a single key/value pair,
+   *     corresponding to the element name and value. The callback for the
+   *     generic Ajax processing path uses this to find the #ajax information
+   *     for the element, including which specific callback to use for
+   *     processing the request.
+   *
+   *   This can also be set to NULL in order to emulate an Internet Explorer
+   *   submission of a form with a single text field, and pressing ENTER in that
+   *   textfield: under these conditions, no button information is added to the
+   *   POST data.
+   * @param $options
+   *   Options to be forwarded to url().
+   * @param $headers
+   *   An array containing additional HTTP request headers, each formatted as
+   *   "name: value".
+   * @param $form_html_id
+   *   (optional) HTML ID of the form to be submitted. On some pages
+   *   there are many identical forms, so just using the value of the submit
+   *   button is not enough. For example: 'trigger-node-presave-assign-form'.
+   *   Note that this is not the Drupal $form_id, but rather the HTML ID of the
+   *   form, which is typically the same thing but with hyphens replacing the
+   *   underscores.
+   * @param $extra_post
+   *   (optional) A string of additional data to append to the POST submission.
+   *   This can be used to add POST data for which there are no HTML fields, as
+   *   is done by drupalPostAJAX(). This string is literally appended to the
+   *   POST data, so it must already be urlencoded and contain a leading "&"
+   *   (e.g., "&extra_var1=hello+world&extra_var2=you%26me").
+   */
+  protected function drupalPost($path, $edit, $submit, array $options = array(), array $headers = array(), $form_html_id = NULL, $extra_post = NULL) {
+    $submit_matches = FALSE;
+    $ajax = is_array($submit);
+    if (isset($path)) {
+      $this->drupalGet($path, $options);
+    }
+    if ($this->parse()) {
+      $edit_save = $edit;
+      // Let's iterate over all the forms.
+      $xpath = "//form";
+      if (!empty($form_html_id)) {
+        $xpath .= "[@id='" . $form_html_id . "']";
+      }
+      $forms = $this->xpath($xpath);
+      foreach ($forms as $form) {
+        // We try to set the fields of this form as specified in $edit.
+        $edit = $edit_save;
+        $post = array();
+        $upload = array();
+        $submit_matches = $this->handleForm($post, $edit, $upload, $ajax ? NULL : $submit, $form);
+        $action = isset($form['action']) ? $this->getAbsoluteUrl((string) $form['action']) : $this->getUrl();
+        if ($ajax) {
+          $action = $this->getAbsoluteUrl(!empty($submit['path']) ? $submit['path'] : 'system/ajax');
+          // Ajax callbacks verify the triggering element if necessary, so while
+          // we may eventually want extra code that verifies it in the
+          // handleForm() function, it's not currently a requirement.
+          $submit_matches = TRUE;
+        }
+
+        // We post only if we managed to handle every field in edit and the
+        // submit button matches.
+        if (!$edit && ($submit_matches || !isset($submit))) {
+          $post_array = $post;
+          if ($upload) {
+            // TODO: cURL handles file uploads for us, but the implementation
+            // is broken. This is a less than elegant workaround. Alternatives
+            // are being explored at #253506.
+            foreach ($upload as $key => $file) {
+              $file = drupal_realpath($file);
+              if ($file && is_file($file)) {
+                // Use the new CurlFile class for file uploads when using PHP
+                // 5.5 or higher.
+                if (class_exists('CurlFile')) {
+                  $post[$key] = curl_file_create($file);
+                }
+                else {
+                  $post[$key] = '@' . $file;
+                }
+              }
+            }
+          }
+          else {
+            foreach ($post as $key => $value) {
+              // Encode according to application/x-www-form-urlencoded
+              // Both names and values needs to be urlencoded, according to
+              // http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
+              $post[$key] = urlencode($key) . '=' . urlencode($value);
+            }
+            $post = implode('&', $post) . $extra_post;
+          }
+          $out = $this->curlExec(array(CURLOPT_URL => $action, CURLOPT_POST => TRUE, CURLOPT_POSTFIELDS => $post, CURLOPT_HTTPHEADER => $headers));
+          // Ensure that any changes to variables in the other thread are picked up.
+          $this->refreshVariables();
+
+          // Replace original page output with new output from redirected page(s).
+          if ($new = $this->checkForMetaRefresh()) {
+            $out = $new;
+          }
+          $this->verbose('POST request to: ' . $path .
+                         '<hr />Ending URL: ' . $this->getUrl() .
+                         '<hr />Fields: ' . highlight_string('<?php ' . var_export($post_array, TRUE), TRUE) .
+                         '<hr />' . $out);
+          return $out;
+        }
+      }
+      // We have not found a form which contained all fields of $edit.
+      foreach ($edit as $name => $value) {
+        $this->fail(t('Failed to set field @name to @value', array('@name' => $name, '@value' => $value)));
+      }
+      if (!$ajax && isset($submit)) {
+        $this->assertTrue($submit_matches, t('Found the @submit button', array('@submit' => $submit)));
+      }
+      $this->fail(t('Found the requested form fields at @path', array('@path' => $path)));
+    }
+  }
+
+  /**
+   * Execute an Ajax submission.
+   *
+   * This executes a POST as ajax.js does. It uses the returned JSON data, an
+   * array of commands, to update $this->content using equivalent DOM
+   * manipulation as is used by ajax.js. It also returns the array of commands.
+   *
+   * @param $path
+   *   Location of the form containing the Ajax enabled element to test. Can be
+   *   either a Drupal path or an absolute path or NULL to use the current page.
+   * @param $edit
+   *   Field data in an associative array. Changes the current input fields
+   *   (where possible) to the values indicated.
+   * @param $triggering_element
+   *   The name of the form element that is responsible for triggering the Ajax
+   *   functionality to test. May be a string or, if the triggering element is
+   *   a button, an associative array where the key is the name of the button
+   *   and the value is the button label. i.e.) array('op' => t('Refresh')).
+   * @param $ajax_path
+   *   (optional) Override the path set by the Ajax settings of the triggering
+   *   element. In the absence of both the triggering element's Ajax path and
+   *   $ajax_path 'system/ajax' will be used.
+   * @param $options
+   *   (optional) Options to be forwarded to url().
+   * @param $headers
+   *   (optional) An array containing additional HTTP request headers, each
+   *   formatted as "name: value". Forwarded to drupalPost().
+   * @param $form_html_id
+   *   (optional) HTML ID of the form to be submitted, use when there is more
+   *   than one identical form on the same page and the value of the triggering
+   *   element is not enough to identify the form. Note this is not the Drupal
+   *   ID of the form but rather the HTML ID of the form.
+   * @param $ajax_settings
+   *   (optional) An array of Ajax settings which if specified will be used in
+   *   place of the Ajax settings of the triggering element.
+   *
+   * @return
+   *   An array of Ajax commands.
+   *
+   * @see drupalPost()
+   * @see ajax.js
+   */
+  protected function drupalPostAJAX($path, $edit, $triggering_element, $ajax_path = NULL, array $options = array(), array $headers = array(), $form_html_id = NULL, $ajax_settings = NULL) {
+    // Get the content of the initial page prior to calling drupalPost(), since
+    // drupalPost() replaces $this->content.
+    if (isset($path)) {
+      $this->drupalGet($path, $options);
+    }
+    $content = $this->content;
+    $drupal_settings = $this->drupalSettings;
+
+    // Get the Ajax settings bound to the triggering element.
+    if (!isset($ajax_settings)) {
+      if (is_array($triggering_element)) {
+        $xpath = '//*[@name="' . key($triggering_element) . '" and @value="' . current($triggering_element) . '"]';
+      }
+      else {
+        $xpath = '//*[@name="' . $triggering_element . '"]';
+      }
+      if (isset($form_html_id)) {
+        $xpath = '//form[@id="' . $form_html_id . '"]' . $xpath;
+      }
+      $element = $this->xpath($xpath);
+      $element_id = (string) $element[0]['id'];
+      $ajax_settings = $drupal_settings['ajax'][$element_id];
+    }
+
+    // Add extra information to the POST data as ajax.js does.
+    $extra_post = '';
+    if (isset($ajax_settings['submit'])) {
+      foreach ($ajax_settings['submit'] as $key => $value) {
+        $extra_post .= '&' . urlencode($key) . '=' . urlencode($value);
+      }
+    }
+    foreach ($this->xpath('//*[@id]') as $element) {
+      $id = (string) $element['id'];
+      $extra_post .= '&' . urlencode('ajax_html_ids[]') . '=' . urlencode($id);
+    }
+    if (isset($drupal_settings['ajaxPageState'])) {
+      $extra_post .= '&' . urlencode('ajax_page_state[theme]') . '=' . urlencode($drupal_settings['ajaxPageState']['theme']);
+      $extra_post .= '&' . urlencode('ajax_page_state[theme_token]') . '=' . urlencode($drupal_settings['ajaxPageState']['theme_token']);
+      foreach ($drupal_settings['ajaxPageState']['css'] as $key => $value) {
+        $extra_post .= '&' . urlencode("ajax_page_state[css][$key]") . '=1';
+      }
+      foreach ($drupal_settings['ajaxPageState']['js'] as $key => $value) {
+        $extra_post .= '&' . urlencode("ajax_page_state[js][$key]") . '=1';
+      }
+    }
+
+    // Unless a particular path is specified, use the one specified by the
+    // Ajax settings, or else 'system/ajax'.
+    if (!isset($ajax_path)) {
+      $ajax_path = isset($ajax_settings['url']) ? $ajax_settings['url'] : 'system/ajax';
+    }
+
+    // Submit the POST request.
+    $return = drupal_json_decode($this->drupalPost(NULL, $edit, array('path' => $ajax_path, 'triggering_element' => $triggering_element), $options, $headers, $form_html_id, $extra_post));
+
+    // Change the page content by applying the returned commands.
+    if (!empty($ajax_settings) && !empty($return)) {
+      // ajax.js applies some defaults to the settings object, so do the same
+      // for what's used by this function.
+      $ajax_settings += array(
+        'method' => 'replaceWith',
+      );
+      // DOM can load HTML soup. But, HTML soup can throw warnings, suppress
+      // them.
+      $dom = new DOMDocument();
+      @$dom->loadHTML($content);
+      // XPath allows for finding wrapper nodes better than DOM does.
+      $xpath = new DOMXPath($dom);
+      foreach ($return as $command) {
+        switch ($command['command']) {
+          case 'settings':
+            $drupal_settings = drupal_array_merge_deep($drupal_settings, $command['settings']);
+            break;
+
+          case 'insert':
+            $wrapperNode = NULL;
+            // When a command doesn't specify a selector, use the
+            // #ajax['wrapper'] which is always an HTML ID.
+            if (!isset($command['selector'])) {
+              $wrapperNode = $xpath->query('//*[@id="' . $ajax_settings['wrapper'] . '"]')->item(0);
+            }
+            // @todo Ajax commands can target any jQuery selector, but these are
+            //   hard to fully emulate with XPath. For now, just handle 'head'
+            //   and 'body', since these are used by ajax_render().
+            elseif (in_array($command['selector'], array('head', 'body'))) {
+              $wrapperNode = $xpath->query('//' . $command['selector'])->item(0);
+            }
+            if ($wrapperNode) {
+              // ajax.js adds an enclosing DIV to work around a Safari bug.
+              $newDom = new DOMDocument();
+              $newDom->loadHTML('<div>' . $command['data'] . '</div>');
+              $newNode = $dom->importNode($newDom->documentElement->firstChild->firstChild, TRUE);
+              $method = isset($command['method']) ? $command['method'] : $ajax_settings['method'];
+              // The "method" is a jQuery DOM manipulation function. Emulate
+              // each one using PHP's DOMNode API.
+              switch ($method) {
+                case 'replaceWith':
+                  $wrapperNode->parentNode->replaceChild($newNode, $wrapperNode);
+                  break;
+                case 'append':
+                  $wrapperNode->appendChild($newNode);
+                  break;
+                case 'prepend':
+                  // If no firstChild, insertBefore() falls back to
+                  // appendChild().
+                  $wrapperNode->insertBefore($newNode, $wrapperNode->firstChild);
+                  break;
+                case 'before':
+                  $wrapperNode->parentNode->insertBefore($newNode, $wrapperNode);
+                  break;
+                case 'after':
+                  // If no nextSibling, insertBefore() falls back to
+                  // appendChild().
+                  $wrapperNode->parentNode->insertBefore($newNode, $wrapperNode->nextSibling);
+                  break;
+                case 'html':
+                  foreach ($wrapperNode->childNodes as $childNode) {
+                    $wrapperNode->removeChild($childNode);
+                  }
+                  $wrapperNode->appendChild($newNode);
+                  break;
+              }
+            }
+            break;
+
+          // @todo Add suitable implementations for these commands in order to
+          //   have full test coverage of what ajax.js can do.
+          case 'remove':
+            break;
+          case 'changed':
+            break;
+          case 'css':
+            break;
+          case 'data':
+            break;
+          case 'restripe':
+            break;
+        }
+      }
+      $content = $dom->saveHTML();
+    }
+    $this->drupalSetContent($content);
+    $this->drupalSetSettings($drupal_settings);
+    return $return;
+  }
+
+  /**
+   * Runs cron in the Drupal installed by Simpletest.
+   */
+  protected function cronRun() {
+    $this->drupalGet($GLOBALS['base_url'] . '/cron.php', array('external' => TRUE, 'query' => array('cron_key' => variable_get('cron_key', 'drupal'))));
+  }
+
+  /**
+   * Check for meta refresh tag and if found call drupalGet() recursively. This
+   * function looks for the http-equiv attribute to be set to "Refresh"
+   * and is case-sensitive.
+   *
+   * @return
+   *   Either the new page content or FALSE.
+   */
+  protected function checkForMetaRefresh() {
+    if (strpos($this->drupalGetContent(), '<meta ') && $this->parse()) {
+      $refresh = $this->xpath('//meta[@http-equiv="Refresh"]');
+      if (!empty($refresh)) {
+        // Parse the content attribute of the meta tag for the format:
+        // "[delay]: URL=[page_to_redirect_to]".
+        if (preg_match('/\d+;\s*URL=(?P<url>.*)/i', $refresh[0]['content'], $match)) {
+          return $this->drupalGet($this->getAbsoluteUrl(decode_entities($match['url'])));
+        }
+      }
+    }
+    return FALSE;
+  }
+
+  /**
+   * Retrieves only the headers for a Drupal path or an absolute path.
+   *
+   * @param $path
+   *   Drupal path or URL to load into internal browser
+   * @param $options
+   *   Options to be forwarded to url().
+   * @param $headers
+   *   An array containing additional HTTP request headers, each formatted as
+   *   "name: value".
+   * @return
+   *   The retrieved headers, also available as $this->drupalGetContent()
+   */
+  protected function drupalHead($path, array $options = array(), array $headers = array()) {
+    $options['absolute'] = TRUE;
+    $out = $this->curlExec(array(CURLOPT_NOBODY => TRUE, CURLOPT_URL => url($path, $options), CURLOPT_HTTPHEADER => $headers));
+    $this->refreshVariables(); // Ensure that any changes to variables in the other thread are picked up.
+    return $out;
+  }
+
+  /**
+   * Handle form input related to drupalPost(). Ensure that the specified fields
+   * exist and attempt to create POST data in the correct manner for the particular
+   * field type.
+   *
+   * @param $post
+   *   Reference to array of post values.
+   * @param $edit
+   *   Reference to array of edit values to be checked against the form.
+   * @param $submit
+   *   Form submit button value.
+   * @param $form
+   *   Array of form elements.
+   * @return
+   *   Submit value matches a valid submit input in the form.
+   */
+  protected function handleForm(&$post, &$edit, &$upload, $submit, $form) {
+    // Retrieve the form elements.
+    $elements = $form->xpath('.//input[not(@disabled)]|.//textarea[not(@disabled)]|.//select[not(@disabled)]');
+    $submit_matches = FALSE;
+    foreach ($elements as $element) {
+      // SimpleXML objects need string casting all the time.
+      $name = (string) $element['name'];
+      // This can either be the type of <input> or the name of the tag itself
+      // for <select> or <textarea>.
+      $type = isset($element['type']) ? (string) $element['type'] : $element->getName();
+      $value = isset($element['value']) ? (string) $element['value'] : '';
+      $done = FALSE;
+      if (isset($edit[$name])) {
+        switch ($type) {
+          case 'text':
+          case 'tel':
+          case 'textarea':
+          case 'url':
+          case 'number':
+          case 'range':
+          case 'color':
+          case 'hidden':
+          case 'password':
+          case 'email':
+          case 'search':
+            $post[$name] = $edit[$name];
+            unset($edit[$name]);
+            break;
+          case 'radio':
+            if ($edit[$name] == $value) {
+              $post[$name] = $edit[$name];
+              unset($edit[$name]);
+            }
+            break;
+          case 'checkbox':
+            // To prevent checkbox from being checked.pass in a FALSE,
+            // otherwise the checkbox will be set to its value regardless
+            // of $edit.
+            if ($edit[$name] === FALSE) {
+              unset($edit[$name]);
+              continue 2;
+            }
+            else {
+              unset($edit[$name]);
+              $post[$name] = $value;
+            }
+            break;
+          case 'select':
+            $new_value = $edit[$name];
+            $options = $this->getAllOptions($element);
+            if (is_array($new_value)) {
+              // Multiple select box.
+              if (!empty($new_value)) {
+                $index = 0;
+                $key = preg_replace('/\[\]$/', '', $name);
+                foreach ($options as $option) {
+                  $option_value = (string) $option['value'];
+                  if (in_array($option_value, $new_value)) {
+                    $post[$key . '[' . $index++ . ']'] = $option_value;
+                    $done = TRUE;
+                    unset($edit[$name]);
+                  }
+                }
+              }
+              else {
+                // No options selected: do not include any POST data for the
+                // element.
+                $done = TRUE;
+                unset($edit[$name]);
+              }
+            }
+            else {
+              // Single select box.
+              foreach ($options as $option) {
+                if ($new_value == $option['value']) {
+                  $post[$name] = $new_value;
+                  unset($edit[$name]);
+                  $done = TRUE;
+                  break;
+                }
+              }
+            }
+            break;
+          case 'file':
+            $upload[$name] = $edit[$name];
+            unset($edit[$name]);
+            break;
+        }
+      }
+      if (!isset($post[$name]) && !$done) {
+        switch ($type) {
+          case 'textarea':
+            $post[$name] = (string) $element;
+            break;
+          case 'select':
+            $single = empty($element['multiple']);
+            $first = TRUE;
+            $index = 0;
+            $key = preg_replace('/\[\]$/', '', $name);
+            $options = $this->getAllOptions($element);
+            foreach ($options as $option) {
+              // For single select, we load the first option, if there is a
+              // selected option that will overwrite it later.
+              if ($option['selected'] || ($first && $single)) {
+                $first = FALSE;
+                if ($single) {
+                  $post[$name] = (string) $option['value'];
+                }
+                else {
+                  $post[$key . '[' . $index++ . ']'] = (string) $option['value'];
+                }
+              }
+            }
+            break;
+          case 'file':
+            break;
+          case 'submit':
+          case 'image':
+            if (isset($submit) && $submit == $value) {
+              $post[$name] = $value;
+              $submit_matches = TRUE;
+            }
+            break;
+          case 'radio':
+          case 'checkbox':
+            if (!isset($element['checked'])) {
+              break;
+            }
+            // Deliberate no break.
+          default:
+            $post[$name] = $value;
+        }
+      }
+    }
+    return $submit_matches;
+  }
+
+  /**
+   * Builds an XPath query.
+   *
+   * Builds an XPath query by replacing placeholders in the query by the value
+   * of the arguments.
+   *
+   * XPath 1.0 (the version supported by libxml2, the underlying XML library
+   * used by PHP) doesn't support any form of quotation. This function
+   * simplifies the building of XPath expression.
+   *
+   * @param $xpath
+   *   An XPath query, possibly with placeholders in the form ':name'.
+   * @param $args
+   *   An array of arguments with keys in the form ':name' matching the
+   *   placeholders in the query. The values may be either strings or numeric
+   *   values.
+   * @return
+   *   An XPath query with arguments replaced.
+   */
+  protected function buildXPathQuery($xpath, array $args = array()) {
+    // Replace placeholders.
+    foreach ($args as $placeholder => $value) {
+      // XPath 1.0 doesn't support a way to escape single or double quotes in a
+      // string literal. We split double quotes out of the string, and encode
+      // them separately.
+      if (is_string($value)) {
+        // Explode the text at the quote characters.
+        $parts = explode('"', $value);
+
+        // Quote the parts.
+        foreach ($parts as &$part) {
+          $part = '"' . $part . '"';
+        }
+
+        // Return the string.
+        $value = count($parts) > 1 ? 'concat(' . implode(', \'"\', ', $parts) . ')' : $parts[0];
+      }
+      $xpath = preg_replace('/' . preg_quote($placeholder) . '\b/', $value, $xpath);
+    }
+    return $xpath;
+  }
+
+  /**
+   * Perform an xpath search on the contents of the internal browser. The search
+   * is relative to the root element (HTML tag normally) of the page.
+   *
+   * @param $xpath
+   *   The xpath string to use in the search.
+   * @return
+   *   The return value of the xpath search. For details on the xpath string
+   *   format and return values see the SimpleXML documentation,
+   *   http://us.php.net/manual/function.simplexml-element-xpath.php.
+   */
+  protected function xpath($xpath, array $arguments = array()) {
+    if ($this->parse()) {
+      $xpath = $this->buildXPathQuery($xpath, $arguments);
+      $result = $this->elements->xpath($xpath);
+      // Some combinations of PHP / libxml versions return an empty array
+      // instead of the documented FALSE. Forcefully convert any falsish values
+      // to an empty array to allow foreach(...) constructions.
+      return $result ? $result : array();
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  /**
+   * Get all option elements, including nested options, in a select.
+   *
+   * @param $element
+   *   The element for which to get the options.
+   * @return
+   *   Option elements in select.
+   */
+  protected function getAllOptions(SimpleXMLElement $element) {
+    $options = array();
+    // Add all options items.
+    foreach ($element->option as $option) {
+      $options[] = $option;
+    }
+
+    // Search option group children.
+    if (isset($element->optgroup)) {
+      foreach ($element->optgroup as $group) {
+        $options = array_merge($options, $this->getAllOptions($group));
+      }
+    }
+    return $options;
+  }
+
+  /**
+   * Pass if a link with the specified label is found, and optional with the
+   * specified index.
+   *
+   * @param $label
+   *   Text between the anchor tags.
+   * @param $index
+   *   Link position counting from zero.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to, defaults to 'Other'.
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertLink($label, $index = 0, $message = '', $group = 'Other') {
+    $links = $this->xpath('//a[normalize-space(text())=:label]', array(':label' => $label));
+    $message = ($message ?  $message : t('Link with label %label found.', array('%label' => $label)));
+    return $this->assert(isset($links[$index]), $message, $group);
+  }
+
+  /**
+   * Pass if a link with the specified label is not found.
+   *
+   * @param $label
+   *   Text between the anchor tags.
+   * @param $index
+   *   Link position counting from zero.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to, defaults to 'Other'.
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertNoLink($label, $message = '', $group = 'Other') {
+    $links = $this->xpath('//a[normalize-space(text())=:label]', array(':label' => $label));
+    $message = ($message ?  $message : t('Link with label %label not found.', array('%label' => $label)));
+    return $this->assert(empty($links), $message, $group);
+  }
+
+  /**
+   * Pass if a link containing a given href (part) is found.
+   *
+   * @param $href
+   *   The full or partial value of the 'href' attribute of the anchor tag.
+   * @param $index
+   *   Link position counting from zero.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to, defaults to 'Other'.
+   *
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertLinkByHref($href, $index = 0, $message = '', $group = 'Other') {
+    $links = $this->xpath('//a[contains(@href, :href)]', array(':href' => $href));
+    $message = ($message ?  $message : t('Link containing href %href found.', array('%href' => $href)));
+    return $this->assert(isset($links[$index]), $message, $group);
+  }
+
+  /**
+   * Pass if a link containing a given href (part) is not found.
+   *
+   * @param $href
+   *   The full or partial value of the 'href' attribute of the anchor tag.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to, defaults to 'Other'.
+   *
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertNoLinkByHref($href, $message = '', $group = 'Other') {
+    $links = $this->xpath('//a[contains(@href, :href)]', array(':href' => $href));
+    $message = ($message ?  $message : t('No link containing href %href found.', array('%href' => $href)));
+    return $this->assert(empty($links), $message, $group);
+  }
+
+  /**
+   * Follows a link by name.
+   *
+   * Will click the first link found with this link text by default, or a later
+   * one if an index is given. Match is case sensitive with normalized space.
+   * The label is translated label. There is an assert for successful click.
+   *
+   * @param $label
+   *   Text between the anchor tags.
+   * @param $index
+   *   Link position counting from zero.
+   * @return
+   *   Page on success, or FALSE on failure.
+   */
+  protected function clickLink($label, $index = 0) {
+    $url_before = $this->getUrl();
+    $urls = $this->xpath('//a[normalize-space(text())=:label]', array(':label' => $label));
+
+    if (isset($urls[$index])) {
+      $url_target = $this->getAbsoluteUrl($urls[$index]['href']);
+    }
+
+    $this->assertTrue(isset($urls[$index]), t('Clicked link %label (@url_target) from @url_before', array('%label' => $label, '@url_target' => $url_target, '@url_before' => $url_before)), t('Browser'));
+
+    if (isset($url_target)) {
+      return $this->drupalGet($url_target);
+    }
+    return FALSE;
+  }
+
+  /**
+   * Takes a path and returns an absolute path.
+   *
+   * @param $path
+   *   A path from the internal browser content.
+   * @return
+   *   The $path with $base_url prepended, if necessary.
+   */
+  protected function getAbsoluteUrl($path) {
+    global $base_url, $base_path;
+
+    $parts = parse_url($path);
+    if (empty($parts['host'])) {
+      // Ensure that we have a string (and no xpath object).
+      $path = (string) $path;
+      // Strip $base_path, if existent.
+      $length = strlen($base_path);
+      if (substr($path, 0, $length) === $base_path) {
+        $path = substr($path, $length);
+      }
+      // Ensure that we have an absolute path.
+      if ($path[0] !== '/') {
+        $path = '/' . $path;
+      }
+      // Finally, prepend the $base_url.
+      $path = $base_url . $path;
+    }
+    return $path;
+  }
+
+  /**
+   * Get the current URL from the cURL handler.
+   *
+   * @return
+   *   The current URL.
+   */
+  protected function getUrl() {
+    return $this->url;
+  }
+
+  /**
+   * Gets the HTTP response headers of the requested page. Normally we are only
+   * interested in the headers returned by the last request. However, if a page
+   * is redirected or HTTP authentication is in use, multiple requests will be
+   * required to retrieve the page. Headers from all requests may be requested
+   * by passing TRUE to this function.
+   *
+   * @param $all_requests
+   *   Boolean value specifying whether to return headers from all requests
+   *   instead of just the last request. Defaults to FALSE.
+   * @return
+   *   A name/value array if headers from only the last request are requested.
+   *   If headers from all requests are requested, an array of name/value
+   *   arrays, one for each request.
+   *
+   *   The pseudonym ":status" is used for the HTTP status line.
+   *
+   *   Values for duplicate headers are stored as a single comma-separated list.
+   */
+  protected function drupalGetHeaders($all_requests = FALSE) {
+    $request = 0;
+    $headers = array($request => array());
+    foreach ($this->headers as $header) {
+      $header = trim($header);
+      if ($header === '') {
+        $request++;
+      }
+      else {
+        if (strpos($header, 'HTTP/') === 0) {
+          $name = ':status';
+          $value = $header;
+        }
+        else {
+          list($name, $value) = explode(':', $header, 2);
+          $name = strtolower($name);
+        }
+        if (isset($headers[$request][$name])) {
+          $headers[$request][$name] .= ',' . trim($value);
+        }
+        else {
+          $headers[$request][$name] = trim($value);
+        }
+      }
+    }
+    if (!$all_requests) {
+      $headers = array_pop($headers);
+    }
+    return $headers;
+  }
+
+  /**
+   * Gets the value of an HTTP response header. If multiple requests were
+   * required to retrieve the page, only the headers from the last request will
+   * be checked by default. However, if TRUE is passed as the second argument,
+   * all requests will be processed from last to first until the header is
+   * found.
+   *
+   * @param $name
+   *   The name of the header to retrieve. Names are case-insensitive (see RFC
+   *   2616 section 4.2).
+   * @param $all_requests
+   *   Boolean value specifying whether to check all requests if the header is
+   *   not found in the last request. Defaults to FALSE.
+   * @return
+   *   The HTTP header value or FALSE if not found.
+   */
+  protected function drupalGetHeader($name, $all_requests = FALSE) {
+    $name = strtolower($name);
+    $header = FALSE;
+    if ($all_requests) {
+      foreach (array_reverse($this->drupalGetHeaders(TRUE)) as $headers) {
+        if (isset($headers[$name])) {
+          $header = $headers[$name];
+          break;
+        }
+      }
+    }
+    else {
+      $headers = $this->drupalGetHeaders();
+      if (isset($headers[$name])) {
+        $header = $headers[$name];
+      }
+    }
+    return $header;
+  }
+
+  /**
+   * Gets the current raw HTML of requested page.
+   */
+  protected function drupalGetContent() {
+    return $this->content;
+  }
+
+  /**
+   * Gets the value of the Drupal.settings JavaScript variable for the currently loaded page.
+   */
+  protected function drupalGetSettings() {
+    return $this->drupalSettings;
+  }
+
+  /**
+   * Gets an array containing all e-mails sent during this test case.
+   *
+   * @param $filter
+   *   An array containing key/value pairs used to filter the e-mails that are returned.
+   * @return
+   *   An array containing e-mail messages captured during the current test.
+   */
+  protected function drupalGetMails($filter = array()) {
+    $captured_emails = variable_get('drupal_test_email_collector', array());
+    $filtered_emails = array();
+
+    foreach ($captured_emails as $message) {
+      foreach ($filter as $key => $value) {
+        if (!isset($message[$key]) || $message[$key] != $value) {
+          continue 2;
+        }
+      }
+      $filtered_emails[] = $message;
+    }
+
+    return $filtered_emails;
+  }
+
+  /**
+   * Sets the raw HTML content. This can be useful when a page has been fetched
+   * outside of the internal browser and assertions need to be made on the
+   * returned page.
+   *
+   * A good example would be when testing drupal_http_request(). After fetching
+   * the page the content can be set and page elements can be checked to ensure
+   * that the function worked properly.
+   */
+  protected function drupalSetContent($content, $url = 'internal:') {
+    $this->content = $content;
+    $this->url = $url;
+    $this->plainTextContent = FALSE;
+    $this->elements = FALSE;
+    $this->drupalSettings = array();
+    if (preg_match('/jQuery\.extend\(Drupal\.settings, (.*?)\);/', $content, $matches)) {
+      $this->drupalSettings = drupal_json_decode($matches[1]);
+    }
+  }
+
+  /**
+   * Sets the value of the Drupal.settings JavaScript variable for the currently loaded page.
+   */
+  protected function drupalSetSettings($settings) {
+    $this->drupalSettings = $settings;
+  }
+
+  /**
+   * Pass if the internal browser's URL matches the given path.
+   *
+   * @param $path
+   *   The expected system path.
+   * @param $options
+   *   (optional) Any additional options to pass for $path to url().
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to, defaults to 'Other'.
+   *
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertUrl($path, array $options = array(), $message = '', $group = 'Other') {
+    if (!$message) {
+      $message = t('Current URL is @url.', array(
+        '@url' => var_export(url($path, $options), TRUE),
+      ));
+    }
+    $options['absolute'] = TRUE;
+    return $this->assertEqual($this->getUrl(), url($path, $options), $message, $group);
+  }
+
+  /**
+   * Pass if the raw text IS found on the loaded page, fail otherwise. Raw text
+   * refers to the raw HTML that the page generated.
+   *
+   * @param $raw
+   *   Raw (HTML) string to look for.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to, defaults to 'Other'.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertRaw($raw, $message = '', $group = 'Other') {
+    if (!$message) {
+      $message = t('Raw "@raw" found', array('@raw' => $raw));
+    }
+    return $this->assert(strpos($this->drupalGetContent(), $raw) !== FALSE, $message, $group);
+  }
+
+  /**
+   * Pass if the raw text is NOT found on the loaded page, fail otherwise. Raw text
+   * refers to the raw HTML that the page generated.
+   *
+   * @param $raw
+   *   Raw (HTML) string to look for.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to, defaults to 'Other'.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertNoRaw($raw, $message = '', $group = 'Other') {
+    if (!$message) {
+      $message = t('Raw "@raw" not found', array('@raw' => $raw));
+    }
+    return $this->assert(strpos($this->drupalGetContent(), $raw) === FALSE, $message, $group);
+  }
+
+  /**
+   * Pass if the text IS found on the text version of the page. The text version
+   * is the equivalent of what a user would see when viewing through a web browser.
+   * In other words the HTML has been filtered out of the contents.
+   *
+   * @param $text
+   *   Plain text to look for.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to, defaults to 'Other'.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertText($text, $message = '', $group = 'Other') {
+    return $this->assertTextHelper($text, $message, $group, FALSE);
+  }
+
+  /**
+   * Pass if the text is NOT found on the text version of the page. The text version
+   * is the equivalent of what a user would see when viewing through a web browser.
+   * In other words the HTML has been filtered out of the contents.
+   *
+   * @param $text
+   *   Plain text to look for.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to, defaults to 'Other'.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertNoText($text, $message = '', $group = 'Other') {
+    return $this->assertTextHelper($text, $message, $group, TRUE);
+  }
+
+  /**
+   * Helper for assertText and assertNoText.
+   *
+   * It is not recommended to call this function directly.
+   *
+   * @param $text
+   *   Plain text to look for.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to.
+   * @param $not_exists
+   *   TRUE if this text should not exist, FALSE if it should.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertTextHelper($text, $message = '', $group, $not_exists) {
+    if ($this->plainTextContent === FALSE) {
+      $this->plainTextContent = filter_xss($this->drupalGetContent(), array());
+    }
+    if (!$message) {
+      $message = !$not_exists ? t('"@text" found', array('@text' => $text)) : t('"@text" not found', array('@text' => $text));
+    }
+    return $this->assert($not_exists == (strpos($this->plainTextContent, $text) === FALSE), $message, $group);
+  }
+
+  /**
+   * Pass if the text is found ONLY ONCE on the text version of the page.
+   *
+   * The text version is the equivalent of what a user would see when viewing
+   * through a web browser. In other words the HTML has been filtered out of
+   * the contents.
+   *
+   * @param $text
+   *   Plain text to look for.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to, defaults to 'Other'.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertUniqueText($text, $message = '', $group = 'Other') {
+    return $this->assertUniqueTextHelper($text, $message, $group, TRUE);
+  }
+
+  /**
+   * Pass if the text is found MORE THAN ONCE on the text version of the page.
+   *
+   * The text version is the equivalent of what a user would see when viewing
+   * through a web browser. In other words the HTML has been filtered out of
+   * the contents.
+   *
+   * @param $text
+   *   Plain text to look for.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to, defaults to 'Other'.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertNoUniqueText($text, $message = '', $group = 'Other') {
+    return $this->assertUniqueTextHelper($text, $message, $group, FALSE);
+  }
+
+  /**
+   * Helper for assertUniqueText and assertNoUniqueText.
+   *
+   * It is not recommended to call this function directly.
+   *
+   * @param $text
+   *   Plain text to look for.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to.
+   * @param $be_unique
+   *   TRUE if this text should be found only once, FALSE if it should be found more than once.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertUniqueTextHelper($text, $message = '', $group, $be_unique) {
+    if ($this->plainTextContent === FALSE) {
+      $this->plainTextContent = filter_xss($this->drupalGetContent(), array());
+    }
+    if (!$message) {
+      $message = '"' . $text . '"' . ($be_unique ? ' found only once' : ' found more than once');
+    }
+    $first_occurance = strpos($this->plainTextContent, $text);
+    if ($first_occurance === FALSE) {
+      return $this->assert(FALSE, $message, $group);
+    }
+    $offset = $first_occurance + strlen($text);
+    $second_occurance = strpos($this->plainTextContent, $text, $offset);
+    return $this->assert($be_unique == ($second_occurance === FALSE), $message, $group);
+  }
+
+  /**
+   * Will trigger a pass if the Perl regex pattern is found in the raw content.
+   *
+   * @param $pattern
+   *   Perl regex to look for including the regex delimiters.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertPattern($pattern, $message = '', $group = 'Other') {
+    if (!$message) {
+      $message = t('Pattern "@pattern" found', array('@pattern' => $pattern));
+    }
+    return $this->assert((bool) preg_match($pattern, $this->drupalGetContent()), $message, $group);
+  }
+
+  /**
+   * Will trigger a pass if the perl regex pattern is not present in raw content.
+   *
+   * @param $pattern
+   *   Perl regex to look for including the regex delimiters.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertNoPattern($pattern, $message = '', $group = 'Other') {
+    if (!$message) {
+      $message = t('Pattern "@pattern" not found', array('@pattern' => $pattern));
+    }
+    return $this->assert(!preg_match($pattern, $this->drupalGetContent()), $message, $group);
+  }
+
+  /**
+   * Pass if the page title is the given string.
+   *
+   * @param $title
+   *   The string the title should be.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertTitle($title, $message = '', $group = 'Other') {
+    $actual = (string) current($this->xpath('//title'));
+    if (!$message) {
+      $message = t('Page title @actual is equal to @expected.', array(
+        '@actual' => var_export($actual, TRUE),
+        '@expected' => var_export($title, TRUE),
+      ));
+    }
+    return $this->assertEqual($actual, $title, $message, $group);
+  }
+
+  /**
+   * Pass if the page title is not the given string.
+   *
+   * @param $title
+   *   The string the title should not be.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertNoTitle($title, $message = '', $group = 'Other') {
+    $actual = (string) current($this->xpath('//title'));
+    if (!$message) {
+      $message = t('Page title @actual is not equal to @unexpected.', array(
+        '@actual' => var_export($actual, TRUE),
+        '@unexpected' => var_export($title, TRUE),
+      ));
+    }
+    return $this->assertNotEqual($actual, $title, $message, $group);
+  }
+
+  /**
+   * Asserts themed output.
+   *
+   * @param $callback
+   *   The name of the theme function to invoke; e.g. 'links' for theme_links().
+   * @param $variables
+   *   An array of variables to pass to the theme function.
+   * @param $expected
+   *   The expected themed output string.
+   * @param $message
+   *   (optional) A message to display with the assertion. Do not translate
+   *   messages: use format_string() to embed variables in the message text, not
+   *   t(). If left blank, a default message will be displayed.
+   * @param $group
+   *   (optional) The group this message is in, which is displayed in a column
+   *   in test output. Use 'Debug' to indicate this is debugging output. Do not
+   *   translate this string. Defaults to 'Other'; most tests do not override
+   *   this default.
+   *
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertThemeOutput($callback, array $variables = array(), $expected, $message = '', $group = 'Other') {
+    $output = theme($callback, $variables);
+    $this->verbose('Variables:' . '<pre>' .  check_plain(var_export($variables, TRUE)) . '</pre>'
+      . '<hr />' . 'Result:' . '<pre>' .  check_plain(var_export($output, TRUE)) . '</pre>'
+      . '<hr />' . 'Expected:' . '<pre>' .  check_plain(var_export($expected, TRUE)) . '</pre>'
+      . '<hr />' . $output
+    );
+    if (!$message) {
+      $message = '%callback rendered correctly.';
+    }
+    $message = format_string($message, array('%callback' => 'theme_' . $callback . '()'));
+    return $this->assertIdentical($output, $expected, $message, $group);
+  }
+
+  /**
+   * Asserts that a field exists in the current page by the given XPath.
+   *
+   * @param $xpath
+   *   XPath used to find the field.
+   * @param $value
+   *   (optional) Value of the field to assert.
+   * @param $message
+   *   (optional) Message to display.
+   * @param $group
+   *   (optional) The group this message belongs to.
+   *
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertFieldByXPath($xpath, $value = NULL, $message = '', $group = 'Other') {
+    $fields = $this->xpath($xpath);
+
+    // If value specified then check array for match.
+    $found = TRUE;
+    if (isset($value)) {
+      $found = FALSE;
+      if ($fields) {
+        foreach ($fields as $field) {
+          if (isset($field['value']) && $field['value'] == $value) {
+            // Input element with correct value.
+            $found = TRUE;
+          }
+          elseif (isset($field->option)) {
+            // Select element found.
+            if ($this->getSelectedItem($field) == $value) {
+              $found = TRUE;
+            }
+            else {
+              // No item selected so use first item.
+              $items = $this->getAllOptions($field);
+              if (!empty($items) && $items[0]['value'] == $value) {
+                $found = TRUE;
+              }
+            }
+          }
+          elseif ((string) $field == $value) {
+            // Text area with correct text.
+            $found = TRUE;
+          }
+        }
+      }
+    }
+    return $this->assertTrue($fields && $found, $message, $group);
+  }
+
+  /**
+   * Get the selected value from a select field.
+   *
+   * @param $element
+   *   SimpleXMLElement select element.
+   * @return
+   *   The selected value or FALSE.
+   */
+  protected function getSelectedItem(SimpleXMLElement $element) {
+    foreach ($element->children() as $item) {
+      if (isset($item['selected'])) {
+        return $item['value'];
+      }
+      elseif ($item->getName() == 'optgroup') {
+        if ($value = $this->getSelectedItem($item)) {
+          return $value;
+        }
+      }
+    }
+    return FALSE;
+  }
+
+  /**
+   * Asserts that a field does not exist in the current page by the given XPath.
+   *
+   * @param $xpath
+   *   XPath used to find the field.
+   * @param $value
+   *   (optional) Value of the field to assert.
+   * @param $message
+   *   (optional) Message to display.
+   * @param $group
+   *   (optional) The group this message belongs to.
+   *
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertNoFieldByXPath($xpath, $value = NULL, $message = '', $group = 'Other') {
+    $fields = $this->xpath($xpath);
+
+    // If value specified then check array for match.
+    $found = TRUE;
+    if (isset($value)) {
+      $found = FALSE;
+      if ($fields) {
+        foreach ($fields as $field) {
+          if ($field['value'] == $value) {
+            $found = TRUE;
+          }
+        }
+      }
+    }
+    return $this->assertFalse($fields && $found, $message, $group);
+  }
+
+  /**
+   * Asserts that a field exists in the current page with the given name and value.
+   *
+   * @param $name
+   *   Name of field to assert.
+   * @param $value
+   *   Value of the field to assert.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertFieldByName($name, $value = NULL, $message = NULL) {
+    if (!isset($message)) {
+      if (!isset($value)) {
+        $message = t('Found field with name @name', array(
+          '@name' => var_export($name, TRUE),
+        ));
+      }
+      else {
+        $message = t('Found field with name @name and value @value', array(
+          '@name' => var_export($name, TRUE),
+          '@value' => var_export($value, TRUE),
+        ));
+      }
+    }
+    return $this->assertFieldByXPath($this->constructFieldXpath('name', $name), $value, $message, t('Browser'));
+  }
+
+  /**
+   * Asserts that a field does not exist with the given name and value.
+   *
+   * @param $name
+   *   Name of field to assert.
+   * @param $value
+   *   Value of the field to assert.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertNoFieldByName($name, $value = '', $message = '') {
+    return $this->assertNoFieldByXPath($this->constructFieldXpath('name', $name), $value, $message ? $message : t('Did not find field by name @name', array('@name' => $name)), t('Browser'));
+  }
+
+  /**
+   * Asserts that a field exists in the current page with the given id and value.
+   *
+   * @param $id
+   *   Id of field to assert.
+   * @param $value
+   *   Value of the field to assert.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertFieldById($id, $value = '', $message = '') {
+    return $this->assertFieldByXPath($this->constructFieldXpath('id', $id), $value, $message ? $message : t('Found field by id @id', array('@id' => $id)), t('Browser'));
+  }
+
+  /**
+   * Asserts that a field does not exist with the given id and value.
+   *
+   * @param $id
+   *   Id of field to assert.
+   * @param $value
+   *   Value of the field to assert.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertNoFieldById($id, $value = '', $message = '') {
+    return $this->assertNoFieldByXPath($this->constructFieldXpath('id', $id), $value, $message ? $message : t('Did not find field by id @id', array('@id' => $id)), t('Browser'));
+  }
+
+  /**
+   * Asserts that a checkbox field in the current page is checked.
+   *
+   * @param $id
+   *   Id of field to assert.
+   * @param $message
+   *   Message to display.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertFieldChecked($id, $message = '') {
+    $elements = $this->xpath('//input[@id=:id]', array(':id' => $id));
+    return $this->assertTrue(isset($elements[0]) && !empty($elements[0]['checked']), $message ? $message : t('Checkbox field @id is checked.', array('@id' => $id)), t('Browser'));
+  }
+
+  /**
+   * Asserts that a checkbox field in the current page is not checked.
+   *
+   * @param $id
+   *   Id of field to assert.
+   * @param $message
+   *   Message to display.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertNoFieldChecked($id, $message = '') {
+    $elements = $this->xpath('//input[@id=:id]', array(':id' => $id));
+    return $this->assertTrue(isset($elements[0]) && empty($elements[0]['checked']), $message ? $message : t('Checkbox field @id is not checked.', array('@id' => $id)), t('Browser'));
+  }
+
+  /**
+   * Asserts that a select option in the current page is checked.
+   *
+   * @param $id
+   *   Id of select field to assert.
+   * @param $option
+   *   Option to assert.
+   * @param $message
+   *   Message to display.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   *
+   * @todo $id is unusable. Replace with $name.
+   */
+  protected function assertOptionSelected($id, $option, $message = '') {
+    $elements = $this->xpath('//select[@id=:id]//option[@value=:option]', array(':id' => $id, ':option' => $option));
+    return $this->assertTrue(isset($elements[0]) && !empty($elements[0]['selected']), $message ? $message : t('Option @option for field @id is selected.', array('@option' => $option, '@id' => $id)), t('Browser'));
+  }
+
+  /**
+   * Asserts that a select option in the current page is not checked.
+   *
+   * @param $id
+   *   Id of select field to assert.
+   * @param $option
+   *   Option to assert.
+   * @param $message
+   *   Message to display.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertNoOptionSelected($id, $option, $message = '') {
+    $elements = $this->xpath('//select[@id=:id]//option[@value=:option]', array(':id' => $id, ':option' => $option));
+    return $this->assertTrue(isset($elements[0]) && empty($elements[0]['selected']), $message ? $message : t('Option @option for field @id is not selected.', array('@option' => $option, '@id' => $id)), t('Browser'));
+  }
+
+  /**
+   * Asserts that a field exists with the given name or id.
+   *
+   * @param $field
+   *   Name or id of field to assert.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertField($field, $message = '', $group = 'Other') {
+    return $this->assertFieldByXPath($this->constructFieldXpath('name', $field) . '|' . $this->constructFieldXpath('id', $field), NULL, $message, $group);
+  }
+
+  /**
+   * Asserts that a field does not exist with the given name or id.
+   *
+   * @param $field
+   *   Name or id of field to assert.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertNoField($field, $message = '', $group = 'Other') {
+    return $this->assertNoFieldByXPath($this->constructFieldXpath('name', $field) . '|' . $this->constructFieldXpath('id', $field), NULL, $message, $group);
+  }
+
+  /**
+   * Asserts that each HTML ID is used for just a single element.
+   *
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to.
+   * @param $ids_to_skip
+   *   An optional array of ids to skip when checking for duplicates. It is
+   *   always a bug to have duplicate HTML IDs, so this parameter is to enable
+   *   incremental fixing of core code. Whenever a test passes this parameter,
+   *   it should add a "todo" comment above the call to this function explaining
+   *   the legacy bug that the test wishes to ignore and including a link to an
+   *   issue that is working to fix that legacy bug.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertNoDuplicateIds($message = '', $group = 'Other', $ids_to_skip = array()) {
+    $status = TRUE;
+    foreach ($this->xpath('//*[@id]') as $element) {
+      $id = (string) $element['id'];
+      if (isset($seen_ids[$id]) && !in_array($id, $ids_to_skip)) {
+        $this->fail(t('The HTML ID %id is unique.', array('%id' => $id)), $group);
+        $status = FALSE;
+      }
+      $seen_ids[$id] = TRUE;
+    }
+    return $this->assert($status, $message, $group);
+  }
+
+  /**
+   * Helper function: construct an XPath for the given set of attributes and value.
+   *
+   * @param $attribute
+   *   Field attributes.
+   * @param $value
+   *   Value of field.
+   * @return
+   *   XPath for specified values.
+   */
+  protected function constructFieldXpath($attribute, $value) {
+    $xpath = '//textarea[@' . $attribute . '=:value]|//input[@' . $attribute . '=:value]|//select[@' . $attribute . '=:value]';
+    return $this->buildXPathQuery($xpath, array(':value' => $value));
+  }
+
+  /**
+   * Asserts the page responds with the specified response code.
+   *
+   * @param $code
+   *   Response code. For example 200 is a successful page request. For a list
+   *   of all codes see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html.
+   * @param $message
+   *   Message to display.
+   * @return
+   *   Assertion result.
+   */
+  protected function assertResponse($code, $message = '') {
+    $curl_code = curl_getinfo($this->curlHandle, CURLINFO_HTTP_CODE);
+    $match = is_array($code) ? in_array($curl_code, $code) : $curl_code == $code;
+    return $this->assertTrue($match, $message ? $message : t('HTTP response expected !code, actual !curl_code', array('!code' => $code, '!curl_code' => $curl_code)), t('Browser'));
+  }
+
+  /**
+   * Asserts the page did not return the specified response code.
+   *
+   * @param $code
+   *   Response code. For example 200 is a successful page request. For a list
+   *   of all codes see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html.
+   * @param $message
+   *   Message to display.
+   *
+   * @return
+   *   Assertion result.
+   */
+  protected function assertNoResponse($code, $message = '') {
+    $curl_code = curl_getinfo($this->curlHandle, CURLINFO_HTTP_CODE);
+    $match = is_array($code) ? in_array($curl_code, $code) : $curl_code == $code;
+    return $this->assertFalse($match, $message ? $message : t('HTTP response not expected !code, actual !curl_code', array('!code' => $code, '!curl_code' => $curl_code)), t('Browser'));
+  }
+
+  /**
+   * Asserts that the most recently sent e-mail message has the given value.
+   *
+   * The field in $name must have the content described in $value.
+   *
+   * @param $name
+   *   Name of field or message property to assert. Examples: subject, body, id, ...
+   * @param $value
+   *   Value of the field to assert.
+   * @param $message
+   *   Message to display.
+   *
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertMail($name, $value = '', $message = '') {
+    $captured_emails = variable_get('drupal_test_email_collector', array());
+    $email = end($captured_emails);
+    return $this->assertTrue($email && isset($email[$name]) && $email[$name] == $value, $message, t('E-mail'));
+  }
+
+  /**
+   * Asserts that the most recently sent e-mail message has the string in it.
+   *
+   * @param $field_name
+   *   Name of field or message property to assert: subject, body, id, ...
+   * @param $string
+   *   String to search for.
+   * @param $email_depth
+   *   Number of emails to search for string, starting with most recent.
+   *
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertMailString($field_name, $string, $email_depth) {
+    $mails = $this->drupalGetMails();
+    $string_found = FALSE;
+    for ($i = sizeof($mails) -1; $i >= sizeof($mails) - $email_depth && $i >= 0; $i--) {
+      $mail = $mails[$i];
+      // Normalize whitespace, as we don't know what the mail system might have
+      // done. Any run of whitespace becomes a single space.
+      $normalized_mail = preg_replace('/\s+/', ' ', $mail[$field_name]);
+      $normalized_string = preg_replace('/\s+/', ' ', $string);
+      $string_found = (FALSE !== strpos($normalized_mail, $normalized_string));
+      if ($string_found) {
+        break;
+      }
+    }
+    return $this->assertTrue($string_found, t('Expected text found in @field of email message: "@expected".', array('@field' => $field_name, '@expected' => $string)));
+  }
+
+  /**
+   * Asserts that the most recently sent e-mail message has the pattern in it.
+   *
+   * @param $field_name
+   *   Name of field or message property to assert: subject, body, id, ...
+   * @param $regex
+   *   Pattern to search for.
+   *
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertMailPattern($field_name, $regex, $message) {
+    $mails = $this->drupalGetMails();
+    $mail = end($mails);
+    $regex_found = preg_match("/$regex/", $mail[$field_name]);
+    return $this->assertTrue($regex_found, t('Expected text found in @field of email message: "@expected".', array('@field' => $field_name, '@expected' => $regex)));
+  }
+
+  /**
+   * Outputs to verbose the most recent $count emails sent.
+   *
+   * @param $count
+   *   Optional number of emails to output.
+   */
+  protected function verboseEmail($count = 1) {
+    $mails = $this->drupalGetMails();
+    for ($i = sizeof($mails) -1; $i >= sizeof($mails) - $count && $i >= 0; $i--) {
+      $mail = $mails[$i];
+      $this->verbose(t('Email:') . '<pre>' . print_r($mail, TRUE) . '</pre>');
+    }
+  }
+}
+
+/**
+ * Logs verbose message in a text file.
+ *
+ * If verbose mode is enabled then page requests will be dumped to a file and
+ * presented on the test result screen. The messages will be placed in a file
+ * located in the simpletest directory in the original file system.
+ *
+ * @param $message
+ *   The verbose message to be stored.
+ * @param $original_file_directory
+ *   The original file directory, before it was changed for testing purposes.
+ * @param $test_class
+ *   The active test case class.
+ *
+ * @return
+ *   The ID of the message to be placed in related assertion messages.
+ *
+ * @see DrupalTestCase->originalFileDirectory
+ * @see DrupalWebTestCase->verbose()
+ */
+function simpletest_verbose($message, $original_file_directory = NULL, $test_class = NULL) {
+  static $file_directory = NULL, $class = NULL, $id = 1, $verbose = NULL;
+
+  // Will pass first time during setup phase, and when verbose is TRUE.
+  if (!isset($original_file_directory) && !$verbose) {
+    return FALSE;
+  }
+
+  if ($message && $file_directory) {
+    $message = '<hr />ID #' . $id . ' (<a href="' . $class . '-' . ($id - 1) . '.html">Previous</a> | <a href="' . $class . '-' . ($id + 1) . '.html">Next</a>)<hr />' . $message;
+    file_put_contents($file_directory . "/simpletest/verbose/$class-$id.html", $message, FILE_APPEND);
+    return $id++;
+  }
+
+  if ($original_file_directory) {
+    $file_directory = $original_file_directory;
+    $class = $test_class;
+    $verbose = variable_get('simpletest_verbose', TRUE);
+    $directory = $file_directory . '/simpletest/verbose';
+    $writable = file_prepare_directory($directory, FILE_CREATE_DIRECTORY);
+    if ($writable && !file_exists($directory . '/.htaccess')) {
+      file_put_contents($directory . '/.htaccess', "<IfModule mod_expires.c>\nExpiresActive Off\n</IfModule>\n");
+    }
+    return $writable;
+  }
+  return FALSE;
+}
diff --git a/htmltest/modules/simpletest/files/README.txt b/htmltest/modules/simpletest/files/README.txt
new file mode 100644
index 00000000..680e7fea
--- /dev/null
+++ b/htmltest/modules/simpletest/files/README.txt
@@ -0,0 +1,4 @@
+These files are useful in tests that upload files or otherwise need to
+manipulate files, in which case they are copied to the files directory as
+specified in the site settings. Dummy files can also be generated by tests in
+order to save space.
diff --git a/htmltest/modules/simpletest/files/css_test_files/comment_hacks.css b/htmltest/modules/simpletest/files/css_test_files/comment_hacks.css
new file mode 100644
index 00000000..c47e8429
--- /dev/null
+++ b/htmltest/modules/simpletest/files/css_test_files/comment_hacks.css
@@ -0,0 +1,80 @@
+/*
+* A sample css file, designed to test the effectiveness and stability
+* of function <code>drupal_load_stylesheet_content()</code>.
+*
+*/
+/*
+A large comment block to test for segfaults and speed. This is 60K a's. Extreme but useful to demonstrate flaws in comment striping regexp. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/
+.test1 { display:block;}
+
+/* A multiline IE-mac hack (v.2) taken fron Zen theme*/
+/* Hides from IE-mac \*/
+html .clear-block {
+ height: 1%;
+}
+.clear-block {
+ display: block;
+ font:italic bold 12px/30px Georgia, serif;
+}
+
+/* End hide from IE-mac */
+.test2 { display:block; }
+
+/* v1 of the commented backslash hack. This \ character between rules appears to have the effect
+that macIE5 ignores the following rule. Odd, but extremely useful. */
+.bkslshv1 { background-color: #C00; }
+.test3 { display:block; }
+
+/**************** A multiline, multistar comment ***************
+****************************************************************/
+.test4 { display:block;}
+
+/**************************************/
+.comment-in-double-quotes:before {
+  content: "/* ";
+}
+.this_rule_must_stay {
+  color: #F00;
+  background-color: #FFF;
+}
+.comment-in-double-quotes:after {
+  content: " */";
+}
+/**************************************/
+.comment-in-single-quotes:before {
+  content: '/*';
+}
+.this_rule_must_stay {
+  color: #F00;
+  background-color: #FFF;
+}
+.comment-in-single-quotes:after {
+  content: '*/';
+}
+/**************************************/
+.comment-in-mixed-quotes:before {
+  content: '"/*"';
+}
+.this_rule_must_stay {
+  color: #F00;
+  background-color: #FFF;
+}
+.comment-in-mixed-quotes:after {
+  content: "'*/'";
+}
+/**************************************/
+.comment-in-quotes-with-escaped:before {
+  content: '/* \" \' */';
+}
+.this_rule_must_stay {
+  color: #F00;
+  background-color: #FFF;
+}
+.comment-in-quotes-with-escaped:after {
+  content: "*/ \" \ '";
+}
+/************************************/
+/*
+"This has to go"
+'This has to go'
+*/
diff --git a/htmltest/modules/simpletest/files/css_test_files/comment_hacks.css.optimized.css b/htmltest/modules/simpletest/files/css_test_files/comment_hacks.css.optimized.css
new file mode 100644
index 00000000..1feb8f1b
--- /dev/null
+++ b/htmltest/modules/simpletest/files/css_test_files/comment_hacks.css.optimized.css
@@ -0,0 +1 @@
+.test1{display:block;}html .clear-block{height:1%;}.clear-block{display:block;font:italic bold 12px/30px Georgia,serif;}.test2{display:block;}.bkslshv1{background-color:#C00;}.test3{display:block;}.test4{display:block;}.comment-in-double-quotes:before{content:"/* ";}.this_rule_must_stay{color:#F00;background-color:#FFF;}.comment-in-double-quotes:after{content:" */";}.comment-in-single-quotes:before{content:'/*';}.this_rule_must_stay{color:#F00;background-color:#FFF;}.comment-in-single-quotes:after{content:'*/';}.comment-in-mixed-quotes:before{content:'"/*"';}.this_rule_must_stay{color:#F00;background-color:#FFF;}.comment-in-mixed-quotes:after{content:"'*/'";}.comment-in-quotes-with-escaped:before{content:'/* \" \' */';}.this_rule_must_stay{color:#F00;background-color:#FFF;}.comment-in-quotes-with-escaped:after{content:"*/ \" \ '";}
diff --git a/htmltest/modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css b/htmltest/modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css
new file mode 100644
index 00000000..c47e8429
--- /dev/null
+++ b/htmltest/modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css
@@ -0,0 +1,80 @@
+/*
+* A sample css file, designed to test the effectiveness and stability
+* of function <code>drupal_load_stylesheet_content()</code>.
+*
+*/
+/*
+A large comment block to test for segfaults and speed. This is 60K a's. Extreme but useful to demonstrate flaws in comment striping regexp. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/
+.test1 { display:block;}
+
+/* A multiline IE-mac hack (v.2) taken fron Zen theme*/
+/* Hides from IE-mac \*/
+html .clear-block {
+ height: 1%;
+}
+.clear-block {
+ display: block;
+ font:italic bold 12px/30px Georgia, serif;
+}
+
+/* End hide from IE-mac */
+.test2 { display:block; }
+
+/* v1 of the commented backslash hack. This \ character between rules appears to have the effect
+that macIE5 ignores the following rule. Odd, but extremely useful. */
+.bkslshv1 { background-color: #C00; }
+.test3 { display:block; }
+
+/**************** A multiline, multistar comment ***************
+****************************************************************/
+.test4 { display:block;}
+
+/**************************************/
+.comment-in-double-quotes:before {
+  content: "/* ";
+}
+.this_rule_must_stay {
+  color: #F00;
+  background-color: #FFF;
+}
+.comment-in-double-quotes:after {
+  content: " */";
+}
+/**************************************/
+.comment-in-single-quotes:before {
+  content: '/*';
+}
+.this_rule_must_stay {
+  color: #F00;
+  background-color: #FFF;
+}
+.comment-in-single-quotes:after {
+  content: '*/';
+}
+/**************************************/
+.comment-in-mixed-quotes:before {
+  content: '"/*"';
+}
+.this_rule_must_stay {
+  color: #F00;
+  background-color: #FFF;
+}
+.comment-in-mixed-quotes:after {
+  content: "'*/'";
+}
+/**************************************/
+.comment-in-quotes-with-escaped:before {
+  content: '/* \" \' */';
+}
+.this_rule_must_stay {
+  color: #F00;
+  background-color: #FFF;
+}
+.comment-in-quotes-with-escaped:after {
+  content: "*/ \" \ '";
+}
+/************************************/
+/*
+"This has to go"
+'This has to go'
+*/
diff --git a/htmltest/modules/simpletest/files/css_test_files/css_input_with_import.css b/htmltest/modules/simpletest/files/css_test_files/css_input_with_import.css
new file mode 100644
index 00000000..87afcb35
--- /dev/null
+++ b/htmltest/modules/simpletest/files/css_test_files/css_input_with_import.css
@@ -0,0 +1,30 @@
+
+
+@import "import1.css";
+@import "import2.css";
+
+body {
+  margin: 0;
+  padding: 0;
+  background: #edf5fa;
+  font: 76%/170% Verdana, sans-serif;
+  color: #494949;
+}
+
+.this .is .a .test {
+  font: 1em/100% Verdana, sans-serif;
+  color: #494949;
+}
+.this
+.is
+.a
+.test {
+font: 1em/100% Verdana, sans-serif;
+color: #494949;
+}
+
+textarea, select {
+  font: 1em/160% Verdana, sans-serif;
+  color: #494949;
+}
+
diff --git a/htmltest/modules/simpletest/files/css_test_files/css_input_with_import.css.optimized.css b/htmltest/modules/simpletest/files/css_test_files/css_input_with_import.css.optimized.css
new file mode 100644
index 00000000..698d9aa6
--- /dev/null
+++ b/htmltest/modules/simpletest/files/css_test_files/css_input_with_import.css.optimized.css
@@ -0,0 +1,6 @@
+ul,select{font:1em/160% Verdana,sans-serif;color:#494949;}.ui-icon{background-image:url(images/icon.png);}
+p,select{font:1em/160% Verdana,sans-serif;color:#494949;}
+body{margin:0;padding:0;background:#edf5fa;font:76%/170% Verdana,sans-serif;color:#494949;}.this .is .a .test{font:1em/100% Verdana,sans-serif;color:#494949;}.this
+.is
+.a
+.test{font:1em/100% Verdana,sans-serif;color:#494949;}textarea,select{font:1em/160% Verdana,sans-serif;color:#494949;}
diff --git a/htmltest/modules/simpletest/files/css_test_files/css_input_with_import.css.unoptimized.css b/htmltest/modules/simpletest/files/css_test_files/css_input_with_import.css.unoptimized.css
new file mode 100644
index 00000000..19323c12
--- /dev/null
+++ b/htmltest/modules/simpletest/files/css_test_files/css_input_with_import.css.unoptimized.css
@@ -0,0 +1,40 @@
+
+
+
+ul, select {
+  font: 1em/160% Verdana, sans-serif;
+  color: #494949;
+}
+.ui-icon{background-image: url(images/icon.png);}
+
+p, select {
+  font: 1em/160% Verdana, sans-serif;
+  color: #494949;
+}
+
+
+body {
+  margin: 0;
+  padding: 0;
+  background: #edf5fa;
+  font: 76%/170% Verdana, sans-serif;
+  color: #494949;
+}
+
+.this .is .a .test {
+  font: 1em/100% Verdana, sans-serif;
+  color: #494949;
+}
+.this
+.is
+.a
+.test {
+font: 1em/100% Verdana, sans-serif;
+color: #494949;
+}
+
+textarea, select {
+  font: 1em/160% Verdana, sans-serif;
+  color: #494949;
+}
+
diff --git a/htmltest/modules/simpletest/files/css_test_files/css_input_without_import.css b/htmltest/modules/simpletest/files/css_test_files/css_input_without_import.css
new file mode 100644
index 00000000..620360ab
--- /dev/null
+++ b/htmltest/modules/simpletest/files/css_test_files/css_input_without_import.css
@@ -0,0 +1,69 @@
+
+/**
+ * @file Basic css that does not use import
+ */
+
+
+body {
+  margin: 0;
+  padding: 0;
+  background: #edf5fa;
+  font: 76%/170% Verdana, sans-serif;
+  color: #494949;
+}
+
+.this .is .a .test {
+  font: 1em/100% Verdana, sans-serif;
+  color: #494949;
+}
+
+/**
+ * CSS spec says that all whitespace is valid whitespace, so this selector
+ * should be just as good as the one above.
+ */
+.this
+.is
+.a
+.test {
+font: 1em/100% Verdana, sans-serif;
+color: #494949;
+}
+
+some :pseudo .thing {
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  border-radius: 3px;
+  filter: progid:DXImageTransform.Microsoft.Shadow(color=#000000, direction='180', strength='10');
+  -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(color=#000000, direction='180', strength='10')";
+}
+
+::-moz-selection {
+  background: #000;
+  color:#fff;
+
+}
+::selection {
+  background: #000;
+  color: #fff;
+}
+
+@media print {
+  * {
+    background: #000 !important;
+    color: #fff !important;
+  }
+  @page {
+    margin: 0.5cm;
+  }
+}
+
+@media screen and (max-device-width: 480px) {
+  background: #000;
+  color: #fff;
+}
+
+textarea, select {
+  font: 1em/160% Verdana, sans-serif;
+  color: #494949;
+}
+
diff --git a/htmltest/modules/simpletest/files/css_test_files/css_input_without_import.css.optimized.css b/htmltest/modules/simpletest/files/css_test_files/css_input_without_import.css.optimized.css
new file mode 100644
index 00000000..c7bb9dcd
--- /dev/null
+++ b/htmltest/modules/simpletest/files/css_test_files/css_input_without_import.css.optimized.css
@@ -0,0 +1,4 @@
+body{margin:0;padding:0;background:#edf5fa;font:76%/170% Verdana,sans-serif;color:#494949;}.this .is .a .test{font:1em/100% Verdana,sans-serif;color:#494949;}.this
+.is
+.a
+.test{font:1em/100% Verdana,sans-serif;color:#494949;}some :pseudo .thing{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#000000,direction='180',strength='10');-ms-filter:"progid:DXImageTransform.Microsoft.Shadow(color=#000000,direction='180',strength='10')";}::-moz-selection{background:#000;color:#fff;}::selection{background:#000;color:#fff;}@media print{*{background:#000 !important;color:#fff !important;}@page{margin:0.5cm;}}@media screen and (max-device-width:480px){background:#000;color:#fff;}textarea,select{font:1em/160% Verdana,sans-serif;color:#494949;}
diff --git a/htmltest/modules/simpletest/files/css_test_files/css_input_without_import.css.unoptimized.css b/htmltest/modules/simpletest/files/css_test_files/css_input_without_import.css.unoptimized.css
new file mode 100644
index 00000000..620360ab
--- /dev/null
+++ b/htmltest/modules/simpletest/files/css_test_files/css_input_without_import.css.unoptimized.css
@@ -0,0 +1,69 @@
+
+/**
+ * @file Basic css that does not use import
+ */
+
+
+body {
+  margin: 0;
+  padding: 0;
+  background: #edf5fa;
+  font: 76%/170% Verdana, sans-serif;
+  color: #494949;
+}
+
+.this .is .a .test {
+  font: 1em/100% Verdana, sans-serif;
+  color: #494949;
+}
+
+/**
+ * CSS spec says that all whitespace is valid whitespace, so this selector
+ * should be just as good as the one above.
+ */
+.this
+.is
+.a
+.test {
+font: 1em/100% Verdana, sans-serif;
+color: #494949;
+}
+
+some :pseudo .thing {
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  border-radius: 3px;
+  filter: progid:DXImageTransform.Microsoft.Shadow(color=#000000, direction='180', strength='10');
+  -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(color=#000000, direction='180', strength='10')";
+}
+
+::-moz-selection {
+  background: #000;
+  color:#fff;
+
+}
+::selection {
+  background: #000;
+  color: #fff;
+}
+
+@media print {
+  * {
+    background: #000 !important;
+    color: #fff !important;
+  }
+  @page {
+    margin: 0.5cm;
+  }
+}
+
+@media screen and (max-device-width: 480px) {
+  background: #000;
+  color: #fff;
+}
+
+textarea, select {
+  font: 1em/160% Verdana, sans-serif;
+  color: #494949;
+}
+
diff --git a/htmltest/modules/simpletest/files/css_test_files/css_subfolder/css_input_with_import.css b/htmltest/modules/simpletest/files/css_test_files/css_subfolder/css_input_with_import.css
new file mode 100644
index 00000000..d90ecbcb
--- /dev/null
+++ b/htmltest/modules/simpletest/files/css_test_files/css_subfolder/css_input_with_import.css
@@ -0,0 +1,29 @@
+
+
+@import "../import1.css";
+@import "../import2.css";
+
+body {
+  margin: 0;
+  padding: 0;
+  background: #edf5fa;
+  font: 76%/170% Verdana, sans-serif;
+  color: #494949;
+}
+
+.this .is .a .test {
+  font: 1em/100% Verdana, sans-serif;
+  color: #494949;
+}
+.this
+.is
+.a
+.test {
+font: 1em/100% Verdana, sans-serif;
+color: #494949;
+}
+
+textarea, select {
+  font: 1em/160% Verdana, sans-serif;
+  color: #494949;
+}
diff --git a/htmltest/modules/simpletest/files/css_test_files/css_subfolder/css_input_with_import.css.optimized.css b/htmltest/modules/simpletest/files/css_test_files/css_subfolder/css_input_with_import.css.optimized.css
new file mode 100644
index 00000000..aba3b210
--- /dev/null
+++ b/htmltest/modules/simpletest/files/css_test_files/css_subfolder/css_input_with_import.css.optimized.css
@@ -0,0 +1,6 @@
+ul,select{font:1em/160% Verdana,sans-serif;color:#494949;}.ui-icon{background-image:url(../images/icon.png);}
+p,select{font:1em/160% Verdana,sans-serif;color:#494949;}
+body{margin:0;padding:0;background:#edf5fa;font:76%/170% Verdana,sans-serif;color:#494949;}.this .is .a .test{font:1em/100% Verdana,sans-serif;color:#494949;}.this
+.is
+.a
+.test{font:1em/100% Verdana,sans-serif;color:#494949;}textarea,select{font:1em/160% Verdana,sans-serif;color:#494949;}
diff --git a/htmltest/modules/simpletest/files/css_test_files/css_subfolder/css_input_with_import.css.unoptimized.css b/htmltest/modules/simpletest/files/css_test_files/css_subfolder/css_input_with_import.css.unoptimized.css
new file mode 100644
index 00000000..710d8f14
--- /dev/null
+++ b/htmltest/modules/simpletest/files/css_test_files/css_subfolder/css_input_with_import.css.unoptimized.css
@@ -0,0 +1,39 @@
+
+
+
+ul, select {
+  font: 1em/160% Verdana, sans-serif;
+  color: #494949;
+}
+.ui-icon{background-image: url(../images/icon.png);}
+
+p, select {
+  font: 1em/160% Verdana, sans-serif;
+  color: #494949;
+}
+
+
+body {
+  margin: 0;
+  padding: 0;
+  background: #edf5fa;
+  font: 76%/170% Verdana, sans-serif;
+  color: #494949;
+}
+
+.this .is .a .test {
+  font: 1em/100% Verdana, sans-serif;
+  color: #494949;
+}
+.this
+.is
+.a
+.test {
+font: 1em/100% Verdana, sans-serif;
+color: #494949;
+}
+
+textarea, select {
+  font: 1em/160% Verdana, sans-serif;
+  color: #494949;
+}
diff --git a/htmltest/modules/simpletest/files/css_test_files/import1.css b/htmltest/modules/simpletest/files/css_test_files/import1.css
new file mode 100644
index 00000000..3d5842ec
--- /dev/null
+++ b/htmltest/modules/simpletest/files/css_test_files/import1.css
@@ -0,0 +1,6 @@
+
+ul, select {
+  font: 1em/160% Verdana, sans-serif;
+  color: #494949;
+}
+.ui-icon{background-image: url(images/icon.png);}
\ No newline at end of file
diff --git a/htmltest/modules/simpletest/files/css_test_files/import2.css b/htmltest/modules/simpletest/files/css_test_files/import2.css
new file mode 100644
index 00000000..367eb571
--- /dev/null
+++ b/htmltest/modules/simpletest/files/css_test_files/import2.css
@@ -0,0 +1,5 @@
+
+p, select {
+  font: 1em/160% Verdana, sans-serif;
+  color: #494949;
+}
diff --git a/htmltest/modules/simpletest/files/html-1.txt b/htmltest/modules/simpletest/files/html-1.txt
new file mode 100644
index 00000000..494470d1
--- /dev/null
+++ b/htmltest/modules/simpletest/files/html-1.txt
@@ -0,0 +1 @@
+<h1>SimpleTest HTML</h1>
\ No newline at end of file
diff --git a/htmltest/modules/simpletest/files/html-2.html b/htmltest/modules/simpletest/files/html-2.html
new file mode 100644
index 00000000..494470d1
--- /dev/null
+++ b/htmltest/modules/simpletest/files/html-2.html
@@ -0,0 +1 @@
+<h1>SimpleTest HTML</h1>
\ No newline at end of file
diff --git a/htmltest/modules/simpletest/files/image-1.png b/htmltest/modules/simpletest/files/image-1.png
new file mode 100644
index 00000000..09e64d6e
Binary files /dev/null and b/htmltest/modules/simpletest/files/image-1.png differ
diff --git a/htmltest/modules/simpletest/files/image-2.jpg b/htmltest/modules/simpletest/files/image-2.jpg
new file mode 100644
index 00000000..ace07d07
Binary files /dev/null and b/htmltest/modules/simpletest/files/image-2.jpg differ
diff --git a/htmltest/modules/simpletest/files/image-test.gif b/htmltest/modules/simpletest/files/image-test.gif
new file mode 100644
index 00000000..432990b8
Binary files /dev/null and b/htmltest/modules/simpletest/files/image-test.gif differ
diff --git a/htmltest/modules/simpletest/files/image-test.jpg b/htmltest/modules/simpletest/files/image-test.jpg
new file mode 100644
index 00000000..de4eace0
Binary files /dev/null and b/htmltest/modules/simpletest/files/image-test.jpg differ
diff --git a/htmltest/modules/simpletest/files/image-test.png b/htmltest/modules/simpletest/files/image-test.png
new file mode 100644
index 00000000..39c04192
Binary files /dev/null and b/htmltest/modules/simpletest/files/image-test.png differ
diff --git a/htmltest/modules/simpletest/files/javascript-1.txt b/htmltest/modules/simpletest/files/javascript-1.txt
new file mode 100644
index 00000000..efd44fd9
--- /dev/null
+++ b/htmltest/modules/simpletest/files/javascript-1.txt
@@ -0,0 +1,3 @@
+<script>
+alert('SimpleTest PHP was executed!');
+</script>
diff --git a/htmltest/modules/simpletest/files/javascript-2.script b/htmltest/modules/simpletest/files/javascript-2.script
new file mode 100644
index 00000000..e0206ba8
--- /dev/null
+++ b/htmltest/modules/simpletest/files/javascript-2.script
@@ -0,0 +1,3 @@
+<script>
+alert('SimpleTest PHP was executed!');
+</script>
\ No newline at end of file
diff --git a/htmltest/modules/simpletest/files/php-1.txt b/htmltest/modules/simpletest/files/php-1.txt
new file mode 100644
index 00000000..52788b6f
--- /dev/null
+++ b/htmltest/modules/simpletest/files/php-1.txt
@@ -0,0 +1,3 @@
+<?php
+print 'SimpleTest PHP was executed!';
+?>
diff --git a/htmltest/modules/simpletest/files/php-2.php b/htmltest/modules/simpletest/files/php-2.php
new file mode 100644
index 00000000..615a8d78
--- /dev/null
+++ b/htmltest/modules/simpletest/files/php-2.php
@@ -0,0 +1,2 @@
+<?php
+print 'SimpleTest PHP was executed!';
diff --git a/htmltest/modules/simpletest/files/sql-1.txt b/htmltest/modules/simpletest/files/sql-1.txt
new file mode 100644
index 00000000..22017e97
--- /dev/null
+++ b/htmltest/modules/simpletest/files/sql-1.txt
@@ -0,0 +1 @@
+SELECT invalid_field FROM {invalid_table}
\ No newline at end of file
diff --git a/htmltest/modules/simpletest/files/sql-2.sql b/htmltest/modules/simpletest/files/sql-2.sql
new file mode 100644
index 00000000..22017e97
--- /dev/null
+++ b/htmltest/modules/simpletest/files/sql-2.sql
@@ -0,0 +1 @@
+SELECT invalid_field FROM {invalid_table}
\ No newline at end of file
diff --git a/htmltest/modules/simpletest/lib/Drupal/simpletest/Tests/PSR0WebTest.php b/htmltest/modules/simpletest/lib/Drupal/simpletest/Tests/PSR0WebTest.php
new file mode 100644
index 00000000..0292956c
--- /dev/null
+++ b/htmltest/modules/simpletest/lib/Drupal/simpletest/Tests/PSR0WebTest.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Drupal\simpletest\Tests;
+
+class PSR0WebTest extends \DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'PSR0 web test',
+      'description' => 'We want to assert that this PSR-0 test case is being discovered.',
+      'group' => 'SimpleTest',
+    );
+  }
+
+  function testArithmetics() {
+    $this->assert(1 + 1 == 2, '1 + 1 == 2');
+  }
+}
diff --git a/htmltest/modules/simpletest/simpletest.api.php b/htmltest/modules/simpletest/simpletest.api.php
new file mode 100644
index 00000000..d262ad61
--- /dev/null
+++ b/htmltest/modules/simpletest/simpletest.api.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the SimpleTest module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Alter the list of tests.
+ *
+ * @param $groups
+ *   A two dimension array, the first key is the test group (as defined in
+ *   getInfo) the second is the name of the class and the value is the return
+ *   value of the getInfo method.
+ */
+function hook_simpletest_alter(&$groups) {
+  // An alternative session handler module would not want to run the original
+  // Session HTTPS handling test because it checks the sessions table in the
+  // database.
+  unset($groups['Session']['testHttpsSession']);
+}
+
+/**
+ * A test group has started.
+ *
+ * This hook is called just once at the beginning of a test group.
+ */
+function hook_test_group_started() {
+}
+
+/**
+ * A test group has finished.
+ *
+ * This hook is called just once at the end of a test group.
+ */
+function hook_test_group_finished() {
+}
+
+/**
+ * An individual test has finished.
+ *
+ * This hook is called when an individual test has finished.
+ *
+ * @param
+ *   $results The results of the test as gathered by DrupalWebTestCase.
+ *
+ * @see DrupalWebTestCase->results
+ */
+function hook_test_finished($results) {
+}
+
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/simpletest/simpletest.css b/htmltest/modules/simpletest/simpletest.css
new file mode 100644
index 00000000..0cf9aaa5
--- /dev/null
+++ b/htmltest/modules/simpletest/simpletest.css
@@ -0,0 +1,89 @@
+
+/* Test Table */
+#simpletest-form-table th.select-all {
+  width: 1em;
+}
+th.simpletest_test {
+  width: 16em;
+}
+
+.simpletest-image {
+  display: inline-block;
+  cursor: pointer;
+  width: 1em;
+}
+.simpletest-group-label label {
+  display: inline;
+  font-weight: bold;
+}
+.simpletest-test-label label {
+  margin-left: 1em; /* LTR */
+}
+.simpletest-test-description .description {
+  margin: 0;
+}
+#simpletest-form-table tr td {
+  background-color: white;
+  color: #494949;
+}
+#simpletest-form-table tr.simpletest-group td {
+  background-color: #EDF5FA;
+  color: #494949;
+}
+
+table#simpletest-form-table tr.simpletest-group label {
+  display: inline;
+}
+
+div.message > div.item-list {
+  font-weight: normal;
+}
+
+div.simpletest-pass {
+  color: #33a333;
+}
+.simpletest-fail {
+  color: #981010;
+}
+
+tr.simpletest-pass.odd {
+  background-color: #b6ffb6;
+}
+tr.simpletest-pass.even {
+  background-color: #9bff9b;
+}
+tr.simpletest-fail.odd {
+  background-color: #ffc9c9;
+}
+tr.simpletest-fail.even {
+  background-color: #ffacac;
+}
+tr.simpletest-exception.odd {
+  background-color: #f4ea71;
+}
+tr.simpletest-exception.even {
+  background-color: #f5e742;
+}
+tr.simpletest-debug.odd {
+  background-color: #eee;
+}
+tr.simpletest-debug.even {
+  background-color: #fff;
+}
+
+a.simpletest-collapse {
+  height: 0;
+  width: 0;
+  top: -99em;
+  position: absolute;
+}
+a.simpletest-collapse:focus,
+a.simpletest-collapse:hover {
+  font-size: 80%;
+  top: 0px;
+  height: auto;
+  width: auto;
+  overflow: visible;
+  position: relative;
+  z-index: 1000;
+}
diff --git a/htmltest/modules/simpletest/simpletest.info b/htmltest/modules/simpletest/simpletest.info
new file mode 100644
index 00000000..95db08cc
--- /dev/null
+++ b/htmltest/modules/simpletest/simpletest.info
@@ -0,0 +1,62 @@
+name = Testing
+description = Provides a framework for unit and functional testing.
+package = Core
+version = VERSION
+core = 7.x
+files[] = simpletest.test
+files[] = drupal_web_test_case.php
+configure = admin/config/development/testing/settings
+
+; Tests in tests directory.
+files[] = tests/actions.test
+files[] = tests/ajax.test
+files[] = tests/batch.test
+files[] = tests/bootstrap.test
+files[] = tests/cache.test
+files[] = tests/common.test
+files[] = tests/database_test.test
+files[] = tests/entity_crud_hook_test.test
+files[] = tests/entity_query.test
+files[] = tests/error.test
+files[] = tests/file.test
+files[] = tests/filetransfer.test
+files[] = tests/form.test
+files[] = tests/graph.test
+files[] = tests/image.test
+files[] = tests/lock.test
+files[] = tests/mail.test
+files[] = tests/menu.test
+files[] = tests/module.test
+files[] = tests/pager.test
+files[] = tests/password.test
+files[] = tests/path.test
+files[] = tests/registry.test
+files[] = tests/schema.test
+files[] = tests/session.test
+files[] = tests/tablesort.test
+files[] = tests/theme.test
+files[] = tests/unicode.test
+files[] = tests/update.test
+files[] = tests/xmlrpc.test
+files[] = tests/upgrade/upgrade.test
+files[] = tests/upgrade/upgrade.comment.test
+files[] = tests/upgrade/upgrade.filter.test
+files[] = tests/upgrade/upgrade.forum.test
+files[] = tests/upgrade/upgrade.locale.test
+files[] = tests/upgrade/upgrade.menu.test
+files[] = tests/upgrade/upgrade.node.test
+files[] = tests/upgrade/upgrade.taxonomy.test
+files[] = tests/upgrade/upgrade.trigger.test
+files[] = tests/upgrade/upgrade.translatable.test
+files[] = tests/upgrade/upgrade.upload.test
+files[] = tests/upgrade/upgrade.user.test
+files[] = tests/upgrade/update.aggregator.test
+files[] = tests/upgrade/update.trigger.test
+files[] = tests/upgrade/update.field.test
+files[] = tests/upgrade/update.user.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/simpletest.install b/htmltest/modules/simpletest/simpletest.install
new file mode 100644
index 00000000..6c6f5694
--- /dev/null
+++ b/htmltest/modules/simpletest/simpletest.install
@@ -0,0 +1,182 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the simpletest module.
+ */
+
+/**
+ * Minimum value of PHP memory_limit for SimpleTest.
+ */
+define('SIMPLETEST_MINIMUM_PHP_MEMORY_LIMIT', '64M');
+
+/**
+ * Implements hook_requirements().
+ */
+function simpletest_requirements($phase) {
+  $requirements = array();
+  $t = get_t();
+
+  $has_curl = function_exists('curl_init');
+  $has_hash = function_exists('hash_hmac');
+  $has_domdocument = method_exists('DOMDocument', 'loadHTML');
+  $open_basedir = ini_get('open_basedir');
+
+  $requirements['curl'] = array(
+    'title' => $t('cURL'),
+    'value' => $has_curl ? $t('Enabled') : $t('Not found'),
+  );
+  if (!$has_curl) {
+    $requirements['curl']['severity'] = REQUIREMENT_ERROR;
+    $requirements['curl']['description'] = $t('The testing framework could not be installed because the PHP <a href="@curl_url">cURL</a> library is not available.', array('@curl_url' => 'http://php.net/manual/en/curl.setup.php'));
+  }
+  $requirements['hash'] = array(
+    'title' => $t('hash'),
+    'value' => $has_hash ? $t('Enabled') : $t('Not found'),
+  );
+  if (!$has_hash) {
+    $requirements['hash']['severity'] = REQUIREMENT_ERROR;
+    $requirements['hash']['description'] = $t('The testing framework could not be installed because the PHP <a href="@hash_url">hash</a> extension is disabled.', array('@hash_url' => 'http://php.net/manual/en/book.hash.php'));
+  }
+
+  $requirements['php_domdocument'] = array(
+    'title' => $t('PHP DOMDocument class'),
+    'value' => $has_domdocument ? $t('Enabled') : $t('Not found'),
+  );
+  if (!$has_domdocument) {
+    $requirements['php_domdocument']['severity'] = REQUIREMENT_ERROR;
+    $requirements['php_domdocument']['description'] = $t('The testing framework requires the DOMDocument class to be available. Check the configure command at the <a href="@link-phpinfo">PHP info page</a>.', array('@link-phpinfo' => url('admin/reports/status/php')));
+  }
+
+  // SimpleTest currently needs 2 cURL options which are incompatible with
+  // having PHP's open_basedir restriction set.
+  // See http://drupal.org/node/674304.
+  $requirements['php_open_basedir'] = array(
+    'title' => $t('PHP open_basedir restriction'),
+    'value' => $open_basedir ? $t('Enabled') : $t('Disabled'),
+  );
+  if ($open_basedir) {
+    $requirements['php_open_basedir']['severity'] = REQUIREMENT_ERROR;
+    $requirements['php_open_basedir']['description'] = $t('The testing framework requires the PHP <a href="@open_basedir-url">open_basedir</a> restriction to be disabled. Check your webserver configuration or contact your web host.', array('@open_basedir-url' => 'http://php.net/manual/en/ini.core.php#ini.open-basedir'));
+  }
+
+  // Check the current memory limit. If it is set too low, SimpleTest will fail
+  // to load all tests and throw a fatal error.
+  $memory_limit = ini_get('memory_limit');
+  if (!drupal_check_memory_limit(SIMPLETEST_MINIMUM_PHP_MEMORY_LIMIT, $memory_limit)) {
+    $requirements['php_memory_limit']['severity'] = REQUIREMENT_ERROR;
+    $requirements['php_memory_limit']['description'] = $t('The testing framework requires the PHP memory limit to be at least %memory_minimum_limit. The current value is %memory_limit. <a href="@url">Follow these steps to continue</a>.', array('%memory_limit' => $memory_limit, '%memory_minimum_limit' => SIMPLETEST_MINIMUM_PHP_MEMORY_LIMIT, '@url' => 'http://drupal.org/node/207036'));
+  }
+
+  return $requirements;
+}
+
+/**
+ * Implements hook_schema().
+ */
+function simpletest_schema() {
+  $schema['simpletest'] = array(
+    'description' => 'Stores simpletest messages',
+    'fields' => array(
+      'message_id'  => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique simpletest message ID.',
+      ),
+      'test_id' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Test ID, messages belonging to the same ID are reported together',
+      ),
+      'test_class' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The name of the class that created this message.',
+      ),
+      'status' => array(
+        'type' => 'varchar',
+        'length' => 9,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Message status. Core understands pass, fail, exception.',
+      ),
+      'message' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'description' => 'The message itself.',
+      ),
+      'message_group' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The message group this message belongs to. For example: warning, browser, user.',
+      ),
+      'function' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Name of the assertion function or method that created this message.',
+      ),
+      'line' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Line number on which the function is called.',
+      ),
+      'file' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Name of the file where the function is called.',
+      ),
+    ),
+    'primary key' => array('message_id'),
+    'indexes' => array(
+      'reporter' => array('test_class', 'message_id'),
+    ),
+  );
+  $schema['simpletest_test_id'] = array(
+    'description' => 'Stores simpletest test IDs, used to auto-incrament the test ID so that a fresh test ID is used.',
+    'fields' => array(
+      'test_id'  => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique simpletest ID used to group test results together. Each time a set of tests
+                            are run a new test ID is used.',
+      ),
+      'last_prefix' => array(
+        'type' => 'varchar',
+        'length' => 60,
+        'not null' => FALSE,
+        'default' => '',
+        'description' => 'The last database prefix used during testing.',
+      ),
+    ),
+    'primary key' => array('test_id'),
+  );
+  return $schema;
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function simpletest_uninstall() {
+  drupal_load('module', 'simpletest');
+  simpletest_clean_database();
+
+  // Remove settings variables.
+  variable_del('simpletest_httpauth_method');
+  variable_del('simpletest_httpauth_username');
+  variable_del('simpletest_httpauth_password');
+  variable_del('simpletest_clear_results');
+  variable_del('simpletest_verbose');
+
+  // Remove generated files.
+  file_unmanaged_delete_recursive('public://simpletest');
+}
diff --git a/htmltest/modules/simpletest/simpletest.js b/htmltest/modules/simpletest/simpletest.js
new file mode 100644
index 00000000..2199fede
--- /dev/null
+++ b/htmltest/modules/simpletest/simpletest.js
@@ -0,0 +1,104 @@
+(function ($) {
+
+/**
+ * Add the cool table collapsing on the testing overview page.
+ */
+Drupal.behaviors.simpleTestMenuCollapse = {
+  attach: function (context, settings) {
+    var timeout = null;
+    // Adds expand-collapse functionality.
+    $('div.simpletest-image').once('simpletest-image', function () {
+      var $this = $(this);
+      var direction = settings.simpleTest[this.id].imageDirection;
+      $this.html(settings.simpleTest.images[direction]);
+
+      // Adds group toggling functionality to arrow images.
+      $this.click(function () {
+        var trs = $this.closest('tbody').children('.' + settings.simpleTest[this.id].testClass);
+        var direction = settings.simpleTest[this.id].imageDirection;
+        var row = direction ? trs.length - 1 : 0;
+
+        // If clicked in the middle of expanding a group, stop so we can switch directions.
+        if (timeout) {
+          clearTimeout(timeout);
+        }
+
+        // Function to toggle an individual row according to the current direction.
+        // We set a timeout of 20 ms until the next row will be shown/hidden to
+        // create a sliding effect.
+        function rowToggle() {
+          if (direction) {
+            if (row >= 0) {
+              $(trs[row]).hide();
+              row--;
+              timeout = setTimeout(rowToggle, 20);
+            }
+          }
+          else {
+            if (row < trs.length) {
+              $(trs[row]).removeClass('js-hide').show();
+              row++;
+              timeout = setTimeout(rowToggle, 20);
+            }
+          }
+        }
+
+        // Kick-off the toggling upon a new click.
+        rowToggle();
+
+        // Toggle the arrow image next to the test group title.
+        $this.html(settings.simpleTest.images[(direction ? 0 : 1)]);
+        settings.simpleTest[this.id].imageDirection = !direction;
+
+      });
+    });
+  }
+};
+
+/**
+ * Select/deselect all the inner checkboxes when the outer checkboxes are
+ * selected/deselected.
+ */
+Drupal.behaviors.simpleTestSelectAll = {
+  attach: function (context, settings) {
+    $('td.simpletest-select-all').once('simpletest-select-all', function () {
+      var testCheckboxes = settings.simpleTest['simpletest-test-group-' + $(this).attr('id')].testNames;
+      var groupCheckbox = $('<input type="checkbox" class="form-checkbox" id="' + $(this).attr('id') + '-select-all" />');
+
+      // Each time a single-test checkbox is checked or unchecked, make sure
+      // that the associated group checkbox gets the right state too.
+      var updateGroupCheckbox = function () {
+        var checkedTests = 0;
+        for (var i = 0; i < testCheckboxes.length; i++) {
+          $('#' + testCheckboxes[i]).each(function () {
+            if (($(this).attr('checked'))) {
+              checkedTests++;
+            }
+          });
+        }
+        $(groupCheckbox).attr('checked', (checkedTests == testCheckboxes.length));
+      };
+
+      // Have the single-test checkboxes follow the group checkbox.
+      groupCheckbox.change(function () {
+        var checked = !!($(this).attr('checked'));
+        for (var i = 0; i < testCheckboxes.length; i++) {
+          $('#' + testCheckboxes[i]).attr('checked', checked);
+        }
+      });
+
+      // Have the group checkbox follow the single-test checkboxes.
+      for (var i = 0; i < testCheckboxes.length; i++) {
+        $('#' + testCheckboxes[i]).change(function () {
+          updateGroupCheckbox();
+        });
+      }
+
+      // Initialize status for the group checkbox correctly.
+      updateGroupCheckbox();
+      $(this).append(groupCheckbox);
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/simpletest/simpletest.module b/htmltest/modules/simpletest/simpletest.module
new file mode 100644
index 00000000..3103af0e
--- /dev/null
+++ b/htmltest/modules/simpletest/simpletest.module
@@ -0,0 +1,626 @@
+<?php
+
+/**
+ * @file
+ * Provides testing functionality.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function simpletest_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#simpletest':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Testing module provides a framework for running automated unit tests. It can be used to verify a working state of Drupal before and after any code changes, or as a means for developers to write and execute tests for their modules. For more information, see the online handbook entry for <a href="@simpletest">Testing module</a>.', array('@simpletest' => 'http://drupal.org/documentation/modules/simpletest', '@blocks' => url('admin/structure/block'))) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Running tests') . '</dt>';
+      $output .= '<dd>' . t('Visit the <a href="@admin-simpletest">Testing page</a> to display a list of available tests. For comprehensive testing, select <em>all</em> tests, or individually select tests for more targeted testing. Note that it might take several minutes for all tests to complete. For more information on creating and modifying your own tests, see the <a href="@simpletest-api">Testing API Documentation</a> in the Drupal handbook.', array('@simpletest-api' => 'http://drupal.org/simpletest', '@admin-simpletest' => url('admin/config/development/testing'))) . '</dd>';
+      $output .= '<dd>' . t('After the tests run, a message will be displayed next to each test group indicating whether tests within it passed, failed, or had exceptions. A pass means that the test returned the expected results, while fail means that it did not. An exception normally indicates an error outside of the test, such as a PHP warning or notice. If there were failures or exceptions, the results will be expanded to show details, and the tests that had failures or exceptions will be indicated in red or pink rows. You can then use these results to refine your code and tests, until all tests pass.') . '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function simpletest_menu() {
+  $items['admin/config/development/testing'] = array(
+    'title' => 'Testing',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('simpletest_test_form'),
+    'description' => 'Run tests against Drupal core and your active modules. These tests help assure that your site code is working as designed.',
+    'access arguments' => array('administer unit tests'),
+    'file' => 'simpletest.pages.inc',
+    'weight' => -5,
+  );
+  $items['admin/config/development/testing/list'] = array(
+    'title' => 'List',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $items['admin/config/development/testing/settings'] = array(
+    'title' => 'Settings',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('simpletest_settings_form'),
+    'access arguments' => array('administer unit tests'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'simpletest.pages.inc',
+  );
+  $items['admin/config/development/testing/results/%'] = array(
+    'title' => 'Test result',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('simpletest_result_form', 5),
+    'description' => 'View result of tests.',
+    'access arguments' => array('administer unit tests'),
+    'file' => 'simpletest.pages.inc',
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_permission().
+ */
+function simpletest_permission() {
+  return array(
+    'administer unit tests' => array(
+      'title' => t('Administer tests'),
+      'restrict access' => TRUE,
+    ),
+  );
+}
+
+/**
+ * Implements hook_theme().
+ */
+function simpletest_theme() {
+  return array(
+    'simpletest_test_table' => array(
+      'render element' => 'table',
+      'file' => 'simpletest.pages.inc',
+    ),
+    'simpletest_result_summary' => array(
+      'render element' => 'form',
+      'file' => 'simpletest.pages.inc',
+    ),
+  );
+}
+
+/**
+ * Implements hook_js_alter().
+ */
+function simpletest_js_alter(&$javascript) {
+  // Since SimpleTest is a special use case for the table select, stick the
+  // SimpleTest JavaScript above the table select.
+  $simpletest = drupal_get_path('module', 'simpletest') . '/simpletest.js';
+  if (array_key_exists($simpletest, $javascript) && array_key_exists('misc/tableselect.js', $javascript)) {
+    $javascript[$simpletest]['weight'] = $javascript['misc/tableselect.js']['weight'] - 1;
+  }
+}
+
+function _simpletest_format_summary_line($summary) {
+  $args = array(
+    '@pass' => format_plural(isset($summary['#pass']) ? $summary['#pass'] : 0, '1 pass', '@count passes'),
+    '@fail' => format_plural(isset($summary['#fail']) ? $summary['#fail'] : 0, '1 fail', '@count fails'),
+    '@exception' => format_plural(isset($summary['#exception']) ? $summary['#exception'] : 0, '1 exception', '@count exceptions'),
+  );
+  if (!$summary['#debug']) {
+    return t('@pass, @fail, and @exception', $args);
+  }
+  $args['@debug'] = format_plural(isset($summary['#debug']) ? $summary['#debug'] : 0, '1 debug message', '@count debug messages');
+  return t('@pass, @fail, @exception, and @debug', $args);
+}
+
+/**
+ * Actually runs tests.
+ *
+ * @param $test_list
+ *   List of tests to run.
+ * @param $reporter
+ *   Which reporter to use. Allowed values are: text, xml, html and drupal,
+ *   drupal being the default.
+ */
+function simpletest_run_tests($test_list, $reporter = 'drupal') {
+  $test_id = db_insert('simpletest_test_id')
+    ->useDefaults(array('test_id'))
+    ->execute();
+
+  // Clear out the previous verbose files.
+  file_unmanaged_delete_recursive('public://simpletest/verbose');
+
+  // Get the info for the first test being run.
+  $first_test = array_shift($test_list);
+  $first_instance = new $first_test();
+  array_unshift($test_list, $first_test);
+  $info = $first_instance->getInfo();
+
+  $batch = array(
+    'title' => t('Running tests'),
+    'operations' => array(
+      array('_simpletest_batch_operation', array($test_list, $test_id)),
+    ),
+    'finished' => '_simpletest_batch_finished',
+    'progress_message' => '',
+    'css' => array(drupal_get_path('module', 'simpletest') . '/simpletest.css'),
+    'init_message' => t('Processing test @num of @max - %test.', array('%test' => $info['name'], '@num' => '1', '@max' => count($test_list))),
+  );
+  batch_set($batch);
+
+  module_invoke_all('test_group_started');
+
+  return $test_id;
+}
+
+/**
+ * Batch operation callback.
+ */
+function _simpletest_batch_operation($test_list_init, $test_id, &$context) {
+  simpletest_classloader_register();
+  // Get working values.
+  if (!isset($context['sandbox']['max'])) {
+    // First iteration: initialize working values.
+    $test_list = $test_list_init;
+    $context['sandbox']['max'] = count($test_list);
+    $test_results = array('#pass' => 0, '#fail' => 0, '#exception' => 0, '#debug' => 0);
+  }
+  else {
+    // Nth iteration: get the current values where we last stored them.
+    $test_list = $context['sandbox']['tests'];
+    $test_results = $context['sandbox']['test_results'];
+  }
+  $max = $context['sandbox']['max'];
+
+  // Perform the next test.
+  $test_class = array_shift($test_list);
+  $test = new $test_class($test_id);
+  $test->run();
+  $size = count($test_list);
+  $info = $test->getInfo();
+
+  module_invoke_all('test_finished', $test->results);
+
+  // Gather results and compose the report.
+  $test_results[$test_class] = $test->results;
+  foreach ($test_results[$test_class] as $key => $value) {
+    $test_results[$key] += $value;
+  }
+  $test_results[$test_class]['#name'] = $info['name'];
+  $items = array();
+  foreach (element_children($test_results) as $class) {
+    array_unshift($items, '<div class="simpletest-' . ($test_results[$class]['#fail'] + $test_results[$class]['#exception'] ? 'fail' : 'pass') . '">' . t('@name: @summary', array('@name' => $test_results[$class]['#name'], '@summary' => _simpletest_format_summary_line($test_results[$class]))) . '</div>');
+  }
+  $context['message'] = t('Processed test @num of @max - %test.', array('%test' => $info['name'], '@num' => $max - $size, '@max' => $max));
+  $context['message'] .= '<div class="simpletest-' . ($test_results['#fail'] + $test_results['#exception'] ? 'fail' : 'pass') . '">Overall results: ' . _simpletest_format_summary_line($test_results) . '</div>';
+  $context['message'] .= theme('item_list', array('items' => $items));
+
+  // Save working values for the next iteration.
+  $context['sandbox']['tests'] = $test_list;
+  $context['sandbox']['test_results'] = $test_results;
+  // The test_id is the only thing we need to save for the report page.
+  $context['results']['test_id'] = $test_id;
+
+  // Multistep processing: report progress.
+  $context['finished'] = 1 - $size / $max;
+}
+
+function _simpletest_batch_finished($success, $results, $operations, $elapsed) {
+  if ($success) {
+    drupal_set_message(t('The test run finished in @elapsed.', array('@elapsed' => $elapsed)));
+  }
+  else {
+    // Use the test_id passed as a parameter to _simpletest_batch_operation().
+    $test_id = $operations[0][1][1];
+
+    // Retrieve the last database prefix used for testing and the last test
+    // class that was run from. Use the information to read the lgo file
+    // in case any fatal errors caused the test to crash.
+    list($last_prefix, $last_test_class) = simpletest_last_test_get($test_id);
+    simpletest_log_read($test_id, $last_prefix, $last_test_class);
+
+    drupal_set_message(t('The test run did not successfully finish.'), 'error');
+    drupal_set_message(t('Use the <em>Clean environment</em> button to clean-up temporary files and tables.'), 'warning');
+  }
+  module_invoke_all('test_group_finished');
+}
+
+/**
+ * Get information about the last test that ran given a test ID.
+ *
+ * @param $test_id
+ *   The test ID to get the last test from.
+ * @return
+ *   Array containing the last database prefix used and the last test class
+ *   that ran.
+ */
+function simpletest_last_test_get($test_id) {
+  $last_prefix = db_query_range('SELECT last_prefix FROM {simpletest_test_id} WHERE test_id = :test_id', 0, 1, array(':test_id' => $test_id))->fetchField();
+  $last_test_class = db_query_range('SELECT test_class FROM {simpletest} WHERE test_id = :test_id ORDER BY message_id DESC', 0, 1, array(':test_id' => $test_id))->fetchField();
+  return array($last_prefix, $last_test_class);
+}
+
+/**
+ * Read the error log and report any errors as assertion failures.
+ *
+ * The errors in the log should only be fatal errors since any other errors
+ * will have been recorded by the error handler.
+ *
+ * @param $test_id
+ *   The test ID to which the log relates.
+ * @param $prefix
+ *   The database prefix to which the log relates.
+ * @param $test_class
+ *   The test class to which the log relates.
+ * @param $during_test
+ *   Indicates that the current file directory path is a temporary file
+ *   file directory used during testing.
+ * @return
+ *   Found any entries in log.
+ */
+function simpletest_log_read($test_id, $prefix, $test_class, $during_test = FALSE) {
+  $log = 'public://' . ($during_test ? '' : '/simpletest/' . substr($prefix, 10)) . '/error.log';
+  $found = FALSE;
+  if (file_exists($log)) {
+    foreach (file($log) as $line) {
+      if (preg_match('/\[.*?\] (.*?): (.*?) in (.*) on line (\d+)/', $line, $match)) {
+        // Parse PHP fatal errors for example: PHP Fatal error: Call to
+        // undefined function break_me() in /path/to/file.php on line 17
+        $caller = array(
+          'line' => $match[4],
+          'file' => $match[3],
+        );
+        DrupalTestCase::insertAssert($test_id, $test_class, FALSE, $match[2], $match[1], $caller);
+      }
+      else {
+        // Unknown format, place the entire message in the log.
+        DrupalTestCase::insertAssert($test_id, $test_class, FALSE, $line, 'Fatal error');
+      }
+      $found = TRUE;
+    }
+  }
+  return $found;
+}
+
+/**
+ * Get a list of all of the tests provided by the system.
+ *
+ * The list of test classes is loaded from the registry where it looks for
+ * files ending in ".test". Once loaded the test list is cached and stored in
+ * a static variable. In order to list tests provided by disabled modules
+ * hook_registry_files_alter() is used to forcefully add them to the registry.
+ *
+ * PSR-0 classes are found by searching the designated directory for each module
+ * for files matching the PSR-0 standard.
+ *
+ * @return
+ *   An array of tests keyed with the groups specified in each of the tests
+ *   getInfo() method and then keyed by the test class. An example of the array
+ *   structure is provided below.
+ *
+ *   @code
+ *     $groups['Blog'] => array(
+ *       'BlogTestCase' => array(
+ *         'name' => 'Blog functionality',
+ *         'description' => 'Create, view, edit, delete, ...',
+ *         'group' => 'Blog',
+ *       ),
+ *     );
+ *   @endcode
+ * @see simpletest_registry_files_alter()
+ */
+function simpletest_test_get_all() {
+  $groups = &drupal_static(__FUNCTION__);
+
+  if (!$groups) {
+    // Register a simple class loader for PSR-0 test classes.
+    simpletest_classloader_register();
+
+    // Load test information from cache if available, otherwise retrieve the
+    // information from each tests getInfo() method.
+    if ($cache = cache_get('simpletest', 'cache')) {
+      $groups = $cache->data;
+    }
+    else {
+      // Select all clases in files ending with .test.
+      $classes = db_query("SELECT name FROM {registry} WHERE type = :type AND filename LIKE :name", array(':type' => 'class', ':name' => '%.test'))->fetchCol();
+
+      // Also discover PSR-0 test classes, if the PHP version allows it.
+      if (version_compare(PHP_VERSION, '5.3') > 0) {
+
+        // Select all PSR-0 classes in the Tests namespace of all modules.
+        $system_list = db_query("SELECT name, filename FROM {system}")->fetchAllKeyed();
+
+        foreach ($system_list as $name => $filename) {
+          // Build directory in which the test files would reside.
+          $tests_dir = DRUPAL_ROOT . '/' . dirname($filename) . '/lib/Drupal/' . $name . '/Tests';
+          // Scan it for test files if it exists.
+          if (is_dir($tests_dir)) {
+            $files = file_scan_directory($tests_dir, '/.*\.php/');
+            if (!empty($files)) {
+              $basedir = DRUPAL_ROOT . '/' . dirname($filename) . '/lib/';
+              foreach ($files as $file) {
+                // Convert the file name into the namespaced class name.
+                $replacements = array(
+                  '/' => '\\',
+                  $basedir => '',
+                  '.php' => '',
+                );
+                $classes[] = strtr($file->uri, $replacements);
+              }
+            }
+          }
+        }
+      }
+
+      // Check that each class has a getInfo() method and store the information
+      // in an array keyed with the group specified in the test information.
+      $groups = array();
+      foreach ($classes as $class) {
+        // Test classes need to implement getInfo() to be valid.
+        if (class_exists($class) && method_exists($class, 'getInfo')) {
+          $info = call_user_func(array($class, 'getInfo'));
+
+          // If this test class requires a non-existing module, skip it.
+          if (!empty($info['dependencies'])) {
+            foreach ($info['dependencies'] as $module) {
+              if (!drupal_get_filename('module', $module)) {
+                continue 2;
+              }
+            }
+          }
+
+          $groups[$info['group']][$class] = $info;
+        }
+      }
+
+      // Sort the groups and tests within the groups by name.
+      uksort($groups, 'strnatcasecmp');
+      foreach ($groups as $group => &$tests) {
+        uksort($tests, 'strnatcasecmp');
+      }
+
+      // Allow modules extending core tests to disable originals.
+      drupal_alter('simpletest', $groups);
+      cache_set('simpletest', $groups);
+    }
+  }
+  return $groups;
+}
+
+/*
+ * Register a simple class loader that can find D8-style PSR-0 test classes.
+ *
+ * Other PSR-0 class loading can happen in contrib, but those contrib class
+ * loader modules will not be enabled when testbot runs. So we need to do this
+ * one in core.
+ */
+function simpletest_classloader_register() {
+
+  // Prevent duplicate classloader registration.
+  static $first_run = TRUE;
+  if (!$first_run) {
+    return;
+  }
+  $first_run = FALSE;
+
+  // Only register PSR-0 class loading if we are on PHP 5.3 or higher.
+  if (version_compare(PHP_VERSION, '5.3') > 0) {
+    spl_autoload_register('_simpletest_autoload_psr0');
+  }
+}
+
+/**
+ * Autoload callback to find PSR-0 test classes.
+ *
+ * This will only work on classes where the namespace is of the pattern
+ *   "Drupal\$extension\Tests\.."
+ */
+function _simpletest_autoload_psr0($class) {
+
+  // Static cache for extension paths.
+  // This cache is lazily filled as soon as it is needed.
+  static $extensions;
+
+  // Check that the first namespace fragment is "Drupal\"
+  if (substr($class, 0, 7) === 'Drupal\\') {
+    // Find the position of the second namespace separator.
+    $pos = strpos($class, '\\', 7);
+    // Check that the third namespace fragment is "\Tests\".
+    if (substr($class, $pos, 7) === '\\Tests\\') {
+
+      // Extract the second namespace fragment, which we expect to be the
+      // extension name.
+      $extension = substr($class, 7, $pos - 7);
+
+      // Lazy-load the extension paths, both enabled and disabled.
+      if (!isset($extensions)) {
+        $extensions = db_query("SELECT name, filename FROM {system}")->fetchAllKeyed();
+      }
+
+      // Check if the second namespace fragment is a known extension name.
+      if (isset($extensions[$extension])) {
+
+        // Split the class into namespace and classname.
+        $nspos = strrpos($class, '\\');
+        $namespace = substr($class, 0, $nspos);
+        $classname = substr($class, $nspos + 1);
+
+        // Build the filepath where we expect the class to be defined.
+        $path = dirname($extensions[$extension]) . '/lib/' .
+          str_replace('\\', '/', $namespace) . '/' .
+          str_replace('_', '/', $classname) . '.php';
+
+        // Include the file, if it does exist.
+        if (file_exists($path)) {
+          include $path;
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_registry_files_alter().
+ *
+ * Add the test files for disabled modules so that we get a list containing
+ * all the avialable tests.
+ */
+function simpletest_registry_files_alter(&$files, $modules) {
+  foreach ($modules as $module) {
+    // Only add test files for disabled modules, as enabled modules should
+    // already include any test files they provide.
+    if (!$module->status) {
+      $dir = $module->dir;
+      if (!empty($module->info['files'])) {
+        foreach ($module->info['files'] as $file) {
+          if (substr($file, -5) == '.test') {
+            $files["$dir/$file"] = array('module' => $module->name, 'weight' => $module->weight);
+          }
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Generate test file.
+ */
+function simpletest_generate_file($filename, $width, $lines, $type = 'binary-text') {
+  $size = $width * $lines - $lines;
+
+  // Generate random text
+  $text = '';
+  for ($i = 0; $i < $size; $i++) {
+    switch ($type) {
+      case 'text':
+        $text .= chr(rand(32, 126));
+        break;
+      case 'binary':
+        $text .= chr(rand(0, 31));
+        break;
+      case 'binary-text':
+      default:
+        $text .= rand(0, 1);
+        break;
+    }
+  }
+  $text = wordwrap($text, $width - 1, "\n", TRUE) . "\n"; // Add \n for symmetrical file.
+
+  // Create filename.
+  file_put_contents('public://' . $filename . '.txt', $text);
+  return $filename;
+}
+
+/**
+ * Remove all temporary database tables and directories.
+ */
+function simpletest_clean_environment() {
+  simpletest_clean_database();
+  simpletest_clean_temporary_directories();
+  if (variable_get('simpletest_clear_results', TRUE)) {
+    $count = simpletest_clean_results_table();
+    drupal_set_message(format_plural($count, 'Removed 1 test result.', 'Removed @count test results.'));
+  }
+  else {
+    drupal_set_message(t('Clear results is disabled and the test results table will not be cleared.'), 'warning');
+  }
+
+  // Detect test classes that have been added, renamed or deleted.
+  registry_rebuild();
+  cache_clear_all('simpletest', 'cache');
+}
+
+/**
+ * Removed prefixed tables from the database that are left over from crashed tests.
+ */
+function simpletest_clean_database() {
+  $tables = db_find_tables(Database::getConnection()->prefixTables('{simpletest}') . '%');
+  $schema = drupal_get_schema_unprocessed('simpletest');
+  $count = 0;
+  foreach (array_diff_key($tables, $schema) as $table) {
+    // Strip the prefix and skip tables without digits following "simpletest",
+    // e.g. {simpletest_test_id}.
+    if (preg_match('/simpletest\d+.*/', $table, $matches)) {
+      db_drop_table($matches[0]);
+      $count++;
+    }
+  }
+
+  if ($count > 0) {
+    drupal_set_message(format_plural($count, 'Removed 1 leftover table.', 'Removed @count leftover tables.'));
+  }
+  else {
+    drupal_set_message(t('No leftover tables to remove.'));
+  }
+}
+
+/**
+ * Find all leftover temporary directories and remove them.
+ */
+function simpletest_clean_temporary_directories() {
+  $count = 0;
+  if (is_dir('public://simpletest')) {
+    $files = scandir('public://simpletest');
+    foreach ($files as $file) {
+      $path = 'public://simpletest/' . $file;
+      if (is_dir($path) && is_numeric($file)) {
+        file_unmanaged_delete_recursive($path);
+        $count++;
+      }
+    }
+  }
+
+  if ($count > 0) {
+    drupal_set_message(format_plural($count, 'Removed 1 temporary directory.', 'Removed @count temporary directories.'));
+  }
+  else {
+    drupal_set_message(t('No temporary directories to remove.'));
+  }
+}
+
+/**
+ * Clear the test result tables.
+ *
+ * @param $test_id
+ *   Test ID to remove results for, or NULL to remove all results.
+ * @return
+ *   The number of results removed.
+ */
+function simpletest_clean_results_table($test_id = NULL) {
+  if (variable_get('simpletest_clear_results', TRUE)) {
+    if ($test_id) {
+      $count = db_query('SELECT COUNT(test_id) FROM {simpletest_test_id} WHERE test_id = :test_id', array(':test_id' => $test_id))->fetchField();
+
+      db_delete('simpletest')
+        ->condition('test_id', $test_id)
+        ->execute();
+      db_delete('simpletest_test_id')
+        ->condition('test_id', $test_id)
+        ->execute();
+    }
+    else {
+      $count = db_query('SELECT COUNT(test_id) FROM {simpletest_test_id}')->fetchField();
+
+      // Clear test results.
+      db_delete('simpletest')->execute();
+      db_delete('simpletest_test_id')->execute();
+    }
+
+    return $count;
+  }
+  return 0;
+}
+
+/**
+ * Implements hook_mail_alter().
+ *
+ * Aborts sending of messages with ID 'simpletest_cancel_test'.
+ *
+ * @see MailTestCase::testCancelMessage()
+ */
+function simpletest_mail_alter(&$message) {
+  if ($message['id'] == 'simpletest_cancel_test') {
+    $message['send'] = FALSE;
+  }
+}
diff --git a/htmltest/modules/simpletest/simpletest.pages.inc b/htmltest/modules/simpletest/simpletest.pages.inc
new file mode 100644
index 00000000..3127459e
--- /dev/null
+++ b/htmltest/modules/simpletest/simpletest.pages.inc
@@ -0,0 +1,513 @@
+<?php
+
+/**
+ * @file
+ * Page callbacks for simpletest module.
+ */
+
+/**
+ * List tests arranged in groups that can be selected and run.
+ */
+function simpletest_test_form($form) {
+  $form['tests'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Tests'),
+    '#description' => t('Select the test(s) or test group(s) you would like to run, and click <em>Run tests</em>.'),
+  );
+
+  $form['tests']['table'] = array(
+    '#theme' => 'simpletest_test_table',
+  );
+
+  // Generate the list of tests arranged by group.
+  $groups = simpletest_test_get_all();
+  foreach ($groups as $group => $tests) {
+    $form['tests']['table'][$group] = array(
+      '#collapsed' => TRUE,
+    );
+
+    foreach ($tests as $class => $info) {
+      $form['tests']['table'][$group][$class] = array(
+        '#type' => 'checkbox',
+        '#title' => $info['name'],
+        '#description' => $info['description'],
+      );
+    }
+  }
+
+  // Operation buttons.
+  $form['tests']['op'] = array(
+    '#type' => 'submit',
+    '#value' => t('Run tests'),
+  );
+  $form['clean'] = array(
+    '#type' => 'fieldset',
+    '#collapsible' => FALSE,
+    '#collapsed' => FALSE,
+    '#title' => t('Clean test environment'),
+    '#description' => t('Remove tables with the prefix "simpletest" and temporary directories that are left over from tests that crashed. This is intended for developers when creating tests.'),
+  );
+  $form['clean']['op'] = array(
+    '#type' => 'submit',
+    '#value' => t('Clean environment'),
+    '#submit' => array('simpletest_clean_environment'),
+  );
+
+  return $form;
+}
+
+/**
+ * Returns HTML for a test list generated by simpletest_test_form() into a table.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - table: A render element representing the table.
+ *
+ * @ingroup themeable
+ */
+function theme_simpletest_test_table($variables) {
+  $table = $variables['table'];
+
+  drupal_add_css(drupal_get_path('module', 'simpletest') . '/simpletest.css');
+  drupal_add_js(drupal_get_path('module', 'simpletest') . '/simpletest.js');
+  drupal_add_js('misc/tableselect.js');
+
+  // Create header for test selection table.
+  $header = array(
+    array('class' => array('select-all')),
+    array('data' => t('Test'), 'class' => array('simpletest_test')),
+    array('data' => t('Description'), 'class' => array('simpletest_description')),
+  );
+
+  // Define the images used to expand/collapse the test groups.
+  $js = array(
+    'images' => array(
+      theme('image', array('path' => 'misc/menu-collapsed.png', 'width' => 7, 'height' => 7, 'alt' => t('Expand'), 'title' => t('Expand'))) . ' <a href="#" class="simpletest-collapse">(' . t('Expand') . ')</a>',
+      theme('image', array('path' => 'misc/menu-expanded.png', 'width' => 7, 'height' => 7, 'alt' => t('Collapse'), 'title' => t('Collapse'))) . ' <a href="#" class="simpletest-collapse">(' . t('Collapse') . ')</a>',
+    ),
+  );
+
+  // Cycle through each test group and create a row.
+  $rows = array();
+  foreach (element_children($table) as $key) {
+    $element = &$table[$key];
+    $row = array();
+
+    // Make the class name safe for output on the page by replacing all
+    // non-word/decimal characters with a dash (-).
+    $test_class = strtolower(trim(preg_replace("/[^\w\d]/", "-", $key)));
+
+    // Select the right "expand"/"collapse" image, depending on whether the
+    // category is expanded (at least one test selected) or not.
+    $collapsed = !empty($element['#collapsed']);
+    $image_index = $collapsed ? 0 : 1;
+
+    // Place-holder for checkboxes to select group of tests.
+    $row[] = array('id' => $test_class, 'class' => array('simpletest-select-all'));
+
+    // Expand/collapse image and group title.
+    $row[] = array(
+      'data' => '<div class="simpletest-image" id="simpletest-test-group-' . $test_class . '"></div>' .
+        '<label for="' . $test_class . '-select-all" class="simpletest-group-label">' . $key . '</label>',
+      'class' => array('simpletest-group-label'),
+    );
+
+    $row[] = array(
+      'data' => '&nbsp;',
+      'class' => array('simpletest-group-description'),
+    );
+
+    $rows[] = array('data' => $row, 'class' => array('simpletest-group'));
+
+    // Add individual tests to group.
+    $current_js = array(
+      'testClass' => $test_class . '-test',
+      'testNames' => array(),
+      'imageDirection' => $image_index,
+      'clickActive' => FALSE,
+    );
+
+    // Sorting $element by children's #title attribute instead of by class name.
+    uasort($element, 'element_sort_by_title');
+
+    // Cycle through each test within the current group.
+    foreach (element_children($element) as $test_name) {
+      $test = $element[$test_name];
+      $row = array();
+
+      $current_js['testNames'][] = $test['#id'];
+
+      // Store test title and description so that checkbox won't render them.
+      $title = $test['#title'];
+      $description = $test['#description'];
+
+      $test['#title_display'] = 'invisible';
+      unset($test['#description']);
+
+      // Test name is used to determine what tests to run.
+      $test['#name'] = $test_name;
+
+      $row[] = array(
+        'data' => drupal_render($test),
+        'class' => array('simpletest-test-select'),
+      );
+      $row[] = array(
+        'data' => '<label for="' . $test['#id'] . '">' . $title . '</label>',
+        'class' => array('simpletest-test-label'),
+      );
+      $row[] = array(
+        'data' => '<div class="description">' . $description . '</div>',
+        'class' => array('simpletest-test-description'),
+      );
+
+      $rows[] = array('data' => $row, 'class' => array($test_class . '-test', ($collapsed ? 'js-hide' : '')));
+    }
+    $js['simpletest-test-group-' . $test_class] = $current_js;
+    unset($table[$key]);
+  }
+
+  // Add js array of settings.
+  drupal_add_js(array('simpleTest' => $js), 'setting');
+
+  if (empty($rows)) {
+    return '<strong>' . t('No tests to display.') . '</strong>';
+  }
+  else {
+    return theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'simpletest-form-table')));
+  }
+}
+
+/**
+ * Run selected tests.
+ */
+function simpletest_test_form_submit($form, &$form_state) {
+  simpletest_classloader_register();
+  // Get list of tests.
+  $tests_list = array();
+  foreach ($form_state['values'] as $class_name => $value) {
+    // Since class_exists() will likely trigger an autoload lookup,
+    // we do the fast check first.
+    if ($value === 1 && class_exists($class_name)) {
+      $tests_list[] = $class_name;
+    }
+  }
+  if (count($tests_list) > 0 ) {
+    $test_id = simpletest_run_tests($tests_list, 'drupal');
+    $form_state['redirect'] = 'admin/config/development/testing/results/' . $test_id;
+  }
+  else {
+    drupal_set_message(t('No test(s) selected.'), 'error');
+  }
+}
+
+/**
+ * Test results form for $test_id.
+ */
+function simpletest_result_form($form, &$form_state, $test_id) {
+  // Make sure there are test results to display and a re-run is not being performed.
+  $results = array();
+  if (is_numeric($test_id) && !$results = simpletest_result_get($test_id)) {
+    drupal_set_message(t('No test results to display.'), 'error');
+    drupal_goto('admin/config/development/testing');
+    return $form;
+  }
+
+  // Load all classes and include CSS.
+  drupal_add_css(drupal_get_path('module', 'simpletest') . '/simpletest.css');
+
+  // Keep track of which test cases passed or failed.
+  $filter = array(
+    'pass' => array(),
+    'fail' => array(),
+  );
+
+  // Summary result fieldset.
+  $form['result'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Results'),
+  );
+  $form['result']['summary'] = $summary = array(
+    '#theme' => 'simpletest_result_summary',
+    '#pass' => 0,
+    '#fail' => 0,
+    '#exception' => 0,
+    '#debug' => 0,
+  );
+
+  simpletest_classloader_register();
+
+  // Cycle through each test group.
+  $header = array(t('Message'), t('Group'), t('Filename'), t('Line'), t('Function'), array('colspan' => 2, 'data' => t('Status')));
+  $form['result']['results'] = array();
+  foreach ($results as $group => $assertions) {
+    // Create group fieldset with summary information.
+    $info = call_user_func(array($group, 'getInfo'));
+    $form['result']['results'][$group] = array(
+      '#type' => 'fieldset',
+      '#title' => $info['name'],
+      '#description' => $info['description'],
+      '#collapsible' => TRUE,
+    );
+    $form['result']['results'][$group]['summary'] = $summary;
+    $group_summary = &$form['result']['results'][$group]['summary'];
+
+    // Create table of assertions for the group.
+    $rows = array();
+    foreach ($assertions as $assertion) {
+      $row = array();
+      $row[] = $assertion->message;
+      $row[] = $assertion->message_group;
+      $row[] = drupal_basename($assertion->file);
+      $row[] = $assertion->line;
+      $row[] = $assertion->function;
+      $row[] = simpletest_result_status_image($assertion->status);
+
+      $class = 'simpletest-' . $assertion->status;
+      if ($assertion->message_group == 'Debug') {
+        $class = 'simpletest-debug';
+      }
+      $rows[] = array('data' => $row, 'class' => array($class));
+
+      $group_summary['#' . $assertion->status]++;
+      $form['result']['summary']['#' . $assertion->status]++;
+    }
+    $form['result']['results'][$group]['table'] = array(
+      '#theme' => 'table',
+      '#header' => $header,
+      '#rows' => $rows,
+    );
+
+    // Set summary information.
+    $group_summary['#ok'] = $group_summary['#fail'] + $group_summary['#exception'] == 0;
+    $form['result']['results'][$group]['#collapsed'] = $group_summary['#ok'];
+
+    // Store test group (class) as for use in filter.
+    $filter[$group_summary['#ok'] ? 'pass' : 'fail'][] = $group;
+  }
+
+  // Overal summary status.
+  $form['result']['summary']['#ok'] = $form['result']['summary']['#fail'] + $form['result']['summary']['#exception'] == 0;
+
+  // Actions.
+  $form['#action'] = url('admin/config/development/testing/results/re-run');
+  $form['action'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Actions'),
+    '#attributes' => array('class' => array('container-inline')),
+    '#weight' => -11,
+  );
+
+  $form['action']['filter'] = array(
+    '#type' => 'select',
+    '#title' => 'Filter',
+    '#options' => array(
+      'all' => t('All (@count)', array('@count' => count($filter['pass']) + count($filter['fail']))),
+      'pass' => t('Pass (@count)', array('@count' => count($filter['pass']))),
+      'fail' => t('Fail (@count)', array('@count' => count($filter['fail']))),
+    ),
+  );
+  $form['action']['filter']['#default_value'] = ($filter['fail'] ? 'fail' : 'all');
+
+  // Categorized test classes for to be used with selected filter value.
+  $form['action']['filter_pass'] = array(
+    '#type' => 'hidden',
+    '#default_value' => implode(',', $filter['pass']),
+  );
+  $form['action']['filter_fail'] = array(
+    '#type' => 'hidden',
+    '#default_value' => implode(',', $filter['fail']),
+  );
+
+  $form['action']['op'] = array(
+    '#type' => 'submit',
+    '#value' => t('Run tests'),
+  );
+
+  $form['action']['return'] = array(
+    '#type' => 'link',
+    '#title' => t('Return to list'),
+    '#href' => 'admin/config/development/testing',
+  );
+
+  if (is_numeric($test_id)) {
+    simpletest_clean_results_table($test_id);
+  }
+
+  return $form;
+}
+
+/**
+ * Re-run the tests that match the filter.
+ */
+function simpletest_result_form_submit($form, &$form_state) {
+  $pass = $form_state['values']['filter_pass'] ? explode(',', $form_state['values']['filter_pass']) : array();
+  $fail = $form_state['values']['filter_fail'] ? explode(',', $form_state['values']['filter_fail']) : array();
+
+  if ($form_state['values']['filter'] == 'all') {
+    $classes = array_merge($pass, $fail);
+  }
+  elseif ($form_state['values']['filter'] == 'pass') {
+    $classes = $pass;
+  }
+  else {
+    $classes = $fail;
+  }
+
+  if (!$classes) {
+    $form_state['redirect'] = 'admin/config/development/testing';
+    return;
+  }
+
+  $form_state_execute = array('values' => array());
+  foreach ($classes as $class) {
+    $form_state_execute['values'][$class] = 1;
+  }
+
+  simpletest_test_form_submit(array(), $form_state_execute);
+  $form_state['redirect'] = $form_state_execute['redirect'];
+}
+
+/**
+ * Returns HTML for the summary status of a simpletest result.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_simpletest_result_summary($variables) {
+  $form = $variables['form'];
+  return '<div class="simpletest-' . ($form['#ok'] ? 'pass' : 'fail') . '">' . _simpletest_format_summary_line($form) . '</div>';
+}
+
+/**
+ * Get test results for $test_id.
+ *
+ * @param $test_id The test_id to retrieve results of.
+ * @return Array of results grouped by test_class.
+ */
+function simpletest_result_get($test_id) {
+  $results = db_select('simpletest')
+    ->fields('simpletest')
+    ->condition('test_id', $test_id)
+    ->orderBy('test_class')
+    ->orderBy('message_id')
+    ->execute();
+
+  $test_results = array();
+  foreach ($results as $result) {
+    if (!isset($test_results[$result->test_class])) {
+      $test_results[$result->test_class] = array();
+    }
+    $test_results[$result->test_class][] = $result;
+  }
+  return $test_results;
+}
+
+/**
+ * Get the appropriate image for the status.
+ *
+ * @param $status Status string, either: pass, fail, exception.
+ * @return HTML image or false.
+ */
+function simpletest_result_status_image($status) {
+  // $map does not use drupal_static() as its value never changes.
+  static $map;
+
+  if (!isset($map)) {
+    $map = array(
+      'pass' => theme('image', array('path' => 'misc/watchdog-ok.png', 'width' => 18, 'height' => 18, 'alt' => t('Pass'))),
+      'fail' => theme('image', array('path' => 'misc/watchdog-error.png', 'width' => 18, 'height' => 18, 'alt' => t('Fail'))),
+      'exception' => theme('image', array('path' => 'misc/watchdog-warning.png', 'width' => 18, 'height' => 18, 'alt' => t('Exception'))),
+      'debug' => theme('image', array('path' => 'misc/watchdog-warning.png', 'width' => 18, 'height' => 18, 'alt' => t('Debug'))),
+    );
+  }
+  if (isset($map[$status])) {
+    return $map[$status];
+  }
+  return FALSE;
+}
+
+/**
+ * Provides settings form for SimpleTest variables.
+ *
+ * @ingroup forms
+ * @see simpletest_settings_form_validate()
+ */
+function simpletest_settings_form($form, &$form_state) {
+  $form['general'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('General'),
+  );
+  $form['general']['simpletest_clear_results'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Clear results after each complete test suite run'),
+    '#description' => t('By default SimpleTest will clear the results after they have been viewed on the results page, but in some cases it may be useful to leave the results in the database. The results can then be viewed at <em>admin/config/development/testing/[test_id]</em>. The test ID can be found in the database, simpletest table, or kept track of when viewing the results the first time. Additionally, some modules may provide more analysis or features that require this setting to be disabled.'),
+    '#default_value' => variable_get('simpletest_clear_results', TRUE),
+  );
+  $form['general']['simpletest_verbose'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Provide verbose information when running tests'),
+    '#description' => t('The verbose data will be printed along with the standard assertions and is useful for debugging. The verbose data will be erased between each test suite run. The verbose data output is very detailed and should only be used when debugging.'),
+    '#default_value' => variable_get('simpletest_verbose', TRUE),
+  );
+
+  $form['httpauth'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('HTTP authentication'),
+    '#description' => t('HTTP auth settings to be used by the SimpleTest browser during testing. Useful when the site requires basic HTTP authentication.'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['httpauth']['simpletest_httpauth_method'] = array(
+    '#type' => 'select',
+    '#title' => t('Method'),
+    '#options' => array(
+      CURLAUTH_BASIC => t('Basic'),
+      CURLAUTH_DIGEST => t('Digest'),
+      CURLAUTH_GSSNEGOTIATE => t('GSS negotiate'),
+      CURLAUTH_NTLM => t('NTLM'),
+      CURLAUTH_ANY => t('Any'),
+      CURLAUTH_ANYSAFE => t('Any safe'),
+    ),
+    '#default_value' => variable_get('simpletest_httpauth_method', CURLAUTH_BASIC),
+  );
+  $username = variable_get('simpletest_httpauth_username');
+  $password = variable_get('simpletest_httpauth_password');
+  $form['httpauth']['simpletest_httpauth_username'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Username'),
+    '#default_value' => $username,
+  );
+  if ($username && $password) {
+    $form['httpauth']['simpletest_httpauth_username']['#description'] = t('Leave this blank to delete both the existing username and password.');
+  }
+  $form['httpauth']['simpletest_httpauth_password'] = array(
+    '#type' => 'password',
+    '#title' => t('Password'),
+  );
+  if ($password) {
+    $form['httpauth']['simpletest_httpauth_password']['#description'] = t('To change the password, enter the new password here.');
+  }
+
+  return system_settings_form($form);
+}
+
+/**
+ * Validation handler for simpletest_settings_form().
+ */
+function simpletest_settings_form_validate($form, &$form_state) {
+  // If a username was provided but a password wasn't, preserve the existing
+  // password.
+  if (!empty($form_state['values']['simpletest_httpauth_username']) && empty($form_state['values']['simpletest_httpauth_password'])) {
+    $form_state['values']['simpletest_httpauth_password'] = variable_get('simpletest_httpauth_password', '');
+  }
+
+  // If a password was provided but a username wasn't, the credentials are
+  // incorrect, so throw an error.
+  if (empty($form_state['values']['simpletest_httpauth_username']) && !empty($form_state['values']['simpletest_httpauth_password'])) {
+    form_set_error('simpletest_httpauth_username', t('HTTP authentication credentials must include a username in addition to a password.'));
+  }
+}
+
diff --git a/htmltest/modules/simpletest/simpletest.test b/htmltest/modules/simpletest/simpletest.test
new file mode 100644
index 00000000..dde162ec
--- /dev/null
+++ b/htmltest/modules/simpletest/simpletest.test
@@ -0,0 +1,746 @@
+<?php
+
+/**
+ * @file
+ * Tests for simpletest.module.
+ */
+
+class SimpleTestFunctionalTest extends DrupalWebTestCase {
+  /**
+   * The results array that has been parsed by getTestResults().
+   */
+  protected $childTestResults;
+
+  /**
+   * Store the test ID from each test run for comparison, to ensure they are
+   * incrementing.
+   */
+  protected $test_ids = array();
+
+  public static function getInfo() {
+    return array(
+      'name' => 'SimpleTest functionality',
+      'description' => "Test SimpleTest's web interface: check that the intended tests were run and ensure that test reports display the intended results. Also test SimpleTest's internal browser and API's both explicitly and implicitly.",
+      'group' => 'SimpleTest'
+    );
+  }
+
+  function setUp() {
+    if (!$this->inCURL()) {
+      parent::setUp('simpletest');
+
+      // Create and login user
+      $admin_user = $this->drupalCreateUser(array('administer unit tests'));
+      $this->drupalLogin($admin_user);
+    }
+    else {
+      parent::setUp('non_existent_module');
+    }
+  }
+
+  /**
+   * Test the internal browsers functionality.
+   */
+  function testInternalBrowser() {
+    global $conf;
+    if (!$this->inCURL()) {
+      $this->drupalGet('node');
+      $this->assertTrue($this->drupalGetHeader('Date'), 'An HTTP header was received.');
+      $this->assertTitle(t('Welcome to @site-name | @site-name', array('@site-name' => variable_get('site_name', 'Drupal'))), 'Site title matches.');
+      $this->assertNoTitle('Foo', 'Site title does not match.');
+      // Make sure that we are locked out of the installer when prefixing
+      // using the user-agent header. This is an important security check.
+      global $base_url;
+
+      $this->drupalGet($base_url . '/install.php', array('external' => TRUE));
+      $this->assertResponse(403, 'Cannot access install.php with a "simpletest" user-agent header.');
+
+      $user = $this->drupalCreateUser();
+      $this->drupalLogin($user);
+      $headers = $this->drupalGetHeaders(TRUE);
+      $this->assertEqual(count($headers), 2, 'There was one intermediate request.');
+      $this->assertTrue(strpos($headers[0][':status'], '302') !== FALSE, 'Intermediate response code was 302.');
+      $this->assertFalse(empty($headers[0]['location']), 'Intermediate request contained a Location header.');
+      $this->assertEqual($this->getUrl(), $headers[0]['location'], 'HTTP redirect was followed');
+      $this->assertFalse($this->drupalGetHeader('Location'), 'Headers from intermediate request were reset.');
+      $this->assertResponse(200, 'Response code from intermediate request was reset.');
+
+      // Test the maximum redirection option.
+      $this->drupalLogout();
+      $edit = array(
+        'name' => $user->name,
+        'pass' => $user->pass_raw
+      );
+      variable_set('simpletest_maximum_redirects', 1);
+      $this->drupalPost('user?destination=user/logout', $edit, t('Log in'));
+      $headers = $this->drupalGetHeaders(TRUE);
+      $this->assertEqual(count($headers), 2, 'Simpletest stopped following redirects after the first one.');
+    }
+  }
+
+  /**
+   * Test validation of the User-Agent header we use to perform test requests.
+   */
+  function testUserAgentValidation() {
+    if (!$this->inCURL()) {
+      global $base_url;
+      $simpletest_path = $base_url . '/' . drupal_get_path('module', 'simpletest');
+      $HTTP_path = $simpletest_path .'/tests/http.php?q=node';
+      $https_path = $simpletest_path .'/tests/https.php?q=node';
+      // Generate a valid simpletest User-Agent to pass validation.
+      $this->assertTrue(preg_match('/simpletest\d+/', $this->databasePrefix, $matches), 'Database prefix contains simpletest prefix.');
+      $test_ua = drupal_generate_test_ua($matches[0]);
+      $this->additionalCurlOptions = array(CURLOPT_USERAGENT => $test_ua);
+
+      // Test pages only available for testing.
+      $this->drupalGet($HTTP_path);
+      $this->assertResponse(200, 'Requesting http.php with a legitimate simpletest User-Agent returns OK.');
+      $this->drupalGet($https_path);
+      $this->assertResponse(200, 'Requesting https.php with a legitimate simpletest User-Agent returns OK.');
+
+      // Now slightly modify the HMAC on the header, which should not validate.
+      $this->additionalCurlOptions = array(CURLOPT_USERAGENT => $test_ua . 'X');
+      $this->drupalGet($HTTP_path);
+      $this->assertResponse(403, 'Requesting http.php with a bad simpletest User-Agent fails.');
+      $this->drupalGet($https_path);
+      $this->assertResponse(403, 'Requesting https.php with a bad simpletest User-Agent fails.');
+
+      // Use a real User-Agent and verify that the special files http.php and
+      // https.php can't be accessed.
+      $this->additionalCurlOptions = array(CURLOPT_USERAGENT => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12');
+      $this->drupalGet($HTTP_path);
+      $this->assertResponse(403, 'Requesting http.php with a normal User-Agent fails.');
+      $this->drupalGet($https_path);
+      $this->assertResponse(403, 'Requesting https.php with a normal User-Agent fails.');
+    }
+  }
+
+  /**
+   * Make sure that tests selected through the web interface are run and
+   * that the results are displayed correctly.
+   */
+  function testWebTestRunner() {
+    $this->pass = t('SimpleTest pass.');
+    $this->fail = t('SimpleTest fail.');
+    $this->valid_permission = 'access content';
+    $this->invalid_permission = 'invalid permission';
+
+    if ($this->inCURL()) {
+      // Only run following code if this test is running itself through a CURL request.
+      $this->stubTest();
+    }
+    else {
+
+      // Run twice so test_ids can be accumulated.
+      for ($i = 0; $i < 2; $i++) {
+        // Run this test from web interface.
+        $this->drupalGet('admin/config/development/testing');
+
+        $edit = array();
+        $edit['SimpleTestFunctionalTest'] = TRUE;
+        $this->drupalPost(NULL, $edit, t('Run tests'));
+
+        // Parse results and confirm that they are correct.
+        $this->getTestResults();
+        $this->confirmStubTestResults();
+      }
+
+      // Regression test for #290316.
+      // Check that test_id is incrementing.
+      $this->assertTrue($this->test_ids[0] != $this->test_ids[1], 'Test ID is incrementing.');
+    }
+  }
+
+  /**
+   * Test to be run and the results confirmed.
+   */
+  function stubTest() {
+    $this->pass($this->pass);
+    $this->fail($this->fail);
+
+    $this->drupalCreateUser(array($this->valid_permission));
+    $this->drupalCreateUser(array($this->invalid_permission));
+
+    $this->pass(t('Test ID is @id.', array('@id' => $this->testId)));
+
+    // Generates a warning.
+    $i = 1 / 0;
+
+    // Call an assert function specific to that class.
+    $this->assertNothing();
+
+    // Generates a warning inside a PHP function.
+    array_key_exists(NULL, NULL);
+
+    debug('Foo', 'Debug');
+  }
+
+  /**
+   * Assert nothing.
+   */
+  function assertNothing() {
+    $this->pass("This is nothing.");
+  }
+
+  /**
+   * Confirm that the stub test produced the desired results.
+   */
+  function confirmStubTestResults() {
+    $this->assertAssertion(t('Enabled modules: %modules', array('%modules' => 'non_existent_module')), 'Other', 'Fail', 'simpletest.test', 'SimpleTestFunctionalTest->setUp()');
+
+    $this->assertAssertion($this->pass, 'Other', 'Pass', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
+    $this->assertAssertion($this->fail, 'Other', 'Fail', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
+
+    $this->assertAssertion(t('Created permissions: @perms', array('@perms' => $this->valid_permission)), 'Role', 'Pass', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
+    $this->assertAssertion(t('Invalid permission %permission.', array('%permission' => $this->invalid_permission)), 'Role', 'Fail', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
+
+    // Check that a warning is caught by simpletest.
+    $this->assertAssertion('Division by zero', 'Warning', 'Fail', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
+
+    // Check that the backtracing code works for specific assert function.
+    $this->assertAssertion('This is nothing.', 'Other', 'Pass', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
+
+    // Check that errors that occur inside PHP internal functions are correctly reported.
+    // The exact error message differs between PHP versions so we check only
+    // the function name 'array_key_exists'.
+    $this->assertAssertion('array_key_exists', 'Warning', 'Fail', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
+
+    $this->assertAssertion("Debug: 'Foo'", 'Debug', 'Fail', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
+
+    $this->assertEqual('6 passes, 5 fails, 2 exceptions, and 1 debug message', $this->childTestResults['summary'], 'Stub test summary is correct');
+
+    $this->test_ids[] = $test_id = $this->getTestIdFromResults();
+    $this->assertTrue($test_id, 'Found test ID in results.');
+  }
+
+  /**
+   * Fetch the test id from the test results.
+   */
+  function getTestIdFromResults() {
+    foreach ($this->childTestResults['assertions'] as $assertion) {
+      if (preg_match('@^Test ID is ([0-9]*)\.$@', $assertion['message'], $matches)) {
+        return $matches[1];
+      }
+    }
+    return NULL;
+  }
+
+  /**
+   * Assert that an assertion with the specified values is displayed
+   * in the test results.
+   *
+   * @param string $message Assertion message.
+   * @param string $type Assertion type.
+   * @param string $status Assertion status.
+   * @param string $file File where the assertion originated.
+   * @param string $functuion Function where the assertion originated.
+   * @return Assertion result.
+   */
+  function assertAssertion($message, $type, $status, $file, $function) {
+    $message = trim(strip_tags($message));
+    $found = FALSE;
+    foreach ($this->childTestResults['assertions'] as $assertion) {
+      if ((strpos($assertion['message'], $message) !== FALSE) &&
+          $assertion['type'] == $type &&
+          $assertion['status'] == $status &&
+          $assertion['file'] == $file &&
+          $assertion['function'] == $function) {
+        $found = TRUE;
+        break;
+      }
+    }
+    return $this->assertTrue($found, format_string('Found assertion {"@message", "@type", "@status", "@file", "@function"}.', array('@message' => $message, '@type' => $type, '@status' => $status, "@file" => $file, "@function" => $function)));
+  }
+
+  /**
+   * Get the results from a test and store them in the class array $results.
+   */
+  function getTestResults() {
+    $results = array();
+    if ($this->parse()) {
+      if ($fieldset = $this->getResultFieldSet()) {
+        // Code assumes this is the only test in group.
+        $results['summary'] = $this->asText($fieldset->div->div[1]);
+        $results['name'] = $this->asText($fieldset->legend);
+
+        $results['assertions'] = array();
+        $tbody = $fieldset->div->table->tbody;
+        foreach ($tbody->tr as $row) {
+          $assertion = array();
+          $assertion['message'] = $this->asText($row->td[0]);
+          $assertion['type'] = $this->asText($row->td[1]);
+          $assertion['file'] = $this->asText($row->td[2]);
+          $assertion['line'] = $this->asText($row->td[3]);
+          $assertion['function'] = $this->asText($row->td[4]);
+          $ok_url = file_create_url('misc/watchdog-ok.png');
+          $assertion['status'] = ($row->td[5]->img['src'] == $ok_url) ? 'Pass' : 'Fail';
+          $results['assertions'][] = $assertion;
+        }
+      }
+    }
+    $this->childTestResults = $results;
+  }
+
+  /**
+   * Get the fieldset containing the results for group this test is in.
+   */
+  function getResultFieldSet() {
+    $fieldsets = $this->xpath('//fieldset');
+    $info = $this->getInfo();
+    foreach ($fieldsets as $fieldset) {
+      if ($this->asText($fieldset->legend) == $info['name']) {
+        return $fieldset;
+      }
+    }
+    return FALSE;
+  }
+
+  /**
+   * Extract the text contained by the element.
+   *
+   * @param $element
+   *   Element to extract text from.
+   * @return
+   *   Extracted text.
+   */
+  function asText(SimpleXMLElement $element) {
+    if (!is_object($element)) {
+      return $this->fail('The element is not an element.');
+    }
+    return trim(html_entity_decode(strip_tags($element->asXML())));
+  }
+
+  /**
+   * Check if the test is being run from inside a CURL request.
+   */
+  function inCURL() {
+    return (bool) drupal_valid_test_ua();
+  }
+}
+
+/**
+ * Test internal testing framework browser.
+ */
+class SimpleTestBrowserTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'SimpleTest browser',
+      'description' => 'Test the internal browser of the testing framework.',
+      'group' => 'SimpleTest',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    variable_set('user_register', USER_REGISTER_VISITORS);
+  }
+
+  /**
+   * Test DrupalWebTestCase::getAbsoluteUrl().
+   */
+  function testGetAbsoluteUrl() {
+    // Testbed runs with Clean URLs disabled, so disable it here.
+    variable_set('clean_url', 0);
+    $url = 'user/login';
+
+    $this->drupalGet($url);
+    $absolute = url($url, array('absolute' => TRUE));
+    $this->assertEqual($absolute, $this->url, 'Passed and requested URL are equal.');
+    $this->assertEqual($this->url, $this->getAbsoluteUrl($this->url), 'Requested and returned absolute URL are equal.');
+
+    $this->drupalPost(NULL, array(), t('Log in'));
+    $this->assertEqual($absolute, $this->url, 'Passed and requested URL are equal.');
+    $this->assertEqual($this->url, $this->getAbsoluteUrl($this->url), 'Requested and returned absolute URL are equal.');
+
+    $this->clickLink('Create new account');
+    $url = 'user/register';
+    $absolute = url($url, array('absolute' => TRUE));
+    $this->assertEqual($absolute, $this->url, 'Passed and requested URL are equal.');
+    $this->assertEqual($this->url, $this->getAbsoluteUrl($this->url), 'Requested and returned absolute URL are equal.');
+  }
+
+  /**
+   * Tests XPath escaping.
+   */
+  function testXPathEscaping() {
+    $testpage = <<< EOF
+<html>
+<body>
+<a href="link1">A "weird" link, just to bother the dumb "XPath 1.0"</a>
+<a href="link2">A second "even more weird" link, in memory of George O'Malley</a>
+</body>
+</html>
+EOF;
+    $this->drupalSetContent($testpage);
+
+    // Matches the first link.
+    $urls = $this->xpath('//a[text()=:text]', array(':text' => 'A "weird" link, just to bother the dumb "XPath 1.0"'));
+    $this->assertEqual($urls[0]['href'], 'link1', 'Match with quotes.');
+
+    $urls = $this->xpath('//a[text()=:text]', array(':text' => 'A second "even more weird" link, in memory of George O\'Malley'));
+    $this->assertEqual($urls[0]['href'], 'link2', 'Match with mixed single and double quotes.');
+  }
+}
+
+class SimpleTestMailCaptureTestCase extends DrupalWebTestCase {
+  /**
+   * Implement getInfo().
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'SimpleTest e-mail capturing',
+      'description' => 'Test the SimpleTest e-mail capturing logic, the assertMail assertion and the drupalGetMails function.',
+      'group' => 'SimpleTest',
+    );
+  }
+
+  /**
+   * Test to see if the wrapper function is executed correctly.
+   */
+  function testMailSend() {
+    // Create an e-mail.
+    $subject = $this->randomString(64);
+    $body = $this->randomString(128);
+    $message = array(
+      'id' => 'drupal_mail_test',
+      'headers' => array('Content-type'=> 'text/html'),
+      'subject' => $subject,
+      'to' => 'foobar@example.com',
+      'body' => $body,
+    );
+
+    // Before we send the e-mail, drupalGetMails should return an empty array.
+    $captured_emails = $this->drupalGetMails();
+    $this->assertEqual(count($captured_emails), 0, 'The captured e-mails queue is empty.', 'E-mail');
+
+    // Send the e-mail.
+    $response = drupal_mail_system('simpletest', 'drupal_mail_test')->mail($message);
+
+    // Ensure that there is one e-mail in the captured e-mails array.
+    $captured_emails = $this->drupalGetMails();
+    $this->assertEqual(count($captured_emails), 1, 'One e-mail was captured.', 'E-mail');
+
+    // Assert that the e-mail was sent by iterating over the message properties
+    // and ensuring that they are captured intact.
+    foreach ($message as $field => $value) {
+      $this->assertMail($field, $value, format_string('The e-mail was sent and the value for property @field is intact.', array('@field' => $field)), 'E-mail');
+    }
+
+    // Send additional e-mails so more than one e-mail is captured.
+    for ($index = 0; $index < 5; $index++) {
+      $message = array(
+        'id' => 'drupal_mail_test_' . $index,
+        'headers' => array('Content-type'=> 'text/html'),
+        'subject' => $this->randomString(64),
+        'to' => $this->randomName(32) . '@example.com',
+        'body' => $this->randomString(512),
+      );
+      drupal_mail_system('drupal_mail_test', $index)->mail($message);
+    }
+
+    // There should now be 6 e-mails captured.
+    $captured_emails = $this->drupalGetMails();
+    $this->assertEqual(count($captured_emails), 6, 'All e-mails were captured.', 'E-mail');
+
+    // Test different ways of getting filtered e-mails via drupalGetMails().
+    $captured_emails = $this->drupalGetMails(array('id' => 'drupal_mail_test'));
+    $this->assertEqual(count($captured_emails), 1, 'Only one e-mail is returned when filtering by id.', 'E-mail');
+    $captured_emails = $this->drupalGetMails(array('id' => 'drupal_mail_test', 'subject' => $subject));
+    $this->assertEqual(count($captured_emails), 1, 'Only one e-mail is returned when filtering by id and subject.', 'E-mail');
+    $captured_emails = $this->drupalGetMails(array('id' => 'drupal_mail_test', 'subject' => $subject, 'from' => 'this_was_not_used@example.com'));
+    $this->assertEqual(count($captured_emails), 0, 'No e-mails are returned when querying with an unused from address.', 'E-mail');
+
+    // Send the last e-mail again, so we can confirm that the drupalGetMails-filter
+    // correctly returns all e-mails with a given property/value.
+    drupal_mail_system('drupal_mail_test', $index)->mail($message);
+    $captured_emails = $this->drupalGetMails(array('id' => 'drupal_mail_test_4'));
+    $this->assertEqual(count($captured_emails), 2, 'All e-mails with the same id are returned when filtering by id.', 'E-mail');
+  }
+}
+
+/**
+ * Test Folder creation
+ */
+class SimpleTestFolderTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Testing SimpleTest setUp',
+      'description' => "This test will check SimpleTest's treatment of hook_install during setUp.  Image module is used for test.",
+      'group' => 'SimpleTest',
+    );
+  }
+
+  function setUp() {
+    return parent::setUp('image');
+  }
+
+  function testFolderSetup() {
+    $directory = file_default_scheme() . '://styles';
+    $this->assertTrue(file_prepare_directory($directory, FALSE), 'Directory created.');
+  }
+}
+
+/**
+ * Test required modules for tests.
+ */
+class SimpleTestMissingDependentModuleUnitTest extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Testing dependent module test',
+      'description' => 'This test should not load since it requires a module that is not found.',
+      'group' => 'SimpleTest',
+      'dependencies' => array('simpletest_missing_module'),
+    );
+  }
+
+  /**
+   * Ensure that this test will not be loaded despite its dependency.
+   */
+  function testFail() {
+    $this->fail(t('Running test with missing required module.'));
+  }
+}
+
+/**
+ * Tests a test case that does not run parent::setUp() in its setUp() method.
+ *
+ * If a test case does not call parent::setUp(), running
+ * DrupalTestCase::tearDown() would destroy the main site's database tables.
+ * Therefore, we ensure that tests which are not set up properly are skipped.
+ *
+ * @see DrupalTestCase
+ */
+class SimpleTestBrokenSetUp extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Broken SimpleTest method',
+      'description' => 'Tests a test case that does not call parent::setUp().',
+      'group' => 'SimpleTest'
+    );
+  }
+
+  function setUp() {
+    // If the test is being run from the main site, set up normally.
+    if (!drupal_valid_test_ua()) {
+      parent::setUp('simpletest');
+      // Create and log in user.
+      $admin_user = $this->drupalCreateUser(array('administer unit tests'));
+      $this->drupalLogin($admin_user);
+    }
+    // If the test is being run from within simpletest, set up the broken test.
+    else {
+      $this->pass(t('The test setUp() method has been run.'));
+      // Don't call parent::setUp(). This should trigger an error message.
+    }
+  }
+
+  function tearDown() {
+    // If the test is being run from the main site, tear down normally.
+    if (!drupal_valid_test_ua()) {
+      parent::tearDown();
+    }
+    else {
+      // If the test is being run from within simpletest, output a message.
+      $this->pass(t('The tearDown() method has run.'));
+    }
+  }
+
+  /**
+   * Runs this test case from within the simpletest child site.
+   */
+  function testBreakSetUp() {
+    // If the test is being run from the main site, run it again from the web
+    // interface within the simpletest child site.
+    if (!drupal_valid_test_ua()) {
+      $edit['SimpleTestBrokenSetUp'] = TRUE;
+      $this->drupalPost('admin/config/development/testing', $edit, t('Run tests'));
+
+      // Verify that the broken test and its tearDown() method are skipped.
+      $this->assertRaw(t('The test setUp() method has been run.'));
+      $this->assertRaw(t('The test cannot be executed because it has not been set up properly.'));
+      $this->assertNoRaw(t('The test method has run.'));
+      $this->assertNoRaw(t('The tearDown() method has run.'));
+    }
+    // If the test is being run from within simpletest, output a message.
+    else {
+      $this->pass(t('The test method has run.'));
+    }
+  }
+}
+
+/**
+ * Verifies that tests bundled with installation profile modules are found.
+ */
+class SimpleTestInstallationProfileModuleTestsTestCase extends DrupalWebTestCase {
+  /**
+   * Use the Testing profile.
+   *
+   * The Testing profile contains drupal_system_listing_compatible_test.test,
+   * which attempts to:
+   * - run tests using the Minimal profile (which does not contain the
+   *   drupal_system_listing_compatible_test.module)
+   * - but still install the drupal_system_listing_compatible_test.module
+   *   contained in the Testing profile.
+   *
+   * @see DrupalSystemListingCompatibleTestCase
+   */
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Installation profile module tests',
+      'description' => 'Verifies that tests bundled with installation profile modules are found.',
+      'group' => 'SimpleTest',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('simpletest'));
+
+    $this->admin_user = $this->drupalCreateUser(array('administer unit tests'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Tests existence of test case located in an installation profile module.
+   */
+  function testInstallationProfileTests() {
+    $this->drupalGet('admin/config/development/testing');
+    $this->assertText('Installation profile module tests helper');
+    $edit = array(
+      'DrupalSystemListingCompatibleTestCase' => TRUE,
+    );
+    $this->drupalPost(NULL, $edit, t('Run tests'));
+    $this->assertText('DrupalSystemListingCompatibleTestCase test executed.');
+  }
+}
+
+/**
+ * Verifies that tests in other installation profiles are not found.
+ *
+ * @see SimpleTestInstallationProfileModuleTestsTestCase
+ */
+class SimpleTestOtherInstallationProfileModuleTestsTestCase extends DrupalWebTestCase {
+  /**
+   * Use the Minimal profile.
+   *
+   * The Testing profile contains drupal_system_listing_compatible_test.test,
+   * which should not be found.
+   *
+   * @see SimpleTestInstallationProfileModuleTestsTestCase
+   * @see DrupalSystemListingCompatibleTestCase
+   */
+  protected $profile = 'minimal';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Other Installation profiles',
+      'description' => 'Verifies that tests in other installation profiles are not found.',
+      'group' => 'SimpleTest',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('simpletest'));
+
+    $this->admin_user = $this->drupalCreateUser(array('administer unit tests'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Tests that tests located in another installation profile do not appear.
+   */
+  function testOtherInstallationProfile() {
+    $this->drupalGet('admin/config/development/testing');
+    $this->assertNoText('Installation profile module tests helper');
+  }
+}
+
+/**
+ * Verifies that tests in other installation profiles are not found.
+ *
+ * @see SimpleTestInstallationProfileModuleTestsTestCase
+ */
+class SimpleTestDiscoveryTestCase extends DrupalWebTestCase {
+  /**
+   * Use the Testing profile.
+   *
+   * The Testing profile contains drupal_system_listing_compatible_test.test,
+   * which attempts to:
+   * - run tests using the Minimal profile (which does not contain the
+   *   drupal_system_listing_compatible_test.module)
+   * - but still install the drupal_system_listing_compatible_test.module
+   *   contained in the Testing profile.
+   *
+   * @see DrupalSystemListingCompatibleTestCase
+   */
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Discovery of test classes',
+      'description' => 'Verifies that tests classes are discovered and can be autoloaded (class_exists).',
+      'group' => 'SimpleTest',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('simpletest'));
+
+    $this->admin_user = $this->drupalCreateUser(array('administer unit tests'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Test discovery of PSR-0 test classes.
+   */
+  function testDiscoveryFunctions() {
+    if (version_compare(PHP_VERSION, '5.3') < 0) {
+      // Don't expect PSR-0 tests to be discovered on older PHP versions.
+      return;
+    }
+    // TODO: What if we have cached values? Do we need to force a cache refresh?
+    $classes_all = simpletest_test_get_all();
+    foreach (array(
+      'Drupal\\simpletest\\Tests\\PSR0WebTest',
+      'Drupal\\psr_0_test\\Tests\\ExampleTest',
+    ) as $class) {
+      $this->assert(!empty($classes_all['SimpleTest'][$class]), t('Class @class must be discovered by simpletest_test_get_all().', array('@class' => $class)));
+    }
+  }
+
+  /**
+   * Tests existence of test cases.
+   */
+  function testDiscovery() {
+    $this->drupalGet('admin/config/development/testing');
+    // Tests within enabled modules.
+    // (without these, this test wouldn't happen in the first place, so this is
+    // a bit pointless. We still run it for proof-of-concept.)
+    // This one is defined in system module.
+    $this->assertText('Drupal error handlers');
+    // This one is defined in simpletest module.
+    $this->assertText('Discovery of test classes');
+    // Tests within disabled modules.
+    if (version_compare(PHP_VERSION, '5.3') < 0) {
+      // Don't expect PSR-0 tests to be discovered on older PHP versions.
+      return;
+    }
+    // This one is provided by simpletest itself via PSR-0.
+    $this->assertText('PSR0 web test');
+    $this->assertText('PSR0 example test: PSR-0 in disabled modules.');
+    $this->assertText('PSR0 example test: PSR-0 in nested subfolders.');
+
+    // Test each test individually.
+    foreach (array(
+      'Drupal\\psr_0_test\\Tests\\ExampleTest',
+      'Drupal\\psr_0_test\\Tests\\Nested\\NestedExampleTest',
+    ) as $class) {
+      $this->drupalGet('admin/config/development/testing');
+      $edit = array($class => TRUE);
+      $this->drupalPost(NULL, $edit, t('Run tests'));
+      $this->assertText('The test run finished', t('Test @class must finish.', array('@class' => $class)));
+      $this->assertText('1 pass, 0 fails, and 0 exceptions', t('Test @class must pass.', array('@class' => $class)));
+    }
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/actions.test b/htmltest/modules/simpletest/tests/actions.test
new file mode 100644
index 00000000..4d58b59c
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/actions.test
@@ -0,0 +1,126 @@
+<?php
+
+class ActionsConfigurationTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Actions configuration',
+      'description' => 'Tests complex actions configuration by adding, editing, and deleting a complex action.',
+      'group' => 'Actions',
+    );
+  }
+
+  /**
+   * Test the configuration of advanced actions through the administration
+   * interface.
+   */
+  function testActionConfiguration() {
+    // Create a user with permission to view the actions administration pages.
+    $user = $this->drupalCreateUser(array('administer actions'));
+    $this->drupalLogin($user);
+
+    // Make a POST request to admin/config/system/actions/manage.
+    $edit = array();
+    $edit['action'] = drupal_hash_base64('system_goto_action');
+    $this->drupalPost('admin/config/system/actions/manage', $edit, t('Create'));
+
+    // Make a POST request to the individual action configuration page.
+    $edit = array();
+    $action_label = $this->randomName();
+    $edit['actions_label'] = $action_label;
+    $edit['url'] = 'admin';
+    $this->drupalPost('admin/config/system/actions/configure/' . drupal_hash_base64('system_goto_action'), $edit, t('Save'));
+
+    // Make sure that the new complex action was saved properly.
+    $this->assertText(t('The action has been successfully saved.'), t("Make sure we get a confirmation that we've successfully saved the complex action."));
+    $this->assertText($action_label, t("Make sure the action label appears on the configuration page after we've saved the complex action."));
+
+    // Make another POST request to the action edit page.
+    $this->clickLink(t('configure'));
+    preg_match('|admin/config/system/actions/configure/(\d+)|', $this->getUrl(), $matches);
+    $aid = $matches[1];
+    $edit = array();
+    $new_action_label = $this->randomName();
+    $edit['actions_label'] = $new_action_label;
+    $edit['url'] = 'admin';
+    $this->drupalPost(NULL, $edit, t('Save'));
+
+    // Make sure that the action updated properly.
+    $this->assertText(t('The action has been successfully saved.'), t("Make sure we get a confirmation that we've successfully updated the complex action."));
+    $this->assertNoText($action_label, t("Make sure the old action label does NOT appear on the configuration page after we've updated the complex action."));
+    $this->assertText($new_action_label, t("Make sure the action label appears on the configuration page after we've updated the complex action."));
+
+    // Make sure that deletions work properly.
+    $this->clickLink(t('delete'));
+    $edit = array();
+    $this->drupalPost("admin/config/system/actions/delete/$aid", $edit, t('Delete'));
+
+    // Make sure that the action was actually deleted.
+    $this->assertRaw(t('Action %action was deleted', array('%action' => $new_action_label)), t('Make sure that we get a delete confirmation message.'));
+    $this->drupalGet('admin/config/system/actions/manage');
+    $this->assertNoText($new_action_label, t("Make sure the action label does not appear on the overview page after we've deleted the action."));
+    $exists = db_query('SELECT aid FROM {actions} WHERE callback = :callback', array(':callback' => 'drupal_goto_action'))->fetchField();
+    $this->assertFalse($exists, t('Make sure the action is gone from the database after being deleted.'));
+  }
+}
+
+/**
+ * Test actions executing in a potential loop, and make sure they abort properly.
+ */
+class ActionLoopTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Actions executing in a potentially infinite loop',
+      'description' => 'Tests actions executing in a loop, and makes sure they abort properly.',
+      'group' => 'Actions',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('dblog', 'trigger', 'actions_loop_test');
+  }
+
+  /**
+   * Set up a loop with 3 - 12 recursions, and see if it aborts properly.
+   */
+  function testActionLoop() {
+    $user = $this->drupalCreateUser(array('administer actions'));
+    $this->drupalLogin($user);
+
+    $hash = drupal_hash_base64('actions_loop_test_log');
+    $edit = array('aid' => $hash);
+    $this->drupalPost('admin/structure/trigger/actions_loop_test', $edit, t('Assign'));
+
+    // Delete any existing watchdog messages to clear the plethora of
+    // "Action added" messages from when Drupal was installed.
+    db_delete('watchdog')->execute();
+    // To prevent this test from failing when xdebug is enabled, the maximum
+    // recursion level should be kept low enough to prevent the xdebug
+    // infinite recursion protection mechanism from aborting the request.
+    // See http://drupal.org/node/587634.
+    variable_set('actions_max_stack', 7);
+    $this->triggerActions();
+  }
+
+  /**
+   * Create an infinite loop by causing a watchdog message to be set,
+   * which causes the actions to be triggered again, up to actions_max_stack
+   * times.
+   */
+  protected function triggerActions() {
+    $this->drupalGet('<front>', array('query' => array('trigger_actions_on_watchdog' => TRUE)));
+    $expected = array();
+    $expected[] = 'Triggering action loop';
+    for ($i = 1; $i <= variable_get('actions_max_stack', 35); $i++) {
+      $expected[] = "Test log #$i";
+    }
+    $expected[] = 'Stack overflow: too many calls to actions_do(). Aborting to prevent infinite recursion.';
+
+    $result = db_query("SELECT message FROM {watchdog} WHERE type = 'actions_loop_test' OR type = 'actions' ORDER BY wid");
+    $loop_started = FALSE;
+    foreach ($result as $row) {
+      $expected_message = array_shift($expected);
+      $this->assertEqual($row->message, $expected_message, t('Expected message %expected, got %message.', array('%expected' => $expected_message, '%message' => $row->message)));
+    }
+    $this->assertTrue(empty($expected), t('All expected messages found.'));
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/actions_loop_test.info b/htmltest/modules/simpletest/tests/actions_loop_test.info
new file mode 100644
index 00000000..44838491
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/actions_loop_test.info
@@ -0,0 +1,12 @@
+name = Actions loop test
+description = Support module for action loop testing.
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/actions_loop_test.install b/htmltest/modules/simpletest/tests/actions_loop_test.install
new file mode 100644
index 00000000..b22fd85a
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/actions_loop_test.install
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * Implements hook_install().
+ */
+function actions_loop_test_install() {
+   db_update('system')
+    ->fields(array('weight' => 1))
+    ->condition('name', 'actions_loop_test')
+    ->execute();
+}
diff --git a/htmltest/modules/simpletest/tests/actions_loop_test.module b/htmltest/modules/simpletest/tests/actions_loop_test.module
new file mode 100644
index 00000000..261cb800
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/actions_loop_test.module
@@ -0,0 +1,95 @@
+<?php
+
+/**
+ * Implements hook_trigger_info().
+ */
+function actions_loop_test_trigger_info() {
+  return array(
+    'actions_loop_test' => array(
+      'watchdog' => array(
+        'label' => t('When a message is logged'),
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_watchdog().
+ */
+function actions_loop_test_watchdog(array $log_entry) {
+  // If the triggering actions are not explicitly enabled, abort.
+  if (empty($_GET['trigger_actions_on_watchdog'])) {
+    return;
+  }
+  // Get all the action ids assigned to the trigger on the watchdog hook's
+  // "run" event.
+  $aids = trigger_get_assigned_actions('watchdog');
+  // We can pass in any applicable information in $context. There isn't much in
+  // this case, but we'll pass in the hook name as the bare minimum.
+  $context = array(
+    'hook' => 'watchdog',
+  );
+  // Fire the actions on the associated object ($log_entry) and the context
+  // variable.
+  actions_do(array_keys($aids), $log_entry, $context);
+}
+
+/**
+ * Implements hook_init().
+ */
+function actions_loop_test_init() {
+  if (!empty($_GET['trigger_actions_on_watchdog'])) {
+    watchdog_skip_semaphore('actions_loop_test', 'Triggering action loop');
+  }
+}
+
+/**
+ * Implements hook_action_info().
+ */
+function actions_loop_test_action_info() {
+  return array(
+    'actions_loop_test_log' => array(
+      'label' => t('Write a message to the log.'),
+      'type' => 'system',
+      'configurable' => FALSE,
+      'triggers' => array('any'),
+    ),
+  );
+}
+
+/**
+ * Write a message to the log.
+ */
+function actions_loop_test_log() {
+  $count = &drupal_static(__FUNCTION__, 0);
+  $count++;
+  watchdog_skip_semaphore('actions_loop_test', "Test log #$count");
+}
+
+/**
+ * Replacement of the watchdog() function that eliminates the use of semaphores
+ * so that we can test the abortion of an action loop.
+ */
+function watchdog_skip_semaphore($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL) {
+  global $user, $base_root;
+
+  // Prepare the fields to be logged
+  $log_entry = array(
+    'type'        => $type,
+    'message'     => $message,
+    'variables'   => $variables,
+    'severity'    => $severity,
+    'link'        => $link,
+    'user'        => $user,
+    'uid'         => isset($user->uid) ? $user->uid : 0,
+    'request_uri' => $base_root . request_uri(),
+    'referer'     => $_SERVER['HTTP_REFERER'],
+    'ip'          => ip_address(),
+    'timestamp'   => REQUEST_TIME,
+  );
+
+  // Call the logging hooks to log/process the message
+  foreach (module_implements('watchdog') as $module) {
+    module_invoke($module, 'watchdog', $log_entry);
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/ajax.test b/htmltest/modules/simpletest/tests/ajax.test
new file mode 100644
index 00000000..664d5204
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/ajax.test
@@ -0,0 +1,530 @@
+<?php
+
+class AJAXTestCase extends DrupalWebTestCase {
+  function setUp() {
+    $modules = func_get_args();
+    if (isset($modules[0]) && is_array($modules[0])) {
+      $modules = $modules[0];
+    }
+    parent::setUp(array_unique(array_merge(array('ajax_test', 'ajax_forms_test'), $modules)));
+  }
+
+  /**
+   * Assert that a command with the required properties exists within the array of Ajax commands returned by the server.
+   *
+   * The Ajax framework, via the ajax_deliver() and ajax_render() functions,
+   * returns an array of commands. This array sometimes includes commands
+   * automatically provided by the framework in addition to commands returned by
+   * a particular page callback. During testing, we're usually interested that a
+   * particular command is present, and don't care whether other commands
+   * precede or follow the one we're interested in. Additionally, the command
+   * we're interested in may include additional data that we're not interested
+   * in. Therefore, this function simply asserts that one of the commands in
+   * $haystack contains all of the keys and values in $needle. Furthermore, if
+   * $needle contains a 'settings' key with an array value, we simply assert
+   * that all keys and values within that array are present in the command we're
+   * checking, and do not consider it a failure if the actual command contains
+   * additional settings that aren't part of $needle.
+   *
+   * @param $haystack
+   *   An array of Ajax commands returned by the server.
+   * @param $needle
+   *   Array of info we're expecting in one of those commands.
+   * @param $message
+   *   An assertion message.
+   */
+  protected function assertCommand($haystack, $needle, $message) {
+    $found = FALSE;
+    foreach ($haystack as $command) {
+      // If the command has additional settings that we're not testing for, do
+      // not consider that a failure.
+      if (isset($command['settings']) && is_array($command['settings']) && isset($needle['settings']) && is_array($needle['settings'])) {
+        $command['settings'] = array_intersect_key($command['settings'], $needle['settings']);
+      }
+      // If the command has additional data that we're not testing for, do not
+      // consider that a failure. Also, == instead of ===, because we don't
+      // require the key/value pairs to be in any particular order
+      // (http://www.php.net/manual/en/language.operators.array.php).
+      if (array_intersect_key($command, $needle) == $needle) {
+        $found = TRUE;
+        break;
+      }
+    }
+    $this->assertTrue($found, $message);
+  }
+}
+
+/**
+ * Tests primary Ajax framework functions.
+ */
+class AJAXFrameworkTestCase extends AJAXTestCase {
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'AJAX framework',
+      'description' => 'Performs tests on AJAX framework functions.',
+      'group' => 'AJAX',
+    );
+  }
+
+  /**
+   * Test that ajax_render() returns JavaScript settings generated during the page request.
+   *
+   * @todo Add tests to ensure that ajax_render() returns commands for new CSS
+   *   and JavaScript files to be loaded by the page. See
+   *   http://drupal.org/node/561858.
+   */
+  function testAJAXRender() {
+    $commands = $this->drupalGetAJAX('ajax-test/render');
+
+    // Verify that there is a command to load settings added with
+    // drupal_add_js().
+    $expected = array(
+      'command' => 'settings',
+      'settings' => array('basePath' => base_path(), 'ajax' => 'test'),
+    );
+    $this->assertCommand($commands, $expected, t('ajax_render() loads settings added with drupal_add_js().'));
+
+    // Verify that Ajax settings are loaded for #type 'link'.
+    $this->drupalGet('ajax-test/link');
+    $settings = $this->drupalGetSettings();
+    $this->assertEqual($settings['ajax']['ajax-link']['url'], url('filter/tips'));
+    $this->assertEqual($settings['ajax']['ajax-link']['wrapper'], 'block-system-main');
+  }
+
+  /**
+   * Test behavior of ajax_render_error().
+   */
+  function testAJAXRenderError() {
+    // Verify default error message.
+    $commands = $this->drupalGetAJAX('ajax-test/render-error');
+    $expected = array(
+      'command' => 'alert',
+      'text' => t('An error occurred while handling the request: The server received invalid input.'),
+    );
+    $this->assertCommand($commands, $expected, t('ajax_render_error() invokes alert command.'));
+
+    // Verify custom error message.
+    $edit = array(
+      'message' => 'Custom error message.',
+    );
+    $commands = $this->drupalGetAJAX('ajax-test/render-error', array('query' => $edit));
+    $expected = array(
+      'command' => 'alert',
+      'text' => $edit['message'],
+    );
+     $this->assertCommand($commands, $expected, t('Custom error message is output.'));
+  }
+
+  /**
+   * Test that new JavaScript and CSS files added during an AJAX request are returned.
+   */
+  function testLazyLoad() {
+    $expected = array(
+      'setting_name' => 'ajax_forms_test_lazy_load_form_submit',
+      'setting_value' => 'executed',
+      'css' => drupal_get_path('module', 'system') . '/system.admin.css',
+      'js' => drupal_get_path('module', 'system') . '/system.js',
+    );
+    // @todo D8: Add a drupal_css_defaults() helper function.
+    $expected_css_html = drupal_get_css(array($expected['css'] => array(
+      'type' => 'file',
+      'group' => CSS_DEFAULT,
+      'weight' => 0,
+      'every_page' => FALSE,
+      'media' => 'all',
+      'preprocess' => TRUE,
+      'data' => $expected['css'],
+      'browsers' => array('IE' => TRUE, '!IE' => TRUE),
+    )), TRUE);
+    $expected_js_html = drupal_get_js('header', array($expected['js'] => drupal_js_defaults($expected['js'])), TRUE);
+
+    // Get the base page.
+    $this->drupalGet('ajax_forms_test_lazy_load_form');
+    $original_settings = $this->drupalGetSettings();
+    $original_css = $original_settings['ajaxPageState']['css'];
+    $original_js = $original_settings['ajaxPageState']['js'];
+
+    // Verify that the base page doesn't have the settings and files that are to
+    // be lazy loaded as part of the next requests.
+    $this->assertTrue(!isset($original_settings[$expected['setting_name']]), t('Page originally lacks the %setting, as expected.', array('%setting' => $expected['setting_name'])));
+    $this->assertTrue(!isset($original_settings[$expected['css']]), t('Page originally lacks the %css file, as expected.', array('%css' => $expected['css'])));
+    $this->assertTrue(!isset($original_settings[$expected['js']]), t('Page originally lacks the %js file, as expected.', array('%js' => $expected['js'])));
+
+    // Submit the AJAX request without triggering files getting added.
+    $commands = $this->drupalPostAJAX(NULL, array('add_files' => FALSE), array('op' => t('Submit')));
+    $new_settings = $this->drupalGetSettings();
+
+    // Verify the setting was not added when not expected.
+    $this->assertTrue(!isset($new_settings['setting_name']), t('Page still lacks the %setting, as expected.', array('%setting' => $expected['setting_name'])));
+    // Verify a settings command does not add CSS or scripts to Drupal.settings
+    // and no command inserts the corresponding tags on the page.
+    $found_settings_command = FALSE;
+    $found_markup_command = FALSE;
+    foreach ($commands as $command) {
+      if ($command['command'] == 'settings' && (array_key_exists('css', $command['settings']['ajaxPageState']) || array_key_exists('js', $command['settings']['ajaxPageState']))) {
+        $found_settings_command = TRUE;
+      }
+      if (isset($command['data']) && ($command['data'] == $expected_js_html || $command['data'] == $expected_css_html)) {
+        $found_markup_command = TRUE;
+      }
+    }
+    $this->assertFalse($found_settings_command, t('Page state still lacks the %css and %js files, as expected.', array('%css' => $expected['css'], '%js' => $expected['js'])));
+    $this->assertFalse($found_markup_command, t('Page still lacks the %css and %js files, as expected.', array('%css' => $expected['css'], '%js' => $expected['js'])));
+
+    // Submit the AJAX request and trigger adding files.
+    $commands = $this->drupalPostAJAX(NULL, array('add_files' => TRUE), array('op' => t('Submit')));
+    $new_settings = $this->drupalGetSettings();
+    $new_css = $new_settings['ajaxPageState']['css'];
+    $new_js = $new_settings['ajaxPageState']['js'];
+
+    // Verify the expected setting was added.
+    $this->assertIdentical($new_settings[$expected['setting_name']], $expected['setting_value'], t('Page now has the %setting.', array('%setting' => $expected['setting_name'])));
+
+    // Verify the expected CSS file was added, both to Drupal.settings, and as
+    // an AJAX command for inclusion into the HTML.
+    $this->assertEqual($new_css, $original_css + array($expected['css'] => 1), t('Page state now has the %css file.', array('%css' => $expected['css'])));
+    $this->assertCommand($commands, array('data' => $expected_css_html), t('Page now has the %css file.', array('%css' => $expected['css'])));
+
+    // Verify the expected JS file was added, both to Drupal.settings, and as
+    // an AJAX command for inclusion into the HTML. By testing for an exact HTML
+    // string containing the SCRIPT tag, we also ensure that unexpected
+    // JavaScript code, such as a jQuery.extend() that would potentially clobber
+    // rather than properly merge settings, didn't accidentally get added.
+    $this->assertEqual($new_js, $original_js + array($expected['js'] => 1), t('Page state now has the %js file.', array('%js' => $expected['js'])));
+    $this->assertCommand($commands, array('data' => $expected_js_html), t('Page now has the %js file.', array('%js' => $expected['js'])));
+  }
+
+  /**
+   * Tests that overridden CSS files are not added during lazy load.
+   */
+  function testLazyLoadOverriddenCSS() {
+    // The test theme overrides system.base.css without an implementation,
+    // thereby removing it.
+    theme_enable(array('test_theme'));
+    variable_set('theme_default', 'test_theme');
+
+    // This gets the form, and emulates an Ajax submission on it, including
+    // adding markup to the HEAD and BODY for any lazy loaded JS/CSS files.
+    $this->drupalPostAJAX('ajax_forms_test_lazy_load_form', array('add_files' => TRUE), array('op' => t('Submit')));
+
+    // Verify that the resulting HTML does not load the overridden CSS file.
+    // We add a "?" to the assertion, because Drupal.settings may include
+    // information about the file; we only really care about whether it appears
+    // in a LINK or STYLE tag, for which Drupal always adds a query string for
+    // cache control.
+    $this->assertNoText('system.base.css?', 'Ajax lazy loading does not add overridden CSS files.');
+  }
+}
+
+/**
+ * Tests Ajax framework commands.
+ */
+class AJAXCommandsTestCase extends AJAXTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'AJAX commands',
+      'description' => 'Performs tests on AJAX framework commands.',
+      'group' => 'AJAX',
+    );
+  }
+
+  /**
+   * Test the various Ajax Commands.
+   */
+  function testAJAXCommands() {
+    $form_path = 'ajax_forms_test_ajax_commands_form';
+    $web_user = $this->drupalCreateUser(array('access content'));
+    $this->drupalLogin($web_user);
+
+    $edit = array();
+
+    // Tests the 'after' command.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX 'After': Click to put something after the div")));
+    $expected = array(
+      'command' => 'insert',
+      'method' => 'after',
+      'data' => 'This will be placed after',
+    );
+    $this->assertCommand($commands, $expected, "'after' AJAX command issued with correct data");
+
+    // Tests the 'alert' command.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX 'Alert': Click to alert")));
+    $expected = array(
+      'command' => 'alert',
+      'text' => 'Alert',
+    );
+    $this->assertCommand($commands, $expected, "'alert' AJAX Command issued with correct text");
+
+    // Tests the 'append' command.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX 'Append': Click to append something")));
+    $expected = array(
+      'command' => 'insert',
+      'method' => 'append',
+      'data' => 'Appended text',
+    );
+    $this->assertCommand($commands, $expected, "'append' AJAX command issued with correct data");
+
+    // Tests the 'before' command.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX 'before': Click to put something before the div")));
+    $expected = array(
+      'command' => 'insert',
+      'method' => 'before',
+      'data' => 'Before text',
+    );
+    $this->assertCommand($commands, $expected, "'before' AJAX command issued with correct data");
+
+    // Tests the 'changed' command.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX changed: Click to mark div changed.")));
+    $expected = array(
+      'command' => 'changed',
+      'selector' => '#changed_div',
+    );
+    $this->assertCommand($commands, $expected, "'changed' AJAX command issued with correct selector");
+
+    // Tests the 'changed' command using the second argument.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX changed: Click to mark div changed with asterisk.")));
+    $expected = array(
+      'command' => 'changed',
+      'selector' => '#changed_div',
+      'asterisk' => '#changed_div_mark_this',
+    );
+    $this->assertCommand($commands, $expected, "'changed' AJAX command (with asterisk) issued with correct selector");
+
+    // Tests the 'css' command.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("Set the the '#box' div to be blue.")));
+    $expected = array(
+      'command' => 'css',
+      'selector' => '#css_div',
+      'argument' => array('background-color' => 'blue'),
+    );
+    $this->assertCommand($commands, $expected, "'css' AJAX command issued with correct selector");
+
+    // Tests the 'data' command.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX data command: Issue command.")));
+    $expected = array(
+      'command' => 'data',
+      'name' => 'testkey',
+      'value' => 'testvalue',
+    );
+    $this->assertCommand($commands, $expected, "'data' AJAX command issued with correct key and value");
+
+    // Tests the 'invoke' command.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX invoke command: Invoke addClass() method.")));
+    $expected = array(
+      'command' => 'invoke',
+      'method' => 'addClass',
+      'arguments' => array('error'),
+    );
+    $this->assertCommand($commands, $expected, "'invoke' AJAX command issued with correct method and argument");
+
+    // Tests the 'html' command.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX html: Replace the HTML in a selector.")));
+    $expected = array(
+      'command' => 'insert',
+      'method' => 'html',
+      'data' => 'replacement text',
+    );
+    $this->assertCommand($commands, $expected, "'html' AJAX command issued with correct data");
+
+    // Tests the 'insert' command.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX insert: Let client insert based on #ajax['method'].")));
+    $expected = array(
+      'command' => 'insert',
+      'data' => 'insert replacement text',
+    );
+    $this->assertCommand($commands, $expected, "'insert' AJAX command issued with correct data");
+
+    // Tests the 'prepend' command.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX 'prepend': Click to prepend something")));
+    $expected = array(
+      'command' => 'insert',
+      'method' => 'prepend',
+      'data' => 'prepended text',
+    );
+    $this->assertCommand($commands, $expected, "'prepend' AJAX command issued with correct data");
+
+    // Tests the 'remove' command.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX 'remove': Click to remove text")));
+    $expected = array(
+      'command' => 'remove',
+      'selector' => '#remove_text',
+    );
+    $this->assertCommand($commands, $expected, "'remove' AJAX command issued with correct command and selector");
+
+    // Tests the 'restripe' command.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX 'restripe' command")));
+    $expected = array(
+      'command' => 'restripe',
+      'selector' => '#restripe_table',
+    );
+    $this->assertCommand($commands, $expected, "'restripe' AJAX command issued with correct selector");
+
+    // Tests the 'settings' command.
+    $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX 'settings' command")));
+    $expected = array(
+      'command' => 'settings',
+      'settings' => array('ajax_forms_test' => array('foo' => 42)),
+    );
+    $this->assertCommand($commands, $expected, "'settings' AJAX command issued with correct data");
+  }
+}
+
+/**
+ * Test that $form_state['values'] is properly delivered to $ajax['callback'].
+ */
+class AJAXFormValuesTestCase extends AJAXTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'AJAX command form values',
+      'description' => 'Tests that form values are properly delivered to AJAX callbacks.',
+      'group' => 'AJAX',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    $this->web_user = $this->drupalCreateUser(array('access content'));
+    $this->drupalLogin($this->web_user);
+  }
+
+  /**
+   * Create a simple form, then POST to system/ajax to change to it.
+   */
+  function testSimpleAJAXFormValue() {
+    // Verify form values of a select element.
+    foreach (array('red', 'green', 'blue') as $item) {
+      $edit = array(
+        'select' => $item,
+      );
+      $commands = $this->drupalPostAJAX('ajax_forms_test_get_form', $edit, 'select');
+      $expected = array(
+        'command' => 'data',
+        'value' => $item,
+      );
+      $this->assertCommand($commands, $expected, "verification of AJAX form values from a selectbox issued with a correct value");
+    }
+
+    // Verify form values of a checkbox element.
+    foreach (array(FALSE, TRUE) as $item) {
+      $edit = array(
+        'checkbox' => $item,
+      );
+      $commands = $this->drupalPostAJAX('ajax_forms_test_get_form', $edit, 'checkbox');
+      $expected = array(
+        'command' => 'data',
+        'value' => (int) $item,
+      );
+      $this->assertCommand($commands, $expected, "verification of AJAX form values from a checkbox issued with a correct value");
+    }
+  }
+}
+
+/**
+ * Tests that Ajax-enabled forms work when multiple instances of the same form are on a page.
+ */
+class AJAXMultiFormTestCase extends AJAXTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'AJAX multi form',
+      'description' => 'Tests that AJAX-enabled forms work when multiple instances of the same form are on a page.',
+      'group' => 'AJAX',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('form_test'));
+
+    // Create a multi-valued field for 'page' nodes to use for Ajax testing.
+    $field_name = 'field_ajax_test';
+    $field = array(
+      'field_name' => $field_name,
+      'type' => 'text',
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+    );
+    field_create_field($field);
+    $instance = array(
+      'field_name' => $field_name,
+      'entity_type' => 'node',
+      'bundle' => 'page',
+    );
+    field_create_instance($instance);
+
+    // Login a user who can create 'page' nodes.
+    $this->web_user = $this->drupalCreateUser(array('create page content'));
+    $this->drupalLogin($this->web_user);
+  }
+
+  /**
+   * Test that a page with the 'page_node_form' included twice works correctly.
+   */
+  function testMultiForm() {
+    // HTML IDs for elements within the field are potentially modified with
+    // each Ajax submission, but these variables are stable and help target the
+    // desired elements.
+    $field_name = 'field_ajax_test';
+    $field_xpaths = array(
+      'page-node-form' => '//form[@id="page-node-form"]//div[contains(@class, "field-name-field-ajax-test")]',
+      'page-node-form--2' => '//form[@id="page-node-form--2"]//div[contains(@class, "field-name-field-ajax-test")]',
+    );
+    $button_name = $field_name . '_add_more';
+    $button_value = t('Add another item');
+    $button_xpath_suffix = '//input[@name="' . $button_name . '"]';
+    $field_items_xpath_suffix = '//input[@type="text"]';
+
+    // Ensure the initial page contains both node forms and the correct number
+    // of field items and "add more" button for the multi-valued field within
+    // each form.
+    $this->drupalGet('form-test/two-instances-of-same-form');
+    foreach ($field_xpaths as $form_html_id => $field_xpath) {
+      $this->assert(count($this->xpath($field_xpath . $field_items_xpath_suffix)) == 1, t('Found the correct number of field items on the initial page.'));
+      $this->assertFieldByXPath($field_xpath . $button_xpath_suffix, NULL, t('Found the "add more" button on the initial page.'));
+    }
+    $this->assertNoDuplicateIds(t('Initial page contains unique IDs'), 'Other');
+
+    // Submit the "add more" button of each form twice. After each corresponding
+    // page update, ensure the same as above.
+    foreach ($field_xpaths as $form_html_id => $field_xpath) {
+      for ($i = 0; $i < 2; $i++) {
+        $this->drupalPostAJAX(NULL, array(), array($button_name => $button_value), 'system/ajax', array(), array(), $form_html_id);
+        $this->assert(count($this->xpath($field_xpath . $field_items_xpath_suffix)) == $i+2, t('Found the correct number of field items after an AJAX submission.'));
+        $this->assertFieldByXPath($field_xpath . $button_xpath_suffix, NULL, t('Found the "add more" button after an AJAX submission.'));
+        $this->assertNoDuplicateIds(t('Updated page contains unique IDs'), 'Other');
+      }
+    }
+  }
+}
+
+/**
+ * Miscellaneous Ajax tests using ajax_test module.
+ */
+class AJAXElementValidation extends AJAXTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Miscellaneous AJAX tests',
+      'description' => 'Various tests of AJAX behavior',
+      'group' => 'AJAX',
+    );
+  }
+
+  /**
+   * Try to post an Ajax change to a form that has a validated element.
+   *
+   * The drivertext field is Ajax-enabled. An additional field is not, but
+   * is set to be a required field. In this test the required field is not
+   * filled in, and we want to see if the activation of the "drivertext"
+   * Ajax-enabled field fails due to the required field being empty.
+   */
+  function testAJAXElementValidation() {
+    $web_user = $this->drupalCreateUser();
+    $edit = array('drivertext' => t('some dumb text'));
+
+    // Post with 'drivertext' as the triggering element.
+    $post_result = $this->drupalPostAJAX('ajax_validation_test', $edit, 'drivertext');
+    // Look for a validation failure in the resultant JSON.
+    $this->assertNoText(t('Error message'), "No error message in resultant JSON");
+    $this->assertText('ajax_forms_test_validation_form_callback invoked', 'The correct callback was invoked');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/ajax_forms_test.info b/htmltest/modules/simpletest/tests/ajax_forms_test.info
new file mode 100644
index 00000000..2af2f309
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/ajax_forms_test.info
@@ -0,0 +1,12 @@
+name = "AJAX form test mock module"
+description = "Test for AJAX form calls."
+core = 7.x
+package = Testing
+version = VERSION
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/ajax_forms_test.module b/htmltest/modules/simpletest/tests/ajax_forms_test.module
new file mode 100644
index 00000000..28404224
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/ajax_forms_test.module
@@ -0,0 +1,502 @@
+<?php
+
+/**
+ * @file
+ * Simpletest mock module for Ajax forms testing.
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function ajax_forms_test_menu() {
+  $items = array();
+  $items['ajax_forms_test_get_form'] = array(
+    'title' => 'AJAX forms simple form test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('ajax_forms_test_simple_form'),
+    'access callback' => TRUE,
+  );
+  $items['ajax_forms_test_ajax_commands_form'] = array(
+    'title' => 'AJAX forms AJAX commands test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('ajax_forms_test_ajax_commands_form'),
+    'access callback' => TRUE,
+  );
+  $items['ajax_validation_test'] = array(
+    'title' => 'AJAX Validation Test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('ajax_forms_test_validation_form'),
+    'access callback' => TRUE,
+  );
+  $items['ajax_forms_test_lazy_load_form'] = array(
+    'title' => 'AJAX forms lazy load test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('ajax_forms_test_lazy_load_form'),
+    'access callback' => TRUE,
+  );
+  return $items;
+}
+
+
+/**
+ * A basic form used to test form_state['values'] during callback.
+ */
+function ajax_forms_test_simple_form($form, &$form_state) {
+  $form = array();
+  $form['select'] = array(
+    '#type' => 'select',
+    '#options' => array(
+      'red' => 'red',
+      'green' => 'green',
+      'blue' => 'blue'),
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_simple_form_select_callback',
+    ),
+    '#suffix' => '<div id="ajax_selected_color">No color yet selected</div>',
+  );
+
+  $form['checkbox'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Test checkbox'),
+    '#ajax' => array(
+       'callback' => 'ajax_forms_test_simple_form_checkbox_callback',
+    ),
+    '#suffix' => '<div id="ajax_checkbox_value">No action yet</div>',
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('submit'),
+  );
+  return $form;
+}
+
+/**
+ * Ajax callback triggered by select.
+ */
+function ajax_forms_test_simple_form_select_callback($form, $form_state) {
+  $commands = array();
+  $commands[] = ajax_command_html('#ajax_selected_color', $form_state['values']['select']);
+  $commands[] = ajax_command_data('#ajax_selected_color', 'form_state_value_select', $form_state['values']['select']);
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Ajax callback triggered by checkbox.
+ */
+function ajax_forms_test_simple_form_checkbox_callback($form, $form_state) {
+  $commands = array();
+  $commands[] = ajax_command_html('#ajax_checkbox_value', (int) $form_state['values']['checkbox']);
+  $commands[] = ajax_command_data('#ajax_checkbox_value', 'form_state_value_select', (int) $form_state['values']['checkbox']);
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+
+/**
+ * Form to display the Ajax Commands.
+ */
+function ajax_forms_test_ajax_commands_form($form, &$form_state) {
+  $form = array();
+
+  // Shows the 'after' command with a callback generating commands.
+  $form['after_command_example'] = array(
+    '#value' => t("AJAX 'After': Click to put something after the div"),
+    '#type' => 'submit',
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_after_callback',
+    ),
+    '#suffix' => '<div id="after_div">Something can be inserted after this</div>',
+  );
+
+  // Shows the 'alert' command.
+  $form['alert_command_example'] = array(
+    '#value' => t("AJAX 'Alert': Click to alert"),
+    '#type' => 'submit',
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_alert_callback',
+    ),
+  );
+
+  // Shows the 'append' command.
+  $form['append_command_example'] = array(
+    '#value' => t("AJAX 'Append': Click to append something"),
+    '#type' => 'submit',
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_append_callback',
+    ),
+    '#suffix' => '<div id="append_div">Append inside this div</div>',
+  );
+
+
+  // Shows the 'before' command.
+  $form['before_command_example'] = array(
+    '#value' => t("AJAX 'before': Click to put something before the div"),
+    '#type' => 'submit',
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_before_callback',
+    ),
+    '#suffix' => '<div id="before_div">Insert something before this.</div>',
+  );
+
+  // Shows the 'changed' command without asterisk.
+  $form['changed_command_example'] = array(
+    '#value' => t("AJAX changed: Click to mark div changed."),
+    '#type' => 'submit',
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_changed_callback',
+    ),
+    '#suffix' => '<div id="changed_div"> <div id="changed_div_mark_this">This div can be marked as changed or not.</div></div>',
+  );
+  // Shows the 'changed' command adding the asterisk.
+  $form['changed_command_asterisk_example'] = array(
+    '#value' => t("AJAX changed: Click to mark div changed with asterisk."),
+    '#type' => 'submit',
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_changed_asterisk_callback',
+    ),
+  );
+
+  // Shows the Ajax 'css' command.
+  $form['css_command_example'] = array(
+    '#value' => t("Set the the '#box' div to be blue."),
+    '#type' => 'submit',
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_css_callback',
+    ),
+    '#suffix' => '<div id="css_div" style="height: 50px; width: 50px; border: 1px solid black"> box</div>',
+  );
+
+
+  // Shows the Ajax 'data' command. But there is no use of this information,
+  // as this would require a javascript client to use the data.
+  $form['data_command_example'] = array(
+    '#value' => t("AJAX data command: Issue command."),
+    '#type' => 'submit',
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_data_callback',
+    ),
+    '#suffix' => '<div id="data_div">Data attached to this div.</div>',
+  );
+
+  // Shows the Ajax 'invoke' command.
+  $form['invoke_command_example'] = array(
+    '#value' => t("AJAX invoke command: Invoke addClass() method."),
+    '#type' => 'submit',
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_invoke_callback',
+    ),
+    '#suffix' => '<div id="invoke_div">Original contents</div>',
+  );
+
+  // Shows the Ajax 'html' command.
+  $form['html_command_example'] = array(
+    '#value' => t("AJAX html: Replace the HTML in a selector."),
+    '#type' => 'submit',
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_html_callback',
+    ),
+    '#suffix' => '<div id="html_div">Original contents</div>',
+  );
+
+  // Shows the Ajax 'insert' command.
+  $form['insert_command_example'] = array(
+    '#value' => t("AJAX insert: Let client insert based on #ajax['method']."),
+    '#type' => 'submit',
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_insert_callback',
+      'method' => 'prepend',
+    ),
+    '#suffix' => '<div id="insert_div">Original contents</div>',
+  );
+
+  // Shows the Ajax 'prepend' command.
+  $form['prepend_command_example'] = array(
+    '#value' => t("AJAX 'prepend': Click to prepend something"),
+    '#type' => 'submit',
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_prepend_callback',
+    ),
+    '#suffix' => '<div id="prepend_div">Something will be prepended to this div. </div>',
+  );
+
+  // Shows the Ajax 'remove' command.
+  $form['remove_command_example'] = array(
+    '#value' => t("AJAX 'remove': Click to remove text"),
+    '#type' => 'submit',
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_remove_callback',
+    ),
+    '#suffix' => '<div id="remove_div"><div id="remove_text">text to be removed</div></div>',
+  );
+
+  // Shows the Ajax 'restripe' command.
+  $form['restripe_command_example'] = array(
+    '#type' => 'submit',
+    '#value' => t("AJAX 'restripe' command"),
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_restripe_callback',
+    ),
+    '#suffix' => '<div id="restripe_div">
+                  <table id="restripe_table" style="border: 1px solid black" >
+                  <tr id="table-first"><td>first row</td></tr>
+                  <tr ><td>second row</td></tr>
+                  </table>
+                  </div>',
+  );
+
+  // Demonstrates the Ajax 'settings' command. The 'settings' command has
+  // nothing visual to "show", but it can be tested via SimpleTest and via
+  // Firebug.
+  $form['settings_command_example'] = array(
+    '#type' => 'submit',
+    '#value' => t("AJAX 'settings' command"),
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_advanced_commands_settings_callback',
+    ),
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit'),
+  );
+
+  return $form;
+}
+
+/**
+ * Ajax callback for 'after'.
+ */
+function ajax_forms_test_advanced_commands_after_callback($form, $form_state) {
+  $selector = '#after_div';
+
+  $commands = array();
+  $commands[] = ajax_command_after($selector, "This will be placed after");
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Ajax callback for 'alert'.
+ */
+function ajax_forms_test_advanced_commands_alert_callback($form, $form_state) {
+  $commands = array();
+  $commands[] = ajax_command_alert("Alert");
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Ajax callback for 'append'.
+ */
+function ajax_forms_test_advanced_commands_append_callback($form, $form_state) {
+  $selector = '#append_div';
+  $commands = array();
+  $commands[] = ajax_command_append($selector, "Appended text");
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Ajax callback for 'before'.
+ */
+function ajax_forms_test_advanced_commands_before_callback($form, $form_state) {
+  $selector = '#before_div';
+
+  $commands = array();
+  $commands[] = ajax_command_before($selector, "Before text");
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Ajax callback for 'changed'.
+ */
+function ajax_forms_test_advanced_commands_changed_callback($form, $form_state) {
+  $commands[] = ajax_command_changed('#changed_div');
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+/**
+ * Ajax callback for 'changed' with asterisk marking inner div.
+ */
+function ajax_forms_test_advanced_commands_changed_asterisk_callback($form, $form_state) {
+  $commands = array();
+  $commands[] = ajax_command_changed('#changed_div', '#changed_div_mark_this');
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Ajax callback for 'css'.
+ */
+function ajax_forms_test_advanced_commands_css_callback($form, $form_state) {
+  $selector = '#css_div';
+  $color = 'blue';
+
+  $commands = array();
+  $commands[] = ajax_command_css($selector, array('background-color' => $color));
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Ajax callback for 'data'.
+ */
+function ajax_forms_test_advanced_commands_data_callback($form, $form_state) {
+  $selector = '#data_div';
+
+  $commands = array();
+  $commands[] = ajax_command_data($selector, 'testkey', 'testvalue');
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Ajax callback for 'invoke'.
+ */
+function ajax_forms_test_advanced_commands_invoke_callback($form, $form_state) {
+  $commands = array();
+  $commands[] = ajax_command_invoke('#invoke_div', 'addClass', array('error'));
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Ajax callback for 'html'.
+ */
+function ajax_forms_test_advanced_commands_html_callback($form, $form_state) {
+  $commands = array();
+  $commands[] = ajax_command_html('#html_div', 'replacement text');
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Ajax callback for 'insert'.
+ */
+function ajax_forms_test_advanced_commands_insert_callback($form, $form_state) {
+  $commands = array();
+  $commands[] = ajax_command_insert('#insert_div', 'insert replacement text');
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Ajax callback for 'prepend'.
+ */
+function ajax_forms_test_advanced_commands_prepend_callback($form, $form_state) {
+  $commands = array();
+  $commands[] = ajax_command_prepend('#prepend_div', "prepended text");
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Ajax callback for 'remove'.
+ */
+function ajax_forms_test_advanced_commands_remove_callback($form, $form_state) {
+  $commands = array();
+  $commands[] = ajax_command_remove('#remove_text');
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Ajax callback for 'restripe'.
+ */
+function ajax_forms_test_advanced_commands_restripe_callback($form, $form_state) {
+  $commands = array();
+  $commands[] = ajax_command_restripe('#restripe_table');
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Ajax callback for 'settings'.
+ */
+function ajax_forms_test_advanced_commands_settings_callback($form, $form_state) {
+  $commands = array();
+  $setting['ajax_forms_test']['foo'] = 42;
+  $commands[] = ajax_command_settings($setting);
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * This form and its related submit and callback functions demonstrate
+ * not validating another form element when a single Ajax element is triggered.
+ *
+ * The "drivertext" element is an Ajax-enabled textfield, free-form.
+ * The "required_field" element is a textfield marked required.
+ *
+ * The correct behavior is that the Ajax-enabled drivertext element should
+ * be able to trigger without causing validation of the "required_field".
+ */
+function ajax_forms_test_validation_form($form, &$form_state) {
+
+  $form['drivertext'] = array(
+    '#title' => t('AJAX-enabled textfield.'),
+    '#description' => t("When this one AJAX-triggers and the spare required field is empty, you should not get an error."),
+    '#type' => 'textfield',
+    '#default_value' => !empty($form_state['values']['drivertext']) ? $form_state['values']['drivertext'] : "",
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_validation_form_callback',
+      'wrapper' => 'message_area',
+      'method' => 'replace',
+    ),
+    '#suffix' => '<div id="message_area"></div>',
+  );
+
+  $form['spare_required_field'] = array(
+    '#title' => t("Spare Required Field"),
+    '#type' => 'textfield',
+    '#required' => TRUE,
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit'),
+  );
+
+  return $form;
+}
+/**
+ * Submit handler for the validation form.
+ */
+function ajax_forms_test_validation_form_submit($form, $form_state) {
+  drupal_set_message(t("Validation form submitted"));
+}
+
+/**
+ * Ajax callback for the 'drivertext' element of the validation form.
+ */
+function ajax_forms_test_validation_form_callback($form, $form_state) {
+  drupal_set_message("ajax_forms_test_validation_form_callback invoked");
+  drupal_set_message(t("Callback: drivertext=%drivertext, spare_required_field=%spare_required_field", array('%drivertext' => $form_state['values']['drivertext'], '%spare_required_field' => $form_state['values']['spare_required_field'])));
+  return '<div id="message_area">ajax_forms_test_validation_form_callback at ' . date('c') . '</div>';
+}
+
+/**
+ * Form builder: Builds a form that triggers a simple AJAX callback.
+ */
+function ajax_forms_test_lazy_load_form($form, &$form_state) {
+  $form['add_files'] = array(
+    '#type' => 'checkbox',
+    '#default_value' => FALSE,
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit'),
+    '#ajax' => array(
+      'callback' => 'ajax_forms_test_lazy_load_form_ajax',
+    ),
+  );
+  return $form;
+}
+
+/**
+ * Form submit handler: Adds JavaScript and CSS that wasn't on the original form.
+ */
+function ajax_forms_test_lazy_load_form_submit($form, &$form_state) {
+  if ($form_state['values']['add_files']) {
+    drupal_add_js(array('ajax_forms_test_lazy_load_form_submit' => 'executed'), 'setting');
+    drupal_add_css(drupal_get_path('module', 'system') . '/system.admin.css');
+    drupal_add_js(drupal_get_path('module', 'system') . '/system.js');
+  }
+  $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * AJAX callback for the ajax_forms_test_lazy_load_form() form.
+ *
+ * This function returns nothing, because all we're interested in testing is
+ * ajax_render() adding commands for JavaScript and CSS added during the page
+ * request, such as the ones added in ajax_forms_test_lazy_load_form_submit().
+ */
+function ajax_forms_test_lazy_load_form_ajax($form, &$form_state) {
+  return NULL;
+}
diff --git a/htmltest/modules/simpletest/tests/ajax_test.info b/htmltest/modules/simpletest/tests/ajax_test.info
new file mode 100644
index 00000000..244e97f9
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/ajax_test.info
@@ -0,0 +1,12 @@
+name = AJAX Test
+description = Support module for AJAX framework tests.
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/ajax_test.module b/htmltest/modules/simpletest/tests/ajax_test.module
new file mode 100644
index 00000000..21be0194
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/ajax_test.module
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * @file
+ * Helper module for Ajax framework tests.
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function ajax_test_menu() {
+  $items['ajax-test/render'] = array(
+    'title' => 'ajax_render',
+    'page callback' => 'ajax_test_render',
+    'delivery callback' => 'ajax_deliver',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['ajax-test/render-error'] = array(
+    'title' => 'ajax_render_error',
+    'page callback' => 'ajax_test_error',
+    'delivery callback' => 'ajax_deliver',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['ajax-test/link'] = array(
+    'title' => 'AJAX Link',
+    'page callback' => 'ajax_test_link',
+    'access callback' => TRUE,
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_system_theme_info().
+ */
+function ajax_test_system_theme_info() {
+  $themes['test_theme'] = drupal_get_path('module', 'ajax_test') . '/themes/test_theme/test_theme.info';
+  return $themes;
+}
+
+/**
+ * Menu callback; Return an element suitable for use by ajax_deliver().
+ *
+ * Additionally ensures that ajax_render() incorporates JavaScript settings
+ * generated during the page request by invoking drupal_add_js() with a dummy
+ * setting.
+ */
+function ajax_test_render() {
+  drupal_add_js(array('ajax' => 'test'), 'setting');
+  return array('#type' => 'ajax', '#commands' => array());
+}
+
+/**
+ * Menu callback; Returns Ajax element with #error property set.
+ */
+function ajax_test_error() {
+  $message = '';
+  if (!empty($_GET['message'])) {
+    $message = $_GET['message'];
+  }
+  return array('#type' => 'ajax', '#error' => $message);
+}
+
+/**
+ * Menu callback; Renders a #type link with #ajax.
+ */
+function ajax_test_link() {
+  $build['link'] = array(
+    '#type' => 'link',
+    '#title' => 'Show help',
+    '#href' => 'filter/tips',
+    '#ajax' => array(
+      'wrapper' => 'block-system-main',
+    ),
+  );
+  return $build;
+}
+
diff --git a/htmltest/modules/simpletest/tests/batch.test b/htmltest/modules/simpletest/tests/batch.test
new file mode 100644
index 00000000..e41bc92b
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/batch.test
@@ -0,0 +1,403 @@
+<?php
+
+/**
+ * @file
+ * Tests for the Batch API.
+ */
+
+/**
+ * Tests for the Batch API.
+ */
+class BatchProcessingTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Batch processing',
+      'description' => 'Test batch processing in form and non-form workflow.',
+      'group' => 'Batch API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('batch_test');
+  }
+
+  /**
+   * Test batches triggered outside of form submission.
+   */
+  function testBatchNoForm() {
+    // Displaying the page triggers batch 1.
+    $this->drupalGet('batch-test/no-form');
+    $this->assertBatchMessages($this->_resultMessages(1), t('Batch for step 2 performed successfully.'));
+    $this->assertEqual(batch_test_stack(), $this->_resultStack('batch_1'), t('Execution order was correct.'));
+    $this->assertText('Redirection successful.', t('Redirection after batch execution is correct.'));
+  }
+
+  /**
+   * Test batches defined in a form submit handler.
+   */
+  function testBatchForm() {
+    // Batch 0: no operation.
+    $edit = array('batch' => 'batch_0');
+    $this->drupalPost('batch-test/simple', $edit, 'Submit');
+    $this->assertBatchMessages($this->_resultMessages('batch_0'), t('Batch with no operation performed successfully.'));
+    $this->assertText('Redirection successful.', t('Redirection after batch execution is correct.'));
+
+    // Batch 1: several simple operations.
+    $edit = array('batch' => 'batch_1');
+    $this->drupalPost('batch-test/simple', $edit, 'Submit');
+    $this->assertBatchMessages($this->_resultMessages('batch_1'), t('Batch with simple operations performed successfully.'));
+    $this->assertEqual(batch_test_stack(), $this->_resultStack('batch_1'), t('Execution order was correct.'));
+    $this->assertText('Redirection successful.', t('Redirection after batch execution is correct.'));
+
+    // Batch 2: one multistep operation.
+    $edit = array('batch' => 'batch_2');
+    $this->drupalPost('batch-test/simple', $edit, 'Submit');
+    $this->assertBatchMessages($this->_resultMessages('batch_2'), t('Batch with multistep operation performed successfully.'));
+    $this->assertEqual(batch_test_stack(), $this->_resultStack('batch_2'), t('Execution order was correct.'));
+    $this->assertText('Redirection successful.', t('Redirection after batch execution is correct.'));
+
+    // Batch 3: simple + multistep combined.
+    $edit = array('batch' => 'batch_3');
+    $this->drupalPost('batch-test/simple', $edit, 'Submit');
+    $this->assertBatchMessages($this->_resultMessages('batch_3'), t('Batch with simple and multistep operations performed successfully.'));
+    $this->assertEqual(batch_test_stack(), $this->_resultStack('batch_3'), t('Execution order was correct.'));
+    $this->assertText('Redirection successful.', t('Redirection after batch execution is correct.'));
+
+    // Batch 4: nested batch.
+    $edit = array('batch' => 'batch_4');
+    $this->drupalPost('batch-test/simple', $edit, 'Submit');
+    $this->assertBatchMessages($this->_resultMessages('batch_4'), t('Nested batch performed successfully.'));
+    $this->assertEqual(batch_test_stack(), $this->_resultStack('batch_4'), t('Execution order was correct.'));
+    $this->assertText('Redirection successful.', t('Redirection after batch execution is correct.'));
+  }
+
+  /**
+   * Test batches defined in a multistep form.
+   */
+  function testBatchFormMultistep() {
+    $this->drupalGet('batch-test/multistep');
+    $this->assertText('step 1', t('Form is displayed in step 1.'));
+
+    // First step triggers batch 1.
+    $this->drupalPost(NULL, array(), 'Submit');
+    $this->assertBatchMessages($this->_resultMessages('batch_1'), t('Batch for step 1 performed successfully.'));
+    $this->assertEqual(batch_test_stack(), $this->_resultStack('batch_1'), t('Execution order was correct.'));
+    $this->assertText('step 2', t('Form is displayed in step 2.'));
+
+    // Second step triggers batch 2.
+    $this->drupalPost(NULL, array(), 'Submit');
+    $this->assertBatchMessages($this->_resultMessages('batch_2'), t('Batch for step 2 performed successfully.'));
+    $this->assertEqual(batch_test_stack(), $this->_resultStack('batch_2'), t('Execution order was correct.'));
+    $this->assertText('Redirection successful.', t('Redirection after batch execution is correct.'));
+  }
+
+  /**
+   * Test batches defined in different submit handlers on the same form.
+   */
+  function testBatchFormMultipleBatches() {
+    // Batches 1, 2 and 3 are triggered in sequence by different submit
+    // handlers. Each submit handler modify the submitted 'value'.
+    $value = rand(0, 255);
+    $edit = array('value' => $value);
+    $this->drupalPost('batch-test/chained', $edit, 'Submit');
+    // Check that result messages are present and in the correct order.
+    $this->assertBatchMessages($this->_resultMessages('chained'), t('Batches defined in separate submit handlers performed successfully.'));
+    // The stack contains execution order of batch callbacks and submit
+    // hanlders and logging of corresponding $form_state[{values'].
+    $this->assertEqual(batch_test_stack(), $this->_resultStack('chained', $value), t('Execution order was correct, and $form_state is correctly persisted.'));
+    $this->assertText('Redirection successful.', t('Redirection after batch execution is correct.'));
+  }
+
+  /**
+   * Test batches defined in a programmatically submitted form.
+   *
+   * Same as above, but the form is submitted through drupal_form_execute().
+   */
+  function testBatchFormProgrammatic() {
+    // Batches 1, 2 and 3 are triggered in sequence by different submit
+    // handlers. Each submit handler modify the submitted 'value'.
+    $value = rand(0, 255);
+    $this->drupalGet('batch-test/programmatic/' . $value);
+    // Check that result messages are present and in the correct order.
+    $this->assertBatchMessages($this->_resultMessages('chained'), t('Batches defined in separate submit handlers performed successfully.'));
+    // The stack contains execution order of batch callbacks and submit
+    // hanlders and logging of corresponding $form_state[{values'].
+    $this->assertEqual(batch_test_stack(), $this->_resultStack('chained', $value), t('Execution order was correct, and $form_state is correctly persisted.'));
+    $this->assertText('Got out of a programmatic batched form.', t('Page execution continues normally.'));
+  }
+
+  /**
+   * Test that drupal_form_submit() can run within a batch operation.
+   */
+  function testDrupalFormSubmitInBatch() {
+    // Displaying the page triggers a batch that programmatically submits a
+    // form.
+    $value = rand(0, 255);
+    $this->drupalGet('batch-test/nested-programmatic/' . $value);
+    $this->assertEqual(batch_test_stack(), array('mock form submitted with value = ' . $value), t('drupal_form_submit() ran successfully within a batch operation.'));
+  }
+
+  /**
+   * Test batches that return $context['finished'] > 1 do in fact complete.
+   * See http://drupal.org/node/600836
+   */
+  function testBatchLargePercentage() {
+    // Displaying the page triggers batch 5.
+    $this->drupalGet('batch-test/large-percentage');
+    $this->assertBatchMessages($this->_resultMessages(1), t('Batch for step 2 performed successfully.'));
+    $this->assertEqual(batch_test_stack(), $this->_resultStack('batch_5'), t('Execution order was correct.'));
+    $this->assertText('Redirection successful.', t('Redirection after batch execution is correct.'));
+  }
+
+
+  /**
+   * Will trigger a pass if the texts were found in order in the raw content.
+   *
+   * @param $texts
+   *   Array of raw strings to look for .
+   * @param $message
+   *   Message to display.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  function assertBatchMessages($texts, $message) {
+    $pattern = '|' . implode('.*', $texts) .'|s';
+    return $this->assertPattern($pattern, $message);
+  }
+
+  /**
+   * Helper function: return expected execution stacks for the test batches.
+   */
+  function _resultStack($id, $value = 0) {
+    $stack = array();
+    switch ($id) {
+      case 'batch_1':
+        for ($i = 1; $i <= 10; $i++) {
+          $stack[] = "op 1 id $i";
+        }
+        break;
+
+      case 'batch_2':
+        for ($i = 1; $i <= 10; $i++) {
+          $stack[] = "op 2 id $i";
+        }
+        break;
+
+      case 'batch_3':
+        for ($i = 1; $i <= 5; $i++) {
+          $stack[] = "op 1 id $i";
+        }
+        for ($i = 1; $i <= 5; $i++) {
+          $stack[] = "op 2 id $i";
+        }
+        for ($i = 6; $i <= 10; $i++) {
+          $stack[] = "op 1 id $i";
+        }
+        for ($i = 6; $i <= 10; $i++) {
+          $stack[] = "op 2 id $i";
+        }
+        break;
+
+      case 'batch_4':
+        for ($i = 1; $i <= 5; $i++) {
+          $stack[] = "op 1 id $i";
+        }
+        $stack[] = 'setting up batch 2';
+        for ($i = 6; $i <= 10; $i++) {
+          $stack[] = "op 1 id $i";
+        }
+        $stack = array_merge($stack, $this->_resultStack('batch_2'));
+        break;
+
+      case 'batch_5':
+        for ($i = 1; $i <= 10; $i++) {
+          $stack[] = "op 5 id $i";
+        }
+        break;
+
+      case 'chained':
+        $stack[] = 'submit handler 1';
+        $stack[] = 'value = ' . $value;
+        $stack = array_merge($stack, $this->_resultStack('batch_1'));
+        $stack[] = 'submit handler 2';
+        $stack[] = 'value = ' . ($value + 1);
+        $stack = array_merge($stack, $this->_resultStack('batch_2'));
+        $stack[] = 'submit handler 3';
+        $stack[] = 'value = ' . ($value + 2);
+        $stack[] = 'submit handler 4';
+        $stack[] = 'value = ' . ($value + 3);
+        $stack = array_merge($stack, $this->_resultStack('batch_3'));
+        break;
+    }
+    return $stack;
+  }
+
+  /**
+   * Helper function: return expected result messages for the test batches.
+   */
+  function _resultMessages($id) {
+    $messages = array();
+
+    switch ($id) {
+      case 'batch_0':
+        $messages[] = 'results for batch 0<br />none';
+        break;
+
+      case 'batch_1':
+        $messages[] = 'results for batch 1<br />op 1: processed 10 elements';
+        break;
+
+      case 'batch_2':
+        $messages[] = 'results for batch 2<br />op 2: processed 10 elements';
+        break;
+
+      case 'batch_3':
+        $messages[] = 'results for batch 3<br />op 1: processed 10 elements<br />op 2: processed 10 elements';
+        break;
+
+      case 'batch_4':
+        $messages[] = 'results for batch 4<br />op 1: processed 10 elements';
+        $messages = array_merge($messages, $this->_resultMessages('batch_2'));
+        break;
+
+      case 'batch_5':
+        $messages[] = 'results for batch 5<br />op 1: processed 10 elements. $context[\'finished\'] > 1 returned from batch process, with success.';
+        break;
+
+      case 'chained':
+        $messages = array_merge($messages, $this->_resultMessages('batch_1'));
+        $messages = array_merge($messages, $this->_resultMessages('batch_2'));
+        $messages = array_merge($messages, $this->_resultMessages('batch_3'));
+        break;
+    }
+    return $messages;
+  }
+}
+
+/**
+ * Tests for the Batch API Progress page.
+ */
+class BatchPageTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Batch progress page',
+      'description' => 'Test the content of the progress page.',
+      'group' => 'Batch API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('batch_test');
+  }
+
+  /**
+   * Tests that the batch API progress page uses the correct theme.
+   */
+  function testBatchProgressPageTheme() {
+    // Make sure that the page which starts the batch (an administrative page)
+    // is using a different theme than would normally be used by the batch API.
+    variable_set('theme_default', 'bartik');
+    variable_set('admin_theme', 'seven');
+    // Log in as an administrator who can see the administrative theme.
+    $admin_user = $this->drupalCreateUser(array('view the administration theme'));
+    $this->drupalLogin($admin_user);
+    // Visit an administrative page that runs a test batch, and check that the
+    // theme that was used during batch execution (which the batch callback
+    // function saved as a variable) matches the theme used on the
+    // administrative page.
+    $this->drupalGet('admin/batch-test/test-theme');
+    // The stack should contain the name of the theme used on the progress
+    // page.
+    $this->assertEqual(batch_test_stack(), array('seven'), t('A progressive batch correctly uses the theme of the page that started the batch.'));
+  }
+}
+
+/**
+ * Tests the function _batch_api_percentage() to make sure that the rounding
+ * works properly in all cases.
+ */
+class BatchPercentagesUnitTestCase extends DrupalUnitTestCase {
+  protected $testCases = array();
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Batch percentages',
+      'description' => 'Unit tests of progress percentage rounding.',
+      'group' => 'Batch API',
+    );
+  }
+
+  function setUp() {
+    // Set up an array of test cases, where the expected values are the keys,
+    // and the values are arrays with the keys 'total' and 'current',
+    // corresponding with the function parameters of _batch_api_percentage().
+    $this->testCases = array(
+      // 1/2 is 50%.
+      '50' => array('total' => 2, 'current' => 1),
+      // Though we should never encounter a case where the current set is set
+      // 0, if we did, we should get 0%.
+      '0' => array('total' => 3, 'current' => 0),
+      // 1/3 is closer to 33% than to 34%.
+      '33' => array('total' => 3, 'current' => 1),
+      // 2/3 is closer to 67% than to 66%.
+      '67' => array('total' => 3, 'current' => 2),
+      // 1/199 should round up to 1%.
+      '1' => array('total' => 199, 'current' => 1),
+      // 198/199 should round down to 99%.
+      '99' => array('total' => 199, 'current' => 198),
+      // 199/200 would have rounded up to 100%, which would give the false
+      // impression of being finished, so we add another digit and should get
+      // 99.5%.
+      '99.5' => array('total' => 200, 'current' => 199),
+      // The same logic holds for 1/200: we should get 0.5%.
+      '0.5' => array('total' => 200, 'current' => 1),
+      // Numbers that come out evenly, such as 50/200, should be forced to have
+      // extra digits for consistancy.
+      '25.0' => array('total' => 200, 'current' => 50),
+      // Regardless of number of digits we're using, 100% should always just be
+      // 100%.
+      '100' => array('total' => 200, 'current' => 200),
+      // 1998/1999 should similarly round down to 99.9%.
+      '99.9' => array('total' => 1999, 'current' => 1998),
+      // 1999/2000 should add another digit and go to 99.95%.
+      '99.95' => array('total' => 2000, 'current' => 1999),
+      // 19999/20000 should add yet another digit and go to 99.995%.
+      '99.995' => array('total' => 20000, 'current' => 19999),
+      // The next five test cases simulate a batch with a single operation
+      // ('total' equals 1) that takes several steps to complete. Within the
+      // operation, we imagine that there are 501 items to process, and 100 are
+      // completed during each step. The percentages we get back should be
+      // rounded the usual way for the first few passes (i.e., 20%, 40%, etc.),
+      // but for the last pass through, when 500 out of 501 items have been
+      // processed, we do not want to round up to 100%, since that would
+      // erroneously indicate that the processing is complete.
+      '20' => array('total' => 1, 'current' => 100/501),
+      '40' => array('total' => 1, 'current' => 200/501),
+      '60' => array('total' => 1, 'current' => 300/501),
+      '80' => array('total' => 1, 'current' => 400/501),
+      '99.8' => array('total' => 1, 'current' => 500/501),
+    );
+    require_once DRUPAL_ROOT . '/includes/batch.inc';
+    parent::setUp();
+  }
+
+  /**
+   * Test the _batch_api_percentage() function.
+   */
+  function testBatchPercentages() {
+    foreach ($this->testCases as $expected_result => $arguments) {
+      // PHP sometimes casts numeric strings that are array keys to integers,
+      // cast them back here.
+      $expected_result = (string) $expected_result;
+      $total = $arguments['total'];
+      $current = $arguments['current'];
+      $actual_result = _batch_api_percentage($total, $current);
+      if ($actual_result === $expected_result) {
+        $this->pass(t('Expected the batch api percentage at the state @numerator/@denominator to be @expected%, and got @actual%.', array('@numerator' => $current, '@denominator' => $total, '@expected' => $expected_result, '@actual' => $actual_result)));
+      }
+      else {
+        $this->fail(t('Expected the batch api percentage at the state @numerator/@denominator to be @expected%, but got @actual%.', array('@numerator' => $current, '@denominator' => $total, '@expected' => $expected_result, '@actual' => $actual_result)));
+      }
+    }
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/batch_test.callbacks.inc b/htmltest/modules/simpletest/tests/batch_test.callbacks.inc
new file mode 100644
index 00000000..75e66553
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/batch_test.callbacks.inc
@@ -0,0 +1,141 @@
+<?php
+
+
+/**
+ * @file
+ * Batch callbacks for the Batch API tests.
+ */
+
+/**
+ * Simple batch operation.
+ */
+function _batch_test_callback_1($id, $sleep, &$context) {
+  // No-op, but ensure the batch take a couple iterations.
+  // Batch needs time to run for the test, so sleep a bit.
+  usleep($sleep);
+  // Track execution, and store some result for post-processing in the
+  // 'finished' callback.
+  batch_test_stack("op 1 id $id");
+  $context['results'][1][] = $id;
+}
+
+/**
+ * Multistep batch operation.
+ */
+function _batch_test_callback_2($start, $total, $sleep, &$context) {
+  // Initialize context with progress information.
+  if (!isset($context['sandbox']['current'])) {
+    $context['sandbox']['current'] = $start;
+    $context['sandbox']['count'] = 0;
+  }
+
+  // Process by groups of 5 (arbitrary value).
+  $limit = 5;
+  for ($i = 0; $i < $limit && $context['sandbox']['count'] < $total; $i++) {
+    // No-op, but ensure the batch take a couple iterations.
+    // Batch needs time to run for the test, so sleep a bit.
+    usleep($sleep);
+    // Track execution, and store some result for post-processing in the
+    // 'finished' callback.
+    $id = $context['sandbox']['current'] + $i;
+    batch_test_stack("op 2 id $id");
+    $context['results'][2][] = $id;
+
+    // Update progress information.
+    $context['sandbox']['count']++;
+  }
+  $context['sandbox']['current'] += $i;
+
+  // Inform batch engine about progress.
+  if ($context['sandbox']['count'] != $total) {
+    $context['finished'] = $context['sandbox']['count'] / $total;
+  }
+}
+
+/**
+ * Simple batch operation.
+ */
+function _batch_test_callback_5($id, $sleep, &$context) {
+  // No-op, but ensure the batch take a couple iterations.
+  // Batch needs time to run for the test, so sleep a bit.
+  usleep($sleep);
+  // Track execution, and store some result for post-processing in the
+  // 'finished' callback.
+  batch_test_stack("op 5 id $id");
+  $context['results'][5][] = $id;
+  // This test is to test finished > 1
+  $context['finished'] = 3.14;
+}
+
+/**
+ * Batch operation setting up its own batch.
+ */
+function _batch_test_nested_batch_callback() {
+  batch_test_stack('setting up batch 2');
+  batch_set(_batch_test_batch_2());
+}
+
+/**
+ * Common 'finished' callbacks for batches 1 to 4.
+ */
+function _batch_test_finished_helper($batch_id, $success, $results, $operations) {
+  $messages = array("results for batch $batch_id");
+  if ($results) {
+    foreach ($results as $op => $op_results) {
+      $messages[] = 'op '. $op . ': processed ' . count($op_results) . ' elements';
+    }
+  }
+  else {
+    $messages[] = 'none';
+  }
+
+  if (!$success) {
+    // A fatal error occurred during the processing.
+    $error_operation = reset($operations);
+    $messages[] = t('An error occurred while processing @op with arguments:<br/>@args', array('@op' => $error_operation[0], '@args' => print_r($error_operation[1], TRUE)));
+  }
+
+  drupal_set_message(implode('<br />', $messages));
+}
+
+/**
+ * 'finished' callback for batch 0.
+ */
+function _batch_test_finished_0($success, $results, $operations) {
+  _batch_test_finished_helper(0, $success, $results, $operations);
+}
+
+/**
+ * 'finished' callback for batch 1.
+ */
+function _batch_test_finished_1($success, $results, $operations) {
+  _batch_test_finished_helper(1, $success, $results, $operations);
+}
+
+/**
+ * 'finished' callback for batch 2.
+ */
+function _batch_test_finished_2($success, $results, $operations) {
+  _batch_test_finished_helper(2, $success, $results, $operations);
+}
+
+/**
+ * 'finished' callback for batch 3.
+ */
+function _batch_test_finished_3($success, $results, $operations) {
+  _batch_test_finished_helper(3, $success, $results, $operations);
+}
+
+/**
+ * 'finished' callback for batch 4.
+ */
+function _batch_test_finished_4($success, $results, $operations) {
+  _batch_test_finished_helper(4, $success, $results, $operations);
+}
+
+/**
+ * 'finished' callback for batch 5.
+ */
+function _batch_test_finished_5($success, $results, $operations) {
+  _batch_test_finished_helper(5, $success, $results, $operations);
+}
diff --git a/htmltest/modules/simpletest/tests/batch_test.info b/htmltest/modules/simpletest/tests/batch_test.info
new file mode 100644
index 00000000..fcf84c8b
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/batch_test.info
@@ -0,0 +1,12 @@
+name = "Batch API test"
+description = "Support module for Batch API tests."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/batch_test.module b/htmltest/modules/simpletest/tests/batch_test.module
new file mode 100644
index 00000000..1200e767
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/batch_test.module
@@ -0,0 +1,513 @@
+<?php
+
+/**
+ * @file
+ * Helper module for the Batch API tests.
+ */
+
+/**
+ * Implement hook_menu().
+ */
+function batch_test_menu() {
+  $items = array();
+
+  $items['batch-test'] = array(
+    'title' => 'Batch test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('batch_test_simple_form'),
+    'access callback' => TRUE,
+  );
+  // Simple form: one submit handler, setting a batch.
+  $items['batch-test/simple'] = array(
+    'title' => 'Simple',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => 0,
+  );
+  // Multistep form: two steps, each setting a batch.
+  $items['batch-test/multistep'] = array(
+    'title' => 'Multistep',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('batch_test_multistep_form'),
+    'access callback' => TRUE,
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 1,
+  );
+  // Chained form: four submit handlers, several of which set a batch.
+  $items['batch-test/chained'] = array(
+    'title' => 'Chained',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('batch_test_chained_form'),
+    'access callback' => TRUE,
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 2,
+  );
+  // Programmatic form: the page submits the 'Chained' form through
+  // drupal_form_submit().
+  $items['batch-test/programmatic'] = array(
+    'title' => 'Programmatic',
+    'page callback' => 'batch_test_programmatic',
+    'access callback' => TRUE,
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 3,
+  );
+  // No form: fire a batch simply by accessing a page.
+  $items['batch-test/no-form'] = array(
+    'title' => 'Simple page',
+    'page callback' => 'batch_test_no_form',
+    'access callback' => TRUE,
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 4,
+  );
+  // No form: fire a batch; return > 100% complete
+  $items['batch-test/large-percentage'] = array(
+    'title' => 'Simple page with batch over 100% complete',
+    'page callback' => 'batch_test_large_percentage',
+    'access callback' => TRUE,
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 5,
+  );
+  // Tests programmatic form submission within a batch operation.
+  $items['batch-test/nested-programmatic'] = array(
+    'title' => 'Nested programmatic',
+    'page callback' => 'batch_test_nested_drupal_form_submit',
+    'access callback' => TRUE,
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 6,
+  );
+  // Landing page to test redirects.
+  $items['batch-test/redirect'] = array(
+    'title' => 'Redirect',
+    'page callback' => 'batch_test_redirect_page',
+    'access callback' => TRUE,
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 7,
+  );
+  // This item lives under 'admin' so that the page uses the admin theme.
+  $items['admin/batch-test/test-theme'] = array(
+    'page callback' => 'batch_test_theme_batch',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  return $items;
+}
+
+/**
+ * Simple form.
+ */
+function batch_test_simple_form() {
+  $form['batch'] = array(
+    '#type' => 'select',
+    '#title' => 'Choose batch',
+    '#options' => array(
+      'batch_0' => 'batch 0',
+      'batch_1' => 'batch 1',
+      'batch_2' => 'batch 2',
+      'batch_3' => 'batch 3',
+      'batch_4' => 'batch 4',
+    ),
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => 'Submit',
+  );
+
+  return $form;
+}
+
+/**
+ * Submit handler for the simple form.
+ */
+function batch_test_simple_form_submit($form, &$form_state) {
+  batch_test_stack(NULL, TRUE);
+
+  $function = '_batch_test_' . $form_state['values']['batch'];
+  batch_set($function());
+
+  $form_state['redirect'] = 'batch-test/redirect';
+}
+
+
+/**
+ * Multistep form.
+ */
+function batch_test_multistep_form($form, &$form_state) {
+  if (empty($form_state['storage']['step'])) {
+    $form_state['storage']['step'] = 1;
+  }
+
+  $form['step_display'] = array(
+    '#markup' => 'step ' . $form_state['storage']['step'] . '<br/>',
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => 'Submit',
+  );
+
+  return $form;
+}
+
+/**
+ * Submit handler for the multistep form.
+ */
+function batch_test_multistep_form_submit($form, &$form_state) {
+  batch_test_stack(NULL, TRUE);
+
+  switch ($form_state['storage']['step']) {
+    case 1:
+      batch_set(_batch_test_batch_1());
+      break;
+    case 2:
+      batch_set(_batch_test_batch_2());
+      break;
+  }
+
+  if ($form_state['storage']['step'] < 2) {
+    $form_state['storage']['step']++;
+    $form_state['rebuild'] = TRUE;
+  }
+
+  // This will only be effective on the last step.
+  $form_state['redirect'] = 'batch-test/redirect';
+}
+
+/**
+ * Form with chained submit callbacks.
+ */
+function batch_test_chained_form() {
+  // This value is used to test that $form_state persists through batched
+  // submit handlers.
+  $form['value'] = array(
+    '#type' => 'textfield',
+    '#title' => 'Value',
+    '#default_value' => 1,
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => 'Submit',
+  );
+  $form['#submit'] = array(
+    'batch_test_chained_form_submit_1',
+    'batch_test_chained_form_submit_2',
+    'batch_test_chained_form_submit_3',
+    'batch_test_chained_form_submit_4',
+  );
+
+  return $form;
+}
+
+/**
+ * Submit handler #1 for the chained form.
+ */
+function batch_test_chained_form_submit_1($form, &$form_state) {
+  batch_test_stack(NULL, TRUE);
+
+  batch_test_stack('submit handler 1');
+  batch_test_stack('value = ' . $form_state['values']['value']);
+
+  $form_state['values']['value']++;
+  batch_set(_batch_test_batch_1());
+
+  // This redirect should not be taken into account.
+  $form_state['redirect'] = 'should/be/discarded';
+}
+
+/**
+ * Submit handler #2 for the chained form.
+ */
+function batch_test_chained_form_submit_2($form, &$form_state) {
+  batch_test_stack('submit handler 2');
+  batch_test_stack('value = ' . $form_state['values']['value']);
+
+  $form_state['values']['value']++;
+  batch_set(_batch_test_batch_2());
+
+  // This redirect should not be taken into account.
+  $form_state['redirect'] = 'should/be/discarded';
+}
+
+/**
+ * Submit handler #3 for the chained form.
+ */
+function batch_test_chained_form_submit_3($form, &$form_state) {
+  batch_test_stack('submit handler 3');
+  batch_test_stack('value = ' . $form_state['values']['value']);
+
+  $form_state['values']['value']++;
+
+  // This redirect should not be taken into account.
+  $form_state['redirect'] = 'should/be/discarded';
+}
+
+/**
+ * Submit handler #4 for the chained form.
+ */
+function batch_test_chained_form_submit_4($form, &$form_state) {
+  batch_test_stack('submit handler 4');
+  batch_test_stack('value = ' . $form_state['values']['value']);
+
+  $form_state['values']['value']++;
+  batch_set(_batch_test_batch_3());
+
+  // This is the redirect that should prevail.
+  $form_state['redirect'] = 'batch-test/redirect';
+}
+
+/**
+ * Menu callback: programmatically submits the 'Chained' form.
+ */
+function batch_test_programmatic($value = 1) {
+  $form_state = array(
+    'values' => array('value' => $value)
+  );
+  drupal_form_submit('batch_test_chained_form', $form_state);
+  return 'Got out of a programmatic batched form.';
+}
+
+/**
+ * Menu callback: programmatically submits a form within a batch.
+ */
+function batch_test_nested_drupal_form_submit($value = 1) {
+  // Set the batch and process it.
+  $batch['operations'] = array(
+    array('_batch_test_nested_drupal_form_submit_callback', array($value)),
+  );
+  batch_set($batch);
+  batch_process('batch-test/redirect');
+}
+
+/**
+ * Batch operation: submits form_test_mock_form using drupal_form_submit().
+ */
+function _batch_test_nested_drupal_form_submit_callback($value) {
+  $state['values']['test_value'] = $value;
+  drupal_form_submit('batch_test_mock_form', $state);
+}
+
+/**
+ * A simple form with a textfield and submit button.
+ */
+function batch_test_mock_form($form, $form_state) {
+  $form['test_value'] = array(
+    '#type' => 'textfield',
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit'),
+  );
+
+  return $form;
+}
+
+/**
+ * Submit handler for the batch_test_mock form.
+ */
+function batch_test_mock_form_submit($form, &$form_state) {
+  batch_test_stack('mock form submitted with value = ' . $form_state['values']['test_value']);
+}
+
+/**
+ * Menu callback: fire a batch process without a form submission.
+ */
+function batch_test_no_form() {
+  batch_test_stack(NULL, TRUE);
+
+  batch_set(_batch_test_batch_1());
+  batch_process('batch-test/redirect');
+}
+
+/**
+ * Menu callback: fire a batch process without a form submission.
+ */
+function batch_test_large_percentage() {
+  batch_test_stack(NULL, TRUE);
+
+  batch_set(_batch_test_batch_5());
+  batch_process('batch-test/redirect');
+}
+
+/**
+ * Menu callback: successful redirection.
+ */
+function batch_test_redirect_page() {
+  return 'Redirection successful.';
+}
+
+/**
+ * Batch 0: no operation.
+ */
+function _batch_test_batch_0() {
+  $batch = array(
+    'operations' => array(),
+    'finished' => '_batch_test_finished_0',
+    'file' => drupal_get_path('module', 'batch_test'). '/batch_test.callbacks.inc',
+  );
+  return $batch;
+}
+
+/**
+ * Batch 1: repeats a simple operation.
+ *
+ * Operations: op 1 from 1 to 10.
+ */
+function _batch_test_batch_1() {
+  // Ensure the batch takes at least two iterations.
+  $total = 10;
+  $sleep = (1000000 / $total) * 2;
+
+  $operations = array();
+  for ($i = 1; $i <= $total; $i++) {
+    $operations[] = array('_batch_test_callback_1', array($i, $sleep));
+  }
+  $batch = array(
+    'operations' => $operations,
+    'finished' => '_batch_test_finished_1',
+    'file' => drupal_get_path('module', 'batch_test'). '/batch_test.callbacks.inc',
+  );
+  return $batch;
+}
+
+/**
+ * Batch 2: single multistep operation.
+ *
+ * Operations: op 2 from 1 to 10.
+ */
+function _batch_test_batch_2() {
+  // Ensure the batch takes at least two iterations.
+  $total = 10;
+  $sleep = (1000000 / $total) * 2;
+
+  $operations = array(
+    array('_batch_test_callback_2', array(1, $total, $sleep)),
+  );
+  $batch = array(
+    'operations' => $operations,
+    'finished' => '_batch_test_finished_2',
+    'file' => drupal_get_path('module', 'batch_test') . '/batch_test.callbacks.inc',
+  );
+  return $batch;
+}
+
+/**
+ * Batch 3: both single and multistep operations.
+ *
+ * Operations:
+ * - op 1 from 1 to 5,
+ * - op 2 from 1 to 5,
+ * - op 1 from 6 to 10,
+ * - op 2 from 6 to 10.
+ */
+function _batch_test_batch_3() {
+  // Ensure the batch takes at least two iterations.
+  $total = 10;
+  $sleep = (1000000 / $total) * 2;
+
+  $operations = array();
+  for ($i = 1; $i <= round($total / 2); $i++) {
+    $operations[] = array('_batch_test_callback_1', array($i, $sleep));
+  }
+  $operations[] = array('_batch_test_callback_2', array(1, $total / 2, $sleep));
+  for ($i = round($total / 2) + 1; $i <= $total; $i++) {
+    $operations[] = array('_batch_test_callback_1', array($i, $sleep));
+  }
+  $operations[] = array('_batch_test_callback_2', array(6, $total / 2, $sleep));
+  $batch = array(
+    'operations' => $operations,
+    'finished' => '_batch_test_finished_3',
+    'file' => drupal_get_path('module', 'batch_test') . '/batch_test.callbacks.inc',
+  );
+  return $batch;
+}
+
+/**
+ * Batch 4: batch within a batch.
+ *
+ * Operations:
+ * - op 1 from 1 to 5,
+ * - set batch 2 (op 2 from 1 to 10, should run at the end)
+ * - op 1 from 6 to 10,
+ */
+function _batch_test_batch_4() {
+  // Ensure the batch takes at least two iterations.
+  $total = 10;
+  $sleep = (1000000 / $total) * 2;
+
+  $operations = array();
+  for ($i = 1; $i <= round($total / 2); $i++) {
+    $operations[] = array('_batch_test_callback_1', array($i, $sleep));
+  }
+  $operations[] = array('_batch_test_nested_batch_callback', array());
+  for ($i = round($total / 2) + 1; $i <= $total; $i++) {
+    $operations[] = array('_batch_test_callback_1', array($i, $sleep));
+  }
+  $batch = array(
+    'operations' => $operations,
+    'finished' => '_batch_test_finished_4',
+    'file' => drupal_get_path('module', 'batch_test') . '/batch_test.callbacks.inc',
+  );
+  return $batch;
+}
+
+/**
+ * Batch 5: repeats a simple operation.
+ *
+ * Operations: op 1 from 1 to 10.
+ */
+function _batch_test_batch_5() {
+  // Ensure the batch takes at least two iterations.
+  $total = 10;
+  $sleep = (1000000 / $total) * 2;
+
+  $operations = array();
+  for ($i = 1; $i <= $total; $i++) {
+    $operations[] = array('_batch_test_callback_5', array($i, $sleep));
+  }
+  $batch = array(
+    'operations' => $operations,
+    'finished' => '_batch_test_finished_5',
+    'file' => drupal_get_path('module', 'batch_test'). '/batch_test.callbacks.inc',
+  );
+  return $batch;
+}
+
+/**
+ * Menu callback: run a batch for testing theme used on the progress page.
+ */
+function batch_test_theme_batch() {
+  batch_test_stack(NULL, TRUE);
+  $batch = array(
+    'operations' => array(
+      array('_batch_test_theme_callback', array()),
+    ),
+  );
+  batch_set($batch);
+  batch_process('batch-test/redirect');
+}
+
+/**
+ * Batch callback function for testing the theme used on the progress page.
+ */
+function _batch_test_theme_callback() {
+  // Because drupalGet() steps through the full progressive batch before
+  // returning control to the test function, we cannot test that the correct
+  // theme is being used on the batch processing page by viewing that page
+  // directly. Instead, we save the theme being used in a variable here, so
+  // that it can be loaded and inspected in the thread running the test.
+  global $theme;
+  batch_test_stack($theme);
+}
+
+/**
+ * Helper function: store or retrieve traced execution data.
+ */
+function batch_test_stack($data = NULL, $reset = FALSE) {
+  if ($reset) {
+    variable_del('batch_test_stack');
+  }
+  if (!isset($data)) {
+    return variable_get('batch_test_stack', array());
+  }
+  $stack = variable_get('batch_test_stack', array());
+  $stack[] = $data;
+  variable_set('batch_test_stack', $stack);
+}
diff --git a/htmltest/modules/simpletest/tests/bootstrap.test b/htmltest/modules/simpletest/tests/bootstrap.test
new file mode 100644
index 00000000..4fda15c8
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/bootstrap.test
@@ -0,0 +1,543 @@
+<?php
+
+class BootstrapIPAddressTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'IP address and HTTP_HOST test',
+      'description' => 'Get the IP address from the current visitor from the server variables, check hostname validation.',
+      'group' => 'Bootstrap'
+    );
+  }
+
+  function setUp() {
+    $this->oldserver = $_SERVER;
+
+    $this->remote_ip = '127.0.0.1';
+    $this->proxy_ip = '127.0.0.2';
+    $this->proxy2_ip = '127.0.0.3';
+    $this->forwarded_ip = '127.0.0.4';
+    $this->cluster_ip = '127.0.0.5';
+    $this->untrusted_ip = '0.0.0.0';
+
+    drupal_static_reset('ip_address');
+
+    $_SERVER['REMOTE_ADDR'] = $this->remote_ip;
+    unset($_SERVER['HTTP_X_FORWARDED_FOR']);
+    unset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']);
+
+    parent::setUp();
+  }
+
+  function tearDown() {
+    $_SERVER = $this->oldserver;
+    drupal_static_reset('ip_address');
+    parent::tearDown();
+  }
+
+  /**
+   * test IP Address and hostname
+   */
+  function testIPAddressHost() {
+    // Test the normal IP address.
+    $this->assertTrue(
+      ip_address() == $this->remote_ip,
+      'Got remote IP address.'
+    );
+
+    // Proxy forwarding on but no proxy addresses defined.
+    variable_set('reverse_proxy', 1);
+    $this->assertTrue(
+      ip_address() == $this->remote_ip,
+      'Proxy forwarding without trusted proxies got remote IP address.'
+    );
+
+    // Proxy forwarding on and proxy address not trusted.
+    variable_set('reverse_proxy_addresses', array($this->proxy_ip, $this->proxy2_ip));
+    drupal_static_reset('ip_address');
+    $_SERVER['REMOTE_ADDR'] = $this->untrusted_ip;
+    $this->assertTrue(
+      ip_address() == $this->untrusted_ip,
+      'Proxy forwarding with untrusted proxy got remote IP address.'
+    );
+
+    // Proxy forwarding on and proxy address trusted.
+    $_SERVER['REMOTE_ADDR'] = $this->proxy_ip;
+    $_SERVER['HTTP_X_FORWARDED_FOR'] = $this->forwarded_ip;
+    drupal_static_reset('ip_address');
+    $this->assertTrue(
+      ip_address() == $this->forwarded_ip,
+      'Proxy forwarding with trusted proxy got forwarded IP address.'
+    );
+
+    // Multi-tier architecture with comma separated values in header.
+    $_SERVER['REMOTE_ADDR'] = $this->proxy_ip;
+    $_SERVER['HTTP_X_FORWARDED_FOR'] = implode(', ', array($this->untrusted_ip, $this->forwarded_ip, $this->proxy2_ip));
+    drupal_static_reset('ip_address');
+    $this->assertTrue(
+      ip_address() == $this->forwarded_ip,
+      'Proxy forwarding with trusted 2-tier proxy got forwarded IP address.'
+    );
+
+    // Custom client-IP header.
+    variable_set('reverse_proxy_header', 'HTTP_X_CLUSTER_CLIENT_IP');
+    $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'] = $this->cluster_ip;
+    drupal_static_reset('ip_address');
+    $this->assertTrue(
+      ip_address() == $this->cluster_ip,
+      'Cluster environment got cluster client IP.'
+    );
+
+    // Verifies that drupal_valid_http_host() prevents invalid characters.
+    $this->assertFalse(drupal_valid_http_host('security/.drupal.org:80'), 'HTTP_HOST with / is invalid');
+    $this->assertFalse(drupal_valid_http_host('security\\.drupal.org:80'), 'HTTP_HOST with \\ is invalid');
+    $this->assertFalse(drupal_valid_http_host('security<.drupal.org:80'), 'HTTP_HOST with &lt; is invalid');
+    $this->assertFalse(drupal_valid_http_host('security..drupal.org:80'), 'HTTP_HOST with .. is invalid');
+    // IPv6 loopback address
+    $this->assertTrue(drupal_valid_http_host('[::1]:80'), 'HTTP_HOST containing IPv6 loopback is valid');
+  }
+}
+
+class BootstrapPageCacheTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Page cache test',
+      'description' => 'Enable the page cache and test it with various HTTP requests.',
+      'group' => 'Bootstrap'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('system_test');
+  }
+
+  /**
+   * Test support for requests containing If-Modified-Since and If-None-Match headers.
+   */
+  function testConditionalRequests() {
+    variable_set('cache', 1);
+
+    // Fill the cache.
+    $this->drupalGet('');
+
+    $this->drupalHead('');
+    $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.');
+    $etag = $this->drupalGetHeader('ETag');
+    $last_modified = $this->drupalGetHeader('Last-Modified');
+
+    $this->drupalGet('', array(), array('If-Modified-Since: ' . $last_modified, 'If-None-Match: ' . $etag));
+    $this->assertResponse(304, 'Conditional request returned 304 Not Modified.');
+
+    $this->drupalGet('', array(), array('If-Modified-Since: ' . gmdate(DATE_RFC822, strtotime($last_modified)), 'If-None-Match: ' . $etag));
+    $this->assertResponse(304, 'Conditional request with obsolete If-Modified-Since date returned 304 Not Modified.');
+
+    $this->drupalGet('', array(), array('If-Modified-Since: ' . gmdate(DATE_RFC850, strtotime($last_modified)), 'If-None-Match: ' . $etag));
+    $this->assertResponse(304, 'Conditional request with obsolete If-Modified-Since date returned 304 Not Modified.');
+
+    $this->drupalGet('', array(), array('If-Modified-Since: ' . $last_modified));
+    $this->assertResponse(200, 'Conditional request without If-None-Match returned 200 OK.');
+    $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.');
+
+    $this->drupalGet('', array(), array('If-Modified-Since: ' . gmdate(DATE_RFC1123, strtotime($last_modified) + 1), 'If-None-Match: ' . $etag));
+    $this->assertResponse(200, 'Conditional request with new a If-Modified-Since date newer than Last-Modified returned 200 OK.');
+    $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.');
+
+    $user = $this->drupalCreateUser();
+    $this->drupalLogin($user);
+    $this->drupalGet('', array(), array('If-Modified-Since: ' . $last_modified, 'If-None-Match: ' . $etag));
+    $this->assertResponse(200, 'Conditional request returned 200 OK for authenticated user.');
+    $this->assertFalse($this->drupalGetHeader('X-Drupal-Cache'), 'Absense of Page was not cached.');
+  }
+
+  /**
+   * Test cache headers.
+   */
+  function testPageCache() {
+    variable_set('cache', 1);
+
+    // Fill the cache.
+    $this->drupalGet('system-test/set-header', array('query' => array('name' => 'Foo', 'value' => 'bar')));
+    $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS', 'Page was not cached.');
+    $this->assertEqual($this->drupalGetHeader('Vary'), 'Cookie,Accept-Encoding', 'Vary header was sent.');
+    $this->assertEqual($this->drupalGetHeader('Cache-Control'), 'public, max-age=0', 'Cache-Control header was sent.');
+    $this->assertEqual($this->drupalGetHeader('Expires'), 'Sun, 19 Nov 1978 05:00:00 GMT', 'Expires header was sent.');
+    $this->assertEqual($this->drupalGetHeader('Foo'), 'bar', 'Custom header was sent.');
+
+    // Check cache.
+    $this->drupalGet('system-test/set-header', array('query' => array('name' => 'Foo', 'value' => 'bar')));
+    $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.');
+    $this->assertEqual($this->drupalGetHeader('Vary'), 'Cookie,Accept-Encoding', 'Vary: Cookie header was sent.');
+    $this->assertEqual($this->drupalGetHeader('Cache-Control'), 'public, max-age=0', 'Cache-Control header was sent.');
+    $this->assertEqual($this->drupalGetHeader('Expires'), 'Sun, 19 Nov 1978 05:00:00 GMT', 'Expires header was sent.');
+    $this->assertEqual($this->drupalGetHeader('Foo'), 'bar', 'Custom header was sent.');
+
+    // Check replacing default headers.
+    $this->drupalGet('system-test/set-header', array('query' => array('name' => 'Expires', 'value' => 'Fri, 19 Nov 2008 05:00:00 GMT')));
+    $this->assertEqual($this->drupalGetHeader('Expires'), 'Fri, 19 Nov 2008 05:00:00 GMT', 'Default header was replaced.');
+    $this->drupalGet('system-test/set-header', array('query' => array('name' => 'Vary', 'value' => 'User-Agent')));
+    $this->assertEqual($this->drupalGetHeader('Vary'), 'User-Agent,Accept-Encoding', 'Default header was replaced.');
+
+    // Check that authenticated users bypass the cache.
+    $user = $this->drupalCreateUser();
+    $this->drupalLogin($user);
+    $this->drupalGet('system-test/set-header', array('query' => array('name' => 'Foo', 'value' => 'bar')));
+    $this->assertFalse($this->drupalGetHeader('X-Drupal-Cache'), 'Caching was bypassed.');
+    $this->assertTrue(strpos($this->drupalGetHeader('Vary'), 'Cookie') === FALSE, 'Vary: Cookie header was not sent.');
+    $this->assertEqual($this->drupalGetHeader('Cache-Control'), 'no-cache, must-revalidate, post-check=0, pre-check=0', 'Cache-Control header was sent.');
+    $this->assertEqual($this->drupalGetHeader('Expires'), 'Sun, 19 Nov 1978 05:00:00 GMT', 'Expires header was sent.');
+    $this->assertEqual($this->drupalGetHeader('Foo'), 'bar', 'Custom header was sent.');
+
+  }
+
+  /**
+   * Test page compression.
+   *
+   * The test should pass even if zlib.output_compression is enabled in php.ini,
+   * .htaccess or similar, or if compression is done outside PHP, e.g. by the
+   * mod_deflate Apache module.
+   */
+  function testPageCompression() {
+    variable_set('cache', 1);
+
+    // Fill the cache and verify that output is compressed.
+    $this->drupalGet('', array(), array('Accept-Encoding: gzip,deflate'));
+    $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS', 'Page was not cached.');
+    $this->drupalSetContent(gzinflate(substr($this->drupalGetContent(), 10, -8)));
+    $this->assertRaw('</html>', 'Page was gzip compressed.');
+
+    // Verify that cached output is compressed.
+    $this->drupalGet('', array(), array('Accept-Encoding: gzip,deflate'));
+    $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.');
+    $this->assertEqual($this->drupalGetHeader('Content-Encoding'), 'gzip', 'A Content-Encoding header was sent.');
+    $this->drupalSetContent(gzinflate(substr($this->drupalGetContent(), 10, -8)));
+    $this->assertRaw('</html>', 'Page was gzip compressed.');
+
+    // Verify that a client without compression support gets an uncompressed page.
+    $this->drupalGet('');
+    $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.');
+    $this->assertFalse($this->drupalGetHeader('Content-Encoding'), 'A Content-Encoding header was not sent.');
+    $this->assertTitle(t('Welcome to @site-name | @site-name', array('@site-name' => variable_get('site_name', 'Drupal'))), 'Site title matches.');
+    $this->assertRaw('</html>', 'Page was not compressed.');
+
+    // Disable compression mode.
+    variable_set('page_compression', FALSE);
+
+    // Verify if cached page is still available for a client with compression support.
+    $this->drupalGet('', array(), array('Accept-Encoding: gzip,deflate'));
+    $this->drupalSetContent(gzinflate(substr($this->drupalGetContent(), 10, -8)));
+    $this->assertRaw('</html>', 'Page was delivered after compression mode is changed (compression support enabled).');
+
+    // Verify if cached page is still available for a client without compression support.
+    $this->drupalGet('');
+    $this->assertRaw('</html>', 'Page was delivered after compression mode is changed (compression support disabled).');
+  }
+}
+
+class BootstrapVariableTestCase extends DrupalWebTestCase {
+
+  function setUp() {
+    parent::setUp('system_test');
+  }
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Variable test',
+      'description' => 'Make sure the variable system functions correctly.',
+      'group' => 'Bootstrap'
+    );
+  }
+
+  /**
+   * testVariable
+   */
+  function testVariable() {
+    // Setting and retrieving values.
+    $variable = $this->randomName();
+    variable_set('simpletest_bootstrap_variable_test', $variable);
+    $this->assertIdentical($variable, variable_get('simpletest_bootstrap_variable_test'), 'Setting and retrieving values');
+
+    // Make sure the variable persists across multiple requests.
+    $this->drupalGet('system-test/variable-get');
+    $this->assertText($variable, 'Variable persists across multiple requests');
+
+    // Deleting variables.
+    $default_value = $this->randomName();
+    variable_del('simpletest_bootstrap_variable_test');
+    $variable = variable_get('simpletest_bootstrap_variable_test', $default_value);
+    $this->assertIdentical($variable, $default_value, 'Deleting variables');
+  }
+
+  /**
+   * Makes sure that the default variable parameter is passed through okay.
+   */
+  function testVariableDefaults() {
+    // Tests passing nothing through to the default.
+    $this->assertIdentical(NULL, variable_get('simpletest_bootstrap_variable_test'), 'Variables are correctly defaulting to NULL.');
+
+    // Tests passing 5 to the default parameter.
+    $this->assertIdentical(5, variable_get('simpletest_bootstrap_variable_test', 5), 'The default variable parameter is passed through correctly.');
+  }
+
+}
+
+/**
+ * Test hook_boot() and hook_exit().
+ */
+class HookBootExitTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Boot and exit hook invocation',
+      'description' => 'Test that hook_boot() and hook_exit() are called correctly.',
+      'group' => 'Bootstrap',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('system_test', 'dblog');
+  }
+
+  /**
+   * Test calling of hook_boot() and hook_exit().
+   */
+  function testHookBootExit() {
+    // Test with cache disabled. Boot and exit should always fire.
+    variable_set('cache', 0);
+    $this->drupalGet('');
+    $calls = 1;
+    $this->assertEqual(db_query('SELECT COUNT(*) FROM {watchdog} WHERE type = :type AND message = :message', array(':type' => 'system_test', ':message' => 'hook_boot'))->fetchField(), $calls, t('hook_boot called with disabled cache.'));
+    $this->assertEqual(db_query('SELECT COUNT(*) FROM {watchdog} WHERE type = :type AND message = :message', array(':type' => 'system_test', ':message' => 'hook_exit'))->fetchField(), $calls, t('hook_exit called with disabled cache.'));
+
+    // Test with normal cache. Boot and exit should be called.
+    variable_set('cache', 1);
+    $this->drupalGet('');
+    $calls++;
+    $this->assertEqual(db_query('SELECT COUNT(*) FROM {watchdog} WHERE type = :type AND message = :message', array(':type' => 'system_test', ':message' => 'hook_boot'))->fetchField(), $calls, t('hook_boot called with normal cache.'));
+    $this->assertEqual(db_query('SELECT COUNT(*) FROM {watchdog} WHERE type = :type AND message = :message', array(':type' => 'system_test', ':message' => 'hook_exit'))->fetchField(), $calls, t('hook_exit called with normal cache.'));
+
+    // Boot and exit should not fire since the page is cached.
+    variable_set('page_cache_invoke_hooks', FALSE);
+    $this->assertTrue(cache_get(url('', array('absolute' => TRUE)), 'cache_page'), t('Page has been cached.'));
+    $this->drupalGet('');
+    $this->assertEqual(db_query('SELECT COUNT(*) FROM {watchdog} WHERE type = :type AND message = :message', array(':type' => 'system_test', ':message' => 'hook_boot'))->fetchField(), $calls, t('hook_boot not called with aggressive cache and a cached page.'));
+    $this->assertEqual(db_query('SELECT COUNT(*) FROM {watchdog} WHERE type = :type AND message = :message', array(':type' => 'system_test', ':message' => 'hook_exit'))->fetchField(), $calls, t('hook_exit not called with aggressive cache and a cached page.'));
+
+    // Test with page cache cleared, boot and exit should be called.
+    $this->assertTrue(db_delete('cache_page')->execute(), t('Page cache cleared.'));
+    $this->drupalGet('');
+    $calls++;
+    $this->assertEqual(db_query('SELECT COUNT(*) FROM {watchdog} WHERE type = :type AND message = :message', array(':type' => 'system_test', ':message' => 'hook_boot'))->fetchField(), $calls, t('hook_boot called with aggressive cache and no cached page.'));
+    $this->assertEqual(db_query('SELECT COUNT(*) FROM {watchdog} WHERE type = :type AND message = :message', array(':type' => 'system_test', ':message' => 'hook_exit'))->fetchField(), $calls, t('hook_exit called with aggressive cache and no cached page.'));
+  }
+}
+
+/**
+ * Test drupal_get_filename()'s availability.
+ */
+class BootstrapGetFilenameTestCase extends DrupalUnitTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Get filename test',
+      'description' => 'Test that drupal_get_filename() works correctly when the file is not found in the database.',
+      'group' => 'Bootstrap',
+    );
+  }
+
+  /**
+   * Test that drupal_get_filename() works correctly when the file is not found in the database.
+   */
+  function testDrupalGetFilename() {
+    // Reset the static cache so we can test the "db is not active" code of
+    // drupal_get_filename().
+    drupal_static_reset('drupal_get_filename');
+
+    // Retrieving the location of a module.
+    $this->assertIdentical(drupal_get_filename('module', 'php'), 'modules/php/php.module', t('Retrieve module location.'));
+
+    // Retrieving the location of a theme.
+    $this->assertIdentical(drupal_get_filename('theme', 'stark'), 'themes/stark/stark.info', t('Retrieve theme location.'));
+
+    // Retrieving the location of a theme engine.
+    $this->assertIdentical(drupal_get_filename('theme_engine', 'phptemplate'), 'themes/engines/phptemplate/phptemplate.engine', t('Retrieve theme engine location.'));
+
+    // Retrieving the location of a profile. Profiles are a special case with
+    // a fixed location and naming.
+    $this->assertIdentical(drupal_get_filename('profile', 'standard'), 'profiles/standard/standard.profile', t('Retrieve install profile location.'));
+
+    // When a file is not found in the database cache, drupal_get_filename()
+    // searches several locations on the filesystem, including the DRUPAL_ROOT
+    // directory. We use the '.script' extension below because this is a
+    // non-existent filetype that will definitely not exist in the database.
+    // Since there is already a scripts directory, drupal_get_filename() will
+    // automatically check there for 'script' files, just as it does for (e.g.)
+    // 'module' files in modules.
+    $this->assertIdentical(drupal_get_filename('script', 'test'), 'scripts/test.script', t('Retrieve test script location.'));
+  }
+}
+
+class BootstrapTimerTestCase extends DrupalUnitTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Timer test',
+      'description' => 'Test that timer_read() works both when a timer is running and when a timer is stopped.',
+      'group' => 'Bootstrap',
+    );
+  }
+
+  /**
+   * Test timer_read() to ensure it properly accumulates time when the timer
+   * started and stopped multiple times.
+   * @return
+   */
+  function testTimer() {
+    timer_start('test');
+    sleep(1);
+    $this->assertTrue(timer_read('test') >= 1000, 'Timer measured 1 second of sleeping while running.');
+    sleep(1);
+    timer_stop('test');
+    $this->assertTrue(timer_read('test') >= 2000, 'Timer measured 2 seconds of sleeping after being stopped.');
+    timer_start('test');
+    sleep(1);
+    $this->assertTrue(timer_read('test') >= 3000, 'Timer measured 3 seconds of sleeping after being restarted.');
+    sleep(1);
+    $timer = timer_stop('test');
+    $this->assertTrue(timer_read('test') >= 4000, 'Timer measured 4 seconds of sleeping after being stopped for a second time.');
+    $this->assertEqual($timer['count'], 2, 'Timer counted 2 instances of being started.');
+  }
+}
+
+/**
+ * Test that resetting static variables works.
+ */
+class BootstrapResettableStaticTestCase extends DrupalUnitTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Resettable static variables test',
+      'description' => 'Test that drupal_static() and drupal_static_reset() work.',
+      'group' => 'Bootstrap',
+    );
+  }
+
+  /**
+   * Test that a variable reference returned by drupal_static() gets reset when
+   * drupal_static_reset() is called.
+   */
+  function testDrupalStatic() {
+    $name = __CLASS__ . '_' . __METHOD__;
+    $var = &drupal_static($name, 'foo');
+    $this->assertEqual($var, 'foo', 'Variable returned by drupal_static() was set to its default.');
+
+    // Call the specific reset and the global reset each twice to ensure that
+    // multiple resets can be issued without odd side effects.
+    $var = 'bar';
+    drupal_static_reset($name);
+    $this->assertEqual($var, 'foo', 'Variable was reset after first invocation of name-specific reset.');
+    $var = 'bar';
+    drupal_static_reset($name);
+    $this->assertEqual($var, 'foo', 'Variable was reset after second invocation of name-specific reset.');
+    $var = 'bar';
+    drupal_static_reset();
+    $this->assertEqual($var, 'foo', 'Variable was reset after first invocation of global reset.');
+    $var = 'bar';
+    drupal_static_reset();
+    $this->assertEqual($var, 'foo', 'Variable was reset after second invocation of global reset.');
+  }
+}
+
+/**
+ * Test miscellaneous functions in bootstrap.inc.
+ */
+class BootstrapMiscTestCase extends DrupalUnitTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Miscellaneous bootstrap unit tests',
+      'description' => 'Test miscellaneous functions in bootstrap.inc.',
+      'group' => 'Bootstrap',
+    );
+  }
+
+  /**
+   * Test miscellaneous functions in bootstrap.inc.
+   */
+  function testMisc() {
+    // Test drupal_array_merge_deep().
+    $link_options_1 = array('fragment' => 'x', 'attributes' => array('title' => 'X', 'class' => array('a', 'b')), 'language' => 'en');
+    $link_options_2 = array('fragment' => 'y', 'attributes' => array('title' => 'Y', 'class' => array('c', 'd')), 'html' => TRUE);
+    $expected = array('fragment' => 'y', 'attributes' => array('title' => 'Y', 'class' => array('a', 'b', 'c', 'd')), 'language' => 'en', 'html' => TRUE);
+    $this->assertIdentical(drupal_array_merge_deep($link_options_1, $link_options_2), $expected, 'drupal_array_merge_deep() returned a properly merged array.');
+  }
+
+  /**
+   * Tests that the drupal_check_memory_limit() function works as expected.
+   */
+  function testCheckMemoryLimit() {
+    $memory_limit = ini_get('memory_limit');
+    // Test that a very reasonable amount of memory is available.
+    $this->assertTrue(drupal_check_memory_limit('30MB'), '30MB of memory tested available.');
+
+    // Get the available memory and multiply it by two to make it unreasonably
+    // high.
+    $twice_avail_memory = ($memory_limit * 2) . 'MB';
+
+    // The function should always return true if the memory limit is set to -1.
+    $this->assertTrue(drupal_check_memory_limit($twice_avail_memory, -1), 'drupal_check_memory_limit() returns TRUE when a limit of -1 (none) is supplied');
+
+    // Test that even though we have 30MB of memory available - the function
+    // returns FALSE when given an upper limit for how much memory can be used.
+    $this->assertFalse(drupal_check_memory_limit('30MB', '16MB'), 'drupal_check_memory_limit() returns FALSE with a 16MB upper limit on a 30MB requirement.');
+
+    // Test that an equal amount of memory to the amount requested returns TRUE.
+    $this->assertTrue(drupal_check_memory_limit('30MB', '30MB'), 'drupal_check_memory_limit() returns TRUE when requesting 30MB on a 30MB requirement.');
+  }
+}
+
+/**
+ * Tests for overriding server variables via the API.
+ */
+class BootstrapOverrideServerVariablesTestCase extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Overriding server variables',
+      'description' => 'Test that drupal_override_server_variables() works correctly.',
+      'group' => 'Bootstrap',
+    );
+  }
+
+  /**
+   * Test providing a direct URL to to drupal_override_server_variables().
+   */
+  function testDrupalOverrideServerVariablesProvidedURL() {
+    $tests = array(
+      'http://example.com' => array(
+        'HTTP_HOST' => 'example.com',
+        'SCRIPT_NAME' => isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : NULL,
+      ),
+      'http://example.com/index.php' => array(
+        'HTTP_HOST' => 'example.com',
+        'SCRIPT_NAME' => '/index.php',
+      ),
+      'http://example.com/subdirectory/index.php' => array(
+        'HTTP_HOST' => 'example.com',
+        'SCRIPT_NAME' => '/subdirectory/index.php',
+      ),
+    );
+    foreach ($tests as $url => $expected_server_values) {
+      // Remember the original value of $_SERVER, since the function call below
+      // will modify it.
+      $original_server = $_SERVER;
+      // Call drupal_override_server_variables() and ensure that all expected
+      // $_SERVER variables were modified correctly.
+      drupal_override_server_variables(array('url' => $url));
+      foreach ($expected_server_values as $key => $value) {
+        $this->assertIdentical($_SERVER[$key], $value);
+      }
+      // Restore the original value of $_SERVER.
+      $_SERVER = $original_server;
+    }
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/cache.test b/htmltest/modules/simpletest/tests/cache.test
new file mode 100644
index 00000000..b42de360
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/cache.test
@@ -0,0 +1,437 @@
+<?php
+
+class CacheTestCase extends DrupalWebTestCase {
+  protected $default_bin = 'cache';
+  protected $default_cid = 'test_temporary';
+  protected $default_value = 'CacheTest';
+
+  /**
+   * Check whether or not a cache entry exists.
+   *
+   * @param $cid
+   *   The cache id.
+   * @param $var
+   *   The variable the cache should contain.
+   * @param $bin
+   *   The bin the cache item was stored in.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function checkCacheExists($cid, $var, $bin = NULL) {
+    if ($bin == NULL) {
+      $bin = $this->default_bin;
+    }
+
+    $cache = cache_get($cid, $bin);
+
+    return isset($cache->data) && $cache->data == $var;
+  }
+
+  /**
+   * Assert or a cache entry exists.
+   *
+   * @param $message
+   *   Message to display.
+   * @param $var
+   *   The variable the cache should contain.
+   * @param $cid
+   *   The cache id.
+   * @param $bin
+   *   The bin the cache item was stored in.
+   */
+  protected function assertCacheExists($message, $var = NULL, $cid = NULL, $bin = NULL) {
+    if ($bin == NULL) {
+      $bin = $this->default_bin;
+    }
+    if ($cid == NULL) {
+      $cid = $this->default_cid;
+    }
+    if ($var == NULL) {
+      $var = $this->default_value;
+    }
+
+    $this->assertTrue($this->checkCacheExists($cid, $var, $bin), $message);
+  }
+
+  /**
+   * Assert or a cache entry has been removed.
+   *
+   * @param $message
+   *   Message to display.
+   * @param $cid
+   *   The cache id.
+   * @param $bin
+   *   The bin the cache item was stored in.
+   */
+  function assertCacheRemoved($message, $cid = NULL, $bin = NULL) {
+    if ($bin == NULL) {
+      $bin = $this->default_bin;
+    }
+    if ($cid == NULL) {
+      $cid = $this->default_cid;
+    }
+
+    $cache = cache_get($cid, $bin);
+    $this->assertFalse($cache, $message);
+  }
+
+  /**
+   * Perform the general wipe.
+   * @param $bin
+   *   The bin to perform the wipe on.
+   */
+  protected function generalWipe($bin = NULL) {
+    if ($bin == NULL) {
+      $bin = $this->default_bin;
+    }
+
+    cache_clear_all(NULL, $bin);
+  }
+
+  /**
+   * Setup the lifetime settings for caching.
+   *
+   * @param $time
+   *   The time in seconds the cache should minimal live.
+   */
+  protected function setupLifetime($time) {
+    variable_set('cache_lifetime', $time);
+    variable_set('cache_flush', 0);
+  }
+}
+
+class CacheSavingCase extends CacheTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Cache saving test',
+      'description' => 'Check our variables are saved and restored the right way.',
+      'group' => 'Cache'
+    );
+  }
+
+  /**
+   * Test the saving and restoring of a string.
+   */
+  function testString() {
+    $this->checkVariable($this->randomName(100));
+  }
+
+  /**
+   * Test the saving and restoring of an integer.
+   */
+  function testInteger() {
+    $this->checkVariable(100);
+  }
+
+  /**
+   * Test the saving and restoring of a double.
+   */
+  function testDouble() {
+    $this->checkVariable(1.29);
+  }
+
+  /**
+   * Test the saving and restoring of an array.
+   */
+  function testArray() {
+    $this->checkVariable(array('drupal1', 'drupal2' => 'drupal3', 'drupal4' => array('drupal5', 'drupal6')));
+  }
+
+  /**
+   * Test the saving and restoring of an object.
+   */
+  function testObject() {
+    $test_object = new stdClass();
+    $test_object->test1 = $this->randomName(100);
+    $test_object->test2 = 100;
+    $test_object->test3 = array('drupal1', 'drupal2' => 'drupal3', 'drupal4' => array('drupal5', 'drupal6'));
+
+    cache_set('test_object', $test_object, 'cache');
+    $cache = cache_get('test_object', 'cache');
+    $this->assertTrue(isset($cache->data) && $cache->data == $test_object, 'Object is saved and restored properly.');
+  }
+
+  /**
+   * Check or a variable is stored and restored properly.
+   */
+  function checkVariable($var) {
+    cache_set('test_var', $var, 'cache');
+    $cache = cache_get('test_var', 'cache');
+    $this->assertTrue(isset($cache->data) && $cache->data === $var, format_string('@type is saved and restored properly.', array('@type' => ucfirst(gettype($var)))));
+  }
+
+  /**
+   * Test no empty cids are written in cache table.
+   */
+  function testNoEmptyCids() {
+    $this->drupalGet('user/register');
+    $this->assertFalse(cache_get(''), 'No cache entry is written with an empty cid.');
+  }
+}
+
+/**
+ * Test cache_get_multiple().
+ */
+class CacheGetMultipleUnitTest extends CacheTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Fetching multiple cache items',
+      'description' => 'Confirm that multiple records are fetched correctly.',
+      'group' => 'Cache',
+    );
+  }
+
+  function setUp() {
+    $this->default_bin = 'cache_page';
+    parent::setUp();
+  }
+
+  /**
+   * Test cache_get_multiple().
+   */
+  function testCacheMultiple() {
+    $item1 = $this->randomName(10);
+    $item2 = $this->randomName(10);
+    cache_set('item1', $item1, $this->default_bin);
+    cache_set('item2', $item2, $this->default_bin);
+    $this->assertTrue($this->checkCacheExists('item1', $item1), 'Item 1 is cached.');
+    $this->assertTrue($this->checkCacheExists('item2', $item2), 'Item 2 is cached.');
+
+    // Fetch both records from the database with cache_get_multiple().
+    $item_ids = array('item1', 'item2');
+    $items = cache_get_multiple($item_ids, $this->default_bin);
+    $this->assertEqual($items['item1']->data, $item1, 'Item was returned from cache successfully.');
+    $this->assertEqual($items['item2']->data, $item2, 'Item was returned from cache successfully.');
+
+    // Remove one item from the cache.
+    cache_clear_all('item2', $this->default_bin);
+
+    // Confirm that only one item is returned by cache_get_multiple().
+    $item_ids = array('item1', 'item2');
+    $items = cache_get_multiple($item_ids, $this->default_bin);
+    $this->assertEqual($items['item1']->data, $item1, 'Item was returned from cache successfully.');
+    $this->assertFalse(isset($items['item2']), 'Item was not returned from the cache.');
+    $this->assertTrue(count($items) == 1, 'Only valid cache entries returned.');
+  }
+}
+
+/**
+ * Test cache clearing methods.
+ */
+class CacheClearCase extends CacheTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Cache clear test',
+      'description' => 'Check our clearing is done the proper way.',
+      'group' => 'Cache'
+    );
+  }
+
+  function setUp() {
+    $this->default_bin = 'cache_page';
+    $this->default_value = $this->randomName(10);
+
+    parent::setUp();
+  }
+
+  /**
+   * Test clearing using a cid.
+   */
+  function testClearCid() {
+    cache_set('test_cid_clear', $this->default_value, $this->default_bin);
+
+    $this->assertCacheExists(t('Cache was set for clearing cid.'), $this->default_value, 'test_cid_clear');
+    cache_clear_all('test_cid_clear', $this->default_bin);
+
+    $this->assertCacheRemoved(t('Cache was removed after clearing cid.'), 'test_cid_clear');
+
+    cache_set('test_cid_clear1', $this->default_value, $this->default_bin);
+    cache_set('test_cid_clear2', $this->default_value, $this->default_bin);
+    $this->assertTrue($this->checkCacheExists('test_cid_clear1', $this->default_value)
+                      && $this->checkCacheExists('test_cid_clear2', $this->default_value),
+                      'Two caches were created for checking cid "*" with wildcard false.');
+    cache_clear_all('*', $this->default_bin);
+    $this->assertTrue($this->checkCacheExists('test_cid_clear1', $this->default_value)
+                      && $this->checkCacheExists('test_cid_clear2', $this->default_value),
+                      'Two caches still exists after clearing cid "*" with wildcard false.');
+  }
+
+  /**
+   * Test clearing using wildcard.
+   */
+  function testClearWildcard() {
+    cache_set('test_cid_clear1', $this->default_value, $this->default_bin);
+    cache_set('test_cid_clear2', $this->default_value, $this->default_bin);
+    $this->assertTrue($this->checkCacheExists('test_cid_clear1', $this->default_value)
+                      && $this->checkCacheExists('test_cid_clear2', $this->default_value),
+                      'Two caches were created for checking cid "*" with wildcard true.');
+    cache_clear_all('*', $this->default_bin, TRUE);
+    $this->assertFalse($this->checkCacheExists('test_cid_clear1', $this->default_value)
+                      || $this->checkCacheExists('test_cid_clear2', $this->default_value),
+                      'Two caches removed after clearing cid "*" with wildcard true.');
+
+    cache_set('test_cid_clear1', $this->default_value, $this->default_bin);
+    cache_set('test_cid_clear2', $this->default_value, $this->default_bin);
+    $this->assertTrue($this->checkCacheExists('test_cid_clear1', $this->default_value)
+                      && $this->checkCacheExists('test_cid_clear2', $this->default_value),
+                      'Two caches were created for checking cid substring with wildcard true.');
+    cache_clear_all('test_', $this->default_bin, TRUE);
+    $this->assertFalse($this->checkCacheExists('test_cid_clear1', $this->default_value)
+                      || $this->checkCacheExists('test_cid_clear2', $this->default_value),
+                      'Two caches removed after clearing cid substring with wildcard true.');
+  }
+
+  /**
+   * Test clearing using an array.
+   */
+  function testClearArray() {
+    // Create three cache entries.
+    cache_set('test_cid_clear1', $this->default_value, $this->default_bin);
+    cache_set('test_cid_clear2', $this->default_value, $this->default_bin);
+    cache_set('test_cid_clear3', $this->default_value, $this->default_bin);
+    $this->assertTrue($this->checkCacheExists('test_cid_clear1', $this->default_value)
+                      && $this->checkCacheExists('test_cid_clear2', $this->default_value)
+                      && $this->checkCacheExists('test_cid_clear3', $this->default_value),
+                      'Three cache entries were created.');
+
+    // Clear two entries using an array.
+    cache_clear_all(array('test_cid_clear1', 'test_cid_clear2'), $this->default_bin);
+    $this->assertFalse($this->checkCacheExists('test_cid_clear1', $this->default_value)
+                       || $this->checkCacheExists('test_cid_clear2', $this->default_value),
+                       'Two cache entries removed after clearing with an array.');
+
+    $this->assertTrue($this->checkCacheExists('test_cid_clear3', $this->default_value),
+                      'Entry was not cleared from the cache');
+
+    // Set the cache clear threshold to 2 to confirm that the full bin is cleared
+    // when the threshold is exceeded.
+    variable_set('cache_clear_threshold', 2);
+    cache_set('test_cid_clear1', $this->default_value, $this->default_bin);
+    cache_set('test_cid_clear2', $this->default_value, $this->default_bin);
+    $this->assertTrue($this->checkCacheExists('test_cid_clear1', $this->default_value)
+                      && $this->checkCacheExists('test_cid_clear2', $this->default_value),
+                      'Two cache entries were created.');
+    cache_clear_all(array('test_cid_clear1', 'test_cid_clear2', 'test_cid_clear3'), $this->default_bin);
+    $this->assertFalse($this->checkCacheExists('test_cid_clear1', $this->default_value)
+                       || $this->checkCacheExists('test_cid_clear2', $this->default_value)
+                       || $this->checkCacheExists('test_cid_clear3', $this->default_value),
+                       'All cache entries removed when the array exceeded the cache clear threshold.');
+  }
+
+  /**
+   * Test drupal_flush_all_caches().
+   */
+  function testFlushAllCaches() {
+    // Create cache entries for each flushed cache bin.
+    $bins = array('cache', 'cache_filter', 'cache_page', 'cache_boostrap', 'cache_path');
+    $bins = array_merge(module_invoke_all('flush_caches'), $bins);
+    foreach ($bins as $id => $bin) {
+      $id = 'test_cid_clear' . $id;
+      cache_set($id, $this->default_value, $bin);
+    }
+
+    // Remove all caches then make sure that they are cleared.
+    drupal_flush_all_caches();
+
+    foreach ($bins as $id => $bin) {
+      $id = 'test_cid_clear' . $id;
+      $this->assertFalse($this->checkCacheExists($id, $this->default_value, $bin), format_string('All cache entries removed from @bin.', array('@bin' => $bin)));
+    }
+  }
+
+  /**
+   * Test DrupalDatabaseCache::isValidBin().
+   */
+  function testIsValidBin() {
+    // Retrieve existing cache bins.
+    $valid_bins = array('cache', 'cache_filter', 'cache_page', 'cache_boostrap', 'cache_path');
+    $valid_bins = array_merge(module_invoke_all('flush_caches'), $valid_bins);
+    foreach ($valid_bins as $id => $bin) {
+      $cache = _cache_get_object($bin);
+      if ($cache instanceof DrupalDatabaseCache) {
+        $this->assertTrue($cache->isValidBin(), format_string('Cache bin @bin is valid.', array('@bin' => $bin)));
+      }
+    }
+
+    // Check for non-cache tables and invalid bins.
+    $invalid_bins = array('block', 'filter', 'missing_table', $this->randomName());
+    foreach ($invalid_bins as $id => $bin) {
+      $cache = _cache_get_object($bin);
+      if ($cache instanceof DrupalDatabaseCache) {
+        $this->assertFalse($cache->isValidBin(), format_string('Cache bin @bin is not valid.', array('@bin' => $bin)));
+      }
+    }
+  }
+
+  /**
+   * Test minimum cache lifetime.
+   */
+  function testMinimumCacheLifetime() {
+    // Set a minimum/maximum cache lifetime.
+    $this->setupLifetime(300);
+    // Login as a newly-created user.
+    $account = $this->drupalCreateUser(array());
+    $this->drupalLogin($account);
+
+    // Set two cache objects in different bins.
+    $data = $this->randomName(100);
+    cache_set($data, $data, 'cache', CACHE_TEMPORARY);
+    $cached = cache_get($data);
+    $this->assertTrue(isset($cached->data) && $cached->data === $data, 'Cached item retrieved.');
+    cache_set($data, $data, 'cache_page', CACHE_TEMPORARY);
+
+    // Expire temporary items in the 'page' bin.
+    cache_clear_all(NULL, 'cache_page');
+
+    // Since the database cache uses REQUEST_TIME, set the $_SESSION variable
+    // manually to force it to the current time.
+    $_SESSION['cache_expiration']['cache_page'] = time();
+
+    // Items in the default cache bin should not be expired.
+    $cached = cache_get($data);
+    $this->assertTrue(isset($cached->data) && $cached->data == $data, 'Cached item retrieved');
+
+    // Despite the minimum cache lifetime, the item in the 'page' bin should
+    // be invalidated for the current user.
+    $cached = cache_get($data, 'cache_page');
+    $this->assertFalse($cached, 'Cached item was invalidated');
+  }
+}
+
+/**
+ * Test cache_is_empty() function.
+ */
+class CacheIsEmptyCase extends CacheTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Cache emptiness test',
+      'description' => 'Check if a cache bin is empty after performing clear operations.',
+      'group' => 'Cache'
+    );
+  }
+
+  function setUp() {
+    $this->default_bin = 'cache_page';
+    $this->default_value = $this->randomName(10);
+
+    parent::setUp();
+  }
+
+  /**
+   * Test clearing using a cid.
+   */
+  function testIsEmpty() {
+    // Clear the cache bin.
+    cache_clear_all('*', $this->default_bin);
+    $this->assertTrue(cache_is_empty($this->default_bin), 'The cache bin is empty');
+    // Add some data to the cache bin.
+    cache_set($this->default_cid, $this->default_value, $this->default_bin);
+    $this->assertCacheExists(t('Cache was set.'), $this->default_value, $this->default_cid);
+    $this->assertFalse(cache_is_empty($this->default_bin), 'The cache bin is not empty');
+    // Remove the cached data.
+    cache_clear_all($this->default_cid, $this->default_bin);
+    $this->assertCacheRemoved(t('Cache was removed.'), $this->default_cid);
+    $this->assertTrue(cache_is_empty($this->default_bin), 'The cache bin is empty');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/common.test b/htmltest/modules/simpletest/tests/common.test
new file mode 100644
index 00000000..44eecdce
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/common.test
@@ -0,0 +1,2787 @@
+<?php
+
+/**
+ * @file
+ * Tests for common.inc functionality.
+ */
+
+/**
+ * Tests for URL generation functions.
+ */
+class DrupalAlterTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'drupal_alter() tests',
+      'description' => 'Confirm that alteration of arguments passed to drupal_alter() works correctly.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('common_test');
+  }
+
+  function testDrupalAlter() {
+    // This test depends on Bartik, so make sure that it is always the current
+    // active theme.
+    global $theme, $base_theme_info;
+    $theme = 'bartik';
+    $base_theme_info = array();
+
+    $array = array('foo' => 'bar');
+    $entity = new stdClass();
+    $entity->foo = 'bar';
+
+    // Verify alteration of a single argument.
+    $array_copy = $array;
+    $array_expected = array('foo' => 'Drupal theme');
+    drupal_alter('drupal_alter', $array_copy);
+    $this->assertEqual($array_copy, $array_expected, 'Single array was altered.');
+
+    $entity_copy = clone $entity;
+    $entity_expected = clone $entity;
+    $entity_expected->foo = 'Drupal theme';
+    drupal_alter('drupal_alter', $entity_copy);
+    $this->assertEqual($entity_copy, $entity_expected, 'Single object was altered.');
+
+    // Verify alteration of multiple arguments.
+    $array_copy = $array;
+    $array_expected = array('foo' => 'Drupal theme');
+    $entity_copy = clone $entity;
+    $entity_expected = clone $entity;
+    $entity_expected->foo = 'Drupal theme';
+    $array2_copy = $array;
+    $array2_expected = array('foo' => 'Drupal theme');
+    drupal_alter('drupal_alter', $array_copy, $entity_copy, $array2_copy);
+    $this->assertEqual($array_copy, $array_expected, 'First argument to drupal_alter() was altered.');
+    $this->assertEqual($entity_copy, $entity_expected, 'Second argument to drupal_alter() was altered.');
+    $this->assertEqual($array2_copy, $array2_expected, 'Third argument to drupal_alter() was altered.');
+
+    // Verify alteration order when passing an array of types to drupal_alter().
+    // common_test_module_implements_alter() places 'block' implementation after
+    // other modules.
+    $array_copy = $array;
+    $array_expected = array('foo' => 'Drupal block theme');
+    drupal_alter(array('drupal_alter', 'drupal_alter_foo'), $array_copy);
+    $this->assertEqual($array_copy, $array_expected, 'hook_TYPE_alter() implementations ran in correct order.');
+  }
+}
+
+/**
+ * Tests for URL generation functions.
+ *
+ * url() calls module_implements(), which may issue a db query, which requires
+ * inheriting from a web test case rather than a unit test case.
+ */
+class CommonURLUnitTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'URL generation tests',
+      'description' => 'Confirm that url(), drupal_get_query_parameters(), drupal_http_build_query(), and l() work correctly with various input.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Confirm that invalid text given as $path is filtered.
+   */
+  function testLXSS() {
+    $text = $this->randomName();
+    $path = "<SCRIPT>alert('XSS')</SCRIPT>";
+    $link = l($text, $path);
+    $sanitized_path = check_url(url($path));
+    $this->assertTrue(strpos($link, $sanitized_path) !== FALSE, format_string('XSS attack @path was filtered', array('@path' => $path)));
+  }
+
+  /*
+   * Tests for active class in l() function.
+   */
+  function testLActiveClass() {
+    $link = l($this->randomName(), $_GET['q']);
+    $this->assertTrue($this->hasClass($link, 'active'), format_string('Class @class is present on link to the current page', array('@class' => 'active')));
+  }
+
+  /**
+   * Tests for custom class in l() function.
+   */
+  function testLCustomClass() {
+    $class = $this->randomName();
+    $link = l($this->randomName(), $_GET['q'], array('attributes' => array('class' => array($class))));
+    $this->assertTrue($this->hasClass($link, $class), format_string('Custom class @class is present on link when requested', array('@class' => $class)));
+    $this->assertTrue($this->hasClass($link, 'active'), format_string('Class @class is present on link to the current page', array('@class' => 'active')));
+  }
+
+  private function hasClass($link, $class) {
+    return preg_match('|class="([^\"\s]+\s+)*' . $class . '|', $link);
+  }
+
+  /**
+   * Test drupal_get_query_parameters().
+   */
+  function testDrupalGetQueryParameters() {
+    $original = array(
+      'a' => 1,
+      'b' => array(
+        'd' => 4,
+        'e' => array(
+          'f' => 5,
+        ),
+      ),
+      'c' => 3,
+      'q' => 'foo/bar',
+    );
+
+    // Default arguments.
+    $result = $_GET;
+    unset($result['q']);
+    $this->assertEqual(drupal_get_query_parameters(), $result, "\$_GET['q'] was removed.");
+
+    // Default exclusion.
+    $result = $original;
+    unset($result['q']);
+    $this->assertEqual(drupal_get_query_parameters($original), $result, "'q' was removed.");
+
+    // First-level exclusion.
+    $result = $original;
+    unset($result['b']);
+    $this->assertEqual(drupal_get_query_parameters($original, array('b')), $result, "'b' was removed.");
+
+    // Second-level exclusion.
+    $result = $original;
+    unset($result['b']['d']);
+    $this->assertEqual(drupal_get_query_parameters($original, array('b[d]')), $result, "'b[d]' was removed.");
+
+    // Third-level exclusion.
+    $result = $original;
+    unset($result['b']['e']['f']);
+    $this->assertEqual(drupal_get_query_parameters($original, array('b[e][f]')), $result, "'b[e][f]' was removed.");
+
+    // Multiple exclusions.
+    $result = $original;
+    unset($result['a'], $result['b']['e'], $result['c']);
+    $this->assertEqual(drupal_get_query_parameters($original, array('a', 'b[e]', 'c')), $result, "'a', 'b[e]', 'c' were removed.");
+  }
+
+  /**
+   * Test drupal_http_build_query().
+   */
+  function testDrupalHttpBuildQuery() {
+    $this->assertEqual(drupal_http_build_query(array('a' => ' &#//+%20@۞')), 'a=%20%26%23//%2B%2520%40%DB%9E', 'Value was properly encoded.');
+    $this->assertEqual(drupal_http_build_query(array(' &#//+%20@۞' => 'a')), '%20%26%23%2F%2F%2B%2520%40%DB%9E=a', 'Key was properly encoded.');
+    $this->assertEqual(drupal_http_build_query(array('a' => '1', 'b' => '2', 'c' => '3')), 'a=1&b=2&c=3', 'Multiple values were properly concatenated.');
+    $this->assertEqual(drupal_http_build_query(array('a' => array('b' => '2', 'c' => '3'), 'd' => 'foo')), 'a[b]=2&a[c]=3&d=foo', 'Nested array was properly encoded.');
+  }
+
+  /**
+   * Test drupal_parse_url().
+   */
+  function testDrupalParseUrl() {
+    // Relative URL.
+    $url = 'foo/bar?foo=bar&bar=baz&baz#foo';
+    $result = array(
+      'path' => 'foo/bar',
+      'query' => array('foo' => 'bar', 'bar' => 'baz', 'baz' => ''),
+      'fragment' => 'foo',
+    );
+    $this->assertEqual(drupal_parse_url($url), $result, 'Relative URL parsed correctly.');
+
+    // Relative URL that is known to confuse parse_url().
+    $url = 'foo/bar:1';
+    $result = array(
+      'path' => 'foo/bar:1',
+      'query' => array(),
+      'fragment' => '',
+    );
+    $this->assertEqual(drupal_parse_url($url), $result, 'Relative URL parsed correctly.');
+
+    // Absolute URL.
+    $url = '/foo/bar?foo=bar&bar=baz&baz#foo';
+    $result = array(
+      'path' => '/foo/bar',
+      'query' => array('foo' => 'bar', 'bar' => 'baz', 'baz' => ''),
+      'fragment' => 'foo',
+    );
+    $this->assertEqual(drupal_parse_url($url), $result, 'Absolute URL parsed correctly.');
+
+    // External URL testing.
+    $url = 'http://drupal.org/foo/bar?foo=bar&bar=baz&baz#foo';
+
+    // Test that drupal can recognize an absolute URL. Used to prevent attack vectors.
+    $this->assertTrue(url_is_external($url), 'Correctly identified an external URL.');
+
+    // Test the parsing of absolute URLs.
+    $result = array(
+      'path' => 'http://drupal.org/foo/bar',
+      'query' => array('foo' => 'bar', 'bar' => 'baz', 'baz' => ''),
+      'fragment' => 'foo',
+    );
+    $this->assertEqual(drupal_parse_url($url), $result, 'External URL parsed correctly.');
+
+    // Verify proper parsing of URLs when clean URLs are disabled.
+    $result = array(
+      'path' => 'foo/bar',
+      'query' => array('bar' => 'baz'),
+      'fragment' => 'foo',
+    );
+    // Non-clean URLs #1: Absolute URL generated by url().
+    $url = $GLOBALS['base_url'] . '/?q=foo/bar&bar=baz#foo';
+    $this->assertEqual(drupal_parse_url($url), $result, 'Absolute URL with clean URLs disabled parsed correctly.');
+
+    // Non-clean URLs #2: Relative URL generated by url().
+    $url = '?q=foo/bar&bar=baz#foo';
+    $this->assertEqual(drupal_parse_url($url), $result, 'Relative URL with clean URLs disabled parsed correctly.');
+
+    // Non-clean URLs #3: URL generated by url() on non-Apache webserver.
+    $url = 'index.php?q=foo/bar&bar=baz#foo';
+    $this->assertEqual(drupal_parse_url($url), $result, 'Relative URL on non-Apache webserver with clean URLs disabled parsed correctly.');
+
+    // Test that drupal_parse_url() does not allow spoofing a URL to force a malicious redirect.
+    $parts = drupal_parse_url('forged:http://cwe.mitre.org/data/definitions/601.html');
+    $this->assertFalse(valid_url($parts['path'], TRUE), 'drupal_parse_url() correctly parsed a forged URL.');
+  }
+
+  /**
+   * Test url() with/without query, with/without fragment, absolute on/off and
+   * assert all that works when clean URLs are on and off.
+   */
+  function testUrl() {
+    global $base_url;
+
+    foreach (array(FALSE, TRUE) as $absolute) {
+      // Get the expected start of the path string.
+      $base = $absolute ? $base_url . '/' : base_path();
+      $absolute_string = $absolute ? 'absolute' : NULL;
+
+      // Disable Clean URLs.
+      $GLOBALS['conf']['clean_url'] = 0;
+
+      $url = $base . '?q=node/123';
+      $result = url('node/123', array('absolute' => $absolute));
+      $this->assertEqual($url, $result, "$url == $result");
+
+      $url = $base . '?q=node/123#foo';
+      $result = url('node/123', array('fragment' => 'foo', 'absolute' => $absolute));
+      $this->assertEqual($url, $result, "$url == $result");
+
+      $url = $base . '?q=node/123&foo';
+      $result = url('node/123', array('query' => array('foo' => NULL), 'absolute' => $absolute));
+      $this->assertEqual($url, $result, "$url == $result");
+
+      $url = $base . '?q=node/123&foo=bar&bar=baz';
+      $result = url('node/123', array('query' => array('foo' => 'bar', 'bar' => 'baz'), 'absolute' => $absolute));
+      $this->assertEqual($url, $result, "$url == $result");
+
+      $url = $base . '?q=node/123&foo#bar';
+      $result = url('node/123', array('query' => array('foo' => NULL), 'fragment' => 'bar', 'absolute' => $absolute));
+      $this->assertEqual($url, $result, "$url == $result");
+
+      $url = $base . '?q=node/123&foo#0';
+      $result = url('node/123', array('query' => array('foo' => NULL), 'fragment' => '0', 'absolute' => $absolute));
+      $this->assertEqual($url, $result, "$url == $result");
+
+      $url = $base . '?q=node/123&foo';
+      $result = url('node/123', array('query' => array('foo' => NULL), 'fragment' => '', 'absolute' => $absolute));
+      $this->assertEqual($url, $result, "$url == $result");
+
+      $url = $base;
+      $result = url('<front>', array('absolute' => $absolute));
+      $this->assertEqual($url, $result, "$url == $result");
+
+      // Enable Clean URLs.
+      $GLOBALS['conf']['clean_url'] = 1;
+
+      $url = $base . 'node/123';
+      $result = url('node/123', array('absolute' => $absolute));
+      $this->assertEqual($url, $result, "$url == $result");
+
+      $url = $base . 'node/123#foo';
+      $result = url('node/123', array('fragment' => 'foo', 'absolute' => $absolute));
+      $this->assertEqual($url, $result, "$url == $result");
+
+      $url = $base . 'node/123?foo';
+      $result = url('node/123', array('query' => array('foo' => NULL), 'absolute' => $absolute));
+      $this->assertEqual($url, $result, "$url == $result");
+
+      $url = $base . 'node/123?foo=bar&bar=baz';
+      $result = url('node/123', array('query' => array('foo' => 'bar', 'bar' => 'baz'), 'absolute' => $absolute));
+      $this->assertEqual($url, $result, "$url == $result");
+
+      $url = $base . 'node/123?foo#bar';
+      $result = url('node/123', array('query' => array('foo' => NULL), 'fragment' => 'bar', 'absolute' => $absolute));
+      $this->assertEqual($url, $result, "$url == $result");
+
+      $url = $base;
+      $result = url('<front>', array('absolute' => $absolute));
+      $this->assertEqual($url, $result, "$url == $result");
+    }
+  }
+
+  /**
+   * Test external URL handling.
+   */
+  function testExternalUrls() {
+    $test_url = 'http://drupal.org/';
+
+    // Verify external URL can contain a fragment.
+    $url = $test_url . '#drupal';
+    $result = url($url);
+    $this->assertEqual($url, $result, 'External URL with fragment works without a fragment in $options.');
+
+    // Verify fragment can be overidden in an external URL.
+    $url = $test_url . '#drupal';
+    $fragment = $this->randomName(10);
+    $result = url($url, array('fragment' => $fragment));
+    $this->assertEqual($test_url . '#' . $fragment, $result, 'External URL fragment is overidden with a custom fragment in $options.');
+
+    // Verify external URL can contain a query string.
+    $url = $test_url . '?drupal=awesome';
+    $result = url($url);
+    $this->assertEqual($url, $result, 'External URL with query string works without a query string in $options.');
+
+    // Verify external URL can be extended with a query string.
+    $url = $test_url;
+    $query = array($this->randomName(5) => $this->randomName(5));
+    $result = url($url, array('query' => $query));
+    $this->assertEqual($url . '?' . http_build_query($query, '', '&'), $result, 'External URL can be extended with a query string in $options.');
+
+    // Verify query string can be extended in an external URL.
+    $url = $test_url . '?drupal=awesome';
+    $query = array($this->randomName(5) => $this->randomName(5));
+    $result = url($url, array('query' => $query));
+    $this->assertEqual($url . '&' . http_build_query($query, '', '&'), $result, 'External URL query string can be extended with a custom query string in $options.');
+  }
+}
+
+/**
+ * Tests for check_plain(), filter_xss(), format_string(), and check_url().
+ */
+class CommonXssUnitTest extends DrupalUnitTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'String filtering tests',
+      'description' => 'Confirm that check_plain(), filter_xss(), format_string() and check_url() work correctly, including invalid multi-byte sequences.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Check that invalid multi-byte sequences are rejected.
+   */
+  function testInvalidMultiByte() {
+     // Ignore PHP 5.3+ invalid multibyte sequence warning.
+     $text = @check_plain("Foo\xC0barbaz");
+     $this->assertEqual($text, '', 'check_plain() rejects invalid sequence "Foo\xC0barbaz"');
+     // Ignore PHP 5.3+ invalid multibyte sequence warning.
+     $text = @check_plain("\xc2\"");
+     $this->assertEqual($text, '', 'check_plain() rejects invalid sequence "\xc2\""');
+     $text = check_plain("Fooÿñ");
+     $this->assertEqual($text, "Fooÿñ", 'check_plain() accepts valid sequence "Fooÿñ"');
+     $text = filter_xss("Foo\xC0barbaz");
+     $this->assertEqual($text, '', 'filter_xss() rejects invalid sequence "Foo\xC0barbaz"');
+     $text = filter_xss("Fooÿñ");
+     $this->assertEqual($text, "Fooÿñ", 'filter_xss() accepts valid sequence Fooÿñ');
+  }
+
+  /**
+   * Check that special characters are escaped.
+   */
+  function testEscaping() {
+     $text = check_plain("<script>");
+     $this->assertEqual($text, '&lt;script&gt;', 'check_plain() escapes &lt;script&gt;');
+     $text = check_plain('<>&"\'');
+     $this->assertEqual($text, '&lt;&gt;&amp;&quot;&#039;', 'check_plain() escapes reserved HTML characters.');
+  }
+
+  /**
+   * Test t() and format_string() replacement functionality.
+   */
+  function testFormatStringAndT() {
+    foreach (array('format_string', 't') as $function) {
+      $text = $function('Simple text');
+      $this->assertEqual($text, 'Simple text', $function . ' leaves simple text alone.');
+      $text = $function('Escaped text: @value', array('@value' => '<script>'));
+      $this->assertEqual($text, 'Escaped text: &lt;script&gt;', $function . ' replaces and escapes string.');
+      $text = $function('Placeholder text: %value', array('%value' => '<script>'));
+      $this->assertEqual($text, 'Placeholder text: <em class="placeholder">&lt;script&gt;</em>', $function . ' replaces, escapes and themes string.');
+      $text = $function('Verbatim text: !value', array('!value' => '<script>'));
+      $this->assertEqual($text, 'Verbatim text: <script>', $function . ' replaces verbatim string as-is.');
+    }
+  }
+
+  /**
+   * Check that harmful protocols are stripped.
+   */
+  function testBadProtocolStripping() {
+    // Ensure that check_url() strips out harmful protocols, and encodes for
+    // HTML. Ensure drupal_strip_dangerous_protocols() can be used to return a
+    // plain-text string stripped of harmful protocols.
+    $url = 'javascript:http://www.example.com/?x=1&y=2';
+    $expected_plain = 'http://www.example.com/?x=1&y=2';
+    $expected_html = 'http://www.example.com/?x=1&amp;y=2';
+    $this->assertIdentical(check_url($url), $expected_html, 'check_url() filters a URL and encodes it for HTML.');
+    $this->assertIdentical(drupal_strip_dangerous_protocols($url), $expected_plain, 'drupal_strip_dangerous_protocols() filters a URL and returns plain text.');
+  }
+}
+
+/**
+ * Tests file size parsing and formatting functions.
+ */
+class CommonSizeTestCase extends DrupalUnitTestCase {
+  protected $exact_test_cases;
+  protected $rounded_test_cases;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Size parsing test',
+      'description' => 'Parse a predefined amount of bytes and compare the output with the expected value.',
+      'group' => 'System'
+    );
+  }
+
+  function setUp() {
+    $kb = DRUPAL_KILOBYTE;
+    $this->exact_test_cases = array(
+      '1 byte' => 1,
+      '1 KB'   => $kb,
+      '1 MB'   => $kb * $kb,
+      '1 GB'   => $kb * $kb * $kb,
+      '1 TB'   => $kb * $kb * $kb * $kb,
+      '1 PB'   => $kb * $kb * $kb * $kb * $kb,
+      '1 EB'   => $kb * $kb * $kb * $kb * $kb * $kb,
+      '1 ZB'   => $kb * $kb * $kb * $kb * $kb * $kb * $kb,
+      '1 YB'   => $kb * $kb * $kb * $kb * $kb * $kb * $kb * $kb,
+    );
+    $this->rounded_test_cases = array(
+      '2 bytes' => 2,
+      '1 MB' => ($kb * $kb) - 1, // rounded to 1 MB (not 1000 or 1024 kilobyte!)
+      round(3623651 / ($this->exact_test_cases['1 MB']), 2) . ' MB' => 3623651, // megabytes
+      round(67234178751368124 / ($this->exact_test_cases['1 PB']), 2) . ' PB' => 67234178751368124, // petabytes
+      round(235346823821125814962843827 / ($this->exact_test_cases['1 YB']), 2) . ' YB' => 235346823821125814962843827, // yottabytes
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Check that format_size() returns the expected string.
+   */
+  function testCommonFormatSize() {
+    foreach (array($this->exact_test_cases, $this->rounded_test_cases) as $test_cases) {
+      foreach ($test_cases as $expected => $input) {
+        $this->assertEqual(
+          ($result = format_size($input, NULL)),
+          $expected,
+          $expected . ' == ' . $result . ' (' . $input . ' bytes)'
+        );
+      }
+    }
+  }
+
+  /**
+   * Check that parse_size() returns the proper byte sizes.
+   */
+  function testCommonParseSize() {
+    foreach ($this->exact_test_cases as $string => $size) {
+      $this->assertEqual(
+        $parsed_size = parse_size($string),
+        $size,
+        $size . ' == ' . $parsed_size . ' (' . $string . ')'
+      );
+    }
+
+    // Some custom parsing tests
+    $string = '23476892 bytes';
+    $this->assertEqual(
+      ($parsed_size = parse_size($string)),
+      $size = 23476892,
+      $string . ' == ' . $parsed_size . ' bytes'
+    );
+    $string = '76MRandomStringThatShouldBeIgnoredByParseSize.'; // 76 MB
+    $this->assertEqual(
+      $parsed_size = parse_size($string),
+      $size = 79691776,
+      $string . ' == ' . $parsed_size . ' bytes'
+    );
+    $string = '76.24 Giggabyte'; // Misspeld text -> 76.24 GB
+    $this->assertEqual(
+      $parsed_size = parse_size($string),
+      $size = 81862076662,
+      $string . ' == ' . $parsed_size . ' bytes'
+    );
+  }
+
+  /**
+   * Cross-test parse_size() and format_size().
+   */
+  function testCommonParseSizeFormatSize() {
+    foreach ($this->exact_test_cases as $size) {
+      $this->assertEqual(
+        $size,
+        ($parsed_size = parse_size($string = format_size($size, NULL))),
+        $size . ' == ' . $parsed_size . ' (' . $string . ')'
+      );
+    }
+  }
+}
+
+/**
+ * Test drupal_explode_tags() and drupal_implode_tags().
+ */
+class DrupalTagsHandlingTestCase extends DrupalUnitTestCase {
+  var $validTags = array(
+    'Drupal' => 'Drupal',
+    'Drupal with some spaces' => 'Drupal with some spaces',
+    '"Legendary Drupal mascot of doom: ""Druplicon"""' => 'Legendary Drupal mascot of doom: "Druplicon"',
+    '"Drupal, although it rhymes with sloopal, is as awesome as a troopal!"' => 'Drupal, although it rhymes with sloopal, is as awesome as a troopal!',
+  );
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Drupal tags handling',
+      'description' => "Performs tests on Drupal's handling of tags, both explosion and implosion tactics used.",
+      'group' => 'System'
+    );
+  }
+
+  /**
+   * Explode a series of tags.
+   */
+  function testDrupalExplodeTags() {
+    $string = implode(', ', array_keys($this->validTags));
+    $tags = drupal_explode_tags($string);
+    $this->assertTags($tags);
+  }
+
+  /**
+   * Implode a series of tags.
+   */
+  function testDrupalImplodeTags() {
+    $tags = array_values($this->validTags);
+    // Let's explode and implode to our heart's content.
+    for ($i = 0; $i < 10; $i++) {
+      $string = drupal_implode_tags($tags);
+      $tags = drupal_explode_tags($string);
+    }
+    $this->assertTags($tags);
+  }
+
+  /**
+   * Helper function: asserts that the ending array of tags is what we wanted.
+   */
+  function assertTags($tags) {
+    $original = $this->validTags;
+    foreach ($tags as $tag) {
+      $key = array_search($tag, $original);
+      $this->assertTrue($key, format_string('Make sure tag %tag shows up in the final tags array (originally %original)', array('%tag' => $tag, '%original' => $key)));
+      unset($original[$key]);
+    }
+    foreach ($original as $leftover) {
+      $this->fail(format_string('Leftover tag %leftover was left over.', array('%leftover' => $leftover)));
+    }
+  }
+}
+
+/**
+ * Test the Drupal CSS system.
+ */
+class CascadingStylesheetsTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Cascading stylesheets',
+      'description' => 'Tests adding various cascading stylesheets to the page.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('php', 'locale', 'common_test');
+    // Reset drupal_add_css() before each test.
+    drupal_static_reset('drupal_add_css');
+  }
+
+  /**
+   * Check default stylesheets as empty.
+   */
+  function testDefault() {
+    $this->assertEqual(array(), drupal_add_css(), 'Default CSS is empty.');
+  }
+
+  /**
+   * Test that stylesheets in module .info files are loaded.
+   */
+  function testModuleInfo() {
+    $this->drupalGet('');
+
+    // Verify common_test.css in a STYLE media="all" tag.
+    $elements = $this->xpath('//style[@media=:media and contains(text(), :filename)]', array(
+      ':media' => 'all',
+      ':filename' => 'tests/common_test.css',
+    ));
+    $this->assertTrue(count($elements), "Stylesheet with media 'all' in module .info file found.");
+
+    // Verify common_test.print.css in a STYLE media="print" tag.
+    $elements = $this->xpath('//style[@media=:media and contains(text(), :filename)]', array(
+      ':media' => 'print',
+      ':filename' => 'tests/common_test.print.css',
+    ));
+    $this->assertTrue(count($elements), "Stylesheet with media 'print' in module .info file found.");
+  }
+
+  /**
+   * Tests adding a file stylesheet.
+   */
+  function testAddFile() {
+    $path = drupal_get_path('module', 'simpletest') . '/simpletest.css';
+    $css = drupal_add_css($path);
+    $this->assertEqual($css[$path]['data'], $path, 'Adding a CSS file caches it properly.');
+  }
+
+  /**
+   * Tests adding an external stylesheet.
+   */
+  function testAddExternal() {
+    $path = 'http://example.com/style.css';
+    $css = drupal_add_css($path, 'external');
+    $this->assertEqual($css[$path]['type'], 'external', 'Adding an external CSS file caches it properly.');
+  }
+
+  /**
+   * Makes sure that reseting the CSS empties the cache.
+   */
+  function testReset() {
+    drupal_static_reset('drupal_add_css');
+    $this->assertEqual(array(), drupal_add_css(), 'Resetting the CSS empties the cache.');
+  }
+
+  /**
+   * Tests rendering the stylesheets.
+   */
+  function testRenderFile() {
+    $css = drupal_get_path('module', 'simpletest') . '/simpletest.css';
+    drupal_add_css($css);
+    $styles = drupal_get_css();
+    $this->assertTrue(strpos($styles, $css) > 0, 'Rendered CSS includes the added stylesheet.');
+  }
+
+  /**
+   * Tests rendering an external stylesheet.
+   */
+  function testRenderExternal() {
+    $css = 'http://example.com/style.css';
+    drupal_add_css($css, 'external');
+    $styles = drupal_get_css();
+    // Stylesheet URL may be the href of a LINK tag or in an @import statement
+    // of a STYLE tag.
+    $this->assertTrue(strpos($styles, 'href="' . $css) > 0 || strpos($styles, '@import url("' . $css . '")') > 0, 'Rendering an external CSS file.');
+  }
+
+  /**
+   * Tests rendering inline stylesheets with preprocessing on.
+   */
+  function testRenderInlinePreprocess() {
+    $css = 'body { padding: 0px; }';
+    $css_preprocessed = '<style type="text/css" media="all">' . "\n<!--/*--><![CDATA[/*><!--*/\n" . drupal_load_stylesheet_content($css, TRUE) . "\n/*]]>*/-->\n" . '</style>';
+    drupal_add_css($css, array('type' => 'inline'));
+    $styles = drupal_get_css();
+    $this->assertEqual(trim($styles), $css_preprocessed, 'Rendering preprocessed inline CSS adds it to the page.');
+  }
+
+  /**
+   * Tests removing charset when rendering stylesheets with preprocessing on.
+   */
+  function testRenderRemoveCharsetPreprocess() {
+    $cases = array(
+      array(
+        'asset' => '@charset "UTF-8";html{font-family:"sans-serif";}',
+        'expected' => 'html{font-family:"sans-serif";}',
+      ),
+      // This asset contains extra \n character.
+      array(
+        'asset' => "@charset 'UTF-8';\nhtml{font-family:'sans-serif';}",
+        'expected' => "\nhtml{font-family:'sans-serif';}",
+      ),
+    );
+
+    foreach ($cases as $case) {
+      $this->assertEqual(
+        $case['expected'],
+        drupal_load_stylesheet_content($case['asset']),
+        'CSS optimizing correctly removes the charset declaration.'
+      );
+    }
+  }
+
+  /**
+   * Tests rendering inline stylesheets with preprocessing off.
+   */
+  function testRenderInlineNoPreprocess() {
+    $css = 'body { padding: 0px; }';
+    drupal_add_css($css, array('type' => 'inline', 'preprocess' => FALSE));
+    $styles = drupal_get_css();
+    $this->assertTrue(strpos($styles, $css) > 0, 'Rendering non-preprocessed inline CSS adds it to the page.');
+  }
+
+  /**
+   * Tests rendering inline stylesheets through a full page request.
+   */
+  function testRenderInlineFullPage() {
+    $css = 'body { font-size: 254px; }';
+    // Inline CSS is minified unless 'preprocess' => FALSE is passed as a
+    // drupal_add_css() option.
+    $expected = 'body{font-size:254px;}';
+
+    // Create a node, using the PHP filter that tests drupal_add_css().
+    $php_format_id = 'php_code';
+    $settings = array(
+      'type' => 'page',
+      'body' => array(
+        LANGUAGE_NONE => array(
+          array(
+            'value' => t('This tests the inline CSS!') . "<?php drupal_add_css('$css', 'inline'); ?>",
+            'format' => $php_format_id,
+          ),
+        ),
+      ),
+      'promote' => 1,
+    );
+    $node = $this->drupalCreateNode($settings);
+
+    // Fetch the page.
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertRaw($expected, 'Inline stylesheets appear in the full page rendering.');
+  }
+
+  /**
+   * Test CSS ordering.
+   */
+  function testRenderOrder() {
+    // A module CSS file.
+    drupal_add_css(drupal_get_path('module', 'simpletest') . '/simpletest.css');
+    // A few system CSS files, ordered in a strange way.
+    $system_path = drupal_get_path('module', 'system');
+    drupal_add_css($system_path . '/system.menus.css', array('group' => CSS_SYSTEM));
+    drupal_add_css($system_path . '/system.base.css', array('group' => CSS_SYSTEM, 'weight' => -10));
+    drupal_add_css($system_path . '/system.theme.css', array('group' => CSS_SYSTEM));
+
+    $expected = array(
+      $system_path . '/system.base.css',
+      $system_path . '/system.menus.css',
+      $system_path . '/system.theme.css',
+      drupal_get_path('module', 'simpletest') . '/simpletest.css',
+    );
+
+
+    $styles = drupal_get_css();
+    // Stylesheet URL may be the href of a LINK tag or in an @import statement
+    // of a STYLE tag.
+    if (preg_match_all('/(href="|url\(")' . preg_quote($GLOBALS['base_url'] . '/', '/') . '([^?]+)\?/', $styles, $matches)) {
+      $result = $matches[2];
+    }
+    else {
+      $result = array();
+    }
+
+    $this->assertIdentical($result, $expected, 'The CSS files are in the expected order.');
+  }
+
+  /**
+   * Test CSS override.
+   */
+  function testRenderOverride() {
+    $system = drupal_get_path('module', 'system');
+    $simpletest = drupal_get_path('module', 'simpletest');
+
+    drupal_add_css($system . '/system.base.css');
+    drupal_add_css($simpletest . '/tests/system.base.css');
+
+    // The dummy stylesheet should be the only one included.
+    $styles = drupal_get_css();
+    $this->assert(strpos($styles, $simpletest . '/tests/system.base.css') !== FALSE, 'The overriding CSS file is output.');
+    $this->assert(strpos($styles, $system . '/system.base.css') === FALSE, 'The overridden CSS file is not output.');
+
+    drupal_add_css($simpletest . '/tests/system.base.css');
+    drupal_add_css($system . '/system.base.css');
+
+    // The standard stylesheet should be the only one included.
+    $styles = drupal_get_css();
+    $this->assert(strpos($styles, $system . '/system.base.css') !== FALSE, 'The overriding CSS file is output.');
+    $this->assert(strpos($styles, $simpletest . '/tests/system.base.css') === FALSE, 'The overridden CSS file is not output.');
+  }
+
+  /**
+   * Tests Locale module's CSS Alter to include RTL overrides.
+   */
+  function testAlter() {
+    // Switch the language to a right to left language and add system.base.css.
+    global $language;
+    $language->direction = LANGUAGE_RTL;
+    $path = drupal_get_path('module', 'system');
+    drupal_add_css($path . '/system.base.css');
+
+    // Check to see if system.base-rtl.css was also added.
+    $styles = drupal_get_css();
+    $this->assert(strpos($styles, $path . '/system.base-rtl.css') !== FALSE, 'CSS is alterable as right to left overrides are added.');
+
+    // Change the language back to left to right.
+    $language->direction = LANGUAGE_LTR;
+  }
+
+  /**
+   * Tests that the query string remains intact when adding CSS files that have
+   * query string parameters.
+   */
+  function testAddCssFileWithQueryString() {
+    $this->drupalGet('common-test/query-string');
+    $query_string = variable_get('css_js_query_string', '0');
+    $this->assertRaw(drupal_get_path('module', 'node') . '/node.css?' . $query_string, 'Query string was appended correctly to css.');
+    $this->assertRaw(drupal_get_path('module', 'node') . '/node-fake.css?arg1=value1&amp;arg2=value2', 'Query string not escaped on a URI.');
+  }
+}
+
+/**
+ * Test for cleaning HTML identifiers.
+ */
+class DrupalHTMLIdentifierTestCase extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'HTML identifiers',
+      'description' => 'Test the functions drupal_html_class(), drupal_html_id() and drupal_clean_css_identifier() for expected behavior',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Tests that drupal_clean_css_identifier() cleans the identifier properly.
+   */
+  function testDrupalCleanCSSIdentifier() {
+    // Verify that no valid ASCII characters are stripped from the identifier.
+    $identifier = 'abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789';
+    $this->assertIdentical(drupal_clean_css_identifier($identifier, array()), $identifier, 'Verify valid ASCII characters pass through.');
+
+    // Verify that valid UTF-8 characters are not stripped from the identifier.
+    $identifier = '¡¢£¤¥';
+    $this->assertIdentical(drupal_clean_css_identifier($identifier, array()), $identifier, 'Verify valid UTF-8 characters pass through.');
+
+    // Verify that invalid characters (including non-breaking space) are stripped from the identifier.
+    $this->assertIdentical(drupal_clean_css_identifier('invalid !"#$%&\'()*+,./:;<=>?@[\\]^`{|}~ identifier', array()), 'invalididentifier', 'Strip invalid characters.');
+  }
+
+  /**
+   * Tests that drupal_html_class() cleans the class name properly.
+   */
+  function testDrupalHTMLClass() {
+    // Verify Drupal coding standards are enforced.
+    $this->assertIdentical(drupal_html_class('CLASS NAME_[Ü]'), 'class-name--ü', 'Enforce Drupal coding standards.');
+  }
+
+  /**
+   * Tests that drupal_html_id() cleans the ID properly.
+   */
+  function testDrupalHTMLId() {
+    // Verify that letters, digits, and hyphens are not stripped from the ID.
+    $id = 'abcdefghijklmnopqrstuvwxyz-0123456789';
+    $this->assertIdentical(drupal_html_id($id), $id, 'Verify valid characters pass through.');
+
+    // Verify that invalid characters are stripped from the ID.
+    $this->assertIdentical(drupal_html_id('invalid,./:@\\^`{Üidentifier'), 'invalididentifier', 'Strip invalid characters.');
+
+    // Verify Drupal coding standards are enforced.
+    $this->assertIdentical(drupal_html_id('ID NAME_[1]'), 'id-name-1', 'Enforce Drupal coding standards.');
+
+    // Reset the static cache so we can ensure the unique id count is at zero.
+    drupal_static_reset('drupal_html_id');
+
+    // Clean up IDs with invalid starting characters.
+    $this->assertIdentical(drupal_html_id('test-unique-id'), 'test-unique-id', 'Test the uniqueness of IDs #1.');
+    $this->assertIdentical(drupal_html_id('test-unique-id'), 'test-unique-id--2', 'Test the uniqueness of IDs #2.');
+    $this->assertIdentical(drupal_html_id('test-unique-id'), 'test-unique-id--3', 'Test the uniqueness of IDs #3.');
+  }
+}
+
+/**
+ * CSS Unit Tests.
+ */
+class CascadingStylesheetsUnitTest extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'CSS Unit Tests',
+      'description' => 'Unit tests on CSS functions like aggregation.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Tests basic CSS loading with and without optimization via drupal_load_stylesheet().
+   *
+   * Known tests:
+   * - Retain white-space in selectors. (http://drupal.org/node/472820)
+   * - Proper URLs in imported files. (http://drupal.org/node/265719)
+   * - Retain pseudo-selectors. (http://drupal.org/node/460448)
+   */
+  function testLoadCssBasic() {
+    // Array of files to test living in 'simpletest/files/css_test_files/'.
+    // - Original: name.css
+    // - Unoptimized expected content: name.css.unoptimized.css
+    // - Optimized expected content: name.css.optimized.css
+    $testfiles = array(
+      'css_input_without_import.css',
+      'css_input_with_import.css',
+      'css_subfolder/css_input_with_import.css',
+      'comment_hacks.css'
+    );
+    $path = drupal_get_path('module', 'simpletest') . '/files/css_test_files';
+    foreach ($testfiles as $file) {
+      $file_path = $path . '/' . $file;
+      $file_url = $GLOBALS['base_url'] . '/' . $file_path;
+
+      $expected = file_get_contents($file_path . '.unoptimized.css');
+      $unoptimized_output = drupal_load_stylesheet($file_path, FALSE);
+      $this->assertEqual($unoptimized_output, $expected, format_string('Unoptimized CSS file has expected contents (@file)', array('@file' => $file)));
+
+      $expected = file_get_contents($file_path . '.optimized.css');
+      $optimized_output = drupal_load_stylesheet($file_path, TRUE);
+      $this->assertEqual($optimized_output, $expected, format_string('Optimized CSS file has expected contents (@file)', array('@file' => $file)));
+
+      // Repeat the tests by accessing the stylesheets by URL.
+      $expected = file_get_contents($file_path . '.unoptimized.css');
+      $unoptimized_output_url = drupal_load_stylesheet($file_url, FALSE);
+      $this->assertEqual($unoptimized_output_url, $expected, format_string('Unoptimized CSS file (loaded from an URL) has expected contents (@file)', array('@file' => $file)));
+
+      $expected = file_get_contents($file_path . '.optimized.css');
+      $optimized_output_url = drupal_load_stylesheet($file_url, TRUE);
+      $this->assertEqual($optimized_output_url, $expected, format_string('Optimized CSS file (loaded from an URL) has expected contents (@file)', array('@file' => $file)));
+    }
+  }
+}
+
+/**
+ * Test drupal_http_request().
+ */
+class DrupalHTTPRequestTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Drupal HTTP request',
+      'description' => "Performs tests on Drupal's HTTP request mechanism.",
+      'group' => 'System'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('system_test', 'locale');
+  }
+
+  function testDrupalHTTPRequest() {
+    global $is_https;
+
+    // Parse URL schema.
+    $missing_scheme = drupal_http_request('example.com/path');
+    $this->assertEqual($missing_scheme->code, -1002, 'Returned with "-1002" error code.');
+    $this->assertEqual($missing_scheme->error, 'missing schema', 'Returned with "missing schema" error message.');
+
+    $unable_to_parse = drupal_http_request('http:///path');
+    $this->assertEqual($unable_to_parse->code, -1001, 'Returned with "-1001" error code.');
+    $this->assertEqual($unable_to_parse->error, 'unable to parse URL', 'Returned with "unable to parse URL" error message.');
+
+    // Fetch page.
+    $result = drupal_http_request(url('node', array('absolute' => TRUE)));
+    $this->assertEqual($result->code, 200, 'Fetched page successfully.');
+    $this->drupalSetContent($result->data);
+    $this->assertTitle(t('Welcome to @site-name | @site-name', array('@site-name' => variable_get('site_name', 'Drupal'))), 'Site title matches.');
+
+    // Test that code and status message is returned.
+    $result = drupal_http_request(url('pagedoesnotexist', array('absolute' => TRUE)));
+    $this->assertTrue(!empty($result->protocol),  'Result protocol is returned.');
+    $this->assertEqual($result->code, '404', 'Result code is 404');
+    $this->assertEqual($result->status_message, 'Not Found', 'Result status message is "Not Found"');
+
+    // Skip the timeout tests when the testing environment is HTTPS because
+    // stream_set_timeout() does not work for SSL connections.
+    // @link http://bugs.php.net/bug.php?id=47929
+    if (!$is_https) {
+      // Test that timeout is respected. The test machine is expected to be able
+      // to make the connection (i.e. complete the fsockopen()) in 2 seconds and
+      // return within a total of 5 seconds. If the test machine is extremely
+      // slow, the test will fail. fsockopen() has been seen to time out in
+      // slightly less than the specified timeout, so allow a little slack on
+      // the minimum expected time (i.e. 1.8 instead of 2).
+      timer_start(__METHOD__);
+      $result = drupal_http_request(url('system-test/sleep/10', array('absolute' => TRUE)), array('timeout' => 2));
+      $time = timer_read(__METHOD__) / 1000;
+      $this->assertTrue(1.8 < $time && $time < 5, format_string('Request timed out (%time seconds).', array('%time' => $time)));
+      $this->assertTrue($result->error, 'An error message was returned.');
+      $this->assertEqual($result->code, HTTP_REQUEST_TIMEOUT, 'Proper error code was returned.');
+    }
+  }
+
+  function testDrupalHTTPRequestBasicAuth() {
+    $username = $this->randomName();
+    $password = $this->randomName();
+    $url = url('system-test/auth', array('absolute' => TRUE));
+
+    $auth = str_replace('://', '://' . $username . ':' . $password . '@', $url);
+    $result = drupal_http_request($auth);
+
+    $this->drupalSetContent($result->data);
+    $this->assertRaw($username, '$_SERVER["PHP_AUTH_USER"] is passed correctly.');
+    $this->assertRaw($password, '$_SERVER["PHP_AUTH_PW"] is passed correctly.');
+  }
+
+  function testDrupalHTTPRequestRedirect() {
+    $redirect_301 = drupal_http_request(url('system-test/redirect/301', array('absolute' => TRUE)), array('max_redirects' => 1));
+    $this->assertEqual($redirect_301->redirect_code, 301, 'drupal_http_request follows the 301 redirect.');
+
+    $redirect_301 = drupal_http_request(url('system-test/redirect/301', array('absolute' => TRUE)), array('max_redirects' => 0));
+    $this->assertFalse(isset($redirect_301->redirect_code), 'drupal_http_request does not follow 301 redirect if max_redirects = 0.');
+
+    $redirect_invalid = drupal_http_request(url('system-test/redirect-noscheme', array('absolute' => TRUE)), array('max_redirects' => 1));
+    $this->assertEqual($redirect_invalid->code, -1002, format_string('301 redirect to invalid URL returned with error code !error.', array('!error' => $redirect_invalid->error)));
+    $this->assertEqual($redirect_invalid->error, 'missing schema', format_string('301 redirect to invalid URL returned with error message "!error".', array('!error' => $redirect_invalid->error)));
+
+    $redirect_invalid = drupal_http_request(url('system-test/redirect-noparse', array('absolute' => TRUE)), array('max_redirects' => 1));
+    $this->assertEqual($redirect_invalid->code, -1001, format_string('301 redirect to invalid URL returned with error message code "!error".', array('!error' => $redirect_invalid->error)));
+    $this->assertEqual($redirect_invalid->error, 'unable to parse URL', format_string('301 redirect to invalid URL returned with error message "!error".', array('!error' => $redirect_invalid->error)));
+
+    $redirect_invalid = drupal_http_request(url('system-test/redirect-invalid-scheme', array('absolute' => TRUE)), array('max_redirects' => 1));
+    $this->assertEqual($redirect_invalid->code, -1003, format_string('301 redirect to invalid URL returned with error code !error.', array('!error' => $redirect_invalid->error)));
+    $this->assertEqual($redirect_invalid->error, 'invalid schema ftp', format_string('301 redirect to invalid URL returned with error message "!error".', array('!error' => $redirect_invalid->error)));
+
+    $redirect_302 = drupal_http_request(url('system-test/redirect/302', array('absolute' => TRUE)), array('max_redirects' => 1));
+    $this->assertEqual($redirect_302->redirect_code, 302, 'drupal_http_request follows the 302 redirect.');
+
+    $redirect_302 = drupal_http_request(url('system-test/redirect/302', array('absolute' => TRUE)), array('max_redirects' => 0));
+    $this->assertFalse(isset($redirect_302->redirect_code), 'drupal_http_request does not follow 302 redirect if $retry = 0.');
+
+    $redirect_307 = drupal_http_request(url('system-test/redirect/307', array('absolute' => TRUE)), array('max_redirects' => 1));
+    $this->assertEqual($redirect_307->redirect_code, 307, 'drupal_http_request follows the 307 redirect.');
+
+    $redirect_307 = drupal_http_request(url('system-test/redirect/307', array('absolute' => TRUE)), array('max_redirects' => 0));
+    $this->assertFalse(isset($redirect_307->redirect_code), 'drupal_http_request does not follow 307 redirect if max_redirects = 0.');
+
+    $multiple_redirect_final_url = url('system-test/multiple-redirects/0', array('absolute' => TRUE));
+    $multiple_redirect_1 = drupal_http_request(url('system-test/multiple-redirects/1', array('absolute' => TRUE)), array('max_redirects' => 1));
+    $this->assertEqual($multiple_redirect_1->redirect_url, $multiple_redirect_final_url, 'redirect_url contains the final redirection location after 1 redirect.');
+
+    $multiple_redirect_3 = drupal_http_request(url('system-test/multiple-redirects/3', array('absolute' => TRUE)), array('max_redirects' => 3));
+    $this->assertEqual($multiple_redirect_3->redirect_url, $multiple_redirect_final_url, 'redirect_url contains the final redirection location after 3 redirects.');
+  }
+
+  /**
+   * Tests Content-language headers generated by Drupal.
+   */
+  function testDrupalHTTPRequestHeaders() {
+    // Check the default header.
+    $request = drupal_http_request(url('<front>', array('absolute' => TRUE)));
+    $this->assertEqual($request->headers['content-language'], 'en', 'Content-Language HTTP header is English.');
+
+    // Add German language and set as default.
+    locale_add_language('de', 'German', 'Deutsch', LANGUAGE_LTR, '', '', TRUE, TRUE);
+
+    // Request front page and check for matching Content-Language.
+    $request = drupal_http_request(url('<front>', array('absolute' => TRUE)));
+    $this->assertEqual($request->headers['content-language'], 'de', 'Content-Language HTTP header is German.');
+  }
+}
+
+/**
+ * Testing drupal_add_region_content and drupal_get_region_content.
+ */
+class DrupalSetContentTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Drupal set/get regions',
+      'description' => 'Performs tests on setting and retrieiving content from theme regions.',
+      'group' => 'System'
+    );
+  }
+
+
+  /**
+   * Test setting and retrieving content for theme regions.
+   */
+  function testRegions() {
+    global $theme_key;
+
+    $block_regions = array_keys(system_region_list($theme_key));
+    $delimiter = $this->randomName(32);
+    $values = array();
+    // Set some random content for each region available.
+    foreach ($block_regions as $region) {
+      $first_chunk = $this->randomName(32);
+      drupal_add_region_content($region, $first_chunk);
+      $second_chunk = $this->randomName(32);
+      drupal_add_region_content($region, $second_chunk);
+      // Store the expected result for a drupal_get_region_content call for this region.
+      $values[$region] = $first_chunk . $delimiter . $second_chunk;
+    }
+
+    // Ensure drupal_get_region_content returns expected results when fetching all regions.
+    $content = drupal_get_region_content(NULL, $delimiter);
+    foreach ($content as $region => $region_content) {
+      $this->assertEqual($region_content, $values[$region], format_string('@region region text verified when fetching all regions', array('@region' => $region)));
+    }
+
+    // Ensure drupal_get_region_content returns expected results when fetching a single region.
+    foreach ($block_regions as $region) {
+      $region_content = drupal_get_region_content($region, $delimiter);
+      $this->assertEqual($region_content, $values[$region], format_string('@region region text verified when fetching single region.', array('@region' => $region)));
+    }
+  }
+}
+
+/**
+ * Testing drupal_goto and hook_drupal_goto_alter().
+ */
+class DrupalGotoTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Drupal goto',
+      'description' => 'Performs tests on the drupal_goto function and hook_drupal_goto_alter',
+      'group' => 'System'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('common_test');
+  }
+
+  /**
+   * Test drupal_goto().
+   */
+  function testDrupalGoto() {
+    $this->drupalGet('common-test/drupal_goto/redirect');
+    $headers = $this->drupalGetHeaders(TRUE);
+    list(, $status) = explode(' ', $headers[0][':status'], 3);
+    $this->assertEqual($status, 302, 'Expected response code was sent.');
+    $this->assertText('drupal_goto', 'Drupal goto redirect succeeded.');
+    $this->assertEqual($this->getUrl(), url('common-test/drupal_goto', array('absolute' => TRUE)), 'Drupal goto redirected to expected URL.');
+
+    $this->drupalGet('common-test/drupal_goto/redirect_advanced');
+    $headers = $this->drupalGetHeaders(TRUE);
+    list(, $status) = explode(' ', $headers[0][':status'], 3);
+    $this->assertEqual($status, 301, 'Expected response code was sent.');
+    $this->assertText('drupal_goto', 'Drupal goto redirect succeeded.');
+    $this->assertEqual($this->getUrl(), url('common-test/drupal_goto', array('query' => array('foo' => '123'), 'absolute' => TRUE)), 'Drupal goto redirected to expected URL.');
+
+    // Test that drupal_goto() respects ?destination=xxx. Use an complicated URL
+    // to test that the path is encoded and decoded properly.
+    $destination = 'common-test/drupal_goto/destination?foo=%2525&bar=123';
+    $this->drupalGet('common-test/drupal_goto/redirect', array('query' => array('destination' => $destination)));
+    $this->assertText('drupal_goto', 'Drupal goto redirect with destination succeeded.');
+    $this->assertEqual($this->getUrl(), url('common-test/drupal_goto/destination', array('query' => array('foo' => '%25', 'bar' => '123'), 'absolute' => TRUE)), 'Drupal goto redirected to given query string destination.');
+  }
+
+  /**
+   * Test hook_drupal_goto_alter().
+   */
+  function testDrupalGotoAlter() {
+    $this->drupalGet('common-test/drupal_goto/redirect_fail');
+
+    $this->assertNoText(t("Drupal goto failed to stop program"), "Drupal goto stopped program.");
+    $this->assertNoText('drupal_goto_fail', "Drupal goto redirect failed.");
+  }
+
+  /**
+   * Test drupal_get_destination().
+   */
+  function testDrupalGetDestination() {
+    $query = $this->randomName(10);
+
+    // Verify that a 'destination' query string is used as destination.
+    $this->drupalGet('common-test/destination', array('query' => array('destination' => $query)));
+    $this->assertText('The destination: ' . $query, 'The given query string destination is determined as destination.');
+
+    // Verify that the current path is used as destination.
+    $this->drupalGet('common-test/destination', array('query' => array($query => NULL)));
+    $url = 'common-test/destination?' . $query;
+    $this->assertText('The destination: ' . $url, 'The current path is determined as destination.');
+  }
+}
+
+/**
+ * Tests for the JavaScript system.
+ */
+class JavaScriptTestCase extends DrupalWebTestCase {
+  /**
+   * Store configured value for JavaScript preprocessing.
+   */
+  protected $preprocess_js = NULL;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'JavaScript',
+      'description' => 'Tests the JavaScript system.',
+      'group' => 'System'
+    );
+  }
+
+  function setUp() {
+    // Enable Locale and SimpleTest in the test environment.
+    parent::setUp('locale', 'simpletest', 'common_test');
+
+    // Disable preprocessing
+    $this->preprocess_js = variable_get('preprocess_js', 0);
+    variable_set('preprocess_js', 0);
+
+    // Reset drupal_add_js() and drupal_add_library() statics before each test.
+    drupal_static_reset('drupal_add_js');
+    drupal_static_reset('drupal_add_library');
+  }
+
+  function tearDown() {
+    // Restore configured value for JavaScript preprocessing.
+    variable_set('preprocess_js', $this->preprocess_js);
+    parent::tearDown();
+  }
+
+  /**
+   * Test default JavaScript is empty.
+   */
+  function testDefault() {
+    $this->assertEqual(array(), drupal_add_js(), 'Default JavaScript is empty.');
+  }
+
+  /**
+   * Test adding a JavaScript file.
+   */
+  function testAddFile() {
+    $javascript = drupal_add_js('misc/collapse.js');
+    $this->assertTrue(array_key_exists('misc/jquery.js', $javascript), 'jQuery is added when a file is added.');
+    $this->assertTrue(array_key_exists('misc/drupal.js', $javascript), 'Drupal.js is added when file is added.');
+    $this->assertTrue(array_key_exists('misc/collapse.js', $javascript), 'JavaScript files are correctly added.');
+    $this->assertEqual(base_path(), $javascript['settings']['data'][0]['basePath'], 'Base path JavaScript setting is correctly set.');
+    url('', array('prefix' => &$prefix));
+    $this->assertEqual(empty($prefix) ? '' : $prefix, $javascript['settings']['data'][1]['pathPrefix'], 'Path prefix JavaScript setting is correctly set.');
+  }
+
+  /**
+   * Test adding settings.
+   */
+  function testAddSetting() {
+    $javascript = drupal_add_js(array('drupal' => 'rocks', 'dries' => 280342800), 'setting');
+    $this->assertEqual(280342800, $javascript['settings']['data'][2]['dries'], 'JavaScript setting is set correctly.');
+    $this->assertEqual('rocks', $javascript['settings']['data'][2]['drupal'], 'The other JavaScript setting is set correctly.');
+  }
+
+  /**
+   * Tests adding an external JavaScript File.
+   */
+  function testAddExternal() {
+    $path = 'http://example.com/script.js';
+    $javascript = drupal_add_js($path, 'external');
+    $this->assertTrue(array_key_exists('http://example.com/script.js', $javascript), 'Added an external JavaScript file.');
+  }
+
+  /**
+   * Test drupal_get_js() for JavaScript settings.
+   */
+  function testHeaderSetting() {
+    // Only the second of these two entries should appear in Drupal.settings.
+    drupal_add_js(array('commonTest' => 'commonTestShouldNotAppear'), 'setting');
+    drupal_add_js(array('commonTest' => 'commonTestShouldAppear'), 'setting');
+    // All three of these entries should appear in Drupal.settings.
+    drupal_add_js(array('commonTestArray' => array('commonTestValue0')), 'setting');
+    drupal_add_js(array('commonTestArray' => array('commonTestValue1')), 'setting');
+    drupal_add_js(array('commonTestArray' => array('commonTestValue2')), 'setting');
+    // Only the second of these two entries should appear in Drupal.settings.
+    drupal_add_js(array('commonTestArray' => array('key' => 'commonTestOldValue')), 'setting');
+    drupal_add_js(array('commonTestArray' => array('key' => 'commonTestNewValue')), 'setting');
+
+    $javascript = drupal_get_js('header');
+    $this->assertTrue(strpos($javascript, 'basePath') > 0, 'Rendered JavaScript header returns basePath setting.');
+    $this->assertTrue(strpos($javascript, 'misc/jquery.js') > 0, 'Rendered JavaScript header includes jQuery.');
+    $this->assertTrue(strpos($javascript, 'pathPrefix') > 0, 'Rendered JavaScript header returns pathPrefix setting.');
+
+    // Test whether drupal_add_js can be used to override a previous setting.
+    $this->assertTrue(strpos($javascript, 'commonTestShouldAppear') > 0, 'Rendered JavaScript header returns custom setting.');
+    $this->assertTrue(strpos($javascript, 'commonTestShouldNotAppear') === FALSE, 'drupal_add_js() correctly overrides a custom setting.');
+
+    // Test whether drupal_add_js can be used to add numerically indexed values
+    // to an array.
+    $array_values_appear = strpos($javascript, 'commonTestValue0') > 0 && strpos($javascript, 'commonTestValue1') > 0 && strpos($javascript, 'commonTestValue2') > 0;
+    $this->assertTrue($array_values_appear, 'drupal_add_js() correctly adds settings to the end of an indexed array.');
+
+    // Test whether drupal_add_js can be used to override the entry for an
+    // existing key in an associative array.
+    $associative_array_override = strpos($javascript, 'commonTestNewValue') > 0 && strpos($javascript, 'commonTestOldValue') === FALSE;
+    $this->assertTrue($associative_array_override, 'drupal_add_js() correctly overrides settings within an associative array.');
+  }
+
+  /**
+   * Test to see if resetting the JavaScript empties the cache.
+   */
+  function testReset() {
+    drupal_add_js('misc/collapse.js');
+    drupal_static_reset('drupal_add_js');
+    $this->assertEqual(array(), drupal_add_js(), 'Resetting the JavaScript correctly empties the cache.');
+  }
+
+  /**
+   * Test adding inline scripts.
+   */
+  function testAddInline() {
+    $inline = 'jQuery(function () { });';
+    $javascript = drupal_add_js($inline, array('type' => 'inline', 'scope' => 'footer'));
+    $this->assertTrue(array_key_exists('misc/jquery.js', $javascript), 'jQuery is added when inline scripts are added.');
+    $data = end($javascript);
+    $this->assertEqual($inline, $data['data'], 'Inline JavaScript is correctly added to the footer.');
+  }
+
+  /**
+   * Test rendering an external JavaScript file.
+   */
+  function testRenderExternal() {
+    $external = 'http://example.com/example.js';
+    drupal_add_js($external, 'external');
+    $javascript = drupal_get_js();
+    // Local files have a base_path() prefix, external files should not.
+    $this->assertTrue(strpos($javascript, 'src="' . $external) > 0, 'Rendering an external JavaScript file.');
+  }
+
+  /**
+   * Test drupal_get_js() with a footer scope.
+   */
+  function testFooterHTML() {
+    $inline = 'jQuery(function () { });';
+    drupal_add_js($inline, array('type' => 'inline', 'scope' => 'footer'));
+    $javascript = drupal_get_js('footer');
+    $this->assertTrue(strpos($javascript, $inline) > 0, 'Rendered JavaScript footer returns the inline code.');
+  }
+
+  /**
+   * Test drupal_add_js() sets preproccess to false when cache is set to false.
+   */
+  function testNoCache() {
+    $javascript = drupal_add_js('misc/collapse.js', array('cache' => FALSE));
+    $this->assertFalse($javascript['misc/collapse.js']['preprocess'], 'Setting cache to FALSE sets proprocess to FALSE when adding JavaScript.');
+  }
+
+  /**
+   * Test adding a JavaScript file with a different group.
+   */
+  function testDifferentGroup() {
+    $javascript = drupal_add_js('misc/collapse.js', array('group' => JS_THEME));
+    $this->assertEqual($javascript['misc/collapse.js']['group'], JS_THEME, 'Adding a JavaScript file with a different group caches the given group.');
+  }
+
+  /**
+   * Test adding a JavaScript file with a different weight.
+   */
+  function testDifferentWeight() {
+    $javascript = drupal_add_js('misc/collapse.js', array('weight' => 2));
+    $this->assertEqual($javascript['misc/collapse.js']['weight'], 2, 'Adding a JavaScript file with a different weight caches the given weight.');
+  }
+
+  /**
+   * Tests JavaScript aggregation when files are added to a different scope.
+   */
+  function testAggregationOrder() {
+    // Enable JavaScript aggregation.
+    variable_set('preprocess_js', 1);
+    drupal_static_reset('drupal_add_js');
+
+    // Add two JavaScript files to the current request and build the cache.
+    drupal_add_js('misc/ajax.js');
+    drupal_add_js('misc/autocomplete.js');
+
+    $js_items = drupal_add_js();
+    drupal_build_js_cache(array(
+      'misc/ajax.js' => $js_items['misc/ajax.js'],
+      'misc/autocomplete.js' => $js_items['misc/autocomplete.js']
+    ));
+
+    // Store the expected key for the first item in the cache.
+    $cache = array_keys(variable_get('drupal_js_cache_files', array()));
+    $expected_key = $cache[0];
+
+    // Reset variables and add a file in a different scope first.
+    variable_del('drupal_js_cache_files');
+    drupal_static_reset('drupal_add_js');
+    drupal_add_js('some/custom/javascript_file.js', array('scope' => 'footer'));
+    drupal_add_js('misc/ajax.js');
+    drupal_add_js('misc/autocomplete.js');
+
+    // Rebuild the cache.
+    $js_items = drupal_add_js();
+    drupal_build_js_cache(array(
+      'misc/ajax.js' => $js_items['misc/ajax.js'],
+      'misc/autocomplete.js' => $js_items['misc/autocomplete.js']
+    ));
+
+    // Compare the expected key for the first file to the current one.
+    $cache = array_keys(variable_get('drupal_js_cache_files', array()));
+    $key = $cache[0];
+    $this->assertEqual($key, $expected_key, 'JavaScript aggregation is not affected by ordering in different scopes.');
+  }
+
+  /**
+   * Test JavaScript ordering.
+   */
+  function testRenderOrder() {
+    // Add a bunch of JavaScript in strange ordering.
+    drupal_add_js('(function($){alert("Weight 5 #1");})(jQuery);', array('type' => 'inline', 'scope' => 'footer', 'weight' => 5));
+    drupal_add_js('(function($){alert("Weight 0 #1");})(jQuery);', array('type' => 'inline', 'scope' => 'footer'));
+    drupal_add_js('(function($){alert("Weight 0 #2");})(jQuery);', array('type' => 'inline', 'scope' => 'footer'));
+    drupal_add_js('(function($){alert("Weight -8 #1");})(jQuery);', array('type' => 'inline', 'scope' => 'footer', 'weight' => -8));
+    drupal_add_js('(function($){alert("Weight -8 #2");})(jQuery);', array('type' => 'inline', 'scope' => 'footer', 'weight' => -8));
+    drupal_add_js('(function($){alert("Weight -8 #3");})(jQuery);', array('type' => 'inline', 'scope' => 'footer', 'weight' => -8));
+    drupal_add_js('http://example.com/example.js?Weight -5 #1', array('type' => 'external', 'scope' => 'footer', 'weight' => -5));
+    drupal_add_js('(function($){alert("Weight -8 #4");})(jQuery);', array('type' => 'inline', 'scope' => 'footer', 'weight' => -8));
+    drupal_add_js('(function($){alert("Weight 5 #2");})(jQuery);', array('type' => 'inline', 'scope' => 'footer', 'weight' => 5));
+    drupal_add_js('(function($){alert("Weight 0 #3");})(jQuery);', array('type' => 'inline', 'scope' => 'footer'));
+
+    // Construct the expected result from the regex.
+    $expected = array(
+      "-8 #1",
+      "-8 #2",
+      "-8 #3",
+      "-8 #4",
+      "-5 #1", // The external script.
+      "0 #1",
+      "0 #2",
+      "0 #3",
+      "5 #1",
+      "5 #2",
+    );
+
+    // Retrieve the rendered JavaScript and test against the regex.
+    $js = drupal_get_js('footer');
+    $matches = array();
+    if (preg_match_all('/Weight\s([-0-9]+\s[#0-9]+)/', $js, $matches)) {
+      $result = $matches[1];
+    }
+    else {
+      $result = array();
+    }
+    $this->assertIdentical($result, $expected, 'JavaScript is added in the expected weight order.');
+  }
+
+  /**
+   * Test rendering the JavaScript with a file's weight above jQuery's.
+   */
+  function testRenderDifferentWeight() {
+    // JavaScript files are sorted first by group, then by the 'every_page'
+    // flag, then by weight (see drupal_sort_css_js()), so to test the effect of
+    // weight, we need the other two options to be the same.
+    drupal_add_js('misc/collapse.js', array('group' => JS_LIBRARY, 'every_page' => TRUE, 'weight' => -21));
+    $javascript = drupal_get_js();
+    $this->assertTrue(strpos($javascript, 'misc/collapse.js') < strpos($javascript, 'misc/jquery.js'), 'Rendering a JavaScript file above jQuery.');
+  }
+
+  /**
+   * Test altering a JavaScript's weight via hook_js_alter().
+   *
+   * @see simpletest_js_alter()
+   */
+  function testAlter() {
+    // Add both tableselect.js and simpletest.js, with a larger weight on SimpleTest.
+    drupal_add_js('misc/tableselect.js');
+    drupal_add_js(drupal_get_path('module', 'simpletest') . '/simpletest.js', array('weight' => 9999));
+
+    // Render the JavaScript, testing if simpletest.js was altered to be before
+    // tableselect.js. See simpletest_js_alter() to see where this alteration
+    // takes place.
+    $javascript = drupal_get_js();
+    $this->assertTrue(strpos($javascript, 'simpletest.js') < strpos($javascript, 'misc/tableselect.js'), 'Altering JavaScript weight through the alter hook.');
+  }
+
+  /**
+   * Adds a library to the page and tests for both its JavaScript and its CSS.
+   */
+  function testLibraryRender() {
+    $result = drupal_add_library('system', 'farbtastic');
+    $this->assertTrue($result !== FALSE, 'Library was added without errors.');
+    $scripts = drupal_get_js();
+    $styles = drupal_get_css();
+    $this->assertTrue(strpos($scripts, 'misc/farbtastic/farbtastic.js'), 'JavaScript of library was added to the page.');
+    $this->assertTrue(strpos($styles, 'misc/farbtastic/farbtastic.css'), 'Stylesheet of library was added to the page.');
+  }
+
+  /**
+   * Adds a JavaScript library to the page and alters it.
+   *
+   * @see common_test_library_alter()
+   */
+  function testLibraryAlter() {
+    // Verify that common_test altered the title of Farbtastic.
+    $library = drupal_get_library('system', 'farbtastic');
+    $this->assertEqual($library['title'], 'Farbtastic: Altered Library', 'Registered libraries were altered.');
+
+    // common_test_library_alter() also added a dependency on jQuery Form.
+    drupal_add_library('system', 'farbtastic');
+    $scripts = drupal_get_js();
+    $this->assertTrue(strpos($scripts, 'misc/jquery.form.js'), 'Altered library dependencies are added to the page.');
+  }
+
+  /**
+   * Tests that multiple modules can implement the same library.
+   *
+   * @see common_test_library()
+   */
+  function testLibraryNameConflicts() {
+    $farbtastic = drupal_get_library('common_test', 'farbtastic');
+    $this->assertEqual($farbtastic['title'], 'Custom Farbtastic Library', 'Alternative libraries can be added to the page.');
+  }
+
+  /**
+   * Tests non-existing libraries.
+   */
+  function testLibraryUnknown() {
+    $result = drupal_get_library('unknown', 'unknown');
+    $this->assertFalse($result, 'Unknown library returned FALSE.');
+    drupal_static_reset('drupal_get_library');
+
+    $result = drupal_add_library('unknown', 'unknown');
+    $this->assertFalse($result, 'Unknown library returned FALSE.');
+    $scripts = drupal_get_js();
+    $this->assertTrue(strpos($scripts, 'unknown') === FALSE, 'Unknown library was not added to the page.');
+  }
+
+  /**
+   * Tests the addition of libraries through the #attached['library'] property.
+   */
+  function testAttachedLibrary() {
+    $element['#attached']['library'][] = array('system', 'farbtastic');
+    drupal_render($element);
+    $scripts = drupal_get_js();
+    $this->assertTrue(strpos($scripts, 'misc/farbtastic/farbtastic.js'), 'The attached_library property adds the additional libraries.');
+  }
+
+  /**
+   * Tests retrieval of libraries via drupal_get_library().
+   */
+  function testGetLibrary() {
+    // Retrieve all libraries registered by a module.
+    $libraries = drupal_get_library('common_test');
+    $this->assertTrue(isset($libraries['farbtastic']), 'Retrieved all module libraries.');
+    // Retrieve all libraries for a module not implementing hook_library().
+    // Note: This test installs Locale module.
+    $libraries = drupal_get_library('locale');
+    $this->assertEqual($libraries, array(), 'Retrieving libraries from a module not implementing hook_library() returns an emtpy array.');
+
+    // Retrieve a specific library by module and name.
+    $farbtastic = drupal_get_library('common_test', 'farbtastic');
+    $this->assertEqual($farbtastic['version'], '5.3', 'Retrieved a single library.');
+    // Retrieve a non-existing library by module and name.
+    $farbtastic = drupal_get_library('common_test', 'foo');
+    $this->assertIdentical($farbtastic, FALSE, 'Retrieving a non-existing library returns FALSE.');
+  }
+
+  /**
+   * Tests that the query string remains intact when adding JavaScript files
+   *  that have query string parameters.
+   */
+  function testAddJsFileWithQueryString() {
+    $this->drupalGet('common-test/query-string');
+    $query_string = variable_get('css_js_query_string', '0');
+    $this->assertRaw(drupal_get_path('module', 'node') . '/node.js?' . $query_string, 'Query string was appended correctly to js.');
+  }
+}
+
+/**
+ * Tests for drupal_render().
+ */
+class DrupalRenderTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'drupal_render()',
+      'description' => 'Performs functional tests on drupal_render().',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('common_test');
+  }
+
+  /**
+   * Tests the output drupal_render() for some elementary input values.
+   */
+  function testDrupalRenderBasics() {
+    $types = array(
+      array(
+        'name' => 'null',
+        'value' => NULL,
+        'expected' => '',
+      ),
+      array(
+        'name' => 'no value',
+        'expected' => '',
+      ),
+      array(
+        'name' => 'empty string',
+        'value' => '',
+        'expected' => '',
+      ),
+      array(
+        'name' => 'no access',
+        'value' => array(
+          '#markup' => 'foo',
+          '#access' => FALSE,
+        ),
+        'expected' => '',
+      ),
+      array(
+        'name' => 'previously printed',
+        'value' => array(
+          '#markup' => 'foo',
+          '#printed' => TRUE,
+        ),
+        'expected' => '',
+      ),
+      array(
+        'name' => 'printed in prerender',
+        'value' => array(
+          '#markup' => 'foo',
+          '#pre_render' => array('common_test_drupal_render_printing_pre_render'),
+        ),
+        'expected' => '',
+      ),
+      array(
+        'name' => 'basic renderable array',
+        'value' => array('#markup' => 'foo'),
+        'expected' => 'foo',
+      ),
+    );
+    foreach($types as $type) {
+      $this->assertIdentical(drupal_render($type['value']), $type['expected'], '"' . $type['name'] . '" input rendered correctly by drupal_render().');
+    }
+  }
+
+  /**
+   * Test sorting by weight.
+   */
+  function testDrupalRenderSorting() {
+    $first = $this->randomName();
+    $second = $this->randomName();
+    // Build an array with '#weight' set for each element.
+    $elements = array(
+      'second' => array(
+        '#weight' => 10,
+        '#markup' => $second,
+      ),
+      'first' => array(
+        '#weight' => 0,
+        '#markup' => $first,
+      ),
+    );
+    $output = drupal_render($elements);
+
+    // The lowest weight element should appear last in $output.
+    $this->assertTrue(strpos($output, $second) > strpos($output, $first), 'Elements were sorted correctly by weight.');
+
+    // Confirm that the $elements array has '#sorted' set to TRUE.
+    $this->assertTrue($elements['#sorted'], "'#sorted' => TRUE was added to the array");
+
+    // Pass $elements through element_children() and ensure it remains
+    // sorted in the correct order. drupal_render() will return an empty string
+    // if used on the same array in the same request.
+    $children = element_children($elements);
+    $this->assertTrue(array_shift($children) == 'first', 'Child found in the correct order.');
+    $this->assertTrue(array_shift($children) == 'second', 'Child found in the correct order.');
+
+
+    // The same array structure again, but with #sorted set to TRUE.
+    $elements = array(
+      'second' => array(
+        '#weight' => 10,
+        '#markup' => $second,
+      ),
+      'first' => array(
+        '#weight' => 0,
+        '#markup' => $first,
+      ),
+      '#sorted' => TRUE,
+    );
+    $output = drupal_render($elements);
+
+    // The elements should appear in output in the same order as the array.
+    $this->assertTrue(strpos($output, $second) < strpos($output, $first), 'Elements were not sorted.');
+  }
+
+  /**
+   * Test #attached functionality in children elements.
+   */
+  function testDrupalRenderChildrenAttached() {
+    // The cache system is turned off for POST requests.
+    $request_method = $_SERVER['REQUEST_METHOD'];
+    $_SERVER['REQUEST_METHOD'] = 'GET';
+
+    // Create an element with a child and subchild.  Each element loads a
+    // different JavaScript file using #attached.
+    $parent_js = drupal_get_path('module', 'user') . '/user.js';
+    $child_js = drupal_get_path('module', 'forum') . '/forum.js';
+    $subchild_js = drupal_get_path('module', 'book') . '/book.js';
+    $element = array(
+      '#type' => 'fieldset',
+      '#cache' => array(
+        'keys' => array('simpletest', 'drupal_render', 'children_attached'),
+      ),
+      '#attached' => array('js' => array($parent_js)),
+      '#title' => 'Parent',
+    );
+    $element['child'] = array(
+      '#type' => 'fieldset',
+      '#attached' => array('js' => array($child_js)),
+      '#title' => 'Child',
+    );
+    $element['child']['subchild'] = array(
+      '#attached' => array('js' => array($subchild_js)),
+      '#markup' => 'Subchild',
+    );
+
+    // Render the element and verify the presence of #attached JavaScript.
+    drupal_render($element);
+    $scripts = drupal_get_js();
+    $this->assertTrue(strpos($scripts, $parent_js), 'The element #attached JavaScript was included.');
+    $this->assertTrue(strpos($scripts, $child_js), 'The child #attached JavaScript was included.');
+    $this->assertTrue(strpos($scripts, $subchild_js), 'The subchild #attached JavaScript was included.');
+
+    // Load the element from cache and verify the presence of the #attached
+    // JavaScript.
+    drupal_static_reset('drupal_add_js');
+    $this->assertTrue(drupal_render_cache_get($element), 'The element was retrieved from cache.');
+    $scripts = drupal_get_js();
+    $this->assertTrue(strpos($scripts, $parent_js), 'The element #attached JavaScript was included when loading from cache.');
+    $this->assertTrue(strpos($scripts, $child_js), 'The child #attached JavaScript was included when loading from cache.');
+    $this->assertTrue(strpos($scripts, $subchild_js), 'The subchild #attached JavaScript was included when loading from cache.');
+
+    $_SERVER['REQUEST_METHOD'] = $request_method;
+  }
+
+  /**
+   * Test passing arguments to the theme function.
+   */
+  function testDrupalRenderThemeArguments() {
+    $element = array(
+      '#theme' => 'common_test_foo',
+    );
+    // Test that defaults work.
+    $this->assertEqual(drupal_render($element), 'foobar', 'Defaults work');
+    $element = array(
+      '#theme' => 'common_test_foo',
+      '#foo' => $this->randomName(),
+      '#bar' => $this->randomName(),
+    );
+    // Test that passing arguments to the theme function works.
+    $this->assertEqual(drupal_render($element), $element['#foo'] . $element['#bar'], 'Passing arguments to theme functions works');
+  }
+
+  /**
+   * Test rendering form elements without passing through form_builder().
+   */
+  function testDrupalRenderFormElements() {
+    // Define a series of form elements.
+    $element = array(
+      '#type' => 'button',
+      '#value' => $this->randomName(),
+    );
+    $this->assertRenderedElement($element, '//input[@type=:type]', array(':type' => 'submit'));
+
+    $element = array(
+      '#type' => 'textfield',
+      '#title' => $this->randomName(),
+      '#value' => $this->randomName(),
+    );
+    $this->assertRenderedElement($element, '//input[@type=:type]', array(':type' => 'text'));
+
+    $element = array(
+      '#type' => 'password',
+      '#title' => $this->randomName(),
+    );
+    $this->assertRenderedElement($element, '//input[@type=:type]', array(':type' => 'password'));
+
+    $element = array(
+      '#type' => 'textarea',
+      '#title' => $this->randomName(),
+      '#value' => $this->randomName(),
+    );
+    $this->assertRenderedElement($element, '//textarea');
+
+    $element = array(
+      '#type' => 'radio',
+      '#title' => $this->randomName(),
+      '#value' => FALSE,
+    );
+    $this->assertRenderedElement($element, '//input[@type=:type]', array(':type' => 'radio'));
+
+    $element = array(
+      '#type' => 'checkbox',
+      '#title' => $this->randomName(),
+    );
+    $this->assertRenderedElement($element, '//input[@type=:type]', array(':type' => 'checkbox'));
+
+    $element = array(
+      '#type' => 'select',
+      '#title' => $this->randomName(),
+      '#options' => array(
+        0 => $this->randomName(),
+        1 => $this->randomName(),
+      ),
+    );
+    $this->assertRenderedElement($element, '//select');
+
+    $element = array(
+      '#type' => 'file',
+      '#title' => $this->randomName(),
+    );
+    $this->assertRenderedElement($element, '//input[@type=:type]', array(':type' => 'file'));
+
+    $element = array(
+      '#type' => 'item',
+      '#title' => $this->randomName(),
+      '#markup' => $this->randomName(),
+    );
+    $this->assertRenderedElement($element, '//div[contains(@class, :class) and contains(., :markup)]/label[contains(., :label)]', array(
+      ':class' => 'form-type-item',
+      ':markup' => $element['#markup'],
+      ':label' => $element['#title'],
+    ));
+
+    $element = array(
+      '#type' => 'hidden',
+      '#title' => $this->randomName(),
+      '#value' => $this->randomName(),
+    );
+    $this->assertRenderedElement($element, '//input[@type=:type]', array(':type' => 'hidden'));
+
+    $element = array(
+      '#type' => 'link',
+      '#title' => $this->randomName(),
+      '#href' => $this->randomName(),
+      '#options' => array(
+        'absolute' => TRUE,
+      ),
+    );
+    $this->assertRenderedElement($element, '//a[@href=:href and contains(., :title)]', array(
+      ':href' => url($element['#href'], array('absolute' => TRUE)),
+      ':title' => $element['#title'],
+    ));
+
+    $element = array(
+      '#type' => 'fieldset',
+      '#title' => $this->randomName(),
+    );
+    $this->assertRenderedElement($element, '//fieldset/legend[contains(., :title)]', array(
+      ':title' => $element['#title'],
+    ));
+
+    $element['item'] = array(
+      '#type' => 'item',
+      '#title' => $this->randomName(),
+      '#markup' => $this->randomName(),
+    );
+    $this->assertRenderedElement($element, '//fieldset/div/div[contains(@class, :class) and contains(., :markup)]', array(
+      ':class' => 'form-type-item',
+      ':markup' => $element['item']['#markup'],
+    ));
+  }
+
+  protected function assertRenderedElement(array $element, $xpath, array $xpath_args = array()) {
+    $original_element = $element;
+    $this->drupalSetContent(drupal_render($element));
+    $this->verbose('<pre>' .  check_plain(var_export($original_element, TRUE)) . '</pre>'
+      . '<pre>' .  check_plain(var_export($element, TRUE)) . '</pre>'
+      . '<hr />' . $this->drupalGetContent()
+    );
+
+    // @see DrupalWebTestCase::xpath()
+    $xpath = $this->buildXPathQuery($xpath, $xpath_args);
+    $element += array('#value' => NULL);
+    $this->assertFieldByXPath($xpath, $element['#value'], format_string('#type @type was properly rendered.', array(
+      '@type' => var_export($element['#type'], TRUE),
+    )));
+  }
+
+  /**
+   * Tests caching of an empty render item.
+   */
+  function testDrupalRenderCache() {
+    // Force a request via GET.
+    $request_method = $_SERVER['REQUEST_METHOD'];
+    $_SERVER['REQUEST_METHOD'] = 'GET';
+    // Create an empty element.
+    $test_element = array(
+      '#cache' => array(
+        'cid' => 'render_cache_test',
+      ),
+      '#markup' => '',
+    );
+
+    // Render the element and confirm that it goes through the rendering
+    // process (which will set $element['#printed']).
+    $element = $test_element;
+    drupal_render($element);
+    $this->assertTrue(isset($element['#printed']), 'No cache hit');
+
+    // Render the element again and confirm that it is retrieved from the cache
+    // instead (so $element['#printed'] will not be set).
+    $element = $test_element;
+    drupal_render($element);
+    $this->assertFalse(isset($element['#printed']), 'Cache hit');
+
+    // Restore the previous request method.
+    $_SERVER['REQUEST_METHOD'] = $request_method;
+  }
+}
+
+/**
+ * Test for valid_url().
+ */
+class ValidUrlTestCase extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Valid URL',
+      'description' => "Performs tests on Drupal's valid URL function.",
+      'group' => 'System'
+    );
+  }
+
+  /**
+   * Test valid absolute URLs.
+   */
+  function testValidAbsolute() {
+    $url_schemes = array('http', 'https', 'ftp');
+    $valid_absolute_urls = array(
+      'example.com',
+      'www.example.com',
+      'ex-ample.com',
+      '3xampl3.com',
+      'example.com/paren(the)sis',
+      'example.com/index.html#pagetop',
+      'example.com:8080',
+      'subdomain.example.com',
+      'example.com/index.php?q=node',
+      'example.com/index.php?q=node&param=false',
+      'user@www.example.com',
+      'user:pass@www.example.com:8080/login.php?do=login&style=%23#pagetop',
+      '127.0.0.1',
+      'example.org?',
+      'john%20doe:secret:foo@example.org/',
+      'example.org/~,$\'*;',
+      'caf%C3%A9.example.org',
+      '[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html',
+    );
+
+    foreach ($url_schemes as $scheme) {
+      foreach ($valid_absolute_urls as $url) {
+        $test_url = $scheme . '://' . $url;
+        $valid_url = valid_url($test_url, TRUE);
+        $this->assertTrue($valid_url, format_string('@url is a valid url.', array('@url' => $test_url)));
+      }
+    }
+  }
+
+  /**
+   * Test invalid absolute URLs.
+   */
+  function testInvalidAbsolute() {
+    $url_schemes = array('http', 'https', 'ftp');
+    $invalid_ablosule_urls = array(
+      '',
+      'ex!ample.com',
+      'ex%ample.com',
+    );
+
+    foreach ($url_schemes as $scheme) {
+      foreach ($invalid_ablosule_urls as $url) {
+        $test_url = $scheme . '://' . $url;
+        $valid_url = valid_url($test_url, TRUE);
+        $this->assertFalse($valid_url, format_string('@url is NOT a valid url.', array('@url' => $test_url)));
+      }
+    }
+  }
+
+  /**
+   * Test valid relative URLs.
+   */
+  function testValidRelative() {
+    $valid_relative_urls = array(
+      'paren(the)sis',
+      'index.html#pagetop',
+      'index.php?q=node',
+      'index.php?q=node&param=false',
+      'login.php?do=login&style=%23#pagetop',
+    );
+
+    foreach (array('', '/') as $front) {
+      foreach ($valid_relative_urls as $url) {
+        $test_url = $front . $url;
+        $valid_url = valid_url($test_url);
+        $this->assertTrue($valid_url, format_string('@url is a valid url.', array('@url' => $test_url)));
+      }
+    }
+  }
+
+  /**
+   * Test invalid relative URLs.
+   */
+  function testInvalidRelative() {
+    $invalid_relative_urls = array(
+      'ex^mple',
+      'example<>',
+      'ex%ample',
+    );
+
+    foreach (array('', '/') as $front) {
+      foreach ($invalid_relative_urls as $url) {
+        $test_url = $front . $url;
+        $valid_url = valid_url($test_url);
+        $this->assertFALSE($valid_url, format_string('@url is NOT a valid url.', array('@url' => $test_url)));
+      }
+    }
+  }
+}
+
+/**
+ * Tests for CRUD API functions.
+ */
+class DrupalDataApiTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Data API functions',
+      'description' => 'Tests the performance of CRUD APIs.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('database_test');
+  }
+
+  /**
+   * Test the drupal_write_record() API function.
+   */
+  function testDrupalWriteRecord() {
+    // Insert a record - no columns allow NULL values.
+    $person = new stdClass();
+    $person->name = 'John';
+    $person->unknown_column = 123;
+    $insert_result = drupal_write_record('test', $person);
+    $this->assertTrue($insert_result == SAVED_NEW, 'Correct value returned when a record is inserted with drupal_write_record() for a table with a single-field primary key.');
+    $this->assertTrue(isset($person->id), 'Primary key is set on record created with drupal_write_record().');
+    $this->assertIdentical($person->age, 0, 'Age field set to default value.');
+    $this->assertIdentical($person->job, 'Undefined', 'Job field set to default value.');
+
+    // Verify that the record was inserted.
+    $result = db_query("SELECT * FROM {test} WHERE id = :id", array(':id' => $person->id))->fetchObject();
+    $this->assertIdentical($result->name, 'John', 'Name field set.');
+    $this->assertIdentical($result->age, '0', 'Age field set to default value.');
+    $this->assertIdentical($result->job, 'Undefined', 'Job field set to default value.');
+    $this->assertFalse(isset($result->unknown_column), 'Unknown column was ignored.');
+
+    // Update the newly created record.
+    $person->name = 'Peter';
+    $person->age = 27;
+    $person->job = NULL;
+    $update_result = drupal_write_record('test', $person, array('id'));
+    $this->assertTrue($update_result == SAVED_UPDATED, 'Correct value returned when a record updated with drupal_write_record() for table with single-field primary key.');
+
+    // Verify that the record was updated.
+    $result = db_query("SELECT * FROM {test} WHERE id = :id", array(':id' => $person->id))->fetchObject();
+    $this->assertIdentical($result->name, 'Peter', 'Name field set.');
+    $this->assertIdentical($result->age, '27', 'Age field set.');
+    $this->assertIdentical($result->job, '', 'Job field set and cast to string.');
+
+    // Try to insert NULL in columns that does not allow this.
+    $person = new stdClass();
+    $person->name = 'Ringo';
+    $person->age = NULL;
+    $person->job = NULL;
+    $insert_result = drupal_write_record('test', $person);
+    $this->assertTrue(isset($person->id), 'Primary key is set on record created with drupal_write_record().');
+    $result = db_query("SELECT * FROM {test} WHERE id = :id", array(':id' => $person->id))->fetchObject();
+    $this->assertIdentical($result->name, 'Ringo', 'Name field set.');
+    $this->assertIdentical($result->age, '0', 'Age field set.');
+    $this->assertIdentical($result->job, '', 'Job field set.');
+
+    // Insert a record - the "age" column allows NULL.
+    $person = new stdClass();
+    $person->name = 'Paul';
+    $person->age = NULL;
+    $insert_result = drupal_write_record('test_null', $person);
+    $this->assertTrue(isset($person->id), 'Primary key is set on record created with drupal_write_record().');
+    $result = db_query("SELECT * FROM {test_null} WHERE id = :id", array(':id' => $person->id))->fetchObject();
+    $this->assertIdentical($result->name, 'Paul', 'Name field set.');
+    $this->assertIdentical($result->age, NULL, 'Age field set.');
+
+    // Insert a record - do not specify the value of a column that allows NULL.
+    $person = new stdClass();
+    $person->name = 'Meredith';
+    $insert_result = drupal_write_record('test_null', $person);
+    $this->assertTrue(isset($person->id), 'Primary key is set on record created with drupal_write_record().');
+    $this->assertIdentical($person->age, 0, 'Age field set to default value.');
+    $result = db_query("SELECT * FROM {test_null} WHERE id = :id", array(':id' => $person->id))->fetchObject();
+    $this->assertIdentical($result->name, 'Meredith', 'Name field set.');
+    $this->assertIdentical($result->age, '0', 'Age field set to default value.');
+
+    // Update the newly created record.
+    $person->name = 'Mary';
+    $person->age = NULL;
+    $update_result = drupal_write_record('test_null', $person, array('id'));
+    $result = db_query("SELECT * FROM {test_null} WHERE id = :id", array(':id' => $person->id))->fetchObject();
+    $this->assertIdentical($result->name, 'Mary', 'Name field set.');
+    $this->assertIdentical($result->age, NULL, 'Age field set.');
+
+    // Insert a record - the "data" column should be serialized.
+    $person = new stdClass();
+    $person->name = 'Dave';
+    $update_result = drupal_write_record('test_serialized', $person);
+    $result = db_query("SELECT * FROM {test_serialized} WHERE id = :id", array(':id' => $person->id))->fetchObject();
+    $this->assertIdentical($result->name, 'Dave', 'Name field set.');
+    $this->assertIdentical($result->info, NULL, 'Info field set.');
+
+    $person->info = array();
+    $update_result = drupal_write_record('test_serialized', $person, array('id'));
+    $result = db_query("SELECT * FROM {test_serialized} WHERE id = :id", array(':id' => $person->id))->fetchObject();
+    $this->assertIdentical(unserialize($result->info), array(), 'Info field updated.');
+
+    // Update the serialized record.
+    $data = array('foo' => 'bar', 1 => 2, 'empty' => '', 'null' => NULL);
+    $person->info = $data;
+    $update_result = drupal_write_record('test_serialized', $person, array('id'));
+    $result = db_query("SELECT * FROM {test_serialized} WHERE id = :id", array(':id' => $person->id))->fetchObject();
+    $this->assertIdentical(unserialize($result->info), $data, 'Info field updated.');
+
+    // Run an update query where no field values are changed. The database
+    // layer should return zero for number of affected rows, but
+    // db_write_record() should still return SAVED_UPDATED.
+    $update_result = drupal_write_record('test_null', $person, array('id'));
+    $this->assertTrue($update_result == SAVED_UPDATED, 'Correct value returned when a valid update is run without changing any values.');
+
+    // Insert an object record for a table with a multi-field primary key.
+    $node_access = new stdClass();
+    $node_access->nid = mt_rand();
+    $node_access->gid = mt_rand();
+    $node_access->realm = $this->randomName();
+    $insert_result = drupal_write_record('node_access', $node_access);
+    $this->assertTrue($insert_result == SAVED_NEW, 'Correct value returned when a record is inserted with drupal_write_record() for a table with a multi-field primary key.');
+
+    // Update the record.
+    $update_result = drupal_write_record('node_access', $node_access, array('nid', 'gid', 'realm'));
+    $this->assertTrue($update_result == SAVED_UPDATED, 'Correct value returned when a record is updated with drupal_write_record() for a table with a multi-field primary key.');
+  }
+
+}
+
+/**
+ * Tests Simpletest error and exception collector.
+ */
+class DrupalErrorCollectionUnitTest extends DrupalWebTestCase {
+
+  /**
+   * Errors triggered during the test.
+   *
+   * Errors are intercepted by the overriden implementation
+   * of DrupalWebTestCase::error below.
+   *
+   * @var Array
+   */
+  protected $collectedErrors = array();
+
+  public static function getInfo() {
+    return array(
+      'name' => 'SimpleTest error collector',
+      'description' => 'Performs tests on the Simpletest error and exception collector.',
+      'group' => 'SimpleTest',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('system_test', 'error_test');
+  }
+
+  /**
+   * Test that simpletest collects errors from the tested site.
+   */
+  function testErrorCollect() {
+    $this->collectedErrors = array();
+    $this->drupalGet('error-test/generate-warnings-with-report');
+    $this->assertEqual(count($this->collectedErrors), 3, 'Three errors were collected');
+
+    if (count($this->collectedErrors) == 3) {
+      $this->assertError($this->collectedErrors[0], 'Notice', 'error_test_generate_warnings()', 'error_test.module', 'Undefined variable: bananas');
+      $this->assertError($this->collectedErrors[1], 'Warning', 'error_test_generate_warnings()', 'error_test.module', 'Division by zero');
+      $this->assertError($this->collectedErrors[2], 'User warning', 'error_test_generate_warnings()', 'error_test.module', 'Drupal is awesome');
+    }
+    else {
+      // Give back the errors to the log report.
+      foreach ($this->collectedErrors as $error) {
+        parent::error($error['message'], $error['group'], $error['caller']);
+      }
+    }
+  }
+
+  /**
+   * Error handler that collects errors in an array.
+   *
+   * This test class is trying to verify that simpletest correctly sees errors
+   * and warnings. However, it can't generate errors and warnings that
+   * propagate up to the testing framework itself, or these tests would always
+   * fail. So, this special copy of error() doesn't propagate the errors up
+   * the class hierarchy. It just stuffs them into a protected collectedErrors
+   * array for various assertions to inspect.
+   */
+  protected function error($message = '', $group = 'Other', array $caller = NULL) {
+    // Due to a WTF elsewhere, simpletest treats debug() and verbose()
+    // messages as if they were an 'error'. But, we don't want to collect
+    // those here. This function just wants to collect the real errors (PHP
+    // notices, PHP fatal errors, etc.), and let all the 'errors' from the
+    // 'User notice' group bubble up to the parent classes to be handled (and
+    // eventually displayed) as normal.
+    if ($group == 'User notice') {
+      parent::error($message, $group, $caller);
+    }
+    // Everything else should be collected but not propagated.
+    else {
+      $this->collectedErrors[] = array(
+        'message' => $message,
+        'group' => $group,
+        'caller' => $caller
+      );
+    }
+  }
+
+  /**
+   * Assert that a collected error matches what we are expecting.
+   */
+  function assertError($error, $group, $function, $file, $message = NULL) {
+    $this->assertEqual($error['group'], $group, format_string("Group was %group", array('%group' => $group)));
+    $this->assertEqual($error['caller']['function'], $function, format_string("Function was %function", array('%function' => $function)));
+    $this->assertEqual(drupal_basename($error['caller']['file']), $file, format_string("File was %file", array('%file' => $file)));
+    if (isset($message)) {
+      $this->assertEqual($error['message'], $message, format_string("Message was %message", array('%message' => $message)));
+    }
+  }
+}
+
+/**
+ * Test the drupal_parse_info_file() API function.
+ */
+class ParseInfoFilesTestCase extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Parsing .info files',
+      'description' => 'Tests parsing .info files.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Parse an example .info file an verify the results.
+   */
+  function testParseInfoFile() {
+    $info_values = drupal_parse_info_file(drupal_get_path('module', 'simpletest') . '/tests/common_test_info.txt');
+    $this->assertEqual($info_values['simple_string'], 'A simple string', 'Simple string value was parsed correctly.', 'System');
+    $this->assertEqual($info_values['simple_constant'], WATCHDOG_INFO, 'Constant value was parsed correctly.', 'System');
+    $this->assertEqual($info_values['double_colon'], 'dummyClassName::', 'Value containing double-colon was parsed correctly.', 'System');
+  }
+}
+
+/**
+ * Tests for the drupal_system_listing() function.
+ */
+class DrupalSystemListingTestCase extends DrupalWebTestCase {
+  /**
+   * Use the testing profile; this is needed for testDirectoryPrecedence().
+   */
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Drupal system listing',
+      'description' => 'Tests the mechanism for scanning system directories in drupal_system_listing().',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Test that files in different directories take precedence as expected.
+   */
+  function testDirectoryPrecedence() {
+    // Define the module files we will search for, and the directory precedence
+    // we expect.
+    $expected_directories = array(
+      // When the copy of the module in the profile directory is incompatible
+      // with Drupal core, the copy in the core modules directory takes
+      // precedence.
+      'drupal_system_listing_incompatible_test' => array(
+        'modules/simpletest/tests',
+        'profiles/testing/modules',
+      ),
+      // When both copies of the module are compatible with Drupal core, the
+      // copy in the profile directory takes precedence.
+      'drupal_system_listing_compatible_test' => array(
+        'profiles/testing/modules',
+        'modules/simpletest/tests',
+      ),
+    );
+
+    // This test relies on two versions of the same module existing in
+    // different places in the filesystem. Without that, the test has no
+    // meaning, so assert their presence first.
+    foreach ($expected_directories as $module => $directories) {
+      foreach ($directories as $directory) {
+        $filename = "$directory/$module/$module.module";
+        $this->assertTrue(file_exists(DRUPAL_ROOT . '/' . $filename), format_string('@filename exists.', array('@filename' => $filename)));
+      }
+    }
+
+    // Now scan the directories and check that the files take precedence as
+    // expected.
+    $files = drupal_system_listing('/\.module$/', 'modules', 'name', 1);
+    foreach ($expected_directories as $module => $directories) {
+      $expected_directory = array_shift($directories);
+      $expected_filename = "$expected_directory/$module/$module.module";
+      $this->assertEqual($files[$module]->uri, $expected_filename, format_string('Module @module was found at @filename.', array('@module' => $module, '@filename' => $expected_filename)));
+    }
+  }
+}
+
+/**
+ * Tests for the format_date() function.
+ */
+class FormatDateUnitTest extends DrupalWebTestCase {
+
+  /**
+   * Arbitrary langcode for a custom language.
+   */
+  const LANGCODE = 'xx';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Format date',
+      'description' => 'Test the format_date() function.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale');
+    variable_set('configurable_timezones', 1);
+    variable_set('date_format_long', 'l, j. F Y - G:i');
+    variable_set('date_format_medium', 'j. F Y - G:i');
+    variable_set('date_format_short', 'Y M j - g:ia');
+    variable_set('locale_custom_strings_' . self::LANGCODE, array(
+      '' => array('Sunday' => 'domingo'),
+      'Long month name' => array('March' => 'marzo'),
+    ));
+    $this->refreshVariables();
+  }
+
+  /**
+   * Test admin-defined formats in format_date().
+   */
+  function testAdminDefinedFormatDate() {
+    // Create an admin user.
+    $this->admin_user = $this->drupalCreateUser(array('administer site configuration'));
+    $this->drupalLogin($this->admin_user);
+
+    // Add new date format.
+    $admin_date_format = 'j M y';
+    $edit = array('date_format' => $admin_date_format);
+    $this->drupalPost('admin/config/regional/date-time/formats/add', $edit, 'Add format');
+
+    // Add a new date format which just differs in the case.
+    $admin_date_format_uppercase = 'j M Y';
+    $edit = array('date_format' => $admin_date_format_uppercase);
+    $this->drupalPost('admin/config/regional/date-time/formats/add', $edit, t('Add format'));
+    $this->assertText(t('Custom date format added.'));
+
+    // Add new date type.
+    $edit = array(
+      'date_type' => 'Example Style',
+      'machine_name' => 'example_style',
+      'date_format' => $admin_date_format,
+    );
+    $this->drupalPost('admin/config/regional/date-time/types/add', $edit, 'Add date type');
+
+   // Add a second date format with a different case than the first.
+    $edit = array(
+      'machine_name' => 'example_style_uppercase',
+      'date_type' => 'Example Style Uppercase',
+      'date_format' => $admin_date_format_uppercase,
+    );
+    $this->drupalPost('admin/config/regional/date-time/types/add', $edit, t('Add date type'));
+    $this->assertText(t('New date type added successfully.'));
+
+    $timestamp = strtotime('2007-03-10T00:00:00+00:00');
+    $this->assertIdentical(format_date($timestamp, 'example_style', '', 'America/Los_Angeles'), '9 Mar 07', 'Test format_date() using an admin-defined date type.');
+    $this->assertIdentical(format_date($timestamp, 'example_style_uppercase', '', 'America/Los_Angeles'), '9 Mar 2007', 'Test format_date() using an admin-defined date type with different case.');
+    $this->assertIdentical(format_date($timestamp, 'undefined_style'), format_date($timestamp, 'medium'), 'Test format_date() defaulting to medium when $type not found.');
+  }
+
+  /**
+   * Tests for the format_date() function.
+   */
+  function testFormatDate() {
+    global $user, $language;
+
+    $timestamp = strtotime('2007-03-26T00:00:00+00:00');
+    $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T', 'America/Los_Angeles', 'en'), 'Sunday, 25-Mar-07 17:00:00 PDT', 'Test all parameters.');
+    $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T', 'America/Los_Angeles', self::LANGCODE), 'domingo, 25-Mar-07 17:00:00 PDT', 'Test translated format.');
+    $this->assertIdentical(format_date($timestamp, 'custom', '\\l, d-M-y H:i:s T', 'America/Los_Angeles', self::LANGCODE), 'l, 25-Mar-07 17:00:00 PDT', 'Test an escaped format string.');
+    $this->assertIdentical(format_date($timestamp, 'custom', '\\\\l, d-M-y H:i:s T', 'America/Los_Angeles', self::LANGCODE), '\\domingo, 25-Mar-07 17:00:00 PDT', 'Test format containing backslash character.');
+    $this->assertIdentical(format_date($timestamp, 'custom', '\\\\\\l, d-M-y H:i:s T', 'America/Los_Angeles', self::LANGCODE), '\\l, 25-Mar-07 17:00:00 PDT', 'Test format containing backslash followed by escaped format string.');
+    $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T', 'Europe/London', 'en'), 'Monday, 26-Mar-07 01:00:00 BST', 'Test a different time zone.');
+
+    // Create an admin user and add Spanish language.
+    $admin_user = $this->drupalCreateUser(array('administer languages'));
+    $this->drupalLogin($admin_user);
+    $edit = array(
+      'langcode' => self::LANGCODE,
+      'name' => self::LANGCODE,
+      'native' => self::LANGCODE,
+      'direction' => LANGUAGE_LTR,
+      'prefix' => self::LANGCODE,
+    );
+    $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
+
+    // Create a test user to carry out the tests.
+    $test_user = $this->drupalCreateUser();
+    $this->drupalLogin($test_user);
+    $edit = array('language' => self::LANGCODE, 'mail' => $test_user->mail, 'timezone' => 'America/Los_Angeles');
+    $this->drupalPost('user/' . $test_user->uid . '/edit', $edit, t('Save'));
+
+    // Disable session saving as we are about to modify the global $user.
+    drupal_save_session(FALSE);
+    // Save the original user and language and then replace it with the test user and language.
+    $real_user = $user;
+    $user = user_load($test_user->uid, TRUE);
+    $real_language = $language->language;
+    $language->language = $user->language;
+    // Simulate a Drupal bootstrap with the logged-in user.
+    date_default_timezone_set(drupal_get_user_timezone());
+
+    $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T', 'America/Los_Angeles', 'en'), 'Sunday, 25-Mar-07 17:00:00 PDT', 'Test a different language.');
+    $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T', 'Europe/London'), 'Monday, 26-Mar-07 01:00:00 BST', 'Test a different time zone.');
+    $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T'), 'domingo, 25-Mar-07 17:00:00 PDT', 'Test custom date format.');
+    $this->assertIdentical(format_date($timestamp, 'long'), 'domingo, 25. marzo 2007 - 17:00', 'Test long date format.');
+    $this->assertIdentical(format_date($timestamp, 'medium'), '25. marzo 2007 - 17:00', 'Test medium date format.');
+    $this->assertIdentical(format_date($timestamp, 'short'), '2007 Mar 25 - 5:00pm', 'Test short date format.');
+    $this->assertIdentical(format_date($timestamp), '25. marzo 2007 - 17:00', 'Test default date format.');
+
+    // Restore the original user and language, and enable session saving.
+    $user = $real_user;
+    $language->language = $real_language;
+    // Restore default time zone.
+    date_default_timezone_set(drupal_get_user_timezone());
+    drupal_save_session(TRUE);
+  }
+}
+
+/**
+ * Tests for the format_date() function.
+ */
+class DrupalAttributesUnitTest extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'HTML Attributes',
+      'description' => 'Perform unit tests on the drupal_attributes() function.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Tests that drupal_html_class() cleans the class name properly.
+   */
+  function testDrupalAttributes() {
+    // Verify that special characters are HTML encoded.
+    $this->assertIdentical(drupal_attributes(array('title' => '&"\'<>')), ' title="&amp;&quot;&#039;&lt;&gt;"', 'HTML encode attribute values.');
+
+    // Verify multi-value attributes are concatenated with spaces.
+    $attributes = array('class' => array('first', 'last'));
+    $this->assertIdentical(drupal_attributes(array('class' => array('first', 'last'))), ' class="first last"', 'Concatenate multi-value attributes.');
+
+    // Verify empty attribute values are rendered.
+    $this->assertIdentical(drupal_attributes(array('alt' => '')), ' alt=""', 'Empty attribute value #1.');
+    $this->assertIdentical(drupal_attributes(array('alt' => NULL)), ' alt=""', 'Empty attribute value #2.');
+
+    // Verify multiple attributes are rendered.
+    $attributes = array(
+      'id' => 'id-test',
+      'class' => array('first', 'last'),
+      'alt' => 'Alternate',
+    );
+    $this->assertIdentical(drupal_attributes($attributes), ' id="id-test" class="first last" alt="Alternate"', 'Multiple attributes.');
+
+    // Verify empty attributes array is rendered.
+    $this->assertIdentical(drupal_attributes(array()), '', 'Empty attributes array.');
+  }
+}
+
+/**
+ * Tests converting PHP variables to JSON strings and back.
+ */
+class DrupalJSONTest extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'JSON',
+      'description' => 'Perform unit tests on the drupal_json_encode() and drupal_json_decode() functions.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Tests converting PHP variables to JSON strings and back.
+   */
+  function testJSON() {
+    // Setup a string with the full ASCII table.
+    // @todo: Add tests for non-ASCII characters and Unicode.
+    $str = '';
+    for ($i=0; $i < 128; $i++) {
+      $str .= chr($i);
+    }
+    // Characters that must be escaped.
+    // We check for unescaped " separately.
+    $html_unsafe = array('<', '>', '\'', '&');
+    // The following are the encoded forms of: < > ' & "
+    $html_unsafe_escaped = array('\u003C', '\u003E', '\u0027', '\u0026', '\u0022');
+
+    // Verify there aren't character encoding problems with the source string.
+    $this->assertIdentical(strlen($str), 128, 'A string with the full ASCII table has the correct length.');
+    foreach ($html_unsafe as $char) {
+      $this->assertTrue(strpos($str, $char) > 0, format_string('A string with the full ASCII table includes @s.', array('@s' => $char)));
+    }
+
+    // Verify that JSON encoding produces a string with all of the characters.
+    $json = drupal_json_encode($str);
+    $this->assertTrue(strlen($json) > strlen($str), 'A JSON encoded string is larger than the source string.');
+
+    // The first and last characters should be ", and no others.
+    $this->assertTrue($json[0] == '"', 'A JSON encoded string begins with ".');
+    $this->assertTrue($json[strlen($json) - 1] == '"', 'A JSON encoded string ends with ".');
+    $this->assertTrue(substr_count($json, '"') == 2, 'A JSON encoded string contains exactly two ".');
+
+    // Verify that encoding/decoding is reversible.
+    $json_decoded = drupal_json_decode($json);
+    $this->assertIdentical($str, $json_decoded, 'Encoding a string to JSON and decoding back results in the original string.');
+
+    // Verify reversibility for structured data. Also verify that necessary
+    // characters are escaped.
+    $source = array(TRUE, FALSE, 0, 1, '0', '1', $str, array('key1' => $str, 'key2' => array('nested' => TRUE)));
+    $json = drupal_json_encode($source);
+    foreach ($html_unsafe as $char) {
+      $this->assertTrue(strpos($json, $char) === FALSE, format_string('A JSON encoded string does not contain @s.', array('@s' => $char)));
+    }
+    // Verify that JSON encoding escapes the HTML unsafe characters
+    foreach ($html_unsafe_escaped as $char) {
+      $this->assertTrue(strpos($json, $char) > 0, format_string('A JSON encoded string contains @s.', array('@s' => $char)));
+    }
+    $json_decoded = drupal_json_decode($json);
+    $this->assertNotIdentical($source, $json, 'An array encoded in JSON is not identical to the source.');
+    $this->assertIdentical($source, $json_decoded, 'Encoding structured data to JSON and decoding back results in the original data.');
+  }
+}
+
+/**
+ * Tests for RDF namespaces XML serialization.
+ */
+class DrupalGetRdfNamespacesTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'RDF namespaces XML serialization tests',
+      'description' => 'Confirm that the serialization of RDF namespaces via drupal_get_rdf_namespaces() is output and parsed correctly in the XHTML document.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('rdf', 'rdf_test');
+  }
+
+  /**
+   * Test RDF namespaces.
+   */
+  function testGetRdfNamespaces() {
+    // Fetches the front page and extracts XML namespaces.
+    $this->drupalGet('');
+    $xml = new SimpleXMLElement($this->content);
+    $ns = $xml->getDocNamespaces();
+
+    $this->assertEqual($ns['rdfs'], 'http://www.w3.org/2000/01/rdf-schema#', 'A prefix declared once is displayed.');
+    $this->assertEqual($ns['foaf'], 'http://xmlns.com/foaf/0.1/', 'The same prefix declared in several implementations of hook_rdf_namespaces() is valid as long as all the namespaces are the same.');
+    $this->assertEqual($ns['foaf1'], 'http://xmlns.com/foaf/0.1/', 'Two prefixes can be assigned the same namespace.');
+    $this->assertTrue(!isset($ns['dc']), 'A prefix with conflicting namespaces is discarded.');
+  }
+}
+
+/**
+ * Basic tests for drupal_add_feed().
+ */
+class DrupalAddFeedTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'drupal_add_feed() tests',
+      'description' => 'Make sure that drupal_add_feed() works correctly with various constructs.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Test drupal_add_feed() with paths, URLs, and titles.
+   */
+  function testBasicFeedAddNoTitle() {
+    $path = $this->randomName(12);
+    $external_url = 'http://' . $this->randomName(12) . '/' . $this->randomName(12);
+    $fully_qualified_local_url = url($this->randomName(12), array('absolute' => TRUE));
+
+    $path_for_title = $this->randomName(12);
+    $external_for_title = 'http://' . $this->randomName(12) . '/' . $this->randomName(12);
+    $fully_qualified_for_title = url($this->randomName(12), array('absolute' => TRUE));
+
+    // Possible permutations of drupal_add_feed() to test.
+    // - 'input_url': the path passed to drupal_add_feed(),
+    // - 'output_url': the expected URL to be found in the header.
+    // - 'title' == the title of the feed as passed into drupal_add_feed().
+    $urls = array(
+      'path without title' => array(
+        'input_url' => $path,
+        'output_url' => url($path, array('absolute' => TRUE)),
+        'title' => '',
+      ),
+      'external URL without title' => array(
+        'input_url' => $external_url,
+        'output_url' => $external_url,
+        'title' => '',
+      ),
+      'local URL without title' => array(
+        'input_url' => $fully_qualified_local_url,
+        'output_url' => $fully_qualified_local_url,
+        'title' => '',
+      ),
+      'path with title' => array(
+        'input_url' => $path_for_title,
+        'output_url' => url($path_for_title, array('absolute' => TRUE)),
+        'title' => $this->randomName(12),
+      ),
+      'external URL with title' => array(
+        'input_url' => $external_for_title,
+        'output_url' => $external_for_title,
+        'title' => $this->randomName(12),
+      ),
+      'local URL with title' => array(
+        'input_url' => $fully_qualified_for_title,
+        'output_url' => $fully_qualified_for_title,
+        'title' => $this->randomName(12),
+      ),
+    );
+
+    foreach ($urls as $description => $feed_info) {
+      drupal_add_feed($feed_info['input_url'], $feed_info['title']);
+    }
+
+    $this->drupalSetContent(drupal_get_html_head());
+    foreach ($urls as $description => $feed_info) {
+      $this->assertPattern($this->urlToRSSLinkPattern($feed_info['output_url'], $feed_info['title']), format_string('Found correct feed header for %description', array('%description' => $description)));
+    }
+  }
+
+  /**
+   * Create a pattern representing the RSS feed in the page.
+   */
+  function urlToRSSLinkPattern($url, $title = '') {
+    // Escape any regular expression characters in the URL ('?' is the worst).
+    $url = preg_replace('/([+?.*])/', '[$0]', $url);
+    $generated_pattern = '%<link +rel="alternate" +type="application/rss.xml" +title="' . $title . '" +href="' . $url . '" */>%';
+    return $generated_pattern;
+  }
+}
+
+/**
+ * Test for theme_feed_icon().
+ */
+class FeedIconTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Feed icon',
+      'description' => 'Check escaping of theme_feed_icon()',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Check that special characters are correctly escaped. Test for issue #1211668.
+   */
+  function testFeedIconEscaping() {
+    $variables = array();
+    $variables['url'] = 'node';
+    $variables['title'] = '<>&"\'';
+    $text = theme_feed_icon($variables);
+    preg_match('/title="(.*?)"/', $text, $matches);
+    $this->assertEqual($matches[1], 'Subscribe to &amp;&quot;&#039;', 'theme_feed_icon() escapes reserved HTML characters.');
+  }
+
+}
+
+/**
+ * Test array diff functions.
+ */
+class ArrayDiffUnitTest extends DrupalUnitTestCase {
+
+  /**
+   * Array to use for testing.
+   *
+   * @var array
+   */
+  protected $array1;
+
+  /**
+   * Array to use for testing.
+   *
+   * @var array
+   */
+  protected $array2;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Array differences',
+      'description' => 'Performs tests on drupal_array_diff_assoc_recursive().',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    $this->array1 = array(
+      'same' => 'yes',
+      'different' => 'no',
+      'array_empty_diff' => array(),
+      'null' => NULL,
+      'int_diff' => 1,
+      'array_diff' => array('same' => 'same', 'array' => array('same' => 'same')),
+      'array_compared_to_string' => array('value'),
+      'string_compared_to_array' => 'value',
+      'new' => 'new',
+    );
+    $this->array2 = array(
+      'same' => 'yes',
+      'different' => 'yes',
+      'array_empty_diff' => array(),
+      'null' => NULL,
+      'int_diff' => '1',
+      'array_diff' => array('same' => 'different', 'array' => array('same' => 'same')),
+      'array_compared_to_string' => 'value',
+      'string_compared_to_array' => array('value'),
+    );
+  }
+
+
+  /**
+   * Tests drupal_array_diff_assoc_recursive().
+   */
+  public function testArrayDiffAssocRecursive() {
+    $expected = array(
+      'different' => 'no',
+      'int_diff' => 1,
+      // The 'array' key should not be returned, as it's the same.
+      'array_diff' => array('same' => 'same'),
+      'array_compared_to_string' => array('value'),
+      'string_compared_to_array' => 'value',
+      'new' => 'new',
+    );
+
+    $this->assertIdentical(drupal_array_diff_assoc_recursive($this->array1, $this->array2), $expected);
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/common_test.css b/htmltest/modules/simpletest/tests/common_test.css
new file mode 100644
index 00000000..b86ceadb
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/common_test.css
@@ -0,0 +1,2 @@
+
+/* This file is for testing CSS file inclusion, no contents are necessary. */
diff --git a/htmltest/modules/simpletest/tests/common_test.info b/htmltest/modules/simpletest/tests/common_test.info
new file mode 100644
index 00000000..1c78293f
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/common_test.info
@@ -0,0 +1,14 @@
+name = "Common Test"
+description = "Support module for Common tests."
+package = Testing
+version = VERSION
+core = 7.x
+stylesheets[all][] = common_test.css
+stylesheets[print][] = common_test.print.css
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/common_test.module b/htmltest/modules/simpletest/tests/common_test.module
new file mode 100644
index 00000000..674a4944
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/common_test.module
@@ -0,0 +1,276 @@
+<?php
+
+/**
+ * @file
+ * Helper module for the Common tests.
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function common_test_menu() {
+  $items['common-test/drupal_goto'] = array(
+    'title' => 'Drupal Goto',
+    'page callback' => 'common_test_drupal_goto_land',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['common-test/drupal_goto/fail'] = array(
+    'title' => 'Drupal Goto',
+    'page callback' => 'common_test_drupal_goto_land_fail',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['common-test/drupal_goto/redirect'] = array(
+    'title' => 'Drupal Goto',
+    'page callback' => 'common_test_drupal_goto_redirect',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['common-test/drupal_goto/redirect_advanced'] = array(
+    'title' => 'Drupal Goto',
+    'page callback' => 'common_test_drupal_goto_redirect_advanced',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['common-test/drupal_goto/redirect_fail'] = array(
+    'title' => 'Drupal Goto Failure',
+    'page callback' => 'drupal_goto',
+    'page arguments' => array('common-test/drupal_goto/fail'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['common-test/destination'] = array(
+    'title' => 'Drupal Get Destination',
+    'page callback' => 'common_test_destination',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['common-test/query-string'] = array(
+    'title' => 'Test querystring',
+    'page callback' => 'common_test_js_and_css_querystring',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  return $items;
+}
+
+/**
+ * Redirect using drupal_goto().
+ */
+function common_test_drupal_goto_redirect() {
+  drupal_goto('common-test/drupal_goto');
+}
+
+/**
+ * Redirect using drupal_goto().
+ */
+function common_test_drupal_goto_redirect_advanced() {
+  drupal_goto('common-test/drupal_goto', array('query' => array('foo' => '123')), 301);
+}
+
+/**
+ * Landing page for drupal_goto().
+ */
+function common_test_drupal_goto_land() {
+  print "drupal_goto";
+}
+
+/**
+ * Fail landing page for drupal_goto().
+ */
+function common_test_drupal_goto_land_fail() {
+  print "drupal_goto_fail";
+}
+
+/**
+ * Implements hook_drupal_goto_alter().
+ */
+function common_test_drupal_goto_alter(&$path, &$options, &$http_response_code) {
+  if ($path == 'common-test/drupal_goto/fail') {
+    $path = 'common-test/drupal_goto/redirect';
+  }
+}
+
+/**
+ * Print destination query parameter.
+ */
+function common_test_destination() {
+  $destination = drupal_get_destination();
+  print "The destination: " . check_plain($destination['destination']);
+}
+
+/**
+ * Applies #printed to an element to help test #pre_render.
+ */
+function common_test_drupal_render_printing_pre_render($elements) {
+  $elements['#printed'] = TRUE;
+  return $elements;
+}
+
+/**
+ * Implements hook_TYPE_alter().
+ */
+function common_test_drupal_alter_alter(&$data, &$arg2 = NULL, &$arg3 = NULL) {
+  // Alter first argument.
+  if (is_array($data)) {
+    $data['foo'] = 'Drupal';
+  }
+  elseif (is_object($data)) {
+    $data->foo = 'Drupal';
+  }
+  // Alter second argument, if present.
+  if (isset($arg2)) {
+    if (is_array($arg2)) {
+      $arg2['foo'] = 'Drupal';
+    }
+    elseif (is_object($arg2)) {
+      $arg2->foo = 'Drupal';
+    }
+  }
+  // Try to alter third argument, if present.
+  if (isset($arg3)) {
+    if (is_array($arg3)) {
+      $arg3['foo'] = 'Drupal';
+    }
+    elseif (is_object($arg3)) {
+      $arg3->foo = 'Drupal';
+    }
+  }
+}
+
+/**
+ * Implements hook_TYPE_alter() on behalf of Bartik theme.
+ *
+ * Same as common_test_drupal_alter_alter(), but here, we verify that themes
+ * can also alter and come last.
+ */
+function bartik_drupal_alter_alter(&$data, &$arg2 = NULL, &$arg3 = NULL) {
+  // Alter first argument.
+  if (is_array($data)) {
+    $data['foo'] .= ' theme';
+  }
+  elseif (is_object($data)) {
+    $data->foo .= ' theme';
+  }
+  // Alter second argument, if present.
+  if (isset($arg2)) {
+    if (is_array($arg2)) {
+      $arg2['foo'] .= ' theme';
+    }
+    elseif (is_object($arg2)) {
+      $arg2->foo .= ' theme';
+    }
+  }
+  // Try to alter third argument, if present.
+  if (isset($arg3)) {
+    if (is_array($arg3)) {
+      $arg3['foo'] .= ' theme';
+    }
+    elseif (is_object($arg3)) {
+      $arg3->foo .= ' theme';
+    }
+  }
+}
+
+/**
+ * Implements hook_TYPE_alter() on behalf of block module.
+ *
+ * This is for verifying that drupal_alter(array(TYPE1, TYPE2), ...) allows
+ * hook_module_implements_alter() to affect the order in which module
+ * implementations are executed.
+ */
+function block_drupal_alter_foo_alter(&$data, &$arg2 = NULL, &$arg3 = NULL) {
+  $data['foo'] .= ' block';
+}
+
+/**
+ * Implements hook_module_implements_alter().
+ *
+ * @see block_drupal_alter_foo_alter()
+ */
+function common_test_module_implements_alter(&$implementations, $hook) {
+  // For drupal_alter(array('drupal_alter', 'drupal_alter_foo'), ...), make the
+  // block module implementations run after all the other modules. Note that
+  // when drupal_alter() is called with an array of types, the first type is
+  // considered primary and controls the module order.
+  if ($hook == 'drupal_alter_alter' && isset($implementations['block'])) {
+    $group = $implementations['block'];
+    unset($implementations['block']);
+    $implementations['block'] = $group;
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function common_test_theme() {
+  return array(
+    'common_test_foo' => array(
+      'variables' => array('foo' => 'foo', 'bar' => 'bar'),
+    ),
+  );
+}
+
+/**
+ * Theme function for testing drupal_render() theming.
+ */
+function theme_common_test_foo($variables) {
+  return $variables['foo'] . $variables['bar'];
+}
+
+/**
+ * Implements hook_library_alter().
+ */
+function common_test_library_alter(&$libraries, $module) {
+  if ($module == 'system' && isset($libraries['farbtastic'])) {
+    // Change the title of Farbtastic to "Farbtastic: Altered Library".
+    $libraries['farbtastic']['title'] = 'Farbtastic: Altered Library';
+    // Make Farbtastic depend on jQuery Form to test library dependencies.
+    $libraries['farbtastic']['dependencies'][] = array('system', 'form');
+  }
+}
+
+/**
+ * Implements hook_library().
+ *
+ * Adds Farbtastic in a different version.
+ */
+function common_test_library() {
+  $libraries['farbtastic'] = array(
+    'title' => 'Custom Farbtastic Library',
+    'website' => 'http://code.google.com/p/farbtastic/',
+    'version' => '5.3',
+    'js' => array(
+      'misc/farbtastic/farbtastic.js' => array(),
+    ),
+    'css' => array(
+      'misc/farbtastic/farbtastic.css' => array(),
+    ),
+  );
+  return $libraries;
+}
+
+/**
+ * Adds a JavaScript file and a CSS file with a query string appended.
+ */
+function common_test_js_and_css_querystring() {
+   drupal_add_js(drupal_get_path('module', 'node') . '/node.js');
+   drupal_add_css(drupal_get_path('module', 'node') . '/node.css');
+   // A relative URI may have a query string.
+   drupal_add_css('/' . drupal_get_path('module', 'node') . '/node-fake.css?arg1=value1&arg2=value2');
+   return '';
+}
+
+/**
+ * Implements hook_cron().
+ *
+ * System module should handle if a module does not catch an exception and keep
+ * cron going.
+ *
+ * @see common_test_cron_helper()
+ *
+ */
+function common_test_cron() {
+  throw new Exception(t('Uncaught exception'));
+}
diff --git a/htmltest/modules/simpletest/tests/common_test.print.css b/htmltest/modules/simpletest/tests/common_test.print.css
new file mode 100644
index 00000000..b86ceadb
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/common_test.print.css
@@ -0,0 +1,2 @@
+
+/* This file is for testing CSS file inclusion, no contents are necessary. */
diff --git a/htmltest/modules/simpletest/tests/common_test_cron_helper.info b/htmltest/modules/simpletest/tests/common_test_cron_helper.info
new file mode 100644
index 00000000..73579f43
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/common_test_cron_helper.info
@@ -0,0 +1,12 @@
+name = "Common Test Cron Helper"
+description = "Helper module for CronRunTestCase::testCronExceptions()."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/common_test_cron_helper.module b/htmltest/modules/simpletest/tests/common_test_cron_helper.module
new file mode 100644
index 00000000..94a2b2c4
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/common_test_cron_helper.module
@@ -0,0 +1,17 @@
+<?php
+/**
+ * @file
+ * Helper module for the testCronExceptions in addition to common_test module.
+ */
+
+/**
+ * Implements hook_cron().
+ *
+ * common_test_cron() throws an exception, but the execution should reach this
+ * function as well.
+ *
+ * @see common_test_cron()
+ */
+function common_test_cron_helper_cron() {
+  variable_set('common_test_cron', 'success');
+}
diff --git a/htmltest/modules/simpletest/tests/common_test_info.txt b/htmltest/modules/simpletest/tests/common_test_info.txt
new file mode 100644
index 00000000..ae217b91
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/common_test_info.txt
@@ -0,0 +1,9 @@
+; Test parsing with a simple string.
+simple_string = A simple string
+
+; Test that constants can be used as values.
+simple_constant = WATCHDOG_INFO
+
+; After parsing the .info file, 'double_colon' should hold the literal value.
+; Parsing should not throw a fatal error or try to access a class constant.
+double_colon = dummyClassName::
diff --git a/htmltest/modules/simpletest/tests/database_test.info b/htmltest/modules/simpletest/tests/database_test.info
new file mode 100644
index 00000000..9ca44d8a
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/database_test.info
@@ -0,0 +1,12 @@
+name = "Database Test"
+description = "Support module for Database layer tests."
+core = 7.x
+package = Testing
+version = VERSION
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/database_test.install b/htmltest/modules/simpletest/tests/database_test.install
new file mode 100644
index 00000000..11361151
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/database_test.install
@@ -0,0 +1,221 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the database_test module.
+ */
+
+/**
+ * Implements hook_schema().
+ *
+ * The database tests use the database API which depends on schema
+ * information for certain operations on certain databases.
+ * Therefore, the schema must actually be declared in a normal module
+ * like any other, not directly in the test file.
+ */
+function database_test_schema() {
+  $schema['test'] = array(
+    'description' => 'Basic test table for the database unit tests.',
+    'fields' => array(
+      'id' => array(
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'name' => array(
+        'description' => "A person's name",
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'binary' => TRUE,
+      ),
+      'age' => array(
+        'description' => "The person's age",
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'job' => array(
+        'description' => "The person's job",
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => 'Undefined',
+      ),
+    ),
+    'primary key' => array('id'),
+    'unique keys' => array(
+      'name' => array('name')
+    ),
+    'indexes' => array(
+      'ages' => array('age'),
+    ),
+  );
+
+  // This is an alternate version of the same table that is structured the same
+  // but has a non-serial Primary Key.
+  $schema['test_people'] = array(
+    'description' => 'A duplicate version of the test table, used for additional tests.',
+    'fields' => array(
+      'name' => array(
+        'description' => "A person's name",
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'age' => array(
+        'description' => "The person's age",
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'job' => array(
+        'description' => "The person's job",
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+    ),
+    'primary key' => array('job'),
+    'indexes' => array(
+      'ages' => array('age'),
+    ),
+  );
+
+  $schema['test_people_copy'] = $schema['test_people'];
+  $schema['test_people_copy']['description'] = 'A duplicate version of the test_people table, used for additional tests.';
+
+  $schema['test_one_blob'] = array(
+    'description' => 'A simple table including a BLOB field for testing BLOB behavior.',
+    'fields' => array(
+      'id' => array(
+        'description' => 'Simple unique ID.',
+        'type' => 'serial',
+        'not null' => TRUE,
+      ),
+      'blob1' => array(
+        'description' => 'A BLOB field.',
+        'type' => 'blob',
+      ),
+    ),
+    'primary key' => array('id'),
+    );
+
+  $schema['test_two_blobs'] = array(
+    'description' => 'A simple test table with two BLOB fields.',
+    'fields' => array(
+      'id' => array(
+        'description' => 'Simple unique ID.',
+        'type' => 'serial',
+        'not null' => TRUE,
+      ),
+      'blob1' => array(
+        'description' => 'A dummy BLOB field.',
+        'type' => 'blob',
+      ),
+      'blob2' => array(
+        'description' => 'A second BLOB field.',
+        'type' => 'blob'
+      ),
+    ),
+    'primary key' => array('id'),
+    );
+
+  $schema['test_task'] = array(
+    'description' => 'A task list for people in the test table.',
+    'fields' => array(
+      'tid' => array(
+        'description' => 'Task ID, primary key.',
+        'type' => 'serial',
+        'not null' => TRUE,
+      ),
+      'pid' => array(
+        'description' => 'The {test_people}.pid, foreign key for the test table.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'task' => array(
+        'description' => 'The task to be completed.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'priority' => array(
+        'description' => 'The priority of the task.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'primary key' => array('tid'),
+  );
+
+  $schema['test_null'] = array(
+    'description' => 'Basic test table for NULL value handling.',
+    'fields' => array(
+      'id' => array(
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'name' => array(
+        'description' => "A person's name.",
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => FALSE,
+        'default' => '',
+      ),
+      'age' => array(
+        'description' => "The person's age.",
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => FALSE,
+        'default' => 0),
+    ),
+    'primary key' => array('id'),
+    'unique keys' => array(
+      'name' => array('name')
+    ),
+    'indexes' => array(
+      'ages' => array('age'),
+    ),
+  );
+
+  $schema['test_serialized'] = array(
+    'description' => 'Basic test table for NULL value handling.',
+    'fields' => array(
+      'id' => array(
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'name' => array(
+        'description' => "A person's name.",
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => FALSE,
+        'default' => '',
+      ),
+      'info' => array(
+        'description' => "The person's data in serialized form.",
+        'type' => 'blob',
+        'serialize' => TRUE,
+      ),
+    ),
+    'primary key' => array('id'),
+    'unique keys' => array(
+      'name' => array('name')
+    ),
+  );
+
+  return $schema;
+}
diff --git a/htmltest/modules/simpletest/tests/database_test.module b/htmltest/modules/simpletest/tests/database_test.module
new file mode 100644
index 00000000..6fac3191
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/database_test.module
@@ -0,0 +1,241 @@
+<?php
+
+/**
+ * Implements hook_query_alter().
+ */
+function database_test_query_alter(QueryAlterableInterface $query) {
+
+  if ($query->hasTag('database_test_alter_add_range')) {
+    $query->range(0, 2);
+  }
+
+  if ($query->hasTag('database_test_alter_add_join')) {
+    $people_alias = $query->join('test', 'people', "test_task.pid = %alias.id");
+    $name_field = $query->addField($people_alias, 'name', 'name');
+    $query->condition($people_alias . '.id', 2);
+  }
+
+  if ($query->hasTag('database_test_alter_change_conditional')) {
+    $conditions =& $query->conditions();
+    $conditions[0]['value'] = 2;
+  }
+
+  if ($query->hasTag('database_test_alter_change_fields')) {
+    $fields =& $query->getFields();
+    unset($fields['age']);
+  }
+
+  if ($query->hasTag('database_test_alter_change_expressions')) {
+    $expressions =& $query->getExpressions();
+    $expressions['double_age']['expression'] = 'age*3';
+  }
+}
+
+
+/**
+ * Implements hook_query_TAG_alter().
+ *
+ * Called by DatabaseTestCase::testAlterRemoveRange.
+ */
+function database_test_query_database_test_alter_remove_range_alter(QueryAlterableInterface $query) {
+  $query->range();
+}
+
+/**
+ * Implements hook_menu().
+ */
+function database_test_menu() {
+  $items['database_test/db_query_temporary'] = array(
+    'access callback' => TRUE,
+    'page callback' => 'database_test_db_query_temporary',
+  );
+  $items['database_test/pager_query_even'] = array(
+    'access callback' => TRUE,
+    'page callback' => 'database_test_even_pager_query',
+  );
+  $items['database_test/pager_query_odd'] = array(
+    'access callback' => TRUE,
+    'page callback' => 'database_test_odd_pager_query',
+  );
+  $items['database_test/tablesort'] = array(
+    'access callback' => TRUE,
+    'page callback' => 'database_test_tablesort',
+  );
+  $items['database_test/tablesort_first'] = array(
+    'access callback' => TRUE,
+    'page callback' => 'database_test_tablesort_first',
+  );
+  $items['database_test/tablesort_default_sort'] = array(
+    'access callback' => TRUE,
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('database_test_theme_tablesort'),
+  );
+  return $items;
+}
+
+/**
+ * Run a db_query_temporary and output the table name and its number of rows.
+ *
+ * We need to test that the table created is temporary, so we run it here, in a
+ * separate menu callback request; After this request is done, the temporary
+ * table should automatically dropped.
+ */
+function database_test_db_query_temporary() {
+  $table_name = db_query_temporary('SELECT status FROM {system}', array());
+  drupal_json_output(array(
+    'table_name' => $table_name,
+    'row_count' => db_select($table_name)->countQuery()->execute()->fetchField(),
+  ));
+  exit;
+}
+
+/**
+ * Run a pager query and return the results.
+ *
+ * This function does care about the page GET parameter, as set by the
+ * simpletest HTTP call.
+ */
+function database_test_even_pager_query($limit) {
+
+  $query = db_select('test', 't');
+  $query
+    ->fields('t', array('name'))
+    ->orderBy('age');
+
+  // This should result in 2 pages of results.
+  $query = $query->extend('PagerDefault')->limit($limit);
+
+  $names = $query->execute()->fetchCol();
+
+  drupal_json_output(array(
+    'names' => $names,
+  ));
+  exit;
+}
+
+/**
+ * Run a pager query and return the results.
+ *
+ * This function does care about the page GET parameter, as set by the
+ * simpletest HTTP call.
+ */
+function database_test_odd_pager_query($limit) {
+
+  $query = db_select('test_task', 't');
+  $query
+    ->fields('t', array('task'))
+    ->orderBy('pid');
+
+  // This should result in 4 pages of results.
+  $query = $query->extend('PagerDefault')->limit($limit);
+
+  $names = $query->execute()->fetchCol();
+
+  drupal_json_output(array(
+    'names' => $names,
+  ));
+  exit;
+}
+
+/**
+ * Run a tablesort query and return the results.
+ *
+ * This function does care about the page GET parameter, as set by the
+ * simpletest HTTP call.
+ */
+function database_test_tablesort() {
+  $header = array(
+    'tid' => array('data' => t('Task ID'), 'field' => 'tid', 'sort' => 'desc'),
+    'pid' => array('data' => t('Person ID'), 'field' => 'pid'),
+    'task' => array('data' => t('Task'), 'field' => 'task'),
+    'priority' => array('data' => t('Priority'), 'field' => 'priority', ),
+  );
+
+  $query = db_select('test_task', 't');
+  $query
+    ->fields('t', array('tid', 'pid', 'task', 'priority'));
+
+  $query = $query->extend('TableSort')->orderByHeader($header);
+
+  // We need all the results at once to check the sort.
+  $tasks = $query->execute()->fetchAll();
+
+  drupal_json_output(array(
+    'tasks' => $tasks,
+  ));
+  exit;
+}
+
+/**
+ * Run a tablesort query with a second order_by after and return the results.
+ *
+ * This function does care about the page GET parameter, as set by the
+ * simpletest HTTP call.
+ */
+function database_test_tablesort_first() {
+  $header = array(
+    'tid' => array('data' => t('Task ID'), 'field' => 'tid', 'sort' => 'desc'),
+    'pid' => array('data' => t('Person ID'), 'field' => 'pid'),
+    'task' => array('data' => t('Task'), 'field' => 'task'),
+    'priority' => array('data' => t('Priority'), 'field' => 'priority', ),
+  );
+
+  $query = db_select('test_task', 't');
+  $query
+    ->fields('t', array('tid', 'pid', 'task', 'priority'));
+
+  $query = $query->extend('TableSort')->orderByHeader($header)->orderBy('priority');
+
+  // We need all the results at once to check the sort.
+  $tasks = $query->execute()->fetchAll();
+
+  drupal_json_output(array(
+    'tasks' => $tasks,
+  ));
+  exit;
+}
+
+/**
+ * Output a form without setting a header sort.
+ */
+function database_test_theme_tablesort($form, &$form_state) {
+  $header = array(
+    'username' => array('data' => t('Username'), 'field' => 'u.name'),
+    'status' => array('data' => t('Status'), 'field' => 'u.status'),
+  );
+
+  $query = db_select('users', 'u');
+  $query->condition('u.uid', 0, '<>');
+  user_build_filter_query($query);
+
+  $count_query = clone $query;
+  $count_query->addExpression('COUNT(u.uid)');
+
+  $query = $query->extend('PagerDefault')->extend('TableSort');
+  $query
+    ->fields('u', array('uid', 'name', 'status', 'created', 'access'))
+    ->limit(50)
+    ->orderByHeader($header)
+    ->setCountQuery($count_query);
+  $result = $query->execute();
+
+  $options = array();
+
+  $status = array(t('blocked'), t('active'));
+  $accounts = array();
+  foreach ($result as $account) {
+    $options[$account->uid] = array(
+      'username' => check_plain($account->name),
+      'status' =>  $status[$account->status],
+    );
+  }
+
+  $form['accounts'] = array(
+    '#type' => 'tableselect',
+    '#header' => $header,
+    '#options' => $options,
+    '#empty' => t('No people available.'),
+  );
+
+  return $form;
+}
diff --git a/htmltest/modules/simpletest/tests/database_test.test b/htmltest/modules/simpletest/tests/database_test.test
new file mode 100644
index 00000000..aa390bd4
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/database_test.test
@@ -0,0 +1,4111 @@
+<?php
+
+/**
+ * Dummy class for fetching into a class.
+ *
+ * PDO supports using a new instance of an arbitrary class for records
+ * rather than just a stdClass or array. This class is for testing that
+ * functionality. (See testQueryFetchClass() below)
+ */
+class FakeRecord { }
+
+/**
+ * Base test class for databases.
+ *
+ * Because all database tests share the same test data, we can centralize that
+ * here.
+ */
+class DatabaseTestCase extends DrupalWebTestCase {
+  protected $profile = 'testing';
+
+  function setUp() {
+    parent::setUp('database_test');
+
+    $schema['test'] = drupal_get_schema('test');
+    $schema['test_people'] = drupal_get_schema('test_people');
+    $schema['test_people_copy'] = drupal_get_schema('test_people_copy');
+    $schema['test_one_blob'] = drupal_get_schema('test_one_blob');
+    $schema['test_two_blobs'] = drupal_get_schema('test_two_blobs');
+    $schema['test_task'] = drupal_get_schema('test_task');
+
+    $this->installTables($schema);
+
+    $this->addSampleData();
+  }
+
+  /**
+   * Set up several tables needed by a certain test.
+   *
+   * @param $schema
+   *   An array of table definitions to install.
+   */
+  function installTables($schema) {
+    // This ends up being a test for table drop and create, too, which is nice.
+    foreach ($schema as $name => $data) {
+      if (db_table_exists($name)) {
+        db_drop_table($name);
+      }
+      db_create_table($name, $data);
+    }
+
+    foreach ($schema as $name => $data) {
+      $this->assertTrue(db_table_exists($name), format_string('Table @name created successfully.', array('@name' => $name)));
+    }
+  }
+
+  /**
+   * Set up tables for NULL handling.
+   */
+  function ensureSampleDataNull() {
+    $schema['test_null'] = drupal_get_schema('test_null');
+    $this->installTables($schema);
+
+    db_insert('test_null')
+    ->fields(array('name', 'age'))
+    ->values(array(
+      'name' => 'Kermit',
+      'age' => 25,
+    ))
+    ->values(array(
+      'name' => 'Fozzie',
+      'age' => NULL,
+    ))
+    ->values(array(
+      'name' => 'Gonzo',
+      'age' => 27,
+    ))
+    ->execute();
+  }
+
+  /**
+   * Setup our sample data.
+   *
+   * These are added using db_query(), since we're not trying to test the
+   * INSERT operations here, just populate.
+   */
+  function addSampleData() {
+    // We need the IDs, so we can't use a multi-insert here.
+    $john = db_insert('test')
+      ->fields(array(
+        'name' => 'John',
+        'age' => 25,
+        'job' => 'Singer',
+      ))
+      ->execute();
+
+    $george = db_insert('test')
+      ->fields(array(
+        'name' => 'George',
+        'age' => 27,
+        'job' => 'Singer',
+      ))
+      ->execute();
+
+    $ringo = db_insert('test')
+      ->fields(array(
+        'name' => 'Ringo',
+        'age' => 28,
+        'job' => 'Drummer',
+      ))
+      ->execute();
+
+    $paul = db_insert('test')
+      ->fields(array(
+        'name' => 'Paul',
+        'age' => 26,
+        'job' => 'Songwriter',
+      ))
+      ->execute();
+
+    db_insert('test_people')
+      ->fields(array(
+        'name' => 'Meredith',
+        'age' => 30,
+        'job' => 'Speaker',
+      ))
+      ->execute();
+
+    db_insert('test_task')
+      ->fields(array('pid', 'task', 'priority'))
+      ->values(array(
+        'pid' => $john,
+        'task' => 'eat',
+        'priority' => 3,
+      ))
+      ->values(array(
+        'pid' => $john,
+        'task' => 'sleep',
+        'priority' => 4,
+      ))
+      ->values(array(
+        'pid' => $john,
+        'task' => 'code',
+        'priority' => 1,
+      ))
+      ->values(array(
+        'pid' => $george,
+        'task' => 'sing',
+        'priority' => 2,
+      ))
+      ->values(array(
+        'pid' => $george,
+        'task' => 'sleep',
+        'priority' => 2,
+      ))
+      ->values(array(
+        'pid' => $paul,
+        'task' => 'found new band',
+        'priority' => 1,
+      ))
+      ->values(array(
+        'pid' => $paul,
+        'task' => 'perform at superbowl',
+        'priority' => 3,
+      ))
+      ->execute();
+  }
+}
+
+/**
+ * Test connection management.
+ */
+class DatabaseConnectionTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Connection tests',
+      'description' => 'Tests of the core database system.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test that connections return appropriate connection objects.
+   */
+  function testConnectionRouting() {
+    // Clone the master credentials to a slave connection.
+    // Note this will result in two independent connection objects that happen
+    // to point to the same place.
+    $connection_info = Database::getConnectionInfo('default');
+    Database::addConnectionInfo('default', 'slave', $connection_info['default']);
+
+    $db1 = Database::getConnection('default', 'default');
+    $db2 = Database::getConnection('slave', 'default');
+
+    $this->assertNotNull($db1, 'default connection is a real connection object.');
+    $this->assertNotNull($db2, 'slave connection is a real connection object.');
+    $this->assertNotIdentical($db1, $db2, 'Each target refers to a different connection.');
+
+    // Try to open those targets another time, that should return the same objects.
+    $db1b = Database::getConnection('default', 'default');
+    $db2b = Database::getConnection('slave', 'default');
+    $this->assertIdentical($db1, $db1b, 'A second call to getConnection() returns the same object.');
+    $this->assertIdentical($db2, $db2b, 'A second call to getConnection() returns the same object.');
+
+    // Try to open an unknown target.
+    $unknown_target = $this->randomName();
+    $db3 = Database::getConnection($unknown_target, 'default');
+    $this->assertNotNull($db3, 'Opening an unknown target returns a real connection object.');
+    $this->assertIdentical($db1, $db3, 'An unknown target opens the default connection.');
+
+    // Try to open that unknown target another time, that should return the same object.
+    $db3b = Database::getConnection($unknown_target, 'default');
+    $this->assertIdentical($db3, $db3b, 'A second call to getConnection() returns the same object.');
+  }
+
+  /**
+   * Test that connections return appropriate connection objects.
+   */
+  function testConnectionRoutingOverride() {
+    // Clone the master credentials to a slave connection.
+    // Note this will result in two independent connection objects that happen
+    // to point to the same place.
+    $connection_info = Database::getConnectionInfo('default');
+    Database::addConnectionInfo('default', 'slave', $connection_info['default']);
+
+    Database::ignoreTarget('default', 'slave');
+
+    $db1 = Database::getConnection('default', 'default');
+    $db2 = Database::getConnection('slave', 'default');
+
+    $this->assertIdentical($db1, $db2, 'Both targets refer to the same connection.');
+  }
+
+  /**
+   * Tests the closing of a database connection.
+   */
+  function testConnectionClosing() {
+    // Open the default target so we have an object to compare.
+    $db1 = Database::getConnection('default', 'default');
+
+    // Try to close the the default connection, then open a new one.
+    Database::closeConnection('default', 'default');
+    $db2 = Database::getConnection('default', 'default');
+
+    // Opening a connection after closing it should yield an object different than the original.
+    $this->assertNotIdentical($db1, $db2, 'Opening the default connection after it is closed returns a new object.');
+  }
+
+  /**
+   * Tests the connection options of the active database.
+   */
+  function testConnectionOptions() {
+    $connection_info = Database::getConnectionInfo('default');
+
+    // Be sure we're connected to the default database.
+    $db = Database::getConnection('default', 'default');
+    $connectionOptions = $db->getConnectionOptions();
+
+    // In the MySQL driver, the port can be different, so check individual
+    // options.
+    $this->assertEqual($connection_info['default']['driver'], $connectionOptions['driver'], 'The default connection info driver matches the current connection options driver.');
+    $this->assertEqual($connection_info['default']['database'], $connectionOptions['database'], 'The default connection info database matches the current connection options database.');
+
+    // Set up identical slave and confirm connection options are identical.
+    Database::addConnectionInfo('default', 'slave', $connection_info['default']);
+    $db2 = Database::getConnection('slave', 'default');
+    $connectionOptions2 = $db2->getConnectionOptions();
+
+    // Get a fresh copy of the default connection options.
+    $connectionOptions = $db->getConnectionOptions();
+    $this->assertIdentical($connectionOptions, $connectionOptions2, 'The default and slave connection options are identical.');
+
+    // Set up a new connection with different connection info.
+    $test = $connection_info['default'];
+    $test['database'] .= 'test';
+    Database::addConnectionInfo('test', 'default', $test);
+    $connection_info = Database::getConnectionInfo('test');
+
+    // Get a fresh copy of the default connection options.
+    $connectionOptions = $db->getConnectionOptions();
+    $this->assertNotEqual($connection_info['default']['database'], $connectionOptions['database'], 'The test connection info database does not match the current connection options database.');
+  }
+}
+
+/**
+ * Test cloning Select queries.
+ */
+class DatabaseSelectCloneTest extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Select tests, cloning',
+      'description' => 'Test cloning Select queries.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test that subqueries as value within conditions are cloned properly.
+   */
+  function testSelectConditionSubQueryCloning() {
+    $subquery = db_select('test', 't');
+    $subquery->addField('t', 'id', 'id');
+    $subquery->condition('age', 28, '<');
+
+    $query = db_select('test', 't');
+    $query->addField('t', 'name', 'name');
+    $query->condition('id', $subquery, 'IN');
+
+    $clone = clone $query;
+    // Cloned query should not be altered by the following modification
+    // happening on original query.
+    $subquery->condition('age', 25, '>');
+
+    $clone_result = $clone->countQuery()->execute()->fetchField();
+    $query_result = $query->countQuery()->execute()->fetchField();
+
+    // Make sure the cloned query has not been modified
+    $this->assertEqual(3, $clone_result, 'The cloned query returns the expected number of rows');
+    $this->assertEqual(2, $query_result, 'The query returns the expected number of rows');
+  }
+}
+
+/**
+ * Test fetch actions, part 1.
+ *
+ * We get timeout errors if we try to run too many tests at once.
+ */
+class DatabaseFetchTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Fetch tests',
+      'description' => 'Test the Database system\'s various fetch capabilities.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Confirm that we can fetch a record properly in default object mode.
+   */
+  function testQueryFetchDefault() {
+    $records = array();
+    $result = db_query('SELECT name FROM {test} WHERE age = :age', array(':age' => 25));
+    $this->assertTrue($result instanceof DatabaseStatementInterface, 'Result set is a Drupal statement object.');
+    foreach ($result as $record) {
+      $records[] = $record;
+      $this->assertTrue(is_object($record), 'Record is an object.');
+      $this->assertIdentical($record->name, 'John', '25 year old is John.');
+    }
+
+    $this->assertIdentical(count($records), 1, 'There is only one record.');
+  }
+
+  /**
+   * Confirm that we can fetch a record to an object explicitly.
+   */
+  function testQueryFetchObject() {
+    $records = array();
+    $result = db_query('SELECT name FROM {test} WHERE age = :age', array(':age' => 25), array('fetch' => PDO::FETCH_OBJ));
+    foreach ($result as $record) {
+      $records[] = $record;
+      $this->assertTrue(is_object($record), 'Record is an object.');
+      $this->assertIdentical($record->name, 'John', '25 year old is John.');
+    }
+
+    $this->assertIdentical(count($records), 1, 'There is only one record.');
+  }
+
+  /**
+   * Confirm that we can fetch a record to an array associative explicitly.
+   */
+  function testQueryFetchArray() {
+    $records = array();
+    $result = db_query('SELECT name FROM {test} WHERE age = :age', array(':age' => 25), array('fetch' => PDO::FETCH_ASSOC));
+    foreach ($result as $record) {
+      $records[] = $record;
+      if ($this->assertTrue(is_array($record), 'Record is an array.')) {
+        $this->assertIdentical($record['name'], 'John', 'Record can be accessed associatively.');
+      }
+    }
+
+    $this->assertIdentical(count($records), 1, 'There is only one record.');
+  }
+
+  /**
+   * Confirm that we can fetch a record into a new instance of a custom class.
+   *
+   * @see FakeRecord
+   */
+  function testQueryFetchClass() {
+    $records = array();
+    $result = db_query('SELECT name FROM {test} WHERE age = :age', array(':age' => 25), array('fetch' => 'FakeRecord'));
+    foreach ($result as $record) {
+      $records[] = $record;
+      if ($this->assertTrue($record instanceof FakeRecord, 'Record is an object of class FakeRecord.')) {
+        $this->assertIdentical($record->name, 'John', '25 year old is John.');
+      }
+    }
+
+    $this->assertIdentical(count($records), 1, 'There is only one record.');
+  }
+}
+
+/**
+ * Test fetch actions, part 2.
+ *
+ * We get timeout errors if we try to run too many tests at once.
+ */
+class DatabaseFetch2TestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Fetch tests, part 2',
+      'description' => 'Test the Database system\'s various fetch capabilities.',
+      'group' => 'Database',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+  }
+
+  // Confirm that we can fetch a record into an indexed array explicitly.
+  function testQueryFetchNum() {
+    $records = array();
+    $result = db_query('SELECT name FROM {test} WHERE age = :age', array(':age' => 25), array('fetch' => PDO::FETCH_NUM));
+    foreach ($result as $record) {
+      $records[] = $record;
+      if ($this->assertTrue(is_array($record), 'Record is an array.')) {
+        $this->assertIdentical($record[0], 'John', 'Record can be accessed numerically.');
+      }
+    }
+
+    $this->assertIdentical(count($records), 1, 'There is only one record');
+  }
+
+  /**
+   * Confirm that we can fetch a record into a doubly-keyed array explicitly.
+   */
+  function testQueryFetchBoth() {
+    $records = array();
+    $result = db_query('SELECT name FROM {test} WHERE age = :age', array(':age' => 25), array('fetch' => PDO::FETCH_BOTH));
+    foreach ($result as $record) {
+      $records[] = $record;
+      if ($this->assertTrue(is_array($record), 'Record is an array.')) {
+        $this->assertIdentical($record[0], 'John', 'Record can be accessed numerically.');
+        $this->assertIdentical($record['name'], 'John', 'Record can be accessed associatively.');
+      }
+    }
+
+    $this->assertIdentical(count($records), 1, 'There is only one record.');
+  }
+
+  /**
+   * Confirm that we can fetch an entire column of a result set at once.
+   */
+  function testQueryFetchCol() {
+    $records = array();
+    $result = db_query('SELECT name FROM {test} WHERE age > :age', array(':age' => 25));
+    $column = $result->fetchCol();
+    $this->assertIdentical(count($column), 3, 'fetchCol() returns the right number of records.');
+
+    $result = db_query('SELECT name FROM {test} WHERE age > :age', array(':age' => 25));
+    $i = 0;
+    foreach ($result as $record) {
+      $this->assertIdentical($record->name, $column[$i++], 'Column matches direct accesss.');
+    }
+  }
+}
+
+/**
+ * Test the insert builder.
+ */
+class DatabaseInsertTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Insert tests',
+      'description' => 'Test the Insert query builder.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test the very basic insert functionality.
+   */
+  function testSimpleInsert() {
+    $num_records_before = db_query('SELECT COUNT(*) FROM {test}')->fetchField();
+
+    $query = db_insert('test');
+    $query->fields(array(
+      'name' => 'Yoko',
+      'age' => '29',
+    ));
+    $query->execute();
+
+    $num_records_after = db_query('SELECT COUNT(*) FROM {test}')->fetchField();
+    $this->assertIdentical($num_records_before + 1, (int) $num_records_after, 'Record inserts correctly.');
+    $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Yoko'))->fetchField();
+    $this->assertIdentical($saved_age, '29', 'Can retrieve after inserting.');
+  }
+
+  /**
+   * Test that we can insert multiple records in one query object.
+   */
+  function testMultiInsert() {
+    $num_records_before = (int) db_query('SELECT COUNT(*) FROM {test}')->fetchField();
+
+    $query = db_insert('test');
+    $query->fields(array(
+      'name' => 'Larry',
+      'age' => '30',
+    ));
+
+    // We should be able to specify values in any order if named.
+    $query->values(array(
+      'age' => '31',
+      'name' => 'Curly',
+    ));
+
+    // We should be able to say "use the field order".
+    // This is not the recommended mechanism for most cases, but it should work.
+    $query->values(array('Moe', '32'));
+    $query->execute();
+
+    $num_records_after = (int) db_query('SELECT COUNT(*) FROM {test}')->fetchField();
+    $this->assertIdentical($num_records_before + 3, $num_records_after, 'Record inserts correctly.');
+    $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Larry'))->fetchField();
+    $this->assertIdentical($saved_age, '30', 'Can retrieve after inserting.');
+    $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Curly'))->fetchField();
+    $this->assertIdentical($saved_age, '31', 'Can retrieve after inserting.');
+    $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Moe'))->fetchField();
+    $this->assertIdentical($saved_age, '32', 'Can retrieve after inserting.');
+  }
+
+  /**
+   * Test that an insert object can be reused with new data after it executes.
+   */
+  function testRepeatedInsert() {
+    $num_records_before = db_query('SELECT COUNT(*) FROM {test}')->fetchField();
+
+    $query = db_insert('test');
+
+    $query->fields(array(
+      'name' => 'Larry',
+      'age' => '30',
+    ));
+    $query->execute();  // This should run the insert, but leave the fields intact.
+
+    // We should be able to specify values in any order if named.
+    $query->values(array(
+      'age' => '31',
+      'name' => 'Curly',
+    ));
+    $query->execute();
+
+    // We should be able to say "use the field order".
+    $query->values(array('Moe', '32'));
+    $query->execute();
+
+    $num_records_after = db_query('SELECT COUNT(*) FROM {test}')->fetchField();
+    $this->assertIdentical((int) $num_records_before + 3, (int) $num_records_after, 'Record inserts correctly.');
+    $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Larry'))->fetchField();
+    $this->assertIdentical($saved_age, '30', 'Can retrieve after inserting.');
+    $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Curly'))->fetchField();
+    $this->assertIdentical($saved_age, '31', 'Can retrieve after inserting.');
+    $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Moe'))->fetchField();
+    $this->assertIdentical($saved_age, '32', 'Can retrieve after inserting.');
+  }
+
+  /**
+   * Test that we can specify fields without values and specify values later.
+   */
+  function testInsertFieldOnlyDefinintion() {
+    // This is useful for importers, when we want to create a query and define
+    // its fields once, then loop over a multi-insert execution.
+    db_insert('test')
+      ->fields(array('name', 'age'))
+      ->values(array('Larry', '30'))
+      ->values(array('Curly', '31'))
+      ->values(array('Moe', '32'))
+      ->execute();
+    $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Larry'))->fetchField();
+    $this->assertIdentical($saved_age, '30', 'Can retrieve after inserting.');
+    $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Curly'))->fetchField();
+    $this->assertIdentical($saved_age, '31', 'Can retrieve after inserting.');
+    $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Moe'))->fetchField();
+    $this->assertIdentical($saved_age, '32', 'Can retrieve after inserting.');
+  }
+
+  /**
+   * Test that inserts return the proper auto-increment ID.
+   */
+  function testInsertLastInsertID() {
+    $id = db_insert('test')
+      ->fields(array(
+        'name' => 'Larry',
+        'age' => '30',
+      ))
+      ->execute();
+
+    $this->assertIdentical($id, '5', 'Auto-increment ID returned successfully.');
+  }
+
+  /**
+   * Test that the INSERT INTO ... SELECT (fields) ... syntax works.
+   */
+  function testInsertSelectFields() {
+    $query = db_select('test_people', 'tp');
+    // The query builder will always append expressions after fields.
+    // Add the expression first to test that the insert fields are correctly
+    // re-ordered.
+    $query->addExpression('tp.age', 'age');
+    $query
+      ->fields('tp', array('name','job'))
+      ->condition('tp.name', 'Meredith');
+
+    // The resulting query should be equivalent to:
+    // INSERT INTO test (age, name, job)
+    // SELECT tp.age AS age, tp.name AS name, tp.job AS job
+    // FROM test_people tp
+    // WHERE tp.name = 'Meredith'
+    db_insert('test')
+      ->from($query)
+      ->execute();
+
+    $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Meredith'))->fetchField();
+    $this->assertIdentical($saved_age, '30', 'Can retrieve after inserting.');
+  }
+
+  /**
+   * Tests that the INSERT INTO ... SELECT * ... syntax works.
+   */
+  function testInsertSelectAll() {
+    $query = db_select('test_people', 'tp')
+      ->fields('tp')
+      ->condition('tp.name', 'Meredith');
+
+    // The resulting query should be equivalent to:
+    // INSERT INTO test_people_copy
+    // SELECT *
+    // FROM test_people tp
+    // WHERE tp.name = 'Meredith'
+    db_insert('test_people_copy')
+      ->from($query)
+      ->execute();
+
+    $saved_age = db_query('SELECT age FROM {test_people_copy} WHERE name = :name', array(':name' => 'Meredith'))->fetchField();
+    $this->assertIdentical($saved_age, '30', 'Can retrieve after inserting.');
+  }
+}
+
+/**
+ * Insert tests using LOB fields, which are weird on some databases.
+ */
+class DatabaseInsertLOBTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Insert tests, LOB fields',
+      'description' => 'Test the Insert query builder with LOB fields.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test that we can insert a single blob field successfully.
+   */
+  function testInsertOneBlob() {
+    $data = "This is\000a test.";
+    $this->assertTrue(strlen($data) === 15, 'Test data contains a NULL.');
+    $id = db_insert('test_one_blob')
+      ->fields(array('blob1' => $data))
+      ->execute();
+    $r = db_query('SELECT * FROM {test_one_blob} WHERE id = :id', array(':id' => $id))->fetchAssoc();
+    $this->assertTrue($r['blob1'] === $data, format_string('Can insert a blob: id @id, @data.', array('@id' => $id, '@data' => serialize($r))));
+  }
+
+  /**
+   * Test that we can insert multiple blob fields in the same query.
+   */
+  function testInsertMultipleBlob() {
+    $id = db_insert('test_two_blobs')
+      ->fields(array(
+        'blob1' => 'This is',
+        'blob2' => 'a test',
+      ))
+      ->execute();
+    $r = db_query('SELECT * FROM {test_two_blobs} WHERE id = :id', array(':id' => $id))->fetchAssoc();
+    $this->assertTrue($r['blob1'] === 'This is' && $r['blob2'] === 'a test', 'Can insert multiple blobs per row.');
+  }
+}
+
+/**
+ * Insert tests for "database default" values.
+ */
+class DatabaseInsertDefaultsTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Insert tests, default fields',
+      'description' => 'Test the Insert query builder with default values.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test that we can run a query that is "default values for everything".
+   */
+  function testDefaultInsert() {
+    $query = db_insert('test')->useDefaults(array('job'));
+    $id = $query->execute();
+
+    $schema = drupal_get_schema('test');
+
+    $job = db_query('SELECT job FROM {test} WHERE id = :id', array(':id' => $id))->fetchField();
+    $this->assertEqual($job, $schema['fields']['job']['default'], 'Default field value is set.');
+  }
+
+  /**
+   * Test that no action will be preformed if no fields are specified.
+   */
+  function testDefaultEmptyInsert() {
+    $num_records_before = (int) db_query('SELECT COUNT(*) FROM {test}')->fetchField();
+
+    try {
+      $result = db_insert('test')->execute();
+      // This is only executed if no exception has been thrown.
+      $this->fail('Expected exception NoFieldsException has not been thrown.');
+    } catch (NoFieldsException $e) {
+      $this->pass('Expected exception NoFieldsException has been thrown.');
+    }
+
+    $num_records_after = (int) db_query('SELECT COUNT(*) FROM {test}')->fetchField();
+    $this->assertIdentical($num_records_before, $num_records_after, 'Do nothing as no fields are specified.');
+  }
+
+  /**
+   * Test that we can insert fields with values and defaults in the same query.
+   */
+  function testDefaultInsertWithFields() {
+    $query = db_insert('test')
+      ->fields(array('name' => 'Bob'))
+      ->useDefaults(array('job'));
+    $id = $query->execute();
+
+    $schema = drupal_get_schema('test');
+
+    $job = db_query('SELECT job FROM {test} WHERE id = :id', array(':id' => $id))->fetchField();
+    $this->assertEqual($job, $schema['fields']['job']['default'], 'Default field value is set.');
+  }
+}
+
+/**
+ * Update builder tests.
+ */
+class DatabaseUpdateTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Update tests',
+      'description' => 'Test the Update query builder.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Confirm that we can update a single record successfully.
+   */
+  function testSimpleUpdate() {
+    $num_updated = db_update('test')
+      ->fields(array('name' => 'Tiffany'))
+      ->condition('id', 1)
+      ->execute();
+    $this->assertIdentical($num_updated, 1, 'Updated 1 record.');
+
+    $saved_name = db_query('SELECT name FROM {test} WHERE id = :id', array(':id' => 1))->fetchField();
+    $this->assertIdentical($saved_name, 'Tiffany', 'Updated name successfully.');
+  }
+
+  /**
+   * Confirm updating to NULL.
+   */
+  function testSimpleNullUpdate() {
+    $this->ensureSampleDataNull();
+    $num_updated = db_update('test_null')
+      ->fields(array('age' => NULL))
+      ->condition('name', 'Kermit')
+      ->execute();
+    $this->assertIdentical($num_updated, 1, 'Updated 1 record.');
+
+    $saved_age = db_query('SELECT age FROM {test_null} WHERE name = :name', array(':name' => 'Kermit'))->fetchField();
+    $this->assertNull($saved_age, 'Updated name successfully.');
+  }
+
+  /**
+   * Confirm that we can update a multiple records successfully.
+   */
+  function testMultiUpdate() {
+    $num_updated = db_update('test')
+      ->fields(array('job' => 'Musician'))
+      ->condition('job', 'Singer')
+      ->execute();
+    $this->assertIdentical($num_updated, 2, 'Updated 2 records.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', array(':job' => 'Musician'))->fetchField();
+    $this->assertIdentical($num_matches, '2', 'Updated fields successfully.');
+  }
+
+  /**
+   * Confirm that we can update a multiple records with a non-equality condition.
+   */
+  function testMultiGTUpdate() {
+    $num_updated = db_update('test')
+      ->fields(array('job' => 'Musician'))
+      ->condition('age', 26, '>')
+      ->execute();
+    $this->assertIdentical($num_updated, 2, 'Updated 2 records.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', array(':job' => 'Musician'))->fetchField();
+    $this->assertIdentical($num_matches, '2', 'Updated fields successfully.');
+  }
+
+  /**
+   * Confirm that we can update a multiple records with a where call.
+   */
+  function testWhereUpdate() {
+    $num_updated = db_update('test')
+      ->fields(array('job' => 'Musician'))
+      ->where('age > :age', array(':age' => 26))
+      ->execute();
+    $this->assertIdentical($num_updated, 2, 'Updated 2 records.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', array(':job' => 'Musician'))->fetchField();
+    $this->assertIdentical($num_matches, '2', 'Updated fields successfully.');
+  }
+
+  /**
+   * Confirm that we can stack condition and where calls.
+   */
+  function testWhereAndConditionUpdate() {
+    $update = db_update('test')
+      ->fields(array('job' => 'Musician'))
+      ->where('age > :age', array(':age' => 26))
+      ->condition('name', 'Ringo');
+    $num_updated = $update->execute();
+    $this->assertIdentical($num_updated, 1, 'Updated 1 record.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', array(':job' => 'Musician'))->fetchField();
+    $this->assertIdentical($num_matches, '1', 'Updated fields successfully.');
+  }
+
+  /**
+   * Test updating with expressions.
+   */
+  function testExpressionUpdate() {
+    // Set age = 1 for a single row for this test to work.
+    db_update('test')
+      ->condition('id', 1)
+      ->fields(array('age' => 1))
+      ->execute();
+
+    // Ensure that expressions are handled properly.  This should set every
+    // record's age to a square of itself, which will change only three of the
+    // four records in the table since 1*1 = 1. That means only three records
+    // are modified, so we should get back 3, not 4, from execute().
+    $num_rows = db_update('test')
+      ->expression('age', 'age * age')
+      ->execute();
+    $this->assertIdentical($num_rows, 3, 'Number of affected rows are returned.');
+  }
+
+  /**
+   * Confirm that we can update the primary key of a record successfully.
+   */
+  function testPrimaryKeyUpdate() {
+    $num_updated = db_update('test')
+      ->fields(array('id' => 42, 'name' => 'John'))
+      ->condition('id', 1)
+      ->execute();
+    $this->assertIdentical($num_updated, 1, 'Updated 1 record.');
+
+    $saved_name= db_query('SELECT name FROM {test} WHERE id = :id', array(':id' => 42))->fetchField();
+    $this->assertIdentical($saved_name, 'John', 'Updated primary key successfully.');
+  }
+}
+
+/**
+ * Tests for more complex update statements.
+ */
+class DatabaseUpdateComplexTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Update tests, Complex',
+      'description' => 'Test the Update query builder, complex queries.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test updates with OR conditionals.
+   */
+  function testOrConditionUpdate() {
+    $update = db_update('test')
+      ->fields(array('job' => 'Musician'))
+      ->condition(db_or()
+        ->condition('name', 'John')
+        ->condition('name', 'Paul')
+      );
+    $num_updated = $update->execute();
+    $this->assertIdentical($num_updated, 2, 'Updated 2 records.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', array(':job' => 'Musician'))->fetchField();
+    $this->assertIdentical($num_matches, '2', 'Updated fields successfully.');
+  }
+
+  /**
+   * Test WHERE IN clauses.
+   */
+  function testInConditionUpdate() {
+    $num_updated = db_update('test')
+      ->fields(array('job' => 'Musician'))
+      ->condition('name', array('John', 'Paul'), 'IN')
+      ->execute();
+    $this->assertIdentical($num_updated, 2, 'Updated 2 records.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', array(':job' => 'Musician'))->fetchField();
+    $this->assertIdentical($num_matches, '2', 'Updated fields successfully.');
+  }
+
+  /**
+   * Test WHERE NOT IN clauses.
+   */
+  function testNotInConditionUpdate() {
+    // The o is lowercase in the 'NoT IN' operator, to make sure the operators
+    // work in mixed case.
+    $num_updated = db_update('test')
+      ->fields(array('job' => 'Musician'))
+      ->condition('name', array('John', 'Paul', 'George'), 'NoT IN')
+      ->execute();
+    $this->assertIdentical($num_updated, 1, 'Updated 1 record.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', array(':job' => 'Musician'))->fetchField();
+    $this->assertIdentical($num_matches, '1', 'Updated fields successfully.');
+  }
+
+  /**
+   * Test BETWEEN conditional clauses.
+   */
+  function testBetweenConditionUpdate() {
+    $num_updated = db_update('test')
+      ->fields(array('job' => 'Musician'))
+      ->condition('age', array(25, 26), 'BETWEEN')
+      ->execute();
+    $this->assertIdentical($num_updated, 2, 'Updated 2 records.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', array(':job' => 'Musician'))->fetchField();
+    $this->assertIdentical($num_matches, '2', 'Updated fields successfully.');
+  }
+
+  /**
+   * Test LIKE conditionals.
+   */
+  function testLikeConditionUpdate() {
+    $num_updated = db_update('test')
+      ->fields(array('job' => 'Musician'))
+      ->condition('name', '%ge%', 'LIKE')
+      ->execute();
+    $this->assertIdentical($num_updated, 1, 'Updated 1 record.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', array(':job' => 'Musician'))->fetchField();
+    $this->assertIdentical($num_matches, '1', 'Updated fields successfully.');
+  }
+
+  /**
+   * Test update with expression values.
+   */
+  function testUpdateExpression() {
+    $before_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Ringo'))->fetchField();
+    $GLOBALS['larry_test'] = 1;
+    $num_updated = db_update('test')
+      ->condition('name', 'Ringo')
+      ->fields(array('job' => 'Musician'))
+      ->expression('age', 'age + :age', array(':age' => 4))
+      ->execute();
+    $this->assertIdentical($num_updated, 1, 'Updated 1 record.');
+
+    $num_matches = db_query('SELECT COUNT(*) FROM {test} WHERE job = :job', array(':job' => 'Musician'))->fetchField();
+    $this->assertIdentical($num_matches, '1', 'Updated fields successfully.');
+
+    $person = db_query('SELECT * FROM {test} WHERE name = :name', array(':name' => 'Ringo'))->fetch();
+    $this->assertEqual($person->name, 'Ringo', 'Name set correctly.');
+    $this->assertEqual($person->age, $before_age + 4, 'Age set correctly.');
+    $this->assertEqual($person->job, 'Musician', 'Job set correctly.');
+    $GLOBALS['larry_test'] = 0;
+  }
+
+  /**
+   * Test update with only expression values.
+   */
+  function testUpdateOnlyExpression() {
+    $before_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Ringo'))->fetchField();
+    $num_updated = db_update('test')
+      ->condition('name', 'Ringo')
+      ->expression('age', 'age + :age', array(':age' => 4))
+      ->execute();
+    $this->assertIdentical($num_updated, 1, 'Updated 1 record.');
+
+    $after_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Ringo'))->fetchField();
+    $this->assertEqual($before_age + 4, $after_age, 'Age updated correctly');
+  }
+}
+
+/**
+ * Test update queries involving LOB values.
+ */
+class DatabaseUpdateLOBTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Update tests, LOB',
+      'description' => 'Test the Update query builder with LOB fields.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Confirm that we can update a blob column.
+   */
+  function testUpdateOneBlob() {
+    $data = "This is\000a test.";
+    $this->assertTrue(strlen($data) === 15, 'Test data contains a NULL.');
+    $id = db_insert('test_one_blob')
+      ->fields(array('blob1' => $data))
+      ->execute();
+
+    $data .= $data;
+    db_update('test_one_blob')
+      ->condition('id', $id)
+      ->fields(array('blob1' => $data))
+      ->execute();
+
+    $r = db_query('SELECT * FROM {test_one_blob} WHERE id = :id', array(':id' => $id))->fetchAssoc();
+    $this->assertTrue($r['blob1'] === $data, format_string('Can update a blob: id @id, @data.', array('@id' => $id, '@data' => serialize($r))));
+  }
+
+  /**
+   * Confirm that we can update two blob columns in the same table.
+   */
+  function testUpdateMultipleBlob() {
+    $id = db_insert('test_two_blobs')
+      ->fields(array(
+        'blob1' => 'This is',
+        'blob2' => 'a test',
+      ))
+      ->execute();
+
+    db_update('test_two_blobs')
+      ->condition('id', $id)
+      ->fields(array('blob1' => 'and so', 'blob2' => 'is this'))
+      ->execute();
+
+    $r = db_query('SELECT * FROM {test_two_blobs} WHERE id = :id', array(':id' => $id))->fetchAssoc();
+    $this->assertTrue($r['blob1'] === 'and so' && $r['blob2'] === 'is this', 'Can update multiple blobs per row.');
+  }
+}
+
+/**
+ * Delete/Truncate tests.
+ *
+ * The DELETE tests are not as extensive, as all of the interesting code for
+ * DELETE queries is in the conditional which is identical to the UPDATE and
+ * SELECT conditional handling.
+ *
+ * The TRUNCATE tests are not extensive either, because the behavior of
+ * TRUNCATE queries is not consistent across database engines. We only test
+ * that a TRUNCATE query actually deletes all rows from the target table.
+ */
+class DatabaseDeleteTruncateTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Delete/Truncate tests',
+      'description' => 'Test the Delete and Truncate query builders.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Confirm that we can use a subselect in a delete successfully.
+   */
+  function testSubselectDelete() {
+    $num_records_before = db_query('SELECT COUNT(*) FROM {test_task}')->fetchField();
+    $pid_to_delete = db_query("SELECT * FROM {test_task} WHERE task = 'sleep'")->fetchField();
+
+    $subquery = db_select('test', 't')
+      ->fields('t', array('id'))
+      ->condition('t.id', array($pid_to_delete), 'IN');
+    $delete = db_delete('test_task')
+      ->condition('task', 'sleep')
+      ->condition('pid', $subquery, 'IN');
+
+    $num_deleted = $delete->execute();
+    $this->assertEqual($num_deleted, 1, "Deleted 1 record.");
+
+    $num_records_after = db_query('SELECT COUNT(*) FROM {test_task}')->fetchField();
+    $this->assertEqual($num_records_before, $num_records_after + $num_deleted, 'Deletion adds up.');
+  }
+
+  /**
+   * Confirm that we can delete a single record successfully.
+   */
+  function testSimpleDelete() {
+    $num_records_before = db_query('SELECT COUNT(*) FROM {test}')->fetchField();
+
+    $num_deleted = db_delete('test')
+      ->condition('id', 1)
+      ->execute();
+    $this->assertIdentical($num_deleted, 1, 'Deleted 1 record.');
+
+    $num_records_after = db_query('SELECT COUNT(*) FROM {test}')->fetchField();
+    $this->assertEqual($num_records_before, $num_records_after + $num_deleted, 'Deletion adds up.');
+  }
+
+  /**
+   * Confirm that we can truncate a whole table successfully.
+   */
+  function testTruncate() {
+    $num_records_before = db_query("SELECT COUNT(*) FROM {test}")->fetchField();
+
+    db_truncate('test')->execute();
+
+    $num_records_after = db_query("SELECT COUNT(*) FROM {test}")->fetchField();
+    $this->assertEqual(0, $num_records_after, 'Truncate really deletes everything.');
+  }
+}
+
+/**
+ * Test the MERGE query builder.
+ */
+class DatabaseMergeTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Merge tests',
+      'description' => 'Test the Merge query builder.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Confirm that we can merge-insert a record successfully.
+   */
+  function testMergeInsert() {
+    $num_records_before = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+
+    $result = db_merge('test_people')
+      ->key(array('job' => 'Presenter'))
+      ->fields(array(
+        'age' => 31,
+        'name' => 'Tiffany',
+      ))
+      ->execute();
+
+    $this->assertEqual($result, MergeQuery::STATUS_INSERT, 'Insert status returned.');
+
+    $num_records_after = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+    $this->assertEqual($num_records_before + 1, $num_records_after, 'Merge inserted properly.');
+
+    $person = db_query('SELECT * FROM {test_people} WHERE job = :job', array(':job' => 'Presenter'))->fetch();
+    $this->assertEqual($person->name, 'Tiffany', 'Name set correctly.');
+    $this->assertEqual($person->age, 31, 'Age set correctly.');
+    $this->assertEqual($person->job, 'Presenter', 'Job set correctly.');
+  }
+
+  /**
+   * Confirm that we can merge-update a record successfully.
+   */
+  function testMergeUpdate() {
+    $num_records_before = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+
+    $result = db_merge('test_people')
+      ->key(array('job' => 'Speaker'))
+      ->fields(array(
+        'age' => 31,
+        'name' => 'Tiffany',
+      ))
+      ->execute();
+
+    $this->assertEqual($result, MergeQuery::STATUS_UPDATE, 'Update status returned.');
+
+    $num_records_after = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+    $this->assertEqual($num_records_before, $num_records_after, 'Merge updated properly.');
+
+    $person = db_query('SELECT * FROM {test_people} WHERE job = :job', array(':job' => 'Speaker'))->fetch();
+    $this->assertEqual($person->name, 'Tiffany', 'Name set correctly.');
+    $this->assertEqual($person->age, 31, 'Age set correctly.');
+    $this->assertEqual($person->job, 'Speaker', 'Job set correctly.');
+  }
+
+  /**
+   * Confirm that we can merge-update a record successfully, with different insert and update.
+   */
+  function testMergeUpdateExcept() {
+    $num_records_before = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+
+    db_merge('test_people')
+      ->key(array('job' => 'Speaker'))
+      ->insertFields(array('age' => 31))
+      ->updateFields(array('name' => 'Tiffany'))
+      ->execute();
+
+    $num_records_after = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+    $this->assertEqual($num_records_before, $num_records_after, 'Merge updated properly.');
+
+    $person = db_query('SELECT * FROM {test_people} WHERE job = :job', array(':job' => 'Speaker'))->fetch();
+    $this->assertEqual($person->name, 'Tiffany', 'Name set correctly.');
+    $this->assertEqual($person->age, 30, 'Age skipped correctly.');
+    $this->assertEqual($person->job, 'Speaker', 'Job set correctly.');
+  }
+
+  /**
+   * Confirm that we can merge-update a record successfully, with alternate replacement.
+   */
+  function testMergeUpdateExplicit() {
+    $num_records_before = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+
+    db_merge('test_people')
+      ->key(array('job' => 'Speaker'))
+      ->insertFields(array(
+        'age' => 31,
+        'name' => 'Tiffany',
+      ))
+      ->updateFields(array(
+        'name' => 'Joe',
+      ))
+      ->execute();
+
+    $num_records_after = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+    $this->assertEqual($num_records_before, $num_records_after, 'Merge updated properly.');
+
+    $person = db_query('SELECT * FROM {test_people} WHERE job = :job', array(':job' => 'Speaker'))->fetch();
+    $this->assertEqual($person->name, 'Joe', 'Name set correctly.');
+    $this->assertEqual($person->age, 30, 'Age skipped correctly.');
+    $this->assertEqual($person->job, 'Speaker', 'Job set correctly.');
+  }
+
+  /**
+   * Confirm that we can merge-update a record successfully, with expressions.
+   */
+  function testMergeUpdateExpression() {
+    $num_records_before = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+
+    $age_before = db_query('SELECT age FROM {test_people} WHERE job = :job', array(':job' => 'Speaker'))->fetchField();
+
+    // This is a very contrived example, as I have no idea why you'd want to
+    // change age this way, but that's beside the point.
+    // Note that we are also double-setting age here, once as a literal and
+    // once as an expression. This test will only pass if the expression wins,
+    // which is what is supposed to happen.
+    db_merge('test_people')
+      ->key(array('job' => 'Speaker'))
+      ->fields(array('name' => 'Tiffany'))
+      ->insertFields(array('age' => 31))
+      ->expression('age', 'age + :age', array(':age' => 4))
+      ->execute();
+
+    $num_records_after = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+    $this->assertEqual($num_records_before, $num_records_after, 'Merge updated properly.');
+
+    $person = db_query('SELECT * FROM {test_people} WHERE job = :job', array(':job' => 'Speaker'))->fetch();
+    $this->assertEqual($person->name, 'Tiffany', 'Name set correctly.');
+    $this->assertEqual($person->age, $age_before + 4, 'Age updated correctly.');
+    $this->assertEqual($person->job, 'Speaker', 'Job set correctly.');
+  }
+
+  /**
+   * Test that we can merge-insert without any update fields.
+   */
+  function testMergeInsertWithoutUpdate() {
+    $num_records_before = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+
+    db_merge('test_people')
+      ->key(array('job' => 'Presenter'))
+      ->execute();
+
+    $num_records_after = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+    $this->assertEqual($num_records_before + 1, $num_records_after, 'Merge inserted properly.');
+
+    $person = db_query('SELECT * FROM {test_people} WHERE job = :job', array(':job' => 'Presenter'))->fetch();
+    $this->assertEqual($person->name, '', 'Name set correctly.');
+    $this->assertEqual($person->age, 0, 'Age set correctly.');
+    $this->assertEqual($person->job, 'Presenter', 'Job set correctly.');
+  }
+
+  /**
+   * Confirm that we can merge-update without any update fields.
+   */
+  function testMergeUpdateWithoutUpdate() {
+    $num_records_before = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+
+    db_merge('test_people')
+      ->key(array('job' => 'Speaker'))
+      ->execute();
+
+    $num_records_after = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+    $this->assertEqual($num_records_before, $num_records_after, 'Merge skipped properly.');
+
+    $person = db_query('SELECT * FROM {test_people} WHERE job = :job', array(':job' => 'Speaker'))->fetch();
+    $this->assertEqual($person->name, 'Meredith', 'Name skipped correctly.');
+    $this->assertEqual($person->age, 30, 'Age skipped correctly.');
+    $this->assertEqual($person->job, 'Speaker', 'Job skipped correctly.');
+
+    db_merge('test_people')
+      ->key(array('job' => 'Speaker'))
+      ->insertFields(array('age' => 31))
+      ->execute();
+
+    $num_records_after = db_query('SELECT COUNT(*) FROM {test_people}')->fetchField();
+    $this->assertEqual($num_records_before, $num_records_after, 'Merge skipped properly.');
+
+    $person = db_query('SELECT * FROM {test_people} WHERE job = :job', array(':job' => 'Speaker'))->fetch();
+    $this->assertEqual($person->name, 'Meredith', 'Name skipped correctly.');
+    $this->assertEqual($person->age, 30, 'Age skipped correctly.');
+    $this->assertEqual($person->job, 'Speaker', 'Job skipped correctly.');
+  }
+
+  /**
+   * Test that an invalid merge query throws an exception like it is supposed to.
+   */
+  function testInvalidMerge() {
+    try {
+      // This query should die because there is no key field specified.
+      db_merge('test_people')
+        ->fields(array(
+          'age' => 31,
+          'name' => 'Tiffany',
+        ))
+        ->execute();
+    }
+    catch (InvalidMergeQueryException $e) {
+      $this->pass('InvalidMergeQueryException thrown for invalid query.');
+      return;
+    }
+    $this->fail('No InvalidMergeQueryException thrown');
+  }
+}
+
+/**
+ * Test the SELECT builder.
+ */
+class DatabaseSelectTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Select tests',
+      'description' => 'Test the Select query builder.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test rudimentary SELECT statements.
+   */
+  function testSimpleSelect() {
+    $query = db_select('test');
+    $name_field = $query->addField('test', 'name');
+    $age_field = $query->addField('test', 'age', 'age');
+    $result = $query->execute();
+
+    $num_records = 0;
+    foreach ($result as $record) {
+      $num_records++;
+    }
+
+    $this->assertEqual($num_records, 4, 'Returned the correct number of rows.');
+  }
+
+  /**
+   * Test rudimentary SELECT statement with a COMMENT.
+   */
+  function testSimpleComment() {
+    $query = db_select('test')->comment('Testing query comments');
+    $name_field = $query->addField('test', 'name');
+    $age_field = $query->addField('test', 'age', 'age');
+    $result = $query->execute();
+
+    $num_records = 0;
+    foreach ($result as $record) {
+      $num_records++;
+    }
+
+    $query = (string)$query;
+    $expected = "/* Testing query comments */ SELECT test.name AS name, test.age AS age\nFROM \n{test} test";
+
+    $this->assertEqual($num_records, 4, 'Returned the correct number of rows.');
+    $this->assertEqual($query, $expected, 'The flattened query contains the comment string.');
+  }
+
+  /**
+   * Test query COMMENT system against vulnerabilities.
+   */
+  function testVulnerableComment() {
+    $query = db_select('test')->comment('Testing query comments */ SELECT nid FROM {node}; --');
+    $name_field = $query->addField('test', 'name');
+    $age_field = $query->addField('test', 'age', 'age');
+    $result = $query->execute();
+
+    $num_records = 0;
+    foreach ($result as $record) {
+      $num_records++;
+    }
+
+    $query = (string)$query;
+    $expected = "/* Testing query comments SELECT nid FROM {node}; -- */ SELECT test.name AS name, test.age AS age\nFROM \n{test} test";
+
+    $this->assertEqual($num_records, 4, 'Returned the correct number of rows.');
+    $this->assertEqual($query, $expected, 'The flattened query contains the sanitised comment string.');
+  }
+
+  /**
+   * Test basic conditionals on SELECT statements.
+   */
+  function testSimpleSelectConditional() {
+    $query = db_select('test');
+    $name_field = $query->addField('test', 'name');
+    $age_field = $query->addField('test', 'age', 'age');
+    $query->condition('age', 27);
+    $result = $query->execute();
+
+    // Check that the aliases are being created the way we want.
+    $this->assertEqual($name_field, 'name', 'Name field alias is correct.');
+    $this->assertEqual($age_field, 'age', 'Age field alias is correct.');
+
+    // Ensure that we got the right record.
+    $record = $result->fetch();
+    $this->assertEqual($record->$name_field, 'George', 'Fetched name is correct.');
+    $this->assertEqual($record->$age_field, 27, 'Fetched age is correct.');
+  }
+
+  /**
+   * Test SELECT statements with expressions.
+   */
+  function testSimpleSelectExpression() {
+    $query = db_select('test');
+    $name_field = $query->addField('test', 'name');
+    $age_field = $query->addExpression("age*2", 'double_age');
+    $query->condition('age', 27);
+    $result = $query->execute();
+
+    // Check that the aliases are being created the way we want.
+    $this->assertEqual($name_field, 'name', 'Name field alias is correct.');
+    $this->assertEqual($age_field, 'double_age', 'Age field alias is correct.');
+
+    // Ensure that we got the right record.
+    $record = $result->fetch();
+    $this->assertEqual($record->$name_field, 'George', 'Fetched name is correct.');
+    $this->assertEqual($record->$age_field, 27*2, 'Fetched age expression is correct.');
+  }
+
+  /**
+   * Test SELECT statements with multiple expressions.
+   */
+  function testSimpleSelectExpressionMultiple() {
+    $query = db_select('test');
+    $name_field = $query->addField('test', 'name');
+    $age_double_field = $query->addExpression("age*2");
+    $age_triple_field = $query->addExpression("age*3");
+    $query->condition('age', 27);
+    $result = $query->execute();
+
+    // Check that the aliases are being created the way we want.
+    $this->assertEqual($age_double_field, 'expression', 'Double age field alias is correct.');
+    $this->assertEqual($age_triple_field, 'expression_2', 'Triple age field alias is correct.');
+
+    // Ensure that we got the right record.
+    $record = $result->fetch();
+    $this->assertEqual($record->$name_field, 'George', 'Fetched name is correct.');
+    $this->assertEqual($record->$age_double_field, 27*2, 'Fetched double age expression is correct.');
+    $this->assertEqual($record->$age_triple_field, 27*3, 'Fetched triple age expression is correct.');
+  }
+
+  /**
+   * Test adding multiple fields to a select statement at the same time.
+   */
+  function testSimpleSelectMultipleFields() {
+    $record = db_select('test')
+      ->fields('test', array('id', 'name', 'age', 'job'))
+      ->condition('age', 27)
+      ->execute()->fetchObject();
+
+    // Check that all fields we asked for are present.
+    $this->assertNotNull($record->id, 'ID field is present.');
+    $this->assertNotNull($record->name, 'Name field is present.');
+    $this->assertNotNull($record->age, 'Age field is present.');
+    $this->assertNotNull($record->job, 'Job field is present.');
+
+    // Ensure that we got the right record.
+    // Check that all fields we asked for are present.
+    $this->assertEqual($record->id, 2, 'ID field has the correct value.');
+    $this->assertEqual($record->name, 'George', 'Name field has the correct value.');
+    $this->assertEqual($record->age, 27, 'Age field has the correct value.');
+    $this->assertEqual($record->job, 'Singer', 'Job field has the correct value.');
+  }
+
+  /**
+   * Test adding all fields from a given table to a select statement.
+   */
+  function testSimpleSelectAllFields() {
+    $record = db_select('test')
+      ->fields('test')
+      ->condition('age', 27)
+      ->execute()->fetchObject();
+
+    // Check that all fields we asked for are present.
+    $this->assertNotNull($record->id, 'ID field is present.');
+    $this->assertNotNull($record->name, 'Name field is present.');
+    $this->assertNotNull($record->age, 'Age field is present.');
+    $this->assertNotNull($record->job, 'Job field is present.');
+
+    // Ensure that we got the right record.
+    // Check that all fields we asked for are present.
+    $this->assertEqual($record->id, 2, 'ID field has the correct value.');
+    $this->assertEqual($record->name, 'George', 'Name field has the correct value.');
+    $this->assertEqual($record->age, 27, 'Age field has the correct value.');
+    $this->assertEqual($record->job, 'Singer', 'Job field has the correct value.');
+  }
+
+  /**
+   * Test that we can find a record with a NULL value.
+   */
+  function testNullCondition() {
+    $this->ensureSampleDataNull();
+
+    $names = db_select('test_null', 'tn')
+      ->fields('tn', array('name'))
+      ->isNull('age')
+      ->execute()->fetchCol();
+
+    $this->assertEqual(count($names), 1, 'Correct number of records found with NULL age.');
+    $this->assertEqual($names[0], 'Fozzie', 'Correct record returned for NULL age.');
+  }
+
+  /**
+   * Test that we can find a record without a NULL value.
+   */
+  function testNotNullCondition() {
+    $this->ensureSampleDataNull();
+
+    $names = db_select('test_null', 'tn')
+      ->fields('tn', array('name'))
+      ->isNotNull('tn.age')
+      ->orderBy('name')
+      ->execute()->fetchCol();
+
+    $this->assertEqual(count($names), 2, 'Correct number of records found withNOT NULL age.');
+    $this->assertEqual($names[0], 'Gonzo', 'Correct record returned for NOT NULL age.');
+    $this->assertEqual($names[1], 'Kermit', 'Correct record returned for NOT NULL age.');
+  }
+
+  /**
+   * Test that we can UNION multiple Select queries together. This is
+   * semantically equal to UNION DISTINCT, so we don't explicity test that.
+   */
+  function testUnion() {
+    $query_1 = db_select('test', 't')
+      ->fields('t', array('name'))
+      ->condition('age', array(27, 28), 'IN');
+
+    $query_2 = db_select('test', 't')
+      ->fields('t', array('name'))
+      ->condition('age', 28);
+
+    $query_1->union($query_2);
+
+    $names = $query_1->execute()->fetchCol();
+
+    // Ensure we only get 2 records.
+    $this->assertEqual(count($names), 2, 'UNION correctly discarded duplicates.');
+
+    $this->assertEqual($names[0], 'George', 'First query returned correct name.');
+    $this->assertEqual($names[1], 'Ringo', 'Second query returned correct name.');
+  }
+
+  /**
+   * Test that we can UNION ALL multiple Select queries together.
+   */
+  function testUnionAll() {
+    $query_1 = db_select('test', 't')
+      ->fields('t', array('name'))
+      ->condition('age', array(27, 28), 'IN');
+
+    $query_2 = db_select('test', 't')
+      ->fields('t', array('name'))
+      ->condition('age', 28);
+
+    $query_1->union($query_2, 'ALL');
+
+    $names = $query_1->execute()->fetchCol();
+
+    // Ensure we get all 3 records.
+    $this->assertEqual(count($names), 3, 'UNION ALL correctly preserved duplicates.');
+
+    $this->assertEqual($names[0], 'George', 'First query returned correct first name.');
+    $this->assertEqual($names[1], 'Ringo', 'Second query returned correct second name.');
+    $this->assertEqual($names[2], 'Ringo', 'Third query returned correct name.');
+  }
+
+  /**
+   * Test that random ordering of queries works.
+   *
+   * We take the approach of testing the Drupal layer only, rather than trying
+   * to test that the database's random number generator actually produces
+   * random queries (which is very difficult to do without an unacceptable risk
+   * of the test failing by accident).
+   *
+   * Therefore, in this test we simply run the same query twice and assert that
+   * the two results are reordered versions of each other (as well as of the
+   * same query without the random ordering). It is reasonable to assume that
+   * if we run the same select query twice and the results are in a different
+   * order each time, the only way this could happen is if we have successfully
+   * triggered the database's random ordering functionality.
+   */
+  function testRandomOrder() {
+    // Use 52 items, so the chance that this test fails by accident will be the
+    // same as the chance that a deck of cards will come out in the same order
+    // after shuffling it (in other words, nearly impossible).
+    $number_of_items = 52;
+    while (db_query("SELECT MAX(id) FROM {test}")->fetchField() < $number_of_items) {
+      db_insert('test')->fields(array('name' => $this->randomName()))->execute();
+    }
+
+    // First select the items in order and make sure we get an ordered list.
+    $expected_ids = range(1, $number_of_items);
+    $ordered_ids = db_select('test', 't')
+      ->fields('t', array('id'))
+      ->range(0, $number_of_items)
+      ->orderBy('id')
+      ->execute()
+      ->fetchCol();
+    $this->assertEqual($ordered_ids, $expected_ids, 'A query without random ordering returns IDs in the correct order.');
+
+    // Now perform the same query, but instead choose a random ordering. We
+    // expect this to contain a differently ordered version of the original
+    // result.
+    $randomized_ids = db_select('test', 't')
+      ->fields('t', array('id'))
+      ->range(0, $number_of_items)
+      ->orderRandom()
+      ->execute()
+      ->fetchCol();
+    $this->assertNotEqual($randomized_ids, $ordered_ids, 'A query with random ordering returns an unordered set of IDs.');
+    $sorted_ids = $randomized_ids;
+    sort($sorted_ids);
+    $this->assertEqual($sorted_ids, $ordered_ids, 'After sorting the random list, the result matches the original query.');
+
+    // Now perform the exact same query again, and make sure the order is
+    // different.
+    $randomized_ids_second_set = db_select('test', 't')
+      ->fields('t', array('id'))
+      ->range(0, $number_of_items)
+      ->orderRandom()
+      ->execute()
+      ->fetchCol();
+    $this->assertNotEqual($randomized_ids_second_set, $randomized_ids, 'Performing the query with random ordering a second time returns IDs in a different order.');
+    $sorted_ids_second_set = $randomized_ids_second_set;
+    sort($sorted_ids_second_set);
+    $this->assertEqual($sorted_ids_second_set, $sorted_ids, 'After sorting the second random list, the result matches the sorted version of the first random list.');
+  }
+
+  /**
+   * Test that aliases are renamed when duplicates.
+   */
+  function testSelectDuplicateAlias() {
+    $query = db_select('test', 't');
+    $alias1 = $query->addField('t', 'name', 'the_alias');
+    $alias2 = $query->addField('t', 'age', 'the_alias');
+    $this->assertNotIdentical($alias1, $alias2, 'Duplicate aliases are renamed.');
+  }
+}
+
+/**
+ * Test case for subselects in a dynamic SELECT query.
+ */
+class DatabaseSelectSubqueryTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Select tests, subqueries',
+      'description' => 'Test the Select query builder.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test that we can use a subquery in a FROM clause.
+   */
+  function testFromSubquerySelect() {
+    // Create a subquery, which is just a normal query object.
+    $subquery = db_select('test_task', 'tt');
+    $subquery->addField('tt', 'pid', 'pid');
+    $subquery->addField('tt', 'task', 'task');
+    $subquery->condition('priority', 1);
+
+    for ($i = 0; $i < 2; $i++) {
+      // Create another query that joins against the virtual table resulting
+      // from the subquery.
+      $select = db_select($subquery, 'tt2');
+      $select->join('test', 't', 't.id=tt2.pid');
+      $select->addField('t', 'name');
+      if ($i) {
+        // Use a different number of conditions here to confuse the subquery
+        // placeholder counter, testing http://drupal.org/node/1112854.
+        $select->condition('name', 'John');
+      }
+      $select->condition('task', 'code');
+
+      // The resulting query should be equivalent to:
+      // SELECT t.name
+      // FROM (SELECT tt.pid AS pid, tt.task AS task FROM test_task tt WHERE priority=1) tt
+      //   INNER JOIN test t ON t.id=tt.pid
+      // WHERE tt.task = 'code'
+      $people = $select->execute()->fetchCol();
+
+      $this->assertEqual(count($people), 1, 'Returned the correct number of rows.');
+    }
+  }
+
+  /**
+   * Test that we can use a subquery in a FROM clause with a limit.
+   */
+  function testFromSubquerySelectWithLimit() {
+    // Create a subquery, which is just a normal query object.
+    $subquery = db_select('test_task', 'tt');
+    $subquery->addField('tt', 'pid', 'pid');
+    $subquery->addField('tt', 'task', 'task');
+    $subquery->orderBy('priority', 'DESC');
+    $subquery->range(0, 1);
+
+    // Create another query that joins against the virtual table resulting
+    // from the subquery.
+    $select = db_select($subquery, 'tt2');
+    $select->join('test', 't', 't.id=tt2.pid');
+    $select->addField('t', 'name');
+
+    // The resulting query should be equivalent to:
+    // SELECT t.name
+    // FROM (SELECT tt.pid AS pid, tt.task AS task FROM test_task tt ORDER BY priority DESC LIMIT 1 OFFSET 0) tt
+    //   INNER JOIN test t ON t.id=tt.pid
+    $people = $select->execute()->fetchCol();
+
+    $this->assertEqual(count($people), 1, 'Returned the correct number of rows.');
+  }
+
+  /**
+   * Test that we can use a subquery in a WHERE clause.
+   */
+  function testConditionSubquerySelect() {
+    // Create a subquery, which is just a normal query object.
+    $subquery = db_select('test_task', 'tt');
+    $subquery->addField('tt', 'pid', 'pid');
+    $subquery->condition('tt.priority', 1);
+
+    // Create another query that joins against the virtual table resulting
+    // from the subquery.
+    $select = db_select('test_task', 'tt2');
+    $select->addField('tt2', 'task');
+    $select->condition('tt2.pid', $subquery, 'IN');
+
+    // The resulting query should be equivalent to:
+    // SELECT tt2.name
+    // FROM test tt2
+    // WHERE tt2.pid IN (SELECT tt.pid AS pid FROM test_task tt WHERE tt.priority=1)
+    $people = $select->execute()->fetchCol();
+    $this->assertEqual(count($people), 5, 'Returned the correct number of rows.');
+  }
+
+  /**
+   * Test that we can use a subquery in a JOIN clause.
+   */
+  function testJoinSubquerySelect() {
+    // Create a subquery, which is just a normal query object.
+    $subquery = db_select('test_task', 'tt');
+    $subquery->addField('tt', 'pid', 'pid');
+    $subquery->condition('priority', 1);
+
+    // Create another query that joins against the virtual table resulting
+    // from the subquery.
+    $select = db_select('test', 't');
+    $select->join($subquery, 'tt', 't.id=tt.pid');
+    $select->addField('t', 'name');
+
+    // The resulting query should be equivalent to:
+    // SELECT t.name
+    // FROM test t
+    //   INNER JOIN (SELECT tt.pid AS pid FROM test_task tt WHERE priority=1) tt ON t.id=tt.pid
+    $people = $select->execute()->fetchCol();
+
+    $this->assertEqual(count($people), 2, 'Returned the correct number of rows.');
+  }
+
+  /**
+   * Test EXISTS subquery conditionals on SELECT statements.
+   *
+   * We essentially select all rows from the {test} table that have matching
+   * rows in the {test_people} table based on the shared name column.
+   */
+  function testExistsSubquerySelect() {
+    // Put George into {test_people}.
+    db_insert('test_people')
+      ->fields(array(
+        'name' => 'George',
+        'age' => 27,
+        'job' => 'Singer',
+      ))
+      ->execute();
+    // Base query to {test}.
+    $query = db_select('test', 't')
+      ->fields('t', array('name'));
+    // Subquery to {test_people}.
+    $subquery = db_select('test_people', 'tp')
+      ->fields('tp', array('name'))
+      ->where('tp.name = t.name');
+    $query->exists($subquery);
+    $result = $query->execute();
+
+    // Ensure that we got the right record.
+    $record = $result->fetch();
+    $this->assertEqual($record->name, 'George', 'Fetched name is correct using EXISTS query.');
+  }
+
+  /**
+   * Test NOT EXISTS subquery conditionals on SELECT statements.
+   *
+   * We essentially select all rows from the {test} table that don't have
+   * matching rows in the {test_people} table based on the shared name column.
+   */
+  function testNotExistsSubquerySelect() {
+    // Put George into {test_people}.
+    db_insert('test_people')
+      ->fields(array(
+        'name' => 'George',
+        'age' => 27,
+        'job' => 'Singer',
+      ))
+      ->execute();
+
+    // Base query to {test}.
+    $query = db_select('test', 't')
+      ->fields('t', array('name'));
+    // Subquery to {test_people}.
+    $subquery = db_select('test_people', 'tp')
+      ->fields('tp', array('name'))
+      ->where('tp.name = t.name');
+    $query->notExists($subquery);
+
+    // Ensure that we got the right number of records.
+    $people = $query->execute()->fetchCol();
+    $this->assertEqual(count($people), 3, 'NOT EXISTS query returned the correct results.');
+  }
+}
+
+/**
+ * Test select with order by clauses.
+ */
+class DatabaseSelectOrderedTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Select tests, ordered',
+      'description' => 'Test the Select query builder.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test basic order by.
+   */
+  function testSimpleSelectOrdered() {
+    $query = db_select('test');
+    $name_field = $query->addField('test', 'name');
+    $age_field = $query->addField('test', 'age', 'age');
+    $query->orderBy($age_field);
+    $result = $query->execute();
+
+    $num_records = 0;
+    $last_age = 0;
+    foreach ($result as $record) {
+      $num_records++;
+      $this->assertTrue($record->age >= $last_age, 'Results returned in correct order.');
+      $last_age = $record->age;
+    }
+
+    $this->assertEqual($num_records, 4, 'Returned the correct number of rows.');
+  }
+
+  /**
+   * Test multiple order by.
+   */
+  function testSimpleSelectMultiOrdered() {
+    $query = db_select('test');
+    $name_field = $query->addField('test', 'name');
+    $age_field = $query->addField('test', 'age', 'age');
+    $job_field = $query->addField('test', 'job');
+    $query->orderBy($job_field);
+    $query->orderBy($age_field);
+    $result = $query->execute();
+
+    $num_records = 0;
+    $expected = array(
+      array('Ringo', 28, 'Drummer'),
+      array('John', 25, 'Singer'),
+      array('George', 27, 'Singer'),
+      array('Paul', 26, 'Songwriter'),
+    );
+    $results = $result->fetchAll(PDO::FETCH_NUM);
+    foreach ($expected as $k => $record) {
+      $num_records++;
+      foreach ($record as $kk => $col) {
+        if ($expected[$k][$kk] != $results[$k][$kk]) {
+          $this->assertTrue(FALSE, 'Results returned in correct order.');
+        }
+      }
+    }
+    $this->assertEqual($num_records, 4, 'Returned the correct number of rows.');
+  }
+
+  /**
+   * Test order by descending.
+   */
+  function testSimpleSelectOrderedDesc() {
+    $query = db_select('test');
+    $name_field = $query->addField('test', 'name');
+    $age_field = $query->addField('test', 'age', 'age');
+    $query->orderBy($age_field, 'DESC');
+    $result = $query->execute();
+
+    $num_records = 0;
+    $last_age = 100000000;
+    foreach ($result as $record) {
+      $num_records++;
+      $this->assertTrue($record->age <= $last_age, 'Results returned in correct order.');
+      $last_age = $record->age;
+    }
+
+    $this->assertEqual($num_records, 4, 'Returned the correct number of rows.');
+  }
+}
+
+/**
+ * Test more complex select statements.
+ */
+class DatabaseSelectComplexTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Select tests, complex',
+      'description' => 'Test the Select query builder with more complex queries.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test simple JOIN statements.
+   */
+  function testDefaultJoin() {
+    $query = db_select('test_task', 't');
+    $people_alias = $query->join('test', 'p', 't.pid = p.id');
+    $name_field = $query->addField($people_alias, 'name', 'name');
+    $task_field = $query->addField('t', 'task', 'task');
+    $priority_field = $query->addField('t', 'priority', 'priority');
+
+    $query->orderBy($priority_field);
+    $result = $query->execute();
+
+    $num_records = 0;
+    $last_priority = 0;
+    foreach ($result as $record) {
+      $num_records++;
+      $this->assertTrue($record->$priority_field >= $last_priority, 'Results returned in correct order.');
+      $this->assertNotEqual($record->$name_field, 'Ringo', 'Taskless person not selected.');
+      $last_priority = $record->$priority_field;
+    }
+
+    $this->assertEqual($num_records, 7, 'Returned the correct number of rows.');
+  }
+
+  /**
+   * Test LEFT OUTER joins.
+   */
+  function testLeftOuterJoin() {
+    $query = db_select('test', 'p');
+    $people_alias = $query->leftJoin('test_task', 't', 't.pid = p.id');
+    $name_field = $query->addField('p', 'name', 'name');
+    $task_field = $query->addField($people_alias, 'task', 'task');
+    $priority_field = $query->addField($people_alias, 'priority', 'priority');
+
+    $query->orderBy($name_field);
+    $result = $query->execute();
+
+    $num_records = 0;
+    $last_name = 0;
+
+    foreach ($result as $record) {
+      $num_records++;
+      $this->assertTrue(strcmp($record->$name_field, $last_name) >= 0, 'Results returned in correct order.');
+      $last_priority = $record->$name_field;
+    }
+
+    $this->assertEqual($num_records, 8, 'Returned the correct number of rows.');
+  }
+
+  /**
+   * Test GROUP BY clauses.
+   */
+  function testGroupBy() {
+    $query = db_select('test_task', 't');
+    $count_field = $query->addExpression('COUNT(task)', 'num');
+    $task_field = $query->addField('t', 'task');
+    $query->orderBy($count_field);
+    $query->groupBy($task_field);
+    $result = $query->execute();
+
+    $num_records = 0;
+    $last_count = 0;
+    $records = array();
+    foreach ($result as $record) {
+      $num_records++;
+      $this->assertTrue($record->$count_field >= $last_count, 'Results returned in correct order.');
+      $last_count = $record->$count_field;
+      $records[$record->$task_field] = $record->$count_field;
+    }
+
+    $correct_results = array(
+      'eat' => 1,
+      'sleep' => 2,
+      'code' => 1,
+      'found new band' => 1,
+      'perform at superbowl' => 1,
+    );
+
+    foreach ($correct_results as $task => $count) {
+      $this->assertEqual($records[$task], $count, format_string("Correct number of '@task' records found.", array('@task' => $task)));
+    }
+
+    $this->assertEqual($num_records, 6, 'Returned the correct number of total rows.');
+  }
+
+  /**
+   * Test GROUP BY and HAVING clauses together.
+   */
+  function testGroupByAndHaving() {
+    $query = db_select('test_task', 't');
+    $count_field = $query->addExpression('COUNT(task)', 'num');
+    $task_field = $query->addField('t', 'task');
+    $query->orderBy($count_field);
+    $query->groupBy($task_field);
+    $query->having('COUNT(task) >= 2');
+    $result = $query->execute();
+
+    $num_records = 0;
+    $last_count = 0;
+    $records = array();
+    foreach ($result as $record) {
+      $num_records++;
+      $this->assertTrue($record->$count_field >= 2, 'Record has the minimum count.');
+      $this->assertTrue($record->$count_field >= $last_count, 'Results returned in correct order.');
+      $last_count = $record->$count_field;
+      $records[$record->$task_field] = $record->$count_field;
+    }
+
+    $correct_results = array(
+      'sleep' => 2,
+    );
+
+    foreach ($correct_results as $task => $count) {
+      $this->assertEqual($records[$task], $count, format_string("Correct number of '@task' records found.", array('@task' => $task)));
+    }
+
+    $this->assertEqual($num_records, 1, 'Returned the correct number of total rows.');
+  }
+
+  /**
+   * Test range queries. The SQL clause varies with the database.
+   */
+  function testRange() {
+    $query = db_select('test');
+    $name_field = $query->addField('test', 'name');
+    $age_field = $query->addField('test', 'age', 'age');
+    $query->range(0, 2);
+    $result = $query->execute();
+
+    $num_records = 0;
+    foreach ($result as $record) {
+      $num_records++;
+    }
+
+    $this->assertEqual($num_records, 2, 'Returned the correct number of rows.');
+  }
+
+  /**
+   * Test distinct queries.
+   */
+  function testDistinct() {
+    $query = db_select('test_task');
+    $task_field = $query->addField('test_task', 'task');
+    $query->distinct();
+    $result = $query->execute();
+
+    $num_records = 0;
+    foreach ($result as $record) {
+      $num_records++;
+    }
+
+    $this->assertEqual($num_records, 6, 'Returned the correct number of rows.');
+  }
+
+  /**
+   * Test that we can generate a count query from a built query.
+   */
+  function testCountQuery() {
+    $query = db_select('test');
+    $name_field = $query->addField('test', 'name');
+    $age_field = $query->addField('test', 'age', 'age');
+    $query->orderBy('name');
+
+    $count = $query->countQuery()->execute()->fetchField();
+
+    $this->assertEqual($count, 4, 'Counted the correct number of records.');
+
+    // Now make sure we didn't break the original query!  We should still have
+    // all of the fields we asked for.
+    $record = $query->execute()->fetch();
+    $this->assertEqual($record->$name_field, 'George', 'Correct data retrieved.');
+    $this->assertEqual($record->$age_field, 27, 'Correct data retrieved.');
+  }
+
+  function testHavingCountQuery() {
+    $query = db_select('test')
+      ->extend('PagerDefault')
+      ->groupBy('age')
+      ->having('age + 1 > 0');
+    $query->addField('test', 'age');
+    $query->addExpression('age + 1');
+    $count = count($query->execute()->fetchCol());
+    $this->assertEqual($count, 4, 'Counted the correct number of records.');
+  }
+
+  /**
+   * Test that countQuery properly removes 'all_fields' statements and
+   * ordering clauses.
+   */
+  function testCountQueryRemovals() {
+    $query = db_select('test');
+    $query->fields('test');
+    $query->orderBy('name');
+    $count = $query->countQuery();
+
+    // Check that the 'all_fields' statement is handled properly.
+    $tables = $query->getTables();
+    $this->assertEqual($tables['test']['all_fields'], 1, 'Query correctly sets \'all_fields\' statement.');
+    $tables = $count->getTables();
+    $this->assertFalse(isset($tables['test']['all_fields']), 'Count query correctly unsets \'all_fields\' statement.');
+
+    // Check that the ordering clause is handled properly.
+    $orderby = $query->getOrderBy();
+    $this->assertEqual($orderby['name'], 'ASC', 'Query correctly sets ordering clause.');
+    $orderby = $count->getOrderBy();
+    $this->assertFalse(isset($orderby['name']), 'Count query correctly unsets ordering caluse.');
+
+    // Make sure that the count query works.
+    $count = $count->execute()->fetchField();
+
+    $this->assertEqual($count, 4, 'Counted the correct number of records.');
+  }
+
+
+  /**
+   * Test that countQuery properly removes fields and expressions.
+   */
+  function testCountQueryFieldRemovals() {
+    // countQuery should remove all fields and expressions, so this can be
+    // tested by adding a non-existent field and expression: if it ends
+    // up in the query, an error will be thrown. If not, it will return the
+    // number of records, which in this case happens to be 4 (there are four
+    // records in the {test} table).
+    $query = db_select('test');
+    $query->fields('test', array('fail'));
+    $this->assertEqual(4, $query->countQuery()->execute()->fetchField(), 'Count Query removed fields');
+
+    $query = db_select('test');
+    $query->addExpression('fail');
+    $this->assertEqual(4, $query->countQuery()->execute()->fetchField(), 'Count Query removed expressions');
+  }
+
+  /**
+   * Test that we can generate a count query from a query with distinct.
+   */
+  function testCountQueryDistinct() {
+    $query = db_select('test_task');
+    $task_field = $query->addField('test_task', 'task');
+    $query->distinct();
+
+    $count = $query->countQuery()->execute()->fetchField();
+
+    $this->assertEqual($count, 6, 'Counted the correct number of records.');
+  }
+
+  /**
+   * Test that we can generate a count query from a query with GROUP BY.
+   */
+  function testCountQueryGroupBy() {
+    $query = db_select('test_task');
+    $pid_field = $query->addField('test_task', 'pid');
+    $query->groupBy('pid');
+
+    $count = $query->countQuery()->execute()->fetchField();
+
+    $this->assertEqual($count, 3, 'Counted the correct number of records.');
+
+    // Use a column alias as, without one, the query can succeed for the wrong
+    // reason.
+    $query = db_select('test_task');
+    $pid_field = $query->addField('test_task', 'pid', 'pid_alias');
+    $query->addExpression('COUNT(test_task.task)', 'count');
+    $query->groupBy('pid_alias');
+    $query->orderBy('pid_alias', 'asc');
+
+    $count = $query->countQuery()->execute()->fetchField();
+
+    $this->assertEqual($count, 3, 'Counted the correct number of records.');
+  }
+
+  /**
+   * Confirm that we can properly nest conditional clauses.
+   */
+  function testNestedConditions() {
+    // This query should translate to:
+    // "SELECT job FROM {test} WHERE name = 'Paul' AND (age = 26 OR age = 27)"
+    // That should find only one record. Yes it's a non-optimal way of writing
+    // that query but that's not the point!
+    $query = db_select('test');
+    $query->addField('test', 'job');
+    $query->condition('name', 'Paul');
+    $query->condition(db_or()->condition('age', 26)->condition('age', 27));
+
+    $job = $query->execute()->fetchField();
+    $this->assertEqual($job, 'Songwriter', 'Correct data retrieved.');
+  }
+
+  /**
+   * Confirm we can join on a single table twice with a dynamic alias.
+   */
+  function testJoinTwice() {
+    $query = db_select('test')->fields('test');
+    $alias = $query->join('test', 'test', 'test.job = %alias.job');
+    $query->addField($alias, 'name', 'othername');
+    $query->addField($alias, 'job', 'otherjob');
+    $query->where("$alias.name <> test.name");
+    $crowded_job = $query->execute()->fetch();
+    $this->assertEqual($crowded_job->job, $crowded_job->otherjob, 'Correctly joined same table twice.');
+    $this->assertNotEqual($crowded_job->name, $crowded_job->othername, 'Correctly joined same table twice.');
+  }
+
+}
+
+/**
+ * Test more complex select statements, part 2.
+ */
+class DatabaseSelectComplexTestCase2 extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Select tests, complex 2',
+      'description' => 'Test the Select query builder with even more complex queries.',
+      'group' => 'Database',
+    );
+  }
+
+  function setUp() {
+    DrupalWebTestCase::setUp('database_test', 'node_access_test');
+
+    $schema['test'] = drupal_get_schema('test');
+    $schema['test_people'] = drupal_get_schema('test_people');
+    $schema['test_one_blob'] = drupal_get_schema('test_one_blob');
+    $schema['test_two_blobs'] = drupal_get_schema('test_two_blobs');
+    $schema['test_task'] = drupal_get_schema('test_task');
+
+    $this->installTables($schema);
+
+    $this->addSampleData();
+  }
+
+  /**
+   * Test that we can join on a query.
+   */
+  function testJoinSubquery() {
+    $acct = $this->drupalCreateUser(array('access content'));
+    $this->drupalLogin($acct);
+
+    $query = db_select('test_task', 'tt', array('target' => 'slave'));
+    $query->addExpression('tt.pid + 1', 'abc');
+    $query->condition('priority', 1, '>');
+    $query->condition('priority', 100, '<');
+
+    $subquery = db_select('test', 'tp');
+    $subquery->join('test_one_blob', 'tpb', 'tp.id = tpb.id');
+    $subquery->join('node', 'n', 'tp.id = n.nid');
+    $subquery->addTag('node_access');
+    $subquery->addMetaData('account', $acct);
+    $subquery->addField('tp', 'id');
+    $subquery->condition('age', 5, '>');
+    $subquery->condition('age', 500, '<');
+
+    $query->leftJoin($subquery, 'sq', 'tt.pid = sq.id');
+    $query->join('test_one_blob', 'tb3', 'tt.pid = tb3.id');
+
+    // Construct the query string.
+    // This is the same sequence that SelectQuery::execute() goes through.
+    $query->preExecute();
+    $query->getArguments();
+    $str = (string) $query;
+
+    // Verify that the string only has one copy of condition placeholder 0.
+    $pos = strpos($str, 'db_condition_placeholder_0', 0);
+    $pos2 = strpos($str, 'db_condition_placeholder_0', $pos + 1);
+    $this->assertFalse($pos2, 'Condition placeholder is not repeated.');
+  }
+}
+
+class DatabaseSelectPagerDefaultTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Pager query tests',
+      'description' => 'Test the pager query extender.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Confirm that a pager query returns the correct results.
+   *
+   * Note that we have to make an HTTP request to a test page handler
+   * because the pager depends on GET parameters.
+   */
+  function testEvenPagerQuery() {
+    // To keep the test from being too brittle, we determine up front
+    // what the page count should be dynamically, and pass the control
+    // information forward to the actual query on the other side of the
+    // HTTP request.
+    $limit = 2;
+    $count = db_query('SELECT COUNT(*) FROM {test}')->fetchField();
+
+    $correct_number = $limit;
+    $num_pages = floor($count / $limit);
+
+    // If there is no remainder from rounding, subtract 1 since we index from 0.
+    if (!($num_pages * $limit < $count)) {
+      $num_pages--;
+    }
+
+    for ($page = 0; $page <= $num_pages; ++$page) {
+      $this->drupalGet('database_test/pager_query_even/' . $limit, array('query' => array('page' => $page)));
+      $data = json_decode($this->drupalGetContent());
+
+      if ($page == $num_pages) {
+        $correct_number = $count - ($limit * $page);
+      }
+
+      $this->assertEqual(count($data->names), $correct_number, format_string('Correct number of records returned by pager: @number', array('@number' => $correct_number)));
+    }
+  }
+
+  /**
+   * Confirm that a pager query returns the correct results.
+   *
+   * Note that we have to make an HTTP request to a test page handler
+   * because the pager depends on GET parameters.
+   */
+  function testOddPagerQuery() {
+    // To keep the test from being too brittle, we determine up front
+    // what the page count should be dynamically, and pass the control
+    // information forward to the actual query on the other side of the
+    // HTTP request.
+    $limit = 2;
+    $count = db_query('SELECT COUNT(*) FROM {test_task}')->fetchField();
+
+    $correct_number = $limit;
+    $num_pages = floor($count / $limit);
+
+    // If there is no remainder from rounding, subtract 1 since we index from 0.
+    if (!($num_pages * $limit < $count)) {
+      $num_pages--;
+    }
+
+    for ($page = 0; $page <= $num_pages; ++$page) {
+      $this->drupalGet('database_test/pager_query_odd/' . $limit, array('query' => array('page' => $page)));
+      $data = json_decode($this->drupalGetContent());
+
+      if ($page == $num_pages) {
+        $correct_number = $count - ($limit * $page);
+      }
+
+      $this->assertEqual(count($data->names), $correct_number, format_string('Correct number of records returned by pager: @number', array('@number' => $correct_number)));
+    }
+  }
+
+  /**
+   * Confirm that a pager query with inner pager query returns valid results.
+   *
+   * This is a regression test for #467984.
+   */
+  function testInnerPagerQuery() {
+    $query = db_select('test', 't')->extend('PagerDefault');
+    $query
+      ->fields('t', array('age'))
+      ->orderBy('age')
+      ->limit(5);
+
+    $outer_query = db_select($query);
+    $outer_query->addField('subquery', 'age');
+
+    $ages = $outer_query
+      ->execute()
+      ->fetchCol();
+    $this->assertEqual($ages, array(25, 26, 27, 28), 'Inner pager query returned the correct ages.');
+  }
+
+  /**
+   * Confirm that a paging query with a having expression returns valid results.
+   *
+   * This is a regression test for #467984.
+   */
+  function testHavingPagerQuery() {
+    $query = db_select('test', 't')->extend('PagerDefault');
+    $query
+      ->fields('t', array('name'))
+      ->orderBy('name')
+      ->groupBy('name')
+      ->having('MAX(age) > :count', array(':count' => 26))
+      ->limit(5);
+
+    $ages = $query
+      ->execute()
+      ->fetchCol();
+    $this->assertEqual($ages, array('George', 'Ringo'), 'Pager query with having expression returned the correct ages.');
+  }
+
+  /**
+   * Confirm that every pager gets a valid non-overlaping element ID.
+   */
+  function testElementNumbers() {
+    $_GET['page'] = '3, 2, 1, 0';
+
+    $name = db_select('test', 't')->extend('PagerDefault')
+      ->element(2)
+      ->fields('t', array('name'))
+      ->orderBy('age')
+      ->limit(1)
+      ->execute()
+      ->fetchField();
+    $this->assertEqual($name, 'Paul', 'Pager query #1 with a specified element ID returned the correct results.');
+
+    // Setting an element smaller than the previous one
+    // should not overwrite the pager $maxElement with a smaller value.
+    $name = db_select('test', 't')->extend('PagerDefault')
+      ->element(1)
+      ->fields('t', array('name'))
+      ->orderBy('age')
+      ->limit(1)
+      ->execute()
+      ->fetchField();
+    $this->assertEqual($name, 'George', 'Pager query #2 with a specified element ID returned the correct results.');
+
+    $name = db_select('test', 't')->extend('PagerDefault')
+      ->fields('t', array('name'))
+      ->orderBy('age')
+      ->limit(1)
+      ->execute()
+      ->fetchField();
+    $this->assertEqual($name, 'John', 'Pager query #3 with a generated element ID returned the correct results.');
+
+    unset($_GET['page']);
+  }
+}
+
+
+class DatabaseSelectTableSortDefaultTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Tablesort query tests',
+      'description' => 'Test the tablesort query extender.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Confirm that a tablesort query returns the correct results.
+   *
+   * Note that we have to make an HTTP request to a test page handler
+   * because the pager depends on GET parameters.
+   */
+  function testTableSortQuery() {
+    $sorts = array(
+      array('field' => t('Task ID'), 'sort' => 'desc', 'first' => 'perform at superbowl', 'last' => 'eat'),
+      array('field' => t('Task ID'), 'sort' => 'asc', 'first' => 'eat', 'last' => 'perform at superbowl'),
+      array('field' => t('Task'), 'sort' => 'asc', 'first' => 'code', 'last' => 'sleep'),
+      array('field' => t('Task'), 'sort' => 'desc', 'first' => 'sleep', 'last' => 'code'),
+      // more elements here
+
+    );
+
+    foreach ($sorts as $sort) {
+      $this->drupalGet('database_test/tablesort/', array('query' => array('order' => $sort['field'], 'sort' => $sort['sort'])));
+      $data = json_decode($this->drupalGetContent());
+
+      $first = array_shift($data->tasks);
+      $last = array_pop($data->tasks);
+
+      $this->assertEqual($first->task, $sort['first'], 'Items appear in the correct order.');
+      $this->assertEqual($last->task, $sort['last'], 'Items appear in the correct order.');
+    }
+  }
+
+  /**
+   * Confirm that if a tablesort's orderByHeader is called before another orderBy, that the header happens first.
+   *
+   */
+  function testTableSortQueryFirst() {
+    $sorts = array(
+      array('field' => t('Task ID'), 'sort' => 'desc', 'first' => 'perform at superbowl', 'last' => 'eat'),
+      array('field' => t('Task ID'), 'sort' => 'asc', 'first' => 'eat', 'last' => 'perform at superbowl'),
+      array('field' => t('Task'), 'sort' => 'asc', 'first' => 'code', 'last' => 'sleep'),
+      array('field' => t('Task'), 'sort' => 'desc', 'first' => 'sleep', 'last' => 'code'),
+      // more elements here
+
+    );
+
+    foreach ($sorts as $sort) {
+      $this->drupalGet('database_test/tablesort_first/', array('query' => array('order' => $sort['field'], 'sort' => $sort['sort'])));
+      $data = json_decode($this->drupalGetContent());
+
+      $first = array_shift($data->tasks);
+      $last = array_pop($data->tasks);
+
+      $this->assertEqual($first->task, $sort['first'], format_string('Items appear in the correct order sorting by @field @sort.', array('@field' => $sort['field'], '@sort' => $sort['sort'])));
+      $this->assertEqual($last->task, $sort['last'], format_string('Items appear in the correct order sorting by @field @sort.', array('@field' => $sort['field'], '@sort' => $sort['sort'])));
+    }
+  }
+
+  /**
+   * Confirm that if a sort is not set in a tableselect form there is no error thrown when using the default.
+   */
+  function testTableSortDefaultSort() {
+    $this->drupalGet('database_test/tablesort_default_sort');
+    // Any PHP errors or notices thrown would trigger a simpletest exception, so
+    // no additional assertions are needed.
+  }
+}
+
+/**
+ * Select tagging tests.
+ *
+ * Tags are a way to flag queries for alter hooks so they know
+ * what type of query it is, such as "node_access".
+ */
+class DatabaseTaggingTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Query tagging tests',
+      'description' => 'Test the tagging capabilities of the Select builder.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Confirm that a query has a "tag" added to it.
+   */
+  function testHasTag() {
+    $query = db_select('test');
+    $query->addField('test', 'name');
+    $query->addField('test', 'age', 'age');
+
+    $query->addTag('test');
+
+    $this->assertTrue($query->hasTag('test'), 'hasTag() returned true.');
+    $this->assertFalse($query->hasTag('other'), 'hasTag() returned false.');
+  }
+
+  /**
+   * Test query tagging "has all of these tags" functionality.
+   */
+  function testHasAllTags() {
+    $query = db_select('test');
+    $query->addField('test', 'name');
+    $query->addField('test', 'age', 'age');
+
+    $query->addTag('test');
+    $query->addTag('other');
+
+    $this->assertTrue($query->hasAllTags('test', 'other'), 'hasAllTags() returned true.');
+    $this->assertFalse($query->hasAllTags('test', 'stuff'), 'hasAllTags() returned false.');
+  }
+
+  /**
+   * Test query tagging "has at least one of these tags" functionality.
+   */
+  function testHasAnyTag() {
+    $query = db_select('test');
+    $query->addField('test', 'name');
+    $query->addField('test', 'age', 'age');
+
+    $query->addTag('test');
+
+    $this->assertTrue($query->hasAnyTag('test', 'other'), 'hasAnyTag() returned true.');
+    $this->assertFalse($query->hasAnyTag('other', 'stuff'), 'hasAnyTag() returned false.');
+  }
+
+  /**
+   * Test that we can attach meta data to a query object.
+   *
+   * This is how we pass additional context to alter hooks.
+   */
+  function testMetaData() {
+    $query = db_select('test');
+    $query->addField('test', 'name');
+    $query->addField('test', 'age', 'age');
+
+    $data = array(
+      'a' => 'A',
+      'b' => 'B',
+    );
+
+    $query->addMetaData('test', $data);
+
+    $return = $query->getMetaData('test');
+    $this->assertEqual($data, $return, 'Corect metadata returned.');
+
+    $return = $query->getMetaData('nothere');
+    $this->assertNull($return, 'Non-existent key returned NULL.');
+  }
+}
+
+/**
+ * Select alter tests.
+ *
+ * @see database_test_query_alter()
+ */
+class DatabaseAlterTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Query altering tests',
+      'description' => 'Test the hook_query_alter capabilities of the Select builder.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test that we can do basic alters.
+   */
+  function testSimpleAlter() {
+    $query = db_select('test');
+    $query->addField('test', 'name');
+    $query->addField('test', 'age', 'age');
+    $query->addTag('database_test_alter_add_range');
+
+    $result = $query->execute();
+
+    $num_records = 0;
+    foreach ($result as $record) {
+      $num_records++;
+    }
+
+    $this->assertEqual($num_records, 2, 'Returned the correct number of rows.');
+  }
+
+  /**
+   * Test that we can alter the joins on a query.
+   */
+  function testAlterWithJoin() {
+    $query = db_select('test_task');
+    $tid_field = $query->addField('test_task', 'tid');
+    $task_field = $query->addField('test_task', 'task');
+    $query->orderBy($task_field);
+    $query->addTag('database_test_alter_add_join');
+
+    $result = $query->execute();
+
+    $records = $result->fetchAll();
+
+    $this->assertEqual(count($records), 2, 'Returned the correct number of rows.');
+
+    $this->assertEqual($records[0]->name, 'George', 'Correct data retrieved.');
+    $this->assertEqual($records[0]->$tid_field, 4, 'Correct data retrieved.');
+    $this->assertEqual($records[0]->$task_field, 'sing', 'Correct data retrieved.');
+    $this->assertEqual($records[1]->name, 'George', 'Correct data retrieved.');
+    $this->assertEqual($records[1]->$tid_field, 5, 'Correct data retrieved.');
+    $this->assertEqual($records[1]->$task_field, 'sleep', 'Correct data retrieved.');
+  }
+
+  /**
+   * Test that we can alter a query's conditionals.
+   */
+  function testAlterChangeConditional() {
+    $query = db_select('test_task');
+    $tid_field = $query->addField('test_task', 'tid');
+    $pid_field = $query->addField('test_task', 'pid');
+    $task_field = $query->addField('test_task', 'task');
+    $people_alias = $query->join('test', 'people', "test_task.pid = people.id");
+    $name_field = $query->addField($people_alias, 'name', 'name');
+    $query->condition('test_task.tid', '1');
+    $query->orderBy($tid_field);
+    $query->addTag('database_test_alter_change_conditional');
+
+    $result = $query->execute();
+
+    $records = $result->fetchAll();
+
+    $this->assertEqual(count($records), 1, 'Returned the correct number of rows.');
+    $this->assertEqual($records[0]->$name_field, 'John', 'Correct data retrieved.');
+    $this->assertEqual($records[0]->$tid_field, 2, 'Correct data retrieved.');
+    $this->assertEqual($records[0]->$pid_field, 1, 'Correct data retrieved.');
+    $this->assertEqual($records[0]->$task_field, 'sleep', 'Correct data retrieved.');
+  }
+
+  /**
+   * Test that we can alter the fields of a query.
+   */
+  function testAlterChangeFields() {
+    $query = db_select('test');
+    $name_field = $query->addField('test', 'name');
+    $age_field = $query->addField('test', 'age', 'age');
+    $query->orderBy('name');
+    $query->addTag('database_test_alter_change_fields');
+
+    $record = $query->execute()->fetch();
+    $this->assertEqual($record->$name_field, 'George', 'Correct data retrieved.');
+    $this->assertFalse(isset($record->$age_field), 'Age field not found, as intended.');
+  }
+
+  /**
+   * Test that we can alter expressions in the query.
+   */
+  function testAlterExpression() {
+    $query = db_select('test');
+    $name_field = $query->addField('test', 'name');
+    $age_field = $query->addExpression("age*2", 'double_age');
+    $query->condition('age', 27);
+    $query->addTag('database_test_alter_change_expressions');
+    $result = $query->execute();
+
+    // Ensure that we got the right record.
+    $record = $result->fetch();
+
+    $this->assertEqual($record->$name_field, 'George', 'Fetched name is correct.');
+    $this->assertEqual($record->$age_field, 27*3, 'Fetched age expression is correct.');
+  }
+
+  /**
+   * Test that we can remove a range() value from a query. This also tests hook_query_TAG_alter().
+   */
+  function testAlterRemoveRange() {
+    $query = db_select('test');
+    $query->addField('test', 'name');
+    $query->addField('test', 'age', 'age');
+    $query->range(0, 2);
+    $query->addTag('database_test_alter_remove_range');
+
+    $num_records = count($query->execute()->fetchAll());
+
+    $this->assertEqual($num_records, 4, 'Returned the correct number of rows.');
+  }
+
+  /**
+   * Test that we can do basic alters on subqueries.
+   */
+  function testSimpleAlterSubquery() {
+    // Create a sub-query with an alter tag.
+    $subquery = db_select('test', 'p');
+    $subquery->addField('p', 'name');
+    $subquery->addField('p', 'id');
+    // Pick out George.
+    $subquery->condition('age', 27);
+    $subquery->addExpression("age*2", 'double_age');
+    // This query alter should change it to age * 3.
+    $subquery->addTag('database_test_alter_change_expressions');
+
+    // Create a main query and join to sub-query.
+    $query = db_select('test_task', 'tt');
+    $query->join($subquery, 'pq', 'pq.id = tt.pid');
+    $age_field = $query->addField('pq', 'double_age');
+    $name_field = $query->addField('pq', 'name');
+
+    $record = $query->execute()->fetch();
+    $this->assertEqual($record->$name_field, 'George', 'Fetched name is correct.');
+    $this->assertEqual($record->$age_field, 27*3, 'Fetched age expression is correct.');
+  }
+}
+
+/**
+ * Regression tests.
+ */
+class DatabaseRegressionTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Regression tests',
+      'description' => 'Regression tests cases for the database layer.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Regression test for #310447.
+   *
+   * Tries to insert non-ascii UTF-8 data in a database column and checks
+   * if its stored properly.
+   */
+  function testRegression_310447() {
+    // That's a 255 character UTF-8 string.
+    $name = str_repeat("é", 255);
+    db_insert('test')
+      ->fields(array(
+        'name' => $name,
+        'age' => 20,
+        'job' => 'Dancer',
+      ))->execute();
+
+    $from_database = db_query('SELECT name FROM {test} WHERE name = :name', array(':name' => $name))->fetchField();
+    $this->assertIdentical($name, $from_database, "The database handles UTF-8 characters cleanly.");
+  }
+
+  /**
+   * Test the db_table_exists() function.
+   */
+  function testDBTableExists() {
+    $this->assertIdentical(TRUE, db_table_exists('node'), 'Returns true for existent table.');
+    $this->assertIdentical(FALSE, db_table_exists('nosuchtable'), 'Returns false for nonexistent table.');
+  }
+
+  /**
+   * Test the db_field_exists() function.
+   */
+  function testDBFieldExists() {
+    $this->assertIdentical(TRUE, db_field_exists('node', 'nid'), 'Returns true for existent column.');
+    $this->assertIdentical(FALSE, db_field_exists('node', 'nosuchcolumn'), 'Returns false for nonexistent column.');
+  }
+
+  /**
+   * Test the db_index_exists() function.
+   */
+  function testDBIndexExists() {
+    $this->assertIdentical(TRUE, db_index_exists('node', 'node_created'), 'Returns true for existent index.');
+    $this->assertIdentical(FALSE, db_index_exists('node', 'nosuchindex'), 'Returns false for nonexistent index.');
+  }
+}
+
+/**
+ * Query logging tests.
+ */
+class DatabaseLoggingTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Query logging',
+      'description' => 'Test the query logging facility.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test that we can log the existence of a query.
+   */
+  function testEnableLogging() {
+    $log = Database::startLog('testing');
+
+    db_query('SELECT name FROM {test} WHERE age > :age', array(':age' => 25))->fetchCol();
+    db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Ringo'))->fetchCol();
+
+    // Trigger a call that does not have file in the backtrace.
+    call_user_func_array('db_query', array('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Ringo')))->fetchCol();
+
+    $queries = Database::getLog('testing', 'default');
+
+    $this->assertEqual(count($queries), 3, 'Correct number of queries recorded.');
+
+    foreach ($queries as $query) {
+      $this->assertEqual($query['caller']['function'], __FUNCTION__, 'Correct function in query log.');
+    }
+  }
+
+  /**
+   * Test that we can run two logs in parallel.
+   */
+  function testEnableMultiLogging() {
+    Database::startLog('testing1');
+
+    db_query('SELECT name FROM {test} WHERE age > :age', array(':age' => 25))->fetchCol();
+
+    Database::startLog('testing2');
+
+    db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Ringo'))->fetchCol();
+
+    $queries1 = Database::getLog('testing1');
+    $queries2 = Database::getLog('testing2');
+
+    $this->assertEqual(count($queries1), 2, 'Correct number of queries recorded for log 1.');
+    $this->assertEqual(count($queries2), 1, 'Correct number of queries recorded for log 2.');
+  }
+
+  /**
+   * Test that we can log queries against multiple targets on the same connection.
+   */
+  function testEnableTargetLogging() {
+    // Clone the master credentials to a slave connection and to another fake
+    // connection.
+    $connection_info = Database::getConnectionInfo('default');
+    Database::addConnectionInfo('default', 'slave', $connection_info['default']);
+
+    Database::startLog('testing1');
+
+    db_query('SELECT name FROM {test} WHERE age > :age', array(':age' => 25))->fetchCol();
+
+    db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Ringo'), array('target' => 'slave'));//->fetchCol();
+
+    $queries1 = Database::getLog('testing1');
+
+    $this->assertEqual(count($queries1), 2, 'Recorded queries from all targets.');
+    $this->assertEqual($queries1[0]['target'], 'default', 'First query used default target.');
+    $this->assertEqual($queries1[1]['target'], 'slave', 'Second query used slave target.');
+  }
+
+  /**
+   * Test that logs to separate targets collapse to the same connection properly.
+   *
+   * This test is identical to the one above, except that it doesn't create
+   * a fake target so the query should fall back to running on the default
+   * target.
+   */
+  function testEnableTargetLoggingNoTarget() {
+    Database::startLog('testing1');
+
+    db_query('SELECT name FROM {test} WHERE age > :age', array(':age' => 25))->fetchCol();
+
+    // We use "fake" here as a target because any non-existent target will do.
+    // However, because all of the tests in this class share a single page
+    // request there is likely to be a target of "slave" from one of the other
+    // unit tests, so we use a target here that we know with absolute certainty
+    // does not exist.
+    db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Ringo'), array('target' => 'fake'))->fetchCol();
+
+    $queries1 = Database::getLog('testing1');
+
+    $this->assertEqual(count($queries1), 2, 'Recorded queries from all targets.');
+    $this->assertEqual($queries1[0]['target'], 'default', 'First query used default target.');
+    $this->assertEqual($queries1[1]['target'], 'default', 'Second query used default target as fallback.');
+  }
+
+  /**
+   * Test that we can log queries separately on different connections.
+   */
+  function testEnableMultiConnectionLogging() {
+    // Clone the master credentials to a fake connection.
+    // That both connections point to the same physical database is irrelevant.
+    $connection_info = Database::getConnectionInfo('default');
+    Database::addConnectionInfo('test2', 'default', $connection_info['default']);
+
+    Database::startLog('testing1');
+    Database::startLog('testing1', 'test2');
+
+    db_query('SELECT name FROM {test} WHERE age > :age', array(':age' => 25))->fetchCol();
+
+    $old_key = db_set_active('test2');
+
+    db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Ringo'), array('target' => 'slave'))->fetchCol();
+
+    db_set_active($old_key);
+
+    $queries1 = Database::getLog('testing1');
+    $queries2 = Database::getLog('testing1', 'test2');
+
+    $this->assertEqual(count($queries1), 1, 'Correct number of queries recorded for first connection.');
+    $this->assertEqual(count($queries2), 1, 'Correct number of queries recorded for second connection.');
+  }
+}
+
+/**
+ * Query serialization tests.
+ */
+class DatabaseSerializeQueryTestCase extends DatabaseTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Serialize query',
+      'description' => 'Test serializing and unserializing a query.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Confirm that a query can be serialized and unserialized.
+   */
+  function testSerializeQuery() {
+    $query = db_select('test');
+    $query->addField('test', 'age');
+    $query->condition('name', 'Ringo');
+    // If this doesn't work, it will throw an exception, so no need for an
+    // assertion.
+    $query = unserialize(serialize($query));
+    $results = $query->execute()->fetchCol();
+    $this->assertEqual($results[0], 28, 'Query properly executed after unserialization.');
+  }
+}
+
+/**
+ * Range query tests.
+ */
+class DatabaseRangeQueryTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Range query test',
+      'description' => 'Test the Range query functionality.',
+      'group' => 'Database',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('database_test');
+  }
+
+  /**
+   * Confirm that range query work and return correct result.
+   */
+  function testRangeQuery() {
+    // Test if return correct number of rows.
+    $range_rows = db_query_range("SELECT name FROM {system} ORDER BY name", 2, 3)->fetchAll();
+    $this->assertEqual(count($range_rows), 3, 'Range query work and return correct number of rows.');
+
+    // Test if return target data.
+    $raw_rows = db_query('SELECT name FROM {system} ORDER BY name')->fetchAll();
+    $raw_rows = array_slice($raw_rows, 2, 3);
+    $this->assertEqual($range_rows, $raw_rows, 'Range query work and return target data.');
+  }
+}
+
+/**
+ * Temporary query tests.
+ */
+class DatabaseTemporaryQueryTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Temporary query test',
+      'description' => 'Test the temporary query functionality.',
+      'group' => 'Database',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('database_test');
+  }
+
+  /**
+   * Return the number of rows of a table.
+   */
+  function countTableRows($table_name) {
+    return db_select($table_name)->countQuery()->execute()->fetchField();
+  }
+
+  /**
+   * Confirm that temporary tables work and are limited to one request.
+   */
+  function testTemporaryQuery() {
+    $this->drupalGet('database_test/db_query_temporary');
+    $data = json_decode($this->drupalGetContent());
+    if ($data) {
+      $this->assertEqual($this->countTableRows("system"), $data->row_count, 'The temporary table contains the correct amount of rows.');
+      $this->assertFalse(db_table_exists($data->table_name), 'The temporary table is, indeed, temporary.');
+    }
+    else {
+      $this->fail("The creation of the temporary table failed.");
+    }
+
+    // Now try to run two db_query_temporary() in the same request.
+    $table_name_system = db_query_temporary('SELECT status FROM {system}', array());
+    $table_name_users = db_query_temporary('SELECT uid FROM {users}', array());
+
+    $this->assertEqual($this->countTableRows($table_name_system), $this->countTableRows("system"), 'A temporary table was created successfully in this request.');
+    $this->assertEqual($this->countTableRows($table_name_users), $this->countTableRows("users"), 'A second temporary table was created successfully in this request.');
+  }
+}
+
+/**
+ * Test how the current database driver interprets the SQL syntax.
+ *
+ * In order to ensure consistent SQL handling throughout Drupal
+ * across multiple kinds of database systems, we test that the
+ * database system interprets SQL syntax in an expected fashion.
+ */
+class DatabaseBasicSyntaxTestCase extends DatabaseTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Basic SQL syntax tests',
+      'description' => 'Test SQL syntax interpretation.',
+      'group' => 'Database',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('database_test');
+  }
+
+  /**
+   * Test for string concatenation.
+   */
+  function testBasicConcat() {
+    $result = db_query('SELECT CONCAT(:a1, CONCAT(:a2, CONCAT(:a3, CONCAT(:a4, :a5))))', array(
+      ':a1' => 'This',
+      ':a2' => ' ',
+      ':a3' => 'is',
+      ':a4' => ' a ',
+      ':a5' => 'test.',
+    ));
+    $this->assertIdentical($result->fetchField(), 'This is a test.', 'Basic CONCAT works.');
+  }
+
+  /**
+   * Test for string concatenation with field values.
+   */
+  function testFieldConcat() {
+    $result = db_query('SELECT CONCAT(:a1, CONCAT(name, CONCAT(:a2, CONCAT(age, :a3)))) FROM {test} WHERE age = :age', array(
+      ':a1' => 'The age of ',
+      ':a2' => ' is ',
+      ':a3' => '.',
+      ':age' => 25,
+    ));
+    $this->assertIdentical($result->fetchField(), 'The age of John is 25.', 'Field CONCAT works.');
+  }
+
+  /**
+   * Test escaping of LIKE wildcards.
+   */
+  function testLikeEscape() {
+    db_insert('test')
+      ->fields(array(
+        'name' => 'Ring_',
+      ))
+      ->execute();
+
+    // Match both "Ringo" and "Ring_".
+    $num_matches = db_select('test', 't')
+      ->condition('name', 'Ring_', 'LIKE')
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertIdentical($num_matches, '2', 'Found 2 records.');
+    // Match only "Ring_" using a LIKE expression with no wildcards.
+    $num_matches = db_select('test', 't')
+      ->condition('name', db_like('Ring_'), 'LIKE')
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertIdentical($num_matches, '1', 'Found 1 record.');
+  }
+
+  /**
+   * Test LIKE query containing a backslash.
+   */
+  function testLikeBackslash() {
+    db_insert('test')
+      ->fields(array('name'))
+      ->values(array(
+        'name' => 'abcde\f',
+      ))
+      ->values(array(
+        'name' => 'abc%\_',
+      ))
+      ->execute();
+
+    // Match both rows using a LIKE expression with two wildcards and a verbatim
+    // backslash.
+    $num_matches = db_select('test', 't')
+      ->condition('name', 'abc%\\\\_', 'LIKE')
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertIdentical($num_matches, '2', 'Found 2 records.');
+    // Match only the former using a LIKE expression with no wildcards.
+    $num_matches = db_select('test', 't')
+      ->condition('name', db_like('abc%\_'), 'LIKE')
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertIdentical($num_matches, '1', 'Found 1 record.');
+  }
+}
+
+/**
+ * Test case sensitivity handling.
+ */
+class DatabaseCaseSensitivityTestCase extends DatabaseTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Case sensitivity',
+      'description' => 'Test handling case sensitive collation.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test BINARY collation in MySQL.
+   */
+  function testCaseSensitiveInsert() {
+    $num_records_before = db_query('SELECT COUNT(*) FROM {test}')->fetchField();
+
+    $john = db_insert('test')
+      ->fields(array(
+        'name' => 'john', // <- A record already exists with name 'John'.
+        'age' => 2,
+        'job' => 'Baby',
+      ))
+      ->execute();
+
+    $num_records_after = db_query('SELECT COUNT(*) FROM {test}')->fetchField();
+    $this->assertIdentical($num_records_before + 1, (int) $num_records_after, 'Record inserts correctly.');
+    $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'john'))->fetchField();
+    $this->assertIdentical($saved_age, '2', 'Can retrieve after inserting.');
+  }
+}
+
+/**
+ * Test invalid data handling.
+ */
+class DatabaseInvalidDataTestCase extends DatabaseTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Invalid data',
+      'description' => 'Test handling of some invalid data.',
+      'group' => 'Database',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('database_test');
+  }
+
+  /**
+   * Traditional SQL database systems abort inserts when invalid data is encountered.
+   */
+  function testInsertDuplicateData() {
+    // Try to insert multiple records where at least one has bad data.
+    try {
+      db_insert('test')
+        ->fields(array('name', 'age', 'job'))
+        ->values(array(
+          'name' => 'Elvis',
+          'age' => 63,
+          'job' => 'Singer',
+        ))->values(array(
+          'name' => 'John', // <-- Duplicate value on unique field.
+          'age' => 17,
+          'job' => 'Consultant',
+        ))
+        ->values(array(
+          'name' => 'Frank',
+          'age' => 75,
+          'job' => 'Singer',
+        ))
+        ->execute();
+      $this->fail('Insert succeedded when it should not have.');
+    }
+    catch (Exception $e) {
+      // Check if the first record was inserted.
+      $name = db_query('SELECT name FROM {test} WHERE age = :age', array(':age' => 63))->fetchField();
+
+      if ($name == 'Elvis') {
+        if (!Database::getConnection()->supportsTransactions()) {
+          // This is an expected fail.
+          // Database engines that don't support transactions can leave partial
+          // inserts in place when an error occurs. This is the case for MySQL
+          // when running on a MyISAM table.
+          $this->pass("The whole transaction has not been rolled-back when a duplicate key insert occurs, this is expected because the database doesn't support transactions");
+        }
+        else {
+          $this->fail('The whole transaction is rolled back when a duplicate key insert occurs.');
+        }
+      }
+      else {
+        $this->pass('The whole transaction is rolled back when a duplicate key insert occurs.');
+      }
+
+      // Ensure the other values were not inserted.
+      $record = db_select('test')
+        ->fields('test', array('name', 'age'))
+        ->condition('age', array(17, 75), 'IN')
+        ->execute()->fetchObject();
+
+      $this->assertFalse($record, 'The rest of the insert aborted as expected.');
+    }
+  }
+
+}
+
+/**
+ * Drupal-specific SQL syntax tests.
+ */
+class DatabaseQueryTestCase extends DatabaseTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Custom query syntax tests',
+      'description' => 'Test Drupal\'s extended prepared statement syntax..',
+      'group' => 'Database',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('database_test');
+  }
+
+  /**
+   * Test that we can specify an array of values in the query by simply passing in an array.
+   */
+  function testArraySubstitution() {
+    $names = db_query('SELECT name FROM {test} WHERE age IN (:ages) ORDER BY age', array(':ages' => array(25, 26, 27)))->fetchAll();
+
+    $this->assertEqual(count($names), 3, 'Correct number of names returned');
+  }
+}
+
+/**
+ * Test transaction support, particularly nesting.
+ *
+ * We test nesting by having two transaction layers, an outer and inner. The
+ * outer layer encapsulates the inner layer. Our transaction nesting abstraction
+ * should allow the outer layer function to call any function it wants,
+ * especially the inner layer that starts its own transaction, and be
+ * confident that, when the function it calls returns, its own transaction
+ * is still "alive."
+ *
+ * Call structure:
+ *   transactionOuterLayer()
+ *     Start transaction
+ *     transactionInnerLayer()
+ *       Start transaction (does nothing in database)
+ *       [Maybe decide to roll back]
+ *     Do more stuff
+ *     Should still be in transaction A
+ *
+ */
+class DatabaseTransactionTestCase extends DatabaseTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Transaction tests',
+      'description' => 'Test the transaction abstraction system.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Helper method for transaction unit test. This "outer layer" transaction
+   * starts and then encapsulates the "inner layer" transaction. This nesting
+   * is used to evaluate whether the the database transaction API properly
+   * supports nesting. By "properly supports," we mean the outer transaction
+   * continues to exist regardless of what functions are called and whether
+   * those functions start their own transactions.
+   *
+   * In contrast, a typical database would commit the outer transaction, start
+   * a new transaction for the inner layer, commit the inner layer transaction,
+   * and then be confused when the outer layer transaction tries to commit its
+   * transaction (which was already committed when the inner transaction
+   * started).
+   *
+   * @param $suffix
+   *   Suffix to add to field values to differentiate tests.
+   * @param $rollback
+   *   Whether or not to try rolling back the transaction when we're done.
+   * @param $ddl_statement
+   *   Whether to execute a DDL statement during the inner transaction.
+   */
+  protected function transactionOuterLayer($suffix, $rollback = FALSE, $ddl_statement = FALSE) {
+    $connection = Database::getConnection();
+    $depth = $connection->transactionDepth();
+    $txn = db_transaction();
+
+    // Insert a single row into the testing table.
+    db_insert('test')
+      ->fields(array(
+        'name' => 'David' . $suffix,
+        'age' => '24',
+      ))
+      ->execute();
+
+    $this->assertTrue($connection->inTransaction(), 'In transaction before calling nested transaction.');
+
+    // We're already in a transaction, but we call ->transactionInnerLayer
+    // to nest another transaction inside the current one.
+    $this->transactionInnerLayer($suffix, $rollback, $ddl_statement);
+
+    $this->assertTrue($connection->inTransaction(), 'In transaction after calling nested transaction.');
+
+    if ($rollback) {
+      // Roll back the transaction, if requested.
+      // This rollback should propagate to the last savepoint.
+      $txn->rollback();
+      $this->assertTrue(($connection->transactionDepth() == $depth), 'Transaction has rolled back to the last savepoint after calling rollback().');
+    }
+  }
+
+  /**
+   * Helper method for transaction unit tests. This "inner layer" transaction
+   * is either used alone or nested inside of the "outer layer" transaction.
+   *
+   * @param $suffix
+   *   Suffix to add to field values to differentiate tests.
+   * @param $rollback
+   *   Whether or not to try rolling back the transaction when we're done.
+   * @param $ddl_statement
+   *   Whether to execute a DDL statement during the transaction.
+   */
+  protected function transactionInnerLayer($suffix, $rollback = FALSE, $ddl_statement = FALSE) {
+    $connection = Database::getConnection();
+
+    $depth = $connection->transactionDepth();
+    // Start a transaction. If we're being called from ->transactionOuterLayer,
+    // then we're already in a transaction. Normally, that would make starting
+    // a transaction here dangerous, but the database API handles this problem
+    // for us by tracking the nesting and avoiding the danger.
+    $txn = db_transaction();
+
+    $depth2 = $connection->transactionDepth();
+    $this->assertTrue($depth < $depth2, 'Transaction depth is has increased with new transaction.');
+
+    // Insert a single row into the testing table.
+    db_insert('test')
+      ->fields(array(
+        'name' => 'Daniel' . $suffix,
+        'age' => '19',
+      ))
+      ->execute();
+
+    $this->assertTrue($connection->inTransaction(), 'In transaction inside nested transaction.');
+
+    if ($ddl_statement) {
+      $table = array(
+        'fields' => array(
+          'id' => array(
+            'type' => 'serial',
+            'unsigned' => TRUE,
+            'not null' => TRUE,
+          ),
+        ),
+        'primary key' => array('id'),
+      );
+      db_create_table('database_test_1', $table);
+
+      $this->assertTrue($connection->inTransaction(), 'In transaction inside nested transaction.');
+    }
+
+    if ($rollback) {
+      // Roll back the transaction, if requested.
+      // This rollback should propagate to the last savepoint.
+      $txn->rollback();
+      $this->assertTrue(($connection->transactionDepth() == $depth), 'Transaction has rolled back to the last savepoint after calling rollback().');
+    }
+  }
+
+  /**
+   * Test transaction rollback on a database that supports transactions.
+   *
+   * If the active connection does not support transactions, this test does nothing.
+   */
+  function testTransactionRollBackSupported() {
+    // This test won't work right if transactions are not supported.
+    if (!Database::getConnection()->supportsTransactions()) {
+      return;
+    }
+    try {
+      // Create two nested transactions. Roll back from the inner one.
+      $this->transactionOuterLayer('B', TRUE);
+
+      // Neither of the rows we inserted in the two transaction layers
+      // should be present in the tables post-rollback.
+      $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'DavidB'))->fetchField();
+      $this->assertNotIdentical($saved_age, '24', 'Cannot retrieve DavidB row after commit.');
+      $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'DanielB'))->fetchField();
+      $this->assertNotIdentical($saved_age, '19', 'Cannot retrieve DanielB row after commit.');
+    }
+    catch (Exception $e) {
+      $this->fail($e->getMessage());
+    }
+  }
+
+  /**
+   * Test transaction rollback on a database that does not support transactions.
+   *
+   * If the active driver supports transactions, this test does nothing.
+   */
+  function testTransactionRollBackNotSupported() {
+    // This test won't work right if transactions are supported.
+    if (Database::getConnection()->supportsTransactions()) {
+      return;
+    }
+    try {
+      // Create two nested transactions. Attempt to roll back from the inner one.
+      $this->transactionOuterLayer('B', TRUE);
+
+      // Because our current database claims to not support transactions,
+      // the inserted rows should be present despite the attempt to roll back.
+      $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'DavidB'))->fetchField();
+      $this->assertIdentical($saved_age, '24', 'DavidB not rolled back, since transactions are not supported.');
+      $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'DanielB'))->fetchField();
+      $this->assertIdentical($saved_age, '19', 'DanielB not rolled back, since transactions are not supported.');
+    }
+    catch (Exception $e) {
+      $this->fail($e->getMessage());
+    }
+  }
+
+  /**
+   * Test committed transaction.
+   *
+   * The behavior of this test should be identical for connections that support
+   * transactions and those that do not.
+   */
+  function testCommittedTransaction() {
+    try {
+      // Create two nested transactions. The changes should be committed.
+      $this->transactionOuterLayer('A');
+
+      // Because we committed, both of the inserted rows should be present.
+      $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'DavidA'))->fetchField();
+      $this->assertIdentical($saved_age, '24', 'Can retrieve DavidA row after commit.');
+      $saved_age = db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'DanielA'))->fetchField();
+      $this->assertIdentical($saved_age, '19', 'Can retrieve DanielA row after commit.');
+    }
+    catch (Exception $e) {
+      $this->fail($e->getMessage());
+    }
+  }
+
+  /**
+   * Test the compatibility of transactions with DDL statements.
+   */
+  function testTransactionWithDdlStatement() {
+    // First, test that a commit works normally, even with DDL statements.
+    $transaction = db_transaction();
+    $this->insertRow('row');
+    $this->executeDDLStatement();
+    unset($transaction);
+    $this->assertRowPresent('row');
+
+    // Even in different order.
+    $this->cleanUp();
+    $transaction = db_transaction();
+    $this->executeDDLStatement();
+    $this->insertRow('row');
+    unset($transaction);
+    $this->assertRowPresent('row');
+
+    // Even with stacking.
+    $this->cleanUp();
+    $transaction = db_transaction();
+    $transaction2 = db_transaction();
+    $this->executeDDLStatement();
+    unset($transaction2);
+    $transaction3 = db_transaction();
+    $this->insertRow('row');
+    unset($transaction3);
+    unset($transaction);
+    $this->assertRowPresent('row');
+
+    // A transaction after a DDL statement should still work the same.
+    $this->cleanUp();
+    $transaction = db_transaction();
+    $transaction2 = db_transaction();
+    $this->executeDDLStatement();
+    unset($transaction2);
+    $transaction3 = db_transaction();
+    $this->insertRow('row');
+    $transaction3->rollback();
+    unset($transaction3);
+    unset($transaction);
+    $this->assertRowAbsent('row');
+
+    // The behavior of a rollback depends on the type of database server.
+    if (Database::getConnection()->supportsTransactionalDDL()) {
+      // For database servers that support transactional DDL, a rollback
+      // of a transaction including DDL statements should be possible.
+      $this->cleanUp();
+      $transaction = db_transaction();
+      $this->insertRow('row');
+      $this->executeDDLStatement();
+      $transaction->rollback();
+      unset($transaction);
+      $this->assertRowAbsent('row');
+
+      // Including with stacking.
+      $this->cleanUp();
+      $transaction = db_transaction();
+      $transaction2 = db_transaction();
+      $this->executeDDLStatement();
+      unset($transaction2);
+      $transaction3 = db_transaction();
+      $this->insertRow('row');
+      unset($transaction3);
+      $transaction->rollback();
+      unset($transaction);
+      $this->assertRowAbsent('row');
+    }
+    else {
+      // For database servers that do not support transactional DDL,
+      // the DDL statement should commit the transaction stack.
+      $this->cleanUp();
+      $transaction = db_transaction();
+      $this->insertRow('row');
+      $this->executeDDLStatement();
+      // Rollback the outer transaction.
+      try {
+        $transaction->rollback();
+        unset($transaction);
+        // @TODO: an exception should be triggered here, but is not, because
+        // "ROLLBACK" fails silently in MySQL if there is no transaction active.
+        // $this->fail(t('Rolling back a transaction containing DDL should fail.'));
+      }
+      catch (DatabaseTransactionNoActiveException $e) {
+        $this->pass('Rolling back a transaction containing DDL should fail.');
+      }
+      $this->assertRowPresent('row');
+    }
+  }
+
+  /**
+   * Insert a single row into the testing table.
+   */
+  protected function insertRow($name) {
+    db_insert('test')
+      ->fields(array(
+        'name' => $name,
+      ))
+      ->execute();
+  }
+
+  /**
+   * Execute a DDL statement.
+   */
+  protected function executeDDLStatement() {
+    static $count = 0;
+    $table = array(
+      'fields' => array(
+        'id' => array(
+          'type' => 'serial',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+        ),
+      ),
+      'primary key' => array('id'),
+    );
+    db_create_table('database_test_' . ++$count, $table);
+  }
+
+  /**
+   * Start over for a new test.
+   */
+  protected function cleanUp() {
+    db_truncate('test')
+      ->execute();
+  }
+
+  /**
+   * Assert that a given row is present in the test table.
+   *
+   * @param $name
+   *   The name of the row.
+   * @param $message
+   *   The message to log for the assertion.
+   */
+  function assertRowPresent($name, $message = NULL) {
+    if (!isset($message)) {
+      $message = format_string('Row %name is present.', array('%name' => $name));
+    }
+    $present = (boolean) db_query('SELECT 1 FROM {test} WHERE name = :name', array(':name' => $name))->fetchField();
+    return $this->assertTrue($present, $message);
+  }
+
+  /**
+   * Assert that a given row is absent from the test table.
+   *
+   * @param $name
+   *   The name of the row.
+   * @param $message
+   *   The message to log for the assertion.
+   */
+  function assertRowAbsent($name, $message = NULL) {
+    if (!isset($message)) {
+      $message = format_string('Row %name is absent.', array('%name' => $name));
+    }
+    $present = (boolean) db_query('SELECT 1 FROM {test} WHERE name = :name', array(':name' => $name))->fetchField();
+    return $this->assertFalse($present, $message);
+  }
+
+  /**
+   * Test transaction stacking and commit / rollback.
+   */
+  function testTransactionStacking() {
+    // This test won't work right if transactions are not supported.
+    if (!Database::getConnection()->supportsTransactions()) {
+      return;
+    }
+
+    $database = Database::getConnection();
+
+    // Standard case: pop the inner transaction before the outer transaction.
+    $transaction = db_transaction();
+    $this->insertRow('outer');
+    $transaction2 = db_transaction();
+    $this->insertRow('inner');
+    // Pop the inner transaction.
+    unset($transaction2);
+    $this->assertTrue($database->inTransaction(), 'Still in a transaction after popping the inner transaction');
+    // Pop the outer transaction.
+    unset($transaction);
+    $this->assertFalse($database->inTransaction(), 'Transaction closed after popping the outer transaction');
+    $this->assertRowPresent('outer');
+    $this->assertRowPresent('inner');
+
+    // Pop the transaction in a different order they have been pushed.
+    $this->cleanUp();
+    $transaction = db_transaction();
+    $this->insertRow('outer');
+    $transaction2 = db_transaction();
+    $this->insertRow('inner');
+    // Pop the outer transaction, nothing should happen.
+    unset($transaction);
+    $this->insertRow('inner-after-outer-commit');
+    $this->assertTrue($database->inTransaction(), 'Still in a transaction after popping the outer transaction');
+    // Pop the inner transaction, the whole transaction should commit.
+    unset($transaction2);
+    $this->assertFalse($database->inTransaction(), 'Transaction closed after popping the inner transaction');
+    $this->assertRowPresent('outer');
+    $this->assertRowPresent('inner');
+    $this->assertRowPresent('inner-after-outer-commit');
+
+    // Rollback the inner transaction.
+    $this->cleanUp();
+    $transaction = db_transaction();
+    $this->insertRow('outer');
+    $transaction2 = db_transaction();
+    $this->insertRow('inner');
+    // Now rollback the inner transaction.
+    $transaction2->rollback();
+    unset($transaction2);
+    $this->assertTrue($database->inTransaction(), 'Still in a transaction after popping the outer transaction');
+    // Pop the outer transaction, it should commit.
+    $this->insertRow('outer-after-inner-rollback');
+    unset($transaction);
+    $this->assertFalse($database->inTransaction(), 'Transaction closed after popping the inner transaction');
+    $this->assertRowPresent('outer');
+    $this->assertRowAbsent('inner');
+    $this->assertRowPresent('outer-after-inner-rollback');
+
+    // Rollback the inner transaction after committing the outer one.
+    $this->cleanUp();
+    $transaction = db_transaction();
+    $this->insertRow('outer');
+    $transaction2 = db_transaction();
+    $this->insertRow('inner');
+    // Pop the outer transaction, nothing should happen.
+    unset($transaction);
+    $this->assertTrue($database->inTransaction(), 'Still in a transaction after popping the outer transaction');
+    // Now rollback the inner transaction, it should rollback.
+    $transaction2->rollback();
+    unset($transaction2);
+    $this->assertFalse($database->inTransaction(), 'Transaction closed after popping the inner transaction');
+    $this->assertRowPresent('outer');
+    $this->assertRowAbsent('inner');
+
+    // Rollback the outer transaction while the inner transaction is active.
+    // In that case, an exception will be triggered because we cannot
+    // ensure that the final result will have any meaning.
+    $this->cleanUp();
+    $transaction = db_transaction();
+    $this->insertRow('outer');
+    $transaction2 = db_transaction();
+    $this->insertRow('inner');
+    $transaction3 = db_transaction();
+    $this->insertRow('inner2');
+    // Rollback the outer transaction.
+    try {
+      $transaction->rollback();
+      unset($transaction);
+      $this->fail('Rolling back the outer transaction while the inner transaction is active resulted in an exception.');
+    }
+    catch (DatabaseTransactionOutOfOrderException $e) {
+      $this->pass('Rolling back the outer transaction while the inner transaction is active resulted in an exception.');
+    }
+    $this->assertFalse($database->inTransaction(), 'No more in a transaction after rolling back the outer transaction');
+    // Try to commit one inner transaction.
+    unset($transaction3);
+    $this->pass('Trying to commit an inner transaction resulted in an exception.');
+    // Try to rollback one inner transaction.
+    try {
+      $transaction->rollback();
+      unset($transaction2);
+      $this->fail('Trying to commit an inner transaction resulted in an exception.');
+    }
+    catch (DatabaseTransactionNoActiveException $e) {
+      $this->pass('Trying to commit an inner transaction resulted in an exception.');
+    }
+    $this->assertRowAbsent('outer');
+    $this->assertRowAbsent('inner');
+    $this->assertRowAbsent('inner2');
+  }
+}
+
+
+/**
+ * Check the sequences API.
+ */
+class DatabaseNextIdCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Sequences API',
+      'description' => 'Test the secondary sequences API.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test that the sequences API work.
+   */
+  function testDbNextId() {
+    $first = db_next_id();
+    $second = db_next_id();
+    // We can test for exact increase in here because we know there is no
+    // other process operating on these tables -- normally we could only
+    // expect $second > $first.
+    $this->assertEqual($first + 1, $second, 'The second call from a sequence provides a number increased by one.');
+    $result = db_next_id(1000);
+    $this->assertEqual($result, 1001, 'Sequence provides a larger number than the existing ID.');
+  }
+}
+
+/**
+ * Tests the empty pseudo-statement class.
+ */
+class DatabaseEmptyStatementTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Empty statement',
+      'description' => 'Test the empty pseudo-statement class.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   * Test that the empty result set behaves as empty.
+   */
+  function testEmpty() {
+    $result = new DatabaseStatementEmpty();
+
+    $this->assertTrue($result instanceof DatabaseStatementInterface, 'Class implements expected interface');
+    $this->assertNull($result->fetchObject(), 'Null result returned.');
+  }
+
+  /**
+   * Test that the empty result set iterates safely.
+   */
+  function testEmptyIteration() {
+    $result = new DatabaseStatementEmpty();
+
+    foreach ($result as $record) {
+      $this->fail('Iterating empty result set should not iterate.');
+      return;
+    }
+
+    $this->pass('Iterating empty result set skipped iteration.');
+  }
+
+  /**
+   * Test that the empty result set mass-fetches in an expected way.
+   */
+  function testEmptyFetchAll() {
+    $result = new DatabaseStatementEmpty();
+
+    $this->assertEqual($result->fetchAll(), array(), 'Empty array returned from empty result set.');
+  }
+}
+
+/**
+ * Tests management of database connections.
+ */
+class ConnectionUnitTest extends DrupalUnitTestCase {
+
+  protected $key;
+  protected $target;
+
+  protected $monitor;
+  protected $originalCount;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Connection unit tests',
+      'description' => 'Tests management of database connections.',
+      'group' => 'Database',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    $this->key = 'default';
+    $this->originalTarget = 'default';
+    $this->target = 'DatabaseConnectionUnitTest';
+
+    // Determine whether the database driver is MySQL. If it is not, the test
+    // methods will not be executed.
+    // @todo Make this test driver-agnostic, or find a proper way to skip it.
+    // @see http://drupal.org/node/1273478
+    $connection_info = Database::getConnectionInfo('default');
+    $this->skipTest = (bool) $connection_info['default']['driver'] != 'mysql';
+    if ($this->skipTest) {
+      // Insert an assertion to prevent Simpletest from interpreting the test
+      // as failure.
+      $this->pass('This test is only compatible with MySQL.');
+    }
+
+    // Create an additional connection to monitor the connections being opened
+    // and closed in this test.
+    // @see TestBase::changeDatabasePrefix()
+    $connection_info = Database::getConnectionInfo('default');
+    Database::addConnectionInfo('default', 'monitor', $connection_info['default']);
+    global $databases;
+    $databases['default']['monitor'] = $connection_info['default'];
+    $this->monitor = Database::getConnection('monitor');
+  }
+
+  /**
+   * Adds a new database connection info to Database.
+   */
+  protected function addConnection() {
+    // Add a new target to the connection, by cloning the current connection.
+    $connection_info = Database::getConnectionInfo($this->key);
+    Database::addConnectionInfo($this->key, $this->target, $connection_info[$this->originalTarget]);
+
+    // Verify that the new target exists.
+    $info = Database::getConnectionInfo($this->key);
+    // Note: Custom assertion message to not expose database credentials.
+    $this->assertIdentical($info[$this->target], $connection_info[$this->key], 'New connection info found.');
+  }
+
+  /**
+   * Returns the connection ID of the current test connection.
+   *
+   * @return integer
+   */
+  protected function getConnectionID() {
+    return (int) Database::getConnection($this->target, $this->key)->query('SELECT CONNECTION_ID()')->fetchField();
+  }
+
+  /**
+   * Asserts that a connection ID exists.
+   *
+   * @param integer $id
+   *   The connection ID to verify.
+   */
+  protected function assertConnection($id) {
+    $list = $this->monitor->query('SHOW PROCESSLIST')->fetchAllKeyed(0, 0);
+    return $this->assertTrue(isset($list[$id]), format_string('Connection ID @id found.', array('@id' => $id)));
+  }
+
+  /**
+   * Asserts that a connection ID does not exist.
+   *
+   * @param integer $id
+   *   The connection ID to verify.
+   */
+  protected function assertNoConnection($id) {
+    $list = $this->monitor->query('SHOW PROCESSLIST')->fetchAllKeyed(0, 0);
+    return $this->assertFalse(isset($list[$id]), format_string('Connection ID @id not found.', array('@id' => $id)));
+  }
+
+  /**
+   * Tests Database::closeConnection() without query.
+   *
+   * @todo getConnectionID() executes a query.
+   */
+  function testOpenClose() {
+    if ($this->skipTest) {
+      return;
+    }
+    // Add and open a new connection.
+    $this->addConnection();
+    $id = $this->getConnectionID();
+    Database::getConnection($this->target, $this->key);
+
+    // Verify that there is a new connection.
+    $this->assertConnection($id);
+
+    // Close the connection.
+    Database::closeConnection($this->target, $this->key);
+    // Wait 20ms to give the database engine sufficient time to react.
+    usleep(20000);
+
+    // Verify that we are back to the original connection count.
+    $this->assertNoConnection($id);
+  }
+
+  /**
+   * Tests Database::closeConnection() with a query.
+   */
+  function testOpenQueryClose() {
+    if ($this->skipTest) {
+      return;
+    }
+    // Add and open a new connection.
+    $this->addConnection();
+    $id = $this->getConnectionID();
+    Database::getConnection($this->target, $this->key);
+
+    // Verify that there is a new connection.
+    $this->assertConnection($id);
+
+    // Execute a query.
+    Database::getConnection($this->target, $this->key)->query('SHOW TABLES');
+
+    // Close the connection.
+    Database::closeConnection($this->target, $this->key);
+    // Wait 20ms to give the database engine sufficient time to react.
+    usleep(20000);
+
+    // Verify that we are back to the original connection count.
+    $this->assertNoConnection($id);
+  }
+
+  /**
+   * Tests Database::closeConnection() with a query and custom prefetch method.
+   */
+  function testOpenQueryPrefetchClose() {
+    if ($this->skipTest) {
+      return;
+    }
+    // Add and open a new connection.
+    $this->addConnection();
+    $id = $this->getConnectionID();
+    Database::getConnection($this->target, $this->key);
+
+    // Verify that there is a new connection.
+    $this->assertConnection($id);
+
+    // Execute a query.
+    Database::getConnection($this->target, $this->key)->query('SHOW TABLES')->fetchCol();
+
+    // Close the connection.
+    Database::closeConnection($this->target, $this->key);
+    // Wait 20ms to give the database engine sufficient time to react.
+    usleep(20000);
+
+    // Verify that we are back to the original connection count.
+    $this->assertNoConnection($id);
+  }
+
+  /**
+   * Tests Database::closeConnection() with a select query.
+   */
+  function testOpenSelectQueryClose() {
+    if ($this->skipTest) {
+      return;
+    }
+    // Add and open a new connection.
+    $this->addConnection();
+    $id = $this->getConnectionID();
+    Database::getConnection($this->target, $this->key);
+
+    // Verify that there is a new connection.
+    $this->assertConnection($id);
+
+    // Create a table.
+    $name = 'foo';
+    Database::getConnection($this->target, $this->key)->schema()->createTable($name, array(
+      'fields' => array(
+        'name' => array(
+          'type' => 'varchar',
+          'length' => 255,
+        ),
+      ),
+    ));
+
+    // Execute a query.
+    Database::getConnection($this->target, $this->key)->select('foo', 'f')
+      ->fields('f', array('name'))
+      ->execute()
+      ->fetchAll();
+
+    // Drop the table.
+    Database::getConnection($this->target, $this->key)->schema()->dropTable($name);
+
+    // Close the connection.
+    Database::closeConnection($this->target, $this->key);
+    // Wait 20ms to give the database engine sufficient time to react.
+    usleep(20000);
+
+    // Verify that we are back to the original connection count.
+    $this->assertNoConnection($id);
+  }
+
+}
diff --git a/htmltest/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info b/htmltest/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info
new file mode 100644
index 00000000..3ac342b5
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info
@@ -0,0 +1,12 @@
+name = "Drupal system listing compatible test"
+description = "Support module for testing the drupal_system_listing function."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.module b/htmltest/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.module
new file mode 100644
index 00000000..b3d9bbc7
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.module
@@ -0,0 +1 @@
+<?php
diff --git a/htmltest/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info b/htmltest/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info
new file mode 100644
index 00000000..b7de887a
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info
@@ -0,0 +1,12 @@
+name = "Drupal system listing incompatible test"
+description = "Support module for testing the drupal_system_listing function."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.module b/htmltest/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.module
new file mode 100644
index 00000000..b3d9bbc7
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.module
@@ -0,0 +1 @@
+<?php
diff --git a/htmltest/modules/simpletest/tests/entity_cache_test.info b/htmltest/modules/simpletest/tests/entity_cache_test.info
new file mode 100644
index 00000000..504c9aa9
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/entity_cache_test.info
@@ -0,0 +1,13 @@
+name = "Entity cache test"
+description = "Support module for testing entity cache."
+package = Testing
+version = VERSION
+core = 7.x
+dependencies[] = entity_cache_test_dependency
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/entity_cache_test.module b/htmltest/modules/simpletest/tests/entity_cache_test.module
new file mode 100644
index 00000000..5ae9eccb
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/entity_cache_test.module
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file
+ * Helper module for entity cache tests.
+ */
+
+/**
+ * Implements hook_watchdog().
+ *
+ * This hook is called during module_enable() and since this hook
+ * implementation is invoked, we have to expect that this module and dependent
+ * modules have been properly installed already. So we expect to be able to
+ * retrieve the entity information that has been registered by the required
+ * dependency module.
+ *
+ * @see EnableDisableTestCase::testEntityCache()
+ * @see entity_cache_test_dependency_entity_info()
+ */
+function entity_cache_test_watchdog($log_entry) {
+  if ($log_entry['type'] == 'system' && $log_entry['message'] == '%module module installed.') {
+    $info = entity_get_info('entity_cache_test');
+    // Store the information in a system variable to analyze it later in the
+    // test case.
+    variable_set('entity_cache_test', $info);
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/entity_cache_test_dependency.info b/htmltest/modules/simpletest/tests/entity_cache_test_dependency.info
new file mode 100644
index 00000000..30f00fbf
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/entity_cache_test_dependency.info
@@ -0,0 +1,12 @@
+name = "Entity cache test dependency"
+description = "Support dependency module for testing entity cache."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/entity_cache_test_dependency.module b/htmltest/modules/simpletest/tests/entity_cache_test_dependency.module
new file mode 100644
index 00000000..2d4b3be4
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/entity_cache_test_dependency.module
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @file
+ * Helper module for entity cache tests.
+ */
+
+/**
+ * Implements hook_entity_info().
+ */
+function entity_cache_test_dependency_entity_info() {
+  return array(
+    'entity_cache_test' => array(
+      'label' => variable_get('entity_cache_test_label', 'Entity Cache Test'),
+    ),
+  );
+}
diff --git a/htmltest/modules/simpletest/tests/entity_crud_hook_test.info b/htmltest/modules/simpletest/tests/entity_crud_hook_test.info
new file mode 100644
index 00000000..80d137fd
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/entity_crud_hook_test.info
@@ -0,0 +1,12 @@
+name = "Entity CRUD Hooks Test"
+description = "Support module for CRUD hook tests."
+core = 7.x
+package = Testing
+version = VERSION
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/entity_crud_hook_test.module b/htmltest/modules/simpletest/tests/entity_crud_hook_test.module
new file mode 100644
index 00000000..d25dff1b
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/entity_crud_hook_test.module
@@ -0,0 +1,251 @@
+<?php
+
+/**
+ * @file
+ * Test module for the Entity CRUD API.
+ */
+
+/**
+ * Implements hook_entity_presave().
+ */
+function entity_crud_hook_test_entity_presave($entity, $type) {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $type);
+}
+
+/**
+ * Implements hook_comment_presave().
+ */
+function entity_crud_hook_test_comment_presave() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_file_presave().
+ */
+function entity_crud_hook_test_file_presave() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_node_presave().
+ */
+function entity_crud_hook_test_node_presave() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_taxonomy_term_presave().
+ */
+function entity_crud_hook_test_taxonomy_term_presave() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_taxonomy_vocabulary_presave().
+ */
+function entity_crud_hook_test_taxonomy_vocabulary_presave() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_user_presave().
+ */
+function entity_crud_hook_test_user_presave() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_entity_insert().
+ */
+function entity_crud_hook_test_entity_insert($entity, $type) {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $type);
+}
+
+/**
+ * Implements hook_comment_insert().
+ */
+function entity_crud_hook_test_comment_insert() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_file_insert().
+ */
+function entity_crud_hook_test_file_insert() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_node_insert().
+ */
+function entity_crud_hook_test_node_insert() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_taxonomy_term_insert().
+ */
+function entity_crud_hook_test_taxonomy_term_insert() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_taxonomy_vocabulary_insert().
+ */
+function entity_crud_hook_test_taxonomy_vocabulary_insert() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_user_insert().
+ */
+function entity_crud_hook_test_user_insert() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_entity_load().
+ */
+function entity_crud_hook_test_entity_load(array $entities, $type) {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $type);
+}
+
+/**
+ * Implements hook_comment_load().
+ */
+function entity_crud_hook_test_comment_load() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_file_load().
+ */
+function entity_crud_hook_test_file_load() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_node_load().
+ */
+function entity_crud_hook_test_node_load() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_taxonomy_term_load().
+ */
+function entity_crud_hook_test_taxonomy_term_load() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_taxonomy_vocabulary_load().
+ */
+function entity_crud_hook_test_taxonomy_vocabulary_load() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_user_load().
+ */
+function entity_crud_hook_test_user_load() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_entity_update().
+ */
+function entity_crud_hook_test_entity_update($entity, $type) {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $type);
+}
+
+/**
+ * Implements hook_comment_update().
+ */
+function entity_crud_hook_test_comment_update() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_file_update().
+ */
+function entity_crud_hook_test_file_update() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_node_update().
+ */
+function entity_crud_hook_test_node_update() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_taxonomy_term_update().
+ */
+function entity_crud_hook_test_taxonomy_term_update() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_taxonomy_vocabulary_update().
+ */
+function entity_crud_hook_test_taxonomy_vocabulary_update() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_user_update().
+ */
+function entity_crud_hook_test_user_update() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_entity_delete().
+ */
+function entity_crud_hook_test_entity_delete($entity, $type) {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called for type ' . $type);
+}
+
+/**
+ * Implements hook_comment_delete().
+ */
+function entity_crud_hook_test_comment_delete() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_file_delete().
+ */
+function entity_crud_hook_test_file_delete() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_node_delete().
+ */
+function entity_crud_hook_test_node_delete() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_taxonomy_term_delete().
+ */
+function entity_crud_hook_test_taxonomy_term_delete() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_taxonomy_vocabulary_delete().
+ */
+function entity_crud_hook_test_taxonomy_vocabulary_delete() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
+
+/**
+ * Implements hook_user_delete().
+ */
+function entity_crud_hook_test_user_delete() {
+  $_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
+}
diff --git a/htmltest/modules/simpletest/tests/entity_crud_hook_test.test b/htmltest/modules/simpletest/tests/entity_crud_hook_test.test
new file mode 100644
index 00000000..178e34dc
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/entity_crud_hook_test.test
@@ -0,0 +1,338 @@
+<?php
+
+/**
+ * @file
+ * CRUD hook tests for the Entity CRUD API.
+ */
+
+/**
+ * Tests invocation of hooks when performing an action.
+ *
+ * Tested hooks are:
+ * - hook_entity_insert()
+ * - hook_entity_load()
+ * - hook_entity_update()
+ * - hook_entity_delete()
+ * As well as all type-specific hooks, like hook_node_insert(),
+ * hook_comment_update(), etc.
+ */
+class EntityCrudHookTestCase extends DrupalWebTestCase {
+
+  protected $ids = array();
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Entity CRUD hooks',
+      'description' => 'Tests the invocation of hooks when inserting, loading, updating or deleting an entity.',
+      'group' => 'Entity API',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp('entity_crud_hook_test', 'taxonomy', 'comment');
+  }
+
+  /**
+   * Pass if the message $text was set by one of the CRUD hooks in
+   * entity_crud_hook_test.module, i.e., if the $text is an element of
+   * $_SESSION['entity_crud_hook_test'].
+   *
+   * @param $text
+   *   Plain text to look for.
+   * @param $message
+   *   Message to display.
+   * @param $group
+   *   The group this message belongs to, defaults to 'Other'.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function assertHookMessage($text, $message = NULL, $group = 'Other') {
+    if (!isset($message)) {
+      $message = $text;
+    }
+    return $this->assertTrue(array_search($text, $_SESSION['entity_crud_hook_test']) !== FALSE, $message, $group);
+  }
+
+  /**
+   * Tests hook invocations for CRUD operations on comments.
+   */
+  public function testCommentHooks() {
+    $node = (object) array(
+      'uid' => 1,
+      'type' => 'article',
+      'title' => 'Test node',
+      'status' => 1,
+      'comment' => 2,
+      'promote' => 0,
+      'sticky' => 0,
+      'language' => LANGUAGE_NONE,
+      'created' => REQUEST_TIME,
+      'changed' => REQUEST_TIME,
+    );
+    node_save($node);
+    $nid = $node->nid;
+
+    $comment = (object) array(
+      'cid' => NULL,
+      'pid' => 0,
+      'nid' => $nid,
+      'uid' => 1,
+      'subject' => 'Test comment',
+      'created' => REQUEST_TIME,
+      'changed' => REQUEST_TIME,
+      'status' => 1,
+      'language' => LANGUAGE_NONE,
+    );
+    $_SESSION['entity_crud_hook_test'] = array();
+    comment_save($comment);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_presave called for type comment');
+    $this->assertHookMessage('entity_crud_hook_test_comment_presave called');
+    $this->assertHookMessage('entity_crud_hook_test_entity_insert called for type comment');
+    $this->assertHookMessage('entity_crud_hook_test_comment_insert called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    $comment = comment_load($comment->cid);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_load called for type comment');
+    $this->assertHookMessage('entity_crud_hook_test_comment_load called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    $comment->subject = 'New subject';
+    comment_save($comment);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_presave called for type comment');
+    $this->assertHookMessage('entity_crud_hook_test_comment_presave called');
+    $this->assertHookMessage('entity_crud_hook_test_entity_update called for type comment');
+    $this->assertHookMessage('entity_crud_hook_test_comment_update called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    comment_delete($comment->cid);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_delete called for type comment');
+    $this->assertHookMessage('entity_crud_hook_test_comment_delete called');
+  }
+
+  /**
+   * Tests hook invocations for CRUD operations on files.
+   */
+  public function testFileHooks() {
+    $url = 'public://entity_crud_hook_test.file';
+    file_put_contents($url, 'Test test test');
+    $file = (object) array(
+      'fid' => NULL,
+      'uid' => 1,
+      'filename' => 'entity_crud_hook_test.file',
+      'uri' => $url,
+      'filemime' => 'text/plain',
+      'filesize' => filesize($url),
+      'status' => 1,
+      'timestamp' => REQUEST_TIME,
+    );
+    $_SESSION['entity_crud_hook_test'] = array();
+    file_save($file);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_presave called for type file');
+    $this->assertHookMessage('entity_crud_hook_test_file_presave called');
+    $this->assertHookMessage('entity_crud_hook_test_entity_insert called for type file');
+    $this->assertHookMessage('entity_crud_hook_test_file_insert called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    $file = file_load($file->fid);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_load called for type file');
+    $this->assertHookMessage('entity_crud_hook_test_file_load called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    $file->filename = 'new.entity_crud_hook_test.file';
+    file_save($file);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_presave called for type file');
+    $this->assertHookMessage('entity_crud_hook_test_file_presave called');
+    $this->assertHookMessage('entity_crud_hook_test_entity_update called for type file');
+    $this->assertHookMessage('entity_crud_hook_test_file_update called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    file_delete($file);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_delete called for type file');
+    $this->assertHookMessage('entity_crud_hook_test_file_delete called');
+  }
+
+  /**
+   * Tests hook invocations for CRUD operations on nodes.
+   */
+  public function testNodeHooks() {
+    $node = (object) array(
+      'uid' => 1,
+      'type' => 'article',
+      'title' => 'Test node',
+      'status' => 1,
+      'comment' => 2,
+      'promote' => 0,
+      'sticky' => 0,
+      'language' => LANGUAGE_NONE,
+      'created' => REQUEST_TIME,
+      'changed' => REQUEST_TIME,
+    );
+    $_SESSION['entity_crud_hook_test'] = array();
+    node_save($node);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_presave called for type node');
+    $this->assertHookMessage('entity_crud_hook_test_node_presave called');
+    $this->assertHookMessage('entity_crud_hook_test_entity_insert called for type node');
+    $this->assertHookMessage('entity_crud_hook_test_node_insert called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    $node = node_load($node->nid);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_load called for type node');
+    $this->assertHookMessage('entity_crud_hook_test_node_load called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    $node->title = 'New title';
+    node_save($node);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_presave called for type node');
+    $this->assertHookMessage('entity_crud_hook_test_node_presave called');
+    $this->assertHookMessage('entity_crud_hook_test_entity_update called for type node');
+    $this->assertHookMessage('entity_crud_hook_test_node_update called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    node_delete($node->nid);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_delete called for type node');
+    $this->assertHookMessage('entity_crud_hook_test_node_delete called');
+  }
+
+  /**
+   * Tests hook invocations for CRUD operations on taxonomy terms.
+   */
+  public function testTaxonomyTermHooks() {
+    $vocabulary = (object) array(
+      'name' => 'Test vocabulary',
+      'machine_name' => 'test',
+      'description' => NULL,
+      'module' => 'entity_crud_hook_test',
+    );
+    taxonomy_vocabulary_save($vocabulary);
+
+    $term = (object) array(
+      'vid' => $vocabulary->vid,
+      'name' => 'Test term',
+      'description' => NULL,
+      'format' => 1,
+    );
+    $_SESSION['entity_crud_hook_test'] = array();
+    taxonomy_term_save($term);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_presave called for type taxonomy_term');
+    $this->assertHookMessage('entity_crud_hook_test_taxonomy_term_presave called');
+    $this->assertHookMessage('entity_crud_hook_test_entity_insert called for type taxonomy_term');
+    $this->assertHookMessage('entity_crud_hook_test_taxonomy_term_insert called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    $term = taxonomy_term_load($term->tid);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_load called for type taxonomy_term');
+    $this->assertHookMessage('entity_crud_hook_test_taxonomy_term_load called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    $term->name = 'New name';
+    taxonomy_term_save($term);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_presave called for type taxonomy_term');
+    $this->assertHookMessage('entity_crud_hook_test_taxonomy_term_presave called');
+    $this->assertHookMessage('entity_crud_hook_test_entity_update called for type taxonomy_term');
+    $this->assertHookMessage('entity_crud_hook_test_taxonomy_term_update called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    taxonomy_term_delete($term->tid);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_delete called for type taxonomy_term');
+    $this->assertHookMessage('entity_crud_hook_test_taxonomy_term_delete called');
+  }
+
+  /**
+   * Tests hook invocations for CRUD operations on taxonomy vocabularies.
+   */
+  public function testTaxonomyVocabularyHooks() {
+    $vocabulary = (object) array(
+      'name' => 'Test vocabulary',
+      'machine_name' => 'test',
+      'description' => NULL,
+      'module' => 'entity_crud_hook_test',
+    );
+    $_SESSION['entity_crud_hook_test'] = array();
+    taxonomy_vocabulary_save($vocabulary);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_presave called for type taxonomy_vocabulary');
+    $this->assertHookMessage('entity_crud_hook_test_taxonomy_vocabulary_presave called');
+    $this->assertHookMessage('entity_crud_hook_test_entity_insert called for type taxonomy_vocabulary');
+    $this->assertHookMessage('entity_crud_hook_test_taxonomy_vocabulary_insert called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    $vocabulary = taxonomy_vocabulary_load($vocabulary->vid);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_load called for type taxonomy_vocabulary');
+    $this->assertHookMessage('entity_crud_hook_test_taxonomy_vocabulary_load called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    $vocabulary->name = 'New name';
+    taxonomy_vocabulary_save($vocabulary);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_presave called for type taxonomy_vocabulary');
+    $this->assertHookMessage('entity_crud_hook_test_taxonomy_vocabulary_presave called');
+    $this->assertHookMessage('entity_crud_hook_test_entity_update called for type taxonomy_vocabulary');
+    $this->assertHookMessage('entity_crud_hook_test_taxonomy_vocabulary_update called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    taxonomy_vocabulary_delete($vocabulary->vid);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_delete called for type taxonomy_vocabulary');
+    $this->assertHookMessage('entity_crud_hook_test_taxonomy_vocabulary_delete called');
+  }
+
+  /**
+   * Tests hook invocations for CRUD operations on users.
+   */
+  public function testUserHooks() {
+    $edit = array(
+      'name' => 'Test user',
+      'mail' => 'test@example.com',
+      'created' => REQUEST_TIME,
+      'status' => 1,
+      'language' => 'en',
+    );
+    $account = (object) $edit;
+    $_SESSION['entity_crud_hook_test'] = array();
+    $account = user_save($account, $edit);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_presave called for type user');
+    $this->assertHookMessage('entity_crud_hook_test_user_presave called');
+    $this->assertHookMessage('entity_crud_hook_test_entity_insert called for type user');
+    $this->assertHookMessage('entity_crud_hook_test_user_insert called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    $account = user_load($account->uid);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_load called for type user');
+    $this->assertHookMessage('entity_crud_hook_test_user_load called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    $edit['name'] = 'New name';
+    $account = user_save($account, $edit);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_presave called for type user');
+    $this->assertHookMessage('entity_crud_hook_test_user_presave called');
+    $this->assertHookMessage('entity_crud_hook_test_entity_update called for type user');
+    $this->assertHookMessage('entity_crud_hook_test_user_update called');
+
+    $_SESSION['entity_crud_hook_test'] = array();
+    user_delete($account->uid);
+
+    $this->assertHookMessage('entity_crud_hook_test_entity_delete called for type user');
+    $this->assertHookMessage('entity_crud_hook_test_user_delete called');
+  }
+
+}
diff --git a/htmltest/modules/simpletest/tests/entity_query.test b/htmltest/modules/simpletest/tests/entity_query.test
new file mode 100644
index 00000000..9a6cb690
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/entity_query.test
@@ -0,0 +1,1681 @@
+<?php
+
+
+/**
+ * @file
+ * Unit test file for the entity API.
+ */
+
+/**
+ * Tests EntityFieldQuery.
+ */
+class EntityFieldQueryTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Entity query',
+      'description' => 'Test the EntityFieldQuery class.',
+      'group' => 'Entity API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('node', 'field_test', 'entity_query_access_test', 'node_access_test'));
+
+    field_test_create_bundle('bundle1');
+    field_test_create_bundle('bundle2');
+    field_test_create_bundle('test_bundle');
+    field_test_create_bundle('test_entity_bundle');
+
+    $instances = array();
+    $this->fields = array();
+    $this->field_names[0] = $field_name = drupal_strtolower($this->randomName() . '_field_name');
+    $field = array('field_name' => $field_name, 'type' => 'test_field', 'cardinality' => 4);
+    $field = field_create_field($field);
+    $this->fields[0] = $field;
+    $instance = array(
+      'field_name' => $field_name,
+      'entity_type' => '',
+      'bundle' => '',
+      'label' => $this->randomName() . '_label',
+      'description' => $this->randomName() . '_description',
+      'weight' => mt_rand(0, 127),
+      'settings' => array(
+        'test_instance_setting' => $this->randomName(),
+      ),
+      'widget' => array(
+        'type' => 'test_field_widget',
+        'label' => 'Test Field',
+        'settings' => array(
+          'test_widget_setting' => $this->randomName(),
+        )
+      )
+    );
+
+    $instances[0] = $instance;
+
+    // Add an instance to that bundle.
+    $instances[0]['bundle'] = 'bundle1';
+    $instances[0]['entity_type'] = 'test_entity_bundle_key';
+    field_create_instance($instances[0]);
+    $instances[0]['bundle'] = 'bundle2';
+    field_create_instance($instances[0]);
+    $instances[0]['bundle'] = $instances[0]['entity_type'] = 'test_entity_bundle';
+    field_create_instance($instances[0]);
+
+    $this->field_names[1] = $field_name = drupal_strtolower($this->randomName() . '_field_name');
+    $field = array('field_name' => $field_name, 'type' => 'shape', 'cardinality' => 4);
+    $field = field_create_field($field);
+    $this->fields[1] = $field;
+    $instance = array(
+      'field_name' => $field_name,
+      'entity_type' => '',
+      'bundle' => '',
+      'label' => $this->randomName() . '_label',
+      'description' => $this->randomName() . '_description',
+      'weight' => mt_rand(0, 127),
+      'settings' => array(
+        'test_instance_setting' => $this->randomName(),
+      ),
+      'widget' => array(
+        'type' => 'test_field_widget',
+        'label' => 'Test Field',
+        'settings' => array(
+          'test_widget_setting' => $this->randomName(),
+        )
+      )
+    );
+
+    $instances[1] = $instance;
+
+    // Add a field instance to the bundles.
+    $instances[1]['bundle'] = 'bundle1';
+    $instances[1]['entity_type'] = 'test_entity_bundle_key';
+    field_create_instance($instances[1]);
+    $instances[1]['bundle'] = $instances[1]['entity_type'] = 'test_entity_bundle';
+    field_create_instance($instances[1]);
+
+    $this->instances = $instances;
+    // Write entity base table if there is one.
+    $entities = array();
+
+    // Create entities which have a 'bundle key' defined.
+    for ($i = 1; $i < 7; $i++) {
+      $entity = new stdClass();
+      $entity->ftid = $i;
+      $entity->fttype = ($i < 5) ? 'bundle1' : 'bundle2';
+
+      $entity->{$this->field_names[0]}[LANGUAGE_NONE][0]['value'] = $i;
+      drupal_write_record('test_entity_bundle_key', $entity);
+      field_attach_insert('test_entity_bundle_key', $entity);
+    }
+
+    $entity = new stdClass();
+    $entity->ftid = 5;
+    $entity->fttype = 'test_entity_bundle';
+    $entity->{$this->field_names[1]}[LANGUAGE_NONE][0]['shape'] = 'square';
+    $entity->{$this->field_names[1]}[LANGUAGE_NONE][0]['color'] = 'red';
+    $entity->{$this->field_names[1]}[LANGUAGE_NONE][1]['shape'] = 'circle';
+    $entity->{$this->field_names[1]}[LANGUAGE_NONE][1]['color'] = 'blue';
+    drupal_write_record('test_entity_bundle', $entity);
+    field_attach_insert('test_entity_bundle', $entity);
+
+    $instances[2] = $instance;
+    $instances[2]['bundle'] = 'test_bundle';
+    $instances[2]['field_name'] = $this->field_names[0];
+    $instances[2]['entity_type'] = 'test_entity';
+    field_create_instance($instances[2]);
+
+    // Create entities with support for revisions.
+    for ($i = 1; $i < 5; $i++) {
+      $entity = new stdClass();
+      $entity->ftid = $i;
+      $entity->ftvid = $i;
+      $entity->fttype = 'test_bundle';
+      $entity->{$this->field_names[0]}[LANGUAGE_NONE][0]['value'] = $i;
+
+      drupal_write_record('test_entity', $entity);
+      field_attach_insert('test_entity', $entity);
+      drupal_write_record('test_entity_revision', $entity);
+    }
+
+    // Add two revisions to an entity.
+    for ($i = 100; $i < 102; $i++) {
+      $entity = new stdClass();
+      $entity->ftid = 4;
+      $entity->ftvid = $i;
+      $entity->fttype = 'test_bundle';
+      $entity->{$this->field_names[0]}[LANGUAGE_NONE][0]['value'] = $i;
+
+      drupal_write_record('test_entity', $entity, 'ftid');
+      drupal_write_record('test_entity_revision', $entity);
+
+      db_update('test_entity')
+       ->fields(array('ftvid' => $entity->ftvid))
+       ->condition('ftid', $entity->ftid)
+       ->execute();
+
+      field_attach_update('test_entity', $entity);
+    }
+  }
+
+  /**
+   * Tests EntityFieldQuery.
+   */
+  function testEntityFieldQuery() {
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle')
+      ->entityCondition('entity_id', '5');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle', 5),
+    ), 'Test query on an entity type with a generated bundle.');
+
+    // Test entity_type condition.
+    $query = new EntityFieldQuery();
+    $query->entityCondition('entity_type', 'test_entity_bundle_key');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test entity entity_type condition.');
+
+    // Test entity_id condition.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->entityCondition('entity_id', '3');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 3),
+    ), 'Test entity entity_id condition.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', '3');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 3),
+    ), 'Test entity entity_id condition and entity_id property condition.');
+
+    // Test bundle condition.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->entityCondition('bundle', 'bundle1');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+    ), 'Test entity bundle condition: bundle1.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->entityCondition('bundle', 'bundle2');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test entity bundle condition: bundle2.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('fttype', 'bundle2');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test entity bundle condition and bundle property condition.');
+
+    // Test revision_id condition.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity')
+      ->entityCondition('revision_id', '3');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 3),
+    ), 'Test entity revision_id condition.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity')
+      ->propertyCondition('ftvid', '3');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 3),
+    ), 'Test entity revision_id condition and revision_id property condition.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity')
+      ->fieldCondition($this->fields[0], 'value', 100, '>=')
+      ->age(FIELD_LOAD_REVISION);
+    $this->assertEntityFieldQuery($query, array(
+        array('test_entity', 100),
+        array('test_entity', 101),
+    ), 'Test revision age.');
+
+    // Test that fields attached to the non-revision supporting entity
+    // 'test_entity_bundle_key' are reachable in FIELD_LOAD_REVISION.
+    $query = new EntityFieldQuery();
+    $query
+      ->fieldCondition($this->fields[0], 'value', 100, '<')
+      ->age(FIELD_LOAD_REVISION);
+    $this->assertEntityFieldQuery($query, array(
+        array('test_entity_bundle_key', 1),
+        array('test_entity_bundle_key', 2),
+        array('test_entity_bundle_key', 3),
+        array('test_entity_bundle_key', 4),
+        array('test_entity_bundle_key', 5),
+        array('test_entity_bundle_key', 6),
+        array('test_entity', 1),
+        array('test_entity', 2),
+        array('test_entity', 3),
+        array('test_entity', 4),
+    ), 'Test that fields are reachable from FIELD_LOAD_REVISION even for non-revision entities.');
+
+    // Test entity sort by entity_id.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->entityOrderBy('entity_id', 'ASC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test sort entity entity_id in ascending order.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->entityOrderBy('entity_id', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 1),
+    ), 'Test sort entity entity_id in descending order.', TRUE);
+
+    // Test entity sort by entity_id, with a field condition.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->entityOrderBy('entity_id', 'ASC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test sort entity entity_id in ascending order, with a field condition.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->propertyOrderBy('ftid', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 1),
+    ), 'Test sort entity entity_id property in descending order, with a field condition.', TRUE);
+
+    // Test property sort by entity id.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyOrderBy('ftid', 'ASC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test sort entity entity_id property in ascending order.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyOrderBy('ftid', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 1),
+    ), 'Test sort entity entity_id property in descending order.', TRUE);
+
+    // Test property sort by entity id, with a field condition.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->propertyOrderBy('ftid', 'ASC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test sort entity entity_id property in ascending order, with a field condition.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->propertyOrderBy('ftid', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 1),
+    ), 'Test sort entity entity_id property in descending order, with a field condition.', TRUE);
+
+    // Test entity sort by bundle.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->entityOrderBy('bundle', 'ASC')
+      ->propertyOrderBy('ftid', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 5),
+    ), 'Test sort entity bundle in ascending order, property in descending order.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->entityOrderBy('bundle', 'DESC')
+      ->propertyOrderBy('ftid', 'ASC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+    ), 'Test sort entity bundle in descending order, property in ascending order.', TRUE);
+
+    // Test entity sort by bundle, with a field condition.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->entityOrderBy('bundle', 'ASC')
+      ->propertyOrderBy('ftid', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 5),
+    ), 'Test sort entity bundle in ascending order, property in descending order, with a field condition.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->entityOrderBy('bundle', 'DESC')
+      ->propertyOrderBy('ftid', 'ASC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+    ), 'Test sort entity bundle in descending order, property in ascending order, with a field condition.', TRUE);
+
+    // Test entity sort by bundle, field.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->entityOrderBy('bundle', 'ASC')
+      ->fieldOrderBy($this->fields[0], 'value', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 5),
+    ), 'Test sort entity bundle in ascending order, field in descending order.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->entityOrderBy('bundle', 'DESC')
+      ->fieldOrderBy($this->fields[0], 'value', 'ASC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+    ), 'Test sort entity bundle in descending order, field in ascending order.', TRUE);
+
+    // Test entity sort by revision_id.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity')
+      ->entityOrderBy('revision_id', 'ASC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 1),
+      array('test_entity', 2),
+      array('test_entity', 3),
+      array('test_entity', 4),
+    ), 'Test sort entity revision_id in ascending order.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity')
+      ->entityOrderBy('revision_id', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 4),
+      array('test_entity', 3),
+      array('test_entity', 2),
+      array('test_entity', 1),
+    ), 'Test sort entity revision_id in descending order.', TRUE);
+
+    // Test entity sort by revision_id, with a field condition.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->entityOrderBy('revision_id', 'ASC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 1),
+      array('test_entity', 2),
+      array('test_entity', 3),
+      array('test_entity', 4),
+    ), 'Test sort entity revision_id in ascending order, with a field condition.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->entityOrderBy('revision_id', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 4),
+      array('test_entity', 3),
+      array('test_entity', 2),
+      array('test_entity', 1),
+    ), 'Test sort entity revision_id in descending order, with a field condition.', TRUE);
+
+    // Test property sort by revision_id.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity')
+      ->propertyOrderBy('ftvid', 'ASC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 1),
+      array('test_entity', 2),
+      array('test_entity', 3),
+      array('test_entity', 4),
+    ), 'Test sort entity revision_id property in ascending order.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity')
+      ->propertyOrderBy('ftvid', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 4),
+      array('test_entity', 3),
+      array('test_entity', 2),
+      array('test_entity', 1),
+    ), 'Test sort entity revision_id property in descending order.', TRUE);
+
+    // Test property sort by revision_id, with a field condition.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->propertyOrderBy('ftvid', 'ASC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 1),
+      array('test_entity', 2),
+      array('test_entity', 3),
+      array('test_entity', 4),
+    ), 'Test sort entity revision_id property in ascending order, with a field condition.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->propertyOrderBy('ftvid', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 4),
+      array('test_entity', 3),
+      array('test_entity', 2),
+      array('test_entity', 1),
+    ), 'Test sort entity revision_id property in descending order, with a field condition.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldOrderBy($this->fields[0], 'value', 'ASC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test sort field in ascending order without field condition.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldOrderBy($this->fields[0], 'value', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 1),
+    ), 'Test sort field in descending order without field condition.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->fieldOrderBy($this->fields[0], 'value', 'ASC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test sort field in ascending order.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->fieldOrderBy($this->fields[0], 'value', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 1),
+    ), 'Test sort field in descending order.', TRUE);
+
+    // Test "in" operation with entity entity_type condition and entity_id
+    // property condition.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', array(1, 3, 4), 'IN');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+    ), 'Test "in" operation with entity entity_type condition and entity_id property condition.');
+
+    // Test "in" operation with entity entity_type condition and entity_id
+    // property condition. Sort in descending order by entity_id.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', array(1, 3, 4), 'IN')
+      ->propertyOrderBy('ftid', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 1),
+    ), 'Test "in" operation with entity entity_type condition and entity_id property condition. Sort entity_id in descending order.', TRUE);
+
+    // Test query count
+    $query = new EntityFieldQuery();
+    $query_count = $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->count()
+      ->execute();
+    $this->assertEqual($query_count, 6, 'Test query count on entity condition.');
+
+    $query = new EntityFieldQuery();
+    $query_count = $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', '1')
+      ->count()
+      ->execute();
+    $this->assertEqual($query_count, 1, 'Test query count on entity and property condition.');
+
+    $query = new EntityFieldQuery();
+    $query_count = $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', '4', '>')
+      ->count()
+      ->execute();
+    $this->assertEqual($query_count, 2, 'Test query count on entity and property condition with operator.');
+
+    $query = new EntityFieldQuery();
+    $query_count = $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 3, '=')
+      ->count()
+      ->execute();
+    $this->assertEqual($query_count, 1, 'Test query count on field condition.');
+
+    // First, test without options.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('fttype', 'und', 'CONTAINS');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test the "contains" operation on a property.');
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[1], 'shape', 'uar', 'CONTAINS');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle', 5),
+    ), 'Test the "contains" operation on a field.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', 1, '=');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+    ), 'Test the "equal to" operation on a property.');
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', 3, '=');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 3),
+      array('test_entity', 3),
+    ), 'Test the "equal to" operation on a field.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', 3, '<>');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test the "not equal to" operation on a property.');
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', 3, '<>');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+      array('test_entity', 1),
+      array('test_entity', 2),
+      array('test_entity', 4),
+    ), 'Test the "not equal to" operation on a field.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', 3, '!=');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test the "not equal to" operation on a property.');
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', 3, '!=');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+      array('test_entity', 1),
+      array('test_entity', 2),
+      array('test_entity', 4),
+    ), 'Test the "not equal to" operation on a field.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', 2, '<');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+    ), 'Test the "less than" operation on a property.');
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', 2, '<');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity', 1),
+    ), 'Test the "less than" operation on a field.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', 2, '<=');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+    ), 'Test the "less than or equal to" operation on a property.');
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', 2, '<=');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity', 1),
+      array('test_entity', 2),
+    ), 'Test the "less than or equal to" operation on a field.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', 4, '>');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test the "greater than" operation on a property.');
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', 2, '>');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+      array('test_entity', 3),
+      array('test_entity', 4),
+    ), 'Test the "greater than" operation on a field.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', 4, '>=');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test the "greater than or equal to" operation on a property.');
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', 3, '>=');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+      array('test_entity', 3),
+      array('test_entity', 4),
+    ), 'Test the "greater than or equal to" operation on a field.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', array(3, 4), 'NOT IN');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test the "not in" operation on a property.');
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', array(3, 4, 100, 101), 'NOT IN');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+      array('test_entity', 1),
+      array('test_entity', 2),
+    ), 'Test the "not in" operation on a field.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', array(3, 4), 'IN');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+    ), 'Test the "in" operation on a property.');
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', array(2, 3), 'IN');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity', 2),
+      array('test_entity', 3),
+    ), 'Test the "in" operation on a field.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', array(1, 3), 'BETWEEN');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+    ), 'Test the "between" operation on a property.');
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', array(1, 3), 'BETWEEN');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity', 1),
+      array('test_entity', 2),
+      array('test_entity', 3),
+    ), 'Test the "between" operation on a field.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('fttype', 'bun', 'STARTS_WITH');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test the "starts_with" operation on a property.');
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[1], 'shape', 'squ', 'STARTS_WITH');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle', 5),
+    ), 'Test the "starts_with" operation on a field.');
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', 3);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 3),
+      array('test_entity', 3),
+    ), 'Test omission of an operator with a single item.');
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', array(2, 3));
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity', 2),
+      array('test_entity', 3),
+    ), 'Test omission of an operator with multiple items.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyCondition('ftid', 1, '>')
+      ->fieldCondition($this->fields[0], 'value', 4, '<');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+    ), 'Test entity, property and field conditions.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->entityCondition('bundle', 'bundle', 'STARTS_WITH')
+      ->propertyCondition('ftid', 4)
+      ->fieldCondition($this->fields[0], 'value', 4);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 4),
+    ), 'Test entity condition with "starts_with" operation, and property and field conditions.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyOrderBy('ftid', 'ASC')
+      ->range(0, 2);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+    ), 'Test limit on a property.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>=')
+      ->fieldOrderBy($this->fields[0], 'value', 'ASC')
+      ->range(0, 2);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+    ), 'Test limit on a field.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyOrderBy('ftid', 'ASC')
+      ->range(4, 6);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test offset on a property.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->fieldOrderBy($this->fields[0], 'value', 'ASC')
+      ->range(2, 4);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test offset on a field.', TRUE);
+
+    for ($i = 6; $i < 10; $i++) {
+      $entity = new stdClass();
+      $entity->ftid = $i;
+      $entity->fttype = 'test_entity_bundle';
+      $entity->{$this->field_names[0]}[LANGUAGE_NONE][0]['value'] = $i - 5;
+      drupal_write_record('test_entity_bundle', $entity);
+      field_attach_insert('test_entity_bundle', $entity);
+    }
+
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', 2, '>');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+      array('test_entity', 3),
+      array('test_entity', 4),
+      array('test_entity_bundle', 8),
+      array('test_entity_bundle', 9),
+    ), 'Select a field across multiple entities.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->fieldCondition($this->fields[1], 'shape', 'square')
+      ->fieldCondition($this->fields[1], 'color', 'blue');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle', 5),
+    ), 'Test without a delta group.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->fieldCondition($this->fields[1], 'shape', 'square', '=', 'group')
+      ->fieldCondition($this->fields[1], 'color', 'blue', '=', 'group');
+    $this->assertEntityFieldQuery($query, array(), 'Test with a delta group.');
+
+    // Test query on a deleted field.
+    field_attach_delete_bundle('test_entity_bundle_key', 'bundle1');
+    field_attach_delete_bundle('test_entity', 'test_bundle');
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', '3');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle', 8),
+    ), 'Test query on a field after deleting field from some entities.');
+
+    field_attach_delete_bundle('test_entity_bundle', 'test_entity_bundle');
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', '3');
+    $this->assertEntityFieldQuery($query, array(), 'Test query on a field after deleting field from all entities.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->fieldCondition($this->fields[0], 'value', '3')
+      ->deleted(TRUE);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle', 8),
+      array('test_entity', 3),
+    ), 'Test query on a deleted field with deleted option set to TRUE.');
+
+    $pass = FALSE;
+    $query = new EntityFieldQuery();
+    try {
+      $query->execute();
+    }
+    catch (EntityFieldQueryException $exception) {
+      $pass = ($exception->getMessage() == t('For this query an entity type must be specified.'));
+    }
+    $this->assertTrue($pass, "Can't query the universe.");
+  }
+
+  /**
+   * Tests querying translatable fields.
+   */
+  function testEntityFieldQueryTranslatable() {
+
+    // Make a test field translatable AND cardinality one.
+    $this->fields[0]['translatable'] = TRUE;
+    $this->fields[0]['cardinality'] = 1;
+    field_update_field($this->fields[0]);
+    field_test_entity_info_translatable('test_entity', TRUE);
+
+    // Create more items with different languages.
+    $entity = new stdClass();
+    $entity->ftid = 1;
+    $entity->ftvid = 1;
+    $entity->fttype = 'test_bundle';
+
+    // Set fields in two languages with one field value.
+    foreach (array(LANGUAGE_NONE, 'en') as $langcode) {
+      $entity->{$this->field_names[0]}[$langcode][0]['value'] = 1234;
+    }
+
+    field_attach_update('test_entity', $entity);
+
+    // Look up number of results when querying a single entity with multilingual
+    // field values.
+    $query = new EntityFieldQuery();
+    $query_count = $query
+      ->entityCondition('entity_type', 'test_entity')
+      ->entityCondition('bundle', 'test_bundle')
+      ->entityCondition('entity_id', '1')
+      ->fieldCondition($this->fields[0])
+      ->count()
+      ->execute();
+
+    $this->assertEqual($query_count, 1, "Count on translatable cardinality one field is correct.");
+  }
+
+  /**
+   * Tests field meta conditions.
+   */
+  function testEntityFieldQueryMetaConditions() {
+    // Make a test field translatable.
+    $this->fields[0]['translatable'] = TRUE;
+    field_update_field($this->fields[0]);
+    field_test_entity_info_translatable('test_entity', TRUE);
+
+    // Create more items with different languages.
+    $entity = new stdClass();
+    $entity->ftid = 1;
+    $entity->ftvid = 1;
+    $entity->fttype = 'test_bundle';
+    $j = 0;
+
+    foreach (array(LANGUAGE_NONE, 'en') as $langcode) {
+      for ($i = 0; $i < 4; $i++) {
+        $entity->{$this->field_names[0]}[$langcode][$i]['value'] = $i + $j;
+      }
+      $j += 4;
+    }
+
+    field_attach_update('test_entity', $entity);
+
+    // Test delta field meta condition.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldDeltaCondition($this->fields[0], 0, '>');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 1),
+    ), 'Test with a delta meta condition.');
+
+    // Test language field meta condition.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '<>');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 1),
+    ), 'Test with a language meta condition.');
+
+    // Test language field meta condition.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '!=');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 1),
+    ), 'Test with a language meta condition.');
+
+    // Test delta grouping.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldCondition($this->fields[0], 'value', 0, '=', 'group')
+      ->fieldDeltaCondition($this->fields[0], 1, '<', 'group');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 1),
+    ), 'Test with a grouped delta meta condition.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldCondition($this->fields[0], 'value', 0, '=', 'group')
+      ->fieldDeltaCondition($this->fields[0], 1, '>=', 'group');
+    $this->assertEntityFieldQuery($query, array(), 'Test with a grouped delta meta condition (empty result set).');
+
+    // Test language grouping.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldCondition($this->fields[0], 'value', 0, '=', NULL, 'group')
+      ->fieldLanguageCondition($this->fields[0], 'en', '<>', NULL, 'group');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 1),
+    ), 'Test with a grouped language meta condition.');
+
+    // Test language grouping.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldCondition($this->fields[0], 'value', 0, '=', NULL, 'group')
+      ->fieldLanguageCondition($this->fields[0], 'en', '!=', NULL, 'group');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 1),
+    ), 'Test with a grouped language meta condition.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldCondition($this->fields[0], 'value', 0, '=', NULL, 'group')
+      ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '<>', NULL, 'group');
+    $this->assertEntityFieldQuery($query, array(), 'Test with a grouped language meta condition (empty result set).');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldCondition($this->fields[0], 'value', 0, '=', NULL, 'group')
+      ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '!=', NULL, 'group');
+    $this->assertEntityFieldQuery($query, array(), 'Test with a grouped language meta condition (empty result set).');
+
+    // Test delta and language grouping.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
+      ->fieldDeltaCondition($this->fields[0], 1, '<', 'delta', 'language')
+      ->fieldLanguageCondition($this->fields[0], 'en', '<>', 'delta', 'language');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 1),
+    ), 'Test with a grouped delta + language meta condition.');
+
+    // Test delta and language grouping.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
+      ->fieldDeltaCondition($this->fields[0], 1, '<', 'delta', 'language')
+      ->fieldLanguageCondition($this->fields[0], 'en', '!=', 'delta', 'language');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity', 1),
+    ), 'Test with a grouped delta + language meta condition.');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
+      ->fieldDeltaCondition($this->fields[0], 1, '>=', 'delta', 'language')
+      ->fieldLanguageCondition($this->fields[0], 'en', '<>', 'delta', 'language');
+    $this->assertEntityFieldQuery($query, array(), 'Test with a grouped delta + language meta condition (empty result set, delta condition unsatisifed).');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
+      ->fieldDeltaCondition($this->fields[0], 1, '>=', 'delta', 'language')
+      ->fieldLanguageCondition($this->fields[0], 'en', '!=', 'delta', 'language');
+    $this->assertEntityFieldQuery($query, array(), 'Test with a grouped delta + language meta condition (empty result set, delta condition unsatisifed).');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
+      ->fieldDeltaCondition($this->fields[0], 1, '<', 'delta', 'language')
+      ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '<>', 'delta', 'language');
+    $this->assertEntityFieldQuery($query, array(), 'Test with a grouped delta + language meta condition (empty result set, language condition unsatisifed).');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
+      ->fieldDeltaCondition($this->fields[0], 1, '<', 'delta', 'language')
+      ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '!=', 'delta', 'language');
+    $this->assertEntityFieldQuery($query, array(), 'Test with a grouped delta + language meta condition (empty result set, language condition unsatisifed).');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
+      ->fieldDeltaCondition($this->fields[0], 1, '>=', 'delta', 'language')
+      ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '<>', 'delta', 'language');
+    $this->assertEntityFieldQuery($query, array(), 'Test with a grouped delta + language meta condition (empty result set, both conditions unsatisifed).');
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity', '=')
+      ->fieldCondition($this->fields[0], 'value', 0, '=', 'delta', 'language')
+      ->fieldDeltaCondition($this->fields[0], 1, '>=', 'delta', 'language')
+      ->fieldLanguageCondition($this->fields[0], LANGUAGE_NONE, '!=', 'delta', 'language');
+    $this->assertEntityFieldQuery($query, array(), 'Test with a grouped delta + language meta condition (empty result set, both conditions unsatisifed).');
+
+    // Test grouping with another field to ensure that grouping cache is reset
+    // properly.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle', '=')
+      ->fieldCondition($this->fields[1], 'shape', 'circle', '=', 'delta', 'language')
+      ->fieldCondition($this->fields[1], 'color', 'blue', '=', 'delta', 'language')
+      ->fieldDeltaCondition($this->fields[1], 1, '=', 'delta', 'language')
+      ->fieldLanguageCondition($this->fields[1], LANGUAGE_NONE, '=', 'delta', 'language');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle', 5),
+    ), 'Test grouping cache.');
+  }
+
+  /**
+   * Tests the routing feature of EntityFieldQuery.
+   */
+  function testEntityFieldQueryRouting() {
+    // Entity-only query.
+    $query = new EntityFieldQuery();
+    $query->entityCondition('entity_type', 'test_entity_bundle_key');
+    $this->assertIdentical($query->queryCallback(), array($query, 'propertyQuery'), 'Entity-only queries are handled by the propertyQuery handler.');
+
+    // Field-only query.
+    $query = new EntityFieldQuery();
+    $query->fieldCondition($this->fields[0], 'value', '3');
+    $this->assertIdentical($query->queryCallback(), 'field_sql_storage_field_storage_query', 'Pure field queries are handled by the Field storage handler.');
+
+    // Mixed entity and field query.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', '3');
+    $this->assertIdentical($query->queryCallback(), 'field_sql_storage_field_storage_query', 'Mixed queries are handled by the Field storage handler.');
+
+    // Overriding with $query->executeCallback.
+    $query = new EntityFieldQuery();
+    $query->entityCondition('entity_type', 'test_entity_bundle_key');
+    $query->executeCallback = 'field_test_dummy_field_storage_query';
+    $this->assertEntityFieldQuery($query, array(
+      array('user', 1),
+    ), 'executeCallback can override the query handler.');
+
+    // Overriding with $query->executeCallback via hook_entity_query_alter().
+    $query = new EntityFieldQuery();
+    $query->entityCondition('entity_type', 'test_entity_bundle_key');
+    // Add a flag that will be caught by field_test_entity_query_alter().
+    $query->alterMyExecuteCallbackPlease = TRUE;
+    $this->assertEntityFieldQuery($query, array(
+      array('user', 1),
+    ), 'executeCallback can override the query handler when set in a hook_entity_query_alter().');
+
+    // Mixed-storage queries.
+    $query = new EntityFieldQuery();
+    $query
+      ->fieldCondition($this->fields[0], 'value', '3')
+      ->fieldCondition($this->fields[1], 'shape', 'squ', 'STARTS_WITH');
+    // Alter the storage of the field.
+    $query->fields[1]['storage']['module'] = 'dummy_storage';
+    try {
+      $query->queryCallback();
+    }
+    catch (EntityFieldQueryException $exception) {
+      $pass = ($exception->getMessage() == t("Can't handle more than one field storage engine"));
+    }
+    $this->assertTrue($pass, 'Cannot query across field storage engines.');
+  }
+
+  /**
+   * Tests the pager integration of EntityFieldQuery.
+   */
+  function testEntityFieldQueryPager() {
+    // Test pager in propertyQuery
+    $_GET['page'] = '0,1';
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyOrderBy('ftid', 'ASC')
+      ->pager(3, 0);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+    ), 'Test pager integration in propertyQuery: page 1.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyOrderBy('ftid', 'ASC')
+      ->pager(3, 1);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test pager integration in propertyQuery: page 2.', TRUE);
+
+    // Test pager in field storage
+    $_GET['page'] = '0,1';
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->propertyOrderBy('ftid', 'ASC')
+      ->pager(2, 0);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+    ), 'Test pager integration in field storage: page 1.', TRUE);
+
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->propertyOrderBy('ftid', 'ASC')
+      ->pager(2, 1);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+    ), 'Test pager integration in field storage: page 2.', TRUE);
+
+    unset($_GET['page']);
+  }
+
+  /**
+   * Tests disabling the pager in EntityFieldQuery.
+   */
+  function testEntityFieldQueryDisablePager() {
+    // Test enabling a pager and then disabling it.
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->propertyOrderBy('ftid', 'ASC')
+      ->pager(1)
+      ->pager(0);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'All test entities are listed when the pager is enabled and then disabled.', TRUE);
+  }
+
+  /**
+   * Tests the TableSort integration of EntityFieldQuery.
+   */
+  function testEntityFieldQueryTableSort() {
+    // Test TableSort in propertyQuery
+    $_GET['sort'] = 'asc';
+    $_GET['order'] = 'Id';
+    $header = array(
+      'id' => array('data' => 'Id', 'type' => 'property',  'specifier' => 'ftid'),
+      'type' => array('data' => 'Type', 'type' => 'entity', 'specifier' => 'bundle'),
+    );
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->tableSort($header);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test TableSort by property: ftid ASC in propertyQuery.', TRUE);
+
+    $_GET['sort'] = 'desc';
+    $_GET['order'] = 'Id';
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->tableSort($header);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 1),
+    ), 'Test TableSort by property: ftid DESC in propertyQuery.', TRUE);
+
+    $_GET['sort'] = 'asc';
+    $_GET['order'] = 'Type';
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->tableSort($header);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test TableSort by entity: bundle ASC in propertyQuery.', TRUE);
+
+    $_GET['sort'] = 'desc';
+    $_GET['order'] = 'Type';
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->tableSort($header);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+    ), 'Test TableSort by entity: bundle DESC in propertyQuery.', TRUE);
+
+    // Test TableSort in field storage
+    $_GET['sort'] = 'asc';
+    $_GET['order'] = 'Id';
+    $header = array(
+      'id' => array('data' => 'Id', 'type' => 'property',  'specifier' => 'ftid'),
+      'type' => array('data' => 'Type', 'type' => 'entity', 'specifier' => 'bundle'),
+      'field' => array('data' => 'Field', 'type' => 'field', 'specifier' => array('field' => $this->field_names[0], 'column' => 'value')),
+    );
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->tableSort($header);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test TableSort by property: ftid ASC in field storage.', TRUE);
+
+    $_GET['sort'] = 'desc';
+    $_GET['order'] = 'Id';
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->tableSort($header);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 1),
+    ), 'Test TableSort by property: ftid DESC in field storage.', TRUE);
+
+    $_GET['sort'] = 'asc';
+    $_GET['order'] = 'Type';
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->tableSort($header)
+      ->entityOrderBy('entity_id', 'DESC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 5),
+    ), 'Test TableSort by entity: bundle ASC in field storage.', TRUE);
+
+    $_GET['sort'] = 'desc';
+    $_GET['order'] = 'Type';
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->tableSort($header)
+      ->entityOrderBy('entity_id', 'ASC');
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+    ), 'Test TableSort by entity: bundle DESC in field storage.', TRUE);
+
+    $_GET['sort'] = 'asc';
+    $_GET['order'] = 'Field';
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->tableSort($header);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 1),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 6),
+    ), 'Test TableSort by field ASC.', TRUE);
+
+    $_GET['sort'] = 'desc';
+    $_GET['order'] = 'Field';
+    $query = new EntityFieldQuery();
+    $query
+      ->entityCondition('entity_type', 'test_entity_bundle_key')
+      ->fieldCondition($this->fields[0], 'value', 0, '>')
+      ->tableSort($header);
+    $this->assertEntityFieldQuery($query, array(
+      array('test_entity_bundle_key', 6),
+      array('test_entity_bundle_key', 5),
+      array('test_entity_bundle_key', 4),
+      array('test_entity_bundle_key', 3),
+      array('test_entity_bundle_key', 2),
+      array('test_entity_bundle_key', 1),
+    ), 'Test TableSort by field DESC.', TRUE);
+
+    unset($_GET['sort']);
+    unset($_GET['order']);
+  }
+
+  /**
+   * Tests EntityFieldQuery access on non-node entities.
+   */
+  function testEntityFieldQueryAccess() {
+    // Test as a user with ability to bypass node access.
+    $privileged_user = $this->drupalCreateUser(array('bypass node access', 'access content'));
+    $this->drupalLogin($privileged_user);
+    $this->drupalGet('entity-query-access/test/' . $this->fields[0]['field_name']);
+    $this->assertText('Found entity', 'Returned access response with entities.');
+    $this->drupalLogout();
+
+    // Test as a user that does not have ability to bypass node access or view
+    // all nodes.
+    $regular_user = $this->drupalCreateUser(array('access content'));
+    $this->drupalLogin($regular_user);
+    $this->drupalGet('entity-query-access/test/' . $this->fields[0]['field_name']);
+    $this->assertText('Found entity', 'Returned access response with entities.');
+    $this->drupalLogout();
+  }
+
+  /**
+   * Fetches the results of an EntityFieldQuery and compares.
+   *
+   * @param $query
+   *   An EntityFieldQuery to run.
+   * @param $intended_results
+   *   A list of results, every entry is again a list, first being the entity
+   *   type, the second being the entity_id.
+   * @param $message
+   *   The message to be displayed as the result of this test.
+   * @param $ordered
+   *   If FALSE then the result of EntityFieldQuery will match
+   *   $intended_results even if the order is not the same. If TRUE then order
+   *   should match too.
+   */
+  function assertEntityFieldQuery($query, $intended_results, $message, $ordered = FALSE) {
+    $results = array();
+    try {
+      foreach ($query->execute() as $entity_type => $entity_ids) {
+        foreach ($entity_ids as $entity_id => $stub_entity) {
+          $results[] = array($entity_type, $entity_id);
+        }
+      }
+      if (!isset($ordered) || !$ordered) {
+        sort($results);
+        sort($intended_results);
+      }
+      $this->assertEqual($results, $intended_results, $message);
+    }
+    catch (Exception $e) {
+      $this->fail('Exception thrown: '. $e->getMessage());
+    }
+  }
+
+  /**
+   * Tests EFQ table prefixing with multiple conditions and an altered join.
+   *
+   * @see field_test_query_efq_table_prefixing_test_alter()
+   */
+  function testTablePrefixing() {
+    $query = new EntityFieldQuery();
+    $query = $query
+      ->entityCondition('entity_type', 'test_entity')
+      ->entityCondition('bundle', 'test_bundle')
+      ->entityCondition('entity_id', '1')
+      ->addTag('efq_table_prefixing_test');
+
+    $expected = array(array('test_entity', 1));
+
+    $this->assertEntityFieldQuery($query, $expected, 'An EntityFieldQuery returns the expected results when altered with an additional join on the base table.');
+  }
+
+}
diff --git a/htmltest/modules/simpletest/tests/entity_query_access_test.info b/htmltest/modules/simpletest/tests/entity_query_access_test.info
new file mode 100644
index 00000000..5a52e082
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/entity_query_access_test.info
@@ -0,0 +1,12 @@
+name = "Entity query access test"
+description = "Support module for checking entity query results."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/entity_query_access_test.module b/htmltest/modules/simpletest/tests/entity_query_access_test.module
new file mode 100644
index 00000000..53641af5
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/entity_query_access_test.module
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * @file
+ * Helper module for testing EntityFieldQuery access on any type of entity.
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function entity_query_access_test_menu() {
+  $items['entity-query-access/test/%'] = array(
+    'title' => "Retrieve a sample of entity query access data",
+    'page callback' => 'entity_query_access_test_sample_query',
+    'page arguments' => array(2),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  return $items;
+}
+
+/**
+ * Returns the results from an example EntityFieldQuery.
+ */
+function entity_query_access_test_sample_query($field_name) {
+  global $user;
+
+  // Simulate user does not have access to view all nodes.
+  $access = &drupal_static('node_access_view_all_nodes');
+  $access[$user->uid] = FALSE;
+
+  $query = new EntityFieldQuery();
+  $query
+    ->entityCondition('entity_type', 'test_entity_bundle_key')
+    ->fieldCondition($field_name, 'value', 0, '>')
+    ->entityOrderBy('entity_id', 'ASC');
+  $results = array(
+    'items' => array(),
+    'title' => t('EntityFieldQuery results'),
+  );
+  foreach ($query->execute() as $entity_type => $entity_ids) {
+    foreach ($entity_ids as $entity_id => $entity_stub) {
+      $results['items'][] = format_string('Found entity of type @entity_type with id @entity_id', array('@entity_type' => $entity_type, '@entity_id' => $entity_id));
+    }
+  }
+  if (count($results['items']) > 0) {
+    $output = theme('item_list', $results);
+  }
+  else {
+    $output = 'No results found with EntityFieldQuery.';
+  }
+  return $output;
+}
diff --git a/htmltest/modules/simpletest/tests/error.test b/htmltest/modules/simpletest/tests/error.test
new file mode 100644
index 00000000..f946e82f
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/error.test
@@ -0,0 +1,116 @@
+<?php
+
+/**
+ * Tests Drupal error and exception handlers.
+ */
+class DrupalErrorHandlerTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Drupal error handlers',
+      'description' => 'Performs tests on the Drupal error and exception handler.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('error_test');
+  }
+
+  /**
+   * Test the error handler.
+   */
+  function testErrorHandler() {
+    $error_notice = array(
+      '%type' => 'Notice',
+      '!message' => 'Undefined variable: bananas',
+      '%function' => 'error_test_generate_warnings()',
+      '%file' => drupal_realpath('modules/simpletest/tests/error_test.module'),
+    );
+    $error_warning = array(
+      '%type' => 'Warning',
+      '!message' => 'Division by zero',
+      '%function' => 'error_test_generate_warnings()',
+      '%file' => drupal_realpath('modules/simpletest/tests/error_test.module'),
+    );
+    $error_user_notice = array(
+      '%type' => 'User warning',
+      '!message' => 'Drupal is awesome',
+      '%function' => 'error_test_generate_warnings()',
+      '%file' => drupal_realpath('modules/simpletest/tests/error_test.module'),
+    );
+
+    // Set error reporting to collect notices.
+    variable_set('error_level', ERROR_REPORTING_DISPLAY_ALL);
+    $this->drupalGet('error-test/generate-warnings');
+    $this->assertResponse(200, 'Received expected HTTP status code.');
+    $this->assertErrorMessage($error_notice);
+    $this->assertErrorMessage($error_warning);
+    $this->assertErrorMessage($error_user_notice);
+
+    // Set error reporting to not collect notices.
+    variable_set('error_level', ERROR_REPORTING_DISPLAY_SOME);
+    $this->drupalGet('error-test/generate-warnings');
+    $this->assertResponse(200, 'Received expected HTTP status code.');
+    $this->assertNoErrorMessage($error_notice);
+    $this->assertErrorMessage($error_warning);
+    $this->assertErrorMessage($error_user_notice);
+
+    // Set error reporting to not show any errors.
+    variable_set('error_level', ERROR_REPORTING_HIDE);
+    $this->drupalGet('error-test/generate-warnings');
+    $this->assertResponse(200, 'Received expected HTTP status code.');
+    $this->assertNoErrorMessage($error_notice);
+    $this->assertNoErrorMessage($error_warning);
+    $this->assertNoErrorMessage($error_user_notice);
+  }
+
+  /**
+   * Test the exception handler.
+   */
+  function testExceptionHandler() {
+    $error_exception = array(
+      '%type' => 'Exception',
+      '!message' => 'Drupal is awesome',
+      '%function' => 'error_test_trigger_exception()',
+      '%line' => 57,
+      '%file' => drupal_realpath('modules/simpletest/tests/error_test.module'),
+    );
+    $error_pdo_exception = array(
+      '%type' => 'PDOException',
+      '!message' => 'SELECT * FROM bananas_are_awesome',
+      '%function' => 'error_test_trigger_pdo_exception()',
+      '%line' => 65,
+      '%file' => drupal_realpath('modules/simpletest/tests/error_test.module'),
+    );
+
+    $this->drupalGet('error-test/trigger-exception');
+    $this->assertTrue(strpos($this->drupalGetHeader(':status'), '500 Service unavailable (with message)'), 'Received expected HTTP status line.');
+    $this->assertErrorMessage($error_exception);
+
+    $this->drupalGet('error-test/trigger-pdo-exception');
+    $this->assertTrue(strpos($this->drupalGetHeader(':status'), '500 Service unavailable (with message)'), 'Received expected HTTP status line.');
+    // We cannot use assertErrorMessage() since the extact error reported
+    // varies from database to database. Check that the SQL string is displayed.
+    $this->assertText($error_pdo_exception['%type'], format_string('Found %type in error page.', $error_pdo_exception));
+    $this->assertText($error_pdo_exception['!message'], format_string('Found !message in error page.', $error_pdo_exception));
+    $error_details = format_string('in %function (line ', $error_pdo_exception);
+    $this->assertRaw($error_details, format_string("Found '!message' in error page.", array('!message' => $error_details)));
+  }
+
+  /**
+   * Helper function: assert that the error message is found.
+   */
+  function assertErrorMessage(array $error) {
+    $message = t('%type: !message in %function (line ', $error);
+    $this->assertRaw($message, format_string('Found error message: !message.', array('!message' => $message)));
+  }
+
+  /**
+   * Helper function: assert that the error message is not found.
+   */
+  function assertNoErrorMessage(array $error) {
+    $message = t('%type: !message in %function (line ', $error);
+    $this->assertNoRaw($message, format_string('Did not find error message: !message.', array('!message' => $message)));
+  }
+}
+
diff --git a/htmltest/modules/simpletest/tests/error_test.info b/htmltest/modules/simpletest/tests/error_test.info
new file mode 100644
index 00000000..41e92486
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/error_test.info
@@ -0,0 +1,12 @@
+name = "Error test"
+description = "Support module for error and exception testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/error_test.module b/htmltest/modules/simpletest/tests/error_test.module
new file mode 100644
index 00000000..d062cb06
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/error_test.module
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * Implements hook_menu().
+ */
+function error_test_menu() {
+  $items['error-test/generate-warnings'] = array(
+    'title' => 'Generate warnings',
+    'page callback' => 'error_test_generate_warnings',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['error-test/generate-warnings-with-report'] = array(
+    'title' => 'Generate warnings with Simpletest reporting',
+    'page callback' => 'error_test_generate_warnings',
+    'page arguments' => array(TRUE),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['error-test/trigger-exception'] = array(
+    'title' => 'Trigger an exception',
+    'page callback' => 'error_test_trigger_exception',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['error-test/trigger-pdo-exception'] = array(
+    'title' => 'Trigger a PDO exception',
+    'page callback' => 'error_test_trigger_pdo_exception',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  return $items;
+}
+
+/**
+ * Menu callback; generate warnings to test the error handler.
+ */
+function error_test_generate_warnings($collect_errors = FALSE) {
+  // Tell Drupal error reporter to send errors to Simpletest or not.
+  define('SIMPLETEST_COLLECT_ERRORS', $collect_errors);
+  // This will generate a notice.
+  $monkey_love = $bananas;
+  // This will generate a warning.
+  $awesomely_big = 1/0;
+  // This will generate a user error.
+  trigger_error("Drupal is awesome", E_USER_WARNING);
+  return "";
+}
+
+/**
+ * Menu callback; trigger an exception to test the exception handler.
+ */
+function error_test_trigger_exception() {
+  define('SIMPLETEST_COLLECT_ERRORS', FALSE);
+  throw new Exception("Drupal is awesome");
+}
+
+/**
+ * Menu callback; trigger an exception to test the exception handler.
+ */
+function error_test_trigger_pdo_exception() {
+  define('SIMPLETEST_COLLECT_ERRORS', FALSE);
+  db_query('SELECT * FROM bananas_are_awesome');
+}
diff --git a/htmltest/modules/simpletest/tests/file.test b/htmltest/modules/simpletest/tests/file.test
new file mode 100644
index 00000000..20dd2737
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/file.test
@@ -0,0 +1,2782 @@
+<?php
+
+/**
+ *  @file
+ *  This provides SimpleTests for the core file handling functionality.
+ *  These include FileValidateTest and FileSaveTest.
+ */
+
+/**
+ * Helper validator that returns the $errors parameter.
+ */
+function file_test_validator($file, $errors) {
+  return $errors;
+}
+
+/**
+ * Helper function for testing file_scan_directory().
+ *
+ * Each time the function is called the file is stored in a static variable.
+ * When the function is called with no $filepath parameter, the results are
+ * returned.
+ *
+ * @param $filepath
+ *   File path
+ * @return
+ *   If $filepath is NULL, an array of all previous $filepath parameters
+ */
+function file_test_file_scan_callback($filepath = NULL) {
+  $files = &drupal_static(__FUNCTION__, array());
+  if (isset($filepath)) {
+    $files[] = $filepath;
+  }
+  else {
+    return $files;
+  }
+}
+
+/**
+ * Reset static variables used by file_test_file_scan_callback().
+ */
+function file_test_file_scan_callback_reset() {
+  drupal_static_reset('file_test_file_scan_callback');
+}
+
+/**
+ * Base class for file tests that adds some additional file specific
+ * assertions and helper functions.
+ */
+class FileTestCase extends DrupalWebTestCase {
+  /**
+   * Check that two files have the same values for all fields other than the
+   * timestamp.
+   *
+   * @param $before
+   *   File object to compare.
+   * @param $after
+   *   File object to compare.
+   */
+  function assertFileUnchanged($before, $after) {
+    $this->assertEqual($before->fid, $after->fid, format_string('File id is the same: %file1 == %file2.', array('%file1' => $before->fid, '%file2' => $after->fid)), 'File unchanged');
+    $this->assertEqual($before->uid, $after->uid, format_string('File owner is the same: %file1 == %file2.', array('%file1' => $before->uid, '%file2' => $after->uid)), 'File unchanged');
+    $this->assertEqual($before->filename, $after->filename, format_string('File name is the same: %file1 == %file2.', array('%file1' => $before->filename, '%file2' => $after->filename)), 'File unchanged');
+    $this->assertEqual($before->uri, $after->uri, format_string('File path is the same: %file1 == %file2.', array('%file1' => $before->uri, '%file2' => $after->uri)), 'File unchanged');
+    $this->assertEqual($before->filemime, $after->filemime, format_string('File MIME type is the same: %file1 == %file2.', array('%file1' => $before->filemime, '%file2' => $after->filemime)), 'File unchanged');
+    $this->assertEqual($before->filesize, $after->filesize, format_string('File size is the same: %file1 == %file2.', array('%file1' => $before->filesize, '%file2' => $after->filesize)), 'File unchanged');
+    $this->assertEqual($before->status, $after->status, format_string('File status is the same: %file1 == %file2.', array('%file1' => $before->status, '%file2' => $after->status)), 'File unchanged');
+  }
+
+  /**
+   * Check that two files are not the same by comparing the fid and filepath.
+   *
+   * @param $file1
+   *   File object to compare.
+   * @param $file2
+   *   File object to compare.
+   */
+  function assertDifferentFile($file1, $file2) {
+    $this->assertNotEqual($file1->fid, $file2->fid, format_string('Files have different ids: %file1 != %file2.', array('%file1' => $file1->fid, '%file2' => $file2->fid)), 'Different file');
+    $this->assertNotEqual($file1->uri, $file2->uri, format_string('Files have different paths: %file1 != %file2.', array('%file1' => $file1->uri, '%file2' => $file2->uri)), 'Different file');
+  }
+
+  /**
+   * Check that two files are the same by comparing the fid and filepath.
+   *
+   * @param $file1
+   *   File object to compare.
+   * @param $file2
+   *   File object to compare.
+   */
+  function assertSameFile($file1, $file2) {
+    $this->assertEqual($file1->fid, $file2->fid, format_string('Files have the same ids: %file1 == %file2.', array('%file1' => $file1->fid, '%file2-fid' => $file2->fid)), 'Same file');
+    $this->assertEqual($file1->uri, $file2->uri, format_string('Files have the same path: %file1 == %file2.', array('%file1' => $file1->uri, '%file2' => $file2->uri)), 'Same file');
+  }
+
+  /**
+   * Helper function to test the permissions of a file.
+   *
+   * @param $filepath
+   *   String file path.
+   * @param $expected_mode
+   *   Octal integer like 0664 or 0777.
+   * @param $message
+   *   Optional message.
+   */
+  function assertFilePermissions($filepath, $expected_mode, $message = NULL) {
+    // Clear out PHP's file stat cache to be sure we see the current value.
+    clearstatcache();
+
+    // Mask out all but the last three octets.
+    $actual_mode = fileperms($filepath) & 0777;
+
+    // PHP on Windows has limited support for file permissions. Usually each of
+    // "user", "group" and "other" use one octal digit (3 bits) to represent the
+    // read/write/execute bits. On Windows, chmod() ignores the "group" and
+    // "other" bits, and fileperms() returns the "user" bits in all three
+    // positions. $expected_mode is updated to reflect this.
+    if (substr(PHP_OS, 0, 3) == 'WIN') {
+      // Reset the "group" and "other" bits.
+      $expected_mode = $expected_mode & 0700;
+      // Shift the "user" bits to the "group" and "other" positions also.
+      $expected_mode = $expected_mode | $expected_mode >> 3 | $expected_mode >> 6;
+    }
+
+    if (!isset($message)) {
+      $message = t('Expected file permission to be %expected, actually were %actual.', array('%actual' => decoct($actual_mode), '%expected' => decoct($expected_mode)));
+    }
+    $this->assertEqual($actual_mode, $expected_mode, $message);
+  }
+
+  /**
+   * Helper function to test the permissions of a directory.
+   *
+   * @param $directory
+   *   String directory path.
+   * @param $expected_mode
+   *   Octal integer like 0664 or 0777.
+   * @param $message
+   *   Optional message.
+   */
+  function assertDirectoryPermissions($directory, $expected_mode, $message = NULL) {
+    // Clear out PHP's file stat cache to be sure we see the current value.
+    clearstatcache();
+
+    // Mask out all but the last three octets.
+    $actual_mode = fileperms($directory) & 0777;
+
+    // PHP on Windows has limited support for file permissions. Usually each of
+    // "user", "group" and "other" use one octal digit (3 bits) to represent the
+    // read/write/execute bits. On Windows, chmod() ignores the "group" and
+    // "other" bits, and fileperms() returns the "user" bits in all three
+    // positions. $expected_mode is updated to reflect this.
+    if (substr(PHP_OS, 0, 3) == 'WIN') {
+      // Reset the "group" and "other" bits.
+      $expected_mode = $expected_mode & 0700;
+      // Shift the "user" bits to the "group" and "other" positions also.
+      $expected_mode = $expected_mode | $expected_mode >> 3 | $expected_mode >> 6;
+    }
+
+    if (!isset($message)) {
+      $message = t('Expected directory permission to be %expected, actually were %actual.', array('%actual' => decoct($actual_mode), '%expected' => decoct($expected_mode)));
+    }
+    $this->assertEqual($actual_mode, $expected_mode, $message);
+  }
+
+  /**
+   * Create a directory and assert it exists.
+   *
+   * @param $path
+   *   Optional string with a directory path. If none is provided, a random
+   *   name in the site's files directory will be used.
+   * @return
+   *   The path to the directory.
+   */
+  function createDirectory($path = NULL) {
+    // A directory to operate on.
+    if (!isset($path)) {
+      $path = file_default_scheme() . '://' . $this->randomName();
+    }
+    $this->assertTrue(drupal_mkdir($path) && is_dir($path), 'Directory was created successfully.');
+    return $path;
+  }
+
+  /**
+   * Create a file and save it to the files table and assert that it occurs
+   * correctly.
+   *
+   * @param $filepath
+   *   Optional string specifying the file path. If none is provided then a
+   *   randomly named file will be created in the site's files directory.
+   * @param $contents
+   *   Optional contents to save into the file. If a NULL value is provided an
+   *   arbitrary string will be used.
+   * @param $scheme
+   *   Optional string indicating the stream scheme to use. Drupal core includes
+   *   public, private, and temporary. The public wrapper is the default.
+   * @return
+   *   File object.
+   */
+  function createFile($filepath = NULL, $contents = NULL, $scheme = NULL) {
+    if (!isset($filepath)) {
+      // Prefix with non-latin characters to ensure that all file-related
+      // tests work with international filenames.
+      $filepath = 'Файл для тестирования ' . $this->randomName();
+    }
+    if (!isset($scheme)) {
+      $scheme = file_default_scheme();
+    }
+    $filepath = $scheme . '://' . $filepath;
+
+    if (!isset($contents)) {
+      $contents = "file_put_contents() doesn't seem to appreciate empty strings so let's put in some data.";
+    }
+
+    file_put_contents($filepath, $contents);
+    $this->assertTrue(is_file($filepath), 'The test file exists on the disk.', 'Create test file');
+
+    $file = new stdClass();
+    $file->uri = $filepath;
+    $file->filename = drupal_basename($file->uri);
+    $file->filemime = 'text/plain';
+    $file->uid = 1;
+    $file->timestamp = REQUEST_TIME;
+    $file->filesize = filesize($file->uri);
+    $file->status = 0;
+    // Write the record directly rather than calling file_save() so we don't
+    // invoke the hooks.
+    $this->assertNotIdentical(drupal_write_record('file_managed', $file), FALSE, 'The file was added to the database.', 'Create test file');
+
+    return $file;
+  }
+}
+
+/**
+ * Base class for file tests that use the file_test module to test uploads and
+ * hooks.
+ */
+class FileHookTestCase extends FileTestCase {
+  function setUp() {
+    // Install file_test module
+    parent::setUp('file_test');
+    // Clear out any hook calls.
+    file_test_reset();
+  }
+
+  /**
+   * Assert that all of the specified hook_file_* hooks were called once, other
+   * values result in failure.
+   *
+   * @param $expected
+   *   Array with string containing with the hook name, e.g. 'load', 'save',
+   *   'insert', etc.
+   */
+  function assertFileHooksCalled($expected) {
+    // Determine which hooks were called.
+    $actual = array_keys(array_filter(file_test_get_all_calls()));
+
+    // Determine if there were any expected that were not called.
+    $uncalled = array_diff($expected, $actual);
+    if (count($uncalled)) {
+      $this->assertTrue(FALSE, format_string('Expected hooks %expected to be called but %uncalled was not called.', array('%expected' => implode(', ', $expected), '%uncalled' => implode(', ', $uncalled))));
+    }
+    else {
+      $this->assertTrue(TRUE, format_string('All the expected hooks were called: %expected', array('%expected' => empty($expected) ? t('(none)') : implode(', ', $expected))));
+    }
+
+    // Determine if there were any unexpected calls.
+    $unexpected = array_diff($actual, $expected);
+    if (count($unexpected)) {
+      $this->assertTrue(FALSE, format_string('Unexpected hooks were called: %unexpected.', array('%unexpected' => empty($unexpected) ? t('(none)') : implode(', ', $unexpected))));
+    }
+    else {
+      $this->assertTrue(TRUE, 'No unexpected hooks were called.');
+    }
+  }
+
+  /**
+   * Assert that a hook_file_* hook was called a certain number of times.
+   *
+   * @param $hook
+   *   String with the hook name, e.g. 'load', 'save', 'insert', etc.
+   * @param $expected_count
+   *   Optional integer count.
+   * @param $message
+   *   Optional translated string message.
+   */
+  function assertFileHookCalled($hook, $expected_count = 1, $message = NULL) {
+    $actual_count = count(file_test_get_calls($hook));
+
+    if (!isset($message)) {
+      if ($actual_count == $expected_count) {
+        $message = format_string('hook_file_@name was called correctly.', array('@name' => $hook));
+      }
+      elseif ($expected_count == 0) {
+        $message = format_plural($actual_count, 'hook_file_@name was not expected to be called but was actually called once.', 'hook_file_@name was not expected to be called but was actually called @count times.', array('@name' => $hook, '@count' => $actual_count));
+      }
+      else {
+        $message = format_string('hook_file_@name was expected to be called %expected times but was called %actual times.', array('@name' => $hook, '%expected' => $expected_count, '%actual' => $actual_count));
+      }
+    }
+    $this->assertEqual($actual_count, $expected_count, $message);
+  }
+}
+
+
+/**
+ *  This will run tests against the file_space_used() function.
+ */
+class FileSpaceUsedTest extends FileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File space used tests',
+      'description' => 'Tests the file_space_used() function.',
+      'group' => 'File API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Create records for a couple of users with different sizes.
+    $file = array('uid' => 2, 'uri' => 'public://example1.txt', 'filesize' => 50, 'status' => FILE_STATUS_PERMANENT);
+    drupal_write_record('file_managed', $file);
+    $file = array('uid' => 2, 'uri' => 'public://example2.txt', 'filesize' => 20, 'status' => FILE_STATUS_PERMANENT);
+    drupal_write_record('file_managed', $file);
+    $file = array('uid' => 3, 'uri' => 'public://example3.txt', 'filesize' => 100, 'status' => FILE_STATUS_PERMANENT);
+    drupal_write_record('file_managed', $file);
+    $file = array('uid' => 3, 'uri' => 'public://example4.txt', 'filesize' => 200, 'status' => FILE_STATUS_PERMANENT);
+    drupal_write_record('file_managed', $file);
+
+    // Now create some non-permanent files.
+    $file = array('uid' => 2, 'uri' => 'public://example5.txt', 'filesize' => 1, 'status' => 0);
+    drupal_write_record('file_managed', $file);
+    $file = array('uid' => 3, 'uri' => 'public://example6.txt', 'filesize' => 3, 'status' => 0);
+    drupal_write_record('file_managed', $file);
+  }
+
+  /**
+   * Test different users with the default status.
+   */
+  function testFileSpaceUsed() {
+    // Test different users with default status.
+    $this->assertEqual(file_space_used(2), 70);
+    $this->assertEqual(file_space_used(3), 300);
+    $this->assertEqual(file_space_used(), 370);
+
+    // Test the status fields
+    $this->assertEqual(file_space_used(NULL, 0), 4);
+    $this->assertEqual(file_space_used(NULL, FILE_STATUS_PERMANENT), 370);
+
+    // Test both the user and status.
+    $this->assertEqual(file_space_used(1, 0), 0);
+    $this->assertEqual(file_space_used(1, FILE_STATUS_PERMANENT), 0);
+    $this->assertEqual(file_space_used(2, 0), 1);
+    $this->assertEqual(file_space_used(2, FILE_STATUS_PERMANENT), 70);
+    $this->assertEqual(file_space_used(3, 0), 3);
+    $this->assertEqual(file_space_used(3, FILE_STATUS_PERMANENT), 300);
+  }
+}
+
+/**
+ *  This will run tests against the file validation functions (file_validate_*).
+ */
+class FileValidatorTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File validator tests',
+      'description' => 'Tests the functions used to validate uploaded files.',
+      'group' => 'File API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    $this->image = new stdClass();
+    $this->image->uri = 'misc/druplicon.png';
+    $this->image->filename = drupal_basename($this->image->uri);
+
+    $this->non_image = new stdClass();
+    $this->non_image->uri = 'misc/jquery.js';
+    $this->non_image->filename = drupal_basename($this->non_image->uri);
+  }
+
+  /**
+   * Test the file_validate_extensions() function.
+   */
+  function testFileValidateExtensions() {
+    $file = new stdClass();
+    $file->filename = 'asdf.txt';
+    $errors = file_validate_extensions($file, 'asdf txt pork');
+    $this->assertEqual(count($errors), 0, 'Valid extension accepted.', 'File');
+
+    $file->filename = 'asdf.txt';
+    $errors = file_validate_extensions($file, 'exe png');
+    $this->assertEqual(count($errors), 1, 'Invalid extension blocked.', 'File');
+  }
+
+  /**
+   *  This ensures a specific file is actually an image.
+   */
+  function testFileValidateIsImage() {
+    $this->assertTrue(file_exists($this->image->uri), 'The image being tested exists.', 'File');
+    $errors = file_validate_is_image($this->image);
+    $this->assertEqual(count($errors), 0, 'No error reported for our image file.', 'File');
+
+    $this->assertTrue(file_exists($this->non_image->uri), 'The non-image being tested exists.', 'File');
+    $errors = file_validate_is_image($this->non_image);
+    $this->assertEqual(count($errors), 1, 'An error reported for our non-image file.', 'File');
+  }
+
+  /**
+   *  This ensures the resolution of a specific file is within bounds.
+   *  The image will be resized if it's too large.
+   */
+  function testFileValidateImageResolution() {
+    // Non-images.
+    $errors = file_validate_image_resolution($this->non_image);
+    $this->assertEqual(count($errors), 0, 'Should not get any errors for a non-image file.', 'File');
+    $errors = file_validate_image_resolution($this->non_image, '50x50', '100x100');
+    $this->assertEqual(count($errors), 0, 'Do not check the resolution on non files.', 'File');
+
+    // Minimum size.
+    $errors = file_validate_image_resolution($this->image);
+    $this->assertEqual(count($errors), 0, 'No errors for an image when there is no minimum or maximum resolution.', 'File');
+    $errors = file_validate_image_resolution($this->image, 0, '200x1');
+    $this->assertEqual(count($errors), 1, 'Got an error for an image that was not wide enough.', 'File');
+    $errors = file_validate_image_resolution($this->image, 0, '1x200');
+    $this->assertEqual(count($errors), 1, 'Got an error for an image that was not tall enough.', 'File');
+    $errors = file_validate_image_resolution($this->image, 0, '200x200');
+    $this->assertEqual(count($errors), 1, 'Small images report an error.', 'File');
+
+    // Maximum size.
+    if (image_get_toolkit()) {
+      // Copy the image so that the original doesn't get resized.
+      copy('misc/druplicon.png', 'temporary://druplicon.png');
+      $this->image->uri = 'temporary://druplicon.png';
+
+      $errors = file_validate_image_resolution($this->image, '10x5');
+      $this->assertEqual(count($errors), 0, 'No errors should be reported when an oversized image can be scaled down.', 'File');
+
+      $info = image_get_info($this->image->uri);
+      $this->assertTrue($info['width'] <= 10, 'Image scaled to correct width.', 'File');
+      $this->assertTrue($info['height'] <= 5, 'Image scaled to correct height.', 'File');
+
+      drupal_unlink('temporary://druplicon.png');
+    }
+    else {
+      // TODO: should check that the error is returned if no toolkit is available.
+      $errors = file_validate_image_resolution($this->image, '5x10');
+      $this->assertEqual(count($errors), 1, 'Oversize images that cannot be scaled get an error.', 'File');
+    }
+  }
+
+  /**
+   *  This will ensure the filename length is valid.
+   */
+  function testFileValidateNameLength() {
+    // Create a new file object.
+    $file = new stdClass();
+
+    // Add a filename with an allowed length and test it.
+    $file->filename = str_repeat('x', 240);
+    $this->assertEqual(strlen($file->filename), 240);
+    $errors = file_validate_name_length($file);
+    $this->assertEqual(count($errors), 0, 'No errors reported for 240 length filename.', 'File');
+
+    // Add a filename with a length too long and test it.
+    $file->filename = str_repeat('x', 241);
+    $errors = file_validate_name_length($file);
+    $this->assertEqual(count($errors), 1, 'An error reported for 241 length filename.', 'File');
+
+    // Add a filename with an empty string and test it.
+    $file->filename = '';
+    $errors = file_validate_name_length($file);
+    $this->assertEqual(count($errors), 1, 'An error reported for 0 length filename.', 'File');
+  }
+
+
+  /**
+   * Test file_validate_size().
+   */
+  function testFileValidateSize() {
+    global $user;
+    $original_user = $user;
+    drupal_save_session(FALSE);
+
+    // Run these test as uid = 1.
+    $user = user_load(1);
+
+    $file = new stdClass();
+    $file->filesize = 999999;
+    $errors = file_validate_size($file, 1, 1);
+    $this->assertEqual(count($errors), 0, 'No size limits enforced on uid=1.', 'File');
+
+    // Run these tests as a regular user.
+    $user = $this->drupalCreateUser();
+
+    // Create a file with a size of 1000 bytes, and quotas of only 1 byte.
+    $file = new stdClass();
+    $file->filesize = 1000;
+    $errors = file_validate_size($file, 0, 0);
+    $this->assertEqual(count($errors), 0, 'No limits means no errors.', 'File');
+    $errors = file_validate_size($file, 1, 0);
+    $this->assertEqual(count($errors), 1, 'Error for the file being over the limit.', 'File');
+    $errors = file_validate_size($file, 0, 1);
+    $this->assertEqual(count($errors), 1, 'Error for the user being over their limit.', 'File');
+    $errors = file_validate_size($file, 1, 1);
+    $this->assertEqual(count($errors), 2, 'Errors for both the file and their limit.', 'File');
+
+    $user = $original_user;
+    drupal_save_session(TRUE);
+  }
+}
+
+
+
+/**
+ *  Tests the file_unmanaged_save_data() function.
+ */
+class FileUnmanagedSaveDataTest extends FileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Unmanaged file save data',
+      'description' => 'Tests the unmanaged file save data function.',
+      'group' => 'File API',
+    );
+  }
+
+  /**
+   * Test the file_unmanaged_save_data() function.
+   */
+  function testFileSaveData() {
+    $contents = $this->randomName(8);
+
+    // No filename.
+    $filepath = file_unmanaged_save_data($contents);
+    $this->assertTrue($filepath, 'Unnamed file saved correctly.');
+    $this->assertEqual(file_uri_scheme($filepath), file_default_scheme(), "File was placed in Drupal's files directory.");
+    $this->assertEqual($contents, file_get_contents($filepath), 'Contents of the file are correct.');
+
+    // Provide a filename.
+    $filepath = file_unmanaged_save_data($contents, 'public://asdf.txt', FILE_EXISTS_REPLACE);
+    $this->assertTrue($filepath, 'Unnamed file saved correctly.');
+    $this->assertEqual('asdf.txt', drupal_basename($filepath), 'File was named correctly.');
+    $this->assertEqual($contents, file_get_contents($filepath), 'Contents of the file are correct.');
+    $this->assertFilePermissions($filepath, variable_get('file_chmod_file', 0664));
+  }
+}
+
+/**
+ *  Tests the file_unmanaged_save_data() function on remote filesystems.
+ */
+class RemoteFileUnmanagedSaveDataTest extends FileUnmanagedSaveDataTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
+
+/**
+ * Test the file_save_upload() function.
+ */
+class FileSaveUploadTest extends FileHookTestCase {
+  /**
+   * An image file path for uploading.
+   */
+  protected $image;
+
+  /**
+   * A PHP file path for upload security testing.
+   */
+  protected $phpfile;
+
+  /**
+   * The largest file id when the test starts.
+   */
+  protected $maxFidBefore;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'File uploading',
+      'description' => 'Tests the file uploading functions.',
+      'group' => 'File API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $account = $this->drupalCreateUser(array('access content'));
+    $this->drupalLogin($account);
+
+    $image_files = $this->drupalGetTestFiles('image');
+    $this->image = current($image_files);
+
+    list(, $this->image_extension) = explode('.', $this->image->filename);
+    $this->assertTrue(is_file($this->image->uri), "The image file we're going to upload exists.");
+
+    $this->phpfile = current($this->drupalGetTestFiles('php'));
+    $this->assertTrue(is_file($this->phpfile->uri), "The PHP file we're going to upload exists.");
+
+    $this->maxFidBefore = db_query('SELECT MAX(fid) AS fid FROM {file_managed}')->fetchField();
+
+    // Upload with replace to guarantee there's something there.
+    $edit = array(
+      'file_test_replace' => FILE_EXISTS_REPLACE,
+      'files[file_test_upload]' => drupal_realpath($this->image->uri),
+    );
+    $this->drupalPost('file-test/upload', $edit, t('Submit'));
+    $this->assertResponse(200, 'Received a 200 response for posted test file.');
+    $this->assertRaw(t('You WIN!'), 'Found the success message.');
+
+    // Check that the correct hooks were called then clean out the hook
+    // counters.
+    $this->assertFileHooksCalled(array('validate', 'insert'));
+    file_test_reset();
+  }
+
+  /**
+   * Test the file_save_upload() function.
+   */
+  function testNormal() {
+    $max_fid_after = db_query('SELECT MAX(fid) AS fid FROM {file_managed}')->fetchField();
+    $this->assertTrue($max_fid_after > $this->maxFidBefore, 'A new file was created.');
+    $file1 = file_load($max_fid_after);
+    $this->assertTrue($file1, 'Loaded the file.');
+    // MIME type of the uploaded image may be either image/jpeg or image/png.
+    $this->assertEqual(substr($file1->filemime, 0, 5), 'image', 'A MIME type was set.');
+
+    // Reset the hook counters to get rid of the 'load' we just called.
+    file_test_reset();
+
+    // Upload a second file.
+    $max_fid_before = db_query('SELECT MAX(fid) AS fid FROM {file_managed}')->fetchField();
+    $image2 = current($this->drupalGetTestFiles('image'));
+    $edit = array('files[file_test_upload]' => drupal_realpath($image2->uri));
+    $this->drupalPost('file-test/upload', $edit, t('Submit'));
+    $this->assertResponse(200, 'Received a 200 response for posted test file.');
+    $this->assertRaw(t('You WIN!'));
+    $max_fid_after = db_query('SELECT MAX(fid) AS fid FROM {file_managed}')->fetchField();
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('validate', 'insert'));
+
+    $file2 = file_load($max_fid_after);
+    $this->assertTrue($file2);
+    // MIME type of the uploaded image may be either image/jpeg or image/png.
+    $this->assertEqual(substr($file2->filemime, 0, 5), 'image', 'A MIME type was set.');
+
+    // Load both files using file_load_multiple().
+    $files = file_load_multiple(array($file1->fid, $file2->fid));
+    $this->assertTrue(isset($files[$file1->fid]), 'File was loaded successfully');
+    $this->assertTrue(isset($files[$file2->fid]), 'File was loaded successfully');
+
+    // Upload a third file to a subdirectory.
+    $image3 = current($this->drupalGetTestFiles('image'));
+    $image3_realpath = drupal_realpath($image3->uri);
+    $dir = $this->randomName();
+    $edit = array(
+      'files[file_test_upload]' => $image3_realpath,
+      'file_subdir' => $dir,
+    );
+    $this->drupalPost('file-test/upload', $edit, t('Submit'));
+    $this->assertResponse(200, 'Received a 200 response for posted test file.');
+    $this->assertRaw(t('You WIN!'));
+    $this->assertTrue(is_file('temporary://' . $dir . '/' . trim(drupal_basename($image3_realpath))));
+
+    // Check that file_load_multiple() with no arguments returns FALSE.
+    $this->assertFalse(file_load_multiple(), 'No files were loaded.');
+  }
+
+  /**
+   * Test extension handling.
+   */
+  function testHandleExtension() {
+    // The file being tested is a .gif which is in the default safe list
+    // of extensions to allow when the extension validator isn't used. This is
+    // implicitly tested at the testNormal() test. Here we tell
+    // file_save_upload() to only allow ".foo".
+    $extensions = 'foo';
+    $edit = array(
+      'file_test_replace' => FILE_EXISTS_REPLACE,
+      'files[file_test_upload]' => drupal_realpath($this->image->uri),
+      'extensions' => $extensions,
+    );
+
+    $this->drupalPost('file-test/upload', $edit, t('Submit'));
+    $this->assertResponse(200, 'Received a 200 response for posted test file.');
+    $message = t('Only files with the following extensions are allowed:') . ' <em class="placeholder">' . $extensions . '</em>';
+    $this->assertRaw($message, 'Cannot upload a disallowed extension');
+    $this->assertRaw(t('Epic upload FAIL!'), 'Found the failure message.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('validate'));
+
+    // Reset the hook counters.
+    file_test_reset();
+
+    $extensions = 'foo ' . $this->image_extension;
+    // Now tell file_save_upload() to allow the extension of our test image.
+    $edit = array(
+      'file_test_replace' => FILE_EXISTS_REPLACE,
+      'files[file_test_upload]' => drupal_realpath($this->image->uri),
+      'extensions' => $extensions,
+    );
+
+    $this->drupalPost('file-test/upload', $edit, t('Submit'));
+    $this->assertResponse(200, 'Received a 200 response for posted test file.');
+    $this->assertNoRaw(t('Only files with the following extensions are allowed:'), 'Can upload an allowed extension.');
+    $this->assertRaw(t('You WIN!'), 'Found the success message.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('validate', 'load', 'update'));
+
+    // Reset the hook counters.
+    file_test_reset();
+
+    // Now tell file_save_upload() to allow any extension.
+    $edit = array(
+      'file_test_replace' => FILE_EXISTS_REPLACE,
+      'files[file_test_upload]' => drupal_realpath($this->image->uri),
+      'allow_all_extensions' => TRUE,
+    );
+    $this->drupalPost('file-test/upload', $edit, t('Submit'));
+    $this->assertResponse(200, 'Received a 200 response for posted test file.');
+    $this->assertNoRaw(t('Only files with the following extensions are allowed:'), 'Can upload any extension.');
+    $this->assertRaw(t('You WIN!'), 'Found the success message.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('validate', 'load', 'update'));
+  }
+
+  /**
+   * Test dangerous file handling.
+   */
+  function testHandleDangerousFile() {
+    // Allow the .php extension and make sure it gets renamed to .txt for
+    // safety. Also check to make sure its MIME type was changed.
+    $edit = array(
+      'file_test_replace' => FILE_EXISTS_REPLACE,
+      'files[file_test_upload]' => drupal_realpath($this->phpfile->uri),
+      'is_image_file' => FALSE,
+      'extensions' => 'php',
+    );
+
+    $this->drupalPost('file-test/upload', $edit, t('Submit'));
+    $this->assertResponse(200, 'Received a 200 response for posted test file.');
+    $message = t('For security reasons, your upload has been renamed to') . ' <em class="placeholder">' . $this->phpfile->filename . '.txt' . '</em>';
+    $this->assertRaw($message, 'Dangerous file was renamed.');
+    $this->assertRaw(t('File MIME type is text/plain.'), "Dangerous file's MIME type was changed.");
+    $this->assertRaw(t('You WIN!'), 'Found the success message.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('validate', 'insert'));
+
+    // Ensure dangerous files are not renamed when insecure uploads is TRUE.
+    // Turn on insecure uploads.
+    variable_set('allow_insecure_uploads', 1);
+    // Reset the hook counters.
+    file_test_reset();
+
+    $this->drupalPost('file-test/upload', $edit, t('Submit'));
+    $this->assertResponse(200, 'Received a 200 response for posted test file.');
+    $this->assertNoRaw(t('For security reasons, your upload has been renamed'), 'Found no security message.');
+    $this->assertRaw(t('File name is !filename', array('!filename' => $this->phpfile->filename)), 'Dangerous file was not renamed when insecure uploads is TRUE.');
+    $this->assertRaw(t('You WIN!'), 'Found the success message.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('validate', 'insert'));
+
+    // Turn off insecure uploads.
+    variable_set('allow_insecure_uploads', 0);
+  }
+
+  /**
+   * Test file munge handling.
+   */
+  function testHandleFileMunge() {
+    // Ensure insecure uploads are disabled for this test.
+    variable_set('allow_insecure_uploads', 0);
+    $this->image = file_move($this->image, $this->image->uri . '.foo.' . $this->image_extension);
+
+    // Reset the hook counters to get rid of the 'move' we just called.
+    file_test_reset();
+
+    $extensions = $this->image_extension;
+    $edit = array(
+      'files[file_test_upload]' => drupal_realpath($this->image->uri),
+      'extensions' => $extensions,
+    );
+
+    $munged_filename = $this->image->filename;
+    $munged_filename = substr($munged_filename, 0, strrpos($munged_filename, '.'));
+    $munged_filename .= '_.' . $this->image_extension;
+
+    $this->drupalPost('file-test/upload', $edit, t('Submit'));
+    $this->assertResponse(200, 'Received a 200 response for posted test file.');
+    $this->assertRaw(t('For security reasons, your upload has been renamed'), 'Found security message.');
+    $this->assertRaw(t('File name is !filename', array('!filename' => $munged_filename)), 'File was successfully munged.');
+    $this->assertRaw(t('You WIN!'), 'Found the success message.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('validate', 'insert'));
+
+    // Ensure we don't munge files if we're allowing any extension.
+    // Reset the hook counters.
+    file_test_reset();
+
+    $edit = array(
+      'files[file_test_upload]' => drupal_realpath($this->image->uri),
+      'allow_all_extensions' => TRUE,
+    );
+
+    $this->drupalPost('file-test/upload', $edit, t('Submit'));
+    $this->assertResponse(200, 'Received a 200 response for posted test file.');
+    $this->assertNoRaw(t('For security reasons, your upload has been renamed'), 'Found no security message.');
+    $this->assertRaw(t('File name is !filename', array('!filename' => $this->image->filename)), 'File was not munged when allowing any extension.');
+    $this->assertRaw(t('You WIN!'), 'Found the success message.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('validate', 'insert'));
+  }
+
+  /**
+   * Test renaming when uploading over a file that already exists.
+   */
+  function testExistingRename() {
+    $edit = array(
+      'file_test_replace' => FILE_EXISTS_RENAME,
+      'files[file_test_upload]' => drupal_realpath($this->image->uri)
+    );
+    $this->drupalPost('file-test/upload', $edit, t('Submit'));
+    $this->assertResponse(200, 'Received a 200 response for posted test file.');
+    $this->assertRaw(t('You WIN!'), 'Found the success message.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('validate', 'insert'));
+  }
+
+  /**
+   * Test replacement when uploading over a file that already exists.
+   */
+  function testExistingReplace() {
+    $edit = array(
+      'file_test_replace' => FILE_EXISTS_REPLACE,
+      'files[file_test_upload]' => drupal_realpath($this->image->uri)
+    );
+    $this->drupalPost('file-test/upload', $edit, t('Submit'));
+    $this->assertResponse(200, 'Received a 200 response for posted test file.');
+    $this->assertRaw(t('You WIN!'), 'Found the success message.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('validate', 'load', 'update'));
+  }
+
+  /**
+   * Test for failure when uploading over a file that already exists.
+   */
+  function testExistingError() {
+    $edit = array(
+      'file_test_replace' => FILE_EXISTS_ERROR,
+      'files[file_test_upload]' => drupal_realpath($this->image->uri)
+    );
+    $this->drupalPost('file-test/upload', $edit, t('Submit'));
+    $this->assertResponse(200, 'Received a 200 response for posted test file.');
+    $this->assertRaw(t('Epic upload FAIL!'), 'Found the failure message.');
+
+    // Check that the no hooks were called while failing.
+    $this->assertFileHooksCalled(array());
+  }
+
+  /**
+   * Test for no failures when not uploading a file.
+   */
+  function testNoUpload() {
+    $this->drupalPost('file-test/upload', array(), t('Submit'));
+    $this->assertNoRaw(t('Epic upload FAIL!'), 'Failure message not found.');
+  }
+}
+
+/**
+ * Test the file_save_upload() function on remote filesystems.
+ */
+class RemoteFileSaveUploadTest extends FileSaveUploadTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
+
+/**
+ * Directory related tests.
+ */
+class FileDirectoryTest extends FileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File paths and directories',
+      'description' => 'Tests operations dealing with directories.',
+      'group' => 'File API',
+    );
+  }
+
+  /**
+   * Test directory handling functions.
+   */
+  function testFileCheckDirectoryHandling() {
+    // A directory to operate on.
+    $directory = file_default_scheme() . '://' . $this->randomName() . '/' . $this->randomName();
+    $this->assertFalse(is_dir($directory), 'Directory does not exist prior to testing.');
+
+    // Non-existent directory.
+    $this->assertFalse(file_prepare_directory($directory, 0), 'Error reported for non-existing directory.', 'File');
+
+    // Make a directory.
+    $this->assertTrue(file_prepare_directory($directory, FILE_CREATE_DIRECTORY), 'No error reported when creating a new directory.', 'File');
+
+    // Make sure directory actually exists.
+    $this->assertTrue(is_dir($directory), 'Directory actually exists.', 'File');
+
+    if (substr(PHP_OS, 0, 3) != 'WIN') {
+      // PHP on Windows doesn't support any kind of useful read-only mode for
+      // directories. When executing a chmod() on a directory, PHP only sets the
+      // read-only flag, which doesn't prevent files to actually be written
+      // in the directory on any recent version of Windows.
+
+      // Make directory read only.
+      @drupal_chmod($directory, 0444);
+      $this->assertFalse(file_prepare_directory($directory, 0), 'Error reported for a non-writeable directory.', 'File');
+
+      // Test directory permission modification.
+      $this->assertTrue(file_prepare_directory($directory, FILE_MODIFY_PERMISSIONS), 'No error reported when making directory writeable.', 'File');
+    }
+
+    // Test that the directory has the correct permissions.
+    $this->assertDirectoryPermissions($directory, variable_get('file_chmod_directory', 0775));
+
+    // Remove .htaccess file to then test that it gets re-created.
+    @drupal_unlink(file_default_scheme() . '://.htaccess');
+    $this->assertFalse(is_file(file_default_scheme() . '://.htaccess'), 'Successfully removed the .htaccess file in the files directory.', 'File');
+    file_ensure_htaccess();
+    $this->assertTrue(is_file(file_default_scheme() . '://.htaccess'), 'Successfully re-created the .htaccess file in the files directory.', 'File');
+    // Verify contents of .htaccess file.
+    $file = file_get_contents(file_default_scheme() . '://.htaccess');
+    $this->assertEqual($file, file_htaccess_lines(FALSE), 'The .htaccess file contains the proper content.', 'File');
+  }
+
+  /**
+   * This will take a directory and path, and find a valid filepath that is not
+   * taken by another file.
+   */
+  function testFileCreateNewFilepath() {
+    // First we test against an imaginary file that does not exist in a
+    // directory.
+    $basename = 'xyz.txt';
+    $directory = 'misc';
+    $original = $directory . '/' . $basename;
+    $path = file_create_filename($basename, $directory);
+    $this->assertEqual($path, $original, format_string('New filepath %new equals %original.', array('%new' => $path, '%original' => $original)), 'File');
+
+    // Then we test against a file that already exists within that directory.
+    $basename = 'druplicon.png';
+    $original = $directory . '/' . $basename;
+    $expected = $directory . '/druplicon_0.png';
+    $path = file_create_filename($basename, $directory);
+    $this->assertEqual($path, $expected, format_string('Creating a new filepath from %original equals %new.', array('%new' => $path, '%original' => $original)), 'File');
+
+    // @TODO: Finally we copy a file into a directory several times, to ensure a properly iterating filename suffix.
+  }
+
+  /**
+   * This will test the filepath for a destination based on passed flags and
+   * whether or not the file exists.
+   *
+   * If a file exists, file_destination($destination, $replace) will either
+   * return:
+   * - the existing filepath, if $replace is FILE_EXISTS_REPLACE
+   * - a new filepath if FILE_EXISTS_RENAME
+   * - an error (returning FALSE) if FILE_EXISTS_ERROR.
+   * If the file doesn't currently exist, then it will simply return the
+   * filepath.
+   */
+  function testFileDestination() {
+    // First test for non-existent file.
+    $destination = 'misc/xyz.txt';
+    $path = file_destination($destination, FILE_EXISTS_REPLACE);
+    $this->assertEqual($path, $destination, 'Non-existing filepath destination is correct with FILE_EXISTS_REPLACE.', 'File');
+    $path = file_destination($destination, FILE_EXISTS_RENAME);
+    $this->assertEqual($path, $destination, 'Non-existing filepath destination is correct with FILE_EXISTS_RENAME.', 'File');
+    $path = file_destination($destination, FILE_EXISTS_ERROR);
+    $this->assertEqual($path, $destination, 'Non-existing filepath destination is correct with FILE_EXISTS_ERROR.', 'File');
+
+    $destination = 'misc/druplicon.png';
+    $path = file_destination($destination, FILE_EXISTS_REPLACE);
+    $this->assertEqual($path, $destination, 'Existing filepath destination remains the same with FILE_EXISTS_REPLACE.', 'File');
+    $path = file_destination($destination, FILE_EXISTS_RENAME);
+    $this->assertNotEqual($path, $destination, 'A new filepath destination is created when filepath destination already exists with FILE_EXISTS_RENAME.', 'File');
+    $path = file_destination($destination, FILE_EXISTS_ERROR);
+    $this->assertEqual($path, FALSE, 'An error is returned when filepath destination already exists with FILE_EXISTS_ERROR.', 'File');
+  }
+
+  /**
+   * Ensure that the file_directory_temp() function always returns a value.
+   */
+  function testFileDirectoryTemp() {
+    // Start with an empty variable to ensure we have a clean slate.
+    variable_set('file_temporary_path', '');
+    $tmp_directory = file_directory_temp();
+    $this->assertEqual(empty($tmp_directory), FALSE, 'file_directory_temp() returned a non-empty value.');
+    $setting = variable_get('file_temporary_path', '');
+    $this->assertEqual($setting, $tmp_directory, "The 'file_temporary_path' variable has the same value that file_directory_temp() returned.");
+  }
+}
+
+/**
+ * Directory related tests.
+ */
+class RemoteFileDirectoryTest extends FileDirectoryTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
+
+/**
+ * Tests the file_scan_directory() function.
+ */
+class FileScanDirectoryTest extends FileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File scan directory',
+      'description' => 'Tests the file_scan_directory() function.',
+      'group' => 'File API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $this->path = drupal_get_path('module', 'simpletest') . '/files';
+  }
+
+  /**
+   * Check the format of the returned values.
+   */
+  function testReturn() {
+    // Grab a listing of all the JavaSscript files and check that they're
+    // passed to the callback.
+    $all_files = file_scan_directory($this->path, '/^javascript-/');
+    ksort($all_files);
+    $this->assertEqual(2, count($all_files), 'Found two, expected javascript files.');
+
+    // Check the first file.
+    $file = reset($all_files);
+    $this->assertEqual(key($all_files), $file->uri, 'Correct array key was used for the first returned file.');
+    $this->assertEqual($file->uri, $this->path . '/javascript-1.txt', 'First file name was set correctly.');
+    $this->assertEqual($file->filename, 'javascript-1.txt', 'First basename was set correctly');
+    $this->assertEqual($file->name, 'javascript-1', 'First name was set correctly.');
+
+    // Check the second file.
+    $file = next($all_files);
+    $this->assertEqual(key($all_files), $file->uri, 'Correct array key was used for the second returned file.');
+    $this->assertEqual($file->uri, $this->path . '/javascript-2.script', 'Second file name was set correctly.');
+    $this->assertEqual($file->filename, 'javascript-2.script', 'Second basename was set correctly');
+    $this->assertEqual($file->name, 'javascript-2', 'Second name was set correctly.');
+  }
+
+  /**
+   * Check that the callback function is called correctly.
+   */
+  function testOptionCallback() {
+    // When nothing is matched nothing should be passed to the callback.
+    $all_files = file_scan_directory($this->path, '/^NONEXISTINGFILENAME/', array('callback' => 'file_test_file_scan_callback'));
+    $this->assertEqual(0, count($all_files), 'No files were found.');
+    $results = file_test_file_scan_callback();
+    file_test_file_scan_callback_reset();
+    $this->assertEqual(0, count($results), 'No files were passed to the callback.');
+
+    // Grab a listing of all the JavaSscript files and check that they're
+    // passed to the callback.
+    $all_files = file_scan_directory($this->path, '/^javascript-/', array('callback' => 'file_test_file_scan_callback'));
+    $this->assertEqual(2, count($all_files), 'Found two, expected javascript files.');
+    $results = file_test_file_scan_callback();
+    file_test_file_scan_callback_reset();
+    $this->assertEqual(2, count($results), 'Files were passed to the callback.');
+  }
+
+  /**
+   * Check that the no-mask parameter is honored.
+   */
+  function testOptionNoMask() {
+    // Grab a listing of all the JavaSscript files.
+    $all_files = file_scan_directory($this->path, '/^javascript-/');
+    $this->assertEqual(2, count($all_files), 'Found two, expected javascript files.');
+
+    // Now use the nomast parameter to filter out the .script file.
+    $filtered_files = file_scan_directory($this->path, '/^javascript-/', array('nomask' => '/.script$/'));
+    $this->assertEqual(1, count($filtered_files), 'Filtered correctly.');
+  }
+
+  /**
+   * Check that key parameter sets the return value's key.
+   */
+  function testOptionKey() {
+    // "filename", for the path starting with $dir.
+    $expected = array($this->path . '/javascript-1.txt', $this->path . '/javascript-2.script');
+    $actual = array_keys(file_scan_directory($this->path, '/^javascript-/', array('key' => 'filepath')));
+    sort($actual);
+    $this->assertEqual($expected, $actual, 'Returned the correct values for the filename key.');
+
+    // "basename", for the basename of the file.
+    $expected = array('javascript-1.txt', 'javascript-2.script');
+    $actual = array_keys(file_scan_directory($this->path, '/^javascript-/', array('key' => 'filename')));
+    sort($actual);
+    $this->assertEqual($expected, $actual, 'Returned the correct values for the basename key.');
+
+    // "name" for the name of the file without an extension.
+    $expected = array('javascript-1', 'javascript-2');
+    $actual = array_keys(file_scan_directory($this->path, '/^javascript-/', array('key' => 'name')));
+    sort($actual);
+    $this->assertEqual($expected, $actual, 'Returned the correct values for the name key.');
+
+    // Invalid option that should default back to "filename".
+    $expected = array($this->path . '/javascript-1.txt', $this->path . '/javascript-2.script');
+    $actual = array_keys(file_scan_directory($this->path, '/^javascript-/', array('key' => 'INVALID')));
+    sort($actual);
+    $this->assertEqual($expected, $actual, 'An invalid key defaulted back to the default.');
+  }
+
+  /**
+   * Check that the recurse option decends into subdirectories.
+   */
+  function testOptionRecurse() {
+    $files = file_scan_directory(drupal_get_path('module', 'simpletest'), '/^javascript-/', array('recurse' => FALSE));
+    $this->assertTrue(empty($files), "Without recursion couldn't find javascript files.");
+
+    $files = file_scan_directory(drupal_get_path('module', 'simpletest'), '/^javascript-/', array('recurse' => TRUE));
+    $this->assertEqual(2, count($files), 'With recursion we found the expected javascript files.');
+  }
+
+
+  /**
+   * Check that the min_depth options lets us ignore files in the starting
+   * directory.
+   */
+  function testOptionMinDepth() {
+    $files = file_scan_directory($this->path, '/^javascript-/', array('min_depth' => 0));
+    $this->assertEqual(2, count($files), 'No minimum-depth gets files in current directory.');
+
+    $files = file_scan_directory($this->path, '/^javascript-/', array('min_depth' => 1));
+    $this->assertTrue(empty($files), "Minimum-depth of 1 successfully excludes files from current directory.");
+  }
+}
+
+/**
+ * Tests the file_scan_directory() function on remote filesystems.
+ */
+class RemoteFileScanDirectoryTest extends FileScanDirectoryTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
+
+/**
+ * Deletion related tests.
+ */
+class FileUnmanagedDeleteTest extends FileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Unmanaged file delete',
+      'description' => 'Tests the unmanaged file delete function.',
+      'group' => 'File API',
+    );
+  }
+
+  /**
+   * Delete a normal file.
+   */
+  function testNormal() {
+    // Create a file for testing
+    $file = $this->createFile();
+
+    // Delete a regular file
+    $this->assertTrue(file_unmanaged_delete($file->uri), 'Deleted worked.');
+    $this->assertFalse(file_exists($file->uri), 'Test file has actually been deleted.');
+  }
+
+  /**
+   * Try deleting a missing file.
+   */
+  function testMissing() {
+    // Try to delete a non-existing file
+    $this->assertTrue(file_unmanaged_delete(file_default_scheme() . '/' . $this->randomName()), 'Returns true when deleting a non-existent file.');
+  }
+
+  /**
+   * Try deleting a directory.
+   */
+  function testDirectory() {
+    // A directory to operate on.
+    $directory = $this->createDirectory();
+
+    // Try to delete a directory
+    $this->assertFalse(file_unmanaged_delete($directory), 'Could not delete the delete directory.');
+    $this->assertTrue(file_exists($directory), 'Directory has not been deleted.');
+  }
+}
+
+/**
+ * Deletion related tests on remote filesystems.
+ */
+class RemoteFileUnmanagedDeleteTest extends FileUnmanagedDeleteTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
+
+/**
+ * Deletion related tests.
+ */
+class FileUnmanagedDeleteRecursiveTest extends FileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Unmanaged recursive file delete',
+      'description' => 'Tests the unmanaged file delete recursive function.',
+      'group' => 'File API',
+    );
+  }
+
+  /**
+   * Delete a normal file.
+   */
+  function testSingleFile() {
+    // Create a file for testing
+    $filepath = file_default_scheme() . '://' . $this->randomName();
+    file_put_contents($filepath, '');
+
+    // Delete the file.
+    $this->assertTrue(file_unmanaged_delete_recursive($filepath), 'Function reported success.');
+    $this->assertFalse(file_exists($filepath), 'Test file has been deleted.');
+  }
+
+  /**
+   * Try deleting an empty directory.
+   */
+  function testEmptyDirectory() {
+    // A directory to operate on.
+    $directory = $this->createDirectory();
+
+    // Delete the directory.
+    $this->assertTrue(file_unmanaged_delete_recursive($directory), 'Function reported success.');
+    $this->assertFalse(file_exists($directory), 'Directory has been deleted.');
+  }
+
+  /**
+   * Try deleting a directory with some files.
+   */
+  function testDirectory() {
+    // A directory to operate on.
+    $directory = $this->createDirectory();
+    $filepathA = $directory . '/A';
+    $filepathB = $directory . '/B';
+    file_put_contents($filepathA, '');
+    file_put_contents($filepathB, '');
+
+    // Delete the directory.
+    $this->assertTrue(file_unmanaged_delete_recursive($directory), 'Function reported success.');
+    $this->assertFalse(file_exists($filepathA), 'Test file A has been deleted.');
+    $this->assertFalse(file_exists($filepathB), 'Test file B has been deleted.');
+    $this->assertFalse(file_exists($directory), 'Directory has been deleted.');
+  }
+
+  /**
+   * Try deleting subdirectories with some files.
+   */
+  function testSubDirectory() {
+    // A directory to operate on.
+    $directory = $this->createDirectory();
+    $subdirectory = $this->createDirectory($directory . '/sub');
+    $filepathA = $directory . '/A';
+    $filepathB = $subdirectory . '/B';
+    file_put_contents($filepathA, '');
+    file_put_contents($filepathB, '');
+
+    // Delete the directory.
+    $this->assertTrue(file_unmanaged_delete_recursive($directory), 'Function reported success.');
+    $this->assertFalse(file_exists($filepathA), 'Test file A has been deleted.');
+    $this->assertFalse(file_exists($filepathB), 'Test file B has been deleted.');
+    $this->assertFalse(file_exists($subdirectory), 'Subdirectory has been deleted.');
+    $this->assertFalse(file_exists($directory), 'Directory has been deleted.');
+  }
+}
+
+/**
+ * Deletion related tests on remote filesystems.
+ */
+class RemoteFileUnmanagedDeleteRecursiveTest extends FileUnmanagedDeleteRecursiveTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
+
+/**
+ * Unmanaged move related tests.
+ */
+class FileUnmanagedMoveTest extends FileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Unmanaged file moving',
+      'description' => 'Tests the unmanaged file move function.',
+      'group' => 'File API',
+    );
+  }
+
+  /**
+   * Move a normal file.
+   */
+  function testNormal() {
+    // Create a file for testing
+    $file = $this->createFile();
+
+    // Moving to a new name.
+    $desired_filepath = 'public://' . $this->randomName();
+    $new_filepath = file_unmanaged_move($file->uri, $desired_filepath, FILE_EXISTS_ERROR);
+    $this->assertTrue($new_filepath, 'Move was successful.');
+    $this->assertEqual($new_filepath, $desired_filepath, 'Returned expected filepath.');
+    $this->assertTrue(file_exists($new_filepath), 'File exists at the new location.');
+    $this->assertFalse(file_exists($file->uri), 'No file remains at the old location.');
+    $this->assertFilePermissions($new_filepath, variable_get('file_chmod_file', 0664));
+
+    // Moving with rename.
+    $desired_filepath = 'public://' . $this->randomName();
+    $this->assertTrue(file_exists($new_filepath), 'File exists before moving.');
+    $this->assertTrue(file_put_contents($desired_filepath, ' '), 'Created a file so a rename will have to happen.');
+    $newer_filepath = file_unmanaged_move($new_filepath, $desired_filepath, FILE_EXISTS_RENAME);
+    $this->assertTrue($newer_filepath, 'Move was successful.');
+    $this->assertNotEqual($newer_filepath, $desired_filepath, 'Returned expected filepath.');
+    $this->assertTrue(file_exists($newer_filepath), 'File exists at the new location.');
+    $this->assertFalse(file_exists($new_filepath), 'No file remains at the old location.');
+    $this->assertFilePermissions($newer_filepath, variable_get('file_chmod_file', 0664));
+
+    // TODO: test moving to a directory (rather than full directory/file path)
+    // TODO: test creating and moving normal files (rather than streams)
+  }
+
+  /**
+   * Try to move a missing file.
+   */
+  function testMissing() {
+    // Move non-existent file.
+    $new_filepath = file_unmanaged_move($this->randomName(), $this->randomName());
+    $this->assertFalse($new_filepath, 'Moving a missing file fails.');
+  }
+
+  /**
+   * Try to move a file onto itself.
+   */
+  function testOverwriteSelf() {
+    // Create a file for testing.
+    $file = $this->createFile();
+
+    // Move the file onto itself without renaming shouldn't make changes.
+    $new_filepath = file_unmanaged_move($file->uri, $file->uri, FILE_EXISTS_REPLACE);
+    $this->assertFalse($new_filepath, 'Moving onto itself without renaming fails.');
+    $this->assertTrue(file_exists($file->uri), 'File exists after moving onto itself.');
+
+    // Move the file onto itself with renaming will result in a new filename.
+    $new_filepath = file_unmanaged_move($file->uri, $file->uri, FILE_EXISTS_RENAME);
+    $this->assertTrue($new_filepath, 'Moving onto itself with renaming works.');
+    $this->assertFalse(file_exists($file->uri), 'Original file has been removed.');
+    $this->assertTrue(file_exists($new_filepath), 'File exists after moving onto itself.');
+  }
+}
+
+/**
+ * Unmanaged move related tests on remote filesystems.
+ */
+class RemoteFileUnmanagedMoveTest extends FileUnmanagedMoveTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
+
+/**
+ * Unmanaged copy related tests.
+ */
+class FileUnmanagedCopyTest extends FileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Unmanaged file copying',
+      'description' => 'Tests the unmanaged file copy function.',
+      'group' => 'File API',
+    );
+  }
+
+  /**
+   * Copy a normal file.
+   */
+  function testNormal() {
+    // Create a file for testing
+    $file = $this->createFile();
+
+    // Copying to a new name.
+    $desired_filepath = 'public://' . $this->randomName();
+    $new_filepath = file_unmanaged_copy($file->uri, $desired_filepath, FILE_EXISTS_ERROR);
+    $this->assertTrue($new_filepath, 'Copy was successful.');
+    $this->assertEqual($new_filepath, $desired_filepath, 'Returned expected filepath.');
+    $this->assertTrue(file_exists($file->uri), 'Original file remains.');
+    $this->assertTrue(file_exists($new_filepath), 'New file exists.');
+    $this->assertFilePermissions($new_filepath, variable_get('file_chmod_file', 0664));
+
+    // Copying with rename.
+    $desired_filepath = 'public://' . $this->randomName();
+    $this->assertTrue(file_put_contents($desired_filepath, ' '), 'Created a file so a rename will have to happen.');
+    $newer_filepath = file_unmanaged_copy($file->uri, $desired_filepath, FILE_EXISTS_RENAME);
+    $this->assertTrue($newer_filepath, 'Copy was successful.');
+    $this->assertNotEqual($newer_filepath, $desired_filepath, 'Returned expected filepath.');
+    $this->assertTrue(file_exists($file->uri), 'Original file remains.');
+    $this->assertTrue(file_exists($newer_filepath), 'New file exists.');
+    $this->assertFilePermissions($newer_filepath, variable_get('file_chmod_file', 0664));
+
+    // TODO: test copying to a directory (rather than full directory/file path)
+    // TODO: test copying normal files using normal paths (rather than only streams)
+  }
+
+  /**
+   * Copy a non-existent file.
+   */
+  function testNonExistent() {
+    // Copy non-existent file
+    $desired_filepath = $this->randomName();
+    $this->assertFalse(file_exists($desired_filepath), "Randomly named file doesn't exists.");
+    $new_filepath = file_unmanaged_copy($desired_filepath, $this->randomName());
+    $this->assertFalse($new_filepath, 'Copying a missing file fails.');
+  }
+
+  /**
+   * Copy a file onto itself.
+   */
+  function testOverwriteSelf() {
+    // Create a file for testing
+    $file = $this->createFile();
+
+    // Copy the file onto itself with renaming works.
+    $new_filepath = file_unmanaged_copy($file->uri, $file->uri, FILE_EXISTS_RENAME);
+    $this->assertTrue($new_filepath, 'Copying onto itself with renaming works.');
+    $this->assertNotEqual($new_filepath, $file->uri, 'Copied file has a new name.');
+    $this->assertTrue(file_exists($file->uri), 'Original file exists after copying onto itself.');
+    $this->assertTrue(file_exists($new_filepath), 'Copied file exists after copying onto itself.');
+    $this->assertFilePermissions($new_filepath, variable_get('file_chmod_file', 0664));
+
+    // Copy the file onto itself without renaming fails.
+    $new_filepath = file_unmanaged_copy($file->uri, $file->uri, FILE_EXISTS_ERROR);
+    $this->assertFalse($new_filepath, 'Copying onto itself without renaming fails.');
+    $this->assertTrue(file_exists($file->uri), 'File exists after copying onto itself.');
+
+    // Copy the file into same directory without renaming fails.
+    $new_filepath = file_unmanaged_copy($file->uri, drupal_dirname($file->uri), FILE_EXISTS_ERROR);
+    $this->assertFalse($new_filepath, 'Copying onto itself fails.');
+    $this->assertTrue(file_exists($file->uri), 'File exists after copying onto itself.');
+
+    // Copy the file into same directory with renaming works.
+    $new_filepath = file_unmanaged_copy($file->uri, drupal_dirname($file->uri), FILE_EXISTS_RENAME);
+    $this->assertTrue($new_filepath, 'Copying into same directory works.');
+    $this->assertNotEqual($new_filepath, $file->uri, 'Copied file has a new name.');
+    $this->assertTrue(file_exists($file->uri), 'Original file exists after copying onto itself.');
+    $this->assertTrue(file_exists($new_filepath), 'Copied file exists after copying onto itself.');
+    $this->assertFilePermissions($new_filepath, variable_get('file_chmod_file', 0664));
+  }
+}
+
+/**
+ * Unmanaged copy related tests on remote filesystems.
+ */
+class RemoteFileUnmanagedCopyTest extends FileUnmanagedCopyTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
+
+/**
+ * Deletion related tests.
+ */
+class FileDeleteTest extends FileHookTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File delete',
+      'description' => 'Tests the file delete function.',
+      'group' => 'File API',
+    );
+  }
+
+  /**
+   * Tries deleting a normal file (as opposed to a directory, symlink, etc).
+   */
+  function testUnused() {
+    $file = $this->createFile();
+
+    // Check that deletion removes the file and database record.
+    $this->assertTrue(is_file($file->uri), 'File exists.');
+    $this->assertIdentical(file_delete($file), TRUE, 'Delete worked.');
+    $this->assertFileHooksCalled(array('delete'));
+    $this->assertFalse(file_exists($file->uri), 'Test file has actually been deleted.');
+    $this->assertFalse(file_load($file->fid), 'File was removed from the database.');
+  }
+
+  /**
+   * Tries deleting a file that is in use.
+   */
+  function testInUse() {
+    $file = $this->createFile();
+    file_usage_add($file, 'testing', 'test', 1);
+    file_usage_add($file, 'testing', 'test', 1);
+
+    file_usage_delete($file, 'testing', 'test', 1);
+    file_delete($file);
+    $usage = file_usage_list($file);
+    $this->assertEqual($usage['testing']['test'], array(1 => 1), 'Test file is still in use.');
+    $this->assertTrue(file_exists($file->uri), 'File still exists on the disk.');
+    $this->assertTrue(file_load($file->fid), 'File still exists in the database.');
+
+    // Clear out the call to hook_file_load().
+    file_test_reset();
+
+    file_usage_delete($file, 'testing', 'test', 1);
+    file_delete($file);
+    $usage = file_usage_list($file);
+    $this->assertFileHooksCalled(array('delete'));
+    $this->assertTrue(empty($usage), 'File usage data was removed.');
+    $this->assertFalse(file_exists($file->uri), 'File has been deleted after its last usage was removed.');
+    $this->assertFalse(file_load($file->fid), 'File was removed from the database.');
+  }
+}
+
+
+/**
+ * Move related tests
+ */
+class FileMoveTest extends FileHookTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File moving',
+      'description' => 'Tests the file move function.',
+      'group' => 'File API',
+    );
+  }
+
+  /**
+   * Move a normal file.
+   */
+  function testNormal() {
+    $contents = $this->randomName(10);
+    $source = $this->createFile(NULL, $contents);
+    $desired_filepath = 'public://' . $this->randomName();
+
+    // Clone the object so we don't have to worry about the function changing
+    // our reference copy.
+    $result = file_move(clone $source, $desired_filepath, FILE_EXISTS_ERROR);
+
+    // Check the return status and that the contents changed.
+    $this->assertTrue($result, 'File moved successfully.');
+    $this->assertFalse(file_exists($source->uri));
+    $this->assertEqual($contents, file_get_contents($result->uri), 'Contents of file correctly written.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('move', 'load', 'update'));
+
+    // Make sure we got the same file back.
+    $this->assertEqual($source->fid, $result->fid, format_string("Source file id's' %fid is unchanged after move.", array('%fid' => $source->fid)));
+
+    // Reload the file from the database and check that the changes were
+    // actually saved.
+    $loaded_file = file_load($result->fid, TRUE);
+    $this->assertTrue($loaded_file, 'File can be loaded from the database.');
+    $this->assertFileUnchanged($result, $loaded_file);
+  }
+
+  /**
+   * Test renaming when moving onto a file that already exists.
+   */
+  function testExistingRename() {
+    // Setup a file to overwrite.
+    $contents = $this->randomName(10);
+    $source = $this->createFile(NULL, $contents);
+    $target = $this->createFile();
+    $this->assertDifferentFile($source, $target);
+
+    // Clone the object so we don't have to worry about the function changing
+    // our reference copy.
+    $result = file_move(clone $source, $target->uri, FILE_EXISTS_RENAME);
+
+    // Check the return status and that the contents changed.
+    $this->assertTrue($result, 'File moved successfully.');
+    $this->assertFalse(file_exists($source->uri));
+    $this->assertEqual($contents, file_get_contents($result->uri), 'Contents of file correctly written.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('move', 'load', 'update'));
+
+    // Compare the returned value to what made it into the database.
+    $this->assertFileUnchanged($result, file_load($result->fid, TRUE));
+    // The target file should not have been altered.
+    $this->assertFileUnchanged($target, file_load($target->fid, TRUE));
+    // Make sure we end up with two distinct files afterwards.
+    $this->assertDifferentFile($target, $result);
+
+    // Compare the source and results.
+    $loaded_source = file_load($source->fid, TRUE);
+    $this->assertEqual($loaded_source->fid, $result->fid, "Returned file's id matches the source.");
+    $this->assertNotEqual($loaded_source->uri, $source->uri, 'Returned file path has changed from the original.');
+  }
+
+  /**
+   * Test replacement when moving onto a file that already exists.
+   */
+  function testExistingReplace() {
+    // Setup a file to overwrite.
+    $contents = $this->randomName(10);
+    $source = $this->createFile(NULL, $contents);
+    $target = $this->createFile();
+    $this->assertDifferentFile($source, $target);
+
+    // Clone the object so we don't have to worry about the function changing
+    // our reference copy.
+    $result = file_move(clone $source, $target->uri, FILE_EXISTS_REPLACE);
+
+    // Look at the results.
+    $this->assertEqual($contents, file_get_contents($result->uri), 'Contents of file were overwritten.');
+    $this->assertFalse(file_exists($source->uri));
+    $this->assertTrue($result, 'File moved successfully.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('move', 'update', 'delete', 'load'));
+
+    // Reload the file from the database and check that the changes were
+    // actually saved.
+    $loaded_result = file_load($result->fid, TRUE);
+    $this->assertFileUnchanged($result, $loaded_result);
+    // Check that target was re-used.
+    $this->assertSameFile($target, $loaded_result);
+    // Source and result should be totally different.
+    $this->assertDifferentFile($source, $loaded_result);
+  }
+
+  /**
+   * Test replacement when moving onto itself.
+   */
+  function testExistingReplaceSelf() {
+    // Setup a file to overwrite.
+    $contents = $this->randomName(10);
+    $source = $this->createFile(NULL, $contents);
+
+    // Copy the file over itself. Clone the object so we don't have to worry
+    // about the function changing our reference copy.
+    $result = file_move(clone $source, $source->uri, FILE_EXISTS_REPLACE);
+    $this->assertFalse($result, 'File move failed.');
+    $this->assertEqual($contents, file_get_contents($source->uri), 'Contents of file were not altered.');
+
+    // Check that no hooks were called while failing.
+    $this->assertFileHooksCalled(array());
+
+    // Load the file from the database and make sure it is identical to what
+    // was returned.
+    $this->assertFileUnchanged($source, file_load($source->fid, TRUE));
+  }
+
+  /**
+   * Test that moving onto an existing file fails when FILE_EXISTS_ERROR is
+   * specified.
+   */
+  function testExistingError() {
+    $contents = $this->randomName(10);
+    $source = $this->createFile();
+    $target = $this->createFile(NULL, $contents);
+    $this->assertDifferentFile($source, $target);
+
+    // Clone the object so we don't have to worry about the function changing
+    // our reference copy.
+    $result = file_move(clone $source, $target->uri, FILE_EXISTS_ERROR);
+
+    // Check the return status and that the contents did not change.
+    $this->assertFalse($result, 'File move failed.');
+    $this->assertTrue(file_exists($source->uri));
+    $this->assertEqual($contents, file_get_contents($target->uri), 'Contents of file were not altered.');
+
+    // Check that no hooks were called while failing.
+    $this->assertFileHooksCalled(array());
+
+    // Load the file from the database and make sure it is identical to what
+    // was returned.
+    $this->assertFileUnchanged($source, file_load($source->fid, TRUE));
+    $this->assertFileUnchanged($target, file_load($target->fid, TRUE));
+  }
+}
+
+
+/**
+ * Copy related tests.
+ */
+class FileCopyTest extends FileHookTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File copying',
+      'description' => 'Tests the file copy function.',
+      'group' => 'File API',
+    );
+  }
+
+  /**
+   * Test file copying in the normal, base case.
+   */
+  function testNormal() {
+    $contents = $this->randomName(10);
+    $source = $this->createFile(NULL, $contents);
+    $desired_uri = 'public://' . $this->randomName();
+
+    // Clone the object so we don't have to worry about the function changing
+    // our reference copy.
+    $result = file_copy(clone $source, $desired_uri, FILE_EXISTS_ERROR);
+
+    // Check the return status and that the contents changed.
+    $this->assertTrue($result, 'File copied successfully.');
+    $this->assertEqual($contents, file_get_contents($result->uri), 'Contents of file were copied correctly.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('copy', 'insert'));
+
+    $this->assertDifferentFile($source, $result);
+    $this->assertEqual($result->uri, $desired_uri, 'The copied file object has the desired filepath.');
+    $this->assertTrue(file_exists($source->uri), 'The original file still exists.');
+    $this->assertTrue(file_exists($result->uri), 'The copied file exists.');
+
+    // Reload the file from the database and check that the changes were
+    // actually saved.
+    $this->assertFileUnchanged($result, file_load($result->fid, TRUE));
+  }
+
+  /**
+   * Test renaming when copying over a file that already exists.
+   */
+  function testExistingRename() {
+    // Setup a file to overwrite.
+    $contents = $this->randomName(10);
+    $source = $this->createFile(NULL, $contents);
+    $target = $this->createFile();
+    $this->assertDifferentFile($source, $target);
+
+    // Clone the object so we don't have to worry about the function changing
+    // our reference copy.
+    $result = file_copy(clone $source, $target->uri, FILE_EXISTS_RENAME);
+
+    // Check the return status and that the contents changed.
+    $this->assertTrue($result, 'File copied successfully.');
+    $this->assertEqual($contents, file_get_contents($result->uri), 'Contents of file were copied correctly.');
+    $this->assertNotEqual($result->uri, $source->uri, 'Returned file path has changed from the original.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('copy', 'insert'));
+
+    // Load all the affected files to check the changes that actually made it
+    // to the database.
+    $loaded_source = file_load($source->fid, TRUE);
+    $loaded_target = file_load($target->fid, TRUE);
+    $loaded_result = file_load($result->fid, TRUE);
+
+    // Verify that the source file wasn't changed.
+    $this->assertFileUnchanged($source, $loaded_source);
+
+    // Verify that what was returned is what's in the database.
+    $this->assertFileUnchanged($result, $loaded_result);
+
+    // Make sure we end up with three distinct files afterwards.
+    $this->assertDifferentFile($loaded_source, $loaded_target);
+    $this->assertDifferentFile($loaded_target, $loaded_result);
+    $this->assertDifferentFile($loaded_source, $loaded_result);
+  }
+
+  /**
+   * Test replacement when copying over a file that already exists.
+   */
+  function testExistingReplace() {
+    // Setup a file to overwrite.
+    $contents = $this->randomName(10);
+    $source = $this->createFile(NULL, $contents);
+    $target = $this->createFile();
+    $this->assertDifferentFile($source, $target);
+
+    // Clone the object so we don't have to worry about the function changing
+    // our reference copy.
+    $result = file_copy(clone $source, $target->uri, FILE_EXISTS_REPLACE);
+
+    // Check the return status and that the contents changed.
+    $this->assertTrue($result, 'File copied successfully.');
+    $this->assertEqual($contents, file_get_contents($result->uri), 'Contents of file were overwritten.');
+    $this->assertDifferentFile($source, $result);
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('load', 'copy', 'update'));
+
+    // Load all the affected files to check the changes that actually made it
+    // to the database.
+    $loaded_source = file_load($source->fid, TRUE);
+    $loaded_target = file_load($target->fid, TRUE);
+    $loaded_result = file_load($result->fid, TRUE);
+
+    // Verify that the source file wasn't changed.
+    $this->assertFileUnchanged($source, $loaded_source);
+
+    // Verify that what was returned is what's in the database.
+    $this->assertFileUnchanged($result, $loaded_result);
+
+    // Target file was reused for the result.
+    $this->assertFileUnchanged($loaded_target, $loaded_result);
+  }
+
+  /**
+   * Test that copying over an existing file fails when FILE_EXISTS_ERROR is
+   * specified.
+   */
+  function testExistingError() {
+    $contents = $this->randomName(10);
+    $source = $this->createFile();
+    $target = $this->createFile(NULL, $contents);
+    $this->assertDifferentFile($source, $target);
+
+    // Clone the object so we don't have to worry about the function changing
+    // our reference copy.
+    $result = file_copy(clone $source, $target->uri, FILE_EXISTS_ERROR);
+
+    // Check the return status and that the contents were not changed.
+    $this->assertFalse($result, 'File copy failed.');
+    $this->assertEqual($contents, file_get_contents($target->uri), 'Contents of file were not altered.');
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array());
+
+    $this->assertFileUnchanged($source, file_load($source->fid, TRUE));
+    $this->assertFileUnchanged($target, file_load($target->fid, TRUE));
+  }
+}
+
+
+/**
+ * Tests the file_load() function.
+ */
+class FileLoadTest extends FileHookTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File loading',
+      'description' => 'Tests the file_load() function.',
+      'group' => 'File API',
+    );
+  }
+
+  /**
+   * Try to load a non-existent file by fid.
+   */
+  function testLoadMissingFid() {
+    $this->assertFalse(file_load(-1), "Try to load an invalid fid fails.");
+    $this->assertFileHooksCalled(array());
+  }
+
+  /**
+   * Try to load a non-existent file by URI.
+   */
+  function testLoadMissingFilepath() {
+    $files = file_load_multiple(array(), array('uri' => 'foobar://misc/druplicon.png'));
+    $this->assertFalse(reset($files), "Try to load a file that doesn't exist in the database fails.");
+    $this->assertFileHooksCalled(array());
+  }
+
+  /**
+   * Try to load a non-existent file by status.
+   */
+  function testLoadInvalidStatus() {
+    $files = file_load_multiple(array(), array('status' => -99));
+    $this->assertFalse(reset($files), "Trying to load a file with an invalid status fails.");
+    $this->assertFileHooksCalled(array());
+  }
+
+  /**
+   * Load a single file and ensure that the correct values are returned.
+   */
+  function testSingleValues() {
+    // Create a new file object from scratch so we know the values.
+    $file = $this->createFile('druplicon.txt', NULL, 'public');
+
+    $by_fid_file = file_load($file->fid);
+    $this->assertFileHookCalled('load');
+    $this->assertTrue(is_object($by_fid_file), 'file_load() returned an object.');
+    $this->assertEqual($by_fid_file->fid, $file->fid, 'Loading by fid got the same fid.', 'File');
+    $this->assertEqual($by_fid_file->uri, $file->uri, 'Loading by fid got the correct filepath.', 'File');
+    $this->assertEqual($by_fid_file->filename, $file->filename, 'Loading by fid got the correct filename.', 'File');
+    $this->assertEqual($by_fid_file->filemime, $file->filemime, 'Loading by fid got the correct MIME type.', 'File');
+    $this->assertEqual($by_fid_file->status, $file->status, 'Loading by fid got the correct status.', 'File');
+    $this->assertTrue($by_fid_file->file_test['loaded'], 'file_test_file_load() was able to modify the file during load.');
+  }
+
+  /**
+   * This will test loading file data from the database.
+   */
+  function testMultiple() {
+    // Create a new file object.
+    $file = $this->createFile('druplicon.txt', NULL, 'public');
+
+    // Load by path.
+    file_test_reset();
+    $by_path_files = file_load_multiple(array(), array('uri' => $file->uri));
+    $this->assertFileHookCalled('load');
+    $this->assertEqual(1, count($by_path_files), 'file_load_multiple() returned an array of the correct size.');
+    $by_path_file = reset($by_path_files);
+    $this->assertTrue($by_path_file->file_test['loaded'], 'file_test_file_load() was able to modify the file during load.');
+    $this->assertEqual($by_path_file->fid, $file->fid, 'Loading by filepath got the correct fid.', 'File');
+
+    // Load by fid.
+    file_test_reset();
+    $by_fid_files = file_load_multiple(array($file->fid), array());
+    $this->assertFileHookCalled('load');
+    $this->assertEqual(1, count($by_fid_files), 'file_load_multiple() returned an array of the correct size.');
+    $by_fid_file = reset($by_fid_files);
+    $this->assertTrue($by_fid_file->file_test['loaded'], 'file_test_file_load() was able to modify the file during load.');
+    $this->assertEqual($by_fid_file->uri, $file->uri, 'Loading by fid got the correct filepath.', 'File');
+  }
+}
+
+/**
+ * Tests the file_save() function.
+ */
+class FileSaveTest extends FileHookTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File saving',
+      'description' => 'Tests the file_save() function.',
+      'group' => 'File API',
+    );
+  }
+
+  function testFileSave() {
+    // Create a new file object.
+    $file = array(
+      'uid' => 1,
+      'filename' => 'druplicon.txt',
+      'uri' => 'public://druplicon.txt',
+      'filemime' => 'text/plain',
+      'timestamp' => 1,
+      'status' => FILE_STATUS_PERMANENT,
+    );
+    $file = (object) $file;
+    file_put_contents($file->uri, 'hello world');
+
+    // Save it, inserting a new record.
+    $saved_file = file_save($file);
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('insert'));
+
+    $this->assertNotNull($saved_file, 'Saving the file should give us back a file object.', 'File');
+    $this->assertTrue($saved_file->fid > 0, 'A new file ID is set when saving a new file to the database.', 'File');
+    $loaded_file = db_query('SELECT * FROM {file_managed} f WHERE f.fid = :fid', array(':fid' => $saved_file->fid))->fetch(PDO::FETCH_OBJ);
+    $this->assertNotNull($loaded_file, 'Record exists in the database.');
+    $this->assertEqual($loaded_file->status, $file->status, 'Status was saved correctly.');
+    $this->assertEqual($saved_file->filesize, filesize($file->uri), 'File size was set correctly.', 'File');
+    $this->assertTrue($saved_file->timestamp > 1, 'File size was set correctly.', 'File');
+
+
+    // Resave the file, updating the existing record.
+    file_test_reset();
+    $saved_file->status = 7;
+    $resaved_file = file_save($saved_file);
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('load', 'update'));
+
+    $this->assertEqual($resaved_file->fid, $saved_file->fid, 'The file ID of an existing file is not changed when updating the database.', 'File');
+    $this->assertTrue($resaved_file->timestamp >= $saved_file->timestamp, "Timestamp didn't go backwards.", 'File');
+    $loaded_file = db_query('SELECT * FROM {file_managed} f WHERE f.fid = :fid', array(':fid' => $saved_file->fid))->fetch(PDO::FETCH_OBJ);
+    $this->assertNotNull($loaded_file, 'Record still exists in the database.', 'File');
+    $this->assertEqual($loaded_file->status, $saved_file->status, 'Status was saved correctly.');
+
+    // Try to insert a second file with the same name apart from case insensitivity
+    // to ensure the 'uri' index allows for filenames with different cases.
+    $file = (object) array(
+      'uid' => 1,
+      'filename' => 'DRUPLICON.txt',
+      'uri' => 'public://DRUPLICON.txt',
+      'filemime' => 'text/plain',
+      'timestamp' => 1,
+      'status' => FILE_STATUS_PERMANENT,
+    );
+    file_put_contents($file->uri, 'hello world');
+    file_save($file);
+  }
+}
+
+/**
+ * Tests file usage functions.
+ */
+class FileUsageTest extends FileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File usage',
+      'description' => 'Tests the file usage functions.',
+      'group' => 'File',
+    );
+  }
+
+  /**
+   * Tests file_usage_list().
+   */
+  function testGetUsage() {
+    $file = $this->createFile();
+    db_insert('file_usage')
+      ->fields(array(
+        'fid' => $file->fid,
+        'module' => 'testing',
+        'type' => 'foo',
+        'id' => 1,
+        'count' => 1
+      ))
+      ->execute();
+    db_insert('file_usage')
+      ->fields(array(
+        'fid' => $file->fid,
+        'module' => 'testing',
+        'type' => 'bar',
+        'id' => 2,
+        'count' => 2
+      ))
+      ->execute();
+
+    $usage = file_usage_list($file);
+
+    $this->assertEqual(count($usage['testing']), 2, 'Returned the correct number of items.');
+    $this->assertTrue(isset($usage['testing']['foo'][1]), 'Returned the correct id.');
+    $this->assertTrue(isset($usage['testing']['bar'][2]), 'Returned the correct id.');
+    $this->assertEqual($usage['testing']['foo'][1], 1, 'Returned the correct count.');
+    $this->assertEqual($usage['testing']['bar'][2], 2, 'Returned the correct count.');
+  }
+
+  /**
+   * Tests file_usage_add().
+   */
+  function testAddUsage() {
+    $file = $this->createFile();
+    file_usage_add($file, 'testing', 'foo', 1);
+    // Add the file twice to ensure that the count is incremented rather than
+    // creating additional records.
+    file_usage_add($file, 'testing', 'bar', 2);
+    file_usage_add($file, 'testing', 'bar', 2);
+
+    $usage = db_select('file_usage', 'f')
+      ->fields('f')
+      ->condition('f.fid', $file->fid)
+      ->execute()
+      ->fetchAllAssoc('id');
+    $this->assertEqual(count($usage), 2, 'Created two records');
+    $this->assertEqual($usage[1]->module, 'testing', 'Correct module');
+    $this->assertEqual($usage[2]->module, 'testing', 'Correct module');
+    $this->assertEqual($usage[1]->type, 'foo', 'Correct type');
+    $this->assertEqual($usage[2]->type, 'bar', 'Correct type');
+    $this->assertEqual($usage[1]->count, 1, 'Correct count');
+    $this->assertEqual($usage[2]->count, 2, 'Correct count');
+  }
+
+  /**
+   * Tests file_usage_delete().
+   */
+  function testRemoveUsage() {
+    $file = $this->createFile();
+    db_insert('file_usage')
+      ->fields(array(
+        'fid' => $file->fid,
+        'module' => 'testing',
+        'type' => 'bar',
+        'id' => 2,
+        'count' => 3,
+      ))
+      ->execute();
+
+    // Normal decrement.
+    file_usage_delete($file, 'testing', 'bar', 2);
+    $count = db_select('file_usage', 'f')
+      ->fields('f', array('count'))
+      ->condition('f.fid', $file->fid)
+      ->execute()
+      ->fetchField();
+    $this->assertEqual(2, $count, 'The count was decremented correctly.');
+
+    // Multiple decrement and removal.
+    file_usage_delete($file, 'testing', 'bar', 2, 2);
+    $count = db_select('file_usage', 'f')
+      ->fields('f', array('count'))
+      ->condition('f.fid', $file->fid)
+      ->execute()
+      ->fetchField();
+    $this->assertIdentical(FALSE, $count, 'The count was removed entirely when empty.');
+
+    // Non-existent decrement.
+    file_usage_delete($file, 'testing', 'bar', 2);
+    $count = db_select('file_usage', 'f')
+      ->fields('f', array('count'))
+      ->condition('f.fid', $file->fid)
+      ->execute()
+      ->fetchField();
+    $this->assertIdentical(FALSE, $count, 'Decrementing non-exist record complete.');
+  }
+}
+
+/**
+ * Tests the file_validate() function..
+ */
+class FileValidateTest extends FileHookTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File validate',
+      'description' => 'Tests the file_validate() function.',
+      'group' => 'File API',
+    );
+  }
+
+  /**
+   * Test that the validators passed into are checked.
+   */
+  function testCallerValidation() {
+    $file = $this->createFile();
+
+    // Empty validators.
+    $this->assertEqual(file_validate($file, array()), array(), 'Validating an empty array works successfully.');
+    $this->assertFileHooksCalled(array('validate'));
+
+    // Use the file_test.module's test validator to ensure that passing tests
+    // return correctly.
+    file_test_reset();
+    file_test_set_return('validate', array());
+    $passing = array('file_test_validator' => array(array()));
+    $this->assertEqual(file_validate($file, $passing), array(), 'Validating passes.');
+    $this->assertFileHooksCalled(array('validate'));
+
+    // Now test for failures in validators passed in and by hook_validate.
+    file_test_reset();
+    file_test_set_return('validate', array('Epic fail'));
+    $failing = array('file_test_validator' => array(array('Failed', 'Badly')));
+    $this->assertEqual(file_validate($file, $failing), array('Failed', 'Badly', 'Epic fail'), 'Validating returns errors.');
+    $this->assertFileHooksCalled(array('validate'));
+  }
+}
+
+/**
+ *  Tests the file_save_data() function.
+ */
+class FileSaveDataTest extends FileHookTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File save data',
+      'description' => 'Tests the file save data function.',
+      'group' => 'File API',
+    );
+  }
+
+  /**
+   * Test the file_save_data() function when no filename is provided.
+   */
+  function testWithoutFilename() {
+    $contents = $this->randomName(8);
+
+    $result = file_save_data($contents);
+    $this->assertTrue($result, 'Unnamed file saved correctly.');
+
+    $this->assertEqual(file_default_scheme(), file_uri_scheme($result->uri), "File was placed in Drupal's files directory.");
+    $this->assertEqual($result->filename, drupal_basename($result->uri), "Filename was set to the file's basename.");
+    $this->assertEqual($contents, file_get_contents($result->uri), 'Contents of the file are correct.');
+    $this->assertEqual($result->filemime, 'application/octet-stream', 'A MIME type was set.');
+    $this->assertEqual($result->status, FILE_STATUS_PERMANENT, "The file's status was set to permanent.");
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('insert'));
+
+    // Verify that what was returned is what's in the database.
+    $this->assertFileUnchanged($result, file_load($result->fid, TRUE));
+  }
+
+  /**
+   * Test the file_save_data() function when a filename is provided.
+   */
+  function testWithFilename() {
+    $contents = $this->randomName(8);
+
+    // Using filename with non-latin characters.
+    $filename = 'Текстовый файл.txt';
+
+    $result = file_save_data($contents, 'public://' . $filename);
+    $this->assertTrue($result, 'Unnamed file saved correctly.');
+
+    $this->assertEqual('public', file_uri_scheme($result->uri), "File was placed in Drupal's files directory.");
+    $this->assertEqual($filename, drupal_basename($result->uri), 'File was named correctly.');
+    $this->assertEqual($contents, file_get_contents($result->uri), 'Contents of the file are correct.');
+    $this->assertEqual($result->filemime, 'text/plain', 'A MIME type was set.');
+    $this->assertEqual($result->status, FILE_STATUS_PERMANENT, "The file's status was set to permanent.");
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('insert'));
+
+    // Verify that what was returned is what's in the database.
+    $this->assertFileUnchanged($result, file_load($result->fid, TRUE));
+  }
+
+  /**
+   * Test file_save_data() when renaming around an existing file.
+   */
+  function testExistingRename() {
+    // Setup a file to overwrite.
+    $existing = $this->createFile();
+    $contents = $this->randomName(8);
+
+    $result = file_save_data($contents, $existing->uri, FILE_EXISTS_RENAME);
+    $this->assertTrue($result, 'File saved successfully.');
+
+    $this->assertEqual('public', file_uri_scheme($result->uri), "File was placed in Drupal's files directory.");
+    $this->assertEqual($result->filename, $existing->filename, 'Filename was set to the basename of the source, rather than that of the renamed file.');
+    $this->assertEqual($contents, file_get_contents($result->uri), 'Contents of the file are correct.');
+    $this->assertEqual($result->filemime, 'application/octet-stream', 'A MIME type was set.');
+    $this->assertEqual($result->status, FILE_STATUS_PERMANENT, "The file's status was set to permanent.");
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('insert'));
+
+    // Ensure that the existing file wasn't overwritten.
+    $this->assertDifferentFile($existing, $result);
+    $this->assertFileUnchanged($existing, file_load($existing->fid, TRUE));
+
+    // Verify that was returned is what's in the database.
+    $this->assertFileUnchanged($result, file_load($result->fid, TRUE));
+  }
+
+  /**
+   * Test file_save_data() when replacing an existing file.
+   */
+  function testExistingReplace() {
+    // Setup a file to overwrite.
+    $existing = $this->createFile();
+    $contents = $this->randomName(8);
+
+    $result = file_save_data($contents, $existing->uri, FILE_EXISTS_REPLACE);
+    $this->assertTrue($result, 'File saved successfully.');
+
+    $this->assertEqual('public', file_uri_scheme($result->uri), "File was placed in Drupal's files directory.");
+    $this->assertEqual($result->filename, $existing->filename, 'Filename was set to the basename of the existing file, rather than preserving the original name.');
+    $this->assertEqual($contents, file_get_contents($result->uri), 'Contents of the file are correct.');
+    $this->assertEqual($result->filemime, 'application/octet-stream', 'A MIME type was set.');
+    $this->assertEqual($result->status, FILE_STATUS_PERMANENT, "The file's status was set to permanent.");
+
+    // Check that the correct hooks were called.
+    $this->assertFileHooksCalled(array('load', 'update'));
+
+    // Verify that the existing file was re-used.
+    $this->assertSameFile($existing, $result);
+
+    // Verify that what was returned is what's in the database.
+    $this->assertFileUnchanged($result, file_load($result->fid, TRUE));
+  }
+
+  /**
+   * Test that file_save_data() fails overwriting an existing file.
+   */
+  function testExistingError() {
+    $contents = $this->randomName(8);
+    $existing = $this->createFile(NULL, $contents);
+
+    // Check the overwrite error.
+    $result = file_save_data('asdf', $existing->uri, FILE_EXISTS_ERROR);
+    $this->assertFalse($result, 'Overwriting a file fails when FILE_EXISTS_ERROR is specified.');
+    $this->assertEqual($contents, file_get_contents($existing->uri), 'Contents of existing file were unchanged.');
+
+    // Check that no hooks were called while failing.
+    $this->assertFileHooksCalled(array());
+
+    // Ensure that the existing file wasn't overwritten.
+    $this->assertFileUnchanged($existing, file_load($existing->fid, TRUE));
+  }
+}
+
+/**
+ * Tests for download/file transfer functions.
+ */
+class FileDownloadTest extends FileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File download',
+      'description' => 'Tests for file download/transfer functions.',
+      'group' => 'File API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    // Clear out any hook calls.
+    file_test_reset();
+  }
+
+  /**
+   * Test the public file transfer system.
+   */
+  function testPublicFileTransfer() {
+    // Test generating an URL to a created file.
+    $file = $this->createFile();
+    $url = file_create_url($file->uri);
+    // URLs can't contain characters outside the ASCII set so $filename has to be
+    // encoded.
+    $filename = $GLOBALS['base_url'] . '/' . file_stream_wrapper_get_instance_by_scheme('public')->getDirectoryPath() . '/' . rawurlencode($file->filename);
+    $this->assertEqual($filename, $url, 'Correctly generated a URL for a created file.');
+    $this->drupalHead($url);
+    $this->assertResponse(200, 'Confirmed that the generated URL is correct by downloading the created file.');
+
+    // Test generating an URL to a shipped file (i.e. a file that is part of
+    // Drupal core, a module or a theme, for example a JavaScript file).
+    $filepath = 'misc/jquery.js';
+    $url = file_create_url($filepath);
+    $this->assertEqual($GLOBALS['base_url'] . '/' . $filepath, $url, 'Correctly generated a URL for a shipped file.');
+    $this->drupalHead($url);
+    $this->assertResponse(200, 'Confirmed that the generated URL is correct by downloading the shipped file.');
+  }
+
+  /**
+   * Test the private file transfer system.
+   */
+  function testPrivateFileTransfer() {
+    // Set file downloads to private so handler functions get called.
+
+    // Create a file.
+    $contents = $this->randomName(8);
+    $file = $this->createFile(NULL, $contents, 'private');
+    $url  = file_create_url($file->uri);
+
+    // Set file_test access header to allow the download.
+    file_test_set_return('download', array('x-foo' => 'Bar'));
+    $this->drupalGet($url);
+    $headers = $this->drupalGetHeaders();
+    $this->assertEqual($headers['x-foo'], 'Bar', 'Found header set by file_test module on private download.');
+    $this->assertResponse(200, 'Correctly allowed access to a file when file_test provides headers.');
+
+    // Test that the file transferred correctly.
+    $this->assertEqual($contents, $this->content, 'Contents of the file are correct.');
+
+    // Deny access to all downloads via a -1 header.
+    file_test_set_return('download', -1);
+    $this->drupalHead($url);
+    $this->assertResponse(403, 'Correctly denied access to a file when file_test sets the header to -1.');
+
+    // Try non-existent file.
+    $url = file_create_url('private://' . $this->randomName());
+    $this->drupalHead($url);
+    $this->assertResponse(404, 'Correctly returned 404 response for a non-existent file.');
+  }
+
+  /**
+   * Test file_create_url().
+   */
+  function testFileCreateUrl() {
+    global $base_url;
+
+    // Tilde (~) is excluded from this test because it is encoded by
+    // rawurlencode() in PHP 5.2 but not in PHP 5.3, as per RFC 3986.
+    // @see http://www.php.net/manual/en/function.rawurlencode.php#86506
+    $basename = " -._!$'\"()*@[]?&+%#,;=:\n\x00" . // "Special" ASCII characters.
+      "%23%25%26%2B%2F%3F" . // Characters that look like a percent-escaped string.
+      "éøïвβ中國書۞"; // Characters from various non-ASCII alphabets.
+    $basename_encoded = '%20-._%21%24%27%22%28%29%2A%40%5B%5D%3F%26%2B%25%23%2C%3B%3D%3A__' .
+      '%2523%2525%2526%252B%252F%253F' .
+      '%C3%A9%C3%B8%C3%AF%D0%B2%CE%B2%E4%B8%AD%E5%9C%8B%E6%9B%B8%DB%9E';
+
+    $this->checkUrl('public', '', $basename, $base_url . '/' . file_stream_wrapper_get_instance_by_scheme('public')->getDirectoryPath() . '/' . $basename_encoded);
+    $this->checkUrl('private', '', $basename, $base_url . '/system/files/' . $basename_encoded);
+    $this->checkUrl('private', '', $basename, $base_url . '/?q=system/files/' . $basename_encoded, '0');
+  }
+
+  /**
+   * Download a file from the URL generated by file_create_url().
+   *
+   * Create a file with the specified scheme, directory and filename; check that
+   * the URL generated by file_create_url() for the specified file equals the
+   * specified URL; fetch the URL and then compare the contents to the file.
+   *
+   * @param $scheme
+   *   A scheme, e.g. "public"
+   * @param $directory
+   *   A directory, possibly ""
+   * @param $filename
+   *   A filename
+   * @param $expected_url
+   *   The expected URL
+   * @param $clean_url
+   *   The value of the clean_url setting
+   */
+  private function checkUrl($scheme, $directory, $filename, $expected_url, $clean_url = '1') {
+    variable_set('clean_url', $clean_url);
+
+    // Convert $filename to a valid filename, i.e. strip characters not
+    // supported by the filesystem, and create the file in the specified
+    // directory.
+    $filepath = file_create_filename($filename, $directory);
+    $directory_uri = $scheme . '://' . dirname($filepath);
+    file_prepare_directory($directory_uri, FILE_CREATE_DIRECTORY);
+    $file = $this->createFile($filepath, NULL, $scheme);
+
+    $url = file_create_url($file->uri);
+    $this->assertEqual($url, $expected_url, 'Generated URL matches expected URL.');
+
+    if ($scheme == 'private') {
+      // Tell the implementation of hook_file_download() in file_test.module
+      // that this file may be downloaded.
+      file_test_set_return('download', array('x-foo' => 'Bar'));
+    }
+
+    $this->drupalGet($url);
+    if ($this->assertResponse(200) == 'pass') {
+      $this->assertRaw(file_get_contents($file->uri), 'Contents of the file are correct.');
+    }
+
+    file_delete($file);
+  }
+}
+
+/**
+ * Tests for file URL rewriting.
+ */
+class FileURLRewritingTest extends FileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File URL rewriting',
+      'description' => 'Tests for file URL rewriting.',
+      'group' => 'File',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+  }
+
+  /**
+   * Test the generating of rewritten shipped file URLs.
+   */
+  function testShippedFileURL()  {
+    // Test generating an URL to a shipped file (i.e. a file that is part of
+    // Drupal core, a module or a theme, for example a JavaScript file).
+
+    // Test alteration of file URLs to use a CDN.
+    variable_set('file_test_hook_file_url_alter', 'cdn');
+    $filepath = 'misc/jquery.js';
+    $url = file_create_url($filepath);
+    $this->assertEqual(FILE_URL_TEST_CDN_1 . '/' . $filepath, $url, 'Correctly generated a CDN URL for a shipped file.');
+    $filepath = 'misc/favicon.ico';
+    $url = file_create_url($filepath);
+    $this->assertEqual(FILE_URL_TEST_CDN_2 . '/' . $filepath, $url, 'Correctly generated a CDN URL for a shipped file.');
+
+    // Test alteration of file URLs to use root-relative URLs.
+    variable_set('file_test_hook_file_url_alter', 'root-relative');
+    $filepath = 'misc/jquery.js';
+    $url = file_create_url($filepath);
+    $this->assertEqual(base_path() . '/' . $filepath, $url, 'Correctly generated a root-relative URL for a shipped file.');
+    $filepath = 'misc/favicon.ico';
+    $url = file_create_url($filepath);
+    $this->assertEqual(base_path() . '/' . $filepath, $url, 'Correctly generated a root-relative URL for a shipped file.');
+
+    // Test alteration of file URLs to use protocol-relative URLs.
+    variable_set('file_test_hook_file_url_alter', 'protocol-relative');
+    $filepath = 'misc/jquery.js';
+    $url = file_create_url($filepath);
+    $this->assertEqual('/' . base_path() . '/' . $filepath, $url, 'Correctly generated a protocol-relative URL for a shipped file.');
+    $filepath = 'misc/favicon.ico';
+    $url = file_create_url($filepath);
+    $this->assertEqual('/' . base_path() . '/' . $filepath, $url, 'Correctly generated a protocol-relative URL for a shipped file.');
+  }
+
+  /**
+   * Test the generating of rewritten public created file URLs.
+   */
+  function testPublicCreatedFileURL() {
+    // Test generating an URL to a created file.
+
+    // Test alteration of file URLs to use a CDN.
+    variable_set('file_test_hook_file_url_alter', 'cdn');
+    $file = $this->createFile();
+    $url = file_create_url($file->uri);
+    $public_directory_path = file_stream_wrapper_get_instance_by_scheme('public')->getDirectoryPath();
+    $this->assertEqual(FILE_URL_TEST_CDN_2 . '/' . $public_directory_path . '/' . $file->filename, $url, 'Correctly generated a CDN URL for a created file.');
+
+    // Test alteration of file URLs to use root-relative URLs.
+    variable_set('file_test_hook_file_url_alter', 'root-relative');
+    $file = $this->createFile();
+    $url = file_create_url($file->uri);
+    $this->assertEqual(base_path() . '/' . $public_directory_path . '/' . $file->filename, $url, 'Correctly generated a root-relative URL for a created file.');
+
+    // Test alteration of file URLs to use a protocol-relative URLs.
+    variable_set('file_test_hook_file_url_alter', 'protocol-relative');
+    $file = $this->createFile();
+    $url = file_create_url($file->uri);
+    $this->assertEqual('/' . base_path() . '/' . $public_directory_path . '/' . $file->filename, $url, 'Correctly generated a protocol-relative URL for a created file.');
+  }
+}
+
+/**
+ * Tests for file_munge_filename() and file_unmunge_filename().
+ */
+class FileNameMungingTest extends FileTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'File naming',
+      'description' => 'Test filename munging and unmunging.',
+      'group' => 'File API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $this->bad_extension = 'php';
+    $this->name = $this->randomName() . '.' . $this->bad_extension . '.txt';
+  }
+
+  /**
+   * Create a file and munge/unmunge the name.
+   */
+  function testMunging() {
+    // Disable insecure uploads.
+    variable_set('allow_insecure_uploads', 0);
+    $munged_name = file_munge_filename($this->name, '', TRUE);
+    $messages = drupal_get_messages();
+    $this->assertTrue(in_array(t('For security reasons, your upload has been renamed to %filename.', array('%filename' => $munged_name)), $messages['status']), 'Alert properly set when a file is renamed.');
+    $this->assertNotEqual($munged_name, $this->name, format_string('The new filename (%munged) has been modified from the original (%original)', array('%munged' => $munged_name, '%original' => $this->name)));
+  }
+
+  /**
+   * Tests munging with a null byte in the filename.
+   */
+  function testMungeNullByte() {
+    $prefix = $this->randomName();
+    $filename = $prefix . '.' . $this->bad_extension . "\0.txt";
+    $this->assertEqual(file_munge_filename($filename, ''), $prefix . '.' . $this->bad_extension . '_.txt', 'A filename with a null byte is correctly munged to remove the null byte.');
+  }
+
+  /**
+   * If the allow_insecure_uploads variable evaluates to true, the file should
+   * come out untouched, no matter how evil the filename.
+   */
+  function testMungeIgnoreInsecure() {
+    variable_set('allow_insecure_uploads', 1);
+    $munged_name = file_munge_filename($this->name, '');
+    $this->assertIdentical($munged_name, $this->name, format_string('The original filename (%original) matches the munged filename (%munged) when insecure uploads are enabled.', array('%munged' => $munged_name, '%original' => $this->name)));
+  }
+
+  /**
+   * White listed extensions are ignored by file_munge_filename().
+   */
+  function testMungeIgnoreWhitelisted() {
+    // Declare our extension as whitelisted.
+    $munged_name = file_munge_filename($this->name, $this->bad_extension);
+    $this->assertIdentical($munged_name, $this->name, format_string('The new filename (%munged) matches the original (%original) once the extension has been whitelisted.', array('%munged' => $munged_name, '%original' => $this->name)));
+  }
+
+  /**
+   * Ensure that unmunge gets your name back.
+   */
+  function testUnMunge() {
+    $munged_name = file_munge_filename($this->name, '', FALSE);
+    $unmunged_name = file_unmunge_filename($munged_name);
+    $this->assertIdentical($unmunged_name, $this->name, format_string('The unmunged (%unmunged) filename matches the original (%original)', array('%unmunged' => $unmunged_name, '%original' => $this->name)));
+  }
+}
+
+/**
+ * Tests for file_get_mimetype().
+ */
+class FileMimeTypeTest extends DrupalWebTestCase {
+  function setUp() {
+    parent::setUp('file_test');
+  }
+
+  public static function getInfo() {
+    return array(
+      'name' => 'File mimetypes',
+      'description' => 'Test filename mimetype detection.',
+      'group' => 'File API',
+    );
+  }
+
+  /**
+   * Test mapping of mimetypes from filenames.
+   */
+  public function testFileMimeTypeDetection() {
+    $prefix = 'public://';
+
+    $test_case = array(
+      'test.jar' => 'application/java-archive',
+      'test.jpeg' => 'image/jpeg',
+      'test.JPEG' => 'image/jpeg',
+      'test.jpg' => 'image/jpeg',
+      'test.jar.jpg' => 'image/jpeg',
+      'test.jpg.jar' => 'application/java-archive',
+      'test.pcf.Z' => 'application/x-font',
+      'pcf.z' => 'application/octet-stream',
+      'jar' => 'application/octet-stream',
+      'some.junk' => 'application/octet-stream',
+      'foo.file_test_1' => 'madeup/file_test_1',
+      'foo.file_test_2' => 'madeup/file_test_2',
+      'foo.doc' => 'madeup/doc',
+      'test.ogg' => 'audio/ogg',
+    );
+
+    // Test using default mappings.
+    foreach ($test_case as $input => $expected) {
+      // Test stream [URI].
+      $output = file_get_mimetype($prefix . $input);
+      $this->assertIdentical($output, $expected, format_string('Mimetype for %input is %output (expected: %expected).', array('%input' => $input, '%output' => $output, '%expected' => $expected)));
+
+      // Test normal path equivalent
+      $output = file_get_mimetype($input);
+      $this->assertIdentical($output, $expected, format_string('Mimetype (using default mappings) for %input is %output (expected: %expected).', array('%input' => $input, '%output' => $output, '%expected' => $expected)));
+    }
+
+    // Now test passing in the map.
+    $mapping = array(
+      'mimetypes' => array(
+        0 => 'application/java-archive',
+        1 => 'image/jpeg',
+      ),
+      'extensions' => array(
+         'jar' => 0,
+         'jpg' => 1,
+      )
+    );
+
+    $test_case = array(
+      'test.jar' => 'application/java-archive',
+      'test.jpeg' => 'application/octet-stream',
+      'test.jpg' => 'image/jpeg',
+      'test.jar.jpg' => 'image/jpeg',
+      'test.jpg.jar' => 'application/java-archive',
+      'test.pcf.z' => 'application/octet-stream',
+      'pcf.z' => 'application/octet-stream',
+      'jar' => 'application/octet-stream',
+      'some.junk' => 'application/octet-stream',
+      'foo.file_test_1' => 'application/octet-stream',
+      'foo.file_test_2' => 'application/octet-stream',
+      'foo.doc' => 'application/octet-stream',
+      'test.ogg' => 'application/octet-stream',
+    );
+
+    foreach ($test_case as $input => $expected) {
+      $output = file_get_mimetype($input, $mapping);
+      $this->assertIdentical($output, $expected, format_string('Mimetype (using passed-in mappings) for %input is %output (expected: %expected).', array('%input' => $input, '%output' => $output, '%expected' => $expected)));
+    }
+  }
+}
+
+/**
+ * Tests stream wrapper functions.
+ */
+class StreamWrapperTest extends DrupalWebTestCase {
+
+  protected $scheme = 'dummy';
+  protected $classname = 'DrupalDummyStreamWrapper';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Stream wrappers',
+      'description' => 'Tests stream wrapper functions.',
+      'group' => 'File API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    drupal_static_reset('file_get_stream_wrappers');
+  }
+
+  function tearDown() {
+    parent::tearDown();
+    stream_wrapper_unregister($this->scheme);
+  }
+
+  /**
+   * Test the getClassName() function.
+   */
+  function testGetClassName() {
+    // Check the dummy scheme.
+    $this->assertEqual($this->classname, file_stream_wrapper_get_class($this->scheme), 'Got correct class name for dummy scheme.');
+    // Check core's scheme.
+    $this->assertEqual('DrupalPublicStreamWrapper', file_stream_wrapper_get_class('public'), 'Got correct class name for public scheme.');
+  }
+
+  /**
+   * Test the file_stream_wrapper_get_instance_by_scheme() function.
+   */
+  function testGetInstanceByScheme() {
+    $instance = file_stream_wrapper_get_instance_by_scheme($this->scheme);
+    $this->assertEqual($this->classname, get_class($instance), 'Got correct class type for dummy scheme.');
+
+    $instance = file_stream_wrapper_get_instance_by_scheme('public');
+    $this->assertEqual('DrupalPublicStreamWrapper', get_class($instance), 'Got correct class type for public scheme.');
+  }
+
+  /**
+   * Test the URI and target functions.
+   */
+  function testUriFunctions() {
+    $instance = file_stream_wrapper_get_instance_by_uri($this->scheme . '://foo');
+    $this->assertEqual($this->classname, get_class($instance), 'Got correct class type for dummy URI.');
+
+    $instance = file_stream_wrapper_get_instance_by_uri('public://foo');
+    $this->assertEqual('DrupalPublicStreamWrapper', get_class($instance), 'Got correct class type for public URI.');
+
+    // Test file_uri_target().
+    $this->assertEqual(file_uri_target('public://foo/bar.txt'), 'foo/bar.txt', 'Got a valid stream target from public://foo/bar.txt.');
+    $this->assertFalse(file_uri_target('foo/bar.txt'), 'foo/bar.txt is not a valid stream.');
+
+    // Test file_build_uri() and DrupalLocalStreamWrapper::getDirectoryPath().
+    $this->assertEqual(file_build_uri('foo/bar.txt'), 'public://foo/bar.txt', 'Expected scheme was added.');
+    $this->assertEqual(file_stream_wrapper_get_instance_by_scheme('public')->getDirectoryPath(), variable_get('file_public_path'), 'Expected default directory path was returned.');
+    $this->assertEqual(file_stream_wrapper_get_instance_by_scheme('temporary')->getDirectoryPath(), variable_get('file_temporary_path'), 'Expected temporary directory path was returned.');
+
+    variable_set('file_default_scheme', 'private');
+    $this->assertEqual(file_build_uri('foo/bar.txt'), 'private://foo/bar.txt', 'Got a valid URI from foo/bar.txt.');
+  }
+
+  /**
+   * Test the scheme functions.
+   */
+  function testGetValidStreamScheme() {
+    $this->assertEqual('foo', file_uri_scheme('foo://pork//chops'), 'Got the correct scheme from foo://asdf');
+    $this->assertTrue(file_stream_wrapper_valid_scheme(file_uri_scheme('public://asdf')), 'Got a valid stream scheme from public://asdf');
+    $this->assertFalse(file_stream_wrapper_valid_scheme(file_uri_scheme('foo://asdf')), 'Did not get a valid stream scheme from foo://asdf');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/file_test.info b/htmltest/modules/simpletest/tests/file_test.info
new file mode 100644
index 00000000..51f65a2d
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/file_test.info
@@ -0,0 +1,13 @@
+name = "File test"
+description = "Support module for file handling tests."
+package = Testing
+version = VERSION
+core = 7.x
+files[] = file_test.module
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/file_test.module b/htmltest/modules/simpletest/tests/file_test.module
new file mode 100644
index 00000000..1b11316f
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/file_test.module
@@ -0,0 +1,461 @@
+<?php
+
+/**
+ * @file
+ * Helper module for the file tests.
+ *
+ * The caller is must call file_test_reset() to initializing this module before
+ * calling file_test_get_calls() or file_test_set_return().
+ */
+
+
+define('FILE_URL_TEST_CDN_1', 'http://cdn1.example.com');
+define('FILE_URL_TEST_CDN_2', 'http://cdn2.example.com');
+
+
+/**
+ * Implements hook_menu().
+ */
+function file_test_menu() {
+  $items['file-test/upload'] = array(
+    'title' => 'Upload test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('_file_test_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_stream_wrappers().
+ */
+function file_test_stream_wrappers() {
+  return array(
+    'dummy' => array(
+      'name' => t('Dummy files'),
+      'class' => 'DrupalDummyStreamWrapper',
+      'description' => t('Dummy wrapper for simpletest.'),
+    ),
+    'dummy-remote' => array(
+      'name' => t('Dummy files (remote)'),
+      'class' => 'DrupalDummyRemoteStreamWrapper',
+      'description' => t('Dummy wrapper for simpletest (remote).'),
+    ),
+  );
+}
+
+/**
+ * Form to test file uploads.
+ */
+function _file_test_form($form, &$form_state) {
+  $form['file_test_upload'] = array(
+    '#type' => 'file',
+    '#title' => t('Upload a file'),
+  );
+  $form['file_test_replace'] = array(
+    '#type' => 'select',
+    '#title' => t('Replace existing image'),
+    '#options' => array(
+      FILE_EXISTS_RENAME => t('Appends number until name is unique'),
+      FILE_EXISTS_REPLACE => t('Replace the existing file'),
+      FILE_EXISTS_ERROR => t('Fail with an error'),
+    ),
+    '#default_value' => FILE_EXISTS_RENAME,
+  );
+  $form['file_subdir'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subdirectory for test file'),
+    '#default_value' => '',
+  );
+
+  $form['extensions'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Allowed extensions.'),
+    '#default_value' => '',
+  );
+
+  $form['allow_all_extensions'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Allow all extensions?'),
+    '#default_value' => FALSE,
+  );
+
+  $form['is_image_file'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Is this an image file?'),
+    '#default_value' => TRUE,
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit'),
+  );
+  return $form;
+}
+
+/**
+ * Process the upload.
+ */
+function _file_test_form_submit(&$form, &$form_state) {
+  // Process the upload and perform validation. Note: we're using the
+  // form value for the $replace parameter.
+  if (!empty($form_state['values']['file_subdir'])) {
+    $destination = 'temporary://' . $form_state['values']['file_subdir'];
+    file_prepare_directory($destination, FILE_CREATE_DIRECTORY);
+  }
+  else {
+    $destination = FALSE;
+  }
+
+  // Setup validators.
+  $validators = array();
+  if ($form_state['values']['is_image_file']) {
+    $validators['file_validate_is_image'] = array();
+  }
+
+  if ($form_state['values']['allow_all_extensions']) {
+    $validators['file_validate_extensions'] = array();
+  }
+  elseif (!empty($form_state['values']['extensions'])) {
+    $validators['file_validate_extensions'] = array($form_state['values']['extensions']);
+  }
+
+  $file = file_save_upload('file_test_upload', $validators, $destination, $form_state['values']['file_test_replace']);
+  if ($file) {
+    $form_state['values']['file_test_upload'] = $file;
+    drupal_set_message(t('File @filepath was uploaded.', array('@filepath' => $file->uri)));
+    drupal_set_message(t('File name is @filename.', array('@filename' => $file->filename)));
+    drupal_set_message(t('File MIME type is @mimetype.', array('@mimetype' => $file->filemime)));
+    drupal_set_message(t('You WIN!'));
+  }
+  elseif ($file === FALSE) {
+    drupal_set_message(t('Epic upload FAIL!'), 'error');
+  }
+}
+
+
+/**
+ * Reset/initialize the history of calls to the file_* hooks.
+ *
+ * @see file_test_get_calls()
+ * @see file_test_reset()
+ */
+function file_test_reset() {
+  // Keep track of calls to these hooks
+  $results = array(
+    'load' => array(),
+    'validate' => array(),
+    'download' => array(),
+    'insert' => array(),
+    'update' => array(),
+    'copy' => array(),
+    'move' => array(),
+    'delete' => array(),
+  );
+  variable_set('file_test_results', $results);
+
+  // These hooks will return these values, see file_test_set_return().
+  $return = array(
+    'validate' => array(),
+    'download' => NULL,
+  );
+  variable_set('file_test_return', $return);
+}
+
+/**
+ * Get the arguments passed to invocation of a given hook since
+ * file_test_reset() was last called.
+ *
+ * @param $op
+ *   One of the hook_file_* operations: 'load', 'validate', 'download',
+ *   'insert', 'update', 'copy', 'move', 'delete'.
+ *
+ * @return
+ *   Array of the parameters passed to each call.
+ *
+ * @see _file_test_log_call()
+ * @see file_test_reset()
+ */
+function file_test_get_calls($op) {
+  $results = variable_get('file_test_results', array());
+  return $results[$op];
+}
+
+/**
+ * Get an array with the calls for all hooks.
+ *
+ * @return
+ *   An array keyed by hook name ('load', 'validate', 'download', 'insert',
+ *   'update', 'copy', 'move', 'delete') with values being arrays of parameters
+ *   passed to each call.
+ */
+function file_test_get_all_calls() {
+  return variable_get('file_test_results', array());
+}
+
+/**
+ * Store the values passed to a hook invocation.
+ *
+ * @param $op
+ *   One of the hook_file_* operations: 'load', 'validate', 'download',
+ *   'insert', 'update', 'copy', 'move', 'delete'.
+ * @param $args
+ *   Values passed to hook.
+ *
+ * @see file_test_get_calls()
+ * @see file_test_reset()
+ */
+function _file_test_log_call($op, $args) {
+  $results = variable_get('file_test_results', array());
+  $results[$op][] = $args;
+  variable_set('file_test_results', $results);
+}
+
+/**
+ * Load the appropriate return value.
+ *
+ * @param $op
+ *   One of the hook_file_[validate,download] operations.
+ *
+ * @return
+ *   Value set by file_test_set_return().
+ *
+ * @see file_test_set_return()
+ * @see file_test_reset()
+ */
+function _file_test_get_return($op) {
+  $return = variable_get('file_test_return', array($op => NULL));
+  return $return[$op];
+}
+
+/**
+ * Assign a return value for a given operation.
+ *
+ * @param $op
+ *   One of the hook_file_[validate,download] operations.
+ * @param $value
+ *   Value for the hook to return.
+ *
+ * @see _file_test_get_return()
+ * @see file_test_reset()
+ */
+function file_test_set_return($op, $value) {
+  $return = variable_get('file_test_return', array());
+  $return[$op] = $value;
+  variable_set('file_test_return', $return);
+}
+
+/**
+ * Implements hook_file_load().
+ */
+function file_test_file_load($files) {
+  foreach ($files as $file) {
+    _file_test_log_call('load', array($file));
+    // Assign a value on the object so that we can test that the $file is passed
+    // by reference.
+    $file->file_test['loaded'] = TRUE;
+  }
+}
+
+/**
+ * Implements hook_file_validate().
+ */
+function file_test_file_validate($file) {
+  _file_test_log_call('validate', array($file));
+  return _file_test_get_return('validate');
+}
+
+/**
+ * Implements hook_file_download().
+ */
+function file_test_file_download($uri) {
+  _file_test_log_call('download', array($uri));
+  return _file_test_get_return('download');
+}
+
+/**
+ * Implements hook_file_insert().
+ */
+function file_test_file_insert($file) {
+  _file_test_log_call('insert', array($file));
+}
+
+/**
+ * Implements hook_file_update().
+ */
+function file_test_file_update($file) {
+  _file_test_log_call('update', array($file));
+}
+
+/**
+ * Implements hook_file_copy().
+ */
+function file_test_file_copy($file, $source) {
+  _file_test_log_call('copy', array($file, $source));
+}
+
+/**
+ * Implements hook_file_move().
+ */
+function file_test_file_move($file, $source) {
+  _file_test_log_call('move', array($file, $source));
+}
+
+/**
+ * Implements hook_file_delete().
+ */
+function file_test_file_delete($file) {
+  _file_test_log_call('delete', array($file));
+}
+
+/**
+ * Implements hook_file_url_alter().
+ */
+function file_test_file_url_alter(&$uri) {
+  // Only run this hook when this variable is set. Otherwise, we'd have to add
+  // another hidden test module just for this hook.
+  $alter_mode = variable_get('file_test_hook_file_url_alter', FALSE);
+  if (!$alter_mode) {
+    return;
+  }
+  // Test alteration of file URLs to use a CDN.
+  elseif ($alter_mode == 'cdn') {
+    $cdn_extensions = array('css', 'js', 'gif', 'jpg', 'jpeg', 'png');
+
+    // Most CDNs don't support private file transfers without a lot of hassle,
+    // so don't support this in the common case.
+    $schemes = array('public');
+
+    $scheme = file_uri_scheme($uri);
+
+    // Only serve shipped files and public created files from the CDN.
+    if (!$scheme || in_array($scheme, $schemes)) {
+      // Shipped files.
+      if (!$scheme) {
+        $path = $uri;
+      }
+      // Public created files.
+      else {
+        $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme);
+        $path = $wrapper->getDirectoryPath() . '/' . file_uri_target($uri);
+      }
+
+      // Clean up Windows paths.
+      $path = str_replace('\\', '/', $path);
+
+      // Serve files with one of the CDN extensions from CDN 1, all others from
+      // CDN 2.
+      $pathinfo = pathinfo($path);
+      if (array_key_exists('extension', $pathinfo) && in_array($pathinfo['extension'], $cdn_extensions)) {
+        $uri = FILE_URL_TEST_CDN_1 . '/' . $path;
+      }
+      else {
+        $uri = FILE_URL_TEST_CDN_2 . '/' . $path;
+      }
+    }
+  }
+  // Test alteration of file URLs to use root-relative URLs.
+  elseif ($alter_mode == 'root-relative') {
+    // Only serve shipped files and public created files with root-relative
+    // URLs.
+    $scheme = file_uri_scheme($uri);
+    if (!$scheme || $scheme == 'public') {
+      // Shipped files.
+      if (!$scheme) {
+        $path = $uri;
+      }
+      // Public created files.
+      else {
+        $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme);
+        $path = $wrapper->getDirectoryPath() . '/' . file_uri_target($uri);
+      }
+
+      // Clean up Windows paths.
+      $path = str_replace('\\', '/', $path);
+
+      // Generate a root-relative URL.
+      $uri = base_path() . '/' . $path;
+    }
+  }
+  // Test alteration of file URLs to use protocol-relative URLs.
+  elseif ($alter_mode == 'protocol-relative') {
+    // Only serve shipped files and public created files with protocol-relative
+    // URLs.
+    $scheme = file_uri_scheme($uri);
+    if (!$scheme || $scheme == 'public') {
+      // Shipped files.
+      if (!$scheme) {
+        $path = $uri;
+      }
+      // Public created files.
+      else {
+        $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme);
+        $path = $wrapper->getDirectoryPath() . '/' . file_uri_target($uri);
+      }
+
+      // Clean up Windows paths.
+      $path = str_replace('\\', '/', $path);
+
+      // Generate a protocol-relative URL.
+      $uri = '/' . base_path() . '/' . $path;
+    }
+  }
+}
+
+/**
+ * Implements hook_file_mimetype_mapping_alter().
+ */
+function file_test_file_mimetype_mapping_alter(&$mapping) {
+  // Add new mappings.
+  $mapping['mimetypes']['file_test_mimetype_1'] = 'madeup/file_test_1';
+  $mapping['mimetypes']['file_test_mimetype_2'] = 'madeup/file_test_2';
+  $mapping['mimetypes']['file_test_mimetype_3'] = 'madeup/doc';
+  $mapping['extensions']['file_test_1'] = 'file_test_mimetype_1';
+  $mapping['extensions']['file_test_2'] = 'file_test_mimetype_2';
+  $mapping['extensions']['file_test_3'] = 'file_test_mimetype_2';
+  // Override existing mapping.
+  $mapping['extensions']['doc'] = 'file_test_mimetype_3';
+}
+
+/**
+ * Helper class for testing the stream wrapper registry.
+ *
+ * Dummy stream wrapper implementation (dummy://).
+ */
+class DrupalDummyStreamWrapper extends DrupalLocalStreamWrapper {
+  function getDirectoryPath() {
+    return variable_get('stream_public_path', 'sites/default/files');
+  }
+
+  /**
+   * Override getInternalUri().
+   *
+   * Return a dummy path for testing.
+   */
+  function getInternalUri() {
+    return '/dummy/example.txt';
+  }
+
+  /**
+   * Override getExternalUrl().
+   *
+   * Return the HTML URI of a public file.
+   */
+  function getExternalUrl() {
+    return '/dummy/example.txt';
+  }
+}
+
+/**
+ * Helper class for testing the stream wrapper registry.
+ *
+ * Dummy remote stream wrapper implementation (dummy-remote://).
+ *
+ * Basically just the public scheme but not returning a local file for realpath.
+ */
+class DrupalDummyRemoteStreamWrapper extends DrupalPublicStreamWrapper {
+  function realpath() {
+    return FALSE;
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/filetransfer.test b/htmltest/modules/simpletest/tests/filetransfer.test
new file mode 100644
index 00000000..905d23ca
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/filetransfer.test
@@ -0,0 +1,168 @@
+<?php
+
+
+class FileTranferTest extends DrupalWebTestCase {
+  protected $hostname = 'localhost';
+  protected $username = 'drupal';
+  protected $password = 'password';
+  protected $port = '42';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'FileTransfer unit tests',
+      'description' => 'Test that the jail is respected and that protocols using recursive file move operations work.',
+      'group' => 'System'
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $this->testConnection = TestFileTransfer::factory(DRUPAL_ROOT, array('hostname' => $this->hostname, 'username' => $this->username, 'password' => $this->password, 'port' => $this->port));
+  }
+
+  function _getFakeModuleFiles() {
+    $files = array(
+      'fake.module',
+      'fake.info',
+      'theme' => array(
+        'fake.tpl.php'
+      ),
+      'inc' => array(
+        'fake.inc'
+      )
+    );
+    return $files;
+  }
+
+  function _buildFakeModule() {
+    $location = 'temporary://fake';
+    if (is_dir($location)) {
+      $ret = 0;
+      $output = array();
+      exec('rm -Rf ' . escapeshellarg($location), $output, $ret);
+      if ($ret != 0) {
+        throw new Exception('Error removing fake module directory.');
+      }
+    }
+
+    $files = $this->_getFakeModuleFiles();
+    $this->_writeDirectory($location, $files);
+    return $location;
+  }
+
+  function _writeDirectory($base, $files = array()) {
+    mkdir($base);
+    foreach ($files as $key => $file) {
+      if (is_array($file)) {
+        $this->_writeDirectory($base . DIRECTORY_SEPARATOR . $key, $file);
+      }
+      else {
+        //just write the filename into the file
+        file_put_contents($base . DIRECTORY_SEPARATOR . $file, $file);
+      }
+    }
+  }
+
+  function testJail() {
+    $source = $this->_buildFakeModule();
+
+    // This convoluted piece of code is here because our testing framework does
+    // not support expecting exceptions.
+    $gotit = FALSE;
+    try {
+      $this->testConnection->copyDirectory($source, '/tmp');
+    }
+    catch (FileTransferException $e) {
+      $gotit = TRUE;
+    }
+    $this->assertTrue($gotit, 'Was not able to copy a directory outside of the jailed area.');
+
+    $gotit = TRUE;
+    try {
+      $this->testConnection->copyDirectory($source, DRUPAL_ROOT . '/'. variable_get('file_public_path', conf_path() . '/files'));
+    }
+    catch (FileTransferException $e) {
+      $gotit = FALSE;
+    }
+    $this->assertTrue($gotit, 'Was able to copy a directory inside of the jailed area');
+  }
+}
+
+/**
+ * Mock FileTransfer object for test case.
+ */
+class TestFileTransfer extends FileTransfer {
+  protected $host = NULL;
+  protected $username = NULL;
+  protected $password = NULL;
+  protected $port = NULL;
+
+  /**
+   * This is for testing the CopyRecursive logic.
+   */
+  public $shouldIsDirectoryReturnTrue = FALSE;
+
+  function __construct($jail, $username, $password, $hostname = 'localhost', $port = 9999) {
+    parent::__construct($jail, $username, $password, $hostname, $port);
+  }
+
+  static function factory($jail, $settings) {
+    return new TestFileTransfer($jail, $settings['username'], $settings['password'], $settings['hostname'], $settings['port']);
+  }
+
+  function connect() {
+    $parts = explode(':', $this->hostname);
+    $port = (count($parts) == 2) ? $parts[1] : $this->port;
+    $this->connection = new MockTestConnection();
+    $this->connection->connectionString = 'test://' . urlencode($this->username) . ':' . urlencode($this->password) . "@$this->host:$this->port/";
+  }
+
+  function copyFileJailed($source, $destination) {
+    $this->connection->run("copyFile $source $destination");
+  }
+
+  protected function removeDirectoryJailed($directory) {
+    $this->connection->run("rmdir $directory");
+  }
+
+  function createDirectoryJailed($directory) {
+    $this->connection->run("mkdir $directory");
+  }
+
+  function removeFileJailed($destination) {
+    if (!ftp_delete($this->connection, $item)) {
+      throw new FileTransferException('Unable to remove to file @file.', NULL, array('@file' => $item));
+    }
+  }
+
+  function isDirectory($path) {
+    return $this->shouldIsDirectoryReturnTrue;
+  }
+
+  function isFile($path) {
+    return FALSE;
+  }
+
+  function chmodJailed($path, $mode, $recursive) {
+    return;
+  }
+}
+
+/**
+ * Mock connection object for test case.
+ */
+class MockTestConnection {
+
+  var $commandsRun = array();
+  var $connectionString;
+
+  function run($cmd) {
+    $this->commandsRun[] = $cmd;
+  }
+
+  function flushCommands() {
+    $out = $this->commandsRun;
+    $this->commandsRun = array();
+    return $out;
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/filter_test.info b/htmltest/modules/simpletest/tests/filter_test.info
new file mode 100644
index 00000000..59468743
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/filter_test.info
@@ -0,0 +1,12 @@
+name = Filter test module
+description = Tests filter hooks and functions.
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/filter_test.module b/htmltest/modules/simpletest/tests/filter_test.module
new file mode 100644
index 00000000..63b7f66d
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/filter_test.module
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * @file
+ * Test module for Filter module hooks and functions not used in core.
+ */
+
+/**
+ * Implements hook_filter_format_insert().
+ */
+function filter_test_filter_format_insert($format) {
+  drupal_set_message('hook_filter_format_insert invoked.');
+}
+
+/**
+ * Implements hook_filter_format_update().
+ */
+function filter_test_filter_format_update($format) {
+  drupal_set_message('hook_filter_format_update invoked.');
+}
+
+/**
+ * Implements hook_filter_format_disable().
+ */
+function filter_test_filter_format_disable($format) {
+  drupal_set_message('hook_filter_format_disable invoked.');
+}
+
+/**
+ * Implements hook_filter_info().
+ */
+function filter_test_filter_info() {
+  $filters['filter_test_uncacheable'] = array(
+    'title' => 'Uncacheable filter',
+    'description' => 'Does nothing, but makes a text format uncacheable.',
+    'cache' => FALSE,
+  );
+  $filters['filter_test_replace'] = array(
+    'title' => 'Testing filter',
+    'description' => 'Replaces all content with filter and text format information.',
+    'process callback' => 'filter_test_replace',
+  );
+  return $filters;
+}
+
+/**
+ * Implements callback_filter_process().
+ *
+ * Process handler for filter_test_replace filter.
+ *
+ * Replaces all text with filter and text format information.
+ */
+function filter_test_replace($text, $filter, $format, $langcode, $cache, $cache_id) {
+  $text = array();
+  $text[] = 'Filter: ' . $filter->title . ' (' . $filter->name . ')';
+  $text[] = 'Format: ' . $format->name . ' (' . $format->format . ')';
+  $text[] = 'Language: ' . $langcode;
+  $text[] = 'Cache: ' . ($cache ? 'Enabled' : 'Disabled');
+  if ($cache_id) {
+    $text[] = 'Cache ID: ' . $cache_id;
+  }
+  return implode("<br />\n", $text);
+}
+
diff --git a/htmltest/modules/simpletest/tests/form.test b/htmltest/modules/simpletest/tests/form.test
new file mode 100644
index 00000000..8b63be4f
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/form.test
@@ -0,0 +1,1846 @@
+<?php
+
+/**
+ * @file
+ * Unit tests for the Drupal Form API.
+ */
+
+class FormsTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Form element validation',
+      'description' => 'Tests various form element validation mechanisms.',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+  }
+
+  /**
+   * Check several empty values for required forms elements.
+   *
+   * Carriage returns, tabs, spaces, and unchecked checkbox elements are not
+   * valid content for a required field.
+   *
+   * If the form field is found in form_get_errors() then the test pass.
+   */
+  function testRequiredFields() {
+    // Originates from http://drupal.org/node/117748
+    // Sets of empty strings and arrays.
+    $empty_strings = array('""' => "", '"\n"' => "\n", '" "' => " ", '"\t"' => "\t", '" \n\t "' => " \n\t ", '"\n\n\n\n\n"' => "\n\n\n\n\n");
+    $empty_arrays = array('array()' => array());
+    $empty_checkbox = array(NULL);
+
+    $elements['textfield']['element'] = array('#title' => $this->randomName(), '#type' => 'textfield');
+    $elements['textfield']['empty_values'] = $empty_strings;
+
+    $elements['password']['element'] = array('#title' => $this->randomName(), '#type' => 'password');
+    $elements['password']['empty_values'] = $empty_strings;
+
+    $elements['password_confirm']['element'] = array('#title' => $this->randomName(), '#type' => 'password_confirm');
+    // Provide empty values for both password fields.
+    foreach ($empty_strings as $key => $value) {
+      $elements['password_confirm']['empty_values'][$key] = array('pass1' => $value, 'pass2' => $value);
+    }
+
+    $elements['textarea']['element'] = array('#title' => $this->randomName(), '#type' => 'textarea');
+    $elements['textarea']['empty_values'] = $empty_strings;
+
+    $elements['radios']['element'] = array('#title' => $this->randomName(), '#type' => 'radios', '#options' => array('' => t('None'), $this->randomName(), $this->randomName(), $this->randomName()));
+    $elements['radios']['empty_values'] = $empty_arrays;
+
+    $elements['checkbox']['element'] = array('#title' => $this->randomName(), '#type' => 'checkbox', '#required' => TRUE);
+    $elements['checkbox']['empty_values'] = $empty_checkbox;
+
+    $elements['checkboxes']['element'] = array('#title' => $this->randomName(), '#type' => 'checkboxes', '#options' => array($this->randomName(), $this->randomName(), $this->randomName()));
+    $elements['checkboxes']['empty_values'] = $empty_arrays;
+
+    $elements['select']['element'] = array('#title' => $this->randomName(), '#type' => 'select', '#options' => array('' => t('None'), $this->randomName(), $this->randomName(), $this->randomName()));
+    $elements['select']['empty_values'] = $empty_strings;
+
+    $elements['file']['element'] = array('#title' => $this->randomName(), '#type' => 'file');
+    $elements['file']['empty_values'] = $empty_strings;
+
+    // Regular expression to find the expected marker on required elements.
+    $required_marker_preg = '@<label.*<span class="form-required" title="This field is required\.">\*</span></label>@';
+
+    // Go through all the elements and all the empty values for them.
+    foreach ($elements as $type => $data) {
+      foreach ($data['empty_values'] as $key => $empty) {
+        foreach (array(TRUE, FALSE) as $required) {
+          $form_id = $this->randomName();
+          $form = array();
+          $form_state = form_state_defaults();
+          form_clear_error();
+          $form['op'] = array('#type' => 'submit', '#value' => t('Submit'));
+          $element = $data['element']['#title'];
+          $form[$element] = $data['element'];
+          $form[$element]['#required'] = $required;
+          $form_state['input'][$element] = $empty;
+          $form_state['input']['form_id'] = $form_id;
+          $form_state['method'] = 'post';
+
+          // The form token CSRF protection should not interfere with this test,
+          // so we bypass it by marking this test form as programmed.
+          $form_state['programmed'] = TRUE;
+          drupal_prepare_form($form_id, $form, $form_state);
+          drupal_process_form($form_id, $form, $form_state);
+          $errors = form_get_errors();
+          // Form elements of type 'radios' throw all sorts of PHP notices
+          // when you try to render them like this, so we ignore those for
+          // testing the required marker.
+          // @todo Fix this work-around (http://drupal.org/node/588438).
+          $form_output = ($type == 'radios') ? '' : drupal_render($form);
+          if ($required) {
+            // Make sure we have a form error for this element.
+            $this->assertTrue(isset($errors[$element]), "Check empty($key) '$type' field '$element'");
+            if (!empty($form_output)) {
+              // Make sure the form element is marked as required.
+              $this->assertTrue(preg_match($required_marker_preg, $form_output), "Required '$type' field is marked as required");
+            }
+          }
+          else {
+            if (!empty($form_output)) {
+              // Make sure the form element is *not* marked as required.
+              $this->assertFalse(preg_match($required_marker_preg, $form_output), "Optional '$type' field is not marked as required");
+            }
+            if ($type == 'select') {
+              // Select elements are going to have validation errors with empty
+              // input, since those are illegal choices. Just make sure the
+              // error is not "field is required".
+              $this->assertTrue((empty($errors[$element]) || strpos('field is required', $errors[$element]) === FALSE), "Optional '$type' field '$element' is not treated as a required element");
+            }
+            else {
+              // Make sure there is *no* form error for this element.
+              $this->assertTrue(empty($errors[$element]), "Optional '$type' field '$element' has no errors with empty input");
+            }
+          }
+        }
+      }
+    }
+    // Clear the expected form error messages so they don't appear as exceptions.
+    drupal_get_messages();
+  }
+
+  /**
+   * Tests validation for required checkbox, select, and radio elements.
+   *
+   * Submits a test form containing several types of form elements. The form
+   * is submitted twice, first without values for required fields and then
+   * with values. Each submission is checked for relevant error messages.
+   *
+   * @see form_test_validate_required_form()
+   */
+  function testRequiredCheckboxesRadio() {
+    $form = $form_state = array();
+    $form = form_test_validate_required_form($form, $form_state);
+
+    // Attempt to submit the form with no required fields set.
+    $edit = array();
+    $this->drupalPost('form-test/validate-required', $edit, 'Submit');
+
+    // The only error messages that should appear are the relevant 'required'
+    // messages for each field.
+    $expected = array();
+    foreach (array('textfield', 'checkboxes', 'select', 'radios') as $key) {
+      $expected[] = t('!name field is required.', array('!name' => $form[$key]['#title']));
+    }
+
+    // Check the page for error messages.
+    $errors = $this->xpath('//div[contains(@class, "error")]//li');
+    foreach ($errors as $error) {
+      $expected_key = array_search($error[0], $expected);
+      // If the error message is not one of the expected messages, fail.
+      if ($expected_key === FALSE) {
+        $this->fail(format_string("Unexpected error message: @error", array('@error' => $error[0])));
+      }
+      // Remove the expected message from the list once it is found.
+      else {
+        unset($expected[$expected_key]);
+      }
+    }
+
+    // Fail if any expected messages were not found.
+    foreach ($expected as $not_found) {
+      $this->fail(format_string("Found error message: @error", array('@error' => $not_found)));
+    }
+
+    // Verify that input elements are still empty.
+    $this->assertFieldByName('textfield', '');
+    $this->assertNoFieldChecked('edit-checkboxes-foo');
+    $this->assertNoFieldChecked('edit-checkboxes-bar');
+    $this->assertOptionSelected('edit-select', '');
+    $this->assertNoFieldChecked('edit-radios-foo');
+    $this->assertNoFieldChecked('edit-radios-bar');
+    $this->assertNoFieldChecked('edit-radios-optional-foo');
+    $this->assertNoFieldChecked('edit-radios-optional-bar');
+    $this->assertNoFieldChecked('edit-radios-optional-default-value-false-foo');
+    $this->assertNoFieldChecked('edit-radios-optional-default-value-false-bar');
+
+    // Submit again with required fields set and verify that there are no
+    // error messages.
+    $edit = array(
+      'textfield' => $this->randomString(),
+      'checkboxes[foo]' => TRUE,
+      'select' => 'foo',
+      'radios' => 'bar',
+    );
+    $this->drupalPost(NULL, $edit, 'Submit');
+    $this->assertNoFieldByXpath('//div[contains(@class, "error")]', FALSE, 'No error message is displayed when all required fields are filled.');
+    $this->assertRaw("The form_test_validate_required_form form was submitted successfully.", 'Validation form submitted successfully.');
+  }
+
+  /**
+   * Tests validation for required textfield element without title.
+   *
+   * Submits a test form containing a textfield form elements without title.
+   * The form is submitted twice, first without value for the required field
+   * and then with value. Each submission is checked for relevant error
+   * messages.
+   *
+   * @see form_test_validate_required_form_no_title()
+   */
+  function testRequiredTextfieldNoTitle() {
+    $form = $form_state = array();
+    $form = form_test_validate_required_form_no_title($form, $form_state);
+
+    // Attempt to submit the form with no required field set.
+    $edit = array();
+    $this->drupalPost('form-test/validate-required-no-title', $edit, 'Submit');
+    $this->assertNoRaw("The form_test_validate_required_form_no_title form was submitted successfully.", 'Validation form submitted successfully.');
+
+    // Check the page for the error class on the textfield.
+    $this->assertFieldByXPath('//input[contains(@class, "error")]', FALSE, 'Error input form element class found.');
+
+    // Submit again with required fields set and verify that there are no
+    // error messages.
+    $edit = array(
+      'textfield' => $this->randomString(),
+    );
+    $this->drupalPost(NULL, $edit, 'Submit');
+    $this->assertNoFieldByXpath('//input[contains(@class, "error")]', FALSE, 'No error input form element class found.');
+    $this->assertRaw("The form_test_validate_required_form_no_title form was submitted successfully.", 'Validation form submitted successfully.');
+  }
+
+  /**
+   * Test default value handling for checkboxes.
+   *
+   * @see _form_test_checkbox()
+   */
+  function testCheckboxProcessing() {
+    // First, try to submit without the required checkbox.
+    $edit = array();
+    $this->drupalPost('form-test/checkbox', $edit, t('Submit'));
+    $this->assertRaw(t('!name field is required.', array('!name' => 'required_checkbox')), 'A required checkbox is actually mandatory');
+
+    // Now try to submit the form correctly.
+    $values = drupal_json_decode($this->drupalPost(NULL, array('required_checkbox' => 1), t('Submit')));
+    $expected_values = array(
+      'disabled_checkbox_on' => 'disabled_checkbox_on',
+      'disabled_checkbox_off' => '',
+      'checkbox_on' => 'checkbox_on',
+      'checkbox_off' => '',
+      'zero_checkbox_on' => '0',
+      'zero_checkbox_off' => '',
+    );
+    foreach ($expected_values as $widget => $expected_value) {
+      $this->assertEqual($values[$widget], $expected_value, format_string('Checkbox %widget returns expected value (expected: %expected, got: %value)', array(
+        '%widget' => var_export($widget, TRUE),
+        '%expected' => var_export($expected_value, TRUE),
+        '%value' => var_export($values[$widget], TRUE),
+      )));
+    }
+  }
+
+  /**
+   * Tests validation of #type 'select' elements.
+   */
+  function testSelect() {
+    $form = $form_state = array();
+    $form = form_test_select($form, $form_state);
+    $error = '!name field is required.';
+    $this->drupalGet('form-test/select');
+
+    // Posting without any values should throw validation errors.
+    $this->drupalPost(NULL, array(), 'Submit');
+    $this->assertNoText(t($error, array('!name' => $form['select']['#title'])));
+    $this->assertNoText(t($error, array('!name' => $form['select_required']['#title'])));
+    $this->assertNoText(t($error, array('!name' => $form['select_optional']['#title'])));
+    $this->assertNoText(t($error, array('!name' => $form['empty_value']['#title'])));
+    $this->assertNoText(t($error, array('!name' => $form['empty_value_one']['#title'])));
+    $this->assertText(t($error, array('!name' => $form['no_default']['#title'])));
+    $this->assertNoText(t($error, array('!name' => $form['no_default_optional']['#title'])));
+    $this->assertText(t($error, array('!name' => $form['no_default_empty_option']['#title'])));
+    $this->assertNoText(t($error, array('!name' => $form['no_default_empty_option_optional']['#title'])));
+    $this->assertText(t($error, array('!name' => $form['no_default_empty_value']['#title'])));
+    $this->assertText(t($error, array('!name' => $form['no_default_empty_value_one']['#title'])));
+    $this->assertNoText(t($error, array('!name' => $form['no_default_empty_value_optional']['#title'])));
+    $this->assertNoText(t($error, array('!name' => $form['multiple']['#title'])));
+    $this->assertNoText(t($error, array('!name' => $form['multiple_no_default']['#title'])));
+    $this->assertText(t($error, array('!name' => $form['multiple_no_default_required']['#title'])));
+
+    // Post values for required fields.
+    $edit = array(
+      'no_default' => 'three',
+      'no_default_empty_option' => 'three',
+      'no_default_empty_value' => 'three',
+      'no_default_empty_value_one' => 'three',
+      'multiple_no_default_required[]' => 'three',
+    );
+    $this->drupalPost(NULL, $edit, 'Submit');
+    $values = drupal_json_decode($this->drupalGetContent());
+
+    // Verify expected values.
+    $expected = array(
+      'select' => 'one',
+      'empty_value' => 'one',
+      'empty_value_one' => 'one',
+      'no_default' => 'three',
+      'no_default_optional' => 'one',
+      'no_default_optional_empty_value' => '',
+      'no_default_empty_option' => 'three',
+      'no_default_empty_option_optional' => '',
+      'no_default_empty_value' => 'three',
+      'no_default_empty_value_one' => 'three',
+      'no_default_empty_value_optional' => 0,
+      'multiple' => array('two' => 'two'),
+      'multiple_no_default' => array(),
+      'multiple_no_default_required' => array('three' => 'three'),
+    );
+    foreach ($expected as $key => $value) {
+      $this->assertIdentical($values[$key], $value, format_string('@name: @actual is equal to @expected.', array(
+        '@name' => $key,
+        '@actual' => var_export($values[$key], TRUE),
+        '@expected' => var_export($value, TRUE),
+      )));
+    }
+  }
+
+  /**
+   * Test handling of disabled elements.
+   *
+   * @see _form_test_disabled_elements()
+   */
+  function testDisabledElements() {
+    // Get the raw form in its original state.
+    $form_state = array();
+    $form = _form_test_disabled_elements(array(), $form_state);
+
+    // Build a submission that tries to hijack the form by submitting input for
+    // elements that are disabled.
+    $edit = array();
+    foreach (element_children($form) as $key) {
+      if (isset($form[$key]['#test_hijack_value'])) {
+        if (is_array($form[$key]['#test_hijack_value'])) {
+          foreach ($form[$key]['#test_hijack_value'] as $subkey => $value) {
+            $edit[$key . '[' . $subkey . ']'] = $value;
+          }
+        }
+        else {
+          $edit[$key] = $form[$key]['#test_hijack_value'];
+        }
+      }
+    }
+
+    // Submit the form with no input, as the browser does for disabled elements,
+    // and fetch the $form_state['values'] that is passed to the submit handler.
+    $this->drupalPost('form-test/disabled-elements', array(), t('Submit'));
+    $returned_values['normal'] = drupal_json_decode($this->content);
+
+    // Do the same with input, as could happen if JavaScript un-disables an
+    // element. drupalPost() emulates a browser by not submitting input for
+    // disabled elements, so we need to un-disable those elements first.
+    $this->drupalGet('form-test/disabled-elements');
+    $disabled_elements = array();
+    foreach ($this->xpath('//*[@disabled]') as $element) {
+      $disabled_elements[] = (string) $element['name'];
+      unset($element['disabled']);
+    }
+
+    // All the elements should be marked as disabled, including the ones below
+    // the disabled container.
+    $this->assertEqual(count($disabled_elements), 32, 'The correct elements have the disabled property in the HTML code.');
+
+    $this->drupalPost(NULL, $edit, t('Submit'));
+    $returned_values['hijacked'] = drupal_json_decode($this->content);
+
+    // Ensure that the returned values match the form's default values in both
+    // cases.
+    foreach ($returned_values as $type => $values) {
+      $this->assertFormValuesDefault($values, $form);
+    }
+  }
+
+  /**
+   * Assert that the values submitted to a form matches the default values of the elements.
+   */
+  function assertFormValuesDefault($values, $form) {
+    foreach (element_children($form) as $key) {
+      if (isset($form[$key]['#default_value'])) {
+        if (isset($form[$key]['#expected_value'])) {
+          $expected_value = $form[$key]['#expected_value'];
+        }
+        else {
+          $expected_value = $form[$key]['#default_value'];
+        }
+
+        if ($key == 'checkboxes_multiple') {
+          // Checkboxes values are not filtered out.
+          $values[$key] = array_filter($values[$key]);
+        }
+        $this->assertIdentical($expected_value, $values[$key], format_string('Default value for %type: expected %expected, returned %returned.', array('%type' => $key, '%expected' => var_export($expected_value, TRUE), '%returned' => var_export($values[$key], TRUE))));
+      }
+
+      // Recurse children.
+      $this->assertFormValuesDefault($values, $form[$key]);
+    }
+  }
+
+  /**
+   * Verify markup for disabled form elements.
+   *
+   * @see _form_test_disabled_elements()
+   */
+  function testDisabledMarkup() {
+    $this->drupalGet('form-test/disabled-elements');
+    $form_state = array();
+    $form = _form_test_disabled_elements(array(), $form_state);
+    $type_map = array(
+      'textarea' => 'textarea',
+      'select' => 'select',
+      'weight' => 'select',
+      'date' => 'select',
+    );
+
+    foreach ($form as $name => $item) {
+      // Skip special #types.
+      if (!isset($item['#type']) || in_array($item['#type'], array('hidden', 'text_format'))) {
+        continue;
+      }
+      // Setup XPath and CSS class depending on #type.
+      if (in_array($item['#type'], array('image_button', 'button', 'submit'))) {
+        $path = "//!type[contains(@class, :div-class) and @value=:value]";
+        $class = 'form-button-disabled';
+      }
+      else {
+        // starts-with() required for checkboxes.
+        $path = "//div[contains(@class, :div-class)]/descendant::!type[starts-with(@name, :name)]";
+        $class = 'form-disabled';
+      }
+      // Replace DOM element name in $path according to #type.
+      $type = 'input';
+      if (isset($type_map[$item['#type']])) {
+        $type = $type_map[$item['#type']];
+      }
+      $path = strtr($path, array('!type' => $type));
+      // Verify that the element exists.
+      $element = $this->xpath($path, array(
+        ':name' => check_plain($name),
+        ':div-class' => $class,
+        ':value' => isset($item['#value']) ? $item['#value'] : '',
+      ));
+      $this->assertTrue(isset($element[0]), format_string('Disabled form element class found for #type %type.', array('%type' => $item['#type'])));
+    }
+
+    // Verify special element #type text-format.
+    $element = $this->xpath('//div[contains(@class, :div-class)]/descendant::textarea[@name=:name]', array(
+      ':name' => 'text_format[value]',
+      ':div-class' => 'form-disabled',
+    ));
+    $this->assertTrue(isset($element[0]), format_string('Disabled form element class found for #type %type.', array('%type' => 'text_format[value]')));
+    $element = $this->xpath('//div[contains(@class, :div-class)]/descendant::select[@name=:name]', array(
+      ':name' => 'text_format[format]',
+      ':div-class' => 'form-disabled',
+    ));
+    $this->assertTrue(isset($element[0]), format_string('Disabled form element class found for #type %type.', array('%type' => 'text_format[format]')));
+  }
+
+  /**
+   * Test Form API protections against input forgery.
+   *
+   * @see _form_test_input_forgery()
+   */
+  function testInputForgery() {
+    $this->drupalGet('form-test/input-forgery');
+    $checkbox = $this->xpath('//input[@name="checkboxes[two]"]');
+    $checkbox[0]['value'] = 'FORGERY';
+    $this->drupalPost(NULL, array('checkboxes[one]' => TRUE, 'checkboxes[two]' => TRUE), t('Submit'));
+    $this->assertText('An illegal choice has been detected.', 'Input forgery was detected.');
+  }
+}
+
+/**
+ * Tests building and processing of core form elements.
+ */
+class FormElementTestCase extends DrupalWebTestCase {
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Element processing',
+      'description' => 'Tests building and processing of core form elements.',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('form_test'));
+  }
+
+  /**
+   * Tests expansion of #options for #type checkboxes and radios.
+   */
+  function testOptions() {
+    $this->drupalGet('form-test/checkboxes-radios');
+
+    // Verify that all options appear in their defined order.
+    foreach (array('checkbox', 'radio') as $type) {
+      $elements = $this->xpath('//input[@type=:type]', array(':type' => $type));
+      $expected_values = array('0', 'foo', '1', 'bar', '>');
+      foreach ($elements as $element) {
+        $expected = array_shift($expected_values);
+        $this->assertIdentical((string) $element['value'], $expected);
+      }
+    }
+
+    // Enable customized option sub-elements.
+    $this->drupalGet('form-test/checkboxes-radios/customize');
+
+    // Verify that all options appear in their defined order, taking a custom
+    // #weight into account.
+    foreach (array('checkbox', 'radio') as $type) {
+      $elements = $this->xpath('//input[@type=:type]', array(':type' => $type));
+      $expected_values = array('0', 'foo', 'bar', '>', '1');
+      foreach ($elements as $element) {
+        $expected = array_shift($expected_values);
+        $this->assertIdentical((string) $element['value'], $expected);
+      }
+    }
+    // Verify that custom #description properties are output.
+    foreach (array('checkboxes', 'radios') as $type) {
+      $elements = $this->xpath('//input[@id=:id]/following-sibling::div[@class=:class]', array(
+        ':id' => 'edit-' . $type . '-foo',
+        ':class' => 'description',
+      ));
+      $this->assertTrue(count($elements), format_string('Custom %type option description found.', array(
+        '%type' => $type,
+      )));
+    }
+  }
+}
+
+/**
+ * Test form alter hooks.
+ */
+class FormAlterTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Form alter hooks',
+      'description' => 'Tests hook_form_alter() and hook_form_FORM_ID_alter().',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+  }
+
+  /**
+   * Tests execution order of hook_form_alter() and hook_form_FORM_ID_alter().
+   */
+  function testExecutionOrder() {
+    $this->drupalGet('form-test/alter');
+    // Ensure that the order is first by module, then for a given module, the
+    // id-specific one after the generic one.
+    $expected = array(
+      'block_form_form_test_alter_form_alter() executed.',
+      'form_test_form_alter() executed.',
+      'form_test_form_form_test_alter_form_alter() executed.',
+      'system_form_form_test_alter_form_alter() executed.',
+    );
+    $content = preg_replace('/\s+/', ' ', filter_xss($this->content, array()));
+    $this->assert(strpos($content, implode(' ', $expected)) !== FALSE, 'Form alter hooks executed in the expected order.');
+  }
+}
+
+/**
+ * Test form validation handlers.
+ */
+class FormValidationTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Form validation handlers',
+      'description' => 'Tests form processing and alteration via form validation handlers.',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+  }
+
+  /**
+   * Tests form alterations by #element_validate, #validate, and form_set_value().
+   */
+  function testValidate() {
+    $this->drupalGet('form-test/validate');
+    // Verify that #element_validate handlers can alter the form and submitted
+    // form values.
+    $edit = array(
+      'name' => 'element_validate',
+    );
+    $this->drupalPost(NULL, $edit, 'Save');
+    $this->assertFieldByName('name', '#value changed by #element_validate', 'Form element #value was altered.');
+    $this->assertText('Name value: value changed by form_set_value() in #element_validate', 'Form element value in $form_state was altered.');
+
+    // Verify that #validate handlers can alter the form and submitted
+    // form values.
+    $edit = array(
+      'name' => 'validate',
+    );
+    $this->drupalPost(NULL, $edit, 'Save');
+    $this->assertFieldByName('name', '#value changed by #validate', 'Form element #value was altered.');
+    $this->assertText('Name value: value changed by form_set_value() in #validate', 'Form element value in $form_state was altered.');
+
+    // Verify that #element_validate handlers can make form elements
+    // inaccessible, but values persist.
+    $edit = array(
+      'name' => 'element_validate_access',
+    );
+    $this->drupalPost(NULL, $edit, 'Save');
+    $this->assertNoFieldByName('name', 'Form element was hidden.');
+    $this->assertText('Name value: element_validate_access', 'Value for inaccessible form element exists.');
+
+    // Verify that value for inaccessible form element persists.
+    $this->drupalPost(NULL, array(), 'Save');
+    $this->assertNoFieldByName('name', 'Form element was hidden.');
+    $this->assertText('Name value: element_validate_access', 'Value for inaccessible form element exists.');
+
+    // Verify that #validate handlers don't run if the CSRF token is invalid.
+    $this->drupalLogin($this->drupalCreateUser());
+    $this->drupalGet('form-test/validate');
+    $edit = array(
+      'name' => 'validate',
+      'form_token' => 'invalid token'
+    );
+    $this->drupalPost(NULL, $edit, 'Save');
+    $this->assertNoFieldByName('name', '#value changed by #validate', 'Form element #value was not altered.');
+    $this->assertNoText('Name value: value changed by form_set_value() in #validate', 'Form element value in $form_state was not altered.');
+    $this->assertText('The form has become outdated. Copy any unsaved work in the form below');
+  }
+
+  /**
+   * Tests partial form validation through #limit_validation_errors.
+   */
+  function testValidateLimitErrors() {
+    $edit = array(
+      'test' => 'invalid',
+      'test_numeric_index[0]' => 'invalid',
+      'test_substring[foo]' => 'invalid',
+    );
+    $path = 'form-test/limit-validation-errors';
+
+    // Submit the form by pressing the 'Partial validate' button (uses
+    // #limit_validation_errors) and ensure that the title field is not
+    // validated, but the #element_validate handler for the 'test' field
+    // is triggered.
+    $this->drupalPost($path, $edit, t('Partial validate'));
+    $this->assertNoText(t('!name field is required.', array('!name' => 'Title')));
+    $this->assertText('Test element is invalid');
+
+    // Edge case of #limit_validation_errors containing numeric indexes: same
+    // thing with the 'Partial validate (numeric index)' button and the
+    // 'test_numeric_index' field.
+    $this->drupalPost($path, $edit, t('Partial validate (numeric index)'));
+    $this->assertNoText(t('!name field is required.', array('!name' => 'Title')));
+    $this->assertText('Test (numeric index) element is invalid');
+
+    // Ensure something like 'foobar' isn't considered "inside" 'foo'.
+    $this->drupalPost($path, $edit, t('Partial validate (substring)'));
+    $this->assertNoText(t('!name field is required.', array('!name' => 'Title')));
+    $this->assertText('Test (substring) foo element is invalid');
+
+    // Ensure not validated values are not available to submit handlers.
+    $this->drupalPost($path, array('title' => '', 'test' => 'valid'), t('Partial validate'));
+    $this->assertText('Only validated values appear in the form values.');
+
+    // Now test full form validation and ensure that the #element_validate
+    // handler is still triggered.
+    $this->drupalPost($path, $edit, t('Full validate'));
+    $this->assertText(t('!name field is required.', array('!name' => 'Title')));
+    $this->assertText('Test element is invalid');
+  }
+
+  /**
+   *  Tests error border of multiple fields with same name in a page.
+   */
+  function testMultiFormSameNameErrorClass() {
+    $this->drupalGet('form-test/double-form');
+    $edit = array();
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertFieldByXpath('//input[@id="edit-name" and contains(@class, "error")]', NULL, 'Error input form element class found for first element.');
+    $this->assertNoFieldByXpath('//input[@id="edit-name--2" and contains(@class, "error")]', NULL, 'No error input form element class found for second element.');
+  }
+}
+
+/**
+ * Test form element labels, required markers and associated output.
+ */
+class FormsElementsLabelsTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Form element and label output test',
+      'description' => 'Test form element labels, required markers and associated output.',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+  }
+
+  /**
+   * Test form elements, labels, title attibutes and required marks output
+   * correctly and have the correct label option class if needed.
+   */
+  function testFormLabels() {
+    $this->drupalGet('form_test/form-labels');
+
+    // Check that the checkbox/radio processing is not interfering with
+    // basic placement.
+    $elements = $this->xpath('//input[@id="edit-form-checkboxes-test-third-checkbox"]/following-sibling::label[@for="edit-form-checkboxes-test-third-checkbox" and @class="option"]');
+    $this->assertTrue(isset($elements[0]), "Label follows field and label option class correct for regular checkboxes.");
+
+    // Make sure the label is rendered for checkboxes.
+    $elements = $this->xpath('//input[@id="edit-form-checkboxes-test-0"]/following-sibling::label[@for="edit-form-checkboxes-test-0" and @class="option"]');
+    $this->assertTrue(isset($elements[0]), "Label 0 found checkbox.");
+
+    $elements = $this->xpath('//input[@id="edit-form-radios-test-second-radio"]/following-sibling::label[@for="edit-form-radios-test-second-radio" and @class="option"]');
+    $this->assertTrue(isset($elements[0]), "Label follows field and label option class correct for regular radios.");
+
+    // Make sure the label is rendered for radios.
+    $elements = $this->xpath('//input[@id="edit-form-radios-test-0"]/following-sibling::label[@for="edit-form-radios-test-0" and @class="option"]');
+    $this->assertTrue(isset($elements[0]), "Label 0 found radios.");
+
+    // Exercise various defaults for checkboxes and modifications to ensure
+    // appropriate override and correct behavior.
+    $elements = $this->xpath('//input[@id="edit-form-checkbox-test"]/following-sibling::label[@for="edit-form-checkbox-test" and @class="option"]');
+    $this->assertTrue(isset($elements[0]), "Label follows field and label option class correct for a checkbox by default.");
+
+    // Exercise various defaults for textboxes and modifications to ensure
+    // appropriate override and correct behavior.
+    $elements = $this->xpath('//label[@for="edit-form-textfield-test-title-and-required"]/child::span[@class="form-required"]/parent::*/following-sibling::input[@id="edit-form-textfield-test-title-and-required"]');
+    $this->assertTrue(isset($elements[0]), "Label precedes textfield, with required marker inside label.");
+
+    $elements = $this->xpath('//input[@id="edit-form-textfield-test-no-title-required"]/preceding-sibling::label[@for="edit-form-textfield-test-no-title-required"]/span[@class="form-required"]');
+    $this->assertTrue(isset($elements[0]), "Label tag with required marker precedes required textfield with no title.");
+
+    $elements = $this->xpath('//input[@id="edit-form-textfield-test-title-invisible"]/preceding-sibling::label[@for="edit-form-textfield-test-title-invisible" and @class="element-invisible"]');
+    $this->assertTrue(isset($elements[0]), "Label preceding field and label class is element-invisible.");
+
+    $elements = $this->xpath('//input[@id="edit-form-textfield-test-title"]/preceding-sibling::span[@class="form-required"]');
+    $this->assertFalse(isset($elements[0]), "No required marker on non-required field.");
+
+    $elements = $this->xpath('//input[@id="edit-form-textfield-test-title-after"]/following-sibling::label[@for="edit-form-textfield-test-title-after" and @class="option"]');
+    $this->assertTrue(isset($elements[0]), "Label after field and label option class correct for text field.");
+
+    $elements = $this->xpath('//label[@for="edit-form-textfield-test-title-no-show"]');
+    $this->assertFalse(isset($elements[0]), "No label tag when title set not to display.");
+
+    // Check #field_prefix and #field_suffix placement.
+    $elements = $this->xpath('//span[@class="field-prefix"]/following-sibling::div[@id="edit-form-radios-test"]');
+    $this->assertTrue(isset($elements[0]), "Properly placed the #field_prefix element after the label and before the field.");
+
+    $elements = $this->xpath('//span[@class="field-suffix"]/preceding-sibling::div[@id="edit-form-radios-test"]');
+    $this->assertTrue(isset($elements[0]), "Properly places the #field_suffix element immediately after the form field.");
+
+    // Check #prefix and #suffix placement.
+    $elements = $this->xpath('//div[@id="form-test-textfield-title-prefix"]/following-sibling::div[contains(@class, \'form-item-form-textfield-test-title\')]');
+    $this->assertTrue(isset($elements[0]), "Properly places the #prefix element before the form item.");
+
+    $elements = $this->xpath('//div[@id="form-test-textfield-title-suffix"]/preceding-sibling::div[contains(@class, \'form-item-form-textfield-test-title\')]');
+    $this->assertTrue(isset($elements[0]), "Properly places the #suffix element before the form item.");
+
+    // Check title attribute for radios and checkboxes.
+    $elements = $this->xpath('//div[@id="edit-form-checkboxes-title-attribute"]');
+    $this->assertEqual($elements[0]['title'], 'Checkboxes test' . ' (' . t('Required') . ')', 'Title attribute found.');
+    $elements = $this->xpath('//div[@id="edit-form-radios-title-attribute"]');
+    $this->assertEqual($elements[0]['title'], 'Radios test' . ' (' . t('Required') . ')', 'Title attribute found.');
+  }
+}
+
+/**
+ * Test the tableselect form element for expected behavior.
+ */
+class FormsElementsTableSelectFunctionalTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Tableselect form element type test',
+      'description' => 'Test the tableselect element for expected behavior',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+  }
+
+
+  /**
+   * Test the display of checkboxes when #multiple is TRUE.
+   */
+  function testMultipleTrue() {
+
+    $this->drupalGet('form_test/tableselect/multiple-true');
+
+    $this->assertNoText(t('Empty text.'), 'Empty text should not be displayed.');
+
+    // Test for the presence of the Select all rows tableheader.
+    $this->assertFieldByXPath('//th[@class="select-all"]', NULL, 'Presence of the "Select all" checkbox.');
+
+    $rows = array('row1', 'row2', 'row3');
+    foreach ($rows as $row) {
+      $this->assertFieldByXPath('//input[@type="checkbox"]', $row, format_string('Checkbox for value @row.', array('@row' => $row)));
+    }
+  }
+
+  /**
+   * Test the display of radios when #multiple is FALSE.
+   */
+  function testMultipleFalse() {
+    $this->drupalGet('form_test/tableselect/multiple-false');
+
+    $this->assertNoText(t('Empty text.'), 'Empty text should not be displayed.');
+
+    // Test for the absence of the Select all rows tableheader.
+    $this->assertNoFieldByXPath('//th[@class="select-all"]', '', 'Absence of the "Select all" checkbox.');
+
+    $rows = array('row1', 'row2', 'row3');
+    foreach ($rows as $row) {
+      $this->assertFieldByXPath('//input[@type="radio"]', $row, format_string('Radio button for value @row.', array('@row' => $row)));
+    }
+  }
+
+  /**
+   * Test the display of the #empty text when #options is an empty array.
+   */
+  function testEmptyText() {
+    $this->drupalGet('form_test/tableselect/empty-text');
+    $this->assertText(t('Empty text.'), 'Empty text should be displayed.');
+  }
+
+  /**
+   * Test the submission of single and multiple values when #multiple is TRUE.
+   */
+  function testMultipleTrueSubmit() {
+
+    // Test a submission with one checkbox checked.
+    $edit = array();
+    $edit['tableselect[row1]'] = TRUE;
+    $this->drupalPost('form_test/tableselect/multiple-true', $edit, 'Submit');
+
+    $this->assertText(t('Submitted: row1 = row1'), 'Checked checkbox row1');
+    $this->assertText(t('Submitted: row2 = 0'), 'Unchecked checkbox row2.');
+    $this->assertText(t('Submitted: row3 = 0'), 'Unchecked checkbox row3.');
+
+    // Test a submission with multiple checkboxes checked.
+    $edit['tableselect[row1]'] = TRUE;
+    $edit['tableselect[row3]'] = TRUE;
+    $this->drupalPost('form_test/tableselect/multiple-true', $edit, 'Submit');
+
+    $this->assertText(t('Submitted: row1 = row1'), 'Checked checkbox row1.');
+    $this->assertText(t('Submitted: row2 = 0'), 'Unchecked checkbox row2.');
+    $this->assertText(t('Submitted: row3 = row3'), 'Checked checkbox row3.');
+
+  }
+
+  /**
+   * Test submission of values when #multiple is FALSE.
+   */
+  function testMultipleFalseSubmit() {
+    $edit['tableselect'] = 'row1';
+    $this->drupalPost('form_test/tableselect/multiple-false', $edit, 'Submit');
+    $this->assertText(t('Submitted: row1'), 'Selected radio button');
+  }
+
+  /**
+   * Test the #js_select property.
+   */
+  function testAdvancedSelect() {
+    // When #multiple = TRUE a Select all checkbox should be displayed by default.
+    $this->drupalGet('form_test/tableselect/advanced-select/multiple-true-default');
+    $this->assertFieldByXPath('//th[@class="select-all"]', NULL, 'Display a "Select all" checkbox by default when #multiple is TRUE.');
+
+    // When #js_select is set to FALSE, a "Select all" checkbox should not be displayed.
+    $this->drupalGet('form_test/tableselect/advanced-select/multiple-true-no-advanced-select');
+    $this->assertNoFieldByXPath('//th[@class="select-all"]', NULL, 'Do not display a "Select all" checkbox when #js_select is FALSE.');
+
+    // A "Select all" checkbox never makes sense when #multiple = FALSE, regardless of the value of #js_select.
+    $this->drupalGet('form_test/tableselect/advanced-select/multiple-false-default');
+    $this->assertNoFieldByXPath('//th[@class="select-all"]', NULL, 'Do not display a "Select all" checkbox when #multiple is FALSE.');
+
+    $this->drupalGet('form_test/tableselect/advanced-select/multiple-false-advanced-select');
+    $this->assertNoFieldByXPath('//th[@class="select-all"]', NULL, 'Do not display a "Select all" checkbox when #multiple is FALSE, even when #js_select is TRUE.');
+  }
+
+
+  /**
+   * Test the whether the option checker gives an error on invalid tableselect values for checkboxes.
+   */
+  function testMultipleTrueOptionchecker() {
+
+    list($header, $options) = _form_test_tableselect_get_data();
+
+    $form['tableselect'] = array(
+      '#type' => 'tableselect',
+      '#header' => $header,
+      '#options' => $options,
+    );
+
+    // Test with a valid value.
+    list($processed_form, $form_state, $errors) = $this->formSubmitHelper($form, array('tableselect' => array('row1' => 'row1')));
+    $this->assertFalse(isset($errors['tableselect']), 'Option checker allows valid values for checkboxes.');
+
+    // Test with an invalid value.
+    list($processed_form, $form_state, $errors) = $this->formSubmitHelper($form, array('tableselect' => array('non_existing_value' => 'non_existing_value')));
+    $this->assertTrue(isset($errors['tableselect']), 'Option checker disallows invalid values for checkboxes.');
+
+  }
+
+
+  /**
+   * Test the whether the option checker gives an error on invalid tableselect values for radios.
+   */
+  function testMultipleFalseOptionchecker() {
+
+    list($header, $options) = _form_test_tableselect_get_data();
+
+    $form['tableselect'] = array(
+      '#type' => 'tableselect',
+      '#header' => $header,
+      '#options' => $options,
+      '#multiple' => FALSE,
+    );
+
+    // Test with a valid value.
+    list($processed_form, $form_state, $errors) = $this->formSubmitHelper($form, array('tableselect' => 'row1'));
+    $this->assertFalse(isset($errors['tableselect']), 'Option checker allows valid values for radio buttons.');
+
+    // Test with an invalid value.
+    list($processed_form, $form_state, $errors) = $this->formSubmitHelper($form, array('tableselect' => 'non_existing_value'));
+    $this->assertTrue(isset($errors['tableselect']), 'Option checker disallows invalid values for radio buttons.');
+  }
+
+
+  /**
+   * Helper function for the option check test to submit a form while collecting errors.
+   *
+   * @param $form_element
+   *   A form element to test.
+   * @param $edit
+   *   An array containing post data.
+   *
+   * @return
+   *   An array containing the processed form, the form_state and any errors.
+   */
+  private function formSubmitHelper($form, $edit) {
+    $form_id = $this->randomName();
+    $form_state = form_state_defaults();
+
+    $form['op'] = array('#type' => 'submit', '#value' => t('Submit'));
+
+    $form_state['input'] = $edit;
+    $form_state['input']['form_id'] = $form_id;
+
+    // The form token CSRF protection should not interfere with this test,
+    // so we bypass it by marking this test form as programmed.
+    $form_state['programmed'] = TRUE;
+
+    drupal_prepare_form($form_id, $form, $form_state);
+
+    drupal_process_form($form_id, $form, $form_state);
+
+    $errors = form_get_errors();
+
+    // Clear errors and messages.
+    drupal_get_messages();
+    form_clear_error();
+
+    // Return the processed form together with form_state and errors
+    // to allow the caller lowlevel access to the form.
+    return array($form, $form_state, $errors);
+  }
+
+}
+
+/**
+ * Test the vertical_tabs form element for expected behavior.
+ */
+class FormsElementsVerticalTabsFunctionalTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Vertical tabs form element type test',
+      'description' => 'Test the vertical_tabs element for expected behavior',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+  }
+
+  /**
+   * Ensures that vertical-tabs.js is included before collapse.js.
+   *
+   * Otherwise, collapse.js adds "SHOW" or "HIDE" labels to the tabs.
+   */
+  function testJavaScriptOrdering() {
+    $this->drupalGet('form_test/vertical-tabs');
+    $position1 = strpos($this->content, 'misc/vertical-tabs.js');
+    $position2 = strpos($this->content, 'misc/collapse.js');
+    $this->assertTrue($position1 !== FALSE && $position2 !== FALSE && $position1 < $position2, 'vertical-tabs.js is included before collapse.js');
+  }
+}
+
+/**
+ * Test the form storage on a multistep form.
+ *
+ * The tested form puts data into the storage during the initial form
+ * construction. These tests verify that there are no duplicate form
+ * constructions, with and without manual form caching activiated. Furthermore
+ * when a validation error occurs, it makes sure that changed form element
+ * values aren't lost due to a wrong form rebuild.
+ */
+class FormsFormStorageTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name'  => 'Multistep form using form storage',
+      'description'  => 'Tests a multistep form using form storage and makes sure validation and caching works right.',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+
+    $this->web_user = $this->drupalCreateUser(array('access content'));
+    $this->drupalLogin($this->web_user);
+  }
+
+  /**
+   * Tests using the form in a usual way.
+   */
+  function testForm() {
+    $this->drupalGet('form_test/form-storage');
+    $this->assertText('Form constructions: 1');
+
+    $edit = array('title' => 'new', 'value' => 'value_is_set');
+
+    // Use form rebuilding triggered by a submit button.
+    $this->drupalPost(NULL, $edit, 'Continue submit');
+    $this->assertText('Form constructions: 2');
+    $this->assertText('Form constructions: 3');
+
+    // Reset the form to the values of the storage, using a form rebuild
+    // triggered by button of type button.
+    $this->drupalPost(NULL, array('title' => 'changed'), 'Reset');
+    $this->assertFieldByName('title', 'new', 'Values have been resetted.');
+    // After rebuilding, the form has been cached.
+    $this->assertText('Form constructions: 4');
+
+    $this->drupalPost(NULL, $edit, 'Save');
+    $this->assertText('Form constructions: 4');
+    $this->assertText('Title: new', 'The form storage has stored the values.');
+  }
+
+  /**
+   * Tests using the form with an activated $form_state['cache'] property.
+   */
+  function testFormCached() {
+    $this->drupalGet('form_test/form-storage', array('query' => array('cache' => 1)));
+    $this->assertText('Form constructions: 1');
+
+    $edit = array('title' => 'new', 'value' => 'value_is_set');
+
+    // Use form rebuilding triggered by a submit button.
+    $this->drupalPost(NULL, $edit, 'Continue submit');
+    $this->assertText('Form constructions: 2');
+
+    // Reset the form to the values of the storage, using a form rebuild
+    // triggered by button of type button.
+    $this->drupalPost(NULL, array('title' => 'changed'), 'Reset');
+    $this->assertFieldByName('title', 'new', 'Values have been resetted.');
+    $this->assertText('Form constructions: 3');
+
+    $this->drupalPost(NULL, $edit, 'Save');
+    $this->assertText('Form constructions: 3');
+    $this->assertText('Title: new', 'The form storage has stored the values.');
+  }
+
+  /**
+   * Tests validation when form storage is used.
+   */
+  function testValidation() {
+    $this->drupalPost('form_test/form-storage', array('title' => '', 'value' => 'value_is_set'), 'Continue submit');
+    $this->assertPattern('/value_is_set/', 'The input values have been kept.');
+  }
+
+  /**
+   * Tests updating cached form storage during form validation.
+   *
+   * If form caching is enabled and a form stores data in the form storage, then
+   * the form storage also has to be updated in case of a validation error in
+   * the form. This test re-uses the existing form for multi-step tests, but
+   * triggers a special #element_validate handler to update the form storage
+   * during form validation, while another, required element in the form
+   * triggers a form validation error.
+   */
+  function testCachedFormStorageValidation() {
+    // Request the form with 'cache' query parameter to enable form caching.
+    $this->drupalGet('form_test/form-storage', array('query' => array('cache' => 1)));
+
+    // Skip step 1 of the multi-step form, since the first step copies over
+    // 'title' into form storage, but we want to verify that changes in the form
+    // storage are updated in the cache during form validation.
+    $edit = array('title' => 'foo');
+    $this->drupalPost(NULL, $edit, 'Continue submit');
+
+    // In step 2, trigger a validation error for the required 'title' field, and
+    // post the special 'change_title' value for the 'value' field, which
+    // conditionally invokes the #element_validate handler to update the form
+    // storage.
+    $edit = array('title' => '', 'value' => 'change_title');
+    $this->drupalPost(NULL, $edit, 'Save');
+
+    // At this point, the form storage should contain updated values, but we do
+    // not see them, because the form has not been rebuilt yet due to the
+    // validation error. Post again and verify that the rebuilt form contains
+    // the values of the updated form storage.
+    $this->drupalPost(NULL, array('title' => 'foo', 'value' => 'bar'), 'Save');
+    $this->assertText("The thing has been changed.", 'The altered form storage value was updated in cache and taken over.');
+  }
+
+  /**
+   * Tests a form using form state without using 'storage' to pass data from the
+   * constructor to a submit handler. The data has to persist even when caching
+   * gets activated, what may happen when a modules alter the form and adds
+   * #ajax properties.
+   */
+  function testFormStatePersist() {
+    // Test the form one time with caching activated and one time without.
+    $run_options = array(
+      array(),
+      array('query' => array('cache' => 1)),
+    );
+    foreach ($run_options as $options) {
+      $this->drupalPost('form-test/state-persist', array(), t('Submit'), $options);
+      // The submit handler outputs the value in $form_state, assert it's there.
+      $this->assertText('State persisted.');
+
+      // Test it again, but first trigger a validation error, then test.
+      $this->drupalPost('form-test/state-persist', array('title' => ''), t('Submit'), $options);
+      $this->assertText(t('!name field is required.', array('!name' => 'title')));
+      // Submit the form again triggering no validation error.
+      $this->drupalPost(NULL, array('title' => 'foo'), t('Submit'), $options);
+      $this->assertText('State persisted.');
+
+      // Now post to the rebuilt form and verify it's still there afterwards.
+      $this->drupalPost(NULL, array('title' => 'bar'), t('Submit'), $options);
+      $this->assertText('State persisted.');
+    }
+  }
+}
+
+/**
+ * Test wrapper form callbacks.
+ */
+class FormsFormWrapperTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Form wrapper callback',
+      'description' => 'Tests form wrapper callbacks to pass a prebuilt form to form builder functions.',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+  }
+
+  /**
+   * Tests using the form in a usual way.
+   */
+  function testWrapperCallback() {
+    $this->drupalGet('form_test/wrapper-callback');
+    $this->assertText('Form wrapper callback element output.', 'The form contains form wrapper elements.');
+    $this->assertText('Form builder element output.', 'The form contains form builder elements.');
+  }
+}
+
+/**
+ * Test $form_state clearance.
+ */
+class FormStateValuesCleanTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Form state values clearance',
+      'description' => 'Test proper removal of submitted form values using form_state_values_clean().',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+  }
+
+  /**
+   * Tests form_state_values_clean().
+   */
+  function testFormStateValuesClean() {
+    $values = drupal_json_decode($this->drupalPost('form_test/form-state-values-clean', array(), t('Submit')));
+
+    // Setup the expected result.
+    $result = array(
+      'beer' => 1000,
+      'baz' => array('beer' => 2000),
+    );
+
+    // Verify that all internal Form API elements were removed.
+    $this->assertFalse(isset($values['form_id']), format_string('%element was removed.', array('%element' => 'form_id')));
+    $this->assertFalse(isset($values['form_token']), format_string('%element was removed.', array('%element' => 'form_token')));
+    $this->assertFalse(isset($values['form_build_id']), format_string('%element was removed.', array('%element' => 'form_build_id')));
+    $this->assertFalse(isset($values['op']), format_string('%element was removed.', array('%element' => 'op')));
+
+    // Verify that all buttons were removed.
+    $this->assertFalse(isset($values['foo']), format_string('%element was removed.', array('%element' => 'foo')));
+    $this->assertFalse(isset($values['bar']), format_string('%element was removed.', array('%element' => 'bar')));
+    $this->assertFalse(isset($values['baz']['foo']), format_string('%element was removed.', array('%element' => 'foo')));
+    $this->assertFalse(isset($values['baz']['baz']), format_string('%element was removed.', array('%element' => 'baz')));
+
+    // Verify that nested form value still exists.
+    $this->assertTrue(isset($values['baz']['beer']), 'Nested form value still exists.');
+
+    // Verify that actual form values equal resulting form values.
+    $this->assertEqual($values, $result, 'Expected form values equal actual form values.');
+  }
+}
+
+/**
+ * Tests $form_state clearance with form elements having buttons.
+ */
+class FormStateValuesCleanAdvancedTestCase extends DrupalWebTestCase {
+  /**
+   * An image file path for uploading.
+   */
+  protected $image;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Form state values clearance (advanced)',
+      'description' => 'Test proper removal of submitted form values using form_state_values_clean() when having forms with elements containing buttons like "managed_file".',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+  }
+
+  /**
+   * Tests form_state_values_clean().
+   */
+  function testFormStateValuesCleanAdvanced() {
+
+    // Get an image for uploading.
+    $image_files = $this->drupalGetTestFiles('image');
+    $this->image = current($image_files);
+
+    // Check if the physical file is there.
+    $this->assertTrue(is_file($this->image->uri), "The image file we're going to upload exists.");
+
+    // "Browse" for the desired file.
+    $edit = array('files[image]' => drupal_realpath($this->image->uri));
+
+    // Post the form.
+    $this->drupalPost('form_test/form-state-values-clean-advanced', $edit, t('Submit'));
+
+    // Expecting a 200 HTTP code.
+    $this->assertResponse(200, 'Received a 200 response for posted test file.');
+    $this->assertRaw(t('You WIN!'), 'Found the success message.');
+  }
+}
+
+/**
+ * Tests form rebuilding.
+ *
+ * @todo Add tests for other aspects of form rebuilding.
+ */
+class FormsRebuildTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Form rebuilding',
+      'description' => 'Tests functionality of drupal_rebuild_form().',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+
+    $this->web_user = $this->drupalCreateUser(array('access content'));
+    $this->drupalLogin($this->web_user);
+  }
+
+  /**
+   * Tests preservation of values.
+   */
+  function testRebuildPreservesValues() {
+    $edit = array(
+      'checkbox_1_default_off' => TRUE,
+      'checkbox_1_default_on' => FALSE,
+      'text_1' => 'foo',
+    );
+    $this->drupalPost('form-test/form-rebuild-preserve-values', $edit, 'Add more');
+
+    // Verify that initial elements retained their submitted values.
+    $this->assertFieldChecked('edit-checkbox-1-default-off', 'A submitted checked checkbox retained its checked state during a rebuild.');
+    $this->assertNoFieldChecked('edit-checkbox-1-default-on', 'A submitted unchecked checkbox retained its unchecked state during a rebuild.');
+    $this->assertFieldById('edit-text-1', 'foo', 'A textfield retained its submitted value during a rebuild.');
+
+    // Verify that newly added elements were initialized with their default values.
+    $this->assertFieldChecked('edit-checkbox-2-default-on', 'A newly added checkbox was initialized with a default checked state.');
+    $this->assertNoFieldChecked('edit-checkbox-2-default-off', 'A newly added checkbox was initialized with a default unchecked state.');
+    $this->assertFieldById('edit-text-2', 'DEFAULT 2', 'A newly added textfield was initialized with its default value.');
+  }
+
+  /**
+   * Tests that a form's action is retained after an Ajax submission.
+   *
+   * The 'action' attribute of a form should not change after an Ajax submission
+   * followed by a non-Ajax submission, which triggers a validation error.
+   */
+  function testPreserveFormActionAfterAJAX() {
+    // Create a multi-valued field for 'page' nodes to use for Ajax testing.
+    $field_name = 'field_ajax_test';
+    $field = array(
+      'field_name' => $field_name,
+      'type' => 'text',
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+    );
+    field_create_field($field);
+    $instance = array(
+      'field_name' => $field_name,
+      'entity_type' => 'node',
+      'bundle' => 'page',
+    );
+    field_create_instance($instance);
+
+    // Log in a user who can create 'page' nodes.
+    $this->web_user = $this->drupalCreateUser(array('create page content'));
+    $this->drupalLogin($this->web_user);
+
+    // Get the form for adding a 'page' node. Submit an "add another item" Ajax
+    // submission and verify it worked by ensuring the updated page has two text
+    // field items in the field for which we just added an item.
+    $this->drupalGet('node/add/page');
+    $this->drupalPostAJAX(NULL, array(), array('field_ajax_test_add_more' => t('Add another item')), 'system/ajax', array(), array(), 'page-node-form');
+    $this->assert(count($this->xpath('//div[contains(@class, "field-name-field-ajax-test")]//input[@type="text"]')) == 2, 'AJAX submission succeeded.');
+
+    // Submit the form with the non-Ajax "Save" button, leaving the title field
+    // blank to trigger a validation error, and ensure that a validation error
+    // occurred, because this test is for testing what happens when a form is
+    // re-rendered without being re-built, which is what happens when there's
+    // a validation error.
+    $this->drupalPost(NULL, array(), t('Save'));
+    $this->assertText('Title field is required.', 'Non-AJAX submission correctly triggered a validation error.');
+
+    // Ensure that the form contains two items in the multi-valued field, so we
+    // know we're testing a form that was correctly retrieved from cache.
+    $this->assert(count($this->xpath('//form[contains(@id, "page-node-form")]//div[contains(@class, "form-item-field-ajax-test")]//input[@type="text"]')) == 2, 'Form retained its state from cache.');
+
+    // Ensure that the form's action is correct.
+    $forms = $this->xpath('//form[contains(@class, "node-page-form")]');
+    $this->assert(count($forms) == 1 && $forms[0]['action'] == url('node/add/page'), 'Re-rendered form contains the correct action value.');
+  }
+}
+
+/**
+ * Tests form redirection.
+ */
+class FormsRedirectTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Form redirecting',
+      'description' => 'Tests functionality of drupal_redirect_form().',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('form_test'));
+  }
+
+  /**
+   * Tests form redirection.
+   */
+  function testRedirect() {
+    $path = 'form-test/redirect';
+    $options = array('query' => array('foo' => 'bar'));
+    $options['absolute'] = TRUE;
+
+    // Test basic redirection.
+    $edit = array(
+      'redirection' => TRUE,
+      'destination' => $this->randomName(),
+    );
+    $this->drupalPost($path, $edit, t('Submit'));
+    $this->assertUrl($edit['destination'], array(), 'Basic redirection works.');
+
+
+    // Test without redirection.
+    $edit = array(
+      'redirection' => FALSE,
+    );
+    $this->drupalPost($path, $edit, t('Submit'));
+    $this->assertUrl($path, array(), 'When redirect is set to FALSE, there should be no redirection.');
+
+    // Test redirection with query parameters.
+    $edit = array(
+      'redirection' => TRUE,
+      'destination' => $this->randomName(),
+    );
+    $this->drupalPost($path, $edit, t('Submit'), $options);
+    $this->assertUrl($edit['destination'], array(), 'Redirection with query parameters works.');
+
+    // Test without redirection but with query parameters.
+    $edit = array(
+      'redirection' => FALSE,
+    );
+    $this->drupalPost($path, $edit, t('Submit'), $options);
+    $this->assertUrl($path, $options, 'When redirect is set to FALSE, there should be no redirection, and the query parameters should be passed along.');
+
+    // Test redirection back to the original path.
+    $edit = array(
+      'redirection' => TRUE,
+      'destination' => '',
+    );
+    $this->drupalPost($path, $edit, t('Submit'));
+    $this->assertUrl($path, array(), 'When using an empty redirection string, there should be no redirection.');
+
+    // Test redirection back to the original path with query parameters.
+    $edit = array(
+      'redirection' => TRUE,
+      'destination' => '',
+    );
+    $this->drupalPost($path, $edit, t('Submit'), $options);
+    $this->assertUrl($path, $options, 'When using an empty redirection string, there should be no redirection, and the query parameters should be passed along.');
+  }
+
+}
+
+/**
+ * Test the programmatic form submission behavior.
+ */
+class FormsProgrammaticTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Programmatic form submissions',
+      'description' => 'Test the programmatic form submission behavior.',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+  }
+
+  /**
+   * Test the programmatic form submission workflow.
+   */
+  function testSubmissionWorkflow() {
+    // Backup the current batch status and reset it to avoid conflicts while
+    // processing the dummy form submit handler.
+    $current_batch = $batch =& batch_get();
+    $batch = array();
+
+    // Test that a programmatic form submission is rejected when a required
+    // textfield is omitted and correctly processed when it is provided.
+    $this->submitForm(array(), FALSE);
+    $this->submitForm(array('textfield' => 'test 1'), TRUE);
+    $this->submitForm(array(), FALSE);
+    $this->submitForm(array('textfield' => 'test 2'), TRUE);
+
+    // Test that a programmatic form submission can turn on and off checkboxes
+    // which are, by default, checked.
+    $this->submitForm(array('textfield' => 'dummy value', 'checkboxes' => array(1 => 1, 2 => 2)), TRUE);
+    $this->submitForm(array('textfield' => 'dummy value', 'checkboxes' => array(1 => 1, 2 => NULL)), TRUE);
+    $this->submitForm(array('textfield' => 'dummy value', 'checkboxes' => array(1 => NULL, 2 => 2)), TRUE);
+    $this->submitForm(array('textfield' => 'dummy value', 'checkboxes' => array(1 => NULL, 2 => NULL)), TRUE);
+
+    // Test that a programmatic form submission can correctly click a button
+    // that limits validation errors based on user input. Since we do not
+    // submit any values for "textfield" here and the textfield is required, we
+    // only expect form validation to pass when validation is limited to a
+    // different field.
+    $this->submitForm(array('op' => 'Submit with limited validation', 'field_to_validate' => 'all'), FALSE);
+    $this->submitForm(array('op' => 'Submit with limited validation', 'field_to_validate' => 'textfield'), FALSE);
+    $this->submitForm(array('op' => 'Submit with limited validation', 'field_to_validate' => 'field_to_validate'), TRUE);
+
+    // Restore the current batch status.
+    $batch = $current_batch;
+  }
+
+  /**
+   * Helper function used to programmatically submit the form defined in
+   * form_test.module with the given values.
+   *
+   * @param $values
+   *   An array of field values to be submitted.
+   * @param $valid_input
+   *   A boolean indicating whether or not the form submission is expected to
+   *   be valid.
+   */
+  private function submitForm($values, $valid_input) {
+    // Programmatically submit the given values.
+    $form_state = array('values' => $values);
+    drupal_form_submit('form_test_programmatic_form', $form_state);
+
+    // Check that the form returns an error when expected, and vice versa.
+    $errors = form_get_errors();
+    $valid_form = empty($errors);
+    $args = array(
+      '%values' => print_r($values, TRUE),
+      '%errors' => $valid_form ? t('None') : implode(' ', $errors),
+    );
+    $this->assertTrue($valid_input == $valid_form, format_string('Input values: %values<br/>Validation handler errors: %errors', $args));
+
+    // We check submitted values only if we have a valid input.
+    if ($valid_input) {
+      // By fetching the values from $form_state['storage'] we ensure that the
+      // submission handler was properly executed.
+      $stored_values = $form_state['storage']['programmatic_form_submit'];
+      foreach ($values as $key => $value) {
+        $this->assertTrue(isset($stored_values[$key]) && $stored_values[$key] == $value, format_string('Submission handler correctly executed: %stored_key is %stored_value', array('%stored_key' => $key, '%stored_value' => print_r($value, TRUE))));
+      }
+    }
+  }
+}
+
+/**
+ * Test that FAPI correctly determines $form_state['triggering_element'].
+ */
+class FormsTriggeringElementTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Form triggering element determination',
+      'description' => 'Test the determination of $form_state[\'triggering_element\'].',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+  }
+
+  /**
+   * Test the determination of $form_state['triggering_element'] when no button
+   * information is included in the POST data, as is sometimes the case when
+   * the ENTER key is pressed in a textfield in Internet Explorer.
+   */
+  function testNoButtonInfoInPost() {
+    $path = 'form-test/clicked-button';
+    $edit = array();
+    $form_html_id = 'form-test-clicked-button';
+
+    // Ensure submitting a form with no buttons results in no
+    // $form_state['triggering_element'] and the form submit handler not
+    // running.
+    $this->drupalPost($path, $edit, NULL, array(), array(), $form_html_id);
+    $this->assertText('There is no clicked button.', '$form_state[\'triggering_element\'] set to NULL.');
+    $this->assertNoText('Submit handler for form_test_clicked_button executed.', 'Form submit handler did not execute.');
+
+    // Ensure submitting a form with one or more submit buttons results in
+    // $form_state['triggering_element'] being set to the first one the user has
+    // access to. An argument with 'r' in it indicates a restricted
+    // (#access=FALSE) button.
+    $this->drupalPost($path . '/s', $edit, NULL, array(), array(), $form_html_id);
+    $this->assertText('The clicked button is button1.', '$form_state[\'triggering_element\'] set to only button.');
+    $this->assertText('Submit handler for form_test_clicked_button executed.', 'Form submit handler executed.');
+
+    $this->drupalPost($path . '/s/s', $edit, NULL, array(), array(), $form_html_id);
+    $this->assertText('The clicked button is button1.', '$form_state[\'triggering_element\'] set to first button.');
+    $this->assertText('Submit handler for form_test_clicked_button executed.', 'Form submit handler executed.');
+
+    $this->drupalPost($path . '/rs/s', $edit, NULL, array(), array(), $form_html_id);
+    $this->assertText('The clicked button is button2.', '$form_state[\'triggering_element\'] set to first available button.');
+    $this->assertText('Submit handler for form_test_clicked_button executed.', 'Form submit handler executed.');
+
+    // Ensure submitting a form with buttons of different types results in
+    // $form_state['triggering_element'] being set to the first button,
+    // regardless of type. For the FAPI 'button' type, this should result in the
+    // submit handler not executing. The types are 's'(ubmit), 'b'(utton), and
+    // 'i'(mage_button).
+    $this->drupalPost($path . '/s/b/i', $edit, NULL, array(), array(), $form_html_id);
+    $this->assertText('The clicked button is button1.', '$form_state[\'triggering_element\'] set to first button.');
+    $this->assertText('Submit handler for form_test_clicked_button executed.', 'Form submit handler executed.');
+
+    $this->drupalPost($path . '/b/s/i', $edit, NULL, array(), array(), $form_html_id);
+    $this->assertText('The clicked button is button1.', '$form_state[\'triggering_element\'] set to first button.');
+    $this->assertNoText('Submit handler for form_test_clicked_button executed.', 'Form submit handler did not execute.');
+
+    $this->drupalPost($path . '/i/s/b', $edit, NULL, array(), array(), $form_html_id);
+    $this->assertText('The clicked button is button1.', '$form_state[\'triggering_element\'] set to first button.');
+    $this->assertText('Submit handler for form_test_clicked_button executed.', 'Form submit handler executed.');
+  }
+
+  /**
+   * Test that $form_state['triggering_element'] does not get set to a button
+   * with #access=FALSE.
+   */
+  function testAttemptAccessControlBypass() {
+    $path = 'form-test/clicked-button';
+    $form_html_id = 'form-test-clicked-button';
+
+    // Retrieve a form where 'button1' has #access=FALSE and 'button2' doesn't.
+    $this->drupalGet($path . '/rs/s');
+
+    // Submit the form with 'button1=button1' in the POST data, which someone
+    // trying to get around security safeguards could easily do. We have to do
+    // a little trickery here, to work around the safeguards in drupalPost(): by
+    // renaming the text field that is in the form to 'button1', we can get the
+    // data we want into $_POST.
+    $elements = $this->xpath('//form[@id="' . $form_html_id . '"]//input[@name="text"]');
+    $elements[0]['name'] = 'button1';
+    $this->drupalPost(NULL, array('button1' => 'button1'), NULL, array(), array(), $form_html_id);
+
+    // Ensure that $form_state['triggering_element'] was not set to the
+    // restricted button. Do this with both a negative and positive assertion,
+    // because negative assertions alone can be brittle. See
+    // testNoButtonInfoInPost() for why the triggering element gets set to
+    // 'button2'.
+    $this->assertNoText('The clicked button is button1.', '$form_state[\'triggering_element\'] not set to a restricted button.');
+    $this->assertText('The clicked button is button2.', '$form_state[\'triggering_element\'] not set to a restricted button.');
+  }
+}
+
+/**
+ * Tests rebuilding of arbitrary forms by altering them.
+ */
+class FormsArbitraryRebuildTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Rebuild arbitrary forms',
+      'description' => 'Tests altering forms to be rebuilt so there are multiple steps.',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+    // Auto-create a field for testing.
+    $field = array(
+      'field_name' => 'test_multiple',
+      'type' => 'text',
+      'cardinality' => -1,
+      'translatable' => FALSE,
+    );
+    field_create_field($field);
+
+    $instance = array(
+      'entity_type' => 'node',
+      'field_name' => 'test_multiple',
+      'bundle' => 'page',
+      'label' => 'Test a multiple valued field',
+      'widget' => array(
+        'type' => 'text_textfield',
+        'weight' => 0,
+      ),
+    );
+    field_create_instance($instance);
+    variable_set('user_register', USER_REGISTER_VISITORS);
+  }
+
+  /**
+   * Tests a basic rebuild with the user registration form.
+   */
+  function testUserRegistrationRebuild() {
+    $edit = array(
+      'name' => 'foo',
+      'mail' => 'bar@example.com',
+    );
+    $this->drupalPost('user/register', $edit, 'Rebuild');
+    $this->assertText('Form rebuilt.');
+    $this->assertFieldByName('name', 'foo', 'Entered user name has been kept.');
+    $this->assertFieldByName('mail', 'bar@example.com', 'Entered mail address has been kept.');
+  }
+
+  /**
+   * Tests a rebuild caused by a multiple value field.
+   */
+  function testUserRegistrationMultipleField() {
+    $edit = array(
+      'name' => 'foo',
+      'mail' => 'bar@example.com',
+    );
+    $this->drupalPost('user/register', $edit, t('Add another item'), array('query' => array('field' => TRUE)));
+    $this->assertText('Test a multiple valued field', 'Form has been rebuilt.');
+    $this->assertFieldByName('name', 'foo', 'Entered user name has been kept.');
+    $this->assertFieldByName('mail', 'bar@example.com', 'Entered mail address has been kept.');
+  }
+}
+
+/**
+ * Tests form API file inclusion.
+ */
+class FormsFileInclusionTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Form API file inclusion',
+      'description' => 'Tests form API file inclusion.',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+  }
+
+  /**
+   * Tests loading an include specified in hook_menu().
+   */
+  function testLoadMenuInclude() {
+    $this->drupalPostAJAX('form-test/load-include-menu', array(), array('op' => t('Save')), 'system/ajax', array(), array(), 'form-test-load-include-menu');
+    $this->assertText('Submit callback called.');
+  }
+
+  /**
+   * Tests loading a custom specified inlcude.
+   */
+  function testLoadCustomInclude() {
+    $this->drupalPost('form-test/load-include-custom', array(), t('Save'));
+    $this->assertText('Submit callback called.');
+  }
+}
+
+/**
+ * Tests checkbox element.
+ */
+class FormCheckboxTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Form API checkbox',
+      'description' => 'Tests form API checkbox handling of various combinations of #default_value and #return_value.',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+  }
+
+  function testFormCheckbox() {
+    // Ensure that the checked state is determined and rendered correctly for
+    // tricky combinations of default and return values.
+    foreach (array(FALSE, NULL, TRUE, 0, '0', '', 1, '1', 'foobar', '1foobar') as $default_value) {
+      // Only values that can be used for array indeces are supported for
+      // #return_value, with the exception of integer 0, which is not supported.
+      // @see form_process_checkbox().
+      foreach (array('0', '', 1, '1', 'foobar', '1foobar') as $return_value) {
+        $form_array = drupal_get_form('form_test_checkbox_type_juggling', $default_value, $return_value);
+        $form = drupal_render($form_array);
+        if ($default_value === TRUE) {
+          $checked = TRUE;
+        }
+        elseif ($return_value === '0') {
+          $checked = ($default_value === '0');
+        }
+        elseif ($return_value === '') {
+          $checked = ($default_value === '');
+        }
+        elseif ($return_value === 1 || $return_value === '1') {
+          $checked = ($default_value === 1 || $default_value === '1');
+        }
+        elseif ($return_value === 'foobar') {
+          $checked = ($default_value === 'foobar');
+        }
+        elseif ($return_value === '1foobar') {
+          $checked = ($default_value === '1foobar');
+        }
+        $checked_in_html = strpos($form, 'checked') !== FALSE;
+        $message = format_string('#default_value is %default_value #return_value is %return_value.', array('%default_value' => var_export($default_value, TRUE), '%return_value' => var_export($return_value, TRUE)));
+        $this->assertIdentical($checked, $checked_in_html, $message);
+      }
+    }
+
+    // Ensure that $form_state['values'] is populated correctly for a checkboxes
+    // group that includes a 0-indexed array of options.
+    $results = json_decode($this->drupalPost('form-test/checkboxes-zero', array(), 'Save'));
+    $this->assertIdentical($results->checkbox_off, array(0, 0, 0), 'All three in checkbox_off are zeroes: off.');
+    $this->assertIdentical($results->checkbox_zero_default, array('0', 0, 0), 'The first choice is on in checkbox_zero_default');
+    $this->assertIdentical($results->checkbox_string_zero_default, array('0', 0, 0), 'The first choice is on in checkbox_string_zero_default');
+    $edit = array('checkbox_off[0]' => '0');
+    $results = json_decode($this->drupalPost('form-test/checkboxes-zero', $edit, 'Save'));
+    $this->assertIdentical($results->checkbox_off, array('0', 0, 0), 'The first choice is on in checkbox_off but the rest is not');
+
+    // Ensure that each checkbox is rendered correctly for a checkboxes group
+    // that includes a 0-indexed array of options.
+    $this->drupalPost('form-test/checkboxes-zero/0', array(), 'Save');
+    $checkboxes = $this->xpath('//input[@type="checkbox"]');
+    foreach ($checkboxes as $checkbox) {
+      $checked = isset($checkbox['checked']);
+      $name = (string) $checkbox['name'];
+      $this->assertIdentical($checked, $name == 'checkbox_zero_default[0]' || $name == 'checkbox_string_zero_default[0]', format_string('Checkbox %name correctly checked', array('%name' => $name)));
+    }
+    $edit = array('checkbox_off[0]' => '0');
+    $this->drupalPost('form-test/checkboxes-zero/0', $edit, 'Save');
+    $checkboxes = $this->xpath('//input[@type="checkbox"]');
+    foreach ($checkboxes as $checkbox) {
+      $checked = isset($checkbox['checked']);
+      $name = (string) $checkbox['name'];
+      $this->assertIdentical($checked, $name == 'checkbox_off[0]' || $name == 'checkbox_zero_default[0]' || $name == 'checkbox_string_zero_default[0]', format_string('Checkbox %name correctly checked', array('%name' => $name)));
+    }
+  }
+}
+
+/**
+ * Tests uniqueness of generated HTML IDs.
+ */
+class HTMLIdTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Unique HTML IDs',
+      'description' => 'Tests functionality of drupal_html_id().',
+      'group' => 'Form API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('form_test');
+  }
+
+  /**
+   * Tests that HTML IDs do not get duplicated when form validation fails.
+   */
+  function testHTMLId() {
+    $this->drupalGet('form-test/double-form');
+    $this->assertNoDuplicateIds('There are no duplicate IDs');
+
+    // Submit second form with empty title.
+    $edit = array();
+    $this->drupalPost(NULL, $edit, 'Save', array(), array(), 'form-test-html-id--2');
+    $this->assertNoDuplicateIds('There are no duplicate IDs');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/form_test.file.inc b/htmltest/modules/simpletest/tests/form_test.file.inc
new file mode 100644
index 00000000..f9197ead
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/form_test.file.inc
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * @file
+ * An include file to test loading it with the form API.
+ */
+
+/**
+ * Form constructor for testing FAPI file inclusion of the file specified in
+ * hook_menu().
+ */
+function form_test_load_include_menu($form, &$form_state) {
+  // Submit the form via Ajax. That way the FAPI has to care about including
+  // the file specified in hook_menu().
+  $ajax_wrapper_id = drupal_html_id('form-test-load-include-menu-ajax-wrapper');
+  $form['ajax_wrapper'] = array(
+    '#markup' => '<div id="' . $ajax_wrapper_id . '"></div>',
+  );
+  $form['button'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+    '#submit' => array('form_test_load_include_submit'),
+    '#ajax' => array(
+      'wrapper' => $ajax_wrapper_id,
+      'method' => 'append',
+      'callback' => 'form_test_load_include_menu_ajax',
+    ),
+  );
+  return $form;
+}
+
+/**
+ * Submit callback for the form API file inclusion test forms.
+ */
+function form_test_load_include_submit($form, $form_state) {
+  drupal_set_message('Submit callback called.');
+}
+
+/**
+ * Ajax callback for the file inclusion via menu test.
+ */
+function form_test_load_include_menu_ajax($form) {
+  // We don't need to return anything, since #ajax['method'] is 'append', which
+  // does not remove the original #ajax['wrapper'] element, and status messages
+  // are automatically added by the Ajax framework as long as there's a wrapper
+  // element to add them to.
+  return '';
+}
diff --git a/htmltest/modules/simpletest/tests/form_test.info b/htmltest/modules/simpletest/tests/form_test.info
new file mode 100644
index 00000000..5d7e83a0
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/form_test.info
@@ -0,0 +1,12 @@
+name = "FormAPI Test"
+description = "Support module for Form API tests."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/form_test.module b/htmltest/modules/simpletest/tests/form_test.module
new file mode 100644
index 00000000..b4d2f549
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/form_test.module
@@ -0,0 +1,1848 @@
+<?php
+
+/**
+ * @file
+ * Helper module for the form API tests.
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function form_test_menu() {
+  $items['form-test/alter'] = array(
+    'title' => 'Form altering test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_alter_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['form-test/validate'] = array(
+    'title' => 'Form validation handlers test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_validate_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['form-test/validate-required'] = array(
+    'title' => 'Form #required validation',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_validate_required_form'),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['form-test/validate-required-no-title'] = array(
+    'title' => 'Form #required validation without #title',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_validate_required_form_no_title'),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['form-test/limit-validation-errors'] = array(
+    'title' => 'Form validation with some error suppression',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_limit_validation_errors_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form_test/tableselect/multiple-true'] = array(
+    'title' => 'Tableselect checkboxes test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('_form_test_tableselect_multiple_true_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['form_test/tableselect/multiple-false'] = array(
+    'title' => 'Tableselect radio button test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('_form_test_tableselect_multiple_false_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['form_test/tableselect/empty-text'] = array(
+    'title' => 'Tableselect empty text test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('_form_test_tableselect_empty_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['form_test/tableselect/advanced-select'] = array(
+    'title' => 'Tableselect js_select tests',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('_form_test_tableselect_js_select_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form_test/vertical-tabs'] = array(
+    'title' => 'Vertical tabs tests',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('_form_test_vertical_tabs_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form_test/form-storage'] = array(
+    'title' => 'Form storage test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_storage_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form_test/wrapper-callback'] = array(
+    'title' => 'Form wrapper callback test',
+    'page callback' => 'form_test_wrapper_callback',
+    'page arguments' => array('form_test_wrapper_callback_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form_test/form-state-values-clean'] = array(
+    'title' => 'Form state values clearance test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_form_state_values_clean_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form_test/form-state-values-clean-advanced'] = array(
+    'title' => 'Form state values clearance advanced test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_form_state_values_clean_advanced_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form-test/checkbox'] = array(
+    'title' => t('Form test'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('_form_test_checkbox'),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['form-test/select'] = array(
+    'title' => t('Select'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_select'),
+    'access callback' => TRUE,
+  );
+  $items['form-test/checkboxes-radios'] = array(
+    'title' => t('Checkboxes, Radios'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_checkboxes_radios'),
+    'access callback' => TRUE,
+  );
+
+  $items['form-test/disabled-elements'] = array(
+    'title' => t('Form test'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('_form_test_disabled_elements'),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form-test/input-forgery'] = array(
+    'title' => t('Form test'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('_form_test_input_forgery'),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form-test/form-rebuild-preserve-values'] = array(
+    'title' => 'Form values preservation during rebuild test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_form_rebuild_preserve_values_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form-test/redirect'] = array(
+    'title' => 'Redirect test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_redirect'),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form_test/form-labels'] = array(
+    'title' => 'Form label test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_label_test_form'),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form-test/state-persist'] = array(
+    'title' => 'Form state persistence without storage',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_state_persist'),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form-test/clicked-button'] = array(
+    'title' => 'Clicked button test',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_clicked_button'),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  if (module_exists('node')) {
+    $items['form-test/two-instances-of-same-form'] = array(
+      'title' => 'AJAX test with two form instances',
+      'page callback' => 'form_test_two_instances',
+      'access callback' => 'node_access',
+      'access arguments' => array('create', 'page'),
+      'file path' => drupal_get_path('module', 'node'),
+      'file' => 'node.pages.inc',
+      'type' => MENU_CALLBACK,
+    );
+  }
+  $items['form-test/double-form'] = array(
+    'title' => 'Double form test',
+    'page callback' => 'form_test_double_form',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form-test/load-include-menu'] = array(
+    'title' => 'FAPI test loading includes',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_load_include_menu'),
+    'access callback' => TRUE,
+    'file' => 'form_test.file.inc',
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['form-test/load-include-custom'] = array(
+    'title' => 'FAPI test loading includes',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_load_include_custom'),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['form-test/checkboxes-zero'] = array(
+    'title' => 'FAPI test involving checkboxes and zero',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('form_test_checkboxes_zero'),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  return $items;
+}
+
+/**
+ * Form submit handler to return form values as JSON.
+ */
+function _form_test_submit_values_json($form, &$form_state) {
+  drupal_json_output($form_state['values']);
+  drupal_exit();
+}
+
+/**
+ * Form builder for testing hook_form_alter() and hook_form_FORM_ID_alter().
+ */
+function form_test_alter_form($form, &$form_state) {
+  // Elements can be added as needed for future testing needs, but for now,
+  // we're only testing alter hooks that do not require any elements added by
+  // this function.
+  return $form;
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter() on behalf of block.module.
+ */
+function block_form_form_test_alter_form_alter(&$form, &$form_state) {
+  drupal_set_message('block_form_form_test_alter_form_alter() executed.');
+}
+
+/**
+ * Implements hook_form_alter().
+ */
+function form_test_form_alter(&$form, &$form_state, $form_id) {
+  if ($form_id == 'form_test_alter_form') {
+    drupal_set_message('form_test_form_alter() executed.');
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function form_test_form_form_test_alter_form_alter(&$form, &$form_state) {
+  drupal_set_message('form_test_form_form_test_alter_form_alter() executed.');
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter() on behalf of system.module.
+ */
+function system_form_form_test_alter_form_alter(&$form, &$form_state) {
+  drupal_set_message('system_form_form_test_alter_form_alter() executed.');
+}
+
+/**
+ * Form builder for testing drupal_validate_form().
+ *
+ * Serves for testing form processing and alterations by form validation
+ * handlers, especially for the case of a validation error:
+ * - form_set_value() should be able to alter submitted values in
+ *   $form_state['values'] without affecting the form element.
+ * - #element_validate handlers should be able to alter the $element in the form
+ *   structure and the alterations should be contained in the rebuilt form.
+ * - #validate handlers should be able to alter the $form and the alterations
+ *   should be contained in the rebuilt form.
+ */
+function form_test_validate_form($form, &$form_state) {
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => 'Name',
+    '#default_value' => '',
+    '#element_validate' => array('form_test_element_validate_name'),
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => 'Save',
+  );
+
+  // To simplify this test, enable form caching and use form storage to
+  // remember our alteration.
+  $form_state['cache'] = TRUE;
+
+  return $form;
+}
+
+/**
+ * Form element validation handler for 'name' in form_test_validate_form().
+ */
+function form_test_element_validate_name(&$element, &$form_state) {
+  $triggered = FALSE;
+  if ($form_state['values']['name'] == 'element_validate') {
+    // Alter the form element.
+    $element['#value'] = '#value changed by #element_validate';
+    // Alter the submitted value in $form_state.
+    form_set_value($element, 'value changed by form_set_value() in #element_validate', $form_state);
+
+    $triggered = TRUE;
+  }
+  if ($form_state['values']['name'] == 'element_validate_access') {
+    $form_state['storage']['form_test_name'] = $form_state['values']['name'];
+    // Alter the form element.
+    $element['#access'] = FALSE;
+
+    $triggered = TRUE;
+  }
+  elseif (!empty($form_state['storage']['form_test_name'])) {
+    // To simplify this test, just take over the element's value into $form_state.
+    form_set_value($element, $form_state['storage']['form_test_name'], $form_state);
+
+    $triggered = TRUE;
+  }
+
+  if ($triggered) {
+    // Output the element's value from $form_state.
+    drupal_set_message(t('@label value: @value', array('@label' => $element['#title'], '@value' => $form_state['values']['name'])));
+
+    // Trigger a form validation error to see our changes.
+    form_set_error('');
+  }
+}
+
+/**
+ * Form validation handler for form_test_validate_form().
+ */
+function form_test_validate_form_validate(&$form, &$form_state) {
+  if ($form_state['values']['name'] == 'validate') {
+    // Alter the form element.
+    $form['name']['#value'] = '#value changed by #validate';
+    // Alter the submitted value in $form_state.
+    form_set_value($form['name'], 'value changed by form_set_value() in #validate', $form_state);
+    // Output the element's value from $form_state.
+    drupal_set_message(t('@label value: @value', array('@label' => $form['name']['#title'], '@value' => $form_state['values']['name'])));
+
+    // Trigger a form validation error to see our changes.
+    form_set_error('');
+  }
+}
+
+/**
+ * Form constructor to test the #required property.
+ */
+function form_test_validate_required_form($form, &$form_state) {
+  $options = drupal_map_assoc(array('foo', 'bar'));
+
+  $form['textfield'] = array(
+    '#type' => 'textfield',
+    '#title' => 'Textfield',
+    '#required' => TRUE,
+  );
+  $form['checkboxes'] = array(
+    '#type' => 'checkboxes',
+    '#title' => 'Checkboxes',
+    '#options' => $options,
+    '#required' => TRUE,
+  );
+  $form['select'] = array(
+    '#type' => 'select',
+    '#title' => 'Select',
+    '#options' => $options,
+    '#required' => TRUE,
+  );
+  $form['radios'] = array(
+    '#type' => 'radios',
+    '#title' => 'Radios',
+    '#options' => $options,
+    '#required' => TRUE,
+  );
+  $form['radios_optional'] = array(
+    '#type' => 'radios',
+    '#title' => 'Radios (optional)',
+    '#options' => $options,
+  );
+  $form['radios_optional_default_value_false'] = array(
+    '#type' => 'radios',
+    '#title' => 'Radios (optional, with a default value of FALSE)',
+    '#options' => $options,
+    '#default_value' => FALSE,
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => 'Submit');
+  return $form;
+}
+
+/**
+ * Form submission handler for form_test_validate_required_form().
+ */
+function form_test_validate_required_form_submit($form, &$form_state) {
+  drupal_set_message('The form_test_validate_required_form form was submitted successfully.');
+}
+
+/**
+ * Form constructor to test the #required property without #title.
+ */
+function form_test_validate_required_form_no_title($form, &$form_state) {
+  $form['textfield'] = array(
+    '#type' => 'textfield',
+    '#required' => TRUE,
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => 'Submit');
+  return $form;
+}
+
+/**
+ * Form submission handler for form_test_validate_required_form_no_title().
+ */
+function form_test_validate_required_form_no_title_submit($form, &$form_state) {
+  drupal_set_message('The form_test_validate_required_form_no_title form was submitted successfully.');
+}
+
+/**
+ * Builds a simple form with a button triggering partial validation.
+ */
+function form_test_limit_validation_errors_form($form, &$form_state) {
+  $form['title'] = array(
+    '#type' => 'textfield',
+    '#title' => 'Title',
+    '#required' => TRUE,
+  );
+
+  $form['test'] = array(
+    '#title' => 'Test',
+    '#type' => 'textfield',
+    '#element_validate' => array('form_test_limit_validation_errors_element_validate_test'),
+  );
+  $form['test_numeric_index'] = array(
+    '#tree' => TRUE,
+  );
+  $form['test_numeric_index'][0] = array(
+    '#title' => 'Test (numeric index)',
+    '#type' => 'textfield',
+    '#element_validate' => array('form_test_limit_validation_errors_element_validate_test'),
+  );
+
+  $form['test_substring'] = array(
+    '#tree' => TRUE,
+  );
+  $form['test_substring']['foo'] = array(
+    '#title' => 'Test (substring) foo',
+    '#type' => 'textfield',
+    '#element_validate' => array('form_test_limit_validation_errors_element_validate_test'),
+  );
+  $form['test_substring']['foobar'] = array(
+    '#title' => 'Test (substring) foobar',
+    '#type' => 'textfield',
+    '#element_validate' => array('form_test_limit_validation_errors_element_validate_test'),
+  );
+
+  $form['actions']['partial'] = array(
+    '#type' => 'submit',
+    '#limit_validation_errors' => array(array('test')),
+    '#submit' => array('form_test_limit_validation_errors_form_partial_submit'),
+    '#value' => t('Partial validate'),
+  );
+  $form['actions']['partial_numeric_index'] = array(
+    '#type' => 'submit',
+    '#limit_validation_errors' => array(array('test_numeric_index', 0)),
+    '#submit' => array('form_test_limit_validation_errors_form_partial_submit'),
+    '#value' => t('Partial validate (numeric index)'),
+  );
+  $form['actions']['substring'] = array(
+    '#type' => 'submit',
+    '#limit_validation_errors' => array(array('test_substring', 'foo')),
+    '#submit' => array('form_test_limit_validation_errors_form_partial_submit'),
+    '#value' => t('Partial validate (substring)'),
+  );
+  $form['actions']['full'] = array(
+    '#type' => 'submit',
+    '#value' => t('Full validate'),
+  );
+  return $form;
+}
+
+/**
+ * Form element validation handler for the 'test' element.
+ */
+function form_test_limit_validation_errors_element_validate_test(&$element, &$form_state) {
+  if ($element['#value'] == 'invalid') {
+    form_error($element, t('@label element is invalid', array('@label' => $element['#title'])));
+  }
+}
+
+/**
+ * Form submit handler for the partial validation submit button.
+ */
+function form_test_limit_validation_errors_form_partial_submit($form, $form_state) {
+  // The title has not been validated, thus its value - in case of the test case
+  // an empty string - may not be set.
+  if (!isset($form_state['values']['title']) && isset($form_state['values']['test'])) {
+    drupal_set_message('Only validated values appear in the form values.');
+  }
+}
+
+/**
+ * Create a header and options array. Helper function for callbacks.
+ */
+function _form_test_tableselect_get_data() {
+  $header = array(
+    'one' => t('One'),
+    'two' => t('Two'),
+    'three' => t('Three'),
+    'four' => t('Four'),
+  );
+
+  $options['row1'] = array(
+    'one' => 'row1col1',
+    'two' => t('row1col2'),
+    'three' => t('row1col3'),
+    'four' => t('row1col4'),
+  );
+
+  $options['row2'] = array(
+    'one' => 'row2col1',
+    'two' => t('row2col2'),
+    'three' => t('row2col3'),
+    'four' => t('row2col4'),
+  );
+
+  $options['row3'] = array(
+    'one' => 'row3col1',
+    'two' => t('row3col2'),
+    'three' => t('row3col3'),
+    'four' => t('row3col4'),
+  );
+
+  return array($header, $options);
+}
+
+/**
+ * Build a form to test the tableselect element.
+ *
+ * @param $form_state
+ *   The form_state
+ * @param $element_properties
+ *   An array of element properties for the tableselect element.
+ *
+ * @return
+ *   A form with a tableselect element and a submit button.
+ */
+function _form_test_tableselect_form_builder($form, $form_state, $element_properties) {
+  list($header, $options) = _form_test_tableselect_get_data();
+
+  $form['tableselect'] = $element_properties;
+
+  $form['tableselect'] += array(
+    '#type' => 'tableselect',
+    '#header' => $header,
+    '#options' => $options,
+    '#multiple' => FALSE,
+    '#empty' => t('Empty text.'),
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit'),
+  );
+
+  return $form;
+}
+
+/**
+ * Test the tableselect #multiple = TRUE functionality.
+ */
+function _form_test_tableselect_multiple_true_form($form, $form_state) {
+  return _form_test_tableselect_form_builder($form, $form_state, array('#multiple' => TRUE));
+}
+
+/**
+ * Process the tableselect #multiple = TRUE submitted values.
+ */
+function _form_test_tableselect_multiple_true_form_submit($form, &$form_state) {
+  $selected = $form_state['values']['tableselect'];
+  foreach ($selected as $key => $value) {
+    drupal_set_message(t('Submitted: @key = @value', array('@key' => $key, '@value' => $value)));
+  }
+}
+
+/**
+ * Test the tableselect #multiple = FALSE functionality.
+ */
+function _form_test_tableselect_multiple_false_form($form, $form_state) {
+  return _form_test_tableselect_form_builder($form, $form_state, array('#multiple' => FALSE));
+}
+
+/**
+ * Process the tableselect #multiple = FALSE submitted values.
+ */
+function _form_test_tableselect_multiple_false_form_submit($form, &$form_state) {
+  drupal_set_message(t('Submitted: @value', array('@value' => $form_state['values']['tableselect'])));
+}
+
+/**
+ * Test functionality of the tableselect #empty property.
+ */
+function _form_test_tableselect_empty_form($form, $form_state) {
+  return _form_test_tableselect_form_builder($form, $form_state, array('#options' => array()));
+}
+
+/**
+ * Test functionality of the tableselect #js_select property.
+ */
+function _form_test_tableselect_js_select_form($form, $form_state, $action) {
+  switch ($action) {
+    case 'multiple-true-default':
+      $options = array('#multiple' => TRUE);
+      break;
+
+    case 'multiple-false-default':
+      $options = array('#multiple' => FALSE);
+      break;
+
+    case 'multiple-true-no-advanced-select':
+      $options = array('#multiple' => TRUE, '#js_select' => FALSE);
+      break;
+
+    case 'multiple-false-advanced-select':
+      $options = array('#multiple' => FALSE, '#js_select' => TRUE);
+      break;
+  }
+
+  return _form_test_tableselect_form_builder($form, $form_state, $options);
+}
+
+/**
+ * Tests functionality of vertical tabs.
+ */
+function _form_test_vertical_tabs_form($form, &$form_state) {
+  $form['vertical_tabs'] = array(
+    '#type' => 'vertical_tabs',
+  );
+  $form['tab1'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Tab 1'),
+    '#collapsible' => TRUE,
+    '#group' => 'vertical_tabs',
+  );
+  $form['tab1']['field1'] = array(
+    '#title' => t('Field 1'),
+    '#type' => 'textfield',
+  );
+  $form['tab2'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Tab 2'),
+    '#collapsible' => TRUE,
+    '#group' => 'vertical_tabs',
+  );
+  $form['tab2']['field2'] = array(
+    '#title' => t('Field 2'),
+    '#type' => 'textfield',
+  );
+  return $form;
+}
+
+/**
+ * A multistep form for testing the form storage.
+ *
+ * It uses two steps for editing a virtual "thing". Any changes to it are saved
+ * in the form storage and have to be present during any step. By setting the
+ * request parameter "cache" the form can be tested with caching enabled, as
+ * it would be the case, if the form would contain some #ajax callbacks.
+ *
+ * @see form_test_storage_form_submit()
+ */
+function form_test_storage_form($form, &$form_state) {
+  if ($form_state['rebuild']) {
+    $form_state['input'] = array();
+  }
+  // Initialize
+  if (empty($form_state['storage'])) {
+    if (empty($form_state['input'])) {
+      $_SESSION['constructions'] = 0;
+    }
+    // Put the initial thing into the storage
+    $form_state['storage'] = array(
+      'thing' => array(
+        'title' => 'none',
+        'value' => '',
+      ),
+    );
+  }
+  // Count how often the form is constructed.
+  $_SESSION['constructions']++;
+  drupal_set_message("Form constructions: " . $_SESSION['constructions']);
+
+  $form['title'] = array(
+    '#type' => 'textfield',
+    '#title' => 'Title',
+    '#default_value' => $form_state['storage']['thing']['title'],
+    '#required' => TRUE,
+  );
+  $form['value'] = array(
+    '#type' => 'textfield',
+    '#title' => 'Value',
+    '#default_value' => $form_state['storage']['thing']['value'],
+    '#element_validate' => array('form_test_storage_element_validate_value_cached'),
+  );
+  $form['continue_button'] = array(
+    '#type' => 'button',
+    '#value' => 'Reset',
+    // Rebuilds the form without keeping the values.
+  );
+  $form['continue_submit'] = array(
+    '#type' => 'submit',
+    '#value' => 'Continue submit',
+    '#submit' => array('form_storage_test_form_continue_submit'),
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => 'Save',
+  );
+
+  if (isset($_REQUEST['cache'])) {
+    // Manually activate caching, so we can test that the storage keeps working
+    // when it's enabled.
+    $form_state['cache'] = TRUE;
+  }
+
+  return $form;
+}
+
+/**
+ * Form element validation handler for 'value' element in form_test_storage_form().
+ *
+ * Tests updating of cached form storage during validation.
+ */
+function form_test_storage_element_validate_value_cached($element, &$form_state) {
+  // If caching is enabled and we receive a certain value, change the storage.
+  // This presumes that another submitted form value triggers a validation error
+  // elsewhere in the form. Form API should still update the cached form storage
+  // though.
+  if (isset($_REQUEST['cache']) && $form_state['values']['value'] == 'change_title') {
+    $form_state['storage']['thing']['changed'] = TRUE;
+  }
+}
+
+/**
+ * Form submit handler to continue multi-step form.
+ */
+function form_storage_test_form_continue_submit($form, &$form_state) {
+  $form_state['storage']['thing']['title'] = $form_state['values']['title'];
+  $form_state['storage']['thing']['value'] = $form_state['values']['value'];
+  $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * Form submit handler to finish multi-step form.
+ */
+function form_test_storage_form_submit($form, &$form_state) {
+  drupal_set_message("Title: " . check_plain($form_state['values']['title']));
+  drupal_set_message("Form constructions: " . $_SESSION['constructions']);
+  if (isset($form_state['storage']['thing']['changed'])) {
+    drupal_set_message("The thing has been changed.");
+  }
+  $form_state['redirect'] = 'node';
+}
+
+/**
+ * A form for testing form labels and required marks.
+ */
+function form_label_test_form() {
+  $form['form_checkboxes_test'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Checkboxes test'),
+    '#options' => array(
+      'first-checkbox' => t('First checkbox'),
+      'second-checkbox' => t('Second checkbox'),
+      'third-checkbox' => t('Third checkbox'),
+      '0' => t('0'),
+    ),
+  );
+  $form['form_radios_test'] = array(
+    '#type' => 'radios',
+    '#title' => t('Radios test'),
+    '#options' => array(
+      'first-radio' => t('First radio'),
+      'second-radio' => t('Second radio'),
+      'third-radio' => t('Third radio'),
+      '0' => t('0'),
+    ),
+    // Test #field_prefix and #field_suffix placement.
+    '#field_prefix' => '<span id="form-test-radios-field-prefix">' . t('Radios #field_prefix element') . '</span>',
+    '#field_suffix' => '<span id="form-test-radios-field-suffix">' . t('Radios #field_suffix element') . '</span>',
+  );
+  $form['form_checkbox_test'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Checkbox test'),
+  );
+  $form['form_textfield_test_title_and_required'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Textfield test for required with title'),
+    '#required' => TRUE,
+  );
+  $form['form_textfield_test_no_title_required'] = array(
+    '#type' => 'textfield',
+    // We use an empty title, since not setting #title suppresses the label
+    // and required marker.
+    '#title' => '',
+    '#required' => TRUE,
+  );
+  $form['form_textfield_test_title'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Textfield test for title only'),
+    // Not required.
+    // Test #prefix and #suffix placement.
+    '#prefix' => '<div id="form-test-textfield-title-prefix">' . t('Textfield #prefix element') . '</div>',
+    '#suffix' => '<div id="form-test-textfield-title-suffix">' . t('Textfield #suffix element') . '</div>',
+  );
+  $form['form_textfield_test_title_after'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Textfield test for title after element'),
+    '#title_display' => 'after',
+  );
+  $form['form_textfield_test_title_invisible'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Textfield test for invisible title'),
+    '#title_display' => 'invisible',
+  );
+  // Textfield test for title set not to display.
+  $form['form_textfield_test_title_no_show'] = array(
+    '#type' => 'textfield',
+  );
+  // Checkboxes & radios with title as attribute.
+  $form['form_checkboxes_title_attribute'] = array(
+    '#type' => 'checkboxes',
+    '#title' => 'Checkboxes test',
+    '#options' => array(
+      'first-checkbox' => 'First checkbox',
+      'second-checkbox' => 'Second checkbox',
+    ),
+    '#title_display' => 'attribute',
+    '#required' => TRUE,
+  );
+  $form['form_radios_title_attribute'] = array(
+    '#type' => 'radios',
+    '#title' => 'Radios test',
+    '#options' => array(
+      'first-radio' => 'First radio',
+      'second-radio' => 'Second radio',
+    ),
+    '#title_display' => 'attribute',
+    '#required' => TRUE,
+  );
+
+  return $form;
+}
+
+/**
+ * Menu callback; Invokes a form builder function with a wrapper callback.
+ */
+function form_test_wrapper_callback($form_id) {
+  $form_state = array(
+    'build_info' => array('args' => array()),
+    'wrapper_callback' => 'form_test_wrapper_callback_wrapper',
+  );
+  return drupal_build_form($form_id, $form_state);
+}
+
+/**
+ * Form wrapper for form_test_wrapper_callback_form().
+ */
+function form_test_wrapper_callback_wrapper($form, &$form_state) {
+  $form['wrapper'] = array('#markup' => 'Form wrapper callback element output.');
+  return $form;
+}
+
+/**
+ * Form builder for form wrapper callback test.
+ */
+function form_test_wrapper_callback_form($form, &$form_state) {
+  $form['builder'] = array('#markup' => 'Form builder element output.');
+  return $form;
+}
+
+/**
+ * Form builder for form_state_values_clean() test.
+ */
+function form_test_form_state_values_clean_form($form, &$form_state) {
+  // Build an example form containing multiple submit and button elements; not
+  // only on the top-level.
+  $form = array('#tree' => TRUE);
+  $form['foo'] = array('#type' => 'submit', '#value' => t('Submit'));
+  $form['bar'] = array('#type' => 'submit', '#value' => t('Submit'));
+  $form['beer'] = array('#type' => 'value', '#value' => 1000);
+  $form['baz']['foo'] = array('#type' => 'button', '#value' => t('Submit'));
+  $form['baz']['baz'] = array('#type' => 'submit', '#value' => t('Submit'));
+  $form['baz']['beer'] = array('#type' => 'value', '#value' => 2000);
+  return $form;
+}
+
+/**
+ * Form submit handler for form_state_values_clean() test form.
+ */
+function form_test_form_state_values_clean_form_submit($form, &$form_state) {
+  form_state_values_clean($form_state);
+  drupal_json_output($form_state['values']);
+  exit;
+}
+
+/**
+ * Form constructor for the form_state_values_clean() test.
+ */
+function form_test_form_state_values_clean_advanced_form($form, &$form_state) {
+  // Build an example form containing a managed file and a submit form element.
+  $form['image'] = array(
+    '#type' => 'managed_file',
+    '#title' => t('Image'),
+    '#upload_location' => 'public://',
+    '#default_value' => 0,
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit'),
+  );
+  return $form;
+}
+
+/**
+ * Form submission handler for form_test_form_state_values_clean_advanced_form().
+ */
+function form_test_form_state_values_clean_advanced_form_submit($form, &$form_state) {
+  form_state_values_clean($form_state);
+  print t('You WIN!');
+  exit;
+}
+
+/**
+ * Build a form to test a checkbox.
+ */
+function _form_test_checkbox($form, &$form_state) {
+  // A required checkbox.
+  $form['required_checkbox'] = array(
+    '#type' => 'checkbox',
+    '#required' => TRUE,
+    '#title' => 'required_checkbox',
+  );
+
+  // A disabled checkbox should get its default value back.
+  $form['disabled_checkbox_on'] = array(
+    '#type' => 'checkbox',
+    '#disabled' => TRUE,
+    '#return_value' => 'disabled_checkbox_on',
+    '#default_value' => 'disabled_checkbox_on',
+    '#title' => 'disabled_checkbox_on',
+  );
+  $form['disabled_checkbox_off'] = array(
+    '#type' => 'checkbox',
+    '#disabled' => TRUE,
+    '#return_value' => 'disabled_checkbox_off',
+    '#default_value' => NULL,
+    '#title' => 'disabled_checkbox_off',
+  );
+
+  // A checkbox is active when #default_value == #return_value.
+  $form['checkbox_on'] = array(
+    '#type' => 'checkbox',
+    '#return_value' => 'checkbox_on',
+    '#default_value' => 'checkbox_on',
+    '#title' => 'checkbox_on',
+  );
+
+  // But inactive in any other case.
+  $form['checkbox_off'] = array(
+    '#type' => 'checkbox',
+    '#return_value' => 'checkbox_off',
+    '#default_value' => 'checkbox_on',
+    '#title' => 'checkbox_off',
+  );
+
+  // Checkboxes with a #return_value of '0' are supported.
+  $form['zero_checkbox_on'] = array(
+    '#type' => 'checkbox',
+    '#return_value' => '0',
+    '#default_value' => '0',
+    '#title' => 'zero_checkbox_on',
+  );
+
+  // In that case, passing a #default_value != '0' means that the checkbox is off.
+  $form['zero_checkbox_off'] = array(
+    '#type' => 'checkbox',
+    '#return_value' => '0',
+    '#default_value' => '1',
+    '#title' => 'zero_checkbox_off',
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit')
+  );
+
+  return $form;
+}
+
+/**
+ * Return the form values via JSON.
+ */
+function _form_test_checkbox_submit($form, &$form_state) {
+  drupal_json_output($form_state['values']);
+  exit();
+}
+
+/**
+ * Builds a form to test #type 'select' validation.
+ */
+function form_test_select($form, &$form_state) {
+  $base = array(
+    '#type' => 'select',
+    '#options' => drupal_map_assoc(array('one', 'two', 'three')),
+  );
+
+  $form['select'] = $base + array(
+    '#title' => '#default_value one',
+    '#default_value' => 'one',
+  );
+  $form['select_required'] = $base + array(
+    '#title' => '#default_value one, #required',
+    '#required' => TRUE,
+    '#default_value' => 'one',
+  );
+  $form['select_optional'] = $base + array(
+    '#title' => '#default_value one, not #required',
+    '#required' => FALSE,
+    '#default_value' => 'one',
+  );
+  $form['empty_value'] = $base + array(
+    '#title' => '#default_value one, #required, #empty_value 0',
+    '#required' => TRUE,
+    '#default_value' => 'one',
+    '#empty_value' => 0,
+  );
+  $form['empty_value_one'] = $base + array(
+    '#title' => '#default_value = #empty_value, #required',
+    '#required' => TRUE,
+    '#default_value' => 'one',
+    '#empty_value' => 'one',
+  );
+
+  $form['no_default'] = $base + array(
+    '#title' => 'No #default_value, #required',
+    '#required' => TRUE,
+  );
+  $form['no_default_optional'] = $base + array(
+    '#title' => 'No #default_value, not #required',
+    '#required' => FALSE,
+    '#description' => 'Should result in "one", because it is not required and there is no #empty_value requested, so default browser behavior of preselecting first option is in effect.',
+  );
+  $form['no_default_optional_empty_value'] = $base + array(
+    '#title' => 'No #default_value, not #required, #empty_value empty string',
+    '#empty_value' => '',
+    '#required' => FALSE,
+    '#description' => 'Should result in an empty string (due to #empty_value), because it is optional.',
+  );
+
+  $form['no_default_empty_option'] = $base + array(
+    '#title' => 'No #default_value, #required, #empty_option',
+    '#required' => TRUE,
+    '#empty_option' => '- Choose -',
+  );
+  $form['no_default_empty_option_optional'] = $base + array(
+    '#title' => 'No #default_value, not #required, #empty_option',
+    '#empty_option' => '- Dismiss -',
+    '#description' => 'Should result in an empty string (default of #empty_value), because it is optional.',
+  );
+
+  $form['no_default_empty_value'] = $base + array(
+    '#title' => 'No #default_value, #required, #empty_value 0',
+    '#required' => TRUE,
+    '#empty_value' => 0,
+    '#description' => 'Should never result in 0.',
+  );
+  $form['no_default_empty_value_one'] = $base + array(
+    '#title' => 'No #default_value, #required, #empty_value one',
+    '#required' => TRUE,
+    '#empty_value' => 'one',
+    '#description' => 'A mistakenly assigned #empty_value contained in #options should not be valid.',
+  );
+  $form['no_default_empty_value_optional'] = $base + array(
+    '#title' => 'No #default_value, not #required, #empty_value 0',
+    '#required' => FALSE,
+    '#empty_value' => 0,
+    '#description' => 'Should result in 0, because it is optional.',
+  );
+
+  $form['multiple'] = $base + array(
+    '#title' => '#multiple, #default_value two',
+    '#default_value' => array('two'),
+    '#multiple' => TRUE,
+  );
+  $form['multiple_no_default'] = $base + array(
+    '#title' => '#multiple, no #default_value',
+    '#multiple' => TRUE,
+  );
+  $form['multiple_no_default_required'] = $base + array(
+    '#title' => '#multiple, #required, no #default_value',
+    '#required' => TRUE,
+    '#multiple' => TRUE,
+  );
+
+  $form['submit'] = array('#type' => 'submit', '#value' => 'Submit');
+  return $form;
+}
+
+/**
+ * Form submit handler for form_test_select().
+ */
+function form_test_select_submit($form, &$form_state) {
+  drupal_json_output($form_state['values']);
+  exit();
+}
+
+/**
+ * Form constructor to test expansion of #type checkboxes and radios.
+ */
+function form_test_checkboxes_radios($form, &$form_state, $customize = FALSE) {
+  $form['#submit'] = array('_form_test_submit_values_json');
+
+  // Expand #type checkboxes, setting custom element properties for some but not
+  // all options.
+  $form['checkboxes'] = array(
+    '#type' => 'checkboxes',
+    '#title' => 'Checkboxes',
+    '#options' => array(
+      0 => 'Zero',
+      'foo' => 'Foo',
+      1 => 'One',
+      'bar' => 'Bar',
+      '>' => 'Special Char',
+    ),
+  );
+  if ($customize) {
+    $form['checkboxes'] += array(
+      'foo' => array(
+        '#description' => 'Enable to foo.',
+      ),
+      1 => array(
+        '#weight' => 10,
+      ),
+    );
+  }
+
+  // Expand #type radios, setting custom element properties for some but not
+  // all options.
+  $form['radios'] = array(
+    '#type' => 'radios',
+    '#title' => 'Radios',
+    '#options' => array(
+      0 => 'Zero',
+      'foo' => 'Foo',
+      1 => 'One',
+      'bar' => 'Bar',
+      '>' => 'Special Char',
+    ),
+  );
+  if ($customize) {
+    $form['radios'] += array(
+      'foo' => array(
+        '#description' => 'Enable to foo.',
+      ),
+      1 => array(
+        '#weight' => 10,
+      ),
+    );
+  }
+
+  $form['submit'] = array('#type' => 'submit', '#value' => 'Submit');
+
+  return $form;
+}
+
+/**
+ * Build a form to test disabled elements.
+ */
+function _form_test_disabled_elements($form, &$form_state) {
+  // Elements that take a simple default value.
+  foreach (array('textfield', 'textarea', 'hidden') as $type) {
+    $form[$type] = array(
+      '#type' => $type,
+      '#title' => $type,
+      '#default_value' => $type,
+      '#test_hijack_value' => 'HIJACK',
+      '#disabled' => TRUE,
+    );
+  }
+
+  // Multiple values option elements.
+  foreach (array('checkboxes', 'select') as $type) {
+    $form[$type . '_multiple'] = array(
+      '#type' => $type,
+      '#title' => $type . ' (multiple)',
+      '#options' => array(
+        'test_1' => 'Test 1',
+        'test_2' => 'Test 2',
+      ),
+      '#multiple' => TRUE,
+      '#default_value' => array('test_2' => 'test_2'),
+      // The keys of #test_hijack_value need to match the #name of the control.
+      // @see FormsTestCase::testDisabledElements()
+      '#test_hijack_value' => $type == 'select' ? array('' => 'test_1') : array('test_1' => 'test_1'),
+      '#disabled' => TRUE,
+    );
+  }
+
+  // Single values option elements.
+  foreach (array('radios', 'select') as $type) {
+    $form[$type . '_single'] = array(
+      '#type' => $type,
+      '#title' => $type . ' (single)',
+      '#options' => array(
+        'test_1' => 'Test 1',
+        'test_2' => 'Test 2',
+      ),
+      '#multiple' => FALSE,
+      '#default_value' => 'test_2',
+      '#test_hijack_value' => 'test_1',
+      '#disabled' => TRUE,
+    );
+  }
+
+  // Checkbox and radio.
+  foreach (array('checkbox', 'radio') as $type) {
+    $form[$type . '_unchecked'] = array(
+      '#type' => $type,
+      '#title' => $type . ' (unchecked)',
+      '#return_value' => 1,
+      '#default_value' => 0,
+      '#test_hijack_value' => 1,
+      '#disabled' => TRUE,
+    );
+    $form[$type . '_checked'] = array(
+      '#type' => $type,
+      '#title' => $type . ' (checked)',
+      '#return_value' => 1,
+      '#default_value' => 1,
+      '#test_hijack_value' => NULL,
+      '#disabled' => TRUE,
+    );
+  }
+
+  // Weight.
+  $form['weight'] = array(
+    '#type' => 'weight',
+    '#title' => 'weight',
+    '#default_value' => 10,
+    '#test_hijack_value' => 5,
+    '#disabled' => TRUE,
+  );
+
+  // Date.
+  $form['date'] = array(
+    '#type' => 'date',
+    '#title' => 'date',
+    '#disabled' => TRUE,
+    '#default_value' => array(
+      'day' => 19,
+      'month' => 11,
+      'year' => 1978,
+    ),
+    '#test_hijack_value' => array(
+      'day' => 20,
+      'month' => 12,
+      'year' => 1979,
+    ),
+  );
+
+  // The #disabled state should propagate to children.
+  $form['disabled_container'] = array(
+    '#disabled' => TRUE,
+  );
+  foreach (array('textfield', 'textarea', 'hidden') as $type) {
+    $form['disabled_container']['disabled_container_' . $type] = array(
+      '#type' => $type,
+      '#title' => $type,
+      '#default_value' => $type,
+      '#test_hijack_value' => 'HIJACK',
+    );
+  }
+
+  // Text format.
+  $form['text_format'] = array(
+    '#type' => 'text_format',
+    '#title' => 'Text format',
+    '#disabled' => TRUE,
+    '#default_value' => 'Text value',
+    '#format' => 'plain_text',
+    '#expected_value' => array(
+      'value' => 'Text value',
+      'format' => 'plain_text',
+    ),
+    '#test_hijack_value' => array(
+      'value' => 'HIJACK',
+      'format' => 'filtered_html',
+    ),
+  );
+
+  // Password fields.
+  $form['password'] = array(
+    '#type' => 'password',
+    '#title' => 'Password',
+    '#disabled' => TRUE,
+  );
+  $form['password_confirm'] = array(
+    '#type' => 'password_confirm',
+    '#title' => 'Password confirm',
+    '#disabled' => TRUE,
+  );
+
+  // Files.
+  $form['file'] = array(
+    '#type' => 'file',
+    '#title' => 'File',
+    '#disabled' => TRUE,
+  );
+  $form['managed_file'] = array(
+    '#type' => 'managed_file',
+    '#title' => 'Managed file',
+    '#disabled' => TRUE,
+  );
+
+  // Buttons.
+  $form['image_button'] = array(
+    '#type' => 'image_button',
+    '#value' => 'Image button',
+    '#disabled' => TRUE,
+  );
+  $form['button'] = array(
+    '#type' => 'button',
+    '#value' => 'Button',
+    '#disabled' => TRUE,
+  );
+  $form['submit_disabled'] = array(
+    '#type' => 'submit',
+    '#value' => 'Submit',
+    '#disabled' => TRUE,
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit'),
+  );
+
+  return $form;
+}
+
+/**
+ * Return the form values via JSON.
+ */
+function _form_test_disabled_elements_submit($form, &$form_state) {
+  drupal_json_output($form_state['values']);
+  exit();
+}
+
+/**
+ * Build a form to test input forgery of enabled elements.
+ */
+function _form_test_input_forgery($form, &$form_state) {
+  // For testing that a user can't submit a value not matching one of the
+  // allowed options.
+  $form['checkboxes'] = array(
+    '#type' => 'checkboxes',
+    '#options' => array(
+      'one' => 'One',
+      'two' => 'Two',
+    ),
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit'),
+  );
+  return $form;
+}
+
+/**
+ * Return the form values via JSON.
+ */
+function _form_test_input_forgery_submit($form, &$form_state) {
+  drupal_json_output($form_state['values']);
+  exit();
+}
+
+/**
+ * Form builder for testing preservation of values during a rebuild.
+ */
+function form_test_form_rebuild_preserve_values_form($form, &$form_state) {
+  // Start the form with two checkboxes, to test different defaults, and a
+  // textfield, to test more than one element type.
+  $form = array(
+    'checkbox_1_default_off' => array(
+      '#type' => 'checkbox',
+      '#title' => t('This checkbox defaults to unchecked.'),
+      '#default_value' => FALSE,
+    ),
+    'checkbox_1_default_on' => array(
+      '#type' => 'checkbox',
+      '#title' => t('This checkbox defaults to checked.'),
+      '#default_value' => TRUE,
+    ),
+    'text_1' => array(
+      '#type' => 'textfield',
+      '#title' => t('This textfield has a non-empty default value.'),
+      '#default_value' => 'DEFAULT 1',
+    ),
+  );
+  // Provide an 'add more' button that rebuilds the form with an additional two
+  // checkboxes and a textfield. The test is to make sure that the rebuild
+  // triggered by this button preserves the user input values for the initial
+  // elements and initializes the new elements with the correct default values.
+  if (empty($form_state['storage']['add_more'])) {
+    $form['add_more'] = array(
+      '#type' => 'submit',
+      '#value' => 'Add more',
+      '#submit' => array('form_test_form_rebuild_preserve_values_form_add_more'),
+    );
+  }
+  else {
+    $form += array(
+      'checkbox_2_default_off' => array(
+        '#type' => 'checkbox',
+        '#title' => t('This checkbox defaults to unchecked.'),
+        '#default_value' => FALSE,
+      ),
+      'checkbox_2_default_on' => array(
+        '#type' => 'checkbox',
+        '#title' => t('This checkbox defaults to checked.'),
+        '#default_value' => TRUE,
+      ),
+      'text_2' => array(
+        '#type' => 'textfield',
+        '#title' => t('This textfield has a non-empty default value.'),
+        '#default_value' => 'DEFAULT 2',
+      ),
+    );
+  }
+  // A submit button that finishes the form workflow (does not rebuild).
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => 'Submit',
+  );
+  return $form;
+}
+
+/**
+ * Button submit handler for form_test_form_rebuild_preserve_values_form().
+ */
+function form_test_form_rebuild_preserve_values_form_add_more($form, &$form_state) {
+  // Rebuild, to test preservation of input values.
+  $form_state['storage']['add_more'] = TRUE;
+  $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * Form submit handler for form_test_form_rebuild_preserve_values_form().
+ */
+function form_test_form_rebuild_preserve_values_form_submit($form, &$form_state) {
+  // Finish the workflow. Do not rebuild.
+  drupal_set_message(t('Form values: %values', array('%values' => var_export($form_state['values'], TRUE))));
+}
+
+/**
+ * Form constructor for testing form state persistence.
+ */
+function form_test_state_persist($form, &$form_state) {
+  $form['title'] = array(
+    '#type' => 'textfield',
+    '#title' => 'title',
+    '#default_value' => 'DEFAULT',
+    '#required' => TRUE,
+  );
+  $form_state['value'] = 'State persisted.';
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit'),
+  );
+  return $form;
+}
+
+/**
+ * Submit handler.
+ *
+ * @see form_test_state_persist()
+ */
+function form_test_state_persist_submit($form, &$form_state) {
+  drupal_set_message($form_state['value']);
+  $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * @see form_test_state_persist()
+ */
+function form_test_form_form_test_state_persist_alter(&$form, &$form_state) {
+  // Simulate a form alter implementation inserting form elements that enable
+  // caching of the form, e.g. elements having #ajax.
+  if (!empty($_REQUEST['cache'])) {
+    $form_state['cache'] = TRUE;
+  }
+}
+
+/**
+ * Form builder to test programmatic form submissions.
+ */
+function form_test_programmatic_form($form, &$form_state) {
+  $form['textfield'] = array(
+    '#title' => 'Textfield',
+    '#type' => 'textfield',
+  );
+
+  $form['checkboxes'] = array(
+    '#type' => 'checkboxes',
+    '#options' => array(
+      1 => 'First checkbox',
+      2 => 'Second checkbox',
+    ),
+    // Both checkboxes are selected by default so that we can test the ability
+    // of programmatic form submissions to uncheck them.
+    '#default_value' => array(1, 2),
+  );
+
+  $form['field_to_validate'] = array(
+    '#type' => 'radios',
+    '#title' => 'Field to validate (in the case of limited validation)',
+    '#description' => 'If the form is submitted by clicking the "Submit with limited validation" button, then validation can be limited based on the value of this radio button.',
+    '#options' => array(
+      'all' => 'Validate all fields',
+      'textfield' => 'Validate the "Textfield" field',
+      'field_to_validate' => 'Validate the "Field to validate" field',
+    ),
+    '#default_value' => 'all',
+  );
+
+  // The main submit button for the form.
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => 'Submit',
+  );
+  // A secondary submit button that allows validation to be limited based on
+  // the value of the above radio selector.
+  $form['submit_limit_validation'] = array(
+    '#type' => 'submit',
+    '#value' => 'Submit with limited validation',
+    // Use the same submit handler for this button as for the form itself.
+    // (This must be set explicitly or otherwise the form API will ignore the
+    // #limit_validation_errors property.)
+    '#submit' => array('form_test_programmatic_form_submit'),
+  );
+  if (!empty($form_state['input']['field_to_validate']) && $form_state['input']['field_to_validate'] != 'all') {
+    $form['submit_limit_validation']['#limit_validation_errors'] = array(
+      array($form_state['input']['field_to_validate']),
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Form validation handler for programmatic form submissions.
+ *
+ * To test that the validation handler is correctly executed, the field value is
+ * explicitly required here.
+ */
+function form_test_programmatic_form_validate($form, &$form_state) {
+  if (empty($form_state['values']['textfield'])) {
+    form_set_error('textfield', t('Textfield is required.'));
+  }
+}
+
+/**
+ * Form submit handler for programmatic form submissions.
+ *
+ * To test that the submission handler is correctly executed, we store the
+ * submitted values in a place we can access from the caller context.
+ */
+function form_test_programmatic_form_submit($form, &$form_state) {
+  $form_state['storage']['programmatic_form_submit'] = $form_state['values'];
+}
+
+/**
+ * Form builder to test button click detection.
+ */
+function form_test_clicked_button($form, &$form_state) {
+  // A single text field. In IE, when a form has only one non-button input field
+  // and the ENTER key is pressed while that field has focus, the form is
+  // submitted without any information identifying the button responsible for
+  // the submission. In other browsers, the form is submitted as though the
+  // first button were clicked.
+  $form['text'] = array(
+    '#title' => 'Text',
+    '#type' => 'textfield',
+  );
+
+  // Loop through each path argument, addding buttons based on the information
+  // in the argument. For example, if the path is
+  // form-test/clicked-button/s/i/rb, then 3 buttons are added: a 'submit', an
+  // 'image_button', and a 'button' with #access=FALSE. This enables form.test
+  // to test a variety of combinations.
+  $i=0;
+  $args = array_slice(arg(), 2);
+  foreach ($args as $arg) {
+    $name = 'button' . ++$i;
+    // 's', 'b', or 'i' in the argument define the button type wanted.
+    if (strpos($arg, 's') !== FALSE) {
+      $type = 'submit';
+    }
+    elseif (strpos($arg, 'b') !== FALSE) {
+      $type = 'button';
+    }
+    elseif (strpos($arg, 'i') !== FALSE) {
+      $type = 'image_button';
+    }
+    else {
+      $type = NULL;
+    }
+    if (isset($type)) {
+      $form[$name] = array(
+        '#type' => $type,
+        '#name' => $name,
+      );
+      // Image buttons need a #src; the others need a #value.
+      if ($type == 'image_button') {
+        $form[$name]['#src'] = 'misc/druplicon.png';
+      }
+      else {
+        $form[$name]['#value'] = $name;
+      }
+      // 'r' for restricted, so we can test that button click detection code
+      // correctly takes #access security into account.
+      if (strpos($arg, 'r') !== FALSE) {
+        $form[$name]['#access'] = FALSE;
+      }
+    }
+  }
+
+  return $form;
+}
+
+/**
+ * Form validation handler for the form_test_clicked_button() form.
+ */
+function form_test_clicked_button_validate($form, &$form_state) {
+  if (isset($form_state['triggering_element'])) {
+    drupal_set_message(t('The clicked button is %name.', array('%name' => $form_state['triggering_element']['#name'])));
+  }
+  else {
+    drupal_set_message('There is no clicked button.');
+  }
+}
+
+/**
+ * Form submit handler for the form_test_clicked_button() form.
+ */
+function form_test_clicked_button_submit($form, &$form_state) {
+  drupal_set_message('Submit handler for form_test_clicked_button executed.');
+}
+
+/**
+ * Form builder to detect form redirect.
+ */
+function form_test_redirect($form, &$form_state) {
+  $form['redirection'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Use redirection'),
+  );
+  $form['destination'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Redirect destination'),
+    '#states' => array(
+      'visible' => array(
+        ':input[name="redirection"]' => array('checked' => TRUE),
+      ),
+    ),
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form submit handler to test different redirect behaviours.
+ */
+function form_test_redirect_submit(&$form, &$form_state) {
+  if (!empty($form_state['values']['redirection'])) {
+    $form_state['redirect'] = !empty($form_state['values']['destination']) ? $form_state['values']['destination'] : NULL;
+  }
+  else {
+    $form_state['redirect'] = FALSE;
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter() for the registration form.
+ */
+function form_test_form_user_register_form_alter(&$form, &$form_state) {
+  $form['test_rebuild'] = array(
+    '#type' => 'submit',
+    '#value' => t('Rebuild'),
+    '#submit' => array('form_test_user_register_form_rebuild'),
+  );
+  // If requested, add the test field by attaching the node page form.
+  if (!empty($_REQUEST['field'])) {
+    $node = (object)array('type' => 'page');
+    field_attach_form('node', $node, $form, $form_state);
+  }
+}
+
+/**
+ * Submit callback that just lets the form rebuild.
+ */
+function form_test_user_register_form_rebuild($form, &$form_state) {
+  drupal_set_message('Form rebuilt.');
+  $form_state['rebuild'] = TRUE;
+}
+
+/**
+ * Menu callback that returns two instances of the node form.
+ */
+function form_test_two_instances() {
+  global $user;
+  $node1 = (object) array(
+    'uid' => $user->uid,
+    'name' => (isset($user->name) ? $user->name : ''),
+    'type' => 'page',
+    'language' => LANGUAGE_NONE,
+  );
+  $node2 = clone($node1);
+  $return['node_form_1'] = drupal_get_form('page_node_form', $node1);
+  $return['node_form_2'] = drupal_get_form('page_node_form', $node2);
+  return $return;
+}
+
+/**
+ * Menu callback for testing custom form includes.
+ */
+function form_test_load_include_custom($form, &$form_state) {
+  $form['button'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+    '#submit' => array('form_test_load_include_submit'),
+  );
+  // Specify the include file and enable form caching. That way the form is
+  // cached when it is submitted, but needs to find the specified submit handler
+  // in the include.
+  // Filename is a bit weird here: modules/simpletest/tests/form_test.file.inc
+  form_load_include($form_state, 'inc', 'form_test', 'form_test.file');
+  $form_state['cache'] = TRUE;
+  return $form;
+}
+
+function form_test_checkbox_type_juggling($form, $form_state, $default_value, $return_value) {
+  $form['checkbox'] = array(
+    '#type' => 'checkbox',
+    '#return_value' => $return_value,
+    '#default_value' => $default_value,
+  );
+  return $form;
+}
+
+function form_test_checkboxes_zero($form, &$form_state, $json = TRUE) {
+  $form['checkbox_off'] = array(
+    '#type' => 'checkboxes',
+    '#options' => array('foo', 'bar', 'baz'),
+  );
+  $form['checkbox_zero_default'] = array(
+    '#type' => 'checkboxes',
+    '#options' => array('foo', 'bar', 'baz'),
+    '#default_value' => array(0),
+  );
+  $form['checkbox_string_zero_default'] = array(
+    '#type' => 'checkboxes',
+    '#options' => array('foo', 'bar', 'baz'),
+    '#default_value' => array('0'),
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => 'Save',
+  );
+  if ($json) {
+    $form['#submit'][] = '_form_test_checkbox_submit';
+  }
+  else {
+    $form['#submit'][] = '_form_test_checkboxes_zero_no_redirect';
+  }
+  return $form;
+}
+
+function _form_test_checkboxes_zero_no_redirect($form, &$form_state) {
+  $form_state['redirect'] = FALSE;
+}
+
+/**
+ * Menu callback returns two instances of the same form.
+ */
+function form_test_double_form() {
+  return array(
+    'form1' => drupal_get_form('form_test_html_id'),
+    'form2' => drupal_get_form('form_test_html_id'),
+  );
+}
+
+/**
+ * Builds a simple form to test duplicate HTML IDs.
+ */
+function form_test_html_id($form, &$form_state) {
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => 'name',
+    '#required' => TRUE,
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => 'Save',
+  );
+  return $form;
+}
diff --git a/htmltest/modules/simpletest/tests/graph.test b/htmltest/modules/simpletest/tests/graph.test
new file mode 100644
index 00000000..691744ef
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/graph.test
@@ -0,0 +1,195 @@
+<?php
+
+/**
+ * @file
+ * Provides unit tests for graph.inc.
+ */
+
+/**
+ * Unit tests for the graph handling features.
+ */
+class GraphUnitTest extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Graph',
+      'description' => 'Graph handling unit tests.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    require_once DRUPAL_ROOT . '/includes/graph.inc';
+    parent::setUp();
+  }
+
+  /**
+   * Test depth-first-search features.
+   */
+  function testDepthFirstSearch() {
+    // The sample graph used is:
+    // 1 --> 2 --> 3     5 ---> 6
+    //       |     ^     ^
+    //       |     |     |
+    //       |     |     |
+    //       +---> 4 <-- 7      8 ---> 9
+    $graph = $this->normalizeGraph(array(
+      1 => array(2),
+      2 => array(3, 4),
+      3 => array(),
+      4 => array(3),
+      5 => array(6),
+      7 => array(4, 5),
+      8 => array(9),
+      9 => array(),
+    ));
+    drupal_depth_first_search($graph);
+
+    $expected_paths = array(
+      1 => array(2, 3, 4),
+      2 => array(3, 4),
+      3 => array(),
+      4 => array(3),
+      5 => array(6),
+      7 => array(4, 3, 5, 6),
+      8 => array(9),
+      9 => array(),
+    );
+    $this->assertPaths($graph, $expected_paths);
+
+    $expected_reverse_paths = array(
+      1 => array(),
+      2 => array(1),
+      3 => array(2, 1, 4, 7),
+      4 => array(2, 1, 7),
+      5 => array(7),
+      7 => array(),
+      8 => array(),
+      9 => array(8),
+    );
+    $this->assertReversePaths($graph, $expected_reverse_paths);
+
+    // Assert that DFS didn't created "missing" vertexes automatically.
+    $this->assertFALSE(isset($graph[6]), 'Vertex 6 has not been created');
+
+    $expected_components = array(
+      array(1, 2, 3, 4, 5, 7),
+      array(8, 9),
+    );
+    $this->assertComponents($graph, $expected_components);
+
+    $expected_weights = array(
+      array(1, 2, 3),
+      array(2, 4, 3),
+      array(7, 4, 3),
+      array(7, 5),
+      array(8, 9),
+    );
+    $this->assertWeights($graph, $expected_weights);
+  }
+
+  /**
+   * Return a normalized version of a graph.
+   */
+  function normalizeGraph($graph) {
+    $normalized_graph = array();
+    foreach ($graph as $vertex => $edges) {
+      // Create vertex even if it hasn't any edges.
+      $normalized_graph[$vertex] = array();
+      foreach ($edges as $edge) {
+        $normalized_graph[$vertex]['edges'][$edge] = TRUE;
+      }
+    }
+    return $normalized_graph;
+  }
+
+  /**
+   * Verify expected paths in a graph.
+   *
+   * @param $graph
+   *   A graph array processed by drupal_depth_first_search().
+   * @param $expected_paths
+   *   An associative array containing vertices with their expected paths.
+   */
+  function assertPaths($graph, $expected_paths) {
+    foreach ($expected_paths as $vertex => $paths) {
+      // Build an array with keys = $paths and values = TRUE.
+      $expected = array_fill_keys($paths, TRUE);
+      $result = isset($graph[$vertex]['paths']) ? $graph[$vertex]['paths'] : array();
+      $this->assertEqual($expected, $result, format_string('Expected paths for vertex @vertex: @expected-paths, got @paths', array('@vertex' => $vertex, '@expected-paths' => $this->displayArray($expected, TRUE), '@paths' => $this->displayArray($result, TRUE))));
+    }
+  }
+
+  /**
+   * Verify expected reverse paths in a graph.
+   *
+   * @param $graph
+   *   A graph array processed by drupal_depth_first_search().
+   * @param $expected_reverse_paths
+   *   An associative array containing vertices with their expected reverse
+   *   paths.
+   */
+  function assertReversePaths($graph, $expected_reverse_paths) {
+    foreach ($expected_reverse_paths as $vertex => $paths) {
+      // Build an array with keys = $paths and values = TRUE.
+      $expected = array_fill_keys($paths, TRUE);
+      $result = isset($graph[$vertex]['reverse_paths']) ? $graph[$vertex]['reverse_paths'] : array();
+      $this->assertEqual($expected, $result, format_string('Expected reverse paths for vertex @vertex: @expected-paths, got @paths', array('@vertex' => $vertex, '@expected-paths' => $this->displayArray($expected, TRUE), '@paths' => $this->displayArray($result, TRUE))));
+    }
+  }
+
+  /**
+   * Verify expected components in a graph.
+   *
+   * @param $graph
+   *   A graph array processed by drupal_depth_first_search().
+   * @param $expected_components
+   *   An array containing of components defined as a list of their vertices.
+   */
+  function assertComponents($graph, $expected_components) {
+    $unassigned_vertices = array_fill_keys(array_keys($graph), TRUE);
+    foreach ($expected_components as $component) {
+      $result_components = array();
+      foreach ($component as $vertex) {
+        $result_components[] = $graph[$vertex]['component'];
+        unset($unassigned_vertices[$vertex]);
+      }
+      $this->assertEqual(1, count(array_unique($result_components)), format_string('Expected one unique component for vertices @vertices, got @components', array('@vertices' => $this->displayArray($component), '@components' => $this->displayArray($result_components))));
+    }
+    $this->assertEqual(array(), $unassigned_vertices, format_string('Vertices not assigned to a component: @vertices', array('@vertices' => $this->displayArray($unassigned_vertices, TRUE))));
+  }
+
+  /**
+   * Verify expected order in a graph.
+   *
+   * @param $graph
+   *   A graph array processed by drupal_depth_first_search().
+   * @param $expected_orders
+   *   An array containing lists of vertices in their expected order.
+   */
+  function assertWeights($graph, $expected_orders) {
+    foreach ($expected_orders as $order) {
+      $previous_vertex = array_shift($order);
+      foreach ($order as $vertex) {
+        $this->assertTrue($graph[$previous_vertex]['weight'] < $graph[$vertex]['weight'], format_string('Weights of @previous-vertex and @vertex are correct relative to each other', array('@previous-vertex' => $previous_vertex, '@vertex' => $vertex)));
+      }
+    }
+  }
+
+  /**
+   * Helper function to output vertices as comma-separated list.
+   *
+   * @param $paths
+   *   An array containing a list of vertices.
+   * @param $keys
+   *   (optional) Whether to output the keys of $paths instead of the values.
+   */
+  function displayArray($paths, $keys = FALSE) {
+    if (!empty($paths)) {
+      return implode(', ', $keys ? array_keys($paths) : $paths);
+    }
+    else {
+      return '(empty)';
+    }
+  }
+}
+
diff --git a/htmltest/modules/simpletest/tests/http.php b/htmltest/modules/simpletest/tests/http.php
new file mode 100644
index 00000000..a22938d9
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/http.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Fake an HTTP request, for use during testing.
+ */
+
+// Set a global variable to indicate a mock HTTP request.
+$is_http_mock = !empty($_SERVER['HTTPS']);
+
+// Change to HTTP.
+$_SERVER['HTTPS'] = NULL;
+ini_set('session.cookie_secure', FALSE);
+foreach ($_SERVER as $key => $value) {
+  $_SERVER[$key] = str_replace('modules/simpletest/tests/http.php', 'index.php', $value);
+  $_SERVER[$key] = str_replace('https://', 'http://', $_SERVER[$key]);
+}
+
+// Change current directory to the Drupal root.
+chdir('../../..');
+define('DRUPAL_ROOT', getcwd());
+require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
+
+// Make sure this file can only be used by simpletest.
+drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
+if (!drupal_valid_test_ua()) {
+  header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
+  exit;
+}
+
+drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+menu_execute_active_handler();
diff --git a/htmltest/modules/simpletest/tests/https.php b/htmltest/modules/simpletest/tests/https.php
new file mode 100644
index 00000000..0e1a4ede
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/https.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Fake an HTTPS request, for use during testing.
+ */
+
+// Set a global variable to indicate a mock HTTPS request.
+$is_https_mock = empty($_SERVER['HTTPS']);
+
+// Change to HTTPS.
+$_SERVER['HTTPS'] = 'on';
+foreach ($_SERVER as $key => $value) {
+  $_SERVER[$key] = str_replace('modules/simpletest/tests/https.php', 'index.php', $value);
+  $_SERVER[$key] = str_replace('http://', 'https://', $_SERVER[$key]);
+}
+
+// Change current directory to the Drupal root.
+chdir('../../..');
+define('DRUPAL_ROOT', getcwd());
+require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
+
+// Make sure this file can only be used by simpletest.
+drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
+if (!drupal_valid_test_ua()) {
+  header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
+  exit;
+}
+
+drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+menu_execute_active_handler();
diff --git a/htmltest/modules/simpletest/tests/image.test b/htmltest/modules/simpletest/tests/image.test
new file mode 100644
index 00000000..dc95a6e2
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/image.test
@@ -0,0 +1,507 @@
+<?php
+
+/**
+ * @file
+ * Tests for core image handling API.
+ */
+
+/**
+ * Base class for image manipulation testing.
+ */
+class ImageToolkitTestCase extends DrupalWebTestCase {
+  protected $toolkit;
+  protected $file;
+  protected $image;
+
+  function setUp() {
+    $modules = func_get_args();
+    if (isset($modules[0]) && is_array($modules[0])) {
+      $modules = $modules[0];
+    }
+    $modules[] = 'image_test';
+
+    parent::setUp($modules);
+
+    // Use the image_test.module's test toolkit.
+    $this->toolkit = 'test';
+
+    // Pick a file for testing.
+    $file = current($this->drupalGetTestFiles('image'));
+    $this->file = $file->uri;
+
+    // Setup a dummy image to work with, this replicate image_load() so we
+    // can avoid calling it.
+    $this->image = new stdClass();
+    $this->image->source = $this->file;
+    $this->image->info = image_get_info($this->file);
+    $this->image->toolkit = $this->toolkit;
+
+    // Clear out any hook calls.
+    image_test_reset();
+  }
+
+  /**
+   * Assert that all of the specified image toolkit operations were called
+   * exactly once once, other values result in failure.
+   *
+   * @param $expected
+   *   Array with string containing with the operation name, e.g. 'load',
+   *   'save', 'crop', etc.
+   */
+  function assertToolkitOperationsCalled(array $expected) {
+    // Determine which operations were called.
+    $actual = array_keys(array_filter(image_test_get_all_calls()));
+
+    // Determine if there were any expected that were not called.
+    $uncalled = array_diff($expected, $actual);
+    if (count($uncalled)) {
+      $this->assertTrue(FALSE, format_string('Expected operations %expected to be called but %uncalled was not called.', array('%expected' => implode(', ', $expected), '%uncalled' => implode(', ', $uncalled))));
+    }
+    else {
+      $this->assertTrue(TRUE, format_string('All the expected operations were called: %expected', array('%expected' => implode(', ', $expected))));
+    }
+
+    // Determine if there were any unexpected calls.
+    $unexpected = array_diff($actual, $expected);
+    if (count($unexpected)) {
+      $this->assertTrue(FALSE, format_string('Unexpected operations were called: %unexpected.', array('%unexpected' => implode(', ', $unexpected))));
+    }
+    else {
+      $this->assertTrue(TRUE, 'No unexpected operations were called.');
+    }
+  }
+}
+
+/**
+ * Test that the functions in image.inc correctly pass data to the toolkit.
+ */
+class ImageToolkitUnitTest extends ImageToolkitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Image toolkit tests',
+      'description' => 'Check image toolkit functions.',
+      'group' => 'Image',
+    );
+  }
+
+  /**
+   * Check that hook_image_toolkits() is called and only available toolkits are
+   * returned.
+   */
+  function testGetAvailableToolkits() {
+    $toolkits = image_get_available_toolkits();
+    $this->assertTrue(isset($toolkits['test']), 'The working toolkit was returned.');
+    $this->assertFalse(isset($toolkits['broken']), 'The toolkit marked unavailable was not returned');
+    $this->assertToolkitOperationsCalled(array());
+  }
+
+  /**
+   * Test the image_load() function.
+   */
+  function testLoad() {
+    $image = image_load($this->file, $this->toolkit);
+    $this->assertTrue(is_object($image), 'Returned an object.');
+    $this->assertEqual($this->toolkit, $image->toolkit, 'Image had toolkit set.');
+    $this->assertToolkitOperationsCalled(array('load', 'get_info'));
+  }
+
+  /**
+   * Test the image_save() function.
+   */
+  function testSave() {
+    $this->assertFalse(image_save($this->image), 'Function returned the expected value.');
+    $this->assertToolkitOperationsCalled(array('save'));
+  }
+
+  /**
+   * Test the image_resize() function.
+   */
+  function testResize() {
+    $this->assertTrue(image_resize($this->image, 1, 2), 'Function returned the expected value.');
+    $this->assertToolkitOperationsCalled(array('resize'));
+
+    // Check the parameters.
+    $calls = image_test_get_all_calls();
+    $this->assertEqual($calls['resize'][0][1], 1, 'Width was passed correctly');
+    $this->assertEqual($calls['resize'][0][2], 2, 'Height was passed correctly');
+  }
+
+  /**
+   * Test the image_scale() function.
+   */
+  function testScale() {
+// TODO: need to test upscaling
+    $this->assertTrue(image_scale($this->image, 10, 10), 'Function returned the expected value.');
+    $this->assertToolkitOperationsCalled(array('resize'));
+
+    // Check the parameters.
+    $calls = image_test_get_all_calls();
+    $this->assertEqual($calls['resize'][0][1], 10, 'Width was passed correctly');
+    $this->assertEqual($calls['resize'][0][2], 5, 'Height was based off aspect ratio and passed correctly');
+  }
+
+  /**
+   * Test the image_scale_and_crop() function.
+   */
+  function testScaleAndCrop() {
+    $this->assertTrue(image_scale_and_crop($this->image, 5, 10), 'Function returned the expected value.');
+    $this->assertToolkitOperationsCalled(array('resize', 'crop'));
+
+    // Check the parameters.
+    $calls = image_test_get_all_calls();
+
+    $this->assertEqual($calls['crop'][0][1], 7.5, 'X was computed and passed correctly');
+    $this->assertEqual($calls['crop'][0][2], 0, 'Y was computed and passed correctly');
+    $this->assertEqual($calls['crop'][0][3], 5, 'Width was computed and passed correctly');
+    $this->assertEqual($calls['crop'][0][4], 10, 'Height was computed and passed correctly');
+  }
+
+  /**
+   * Test the image_rotate() function.
+   */
+  function testRotate() {
+    $this->assertTrue(image_rotate($this->image, 90, 1), 'Function returned the expected value.');
+    $this->assertToolkitOperationsCalled(array('rotate'));
+
+    // Check the parameters.
+    $calls = image_test_get_all_calls();
+    $this->assertEqual($calls['rotate'][0][1], 90, 'Degrees were passed correctly');
+    $this->assertEqual($calls['rotate'][0][2], 1, 'Background color was passed correctly');
+  }
+
+  /**
+   * Test the image_crop() function.
+   */
+  function testCrop() {
+    $this->assertTrue(image_crop($this->image, 1, 2, 3, 4), 'Function returned the expected value.');
+    $this->assertToolkitOperationsCalled(array('crop'));
+
+    // Check the parameters.
+    $calls = image_test_get_all_calls();
+    $this->assertEqual($calls['crop'][0][1], 1, 'X was passed correctly');
+    $this->assertEqual($calls['crop'][0][2], 2, 'Y was passed correctly');
+    $this->assertEqual($calls['crop'][0][3], 3, 'Width was passed correctly');
+    $this->assertEqual($calls['crop'][0][4], 4, 'Height was passed correctly');
+  }
+
+  /**
+   * Test the image_desaturate() function.
+   */
+  function testDesaturate() {
+    $this->assertTrue(image_desaturate($this->image), 'Function returned the expected value.');
+    $this->assertToolkitOperationsCalled(array('desaturate'));
+
+    // Check the parameters.
+    $calls = image_test_get_all_calls();
+    $this->assertEqual(count($calls['desaturate'][0]), 1, 'Only the image was passed.');
+  }
+}
+
+/**
+ * Test the core GD image manipulation functions.
+ */
+class ImageToolkitGdTestCase extends DrupalWebTestCase {
+  // Colors that are used in testing.
+  protected $black       = array(0, 0, 0, 0);
+  protected $red         = array(255, 0, 0, 0);
+  protected $green       = array(0, 255, 0, 0);
+  protected $blue        = array(0, 0, 255, 0);
+  protected $yellow      = array(255, 255, 0, 0);
+  protected $fuchsia     = array(255, 0, 255, 0); // Used as background colors.
+  protected $transparent = array(0, 0, 0, 127);
+  protected $white       = array(255, 255, 255, 0);
+
+  protected $width = 40;
+  protected $height = 20;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Image GD manipulation tests',
+      'description' => 'Check that core image manipulations work properly: scale, resize, rotate, crop, scale and crop, and desaturate.',
+      'group' => 'Image',
+    );
+  }
+
+  /**
+   * Function to compare two colors by RGBa.
+   */
+  function colorsAreEqual($color_a, $color_b) {
+    // Fully transparent pixels are equal, regardless of RGB.
+    if ($color_a[3] == 127 && $color_b[3] == 127) {
+      return TRUE;
+    }
+
+    foreach ($color_a as $key => $value) {
+      if ($color_b[$key] != $value) {
+        return FALSE;
+      }
+    }
+
+    return TRUE;
+  }
+
+  /**
+   * Function for finding a pixel's RGBa values.
+   */
+  function getPixelColor($image, $x, $y) {
+    $color_index = imagecolorat($image->resource, $x, $y);
+
+    $transparent_index = imagecolortransparent($image->resource);
+    if ($color_index == $transparent_index) {
+      return array(0, 0, 0, 127);
+    }
+
+    return array_values(imagecolorsforindex($image->resource, $color_index));
+  }
+
+  /**
+   * Since PHP can't visually check that our images have been manipulated
+   * properly, build a list of expected color values for each of the corners and
+   * the expected height and widths for the final images.
+   */
+  function testManipulations() {
+    // If GD isn't available don't bother testing this.
+    if (!function_exists('image_gd_check_settings') || !image_gd_check_settings()) {
+      $this->pass(t('Image manipulations for the GD toolkit were skipped because the GD toolkit is not available.'));
+      return;
+    }
+
+    // Typically the corner colors will be unchanged. These colors are in the
+    // order of top-left, top-right, bottom-right, bottom-left.
+    $default_corners = array($this->red, $this->green, $this->blue, $this->transparent);
+
+    // A list of files that will be tested.
+    $files = array(
+      'image-test.png',
+      'image-test.gif',
+      'image-test.jpg',
+    );
+
+    // Setup a list of tests to perform on each type.
+    $operations = array(
+      'resize' => array(
+        'function' => 'resize',
+        'arguments' => array(20, 10),
+        'width' => 20,
+        'height' => 10,
+        'corners' => $default_corners,
+      ),
+      'scale_x' => array(
+        'function' => 'scale',
+        'arguments' => array(20, NULL),
+        'width' => 20,
+        'height' => 10,
+        'corners' => $default_corners,
+      ),
+      'scale_y' => array(
+        'function' => 'scale',
+        'arguments' => array(NULL, 10),
+        'width' => 20,
+        'height' => 10,
+        'corners' => $default_corners,
+      ),
+      'upscale_x' => array(
+        'function' => 'scale',
+        'arguments' => array(80, NULL, TRUE),
+        'width' => 80,
+        'height' => 40,
+        'corners' => $default_corners,
+      ),
+      'upscale_y' => array(
+        'function' => 'scale',
+        'arguments' => array(NULL, 40, TRUE),
+        'width' => 80,
+        'height' => 40,
+        'corners' => $default_corners,
+      ),
+      'crop' => array(
+        'function' => 'crop',
+        'arguments' => array(12, 4, 16, 12),
+        'width' => 16,
+        'height' => 12,
+        'corners' => array_fill(0, 4, $this->white),
+      ),
+      'scale_and_crop' => array(
+        'function' => 'scale_and_crop',
+        'arguments' => array(10, 8),
+        'width' => 10,
+        'height' => 8,
+        'corners' => array_fill(0, 4, $this->black),
+      ),
+    );
+
+    // Systems using non-bundled GD2 don't have imagerotate. Test if available.
+    if (function_exists('imagerotate')) {
+      $operations += array(
+        'rotate_5' => array(
+          'function' => 'rotate',
+          'arguments' => array(5, 0xFF00FF), // Fuchsia background.
+          'width' => 42,
+          'height' => 24,
+          'corners' => array_fill(0, 4, $this->fuchsia),
+        ),
+        'rotate_90' => array(
+          'function' => 'rotate',
+          'arguments' => array(90, 0xFF00FF), // Fuchsia background.
+          'width' => 20,
+          'height' => 40,
+          'corners' => array($this->fuchsia, $this->red, $this->green, $this->blue),
+        ),
+        'rotate_transparent_5' => array(
+          'function' => 'rotate',
+          'arguments' => array(5),
+          'width' => 42,
+          'height' => 24,
+          'corners' => array_fill(0, 4, $this->transparent),
+        ),
+        'rotate_transparent_90' => array(
+          'function' => 'rotate',
+          'arguments' => array(90),
+          'width' => 20,
+          'height' => 40,
+          'corners' => array($this->transparent, $this->red, $this->green, $this->blue),
+        ),
+      );
+    }
+
+    // Systems using non-bundled GD2 don't have imagefilter. Test if available.
+    if (function_exists('imagefilter')) {
+      $operations += array(
+        'desaturate' => array(
+          'function' => 'desaturate',
+          'arguments' => array(),
+          'height' => 20,
+          'width' => 40,
+          // Grayscale corners are a bit funky. Each of the corners are a shade of
+          // gray. The values of these were determined simply by looking at the
+          // final image to see what desaturated colors end up being.
+          'corners' => array(
+            array_fill(0, 3, 76) + array(3 => 0),
+            array_fill(0, 3, 149) + array(3 => 0),
+            array_fill(0, 3, 29) + array(3 => 0),
+            array_fill(0, 3, 0) + array(3 => 127)
+          ),
+        ),
+      );
+    }
+
+    foreach ($files as $file) {
+      foreach ($operations as $op => $values) {
+        // Load up a fresh image.
+        $image = image_load(drupal_get_path('module', 'simpletest') . '/files/' . $file, 'gd');
+        if (!$image) {
+          $this->fail(t('Could not load image %file.', array('%file' => $file)));
+          continue 2;
+        }
+
+        // Transparent GIFs and the imagefilter function don't work together.
+        // There is a todo in image.gd.inc to correct this.
+        if ($image->info['extension'] == 'gif') {
+          if ($op == 'desaturate') {
+            $values['corners'][3] = $this->white;
+          }
+        }
+
+        // Perform our operation.
+        $function = 'image_' . $values['function'];
+        $arguments = array();
+        $arguments[] = &$image;
+        $arguments = array_merge($arguments, $values['arguments']);
+        call_user_func_array($function, $arguments);
+
+        // To keep from flooding the test with assert values, make a general
+        // value for whether each group of values fail.
+        $correct_dimensions_real = TRUE;
+        $correct_dimensions_object = TRUE;
+        $correct_colors = TRUE;
+
+        // Check the real dimensions of the image first.
+        if (imagesy($image->resource) != $values['height'] || imagesx($image->resource) != $values['width']) {
+          $correct_dimensions_real = FALSE;
+        }
+
+        // Check that the image object has an accurate record of the dimensions.
+        if ($image->info['width'] != $values['width'] || $image->info['height'] != $values['height']) {
+          $correct_dimensions_object = FALSE;
+        }
+        // Now check each of the corners to ensure color correctness.
+        foreach ($values['corners'] as $key => $corner) {
+          // Get the location of the corner.
+          switch ($key) {
+            case 0:
+              $x = 0;
+              $y = 0;
+              break;
+            case 1:
+              $x = $values['width'] - 1;
+              $y = 0;
+              break;
+            case 2:
+              $x = $values['width'] - 1;
+              $y = $values['height'] - 1;
+              break;
+            case 3:
+              $x = 0;
+              $y = $values['height'] - 1;
+              break;
+          }
+          $color = $this->getPixelColor($image, $x, $y);
+          $correct_colors = $this->colorsAreEqual($color, $corner);
+        }
+
+        $directory = file_default_scheme() . '://imagetests';
+        file_prepare_directory($directory, FILE_CREATE_DIRECTORY);
+        image_save($image, $directory . '/' . $op . '.' . $image->info['extension']);
+
+        $this->assertTrue($correct_dimensions_real, format_string('Image %file after %action action has proper dimensions.', array('%file' => $file, '%action' => $op)));
+        $this->assertTrue($correct_dimensions_object, format_string('Image %file object after %action action is reporting the proper height and width values.', array('%file' => $file, '%action' => $op)));
+        // JPEG colors will always be messed up due to compression.
+        if ($image->info['extension'] != 'jpg') {
+          $this->assertTrue($correct_colors, format_string('Image %file object after %action action has the correct color placement.', array('%file' => $file, '%action' => $op)));
+        }
+      }
+    }
+
+  }
+}
+
+/**
+ * Tests the file move function for managed files.
+ */
+class ImageFileMoveTest extends ImageToolkitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Image moving',
+      'description' => 'Tests the file move function for managed files.',
+      'group' => 'Image',
+    );
+  }
+
+  /**
+   * Tests moving a randomly generated image.
+   */
+  function testNormal() {
+    // Pick a file for testing.
+    $file = current($this->drupalGetTestFiles('image'));
+
+    // Create derivative image.
+    $style = image_style_load(key(image_styles()));
+    $derivative_uri = image_style_path($style['name'], $file->uri);
+    image_style_create_derivative($style, $file->uri, $derivative_uri);
+
+    // Check if derivative image exists.
+    $this->assertTrue(file_exists($derivative_uri), 'Make sure derivative image is generated successfully.');
+
+    // Clone the object so we don't have to worry about the function changing
+    // our reference copy.
+    $desired_filepath = 'public://' . $this->randomName();
+    $result = file_move(clone $file, $desired_filepath, FILE_EXISTS_ERROR);
+
+    // Check if image has been moved.
+    $this->assertTrue(file_exists($result->uri), 'Make sure image is moved successfully.');
+
+    // Check if derivative image has been flushed.
+    $this->assertFalse(file_exists($derivative_uri), 'Make sure derivative image has been flushed.');
+  }
+}
+
diff --git a/htmltest/modules/simpletest/tests/image_test.info b/htmltest/modules/simpletest/tests/image_test.info
new file mode 100644
index 00000000..e4bd98c7
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/image_test.info
@@ -0,0 +1,12 @@
+name = "Image test"
+description = "Support module for image toolkit tests."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/image_test.module b/htmltest/modules/simpletest/tests/image_test.module
new file mode 100644
index 00000000..de640f0b
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/image_test.module
@@ -0,0 +1,138 @@
+<?php
+
+/**
+ * @file
+ * Helper module for the image tests.
+ */
+
+/**
+ * Implements hook_image_toolkits().
+ */
+function image_test_image_toolkits() {
+  return array(
+    'test' => array(
+      'title' => t('A dummy toolkit that works'),
+      'available' => TRUE,
+    ),
+    'broken' => array(
+      'title' => t('A dummy toolkit that is "broken"'),
+      'available' => FALSE,
+    ),
+  );
+}
+
+/**
+ * Reset/initialize the history of calls to the toolkit functions.
+ *
+ * @see image_test_get_all_calls()
+ */
+function image_test_reset() {
+  // Keep track of calls to these operations
+  $results = array(
+    'load' => array(),
+    'save' => array(),
+    'settings' => array(),
+    'resize' => array(),
+    'rotate' => array(),
+    'crop' => array(),
+    'desaturate' => array(),
+  );
+  variable_set('image_test_results', $results);
+}
+
+/**
+ * Get an array with the all the calls to the toolkits since image_test_reset()
+ * was called.
+ *
+ * @return
+ *   An array keyed by operation name ('load', 'save', 'settings', 'resize',
+ *   'rotate', 'crop', 'desaturate') with values being arrays of parameters
+ *   passed to each call.
+ */
+function image_test_get_all_calls() {
+  return variable_get('image_test_results', array());
+}
+
+/**
+ * Store the values passed to a toolkit call.
+ *
+ * @param $op
+ *   One of the image toolkit operations: 'get_info', 'load', 'save',
+ *   'settings', 'resize', 'rotate', 'crop', 'desaturate'.
+ * @param $args
+ *   Values passed to hook.
+ *
+ * @see image_test_get_all_calls()
+ * @see image_test_reset()
+ */
+function _image_test_log_call($op, $args) {
+  $results = variable_get('image_test_results', array());
+  $results[$op][] = $args;
+  variable_set('image_test_results', $results);
+}
+
+/**
+ * Image tookit's settings operation.
+ */
+function image_test_settings() {
+  _image_test_log_call('settings', array());
+  return array();
+}
+
+/**
+ * Image toolkit's get_info operation.
+ */
+function image_test_get_info(stdClass $image) {
+  _image_test_log_call('get_info', array($image));
+  return array();
+}
+
+/**
+ * Image tookit's load operation.
+ */
+function image_test_load(stdClass $image) {
+  _image_test_log_call('load', array($image));
+  return $image;
+}
+
+/**
+ * Image tookit's save operation.
+ */
+function image_test_save(stdClass $image, $destination) {
+  _image_test_log_call('save', array($image, $destination));
+  // Return false so that image_save() doesn't try to chmod the destination
+  // file that we didn't bother to create.
+  return FALSE;
+}
+
+/**
+ * Image tookit's crop operation.
+ */
+function image_test_crop(stdClass $image, $x, $y, $width, $height) {
+  _image_test_log_call('crop', array($image, $x, $y, $width, $height));
+  return TRUE;
+}
+
+/**
+ * Image tookit's resize operation.
+ */
+function image_test_resize(stdClass $image, $width, $height) {
+  _image_test_log_call('resize', array($image, $width, $height));
+  return TRUE;
+}
+
+/**
+ * Image tookit's rotate operation.
+ */
+function image_test_rotate(stdClass $image, $degrees, $background = NULL) {
+  _image_test_log_call('rotate', array($image, $degrees, $background));
+  return TRUE;
+}
+
+/**
+ * Image tookit's desaturate operation.
+ */
+function image_test_desaturate(stdClass $image) {
+  _image_test_log_call('desaturate', array($image));
+  return TRUE;
+}
diff --git a/htmltest/modules/simpletest/tests/lock.test b/htmltest/modules/simpletest/tests/lock.test
new file mode 100644
index 00000000..797befca
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/lock.test
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * Tests for the lock system.
+ */
+class LockFunctionalTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Locking framework tests',
+      'description' => 'Confirm locking works between two separate requests.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('system_test');
+  }
+
+  /**
+   * Confirm that we can acquire and release locks in two parallel requests.
+   */
+  function testLockAcquire() {
+    $lock_acquired = 'TRUE: Lock successfully acquired in system_test_lock_acquire()';
+    $lock_not_acquired = 'FALSE: Lock not acquired in system_test_lock_acquire()';
+    $this->assertTrue(lock_acquire('system_test_lock_acquire'), 'Lock acquired by this request.', 'Lock');
+    $this->assertTrue(lock_acquire('system_test_lock_acquire'), 'Lock extended by this request.', 'Lock');
+    lock_release('system_test_lock_acquire');
+
+    // Cause another request to acquire the lock.
+    $this->drupalGet('system-test/lock-acquire');
+    $this->assertText($lock_acquired, 'Lock acquired by the other request.', 'Lock');
+    // The other request has finished, thus it should have released its lock.
+    $this->assertTrue(lock_acquire('system_test_lock_acquire'), 'Lock acquired by this request.', 'Lock');
+    // This request holds the lock, so the other request cannot acquire it.
+    $this->drupalGet('system-test/lock-acquire');
+    $this->assertText($lock_not_acquired, 'Lock not acquired by the other request.', 'Lock');
+    lock_release('system_test_lock_acquire');
+
+    // Try a very short timeout and lock breaking.
+    $this->assertTrue(lock_acquire('system_test_lock_acquire', 0.5), 'Lock acquired by this request.', 'Lock');
+    sleep(1);
+    // The other request should break our lock.
+    $this->drupalGet('system-test/lock-acquire');
+    $this->assertText($lock_acquired, 'Lock acquired by the other request, breaking our lock.', 'Lock');
+    // We cannot renew it, since the other thread took it.
+    $this->assertFalse(lock_acquire('system_test_lock_acquire'), 'Lock cannot be extended by this request.', 'Lock');
+
+    // Check the shut-down function.
+    $lock_acquired_exit = 'TRUE: Lock successfully acquired in system_test_lock_exit()';
+    $lock_not_acquired_exit = 'FALSE: Lock not acquired in system_test_lock_exit()';
+    $this->drupalGet('system-test/lock-exit');
+    $this->assertText($lock_acquired_exit, 'Lock acquired by the other request before exit.', 'Lock');
+    $this->assertTrue(lock_acquire('system_test_lock_exit'), 'Lock acquired by this request after the other request exits.', 'Lock');
+  }
+}
+
diff --git a/htmltest/modules/simpletest/tests/mail.test b/htmltest/modules/simpletest/tests/mail.test
new file mode 100644
index 00000000..70a43cb4
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/mail.test
@@ -0,0 +1,461 @@
+<?php
+
+/**
+ * @file
+ * Test the Drupal mailing system.
+ */
+class MailTestCase extends DrupalWebTestCase implements MailSystemInterface {
+  /**
+   * The most recent message that was sent through the test case.
+   *
+   * We take advantage here of the fact that static variables are shared among
+   * all instance of the same class.
+   */
+  private static $sent_message;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Mail system',
+      'description' => 'Performs tests on the pluggable mailing framework.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('simpletest'));
+
+    // Set MailTestCase (i.e. this class) as the SMTP library
+    variable_set('mail_system', array('default-system' => 'MailTestCase'));
+  }
+
+  /**
+   * Assert that the pluggable mail system is functional.
+   */
+  function testPluggableFramework() {
+    global $language;
+
+    // Use MailTestCase for sending a message.
+    $message = drupal_mail('simpletest', 'mail_test', 'testing@example.com', $language);
+
+    // Assert whether the message was sent through the send function.
+    $this->assertEqual(self::$sent_message['to'], 'testing@example.com', 'Pluggable mail system is extendable.');
+  }
+
+  /**
+   * Test that message sending may be canceled.
+   *
+   * @see simpletest_mail_alter()
+   */
+  function testCancelMessage() {
+    global $language;
+
+    // Reset the class variable holding a copy of the last sent message.
+    self::$sent_message = NULL;
+
+    // Send a test message that simpletest_mail_alter should cancel.
+    $message = drupal_mail('simpletest', 'cancel_test', 'cancel@example.com', $language);
+
+    // Assert that the message was not actually sent.
+    $this->assertNull(self::$sent_message, 'Message was canceled.');
+  }
+
+  /**
+   * Concatenate and wrap the e-mail body for plain-text mails.
+   *
+   * @see DefaultMailSystem
+   */
+  public function format(array $message) {
+    // Join the body array into one string.
+    $message['body'] = implode("\n\n", $message['body']);
+    // Convert any HTML to plain-text.
+    $message['body'] = drupal_html_to_text($message['body']);
+    // Wrap the mail body for sending.
+    $message['body'] = drupal_wrap_mail($message['body']);
+    return $message;
+  }
+
+  /**
+   * Send function that is called through the mail system.
+   */
+  public function mail(array $message) {
+    self::$sent_message = $message;
+  }
+}
+
+/**
+ * Unit tests for drupal_html_to_text().
+ */
+class DrupalHtmlToTextTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'HTML to text conversion',
+      'description' => 'Tests drupal_html_to_text().',
+      'group' => 'Mail',
+    );
+  }
+
+  /**
+   * Converts a string to its PHP source equivalent for display in test messages.
+   *
+   * @param $text
+   *   The text string to convert.
+   *
+   * @return
+   *   An HTML representation of the text string that, when displayed in a
+   *   browser, represents the PHP source code equivalent of $text.
+   */
+  function stringToHtml($text) {
+    return '"' .
+      str_replace(
+        array("\n", ' '),
+        array('\n', '&nbsp;'),
+        check_plain($text)
+      ) . '"';
+  }
+
+  /**
+   * Helper function for testing drupal_html_to_text().
+   *
+   * @param $html
+   *   The source HTML string to be converted.
+   * @param $text
+   *   The expected result of converting $html to text.
+   * @param $message
+   *   A text message to display in the assertion message.
+   * @param $allowed_tags
+   *   (optional) An array of allowed tags, or NULL to default to the full
+   *   set of tags supported by drupal_html_to_text().
+   */
+  function assertHtmlToText($html, $text, $message, $allowed_tags = NULL) {
+    preg_match_all('/<([a-z0-6]+)/', drupal_strtolower($html), $matches);
+    $tested_tags = implode(', ', array_unique($matches[1]));
+    $message .= ' (' . $tested_tags . ')';
+    $result = drupal_html_to_text($html, $allowed_tags);
+    $pass = $this->assertEqual($result, $text, check_plain($message));
+    $verbose = 'html = <pre>' . $this->stringToHtml($html)
+      . '</pre><br />' . 'result = <pre>' . $this->stringToHtml($result)
+      . '</pre><br />' . 'expected = <pre>' . $this->stringToHtml($text)
+      . '</pre>';
+    $this->verbose($verbose);
+    if (!$pass) {
+      $this->pass("Previous test verbose info:<br />$verbose");
+    }
+  }
+
+  /**
+   * Test all supported tags of drupal_html_to_text().
+   */
+  function testTags() {
+    global $base_path, $base_url;
+    $tests = array(
+      // @todo Trailing linefeeds should be trimmed.
+      '<a href = "http://drupal.org">Drupal.org</a>' => "Drupal.org [1]\n\n[1] http://drupal.org\n",
+      // @todo Footer URLs should be absolute.
+      "<a href = \"$base_path\">Homepage</a>" => "Homepage [1]\n\n[1] $base_url/\n",
+      '<address>Drupal</address>' => "Drupal\n",
+      // @todo The <address> tag is currently not supported.
+      '<address>Drupal</address><address>Drupal</address>' => "DrupalDrupal\n",
+      '<b>Drupal</b>' => "*Drupal*\n",
+      // @todo There should be a space between the '>' and the text.
+      '<blockquote>Drupal</blockquote>' => ">Drupal\n",
+      '<blockquote>Drupal</blockquote><blockquote>Drupal</blockquote>' => ">Drupal\n>Drupal\n",
+      '<br />Drupal<br />Drupal<br /><br />Drupal' => "Drupal\nDrupal\nDrupal\n",
+      '<br/>Drupal<br/>Drupal<br/><br/>Drupal' => "Drupal\nDrupal\nDrupal\n",
+      // @todo There should be two line breaks before the paragraph.
+      '<br/>Drupal<br/>Drupal<br/><br/>Drupal<p>Drupal</p>' => "Drupal\nDrupal\nDrupal\nDrupal\n\n",
+      '<div>Drupal</div>' => "Drupal\n",
+      // @todo The <div> tag is currently not supported.
+      '<div>Drupal</div><div>Drupal</div>' => "DrupalDrupal\n",
+      '<em>Drupal</em>' => "/Drupal/\n",
+      '<h1>Drupal</h1>' => "======== DRUPAL ==============================================================\n\n",
+      '<h1>Drupal</h1><p>Drupal</p>' => "======== DRUPAL ==============================================================\n\nDrupal\n\n",
+      '<h2>Drupal</h2>' => "-------- DRUPAL --------------------------------------------------------------\n\n",
+      '<h2>Drupal</h2><p>Drupal</p>' => "-------- DRUPAL --------------------------------------------------------------\n\nDrupal\n\n",
+      '<h3>Drupal</h3>' => ".... Drupal\n\n",
+      '<h3>Drupal</h3><p>Drupal</p>' => ".... Drupal\n\nDrupal\n\n",
+      '<h4>Drupal</h4>' => ".. Drupal\n\n",
+      '<h4>Drupal</h4><p>Drupal</p>' => ".. Drupal\n\nDrupal\n\n",
+      '<h5>Drupal</h5>' => "Drupal\n\n",
+      '<h5>Drupal</h5><p>Drupal</p>' => "Drupal\n\nDrupal\n\n",
+      '<h6>Drupal</h6>' => "Drupal\n\n",
+      '<h6>Drupal</h6><p>Drupal</p>' => "Drupal\n\nDrupal\n\n",
+      '<hr />Drupal<hr />' => "------------------------------------------------------------------------------\nDrupal\n------------------------------------------------------------------------------\n",
+      '<hr/>Drupal<hr/>' => "------------------------------------------------------------------------------\nDrupal\n------------------------------------------------------------------------------\n",
+      '<hr/>Drupal<hr/><p>Drupal</p>' => "------------------------------------------------------------------------------\nDrupal\n------------------------------------------------------------------------------\nDrupal\n\n",
+      '<i>Drupal</i>' => "/Drupal/\n",
+      '<p>Drupal</p>' => "Drupal\n\n",
+      '<p>Drupal</p><p>Drupal</p>' => "Drupal\n\nDrupal\n\n",
+      '<strong>Drupal</strong>' => "*Drupal*\n",
+      // @todo Tables are currently not supported.
+      '<table><tr><td>Drupal</td><td>Drupal</td></tr><tr><td>Drupal</td><td>Drupal</td></tr></table>' => "DrupalDrupalDrupalDrupal\n",
+      '<table><tr><td>Drupal</td></tr></table><p>Drupal</p>' => "Drupal\nDrupal\n\n",
+      // @todo The <u> tag is currently not supported.
+      '<u>Drupal</u>' => "Drupal\n",
+      '<ul><li>Drupal</li></ul>' => " * Drupal\n\n",
+      '<ul><li>Drupal <em>Drupal</em> Drupal</li></ul>' => " * Drupal /Drupal/ Drupal\n\n",
+      // @todo Lines containing nothing but spaces should be trimmed.
+      '<ul><li>Drupal</li><li><ol><li>Drupal</li><li>Drupal</li></ol></li></ul>' => " * Drupal\n *  1) Drupal\n    2) Drupal\n   \n\n",
+      '<ul><li>Drupal</li><li><ol><li>Drupal</li></ol></li><li>Drupal</li></ul>' => " * Drupal\n *  1) Drupal\n   \n * Drupal\n\n",
+      '<ul><li>Drupal</li><li>Drupal</li></ul>' => " * Drupal\n * Drupal\n\n",
+      '<ul><li>Drupal</li></ul><p>Drupal</p>' => " * Drupal\n\nDrupal\n\n",
+      '<ol><li>Drupal</li></ol>' => " 1) Drupal\n\n",
+      '<ol><li>Drupal</li><li><ul><li>Drupal</li><li>Drupal</li></ul></li></ol>' => " 1) Drupal\n 2)  * Drupal\n     * Drupal\n    \n\n",
+      '<ol><li>Drupal</li><li>Drupal</li></ol>' => " 1) Drupal\n 2) Drupal\n\n",
+      '<ol>Drupal</ol>' => "Drupal\n\n",
+      '<ol><li>Drupal</li></ol><p>Drupal</p>' => " 1) Drupal\n\nDrupal\n\n",
+      '<dl><dt>Drupal</dt></dl>' => "Drupal\n\n",
+      '<dl><dt>Drupal</dt><dd>Drupal</dd></dl>' => "Drupal\n    Drupal\n\n",
+      '<dl><dt>Drupal</dt><dd>Drupal</dd><dt>Drupal</dt><dd>Drupal</dd></dl>' => "Drupal\n    Drupal\nDrupal\n    Drupal\n\n",
+      '<dl><dt>Drupal</dt><dd>Drupal</dd></dl><p>Drupal</p>' => "Drupal\n    Drupal\n\nDrupal\n\n",
+      '<dl><dt>Drupal<dd>Drupal</dl>' => "Drupal\n    Drupal\n\n",
+      '<dl><dt>Drupal</dt></dl><p>Drupal</p>' => "Drupal\n\nDrupal\n\n",
+      // @todo Again, lines containing only spaces should be trimmed.
+      '<ul><li>Drupal</li><li><dl><dt>Drupal</dt><dd>Drupal</dd><dt>Drupal</dt><dd>Drupal</dd></dl></li><li>Drupal</li></ul>' => " * Drupal\n * Drupal\n       Drupal\n   Drupal\n       Drupal\n   \n * Drupal\n\n",
+      // Tests malformed HTML tags.
+      '<br>Drupal<br>Drupal' => "Drupal\nDrupal\n",
+      '<hr>Drupal<hr>Drupal' => "------------------------------------------------------------------------------\nDrupal\n------------------------------------------------------------------------------\nDrupal\n",
+      '<ol><li>Drupal<li>Drupal</ol>' => " 1) Drupal\n 2) Drupal\n\n",
+      '<ul><li>Drupal <em>Drupal</em> Drupal</ul></ul>' => " * Drupal /Drupal/ Drupal\n\n",
+      '<ul><li>Drupal<li>Drupal</ol>' => " * Drupal\n * Drupal\n\n",
+      '<ul><li>Drupal<li>Drupal</ul>' => " * Drupal\n * Drupal\n\n",
+      '<ul>Drupal</ul>' => "Drupal\n\n",
+      'Drupal</ul></ol></dl><li>Drupal' => "Drupal\n * Drupal\n",
+      '<dl>Drupal</dl>' => "Drupal\n\n",
+      '<dl>Drupal</dl><p>Drupal</p>' => "Drupal\n\nDrupal\n\n",
+      '<dt>Drupal</dt>' => "Drupal\n",
+      // Tests some unsupported HTML tags.
+      '<html>Drupal</html>' => "Drupal\n",
+      // @todo Perhaps the contents of <script> tags should be dropped.
+      '<script type="text/javascript">Drupal</script>' => "Drupal\n",
+    );
+
+    foreach ($tests as $html => $text) {
+      $this->assertHtmlToText($html, $text, 'Supported tags');
+    }
+  }
+
+  /**
+   * Test $allowed_tags argument of drupal_html_to_text().
+   */
+  function testDrupalHtmlToTextArgs() {
+    // The second parameter of drupal_html_to_text() overrules the allowed tags.
+    $this->assertHtmlToText(
+      'Drupal <b>Drupal</b> Drupal',
+      "Drupal *Drupal* Drupal\n",
+      'Allowed <b> tag found',
+      array('b')
+    );
+    $this->assertHtmlToText(
+      'Drupal <h1>Drupal</h1> Drupal',
+      "Drupal Drupal Drupal\n",
+      'Disallowed <h1> tag not found',
+      array('b')
+    );
+
+    $this->assertHtmlToText(
+      'Drupal <p><em><b>Drupal</b></em><p> Drupal',
+      "Drupal Drupal Drupal\n",
+      'Disallowed <p>, <em>, and <b> tags not found',
+      array('a', 'br', 'h1')
+    );
+
+    $this->assertHtmlToText(
+      '<html><body>Drupal</body></html>',
+      "Drupal\n",
+      'Unsupported <html> and <body> tags not found',
+      array('html', 'body')
+    );
+  }
+
+  /**
+   * Tests that drupal_wrap_mail() removes trailing whitespace before newlines.
+   */
+  function testDrupalHtmltoTextRemoveTrailingWhitespace() {
+    $text = "Hi there! \nHerp Derp";
+    $mail_lines = explode("\n", drupal_wrap_mail($text));
+    $this->assertNotEqual(" ", substr($mail_lines[0], -1), 'Trailing whitespace removed.');
+  }
+
+  /**
+   * Tests drupal_wrap_mail() retains whitespace from Usenet style signatures.
+   *
+   * RFC 3676 says, "This is a special case; an (optionally quoted or quoted and
+   * stuffed) line consisting of DASH DASH SP is neither fixed nor flowed."
+   */
+  function testDrupalHtmltoTextUsenetSignature() {
+    $text = "Hi there!\n-- \nHerp Derp";
+    $mail_lines = explode("\n", drupal_wrap_mail($text));
+    $this->assertEqual("-- ", $mail_lines[1], 'Trailing whitespace not removed for dash-dash-space signatures.');
+
+    $text = "Hi there!\n--  \nHerp Derp";
+    $mail_lines = explode("\n", drupal_wrap_mail($text));
+    $this->assertEqual("--", $mail_lines[1], 'Trailing whitespace removed for incorrect dash-dash-space signatures.');
+  }
+
+  /**
+   * Test that whitespace is collapsed.
+   */
+  function testDrupalHtmltoTextCollapsesWhitespace() {
+    $input = "<p>Drupal  Drupal\n\nDrupal<pre>Drupal  Drupal\n\nDrupal</pre>Drupal  Drupal\n\nDrupal</p>";
+    // @todo The whitespace should be collapsed.
+    $collapsed = "Drupal  Drupal\n\nDrupalDrupal  Drupal\n\nDrupalDrupal  Drupal\n\nDrupal\n\n";
+    $this->assertHtmlToText(
+      $input,
+      $collapsed,
+      'Whitespace is collapsed',
+      array('p')
+    );
+  }
+
+  /**
+   * Test that text separated by block-level tags in HTML get separated by
+   * (at least) a newline in the plaintext version.
+   */
+  function testDrupalHtmlToTextBlockTagToNewline() {
+    $input = '[text]'
+      . '<blockquote>[blockquote]</blockquote>'
+      . '<br />[br]'
+      . '<dl><dt>[dl-dt]</dt>'
+      . '<dt>[dt]</dt>'
+      . '<dd>[dd]</dd>'
+      . '<dd>[dd-dl]</dd></dl>'
+      . '<h1>[h1]</h1>'
+      . '<h2>[h2]</h2>'
+      . '<h3>[h3]</h3>'
+      . '<h4>[h4]</h4>'
+      . '<h5>[h5]</h5>'
+      . '<h6>[h6]</h6>'
+      . '<hr />[hr]'
+      . '<ol><li>[ol-li]</li>'
+      . '<li>[li]</li>'
+      . '<li>[li-ol]</li></ol>'
+      . '<p>[p]</p>'
+      . '<ul><li>[ul-li]</li>'
+      . '<li>[li-ul]</li></ul>'
+      . '[text]';
+    $output = drupal_html_to_text($input);
+    $pass = $this->assertFalse(
+      preg_match('/\][^\n]*\[/s', $output),
+      'Block-level HTML tags should force newlines'
+    );
+    if (!$pass) {
+      $this->verbose($this->stringToHtml($output));
+    }
+    $output_upper = drupal_strtoupper($output);
+    $upper_input = drupal_strtoupper($input);
+    $upper_output = drupal_html_to_text($upper_input);
+    $pass = $this->assertEqual(
+      $upper_output,
+      $output_upper,
+      'Tag recognition should be case-insensitive'
+    );
+    if (!$pass) {
+      $this->verbose(
+        $upper_output
+        . '<br />should  be equal to <br />'
+        . $output_upper
+      );
+    }
+  }
+
+  /**
+   * Test that headers are properly separated from surrounding text.
+   */
+  function testHeaderSeparation() {
+    $html = 'Drupal<h1>Drupal</h1>Drupal';
+    // @todo There should be more space above the header than below it.
+    $text = "Drupal\n======== DRUPAL ==============================================================\n\nDrupal\n";
+    $this->assertHtmlToText($html, $text,
+      'Text before and after <h1> tag');
+    $html = '<p>Drupal</p><h1>Drupal</h1>Drupal';
+    // @todo There should be more space above the header than below it.
+    $text = "Drupal\n\n======== DRUPAL ==============================================================\n\nDrupal\n";
+    $this->assertHtmlToText($html, $text,
+      'Paragraph before and text after <h1> tag');
+    $html = 'Drupal<h1>Drupal</h1><p>Drupal</p>';
+    // @todo There should be more space above the header than below it.
+    $text = "Drupal\n======== DRUPAL ==============================================================\n\nDrupal\n\n";
+    $this->assertHtmlToText($html, $text,
+      'Text before and paragraph after <h1> tag');
+    $html = '<p>Drupal</p><h1>Drupal</h1><p>Drupal</p>';
+    $text = "Drupal\n\n======== DRUPAL ==============================================================\n\nDrupal\n\n";
+    $this->assertHtmlToText($html, $text,
+      'Paragraph before and after <h1> tag');
+  }
+
+  /**
+   * Test that footnote references are properly generated.
+   */
+  function testFootnoteReferences() {
+    global $base_path, $base_url;
+    $source = '<a href="http://www.example.com/node/1">Host and path</a>'
+      . '<br /><a href="http://www.example.com">Host, no path</a>'
+      . '<br /><a href="' . $base_path . 'node/1">Path, no host</a>'
+      . '<br /><a href="node/1">Relative path</a>';
+    // @todo Footnote URLs should be absolute.
+    $tt = "Host and path [1]"
+      . "\nHost, no path [2]"
+      // @todo The following two references should be combined.
+      . "\nPath, no host [3]"
+      . "\nRelative path [4]"
+      . "\n"
+      . "\n[1] http://www.example.com/node/1"
+      . "\n[2] http://www.example.com"
+      // @todo The following two references should be combined.
+      . "\n[3] $base_url/node/1"
+      . "\n[4] node/1\n";
+    $this->assertHtmlToText($source, $tt, 'Footnotes');
+  }
+
+  /**
+   * Test that combinations of paragraph breaks, line breaks, linefeeds,
+   * and spaces are properly handled.
+   */
+  function testDrupalHtmlToTextParagraphs() {
+    $tests = array();
+    $tests[] = array(
+        'html' => "<p>line 1<br />\nline 2<br />line 3\n<br />line 4</p><p>paragraph</p>",
+        // @todo Trailing line breaks should be trimmed.
+        'text' => "line 1\nline 2\nline 3\nline 4\n\nparagraph\n\n",
+    );
+    $tests[] = array(
+      'html' => "<p>line 1<br /> line 2</p> <p>line 4<br /> line 5</p> <p>0</p>",
+      // @todo Trailing line breaks should be trimmed.
+      'text' => "line 1\nline 2\n\nline 4\nline 5\n\n0\n\n",
+    );
+    foreach ($tests as $test) {
+      $this->assertHtmlToText($test['html'], $test['text'], 'Paragraph breaks');
+    }
+  }
+
+  /**
+   * Tests that drupal_html_to_text() wraps before 1000 characters.
+   *
+   * RFC 3676 says, "The Text/Plain media type is the lowest common
+   * denominator of Internet email, with lines of no more than 998 characters."
+   *
+   * RFC 2046 says, "SMTP [RFC-821] allows a maximum of 998 octets before the
+   * next CRLF sequence."
+   *
+   * RFC 821 says, "The maximum total length of a text line including the
+   * <CRLF> is 1000 characters."
+   */
+  function testVeryLongLineWrap() {
+    $input = 'Drupal<br /><p>' . str_repeat('x', 2100) . '</><br />Drupal';
+    $output = drupal_html_to_text($input);
+    // This awkward construct comes from includes/mail.inc lines 8-13.
+    $eol = variable_get('mail_line_endings', MAIL_LINE_ENDINGS);
+    // We must use strlen() rather than drupal_strlen() in order to count
+    // octets rather than characters.
+    $line_length_limit = 1000 - drupal_strlen($eol);
+    $maximum_line_length = 0;
+    foreach (explode($eol, $output) as $line) {
+      // We must use strlen() rather than drupal_strlen() in order to count
+      // octets rather than characters.
+      $maximum_line_length = max($maximum_line_length, strlen($line . $eol));
+    }
+    $verbose = 'Maximum line length found was ' . $maximum_line_length . ' octets.';
+    // @todo This should assert that $maximum_line_length <= 1000.
+    $this->pass($verbose);
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/menu.test b/htmltest/modules/simpletest/tests/menu.test
new file mode 100644
index 00000000..f5d7d290
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/menu.test
@@ -0,0 +1,1740 @@
+<?php
+
+/**
+ * @file
+ * Provides SimpleTests for menu.inc.
+ */
+
+class MenuWebTestCase extends DrupalWebTestCase {
+  function setUp() {
+    $modules = func_get_args();
+    if (isset($modules[0]) && is_array($modules[0])) {
+      $modules = $modules[0];
+    }
+    parent::setUp($modules);
+  }
+
+  /**
+   * Assert that a given path shows certain breadcrumb links.
+   *
+   * @param string $goto
+   *   (optional) A system path to pass to DrupalWebTestCase::drupalGet().
+   * @param array $trail
+   *   An associative array whose keys are expected breadcrumb link paths and
+   *   whose values are expected breadcrumb link texts (not sanitized).
+   * @param string $page_title
+   *   (optional) A page title to additionally assert via
+   *   DrupalWebTestCase::assertTitle(). Without site name suffix.
+   * @param array $tree
+   *   (optional) An associative array whose keys are link paths and whose
+   *   values are link titles (not sanitized) of an expected active trail in a
+   *   menu tree output on the page.
+   * @param $last_active
+   *   (optional) Whether the last link in $tree is expected to be active (TRUE)
+   *   or just to be in the active trail (FALSE).
+   */
+  protected function assertBreadcrumb($goto, array $trail, $page_title = NULL, array $tree = array(), $last_active = TRUE) {
+    if (isset($goto)) {
+      $this->drupalGet($goto);
+    }
+    // Compare paths with actual breadcrumb.
+    $parts = $this->getParts();
+    $pass = TRUE;
+    foreach ($trail as $path => $title) {
+      $url = url($path);
+      $part = array_shift($parts);
+      $pass = ($pass && $part['href'] === $url && $part['text'] === check_plain($title));
+    }
+    // No parts must be left, or an expected "Home" will always pass.
+    $pass = ($pass && empty($parts));
+
+    $this->assertTrue($pass, format_string('Breadcrumb %parts found on @path.', array(
+      '%parts' => implode(' » ', $trail),
+      '@path' => $this->getUrl(),
+    )));
+
+    // Additionally assert page title, if given.
+    if (isset($page_title)) {
+      $this->assertTitle(strtr('@title | Drupal', array('@title' => $page_title)));
+    }
+
+    // Additionally assert active trail in a menu tree output, if given.
+    if ($tree) {
+      end($tree);
+      $active_link_path = key($tree);
+      $active_link_title = array_pop($tree);
+      $xpath = '';
+      if ($tree) {
+        $i = 0;
+        foreach ($tree as $link_path => $link_title) {
+          $part_xpath = (!$i ? '//' : '/following-sibling::ul/descendant::');
+          $part_xpath .= 'li[contains(@class, :class)]/a[contains(@href, :href) and contains(text(), :title)]';
+          $part_args = array(
+            ':class' => 'active-trail',
+            ':href' => url($link_path),
+            ':title' => $link_title,
+          );
+          $xpath .= $this->buildXPathQuery($part_xpath, $part_args);
+          $i++;
+        }
+        $elements = $this->xpath($xpath);
+        $this->assertTrue(!empty($elements), 'Active trail to current page was found in menu tree.');
+
+        // Append prefix for active link asserted below.
+        $xpath .= '/following-sibling::ul/descendant::';
+      }
+      else {
+        $xpath .= '//';
+      }
+      $xpath_last_active = ($last_active ? 'and contains(@class, :class-active)' : '');
+      $xpath .= 'li[contains(@class, :class-trail)]/a[contains(@href, :href) ' . $xpath_last_active . 'and contains(text(), :title)]';
+      $args = array(
+        ':class-trail' => 'active-trail',
+        ':class-active' => 'active',
+        ':href' => url($active_link_path),
+        ':title' => $active_link_title,
+      );
+      $elements = $this->xpath($xpath, $args);
+      $this->assertTrue(!empty($elements), format_string('Active link %title was found in menu tree, including active trail links %tree.', array(
+        '%title' => $active_link_title,
+        '%tree' => implode(' » ', $tree),
+      )));
+    }
+  }
+
+  /**
+   * Returns the breadcrumb contents of the current page in the internal browser.
+   */
+  protected function getParts() {
+    $parts = array();
+    $elements = $this->xpath('//div[@class="breadcrumb"]/a');
+    if (!empty($elements)) {
+      foreach ($elements as $element) {
+        $parts[] = array(
+          'text' => (string) $element,
+          'href' => (string) $element['href'],
+          'title' => (string) $element['title'],
+        );
+      }
+    }
+    return $parts;
+  }
+}
+
+class MenuRouterTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Menu router',
+      'description' => 'Tests menu router and hook_menu() functionality.',
+      'group' => 'Menu',
+    );
+  }
+
+  function setUp() {
+    // Enable dummy module that implements hook_menu.
+    parent::setUp('menu_test');
+    // Make the tests below more robust by explicitly setting the default theme
+    // and administrative theme that they expect.
+    theme_enable(array('bartik'));
+    variable_set('theme_default', 'bartik');
+    variable_set('admin_theme', 'seven');
+  }
+
+  /**
+   * Test title callback set to FALSE.
+   */
+  function testTitleCallbackFalse() {
+    $this->drupalGet('node');
+    $this->assertText('A title with @placeholder', 'Raw text found on the page');
+    $this->assertNoText(t('A title with @placeholder', array('@placeholder' => 'some other text')), 'Text with placeholder substitutions not found.');
+  }
+
+  /**
+   * Tests page title of MENU_CALLBACKs.
+   */
+  function testTitleMenuCallback() {
+    // Verify that the menu router item title is not visible.
+    $this->drupalGet('');
+    $this->assertNoText(t('Menu Callback Title'));
+    // Verify that the menu router item title is output as page title.
+    $this->drupalGet('menu_callback_title');
+    $this->assertText(t('Menu Callback Title'));
+  }
+
+  /**
+   * Test the theme callback when it is set to use an administrative theme.
+   */
+  function testThemeCallbackAdministrative() {
+    $this->drupalGet('menu-test/theme-callback/use-admin-theme');
+    $this->assertText('Custom theme: seven. Actual theme: seven.', 'The administrative theme can be correctly set in a theme callback.');
+    $this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page.");
+  }
+
+  /**
+   * Test that the theme callback is properly inherited.
+   */
+  function testThemeCallbackInheritance() {
+    $this->drupalGet('menu-test/theme-callback/use-admin-theme/inheritance');
+    $this->assertText('Custom theme: seven. Actual theme: seven. Theme callback inheritance is being tested.', 'Theme callback inheritance correctly uses the administrative theme.');
+    $this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page.");
+  }
+
+  /**
+   * Test that 'page callback', 'file' and 'file path' keys are properly
+   * inherited from parent menu paths.
+   */
+  function testFileInheritance() {
+    $this->drupalGet('admin/config/development/file-inheritance');
+    $this->assertText('File inheritance test description', 'File inheritance works.');
+  }
+
+  /**
+   * Test path containing "exotic" characters.
+   */
+  function testExoticPath() {
+    $path = "menu-test/ -._~!$'\"()*@[]?&+%#,;=:" . // "Special" ASCII characters.
+      "%23%25%26%2B%2F%3F" . // Characters that look like a percent-escaped string.
+      "éøïвβ中國書۞"; // Characters from various non-ASCII alphabets.
+    $this->drupalGet($path);
+    $this->assertRaw('This is menu_test_callback().');
+  }
+
+  /**
+   * Test the theme callback when the site is in maintenance mode.
+   */
+  function testThemeCallbackMaintenanceMode() {
+    variable_set('maintenance_mode', TRUE);
+
+    // For a regular user, the fact that the site is in maintenance mode means
+    // we expect the theme callback system to be bypassed entirely.
+    $this->drupalGet('menu-test/theme-callback/use-admin-theme');
+    $this->assertRaw('bartik/css/style.css', "The maintenance theme's CSS appears on the page.");
+
+    // An administrator, however, should continue to see the requested theme.
+    $admin_user = $this->drupalCreateUser(array('access site in maintenance mode'));
+    $this->drupalLogin($admin_user);
+    $this->drupalGet('menu-test/theme-callback/use-admin-theme');
+    $this->assertText('Custom theme: seven. Actual theme: seven.', 'The theme callback system is correctly triggered for an administrator when the site is in maintenance mode.');
+    $this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page.");
+  }
+
+  /**
+   * Make sure the maintenance mode can be bypassed using hook_menu_site_status_alter().
+   *
+   * @see hook_menu_site_status_alter().
+   */
+  function testMaintenanceModeLoginPaths() {
+    variable_set('maintenance_mode', TRUE);
+
+    $offline_message = t('@site is currently under maintenance. We should be back shortly. Thank you for your patience.', array('@site' => variable_get('site_name', 'Drupal')));
+    $this->drupalLogout();
+    $this->drupalGet('node');
+    $this->assertText($offline_message);
+    $this->drupalGet('menu_login_callback');
+    $this->assertText('This is menu_login_callback().', t('Maintenance mode can be bypassed through hook_login_paths().'));
+  }
+
+  /**
+   * Test that an authenticated user hitting 'user/login' gets redirected to
+   * 'user' and 'user/register' gets redirected to the user edit page.
+   */
+  function testAuthUserUserLogin() {
+    $loggedInUser = $this->drupalCreateUser(array());
+    $this->drupalLogin($loggedInUser);
+
+    $this->drupalGet('user/login');
+    // Check that we got to 'user'.
+    $this->assertTrue($this->url == url('user', array('absolute' => TRUE)), "Logged-in user redirected to q=user on accessing q=user/login");
+
+    // user/register should redirect to user/UID/edit.
+    $this->drupalGet('user/register');
+    $this->assertTrue($this->url == url('user/' . $this->loggedInUser->uid . '/edit', array('absolute' => TRUE)), "Logged-in user redirected to q=user/UID/edit on accessing q=user/register");
+  }
+
+  /**
+   * Test the theme callback when it is set to use an optional theme.
+   */
+  function testThemeCallbackOptionalTheme() {
+    // Request a theme that is not enabled.
+    $this->drupalGet('menu-test/theme-callback/use-stark-theme');
+    $this->assertText('Custom theme: NONE. Actual theme: bartik.', 'The theme callback system falls back on the default theme when a theme that is not enabled is requested.');
+    $this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page.");
+
+    // Now enable the theme and request it again.
+    theme_enable(array('stark'));
+    $this->drupalGet('menu-test/theme-callback/use-stark-theme');
+    $this->assertText('Custom theme: stark. Actual theme: stark.', 'The theme callback system uses an optional theme once it has been enabled.');
+    $this->assertRaw('stark/layout.css', "The optional theme's CSS appears on the page.");
+  }
+
+  /**
+   * Test the theme callback when it is set to use a theme that does not exist.
+   */
+  function testThemeCallbackFakeTheme() {
+    $this->drupalGet('menu-test/theme-callback/use-fake-theme');
+    $this->assertText('Custom theme: NONE. Actual theme: bartik.', 'The theme callback system falls back on the default theme when a theme that does not exist is requested.');
+    $this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page.");
+  }
+
+  /**
+   * Test the theme callback when no theme is requested.
+   */
+  function testThemeCallbackNoThemeRequested() {
+    $this->drupalGet('menu-test/theme-callback/no-theme-requested');
+    $this->assertText('Custom theme: NONE. Actual theme: bartik.', 'The theme callback system falls back on the default theme when no theme is requested.');
+    $this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page.");
+  }
+
+  /**
+   * Test that hook_custom_theme() can control the theme of a page.
+   */
+  function testHookCustomTheme() {
+    // Trigger hook_custom_theme() to dynamically request the Stark theme for
+    // the requested page.
+    variable_set('menu_test_hook_custom_theme_name', 'stark');
+    theme_enable(array('stark'));
+
+    // Visit a page that does not implement a theme callback. The above request
+    // should be honored.
+    $this->drupalGet('menu-test/no-theme-callback');
+    $this->assertText('Custom theme: stark. Actual theme: stark.', 'The result of hook_custom_theme() is used as the theme for the current page.');
+    $this->assertRaw('stark/layout.css', "The Stark theme's CSS appears on the page.");
+  }
+
+  /**
+   * Test that the theme callback wins out over hook_custom_theme().
+   */
+  function testThemeCallbackHookCustomTheme() {
+    // Trigger hook_custom_theme() to dynamically request the Stark theme for
+    // the requested page.
+    variable_set('menu_test_hook_custom_theme_name', 'stark');
+    theme_enable(array('stark'));
+
+    // The menu "theme callback" should take precedence over a value set in
+    // hook_custom_theme().
+    $this->drupalGet('menu-test/theme-callback/use-admin-theme');
+    $this->assertText('Custom theme: seven. Actual theme: seven.', 'The result of hook_custom_theme() does not override what was set in a theme callback.');
+    $this->assertRaw('seven/style.css', "The Seven theme's CSS appears on the page.");
+  }
+
+  /**
+   * Tests for menu_link_maintain().
+   */
+  function testMenuLinkMaintain() {
+    $admin_user = $this->drupalCreateUser(array('administer site configuration'));
+    $this->drupalLogin($admin_user);
+
+    // Create three menu items.
+    menu_link_maintain('menu_test', 'insert', 'menu_test_maintain/1', 'Menu link #1');
+    menu_link_maintain('menu_test', 'insert', 'menu_test_maintain/1', 'Menu link #1-1');
+    menu_link_maintain('menu_test', 'insert', 'menu_test_maintain/2', 'Menu link #2');
+
+    // Move second link to the main-menu, to test caching later on.
+    db_update('menu_links')
+      ->fields(array('menu_name' => 'main-menu'))
+      ->condition('link_title', 'Menu link #1-1')
+      ->condition('customized', 0)
+      ->condition('module', 'menu_test')
+      ->execute();
+    menu_cache_clear('main-menu');
+
+    // Load front page.
+    $this->drupalGet('node');
+    $this->assertLink(t('Menu link #1'), 0, 'Found menu link #1');
+    $this->assertLink(t('Menu link #1-1'), 0, 'Found menu link #1-1');
+    $this->assertLink(t('Menu link #2'), 0, 'Found menu link #2');
+
+    // Rename all links for the given path.
+    menu_link_maintain('menu_test', 'update', 'menu_test_maintain/1', 'Menu link updated');
+    // Load a different page to be sure that we have up to date information.
+    $this->drupalGet('menu_test_maintain/1');
+    $this->assertLink(t('Menu link updated'), 0, 'Found updated menu link');
+    $this->assertNoLink(t('Menu link #1'), 0, 'Not found menu link #1');
+    $this->assertNoLink(t('Menu link #1'), 0, 'Not found menu link #1-1');
+    $this->assertLink(t('Menu link #2'), 0, 'Found menu link #2');
+
+    // Delete all links for the given path.
+    menu_link_maintain('menu_test', 'delete', 'menu_test_maintain/1', '');
+    // Load a different page to be sure that we have up to date information.
+    $this->drupalGet('menu_test_maintain/2');
+    $this->assertNoLink(t('Menu link updated'), 0, 'Not found deleted menu link');
+    $this->assertNoLink(t('Menu link #1'), 0, 'Not found menu link #1');
+    $this->assertNoLink(t('Menu link #1'), 0, 'Not found menu link #1-1');
+    $this->assertLink(t('Menu link #2'), 0, 'Found menu link #2');
+  }
+
+  /**
+   * Test menu_get_names().
+   */
+  function testMenuGetNames() {
+    // Create three menu items.
+    for ($i = 0; $i < 3; $i++) {
+      $menu_link = array(
+        'link_title' => 'Menu link #' . $i,
+        'link_path' => 'menu_test/' . $i,
+        'module' => 'menu_test',
+        'menu_name' => 'menu_test_' . $i,
+      );
+      menu_link_save($menu_link);
+    }
+
+    drupal_static_reset('menu_get_names');
+
+    // Verify that the menu names are correctly reported by menu_get_names().
+    $menu_names = menu_get_names();
+    $this->pass(implode(' | ', $menu_names));
+    for ($i = 0; $i < 3; $i++) {
+      $this->assertTrue(in_array('menu_test_' . $i, $menu_names), t('Expected menu name %expected is returned.', array('%expected' => 'menu_test_' . $i)));
+    }
+  }
+
+  /**
+   * Tests for menu_name parameter for hook_menu().
+   */
+  function testMenuName() {
+    $admin_user = $this->drupalCreateUser(array('administer site configuration'));
+    $this->drupalLogin($admin_user);
+
+    $sql = "SELECT menu_name FROM {menu_links} WHERE router_path = 'menu_name_test'";
+    $name = db_query($sql)->fetchField();
+    $this->assertEqual($name, 'original', 'Menu name is "original".');
+
+    // Change the menu_name parameter in menu_test.module, then force a menu
+    // rebuild.
+    menu_test_menu_name('changed');
+    menu_rebuild();
+
+    $sql = "SELECT menu_name FROM {menu_links} WHERE router_path = 'menu_name_test'";
+    $name = db_query($sql)->fetchField();
+    $this->assertEqual($name, 'changed', 'Menu name was successfully changed after rebuild.');
+  }
+
+  /**
+   * Tests for menu hierarchy.
+   */
+  function testMenuHierarchy() {
+    $parent_link = db_query('SELECT * FROM {menu_links} WHERE link_path = :link_path', array(':link_path' => 'menu-test/hierarchy/parent'))->fetchAssoc();
+    $child_link = db_query('SELECT * FROM {menu_links} WHERE link_path = :link_path', array(':link_path' => 'menu-test/hierarchy/parent/child'))->fetchAssoc();
+    $unattached_child_link = db_query('SELECT * FROM {menu_links} WHERE link_path = :link_path', array(':link_path' => 'menu-test/hierarchy/parent/child2/child'))->fetchAssoc();
+
+    $this->assertEqual($child_link['plid'], $parent_link['mlid'], 'The parent of a directly attached child is correct.');
+    $this->assertEqual($unattached_child_link['plid'], $parent_link['mlid'], 'The parent of a non-directly attached child is correct.');
+  }
+
+  /**
+   * Tests menu link depth and parents of local tasks and menu callbacks.
+   */
+  function testMenuHidden() {
+    // Verify links for one dynamic argument.
+    $links = db_select('menu_links', 'ml')
+      ->fields('ml')
+      ->condition('ml.router_path', 'menu-test/hidden/menu%', 'LIKE')
+      ->orderBy('ml.router_path')
+      ->execute()
+      ->fetchAllAssoc('router_path', PDO::FETCH_ASSOC);
+
+    $parent = $links['menu-test/hidden/menu'];
+    $depth = $parent['depth'] + 1;
+    $plid = $parent['mlid'];
+
+    $link = $links['menu-test/hidden/menu/list'];
+    $this->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array('%path' => $link['router_path'], '@link_depth' => $link['depth'], '@depth' => $depth)));
+    $this->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array('%path' => $link['router_path'], '@link_plid' => $link['plid'], '@plid' => $plid)));
+
+    $link = $links['menu-test/hidden/menu/add'];
+    $this->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array('%path' => $link['router_path'], '@link_depth' => $link['depth'], '@depth' => $depth)));
+    $this->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array('%path' => $link['router_path'], '@link_plid' => $link['plid'], '@plid' => $plid)));
+
+    $link = $links['menu-test/hidden/menu/settings'];
+    $this->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array('%path' => $link['router_path'], '@link_depth' => $link['depth'], '@depth' => $depth)));
+    $this->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array('%path' => $link['router_path'], '@link_plid' => $link['plid'], '@plid' => $plid)));
+
+    $link = $links['menu-test/hidden/menu/manage/%'];
+    $this->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array('%path' => $link['router_path'], '@link_depth' => $link['depth'], '@depth' => $depth)));
+    $this->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array('%path' => $link['router_path'], '@link_plid' => $link['plid'], '@plid' => $plid)));
+
+    $parent = $links['menu-test/hidden/menu/manage/%'];
+    $depth = $parent['depth'] + 1;
+    $plid = $parent['mlid'];
+
+    $link = $links['menu-test/hidden/menu/manage/%/list'];
+    $this->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array('%path' => $link['router_path'], '@link_depth' => $link['depth'], '@depth' => $depth)));
+    $this->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array('%path' => $link['router_path'], '@link_plid' => $link['plid'], '@plid' => $plid)));
+
+    $link = $links['menu-test/hidden/menu/manage/%/add'];
+    $this->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array('%path' => $link['router_path'], '@link_depth' => $link['depth'], '@depth' => $depth)));
+    $this->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array('%path' => $link['router_path'], '@link_plid' => $link['plid'], '@plid' => $plid)));
+
+    $link = $links['menu-test/hidden/menu/manage/%/edit'];
+    $this->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array('%path' => $link['router_path'], '@link_depth' => $link['depth'], '@depth' => $depth)));
+    $this->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array('%path' => $link['router_path'], '@link_plid' => $link['plid'], '@plid' => $plid)));
+
+    $link = $links['menu-test/hidden/menu/manage/%/delete'];
+    $this->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array('%path' => $link['router_path'], '@link_depth' => $link['depth'], '@depth' => $depth)));
+    $this->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array('%path' => $link['router_path'], '@link_plid' => $link['plid'], '@plid' => $plid)));
+
+    // Verify links for two dynamic arguments.
+    $links = db_select('menu_links', 'ml')
+      ->fields('ml')
+      ->condition('ml.router_path', 'menu-test/hidden/block%', 'LIKE')
+      ->orderBy('ml.router_path')
+      ->execute()
+      ->fetchAllAssoc('router_path', PDO::FETCH_ASSOC);
+
+    $parent = $links['menu-test/hidden/block'];
+    $depth = $parent['depth'] + 1;
+    $plid = $parent['mlid'];
+
+    $link = $links['menu-test/hidden/block/list'];
+    $this->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array('%path' => $link['router_path'], '@link_depth' => $link['depth'], '@depth' => $depth)));
+    $this->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array('%path' => $link['router_path'], '@link_plid' => $link['plid'], '@plid' => $plid)));
+
+    $link = $links['menu-test/hidden/block/add'];
+    $this->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array('%path' => $link['router_path'], '@link_depth' => $link['depth'], '@depth' => $depth)));
+    $this->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array('%path' => $link['router_path'], '@link_plid' => $link['plid'], '@plid' => $plid)));
+
+    $link = $links['menu-test/hidden/block/manage/%/%'];
+    $this->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array('%path' => $link['router_path'], '@link_depth' => $link['depth'], '@depth' => $depth)));
+    $this->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array('%path' => $link['router_path'], '@link_plid' => $link['plid'], '@plid' => $plid)));
+
+    $parent = $links['menu-test/hidden/block/manage/%/%'];
+    $depth = $parent['depth'] + 1;
+    $plid = $parent['mlid'];
+
+    $link = $links['menu-test/hidden/block/manage/%/%/configure'];
+    $this->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array('%path' => $link['router_path'], '@link_depth' => $link['depth'], '@depth' => $depth)));
+    $this->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array('%path' => $link['router_path'], '@link_plid' => $link['plid'], '@plid' => $plid)));
+
+    $link = $links['menu-test/hidden/block/manage/%/%/delete'];
+    $this->assertEqual($link['depth'], $depth, format_string('%path depth @link_depth is equal to @depth.', array('%path' => $link['router_path'], '@link_depth' => $link['depth'], '@depth' => $depth)));
+    $this->assertEqual($link['plid'], $plid, format_string('%path plid @link_plid is equal to @plid.', array('%path' => $link['router_path'], '@link_plid' => $link['plid'], '@plid' => $plid)));
+  }
+
+  /**
+   * Test menu_get_item() with empty ancestors.
+   */
+  function testMenuGetItemNoAncestors() {
+    variable_set('menu_masks', array());
+    $this->drupalGet('');
+  }
+
+  /**
+   * Test menu_set_item().
+   */
+  function testMenuSetItem() {
+    $item = menu_get_item('node');
+
+    $this->assertEqual($item['path'], 'node', "Path from menu_get_item('node') is equal to 'node'", 'menu');
+
+    // Modify the path for the item then save it.
+    $item['path'] = 'node_test';
+    $item['href'] = 'node_test';
+
+    menu_set_item('node', $item);
+    $compare_item = menu_get_item('node');
+    $this->assertEqual($compare_item, $item, 'Modified menu item is equal to newly retrieved menu item.', 'menu');
+  }
+
+  /**
+   * Test menu maintenance hooks.
+   */
+  function testMenuItemHooks() {
+    // Create an item.
+    menu_link_maintain('menu_test', 'insert', 'menu_test_maintain/4', 'Menu link #4');
+    $this->assertEqual(menu_test_static_variable(), 'insert', 'hook_menu_link_insert() fired correctly');
+    // Update the item.
+    menu_link_maintain('menu_test', 'update', 'menu_test_maintain/4', 'Menu link updated');
+    $this->assertEqual(menu_test_static_variable(), 'update', 'hook_menu_link_update() fired correctly');
+    // Delete the item.
+    menu_link_maintain('menu_test', 'delete', 'menu_test_maintain/4', '');
+    $this->assertEqual(menu_test_static_variable(), 'delete', 'hook_menu_link_delete() fired correctly');
+  }
+
+  /**
+   * Test menu link 'options' storage and rendering.
+   */
+  function testMenuLinkOptions() {
+    // Create a menu link with options.
+    $menu_link = array(
+      'link_title' => 'Menu link options test',
+      'link_path' => 'node',
+      'module' => 'menu_test',
+      'options' => array(
+        'attributes' => array(
+          'title' => 'Test title attribute',
+        ),
+        'query' => array(
+          'testparam' => 'testvalue',
+        ),
+      ),
+    );
+    menu_link_save($menu_link);
+
+    // Load front page.
+    $this->drupalGet('node');
+    $this->assertRaw('title="Test title attribute"', 'Title attribute of a menu link renders.');
+    $this->assertRaw('testparam=testvalue', 'Query parameter added to menu link.');
+  }
+
+  /**
+   * Tests the possible ways to set the title for menu items.
+   * Also tests that menu item titles work with string overrides.
+   */
+  function testMenuItemTitlesCases() {
+
+    // Build array with string overrides.
+    $test_data = array(
+      1 => array('Example title - Case 1' => 'Alternative example title - Case 1'),
+      2 => array('Example @sub1 - Case @op2' => 'Alternative example @sub1 - Case @op2'),
+      3 => array('Example title' => 'Alternative example title'),
+      4 => array('Example title' => 'Alternative example title'),
+    );
+
+    foreach ($test_data as $case_no => $override) {
+      $this->menuItemTitlesCasesHelper($case_no);
+      variable_set('locale_custom_strings_en', array('' => $override));
+      $this->menuItemTitlesCasesHelper($case_no, TRUE);
+      variable_set('locale_custom_strings_en', array());
+    }
+  }
+
+  /**
+   * Get a URL and assert the title given a case number. If override is true,
+   * the title is asserted to begin with "Alternative".
+   */
+  private function menuItemTitlesCasesHelper($case_no, $override = FALSE) {
+    $this->drupalGet('menu-title-test/case' . $case_no);
+    $this->assertResponse(200);
+    $asserted_title = $override ? 'Alternative example title - Case ' . $case_no : 'Example title - Case ' . $case_no;
+    $this->assertTitle($asserted_title . ' | Drupal', format_string('Menu title is: %title.', array('%title' => $asserted_title)), 'Menu');
+  }
+
+  /**
+   * Load the router for a given path.
+   */
+  protected function menuLoadRouter($router_path) {
+    return db_query('SELECT * FROM {menu_router} WHERE path = :path', array(':path' => $router_path))->fetchAssoc();
+  }
+
+  /**
+   * Tests inheritance of 'load arguments'.
+   */
+  function testMenuLoadArgumentsInheritance() {
+    $expected = array(
+      'menu-test/arguments/%/%' => array(
+        2 => array('menu_test_argument_load' => array(3)),
+        3 => NULL,
+      ),
+      // Arguments are inherited to normal children.
+      'menu-test/arguments/%/%/default' => array(
+        2 => array('menu_test_argument_load' => array(3)),
+        3 => NULL,
+      ),
+      // Arguments are inherited to tab children.
+      'menu-test/arguments/%/%/task' => array(
+        2 => array('menu_test_argument_load' => array(3)),
+        3 => NULL,
+      ),
+      // Arguments are only inherited to the same loader functions.
+      'menu-test/arguments/%/%/common-loader' => array(
+        2 => array('menu_test_argument_load' => array(3)),
+        3 => 'menu_test_other_argument_load',
+      ),
+      // Arguments are not inherited to children not using the same loader
+      // function.
+      'menu-test/arguments/%/%/different-loaders-1' => array(
+        2 => NULL,
+        3 => 'menu_test_argument_load',
+      ),
+      'menu-test/arguments/%/%/different-loaders-2' => array(
+        2 => 'menu_test_other_argument_load',
+        3 => NULL,
+      ),
+      'menu-test/arguments/%/%/different-loaders-3' => array(
+        2 => NULL,
+        3 => NULL,
+      ),
+      // Explicit loader arguments should not be overriden by parent.
+      'menu-test/arguments/%/%/explicit-arguments' => array(
+        2 => array('menu_test_argument_load' => array()),
+        3 => NULL,
+      ),
+    );
+
+    foreach ($expected as $router_path => $load_functions) {
+      $router_item = $this->menuLoadRouter($router_path);
+      $this->assertIdentical(unserialize($router_item['load_functions']), $load_functions, format_string('Expected load functions for router %router_path' , array('%router_path' => $router_path)));
+    }
+  }
+}
+
+/**
+ * Tests for menu links.
+ */
+class MenuLinksUnitTestCase extends DrupalWebTestCase {
+  // Use the lightweight testing profile for this test.
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Menu links',
+      'description' => 'Test handling of menu links hierarchies.',
+      'group' => 'Menu',
+    );
+  }
+
+  /**
+   * Create a simple hierarchy of links.
+   */
+  function createLinkHierarchy($module = 'menu_test') {
+    // First remove all the menu links.
+    db_truncate('menu_links')->execute();
+
+    // Then create a simple link hierarchy:
+    // - $parent
+    //   - $child-1
+    //      - $child-1-1
+    //      - $child-1-2
+    //   - $child-2
+    $base_options = array(
+      'link_title' => 'Menu link test',
+      'module' => $module,
+      'menu_name' => 'menu_test',
+    );
+
+    $links['parent'] = $base_options + array(
+      'link_path' => 'menu-test/parent',
+    );
+    menu_link_save($links['parent']);
+
+    $links['child-1'] = $base_options + array(
+      'link_path' => 'menu-test/parent/child-1',
+      'plid' => $links['parent']['mlid'],
+    );
+    menu_link_save($links['child-1']);
+
+    $links['child-1-1'] = $base_options + array(
+      'link_path' => 'menu-test/parent/child-1/child-1-1',
+      'plid' => $links['child-1']['mlid'],
+    );
+    menu_link_save($links['child-1-1']);
+
+    $links['child-1-2'] = $base_options + array(
+      'link_path' => 'menu-test/parent/child-1/child-1-2',
+      'plid' => $links['child-1']['mlid'],
+    );
+    menu_link_save($links['child-1-2']);
+
+    $links['child-2'] = $base_options + array(
+      'link_path' => 'menu-test/parent/child-2',
+      'plid' => $links['parent']['mlid'],
+    );
+    menu_link_save($links['child-2']);
+
+    return $links;
+  }
+
+  /**
+   * Assert that at set of links is properly parented.
+   */
+  function assertMenuLinkParents($links, $expected_hierarchy) {
+    foreach ($expected_hierarchy as $child => $parent) {
+      $mlid = $links[$child]['mlid'];
+      $plid = $parent ? $links[$parent]['mlid'] : 0;
+
+      $menu_link = menu_link_load($mlid);
+      menu_link_save($menu_link);
+      $this->assertEqual($menu_link['plid'], $plid, format_string('Menu link %mlid has parent of %plid, expected %expected_plid.', array('%mlid' => $mlid, '%plid' => $menu_link['plid'], '%expected_plid' => $plid)));
+    }
+  }
+
+  /**
+   * Test automatic reparenting of menu links.
+   */
+  function testMenuLinkReparenting($module = 'menu_test') {
+    // Check the initial hierarchy.
+    $links = $this->createLinkHierarchy($module);
+
+    $expected_hierarchy = array(
+      'parent' => FALSE,
+      'child-1' => 'parent',
+      'child-1-1' => 'child-1',
+      'child-1-2' => 'child-1',
+      'child-2' => 'parent',
+    );
+    $this->assertMenuLinkParents($links, $expected_hierarchy);
+
+    // Start over, and move child-1 under child-2, and check that all the
+    // childs of child-1 have been moved too.
+    $links = $this->createLinkHierarchy($module);
+    $links['child-1']['plid'] = $links['child-2']['mlid'];
+    menu_link_save($links['child-1']);
+
+    $expected_hierarchy = array(
+      'parent' => FALSE,
+      'child-1' => 'child-2',
+      'child-1-1' => 'child-1',
+      'child-1-2' => 'child-1',
+      'child-2' => 'parent',
+    );
+    $this->assertMenuLinkParents($links, $expected_hierarchy);
+
+    // Start over, and delete child-1, and check that the children of child-1
+    // have been reassigned to the parent. menu_link_delete() will cowardly
+    // refuse to delete a menu link defined by the system module, so skip the
+    // test in that case.
+    if ($module != 'system') {
+      $links = $this->createLinkHierarchy($module);
+      menu_link_delete($links['child-1']['mlid']);
+
+      $expected_hierarchy = array(
+        'parent' => FALSE,
+        'child-1-1' => 'parent',
+        'child-1-2' => 'parent',
+        'child-2' => 'parent',
+      );
+      $this->assertMenuLinkParents($links, $expected_hierarchy);
+    }
+
+    // Start over, forcefully delete child-1 from the database, simulating a
+    // database crash. Check that the children of child-1 have been reassigned
+    // to the parent, going up on the old path hierarchy stored in each of the
+    // links.
+    $links = $this->createLinkHierarchy($module);
+    // Don't do that at home.
+    db_delete('menu_links')
+      ->condition('mlid', $links['child-1']['mlid'])
+      ->execute();
+
+    $expected_hierarchy = array(
+      'parent' => FALSE,
+      'child-1-1' => 'parent',
+      'child-1-2' => 'parent',
+      'child-2' => 'parent',
+    );
+    $this->assertMenuLinkParents($links, $expected_hierarchy);
+
+    // Start over, forcefully delete the parent from the database, simulating a
+    // database crash. Check that the children of parent are now top-level.
+    $links = $this->createLinkHierarchy($module);
+    // Don't do that at home.
+    db_delete('menu_links')
+      ->condition('mlid', $links['parent']['mlid'])
+      ->execute();
+
+    $expected_hierarchy = array(
+      'child-1-1' => 'child-1',
+      'child-1-2' => 'child-1',
+      'child-2' => FALSE,
+    );
+    $this->assertMenuLinkParents($links, $expected_hierarchy);
+  }
+
+  /**
+   * Test automatic reparenting of menu links derived from menu routers.
+   */
+  function testMenuLinkRouterReparenting() {
+    // Run all the standard parenting tests on menu links derived from
+    // menu routers.
+    $this->testMenuLinkReparenting('system');
+
+    // Additionnaly, test reparenting based on path.
+    $links = $this->createLinkHierarchy('system');
+
+    // Move child-1-2 has a child of child-2, making the link hierarchy
+    // inconsistent with the path hierarchy.
+    $links['child-1-2']['plid'] = $links['child-2']['mlid'];
+    menu_link_save($links['child-1-2']);
+
+    // Check the new hierarchy.
+    $expected_hierarchy = array(
+      'parent' => FALSE,
+      'child-1' => 'parent',
+      'child-1-1' => 'child-1',
+      'child-2' => 'parent',
+      'child-1-2' => 'child-2',
+    );
+    $this->assertMenuLinkParents($links, $expected_hierarchy);
+
+    // Now delete 'parent' directly from the database, simulating a database
+    // crash. 'child-1' and 'child-2' should get moved to the
+    // top-level.
+    // Don't do that at home.
+    db_delete('menu_links')
+      ->condition('mlid', $links['parent']['mlid'])
+      ->execute();
+    $expected_hierarchy = array(
+      'child-1' => FALSE,
+      'child-1-1' => 'child-1',
+      'child-2' => FALSE,
+      'child-1-2' => 'child-2',
+    );
+    $this->assertMenuLinkParents($links, $expected_hierarchy);
+
+    // Now delete 'child-2' directly from the database, simulating a database
+    // crash. 'child-1-2' will get reparented under 'child-1' based on its
+    // path.
+    // Don't do that at home.
+    db_delete('menu_links')
+      ->condition('mlid', $links['child-2']['mlid'])
+      ->execute();
+    $expected_hierarchy = array(
+      'child-1' => FALSE,
+      'child-1-1' => 'child-1',
+      'child-1-2' => 'child-1',
+    );
+    $this->assertMenuLinkParents($links, $expected_hierarchy);
+  }
+}
+
+/**
+ * Tests rebuilding the menu by setting 'menu_rebuild_needed.'
+ */
+class MenuRebuildTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Menu rebuild test',
+      'description' => 'Test rebuilding of menu.',
+      'group' => 'Menu',
+    );
+  }
+
+  /**
+   * Test if the 'menu_rebuild_needed' variable triggers a menu_rebuild() call.
+   */
+  function testMenuRebuildByVariable() {
+    // Check if 'admin' path exists.
+    $admin_exists = db_query('SELECT path from {menu_router} WHERE path = :path', array(':path' => 'admin'))->fetchField();
+    $this->assertEqual($admin_exists, 'admin', "The path 'admin/' exists prior to deleting.");
+
+    // Delete the path item 'admin', and test that the path doesn't exist in the database.
+    $delete = db_delete('menu_router')
+      ->condition('path', 'admin')
+      ->execute();
+    $admin_exists = db_query('SELECT path from {menu_router} WHERE path = :path', array(':path' => 'admin'))->fetchField();
+    $this->assertFalse($admin_exists, "The path 'admin/' has been deleted and doesn't exist in the database.");
+
+    // Now we enable the rebuild variable and trigger menu_execute_active_handler()
+    // to rebuild the menu item. Now 'admin' should exist.
+    variable_set('menu_rebuild_needed', TRUE);
+    // menu_execute_active_handler() should trigger the rebuild.
+    $this->drupalGet('<front>');
+    $admin_exists = db_query('SELECT path from {menu_router} WHERE path = :path', array(':path' => 'admin'))->fetchField();
+    $this->assertEqual($admin_exists, 'admin', "The menu has been rebuilt, the path 'admin' now exists again.");
+  }
+
+}
+
+/**
+ * Menu tree data related tests.
+ */
+class MenuTreeDataTestCase extends DrupalUnitTestCase {
+  /**
+   * Dummy link structure acceptable for menu_tree_data().
+   */
+  var $links = array(
+    1 => array('mlid' => 1, 'depth' => 1),
+    2 => array('mlid' => 2, 'depth' => 1),
+    3 => array('mlid' => 3, 'depth' => 2),
+    4 => array('mlid' => 4, 'depth' => 3),
+    5 => array('mlid' => 5, 'depth' => 1),
+  );
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Menu tree generation',
+      'description' => 'Tests recursive menu tree generation functions.',
+      'group' => 'Menu',
+    );
+  }
+
+  /**
+   * Validate the generation of a proper menu tree hierarchy.
+   */
+  function testMenuTreeData() {
+    $tree = menu_tree_data($this->links);
+
+    // Validate that parent items #1, #2, and #5 exist on the root level.
+    $this->assertSameLink($this->links[1], $tree[1]['link'], 'Parent item #1 exists.');
+    $this->assertSameLink($this->links[2], $tree[2]['link'], 'Parent item #2 exists.');
+    $this->assertSameLink($this->links[5], $tree[5]['link'], 'Parent item #5 exists.');
+
+    // Validate that child item #4 exists at the correct location in the hierarchy.
+    $this->assertSameLink($this->links[4], $tree[2]['below'][3]['below'][4]['link'], 'Child item #4 exists in the hierarchy.');
+  }
+
+  /**
+   * Check that two menu links are the same by comparing the mlid.
+   *
+   * @param $link1
+   *   A menu link item.
+   * @param $link2
+   *   A menu link item.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertSameLink($link1, $link2, $message = '') {
+    return $this->assert($link1['mlid'] == $link2['mlid'], $message ? $message : 'First link is identical to second link');
+  }
+}
+
+/**
+ * Menu tree output related tests.
+ */
+class MenuTreeOutputTestCase extends DrupalWebTestCase {
+  /**
+   * Dummy link structure acceptable for menu_tree_output().
+   */
+  var $tree_data = array(
+    '1'=> array(
+      'link' => array( 'menu_name' => 'main-menu', 'mlid' => 1, 'hidden'=>0, 'has_children' => 1, 'title' => 'Item 1', 'in_active_trail' => 1, 'access'=>1, 'href' => 'a', 'localized_options' => array('attributes' => array('title' =>'')) ),
+      'below' => array(
+        '2' => array('link' => array( 'menu_name' => 'main-menu', 'mlid' => 2, 'hidden'=>0, 'has_children' => 1, 'title' => 'Item 2', 'in_active_trail' => 1, 'access'=>1, 'href' => 'a/b', 'localized_options' => array('attributes' => array('title' =>'')) ),
+          'below' => array(
+            '3' => array('link' => array( 'menu_name' => 'main-menu', 'mlid' => 3, 'hidden'=>0, 'has_children' => 0, 'title' => 'Item 3', 'in_active_trail' => 0, 'access'=>1, 'href' => 'a/b/c', 'localized_options' => array('attributes' => array('title' =>'')) ),
+              'below' => array() ),
+            '4' => array('link' => array( 'menu_name' => 'main-menu', 'mlid' => 4, 'hidden'=>0, 'has_children' => 0, 'title' => 'Item 4', 'in_active_trail' => 0, 'access'=>1, 'href' => 'a/b/d', 'localized_options' => array('attributes' => array('title' =>'')) ),
+              'below' => array() )
+            )
+          )
+        )
+      ),
+    '5' => array('link' => array( 'menu_name' => 'main-menu', 'mlid' => 5, 'hidden'=>1, 'has_children' => 0, 'title' => 'Item 5', 'in_active_trail' => 0, 'access'=>1, 'href' => 'e', 'localized_options' => array('attributes' => array('title' =>'')) ), 'below' => array( ) ),
+    '6' => array('link' => array( 'menu_name' => 'main-menu', 'mlid' => 6, 'hidden'=>0, 'has_children' => 0, 'title' => 'Item 6', 'in_active_trail' => 0, 'access'=>0, 'href' => 'f', 'localized_options' => array('attributes' => array('title' =>'')) ), 'below' => array( ) ),
+    '7' => array('link' => array( 'menu_name' => 'main-menu', 'mlid' => 7, 'hidden'=>0, 'has_children' => 0, 'title' => 'Item 7', 'in_active_trail' => 0, 'access'=>1, 'href' => 'g', 'localized_options' => array('attributes' => array('title' =>'')) ), 'below' => array( ) )
+  );
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Menu tree output',
+      'description' => 'Tests menu tree output functions.',
+      'group' => 'Menu',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+  }
+
+  /**
+   * Validate the generation of a proper menu tree output.
+   */
+  function testMenuTreeData() {
+    $output = menu_tree_output($this->tree_data);
+
+    // Validate that the - in main-menu is changed into an underscore
+    $this->assertEqual($output['1']['#theme'], 'menu_link__main_menu', 'Hyphen is changed to an underscore on menu_link');
+    $this->assertEqual($output['#theme_wrappers'][0], 'menu_tree__main_menu', 'Hyphen is changed to an underscore on menu_tree wrapper');
+    // Looking for child items in the data
+    $this->assertEqual( $output['1']['#below']['2']['#href'], 'a/b', 'Checking the href on a child item');
+    $this->assertTrue( in_array('active-trail',$output['1']['#below']['2']['#attributes']['class']) , 'Checking the active trail class');
+    // Validate that the hidden and no access items are missing
+    $this->assertFalse( isset($output['5']), 'Hidden item should be missing');
+    $this->assertFalse( isset($output['6']), 'False access should be missing');
+    // Item 7 is after a couple hidden items. Just to make sure that 5 and 6 are skipped and 7 still included
+    $this->assertTrue( isset($output['7']), 'Item after hidden items is present');
+  }
+}
+
+/**
+ * Menu breadcrumbs related tests.
+ */
+class MenuBreadcrumbTestCase extends MenuWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Breadcrumbs',
+      'description' => 'Tests breadcrumbs functionality.',
+      'group' => 'Menu',
+    );
+  }
+
+  function setUp() {
+    $modules = func_get_args();
+    if (isset($modules[0]) && is_array($modules[0])) {
+      $modules = $modules[0];
+    }
+    $modules[] = 'menu_test';
+    parent::setUp($modules);
+    $perms = array_keys(module_invoke_all('permission'));
+    $this->admin_user = $this->drupalCreateUser($perms);
+    $this->drupalLogin($this->admin_user);
+
+    // This test puts menu links in the Navigation menu and then tests for
+    // their presence on the page, so we need to ensure that the Navigation
+    // block will be displayed in all active themes.
+    db_update('block')
+      ->fields(array(
+        // Use a region that is valid for all themes.
+        'region' => 'content',
+        'status' => 1,
+      ))
+      ->condition('module', 'system')
+      ->condition('delta', 'navigation')
+      ->execute();
+  }
+
+  /**
+   * Tests breadcrumbs on node and administrative paths.
+   */
+  function testBreadCrumbs() {
+    // Prepare common base breadcrumb elements.
+    $home = array('<front>' => 'Home');
+    $admin = $home + array('admin' => t('Administration'));
+    $config = $admin + array('admin/config' => t('Configuration'));
+    $type = 'article';
+    $langcode = LANGUAGE_NONE;
+
+    // Verify breadcrumbs for default local tasks.
+    $expected = array(
+      'menu-test' => t('Menu test root'),
+    );
+    $title = t('Breadcrumbs test: Local tasks');
+    $trail = $home + $expected;
+    $tree = $expected + array(
+      'menu-test/breadcrumb/tasks' => $title,
+    );
+    $this->assertBreadcrumb('menu-test/breadcrumb/tasks', $trail, $title, $tree);
+    $this->assertBreadcrumb('menu-test/breadcrumb/tasks/first', $trail, $title, $tree);
+    $this->assertBreadcrumb('menu-test/breadcrumb/tasks/first/first', $trail, $title, $tree);
+    $trail += array(
+      'menu-test/breadcrumb/tasks' => t('Breadcrumbs test: Local tasks'),
+    );
+    $this->assertBreadcrumb('menu-test/breadcrumb/tasks/first/second', $trail, $title, $tree);
+    $this->assertBreadcrumb('menu-test/breadcrumb/tasks/second', $trail, $title, $tree);
+    $this->assertBreadcrumb('menu-test/breadcrumb/tasks/second/first', $trail, $title, $tree);
+    $trail += array(
+      'menu-test/breadcrumb/tasks/second' => t('Second'),
+    );
+    $this->assertBreadcrumb('menu-test/breadcrumb/tasks/second/second', $trail, $title, $tree);
+
+    // Verify Taxonomy administration breadcrumbs.
+    $trail = $admin + array(
+      'admin/structure' => t('Structure'),
+    );
+    $this->assertBreadcrumb('admin/structure/taxonomy', $trail);
+
+    $trail += array(
+      'admin/structure/taxonomy' => t('Taxonomy'),
+    );
+    $this->assertBreadcrumb('admin/structure/taxonomy/tags', $trail);
+    $trail += array(
+      'admin/structure/taxonomy/tags' => t('Tags'),
+    );
+    $this->assertBreadcrumb('admin/structure/taxonomy/tags/edit', $trail);
+    $this->assertBreadcrumb('admin/structure/taxonomy/tags/fields', $trail);
+    $this->assertBreadcrumb('admin/structure/taxonomy/tags/add', $trail);
+
+    // Verify Menu administration breadcrumbs.
+    $trail = $admin + array(
+      'admin/structure' => t('Structure'),
+    );
+    $this->assertBreadcrumb('admin/structure/menu', $trail);
+
+    $trail += array(
+      'admin/structure/menu' => t('Menus'),
+    );
+    $this->assertBreadcrumb('admin/structure/menu/manage/navigation', $trail);
+    $trail += array(
+      'admin/structure/menu/manage/navigation' => t('Navigation'),
+    );
+    $this->assertBreadcrumb("admin/structure/menu/item/6/edit", $trail);
+    $this->assertBreadcrumb('admin/structure/menu/manage/navigation/edit', $trail);
+    $this->assertBreadcrumb('admin/structure/menu/manage/navigation/add', $trail);
+
+    // Verify Node administration breadcrumbs.
+    $trail = $admin + array(
+      'admin/structure' => t('Structure'),
+      'admin/structure/types' => t('Content types'),
+    );
+    $this->assertBreadcrumb('admin/structure/types/add', $trail);
+    $this->assertBreadcrumb("admin/structure/types/manage/$type", $trail);
+    $trail += array(
+      "admin/structure/types/manage/$type" => t('Article'),
+    );
+    $this->assertBreadcrumb("admin/structure/types/manage/$type/fields", $trail);
+    $this->assertBreadcrumb("admin/structure/types/manage/$type/display", $trail);
+    $trail_teaser = $trail + array(
+      "admin/structure/types/manage/$type/display" => t('Manage display'),
+    );
+    $this->assertBreadcrumb("admin/structure/types/manage/$type/display/teaser", $trail_teaser);
+    $this->assertBreadcrumb("admin/structure/types/manage/$type/comment/fields", $trail);
+    $this->assertBreadcrumb("admin/structure/types/manage/$type/comment/display", $trail);
+    $this->assertBreadcrumb("admin/structure/types/manage/$type/delete", $trail);
+    $trail += array(
+      "admin/structure/types/manage/$type/fields" => t('Manage fields'),
+    );
+    $this->assertBreadcrumb("admin/structure/types/manage/$type/fields/body", $trail);
+    $trail += array(
+      "admin/structure/types/manage/$type/fields/body" => t('Body'),
+    );
+    $this->assertBreadcrumb("admin/structure/types/manage/$type/fields/body/widget-type", $trail);
+
+    // Verify Filter text format administration breadcrumbs.
+    $format = db_query_range("SELECT format, name FROM {filter_format}", 1, 1)->fetch();
+    $format_id = $format->format;
+    $trail = $config + array(
+      'admin/config/content' => t('Content authoring'),
+    );
+    $this->assertBreadcrumb('admin/config/content/formats', $trail);
+
+    $trail += array(
+      'admin/config/content/formats' => t('Text formats'),
+    );
+    $this->assertBreadcrumb('admin/config/content/formats/add', $trail);
+    $this->assertBreadcrumb("admin/config/content/formats/$format_id", $trail);
+    $trail += array(
+      "admin/config/content/formats/$format_id" => $format->name,
+    );
+    $this->assertBreadcrumb("admin/config/content/formats/$format_id/disable", $trail);
+
+    // Verify node breadcrumbs (without menu link).
+    $node1 = $this->drupalCreateNode();
+    $nid1 = $node1->nid;
+    $trail = $home;
+    $this->assertBreadcrumb("node/$nid1", $trail);
+    // Also verify that the node does not appear elsewhere (e.g., menu trees).
+    $this->assertNoLink($node1->title);
+    // The node itself should not be contained in the breadcrumb on the default
+    // local task, since there is no difference between both pages.
+    $this->assertBreadcrumb("node/$nid1/view", $trail);
+    // Also verify that the node does not appear elsewhere (e.g., menu trees).
+    $this->assertNoLink($node1->title);
+
+    $trail += array(
+      "node/$nid1" => $node1->title,
+    );
+    $this->assertBreadcrumb("node/$nid1/edit", $trail);
+
+    // Verify that breadcrumb on node listing page contains "Home" only.
+    $trail = array();
+    $this->assertBreadcrumb('node', $trail);
+
+    // Verify node breadcrumbs (in menu).
+    // Do this separately for Main menu and Navigation menu, since only the
+    // latter is a preferred menu by default.
+    // @todo Also test all themes? Manually testing led to the suspicion that
+    //   breadcrumbs may differ, possibly due to template.php overrides.
+    $menus = array('main-menu', 'navigation');
+    // Alter node type menu settings.
+    variable_set("menu_options_$type", $menus);
+    variable_set("menu_parent_$type", 'navigation:0');
+
+    foreach ($menus as $menu) {
+      // Create a parent node in the current menu.
+      $title = $this->randomName();
+      $node2 = $this->drupalCreateNode(array(
+        'type' => $type,
+        'title' => $title,
+        'menu' => array(
+          'enabled' => 1,
+          'link_title' => 'Parent ' . $title,
+          'description' => '',
+          'menu_name' => $menu,
+          'plid' => 0,
+        ),
+      ));
+      $nid2 = $node2->nid;
+
+      $trail = $home;
+      $tree = array(
+        "node/$nid2" => $node2->menu['link_title'],
+      );
+      $this->assertBreadcrumb("node/$nid2", $trail, $node2->title, $tree);
+      // The node itself should not be contained in the breadcrumb on the
+      // default local task, since there is no difference between both pages.
+      $this->assertBreadcrumb("node/$nid2/view", $trail, $node2->title, $tree);
+      $trail += array(
+        "node/$nid2" => $node2->menu['link_title'],
+      );
+      $this->assertBreadcrumb("node/$nid2/edit", $trail);
+
+      // Create a child node in the current menu.
+      $title = $this->randomName();
+      $node3 = $this->drupalCreateNode(array(
+        'type' => $type,
+        'title' => $title,
+        'menu' => array(
+          'enabled' => 1,
+          'link_title' => 'Child ' . $title,
+          'description' => '',
+          'menu_name' => $menu,
+          'plid' => $node2->menu['mlid'],
+        ),
+      ));
+      $nid3 = $node3->nid;
+
+      $this->assertBreadcrumb("node/$nid3", $trail, $node3->title, $tree, FALSE);
+      // The node itself should not be contained in the breadcrumb on the
+      // default local task, since there is no difference between both pages.
+      $this->assertBreadcrumb("node/$nid3/view", $trail, $node3->title, $tree, FALSE);
+      $trail += array(
+        "node/$nid3" => $node3->menu['link_title'],
+      );
+      $tree += array(
+        "node/$nid3" => $node3->menu['link_title'],
+      );
+      $this->assertBreadcrumb("node/$nid3/edit", $trail);
+
+      // Verify that node listing page still contains "Home" only.
+      $trail = array();
+      $this->assertBreadcrumb('node', $trail);
+
+      if ($menu == 'navigation') {
+        $parent = $node2;
+        $child = $node3;
+      }
+    }
+
+    // Create a Navigation menu link for 'node', move the last parent node menu
+    // link below it, and verify a full breadcrumb for the last child node.
+    $menu = 'navigation';
+    $edit = array(
+      'link_title' => 'Root',
+      'link_path' => 'node',
+    );
+    $this->drupalPost("admin/structure/menu/manage/$menu/add", $edit, t('Save'));
+    $link = db_query('SELECT * FROM {menu_links} WHERE link_title = :title', array(':title' => 'Root'))->fetchAssoc();
+
+    $edit = array(
+      'menu[parent]' => $link['menu_name'] . ':' . $link['mlid'],
+    );
+    $this->drupalPost("node/{$parent->nid}/edit", $edit, t('Save'));
+    $expected = array(
+      "node" => $link['link_title'],
+    );
+    $trail = $home + $expected;
+    $tree = $expected + array(
+      "node/{$parent->nid}" => $parent->menu['link_title'],
+    );
+    $this->assertBreadcrumb(NULL, $trail, $parent->title, $tree);
+    $trail += array(
+      "node/{$parent->nid}" => $parent->menu['link_title'],
+    );
+    $tree += array(
+      "node/{$child->nid}" => $child->menu['link_title'],
+    );
+    $this->assertBreadcrumb("node/{$child->nid}", $trail, $child->title, $tree);
+
+    // Add a taxonomy term/tag to last node, and add a link for that term to the
+    // Navigation menu.
+    $tags = array(
+      'Drupal' => array(),
+      'Breadcrumbs' => array(),
+    );
+    $edit = array(
+      "field_tags[$langcode]" => implode(',', array_keys($tags)),
+    );
+    $this->drupalPost("node/{$parent->nid}/edit", $edit, t('Save'));
+
+    // Put both terms into a hierarchy Drupal » Breadcrumbs. Required for both
+    // the menu links and the terms itself, since taxonomy_term_page() resets
+    // the breadcrumb based on taxonomy term hierarchy.
+    $parent_tid = 0;
+    foreach ($tags as $name => $null) {
+      $terms = taxonomy_term_load_multiple(NULL, array('name' => $name));
+      $term = reset($terms);
+      $tags[$name]['term'] = $term;
+      if ($parent_tid) {
+        $edit = array(
+          'parent[]' => array($parent_tid),
+        );
+        $this->drupalPost("taxonomy/term/{$term->tid}/edit", $edit, t('Save'));
+      }
+      $parent_tid = $term->tid;
+    }
+    $parent_mlid = 0;
+    foreach ($tags as $name => $data) {
+      $term = $data['term'];
+      $edit = array(
+        'link_title' => "$name link",
+        'link_path' => "taxonomy/term/{$term->tid}",
+        'parent' => "$menu:{$parent_mlid}",
+      );
+      $this->drupalPost("admin/structure/menu/manage/$menu/add", $edit, t('Save'));
+      $tags[$name]['link'] = db_query('SELECT * FROM {menu_links} WHERE link_title = :title AND link_path = :href', array(
+        ':title' => $edit['link_title'],
+        ':href' => $edit['link_path'],
+      ))->fetchAssoc();
+      $tags[$name]['link']['link_path'] = $edit['link_path'];
+      $parent_mlid = $tags[$name]['link']['mlid'];
+    }
+
+    // Verify expected breadcrumbs for menu links.
+    $trail = $home;
+    $tree = array();
+    foreach ($tags as $name => $data) {
+      $term = $data['term'];
+      $link = $data['link'];
+
+      $tree += array(
+        $link['link_path'] => $link['link_title'],
+      );
+      $this->assertBreadcrumb($link['link_path'], $trail, $term->name, $tree);
+      $this->assertRaw(check_plain($parent->title), 'Tagged node found.');
+
+      // Additionally make sure that this link appears only once; i.e., the
+      // untranslated menu links automatically generated from menu router items
+      // ('taxonomy/term/%') should never be translated and appear in any menu
+      // other than the breadcrumb trail.
+      $elements = $this->xpath('//div[@id=:menu]/descendant::a[@href=:href]', array(
+        ':menu' => 'block-system-navigation',
+        ':href' => url($link['link_path']),
+      ));
+      $this->assertTrue(count($elements) == 1, "Link to {$link['link_path']} appears only once.");
+
+      // Next iteration should expect this tag as parent link.
+      // Note: Term name, not link name, due to taxonomy_term_page().
+      $trail += array(
+        $link['link_path'] => $term->name,
+      );
+    }
+
+    // Verify breadcrumbs on user and user/%.
+    // We need to log back in and out below, and cannot simply grant the
+    // 'administer users' permission, since user_page() makes your head explode.
+    user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array(
+      'access user profiles',
+    ));
+    $this->drupalLogout();
+
+    // Verify breadcrumb on front page.
+    $this->assertBreadcrumb('<front>', array());
+
+    // Verify breadcrumb on user pages (without menu link) for anonymous user.
+    $trail = $home;
+    $this->assertBreadcrumb('user', $trail, t('User account'));
+    $this->assertBreadcrumb('user/' . $this->admin_user->uid, $trail, $this->admin_user->name);
+
+    // Verify breadcrumb on user pages (without menu link) for registered users.
+    $this->drupalLogin($this->admin_user);
+    $trail = $home;
+    $this->assertBreadcrumb('user', $trail, $this->admin_user->name);
+    $this->assertBreadcrumb('user/' . $this->admin_user->uid, $trail, $this->admin_user->name);
+    $trail += array(
+      'user/' . $this->admin_user->uid => $this->admin_user->name,
+    );
+    $this->assertBreadcrumb('user/' . $this->admin_user->uid . '/edit', $trail, $this->admin_user->name);
+
+    // Create a second user to verify breadcrumb on user pages again.
+    $this->web_user = $this->drupalCreateUser(array(
+      'administer users',
+      'access user profiles',
+    ));
+    $this->drupalLogin($this->web_user);
+
+    // Verify correct breadcrumb and page title on another user's account pages
+    // (without menu link).
+    $trail = $home;
+    $this->assertBreadcrumb('user/' . $this->admin_user->uid, $trail, $this->admin_user->name);
+    $trail += array(
+      'user/' . $this->admin_user->uid => $this->admin_user->name,
+    );
+    $this->assertBreadcrumb('user/' . $this->admin_user->uid . '/edit', $trail, $this->admin_user->name);
+
+    // Verify correct breadcrumb and page title when viewing own user account
+    // pages (without menu link).
+    $trail = $home;
+    $this->assertBreadcrumb('user/' . $this->web_user->uid, $trail, $this->web_user->name);
+    $trail += array(
+      'user/' . $this->web_user->uid => $this->web_user->name,
+    );
+    $this->assertBreadcrumb('user/' . $this->web_user->uid . '/edit', $trail, $this->web_user->name);
+
+    // Add a Navigation menu links for 'user' and $this->admin_user.
+    // Although it may be faster to manage these links via low-level API
+    // functions, there's a lot that can go wrong in doing so.
+    $this->drupalLogin($this->admin_user);
+    $edit = array(
+      'link_title' => 'User',
+      'link_path' => 'user',
+    );
+    $this->drupalPost("admin/structure/menu/manage/$menu/add", $edit, t('Save'));
+    $link_user = db_query('SELECT * FROM {menu_links} WHERE link_title = :title AND link_path = :href', array(
+      ':title' => $edit['link_title'],
+      ':href' => $edit['link_path'],
+    ))->fetchAssoc();
+
+    $edit = array(
+      'link_title' => $this->admin_user->name . ' link',
+      'link_path' => 'user/' . $this->admin_user->uid,
+    );
+    $this->drupalPost("admin/structure/menu/manage/$menu/add", $edit, t('Save'));
+    $link_admin_user = db_query('SELECT * FROM {menu_links} WHERE link_title = :title AND link_path = :href', array(
+      ':title' => $edit['link_title'],
+      ':href' => $edit['link_path'],
+    ))->fetchAssoc();
+
+    // Verify expected breadcrumbs for the two separate links.
+    $this->drupalLogout();
+    $trail = $home;
+    $tree = array(
+      $link_user['link_path'] => $link_user['link_title'],
+    );
+    $this->assertBreadcrumb('user', $trail, $link_user['link_title'], $tree);
+    $tree = array(
+      $link_admin_user['link_path'] => $link_admin_user['link_title'],
+    );
+    $this->assertBreadcrumb('user/' . $this->admin_user->uid, $trail, $link_admin_user['link_title'], $tree);
+
+    $this->drupalLogin($this->admin_user);
+    $trail += array(
+      $link_admin_user['link_path'] => $link_admin_user['link_title'],
+    );
+    $this->assertBreadcrumb('user/' . $this->admin_user->uid . '/edit', $trail, $link_admin_user['link_title'], $tree, FALSE);
+
+    // Move 'user/%' below 'user' and verify again.
+    $edit = array(
+      'parent' => "$menu:{$link_user['mlid']}",
+    );
+    $this->drupalPost("admin/structure/menu/item/{$link_admin_user['mlid']}/edit", $edit, t('Save'));
+
+    $this->drupalLogout();
+    $trail = $home;
+    $tree = array(
+      $link_user['link_path'] => $link_user['link_title'],
+    );
+    $this->assertBreadcrumb('user', $trail, $link_user['link_title'], $tree);
+    $trail += array(
+      $link_user['link_path'] => $link_user['link_title'],
+    );
+    $tree += array(
+      $link_admin_user['link_path'] => $link_admin_user['link_title'],
+    );
+    $this->assertBreadcrumb('user/' . $this->admin_user->uid, $trail, $link_admin_user['link_title'], $tree);
+
+    $this->drupalLogin($this->admin_user);
+    $trail += array(
+      $link_admin_user['link_path'] => $link_admin_user['link_title'],
+    );
+    $this->assertBreadcrumb('user/' . $this->admin_user->uid . '/edit', $trail, $link_admin_user['link_title'], $tree, FALSE);
+
+    // Create an only slightly privileged user being able to access site reports
+    // but not administration pages.
+    $this->web_user = $this->drupalCreateUser(array(
+      'access site reports',
+    ));
+    $this->drupalLogin($this->web_user);
+
+    // Verify that we can access recent log entries, there is a corresponding
+    // page title, and that the breadcrumb is empty (because the user is not
+    // able to access "Administer", so the trail cannot recurse into it).
+    $trail = array();
+    $this->assertBreadcrumb('admin', $trail, t('Access denied'));
+    $this->assertResponse(403);
+
+    $trail = $home;
+    $this->assertBreadcrumb('admin/reports', $trail, t('Reports'));
+    $this->assertNoResponse(403);
+
+    $this->assertBreadcrumb('admin/reports/dblog', $trail, t('Recent log messages'));
+    $this->assertNoResponse(403);
+  }
+}
+
+/**
+ * Tests active menu trails.
+ */
+class MenuTrailTestCase extends MenuWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Active trail',
+      'description' => 'Tests active menu trails and alteration functionality.',
+      'group' => 'Menu',
+    );
+  }
+
+  function setUp() {
+    $modules = func_get_args();
+    if (isset($modules[0]) && is_array($modules[0])) {
+      $modules = $modules[0];
+    }
+    $modules[] = 'menu_test';
+    parent::setUp($modules);
+    $this->admin_user = $this->drupalCreateUser(array('administer site configuration', 'access administration pages'));
+    $this->drupalLogin($this->admin_user);
+
+    // This test puts menu links in the Navigation menu and then tests for
+    // their presence on the page, so we need to ensure that the Navigation
+    // block will be displayed in all active themes.
+    db_update('block')
+      ->fields(array(
+        // Use a region that is valid for all themes.
+        'region' => 'content',
+        'status' => 1,
+      ))
+      ->condition('module', 'system')
+      ->condition('delta', 'navigation')
+      ->execute();
+
+    // This test puts menu links in the Management menu and then tests for
+    // their presence on the page, so we need to ensure that the Management
+    // block will be displayed in all active themes.
+    db_update('block')
+      ->fields(array(
+        // Use a region that is valid for all themes.
+        'region' => 'content',
+        'status' => 1,
+      ))
+      ->condition('module', 'system')
+      ->condition('delta', 'management')
+      ->execute();
+  }
+
+  /**
+   * Tests active trails are properly affected by menu_tree_set_path().
+   */
+  function testMenuTreeSetPath() {
+    $home = array('<front>' => 'Home');
+    $config_tree = array(
+      'admin' => t('Administration'),
+      'admin/config' => t('Configuration'),
+    );
+    $config = $home + $config_tree;
+
+    // The menu_test_menu_tree_set_path system variable controls whether or not
+    // the menu_test_menu_trail_callback() callback (used by all paths in these
+    // tests) issues an overriding call to menu_trail_set_path().
+    $test_menu_path = array(
+      'menu_name' => 'management',
+      'path' => 'admin/config/system/site-information',
+    );
+
+    $breadcrumb = $home + array(
+      'menu-test' => t('Menu test root'),
+    );
+    $tree = array(
+      'menu-test' => t('Menu test root'),
+      'menu-test/menu-trail' => t('Menu trail - Case 1'),
+    );
+
+    // Test the tree generation for the Navigation menu.
+    variable_del('menu_test_menu_tree_set_path');
+    $this->assertBreadcrumb('menu-test/menu-trail', $breadcrumb, t('Menu trail - Case 1'), $tree);
+
+    // Override the active trail for the Management tree; it should not affect
+    // the Navigation tree.
+    variable_set('menu_test_menu_tree_set_path', $test_menu_path);
+    $this->assertBreadcrumb('menu-test/menu-trail', $breadcrumb, t('Menu trail - Case 1'), $tree);
+
+    $breadcrumb = $config + array(
+      'admin/config/development' => t('Development'),
+    );
+    $tree = $config_tree + array(
+      'admin/config/development' => t('Development'),
+      'admin/config/development/menu-trail' => t('Menu trail - Case 2'),
+    );
+
+    $override_breadcrumb = $config + array(
+      'admin/config/system' => t('System'),
+      'admin/config/system/site-information' => t('Site information'),
+    );
+    $override_tree = $config_tree + array(
+      'admin/config/system' => t('System'),
+      'admin/config/system/site-information' => t('Site information'),
+    );
+
+    // Test the tree generation for the Management menu.
+    variable_del('menu_test_menu_tree_set_path');
+    $this->assertBreadcrumb('admin/config/development/menu-trail', $breadcrumb, t('Menu trail - Case 2'), $tree);
+
+    // Override the active trail for the Management tree; it should affect the
+    // breadcrumbs and Management tree.
+    variable_set('menu_test_menu_tree_set_path', $test_menu_path);
+    $this->assertBreadcrumb('admin/config/development/menu-trail', $override_breadcrumb, t('Menu trail - Case 2'), $override_tree);
+  }
+
+  /**
+   * Tests that the active trail works correctly on custom 403 and 404 pages.
+   */
+  function testCustom403And404Pages() {
+    // Set the custom 403 and 404 pages we will use.
+    variable_set('site_403', 'menu-test/custom-403-page');
+    variable_set('site_404', 'menu-test/custom-404-page');
+
+    // Define the paths we'll visit to trigger 403 and 404 responses during
+    // this test, and the expected active trail for each case.
+    $paths = array(
+      403 => 'admin/config',
+      404 => $this->randomName(),
+    );
+    // For the 403 page, the initial trail during the Drupal bootstrap should
+    // include the page that the user is trying to visit, while the final trail
+    // should reflect the custom 403 page that the user was redirected to.
+    $expected_trail[403]['initial'] = array(
+      '<front>' => 'Home',
+      'admin/config' => 'Configuration',
+    );
+    $expected_trail[403]['final'] = array(
+      '<front>' => 'Home',
+      'menu-test' => 'Menu test root',
+      'menu-test/custom-403-page' => 'Custom 403 page',
+    );
+    // For the 404 page, the initial trail during the Drupal bootstrap should
+    // only contain the link back to "Home" (since the page the user is trying
+    // to visit doesn't have any menu items associated with it), while the
+    // final trail should reflect the custom 404 page that the user was
+    // redirected to.
+    $expected_trail[404]['initial'] = array(
+      '<front>' => 'Home',
+    );
+    $expected_trail[404]['final'] = array(
+      '<front>' => 'Home',
+      'menu-test' => 'Menu test root',
+      'menu-test/custom-404-page' => 'Custom 404 page',
+    );
+
+    // Visit each path as an anonymous user so that we will actually get a 403
+    // on admin/config.
+    $this->drupalLogout();
+    foreach (array(403, 404) as $status_code) {
+      // Before visiting the page, trigger the code in the menu_test module
+      // that will record the active trail (so we can check it in this test).
+      variable_set('menu_test_record_active_trail', TRUE);
+      $this->drupalGet($paths[$status_code]);
+      $this->assertResponse($status_code);
+
+      // Check that the initial trail (during the Drupal bootstrap) matches
+      // what we expect.
+      $initial_trail = variable_get('menu_test_active_trail_initial', array());
+      $this->assertEqual(count($initial_trail), count($expected_trail[$status_code]['initial']), format_string('The initial active trail for a @status_code page contains the expected number of items (expected: @expected, found: @found).', array(
+        '@status_code' => $status_code,
+        '@expected' => count($expected_trail[$status_code]['initial']),
+        '@found' => count($initial_trail),
+      )));
+      foreach (array_keys($expected_trail[$status_code]['initial']) as $index => $path) {
+        $this->assertEqual($initial_trail[$index]['href'], $path, format_string('Element number @number of the initial active trail for a @status_code page contains the correct path (expected: @expected, found: @found)', array(
+          '@number' => $index + 1,
+          '@status_code' => $status_code,
+          '@expected' => $path,
+          '@found' => $initial_trail[$index]['href'],
+        )));
+      }
+
+      // Check that the final trail (after the user has been redirected to the
+      // custom 403/404 page) matches what we expect.
+      $final_trail = variable_get('menu_test_active_trail_final', array());
+      $this->assertEqual(count($final_trail), count($expected_trail[$status_code]['final']), format_string('The final active trail for a @status_code page contains the expected number of items (expected: @expected, found: @found).', array(
+        '@status_code' => $status_code,
+        '@expected' => count($expected_trail[$status_code]['final']),
+        '@found' => count($final_trail),
+      )));
+      foreach (array_keys($expected_trail[$status_code]['final']) as $index => $path) {
+        $this->assertEqual($final_trail[$index]['href'], $path, format_string('Element number @number of the final active trail for a @status_code page contains the correct path (expected: @expected, found: @found)', array(
+          '@number' => $index + 1,
+          '@status_code' => $status_code,
+          '@expected' => $path,
+          '@found' => $final_trail[$index]['href'],
+        )));
+      }
+
+      // Check that the breadcrumb displayed on the final custom 403/404 page
+      // matches what we expect. (The last item of the active trail represents
+      // the current page, which is not supposed to appear in the breadcrumb,
+      // so we need to remove it from the array before checking.)
+      array_pop($expected_trail[$status_code]['final']);
+      $this->assertBreadcrumb(NULL, $expected_trail[$status_code]['final']);
+    }
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/menu_test.info b/htmltest/modules/simpletest/tests/menu_test.info
new file mode 100644
index 00000000..05fcef24
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/menu_test.info
@@ -0,0 +1,12 @@
+name = "Hook menu tests"
+description = "Support module for menu hook testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/menu_test.module b/htmltest/modules/simpletest/tests/menu_test.module
new file mode 100644
index 00000000..0b954ae1
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/menu_test.module
@@ -0,0 +1,563 @@
+<?php
+
+/**
+ * @file
+ * Dummy module implementing hook menu.
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function menu_test_menu() {
+  // The name of the menu changes during the course of the test. Using a $_GET.
+  $items['menu_name_test'] = array(
+    'title' => 'Test menu_name router item',
+    'page callback' => 'node_save',
+    'menu_name' => menu_test_menu_name(),
+  );
+  // This item is of type MENU_CALLBACK with no parents to test title.
+  $items['menu_callback_title'] = array(
+    'title' => 'Menu Callback Title',
+    'page callback' => 'menu_test_callback',
+    'type' => MENU_CALLBACK,
+    'access arguments' => array('access content'),
+  );
+  // Use FALSE as 'title callback' to bypass t().
+  $items['menu_no_title_callback'] = array(
+    'title' => 'A title with @placeholder',
+    'title callback' => FALSE,
+    'title arguments' => array('@placeholder' => 'some other text'),
+    'page callback' => 'menu_test_callback',
+    'access arguments' => array('access content'),
+  );
+
+  // Hidden link for menu_link_maintain tests
+  $items['menu_test_maintain/%'] = array(
+    'title' => 'Menu maintain test',
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+   );
+  // Hierarchical tests.
+  $items['menu-test/hierarchy/parent'] = array(
+    'title' => 'Parent menu router',
+    'page callback' => 'node_page_default',
+  );
+  $items['menu-test/hierarchy/parent/child'] = array(
+    'title' => 'Child menu router',
+    'page callback' => 'node_page_default',
+  );
+  $items['menu-test/hierarchy/parent/child2/child'] = array(
+    'title' => 'Unattached subchild router',
+    'page callback' => 'node_page_default',
+  );
+  // Theme callback tests.
+  $items['menu-test/theme-callback/%'] = array(
+    'title' => 'Page that displays different themes',
+    'page callback' => 'menu_test_theme_page_callback',
+    'access arguments' => array('access content'),
+    'theme callback' => 'menu_test_theme_callback',
+    'theme arguments' => array(2),
+  );
+  $items['menu-test/theme-callback/%/inheritance'] = array(
+    'title' => 'Page that tests theme callback inheritance.',
+    'page callback' => 'menu_test_theme_page_callback',
+    'page arguments' => array(TRUE),
+    'access arguments' => array('access content'),
+  );
+  $items['menu-test/no-theme-callback'] = array(
+    'title' => 'Page that displays different themes without using a theme callback.',
+    'page callback' => 'menu_test_theme_page_callback',
+    'access arguments' => array('access content'),
+  );
+  // Path containing "exotic" characters.
+  $path = "menu-test/ -._~!$'\"()*@[]?&+%#,;=:" . // "Special" ASCII characters.
+    "%23%25%26%2B%2F%3F" . // Characters that look like a percent-escaped string.
+    "éøïвβ中國書۞"; // Characters from various non-ASCII alphabets.
+  $items[$path] = array(
+    'title' => '"Exotic" path',
+    'page callback' => 'menu_test_callback',
+    'access arguments' => array('access content'),
+  );
+
+  // Hidden tests; base parents.
+  // Same structure as in Menu and Block modules. Since those structures can
+  // change, we need to simulate our own in here.
+  $items['menu-test'] = array(
+    'title' => 'Menu test root',
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+  );
+  $items['menu-test/hidden'] = array(
+    'title' => 'Hidden test root',
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+  );
+
+  // Hidden tests; one dynamic argument.
+  $items['menu-test/hidden/menu'] = array(
+    'title' => 'Menus',
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+  );
+  $items['menu-test/hidden/menu/list'] = array(
+    'title' => 'List menus',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['menu-test/hidden/menu/add'] = array(
+    'title' => 'Add menu',
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+    'type' => MENU_LOCAL_ACTION,
+  );
+  $items['menu-test/hidden/menu/settings'] = array(
+    'title' => 'Settings',
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 5,
+  );
+  $items['menu-test/hidden/menu/manage/%menu'] = array(
+    'title' => 'Customize menu',
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+  );
+  $items['menu-test/hidden/menu/manage/%menu/list'] = array(
+    'title' => 'List links',
+    'weight' => -10,
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
+  );
+  $items['menu-test/hidden/menu/manage/%menu/add'] = array(
+    'title' => 'Add link',
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+    'type' => MENU_LOCAL_ACTION,
+  );
+  $items['menu-test/hidden/menu/manage/%menu/edit'] = array(
+    'title' => 'Edit menu',
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+    'type' => MENU_LOCAL_TASK,
+    'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
+  );
+  $items['menu-test/hidden/menu/manage/%menu/delete'] = array(
+    'title' => 'Delete menu',
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+  );
+
+  // Hidden tests; two dynamic arguments.
+  $items['menu-test/hidden/block'] = array(
+    'title' => 'Blocks',
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+  );
+  $items['menu-test/hidden/block/list'] = array(
+    'title' => 'List',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['menu-test/hidden/block/add'] = array(
+    'title' => 'Add block',
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+    'type' => MENU_LOCAL_ACTION,
+  );
+  $items['menu-test/hidden/block/manage/%/%'] = array(
+    'title' => 'Configure block',
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+  );
+  $items['menu-test/hidden/block/manage/%/%/configure'] = array(
+    'title' => 'Configure block',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'context' => MENU_CONTEXT_INLINE,
+  );
+  $items['menu-test/hidden/block/manage/%/%/delete'] = array(
+    'title' => 'Delete block',
+    'page callback' => 'node_page_default',
+    'access arguments' => array('access content'),
+    'type' => MENU_LOCAL_TASK,
+    'context' => MENU_CONTEXT_NONE,
+  );
+
+  // Breadcrumbs tests.
+  // @see MenuBreadcrumbTestCase
+  $base = array(
+    'page callback' => 'menu_test_callback',
+    'access callback' => TRUE,
+  );
+  // Local tasks: Second level below default local task.
+  $items['menu-test/breadcrumb/tasks'] = array(
+    'title' => 'Breadcrumbs test: Local tasks',
+  ) + $base;
+  $items['menu-test/breadcrumb/tasks/first'] = array(
+    'title' => 'First',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  ) + $base;
+  $items['menu-test/breadcrumb/tasks/second'] = array(
+    'title' => 'Second',
+    'type' => MENU_LOCAL_TASK,
+  ) + $base;
+  $items['menu-test/breadcrumb/tasks/first/first'] = array(
+    'title' => 'First first',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  ) + $base;
+  $items['menu-test/breadcrumb/tasks/first/second'] = array(
+    'title' => 'First second',
+    'type' => MENU_LOCAL_TASK,
+  ) + $base;
+  $items['menu-test/breadcrumb/tasks/second/first'] = array(
+    'title' => 'Second first',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  ) + $base;
+  $items['menu-test/breadcrumb/tasks/second/second'] = array(
+    'title' => 'Second second',
+    'type' => MENU_LOCAL_TASK,
+  ) + $base;
+
+  // Menu trail tests.
+  // @see MenuTrailTestCase
+  $items['menu-test/menu-trail'] = array(
+    'title' => 'Menu trail - Case 1',
+    'page callback' => 'menu_test_menu_trail_callback',
+    'access arguments' => array('access content'),
+  );
+  $items['admin/config/development/menu-trail'] = array(
+    'title' => 'Menu trail - Case 2',
+    'description' => 'Tests menu_tree_set_path()',
+    'page callback' => 'menu_test_menu_trail_callback',
+    'access arguments' => array('access administration pages'),
+  );
+  $items['menu-test/custom-403-page'] = array(
+    'title' => 'Custom 403 page',
+    'page callback' => 'menu_test_custom_403_404_callback',
+    'access arguments' => array('access content'),
+  );
+  $items['menu-test/custom-404-page'] = array(
+    'title' => 'Custom 404 page',
+    'page callback' => 'menu_test_custom_403_404_callback',
+    'access arguments' => array('access content'),
+  );
+
+  // File inheritance tests. This menu item should inherit the page callback
+  // system_admin_menu_block_page() and therefore render its children as links
+  // on the page.
+  $items['admin/config/development/file-inheritance'] = array(
+    'title' => 'File inheritance',
+    'description' => 'Test file inheritance',
+    'access arguments' => array('access content'),
+  );
+  $items['admin/config/development/file-inheritance/inherit'] = array(
+    'title' => 'Inherit',
+    'description' => 'File inheritance test description',
+    'page callback' => 'menu_test_callback',
+    'access arguments' => array('access content'),
+  );
+
+  $items['menu_login_callback'] = array(
+    'title' => 'Used as a login path',
+    'page callback' => 'menu_login_callback',
+    'access callback' => TRUE,
+  );
+
+  $items['menu-title-test/case1'] = array(
+   'title' => 'Example title - Case 1',
+   'access callback' => TRUE,
+   'page callback' => 'menu_test_callback',
+  );
+  $items['menu-title-test/case2'] = array(
+   'title' => 'Example @sub1 - Case @op2',
+   // If '2' is not in quotes, the argument becomes arg(2).
+   'title arguments' => array('@sub1' => 'title', '@op2' => '2'),
+   'access callback' => TRUE,
+   'page callback' => 'menu_test_callback',
+  );
+  $items['menu-title-test/case3'] = array(
+   'title' => 'Example title',
+   'title callback' => 'menu_test_title_callback',
+   'access callback' => TRUE,
+   'page callback' => 'menu_test_callback',
+  );
+  $items['menu-title-test/case4'] = array(
+   // Title gets completely ignored. Good thing, too.
+   'title' => 'Bike sheds full of blue smurfs',
+   'title callback' => 'menu_test_title_callback',
+   // If '4' is not in quotes, the argument becomes arg(4).
+   'title arguments' => array('Example title', '4'),
+   'access callback' => TRUE,
+   'page callback' => 'menu_test_callback',
+  );
+
+  // Load arguments inheritance test.
+  $items['menu-test/arguments/%menu_test_argument/%'] = array(
+    'title' => 'Load arguments inheritance test',
+    'load arguments' => array(3),
+    'page callback' => 'menu_test_callback',
+    'access callback' => TRUE,
+  );
+  $items['menu-test/arguments/%menu_test_argument/%/default'] = array(
+    'title' => 'Default local task',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $items['menu-test/arguments/%menu_test_argument/%/task'] = array(
+    'title' => 'Local task',
+    'page callback' => 'menu_test_callback',
+    'access callback' => TRUE,
+    'type' => MENU_LOCAL_TASK,
+  );
+  // For this path, load arguments should be inherited for the first loader only.
+  $items['menu-test/arguments/%menu_test_argument/%menu_test_other_argument/common-loader'] = array(
+    'title' => 'Local task',
+    'page callback' => 'menu_test_callback',
+    'access callback' => TRUE,
+    'type' => MENU_LOCAL_TASK,
+  );
+  // For these paths, no load arguments should be inherited.
+  // Not on the same position.
+  $items['menu-test/arguments/%/%menu_test_argument/different-loaders-1'] = array(
+    'title' => 'An item not sharing the same loader',
+    'page callback' => 'menu_test_callback',
+    'access callback' => TRUE,
+  );
+  // Not the same loader.
+  $items['menu-test/arguments/%menu_test_other_argument/%/different-loaders-2'] = array(
+    'title' => 'An item not sharing the same loader',
+    'page callback' => 'menu_test_callback',
+    'access callback' => TRUE,
+  );
+  // Not the same loader.
+  $items['menu-test/arguments/%/%/different-loaders-3'] = array(
+    'title' => 'An item not sharing the same loader',
+    'page callback' => 'menu_test_callback',
+    'access callback' => TRUE,
+  );
+  // Explict load arguments should not be overriden (even if empty).
+  $items['menu-test/arguments/%menu_test_argument/%/explicit-arguments'] = array(
+    'title' => 'An item defining explicit load arguments',
+    'load arguments' => array(),
+    'page callback' => 'menu_test_callback',
+    'access callback' => TRUE,
+  );
+
+  return $items;
+}
+
+/**
+ * Dummy argument loader for hook_menu() to point to.
+ */
+function menu_test_argument_load($arg1) {
+  return FALSE;
+}
+
+/**
+ * Dummy argument loader for hook_menu() to point to.
+ */
+function menu_test_other_argument_load($arg1) {
+  return FALSE;
+}
+
+/**
+ * Dummy callback for hook_menu() to point to.
+ *
+ * @return
+ *  A random string.
+ */
+function menu_test_callback() {
+  return 'This is menu_test_callback().';
+}
+
+/**
+ * Callback that test menu_test_menu_tree_set_path().
+ */
+function menu_test_menu_trail_callback() {
+  $menu_path = variable_get('menu_test_menu_tree_set_path', array());
+  if (!empty($menu_path)) {
+    menu_tree_set_path($menu_path['menu_name'], $menu_path['path']);
+  }
+  return 'This is menu_test_menu_trail_callback().';
+}
+
+/**
+ * Implements hook_init().
+ */
+function menu_test_init() {
+  // When requested by one of the MenuTrailTestCase tests, record the initial
+  // active trail during Drupal's bootstrap (before the user is redirected to a
+  // custom 403 or 404 page). See menu_test_custom_403_404_callback().
+  if (variable_get('menu_test_record_active_trail', FALSE)) {
+    variable_set('menu_test_active_trail_initial', menu_get_active_trail());
+  }
+}
+
+/**
+ * Callback for our custom 403 and 404 pages.
+ */
+function menu_test_custom_403_404_callback() {
+  // When requested by one of the MenuTrailTestCase tests, record the final
+  // active trail now that the user has been redirected to the custom 403 or
+  // 404 page. See menu_test_init().
+  if (variable_get('menu_test_record_active_trail', FALSE)) {
+    variable_set('menu_test_active_trail_final', menu_get_active_trail());
+  }
+
+  return 'This is menu_test_custom_403_404_callback().';
+}
+
+/**
+ * Page callback to use when testing the theme callback functionality.
+ *
+ * @param $inherited
+ *   An optional boolean to set to TRUE when the requested page is intended to
+ *   inherit the theme of its parent.
+ * @return
+ *   A string describing the requested custom theme and actual theme being used
+ *   for the current page request.
+ */
+function menu_test_theme_page_callback($inherited = FALSE) {
+  global $theme_key;
+  // Initialize the theme system so that $theme_key will be populated.
+  drupal_theme_initialize();
+  // Now check both the requested custom theme and the actual theme being used.
+  $custom_theme = menu_get_custom_theme();
+  $requested_theme = empty($custom_theme) ? 'NONE' : $custom_theme;
+  $output = "Custom theme: $requested_theme. Actual theme: $theme_key.";
+  if ($inherited) {
+    $output .= ' Theme callback inheritance is being tested.';
+  }
+  return $output;
+}
+
+/**
+ * Theme callback to use when testing the theme callback functionality.
+ *
+ * @param $argument
+ *   The argument passed in from the URL.
+ * @return
+ *   The name of the custom theme to request for the current page.
+ */
+function menu_test_theme_callback($argument) {
+  // Test using the variable administrative theme.
+  if ($argument == 'use-admin-theme') {
+    return variable_get('admin_theme');
+  }
+  // Test using a theme that exists, but may or may not be enabled.
+  elseif ($argument == 'use-stark-theme') {
+    return 'stark';
+  }
+  // Test using a theme that does not exist.
+  elseif ($argument == 'use-fake-theme') {
+    return 'fake_theme';
+  }
+  // For any other value of the URL argument, do not return anything. This
+  // allows us to test that returning nothing from a theme callback function
+  // causes the page to correctly fall back on using the main site theme.
+}
+
+/**
+ * Implement hook_custom_theme().
+ *
+ * @return
+ *   The name of the custom theme to use for the current page.
+ */
+function menu_test_custom_theme() {
+  // If an appropriate variable has been set in the database, request the theme
+  // that is stored there. Otherwise, do not attempt to dynamically set the
+  // theme.
+  if ($theme = variable_get('menu_test_hook_custom_theme_name', FALSE)) {
+    return $theme;
+  }
+}
+
+/**
+ * Helper function for the testMenuName() test. Used to change the menu_name
+ * parameter of a menu.
+ *
+ * @param $new_name
+ *   If set, will change the menu_name value.
+ * @return
+ *   The menu_name value to use.
+ */
+function menu_test_menu_name($new_name = '') {
+  static $name = 'original';
+  if ($new_name) {
+    $name = $new_name;
+  }
+  return $name;
+}
+
+/**
+ * Implements hook_menu_link_insert().
+ *
+ * @return
+ *  A random string.
+ */
+function menu_test_menu_link_insert($item) {
+  menu_test_static_variable('insert');
+}
+
+/**
+ * Implements hook_menu_link_update().
+ *
+ * @return
+ *  A random string.
+ */
+function menu_test_menu_link_update($item) {
+  menu_test_static_variable('update');
+}
+
+/**
+ * Implements hook_menu_link_delete().
+ *
+ * @return
+ *  A random string.
+ */
+function menu_test_menu_link_delete($item) {
+  menu_test_static_variable('delete');
+}
+
+/**
+ * Static function for testing hook results.
+ *
+ * @param $value
+ *   The value to set or NULL to return the current value.
+ * @return
+ *   A text string for comparison to test assertions.
+ */
+function menu_test_static_variable($value = NULL) {
+  static $variable;
+  if (!empty($value)) {
+    $variable = $value;
+  }
+  return $variable;
+}
+
+/**
+ * Implements hook_menu_site_status_alter().
+ */
+function menu_test_menu_site_status_alter(&$menu_site_status, $path) {
+  // Allow access to ?q=menu_login_callback even if in maintenance mode.
+  if ($menu_site_status == MENU_SITE_OFFLINE && $path == 'menu_login_callback') {
+    $menu_site_status = MENU_SITE_ONLINE;
+  }
+}
+
+/**
+ * Menu callback to be used as a login path.
+ */
+function menu_login_callback() {
+  return 'This is menu_login_callback().';
+}
+
+/**
+ * Concatenates a string, by using the t() function and a case number.
+ *
+ * @param $title
+ *   Title string.
+ * @param $case_number
+ *   The current case number which is tests (defaults to 3).
+ */
+function menu_test_title_callback($title, $case_no = 3) {
+  return t($title) . ' - Case ' . $case_no;
+}
diff --git a/htmltest/modules/simpletest/tests/module.test b/htmltest/modules/simpletest/tests/module.test
new file mode 100644
index 00000000..371339f3
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/module.test
@@ -0,0 +1,304 @@
+<?php
+
+/**
+ * @file
+ * Tests for the module API.
+ */
+
+/**
+ * Unit tests for the module API.
+ */
+class ModuleUnitTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Module API',
+      'description' => 'Test low-level module functions.',
+      'group' => 'Module',
+    );
+  }
+
+  /**
+   * The basic functionality of module_list().
+   */
+  function testModuleList() {
+    // Build a list of modules, sorted alphabetically.
+    $profile_info = install_profile_info('standard', 'en');
+    $module_list = $profile_info['dependencies'];
+
+    // Installation profile is a module that is expected to be loaded.
+    $module_list[] = 'standard';
+
+    sort($module_list);
+    // Compare this list to the one returned by module_list(). We expect them
+    // to match, since all default profile modules have a weight equal to 0
+    // (except for block.module, which has a lower weight but comes first in
+    // the alphabet anyway).
+    $this->assertModuleList($module_list, t('Standard profile'));
+
+    // Try to install a new module.
+    module_enable(array('contact'));
+    $module_list[] = 'contact';
+    sort($module_list);
+    $this->assertModuleList($module_list, t('After adding a module'));
+
+    // Try to mess with the module weights.
+    db_update('system')
+      ->fields(array('weight' => 20))
+      ->condition('name', 'contact')
+      ->condition('type', 'module')
+      ->execute();
+    // Reset the module list.
+    module_list(TRUE);
+    // Move contact to the end of the array.
+    unset($module_list[array_search('contact', $module_list)]);
+    $module_list[] = 'contact';
+    $this->assertModuleList($module_list, t('After changing weights'));
+
+    // Test the fixed list feature.
+    $fixed_list = array(
+      'system' => array('filename' => drupal_get_path('module', 'system')),
+      'menu' => array('filename' => drupal_get_path('module', 'menu')),
+    );
+    module_list(FALSE, FALSE, FALSE, $fixed_list);
+    $new_module_list = array_combine(array_keys($fixed_list), array_keys($fixed_list));
+    $this->assertModuleList($new_module_list, t('When using a fixed list'));
+
+    // Reset the module list.
+    module_list(TRUE);
+    $this->assertModuleList($module_list, t('After reset'));
+  }
+
+  /**
+   * Assert that module_list() return the expected values.
+   *
+   * @param $expected_values
+   *   The expected values, sorted by weight and module name.
+   */
+  protected function assertModuleList(Array $expected_values, $condition) {
+    $expected_values = array_combine($expected_values, $expected_values);
+    $this->assertEqual($expected_values, module_list(), format_string('@condition: module_list() returns correct results', array('@condition' => $condition)));
+    ksort($expected_values);
+    $this->assertIdentical($expected_values, module_list(FALSE, FALSE, TRUE), format_string('@condition: module_list() returns correctly sorted results', array('@condition' => $condition)));
+  }
+
+  /**
+   * Test module_implements() caching.
+   */
+  function testModuleImplements() {
+    // Clear the cache.
+    cache_clear_all('module_implements', 'cache_bootstrap');
+    $this->assertFalse(cache_get('module_implements', 'cache_bootstrap'), 'The module implements cache is empty.');
+    $this->drupalGet('');
+    $this->assertTrue(cache_get('module_implements', 'cache_bootstrap'), 'The module implements cache is populated after requesting a page.');
+
+    // Test again with an authenticated user.
+    $this->user = $this->drupalCreateUser();
+    $this->drupalLogin($this->user);
+    cache_clear_all('module_implements', 'cache_bootstrap');
+    $this->drupalGet('');
+    $this->assertTrue(cache_get('module_implements', 'cache_bootstrap'), 'The module implements cache is populated after requesting a page.');
+
+    // Make sure group include files are detected properly even when the file is
+    // already loaded when the cache is rebuilt.
+    // For that activate the module_test which provides the file to load.
+    module_enable(array('module_test'));
+
+    module_load_include('inc', 'module_test', 'module_test.file');
+    $modules = module_implements('test_hook');
+    $static = drupal_static('module_implements');
+    $this->assertTrue(in_array('module_test', $modules), 'Hook found.');
+    $this->assertEqual($static['test_hook']['module_test'], 'file', 'Include file detected.');
+  }
+
+  /**
+   * Test that module_invoke() can load a hook defined in hook_hook_info().
+   */
+  function testModuleInvoke() {
+    module_enable(array('module_test'), FALSE);
+    $this->resetAll();
+    $this->drupalGet('module-test/hook-dynamic-loading-invoke');
+    $this->assertText('success!', 'module_invoke() dynamically loads a hook defined in hook_hook_info().');
+  }
+
+  /**
+   * Test that module_invoke_all() can load a hook defined in hook_hook_info().
+   */
+  function testModuleInvokeAll() {
+    module_enable(array('module_test'), FALSE);
+    $this->resetAll();
+    $this->drupalGet('module-test/hook-dynamic-loading-invoke-all');
+    $this->assertText('success!', 'module_invoke_all() dynamically loads a hook defined in hook_hook_info().');
+  }
+
+  /**
+   * Test dependency resolution.
+   */
+  function testDependencyResolution() {
+    // Enable the test module, and make sure that other modules we are testing
+    // are not already enabled. (If they were, the tests below would not work
+    // correctly.)
+    module_enable(array('module_test'), FALSE);
+    $this->assertTrue(module_exists('module_test'), 'Test module is enabled.');
+    $this->assertFalse(module_exists('forum'), 'Forum module is disabled.');
+    $this->assertFalse(module_exists('poll'), 'Poll module is disabled.');
+    $this->assertFalse(module_exists('php'), 'PHP module is disabled.');
+
+    // First, create a fake missing dependency. Forum depends on poll, which
+    // depends on a made-up module, foo. Nothing should be installed.
+    variable_set('dependency_test', 'missing dependency');
+    drupal_static_reset('system_rebuild_module_data');
+    $result = module_enable(array('forum'));
+    $this->assertFalse($result, 'module_enable() returns FALSE if dependencies are missing.');
+    $this->assertFalse(module_exists('forum'), 'module_enable() aborts if dependencies are missing.');
+
+    // Now, fix the missing dependency. Forum module depends on poll, but poll
+    // depends on the PHP module. module_enable() should work.
+    variable_set('dependency_test', 'dependency');
+    drupal_static_reset('system_rebuild_module_data');
+    $result = module_enable(array('forum'));
+    $this->assertTrue($result, 'module_enable() returns the correct value.');
+    // Verify that the fake dependency chain was installed.
+    $this->assertTrue(module_exists('poll') && module_exists('php'), 'Dependency chain was installed by module_enable().');
+    // Verify that the original module was installed.
+    $this->assertTrue(module_exists('forum'), 'Module installation with unlisted dependencies succeeded.');
+    // Finally, verify that the modules were enabled in the correct order.
+    $this->assertEqual(variable_get('test_module_enable_order', array()), array('php', 'poll', 'forum'), 'Modules were enabled in the correct order by module_enable().');
+
+    // Now, disable the PHP module. Both forum and poll should be disabled as
+    // well, in the correct order.
+    module_disable(array('php'));
+    $this->assertTrue(!module_exists('forum') && !module_exists('poll'), 'Depedency chain was disabled by module_disable().');
+    $this->assertFalse(module_exists('php'), 'Disabling a module with unlisted dependents succeeded.');
+    $this->assertEqual(variable_get('test_module_disable_order', array()), array('forum', 'poll', 'php'), 'Modules were disabled in the correct order by module_disable().');
+
+    // Disable a module that is listed as a dependency by the installation
+    // profile. Make sure that the profile itself is not on the list of
+    // dependent modules to be disabled.
+    $profile = drupal_get_profile();
+    $info = install_profile_info($profile);
+    $this->assertTrue(in_array('comment', $info['dependencies']), 'Comment module is listed as a dependency of the installation profile.');
+    $this->assertTrue(module_exists('comment'), 'Comment module is enabled.');
+    module_disable(array('comment'));
+    $this->assertFalse(module_exists('comment'), 'Comment module was disabled.');
+    $disabled_modules = variable_get('test_module_disable_order', array());
+    $this->assertTrue(in_array('comment', $disabled_modules), 'Comment module is in the list of disabled modules.');
+    $this->assertFalse(in_array($profile, $disabled_modules), 'The installation profile is not in the list of disabled modules.');
+
+    // Try to uninstall the PHP module by itself. This should be rejected,
+    // since the modules which it depends on need to be uninstalled first, and
+    // that is too destructive to perform automatically.
+    $result = drupal_uninstall_modules(array('php'));
+    $this->assertFalse($result, 'Calling drupal_uninstall_modules() on a module whose dependents are not uninstalled fails.');
+    foreach (array('forum', 'poll', 'php') as $module) {
+      $this->assertNotEqual(drupal_get_installed_schema_version($module), SCHEMA_UNINSTALLED, format_string('The @module module was not uninstalled.', array('@module' => $module)));
+    }
+
+    // Now uninstall all three modules explicitly, but in the incorrect order,
+    // and make sure that drupal_uninstal_modules() uninstalled them in the
+    // correct sequence.
+    $result = drupal_uninstall_modules(array('poll', 'php', 'forum'));
+    $this->assertTrue($result, 'drupal_uninstall_modules() returns the correct value.');
+    foreach (array('forum', 'poll', 'php') as $module) {
+      $this->assertEqual(drupal_get_installed_schema_version($module), SCHEMA_UNINSTALLED, format_string('The @module module was uninstalled.', array('@module' => $module)));
+    }
+    $this->assertEqual(variable_get('test_module_uninstall_order', array()), array('forum', 'poll', 'php'), 'Modules were uninstalled in the correct order by drupal_uninstall_modules().');
+
+    // Uninstall the profile module from above, and make sure that the profile
+    // itself is not on the list of dependent modules to be uninstalled.
+    $result = drupal_uninstall_modules(array('comment'));
+    $this->assertTrue($result, 'drupal_uninstall_modules() returns the correct value.');
+    $this->assertEqual(drupal_get_installed_schema_version('comment'), SCHEMA_UNINSTALLED, 'Comment module was uninstalled.');
+    $uninstalled_modules = variable_get('test_module_uninstall_order', array());
+    $this->assertTrue(in_array('comment', $uninstalled_modules), 'Comment module is in the list of uninstalled modules.');
+    $this->assertFalse(in_array($profile, $uninstalled_modules), 'The installation profile is not in the list of uninstalled modules.');
+
+    // Enable forum module again, which should enable both the poll module and
+    // php module. But, this time do it with poll module declaring a dependency
+    // on a specific version of php module in its info file. Make sure that
+    // module_enable() still works.
+    variable_set('dependency_test', 'version dependency');
+    drupal_static_reset('system_rebuild_module_data');
+    $result = module_enable(array('forum'));
+    $this->assertTrue($result, 'module_enable() returns the correct value.');
+    // Verify that the fake dependency chain was installed.
+    $this->assertTrue(module_exists('poll') && module_exists('php'), 'Dependency chain was installed by module_enable().');
+    // Verify that the original module was installed.
+    $this->assertTrue(module_exists('forum'), 'Module installation with version dependencies succeeded.');
+    // Finally, verify that the modules were enabled in the correct order.
+    $enable_order = variable_get('test_module_enable_order', array());
+    $php_position = array_search('php', $enable_order);
+    $poll_position = array_search('poll', $enable_order);
+    $forum_position = array_search('forum', $enable_order);
+    $php_before_poll = $php_position !== FALSE && $poll_position !== FALSE && $php_position < $poll_position;
+    $poll_before_forum = $poll_position !== FALSE && $forum_position !== FALSE && $poll_position < $forum_position;
+    $this->assertTrue($php_before_poll && $poll_before_forum, 'Modules were enabled in the correct order by module_enable().');
+  }
+}
+
+/**
+ * Unit tests for module installation.
+ */
+class ModuleInstallTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Module installation',
+      'description' => 'Tests the installation of modules.',
+      'group' => 'Module',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('module_test');
+  }
+
+  /**
+   * Test that calls to drupal_write_record() work during module installation.
+   *
+   * This is a useful function to test because modules often use it to insert
+   * initial data in their database tables when they are being installed or
+   * enabled. Furthermore, drupal_write_record() relies on the module schema
+   * information being available, so this also checks that the data from one of
+   * the module's hook implementations, in particular hook_schema(), is
+   * properly available during this time. Therefore, this test helps ensure
+   * that modules are fully functional while Drupal is installing and enabling
+   * them.
+   */
+  function testDrupalWriteRecord() {
+    // Check for data that was inserted using drupal_write_record() while the
+    // 'module_test' module was being installed and enabled.
+    $data = db_query("SELECT data FROM {module_test}")->fetchCol();
+    $this->assertTrue(in_array('Data inserted in hook_install()', $data), 'Data inserted using drupal_write_record() in hook_install() is correctly saved.');
+    $this->assertTrue(in_array('Data inserted in hook_enable()', $data), 'Data inserted using drupal_write_record() in hook_enable() is correctly saved.');
+  }
+}
+
+/**
+ * Unit tests for module uninstallation and related hooks.
+ */
+class ModuleUninstallTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Module uninstallation',
+      'description' => 'Tests the uninstallation of modules.',
+      'group' => 'Module',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('module_test', 'user');
+  }
+
+  /**
+   * Tests the hook_modules_uninstalled() of the user module.
+   */
+  function testUserPermsUninstalled() {
+    // Uninstalls the module_test module, so hook_modules_uninstalled()
+    // is executed.
+    module_disable(array('module_test'));
+    drupal_uninstall_modules(array('module_test'));
+
+    // Are the perms defined by module_test removed from {role_permission}.
+    $count = db_query("SELECT COUNT(rid) FROM {role_permission} WHERE permission = :perm", array(':perm' => 'module_test perm'))->fetchField();
+    $this->assertEqual(0, $count, 'Permissions were all removed.');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/module_test.file.inc b/htmltest/modules/simpletest/tests/module_test.file.inc
new file mode 100644
index 00000000..c0d3ec41
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/module_test.file.inc
@@ -0,0 +1,13 @@
+<?php
+
+/**
+ * @file
+ * A file to test module_implements() loading includes.
+ */
+
+/**
+ * Implements hook_test_hook().
+ */
+function module_test_test_hook() {
+  return array('module_test' => 'success!');
+}
diff --git a/htmltest/modules/simpletest/tests/module_test.info b/htmltest/modules/simpletest/tests/module_test.info
new file mode 100644
index 00000000..ee938dfa
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/module_test.info
@@ -0,0 +1,12 @@
+name = "Module test"
+description = "Support module for module system testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/module_test.install b/htmltest/modules/simpletest/tests/module_test.install
new file mode 100644
index 00000000..4cc09df5
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/module_test.install
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the module_test module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function module_test_schema() {
+  $schema['module_test'] = array(
+    'description' => 'Dummy table to test the behavior of hook_schema() during module installation.',
+    'fields' => array(
+      'data' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'An example data column for the module.',
+      ),
+    ),
+  );
+  return $schema;
+}
+
+/**
+ * Implements hook_install().
+ */
+function module_test_install() {
+  $record = array('data' => 'Data inserted in hook_install()');
+  drupal_write_record('module_test', $record);
+}
+
+/**
+ * Implements hook_enable().
+ */
+function module_test_enable() {
+  $record = array('data' => 'Data inserted in hook_enable()');
+  drupal_write_record('module_test', $record);
+}
+
diff --git a/htmltest/modules/simpletest/tests/module_test.module b/htmltest/modules/simpletest/tests/module_test.module
new file mode 100644
index 00000000..d781350b
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/module_test.module
@@ -0,0 +1,131 @@
+<?php
+
+/**
+ * Implements hook_permission().
+ */
+function module_test_permission() {
+  return array(
+    'module_test perm' => t('example perm for module_test module'),
+  );
+}
+
+/**
+ * Implements hook_system_info_alter().
+ *
+ * Manipulate module dependencies to test dependency chains.
+ */
+function module_test_system_info_alter(&$info, $file, $type) {
+  if (variable_get('dependency_test', FALSE) == 'missing dependency') {
+    if ($file->name == 'forum') {
+      // Make forum module depend on poll.
+      $info['dependencies'][] = 'poll';
+    }
+    elseif ($file->name == 'poll') {
+      // Make poll depend on a made-up module.
+      $info['dependencies'][] = 'foo';
+    }
+  }
+  elseif (variable_get('dependency_test', FALSE) == 'dependency') {
+    if ($file->name == 'forum') {
+      // Make the forum module depend on poll.
+      $info['dependencies'][] = 'poll';
+    }
+    elseif ($file->name == 'poll') {
+      // Make poll depend on php module.
+      $info['dependencies'][] = 'php';
+    }
+  }
+  elseif (variable_get('dependency_test', FALSE) == 'version dependency') {
+    if ($file->name == 'forum') {
+      // Make the forum module depend on poll.
+      $info['dependencies'][] = 'poll';
+    }
+    elseif ($file->name == 'poll') {
+      // Make poll depend on a specific version of php module.
+      $info['dependencies'][] = 'php (1.x)';
+    }
+    elseif ($file->name == 'php') {
+      // Set php module to a version compatible with the above.
+      $info['version'] = '7.x-1.0';
+    }
+  }
+  if ($file->name == 'seven' && $type == 'theme') {
+    $info['regions']['test_region'] = t('Test region');
+  }
+}
+
+/**
+ * Implements hook_hook_info().
+ */
+function module_test_hook_info() {
+  $hooks['test_hook'] = array(
+    'group' => 'file',
+  );
+  return $hooks;
+}
+
+/**
+ * Implements hook_menu().
+ */
+function module_test_menu() {
+  $items['module-test/hook-dynamic-loading-invoke'] = array(
+    'title' => 'Test hook dynamic loading (invoke)',
+    'page callback' => 'module_test_hook_dynamic_loading_invoke',
+    'access arguments' => array('access content'),
+  );
+  $items['module-test/hook-dynamic-loading-invoke-all'] = array(
+    'title' => 'Test hook dynamic loading (invoke_all)',
+    'page callback' => 'module_test_hook_dynamic_loading_invoke_all',
+    'access arguments' => array('access content'),
+  );
+  return $items;
+}
+
+/**
+ * Page callback for 'hook dynamic loading' test.
+ *
+ * If the hook is dynamically loaded correctly, the menu callback should
+ * return 'success!'.
+ */
+function module_test_hook_dynamic_loading_invoke() {
+  $result = module_invoke('module_test', 'test_hook');
+  return $result['module_test'];
+}
+
+/**
+ * Page callback for 'hook dynamic loading' test.
+ *
+ * If the hook is dynamically loaded correctly, the menu callback should
+ * return 'success!'.
+ */
+function module_test_hook_dynamic_loading_invoke_all() {
+  $result = module_invoke_all('test_hook');
+  return $result['module_test'];
+}
+
+/**
+ * Implements hook_modules_enabled().
+ */
+function module_test_modules_enabled($modules) {
+  // Record the ordered list of modules that were passed in to this hook so we
+  // can check that the modules were enabled in the correct sequence.
+  variable_set('test_module_enable_order', $modules);
+}
+
+/**
+ * Implements hook_modules_disabled().
+ */
+function module_test_modules_disabled($modules) {
+  // Record the ordered list of modules that were passed in to this hook so we
+  // can check that the modules were disabled in the correct sequence.
+  variable_set('test_module_disable_order', $modules);
+}
+
+/**
+ * Implements hook_modules_uninstalled().
+ */
+function module_test_modules_uninstalled($modules) {
+  // Record the ordered list of modules that were passed in to this hook so we
+  // can check that the modules were uninstalled in the correct sequence.
+  variable_set('test_module_uninstall_order', $modules);
+}
diff --git a/htmltest/modules/simpletest/tests/pager.test b/htmltest/modules/simpletest/tests/pager.test
new file mode 100644
index 00000000..6e8ce8e7
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/pager.test
@@ -0,0 +1,159 @@
+<?php
+
+/**
+ * @file
+ * Tests for pager functionality.
+ */
+
+/**
+ * Tests pager functionality.
+ */
+class PagerFunctionalWebTestCase extends DrupalWebTestCase {
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Pager functionality',
+      'description' => 'Tests pager functionality.',
+      'group' => 'Pager',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('dblog'));
+
+    // Insert 300 log messages.
+    for ($i = 0; $i < 300; $i++) {
+      watchdog('pager_test', $this->randomString(), NULL, WATCHDOG_DEBUG);
+    }
+
+    $this->admin_user = $this->drupalCreateUser(array(
+      'access site reports',
+    ));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Tests markup and CSS classes of pager links.
+   */
+  function testActiveClass() {
+    // Verify first page.
+    $this->drupalGet('admin/reports/dblog');
+    $current_page = 0;
+    $this->assertPagerItems($current_page);
+
+    // Verify any page but first/last.
+    $current_page++;
+    $this->drupalGet('admin/reports/dblog', array('query' => array('page' => $current_page)));
+    $this->assertPagerItems($current_page);
+
+    // Verify last page.
+    $elements = $this->xpath('//li[contains(@class, :class)]/a', array(':class' => 'pager-last'));
+    preg_match('@page=(\d+)@', $elements[0]['href'], $matches);
+    $current_page = (int) $matches[1];
+    $this->drupalGet($GLOBALS['base_root'] . $elements[0]['href'], array('external' => TRUE));
+    $this->assertPagerItems($current_page);
+  }
+
+  /**
+   * Asserts pager items and links.
+   *
+   * @param int $current_page
+   *   The current pager page the internal browser is on.
+   */
+  protected function assertPagerItems($current_page) {
+    $elements = $this->xpath('//ul[@class=:class]/li', array(':class' => 'pager'));
+    $this->assertTrue(!empty($elements), 'Pager found.');
+
+    // Make current page 1-based.
+    $current_page++;
+
+    // Extract first/previous and next/last items.
+    // first/previous only exist, if the current page is not the first.
+    if ($current_page > 1) {
+      $first = array_shift($elements);
+      $previous = array_shift($elements);
+    }
+    // next/last always exist, unless the current page is the last.
+    if ($current_page != count($elements)) {
+      $last = array_pop($elements);
+      $next = array_pop($elements);
+    }
+
+    // Verify items and links to pages.
+    foreach ($elements as $page => $element) {
+      // Make item/page index 1-based.
+      $page++;
+      if ($current_page == $page) {
+        $this->assertClass($element, 'pager-current', 'Item for current page has .pager-current class.');
+        $this->assertFalse(isset($element->a), 'Item for current page has no link.');
+      }
+      else {
+        $this->assertNoClass($element, 'pager-current', "Item for page $page has no .pager-current class.");
+        $this->assertClass($element, 'pager-item', "Item for page $page has .pager-item class.");
+        $this->assertTrue($element->a, "Link to page $page found.");
+        $this->assertNoClass($element->a, 'active', "Link to page $page is not active.");
+      }
+      unset($elements[--$page]);
+    }
+    // Verify that no other items remain untested.
+    $this->assertTrue(empty($elements), 'All expected items found.');
+
+    // Verify first/previous and next/last items and links.
+    if (isset($first)) {
+      $this->assertClass($first, 'pager-first', 'Item for first page has .pager-first class.');
+      $this->assertTrue($first->a, 'Link to first page found.');
+      $this->assertNoClass($first->a, 'active', 'Link to first page is not active.');
+    }
+    if (isset($previous)) {
+      $this->assertClass($previous, 'pager-previous', 'Item for first page has .pager-previous class.');
+      $this->assertTrue($previous->a, 'Link to previous page found.');
+      $this->assertNoClass($previous->a, 'active', 'Link to previous page is not active.');
+    }
+    if (isset($next)) {
+      $this->assertClass($next, 'pager-next', 'Item for next page has .pager-next class.');
+      $this->assertTrue($next->a, 'Link to next page found.');
+      $this->assertNoClass($next->a, 'active', 'Link to next page is not active.');
+    }
+    if (isset($last)) {
+      $this->assertClass($last, 'pager-last', 'Item for last page has .pager-last class.');
+      $this->assertTrue($last->a, 'Link to last page found.');
+      $this->assertNoClass($last->a, 'active', 'Link to last page is not active.');
+    }
+  }
+
+  /**
+   * Asserts that an element has a given class.
+   *
+   * @param SimpleXMLElement $element
+   *   The element to test.
+   * @param string $class
+   *   The class to assert.
+   * @param string $message
+   *   (optional) A verbose message to output.
+   */
+  protected function assertClass(SimpleXMLElement $element, $class, $message = NULL) {
+    if (!isset($message)) {
+      $message = "Class .$class found.";
+    }
+    $this->assertTrue(strpos($element['class'], $class) !== FALSE, $message);
+  }
+
+  /**
+   * Asserts that an element does not have a given class.
+   *
+   * @param SimpleXMLElement $element
+   *   The element to test.
+   * @param string $class
+   *   The class to assert.
+   * @param string $message
+   *   (optional) A verbose message to output.
+   */
+  protected function assertNoClass(SimpleXMLElement $element, $class, $message = NULL) {
+    if (!isset($message)) {
+      $message = "Class .$class not found.";
+    }
+    $this->assertTrue(strpos($element['class'], $class) === FALSE, $message);
+  }
+}
+
diff --git a/htmltest/modules/simpletest/tests/password.test b/htmltest/modules/simpletest/tests/password.test
new file mode 100644
index 00000000..5259d19e
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/password.test
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Provides unit tests for password.inc.
+ */
+
+/**
+ * Unit tests for password hashing API.
+ */
+class PasswordHashingTest extends DrupalWebTestCase {
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Password hashing',
+      'description' => 'Password hashing unit tests.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
+    parent::setUp();
+  }
+
+  /**
+   * Test password hashing.
+   */
+  function testPasswordHashing() {
+    // Set a log2 iteration count that is deliberately out of bounds to test
+    // that it is corrected to be within bounds.
+    variable_set('password_count_log2', 1);
+    // Set up a fake $account with a password 'baz', hashed with md5.
+    $password = 'baz';
+    $account = (object) array('name' => 'foo', 'pass' => md5($password));
+    // The md5 password should be flagged as needing an update.
+    $this->assertTrue(user_needs_new_hash($account), 'User with md5 password needs a new hash.');
+    // Re-hash the password.
+    $old_hash = $account->pass;
+    $account->pass = user_hash_password($password);
+    $this->assertIdentical(_password_get_count_log2($account->pass), DRUPAL_MIN_HASH_COUNT, 'Re-hashed password has the minimum number of log2 iterations.');
+    $this->assertTrue($account->pass != $old_hash, 'Password hash changed.');
+    $this->assertTrue(user_check_password($password, $account), 'Password check succeeds.');
+    // Since the log2 setting hasn't changed and the user has a valid password,
+    // user_needs_new_hash() should return FALSE.
+    $this->assertFalse(user_needs_new_hash($account), 'User does not need a new hash.');
+    // Increment the log2 iteration to MIN + 1.
+    variable_set('password_count_log2', DRUPAL_MIN_HASH_COUNT + 1);
+    $this->assertTrue(user_needs_new_hash($account), 'User needs a new hash after incrementing the log2 count.');
+    // Re-hash the password.
+    $old_hash = $account->pass;
+    $account->pass = user_hash_password($password);
+    $this->assertIdentical(_password_get_count_log2($account->pass), DRUPAL_MIN_HASH_COUNT + 1, 'Re-hashed password has the correct number of log2 iterations.');
+    $this->assertTrue($account->pass != $old_hash, 'Password hash changed again.');
+    // Now the hash should be OK.
+    $this->assertFalse(user_needs_new_hash($account), 'Re-hashed password does not need a new hash.');
+    $this->assertTrue(user_check_password($password, $account), 'Password check succeeds with re-hashed password.');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/path.test b/htmltest/modules/simpletest/tests/path.test
new file mode 100644
index 00000000..b8b3c93c
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/path.test
@@ -0,0 +1,381 @@
+<?php
+
+/**
+ * @file
+ * Tests for path.inc.
+ */
+
+/**
+ * Unit tests for the drupal_match_path() function in path.inc.
+ *
+ * @see drupal_match_path().
+ */
+class DrupalMatchPathTestCase extends DrupalWebTestCase {
+  protected $front;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Drupal match path',
+      'description' => 'Tests the drupal_match_path() function to make sure it works properly.',
+      'group' => 'Path API',
+    );
+  }
+
+  function setUp() {
+    // Set up the database and testing environment.
+    parent::setUp();
+
+    // Set up a random site front page to test the '<front>' placeholder.
+    $this->front = $this->randomName();
+    variable_set('site_frontpage', $this->front);
+    // Refresh our static variables from the database.
+    $this->refreshVariables();
+  }
+
+  /**
+   * Run through our test cases, making sure each one works as expected.
+   */
+  function testDrupalMatchPath() {
+    // Set up our test cases.
+    $tests = $this->drupalMatchPathTests();
+    foreach ($tests as $patterns => $cases) {
+      foreach ($cases as $path => $expected_result) {
+        $actual_result = drupal_match_path($path, $patterns);
+        $this->assertIdentical($actual_result, $expected_result, format_string('Tried matching the path <code>@path</code> to the pattern <pre>@patterns</pre> - expected @expected, got @actual.', array('@path' => $path, '@patterns' => $patterns, '@expected' => var_export($expected_result, TRUE), '@actual' => var_export($actual_result, TRUE))));
+      }
+    }
+  }
+
+  /**
+   * Helper function for testDrupalMatchPath(): set up an array of test cases.
+   *
+   * @return
+   *   An array of test cases to cycle through.
+   */
+  private function drupalMatchPathTests() {
+    return array(
+      // Single absolute paths.
+      'blog/1' => array(
+        'blog/1' => TRUE,
+        'blog/2' => FALSE,
+        'test' => FALSE,
+      ),
+      // Single paths with wildcards.
+      'blog/*' => array(
+        'blog/1' => TRUE,
+        'blog/2' => TRUE,
+        'blog/3/edit' => TRUE,
+        'blog/' => TRUE,
+        'blog' => FALSE,
+        'test' => FALSE,
+      ),
+      // Single paths with multiple wildcards.
+      'node/*/revisions/*' => array(
+        'node/1/revisions/3' => TRUE,
+        'node/345/revisions/test' => TRUE,
+        'node/23/edit' => FALSE,
+        'test' => FALSE,
+      ),
+      // Single paths with '<front>'.
+      '<front>' => array(
+        $this->front => TRUE,
+        "$this->front/" => FALSE,
+        "$this->front/edit" => FALSE,
+        'node' => FALSE,
+        '' => FALSE,
+      ),
+      // Paths with both '<front>' and wildcards (should not work).
+      '<front>/*' => array(
+        $this->front => FALSE,
+        "$this->front/" => FALSE,
+        "$this->front/edit" => FALSE,
+        'node/12' => FALSE,
+        '' => FALSE,
+      ),
+      // Multiple paths with the \n delimiter.
+      "node/*\nnode/*/edit" => array(
+        'node/1' => TRUE,
+        'node/view' => TRUE,
+        'node/32/edit' => TRUE,
+        'node/delete/edit' => TRUE,
+        'node/50/delete' => TRUE,
+        'test/example' => FALSE,
+      ),
+      // Multiple paths with the \r delimiter.
+      "user/*\rblog/*" => array(
+        'user/1' => TRUE,
+        'blog/1' => TRUE,
+        'user/1/blog/1' => TRUE,
+        'user/blog' => TRUE,
+        'test/example' => FALSE,
+        'user' => FALSE,
+        'blog' => FALSE,
+      ),
+      // Multiple paths with the \r\n delimiter.
+      "test\r\n<front>" => array(
+        'test' => TRUE,
+        $this->front => TRUE,
+        'example' => FALSE,
+      ),
+      // Test existing regular expressions (should be escaped).
+      '[^/]+?/[0-9]' => array(
+        'test/1' => FALSE,
+        '[^/]+?/[0-9]' => TRUE,
+      ),
+    );
+  }
+}
+
+/**
+ * Tests hook_url_alter functions.
+ */
+class UrlAlterFunctionalTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => t('URL altering'),
+      'description' => t('Tests hook_url_inbound_alter() and hook_url_outbound_alter().'),
+      'group' => t('Path API'),
+    );
+  }
+
+  function setUp() {
+    parent::setUp('path', 'forum', 'url_alter_test');
+  }
+
+  /**
+   * Test that URL altering works and that it occurs in the correct order.
+   */
+  function testUrlAlter() {
+    $account = $this->drupalCreateUser(array('administer url aliases'));
+    $this->drupalLogin($account);
+
+    $uid = $account->uid;
+    $name = $account->name;
+
+    // Test a single altered path.
+    $this->assertUrlInboundAlter("user/$name", "user/$uid");
+    $this->assertUrlOutboundAlter("user/$uid", "user/$name");
+
+    // Test that a path always uses its alias.
+    $path = array('source' => "user/$uid/test1", 'alias' => 'alias/test1');
+    path_save($path);
+    $this->assertUrlInboundAlter('alias/test1', "user/$uid/test1");
+    $this->assertUrlOutboundAlter("user/$uid/test1", 'alias/test1');
+
+    // Test that alias source paths are normalized in the interface.
+    $edit = array('source' => "user/$name/edit", 'alias' => 'alias/test2');
+    $this->drupalPost('admin/config/search/path/add', $edit, t('Save'));
+    $this->assertText(t('The alias has been saved.'));
+
+    // Test that a path always uses its alias.
+    $this->assertUrlInboundAlter('alias/test2', "user/$uid/edit");
+    $this->assertUrlOutboundAlter("user/$uid/edit", 'alias/test2');
+
+    // Test a non-existent user is not altered.
+    $uid++;
+    $this->assertUrlInboundAlter("user/$uid", "user/$uid");
+    $this->assertUrlOutboundAlter("user/$uid", "user/$uid");
+
+    // Test that 'forum' is altered to 'community' correctly, both at the root
+    // level and for a specific existing forum.
+    $this->assertUrlInboundAlter('community', 'forum');
+    $this->assertUrlOutboundAlter('forum', 'community');
+    $forum_vid = db_query("SELECT vid FROM {taxonomy_vocabulary} WHERE module = 'forum'")->fetchField();
+    $tid = db_insert('taxonomy_term_data')
+      ->fields(array(
+        'name' => $this->randomName(),
+        'vid' => $forum_vid,
+      ))
+      ->execute();
+    $this->assertUrlInboundAlter("community/$tid", "forum/$tid");
+    $this->assertUrlOutboundAlter("forum/$tid", "community/$tid");
+  }
+
+  /**
+   * Test current_path() and request_path().
+   */
+  function testCurrentUrlRequestedPath() {
+    $this->drupalGet('url-alter-test/bar');
+    $this->assertRaw('request_path=url-alter-test/bar', 'request_path() returns the requested path.');
+    $this->assertRaw('current_path=url-alter-test/foo', 'current_path() returns the internal path.');
+  }
+
+  /**
+   * Tests that $_GET['q'] is initialized when the request path is empty.
+   */
+  function testGetQInitialized() {
+    $this->drupalGet('');
+    $this->assertText("\$_GET['q'] is non-empty with an empty request path.", "\$_GET['q'] is initialized with an empty request path.");
+  }
+
+  /**
+   * Assert that an outbound path is altered to an expected value.
+   *
+   * @param $original
+   *   A string with the original path that is run through url().
+   * @param $final
+   *   A string with the expected result after url().
+   * @return
+   *   TRUE if $original was correctly altered to $final, FALSE otherwise.
+   */
+  protected function assertUrlOutboundAlter($original, $final) {
+    // Test outbound altering.
+    $result = url($original);
+    $base_path = base_path() . (variable_get('clean_url', '0') ? '' : '?q=');
+    $result = substr($result, strlen($base_path));
+    $this->assertIdentical($result, $final, format_string('Altered outbound URL %original, expected %final, and got %result.', array('%original' => $original, '%final' => $final, '%result' => $result)));
+  }
+
+  /**
+   * Assert that a inbound path is altered to an expected value.
+   *
+   * @param $original
+   *   A string with the aliased or un-normal path that is run through
+   *   drupal_get_normal_path().
+   * @param $final
+   *   A string with the expected result after url().
+   * @return
+   *   TRUE if $original was correctly altered to $final, FALSE otherwise.
+   */
+  protected function assertUrlInboundAlter($original, $final) {
+    // Test inbound altering.
+    $result = drupal_get_normal_path($original);
+    $this->assertIdentical($result, $final, format_string('Altered inbound URL %original, expected %final, and got %result.', array('%original' => $original, '%final' => $final, '%result' => $result)));
+  }
+}
+
+/**
+ * Unit test for drupal_lookup_path().
+ */
+class PathLookupTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => t('Path lookup'),
+      'description' => t('Tests that drupal_lookup_path() returns correct paths.'),
+      'group' => t('Path API'),
+    );
+  }
+
+  /**
+   * Test that drupal_lookup_path() returns the correct path.
+   */
+  function testDrupalLookupPath() {
+    $account = $this->drupalCreateUser();
+    $uid = $account->uid;
+    $name = $account->name;
+
+    // Test the situation where the source is the same for multiple aliases.
+    // Start with a language-neutral alias, which we will override.
+    $path = array(
+      'source' => "user/$uid",
+      'alias' => 'foo',
+    );
+    path_save($path);
+    $this->assertEqual(drupal_lookup_path('alias', $path['source']), $path['alias'], 'Basic alias lookup works.');
+    $this->assertEqual(drupal_lookup_path('source', $path['alias']), $path['source'], 'Basic source lookup works.');
+
+    // Create a language specific alias for the default language (English).
+    $path = array(
+      'source' => "user/$uid",
+      'alias' => "users/$name",
+      'language' => 'en',
+    );
+    path_save($path);
+    $this->assertEqual(drupal_lookup_path('alias', $path['source']), $path['alias'], 'English alias overrides language-neutral alias.');
+    $this->assertEqual(drupal_lookup_path('source', $path['alias']), $path['source'], 'English source overrides language-neutral source.');
+
+    // Create a language-neutral alias for the same path, again.
+    $path = array(
+      'source' => "user/$uid",
+      'alias' => 'bar',
+    );
+    path_save($path);
+    $this->assertEqual(drupal_lookup_path('alias', $path['source']), "users/$name", 'English alias still returned after entering a language-neutral alias.');
+
+    // Create a language-specific (xx-lolspeak) alias for the same path.
+    $path = array(
+      'source' => "user/$uid",
+      'alias' => 'LOL',
+      'language' => 'xx-lolspeak',
+    );
+    path_save($path);
+    $this->assertEqual(drupal_lookup_path('alias', $path['source']), "users/$name", 'English alias still returned after entering a LOLspeak alias.');
+    // The LOLspeak alias should be returned if we really want LOLspeak.
+    $this->assertEqual(drupal_lookup_path('alias', $path['source'], 'xx-lolspeak'), 'LOL', 'LOLspeak alias returned if we specify xx-lolspeak to drupal_lookup_path().');
+
+    // Create a new alias for this path in English, which should override the
+    // previous alias for "user/$uid".
+    $path = array(
+      'source' => "user/$uid",
+      'alias' => 'users/my-new-path',
+      'language' => 'en',
+    );
+    path_save($path);
+    $this->assertEqual(drupal_lookup_path('alias', $path['source']), $path['alias'], 'Recently created English alias returned.');
+    $this->assertEqual(drupal_lookup_path('source', $path['alias']), $path['source'], 'Recently created English source returned.');
+
+    // Remove the English aliases, which should cause a fallback to the most
+    // recently created language-neutral alias, 'bar'.
+    db_delete('url_alias')
+      ->condition('language', 'en')
+      ->execute();
+    drupal_clear_path_cache();
+    $this->assertEqual(drupal_lookup_path('alias', $path['source']), 'bar', 'Path lookup falls back to recently created language-neutral alias.');
+
+    // Test the situation where the alias and language are the same, but
+    // the source differs. The newer alias record should be returned.
+    $account2 = $this->drupalCreateUser();
+    $path = array(
+      'source' => 'user/' . $account2->uid,
+      'alias' => 'bar',
+    );
+    path_save($path);
+    $this->assertEqual(drupal_lookup_path('source', $path['alias']), $path['source'], 'Newer alias record is returned when comparing two LANGUAGE_NONE paths with the same alias.');
+  }
+}
+
+/**
+ * Tests the path_save() function.
+ */
+class PathSaveTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => t('Path save'),
+      'description' => t('Tests that path_save() exposes the previous alias value.'),
+      'group' => t('Path API'),
+    );
+  }
+
+  function setUp() {
+    // Enable a helper module that implements hook_path_update().
+    parent::setUp('path_test');
+    path_test_reset();
+  }
+
+  /**
+   * Tests that path_save() makes the original path available to modules.
+   */
+  function testDrupalSaveOriginalPath() {
+    $account = $this->drupalCreateUser();
+    $uid = $account->uid;
+    $name = $account->name;
+
+    // Create a language-neutral alias.
+    $path = array(
+      'source' => "user/$uid",
+      'alias' => 'foo',
+    );
+    $path_original = $path;
+    path_save($path);
+
+    // Alter the path.
+    $path['alias'] = 'bar';
+    path_save($path);
+
+    // Test to see if the original alias is available to modules during
+    // hook_path_update().
+    $results = variable_get('path_test_results', array());
+    $this->assertIdentical($results['hook_path_update']['original']['alias'], $path_original['alias'], 'Old path alias available to modules during hook_path_update.');
+    $this->assertIdentical($results['hook_path_update']['original']['source'], $path_original['source'], 'Old path alias available to modules during hook_path_update.');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/path_test.info b/htmltest/modules/simpletest/tests/path_test.info
new file mode 100644
index 00000000..d10eee68
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/path_test.info
@@ -0,0 +1,12 @@
+name = "Hook path tests"
+description = "Support module for path hook testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/path_test.module b/htmltest/modules/simpletest/tests/path_test.module
new file mode 100644
index 00000000..d3dc80e2
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/path_test.module
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @file
+ * Helper module for the path tests.
+ */
+
+/**
+ * Resets the path test results.
+ */
+function path_test_reset() {
+  variable_set('path_test_results', array());
+}
+
+/**
+ * Implements hook_path_update().
+ */
+function path_test_path_update($path) {
+  $results = variable_get('path_test_results', array());
+  $results['hook_path_update'] = $path;
+  variable_set('path_test_results', $results);
+}
+
diff --git a/htmltest/modules/simpletest/tests/psr_0_test/lib/Drupal/psr_0_test/Tests/ExampleTest.php b/htmltest/modules/simpletest/tests/psr_0_test/lib/Drupal/psr_0_test/Tests/ExampleTest.php
new file mode 100644
index 00000000..3098c925
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/psr_0_test/lib/Drupal/psr_0_test/Tests/ExampleTest.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Drupal\psr_0_test\Tests;
+
+class ExampleTest extends \DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'PSR0 example test: PSR-0 in disabled modules.',
+      'description' => 'We want to assert that this test case is being discovered.',
+      'group' => 'SimpleTest',
+    );
+  }
+
+  function testArithmetics() {
+    $this->assert(1 + 1 == 2, '1 + 1 == 2');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/psr_0_test/lib/Drupal/psr_0_test/Tests/Nested/NestedExampleTest.php b/htmltest/modules/simpletest/tests/psr_0_test/lib/Drupal/psr_0_test/Tests/Nested/NestedExampleTest.php
new file mode 100644
index 00000000..324ed439
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/psr_0_test/lib/Drupal/psr_0_test/Tests/Nested/NestedExampleTest.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Drupal\psr_0_test\Tests\Nested;
+
+class NestedExampleTest extends \DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'PSR0 example test: PSR-0 in nested subfolders.',
+      'description' => 'We want to assert that this PSR-0 test case is being discovered.',
+      'group' => 'SimpleTest',
+    );
+  }
+
+  function testArithmetics() {
+    $this->assert(1 + 1 == 2, '1 + 1 == 2');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/psr_0_test/psr_0_test.info b/htmltest/modules/simpletest/tests/psr_0_test/psr_0_test.info
new file mode 100644
index 00000000..472f2c26
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/psr_0_test/psr_0_test.info
@@ -0,0 +1,12 @@
+name = PSR-0 Test cases
+description = Test classes to be discovered by simpletest.
+core = 7.x
+
+hidden = TRUE
+package = Testing
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/psr_0_test/psr_0_test.module b/htmltest/modules/simpletest/tests/psr_0_test/psr_0_test.module
new file mode 100644
index 00000000..b3d9bbc7
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/psr_0_test/psr_0_test.module
@@ -0,0 +1 @@
+<?php
diff --git a/htmltest/modules/simpletest/tests/registry.test b/htmltest/modules/simpletest/tests/registry.test
new file mode 100644
index 00000000..bcd8d4e0
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/registry.test
@@ -0,0 +1,142 @@
+<?php
+
+class RegistryParseFileTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Registry parse file test',
+      'description' => 'Parse a simple file and check that its resources are saved to the database.',
+      'group' => 'System'
+    );
+  }
+
+  function setUp() {
+    $chrs = hash('sha256', microtime() . mt_rand());
+    $this->fileName = 'registry_test_' . substr($chrs, 0, 16);
+    $this->className = 'registry_test_class' . substr($chrs, 16, 16);
+    $this->interfaceName = 'registry_test_interface' . substr($chrs, 32, 16);
+    parent::setUp();
+  }
+
+  /**
+   * testRegistryParseFile
+   */
+  function testRegistryParseFile() {
+    _registry_parse_file($this->fileName, $this->getFileContents());
+    foreach (array('className', 'interfaceName') as $resource) {
+      $foundName = db_query('SELECT name FROM {registry} WHERE name = :name', array(':name' => $this->$resource))->fetchField();
+      $this->assertTrue($this->$resource == $foundName, t('Resource "@resource" found.', array('@resource' => $this->$resource)));
+    }
+  }
+
+  /**
+   * getFileContents
+   */
+  function getFileContents() {
+    $file_contents = <<<CONTENTS
+<?php
+
+class {$this->className} {}
+
+interface {$this->interfaceName} {}
+
+CONTENTS;
+    return $file_contents;
+  }
+
+}
+
+class RegistryParseFilesTestCase extends DrupalWebTestCase {
+  protected $fileTypes = array('new', 'existing_changed');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Registry parse files test',
+      'description' => 'Read two a simple files from disc, and check that their resources are saved to the database.',
+      'group' => 'System'
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    // Create files with some php to parse - one 'new', one 'existing' so
+    // we test all the important code paths in _registry_parse_files.
+    foreach ($this->fileTypes as $fileType) {
+      $chrs = hash('sha256', microtime() . mt_rand());
+      $this->$fileType = new stdClass();
+      $this->$fileType->fileName = 'public://registry_test_' . substr($chrs, 0, 16);
+      $this->$fileType->className = 'registry_test_class' . substr($chrs, 16, 16);
+      $this->$fileType->interfaceName = 'registry_test_interface' . substr($chrs, 32, 16);
+      $this->$fileType->contents = $this->getFileContents($fileType);
+      file_save_data($this->$fileType->contents, $this->$fileType->fileName);
+
+      if ($fileType == 'existing_changed') {
+        // Add a record with an incorrect hash.
+        $this->$fileType->fakeHash = hash('sha256', mt_rand());
+        db_insert('registry_file')
+          ->fields(array(
+            'hash' => $this->$fileType->fakeHash,
+            'filename' => $this->$fileType->fileName,
+          ))
+          ->execute();
+
+        // Insert some fake resource records.
+        foreach (array('class', 'interface') as $type) {
+          db_insert('registry')
+            ->fields(array(
+              'name' => $type . hash('sha256', microtime() . mt_rand()),
+              'type' => $type,
+              'filename' => $this->$fileType->fileName,
+            ))
+            ->execute();
+        }
+      }
+    }
+  }
+
+  /**
+   * testRegistryParseFiles
+   */
+  function testRegistryParseFiles() {
+    _registry_parse_files($this->getFiles());
+    foreach ($this->fileTypes as $fileType) {
+      // Test that we have all the right resources.
+      foreach (array('className', 'interfaceName') as $resource) {
+        $foundName = db_query('SELECT name FROM {registry} WHERE name = :name', array(':name' => $this->$fileType->$resource))->fetchField();
+        $this->assertTrue($this->$fileType->$resource == $foundName, t('Resource "@resource" found.', array('@resource' => $this->$fileType->$resource)));
+      }
+      // Test that we have the right hash.
+      $hash = db_query('SELECT hash FROM {registry_file} WHERE filename = :filename', array(':filename' => $this->$fileType->fileName))->fetchField();
+      $this->assertTrue(hash('sha256', $this->$fileType->contents) == $hash, t('sha-256 for "@filename" matched.' . $fileType . $hash, array('@filename' => $this->$fileType->fileName)));
+    }
+  }
+
+  /**
+   * getFiles
+   */
+  function getFiles() {
+    $files = array();
+    foreach ($this->fileTypes as $fileType) {
+      $files[$this->$fileType->fileName] = array('module' => '', 'weight' => 0);
+      if ($fileType == 'existing_changed') {
+        $files[$this->$fileType->fileName]['hash'] = $this->$fileType->fakeHash;
+      }
+    }
+    return $files;
+  }
+
+  /**
+   * getFileContents
+   */
+  function getFileContents($fileType) {
+    $file_contents = <<<CONTENTS
+<?php
+
+class {$this->$fileType->className} {}
+
+interface {$this->$fileType->interfaceName} {}
+
+CONTENTS;
+    return $file_contents;
+  }
+
+}
diff --git a/htmltest/modules/simpletest/tests/requirements1_test.info b/htmltest/modules/simpletest/tests/requirements1_test.info
new file mode 100644
index 00000000..82e60596
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/requirements1_test.info
@@ -0,0 +1,12 @@
+name = Requirements 1 Test
+description = "Tests that a module is not installed when it fails hook_requirements('install')."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/requirements1_test.install b/htmltest/modules/simpletest/tests/requirements1_test.install
new file mode 100644
index 00000000..91caca3f
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/requirements1_test.install
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * Implements hook_requirements().
+ */
+function requirements1_test_requirements($phase) {
+  $requirements = array();
+  // Ensure translations don't break during installation.
+  $t = get_t();
+
+  // Always fails requirements.
+  if ('install' == $phase) {
+    $requirements['requirements1_test'] = array(
+      'title' => $t('Requirements 1 Test'),
+      'severity' => REQUIREMENT_ERROR,
+      'description' => $t('Requirements 1 Test failed requirements.'),
+    );
+  }
+
+  return $requirements;
+}
diff --git a/htmltest/modules/simpletest/tests/requirements1_test.module b/htmltest/modules/simpletest/tests/requirements1_test.module
new file mode 100644
index 00000000..e52266b2
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/requirements1_test.module
@@ -0,0 +1,7 @@
+<?php
+
+/**
+ * @file
+ * Tests that a module is not installed when it fails
+ * hook_requirements('install').
+ */
diff --git a/htmltest/modules/simpletest/tests/requirements2_test.info b/htmltest/modules/simpletest/tests/requirements2_test.info
new file mode 100644
index 00000000..e4aace1b
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/requirements2_test.info
@@ -0,0 +1,14 @@
+name = Requirements 2 Test
+description = "Tests that a module is not installed when the one it depends on fails hook_requirements('install)."
+dependencies[] = requirements1_test
+dependencies[] = comment
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/requirements2_test.module b/htmltest/modules/simpletest/tests/requirements2_test.module
new file mode 100644
index 00000000..a4f43051
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/requirements2_test.module
@@ -0,0 +1,7 @@
+<?php
+
+/**
+ * @file
+ * Tests that a module is not installed when the one it depends on fails
+ * hook_requirements('install').
+ */
diff --git a/htmltest/modules/simpletest/tests/schema.test b/htmltest/modules/simpletest/tests/schema.test
new file mode 100644
index 00000000..41994284
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/schema.test
@@ -0,0 +1,384 @@
+<?php
+
+/**
+ * @file
+ * Tests for the Database Schema API.
+ */
+
+/**
+ * Unit tests for the Schema API.
+ */
+class SchemaTestCase extends DrupalWebTestCase {
+  /**
+   * A global counter for table and field creation.
+   */
+  var $counter;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Schema API',
+      'description' => 'Tests table creation and modification via the schema API.',
+      'group' => 'Database',
+    );
+  }
+
+  /**
+   *
+   */
+  function testSchema() {
+    // Try creating a table.
+    $table_specification = array(
+      'description' => 'Schema table description.',
+      'fields' => array(
+        'id'  => array(
+          'type' => 'int',
+          'default' => NULL,
+        ),
+        'test_field'  => array(
+          'type' => 'int',
+          'not null' => TRUE,
+          'description' => 'Schema column description.',
+        ),
+      ),
+    );
+    db_create_table('test_table', $table_specification);
+
+    // Assert that the table exists.
+    $this->assertTrue(db_table_exists('test_table'), 'The table exists.');
+
+    // Assert that the table comment has been set.
+    $this->checkSchemaComment($table_specification['description'], 'test_table');
+
+    // Assert that the column comment has been set.
+    $this->checkSchemaComment($table_specification['fields']['test_field']['description'], 'test_table', 'test_field');
+
+    // An insert without a value for the column 'test_table' should fail.
+    $this->assertFalse($this->tryInsert(), 'Insert without a default failed.');
+
+    // Add a default value to the column.
+    db_field_set_default('test_table', 'test_field', 0);
+    // The insert should now succeed.
+    $this->assertTrue($this->tryInsert(), 'Insert with a default succeeded.');
+
+    // Remove the default.
+    db_field_set_no_default('test_table', 'test_field');
+    // The insert should fail again.
+    $this->assertFalse($this->tryInsert(), 'Insert without a default failed.');
+
+    // Test for fake index and test for the boolean result of indexExists().
+    $index_exists = Database::getConnection()->schema()->indexExists('test_table', 'test_field');
+    $this->assertIdentical($index_exists, FALSE, 'Fake index does not exists');
+    // Add index.
+    db_add_index('test_table', 'test_field', array('test_field'));
+    // Test for created index and test for the boolean result of indexExists().
+    $index_exists = Database::getConnection()->schema()->indexExists('test_table', 'test_field');
+    $this->assertIdentical($index_exists, TRUE, 'Index created.');
+
+    // Rename the table.
+    db_rename_table('test_table', 'test_table2');
+
+    // Index should be renamed.
+    $index_exists = Database::getConnection()->schema()->indexExists('test_table2', 'test_field');
+    $this->assertTrue($index_exists, 'Index was renamed.');
+
+    // We need the default so that we can insert after the rename.
+    db_field_set_default('test_table2', 'test_field', 0);
+    $this->assertFalse($this->tryInsert(), 'Insert into the old table failed.');
+    $this->assertTrue($this->tryInsert('test_table2'), 'Insert into the new table succeeded.');
+
+    // We should have successfully inserted exactly two rows.
+    $count = db_query('SELECT COUNT(*) FROM {test_table2}')->fetchField();
+    $this->assertEqual($count, 2, 'Two fields were successfully inserted.');
+
+    // Try to drop the table.
+    db_drop_table('test_table2');
+    $this->assertFalse(db_table_exists('test_table2'), 'The dropped table does not exist.');
+
+    // Recreate the table.
+    db_create_table('test_table', $table_specification);
+    db_field_set_default('test_table', 'test_field', 0);
+    db_add_field('test_table', 'test_serial', array('type' => 'int', 'not null' => TRUE, 'default' => 0, 'description' => 'Added column description.'));
+
+    // Assert that the column comment has been set.
+    $this->checkSchemaComment('Added column description.', 'test_table', 'test_serial');
+
+    // Change the new field to a serial column.
+    db_change_field('test_table', 'test_serial', 'test_serial', array('type' => 'serial', 'not null' => TRUE, 'description' => 'Changed column description.'), array('primary key' => array('test_serial')));
+
+    // Assert that the column comment has been set.
+    $this->checkSchemaComment('Changed column description.', 'test_table', 'test_serial');
+
+    $this->assertTrue($this->tryInsert(), 'Insert with a serial succeeded.');
+    $max1 = db_query('SELECT MAX(test_serial) FROM {test_table}')->fetchField();
+    $this->assertTrue($this->tryInsert(), 'Insert with a serial succeeded.');
+    $max2 = db_query('SELECT MAX(test_serial) FROM {test_table}')->fetchField();
+    $this->assertTrue($max2 > $max1, 'The serial is monotone.');
+
+    $count = db_query('SELECT COUNT(*) FROM {test_table}')->fetchField();
+    $this->assertEqual($count, 2, 'There were two rows.');
+
+    // Use database specific data type and ensure that table is created.
+    $table_specification = array(
+      'description' => 'Schema table description.',
+      'fields' => array(
+        'timestamp'  => array(
+          'mysql_type' => 'timestamp',
+          'pgsql_type' => 'timestamp',
+          'sqlite_type' => 'datetime',
+          'not null' => FALSE,
+          'default' => NULL,
+        ),
+      ),
+    );
+    try {
+      db_create_table('test_timestamp', $table_specification);
+    }
+    catch (Exception $e) {}
+    $this->assertTrue(db_table_exists('test_timestamp'), 'Table with database specific datatype was created.');
+  }
+
+  function tryInsert($table = 'test_table') {
+    try {
+       db_insert($table)
+         ->fields(array('id' => mt_rand(10, 20)))
+         ->execute();
+      return TRUE;
+    }
+    catch (Exception $e) {
+      return FALSE;
+    }
+  }
+
+  /**
+   * Checks that a table or column comment matches a given description.
+   *
+   * @param $description
+   *   The asserted description.
+   * @param $table
+   *   The table to test.
+   * @param $column
+   *   Optional column to test.
+   */
+  function checkSchemaComment($description, $table, $column = NULL) {
+    if (method_exists(Database::getConnection()->schema(), 'getComment')) {
+      $comment = Database::getConnection()->schema()->getComment($table, $column);
+      $this->assertEqual($comment, $description, 'The comment matches the schema description.');
+    }
+  }
+
+  /**
+   * Tests creating unsigned columns and data integrity thereof.
+   */
+  function testUnsignedColumns() {
+    // First create the table with just a serial column.
+    $table_name = 'unsigned_table';
+    $table_spec = array(
+      'fields' => array('serial_column' => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE)),
+      'primary key' => array('serial_column'),
+    );
+    $ret = array();
+    db_create_table($table_name, $table_spec);
+
+    // Now set up columns for the other types.
+    $types = array('int', 'float', 'numeric');
+    foreach ($types as $type) {
+      $column_spec = array('type' => $type, 'unsigned'=> TRUE);
+      if ($type == 'numeric') {
+        $column_spec += array('precision' => 10, 'scale' => 0);
+      }
+      $column_name = $type . '_column';
+      $table_spec['fields'][$column_name] = $column_spec;
+      db_add_field($table_name, $column_name, $column_spec);
+    }
+
+    // Finally, check each column and try to insert invalid values into them.
+    foreach ($table_spec['fields'] as $column_name => $column_spec) {
+      $this->assertTrue(db_field_exists($table_name, $column_name), format_string('Unsigned @type column was created.', array('@type' => $column_spec['type'])));
+      $this->assertFalse($this->tryUnsignedInsert($table_name, $column_name), format_string('Unsigned @type column rejected a negative value.', array('@type' => $column_spec['type'])));
+    }
+  }
+
+  /**
+   * Tries to insert a negative value into columns defined as unsigned.
+   *
+   * @param $table_name
+   *   The table to insert
+   * @param $column_name
+   *   The column to insert
+   * @return
+   *   TRUE if the insert succeeded, FALSE otherwise
+   */
+  function tryUnsignedInsert($table_name, $column_name) {
+    try {
+      db_insert($table_name)
+         ->fields(array($column_name => -1))
+         ->execute();
+      return TRUE;
+    }
+    catch (Exception $e) {
+      return FALSE;
+    }
+  }
+
+  /**
+   * Test adding columns to an existing table.
+   */
+  function testSchemaAddField() {
+    // Test varchar types.
+    foreach (array(1, 32, 128, 256, 512) as $length) {
+      $base_field_spec = array(
+        'type' => 'varchar',
+        'length' => $length,
+      );
+      $variations = array(
+        array('not null' => FALSE),
+        array('not null' => FALSE, 'default' => '7'),
+        array('not null' => TRUE, 'initial' => 'd'),
+        array('not null' => TRUE, 'initial' => 'd', 'default' => '7'),
+      );
+
+      foreach ($variations as $variation) {
+        $field_spec = $variation + $base_field_spec;
+        $this->assertFieldAdditionRemoval($field_spec);
+      }
+    }
+
+    // Test int and float types.
+    foreach (array('int', 'float') as $type) {
+      foreach (array('tiny', 'small', 'medium', 'normal', 'big') as $size) {
+        $base_field_spec = array(
+          'type' => $type,
+          'size' => $size,
+        );
+        $variations = array(
+          array('not null' => FALSE),
+          array('not null' => FALSE, 'default' => 7),
+          array('not null' => TRUE, 'initial' => 1),
+          array('not null' => TRUE, 'initial' => 1, 'default' => 7),
+        );
+
+        foreach ($variations as $variation) {
+          $field_spec = $variation + $base_field_spec;
+          $this->assertFieldAdditionRemoval($field_spec);
+        }
+      }
+    }
+
+    // Test numeric types.
+    foreach (array(1, 5, 10, 40, 65) as $precision) {
+      foreach (array(0, 2, 10, 30) as $scale) {
+        if ($precision <= $scale) {
+          // Precision must be smaller then scale.
+          continue;
+        }
+
+        $base_field_spec = array(
+          'type' => 'numeric',
+          'scale' => $scale,
+          'precision' => $precision,
+        );
+        $variations = array(
+          array('not null' => FALSE),
+          array('not null' => FALSE, 'default' => 7),
+          array('not null' => TRUE, 'initial' => 1),
+          array('not null' => TRUE, 'initial' => 1, 'default' => 7),
+        );
+
+        foreach ($variations as $variation) {
+          $field_spec = $variation + $base_field_spec;
+          $this->assertFieldAdditionRemoval($field_spec);
+        }
+      }
+    }
+  }
+
+  /**
+   * Assert that a given field can be added and removed from a table.
+   *
+   * The addition test covers both defining a field of a given specification
+   * when initially creating at table and extending an existing table.
+   *
+   * @param $field_spec
+   *   The schema specification of the field.
+   */
+  protected function assertFieldAdditionRemoval($field_spec) {
+    // Try creating the field on a new table.
+    $table_name = 'test_table_' . ($this->counter++);
+    $table_spec = array(
+      'fields' => array(
+        'serial_column' => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE),
+        'test_field' => $field_spec,
+      ),
+      'primary key' => array('serial_column'),
+    );
+    db_create_table($table_name, $table_spec);
+    $this->pass(format_string('Table %table created.', array('%table' => $table_name)));
+
+    // Check the characteristics of the field.
+    $this->assertFieldCharacteristics($table_name, 'test_field', $field_spec);
+
+    // Clean-up.
+    db_drop_table($table_name);
+
+    // Try adding a field to an existing table.
+    $table_name = 'test_table_' . ($this->counter++);
+    $table_spec = array(
+      'fields' => array(
+        'serial_column' => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE),
+      ),
+      'primary key' => array('serial_column'),
+    );
+    db_create_table($table_name, $table_spec);
+    $this->pass(format_string('Table %table created.', array('%table' => $table_name)));
+
+    // Insert some rows to the table to test the handling of initial values.
+    for ($i = 0; $i < 3; $i++) {
+      db_insert($table_name)
+        ->useDefaults(array('serial_column'))
+        ->execute();
+    }
+
+    db_add_field($table_name, 'test_field', $field_spec);
+    $this->pass(format_string('Column %column created.', array('%column' => 'test_field')));
+
+    // Check the characteristics of the field.
+    $this->assertFieldCharacteristics($table_name, 'test_field', $field_spec);
+
+    // Clean-up.
+    db_drop_field($table_name, 'test_field');
+    db_drop_table($table_name);
+  }
+
+  /**
+   * Assert that a newly added field has the correct characteristics.
+   */
+  protected function assertFieldCharacteristics($table_name, $field_name, $field_spec) {
+    // Check that the initial value has been registered.
+    if (isset($field_spec['initial'])) {
+      // There should be no row with a value different then $field_spec['initial'].
+      $count = db_select($table_name)
+        ->fields($table_name, array('serial_column'))
+        ->condition($field_name, $field_spec['initial'], '<>')
+        ->countQuery()
+        ->execute()
+        ->fetchField();
+      $this->assertEqual($count, 0, 'Initial values filled out.');
+    }
+
+    // Check that the default value has been registered.
+    if (isset($field_spec['default'])) {
+      // Try inserting a row, and check the resulting value of the new column.
+      $id = db_insert($table_name)
+        ->useDefaults(array('serial_column'))
+        ->execute();
+      $field_value = db_select($table_name)
+        ->fields($table_name, array($field_name))
+        ->condition('serial_column', $id)
+        ->execute()
+        ->fetchField();
+      $this->assertEqual($field_value, $field_spec['default'], 'Default value registered.');
+    }
+
+    db_drop_field($table_name, $field_name);
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/session.test b/htmltest/modules/simpletest/tests/session.test
new file mode 100644
index 00000000..097503b6
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/session.test
@@ -0,0 +1,530 @@
+<?php
+
+/**
+ * @file
+ * Provides SimpleTests for core session handling functionality.
+ */
+
+class SessionTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Session tests',
+      'description' => 'Drupal session handling tests.',
+      'group' => 'Session'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('session_test');
+  }
+
+  /**
+   * Tests for drupal_save_session() and drupal_session_regenerate().
+   */
+  function testSessionSaveRegenerate() {
+    $this->assertFalse(drupal_save_session(), 'drupal_save_session() correctly returns FALSE (inside of testing framework) when initially called with no arguments.', 'Session');
+    $this->assertFalse(drupal_save_session(FALSE), 'drupal_save_session() correctly returns FALSE when called with FALSE.', 'Session');
+    $this->assertFalse(drupal_save_session(), 'drupal_save_session() correctly returns FALSE when saving has been disabled.', 'Session');
+    $this->assertTrue(drupal_save_session(TRUE), 'drupal_save_session() correctly returns TRUE when called with TRUE.', 'Session');
+    $this->assertTrue(drupal_save_session(), 'drupal_save_session() correctly returns TRUE when saving has been enabled.', 'Session');
+
+    // Test session hardening code from SA-2008-044.
+    $user = $this->drupalCreateUser(array('access content'));
+
+    // Enable sessions.
+    $this->sessionReset($user->uid);
+
+    // Make sure the session cookie is set as HttpOnly.
+    $this->drupalLogin($user);
+    $this->assertTrue(preg_match('/HttpOnly/i', $this->drupalGetHeader('Set-Cookie', TRUE)), 'Session cookie is set as HttpOnly.');
+    $this->drupalLogout();
+
+    // Verify that the session is regenerated if a module calls exit
+    // in hook_user_login().
+    user_save($user, array('name' => 'session_test_user'));
+    $user->name = 'session_test_user';
+    $this->drupalGet('session-test/id');
+    $matches = array();
+    preg_match('/\s*session_id:(.*)\n/', $this->drupalGetContent(), $matches);
+    $this->assertTrue(!empty($matches[1]) , 'Found session ID before logging in.');
+    $original_session = $matches[1];
+
+    // We cannot use $this->drupalLogin($user); because we exit in
+    // session_test_user_login() which breaks a normal assertion.
+    $edit = array(
+      'name' => $user->name,
+      'pass' => $user->pass_raw
+    );
+    $this->drupalPost('user', $edit, t('Log in'));
+    $this->drupalGet('user');
+    $pass = $this->assertText($user->name, format_string('Found name: %name', array('%name' => $user->name)), 'User login');
+    $this->_logged_in = $pass;
+
+    $this->drupalGet('session-test/id');
+    $matches = array();
+    preg_match('/\s*session_id:(.*)\n/', $this->drupalGetContent(), $matches);
+    $this->assertTrue(!empty($matches[1]) , 'Found session ID after logging in.');
+    $this->assertTrue($matches[1] != $original_session, 'Session ID changed after login.');
+  }
+
+  /**
+   * Test data persistence via the session_test module callbacks.
+   */
+  function testDataPersistence() {
+    $user = $this->drupalCreateUser(array('access content'));
+    // Enable sessions.
+    $this->sessionReset($user->uid);
+
+    $this->drupalLogin($user);
+
+    $value_1 = $this->randomName();
+    $this->drupalGet('session-test/set/' . $value_1);
+    $this->assertText($value_1, 'The session value was stored.', 'Session');
+    $this->drupalGet('session-test/get');
+    $this->assertText($value_1, 'Session correctly returned the stored data for an authenticated user.', 'Session');
+
+    // Attempt to write over val_1. If drupal_save_session(FALSE) is working.
+    // properly, val_1 will still be set.
+    $value_2 = $this->randomName();
+    $this->drupalGet('session-test/no-set/' . $value_2);
+    $this->assertText($value_2, 'The session value was correctly passed to session-test/no-set.', 'Session');
+    $this->drupalGet('session-test/get');
+    $this->assertText($value_1, 'Session data is not saved for drupal_save_session(FALSE).', 'Session');
+
+    // Switch browser cookie to anonymous user, then back to user 1.
+    $this->sessionReset();
+    $this->sessionReset($user->uid);
+    $this->assertText($value_1, 'Session data persists through browser close.', 'Session');
+
+    // Logout the user and make sure the stored value no longer persists.
+    $this->drupalLogout();
+    $this->sessionReset();
+    $this->drupalGet('session-test/get');
+    $this->assertNoText($value_1, "After logout, previous user's session data is not available.", 'Session');
+
+    // Now try to store some data as an anonymous user.
+    $value_3 = $this->randomName();
+    $this->drupalGet('session-test/set/' . $value_3);
+    $this->assertText($value_3, 'Session data stored for anonymous user.', 'Session');
+    $this->drupalGet('session-test/get');
+    $this->assertText($value_3, 'Session correctly returned the stored data for an anonymous user.', 'Session');
+
+    // Try to store data when drupal_save_session(FALSE).
+    $value_4 = $this->randomName();
+    $this->drupalGet('session-test/no-set/' . $value_4);
+    $this->assertText($value_4, 'The session value was correctly passed to session-test/no-set.', 'Session');
+    $this->drupalGet('session-test/get');
+    $this->assertText($value_3, 'Session data is not saved for drupal_save_session(FALSE).', 'Session');
+
+    // Login, the data should persist.
+    $this->drupalLogin($user);
+    $this->sessionReset($user->uid);
+    $this->drupalGet('session-test/get');
+    $this->assertNoText($value_1, 'Session has persisted for an authenticated user after logging out and then back in.', 'Session');
+
+    // Change session and create another user.
+    $user2 = $this->drupalCreateUser(array('access content'));
+    $this->sessionReset($user2->uid);
+    $this->drupalLogin($user2);
+  }
+
+  /**
+   * Test that empty anonymous sessions are destroyed.
+   */
+  function testEmptyAnonymousSession() {
+    // Verify that no session is automatically created for anonymous user.
+    $this->drupalGet('');
+    $this->assertSessionCookie(FALSE);
+    $this->assertSessionEmpty(TRUE);
+
+    // The same behavior is expected when caching is enabled.
+    variable_set('cache', 1);
+    $this->drupalGet('');
+    $this->assertSessionCookie(FALSE);
+    $this->assertSessionEmpty(TRUE);
+    $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS', 'Page was not cached.');
+
+    // Start a new session by setting a message.
+    $this->drupalGet('session-test/set-message');
+    $this->assertSessionCookie(TRUE);
+    $this->assertTrue($this->drupalGetHeader('Set-Cookie'), 'New session was started.');
+
+    // Display the message, during the same request the session is destroyed
+    // and the session cookie is unset.
+    $this->drupalGet('');
+    $this->assertSessionCookie(FALSE);
+    $this->assertSessionEmpty(FALSE);
+    $this->assertFalse($this->drupalGetHeader('X-Drupal-Cache'), 'Caching was bypassed.');
+    $this->assertText(t('This is a dummy message.'), 'Message was displayed.');
+    $this->assertTrue(preg_match('/SESS\w+=deleted/', $this->drupalGetHeader('Set-Cookie')), 'Session cookie was deleted.');
+
+    // Verify that session was destroyed.
+    $this->drupalGet('');
+    $this->assertSessionCookie(FALSE);
+    $this->assertSessionEmpty(TRUE);
+    $this->assertNoText(t('This is a dummy message.'), 'Message was not cached.');
+    $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.');
+    $this->assertFalse($this->drupalGetHeader('Set-Cookie'), 'New session was not started.');
+
+    // Verify that no session is created if drupal_save_session(FALSE) is called.
+    $this->drupalGet('session-test/set-message-but-dont-save');
+    $this->assertSessionCookie(FALSE);
+    $this->assertSessionEmpty(TRUE);
+
+    // Verify that no message is displayed.
+    $this->drupalGet('');
+    $this->assertSessionCookie(FALSE);
+    $this->assertSessionEmpty(TRUE);
+    $this->assertNoText(t('This is a dummy message.'), 'The message was not saved.');
+  }
+
+  /**
+   * Test that sessions are only saved when necessary.
+   */
+  function testSessionWrite() {
+    $user = $this->drupalCreateUser(array('access content'));
+    $this->drupalLogin($user);
+
+    $sql = 'SELECT u.access, s.timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE u.uid = :uid';
+    $times1 = db_query($sql, array(':uid' => $user->uid))->fetchObject();
+
+    // Before every request we sleep one second to make sure that if the session
+    // is saved, its timestamp will change.
+
+    // Modify the session.
+    sleep(1);
+    $this->drupalGet('session-test/set/foo');
+    $times2 = db_query($sql, array(':uid' => $user->uid))->fetchObject();
+    $this->assertEqual($times2->access, $times1->access, 'Users table was not updated.');
+    $this->assertNotEqual($times2->timestamp, $times1->timestamp, 'Sessions table was updated.');
+
+    // Write the same value again, i.e. do not modify the session.
+    sleep(1);
+    $this->drupalGet('session-test/set/foo');
+    $times3 = db_query($sql, array(':uid' => $user->uid))->fetchObject();
+    $this->assertEqual($times3->access, $times1->access, 'Users table was not updated.');
+    $this->assertEqual($times3->timestamp, $times2->timestamp, 'Sessions table was not updated.');
+
+    // Do not change the session.
+    sleep(1);
+    $this->drupalGet('');
+    $times4 = db_query($sql, array(':uid' => $user->uid))->fetchObject();
+    $this->assertEqual($times4->access, $times3->access, 'Users table was not updated.');
+    $this->assertEqual($times4->timestamp, $times3->timestamp, 'Sessions table was not updated.');
+
+    // Force updating of users and sessions table once per second.
+    variable_set('session_write_interval', 0);
+    $this->drupalGet('');
+    $times5 = db_query($sql, array(':uid' => $user->uid))->fetchObject();
+    $this->assertNotEqual($times5->access, $times4->access, 'Users table was updated.');
+    $this->assertNotEqual($times5->timestamp, $times4->timestamp, 'Sessions table was updated.');
+  }
+
+  /**
+   * Test that empty session IDs are not allowed.
+   */
+  function testEmptySessionID() {
+    $user = $this->drupalCreateUser(array('access content'));
+    $this->drupalLogin($user);
+    $this->drupalGet('session-test/is-logged-in');
+    $this->assertResponse(200, 'User is logged in.');
+
+    // Reset the sid in {sessions} to a blank string. This may exist in the
+    // wild in some cases, although we normally prevent it from happening.
+    db_query("UPDATE {sessions} SET sid = '' WHERE uid = :uid", array(':uid' => $user->uid));
+    // Send a blank sid in the session cookie, and the session should no longer
+    // be valid. Closing the curl handler will stop the previous session ID
+    // from persisting.
+    $this->curlClose();
+    $this->additionalCurlOptions[CURLOPT_COOKIE] = rawurlencode($this->session_name) . '=;';
+    $this->drupalGet('session-test/id-from-cookie');
+    $this->assertRaw("session_id:\n", 'Session ID is blank as sent from cookie header.');
+    // Assert that we have an anonymous session now.
+    $this->drupalGet('session-test/is-logged-in');
+    $this->assertResponse(403, 'An empty session ID is not allowed.');
+  }
+
+  /**
+   * Reset the cookie file so that it refers to the specified user.
+   *
+   * @param $uid User id to set as the active session.
+   */
+  function sessionReset($uid = 0) {
+    // Close the internal browser.
+    $this->curlClose();
+    $this->loggedInUser = FALSE;
+
+    // Change cookie file for user.
+    $this->cookieFile = file_stream_wrapper_get_instance_by_scheme('temporary')->getDirectoryPath() . '/cookie.' . $uid . '.txt';
+    $this->additionalCurlOptions[CURLOPT_COOKIEFILE] = $this->cookieFile;
+    $this->additionalCurlOptions[CURLOPT_COOKIESESSION] = TRUE;
+    $this->drupalGet('session-test/get');
+    $this->assertResponse(200, 'Session test module is correctly enabled.', 'Session');
+  }
+
+  /**
+   * Assert whether the SimpleTest browser sent a session cookie.
+   */
+  function assertSessionCookie($sent) {
+    if ($sent) {
+      $this->assertNotNull($this->session_id, 'Session cookie was sent.');
+    }
+    else {
+      $this->assertNull($this->session_id, 'Session cookie was not sent.');
+    }
+  }
+
+  /**
+   * Assert whether $_SESSION is empty at the beginning of the request.
+   */
+  function assertSessionEmpty($empty) {
+    if ($empty) {
+      $this->assertIdentical($this->drupalGetHeader('X-Session-Empty'), '1', 'Session was empty.');
+    }
+    else {
+      $this->assertIdentical($this->drupalGetHeader('X-Session-Empty'), '0', 'Session was not empty.');
+    }
+  }
+}
+
+/**
+ * Ensure that when running under HTTPS two session cookies are generated.
+ */
+class SessionHttpsTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Session HTTPS handling',
+      'description' => 'Ensure that when running under HTTPS two session cookies are generated.',
+      'group' => 'Session'
+    );
+  }
+
+  public function setUp() {
+    parent::setUp('session_test');
+  }
+
+  protected function testHttpsSession() {
+    global $is_https;
+
+    if ($is_https) {
+      $secure_session_name = session_name();
+      $insecure_session_name = substr(session_name(), 1);
+    }
+    else {
+      $secure_session_name = 'S' . session_name();
+      $insecure_session_name = session_name();
+    }
+
+    $user = $this->drupalCreateUser(array('access administration pages'));
+
+    // Test HTTPS session handling by altering the form action to submit the
+    // login form through https.php, which creates a mock HTTPS request.
+    $this->drupalGet('user');
+    $form = $this->xpath('//form[@id="user-login"]');
+    $form[0]['action'] = $this->httpsUrl('user');
+    $edit = array('name' => $user->name, 'pass' => $user->pass_raw);
+    $this->drupalPost(NULL, $edit, t('Log in'));
+
+    // Test a second concurrent session.
+    $this->curlClose();
+    $this->drupalGet('user');
+    $form = $this->xpath('//form[@id="user-login"]');
+    $form[0]['action'] = $this->httpsUrl('user');
+    $this->drupalPost(NULL, $edit, t('Log in'));
+
+    // Check secure cookie on secure page.
+    $this->assertTrue($this->cookies[$secure_session_name]['secure'], 'The secure cookie has the secure attribute');
+    // Check insecure cookie is not set.
+    $this->assertFalse(isset($this->cookies[$insecure_session_name]));
+    $ssid = $this->cookies[$secure_session_name]['value'];
+    $this->assertSessionIds($ssid, $ssid, 'Session has a non-empty SID and a correct secure SID.');
+    $cookie = $secure_session_name . '=' . $ssid;
+
+    // Verify that user is logged in on secure URL.
+    $this->curlClose();
+    $this->drupalGet($this->httpsUrl('admin/config'), array(), array('Cookie: ' . $cookie));
+    $this->assertText(t('Configuration'));
+    $this->assertResponse(200);
+
+    // Verify that user is not logged in on non-secure URL.
+    $this->curlClose();
+    $this->drupalGet($this->httpUrl('admin/config'), array(), array('Cookie: ' . $cookie));
+    $this->assertNoText(t('Configuration'));
+    $this->assertResponse(403);
+
+    // Verify that empty SID cannot be used on the non-secure site.
+    $this->curlClose();
+    $cookie = $insecure_session_name . '=';
+    $this->drupalGet($this->httpUrl('admin/config'), array(), array('Cookie: ' . $cookie));
+    $this->assertResponse(403);
+
+    // Test HTTP session handling by altering the form action to submit the
+    // login form through http.php, which creates a mock HTTP request on HTTPS
+    // test environments.
+    $this->curlClose();
+    $this->drupalGet('user');
+    $form = $this->xpath('//form[@id="user-login"]');
+    $form[0]['action'] = $this->httpUrl('user');
+    $edit = array('name' => $user->name, 'pass' => $user->pass_raw);
+    $this->drupalPost(NULL, $edit, t('Log in'));
+    $this->drupalGet($this->httpUrl('admin/config'));
+    $this->assertResponse(200);
+    $sid = $this->cookies[$insecure_session_name]['value'];
+    $this->assertSessionIds($sid, '', 'Session has the correct SID and an empty secure SID.');
+
+    // Verify that empty secure SID cannot be used on the secure site.
+    $this->curlClose();
+    $cookie = $secure_session_name . '=';
+    $this->drupalGet($this->httpsUrl('admin/config'), array(), array('Cookie: ' . $cookie));
+    $this->assertResponse(403);
+
+    // Clear browser cookie jar.
+    $this->cookies = array();
+
+    if ($is_https) {
+      // The functionality does not make sense when running on HTTPS.
+      return;
+    }
+
+    // Enable secure pages.
+    variable_set('https', TRUE);
+
+    $this->curlClose();
+    // Start an anonymous session on the insecure site.
+    $session_data = $this->randomName();
+    $this->drupalGet('session-test/set/' . $session_data);
+    // Check secure cookie on insecure page.
+    $this->assertFalse(isset($this->cookies[$secure_session_name]), 'The secure cookie is not sent on insecure pages.');
+    // Check insecure cookie on insecure page.
+    $this->assertFalse($this->cookies[$insecure_session_name]['secure'], 'The insecure cookie does not have the secure attribute');
+
+    // Store the anonymous cookie so we can validate that its session is killed
+    // after login.
+    $anonymous_cookie = $insecure_session_name . '=' . $this->cookies[$insecure_session_name]['value'];
+
+    // Check that password request form action is not secure.
+    $this->drupalGet('user/password');
+    $form = $this->xpath('//form[@id="user-pass"]');
+    $this->assertNotEqual(substr($form[0]['action'], 0, 6), 'https:', 'Password request form action is not secure');
+    $form[0]['action'] = $this->httpsUrl('user');
+
+    // Check that user login form action is secure.
+    $this->drupalGet('user');
+    $form = $this->xpath('//form[@id="user-login"]');
+    $this->assertEqual(substr($form[0]['action'], 0, 6), 'https:', 'Login form action is secure');
+    $form[0]['action'] = $this->httpsUrl('user');
+
+    $edit = array(
+      'name' => $user->name,
+      'pass' => $user->pass_raw,
+    );
+    $this->drupalPost(NULL, $edit, t('Log in'));
+    // Check secure cookie on secure page.
+    $this->assertTrue($this->cookies[$secure_session_name]['secure'], 'The secure cookie has the secure attribute');
+    // Check insecure cookie on secure page.
+    $this->assertFalse($this->cookies[$insecure_session_name]['secure'], 'The insecure cookie does not have the secure attribute');
+
+    $sid = $this->cookies[$insecure_session_name]['value'];
+    $ssid = $this->cookies[$secure_session_name]['value'];
+    $this->assertSessionIds($sid, $ssid, 'Session has both secure and insecure SIDs');
+    $cookies = array(
+      $insecure_session_name . '=' . $sid,
+      $secure_session_name . '=' . $ssid,
+    );
+
+    // Test that session data saved before login is still available on the
+    // authenticated session.
+    $this->drupalGet('session-test/get');
+    $this->assertText($session_data, 'Session correctly returned the stored data set by the anonymous session.');
+
+    foreach ($cookies as $cookie_key => $cookie) {
+      foreach (array('admin/config', $this->httpsUrl('admin/config')) as $url_key => $url) {
+        $this->curlClose();
+
+        $this->drupalGet($url, array(), array('Cookie: ' . $cookie));
+        if ($cookie_key == $url_key) {
+          $this->assertText(t('Configuration'));
+          $this->assertResponse(200);
+        }
+        else {
+          $this->assertNoText(t('Configuration'));
+          $this->assertResponse(403);
+        }
+      }
+    }
+
+    // Test that session data saved before login is not available using the
+    // pre-login anonymous cookie.
+    $this->cookies = array();
+    $this->drupalGet('session-test/get', array('Cookie: ' . $anonymous_cookie));
+    $this->assertNoText($session_data, 'Initial anonymous session is inactive after login.');
+
+    // Clear browser cookie jar.
+    $this->cookies = array();
+
+    // Start an anonymous session on the secure site.
+    $this->drupalGet($this->httpsUrl('session-test/set/1'));
+
+    // Mock a login to the secure site using the secure session cookie.
+    $this->drupalGet('user');
+    $form = $this->xpath('//form[@id="user-login"]');
+    $form[0]['action'] = $this->httpsUrl('user');
+    $this->drupalPost(NULL, $edit, t('Log in'));
+
+    // Test that the user is also authenticated on the insecure site.
+    $this->drupalGet("user/{$user->uid}/edit");
+    $this->assertResponse(200);
+  }
+
+  /**
+   * Test that there exists a session with two specific session IDs.
+   *
+   * @param $sid
+   *   The insecure session ID to search for.
+   * @param $ssid
+   *   The secure session ID to search for.
+   * @param $assertion_text
+   *   The text to display when we perform the assertion.
+   *
+   * @return
+   *   The result of assertTrue() that there's a session in the system that
+   *   has the given insecure and secure session IDs.
+   */
+  protected function assertSessionIds($sid, $ssid, $assertion_text) {
+    $args = array(
+      ':sid' => $sid,
+      ':ssid' => $ssid,
+    );
+    return $this->assertTrue(db_query('SELECT timestamp FROM {sessions} WHERE sid = :sid AND ssid = :ssid', $args)->fetchField(), $assertion_text);
+  }
+
+  /**
+   * Builds a URL for submitting a mock HTTPS request to HTTP test environments.
+   *
+   * @param $url
+   *   A Drupal path such as 'user'.
+   *
+   * @return
+   *   An absolute URL.
+   */
+  protected function httpsUrl($url) {
+    global $base_url;
+    return $base_url . '/modules/simpletest/tests/https.php?q=' . $url;
+  }
+
+  /**
+   * Builds a URL for submitting a mock HTTP request to HTTPS test environments.
+   *
+   * @param $url
+   *   A Drupal path such as 'user'.
+   *
+   * @return
+   *   An absolute URL.
+   */
+  protected function httpUrl($url) {
+    global $base_url;
+    return $base_url . '/modules/simpletest/tests/http.php?q=' . $url;
+  }
+}
+
diff --git a/htmltest/modules/simpletest/tests/session_test.info b/htmltest/modules/simpletest/tests/session_test.info
new file mode 100644
index 00000000..98897e44
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/session_test.info
@@ -0,0 +1,12 @@
+name = "Session test"
+description = "Support module for session data testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/session_test.module b/htmltest/modules/simpletest/tests/session_test.module
new file mode 100644
index 00000000..689ff099
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/session_test.module
@@ -0,0 +1,192 @@
+<?php
+
+/**
+ * Implements hook_menu().
+ */
+function session_test_menu() {
+  $items['session-test/get'] = array(
+    'title' => 'Session value',
+    'page callback' => '_session_test_get',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['session-test/id'] = array(
+    'title' => 'Session ID',
+    'page callback' => '_session_test_id',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['session-test/id-from-cookie'] = array(
+    'title' => 'Session ID from cookie',
+    'page callback' => '_session_test_id_from_cookie',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['session-test/set/%'] = array(
+    'title' => 'Set session value',
+    'page callback' => '_session_test_set',
+    'page arguments' => array(2),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['session-test/no-set/%'] = array(
+    'title' => 'Set session value but do not save session',
+    'page callback' => '_session_test_no_set',
+    'page arguments' => array(2),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['session-test/set-message'] = array(
+    'title' => 'Set message',
+    'page callback' => '_session_test_set_message',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['session-test/set-message-but-dont-save'] = array(
+    'title' => 'Set message but do not save session',
+    'page callback' => '_session_test_set_message_but_dont_save',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['session-test/set-not-started'] = array(
+    'title' => 'Set message when session is not started',
+    'page callback' => '_session_test_set_not_started',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['session-test/is-logged-in'] = array(
+    'title' => 'Check if user is logged in',
+    'page callback' => '_session_test_is_logged_in',
+    'access callback' => 'user_is_logged_in',
+    'type' => MENU_CALLBACK,
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_boot().
+ */
+function session_test_boot() {
+  header('X-Session-Empty: ' . intval(empty($_SESSION)));
+}
+
+/**
+ * Page callback, prints the stored session value to the screen.
+ */
+function _session_test_get() {
+  if (!empty($_SESSION['session_test_value'])) {
+    return t('The current value of the stored session variable is: %val', array('%val' => $_SESSION['session_test_value']));
+  }
+  else {
+    return "";
+  }
+}
+
+/**
+ * Page callback, stores a value in $_SESSION['session_test_value'].
+ */
+function _session_test_set($value) {
+  $_SESSION['session_test_value'] = $value;
+  return t('The current value of the stored session variable has been set to %val', array('%val' => $value));
+}
+
+/**
+ * Menu callback: turns off session saving and then tries to save a value
+ * anyway.
+ */
+function _session_test_no_set($value) {
+  drupal_save_session(FALSE);
+  _session_test_set($value);
+  return t('session saving was disabled, and then %val was set', array('%val' => $value));
+}
+
+/**
+ * Menu callback: print the current session ID.
+ */
+function _session_test_id() {
+  // Set a value in $_SESSION, so that drupal_session_commit() will start
+  // a session.
+  $_SESSION['test'] = 'test';
+
+  drupal_session_commit();
+
+  return 'session_id:' . session_id() . "\n";
+}
+
+/**
+ * Menu callback: print the current session ID as read from the cookie.
+ */
+function _session_test_id_from_cookie() {
+  return 'session_id:' . $_COOKIE[session_name()] . "\n";
+}
+
+/**
+ * Menu callback, sets a message to me displayed on the following page.
+ */
+function _session_test_set_message() {
+  drupal_set_message(t('This is a dummy message.'));
+  print t('A message was set.');
+  // Do not return anything, so the current request does not result in a themed
+  // page with messages. The message will be displayed in the following request
+  // instead.
+}
+
+/**
+ * Menu callback, sets a message but call drupal_save_session(FALSE).
+ */
+function _session_test_set_message_but_dont_save() {
+  drupal_save_session(FALSE);
+  _session_test_set_message();
+}
+
+/**
+ * Menu callback, stores a value in $_SESSION['session_test_value'] without
+ * having started the session in advance.
+ */
+function _session_test_set_not_started() {
+  if (!drupal_session_will_start()) {
+    $_SESSION['session_test_value'] = t('Session was not started');
+  }
+}
+
+/**
+ * Implements hook_user().
+ */
+function session_test_user_login($edit = array(), $user = NULL) {
+  if ($user->name == 'session_test_user') {
+    // Exit so we can verify that the session was regenerated
+    // before hook_user() was called.
+    exit;
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function session_test_form_user_login_alter(&$form) {
+  $form['#https'] = TRUE;
+}
+
+/**
+ * Implements hook_drupal_goto_alter().
+ *
+ * Force the redirection to go to a non-secure page after being on a secure
+ * page through https.php.
+ */
+function session_test_drupal_goto_alter(&$path, &$options, &$http_response_code) {
+  global $base_insecure_url, $is_https_mock;
+  // Alter the redirect to use HTTP when using a mock HTTPS request through
+  // https.php because form submissions would otherwise redirect to a
+  // non-existent HTTPS site.
+  if (!empty($is_https_mock)) {
+    $path = $base_insecure_url . '/' . $path;
+  }
+}
+
+/**
+ * Menu callback, only available if current user is logged in.
+ */
+function _session_test_is_logged_in() {
+  return t('User is logged in.');
+}
diff --git a/htmltest/modules/simpletest/tests/system.base.css b/htmltest/modules/simpletest/tests/system.base.css
new file mode 100644
index 00000000..c14ae9b2
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/system.base.css
@@ -0,0 +1,6 @@
+
+/**
+ * This file is for testing CSS file override in
+ * CascadingStylesheetsTestCase::testRenderOverride().
+ * No contents are necessary.
+ */
diff --git a/htmltest/modules/simpletest/tests/system_dependencies_test.info b/htmltest/modules/simpletest/tests/system_dependencies_test.info
new file mode 100644
index 00000000..3b9494c5
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/system_dependencies_test.info
@@ -0,0 +1,13 @@
+name = "System dependency test"
+description = "Support module for testing system dependencies."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+dependencies[] = _missing_dependency
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/system_dependencies_test.module b/htmltest/modules/simpletest/tests/system_dependencies_test.module
new file mode 100644
index 00000000..b3d9bbc7
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/system_dependencies_test.module
@@ -0,0 +1 @@
+<?php
diff --git a/htmltest/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info b/htmltest/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info
new file mode 100644
index 00000000..a83ef744
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info
@@ -0,0 +1,13 @@
+name = "System incompatible core version dependencies test"
+description = "Support module for testing system dependencies."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+dependencies[] = system_incompatible_core_version_test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.module b/htmltest/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.module
new file mode 100644
index 00000000..b3d9bbc7
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/system_incompatible_core_version_dependencies_test.module
@@ -0,0 +1 @@
+<?php
diff --git a/htmltest/modules/simpletest/tests/system_incompatible_core_version_test.info b/htmltest/modules/simpletest/tests/system_incompatible_core_version_test.info
new file mode 100644
index 00000000..e56e7aa4
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/system_incompatible_core_version_test.info
@@ -0,0 +1,12 @@
+name = "System incompatible core version test"
+description = "Support module for testing system dependencies."
+package = Testing
+version = VERSION
+core = 5.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/system_incompatible_core_version_test.module b/htmltest/modules/simpletest/tests/system_incompatible_core_version_test.module
new file mode 100644
index 00000000..b3d9bbc7
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/system_incompatible_core_version_test.module
@@ -0,0 +1 @@
+<?php
diff --git a/htmltest/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info b/htmltest/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info
new file mode 100644
index 00000000..3871331a
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.info
@@ -0,0 +1,14 @@
+name = "System incompatible module version dependencies test"
+description = "Support module for testing system dependencies."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+; system_incompatible_module_version_test declares version 1.0
+dependencies[] = system_incompatible_module_version_test (>2.0)
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.module b/htmltest/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.module
new file mode 100644
index 00000000..b3d9bbc7
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/system_incompatible_module_version_dependencies_test.module
@@ -0,0 +1 @@
+<?php
diff --git a/htmltest/modules/simpletest/tests/system_incompatible_module_version_test.info b/htmltest/modules/simpletest/tests/system_incompatible_module_version_test.info
new file mode 100644
index 00000000..f1ca0260
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/system_incompatible_module_version_test.info
@@ -0,0 +1,12 @@
+name = "System incompatible module version test"
+description = "Support module for testing system dependencies."
+package = Testing
+version = 1.0
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/system_incompatible_module_version_test.module b/htmltest/modules/simpletest/tests/system_incompatible_module_version_test.module
new file mode 100644
index 00000000..b3d9bbc7
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/system_incompatible_module_version_test.module
@@ -0,0 +1 @@
+<?php
diff --git a/htmltest/modules/simpletest/tests/system_test.info b/htmltest/modules/simpletest/tests/system_test.info
new file mode 100644
index 00000000..d82a0d25
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/system_test.info
@@ -0,0 +1,13 @@
+name = System test
+description = Support module for system testing.
+package = Testing
+version = VERSION
+core = 7.x
+files[] = system_test.module
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/system_test.module b/htmltest/modules/simpletest/tests/system_test.module
new file mode 100644
index 00000000..8cb0e837
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/system_test.module
@@ -0,0 +1,407 @@
+<?php
+
+/**
+ * Implements hook_menu().
+ */
+function system_test_menu() {
+  $items['system-test/sleep/%'] = array(
+    'page callback' => 'system_test_sleep',
+    'page arguments' => array(2),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['system-test/auth'] = array(
+    'page callback' => 'system_test_basic_auth_page',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['system-test/authorize-init/%'] = array(
+    'page callback' => 'system_test_authorize_init_page',
+    'page arguments' => array(2),
+    'access arguments' => array('administer software updates'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['system-test/redirect/%'] = array(
+    'title' => 'Redirect',
+    'page callback' => 'system_test_redirect',
+    'page arguments' => array(2),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['system-test/multiple-redirects/%'] = array(
+    'title' => 'Redirect',
+    'page callback' => 'system_test_multiple_redirects',
+    'page arguments' => array(2),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['system-test/set-header'] = array(
+    'page callback' => 'system_test_set_header',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['system-test/redirect-noscheme'] = array(
+    'page callback' => 'system_test_redirect_noscheme',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['system-test/redirect-noparse'] = array(
+    'page callback' => 'system_test_redirect_noparse',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['system-test/redirect-invalid-scheme'] = array(
+    'page callback' => 'system_test_redirect_invalid_scheme',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['system-test/variable-get'] = array(
+    'title' => 'Variable Get',
+    'page callback' => 'variable_get',
+    'page arguments' => array('simpletest_bootstrap_variable_test', NULL),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['system-test/lock-acquire'] = array(
+    'title' => 'Lock acquire',
+    'page callback' => 'system_test_lock_acquire',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['system-test/lock-exit'] = array(
+    'title' => 'Lock acquire then exit',
+    'page callback' => 'system_test_lock_exit',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['system-test/main-content-handling'] = array(
+    'title' => 'Test main content handling',
+    'page callback' => 'system_test_main_content_fallback',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['system-test/main-content-fallback'] = array(
+    'title' => 'Test main content fallback',
+    'page callback' => 'system_test_main_content_fallback',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['system-test/main-content-duplication'] = array(
+    'title' => 'Test main content duplication',
+    'page callback' => 'system_test_main_content_fallback',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['system-test/shutdown-functions'] = array(
+    'title' => 'Test main content duplication',
+    'page callback' => 'system_test_page_shutdown_functions',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  return $items;
+}
+
+function system_test_sleep($seconds) {
+  sleep($seconds);
+}
+
+function system_test_basic_auth_page() {
+  $output = t('$_SERVER[\'PHP_AUTH_USER\'] is @username.', array('@username' => $_SERVER['PHP_AUTH_USER']));
+  $output .= t('$_SERVER[\'PHP_AUTH_PW\'] is @password.', array('@password' => $_SERVER['PHP_AUTH_PW']));
+  return $output;
+}
+
+function system_test_redirect($code) {
+  $code = (int) $code;
+  if ($code != 200) {
+    // Header names are case-insensitive.
+    header("locaTION: " . url('system-test/redirect/200', array('absolute' => TRUE)), TRUE, $code);
+    exit;
+  }
+  return '';
+}
+
+/**
+ * Menu callback; sends a redirect header to itself until $count argument is 0.
+ *
+ * Emulates the variable number of redirects (given by initial $count argument)
+ * to the final destination URL by continuous sending of 301 HTTP redirect
+ * headers to itself together with decrementing the $count parameter until the
+ * $count parameter reaches 0. After that it returns an empty string to render
+ * the final destination page.
+ *
+ * @param $count
+ *   The count of redirects left until the final destination page.
+ *
+ * @returns
+ *   The location redirect if the $count > 0, otherwise an empty string.
+ */
+function system_test_multiple_redirects($count) {
+  $count = (int) $count;
+  if ($count > 0) {
+    header("location: " . url('system-test/multiple-redirects/' . --$count, array('absolute' => TRUE)), TRUE, 301);
+    exit;
+  }
+  return '';
+}
+
+function system_test_set_header() {
+  drupal_add_http_header($_GET['name'], $_GET['value']);
+  return t('The following header was set: %name: %value', array('%name' => $_GET['name'], '%value' => $_GET['value']));
+}
+
+function system_test_redirect_noscheme() {
+  header("Location: localhost/path", TRUE, 301);
+  exit;
+}
+
+function system_test_redirect_noparse() {
+  header("Location: http:///path", TRUE, 301);
+  exit;
+}
+
+function system_test_redirect_invalid_scheme() {
+  header("Location: ftp://localhost/path", TRUE, 301);
+  exit;
+}
+
+/**
+ * Implements hook_modules_installed().
+ */
+function system_test_modules_installed($modules) {
+  if (variable_get('test_verbose_module_hooks')) {
+    foreach ($modules as $module) {
+      drupal_set_message(t('hook_modules_installed fired for @module', array('@module' => $module)));
+    }
+  }
+}
+
+/**
+ * Implements hook_modules_enabled().
+ */
+function system_test_modules_enabled($modules) {
+  if (variable_get('test_verbose_module_hooks')) {
+    foreach ($modules as $module) {
+      drupal_set_message(t('hook_modules_enabled fired for @module', array('@module' => $module)));
+    }
+  }
+}
+
+/**
+ * Implements hook_modules_disabled().
+ */
+function system_test_modules_disabled($modules) {
+  if (variable_get('test_verbose_module_hooks')) {
+    foreach ($modules as $module) {
+      drupal_set_message(t('hook_modules_disabled fired for @module', array('@module' => $module)));
+    }
+  }
+}
+
+/**
+ * Implements hook_modules_uninstalled().
+ */
+function system_test_modules_uninstalled($modules) {
+  if (variable_get('test_verbose_module_hooks')) {
+    foreach ($modules as $module) {
+      drupal_set_message(t('hook_modules_uninstalled fired for @module', array('@module' => $module)));
+    }
+  }
+}
+
+/**
+ * Implements hook_boot().
+ */
+function system_test_boot() {
+  watchdog('system_test', 'hook_boot');
+}
+
+/**
+ * Implements hook_init().
+ */
+function system_test_init() {
+  // Used by FrontPageTestCase to get the results of drupal_is_front_page().
+  if (variable_get('front_page_output', 0) && drupal_is_front_page()) {
+    drupal_set_message(t('On front page.'));
+  }
+}
+
+/**
+ * Implements hook_exit().
+ */
+function system_test_exit() {
+  watchdog('system_test', 'hook_exit');
+}
+
+/**
+ * Implements hook_system_info_alter().
+ */
+function system_test_system_info_alter(&$info, $file, $type) {
+  // We need a static otherwise the last test will fail to alter common_test.
+  static $test;
+  if (($dependencies = variable_get('dependencies', array())) || $test) {
+    if ($file->name == 'module_test') {
+      $info['hidden'] = FALSE;
+      $info['dependencies'][] = array_shift($dependencies);
+      variable_set('dependencies', $dependencies);
+      $test = TRUE;
+    }
+    if ($file->name == 'common_test') {
+      $info['hidden'] = FALSE;
+      $info['version'] = '7.x-2.4-beta3';
+    }
+  }
+
+  // Make the system_dependencies_test visible by default.
+  if ($file->name == 'system_dependencies_test') {
+    $info['hidden'] = FALSE;
+  }
+  if (in_array($file->name, array(
+    'system_incompatible_module_version_dependencies_test',
+    'system_incompatible_core_version_dependencies_test',
+    'system_incompatible_module_version_test',
+    'system_incompatible_core_version_test',
+  ))) {
+    $info['hidden'] = FALSE;
+  }
+  if ($file->name == 'requirements1_test' || $file->name == 'requirements2_test') {
+    $info['hidden'] = FALSE;
+  }
+}
+
+/**
+ * Try to acquire a named lock and report the outcome.
+ */
+function system_test_lock_acquire() {
+  if (lock_acquire('system_test_lock_acquire')) {
+    lock_release('system_test_lock_acquire');
+    return 'TRUE: Lock successfully acquired in system_test_lock_acquire()';
+  }
+  else {
+    return 'FALSE: Lock not acquired in system_test_lock_acquire()';
+  }
+}
+
+/**
+ * Try to acquire a specific lock, and then exit.
+ */
+function system_test_lock_exit() {
+  if (lock_acquire('system_test_lock_exit', 900)) {
+    echo 'TRUE: Lock successfully acquired in system_test_lock_exit()';
+    // The shut-down function should release the lock.
+    exit();
+  }
+  else {
+    return 'FALSE: Lock not acquired in system_test_lock_exit()';
+  }
+}
+
+/**
+ * Implements hook_page_build().
+ */
+function system_test_page_build(&$page) {
+  $menu_item = menu_get_item();
+  $main_content_display = &drupal_static('system_main_content_added', FALSE);
+
+  if ($menu_item['path'] == 'system-test/main-content-handling') {
+    $page['footer'] = drupal_set_page_content();
+    $page['footer']['main']['#markup'] = '<div id="system-test-content">' . $page['footer']['main']['#markup'] . '</div>';
+  }
+  elseif ($menu_item['path'] == 'system-test/main-content-fallback') {
+    drupal_set_page_content();
+    $main_content_display = FALSE;
+  }
+  elseif ($menu_item['path'] == 'system-test/main-content-duplication') {
+    drupal_set_page_content();
+  }
+}
+
+/**
+ * Menu callback to test main content fallback().
+ */
+function system_test_main_content_fallback() {
+  return t('Content to test main content fallback');
+}
+
+/**
+ * A simple page callback which adds a register shutdown function.
+ */
+function system_test_page_shutdown_functions($arg1, $arg2) {
+  drupal_register_shutdown_function('_system_test_first_shutdown_function', $arg1, $arg2);
+}
+
+/**
+ * Dummy shutdown function which registers another shutdown function.
+ */
+function _system_test_first_shutdown_function($arg1, $arg2) {
+  // Output something, page has already been printed and the session stored
+  // so we can't use drupal_set_message.
+  print t('First shutdown function, arg1 : @arg1, arg2: @arg2', array('@arg1' => $arg1, '@arg2' => $arg2));
+  drupal_register_shutdown_function('_system_test_second_shutdown_function', $arg1, $arg2);
+}
+
+/**
+ * Dummy shutdown function.
+ */
+function _system_test_second_shutdown_function($arg1, $arg2) {
+  // Output something, page has already been printed and the session stored
+  // so we can't use drupal_set_message.
+  print t('Second shutdown function, arg1 : @arg1, arg2: @arg2', array('@arg1' => $arg1, '@arg2' => $arg2));
+
+  // Throw an exception with an HTML tag. Since this is called in a shutdown
+  // function, it will not bubble up to the default exception handler but will
+  // be caught in _drupal_shutdown_function() and be displayed through
+  // _drupal_render_exception_safe().
+  throw new Exception('Drupal is <blink>awesome</blink>.');
+}
+
+/**
+ * Implements hook_filetransfer_info().
+ */
+function system_test_filetransfer_info() {
+  return array(
+    'system_test' => array(
+      'title' => t('System Test FileTransfer'),
+      'file' => 'system_test.module',  // Should be a .inc, but for test, ok.
+      'class' => 'SystemTestFileTransfer',
+      'weight' => -10,
+    ),
+  );
+}
+
+/**
+ * Mock FileTransfer object to test the settings form functionality.
+ */
+class SystemTestFileTransfer {
+  public static function factory() {
+    return new SystemTestFileTransfer;
+  }
+
+  public function getSettingsForm() {
+    $form = array();
+    $form['system_test_username'] = array(
+      '#type' => 'textfield',
+      '#title' => t('System Test Username'),
+    );
+    return $form;
+  }
+}
+
+/**
+ * Page callback to initialize authorize.php during testing.
+ *
+ * @see system_authorized_init().
+ */
+function system_test_authorize_init_page($page_title) {
+  $authorize_url = $GLOBALS['base_url'] . '/authorize.php';
+  system_authorized_init('system_test_authorize_run', drupal_get_path('module', 'system_test') . '/system_test.module', array(), $page_title);
+  drupal_goto($authorize_url);
+}
diff --git a/htmltest/modules/simpletest/tests/tablesort.test b/htmltest/modules/simpletest/tests/tablesort.test
new file mode 100644
index 00000000..ffc9535d
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/tablesort.test
@@ -0,0 +1,166 @@
+<?php
+
+/**
+ * @file
+ * Various tablesort tests.
+ */
+
+/**
+ * Test unicode handling features implemented in unicode.inc.
+ */
+class TableSortTest extends DrupalUnitTestCase {
+
+  /**
+   * Storage for initial value of $_GET.
+   *
+   * @var array
+   */
+  protected $GET = array();
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Tablesort',
+      'description' => 'Tests table sorting.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    // Save the original $_GET to be restored later.
+    $this->GET = $_GET;
+
+    parent::setUp();
+  }
+
+  function tearDown() {
+    // Revert $_GET.
+    $_GET = $this->GET;
+
+    parent::tearDown();
+  }
+
+  /**
+   * Test tablesort_init().
+   */
+  function testTableSortInit() {
+
+    // Test simple table headers.
+
+    $headers = array('foo', 'bar', 'baz');
+    // Reset $_GET to prevent parameters from Simpletest and Batch API ending
+    // up in $ts['query'].
+    $_GET = array('q' => 'jahwohl');
+    $expected_ts = array(
+      'name' => 'foo',
+      'sql' => '',
+      'sort' => 'asc',
+      'query' => array(),
+    );
+    $ts = tablesort_init($headers);
+    $this->verbose(strtr('$ts: <pre>!ts</pre>', array('!ts' => check_plain(var_export($ts, TRUE)))));
+    $this->assertEqual($ts, $expected_ts, 'Simple table headers sorted correctly.');
+
+    // Test with simple table headers plus $_GET parameters that should _not_
+    // override the default.
+
+    $_GET = array(
+      'q' => 'jahwohl',
+      // This should not override the table order because only complex
+      // headers are overridable.
+      'order' => 'bar',
+    );
+    $ts = tablesort_init($headers);
+    $this->verbose(strtr('$ts: <pre>!ts</pre>', array('!ts' => check_plain(var_export($ts, TRUE)))));
+    $this->assertEqual($ts, $expected_ts, 'Simple table headers plus non-overriding $_GET parameters sorted correctly.');
+
+    // Test with simple table headers plus $_GET parameters that _should_
+    // override the default.
+
+    $_GET = array(
+      'q' => 'jahwohl',
+      'sort' => 'DESC',
+      // Add an unrelated parameter to ensure that tablesort will include
+      // it in the links that it creates.
+      'alpha' => 'beta',
+    );
+    $expected_ts['sort'] = 'desc';
+    $expected_ts['query'] = array('alpha' => 'beta');
+    $ts = tablesort_init($headers);
+    $this->verbose(strtr('$ts: <pre>!ts</pre>', array('!ts' => check_plain(var_export($ts, TRUE)))));
+    $this->assertEqual($ts, $expected_ts, 'Simple table headers plus $_GET parameters sorted correctly.');
+
+    // Test complex table headers.
+
+    $headers = array(
+      'foo',
+      array(
+        'data' => '1',
+        'field' => 'one',
+        'sort' => 'asc',
+        'colspan' => 1,
+      ),
+      array(
+        'data' => '2',
+        'field' => 'two',
+        'sort' => 'desc',
+      ),
+    );
+    // Reset $_GET from previous assertion.
+    $_GET = array(
+      'q' => 'jahwohl',
+      'order' => '2',
+    );
+    $ts = tablesort_init($headers);
+    $expected_ts = array(
+      'name' => '2',
+      'sql' => 'two',
+      'sort' => 'desc',
+      'query' => array(),
+    );
+    $this->verbose(strtr('$ts: <pre>!ts</pre>', array('!ts' => check_plain(var_export($ts, TRUE)))));
+    $this->assertEqual($ts, $expected_ts, 'Complex table headers sorted correctly.');
+
+    // Test complex table headers plus $_GET parameters that should _not_
+    // override the default.
+
+    $_GET = array(
+      'q' => 'jahwohl',
+      // This should not override the table order because this header does not
+      // exist.
+      'order' => 'bar',
+    );
+    $ts = tablesort_init($headers);
+    $expected_ts = array(
+      'name' => '1',
+      'sql' => 'one',
+      'sort' => 'asc',
+      'query' => array(),
+    );
+    $this->verbose(strtr('$ts: <pre>!ts</pre>', array('!ts' => check_plain(var_export($ts, TRUE)))));
+    $this->assertEqual($ts, $expected_ts, 'Complex table headers plus non-overriding $_GET parameters sorted correctly.');
+    unset($_GET['sort'], $_GET['order'], $_GET['alpha']);
+
+    // Test complex table headers plus $_GET parameters that _should_
+    // override the default.
+
+    $_GET = array(
+      'q' => 'jahwohl',
+      'order' => '1',
+      'sort' => 'ASC',
+      // Add an unrelated parameter to ensure that tablesort will include
+      // it in the links that it creates.
+      'alpha' => 'beta',
+    );
+    $expected_ts = array(
+      'name' => '1',
+      'sql' => 'one',
+      'sort' => 'asc',
+      'query' => array('alpha' => 'beta'),
+    );
+    $ts = tablesort_init($headers);
+    $this->verbose(strtr('$ts: <pre>!ts</pre>', array('!ts' => check_plain(var_export($ts, TRUE)))));
+    $this->assertEqual($ts, $expected_ts, 'Complex table headers plus $_GET parameters sorted correctly.');
+    unset($_GET['sort'], $_GET['order'], $_GET['alpha']);
+
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/taxonomy_test.info b/htmltest/modules/simpletest/tests/taxonomy_test.info
new file mode 100644
index 00000000..02722029
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/taxonomy_test.info
@@ -0,0 +1,13 @@
+name = "Taxonomy test module"
+description = "Tests functions and hooks not used in core".
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+dependencies[] = taxonomy
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/taxonomy_test.install b/htmltest/modules/simpletest/tests/taxonomy_test.install
new file mode 100644
index 00000000..d5c94da5
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/taxonomy_test.install
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the taxonomy_test module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function taxonomy_test_schema() {
+  $schema['taxonomy_term_antonym'] = array(
+    'description' => 'Stores term antonym.',
+    'fields' => array(
+      'tid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {taxonomy_term_data}.tid of the term.',
+      ),
+      'name' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The name of the antonym.',
+      ),
+    ),
+    'primary key' => array('tid'),
+  );
+
+  return $schema;
+}
diff --git a/htmltest/modules/simpletest/tests/taxonomy_test.module b/htmltest/modules/simpletest/tests/taxonomy_test.module
new file mode 100644
index 00000000..f82950c3
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/taxonomy_test.module
@@ -0,0 +1,111 @@
+<?php
+
+/**
+ * @file
+ * Test module for Taxonomy hooks and functions not used in core.
+ *
+ * @see TaxonomyHooksTestCase::testTaxonomyTermHooks()
+ */
+
+/**
+ * Implements hook_taxonomy_term_load().
+ */
+function taxonomy_test_taxonomy_term_load($terms) {
+  foreach ($terms as $term) {
+    $antonym = taxonomy_test_get_antonym($term->tid);
+    if ($antonym) {
+      $term->antonym = $antonym;
+    }
+  }
+}
+
+/**
+ * Implements hook_taxonomy_term_insert().
+ */
+function taxonomy_test_taxonomy_term_insert($term) {
+  if (!empty($term->antonym)) {
+    db_insert('taxonomy_term_antonym')
+      ->fields(array(
+        'tid' => $term->tid,
+        'name' => trim($term->antonym)
+      ))
+      ->execute();
+  }
+}
+
+/**
+ * Implements hook_taxonomy_term_update().
+ */
+function taxonomy_test_taxonomy_term_update($term) {
+  if (!empty($term->antonym)) {
+    db_merge('taxonomy_term_antonym')
+      ->key(array('tid' => $term->tid))
+      ->fields(array(
+        'name' => trim($term->antonym)
+      ))
+      ->execute();
+  }
+}
+
+/**
+ * Implements hook_taxonomy_term_delete().
+ */
+function taxonomy_test_taxonomy_term_delete($term) {
+  db_delete('taxonomy_term_antonym')
+    ->condition('tid', $term->tid)
+    ->execute();
+}
+
+/**
+ * Implements hook_taxonomy_term_view().
+ */
+function taxonomy_test_taxonomy_term_view($term, $view_mode, $langcode) {
+  if ($view_mode == 'full') {
+    $term->content['taxonomy_test_term_view_check'] = array(
+      '#prefix' => '<div>',
+      '#markup' => t('The antonym is %antonym', array('%antonym' => $term->antonym)),
+      '#suffix' => '</div>',
+      '#weight' => 10,
+    );
+  }
+}
+
+/**
+ * Implements hook_entity_view().
+ */
+function taxonomy_test_entity_view($entity, $type, $view_mode, $langcode) {
+  if ($type == 'taxonomy_term' && $view_mode == 'full') {
+    $entity->content['taxonomy_test_entity_view_check'] = array(
+      '#prefix' => '<div>',
+      '#markup' => t('The antonym is %antonym', array('%antonym' => $entity->antonym)),
+      '#suffix' => '</div>',
+      '#weight' => 20,
+    );
+  }
+}
+
+/**
+ * Implements hook_form_alter().
+ */
+function taxonomy_test_form_alter(&$form, $form_state, $form_id) {
+  if ($form_id == 'taxonomy_form_term') {
+    $antonym = taxonomy_test_get_antonym($form['#term']['tid']);
+    $form['advanced']['antonym'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Antonym'),
+      '#default_value' => !empty($antonym) ? $antonym : '',
+      '#description' => t('Antonym of this term.')
+    );
+  }
+}
+
+/**
+ * Return the antonym of the given term ID.
+ */
+function taxonomy_test_get_antonym($tid) {
+  return db_select('taxonomy_term_antonym', 'ta')
+    ->fields('ta', array('name'))
+    ->condition('tid', $tid)
+    ->execute()
+    ->fetchField();
+}
diff --git a/htmltest/modules/simpletest/tests/theme.test b/htmltest/modules/simpletest/tests/theme.test
new file mode 100644
index 00000000..519a7a90
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/theme.test
@@ -0,0 +1,502 @@
+<?php
+
+/**
+ * @file
+ * Tests for the theme API.
+ */
+
+/**
+ * Unit tests for the Theme API.
+ */
+class ThemeTestCase extends DrupalWebTestCase {
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Theme API',
+      'description' => 'Test low-level theme functions.',
+      'group' => 'Theme',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('theme_test');
+    theme_enable(array('test_theme'));
+  }
+
+  /**
+   * Test function theme_get_suggestions() for SA-CORE-2009-003.
+   */
+  function testThemeSuggestions() {
+    // Set the front page as something random otherwise the CLI
+    // test runner fails.
+    variable_set('site_frontpage', 'nobody-home');
+    $args = array('node', '1', 'edit');
+    $suggestions = theme_get_suggestions($args, 'page');
+    $this->assertEqual($suggestions, array('page__node', 'page__node__%', 'page__node__1', 'page__node__edit'), 'Found expected node edit page suggestions');
+    // Check attack vectors.
+    $args = array('node', '\\1');
+    $suggestions = theme_get_suggestions($args, 'page');
+    $this->assertEqual($suggestions, array('page__node', 'page__node__%', 'page__node__1'), 'Removed invalid \\ from suggestions');
+    $args = array('node', '1/');
+    $suggestions = theme_get_suggestions($args, 'page');
+    $this->assertEqual($suggestions, array('page__node', 'page__node__%', 'page__node__1'), 'Removed invalid / from suggestions');
+    $args = array('node', "1\0");
+    $suggestions = theme_get_suggestions($args, 'page');
+    $this->assertEqual($suggestions, array('page__node', 'page__node__%', 'page__node__1'), 'Removed invalid \\0 from suggestions');
+    // Define path with hyphens to be used to generate suggestions.
+    $args = array('node', '1', 'hyphen-path');
+    $result = array('page__node', 'page__node__%', 'page__node__1', 'page__node__hyphen_path');
+    $suggestions = theme_get_suggestions($args, 'page');
+    $this->assertEqual($suggestions, $result, 'Found expected page suggestions for paths containing hyphens.');
+  }
+
+  /**
+   * Ensures preprocess functions run even for suggestion implementations.
+   *
+   * The theme hook used by this test has its base preprocess function in a
+   * separate file, so this test also ensures that that file is correctly loaded
+   * when needed.
+   */
+  function testPreprocessForSuggestions() {
+    // Test with both an unprimed and primed theme registry.
+    drupal_theme_rebuild();
+    for ($i = 0; $i < 2; $i++) {
+      $this->drupalGet('theme-test/suggestion');
+      $this->assertText('Theme hook implementor=test_theme_theme_test__suggestion(). Foo=template_preprocess_theme_test', 'Theme hook suggestion ran with data available from a preprocess function for the base hook.');
+    }
+  }
+
+  /**
+   * Ensure page-front template suggestion is added when on front page.
+   */
+  function testFrontPageThemeSuggestion() {
+    $q = $_GET['q'];
+    // Set $_GET['q'] to node because theme_get_suggestions() will query it to
+    // see if we are on the front page.
+    $_GET['q'] = variable_get('site_frontpage', 'node');
+    $suggestions = theme_get_suggestions(explode('/', $_GET['q']), 'page');
+    // Set it back to not annoy the batch runner.
+    $_GET['q'] = $q;
+    $this->assertTrue(in_array('page__front', $suggestions), 'Front page template was suggested.');
+  }
+
+  /**
+   * Ensures theme hook_*_alter() implementations can run before anything is rendered.
+   */
+  function testAlter() {
+    $this->drupalGet('theme-test/alter');
+    $this->assertText('The altered data is test_theme_theme_test_alter_alter was invoked.', 'The theme was able to implement an alter hook during page building before anything was rendered.');
+  }
+
+  /**
+   * Ensures a theme's .info file is able to override a module CSS file from being added to the page.
+   *
+   * @see test_theme.info
+   */
+  function testCSSOverride() {
+    // Reuse the same page as in testPreprocessForSuggestions(). We're testing
+    // what is output to the HTML HEAD based on what is in a theme's .info file,
+    // so it doesn't matter what page we get, as long as it is themed with the
+    // test theme. First we test with CSS aggregation disabled.
+    variable_set('preprocess_css', 0);
+    $this->drupalGet('theme-test/suggestion');
+    $this->assertNoText('system.base.css', 'The theme\'s .info file is able to override a module CSS file from being added to the page.');
+
+    // Also test with aggregation enabled, simply ensuring no PHP errors are
+    // triggered during drupal_build_css_cache() when a source file doesn't
+    // exist. Then allow remaining tests to continue with aggregation disabled
+    // by default.
+    variable_set('preprocess_css', 1);
+    $this->drupalGet('theme-test/suggestion');
+    variable_set('preprocess_css', 0);
+  }
+
+  /**
+   * Ensures the theme registry is rebuilt when modules are disabled/enabled.
+   */
+  function testRegistryRebuild() {
+    $this->assertIdentical(theme('theme_test_foo', array('foo' => 'a')), 'a', 'The theme registry contains theme_test_foo.');
+
+    module_disable(array('theme_test'), FALSE);
+    $this->assertIdentical(theme('theme_test_foo', array('foo' => 'b')), '', 'The theme registry does not contain theme_test_foo, because the module is disabled.');
+
+    module_enable(array('theme_test'), FALSE);
+    $this->assertIdentical(theme('theme_test_foo', array('foo' => 'c')), 'c', 'The theme registry contains theme_test_foo again after re-enabling the module.');
+  }
+
+  /**
+   * Test the list_themes() function.
+   */
+  function testListThemes() {
+    $themes = list_themes();
+    // Check if drupal_theme_access() retrieves enabled themes properly from list_themes().
+    $this->assertTrue(drupal_theme_access('test_theme'), 'Enabled theme detected');
+    // Check if list_themes() returns disabled themes.
+    $this->assertTrue(array_key_exists('test_basetheme', $themes), 'Disabled theme detected');
+    // Check for base theme and subtheme lists.
+    $base_theme_list = array('test_basetheme' => 'Theme test base theme');
+    $sub_theme_list = array('test_subtheme' => 'Theme test subtheme');
+    $this->assertIdentical($themes['test_basetheme']->sub_themes, $sub_theme_list, 'Base theme\'s object includes list of subthemes.');
+    $this->assertIdentical($themes['test_subtheme']->base_themes, $base_theme_list, 'Subtheme\'s object includes list of base themes.');
+    // Check for theme engine in subtheme.
+    $this->assertIdentical($themes['test_subtheme']->engine, 'phptemplate', 'Subtheme\'s object includes the theme engine.');
+    // Check for theme engine prefix.
+    $this->assertIdentical($themes['test_basetheme']->prefix, 'phptemplate', 'Base theme\'s object includes the theme engine prefix.');
+    $this->assertIdentical($themes['test_subtheme']->prefix, 'phptemplate', 'Subtheme\'s object includes the theme engine prefix.');
+  }
+
+  /**
+   * Test the theme_get_setting() function.
+   */
+  function testThemeGetSetting() {
+    $GLOBALS['theme_key'] = 'test_theme';
+    $this->assertIdentical(theme_get_setting('theme_test_setting'), 'default value', 'theme_get_setting() uses the default theme automatically.');
+    $this->assertNotEqual(theme_get_setting('subtheme_override', 'test_basetheme'), theme_get_setting('subtheme_override', 'test_subtheme'), 'Base theme\'s default settings values can be overridden by subtheme.');
+    $this->assertIdentical(theme_get_setting('basetheme_only', 'test_subtheme'), 'base theme value', 'Base theme\'s default settings values are inherited by subtheme.');
+  }
+}
+
+/**
+ * Unit tests for theme_table().
+ */
+class ThemeTableTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Theme Table',
+      'description' => 'Tests built-in theme functions.',
+      'group' => 'Theme',
+    );
+  }
+
+  /**
+   * Tableheader.js provides 'sticky' table headers, and is included by default.
+   */
+  function testThemeTableStickyHeaders() {
+    $header = array('one', 'two', 'three');
+    $rows = array(array(1,2,3), array(4,5,6), array(7,8,9));
+    $this->content = theme('table', array('header' => $header, 'rows' => $rows));
+    $js = drupal_add_js();
+    $this->assertTrue(isset($js['misc/tableheader.js']), 'tableheader.js was included when $sticky = TRUE.');
+    $this->assertRaw('sticky-enabled', 'Table has a class of sticky-enabled when $sticky = TRUE.');
+    drupal_static_reset('drupal_add_js');
+  }
+
+  /**
+   * If $sticky is FALSE, no tableheader.js should be included.
+   */
+  function testThemeTableNoStickyHeaders() {
+    $header = array('one', 'two', 'three');
+    $rows = array(array(1,2,3), array(4,5,6), array(7,8,9));
+    $attributes = array();
+    $caption = NULL;
+    $colgroups = array();
+    $this->content = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => $attributes, 'caption' => $caption, 'colgroups' => $colgroups, 'sticky' => FALSE));
+    $js = drupal_add_js();
+    $this->assertFalse(isset($js['misc/tableheader.js']), 'tableheader.js was not included because $sticky = FALSE.');
+    $this->assertNoRaw('sticky-enabled', 'Table does not have a class of sticky-enabled because $sticky = FALSE.');
+    drupal_static_reset('drupal_add_js');
+  }
+
+  /**
+   * Tests that the table header is printed correctly even if there are no rows,
+   * and that the empty text is displayed correctly.
+   */
+  function testThemeTableWithEmptyMessage() {
+    $header = array(
+      t('Header 1'),
+      array(
+        'data' => t('Header 2'),
+        'colspan' => 2,
+      ),
+    );
+    $this->content = theme('table', array('header' => $header, 'rows' => array(), 'empty' => t('No strings available.')));
+    $this->assertRaw('<tr class="odd"><td colspan="3" class="empty message">No strings available.</td>', 'Correct colspan was set on empty message.');
+    $this->assertRaw('<thead><tr><th>Header 1</th>', 'Table header was printed.');
+  }
+
+  /**
+   * Tests that the 'no_striping' option works correctly.
+   */
+  function testThemeTableWithNoStriping() {
+    $rows = array(
+      array(
+        'data' => array(1),
+        'no_striping' => TRUE,
+      ),
+    );
+    $this->content = theme('table', array('rows' => $rows));
+    $this->assertNoRaw('class="odd"', 'Odd/even classes were not added because $no_striping = TRUE.');
+    $this->assertNoRaw('no_striping', 'No invalid no_striping HTML attribute was printed.');
+  }
+}
+
+/**
+ * Unit tests for theme_item_list().
+ */
+class ThemeItemListUnitTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Theme item list',
+      'description' => 'Test the theme_item_list() function.',
+      'group' => 'Theme',
+    );
+  }
+
+  /**
+   * Test item list rendering.
+   */
+  function testItemList() {
+    $items = array('a', array('data' => 'b', 'children' => array('c' => 'c', 'd' => 'd', 'e' => 'e')), 'f');
+    $expected = '<div class="item-list"><ul><li class="first">a</li>
+<li>b<div class="item-list"><ul><li class="first">c</li>
+<li>d</li>
+<li class="last">e</li>
+</ul></div></li>
+<li class="last">f</li>
+</ul></div>';
+    $output = theme('item_list', array('items' => $items));
+    $this->assertIdentical($expected, $output, 'Item list is rendered correctly.');
+  }
+}
+
+/**
+ * Unit tests for theme_links().
+ */
+class ThemeLinksTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Links',
+      'description' => 'Test the theme_links() function and rendering groups of links.',
+      'group' => 'Theme',
+    );
+  }
+
+  /**
+   * Test the use of drupal_pre_render_links() on a nested array of links.
+   */
+  function testDrupalPreRenderLinks() {
+    // Define the base array to be rendered, containing a variety of different
+    // kinds of links.
+    $base_array = array(
+      '#theme' => 'links',
+      '#pre_render' => array('drupal_pre_render_links'),
+      '#links' => array(
+        'parent_link' => array(
+          'title' => 'Parent link original',
+          'href' => 'parent-link-original',
+        ),
+      ),
+      'first_child' => array(
+        '#theme' => 'links',
+        '#links' => array(
+          // This should be rendered if 'first_child' is rendered separately,
+          // but ignored if the parent is being rendered (since it duplicates
+          // one of the parent's links).
+          'parent_link' => array(
+            'title' => 'Parent link copy',
+            'href' => 'parent-link-copy',
+          ),
+          // This should always be rendered.
+          'first_child_link' => array(
+            'title' => 'First child link',
+            'href' => 'first-child-link',
+          ),
+        ),
+      ),
+      // This should always be rendered as part of the parent.
+      'second_child' => array(
+        '#theme' => 'links',
+        '#links' => array(
+          'second_child_link' => array(
+            'title' => 'Second child link',
+            'href' => 'second-child-link',
+          ),
+        ),
+      ),
+      // This should never be rendered, since the user does not have access to
+      // it.
+      'third_child' => array(
+        '#theme' => 'links',
+        '#links' => array(
+          'third_child_link' => array(
+            'title' => 'Third child link',
+            'href' => 'third-child-link',
+          ),
+        ),
+        '#access' => FALSE,
+      ),
+    );
+
+    // Start with a fresh copy of the base array, and try rendering the entire
+    // thing. We expect a single <ul> with appropriate links contained within
+    // it.
+    $render_array = $base_array;
+    $html = drupal_render($render_array);
+    $dom = new DOMDocument();
+    $dom->loadHTML($html);
+    $this->assertEqual($dom->getElementsByTagName('ul')->length, 1, 'One "ul" tag found in the rendered HTML.');
+    $list_elements = $dom->getElementsByTagName('li');
+    $this->assertEqual($list_elements->length, 3, 'Three "li" tags found in the rendered HTML.');
+    $this->assertEqual($list_elements->item(0)->nodeValue, 'Parent link original', 'First expected link found.');
+    $this->assertEqual($list_elements->item(1)->nodeValue, 'First child link', 'Second expected link found.');
+    $this->assertEqual($list_elements->item(2)->nodeValue, 'Second child link', 'Third expected link found.');
+    $this->assertIdentical(strpos($html, 'Parent link copy'), FALSE, '"Parent link copy" link not found.');
+    $this->assertIdentical(strpos($html, 'Third child link'), FALSE, '"Third child link" link not found.');
+
+    // Now render 'first_child', followed by the rest of the links, and make
+    // sure we get two separate <ul>'s with the appropriate links contained
+    // within each.
+    $render_array = $base_array;
+    $child_html = drupal_render($render_array['first_child']);
+    $parent_html = drupal_render($render_array);
+    // First check the child HTML.
+    $dom = new DOMDocument();
+    $dom->loadHTML($child_html);
+    $this->assertEqual($dom->getElementsByTagName('ul')->length, 1, 'One "ul" tag found in the rendered child HTML.');
+    $list_elements = $dom->getElementsByTagName('li');
+    $this->assertEqual($list_elements->length, 2, 'Two "li" tags found in the rendered child HTML.');
+    $this->assertEqual($list_elements->item(0)->nodeValue, 'Parent link copy', 'First expected link found.');
+    $this->assertEqual($list_elements->item(1)->nodeValue, 'First child link', 'Second expected link found.');
+    // Then check the parent HTML.
+    $dom = new DOMDocument();
+    $dom->loadHTML($parent_html);
+    $this->assertEqual($dom->getElementsByTagName('ul')->length, 1, 'One "ul" tag found in the rendered parent HTML.');
+    $list_elements = $dom->getElementsByTagName('li');
+    $this->assertEqual($list_elements->length, 2, 'Two "li" tags found in the rendered parent HTML.');
+    $this->assertEqual($list_elements->item(0)->nodeValue, 'Parent link original', 'First expected link found.');
+    $this->assertEqual($list_elements->item(1)->nodeValue, 'Second child link', 'Second expected link found.');
+    $this->assertIdentical(strpos($parent_html, 'First child link'), FALSE, '"First child link" link not found.');
+    $this->assertIdentical(strpos($parent_html, 'Third child link'), FALSE, '"Third child link" link not found.');
+  }
+}
+
+/**
+ * Functional test for initialization of the theme system in hook_init().
+ */
+class ThemeHookInitTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Theme initialization in hook_init()',
+      'description' => 'Tests that the theme system can be correctly initialized in hook_init().',
+      'group' => 'Theme',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('theme_test');
+  }
+
+  /**
+   * Test that the theme system can generate output when called by hook_init().
+   */
+  function testThemeInitializationHookInit() {
+    $this->drupalGet('theme-test/hook-init');
+    $this->assertRaw('Themed output generated in hook_init()', 'Themed output generated in hook_init() correctly appears on the page.');
+    $this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page when the theme system is initialized in hook_init().");
+  }
+}
+
+/**
+ * Tests autocompletion not loading registry.
+ */
+class ThemeFastTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Theme fast initialization',
+      'description' => 'Test that autocompletion does not load the registry.',
+      'group' => 'Theme'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('theme_test');
+    $this->account = $this->drupalCreateUser(array('access user profiles'));
+  }
+
+  /**
+   * Tests access to user autocompletion and verify the correct results.
+   */
+  function testUserAutocomplete() {
+    $this->drupalLogin($this->account);
+    $this->drupalGet('user/autocomplete/' . $this->account->name);
+    $this->assertText('registry not initialized', 'The registry was not initialized');
+  }
+}
+
+/**
+ * Unit tests for theme_html_tag().
+ */
+class ThemeHtmlTag extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Theme HTML Tag',
+      'description' => 'Tests theme_html_tag() built-in theme functions.',
+      'group' => 'Theme',
+    );
+  }
+
+  /**
+   * Test function theme_html_tag()
+   */
+  function testThemeHtmlTag() {
+    // Test auto-closure meta tag generation
+    $tag['element'] = array('#tag' => 'meta', '#attributes' => array('name' => 'description', 'content' => 'Drupal test'));
+    $this->assertEqual('<meta name="description" content="Drupal test" />'."\n", theme_html_tag($tag), 'Test auto-closure meta tag generation.');
+
+    // Test title tag generation
+    $tag['element'] = array('#tag' => 'title', '#value' => 'title test');
+    $this->assertEqual('<title>title test</title>'."\n", theme_html_tag($tag), 'Test title tag generation.');
+  }
+}
+
+/**
+ * Tests for the ThemeRegistry class.
+ */
+class ThemeRegistryTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'ThemeRegistry',
+      'description' => 'Tests the behavior of the ThemeRegistry class',
+      'group' => 'Theme',
+    );
+  }
+  function setUp() {
+    parent::setUp('theme_test');
+  }
+
+  /**
+   * Tests the behavior of the theme registry class.
+   */
+  function testRaceCondition() {
+    $_SERVER['REQUEST_METHOD'] = 'GET';
+    $cid = 'test_theme_registry';
+
+    // Directly instantiate the theme registry, this will cause a base cache
+    // entry to be written in __construct().
+    $registry = new ThemeRegistry($cid, 'cache');
+
+    $this->assertTrue(cache_get($cid), 'Cache entry was created.');
+
+    // Trigger a cache miss for an offset.
+    $this->assertTrue($registry['theme_test_template_test'], 'Offset was returned correctly from the theme registry.');
+    // This will cause the ThemeRegistry class to write an updated version of
+    // the cache entry when it is destroyed, usually at the end of the request.
+    // Before that happens, manually delete the cache entry we created earlier
+    // so that the new entry is written from scratch.
+    cache_clear_all($cid, 'cache');
+
+    // Destroy the class so that it triggers a cache write for the offset.
+    unset($registry);
+
+    $this->assertTrue(cache_get($cid), 'Cache entry was created.');
+
+    // Create a new instance of the class. Confirm that both the offset
+    // requested previously, and one that has not yet been requested are both
+    // available.
+    $registry = new ThemeRegistry($cid, 'cache');
+
+    $this->assertTrue($registry['theme_test_template_test'], 'Offset was returned correctly from the theme registry');
+    $this->assertTrue($registry['theme_test_template_test_2'], 'Offset was returned correctly from the theme registry');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/theme_test.inc b/htmltest/modules/simpletest/tests/theme_test.inc
new file mode 100644
index 00000000..6cde6838
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/theme_test.inc
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * Returns HTML for the 'theme_test' theme hook used by tests.
+ */
+function theme_theme_test($variables) {
+  return 'Theme hook implementor=theme_theme_test(). Foo=' . $variables['foo'];
+}
+
+/**
+ * Preprocesses variables for theme_theme_test().
+ */
+function template_preprocess_theme_test(&$variables) {
+  $variables['foo'] = 'template_preprocess_theme_test';
+}
diff --git a/htmltest/modules/simpletest/tests/theme_test.info b/htmltest/modules/simpletest/tests/theme_test.info
new file mode 100644
index 00000000..027213d4
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/theme_test.info
@@ -0,0 +1,12 @@
+name = "Theme test"
+description = "Support module for theme system testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/theme_test.module b/htmltest/modules/simpletest/tests/theme_test.module
new file mode 100644
index 00000000..61a12bb7
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/theme_test.module
@@ -0,0 +1,134 @@
+<?php
+
+/**
+ * Implements hook_theme().
+ */
+function theme_test_theme($existing, $type, $theme, $path) {
+  $items['theme_test'] = array(
+    'file' => 'theme_test.inc',
+    'variables' => array('foo' => ''),
+  );
+  $items['theme_test_template_test'] = array(
+    'template' => 'theme_test.template_test',
+  );
+  $items['theme_test_template_test_2'] = array(
+    'template' => 'theme_test.template_test',
+  );
+  $items['theme_test_foo'] = array(
+    'variables' => array('foo' => NULL),
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_system_theme_info().
+ */
+function theme_test_system_theme_info() {
+  $themes['test_theme'] = drupal_get_path('module', 'theme_test') . '/themes/test_theme/test_theme.info';
+  $themes['test_basetheme'] = drupal_get_path('module', 'theme_test') . '/themes/test_basetheme/test_basetheme.info';
+  $themes['test_subtheme'] = drupal_get_path('module', 'theme_test') . '/themes/test_subtheme/test_subtheme.info';
+  return $themes;
+}
+
+/**
+ * Implements hook_menu().
+ */
+function theme_test_menu() {
+  $items['theme-test/suggestion'] = array(
+    'title' => 'Suggestion',
+    'page callback' => '_theme_test_suggestion',
+    'access arguments' => array('access content'),
+    'theme callback' => '_theme_custom_theme',
+    'type' => MENU_CALLBACK,
+  );
+  $items['theme-test/alter'] = array(
+    'title' => 'Suggestion',
+    'page callback' => '_theme_test_alter',
+    'access arguments' => array('access content'),
+    'theme callback' => '_theme_custom_theme',
+    'type' => MENU_CALLBACK,
+  );
+  $items['theme-test/hook-init'] = array(
+    'page callback' => 'theme_test_hook_init_page_callback',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_init().
+ */
+function theme_test_init() {
+  if (arg(0) == 'theme-test' && arg(1) == 'hook-init') {
+    // First, force the theme registry to be rebuilt on this page request. This
+    // allows us to test a full initialization of the theme system in the code
+    // below.
+    drupal_theme_rebuild();
+    // Next, initialize the theme system by storing themed text in a global
+    // variable. We will use this later in theme_test_hook_init_page_callback()
+    // to test that even when the theme system is initialized this early, it is
+    // still capable of returning output and theming the page as a whole.
+    $GLOBALS['theme_test_output'] = theme('more_link', array('url' => 'user', 'title' => 'Themed output generated in hook_init()'));
+  }
+}
+
+/**
+ * Implements hook_exit().
+ */
+function theme_test_exit() {
+  if (arg(0) == 'user') {
+    // Register a fake registry loading callback. If it gets called by
+    // theme_get_registry(), the registry has not been initialized yet.
+    _theme_registry_callback('_theme_test_load_registry', array());
+    print theme_get_registry() ? 'registry initialized' : 'registry not initialized';
+  }
+}
+
+/**
+ * Fake registry loading callback.
+ */
+function _theme_test_load_registry() {
+  return array();
+}
+
+/**
+ * Menu callback for testing themed output generated in hook_init().
+ */
+function theme_test_hook_init_page_callback() {
+  return $GLOBALS['theme_test_output'];
+}
+
+/**
+ * Custom theme callback.
+ */
+function _theme_custom_theme() {
+  return 'test_theme';
+}
+
+/**
+ * Page callback, calls drupal_alter().
+ *
+ * This is for testing that the theme can have hook_*_alter() implementations
+ * that run during page callback execution, even before theme() is called for
+ * the first time.
+ */
+function _theme_test_alter() {
+  $data = 'foo';
+  drupal_alter('theme_test_alter', $data);
+  return "The altered data is $data.";
+}
+
+/**
+ * Page callback, calls a theme hook suggestion.
+ */
+function _theme_test_suggestion() {
+  return theme(array('theme_test__suggestion', 'theme_test'), array());
+}
+
+/**
+ * Theme function for testing theme('theme_test_foo').
+ */
+function theme_theme_test_foo($variables) {
+  return $variables['foo'];
+}
diff --git a/htmltest/modules/simpletest/tests/theme_test.template_test.tpl.php b/htmltest/modules/simpletest/tests/theme_test.template_test.tpl.php
new file mode 100644
index 00000000..cde8faad
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/theme_test.template_test.tpl.php
@@ -0,0 +1,2 @@
+<!-- Output for Theme API test -->
+Fail: Template not overridden.
diff --git a/htmltest/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info b/htmltest/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info
new file mode 100644
index 00000000..0b57cc05
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/themes/test_basetheme/test_basetheme.info
@@ -0,0 +1,13 @@
+name = Theme test base theme
+description = Test theme which acts as a base theme for other test subthemes.
+core = 7.x
+hidden = TRUE
+
+settings[basetheme_only] = base theme value
+settings[subtheme_override] = base theme value
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info b/htmltest/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info
new file mode 100644
index 00000000..d0b0c334
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/themes/test_subtheme/test_subtheme.info
@@ -0,0 +1,13 @@
+name = Theme test subtheme
+description = Test theme which uses test_basetheme as the base theme.
+core = 7.x
+base theme = test_basetheme
+hidden = TRUE
+
+settings[subtheme_override] = subtheme value
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/themes/test_theme/template.php b/htmltest/modules/simpletest/tests/themes/test_theme/template.php
new file mode 100644
index 00000000..8275818e
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/themes/test_theme/template.php
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * Tests a theme overriding a suggestion of a base theme hook.
+ */
+function test_theme_theme_test__suggestion($variables) {
+  return 'Theme hook implementor=test_theme_theme_test__suggestion(). Foo=' . $variables['foo'];
+}
+
+/**
+ * Tests a theme implementing an alter hook.
+ *
+ * The confusing function name here is due to this being an implementation of
+ * the alter hook invoked when the 'theme_test' module calls
+ * drupal_alter('theme_test_alter').
+ */
+function test_theme_theme_test_alter_alter(&$data) {
+  $data = 'test_theme_theme_test_alter_alter was invoked';
+}
diff --git a/htmltest/modules/simpletest/tests/themes/test_theme/test_theme.info b/htmltest/modules/simpletest/tests/themes/test_theme/test_theme.info
new file mode 100644
index 00000000..f9ddce38
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/themes/test_theme/test_theme.info
@@ -0,0 +1,24 @@
+name = Test theme
+description = Theme for testing the theme system
+core = 7.x
+hidden = TRUE
+
+; Normally, themes may list CSS files like this, and if they exist in the theme
+; folder, then they get added to the page. If they have the same file name as a
+; module CSS file, then the theme's version overrides the module's version, so
+; that the module's version is not added to the page. Additionally, a theme may
+; have an entry like this one, without having the corresponding CSS file in the
+; theme's folder, and in this case, it just stops the module's version from
+; being loaded, and does not replace it with an alternate version. We have this
+; here in order for a test to ensure that this correctly prevents the module
+; version from being loaded, and that errors aren't caused by the lack of this
+; file within the theme folder.
+stylesheets[all][] = system.base.css
+
+settings[theme_test_setting] = default value
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/unicode.test b/htmltest/modules/simpletest/tests/unicode.test
new file mode 100644
index 00000000..4aaf26db
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/unicode.test
@@ -0,0 +1,305 @@
+<?php
+
+/**
+ * @file
+ * Various unicode handling tests.
+ */
+
+/**
+ * Test unicode handling features implemented in unicode.inc.
+ */
+class UnicodeUnitTest extends DrupalUnitTestCase {
+
+  /**
+   * Whether to run the extended version of the tests (including non latin1 characters).
+   *
+   * @var boolean
+   */
+  protected $extendedMode = FALSE;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Unicode handling',
+      'description' => 'Tests Drupal Unicode handling.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Test full unicode features implemented using the mbstring extension.
+   */
+  function testMbStringUnicode() {
+    global $multibyte;
+
+    // mbstring was not detected on this installation, there is no way to test
+    // multibyte features. Treat that as an exception.
+    if ($multibyte == UNICODE_SINGLEBYTE) {
+      $this->error(t('Unable to test Multibyte features: mbstring extension was not detected.'));
+    }
+
+    $multibyte = UNICODE_MULTIBYTE;
+
+    $this->extendedMode = TRUE;
+    $this->pass(t('Testing in mbstring mode'));
+
+    $this->helperTestStrToLower();
+    $this->helperTestStrToUpper();
+    $this->helperTestUcFirst();
+    $this->helperTestStrLen();
+    $this->helperTestSubStr();
+    $this->helperTestTruncate();
+  }
+
+  /**
+   * Test emulated unicode features.
+   */
+  function testEmulatedUnicode() {
+    global $multibyte;
+
+    $multibyte = UNICODE_SINGLEBYTE;
+
+    $this->extendedMode = FALSE;
+
+    $this->pass(t('Testing in emulated (best-effort) mode'));
+
+    $this->helperTestStrToLower();
+    $this->helperTestStrToUpper();
+    $this->helperTestUcFirst();
+    $this->helperTestStrLen();
+    $this->helperTestSubStr();
+    $this->helperTestTruncate();
+  }
+
+  function helperTestStrToLower() {
+    $testcase = array(
+      'tHe QUIcK bRoWn' => 'the quick brown',
+      'FrançAIS is ÜBER-åwesome' => 'français is über-åwesome',
+    );
+    if ($this->extendedMode) {
+      $testcase['ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΣὨ'] = 'αβγδεζηθικλμνξοσὠ';
+    }
+
+    foreach ($testcase as $input => $output) {
+      $this->assertEqual(drupal_strtolower($input), $output, format_string('%input is lowercased as %output', array('%input' => $input, '%output' => $output)));
+    }
+  }
+
+  function helperTestStrToUpper() {
+    $testcase = array(
+      'tHe QUIcK bRoWn' => 'THE QUICK BROWN',
+      'FrançAIS is ÜBER-åwesome' => 'FRANÇAIS IS ÜBER-ÅWESOME',
+    );
+    if ($this->extendedMode) {
+      $testcase['αβγδεζηθικλμνξοσὠ'] = 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΣὨ';
+    }
+
+    foreach ($testcase as $input => $output) {
+      $this->assertEqual(drupal_strtoupper($input), $output, format_string('%input is uppercased as %output', array('%input' => $input, '%output' => $output)));
+    }
+  }
+
+  function helperTestUcFirst() {
+    $testcase = array(
+      'tHe QUIcK bRoWn' => 'THe QUIcK bRoWn',
+      'françAIS' => 'FrançAIS',
+      'über' => 'Über',
+      'åwesome' => 'Åwesome'
+    );
+    if ($this->extendedMode) {
+      $testcase['σion'] = 'Σion';
+    }
+
+    foreach ($testcase as $input => $output) {
+      $this->assertEqual(drupal_ucfirst($input), $output, format_string('%input is ucfirst-ed as %output', array('%input' => $input, '%output' => $output)));
+    }
+  }
+
+  function helperTestStrLen() {
+    $testcase = array(
+      'tHe QUIcK bRoWn' => 15,
+      'ÜBER-åwesome' => 12,
+    );
+
+    foreach ($testcase as $input => $output) {
+      $this->assertEqual(drupal_strlen($input), $output, format_string('%input length is %output', array('%input' => $input, '%output' => $output)));
+    }
+  }
+
+  function helperTestSubStr() {
+    $testcase = array(
+      //     012345678901234567890123
+      array('frànçAIS is über-åwesome', 0, 0,
+            ''),
+      array('frànçAIS is über-åwesome', 0, 1,
+            'f'),
+      array('frànçAIS is über-åwesome', 0, 8,
+            'frànçAIS'),
+      array('frànçAIS is über-åwesome', 0, 23,
+            'frànçAIS is über-åwesom'),
+      array('frànçAIS is über-åwesome', 0, 24,
+            'frànçAIS is über-åwesome'),
+      array('frànçAIS is über-åwesome', 0, 25,
+            'frànçAIS is über-åwesome'),
+      array('frànçAIS is über-åwesome', 0, 100,
+            'frànçAIS is über-åwesome'),
+      array('frànçAIS is über-åwesome', 4, 4,
+                'çAIS'),
+      array('frànçAIS is über-åwesome', 1, 0,
+            ''),
+      array('frànçAIS is über-åwesome', 100, 0,
+            ''),
+      array('frànçAIS is über-åwesome', -4, 2,
+                                'so'),
+      array('frànçAIS is über-åwesome', -4, 3,
+                                'som'),
+      array('frànçAIS is über-åwesome', -4, 4,
+                                'some'),
+      array('frànçAIS is über-åwesome', -4, 5,
+                                'some'),
+      array('frànçAIS is über-åwesome', -7, 10,
+                             'åwesome'),
+      array('frànçAIS is über-åwesome', 5, -10,
+                 'AIS is üb'),
+      array('frànçAIS is über-åwesome', 0, -10,
+            'frànçAIS is üb'),
+      array('frànçAIS is über-åwesome', 0, -1,
+        'frànçAIS is über-åwesom'),
+      array('frànçAIS is über-åwesome', -7, -2,
+                             'åweso'),
+      array('frànçAIS is über-åwesome', -7, -6,
+                             'å'),
+      array('frànçAIS is über-åwesome', -7, -7,
+                             ''),
+      array('frànçAIS is über-åwesome', -7, -8,
+                             ''),
+      array('...', 0, 2, '..'),
+      array('以呂波耳・ほへとち。リヌルヲ。', 1, 3,
+              '呂波耳'),
+
+    );
+
+    foreach ($testcase as $test) {
+      list($input, $start, $length, $output) = $test;
+      $result = drupal_substr($input, $start, $length);
+      $this->assertEqual($result, $output, format_string('%input substring at offset %offset for %length characters is %output (got %result)', array('%input' => $input, '%offset' => $start, '%length' => $length, '%output' => $output, '%result' => $result)));
+    }
+  }
+
+  /**
+   * Test decode_entities().
+   */
+  function testDecodeEntities() {
+    $testcase = array(
+      'Drupal' => 'Drupal',
+      '<script>' => '<script>',
+      '&lt;script&gt;' => '<script>',
+      '&#60;script&#62;' => '<script>',
+      '&amp;lt;script&amp;gt;' => '&lt;script&gt;',
+      '"' => '"',
+      '&#34;' => '"',
+      '&amp;#34;' => '&#34;',
+      '&quot;' => '"',
+      '&amp;quot;' => '&quot;',
+      "'" => "'",
+      '&#39;' => "'",
+      '&amp;#39;' => '&#39;',
+      '©' => '©',
+      '&copy;' => '©',
+      '&#169;' => '©',
+      '→' => '→',
+      '&#8594;' => '→',
+      '➼' => '➼',
+      '&#10172;' => '➼',
+      '&euro;' => '€',
+    );
+    foreach ($testcase as $input => $output) {
+      $this->assertEqual(decode_entities($input), $output, format_string('Make sure the decoded entity of @input is @output', array('@input' => $input, '@output' => $output)));
+    }
+  }
+
+  /**
+   * Tests truncate_utf8().
+   */
+  function helperTestTruncate() {
+    // Each case is an array with input string, length to truncate to, and
+    // expected return value.
+
+    // Test non-wordsafe, non-ellipsis cases.
+    $non_wordsafe_non_ellipsis_cases = array(
+      array('frànçAIS is über-åwesome', 24, 'frànçAIS is über-åwesome'),
+      array('frànçAIS is über-åwesome', 23, 'frànçAIS is über-åwesom'),
+      array('frànçAIS is über-åwesome', 17, 'frànçAIS is über-'),
+      array('以呂波耳・ほへとち。リヌルヲ。', 6, '以呂波耳・ほ'),
+    );
+    $this->runTruncateTests($non_wordsafe_non_ellipsis_cases, FALSE, FALSE);
+
+    // Test non-wordsafe, ellipsis cases.
+    $non_wordsafe_ellipsis_cases = array(
+      array('frànçAIS is über-åwesome', 24, 'frànçAIS is über-åwesome'),
+      array('frànçAIS is über-åwesome', 23, 'frànçAIS is über-åwe...'),
+      array('frànçAIS is über-åwesome', 17, 'frànçAIS is üb...'),
+    );
+    $this->runTruncateTests($non_wordsafe_ellipsis_cases, FALSE, TRUE);
+
+    // Test wordsafe, ellipsis cases.
+    $wordsafe_ellipsis_cases = array(
+      array('123', 1, '.'),
+      array('123', 2, '..'),
+      array('123', 3, '123'),
+      array('1234', 3, '...'),
+      array('1234567890', 10, '1234567890'),
+      array('12345678901', 10, '1234567...'),
+      array('12345678901', 11, '12345678901'),
+      array('123456789012', 11, '12345678...'),
+      array('12345 7890', 10, '12345 7890'),
+      array('12345 7890', 9, '12345...'),
+      array('123 567 90', 10, '123 567 90'),
+      array('123 567 901', 10, '123 567...'),
+      array('Stop. Hammertime.', 17, 'Stop. Hammertime.'),
+      array('Stop. Hammertime.', 16, 'Stop....'),
+      array('frànçAIS is über-åwesome', 24, 'frànçAIS is über-åwesome'),
+      array('frànçAIS is über-åwesome', 23, 'frànçAIS is über...'),
+      array('frànçAIS is über-åwesome', 17, 'frànçAIS is...'),
+      array('¿Dónde está el niño?', 20, '¿Dónde está el niño?'),
+      array('¿Dónde está el niño?', 19, '¿Dónde está el...'),
+      array('¿Dónde está el niño?', 15, '¿Dónde está...'),
+      array('¿Dónde está el niño?', 10, '¿Dónde...'),
+      array('Help! Help! Help!', 17, 'Help! Help! Help!'),
+      array('Help! Help! Help!', 16, 'Help! Help!...'),
+      array('Help! Help! Help!', 15, 'Help! Help!...'),
+      array('Help! Help! Help!', 14, 'Help! Help!...'),
+      array('Help! Help! Help!', 13, 'Help! Help...'),
+      array('Help! Help! Help!', 12, 'Help!...'),
+      array('Help! Help! Help!', 11, 'Help!...'),
+      array('Help! Help! Help!', 10, 'Help!...'),
+      array('Help! Help! Help!', 9, 'Help!...'),
+      array('Help! Help! Help!', 8, 'Help!...'),
+      array('Help! Help! Help!', 7, 'Help...'),
+      array('Help! Help! Help!', 6, 'Hel...'),
+      array('Help! Help! Help!', 5, 'He...'),
+    );
+    $this->runTruncateTests($wordsafe_ellipsis_cases, TRUE, TRUE);
+  }
+
+  /**
+   * Runs test cases for helperTestTruncate().
+   *
+   * Runs each test case through truncate_utf8() and compares the output
+   * to the expected output.
+   *
+   * @param $cases
+   *   Cases array. Each case is an array with the input string, length to
+   *   truncate to, and expected output.
+   * @param $wordsafe
+   *   TRUE to use word-safe truncation, FALSE to not use word-safe truncation.
+   * @param $ellipsis
+   *   TRUE to append ... if the input is truncated, FALSE to not append ....
+   */
+  function runTruncateTests($cases, $wordsafe, $ellipsis) {
+    foreach ($cases as $case) {
+      list($input, $max_length, $expected) = $case;
+      $output = truncate_utf8($input, $max_length, $wordsafe, $ellipsis);
+      $this->assertEqual($output, $expected, format_string('%input truncate to %length characters with %wordsafe, %ellipsis is %expected (got %output)', array('%input' => $input, '%length' => $max_length, '%output' => $output, '%expected' => $expected, '%wordsafe' => ($wordsafe ? 'word-safe' : 'not word-safe'), '%ellipsis' => ($ellipsis ? 'ellipsis' : 'not ellipsis'))));
+    }
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/update.test b/htmltest/modules/simpletest/tests/update.test
new file mode 100644
index 00000000..16060857
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/update.test
@@ -0,0 +1,115 @@
+<?php
+
+/**
+ * @file
+ * Tests for the update system.
+ */
+
+/**
+ * Tests for the update dependency ordering system.
+ */
+class UpdateDependencyOrderingTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Update dependency ordering',
+      'description' => 'Test that update functions are run in the proper order.',
+      'group' => 'Update API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('update_test_1', 'update_test_2', 'update_test_3');
+    require_once DRUPAL_ROOT . '/includes/update.inc';
+  }
+
+  /**
+   * Test that updates within a single module run in the correct order.
+   */
+  function testUpdateOrderingSingleModule() {
+    $starting_updates = array(
+      'update_test_1' => 7000,
+    );
+    $expected_updates = array(
+      'update_test_1_update_7000',
+      'update_test_1_update_7001',
+      'update_test_1_update_7002',
+    );
+    $actual_updates = array_keys(update_resolve_dependencies($starting_updates));
+    $this->assertEqual($expected_updates, $actual_updates, 'Updates within a single module run in the correct order.');
+  }
+
+  /**
+   * Test that dependencies between modules are resolved correctly.
+   */
+  function testUpdateOrderingModuleInterdependency() {
+    $starting_updates = array(
+      'update_test_2' => 7000,
+      'update_test_3' => 7000,
+    );
+    $update_order = array_keys(update_resolve_dependencies($starting_updates));
+    // Make sure that each dependency is satisfied.
+    $first_dependency_satisfied = array_search('update_test_2_update_7000', $update_order) < array_search('update_test_3_update_7000', $update_order);
+    $this->assertTrue($first_dependency_satisfied, 'The dependency of the second module on the first module is respected by the update function order.');
+    $second_dependency_satisfied = array_search('update_test_3_update_7000', $update_order) < array_search('update_test_2_update_7001', $update_order);
+    $this->assertTrue($second_dependency_satisfied, 'The dependency of the first module on the second module is respected by the update function order.');
+  }
+}
+
+/**
+ * Tests for missing update dependencies.
+ */
+class UpdateDependencyMissingTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Missing update dependencies',
+      'description' => 'Test that missing update dependencies are correctly flagged.',
+      'group' => 'Update API',
+    );
+  }
+
+  function setUp() {
+    // Only install update_test_2.module, even though its updates have a
+    // dependency on update_test_3.module.
+    parent::setUp('update_test_2');
+    require_once DRUPAL_ROOT . '/includes/update.inc';
+  }
+
+  function testMissingUpdate() {
+    $starting_updates = array(
+      'update_test_2' => 7000,
+    );
+    $update_graph = update_resolve_dependencies($starting_updates);
+    $this->assertTrue($update_graph['update_test_2_update_7000']['allowed'], "The module's first update function is allowed to run, since it does not have any missing dependencies.");
+    $this->assertFalse($update_graph['update_test_2_update_7001']['allowed'], "The module's second update function is not allowed to run, since it has a direct dependency on a missing update.");
+    $this->assertFalse($update_graph['update_test_2_update_7002']['allowed'], "The module's third update function is not allowed to run, since it has an indirect dependency on a missing update.");
+  }
+}
+
+/**
+ * Tests for the invocation of hook_update_dependencies().
+ */
+class UpdateDependencyHookInvocationTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Update dependency hook invocation',
+      'description' => 'Test that the hook invocation for determining update dependencies works correctly.',
+      'group' => 'Update API',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('update_test_1', 'update_test_2');
+    require_once DRUPAL_ROOT . '/includes/update.inc';
+  }
+
+  /**
+   * Test the structure of the array returned by hook_update_dependencies().
+   */
+  function testHookUpdateDependencies() {
+    $update_dependencies = update_retrieve_dependencies();
+    $this->assertTrue($update_dependencies['system'][7000]['update_test_1'] == 7000, 'An update function that has a dependency on two separate modules has the first dependency recorded correctly.');
+    $this->assertTrue($update_dependencies['system'][7000]['update_test_2'] == 7001, 'An update function that has a dependency on two separate modules has the second dependency recorded correctly.');
+    $this->assertTrue($update_dependencies['system'][7001]['update_test_1'] == 7002, 'An update function that depends on more than one update from the same module only has the dependency on the higher-numbered update function recorded.');
+  }
+}
+
diff --git a/htmltest/modules/simpletest/tests/update_script_test.info b/htmltest/modules/simpletest/tests/update_script_test.info
new file mode 100644
index 00000000..18ff254f
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/update_script_test.info
@@ -0,0 +1,12 @@
+name = "Update script test"
+description = "Support module for update script testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/update_script_test.install b/htmltest/modules/simpletest/tests/update_script_test.install
new file mode 100644
index 00000000..6955ef11
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/update_script_test.install
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the update_script_test module.
+ */
+
+/**
+ * Implements hook_requirements().
+ */
+function update_script_test_requirements($phase) {
+  $requirements = array();
+
+  if ($phase == 'update') {
+    // Set a requirements warning or error when the test requests it.
+    $requirement_type = variable_get('update_script_test_requirement_type');
+    switch ($requirement_type) {
+      case REQUIREMENT_WARNING:
+        $requirements['update_script_test'] = array(
+          'title' => 'Update script test',
+          'value' => 'Warning',
+          'description' => 'This is a requirements warning provided by the update_script_test module.',
+          'severity' => REQUIREMENT_WARNING,
+        );
+        break;
+      case REQUIREMENT_ERROR:
+        $requirements['update_script_test'] = array(
+          'title' => 'Update script test',
+          'value' => 'Error',
+          'description' => 'This is a requirements error provided by the update_script_test module.',
+          'severity' => REQUIREMENT_ERROR,
+        );
+        break;
+    }
+  }
+
+  return $requirements;
+}
+
+/**
+ * Dummy update function to run during the tests.
+ */
+function update_script_test_update_7000() {
+  return t('The update_script_test_update_7000() update was executed successfully.');
+}
diff --git a/htmltest/modules/simpletest/tests/update_script_test.module b/htmltest/modules/simpletest/tests/update_script_test.module
new file mode 100644
index 00000000..beb5a71e
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/update_script_test.module
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * @file
+ * This file provides testing functionality for update.php.
+ */
+
+/**
+ * Implements hook_flush_caches().
+ *
+ * This sets a message to confirm that all caches are cleared whenever
+ * update.php completes.
+ *
+ * @see UpdateScriptFunctionalTest::testRequirements()
+ */
+function update_script_test_flush_caches() {
+  drupal_set_message(t('hook_flush_caches() invoked for update_script_test.module.'));
+}
diff --git a/htmltest/modules/simpletest/tests/update_test_1.info b/htmltest/modules/simpletest/tests/update_test_1.info
new file mode 100644
index 00000000..a8fb52cc
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/update_test_1.info
@@ -0,0 +1,12 @@
+name = "Update test"
+description = "Support module for update testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/update_test_1.install b/htmltest/modules/simpletest/tests/update_test_1.install
new file mode 100644
index 00000000..f4a86c7c
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/update_test_1.install
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the update_test_1 module.
+ */
+
+/**
+ * Implements hook_update_dependencies().
+ *
+ * @see update_test_2_update_dependencies()
+ */
+function update_test_1_update_dependencies() {
+  // These dependencies are used in combination with those declared in
+  // update_test_2_update_dependencies() for the sole purpose of testing that
+  // the results of hook_update_dependencies() are collected correctly and have
+  // the correct array structure. Therefore, we use updates from System module
+  // (which have already run), so that they will not get in the way of other
+  // tests.
+  $dependencies['system'][7000] = array(
+    // Compare to update_test_2_update_dependencies(), where the same System
+    // module update function is forced to depend on an update function from a
+    // different module. This allows us to test that both dependencies are
+    // correctly recorded.
+    'update_test_1' => 7000,
+  );
+  $dependencies['system'][7001] = array(
+    // Compare to update_test_2_update_dependencies(), where the same System
+    // module update function is forced to depend on a different update
+    // function within the same module. This allows us to test that only the
+    // dependency on the higher-numbered update function is recorded.
+    'update_test_1' => 7002,
+  );
+  return $dependencies;
+}
+
+/**
+ * Dummy update_test_1 update 7000.
+ */
+function update_test_1_update_7000() {
+}
+
+/**
+ * Dummy update_test_1 update 7001.
+ */
+function update_test_1_update_7001() {
+}
+
+/**
+ * Dummy update_test_1 update 7002.
+ */
+function update_test_1_update_7002() {
+}
diff --git a/htmltest/modules/simpletest/tests/update_test_1.module b/htmltest/modules/simpletest/tests/update_test_1.module
new file mode 100644
index 00000000..b3d9bbc7
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/update_test_1.module
@@ -0,0 +1 @@
+<?php
diff --git a/htmltest/modules/simpletest/tests/update_test_2.info b/htmltest/modules/simpletest/tests/update_test_2.info
new file mode 100644
index 00000000..a8fb52cc
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/update_test_2.info
@@ -0,0 +1,12 @@
+name = "Update test"
+description = "Support module for update testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/update_test_2.install b/htmltest/modules/simpletest/tests/update_test_2.install
new file mode 100644
index 00000000..9c076ff6
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/update_test_2.install
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the update_test_2 module.
+ */
+
+/**
+ * Implements hook_update_dependencies().
+ *
+ * @see update_test_1_update_dependencies()
+ * @see update_test_3_update_dependencies()
+ */
+function update_test_2_update_dependencies() {
+  // Combined with update_test_3_update_dependencies(), we are declaring here
+  // that these two modules run updates in the following order:
+  // 1. update_test_2_update_7000()
+  // 2. update_test_3_update_7000()
+  // 3. update_test_2_update_7001()
+  // 4. update_test_2_update_7002()
+  $dependencies['update_test_2'][7001] = array(
+    'update_test_3' => 7000,
+  );
+
+  // These are coordinated with the corresponding dependencies declared in
+  // update_test_1_update_dependencies().
+  $dependencies['system'][7000] = array(
+    'update_test_2' => 7001,
+  );
+  $dependencies['system'][7001] = array(
+    'update_test_1' => 7001,
+  );
+
+  return $dependencies;
+}
+
+/**
+ * Dummy update_test_2 update 7000.
+ */
+function update_test_2_update_7000() {
+}
+
+/**
+ * Dummy update_test_2 update 7001.
+ */
+function update_test_2_update_7001() {
+}
+
+/**
+ * Dummy update_test_2 update 7002.
+ */
+function update_test_2_update_7002() {
+}
diff --git a/htmltest/modules/simpletest/tests/update_test_2.module b/htmltest/modules/simpletest/tests/update_test_2.module
new file mode 100644
index 00000000..b3d9bbc7
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/update_test_2.module
@@ -0,0 +1 @@
+<?php
diff --git a/htmltest/modules/simpletest/tests/update_test_3.info b/htmltest/modules/simpletest/tests/update_test_3.info
new file mode 100644
index 00000000..a8fb52cc
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/update_test_3.info
@@ -0,0 +1,12 @@
+name = "Update test"
+description = "Support module for update testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/update_test_3.install b/htmltest/modules/simpletest/tests/update_test_3.install
new file mode 100644
index 00000000..c3f6b757
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/update_test_3.install
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the update_test_3 module.
+ */
+
+/**
+ * Implements hook_update_dependencies().
+ *
+ * @see update_test_2_update_dependencies()
+ */
+function update_test_3_update_dependencies() {
+  $dependencies['update_test_3'][7000] = array(
+    'update_test_2' => 7000,
+  );
+  return $dependencies;
+}
+
+/**
+ * Dummy update_test_3 update 7000.
+ */
+function update_test_3_update_7000() {
+}
diff --git a/htmltest/modules/simpletest/tests/update_test_3.module b/htmltest/modules/simpletest/tests/update_test_3.module
new file mode 100644
index 00000000..b3d9bbc7
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/update_test_3.module
@@ -0,0 +1 @@
+<?php
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-6.bare.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-6.bare.database.php
new file mode 100644
index 00000000..40c75627
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-6.bare.database.php
@@ -0,0 +1,8131 @@
+<?php
+
+/**
+ * @file
+ * Bare installation of Drupal 6.17, for test purposes.
+ *
+ * This file was generated by the dump-database-d6.sh tool, from a bare
+ * installation of Drupal 6, with only the following core optional modules
+ * enabled:
+ *  - dblog
+ *  - update
+ *
+ * Dblog fulfills the requirement that a module take care of watchdog calls,
+ * and update module is enabled at the end of installation.
+ */
+
+db_create_table('access', array(
+  'fields' => array(
+    'aid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'mask' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'type' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+  ),
+  'primary key' => array(
+    'aid',
+  ),
+  'module' => 'user',
+  'name' => 'access',
+));
+
+db_create_table('actions', array(
+  'fields' => array(
+    'aid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '0',
+    ),
+    'type' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'callback' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'parameters' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+    'description' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '0',
+    ),
+  ),
+  'primary key' => array(
+    'aid',
+  ),
+  'module' => 'system',
+  'name' => 'actions',
+));
+db_insert('actions')->fields(array(
+  'aid',
+  'type',
+  'callback',
+  'parameters',
+  'description',
+))
+->values(array(
+  'aid' => 'node_make_sticky_action',
+  'type' => 'node',
+  'callback' => 'node_make_sticky_action',
+  'parameters' => '',
+  'description' => 'Make post sticky',
+))
+->values(array(
+  'aid' => 'node_make_unsticky_action',
+  'type' => 'node',
+  'callback' => 'node_make_unsticky_action',
+  'parameters' => '',
+  'description' => 'Make post unsticky',
+))
+->values(array(
+  'aid' => 'node_promote_action',
+  'type' => 'node',
+  'callback' => 'node_promote_action',
+  'parameters' => '',
+  'description' => 'Promote post to front page',
+))
+->values(array(
+  'aid' => 'node_publish_action',
+  'type' => 'node',
+  'callback' => 'node_publish_action',
+  'parameters' => '',
+  'description' => 'Publish post',
+))
+->values(array(
+  'aid' => 'node_save_action',
+  'type' => 'node',
+  'callback' => 'node_save_action',
+  'parameters' => '',
+  'description' => 'Save post',
+))
+->values(array(
+  'aid' => 'node_unpromote_action',
+  'type' => 'node',
+  'callback' => 'node_unpromote_action',
+  'parameters' => '',
+  'description' => 'Remove post from front page',
+))
+->values(array(
+  'aid' => 'node_unpublish_action',
+  'type' => 'node',
+  'callback' => 'node_unpublish_action',
+  'parameters' => '',
+  'description' => 'Unpublish post',
+))
+->values(array(
+  'aid' => 'user_block_ip_action',
+  'type' => 'user',
+  'callback' => 'user_block_ip_action',
+  'parameters' => '',
+  'description' => 'Ban IP address of current user',
+))
+->values(array(
+  'aid' => 'user_block_user_action',
+  'type' => 'user',
+  'callback' => 'user_block_user_action',
+  'parameters' => '',
+  'description' => 'Block current user',
+))
+->execute();
+
+db_create_table('actions_aid', array(
+  'fields' => array(
+    'aid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+  ),
+  'primary key' => array(
+    'aid',
+  ),
+  'module' => 'system',
+  'name' => 'actions_aid',
+));
+
+db_create_table('authmap', array(
+  'fields' => array(
+    'aid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'uid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'authname' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'module' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+  ),
+  'unique keys' => array(
+    'authname' => array(
+      'authname',
+    ),
+  ),
+  'primary key' => array(
+    'aid',
+  ),
+  'module' => 'user',
+  'name' => 'authmap',
+));
+
+db_create_table('batch', array(
+  'fields' => array(
+    'bid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'token' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+    ),
+    'batch' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+  ),
+  'primary key' => array(
+    'bid',
+  ),
+  'indexes' => array(
+    'token' => array(
+      'token',
+    ),
+  ),
+  'module' => 'system',
+  'name' => 'batch',
+));
+
+db_create_table('blocks', array(
+  'fields' => array(
+    'bid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'module' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'delta' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '0',
+    ),
+    'theme' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'region' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'custom' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'throttle' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'visibility' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'pages' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+    ),
+    'title' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'cache' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 1,
+      'size' => 'tiny',
+    ),
+  ),
+  'primary key' => array(
+    'bid',
+  ),
+  'unique keys' => array(
+    'tmd' => array(
+      'theme',
+      'module',
+      'delta',
+    ),
+  ),
+  'indexes' => array(
+    'list' => array(
+      'theme',
+      'status',
+      'region',
+      'weight',
+      'module',
+    ),
+  ),
+  'module' => 'block',
+  'name' => 'blocks',
+));
+db_insert('blocks')->fields(array(
+  'bid',
+  'module',
+  'delta',
+  'theme',
+  'status',
+  'weight',
+  'region',
+  'custom',
+  'throttle',
+  'visibility',
+  'pages',
+  'title',
+  'cache',
+))
+->values(array(
+  'bid' => '1',
+  'module' => 'user',
+  'delta' => '0',
+  'theme' => 'garland',
+  'status' => '1',
+  'weight' => '0',
+  'region' => 'left',
+  'custom' => '0',
+  'throttle' => '0',
+  'visibility' => '0',
+  'pages' => '',
+  'title' => '',
+  'cache' => '-1',
+))
+->values(array(
+  'bid' => '2',
+  'module' => 'user',
+  'delta' => '1',
+  'theme' => 'garland',
+  'status' => '1',
+  'weight' => '0',
+  'region' => 'left',
+  'custom' => '0',
+  'throttle' => '0',
+  'visibility' => '0',
+  'pages' => '',
+  'title' => '',
+  'cache' => '-1',
+))
+->values(array(
+  'bid' => '3',
+  'module' => 'system',
+  'delta' => '0',
+  'theme' => 'garland',
+  'status' => '1',
+  'weight' => '10',
+  'region' => 'footer',
+  'custom' => '0',
+  'throttle' => '0',
+  'visibility' => '0',
+  'pages' => '',
+  'title' => '',
+  'cache' => '-1',
+))
+->execute();
+
+db_create_table('blocks_roles', array(
+  'fields' => array(
+    'module' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+    ),
+    'delta' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+    ),
+    'rid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+  ),
+  'primary key' => array(
+    'module',
+    'delta',
+    'rid',
+  ),
+  'indexes' => array(
+    'rid' => array(
+      'rid',
+    ),
+  ),
+  'module' => 'block',
+  'name' => 'blocks_roles',
+));
+
+db_create_table('boxes', array(
+  'fields' => array(
+    'bid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'body' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'info' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'format' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'unique keys' => array(
+    'info' => array(
+      'info',
+    ),
+  ),
+  'primary key' => array(
+    'bid',
+  ),
+  'module' => 'block',
+  'name' => 'boxes',
+));
+
+db_create_table('cache', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'expire' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'headers' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'serialized' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'system',
+  'name' => 'cache',
+));
+
+db_create_table('cache_block', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'expire' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'headers' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'serialized' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'block',
+  'name' => 'cache_block',
+));
+
+db_create_table('cache_filter', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'expire' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'headers' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'serialized' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'filter',
+  'name' => 'cache_filter',
+));
+
+db_create_table('cache_form', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'expire' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'headers' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'serialized' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'system',
+  'name' => 'cache_form',
+));
+
+db_create_table('cache_menu', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'expire' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'headers' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'serialized' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'system',
+  'name' => 'cache_menu',
+));
+
+db_create_table('cache_page', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'expire' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'headers' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'serialized' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'system',
+  'name' => 'cache_page',
+));
+
+db_create_table('cache_update', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'expire' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'headers' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'serialized' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'update',
+  'name' => 'cache_update',
+));
+
+db_create_table('files', array(
+  'fields' => array(
+    'fid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'uid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'filename' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'filepath' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'filemime' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'filesize' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'uid' => array(
+      'uid',
+    ),
+    'status' => array(
+      'status',
+    ),
+    'timestamp' => array(
+      'timestamp',
+    ),
+  ),
+  'primary key' => array(
+    'fid',
+  ),
+  'module' => 'system',
+  'name' => 'files',
+));
+
+db_create_table('filter_formats', array(
+  'fields' => array(
+    'format' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'roles' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'cache' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+  ),
+  'primary key' => array(
+    'format',
+  ),
+  'unique keys' => array(
+    'name' => array(
+      'name',
+    ),
+  ),
+  'module' => 'filter',
+  'name' => 'filter_formats',
+));
+db_insert('filter_formats')->fields(array(
+  'format',
+  'name',
+  'roles',
+  'cache',
+))
+->values(array(
+  'format' => '1',
+  'name' => 'Filtered HTML',
+  'roles' => ',1,2,',
+  'cache' => '1',
+))
+->values(array(
+  'format' => '2',
+  'name' => 'Full HTML',
+  'roles' => '',
+  'cache' => '1',
+))
+->execute();
+
+db_create_table('filters', array(
+  'fields' => array(
+    'fid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'format' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'module' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'delta' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+  ),
+  'primary key' => array(
+    'fid',
+  ),
+  'unique keys' => array(
+    'fmd' => array(
+      'format',
+      'module',
+      'delta',
+    ),
+  ),
+  'indexes' => array(
+    'list' => array(
+      'format',
+      'weight',
+      'module',
+      'delta',
+    ),
+  ),
+  'module' => 'filter',
+  'name' => 'filters',
+));
+db_insert('filters')->fields(array(
+  'fid',
+  'format',
+  'module',
+  'delta',
+  'weight',
+))
+->values(array(
+  'fid' => '1',
+  'format' => '1',
+  'module' => 'filter',
+  'delta' => '2',
+  'weight' => '0',
+))
+->values(array(
+  'fid' => '2',
+  'format' => '1',
+  'module' => 'filter',
+  'delta' => '0',
+  'weight' => '1',
+))
+->values(array(
+  'fid' => '3',
+  'format' => '1',
+  'module' => 'filter',
+  'delta' => '1',
+  'weight' => '2',
+))
+->values(array(
+  'fid' => '4',
+  'format' => '1',
+  'module' => 'filter',
+  'delta' => '3',
+  'weight' => '10',
+))
+->values(array(
+  'fid' => '5',
+  'format' => '2',
+  'module' => 'filter',
+  'delta' => '2',
+  'weight' => '0',
+))
+->values(array(
+  'fid' => '6',
+  'format' => '2',
+  'module' => 'filter',
+  'delta' => '1',
+  'weight' => '1',
+))
+->values(array(
+  'fid' => '7',
+  'format' => '2',
+  'module' => 'filter',
+  'delta' => '3',
+  'weight' => '10',
+))
+->execute();
+
+db_create_table('flood', array(
+  'fields' => array(
+    'fid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'event' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'hostname' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'fid',
+  ),
+  'indexes' => array(
+    'allow' => array(
+      'event',
+      'hostname',
+      'timestamp',
+    ),
+  ),
+  'module' => 'system',
+  'name' => 'flood',
+));
+
+db_create_table('history', array(
+  'fields' => array(
+    'uid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'nid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'uid',
+    'nid',
+  ),
+  'indexes' => array(
+    'nid' => array(
+      'nid',
+    ),
+  ),
+  'module' => 'system',
+  'name' => 'history',
+));
+
+db_create_table('menu_links', array(
+  'fields' => array(
+    'menu_name' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'mlid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'plid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'link_path' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'router_path' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'link_title' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'options' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'module' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => 'system',
+    ),
+    'hidden' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+    'external' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+    'has_children' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+    'expanded' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'depth' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+    'customized' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+    'p1' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p2' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p3' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p4' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p5' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p6' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p7' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p8' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p9' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'updated' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+  ),
+  'indexes' => array(
+    'path_menu' => array(
+      array(
+        'link_path',
+        128,
+      ),
+      'menu_name',
+    ),
+    'menu_plid_expand_child' => array(
+      'menu_name',
+      'plid',
+      'expanded',
+      'has_children',
+    ),
+    'menu_parents' => array(
+      'menu_name',
+      'p1',
+      'p2',
+      'p3',
+      'p4',
+      'p5',
+      'p6',
+      'p7',
+      'p8',
+      'p9',
+    ),
+    'router_path' => array(
+      array(
+        'router_path',
+        128,
+      ),
+    ),
+  ),
+  'primary key' => array(
+    'mlid',
+  ),
+  'module' => 'system',
+  'name' => 'menu_links',
+));
+db_insert('menu_links')->fields(array(
+  'menu_name',
+  'mlid',
+  'plid',
+  'link_path',
+  'router_path',
+  'link_title',
+  'options',
+  'module',
+  'hidden',
+  'external',
+  'has_children',
+  'expanded',
+  'weight',
+  'depth',
+  'customized',
+  'p1',
+  'p2',
+  'p3',
+  'p4',
+  'p5',
+  'p6',
+  'p7',
+  'p8',
+  'p9',
+  'updated',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '1',
+  'plid' => '0',
+  'link_path' => 'batch',
+  'router_path' => 'batch',
+  'link_title' => '',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '1',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '2',
+  'plid' => '0',
+  'link_path' => 'admin',
+  'router_path' => 'admin',
+  'link_title' => 'Administer',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '9',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '3',
+  'plid' => '0',
+  'link_path' => 'node',
+  'router_path' => 'node',
+  'link_title' => 'Content',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '3',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '4',
+  'plid' => '0',
+  'link_path' => 'logout',
+  'router_path' => 'logout',
+  'link_title' => 'Log out',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '10',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '4',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '5',
+  'plid' => '0',
+  'link_path' => 'rss.xml',
+  'router_path' => 'rss.xml',
+  'link_title' => 'RSS feed',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '5',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '6',
+  'plid' => '0',
+  'link_path' => 'user',
+  'router_path' => 'user',
+  'link_title' => 'User account',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '6',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '7',
+  'plid' => '0',
+  'link_path' => 'node/%',
+  'router_path' => 'node/%',
+  'link_title' => '',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '7',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '8',
+  'plid' => '2',
+  'link_path' => 'admin/compact',
+  'router_path' => 'admin/compact',
+  'link_title' => 'Compact mode',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '8',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '9',
+  'plid' => '0',
+  'link_path' => 'filter/tips',
+  'router_path' => 'filter/tips',
+  'link_title' => 'Compose tips',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '9',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '10',
+  'plid' => '2',
+  'link_path' => 'admin/content',
+  'router_path' => 'admin/content',
+  'link_title' => 'Content management',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:27:\"Manage your site's content.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '-10',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '11',
+  'plid' => '0',
+  'link_path' => 'node/add',
+  'router_path' => 'node/add',
+  'link_title' => 'Create content',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '1',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '11',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '12',
+  'plid' => '0',
+  'link_path' => 'system/files',
+  'router_path' => 'system/files',
+  'link_title' => 'File download',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '12',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '13',
+  'plid' => '2',
+  'link_path' => 'admin/reports',
+  'router_path' => 'admin/reports',
+  'link_title' => 'Reports',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:59:"View reports from system logs and other status information.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '5',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '13',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '14',
+  'plid' => '2',
+  'link_path' => 'admin/build',
+  'router_path' => 'admin/build',
+  'link_title' => 'Site building',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:38:"Control how your site looks and feels.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '-10',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '14',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '15',
+  'plid' => '2',
+  'link_path' => 'admin/settings',
+  'router_path' => 'admin/settings',
+  'link_title' => 'Site configuration',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:40:"Adjust basic site configuration options.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '-5',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '16',
+  'plid' => '0',
+  'link_path' => 'user/autocomplete',
+  'router_path' => 'user/autocomplete',
+  'link_title' => 'User autocomplete',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '16',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '17',
+  'plid' => '2',
+  'link_path' => 'admin/user',
+  'router_path' => 'admin/user',
+  'link_title' => 'User management',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:61:\"Manage your site's users, groups and access to site features.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '18',
+  'plid' => '0',
+  'link_path' => 'user/%',
+  'router_path' => 'user/%',
+  'link_title' => 'My account',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '18',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '19',
+  'plid' => '17',
+  'link_path' => 'admin/user/rules',
+  'router_path' => 'admin/user/rules',
+  'link_title' => 'Access rules',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:80:"List and create rules to disallow usernames, e-mail addresses, and IP addresses.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '19',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '20',
+  'plid' => '15',
+  'link_path' => 'admin/settings/actions',
+  'router_path' => 'admin/settings/actions',
+  'link_title' => 'Actions',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:41:"Manage the actions defined for your site.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '20',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '21',
+  'plid' => '15',
+  'link_path' => 'admin/settings/admin',
+  'router_path' => 'admin/settings/admin',
+  'link_title' => 'Administration theme',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:55:"Settings for how your administrative pages should look.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '21',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '22',
+  'plid' => '14',
+  'link_path' => 'admin/build/block',
+  'router_path' => 'admin/build/block',
+  'link_title' => 'Blocks',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:79:\"Configure what block content appears in your site's sidebars and other regions.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '14',
+  'p3' => '22',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '23',
+  'plid' => '15',
+  'link_path' => 'admin/settings/clean-urls',
+  'router_path' => 'admin/settings/clean-urls',
+  'link_title' => 'Clean URLs',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:43:"Enable or disable clean URLs for your site.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '23',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '24',
+  'plid' => '10',
+  'link_path' => 'admin/content/node',
+  'router_path' => 'admin/content/node',
+  'link_title' => 'Content',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:43:\"View, edit, and delete your site's content.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '24',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '25',
+  'plid' => '10',
+  'link_path' => 'admin/content/types',
+  'router_path' => 'admin/content/types',
+  'link_title' => 'Content types',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:82:"Manage posts by content type, including default status, front page promotion, etc.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '25',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '26',
+  'plid' => '15',
+  'link_path' => 'admin/settings/date-time',
+  'router_path' => 'admin/settings/date-time',
+  'link_title' => 'Date and time',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:89:\"Settings for how Drupal displays date and time, as well as the system's default timezone.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '26',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '27',
+  'plid' => '0',
+  'link_path' => 'node/%/delete',
+  'router_path' => 'node/%/delete',
+  'link_title' => 'Delete',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '1',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '27',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '28',
+  'plid' => '18',
+  'link_path' => 'user/%/delete',
+  'router_path' => 'user/%/delete',
+  'link_title' => 'Delete',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '18',
+  'p2' => '28',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '29',
+  'plid' => '15',
+  'link_path' => 'admin/settings/error-reporting',
+  'router_path' => 'admin/settings/error-reporting',
+  'link_title' => 'Error reporting',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:93:"Control how Drupal deals with errors including 403/404 errors as well as PHP error reporting.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '29',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '30',
+  'plid' => '15',
+  'link_path' => 'admin/settings/file-system',
+  'router_path' => 'admin/settings/file-system',
+  'link_title' => 'File system',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:68:"Tell Drupal where to store uploaded files and how they are accessed.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '30',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '31',
+  'plid' => '15',
+  'link_path' => 'admin/settings/image-toolkit',
+  'router_path' => 'admin/settings/image-toolkit',
+  'link_title' => 'Image toolkit',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:74:"Choose which image toolkit to use if you have installed optional toolkits.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '31',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '32',
+  'plid' => '15',
+  'link_path' => 'admin/settings/filters',
+  'router_path' => 'admin/settings/filters',
+  'link_title' => 'Input formats',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:127:"Configure how content input by users is filtered, including allowed HTML tags. Also allows enabling of module-provided filters.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '32',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '33',
+  'plid' => '15',
+  'link_path' => 'admin/settings/logging',
+  'router_path' => 'admin/settings/logging',
+  'link_title' => 'Logging and alerts',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:156:\"Settings for logging and alerts modules. Various modules can route Drupal's system events to different destination, such as syslog, database, email, ...etc.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '33',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '34',
+  'plid' => '14',
+  'link_path' => 'admin/build/modules',
+  'router_path' => 'admin/build/modules',
+  'link_title' => 'Modules',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:47:"Enable or disable add-on modules for your site.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '14',
+  'p3' => '34',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '35',
+  'plid' => '15',
+  'link_path' => 'admin/settings/performance',
+  'router_path' => 'admin/settings/performance',
+  'link_title' => 'Performance',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:101:"Enable or disable page caching for anonymous users and set CSS and JS bandwidth optimization options.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '35',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '36',
+  'plid' => '17',
+  'link_path' => 'admin/user/permissions',
+  'router_path' => 'admin/user/permissions',
+  'link_title' => 'Permissions',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:64:"Determine access to features by selecting permissions for roles.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '36',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '37',
+  'plid' => '10',
+  'link_path' => 'admin/content/node-settings',
+  'router_path' => 'admin/content/node-settings',
+  'link_title' => 'Post settings',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:126:"Control posting behavior, such as teaser length, requiring previews before posting, and the number of posts on the front page.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '37',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '38',
+  'plid' => '10',
+  'link_path' => 'admin/content/rss-publishing',
+  'router_path' => 'admin/content/rss-publishing',
+  'link_title' => 'RSS publishing',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:92:"Configure the number of items per feed and whether feeds should be titles/teasers/full-text.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '38',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '39',
+  'plid' => '13',
+  'link_path' => 'admin/reports/dblog',
+  'router_path' => 'admin/reports/dblog',
+  'link_title' => 'Recent log entries',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:43:"View events that have recently been logged.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '-1',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '13',
+  'p3' => '39',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '40',
+  'plid' => '17',
+  'link_path' => 'admin/user/roles',
+  'router_path' => 'admin/user/roles',
+  'link_title' => 'Roles',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:30:"List, edit, or add user roles.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '40',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '41',
+  'plid' => '15',
+  'link_path' => 'admin/settings/site-information',
+  'router_path' => 'admin/settings/site-information',
+  'link_title' => 'Site information',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:107:"Change basic site information, such as the site name, slogan, e-mail address, mission, front page and more.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '41',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '42',
+  'plid' => '15',
+  'link_path' => 'admin/settings/site-maintenance',
+  'router_path' => 'admin/settings/site-maintenance',
+  'link_title' => 'Site maintenance',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:63:"Take the site off-line for maintenance or bring it back online.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '42',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '43',
+  'plid' => '13',
+  'link_path' => 'admin/reports/status',
+  'router_path' => 'admin/reports/status',
+  'link_title' => 'Status report',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:74:\"Get a status report about your site's operation and any detected problems.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '10',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '13',
+  'p3' => '43',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '44',
+  'plid' => '14',
+  'link_path' => 'admin/build/themes',
+  'router_path' => 'admin/build/themes',
+  'link_title' => 'Themes',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:57:"Change which theme your site uses or allows users to set.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '14',
+  'p3' => '44',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '45',
+  'plid' => '13',
+  'link_path' => 'admin/reports/access-denied',
+  'router_path' => 'admin/reports/access-denied',
+  'link_title' => "Top 'access denied' errors",
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:35:\"View 'access denied' errors (403s).\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '13',
+  'p3' => '45',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '46',
+  'plid' => '13',
+  'link_path' => 'admin/reports/page-not-found',
+  'router_path' => 'admin/reports/page-not-found',
+  'link_title' => "Top 'page not found' errors",
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:36:\"View 'page not found' errors (404s).\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '13',
+  'p3' => '46',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '47',
+  'plid' => '17',
+  'link_path' => 'admin/user/settings',
+  'router_path' => 'admin/user/settings',
+  'link_title' => 'User settings',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:101:"Configure default behavior of users, including registration requirements, e-mails, and user pictures.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '47',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '48',
+  'plid' => '17',
+  'link_path' => 'admin/user/user',
+  'router_path' => 'admin/user/user',
+  'link_title' => 'Users',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:26:"List, add, and edit users.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '48',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '49',
+  'plid' => '32',
+  'link_path' => 'admin/settings/filters/%',
+  'router_path' => 'admin/settings/filters/%',
+  'link_title' => '',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '32',
+  'p4' => '49',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '50',
+  'plid' => '23',
+  'link_path' => 'admin/settings/clean-urls/check',
+  'router_path' => 'admin/settings/clean-urls/check',
+  'link_title' => 'Clean URL check',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '23',
+  'p4' => '50',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '51',
+  'plid' => '20',
+  'link_path' => 'admin/settings/actions/configure',
+  'router_path' => 'admin/settings/actions/configure',
+  'link_title' => 'Configure an advanced action',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '20',
+  'p4' => '51',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '52',
+  'plid' => '22',
+  'link_path' => 'admin/build/block/configure',
+  'router_path' => 'admin/build/block/configure',
+  'link_title' => 'Configure block',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '14',
+  'p3' => '22',
+  'p4' => '52',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '53',
+  'plid' => '33',
+  'link_path' => 'admin/settings/logging/dblog',
+  'router_path' => 'admin/settings/logging/dblog',
+  'link_title' => 'Database logging',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:169:"Settings for logging to the Drupal database logs. This is the most common method for small to medium sites on shared hosting. The logs are viewable from the admin pages.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '33',
+  'p4' => '53',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '54',
+  'plid' => '26',
+  'link_path' => 'admin/settings/date-time/lookup',
+  'router_path' => 'admin/settings/date-time/lookup',
+  'link_title' => 'Date and time lookup',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '26',
+  'p4' => '54',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '55',
+  'plid' => '22',
+  'link_path' => 'admin/build/block/delete',
+  'router_path' => 'admin/build/block/delete',
+  'link_title' => 'Delete block',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '14',
+  'p3' => '22',
+  'p4' => '55',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '56',
+  'plid' => '32',
+  'link_path' => 'admin/settings/filters/delete',
+  'router_path' => 'admin/settings/filters/delete',
+  'link_title' => 'Delete input format',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '32',
+  'p4' => '56',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '57',
+  'plid' => '19',
+  'link_path' => 'admin/user/rules/delete',
+  'router_path' => 'admin/user/rules/delete',
+  'link_title' => 'Delete rule',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '19',
+  'p4' => '57',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '58',
+  'plid' => '13',
+  'link_path' => 'admin/reports/event/%',
+  'router_path' => 'admin/reports/event/%',
+  'link_title' => 'Details',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '13',
+  'p3' => '58',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '59',
+  'plid' => '40',
+  'link_path' => 'admin/user/roles/edit',
+  'router_path' => 'admin/user/roles/edit',
+  'link_title' => 'Edit role',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '40',
+  'p4' => '59',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '60',
+  'plid' => '19',
+  'link_path' => 'admin/user/rules/edit',
+  'router_path' => 'admin/user/rules/edit',
+  'link_title' => 'Edit rule',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '19',
+  'p4' => '60',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '61',
+  'plid' => '43',
+  'link_path' => 'admin/reports/status/php',
+  'router_path' => 'admin/reports/status/php',
+  'link_title' => 'PHP',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '13',
+  'p3' => '43',
+  'p4' => '61',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '62',
+  'plid' => '37',
+  'link_path' => 'admin/content/node-settings/rebuild',
+  'router_path' => 'admin/content/node-settings/rebuild',
+  'link_title' => 'Rebuild permissions',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '37',
+  'p4' => '62',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '63',
+  'plid' => '20',
+  'link_path' => 'admin/settings/actions/orphan',
+  'router_path' => 'admin/settings/actions/orphan',
+  'link_title' => 'Remove orphans',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '20',
+  'p4' => '63',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '64',
+  'plid' => '43',
+  'link_path' => 'admin/reports/status/run-cron',
+  'router_path' => 'admin/reports/status/run-cron',
+  'link_title' => 'Run cron',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '13',
+  'p3' => '43',
+  'p4' => '64',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '65',
+  'plid' => '43',
+  'link_path' => 'admin/reports/status/sql',
+  'router_path' => 'admin/reports/status/sql',
+  'link_title' => 'SQL',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '13',
+  'p3' => '43',
+  'p4' => '65',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '66',
+  'plid' => '20',
+  'link_path' => 'admin/settings/actions/delete/%',
+  'router_path' => 'admin/settings/actions/delete/%',
+  'link_title' => 'Delete action',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:17:"Delete an action.";}}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '20',
+  'p4' => '66',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '67',
+  'plid' => '22',
+  'link_path' => 'admin/build/block/list/js',
+  'router_path' => 'admin/build/block/list/js',
+  'link_title' => 'JavaScript List Form',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '14',
+  'p3' => '22',
+  'p4' => '67',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '68',
+  'plid' => '34',
+  'link_path' => 'admin/build/modules/list/confirm',
+  'router_path' => 'admin/build/modules/list/confirm',
+  'link_title' => 'List',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '14',
+  'p3' => '34',
+  'p4' => '68',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '69',
+  'plid' => '0',
+  'link_path' => 'user/reset/%/%/%',
+  'router_path' => 'user/reset/%/%/%',
+  'link_title' => 'Reset password',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '69',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '70',
+  'plid' => '34',
+  'link_path' => 'admin/build/modules/uninstall/confirm',
+  'router_path' => 'admin/build/modules/uninstall/confirm',
+  'link_title' => 'Uninstall',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '14',
+  'p3' => '34',
+  'p4' => '70',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '71',
+  'plid' => '0',
+  'link_path' => 'node/%/revisions/%/delete',
+  'router_path' => 'node/%/revisions/%/delete',
+  'link_title' => 'Delete earlier revision',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '71',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '72',
+  'plid' => '0',
+  'link_path' => 'node/%/revisions/%/revert',
+  'router_path' => 'node/%/revisions/%/revert',
+  'link_title' => 'Revert to earlier revision',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '72',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '73',
+  'plid' => '0',
+  'link_path' => 'node/%/revisions/%/view',
+  'router_path' => 'node/%/revisions/%/view',
+  'link_title' => 'Revisions',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '73',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '74',
+  'plid' => '13',
+  'link_path' => 'admin/reports/updates',
+  'router_path' => 'admin/reports/updates',
+  'link_title' => 'Available updates',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:82:"Get a status report about available updates for your installed modules and themes.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '10',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '13',
+  'p3' => '74',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '75',
+  'plid' => '11',
+  'link_path' => 'node/add/page',
+  'router_path' => 'node/add/page',
+  'link_title' => 'Page',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:296:\"A <em>page</em>, similar in form to a <em>story</em>, is a simple method for creating and displaying information that rarely changes, such as an \"About us\" section of a website. By default, a <em>page</em> entry does not allow visitor comments and is not featured on the site's initial home page.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '11',
+  'p2' => '75',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '76',
+  'plid' => '11',
+  'link_path' => 'node/add/story',
+  'router_path' => 'node/add/story',
+  'link_title' => 'Story',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:392:\"A <em>story</em>, similar in form to a <em>page</em>, is ideal for creating and displaying content that informs or engages website visitors. Press releases, site announcements, and informal blog-like entries may all be created with a <em>story</em> entry. By default, a <em>story</em> entry is automatically featured on the site's initial home page, and provides the ability to post comments.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '11',
+  'p2' => '76',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '77',
+  'plid' => '74',
+  'link_path' => 'admin/reports/updates/check',
+  'router_path' => 'admin/reports/updates/check',
+  'link_title' => 'Manual update check',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '13',
+  'p3' => '74',
+  'p4' => '77',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '78',
+  'plid' => '10',
+  'link_path' => 'admin/content/node-type/page',
+  'router_path' => 'admin/content/node-type/page',
+  'link_title' => 'Page',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '78',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '79',
+  'plid' => '10',
+  'link_path' => 'admin/content/node-type/story',
+  'router_path' => 'admin/content/node-type/story',
+  'link_title' => 'Story',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '79',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '80',
+  'plid' => '0',
+  'link_path' => 'admin/content/node-type/page/delete',
+  'router_path' => 'admin/content/node-type/page/delete',
+  'link_title' => 'Delete',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '80',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '81',
+  'plid' => '0',
+  'link_path' => 'admin/content/node-type/story/delete',
+  'router_path' => 'admin/content/node-type/story/delete',
+  'link_title' => 'Delete',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '81',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->execute();
+
+db_create_table('menu_router', array(
+  'fields' => array(
+    'path' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'load_functions' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+    ),
+    'to_arg_functions' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+    ),
+    'access_callback' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'access_arguments' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'page_callback' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'page_arguments' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'fit' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'number_parts' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+    'tab_parent' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'tab_root' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'title' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'title_callback' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'title_arguments' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'type' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'block_callback' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'description' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+    ),
+    'position' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'file' => array(
+      'type' => 'text',
+      'size' => 'medium',
+    ),
+  ),
+  'indexes' => array(
+    'fit' => array(
+      'fit',
+    ),
+    'tab_parent' => array(
+      'tab_parent',
+    ),
+    'tab_root_weight_title' => array(
+      array(
+        'tab_root',
+        64,
+      ),
+      'weight',
+      'title',
+    ),
+  ),
+  'primary key' => array(
+    'path',
+  ),
+  'module' => 'system',
+  'name' => 'menu_router',
+));
+db_insert('menu_router')->fields(array(
+  'path',
+  'load_functions',
+  'to_arg_functions',
+  'access_callback',
+  'access_arguments',
+  'page_callback',
+  'page_arguments',
+  'fit',
+  'number_parts',
+  'tab_parent',
+  'tab_root',
+  'title',
+  'title_callback',
+  'title_arguments',
+  'type',
+  'block_callback',
+  'description',
+  'position',
+  'weight',
+  'file',
+))
+->values(array(
+  'path' => 'admin',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_main_admin_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '1',
+  'number_parts' => '1',
+  'tab_parent' => '',
+  'tab_root' => 'admin',
+  'title' => 'Administer',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '9',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_admin_menu_block_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build',
+  'title' => 'Site building',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Control how your site looks and feels.',
+  'position' => 'right',
+  'weight' => '-10',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:17:"administer blocks";}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Blocks',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "Configure what block content appears in your site's sidebars and other regions.",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/add',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:17:"administer blocks";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:20:"block_add_block_form";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/block',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Add block',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/configure',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:17:"administer blocks";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:21:"block_admin_configure";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/block/configure',
+  'title' => 'Configure block',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/delete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:17:"administer blocks";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:16:"block_box_delete";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/block/delete',
+  'title' => 'Delete block',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:17:"administer blocks";}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/block',
+  'tab_root' => 'admin/build/block',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list/bluemarine',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_block_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:33:"themes/bluemarine/bluemarine.info";s:4:"name";s:10:"bluemarine";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:13:{s:4:"name";s:10:"Bluemarine";s:11:"description";s:66:"Table-based multi-column theme with a marine and ash color scheme.";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/bluemarine/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:27:"themes/bluemarine/script.js";}s:10:"screenshot";s:32:"themes/bluemarine/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/bluemarine/style.css";}}s:6:"engine";s:11:"phptemplate";}}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:1:{i:0;s:10:"bluemarine";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/block/list',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Bluemarine',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list/chameleon',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_block_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":11:{s:8:"filename";s:31:"themes/chameleon/chameleon.info";s:4:"name";s:9:"chameleon";s:4:"type";s:5:"theme";s:5:"owner";s:32:"themes/chameleon/chameleon.theme";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:12:{s:4:"name";s:9:"Chameleon";s:11:"description";s:42:"Minimalist tabled theme with light colors.";s:7:"regions";a:2:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";}s:8:"features";a:4:{i:0;s:4:"logo";i:1;s:7:"favicon";i:2;s:4:"name";i:3;s:6:"slogan";}s:11:"stylesheets";a:1:{s:3:"all";a:2:{s:9:"style.css";s:26:"themes/chameleon/style.css";s:10:"common.css";s:27:"themes/chameleon/common.css";}}s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"scripts";a:1:{s:9:"script.js";s:26:"themes/chameleon/script.js";}s:10:"screenshot";s:31:"themes/chameleon/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:2:{s:9:"style.css";s:26:"themes/chameleon/style.css";s:10:"common.css";s:27:"themes/chameleon/common.css";}}}}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:1:{i:0;s:9:"chameleon";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/block/list',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Chameleon',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list/garland',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_block_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:27:"themes/garland/garland.info";s:4:"name";s:7:"garland";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"1";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:13:{s:4:"name";s:7:"Garland";s:11:"description";s:66:"Tableless, recolorable, multi-column, fluid width theme (default).";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:11:"stylesheets";a:2:{s:3:"all";a:1:{s:9:"style.css";s:24:"themes/garland/style.css";}s:5:"print";a:1:{s:9:"print.css";s:24:"themes/garland/print.css";}}s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:7:"scripts";a:1:{s:9:"script.js";s:24:"themes/garland/script.js";}s:10:"screenshot";s:29:"themes/garland/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:2:{s:3:"all";a:1:{s:9:"style.css";s:24:"themes/garland/style.css";}s:5:"print";a:1:{s:9:"print.css";s:24:"themes/garland/print.css";}}s:6:"engine";s:11:"phptemplate";}}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:1:{i:0;s:7:"garland";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/block/list',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Garland',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list/js',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:17:"administer blocks";}',
+  'page_callback' => 'block_admin_display_js',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/block/list/js',
+  'title' => 'JavaScript List Form',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list/marvin',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_block_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:35:"themes/chameleon/marvin/marvin.info";s:4:"name";s:6:"marvin";s:4:"type";s:5:"theme";s:5:"owner";s:0:"";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:13:{s:4:"name";s:6:"Marvin";s:11:"description";s:31:"Boxy tabled theme in all grays.";s:7:"regions";a:2:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";}s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:10:"base theme";s:9:"chameleon";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:33:"themes/chameleon/marvin/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:33:"themes/chameleon/marvin/script.js";}s:10:"screenshot";s:38:"themes/chameleon/marvin/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:33:"themes/chameleon/marvin/style.css";}}s:10:"base_theme";s:9:"chameleon";}}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:1:{i:0;s:6:"marvin";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/block/list',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Marvin',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list/minnelli',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_block_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":13:{s:8:"filename";s:37:"themes/garland/minnelli/minnelli.info";s:4:"name";s:8:"minnelli";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:14:{s:4:"name";s:8:"Minnelli";s:11:"description";s:56:"Tableless, recolorable, multi-column, fixed width theme.";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:10:"base theme";s:7:"garland";s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:12:"minnelli.css";s:36:"themes/garland/minnelli/minnelli.css";}}s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:7:"scripts";a:1:{s:9:"script.js";s:33:"themes/garland/minnelli/script.js";}s:10:"screenshot";s:38:"themes/garland/minnelli/screenshot.png";s:3:"php";s:5:"4.3.5";s:6:"engine";s:11:"phptemplate";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:12:"minnelli.css";s:36:"themes/garland/minnelli/minnelli.css";}}s:6:"engine";s:11:"phptemplate";s:10:"base_theme";s:7:"garland";}}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:1:{i:0;s:8:"minnelli";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/block/list',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Minnelli',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list/pushbutton',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_block_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:33:"themes/pushbutton/pushbutton.info";s:4:"name";s:10:"pushbutton";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:13:{s:4:"name";s:10:"Pushbutton";s:11:"description";s:52:"Tabled, multi-column theme in blue and orange tones.";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/pushbutton/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:27:"themes/pushbutton/script.js";}s:10:"screenshot";s:32:"themes/pushbutton/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/pushbutton/style.css";}}s:6:"engine";s:11:"phptemplate";}}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:1:{i:0;s:10:"pushbutton";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/block/list',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Pushbutton',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/modules',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:14:"system_modules";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/modules',
+  'title' => 'Modules',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Enable or disable add-on modules for your site.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/modules/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:14:"system_modules";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/modules',
+  'tab_root' => 'admin/build/modules',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/modules/list/confirm',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:14:"system_modules";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/modules/list/confirm',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/modules/uninstall',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:24:"system_modules_uninstall";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/modules',
+  'tab_root' => 'admin/build/modules',
+  'title' => 'Uninstall',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/modules/uninstall/confirm',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:24:"system_modules_uninstall";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/modules/uninstall/confirm',
+  'title' => 'Uninstall',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:18:"system_themes_form";i:1;N;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Themes',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Change which theme your site uses or allows users to set.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/select',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:18:"system_themes_form";i:1;N;}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/themes',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => 'Select the default theme.',
+  'position' => '',
+  'weight' => '-1',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:21:"system_theme_settings";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/themes',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Configure',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings/bluemarine',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_system_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:33:"themes/bluemarine/bluemarine.info";s:4:"name";s:10:"bluemarine";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:13:{s:4:"name";s:10:"Bluemarine";s:11:"description";s:66:"Table-based multi-column theme with a marine and ash color scheme.";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/bluemarine/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:27:"themes/bluemarine/script.js";}s:10:"screenshot";s:32:"themes/bluemarine/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/bluemarine/style.css";}}s:6:"engine";s:11:"phptemplate";}}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:21:"system_theme_settings";i:1;s:10:"bluemarine";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/themes/settings',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Bluemarine',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings/chameleon',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_system_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":11:{s:8:"filename";s:31:"themes/chameleon/chameleon.info";s:4:"name";s:9:"chameleon";s:4:"type";s:5:"theme";s:5:"owner";s:32:"themes/chameleon/chameleon.theme";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:12:{s:4:"name";s:9:"Chameleon";s:11:"description";s:42:"Minimalist tabled theme with light colors.";s:7:"regions";a:2:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";}s:8:"features";a:4:{i:0;s:4:"logo";i:1;s:7:"favicon";i:2;s:4:"name";i:3;s:6:"slogan";}s:11:"stylesheets";a:1:{s:3:"all";a:2:{s:9:"style.css";s:26:"themes/chameleon/style.css";s:10:"common.css";s:27:"themes/chameleon/common.css";}}s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"scripts";a:1:{s:9:"script.js";s:26:"themes/chameleon/script.js";}s:10:"screenshot";s:31:"themes/chameleon/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:2:{s:9:"style.css";s:26:"themes/chameleon/style.css";s:10:"common.css";s:27:"themes/chameleon/common.css";}}}}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:21:"system_theme_settings";i:1;s:9:"chameleon";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/themes/settings',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Chameleon',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings/garland',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_system_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:27:"themes/garland/garland.info";s:4:"name";s:7:"garland";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"1";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:13:{s:4:"name";s:7:"Garland";s:11:"description";s:66:"Tableless, recolorable, multi-column, fluid width theme (default).";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:11:"stylesheets";a:2:{s:3:"all";a:1:{s:9:"style.css";s:24:"themes/garland/style.css";}s:5:"print";a:1:{s:9:"print.css";s:24:"themes/garland/print.css";}}s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:7:"scripts";a:1:{s:9:"script.js";s:24:"themes/garland/script.js";}s:10:"screenshot";s:29:"themes/garland/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:2:{s:3:"all";a:1:{s:9:"style.css";s:24:"themes/garland/style.css";}s:5:"print";a:1:{s:9:"print.css";s:24:"themes/garland/print.css";}}s:6:"engine";s:11:"phptemplate";}}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:21:"system_theme_settings";i:1;s:7:"garland";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/themes/settings',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Garland',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings/global',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:21:"system_theme_settings";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/themes/settings',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Global settings',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-1',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings/marvin',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_system_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:35:"themes/chameleon/marvin/marvin.info";s:4:"name";s:6:"marvin";s:4:"type";s:5:"theme";s:5:"owner";s:0:"";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:13:{s:4:"name";s:6:"Marvin";s:11:"description";s:31:"Boxy tabled theme in all grays.";s:7:"regions";a:2:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";}s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:10:"base theme";s:9:"chameleon";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:33:"themes/chameleon/marvin/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:33:"themes/chameleon/marvin/script.js";}s:10:"screenshot";s:38:"themes/chameleon/marvin/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:33:"themes/chameleon/marvin/style.css";}}s:10:"base_theme";s:9:"chameleon";}}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:21:"system_theme_settings";i:1;s:6:"marvin";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/themes/settings',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Marvin',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings/minnelli',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_system_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":13:{s:8:"filename";s:37:"themes/garland/minnelli/minnelli.info";s:4:"name";s:8:"minnelli";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:14:{s:4:"name";s:8:"Minnelli";s:11:"description";s:56:"Tableless, recolorable, multi-column, fixed width theme.";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:10:"base theme";s:7:"garland";s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:12:"minnelli.css";s:36:"themes/garland/minnelli/minnelli.css";}}s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:7:"scripts";a:1:{s:9:"script.js";s:33:"themes/garland/minnelli/script.js";}s:10:"screenshot";s:38:"themes/garland/minnelli/screenshot.png";s:3:"php";s:5:"4.3.5";s:6:"engine";s:11:"phptemplate";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:12:"minnelli.css";s:36:"themes/garland/minnelli/minnelli.css";}}s:6:"engine";s:11:"phptemplate";s:10:"base_theme";s:7:"garland";}}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:21:"system_theme_settings";i:1;s:8:"minnelli";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/themes/settings',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Minnelli',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings/pushbutton',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_system_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:33:"themes/pushbutton/pushbutton.info";s:4:"name";s:10:"pushbutton";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:13:{s:4:"name";s:10:"Pushbutton";s:11:"description";s:52:"Tabled, multi-column theme in blue and orange tones.";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/pushbutton/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:27:"themes/pushbutton/script.js";}s:10:"screenshot";s:32:"themes/pushbutton/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/pushbutton/style.css";}}s:6:"engine";s:11:"phptemplate";}}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:21:"system_theme_settings";i:1;s:10:"pushbutton";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/themes/settings',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Pushbutton',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/by-module',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_admin_by_module',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => 'admin',
+  'tab_root' => 'admin',
+  'title' => 'By module',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '2',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/by-task',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_main_admin_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => 'admin',
+  'tab_root' => 'admin',
+  'title' => 'By task',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/compact',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_admin_compact_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'admin/compact',
+  'title' => 'Compact mode',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_admin_menu_block_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content',
+  'title' => 'Content management',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "Manage your site's content.",
+  'position' => 'left',
+  'weight' => '-10',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/node',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer nodes";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:18:"node_admin_content";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node',
+  'title' => 'Content',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "View, edit, and delete your site's content.",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-settings',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer nodes";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:14:"node_configure";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node-settings',
+  'title' => 'Post settings',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Control posting behavior, such as teaser length, requiring previews before posting, and the number of posts on the front page.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-settings/rebuild',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:30:"node_configure_rebuild_confirm";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node-settings/rebuild',
+  'title' => 'Rebuild permissions',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/page',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => "a:2:{i:0;s:14:\"node_type_form\";i:1;O:8:\"stdClass\":14:{s:4:\"type\";s:4:\"page\";s:4:\"name\";s:4:\"Page\";s:6:\"module\";s:4:\"node\";s:11:\"description\";s:296:\"A <em>page</em>, similar in form to a <em>story</em>, is a simple method for creating and displaying information that rarely changes, such as an \"About us\" section of a website. By default, a <em>page</em> entry does not allow visitor comments and is not featured on the site's initial home page.\";s:4:\"help\";s:0:\"\";s:9:\"has_title\";s:1:\"1\";s:11:\"title_label\";s:5:\"Title\";s:8:\"has_body\";s:1:\"1\";s:10:\"body_label\";s:4:\"Body\";s:14:\"min_word_count\";s:1:\"0\";s:6:\"custom\";s:1:\"1\";s:8:\"modified\";s:1:\"1\";s:6:\"locked\";s:1:\"0\";s:9:\"orig_type\";s:4:\"page\";}}",
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node-type/page',
+  'title' => 'Page',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/page/delete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => "a:2:{i:0;s:24:\"node_type_delete_confirm\";i:1;O:8:\"stdClass\":14:{s:4:\"type\";s:4:\"page\";s:4:\"name\";s:4:\"Page\";s:6:\"module\";s:4:\"node\";s:11:\"description\";s:296:\"A <em>page</em>, similar in form to a <em>story</em>, is a simple method for creating and displaying information that rarely changes, such as an \"About us\" section of a website. By default, a <em>page</em> entry does not allow visitor comments and is not featured on the site's initial home page.\";s:4:\"help\";s:0:\"\";s:9:\"has_title\";s:1:\"1\";s:11:\"title_label\";s:5:\"Title\";s:8:\"has_body\";s:1:\"1\";s:10:\"body_label\";s:4:\"Body\";s:14:\"min_word_count\";s:1:\"0\";s:6:\"custom\";s:1:\"1\";s:8:\"modified\";s:1:\"1\";s:6:\"locked\";s:1:\"0\";s:9:\"orig_type\";s:4:\"page\";}}",
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node-type/page/delete',
+  'title' => 'Delete',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/page/edit',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => "a:2:{i:0;s:14:\"node_type_form\";i:1;O:8:\"stdClass\":14:{s:4:\"type\";s:4:\"page\";s:4:\"name\";s:4:\"Page\";s:6:\"module\";s:4:\"node\";s:11:\"description\";s:296:\"A <em>page</em>, similar in form to a <em>story</em>, is a simple method for creating and displaying information that rarely changes, such as an \"About us\" section of a website. By default, a <em>page</em> entry does not allow visitor comments and is not featured on the site's initial home page.\";s:4:\"help\";s:0:\"\";s:9:\"has_title\";s:1:\"1\";s:11:\"title_label\";s:5:\"Title\";s:8:\"has_body\";s:1:\"1\";s:10:\"body_label\";s:4:\"Body\";s:14:\"min_word_count\";s:1:\"0\";s:6:\"custom\";s:1:\"1\";s:8:\"modified\";s:1:\"1\";s:6:\"locked\";s:1:\"0\";s:9:\"orig_type\";s:4:\"page\";}}",
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/content/node-type/page',
+  'tab_root' => 'admin/content/node-type/page',
+  'title' => 'Edit',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/story',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => "a:2:{i:0;s:14:\"node_type_form\";i:1;O:8:\"stdClass\":14:{s:4:\"type\";s:5:\"story\";s:4:\"name\";s:5:\"Story\";s:6:\"module\";s:4:\"node\";s:11:\"description\";s:392:\"A <em>story</em>, similar in form to a <em>page</em>, is ideal for creating and displaying content that informs or engages website visitors. Press releases, site announcements, and informal blog-like entries may all be created with a <em>story</em> entry. By default, a <em>story</em> entry is automatically featured on the site's initial home page, and provides the ability to post comments.\";s:4:\"help\";s:0:\"\";s:9:\"has_title\";s:1:\"1\";s:11:\"title_label\";s:5:\"Title\";s:8:\"has_body\";s:1:\"1\";s:10:\"body_label\";s:4:\"Body\";s:14:\"min_word_count\";s:1:\"0\";s:6:\"custom\";s:1:\"1\";s:8:\"modified\";s:1:\"1\";s:6:\"locked\";s:1:\"0\";s:9:\"orig_type\";s:5:\"story\";}}",
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node-type/story',
+  'title' => 'Story',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/story/delete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => "a:2:{i:0;s:24:\"node_type_delete_confirm\";i:1;O:8:\"stdClass\":14:{s:4:\"type\";s:5:\"story\";s:4:\"name\";s:5:\"Story\";s:6:\"module\";s:4:\"node\";s:11:\"description\";s:392:\"A <em>story</em>, similar in form to a <em>page</em>, is ideal for creating and displaying content that informs or engages website visitors. Press releases, site announcements, and informal blog-like entries may all be created with a <em>story</em> entry. By default, a <em>story</em> entry is automatically featured on the site's initial home page, and provides the ability to post comments.\";s:4:\"help\";s:0:\"\";s:9:\"has_title\";s:1:\"1\";s:11:\"title_label\";s:5:\"Title\";s:8:\"has_body\";s:1:\"1\";s:10:\"body_label\";s:4:\"Body\";s:14:\"min_word_count\";s:1:\"0\";s:6:\"custom\";s:1:\"1\";s:8:\"modified\";s:1:\"1\";s:6:\"locked\";s:1:\"0\";s:9:\"orig_type\";s:5:\"story\";}}",
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node-type/story/delete',
+  'title' => 'Delete',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/story/edit',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => "a:2:{i:0;s:14:\"node_type_form\";i:1;O:8:\"stdClass\":14:{s:4:\"type\";s:5:\"story\";s:4:\"name\";s:5:\"Story\";s:6:\"module\";s:4:\"node\";s:11:\"description\";s:392:\"A <em>story</em>, similar in form to a <em>page</em>, is ideal for creating and displaying content that informs or engages website visitors. Press releases, site announcements, and informal blog-like entries may all be created with a <em>story</em> entry. By default, a <em>story</em> entry is automatically featured on the site's initial home page, and provides the ability to post comments.\";s:4:\"help\";s:0:\"\";s:9:\"has_title\";s:1:\"1\";s:11:\"title_label\";s:5:\"Title\";s:8:\"has_body\";s:1:\"1\";s:10:\"body_label\";s:4:\"Body\";s:14:\"min_word_count\";s:1:\"0\";s:6:\"custom\";s:1:\"1\";s:8:\"modified\";s:1:\"1\";s:6:\"locked\";s:1:\"0\";s:9:\"orig_type\";s:5:\"story\";}}",
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/content/node-type/story',
+  'tab_root' => 'admin/content/node-type/story',
+  'title' => 'Edit',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node/overview',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer nodes";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:18:"node_admin_content";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/content/node',
+  'tab_root' => 'admin/content/node',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/node/node.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/rss-publishing',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:25:"system_rss_feeds_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/rss-publishing',
+  'title' => 'RSS publishing',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Configure the number of items per feed and whether feeds should be titles/teasers/full-text.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/types',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'node_overview_types',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/types',
+  'title' => 'Content types',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Manage posts by content type, including default status, front page promotion, etc.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/types/add',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:14:"node_type_form";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/content/types',
+  'tab_root' => 'admin/content/types',
+  'title' => 'Add content type',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/types/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'node_overview_types',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/content/types',
+  'tab_root' => 'admin/content/types',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/reports',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"access site reports";}',
+  'page_callback' => 'system_admin_menu_block_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports',
+  'title' => 'Reports',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'View reports from system logs and other status information.',
+  'position' => 'left',
+  'weight' => '5',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/access-denied',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"access site reports";}',
+  'page_callback' => 'dblog_top',
+  'page_arguments' => 'a:1:{i:0;s:13:"access denied";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/access-denied',
+  'title' => "Top 'access denied' errors",
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "View 'access denied' errors (403s).",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/dblog/dblog.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/dblog',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"access site reports";}',
+  'page_callback' => 'dblog_overview',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/dblog',
+  'title' => 'Recent log entries',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'View events that have recently been logged.',
+  'position' => '',
+  'weight' => '-1',
+  'file' => 'modules/dblog/dblog.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/event/%',
+  'load_functions' => 'a:1:{i:3;N;}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"access site reports";}',
+  'page_callback' => 'dblog_event',
+  'page_arguments' => 'a:1:{i:0;i:3;}',
+  'fit' => '14',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/event/%',
+  'title' => 'Details',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/dblog/dblog.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/page-not-found',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"access site reports";}',
+  'page_callback' => 'dblog_top',
+  'page_arguments' => 'a:1:{i:0;s:14:"page not found";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/page-not-found',
+  'title' => "Top 'page not found' errors",
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "View 'page not found' errors (404s).",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/dblog/dblog.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/status',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'system_status',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/status',
+  'title' => 'Status report',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "Get a status report about your site's operation and any detected problems.",
+  'position' => '',
+  'weight' => '10',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/status/php',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'system_php',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/status/php',
+  'title' => 'PHP',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/status/run-cron',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'system_run_cron',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/status/run-cron',
+  'title' => 'Run cron',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/status/sql',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'system_sql',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/status/sql',
+  'title' => 'SQL',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/updates',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'update_status',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/updates',
+  'title' => 'Available updates',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Get a status report about available updates for your installed modules and themes.',
+  'position' => '',
+  'weight' => '10',
+  'file' => 'modules/update/update.report.inc',
+))
+->values(array(
+  'path' => 'admin/reports/updates/check',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'update_manual_status',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/updates/check',
+  'title' => 'Manual update check',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/update/update.fetch.inc',
+))
+->values(array(
+  'path' => 'admin/reports/updates/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'update_status',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/reports/updates',
+  'tab_root' => 'admin/reports/updates',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/update/update.report.inc',
+))
+->values(array(
+  'path' => 'admin/reports/updates/settings',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:15:"update_settings";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/reports/updates',
+  'tab_root' => 'admin/reports/updates',
+  'title' => 'Settings',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/update/update.settings.inc',
+))
+->values(array(
+  'path' => 'admin/settings',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_settings_overview',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings',
+  'title' => 'Site configuration',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Adjust basic site configuration options.',
+  'position' => 'right',
+  'weight' => '-5',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/actions',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer actions";}',
+  'page_callback' => 'system_actions_manage',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/actions',
+  'title' => 'Actions',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Manage the actions defined for your site.',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'admin/settings/actions/configure',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer actions";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:24:"system_actions_configure";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/actions/configure',
+  'title' => 'Configure an advanced action',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'admin/settings/actions/delete/%',
+  'load_functions' => 'a:1:{i:4;s:12:"actions_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer actions";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:26:"system_actions_delete_form";i:1;i:4;}',
+  'fit' => '30',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/actions/delete/%',
+  'title' => 'Delete action',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => 'Delete an action.',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'admin/settings/actions/manage',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer actions";}',
+  'page_callback' => 'system_actions_manage',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/settings/actions',
+  'tab_root' => 'admin/settings/actions',
+  'title' => 'Manage actions',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => 'Manage the actions defined for your site.',
+  'position' => '',
+  'weight' => '-2',
+  'file' => '',
+))
+->values(array(
+  'path' => 'admin/settings/actions/orphan',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer actions";}',
+  'page_callback' => 'system_actions_remove_orphans',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/actions/orphan',
+  'title' => 'Remove orphans',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'admin/settings/admin',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:27:"system_admin_theme_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/admin',
+  'title' => 'Administration theme',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => 'system_admin_theme_settings',
+  'description' => 'Settings for how your administrative pages should look.',
+  'position' => 'left',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/clean-urls',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:25:"system_clean_url_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/clean-urls',
+  'title' => 'Clean URLs',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Enable or disable clean URLs for your site.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/clean-urls/check',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '1',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'drupal_json',
+  'page_arguments' => 'a:1:{i:0;a:1:{s:6:"status";b:1;}}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/clean-urls/check',
+  'title' => 'Clean URL check',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'admin/settings/date-time',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:25:"system_date_time_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/date-time',
+  'title' => 'Date and time',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "Settings for how Drupal displays date and time, as well as the system's default timezone.",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/date-time/lookup',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'system_date_time_lookup',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/date-time/lookup',
+  'title' => 'Date and time lookup',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/error-reporting',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:31:"system_error_reporting_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/error-reporting',
+  'title' => 'Error reporting',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Control how Drupal deals with errors including 403/404 errors as well as PHP error reporting.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/file-system',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:27:"system_file_system_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/file-system',
+  'title' => 'File system',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Tell Drupal where to store uploaded files and how they are accessed.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:21:"filter_admin_overview";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/filters',
+  'title' => 'Input formats',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Configure how content input by users is filtered, including allowed HTML tags. Also allows enabling of module-provided filters.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters/%',
+  'load_functions' => 'a:1:{i:3;s:18:"filter_format_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'filter_admin_format_page',
+  'page_arguments' => 'a:1:{i:0;i:3;}',
+  'fit' => '14',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/filters/%',
+  'title' => '',
+  'title_callback' => 'filter_admin_format_title',
+  'title_arguments' => 'a:1:{i:0;i:3;}',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters/%/configure',
+  'load_functions' => 'a:1:{i:3;s:18:"filter_format_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'filter_admin_configure_page',
+  'page_arguments' => 'a:1:{i:0;i:3;}',
+  'fit' => '29',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/settings/filters/%',
+  'tab_root' => 'admin/settings/filters/%',
+  'title' => 'Configure',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '1',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters/%/edit',
+  'load_functions' => 'a:1:{i:3;s:18:"filter_format_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'filter_admin_format_page',
+  'page_arguments' => 'a:1:{i:0;i:3;}',
+  'fit' => '29',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/settings/filters/%',
+  'tab_root' => 'admin/settings/filters/%',
+  'title' => 'Edit',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters/%/order',
+  'load_functions' => 'a:1:{i:3;s:18:"filter_format_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'filter_admin_order_page',
+  'page_arguments' => 'a:1:{i:0;i:3;}',
+  'fit' => '29',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/settings/filters/%',
+  'tab_root' => 'admin/settings/filters/%',
+  'title' => 'Rearrange',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '2',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters/add',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'filter_admin_format_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/settings/filters',
+  'tab_root' => 'admin/settings/filters',
+  'title' => 'Add input format',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '1',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters/delete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:19:"filter_admin_delete";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/filters/delete',
+  'title' => 'Delete input format',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:21:"filter_admin_overview";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/settings/filters',
+  'tab_root' => 'admin/settings/filters',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/image-toolkit',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:29:"system_image_toolkit_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/image-toolkit',
+  'title' => 'Image toolkit',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Choose which image toolkit to use if you have installed optional toolkits.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/logging',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'system_logging_overview',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/logging',
+  'title' => 'Logging and alerts',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "Settings for logging and alerts modules. Various modules can route Drupal's system events to different destination, such as syslog, database, email, ...etc.",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/logging/dblog',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:20:"dblog_admin_settings";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/logging/dblog',
+  'title' => 'Database logging',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Settings for logging to the Drupal database logs. This is the most common method for small to medium sites on shared hosting. The logs are viewable from the admin pages.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/dblog/dblog.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/performance',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:27:"system_performance_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/performance',
+  'title' => 'Performance',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Enable or disable page caching for anonymous users and set CSS and JS bandwidth optimization options.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/site-information',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:32:"system_site_information_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/site-information',
+  'title' => 'Site information',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Change basic site information, such as the site name, slogan, e-mail address, mission, front page and more.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/site-maintenance',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:32:"system_site_maintenance_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/site-maintenance',
+  'title' => 'Site maintenance',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Take the site off-line for maintenance or bring it back online.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_admin_menu_block_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user',
+  'title' => 'User management',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "Manage your site's users, groups and access to site features.",
+  'position' => 'left',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/permissions',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:15:"user_admin_perm";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/permissions',
+  'title' => 'Permissions',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Determine access to features by selecting permissions for roles.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/roles',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:19:"user_admin_new_role";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/roles',
+  'title' => 'Roles',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'List, edit, or add user roles.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/roles/edit',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:15:"user_admin_role";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/roles/edit',
+  'title' => 'Edit role',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/rules',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'user_admin_access',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/rules',
+  'title' => 'Access rules',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'List and create rules to disallow usernames, e-mail addresses, and IP addresses.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/rules/add',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'user_admin_access_add',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/user/rules',
+  'tab_root' => 'admin/user/rules',
+  'title' => 'Add rule',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/rules/check',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'user_admin_access_check',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/user/rules',
+  'tab_root' => 'admin/user/rules',
+  'title' => 'Check rules',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/rules/delete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:32:"user_admin_access_delete_confirm";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/rules/delete',
+  'title' => 'Delete rule',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/rules/edit',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'user_admin_access_edit',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/rules/edit',
+  'title' => 'Edit rule',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/rules/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'user_admin_access',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/user/rules',
+  'tab_root' => 'admin/user/rules',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/settings',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer users";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:19:"user_admin_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/settings',
+  'title' => 'User settings',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Configure default behavior of users, including registration requirements, e-mails, and user pictures.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/user',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer users";}',
+  'page_callback' => 'user_admin',
+  'page_arguments' => 'a:1:{i:0;s:4:"list";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/user',
+  'title' => 'Users',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'List, add, and edit users.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/user/create',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer users";}',
+  'page_callback' => 'user_admin',
+  'page_arguments' => 'a:1:{i:0;s:6:"create";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/user/user',
+  'tab_root' => 'admin/user/user',
+  'title' => 'Add user',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/user/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer users";}',
+  'page_callback' => 'user_admin',
+  'page_arguments' => 'a:1:{i:0;s:4:"list";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/user/user',
+  'tab_root' => 'admin/user/user',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'batch',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '1',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'system_batch_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '1',
+  'number_parts' => '1',
+  'tab_parent' => '',
+  'tab_root' => 'batch',
+  'title' => '',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'filter/tips',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '1',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'filter_tips_long',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'filter/tips',
+  'title' => 'Compose tips',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '20',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/filter/filter.pages.inc',
+))
+->values(array(
+  'path' => 'logout',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_is_logged_in',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'user_logout',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '1',
+  'number_parts' => '1',
+  'tab_parent' => '',
+  'tab_root' => 'logout',
+  'title' => 'Log out',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '10',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'node',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:14:"access content";}',
+  'page_callback' => 'node_page_default',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '1',
+  'number_parts' => '1',
+  'tab_parent' => '',
+  'tab_root' => 'node',
+  'title' => 'Content',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'node/%',
+  'load_functions' => 'a:1:{i:1;s:9:"node_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'node_access',
+  'access_arguments' => 'a:2:{i:0;s:4:"view";i:1;i:1;}',
+  'page_callback' => 'node_page_view',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '2',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'node/%',
+  'title' => '',
+  'title_callback' => 'node_page_title',
+  'title_arguments' => 'a:1:{i:0;i:1;}',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'node/%/delete',
+  'load_functions' => 'a:1:{i:1;s:9:"node_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'node_access',
+  'access_arguments' => 'a:2:{i:0;s:6:"delete";i:1;i:1;}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:19:"node_delete_confirm";i:1;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'node/%/delete',
+  'title' => 'Delete',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '1',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/%/edit',
+  'load_functions' => 'a:1:{i:1;s:9:"node_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'node_access',
+  'access_arguments' => 'a:2:{i:0;s:6:"update";i:1;i:1;}',
+  'page_callback' => 'node_page_edit',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => 'node/%',
+  'tab_root' => 'node/%',
+  'title' => 'Edit',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '1',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/%/revisions',
+  'load_functions' => 'a:1:{i:1;s:9:"node_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => '_node_revision_access',
+  'access_arguments' => 'a:1:{i:0;i:1;}',
+  'page_callback' => 'node_revision_overview',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => 'node/%',
+  'tab_root' => 'node/%',
+  'title' => 'Revisions',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '2',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/%/revisions/%/delete',
+  'load_functions' => 'a:2:{i:1;a:1:{s:9:"node_load";a:1:{i:0;i:3;}}i:3;N;}',
+  'to_arg_functions' => '',
+  'access_callback' => '_node_revision_access',
+  'access_arguments' => 'a:2:{i:0;i:1;i:1;s:6:"delete";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:28:"node_revision_delete_confirm";i:1;i:1;}',
+  'fit' => '21',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'node/%/revisions/%/delete',
+  'title' => 'Delete earlier revision',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/%/revisions/%/revert',
+  'load_functions' => 'a:2:{i:1;a:1:{s:9:"node_load";a:1:{i:0;i:3;}}i:3;N;}',
+  'to_arg_functions' => '',
+  'access_callback' => '_node_revision_access',
+  'access_arguments' => 'a:2:{i:0;i:1;i:1;s:6:"update";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:28:"node_revision_revert_confirm";i:1;i:1;}',
+  'fit' => '21',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'node/%/revisions/%/revert',
+  'title' => 'Revert to earlier revision',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/%/revisions/%/view',
+  'load_functions' => 'a:2:{i:1;a:1:{s:9:"node_load";a:1:{i:0;i:3;}}i:3;N;}',
+  'to_arg_functions' => '',
+  'access_callback' => '_node_revision_access',
+  'access_arguments' => 'a:1:{i:0;i:1;}',
+  'page_callback' => 'node_show',
+  'page_arguments' => 'a:3:{i:0;i:1;i:1;N;i:2;b:1;}',
+  'fit' => '21',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'node/%/revisions/%/view',
+  'title' => 'Revisions',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'node/%/view',
+  'load_functions' => 'a:1:{i:1;s:9:"node_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'node_access',
+  'access_arguments' => 'a:2:{i:0;s:4:"view";i:1;i:1;}',
+  'page_callback' => 'node_page_view',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => 'node/%',
+  'tab_root' => 'node/%',
+  'title' => 'View',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => '',
+))
+->values(array(
+  'path' => 'node/add',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_node_add_access',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'node_add_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'node/add',
+  'title' => 'Create content',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '1',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/add/page',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'node_access',
+  'access_arguments' => 'a:2:{i:0;s:6:"create";i:1;s:4:"page";}',
+  'page_callback' => 'node_add',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'node/add/page',
+  'title' => 'Page',
+  'title_callback' => 'check_plain',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "A <em>page</em>, similar in form to a <em>story</em>, is a simple method for creating and displaying information that rarely changes, such as an \"About us\" section of a website. By default, a <em>page</em> entry does not allow visitor comments and is not featured on the site's initial home page.",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/add/story',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'node_access',
+  'access_arguments' => 'a:2:{i:0;s:6:"create";i:1;s:5:"story";}',
+  'page_callback' => 'node_add',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'node/add/story',
+  'title' => 'Story',
+  'title_callback' => 'check_plain',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "A <em>story</em>, similar in form to a <em>page</em>, is ideal for creating and displaying content that informs or engages website visitors. Press releases, site announcements, and informal blog-like entries may all be created with a <em>story</em> entry. By default, a <em>story</em> entry is automatically featured on the site's initial home page, and provides the ability to post comments.",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'rss.xml',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:14:"access content";}',
+  'page_callback' => 'node_feed',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '1',
+  'number_parts' => '1',
+  'tab_parent' => '',
+  'tab_root' => 'rss.xml',
+  'title' => 'RSS feed',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'system/files',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '1',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'file_download',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'system/files',
+  'title' => 'File download',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'user',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '1',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'user_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '1',
+  'number_parts' => '1',
+  'tab_parent' => '',
+  'tab_root' => 'user',
+  'title' => 'User account',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/%',
+  'load_functions' => 'a:1:{i:1;s:22:"user_uid_optional_load";}',
+  'to_arg_functions' => 'a:1:{i:1;s:24:"user_uid_optional_to_arg";}',
+  'access_callback' => 'user_view_access',
+  'access_arguments' => 'a:1:{i:0;i:1;}',
+  'page_callback' => 'user_view',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '2',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'user/%',
+  'title' => 'My account',
+  'title_callback' => 'user_page_title',
+  'title_arguments' => 'a:1:{i:0;i:1;}',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/%/delete',
+  'load_functions' => 'a:1:{i:1;s:9:"user_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer users";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:19:"user_confirm_delete";i:1;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'user/%/delete',
+  'title' => 'Delete',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/%/edit',
+  'load_functions' => 'a:1:{i:1;a:1:{s:18:"user_category_load";a:2:{i:0;s:4:"%map";i:1;s:6:"%index";}}}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_edit_access',
+  'access_arguments' => 'a:1:{i:0;i:1;}',
+  'page_callback' => 'user_edit',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => 'user/%',
+  'tab_root' => 'user/%',
+  'title' => 'Edit',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/%/edit/account',
+  'load_functions' => 'a:1:{i:1;a:1:{s:18:"user_category_load";a:2:{i:0;s:4:"%map";i:1;s:6:"%index";}}}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_edit_access',
+  'access_arguments' => 'a:1:{i:0;i:1;}',
+  'page_callback' => 'user_edit',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '11',
+  'number_parts' => '4',
+  'tab_parent' => 'user/%/edit',
+  'tab_root' => 'user/%',
+  'title' => 'Account',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/%/view',
+  'load_functions' => 'a:1:{i:1;s:9:"user_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_view_access',
+  'access_arguments' => 'a:1:{i:0;i:1;}',
+  'page_callback' => 'user_view',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => 'user/%',
+  'tab_root' => 'user/%',
+  'title' => 'View',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/autocomplete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:20:"access user profiles";}',
+  'page_callback' => 'user_autocomplete',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'user/autocomplete',
+  'title' => 'User autocomplete',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/login',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_is_anonymous',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'user_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => 'user',
+  'tab_root' => 'user',
+  'title' => 'Log in',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/password',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_is_anonymous',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:9:"user_pass";}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => 'user',
+  'tab_root' => 'user',
+  'title' => 'Request new password',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/register',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_register_access',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:13:"user_register";}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => 'user',
+  'tab_root' => 'user',
+  'title' => 'Create new account',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/reset/%/%/%',
+  'load_functions' => 'a:3:{i:2;N;i:3;N;i:4;N;}',
+  'to_arg_functions' => '',
+  'access_callback' => '1',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:4:{i:0;s:15:"user_pass_reset";i:1;i:2;i:2;i:3;i:3;i:4;}',
+  'fit' => '24',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'user/reset/%/%/%',
+  'title' => 'Reset password',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->execute();
+
+db_create_table('node', array(
+  'fields' => array(
+    'nid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'vid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'type' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'language' => array(
+      'type' => 'varchar',
+      'length' => 12,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'title' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'uid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 1,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'changed' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'comment' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'promote' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'moderate' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'sticky' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'tnid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'translate' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'node_changed' => array(
+      'changed',
+    ),
+    'node_created' => array(
+      'created',
+    ),
+    'node_moderate' => array(
+      'moderate',
+    ),
+    'node_promote_status' => array(
+      'promote',
+      'status',
+    ),
+    'node_status_type' => array(
+      'status',
+      'type',
+      'nid',
+    ),
+    'node_title_type' => array(
+      'title',
+      array(
+        'type',
+        4,
+      ),
+    ),
+    'node_type' => array(
+      array(
+        'type',
+        4,
+      ),
+    ),
+    'uid' => array(
+      'uid',
+    ),
+    'tnid' => array(
+      'tnid',
+    ),
+    'translate' => array(
+      'translate',
+    ),
+  ),
+  'unique keys' => array(
+    'vid' => array(
+      'vid',
+    ),
+  ),
+  'primary key' => array(
+    'nid',
+  ),
+  'module' => 'node',
+  'name' => 'node',
+));
+
+db_create_table('node_access', array(
+  'fields' => array(
+    'nid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'gid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'realm' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'grant_view' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'grant_update' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'grant_delete' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+  ),
+  'primary key' => array(
+    'nid',
+    'gid',
+    'realm',
+  ),
+  'module' => 'node',
+  'name' => 'node_access',
+));
+db_insert('node_access')->fields(array(
+  'nid',
+  'gid',
+  'realm',
+  'grant_view',
+  'grant_update',
+  'grant_delete',
+))
+->values(array(
+  'nid' => '0',
+  'gid' => '0',
+  'realm' => 'all',
+  'grant_view' => '1',
+  'grant_update' => '0',
+  'grant_delete' => '0',
+))
+->execute();
+
+db_create_table('node_counter', array(
+  'fields' => array(
+    'nid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'totalcount' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'big',
+    ),
+    'daycount' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'medium',
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'nid',
+  ),
+  'module' => 'node',
+  'name' => 'node_counter',
+));
+
+db_create_table('node_revisions', array(
+  'fields' => array(
+    'nid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'vid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'uid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'title' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'body' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+    'teaser' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+    'log' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'format' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'nid' => array(
+      'nid',
+    ),
+    'uid' => array(
+      'uid',
+    ),
+  ),
+  'primary key' => array(
+    'vid',
+  ),
+  'module' => 'node',
+  'name' => 'node_revisions',
+));
+
+db_create_table('node_type', array(
+  'fields' => array(
+    'type' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'module' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+    ),
+    'description' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'medium',
+    ),
+    'help' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'medium',
+    ),
+    'has_title' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'size' => 'tiny',
+    ),
+    'title_label' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'has_body' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'size' => 'tiny',
+    ),
+    'body_label' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'min_word_count' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'size' => 'small',
+    ),
+    'custom' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'modified' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'locked' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'orig_type' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+  ),
+  'primary key' => array(
+    'type',
+  ),
+  'module' => 'node',
+  'name' => 'node_type',
+));
+db_insert('node_type')->fields(array(
+  'type',
+  'name',
+  'module',
+  'description',
+  'help',
+  'has_title',
+  'title_label',
+  'has_body',
+  'body_label',
+  'min_word_count',
+  'custom',
+  'modified',
+  'locked',
+  'orig_type',
+))
+->values(array(
+  'type' => 'page',
+  'name' => 'Page',
+  'module' => 'node',
+  'description' => "A <em>page</em>, similar in form to a <em>story</em>, is a simple method for creating and displaying information that rarely changes, such as an \"About us\" section of a website. By default, a <em>page</em> entry does not allow visitor comments and is not featured on the site's initial home page.",
+  'help' => '',
+  'has_title' => '1',
+  'title_label' => 'Title',
+  'has_body' => '1',
+  'body_label' => 'Body',
+  'min_word_count' => '0',
+  'custom' => '1',
+  'modified' => '1',
+  'locked' => '0',
+  'orig_type' => 'page',
+))
+->values(array(
+  'type' => 'story',
+  'name' => 'Story',
+  'module' => 'node',
+  'description' => "A <em>story</em>, similar in form to a <em>page</em>, is ideal for creating and displaying content that informs or engages website visitors. Press releases, site announcements, and informal blog-like entries may all be created with a <em>story</em> entry. By default, a <em>story</em> entry is automatically featured on the site's initial home page, and provides the ability to post comments.",
+  'help' => '',
+  'has_title' => '1',
+  'title_label' => 'Title',
+  'has_body' => '1',
+  'body_label' => 'Body',
+  'min_word_count' => '0',
+  'custom' => '1',
+  'modified' => '1',
+  'locked' => '0',
+  'orig_type' => 'story',
+))
+->execute();
+
+db_create_table('permission', array(
+  'fields' => array(
+    'pid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'rid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'perm' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'tid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'pid',
+  ),
+  'indexes' => array(
+    'rid' => array(
+      'rid',
+    ),
+  ),
+  'module' => 'user',
+  'name' => 'permission',
+));
+db_insert('permission')->fields(array(
+  'pid',
+  'rid',
+  'perm',
+  'tid',
+))
+->values(array(
+  'pid' => '1',
+  'rid' => '1',
+  'perm' => 'access content',
+  'tid' => '0',
+))
+->values(array(
+  'pid' => '2',
+  'rid' => '2',
+  'perm' => 'access comments, access content, post comments, post comments without approval',
+  'tid' => '0',
+))
+->execute();
+
+db_create_table('role', array(
+  'fields' => array(
+    'rid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+  ),
+  'unique keys' => array(
+    'name' => array(
+      'name',
+    ),
+  ),
+  'primary key' => array(
+    'rid',
+  ),
+  'module' => 'user',
+  'name' => 'role',
+));
+db_insert('role')->fields(array(
+  'rid',
+  'name',
+))
+->values(array(
+  'rid' => '1',
+  'name' => 'anonymous user',
+))
+->values(array(
+  'rid' => '2',
+  'name' => 'authenticated user',
+))
+->execute();
+
+db_create_table('semaphore', array(
+  'fields' => array(
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'value' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'expire' => array(
+      'type' => 'float',
+      'size' => 'big',
+      'not null' => TRUE,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'name',
+  ),
+  'module' => 'system',
+  'name' => 'semaphore',
+));
+
+db_create_table('sessions', array(
+  'fields' => array(
+    'uid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'sid' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'hostname' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'cache' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'session' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+  ),
+  'primary key' => array(
+    'sid',
+  ),
+  'indexes' => array(
+    'timestamp' => array(
+      'timestamp',
+    ),
+    'uid' => array(
+      'uid',
+    ),
+  ),
+  'module' => 'system',
+  'name' => 'sessions',
+));
+
+db_create_table('system', array(
+  'fields' => array(
+    'filename' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'type' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'owner' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'throttle' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'bootstrap' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'schema_version' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => -1,
+      'size' => 'small',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'info' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+  ),
+  'primary key' => array(
+    'filename',
+  ),
+  'indexes' => array(
+    'modules' => array(
+      array(
+        'type',
+        12,
+      ),
+      'status',
+      'weight',
+      'filename',
+    ),
+    'bootstrap' => array(
+      array(
+        'type',
+        12,
+      ),
+      'status',
+      'bootstrap',
+      'weight',
+      'filename',
+    ),
+    'type_name' => array(
+      array(
+        'type',
+        12,
+      ),
+      'name',
+    ),
+  ),
+  'module' => 'system',
+  'name' => 'system',
+));
+db_insert('system')->fields(array(
+  'filename',
+  'name',
+  'type',
+  'owner',
+  'status',
+  'throttle',
+  'bootstrap',
+  'schema_version',
+  'weight',
+  'info',
+))
+->values(array(
+  'filename' => 'modules/aggregator/aggregator.module',
+  'name' => 'aggregator',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:10:"Aggregator";s:11:"description";s:57:"Aggregates syndicated content (RSS, RDF, and Atom feeds).";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/block/block.module',
+  'name' => 'block',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:5:"Block";s:11:"description";s:62:"Controls the boxes that are displayed around the main content.";s:7:"package";s:15:"Core - required";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/blog/blog.module',
+  'name' => 'blog',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:4:"Blog";s:11:"description";s:69:"Enables keeping easily and regularly updated user web pages or blogs.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/blogapi/blogapi.module',
+  'name' => 'blogapi',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:8:"Blog API";s:11:"description";s:79:"Allows users to post content using applications that support XML-RPC blog APIs.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/book/book.module',
+  'name' => 'book',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:4:"Book";s:11:"description";s:63:"Allows users to structure site pages in a hierarchy or outline.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/color/color.module',
+  'name' => 'color',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:5:"Color";s:11:"description";s:61:"Allows the user to change the color scheme of certain themes.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/comment/comment.module',
+  'name' => 'comment',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:7:"Comment";s:11:"description";s:57:"Allows users to comment on and discuss published content.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/contact/contact.module',
+  'name' => 'contact',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:7:"Contact";s:11:"description";s:61:"Enables the use of both personal and site-wide contact forms.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/dblog/dblog.module',
+  'name' => 'dblog',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '6000',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:16:"Database logging";s:11:"description";s:47:"Logs and records system events to the database.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/filter/filter.module',
+  'name' => 'filter',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:6:"Filter";s:11:"description";s:60:"Handles the filtering of content in preparation for display.";s:7:"package";s:15:"Core - required";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/forum/forum.module',
+  'name' => 'forum',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:5:"Forum";s:11:"description";s:50:"Enables threaded discussions about general topics.";s:12:"dependencies";a:2:{i:0;s:8:"taxonomy";i:1;s:7:"comment";}s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/help/help.module',
+  'name' => 'help',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:4:"Help";s:11:"description";s:35:"Manages the display of online help.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/locale/locale.module',
+  'name' => 'locale',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:6:"Locale";s:11:"description";s:119:"Adds language handling functionality and enables the translation of the user interface to languages other than English.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/menu/menu.module',
+  'name' => 'menu',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:4:"Menu";s:11:"description";s:60:"Allows administrators to customize the site navigation menu.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/node/node.module',
+  'name' => 'node',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:4:"Node";s:11:"description";s:66:"Allows content to be submitted to the site and displayed on pages.";s:7:"package";s:15:"Core - required";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/openid/openid.module',
+  'name' => 'openid',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:6:"OpenID";s:11:"description";s:48:"Allows users to log into your site using OpenID.";s:7:"version";s:4:"6.17";s:7:"package";s:15:"Core - optional";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/path/path.module',
+  'name' => 'path',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:4:"Path";s:11:"description";s:28:"Allows users to rename URLs.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/php/php.module',
+  'name' => 'php',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:10:"PHP filter";s:11:"description";s:50:"Allows embedded PHP code/snippets to be evaluated.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/ping/ping.module',
+  'name' => 'ping',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:4:"Ping";s:11:"description";s:51:"Alerts other sites when your site has been updated.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/poll/poll.module',
+  'name' => 'poll',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:4:"Poll";s:11:"description";s:95:"Allows your site to capture votes on different topics in the form of multiple choice questions.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/profile/profile.module',
+  'name' => 'profile',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:7:"Profile";s:11:"description";s:36:"Supports configurable user profiles.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/search/search.module',
+  'name' => 'search',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:6:"Search";s:11:"description";s:36:"Enables site-wide keyword searching.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/statistics/statistics.module',
+  'name' => 'statistics',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:10:"Statistics";s:11:"description";s:37:"Logs access statistics for your site.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/syslog/syslog.module',
+  'name' => 'syslog',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:6:"Syslog";s:11:"description";s:41:"Logs and records system events to syslog.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/system/system.module',
+  'name' => 'system',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '6055',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:6:"System";s:11:"description";s:54:"Handles general site configuration for administrators.";s:7:"package";s:15:"Core - required";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/taxonomy/taxonomy.module',
+  'name' => 'taxonomy',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:8:"Taxonomy";s:11:"description";s:38:"Enables the categorization of content.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/throttle/throttle.module',
+  'name' => 'throttle',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:8:"Throttle";s:11:"description";s:66:"Handles the auto-throttling mechanism, to control site congestion.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/tracker/tracker.module',
+  'name' => 'tracker',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:7:"Tracker";s:11:"description";s:43:"Enables tracking of recent posts for users.";s:12:"dependencies";a:1:{i:0;s:7:"comment";}s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/translation/translation.module',
+  'name' => 'translation',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:19:"Content translation";s:11:"description";s:57:"Allows content to be translated into different languages.";s:12:"dependencies";a:1:{i:0;s:6:"locale";}s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/trigger/trigger.module',
+  'name' => 'trigger',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:7:"Trigger";s:11:"description";s:90:"Enables actions to be fired on certain system events, such as when new content is created.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/update/update.module',
+  'name' => 'update',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '6000',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:13:"Update status";s:11:"description";s:88:"Checks the status of available updates for Drupal and your installed modules and themes.";s:7:"version";s:4:"6.17";s:7:"package";s:15:"Core - optional";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/upload/upload.module',
+  'name' => 'upload',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:6:"Upload";s:11:"description";s:51:"Allows users to upload and attach files to content.";s:7:"package";s:15:"Core - optional";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/user/user.module',
+  'name' => 'user',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:4:"User";s:11:"description";s:47:"Manages the user registration and login system.";s:7:"package";s:15:"Core - required";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'themes/bluemarine/bluemarine.info',
+  'name' => 'bluemarine',
+  'type' => 'theme',
+  'owner' => 'themes/engines/phptemplate/phptemplate.engine',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:13:{s:4:"name";s:10:"Bluemarine";s:11:"description";s:66:"Table-based multi-column theme with a marine and ash color scheme.";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/bluemarine/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:27:"themes/bluemarine/script.js";}s:10:"screenshot";s:32:"themes/bluemarine/screenshot.png";s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'themes/chameleon/chameleon.info',
+  'name' => 'chameleon',
+  'type' => 'theme',
+  'owner' => 'themes/chameleon/chameleon.theme',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:12:{s:4:"name";s:9:"Chameleon";s:11:"description";s:42:"Minimalist tabled theme with light colors.";s:7:"regions";a:2:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";}s:8:"features";a:4:{i:0;s:4:"logo";i:1;s:7:"favicon";i:2;s:4:"name";i:3;s:6:"slogan";}s:11:"stylesheets";a:1:{s:3:"all";a:2:{s:9:"style.css";s:26:"themes/chameleon/style.css";s:10:"common.css";s:27:"themes/chameleon/common.css";}}s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"scripts";a:1:{s:9:"script.js";s:26:"themes/chameleon/script.js";}s:10:"screenshot";s:31:"themes/chameleon/screenshot.png";s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'themes/chameleon/marvin/marvin.info',
+  'name' => 'marvin',
+  'type' => 'theme',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:13:{s:4:"name";s:6:"Marvin";s:11:"description";s:31:"Boxy tabled theme in all grays.";s:7:"regions";a:2:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";}s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:10:"base theme";s:9:"chameleon";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:33:"themes/chameleon/marvin/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:33:"themes/chameleon/marvin/script.js";}s:10:"screenshot";s:38:"themes/chameleon/marvin/screenshot.png";s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'themes/garland/garland.info',
+  'name' => 'garland',
+  'type' => 'theme',
+  'owner' => 'themes/engines/phptemplate/phptemplate.engine',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:13:{s:4:"name";s:7:"Garland";s:11:"description";s:66:"Tableless, recolorable, multi-column, fluid width theme (default).";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:11:"stylesheets";a:2:{s:3:"all";a:1:{s:9:"style.css";s:24:"themes/garland/style.css";}s:5:"print";a:1:{s:9:"print.css";s:24:"themes/garland/print.css";}}s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:7:"scripts";a:1:{s:9:"script.js";s:24:"themes/garland/script.js";}s:10:"screenshot";s:29:"themes/garland/screenshot.png";s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'themes/garland/minnelli/minnelli.info',
+  'name' => 'minnelli',
+  'type' => 'theme',
+  'owner' => 'themes/engines/phptemplate/phptemplate.engine',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:14:{s:4:"name";s:8:"Minnelli";s:11:"description";s:56:"Tableless, recolorable, multi-column, fixed width theme.";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:10:"base theme";s:7:"garland";s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:12:"minnelli.css";s:36:"themes/garland/minnelli/minnelli.css";}}s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:7:"scripts";a:1:{s:9:"script.js";s:33:"themes/garland/minnelli/script.js";}s:10:"screenshot";s:38:"themes/garland/minnelli/screenshot.png";s:3:"php";s:5:"4.3.5";s:6:"engine";s:11:"phptemplate";}',
+))
+->values(array(
+  'filename' => 'themes/pushbutton/pushbutton.info',
+  'name' => 'pushbutton',
+  'type' => 'theme',
+  'owner' => 'themes/engines/phptemplate/phptemplate.engine',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:13:{s:4:"name";s:10:"Pushbutton";s:11:"description";s:52:"Tabled, multi-column theme in blue and orange tones.";s:7:"version";s:4:"6.17";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1275505216";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/pushbutton/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:27:"themes/pushbutton/script.js";}s:10:"screenshot";s:32:"themes/pushbutton/screenshot.png";s:3:"php";s:5:"4.3.5";}',
+))
+->execute();
+
+db_create_table('url_alias', array(
+  'fields' => array(
+    'pid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'src' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'dst' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'language' => array(
+      'type' => 'varchar',
+      'length' => 12,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+  ),
+  'unique keys' => array(
+    'dst_language_pid' => array(
+      'dst',
+      'language',
+      'pid',
+    ),
+  ),
+  'primary key' => array(
+    'pid',
+  ),
+  'indexes' => array(
+    'src_language_pid' => array(
+      'src',
+      'language',
+      'pid',
+    ),
+  ),
+  'module' => 'system',
+  'name' => 'url_alias',
+));
+
+db_create_table('users', array(
+  'fields' => array(
+    'uid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 60,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'pass' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'mail' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => FALSE,
+      'default' => '',
+    ),
+    'mode' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'sort' => array(
+      'type' => 'int',
+      'not null' => FALSE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'threshold' => array(
+      'type' => 'int',
+      'not null' => FALSE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'theme' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'signature' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'signature_format' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'access' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'login' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'timezone' => array(
+      'type' => 'varchar',
+      'length' => 8,
+      'not null' => FALSE,
+    ),
+    'language' => array(
+      'type' => 'varchar',
+      'length' => 12,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'picture' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'init' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => FALSE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+  ),
+  'indexes' => array(
+    'access' => array(
+      'access',
+    ),
+    'created' => array(
+      'created',
+    ),
+    'mail' => array(
+      'mail',
+    ),
+  ),
+  'unique keys' => array(
+    'name' => array(
+      'name',
+    ),
+  ),
+  'primary key' => array(
+    'uid',
+  ),
+  'module' => 'user',
+  'name' => 'users',
+));
+db_insert('users')->fields(array(
+  'uid',
+  'name',
+  'pass',
+  'mail',
+  'mode',
+  'sort',
+  'threshold',
+  'theme',
+  'signature',
+  'signature_format',
+  'created',
+  'access',
+  'login',
+  'status',
+  'timezone',
+  'language',
+  'picture',
+  'init',
+  'data',
+))
+->values(array(
+  'uid' => 1,
+  'name' => '',
+  'pass' => '',
+  'mail' => '',
+  'mode' => '0',
+  'sort' => '0',
+  'threshold' => '0',
+  'theme' => '',
+  'signature' => '',
+  'signature_format' => '0',
+  'created' => '0',
+  'access' => '0',
+  'login' => '0',
+  'status' => '0',
+  'timezone' => '-21600',
+  'language' => '',
+  'picture' => '',
+  'init' => '',
+  'data' => NULL,
+))
+->values(array(
+  'uid' => 2,
+  'name' => 'admin',
+  'pass' => '21232f297a57a5a743894a0e4a801fc3',
+  'mail' => 'admin@example.com',
+  'mode' => '0',
+  'sort' => '0',
+  'threshold' => '0',
+  'theme' => '',
+  'signature' => '',
+  'signature_format' => '0',
+  'created' => '1277671599',
+  'access' => '1277671612',
+  'login' => '1277671612',
+  'status' => '1',
+  'timezone' => '-21600',
+  'language' => '',
+  'picture' => '',
+  'init' => 'admin@example.com',
+  'data' => 'a:0:{}',
+))
+->execute();
+db_query('UPDATE {users} SET uid = uid - 1');
+
+db_create_table('users_roles', array(
+  'fields' => array(
+    'uid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'rid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'uid',
+    'rid',
+  ),
+  'indexes' => array(
+    'rid' => array(
+      'rid',
+    ),
+  ),
+  'module' => 'user',
+  'name' => 'users_roles',
+));
+
+db_create_table('variable', array(
+  'fields' => array(
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'value' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+  ),
+  'primary key' => array(
+    'name',
+  ),
+  'module' => 'system',
+  'name' => 'variable',
+));
+db_insert('variable')->fields(array(
+  'name',
+  'value',
+))
+->values(array(
+  'name' => 'clean_url',
+  'value' => 's:1:"1";',
+))
+->values(array(
+  'name' => 'comment_page',
+  'value' => 's:21:"COMMENT_NODE_DISABLED";',
+))
+->values(array(
+  'name' => 'css_js_query_string',
+  'value' => 's:20:"D0000000000000000000";',
+))
+->values(array(
+  'name' => 'date_default_timezone',
+  'value' => 's:1:"0";',
+))
+->values(array(
+  'name' => 'drupal_private_key',
+  'value' => 's:64:"3848c2187413fa0ce132f8e222fdb6893b386ed133e8cf602bd3e40dc9dc12db";',
+))
+->values(array(
+  'name' => 'filter_html_1',
+  'value' => 'i:1;',
+))
+->values(array(
+  'name' => 'install_profile',
+  'value' => 's:7:"default";',
+))
+->values(array(
+  'name' => 'install_task',
+  'value' => 's:4:"done";',
+))
+->values(array(
+  'name' => 'install_time',
+  'value' => 'i:1277671612;',
+))
+->values(array(
+  'name' => 'menu_expanded',
+  'value' => 'a:0:{}',
+))
+->values(array(
+  'name' => 'menu_masks',
+  'value' => 'a:13:{i:0;i:31;i:1;i:30;i:2;i:29;i:3;i:24;i:4;i:21;i:5;i:15;i:6;i:14;i:7;i:11;i:8;i:7;i:9;i:5;i:10;i:3;i:11;i:2;i:12;i:1;}',
+))
+->values(array(
+  'name' => 'node_options_forum',
+  'value' => 'a:1:{i:0;s:6:"status";}',
+))
+->values(array(
+  'name' => 'node_options_page',
+  'value' => 'a:1:{i:0;s:6:"status";}',
+))
+->values(array(
+  'name' => 'site_mail',
+  'value' => 's:17:"admin@example.com";',
+))
+->values(array(
+  'name' => 'site_name',
+  'value' => 's:8:"Drupal 6";',
+))
+->values(array(
+  'name' => 'theme_default',
+  'value' => 's:7:"garland";',
+))
+->values(array(
+  'name' => 'theme_settings',
+  'value' => 'a:1:{s:21:"toggle_node_info_page";b:0;}',
+))
+->values(array(
+  'name' => 'user_email_verification',
+  'value' => 'b:1;',
+))
+->execute();
+
+db_create_table('watchdog', array(
+  'fields' => array(
+    'wid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'uid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'type' => array(
+      'type' => 'varchar',
+      'length' => 16,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'message' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+    'variables' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+    'severity' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'link' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'location' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+    ),
+    'referer' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'hostname' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'wid',
+  ),
+  'indexes' => array(
+    'type' => array(
+      'type',
+    ),
+  ),
+  'module' => 'dblog',
+  'name' => 'watchdog',
+));
+
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-6.comments.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-6.comments.database.php
new file mode 100644
index 00000000..7da25040
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-6.comments.database.php
@@ -0,0 +1,40 @@
+<?php
+db_update('node')->fields(array(
+    'comment' => 2
+  ))
+  ->condition('nid', 1)
+  ->execute();
+
+db_insert('comments')->fields(array(
+  'cid',
+  'pid',
+  'nid',
+  'uid',
+  'subject',
+  'comment',
+  'hostname',
+  'timestamp',
+  'status',
+  'format',
+  'thread',
+  'name',
+  'mail',
+  'homepage',
+))
+->values(array(
+  'cid' => 1,
+  'pid' => 0,
+  'nid' => 1,
+  'uid' => 3,
+  'subject' => 'Comment title 1',
+  'comment' => 'Comment body 1 - Comment body 1 - Comment body 1 - Comment body 1 - Comment body 1 - Comment body 1 - Comment body 1 - Comment body 1',
+  'hostname' => '127.0.0.1',
+  'timestamp' => 1008617630,
+  'status' => 0,
+  'format' => 1,
+  'thread' => '01/',
+  'name' => NULL,
+  'mail' => NULL,
+  'homepage' => '',
+))
+->execute();
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-6.duplicate-permission.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-6.duplicate-permission.database.php
new file mode 100644
index 00000000..5da5e844
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-6.duplicate-permission.database.php
@@ -0,0 +1,8 @@
+<?php
+
+// Simulate duplicated permission condition.
+db_update('permission')->fields(array(
+  'perm' => 'access content, access content',
+))
+->condition('pid', 1)
+->execute();
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-6.filled.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-6.filled.database.php
new file mode 100644
index 00000000..a9162813
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-6.filled.database.php
@@ -0,0 +1,20384 @@
+<?php
+
+/**
+ * @file
+ * Filled installation of Drupal 6.17, for test purposes.
+ *
+ * This file was generated by the dump-database-d6.sh tool, from an
+ * installation of Drupal 6, filled with data using the generate-d6-content.sh
+ * tool. It has the following modules installed:
+ *  - block
+ *  - color
+ *  - comment
+ *  - dblog
+ *  - filter
+ *  - help
+ *  - menu
+ *  - node
+ *  - path
+ *  - poll
+ *  - system
+ *  - taxonomy
+ *  - update
+ *  - user
+ */
+
+db_create_table('access', array(
+  'fields' => array(
+    'aid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'mask' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'type' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+  ),
+  'primary key' => array(
+    'aid',
+  ),
+  'module' => 'user',
+  'name' => 'access',
+));
+
+db_create_table('actions', array(
+  'fields' => array(
+    'aid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '0',
+    ),
+    'type' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'callback' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'parameters' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+    'description' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '0',
+    ),
+  ),
+  'primary key' => array(
+    'aid',
+  ),
+  'module' => 'system',
+  'name' => 'actions',
+));
+db_insert('actions')->fields(array(
+  'aid',
+  'type',
+  'callback',
+  'parameters',
+  'description',
+))
+->values(array(
+  'aid' => 'comment_publish_action',
+  'type' => 'comment',
+  'callback' => 'comment_publish_action',
+  'parameters' => '',
+  'description' => 'Publish comment',
+))
+->values(array(
+  'aid' => 'comment_unpublish_action',
+  'type' => 'comment',
+  'callback' => 'comment_unpublish_action',
+  'parameters' => '',
+  'description' => 'Unpublish comment',
+))
+->values(array(
+  'aid' => 'node_make_sticky_action',
+  'type' => 'node',
+  'callback' => 'node_make_sticky_action',
+  'parameters' => '',
+  'description' => 'Make post sticky',
+))
+->values(array(
+  'aid' => 'node_make_unsticky_action',
+  'type' => 'node',
+  'callback' => 'node_make_unsticky_action',
+  'parameters' => '',
+  'description' => 'Make post unsticky',
+))
+->values(array(
+  'aid' => 'node_promote_action',
+  'type' => 'node',
+  'callback' => 'node_promote_action',
+  'parameters' => '',
+  'description' => 'Promote post to front page',
+))
+->values(array(
+  'aid' => 'node_publish_action',
+  'type' => 'node',
+  'callback' => 'node_publish_action',
+  'parameters' => '',
+  'description' => 'Publish post',
+))
+->values(array(
+  'aid' => 'node_save_action',
+  'type' => 'node',
+  'callback' => 'node_save_action',
+  'parameters' => '',
+  'description' => 'Save post',
+))
+->values(array(
+  'aid' => 'node_unpromote_action',
+  'type' => 'node',
+  'callback' => 'node_unpromote_action',
+  'parameters' => '',
+  'description' => 'Remove post from front page',
+))
+->values(array(
+  'aid' => 'node_unpublish_action',
+  'type' => 'node',
+  'callback' => 'node_unpublish_action',
+  'parameters' => '',
+  'description' => 'Unpublish post',
+))
+->values(array(
+  'aid' => 'user_block_ip_action',
+  'type' => 'user',
+  'callback' => 'user_block_ip_action',
+  'parameters' => '',
+  'description' => 'Ban IP address of current user',
+))
+->values(array(
+  'aid' => 'user_block_user_action',
+  'type' => 'user',
+  'callback' => 'user_block_user_action',
+  'parameters' => '',
+  'description' => 'Block current user',
+))
+->execute();
+
+db_create_table('actions_aid', array(
+  'fields' => array(
+    'aid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+  ),
+  'primary key' => array(
+    'aid',
+  ),
+  'module' => 'system',
+  'name' => 'actions_aid',
+));
+
+db_create_table('authmap', array(
+  'fields' => array(
+    'aid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'uid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'authname' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'module' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+  ),
+  'unique keys' => array(
+    'authname' => array(
+      'authname',
+    ),
+  ),
+  'primary key' => array(
+    'aid',
+  ),
+  'module' => 'user',
+  'name' => 'authmap',
+));
+
+db_create_table('batch', array(
+  'fields' => array(
+    'bid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'token' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+    ),
+    'batch' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+  ),
+  'primary key' => array(
+    'bid',
+  ),
+  'indexes' => array(
+    'token' => array(
+      'token',
+    ),
+  ),
+  'module' => 'system',
+  'name' => 'batch',
+));
+
+db_create_table('blocks', array(
+  'fields' => array(
+    'bid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'module' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'delta' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '0',
+    ),
+    'theme' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'region' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'custom' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'throttle' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'visibility' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'pages' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+    ),
+    'title' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'cache' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 1,
+      'size' => 'tiny',
+    ),
+  ),
+  'primary key' => array(
+    'bid',
+  ),
+  'unique keys' => array(
+    'tmd' => array(
+      'theme',
+      'module',
+      'delta',
+    ),
+  ),
+  'indexes' => array(
+    'list' => array(
+      'theme',
+      'status',
+      'region',
+      'weight',
+      'module',
+    ),
+  ),
+  'module' => 'block',
+  'name' => 'blocks',
+));
+db_insert('blocks')->fields(array(
+  'bid',
+  'module',
+  'delta',
+  'theme',
+  'status',
+  'weight',
+  'region',
+  'custom',
+  'throttle',
+  'visibility',
+  'pages',
+  'title',
+  'cache',
+))
+->values(array(
+  'bid' => '1',
+  'module' => 'user',
+  'delta' => '0',
+  'theme' => 'garland',
+  'status' => '1',
+  'weight' => '0',
+  'region' => 'left',
+  'custom' => '0',
+  'throttle' => '0',
+  'visibility' => '0',
+  'pages' => '',
+  'title' => '',
+  'cache' => '-1',
+))
+->values(array(
+  'bid' => '2',
+  'module' => 'user',
+  'delta' => '1',
+  'theme' => 'garland',
+  'status' => '1',
+  'weight' => '0',
+  'region' => 'left',
+  'custom' => '0',
+  'throttle' => '0',
+  'visibility' => '0',
+  'pages' => '',
+  'title' => '',
+  'cache' => '-1',
+))
+->values(array(
+  'bid' => '3',
+  'module' => 'system',
+  'delta' => '0',
+  'theme' => 'garland',
+  'status' => '1',
+  'weight' => '10',
+  'region' => 'footer',
+  'custom' => '0',
+  'throttle' => '0',
+  'visibility' => '0',
+  'pages' => '',
+  'title' => '',
+  'cache' => '-1',
+))
+->execute();
+
+db_create_table('blocks_roles', array(
+  'fields' => array(
+    'module' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+    ),
+    'delta' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+    ),
+    'rid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+  ),
+  'primary key' => array(
+    'module',
+    'delta',
+    'rid',
+  ),
+  'indexes' => array(
+    'rid' => array(
+      'rid',
+    ),
+  ),
+  'module' => 'block',
+  'name' => 'blocks_roles',
+));
+
+db_create_table('boxes', array(
+  'fields' => array(
+    'bid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'body' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'info' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'format' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'unique keys' => array(
+    'info' => array(
+      'info',
+    ),
+  ),
+  'primary key' => array(
+    'bid',
+  ),
+  'module' => 'block',
+  'name' => 'boxes',
+));
+
+db_create_table('cache', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'expire' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'headers' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'serialized' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'system',
+  'name' => 'cache',
+));
+
+db_create_table('cache_block', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'expire' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'headers' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'serialized' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'block',
+  'name' => 'cache_block',
+));
+
+db_create_table('cache_filter', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'expire' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'headers' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'serialized' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'filter',
+  'name' => 'cache_filter',
+));
+
+db_create_table('cache_form', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'expire' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'headers' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'serialized' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'system',
+  'name' => 'cache_form',
+));
+
+db_create_table('cache_menu', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'expire' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'headers' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'serialized' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'system',
+  'name' => 'cache_menu',
+));
+
+db_create_table('cache_page', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'expire' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'headers' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'serialized' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'system',
+  'name' => 'cache_page',
+));
+
+db_create_table('cache_update', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'expire' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'headers' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'serialized' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'update',
+  'name' => 'cache_update',
+));
+
+db_create_table('comments', array(
+  'fields' => array(
+    'cid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'pid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'nid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'uid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'subject' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'comment' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+    'hostname' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'status' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'format' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'thread' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 60,
+      'not null' => FALSE,
+    ),
+    'mail' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => FALSE,
+    ),
+    'homepage' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => FALSE,
+    ),
+  ),
+  'indexes' => array(
+    'pid' => array(
+      'pid',
+    ),
+    'nid' => array(
+      'nid',
+    ),
+    'status' => array(
+      'status',
+    ),
+  ),
+  'primary key' => array(
+    'cid',
+  ),
+  'module' => 'comment',
+  'name' => 'comments',
+));
+
+db_create_table('files', array(
+  'fields' => array(
+    'fid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'uid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'filename' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'filepath' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'filemime' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'filesize' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'uid' => array(
+      'uid',
+    ),
+    'status' => array(
+      'status',
+    ),
+    'timestamp' => array(
+      'timestamp',
+    ),
+  ),
+  'primary key' => array(
+    'fid',
+  ),
+  'module' => 'system',
+  'name' => 'files',
+));
+
+db_create_table('filter_formats', array(
+  'fields' => array(
+    'format' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'roles' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'cache' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+  ),
+  'primary key' => array(
+    'format',
+  ),
+  'unique keys' => array(
+    'name' => array(
+      'name',
+    ),
+  ),
+  'module' => 'filter',
+  'name' => 'filter_formats',
+));
+db_insert('filter_formats')->fields(array(
+  'format',
+  'name',
+  'roles',
+  'cache',
+))
+->values(array(
+  'format' => '1',
+  'name' => 'Filtered HTML',
+  'roles' => ',1,2,',
+  'cache' => '1',
+))
+->values(array(
+  'format' => '2',
+  'name' => 'Full HTML',
+  'roles' => '',
+  'cache' => '1',
+))
+->values(array(
+  'format' => '3',
+  'name' => 'Escape HTML Filter',
+  'roles' => '',
+  'cache' => '1',
+))
+->execute();
+
+db_create_table('filters', array(
+  'fields' => array(
+    'fid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'format' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'module' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'delta' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+  ),
+  'primary key' => array(
+    'fid',
+  ),
+  'unique keys' => array(
+    'fmd' => array(
+      'format',
+      'module',
+      'delta',
+    ),
+  ),
+  'indexes' => array(
+    'list' => array(
+      'format',
+      'weight',
+      'module',
+      'delta',
+    ),
+  ),
+  'module' => 'filter',
+  'name' => 'filters',
+));
+db_insert('filters')->fields(array(
+  'fid',
+  'format',
+  'module',
+  'delta',
+  'weight',
+))
+->values(array(
+  'fid' => '1',
+  'format' => '1',
+  'module' => 'filter',
+  'delta' => '2',
+  'weight' => '0',
+))
+->values(array(
+  'fid' => '2',
+  'format' => '1',
+  'module' => 'filter',
+  'delta' => '0',
+  'weight' => '1',
+))
+->values(array(
+  'fid' => '3',
+  'format' => '1',
+  'module' => 'filter',
+  'delta' => '1',
+  'weight' => '2',
+))
+->values(array(
+  'fid' => '4',
+  'format' => '1',
+  'module' => 'filter',
+  'delta' => '3',
+  'weight' => '10',
+))
+->values(array(
+  'fid' => '5',
+  'format' => '2',
+  'module' => 'filter',
+  'delta' => '2',
+  'weight' => '0',
+))
+->values(array(
+  'fid' => '6',
+  'format' => '2',
+  'module' => 'filter',
+  'delta' => '1',
+  'weight' => '1',
+))
+->values(array(
+  'fid' => '7',
+  'format' => '2',
+  'module' => 'filter',
+  'delta' => '3',
+  'weight' => '10',
+))
+->execute();
+
+db_create_table('flood', array(
+  'fields' => array(
+    'fid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'event' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'hostname' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'fid',
+  ),
+  'indexes' => array(
+    'allow' => array(
+      'event',
+      'hostname',
+      'timestamp',
+    ),
+  ),
+  'module' => 'system',
+  'name' => 'flood',
+));
+
+db_create_table('history', array(
+  'fields' => array(
+    'uid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'nid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'uid',
+    'nid',
+  ),
+  'indexes' => array(
+    'nid' => array(
+      'nid',
+    ),
+  ),
+  'module' => 'system',
+  'name' => 'history',
+));
+
+db_create_table('menu_custom', array(
+  'fields' => array(
+    'menu_name' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'title' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'description' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+  ),
+  'primary key' => array(
+    'menu_name',
+  ),
+  'module' => 'menu',
+  'name' => 'menu_custom',
+));
+db_insert('menu_custom')->fields(array(
+  'menu_name',
+  'title',
+  'description',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'title' => 'Navigation',
+  'description' => 'The navigation menu is provided by Drupal and is the main interactive menu for any site. It is usually the only menu that contains personalized links for authenticated users, and is often not even visible to anonymous users.',
+))
+->values(array(
+  'menu_name' => 'primary-links',
+  'title' => 'Primary links',
+  'description' => 'Primary links are often used at the theme layer to show the major sections of a site. A typical representation for primary links would be tabs along the top.',
+))
+->values(array(
+  'menu_name' => 'secondary-links',
+  'title' => 'Secondary links',
+  'description' => 'Secondary links are often used for pages like legal notices, contact details, and other secondary navigation items that play a lesser role than primary links',
+))
+->execute();
+
+db_create_table('menu_links', array(
+  'fields' => array(
+    'menu_name' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'mlid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'plid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'link_path' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'router_path' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'link_title' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'options' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'module' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => 'system',
+    ),
+    'hidden' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+    'external' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+    'has_children' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+    'expanded' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'depth' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+    'customized' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+    'p1' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p2' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p3' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p4' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p5' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p6' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p7' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p8' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'p9' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'updated' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+  ),
+  'indexes' => array(
+    'path_menu' => array(
+      array(
+        'link_path',
+        128,
+      ),
+      'menu_name',
+    ),
+    'menu_plid_expand_child' => array(
+      'menu_name',
+      'plid',
+      'expanded',
+      'has_children',
+    ),
+    'menu_parents' => array(
+      'menu_name',
+      'p1',
+      'p2',
+      'p3',
+      'p4',
+      'p5',
+      'p6',
+      'p7',
+      'p8',
+      'p9',
+    ),
+    'router_path' => array(
+      array(
+        'router_path',
+        128,
+      ),
+    ),
+  ),
+  'primary key' => array(
+    'mlid',
+  ),
+  'module' => 'system',
+  'name' => 'menu_links',
+));
+db_insert('menu_links')->fields(array(
+  'menu_name',
+  'mlid',
+  'plid',
+  'link_path',
+  'router_path',
+  'link_title',
+  'options',
+  'module',
+  'hidden',
+  'external',
+  'has_children',
+  'expanded',
+  'weight',
+  'depth',
+  'customized',
+  'p1',
+  'p2',
+  'p3',
+  'p4',
+  'p5',
+  'p6',
+  'p7',
+  'p8',
+  'p9',
+  'updated',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '1',
+  'plid' => '0',
+  'link_path' => 'batch',
+  'router_path' => 'batch',
+  'link_title' => '',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '1',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '2',
+  'plid' => '0',
+  'link_path' => 'admin',
+  'router_path' => 'admin',
+  'link_title' => 'Administer',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '9',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '3',
+  'plid' => '0',
+  'link_path' => 'node',
+  'router_path' => 'node',
+  'link_title' => 'Content',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '3',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '4',
+  'plid' => '0',
+  'link_path' => 'logout',
+  'router_path' => 'logout',
+  'link_title' => 'Log out',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '10',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '4',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '5',
+  'plid' => '0',
+  'link_path' => 'rss.xml',
+  'router_path' => 'rss.xml',
+  'link_title' => 'RSS feed',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '5',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '6',
+  'plid' => '0',
+  'link_path' => 'user',
+  'router_path' => 'user',
+  'link_title' => 'User account',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '6',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '7',
+  'plid' => '0',
+  'link_path' => 'node/%',
+  'router_path' => 'node/%',
+  'link_title' => '',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '7',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '8',
+  'plid' => '2',
+  'link_path' => 'admin/compact',
+  'router_path' => 'admin/compact',
+  'link_title' => 'Compact mode',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '8',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '9',
+  'plid' => '0',
+  'link_path' => 'filter/tips',
+  'router_path' => 'filter/tips',
+  'link_title' => 'Compose tips',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '9',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '10',
+  'plid' => '2',
+  'link_path' => 'admin/content',
+  'router_path' => 'admin/content',
+  'link_title' => 'Content management',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:27:\"Manage your site's content.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '-10',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '11',
+  'plid' => '0',
+  'link_path' => 'node/add',
+  'router_path' => 'node/add',
+  'link_title' => 'Create content',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '1',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '11',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '12',
+  'plid' => '0',
+  'link_path' => 'comment/delete',
+  'router_path' => 'comment/delete',
+  'link_title' => 'Delete comment',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '12',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '13',
+  'plid' => '0',
+  'link_path' => 'comment/edit',
+  'router_path' => 'comment/edit',
+  'link_title' => 'Edit comment',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '13',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '14',
+  'plid' => '0',
+  'link_path' => 'system/files',
+  'router_path' => 'system/files',
+  'link_title' => 'File download',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '14',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '15',
+  'plid' => '2',
+  'link_path' => 'admin/reports',
+  'router_path' => 'admin/reports',
+  'link_title' => 'Reports',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:59:"View reports from system logs and other status information.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '5',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '16',
+  'plid' => '2',
+  'link_path' => 'admin/build',
+  'router_path' => 'admin/build',
+  'link_title' => 'Site building',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:38:"Control how your site looks and feels.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '-10',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '17',
+  'plid' => '2',
+  'link_path' => 'admin/settings',
+  'router_path' => 'admin/settings',
+  'link_title' => 'Site configuration',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:40:"Adjust basic site configuration options.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '-5',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '18',
+  'plid' => '0',
+  'link_path' => 'user/autocomplete',
+  'router_path' => 'user/autocomplete',
+  'link_title' => 'User autocomplete',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '18',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '19',
+  'plid' => '2',
+  'link_path' => 'admin/user',
+  'router_path' => 'admin/user',
+  'link_title' => 'User management',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:61:\"Manage your site's users, groups and access to site features.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '19',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '20',
+  'plid' => '0',
+  'link_path' => 'user/%',
+  'router_path' => 'user/%',
+  'link_title' => 'My account',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '20',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '21',
+  'plid' => '19',
+  'link_path' => 'admin/user/rules',
+  'router_path' => 'admin/user/rules',
+  'link_title' => 'Access rules',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:80:"List and create rules to disallow usernames, e-mail addresses, and IP addresses.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '19',
+  'p3' => '21',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '22',
+  'plid' => '17',
+  'link_path' => 'admin/settings/actions',
+  'router_path' => 'admin/settings/actions',
+  'link_title' => 'Actions',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:41:"Manage the actions defined for your site.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '22',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '23',
+  'plid' => '17',
+  'link_path' => 'admin/settings/admin',
+  'router_path' => 'admin/settings/admin',
+  'link_title' => 'Administration theme',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:55:"Settings for how your administrative pages should look.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '23',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '24',
+  'plid' => '16',
+  'link_path' => 'admin/build/block',
+  'router_path' => 'admin/build/block',
+  'link_title' => 'Blocks',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:79:\"Configure what block content appears in your site's sidebars and other regions.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '24',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '25',
+  'plid' => '17',
+  'link_path' => 'admin/settings/clean-urls',
+  'router_path' => 'admin/settings/clean-urls',
+  'link_title' => 'Clean URLs',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:43:"Enable or disable clean URLs for your site.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '25',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '26',
+  'plid' => '10',
+  'link_path' => 'admin/content/comment',
+  'router_path' => 'admin/content/comment',
+  'link_title' => 'Comments',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:61:"List and edit site comments and the comment moderation queue.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '26',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '27',
+  'plid' => '10',
+  'link_path' => 'admin/content/node',
+  'router_path' => 'admin/content/node',
+  'link_title' => 'Content',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:43:\"View, edit, and delete your site's content.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '27',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '28',
+  'plid' => '10',
+  'link_path' => 'admin/content/types',
+  'router_path' => 'admin/content/types',
+  'link_title' => 'Content types',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:82:"Manage posts by content type, including default status, front page promotion, etc.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '28',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '29',
+  'plid' => '17',
+  'link_path' => 'admin/settings/date-time',
+  'router_path' => 'admin/settings/date-time',
+  'link_title' => 'Date and time',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:89:\"Settings for how Drupal displays date and time, as well as the system's default timezone.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '29',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '30',
+  'plid' => '0',
+  'link_path' => 'node/%/delete',
+  'router_path' => 'node/%/delete',
+  'link_title' => 'Delete',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '1',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '30',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '31',
+  'plid' => '20',
+  'link_path' => 'user/%/delete',
+  'router_path' => 'user/%/delete',
+  'link_title' => 'Delete',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '20',
+  'p2' => '31',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '32',
+  'plid' => '17',
+  'link_path' => 'admin/settings/error-reporting',
+  'router_path' => 'admin/settings/error-reporting',
+  'link_title' => 'Error reporting',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:93:"Control how Drupal deals with errors including 403/404 errors as well as PHP error reporting.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '32',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '33',
+  'plid' => '17',
+  'link_path' => 'admin/settings/file-system',
+  'router_path' => 'admin/settings/file-system',
+  'link_title' => 'File system',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:68:"Tell Drupal where to store uploaded files and how they are accessed.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '33',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '34',
+  'plid' => '17',
+  'link_path' => 'admin/settings/image-toolkit',
+  'router_path' => 'admin/settings/image-toolkit',
+  'link_title' => 'Image toolkit',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:74:"Choose which image toolkit to use if you have installed optional toolkits.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '34',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '35',
+  'plid' => '17',
+  'link_path' => 'admin/settings/filters',
+  'router_path' => 'admin/settings/filters',
+  'link_title' => 'Input formats',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:127:"Configure how content input by users is filtered, including allowed HTML tags. Also allows enabling of module-provided filters.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '35',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '36',
+  'plid' => '17',
+  'link_path' => 'admin/settings/logging',
+  'router_path' => 'admin/settings/logging',
+  'link_title' => 'Logging and alerts',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:156:\"Settings for logging and alerts modules. Various modules can route Drupal's system events to different destination, such as syslog, database, email, ...etc.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '36',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '37',
+  'plid' => '16',
+  'link_path' => 'admin/build/menu',
+  'router_path' => 'admin/build/menu',
+  'link_title' => 'Menus',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:116:\"Control your site's navigation menu, primary links and secondary links. as well as rename and reorganize menu items.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '37',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '38',
+  'plid' => '16',
+  'link_path' => 'admin/build/modules',
+  'router_path' => 'admin/build/modules',
+  'link_title' => 'Modules',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:47:"Enable or disable add-on modules for your site.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '38',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '39',
+  'plid' => '17',
+  'link_path' => 'admin/settings/performance',
+  'router_path' => 'admin/settings/performance',
+  'link_title' => 'Performance',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:101:"Enable or disable page caching for anonymous users and set CSS and JS bandwidth optimization options.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '39',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '40',
+  'plid' => '19',
+  'link_path' => 'admin/user/permissions',
+  'router_path' => 'admin/user/permissions',
+  'link_title' => 'Permissions',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:64:"Determine access to features by selecting permissions for roles.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '19',
+  'p3' => '40',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '41',
+  'plid' => '10',
+  'link_path' => 'admin/content/node-settings',
+  'router_path' => 'admin/content/node-settings',
+  'link_title' => 'Post settings',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:126:"Control posting behavior, such as teaser length, requiring previews before posting, and the number of posts on the front page.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '41',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '42',
+  'plid' => '10',
+  'link_path' => 'admin/content/rss-publishing',
+  'router_path' => 'admin/content/rss-publishing',
+  'link_title' => 'RSS publishing',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:92:"Configure the number of items per feed and whether feeds should be titles/teasers/full-text.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '42',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '43',
+  'plid' => '0',
+  'link_path' => 'comment/reply/%',
+  'router_path' => 'comment/reply/%',
+  'link_title' => 'Reply to comment',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '43',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '44',
+  'plid' => '19',
+  'link_path' => 'admin/user/roles',
+  'router_path' => 'admin/user/roles',
+  'link_title' => 'Roles',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:30:"List, edit, or add user roles.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '19',
+  'p3' => '44',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '45',
+  'plid' => '17',
+  'link_path' => 'admin/settings/site-information',
+  'router_path' => 'admin/settings/site-information',
+  'link_title' => 'Site information',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:107:"Change basic site information, such as the site name, slogan, e-mail address, mission, front page and more.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '45',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '46',
+  'plid' => '17',
+  'link_path' => 'admin/settings/site-maintenance',
+  'router_path' => 'admin/settings/site-maintenance',
+  'link_title' => 'Site maintenance',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:63:"Take the site off-line for maintenance or bring it back online.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '46',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '47',
+  'plid' => '15',
+  'link_path' => 'admin/reports/status',
+  'router_path' => 'admin/reports/status',
+  'link_title' => 'Status report',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:74:\"Get a status report about your site's operation and any detected problems.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '10',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '47',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '48',
+  'plid' => '16',
+  'link_path' => 'admin/build/themes',
+  'router_path' => 'admin/build/themes',
+  'link_title' => 'Themes',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:57:"Change which theme your site uses or allows users to set.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '48',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '49',
+  'plid' => '19',
+  'link_path' => 'admin/user/settings',
+  'router_path' => 'admin/user/settings',
+  'link_title' => 'User settings',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:101:"Configure default behavior of users, including registration requirements, e-mails, and user pictures.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '19',
+  'p3' => '49',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '50',
+  'plid' => '19',
+  'link_path' => 'admin/user/user',
+  'router_path' => 'admin/user/user',
+  'link_title' => 'Users',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:26:"List, add, and edit users.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '19',
+  'p3' => '50',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '51',
+  'plid' => '35',
+  'link_path' => 'admin/settings/filters/%',
+  'router_path' => 'admin/settings/filters/%',
+  'link_title' => '',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '35',
+  'p4' => '51',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '52',
+  'plid' => '25',
+  'link_path' => 'admin/settings/clean-urls/check',
+  'router_path' => 'admin/settings/clean-urls/check',
+  'link_title' => 'Clean URL check',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '25',
+  'p4' => '52',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '53',
+  'plid' => '22',
+  'link_path' => 'admin/settings/actions/configure',
+  'router_path' => 'admin/settings/actions/configure',
+  'link_title' => 'Configure an advanced action',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '22',
+  'p4' => '53',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '54',
+  'plid' => '24',
+  'link_path' => 'admin/build/block/configure',
+  'router_path' => 'admin/build/block/configure',
+  'link_title' => 'Configure block',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '24',
+  'p4' => '54',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '55',
+  'plid' => '16',
+  'link_path' => 'admin/build/menu-customize/%',
+  'router_path' => 'admin/build/menu-customize/%',
+  'link_title' => 'Customize menu',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '55',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '56',
+  'plid' => '29',
+  'link_path' => 'admin/settings/date-time/lookup',
+  'router_path' => 'admin/settings/date-time/lookup',
+  'link_title' => 'Date and time lookup',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '29',
+  'p4' => '56',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '57',
+  'plid' => '24',
+  'link_path' => 'admin/build/block/delete',
+  'router_path' => 'admin/build/block/delete',
+  'link_title' => 'Delete block',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '24',
+  'p4' => '57',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '58',
+  'plid' => '35',
+  'link_path' => 'admin/settings/filters/delete',
+  'router_path' => 'admin/settings/filters/delete',
+  'link_title' => 'Delete input format',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '35',
+  'p4' => '58',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '59',
+  'plid' => '21',
+  'link_path' => 'admin/user/rules/delete',
+  'router_path' => 'admin/user/rules/delete',
+  'link_title' => 'Delete rule',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '19',
+  'p3' => '21',
+  'p4' => '59',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '60',
+  'plid' => '44',
+  'link_path' => 'admin/user/roles/edit',
+  'router_path' => 'admin/user/roles/edit',
+  'link_title' => 'Edit role',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '19',
+  'p3' => '44',
+  'p4' => '60',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '61',
+  'plid' => '21',
+  'link_path' => 'admin/user/rules/edit',
+  'router_path' => 'admin/user/rules/edit',
+  'link_title' => 'Edit rule',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '19',
+  'p3' => '21',
+  'p4' => '61',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '62',
+  'plid' => '47',
+  'link_path' => 'admin/reports/status/php',
+  'router_path' => 'admin/reports/status/php',
+  'link_title' => 'PHP',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '47',
+  'p4' => '62',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '63',
+  'plid' => '41',
+  'link_path' => 'admin/content/node-settings/rebuild',
+  'router_path' => 'admin/content/node-settings/rebuild',
+  'link_title' => 'Rebuild permissions',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '41',
+  'p4' => '63',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '64',
+  'plid' => '22',
+  'link_path' => 'admin/settings/actions/orphan',
+  'router_path' => 'admin/settings/actions/orphan',
+  'link_title' => 'Remove orphans',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '22',
+  'p4' => '64',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '65',
+  'plid' => '47',
+  'link_path' => 'admin/reports/status/run-cron',
+  'router_path' => 'admin/reports/status/run-cron',
+  'link_title' => 'Run cron',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '47',
+  'p4' => '65',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '66',
+  'plid' => '47',
+  'link_path' => 'admin/reports/status/sql',
+  'router_path' => 'admin/reports/status/sql',
+  'link_title' => 'SQL',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '47',
+  'p4' => '66',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '67',
+  'plid' => '22',
+  'link_path' => 'admin/settings/actions/delete/%',
+  'router_path' => 'admin/settings/actions/delete/%',
+  'link_title' => 'Delete action',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:17:"Delete an action.";}}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '22',
+  'p4' => '67',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '68',
+  'plid' => '0',
+  'link_path' => 'admin/build/menu-customize/%/delete',
+  'router_path' => 'admin/build/menu-customize/%/delete',
+  'link_title' => 'Delete menu',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '68',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '69',
+  'plid' => '24',
+  'link_path' => 'admin/build/block/list/js',
+  'router_path' => 'admin/build/block/list/js',
+  'link_title' => 'JavaScript List Form',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '24',
+  'p4' => '69',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '70',
+  'plid' => '38',
+  'link_path' => 'admin/build/modules/list/confirm',
+  'router_path' => 'admin/build/modules/list/confirm',
+  'link_title' => 'List',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '38',
+  'p4' => '70',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '71',
+  'plid' => '0',
+  'link_path' => 'user/reset/%/%/%',
+  'router_path' => 'user/reset/%/%/%',
+  'link_title' => 'Reset password',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '71',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '72',
+  'plid' => '38',
+  'link_path' => 'admin/build/modules/uninstall/confirm',
+  'router_path' => 'admin/build/modules/uninstall/confirm',
+  'link_title' => 'Uninstall',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '38',
+  'p4' => '72',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '73',
+  'plid' => '0',
+  'link_path' => 'node/%/revisions/%/delete',
+  'router_path' => 'node/%/revisions/%/delete',
+  'link_title' => 'Delete earlier revision',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '73',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '74',
+  'plid' => '0',
+  'link_path' => 'node/%/revisions/%/revert',
+  'router_path' => 'node/%/revisions/%/revert',
+  'link_title' => 'Revert to earlier revision',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '74',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '75',
+  'plid' => '0',
+  'link_path' => 'node/%/revisions/%/view',
+  'router_path' => 'node/%/revisions/%/view',
+  'link_title' => 'Revisions',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '75',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '76',
+  'plid' => '37',
+  'link_path' => 'admin/build/menu/item/%/delete',
+  'router_path' => 'admin/build/menu/item/%/delete',
+  'link_title' => 'Delete menu item',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '37',
+  'p4' => '76',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '77',
+  'plid' => '37',
+  'link_path' => 'admin/build/menu/item/%/edit',
+  'router_path' => 'admin/build/menu/item/%/edit',
+  'link_title' => 'Edit menu item',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '37',
+  'p4' => '77',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '78',
+  'plid' => '37',
+  'link_path' => 'admin/build/menu/item/%/reset',
+  'router_path' => 'admin/build/menu/item/%/reset',
+  'link_title' => 'Reset menu item',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '37',
+  'p4' => '78',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '79',
+  'plid' => '37',
+  'link_path' => 'admin/build/menu-customize/navigation',
+  'router_path' => 'admin/build/menu-customize/%',
+  'link_title' => 'Navigation',
+  'options' => 'a:0:{}',
+  'module' => 'menu',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '37',
+  'p4' => '79',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '80',
+  'plid' => '37',
+  'link_path' => 'admin/build/menu-customize/primary-links',
+  'router_path' => 'admin/build/menu-customize/%',
+  'link_title' => 'Primary links',
+  'options' => 'a:0:{}',
+  'module' => 'menu',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '37',
+  'p4' => '80',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '81',
+  'plid' => '37',
+  'link_path' => 'admin/build/menu-customize/secondary-links',
+  'router_path' => 'admin/build/menu-customize/%',
+  'link_title' => 'Secondary links',
+  'options' => 'a:0:{}',
+  'module' => 'menu',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '37',
+  'p4' => '81',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '82',
+  'plid' => '0',
+  'link_path' => 'taxonomy/autocomplete',
+  'router_path' => 'taxonomy/autocomplete',
+  'link_title' => 'Autocomplete taxonomy',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '82',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '83',
+  'plid' => '15',
+  'link_path' => 'admin/reports/updates',
+  'router_path' => 'admin/reports/updates',
+  'link_title' => 'Available updates',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:82:"Get a status report about available updates for your installed modules and themes.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '10',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '83',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '84',
+  'plid' => '11',
+  'link_path' => 'node/add/page',
+  'router_path' => 'node/add/page',
+  'link_title' => 'Page',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:296:\"A <em>page</em>, similar in form to a <em>story</em>, is a simple method for creating and displaying information that rarely changes, such as an \"About us\" section of a website. By default, a <em>page</em> entry does not allow visitor comments and is not featured on the site's initial home page.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '11',
+  'p2' => '84',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '85',
+  'plid' => '15',
+  'link_path' => 'admin/reports/dblog',
+  'router_path' => 'admin/reports/dblog',
+  'link_title' => 'Recent log entries',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:43:"View events that have recently been logged.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '-1',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '85',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '86',
+  'plid' => '11',
+  'link_path' => 'node/add/story',
+  'router_path' => 'node/add/story',
+  'link_title' => 'Story',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:392:\"A <em>story</em>, similar in form to a <em>page</em>, is ideal for creating and displaying content that informs or engages website visitors. Press releases, site announcements, and informal blog-like entries may all be created with a <em>story</em> entry. By default, a <em>story</em> entry is automatically featured on the site's initial home page, and provides the ability to post comments.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '11',
+  'p2' => '86',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '87',
+  'plid' => '10',
+  'link_path' => 'admin/content/taxonomy',
+  'router_path' => 'admin/content/taxonomy',
+  'link_title' => 'Taxonomy',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:67:"Manage tagging, categorization, and classification of your content.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '87',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '88',
+  'plid' => '0',
+  'link_path' => 'taxonomy/term/%',
+  'router_path' => 'taxonomy/term/%',
+  'link_title' => 'Taxonomy term',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '88',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '89',
+  'plid' => '15',
+  'link_path' => 'admin/reports/access-denied',
+  'router_path' => 'admin/reports/access-denied',
+  'link_title' => "Top 'access denied' errors",
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:35:\"View 'access denied' errors (403s).\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '89',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '90',
+  'plid' => '15',
+  'link_path' => 'admin/reports/page-not-found',
+  'router_path' => 'admin/reports/page-not-found',
+  'link_title' => "Top 'page not found' errors",
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:36:\"View 'page not found' errors (404s).\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '90',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '91',
+  'plid' => '16',
+  'link_path' => 'admin/build/path',
+  'router_path' => 'admin/build/path',
+  'link_title' => 'URL aliases',
+  'options' => "a:1:{s:10:\"attributes\";a:1:{s:5:\"title\";s:46:\"Change your site's URL paths by aliasing them.\";}}",
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '91',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '92',
+  'plid' => '36',
+  'link_path' => 'admin/settings/logging/dblog',
+  'router_path' => 'admin/settings/logging/dblog',
+  'link_title' => 'Database logging',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:169:"Settings for logging to the Drupal database logs. This is the most common method for small to medium sites on shared hosting. The logs are viewable from the admin pages.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '17',
+  'p3' => '36',
+  'p4' => '92',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '93',
+  'plid' => '91',
+  'link_path' => 'admin/build/path/delete',
+  'router_path' => 'admin/build/path/delete',
+  'link_title' => 'Delete alias',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '91',
+  'p4' => '93',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '94',
+  'plid' => '15',
+  'link_path' => 'admin/reports/event/%',
+  'router_path' => 'admin/reports/event/%',
+  'link_title' => 'Details',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '94',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '95',
+  'plid' => '91',
+  'link_path' => 'admin/build/path/edit',
+  'router_path' => 'admin/build/path/edit',
+  'link_title' => 'Edit alias',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '16',
+  'p3' => '91',
+  'p4' => '95',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '96',
+  'plid' => '87',
+  'link_path' => 'admin/content/taxonomy/%',
+  'router_path' => 'admin/content/taxonomy/%',
+  'link_title' => 'List terms',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '87',
+  'p4' => '96',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '97',
+  'plid' => '83',
+  'link_path' => 'admin/reports/updates/check',
+  'router_path' => 'admin/reports/updates/check',
+  'link_title' => 'Manual update check',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '15',
+  'p3' => '83',
+  'p4' => '97',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '98',
+  'plid' => '10',
+  'link_path' => 'admin/content/node-type/page',
+  'router_path' => 'admin/content/node-type/page',
+  'link_title' => 'Page',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '98',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '99',
+  'plid' => '10',
+  'link_path' => 'admin/content/node-type/story',
+  'router_path' => 'admin/content/node-type/story',
+  'link_title' => 'Story',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '99',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '100',
+  'plid' => '0',
+  'link_path' => 'admin/content/node-type/page/delete',
+  'router_path' => 'admin/content/node-type/page/delete',
+  'link_title' => 'Delete',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '100',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '101',
+  'plid' => '0',
+  'link_path' => 'admin/content/node-type/story/delete',
+  'router_path' => 'admin/content/node-type/story/delete',
+  'link_title' => 'Delete',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '101',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '102',
+  'plid' => '87',
+  'link_path' => 'admin/content/taxonomy/edit/term',
+  'router_path' => 'admin/content/taxonomy/edit/term',
+  'link_title' => 'Edit term',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '87',
+  'p4' => '102',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '103',
+  'plid' => '87',
+  'link_path' => 'admin/content/taxonomy/edit/vocabulary/%',
+  'router_path' => 'admin/content/taxonomy/edit/vocabulary/%',
+  'link_title' => 'Edit vocabulary',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '4',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '87',
+  'p4' => '103',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '104',
+  'plid' => '0',
+  'link_path' => 'poll',
+  'router_path' => 'poll',
+  'link_title' => 'Polls',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '104',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '105',
+  'plid' => '104',
+  'link_path' => 'poll/js',
+  'router_path' => 'poll/js',
+  'link_title' => 'Javascript Choice Form',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '104',
+  'p2' => '105',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '106',
+  'plid' => '11',
+  'link_path' => 'node/add/poll',
+  'router_path' => 'node/add/poll',
+  'link_title' => 'Poll',
+  'options' => 'a:1:{s:10:"attributes";a:1:{s:5:"title";s:191:"A <em>poll</em> is a question with a set of possible responses. A <em>poll</em>, once created, automatically provides a simple running count of the number of votes received for each response.";}}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '11',
+  'p2' => '106',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '107',
+  'plid' => '10',
+  'link_path' => 'admin/content/node-type/poll',
+  'router_path' => 'admin/content/node-type/poll',
+  'link_title' => 'Poll',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '10',
+  'p3' => '107',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '108',
+  'plid' => '0',
+  'link_path' => 'admin/content/node-type/poll/delete',
+  'router_path' => 'admin/content/node-type/poll/delete',
+  'link_title' => 'Delete',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '108',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '109',
+  'plid' => '2',
+  'link_path' => 'admin/help',
+  'router_path' => 'admin/help',
+  'link_title' => 'Help',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '9',
+  'depth' => '2',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '110',
+  'plid' => '109',
+  'link_path' => 'admin/help/block',
+  'router_path' => 'admin/help/block',
+  'link_title' => 'block',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '110',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '111',
+  'plid' => '109',
+  'link_path' => 'admin/help/color',
+  'router_path' => 'admin/help/color',
+  'link_title' => 'color',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '111',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '112',
+  'plid' => '109',
+  'link_path' => 'admin/help/comment',
+  'router_path' => 'admin/help/comment',
+  'link_title' => 'comment',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '112',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '113',
+  'plid' => '109',
+  'link_path' => 'admin/help/dblog',
+  'router_path' => 'admin/help/dblog',
+  'link_title' => 'dblog',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '113',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '114',
+  'plid' => '109',
+  'link_path' => 'admin/help/filter',
+  'router_path' => 'admin/help/filter',
+  'link_title' => 'filter',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '114',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '115',
+  'plid' => '109',
+  'link_path' => 'admin/help/help',
+  'router_path' => 'admin/help/help',
+  'link_title' => 'help',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '115',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '116',
+  'plid' => '109',
+  'link_path' => 'admin/help/menu',
+  'router_path' => 'admin/help/menu',
+  'link_title' => 'menu',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '116',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '117',
+  'plid' => '109',
+  'link_path' => 'admin/help/node',
+  'router_path' => 'admin/help/node',
+  'link_title' => 'node',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '117',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '118',
+  'plid' => '109',
+  'link_path' => 'admin/help/path',
+  'router_path' => 'admin/help/path',
+  'link_title' => 'path',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '118',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '119',
+  'plid' => '109',
+  'link_path' => 'admin/help/poll',
+  'router_path' => 'admin/help/poll',
+  'link_title' => 'poll',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '119',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '120',
+  'plid' => '109',
+  'link_path' => 'admin/help/system',
+  'router_path' => 'admin/help/system',
+  'link_title' => 'system',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '120',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '121',
+  'plid' => '109',
+  'link_path' => 'admin/help/taxonomy',
+  'router_path' => 'admin/help/taxonomy',
+  'link_title' => 'taxonomy',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '121',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '122',
+  'plid' => '109',
+  'link_path' => 'admin/help/update',
+  'router_path' => 'admin/help/update',
+  'link_title' => 'update',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '122',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '123',
+  'plid' => '109',
+  'link_path' => 'admin/help/user',
+  'router_path' => 'admin/help/user',
+  'link_title' => 'user',
+  'options' => 'a:0:{}',
+  'module' => 'system',
+  'hidden' => '-1',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '0',
+  'depth' => '3',
+  'customized' => '0',
+  'p1' => '2',
+  'p2' => '109',
+  'p3' => '123',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->execute();
+
+db_create_table('menu_router', array(
+  'fields' => array(
+    'path' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'load_functions' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+    ),
+    'to_arg_functions' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+    ),
+    'access_callback' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'access_arguments' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'page_callback' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'page_arguments' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'fit' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'number_parts' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'small',
+    ),
+    'tab_parent' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'tab_root' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'title' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'title_callback' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'title_arguments' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'type' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'block_callback' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'description' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+    ),
+    'position' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'file' => array(
+      'type' => 'text',
+      'size' => 'medium',
+    ),
+  ),
+  'indexes' => array(
+    'fit' => array(
+      'fit',
+    ),
+    'tab_parent' => array(
+      'tab_parent',
+    ),
+    'tab_root_weight_title' => array(
+      array(
+        'tab_root',
+        64,
+      ),
+      'weight',
+      'title',
+    ),
+  ),
+  'primary key' => array(
+    'path',
+  ),
+  'module' => 'system',
+  'name' => 'menu_router',
+));
+db_insert('menu_router')->fields(array(
+  'path',
+  'load_functions',
+  'to_arg_functions',
+  'access_callback',
+  'access_arguments',
+  'page_callback',
+  'page_arguments',
+  'fit',
+  'number_parts',
+  'tab_parent',
+  'tab_root',
+  'title',
+  'title_callback',
+  'title_arguments',
+  'type',
+  'block_callback',
+  'description',
+  'position',
+  'weight',
+  'file',
+))
+->values(array(
+  'path' => 'admin',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_main_admin_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '1',
+  'number_parts' => '1',
+  'tab_parent' => '',
+  'tab_root' => 'admin',
+  'title' => 'Administer',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '9',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_admin_menu_block_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build',
+  'title' => 'Site building',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Control how your site looks and feels.',
+  'position' => 'right',
+  'weight' => '-10',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:17:"administer blocks";}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Blocks',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "Configure what block content appears in your site's sidebars and other regions.",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/add',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:17:"administer blocks";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:20:"block_add_block_form";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/block',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Add block',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/configure',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:17:"administer blocks";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:21:"block_admin_configure";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/block/configure',
+  'title' => 'Configure block',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/delete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:17:"administer blocks";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:16:"block_box_delete";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/block/delete',
+  'title' => 'Delete block',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:17:"administer blocks";}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/block',
+  'tab_root' => 'admin/build/block',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list/bluemarine',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_block_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:33:"themes/bluemarine/bluemarine.info";s:4:"name";s:10:"bluemarine";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:11:{s:4:"name";s:10:"Bluemarine";s:11:"description";s:66:"Table-based multi-column theme with a marine and ash color scheme.";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/bluemarine/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:27:"themes/bluemarine/script.js";}s:10:"screenshot";s:32:"themes/bluemarine/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/bluemarine/style.css";}}s:6:"engine";s:11:"phptemplate";}}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:1:{i:0;s:10:"bluemarine";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/block/list',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Bluemarine',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list/chameleon',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_block_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":11:{s:8:"filename";s:31:"themes/chameleon/chameleon.info";s:4:"name";s:9:"chameleon";s:4:"type";s:5:"theme";s:5:"owner";s:32:"themes/chameleon/chameleon.theme";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:10:{s:4:"name";s:9:"Chameleon";s:11:"description";s:42:"Minimalist tabled theme with light colors.";s:7:"regions";a:2:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";}s:8:"features";a:4:{i:0;s:4:"logo";i:1;s:7:"favicon";i:2;s:4:"name";i:3;s:6:"slogan";}s:11:"stylesheets";a:1:{s:3:"all";a:2:{s:9:"style.css";s:26:"themes/chameleon/style.css";s:10:"common.css";s:27:"themes/chameleon/common.css";}}s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:7:"scripts";a:1:{s:9:"script.js";s:26:"themes/chameleon/script.js";}s:10:"screenshot";s:31:"themes/chameleon/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:2:{s:9:"style.css";s:26:"themes/chameleon/style.css";s:10:"common.css";s:27:"themes/chameleon/common.css";}}}}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:1:{i:0;s:9:"chameleon";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/block/list',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Chameleon',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list/garland',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_block_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:27:"themes/garland/garland.info";s:4:"name";s:7:"garland";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"1";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:11:{s:4:"name";s:7:"Garland";s:11:"description";s:66:"Tableless, recolorable, multi-column, fluid width theme (default).";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:11:"stylesheets";a:2:{s:3:"all";a:1:{s:9:"style.css";s:24:"themes/garland/style.css";}s:5:"print";a:1:{s:9:"print.css";s:24:"themes/garland/print.css";}}s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:7:"scripts";a:1:{s:9:"script.js";s:24:"themes/garland/script.js";}s:10:"screenshot";s:29:"themes/garland/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:2:{s:3:"all";a:1:{s:9:"style.css";s:24:"themes/garland/style.css";}s:5:"print";a:1:{s:9:"print.css";s:24:"themes/garland/print.css";}}s:6:"engine";s:11:"phptemplate";}}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:1:{i:0;s:7:"garland";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/block/list',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Garland',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list/js',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:17:"administer blocks";}',
+  'page_callback' => 'block_admin_display_js',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/block/list/js',
+  'title' => 'JavaScript List Form',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list/marvin',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_block_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:35:"themes/chameleon/marvin/marvin.info";s:4:"name";s:6:"marvin";s:4:"type";s:5:"theme";s:5:"owner";s:0:"";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:11:{s:4:"name";s:6:"Marvin";s:11:"description";s:31:"Boxy tabled theme in all grays.";s:7:"regions";a:2:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";}s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:10:"base theme";s:9:"chameleon";s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:33:"themes/chameleon/marvin/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:33:"themes/chameleon/marvin/script.js";}s:10:"screenshot";s:38:"themes/chameleon/marvin/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:33:"themes/chameleon/marvin/style.css";}}s:10:"base_theme";s:9:"chameleon";}}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:1:{i:0;s:6:"marvin";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/block/list',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Marvin',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list/minnelli',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_block_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":13:{s:8:"filename";s:37:"themes/garland/minnelli/minnelli.info";s:4:"name";s:8:"minnelli";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:12:{s:4:"name";s:8:"Minnelli";s:11:"description";s:56:"Tableless, recolorable, multi-column, fixed width theme.";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:10:"base theme";s:7:"garland";s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:12:"minnelli.css";s:36:"themes/garland/minnelli/minnelli.css";}}s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:7:"scripts";a:1:{s:9:"script.js";s:33:"themes/garland/minnelli/script.js";}s:10:"screenshot";s:38:"themes/garland/minnelli/screenshot.png";s:3:"php";s:5:"4.3.5";s:6:"engine";s:11:"phptemplate";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:12:"minnelli.css";s:36:"themes/garland/minnelli/minnelli.css";}}s:6:"engine";s:11:"phptemplate";s:10:"base_theme";s:7:"garland";}}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:1:{i:0;s:8:"minnelli";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/block/list',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Minnelli',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/block/list/pushbutton',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_block_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:33:"themes/pushbutton/pushbutton.info";s:4:"name";s:10:"pushbutton";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:11:{s:4:"name";s:10:"Pushbutton";s:11:"description";s:52:"Tabled, multi-column theme in blue and orange tones.";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/pushbutton/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:27:"themes/pushbutton/script.js";}s:10:"screenshot";s:32:"themes/pushbutton/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/pushbutton/style.css";}}s:6:"engine";s:11:"phptemplate";}}',
+  'page_callback' => 'block_admin_display',
+  'page_arguments' => 'a:1:{i:0;s:10:"pushbutton";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/block/list',
+  'tab_root' => 'admin/build/block',
+  'title' => 'Pushbutton',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/block/block.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/menu',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:15:"administer menu";}',
+  'page_callback' => 'menu_overview_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/menu',
+  'title' => 'Menus',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "Control your site's navigation menu, primary links and secondary links. as well as rename and reorganize menu items.",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/menu/menu.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/menu-customize/%',
+  'load_functions' => 'a:1:{i:3;s:9:"menu_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:15:"administer menu";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:18:"menu_overview_form";i:1;i:3;}',
+  'fit' => '14',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/menu-customize/%',
+  'title' => 'Customize menu',
+  'title_callback' => 'menu_overview_title',
+  'title_arguments' => 'a:1:{i:0;i:3;}',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/menu/menu.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/menu-customize/%/add',
+  'load_functions' => 'a:1:{i:3;s:9:"menu_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:15:"administer menu";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:4:{i:0;s:14:"menu_edit_item";i:1;s:3:"add";i:2;N;i:3;i:3;}',
+  'fit' => '29',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/menu-customize/%',
+  'tab_root' => 'admin/build/menu-customize/%',
+  'title' => 'Add item',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/menu/menu.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/menu-customize/%/delete',
+  'load_functions' => 'a:1:{i:3;s:9:"menu_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:15:"administer menu";}',
+  'page_callback' => 'menu_delete_menu_page',
+  'page_arguments' => 'a:1:{i:0;i:3;}',
+  'fit' => '29',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/menu-customize/%/delete',
+  'title' => 'Delete menu',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/menu/menu.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/menu-customize/%/edit',
+  'load_functions' => 'a:1:{i:3;s:9:"menu_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:15:"administer menu";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:3:{i:0;s:14:"menu_edit_menu";i:1;s:4:"edit";i:2;i:3;}',
+  'fit' => '29',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/menu-customize/%',
+  'tab_root' => 'admin/build/menu-customize/%',
+  'title' => 'Edit menu',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/menu/menu.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/menu-customize/%/list',
+  'load_functions' => 'a:1:{i:3;s:9:"menu_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:15:"administer menu";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:18:"menu_overview_form";i:1;i:3;}',
+  'fit' => '29',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/menu-customize/%',
+  'tab_root' => 'admin/build/menu-customize/%',
+  'title' => 'List items',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/menu/menu.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/menu/add',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:15:"administer menu";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:14:"menu_edit_menu";i:1;s:3:"add";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/menu',
+  'tab_root' => 'admin/build/menu',
+  'title' => 'Add menu',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/menu/menu.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/menu/item/%/delete',
+  'load_functions' => 'a:1:{i:4;s:14:"menu_link_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:15:"administer menu";}',
+  'page_callback' => 'menu_item_delete_page',
+  'page_arguments' => 'a:1:{i:0;i:4;}',
+  'fit' => '61',
+  'number_parts' => '6',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/menu/item/%/delete',
+  'title' => 'Delete menu item',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/menu/menu.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/menu/item/%/edit',
+  'load_functions' => 'a:1:{i:4;s:14:"menu_link_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:15:"administer menu";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:4:{i:0;s:14:"menu_edit_item";i:1;s:4:"edit";i:2;i:4;i:3;N;}',
+  'fit' => '61',
+  'number_parts' => '6',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/menu/item/%/edit',
+  'title' => 'Edit menu item',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/menu/menu.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/menu/item/%/reset',
+  'load_functions' => 'a:1:{i:4;s:14:"menu_link_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:15:"administer menu";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:23:"menu_reset_item_confirm";i:1;i:4;}',
+  'fit' => '61',
+  'number_parts' => '6',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/menu/item/%/reset',
+  'title' => 'Reset menu item',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/menu/menu.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/menu/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:15:"administer menu";}',
+  'page_callback' => 'menu_overview_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/menu',
+  'tab_root' => 'admin/build/menu',
+  'title' => 'List menus',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/menu/menu.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/menu/settings',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:15:"administer menu";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:14:"menu_configure";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/menu',
+  'tab_root' => 'admin/build/menu',
+  'title' => 'Settings',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '5',
+  'file' => 'modules/menu/menu.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/modules',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:14:"system_modules";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/modules',
+  'title' => 'Modules',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Enable or disable add-on modules for your site.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/modules/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:14:"system_modules";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/modules',
+  'tab_root' => 'admin/build/modules',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/modules/list/confirm',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:14:"system_modules";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/modules/list/confirm',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/modules/uninstall',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:24:"system_modules_uninstall";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/modules',
+  'tab_root' => 'admin/build/modules',
+  'title' => 'Uninstall',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/modules/uninstall/confirm',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:24:"system_modules_uninstall";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/modules/uninstall/confirm',
+  'title' => 'Uninstall',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/path',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer url aliases";}',
+  'page_callback' => 'path_admin_overview',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/path',
+  'title' => 'URL aliases',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "Change your site's URL paths by aliasing them.",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/path/path.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/path/add',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer url aliases";}',
+  'page_callback' => 'path_admin_edit',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/path',
+  'tab_root' => 'admin/build/path',
+  'title' => 'Add alias',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/path/path.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/path/delete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer url aliases";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:25:"path_admin_delete_confirm";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/path/delete',
+  'title' => 'Delete alias',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/path/path.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/path/edit',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer url aliases";}',
+  'page_callback' => 'path_admin_edit',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/path/edit',
+  'title' => 'Edit alias',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/path/path.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/path/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer url aliases";}',
+  'page_callback' => 'path_admin_overview',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/path',
+  'tab_root' => 'admin/build/path',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/path/path.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:18:"system_themes_form";i:1;N;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Themes',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Change which theme your site uses or allows users to set.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/select',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:18:"system_themes_form";i:1;N;}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/themes',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => 'Select the default theme.',
+  'position' => '',
+  'weight' => '-1',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:21:"system_theme_settings";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/build/themes',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Configure',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings/bluemarine',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_system_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:33:"themes/bluemarine/bluemarine.info";s:4:"name";s:10:"bluemarine";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:11:{s:4:"name";s:10:"Bluemarine";s:11:"description";s:66:"Table-based multi-column theme with a marine and ash color scheme.";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/bluemarine/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:27:"themes/bluemarine/script.js";}s:10:"screenshot";s:32:"themes/bluemarine/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/bluemarine/style.css";}}s:6:"engine";s:11:"phptemplate";}}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:21:"system_theme_settings";i:1;s:10:"bluemarine";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/themes/settings',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Bluemarine',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings/chameleon',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_system_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":11:{s:8:"filename";s:31:"themes/chameleon/chameleon.info";s:4:"name";s:9:"chameleon";s:4:"type";s:5:"theme";s:5:"owner";s:32:"themes/chameleon/chameleon.theme";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:10:{s:4:"name";s:9:"Chameleon";s:11:"description";s:42:"Minimalist tabled theme with light colors.";s:7:"regions";a:2:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";}s:8:"features";a:4:{i:0;s:4:"logo";i:1;s:7:"favicon";i:2;s:4:"name";i:3;s:6:"slogan";}s:11:"stylesheets";a:1:{s:3:"all";a:2:{s:9:"style.css";s:26:"themes/chameleon/style.css";s:10:"common.css";s:27:"themes/chameleon/common.css";}}s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:7:"scripts";a:1:{s:9:"script.js";s:26:"themes/chameleon/script.js";}s:10:"screenshot";s:31:"themes/chameleon/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:2:{s:9:"style.css";s:26:"themes/chameleon/style.css";s:10:"common.css";s:27:"themes/chameleon/common.css";}}}}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:21:"system_theme_settings";i:1;s:9:"chameleon";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/themes/settings',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Chameleon',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings/garland',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_system_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:27:"themes/garland/garland.info";s:4:"name";s:7:"garland";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"1";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:11:{s:4:"name";s:7:"Garland";s:11:"description";s:66:"Tableless, recolorable, multi-column, fluid width theme (default).";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:11:"stylesheets";a:2:{s:3:"all";a:1:{s:9:"style.css";s:24:"themes/garland/style.css";}s:5:"print";a:1:{s:9:"print.css";s:24:"themes/garland/print.css";}}s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:7:"scripts";a:1:{s:9:"script.js";s:24:"themes/garland/script.js";}s:10:"screenshot";s:29:"themes/garland/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:2:{s:3:"all";a:1:{s:9:"style.css";s:24:"themes/garland/style.css";}s:5:"print";a:1:{s:9:"print.css";s:24:"themes/garland/print.css";}}s:6:"engine";s:11:"phptemplate";}}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:21:"system_theme_settings";i:1;s:7:"garland";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/themes/settings',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Garland',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings/global',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:21:"system_theme_settings";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/themes/settings',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Global settings',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-1',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings/marvin',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_system_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:35:"themes/chameleon/marvin/marvin.info";s:4:"name";s:6:"marvin";s:4:"type";s:5:"theme";s:5:"owner";s:0:"";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:11:{s:4:"name";s:6:"Marvin";s:11:"description";s:31:"Boxy tabled theme in all grays.";s:7:"regions";a:2:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";}s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:10:"base theme";s:9:"chameleon";s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:33:"themes/chameleon/marvin/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:33:"themes/chameleon/marvin/script.js";}s:10:"screenshot";s:38:"themes/chameleon/marvin/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:33:"themes/chameleon/marvin/style.css";}}s:10:"base_theme";s:9:"chameleon";}}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:21:"system_theme_settings";i:1;s:6:"marvin";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/themes/settings',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Marvin',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings/minnelli',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_system_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":13:{s:8:"filename";s:37:"themes/garland/minnelli/minnelli.info";s:4:"name";s:8:"minnelli";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:12:{s:4:"name";s:8:"Minnelli";s:11:"description";s:56:"Tableless, recolorable, multi-column, fixed width theme.";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:10:"base theme";s:7:"garland";s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:12:"minnelli.css";s:36:"themes/garland/minnelli/minnelli.css";}}s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:7:"scripts";a:1:{s:9:"script.js";s:33:"themes/garland/minnelli/script.js";}s:10:"screenshot";s:38:"themes/garland/minnelli/screenshot.png";s:3:"php";s:5:"4.3.5";s:6:"engine";s:11:"phptemplate";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:12:"minnelli.css";s:36:"themes/garland/minnelli/minnelli.css";}}s:6:"engine";s:11:"phptemplate";s:10:"base_theme";s:7:"garland";}}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:21:"system_theme_settings";i:1;s:8:"minnelli";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/themes/settings',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Minnelli',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/build/themes/settings/pushbutton',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_system_themes_access',
+  'access_arguments' => 'a:1:{i:0;O:8:"stdClass":12:{s:8:"filename";s:33:"themes/pushbutton/pushbutton.info";s:4:"name";s:10:"pushbutton";s:4:"type";s:5:"theme";s:5:"owner";s:45:"themes/engines/phptemplate/phptemplate.engine";s:6:"status";s:1:"0";s:8:"throttle";s:1:"0";s:9:"bootstrap";s:1:"0";s:14:"schema_version";s:2:"-1";s:6:"weight";s:1:"0";s:4:"info";a:11:{s:4:"name";s:10:"Pushbutton";s:11:"description";s:52:"Tabled, multi-column theme in blue and orange tones.";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/pushbutton/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:27:"themes/pushbutton/script.js";}s:10:"screenshot";s:32:"themes/pushbutton/screenshot.png";s:3:"php";s:5:"4.3.5";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/pushbutton/style.css";}}s:6:"engine";s:11:"phptemplate";}}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:21:"system_theme_settings";i:1;s:10:"pushbutton";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/build/themes/settings',
+  'tab_root' => 'admin/build/themes',
+  'title' => 'Pushbutton',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/by-module',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_admin_by_module',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => 'admin',
+  'tab_root' => 'admin',
+  'title' => 'By module',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '2',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/by-task',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_main_admin_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => 'admin',
+  'tab_root' => 'admin',
+  'title' => 'By task',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/compact',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_admin_compact_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'admin/compact',
+  'title' => 'Compact mode',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_admin_menu_block_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content',
+  'title' => 'Content management',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "Manage your site's content.",
+  'position' => 'left',
+  'weight' => '-10',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/comment',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"administer comments";}',
+  'page_callback' => 'comment_admin',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/comment',
+  'title' => 'Comments',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'List and edit site comments and the comment moderation queue.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/comment/comment.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/comment/approval',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"administer comments";}',
+  'page_callback' => 'comment_admin',
+  'page_arguments' => 'a:1:{i:0;s:8:"approval";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/content/comment',
+  'tab_root' => 'admin/content/comment',
+  'title' => 'Approval queue',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/comment/comment.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/comment/new',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"administer comments";}',
+  'page_callback' => 'comment_admin',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/content/comment',
+  'tab_root' => 'admin/content/comment',
+  'title' => 'Published comments',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/comment/comment.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/node',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer nodes";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:18:"node_admin_content";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node',
+  'title' => 'Content',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "View, edit, and delete your site's content.",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-settings',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer nodes";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:14:"node_configure";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node-settings',
+  'title' => 'Post settings',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Control posting behavior, such as teaser length, requiring previews before posting, and the number of posts on the front page.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-settings/rebuild',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:30:"node_configure_rebuild_confirm";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node-settings/rebuild',
+  'title' => 'Rebuild permissions',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/page',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => "a:2:{i:0;s:14:\"node_type_form\";i:1;O:8:\"stdClass\":14:{s:4:\"type\";s:4:\"page\";s:4:\"name\";s:4:\"Page\";s:6:\"module\";s:4:\"node\";s:11:\"description\";s:296:\"A <em>page</em>, similar in form to a <em>story</em>, is a simple method for creating and displaying information that rarely changes, such as an \"About us\" section of a website. By default, a <em>page</em> entry does not allow visitor comments and is not featured on the site's initial home page.\";s:4:\"help\";s:0:\"\";s:9:\"has_title\";s:1:\"1\";s:11:\"title_label\";s:5:\"Title\";s:8:\"has_body\";s:1:\"1\";s:10:\"body_label\";s:4:\"Body\";s:14:\"min_word_count\";s:1:\"0\";s:6:\"custom\";s:1:\"1\";s:8:\"modified\";s:1:\"1\";s:6:\"locked\";s:1:\"0\";s:9:\"orig_type\";s:4:\"page\";}}",
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node-type/page',
+  'title' => 'Page',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/page/delete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => "a:2:{i:0;s:24:\"node_type_delete_confirm\";i:1;O:8:\"stdClass\":14:{s:4:\"type\";s:4:\"page\";s:4:\"name\";s:4:\"Page\";s:6:\"module\";s:4:\"node\";s:11:\"description\";s:296:\"A <em>page</em>, similar in form to a <em>story</em>, is a simple method for creating and displaying information that rarely changes, such as an \"About us\" section of a website. By default, a <em>page</em> entry does not allow visitor comments and is not featured on the site's initial home page.\";s:4:\"help\";s:0:\"\";s:9:\"has_title\";s:1:\"1\";s:11:\"title_label\";s:5:\"Title\";s:8:\"has_body\";s:1:\"1\";s:10:\"body_label\";s:4:\"Body\";s:14:\"min_word_count\";s:1:\"0\";s:6:\"custom\";s:1:\"1\";s:8:\"modified\";s:1:\"1\";s:6:\"locked\";s:1:\"0\";s:9:\"orig_type\";s:4:\"page\";}}",
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node-type/page/delete',
+  'title' => 'Delete',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/page/edit',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => "a:2:{i:0;s:14:\"node_type_form\";i:1;O:8:\"stdClass\":14:{s:4:\"type\";s:4:\"page\";s:4:\"name\";s:4:\"Page\";s:6:\"module\";s:4:\"node\";s:11:\"description\";s:296:\"A <em>page</em>, similar in form to a <em>story</em>, is a simple method for creating and displaying information that rarely changes, such as an \"About us\" section of a website. By default, a <em>page</em> entry does not allow visitor comments and is not featured on the site's initial home page.\";s:4:\"help\";s:0:\"\";s:9:\"has_title\";s:1:\"1\";s:11:\"title_label\";s:5:\"Title\";s:8:\"has_body\";s:1:\"1\";s:10:\"body_label\";s:4:\"Body\";s:14:\"min_word_count\";s:1:\"0\";s:6:\"custom\";s:1:\"1\";s:8:\"modified\";s:1:\"1\";s:6:\"locked\";s:1:\"0\";s:9:\"orig_type\";s:4:\"page\";}}",
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/content/node-type/page',
+  'tab_root' => 'admin/content/node-type/page',
+  'title' => 'Edit',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/poll',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:14:"node_type_form";i:1;O:8:"stdClass":14:{s:4:"name";s:4:"Poll";s:6:"module";s:4:"poll";s:11:"description";s:191:"A <em>poll</em> is a question with a set of possible responses. A <em>poll</em>, once created, automatically provides a simple running count of the number of votes received for each response.";s:11:"title_label";s:8:"Question";s:8:"has_body";b:0;s:4:"type";s:4:"poll";s:9:"has_title";b:1;s:4:"help";s:0:"";s:14:"min_word_count";i:0;s:6:"custom";b:0;s:8:"modified";b:0;s:6:"locked";b:1;s:9:"orig_type";s:4:"poll";s:6:"is_new";b:1;}}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node-type/poll',
+  'title' => 'Poll',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/poll/delete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:24:"node_type_delete_confirm";i:1;O:8:"stdClass":14:{s:4:"name";s:4:"Poll";s:6:"module";s:4:"poll";s:11:"description";s:191:"A <em>poll</em> is a question with a set of possible responses. A <em>poll</em>, once created, automatically provides a simple running count of the number of votes received for each response.";s:11:"title_label";s:8:"Question";s:8:"has_body";b:0;s:4:"type";s:4:"poll";s:9:"has_title";b:1;s:4:"help";s:0:"";s:14:"min_word_count";i:0;s:6:"custom";b:0;s:8:"modified";b:0;s:6:"locked";b:1;s:9:"orig_type";s:4:"poll";s:6:"is_new";b:1;}}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node-type/poll/delete',
+  'title' => 'Delete',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/poll/edit',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:14:"node_type_form";i:1;O:8:"stdClass":14:{s:4:"name";s:4:"Poll";s:6:"module";s:4:"poll";s:11:"description";s:191:"A <em>poll</em> is a question with a set of possible responses. A <em>poll</em>, once created, automatically provides a simple running count of the number of votes received for each response.";s:11:"title_label";s:8:"Question";s:8:"has_body";b:0;s:4:"type";s:4:"poll";s:9:"has_title";b:1;s:4:"help";s:0:"";s:14:"min_word_count";i:0;s:6:"custom";b:0;s:8:"modified";b:0;s:6:"locked";b:1;s:9:"orig_type";s:4:"poll";s:6:"is_new";b:1;}}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/content/node-type/poll',
+  'tab_root' => 'admin/content/node-type/poll',
+  'title' => 'Edit',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/story',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => "a:2:{i:0;s:14:\"node_type_form\";i:1;O:8:\"stdClass\":14:{s:4:\"type\";s:5:\"story\";s:4:\"name\";s:5:\"Story\";s:6:\"module\";s:4:\"node\";s:11:\"description\";s:392:\"A <em>story</em>, similar in form to a <em>page</em>, is ideal for creating and displaying content that informs or engages website visitors. Press releases, site announcements, and informal blog-like entries may all be created with a <em>story</em> entry. By default, a <em>story</em> entry is automatically featured on the site's initial home page, and provides the ability to post comments.\";s:4:\"help\";s:0:\"\";s:9:\"has_title\";s:1:\"1\";s:11:\"title_label\";s:5:\"Title\";s:8:\"has_body\";s:1:\"1\";s:10:\"body_label\";s:4:\"Body\";s:14:\"min_word_count\";s:1:\"0\";s:6:\"custom\";s:1:\"1\";s:8:\"modified\";s:1:\"1\";s:6:\"locked\";s:1:\"0\";s:9:\"orig_type\";s:5:\"story\";}}",
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node-type/story',
+  'title' => 'Story',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/story/delete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => "a:2:{i:0;s:24:\"node_type_delete_confirm\";i:1;O:8:\"stdClass\":14:{s:4:\"type\";s:5:\"story\";s:4:\"name\";s:5:\"Story\";s:6:\"module\";s:4:\"node\";s:11:\"description\";s:392:\"A <em>story</em>, similar in form to a <em>page</em>, is ideal for creating and displaying content that informs or engages website visitors. Press releases, site announcements, and informal blog-like entries may all be created with a <em>story</em> entry. By default, a <em>story</em> entry is automatically featured on the site's initial home page, and provides the ability to post comments.\";s:4:\"help\";s:0:\"\";s:9:\"has_title\";s:1:\"1\";s:11:\"title_label\";s:5:\"Title\";s:8:\"has_body\";s:1:\"1\";s:10:\"body_label\";s:4:\"Body\";s:14:\"min_word_count\";s:1:\"0\";s:6:\"custom\";s:1:\"1\";s:8:\"modified\";s:1:\"1\";s:6:\"locked\";s:1:\"0\";s:9:\"orig_type\";s:5:\"story\";}}",
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/node-type/story/delete',
+  'title' => 'Delete',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node-type/story/edit',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => "a:2:{i:0;s:14:\"node_type_form\";i:1;O:8:\"stdClass\":14:{s:4:\"type\";s:5:\"story\";s:4:\"name\";s:5:\"Story\";s:6:\"module\";s:4:\"node\";s:11:\"description\";s:392:\"A <em>story</em>, similar in form to a <em>page</em>, is ideal for creating and displaying content that informs or engages website visitors. Press releases, site announcements, and informal blog-like entries may all be created with a <em>story</em> entry. By default, a <em>story</em> entry is automatically featured on the site's initial home page, and provides the ability to post comments.\";s:4:\"help\";s:0:\"\";s:9:\"has_title\";s:1:\"1\";s:11:\"title_label\";s:5:\"Title\";s:8:\"has_body\";s:1:\"1\";s:10:\"body_label\";s:4:\"Body\";s:14:\"min_word_count\";s:1:\"0\";s:6:\"custom\";s:1:\"1\";s:8:\"modified\";s:1:\"1\";s:6:\"locked\";s:1:\"0\";s:9:\"orig_type\";s:5:\"story\";}}",
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/content/node-type/story',
+  'tab_root' => 'admin/content/node-type/story',
+  'title' => 'Edit',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/node/overview',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer nodes";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:18:"node_admin_content";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/content/node',
+  'tab_root' => 'admin/content/node',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/node/node.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/rss-publishing',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:25:"system_rss_feeds_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/rss-publishing',
+  'title' => 'RSS publishing',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Configure the number of items per feed and whether feeds should be titles/teasers/full-text.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/taxonomy',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"administer taxonomy";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:30:"taxonomy_overview_vocabularies";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/taxonomy',
+  'title' => 'Taxonomy',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Manage tagging, categorization, and classification of your content.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/taxonomy/taxonomy.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/taxonomy/%',
+  'load_functions' => 'a:1:{i:3;s:24:"taxonomy_vocabulary_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"administer taxonomy";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:23:"taxonomy_overview_terms";i:1;i:3;}',
+  'fit' => '14',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/taxonomy/%',
+  'title' => 'List terms',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/taxonomy/taxonomy.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/taxonomy/%/add/term',
+  'load_functions' => 'a:1:{i:3;s:24:"taxonomy_vocabulary_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"administer taxonomy";}',
+  'page_callback' => 'taxonomy_add_term_page',
+  'page_arguments' => 'a:1:{i:0;i:3;}',
+  'fit' => '59',
+  'number_parts' => '6',
+  'tab_parent' => 'admin/content/taxonomy/%',
+  'tab_root' => 'admin/content/taxonomy/%',
+  'title' => 'Add term',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/taxonomy/taxonomy.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/taxonomy/%/list',
+  'load_functions' => 'a:1:{i:3;s:24:"taxonomy_vocabulary_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"administer taxonomy";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:23:"taxonomy_overview_terms";i:1;i:3;}',
+  'fit' => '29',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/content/taxonomy/%',
+  'tab_root' => 'admin/content/taxonomy/%',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/taxonomy/taxonomy.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/taxonomy/add/vocabulary',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"administer taxonomy";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:24:"taxonomy_form_vocabulary";}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/content/taxonomy',
+  'tab_root' => 'admin/content/taxonomy',
+  'title' => 'Add vocabulary',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/taxonomy/taxonomy.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/taxonomy/edit/term',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"administer taxonomy";}',
+  'page_callback' => 'taxonomy_admin_term_edit',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '31',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/taxonomy/edit/term',
+  'title' => 'Edit term',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/taxonomy/taxonomy.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/taxonomy/edit/vocabulary/%',
+  'load_functions' => 'a:1:{i:5;s:24:"taxonomy_vocabulary_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"administer taxonomy";}',
+  'page_callback' => 'taxonomy_admin_vocabulary_edit',
+  'page_arguments' => 'a:1:{i:0;i:5;}',
+  'fit' => '62',
+  'number_parts' => '6',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/taxonomy/edit/vocabulary/%',
+  'title' => 'Edit vocabulary',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/taxonomy/taxonomy.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/taxonomy/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"administer taxonomy";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:30:"taxonomy_overview_vocabularies";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/content/taxonomy',
+  'tab_root' => 'admin/content/taxonomy',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/taxonomy/taxonomy.admin.inc',
+))
+->values(array(
+  'path' => 'admin/content/types',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'node_overview_types',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/content/types',
+  'title' => 'Content types',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Manage posts by content type, including default status, front page promotion, etc.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/types/add',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:14:"node_type_form";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/content/types',
+  'tab_root' => 'admin/content/types',
+  'title' => 'Add content type',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/content/types/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:24:"administer content types";}',
+  'page_callback' => 'node_overview_types',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/content/types',
+  'tab_root' => 'admin/content/types',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/node/content_types.inc',
+))
+->values(array(
+  'path' => 'admin/help',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_main',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help',
+  'title' => 'Help',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '9',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/help/block',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help/block',
+  'title' => 'block',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/help/color',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help/color',
+  'title' => 'color',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/help/comment',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help/comment',
+  'title' => 'comment',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/help/dblog',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help/dblog',
+  'title' => 'dblog',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/help/filter',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help/filter',
+  'title' => 'filter',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/help/help',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help/help',
+  'title' => 'help',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/help/menu',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help/menu',
+  'title' => 'menu',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/help/node',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help/node',
+  'title' => 'node',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/help/path',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help/path',
+  'title' => 'path',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/help/poll',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help/poll',
+  'title' => 'poll',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/help/system',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help/system',
+  'title' => 'system',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/help/taxonomy',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help/taxonomy',
+  'title' => 'taxonomy',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/help/update',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help/update',
+  'title' => 'update',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/help/user',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'help_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/help/user',
+  'title' => 'user',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/help/help.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"access site reports";}',
+  'page_callback' => 'system_admin_menu_block_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports',
+  'title' => 'Reports',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'View reports from system logs and other status information.',
+  'position' => 'left',
+  'weight' => '5',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/access-denied',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"access site reports";}',
+  'page_callback' => 'dblog_top',
+  'page_arguments' => 'a:1:{i:0;s:13:"access denied";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/access-denied',
+  'title' => "Top 'access denied' errors",
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "View 'access denied' errors (403s).",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/dblog/dblog.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/dblog',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"access site reports";}',
+  'page_callback' => 'dblog_overview',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/dblog',
+  'title' => 'Recent log entries',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'View events that have recently been logged.',
+  'position' => '',
+  'weight' => '-1',
+  'file' => 'modules/dblog/dblog.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/event/%',
+  'load_functions' => 'a:1:{i:3;N;}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"access site reports";}',
+  'page_callback' => 'dblog_event',
+  'page_arguments' => 'a:1:{i:0;i:3;}',
+  'fit' => '14',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/event/%',
+  'title' => 'Details',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/dblog/dblog.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/page-not-found',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"access site reports";}',
+  'page_callback' => 'dblog_top',
+  'page_arguments' => 'a:1:{i:0;s:14:"page not found";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/page-not-found',
+  'title' => "Top 'page not found' errors",
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "View 'page not found' errors (404s).",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/dblog/dblog.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/status',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'system_status',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/status',
+  'title' => 'Status report',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "Get a status report about your site's operation and any detected problems.",
+  'position' => '',
+  'weight' => '10',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/status/php',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'system_php',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/status/php',
+  'title' => 'PHP',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/status/run-cron',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'system_run_cron',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/status/run-cron',
+  'title' => 'Run cron',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/status/sql',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'system_sql',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/status/sql',
+  'title' => 'SQL',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/reports/updates',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'update_status',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/updates',
+  'title' => 'Available updates',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Get a status report about available updates for your installed modules and themes.',
+  'position' => '',
+  'weight' => '10',
+  'file' => 'modules/update/update.report.inc',
+))
+->values(array(
+  'path' => 'admin/reports/updates/check',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'update_manual_status',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/reports/updates/check',
+  'title' => 'Manual update check',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/update/update.fetch.inc',
+))
+->values(array(
+  'path' => 'admin/reports/updates/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'update_status',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/reports/updates',
+  'tab_root' => 'admin/reports/updates',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/update/update.report.inc',
+))
+->values(array(
+  'path' => 'admin/reports/updates/settings',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:15:"update_settings";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/reports/updates',
+  'tab_root' => 'admin/reports/updates',
+  'title' => 'Settings',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/update/update.settings.inc',
+))
+->values(array(
+  'path' => 'admin/settings',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_settings_overview',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings',
+  'title' => 'Site configuration',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Adjust basic site configuration options.',
+  'position' => 'right',
+  'weight' => '-5',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/actions',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer actions";}',
+  'page_callback' => 'system_actions_manage',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/actions',
+  'title' => 'Actions',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Manage the actions defined for your site.',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'admin/settings/actions/configure',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer actions";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:24:"system_actions_configure";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/actions/configure',
+  'title' => 'Configure an advanced action',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'admin/settings/actions/delete/%',
+  'load_functions' => 'a:1:{i:4;s:12:"actions_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer actions";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:26:"system_actions_delete_form";i:1;i:4;}',
+  'fit' => '30',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/actions/delete/%',
+  'title' => 'Delete action',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => 'Delete an action.',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'admin/settings/actions/manage',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer actions";}',
+  'page_callback' => 'system_actions_manage',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/settings/actions',
+  'tab_root' => 'admin/settings/actions',
+  'title' => 'Manage actions',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => 'Manage the actions defined for your site.',
+  'position' => '',
+  'weight' => '-2',
+  'file' => '',
+))
+->values(array(
+  'path' => 'admin/settings/actions/orphan',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer actions";}',
+  'page_callback' => 'system_actions_remove_orphans',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/actions/orphan',
+  'title' => 'Remove orphans',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'admin/settings/admin',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:27:"system_admin_theme_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/admin',
+  'title' => 'Administration theme',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => 'system_admin_theme_settings',
+  'description' => 'Settings for how your administrative pages should look.',
+  'position' => 'left',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/clean-urls',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:25:"system_clean_url_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/clean-urls',
+  'title' => 'Clean URLs',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Enable or disable clean URLs for your site.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/clean-urls/check',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '1',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'drupal_json',
+  'page_arguments' => 'a:1:{i:0;a:1:{s:6:"status";b:1;}}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/clean-urls/check',
+  'title' => 'Clean URL check',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'admin/settings/date-time',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:25:"system_date_time_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/date-time',
+  'title' => 'Date and time',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "Settings for how Drupal displays date and time, as well as the system's default timezone.",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/date-time/lookup',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'system_date_time_lookup',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/date-time/lookup',
+  'title' => 'Date and time lookup',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/error-reporting',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:31:"system_error_reporting_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/error-reporting',
+  'title' => 'Error reporting',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Control how Drupal deals with errors including 403/404 errors as well as PHP error reporting.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/file-system',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:27:"system_file_system_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/file-system',
+  'title' => 'File system',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Tell Drupal where to store uploaded files and how they are accessed.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:21:"filter_admin_overview";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/filters',
+  'title' => 'Input formats',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Configure how content input by users is filtered, including allowed HTML tags. Also allows enabling of module-provided filters.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters/%',
+  'load_functions' => 'a:1:{i:3;s:18:"filter_format_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'filter_admin_format_page',
+  'page_arguments' => 'a:1:{i:0;i:3;}',
+  'fit' => '14',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/filters/%',
+  'title' => '',
+  'title_callback' => 'filter_admin_format_title',
+  'title_arguments' => 'a:1:{i:0;i:3;}',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters/%/configure',
+  'load_functions' => 'a:1:{i:3;s:18:"filter_format_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'filter_admin_configure_page',
+  'page_arguments' => 'a:1:{i:0;i:3;}',
+  'fit' => '29',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/settings/filters/%',
+  'tab_root' => 'admin/settings/filters/%',
+  'title' => 'Configure',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '1',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters/%/edit',
+  'load_functions' => 'a:1:{i:3;s:18:"filter_format_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'filter_admin_format_page',
+  'page_arguments' => 'a:1:{i:0;i:3;}',
+  'fit' => '29',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/settings/filters/%',
+  'tab_root' => 'admin/settings/filters/%',
+  'title' => 'Edit',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters/%/order',
+  'load_functions' => 'a:1:{i:3;s:18:"filter_format_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'filter_admin_order_page',
+  'page_arguments' => 'a:1:{i:0;i:3;}',
+  'fit' => '29',
+  'number_parts' => '5',
+  'tab_parent' => 'admin/settings/filters/%',
+  'tab_root' => 'admin/settings/filters/%',
+  'title' => 'Rearrange',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '2',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters/add',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'filter_admin_format_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/settings/filters',
+  'tab_root' => 'admin/settings/filters',
+  'title' => 'Add input format',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '1',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters/delete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:19:"filter_admin_delete";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/filters/delete',
+  'title' => 'Delete input format',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/filters/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:18:"administer filters";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:21:"filter_admin_overview";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/settings/filters',
+  'tab_root' => 'admin/settings/filters',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/filter/filter.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/image-toolkit',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:29:"system_image_toolkit_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/image-toolkit',
+  'title' => 'Image toolkit',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Choose which image toolkit to use if you have installed optional toolkits.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/logging',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'system_logging_overview',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/logging',
+  'title' => 'Logging and alerts',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "Settings for logging and alerts modules. Various modules can route Drupal's system events to different destination, such as syslog, database, email, ...etc.",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/logging/dblog',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:20:"dblog_admin_settings";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/logging/dblog',
+  'title' => 'Database logging',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Settings for logging to the Drupal database logs. This is the most common method for small to medium sites on shared hosting. The logs are viewable from the admin pages.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/dblog/dblog.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/performance',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:27:"system_performance_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/performance',
+  'title' => 'Performance',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Enable or disable page caching for anonymous users and set CSS and JS bandwidth optimization options.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/site-information',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:32:"system_site_information_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/site-information',
+  'title' => 'Site information',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Change basic site information, such as the site name, slogan, e-mail address, mission, front page and more.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/settings/site-maintenance',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:29:"administer site configuration";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:32:"system_site_maintenance_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/settings/site-maintenance',
+  'title' => 'Site maintenance',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Take the site off-line for maintenance or bring it back online.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:27:"access administration pages";}',
+  'page_callback' => 'system_admin_menu_block_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user',
+  'title' => 'User management',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "Manage your site's users, groups and access to site features.",
+  'position' => 'left',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/permissions',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:15:"user_admin_perm";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/permissions',
+  'title' => 'Permissions',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Determine access to features by selecting permissions for roles.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/roles',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:19:"user_admin_new_role";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/roles',
+  'title' => 'Roles',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'List, edit, or add user roles.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/roles/edit',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:15:"user_admin_role";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/roles/edit',
+  'title' => 'Edit role',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/rules',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'user_admin_access',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/rules',
+  'title' => 'Access rules',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'List and create rules to disallow usernames, e-mail addresses, and IP addresses.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/rules/add',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'user_admin_access_add',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/user/rules',
+  'tab_root' => 'admin/user/rules',
+  'title' => 'Add rule',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/rules/check',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'user_admin_access_check',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/user/rules',
+  'tab_root' => 'admin/user/rules',
+  'title' => 'Check rules',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/rules/delete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:32:"user_admin_access_delete_confirm";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/rules/delete',
+  'title' => 'Delete rule',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/rules/edit',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'user_admin_access_edit',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/rules/edit',
+  'title' => 'Edit rule',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/rules/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:22:"administer permissions";}',
+  'page_callback' => 'user_admin_access',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/user/rules',
+  'tab_root' => 'admin/user/rules',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/settings',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer users";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:19:"user_admin_settings";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/settings',
+  'title' => 'User settings',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'Configure default behavior of users, including registration requirements, e-mails, and user pictures.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/user',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer users";}',
+  'page_callback' => 'user_admin',
+  'page_arguments' => 'a:1:{i:0;s:4:"list";}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'admin/user/user',
+  'title' => 'Users',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'List, add, and edit users.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/user/create',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer users";}',
+  'page_callback' => 'user_admin',
+  'page_arguments' => 'a:1:{i:0;s:6:"create";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/user/user',
+  'tab_root' => 'admin/user/user',
+  'title' => 'Add user',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'admin/user/user/list',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer users";}',
+  'page_callback' => 'user_admin',
+  'page_arguments' => 'a:1:{i:0;s:4:"list";}',
+  'fit' => '15',
+  'number_parts' => '4',
+  'tab_parent' => 'admin/user/user',
+  'tab_root' => 'admin/user/user',
+  'title' => 'List',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/user/user.admin.inc',
+))
+->values(array(
+  'path' => 'batch',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '1',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'system_batch_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '1',
+  'number_parts' => '1',
+  'tab_parent' => '',
+  'tab_root' => 'batch',
+  'title' => '',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/system/system.admin.inc',
+))
+->values(array(
+  'path' => 'comment/delete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:19:"administer comments";}',
+  'page_callback' => 'comment_delete',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'comment/delete',
+  'title' => 'Delete comment',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/comment/comment.admin.inc',
+))
+->values(array(
+  'path' => 'comment/edit',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:13:"post comments";}',
+  'page_callback' => 'comment_edit',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'comment/edit',
+  'title' => 'Edit comment',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/comment/comment.pages.inc',
+))
+->values(array(
+  'path' => 'comment/reply/%',
+  'load_functions' => 'a:1:{i:2;s:9:"node_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'node_access',
+  'access_arguments' => 'a:2:{i:0;s:4:"view";i:1;i:2;}',
+  'page_callback' => 'comment_reply',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '6',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'comment/reply/%',
+  'title' => 'Reply to comment',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/comment/comment.pages.inc',
+))
+->values(array(
+  'path' => 'filter/tips',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '1',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'filter_tips_long',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'filter/tips',
+  'title' => 'Compose tips',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '20',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/filter/filter.pages.inc',
+))
+->values(array(
+  'path' => 'logout',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_is_logged_in',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'user_logout',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '1',
+  'number_parts' => '1',
+  'tab_parent' => '',
+  'tab_root' => 'logout',
+  'title' => 'Log out',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '10',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'node',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:14:"access content";}',
+  'page_callback' => 'node_page_default',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '1',
+  'number_parts' => '1',
+  'tab_parent' => '',
+  'tab_root' => 'node',
+  'title' => 'Content',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'node/%',
+  'load_functions' => 'a:1:{i:1;s:9:"node_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'node_access',
+  'access_arguments' => 'a:2:{i:0;s:4:"view";i:1;i:1;}',
+  'page_callback' => 'node_page_view',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '2',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'node/%',
+  'title' => '',
+  'title_callback' => 'node_page_title',
+  'title_arguments' => 'a:1:{i:0;i:1;}',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'node/%/delete',
+  'load_functions' => 'a:1:{i:1;s:9:"node_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'node_access',
+  'access_arguments' => 'a:2:{i:0;s:6:"delete";i:1;i:1;}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:19:"node_delete_confirm";i:1;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'node/%/delete',
+  'title' => 'Delete',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '1',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/%/edit',
+  'load_functions' => 'a:1:{i:1;s:9:"node_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'node_access',
+  'access_arguments' => 'a:2:{i:0;s:6:"update";i:1;i:1;}',
+  'page_callback' => 'node_page_edit',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => 'node/%',
+  'tab_root' => 'node/%',
+  'title' => 'Edit',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '1',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/%/results',
+  'load_functions' => 'a:1:{i:1;s:9:"node_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => '_poll_menu_access',
+  'access_arguments' => 'a:3:{i:0;i:1;i:1;s:14:"access content";i:2;b:1;}',
+  'page_callback' => 'poll_results',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => 'node/%',
+  'tab_root' => 'node/%',
+  'title' => 'Results',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '3',
+  'file' => 'modules/poll/poll.pages.inc',
+))
+->values(array(
+  'path' => 'node/%/revisions',
+  'load_functions' => 'a:1:{i:1;s:9:"node_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => '_node_revision_access',
+  'access_arguments' => 'a:1:{i:0;i:1;}',
+  'page_callback' => 'node_revision_overview',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => 'node/%',
+  'tab_root' => 'node/%',
+  'title' => 'Revisions',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '2',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/%/revisions/%/delete',
+  'load_functions' => 'a:2:{i:1;a:1:{s:9:"node_load";a:1:{i:0;i:3;}}i:3;N;}',
+  'to_arg_functions' => '',
+  'access_callback' => '_node_revision_access',
+  'access_arguments' => 'a:2:{i:0;i:1;i:1;s:6:"delete";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:28:"node_revision_delete_confirm";i:1;i:1;}',
+  'fit' => '21',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'node/%/revisions/%/delete',
+  'title' => 'Delete earlier revision',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/%/revisions/%/revert',
+  'load_functions' => 'a:2:{i:1;a:1:{s:9:"node_load";a:1:{i:0;i:3;}}i:3;N;}',
+  'to_arg_functions' => '',
+  'access_callback' => '_node_revision_access',
+  'access_arguments' => 'a:2:{i:0;i:1;i:1;s:6:"update";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:28:"node_revision_revert_confirm";i:1;i:1;}',
+  'fit' => '21',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'node/%/revisions/%/revert',
+  'title' => 'Revert to earlier revision',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/%/revisions/%/view',
+  'load_functions' => 'a:2:{i:1;a:1:{s:9:"node_load";a:1:{i:0;i:3;}}i:3;N;}',
+  'to_arg_functions' => '',
+  'access_callback' => '_node_revision_access',
+  'access_arguments' => 'a:1:{i:0;i:1;}',
+  'page_callback' => 'node_show',
+  'page_arguments' => 'a:3:{i:0;i:1;i:1;N;i:2;b:1;}',
+  'fit' => '21',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'node/%/revisions/%/view',
+  'title' => 'Revisions',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'node/%/view',
+  'load_functions' => 'a:1:{i:1;s:9:"node_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'node_access',
+  'access_arguments' => 'a:2:{i:0;s:4:"view";i:1;i:1;}',
+  'page_callback' => 'node_page_view',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => 'node/%',
+  'tab_root' => 'node/%',
+  'title' => 'View',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => '',
+))
+->values(array(
+  'path' => 'node/%/votes',
+  'load_functions' => 'a:1:{i:1;s:9:"node_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => '_poll_menu_access',
+  'access_arguments' => 'a:3:{i:0;i:1;i:1;s:17:"inspect all votes";i:2;b:0;}',
+  'page_callback' => 'poll_votes',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => 'node/%',
+  'tab_root' => 'node/%',
+  'title' => 'Votes',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '3',
+  'file' => 'modules/poll/poll.pages.inc',
+))
+->values(array(
+  'path' => 'node/add',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '_node_add_access',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'node_add_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'node/add',
+  'title' => 'Create content',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '1',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/add/page',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'node_access',
+  'access_arguments' => 'a:2:{i:0;s:6:"create";i:1;s:4:"page";}',
+  'page_callback' => 'node_add',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'node/add/page',
+  'title' => 'Page',
+  'title_callback' => 'check_plain',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "A <em>page</em>, similar in form to a <em>story</em>, is a simple method for creating and displaying information that rarely changes, such as an \"About us\" section of a website. By default, a <em>page</em> entry does not allow visitor comments and is not featured on the site's initial home page.",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/add/poll',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'node_access',
+  'access_arguments' => 'a:2:{i:0;s:6:"create";i:1;s:4:"poll";}',
+  'page_callback' => 'node_add',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'node/add/poll',
+  'title' => 'Poll',
+  'title_callback' => 'check_plain',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => 'A <em>poll</em> is a question with a set of possible responses. A <em>poll</em>, once created, automatically provides a simple running count of the number of votes received for each response.',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'node/add/story',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'node_access',
+  'access_arguments' => 'a:2:{i:0;s:6:"create";i:1;s:5:"story";}',
+  'page_callback' => 'node_add',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '7',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'node/add/story',
+  'title' => 'Story',
+  'title_callback' => 'check_plain',
+  'title_arguments' => '',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => "A <em>story</em>, similar in form to a <em>page</em>, is ideal for creating and displaying content that informs or engages website visitors. Press releases, site announcements, and informal blog-like entries may all be created with a <em>story</em> entry. By default, a <em>story</em> entry is automatically featured on the site's initial home page, and provides the ability to post comments.",
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/node/node.pages.inc',
+))
+->values(array(
+  'path' => 'poll',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:14:"access content";}',
+  'page_callback' => 'poll_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '1',
+  'number_parts' => '1',
+  'tab_parent' => '',
+  'tab_root' => 'poll',
+  'title' => 'Polls',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '20',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/poll/poll.pages.inc',
+))
+->values(array(
+  'path' => 'poll/js',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:14:"access content";}',
+  'page_callback' => 'poll_choice_js',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'poll/js',
+  'title' => 'Javascript Choice Form',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'rss.xml',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:14:"access content";}',
+  'page_callback' => 'node_feed',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '1',
+  'number_parts' => '1',
+  'tab_parent' => '',
+  'tab_root' => 'rss.xml',
+  'title' => 'RSS feed',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'system/files',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '1',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'file_download',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'system/files',
+  'title' => 'File download',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => '',
+))
+->values(array(
+  'path' => 'taxonomy/autocomplete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:14:"access content";}',
+  'page_callback' => 'taxonomy_autocomplete',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'taxonomy/autocomplete',
+  'title' => 'Autocomplete taxonomy',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/taxonomy/taxonomy.pages.inc',
+))
+->values(array(
+  'path' => 'taxonomy/term/%',
+  'load_functions' => 'a:1:{i:2;N;}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:14:"access content";}',
+  'page_callback' => 'taxonomy_term_page',
+  'page_arguments' => 'a:1:{i:0;i:2;}',
+  'fit' => '6',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'taxonomy/term/%',
+  'title' => 'Taxonomy term',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/taxonomy/taxonomy.pages.inc',
+))
+->values(array(
+  'path' => 'user',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => '1',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'user_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '1',
+  'number_parts' => '1',
+  'tab_parent' => '',
+  'tab_root' => 'user',
+  'title' => 'User account',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/%',
+  'load_functions' => 'a:1:{i:1;s:22:"user_uid_optional_load";}',
+  'to_arg_functions' => 'a:1:{i:1;s:24:"user_uid_optional_to_arg";}',
+  'access_callback' => 'user_view_access',
+  'access_arguments' => 'a:1:{i:0;i:1;}',
+  'page_callback' => 'user_view',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '2',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'user/%',
+  'title' => 'My account',
+  'title_callback' => 'user_page_title',
+  'title_arguments' => 'a:1:{i:0;i:1;}',
+  'type' => '6',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/%/delete',
+  'load_functions' => 'a:1:{i:1;s:9:"user_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:16:"administer users";}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:2:{i:0;s:19:"user_confirm_delete";i:1;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => '',
+  'tab_root' => 'user/%/delete',
+  'title' => 'Delete',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/%/edit',
+  'load_functions' => 'a:1:{i:1;a:1:{s:18:"user_category_load";a:2:{i:0;s:4:"%map";i:1;s:6:"%index";}}}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_edit_access',
+  'access_arguments' => 'a:1:{i:0;i:1;}',
+  'page_callback' => 'user_edit',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => 'user/%',
+  'tab_root' => 'user/%',
+  'title' => 'Edit',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/%/edit/account',
+  'load_functions' => 'a:1:{i:1;a:1:{s:18:"user_category_load";a:2:{i:0;s:4:"%map";i:1;s:6:"%index";}}}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_edit_access',
+  'access_arguments' => 'a:1:{i:0;i:1;}',
+  'page_callback' => 'user_edit',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '11',
+  'number_parts' => '4',
+  'tab_parent' => 'user/%/edit',
+  'tab_root' => 'user/%',
+  'title' => 'Account',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/%/view',
+  'load_functions' => 'a:1:{i:1;s:9:"user_load";}',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_view_access',
+  'access_arguments' => 'a:1:{i:0;i:1;}',
+  'page_callback' => 'user_view',
+  'page_arguments' => 'a:1:{i:0;i:1;}',
+  'fit' => '5',
+  'number_parts' => '3',
+  'tab_parent' => 'user/%',
+  'tab_root' => 'user/%',
+  'title' => 'View',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '-10',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/autocomplete',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_access',
+  'access_arguments' => 'a:1:{i:0;s:20:"access user profiles";}',
+  'page_callback' => 'user_autocomplete',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => '',
+  'tab_root' => 'user/autocomplete',
+  'title' => 'User autocomplete',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/login',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_is_anonymous',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'user_page',
+  'page_arguments' => 'a:0:{}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => 'user',
+  'tab_root' => 'user',
+  'title' => 'Log in',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '136',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/password',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_is_anonymous',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:9:"user_pass";}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => 'user',
+  'tab_root' => 'user',
+  'title' => 'Request new password',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/register',
+  'load_functions' => '',
+  'to_arg_functions' => '',
+  'access_callback' => 'user_register_access',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:1:{i:0;s:13:"user_register";}',
+  'fit' => '3',
+  'number_parts' => '2',
+  'tab_parent' => 'user',
+  'tab_root' => 'user',
+  'title' => 'Create new account',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '128',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->values(array(
+  'path' => 'user/reset/%/%/%',
+  'load_functions' => 'a:3:{i:2;N;i:3;N;i:4;N;}',
+  'to_arg_functions' => '',
+  'access_callback' => '1',
+  'access_arguments' => 'a:0:{}',
+  'page_callback' => 'drupal_get_form',
+  'page_arguments' => 'a:4:{i:0;s:15:"user_pass_reset";i:1;i:2;i:2;i:3;i:3;i:4;}',
+  'fit' => '24',
+  'number_parts' => '5',
+  'tab_parent' => '',
+  'tab_root' => 'user/reset/%/%/%',
+  'title' => 'Reset password',
+  'title_callback' => 't',
+  'title_arguments' => '',
+  'type' => '4',
+  'block_callback' => '',
+  'description' => '',
+  'position' => '',
+  'weight' => '0',
+  'file' => 'modules/user/user.pages.inc',
+))
+->execute();
+
+db_create_table('node', array(
+  'fields' => array(
+    'nid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'vid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'type' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'language' => array(
+      'type' => 'varchar',
+      'length' => 12,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'title' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'uid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 1,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'changed' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'comment' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'promote' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'moderate' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'sticky' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'tnid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'translate' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'node_changed' => array(
+      'changed',
+    ),
+    'node_created' => array(
+      'created',
+    ),
+    'node_moderate' => array(
+      'moderate',
+    ),
+    'node_promote_status' => array(
+      'promote',
+      'status',
+    ),
+    'node_status_type' => array(
+      'status',
+      'type',
+      'nid',
+    ),
+    'node_title_type' => array(
+      'title',
+      array(
+        'type',
+        4,
+      ),
+    ),
+    'node_type' => array(
+      array(
+        'type',
+        4,
+      ),
+    ),
+    'uid' => array(
+      'uid',
+    ),
+    'tnid' => array(
+      'tnid',
+    ),
+    'translate' => array(
+      'translate',
+    ),
+  ),
+  'unique keys' => array(
+    'vid' => array(
+      'vid',
+    ),
+  ),
+  'primary key' => array(
+    'nid',
+  ),
+  'module' => 'node',
+  'name' => 'node',
+));
+db_insert('node')->fields(array(
+  'nid',
+  'vid',
+  'type',
+  'language',
+  'title',
+  'uid',
+  'status',
+  'created',
+  'changed',
+  'comment',
+  'promote',
+  'moderate',
+  'sticky',
+  'tnid',
+  'translate',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 1 rev 1 (i=0) rev2 2',
+  'uid' => '3',
+  'status' => '0',
+  'created' => '1262732400',
+  'changed' => '1282936266',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 2 rev 3 (i=1) rev2 4',
+  'uid' => '3',
+  'status' => '0',
+  'created' => '1262818800',
+  'changed' => '1282936266',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 3 rev 5 (i=2) rev2 6',
+  'uid' => '3',
+  'status' => '0',
+  'created' => '1262905200',
+  'changed' => '1282936266',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 4 rev 7 (i=3) rev2 8',
+  'uid' => '3',
+  'status' => '0',
+  'created' => '1262991600',
+  'changed' => '1282936266',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 5 rev 9 (i=4) rev2 10',
+  'uid' => '3',
+  'status' => '1',
+  'created' => '1263078000',
+  'changed' => '1282936266',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 6 rev 11 (i=5) rev2 12',
+  'uid' => '3',
+  'status' => '1',
+  'created' => '1263164400',
+  'changed' => '1282936266',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 7 rev 13 (i=6) rev2 14',
+  'uid' => '3',
+  'status' => '1',
+  'created' => '1263250800',
+  'changed' => '1282936266',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 8 rev 15 (i=7) rev2 16',
+  'uid' => '3',
+  'status' => '1',
+  'created' => '1263337200',
+  'changed' => '1282936266',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 9 rev 17 (i=8) rev2 18',
+  'uid' => '4',
+  'status' => '0',
+  'created' => '1263423600',
+  'changed' => '1282936266',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 10 rev 19 (i=9) rev2 20',
+  'uid' => '4',
+  'status' => '0',
+  'created' => '1263510000',
+  'changed' => '1282936266',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 11 rev 21 (i=10) rev2 22',
+  'uid' => '4',
+  'status' => '0',
+  'created' => '1263596400',
+  'changed' => '1282936267',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 12 rev 23 (i=11) rev2 24',
+  'uid' => '4',
+  'status' => '0',
+  'created' => '1263682800',
+  'changed' => '1282936267',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'type' => 'story',
+  'language' => '',
+  'title' => 'node title 13 rev 25 (i=12)',
+  'uid' => '4',
+  'status' => '1',
+  'created' => '1263769200',
+  'changed' => '1282936267',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'type' => 'story',
+  'language' => '',
+  'title' => 'node title 14 rev 26 (i=13)',
+  'uid' => '4',
+  'status' => '1',
+  'created' => '1263855600',
+  'changed' => '1282936267',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'type' => 'story',
+  'language' => '',
+  'title' => 'node title 15 rev 27 (i=14)',
+  'uid' => '4',
+  'status' => '1',
+  'created' => '1263942000',
+  'changed' => '1282936267',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'type' => 'story',
+  'language' => '',
+  'title' => 'node title 16 rev 28 (i=15)',
+  'uid' => '4',
+  'status' => '1',
+  'created' => '1264028400',
+  'changed' => '1282936267',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'type' => 'story',
+  'language' => '',
+  'title' => 'node title 17 rev 29 (i=16)',
+  'uid' => '5',
+  'status' => '0',
+  'created' => '1264114800',
+  'changed' => '1282936267',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'type' => 'story',
+  'language' => '',
+  'title' => 'node title 18 rev 30 (i=17)',
+  'uid' => '5',
+  'status' => '0',
+  'created' => '1264201200',
+  'changed' => '1282936267',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'type' => 'story',
+  'language' => '',
+  'title' => 'node title 19 rev 31 (i=18)',
+  'uid' => '5',
+  'status' => '0',
+  'created' => '1264287600',
+  'changed' => '1282936267',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'type' => 'story',
+  'language' => '',
+  'title' => 'node title 20 rev 32 (i=19)',
+  'uid' => '5',
+  'status' => '0',
+  'created' => '1264374000',
+  'changed' => '1282936267',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'type' => 'story',
+  'language' => '',
+  'title' => 'node title 21 rev 33 (i=20)',
+  'uid' => '5',
+  'status' => '1',
+  'created' => '1264460400',
+  'changed' => '1282936267',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'type' => 'story',
+  'language' => '',
+  'title' => 'node title 22 rev 34 (i=21)',
+  'uid' => '5',
+  'status' => '1',
+  'created' => '1264546800',
+  'changed' => '1282936267',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'type' => 'story',
+  'language' => '',
+  'title' => 'node title 23 rev 35 (i=22)',
+  'uid' => '5',
+  'status' => '1',
+  'created' => '1264633200',
+  'changed' => '1282936267',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'type' => 'story',
+  'language' => '',
+  'title' => 'node title 24 rev 36 (i=23)',
+  'uid' => '5',
+  'status' => '1',
+  'created' => '1264719600',
+  'changed' => '1282936267',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '25',
+  'vid' => '37',
+  'type' => 'poll',
+  'language' => '',
+  'title' => 'poll title 0',
+  'uid' => '3',
+  'status' => '0',
+  'created' => '1262732400',
+  'changed' => '1282936268',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '26',
+  'vid' => '38',
+  'type' => 'poll',
+  'language' => '',
+  'title' => 'poll title 1',
+  'uid' => '3',
+  'status' => '0',
+  'created' => '1262775600',
+  'changed' => '1282936268',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '27',
+  'vid' => '39',
+  'type' => 'poll',
+  'language' => '',
+  'title' => 'poll title 2',
+  'uid' => '3',
+  'status' => '1',
+  'created' => '1262818800',
+  'changed' => '1282936268',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '28',
+  'vid' => '40',
+  'type' => 'poll',
+  'language' => '',
+  'title' => 'poll title 3',
+  'uid' => '3',
+  'status' => '1',
+  'created' => '1262862000',
+  'changed' => '1282936268',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '29',
+  'vid' => '41',
+  'type' => 'poll',
+  'language' => '',
+  'title' => 'poll title 4',
+  'uid' => '4',
+  'status' => '0',
+  'created' => '1262905200',
+  'changed' => '1282936268',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '30',
+  'vid' => '42',
+  'type' => 'poll',
+  'language' => '',
+  'title' => 'poll title 5',
+  'uid' => '4',
+  'status' => '0',
+  'created' => '1262948400',
+  'changed' => '1282936268',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '31',
+  'vid' => '43',
+  'type' => 'poll',
+  'language' => '',
+  'title' => 'poll title 6',
+  'uid' => '4',
+  'status' => '1',
+  'created' => '1262991600',
+  'changed' => '1282936268',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '32',
+  'vid' => '44',
+  'type' => 'poll',
+  'language' => '',
+  'title' => 'poll title 7',
+  'uid' => '4',
+  'status' => '1',
+  'created' => '1263034800',
+  'changed' => '1282936268',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '33',
+  'vid' => '45',
+  'type' => 'poll',
+  'language' => '',
+  'title' => 'poll title 8',
+  'uid' => '5',
+  'status' => '0',
+  'created' => '1263078000',
+  'changed' => '1282936268',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '34',
+  'vid' => '46',
+  'type' => 'poll',
+  'language' => '',
+  'title' => 'poll title 9',
+  'uid' => '5',
+  'status' => '0',
+  'created' => '1263121200',
+  'changed' => '1282936268',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '35',
+  'vid' => '47',
+  'type' => 'poll',
+  'language' => '',
+  'title' => 'poll title 10',
+  'uid' => '5',
+  'status' => '1',
+  'created' => '1263164400',
+  'changed' => '1282936268',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '36',
+  'vid' => '48',
+  'type' => 'poll',
+  'language' => '',
+  'title' => 'poll title 11',
+  'uid' => '5',
+  'status' => '1',
+  'created' => '1263207600',
+  'changed' => '1282936268',
+  'comment' => '0',
+  'promote' => '1',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '37',
+  'vid' => '49',
+  'type' => 'broken',
+  'language' => '',
+  'title' => 'node title 24',
+  'uid' => '6',
+  'status' => '1',
+  'created' => '1263769200',
+  'changed' => '1279310614',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->execute();
+
+db_create_table('node_access', array(
+  'fields' => array(
+    'nid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'gid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'realm' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'grant_view' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'grant_update' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'grant_delete' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+  ),
+  'primary key' => array(
+    'nid',
+    'gid',
+    'realm',
+  ),
+  'module' => 'node',
+  'name' => 'node_access',
+));
+db_insert('node_access')->fields(array(
+  'nid',
+  'gid',
+  'realm',
+  'grant_view',
+  'grant_update',
+  'grant_delete',
+))
+->values(array(
+  'nid' => '0',
+  'gid' => '0',
+  'realm' => 'all',
+  'grant_view' => '1',
+  'grant_update' => '0',
+  'grant_delete' => '0',
+))
+->execute();
+
+db_create_table('node_comment_statistics', array(
+  'fields' => array(
+    'nid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'last_comment_timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'last_comment_name' => array(
+      'type' => 'varchar',
+      'length' => 60,
+      'not null' => FALSE,
+    ),
+    'last_comment_uid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'comment_count' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'nid',
+  ),
+  'indexes' => array(
+    'node_comment_timestamp' => array(
+      'last_comment_timestamp',
+    ),
+  ),
+  'module' => 'comment',
+  'name' => 'node_comment_statistics',
+));
+db_insert('node_comment_statistics')->fields(array(
+  'nid',
+  'last_comment_timestamp',
+  'last_comment_name',
+  'last_comment_uid',
+  'comment_count',
+))
+->values(array(
+  'nid' => '1',
+  'last_comment_timestamp' => '1282936266',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '3',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '2',
+  'last_comment_timestamp' => '1282936266',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '3',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '3',
+  'last_comment_timestamp' => '1282936266',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '3',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '4',
+  'last_comment_timestamp' => '1282936266',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '3',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '5',
+  'last_comment_timestamp' => '1282936266',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '3',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '6',
+  'last_comment_timestamp' => '1282936266',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '3',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '7',
+  'last_comment_timestamp' => '1282936266',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '3',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '8',
+  'last_comment_timestamp' => '1282936266',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '3',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '9',
+  'last_comment_timestamp' => '1282936266',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '4',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '10',
+  'last_comment_timestamp' => '1282936266',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '4',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '11',
+  'last_comment_timestamp' => '1282936267',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '4',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '12',
+  'last_comment_timestamp' => '1282936267',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '4',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '13',
+  'last_comment_timestamp' => '1282936267',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '4',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '14',
+  'last_comment_timestamp' => '1282936267',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '4',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '15',
+  'last_comment_timestamp' => '1282936267',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '4',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '16',
+  'last_comment_timestamp' => '1282936267',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '4',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '17',
+  'last_comment_timestamp' => '1282936267',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '5',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '18',
+  'last_comment_timestamp' => '1282936267',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '5',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '19',
+  'last_comment_timestamp' => '1282936267',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '5',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '20',
+  'last_comment_timestamp' => '1282936267',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '5',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '21',
+  'last_comment_timestamp' => '1282936267',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '5',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '22',
+  'last_comment_timestamp' => '1282936267',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '5',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '23',
+  'last_comment_timestamp' => '1282936267',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '5',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '24',
+  'last_comment_timestamp' => '1282936267',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '5',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '25',
+  'last_comment_timestamp' => '1282936268',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '3',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '26',
+  'last_comment_timestamp' => '1282936268',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '3',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '27',
+  'last_comment_timestamp' => '1282936268',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '3',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '28',
+  'last_comment_timestamp' => '1282936268',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '3',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '29',
+  'last_comment_timestamp' => '1282936268',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '4',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '30',
+  'last_comment_timestamp' => '1282936268',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '4',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '31',
+  'last_comment_timestamp' => '1282936268',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '4',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '32',
+  'last_comment_timestamp' => '1282936268',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '4',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '33',
+  'last_comment_timestamp' => '1282936268',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '5',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '34',
+  'last_comment_timestamp' => '1282936268',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '5',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '35',
+  'last_comment_timestamp' => '1282936268',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '5',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '36',
+  'last_comment_timestamp' => '1282936268',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '5',
+  'comment_count' => '0',
+))
+->values(array(
+  'nid' => '37',
+  'last_comment_timestamp' => '1279310615',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '6',
+  'comment_count' => '0',
+))
+->execute();
+
+db_create_table('node_counter', array(
+  'fields' => array(
+    'nid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'totalcount' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'big',
+    ),
+    'daycount' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'medium',
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'nid',
+  ),
+  'module' => 'node',
+  'name' => 'node_counter',
+));
+
+db_create_table('node_revisions', array(
+  'fields' => array(
+    'nid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'vid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'uid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'title' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'body' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+    'teaser' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+    'log' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'format' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'nid' => array(
+      'nid',
+    ),
+    'uid' => array(
+      'uid',
+    ),
+  ),
+  'primary key' => array(
+    'vid',
+  ),
+  'module' => 'node',
+  'name' => 'node_revisions',
+));
+db_insert('node_revisions')->fields(array(
+  'nid',
+  'vid',
+  'uid',
+  'title',
+  'body',
+  'teaser',
+  'log',
+  'timestamp',
+  'format',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '1',
+  'uid' => '3',
+  'title' => 'node title 1 rev 1 (i=0)',
+  'body' => 'node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0',
+  'teaser' => 'node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0',
+  'log' => 'added 0 node',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'uid' => '6',
+  'title' => 'node title 1 rev 1 (i=0) rev2 2',
+  'body' => 'node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0node revision body (page) - 0',
+  'teaser' => 'node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0node body (page) - 0',
+  'log' => 'added 0 revision',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '3',
+  'uid' => '3',
+  'title' => 'node title 2 rev 3 (i=1)',
+  'body' => 'node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1',
+  'teaser' => 'node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1',
+  'log' => 'added 1 node',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'uid' => '6',
+  'title' => 'node title 2 rev 3 (i=1) rev2 4',
+  'body' => 'node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1node revision body (page) - 1',
+  'teaser' => 'node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1node body (page) - 1',
+  'log' => 'added 1 revision',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '5',
+  'uid' => '3',
+  'title' => 'node title 3 rev 5 (i=2)',
+  'body' => 'node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2',
+  'teaser' => 'node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2',
+  'log' => 'added 2 node',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'uid' => '6',
+  'title' => 'node title 3 rev 5 (i=2) rev2 6',
+  'body' => 'node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2node revision body (page) - 2',
+  'teaser' => 'node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2node body (page) - 2',
+  'log' => 'added 2 revision',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '7',
+  'uid' => '3',
+  'title' => 'node title 4 rev 7 (i=3)',
+  'body' => 'node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3',
+  'teaser' => 'node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3',
+  'log' => 'added 3 node',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'uid' => '6',
+  'title' => 'node title 4 rev 7 (i=3) rev2 8',
+  'body' => 'node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3node revision body (page) - 3',
+  'teaser' => 'node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3node body (page) - 3',
+  'log' => 'added 3 revision',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '9',
+  'uid' => '3',
+  'title' => 'node title 5 rev 9 (i=4)',
+  'body' => 'node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4',
+  'teaser' => 'node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4',
+  'log' => 'added 4 node',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'uid' => '6',
+  'title' => 'node title 5 rev 9 (i=4) rev2 10',
+  'body' => 'node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4node revision body (page) - 4',
+  'teaser' => 'node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4node body (page) - 4',
+  'log' => 'added 4 revision',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '11',
+  'uid' => '3',
+  'title' => 'node title 6 rev 11 (i=5)',
+  'body' => 'node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5',
+  'teaser' => 'node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5',
+  'log' => 'added 5 node',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'uid' => '6',
+  'title' => 'node title 6 rev 11 (i=5) rev2 12',
+  'body' => 'node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5node revision body (page) - 5',
+  'teaser' => 'node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5node body (page) - 5',
+  'log' => 'added 5 revision',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '13',
+  'uid' => '3',
+  'title' => 'node title 7 rev 13 (i=6)',
+  'body' => 'node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6',
+  'teaser' => 'node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6',
+  'log' => 'added 6 node',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'uid' => '6',
+  'title' => 'node title 7 rev 13 (i=6) rev2 14',
+  'body' => 'node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6node revision body (page) - 6',
+  'teaser' => 'node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6node body (page) - 6',
+  'log' => 'added 6 revision',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '15',
+  'uid' => '3',
+  'title' => 'node title 8 rev 15 (i=7)',
+  'body' => 'node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7',
+  'teaser' => 'node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7',
+  'log' => 'added 7 node',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'uid' => '6',
+  'title' => 'node title 8 rev 15 (i=7) rev2 16',
+  'body' => 'node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7node revision body (page) - 7',
+  'teaser' => 'node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7node body (page) - 7',
+  'log' => 'added 7 revision',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '17',
+  'uid' => '4',
+  'title' => 'node title 9 rev 17 (i=8)',
+  'body' => 'node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8',
+  'teaser' => 'node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8',
+  'log' => 'added 8 node',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'uid' => '7',
+  'title' => 'node title 9 rev 17 (i=8) rev2 18',
+  'body' => 'node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8node revision body (page) - 8',
+  'teaser' => 'node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8node body (page) - 8',
+  'log' => 'added 8 revision',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '19',
+  'uid' => '4',
+  'title' => 'node title 10 rev 19 (i=9)',
+  'body' => 'node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9',
+  'teaser' => 'node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9',
+  'log' => 'added 9 node',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'uid' => '7',
+  'title' => 'node title 10 rev 19 (i=9) rev2 20',
+  'body' => 'node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9node revision body (page) - 9',
+  'teaser' => 'node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9node body (page) - 9',
+  'log' => 'added 9 revision',
+  'timestamp' => '1282936266',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '21',
+  'uid' => '4',
+  'title' => 'node title 11 rev 21 (i=10)',
+  'body' => 'node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10',
+  'teaser' => 'node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (p',
+  'log' => 'added 10 node',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'uid' => '7',
+  'title' => 'node title 11 rev 21 (i=10) rev2 22',
+  'body' => 'node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10node revision body (page) - 10',
+  'teaser' => 'node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (page) - 10node body (p',
+  'log' => 'added 10 revision',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '23',
+  'uid' => '4',
+  'title' => 'node title 12 rev 23 (i=11)',
+  'body' => 'node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11',
+  'teaser' => 'node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (p',
+  'log' => 'added 11 node',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'uid' => '7',
+  'title' => 'node title 12 rev 23 (i=11) rev2 24',
+  'body' => 'node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11node revision body (page) - 11',
+  'teaser' => 'node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (page) - 11node body (p',
+  'log' => 'added 11 revision',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'uid' => '4',
+  'title' => 'node title 13 rev 25 (i=12)',
+  'body' => 'node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12',
+  'teaser' => 'node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node body (story) - 12node b',
+  'log' => 'added 12 node',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'uid' => '4',
+  'title' => 'node title 14 rev 26 (i=13)',
+  'body' => 'node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13',
+  'teaser' => 'node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node body (story) - 13node b',
+  'log' => 'added 13 node',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'uid' => '4',
+  'title' => 'node title 15 rev 27 (i=14)',
+  'body' => 'node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14',
+  'teaser' => 'node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node body (story) - 14node b',
+  'log' => 'added 14 node',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'uid' => '4',
+  'title' => 'node title 16 rev 28 (i=15)',
+  'body' => 'node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15',
+  'teaser' => 'node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node body (story) - 15node b',
+  'log' => 'added 15 node',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'uid' => '5',
+  'title' => 'node title 17 rev 29 (i=16)',
+  'body' => 'node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16',
+  'teaser' => 'node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node body (story) - 16node b',
+  'log' => 'added 16 node',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'uid' => '5',
+  'title' => 'node title 18 rev 30 (i=17)',
+  'body' => 'node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17',
+  'teaser' => 'node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node body (story) - 17node b',
+  'log' => 'added 17 node',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'uid' => '5',
+  'title' => 'node title 19 rev 31 (i=18)',
+  'body' => 'node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18',
+  'teaser' => 'node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node body (story) - 18node b',
+  'log' => 'added 18 node',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'uid' => '5',
+  'title' => 'node title 20 rev 32 (i=19)',
+  'body' => 'node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19',
+  'teaser' => 'node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node body (story) - 19node b',
+  'log' => 'added 19 node',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'uid' => '5',
+  'title' => 'node title 21 rev 33 (i=20)',
+  'body' => 'node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20',
+  'teaser' => 'node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node body (story) - 20node b',
+  'log' => 'added 20 node',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'uid' => '5',
+  'title' => 'node title 22 rev 34 (i=21)',
+  'body' => 'node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21',
+  'teaser' => 'node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node body (story) - 21node b',
+  'log' => 'added 21 node',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'uid' => '5',
+  'title' => 'node title 23 rev 35 (i=22)',
+  'body' => 'node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22',
+  'teaser' => 'node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node body (story) - 22node b',
+  'log' => 'added 22 node',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'uid' => '5',
+  'title' => 'node title 24 rev 36 (i=23)',
+  'body' => 'node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23',
+  'teaser' => 'node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node body (story) - 23node b',
+  'log' => 'added 23 node',
+  'timestamp' => '1282936267',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '25',
+  'vid' => '37',
+  'uid' => '3',
+  'title' => 'poll title 0',
+  'body' => '',
+  'teaser' => '',
+  'log' => 'added 0 poll',
+  'timestamp' => '1282936268',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '26',
+  'vid' => '38',
+  'uid' => '3',
+  'title' => 'poll title 1',
+  'body' => '',
+  'teaser' => '',
+  'log' => 'added 1 poll',
+  'timestamp' => '1282936268',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '27',
+  'vid' => '39',
+  'uid' => '3',
+  'title' => 'poll title 2',
+  'body' => '',
+  'teaser' => '',
+  'log' => 'added 2 poll',
+  'timestamp' => '1282936268',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '28',
+  'vid' => '40',
+  'uid' => '3',
+  'title' => 'poll title 3',
+  'body' => '',
+  'teaser' => '',
+  'log' => 'added 3 poll',
+  'timestamp' => '1282936268',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '29',
+  'vid' => '41',
+  'uid' => '4',
+  'title' => 'poll title 4',
+  'body' => '',
+  'teaser' => '',
+  'log' => 'added 4 poll',
+  'timestamp' => '1282936268',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '30',
+  'vid' => '42',
+  'uid' => '4',
+  'title' => 'poll title 5',
+  'body' => '',
+  'teaser' => '',
+  'log' => 'added 5 poll',
+  'timestamp' => '1282936268',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '31',
+  'vid' => '43',
+  'uid' => '4',
+  'title' => 'poll title 6',
+  'body' => '',
+  'teaser' => '',
+  'log' => 'added 6 poll',
+  'timestamp' => '1282936268',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '32',
+  'vid' => '44',
+  'uid' => '4',
+  'title' => 'poll title 7',
+  'body' => '',
+  'teaser' => '',
+  'log' => 'added 7 poll',
+  'timestamp' => '1282936268',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '33',
+  'vid' => '45',
+  'uid' => '5',
+  'title' => 'poll title 8',
+  'body' => '',
+  'teaser' => '',
+  'log' => 'added 8 poll',
+  'timestamp' => '1282936268',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '34',
+  'vid' => '46',
+  'uid' => '5',
+  'title' => 'poll title 9',
+  'body' => '',
+  'teaser' => '',
+  'log' => 'added 9 poll',
+  'timestamp' => '1282936268',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '35',
+  'vid' => '47',
+  'uid' => '5',
+  'title' => 'poll title 10',
+  'body' => '',
+  'teaser' => '',
+  'log' => 'added 10 poll',
+  'timestamp' => '1282936268',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '36',
+  'vid' => '48',
+  'uid' => '5',
+  'title' => 'poll title 11',
+  'body' => '',
+  'teaser' => '',
+  'log' => 'added 11 poll',
+  'timestamp' => '1282936268',
+  'format' => '0',
+))
+->values(array(
+  'nid' => '37',
+  'vid' => '49',
+  'uid' => '6',
+  'title' => 'node title 24',
+  'body' => 'node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37',
+  'teaser' => 'node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37node body (broken) - 37no',
+  'log' => 'added 12 node',
+  'timestamp' => '1279310614',
+  'format' => '0',
+))
+->execute();
+
+db_create_table('node_type', array(
+  'fields' => array(
+    'type' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'module' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+    ),
+    'description' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'medium',
+    ),
+    'help' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'medium',
+    ),
+    'has_title' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'size' => 'tiny',
+    ),
+    'title_label' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'has_body' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'size' => 'tiny',
+    ),
+    'body_label' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'min_word_count' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'size' => 'small',
+    ),
+    'custom' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'modified' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'locked' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'orig_type' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+  ),
+  'primary key' => array(
+    'type',
+  ),
+  'module' => 'node',
+  'name' => 'node_type',
+));
+db_insert('node_type')->fields(array(
+  'type',
+  'name',
+  'module',
+  'description',
+  'help',
+  'has_title',
+  'title_label',
+  'has_body',
+  'body_label',
+  'min_word_count',
+  'custom',
+  'modified',
+  'locked',
+  'orig_type',
+))
+->values(array(
+  'type' => 'page',
+  'name' => 'Page',
+  'module' => 'node',
+  'description' => "A <em>page</em>, similar in form to a <em>story</em>, is a simple method for creating and displaying information that rarely changes, such as an \"About us\" section of a website. By default, a <em>page</em> entry does not allow visitor comments and is not featured on the site's initial home page.",
+  'help' => '',
+  'has_title' => '1',
+  'title_label' => 'Title',
+  'has_body' => '1',
+  'body_label' => 'Body',
+  'min_word_count' => '0',
+  'custom' => '1',
+  'modified' => '1',
+  'locked' => '0',
+  'orig_type' => 'page',
+))
+->values(array(
+  'type' => 'poll',
+  'name' => 'Poll',
+  'module' => 'poll',
+  'description' => 'A <em>poll</em> is a question with a set of possible responses. A <em>poll</em>, once created, automatically provides a simple running count of the number of votes received for each response.',
+  'help' => '',
+  'has_title' => '1',
+  'title_label' => 'Question',
+  'has_body' => '0',
+  'body_label' => '',
+  'min_word_count' => '0',
+  'custom' => '0',
+  'modified' => '0',
+  'locked' => '1',
+  'orig_type' => 'poll',
+))
+->values(array(
+  'type' => 'story',
+  'name' => 'Story',
+  'module' => 'node',
+  'description' => "A <em>story</em>, similar in form to a <em>page</em>, is ideal for creating and displaying content that informs or engages website visitors. Press releases, site announcements, and informal blog-like entries may all be created with a <em>story</em> entry. By default, a <em>story</em> entry is automatically featured on the site's initial home page, and provides the ability to post comments.",
+  'help' => '',
+  'has_title' => '1',
+  'title_label' => 'Title',
+  'has_body' => '1',
+  'body_label' => 'Body',
+  'min_word_count' => '0',
+  'custom' => '1',
+  'modified' => '1',
+  'locked' => '0',
+  'orig_type' => 'story',
+))
+->execute();
+
+db_create_table('permission', array(
+  'fields' => array(
+    'pid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'rid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'perm' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'tid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'pid',
+  ),
+  'indexes' => array(
+    'rid' => array(
+      'rid',
+    ),
+  ),
+  'module' => 'user',
+  'name' => 'permission',
+));
+db_insert('permission')->fields(array(
+  'pid',
+  'rid',
+  'perm',
+  'tid',
+))
+->values(array(
+  'pid' => '1',
+  'rid' => '1',
+  'perm' => 'access content',
+  'tid' => '0',
+))
+->values(array(
+  'pid' => '2',
+  'rid' => '2',
+  'perm' => 'access comments, access content, post comments, post comments without approval',
+  'tid' => '0',
+))
+->execute();
+
+db_create_table('poll', array(
+  'fields' => array(
+    'nid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'runtime' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'active' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'nid',
+  ),
+  'module' => 'poll',
+  'name' => 'poll',
+));
+db_insert('poll')->fields(array(
+  'nid',
+  'runtime',
+  'active',
+))
+->values(array(
+  'nid' => '25',
+  'runtime' => '0',
+  'active' => '1',
+))
+->values(array(
+  'nid' => '26',
+  'runtime' => '0',
+  'active' => '1',
+))
+->values(array(
+  'nid' => '27',
+  'runtime' => '0',
+  'active' => '1',
+))
+->values(array(
+  'nid' => '28',
+  'runtime' => '0',
+  'active' => '1',
+))
+->values(array(
+  'nid' => '29',
+  'runtime' => '0',
+  'active' => '1',
+))
+->values(array(
+  'nid' => '30',
+  'runtime' => '0',
+  'active' => '1',
+))
+->values(array(
+  'nid' => '31',
+  'runtime' => '0',
+  'active' => '1',
+))
+->values(array(
+  'nid' => '32',
+  'runtime' => '0',
+  'active' => '1',
+))
+->values(array(
+  'nid' => '33',
+  'runtime' => '0',
+  'active' => '1',
+))
+->values(array(
+  'nid' => '34',
+  'runtime' => '0',
+  'active' => '1',
+))
+->values(array(
+  'nid' => '35',
+  'runtime' => '0',
+  'active' => '1',
+))
+->values(array(
+  'nid' => '36',
+  'runtime' => '0',
+  'active' => '1',
+))
+->execute();
+
+db_create_table('poll_choices', array(
+  'fields' => array(
+    'chid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'nid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'chtext' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'chvotes' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'chorder' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'nid' => array(
+      'nid',
+    ),
+  ),
+  'primary key' => array(
+    'chid',
+  ),
+  'module' => 'poll',
+  'name' => 'poll_choices',
+));
+db_insert('poll_choices')->fields(array(
+  'chid',
+  'nid',
+  'chtext',
+  'chvotes',
+  'chorder',
+))
+->values(array(
+  'chid' => '1',
+  'nid' => '25',
+  'chtext' => 'Choice 0 for poll 0',
+  'chvotes' => '3',
+  'chorder' => '0',
+))
+->values(array(
+  'chid' => '2',
+  'nid' => '25',
+  'chtext' => 'Choice 1 for poll 0',
+  'chvotes' => '2',
+  'chorder' => '1',
+))
+->values(array(
+  'chid' => '3',
+  'nid' => '26',
+  'chtext' => 'Choice 0 for poll 1',
+  'chvotes' => '2',
+  'chorder' => '0',
+))
+->values(array(
+  'chid' => '4',
+  'nid' => '26',
+  'chtext' => 'Choice 1 for poll 1',
+  'chvotes' => '2',
+  'chorder' => '1',
+))
+->values(array(
+  'chid' => '5',
+  'nid' => '26',
+  'chtext' => 'Choice 2 for poll 1',
+  'chvotes' => '2',
+  'chorder' => '2',
+))
+->values(array(
+  'chid' => '6',
+  'nid' => '27',
+  'chtext' => 'Choice 0 for poll 2',
+  'chvotes' => '2',
+  'chorder' => '0',
+))
+->values(array(
+  'chid' => '7',
+  'nid' => '27',
+  'chtext' => 'Choice 1 for poll 2',
+  'chvotes' => '2',
+  'chorder' => '1',
+))
+->values(array(
+  'chid' => '8',
+  'nid' => '27',
+  'chtext' => 'Choice 2 for poll 2',
+  'chvotes' => '2',
+  'chorder' => '2',
+))
+->values(array(
+  'chid' => '9',
+  'nid' => '27',
+  'chtext' => 'Choice 3 for poll 2',
+  'chvotes' => '1',
+  'chorder' => '3',
+))
+->values(array(
+  'chid' => '10',
+  'nid' => '28',
+  'chtext' => 'Choice 0 for poll 3',
+  'chvotes' => '2',
+  'chorder' => '0',
+))
+->values(array(
+  'chid' => '11',
+  'nid' => '28',
+  'chtext' => 'Choice 1 for poll 3',
+  'chvotes' => '2',
+  'chorder' => '1',
+))
+->values(array(
+  'chid' => '12',
+  'nid' => '28',
+  'chtext' => 'Choice 2 for poll 3',
+  'chvotes' => '2',
+  'chorder' => '2',
+))
+->values(array(
+  'chid' => '13',
+  'nid' => '28',
+  'chtext' => 'Choice 3 for poll 3',
+  'chvotes' => '1',
+  'chorder' => '3',
+))
+->values(array(
+  'chid' => '14',
+  'nid' => '28',
+  'chtext' => 'Choice 4 for poll 3',
+  'chvotes' => '1',
+  'chorder' => '4',
+))
+->values(array(
+  'chid' => '15',
+  'nid' => '29',
+  'chtext' => 'Choice 0 for poll 4',
+  'chvotes' => '3',
+  'chorder' => '0',
+))
+->values(array(
+  'chid' => '16',
+  'nid' => '29',
+  'chtext' => 'Choice 1 for poll 4',
+  'chvotes' => '2',
+  'chorder' => '1',
+))
+->values(array(
+  'chid' => '17',
+  'nid' => '30',
+  'chtext' => 'Choice 0 for poll 5',
+  'chvotes' => '2',
+  'chorder' => '0',
+))
+->values(array(
+  'chid' => '18',
+  'nid' => '30',
+  'chtext' => 'Choice 1 for poll 5',
+  'chvotes' => '2',
+  'chorder' => '1',
+))
+->values(array(
+  'chid' => '19',
+  'nid' => '30',
+  'chtext' => 'Choice 2 for poll 5',
+  'chvotes' => '2',
+  'chorder' => '2',
+))
+->values(array(
+  'chid' => '20',
+  'nid' => '31',
+  'chtext' => 'Choice 0 for poll 6',
+  'chvotes' => '2',
+  'chorder' => '0',
+))
+->values(array(
+  'chid' => '21',
+  'nid' => '31',
+  'chtext' => 'Choice 1 for poll 6',
+  'chvotes' => '2',
+  'chorder' => '1',
+))
+->values(array(
+  'chid' => '22',
+  'nid' => '31',
+  'chtext' => 'Choice 2 for poll 6',
+  'chvotes' => '2',
+  'chorder' => '2',
+))
+->values(array(
+  'chid' => '23',
+  'nid' => '31',
+  'chtext' => 'Choice 3 for poll 6',
+  'chvotes' => '1',
+  'chorder' => '3',
+))
+->values(array(
+  'chid' => '24',
+  'nid' => '32',
+  'chtext' => 'Choice 0 for poll 7',
+  'chvotes' => '2',
+  'chorder' => '0',
+))
+->values(array(
+  'chid' => '25',
+  'nid' => '32',
+  'chtext' => 'Choice 1 for poll 7',
+  'chvotes' => '2',
+  'chorder' => '1',
+))
+->values(array(
+  'chid' => '26',
+  'nid' => '32',
+  'chtext' => 'Choice 2 for poll 7',
+  'chvotes' => '2',
+  'chorder' => '2',
+))
+->values(array(
+  'chid' => '27',
+  'nid' => '32',
+  'chtext' => 'Choice 3 for poll 7',
+  'chvotes' => '1',
+  'chorder' => '3',
+))
+->values(array(
+  'chid' => '28',
+  'nid' => '32',
+  'chtext' => 'Choice 4 for poll 7',
+  'chvotes' => '1',
+  'chorder' => '4',
+))
+->values(array(
+  'chid' => '29',
+  'nid' => '33',
+  'chtext' => 'Choice 0 for poll 8',
+  'chvotes' => '3',
+  'chorder' => '0',
+))
+->values(array(
+  'chid' => '30',
+  'nid' => '33',
+  'chtext' => 'Choice 1 for poll 8',
+  'chvotes' => '2',
+  'chorder' => '1',
+))
+->values(array(
+  'chid' => '31',
+  'nid' => '34',
+  'chtext' => 'Choice 0 for poll 9',
+  'chvotes' => '2',
+  'chorder' => '0',
+))
+->values(array(
+  'chid' => '32',
+  'nid' => '34',
+  'chtext' => 'Choice 1 for poll 9',
+  'chvotes' => '2',
+  'chorder' => '1',
+))
+->values(array(
+  'chid' => '33',
+  'nid' => '34',
+  'chtext' => 'Choice 2 for poll 9',
+  'chvotes' => '2',
+  'chorder' => '2',
+))
+->values(array(
+  'chid' => '34',
+  'nid' => '35',
+  'chtext' => 'Choice 0 for poll 10',
+  'chvotes' => '2',
+  'chorder' => '0',
+))
+->values(array(
+  'chid' => '35',
+  'nid' => '35',
+  'chtext' => 'Choice 1 for poll 10',
+  'chvotes' => '2',
+  'chorder' => '1',
+))
+->values(array(
+  'chid' => '36',
+  'nid' => '35',
+  'chtext' => 'Choice 2 for poll 10',
+  'chvotes' => '2',
+  'chorder' => '2',
+))
+->values(array(
+  'chid' => '37',
+  'nid' => '35',
+  'chtext' => 'Choice 3 for poll 10',
+  'chvotes' => '1',
+  'chorder' => '3',
+))
+->values(array(
+  'chid' => '38',
+  'nid' => '36',
+  'chtext' => 'Choice 0 for poll 11',
+  'chvotes' => '2',
+  'chorder' => '0',
+))
+->values(array(
+  'chid' => '39',
+  'nid' => '36',
+  'chtext' => 'Choice 1 for poll 11',
+  'chvotes' => '2',
+  'chorder' => '1',
+))
+->values(array(
+  'chid' => '40',
+  'nid' => '36',
+  'chtext' => 'Choice 2 for poll 11',
+  'chvotes' => '2',
+  'chorder' => '2',
+))
+->values(array(
+  'chid' => '41',
+  'nid' => '36',
+  'chtext' => 'Choice 3 for poll 11',
+  'chvotes' => '1',
+  'chorder' => '3',
+))
+->values(array(
+  'chid' => '42',
+  'nid' => '36',
+  'chtext' => 'Choice 4 for poll 11',
+  'chvotes' => '1',
+  'chorder' => '4',
+))
+->execute();
+
+db_create_table('poll_votes', array(
+  'fields' => array(
+    'nid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'uid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'chorder' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => -1,
+    ),
+    'hostname' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+  ),
+  'primary key' => array(
+    'nid',
+    'uid',
+    'hostname',
+  ),
+  'indexes' => array(
+    'hostname' => array(
+      'hostname',
+    ),
+    'uid' => array(
+      'uid',
+    ),
+  ),
+  'module' => 'poll',
+  'name' => 'poll_votes',
+));
+db_insert('poll_votes')->fields(array(
+  'nid',
+  'uid',
+  'chorder',
+  'hostname',
+))
+->values(array(
+  'nid' => '25',
+  'uid' => '3',
+  'chorder' => '0',
+  'hostname' => '',
+))
+->values(array(
+  'nid' => '26',
+  'uid' => '3',
+  'chorder' => '0',
+  'hostname' => '',
+))
+->values(array(
+  'nid' => '27',
+  'uid' => '3',
+  'chorder' => '0',
+  'hostname' => '',
+))
+->values(array(
+  'nid' => '28',
+  'uid' => '3',
+  'chorder' => '0',
+  'hostname' => '',
+))
+->values(array(
+  'nid' => '29',
+  'uid' => '4',
+  'chorder' => '0',
+  'hostname' => '',
+))
+->values(array(
+  'nid' => '30',
+  'uid' => '4',
+  'chorder' => '0',
+  'hostname' => '',
+))
+->values(array(
+  'nid' => '31',
+  'uid' => '4',
+  'chorder' => '0',
+  'hostname' => '',
+))
+->values(array(
+  'nid' => '32',
+  'uid' => '4',
+  'chorder' => '0',
+  'hostname' => '',
+))
+->values(array(
+  'nid' => '33',
+  'uid' => '5',
+  'chorder' => '0',
+  'hostname' => '',
+))
+->values(array(
+  'nid' => '34',
+  'uid' => '5',
+  'chorder' => '0',
+  'hostname' => '',
+))
+->values(array(
+  'nid' => '35',
+  'uid' => '5',
+  'chorder' => '0',
+  'hostname' => '',
+))
+->values(array(
+  'nid' => '36',
+  'uid' => '5',
+  'chorder' => '0',
+  'hostname' => '',
+))
+->execute();
+
+db_create_table('role', array(
+  'fields' => array(
+    'rid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+  ),
+  'unique keys' => array(
+    'name' => array(
+      'name',
+    ),
+  ),
+  'primary key' => array(
+    'rid',
+  ),
+  'module' => 'user',
+  'name' => 'role',
+));
+db_insert('role')->fields(array(
+  'rid',
+  'name',
+))
+->values(array(
+  'rid' => '1',
+  'name' => 'anonymous user',
+))
+->values(array(
+  'rid' => '2',
+  'name' => 'authenticated user',
+))
+->execute();
+
+db_create_table('semaphore', array(
+  'fields' => array(
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'value' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'expire' => array(
+      'type' => 'float',
+      'size' => 'big',
+      'not null' => TRUE,
+    ),
+  ),
+  'indexes' => array(
+    'expire' => array(
+      'expire',
+    ),
+  ),
+  'primary key' => array(
+    'name',
+  ),
+  'module' => 'system',
+  'name' => 'semaphore',
+));
+
+db_create_table('sessions', array(
+  'fields' => array(
+    'uid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'sid' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'hostname' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'cache' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'session' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+  ),
+  'primary key' => array(
+    'sid',
+  ),
+  'indexes' => array(
+    'timestamp' => array(
+      'timestamp',
+    ),
+    'uid' => array(
+      'uid',
+    ),
+  ),
+  'module' => 'system',
+  'name' => 'sessions',
+));
+
+db_create_table('system', array(
+  'fields' => array(
+    'filename' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'type' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'owner' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'throttle' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'bootstrap' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'schema_version' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => -1,
+      'size' => 'small',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'info' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+  ),
+  'primary key' => array(
+    'filename',
+  ),
+  'indexes' => array(
+    'modules' => array(
+      array(
+        'type',
+        12,
+      ),
+      'status',
+      'weight',
+      'filename',
+    ),
+    'bootstrap' => array(
+      array(
+        'type',
+        12,
+      ),
+      'status',
+      'bootstrap',
+      'weight',
+      'filename',
+    ),
+    'type_name' => array(
+      array(
+        'type',
+        12,
+      ),
+      'name',
+    ),
+  ),
+  'module' => 'system',
+  'name' => 'system',
+));
+db_insert('system')->fields(array(
+  'filename',
+  'name',
+  'type',
+  'owner',
+  'status',
+  'throttle',
+  'bootstrap',
+  'schema_version',
+  'weight',
+  'info',
+))
+->values(array(
+  'filename' => 'modules/aggregator/aggregator.module',
+  'name' => 'aggregator',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:10:"Aggregator";s:11:"description";s:57:"Aggregates syndicated content (RSS, RDF, and Atom feeds).";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/block/block.module',
+  'name' => 'block',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:5:"Block";s:11:"description";s:62:"Controls the boxes that are displayed around the main content.";s:7:"package";s:15:"Core - required";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/blog/blog.module',
+  'name' => 'blog',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:4:"Blog";s:11:"description";s:69:"Enables keeping easily and regularly updated user web pages or blogs.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/blogapi/blogapi.module',
+  'name' => 'blogapi',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:8:"Blog API";s:11:"description";s:79:"Allows users to post content using applications that support XML-RPC blog APIs.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/book/book.module',
+  'name' => 'book',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:4:"Book";s:11:"description";s:63:"Allows users to structure site pages in a hierarchy or outline.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/color/color.module',
+  'name' => 'color',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:5:"Color";s:11:"description";s:61:"Allows the user to change the color scheme of certain themes.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/comment/comment.module',
+  'name' => 'comment',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '6003',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:7:"Comment";s:11:"description";s:57:"Allows users to comment on and discuss published content.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/contact/contact.module',
+  'name' => 'contact',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:7:"Contact";s:11:"description";s:61:"Enables the use of both personal and site-wide contact forms.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/dblog/dblog.module',
+  'name' => 'dblog',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '6000',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:16:"Database logging";s:11:"description";s:47:"Logs and records system events to the database.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/filter/filter.module',
+  'name' => 'filter',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:6:"Filter";s:11:"description";s:60:"Handles the filtering of content in preparation for display.";s:7:"package";s:15:"Core - required";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/forum/forum.module',
+  'name' => 'forum',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:5:"Forum";s:11:"description";s:50:"Enables threaded discussions about general topics.";s:12:"dependencies";a:2:{i:0;s:8:"taxonomy";i:1;s:7:"comment";}s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/help/help.module',
+  'name' => 'help',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:4:"Help";s:11:"description";s:35:"Manages the display of online help.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/locale/locale.module',
+  'name' => 'locale',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:6:"Locale";s:11:"description";s:119:"Adds language handling functionality and enables the translation of the user interface to languages other than English.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/menu/menu.module',
+  'name' => 'menu',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:4:"Menu";s:11:"description";s:60:"Allows administrators to customize the site navigation menu.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/node/node.module',
+  'name' => 'node',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:4:"Node";s:11:"description";s:66:"Allows content to be submitted to the site and displayed on pages.";s:7:"package";s:15:"Core - required";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/openid/openid.module',
+  'name' => 'openid',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:6:"OpenID";s:11:"description";s:48:"Allows users to log into your site using OpenID.";s:7:"version";s:8:"6.20-dev";s:7:"package";s:15:"Core - optional";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/path/path.module',
+  'name' => 'path',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:4:"Path";s:11:"description";s:28:"Allows users to rename URLs.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/php/php.module',
+  'name' => 'php',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:10:"PHP filter";s:11:"description";s:50:"Allows embedded PHP code/snippets to be evaluated.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/ping/ping.module',
+  'name' => 'ping',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:4:"Ping";s:11:"description";s:51:"Alerts other sites when your site has been updated.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/poll/poll.module',
+  'name' => 'poll',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:4:"Poll";s:11:"description";s:95:"Allows your site to capture votes on different topics in the form of multiple choice questions.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/profile/profile.module',
+  'name' => 'profile',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:7:"Profile";s:11:"description";s:36:"Supports configurable user profiles.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/search/search.module',
+  'name' => 'search',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:6:"Search";s:11:"description";s:36:"Enables site-wide keyword searching.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/statistics/statistics.module',
+  'name' => 'statistics',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:10:"Statistics";s:11:"description";s:37:"Logs access statistics for your site.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/syslog/syslog.module',
+  'name' => 'syslog',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:6:"Syslog";s:11:"description";s:41:"Logs and records system events to syslog.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/system/system.module',
+  'name' => 'system',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '6055',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:6:"System";s:11:"description";s:54:"Handles general site configuration for administrators.";s:7:"package";s:15:"Core - required";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/taxonomy/taxonomy.module',
+  'name' => 'taxonomy',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:8:"Taxonomy";s:11:"description";s:38:"Enables the categorization of content.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/throttle/throttle.module',
+  'name' => 'throttle',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:8:"Throttle";s:11:"description";s:66:"Handles the auto-throttling mechanism, to control site congestion.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/tracker/tracker.module',
+  'name' => 'tracker',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:7:"Tracker";s:11:"description";s:43:"Enables tracking of recent posts for users.";s:12:"dependencies";a:1:{i:0;s:7:"comment";}s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/translation/translation.module',
+  'name' => 'translation',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:19:"Content translation";s:11:"description";s:57:"Allows content to be translated into different languages.";s:12:"dependencies";a:1:{i:0;s:6:"locale";}s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/trigger/trigger.module',
+  'name' => 'trigger',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:7:"Trigger";s:11:"description";s:90:"Enables actions to be fired on certain system events, such as when new content is created.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/update/update.module',
+  'name' => 'update',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '6000',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:13:"Update status";s:11:"description";s:88:"Checks the status of available updates for Drupal and your installed modules and themes.";s:7:"version";s:8:"6.20-dev";s:7:"package";s:15:"Core - optional";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/upload/upload.module',
+  'name' => 'upload',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:6:"Upload";s:11:"description";s:51:"Allows users to upload and attach files to content.";s:7:"package";s:15:"Core - optional";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'modules/user/user.module',
+  'name' => 'user',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:4:"User";s:11:"description";s:47:"Manages the user registration and login system.";s:7:"package";s:15:"Core - required";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/admin_menu/admin_menu.module',
+  'name' => 'admin_menu',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:19:"Administration Menu";s:11:"description";s:90:"Renders a menu tree for administrative purposes as dropdown menu at the top of the window.";s:7:"package";s:14:"Administration";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/cck/content.module',
+  'name' => 'content',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:7:"Content";s:11:"description";s:50:"Allows administrators to define new content types.";s:7:"package";s:3:"CCK";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/cck/modules/content_copy/content_copy.module',
+  'name' => 'content_copy',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:12:"Content Copy";s:11:"description";s:51:"Enables ability to import/export field definitions.";s:12:"dependencies";a:1:{i:0;s:7:"content";}s:7:"package";s:3:"CCK";s:4:"core";s:3:"6.x";s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/cck/modules/content_permissions/content_permissions.module',
+  'name' => 'content_permissions',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:19:"Content Permissions";s:11:"description";s:43:"Set field-level permissions for CCK fields.";s:7:"package";s:3:"CCK";s:4:"core";s:3:"6.x";s:12:"dependencies";a:1:{i:0;s:7:"content";}s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/cck/modules/fieldgroup/fieldgroup.module',
+  'name' => 'fieldgroup',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:10:"Fieldgroup";s:11:"description";s:35:"Create field groups for CCK fields.";s:12:"dependencies";a:1:{i:0;s:7:"content";}s:7:"package";s:3:"CCK";s:4:"core";s:3:"6.x";s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/cck/modules/nodereference/nodereference.module',
+  'name' => 'nodereference',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:14:"Node Reference";s:11:"description";s:59:"Defines a field type for referencing one node from another.";s:12:"dependencies";a:3:{i:0;s:7:"content";i:1;s:4:"text";i:2;s:13:"optionwidgets";}s:7:"package";s:3:"CCK";s:4:"core";s:3:"6.x";s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/cck/modules/number/number.module',
+  'name' => 'number',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:6:"Number";s:11:"description";s:28:"Defines numeric field types.";s:12:"dependencies";a:1:{i:0;s:7:"content";}s:7:"package";s:3:"CCK";s:4:"core";s:3:"6.x";s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/cck/modules/optionwidgets/optionwidgets.module',
+  'name' => 'optionwidgets',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:14:"Option Widgets";s:11:"description";s:82:"Defines selection, check box and radio button widgets for text and numeric fields.";s:12:"dependencies";a:1:{i:0;s:7:"content";}s:7:"package";s:3:"CCK";s:4:"core";s:3:"6.x";s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/cck/modules/text/text.module',
+  'name' => 'text',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:4:"Text";s:11:"description";s:32:"Defines simple text field types.";s:12:"dependencies";a:1:{i:0;s:7:"content";}s:7:"package";s:3:"CCK";s:4:"core";s:3:"6.x";s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/cck/modules/userreference/userreference.module',
+  'name' => 'userreference',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:14:"User Reference";s:11:"description";s:56:"Defines a field type for referencing a user from a node.";s:12:"dependencies";a:3:{i:0;s:7:"content";i:1;s:4:"text";i:2;s:13:"optionwidgets";}s:7:"package";s:3:"CCK";s:4:"core";s:3:"6.x";s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/devel/devel.module',
+  'name' => 'devel',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:5:"Devel";s:11:"description";s:52:"Various blocks, pages, and functions for developers.";s:7:"package";s:11:"Development";s:12:"dependencies";a:1:{i:0;s:4:"menu";}s:4:"core";s:3:"6.x";s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/devel/devel_generate.module',
+  'name' => 'devel_generate',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:14:"Devel generate";s:11:"description";s:48:"Generate dummy users, nodes, and taxonomy terms.";s:7:"package";s:11:"Development";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/devel/devel_node_access.module',
+  'name' => 'devel_node_access',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:17:"Devel node access";s:11:"description";s:67:"Developer block and page illustrating relevant node_access records.";s:7:"package";s:11:"Development";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/devel/devel_themer.module',
+  'name' => 'devel_themer',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:15:"Theme developer";s:11:"description";s:52:"Essential theme API information for theme developers";s:7:"package";s:11:"Development";s:12:"dependencies";a:1:{i:0;s:5:"devel";}s:4:"core";s:3:"6.x";s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/devel/macro.module',
+  'name' => 'macro',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:5:"Macro";s:11:"description";s:62:"Allows administrators to record and playback form submissions.";s:7:"package";s:11:"Development";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/devel/performance/performance.module',
+  'name' => 'performance',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:19:"Performance Logging";s:11:"description";s:91:"Logs detailed and/or summary page generation time and memory consumption for page requests.";s:7:"package";s:11:"Development";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/drush_extras/drush_extras.module',
+  'name' => 'drush_extras',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:9:{s:4:"name";s:12:"Drush extras";s:11:"description";s:43:"Useful Drush commands. Requires Drush core.";s:7:"package";s:11:"Development";s:4:"core";s:3:"7.x";s:5:"files";a:7:{i:0;s:19:"drush_extras.module";i:1;s:12:"pm.drush.inc";i:2;s:16:"pm_cvs.drush.inc";i:3;s:16:"pm_svn.drush.inc";i:4;s:20:"simpletest.drush.inc";i:5;s:13:"sql.drush.inc";i:6;s:15:"tools.drush.inc";}s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/mymap/mymap.module',
+  'name' => 'mymap',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:7:{s:4:"name";s:6:"My Map";s:11:"description";s:36:"Allows any node to have a Google map";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/plugin_manager.module',
+  'name' => 'plugin_manager',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:14:"Plugin Manager";s:11:"description";s:72:"Enables the automated installation of modules and themes from drupal.org";s:4:"core";s:3:"6.x";s:3:"php";s:1:"5";s:7:"package";s:14:"Administration";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:7:"version";N;}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/schema/schema.module',
+  'name' => 'schema',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:6:"Schema";s:11:"description";s:65:"The Schema module provides functionality built on the Schema API.";s:7:"package";s:8:"Database";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/views/views.module',
+  'name' => 'views',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:5:"Views";s:11:"description";s:55:"Create customized lists and queries from your database.";s:7:"package";s:5:"Views";s:4:"core";s:3:"6.x";s:12:"dependencies";a:0:{}s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/views/views_export/views_export.module',
+  'name' => 'views_export',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:14:"Views exporter";s:11:"description";s:40:"Allows exporting multiple views at once.";s:7:"package";s:5:"Views";s:12:"dependencies";a:1:{i:0;s:5:"views";}s:4:"core";s:3:"6.x";s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'sites/all/modules/views/views_ui.module',
+  'name' => 'views_ui',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:8:{s:4:"name";s:8:"Views UI";s:11:"description";s:93:"Administrative interface to views. Without this module, you cannot create or edit your views.";s:7:"package";s:5:"Views";s:4:"core";s:3:"6.x";s:12:"dependencies";a:1:{i:0;s:5:"views";}s:10:"dependents";a:0:{}s:7:"version";N;s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'themes/bluemarine/bluemarine.info',
+  'name' => 'bluemarine',
+  'type' => 'theme',
+  'owner' => 'themes/engines/phptemplate/phptemplate.engine',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:11:{s:4:"name";s:10:"Bluemarine";s:11:"description";s:66:"Table-based multi-column theme with a marine and ash color scheme.";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/bluemarine/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:27:"themes/bluemarine/script.js";}s:10:"screenshot";s:32:"themes/bluemarine/screenshot.png";s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'themes/chameleon/chameleon.info',
+  'name' => 'chameleon',
+  'type' => 'theme',
+  'owner' => 'themes/chameleon/chameleon.theme',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:10:{s:4:"name";s:9:"Chameleon";s:11:"description";s:42:"Minimalist tabled theme with light colors.";s:7:"regions";a:2:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";}s:8:"features";a:4:{i:0;s:4:"logo";i:1;s:7:"favicon";i:2;s:4:"name";i:3;s:6:"slogan";}s:11:"stylesheets";a:1:{s:3:"all";a:2:{s:9:"style.css";s:26:"themes/chameleon/style.css";s:10:"common.css";s:27:"themes/chameleon/common.css";}}s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:7:"scripts";a:1:{s:9:"script.js";s:26:"themes/chameleon/script.js";}s:10:"screenshot";s:31:"themes/chameleon/screenshot.png";s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'themes/chameleon/marvin/marvin.info',
+  'name' => 'marvin',
+  'type' => 'theme',
+  'owner' => '',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:11:{s:4:"name";s:6:"Marvin";s:11:"description";s:31:"Boxy tabled theme in all grays.";s:7:"regions";a:2:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";}s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:10:"base theme";s:9:"chameleon";s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:33:"themes/chameleon/marvin/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:33:"themes/chameleon/marvin/script.js";}s:10:"screenshot";s:38:"themes/chameleon/marvin/screenshot.png";s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'themes/garland/garland.info',
+  'name' => 'garland',
+  'type' => 'theme',
+  'owner' => 'themes/engines/phptemplate/phptemplate.engine',
+  'status' => '1',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:11:{s:4:"name";s:7:"Garland";s:11:"description";s:66:"Tableless, recolorable, multi-column, fluid width theme (default).";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:11:"stylesheets";a:2:{s:3:"all";a:1:{s:9:"style.css";s:24:"themes/garland/style.css";}s:5:"print";a:1:{s:9:"print.css";s:24:"themes/garland/print.css";}}s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:7:"scripts";a:1:{s:9:"script.js";s:24:"themes/garland/script.js";}s:10:"screenshot";s:29:"themes/garland/screenshot.png";s:3:"php";s:5:"4.3.5";}',
+))
+->values(array(
+  'filename' => 'themes/garland/minnelli/minnelli.info',
+  'name' => 'minnelli',
+  'type' => 'theme',
+  'owner' => 'themes/engines/phptemplate/phptemplate.engine',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:12:{s:4:"name";s:8:"Minnelli";s:11:"description";s:56:"Tableless, recolorable, multi-column, fixed width theme.";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:10:"base theme";s:7:"garland";s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:12:"minnelli.css";s:36:"themes/garland/minnelli/minnelli.css";}}s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:7:"scripts";a:1:{s:9:"script.js";s:33:"themes/garland/minnelli/script.js";}s:10:"screenshot";s:38:"themes/garland/minnelli/screenshot.png";s:3:"php";s:5:"4.3.5";s:6:"engine";s:11:"phptemplate";}',
+))
+->values(array(
+  'filename' => 'themes/pushbutton/pushbutton.info',
+  'name' => 'pushbutton',
+  'type' => 'theme',
+  'owner' => 'themes/engines/phptemplate/phptemplate.engine',
+  'status' => '0',
+  'throttle' => '0',
+  'bootstrap' => '0',
+  'schema_version' => '-1',
+  'weight' => '0',
+  'info' => 'a:11:{s:4:"name";s:10:"Pushbutton";s:11:"description";s:52:"Tabled, multi-column theme in blue and orange tones.";s:7:"version";s:8:"6.20-dev";s:4:"core";s:3:"6.x";s:6:"engine";s:11:"phptemplate";s:7:"regions";a:5:{s:4:"left";s:12:"Left sidebar";s:5:"right";s:13:"Right sidebar";s:7:"content";s:7:"Content";s:6:"header";s:6:"Header";s:6:"footer";s:6:"Footer";}s:8:"features";a:10:{i:0;s:20:"comment_user_picture";i:1;s:7:"favicon";i:2;s:7:"mission";i:3;s:4:"logo";i:4;s:4:"name";i:5;s:17:"node_user_picture";i:6;s:6:"search";i:7;s:6:"slogan";i:8;s:13:"primary_links";i:9;s:15:"secondary_links";}s:11:"stylesheets";a:1:{s:3:"all";a:1:{s:9:"style.css";s:27:"themes/pushbutton/style.css";}}s:7:"scripts";a:1:{s:9:"script.js";s:27:"themes/pushbutton/script.js";}s:10:"screenshot";s:32:"themes/pushbutton/screenshot.png";s:3:"php";s:5:"4.3.5";}',
+))
+->execute();
+
+db_create_table('term_data', array(
+  'fields' => array(
+    'tid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'vid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'description' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+  ),
+  'primary key' => array(
+    'tid',
+  ),
+  'indexes' => array(
+    'taxonomy_tree' => array(
+      'vid',
+      'weight',
+      'name',
+    ),
+    'vid_name' => array(
+      'vid',
+      'name',
+    ),
+  ),
+  'module' => 'taxonomy',
+  'name' => 'term_data',
+));
+db_insert('term_data')->fields(array(
+  'tid',
+  'vid',
+  'name',
+  'description',
+  'weight',
+))
+->values(array(
+  'tid' => '1',
+  'vid' => '1',
+  'name' => 'term 1 of vocabulary 1 (j=0)',
+  'description' => 'description of term 1 of vocabulary 1 (j=0)',
+  'weight' => '0',
+))
+->values(array(
+  'tid' => '2',
+  'vid' => '2',
+  'name' => 'term 2 of vocabulary 2 (j=0)',
+  'description' => 'description of term 2 of vocabulary 2 (j=0)',
+  'weight' => '3',
+))
+->values(array(
+  'tid' => '3',
+  'vid' => '2',
+  'name' => 'term 3 of vocabulary 2 (j=1)',
+  'description' => 'description of term 3 of vocabulary 2 (j=1)',
+  'weight' => '4',
+))
+->values(array(
+  'tid' => '4',
+  'vid' => '3',
+  'name' => 'term 4 of vocabulary 3 (j=0)',
+  'description' => 'description of term 4 of vocabulary 3 (j=0)',
+  'weight' => '6',
+))
+->values(array(
+  'tid' => '5',
+  'vid' => '3',
+  'name' => 'term 5 of vocabulary 3 (j=1)',
+  'description' => 'description of term 5 of vocabulary 3 (j=1)',
+  'weight' => '7',
+))
+->values(array(
+  'tid' => '6',
+  'vid' => '3',
+  'name' => 'term 6 of vocabulary 3 (j=2)',
+  'description' => 'description of term 6 of vocabulary 3 (j=2)',
+  'weight' => '8',
+))
+->values(array(
+  'tid' => '7',
+  'vid' => '4',
+  'name' => 'term 7 of vocabulary 4 (j=0)',
+  'description' => 'description of term 7 of vocabulary 4 (j=0)',
+  'weight' => '9',
+))
+->values(array(
+  'tid' => '8',
+  'vid' => '5',
+  'name' => 'term 8 of vocabulary 5 (j=0)',
+  'description' => 'description of term 8 of vocabulary 5 (j=0)',
+  'weight' => '12',
+))
+->values(array(
+  'tid' => '9',
+  'vid' => '5',
+  'name' => 'term 9 of vocabulary 5 (j=1)',
+  'description' => 'description of term 9 of vocabulary 5 (j=1)',
+  'weight' => '13',
+))
+->values(array(
+  'tid' => '10',
+  'vid' => '6',
+  'name' => 'term 10 of vocabulary 6 (j=0)',
+  'description' => 'description of term 10 of vocabulary 6 (j=0)',
+  'weight' => '15',
+))
+->values(array(
+  'tid' => '11',
+  'vid' => '6',
+  'name' => 'term 11 of vocabulary 6 (j=1)',
+  'description' => 'description of term 11 of vocabulary 6 (j=1)',
+  'weight' => '16',
+))
+->values(array(
+  'tid' => '12',
+  'vid' => '6',
+  'name' => 'term 12 of vocabulary 6 (j=2)',
+  'description' => 'description of term 12 of vocabulary 6 (j=2)',
+  'weight' => '17',
+))
+->values(array(
+  'tid' => '13',
+  'vid' => '7',
+  'name' => 'term 13 of vocabulary 7 (j=0)',
+  'description' => 'description of term 13 of vocabulary 7 (j=0)',
+  'weight' => '18',
+))
+->values(array(
+  'tid' => '14',
+  'vid' => '8',
+  'name' => 'term 14 of vocabulary 8 (j=0)',
+  'description' => 'description of term 14 of vocabulary 8 (j=0)',
+  'weight' => '21',
+))
+->values(array(
+  'tid' => '15',
+  'vid' => '8',
+  'name' => 'term 15 of vocabulary 8 (j=1)',
+  'description' => 'description of term 15 of vocabulary 8 (j=1)',
+  'weight' => '22',
+))
+->values(array(
+  'tid' => '16',
+  'vid' => '9',
+  'name' => 'term 16 of vocabulary 9 (j=0)',
+  'description' => 'description of term 16 of vocabulary 9 (j=0)',
+  'weight' => '24',
+))
+->values(array(
+  'tid' => '17',
+  'vid' => '9',
+  'name' => 'term 17 of vocabulary 9 (j=1)',
+  'description' => 'description of term 17 of vocabulary 9 (j=1)',
+  'weight' => '25',
+))
+->values(array(
+  'tid' => '18',
+  'vid' => '9',
+  'name' => 'term 18 of vocabulary 9 (j=2)',
+  'description' => 'description of term 18 of vocabulary 9 (j=2)',
+  'weight' => '26',
+))
+->values(array(
+  'tid' => '19',
+  'vid' => '10',
+  'name' => 'term 19 of vocabulary 10 (j=0)',
+  'description' => 'description of term 19 of vocabulary 10 (j=0)',
+  'weight' => '27',
+))
+->values(array(
+  'tid' => '20',
+  'vid' => '11',
+  'name' => 'term 20 of vocabulary 11 (j=0)',
+  'description' => 'description of term 20 of vocabulary 11 (j=0)',
+  'weight' => '30',
+))
+->values(array(
+  'tid' => '21',
+  'vid' => '11',
+  'name' => 'term 21 of vocabulary 11 (j=1)',
+  'description' => 'description of term 21 of vocabulary 11 (j=1)',
+  'weight' => '31',
+))
+->values(array(
+  'tid' => '22',
+  'vid' => '12',
+  'name' => 'term 22 of vocabulary 12 (j=0)',
+  'description' => 'description of term 22 of vocabulary 12 (j=0)',
+  'weight' => '33',
+))
+->values(array(
+  'tid' => '23',
+  'vid' => '12',
+  'name' => 'term 23 of vocabulary 12 (j=1)',
+  'description' => 'description of term 23 of vocabulary 12 (j=1)',
+  'weight' => '34',
+))
+->values(array(
+  'tid' => '24',
+  'vid' => '12',
+  'name' => 'term 24 of vocabulary 12 (j=2)',
+  'description' => 'description of term 24 of vocabulary 12 (j=2)',
+  'weight' => '35',
+))
+->values(array(
+  'tid' => '25',
+  'vid' => '13',
+  'name' => 'term 25 of vocabulary 13 (j=0)',
+  'description' => 'description of term 25 of vocabulary 13 (j=0)',
+  'weight' => '36',
+))
+->values(array(
+  'tid' => '26',
+  'vid' => '14',
+  'name' => 'term 26 of vocabulary 14 (j=0)',
+  'description' => 'description of term 26 of vocabulary 14 (j=0)',
+  'weight' => '39',
+))
+->values(array(
+  'tid' => '27',
+  'vid' => '14',
+  'name' => 'term 27 of vocabulary 14 (j=1)',
+  'description' => 'description of term 27 of vocabulary 14 (j=1)',
+  'weight' => '40',
+))
+->values(array(
+  'tid' => '28',
+  'vid' => '15',
+  'name' => 'term 28 of vocabulary 15 (j=0)',
+  'description' => 'description of term 28 of vocabulary 15 (j=0)',
+  'weight' => '42',
+))
+->values(array(
+  'tid' => '29',
+  'vid' => '15',
+  'name' => 'term 29 of vocabulary 15 (j=1)',
+  'description' => 'description of term 29 of vocabulary 15 (j=1)',
+  'weight' => '43',
+))
+->values(array(
+  'tid' => '30',
+  'vid' => '15',
+  'name' => 'term 30 of vocabulary 15 (j=2)',
+  'description' => 'description of term 30 of vocabulary 15 (j=2)',
+  'weight' => '44',
+))
+->values(array(
+  'tid' => '31',
+  'vid' => '16',
+  'name' => 'term 31 of vocabulary 16 (j=0)',
+  'description' => 'description of term 31 of vocabulary 16 (j=0)',
+  'weight' => '45',
+))
+->values(array(
+  'tid' => '32',
+  'vid' => '17',
+  'name' => 'term 32 of vocabulary 17 (j=0)',
+  'description' => 'description of term 32 of vocabulary 17 (j=0)',
+  'weight' => '48',
+))
+->values(array(
+  'tid' => '33',
+  'vid' => '17',
+  'name' => 'term 33 of vocabulary 17 (j=1)',
+  'description' => 'description of term 33 of vocabulary 17 (j=1)',
+  'weight' => '49',
+))
+->values(array(
+  'tid' => '34',
+  'vid' => '18',
+  'name' => 'term 34 of vocabulary 18 (j=0)',
+  'description' => 'description of term 34 of vocabulary 18 (j=0)',
+  'weight' => '51',
+))
+->values(array(
+  'tid' => '35',
+  'vid' => '18',
+  'name' => 'term 35 of vocabulary 18 (j=1)',
+  'description' => 'description of term 35 of vocabulary 18 (j=1)',
+  'weight' => '52',
+))
+->values(array(
+  'tid' => '36',
+  'vid' => '18',
+  'name' => 'term 36 of vocabulary 18 (j=2)',
+  'description' => 'description of term 36 of vocabulary 18 (j=2)',
+  'weight' => '53',
+))
+->values(array(
+  'tid' => '37',
+  'vid' => '19',
+  'name' => 'term 37 of vocabulary 19 (j=0)',
+  'description' => 'description of term 37 of vocabulary 19 (j=0)',
+  'weight' => '54',
+))
+->values(array(
+  'tid' => '38',
+  'vid' => '20',
+  'name' => 'term 38 of vocabulary 20 (j=0)',
+  'description' => 'description of term 38 of vocabulary 20 (j=0)',
+  'weight' => '57',
+))
+->values(array(
+  'tid' => '39',
+  'vid' => '20',
+  'name' => 'term 39 of vocabulary 20 (j=1)',
+  'description' => 'description of term 39 of vocabulary 20 (j=1)',
+  'weight' => '58',
+))
+->values(array(
+  'tid' => '40',
+  'vid' => '21',
+  'name' => 'term 40 of vocabulary 21 (j=0)',
+  'description' => 'description of term 40 of vocabulary 21 (j=0)',
+  'weight' => '60',
+))
+->values(array(
+  'tid' => '41',
+  'vid' => '21',
+  'name' => 'term 41 of vocabulary 21 (j=1)',
+  'description' => 'description of term 41 of vocabulary 21 (j=1)',
+  'weight' => '61',
+))
+->values(array(
+  'tid' => '42',
+  'vid' => '21',
+  'name' => 'term 42 of vocabulary 21 (j=2)',
+  'description' => 'description of term 42 of vocabulary 21 (j=2)',
+  'weight' => '62',
+))
+->values(array(
+  'tid' => '43',
+  'vid' => '22',
+  'name' => 'term 43 of vocabulary 22 (j=0)',
+  'description' => 'description of term 43 of vocabulary 22 (j=0)',
+  'weight' => '63',
+))
+->values(array(
+  'tid' => '44',
+  'vid' => '23',
+  'name' => 'term 44 of vocabulary 23 (j=0)',
+  'description' => 'description of term 44 of vocabulary 23 (j=0)',
+  'weight' => '66',
+))
+->values(array(
+  'tid' => '45',
+  'vid' => '23',
+  'name' => 'term 45 of vocabulary 23 (j=1)',
+  'description' => 'description of term 45 of vocabulary 23 (j=1)',
+  'weight' => '67',
+))
+->values(array(
+  'tid' => '46',
+  'vid' => '24',
+  'name' => 'term 46 of vocabulary 24 (j=0)',
+  'description' => 'description of term 46 of vocabulary 24 (j=0)',
+  'weight' => '69',
+))
+->values(array(
+  'tid' => '47',
+  'vid' => '24',
+  'name' => 'term 47 of vocabulary 24 (j=1)',
+  'description' => 'description of term 47 of vocabulary 24 (j=1)',
+  'weight' => '70',
+))
+->values(array(
+  'tid' => '48',
+  'vid' => '24',
+  'name' => 'term 48 of vocabulary 24 (j=2)',
+  'description' => 'description of term 48 of vocabulary 24 (j=2)',
+  'weight' => '71',
+))
+->execute();
+
+db_create_table('term_hierarchy', array(
+  'fields' => array(
+    'tid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'parent' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'parent' => array(
+      'parent',
+    ),
+  ),
+  'primary key' => array(
+    'tid',
+    'parent',
+  ),
+  'module' => 'taxonomy',
+  'name' => 'term_hierarchy',
+));
+db_insert('term_hierarchy')->fields(array(
+  'tid',
+  'parent',
+))
+->values(array(
+  'tid' => '1',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '2',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '4',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '7',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '8',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '10',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '13',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '14',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '16',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '19',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '20',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '22',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '25',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '26',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '28',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '31',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '32',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '34',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '37',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '38',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '40',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '43',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '44',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '46',
+  'parent' => '0',
+))
+->values(array(
+  'tid' => '3',
+  'parent' => '2',
+))
+->values(array(
+  'tid' => '5',
+  'parent' => '4',
+))
+->values(array(
+  'tid' => '6',
+  'parent' => '4',
+))
+->values(array(
+  'tid' => '6',
+  'parent' => '5',
+))
+->values(array(
+  'tid' => '9',
+  'parent' => '8',
+))
+->values(array(
+  'tid' => '11',
+  'parent' => '10',
+))
+->values(array(
+  'tid' => '12',
+  'parent' => '10',
+))
+->values(array(
+  'tid' => '12',
+  'parent' => '11',
+))
+->values(array(
+  'tid' => '15',
+  'parent' => '14',
+))
+->values(array(
+  'tid' => '17',
+  'parent' => '16',
+))
+->values(array(
+  'tid' => '18',
+  'parent' => '16',
+))
+->values(array(
+  'tid' => '18',
+  'parent' => '17',
+))
+->values(array(
+  'tid' => '21',
+  'parent' => '20',
+))
+->values(array(
+  'tid' => '23',
+  'parent' => '22',
+))
+->values(array(
+  'tid' => '24',
+  'parent' => '22',
+))
+->values(array(
+  'tid' => '24',
+  'parent' => '23',
+))
+->values(array(
+  'tid' => '27',
+  'parent' => '26',
+))
+->values(array(
+  'tid' => '29',
+  'parent' => '28',
+))
+->values(array(
+  'tid' => '30',
+  'parent' => '28',
+))
+->values(array(
+  'tid' => '30',
+  'parent' => '29',
+))
+->values(array(
+  'tid' => '33',
+  'parent' => '32',
+))
+->values(array(
+  'tid' => '35',
+  'parent' => '34',
+))
+->values(array(
+  'tid' => '36',
+  'parent' => '34',
+))
+->values(array(
+  'tid' => '36',
+  'parent' => '35',
+))
+->values(array(
+  'tid' => '39',
+  'parent' => '38',
+))
+->values(array(
+  'tid' => '41',
+  'parent' => '40',
+))
+->values(array(
+  'tid' => '42',
+  'parent' => '40',
+))
+->values(array(
+  'tid' => '42',
+  'parent' => '41',
+))
+->values(array(
+  'tid' => '45',
+  'parent' => '44',
+))
+->values(array(
+  'tid' => '47',
+  'parent' => '46',
+))
+->values(array(
+  'tid' => '48',
+  'parent' => '46',
+))
+->values(array(
+  'tid' => '48',
+  'parent' => '47',
+))
+->execute();
+
+db_create_table('term_node', array(
+  'fields' => array(
+    'nid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'vid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'tid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'vid' => array(
+      'vid',
+    ),
+    'nid' => array(
+      'nid',
+    ),
+  ),
+  'primary key' => array(
+    'tid',
+    'vid',
+  ),
+  'module' => 'taxonomy',
+  'name' => 'term_node',
+));
+db_insert('term_node')->fields(array(
+  'nid',
+  'vid',
+  'tid',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '1',
+  'tid' => '0',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '1',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '2',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '1',
+  'vid' => '1',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '3',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '3',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '2',
+  'vid' => '4',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '5',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '5',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '3',
+  'vid' => '6',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '7',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '7',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '4',
+  'vid' => '8',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '9',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '9',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '5',
+  'vid' => '10',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '11',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '11',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '6',
+  'vid' => '12',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '13',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '13',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '7',
+  'vid' => '14',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '15',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '15',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '8',
+  'vid' => '16',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '17',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '17',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '9',
+  'vid' => '18',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '19',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '19',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '10',
+  'vid' => '20',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '21',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '21',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '11',
+  'vid' => '22',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '23',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '23',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '12',
+  'vid' => '24',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '13',
+  'vid' => '25',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '14',
+  'vid' => '26',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '15',
+  'vid' => '27',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '16',
+  'vid' => '28',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '17',
+  'vid' => '29',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '18',
+  'vid' => '30',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '19',
+  'vid' => '31',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '20',
+  'vid' => '32',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '21',
+  'vid' => '33',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '22',
+  'vid' => '34',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '24',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '25',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '23',
+  'vid' => '35',
+  'tid' => '48',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '1',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '2',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '3',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '4',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '5',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '6',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '7',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '8',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '9',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '10',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '11',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '12',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '13',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '14',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '15',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '16',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '17',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '18',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '19',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '20',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '21',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '22',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '23',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '26',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '27',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '28',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '29',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '30',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '31',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '32',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '33',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '34',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '35',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '36',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '37',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '38',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '39',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '40',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '41',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '42',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '43',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '44',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '45',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '46',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '47',
+))
+->values(array(
+  'nid' => '24',
+  'vid' => '36',
+  'tid' => '48',
+))
+->execute();
+
+db_create_table('term_relation', array(
+  'fields' => array(
+    'trid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'tid1' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'tid2' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'unique keys' => array(
+    'tid1_tid2' => array(
+      'tid1',
+      'tid2',
+    ),
+  ),
+  'indexes' => array(
+    'tid2' => array(
+      'tid2',
+    ),
+  ),
+  'primary key' => array(
+    'trid',
+  ),
+  'module' => 'taxonomy',
+  'name' => 'term_relation',
+));
+
+db_create_table('term_synonym', array(
+  'fields' => array(
+    'tsid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'tid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+  ),
+  'indexes' => array(
+    'tid' => array(
+      'tid',
+    ),
+    'name_tid' => array(
+      'name',
+      'tid',
+    ),
+  ),
+  'primary key' => array(
+    'tsid',
+  ),
+  'module' => 'taxonomy',
+  'name' => 'term_synonym',
+));
+
+db_create_table('url_alias', array(
+  'fields' => array(
+    'pid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'src' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'dst' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'language' => array(
+      'type' => 'varchar',
+      'length' => 12,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+  ),
+  'unique keys' => array(
+    'dst_language_pid' => array(
+      'dst',
+      'language',
+      'pid',
+    ),
+  ),
+  'primary key' => array(
+    'pid',
+  ),
+  'indexes' => array(
+    'src_language_pid' => array(
+      'src',
+      'language',
+      'pid',
+    ),
+  ),
+  'module' => 'system',
+  'name' => 'url_alias',
+));
+db_insert('url_alias')->fields(array(
+  'pid',
+  'src',
+  'dst',
+  'language',
+))
+->values(array(
+  'pid' => '1',
+  'src' => 'node/1',
+  'dst' => 'content/1262732400',
+  'language' => '',
+))
+->values(array(
+  'pid' => '2',
+  'src' => 'node/2',
+  'dst' => 'content/1262818800',
+  'language' => '',
+))
+->values(array(
+  'pid' => '3',
+  'src' => 'node/3',
+  'dst' => 'content/1262905200',
+  'language' => '',
+))
+->values(array(
+  'pid' => '4',
+  'src' => 'node/4',
+  'dst' => 'content/1262991600',
+  'language' => '',
+))
+->values(array(
+  'pid' => '5',
+  'src' => 'node/5',
+  'dst' => 'content/1263078000',
+  'language' => '',
+))
+->values(array(
+  'pid' => '6',
+  'src' => 'node/6',
+  'dst' => 'content/1263164400',
+  'language' => '',
+))
+->values(array(
+  'pid' => '7',
+  'src' => 'node/7',
+  'dst' => 'content/1263250800',
+  'language' => '',
+))
+->values(array(
+  'pid' => '8',
+  'src' => 'node/8',
+  'dst' => 'content/1263337200',
+  'language' => '',
+))
+->values(array(
+  'pid' => '9',
+  'src' => 'node/9',
+  'dst' => 'content/1263423600',
+  'language' => '',
+))
+->values(array(
+  'pid' => '10',
+  'src' => 'node/10',
+  'dst' => 'content/1263510000',
+  'language' => '',
+))
+->values(array(
+  'pid' => '11',
+  'src' => 'node/11',
+  'dst' => 'content/1263596400',
+  'language' => '',
+))
+->values(array(
+  'pid' => '12',
+  'src' => 'node/12',
+  'dst' => 'content/1263682800',
+  'language' => '',
+))
+->values(array(
+  'pid' => '13',
+  'src' => 'node/13',
+  'dst' => 'content/1263769200',
+  'language' => '',
+))
+->values(array(
+  'pid' => '14',
+  'src' => 'node/14',
+  'dst' => 'content/1263855600',
+  'language' => '',
+))
+->values(array(
+  'pid' => '15',
+  'src' => 'node/15',
+  'dst' => 'content/1263942000',
+  'language' => '',
+))
+->values(array(
+  'pid' => '16',
+  'src' => 'node/16',
+  'dst' => 'content/1264028400',
+  'language' => '',
+))
+->values(array(
+  'pid' => '17',
+  'src' => 'node/17',
+  'dst' => 'content/1264114800',
+  'language' => '',
+))
+->values(array(
+  'pid' => '18',
+  'src' => 'node/18',
+  'dst' => 'content/1264201200',
+  'language' => '',
+))
+->values(array(
+  'pid' => '19',
+  'src' => 'node/19',
+  'dst' => 'content/1264287600',
+  'language' => '',
+))
+->values(array(
+  'pid' => '20',
+  'src' => 'node/20',
+  'dst' => 'content/1264374000',
+  'language' => '',
+))
+->values(array(
+  'pid' => '21',
+  'src' => 'node/21',
+  'dst' => 'content/1264460400',
+  'language' => '',
+))
+->values(array(
+  'pid' => '22',
+  'src' => 'node/22',
+  'dst' => 'content/1264546800',
+  'language' => '',
+))
+->values(array(
+  'pid' => '23',
+  'src' => 'node/23',
+  'dst' => 'content/1264633200',
+  'language' => '',
+))
+->values(array(
+  'pid' => '24',
+  'src' => 'node/24',
+  'dst' => 'content/1264719600',
+  'language' => '',
+))
+->values(array(
+  'pid' => '25',
+  'src' => 'node/25',
+  'dst' => 'content/poll/0',
+  'language' => '',
+))
+->values(array(
+  'pid' => '26',
+  'src' => 'node/25/results',
+  'dst' => 'content/poll/0/results',
+  'language' => '',
+))
+->values(array(
+  'pid' => '27',
+  'src' => 'node/26',
+  'dst' => 'content/poll/1',
+  'language' => '',
+))
+->values(array(
+  'pid' => '28',
+  'src' => 'node/26/results',
+  'dst' => 'content/poll/1/results',
+  'language' => '',
+))
+->values(array(
+  'pid' => '29',
+  'src' => 'node/27',
+  'dst' => 'content/poll/2',
+  'language' => '',
+))
+->values(array(
+  'pid' => '30',
+  'src' => 'node/27/results',
+  'dst' => 'content/poll/2/results',
+  'language' => '',
+))
+->values(array(
+  'pid' => '31',
+  'src' => 'node/28',
+  'dst' => 'content/poll/3',
+  'language' => '',
+))
+->values(array(
+  'pid' => '32',
+  'src' => 'node/28/results',
+  'dst' => 'content/poll/3/results',
+  'language' => '',
+))
+->values(array(
+  'pid' => '33',
+  'src' => 'node/29',
+  'dst' => 'content/poll/4',
+  'language' => '',
+))
+->values(array(
+  'pid' => '34',
+  'src' => 'node/29/results',
+  'dst' => 'content/poll/4/results',
+  'language' => '',
+))
+->values(array(
+  'pid' => '35',
+  'src' => 'node/30',
+  'dst' => 'content/poll/5',
+  'language' => '',
+))
+->values(array(
+  'pid' => '36',
+  'src' => 'node/30/results',
+  'dst' => 'content/poll/5/results',
+  'language' => '',
+))
+->values(array(
+  'pid' => '37',
+  'src' => 'node/31',
+  'dst' => 'content/poll/6',
+  'language' => '',
+))
+->values(array(
+  'pid' => '38',
+  'src' => 'node/31/results',
+  'dst' => 'content/poll/6/results',
+  'language' => '',
+))
+->values(array(
+  'pid' => '39',
+  'src' => 'node/32',
+  'dst' => 'content/poll/7',
+  'language' => '',
+))
+->values(array(
+  'pid' => '40',
+  'src' => 'node/32/results',
+  'dst' => 'content/poll/7/results',
+  'language' => '',
+))
+->values(array(
+  'pid' => '41',
+  'src' => 'node/33',
+  'dst' => 'content/poll/8',
+  'language' => '',
+))
+->values(array(
+  'pid' => '42',
+  'src' => 'node/33/results',
+  'dst' => 'content/poll/8/results',
+  'language' => '',
+))
+->values(array(
+  'pid' => '43',
+  'src' => 'node/34',
+  'dst' => 'content/poll/9',
+  'language' => '',
+))
+->values(array(
+  'pid' => '44',
+  'src' => 'node/34/results',
+  'dst' => 'content/poll/9/results',
+  'language' => '',
+))
+->values(array(
+  'pid' => '45',
+  'src' => 'node/35',
+  'dst' => 'content/poll/10',
+  'language' => '',
+))
+->values(array(
+  'pid' => '46',
+  'src' => 'node/35/results',
+  'dst' => 'content/poll/10/results',
+  'language' => '',
+))
+->values(array(
+  'pid' => '47',
+  'src' => 'node/36',
+  'dst' => 'content/poll/11',
+  'language' => '',
+))
+->values(array(
+  'pid' => '48',
+  'src' => 'node/36/results',
+  'dst' => 'content/poll/11/results',
+  'language' => '',
+))
+->values(array(
+  'pid' => '49',
+  'src' => 'node/37',
+  'dst' => 'content/1263769200',
+  'language' => '',
+))
+->execute();
+
+db_create_table('users', array(
+  'fields' => array(
+    'uid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 60,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'pass' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'mail' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => FALSE,
+      'default' => '',
+    ),
+    'mode' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'sort' => array(
+      'type' => 'int',
+      'not null' => FALSE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'threshold' => array(
+      'type' => 'int',
+      'not null' => FALSE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'theme' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'signature' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'signature_format' => array(
+      'type' => 'int',
+      'size' => 'small',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'created' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'access' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'login' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'timezone' => array(
+      'type' => 'varchar',
+      'length' => 8,
+      'not null' => FALSE,
+    ),
+    'language' => array(
+      'type' => 'varchar',
+      'length' => 12,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'picture' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'init' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => FALSE,
+      'default' => '',
+    ),
+    'data' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+  ),
+  'indexes' => array(
+    'access' => array(
+      'access',
+    ),
+    'created' => array(
+      'created',
+    ),
+    'mail' => array(
+      'mail',
+    ),
+  ),
+  'unique keys' => array(
+    'name' => array(
+      'name',
+    ),
+  ),
+  'primary key' => array(
+    'uid',
+  ),
+  'module' => 'user',
+  'name' => 'users',
+));
+db_insert('users')->fields(array(
+  'uid',
+  'name',
+  'pass',
+  'mail',
+  'mode',
+  'sort',
+  'threshold',
+  'theme',
+  'signature',
+  'signature_format',
+  'created',
+  'access',
+  'login',
+  'status',
+  'timezone',
+  'language',
+  'picture',
+  'init',
+  'data',
+))
+->values(array(
+  'uid' => 1,
+  'name' => '',
+  'pass' => '',
+  'mail' => '',
+  'mode' => '0',
+  'sort' => '0',
+  'threshold' => '0',
+  'theme' => '',
+  'signature' => '',
+  'signature_format' => '0',
+  'created' => '0',
+  'access' => '0',
+  'login' => '0',
+  'status' => '0',
+  'timezone' => NULL,
+  'language' => '',
+  'picture' => '',
+  'init' => '',
+  'data' => NULL,
+))
+->values(array(
+  'uid' => 2,
+  'name' => 'admin',
+  'pass' => '21232f297a57a5a743894a0e4a801fc3',
+  'mail' => 'admin@aexample.com',
+  'mode' => '0',
+  'sort' => '0',
+  'threshold' => '0',
+  'theme' => '',
+  'signature' => '',
+  'signature_format' => '0',
+  'created' => '1282936261',
+  'access' => '1282936264',
+  'login' => '1282936263',
+  'status' => '1',
+  'timezone' => NULL,
+  'language' => '',
+  'picture' => '',
+  'init' => 'admin@aexample.com',
+  'data' => 'a:0:{}',
+))
+->values(array(
+  'uid' => 4,
+  'name' => 'test user 0',
+  'pass' => '4dd188028f74622e61048f6683208c2f',
+  'mail' => 'test0@example.com',
+  'mode' => '0',
+  'sort' => '0',
+  'threshold' => '0',
+  'theme' => '',
+  'signature' => '',
+  'signature_format' => '0',
+  'created' => '1262300400',
+  'access' => '1262300400',
+  'login' => '0',
+  'status' => '1',
+  'timezone' => NULL,
+  'language' => '',
+  'picture' => '',
+  'init' => '',
+  'data' => NULL,
+))
+->values(array(
+  'uid' => 5,
+  'name' => 'test user 1',
+  'pass' => '388ee5249286bf5eed0dae9205743969',
+  'mail' => 'test1@example.com',
+  'mode' => '0',
+  'sort' => '0',
+  'threshold' => '0',
+  'theme' => '',
+  'signature' => '',
+  'signature_format' => '0',
+  'created' => '1262386800',
+  'access' => '1262386800',
+  'login' => '0',
+  'status' => '1',
+  'timezone' => NULL,
+  'language' => '',
+  'picture' => '',
+  'init' => '',
+  'data' => NULL,
+))
+->values(array(
+  'uid' => 6,
+  'name' => 'test user 2',
+  'pass' => 'ff8a825362e1e06dca5c13c60fe407c9',
+  'mail' => 'test2@example.com',
+  'mode' => '0',
+  'sort' => '0',
+  'threshold' => '0',
+  'theme' => '',
+  'signature' => '',
+  'signature_format' => '0',
+  'created' => '1262473200',
+  'access' => '1262473200',
+  'login' => '0',
+  'status' => '1',
+  'timezone' => NULL,
+  'language' => '',
+  'picture' => '',
+  'init' => '',
+  'data' => NULL,
+))
+->values(array(
+  'uid' => 7,
+  'name' => 'test user 3',
+  'pass' => '9d4bd7b0570cb513dc7c6ea8de15003a',
+  'mail' => 'test3@example.com',
+  'mode' => '0',
+  'sort' => '0',
+  'threshold' => '0',
+  'theme' => '',
+  'signature' => '',
+  'signature_format' => '0',
+  'created' => '1262559600',
+  'access' => '1262559600',
+  'login' => '0',
+  'status' => '1',
+  'timezone' => NULL,
+  'language' => '',
+  'picture' => '',
+  'init' => '',
+  'data' => NULL,
+))
+->values(array(
+  'uid' => 8,
+  'name' => 'test user 4',
+  'pass' => '7903c9dd9d71bcd70e3a18141711cb42',
+  'mail' => 'test4@example.com',
+  'mode' => '0',
+  'sort' => '0',
+  'threshold' => '0',
+  'theme' => '',
+  'signature' => '',
+  'signature_format' => '0',
+  'created' => '1262646000',
+  'access' => '1262646000',
+  'login' => '0',
+  'status' => '1',
+  'timezone' => NULL,
+  'language' => '',
+  'picture' => '',
+  'init' => '',
+  'data' => NULL,
+))
+->values(array(
+  'uid' => 9,
+  'name' => 'test user 5',
+  'pass' => '8eb7221204ea80db4e66247b4c748071',
+  'mail' => 'test5@example.com',
+  'mode' => '0',
+  'sort' => '0',
+  'threshold' => '0',
+  'theme' => '',
+  'signature' => '',
+  'signature_format' => '0',
+  'created' => '1262732400',
+  'access' => '1262732400',
+  'login' => '0',
+  'status' => '1',
+  'timezone' => NULL,
+  'language' => '',
+  'picture' => '',
+  'init' => '',
+  'data' => NULL,
+))
+->execute();
+db_query('UPDATE {users} SET uid = uid - 1');
+
+db_create_table('users_roles', array(
+  'fields' => array(
+    'uid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'rid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'uid',
+    'rid',
+  ),
+  'indexes' => array(
+    'rid' => array(
+      'rid',
+    ),
+  ),
+  'module' => 'user',
+  'name' => 'users_roles',
+));
+
+db_create_table('variable', array(
+  'fields' => array(
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'value' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+  ),
+  'primary key' => array(
+    'name',
+  ),
+  'module' => 'system',
+  'name' => 'variable',
+));
+db_insert('variable')->fields(array(
+  'name',
+  'value',
+))
+->values(array(
+  'name' => 'clean_url',
+  'value' => 's:1:"1";',
+))
+->values(array(
+  'name' => 'comment_page',
+  'value' => 'i:0;',
+))
+->values(array(
+  'name' => 'cron_last',
+  'value' => 'i:1282936266;',
+))
+->values(array(
+  'name' => 'css_js_query_string',
+  'value' => 's:20:"i0000000000000000000";',
+))
+->values(array(
+  'name' => 'date_default_timezone',
+  'value' => 's:6:"-39600";',
+))
+->values(array(
+  'name' => 'drupal_private_key',
+  'value' => 's:64:"c2f015f78636f97527f2ce6c0869fccd1c7a674005ed203d48b106cbd6db3947";',
+))
+->values(array(
+  'name' => 'file_directory_temp',
+  'value' => 's:29:"/drupal-6/file/directory/temp";',
+))
+->values(array(
+  'name' => 'file_directory_path',
+  'value' => 's:29:"/drupal-6/file/directory/path";',
+))
+->values(array(
+  'name' => 'file_downloads',
+  'value' => 'i:2;',
+))
+->values(array(
+  'name' => 'filter_html_1',
+  'value' => 'i:1;',
+))
+// Add the Escape HTML filter to the custom input format 'Escape HTML Filter'
+// to test that the filter may be upgraded to its Drupal 7 equivalent.
+->values(array(
+  'name' => 'filter_html_3',
+  'value' => 'i:2;',
+))
+->values(array(
+  'name' => 'install_profile',
+  'value' => 's:7:"default";',
+))
+->values(array(
+  'name' => 'install_task',
+  'value' => 's:4:"done";',
+))
+->values(array(
+  'name' => 'install_time',
+  'value' => 'i:1282936263;',
+))
+->values(array(
+  'name' => 'javascript_parsed',
+  'value' => 'a:0:{}',
+))
+->values(array(
+  'name' => 'menu_expanded',
+  'value' => 'a:0:{}',
+))
+->values(array(
+  'name' => 'menu_masks',
+  'value' => 'a:17:{i:0;i:62;i:1;i:61;i:2;i:59;i:3;i:31;i:4;i:30;i:5;i:29;i:6;i:24;i:7;i:21;i:8;i:15;i:9;i:14;i:10;i:11;i:11;i:7;i:12;i:6;i:13;i:5;i:14;i:3;i:15;i:2;i:16;i:1;}',
+))
+->values(array(
+  'name' => 'node_options_forum',
+  'value' => 'a:1:{i:0;s:6:"status";}',
+))
+->values(array(
+  'name' => 'node_options_page',
+  'value' => 'a:1:{i:0;s:6:"status";}',
+))
+->values(array(
+  'name' => 'site_mail',
+  'value' => 's:21:"site_mail@example.com";',
+))
+->values(array(
+  'name' => 'site_name',
+  'value' => 's:9:"site_name";',
+))
+->values(array(
+  'name' => 'theme_default',
+  'value' => 's:7:"garland";',
+))
+->values(array(
+  'name' => 'theme_settings',
+  'value' => 'a:1:{s:21:"toggle_node_info_page";b:0;}',
+))
+->values(array(
+  'name' => 'update_last_check',
+  'value' => 'i:1282936266;',
+))
+->values(array(
+  'name' => 'user_email_verification',
+  'value' => 'b:1;',
+))
+->execute();
+
+db_create_table('vocabulary', array(
+  'fields' => array(
+    'vid' => array(
+      'type' => 'serial',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'description' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'big',
+    ),
+    'help' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'relations' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'hierarchy' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'multiple' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'required' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'tags' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'module' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+  ),
+  'primary key' => array(
+    'vid',
+  ),
+  'indexes' => array(
+    'list' => array(
+      'weight',
+      'name',
+    ),
+  ),
+  'module' => 'taxonomy',
+  'name' => 'vocabulary',
+));
+db_insert('vocabulary')->fields(array(
+  'vid',
+  'name',
+  'description',
+  'help',
+  'relations',
+  'hierarchy',
+  'multiple',
+  'required',
+  'tags',
+  'module',
+  'weight',
+))
+->values(array(
+  'vid' => '1',
+  'name' => 'vocabulary 1 (i=0)',
+  'description' => 'description of vocabulary 1 (i=0)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '0',
+  'multiple' => '0',
+  'required' => '0',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '0',
+))
+->values(array(
+  'vid' => '2',
+  'name' => 'vocabulary 2 (i=1)',
+  'description' => 'description of vocabulary 2 (i=1)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '1',
+  'multiple' => '1',
+  'required' => '0',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '1',
+))
+->values(array(
+  'vid' => '3',
+  'name' => 'vocabulary 3 (i=2)',
+  'description' => 'description of vocabulary 3 (i=2)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '2',
+  'multiple' => '0',
+  'required' => '0',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '2',
+))
+->values(array(
+  'vid' => '4',
+  'name' => 'vocabulary 4 (i=3)',
+  'description' => 'description of vocabulary 4 (i=3)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '0',
+  'multiple' => '1',
+  'required' => '0',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '3',
+))
+->values(array(
+  'vid' => '5',
+  'name' => 'vocabulary 5 (i=4)',
+  'description' => 'description of vocabulary 5 (i=4)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '1',
+  'multiple' => '0',
+  'required' => '0',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '4',
+))
+->values(array(
+  'vid' => '6',
+  'name' => 'vocabulary 6 (i=5)',
+  'description' => 'description of vocabulary 6 (i=5)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '2',
+  'multiple' => '1',
+  'required' => '0',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '5',
+))
+->values(array(
+  'vid' => '7',
+  'name' => 'vocabulary 7 (i=6)',
+  'description' => 'description of vocabulary 7 (i=6)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '0',
+  'multiple' => '0',
+  'required' => '1',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '6',
+))
+->values(array(
+  'vid' => '8',
+  'name' => 'vocabulary 8 (i=7)',
+  'description' => 'description of vocabulary 8 (i=7)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '1',
+  'multiple' => '1',
+  'required' => '1',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '7',
+))
+->values(array(
+  'vid' => '9',
+  'name' => 'vocabulary 9 (i=8)',
+  'description' => 'description of vocabulary 9 (i=8)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '2',
+  'multiple' => '0',
+  'required' => '1',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '8',
+))
+->values(array(
+  'vid' => '10',
+  'name' => 'vocabulary 10 (i=9)',
+  'description' => 'description of vocabulary 10 (i=9)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '0',
+  'multiple' => '1',
+  'required' => '1',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '9',
+))
+->values(array(
+  'vid' => '11',
+  'name' => 'vocabulary 11 (i=10)',
+  'description' => 'description of vocabulary 11 (i=10)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '1',
+  'multiple' => '0',
+  'required' => '1',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '10',
+))
+->values(array(
+  'vid' => '12',
+  'name' => 'vocabulary 12 (i=11)',
+  'description' => 'description of vocabulary 12 (i=11)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '2',
+  'multiple' => '1',
+  'required' => '1',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '11',
+))
+->values(array(
+  'vid' => '13',
+  'name' => 'vocabulary 13 (i=12)',
+  'description' => 'description of vocabulary 13 (i=12)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '0',
+  'multiple' => '0',
+  'required' => '0',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '12',
+))
+->values(array(
+  'vid' => '14',
+  'name' => 'vocabulary 14 (i=13)',
+  'description' => 'description of vocabulary 14 (i=13)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '1',
+  'multiple' => '1',
+  'required' => '0',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '13',
+))
+->values(array(
+  'vid' => '15',
+  'name' => 'vocabulary 15 (i=14)',
+  'description' => 'description of vocabulary 15 (i=14)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '2',
+  'multiple' => '0',
+  'required' => '0',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '14',
+))
+->values(array(
+  'vid' => '16',
+  'name' => 'vocabulary 16 (i=15)',
+  'description' => 'description of vocabulary 16 (i=15)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '0',
+  'multiple' => '1',
+  'required' => '0',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '15',
+))
+->values(array(
+  'vid' => '17',
+  'name' => 'vocabulary 17 (i=16)',
+  'description' => 'description of vocabulary 17 (i=16)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '1',
+  'multiple' => '0',
+  'required' => '0',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '16',
+))
+->values(array(
+  'vid' => '18',
+  'name' => 'vocabulary 18 (i=17)',
+  'description' => 'description of vocabulary 18 (i=17)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '2',
+  'multiple' => '1',
+  'required' => '0',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '17',
+))
+->values(array(
+  'vid' => '19',
+  'name' => 'vocabulary 19 (i=18)',
+  'description' => 'description of vocabulary 19 (i=18)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '0',
+  'multiple' => '0',
+  'required' => '1',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '18',
+))
+->values(array(
+  'vid' => '20',
+  'name' => 'vocabulary 20 (i=19)',
+  'description' => 'description of vocabulary 20 (i=19)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '1',
+  'multiple' => '1',
+  'required' => '1',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '19',
+))
+->values(array(
+  'vid' => '21',
+  'name' => 'vocabulary 21 (i=20)',
+  'description' => 'description of vocabulary 21 (i=20)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '2',
+  'multiple' => '0',
+  'required' => '1',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '20',
+))
+->values(array(
+  'vid' => '22',
+  'name' => 'vocabulary 22 (i=21)',
+  'description' => 'description of vocabulary 22 (i=21)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '0',
+  'multiple' => '1',
+  'required' => '1',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '21',
+))
+->values(array(
+  'vid' => '23',
+  'name' => 'vocabulary 23 (i=22)',
+  'description' => 'description of vocabulary 23 (i=22)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '1',
+  'multiple' => '0',
+  'required' => '1',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '22',
+))
+->values(array(
+  'vid' => '24',
+  'name' => 'vocabulary 24 (i=23)',
+  'description' => 'description of vocabulary 24 (i=23)',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '2',
+  'multiple' => '1',
+  'required' => '1',
+  'tags' => '0',
+  'module' => 'taxonomy',
+  'weight' => '23',
+))
+->execute();
+
+db_create_table('vocabulary_node_types', array(
+  'fields' => array(
+    'vid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'type' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+  ),
+  'primary key' => array(
+    'type',
+    'vid',
+  ),
+  'indexes' => array(
+    'vid' => array(
+      'vid',
+    ),
+  ),
+  'module' => 'taxonomy',
+  'name' => 'vocabulary_node_types',
+));
+db_insert('vocabulary_node_types')->fields(array(
+  'vid',
+  'type',
+))
+->values(array(
+  'vid' => '13',
+  'type' => 'page',
+))
+->values(array(
+  'vid' => '14',
+  'type' => 'page',
+))
+->values(array(
+  'vid' => '15',
+  'type' => 'page',
+))
+->values(array(
+  'vid' => '16',
+  'type' => 'page',
+))
+->values(array(
+  'vid' => '17',
+  'type' => 'page',
+))
+->values(array(
+  'vid' => '18',
+  'type' => 'page',
+))
+->values(array(
+  'vid' => '19',
+  'type' => 'page',
+))
+->values(array(
+  'vid' => '20',
+  'type' => 'page',
+))
+->values(array(
+  'vid' => '21',
+  'type' => 'page',
+))
+->values(array(
+  'vid' => '22',
+  'type' => 'page',
+))
+->values(array(
+  'vid' => '23',
+  'type' => 'page',
+))
+->values(array(
+  'vid' => '24',
+  'type' => 'page',
+))
+->execute();
+
+db_create_table('watchdog', array(
+  'fields' => array(
+    'wid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'uid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'type' => array(
+      'type' => 'varchar',
+      'length' => 16,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'message' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+    'variables' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'size' => 'big',
+    ),
+    'severity' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'link' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'location' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+    ),
+    'referer' => array(
+      'type' => 'text',
+      'not null' => FALSE,
+    ),
+    'hostname' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'wid',
+  ),
+  'indexes' => array(
+    'type' => array(
+      'type',
+    ),
+  ),
+  'module' => 'dblog',
+  'name' => 'watchdog',
+));
+
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-6.forum.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-6.forum.database.php
new file mode 100644
index 00000000..059af6d2
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-6.forum.database.php
@@ -0,0 +1,274 @@
+<?php
+
+/**
+ * Database additions for forum tests.
+ */
+
+db_create_table('forum', array(
+  'fields' => array(
+    'nid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'vid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'tid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'indexes' => array(
+    'nid' => array(
+      'nid',
+    ),
+    'tid' => array(
+      'tid',
+    ),
+  ),
+  'primary key' => array(
+    'vid',
+  ),
+  'module' => 'forum',
+  'name' => 'forum',
+));
+db_insert('forum')->fields(array(
+  'nid',
+  'vid',
+  'tid',
+))
+->values(array(
+  'nid' => '51',
+  'vid' => '61',
+  'tid' => '81',
+))
+->execute();
+
+db_insert('node')->fields(array(
+  'nid',
+  'vid',
+  'type',
+  'language',
+  'title',
+  'uid',
+  'status',
+  'created',
+  'changed',
+  'comment',
+  'promote',
+  'moderate',
+  'sticky',
+  'tnid',
+  'translate',
+))
+->values(array(
+  'nid' => '51',
+  'vid' => '61',
+  'type' => 'forum',
+  'language' => '',
+  'title' => 'Apples',
+  'uid' => '1',
+  'status' => '1',
+  'created' => '1298363952',
+  'changed' => '1298363952',
+  'comment' => '2',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->execute();
+
+db_insert('node_revisions')->fields(array(
+  'nid',
+  'vid',
+  'uid',
+  'title',
+  'body',
+  'teaser',
+  'log',
+  'timestamp',
+  'format',
+))
+->values(array(
+  'nid' => '51',
+  'vid' => '61',
+  'uid' => '1',
+  'title' => 'Apples',
+  'body' => 'A fruit.',
+  'teaser' => 'A fruit.',
+  'log' => '',
+  'timestamp' => '1298363952',
+  'format' => '1',
+))
+->execute();
+
+db_insert('node_comment_statistics')->fields(array(
+  'nid',
+  'last_comment_timestamp',
+  'last_comment_name',
+  'last_comment_uid',
+  'comment_count',
+))
+->values(array(
+  'nid' => '51',
+  'last_comment_timestamp' => '1298363952',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '1',
+  'comment_count' => '0',
+))
+->execute();
+
+db_insert('node_type')->fields(array(
+  'type',
+  'name',
+  'module',
+  'description',
+  'help',
+  'has_title',
+  'title_label',
+  'has_body',
+  'body_label',
+  'min_word_count',
+  'custom',
+  'modified',
+  'locked',
+  'orig_type',
+))
+->values(array(
+  'type' => 'forum',
+  'name' => 'Forum topic',
+  'module' => 'forum',
+  'description' => 'A <em>forum topic</em> is the initial post to a new discussion thread within a forum.',
+  'help' => '',
+  'has_title' => '1',
+  'title_label' => 'Subject',
+  'has_body' => '1',
+  'body_label' => 'Body',
+  'min_word_count' => '0',
+  'custom' => '0',
+  'modified' => '0',
+  'locked' => '1',
+  'orig_type' => 'forum',
+))
+->execute();
+
+db_update('system')->fields(array(
+  'schema_version' => '6000',
+  'status' => '1',
+))
+->condition('filename', 'modules/forum/forum.module')
+->execute();
+
+db_insert('term_data')->fields(array(
+  'tid',
+  'vid',
+  'name',
+  'description',
+  'weight',
+))
+->values(array(
+  'tid' => '81',
+  'vid' => '101',
+  'name' => 'Fruits',
+  'description' => 'Fruits.',
+  'weight' => '0',
+))
+->execute();
+
+db_insert('term_hierarchy')->fields(array(
+  'tid',
+  'parent',
+))
+->values(array(
+  'tid' => '81',
+  'parent' => '0',
+))
+->execute();
+
+db_insert('term_node')->fields(array(
+  'nid',
+  'vid',
+  'tid',
+))
+->values(array(
+  'nid' => '51',
+  'vid' => '61',
+  'tid' => '81',
+))
+->execute();
+
+db_insert('variable')->fields(array(
+  'name',
+  'value',
+))
+->values(array(
+  'name' => 'forum_nav_vocabulary',
+  'value' => 's:3:"101";',
+))
+->values(array(
+  'name' => 'forum_containers',
+  'value' => 'a:1:{i:0;s:3:"101";}',
+))
+->execute();
+
+db_insert('vocabulary')->fields(array(
+  'vid',
+  'name',
+  'description',
+  'help',
+  'relations',
+  'hierarchy',
+  'multiple',
+  'required',
+  'tags',
+  'module',
+  'weight',
+))
+->values(array(
+  'vid' => '101',
+  'name' => 'Upgrade test for forums',
+  'description' => 'Vocabulary used for Forums. The name is changed from the default "Forums" so that the upgrade path may be tested.',
+  'help' => '',
+  'relations' => '1',
+  'hierarchy' => '1',
+  'multiple' => '0',
+  'required' => '0',
+  'tags' => '0',
+  'module' => 'forum',
+  'weight' => '-10',
+))
+->execute();
+
+db_insert('vocabulary_node_types')->fields(array(
+  'vid',
+  'type',
+))
+->values(array(
+  'vid' => '101',
+  'type' => 'forum',
+))
+->execute();
+
+// Provide all users with the ability to create forum topics.
+$results = db_select('permission', 'p')
+  ->fields('p')
+  ->execute();
+
+foreach ($results as $result) {
+  $permissions = $result->perm . ', create forum topics';
+  db_update('permission')
+    ->fields(array(
+      'perm' => $permissions,
+    ))
+    ->condition('rid', $result->rid)
+    ->execute();
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-6.locale.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-6.locale.database.php
new file mode 100644
index 00000000..c8af6712
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-6.locale.database.php
@@ -0,0 +1,276 @@
+<?php
+
+/**
+ * Database additions for locale tests.
+ */
+
+db_create_table('languages', array(
+  'fields' => array(
+    'language' => array(
+      'type' => 'varchar',
+      'length' => 12,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'native' => array(
+      'type' => 'varchar',
+      'length' => 64,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'direction' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'enabled' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'plurals' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'formula' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'domain' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'prefix' => array(
+      'type' => 'varchar',
+      'length' => 128,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'javascript' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+  ),
+  'primary key' => array(
+    'language',
+  ),
+  'indexes' => array(
+    'list' => array(
+      'weight',
+      'name',
+    ),
+  ),
+  'module' => 'locale',
+  'name' => 'languages',
+));
+db_insert('languages')->fields(array(
+  'language',
+  'name',
+  'native',
+  'direction',
+  'enabled',
+  'plurals',
+  'formula',
+  'domain',
+  'prefix',
+  'weight',
+  'javascript',
+))
+->values(array(
+  'language' => 'en',
+  'name' => 'English',
+  'native' => 'English',
+  'direction' => '0',
+  'enabled' => '1',
+  'plurals' => '0',
+  'formula' => '',
+  'domain' => 'http://en.example.com',
+  'prefix' => 'en',
+  'weight' => '0',
+  'javascript' => '',
+))
+->values(array(
+  'language' => 'fr',
+  'name' => 'French',
+  'native' => 'Français',
+  'direction' => '0',
+  'enabled' => '1',
+  'plurals' => '2',
+  'formula' => '($n>1)',
+  'domain' => '',
+  'prefix' => 'fr',
+  'weight' => '-3',
+  'javascript' => '51e92dcfe1491f4595b9df7f3b287753',
+))
+->execute();
+
+db_create_table('locales_source', array(
+  'fields' => array(
+    'lid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+    ),
+    'location' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'textgroup' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => 'default',
+    ),
+    'source' => array(
+      'type' => 'text',
+      'mysql_type' => 'blob',
+      'not null' => TRUE,
+    ),
+    'version' => array(
+      'type' => 'varchar',
+      'length' => 20,
+      'not null' => TRUE,
+      'default' => 'none',
+    ),
+  ),
+  'primary key' => array(
+    'lid',
+  ),
+  'indexes' => array(
+    'source' => array(
+      array(
+        'source',
+        30,
+      ),
+    ),
+  ),
+  'module' => 'locale',
+  'name' => 'locales_source',
+));
+
+db_create_table('locales_target', array(
+  'fields' => array(
+    'lid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'translation' => array(
+      'type' => 'text',
+      'mysql_type' => 'blob',
+      'not null' => TRUE,
+    ),
+    'language' => array(
+      'type' => 'varchar',
+      'length' => 12,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'plid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'plural' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array(
+    'language',
+    'lid',
+    'plural',
+  ),
+  'indexes' => array(
+    'lid' => array(
+      'lid',
+    ),
+    'plid' => array(
+      'plid',
+    ),
+    'plural' => array(
+      'plural',
+    ),
+  ),
+  'module' => 'locale',
+  'name' => 'locales_target',
+));
+
+// Enable the locale module.
+db_update('system')->fields(array(
+  'status' => 1,
+  'schema_version' => '6006',
+))
+->condition('type', 'module')
+->condition('name', 'locale')
+->execute();
+
+// Set the default language.
+db_insert('variable')->fields(array(
+  'name',
+  'value',
+))
+->values(array(
+  'name' => 'language_default',
+  'value' => 'O:8:"stdClass":11:{s:8:"language";s:2:"fr";s:4:"name";s:6:"French";s:6:"native";s:9:"Français";s:9:"direction";s:1:"0";s:7:"enabled";i:1;s:7:"plurals";s:1:"2";s:7:"formula";s:6:"($n>1)";s:6:"domain";s:0:"";s:6:"prefix";s:0:"";s:6:"weight";s:2:"-3";s:10:"javascript";s:32:"51e92dcfe1491f4595b9df7f3b287753";}',
+))
+->values(array(
+  'name' => 'language_count',
+  'value' => 'i:2;',
+))
+->values(array(
+  'name' => 'language_negotiation',
+  'value' => 'i:0;',
+))
+->execute();
+
+// Add the language switcher block in the left region.
+db_insert('blocks')->fields(array(
+  'module',
+  'delta',
+  'theme',
+  'status',
+  'weight',
+  'region',
+  'custom',
+  'throttle',
+  'visibility',
+  'pages',
+  'title',
+  'cache',
+))
+->values(array(
+  'module' => 'locale',
+  'delta' => '0',
+  'theme' => 'garland',
+  'status' => '1',
+  'weight' => '0',
+  'region' => 'left',
+  'custom' => '0',
+  'throttle' => '0',
+  'visibility' => '0',
+  'pages' => '',
+  'title' => '',
+  'cache' => '-1',
+))
+->execute();
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-6.menu.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-6.menu.database.php
new file mode 100644
index 00000000..7fae337a
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-6.menu.database.php
@@ -0,0 +1,202 @@
+<?php
+db_insert('variable')->fields(array(
+  'name',
+  'value',
+))
+->values(array(
+  'name' => 'menu_default_node_menu',
+  'value' => 's:15:"secondary-links";',
+))
+->values(array(
+  'name' => 'menu_primary_links_source',
+  'value' => 's:15:"secondary-links";',
+))
+->values(array(
+  'name' => 'menu_secondary_links_source',
+  'value' => 's:13:"primary-links";',
+))
+->execute();
+
+// Add some links to the menus.
+db_insert('menu_links')->fields(array(
+  'menu_name',
+  'mlid',
+  'plid',
+  'link_path',
+  'router_path',
+  'link_title',
+  'options',
+  'module',
+  'hidden',
+  'external',
+  'has_children',
+  'expanded',
+  'weight',
+  'depth',
+  'customized',
+  'p1',
+  'p2',
+  'p3',
+  'p4',
+  'p5',
+  'p6',
+  'p7',
+  'p8',
+  'p9',
+  'updated',
+))
+->values(array(
+  'menu_name' => 'navigation',
+  'mlid' => '201',
+  'plid' => '0',
+  'link_path' => 'node/add',
+  'router_path' => 'node/add',
+  'link_title' => 'nodeadd-navigation',
+  'options' => 'a:0:{}',
+  'module' => 'menu',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '1',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '201',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'primary-links',
+  'mlid' => '204',
+  'plid' => '0',
+  'link_path' => 'node/add',
+  'router_path' => 'node/add',
+  'link_title' => 'nodeadd-primary',
+  'options' => 'a:0:{}',
+  'module' => 'menu',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '1',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '204',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'secondary-links',
+  'mlid' => '205',
+  'plid' => '0',
+  'link_path' => 'node/add',
+  'router_path' => 'node/add',
+  'link_title' => 'nodeadd-secondary',
+  'options' => 'a:0:{}',
+  'module' => 'menu',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '1',
+  'expanded' => '0',
+  'weight' => '1',
+  'depth' => '1',
+  'customized' => '0',
+  'p1' => '205',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->values(array(
+  'menu_name' => 'secondary-links',
+  'mlid' => '206',
+  'plid' => '0',
+  'link_path' => 'node',
+  'router_path' => 'node',
+  'link_title' => 'node-page-with-query',
+  'options' => 'a:2:{s:5:"query";s:14:"page=1&node=10";s:10:"attributes";a:1:{s:5:"title";s:0:"";}}',
+  'module' => 'menu',
+  'hidden' => '0',
+  'external' => '0',
+  'has_children' => '0',
+  'expanded' => '0',
+  'weight' => '2',
+  'depth' => '1',
+  'customized' => '1',
+  'p1' => '206',
+  'p2' => '0',
+  'p3' => '0',
+  'p4' => '0',
+  'p5' => '0',
+  'p6' => '0',
+  'p7' => '0',
+  'p8' => '0',
+  'p9' => '0',
+  'updated' => '0',
+))
+->execute();
+db_insert('blocks')->fields(array(
+  'bid',
+  'module',
+  'delta',
+  'theme',
+  'status',
+  'weight',
+  'region',
+  'custom',
+  'throttle',
+  'visibility',
+  'pages',
+  'title',
+  'cache',
+))
+->values(array(
+  'bid' => '4',
+  'module' => 'menu',
+  'delta' => 'primary-links',
+  'theme' => 'garland',
+  'status' => '1',
+  'weight' => '0',
+  'region' => 'left',
+  'custom' => '0',
+  'throttle' => '0',
+  'visibility' => '0',
+  'pages' => '',
+  'title' => 'My Primary Links',
+  'cache' => '-1',
+))
+->values(array(
+  'bid' => '5',
+  'module' => 'menu',
+  'delta' => 'secondary-links',
+  'theme' => 'garland',
+  'status' => '1',
+  'weight' => '0',
+  'region' => 'left',
+  'custom' => '0',
+  'throttle' => '0',
+  'visibility' => '0',
+  'pages' => '',
+  'title' => 'My Secondary Links',
+  'cache' => '-1',
+))
+->execute();
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-6.node_type_broken.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-6.node_type_broken.database.php
new file mode 100644
index 00000000..1dc1946b
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-6.node_type_broken.database.php
@@ -0,0 +1,34 @@
+<?php
+db_insert('comments')->fields(array(
+  'cid',
+  'pid',
+  'nid',
+  'uid',
+  'subject',
+  'comment',
+  'hostname',
+  'timestamp',
+  'status',
+  'format',
+  'thread',
+  'name',
+  'mail',
+  'homepage',
+))
+->values(array(
+  'cid' => 1,
+  'pid' => 0,
+  'nid' => 37,
+  'uid' => 3,
+  'subject' => 'Comment title 1',
+  'comment' => 'Comment body 1 - Comment body 1 - Comment body 1 - Comment body 1 - Comment body 1 - Comment body 1 - Comment body 1 - Comment body 1',
+  'hostname' => '127.0.0.1',
+  'timestamp' => 1008617630,
+  'status' => 0,
+  'format' => 1,
+  'thread' => '01/',
+  'name' => NULL,
+  'mail' => NULL,
+  'homepage' => '',
+))
+->execute();
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-6.translatable.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-6.translatable.database.php
new file mode 100644
index 00000000..51621160
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-6.translatable.database.php
@@ -0,0 +1,125 @@
+<?php
+
+/**
+ * Database additions for translatable tests.
+ */
+
+db_insert('node')->fields(array(
+  'nid',
+  'vid',
+  'type',
+  'language',
+  'title',
+  'uid',
+  'status',
+  'created',
+  'changed',
+  'comment',
+  'promote',
+  'moderate',
+  'sticky',
+  'tnid',
+  'translate',
+))
+->values(array(
+  'nid' => '53',
+  'vid' => '63',
+  'type' => 'translatable_page',
+  'language' => 'fr',
+  'title' => 'First translatable page',
+  'uid' => '1',
+  'status' => '1',
+  'created' => '1298363952',
+  'changed' => '1298363952',
+  'comment' => '2',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->execute();
+
+db_insert('node_revisions')->fields(array(
+  'nid',
+  'vid',
+  'uid',
+  'title',
+  'body',
+  'teaser',
+  'log',
+  'timestamp',
+  'format',
+))
+->values(array(
+  'nid' => '53',
+  'vid' => '63',
+  'uid' => '1',
+  'title' => 'First translatable page',
+  'body' => 'Body of the first translatable page.',
+  'teaser' => 'Teaser of the first translatable page.',
+  'log' => '',
+  'timestamp' => '1298363952',
+  'format' => '1',
+))
+->execute();
+
+db_insert('node_comment_statistics')->fields(array(
+  'nid',
+  'last_comment_timestamp',
+  'last_comment_name',
+  'last_comment_uid',
+  'comment_count',
+))
+->values(array(
+  'nid' => '53',
+  'last_comment_timestamp' => '1298363952',
+  'last_comment_name' => NULL,
+  'last_comment_uid' => '1',
+  'comment_count' => '0',
+))
+->execute();
+
+db_insert('node_type')->fields(array(
+  'type',
+  'name',
+  'module',
+  'description',
+  'help',
+  'has_title',
+  'title_label',
+  'has_body',
+  'body_label',
+  'min_word_count',
+  'custom',
+  'modified',
+  'locked',
+  'orig_type',
+))
+->values(array(
+  'type' => 'translatable_page',
+  'name' => 'Translatable page',
+  'module' => 'node',
+  'description' => 'A <em>translatable page</em> is like a normal page, but with multilanguage support.',
+  'help' => '',
+  'has_title' => '1',
+  'title_label' => 'Title',
+  'has_body' => '1',
+  'body_label' => 'Body',
+  'min_word_count' => '0',
+  'custom' => '0',
+  'modified' => '0',
+  'locked' => '1',
+  'orig_type' => '',
+))
+->execute();
+
+db_insert('variable')->fields(array(
+  'name',
+  'value',
+))
+->values(array(
+  'name' => 'language_content_type_translatable_page',
+  'value' => 's:1:"1";',
+))
+->execute();
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-6.trigger.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-6.trigger.database.php
new file mode 100644
index 00000000..0962f358
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-6.trigger.database.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * @file
+ * Test content for the trigger upgrade path.
+ */
+db_create_table('trigger_assignments', array(
+  'fields' => array(
+    'hook' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'op' => array(
+      'type' => 'varchar',
+      'length' => 32,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'aid' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+  ),
+  'primary key' => array('hook', 'op', 'aid'),
+  'module' => 'trigger',
+  'name' => 'trigger_assignments',
+));
+
+
+// Add several trigger configurations.
+db_insert('trigger_assignments')->fields(array(
+  'hook',
+  'op',
+  'aid',
+  'weight',
+))
+->values(array(
+  'hook' => 'node',
+  'op' => 'presave',
+  'aid' => 'node_publish_action',
+  'weight' => '1',
+))
+->values(array(
+  'hook' => 'comment',
+  'op' => 'presave',
+  'aid' => 'comment_publish_action',
+  'weight' => '1',
+))
+->values(array(
+  'hook' => 'comment_delete',
+  'op' => 'presave',
+  'aid' => 'node_save_action',
+  'weight' => '1',
+))
+->values(array(
+  'hook' => 'nodeapi',
+  'op' => 'presave',
+  'aid' => 'node_make_sticky_action',
+  'weight' => '1',
+))
+->values(array(
+  'hook' => 'nodeapi',
+  'op' => 'somehow_nodeapi_got_a_very_long',
+  'aid' => 'node_save_action',
+  'weight' => '1',
+))
+->execute();
+
+db_update('system')->fields(array(
+  'schema_version' => '6000',
+  'status' => '1',
+))
+->condition('filename', 'modules/trigger/trigger.module')
+->execute();
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-6.upload.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-6.upload.database.php
new file mode 100644
index 00000000..46ebe2cb
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-6.upload.database.php
@@ -0,0 +1,449 @@
+<?php
+
+db_insert('files')->fields(array(
+  'fid',
+  'uid',
+  'filename',
+  'filepath',
+  'filemime',
+  'filesize',
+  'status',
+  'timestamp',
+))
+/*
+ * This entry is deliberately omitted to test the upgrade routine when facing
+ * possible data corruption.
+ *
+->values(array(
+  'fid' => '1',
+  'uid' => '1',
+  'filename' => 'powered-blue-80x15.png',
+  'filepath' => 'sites/default/files/powered-blue-80x15.png',
+  'filemime' => 'image/png',
+  'filesize' => '1011',
+  'status' => '1',
+  'timestamp' => '1285700240',
+)) */
+->values(array(
+  'fid' => '2',
+  'uid' => '1',
+  'filename' => 'powered-blue-80x15.png',
+  'filepath' => 'sites/default/files/powered-blue-80x15_0.png',
+  'filemime' => 'image/png',
+  'filesize' => '1011',
+  'status' => '1',
+  'timestamp' => '1285700317',
+))
+->values(array(
+  'fid' => '3',
+  'uid' => '1',
+  'filename' => 'powered-blue-88x31.png',
+  'filepath' => 'sites/default/files/powered-blue-88x31.png',
+  'filemime' => 'image/png',
+  'filesize' => '2113',
+  'status' => '1',
+  'timestamp' => '1285700343',
+))
+->values(array(
+  'fid' => '4',
+  'uid' => '1',
+  'filename' => 'powered-blue-135x42.png',
+  'filepath' => 'sites/default/files/powered-blue-135x42.png',
+  'filemime' => 'image/png',
+  'filesize' => '3027',
+  'status' => '1',
+  'timestamp' => '1285700366',
+))
+->values(array(
+  'fid' => '5',
+  'uid' => '1',
+  'filename' => 'powered-black-80x15.png',
+  'filepath' => 'sites/default/files/powered-black-80x15.png',
+  'filemime' => 'image/png',
+  'filesize' => '1467',
+  'status' => '1',
+  'timestamp' => '1285700529',
+))
+->values(array(
+  'fid' => '6',
+  'uid' => '1',
+  'filename' => 'powered-black-135x42.png',
+  'filepath' => 'sites/default/files/powered-black-135x42.png',
+  'filemime' => 'image/png',
+  'filesize' => '2817',
+  'status' => '1',
+  'timestamp' => '1285700552',
+))
+->values(array(
+  'fid' => '7',
+  'uid' => '1',
+  'filename' => 'forum-hot-new.png',
+  'filepath' => 'sites/default/files/forum-hot-new.png',
+  'filemime' => 'image/png',
+  'filesize' => '237',
+  'status' => '1',
+  'timestamp' => '1285708937',
+))
+->values(array(
+  'fid' => '8',
+  'uid' => '1',
+  'filename' => 'forum-hot.png',
+  'filepath' => 'sites/default/files/forum-hot.png',
+  'filemime' => 'image/png',
+  'filesize' => '229',
+  'status' => '1',
+  'timestamp' => '1285708944',
+))
+->values(array(
+  'fid' => '9',
+  'uid' => '1',
+  'filename' => 'forum-new.png',
+  'filepath' => 'sites/default/files/forum-new.png',
+  'filemime' => 'image/png',
+  'filesize' => '175',
+  'status' => '1',
+  'timestamp' => '1285708950',
+))
+->values(array(
+  'fid' => '10',
+  'uid' => '1',
+  'filename' => 'forum-sticky.png',
+  'filepath' => 'sites/default/files/forum-sticky.png',
+  'filemime' => 'image/png',
+  'filesize' => '329',
+  'status' => '1',
+  'timestamp' => '1285708957',
+))
+/*
+ * This is a case where the path is repeated twice.
+ */
+->values(array(
+  'fid' => '11',
+  'uid' => '1',
+  'filename' => 'crazy-basename.png',
+  'filepath' => '/drupal-6/file/directory/path/drupal-6/file/directory/path/crazy-basename.png',
+  'filemime' => 'image/png',
+  'filesize' => '329',
+  'status' => '1',
+  'timestamp' => '1285708958',
+))
+->execute();
+
+db_insert('node')->fields(array(
+  'nid',
+  'vid',
+  'type',
+  'language',
+  'title',
+  'uid',
+  'status',
+  'created',
+  'changed',
+  'comment',
+  'promote',
+  'moderate',
+  'sticky',
+  'tnid',
+  'translate',
+))
+->values(array(
+  'nid' => '38',
+  'vid' => '50',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 38 revision 50',
+  'uid' => '1',
+  'status' => '1',
+  'created' => '1285603317',
+  'changed' => '1285603317',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '39',
+  'vid' => '52',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 39 revision 52',
+  'uid' => '1',
+  'status' => '1',
+  'created' => '1285700317',
+  'changed' => '1285700600',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+->values(array(
+  'nid' => '40',
+  'vid' => '53',
+  'type' => 'page',
+  'language' => '',
+  'title' => 'node title 40 revision 53',
+  'uid' => '1',
+  'status' => '1',
+  'created' => '1285709012',
+  'changed' => '1285709012',
+  'comment' => '0',
+  'promote' => '0',
+  'moderate' => '0',
+  'sticky' => '0',
+  'tnid' => '0',
+  'translate' => '0',
+))
+ ->execute();
+
+db_insert('node_revisions')->fields(array(
+  'nid',
+  'vid',
+  'uid',
+  'title',
+  'body',
+  'teaser',
+  'log',
+  'timestamp',
+  'format',
+))
+->values(array(
+  'nid' => '38',
+  'vid' => '50',
+  'uid' => '1',
+  'title' => 'node title 38 revision 50',
+  'body' => "Attachments:\r\npowered-blue-80x15.png",
+  'teaser' => "Attachments:\r\npowered-blue-80x15.png",
+  'log' => '',
+  'timestamp' => '1285603317',
+  'format' => '1',
+))
+->values(array(
+  'nid' => '39',
+  'vid' => '51',
+  'uid' => '1',
+  'title' => 'node title 39 revision 51',
+  'body' => "Attachments:\r\npowered-blue-80x15.png\r\npowered-blue-88x31.png\r\npowered-blue-135x42.png",
+  'teaser' => "Attachments:\r\npowered-blue-80x15.png\r\npowered-blue-88x31.png\r\npowered-blue-135x42.png",
+  'log' => '',
+  'timestamp' => '1285700487',
+  'format' => '1',
+))
+->values(array(
+  'nid' => '39',
+  'vid' => '52',
+  'uid' => '1',
+  'title' => 'node title 39 revision 52',
+  'body' => "Attachments:\r\npowered-blue-88x31.png\r\npowered-black-80x15.png\r\npowered-black-135x42.png",
+  'teaser' => "Attachments:\r\npowered-blue-88x31.png\r\npowered-black-80x15.png\r\npowered-black-135x42.png",
+  'log' => '',
+  'timestamp' => '1285700600',
+  'format' => '1',
+))
+->values(array(
+  'nid' => '40',
+  'vid' => '53',
+  'uid' => '1',
+  'title' => 'node title 40 revision 53',
+  'body' => "Attachments:\r\nforum-hot-new.png\r\nforum-hot.png\r\nforum-sticky.png\r\nforum-new.png\r\ncrazy-basename.png",
+  'teaser' => "Attachments:\r\nforum-hot-new.png\r\nforum-hot.png\r\nforum-sticky.png\r\nforum-new.png\r\ncrazy-basename.png",
+  'log' => '',
+  'timestamp' => '1285709012',
+  'format' => '1',
+))
+ ->execute();
+
+db_create_table('upload', array(
+  'fields' => array(
+    'fid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'nid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'vid' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+    ),
+    'description' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+    ),
+    'list' => array(
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'size' => 'tiny',
+    ),
+  ),
+  'primary key' => array(
+    'vid',
+    'fid',
+  ),
+  'indexes' => array(
+    'fid' => array(
+      'fid',
+    ),
+    'nid' => array(
+      'nid',
+    ),
+  ),
+  'module' => 'upload',
+  'name' => 'upload',
+));
+db_insert('upload')->fields(array(
+  'fid',
+  'nid',
+  'vid',
+  'description',
+  'list',
+  'weight',
+))
+->values(array(
+  'fid' => '1',
+  'nid' => '38',
+  'vid' => '50',
+  'description' => 'powered-blue-80x15.png',
+  'list' => '1',
+  'weight' => '0',
+))
+->values(array(
+  'fid' => '2',
+  'nid' => '39',
+  'vid' => '51',
+  'description' => 'powered-blue-80x15.png',
+  'list' => '1',
+  'weight' => '0',
+))
+->values(array(
+  'fid' => '3',
+  'nid' => '39',
+  'vid' => '51',
+  'description' => 'powered-blue-88x31.png',
+  'list' => '1',
+  'weight' => '0',
+))
+->values(array(
+  'fid' => '4',
+  'nid' => '39',
+  'vid' => '51',
+  'description' => 'powered-blue-135x42.png',
+  'list' => '1',
+  'weight' => '0',
+))
+->values(array(
+  'fid' => '3',
+  'nid' => '39',
+  'vid' => '52',
+  'description' => 'powered-blue-88x31.png',
+  'list' => '1',
+  'weight' => '0',
+))
+->values(array(
+  'fid' => '5',
+  'nid' => '39',
+  'vid' => '52',
+  'description' => 'powered-black-80x15.png',
+  'list' => '1',
+  'weight' => '0',
+))
+->values(array(
+  'fid' => '6',
+  'nid' => '39',
+  'vid' => '52',
+  'description' => 'powered-black-135x42.png',
+  'list' => '1',
+  'weight' => '0',
+))
+->values(array(
+  'fid' => '7',
+  'nid' => '40',
+  'vid' => '53',
+  'description' => 'forum-hot-new.png',
+  'list' => '1',
+  'weight' => '-4',
+))
+->values(array(
+  'fid' => '8',
+  'nid' => '40',
+  'vid' => '53',
+  'description' => 'forum-hot.png',
+  'list' => '1',
+  'weight' => '-3',
+))
+->values(array(
+  'fid' => '10',
+  'nid' => '40',
+  'vid' => '53',
+  'description' => 'forum-sticky.png',
+  'list' => '1',
+  'weight' => '-2',
+))
+->values(array(
+  'fid' => '9',
+  'nid' => '40',
+  'vid' => '53',
+  'description' => 'forum-new.png',
+  'list' => '1',
+  'weight' => '-1',
+))
+->values(array(
+  'fid' => '11',
+  'nid' => '40',
+  'vid' => '53',
+  'description' => 'crazy-basename.png',
+  'list' => '1',
+  'weight' => '0',
+))
+->execute();
+
+// Add series of entries for invalid node vids to the {upload} table.
+for ($i = 30; $i < 250; $i += 2) {
+  db_insert('upload')->fields(array(
+    'fid',
+    'nid',
+    'vid',
+    'description',
+    'list',
+    'weight',
+  ))
+  // Invalid fid, invalid vid.
+  ->values(array(
+    'fid' => $i,
+    'nid' => '40',
+    'vid' => 24 + $i,
+    'description' => 'crazy-basename.png',
+    'list' => '1',
+    'weight' => '0',
+  ))
+  // Valid fid, invalid vid.
+  ->values(array(
+    'fid' => 2,
+    'nid' => '40',
+    'vid' => 24 + $i + 1,
+    'description' => 'crazy-basename.png',
+    'list' => '1',
+    'weight' => '0',
+  ))
+  ->execute();
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-6.user-no-password-token.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-6.user-no-password-token.database.php
new file mode 100644
index 00000000..64631946
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-6.user-no-password-token.database.php
@@ -0,0 +1,10 @@
+<?php
+db_insert('variable')->fields(array(
+  'name',
+  'value',
+))
+->values(array(
+  'name' => 'user_mail_register_no_approval_required_body',
+  'value' => 's:86:"!username, !site, !uri, !uri_brief, !mailto, !date, !login_uri, !edit_uri, !login_url.";',
+))
+->execute();
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php
new file mode 100644
index 00000000..e91b6e45
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php
@@ -0,0 +1,55 @@
+<?php
+db_insert('variable')->fields(array(
+  'name',
+  'value',
+))
+->values(array(
+  'name' => 'user_mail_register_no_approval_required_body',
+  'value' => 's:97:"!password, !username, !site, !uri, !uri_brief, !mailto, !date, !login_uri, !edit_uri, !login_url.";',
+))
+->execute();
+
+db_insert('users')->fields(array(
+  'uid',
+  'name',
+  'pass',
+  'mail',
+  'mode',
+  'sort',
+  'threshold',
+  'theme',
+  'signature',
+  'signature_format',
+  'created',
+  'access',
+  'login',
+  'status',
+  'timezone',
+  'language',
+  'picture',
+  'init',
+  'data',
+))
+->values(array(
+  'uid' => 3,
+  'name' => 'hashtester',
+  // This is not a valid D7 hash, but a truncated one.
+  'pass' => '$S$DAK00p3Dkojkf4O/UizYxenguXnjv',
+  'mail' => 'hashtester@example.com',
+  'mode' => '0',
+  'sort' => '0',
+  'threshold' => '0',
+  'theme' => '',
+  'signature' => '',
+  'signature_format' => '0',
+  'created' => '1277671599',
+  'access' => '1277671612',
+  'login' => '1277671612',
+  'status' => '1',
+  'timezone' => '-21600',
+  'language' => '',
+  'picture' => '',
+  'init' => 'hashtester@example.com',
+  'data' => 'a:0:{}',
+))
+->execute();
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-7.aggregator.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-7.aggregator.database.php
new file mode 100644
index 00000000..00ea7d22
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-7.aggregator.database.php
@@ -0,0 +1,149 @@
+<?php
+/**
+ * @file
+ * Test content for the aggregator update path.
+ */
+
+db_insert('aggregator_feed')->fields(array(
+  'fid',
+  'title',
+  'url',
+  'refresh',
+  'checked',
+  'queued',
+  'link',
+  'description',
+  'image',
+  'hash',
+  'etag',
+  'modified',
+  'block',
+))
+  ->values(array(
+  'fid' => '1',
+  'title' => 'Drupal commit log',
+  'url' => 'http://drupal.org/commitlog/feed',
+  'refresh' => '3600',
+  'checked' => '1347209523',
+  'queued' => '0',
+  'link' => 'http://drupal.org/versioncontrol/garbage/path',
+  'description' => '',
+  'image' => '',
+  'hash' => '84f57ae5bffa7fd56942a6293be91244d8551cd18204a7c7de6a17065ea4d54d',
+  'etag' => '"1347206975"',
+  'modified' => '1347206975',
+  'block' => '5',
+))
+  ->execute();
+
+db_insert('aggregator_item')->fields(array(
+  'iid',
+  'fid',
+  'title',
+  'link',
+  'author',
+  'description',
+  'timestamp',
+  'guid',
+))
+  ->values(array(
+  'iid' => '1',
+  'fid' => '1',
+  'title' => 'Domain Access: Commit b904022 on 7.x-2.x authored by bforchhammer, committed by agentrickard',
+  'link' => 'http://drupal.org/commitlog/commit/2%2C410/b90402243b4a9dee0d2e2c4a729dcb2f58dc53c0',
+  'author' => 'bforchhammer',
+  'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-10\">\n    \n  \n  \n      <div class=\"view-content\">\n        <div class=\"views-row views-row-1 views-row-odd views-row-first\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/project/domain.git/blob/b90402243b4a9dee0d2e2c4a729dcb2f58dc53c0:/domain_source/domain_source.info\">/domain_source/domain_source.info</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">1 addition & 1 deletion</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"minus\">-</span><span class=\"no-op\"> </span><span class=\"no-op\"> </span><span class=\"no-op\"> </span><span class=\"no-op\"> </span><span class=\"no-op\"> </span></span></span>\n  </div>\n  </div>\n  <div class=\"views-row views-row-2 views-row-even views-row-last\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/project/domain.git/blob/b90402243b4a9dee0d2e2c4a729dcb2f58dc53c0:/domain_source/domain_source.views.inc\">/domain_source/domain_source.views.inc</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">13 additions & 1 deletion</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span></span></span>\n  </div>\n  </div>\n    </div>\n  \n  \n  \n  \n  \n  \n</div>\n<pre>Patch #1685658 by bforchhammer. Better handling of current domain for Domain Source.\n</pre>",
+  'timestamp' => '1347206044',
+  'guid' => 'VCS Operation 3936918 at http://drupal.org',
+))
+  ->values(array(
+  'iid' => '2',
+  'fid' => '1',
+  'title' => 'Video: Commit b0b7ff0 on 7.x-2.x by Jorrit',
+  'link' => 'http://drupal.org/commitlog/commit/846/b0b7ff08fed89c76454aa54627cc219361365d7b',
+  'author' => 'Jorrit',
+  'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-9\">\n    \n  \n  \n      <div class=\"view-content\">\n        <div class=\"views-row views-row-1 views-row-odd views-row-first\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/project/video.git/blob/b0b7ff08fed89c76454aa54627cc219361365d7b:/libraries/phpvideotoolkit/phpvideotoolkit.php5.php\">/libraries/phpvideotoolkit/phpvideotoolkit.php5.php</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">5 additions & 5 deletions</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span><span class=\"minus\">-</span><span class=\"minus\">-</span><span class=\"no-op\"> </span></span></span>\n  </div>\n  </div>\n  <div class=\"views-row views-row-2 views-row-even\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/project/video.git/blob/b0b7ff08fed89c76454aa54627cc219361365d7b:/tests/TranscoderAbstractionFactoryFfmpeg.test\">/tests/TranscoderAbstractionFactoryFfmpeg.test</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">21 additions & 7 deletions</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span><span class=\"minus\">-</span></span></span>\n  </div>\n  </div>\n  <div class=\"views-row views-row-3 views-row-odd views-row-last\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/project/video.git/blob/b0b7ff08fed89c76454aa54627cc219361365d7b:/transcoders/TranscoderAbstractionFactoryFfmpeg.inc\">/transcoders/TranscoderAbstractionFactoryFfmpeg.inc</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">31 additions & 22 deletions</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span><span class=\"minus\">-</span><span class=\"minus\">-</span></span></span>\n  </div>\n  </div>\n    </div>\n  \n  \n  \n  \n  \n  \n</div>\n<pre>Issue #1492296 by Jorrit: Added support for avconv binaries instead of FFmpeg.\n</pre>",
+  'timestamp' => '1347206397',
+  'guid' => 'VCS Operation 3936924 at http://drupal.org',
+))
+  ->values(array(
+  'iid' => '3',
+  'fid' => '1',
+  'title' => 'Remove Login Tabs: Commit 6e1eb5a on 7.x-1.x by highrockmedia',
+  'link' => 'http://drupal.org/commitlog/commit/41%2C610/6e1eb5a4a952db3264e7696e840ac3d797f4b477',
+  'author' => 'highrockmedia',
+  'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-8\">\n    \n  \n  \n      <div class=\"view-content\">\n        <div class=\"views-row views-row-1 views-row-odd views-row-first views-row-last\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/sandbox/highrockmedia/1702096.git/blob/6e1eb5a4a952db3264e7696e840ac3d797f4b477:/readme.txt\">/readme.txt</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">10 additions & 2 deletions</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span></span></span>\n  </div>\n  </div>\n    </div>\n  \n  \n  \n  \n  \n  \n</div>\n<pre>Updating readme\n</pre>",
+  'timestamp' => '1347206401',
+  'guid' => 'VCS Operation 3936920 at http://drupal.org',
+))
+  ->values(array(
+  'iid' => '4',
+  'fid' => '1',
+  'title' => 'TimeGroup: Commit 6ed4c08 on 7.x-1.x by Sweetchuck',
+  'link' => 'http://drupal.org/commitlog/commit/40%2C448/6ed4c085e5d9a8d33e091e1b8a65c73eab2dc99e',
+  'author' => 'Sweetchuck',
+  'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-7\">\n    \n  \n  \n      <div class=\"view-content\">\n        <div class=\"views-row views-row-1 views-row-odd views-row-first views-row-last\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/sandbox/Sweetchuck/1666642.git/blob/6ed4c085e5d9a8d33e091e1b8a65c73eab2dc99e:/includes/ctools/export_ui/timegroup.inc\">/includes/ctools/export_ui/timegroup.inc</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">1 addition & 1 deletion</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"minus\">-</span><span class=\"no-op\"> </span><span class=\"no-op\"> </span><span class=\"no-op\"> </span><span class=\"no-op\"> </span><span class=\"no-op\"> </span></span></span>\n  </div>\n  </div>\n    </div>\n  \n  \n  \n  \n  \n  \n</div>\n<pre>CTools UI - Wrong default value for timeoffset fix.\n</pre>",
+  'timestamp' => '1347206533',
+  'guid' => 'VCS Operation 3936942 at http://drupal.org',
+))
+  ->values(array(
+  'iid' => '5',
+  'fid' => '1',
+  'title' => 'Domain Access: Commit 1140172 on 6.x-2.x authored by bforchhammer, committed by agentrickard',
+  'link' => 'http://drupal.org/commitlog/commit/2%2C410/11401723f5c5d11032dd141ba4939ed889a7a915',
+  'author' => 'bforchhammer',
+  'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-6\">\n    \n  \n  \n      <div class=\"view-content\">\n        <div class=\"views-row views-row-1 views-row-odd views-row-first\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/project/domain.git/blob/11401723f5c5d11032dd141ba4939ed889a7a915:/domain_source/domain_source.views.inc\">/domain_source/domain_source.views.inc</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">33 additions & 1 deletion</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"no-op\"> </span></span></span>\n  </div>\n  </div>\n  <div class=\"views-row views-row-2 views-row-even views-row-last\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/project/domain.git/blob/11401723f5c5d11032dd141ba4939ed889a7a915:/domain_source/includes/domain_source_handler_filter_domain_id.inc\">/domain_source/includes/domain_source_handler_filter_domain_id.inc</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">28 additions & 0 deletions</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span></span></span>\n  </div>\n  </div>\n    </div>\n  \n  \n  \n  \n  \n  \n</div>\n<pre>Patch #1685658 by bforchhammer. Better handling of current domain for Domain Source.\n</pre>",
+  'timestamp' => '1347206541',
+  'guid' => 'VCS Operation 3936926 at http://drupal.org',
+))
+  ->values(array(
+  'iid' => '6',
+  'fid' => '1',
+  'title' => 'Domain Access: Commit 19b1c36 on 7.x-2.x by agentrickard',
+  'link' => 'http://drupal.org/commitlog/commit/2%2C410/19b1c366d86cecd8a9f6e1a6e835c0566f5c02db',
+  'author' => 'agentrickard',
+  'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-5\">\n    \n  \n  \n      <div class=\"view-content\">\n        <div class=\"views-row views-row-1 views-row-odd views-row-first views-row-last\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/project/domain.git/blob/19b1c366d86cecd8a9f6e1a6e835c0566f5c02db:/domain_source/includes/domain_source_handler_filter_domain_id.inc\">/domain_source/includes/domain_source_handler_filter_domain_id.inc</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">28 additions & 0 deletions</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span></span></span>\n  </div>\n  </div>\n    </div>\n  \n  \n  \n  \n  \n  \n</div>\n<pre>Adds new Views file to Domain Source.\n</pre>",
+  'timestamp' => '1347206601',
+  'guid' => 'VCS Operation 3936928 at http://drupal.org',
+))
+  ->values(array(
+  'iid' => '7',
+  'fid' => '1',
+  'title' => 'Domain Access: Commit d2d5456 on 7.x-3.x by agentrickard',
+  'link' => 'http://drupal.org/commitlog/commit/2%2C410/d2d5456cad6ca57bb72e743da6a7112a74d7a331',
+  'author' => 'agentrickard',
+  'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-4\">\n    \n  \n  \n      <div class=\"view-content\">\n        <div class=\"views-row views-row-1 views-row-odd views-row-first views-row-last\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/project/domain.git/blob/d2d5456cad6ca57bb72e743da6a7112a74d7a331:/domain_source/includes/domain_source_handler_filter_domain_id.inc\">/domain_source/includes/domain_source_handler_filter_domain_id.inc</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">29 additions & 0 deletions</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span></span></span>\n  </div>\n  </div>\n    </div>\n  \n  \n  \n  \n  \n  \n</div>\n<pre>Adds new Views file to Domain Source.\n</pre>",
+  'timestamp' => '1347206620',
+  'guid' => 'VCS Operation 3936930 at http://drupal.org',
+))
+  ->values(array(
+  'iid' => '8',
+  'fid' => '1',
+  'title' => 'Skarabee: Commit 400b519 on 7.x-1.x by sboersma',
+  'link' => 'http://drupal.org/commitlog/commit/23%2C278/400b5190f59b1cb58d6b27fa10ac668e9580aa73',
+  'author' => 'sboersma',
+  'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-3\">\n    \n  \n  \n      <div class=\"view-content\">\n        <div class=\"views-row views-row-1 views-row-odd views-row-first views-row-last\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/sandbox/sboersma/1176520.git/blob/400b5190f59b1cb58d6b27fa10ac668e9580aa73:/skarabee.install\">/skarabee.install</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">3 additions & 3 deletions</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span><span class=\"minus\">-</span><span class=\"minus\">-</span><span class=\"no-op\"> </span></span></span>\n  </div>\n  </div>\n    </div>\n  \n  \n  \n  \n  \n  \n</div>\n<pre>sboersma: Changed variable deletion method.\n</pre>",
+  'timestamp' => '1347206709',
+  'guid' => 'VCS Operation 3936932 at http://drupal.org',
+))
+  ->values(array(
+  'iid' => '9',
+  'fid' => '1',
+  'title' => 'Config entity listing plugin API: Commit dd3fa73 on 8.x-list by damiankloip',
+  'link' => 'http://drupal.org/commitlog/commit/43%2C586/dd3fa73b0bcdca833bbde1d1ddb3cefe42003693',
+  'author' => 'damiankloip',
+  'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-2\">\n    \n  \n  \n      <div class=\"view-content\">\n        <div class=\"views-row views-row-1 views-row-odd views-row-first views-row-last\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/sandbox/damiankloip/1778654.git/blob/dd3fa73b0bcdca833bbde1d1ddb3cefe42003693:/core/modules/config/lib/Drupal/config/Tests/ConfigEntityListingTest.php\">/core/modules/config/lib/Drupal/config/Tests/ConfigEntityListingTest.php</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">10 additions & 2 deletions</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span></span></span>\n  </div>\n  </div>\n    </div>\n  \n  \n  \n  \n  \n  \n</div>\n<pre>Added tests for getList() method\n</pre>",
+  'timestamp' => '1347206738',
+  'guid' => 'VCS Operation 3936936 at http://drupal.org',
+))
+  ->values(array(
+  'iid' => '10',
+  'fid' => '1',
+  'title' => 'AutoSlave: Commit 76891da on 7.x-1.x by gielfeldt',
+  'link' => 'http://drupal.org/commitlog/commit/42%2C968/76891daf3cea9c294daf56a26760cb1bf33ea58a',
+  'author' => 'gielfeldt',
+  'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-1\">\n    \n  \n  \n      <div class=\"view-content\">\n        <div class=\"views-row views-row-1 views-row-odd views-row-first\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/project/autoslave.git/blob/76891daf3cea9c294daf56a26760cb1bf33ea58a:/autoslave.module\">/autoslave.module</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">10 additions & 7 deletions</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span><span class=\"minus\">-</span><span class=\"minus\">-</span></span></span>\n  </div>\n  </div>\n  <div class=\"views-row views-row-2 views-row-even views-row-last\">\n      \n  <div class=\"views-field-path\">\n                <span class=\"field-content\"><a href=\"http://drupalcode.org/project/autoslave.git/blob/76891daf3cea9c294daf56a26760cb1bf33ea58a:/autoslave/database.inc\">/autoslave/database.inc</a></span>\n  </div>\n  \n  <div class=\"views-field-changed-lines\">\n                <span class=\"field-content\">10 additions & 2 deletions</span>\n  </div>\n  \n  <div class=\"views-field-visual-diffstat\">\n                <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span></span></span>\n  </div>\n  </div>\n    </div>\n  \n  \n  \n  \n  \n  \n</div>\n<pre>Keep track of affected tables per commit.\n</pre>",
+  'timestamp' => '1347206751',
+  'guid' => 'VCS Operation 3936934 at http://drupal.org',
+))
+  ->execute();
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-7.bare.minimal.database.php.gz b/htmltest/modules/simpletest/tests/upgrade/drupal-7.bare.minimal.database.php.gz
new file mode 100644
index 00000000..41be271f
Binary files /dev/null and b/htmltest/modules/simpletest/tests/upgrade/drupal-7.bare.minimal.database.php.gz differ
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-7.bare.standard_all.database.php.gz b/htmltest/modules/simpletest/tests/upgrade/drupal-7.bare.standard_all.database.php.gz
new file mode 100644
index 00000000..c47ae878
Binary files /dev/null and b/htmltest/modules/simpletest/tests/upgrade/drupal-7.bare.standard_all.database.php.gz differ
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-7.field.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-7.field.database.php
new file mode 100644
index 00000000..63047613
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-7.field.database.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @file
+ * Test content for the field update path.
+ */
+
+db_insert('variable')->fields(array(
+  'name',
+  'value',
+))
+->values(array(
+  'name' => 'field_bundle_settings',
+  'value' => 'a:1:{s:4:"node";a:1:{s:4:"poll";a:1:{s:12:"extra_fields";a:1:{s:7:"display";a:2:{s:16:"poll_view_voting";a:1:{s:7:"default";a:2:{s:6:"weight";s:1:"0";s:7:"visible";b:1;}}s:17:"poll_view_results";a:1:{s:7:"default";a:2:{s:6:"weight";s:1:"0";s:7:"visible";b:0;}}}}}}}',
+))
+->execute();
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-7.filled.minimal.database.php.gz b/htmltest/modules/simpletest/tests/upgrade/drupal-7.filled.minimal.database.php.gz
new file mode 100644
index 00000000..de2dceb1
Binary files /dev/null and b/htmltest/modules/simpletest/tests/upgrade/drupal-7.filled.minimal.database.php.gz differ
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-7.filled.standard_all.database.php.gz b/htmltest/modules/simpletest/tests/upgrade/drupal-7.filled.standard_all.database.php.gz
new file mode 100644
index 00000000..472eedb2
Binary files /dev/null and b/htmltest/modules/simpletest/tests/upgrade/drupal-7.filled.standard_all.database.php.gz differ
diff --git a/htmltest/modules/simpletest/tests/upgrade/drupal-7.trigger.database.php b/htmltest/modules/simpletest/tests/upgrade/drupal-7.trigger.database.php
new file mode 100644
index 00000000..996f711d
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/drupal-7.trigger.database.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * @file
+ * Test content for the trigger upgrade path.
+ */
+
+// Add several trigger configurations.
+db_insert('trigger_assignments')->fields(array(
+  'hook',
+  'aid',
+  'weight',
+))
+->values(array(
+  'hook' => 'node_presave',
+  'aid' => 'node_publish_action',
+  'weight' => '1',
+))
+->values(array(
+  'hook' => 'comment_presave',
+  'aid' => 'comment_publish_action',
+  'weight' => '1',
+))
+->values(array(
+  'hook' => 'comment_delete',
+  'aid' => 'node_save_action',
+  'weight' => '1',
+))
+->execute();
diff --git a/htmltest/modules/simpletest/tests/upgrade/update.aggregator.test b/htmltest/modules/simpletest/tests/upgrade/update.aggregator.test
new file mode 100644
index 00000000..d4135774
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/update.aggregator.test
@@ -0,0 +1,47 @@
+<?php
+/**
+ * @file
+ * Tests schema changes in aggregator.module.
+ */
+class AggregatorUpdatePathTestCase extends UpdatePathTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Aggregator update path',
+      'description' => 'Aggregator update path tests.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Use the normal installation and add our feed data.
+    $path = drupal_get_path('module', 'simpletest') . '/tests/upgrade';
+    $this->databaseDumpFiles = array(
+      $path . '/drupal-7.bare.standard_all.database.php.gz',
+      $path . '/drupal-7.aggregator.database.php',
+    );
+    parent::setUp();
+
+    // Our test data only relies on aggregator.module.
+    $this->uninstallModulesExcept(array('aggregator'));
+  }
+
+  /**
+   * Tests that the aggregator.module update is successful.
+   */
+  public function testAggregatorUpdate() {
+    // Get a selection of the fields affected by the schema update.
+    $query = db_select('aggregator_feed', 'af');
+    $query->join('aggregator_item', 'ai', 'af.fid = ai.fid');
+    $query
+      ->fields('af', array('url', 'link'))
+      ->fields('ai', array('link', 'guid'));
+
+    $pre_update_data = $query->execute()->fetchAll();
+    $this->assertTrue($this->performUpgrade(), 'The update was completed successfully.');
+    $post_update_data = $query->execute()->fetchAll();
+
+    $this->assertTrue($pre_update_data == $post_update_data, 'Feed data was preserved during the update.');
+  }
+
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/update.field.test b/htmltest/modules/simpletest/tests/upgrade/update.field.test
new file mode 100644
index 00000000..a4b11c3a
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/update.field.test
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * @file
+ * Provides update path tests for the Field module.
+ */
+
+/**
+ * Tests the Field 7.0 -> 7.x update path.
+ */
+class FieldUpdatePathTestCase extends UpdatePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Field update path',
+      'description' => 'Field update path tests.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Use the filled update path and our field data.
+    $path = drupal_get_path('module', 'simpletest') . '/tests/upgrade';
+    $this->databaseDumpFiles = array(
+      $path . '/drupal-7.filled.standard_all.database.php.gz',
+      $path . '/drupal-7.field.database.php',
+    );
+    parent::setUp();
+
+    // Our test data includes poll extra field settings.
+    $this->uninstallModulesExcept(array('field', 'poll'));
+  }
+
+  /**
+   * Tests that the update is successful.
+   */
+  public function testFilledUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The update was completed successfully.');
+    $expected_settings = array(
+      'extra_fields' => array(
+        'display' => array(
+          'poll_view_voting' => array(
+            'default' => array(
+              'weight' => '0',
+              'visible' => TRUE,
+            ),
+          ),
+          'poll_view_results' => array(
+            'default' => array(
+              'weight' => '0',
+              'visible' => FALSE,
+            ),
+          ),
+        ),
+        'form' => array(),
+      ),
+      'view_modes' => array(),
+    );
+    $actual_settings = field_bundle_settings('node', 'poll');
+    $this->assertEqual($expected_settings, $actual_settings, 'Settings stored in field_bundle_settings were updated to per-bundle settings.');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/update.trigger.test b/htmltest/modules/simpletest/tests/upgrade/update.trigger.test
new file mode 100644
index 00000000..24ac87ca
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/update.trigger.test
@@ -0,0 +1,37 @@
+<?php
+/**
+ * @file
+ * Provides upgrade path tests for the Trigger module.
+ */
+
+/**
+ * Tests the Trigger 7.0 -> 7.x upgrade path.
+ */
+class TriggerUpdatePathTestCase extends UpdatePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Trigger update path',
+      'description'  => 'Trigger update path tests.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Use the filled upgrade path and our trigger data.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-7.filled.standard_all.database.php.gz',
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-7.trigger.database.php',
+    );
+    parent::setUp();
+
+    // Our test data includes node and comment trigger assignments.
+    $this->uninstallModulesExcept(array('comment', 'trigger'));
+  }
+
+  /**
+   * Tests that the upgrade is successful.
+   */
+  public function testFilledUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/update.user.test b/htmltest/modules/simpletest/tests/upgrade/update.user.test
new file mode 100644
index 00000000..dd0fc1b8
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/update.user.test
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @file
+ * Provides update path tests for the User module.
+ */
+
+/**
+ * Tests the User 7.0 -> 7.x update path.
+ */
+class UserUpdatePathTestCase extends UpdatePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'User update path',
+      'description' => 'User update path tests.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Use the filled update path and our field data.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-7.filled.standard_all.database.php.gz',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Tests that the update is successful.
+   */
+  public function testFilledUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The update was completed successfully.');
+    $this->assertTrue(db_index_exists('users', 'picture'), 'The {users}.picture column has an index.');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/upgrade.comment.test b/htmltest/modules/simpletest/tests/upgrade/upgrade.comment.test
new file mode 100644
index 00000000..40d893a8
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/upgrade.comment.test
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * Upgrade test for comment.module.
+ */
+class CommentUpgradePathTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Comment upgrade path',
+      'description'  => 'Comment upgrade path tests.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.comments.database.php',
+    );
+    parent::setUp();
+
+    $this->uninstallModulesExcept(array('comment'));
+  }
+
+  /**
+   * Test a successful upgrade.
+   */
+  public function testCommentUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/upgrade.filter.test b/htmltest/modules/simpletest/tests/upgrade/upgrade.filter.test
new file mode 100644
index 00000000..584f4d94
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/upgrade.filter.test
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * Upgrade test for filter format identifiers.
+ *
+ * Filter format identifiers changed from sequential ids to machine names.
+ * Verify that filter formats and references to filter formats in core are
+ * converted properly.
+ */
+class FilterFormatUpgradePathTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Filter format upgrade path',
+      'description' => 'Verifies that filter formats and references to filter formats are converted properly.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  function setUp() {
+    // Path to the database dump.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Test a successful upgrade.
+   */
+  function testFilterFormatUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    $format = filter_format_load('1');
+    $this->assertTrue($format->format == '1', 'Filter format found.');
+    $format->format = 'test_filter';
+    $format->name = 'Test filter';
+    filter_format_save($format);
+    $format = filter_format_load('test_filter');
+    $this->assertTrue($format->format == 'test_filter', 'Saved a filter format with machine name.');
+
+    $account = user_load(4);
+    user_save($account, array('signature_format' => 'test_filter'));
+    $account = user_load(4);
+    $this->assertTrue($account->signature_format == 'test_filter', 'Signature format changed successfully to a filter format with machine name.');
+
+    $delta = db_insert('block_custom')
+      ->fields(array(
+        'body' => 'Test block',
+        'info' => 'Test block',
+        'format' => 'test_filter',
+      ))
+      ->execute();
+    $this->assertTrue($delta > 0, 'Created a custom block using a filter format with machine name.');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/upgrade.forum.test b/htmltest/modules/simpletest/tests/upgrade/upgrade.forum.test
new file mode 100644
index 00000000..b0bbd4ed
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/upgrade.forum.test
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * Upgrade test for forum.module.
+ */
+class ForumUpgradePathTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Forum upgrade path',
+      'description'  => 'Upgrade path tests for the Forum module.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.forum.database.php',
+    );
+    parent::setUp();
+
+    $this->uninstallModulesExcept(array('comment', 'forum', 'taxonomy'));
+  }
+
+  /**
+   * Test a successful upgrade (no negotiation).
+   */
+  public function testForumUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // Work around http://drupal.org/node/931512
+    $this->drupalPost('admin/structure/types/manage/forum/fields', array(), t('Save'));
+
+    // The D6 database forum vocabulary contains the term "Fruits" with id 81.
+    $tid = 81;
+    $this->drupalGet("forum/$tid");
+
+    // There is one forum topic in Fruits, with the title "Apples".
+    $this->clickLink('Apples');
+    $this->clickLink('Edit');
+
+    // Add a forum topic "Bananas" to the "Fruits" forum.
+    $edit = array(
+      'title' => $title = 'Bananas',
+      'body[' . LANGUAGE_NONE . '][0][value]' => $body = 'It is another fruit.',
+    );
+    $this->drupalPost("node/add/forum/$tid", $edit, t('Save'));
+    $type = t('Forum topic');
+    $this->assertRaw(t('@type %title has been created.', array('@type' => $type, '%title' => $title)), 'Forum topic was created');
+
+    // Retrieve node object, ensure that the topic was created and in the proper forum.
+    $node = $this->drupalGetNodeByTitle($title);
+    $this->assertTrue($node != NULL, format_string('Node @title was loaded', array('@title' => $title)));
+    $this->assertEqual($node->taxonomy_forums[LANGUAGE_NONE][0]['tid'], $tid, 'Saved forum topic was in the expected forum');
+
+    $this->drupalGet("forum/$tid");
+    $this->assertText('Bananas');
+    $this->drupalLogout();
+
+    $this->drupalGet("node/add/forum/$tid");
+    $this->assertResponse(200, 'User can access forum creation page.');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/upgrade.locale.test b/htmltest/modules/simpletest/tests/upgrade/upgrade.locale.test
new file mode 100644
index 00000000..2a3056b0
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/upgrade.locale.test
@@ -0,0 +1,143 @@
+<?php
+
+/**
+ * Upgrade test for locale.module.
+ */
+class LocaleUpgradePathTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Locale upgrade path',
+      'description'  => 'Upgrade path tests for the Locale module.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.locale.database.php',
+    );
+    parent::setUp();
+
+    $this->uninstallModulesExcept(array('locale', 'comment'));
+  }
+
+  /**
+   * Test a successful upgrade (no negotiation).
+   */
+  public function testLocaleUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // The home page should be in French.
+    $this->assertPageInLanguage('', 'fr');
+
+    // No prefixed page should exist.
+    $this->drupalGet('en');
+    $this->assertResponse(404);
+    $this->drupalGet('fr');
+    $this->assertResponse(404);
+  }
+
+  /**
+   * Test an upgrade with path-based negotiation.
+   */
+  public function testLocaleUpgradePathDefault() {
+    // LANGUAGE_NEGOTIATION_PATH_DEFAULT.
+    $this->variable_set('language_negotiation', 1);
+
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // The home page should be in French.
+    $this->assertPageInLanguage('', 'fr');
+
+    // The language switcher block should be displayed.
+    $this->assertRaw('block-locale-language', 'The language switcher block is displayed.');
+
+    // The French prefix should not be active because French is the default language.
+    $this->drupalGet('fr');
+    $this->assertResponse(404);
+
+    // The English prefix should be active.
+    $this->assertPageInLanguage('en', 'en');
+  }
+
+  /**
+   * Test an upgrade with path-based (with fallback) negotiation.
+   */
+  public function testLocaleUpgradePathFallback() {
+    // LANGUAGE_NEGOTIATION_PATH.
+    $this->variable_set('language_negotiation', 2);
+
+    // Set the language of the admin user to English.
+    db_update('users')
+      ->fields(array('language' => 'en'))
+      ->condition('uid', 1)
+      ->execute();
+
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // Both prefixes should be active.
+    $this->assertPageInLanguage('fr', 'fr');
+    $this->assertPageInLanguage('en', 'en');
+
+    // The home page should be in the admin user language.
+    $this->assertPageInLanguage('', 'en');
+
+    // The language switcher block should be displayed.
+    $this->assertRaw('block-locale-language', 'The language switcher block is displayed.');
+  }
+
+  /**
+   * Test an upgrade with domain-based negotiation.
+   */
+  public function testLocaleUpgradeDomain() {
+    // LANGUAGE_NEGOTIATION_DOMAIN.
+    $this->variable_set('language_negotiation', 3);
+
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // The home page should be in French.
+    $this->assertPageInLanguage('', 'fr');
+
+    // The language switcher block should be displayed.
+    $this->assertRaw('block-locale-language', 'The language switcher block is displayed.');
+
+    // The language switcher block should point to http://en.example.com.
+    $language_links = $this->xpath('//ul[contains(@class, :class)]/li/a', array(':class' => 'language-switcher-locale-url'));
+    $found_english_link = FALSE;
+    foreach ($language_links as $link) {
+      if ((string) $link['href'] == 'http://en.example.com/') {
+        $found_english_link = TRUE;
+      }
+    }
+    $this->assertTrue($found_english_link, 'The English link points to the correct domain.');
+
+    // Both prefixes should be inactive.
+    $this->drupalGet('en');
+    $this->assertResponse(404);
+    $this->drupalGet('fr');
+    $this->assertResponse(404);
+
+  }
+
+  /**
+   * Asserts that a page exists and is in the specified language.
+   */
+  public function assertPageInLanguage($path = NULL, $langcode) {
+    if (isset($path)) {
+      $this->drupalGet($path);
+    }
+
+    if (!$this->assertResponse(200)) {
+      return FALSE;
+    }
+
+    if ($this->parse()) {
+      return $this->assertIdentical($langcode, (string) $this->elements['xml:lang']);
+    }
+    else {
+      return FALSE;
+    }
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/upgrade.menu.test b/htmltest/modules/simpletest/tests/upgrade/upgrade.menu.test
new file mode 100644
index 00000000..d9ae6c1b
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/upgrade.menu.test
@@ -0,0 +1,83 @@
+<?php
+
+/**
+ * Upgrade test for menu.module.
+ */
+class MenuUpgradePathTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Menu upgrade path',
+      'description'  => 'Menu upgrade path tests.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.menu.database.php',
+    );
+    parent::setUp();
+
+    $this->uninstallModulesExcept(array('menu'));
+  }
+
+  /**
+   * Test a successful upgrade.
+   */
+  public function testMenuUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // Test the migration of "Default menu for content" setting to individual
+    // node types.
+    $this->drupalGet('admin/structure/types/manage/page/edit');
+    $this->assertNoFieldChecked('edit-menu-options-management', 'Management menu is not selected as available menu');
+    $this->assertNoFieldChecked('edit-menu-options-navigation', 'Navigation menu is not selected as available menu');
+    $this->assertNoFieldChecked('edit-menu-options-main-menu', 'Main menu is not selected as available menu');
+    $this->assertFieldChecked('edit-menu-options-secondary-menu', 'Secondary menu is selected as available menu');
+    $this->assertNoFieldChecked('edit-menu-options-user-menu', 'User menu is not selected as available menu');
+    $this->assertOptionSelected('edit-menu-parent', 'secondary-menu:0', 'Secondary menu is selected as default parent item');
+
+    $this->assertEqual(variable_get('menu_default_node_menu'), NULL, 'Redundant variable menu_default_node_menu has been removed');
+
+    // Verify Primary/Secondary Links have been renamed.
+    $this->drupalGet('admin/structure/menu');
+    $this->assertNoLinkByHref('admin/structure/menu/manage/primary-links');
+    $this->assertLinkByHref('admin/structure/menu/manage/main-menu');
+    $this->assertNoLinkByHref('admin/structure/menu/manage/secondary-links');
+    $this->assertLinkByHref('admin/structure/menu/manage/secondary-menu');
+
+    // Verify the existence of all system-defined (default) menus.
+    foreach (menu_list_system_menus() as $menu_name => $title) {
+      $this->assertLinkByHref('admin/structure/menu/manage/' . $menu_name, 0, 'Found default menu: ' . $title);
+    }
+
+    // Verify a few known links are still present, plus the ones created here.
+    $test_menus = array(
+      'navigation' => array('Add content', 'nodeadd-navigation'),
+      'management' => array('Administration', 'Account settings'),
+      'user-menu' => array('My account', 'Log out'),
+      'main-menu' => array('nodeadd-primary'),
+      'secondary-menu' => array('nodeadd-secondary'),
+    );
+
+    foreach ($test_menus as $menu_name => $links) {
+      $this->drupalGet('admin/structure/menu/manage/' . $menu_name);
+      $this->assertResponse(200, 'Access menu management for ' . $menu_name);
+      foreach ($links as $link_text) {
+        $this->assertLink(t($link_text));
+      }
+    }
+
+    // Check the "source for primary/secondary links" setting.
+    $this->drupalGet('admin/structure/menu/settings');
+    $this->assertOptionSelected('edit-menu-main-links-source', 'secondary-menu');
+    $this->assertOptionSelected('edit-menu-secondary-links-source', 'main-menu');
+
+    // Check that both primary/secondary links blocks are visible.
+    $this->drupalGet('node');
+    $this->assertText('My Primary Links', '(Formerly) Primary Links block is still visible');
+    $this->assertText('My Secondary Links', '(Formerly) Secondary Links block is still visible');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/upgrade.node.test b/htmltest/modules/simpletest/tests/upgrade/upgrade.node.test
new file mode 100644
index 00000000..4ac14c57
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/upgrade.node.test
@@ -0,0 +1,148 @@
+<?php
+
+/**
+ * Upgrade test for node bodies.
+ *
+ * Load a filled installation of Drupal 6 and run the upgrade process on it.
+ */
+class NodeBodyUpgradePathTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Node body upgrade path',
+      'description'  => 'Node body upgrade path tests.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Test a successful upgrade.
+   */
+  public function testNodeBodyUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    $instance = field_info_instance('node', 'body', 'story');
+    $this->assertIdentical($instance['required'], 0, 'The required setting was preserved during the upgrade path.');
+    $this->assertTrue($instance['description'], 'The description was preserved during the upgrade path');
+
+    $this->drupalGet("content/1263769200");
+    $this->assertText('node body (broken) - 37');
+
+    // Find a published node revision and make sure it still has a body.
+    $revision = db_query_range("SELECT r.nid, r.vid FROM {node_revision} r JOIN {node} n ON n.nid = r.nid WHERE n.status = 1 AND n.type <> 'poll' AND n.vid <> r.vid", 0, 1)->fetch();
+    $revision = node_load($revision->nid, $revision->vid);
+    $this->assertTrue(!empty($revision->body), 'Non-current node revisions still have a node body.');
+    // Find an unpublished node revision and make sure it still has a body.
+    $revision = db_query_range("SELECT r.nid, r.vid FROM {node_revision} r JOIN {node} n ON n.nid = r.nid WHERE n.status = 0 AND n.type <> 'poll' AND n.vid <> r.vid", 0, 1)->fetch();
+    $revision = node_load($revision->nid, $revision->vid);
+    $this->assertTrue(!empty($revision->body), 'Unpublished non-current node revisions still have a node body.');
+
+    // Check that fields created during the upgrade can be edited and resaved
+    // in the UI.
+    $this->drupalPost('admin/structure/types/manage/story/fields/body', array(), t('Save settings'));
+  }
+}
+
+/**
+ * Tests the upgrade path for node disabled node types.
+ *
+ * Load a filled installation of Drupal 6 and run the upgrade process on it.
+ */
+class DisabledNodeTypeTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Disabled node type upgrade path',
+      'description'  => 'Disabled node type upgrade path tests.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.node_type_broken.database.php',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Tests a successful upgrade.
+   */
+  public function testDisabledNodeTypeUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+    $this->assertTrue(field_info_instance('comment', 'comment_body', 'comment_node_broken'), 'Comment body field instance was created for comments attached to the disabled broken node type');
+  }
+}
+
+/**
+ * Upgrade test for node type poll.
+ *
+ * Load a bare installation of Drupal 6 and run the upgrade process on it.
+ *
+ * The install only contains dblog (although it's optional, it's only so that
+ * another hook_watchdog module can take its place, the site is not functional
+ * without watchdog) and update.
+ */
+class PollUpgradePathTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Poll upgrade path',
+      'description'  => 'Poll upgrade path tests.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
+    );
+    parent::setUp();
+
+    $this->uninstallModulesExcept(array('poll'));
+  }
+
+  /**
+   * Test a successful upgrade.
+   */
+  public function testPollUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // Check modules page for poll
+    $this->drupalGet('admin/modules');
+
+    // Verify that the poll data is still correctly available
+    for ($i = 0; $i < 12; $i++) {
+      $this->drupalGet("content/poll/$i");
+
+      $nbchoices = ($i % 4) + 2;
+
+      for ($c = 0; $c < $nbchoices; $c++) {
+        $this->assertText("Choice $c for poll $i", 'Choice text is displayed correctly on poll view');
+      }
+
+      // Now check that the votes are correct
+      $this->clickLink(t('Results'));
+
+      for ($c = 0; $c < $nbchoices; $c++) {
+        $this->assertText("Choice $c for poll $i", 'Choice text is displayed correctly on result view');
+      }
+
+      $nbvotes = floor (($i % 4) + 5);
+      $elements = $this->xpath("//div[@class='percent']");
+      for ($c = 0; $c < $nbchoices; $c++) {
+        $votes = floor($nbvotes / $nbchoices);
+        if (($nbvotes % $nbchoices) > $c) $votes++;
+        $this->assertTrue(preg_match("/$votes vote/", $elements[$c]), 'The number of votes is displayed correctly: expected ' . $votes . ', got ' . $elements[$c]);
+      }
+    }
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/upgrade.poll.test b/htmltest/modules/simpletest/tests/upgrade/upgrade.poll.test
new file mode 100644
index 00000000..ac4ea436
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/upgrade.poll.test
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * Upgrade test for poll.module.
+ *
+ * Load a bare installation of Drupal 6 and run the upgrade process on it.
+ *
+ * The install only contains dblog (although it's optional, it's only so that
+ * another hook_watchdog module can take its place, the site is not functional
+ * without watchdog) and update.
+ */
+class PollUpgradePathTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Poll upgrade path',
+      'description'  => 'Poll upgrade path tests.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
+    );
+    parent::setUp();
+
+    $this->uninstallModulesExcept(array('poll'));
+  }
+
+  /**
+   * Test a successful upgrade.
+   */
+  public function testPollUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // Check modules page for poll
+    $this->drupalGet('admin/modules');
+
+    // Verify that the poll data is still correctly available
+    for ($i = 0; $i < 12; $i++) {
+      $this->drupalGet("content/poll/$i");
+
+      $nbchoices = ($i % 4) + 2;
+
+      for ($c = 0; $c < $nbchoices; $c++) {
+        $this->assertText("Choice $c for poll $i", 'Choice text is displayed correctly on poll view');
+      }
+
+      // Now check that the votes are correct
+      $this->clickLink(t('Results'));
+
+      for ($c = 0; $c < $nbchoices; $c++) {
+        $this->assertText("Choice $c for poll $i", 'Choice text is displayed correctly on result view');
+      }
+
+      $nbvotes = floor (($i % 4) + 5);
+      $elements = $this->xpath("//div[@class='percent']");
+      for ($c = 0; $c < $nbchoices; $c++) {
+        $votes = floor($nbvotes / $nbchoices);
+        if (($nbvotes % $nbchoices) > $c) $votes++;
+        $this->assertTrue(preg_match("/$votes vote/", $elements[$c]), 'The number of votes is displayed correctly: expected ' . $votes . ', got ' . $elements[$c]);
+      }
+    }
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/upgrade.taxonomy.test b/htmltest/modules/simpletest/tests/upgrade/upgrade.taxonomy.test
new file mode 100644
index 00000000..e0142f4b
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/upgrade.taxonomy.test
@@ -0,0 +1,196 @@
+<?php
+
+/**
+ * Test taxonomy upgrades.
+ */
+class UpgradePathTaxonomyTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Taxonomy upgrade path',
+      'description'  => 'Taxonomy upgrade path tests.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump.
+    $this->databaseDumpFiles = array(
+     drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Retrieve an array mapping allowed vocabulary id to field name for
+   * all taxonomy_term_reference fields for which an instance exists
+   * for the specified entity type and bundle.
+   */
+  function instanceVocabularies($entity_type, $bundle) {
+    $instances = array();
+    foreach (field_info_instances($entity_type, $bundle) as $instance) {
+      $field = field_info_field($instance['field_name']);
+      if ($field['type'] == 'taxonomy_term_reference') {
+        foreach ($field['settings']['allowed_values'] as $tree) {
+          // Prefer valid taxonomy term reference fields for a given vocabulary
+          // when they exist.
+          if (empty($instances[$tree['vocabulary']]) || $instances[$tree['vocabulary']] == 'taxonomyextra') {
+            $instances[$tree['vocabulary']] = $field['field_name'];
+          }
+        }
+      }
+    }
+    return $instances;
+  }
+
+  /**
+   * Basic tests for the taxonomy upgrade.
+   */
+  public function testTaxonomyUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // Visit the front page to assert for PHP warning and errors.
+    $this->drupalGet('');
+
+    // Check that taxonomy_vocabulary_node_type and taxonomy_term_node have been
+    // removed.
+    $this->assertFalse(db_table_exists('taxonomy_vocabulary_node_type'), 'taxonomy_vocabulary_node_type has been removed.');
+    $this->assertFalse(db_table_exists('taxonomy_term_node'), 'taxonomy_term_node has been removed.');
+
+    // Check that the node type 'page' has been associated to a taxonomy
+    // reference field for each vocabulary.
+    $voc_keys = array();
+    foreach (taxonomy_get_vocabularies() as $vocab) {
+      $voc_keys[] = $vocab->machine_name;
+    }
+    $instances = $this->instanceVocabularies('node', 'page');
+    $inst_keys = array_keys($instances);
+    sort($voc_keys);
+    sort($inst_keys);
+    $this->assertEqual($voc_keys, $inst_keys, 'Node type page has instances for every vocabulary.');
+
+    // Ensure instance variables are getting through.
+    foreach ($instances as $instance) {
+      $this->assertTrue(isset($instance['required']), 'The required setting was preserved during the upgrade path.');
+      $this->assertTrue($instance['description'], 'The description was preserved during the upgrade path');
+    }
+
+    // Node type 'story' was not explicitly in $vocabulary->nodes but
+    // each node of type 'story' was associated to one or more terms.
+    // Check that the node type 'story' has been associated only to
+    // the taxonomyextra field.
+    $instances = $this->instanceVocabularies('node', 'story');
+    $field_names = array_flip($instances);
+    $this->assertEqual(count($field_names), 1, 'Only one taxonomy term field instance exists for story nodes');
+    $this->assertEqual(key($field_names), 'taxonomyextra', 'Only the excess taxonomy term field is used on story nodes');
+
+    // Check that the node type 'poll' has been associated to no taxonomy
+    // reference field.
+    $instances = $this->instanceVocabularies('node', 'poll');
+    $this->assertTrue(empty($instances), 'Node type poll has no taxonomy term reference field instances.');
+
+    // Check that each node of type 'page' and 'story' is associated to all the
+    // terms except terms whose ID is equal to the node ID or is equal to the
+    // node ID subtracted from 49.
+    $nodes = node_load_multiple(array(), array('type' => 'page'));
+    $nodes += node_load_multiple(array(), array('type' => 'story'));
+    $terms = db_select('taxonomy_term_data', 'td')
+      ->fields('td')
+      ->orderBy('vid')
+      ->orderBy('tid')
+      ->execute()
+      ->fetchAllAssoc('tid');
+    field_attach_prepare_view('node', $nodes, 'full');
+    foreach ($nodes as $nid => $node) {
+      $node->content = field_attach_view('node', $node, 'full');
+      $render = drupal_render($node->content);
+      $this->drupalSetContent($render);
+      $this->verbose($render);
+
+      $vocabulary_seen = array();
+      foreach ($terms as $tid => $term) {
+        // In our test database, each node is arbitrary associated with all
+        // terms except two: one whose tid is ($nid) and one whose tid is
+        // (49 - $nid).
+        $should_be_displayed = ($tid != $nid) && ($tid + $nid != 49);
+
+        // Only vocabularies 13 to 24 are properly associated with the node
+        // type 'page'. All other node types are not associated with any
+        // vocabulary, but still are associated with terms. Those terms
+        // will be moved to the taxonomy extra field.
+        if ($node->type == 'page' && $term->vid >= 13 && $term->vid <= 24) {
+          $vocabulary = taxonomy_vocabulary_load($term->vid);
+          $field_class = 'field-name-' . strtr('taxonomy_' . $vocabulary->machine_name, '_', '-');;
+        }
+        else {
+          $field_class = 'field-name-taxonomyextra';
+        }
+
+        // Odd vocabularies are single, so any additional term will be moved
+        // to the taxonomy extra field.
+        if ($should_be_displayed) {
+          if ($term->vid % 2 == 1 && !empty($vocabulary_seen[$term->vid])) {
+            $field_class = 'field-name-taxonomyextra';
+          }
+          $vocabulary_seen[$term->vid] = TRUE;
+        }
+
+        $args = array(
+          '%name' => $term->name,
+          '@field' => $field_class,
+          '%nid' => $nid,
+        );
+
+        // Use link rather than term name because migrated term names can be
+        // substrings of other term names. e.g. "term 1 of vocabulary 2" is
+        // found when "term 1 of vocabulary 20" is output.
+        $term_path = url('taxonomy/term/' . $term->tid);
+        if (!$should_be_displayed) {
+          // Look for any link with the term path.
+          $links = $this->xpath('//a[@href=:term_path]', array(':term_path' => $term_path));
+          $this->assertFalse($links, format_string('Term %name (@field) is not displayed on node %nid', $args));
+        }
+        else {
+          // Look for a link with the term path inside the correct field.
+          // We search for "SPACE + class + SPACE" to avoid matching a substring
+          // of the class.
+          $links = $this->xpath('//div[contains(concat(" ", normalize-space(@class), " "), :field_class)]//a[@href=:term_path]', array(':field_class' => ' ' . $field_class . ' ', ':term_path' => $term_path));
+          $this->assertTrue($links, format_string('Term %name (@field) is displayed on node %nid', $args));
+        }
+      }
+
+      // nid 1, revision 1 had a bogus record in {term_node} pointing to term
+      // ID 0. Make sure we ignored this instead of generating a bogus term.
+      if ($node->nid == 1) {
+        $link = l($term->name, 'taxonomy/term/0');
+        $this->assertNoRaw($link, format_string('Bogus term (tid 0) is not displayed on node 1 vid %old_vid.', $args));
+      }
+
+      // The first 12 nodes have two revisions. For nodes with
+      // revisions, check that the oldest revision is associated only
+      // to terms whose ID is equal to the node ID or 49 less the node ID.
+      $revisions = node_revision_list($node);
+      if ($node->nid < 13) {
+        $this->assertEqual(count($revisions), 2, format_string('Node %nid has two revisions.', $args));
+        $last_rev = end($revisions);
+        $args['%old_vid'] = $last_rev->vid;
+
+        $node_old = node_load($node->nid, $last_rev->vid);
+        field_attach_prepare_view('node', array($node_old->nid => $node_old), 'full');
+        $node_old->content = field_attach_view('node', $node_old, 'full');
+        $render = drupal_render($node_old->content);
+        $this->drupalSetContent($render);
+        $this->verbose($render);
+
+        $term = $terms[$node->nid];
+        $link = l($term->name, 'taxonomy/term/' . $term->tid);
+        $this->assertRaw($link, format_string('Term %name (@field) is displayed on node %nid vid %old_vid.', $args));
+        $term = $terms[49-$node->nid];
+        $link = l($term->name, 'taxonomy/term/' . $term->tid);
+        $this->assertRaw($link, format_string('Term %name (@field) is displayed on node %nid %old_vid.', $args));
+      }
+      else {
+        $this->assertEqual(count($revisions), 1, format_string('Node %nid has one revision.', $args));
+      }
+    }
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/upgrade.test b/htmltest/modules/simpletest/tests/upgrade/upgrade.test
new file mode 100644
index 00000000..784a0917
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/upgrade.test
@@ -0,0 +1,737 @@
+<?php
+
+/**
+ * Perform end-to-end tests of the upgrade path.
+ */
+abstract class UpgradePathTestCase extends DrupalWebTestCase {
+
+  /**
+   * The file path(s) to the dumped database(s) to load into the child site.
+   *
+   * @var array
+   */
+  var $databaseDumpFiles = array();
+
+  /**
+   * Flag that indicates whether the child site has been upgraded.
+   */
+  var $upgradedSite = FALSE;
+
+  /**
+   * Array of errors triggered during the upgrade process.
+   */
+  var $upgradeErrors = array();
+
+  /**
+   * Array of modules loaded when the test starts.
+   */
+  var $loadedModules = array();
+
+  /**
+   * Flag to indicate whether zlib is installed or not.
+   */
+  var $zlibInstalled = TRUE;
+
+  /**
+   * Flag to indicate whether there are pending updates or not.
+   */
+  var $pendingUpdates = TRUE;
+
+  /**
+   * Constructs an UpgradePathTestCase object.
+   *
+   * @param $test_id
+   *   (optional) The ID of the test. Tests with the same id are reported
+   *   together.
+   */
+  function __construct($test_id = NULL) {
+    parent::__construct($test_id);
+    $this->zlibInstalled = function_exists('gzopen');
+  }
+
+  /**
+   * Prepares the appropriate session for the release of Drupal being upgraded.
+   */
+  protected function prepareD7Session() {
+    // Generate and set a D6-compatible session cookie.
+    $this->curlInitialize();
+    $sid = drupal_hash_base64(uniqid(mt_rand(), TRUE) . drupal_random_bytes(55));
+    $session_name = update_get_d6_session_name();
+    curl_setopt($this->curlHandle, CURLOPT_COOKIE, rawurlencode($session_name) . '=' . rawurlencode($sid));
+
+    // Force our way into the session of the child site.
+    drupal_save_session(TRUE);
+    // A session cannot be written without the ssid column which is missing on
+    // Drupal 6 sites.
+    db_add_field('sessions', 'ssid', array('description' => "Secure session ID. The value is generated by Drupal's session handlers.", 'type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''));
+    _drupal_session_write($sid, '');
+    // Remove the temporarily added ssid column.
+    db_drop_field('sessions', 'ssid');
+    drupal_save_session(FALSE);
+  }
+
+  /**
+   * Overrides DrupalWebTestCase::setUp() for upgrade testing.
+   *
+   * @see DrupalWebTestCase::prepareDatabasePrefix()
+   * @see DrupalWebTestCase::changeDatabasePrefix()
+   * @see DrupalWebTestCase::prepareEnvironment()
+   */
+  protected function setUp() {
+    // We are going to set a missing zlib requirement property for usage
+    // during the performUpgrade() and tearDown() methods. Also set that the
+    // tests failed.
+    if (!$this->zlibInstalled) {
+      parent::setUp();
+      return;
+    }
+
+    global $user, $language, $conf;
+
+    // Load the Update API.
+    require_once DRUPAL_ROOT . '/includes/update.inc';
+
+    // Reset flags.
+    $this->upgradedSite = FALSE;
+    $this->upgradeErrors = array();
+
+    $this->loadedModules = module_list();
+
+    // Create the database prefix for this test.
+    $this->prepareDatabasePrefix();
+
+    // Prepare the environment for running tests.
+    $this->prepareEnvironment();
+    if (!$this->setupEnvironment) {
+      return FALSE;
+    }
+
+    // Reset all statics and variables to perform tests in a clean environment.
+    $conf = array();
+    drupal_static_reset();
+
+    // Change the database prefix.
+    // All static variables need to be reset before the database prefix is
+    // changed, since DrupalCacheArray implementations attempt to
+    // write back to persistent caches when they are destructed.
+    $this->changeDatabasePrefix();
+    if (!$this->setupDatabasePrefix) {
+      return FALSE;
+    }
+
+    // Unregister the registry.
+    // This is required to make sure that the database layer works properly.
+    spl_autoload_unregister('drupal_autoload_class');
+    spl_autoload_unregister('drupal_autoload_interface');
+
+    // Load the database from the portable PHP dump.
+    // The files may be gzipped.
+    foreach ($this->databaseDumpFiles as $file) {
+      if (substr($file, -3) == '.gz') {
+        $file = "compress.zlib://$file";
+      }
+      require $file;
+    }
+
+    // Set path variables.
+    $this->variable_set('file_public_path', $this->public_files_directory);
+    $this->variable_set('file_private_path', $this->private_files_directory);
+    $this->variable_set('file_temporary_path', $this->temp_files_directory);
+
+    $this->pass('Finished loading the dump.');
+
+    // Ensure that the session is not written to the new environment and replace
+    // the global $user session with uid 1 from the new test site.
+    drupal_save_session(FALSE);
+    // Login as uid 1.
+    $user = db_query('SELECT * FROM {users} WHERE uid = :uid', array(':uid' => 1))->fetchObject();
+
+    // Generate and set a D6-compatible session cookie.
+    $this->prepareD7Session();
+
+    // Restore necessary variables.
+    $this->variable_set('clean_url', $this->originalCleanUrl);
+    $this->variable_set('site_mail', 'simpletest@example.com');
+
+    drupal_set_time_limit($this->timeLimit);
+    $this->setup = TRUE;
+  }
+
+  /**
+   * Specialized variable_set() that works even if the child site is not upgraded.
+   *
+   * @param $name
+   *   The name of the variable to set.
+   * @param $value
+   *   The value to set. This can be any PHP data type; these functions take care
+   *   of serialization as necessary.
+   */
+  protected function variable_set($name, $value) {
+    db_delete('variable')
+      ->condition('name', $name)
+      ->execute();
+    db_insert('variable')
+      ->fields(array(
+        'name' => $name,
+        'value' => serialize($value),
+      ))
+      ->execute();
+
+    try {
+      cache_clear_all('variables', 'cache');
+      cache_clear_all('variables', 'cache_bootstrap');
+    }
+    // Since cache_bootstrap won't exist in a Drupal 6 site, ignore the
+    // exception if the above fails.
+    catch (Exception $e) {}
+  }
+
+  /**
+   * Specialized refreshVariables().
+   */
+  protected function refreshVariables() {
+    // No operation if the child has not been upgraded yet.
+    if (!$this->upgradedSite) {
+      return parent::refreshVariables();
+    }
+  }
+
+  /**
+   * Perform the upgrade.
+   *
+   * @param $register_errors
+   *   Register the errors during the upgrade process as failures.
+   * @return
+   *   TRUE if the upgrade succeeded, FALSE otherwise.
+   */
+  protected function performUpgrade($register_errors = TRUE) {
+    if (!$this->zlibInstalled) {
+      $this->fail(t('Missing zlib requirement for upgrade tests.'));
+      return FALSE;
+    }
+
+    $update_url = $GLOBALS['base_url'] . '/update.php';
+
+    // Load the first update screen.
+    $this->drupalGet($update_url, array('external' => TRUE));
+    if (!$this->assertResponse(200)) {
+      return FALSE;
+    }
+
+    // Continue.
+    $this->drupalPost(NULL, array(), t('Continue'));
+    if (!$this->assertResponse(200)) {
+      return FALSE;
+    }
+
+    // The test should pass if there are no pending updates.
+    $content = $this->drupalGetContent();
+    if (strpos($content, t('No pending updates.')) !== FALSE) {
+      $this->pass(t('No pending updates and therefore no upgrade process to test.'));
+      $this->pendingUpdates = FALSE;
+      return TRUE;
+    }
+
+    // Go!
+    $this->drupalPost(NULL, array(), t('Apply pending updates'));
+    if (!$this->assertResponse(200)) {
+      return FALSE;
+    }
+
+    // Check for errors during the update process.
+    foreach ($this->xpath('//li[@class=:class]', array(':class' => 'failure')) as $element) {
+      $message = strip_tags($element->asXML());
+      $this->upgradeErrors[] = $message;
+      if ($register_errors) {
+        $this->fail($message);
+      }
+    }
+
+    if (!empty($this->upgradeErrors)) {
+      // Upgrade failed, the installation might be in an inconsistent state,
+      // don't process.
+      return FALSE;
+    }
+
+    // Check if there still are pending updates.
+    $this->drupalGet($update_url, array('external' => TRUE));
+    $this->drupalPost(NULL, array(), t('Continue'));
+    if (!$this->assertText(t('No pending updates.'), 'No pending updates at the end of the update process.')) {
+      return FALSE;
+    }
+
+    // Upgrade succeed, rebuild the environment so that we can call the API
+    // of the child site directly from this request.
+    $this->upgradedSite = TRUE;
+
+    // Reload module list. For modules that are enabled in the test database,
+    // but not on the test client, we need to load the code here.
+    $new_modules = array_diff(module_list(TRUE), $this->loadedModules);
+    foreach ($new_modules as $module) {
+      drupal_load('module', $module);
+    }
+
+    // Reload hook implementations
+    module_implements('', FALSE, TRUE);
+
+    // Rebuild caches.
+    drupal_static_reset();
+    drupal_flush_all_caches();
+
+    // Reload global $conf array and permissions.
+    $this->refreshVariables();
+    $this->checkPermissions(array(), TRUE);
+
+    return TRUE;
+  }
+
+  /**
+   * Force uninstall all modules from a test database, except those listed.
+   *
+   * @param $modules
+   *   The list of modules to keep installed. Required core modules will
+   *   always be kept.
+   */
+  protected function uninstallModulesExcept(array $modules) {
+    $required_modules = array('block', 'dblog', 'filter', 'node', 'system', 'update', 'user');
+
+    $modules = array_merge($required_modules, $modules);
+
+    db_delete('system')
+      ->condition('type', 'module')
+      ->condition('name', $modules, 'NOT IN')
+      ->execute();
+  }
+
+}
+
+/**
+ * Performs end-to-end point test of the release update path.
+ */
+abstract class UpdatePathTestCase extends UpgradePathTestCase {
+  /**
+   * Overrides UpgradePathTestCase::prepareD7Session().
+   */
+  protected function prepareD7Session() {
+    // Generate and set a D7-compatible session cookie.
+    $this->curlInitialize();
+    $sid = drupal_hash_base64(uniqid(mt_rand(), TRUE) . drupal_random_bytes(55));
+    curl_setopt($this->curlHandle, CURLOPT_COOKIE, rawurlencode(session_name()) . '=' . rawurlencode($sid));
+
+    // Force our way into the session of the child site.
+    drupal_save_session(TRUE);
+    _drupal_session_write($sid, '');
+    drupal_save_session(FALSE);
+  }
+}
+
+/**
+ * Perform basic upgrade tests.
+ *
+ * Load a bare installation of Drupal 6 and run the upgrade process on it.
+ *
+ * The install only contains dblog (although it's optional, it's only so that
+ * another hook_watchdog module can take its place, the site is not functional
+ * without watchdog) and update.
+ */
+class BasicUpgradePath extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Basic upgrade path',
+      'description'  => 'Basic upgrade path tests.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.bare.database.php',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Test a failed upgrade, and verify that the failure is reported.
+   */
+  public function testFailedUpgrade() {
+    // Destroy a table that the upgrade process needs.
+    db_drop_table('access');
+    // Assert that the upgrade fails.
+    $this->assertFalse($this->performUpgrade(FALSE) && $this->pendingUpdates, 'A failed upgrade should return messages.');
+  }
+
+  /**
+   * Test a successful upgrade.
+   */
+  public function testBasicUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // Hit the frontpage.
+    $this->drupalGet('');
+    $this->assertResponse(200);
+
+    // Verify that we are still logged in.
+    $this->drupalGet('user');
+    $this->clickLink(t('Edit'));
+    $this->assertEqual($this->getUrl(), url('user/1/edit', array('absolute' => TRUE)), 'We are still logged in as admin at the end of the upgrade.');
+
+    // Logout and verify that we can login back in with our initial password.
+    $this->drupalLogout();
+    $this->drupalLogin((object) array(
+      'uid' => 1,
+      'name' => 'admin',
+      'pass_raw' => 'admin',
+    ));
+
+    // The previous login should've triggered a password rehash, so login one
+    // more time to make sure the new hash is readable.
+    $this->drupalLogout();
+    $this->drupalLogin((object) array(
+      'uid' => 1,
+      'name' => 'admin',
+      'pass_raw' => 'admin',
+    ));
+
+    // Test that the site name is correctly displayed.
+    $this->assertText('Drupal 6', 'The site name is correctly displayed.');
+
+    // Verify that the main admin sections are available.
+    $this->drupalGet('admin');
+    $this->assertText(t('Content'));
+    $this->assertText(t('Appearance'));
+    $this->assertText(t('People'));
+    $this->assertText(t('Configuration'));
+    $this->assertText(t('Reports'));
+    $this->assertText(t('Structure'));
+    $this->assertText(t('Modules'));
+
+    // Confirm that no {menu_links} entry exists for user/autocomplete.
+    $result = db_query('SELECT COUNT(*) FROM {menu_links} WHERE link_path = :user_autocomplete', array(':user_autocomplete' => 'user/autocomplete'))->fetchField();
+    $this->assertFalse($result, 'No {menu_links} entry exists for user/autocomplete');
+
+    // Test that the environment after the upgrade is in a consistent status.
+    $update_d6 = variable_get('update_d6', FALSE);
+    $this->assertFalse($update_d6, 'The D6 upgrade flag variable has been correctly disabled.');
+  }
+}
+
+/**
+ * Performs point release update tests on a bare database.
+ *
+ * Loads an installation of Drupal 7.0 and runs the update process on it.
+ *
+ * The install contains the standard profile (plus all optional) modules
+ * without any content so that an update from any of the modules under this
+ * profile installation can be wholly tested.
+ */
+class BasicStandardUpdatePath extends UpdatePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Basic standard + all profile update path',
+      'description'  => 'Basic update path tests for a standard profile install with all enabled modules.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-7.bare.standard_all.database.php.gz',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Tests a successful point release update.
+   */
+  public function testBasicStandardUpdate() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // Hit the frontpage.
+    $this->drupalGet('');
+    $this->assertResponse(200);
+
+    // Verify that we are still logged in.
+    $this->drupalGet('user');
+    $this->clickLink(t('Edit'));
+    $this->assertEqual($this->getUrl(), url('user/1/edit', array('absolute' => TRUE)), 'We are still logged in as admin at the end of the upgrade.');
+
+    // Logout and verify that we can login back in with our initial password.
+    $this->drupalLogout();
+    $this->drupalLogin((object) array(
+      'uid' => 1,
+      'name' => 'admin',
+      'pass_raw' => 'admin',
+    ));
+
+    // The previous login should've triggered a password rehash, so login one
+    // more time to make sure the new hash is readable.
+    $this->drupalLogout();
+    $this->drupalLogin((object) array(
+      'uid' => 1,
+      'name' => 'admin',
+      'pass_raw' => 'admin',
+    ));
+
+    // Test that the site name is correctly displayed.
+    $this->assertText('Drupal', 'The site name is correctly displayed.');
+
+    // Verify that the main admin sections are available.
+    $this->drupalGet('admin');
+    $this->assertText(t('Content'));
+    $this->assertText(t('Appearance'));
+    $this->assertText(t('People'));
+    $this->assertText(t('Configuration'));
+    $this->assertText(t('Reports'));
+    $this->assertText(t('Structure'));
+    $this->assertText(t('Modules'));
+
+    // Confirm that no {menu_links} entry exists for user/autocomplete.
+    $result = db_query('SELECT COUNT(*) FROM {menu_links} WHERE link_path = :user_autocomplete', array(':user_autocomplete' => 'user/autocomplete'))->fetchField();
+    $this->assertFalse($result, 'No {menu_links} entry exists for user/autocomplete');
+  }
+}
+
+/**
+ * Performs point release update tests on a bare database.
+ *
+ * Loads an installation of Drupal 7.0 and runs the update process on it.
+ *
+ * The install contains the minimal profile modules (without any generated
+ * content) so that an update from of a site under this profile may be tested.
+ */
+class BasicMinimalUpdatePath extends UpdatePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Basic minimal profile update path',
+      'description'  => 'Basic update path tests for a minimal profile install.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-7.bare.minimal.database.php.gz',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Tests a successful point release update.
+   */
+  public function testBasicMinimalUpdate() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // Hit the frontpage.
+    $this->drupalGet('');
+    $this->assertResponse(200);
+
+    // Verify that we are still logged in.
+    $this->drupalGet('user');
+    $this->clickLink(t('Edit'));
+    $this->assertEqual($this->getUrl(), url('user/1/edit', array('absolute' => TRUE)), 'We are still logged in as admin at the end of the upgrade.');
+
+    // Logout and verify that we can login back in with our initial password.
+    $this->drupalLogout();
+    $this->drupalLogin((object) array(
+      'uid' => 1,
+      'name' => 'admin',
+      'pass_raw' => 'admin',
+    ));
+
+    // The previous login should've triggered a password rehash, so login one
+    // more time to make sure the new hash is readable.
+    $this->drupalLogout();
+    $this->drupalLogin((object) array(
+      'uid' => 1,
+      'name' => 'admin',
+      'pass_raw' => 'admin',
+    ));
+
+    // Test that the site name is correctly displayed.
+    $this->assertText('Drupal', 'The site name is correctly displayed.');
+
+    // Verify that the main admin sections are available.
+    $this->drupalGet('admin');
+    $this->assertText(t('Content'));
+    $this->assertText(t('Appearance'));
+    $this->assertText(t('People'));
+    $this->assertText(t('Configuration'));
+    $this->assertText(t('Reports'));
+    $this->assertText(t('Structure'));
+    $this->assertText(t('Modules'));
+
+    // Confirm that no {menu_links} entry exists for user/autocomplete.
+    $result = db_query('SELECT COUNT(*) FROM {menu_links} WHERE link_path = :user_autocomplete', array(':user_autocomplete' => 'user/autocomplete'))->fetchField();
+    $this->assertFalse($result, 'No {menu_links} entry exists for user/autocomplete');
+
+    // Confirm that a date format that just differs in the case can be added.
+    $admin_date_format = 'j M y';
+    $edit = array('date_format' => $admin_date_format);
+    $this->drupalPost('admin/config/regional/date-time/formats/add', $edit, t('Add format'));
+
+    // Add a new date format which just differs in the case.
+    $admin_date_format_uppercase = 'j M Y';
+    $edit = array('date_format' => $admin_date_format_uppercase);
+    $this->drupalPost('admin/config/regional/date-time/formats/add', $edit, t('Add format'));
+    $this->assertText(t('Custom date format added.'));
+
+    // Verify that the unique key on {date_formats}.format still exists.
+    $this->assertTrue(db_index_exists('date_formats', 'formats'), 'Unique key on {date_formats} exists');
+  }
+}
+
+/**
+ * Performs point release update tests on a 'filled' database.
+ *
+ * Loads an installation of Drupal 7.0 and runs the update process on it.
+ *
+ * The install contains the standard profile (plus all optional) modules
+ * with generated content so that an update from any of the modules under this
+ * profile installation can be wholly tested.
+ */
+class FilledStandardUpdatePath extends UpdatePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Basic standard + all profile update path, populated database',
+      'description'  => 'Basic update path tests for a standard profile install with all enabled modules and a populated database.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-7.filled.standard_all.database.php.gz',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Tests a successful point release update.
+   */
+  public function testFilledStandardUpdate() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // Hit the frontpage.
+    $this->drupalGet('');
+    $this->assertResponse(200);
+
+    // Verify that we are still logged in.
+    $this->drupalGet('user');
+    $this->clickLink(t('Edit'));
+    $this->assertEqual($this->getUrl(), url('user/1/edit', array('absolute' => TRUE)), 'We are still logged in as admin at the end of the upgrade.');
+
+    // Logout and verify that we can login back in with our initial password.
+    $this->drupalLogout();
+    $this->drupalLogin((object) array(
+      'uid' => 1,
+      'name' => 'admin',
+      'pass_raw' => 'admin',
+    ));
+
+    // The previous login should've triggered a password rehash, so login one
+    // more time to make sure the new hash is readable.
+    $this->drupalLogout();
+    $this->drupalLogin((object) array(
+      'uid' => 1,
+      'name' => 'admin',
+      'pass_raw' => 'admin',
+    ));
+
+    // Test that the site name is correctly displayed.
+    $this->assertText('Drupal', 'The site name is correctly displayed.');
+
+    // Verify that the main admin sections are available.
+    $this->drupalGet('admin');
+    $this->assertText(t('Content'));
+    $this->assertText(t('Appearance'));
+    $this->assertText(t('People'));
+    $this->assertText(t('Configuration'));
+    $this->assertText(t('Reports'));
+    $this->assertText(t('Structure'));
+    $this->assertText(t('Modules'));
+
+    // Confirm that no {menu_links} entry exists for user/autocomplete.
+    $result = db_query('SELECT COUNT(*) FROM {menu_links} WHERE link_path = :user_autocomplete', array(':user_autocomplete' => 'user/autocomplete'))->fetchField();
+    $this->assertFalse($result, 'No {menu_links} entry exists for user/autocomplete');
+  }
+}
+
+/**
+ * Performs point release update tests on a populated database.
+ *
+ * Loads an installation of Drupal 7.0 and runs the update process on it.
+ *
+ * The install contains the minimal profile modules (along with generated
+ * content) so that an update from of a site under this profile may be tested.
+ */
+class FilledMinimalUpdatePath extends UpdatePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Basic minimal profile update path, populated database',
+      'description'  => 'Basic update path tests for a minimal profile install with a populated database.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-7.filled.minimal.database.php.gz',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Tests a successful point release update.
+   */
+  public function testFilledStandardUpdate() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // Hit the frontpage.
+    $this->drupalGet('');
+    $this->assertResponse(200);
+
+    // Verify that we are still logged in.
+    $this->drupalGet('user');
+    $this->clickLink(t('Edit'));
+    $this->assertEqual($this->getUrl(), url('user/1/edit', array('absolute' => TRUE)), 'We are still logged in as admin at the end of the upgrade.');
+
+    // Logout and verify that we can login back in with our initial password.
+    $this->drupalLogout();
+    $this->drupalLogin((object) array(
+      'uid' => 1,
+      'name' => 'admin',
+      'pass_raw' => 'admin',
+    ));
+
+    // The previous login should've triggered a password rehash, so login one
+    // more time to make sure the new hash is readable.
+    $this->drupalLogout();
+    $this->drupalLogin((object) array(
+      'uid' => 1,
+      'name' => 'admin',
+      'pass_raw' => 'admin',
+    ));
+
+    // Test that the site name is correctly displayed.
+    $this->assertText('Drupal', 'The site name is correctly displayed.');
+
+    // Verify that the main admin sections are available.
+    $this->drupalGet('admin');
+    $this->assertText(t('Content'));
+    $this->assertText(t('Appearance'));
+    $this->assertText(t('People'));
+    $this->assertText(t('Configuration'));
+    $this->assertText(t('Reports'));
+    $this->assertText(t('Structure'));
+    $this->assertText(t('Modules'));
+
+    // Confirm that no {menu_links} entry exists for user/autocomplete.
+    $result = db_query('SELECT COUNT(*) FROM {menu_links} WHERE link_path = :user_autocomplete', array(':user_autocomplete' => 'user/autocomplete'))->fetchField();
+    $this->assertFalse($result, 'No {menu_links} entry exists for user/autocomplete');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/upgrade.translatable.test b/htmltest/modules/simpletest/tests/upgrade/upgrade.translatable.test
new file mode 100644
index 00000000..6fefb0ff
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/upgrade.translatable.test
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * Upgrade test for translatable content types of node.module.
+ */
+class TranslatableUpgradePathTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Translatable content upgrade path',
+      'description'  => 'Upgrade path tests for the translatable content types of Node module.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.locale.database.php',
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.translatable.database.php',
+    );
+    parent::setUp();
+
+    $this->uninstallModulesExcept(array('locale'));
+  }
+
+  /**
+   * Test a successful upgrade (no negotiation).
+   */
+  public function testTranslatableUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+    // The D6 database contains the english node "First translatable page" with
+    // nid 53.
+    $nid = 53;
+    $title = 'First translatable page';
+    $teaser = 'Teaser of the first translatable page.';
+    $body = 'Body of the first translatable page.';
+
+    // Check whether the node displays properly.
+    $this->drupalGet("node/$nid");
+    $this->assertText($body, 'Translatable node body displays properly');
+
+    // Retrieve node object, ensure that both the body and the teaser has
+    // survived upgrade properly.
+    $node = $this->drupalGetNodeByTitle($title);
+    $this->assertTrue($node != NULL, format_string('Node @title was loaded', array('@title' => $title)));
+    $this->assertEqual($node->body[LANGUAGE_NONE][0]['value'], $body, 'Body of the node survived upgrade properly');
+    $this->assertEqual($node->body[LANGUAGE_NONE][0]['summary'], $teaser, 'Teaser of the node survived upgrade properly');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/upgrade.trigger.test b/htmltest/modules/simpletest/tests/upgrade/upgrade.trigger.test
new file mode 100644
index 00000000..ef239414
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/upgrade.trigger.test
@@ -0,0 +1,39 @@
+<?php
+/**
+ * @file
+ * Provides upgrade path tests for the Trigger module.
+ */
+
+/**
+ * Tests the Trigger 6 -> 7 upgrade path.
+ */
+class UpgradePathTriggerTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Trigger upgrade path',
+      'description'  => 'Trigger upgrade path tests for Drupal 6.x.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.trigger.database.php',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Basic tests for the trigger upgrade.
+   */
+  public function testTaxonomyUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+    $this->drupalGet('admin/structure/trigger/node');
+    $this->assertRaw('<td>'. t('Make post sticky') .'</td>');
+    $this->assertRaw('<td>'. t('Publish post') .'</td>');
+    $this->drupalGet('admin/structure/trigger/comment');
+    $this->assertRaw('<td>'. t('Publish comment') .'</td>');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/upgrade.upload.test b/htmltest/modules/simpletest/tests/upgrade/upgrade.upload.test
new file mode 100644
index 00000000..be352bd4
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/upgrade.upload.test
@@ -0,0 +1,83 @@
+<?php
+
+/**
+ * Upgrade test for comment.module.
+ */
+class UploadUpgradePathTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'Upload upgrade path',
+      'description'  => 'Upload upgrade path tests.',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.upload.database.php',
+    );
+    parent::setUp();
+    // Set a small batch size to test multiple iterations of the batch.
+    $this->variable_set('upload_update_batch_size', 2);
+
+    $this->uninstallModulesExcept(array('upload'));
+  }
+
+  /**
+   * Test a successful upgrade.
+   */
+  public function testUploadUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+    $query = new EntityFieldQuery();
+    $query->entityCondition('entity_type', 'node');
+    $query->entityCondition('bundle', 'page');
+    $query->age(FIELD_LOAD_REVISION);
+    $query->fieldCondition('upload');
+    $entities = $query->execute();
+    $revisions = $entities['node'];
+    // Node revision 50 should not have uploaded files, as the entry in {files}
+    // is corrupted.
+    $this->assertFalse((isset($revisions[50])), 'Nodes with missing files do not contain filefield data.');
+    // Node revisions 51-53 should have uploaded files.
+    $this->assertTrue((isset($revisions[51]) && isset($revisions[52]) && isset($revisions[53])), 'Nodes with uploaded files now contain filefield data.');
+    // The test database lists uploaded filenames in the body of each node with
+    // uploaded files attached. Make sure all files are there in the same order.
+    foreach ($revisions as $vid => $revision) {
+      $node = node_load($revision->nid, $vid);
+
+      // Assemble a list of the filenames as recorded in the node body before
+      // the upgrade.
+      $recorded_filenames = preg_split('/\s+/', $node->body[LANGUAGE_NONE][0]['value']);
+      // The first line of the node body should be "Attachments:"
+      if (strstr($recorded_filenames[0], "Attachments:")) {
+        unset($recorded_filenames[0]);
+      }
+      $recorded_filenames = array_values($recorded_filenames);
+
+      $files = $node->upload[LANGUAGE_NONE];
+      // Assemble a list of the filenames as they exist after the upgrade.
+      $filenames = array();
+      foreach ($files as $file) {
+        $filenames[] = $file['filename'];
+      }
+      $this->assertIdentical($filenames, $recorded_filenames, 'The uploaded files are present in the same order after the upgrade.');
+    }
+    // Test for the file with repeating basename to only have the streaming
+    // path replaced.
+    $node = node_load(40, 53);
+    $repeated_basename_file = $node->upload[LANGUAGE_NONE][4];
+    $this->assertEqual($repeated_basename_file['uri'], 'private://drupal-6/file/directory/path/crazy-basename.png', "The file with the repeated basename path only had the stream portion replaced");
+
+    // Make sure the file settings were properly migrated.
+    $d6_file_directory_temp = '/drupal-6/file/directory/temp';
+    $d6_file_directory_path = '/drupal-6/file/directory/path';
+    $d6_file_downloads = 2; // FILE_DOWNLOADS_PRIVATE
+
+    $this->assertNull(variable_get('file_directory_temp', NULL), "The 'file_directory_temp' variable was properly removed.");
+    $this->assertEqual(variable_get('file_temporary_path', 'drupal-7-bogus'), $d6_file_directory_temp, "The 'file_temporary_path' setting was properly migrated.");
+    $this->assertEqual(variable_get('file_default_scheme', 'drupal-7-bogus'), 'private', "The 'file_default_scheme' setting was properly migrated.");
+    $this->assertEqual(variable_get('file_private_path', 'drupal-7-bogus'), $d6_file_directory_path, "The 'file_private_path' setting was properly migrated.");
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/upgrade/upgrade.user.test b/htmltest/modules/simpletest/tests/upgrade/upgrade.user.test
new file mode 100644
index 00000000..d33234e4
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/upgrade/upgrade.user.test
@@ -0,0 +1,92 @@
+<?php
+/**
+ * Upgrade test for user.module (password token involved).
+ */
+class UserUpgradePathPasswordTokenTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'User upgrade path (password token involved)',
+      'description'  => 'User upgrade path tests (password token involved).',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.bare.database.php',
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.user-password-token.database.php',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Test a successful upgrade.
+   */
+  public function testUserUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+    $this->assertEqual(variable_get('user_mail_register_no_approval_required_body'), ', [user:name], [site:name], [site:url], [site:url-brief], [user:mail], [date:medium], [site:login-url], [user:edit-url], [user:one-time-login-url].', 'Existing email templates have been modified (password token involved).');
+    // Check that a non-md5 hash was untouched.
+    $pass = db_query('SELECT pass FROM {users} WHERE uid = 3')->fetchField();
+    $this->assertEqual('$S$DAK00p3Dkojkf4O/UizYxenguXnjv', $pass, 'Pre-existing non-MD5 password hash was not altered');
+  }
+}
+
+/**
+ * Upgrade test for user.module (password token not involved).
+ */
+class UserUpgradePathNoPasswordTokenTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'User upgrade path (password token not involved)',
+      'description'  => 'User upgrade path tests (password token not involved).',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.bare.database.php',
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.user-no-password-token.database.php',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Test a successful upgrade.
+   */
+  public function testUserUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+    $this->assertEqual(variable_get('user_mail_register_no_approval_required_body'), '[user:name], [site:name], [site:url], [site:url-brief], [user:mail], [date:medium], [site:login-url], [user:edit-url], [user:one-time-login-url].', 'Existing email templates have been modified (password token not involved).');
+  }
+}
+
+/**
+ * Upgrade test for user.module (duplicated permission).
+ */
+class UserUpgradePathDuplicatedPermissionTestCase extends UpgradePathTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'User upgrade path (duplicated permission)',
+      'description'  => 'User upgrade path tests (duplicated permission).',
+      'group' => 'Upgrade path',
+    );
+  }
+
+  public function setUp() {
+    // Path to the database dump files.
+    $this->databaseDumpFiles = array(
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.bare.database.php',
+      drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.duplicate-permission.database.php',
+    );
+    parent::setUp();
+  }
+
+  /**
+   * Test a successful upgrade.
+   */
+  public function testUserUpgrade() {
+    $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/url_alter_test.info b/htmltest/modules/simpletest/tests/url_alter_test.info
new file mode 100644
index 00000000..927a49c9
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/url_alter_test.info
@@ -0,0 +1,12 @@
+name = Url_alter tests
+description = A support modules for url_alter hook testing.
+core = 7.x
+package = Testing
+version = VERSION
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/url_alter_test.install b/htmltest/modules/simpletest/tests/url_alter_test.install
new file mode 100644
index 00000000..6e09ab58
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/url_alter_test.install
@@ -0,0 +1,12 @@
+<?php
+
+/**
+ * Impelement hook_install().
+ */
+function url_alter_test_install() {
+  // Set the weight of this module to one higher than forum.module.
+  db_update('system')
+    ->fields(array('weight' => 2))
+    ->condition('name', 'url_alter_test')
+    ->execute();
+}
diff --git a/htmltest/modules/simpletest/tests/url_alter_test.module b/htmltest/modules/simpletest/tests/url_alter_test.module
new file mode 100644
index 00000000..9287ff52
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/url_alter_test.module
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * @file
+ * Module to help test hook_url_inbound_alter() and hook_url_outbound_alter().
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function url_alter_test_menu() {
+  $items['url-alter-test/foo'] = array(
+    'title' => 'Foo',
+    'page callback' => 'url_alter_test_foo',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+  return $items;
+}
+
+/**
+ * Menu callback.
+ */
+function url_alter_test_foo() {
+  print 'current_path=' . current_path() . ' request_path=' . request_path();
+  exit;
+}
+
+/**
+ * Implements hook_url_inbound_alter().
+ */
+function url_alter_test_url_inbound_alter(&$path, $original_path, $path_language) {
+  if (!request_path() && !empty($_GET['q'])) {
+    drupal_set_message("\$_GET['q'] is non-empty with an empty request path.");
+  }
+
+  // Rewrite user/username to user/uid.
+  if (preg_match('!^user/([^/]+)(/.*)?!', $path, $matches)) {
+    if ($account = user_load_by_name($matches[1])) {
+      $matches += array(2 => '');
+      $path = 'user/' . $account->uid . $matches[2];
+    }
+  }
+
+  // Rewrite community/ to forum/.
+  if ($path == 'community' || strpos($path, 'community/') === 0) {
+    $path = 'forum' . substr($path, 9);
+  }
+
+  if ($path == 'url-alter-test/bar') {
+    $path = 'url-alter-test/foo';
+  }
+}
+
+/**
+ * Implements hook_url_outbound_alter().
+ */
+function url_alter_test_url_outbound_alter(&$path, &$options, $original_path) {
+  // Rewrite user/uid to user/username.
+  if (preg_match('!^user/([0-9]+)(/.*)?!', $path, $matches)) {
+    if ($account = user_load($matches[1])) {
+      $matches += array(2 => '');
+      $path = 'user/' . $account->name . $matches[2];
+    }
+  }
+
+  // Rewrite forum/ to community/.
+  if ($path == 'forum' || strpos($path, 'forum/') === 0) {
+    $path = 'community' . substr($path, 5);
+  }
+}
diff --git a/htmltest/modules/simpletest/tests/xmlrpc.test b/htmltest/modules/simpletest/tests/xmlrpc.test
new file mode 100644
index 00000000..1a0fd86d
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/xmlrpc.test
@@ -0,0 +1,244 @@
+<?php
+
+/**
+ * Perform basic XML-RPC tests that do not require addition callbacks.
+ */
+class XMLRPCBasicTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name'  => 'XML-RPC basic',
+      'description'  => 'Perform basic XML-RPC tests that do not require additional callbacks.',
+      'group' => 'XML-RPC',
+    );
+  }
+
+  /**
+   * Ensure that a basic XML-RPC call with no parameters works.
+   */
+  protected function testListMethods() {
+    // Minimum list of methods that should be included.
+    $minimum = array(
+      'system.multicall',
+      'system.methodSignature',
+      'system.getCapabilities',
+      'system.listMethods',
+      'system.methodHelp',
+    );
+
+    // Invoke XML-RPC call to get list of methods.
+    $url = url(NULL, array('absolute' => TRUE)) . 'xmlrpc.php';
+    $methods = xmlrpc($url, array('system.listMethods' => array()));
+
+    // Ensure that the minimum methods were found.
+    $count = 0;
+    foreach ($methods as $method) {
+      if (in_array($method, $minimum)) {
+        $count++;
+      }
+    }
+
+    $this->assertEqual($count, count($minimum), 'system.listMethods returned at least the minimum listing');
+  }
+
+  /**
+   * Ensure that system.methodSignature returns an array of signatures.
+   */
+  protected function testMethodSignature() {
+    $url = url(NULL, array('absolute' => TRUE)) . 'xmlrpc.php';
+    $signature = xmlrpc($url, array('system.methodSignature' => array('system.listMethods')));
+    $this->assert(is_array($signature) && !empty($signature) && is_array($signature[0]),
+      'system.methodSignature returns an array of signature arrays.');
+  }
+
+  /**
+   * Ensure that XML-RPC correctly handles invalid messages when parsing.
+   */
+  protected function testInvalidMessageParsing() {
+    $invalid_messages = array(
+      array(
+        'message' => xmlrpc_message(''),
+        'assertion' => 'Empty message correctly rejected during parsing.',
+      ),
+      array(
+        'message' => xmlrpc_message('<?xml version="1.0" encoding="ISO-8859-1"?>'),
+        'assertion' => 'Empty message with XML declaration correctly rejected during parsing.',
+      ),
+      array(
+        'message' => xmlrpc_message('<?xml version="1.0"?><params><param><value><string>value</string></value></param></params>'),
+        'assertion' => 'Non-empty message without a valid message type is rejected during parsing.',
+      ),
+      array(
+        'message' => xmlrpc_message('<methodResponse><params><param><value><string>value</string></value></param></methodResponse>'),
+        'assertion' => 'Non-empty malformed message is rejected during parsing.',
+      ),
+    );
+
+    foreach ($invalid_messages as $assertion) {
+      $this->assertFalse(xmlrpc_message_parse($assertion['message']), $assertion['assertion']);
+    }
+  }
+}
+
+class XMLRPCValidator1IncTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'XML-RPC validator',
+      'description' => 'See <a href="http://www.xmlrpc.com/validator1Docs">the xmlrpc validator1 specification</a>.',
+      'group' => 'XML-RPC',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('xmlrpc_test');
+  }
+
+  /**
+   * Run validator1 tests.
+   */
+  function testValidator1() {
+    $xml_url = url(NULL, array('absolute' => TRUE)) . 'xmlrpc.php';
+    srand();
+    mt_srand();
+
+    $array_1 = array(array('curly' => mt_rand(-100, 100)),
+                  array('curly' => mt_rand(-100, 100)),
+                  array('larry' => mt_rand(-100, 100)),
+                  array('larry' => mt_rand(-100, 100)),
+                  array('moe' => mt_rand(-100, 100)),
+                  array('moe' => mt_rand(-100, 100)),
+                  array('larry' => mt_rand(-100, 100)));
+    shuffle($array_1);
+    $l_res_1 = xmlrpc_test_arrayOfStructsTest($array_1);
+    $r_res_1 = xmlrpc($xml_url, array('validator1.arrayOfStructsTest' => array($array_1)));
+    $this->assertIdentical($l_res_1, $r_res_1);
+
+    $string_2 = 't\'&>>zf"md>yr>xlcev<h<"k&j<og"w&&>">>uai"np&s>>q\'&b<>"&&&';
+    $l_res_2 = xmlrpc_test_countTheEntities($string_2);
+    $r_res_2 = xmlrpc($xml_url, array('validator1.countTheEntities' => array($string_2)));
+    $this->assertIdentical($l_res_2, $r_res_2);
+
+    $struct_3 = array('moe' => mt_rand(-100, 100), 'larry' => mt_rand(-100, 100), 'curly' => mt_rand(-100, 100), 'homer' => mt_rand(-100, 100));
+    $l_res_3 = xmlrpc_test_easyStructTest($struct_3);
+    $r_res_3 = xmlrpc($xml_url, array('validator1.easyStructTest' => array($struct_3)));
+    $this->assertIdentical($l_res_3, $r_res_3);
+
+    $struct_4 = array('sub1' => array('bar' => 13),
+                    'sub2' => 14,
+                    'sub3' => array('foo' => 1, 'baz' => 2),
+                    'sub4' => array('ss' => array('sss' => array('ssss' => 'sssss'))));
+    $l_res_4 = xmlrpc_test_echoStructTest($struct_4);
+    $r_res_4 = xmlrpc($xml_url, array('validator1.echoStructTest' => array($struct_4)));
+    $this->assertIdentical($l_res_4, $r_res_4);
+
+    $int_5     = mt_rand(-100, 100);
+    $bool_5    = (($int_5 % 2) == 0);
+    $string_5  = $this->randomName();
+    $double_5  = (double)(mt_rand(-1000, 1000) / 100);
+    $time_5    = REQUEST_TIME;
+    $base64_5  = $this->randomName(100);
+    $l_res_5 = xmlrpc_test_manyTypesTest($int_5, $bool_5, $string_5, $double_5, xmlrpc_date($time_5), $base64_5);
+    // See http://drupal.org/node/37766 why this currently fails
+    $l_res_5[5] = $l_res_5[5]->data;
+    $r_res_5 = xmlrpc($xml_url, array('validator1.manyTypesTest' => array($int_5, $bool_5, $string_5, $double_5, xmlrpc_date($time_5), xmlrpc_base64($base64_5))));
+    // @todo Contains objects, objects are not equal.
+    $this->assertEqual($l_res_5, $r_res_5);
+
+    $size = mt_rand(100, 200);
+    $array_6 = array();
+    for ($i = 0; $i < $size; $i++) {
+      $array_6[] = $this->randomName(mt_rand(8, 12));
+    }
+
+    $l_res_6 = xmlrpc_test_moderateSizeArrayCheck($array_6);
+    $r_res_6 = xmlrpc($xml_url, array('validator1.moderateSizeArrayCheck' => array($array_6)));
+    $this->assertIdentical($l_res_6, $r_res_6);
+
+    $struct_7 = array();
+    for ($y = 2000; $y < 2002; $y++) {
+      for ($m = 3; $m < 5; $m++) {
+        for ($d = 1; $d < 6; $d++) {
+          $ys = (string) $y;
+          $ms = sprintf('%02d', $m);
+          $ds = sprintf('%02d', $d);
+          $struct_7[$ys][$ms][$ds]['moe']   = mt_rand(-100, 100);
+          $struct_7[$ys][$ms][$ds]['larry'] = mt_rand(-100, 100);
+          $struct_7[$ys][$ms][$ds]['curly'] = mt_rand(-100, 100);
+        }
+      }
+    }
+    $l_res_7 = xmlrpc_test_nestedStructTest($struct_7);
+    $r_res_7 = xmlrpc($xml_url, array('validator1.nestedStructTest' => array($struct_7)));
+    $this->assertIdentical($l_res_7, $r_res_7);
+
+
+    $int_8 = mt_rand(-100, 100);
+    $l_res_8 = xmlrpc_test_simpleStructReturnTest($int_8);
+    $r_res_8 = xmlrpc($xml_url, array('validator1.simpleStructReturnTest' => array($int_8)));
+    $this->assertIdentical($l_res_8, $r_res_8);
+
+    /* Now test multicall */
+    $x = array();
+    $x['validator1.arrayOfStructsTest'] = array($array_1);
+    $x['validator1.countTheEntities'] = array($string_2);
+    $x['validator1.easyStructTest'] = array($struct_3);
+    $x['validator1.echoStructTest'] = array($struct_4);
+    $x['validator1.manyTypesTest'] = array($int_5, $bool_5, $string_5, $double_5, xmlrpc_date($time_5), xmlrpc_base64($base64_5));
+    $x['validator1.moderateSizeArrayCheck'] = array($array_6);
+    $x['validator1.nestedStructTest'] = array($struct_7);
+    $x['validator1.simpleStructReturnTest'] = array($int_8);
+
+    $a_l_res = array($l_res_1, $l_res_2, $l_res_3, $l_res_4, $l_res_5, $l_res_6, $l_res_7, $l_res_8);
+    $a_r_res = xmlrpc($xml_url, $x);
+    $this->assertEqual($a_l_res, $a_r_res);
+  }
+}
+
+class XMLRPCMessagesTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name'  => 'XML-RPC message and alteration',
+      'description' => 'Test large messages and method alterations.',
+      'group' => 'XML-RPC',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('xmlrpc_test');
+  }
+
+  /**
+   * Make sure that XML-RPC can transfer large messages.
+   */
+  function testSizedMessages() {
+    $xml_url = url(NULL, array('absolute' => TRUE)) . 'xmlrpc.php';
+    $sizes = array(8, 80, 160);
+    foreach ($sizes as $size) {
+      $xml_message_l = xmlrpc_test_message_sized_in_kb($size);
+      $xml_message_r = xmlrpc($xml_url, array('messages.messageSizedInKB' => array($size)));
+
+      $this->assertEqual($xml_message_l, $xml_message_r, format_string('XML-RPC messages.messageSizedInKB of %s Kb size received', array('%s' => $size)));
+    }
+  }
+
+  /**
+   * Ensure that hook_xmlrpc_alter() can hide even builtin methods.
+   */
+  protected function testAlterListMethods() {
+
+    // Ensure xmlrpc_test_xmlrpc_alter() is disabled and retrieve regular list of methods.
+    variable_set('xmlrpc_test_xmlrpc_alter', FALSE);
+    $url = url(NULL, array('absolute' => TRUE)) . 'xmlrpc.php';
+    $methods1 = xmlrpc($url, array('system.listMethods' => array()));
+
+    // Enable the alter hook and retrieve the list of methods again.
+    variable_set('xmlrpc_test_xmlrpc_alter', TRUE);
+    $methods2 = xmlrpc($url, array('system.listMethods' => array()));
+
+    $diff = array_diff($methods1, $methods2);
+    $this->assertTrue(is_array($diff) && !empty($diff), 'Method list is altered by hook_xmlrpc_alter');
+    $removed = reset($diff);
+    $this->assertEqual($removed, 'system.methodSignature', 'Hiding builting system.methodSignature with hook_xmlrpc_alter works');
+  }
+
+}
diff --git a/htmltest/modules/simpletest/tests/xmlrpc_test.info b/htmltest/modules/simpletest/tests/xmlrpc_test.info
new file mode 100644
index 00000000..4d92224f
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/xmlrpc_test.info
@@ -0,0 +1,12 @@
+name = "XML-RPC Test"
+description = "Support module for XML-RPC tests according to the validator1 specification."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/simpletest/tests/xmlrpc_test.module b/htmltest/modules/simpletest/tests/xmlrpc_test.module
new file mode 100644
index 00000000..db8f113b
--- /dev/null
+++ b/htmltest/modules/simpletest/tests/xmlrpc_test.module
@@ -0,0 +1,111 @@
+<?php
+
+function xmlrpc_test_arrayOfStructsTest($array) {
+  $sum = 0;
+  foreach ($array as $struct) {
+    if (isset($struct['curly'])) {
+      $sum += $struct['curly'];
+    }
+  }
+  return $sum;
+}
+
+function xmlrpc_test_countTheEntities($string) {
+  return array(
+    'ctLeftAngleBrackets' => substr_count($string, '<'),
+    'ctRightAngleBrackets' => substr_count($string, '>'),
+    'ctAmpersands' => substr_count($string, '&'),
+    'ctApostrophes' => substr_count($string, "'"),
+    'ctQuotes' => substr_count($string, '"'),
+  );
+}
+
+function xmlrpc_test_easyStructTest($array) {
+  return $array["curly"] + $array["moe"] + $array["larry"];
+}
+
+function xmlrpc_test_echoStructTest($array) {
+  return $array;
+}
+
+function xmlrpc_test_manyTypesTest($number, $boolean, $string, $double, $dateTime, $base64) {
+  $timestamp = gmmktime($dateTime->hour, $dateTime->minute, $dateTime->second, $dateTime->month, $dateTime->day, $dateTime->year);
+  return array($number, $boolean, $string, $double, xmlrpc_date($timestamp), xmlrpc_Base64($base64));
+}
+
+function xmlrpc_test_moderateSizeArrayCheck($array) {
+  return array_shift($array) . array_pop($array);
+}
+
+function xmlrpc_test_nestedStructTest($array) {
+  return $array["2000"]["04"]["01"]["larry"] + $array["2000"]["04"]["01"]["moe"] + $array["2000"]["04"]["01"]["curly"];
+}
+
+function xmlrpc_test_simpleStructReturnTest($number) {
+  return array("times10" => ($number*10), "times100" => ($number*100), "times1000" => ($number*1000));
+}
+
+/**
+ * Implements hook_xmlrpc().
+ */
+function xmlrpc_test_xmlrpc() {
+  return array(
+    'validator1.arrayOfStructsTest' => 'xmlrpc_test_arrayOfStructsTest',
+    'validator1.countTheEntities' => 'xmlrpc_test_countTheEntities',
+    'validator1.easyStructTest' => 'xmlrpc_test_easyStructTest',
+    'validator1.echoStructTest' => 'xmlrpc_test_echoStructTest',
+    'validator1.manyTypesTest' => 'xmlrpc_test_manyTypesTest',
+    'validator1.moderateSizeArrayCheck' => 'xmlrpc_test_moderateSizeArrayCheck',
+    'validator1.nestedStructTest' => 'xmlrpc_test_nestedStructTest',
+    'validator1.simpleStructReturnTest' => 'xmlrpc_test_simpleStructReturnTest',
+    'messages.messageSizedInKB' => 'xmlrpc_test_message_sized_in_kb',
+  );
+}
+
+/**
+ * Implements hook_xmlrpc_alter().
+ *
+ * Hide (or not) the system.methodSignature() service depending on a variable.
+ */
+function xmlrpc_test_xmlrpc_alter(&$services) {
+  if (variable_get('xmlrpc_test_xmlrpc_alter', FALSE)) {
+    $remove = NULL;
+    foreach ($services as $key => $value) {
+      if (!is_array($value)) {
+        continue;
+      }
+      if ($value[0] == 'system.methodSignature') {
+        $remove = $key;
+        break;
+      }
+    }
+    if (isset($remove)) {
+      unset($services[$remove]);
+    }
+  }
+}
+
+/**
+ * Created a message of the desired size in KB.
+ *
+ * @param $size
+ *   Message size in KB.
+ * @return array
+ *   Generated message structure.
+ */
+function xmlrpc_test_message_sized_in_kb($size) {
+  $message = array();
+
+  $word = 'abcdefg';
+
+  // Create a ~1KB sized struct.
+  for ($i = 0 ; $i < 128; $i++) {
+    $line['word_' . $i] = $word;
+  }
+
+  for ($i = 0; $i < $size; $i++) {
+    $message['line_' . $i] = $line;
+  }
+
+  return $message;
+}
diff --git a/htmltest/modules/statistics/statistics.admin.inc b/htmltest/modules/statistics/statistics.admin.inc
new file mode 100644
index 00000000..71e64aa5
--- /dev/null
+++ b/htmltest/modules/statistics/statistics.admin.inc
@@ -0,0 +1,319 @@
+<?php
+
+/**
+ * @file
+ * Admin page callbacks for the Statistics module.
+ */
+
+/**
+ * Page callback: Displays the "recent hits" page.
+ *
+ * This displays the pages with recent hits in a given time interval that
+ * haven't been flushed yet. The flush interval is set on the statistics
+ * settings form, but is dependent on cron running.
+ *
+ * @return
+ *   A render array containing information about the most recent hits.
+ */
+function statistics_recent_hits() {
+  $header = array(
+    array('data' => t('Timestamp'), 'field' => 'a.timestamp', 'sort' => 'desc'),
+    array('data' => t('Page'), 'field' => 'a.path'),
+    array('data' => t('User'), 'field' => 'u.name'),
+    array('data' => t('Operations'))
+  );
+
+  $query = db_select('accesslog', 'a', array('target' => 'slave'))->extend('PagerDefault')->extend('TableSort');
+  $query->join('users', 'u', 'a.uid = u.uid');
+  $query
+    ->fields('a', array('aid', 'timestamp', 'path', 'title', 'uid'))
+    ->fields('u', array('name'))
+    ->limit(30)
+    ->orderByHeader($header);
+
+  $result = $query->execute();
+  $rows = array();
+  foreach ($result as $log) {
+    $rows[] = array(
+      array('data' => format_date($log->timestamp, 'short'), 'class' => array('nowrap')),
+      _statistics_format_item($log->title, $log->path),
+      theme('username', array('account' => $log)),
+      l(t('details'), "admin/reports/access/$log->aid"));
+  }
+
+  $build['statistics_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#empty' => t('No statistics available.'),
+  );
+  $build['statistics_pager'] = array('#theme' => 'pager');
+  return $build;
+}
+
+/**
+ * Page callback: Displays statistics for the "top pages" (most accesses).
+ *
+ * This displays the pages with the most hits (the "top pages") within a given
+ * time period that haven't been flushed yet. The flush interval is set on the
+ * statistics settings form, but is dependent on cron running.
+ *
+ * @return
+ *   A render array containing information about the the top pages.
+ */
+function statistics_top_pages() {
+  $header = array(
+    array('data' => t('Hits'), 'field' => 'hits', 'sort' => 'desc'),
+    array('data' => t('Page'), 'field' => 'path'),
+    array('data' => t('Average page generation time'), 'field' => 'average_time'),
+    array('data' => t('Total page generation time'), 'field' => 'total_time')
+  );
+
+  $query = db_select('accesslog', 'a', array('target' => 'slave'))->extend('PagerDefault')->extend('TableSort');
+  $query->addExpression('COUNT(path)', 'hits');
+  // MAX(title) avoids having empty node titles which otherwise causes
+  // duplicates in the top pages list.
+  $query->addExpression('MAX(title)', 'title');
+  $query->addExpression('AVG(timer)', 'average_time');
+  $query->addExpression('SUM(timer)', 'total_time');
+
+  $query
+    ->fields('a', array('path'))
+    ->groupBy('path')
+    ->limit(30)
+    ->orderByHeader($header);
+
+  $count_query = db_select('accesslog', 'a', array('target' => 'slave'));
+  $count_query->addExpression('COUNT(DISTINCT path)');
+  $query->setCountQuery($count_query);
+
+  $result = $query->execute();
+  $rows = array();
+  foreach ($result as $page) {
+    $rows[] = array($page->hits, _statistics_format_item($page->title, $page->path), t('%time ms', array('%time' => round($page->average_time))), format_interval(round($page->total_time / 1000)));
+  }
+
+  drupal_set_title(t('Top pages in the past %interval', array('%interval' => format_interval(variable_get('statistics_flush_accesslog_timer', 259200)))), PASS_THROUGH);
+  $build['statistics_top_pages_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#empty' => t('No statistics available.'),
+  );
+  $build['statistics_top_pages_pager'] = array('#theme' => 'pager');
+  return $build;
+}
+
+/**
+ * Page callback: Displays the "top visitors" page.
+ *
+ * This displays the pages with the top number of visitors in a given time
+ * interval that haven't been flushed yet. The flush interval is set on the
+ * statistics settings form, but is dependent on cron running.
+ *
+ * @return
+ *   A render array containing the top visitors information.
+ */
+function statistics_top_visitors() {
+
+  $header = array(
+    array('data' => t('Hits'), 'field' => 'hits', 'sort' => 'desc'),
+    array('data' => t('Visitor'), 'field' => 'u.name'),
+    array('data' => t('Total page generation time'), 'field' => 'total'),
+    array('data' => user_access('block IP addresses') ? t('Operations') : '', 'colspan' => 2),
+  );
+  $query = db_select('accesslog', 'a', array('target' => 'slave'))->extend('PagerDefault')->extend('TableSort');
+  $query->leftJoin('blocked_ips', 'bl', 'a.hostname = bl.ip');
+  $query->leftJoin('users', 'u', 'a.uid = u.uid');
+
+  $query->addExpression('COUNT(a.uid)', 'hits');
+  $query->addExpression('SUM(a.timer)', 'total');
+  $query
+    ->fields('a', array('uid', 'hostname'))
+    ->fields('u', array('name'))
+    ->fields('bl', array('iid'))
+    ->groupBy('a.hostname')
+    ->groupBy('a.uid')
+    ->groupBy('u.name')
+    ->groupBy('bl.iid')
+    ->limit(30)
+    ->orderByHeader($header);
+
+  $uniques_query = db_select('accesslog')->distinct();
+  $uniques_query->fields('accesslog', array('uid', 'hostname'));
+  $count_query = db_select($uniques_query);
+  $count_query->addExpression('COUNT(*)');
+  $query->setCountQuery($count_query);
+
+  $result = $query->execute();
+  $rows = array();
+  $destination = drupal_get_destination();
+  foreach ($result as $account) {
+    $ban_link = $account->iid ? l(t('unblock IP address'), "admin/config/people/ip-blocking/delete/$account->iid", array('query' => $destination)) : l(t('block IP address'), "admin/config/people/ip-blocking/$account->hostname", array('query' => $destination));
+    $rows[] = array($account->hits, ($account->uid ? theme('username', array('account' => $account)) : $account->hostname), format_interval(round($account->total / 1000)), (user_access('block IP addresses') && !$account->uid) ? $ban_link : '');
+  }
+
+  drupal_set_title(t('Top visitors in the past %interval', array('%interval' => format_interval(variable_get('statistics_flush_accesslog_timer', 259200)))), PASS_THROUGH);
+  $build['statistics_top_visitors_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#empty' => t('No statistics available.'),
+  );
+  $build['statistics_top_visitors_pager'] = array('#theme' => 'pager');
+  return $build;
+}
+
+/**
+ * Page callback: Displays the "top referrers" in the access logs.
+ *
+ * This displays the pages with the top referrers in a given time interval that
+ * haven't been flushed yet. The flush interval is set on the statistics
+ * settings form, but is dependent on cron running.
+ *
+ * @return
+ *   A render array containing the top referrers information.
+ */
+function statistics_top_referrers() {
+  drupal_set_title(t('Top referrers in the past %interval', array('%interval' => format_interval(variable_get('statistics_flush_accesslog_timer', 259200)))), PASS_THROUGH);
+
+  $header = array(
+    array('data' => t('Hits'), 'field' => 'hits', 'sort' => 'desc'),
+    array('data' => t('Url'), 'field' => 'url'),
+    array('data' => t('Last visit'), 'field' => 'last'),
+  );
+  $query = db_select('accesslog', 'a')->extend('PagerDefault')->extend('TableSort');
+
+  $query->addExpression('COUNT(url)', 'hits');
+  $query->addExpression('MAX(timestamp)', 'last');
+  $query
+    ->fields('a', array('url'))
+    ->condition('url', '%' . $_SERVER['HTTP_HOST'] . '%', 'NOT LIKE')
+    ->condition('url', '', '<>')
+    ->groupBy('url')
+    ->limit(30)
+    ->orderByHeader($header);
+
+  $count_query = db_select('accesslog', 'a', array('target' => 'slave'));
+  $count_query->addExpression('COUNT(DISTINCT url)');
+  $count_query
+    ->condition('url', '%' . $_SERVER['HTTP_HOST'] . '%', 'NOT LIKE')
+    ->condition('url', '', '<>');
+  $query->setCountQuery($count_query);
+
+  $result = $query->execute();
+  $rows = array();
+  foreach ($result as $referrer) {
+    $rows[] = array($referrer->hits, _statistics_link($referrer->url), t('@time ago', array('@time' => format_interval(REQUEST_TIME - $referrer->last))));
+  }
+
+  $build['statistics_top_referrers_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#empty' => t('No statistics available.'),
+  );
+  $build['statistics_top_referrers_pager'] = array('#theme' => 'pager');
+  return $build;
+}
+
+/**
+ * Page callback: Gathers page access statistics suitable for rendering.
+ *
+ * @param $aid
+ *   The unique accesslog ID.
+ *
+ * @return
+ *   A render array containing page access statistics. If information for the
+ *   page was not found, drupal_not_found() is called.
+ */
+function statistics_access_log($aid) {
+  $access = db_query('SELECT a.*, u.name FROM {accesslog} a LEFT JOIN {users} u ON a.uid = u.uid WHERE aid = :aid', array(':aid' => $aid))->fetch();
+  if ($access) {
+    $rows[] = array(
+      array('data' => t('URL'), 'header' => TRUE),
+      l(url($access->path, array('absolute' => TRUE)), $access->path)
+    );
+    // It is safe to avoid filtering $access->title through check_plain because
+    // it comes from drupal_get_title().
+    $rows[] = array(
+      array('data' => t('Title'), 'header' => TRUE),
+      $access->title
+    );
+    $rows[] = array(
+      array('data' => t('Referrer'), 'header' => TRUE),
+      ($access->url ? l($access->url, $access->url) : '')
+    );
+    $rows[] = array(
+      array('data' => t('Date'), 'header' => TRUE),
+      format_date($access->timestamp, 'long')
+    );
+    $rows[] = array(
+      array('data' => t('User'), 'header' => TRUE),
+      theme('username', array('account' => $access))
+    );
+    $rows[] = array(
+      array('data' => t('Hostname'), 'header' => TRUE),
+      check_plain($access->hostname)
+    );
+
+    $build['statistics_table'] = array(
+      '#theme' => 'table',
+      '#rows' => $rows,
+    );
+    return $build;
+  }
+  return MENU_NOT_FOUND;
+}
+
+/**
+ * Form constructor for the statistics administration form.
+ *
+ * @ingroup forms
+ * @see system_settings_form()
+ */
+function statistics_settings_form() {
+  // Access log settings.
+  $form['access'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Access log settings'),
+  );
+  $form['access']['statistics_enable_access_log'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable access log'),
+    '#default_value' => variable_get('statistics_enable_access_log', 0),
+    '#description' => t('Log each page access. Required for referrer statistics.'),
+  );
+  $form['access']['statistics_flush_accesslog_timer'] = array(
+    '#type' => 'select',
+    '#title' => t('Discard access logs older than'),
+    '#default_value' => variable_get('statistics_flush_accesslog_timer', 259200),
+    '#options' => array(0 => t('Never')) + drupal_map_assoc(array(3600, 10800, 21600, 32400, 43200, 86400, 172800, 259200, 604800, 1209600, 2419200, 4838400, 9676800), 'format_interval'),
+    '#description' => t('Older access log entries (including referrer statistics) will be automatically discarded. (Requires a correctly configured <a href="@cron">cron maintenance task</a>.)', array('@cron' => url('admin/reports/status'))),
+  );
+
+  // Content counter settings.
+  $form['content'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Content viewing counter settings'),
+  );
+  $form['content']['statistics_count_content_views'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Count content views'),
+    '#default_value' => variable_get('statistics_count_content_views', 0),
+    '#description' => t('Increment a counter each time content is viewed.'),
+  );
+  $form['content']['statistics_count_content_views_ajax'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Use Ajax to increment the counter'),
+    '#default_value' => variable_get('statistics_count_content_views_ajax', 0),
+    '#description' => t('Perform the count asynchronously after page load rather than during page generation.'),
+    '#states' => array(
+      'disabled' => array(
+        ':input[name="statistics_count_content_views"]' => array('checked' => FALSE),
+      ),
+    ),
+  );
+
+  return system_settings_form($form);
+}
diff --git a/htmltest/modules/statistics/statistics.info b/htmltest/modules/statistics/statistics.info
new file mode 100644
index 00000000..57f3717d
--- /dev/null
+++ b/htmltest/modules/statistics/statistics.info
@@ -0,0 +1,13 @@
+name = Statistics
+description = Logs access statistics for your site.
+package = Core
+version = VERSION
+core = 7.x
+files[] = statistics.test
+configure = admin/config/system/statistics
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/statistics/statistics.install b/htmltest/modules/statistics/statistics.install
new file mode 100644
index 00000000..231c90ec
--- /dev/null
+++ b/htmltest/modules/statistics/statistics.install
@@ -0,0 +1,159 @@
+<?php
+
+/**
+ * @file
+ * Install, update, and uninstall functions for the Statistics module.
+ */
+
+/**
+ * Implements hook_uninstall().
+ */
+function statistics_uninstall() {
+  // Remove variables.
+  variable_del('statistics_count_content_views');
+  variable_del('statistics_count_content_views_ajax');
+  variable_del('statistics_enable_access_log');
+  variable_del('statistics_flush_accesslog_timer');
+  variable_del('statistics_day_timestamp');
+  variable_del('statistics_block_top_day_num');
+  variable_del('statistics_block_top_all_num');
+  variable_del('statistics_block_top_last_num');
+}
+
+/**
+ * Implements hook_schema().
+ */
+function statistics_schema() {
+  $schema['accesslog'] = array(
+    'description' => 'Stores site access information for statistics.',
+    'fields' => array(
+      'aid' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique accesslog ID.',
+      ),
+      'sid' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Browser session ID of user that visited page.',
+      ),
+      'title' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => FALSE,
+        'description' => 'Title of page visited.',
+      ),
+      'path' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => FALSE,
+        'description' => 'Internal path to page visited (relative to Drupal root.)',
+      ),
+      'url' => array(
+        'type' => 'text',
+        'not null' => FALSE,
+        'description' => 'Referrer URI.',
+      ),
+      'hostname' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => FALSE,
+        'description' => 'Hostname of user that visited the page.',
+      ),
+      'uid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => FALSE,
+        'default' => 0,
+        'description' => 'User {users}.uid that visited the page.',
+      ),
+      'timer' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Time in milliseconds that the page took to load.',
+      ),
+      'timestamp' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Timestamp of when the page was visited.',
+      ),
+    ),
+    'indexes' => array(
+      'accesslog_timestamp' => array('timestamp'),
+      'uid' => array('uid'),
+    ),
+    'primary key' => array('aid'),
+    'foreign keys' => array(
+      'visitor' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid'),
+      ),
+    ),
+  );
+
+  $schema['node_counter'] = array(
+    'description' => 'Access statistics for {node}s.',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The {node}.nid for these statistics.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'totalcount' => array(
+        'description' => 'The total number of times the {node} has been viewed.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'big',
+      ),
+      'daycount' => array(
+        'description' => 'The total number of times the {node} has been viewed today.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'medium',
+      ),
+      'timestamp' => array(
+        'description' => 'The most recent time the {node} has been viewed.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'primary key' => array('nid'),
+  );
+
+  return $schema;
+}
+
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Update the {accesslog}.sid column to match the length of {sessions}.sid
+ */
+function statistics_update_7000() {
+  db_change_field('accesslog', 'sid', 'sid', array(
+    'type' => 'varchar',
+    'length' => 128,
+    'not null' => TRUE,
+    'default' => '',
+    'description' => 'Browser session ID of user that visited page.',
+  ));
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x".
+ */
diff --git a/htmltest/modules/statistics/statistics.js b/htmltest/modules/statistics/statistics.js
new file mode 100644
index 00000000..b7c56157
--- /dev/null
+++ b/htmltest/modules/statistics/statistics.js
@@ -0,0 +1,10 @@
+(function ($) {
+  $(document).ready(function() {
+    $.ajax({
+      type: "POST",
+      cache: false,
+      url: Drupal.settings.statistics.url,
+      data: Drupal.settings.statistics.data
+    });
+  });
+})(jQuery);
diff --git a/htmltest/modules/statistics/statistics.module b/htmltest/modules/statistics/statistics.module
new file mode 100644
index 00000000..f665a14f
--- /dev/null
+++ b/htmltest/modules/statistics/statistics.module
@@ -0,0 +1,465 @@
+<?php
+
+/**
+ * @file
+ * Logs and displays access statistics for a site.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function statistics_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#statistics':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Statistics module shows you how often a given page is viewed, who viewed it, the previous page the user visited (referrer URL), and when it was viewed. These statistics are useful in determining how users are visiting and navigating your site. For more information, see the online handbook entry for the <a href="@statistics">Statistics module</a>.', array('@statistics' => url('http://drupal.org/documentation/modules/statistics/'))) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Managing logs') . '</dt>';
+      $output .= '<dd>' . t('To enable collection of statistics, the <em>Enable access log</em> checkbox on the <a href="@statistics-settings">Statistics settings page</a> must be checked. The <em>Discard access logs older than</em> setting on the settings page specifies the length of time entries are kept in the log before they are deleted. This setting requires a correctly configured <a href="@cron">cron maintenance task</a> to run.', array('@statistics-settings' => url('admin/config/system/statistics'), '@cron' => 'http://drupal.org/cron')) . '</dd>';
+      $output .= '<dt>' . t('Viewing site usage') . '</dt>';
+      $output .= '<dd>' . t('The Statistics module can help you break down details about your users and how they are using the site. The module offers four reports:');
+      $output .= '<ul><li>' . t('<a href="@recent-hits">Recent hits</a> displays information about the latest activity on your site, including the URL and title of the page that was accessed, the user name (if available) and the IP address of the viewer.', array('@recent-hits' => url('admin/reports/hits'))) . '</li>';
+      $output .= '<li>' . t('<a href="@top-referrers">Top referrers</a> displays where visitors came from (referrer URL).', array('@top-referrers' => url('admin/reports/referrers'))) . '</li>';
+      $output .= '<li>' . t('<a href="@top-pages">Top pages</a> displays a list of pages ordered by how often they were viewed.', array('@top-pages' => url('admin/reports/pages'))) . '</li>';
+      $output .= '<li>' . t('<a href="@top-visitors">Top visitors</a> shows you the most active visitors for your site and allows you to ban abusive visitors.', array('@top-visitors' => url('admin/reports/visitors'))) . '</li></ul>';
+      $output .= '<dt>' . t('Displaying popular content') . '</dt>';
+      $output .= '<dd>' . t('The module includes a <em>Popular content</em> block that displays the most viewed pages today and for all time, and the last content viewed. To use the block, enable <em>Count content views</em> on the <a href="@statistics-settings">statistics settings page</a>, and then you can enable and configure the block on the <a href="@blocks">blocks administration page</a>.', array('@statistics-settings' => url('admin/config/system/statistics'), '@blocks' => url('admin/structure/block'))) . '</dd>';
+      $output .= '<dt>' . t('Page view counter') . '</dt>';
+      $output .= '<dd>' . t('The Statistics module includes a counter for each page that increases whenever the page is viewed. To use the counter, enable <em>Count content views</em> on the <a href="@statistics-settings">statistics settings page</a>, and set the necessary <a href="@permissions">permissions</a> (<em>View content hits</em>) so that the counter is visible to the users.', array('@statistics-settings' => url('admin/config/system/statistics'), '@permissions' => url('admin/people/permissions', array('fragment' => 'module-statistics')))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'admin/config/system/statistics':
+      return '<p>' . t('Settings for the statistical information that Drupal will keep about the site. See <a href="@statistics">site statistics</a> for the actual information.', array('@statistics' => url('admin/reports/hits'))) . '</p>';
+    case 'admin/reports/hits':
+      return '<p>' . t("This page displays the site's most recent hits.") . '</p>';
+    case 'admin/reports/referrers':
+      return '<p>' . t('This page displays all external referrers, or external references to your website.') . '</p>';
+    case 'admin/reports/visitors':
+      return '<p>' . t("When you ban a visitor, you prevent the visitor's IP address from accessing your site. Unlike blocking a user, banning a visitor works even for anonymous users. This is most commonly used to block resource-intensive bots or web crawlers.") . '</p>';
+  }
+}
+
+
+/**
+ * Implements hook_exit().
+ *
+ * Gathers statistics for page accesses.
+ */
+function statistics_exit() {
+  global $user;
+
+  // When serving cached pages with the 'page_cache_without_database'
+  // configuration, system variables need to be loaded. This is a major
+  // performance decrease for non-database page caches, but with Statistics
+  // module, it is likely to also have 'statistics_enable_access_log' enabled,
+  // in which case we need to bootstrap to the session phase anyway.
+  drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES);
+
+  if (variable_get('statistics_count_content_views', 0) && !variable_get('statistics_count_content_views_ajax', 0)) {
+    // We are counting content views.
+    if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == NULL) {
+      // A node has been viewed, so update the node's counters.
+      db_merge('node_counter')
+        ->key(array('nid' => arg(1)))
+        ->fields(array(
+          'daycount' => 1,
+          'totalcount' => 1,
+          'timestamp' => REQUEST_TIME,
+        ))
+        ->expression('daycount', 'daycount + 1')
+        ->expression('totalcount', 'totalcount + 1')
+        ->execute();
+    }
+  }
+  if (variable_get('statistics_enable_access_log', 0)) {
+    drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION);
+
+    // For anonymous users unicode.inc will not have been loaded.
+    include_once DRUPAL_ROOT . '/includes/unicode.inc';
+    // Log this page access.
+    db_insert('accesslog')
+      ->fields(array(
+        'title' => truncate_utf8(strip_tags(drupal_get_title()), 255),
+        'path' => truncate_utf8($_GET['q'], 255),
+        'url' => isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '',
+        'hostname' => ip_address(),
+        'uid' => $user->uid,
+        'sid' => session_id(),
+        'timer' => (int) timer_read('page'),
+        'timestamp' => REQUEST_TIME,
+      ))
+      ->execute();
+  }
+}
+
+/**
+ * Implements hook_permission().
+ */
+function statistics_permission() {
+  return array(
+    'administer statistics' => array(
+      'title' => t('Administer statistics'),
+    ),
+    'access statistics' => array(
+      'title' => t('View content access statistics'),
+    ),
+    'view post access counter' => array(
+      'title' => t('View content hits'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_node_view().
+ */
+function statistics_node_view($node, $view_mode) {
+  // Attach Ajax node count statistics if configured.
+  if (variable_get('statistics_count_content_views', 0) && variable_get('statistics_count_content_views_ajax', 0)) {
+    if (!empty($node->nid) && $view_mode == 'full' && node_is_page($node) && empty($node->in_preview)) {
+      $node->content['#attached']['js'] = array(
+        drupal_get_path('module', 'statistics') . '/statistics.js' => array(
+          'scope' => 'footer'
+        ),
+      );
+      $settings = array('data' => array('nid' => $node->nid), 'url' => url(drupal_get_path('module', 'statistics') . '/statistics.php'));
+      $node->content['#attached']['js'][] = array(
+        'data' => array('statistics' => $settings),
+        'type' => 'setting',
+      );
+    }
+  }
+
+  if ($view_mode != 'rss') {
+    if (user_access('view post access counter')) {
+      $statistics = statistics_get($node->nid);
+      if ($statistics) {
+        $links['statistics_counter']['title'] = format_plural($statistics['totalcount'], '1 read', '@count reads');
+        $node->content['links']['statistics'] = array(
+          '#theme' => 'links__node__statistics',
+          '#links' => $links,
+          '#attributes' => array('class' => array('links', 'inline')),
+        );
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function statistics_menu() {
+  $items['admin/reports/hits'] = array(
+    'title' => 'Recent hits',
+    'description' => 'View pages that have recently been visited.',
+    'page callback' => 'statistics_recent_hits',
+    'access arguments' => array('access statistics'),
+    'file' => 'statistics.admin.inc',
+  );
+  $items['admin/reports/pages'] = array(
+    'title' => 'Top pages',
+    'description' => 'View pages that have been hit frequently.',
+    'page callback' => 'statistics_top_pages',
+    'access arguments' => array('access statistics'),
+    'weight' => 1,
+    'file' => 'statistics.admin.inc',
+  );
+  $items['admin/reports/visitors'] = array(
+    'title' => 'Top visitors',
+    'description' => 'View visitors that hit many pages.',
+    'page callback' => 'statistics_top_visitors',
+    'access arguments' => array('access statistics'),
+    'weight' => 2,
+    'file' => 'statistics.admin.inc',
+  );
+  $items['admin/reports/referrers'] = array(
+    'title' => 'Top referrers',
+    'description' => 'View top referrers.',
+    'page callback' => 'statistics_top_referrers',
+    'access arguments' => array('access statistics'),
+    'file' => 'statistics.admin.inc',
+  );
+  $items['admin/reports/access/%'] = array(
+    'title' => 'Details',
+    'description' => 'View access log.',
+    'page callback' => 'statistics_access_log',
+    'page arguments' => array(3),
+    'access arguments' => array('access statistics'),
+    'file' => 'statistics.admin.inc',
+  );
+  $items['admin/config/system/statistics'] = array(
+    'title' => 'Statistics',
+    'description' => 'Control details about what and how your site logs access statistics.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('statistics_settings_form'),
+    'access arguments' => array('administer statistics'),
+    'file' => 'statistics.admin.inc',
+    'weight' => -15,
+  );
+  $items['user/%user/track/navigation'] = array(
+    'title' => 'Track page visits',
+    'page callback' => 'statistics_user_tracker',
+    'access callback' => 'user_access',
+    'access arguments' => array('access statistics'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 2,
+    'file' => 'statistics.pages.inc',
+  );
+  $items['node/%node/track'] = array(
+    'title' => 'Track',
+    'page callback' => 'statistics_node_tracker',
+    'access callback' => 'user_access',
+    'access arguments' => array('access statistics'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 2,
+    'file' => 'statistics.pages.inc',
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_user_cancel().
+ */
+function statistics_user_cancel($edit, $account, $method) {
+  switch ($method) {
+    case 'user_cancel_reassign':
+      db_update('accesslog')
+        ->fields(array('uid' => 0))
+        ->condition('uid', $account->uid)
+        ->execute();
+      break;
+  }
+}
+
+/**
+ * Implements hook_user_delete().
+ */
+function statistics_user_delete($account) {
+  db_delete('accesslog')
+    ->condition('uid', $account->uid)
+    ->execute();
+}
+
+/**
+ * Implements hook_cron().
+ */
+function statistics_cron() {
+  $statistics_timestamp = variable_get('statistics_day_timestamp', '');
+
+  if ((REQUEST_TIME - $statistics_timestamp) >= 86400) {
+    // Reset day counts.
+    db_update('node_counter')
+      ->fields(array('daycount' => 0))
+      ->execute();
+    variable_set('statistics_day_timestamp', REQUEST_TIME);
+  }
+
+  // Clean up expired access logs (if applicable).
+  if (variable_get('statistics_flush_accesslog_timer', 259200) > 0) {
+    db_delete('accesslog')
+      ->condition('timestamp', REQUEST_TIME - variable_get('statistics_flush_accesslog_timer', 259200), '<')
+      ->execute();
+  }
+}
+
+/**
+ * Returns the most viewed content of all time, today, or the last-viewed node.
+ *
+ * @param $dbfield
+ *   The database field to use, one of:
+ *   - 'totalcount': Integer that shows the top viewed content of all time.
+ *   - 'daycount': Integer that shows the top viewed content for today.
+ *   - 'timestamp': Integer that shows only the last viewed node.
+ * @param $dbrows
+ *   The number of rows to be returned.
+ *
+ * @return SelectQuery|FALSE
+ *   A query result containing the node ID, title, user ID that owns the node,
+ *   and the username for the selected node(s), or FALSE if the query could not
+ *   be executed correctly.
+ */
+function statistics_title_list($dbfield, $dbrows) {
+  if (in_array($dbfield, array('totalcount', 'daycount', 'timestamp'))) {
+    $query = db_select('node', 'n');
+    $query->addTag('node_access');
+    $query->join('node_counter', 's', 'n.nid = s.nid');
+    $query->join('users', 'u', 'n.uid = u.uid');
+
+    return $query
+      ->fields('n', array('nid', 'title'))
+      ->fields('u', array('uid', 'name'))
+      ->condition($dbfield, 0, '<>')
+      ->condition('n.status', 1)
+      ->orderBy($dbfield, 'DESC')
+      ->range(0, $dbrows)
+      ->execute();
+  }
+  return FALSE;
+}
+
+
+/**
+ * Retrieves a node's "view statistics".
+ *
+ * @param $nid
+ *   The node ID.
+ *
+ * @return
+ *   An associative array containing:
+ *   - totalcount: Integer for the total number of times the node has been
+ *     viewed.
+ *   - daycount: Integer for the total number of times the node has been viewed
+ *     "today". For the daycount to be reset, cron must be enabled.
+ *   - timestamp: Integer for the timestamp of when the node was last viewed.
+ */
+function statistics_get($nid) {
+
+  if ($nid > 0) {
+    // Retrieve an array with both totalcount and daycount.
+    return db_query('SELECT totalcount, daycount, timestamp FROM {node_counter} WHERE nid = :nid', array(':nid' => $nid), array('target' => 'slave'))->fetchAssoc();
+  }
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function statistics_block_info() {
+  $blocks = array();
+
+  if (variable_get('statistics_count_content_views', 0)) {
+    $blocks['popular']['info'] = t('Popular content');
+    // Too dynamic to cache.
+    $blocks['popular']['cache'] = DRUPAL_NO_CACHE;
+  }
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_configure().
+ */
+function statistics_block_configure($delta = '') {
+  // Popular content block settings
+  $numbers = array('0' => t('Disabled')) + drupal_map_assoc(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 40));
+  $form['statistics_block_top_day_num'] = array('#type' => 'select', '#title' => t("Number of day's top views to display"), '#default_value' => variable_get('statistics_block_top_day_num', 0), '#options' => $numbers, '#description' => t('How many content items to display in "day" list.'));
+  $form['statistics_block_top_all_num'] = array('#type' => 'select', '#title' => t('Number of all time views to display'), '#default_value' => variable_get('statistics_block_top_all_num', 0), '#options' => $numbers, '#description' => t('How many content items to display in "all time" list.'));
+  $form['statistics_block_top_last_num'] = array('#type' => 'select', '#title' => t('Number of most recent views to display'), '#default_value' => variable_get('statistics_block_top_last_num', 0), '#options' => $numbers, '#description' => t('How many content items to display in "recently viewed" list.'));
+  return $form;
+}
+
+/**
+ * Implements hook_block_save().
+ */
+function statistics_block_save($delta = '', $edit = array()) {
+  variable_set('statistics_block_top_day_num', $edit['statistics_block_top_day_num']);
+  variable_set('statistics_block_top_all_num', $edit['statistics_block_top_all_num']);
+  variable_set('statistics_block_top_last_num', $edit['statistics_block_top_last_num']);
+}
+
+/**
+ * Implements hook_block_view().
+ */
+function statistics_block_view($delta = '') {
+  if (user_access('access content')) {
+    $content = array();
+
+    $daytop = variable_get('statistics_block_top_day_num', 0);
+    if ($daytop && ($result = statistics_title_list('daycount', $daytop)) && ($node_title_list = node_title_list($result, t("Today's:")))) {
+      $content['top_day'] = $node_title_list;
+      $content['top_day']['#suffix'] = '<br />';
+    }
+
+    $alltimetop = variable_get('statistics_block_top_all_num', 0);
+    if ($alltimetop && ($result = statistics_title_list('totalcount', $alltimetop)) && ($node_title_list = node_title_list($result, t('All time:')))) {
+      $content['top_all'] = $node_title_list;
+      $content['top_all']['#suffix'] = '<br />';
+    }
+
+    $lasttop = variable_get('statistics_block_top_last_num', 0);
+    if ($lasttop && ($result = statistics_title_list('timestamp', $lasttop)) && ($node_title_list = node_title_list($result, t('Last viewed:')))) {
+      $content['top_last'] = $node_title_list;
+      $content['top_last']['#suffix'] = '<br />';
+    }
+
+    if (count($content)) {
+      $block['content'] = $content;
+      $block['subject'] = t('Popular content');
+      return $block;
+    }
+  }
+}
+
+/**
+ * Generates a link to a path, truncating the displayed text to a given width.
+ *
+ * @param $path
+ *   The path to generate the link for.
+ * @param $width
+ *   The width to set the displayed text of the path.
+ *
+ * @return
+ *   A string as a link, truncated to the width, linked to the given $path.
+ */
+function _statistics_link($path, $width = 35) {
+  $title = drupal_get_path_alias($path);
+  $title = truncate_utf8($title, $width, FALSE, TRUE);
+  return l($title, $path);
+}
+
+/**
+ * Formats an item for display, including both the item title and the link.
+ *
+ * @param $title
+ *   The text to link to a path; will be truncated to a maximum width of 35.
+ * @param $path
+ *   The path to link to; will default to '/'.
+ *
+ * @return
+ *   An HTML string with $title linked to the $path.
+ */
+function _statistics_format_item($title, $path) {
+  $path = ($path ? $path : '/');
+  $output  = ($title ? "$title<br />" : '');
+  $output .= _statistics_link($path);
+  return $output;
+}
+
+/**
+ * Implements hook_node_delete().
+ */
+function statistics_node_delete($node) {
+  // clean up statistics table when node is deleted
+  db_delete('node_counter')
+    ->condition('nid', $node->nid)
+    ->execute();
+}
+
+/**
+ * Implements hook_ranking().
+ */
+function statistics_ranking() {
+  if (variable_get('statistics_count_content_views', 0)) {
+    return array(
+      'views' => array(
+        'title' => t('Number of views'),
+        'join' => array(
+          'type' => 'LEFT',
+          'table' => 'node_counter',
+          'alias' => 'node_counter',
+          'on' => 'node_counter.nid = i.sid',
+        ),
+        // Inverse law that maps the highest view count on the site to 1 and 0 to 0.
+        'score' => '2.0 - 2.0 / (1.0 + node_counter.totalcount * CAST(:scale AS DECIMAL))',
+        'arguments' => array(':scale' => variable_get('node_cron_views_scale', 0)),
+      ),
+    );
+  }
+}
+
+/**
+ * Implements hook_update_index().
+ */
+function statistics_update_index() {
+  variable_set('node_cron_views_scale', 1.0 / max(1, db_query('SELECT MAX(totalcount) FROM {node_counter}')->fetchField()));
+}
diff --git a/htmltest/modules/statistics/statistics.pages.inc b/htmltest/modules/statistics/statistics.pages.inc
new file mode 100644
index 00000000..dd50aae3
--- /dev/null
+++ b/htmltest/modules/statistics/statistics.pages.inc
@@ -0,0 +1,101 @@
+<?php
+
+/**
+ * @file
+ * User page callbacks for the Statistics module.
+ */
+
+/**
+ * Page callback: Displays statistics for a node.
+ *
+ * @return
+ *   A render array containing node statistics. If information for the node was
+ *   not found, this will deliver a page not found error via drupal_not_found().
+ */
+function statistics_node_tracker() {
+  if ($node = node_load(arg(1))) {
+
+    $header = array(
+        array('data' => t('Time'), 'field' => 'a.timestamp', 'sort' => 'desc'),
+        array('data' => t('Referrer'), 'field' => 'a.url'),
+        array('data' => t('User'), 'field' => 'u.name'),
+        array('data' => t('Operations')));
+
+    $query = db_select('accesslog', 'a', array('target' => 'slave'))->extend('PagerDefault')->extend('TableSort');
+    $query->join('users', 'u', 'a.uid = u.uid');
+
+    $query
+      ->fields('a', array('aid', 'timestamp', 'url', 'uid'))
+      ->fields('u', array('name'))
+      ->condition(db_or()
+        ->condition('a.path', 'node/' . $node->nid)
+        ->condition('a.path', 'node/' . $node->nid . '/%', 'LIKE'))
+      ->limit(30)
+      ->orderByHeader($header);
+
+    $result = $query->execute();
+    $rows = array();
+    foreach ($result as $log) {
+      $rows[] = array(
+        array('data' => format_date($log->timestamp, 'short'), 'class' => array('nowrap')),
+        _statistics_link($log->url),
+        theme('username', array('account' => $log)),
+        l(t('details'), "admin/reports/access/$log->aid"),
+      );
+    }
+
+    drupal_set_title($node->title);
+    $build['statistics_table'] = array(
+      '#theme' => 'table',
+      '#header' => $header,
+      '#rows' => $rows,
+      '#empty' => t('No statistics available.'),
+    );
+    $build['statistics_pager'] = array('#theme' => 'pager');
+    return $build;
+  }
+  return MENU_NOT_FOUND;
+}
+
+/**
+ * Page callback: Displays statistics for a user.
+ *
+ * @return array
+ *   A render array containing user statistics. If information for the user was
+ *   not found, this will deliver a page not found error via drupal_not_found().
+ */
+function statistics_user_tracker() {
+  if ($account = user_load(arg(1))) {
+
+    $header = array(
+        array('data' => t('Timestamp'), 'field' => 'timestamp', 'sort' => 'desc'),
+        array('data' => t('Page'), 'field' => 'path'),
+        array('data' => t('Operations')));
+    $query = db_select('accesslog', 'a', array('target' => 'slave'))->extend('PagerDefault')->extend('TableSort');
+    $query
+      ->fields('a', array('aid', 'timestamp', 'path', 'title'))
+      ->condition('uid', $account->uid)
+      ->limit(30)
+      ->orderByHeader($header);
+
+    $result = $query->execute();
+    $rows = array();
+    foreach ($result as $log) {
+      $rows[] = array(
+        array('data' => format_date($log->timestamp, 'short'), 'class' => array('nowrap')),
+        _statistics_format_item($log->title, $log->path),
+        l(t('details'), "admin/reports/access/$log->aid"));
+    }
+
+    drupal_set_title(format_username($account));
+    $build['statistics_table'] = array(
+      '#theme' => 'table',
+      '#header' => $header,
+      '#rows' => $rows,
+      '#empty' => t('No statistics available.'),
+    );
+    $build['statistics_pager'] = array('#theme' => 'pager');
+    return $build;
+  }
+  return MENU_NOT_FOUND;
+}
diff --git a/htmltest/modules/statistics/statistics.php b/htmltest/modules/statistics/statistics.php
new file mode 100644
index 00000000..f00e0397
--- /dev/null
+++ b/htmltest/modules/statistics/statistics.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Handles counts of node views via Ajax with minimal bootstrap.
+ */
+
+/**
+* Root directory of Drupal installation.
+*/
+define('DRUPAL_ROOT', substr($_SERVER['SCRIPT_FILENAME'], 0, strpos($_SERVER['SCRIPT_FILENAME'], '/modules/statistics/statistics.php')));
+// Change the directory to the Drupal root.
+chdir(DRUPAL_ROOT);
+
+include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
+drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES);
+if (variable_get('statistics_count_content_views', 0) && variable_get('statistics_count_content_views_ajax', 0)) {
+  $nid = $_POST['nid'];
+  if (is_numeric($nid)) {
+    db_merge('node_counter')
+      ->key(array('nid' => $nid))
+      ->fields(array(
+        'daycount' => 1,
+        'totalcount' => 1,
+        'timestamp' => REQUEST_TIME,
+      ))
+      ->expression('daycount', 'daycount + 1')
+      ->expression('totalcount', 'totalcount + 1')
+      ->execute();
+  }
+}
diff --git a/htmltest/modules/statistics/statistics.test b/htmltest/modules/statistics/statistics.test
new file mode 100644
index 00000000..0498bb76
--- /dev/null
+++ b/htmltest/modules/statistics/statistics.test
@@ -0,0 +1,500 @@
+<?php
+
+/**
+ * @file
+ * Tests for the Statistics module.
+ */
+
+/**
+ * Defines a base class for testing the Statistics module.
+ */
+class StatisticsTestCase extends DrupalWebTestCase {
+
+  function setUp() {
+    parent::setUp('statistics');
+
+    // Create user.
+    $this->blocking_user = $this->drupalCreateUser(array(
+      'access administration pages',
+      'access site reports',
+      'access statistics',
+      'block IP addresses',
+      'administer blocks',
+      'administer statistics',
+      'administer users',
+    ));
+    $this->drupalLogin($this->blocking_user);
+
+    // Enable access logging.
+    variable_set('statistics_enable_access_log', 1);
+    variable_set('statistics_count_content_views', 1);
+
+    // Insert dummy access by anonymous user into access log.
+    db_insert('accesslog')
+      ->fields(array(
+        'title' => 'test',
+        'path' => 'node/1',
+        'url' => 'http://example.com',
+        'hostname' => '192.168.1.1',
+        'uid' => 0,
+        'sid' => 10,
+        'timer' => 10,
+        'timestamp' => REQUEST_TIME,
+      ))
+      ->execute();
+  }
+}
+
+/**
+ * Tests that logging via statistics_exit() works for all pages.
+ *
+ * We subclass DrupalWebTestCase rather than StatisticsTestCase, because we
+ * want to test requests from an anonymous user.
+ */
+class StatisticsLoggingTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Statistics logging tests',
+      'description' => 'Tests request logging for cached and uncached pages.',
+      'group' => 'Statistics'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('statistics');
+
+    $this->auth_user = $this->drupalCreateUser(array('access content', 'create page content', 'edit own page content'));
+
+    // Ensure we have a node page to access.
+    $this->node = $this->drupalCreateNode(array('title' => $this->randomName(255), 'uid' => $this->auth_user->uid));
+
+    // Enable page caching.
+    variable_set('cache', TRUE);
+
+    // Enable access logging.
+    variable_set('statistics_enable_access_log', 1);
+    variable_set('statistics_count_content_views', 1);
+
+    // Clear the logs.
+    db_truncate('accesslog');
+    db_truncate('node_counter');
+  }
+
+  /**
+   * Verifies request logging for cached and uncached pages.
+   */
+  function testLogging() {
+    $path = 'node/' . $this->node->nid;
+    $expected = array(
+      'title' => $this->node->title,
+      'path' => $path,
+    );
+
+    // Verify logging of an uncached page.
+    $this->drupalGet($path);
+    $this->assertIdentical($this->drupalGetHeader('X-Drupal-Cache'), 'MISS', 'Testing an uncached page.');
+    $log = db_query('SELECT * FROM {accesslog}')->fetchAll(PDO::FETCH_ASSOC);
+    $this->assertTrue(is_array($log) && count($log) == 1, 'Page request was logged.');
+    $this->assertEqual(array_intersect_key($log[0], $expected), $expected);
+    $node_counter = statistics_get($this->node->nid);
+    $this->assertIdentical($node_counter['totalcount'], '1');
+
+    // Verify logging of a cached page.
+    $this->drupalGet($path);
+    $this->assertIdentical($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Testing a cached page.');
+    $log = db_query('SELECT * FROM {accesslog}')->fetchAll(PDO::FETCH_ASSOC);
+    $this->assertTrue(is_array($log) && count($log) == 2, 'Page request was logged.');
+    $this->assertEqual(array_intersect_key($log[1], $expected), $expected);
+    $node_counter = statistics_get($this->node->nid);
+    $this->assertIdentical($node_counter['totalcount'], '2');
+
+    // Test logging from authenticated users
+    $this->drupalLogin($this->auth_user);
+    $this->drupalGet($path);
+    $log = db_query('SELECT * FROM {accesslog}')->fetchAll(PDO::FETCH_ASSOC);
+    // Check the 6th item since login and account pages are also logged
+    $this->assertTrue(is_array($log) && count($log) == 6, 'Page request was logged.');
+    $this->assertEqual(array_intersect_key($log[5], $expected), $expected);
+    $node_counter = statistics_get($this->node->nid);
+    $this->assertIdentical($node_counter['totalcount'], '3');
+
+    // Test that Ajax logging doesn't occur when disabled.
+    $post = http_build_query(array('nid' => $this->node->nid));
+    $headers = array('Content-Type' => 'application/x-www-form-urlencoded');
+    global $base_url;
+    $stats_path = $base_url . '/' . drupal_get_path('module', 'statistics'). '/statistics.php';
+    drupal_http_request($stats_path, array('method' => 'POST', 'data' => $post, 'headers' => $headers, 'timeout' => 10000));
+    $node_counter = statistics_get($this->node->nid);
+    $this->assertIdentical($node_counter['totalcount'], '3', 'Page request was not counted via Ajax.');
+
+    // Test that Ajax logging occurs when enabled.
+    variable_set('statistics_count_content_views_ajax', 1);
+    drupal_http_request($stats_path, array('method' => 'POST', 'data' => $post, 'headers' => $headers, 'timeout' => 10000));
+    $node_counter = statistics_get($this->node->nid);
+    $this->assertIdentical($node_counter['totalcount'], '4', 'Page request was counted via Ajax.');
+    variable_set('statistics_count_content_views_ajax', 0);
+
+    // Visit edit page to generate a title greater than 255.
+    $path = 'node/' . $this->node->nid . '/edit';
+    $expected = array(
+      'title' => truncate_utf8(t('Edit Basic page') . ' ' . $this->node->title, 255),
+      'path' => $path,
+    );
+    $this->drupalGet($path);
+    $log = db_query('SELECT * FROM {accesslog}')->fetchAll(PDO::FETCH_ASSOC);
+    $this->assertTrue(is_array($log) && count($log) == 7, 'Page request was logged.');
+    $this->assertEqual(array_intersect_key($log[6], $expected), $expected);
+
+    // Create a path longer than 255 characters. Drupal's .htaccess file
+    // instructs Apache to test paths against the file system before routing to
+    // index.php. Many file systems restrict file names to 255 characters
+    // (http://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits), and
+    // Apache returns a 403 when testing longer file names, but the total path
+    // length is not restricted.
+    $long_path = $this->randomName(127) . '/' . $this->randomName(128);
+
+    // Test that the long path is properly truncated when logged.
+    $this->drupalGet($long_path);
+    $log = db_query('SELECT * FROM {accesslog}')->fetchAll(PDO::FETCH_ASSOC);
+    $this->assertTrue(is_array($log) && count($log) == 8, 'Page request was logged for a path over 255 characters.');
+    $this->assertEqual($log[7]['path'], truncate_utf8($long_path, 255));
+  }
+}
+
+/**
+ * Tests that report pages render properly, and that access logging works.
+ */
+class StatisticsReportsTestCase extends StatisticsTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Statistics reports tests',
+      'description' => 'Tests display of statistics report pages and access logging.',
+      'group' => 'Statistics'
+    );
+  }
+
+  /**
+   * Verifies that 'Recent hits' renders properly and displays the added hit.
+   */
+  function testRecentHits() {
+    $this->drupalGet('admin/reports/hits');
+    $this->assertText('test', 'Hit title found.');
+    $this->assertText('node/1', 'Hit URL found.');
+    $this->assertText('Anonymous', 'Hit user found.');
+  }
+
+  /**
+   * Verifies that 'Top pages' renders properly and displays the added hit.
+   */
+  function testTopPages() {
+    $this->drupalGet('admin/reports/pages');
+    $this->assertText('test', 'Hit title found.');
+    $this->assertText('node/1', 'Hit URL found.');
+  }
+
+  /**
+   * Verifies that 'Top referrers' renders properly and displays the added hit.
+   */
+  function testTopReferrers() {
+    $this->drupalGet('admin/reports/referrers');
+    $this->assertText('http://example.com', 'Hit referrer found.');
+  }
+
+  /**
+   * Verifies that 'Details' page renders properly and displays the added hit.
+   */
+  function testDetails() {
+    $this->drupalGet('admin/reports/access/1');
+    $this->assertText('test', 'Hit title found.');
+    $this->assertText('node/1', 'Hit URL found.');
+    $this->assertText('Anonymous', 'Hit user found.');
+  }
+
+  /**
+   * Verifies that access logging is working and is reported correctly.
+   */
+  function testAccessLogging() {
+    $this->drupalGet('admin/reports/referrers');
+    $this->drupalGet('admin/reports/hits');
+    $this->assertText('Top referrers in the past 3 days', 'Hit title found.');
+    $this->assertText('admin/reports/referrers', 'Hit URL found.');
+  }
+
+  /**
+   * Tests the "popular content" block.
+   */
+  function testPopularContentBlock() {
+    // Visit a node to have something show up in the block.
+    $node = $this->drupalCreateNode(array('type' => 'page', 'uid' => $this->blocking_user->uid));
+    $this->drupalGet('node/' . $node->nid);
+
+    // Configure and save the block.
+    $block = block_load('statistics', 'popular');
+    $block->theme = variable_get('theme_default', 'bartik');
+    $block->status = 1;
+    $block->pages = '';
+    $block->region = 'sidebar_first';
+    $block->cache = -1;
+    $block->visibility = 0;
+    $edit = array('statistics_block_top_day_num' => 3, 'statistics_block_top_all_num' => 3, 'statistics_block_top_last_num' => 3);
+    module_invoke('statistics', 'block_save', 'popular', $edit);
+    drupal_write_record('block', $block);
+
+    // Get some page and check if the block is displayed.
+    $this->drupalGet('user');
+    $this->assertText('Popular content', 'Found the popular content block.');
+    $this->assertText("Today's", 'Found today\'s popular content.');
+    $this->assertText('All time', 'Found the alll time popular content.');
+    $this->assertText('Last viewed', 'Found the last viewed popular content.');
+
+    $this->assertRaw(l($node->title, 'node/' . $node->nid), 'Found link to visited node.');
+  }
+}
+
+/**
+ * Tests that the visitor blocking functionality works.
+ */
+class StatisticsBlockVisitorsTestCase extends StatisticsTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Top visitor blocking',
+      'description' => 'Tests blocking of IP addresses via the top visitors report.',
+      'group' => 'Statistics'
+    );
+  }
+
+  /**
+   * Blocks an IP address via the top visitors report and then unblocks it.
+   */
+  function testIPAddressBlocking() {
+    // IP address for testing.
+    $test_ip_address = '192.168.1.1';
+
+    // Verify the IP address from accesslog appears on the top visitors page
+    // and that a 'block IP address' link is displayed.
+    $this->drupalLogin($this->blocking_user);
+    $this->drupalGet('admin/reports/visitors');
+    $this->assertText($test_ip_address, 'IP address found.');
+    $this->assertText(t('block IP address'), 'Block IP link displayed');
+
+    // Block the IP address.
+    $this->clickLink('block IP address');
+    $this->assertText(t('IP address blocking'), 'IP blocking page displayed.');
+    $edit = array();
+    $edit['ip'] = $test_ip_address;
+    $this->drupalPost('admin/config/people/ip-blocking', $edit, t('Add'));
+    $ip = db_query("SELECT iid from {blocked_ips} WHERE ip = :ip", array(':ip' => $edit['ip']))->fetchField();
+    $this->assertNotEqual($ip, FALSE, 'IP address found in database');
+    $this->assertRaw(t('The IP address %ip has been blocked.', array('%ip' => $edit['ip'])), 'IP address was blocked.');
+
+    // Verify that the block/unblock link on the top visitors page has been
+    // altered.
+    $this->drupalGet('admin/reports/visitors');
+    $this->assertText(t('unblock IP address'), 'Unblock IP address link displayed');
+
+    // Unblock the IP address.
+    $this->clickLink('unblock IP address');
+    $this->assertRaw(t('Are you sure you want to delete %ip?', array('%ip' => $test_ip_address)), 'IP address deletion confirmation found.');
+    $edit = array();
+    $this->drupalPost('admin/config/people/ip-blocking/delete/1', NULL, t('Delete'));
+    $this->assertRaw(t('The IP address %ip was deleted.', array('%ip' => $test_ip_address)), 'IP address deleted.');
+  }
+}
+
+/**
+ * Tests the statistics administration screen.
+ */
+class StatisticsAdminTestCase extends DrupalWebTestCase {
+
+  /**
+   * A user that has permission to administer and access statistics.
+   *
+   * @var object|FALSE
+   *
+   * A fully loaded user object, or FALSE if user creation failed.
+   */
+  protected $privileged_user;
+
+  /**
+   * A page node for which to check access statistics.
+   *
+   * @var object
+   */
+  protected $test_node;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Test statistics admin.',
+      'description' => 'Tests the statistics admin.',
+      'group' => 'Statistics'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('statistics');
+    $this->privileged_user = $this->drupalCreateUser(array('access statistics', 'administer statistics', 'view post access counter', 'create page content'));
+    $this->drupalLogin($this->privileged_user);
+    $this->test_node = $this->drupalCreateNode(array('type' => 'page', 'uid' => $this->privileged_user->uid));
+  }
+
+  /**
+   * Verifies that the statistics settings page works.
+   */
+  function testStatisticsSettings() {
+    $this->assertFalse(variable_get('statistics_enable_access_log', 0), 'Access log is disabled by default.');
+    $this->assertFalse(variable_get('statistics_count_content_views', 0), 'Count content view log is disabled by default.');
+
+    $this->drupalGet('admin/reports/pages');
+    $this->assertRaw(t('No statistics available.'), 'Verifying text shown when no statistics is available.');
+
+    // Enable access log and counter on content view.
+    $edit['statistics_enable_access_log'] = 1;
+    $edit['statistics_count_content_views'] = 1;
+    $this->drupalPost('admin/config/system/statistics', $edit, t('Save configuration'));
+    $this->assertTrue(variable_get('statistics_enable_access_log'), 'Access log is enabled.');
+    $this->assertTrue(variable_get('statistics_count_content_views'), 'Count content view log is enabled.');
+
+    // Hit the node.
+    $this->drupalGet('node/' . $this->test_node->nid);
+
+    $this->drupalGet('admin/reports/pages');
+    $this->assertText('node/1', 'Test node found.');
+
+    // Hit the node again (the counter is incremented after the hit, so
+    // "1 read" will actually be shown when the node is hit the second time).
+    $this->drupalGet('node/' . $this->test_node->nid);
+    $this->assertText('1 read', 'Node is read once.');
+
+    $this->drupalGet('node/' . $this->test_node->nid);
+    $this->assertText('2 reads', 'Node is read 2 times.');
+  }
+
+  /**
+   * Tests that when a node is deleted, the node counter is deleted too.
+   */
+  function testDeleteNode() {
+    variable_set('statistics_count_content_views', 1);
+
+    $this->drupalGet('node/' . $this->test_node->nid);
+
+    $result = db_select('node_counter', 'n')
+      ->fields('n', array('nid'))
+      ->condition('n.nid', $this->test_node->nid)
+      ->execute()
+      ->fetchAssoc();
+    $this->assertEqual($result['nid'], $this->test_node->nid, 'Verifying that the node counter is incremented.');
+
+    node_delete($this->test_node->nid);
+
+    $result = db_select('node_counter', 'n')
+      ->fields('n', array('nid'))
+      ->condition('n.nid', $this->test_node->nid)
+      ->execute()
+      ->fetchAssoc();
+    $this->assertFalse($result, 'Verifying that the node counter is deleted.');
+  }
+
+  /**
+   * Tests that accesslog reflects when a user is deleted.
+   */
+  function testDeleteUser() {
+    variable_set('statistics_enable_access_log', 1);
+
+    variable_set('user_cancel_method', 'user_cancel_delete');
+    $this->drupalLogout($this->privileged_user);
+    $account = $this->drupalCreateUser(array('access content', 'cancel account'));
+    $this->drupalLogin($account);
+    $this->drupalGet('node/' . $this->test_node->nid);
+
+    $account = user_load($account->uid, TRUE);
+
+    $this->drupalGet('user/' . $account->uid . '/edit');
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+
+    $timestamp = time();
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+    // Confirm account cancellation request.
+    $this->drupalGet("user/$account->uid/cancel/confirm/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login));
+    $this->assertFalse(user_load($account->uid, TRUE), 'User is not found in the database.');
+
+    $this->drupalGet('admin/reports/visitors');
+    $this->assertNoText($account->name, 'Did not find user in visitor statistics.');
+  }
+
+  /**
+   * Tests that cron clears day counts and expired access logs.
+   */
+  function testExpiredLogs() {
+    variable_set('statistics_enable_access_log', 1);
+    variable_set('statistics_count_content_views', 1);
+    variable_set('statistics_day_timestamp', 8640000);
+    variable_set('statistics_flush_accesslog_timer', 1);
+
+    $this->drupalGet('node/' . $this->test_node->nid);
+    $this->drupalGet('node/' . $this->test_node->nid);
+    $this->assertText('1 read', 'Node is read once.');
+
+    $this->drupalGet('admin/reports/pages');
+    $this->assertText('node/' . $this->test_node->nid, 'Hit URL found.');
+
+    // statistics_cron will subtract the statistics_flush_accesslog_timer
+    // variable from REQUEST_TIME in the delete query, so wait two secs here to
+    // make sure the access log will be flushed for the node just hit.
+    sleep(2);
+    $this->cronRun();
+
+    $this->drupalGet('admin/reports/pages');
+    $this->assertNoText('node/' . $this->test_node->nid, 'No hit URL found.');
+
+    $result = db_select('node_counter', 'nc')
+      ->fields('nc', array('daycount'))
+      ->condition('nid', $this->test_node->nid, '=')
+      ->execute()
+      ->fetchField();
+    $this->assertFalse($result, 'Daycounter is zero.');
+  }
+}
+
+/**
+ * Tests statistics token replacement in strings.
+ */
+class StatisticsTokenReplaceTestCase extends StatisticsTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Statistics token replacement',
+      'description' => 'Generates text using placeholders for dummy content to check statistics token replacement.',
+      'group' => 'Statistics',
+    );
+  }
+
+  /**
+   * Creates a node, then tests the statistics tokens generated from it.
+   */
+  function testStatisticsTokenReplacement() {
+    global $language;
+
+    // Create user and node.
+    $user = $this->drupalCreateUser(array('create page content'));
+    $this->drupalLogin($user);
+    $node = $this->drupalCreateNode(array('type' => 'page', 'uid' => $user->uid));
+
+    // Hit the node.
+    $this->drupalGet('node/' . $node->nid);
+    $statistics = statistics_get($node->nid);
+
+    // Generate and test tokens.
+    $tests = array();
+    $tests['[node:total-count]'] = 1;
+    $tests['[node:day-count]'] = 1;
+    $tests['[node:last-view]'] = format_date($statistics['timestamp']);
+    $tests['[node:last-view:short]'] = format_date($statistics['timestamp'], 'short');
+
+    // Test to make sure that we generated something for each token.
+    $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('node' => $node), array('language' => $language));
+      $this->assertEqual($output, $expected, format_string('Statistics token %token replaced.', array('%token' => $input)));
+    }
+  }
+}
diff --git a/htmltest/modules/statistics/statistics.tokens.inc b/htmltest/modules/statistics/statistics.tokens.inc
new file mode 100644
index 00000000..c2c8fc3c
--- /dev/null
+++ b/htmltest/modules/statistics/statistics.tokens.inc
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @file
+ * Builds placeholder replacement tokens for node visitor statistics.
+ */
+
+/**
+ * Implements hook_token_info().
+ */
+function statistics_token_info() {
+  $node['total-count'] = array(
+    'name' => t("Number of views"),
+    'description' => t("The number of visitors who have read the node."),
+  );
+  $node['day-count'] = array(
+    'name' => t("Views today"),
+    'description' => t("The number of visitors who have read the node today."),
+  );
+  $node['last-view'] = array(
+    'name' => t("Last view"),
+    'description' => t("The date on which a visitor last read the node."),
+    'type' => 'date',
+  );
+
+  return array(
+    'tokens' => array('node' => $node),
+  );
+}
+
+/**
+ * Implements hook_tokens().
+ */
+function statistics_tokens($type, $tokens, array $data = array(), array $options = array()) {
+  $url_options = array('absolute' => TRUE);
+  $replacements = array();
+
+  if ($type == 'node' & !empty($data['node'])) {
+    $node = $data['node'];
+
+    foreach ($tokens as $name => $original) {
+      if ($name == 'total-count') {
+        $statistics = statistics_get($node->nid);
+        $replacements[$original] = $statistics['totalcount'];
+      }
+      elseif ($name == 'day-count') {
+        $statistics = statistics_get($node->nid);
+        $replacements[$original] = $statistics['daycount'];
+      }
+      elseif ($name == 'last-view') {
+        $statistics = statistics_get($node->nid);
+        $replacements[$original] = format_date($statistics['timestamp']);
+      }
+    }
+
+    if ($created_tokens = token_find_with_prefix($tokens, 'last-view')) {
+      $statistics = statistics_get($node->nid);
+      $replacements += token_generate('date', $created_tokens, array('date' => $statistics['timestamp']), $options);
+    }
+  }
+
+  return $replacements;
+}
diff --git a/htmltest/modules/syslog/syslog.info b/htmltest/modules/syslog/syslog.info
new file mode 100644
index 00000000..96d967ff
--- /dev/null
+++ b/htmltest/modules/syslog/syslog.info
@@ -0,0 +1,13 @@
+name = Syslog
+description = Logs and records system events to syslog.
+package = Core
+version = VERSION
+core = 7.x
+files[] = syslog.test
+configure = admin/config/development/logging
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/syslog/syslog.install b/htmltest/modules/syslog/syslog.install
new file mode 100644
index 00000000..12ff4fb2
--- /dev/null
+++ b/htmltest/modules/syslog/syslog.install
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the syslog module.
+ */
+
+/**
+ * Implements hook_uninstall().
+ */
+function syslog_uninstall() {
+  variable_del('syslog_identity');
+  variable_del('syslog_facility');
+  variable_del('syslog_format');
+}
diff --git a/htmltest/modules/syslog/syslog.module b/htmltest/modules/syslog/syslog.module
new file mode 100644
index 00000000..af3eb0a0
--- /dev/null
+++ b/htmltest/modules/syslog/syslog.module
@@ -0,0 +1,119 @@
+<?php
+
+/**
+ * @file
+ * Redirects logging messages to syslog.
+ */
+
+if (defined('LOG_LOCAL0')) {
+  /**
+   * Sets the proper logging facility.
+   *
+   * Note that LOG_LOCAL0 through LOG_LOCAL7 are not available on Windows, so we
+   * check for availability. If LOG_LOCAL0 is defined by the PHP environment, we
+   * set that as the default; if not, we use LOG_USER.
+   *
+   * @see http://php.net/manual/function.syslog.php
+   */
+  define('DEFAULT_SYSLOG_FACILITY', LOG_LOCAL0);
+}
+else {
+  define('DEFAULT_SYSLOG_FACILITY', LOG_USER);
+}
+
+/**
+ * Implements hook_help().
+ */
+function syslog_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#syslog':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t("The Syslog module logs events by sending messages to the logging facility of your web server's operating system. Syslog is an operating system administrative logging tool that provides valuable information for use in system management and security auditing. Most suited to medium and large sites, Syslog provides filtering tools that allow messages to be routed by type and severity. For more information, see the online handbook entry for <a href='@syslog'>Syslog module</a> and PHP's <a href='@php_openlog'>openlog</a> and <a href='@php_syslog'>syslog</a> functions.", array('@syslog' => 'http://drupal.org/documentation/modules/syslog', '@php_openlog' => 'http://www.php.net/manual/function.openlog.php', '@php_syslog' => 'http://www.php.net/manual/function.syslog.php')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Logging for UNIX, Linux, and Mac OS X') . '</dt>';
+      $output .= '<dd>' . t('On UNIX, Linux, and Mac OS X, the file <em>/etc/syslog.conf</em> defines the routing configuration. Messages can be flagged with the codes <code>LOG_LOCAL0</code> through <code>LOG_LOCAL7</code>. For information on Syslog facilities, severity levels, and how to set up <em>syslog.conf</em>, see the <em>syslog.conf</em> manual page on your command line.') . '</dd>';
+      $output .= '<dt>' . t('Logging for Microsoft Windows') . '</dt>';
+      $output .= '<dd>' . t('On Microsoft Windows, messages are always sent to the Event Log using the code <code>LOG_USER</code>.') . '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function syslog_form_system_logging_settings_alter(&$form, &$form_state) {
+  $help = module_exists('help') ? ' ' . l(t('More information'), 'admin/help/syslog') . '.' : NULL;
+  $form['syslog_identity'] = array(
+    '#type'          => 'textfield',
+    '#title'         => t('Syslog identity'),
+    '#default_value' => variable_get('syslog_identity', 'drupal'),
+    '#description'   => t('A string that will be prepended to every message logged to Syslog. If you have multiple sites logging to the same Syslog log file, a unique identity per site makes it easy to tell the log entries apart.') . $help,
+  );
+  if (defined('LOG_LOCAL0')) {
+    $form['syslog_facility'] = array(
+      '#type'          => 'select',
+      '#title'         => t('Syslog facility'),
+      '#default_value' => variable_get('syslog_facility', LOG_LOCAL0),
+      '#options'       => syslog_facility_list(),
+      '#description'   => t('Depending on the system configuration, Syslog and other logging tools use this code to identify or filter messages from within the entire system log.') . $help,
+     );
+  }
+  $form['syslog_format'] = array(
+    '#type'          => 'textarea',
+    '#title'         => t('Syslog format'),
+    '#default_value' => variable_get('syslog_format', '!base_url|!timestamp|!type|!ip|!request_uri|!referer|!uid|!link|!message'),
+    '#description'   => t('Specify the format of the syslog entry. Available variables are: <dl><dt><code>!base_url</code></dt><dd>Base URL of the site.</dd><dt><code>!timestamp</code></dt><dd>Unix timestamp of the log entry.</dd><dt><code>!type</code></dt><dd>The category to which this message belongs.</dd><dt><code>!ip</code></dt><dd>IP address of the user triggering the message.</dd><dt><code>!request_uri</code></dt><dd>The requested URI.</dd><dt><code>!referer</code></dt><dd>HTTP Referer if available.</dd><dt><code>!uid</code></dt><dd>User ID.</dd><dt><code>!link</code></dt><dd>A link to associate with the message.</dd><dt><code>!message</code></dt><dd>The message to store in the log.</dd></dl>'),
+  );
+  $form['actions']['#weight'] = 1;
+}
+
+/**
+ * Lists all possible syslog facilities for UNIX/Linux.
+ *
+ * @return array
+ *   An array of syslog facilities for UNIX/Linux.
+ */
+function syslog_facility_list() {
+  return array(
+    LOG_LOCAL0 => 'LOG_LOCAL0',
+    LOG_LOCAL1 => 'LOG_LOCAL1',
+    LOG_LOCAL2 => 'LOG_LOCAL2',
+    LOG_LOCAL3 => 'LOG_LOCAL3',
+    LOG_LOCAL4 => 'LOG_LOCAL4',
+    LOG_LOCAL5 => 'LOG_LOCAL5',
+    LOG_LOCAL6 => 'LOG_LOCAL6',
+    LOG_LOCAL7 => 'LOG_LOCAL7',
+  );
+}
+
+/**
+ * Implements hook_watchdog().
+ */
+function syslog_watchdog(array $log_entry) {
+  global $base_url;
+
+  $log_init = &drupal_static(__FUNCTION__, FALSE);
+
+  if (!$log_init) {
+    $log_init = TRUE;
+    $default_facility = defined('LOG_LOCAL0') ? LOG_LOCAL0 : LOG_USER;
+    openlog(variable_get('syslog_identity', 'drupal'), LOG_NDELAY, variable_get('syslog_facility', $default_facility));
+  }
+
+  $message = strtr(variable_get('syslog_format', '!base_url|!timestamp|!type|!ip|!request_uri|!referer|!uid|!link|!message'), array(
+    '!base_url'    => $base_url,
+    '!timestamp'   => $log_entry['timestamp'],
+    '!type'        => $log_entry['type'],
+    '!ip'          => $log_entry['ip'],
+    '!request_uri' => $log_entry['request_uri'],
+    '!referer'     => $log_entry['referer'],
+    '!uid'         => $log_entry['uid'],
+    '!link'        => strip_tags($log_entry['link']),
+    '!message'     => strip_tags(!isset($log_entry['variables']) ? $log_entry['message'] : strtr($log_entry['message'], $log_entry['variables'])),
+  ));
+
+  syslog($log_entry['severity'], $message);
+}
diff --git a/htmltest/modules/syslog/syslog.test b/htmltest/modules/syslog/syslog.test
new file mode 100644
index 00000000..4707bd0d
--- /dev/null
+++ b/htmltest/modules/syslog/syslog.test
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @file
+ * Tests for syslog.module.
+ */
+
+/**
+ * Tests the Syslog module functionality.
+ */
+class SyslogTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Syslog functionality',
+      'description' => 'Test syslog settings.',
+      'group' => 'Syslog'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('syslog');
+  }
+
+  /**
+   * Tests the syslog settings page.
+   */
+  function testSettings() {
+    $admin_user = $this->drupalCreateUser(array('administer site configuration'));
+    $this->drupalLogin($admin_user);
+
+    $edit = array();
+    // If we're on Windows, there is no configuration form.
+    if (defined('LOG_LOCAL6')) {
+      $this->drupalPost('admin/config/development/logging', array('syslog_facility' => LOG_LOCAL6), t('Save configuration'));
+      $this->assertText(t('The configuration options have been saved.'));
+
+      $this->drupalGet('admin/config/development/logging');
+      if ($this->parse()) {
+        $field = $this->xpath('//option[@value=:value]', array(':value' => LOG_LOCAL6)); // Should be one field.
+        $this->assertTrue($field[0]['selected'] == 'selected', 'Facility value saved.');
+      }
+    }
+  }
+}
diff --git a/htmltest/modules/system/html.tpl.php b/htmltest/modules/system/html.tpl.php
new file mode 100644
index 00000000..c3e24c94
--- /dev/null
+++ b/htmltest/modules/system/html.tpl.php
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to display the basic html structure of a single
+ * Drupal page.
+ *
+ * Variables:
+ * - $css: An array of CSS files for the current page.
+ * - $language: (object) The language the site is being displayed in.
+ *   $language->language contains its textual representation.
+ *   $language->dir contains the language direction. It will either be 'ltr' or 'rtl'.
+ * - $rdf_namespaces: All the RDF namespace prefixes used in the HTML document.
+ * - $grddl_profile: A GRDDL profile allowing agents to extract the RDF data.
+ * - $head_title: A modified version of the page title, for use in the TITLE
+ *   tag.
+ * - $head_title_array: (array) An associative array containing the string parts
+ *   that were used to generate the $head_title variable, already prepared to be
+ *   output as TITLE tag. The key/value pairs may contain one or more of the
+ *   following, depending on conditions:
+ *   - title: The title of the current page, if any.
+ *   - name: The name of the site.
+ *   - slogan: The slogan of the site, if any, and if there is no title.
+ * - $head: Markup for the HEAD section (including meta tags, keyword tags, and
+ *   so on).
+ * - $styles: Style tags necessary to import all CSS files for the page.
+ * - $scripts: Script tags necessary to load the JavaScript files and settings
+ *   for the page.
+ * - $page_top: Initial markup from any modules that have altered the
+ *   page. This variable should always be output first, before all other dynamic
+ *   content.
+ * - $page: The rendered page content.
+ * - $page_bottom: Final closing markup from any modules that have altered the
+ *   page. This variable should always be output last, after all other dynamic
+ *   content.
+ * - $classes String of classes that can be used to style contextually through
+ *   CSS.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_html()
+ * @see template_process()
+ *
+ * @ingroup themeable
+ */
+?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
+  "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php print $language->language; ?>" version="XHTML+RDFa 1.0" dir="<?php print $language->dir; ?>"<?php print $rdf_namespaces; ?>>
+
+<head profile="<?php print $grddl_profile; ?>">
+  <?php print $head; ?>
+  <title><?php print $head_title; ?></title>
+  <?php print $styles; ?>
+  <?php print $scripts; ?>
+</head>
+<body class="<?php print $classes; ?>" <?php print $attributes;?>>
+  <div id="skip-link">
+    <a href="#main-content" class="element-invisible element-focusable"><?php print t('Skip to main content'); ?></a>
+  </div>
+  <?php print $page_top; ?>
+  <?php print $page; ?>
+  <?php print $page_bottom; ?>
+</body>
+</html>
diff --git a/htmltest/modules/system/image.gd.inc b/htmltest/modules/system/image.gd.inc
new file mode 100644
index 00000000..91c0b05f
--- /dev/null
+++ b/htmltest/modules/system/image.gd.inc
@@ -0,0 +1,367 @@
+<?php
+
+/**
+ * @file
+ * GD2 toolkit for image manipulation within Drupal.
+ */
+
+/**
+ * @addtogroup image
+ * @{
+ */
+
+/**
+ * Retrieve settings for the GD2 toolkit.
+ */
+function image_gd_settings() {
+  if (image_gd_check_settings()) {
+    $form['status'] = array(
+      '#markup' => t('The GD toolkit is installed and working properly.')
+    );
+
+    $form['image_jpeg_quality'] = array(
+      '#type' => 'textfield',
+      '#title' => t('JPEG quality'),
+      '#description' => t('Define the image quality for JPEG manipulations. Ranges from 0 to 100. Higher values mean better image quality but bigger files.'),
+      '#size' => 10,
+      '#maxlength' => 3,
+      '#default_value' => variable_get('image_jpeg_quality', 75),
+      '#field_suffix' => t('%'),
+    );
+    $form['#element_validate'] = array('image_gd_settings_validate');
+
+    return $form;
+  }
+  else {
+    form_set_error('image_toolkit', t('The GD image toolkit requires that the GD module for PHP be installed and configured properly. For more information see <a href="@url">PHP\'s image documentation</a>.', array('@url' => 'http://php.net/image')));
+    return FALSE;
+  }
+}
+
+/**
+ * Validate the submitted GD settings.
+ */
+function image_gd_settings_validate($form, &$form_state) {
+  // Validate image quality range.
+  $value = $form_state['values']['image_jpeg_quality'];
+  if (!is_numeric($value) || $value < 0 || $value > 100) {
+    form_set_error('image_jpeg_quality', t('JPEG quality must be a number between 0 and 100.'));
+  }
+}
+
+/**
+ * Verify GD2 settings (that the right version is actually installed).
+ *
+ * @return
+ *   A boolean indicating if the GD toolkit is available on this machine.
+ */
+function image_gd_check_settings() {
+  if ($check = get_extension_funcs('gd')) {
+    if (in_array('imagegd2', $check)) {
+      // GD2 support is available.
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Scale an image to the specified size using GD.
+ *
+ * @param $image
+ *   An image object. The $image->resource, $image->info['width'], and
+ *   $image->info['height'] values will be modified by this call.
+ * @param $width
+ *   The new width of the resized image, in pixels.
+ * @param $height
+ *   The new height of the resized image, in pixels.
+ * @return
+ *   TRUE or FALSE, based on success.
+ *
+ * @see image_resize()
+ */
+function image_gd_resize(stdClass $image, $width, $height) {
+  $res = image_gd_create_tmp($image, $width, $height);
+
+  if (!imagecopyresampled($res, $image->resource, 0, 0, 0, 0, $width, $height, $image->info['width'], $image->info['height'])) {
+    return FALSE;
+  }
+
+  imagedestroy($image->resource);
+  // Update image object.
+  $image->resource = $res;
+  $image->info['width'] = $width;
+  $image->info['height'] = $height;
+  return TRUE;
+}
+
+/**
+ * Rotate an image the given number of degrees.
+ *
+ * @param $image
+ *   An image object. The $image->resource, $image->info['width'], and
+ *   $image->info['height'] values will be modified by this call.
+ * @param $degrees
+ *   The number of (clockwise) degrees to rotate the image.
+ * @param $background
+ *   An hexadecimal integer specifying the background color to use for the
+ *   uncovered area of the image after the rotation. E.g. 0x000000 for black,
+ *   0xff00ff for magenta, and 0xffffff for white. For images that support
+ *   transparency, this will default to transparent. Otherwise it will
+ *   be white.
+ * @return
+ *   TRUE or FALSE, based on success.
+ *
+ * @see image_rotate()
+ */
+function image_gd_rotate(stdClass $image, $degrees, $background = NULL) {
+  // PHP installations using non-bundled GD do not have imagerotate.
+  if (!function_exists('imagerotate')) {
+    watchdog('image', 'The image %file could not be rotated because the imagerotate() function is not available in this PHP installation.', array('%file' => $image->source));
+    return FALSE;
+  }
+
+  $width = $image->info['width'];
+  $height = $image->info['height'];
+
+  // Convert the hexadecimal background value to a color index value.
+  if (isset($background)) {
+    $rgb = array();
+    for ($i = 16; $i >= 0; $i -= 8) {
+      $rgb[] = (($background >> $i) & 0xFF);
+    }
+    $background = imagecolorallocatealpha($image->resource, $rgb[0], $rgb[1], $rgb[2], 0);
+  }
+  // Set the background color as transparent if $background is NULL.
+  else {
+    // Get the current transparent color.
+    $background = imagecolortransparent($image->resource);
+
+    // If no transparent colors, use white.
+    if ($background == 0) {
+      $background = imagecolorallocatealpha($image->resource, 255, 255, 255, 0);
+    }
+  }
+
+  // Images are assigned a new color palette when rotating, removing any
+  // transparency flags. For GIF images, keep a record of the transparent color.
+  if ($image->info['extension'] == 'gif') {
+    $transparent_index = imagecolortransparent($image->resource);
+    if ($transparent_index != 0) {
+      $transparent_gif_color = imagecolorsforindex($image->resource, $transparent_index);
+    }
+  }
+
+  $image->resource = imagerotate($image->resource, 360 - $degrees, $background);
+
+  // GIFs need to reassign the transparent color after performing the rotate.
+  if (isset($transparent_gif_color)) {
+    $background = imagecolorexactalpha($image->resource, $transparent_gif_color['red'], $transparent_gif_color['green'], $transparent_gif_color['blue'], $transparent_gif_color['alpha']);
+    imagecolortransparent($image->resource, $background);
+  }
+
+  $image->info['width'] = imagesx($image->resource);
+  $image->info['height'] = imagesy($image->resource);
+  return TRUE;
+}
+
+/**
+ * Crop an image using the GD toolkit.
+ *
+ * @param $image
+ *   An image object. The $image->resource, $image->info['width'], and
+ *   $image->info['height'] values will be modified by this call.
+ * @param $x
+ *   The starting x offset at which to start the crop, in pixels.
+ * @param $y
+ *   The starting y offset at which to start the crop, in pixels.
+ * @param $width
+ *   The width of the cropped area, in pixels.
+ * @param $height
+ *   The height of the cropped area, in pixels.
+ * @return
+ *   TRUE or FALSE, based on success.
+ *
+ * @see image_crop()
+ */
+function image_gd_crop(stdClass $image, $x, $y, $width, $height) {
+  $res = image_gd_create_tmp($image, $width, $height);
+
+  if (!imagecopyresampled($res, $image->resource, 0, 0, $x, $y, $width, $height, $width, $height)) {
+    return FALSE;
+  }
+
+  // Destroy the original image and return the modified image.
+  imagedestroy($image->resource);
+  $image->resource = $res;
+  $image->info['width'] = $width;
+  $image->info['height'] = $height;
+  return TRUE;
+}
+
+/**
+ * Convert an image resource to grayscale.
+ *
+ * Note that transparent GIFs loose transparency when desaturated.
+ *
+ * @param $image
+ *   An image object. The $image->resource value will be modified by this call.
+ * @return
+ *   TRUE or FALSE, based on success.
+ *
+ * @see image_desaturate()
+ */
+function image_gd_desaturate(stdClass $image) {
+  // PHP installations using non-bundled GD do not have imagefilter.
+  if (!function_exists('imagefilter')) {
+    watchdog('image', 'The image %file could not be desaturated because the imagefilter() function is not available in this PHP installation.', array('%file' => $image->source));
+    return FALSE;
+  }
+
+  return imagefilter($image->resource, IMG_FILTER_GRAYSCALE);
+}
+
+/**
+ * GD helper function to create an image resource from a file.
+ *
+ * @param $image
+ *   An image object. The $image->resource value will populated by this call.
+ * @return
+ *   TRUE or FALSE, based on success.
+ *
+ * @see image_load()
+ */
+function image_gd_load(stdClass $image) {
+  $extension = str_replace('jpg', 'jpeg', $image->info['extension']);
+  $function = 'imagecreatefrom' . $extension;
+  return (function_exists($function) && $image->resource = $function($image->source));
+}
+
+/**
+ * GD helper to write an image resource to a destination file.
+ *
+ * @param $image
+ *   An image object.
+ * @param $destination
+ *   A string file URI or path where the image should be saved.
+ * @return
+ *   TRUE or FALSE, based on success.
+ *
+ * @see image_save()
+ */
+function image_gd_save(stdClass $image, $destination) {
+  $scheme = file_uri_scheme($destination);
+  // Work around lack of stream wrapper support in imagejpeg() and imagepng().
+  if ($scheme && file_stream_wrapper_valid_scheme($scheme)) {
+    // If destination is not local, save image to temporary local file.
+    $local_wrappers = file_get_stream_wrappers(STREAM_WRAPPERS_LOCAL);
+    if (!isset($local_wrappers[$scheme])) {
+      $permanent_destination = $destination;
+      $destination = drupal_tempnam('temporary://', 'gd_');
+    }
+    // Convert stream wrapper URI to normal path.
+    $destination = drupal_realpath($destination);
+  }
+
+  $extension = str_replace('jpg', 'jpeg', $image->info['extension']);
+  $function = 'image' . $extension;
+  if (!function_exists($function)) {
+    return FALSE;
+  }
+  if ($extension == 'jpeg') {
+    $success = $function($image->resource, $destination, variable_get('image_jpeg_quality', 75));
+  }
+  else {
+    // Always save PNG images with full transparency.
+    if ($extension == 'png') {
+      imagealphablending($image->resource, FALSE);
+      imagesavealpha($image->resource, TRUE);
+    }
+    $success = $function($image->resource, $destination);
+  }
+  // Move temporary local file to remote destination.
+  if (isset($permanent_destination) && $success) {
+    return (bool) file_unmanaged_move($destination, $permanent_destination, FILE_EXISTS_REPLACE);
+  }
+  return $success;
+}
+
+/**
+ * Create a truecolor image preserving transparency from a provided image.
+ *
+ * @param $image
+ *   An image object.
+ * @param $width
+ *   The new width of the new image, in pixels.
+ * @param $height
+ *   The new height of the new image, in pixels.
+ * @return
+ *   A GD image handle.
+ */
+function image_gd_create_tmp(stdClass $image, $width, $height) {
+  $res = imagecreatetruecolor($width, $height);
+
+  if ($image->info['extension'] == 'gif') {
+    // Grab transparent color index from image resource.
+    $transparent = imagecolortransparent($image->resource);
+
+    if ($transparent >= 0) {
+      // The original must have a transparent color, allocate to the new image.
+      $transparent_color = imagecolorsforindex($image->resource, $transparent);
+      $transparent = imagecolorallocate($res, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']);
+
+      // Flood with our new transparent color.
+      imagefill($res, 0, 0, $transparent);
+      imagecolortransparent($res, $transparent);
+    }
+  }
+  elseif ($image->info['extension'] == 'png') {
+    imagealphablending($res, FALSE);
+    $transparency = imagecolorallocatealpha($res, 0, 0, 0, 127);
+    imagefill($res, 0, 0, $transparency);
+    imagealphablending($res, TRUE);
+    imagesavealpha($res, TRUE);
+  }
+  else {
+    imagefill($res, 0, 0, imagecolorallocate($res, 255, 255, 255));
+  }
+
+  return $res;
+}
+
+/**
+ * Get details about an image.
+ *
+ * @param $image
+ *   An image object.
+ * @return
+ *   FALSE, if the file could not be found or is not an image. Otherwise, a
+ *   keyed array containing information about the image:
+ *   - "width": Width, in pixels.
+ *   - "height": Height, in pixels.
+ *   - "extension": Commonly used file extension for the image.
+ *   - "mime_type": MIME type ('image/jpeg', 'image/gif', 'image/png').
+ *
+ * @see image_get_info()
+ */
+function image_gd_get_info(stdClass $image) {
+  $details = FALSE;
+  $data = getimagesize($image->source);
+
+  if (isset($data) && is_array($data)) {
+    $extensions = array('1' => 'gif', '2' => 'jpg', '3' => 'png');
+    $extension = isset($extensions[$data[2]]) ?  $extensions[$data[2]] : '';
+    $details = array(
+      'width'     => $data[0],
+      'height'    => $data[1],
+      'extension' => $extension,
+      'mime_type' => $data['mime'],
+    );
+  }
+
+  return $details;
+}
+
+/**
+ * @} End of "addtogroup image".
+ */
diff --git a/htmltest/modules/system/language.api.php b/htmltest/modules/system/language.api.php
new file mode 100644
index 00000000..40bb3f36
--- /dev/null
+++ b/htmltest/modules/system/language.api.php
@@ -0,0 +1,186 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the base system for language support.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Allows modules to act after language initialization has been performed.
+ *
+ * This is primarily needed to provide translation for configuration variables
+ * in the proper bootstrap phase. Variables are user-defined strings and
+ * therefore should not be translated via t(), since the source string can
+ * change without notice and any previous translation would be lost. Moreover,
+ * since variables can be used in the bootstrap phase, we need a bootstrap hook
+ * to provide a translation early enough to avoid misalignments between code
+ * using the original values and code using the translated values. However
+ * modules implementing hook_boot() should be aware that language initialization
+ * did not happen yet and thus they cannot rely on translated variables.
+ */
+function hook_language_init() {
+  global $language, $conf;
+
+  switch ($language->language) {
+    case 'it':
+      $conf['site_name'] = 'Il mio sito Drupal';
+      break;
+
+    case 'fr':
+      $conf['site_name'] = 'Mon site Drupal';
+      break;
+  }
+}
+
+/**
+ * Perform alterations on language switcher links.
+ *
+ * A language switcher link may need to point to a different path or use a
+ * translated link text before going through l(), which will just handle the
+ * path aliases.
+ *
+ * @param $links
+ *   Nested array of links keyed by language code.
+ * @param $type
+ *   The language type the links will switch.
+ * @param $path
+ *   The current path.
+ */
+function hook_language_switch_links_alter(array &$links, $type, $path) {
+  global $language;
+
+  if ($type == LANGUAGE_TYPE_CONTENT && isset($links[$language->language])) {
+    foreach ($links[$language->language] as $link) {
+      $link['attributes']['class'][] = 'active-language';
+    }
+  }
+}
+
+/**
+ * Define language types.
+ *
+ * @return
+ *   An associative array of language type definitions. The keys are the
+ *   identifiers, which are also used as names for global variables representing
+ *   the types in the bootstrap phase. The values are associative arrays that
+ *   may contain the following elements:
+ *   - name: The human-readable language type identifier.
+ *   - description: A description of the language type.
+ *   - fixed: A fixed array of language negotiation provider identifiers to use
+ *     to initialize this language. Defining this key makes the language type
+ *     non-configurable, so it will always use the specified providers in the
+ *     given priority order. Omit to make the language type configurable.
+ *
+ * @see hook_language_types_info_alter()
+ * @ingroup language_negotiation
+ */
+function hook_language_types_info() {
+  return array(
+    'custom_language_type' => array(
+      'name' => t('Custom language'),
+      'description' => t('A custom language type.'),
+    ),
+    'fixed_custom_language_type' => array(
+      'fixed' => array('custom_language_provider'),
+    ),
+  );
+}
+
+/**
+ * Perform alterations on language types.
+ *
+ * @param $language_types
+ *   Array of language type definitions.
+ *
+ * @see hook_language_types_info()
+ * @ingroup language_negotiation
+ */
+function hook_language_types_info_alter(array &$language_types) {
+  if (isset($language_types['custom_language_type'])) {
+    $language_types['custom_language_type_custom']['description'] = t('A far better description.');
+  }
+}
+
+/**
+ * Define language negotiation providers.
+ *
+ * @return
+ *   An associative array of language negotiation provider definitions. The keys
+ *   are provider identifiers, and the values are associative arrays defining
+ *   each provider, with the following elements:
+ *   - types: An array of allowed language types. If a language negotiation
+ *     provider does not specify which language types it should be used with, it
+ *     will be available for all the configurable language types.
+ *   - callbacks: An associative array of functions that will be called to
+ *     perform various tasks. Possible elements are:
+ *     - language: (required) Name of the callback function that determines the
+ *       language value.
+ *     - switcher: (optional) Name of the callback function that determines
+ *       links for a language switcher block associated with this provider. See
+ *       language_switcher_url() for an example.
+ *     - url_rewrite: (optional) Name of the callback function that provides URL
+ *       rewriting, if needed by this provider.
+ *   - file: The file where callback functions are defined (this file will be
+ *     included before the callbacks are invoked).
+ *   - weight: The default weight of the provider.
+ *   - name: The translated human-readable name for the provider.
+ *   - description: A translated longer description of the provider.
+ *   - config: An internal path pointing to the provider's configuration page.
+ *   - cache: The value Drupal's page cache should be set to for the current
+ *     provider to be invoked.
+ *
+ * @see hook_language_negotiation_info_alter()
+ * @ingroup language_negotiation
+ */
+function hook_language_negotiation_info() {
+  return array(
+    'custom_language_provider' => array(
+      'callbacks' => array(
+        'language' => 'custom_language_provider_callback',
+        'switcher' => 'custom_language_switcher_callback',
+        'url_rewrite' => 'custom_language_url_rewrite_callback',
+      ),
+      'file' => drupal_get_path('module', 'custom') . '/custom.module',
+      'weight' => -4,
+      'types' => array('custom_language_type'),
+      'name' => t('Custom language negotiation provider'),
+      'description' => t('This is a custom language negotiation provider.'),
+      'cache' => 0,
+    ),
+  );
+}
+
+/**
+ * Perform alterations on language negoiation providers.
+ *
+ * @param $language_providers
+ *   Array of language negotiation provider definitions.
+ *
+ * @see hook_language_negotiation_info()
+ * @ingroup language_negotiation
+ */
+function hook_language_negotiation_info_alter(array &$language_providers) {
+  if (isset($language_providers['custom_language_provider'])) {
+    $language_providers['custom_language_provider']['config'] = 'admin/config/regional/language/configure/custom-language-provider';
+  }
+}
+
+/**
+ * Perform alterations on the language fallback candidates.
+ *
+ * @param $fallback_candidates
+ *   An array of language codes whose order will determine the language fallback
+ *   order.
+ */
+function hook_language_fallback_candidates_alter(array &$fallback_candidates) {
+  $fallback_candidates = array_reverse($fallback_candidates);
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/system/maintenance-page.tpl.php b/htmltest/modules/system/maintenance-page.tpl.php
new file mode 100644
index 00000000..69d267f8
--- /dev/null
+++ b/htmltest/modules/system/maintenance-page.tpl.php
@@ -0,0 +1,95 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to display a single Drupal page while offline.
+ *
+ * All the available variables are mirrored in html.tpl.php and page.tpl.php.
+ * Some may be blank but they are provided for consistency.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_maintenance_page()
+ *
+ * @ingroup themeable
+ */
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php print $language->language ?>" lang="<?php print $language->language ?>" dir="<?php print $language->dir ?>">
+
+<head>
+  <title><?php print $head_title; ?></title>
+  <?php print $head; ?>
+  <?php print $styles; ?>
+  <?php print $scripts; ?>
+</head>
+<body class="<?php print $classes; ?>">
+  <div id="page">
+    <div id="header">
+      <div id="logo-title">
+
+        <?php if (!empty($logo)): ?>
+          <a href="<?php print $base_path; ?>" title="<?php print t('Home'); ?>" rel="home" id="logo">
+            <img src="<?php print $logo; ?>" alt="<?php print t('Home'); ?>" />
+          </a>
+        <?php endif; ?>
+
+        <div id="name-and-slogan">
+          <?php if (!empty($site_name)): ?>
+            <h1 id="site-name">
+              <a href="<?php print $base_path ?>" title="<?php print t('Home'); ?>" rel="home"><span><?php print $site_name; ?></span></a>
+            </h1>
+          <?php endif; ?>
+
+          <?php if (!empty($site_slogan)): ?>
+            <div id="site-slogan"><?php print $site_slogan; ?></div>
+          <?php endif; ?>
+        </div> <!-- /name-and-slogan -->
+      </div> <!-- /logo-title -->
+
+      <?php if (!empty($header)): ?>
+        <div id="header-region">
+          <?php print $header; ?>
+        </div>
+      <?php endif; ?>
+
+    </div> <!-- /header -->
+
+    <div id="container" class="clearfix">
+
+      <?php if (!empty($sidebar_first)): ?>
+        <div id="sidebar-first" class="column sidebar">
+          <?php print $sidebar_first; ?>
+        </div> <!-- /sidebar-first -->
+      <?php endif; ?>
+
+      <div id="main" class="column"><div id="main-squeeze">
+
+        <div id="content">
+          <?php if (!empty($title)): ?><h1 class="title" id="page-title"><?php print $title; ?></h1><?php endif; ?>
+          <?php if (!empty($messages)): print $messages; endif; ?>
+          <div id="content-content" class="clearfix">
+            <?php print $content; ?>
+          </div> <!-- /content-content -->
+        </div> <!-- /content -->
+
+      </div></div> <!-- /main-squeeze /main -->
+
+      <?php if (!empty($sidebar_second)): ?>
+        <div id="sidebar-second" class="column sidebar">
+          <?php print $sidebar_second; ?>
+        </div> <!-- /sidebar-second -->
+      <?php endif; ?>
+
+    </div> <!-- /container -->
+
+    <div id="footer-wrapper">
+      <div id="footer">
+        <?php if (!empty($footer)): print $footer; endif; ?>
+      </div> <!-- /footer -->
+    </div> <!-- /footer-wrapper -->
+
+  </div> <!-- /page -->
+
+</body>
+</html>
diff --git a/htmltest/modules/system/page.tpl.php b/htmltest/modules/system/page.tpl.php
new file mode 100644
index 00000000..bd61489e
--- /dev/null
+++ b/htmltest/modules/system/page.tpl.php
@@ -0,0 +1,156 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to display a single Drupal page.
+ *
+ * The doctype, html, head and body tags are not in this template. Instead they
+ * can be found in the html.tpl.php template in this directory.
+ *
+ * Available variables:
+ *
+ * General utility variables:
+ * - $base_path: The base URL path of the Drupal installation. At the very
+ *   least, this will always default to /.
+ * - $directory: The directory the template is located in, e.g. modules/system
+ *   or themes/bartik.
+ * - $is_front: TRUE if the current page is the front page.
+ * - $logged_in: TRUE if the user is registered and signed in.
+ * - $is_admin: TRUE if the user has permission to access administration pages.
+ *
+ * Site identity:
+ * - $front_page: The URL of the front page. Use this instead of $base_path,
+ *   when linking to the front page. This includes the language domain or
+ *   prefix.
+ * - $logo: The path to the logo image, as defined in theme configuration.
+ * - $site_name: The name of the site, empty when display has been disabled
+ *   in theme settings.
+ * - $site_slogan: The slogan of the site, empty when display has been disabled
+ *   in theme settings.
+ *
+ * Navigation:
+ * - $main_menu (array): An array containing the Main menu links for the
+ *   site, if they have been configured.
+ * - $secondary_menu (array): An array containing the Secondary menu links for
+ *   the site, if they have been configured.
+ * - $breadcrumb: The breadcrumb trail for the current page.
+ *
+ * Page content (in order of occurrence in the default page.tpl.php):
+ * - $title_prefix (array): An array containing additional output populated by
+ *   modules, intended to be displayed in front of the main title tag that
+ *   appears in the template.
+ * - $title: The page title, for use in the actual HTML content.
+ * - $title_suffix (array): An array containing additional output populated by
+ *   modules, intended to be displayed after the main title tag that appears in
+ *   the template.
+ * - $messages: HTML for status and error messages. Should be displayed
+ *   prominently.
+ * - $tabs (array): Tabs linking to any sub-pages beneath the current page
+ *   (e.g., the view and edit tabs when displaying a node).
+ * - $action_links (array): Actions local to the page, such as 'Add menu' on the
+ *   menu administration interface.
+ * - $feed_icons: A string of all feed icons for the current page.
+ * - $node: The node object, if there is an automatically-loaded node
+ *   associated with the page, and the node ID is the second argument
+ *   in the page's path (e.g. node/12345 and node/12345/revisions, but not
+ *   comment/reply/12345).
+ *
+ * Regions:
+ * - $page['help']: Dynamic help text, mostly for admin pages.
+ * - $page['highlighted']: Items for the highlighted content region.
+ * - $page['content']: The main content of the current page.
+ * - $page['sidebar_first']: Items for the first sidebar.
+ * - $page['sidebar_second']: Items for the second sidebar.
+ * - $page['header']: Items for the header region.
+ * - $page['footer']: Items for the footer region.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_page()
+ * @see template_process()
+ * @see html.tpl.php
+ *
+ * @ingroup themeable
+ */
+?>
+
+  <div id="page-wrapper"><div id="page">
+
+    <div id="header"><div class="section clearfix">
+
+      <?php if ($logo): ?>
+        <a href="<?php print $front_page; ?>" title="<?php print t('Home'); ?>" rel="home" id="logo">
+          <img src="<?php print $logo; ?>" alt="<?php print t('Home'); ?>" />
+        </a>
+      <?php endif; ?>
+
+      <?php if ($site_name || $site_slogan): ?>
+        <div id="name-and-slogan">
+          <?php if ($site_name): ?>
+            <?php if ($title): ?>
+              <div id="site-name"><strong>
+                <a href="<?php print $front_page; ?>" title="<?php print t('Home'); ?>" rel="home"><span><?php print $site_name; ?></span></a>
+              </strong></div>
+            <?php else: /* Use h1 when the content title is empty */ ?>
+              <h1 id="site-name">
+                <a href="<?php print $front_page; ?>" title="<?php print t('Home'); ?>" rel="home"><span><?php print $site_name; ?></span></a>
+              </h1>
+            <?php endif; ?>
+          <?php endif; ?>
+
+          <?php if ($site_slogan): ?>
+            <div id="site-slogan"><?php print $site_slogan; ?></div>
+          <?php endif; ?>
+        </div> <!-- /#name-and-slogan -->
+      <?php endif; ?>
+
+      <?php print render($page['header']); ?>
+
+    </div></div> <!-- /.section, /#header -->
+
+    <?php if ($main_menu || $secondary_menu): ?>
+      <div id="navigation"><div class="section">
+        <?php print theme('links__system_main_menu', array('links' => $main_menu, 'attributes' => array('id' => 'main-menu', 'class' => array('links', 'inline', 'clearfix')), 'heading' => t('Main menu'))); ?>
+        <?php print theme('links__system_secondary_menu', array('links' => $secondary_menu, 'attributes' => array('id' => 'secondary-menu', 'class' => array('links', 'inline', 'clearfix')), 'heading' => t('Secondary menu'))); ?>
+      </div></div> <!-- /.section, /#navigation -->
+    <?php endif; ?>
+
+    <?php if ($breadcrumb): ?>
+      <div id="breadcrumb"><?php print $breadcrumb; ?></div>
+    <?php endif; ?>
+
+    <?php print $messages; ?>
+
+    <div id="main-wrapper"><div id="main" class="clearfix">
+
+      <div id="content" class="column"><div class="section">
+        <?php if ($page['highlighted']): ?><div id="highlighted"><?php print render($page['highlighted']); ?></div><?php endif; ?>
+        <a id="main-content"></a>
+        <?php print render($title_prefix); ?>
+        <?php if ($title): ?><h1 class="title" id="page-title"><?php print $title; ?></h1><?php endif; ?>
+        <?php print render($title_suffix); ?>
+        <?php if ($tabs): ?><div class="tabs"><?php print render($tabs); ?></div><?php endif; ?>
+        <?php print render($page['help']); ?>
+        <?php if ($action_links): ?><ul class="action-links"><?php print render($action_links); ?></ul><?php endif; ?>
+        <?php print render($page['content']); ?>
+        <?php print $feed_icons; ?>
+      </div></div> <!-- /.section, /#content -->
+
+      <?php if ($page['sidebar_first']): ?>
+        <div id="sidebar-first" class="column sidebar"><div class="section">
+          <?php print render($page['sidebar_first']); ?>
+        </div></div> <!-- /.section, /#sidebar-first -->
+      <?php endif; ?>
+
+      <?php if ($page['sidebar_second']): ?>
+        <div id="sidebar-second" class="column sidebar"><div class="section">
+          <?php print render($page['sidebar_second']); ?>
+        </div></div> <!-- /.section, /#sidebar-second -->
+      <?php endif; ?>
+
+    </div></div> <!-- /#main, /#main-wrapper -->
+
+    <div id="footer"><div class="section">
+      <?php print render($page['footer']); ?>
+    </div></div> <!-- /.section, /#footer -->
+
+  </div></div> <!-- /#page, /#page-wrapper -->
diff --git a/htmltest/modules/system/region.tpl.php b/htmltest/modules/system/region.tpl.php
new file mode 100644
index 00000000..deb8d3ae
--- /dev/null
+++ b/htmltest/modules/system/region.tpl.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to display a region.
+ *
+ * Available variables:
+ * - $content: The content for this region, typically blocks.
+ * - $classes: String of classes that can be used to style contextually through
+ *   CSS. It can be manipulated through the variable $classes_array from
+ *   preprocess functions. The default values can be one or more of the following:
+ *   - region: The current template type, i.e., "theming hook".
+ *   - region-[name]: The name of the region with underscores replaced with
+ *     dashes. For example, the page_top region would have a region-page-top class.
+ * - $region: The name of the region variable as defined in the theme's .info file.
+ *
+ * Helper variables:
+ * - $classes_array: Array of html class attribute values. It is flattened
+ *   into a string within the variable $classes.
+ * - $is_admin: Flags true when the current user is an administrator.
+ * - $is_front: Flags true when presented in the front page.
+ * - $logged_in: Flags true when the current user is a logged-in member.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_region()
+ * @see template_process()
+ *
+ * @ingroup themeable
+ */
+?>
+<?php if ($content): ?>
+  <div class="<?php print $classes; ?>">
+    <?php print $content; ?>
+  </div>
+<?php endif; ?>
diff --git a/htmltest/modules/system/system.admin-rtl.css b/htmltest/modules/system/system.admin-rtl.css
new file mode 100644
index 00000000..362a406c
--- /dev/null
+++ b/htmltest/modules/system/system.admin-rtl.css
@@ -0,0 +1,86 @@
+
+/**
+ * @file
+ * RTL styles for administration pages.
+ */
+
+/**
+ * Administration blocks.
+ */
+div.admin-panel .body {
+  padding: 0 8px 2px 4px;
+}
+div.admin .left {
+  float: right;
+  margin-left: 0;
+  margin-right: 1em;
+}
+div.admin .right {
+  float: left;
+  margin-left: 1em;
+  margin-right: 0;
+}
+div.admin .expert-link {
+  margin-right: 0;
+  margin-left: 1em;
+  padding-right: 0;
+  padding-left: 4px;
+  text-align: left;
+}
+
+/**
+ * Status report.
+ */
+table.system-status-report td.status-icon {
+  padding-left: 0;
+  padding-right: 6px;
+}
+table.system-status-report tr.merge-up td {
+  padding: 0 28px 8px 6px;
+}
+
+/**
+ * Appearance page.
+ */
+table.screenshot {
+  margin-left: 1em;
+}
+.system-themes-list-enabled .theme-selector .screenshot,
+.system-themes-list-enabled .theme-selector .no-screenshot {
+  float: right;
+  margin: 0 0 0 20px;
+}
+.system-themes-list-disabled .theme-selector {
+  float: right;
+  padding: 20px 0 20px 20px;
+}
+.theme-selector .operations li {
+  border-right: none;
+  border-left: 1px solid #cdcdcd;
+  float: right;
+}
+.theme-selector .operations li.last {
+  border-left: none;
+  padding: 0 0.7em 0 0;
+}
+.theme-selector .operations li.first {
+  padding: 0 0 0 0.7em;
+}
+
+/**
+ * Exposed filters.
+ */
+.exposed-filters .filters {
+  float: right;
+  margin-left: 1em;
+  margin-right: 0;
+}
+.exposed-filters .form-item label {
+  float: right;
+}
+/* Current filters */
+.exposed-filters .additional-filters {
+  float: right;
+  margin-left: 1em;
+  margin-right: 0;
+}
diff --git a/htmltest/modules/system/system.admin.css b/htmltest/modules/system/system.admin.css
new file mode 100644
index 00000000..43340b58
--- /dev/null
+++ b/htmltest/modules/system/system.admin.css
@@ -0,0 +1,271 @@
+
+/**
+ * @file
+ * Styles for administration pages.
+ */
+
+/**
+ * Administration blocks.
+ */
+div.admin-panel {
+  margin: 0;
+  padding: 5px 5px 15px 5px;
+}
+div.admin-panel .description {
+  margin: 0 0 3px;
+  padding: 2px 0 3px 0;
+}
+div.admin-panel .body {
+  padding: 0 4px 2px 8px; /* LTR */
+}
+div.admin {
+  padding-top: 15px;
+}
+div.admin .left {
+  float: left; /* LTR */
+  width: 47%;
+  margin-left: 1em; /* LTR */
+}
+div.admin .right {
+  float: right; /* LTR */
+  width: 47%;
+  margin-right: 1em; /* LTR */
+}
+div.admin .expert-link {
+  text-align: right; /* LTR */
+  margin-right: 1em; /* LTR */
+  padding-right: 4px; /* LTR */
+}
+
+/**
+ * Markup generated by theme_system_compact_link().
+ */
+.compact-link {
+  margin: 0 0 0.5em 0;
+}
+
+/**
+ * Quick inline admin links.
+ */
+small .admin-link:before {
+  content: '[';
+}
+small .admin-link:after {
+  content: ']';
+}
+
+/**
+ * Modules page.
+ */
+#system-modules div.incompatible {
+  font-weight: bold;
+}
+div.admin-requirements,
+div.admin-required {
+  font-size: 0.9em;
+  color: #444;
+}
+span.admin-disabled {
+  color: #800;
+}
+span.admin-enabled {
+  color: #080;
+}
+span.admin-missing {
+  color: #f00;
+}
+a.module-link {
+  display: block;
+  padding: 1px 0 1px 20px; /* LTR */
+  white-space: nowrap;
+}
+a.module-link-help {
+  background: url(../../misc/help.png) 0 50% no-repeat; /* LTR */
+}
+a.module-link-permissions {
+  background: url(../../misc/permissions.png) 0 50% no-repeat; /* LTR */
+}
+a.module-link-configure {
+  background: url(../../misc/configure.png) 0 50% no-repeat; /* LTR */
+}
+.module-help {
+  margin-left: 1em; /* LTR */
+  float: right; /* LTR */
+}
+
+/**
+ * Status report.
+ */
+table.system-status-report td {
+  padding: 6px;
+  vertical-align: middle;
+}
+table.system-status-report tr.merge-up td {
+  padding: 0 6px 8px 28px; /* LTR */
+}
+table.system-status-report td.status-icon {
+  width: 16px;
+  padding-right: 0; /* LTR */
+}
+table.system-status-report td.status-icon div {
+  background-repeat: no-repeat;
+  height: 16px;
+  width: 16px;
+}
+table.system-status-report tr.error td.status-icon div {
+  background-image: url(../../misc/message-16-error.png);
+}
+table.system-status-report tr.warning td.status-icon div {
+  background-image: url(../../misc/message-16-warning.png);
+}
+tr.merge-down,
+tr.merge-down td {
+  border-bottom-width: 0 !important;
+}
+tr.merge-up,
+tr.merge-up td {
+  border-top-width: 0 !important;
+}
+
+/**
+ * Theme settings.
+ */
+.theme-settings-left {
+  float: left;
+  width: 49%;
+}
+.theme-settings-right {
+  float: right;
+  width: 49%;
+}
+.theme-settings-bottom {
+  clear: both;
+}
+
+/**
+ * Appearance page.
+ */
+table.screenshot {
+  margin-right: 1em; /* LTR */
+}
+.theme-info h2 {
+  margin-bottom: 0;
+}
+.theme-info p {
+  margin-top: 0;
+}
+.system-themes-list {
+  margin-bottom: 20px;
+}
+.system-themes-list-disabled {
+  border-top: 1px solid #cdcdcd;
+  padding-top: 20px;
+}
+.system-themes-list h2 {
+  margin: 0;
+}
+.theme-selector {
+  padding-top: 20px;
+}
+.theme-selector .screenshot,
+.theme-selector .no-screenshot {
+  border: 1px solid #e0e0d8;
+  padding: 2px;
+  vertical-align: bottom;
+  width: 294px;
+  height: 219px;
+  line-height: 219px;
+  text-align: center;
+}
+.theme-default .screenshot {
+  border: 1px solid #aaa;
+}
+.system-themes-list-enabled .theme-selector .screenshot,
+.system-themes-list-enabled .theme-selector .no-screenshot {
+  float: left; /* LTR */
+  margin: 0 20px 0 0; /* LTR */
+}
+.system-themes-list-disabled .theme-selector .screenshot,
+.system-themes-list-disabled .theme-selector .no-screenshot {
+  width: 194px;
+  height: 144px;
+  line-height: 144px;
+}
+.theme-selector h3 {
+  font-weight: normal;
+}
+.theme-default h3 {
+  font-weight: bold;
+}
+.system-themes-list-enabled .theme-selector h3 {
+  margin-top: 0;
+}
+.system-themes-list-disabled .theme-selector {
+  width: 300px;
+  float: left; /* LTR */
+  padding: 20px 20px 20px 0; /* LTR */
+}
+.system-themes-list-enabled .theme-info {
+  max-width: 940px;
+}
+.system-themes-list-disabled .theme-info {
+  min-height: 170px;
+}
+.theme-selector .incompatible {
+  margin-top: 10px;
+  font-weight: bold;
+}
+.theme-selector .operations {
+  margin: 10px 0 0 0;
+  padding: 0;
+}
+.theme-selector .operations li {
+  float: left; /* LTR */
+  margin: 0;
+  padding: 0 0.7em;
+  list-style-type: none;
+  border-right: 1px solid #cdcdcd;  /* LTR */
+}
+.theme-selector .operations li.last {
+  padding: 0 0 0 0.7em; /* LTR */
+  border-right: none; /* LTR */
+}
+.theme-selector .operations li.first {
+  padding: 0 0.7em 0 0; /* LTR */
+}
+#system-themes-admin-form {
+  clear: left;
+}
+
+/**
+ * Exposed filters.
+ */
+.exposed-filters .filters {
+  float: left; /* LTR */
+  margin-right: 1em; /* LTR */
+  width: 25em; /* IE6 */
+}
+.exposed-filters .form-item {
+  margin: 0 0 0.1em 0;
+  padding: 0;
+}
+.exposed-filters .form-item label {
+  float: left; /* LTR */
+  font-weight: normal;
+  width: 10em;
+}
+.exposed-filters .form-select {
+  width: 14em;
+}
+/* Current filters */
+.exposed-filters .current-filters {
+  margin-bottom: 1em;
+}
+.exposed-filters .current-filters .placeholder {
+  font-style: normal;
+  font-weight: bold;
+}
+.exposed-filters .additional-filters {
+  float: left; /* LTR */
+  margin-right: 1em; /* LTR */
+}
diff --git a/htmltest/modules/system/system.admin.inc b/htmltest/modules/system/system.admin.inc
new file mode 100644
index 00000000..465fd9f4
--- /dev/null
+++ b/htmltest/modules/system/system.admin.inc
@@ -0,0 +1,3214 @@
+<?php
+
+/**
+ * @file
+ * Admin page callbacks for the system module.
+ */
+
+/**
+ * Menu callback; Provide the administration overview page.
+ */
+function system_admin_config_page() {
+  // Check for status report errors.
+  if (system_status(TRUE) && user_access('administer site configuration')) {
+    drupal_set_message(t('One or more problems were detected with your Drupal installation. Check the <a href="@status">status report</a> for more information.', array('@status' => url('admin/reports/status'))), 'error');
+  }
+  $blocks = array();
+  if ($admin = db_query("SELECT menu_name, mlid FROM {menu_links} WHERE link_path = 'admin/config' AND module = 'system'")->fetchAssoc()) {
+    $result = db_query("
+      SELECT m.*, ml.*
+      FROM {menu_links} ml
+      INNER JOIN {menu_router} m ON ml.router_path = m.path
+      WHERE ml.link_path <> 'admin/help' AND menu_name = :menu_name AND ml.plid = :mlid AND hidden = 0", $admin, array('fetch' => PDO::FETCH_ASSOC));
+    foreach ($result as $item) {
+      _menu_link_translate($item);
+      if (!$item['access']) {
+        continue;
+      }
+      // The link description, either derived from 'description' in hook_menu()
+      // or customized via menu module is used as title attribute.
+      if (!empty($item['localized_options']['attributes']['title'])) {
+        $item['description'] = $item['localized_options']['attributes']['title'];
+        unset($item['localized_options']['attributes']['title']);
+      }
+      $block = $item;
+      $block['content'] = '';
+      $block['content'] .= theme('admin_block_content', array('content' => system_admin_menu_block($item)));
+      if (!empty($block['content'])) {
+        $block['show'] = TRUE;
+      }
+
+      // Prepare for sorting as in function _menu_tree_check_access().
+      // The weight is offset so it is always positive, with a uniform 5-digits.
+      $blocks[(50000 + $item['weight']) . ' ' . $item['title'] . ' ' . $item['mlid']] = $block;
+    }
+  }
+  if ($blocks) {
+    ksort($blocks);
+    return theme('admin_page', array('blocks' => $blocks));
+  }
+  else {
+    return t('You do not have any administrative items.');
+  }
+}
+
+/**
+ * Provide a single block from the administration menu as a page.
+ *
+ * This function is often a destination for these blocks.
+ * For example, 'admin/structure/types' needs to have a destination to be valid
+ * in the Drupal menu system, but too much information there might be
+ * hidden, so we supply the contents of the block.
+ *
+ * @return
+ *   The output HTML.
+ */
+function system_admin_menu_block_page() {
+  $item = menu_get_item();
+  if ($content = system_admin_menu_block($item)) {
+    $output = theme('admin_block_content', array('content' => $content));
+  }
+  else {
+    $output = t('You do not have any administrative items.');
+  }
+  return $output;
+}
+
+/**
+ * Menu callback; prints a listing of admin tasks, organized by module.
+ */
+function system_admin_index() {
+  $module_info = system_get_info('module');
+  foreach ($module_info as $module => $info) {
+    $module_info[$module] = new stdClass();
+    $module_info[$module]->info = $info;
+  }
+  uasort($module_info, 'system_sort_modules_by_info_name');
+  $menu_items = array();
+
+  foreach ($module_info as $module => $info) {
+    // Only display a section if there are any available tasks.
+    if ($admin_tasks = system_get_module_admin_tasks($module, $info->info)) {
+      // Sort links by title.
+      uasort($admin_tasks, 'drupal_sort_title');
+      // Move 'Configure permissions' links to the bottom of each section.
+      $permission_key = "admin/people/permissions#module-$module";
+      if (isset($admin_tasks[$permission_key])) {
+        $permission_task = $admin_tasks[$permission_key];
+        unset($admin_tasks[$permission_key]);
+        $admin_tasks[$permission_key] = $permission_task;
+      }
+
+      $menu_items[$info->info['name']] = array($info->info['description'], $admin_tasks);
+    }
+  }
+  return theme('system_admin_index', array('menu_items' => $menu_items));
+}
+
+/**
+ * Displays the configuration overview page.
+ *
+ * This menu callback implementation is a legacy function that used to display
+ * the configuration overview page at admin/config. It is currently unused and
+ * will be removed in Drupal 8. The page at admin/config is now generated by
+ * system_admin_config_page().
+ *
+ * @deprecated
+ * @see system_admin_config_page()
+ */
+function system_settings_overview() {
+  // Check database setup if necessary
+  if (function_exists('db_check_setup') && empty($_POST)) {
+    db_check_setup();
+  }
+
+  $item = menu_get_item('admin/config');
+  $content = system_admin_menu_block($item);
+
+  $output = theme('admin_block_content', array('content' => $content));
+
+  return $output;
+}
+
+/**
+ * Menu callback; displays a listing of all themes.
+ */
+function system_themes_page() {
+  // Get current list of themes.
+  $themes = system_rebuild_theme_data();
+  uasort($themes, 'system_sort_modules_by_info_name');
+
+  $theme_default = variable_get('theme_default', 'bartik');
+  $theme_groups  = array();
+
+  foreach ($themes as &$theme) {
+    if (!empty($theme->info['hidden'])) {
+      continue;
+    }
+    $admin_theme_options[$theme->name] = $theme->info['name'];
+    $theme->is_default = ($theme->name == $theme_default);
+
+    // Identify theme screenshot.
+    $theme->screenshot = NULL;
+    // Create a list which includes the current theme and all its base themes.
+    if (isset($themes[$theme->name]->base_themes)) {
+      $theme_keys = array_keys($themes[$theme->name]->base_themes);
+      $theme_keys[] = $theme->name;
+    }
+    else {
+      $theme_keys = array($theme->name);
+    }
+    // Look for a screenshot in the current theme or in its closest ancestor.
+    foreach (array_reverse($theme_keys) as $theme_key) {
+      if (isset($themes[$theme_key]) && file_exists($themes[$theme_key]->info['screenshot'])) {
+        $theme->screenshot = array(
+          'path' => $themes[$theme_key]->info['screenshot'],
+          'alt' => t('Screenshot for !theme theme', array('!theme' => $theme->info['name'])),
+          'title' => t('Screenshot for !theme theme', array('!theme' => $theme->info['name'])),
+          'attributes' => array('class' => array('screenshot')),
+        );
+        break;
+      }
+    }
+
+    if (empty($theme->status)) {
+     // Ensure this theme is compatible with this version of core.
+     // Require the 'content' region to make sure the main page
+     // content has a common place in all themes.
+      $theme->incompatible_core = !isset($theme->info['core']) || ($theme->info['core'] != DRUPAL_CORE_COMPATIBILITY) || (!isset($theme->info['regions']['content']));
+      $theme->incompatible_php = version_compare(phpversion(), $theme->info['php']) < 0;
+    }
+    $query['token'] = drupal_get_token('system-theme-operation-link');
+    $theme->operations = array();
+    if (!empty($theme->status) || !$theme->incompatible_core && !$theme->incompatible_php) {
+      // Create the operations links.
+      $query['theme'] = $theme->name;
+      if (drupal_theme_access($theme)) {
+        $theme->operations[] = array(
+          'title' => t('Settings'),
+          'href' => 'admin/appearance/settings/' . $theme->name,
+          'attributes' => array('title' => t('Settings for !theme theme', array('!theme' => $theme->info['name']))),
+        );
+      }
+      if (!empty($theme->status)) {
+        if (!$theme->is_default) {
+          $theme->operations[] = array(
+            'title' => t('Disable'),
+            'href' => 'admin/appearance/disable',
+            'query' => $query,
+            'attributes' => array('title' => t('Disable !theme theme', array('!theme' => $theme->info['name']))),
+          );
+          $theme->operations[] = array(
+            'title' => t('Set default'),
+            'href' => 'admin/appearance/default',
+            'query' => $query,
+            'attributes' => array('title' => t('Set !theme as default theme', array('!theme' => $theme->info['name']))),
+          );
+        }
+      }
+      else {
+        $theme->operations[] = array(
+          'title' => t('Enable'),
+          'href' => 'admin/appearance/enable',
+          'query' => $query,
+          'attributes' => array('title' => t('Enable !theme theme', array('!theme' => $theme->info['name']))),
+        );
+        $theme->operations[] = array(
+          'title' => t('Enable and set default'),
+          'href' => 'admin/appearance/default',
+          'query' => $query,
+          'attributes' => array('title' => t('Enable !theme as default theme', array('!theme' => $theme->info['name']))),
+        );
+      }
+    }
+
+    // Add notes to default and administration theme.
+    $theme->notes = array();
+    $theme->classes = array();
+    if ($theme->is_default) {
+      $theme->classes[] = 'theme-default';
+      $theme->notes[] = t('default theme');
+    }
+
+    // Sort enabled and disabled themes into their own groups.
+    $theme_groups[$theme->status ? 'enabled' : 'disabled'][] = $theme;
+  }
+
+  // There are two possible theme groups.
+  $theme_group_titles = array(
+    'enabled' => format_plural(count($theme_groups['enabled']), 'Enabled theme', 'Enabled themes'),
+  );
+  if (!empty($theme_groups['disabled'])) {
+    $theme_group_titles['disabled'] = format_plural(count($theme_groups['disabled']), 'Disabled theme', 'Disabled themes');
+  }
+
+  uasort($theme_groups['enabled'], 'system_sort_themes');
+  drupal_alter('system_themes_page', $theme_groups);
+
+  $admin_form = drupal_get_form('system_themes_admin_form', $admin_theme_options);
+  return theme('system_themes_page', array('theme_groups' => $theme_groups, 'theme_group_titles' => $theme_group_titles)) . drupal_render($admin_form);
+}
+
+/**
+ * Form to select the administration theme.
+ *
+ * @ingroup forms
+ * @see system_themes_admin_form_submit()
+ */
+function system_themes_admin_form($form, &$form_state, $theme_options) {
+  // Administration theme settings.
+  $form['admin_theme'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Administration theme'),
+  );
+  $form['admin_theme']['admin_theme'] = array(
+    '#type' => 'select',
+    '#options' => array(0 => t('Default theme')) + $theme_options,
+    '#title' => t('Administration theme'),
+    '#description' => t('Choose "Default theme" to always use the same theme as the rest of the site.'),
+    '#default_value' => variable_get('admin_theme', 0),
+  );
+  $form['admin_theme']['node_admin_theme'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Use the administration theme when editing or creating content'),
+    '#default_value' => variable_get('node_admin_theme', '0'),
+  );
+  $form['admin_theme']['actions'] = array('#type' => 'actions');
+  $form['admin_theme']['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save configuration'),
+  );
+  return $form;
+}
+
+/**
+ * Process system_themes_admin_form form submissions.
+ */
+function system_themes_admin_form_submit($form, &$form_state) {
+  drupal_set_message(t('The configuration options have been saved.'));
+  variable_set('admin_theme', $form_state['values']['admin_theme']);
+  variable_set('node_admin_theme', $form_state['values']['node_admin_theme']);
+}
+
+/**
+ * Menu callback; Enables a theme.
+ */
+function system_theme_enable() {
+  if (isset($_REQUEST['theme']) && isset($_REQUEST['token']) && drupal_valid_token($_REQUEST['token'], 'system-theme-operation-link')) {
+    $theme = $_REQUEST['theme'];
+    // Get current list of themes.
+    $themes = list_themes();
+
+    // Check if the specified theme is one recognized by the system.
+    if (!empty($themes[$theme])) {
+      theme_enable(array($theme));
+      drupal_set_message(t('The %theme theme has been enabled.', array('%theme' => $themes[$theme]->info['name'])));
+    }
+    else {
+      drupal_set_message(t('The %theme theme was not found.', array('%theme' => $theme)), 'error');
+    }
+    drupal_goto('admin/appearance');
+  }
+  return MENU_ACCESS_DENIED;
+}
+
+/**
+ * Menu callback; Disables a theme.
+ */
+function system_theme_disable() {
+  if (isset($_REQUEST['theme']) && isset($_REQUEST['token']) && drupal_valid_token($_REQUEST['token'], 'system-theme-operation-link')) {
+    $theme = $_REQUEST['theme'];
+    // Get current list of themes.
+    $themes = list_themes();
+
+    // Check if the specified theme is one recognized by the system.
+    if (!empty($themes[$theme])) {
+      if ($theme == variable_get('theme_default', 'bartik')) {
+        // Don't disable the default theme.
+        drupal_set_message(t('%theme is the default theme and cannot be disabled.', array('%theme' => $themes[$theme]->info['name'])), 'error');
+      }
+      else {
+        theme_disable(array($theme));
+        drupal_set_message(t('The %theme theme has been disabled.', array('%theme' => $themes[$theme]->info['name'])));
+      }
+    }
+    else {
+      drupal_set_message(t('The %theme theme was not found.', array('%theme' => $theme)), 'error');
+    }
+    drupal_goto('admin/appearance');
+  }
+  return MENU_ACCESS_DENIED;
+}
+
+/**
+ * Menu callback; Set the default theme.
+ */
+function system_theme_default() {
+  if (isset($_REQUEST['theme']) && isset($_REQUEST['token']) && drupal_valid_token($_REQUEST['token'], 'system-theme-operation-link')) {
+    $theme = $_REQUEST['theme'];
+    // Get current list of themes.
+    $themes = list_themes();
+
+    // Check if the specified theme is one recognized by the system.
+    if (!empty($themes[$theme])) {
+      // Enable the theme if it is currently disabled.
+      if (empty($themes[$theme]->status)) {
+       theme_enable(array($theme));
+      }
+      // Set the default theme.
+      variable_set('theme_default', $theme);
+
+      // Rebuild the menu. This duplicates the menu_rebuild() in theme_enable().
+      // However, modules must know the current default theme in order to use
+      // this information in hook_menu() or hook_menu_alter() implementations,
+      // and doing the variable_set() before the theme_enable() could result
+      // in a race condition where the theme is default but not enabled.
+      menu_rebuild();
+
+      // The status message depends on whether an admin theme is currently in use:
+      // a value of 0 means the admin theme is set to be the default theme.
+      $admin_theme = variable_get('admin_theme', 0);
+      if ($admin_theme != 0 && $admin_theme != $theme) {
+        drupal_set_message(t('Please note that the administration theme is still set to the %admin_theme theme; consequently, the theme on this page remains unchanged. All non-administrative sections of the site, however, will show the selected %selected_theme theme by default.', array(
+          '%admin_theme' => $themes[$admin_theme]->info['name'],
+          '%selected_theme' => $themes[$theme]->info['name'],
+        )));
+      }
+      else {
+        drupal_set_message(t('%theme is now the default theme.', array('%theme' => $themes[$theme]->info['name'])));
+      }
+    }
+    else {
+      drupal_set_message(t('The %theme theme was not found.', array('%theme' => $theme)), 'error');
+    }
+    drupal_goto('admin/appearance');
+  }
+  return MENU_ACCESS_DENIED;
+}
+
+/**
+ * Form builder; display theme configuration for entire site and individual themes.
+ *
+ * @param $key
+ *   A theme name.
+ * @return
+ *   The form structure.
+ * @ingroup forms
+ * @see system_theme_settings_submit()
+ */
+function system_theme_settings($form, &$form_state, $key = '') {
+  // Default settings are defined in theme_get_setting() in includes/theme.inc
+  if ($key) {
+    $var = 'theme_' . $key . '_settings';
+    $themes = list_themes();
+    $features = $themes[$key]->info['features'];
+  }
+  else {
+    $var = 'theme_settings';
+  }
+
+  $form['var'] = array('#type' => 'hidden', '#value' => $var);
+
+  // Toggle settings
+  $toggles = array(
+    'logo'                      => t('Logo'),
+    'name'                      => t('Site name'),
+    'slogan'                    => t('Site slogan'),
+    'node_user_picture'         => t('User pictures in posts'),
+    'comment_user_picture'      => t('User pictures in comments'),
+    'comment_user_verification' => t('User verification status in comments'),
+    'favicon'                   => t('Shortcut icon'),
+    'main_menu'                 => t('Main menu'),
+    'secondary_menu'            => t('Secondary menu'),
+  );
+
+  // Some features are not always available
+  $disabled = array();
+  if (!variable_get('user_pictures', 0)) {
+    $disabled['toggle_node_user_picture'] = TRUE;
+    $disabled['toggle_comment_user_picture'] = TRUE;
+  }
+  if (!module_exists('comment')) {
+    $disabled['toggle_comment_user_picture'] = TRUE;
+    $disabled['toggle_comment_user_verification'] = TRUE;
+  }
+
+  $form['theme_settings'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Toggle display'),
+    '#description' => t('Enable or disable the display of certain page elements.'),
+  );
+  foreach ($toggles as $name => $title) {
+    if ((!$key) || in_array($name, $features)) {
+      $form['theme_settings']['toggle_' . $name] = array('#type' => 'checkbox', '#title' => $title, '#default_value' => theme_get_setting('toggle_' . $name, $key));
+      // Disable checkboxes for features not supported in the current configuration.
+      if (isset($disabled['toggle_' . $name])) {
+        $form['theme_settings']['toggle_' . $name]['#disabled'] = TRUE;
+      }
+    }
+  }
+
+  if (!element_children($form['theme_settings'])) {
+    // If there is no element in the theme settings fieldset then do not show
+    // it -- but keep it in the form if another module wants to alter.
+    $form['theme_settings']['#access'] = FALSE;
+  }
+
+  // Logo settings
+  if ((!$key) || in_array('logo', $features)) {
+    $form['logo'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Logo image settings'),
+      '#description' => t('If toggled on, the following logo will be displayed.'),
+      '#attributes' => array('class' => array('theme-settings-bottom')),
+    );
+    $form['logo']['default_logo'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Use the default logo'),
+      '#default_value' => theme_get_setting('default_logo', $key),
+      '#tree' => FALSE,
+      '#description' => t('Check here if you want the theme to use the logo supplied with it.')
+    );
+    $form['logo']['settings'] = array(
+      '#type' => 'container',
+      '#states' => array(
+        // Hide the logo settings when using the default logo.
+        'invisible' => array(
+          'input[name="default_logo"]' => array('checked' => TRUE),
+        ),
+      ),
+    );
+    $form['logo']['settings']['logo_path'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Path to custom logo'),
+      '#description' => t('The path to the file you would like to use as your logo file instead of the default logo.'),
+      '#default_value' => theme_get_setting('logo_path', $key),
+    );
+    $form['logo']['settings']['logo_upload'] = array(
+      '#type' => 'file',
+      '#title' => t('Upload logo image'),
+      '#maxlength' => 40,
+      '#description' => t("If you don't have direct file access to the server, use this field to upload your logo.")
+    );
+  }
+
+  if ((!$key) || in_array('favicon', $features)) {
+    $form['favicon'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Shortcut icon settings'),
+      '#description' => t("Your shortcut icon, or 'favicon', is displayed in the address bar and bookmarks of most browsers."),
+    );
+    $form['favicon']['default_favicon'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Use the default shortcut icon.'),
+      '#default_value' => theme_get_setting('default_favicon', $key),
+      '#description' => t('Check here if you want the theme to use the default shortcut icon.')
+    );
+    $form['favicon']['settings'] = array(
+      '#type' => 'container',
+      '#states' => array(
+        // Hide the favicon settings when using the default favicon.
+        'invisible' => array(
+          'input[name="default_favicon"]' => array('checked' => TRUE),
+        ),
+      ),
+    );
+    $form['favicon']['settings']['favicon_path'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Path to custom icon'),
+      '#description' => t('The path to the image file you would like to use as your custom shortcut icon.'),
+      '#default_value' => theme_get_setting('favicon_path', $key),
+    );
+    $form['favicon']['settings']['favicon_upload'] = array(
+      '#type' => 'file',
+      '#title' => t('Upload icon image'),
+      '#description' => t("If you don't have direct file access to the server, use this field to upload your shortcut icon.")
+    );
+  }
+
+  // Inject human-friendly values for logo and favicon.
+  foreach (array('logo' => 'logo.png', 'favicon' => 'favicon.ico') as $type => $default) {
+    if (isset($form[$type]['settings'][$type . '_path'])) {
+      $element = &$form[$type]['settings'][$type . '_path'];
+
+      // If path is a public:// URI, display the path relative to the files
+      // directory; stream wrappers are not end-user friendly.
+      $original_path = $element['#default_value'];
+      $friendly_path = NULL;
+      if (file_uri_scheme($original_path) == 'public') {
+        $friendly_path = file_uri_target($original_path);
+        $element['#default_value'] = $friendly_path;
+      }
+    }
+  }
+
+  if ($key) {
+    // Call engine-specific settings.
+    $function = $themes[$key]->prefix . '_engine_settings';
+    if (function_exists($function)) {
+      $form['engine_specific'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('Theme-engine-specific settings'),
+        '#description' => t('These settings only exist for the themes based on the %engine theme engine.', array('%engine' => $themes[$key]->prefix)),
+      );
+      $function($form, $form_state);
+    }
+
+    // Create a list which includes the current theme and all its base themes.
+    if (isset($themes[$key]->base_themes)) {
+      $theme_keys = array_keys($themes[$key]->base_themes);
+      $theme_keys[] = $key;
+    }
+    else {
+      $theme_keys = array($key);
+    }
+
+    // Save the name of the current theme (if any), so that we can temporarily
+    // override the current theme and allow theme_get_setting() to work
+    // without having to pass the theme name to it.
+    $default_theme = !empty($GLOBALS['theme_key']) ? $GLOBALS['theme_key'] : NULL;
+    $GLOBALS['theme_key'] = $key;
+
+    // Process the theme and all its base themes.
+    foreach ($theme_keys as $theme) {
+      // Include the theme-settings.php file.
+      $filename = DRUPAL_ROOT . '/' . str_replace("/$theme.info", '', $themes[$theme]->filename) . '/theme-settings.php';
+      if (file_exists($filename)) {
+        require_once $filename;
+      }
+
+      // Call theme-specific settings.
+      $function = $theme . '_form_system_theme_settings_alter';
+      if (function_exists($function)) {
+        $function($form, $form_state);
+      }
+    }
+
+    // Restore the original current theme.
+    if (isset($default_theme)) {
+      $GLOBALS['theme_key'] = $default_theme;
+    }
+    else {
+      unset($GLOBALS['theme_key']);
+    }
+  }
+
+  $form = system_settings_form($form);
+  // We don't want to call system_settings_form_submit(), so change #submit.
+  array_pop($form['#submit']);
+  $form['#submit'][] = 'system_theme_settings_submit';
+  $form['#validate'][] = 'system_theme_settings_validate';
+  return $form;
+}
+
+/**
+ * Validator for the system_theme_settings() form.
+ */
+function system_theme_settings_validate($form, &$form_state) {
+  // Handle file uploads.
+  $validators = array('file_validate_is_image' => array());
+
+  // Check for a new uploaded logo.
+  $file = file_save_upload('logo_upload', $validators);
+  if (isset($file)) {
+    // File upload was attempted.
+    if ($file) {
+      // Put the temporary file in form_values so we can save it on submit.
+      $form_state['values']['logo_upload'] = $file;
+    }
+    else {
+      // File upload failed.
+      form_set_error('logo_upload', t('The logo could not be uploaded.'));
+    }
+  }
+
+  $validators = array('file_validate_extensions' => array('ico png gif jpg jpeg apng svg'));
+
+  // Check for a new uploaded favicon.
+  $file = file_save_upload('favicon_upload', $validators);
+  if (isset($file)) {
+    // File upload was attempted.
+    if ($file) {
+      // Put the temporary file in form_values so we can save it on submit.
+      $form_state['values']['favicon_upload'] = $file;
+    }
+    else {
+      // File upload failed.
+      form_set_error('favicon_upload', t('The favicon could not be uploaded.'));
+    }
+  }
+
+  // If the user provided a path for a logo or favicon file, make sure a file
+  // exists at that path.
+  if ($form_state['values']['logo_path']) {
+    $path = _system_theme_settings_validate_path($form_state['values']['logo_path']);
+    if (!$path) {
+      form_set_error('logo_path', t('The custom logo path is invalid.'));
+    }
+  }
+  if ($form_state['values']['favicon_path']) {
+    $path = _system_theme_settings_validate_path($form_state['values']['favicon_path']);
+    if (!$path) {
+      form_set_error('favicon_path', t('The custom favicon path is invalid.'));
+    }
+  }
+}
+
+/**
+ * Helper function for the system_theme_settings form.
+ *
+ * Attempts to validate normal system paths, paths relative to the public files
+ * directory, or stream wrapper URIs. If the given path is any of the above,
+ * returns a valid path or URI that the theme system can display.
+ *
+ * @param $path
+ *   A path relative to the Drupal root or to the public files directory, or
+ *   a stream wrapper URI.
+ * @return mixed
+ *   A valid path that can be displayed through the theme system, or FALSE if
+ *   the path could not be validated.
+ */
+function _system_theme_settings_validate_path($path) {
+  // Absolute local file paths are invalid.
+  if (drupal_realpath($path) == $path) {
+    return FALSE;
+  }
+  // A path relative to the Drupal root or a fully qualified URI is valid.
+  if (is_file($path)) {
+    return $path;
+  }
+  // Prepend 'public://' for relative file paths within public filesystem.
+  if (file_uri_scheme($path) === FALSE) {
+    $path = 'public://' . $path;
+  }
+  if (is_file($path)) {
+    return $path;
+  }
+  return FALSE;
+}
+
+/**
+ * Process system_theme_settings form submissions.
+ */
+function system_theme_settings_submit($form, &$form_state) {
+  // Exclude unnecessary elements before saving.
+  form_state_values_clean($form_state);
+
+  $values = $form_state['values'];
+
+  // Extract the name of the theme from the submitted form values, then remove
+  // it from the array so that it is not saved as part of the variable.
+  $key = $values['var'];
+  unset($values['var']);
+
+  // If the user uploaded a new logo or favicon, save it to a permanent location
+  // and use it in place of the default theme-provided file.
+  if ($file = $values['logo_upload']) {
+    unset($values['logo_upload']);
+    $filename = file_unmanaged_copy($file->uri);
+    $values['default_logo'] = 0;
+    $values['logo_path'] = $filename;
+    $values['toggle_logo'] = 1;
+  }
+  if ($file = $values['favicon_upload']) {
+    unset($values['favicon_upload']);
+    $filename = file_unmanaged_copy($file->uri);
+    $values['default_favicon'] = 0;
+    $values['favicon_path'] = $filename;
+    $values['toggle_favicon'] = 1;
+  }
+
+  // If the user entered a path relative to the system files directory for
+  // a logo or favicon, store a public:// URI so the theme system can handle it.
+  if (!empty($values['logo_path'])) {
+    $values['logo_path'] = _system_theme_settings_validate_path($values['logo_path']);
+  }
+  if (!empty($values['favicon_path'])) {
+    $values['favicon_path'] = _system_theme_settings_validate_path($values['favicon_path']);
+  }
+
+  if (empty($values['default_favicon']) && !empty($values['favicon_path'])) {
+    $values['favicon_mimetype'] = file_get_mimetype($values['favicon_path']);
+  }
+
+  variable_set($key, $values);
+  drupal_set_message(t('The configuration options have been saved.'));
+
+  cache_clear_all();
+}
+
+/**
+ * Recursively check compatibility.
+ *
+ * @param $incompatible
+ *   An associative array which at the end of the check contains all
+ *   incompatible files as the keys, their values being TRUE.
+ * @param $files
+ *   The set of files that will be tested.
+ * @param $file
+ *   The file at which the check starts.
+ * @return
+ *   Returns TRUE if an incompatible file is found, NULL (no return value)
+ *   otherwise.
+ */
+function _system_is_incompatible(&$incompatible, $files, $file) {
+  if (isset($incompatible[$file->name])) {
+    return TRUE;
+  }
+  // Recursively traverse required modules, looking for incompatible modules.
+  foreach ($file->requires as $requires) {
+    if (isset($files[$requires]) && _system_is_incompatible($incompatible, $files, $files[$requires])) {
+      $incompatible[$file->name] = TRUE;
+      return TRUE;
+    }
+  }
+}
+
+/**
+ * Menu callback; provides module enable/disable interface.
+ *
+ * The list of modules gets populated by module.info files, which contain each
+ * module's name, description, and information about which modules it requires.
+ * See drupal_parse_info_file() for information on module.info descriptors.
+ *
+ * Dependency checking is performed to ensure that a module:
+ * - can not be enabled if there are disabled modules it requires.
+ * - can not be disabled if there are enabled modules which depend on it.
+ *
+ * @param $form_state
+ *   An associative array containing the current state of the form.
+ *
+ * @return
+ *   The form array.
+ *
+ * @ingroup forms
+ * @see theme_system_modules()
+ * @see system_modules_submit()
+ */
+function system_modules($form, $form_state = array()) {
+  // Get current list of modules.
+  $files = system_rebuild_module_data();
+
+  // Remove hidden modules from display list.
+  $visible_files = $files;
+  foreach ($visible_files as $filename => $file) {
+    if (!empty($file->info['hidden'])) {
+      unset($visible_files[$filename]);
+    }
+  }
+
+  uasort($visible_files, 'system_sort_modules_by_info_name');
+
+  // If the modules form was submitted, then system_modules_submit() runs first
+  // and if there are unfilled required modules, then $form_state['storage'] is
+  // filled, triggering a rebuild. In this case we need to display a
+  // confirmation form.
+  if (!empty($form_state['storage'])) {
+    return system_modules_confirm_form($visible_files, $form_state['storage']);
+  }
+
+  $modules = array();
+  $form['modules'] = array('#tree' => TRUE);
+
+  // Used when checking if module implements a help page.
+  $help_arg = module_exists('help') ? drupal_help_arg() : FALSE;
+
+  // Used when displaying modules that are required by the installation profile.
+  require_once DRUPAL_ROOT . '/includes/install.inc';
+  $distribution_name = check_plain(drupal_install_profile_distribution_name());
+
+  // Iterate through each of the modules.
+  foreach ($visible_files as $filename => $module) {
+    $extra = array();
+    $extra['enabled'] = (bool) $module->status;
+    if (!empty($module->info['required'] )) {
+      $extra['disabled'] = TRUE;
+      $extra['required_by'][] = $distribution_name . (!empty($module->info['explanation']) ? ' ('. $module->info['explanation'] .')' : '');
+    }
+
+    // If this module requires other modules, add them to the array.
+    foreach ($module->requires as $requires => $v) {
+      if (!isset($files[$requires])) {
+        $extra['requires'][$requires] = t('@module (<span class="admin-missing">missing</span>)', array('@module' => drupal_ucfirst($requires)));
+        $extra['disabled'] = TRUE;
+      }
+      // Only display visible modules.
+      elseif (isset($visible_files[$requires])) {
+        $requires_name = $files[$requires]->info['name'];
+        // Disable this module if it is incompatible with the dependency's version.
+        if ($incompatible_version = drupal_check_incompatibility($v, str_replace(DRUPAL_CORE_COMPATIBILITY . '-', '', $files[$requires]->info['version']))) {
+          $extra['requires'][$requires] = t('@module (<span class="admin-missing">incompatible with</span> version @version)', array(
+            '@module' => $requires_name . $incompatible_version,
+            '@version' => $files[$requires]->info['version'],
+          ));
+          $extra['disabled'] = TRUE;
+        }
+        // Disable this module if the dependency is incompatible with this
+        // version of Drupal core.
+        elseif ($files[$requires]->info['core'] != DRUPAL_CORE_COMPATIBILITY) {
+          $extra['requires'][$requires] = t('@module (<span class="admin-missing">incompatible with</span> this version of Drupal core)', array(
+            '@module' => $requires_name,
+          ));
+          $extra['disabled'] = TRUE;
+        }
+        elseif ($files[$requires]->status) {
+          $extra['requires'][$requires] = t('@module (<span class="admin-enabled">enabled</span>)', array('@module' => $requires_name));
+        }
+        else {
+          $extra['requires'][$requires] = t('@module (<span class="admin-disabled">disabled</span>)', array('@module' => $requires_name));
+        }
+      }
+    }
+    // Generate link for module's help page, if there is one.
+    if ($help_arg && $module->status && in_array($filename, module_implements('help'))) {
+      if (module_invoke($filename, 'help', "admin/help#$filename", $help_arg)) {
+        $extra['links']['help'] = array(
+          '#type' => 'link',
+          '#title' => t('Help'),
+          '#href' => "admin/help/$filename",
+          '#options' => array('attributes' => array('class' =>  array('module-link', 'module-link-help'), 'title' => t('Help'))),
+        );
+      }
+    }
+    // Generate link for module's permission, if the user has access to it.
+    if ($module->status && user_access('administer permissions') && in_array($filename, module_implements('permission'))) {
+      $extra['links']['permissions'] = array(
+        '#type' => 'link',
+        '#title' => t('Permissions'),
+        '#href' => 'admin/people/permissions',
+        '#options' => array('fragment' => 'module-' . $filename, 'attributes' => array('class' => array('module-link', 'module-link-permissions'), 'title' => t('Configure permissions'))),
+      );
+    }
+    // Generate link for module's configuration page, if the module provides
+    // one.
+    if ($module->status && isset($module->info['configure'])) {
+      $configure_link = menu_get_item($module->info['configure']);
+      if ($configure_link['access']) {
+        $extra['links']['configure'] = array(
+          '#type' => 'link',
+          '#title' => t('Configure'),
+          '#href' => $configure_link['href'],
+          '#options' => array('attributes' => array('class' => array('module-link', 'module-link-configure'), 'title' => $configure_link['description'])),
+        );
+      }
+    }
+
+    // If this module is required by other modules, list those, and then make it
+    // impossible to disable this one.
+    foreach ($module->required_by as $required_by => $v) {
+      // Hidden modules are unset already.
+      if (isset($visible_files[$required_by])) {
+        if ($files[$required_by]->status == 1 && $module->status == 1) {
+          $extra['required_by'][] = t('@module (<span class="admin-enabled">enabled</span>)', array('@module' => $files[$required_by]->info['name']));
+          $extra['disabled'] = TRUE;
+        }
+        else {
+          $extra['required_by'][] = t('@module (<span class="admin-disabled">disabled</span>)', array('@module' => $files[$required_by]->info['name']));
+        }
+      }
+    }
+    $form['modules'][$module->info['package']][$filename] = _system_modules_build_row($module->info, $extra);
+  }
+
+  // Add basic information to the fieldsets.
+  foreach (element_children($form['modules']) as $package) {
+    $form['modules'][$package] += array(
+      '#type' => 'fieldset',
+      '#title' => t($package),
+      '#collapsible' => TRUE,
+      '#theme' => 'system_modules_fieldset',
+      '#header' => array(
+        array('data' => t('Enabled'), 'class' => array('checkbox')),
+        t('Name'),
+        t('Version'),
+        t('Description'),
+        array('data' => t('Operations'), 'colspan' => 3),
+      ),
+      // Ensure that the "Core" package fieldset comes first.
+      '#weight' => $package == 'Core' ? -10 : NULL,
+    );
+  }
+
+  // Lastly, sort all fieldsets by title.
+  uasort($form['modules'], 'element_sort_by_title');
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save configuration'),
+  );
+  $form['#action'] = url('admin/modules/list/confirm');
+
+  return $form;
+}
+
+/**
+ * Array sorting callback; sorts modules or themes by their name.
+ */
+function system_sort_modules_by_info_name($a, $b) {
+  return strcasecmp($a->info['name'], $b->info['name']);
+}
+
+/**
+ * Array sorting callback; sorts modules or themes by their name.
+ */
+function system_sort_themes($a, $b) {
+  if ($a->is_default) {
+    return -1;
+  }
+  if ($b->is_default) {
+    return 1;
+  }
+  return strcasecmp($a->info['name'], $b->info['name']);
+}
+
+/**
+ * Build a table row for the system modules page.
+ */
+function _system_modules_build_row($info, $extra) {
+  // Add in the defaults.
+  $extra += array(
+    'requires' => array(),
+    'required_by' => array(),
+    'disabled' => FALSE,
+    'enabled' => FALSE,
+    'links' => array(),
+  );
+  $form = array(
+    '#tree' => TRUE,
+  );
+  // Set the basic properties.
+  $form['name'] = array(
+    '#markup' => $info['name'],
+  );
+  $form['description'] = array(
+    '#markup' => t($info['description']),
+  );
+  $form['version'] = array(
+    '#markup' => $info['version'],
+  );
+  $form['#requires'] = $extra['requires'];
+  $form['#required_by'] = $extra['required_by'];
+
+  // Check the compatibilities.
+  $compatible = TRUE;
+  $status_short = '';
+  $status_long = '';
+
+  // Check the core compatibility.
+  if (!isset($info['core']) || $info['core'] != DRUPAL_CORE_COMPATIBILITY) {
+    $compatible = FALSE;
+    $status_short .= t('Incompatible with this version of Drupal core.');
+    $status_long .= t('This version is not compatible with Drupal !core_version and should be replaced.', array('!core_version' => DRUPAL_CORE_COMPATIBILITY));
+  }
+
+  // Ensure this module is compatible with the currently installed version of PHP.
+  if (version_compare(phpversion(), $info['php']) < 0) {
+    $compatible = FALSE;
+    $status_short .= t('Incompatible with this version of PHP');
+    $php_required = $info['php'];
+    if (substr_count($info['php'], '.') < 2) {
+      $php_required .= '.*';
+    }
+    $status_long .= t('This module requires PHP version @php_required and is incompatible with PHP version !php_version.', array('@php_required' => $php_required, '!php_version' => phpversion()));
+  }
+
+  // If this module is compatible, present a checkbox indicating
+  // this module may be installed. Otherwise, show a big red X.
+  if ($compatible) {
+    $form['enable'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Enable'),
+      '#default_value' => $extra['enabled'],
+    );
+    if ($extra['disabled']) {
+      $form['enable']['#disabled'] = TRUE;
+    }
+  }
+  else {
+    $form['enable'] = array(
+      '#markup' =>  theme('image', array('path' => 'misc/watchdog-error.png', 'alt' => $status_short, 'title' => $status_short)),
+    );
+    $form['description']['#markup'] .= theme('system_modules_incompatible', array('message' => $status_long));
+  }
+
+  // Build operation links.
+  foreach (array('help', 'permissions', 'configure') as $key) {
+    $form['links'][$key] = (isset($extra['links'][$key]) ? $extra['links'][$key] : array());
+  }
+
+  return $form;
+}
+
+/**
+ * Display confirmation form for required modules.
+ *
+ * @param $modules
+ *   Array of module file objects as returned from system_rebuild_module_data().
+ * @param $storage
+ *   The contents of $form_state['storage']; an array with two
+ *   elements: the list of required modules and the list of status
+ *   form field values from the previous screen.
+ * @ingroup forms
+ */
+function system_modules_confirm_form($modules, $storage) {
+  $items = array();
+
+  $form['validation_modules'] = array('#type' => 'value', '#value' => $modules);
+  $form['status']['#tree'] = TRUE;
+
+  foreach ($storage['more_required'] as $info) {
+    $t_argument = array(
+      '@module' => $info['name'],
+      '@required' => implode(', ', $info['requires']),
+    );
+    $items[] = format_plural(count($info['requires']), 'You must enable the @required module to install @module.', 'You must enable the @required modules to install @module.', $t_argument);
+  }
+
+  foreach ($storage['missing_modules'] as $name => $info) {
+    $t_argument = array(
+      '@module' => $name,
+      '@depends' => implode(', ', $info['depends']),
+    );
+    $items[] = format_plural(count($info['depends']), 'The @module module is missing, so the following module will be disabled: @depends.', 'The @module module is missing, so the following modules will be disabled: @depends.', $t_argument);
+  }
+
+  $form['text'] = array('#markup' => theme('item_list', array('items' => $items)));
+
+  if ($form) {
+    // Set some default form values
+    $form = confirm_form(
+      $form,
+      t('Some required modules must be enabled'),
+      'admin/modules',
+      t('Would you like to continue with the above?'),
+      t('Continue'),
+      t('Cancel'));
+    return $form;
+  }
+}
+
+/**
+ * Submit callback; handles modules form submission.
+ */
+function system_modules_submit($form, &$form_state) {
+  include_once DRUPAL_ROOT . '/includes/install.inc';
+
+  // Builds list of modules.
+  $modules = array();
+  // If we're not coming from the confirmation form, build the list of modules.
+  if (empty($form_state['storage'])) {
+    // If we're not coming from the confirmation form, build the module list.
+    foreach ($form_state['values']['modules'] as $group_name => $group) {
+      foreach ($group as $module => $enabled) {
+        $modules[$module] = array('group' => $group_name, 'enabled' => $enabled['enable']);
+      }
+    }
+  }
+  else {
+    // If we are coming from the confirmation form, fetch
+    // the modules out of $form_state.
+    $modules = $form_state['storage']['modules'];
+  }
+
+  // Collect data for all modules to be able to determine dependencies.
+  $files = system_rebuild_module_data();
+
+  // Sorts modules by weight.
+  $sort = array();
+  foreach (array_keys($modules) as $module) {
+    $sort[$module] = $files[$module]->sort;
+  }
+  array_multisort($sort, $modules);
+
+  // Makes sure all required modules are set to be enabled.
+  $more_required = array();
+  $missing_modules = array();
+  foreach ($modules as $name => $module) {
+    if ($module['enabled']) {
+      // Checks that all dependencies are set to be enabled.  Stores the ones
+      // that are not in $dependencies variable so that the user can be alerted
+      // in the confirmation form that more modules need to be enabled.
+      $dependencies = array();
+      foreach (array_keys($files[$name]->requires) as $required) {
+        if (empty($modules[$required]['enabled'])) {
+          if (isset($files[$required])) {
+            $dependencies[] = $files[$required]->info['name'];
+            $modules[$required]['enabled'] = TRUE;
+          }
+          else {
+            $missing_modules[$required]['depends'][] = $name;
+            $modules[$name]['enabled'] = FALSE;
+          }
+        }
+      }
+
+      // Stores additional modules that need to be enabled in $more_required.
+      if (!empty($dependencies)) {
+        $more_required[$name] = array(
+          'name' => $files[$name]->info['name'],
+          'requires' => $dependencies,
+        );
+      }
+    }
+  }
+
+  // Redirects to confirmation form if more modules need to be enabled.
+  if ((!empty($more_required) || !empty($missing_modules)) && !isset($form_state['values']['confirm'])) {
+    $form_state['storage'] = array(
+      'more_required' => $more_required,
+      'modules' => $modules,
+      'missing_modules' => $missing_modules,
+    );
+    $form_state['rebuild'] = TRUE;
+    return;
+  }
+
+  // Invokes hook_requirements('install').  If failures are detected, makes sure
+  // the dependent modules aren't installed either.
+  foreach ($modules as $name => $module) {
+    // Only invoke hook_requirements() on modules that are going to be installed.
+    if ($module['enabled'] && drupal_get_installed_schema_version($name) == SCHEMA_UNINSTALLED) {
+      if (!drupal_check_module($name)) {
+        $modules[$name]['enabled'] = FALSE;
+        foreach (array_keys($files[$name]->required_by) as $required_by) {
+          $modules[$required_by]['enabled'] = FALSE;
+        }
+      }
+    }
+  }
+
+  // Initializes array of actions.
+  $actions = array(
+    'enable' => array(),
+    'disable' => array(),
+    'install' => array(),
+  );
+
+  // Builds arrays of modules that need to be enabled, disabled, and installed.
+  foreach ($modules as $name => $module) {
+    if ($module['enabled']) {
+      if (drupal_get_installed_schema_version($name) == SCHEMA_UNINSTALLED) {
+        $actions['install'][] = $name;
+        $actions['enable'][] = $name;
+      }
+      elseif (!module_exists($name)) {
+        $actions['enable'][] = $name;
+      }
+    }
+    elseif (module_exists($name)) {
+      $actions['disable'][] = $name;
+    }
+  }
+
+  // Gets list of modules prior to install process, unsets $form_state['storage']
+  // so we don't get redirected back to the confirmation form.
+  $pre_install_list = module_list();
+  unset($form_state['storage']);
+
+  // Reverse the 'enable' list, to order dependencies before dependents.
+  krsort($actions['enable']);
+
+  // Installs, enables, and disables modules.
+  module_enable($actions['enable'], FALSE);
+  module_disable($actions['disable'], FALSE);
+
+  // Gets module list after install process, flushes caches and displays a
+  // message if there are changes.
+  $post_install_list = module_list(TRUE);
+  if ($pre_install_list != $post_install_list) {
+    drupal_flush_all_caches();
+    drupal_set_message(t('The configuration options have been saved.'));
+  }
+
+  $form_state['redirect'] = 'admin/modules';
+}
+
+/**
+ * Uninstall functions
+ */
+
+/**
+ * Builds a form of currently disabled modules.
+ *
+ * @ingroup forms
+ * @see system_modules_uninstall_validate()
+ * @see system_modules_uninstall_submit()
+ * @param $form_state['values']
+ *   Submitted form values.
+ * @return
+ *   A form array representing the currently disabled modules.
+ */
+function system_modules_uninstall($form, $form_state = NULL) {
+  // Make sure the install API is available.
+  include_once DRUPAL_ROOT . '/includes/install.inc';
+
+  // Display the confirm form if any modules have been submitted.
+  if (!empty($form_state['storage']) && $confirm_form = system_modules_uninstall_confirm_form($form_state['storage'])) {
+    return $confirm_form;
+  }
+
+  // Get a list of disabled, installed modules.
+  $all_modules = system_rebuild_module_data();
+  $disabled_modules = array();
+  foreach ($all_modules as $name => $module) {
+    if (empty($module->status) && $module->schema_version > SCHEMA_UNINSTALLED) {
+      $disabled_modules[$name] = $module;
+    }
+  }
+
+  // Only build the rest of the form if there are any modules available to
+  // uninstall.
+  if (!empty($disabled_modules)) {
+    $profile = drupal_get_profile();
+    uasort($disabled_modules, 'system_sort_modules_by_info_name');
+    $form['uninstall'] = array('#tree' => TRUE);
+    foreach ($disabled_modules as $module) {
+      $module_name = $module->info['name'] ? $module->info['name'] : $module->name;
+      $form['modules'][$module->name]['#module_name'] = $module_name;
+      $form['modules'][$module->name]['name']['#markup'] = $module_name;
+      $form['modules'][$module->name]['description']['#markup'] = t($module->info['description']);
+      $form['uninstall'][$module->name] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Uninstall @module module', array('@module' => $module_name)),
+        '#title_display' => 'invisible',
+      );
+      // All modules which depend on this one must be uninstalled first, before
+      // we can allow this module to be uninstalled. (The installation profile
+      // is excluded from this list.)
+      foreach (array_keys($module->required_by) as $dependent) {
+        if ($dependent != $profile && drupal_get_installed_schema_version($dependent) != SCHEMA_UNINSTALLED) {
+          $dependent_name = isset($all_modules[$dependent]->info['name']) ? $all_modules[$dependent]->info['name'] : $dependent;
+          $form['modules'][$module->name]['#required_by'][] = $dependent_name;
+          $form['uninstall'][$module->name]['#disabled'] = TRUE;
+        }
+      }
+    }
+    $form['actions'] = array('#type' => 'actions');
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Uninstall'),
+    );
+    $form['#action'] = url('admin/modules/uninstall/confirm');
+  }
+  else {
+    $form['modules'] = array();
+  }
+
+  return $form;
+}
+
+/**
+ * Confirm uninstall of selected modules.
+ *
+ * @ingroup forms
+ * @param $storage
+ *   An associative array of modules selected to be uninstalled.
+ * @return
+ *   A form array representing modules to confirm.
+ */
+function system_modules_uninstall_confirm_form($storage) {
+  // Nothing to build.
+  if (empty($storage)) {
+    return;
+  }
+
+  // Construct the hidden form elements and list items.
+  foreach (array_filter($storage['uninstall']) as $module => $value) {
+    $info = drupal_parse_info_file(drupal_get_path('module', $module) . '/' . $module . '.info');
+    $uninstall[] = $info['name'];
+    $form['uninstall'][$module] = array('#type' => 'hidden',
+      '#value' => 1,
+    );
+  }
+
+  // Display a confirm form if modules have been selected.
+  if (isset($uninstall)) {
+    $form['#confirmed'] = TRUE;
+    $form['uninstall']['#tree'] = TRUE;
+    $form['modules'] = array('#markup' => '<p>' . t('The following modules will be completely uninstalled from your site, and <em>all data from these modules will be lost</em>!') . '</p>' . theme('item_list', array('items' => $uninstall)));
+    $form = confirm_form(
+      $form,
+      t('Confirm uninstall'),
+      'admin/modules/uninstall',
+      t('Would you like to continue with uninstalling the above?'),
+      t('Uninstall'),
+      t('Cancel'));
+    return $form;
+  }
+}
+
+/**
+ * Validates the submitted uninstall form.
+ */
+function system_modules_uninstall_validate($form, &$form_state) {
+  // Form submitted, but no modules selected.
+  if (!count(array_filter($form_state['values']['uninstall']))) {
+    drupal_set_message(t('No modules selected.'), 'error');
+    drupal_goto('admin/modules/uninstall');
+  }
+}
+
+/**
+ * Processes the submitted uninstall form.
+ */
+function system_modules_uninstall_submit($form, &$form_state) {
+  // Make sure the install API is available.
+  include_once DRUPAL_ROOT . '/includes/install.inc';
+
+  if (!empty($form['#confirmed'])) {
+    // Call the uninstall routine for each selected module.
+    $modules = array_keys($form_state['values']['uninstall']);
+    drupal_uninstall_modules($modules);
+    drupal_set_message(t('The selected modules have been uninstalled.'));
+
+    $form_state['redirect'] = 'admin/modules/uninstall';
+  }
+  else {
+    $form_state['storage'] = $form_state['values'];
+    $form_state['rebuild'] = TRUE;
+  }
+}
+
+/**
+ * Menu callback. Display blocked IP addresses.
+ *
+ * @param $default_ip
+ *   Optional IP address to be passed on to drupal_get_form() for
+ *   use as the default value of the IP address form field.
+ */
+function system_ip_blocking($default_ip = '') {
+  $rows = array();
+  $header = array(t('Blocked IP addresses'), t('Operations'));
+  $result = db_query('SELECT * FROM {blocked_ips}');
+  foreach ($result as $ip) {
+    $rows[] = array(
+      $ip->ip,
+      l(t('delete'), "admin/config/people/ip-blocking/delete/$ip->iid"),
+    );
+  }
+
+  $build['system_ip_blocking_form'] = drupal_get_form('system_ip_blocking_form', $default_ip);
+
+  $build['system_ip_blocking_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#empty' => t('No blocked IP addresses available.'),
+  );
+
+  return $build;
+}
+
+/**
+ * Define the form for blocking IP addresses.
+ *
+ * @ingroup forms
+ * @see system_ip_blocking_form_validate()
+ * @see system_ip_blocking_form_submit()
+ */
+function system_ip_blocking_form($form, $form_state, $default_ip) {
+  $form['ip'] = array(
+    '#title' => t('IP address'),
+    '#type' => 'textfield',
+    '#size' => 48,
+    '#maxlength' => 40,
+    '#default_value' => $default_ip,
+    '#description' => t('Enter a valid IP address.'),
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Add'),
+  );
+  $form['#submit'][] = 'system_ip_blocking_form_submit';
+  $form['#validate'][] = 'system_ip_blocking_form_validate';
+  return $form;
+}
+
+function system_ip_blocking_form_validate($form, &$form_state) {
+  $ip = trim($form_state['values']['ip']);
+  if (db_query("SELECT * FROM {blocked_ips} WHERE ip = :ip", array(':ip' => $ip))->fetchField()) {
+    form_set_error('ip', t('This IP address is already blocked.'));
+  }
+  elseif ($ip == ip_address()) {
+    form_set_error('ip', t('You may not block your own IP address.'));
+  }
+  elseif (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE) == FALSE) {
+    form_set_error('ip', t('Enter a valid IP address.'));
+  }
+}
+
+function system_ip_blocking_form_submit($form, &$form_state) {
+  $ip = trim($form_state['values']['ip']);
+  db_insert('blocked_ips')
+    ->fields(array('ip' => $ip))
+    ->execute();
+  drupal_set_message(t('The IP address %ip has been blocked.', array('%ip' => $ip)));
+  $form_state['redirect'] = 'admin/config/people/ip-blocking';
+  return;
+}
+
+/**
+ * IP deletion confirm page.
+ *
+ * @see system_ip_blocking_delete_submit()
+ */
+function system_ip_blocking_delete($form, &$form_state, $iid) {
+  $form['blocked_ip'] = array(
+    '#type' => 'value',
+    '#value' => $iid,
+  );
+  return confirm_form($form, t('Are you sure you want to delete %ip?', array('%ip' => $iid['ip'])), 'admin/config/people/ip-blocking', t('This action cannot be undone.'), t('Delete'), t('Cancel'));
+}
+
+/**
+ * Process system_ip_blocking_delete form submissions.
+ */
+function system_ip_blocking_delete_submit($form, &$form_state) {
+  $blocked_ip = $form_state['values']['blocked_ip'];
+  db_delete('blocked_ips')
+    ->condition('iid', $blocked_ip['iid'])
+    ->execute();
+  watchdog('user', 'Deleted %ip', array('%ip' => $blocked_ip['ip']));
+  drupal_set_message(t('The IP address %ip was deleted.', array('%ip' => $blocked_ip['ip'])));
+  $form_state['redirect'] = 'admin/config/people/ip-blocking';
+}
+
+/**
+ * Form builder; The general site information form.
+ *
+ * @ingroup forms
+ * @see system_settings_form()
+ */
+function system_site_information_settings() {
+  $form['site_information'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Site details'),
+  );
+  $form['site_information']['site_name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Site name'),
+    '#default_value' => variable_get('site_name', 'Drupal'),
+    '#required' => TRUE
+  );
+  $form['site_information']['site_slogan'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Slogan'),
+    '#default_value' => variable_get('site_slogan', ''),
+    '#description' => t("How this is used depends on your site's theme."),
+  );
+  $form['site_information']['site_mail'] = array(
+    '#type' => 'textfield',
+    '#title' => t('E-mail address'),
+    '#default_value' => variable_get('site_mail', ini_get('sendmail_from')),
+    '#description' => t("The <em>From</em> address in automated e-mails sent during registration and new password requests, and other notifications. (Use an address ending in your site's domain to help prevent this e-mail being flagged as spam.)"),
+    '#required' => TRUE,
+  );
+  $form['front_page'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Front page'),
+  );
+  $form['front_page']['default_nodes_main'] = array(
+    '#type' => 'select', '#title' => t('Number of posts on front page'),
+    '#default_value' => variable_get('default_nodes_main', 10),
+    '#options' => drupal_map_assoc(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30)),
+    '#description' => t('The maximum number of posts displayed on overview pages such as the front page.')
+  );
+  $form['front_page']['site_frontpage'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Default front page'),
+    '#default_value' => (variable_get('site_frontpage')!='node'?drupal_get_path_alias(variable_get('site_frontpage', 'node')):''),
+    '#size' => 40,
+    '#description' => t('Optionally, specify a relative URL to display as the front page.  Leave blank to display the default content feed.'),
+    '#field_prefix' => url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q='),
+  );
+  $form['error_page'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Error pages'),
+  );
+  $form['error_page']['site_403'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Default 403 (access denied) page'),
+    '#default_value' => variable_get('site_403', ''),
+    '#size' => 40,
+    '#description' => t('This page is displayed when the requested document is denied to the current user. Leave blank to display a generic "access denied" page.'),
+    '#field_prefix' => url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q=')
+  );
+  $form['error_page']['site_404'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Default 404 (not found) page'),
+    '#default_value' => variable_get('site_404', ''),
+    '#size' => 40,
+    '#description' => t('This page is displayed when no other content matches the requested document. Leave blank to display a generic "page not found" page.'),
+    '#field_prefix' => url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q=')
+  );
+
+  $form['#validate'][] = 'system_site_information_settings_validate';
+
+  return system_settings_form($form);
+}
+
+/**
+ * Validates the submitted site-information form.
+ */
+function system_site_information_settings_validate($form, &$form_state) {
+  // Validate the e-mail address.
+  if ($error = user_validate_mail($form_state['values']['site_mail'])) {
+    form_set_error('site_mail', $error);
+  }
+  // Check for empty front page path.
+  if (empty($form_state['values']['site_frontpage'])) {
+    // Set to default "node".
+    form_set_value($form['front_page']['site_frontpage'], 'node', $form_state);
+  }
+  else {
+    // Get the normal path of the front page.
+    form_set_value($form['front_page']['site_frontpage'], drupal_get_normal_path($form_state['values']['site_frontpage']), $form_state);
+  }
+  // Validate front page path.
+  if (!drupal_valid_path($form_state['values']['site_frontpage'])) {
+    form_set_error('site_frontpage', t("The path '%path' is either invalid or you do not have access to it.", array('%path' => $form_state['values']['site_frontpage'])));
+  }
+  // Get the normal paths of both error pages.
+  if (!empty($form_state['values']['site_403'])) {
+    form_set_value($form['error_page']['site_403'], drupal_get_normal_path($form_state['values']['site_403']), $form_state);
+  }
+  if (!empty($form_state['values']['site_404'])) {
+    form_set_value($form['error_page']['site_404'], drupal_get_normal_path($form_state['values']['site_404']), $form_state);
+  }
+  // Validate 403 error path.
+  if (!empty($form_state['values']['site_403']) && !drupal_valid_path($form_state['values']['site_403'])) {
+    form_set_error('site_403', t("The path '%path' is either invalid or you do not have access to it.", array('%path' => $form_state['values']['site_403'])));
+  }
+  // Validate 404 error path.
+  if (!empty($form_state['values']['site_404']) && !drupal_valid_path($form_state['values']['site_404'])) {
+    form_set_error('site_404', t("The path '%path' is either invalid or you do not have access to it.", array('%path' => $form_state['values']['site_404'])));
+  }
+}
+
+/**
+ * Form builder; Cron form.
+ *
+ * @see system_settings_form()
+ * @ingroup forms
+ */
+function system_cron_settings() {
+  global $base_url;
+  $form['description'] = array(
+    '#markup' => '<p>' . t('Cron takes care of running periodic tasks like checking for updates and indexing content for search.') . '</p>',
+  );
+  $form['run'] = array(
+    '#type' => 'submit',
+    '#value' => t('Run cron'),
+    '#submit' => array('system_run_cron_submit'),
+  );
+  $status = '<p>' . t('Last run: %cron-last ago.', array('%cron-last' => format_interval(REQUEST_TIME - variable_get('cron_last')),)) . '</p>';
+  $form['status'] = array(
+    '#markup' => $status,
+  );
+
+  $form['cron_url'] = array(
+    '#markup' => '<p>' . t('To run cron from outside the site, go to <a href="!cron">!cron</a>', array('!cron' => url($base_url . '/cron.php', array('external' => TRUE, 'query' => array('cron_key' => variable_get('cron_key', 'drupal')))))) . '</p>',
+  );
+
+  $form['cron'] = array(
+    '#type' => 'fieldset',
+  );
+  $form['cron']['cron_safe_threshold'] = array(
+    '#type' => 'select',
+    '#title' => t('Run cron every'),
+    '#description' => t('More information about setting up scheduled tasks can be found by <a href="@url">reading the cron tutorial on drupal.org</a>.', array('@url' => url('http://drupal.org/cron'))),
+    '#default_value' => variable_get('cron_safe_threshold', DRUPAL_CRON_DEFAULT_THRESHOLD),
+    '#options' => array(0 => t('Never')) + drupal_map_assoc(array(3600, 10800, 21600, 43200, 86400, 604800), 'format_interval'),
+  );
+
+  return system_settings_form($form);
+}
+
+/**
+ * Submit callback; run cron.
+ *
+ * @ingroup forms
+ */
+function system_run_cron_submit($form, &$form_state) {
+  // Run cron manually from Cron form.
+  if (drupal_cron_run()) {
+    drupal_set_message(t('Cron run successfully.'));
+  }
+  else {
+    drupal_set_message(t('Cron run failed.'), 'error');
+  }
+
+  drupal_goto('admin/config/system/cron');
+}
+
+/**
+ * Form builder; Configure error reporting settings.
+ *
+ * @ingroup forms
+ * @see system_settings_form()
+ */
+function system_logging_settings() {
+  $form['error_level'] = array(
+    '#type' => 'radios',
+    '#title' => t('Error messages to display'),
+    '#default_value' => variable_get('error_level', ERROR_REPORTING_DISPLAY_ALL),
+    '#options' => array(
+      ERROR_REPORTING_HIDE => t('None'),
+      ERROR_REPORTING_DISPLAY_SOME => t('Errors and warnings'),
+      ERROR_REPORTING_DISPLAY_ALL => t('All messages'),
+    ),
+    '#description' => t('It is recommended that sites running on production environments do not display any errors.'),
+  );
+
+  return system_settings_form($form);
+}
+
+/**
+ * Form builder; Configure site performance settings.
+ *
+ * @ingroup forms
+ * @see system_settings_form()
+ */
+function system_performance_settings() {
+  drupal_add_js(drupal_get_path('module', 'system') . '/system.js');
+
+  $form['clear_cache'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Clear cache'),
+  );
+
+  $form['clear_cache']['clear'] = array(
+    '#type' => 'submit',
+    '#value' => t('Clear all caches'),
+    '#submit' => array('system_clear_cache_submit'),
+  );
+
+  $form['caching'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Caching'),
+  );
+
+  $cache = variable_get('cache', 0);
+  $form['caching']['cache'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Cache pages for anonymous users'),
+    '#default_value' => $cache,
+    '#weight' => -2,
+  );
+  $period = drupal_map_assoc(array(0, 60, 180, 300, 600, 900, 1800, 2700, 3600, 10800, 21600, 32400, 43200, 86400), 'format_interval');
+  $period[0] = '<' . t('none') . '>';
+  $form['caching']['cache_lifetime'] = array(
+    '#type' => 'select',
+    '#title' => t('Minimum cache lifetime'),
+    '#default_value' => variable_get('cache_lifetime', 0),
+    '#options' => $period,
+    '#description' => t('Cached pages will not be re-created until at least this much time has elapsed.')
+  );
+  $form['caching']['page_cache_maximum_age'] = array(
+    '#type' => 'select',
+    '#title' => t('Expiration of cached pages'),
+    '#default_value' => variable_get('page_cache_maximum_age', 0),
+    '#options' => $period,
+    '#description' => t('The maximum time an external cache can use an old version of a page.')
+  );
+
+  $directory = 'public://';
+  $is_writable = is_dir($directory) && is_writable($directory);
+  $disabled = !$is_writable;
+  $disabled_message = '';
+  if (!$is_writable) {
+    $disabled_message = ' ' . t('<strong class="error">Set up the <a href="!file-system">public files directory</a> to make these optimizations available.</strong>', array('!file-system' => url('admin/config/media/file-system')));
+  }
+
+  $form['bandwidth_optimization'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Bandwidth optimization'),
+    '#description' => t('External resources can be optimized automatically, which can reduce both the size and number of requests made to your website.') . $disabled_message,
+  );
+
+  $js_hide = $cache ? '' : ' class="js-hide"';
+  $form['bandwidth_optimization']['page_compression'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Compress cached pages.'),
+    '#default_value' => variable_get('page_compression', TRUE),
+    '#prefix' => '<div id="page-compression-wrapper"' . $js_hide . '>',
+    '#suffix' => '</div>',
+  );
+  $form['bandwidth_optimization']['preprocess_css'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Aggregate and compress CSS files.'),
+    '#default_value' => intval(variable_get('preprocess_css', 0) && $is_writable),
+    '#disabled' => $disabled,
+  );
+  $form['bandwidth_optimization']['preprocess_js'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Aggregate JavaScript files.'),
+    '#default_value' => intval(variable_get('preprocess_js', 0) && $is_writable),
+    '#disabled' => $disabled,
+  );
+
+  $form['#submit'][] = 'drupal_clear_css_cache';
+  $form['#submit'][] = 'drupal_clear_js_cache';
+  // This form allows page compression settings to be changed, which can
+  // invalidate the page cache, so it needs to be cleared on form submit.
+  $form['#submit'][] = 'system_clear_page_cache_submit';
+
+  return system_settings_form($form);
+}
+
+/**
+ * Submit callback; clear system caches.
+ *
+ * @ingroup forms
+ */
+function system_clear_cache_submit($form, &$form_state) {
+  drupal_flush_all_caches();
+  drupal_set_message(t('Caches cleared.'));
+}
+
+/**
+ * Submit callback; clear the page cache.
+ *
+ * @ingroup forms
+ */
+function system_clear_page_cache_submit($form, &$form_state) {
+  cache_clear_all('*', 'cache_page', TRUE);
+}
+
+/**
+ * Form builder; Configure the site file handling.
+ *
+ * @ingroup forms
+ * @see system_settings_form()
+ */
+function system_file_system_settings() {
+  $form['file_public_path'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Public file system path'),
+    '#default_value' => variable_get('file_public_path', conf_path() . '/files'),
+    '#maxlength' => 255,
+    '#description' => t('A local file system path where public files will be stored. This directory must exist and be writable by Drupal. This directory must be relative to the Drupal installation directory and be accessible over the web.'),
+    '#after_build' => array('system_check_directory'),
+  );
+
+  $form['file_private_path'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Private file system path'),
+    '#default_value' => variable_get('file_private_path', ''),
+    '#maxlength' => 255,
+    '#description' => t('An existing local file system path for storing private files. It should be writable by Drupal and not accessible over the web. See the online handbook for <a href="@handbook">more information about securing private files</a>.', array('@handbook' => 'http://drupal.org/documentation/modules/file')),
+    '#after_build' => array('system_check_directory'),
+  );
+
+  $form['file_temporary_path'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Temporary directory'),
+    '#default_value' => variable_get('file_temporary_path', file_directory_temp()),
+    '#maxlength' => 255,
+    '#description' => t('A local file system path where temporary files will be stored. This directory should not be accessible over the web.'),
+    '#after_build' => array('system_check_directory'),
+  );
+  // Any visible, writeable wrapper can potentially be used for the files
+  // directory, including a remote file system that integrates with a CDN.
+  foreach (file_get_stream_wrappers(STREAM_WRAPPERS_WRITE_VISIBLE) as $scheme => $info) {
+    $options[$scheme] = check_plain($info['description']);
+  }
+
+  if (!empty($options)) {
+    $form['file_default_scheme'] = array(
+      '#type' => 'radios',
+      '#title' => t('Default download method'),
+      '#default_value' => variable_get('file_default_scheme', isset($options['public']) ? 'public' : key($options)),
+      '#options' => $options,
+      '#description' => t('This setting is used as the preferred download method. The use of public files is more efficient, but does not provide any access control.'),
+    );
+  }
+
+  return system_settings_form($form);
+}
+
+/**
+ * Form builder; Configure site image toolkit usage.
+ *
+ * @ingroup forms
+ * @see system_settings_form()
+ */
+function system_image_toolkit_settings() {
+  $toolkits_available = image_get_available_toolkits();
+  $current_toolkit = image_get_toolkit();
+
+  if (count($toolkits_available) == 0) {
+    variable_del('image_toolkit');
+    $form['image_toolkit_help'] = array(
+      '#markup' => t("No image toolkits were detected. Drupal includes support for <a href='!gd-link'>PHP's built-in image processing functions</a> but they were not detected on this system. You should consult your system administrator to have them enabled, or try using a third party toolkit.", array('gd-link' => url('http://php.net/gd'))),
+    );
+    return $form;
+  }
+
+  if (count($toolkits_available) > 1) {
+    $form['image_toolkit'] = array(
+      '#type' => 'radios',
+      '#title' => t('Select an image processing toolkit'),
+      '#default_value' => variable_get('image_toolkit', $current_toolkit),
+      '#options' => $toolkits_available
+    );
+  }
+  else {
+    variable_set('image_toolkit', key($toolkits_available));
+  }
+
+  // Get the toolkit's settings form.
+  $function = 'image_' . $current_toolkit . '_settings';
+  if (function_exists($function)) {
+    $form['image_toolkit_settings'] = $function();
+  }
+
+  return system_settings_form($form);
+}
+
+/**
+ * Form builder; Configure how the site handles RSS feeds.
+ *
+ * @ingroup forms
+ * @see system_settings_form()
+ */
+function system_rss_feeds_settings() {
+  $form['feed_description'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Feed description'),
+    '#default_value' => variable_get('feed_description', ''),
+    '#description' => t('Description of your site, included in each feed.')
+  );
+  $form['feed_default_items'] = array(
+    '#type' => 'select',
+    '#title' => t('Number of items in each feed'),
+    '#default_value' => variable_get('feed_default_items', 10),
+    '#options' => drupal_map_assoc(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30)),
+    '#description' => t('Default number of items to include in each feed.')
+  );
+  $form['feed_item_length'] = array(
+    '#type' => 'select',
+    '#title' => t('Feed content'),
+    '#default_value' => variable_get('feed_item_length', 'fulltext'),
+    '#options' => array('title' => t('Titles only'), 'teaser' => t('Titles plus teaser'), 'fulltext' => t('Full text')),
+    '#description' => t('Global setting for the default display of content items in each feed.')
+  );
+
+  return system_settings_form($form);
+}
+
+/**
+ * Form builder; Configure the site regional settings.
+ *
+ * @ingroup forms
+ * @see system_settings_form()
+ * @see system_regional_settings_submit()
+ */
+function system_regional_settings() {
+  include_once DRUPAL_ROOT . '/includes/locale.inc';
+  $countries = country_get_list();
+
+  // Date settings:
+  $zones = system_time_zones();
+
+  $form['locale'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Locale'),
+  );
+
+  $form['locale']['site_default_country'] = array(
+    '#type' => 'select',
+    '#title' => t('Default country'),
+    '#empty_value' => '',
+    '#default_value' => variable_get('site_default_country', ''),
+    '#options' => $countries,
+    '#attributes' => array('class' => array('country-detect')),
+  );
+
+  $form['locale']['date_first_day'] = array(
+    '#type' => 'select',
+    '#title' => t('First day of week'),
+    '#default_value' => variable_get('date_first_day', 0),
+    '#options' => array(0 => t('Sunday'), 1 => t('Monday'), 2 => t('Tuesday'), 3 => t('Wednesday'), 4 => t('Thursday'), 5 => t('Friday'), 6 => t('Saturday')),
+  );
+
+  $form['timezone'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Time zones'),
+  );
+
+  $form['timezone']['date_default_timezone'] = array(
+    '#type' => 'select',
+    '#title' => t('Default time zone'),
+    '#default_value' => variable_get('date_default_timezone', date_default_timezone_get()),
+    '#options' => $zones,
+  );
+
+  $configurable_timezones = variable_get('configurable_timezones', 1);
+  $form['timezone']['configurable_timezones'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Users may set their own time zone.'),
+    '#default_value' => $configurable_timezones,
+  );
+
+  $form['timezone']['configurable_timezones_wrapper'] =  array(
+    '#type' => 'container',
+    '#states' => array(
+      // Hide the user configured timezone settings when users are forced to use
+      // the default setting.
+      'invisible' => array(
+        'input[name="configurable_timezones"]' => array('checked' => FALSE),
+      ),
+    ),
+  );
+  $form['timezone']['configurable_timezones_wrapper']['empty_timezone_message'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Remind users at login if their time zone is not set.'),
+    '#default_value' => variable_get('empty_timezone_message', 0),
+    '#description' => t('Only applied if users may set their own time zone.')
+  );
+
+  $form['timezone']['configurable_timezones_wrapper']['user_default_timezone'] = array(
+    '#type' => 'radios',
+    '#title' => t('Time zone for new users'),
+    '#default_value' => variable_get('user_default_timezone', DRUPAL_USER_TIMEZONE_DEFAULT),
+    '#options' => array(
+      DRUPAL_USER_TIMEZONE_DEFAULT => t('Default time zone.'),
+      DRUPAL_USER_TIMEZONE_EMPTY   => t('Empty time zone.'),
+      DRUPAL_USER_TIMEZONE_SELECT  => t('Users may set their own time zone at registration.'),
+    ),
+    '#description' => t('Only applied if users may set their own time zone.')
+  );
+
+  return system_settings_form($form);
+}
+
+/**
+ * Form builder; Configure the site date and time settings.
+ *
+ * @ingroup forms
+ * @see system_settings_form()
+ */
+function system_date_time_settings() {
+  // Get list of all available date types.
+  drupal_static_reset('system_get_date_types');
+  $format_types = system_get_date_types();
+
+  // Get list of all available date formats.
+  $all_formats = array();
+  drupal_static_reset('system_get_date_formats');
+  $date_formats = system_get_date_formats(); // Call this to rebuild the list, and to have default list.
+  foreach ($date_formats as $type => $format_info) {
+    $all_formats = array_merge($all_formats, $format_info);
+  }
+  $custom_formats = system_get_date_formats('custom');
+  if (!empty($format_types)) {
+    foreach ($format_types as $type => $type_info) {
+      // If a system type, only show the available formats for that type and
+      // custom ones.
+      if ($type_info['locked'] == 1) {
+        $formats = system_get_date_formats($type);
+        if (empty($formats)) {
+          $formats = $all_formats;
+        }
+        elseif (!empty($custom_formats)) {
+          $formats = array_merge($formats, $custom_formats);
+        }
+      }
+      // If a user configured type, show all available date formats.
+      else {
+        $formats = $all_formats;
+      }
+
+      $choices = array();
+      foreach ($formats as $f => $format) {
+        $choices[$f] = format_date(REQUEST_TIME, 'custom', $f);
+      }
+      reset($formats);
+      $default = variable_get('date_format_' . $type, key($formats));
+
+      // Get date type info for this date type.
+      $type_info = system_get_date_types($type);
+      $form['formats']['#theme'] = 'system_date_time_settings';
+
+      // Show date format select list.
+      $form['formats']['format']['date_format_' . $type] = array(
+        '#type' => 'select',
+        '#title' => check_plain($type_info['title']),
+        '#attributes' => array('class' => array('date-format')),
+        '#default_value' => (isset($choices[$default]) ? $default : 'custom'),
+        '#options' => $choices,
+      );
+
+      // If this isn't a system provided type, allow the user to remove it from
+      // the system.
+      if ($type_info['locked'] == 0) {
+        $form['formats']['delete']['date_format_' . $type . '_delete'] = array(
+          '#type' => 'link',
+          '#title' => t('delete'),
+          '#href' => 'admin/config/regional/date-time/types/' . $type . '/delete',
+        );
+      }
+    }
+  }
+
+  // Display a message if no date types configured.
+  $form['#empty_text'] = t('No date types available. <a href="@link">Add date type</a>.', array('@link' => url('admin/config/regional/date-time/types/add')));
+
+  return system_settings_form($form);
+}
+
+/**
+ * Returns HTML for the date settings form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_system_date_time_settings($variables) {
+  $form = $variables['form'];
+  $header = array(
+    t('Date type'),
+    t('Format'),
+    t('Operations'),
+  );
+
+  foreach (element_children($form['format']) as $key) {
+    $delete_key = $key . '_delete';
+    $row = array();
+    $row[] = $form['format'][$key]['#title'];
+    $form['format'][$key]['#title_display'] = 'invisible';
+    $row[] = array('data' => drupal_render($form['format'][$key]));
+    $row[] = array('data' => drupal_render($form['delete'][$delete_key]));
+    $rows[] = $row;
+  }
+
+  $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'system-date-types')));
+  $output .= drupal_render_children($form);
+
+  return $output;
+}
+
+
+/**
+ * Add new date type.
+ *
+ * @ingroup forms
+ * @ingroup system_add_date_format_type_form_validate()
+ * @ingroup system_add_date_format_type_form_submit()
+ */
+function system_add_date_format_type_form($form, &$form_state) {
+  $form['date_type'] = array(
+    '#title' => t('Date type'),
+    '#type' => 'textfield',
+    '#required' => TRUE,
+  );
+  $form['machine_name'] = array(
+    '#type' => 'machine_name',
+    '#machine_name' => array(
+      'exists' => 'system_get_date_types',
+      'source' => array('date_type'),
+    ),
+  );
+
+  // Get list of all available date formats.
+  $formats = array();
+  drupal_static_reset('system_get_date_formats');
+  $date_formats = system_get_date_formats(); // Call this to rebuild the list, and to have default list.
+  foreach ($date_formats as $type => $format_info) {
+    $formats = array_merge($formats, $format_info);
+  }
+  $custom_formats = system_get_date_formats('custom');
+  if (!empty($custom_formats)) {
+    $formats = array_merge($formats, $custom_formats);
+  }
+  $choices = array();
+  foreach ($formats as $f => $format) {
+    $choices[$f] = format_date(REQUEST_TIME, 'custom', $f);
+  }
+  // Show date format select list.
+  $form['date_format'] = array(
+    '#type' => 'select',
+    '#title' => t('Date format'),
+    '#attributes' => array('class' => array('date-format')),
+    '#options' => $choices,
+    '#required' => TRUE,
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Add date type'),
+  );
+
+  $form['#validate'][] = 'system_add_date_format_type_form_validate';
+  $form['#submit'][] = 'system_add_date_format_type_form_submit';
+
+  return $form;
+}
+
+/**
+ * Validate system_add_date_format_type form submissions.
+ */
+function system_add_date_format_type_form_validate($form, &$form_state) {
+  if (!empty($form_state['values']['machine_name']) && !empty($form_state['values']['date_type'])) {
+    if (!preg_match("/^[a-zA-Z0-9_]+$/", trim($form_state['values']['machine_name']))) {
+      form_set_error('machine_name', t('The date type must contain only alphanumeric characters and underscores.'));
+    }
+    $types = system_get_date_types();
+    if (in_array(trim($form_state['values']['machine_name']), array_keys($types))) {
+      form_set_error('machine_name', t('This date type already exists. Enter a unique type.'));
+    }
+  }
+}
+
+/**
+ * Process system_add_date_format_type form submissions.
+ */
+function system_add_date_format_type_form_submit($form, &$form_state) {
+  $machine_name = trim($form_state['values']['machine_name']);
+
+  $format_type = array();
+  $format_type['title'] = trim($form_state['values']['date_type']);
+  $format_type['type'] = $machine_name;
+  $format_type['locked'] = 0;
+  $format_type['is_new'] = 1;
+  system_date_format_type_save($format_type);
+  variable_set('date_format_' . $machine_name, $form_state['values']['date_format']);
+
+  drupal_set_message(t('New date type added successfully.'));
+  $form_state['redirect'] = 'admin/config/regional/date-time';
+}
+
+/**
+ * Return the date for a given format string via Ajax.
+ */
+function system_date_time_lookup() {
+  $result = format_date(REQUEST_TIME, 'custom', $_GET['format']);
+  drupal_json_output($result);
+}
+
+/**
+ * Form builder; Configure the site's maintenance status.
+ *
+ * @ingroup forms
+ * @see system_settings_form()
+ */
+function system_site_maintenance_mode() {
+  $form['maintenance_mode'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Put site into maintenance mode'),
+    '#default_value' => variable_get('maintenance_mode', 0),
+    '#description' => t('When enabled, only users with the "Use the site in maintenance mode" <a href="@permissions-url">permission</a> are able to access your site to perform maintenance; all other visitors see the maintenance mode message configured below. Authorized users can log in directly via the <a href="@user-login">user login</a> page.', array('@permissions-url' => url('admin/people/permissions'), '@user-login' => url('user'))),
+  );
+  $form['maintenance_mode_message'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Maintenance mode message'),
+    '#default_value' => variable_get('maintenance_mode_message', t('@site is currently under maintenance. We should be back shortly. Thank you for your patience.', array('@site' => variable_get('site_name', 'Drupal')))),
+    '#description' => t('Message to show visitors when the site is in maintenance mode.')
+  );
+
+  return system_settings_form($form);
+}
+
+/**
+ * Form builder; Configure clean URL settings.
+ *
+ * @ingroup forms
+ * @see system_settings_form()
+ */
+function system_clean_url_settings($form, &$form_state) {
+  $available = FALSE;
+  $conflict = FALSE;
+
+  // If the request URI is a clean URL, clean URLs must be available.
+  // Otherwise, run a test.
+  if (strpos(request_uri(), '?q=') === FALSE && strpos(request_uri(), '&q=') === FALSE) {
+    $available = TRUE;
+  }
+  else {
+    $request = drupal_http_request($GLOBALS['base_url'] . '/admin/config/search/clean-urls/check');
+    // If the request returns HTTP 200, clean URLs are available.
+    if (isset($request->code) && $request->code == 200) {
+      $available = TRUE;
+      // If the user started the clean URL test, provide explicit feedback.
+      if (isset($form_state['input']['clean_url_test_execute'])) {
+        drupal_set_message(t('The clean URL test passed.'));
+      }
+    }
+    else {
+      // If the test failed while clean URLs are enabled, make sure clean URLs
+      // can be disabled.
+      if (variable_get('clean_url', 0)) {
+        $conflict = TRUE;
+        // Warn the user of a conflicting situation, unless after processing
+        // a submitted form.
+        if (!isset($form_state['input']['op'])) {
+          drupal_set_message(t('Clean URLs are enabled, but the clean URL test failed. Uncheck the box below to disable clean URLs.'), 'warning');
+        }
+      }
+      // If the user started the clean URL test, provide explicit feedback.
+      elseif (isset($form_state['input']['clean_url_test_execute'])) {
+        drupal_set_message(t('The clean URL test failed.'), 'warning');
+      }
+    }
+  }
+
+  // Show the enable/disable form if clean URLs are available or if the user
+  // must be able to resolve a conflicting setting.
+  if ($available || $conflict) {
+    $form['clean_url'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Enable clean URLs'),
+      '#default_value' => variable_get('clean_url', 0),
+      '#description' => t('Use URLs like <code>example.com/user</code> instead of <code>example.com/?q=user</code>.'),
+    );
+    $form = system_settings_form($form);
+    if ($conflict) {
+      // $form_state['redirect'] needs to be set to the non-clean URL,
+      // otherwise the setting is not saved.
+      $form_state['redirect'] = url('', array('query' => array('q' => '/admin/config/search/clean-urls')));
+    }
+  }
+  // Show the clean URLs test form.
+  else {
+    drupal_add_js(drupal_get_path('module', 'system') . '/system.js');
+
+    $form_state['redirect'] = url('admin/config/search/clean-urls');
+    $form['clean_url_description'] = array(
+      '#type' => 'markup',
+      '#markup' => '<p>' . t('Use URLs like <code>example.com/user</code> instead of <code>example.com/?q=user</code>.'),
+    );
+    // Explain why the user is seeing this page and what to expect after
+    // clicking the 'Run the clean URL test' button.
+    $form['clean_url_test_result'] = array(
+      '#type' => 'markup',
+      '#markup' => '<p>' . t('Clean URLs cannot be enabled. If you are directed to this page or to a <em>Page not found (404)</em> error after testing for clean URLs, see the <a href="@handbook">online handbook</a>.', array('@handbook' => 'http://drupal.org/node/15365')) . '</p>',
+    );
+    $form['actions'] = array(
+      '#type' => 'actions',
+      'clean_url_test' => array(
+        '#type' => 'submit',
+        '#value' => t('Run the clean URL test'),
+      ),
+    );
+    $form['clean_url_test_execute'] = array(
+      '#type' => 'hidden',
+      '#value' => 1,
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Menu callback: displays the site status report. Can also be used as a pure check.
+ *
+ * @param $check
+ *   If true, only returns a boolean whether there are system status errors.
+ */
+function system_status($check = FALSE) {
+  // Load .install files
+  include_once DRUPAL_ROOT . '/includes/install.inc';
+  drupal_load_updates();
+
+  // Check run-time requirements and status information.
+  $requirements = module_invoke_all('requirements', 'runtime');
+  usort($requirements, '_system_sort_requirements');
+
+  if ($check) {
+    return drupal_requirements_severity($requirements) == REQUIREMENT_ERROR;
+  }
+  // MySQL import might have set the uid of the anonymous user to autoincrement
+  // value. Let's try fixing it. See http://drupal.org/node/204411
+  db_update('users')
+    ->expression('uid', 'uid - uid')
+    ->condition('name', '')
+    ->condition('pass', '')
+    ->condition('status', 0)
+    ->execute();
+  return theme('status_report', array('requirements' => $requirements));
+}
+
+/**
+ * Menu callback: run cron manually.
+ */
+function system_run_cron() {
+  // Run cron manually
+  if (drupal_cron_run()) {
+    drupal_set_message(t('Cron ran successfully.'));
+  }
+  else {
+    drupal_set_message(t('Cron run failed.'), 'error');
+  }
+
+  drupal_goto('admin/reports/status');
+}
+
+/**
+ * Menu callback: return information about PHP.
+ */
+function system_php() {
+  phpinfo();
+  drupal_exit();
+}
+
+/**
+ * Default page callback for batches.
+ */
+function system_batch_page() {
+  require_once DRUPAL_ROOT . '/includes/batch.inc';
+  $output = _batch_page();
+
+  if ($output === FALSE) {
+    drupal_access_denied();
+  }
+  elseif (isset($output)) {
+    // Force a page without blocks or messages to
+    // display a list of collected messages later.
+    drupal_set_page_content($output);
+    $page = element_info('page');
+    $page['#show_messages'] = FALSE;
+    return $page;
+  }
+}
+
+/**
+ * Returns HTML for an administrative block for display.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - block: An array containing information about the block:
+ *     - show: A Boolean whether to output the block. Defaults to FALSE.
+ *     - title: The block's title.
+ *     - content: (optional) Formatted content for the block.
+ *     - description: (optional) Description of the block. Only output if
+ *       'content' is not set.
+ *
+ * @ingroup themeable
+ */
+function theme_admin_block($variables) {
+  $block = $variables['block'];
+  $output = '';
+
+  // Don't display the block if it has no content to display.
+  if (empty($block['show'])) {
+    return $output;
+  }
+
+  $output .= '<div class="admin-panel">';
+  if (!empty($block['title'])) {
+    $output .= '<h3>' . $block['title'] . '</h3>';
+  }
+  if (!empty($block['content'])) {
+    $output .= '<div class="body">' . $block['content'] . '</div>';
+  }
+  else {
+    $output .= '<div class="description">' . $block['description'] . '</div>';
+  }
+  $output .= '</div>';
+
+  return $output;
+}
+
+/**
+ * Returns HTML for the content of an administrative block.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - content: An array containing information about the block. Each element
+ *     of the array represents an administrative menu item, and must at least
+ *     contain the keys 'title', 'href', and 'localized_options', which are
+ *     passed to l(). A 'description' key may also be provided.
+ *
+ * @ingroup themeable
+ */
+function theme_admin_block_content($variables) {
+  $content = $variables['content'];
+  $output = '';
+
+  if (!empty($content)) {
+    $class = 'admin-list';
+    if ($compact = system_admin_compact_mode()) {
+      $class .= ' compact';
+    }
+    $output .= '<dl class="' . $class . '">';
+    foreach ($content as $item) {
+      $output .= '<dt>' . l($item['title'], $item['href'], $item['localized_options']) . '</dt>';
+      if (!$compact && isset($item['description'])) {
+        $output .= '<dd>' . filter_xss_admin($item['description']) . '</dd>';
+      }
+    }
+    $output .= '</dl>';
+  }
+  return $output;
+}
+
+/**
+ * Returns HTML for an administrative page.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - blocks: An array of blocks to display. Each array should include a
+ *     'title', a 'description', a formatted 'content' and a 'position' which
+ *     will control which container it will be in. This is usually 'left' or
+ *     'right'.
+ *
+ * @ingroup themeable
+ */
+function theme_admin_page($variables) {
+  $blocks = $variables['blocks'];
+
+  $stripe = 0;
+  $container = array();
+
+  foreach ($blocks as $block) {
+    if ($block_output = theme('admin_block', array('block' => $block))) {
+      if (empty($block['position'])) {
+        // perform automatic striping.
+        $block['position'] = ++$stripe % 2 ? 'left' : 'right';
+      }
+      if (!isset($container[$block['position']])) {
+        $container[$block['position']] = '';
+      }
+      $container[$block['position']] .= $block_output;
+    }
+  }
+
+  $output = '<div class="admin clearfix">';
+  $output .= theme('system_compact_link');
+
+  foreach ($container as $id => $data) {
+    $output .= '<div class="' . $id . ' clearfix">';
+    $output .= $data;
+    $output .= '</div>';
+  }
+  $output .= '</div>';
+  return $output;
+}
+
+/**
+ * Returns HTML for the output of the dashboard page.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - menu_items: An array of modules to be displayed.
+ *
+ * @ingroup themeable
+ */
+function theme_system_admin_index($variables) {
+  $menu_items = $variables['menu_items'];
+
+  $stripe = 0;
+  $container = array('left' => '', 'right' => '');
+  $flip = array('left' => 'right', 'right' => 'left');
+  $position = 'left';
+
+  // Iterate over all modules.
+  foreach ($menu_items as $module => $block) {
+    list($description, $items) = $block;
+
+    // Output links.
+    if (count($items)) {
+      $block = array();
+      $block['title'] = $module;
+      $block['content'] = theme('admin_block_content', array('content' => $items));
+      $block['description'] = t($description);
+      $block['show'] = TRUE;
+
+      if ($block_output = theme('admin_block', array('block' => $block))) {
+        if (!isset($block['position'])) {
+          // Perform automatic striping.
+          $block['position'] = $position;
+          $position = $flip[$position];
+        }
+        $container[$block['position']] .= $block_output;
+      }
+    }
+  }
+
+  $output = '<div class="admin clearfix">';
+  $output .= theme('system_compact_link');
+  foreach ($container as $id => $data) {
+    $output .= '<div class="' . $id . ' clearfix">';
+    $output .= $data;
+    $output .= '</div>';
+  }
+  $output .= '</div>';
+
+  return $output;
+}
+
+/**
+ * Returns HTML for the status report.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - requirements: An array of requirements.
+ *
+ * @ingroup themeable
+ */
+function theme_status_report($variables) {
+  $requirements = $variables['requirements'];
+  $severities = array(
+    REQUIREMENT_INFO => array(
+      'title' => t('Info'),
+      'class' => 'info',
+    ),
+    REQUIREMENT_OK => array(
+      'title' => t('OK'),
+      'class' => 'ok',
+    ),
+    REQUIREMENT_WARNING => array(
+      'title' => t('Warning'),
+      'class' => 'warning',
+    ),
+    REQUIREMENT_ERROR => array(
+      'title' => t('Error'),
+      'class' => 'error',
+    ),
+  );
+  $output = '<table class="system-status-report">';
+
+  foreach ($requirements as $requirement) {
+    if (empty($requirement['#type'])) {
+      $severity = $severities[isset($requirement['severity']) ? (int) $requirement['severity'] : REQUIREMENT_OK];
+      $severity['icon'] = '<div title="' . $severity['title'] . '"><span class="element-invisible">' . $severity['title'] . '</span></div>';
+
+      // Output table row(s)
+      if (!empty($requirement['description'])) {
+        $output .= '<tr class="' . $severity['class'] . ' merge-down"><td class="status-icon">' . $severity['icon'] . '</td><td class="status-title">' . $requirement['title'] . '</td><td class="status-value">' . $requirement['value'] . '</td></tr>';
+        $output .= '<tr class="' . $severity['class'] . ' merge-up"><td colspan="3" class="status-description">' . $requirement['description'] . '</td></tr>';
+      }
+      else {
+        $output .= '<tr class="' . $severity['class'] . '"><td class="status-icon">' . $severity['icon'] . '</td><td class="status-title">' . $requirement['title'] . '</td><td class="status-value">' . $requirement['value'] . '</td></tr>';
+      }
+    }
+  }
+
+  $output .= '</table>';
+  return $output;
+}
+
+/**
+ * Returns HTML for the modules form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_system_modules_fieldset($variables) {
+  $form = $variables['form'];
+
+  // Individual table headers.
+  $rows = array();
+  // Iterate through all the modules, which are
+  // children of this fieldset.
+  foreach (element_children($form) as $key) {
+    // Stick it into $module for easier accessing.
+    $module = $form[$key];
+    $row = array();
+    unset($module['enable']['#title']);
+    $row[] = array('class' => array('checkbox'), 'data' => drupal_render($module['enable']));
+    $label = '<label';
+    if (isset($module['enable']['#id'])) {
+      $label .= ' for="' . $module['enable']['#id'] . '"';
+    }
+    $row[] = $label . '><strong>' . drupal_render($module['name']) . '</strong></label>';
+    $row[] = drupal_render($module['version']);
+    // Add the description, along with any modules it requires.
+    $description = drupal_render($module['description']);
+    if ($module['#requires']) {
+      $description .= '<div class="admin-requirements">' . t('Requires: !module-list', array('!module-list' => implode(', ', $module['#requires']))) . '</div>';
+    }
+    if ($module['#required_by']) {
+      $description .= '<div class="admin-requirements">' . t('Required by: !module-list', array('!module-list' => implode(', ', $module['#required_by']))) . '</div>';
+    }
+    $row[] = array('data' => $description, 'class' => array('description'));
+    // Display links (such as help or permissions) in their own columns.
+    foreach (array('help', 'permissions', 'configure') as $key) {
+      $row[] = array('data' => drupal_render($module['links'][$key]), 'class' => array($key));
+    }
+    $rows[] = $row;
+  }
+
+  return theme('table', array('header' => $form['#header'], 'rows' => $rows));
+}
+
+/**
+ * Returns HTML for a message about incompatible modules.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - message: The form array representing the currently disabled modules.
+ *
+ * @ingroup themeable
+ */
+function theme_system_modules_incompatible($variables) {
+  return '<div class="incompatible">' . $variables['message'] . '</div>';
+}
+
+/**
+ * Returns HTML for a table of currently disabled modules.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_system_modules_uninstall($variables) {
+  $form = $variables['form'];
+
+  // No theming for the confirm form.
+  if (isset($form['confirm'])) {
+    return drupal_render($form);
+  }
+
+  // Table headers.
+  $header = array(t('Uninstall'),
+    t('Name'),
+    t('Description'),
+  );
+
+  // Display table.
+  $rows = array();
+  foreach (element_children($form['modules']) as $module) {
+    if (!empty($form['modules'][$module]['#required_by'])) {
+      $disabled_message = format_plural(count($form['modules'][$module]['#required_by']),
+        'To uninstall @module, the following module must be uninstalled first: @required_modules',
+        'To uninstall @module, the following modules must be uninstalled first: @required_modules',
+        array('@module' => $form['modules'][$module]['#module_name'], '@required_modules' => implode(', ', $form['modules'][$module]['#required_by'])));
+      $disabled_message = '<div class="admin-requirements">' . $disabled_message . '</div>';
+    }
+    else {
+      $disabled_message = '';
+    }
+    $rows[] = array(
+      array('data' => drupal_render($form['uninstall'][$module]), 'align' => 'center'),
+      '<strong><label for="' . $form['uninstall'][$module]['#id'] . '">' . drupal_render($form['modules'][$module]['name']) . '</label></strong>',
+      array('data' => drupal_render($form['modules'][$module]['description']) . $disabled_message, 'class' => array('description')),
+    );
+  }
+
+  $output  = theme('table', array('header' => $header, 'rows' => $rows, 'empty' => t('No modules are available to uninstall.')));
+  $output .= drupal_render_children($form);
+
+  return $output;
+}
+
+/**
+ * Returns HTML for the Appearance page.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - theme_groups: An associative array containing groups of themes.
+ *
+ * @ingroup themeable
+ */
+function theme_system_themes_page($variables) {
+  $theme_groups = $variables['theme_groups'];
+
+  $output = '<div id="system-themes-page">';
+
+  foreach ($variables['theme_group_titles'] as $state => $title) {
+    if (!count($theme_groups[$state])) {
+      // Skip this group of themes if no theme is there.
+      continue;
+    }
+    // Start new theme group.
+    $output .= '<div class="system-themes-list system-themes-list-'. $state .' clearfix"><h2>'. $title .'</h2>';
+
+    foreach ($theme_groups[$state] as $theme) {
+
+      // Theme the screenshot.
+      $screenshot = $theme->screenshot ? theme('image', $theme->screenshot) : '<div class="no-screenshot">' . t('no screenshot') . '</div>';
+
+      // Localize the theme description.
+      $description = t($theme->info['description']);
+
+      // Style theme info
+      $notes = count($theme->notes) ? ' (' . join(', ', $theme->notes) . ')' : '';
+      $theme->classes[] = 'theme-selector';
+      $theme->classes[] = 'clearfix';
+      $output .= '<div class="'. join(' ', $theme->classes) .'">' . $screenshot . '<div class="theme-info"><h3>' . $theme->info['name'] . ' ' . (isset($theme->info['version']) ? $theme->info['version'] : '') . $notes . '</h3><div class="theme-description">' . $description . '</div>';
+
+      // Make sure to provide feedback on compatibility.
+      if (!empty($theme->incompatible_core)) {
+        $output .= '<div class="incompatible">' . t('This version is not compatible with Drupal !core_version and should be replaced.', array('!core_version' => DRUPAL_CORE_COMPATIBILITY)) . '</div>';
+      }
+      elseif (!empty($theme->incompatible_php)) {
+        if (substr_count($theme->info['php'], '.') < 2) {
+          $theme->info['php'] .= '.*';
+        }
+        $output .= '<div class="incompatible">' . t('This theme requires PHP version @php_required and is incompatible with PHP version !php_version.', array('@php_required' => $theme->info['php'], '!php_version' => phpversion())) . '</div>';
+      }
+      else {
+        $output .= theme('links', array('links' => $theme->operations, 'attributes' => array('class' => array('operations', 'clearfix'))));
+      }
+      $output .= '</div></div>';
+    }
+    $output .= '</div>';
+  }
+  $output .= '</div>';
+
+  return $output;
+}
+
+/**
+ * Menu callback; present a form for deleting a date format.
+ */
+function system_date_delete_format_form($form, &$form_state, $dfid) {
+  $form['dfid'] = array(
+    '#type' => 'value',
+    '#value' => $dfid,
+  );
+  $format = system_get_date_format($dfid);
+
+  $output = confirm_form($form,
+    t('Are you sure you want to remove the format %format?', array('%format' => format_date(REQUEST_TIME, 'custom', $format->format))),
+    'admin/config/regional/date-time/formats',
+    t('This action cannot be undone.'),
+    t('Remove'), t('Cancel'),
+    'confirm'
+  );
+
+  return $output;
+}
+
+/**
+ * Delete a configured date format.
+ */
+function system_date_delete_format_form_submit($form, &$form_state) {
+  if ($form_state['values']['confirm']) {
+    $format = system_get_date_format($form_state['values']['dfid']);
+    system_date_format_delete($form_state['values']['dfid']);
+    drupal_set_message(t('Removed date format %format.', array('%format' => format_date(REQUEST_TIME, 'custom', $format->format))));
+    $form_state['redirect'] = 'admin/config/regional/date-time/formats';
+  }
+}
+
+/**
+ * Menu callback; present a form for deleting a date type.
+ */
+function system_delete_date_format_type_form($form, &$form_state, $format_type) {
+  $form['format_type'] = array(
+    '#type' => 'value',
+    '#value' => $format_type,
+  );
+  $type_info = system_get_date_types($format_type);
+
+  $output = confirm_form($form,
+    t('Are you sure you want to remove the date type %type?', array('%type' => $type_info['title'])),
+    'admin/config/regional/date-time',
+    t('This action cannot be undone.'),
+    t('Remove'), t('Cancel'),
+    'confirm'
+  );
+
+  return $output;
+}
+
+/**
+ * Delete a configured date type.
+ */
+function system_delete_date_format_type_form_submit($form, &$form_state) {
+  if ($form_state['values']['confirm']) {
+    $type_info = system_get_date_types($form_state['values']['format_type']);
+    system_date_format_type_delete($form_state['values']['format_type']);
+    drupal_set_message(t('Removed date type %type.', array('%type' => $type_info['title'])));
+    $form_state['redirect'] = 'admin/config/regional/date-time';
+  }
+}
+
+
+/**
+ * Displays the date format strings overview page.
+ */
+function system_date_time_formats() {
+  $header = array(t('Format'), array('data' => t('Operations'), 'colspan' => '2'));
+  $rows = array();
+
+  drupal_static_reset('system_get_date_formats');
+  $formats = system_get_date_formats('custom');
+  if (!empty($formats)) {
+    foreach ($formats as $format) {
+      $row = array();
+      $row[] = array('data' => format_date(REQUEST_TIME, 'custom', $format['format']));
+      $row[] = array('data' => l(t('edit'), 'admin/config/regional/date-time/formats/' . $format['dfid'] . '/edit'));
+      $row[] = array('data' => l(t('delete'), 'admin/config/regional/date-time/formats/' . $format['dfid'] . '/delete'));
+      $rows[] = $row;
+    }
+  }
+
+  $build['date_formats_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#empty' => t('No custom date formats available. <a href="@link">Add date format</a>.', array('@link' => url('admin/config/regional/date-time/formats/add'))),
+  );
+
+  return $build;
+}
+
+/**
+ * Allow users to add additional date formats.
+ */
+function system_configure_date_formats_form($form, &$form_state, $dfid = 0) {
+  $js_settings = array(
+    'type' => 'setting',
+    'data' => array(
+      'dateTime' => array(
+        'date-format' => array(
+          'text' => t('Displayed as'),
+          'lookup' => url('admin/config/regional/date-time/formats/lookup'),
+        ),
+      ),
+    ),
+  );
+
+  if ($dfid) {
+    $form['dfid'] = array(
+      '#type' => 'value',
+      '#value' => $dfid,
+    );
+    $format = system_get_date_format($dfid);
+  }
+
+  $now = ($dfid ? t('Displayed as %date', array('%date' => format_date(REQUEST_TIME, 'custom', $format->format))) : '');
+
+  $form['date_format'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Format string'),
+    '#maxlength' => 100,
+    '#description' => t('A user-defined date format. See the <a href="@url">PHP manual</a> for available options.', array('@url' => 'http://php.net/manual/function.date.php')),
+    '#default_value' => ($dfid ? $format->format : ''),
+    '#field_suffix' => ' <small id="edit-date-format-suffix">' . $now . '</small>',
+    '#attached' => array(
+      'js' => array(drupal_get_path('module', 'system') . '/system.js', $js_settings),
+    ),
+    '#required' => TRUE,
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['update'] = array(
+    '#type' => 'submit',
+    '#value' => ($dfid ? t('Save format') : t('Add format')),
+  );
+
+  $form['#validate'][] = 'system_add_date_formats_form_validate';
+  $form['#submit'][] = 'system_add_date_formats_form_submit';
+
+  return $form;
+}
+
+/**
+ * Validate new date format string submission.
+ */
+function system_add_date_formats_form_validate($form, &$form_state) {
+  $formats = system_get_date_formats('custom');
+  $format = trim($form_state['values']['date_format']);
+  if (!empty($formats) && in_array($format, array_keys($formats)) && (!isset($form_state['values']['dfid']) || $form_state['values']['dfid'] != $formats[$format]['dfid'])) {
+    form_set_error('date_format', t('This format already exists. Enter a unique format string.'));
+  }
+}
+
+/**
+ * Process new date format string submission.
+ */
+function system_add_date_formats_form_submit($form, &$form_state) {
+  $format = array();
+  $format['format'] = trim($form_state['values']['date_format']);
+  $format['type'] = 'custom';
+  $format['locked'] = 0;
+  if (!empty($form_state['values']['dfid'])) {
+    system_date_format_save($format, $form_state['values']['dfid']);
+    drupal_set_message(t('Custom date format updated.'));
+  }
+  else {
+    $format['is_new'] = 1;
+    system_date_format_save($format);
+    drupal_set_message(t('Custom date format added.'));
+  }
+
+  $form_state['redirect'] = 'admin/config/regional/date-time/formats';
+}
+
+/**
+ * Menu callback; Displays an overview of available and configured actions.
+ */
+function system_actions_manage() {
+  actions_synchronize();
+  $actions = actions_list();
+  $actions_map = actions_actions_map($actions);
+  $options = array();
+  $unconfigurable = array();
+
+  foreach ($actions_map as $key => $array) {
+    if ($array['configurable']) {
+      $options[$key] = $array['label'] . '...';
+    }
+    else {
+      $unconfigurable[] = $array;
+    }
+  }
+
+  $row = array();
+  $instances_present = db_query("SELECT aid FROM {actions} WHERE parameters <> ''")->fetchField();
+  $header = array(
+    array('data' => t('Action type'), 'field' => 'type'),
+    array('data' => t('Label'), 'field' => 'label'),
+    array('data' => $instances_present ? t('Operations') : '', 'colspan' => '2')
+  );
+  $query = db_select('actions')->extend('PagerDefault')->extend('TableSort');
+  $result = $query
+    ->fields('actions')
+    ->limit(50)
+    ->orderByHeader($header)
+    ->execute();
+
+  foreach ($result as $action) {
+    $row[] = array(
+      array('data' => $action->type),
+      array('data' => check_plain($action->label)),
+      array('data' => $action->parameters ? l(t('configure'), "admin/config/system/actions/configure/$action->aid") : ''),
+      array('data' => $action->parameters ? l(t('delete'), "admin/config/system/actions/delete/$action->aid") : '')
+    );
+  }
+
+  if ($row) {
+    $pager = theme('pager');
+    if (!empty($pager)) {
+      $row[] = array(array('data' => $pager, 'colspan' => '3'));
+    }
+    $build['system_actions_header'] = array('#markup' => '<h3>' . t('Available actions:') . '</h3>');
+    $build['system_actions_table'] = array('#markup' => theme('table', array('header' => $header, 'rows' => $row)));
+  }
+
+  if ($actions_map) {
+    $build['system_actions_manage_form'] = drupal_get_form('system_actions_manage_form', $options);
+  }
+
+  return $build;
+}
+
+/**
+ * Define the form for the actions overview page.
+ *
+ * @param $form_state
+ *   An associative array containing the current state of the form; not used.
+ * @param $options
+ *   An array of configurable actions.
+ * @return
+ *   Form definition.
+ *
+ * @ingroup forms
+ * @see system_actions_manage_form_submit()
+ */
+function system_actions_manage_form($form, &$form_state, $options = array()) {
+  $form['parent'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Create an advanced action'),
+    '#attributes' => array('class' => array('container-inline')),
+  );
+  $form['parent']['action'] = array(
+    '#type' => 'select',
+    '#title' => t('Action'),
+    '#title_display' => 'invisible',
+    '#options' => $options,
+    '#empty_option' => t('Choose an advanced action'),
+  );
+  $form['parent']['actions'] = array('#type' => 'actions');
+  $form['parent']['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Create'),
+  );
+  return $form;
+}
+
+/**
+ * Process system_actions_manage form submissions.
+ *
+ * @see system_actions_manage_form()
+ */
+function system_actions_manage_form_submit($form, &$form_state) {
+  if ($form_state['values']['action']) {
+    $form_state['redirect'] = 'admin/config/system/actions/configure/' . $form_state['values']['action'];
+  }
+}
+
+/**
+ * Menu callback; Creates the form for configuration of a single action.
+ *
+ * We provide the "Description" field. The rest of the form is provided by the
+ * action. We then provide the Save button. Because we are combining unknown
+ * form elements with the action configuration form, we use an 'actions_' prefix
+ * on our elements.
+ *
+ * @param $action
+ *   Hash of an action ID or an integer. If it is a hash, we are
+ *   creating a new instance. If it is an integer, we are editing an existing
+ *   instance.
+ * @return
+ *   A form definition.
+ *
+ * @see system_actions_configure_validate()
+ * @see system_actions_configure_submit()
+ */
+function system_actions_configure($form, &$form_state, $action = NULL) {
+  if ($action === NULL) {
+    drupal_goto('admin/config/system/actions');
+  }
+
+  $actions_map = actions_actions_map(actions_list());
+  $edit = array();
+
+  // Numeric action denotes saved instance of a configurable action.
+  if (is_numeric($action)) {
+    $aid = $action;
+    // Load stored parameter values from database.
+    $data = db_query("SELECT * FROM {actions} WHERE aid = :aid", array(':aid' => $aid))->fetch();
+    $edit['actions_label'] = $data->label;
+    $edit['actions_type'] = $data->type;
+    $function = $data->callback;
+    $action = drupal_hash_base64($data->callback);
+    $params = unserialize($data->parameters);
+    if ($params) {
+      foreach ($params as $name => $val) {
+        $edit[$name] = $val;
+      }
+    }
+  }
+  // Otherwise, we are creating a new action instance.
+  else {
+    $function = $actions_map[$action]['callback'];
+    $edit['actions_label'] = $actions_map[$action]['label'];
+    $edit['actions_type'] = $actions_map[$action]['type'];
+  }
+
+  $form['actions_label'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Label'),
+    '#default_value' => $edit['actions_label'],
+    '#maxlength' => '255',
+    '#description' => t('A unique label for this advanced action. This label will be displayed in the interface of modules that integrate with actions, such as Trigger module.'),
+    '#weight' => -10
+  );
+  $action_form = $function . '_form';
+  $form = array_merge($form, $action_form($edit));
+  $form['actions_type'] = array(
+    '#type' => 'value',
+    '#value' => $edit['actions_type'],
+  );
+  $form['actions_action'] = array(
+    '#type' => 'hidden',
+    '#value' => $action,
+  );
+  // $aid is set when configuring an existing action instance.
+  if (isset($aid)) {
+    $form['actions_aid'] = array(
+      '#type' => 'hidden',
+      '#value' => $aid,
+    );
+  }
+  $form['actions_configured'] = array(
+    '#type' => 'hidden',
+    '#value' => '1',
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+    '#weight' => 13
+  );
+
+  return $form;
+}
+
+/**
+ * Validate system_actions_configure() form submissions.
+ */
+function system_actions_configure_validate($form, &$form_state) {
+  $function = actions_function_lookup($form_state['values']['actions_action']) . '_validate';
+  // Hand off validation to the action.
+  if (function_exists($function)) {
+    $function($form, $form_state);
+  }
+}
+
+/**
+ * Process system_actions_configure() form submissions.
+ */
+function system_actions_configure_submit($form, &$form_state) {
+  $function = actions_function_lookup($form_state['values']['actions_action']);
+  $submit_function = $function . '_submit';
+
+  // Action will return keyed array of values to store.
+  $params = $submit_function($form, $form_state);
+  $aid = isset($form_state['values']['actions_aid']) ? $form_state['values']['actions_aid'] : NULL;
+
+  actions_save($function, $form_state['values']['actions_type'], $params, $form_state['values']['actions_label'], $aid);
+  drupal_set_message(t('The action has been successfully saved.'));
+
+  $form_state['redirect'] = 'admin/config/system/actions/manage';
+}
+
+/**
+ * Create the form for confirmation of deleting an action.
+ *
+ * @see system_actions_delete_form_submit()
+ * @ingroup forms
+ */
+function system_actions_delete_form($form, &$form_state, $action) {
+  $form['aid'] = array(
+    '#type' => 'hidden',
+    '#value' => $action->aid,
+  );
+  return confirm_form($form,
+    t('Are you sure you want to delete the action %action?', array('%action' => $action->label)),
+    'admin/config/system/actions/manage',
+    t('This cannot be undone.'),
+    t('Delete'),
+    t('Cancel')
+  );
+}
+
+/**
+ * Process system_actions_delete form submissions.
+ *
+ * Post-deletion operations for action deletion.
+ */
+function system_actions_delete_form_submit($form, &$form_state) {
+  $aid = $form_state['values']['aid'];
+  $action = actions_load($aid);
+  actions_delete($aid);
+  watchdog('user', 'Deleted action %aid (%action)', array('%aid' => $aid, '%action' => $action->label));
+  drupal_set_message(t('Action %action was deleted', array('%action' => $action->label)));
+  $form_state['redirect'] = 'admin/config/system/actions/manage';
+}
+
+/**
+ * Post-deletion operations for deleting action orphans.
+ *
+ * @param $orphaned
+ *   An array of orphaned actions.
+ */
+function system_action_delete_orphans_post($orphaned) {
+  foreach ($orphaned as $callback) {
+    drupal_set_message(t("Deleted orphaned action (%action).", array('%action' => $callback)));
+  }
+}
+
+/**
+ * Remove actions that are in the database but not supported by any enabled module.
+ */
+function system_actions_remove_orphans() {
+  actions_synchronize(TRUE);
+  drupal_goto('admin/config/system/actions/manage');
+}
diff --git a/htmltest/modules/system/system.api.php b/htmltest/modules/system/system.api.php
new file mode 100644
index 00000000..f54078b6
--- /dev/null
+++ b/htmltest/modules/system/system.api.php
@@ -0,0 +1,4899 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by Drupal core and the System module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Defines one or more hooks that are exposed by a module.
+ *
+ * Normally hooks do not need to be explicitly defined. However, by declaring a
+ * hook explicitly, a module may define a "group" for it. Modules that implement
+ * a hook may then place their implementation in either $module.module or in
+ * $module.$group.inc. If the hook is located in $module.$group.inc, then that
+ * file will be automatically loaded when needed.
+ * In general, hooks that are rarely invoked and/or are very large should be
+ * placed in a separate include file, while hooks that are very short or very
+ * frequently called should be left in the main module file so that they are
+ * always available.
+ *
+ * @return
+ *   An associative array whose keys are hook names and whose values are an
+ *   associative array containing:
+ *   - group: A string defining the group to which the hook belongs. The module
+ *     system will determine whether a file with the name $module.$group.inc
+ *     exists, and automatically load it when required.
+ *
+ * See system_hook_info() for all hook groups defined by Drupal core.
+ *
+ * @see hook_hook_info_alter().
+ */
+function hook_hook_info() {
+  $hooks['token_info'] = array(
+    'group' => 'tokens',
+  );
+  $hooks['tokens'] = array(
+    'group' => 'tokens',
+  );
+  return $hooks;
+}
+
+/**
+ * Alter information from hook_hook_info().
+ *
+ * @param $hooks
+ *   Information gathered by module_hook_info() from other modules'
+ *   implementations of hook_hook_info(). Alter this array directly.
+ *   See hook_hook_info() for information on what this may contain.
+ */
+function hook_hook_info_alter(&$hooks) {
+  // Our module wants to completely override the core tokens, so make
+  // sure the core token hooks are not found.
+  $hooks['token_info']['group'] = 'mytokens';
+  $hooks['tokens']['group'] = 'mytokens';
+}
+
+/**
+ * Inform the base system and the Field API about one or more entity types.
+ *
+ * Inform the system about one or more entity types (i.e., object types that
+ * can be loaded via entity_load() and, optionally, to which fields can be
+ * attached).
+ *
+ * @return
+ *   An array whose keys are entity type names and whose values identify
+ *   properties of those types that the system needs to know about:
+ *   - label: The human-readable name of the type.
+ *   - controller class: The name of the class that is used to load the objects.
+ *     The class has to implement the DrupalEntityControllerInterface interface.
+ *     Leave blank to use the DrupalDefaultEntityController implementation.
+ *   - base table: (used by DrupalDefaultEntityController) The name of the
+ *     entity type's base table.
+ *   - revision table: The name of the entity type's revision table (if any).
+ *   - static cache: (used by DrupalDefaultEntityController) FALSE to disable
+ *     static caching of entities during a page request. Defaults to TRUE.
+ *   - field cache: (used by Field API loading and saving of field data) FALSE
+ *     to disable Field API's persistent cache of field data. Only recommended
+ *     if a higher level persistent cache is available for the entity type.
+ *     Defaults to TRUE.
+ *   - load hook: The name of the hook which should be invoked by
+ *     DrupalDefaultEntityController:attachLoad(), for example 'node_load'.
+ *   - uri callback: The name of an implementation of
+ *     callback_entity_info_uri().
+ *   - label callback: (optional) The name of an implementation of
+ *     callback_entity_info_label(), which returns the label of the entity. The
+ *     entity label is the main string associated with an entity; for example,
+ *     the title of a node or the subject of a comment. If there is an entity
+ *     object property that defines the label, then using the 'label' element of
+ *     the 'entity keys' return value component suffices to provide this
+ *     information (see below). Alternatively, specifying this callback allows
+ *     more complex logic to determine the label of an entity. See also the
+ *     entity_label() function, which implements this logic.
+ *   - language callback: (optional) The name of an implementation of
+ *     callback_entity_info_language(). In most situations, when needing to
+ *     determine this value, inspecting a property named after the 'language'
+ *     element of the 'entity keys' should be enough. The language callback is
+ *     meant to be used primarily for temporary alterations of the property
+ *     value: entity-defining modules are encouraged to always define a
+ *     language property, instead of using the callback as main entity language
+ *     source. In fact not having a language property defined is likely to
+ *     prevent an entity from being queried by language. Moreover, given that
+ *     entity_language() is not necessarily used everywhere it would be
+ *     appropriate, modules implementing the language callback should be aware
+ *     that this might not be always called.
+ *   - fieldable: Set to TRUE if you want your entity type to accept fields
+ *     being attached to it.
+ *   - translation: An associative array of modules registered as field
+ *     translation handlers. Array keys are the module names, array values
+ *     can be any data structure the module uses to provide field translation.
+ *     Any empty value disallows the module to appear as a translation handler.
+ *   - entity keys: An array describing how the Field API can extract the
+ *     information it needs from the objects of the type. Elements:
+ *     - id: The name of the property that contains the primary id of the
+ *       entity. Every entity object passed to the Field API must have this
+ *       property and its value must be numeric.
+ *     - revision: The name of the property that contains the revision id of
+ *       the entity. The Field API assumes that all revision ids are unique
+ *       across all entities of a type. This entry can be omitted if the
+ *       entities of this type are not versionable.
+ *     - bundle: The name of the property that contains the bundle name for the
+ *       entity. The bundle name defines which set of fields are attached to
+ *       the entity (e.g. what nodes call "content type"). This entry can be
+ *       omitted if this entity type exposes a single bundle (all entities have
+ *       the same collection of fields). The name of this single bundle will be
+ *       the same as the entity type.
+ *     - label: The name of the property that contains the entity label. For
+ *       example, if the entity's label is located in $entity->subject, then
+ *       'subject' should be specified here. If complex logic is required to
+ *       build the label, a 'label callback' should be defined instead (see
+ *       the 'label callback' section above for details).
+ *     - language: The name of the property, typically 'language', that contains
+ *       the language code representing the language the entity has been created
+ *       in. This value may be changed when editing the entity and represents
+ *       the language its textual components are supposed to have. If no
+ *       language property is available, the 'language callback' may be used
+ *       instead. This entry can be omitted if the entities of this type are not
+ *       language-aware.
+ *   - bundle keys: An array describing how the Field API can extract the
+ *     information it needs from the bundle objects for this type. This entry
+ *     is required if the 'path' provided in the 'bundles'/'admin' section
+ *     identifies the bundle using a named menu placeholder whose loader
+ *     callback returns an object (e.g., $vocabulary for taxonomy terms, or
+ *     $node_type for nodes). If the path does not include the bundle, or the
+ *     bundle is just a string rather than an automatically loaded object, then
+ *     this can be omitted. Elements:
+ *     - bundle: The name of the property of the bundle object that contains
+ *       the name of the bundle object.
+ *   - bundles: An array describing all bundles for this object type. Keys are
+ *     bundles machine names, as found in the objects' 'bundle' property
+ *     (defined in the 'entity keys' entry above). This entry can be omitted if
+ *     this entity type exposes a single bundle (all entities have the same
+ *     collection of fields). The name of this single bundle will be the same as
+ *     the entity type. Elements:
+ *     - label: The human-readable name of the bundle.
+ *     - uri callback: Same as the 'uri callback' key documented above for the
+ *       entity type, but for the bundle only. When determining the URI of an
+ *       entity, if a 'uri callback' is defined for both the entity type and
+ *       the bundle, the one for the bundle is used.
+ *     - admin: An array of information that allows Field UI pages to attach
+ *       themselves to the existing administration pages for the bundle.
+ *       Elements:
+ *       - path: the path of the bundle's main administration page, as defined
+ *         in hook_menu(). If the path includes a placeholder for the bundle,
+ *         the 'bundle argument' and 'real path' keys below are required.
+ *       - bundle argument: The position of the bundle placeholder in 'path', if
+ *         any.
+ *       - real path: The actual path (no placeholder) of the bundle's main
+ *         administration page. This will be used to generate links.
+ *       - access callback: As in hook_menu(). 'user_access' will be assumed if
+ *         no value is provided.
+ *       - access arguments: As in hook_menu().
+ *   - view modes: An array describing the view modes for the entity type. View
+ *     modes let entities be displayed differently depending on the context.
+ *     For instance, a node can be displayed differently on its own page
+ *     ('full' mode), on the home page or taxonomy listings ('teaser' mode), or
+ *     in an RSS feed ('rss' mode). Modules taking part in the display of the
+ *     entity (notably the Field API) can adjust their behavior depending on
+ *     the requested view mode. An additional 'default' view mode is available
+ *     for all entity types. This view mode is not intended for actual entity
+ *     display, but holds default display settings. For each available view
+ *     mode, administrators can configure whether it should use its own set of
+ *     field display settings, or just replicate the settings of the 'default'
+ *     view mode, thus reducing the amount of display configurations to keep
+ *     track of. Keys of the array are view mode names. Each view mode is
+ *     described by an array with the following key/value pairs:
+ *     - label: The human-readable name of the view mode
+ *     - custom settings: A boolean specifying whether the view mode should by
+ *       default use its own custom field display settings. If FALSE, entities
+ *       displayed in this view mode will reuse the 'default' display settings
+ *       by default (e.g. right after the module exposing the view mode is
+ *       enabled), but administrators can later use the Field UI to apply custom
+ *       display settings specific to the view mode.
+ *
+ * @see entity_load()
+ * @see hook_entity_info_alter()
+ */
+function hook_entity_info() {
+  $return = array(
+    'node' => array(
+      'label' => t('Node'),
+      'controller class' => 'NodeController',
+      'base table' => 'node',
+      'revision table' => 'node_revision',
+      'uri callback' => 'node_uri',
+      'fieldable' => TRUE,
+      'translation' => array(
+        'locale' => TRUE,
+      ),
+      'entity keys' => array(
+        'id' => 'nid',
+        'revision' => 'vid',
+        'bundle' => 'type',
+        'language' => 'language',
+      ),
+      'bundle keys' => array(
+        'bundle' => 'type',
+      ),
+      'bundles' => array(),
+      'view modes' => array(
+        'full' => array(
+          'label' => t('Full content'),
+          'custom settings' => FALSE,
+        ),
+        'teaser' => array(
+          'label' => t('Teaser'),
+          'custom settings' => TRUE,
+        ),
+        'rss' => array(
+          'label' => t('RSS'),
+          'custom settings' => FALSE,
+        ),
+      ),
+    ),
+  );
+
+  // Search integration is provided by node.module, so search-related
+  // view modes for nodes are defined here and not in search.module.
+  if (module_exists('search')) {
+    $return['node']['view modes'] += array(
+      'search_index' => array(
+        'label' => t('Search index'),
+        'custom settings' => FALSE,
+      ),
+      'search_result' => array(
+        'label' => t('Search result'),
+        'custom settings' => FALSE,
+      ),
+    );
+  }
+
+  // Bundles must provide a human readable name so we can create help and error
+  // messages, and the path to attach Field admin pages to.
+  foreach (node_type_get_names() as $type => $name) {
+    $return['node']['bundles'][$type] = array(
+      'label' => $name,
+      'admin' => array(
+        'path' => 'admin/structure/types/manage/%node_type',
+        'real path' => 'admin/structure/types/manage/' . str_replace('_', '-', $type),
+        'bundle argument' => 4,
+        'access arguments' => array('administer content types'),
+      ),
+    );
+  }
+
+  return $return;
+}
+
+/**
+ * Alter the entity info.
+ *
+ * Modules may implement this hook to alter the information that defines an
+ * entity. All properties that are available in hook_entity_info() can be
+ * altered here.
+ *
+ * @param $entity_info
+ *   The entity info array, keyed by entity name.
+ *
+ * @see hook_entity_info()
+ */
+function hook_entity_info_alter(&$entity_info) {
+  // Set the controller class for nodes to an alternate implementation of the
+  // DrupalEntityController interface.
+  $entity_info['node']['controller class'] = 'MyCustomNodeController';
+}
+
+/**
+ * Act on entities when loaded.
+ *
+ * This is a generic load hook called for all entity types loaded via the
+ * entity API.
+ *
+ * @param $entities
+ *   The entities keyed by entity ID.
+ * @param $type
+ *   The type of entities being loaded (i.e. node, user, comment).
+ */
+function hook_entity_load($entities, $type) {
+  foreach ($entities as $entity) {
+    $entity->foo = mymodule_add_something($entity, $type);
+  }
+}
+
+/**
+ * Act on an entity before it is about to be created or updated.
+ *
+ * @param $entity
+ *   The entity object.
+ * @param $type
+ *   The type of entity being saved (i.e. node, user, comment).
+ */
+function hook_entity_presave($entity, $type) {
+  $entity->changed = REQUEST_TIME;
+}
+
+/**
+ * Act on entities when inserted.
+ *
+ * @param $entity
+ *   The entity object.
+ * @param $type
+ *   The type of entity being inserted (i.e. node, user, comment).
+ */
+function hook_entity_insert($entity, $type) {
+  // Insert the new entity into a fictional table of all entities.
+  $info = entity_get_info($type);
+  list($id) = entity_extract_ids($type, $entity);
+  db_insert('example_entity')
+    ->fields(array(
+      'type' => $type,
+      'id' => $id,
+      'created' => REQUEST_TIME,
+      'updated' => REQUEST_TIME,
+    ))
+    ->execute();
+}
+
+/**
+ * Act on entities when updated.
+ *
+ * @param $entity
+ *   The entity object.
+ * @param $type
+ *   The type of entity being updated (i.e. node, user, comment).
+ */
+function hook_entity_update($entity, $type) {
+  // Update the entity's entry in a fictional table of all entities.
+  $info = entity_get_info($type);
+  list($id) = entity_extract_ids($type, $entity);
+  db_update('example_entity')
+    ->fields(array(
+      'updated' => REQUEST_TIME,
+    ))
+    ->condition('type', $type)
+    ->condition('id', $id)
+    ->execute();
+}
+
+/**
+ * Act on entities when deleted.
+ *
+ * @param $entity
+ *   The entity object.
+ * @param $type
+ *   The type of entity being deleted (i.e. node, user, comment).
+ */
+function hook_entity_delete($entity, $type) {
+  // Delete the entity's entry from a fictional table of all entities.
+  $info = entity_get_info($type);
+  list($id) = entity_extract_ids($type, $entity);
+  db_delete('example_entity')
+    ->condition('type', $type)
+    ->condition('id', $id)
+    ->execute();
+}
+
+/**
+ * Alter or execute an EntityFieldQuery.
+ *
+ * @param EntityFieldQuery $query
+ *   An EntityFieldQuery. One of the most important properties to be changed is
+ *   EntityFieldQuery::executeCallback. If this is set to an existing function,
+ *   this function will get the query as its single argument and its result
+ *   will be the returned as the result of EntityFieldQuery::execute(). This can
+ *   be used to change the behavior of EntityFieldQuery entirely. For example,
+ *   the default implementation can only deal with one field storage engine, but
+ *   it is possible to write a module that can query across field storage
+ *   engines. Also, the default implementation presumes entities are stored in
+ *   SQL, but the execute callback could instead query any other entity storage,
+ *   local or remote.
+ *
+ *   Note the $query->altered attribute which is TRUE in case the query has
+ *   already been altered once. This happens with cloned queries.
+ *   If there is a pager, then such a cloned query will be executed to count
+ *   all elements. This query can be detected by checking for
+ *   ($query->pager && $query->count), allowing the driver to return 0 from
+ *   the count query and disable the pager.
+ */
+function hook_entity_query_alter($query) {
+  $query->executeCallback = 'my_module_query_callback';
+}
+
+/**
+ * Act on entities being assembled before rendering.
+ *
+ * @param $entity
+ *   The entity object.
+ * @param $type
+ *   The type of entity being rendered (i.e. node, user, comment).
+ * @param $view_mode
+ *   The view mode the entity is rendered in.
+ * @param $langcode
+ *   The language code used for rendering.
+ *
+ * The module may add elements to $entity->content prior to rendering. The
+ * structure of $entity->content is a renderable array as expected by
+ * drupal_render().
+ *
+ * @see hook_entity_view_alter()
+ * @see hook_comment_view()
+ * @see hook_node_view()
+ * @see hook_user_view()
+ */
+function hook_entity_view($entity, $type, $view_mode, $langcode) {
+  $entity->content['my_additional_field'] = array(
+    '#markup' => $additional_field,
+    '#weight' => 10,
+    '#theme' => 'mymodule_my_additional_field',
+  );
+}
+
+/**
+ * Alter the results of ENTITY_view().
+ *
+ * This hook is called after the content has been assembled in a structured
+ * array and may be used for doing processing which requires that the complete
+ * entity content structure has been built.
+ *
+ * If a module wishes to act on the rendered HTML of the entity rather than the
+ * structured content array, it may use this hook to add a #post_render
+ * callback. Alternatively, it could also implement hook_preprocess_ENTITY().
+ * See drupal_render() and theme() for details.
+ *
+ * @param $build
+ *   A renderable array representing the entity content.
+ * @param $type
+ *   The type of entity being rendered (i.e. node, user, comment).
+ *
+ * @see hook_entity_view()
+ * @see hook_comment_view_alter()
+ * @see hook_node_view_alter()
+ * @see hook_taxonomy_term_view_alter()
+ * @see hook_user_view_alter()
+ */
+function hook_entity_view_alter(&$build, $type) {
+  if ($build['#view_mode'] == 'full' && isset($build['an_additional_field'])) {
+    // Change its weight.
+    $build['an_additional_field']['#weight'] = -10;
+
+    // Add a #post_render callback to act on the rendered HTML of the entity.
+    $build['#post_render'][] = 'my_module_node_post_render';
+  }
+}
+
+/**
+ * Change the view mode of an entity that is being displayed.
+ *
+ * @param string $view_mode
+ *   The view_mode that is to be used to display the entity.
+ * @param array $context
+ *   Array with contextual information, including:
+ *   - entity_type: The type of the entity that is being viewed.
+ *   - entity: The entity object.
+ *   - langcode: The langcode the entity is being viewed in.
+ */
+function hook_entity_view_mode_alter(&$view_mode, $context) {
+  // For nodes, change the view mode when it is teaser.
+  if ($context['entity_type'] == 'node' && $view_mode == 'teaser') {
+    $view_mode = 'my_custom_view_mode';
+  }
+}
+
+/**
+ * Define administrative paths.
+ *
+ * Modules may specify whether or not the paths they define in hook_menu() are
+ * to be considered administrative. Other modules may use this information to
+ * display those pages differently (e.g. in a modal overlay, or in a different
+ * theme).
+ *
+ * To change the administrative status of menu items defined in another module's
+ * hook_menu(), modules should implement hook_admin_paths_alter().
+ *
+ * @return
+ *   An associative array. For each item, the key is the path in question, in
+ *   a format acceptable to drupal_match_path(). The value for each item should
+ *   be TRUE (for paths considered administrative) or FALSE (for non-
+ *   administrative paths).
+ *
+ * @see hook_menu()
+ * @see drupal_match_path()
+ * @see hook_admin_paths_alter()
+ */
+function hook_admin_paths() {
+  $paths = array(
+    'mymodule/*/add' => TRUE,
+    'mymodule/*/edit' => TRUE,
+  );
+  return $paths;
+}
+
+/**
+ * Redefine administrative paths defined by other modules.
+ *
+ * @param $paths
+ *   An associative array of administrative paths, as defined by implementations
+ *   of hook_admin_paths().
+ *
+ * @see hook_admin_paths()
+ */
+function hook_admin_paths_alter(&$paths) {
+  // Treat all user pages as administrative.
+  $paths['user'] = TRUE;
+  $paths['user/*'] = TRUE;
+  // Treat the forum topic node form as a non-administrative page.
+  $paths['node/add/forum'] = FALSE;
+}
+
+/**
+ * Act on entities as they are being prepared for view.
+ *
+ * Allows you to operate on multiple entities as they are being prepared for
+ * view. Only use this if attaching the data during the entity_load() phase
+ * is not appropriate, for example when attaching other 'entity' style objects.
+ *
+ * @param $entities
+ *   The entities keyed by entity ID.
+ * @param $type
+ *   The type of entities being loaded (i.e. node, user, comment).
+ * @param $langcode
+ *   The language to display the entity in.
+ */
+function hook_entity_prepare_view($entities, $type, $langcode) {
+  // Load a specific node into the user object for later theming.
+  if ($type == 'user') {
+    $nodes = mymodule_get_user_nodes(array_keys($entities));
+    foreach ($entities as $uid => $entity) {
+      $entity->user_node = $nodes[$uid];
+    }
+  }
+}
+
+/**
+ * Perform periodic actions.
+ *
+ * Modules that require some commands to be executed periodically can
+ * implement hook_cron(). The engine will then call the hook whenever a cron
+ * run happens, as defined by the administrator. Typical tasks managed by
+ * hook_cron() are database maintenance, backups, recalculation of settings
+ * or parameters, automated mailing, and retrieving remote data.
+ *
+ * Short-running or non-resource-intensive tasks can be executed directly in
+ * the hook_cron() implementation.
+ *
+ * Long-running tasks and tasks that could time out, such as retrieving remote
+ * data, sending email, and intensive file tasks, should use the queue API
+ * instead of executing the tasks directly. To do this, first define one or
+ * more queues via hook_cron_queue_info(). Then, add items that need to be
+ * processed to the defined queues.
+ */
+function hook_cron() {
+  // Short-running operation example, not using a queue:
+  // Delete all expired records since the last cron run.
+  $expires = variable_get('mymodule_cron_last_run', REQUEST_TIME);
+  db_delete('mymodule_table')
+    ->condition('expires', $expires, '>=')
+    ->execute();
+  variable_set('mymodule_cron_last_run', REQUEST_TIME);
+
+  // Long-running operation example, leveraging a queue:
+  // Fetch feeds from other sites.
+  $result = db_query('SELECT * FROM {aggregator_feed} WHERE checked + refresh < :time AND refresh <> :never', array(
+    ':time' => REQUEST_TIME,
+    ':never' => AGGREGATOR_CLEAR_NEVER,
+  ));
+  $queue = DrupalQueue::get('aggregator_feeds');
+  foreach ($result as $feed) {
+    $queue->createItem($feed);
+  }
+}
+
+/**
+ * Declare queues holding items that need to be run periodically.
+ *
+ * While there can be only one hook_cron() process running at the same time,
+ * there can be any number of processes defined here running. Because of
+ * this, long running tasks are much better suited for this API. Items queued
+ * in hook_cron() might be processed in the same cron run if there are not many
+ * items in the queue, otherwise it might take several requests, which can be
+ * run in parallel.
+ *
+ * @return
+ *   An associative array where the key is the queue name and the value is
+ *   again an associative array. Possible keys are:
+ *   - 'worker callback': The name of the function to call. It will be called
+ *     with one argument, the item created via DrupalQueue::createItem().
+ *   - 'time': (optional) How much time Drupal should spend on calling this
+ *     worker in seconds. Defaults to 15.
+ *   - 'skip on cron': (optional) Set to TRUE to avoid being processed during
+ *     cron runs (for example, if you want to control all queue execution
+ *     manually).
+ *
+ * @see hook_cron()
+ * @see hook_cron_queue_info_alter()
+ */
+function hook_cron_queue_info() {
+  $queues['aggregator_feeds'] = array(
+    'worker callback' => 'aggregator_refresh',
+    'time' => 60,
+  );
+  return $queues;
+}
+
+/**
+ * Alter cron queue information before cron runs.
+ *
+ * Called by drupal_cron_run() to allow modules to alter cron queue settings
+ * before any jobs are processesed.
+ *
+ * @param array $queues
+ *   An array of cron queue information.
+ *
+ * @see hook_cron_queue_info()
+ * @see drupal_cron_run()
+ */
+function hook_cron_queue_info_alter(&$queues) {
+  // This site has many feeds so let's spend 90 seconds on each cron run
+  // updating feeds instead of the default 60.
+  $queues['aggregator_feeds']['time'] = 90;
+}
+
+/**
+ * Allows modules to declare their own Form API element types and specify their
+ * default values.
+ *
+ * This hook allows modules to declare their own form element types and to
+ * specify their default values. The values returned by this hook will be
+ * merged with the elements returned by hook_form() implementations and so
+ * can return defaults for any Form APIs keys in addition to those explicitly
+ * mentioned below.
+ *
+ * Each of the form element types defined by this hook is assumed to have
+ * a matching theme function, e.g. theme_elementtype(), which should be
+ * registered with hook_theme() as normal.
+ *
+ * For more information about custom element types see the explanation at
+ * http://drupal.org/node/169815.
+ *
+ * @return
+ *  An associative array describing the element types being defined. The array
+ *  contains a sub-array for each element type, with the machine-readable type
+ *  name as the key. Each sub-array has a number of possible attributes:
+ *  - "#input": boolean indicating whether or not this element carries a value
+ *    (even if it's hidden).
+ *  - "#process": array of callback functions taking $element, $form_state,
+ *    and $complete_form.
+ *  - "#after_build": array of callback functions taking $element and $form_state.
+ *  - "#validate": array of callback functions taking $form and $form_state.
+ *  - "#element_validate": array of callback functions taking $element and
+ *    $form_state.
+ *  - "#pre_render": array of callback functions taking $element and $form_state.
+ *  - "#post_render": array of callback functions taking $element and $form_state.
+ *  - "#submit": array of callback functions taking $form and $form_state.
+ *  - "#title_display": optional string indicating if and how #title should be
+ *    displayed, see theme_form_element() and theme_form_element_label().
+ *
+ * @see hook_element_info_alter()
+ * @see system_element_info()
+ */
+function hook_element_info() {
+  $types['filter_format'] = array(
+    '#input' => TRUE,
+  );
+  return $types;
+}
+
+/**
+ * Alter the element type information returned from modules.
+ *
+ * A module may implement this hook in order to alter the element type defaults
+ * defined by a module.
+ *
+ * @param $type
+ *   All element type defaults as collected by hook_element_info().
+ *
+ * @see hook_element_info()
+ */
+function hook_element_info_alter(&$type) {
+  // Decrease the default size of textfields.
+  if (isset($type['textfield']['#size'])) {
+    $type['textfield']['#size'] = 40;
+  }
+}
+
+/**
+ * Perform cleanup tasks.
+ *
+ * This hook is run at the end of most regular page requests. It is often
+ * used for page logging and specialized cleanup. This hook MUST NOT print
+ * anything because by the time it runs the response is already sent to
+ * the browser.
+ *
+ * Only use this hook if your code must run even for cached page views.
+ * If you have code which must run once on all non-cached pages, use
+ * hook_init() instead. That is the usual case. If you implement this hook
+ * and see an error like 'Call to undefined function', it is likely that
+ * you are depending on the presence of a module which has not been loaded yet.
+ * It is not loaded because Drupal is still in bootstrap mode.
+ *
+ * @param $destination
+ *   If this hook is invoked as part of a drupal_goto() call, then this argument
+ *   will be a fully-qualified URL that is the destination of the redirect.
+ */
+function hook_exit($destination = NULL) {
+  db_update('counter')
+    ->expression('hits', 'hits + 1')
+    ->condition('type', 1)
+    ->execute();
+}
+
+/**
+ * Perform necessary alterations to the JavaScript before it is presented on
+ * the page.
+ *
+ * @param $javascript
+ *   An array of all JavaScript being presented on the page.
+ *
+ * @see drupal_add_js()
+ * @see drupal_get_js()
+ * @see drupal_js_defaults()
+ */
+function hook_js_alter(&$javascript) {
+  // Swap out jQuery to use an updated version of the library.
+  $javascript['misc/jquery.js']['data'] = drupal_get_path('module', 'jquery_update') . '/jquery.js';
+}
+
+/**
+ * Registers JavaScript/CSS libraries associated with a module.
+ *
+ * Modules implementing this return an array of arrays. The key to each
+ * sub-array is the machine readable name of the library. Each library may
+ * contain the following items:
+ *
+ * - 'title': The human readable name of the library.
+ * - 'website': The URL of the library's web site.
+ * - 'version': A string specifying the version of the library; intentionally
+ *   not a float because a version like "1.2.3" is not a valid float. Use PHP's
+ *   version_compare() to compare different versions.
+ * - 'js': An array of JavaScript elements; each element's key is used as $data
+ *   argument, each element's value is used as $options array for
+ *   drupal_add_js(). To add library-specific (not module-specific) JavaScript
+ *   settings, the key may be skipped, the value must specify
+ *   'type' => 'setting', and the actual settings must be contained in a 'data'
+ *   element of the value.
+ * - 'css': Like 'js', an array of CSS elements passed to drupal_add_css().
+ * - 'dependencies': An array of libraries that are required for a library. Each
+ *   element is an array listing the module and name of another library. Note
+ *   that all dependencies for each dependent library will also be added when
+ *   this library is added.
+ *
+ * Registered information for a library should contain re-usable data only.
+ * Module- or implementation-specific data and integration logic should be added
+ * separately.
+ *
+ * @return
+ *   An array defining libraries associated with a module.
+ *
+ * @see system_library()
+ * @see drupal_add_library()
+ * @see drupal_get_library()
+ */
+function hook_library() {
+  // Library One.
+  $libraries['library-1'] = array(
+    'title' => 'Library One',
+    'website' => 'http://example.com/library-1',
+    'version' => '1.2',
+    'js' => array(
+      drupal_get_path('module', 'my_module') . '/library-1.js' => array(),
+    ),
+    'css' => array(
+      drupal_get_path('module', 'my_module') . '/library-2.css' => array(
+        'type' => 'file',
+        'media' => 'screen',
+      ),
+    ),
+  );
+  // Library Two.
+  $libraries['library-2'] = array(
+    'title' => 'Library Two',
+    'website' => 'http://example.com/library-2',
+    'version' => '3.1-beta1',
+    'js' => array(
+      // JavaScript settings may use the 'data' key.
+      array(
+        'type' => 'setting',
+        'data' => array('library2' => TRUE),
+      ),
+    ),
+    'dependencies' => array(
+      // Require jQuery UI core by System module.
+      array('system', 'ui'),
+      // Require our other library.
+      array('my_module', 'library-1'),
+      // Require another library.
+      array('other_module', 'library-3'),
+    ),
+  );
+  return $libraries;
+}
+
+/**
+ * Alters the JavaScript/CSS library registry.
+ *
+ * Allows certain, contributed modules to update libraries to newer versions
+ * while ensuring backwards compatibility. In general, such manipulations should
+ * only be done by designated modules, since most modules that integrate with a
+ * certain library also depend on the API of a certain library version.
+ *
+ * @param $libraries
+ *   The JavaScript/CSS libraries provided by $module. Keyed by internal library
+ *   name and passed by reference.
+ * @param $module
+ *   The name of the module that registered the libraries.
+ *
+ * @see hook_library()
+ */
+function hook_library_alter(&$libraries, $module) {
+  // Update Farbtastic to version 2.0.
+  if ($module == 'system' && isset($libraries['farbtastic'])) {
+    // Verify existing version is older than the one we are updating to.
+    if (version_compare($libraries['farbtastic']['version'], '2.0', '<')) {
+      // Update the existing Farbtastic to version 2.0.
+      $libraries['farbtastic']['version'] = '2.0';
+      $libraries['farbtastic']['js'] = array(
+        drupal_get_path('module', 'farbtastic_update') . '/farbtastic-2.0.js' => array(),
+      );
+    }
+  }
+}
+
+/**
+ * Alter CSS files before they are output on the page.
+ *
+ * @param $css
+ *   An array of all CSS items (files and inline CSS) being requested on the page.
+ *
+ * @see drupal_add_css()
+ * @see drupal_get_css()
+ */
+function hook_css_alter(&$css) {
+  // Remove defaults.css file.
+  unset($css[drupal_get_path('module', 'system') . '/defaults.css']);
+}
+
+/**
+ * Alter the commands that are sent to the user through the Ajax framework.
+ *
+ * @param $commands
+ *   An array of all commands that will be sent to the user.
+ *
+ * @see ajax_render()
+ */
+function hook_ajax_render_alter($commands) {
+  // Inject any new status messages into the content area.
+  $commands[] = ajax_command_prepend('#block-system-main .content', theme('status_messages'));
+}
+
+/**
+ * Add elements to a page before it is rendered.
+ *
+ * Use this hook when you want to add elements at the page level. For your
+ * additions to be printed, they have to be placed below a top level array key
+ * of the $page array that has the name of a region of the active theme.
+ *
+ * By default, valid region keys are 'page_top', 'header', 'sidebar_first',
+ * 'content', 'sidebar_second' and 'page_bottom'. To get a list of all regions
+ * of the active theme, use system_region_list($theme). Note that $theme is a
+ * global variable.
+ *
+ * If you want to alter the elements added by other modules or if your module
+ * depends on the elements of other modules, use hook_page_alter() instead which
+ * runs after this hook.
+ *
+ * @param $page
+ *   Nested array of renderable elements that make up the page.
+ *
+ * @see hook_page_alter()
+ * @see drupal_render_page()
+ */
+function hook_page_build(&$page) {
+  if (menu_get_object('node', 1)) {
+    // We are on a node detail page. Append a standard disclaimer to the
+    // content region.
+    $page['content']['disclaimer'] = array(
+      '#markup' => t('Acme, Inc. is not responsible for the contents of this sample code.'),
+      '#weight' => 25,
+    );
+  }
+}
+
+/**
+ * Alter a menu router item right after it has been retrieved from the database or cache.
+ *
+ * This hook is invoked by menu_get_item() and allows for run-time alteration of router
+ * information (page_callback, title, and so on) before it is translated and checked for
+ * access. The passed-in $router_item is statically cached for the current request, so this
+ * hook is only invoked once for any router item that is retrieved via menu_get_item().
+ *
+ * Usually, modules will only want to inspect the router item and conditionally
+ * perform other actions (such as preparing a state for the current request).
+ * Note that this hook is invoked for any router item that is retrieved by
+ * menu_get_item(), which may or may not be called on the path itself, so implementations
+ * should check the $path parameter if the alteration should fire for the current request
+ * only.
+ *
+ * @param $router_item
+ *   The menu router item for $path.
+ * @param $path
+ *   The originally passed path, for which $router_item is responsible.
+ * @param $original_map
+ *   The path argument map, as contained in $path.
+ *
+ * @see menu_get_item()
+ */
+function hook_menu_get_item_alter(&$router_item, $path, $original_map) {
+  // When retrieving the router item for the current path...
+  if ($path == $_GET['q']) {
+    // ...call a function that prepares something for this request.
+    mymodule_prepare_something();
+  }
+}
+
+/**
+ * Define menu items and page callbacks.
+ *
+ * This hook enables modules to register paths in order to define how URL
+ * requests are handled. Paths may be registered for URL handling only, or they
+ * can register a link to be placed in a menu (usually the Navigation menu). A
+ * path and its associated information is commonly called a "menu router item".
+ * This hook is rarely called (for example, when modules are enabled), and
+ * its results are cached in the database.
+ *
+ * hook_menu() implementations return an associative array whose keys define
+ * paths and whose values are an associative array of properties for each
+ * path. (The complete list of properties is in the return value section below.)
+ *
+ * @section sec_callback_funcs Callback Functions
+ * The definition for each path may include a page callback function, which is
+ * invoked when the registered path is requested. If there is no other
+ * registered path that fits the requested path better, any further path
+ * components are passed to the callback function. For example, your module
+ * could register path 'abc/def':
+ * @code
+ *   function mymodule_menu() {
+ *     $items['abc/def'] = array(
+ *       'page callback' => 'mymodule_abc_view',
+ *     );
+ *     return $items;
+ *   }
+ *
+ *   function mymodule_abc_view($ghi = 0, $jkl = '') {
+ *     // ...
+ *   }
+ * @endcode
+ * When path 'abc/def' is requested, no further path components are in the
+ * request, and no additional arguments are passed to the callback function (so
+ * $ghi and $jkl would take the default values as defined in the function
+ * signature). When 'abc/def/123/foo' is requested, $ghi will be '123' and
+ * $jkl will be 'foo'. Note that this automatic passing of optional path
+ * arguments applies only to page and theme callback functions.
+ *
+ * @subsection sub_callback_arguments Callback Arguments
+ * In addition to optional path arguments, the page callback and other callback
+ * functions may specify argument lists as arrays. These argument lists may
+ * contain both fixed/hard-coded argument values and integers that correspond
+ * to path components. When integers are used and the callback function is
+ * called, the corresponding path components will be substituted for the
+ * integers. That is, the integer 0 in an argument list will be replaced with
+ * the first path component, integer 1 with the second, and so on (path
+ * components are numbered starting from zero). To pass an integer without it
+ * being replaced with its respective path component, use the string value of
+ * the integer (e.g., '1') as the argument value. This substitution feature
+ * allows you to re-use a callback function for several different paths. For
+ * example:
+ * @code
+ *   function mymodule_menu() {
+ *     $items['abc/def'] = array(
+ *       'page callback' => 'mymodule_abc_view',
+ *       'page arguments' => array(1, 'foo'),
+ *     );
+ *     return $items;
+ *   }
+ * @endcode
+ * When path 'abc/def' is requested, the page callback function will get 'def'
+ * as the first argument and (always) 'foo' as the second argument.
+ *
+ * If a page callback function uses an argument list array, and its path is
+ * requested with optional path arguments, then the list array's arguments are
+ * passed to the callback function first, followed by the optional path
+ * arguments. Using the above example, when path 'abc/def/bar/baz' is requested,
+ * mymodule_abc_view() will be called with 'def', 'foo', 'bar' and 'baz' as
+ * arguments, in that order.
+ *
+ * Special care should be taken for the page callback drupal_get_form(), because
+ * your specific form callback function will always receive $form and
+ * &$form_state as the first function arguments:
+ * @code
+ *   function mymodule_abc_form($form, &$form_state) {
+ *     // ...
+ *     return $form;
+ *   }
+ * @endcode
+ * See @link form_api Form API documentation @endlink for details.
+ *
+ * @section sec_path_wildcards Wildcards in Paths
+ * @subsection sub_simple_wildcards Simple Wildcards
+ * Wildcards within paths also work with integer substitution. For example,
+ * your module could register path 'my-module/%/edit':
+ * @code
+ *   $items['my-module/%/edit'] = array(
+ *     'page callback' => 'mymodule_abc_edit',
+ *     'page arguments' => array(1),
+ *   );
+ * @endcode
+ * When path 'my-module/foo/edit' is requested, integer 1 will be replaced
+ * with 'foo' and passed to the callback function. Note that wildcards may not
+ * be used as the first component.
+ *
+ * @subsection sub_autoload_wildcards Auto-Loader Wildcards
+ * Registered paths may also contain special "auto-loader" wildcard components
+ * in the form of '%mymodule_abc', where the '%' part means that this path
+ * component is a wildcard, and the 'mymodule_abc' part defines the prefix for a
+ * load function, which here would be named mymodule_abc_load(). When a matching
+ * path is requested, your load function will receive as its first argument the
+ * path component in the position of the wildcard; load functions may also be
+ * passed additional arguments (see "load arguments" in the return value
+ * section below). For example, your module could register path
+ * 'my-module/%mymodule_abc/edit':
+ * @code
+ *   $items['my-module/%mymodule_abc/edit'] = array(
+ *     'page callback' => 'mymodule_abc_edit',
+ *     'page arguments' => array(1),
+ *   );
+ * @endcode
+ * When path 'my-module/123/edit' is requested, your load function
+ * mymodule_abc_load() will be invoked with the argument '123', and should
+ * load and return an "abc" object with internal id 123:
+ * @code
+ *   function mymodule_abc_load($abc_id) {
+ *     return db_query("SELECT * FROM {mymodule_abc} WHERE abc_id = :abc_id", array(':abc_id' => $abc_id))->fetchObject();
+ *   }
+ * @endcode
+ * This 'abc' object will then be passed into the callback functions defined
+ * for the menu item, such as the page callback function mymodule_abc_edit()
+ * to replace the integer 1 in the argument array. Note that a load function
+ * should return FALSE when it is unable to provide a loadable object. For
+ * example, the node_load() function for the 'node/%node/edit' menu item will
+ * return FALSE for the path 'node/999/edit' if a node with a node ID of 999
+ * does not exist. The menu routing system will return a 404 error in this case.
+ *
+ * @subsection sub_argument_wildcards Argument Wildcards
+ * You can also define a %wildcard_to_arg() function (for the example menu
+ * entry above this would be 'mymodule_abc_to_arg()'). The _to_arg() function
+ * is invoked to retrieve a value that is used in the path in place of the
+ * wildcard. A good example is user.module, which defines
+ * user_uid_optional_to_arg() (corresponding to the menu entry
+ * 'tracker/%user_uid_optional'). This function returns the user ID of the
+ * current user.
+ *
+ * The _to_arg() function will get called with three arguments:
+ * - $arg: A string representing whatever argument may have been supplied by
+ *   the caller (this is particularly useful if you want the _to_arg()
+ *   function only supply a (default) value if no other value is specified,
+ *   as in the case of user_uid_optional_to_arg().
+ * - $map: An array of all path fragments (e.g. array('node','123','edit') for
+ *   'node/123/edit').
+ * - $index: An integer indicating which element of $map corresponds to $arg.
+ *
+ * _load() and _to_arg() functions may seem similar at first glance, but they
+ * have different purposes and are called at different times. _load()
+ * functions are called when the menu system is collecting arguments to pass
+ * to the callback functions defined for the menu item. _to_arg() functions
+ * are called when the menu system is generating links to related paths, such
+ * as the tabs for a set of MENU_LOCAL_TASK items.
+ *
+ * @section sec_render_tabs Rendering Menu Items As Tabs
+ * You can also make groups of menu items to be rendered (by default) as tabs
+ * on a page. To do that, first create one menu item of type MENU_NORMAL_ITEM,
+ * with your chosen path, such as 'foo'. Then duplicate that menu item, using a
+ * subdirectory path, such as 'foo/tab1', and changing the type to
+ * MENU_DEFAULT_LOCAL_TASK to make it the default tab for the group. Then add
+ * the additional tab items, with paths such as "foo/tab2" etc., with type
+ * MENU_LOCAL_TASK. Example:
+ * @code
+ * // Make "Foo settings" appear on the admin Config page
+ * $items['admin/config/system/foo'] = array(
+ *   'title' => 'Foo settings',
+ *   'type' => MENU_NORMAL_ITEM,
+ *   // Page callback, etc. need to be added here.
+ * );
+ * // Make "Tab 1" the main tab on the "Foo settings" page
+ * $items['admin/config/system/foo/tab1'] = array(
+ *   'title' => 'Tab 1',
+ *   'type' => MENU_DEFAULT_LOCAL_TASK,
+ *   // Access callback, page callback, and theme callback will be inherited
+ *   // from 'admin/config/system/foo', if not specified here to override.
+ * );
+ * // Make an additional tab called "Tab 2" on "Foo settings"
+ * $items['admin/config/system/foo/tab2'] = array(
+ *   'title' => 'Tab 2',
+ *   'type' => MENU_LOCAL_TASK,
+ *   // Page callback and theme callback will be inherited from
+ *   // 'admin/config/system/foo', if not specified here to override.
+ *   // Need to add access callback or access arguments.
+ * );
+ * @endcode
+ *
+ * @return
+ *   An array of menu items. Each menu item has a key corresponding to the
+ *   Drupal path being registered. The corresponding array value is an
+ *   associative array that may contain the following key-value pairs:
+ *   - "title": Required. The untranslated title of the menu item.
+ *   - "title callback": Function to generate the title; defaults to t().
+ *     If you require only the raw string to be output, set this to FALSE.
+ *   - "title arguments": Arguments to send to t() or your custom callback,
+ *     with path component substitution as described above.
+ *   - "description": The untranslated description of the menu item.
+ *   - "page callback": The function to call to display a web page when the user
+ *     visits the path. If omitted, the parent menu item's callback will be used
+ *     instead.
+ *   - "page arguments": An array of arguments to pass to the page callback
+ *     function, with path component substitution as described above.
+ *   - "delivery callback": The function to call to package the result of the
+ *     page callback function and send it to the browser. Defaults to
+ *     drupal_deliver_html_page() unless a value is inherited from a parent menu
+ *     item. Note that this function is called even if the access checks fail,
+ *     so any custom delivery callback function should take that into account.
+ *     See drupal_deliver_html_page() for an example.
+ *   - "access callback": A function returning TRUE if the user has access
+ *     rights to this menu item, and FALSE if not. It can also be a boolean
+ *     constant instead of a function, and you can also use numeric values
+ *     (will be cast to boolean). Defaults to user_access() unless a value is
+ *     inherited from the parent menu item; only MENU_DEFAULT_LOCAL_TASK items
+ *     can inherit access callbacks. To use the user_access() default callback,
+ *     you must specify the permission to check as 'access arguments' (see
+ *     below).
+ *   - "access arguments": An array of arguments to pass to the access callback
+ *     function, with path component substitution as described above. If the
+ *     access callback is inherited (see above), the access arguments will be
+ *     inherited with it, unless overridden in the child menu item.
+ *   - "theme callback": (optional) A function returning the machine-readable
+ *     name of the theme that will be used to render the page. If not provided,
+ *     the value will be inherited from a parent menu item. If there is no
+ *     theme callback, or if the function does not return the name of a current
+ *     active theme on the site, the theme for this page will be determined by
+ *     either hook_custom_theme() or the default theme instead. As a general
+ *     rule, the use of theme callback functions should be limited to pages
+ *     whose functionality is very closely tied to a particular theme, since
+ *     they can only be overridden by modules which specifically target those
+ *     pages in hook_menu_alter(). Modules implementing more generic theme
+ *     switching functionality (for example, a module which allows the theme to
+ *     be set dynamically based on the current user's role) should use
+ *     hook_custom_theme() instead.
+ *   - "theme arguments": An array of arguments to pass to the theme callback
+ *     function, with path component substitution as described above.
+ *   - "file": A file that will be included before the page callback is called;
+ *     this allows page callback functions to be in separate files. The file
+ *     should be relative to the implementing module's directory unless
+ *     otherwise specified by the "file path" option. Does not apply to other
+ *     callbacks (only page callback).
+ *   - "file path": The path to the directory containing the file specified in
+ *     "file". This defaults to the path to the module implementing the hook.
+ *   - "load arguments": An array of arguments to be passed to each of the
+ *     wildcard object loaders in the path, after the path argument itself.
+ *     For example, if a module registers path node/%node/revisions/%/view
+ *     with load arguments set to array(3), the '%node' in the path indicates
+ *     that the loader function node_load() will be called with the second
+ *     path component as the first argument. The 3 in the load arguments
+ *     indicates that the fourth path component will also be passed to
+ *     node_load() (numbering of path components starts at zero). So, if path
+ *     node/12/revisions/29/view is requested, node_load(12, 29) will be called.
+ *     There are also two "magic" values that can be used in load arguments.
+ *     "%index" indicates the index of the wildcard path component. "%map"
+ *     indicates the path components as an array. For example, if a module
+ *     registers for several paths of the form 'user/%user_category/edit/*', all
+ *     of them can use the same load function user_category_load(), by setting
+ *     the load arguments to array('%map', '%index'). For instance, if the user
+ *     is editing category 'foo' by requesting path 'user/32/edit/foo', the load
+ *     function user_category_load() will be called with 32 as its first
+ *     argument, the array ('user', 32, 'edit', 'foo') as the map argument,
+ *     and 1 as the index argument (because %user_category is the second path
+ *     component and numbering starts at zero). user_category_load() can then
+ *     use these values to extract the information that 'foo' is the category
+ *     being requested.
+ *   - "weight": An integer that determines the relative position of items in
+ *     the menu; higher-weighted items sink. Defaults to 0. Menu items with the
+ *     same weight are ordered alphabetically.
+ *   - "menu_name": Optional. Set this to a custom menu if you don't want your
+ *     item to be placed in Navigation.
+ *   - "expanded": Optional. If set to TRUE, and if a menu link is provided for
+ *     this menu item (as a result of other properties), then the menu link is
+ *     always expanded, equivalent to its 'always expanded' checkbox being set
+ *     in the UI.
+ *   - "context": (optional) Defines the context a tab may appear in. By
+ *     default, all tabs are only displayed as local tasks when being rendered
+ *     in a page context. All tabs that should be accessible as contextual links
+ *     in page region containers outside of the parent menu item's primary page
+ *     context should be registered using one of the following contexts:
+ *     - MENU_CONTEXT_PAGE: (default) The tab is displayed as local task for the
+ *       page context only.
+ *     - MENU_CONTEXT_INLINE: The tab is displayed as contextual link outside of
+ *       the primary page context only.
+ *     Contexts can be combined. For example, to display a tab both on a page
+ *     and inline, a menu router item may specify:
+ *     @code
+ *       'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
+ *     @endcode
+ *   - "tab_parent": For local task menu items, the path of the task's parent
+ *     item; defaults to the same path without the last component (e.g., the
+ *     default parent for 'admin/people/create' is 'admin/people').
+ *   - "tab_root": For local task menu items, the path of the closest non-tab
+ *     item; same default as "tab_parent".
+ *   - "position": Position of the block ('left' or 'right') on the system
+ *     administration page for this item.
+ *   - "type": A bitmask of flags describing properties of the menu item.
+ *     Many shortcut bitmasks are provided as constants in menu.inc:
+ *     - MENU_NORMAL_ITEM: Normal menu items show up in the menu tree and can be
+ *       moved/hidden by the administrator.
+ *     - MENU_CALLBACK: Callbacks simply register a path so that the correct
+ *       information is generated when the path is accessed.
+ *     - MENU_SUGGESTED_ITEM: Modules may "suggest" menu items that the
+ *       administrator may enable.
+ *     - MENU_LOCAL_ACTION: Local actions are menu items that describe actions
+ *       on the parent item such as adding a new user or block, and are
+ *       rendered in the action-links list in your theme.
+ *     - MENU_LOCAL_TASK: Local tasks are menu items that describe different
+ *       displays of data, and are generally rendered as tabs.
+ *     - MENU_DEFAULT_LOCAL_TASK: Every set of local tasks should provide one
+ *       "default" task, which should display the same page as the parent item.
+ *     If the "type" element is omitted, MENU_NORMAL_ITEM is assumed.
+ *   - "options": An array of options to be passed to l() when generating a link
+ *     from this menu item. Note that the "options" parameter has no effect on
+ *     MENU_LOCAL_TASK, MENU_DEFAULT_LOCAL_TASK, and MENU_LOCAL_ACTION items.
+ *
+ * For a detailed usage example, see page_example.module.
+ * For comprehensive documentation on the menu system, see
+ * http://drupal.org/node/102338.
+ */
+function hook_menu() {
+  $items['example'] = array(
+    'title' => 'Example Page',
+    'page callback' => 'example_page',
+    'access arguments' => array('access content'),
+    'type' => MENU_SUGGESTED_ITEM,
+  );
+  $items['example/feed'] = array(
+    'title' => 'Example RSS feed',
+    'page callback' => 'example_feed',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
+
+  return $items;
+}
+
+/**
+ * Alter the data being saved to the {menu_router} table after hook_menu is invoked.
+ *
+ * This hook is invoked by menu_router_build(). The menu definitions are passed
+ * in by reference. Each element of the $items array is one item returned
+ * by a module from hook_menu. Additional items may be added, or existing items
+ * altered.
+ *
+ * @param $items
+ *   Associative array of menu router definitions returned from hook_menu().
+ */
+function hook_menu_alter(&$items) {
+  // Example - disable the page at node/add
+  $items['node/add']['access callback'] = FALSE;
+}
+
+/**
+ * Alter the data being saved to the {menu_links} table by menu_link_save().
+ *
+ * @param $item
+ *   Associative array defining a menu link as passed into menu_link_save().
+ *
+ * @see hook_translated_menu_link_alter()
+ */
+function hook_menu_link_alter(&$item) {
+  // Make all new admin links hidden (a.k.a disabled).
+  if (strpos($item['link_path'], 'admin') === 0 && empty($item['mlid'])) {
+    $item['hidden'] = 1;
+  }
+  // Flag a link to be altered by hook_translated_menu_link_alter().
+  if ($item['link_path'] == 'devel/cache/clear') {
+    $item['options']['alter'] = TRUE;
+  }
+  // Flag a link to be altered by hook_translated_menu_link_alter(), but only
+  // if it is derived from a menu router item; i.e., do not alter a custom
+  // menu link pointing to the same path that has been created by a user.
+  if ($item['link_path'] == 'user' && $item['module'] == 'system') {
+    $item['options']['alter'] = TRUE;
+  }
+}
+
+/**
+ * Alter a menu link after it has been translated and before it is rendered.
+ *
+ * This hook is invoked from _menu_link_translate() after a menu link has been
+ * translated; i.e., after dynamic path argument placeholders (%) have been
+ * replaced with actual values, the user access to the link's target page has
+ * been checked, and the link has been localized. It is only invoked if
+ * $item['options']['alter'] has been set to a non-empty value (e.g., TRUE).
+ * This flag should be set using hook_menu_link_alter().
+ *
+ * Implementations of this hook are able to alter any property of the menu link.
+ * For example, this hook may be used to add a page-specific query string to all
+ * menu links, or hide a certain link by setting:
+ * @code
+ *   'hidden' => 1,
+ * @endcode
+ *
+ * @param $item
+ *   Associative array defining a menu link after _menu_link_translate()
+ * @param $map
+ *   Associative array containing the menu $map (path parts and/or objects).
+ *
+ * @see hook_menu_link_alter()
+ */
+function hook_translated_menu_link_alter(&$item, $map) {
+  if ($item['href'] == 'devel/cache/clear') {
+    $item['localized_options']['query'] = drupal_get_destination();
+  }
+}
+
+/**
+ * Inform modules that a menu link has been created.
+ *
+ * This hook is used to notify modules that menu items have been
+ * created. Contributed modules may use the information to perform
+ * actions based on the information entered into the menu system.
+ *
+ * @param $link
+ *   Associative array defining a menu link as passed into menu_link_save().
+ *
+ * @see hook_menu_link_update()
+ * @see hook_menu_link_delete()
+ */
+function hook_menu_link_insert($link) {
+  // In our sample case, we track menu items as editing sections
+  // of the site. These are stored in our table as 'disabled' items.
+  $record['mlid'] = $link['mlid'];
+  $record['menu_name'] = $link['menu_name'];
+  $record['status'] = 0;
+  drupal_write_record('menu_example', $record);
+}
+
+/**
+ * Inform modules that a menu link has been updated.
+ *
+ * This hook is used to notify modules that menu items have been
+ * updated. Contributed modules may use the information to perform
+ * actions based on the information entered into the menu system.
+ *
+ * @param $link
+ *   Associative array defining a menu link as passed into menu_link_save().
+ *
+ * @see hook_menu_link_insert()
+ * @see hook_menu_link_delete()
+ */
+function hook_menu_link_update($link) {
+  // If the parent menu has changed, update our record.
+  $menu_name = db_query("SELECT menu_name FROM {menu_example} WHERE mlid = :mlid", array(':mlid' => $link['mlid']))->fetchField();
+  if ($menu_name != $link['menu_name']) {
+    db_update('menu_example')
+      ->fields(array('menu_name' => $link['menu_name']))
+      ->condition('mlid', $link['mlid'])
+      ->execute();
+  }
+}
+
+/**
+ * Inform modules that a menu link has been deleted.
+ *
+ * This hook is used to notify modules that menu items have been
+ * deleted. Contributed modules may use the information to perform
+ * actions based on the information entered into the menu system.
+ *
+ * @param $link
+ *   Associative array defining a menu link as passed into menu_link_save().
+ *
+ * @see hook_menu_link_insert()
+ * @see hook_menu_link_update()
+ */
+function hook_menu_link_delete($link) {
+  // Delete the record from our table.
+  db_delete('menu_example')
+    ->condition('mlid', $link['mlid'])
+    ->execute();
+}
+
+/**
+ * Alter tabs and actions displayed on the page before they are rendered.
+ *
+ * This hook is invoked by menu_local_tasks(). The system-determined tabs and
+ * actions are passed in by reference. Additional tabs or actions may be added,
+ * or existing items altered.
+ *
+ * Each tab or action is an associative array containing:
+ * - #theme: The theme function to use to render.
+ * - #link: An associative array containing:
+ *   - title: The localized title of the link.
+ *   - href: The system path to link to.
+ *   - localized_options: An array of options to pass to l().
+ * - #active: Whether the link should be marked as 'active'.
+ *
+ * @param $data
+ *   An associative array containing:
+ *   - actions: An associative array containing:
+ *     - count: The amount of actions determined by the menu system, which can
+ *       be ignored.
+ *     - output: A list of of actions, each one being an associative array
+ *       as described above.
+ *   - tabs: An indexed array (list) of tab levels (up to 2 levels), each
+ *     containing an associative array:
+ *     - count: The amount of tabs determined by the menu system. This value
+ *       does not need to be altered if there is more than one tab.
+ *     - output: A list of of tabs, each one being an associative array as
+ *       described above.
+ * @param $router_item
+ *   The menu system router item of the page.
+ * @param $root_path
+ *   The path to the root item for this set of tabs.
+ */
+function hook_menu_local_tasks_alter(&$data, $router_item, $root_path) {
+  // Add an action linking to node/add to all pages.
+  $data['actions']['output'][] = array(
+    '#theme' => 'menu_local_task',
+    '#link' => array(
+      'title' => t('Add new content'),
+      'href' => 'node/add',
+      'localized_options' => array(
+        'attributes' => array(
+          'title' => t('Add new content'),
+        ),
+      ),
+    ),
+  );
+
+  // Add a tab linking to node/add to all pages.
+  $data['tabs'][0]['output'][] = array(
+    '#theme' => 'menu_local_task',
+    '#link' => array(
+      'title' => t('Example tab'),
+      'href' => 'node/add',
+      'localized_options' => array(
+        'attributes' => array(
+          'title' => t('Add new content'),
+        ),
+      ),
+    ),
+    // Define whether this link is active. This can be omitted for
+    // implementations that add links to pages outside of the current page
+    // context.
+    '#active' => ($router_item['path'] == $root_path),
+  );
+}
+
+/**
+ * Alter links in the active trail before it is rendered as the breadcrumb.
+ *
+ * This hook is invoked by menu_get_active_breadcrumb() and allows alteration
+ * of the breadcrumb links for the current page, which may be preferred instead
+ * of setting a custom breadcrumb via drupal_set_breadcrumb().
+ *
+ * Implementations should take into account that menu_get_active_breadcrumb()
+ * subsequently performs the following adjustments to the active trail *after*
+ * this hook has been invoked:
+ * - The last link in $active_trail is removed, if its 'href' is identical to
+ *   the 'href' of $item. This happens, because the breadcrumb normally does
+ *   not contain a link to the current page.
+ * - The (second to) last link in $active_trail is removed, if the current $item
+ *   is a MENU_DEFAULT_LOCAL_TASK. This happens in order to do not show a link
+ *   to the current page, when being on the path for the default local task;
+ *   e.g. when being on the path node/%/view, the breadcrumb should not contain
+ *   a link to node/%.
+ *
+ * Each link in the active trail must contain:
+ * - title: The localized title of the link.
+ * - href: The system path to link to.
+ * - localized_options: An array of options to pass to url().
+ *
+ * @param $active_trail
+ *   An array containing breadcrumb links for the current page.
+ * @param $item
+ *   The menu router item of the current page.
+ *
+ * @see drupal_set_breadcrumb()
+ * @see menu_get_active_breadcrumb()
+ * @see menu_get_active_trail()
+ * @see menu_set_active_trail()
+ */
+function hook_menu_breadcrumb_alter(&$active_trail, $item) {
+  // Always display a link to the current page by duplicating the last link in
+  // the active trail. This means that menu_get_active_breadcrumb() will remove
+  // the last link (for the current page), but since it is added once more here,
+  // it will appear.
+  if (!drupal_is_front_page()) {
+    $end = end($active_trail);
+    if ($item['href'] == $end['href']) {
+      $active_trail[] = $end;
+    }
+  }
+}
+
+/**
+ * Alter contextual links before they are rendered.
+ *
+ * This hook is invoked by menu_contextual_links(). The system-determined
+ * contextual links are passed in by reference. Additional links may be added
+ * or existing links can be altered.
+ *
+ * Each contextual link must at least contain:
+ * - title: The localized title of the link.
+ * - href: The system path to link to.
+ * - localized_options: An array of options to pass to url().
+ *
+ * @param $links
+ *   An associative array containing contextual links for the given $root_path,
+ *   as described above. The array keys are used to build CSS class names for
+ *   contextual links and must therefore be unique for each set of contextual
+ *   links.
+ * @param $router_item
+ *   The menu router item belonging to the $root_path being requested.
+ * @param $root_path
+ *   The (parent) path that has been requested to build contextual links for.
+ *   This is a normalized path, which means that an originally passed path of
+ *   'node/123' became 'node/%'.
+ *
+ * @see hook_contextual_links_view_alter()
+ * @see menu_contextual_links()
+ * @see hook_menu()
+ * @see contextual_preprocess()
+ */
+function hook_menu_contextual_links_alter(&$links, $router_item, $root_path) {
+  // Add a link to all contextual links for nodes.
+  if ($root_path == 'node/%') {
+    $links['foo'] = array(
+      'title' => t('Do fu'),
+      'href' => 'foo/do',
+      'localized_options' => array(
+        'query' => array(
+          'foo' => 'bar',
+        ),
+      ),
+    );
+  }
+}
+
+/**
+ * Perform alterations before a page is rendered.
+ *
+ * Use this hook when you want to remove or alter elements at the page
+ * level, or add elements at the page level that depend on an other module's
+ * elements (this hook runs after hook_page_build().
+ *
+ * If you are making changes to entities such as forms, menus, or user
+ * profiles, use those objects' native alter hooks instead (hook_form_alter(),
+ * for example).
+ *
+ * The $page array contains top level elements for each block region:
+ * @code
+ *   $page['page_top']
+ *   $page['header']
+ *   $page['sidebar_first']
+ *   $page['content']
+ *   $page['sidebar_second']
+ *   $page['page_bottom']
+ * @endcode
+ *
+ * The 'content' element contains the main content of the current page, and its
+ * structure will vary depending on what module is responsible for building the
+ * page. Some legacy modules may not return structured content at all: their
+ * pre-rendered markup will be located in $page['content']['main']['#markup'].
+ *
+ * Pages built by Drupal's core Node and Blog modules use a standard structure:
+ *
+ * @code
+ *   // Node body.
+ *   $page['content']['system_main']['nodes'][$nid]['body']
+ *   // Array of links attached to the node (add comments, read more).
+ *   $page['content']['system_main']['nodes'][$nid]['links']
+ *   // The node object itself.
+ *   $page['content']['system_main']['nodes'][$nid]['#node']
+ *   // The results pager.
+ *   $page['content']['system_main']['pager']
+ * @endcode
+ *
+ * Blocks may be referenced by their module/delta pair within a region:
+ * @code
+ *   // The login block in the first sidebar region.
+ *   $page['sidebar_first']['user_login']['#block'];
+ * @endcode
+ *
+ * @param $page
+ *   Nested array of renderable elements that make up the page.
+ *
+ * @see hook_page_build()
+ * @see drupal_render_page()
+ */
+function hook_page_alter(&$page) {
+  // Add help text to the user login block.
+  $page['sidebar_first']['user_login']['help'] = array(
+    '#weight' => -10,
+    '#markup' => t('To post comments or add new content, you first have to log in.'),
+  );
+}
+
+/**
+ * Perform alterations before a form is rendered.
+ *
+ * One popular use of this hook is to add form elements to the node form. When
+ * altering a node form, the node object can be accessed at $form['#node'].
+ *
+ * In addition to hook_form_alter(), which is called for all forms, there are
+ * two more specific form hooks available. The first,
+ * hook_form_BASE_FORM_ID_alter(), allows targeting of a form/forms via a base
+ * form (if one exists). The second, hook_form_FORM_ID_alter(), can be used to
+ * target a specific form directly.
+ *
+ * The call order is as follows: all existing form alter functions are called
+ * for module A, then all for module B, etc., followed by all for any base
+ * theme(s), and finally for the theme itself. The module order is determined
+ * by system weight, then by module name.
+ *
+ * Within each module, form alter hooks are called in the following order:
+ * first, hook_form_alter(); second, hook_form_BASE_FORM_ID_alter(); third,
+ * hook_form_FORM_ID_alter(). So, for each module, the more general hooks are
+ * called first followed by the more specific.
+ *
+ * @param $form
+ *   Nested array of form elements that comprise the form.
+ * @param $form_state
+ *   A keyed array containing the current state of the form. The arguments
+ *   that drupal_get_form() was originally called with are available in the
+ *   array $form_state['build_info']['args'].
+ * @param $form_id
+ *   String representing the name of the form itself. Typically this is the
+ *   name of the function that generated the form.
+ *
+ * @see hook_form_BASE_FORM_ID_alter()
+ * @see hook_form_FORM_ID_alter()
+ * @see forms_api_reference.html
+ */
+function hook_form_alter(&$form, &$form_state, $form_id) {
+  if (isset($form['type']) && $form['type']['#value'] . '_node_settings' == $form_id) {
+    $form['workflow']['upload_' . $form['type']['#value']] = array(
+      '#type' => 'radios',
+      '#title' => t('Attachments'),
+      '#default_value' => variable_get('upload_' . $form['type']['#value'], 1),
+      '#options' => array(t('Disabled'), t('Enabled')),
+    );
+  }
+}
+
+/**
+ * Provide a form-specific alteration instead of the global hook_form_alter().
+ *
+ * Modules can implement hook_form_FORM_ID_alter() to modify a specific form,
+ * rather than implementing hook_form_alter() and checking the form ID, or
+ * using long switch statements to alter multiple forms.
+ *
+ * Form alter hooks are called in the following order: hook_form_alter(),
+ * hook_form_BASE_FORM_ID_alter(), hook_form_FORM_ID_alter(). See
+ * hook_form_alter() for more details.
+ *
+ * @param $form
+ *   Nested array of form elements that comprise the form.
+ * @param $form_state
+ *   A keyed array containing the current state of the form. The arguments
+ *   that drupal_get_form() was originally called with are available in the
+ *   array $form_state['build_info']['args'].
+ * @param $form_id
+ *   String representing the name of the form itself. Typically this is the
+ *   name of the function that generated the form.
+ *
+ * @see hook_form_alter()
+ * @see hook_form_BASE_FORM_ID_alter()
+ * @see drupal_prepare_form()
+ * @see forms_api_reference.html
+ */
+function hook_form_FORM_ID_alter(&$form, &$form_state, $form_id) {
+  // Modification for the form with the given form ID goes here. For example, if
+  // FORM_ID is "user_register_form" this code would run only on the user
+  // registration form.
+
+  // Add a checkbox to registration form about agreeing to terms of use.
+  $form['terms_of_use'] = array(
+    '#type' => 'checkbox',
+    '#title' => t("I agree with the website's terms and conditions."),
+    '#required' => TRUE,
+  );
+}
+
+/**
+ * Provide a form-specific alteration for shared ('base') forms.
+ *
+ * By default, when drupal_get_form() is called, Drupal looks for a function
+ * with the same name as the form ID, and uses that function to build the form.
+ * In contrast, base forms allow multiple form IDs to be mapped to a single base
+ * (also called 'factory') form function.
+ *
+ * Modules can implement hook_form_BASE_FORM_ID_alter() to modify a specific
+ * base form, rather than implementing hook_form_alter() and checking for
+ * conditions that would identify the shared form constructor.
+ *
+ * To identify the base form ID for a particular form (or to determine whether
+ * one exists) check the $form_state. The base form ID is stored under
+ * $form_state['build_info']['base_form_id'].
+ *
+ * See hook_forms() for more information on how to implement base forms in
+ * Drupal.
+ *
+ * Form alter hooks are called in the following order: hook_form_alter(),
+ * hook_form_BASE_FORM_ID_alter(), hook_form_FORM_ID_alter(). See
+ * hook_form_alter() for more details.
+ *
+ * @param $form
+ *   Nested array of form elements that comprise the form.
+ * @param $form_state
+ *   A keyed array containing the current state of the form.
+ * @param $form_id
+ *   String representing the name of the form itself. Typically this is the
+ *   name of the function that generated the form.
+ *
+ * @see hook_form_alter()
+ * @see hook_form_FORM_ID_alter()
+ * @see drupal_prepare_form()
+ * @see hook_forms()
+ */
+function hook_form_BASE_FORM_ID_alter(&$form, &$form_state, $form_id) {
+  // Modification for the form with the given BASE_FORM_ID goes here. For
+  // example, if BASE_FORM_ID is "node_form", this code would run on every
+  // node form, regardless of node type.
+
+  // Add a checkbox to the node form about agreeing to terms of use.
+  $form['terms_of_use'] = array(
+    '#type' => 'checkbox',
+    '#title' => t("I agree with the website's terms and conditions."),
+    '#required' => TRUE,
+  );
+}
+
+/**
+ * Map form_ids to form builder functions.
+ *
+ * By default, when drupal_get_form() is called, the system will look for a
+ * function with the same name as the form ID, and use that function to build
+ * the form. If no such function is found, Drupal calls this hook. Modules
+ * implementing this hook can then provide their own instructions for mapping
+ * form IDs to constructor functions. As a result, you can easily map multiple
+ * form IDs to a single form constructor (referred to as a 'base' form).
+ *
+ * Using a base form can help to avoid code duplication, by allowing many
+ * similar forms to use the same code base. Another benefit is that it becomes
+ * much easier for other modules to apply a general change to the group of
+ * forms; hook_form_BASE_FORM_ID_alter() can be used to easily alter multiple
+ * forms at once by directly targeting the shared base form.
+ *
+ * Two example use cases where base forms may be useful are given below.
+ *
+ * First, you can use this hook to tell the form system to use a different
+ * function to build certain forms in your module; this is often used to define
+ * a form "factory" function that is used to build several similar forms. In
+ * this case, your hook implementation will likely ignore all of the input
+ * arguments. See node_forms() for an example of this. Note, node_forms() is the
+ * hook_forms() implementation; the base form itself is defined in node_form().
+ *
+ * Second, you could use this hook to define how to build a form with a
+ * dynamically-generated form ID. In this case, you would need to verify that
+ * the $form_id input matched your module's format for dynamically-generated
+ * form IDs, and if so, act appropriately.
+ *
+ * @param $form_id
+ *   The unique string identifying the desired form.
+ * @param $args
+ *   An array containing the original arguments provided to drupal_get_form()
+ *   or drupal_form_submit(). These are always passed to the form builder and
+ *   do not have to be specified manually in 'callback arguments'.
+ *
+ * @return
+ *   An associative array whose keys define form_ids and whose values are an
+ *   associative array defining the following keys:
+ *   - callback: The name of the form builder function to invoke. This will be
+ *     used for the base form ID, for example, to target a base form using
+ *     hook_form_BASE_FORM_ID_alter().
+ *   - callback arguments: (optional) Additional arguments to pass to the
+ *     function defined in 'callback', which are prepended to $args.
+ *   - wrapper_callback: (optional) The name of a form builder function to
+ *     invoke before the form builder defined in 'callback' is invoked. This
+ *     wrapper callback may prepopulate the $form array with form elements,
+ *     which will then be already contained in the $form that is passed on to
+ *     the form builder defined in 'callback'. For example, a wrapper callback
+ *     could setup wizard-alike form buttons that are the same for a variety of
+ *     forms that belong to the wizard, which all share the same wrapper
+ *     callback.
+ */
+function hook_forms($form_id, $args) {
+  // Simply reroute the (non-existing) $form_id 'mymodule_first_form' to
+  // 'mymodule_main_form'.
+  $forms['mymodule_first_form'] = array(
+    'callback' => 'mymodule_main_form',
+  );
+
+  // Reroute the $form_id and prepend an additional argument that gets passed to
+  // the 'mymodule_main_form' form builder function.
+  $forms['mymodule_second_form'] = array(
+    'callback' => 'mymodule_main_form',
+    'callback arguments' => array('some parameter'),
+  );
+
+  // Reroute the $form_id, but invoke the form builder function
+  // 'mymodule_main_form_wrapper' first, so we can prepopulate the $form array
+  // that is passed to the actual form builder 'mymodule_main_form'.
+  $forms['mymodule_wrapped_form'] = array(
+    'callback' => 'mymodule_main_form',
+    'wrapper_callback' => 'mymodule_main_form_wrapper',
+  );
+
+  return $forms;
+}
+
+/**
+ * Perform setup tasks for all page requests.
+ *
+ * This hook is run at the beginning of the page request. It is typically
+ * used to set up global parameters that are needed later in the request.
+ *
+ * Only use this hook if your code must run even for cached page views. This
+ * hook is called before the theme, modules, or most include files are loaded
+ * into memory. It happens while Drupal is still in bootstrap mode.
+ *
+ * @see hook_init()
+ */
+function hook_boot() {
+  // We need user_access() in the shutdown function. Make sure it gets loaded.
+  drupal_load('module', 'user');
+  drupal_register_shutdown_function('devel_shutdown');
+}
+
+/**
+ * Perform setup tasks for non-cached page requests.
+ *
+ * This hook is run at the beginning of the page request. It is typically
+ * used to set up global parameters that are needed later in the request.
+ * When this hook is called, the theme and all modules are already loaded in
+ * memory.
+ *
+ * This hook is not run on cached pages.
+ *
+ * To add CSS or JS that should be present on all pages, modules should not
+ * implement this hook, but declare these files in their .info file.
+ *
+ * @see hook_boot()
+ */
+function hook_init() {
+  // Since this file should only be loaded on the front page, it cannot be
+  // declared in the info file.
+  if (drupal_is_front_page()) {
+    drupal_add_css(drupal_get_path('module', 'foo') . '/foo.css');
+  }
+}
+
+/**
+ * Define image toolkits provided by this module.
+ *
+ * The file which includes each toolkit's functions must be declared as part of
+ * the files array in the module .info file so that the registry will find and
+ * parse it.
+ *
+ * The toolkit's functions must be named image_toolkitname_operation().
+ * where the operation may be:
+ *   - 'load': Required. See image_gd_load() for usage.
+ *   - 'save': Required. See image_gd_save() for usage.
+ *   - 'settings': Optional. See image_gd_settings() for usage.
+ *   - 'resize': Optional. See image_gd_resize() for usage.
+ *   - 'rotate': Optional. See image_gd_rotate() for usage.
+ *   - 'crop': Optional. See image_gd_crop() for usage.
+ *   - 'desaturate': Optional. See image_gd_desaturate() for usage.
+ *
+ * @return
+ *   An array with the toolkit name as keys and sub-arrays with these keys:
+ *     - 'title': A string with the toolkit's title.
+ *     - 'available': A Boolean value to indicate that the toolkit is operating
+ *       properly, e.g. all required libraries exist.
+ *
+ * @see system_image_toolkits()
+ */
+function hook_image_toolkits() {
+  return array(
+    'working' => array(
+      'title' => t('A toolkit that works.'),
+      'available' => TRUE,
+    ),
+    'broken' => array(
+      'title' => t('A toolkit that is "broken" and will not be listed.'),
+      'available' => FALSE,
+    ),
+  );
+}
+
+/**
+ * Alter an email message created with the drupal_mail() function.
+ *
+ * hook_mail_alter() allows modification of email messages created and sent
+ * with drupal_mail(). Usage examples include adding and/or changing message
+ * text, message fields, and message headers.
+ *
+ * Email messages sent using functions other than drupal_mail() will not
+ * invoke hook_mail_alter(). For example, a contributed module directly
+ * calling the drupal_mail_system()->mail() or PHP mail() function
+ * will not invoke this hook. All core modules use drupal_mail() for
+ * messaging, it is best practice but not mandatory in contributed modules.
+ *
+ * @param $message
+ *   An array containing the message data. Keys in this array include:
+ *  - 'id':
+ *     The drupal_mail() id of the message. Look at module source code or
+ *     drupal_mail() for possible id values.
+ *  - 'to':
+ *     The address or addresses the message will be sent to. The formatting of
+ *     this string will be validated with the
+ *     @link http://php.net/manual/filter.filters.validate.php PHP e-mail validation filter. @endlink
+ *  - 'from':
+ *     The address the message will be marked as being from, which is
+ *     either a custom address or the site-wide default email address.
+ *  - 'subject':
+ *     Subject of the email to be sent. This must not contain any newline
+ *     characters, or the email may not be sent properly.
+ *  - 'body':
+ *     An array of strings containing the message text. The message body is
+ *     created by concatenating the individual array strings into a single text
+ *     string using "\n\n" as a separator.
+ *  - 'headers':
+ *     Associative array containing mail headers, such as From, Sender,
+ *     MIME-Version, Content-Type, etc.
+ *  - 'params':
+ *     An array of optional parameters supplied by the caller of drupal_mail()
+ *     that is used to build the message before hook_mail_alter() is invoked.
+ *  - 'language':
+ *     The language object used to build the message before hook_mail_alter()
+ *     is invoked.
+ *  - 'send':
+ *     Set to FALSE to abort sending this email message.
+ *
+ * @see drupal_mail()
+ */
+function hook_mail_alter(&$message) {
+  if ($message['id'] == 'modulename_messagekey') {
+    if (!example_notifications_optin($message['to'], $message['id'])) {
+      // If the recipient has opted to not receive such messages, cancel
+      // sending.
+      $message['send'] = FALSE;
+      return;
+    }
+    $message['body'][] = "--\nMail sent out from " . variable_get('site_name', t('Drupal'));
+  }
+}
+
+/**
+ * Alter the registry of modules implementing a hook.
+ *
+ * This hook is invoked during module_implements(). A module may implement this
+ * hook in order to reorder the implementing modules, which are otherwise
+ * ordered by the module's system weight.
+ *
+ * Note that hooks invoked using drupal_alter() can have multiple variations
+ * (such as hook_form_alter() and hook_form_FORM_ID_alter()). drupal_alter()
+ * will call all such variants defined by a single module in turn. For the
+ * purposes of hook_module_implements_alter(), these variants are treated as
+ * a single hook. Thus, to ensure that your implementation of
+ * hook_form_FORM_ID_alter() is called at the right time, you will have to
+ * change the order of hook_form_alter() implementation in
+ * hook_module_implements_alter().
+ *
+ * @param $implementations
+ *   An array keyed by the module's name. The value of each item corresponds
+ *   to a $group, which is usually FALSE, unless the implementation is in a
+ *   file named $module.$group.inc.
+ * @param $hook
+ *   The name of the module hook being implemented.
+ */
+function hook_module_implements_alter(&$implementations, $hook) {
+  if ($hook == 'rdf_mapping') {
+    // Move my_module_rdf_mapping() to the end of the list. module_implements()
+    // iterates through $implementations with a foreach loop which PHP iterates
+    // in the order that the items were added, so to move an item to the end of
+    // the array, we remove it and then add it.
+    $group = $implementations['my_module'];
+    unset($implementations['my_module']);
+    $implementations['my_module'] = $group;
+  }
+}
+
+/**
+ * Return additional themes provided by modules.
+ *
+ * Only use this hook for testing purposes. Use a hidden MYMODULE_test.module
+ * to implement this hook. Testing themes should be hidden, too.
+ *
+ * This hook is invoked from _system_rebuild_theme_data() and allows modules to
+ * register additional themes outside of the regular 'themes' directories of a
+ * Drupal installation.
+ *
+ * @return
+ *   An associative array. Each key is the system name of a theme and each value
+ *   is the corresponding path to the theme's .info file.
+ */
+function hook_system_theme_info() {
+  $themes['mymodule_test_theme'] = drupal_get_path('module', 'mymodule') . '/mymodule_test_theme/mymodule_test_theme.info';
+  return $themes;
+}
+
+/**
+ * Alter the information parsed from module and theme .info files
+ *
+ * This hook is invoked in _system_rebuild_module_data() and in
+ * _system_rebuild_theme_data(). A module may implement this hook in order to
+ * add to or alter the data generated by reading the .info file with
+ * drupal_parse_info_file().
+ *
+ * @param $info
+ *   The .info file contents, passed by reference so that it can be altered.
+ * @param $file
+ *   Full information about the module or theme, including $file->name, and
+ *   $file->filename
+ * @param $type
+ *   Either 'module' or 'theme', depending on the type of .info file that was
+ *   passed.
+ */
+function hook_system_info_alter(&$info, $file, $type) {
+  // Only fill this in if the .info file does not define a 'datestamp'.
+  if (empty($info['datestamp'])) {
+    $info['datestamp'] = filemtime($file->filename);
+  }
+}
+
+/**
+ * Define user permissions.
+ *
+ * This hook can supply permissions that the module defines, so that they
+ * can be selected on the user permissions page and used to grant or restrict
+ * access to actions the module performs.
+ *
+ * Permissions are checked using user_access().
+ *
+ * For a detailed usage example, see page_example.module.
+ *
+ * @return
+ *   An array whose keys are permission names and whose corresponding values
+ *   are arrays containing the following key-value pairs:
+ *   - title: The human-readable name of the permission, to be shown on the
+ *     permission administration page. This should be wrapped in the t()
+ *     function so it can be translated.
+ *   - description: (optional) A description of what the permission does. This
+ *     should be wrapped in the t() function so it can be translated.
+ *   - restrict access: (optional) A boolean which can be set to TRUE to
+ *     indicate that site administrators should restrict access to this
+ *     permission to trusted users. This should be used for permissions that
+ *     have inherent security risks across a variety of potential use cases
+ *     (for example, the "administer filters" and "bypass node access"
+ *     permissions provided by Drupal core). When set to TRUE, a standard
+ *     warning message defined in user_admin_permissions() and output via
+ *     theme_user_permission_description() will be associated with the
+ *     permission and displayed with it on the permission administration page.
+ *     Defaults to FALSE.
+ *   - warning: (optional) A translated warning message to display for this
+ *     permission on the permission administration page. This warning overrides
+ *     the automatic warning generated by 'restrict access' being set to TRUE.
+ *     This should rarely be used, since it is important for all permissions to
+ *     have a clear, consistent security warning that is the same across the
+ *     site. Use the 'description' key instead to provide any information that
+ *     is specific to the permission you are defining.
+ *
+ * @see theme_user_permission_description()
+ */
+function hook_permission() {
+  return array(
+    'administer my module' =>  array(
+      'title' => t('Administer my module'),
+      'description' => t('Perform administration tasks for my module.'),
+    ),
+  );
+}
+
+/**
+ * Register a module (or theme's) theme implementations.
+ *
+ * The implementations declared by this hook have two purposes: either they
+ * specify how a particular render array is to be rendered as HTML (this is
+ * usually the case if the theme function is assigned to the render array's
+ * #theme property), or they return the HTML that should be returned by an
+ * invocation of theme(). See
+ * @link http://drupal.org/node/933976 Using the theme layer Drupal 7.x @endlink
+ * for more information on how to implement theme hooks.
+ *
+ * The following parameters are all optional.
+ *
+ * @param array $existing
+ *   An array of existing implementations that may be used for override
+ *   purposes. This is primarily useful for themes that may wish to examine
+ *   existing implementations to extract data (such as arguments) so that
+ *   it may properly register its own, higher priority implementations.
+ * @param $type
+ *   Whether a theme, module, etc. is being processed. This is primarily useful
+ *   so that themes tell if they are the actual theme being called or a parent
+ *   theme. May be one of:
+ *   - 'module': A module is being checked for theme implementations.
+ *   - 'base_theme_engine': A theme engine is being checked for a theme that is
+ *     a parent of the actual theme being used.
+ *   - 'theme_engine': A theme engine is being checked for the actual theme
+ *     being used.
+ *   - 'base_theme': A base theme is being checked for theme implementations.
+ *   - 'theme': The actual theme in use is being checked.
+ * @param $theme
+ *   The actual name of theme, module, etc. that is being being processed.
+ * @param $path
+ *   The directory path of the theme or module, so that it doesn't need to be
+ *   looked up.
+ *
+ * @return array
+ *   An associative array of theme hook information. The keys on the outer
+ *   array are the internal names of the hooks, and the values are arrays
+ *   containing information about the hook. Each information array must contain
+ *   either a 'variables' element or a 'render element' element, but not both.
+ *   Use 'render element' if you are theming a single element or element tree
+ *   composed of elements, such as a form array, a page array, or a single
+ *   checkbox element. Use 'variables' if your theme implementation is
+ *   intended to be called directly through theme() and has multiple arguments
+ *   for the data and style; in this case, the variables not supplied by the
+ *   calling function will be given default values and passed to the template
+ *   or theme function. The returned theme information array can contain the
+ *   following key/value pairs:
+ *   - variables: (see above) Each array key is the name of the variable, and
+ *     the value given is used as the default value if the function calling
+ *     theme() does not supply it. Template implementations receive each array
+ *     key as a variable in the template file (so they must be legal PHP
+ *     variable names). Function implementations are passed the variables in a
+ *     single $variables function argument.
+ *   - render element: (see above) The name of the renderable element or element
+ *     tree to pass to the theme function. This name is used as the name of the
+ *     variable that holds the renderable element or tree in preprocess and
+ *     process functions.
+ *   - file: The file the implementation resides in. This file will be included
+ *     prior to the theme being rendered, to make sure that the function or
+ *     preprocess function (as needed) is actually loaded; this makes it
+ *     possible to split theme functions out into separate files quite easily.
+ *   - path: Override the path of the file to be used. Ordinarily the module or
+ *     theme path will be used, but if the file will not be in the default
+ *     path, include it here. This path should be relative to the Drupal root
+ *     directory.
+ *   - template: If specified, this theme implementation is a template, and
+ *     this is the template file without an extension. Do not put .tpl.php on
+ *     this file; that extension will be added automatically by the default
+ *     rendering engine (which is PHPTemplate). If 'path', above, is specified,
+ *     the template should also be in this path.
+ *   - function: If specified, this will be the function name to invoke for
+ *     this implementation. If neither 'template' nor 'function' is specified,
+ *     a default function name will be assumed. For example, if a module
+ *     registers the 'node' theme hook, 'theme_node' will be assigned to its
+ *     function. If the chameleon theme registers the node hook, it will be
+ *     assigned 'chameleon_node' as its function.
+ *   - base hook: A string declaring the base theme hook if this theme
+ *     implementation is actually implementing a suggestion for another theme
+ *     hook.
+ *   - pattern: A regular expression pattern to be used to allow this theme
+ *     implementation to have a dynamic name. The convention is to use __ to
+ *     differentiate the dynamic portion of the theme. For example, to allow
+ *     forums to be themed individually, the pattern might be: 'forum__'. Then,
+ *     when the forum is themed, call:
+ *     @code
+ *     theme(array('forum__' . $tid, 'forum'), $forum)
+ *     @endcode
+ *   - preprocess functions: A list of functions used to preprocess this data.
+ *     Ordinarily this won't be used; it's automatically filled in. By default,
+ *     for a module this will be filled in as template_preprocess_HOOK. For
+ *     a theme this will be filled in as phptemplate_preprocess and
+ *     phptemplate_preprocess_HOOK as well as themename_preprocess and
+ *     themename_preprocess_HOOK.
+ *   - override preprocess functions: Set to TRUE when a theme does NOT want
+ *     the standard preprocess functions to run. This can be used to give a
+ *     theme FULL control over how variables are set. For example, if a theme
+ *     wants total control over how certain variables in the page.tpl.php are
+ *     set, this can be set to true. Please keep in mind that when this is used
+ *     by a theme, that theme becomes responsible for making sure necessary
+ *     variables are set.
+ *   - type: (automatically derived) Where the theme hook is defined:
+ *     'module', 'theme_engine', or 'theme'.
+ *   - theme path: (automatically derived) The directory path of the theme or
+ *     module, so that it doesn't need to be looked up.
+ *
+ * @see hook_theme_registry_alter()
+ */
+function hook_theme($existing, $type, $theme, $path) {
+  return array(
+    'forum_display' => array(
+      'variables' => array('forums' => NULL, 'topics' => NULL, 'parents' => NULL, 'tid' => NULL, 'sortby' => NULL, 'forum_per_page' => NULL),
+    ),
+    'forum_list' => array(
+      'variables' => array('forums' => NULL, 'parents' => NULL, 'tid' => NULL),
+    ),
+    'forum_topic_list' => array(
+      'variables' => array('tid' => NULL, 'topics' => NULL, 'sortby' => NULL, 'forum_per_page' => NULL),
+    ),
+    'forum_icon' => array(
+      'variables' => array('new_posts' => NULL, 'num_posts' => 0, 'comment_mode' => 0, 'sticky' => 0),
+    ),
+    'status_report' => array(
+      'render element' => 'requirements',
+      'file' => 'system.admin.inc',
+    ),
+    'system_date_time_settings' => array(
+      'render element' => 'form',
+      'file' => 'system.admin.inc',
+    ),
+  );
+}
+
+/**
+ * Alter the theme registry information returned from hook_theme().
+ *
+ * The theme registry stores information about all available theme hooks,
+ * including which callback functions those hooks will call when triggered,
+ * what template files are exposed by these hooks, and so on.
+ *
+ * Note that this hook is only executed as the theme cache is re-built.
+ * Changes here will not be visible until the next cache clear.
+ *
+ * The $theme_registry array is keyed by theme hook name, and contains the
+ * information returned from hook_theme(), as well as additional properties
+ * added by _theme_process_registry().
+ *
+ * For example:
+ * @code
+ * $theme_registry['user_profile'] = array(
+ *   'variables' => array(
+ *     'account' => NULL,
+ *   ),
+ *   'template' => 'modules/user/user-profile',
+ *   'file' => 'modules/user/user.pages.inc',
+ *   'type' => 'module',
+ *   'theme path' => 'modules/user',
+ *   'preprocess functions' => array(
+ *     0 => 'template_preprocess',
+ *     1 => 'template_preprocess_user_profile',
+ *   ),
+ * );
+ * @endcode
+ *
+ * @param $theme_registry
+ *   The entire cache of theme registry information, post-processing.
+ *
+ * @see hook_theme()
+ * @see _theme_process_registry()
+ */
+function hook_theme_registry_alter(&$theme_registry) {
+  // Kill the next/previous forum topic navigation links.
+  foreach ($theme_registry['forum_topic_navigation']['preprocess functions'] as $key => $value) {
+    if ($value == 'template_preprocess_forum_topic_navigation') {
+      unset($theme_registry['forum_topic_navigation']['preprocess functions'][$key]);
+    }
+  }
+}
+
+/**
+ * Return the machine-readable name of the theme to use for the current page.
+ *
+ * This hook can be used to dynamically set the theme for the current page
+ * request. It should be used by modules which need to override the theme
+ * based on dynamic conditions (for example, a module which allows the theme to
+ * be set based on the current user's role). The return value of this hook will
+ * be used on all pages except those which have a valid per-page or per-section
+ * theme set via a theme callback function in hook_menu(); the themes on those
+ * pages can only be overridden using hook_menu_alter().
+ *
+ * Note that returning different themes for the same path may not work with page
+ * caching. This is most likely to be a problem if an anonymous user on a given
+ * path could have different themes returned under different conditions.
+ *
+ * Since only one theme can be used at a time, the last (i.e., highest
+ * weighted) module which returns a valid theme name from this hook will
+ * prevail.
+ *
+ * @return
+ *   The machine-readable name of the theme that should be used for the current
+ *   page request. The value returned from this function will only have an
+ *   effect if it corresponds to a currently-active theme on the site. Do not
+ *   return a value if you do not wish to set a custom theme.
+ */
+function hook_custom_theme() {
+  // Allow the user to request a particular theme via a query parameter.
+  if (isset($_GET['theme'])) {
+    return $_GET['theme'];
+  }
+}
+
+/**
+ * Register XML-RPC callbacks.
+ *
+ * This hook lets a module register callback functions to be called when
+ * particular XML-RPC methods are invoked by a client.
+ *
+ * @return
+ *   An array which maps XML-RPC methods to Drupal functions. Each array
+ *   element is either a pair of method => function or an array with four
+ *   entries:
+ *   - The XML-RPC method name (for example, module.function).
+ *   - The Drupal callback function (for example, module_function).
+ *   - The method signature is an array of XML-RPC types. The first element
+ *     of this array is the type of return value and then you should write a
+ *     list of the types of the parameters. XML-RPC types are the following
+ *     (See the types at http://www.xmlrpc.com/spec):
+ *       - "boolean": 0 (false) or 1 (true).
+ *       - "double": a floating point number (for example, -12.214).
+ *       - "int": a integer number (for example,  -12).
+ *       - "array": an array without keys (for example, array(1, 2, 3)).
+ *       - "struct": an associative array or an object (for example,
+ *          array('one' => 1, 'two' => 2)).
+ *       - "date": when you return a date, then you may either return a
+ *          timestamp (time(), mktime() etc.) or an ISO8601 timestamp. When
+ *          date is specified as an input parameter, then you get an object,
+ *          which is described in the function xmlrpc_date
+ *       - "base64": a string containing binary data, automatically
+ *          encoded/decoded automatically.
+ *       - "string": anything else, typically a string.
+ *   - A descriptive help string, enclosed in a t() function for translation
+ *     purposes.
+ *   Both forms are shown in the example.
+ */
+function hook_xmlrpc() {
+  return array(
+    'drupal.login' => 'drupal_login',
+    array(
+      'drupal.site.ping',
+      'drupal_directory_ping',
+      array('boolean', 'string', 'string', 'string', 'string', 'string'),
+      t('Handling ping request'))
+  );
+}
+
+/**
+ * Alters the definition of XML-RPC methods before they are called.
+ *
+ * This hook allows modules to modify the callback definition of declared
+ * XML-RPC methods, right before they are invoked by a client. Methods may be
+ * added, or existing methods may be altered.
+ *
+ * Note that hook_xmlrpc() supports two distinct and incompatible formats to
+ * define a callback, so care must be taken when altering other methods.
+ *
+ * @param $methods
+ *   An asssociative array of method callback definitions, as returned from
+ *   hook_xmlrpc() implementations.
+ *
+ * @see hook_xmlrpc()
+ * @see xmlrpc_server()
+ */
+function hook_xmlrpc_alter(&$methods) {
+  // Directly change a simple method.
+  $methods['drupal.login'] = 'mymodule_login';
+
+  // Alter complex definitions.
+  foreach ($methods as $key => &$method) {
+    // Skip simple method definitions.
+    if (!is_int($key)) {
+      continue;
+    }
+    // Perform the wanted manipulation.
+    if ($method[0] == 'drupal.site.ping') {
+      $method[1] = 'mymodule_directory_ping';
+    }
+  }
+}
+
+/**
+ * Log an event message.
+ *
+ * This hook allows modules to route log events to custom destinations, such as
+ * SMS, Email, pager, syslog, ...etc.
+ *
+ * @param $log_entry
+ *   An associative array containing the following keys:
+ *   - type: The type of message for this entry.
+ *   - user: The user object for the user who was logged in when the event
+ *     happened.
+ *   - uid: The user ID for the user who was logged in when the event happened.
+ *   - request_uri: The request URI for the page the event happened in.
+ *   - referer: The page that referred the user to the page where the event
+ *     occurred.
+ *   - ip: The IP address where the request for the page came from.
+ *   - timestamp: The UNIX timestamp of the date/time the event occurred.
+ *   - severity: The severity of the message; one of the following values as
+ *     defined in @link http://www.faqs.org/rfcs/rfc3164.html RFC 3164: @endlink
+ *     - WATCHDOG_EMERGENCY: Emergency, system is unusable.
+ *     - WATCHDOG_ALERT: Alert, action must be taken immediately.
+ *     - WATCHDOG_CRITICAL: Critical conditions.
+ *     - WATCHDOG_ERROR: Error conditions.
+ *     - WATCHDOG_WARNING: Warning conditions.
+ *     - WATCHDOG_NOTICE: Normal but significant conditions.
+ *     - WATCHDOG_INFO: Informational messages.
+ *     - WATCHDOG_DEBUG: Debug-level messages.
+ *   - link: An optional link provided by the module that called the watchdog()
+ *     function.
+ *   - message: The text of the message to be logged. Variables in the message
+ *     are indicated by using placeholder strings alongside the variables
+ *     argument to declare the value of the placeholders. See t() for
+ *     documentation on how the message and variable parameters interact.
+ *   - variables: An array of variables to be inserted into the message on
+ *     display. Will be NULL or missing if a message is already translated or if
+ *     the message is not possible to translate.
+ */
+function hook_watchdog(array $log_entry) {
+  global $base_url, $language;
+
+  $severity_list = array(
+    WATCHDOG_EMERGENCY => t('Emergency'),
+    WATCHDOG_ALERT     => t('Alert'),
+    WATCHDOG_CRITICAL  => t('Critical'),
+    WATCHDOG_ERROR     => t('Error'),
+    WATCHDOG_WARNING   => t('Warning'),
+    WATCHDOG_NOTICE    => t('Notice'),
+    WATCHDOG_INFO      => t('Info'),
+    WATCHDOG_DEBUG     => t('Debug'),
+  );
+
+  $to = 'someone@example.com';
+  $params = array();
+  $params['subject'] = t('[@site_name] @severity_desc: Alert from your web site', array(
+    '@site_name' => variable_get('site_name', 'Drupal'),
+    '@severity_desc' => $severity_list[$log_entry['severity']],
+  ));
+
+  $params['message']  = "\nSite:         @base_url";
+  $params['message'] .= "\nSeverity:     (@severity) @severity_desc";
+  $params['message'] .= "\nTimestamp:    @timestamp";
+  $params['message'] .= "\nType:         @type";
+  $params['message'] .= "\nIP Address:   @ip";
+  $params['message'] .= "\nRequest URI:  @request_uri";
+  $params['message'] .= "\nReferrer URI: @referer_uri";
+  $params['message'] .= "\nUser:         (@uid) @name";
+  $params['message'] .= "\nLink:         @link";
+  $params['message'] .= "\nMessage:      \n\n@message";
+
+  $params['message'] = t($params['message'], array(
+    '@base_url'      => $base_url,
+    '@severity'      => $log_entry['severity'],
+    '@severity_desc' => $severity_list[$log_entry['severity']],
+    '@timestamp'     => format_date($log_entry['timestamp']),
+    '@type'          => $log_entry['type'],
+    '@ip'            => $log_entry['ip'],
+    '@request_uri'   => $log_entry['request_uri'],
+    '@referer_uri'   => $log_entry['referer'],
+    '@uid'           => $log_entry['uid'],
+    '@name'          => $log_entry['user']->name,
+    '@link'          => strip_tags($log_entry['link']),
+    '@message'       => strip_tags($log_entry['message']),
+  ));
+
+  drupal_mail('emaillog', 'entry', $to, $language, $params);
+}
+
+/**
+ * Prepare a message based on parameters; called from drupal_mail().
+ *
+ * Note that hook_mail(), unlike hook_mail_alter(), is only called on the
+ * $module argument to drupal_mail(), not all modules.
+ *
+ * @param $key
+ *   An identifier of the mail.
+ * @param $message
+ *   An array to be filled in. Elements in this array include:
+ *   - id: An ID to identify the mail sent. Look at module source code
+ *     or drupal_mail() for possible id values.
+ *   - to: The address or addresses the message will be sent to. The formatting
+ *     of this string will be validated with the
+ *     @link http://php.net/manual/filter.filters.validate.php PHP e-mail validation filter. @endlink
+ *   - subject: Subject of the e-mail to be sent. This must not contain any
+ *     newline characters, or the mail may not be sent properly. drupal_mail()
+ *     sets this to an empty string when the hook is invoked.
+ *   - body: An array of lines containing the message to be sent. Drupal will
+ *     format the correct line endings for you. drupal_mail() sets this to an
+ *     empty array when the hook is invoked.
+ *   - from: The address the message will be marked as being from, which is
+ *     set by drupal_mail() to either a custom address or the site-wide
+ *     default email address when the hook is invoked.
+ *   - headers: Associative array containing mail headers, such as From,
+ *     Sender, MIME-Version, Content-Type, etc. drupal_mail() pre-fills
+ *     several headers in this array.
+ * @param $params
+ *   An array of parameters supplied by the caller of drupal_mail().
+ */
+function hook_mail($key, &$message, $params) {
+  $account = $params['account'];
+  $context = $params['context'];
+  $variables = array(
+    '%site_name' => variable_get('site_name', 'Drupal'),
+    '%username' => format_username($account),
+  );
+  if ($context['hook'] == 'taxonomy') {
+    $entity = $params['entity'];
+    $vocabulary = taxonomy_vocabulary_load($entity->vid);
+    $variables += array(
+      '%term_name' => $entity->name,
+      '%term_description' => $entity->description,
+      '%term_id' => $entity->tid,
+      '%vocabulary_name' => $vocabulary->name,
+      '%vocabulary_description' => $vocabulary->description,
+      '%vocabulary_id' => $vocabulary->vid,
+    );
+  }
+
+  // Node-based variable translation is only available if we have a node.
+  if (isset($params['node'])) {
+    $node = $params['node'];
+    $variables += array(
+      '%uid' => $node->uid,
+      '%node_url' => url('node/' . $node->nid, array('absolute' => TRUE)),
+      '%node_type' => node_type_get_name($node),
+      '%title' => $node->title,
+      '%teaser' => $node->teaser,
+      '%body' => $node->body,
+    );
+  }
+  $subject = strtr($context['subject'], $variables);
+  $body = strtr($context['message'], $variables);
+  $message['subject'] .= str_replace(array("\r", "\n"), '', $subject);
+  $message['body'][] = drupal_html_to_text($body);
+}
+
+/**
+ * Add a list of cache tables to be cleared.
+ *
+ * This hook allows your module to add cache table names to the list of cache
+ * tables that will be cleared by the Clear button on the Performance page or
+ * whenever drupal_flush_all_caches is invoked.
+ *
+ * @return
+ *   An array of cache table names.
+ *
+ * @see drupal_flush_all_caches()
+ */
+function hook_flush_caches() {
+  return array('cache_example');
+}
+
+/**
+ * Perform necessary actions after modules are installed.
+ *
+ * This function differs from hook_install() in that it gives all other modules
+ * a chance to perform actions when a module is installed, whereas
+ * hook_install() is only called on the module actually being installed. See
+ * module_enable() for a detailed description of the order in which install and
+ * enable hooks are invoked.
+ *
+ * @param $modules
+ *   An array of the modules that were installed.
+ *
+ * @see module_enable()
+ * @see hook_modules_enabled()
+ * @see hook_install()
+ */
+function hook_modules_installed($modules) {
+  if (in_array('lousy_module', $modules)) {
+    variable_set('lousy_module_conflicting_variable', FALSE);
+  }
+}
+
+/**
+ * Perform necessary actions after modules are enabled.
+ *
+ * This function differs from hook_enable() in that it gives all other modules a
+ * chance to perform actions when modules are enabled, whereas hook_enable() is
+ * only called on the module actually being enabled. See module_enable() for a
+ * detailed description of the order in which install and enable hooks are
+ * invoked.
+ *
+ * @param $modules
+ *   An array of the modules that were enabled.
+ *
+ * @see hook_enable()
+ * @see hook_modules_installed()
+ * @see module_enable()
+ */
+function hook_modules_enabled($modules) {
+  if (in_array('lousy_module', $modules)) {
+    drupal_set_message(t('mymodule is not compatible with lousy_module'), 'error');
+    mymodule_disable_functionality();
+  }
+}
+
+/**
+ * Perform necessary actions after modules are disabled.
+ *
+ * This function differs from hook_disable() in that it gives all other modules
+ * a chance to perform actions when modules are disabled, whereas hook_disable()
+ * is only called on the module actually being disabled.
+ *
+ * @param $modules
+ *   An array of the modules that were disabled.
+ *
+ * @see hook_disable()
+ * @see hook_modules_uninstalled()
+ */
+function hook_modules_disabled($modules) {
+  if (in_array('lousy_module', $modules)) {
+    mymodule_enable_functionality();
+  }
+}
+
+/**
+ * Perform necessary actions after modules are uninstalled.
+ *
+ * This function differs from hook_uninstall() in that it gives all other
+ * modules a chance to perform actions when a module is uninstalled, whereas
+ * hook_uninstall() is only called on the module actually being uninstalled.
+ *
+ * It is recommended that you implement this hook if your module stores
+ * data that may have been set by other modules.
+ *
+ * @param $modules
+ *   An array of the modules that were uninstalled.
+ *
+ * @see hook_uninstall()
+ * @see hook_modules_disabled()
+ */
+function hook_modules_uninstalled($modules) {
+  foreach ($modules as $module) {
+    db_delete('mymodule_table')
+      ->condition('module', $module)
+      ->execute();
+  }
+  mymodule_cache_rebuild();
+}
+
+/**
+ * Registers PHP stream wrapper implementations associated with a module.
+ *
+ * Provide a facility for managing and querying user-defined stream wrappers
+ * in PHP. PHP's internal stream_get_wrappers() doesn't return the class
+ * registered to handle a stream, which we need to be able to find the handler
+ * for class instantiation.
+ *
+ * If a module registers a scheme that is already registered with PHP, it will
+ * be unregistered and replaced with the specified class.
+ *
+ * @return
+ *   A nested array, keyed first by scheme name ("public" for "public://"),
+ *   then keyed by the following values:
+ *   - 'name' A short string to name the wrapper.
+ *   - 'class' A string specifying the PHP class that implements the
+ *     DrupalStreamWrapperInterface interface.
+ *   - 'description' A string with a short description of what the wrapper does.
+ *   - 'type' (Optional) A bitmask of flags indicating what type of streams this
+ *     wrapper will access - local or remote, readable and/or writeable, etc.
+ *     Many shortcut constants are defined in stream_wrappers.inc. Defaults to
+ *     STREAM_WRAPPERS_NORMAL which includes all of these bit flags:
+ *     - STREAM_WRAPPERS_READ
+ *     - STREAM_WRAPPERS_WRITE
+ *     - STREAM_WRAPPERS_VISIBLE
+ *
+ * @see file_get_stream_wrappers()
+ * @see hook_stream_wrappers_alter()
+ * @see system_stream_wrappers()
+ */
+function hook_stream_wrappers() {
+  return array(
+    'public' => array(
+      'name' => t('Public files'),
+      'class' => 'DrupalPublicStreamWrapper',
+      'description' => t('Public local files served by the webserver.'),
+      'type' => STREAM_WRAPPERS_LOCAL_NORMAL,
+    ),
+    'private' => array(
+      'name' => t('Private files'),
+      'class' => 'DrupalPrivateStreamWrapper',
+      'description' => t('Private local files served by Drupal.'),
+      'type' => STREAM_WRAPPERS_LOCAL_NORMAL,
+    ),
+    'temp' => array(
+      'name' => t('Temporary files'),
+      'class' => 'DrupalTempStreamWrapper',
+      'description' => t('Temporary local files for upload and previews.'),
+      'type' => STREAM_WRAPPERS_LOCAL_HIDDEN,
+    ),
+    'cdn' => array(
+      'name' => t('Content delivery network files'),
+      'class' => 'MyModuleCDNStreamWrapper',
+      'description' => t('Files served by a content delivery network.'),
+      // 'type' can be omitted to use the default of STREAM_WRAPPERS_NORMAL
+    ),
+    'youtube' => array(
+      'name' => t('YouTube video'),
+      'class' => 'MyModuleYouTubeStreamWrapper',
+      'description' => t('Video streamed from YouTube.'),
+      // A module implementing YouTube integration may decide to support using
+      // the YouTube API for uploading video, but here, we assume that this
+      // particular module only supports playing YouTube video.
+      'type' => STREAM_WRAPPERS_READ_VISIBLE,
+    ),
+  );
+}
+
+/**
+ * Alters the list of PHP stream wrapper implementations.
+ *
+ * @see file_get_stream_wrappers()
+ * @see hook_stream_wrappers()
+ */
+function hook_stream_wrappers_alter(&$wrappers) {
+  // Change the name of private files to reflect the performance.
+  $wrappers['private']['name'] = t('Slow files');
+}
+
+/**
+ * Load additional information into file objects.
+ *
+ * file_load_multiple() calls this hook to allow modules to load
+ * additional information into each file.
+ *
+ * @param $files
+ *   An array of file objects, indexed by fid.
+ *
+ * @see file_load_multiple()
+ * @see file_load()
+ */
+function hook_file_load($files) {
+  // Add the upload specific data into the file object.
+  $result = db_query('SELECT * FROM {upload} u WHERE u.fid IN (:fids)', array(':fids' => array_keys($files)))->fetchAll(PDO::FETCH_ASSOC);
+  foreach ($result as $record) {
+    foreach ($record as $key => $value) {
+      $files[$record['fid']]->$key = $value;
+    }
+  }
+}
+
+/**
+ * Check that files meet a given criteria.
+ *
+ * This hook lets modules perform additional validation on files. They're able
+ * to report a failure by returning one or more error messages.
+ *
+ * @param $file
+ *   The file object being validated.
+ * @return
+ *   An array of error messages. If there are no problems with the file return
+ *   an empty array.
+ *
+ * @see file_validate()
+ */
+function hook_file_validate($file) {
+  $errors = array();
+
+  if (empty($file->filename)) {
+    $errors[] = t("The file's name is empty. Please give a name to the file.");
+  }
+  if (strlen($file->filename) > 255) {
+    $errors[] = t("The file's name exceeds the 255 characters limit. Please rename the file and try again.");
+  }
+
+  return $errors;
+}
+
+/**
+ * Act on a file being inserted or updated.
+ *
+ * This hook is called when a file has been added to the database. The hook
+ * doesn't distinguish between files created as a result of a copy or those
+ * created by an upload.
+ *
+ * @param $file
+ *   The file that has just been created.
+ *
+ * @see file_save()
+ */
+function hook_file_presave($file) {
+  // Change the file timestamp to an hour prior.
+  $file->timestamp -= 3600;
+}
+
+/**
+ * Respond to a file being added.
+ *
+ * This hook is called after a file has been added to the database. The hook
+ * doesn't distinguish between files created as a result of a copy or those
+ * created by an upload.
+ *
+ * @param $file
+ *   The file that has been added.
+ *
+ * @see file_save()
+ */
+function hook_file_insert($file) {
+  // Add a message to the log, if the file is a jpg
+  $validate = file_validate_extensions($file, 'jpg');
+  if (empty($validate)) {
+    watchdog('file', 'A jpg has been added.');
+  }
+}
+
+/**
+ * Respond to a file being updated.
+ *
+ * This hook is called when file_save() is called on an existing file.
+ *
+ * @param $file
+ *   The file that has just been updated.
+ *
+ * @see file_save()
+ */
+function hook_file_update($file) {
+  $file_user = user_load($file->uid);
+  // Make sure that the file name starts with the owner's user name.
+  if (strpos($file->filename, $file_user->name) !== 0) {
+    $old_filename = $file->filename;
+    $file->filename = $file_user->name . '_' . $file->filename;
+    $file->save();
+
+    watchdog('file', t('%source has been renamed to %destination', array('%source' => $old_filename, '%destination' => $file->filename)));
+  }
+}
+
+/**
+ * Respond to a file that has been copied.
+ *
+ * @param $file
+ *   The newly copied file object.
+ * @param $source
+ *   The original file before the copy.
+ *
+ * @see file_copy()
+ */
+function hook_file_copy($file, $source) {
+  $file_user = user_load($file->uid);
+  // Make sure that the file name starts with the owner's user name.
+  if (strpos($file->filename, $file_user->name) !== 0) {
+    $file->filename = $file_user->name . '_' . $file->filename;
+    $file->save();
+
+    watchdog('file', t('Copied file %source has been renamed to %destination', array('%source' => $source->filename, '%destination' => $file->filename)));
+  }
+}
+
+/**
+ * Respond to a file that has been moved.
+ *
+ * @param $file
+ *   The updated file object after the move.
+ * @param $source
+ *   The original file object before the move.
+ *
+ * @see file_move()
+ */
+function hook_file_move($file, $source) {
+  $file_user = user_load($file->uid);
+  // Make sure that the file name starts with the owner's user name.
+  if (strpos($file->filename, $file_user->name) !== 0) {
+    $file->filename = $file_user->name . '_' . $file->filename;
+    $file->save();
+
+    watchdog('file', t('Moved file %source has been renamed to %destination', array('%source' => $source->filename, '%destination' => $file->filename)));
+  }
+}
+
+/**
+ * Respond to a file being deleted.
+ *
+ * @param $file
+ *   The file that has just been deleted.
+ *
+ * @see file_delete()
+ */
+function hook_file_delete($file) {
+  // Delete all information associated with the file.
+  db_delete('upload')->condition('fid', $file->fid)->execute();
+}
+
+/**
+ * Control access to private file downloads and specify HTTP headers.
+ *
+ * This hook allows modules enforce permissions on file downloads when the
+ * private file download method is selected. Modules can also provide headers
+ * to specify information like the file's name or MIME type.
+ *
+ * @param $uri
+ *   The URI of the file.
+ * @return
+ *   If the user does not have permission to access the file, return -1. If the
+ *   user has permission, return an array with the appropriate headers. If the
+ *   file is not controlled by the current module, the return value should be
+ *   NULL.
+ *
+ * @see file_download()
+ */
+function hook_file_download($uri) {
+  // Check if the file is controlled by the current module.
+  if (!file_prepare_directory($uri)) {
+    $uri = FALSE;
+  }
+  if (strpos(file_uri_target($uri), variable_get('user_picture_path', 'pictures') . '/picture-') === 0) {
+    if (!user_access('access user profiles')) {
+      // Access to the file is denied.
+      return -1;
+    }
+    else {
+      $info = image_get_info($uri);
+      return array('Content-Type' => $info['mime_type']);
+    }
+  }
+}
+
+/**
+ * Alter the URL to a file.
+ *
+ * This hook is called from file_create_url(), and  is called fairly
+ * frequently (10+ times per page), depending on how many files there are in a
+ * given page.
+ * If CSS and JS aggregation are disabled, this can become very frequently
+ * (50+ times per page) so performance is critical.
+ *
+ * This function should alter the URI, if it wants to rewrite the file URL.
+ *
+ * @param $uri
+ *   The URI to a file for which we need an external URL, or the path to a
+ *   shipped file.
+ */
+function hook_file_url_alter(&$uri) {
+  global $user;
+
+  // User 1 will always see the local file in this example.
+  if ($user->uid == 1) {
+    return;
+  }
+
+  $cdn1 = 'http://cdn1.example.com';
+  $cdn2 = 'http://cdn2.example.com';
+  $cdn_extensions = array('css', 'js', 'gif', 'jpg', 'jpeg', 'png');
+
+  // Most CDNs don't support private file transfers without a lot of hassle,
+  // so don't support this in the common case.
+  $schemes = array('public');
+
+  $scheme = file_uri_scheme($uri);
+
+  // Only serve shipped files and public created files from the CDN.
+  if (!$scheme || in_array($scheme, $schemes)) {
+    // Shipped files.
+    if (!$scheme) {
+      $path = $uri;
+    }
+    // Public created files.
+    else {
+      $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme);
+      $path = $wrapper->getDirectoryPath() . '/' . file_uri_target($uri);
+    }
+
+    // Clean up Windows paths.
+    $path = str_replace('\\', '/', $path);
+
+    // Serve files with one of the CDN extensions from CDN 1, all others from
+    // CDN 2.
+    $pathinfo = pathinfo($path);
+    if (isset($pathinfo['extension']) && in_array($pathinfo['extension'], $cdn_extensions)) {
+      $uri = $cdn1 . '/' . $path;
+    }
+    else {
+      $uri = $cdn2 . '/' . $path;
+    }
+  }
+}
+
+/**
+ * Check installation requirements and do status reporting.
+ *
+ * This hook has three closely related uses, determined by the $phase argument:
+ * - Checking installation requirements ($phase == 'install').
+ * - Checking update requirements ($phase == 'update').
+ * - Status reporting ($phase == 'runtime').
+ *
+ * Note that this hook, like all others dealing with installation and updates,
+ * must reside in a module_name.install file, or it will not properly abort
+ * the installation of the module if a critical requirement is missing.
+ *
+ * During the 'install' phase, modules can for example assert that
+ * library or server versions are available or sufficient.
+ * Note that the installation of a module can happen during installation of
+ * Drupal itself (by install.php) with an installation profile or later by hand.
+ * As a consequence, install-time requirements must be checked without access
+ * to the full Drupal API, because it is not available during install.php.
+ * For localization you should for example use $t = get_t() to
+ * retrieve the appropriate localization function name (t() or st()).
+ * If a requirement has a severity of REQUIREMENT_ERROR, install.php will abort
+ * or at least the module will not install.
+ * Other severity levels have no effect on the installation.
+ * Module dependencies do not belong to these installation requirements,
+ * but should be defined in the module's .info file.
+ *
+ * The 'runtime' phase is not limited to pure installation requirements
+ * but can also be used for more general status information like maintenance
+ * tasks and security issues.
+ * The returned 'requirements' will be listed on the status report in the
+ * administration section, with indication of the severity level.
+ * Moreover, any requirement with a severity of REQUIREMENT_ERROR severity will
+ * result in a notice on the administration configuration page.
+ *
+ * @param $phase
+ *   The phase in which requirements are checked:
+ *   - install: The module is being installed.
+ *   - update: The module is enabled and update.php is run.
+ *   - runtime: The runtime requirements are being checked and shown on the
+ *     status report page.
+ *
+ * @return
+ *   An associative array where the keys are arbitrary but must be unique (it
+ *   is suggested to use the module short name as a prefix) and the values are
+ *   themselves associative arrays with the following elements:
+ *   - title: The name of the requirement.
+ *   - value: The current value (e.g., version, time, level, etc). During
+ *     install phase, this should only be used for version numbers, do not set
+ *     it if not applicable.
+ *   - description: The description of the requirement/status.
+ *   - severity: The requirement's result/severity level, one of:
+ *     - REQUIREMENT_INFO: For info only.
+ *     - REQUIREMENT_OK: The requirement is satisfied.
+ *     - REQUIREMENT_WARNING: The requirement failed with a warning.
+ *     - REQUIREMENT_ERROR: The requirement failed with an error.
+ */
+function hook_requirements($phase) {
+  $requirements = array();
+  // Ensure translations don't break during installation.
+  $t = get_t();
+
+  // Report Drupal version
+  if ($phase == 'runtime') {
+    $requirements['drupal'] = array(
+      'title' => $t('Drupal'),
+      'value' => VERSION,
+      'severity' => REQUIREMENT_INFO
+    );
+  }
+
+  // Test PHP version
+  $requirements['php'] = array(
+    'title' => $t('PHP'),
+    'value' => ($phase == 'runtime') ? l(phpversion(), 'admin/reports/status/php') : phpversion(),
+  );
+  if (version_compare(phpversion(), DRUPAL_MINIMUM_PHP) < 0) {
+    $requirements['php']['description'] = $t('Your PHP installation is too old. Drupal requires at least PHP %version.', array('%version' => DRUPAL_MINIMUM_PHP));
+    $requirements['php']['severity'] = REQUIREMENT_ERROR;
+  }
+
+  // Report cron status
+  if ($phase == 'runtime') {
+    $cron_last = variable_get('cron_last');
+
+    if (is_numeric($cron_last)) {
+      $requirements['cron']['value'] = $t('Last run !time ago', array('!time' => format_interval(REQUEST_TIME - $cron_last)));
+    }
+    else {
+      $requirements['cron'] = array(
+        'description' => $t('Cron has not run. It appears cron jobs have not been setup on your system. Check the help pages for <a href="@url">configuring cron jobs</a>.', array('@url' => 'http://drupal.org/cron')),
+        'severity' => REQUIREMENT_ERROR,
+        'value' => $t('Never run'),
+      );
+    }
+
+    $requirements['cron']['description'] .= ' ' . $t('You can <a href="@cron">run cron manually</a>.', array('@cron' => url('admin/reports/status/run-cron')));
+
+    $requirements['cron']['title'] = $t('Cron maintenance tasks');
+  }
+
+  return $requirements;
+}
+
+/**
+ * Define the current version of the database schema.
+ *
+ * A Drupal schema definition is an array structure representing one or more
+ * tables and their related keys and indexes. A schema is defined by
+ * hook_schema() which must live in your module's .install file.
+ *
+ * This hook is called at install and uninstall time, and in the latter case, it
+ * cannot rely on the .module file being loaded or hooks being known. If the
+ * .module file is needed, it may be loaded with drupal_load().
+ *
+ * The tables declared by this hook will be automatically created when the
+ * module is first enabled, and removed when the module is uninstalled. This
+ * happens before hook_install() is invoked, and after hook_uninstall() is
+ * invoked, respectively.
+ *
+ * By declaring the tables used by your module via an implementation of
+ * hook_schema(), these tables will be available on all supported database
+ * engines. You don't have to deal with the different SQL dialects for table
+ * creation and alteration of the supported database engines.
+ *
+ * See the Schema API Handbook at http://drupal.org/node/146843 for details on
+ * schema definition structures.
+ *
+ * @return array
+ *   A schema definition structure array. For each element of the
+ *   array, the key is a table name and the value is a table structure
+ *   definition.
+ *
+ * @see hook_schema_alter()
+ *
+ * @ingroup schemaapi
+ */
+function hook_schema() {
+  $schema['node'] = array(
+    // Example (partial) specification for table "node".
+    'description' => 'The base table for nodes.',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The primary identifier for a node.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'vid' => array(
+        'description' => 'The current {node_revision}.vid version identifier.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'type' => array(
+        'description' => 'The {node_type} of this node.',
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'title' => array(
+        'description' => 'The title of this node, always treated as non-markup plain text.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+    ),
+    'indexes' => array(
+      'node_changed'        => array('changed'),
+      'node_created'        => array('created'),
+    ),
+    'unique keys' => array(
+      'nid_vid' => array('nid', 'vid'),
+      'vid'     => array('vid'),
+    ),
+    'foreign keys' => array(
+      'node_revision' => array(
+        'table' => 'node_revision',
+        'columns' => array('vid' => 'vid'),
+      ),
+      'node_author' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid'),
+      ),
+    ),
+    'primary key' => array('nid'),
+  );
+  return $schema;
+}
+
+/**
+ * Perform alterations to existing database schemas.
+ *
+ * When a module modifies the database structure of another module (by
+ * changing, adding or removing fields, keys or indexes), it should
+ * implement hook_schema_alter() to update the default $schema to take its
+ * changes into account.
+ *
+ * See hook_schema() for details on the schema definition structure.
+ *
+ * @param $schema
+ *   Nested array describing the schemas for all modules.
+ *
+ * @ingroup schemaapi
+ */
+function hook_schema_alter(&$schema) {
+  // Add field to existing schema.
+  $schema['users']['fields']['timezone_id'] = array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'description' => 'Per-user timezone configuration.',
+  );
+}
+
+/**
+ * Perform alterations to a structured query.
+ *
+ * Structured (aka dynamic) queries that have tags associated may be altered by any module
+ * before the query is executed.
+ *
+ * @param $query
+ *   A Query object describing the composite parts of a SQL query.
+ *
+ * @see hook_query_TAG_alter()
+ * @see node_query_node_access_alter()
+ * @see QueryAlterableInterface
+ * @see SelectQueryInterface
+ */
+function hook_query_alter(QueryAlterableInterface $query) {
+  if ($query->hasTag('micro_limit')) {
+    $query->range(0, 2);
+  }
+}
+
+/**
+ * Perform alterations to a structured query for a given tag.
+ *
+ * @param $query
+ *   An Query object describing the composite parts of a SQL query.
+ *
+ * @see hook_query_alter()
+ * @see node_query_node_access_alter()
+ * @see QueryAlterableInterface
+ * @see SelectQueryInterface
+ */
+function hook_query_TAG_alter(QueryAlterableInterface $query) {
+  // Skip the extra expensive alterations if site has no node access control modules.
+  if (!node_access_view_all_nodes()) {
+    // Prevent duplicates records.
+    $query->distinct();
+    // The recognized operations are 'view', 'update', 'delete'.
+    if (!$op = $query->getMetaData('op')) {
+      $op = 'view';
+    }
+    // Skip the extra joins and conditions for node admins.
+    if (!user_access('bypass node access')) {
+      // The node_access table has the access grants for any given node.
+      $access_alias = $query->join('node_access', 'na', '%alias.nid = n.nid');
+      $or = db_or();
+      // If any grant exists for the specified user, then user has access to the node for the specified operation.
+      foreach (node_access_grants($op, $query->getMetaData('account')) as $realm => $gids) {
+        foreach ($gids as $gid) {
+          $or->condition(db_and()
+            ->condition($access_alias . '.gid', $gid)
+            ->condition($access_alias . '.realm', $realm)
+          );
+        }
+      }
+
+      if (count($or->conditions())) {
+        $query->condition($or);
+      }
+
+      $query->condition($access_alias . 'grant_' . $op, 1, '>=');
+    }
+  }
+}
+
+/**
+ * Perform setup tasks when the module is installed.
+ *
+ * If the module implements hook_schema(), the database tables will
+ * be created before this hook is fired.
+ *
+ * Implementations of this hook are by convention declared in the module's
+ * .install file. The implementation can rely on the .module file being loaded.
+ * The hook will only be called the first time a module is enabled or after it
+ * is re-enabled after being uninstalled. The module's schema version will be
+ * set to the module's greatest numbered update hook. Because of this, any time
+ * a hook_update_N() is added to the module, this function needs to be updated
+ * to reflect the current version of the database schema.
+ *
+ * See the @link http://drupal.org/node/146843 Schema API documentation @endlink
+ * for details on hook_schema and how database tables are defined.
+ *
+ * Note that since this function is called from a full bootstrap, all functions
+ * (including those in modules enabled by the current page request) are
+ * available when this hook is called. Use cases could be displaying a user
+ * message, or calling a module function necessary for initial setup, etc.
+ *
+ * Please be sure that anything added or modified in this function that can
+ * be removed during uninstall should be removed with hook_uninstall().
+ *
+ * @see hook_schema()
+ * @see module_enable()
+ * @see hook_enable()
+ * @see hook_disable()
+ * @see hook_uninstall()
+ * @see hook_modules_installed()
+ */
+function hook_install() {
+  // Populate the default {node_access} record.
+  db_insert('node_access')
+    ->fields(array(
+      'nid' => 0,
+      'gid' => 0,
+      'realm' => 'all',
+      'grant_view' => 1,
+      'grant_update' => 0,
+      'grant_delete' => 0,
+    ))
+    ->execute();
+}
+
+/**
+ * Perform a single update.
+ *
+ * For each change that requires one or more actions to be performed when
+ * updating a site, add a new hook_update_N(), which will be called by
+ * update.php. The documentation block preceding this function is stripped of
+ * newlines and used as the description for the update on the pending updates
+ * task list. Schema updates should adhere to the
+ * @link http://drupal.org/node/150215 Schema API. @endlink
+ *
+ * Implementations of hook_update_N() are named (module name)_update_(number).
+ * The numbers are composed of three parts:
+ * - 1 digit for Drupal core compatibility.
+ * - 1 digit for your module's major release version (e.g., is this the 7.x-1.*
+ *   (1) or 7.x-2.* (2) series of your module?). This digit should be 0 for
+ *   initial porting of your module to a new Drupal core API.
+ * - 2 digits for sequential counting, starting with 00.
+ *
+ * Examples:
+ * - mymodule_update_7000(): This is the required update for mymodule to run
+ *   with Drupal core API 7.x when upgrading from Drupal core API 6.x.
+ * - mymodule_update_7100(): This is the first update to get the database ready
+ *   to run mymodule 7.x-1.*.
+ * - mymodule_update_7200(): This is the first update to get the database ready
+ *   to run mymodule 7.x-2.*. Users can directly update from 6.x-2.* to 7.x-2.*
+ *   and they get all 70xx and 72xx updates, but not 71xx updates, because
+ *   those reside in the 7.x-1.x branch only.
+ *
+ * A good rule of thumb is to remove updates older than two major releases of
+ * Drupal. See hook_update_last_removed() to notify Drupal about the removals.
+ * For further information about releases and release numbers see:
+ * @link http://drupal.org/node/711070 Maintaining a drupal.org project with Git @endlink
+ *
+ * Never renumber update functions.
+ *
+ * Implementations of this hook should be placed in a mymodule.install file in
+ * the same directory as mymodule.module. Drupal core's updates are implemented
+ * using the system module as a name and stored in database/updates.inc.
+ *
+ * Not all module functions are available from within a hook_update_N() function.
+ * In order to call a function from your mymodule.module or an include file,
+ * you need to explicitly load that file first.
+ *
+ * During database updates the schema of any module could be out of date. For
+ * this reason, caution is needed when using any API function within an update
+ * function - particularly CRUD functions, functions that depend on the schema
+ * (for example by using drupal_write_record()), and any functions that invoke
+ * hooks. See @link update_api Update versions of API functions @endlink for
+ * details.
+ *
+ * If your update task is potentially time-consuming, you'll need to implement a
+ * multipass update to avoid PHP timeouts. Multipass updates use the $sandbox
+ * parameter provided by the batch API (normally, $context['sandbox']) to store
+ * information between successive calls, and the $sandbox['#finished'] value
+ * to provide feedback regarding completion level.
+ *
+ * See the batch operations page for more information on how to use the
+ * @link http://drupal.org/node/180528 Batch API. @endlink
+ *
+ * @param $sandbox
+ *   Stores information for multipass updates. See above for more information.
+ *
+ * @throws DrupalUpdateException, PDOException
+ *   In case of error, update hooks should throw an instance of DrupalUpdateException
+ *   with a meaningful message for the user. If a database query fails for whatever
+ *   reason, it will throw a PDOException.
+ *
+ * @return
+ *   Optionally, update hooks may return a translated string that will be
+ *   displayed to the user after the update has completed. If no message is
+ *   returned, no message will be presented to the user.
+ *
+ * @see batch
+ * @see schemaapi
+ * @see update_api
+ * @see hook_update_last_removed()
+ * @see update_get_update_list()
+ */
+function hook_update_N(&$sandbox) {
+  // For non-multipass updates, the signature can simply be;
+  // function hook_update_N() {
+
+  // For most updates, the following is sufficient.
+  db_add_field('mytable1', 'newcol', array('type' => 'int', 'not null' => TRUE, 'description' => 'My new integer column.'));
+
+  // However, for more complex operations that may take a long time,
+  // you may hook into Batch API as in the following example.
+
+  // Update 3 users at a time to have an exclamation point after their names.
+  // (They're really happy that we can do batch API in this hook!)
+  if (!isset($sandbox['progress'])) {
+    $sandbox['progress'] = 0;
+    $sandbox['current_uid'] = 0;
+    // We'll -1 to disregard the uid 0...
+    $sandbox['max'] = db_query('SELECT COUNT(DISTINCT uid) FROM {users}')->fetchField() - 1;
+  }
+
+  $users = db_select('users', 'u')
+    ->fields('u', array('uid', 'name'))
+    ->condition('uid', $sandbox['current_uid'], '>')
+    ->range(0, 3)
+    ->orderBy('uid', 'ASC')
+    ->execute();
+
+  foreach ($users as $user) {
+    $user->name .= '!';
+    db_update('users')
+      ->fields(array('name' => $user->name))
+      ->condition('uid', $user->uid)
+      ->execute();
+
+    $sandbox['progress']++;
+    $sandbox['current_uid'] = $user->uid;
+  }
+
+  $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);
+
+  // To display a message to the user when the update is completed, return it.
+  // If you do not want to display a completion message, simply return nothing.
+  return t('The update did what it was supposed to do.');
+
+  // In case of an error, simply throw an exception with an error message.
+  throw new DrupalUpdateException('Something went wrong; here is what you should do.');
+}
+
+/**
+ * Return an array of information about module update dependencies.
+ *
+ * This can be used to indicate update functions from other modules that your
+ * module's update functions depend on, or vice versa. It is used by the update
+ * system to determine the appropriate order in which updates should be run, as
+ * well as to search for missing dependencies.
+ *
+ * Implementations of this hook should be placed in a mymodule.install file in
+ * the same directory as mymodule.module.
+ *
+ * @return
+ *   A multidimensional array containing information about the module update
+ *   dependencies. The first two levels of keys represent the module and update
+ *   number (respectively) for which information is being returned, and the
+ *   value is an array of information about that update's dependencies. Within
+ *   this array, each key represents a module, and each value represents the
+ *   number of an update function within that module. In the event that your
+ *   update function depends on more than one update from a particular module,
+ *   you should always list the highest numbered one here (since updates within
+ *   a given module always run in numerical order).
+ *
+ * @see update_resolve_dependencies()
+ * @see hook_update_N()
+ */
+function hook_update_dependencies() {
+  // Indicate that the mymodule_update_7000() function provided by this module
+  // must run after the another_module_update_7002() function provided by the
+  // 'another_module' module.
+  $dependencies['mymodule'][7000] = array(
+    'another_module' => 7002,
+  );
+  // Indicate that the mymodule_update_7001() function provided by this module
+  // must run before the yet_another_module_update_7004() function provided by
+  // the 'yet_another_module' module. (Note that declaring dependencies in this
+  // direction should be done only in rare situations, since it can lead to the
+  // following problem: If a site has already run the yet_another_module
+  // module's database updates before it updates its codebase to pick up the
+  // newest mymodule code, then the dependency declared here will be ignored.)
+  $dependencies['yet_another_module'][7004] = array(
+    'mymodule' => 7001,
+  );
+  return $dependencies;
+}
+
+/**
+ * Return a number which is no longer available as hook_update_N().
+ *
+ * If you remove some update functions from your mymodule.install file, you
+ * should notify Drupal of those missing functions. This way, Drupal can
+ * ensure that no update is accidentally skipped.
+ *
+ * Implementations of this hook should be placed in a mymodule.install file in
+ * the same directory as mymodule.module.
+ *
+ * @return
+ *   An integer, corresponding to hook_update_N() which has been removed from
+ *   mymodule.install.
+ *
+ * @see hook_update_N()
+ */
+function hook_update_last_removed() {
+  // We've removed the 5.x-1.x version of mymodule, including database updates.
+  // The next update function is mymodule_update_5200().
+  return 5103;
+}
+
+/**
+ * Remove any information that the module sets.
+ *
+ * The information that the module should remove includes:
+ * - variables that the module has set using variable_set() or system_settings_form()
+ * - modifications to existing tables
+ *
+ * The module should not remove its entry from the {system} table. Database
+ * tables defined by hook_schema() will be removed automatically.
+ *
+ * The uninstall hook must be implemented in the module's .install file. It
+ * will fire when the module gets uninstalled but before the module's database
+ * tables are removed, allowing your module to query its own tables during
+ * this routine.
+ *
+ * When hook_uninstall() is called, your module will already be disabled, so
+ * its .module file will not be automatically included. If you need to call API
+ * functions from your .module file in this hook, use drupal_load() to make
+ * them available. (Keep this usage to a minimum, though, especially when
+ * calling API functions that invoke hooks, or API functions from modules
+ * listed as dependencies, since these may not be available or work as expected
+ * when the module is disabled.)
+ *
+ * @see hook_install()
+ * @see hook_schema()
+ * @see hook_disable()
+ * @see hook_modules_uninstalled()
+ */
+function hook_uninstall() {
+  variable_del('upload_file_types');
+}
+
+/**
+ * Perform necessary actions after module is enabled.
+ *
+ * The hook is called every time the module is enabled. It should be
+ * implemented in the module's .install file. The implementation can
+ * rely on the .module file being loaded.
+ *
+ * @see module_enable()
+ * @see hook_install()
+ * @see hook_modules_enabled()
+ */
+function hook_enable() {
+  mymodule_cache_rebuild();
+}
+
+/**
+ * Perform necessary actions before module is disabled.
+ *
+ * The hook is called every time the module is disabled. It should be
+ * implemented in the module's .install file. The implementation can rely
+ * on the .module file being loaded.
+ *
+ * @see hook_uninstall()
+ * @see hook_modules_disabled()
+ */
+function hook_disable() {
+  mymodule_cache_rebuild();
+}
+
+/**
+ * Perform necessary alterations to the list of files parsed by the registry.
+ *
+ * Modules can manually modify the list of files before the registry parses
+ * them. The $modules array provides the .info file information, which includes
+ * the list of files registered to each module. Any files in the list can then
+ * be added to the list of files that the registry will parse, or modify
+ * attributes of a file.
+ *
+ * A necessary alteration made by the core SimpleTest module is to force .test
+ * files provided by disabled modules into the list of files parsed by the
+ * registry.
+ *
+ * @param $files
+ *   List of files to be parsed by the registry. The list will contain
+ *   files found in each enabled module's info file and the core includes
+ *   directory. The array is keyed by the file path and contains an array of
+ *   the related module's name and weight as used internally by
+ *   _registry_update() and related functions.
+ *
+ *   For example:
+ *   @code
+ *     $files["modules/system/system.module"] = array(
+ *       'module' => 'system',
+ *       'weight' => 0,
+ *     );
+ *   @endcode
+ * @param $modules
+ *   An array containing all module information stored in the {system} table.
+ *   Each element of the array also contains the module's .info file
+ *   information in the property 'info'. An additional 'dir' property has been
+ *   added to the module information which provides the path to the directory
+ *   in which the module resides. The example shows how to take advantage of
+ *   both properties.
+ *
+ * @see _registry_update()
+ * @see simpletest_test_get_all()
+ */
+function hook_registry_files_alter(&$files, $modules) {
+  foreach ($modules as $module) {
+    // Only add test files for disabled modules, as enabled modules should
+    // already include any test files they provide.
+    if (!$module->status) {
+      $dir = $module->dir;
+      foreach ($module->info['files'] as $file) {
+        if (substr($file, -5) == '.test') {
+          $files["$dir/$file"] = array('module' => $module->name, 'weight' => $module->weight);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Return an array of tasks to be performed by an installation profile.
+ *
+ * Any tasks you define here will be run, in order, after the installer has
+ * finished the site configuration step but before it has moved on to the
+ * final import of languages and the end of the installation. You can have any
+ * number of custom tasks to perform during this phase.
+ *
+ * Each task you define here corresponds to a callback function which you must
+ * separately define and which is called when your task is run. This function
+ * will receive the global installation state variable, $install_state, as
+ * input, and has the opportunity to access or modify any of its settings. See
+ * the install_state_defaults() function in the installer for the list of
+ * $install_state settings used by Drupal core.
+ *
+ * At the end of your task function, you can indicate that you want the
+ * installer to pause and display a page to the user by returning any themed
+ * output that should be displayed on that page (but see below for tasks that
+ * use the form API or batch API; the return values of these task functions are
+ * handled differently). You should also use drupal_set_title() within the task
+ * callback function to set a custom page title. For some tasks, however, you
+ * may want to simply do some processing and pass control to the next task
+ * without ending the page request; to indicate this, simply do not send back
+ * a return value from your task function at all. This can be used, for
+ * example, by installation profiles that need to configure certain site
+ * settings in the database without obtaining any input from the user.
+ *
+ * The task function is treated specially if it defines a form or requires
+ * batch processing; in that case, you should return either the form API
+ * definition or batch API array, as appropriate. See below for more
+ * information on the 'type' key that you must define in the task definition
+ * to inform the installer that your task falls into one of those two
+ * categories. It is important to use these APIs directly, since the installer
+ * may be run non-interactively (for example, via a command line script), all
+ * in one page request; in that case, the installer will automatically take
+ * care of submitting forms and processing batches correctly for both types of
+ * installations. You can inspect the $install_state['interactive'] boolean to
+ * see whether or not the current installation is interactive, if you need
+ * access to this information.
+ *
+ * Remember that a user installing Drupal interactively will be able to reload
+ * an installation page multiple times, so you should use variable_set() and
+ * variable_get() if you are collecting any data that you need to store and
+ * inspect later. It is important to remove any temporary variables using
+ * variable_del() before your last task has completed and control is handed
+ * back to the installer.
+ *
+ * @param array $install_state
+ *   An array of information about the current installation state.
+ *
+ * @return array
+ *   A keyed array of tasks the profile will perform during the final stage of
+ *   the installation. Each key represents the name of a function (usually a
+ *   function defined by this profile, although that is not strictly required)
+ *   that is called when that task is run. The values are associative arrays
+ *   containing the following key-value pairs (all of which are optional):
+ *   - display_name: The human-readable name of the task. This will be
+ *     displayed to the user while the installer is running, along with a list
+ *     of other tasks that are being run. Leave this unset to prevent the task
+ *     from appearing in the list.
+ *   - display: This is a boolean which can be used to provide finer-grained
+ *     control over whether or not the task will display. This is mostly useful
+ *     for tasks that are intended to display only under certain conditions;
+ *     for these tasks, you can set 'display_name' to the name that you want to
+ *     display, but then use this boolean to hide the task only when certain
+ *     conditions apply.
+ *   - type: A string representing the type of task. This parameter has three
+ *     possible values:
+ *     - normal: (default) This indicates that the task will be treated as a
+ *       regular callback function, which does its processing and optionally
+ *       returns HTML output.
+ *     - batch: This indicates that the task function will return a batch API
+ *       definition suitable for batch_set(). The installer will then take care
+ *       of automatically running the task via batch processing.
+ *     - form: This indicates that the task function will return a standard
+ *       form API definition (and separately define validation and submit
+ *       handlers, as appropriate). The installer will then take care of
+ *       automatically directing the user through the form submission process.
+ *   - run: A constant representing the manner in which the task will be run.
+ *     This parameter has three possible values:
+ *     - INSTALL_TASK_RUN_IF_NOT_COMPLETED: (default) This indicates that the
+ *       task will run once during the installation of the profile.
+ *     - INSTALL_TASK_SKIP: This indicates that the task will not run during
+ *       the current installation page request. It can be used to skip running
+ *       an installation task when certain conditions are met, even though the
+ *       task may still show on the list of installation tasks presented to the
+ *       user.
+ *     - INSTALL_TASK_RUN_IF_REACHED: This indicates that the task will run on
+ *       each installation page request that reaches it. This is rarely
+ *       necessary for an installation profile to use; it is primarily used by
+ *       the Drupal installer for bootstrap-related tasks.
+ *   - function: Normally this does not need to be set, but it can be used to
+ *     force the installer to call a different function when the task is run
+ *     (rather than the function whose name is given by the array key). This
+ *     could be used, for example, to allow the same function to be called by
+ *     two different tasks.
+ *
+ * @see install_state_defaults()
+ * @see batch_set()
+ */
+function hook_install_tasks(&$install_state) {
+  // Here, we define a variable to allow tasks to indicate that a particular,
+  // processor-intensive batch process needs to be triggered later on in the
+  // installation.
+  $myprofile_needs_batch_processing = variable_get('myprofile_needs_batch_processing', FALSE);
+  $tasks = array(
+    // This is an example of a task that defines a form which the user who is
+    // installing the site will be asked to fill out. To implement this task,
+    // your profile would define a function named myprofile_data_import_form()
+    // as a normal form API callback function, with associated validation and
+    // submit handlers. In the submit handler, in addition to saving whatever
+    // other data you have collected from the user, you might also call
+    // variable_set('myprofile_needs_batch_processing', TRUE) if the user has
+    // entered data which requires that batch processing will need to occur
+    // later on.
+    'myprofile_data_import_form' => array(
+      'display_name' => st('Data import options'),
+      'type' => 'form',
+    ),
+    // Similarly, to implement this task, your profile would define a function
+    // named myprofile_settings_form() with associated validation and submit
+    // handlers. This form might be used to collect and save additional
+    // information from the user that your profile needs. There are no extra
+    // steps required for your profile to act as an "installation wizard"; you
+    // can simply define as many tasks of type 'form' as you wish to execute,
+    // and the forms will be presented to the user, one after another.
+    'myprofile_settings_form' => array(
+      'display_name' => st('Additional options'),
+      'type' => 'form',
+    ),
+    // This is an example of a task that performs batch operations. To
+    // implement this task, your profile would define a function named
+    // myprofile_batch_processing() which returns a batch API array definition
+    // that the installer will use to execute your batch operations. Due to the
+    // 'myprofile_needs_batch_processing' variable used here, this task will be
+    // hidden and skipped unless your profile set it to TRUE in one of the
+    // previous tasks.
+    'myprofile_batch_processing' => array(
+      'display_name' => st('Import additional data'),
+      'display' => $myprofile_needs_batch_processing,
+      'type' => 'batch',
+      'run' => $myprofile_needs_batch_processing ? INSTALL_TASK_RUN_IF_NOT_COMPLETED : INSTALL_TASK_SKIP,
+    ),
+    // This is an example of a task that will not be displayed in the list that
+    // the user sees. To implement this task, your profile would define a
+    // function named myprofile_final_site_setup(), in which additional,
+    // automated site setup operations would be performed. Since this is the
+    // last task defined by your profile, you should also use this function to
+    // call variable_del('myprofile_needs_batch_processing') and clean up the
+    // variable that was used above. If you want the user to pass to the final
+    // Drupal installation tasks uninterrupted, return no output from this
+    // function. Otherwise, return themed output that the user will see (for
+    // example, a confirmation page explaining that your profile's tasks are
+    // complete, with a link to reload the current page and therefore pass on
+    // to the final Drupal installation tasks when the user is ready to do so).
+    'myprofile_final_site_setup' => array(
+    ),
+  );
+  return $tasks;
+}
+
+/**
+ * Change the page the user is sent to by drupal_goto().
+ *
+ * @param $path
+ *   A Drupal path or a full URL.
+ * @param $options
+ *   An associative array of additional URL options to pass to url().
+ * @param $http_response_code
+ *   The HTTP status code to use for the redirection. See drupal_goto() for more
+ *   information.
+ */
+function hook_drupal_goto_alter(&$path, &$options, &$http_response_code) {
+  // A good addition to misery module.
+  $http_response_code = 500;
+}
+
+/**
+ * Alter XHTML HEAD tags before they are rendered by drupal_get_html_head().
+ *
+ * Elements available to be altered are only those added using
+ * drupal_add_html_head_link() or drupal_add_html_head(). CSS and JS files
+ * are handled using drupal_add_css() and drupal_add_js(), so the head links
+ * for those files will not appear in the $head_elements array.
+ *
+ * @param $head_elements
+ *   An array of renderable elements. Generally the values of the #attributes
+ *   array will be the most likely target for changes.
+ */
+function hook_html_head_alter(&$head_elements) {
+  foreach ($head_elements as $key => $element) {
+    if (isset($element['#attributes']['rel']) && $element['#attributes']['rel'] == 'canonical') {
+      // I want a custom canonical URL.
+      $head_elements[$key]['#attributes']['href'] = mymodule_canonical_url();
+    }
+  }
+}
+
+/**
+ * Alter the full list of installation tasks.
+ *
+ * @param $tasks
+ *   An array of all available installation tasks, including those provided by
+ *   Drupal core. You can modify this array to change or replace any part of
+ *   the Drupal installation process that occurs after the installation profile
+ *   is selected.
+ * @param $install_state
+ *   An array of information about the current installation state.
+ */
+function hook_install_tasks_alter(&$tasks, $install_state) {
+  // Replace the "Choose language" installation task provided by Drupal core
+  // with a custom callback function defined by this installation profile.
+  $tasks['install_select_locale']['function'] = 'myprofile_locale_selection';
+}
+
+/**
+ * Alter MIME type mappings used to determine MIME type from a file extension.
+ *
+ * This hook is run when file_mimetype_mapping() is called. It is used to
+ * allow modules to add to or modify the default mapping from
+ * file_default_mimetype_mapping().
+ *
+ * @param $mapping
+ *   An array of mimetypes correlated to the extensions that relate to them.
+ *   The array has 'mimetypes' and 'extensions' elements, each of which is an
+ *   array.
+ *
+ * @see file_default_mimetype_mapping()
+ */
+function hook_file_mimetype_mapping_alter(&$mapping) {
+  // Add new MIME type 'drupal/info'.
+  $mapping['mimetypes']['example_info'] = 'drupal/info';
+  // Add new extension '.info' and map it to the 'drupal/info' MIME type.
+  $mapping['extensions']['info'] = 'example_info';
+  // Override existing extension mapping for '.ogg' files.
+  $mapping['extensions']['ogg'] = 189;
+}
+
+/**
+ * Declares information about actions.
+ *
+ * Any module can define actions, and then call actions_do() to make those
+ * actions happen in response to events. The trigger module provides a user
+ * interface for associating actions with module-defined triggers, and it makes
+ * sure the core triggers fire off actions when their events happen.
+ *
+ * An action consists of two or three parts:
+ * - an action definition (returned by this hook)
+ * - a function which performs the action (which by convention is named
+ *   MODULE_description-of-function_action)
+ * - an optional form definition function that defines a configuration form
+ *   (which has the name of the action function with '_form' appended to it.)
+ *
+ * The action function takes two to four arguments, which come from the input
+ * arguments to actions_do().
+ *
+ * @return
+ *   An associative array of action descriptions. The keys of the array
+ *   are the names of the action functions, and each corresponding value
+ *   is an associative array with the following key-value pairs:
+ *   - 'type': The type of object this action acts upon. Core actions have types
+ *     'node', 'user', 'comment', and 'system'.
+ *   - 'label': The human-readable name of the action, which should be passed
+ *     through the t() function for translation.
+ *   - 'configurable': If FALSE, then the action doesn't require any extra
+ *     configuration. If TRUE, then your module must define a form function with
+ *     the same name as the action function with '_form' appended (e.g., the
+ *     form for 'node_assign_owner_action' is 'node_assign_owner_action_form'.)
+ *     This function takes $context as its only parameter, and is paired with
+ *     the usual _submit function, and possibly a _validate function.
+ *   - 'triggers': An array of the events (that is, hooks) that can trigger this
+ *     action. For example: array('node_insert', 'user_update'). You can also
+ *     declare support for any trigger by returning array('any') for this value.
+ *   - 'behavior': (optional) A machine-readable array of behaviors of this
+ *     action, used to signal additionally required actions that may need to be
+ *     triggered. Currently recognized behaviors by Trigger module:
+ *     - 'changes_property': If an action with this behavior is assigned to a
+ *       trigger other than a "presave" hook, any save actions also assigned to
+ *       this trigger are moved later in the list. If no save action is present,
+ *       one will be added.
+ *       Modules that are processing actions (like Trigger module) should take
+ *       special care for the "presave" hook, in which case a dependent "save"
+ *       action should NOT be invoked.
+ *
+ * @ingroup actions
+ */
+function hook_action_info() {
+  return array(
+    'comment_unpublish_action' => array(
+      'type' => 'comment',
+      'label' => t('Unpublish comment'),
+      'configurable' => FALSE,
+      'behavior' => array('changes_property'),
+      'triggers' => array('comment_presave', 'comment_insert', 'comment_update'),
+    ),
+    'comment_unpublish_by_keyword_action' => array(
+      'type' => 'comment',
+      'label' => t('Unpublish comment containing keyword(s)'),
+      'configurable' => TRUE,
+      'behavior' => array('changes_property'),
+      'triggers' => array('comment_presave', 'comment_insert', 'comment_update'),
+    ),
+    'comment_save_action' => array(
+      'type' => 'comment',
+      'label' => t('Save comment'),
+      'configurable' => FALSE,
+      'triggers' => array('comment_insert', 'comment_update'),
+    ),
+  );
+}
+
+/**
+ * Executes code after an action is deleted.
+ *
+ * @param $aid
+ *   The action ID.
+ */
+function hook_actions_delete($aid) {
+  db_delete('actions_assignments')
+    ->condition('aid', $aid)
+    ->execute();
+}
+
+/**
+ * Alters the actions declared by another module.
+ *
+ * Called by actions_list() to allow modules to alter the return values from
+ * implementations of hook_action_info().
+ *
+ * @see trigger_example_action_info_alter()
+ */
+function hook_action_info_alter(&$actions) {
+  $actions['node_unpublish_action']['label'] = t('Unpublish and remove from public view.');
+}
+
+/**
+ * Declare archivers to the system.
+ *
+ * An archiver is a class that is able to package and unpackage one or more files
+ * into a single possibly compressed file.  Common examples of such files are
+ * zip files and tar.gz files.  All archiver classes must implement
+ * ArchiverInterface.
+ *
+ * Each entry should be keyed on a unique value, and specify three
+ * additional keys:
+ * - class: The name of the PHP class for this archiver.
+ * - extensions: An array of file extensions that this archiver supports.
+ * - weight: This optional key specifies the weight of this archiver.
+ *   When mapping file extensions to archivers, the first archiver by
+ *   weight found that supports the requested extension will be used.
+ *
+ * @see hook_archiver_info_alter()
+ */
+function hook_archiver_info() {
+  return array(
+    'tar' => array(
+      'class' => 'ArchiverTar',
+      'extensions' => array('tar', 'tar.gz', 'tar.bz2'),
+    ),
+  );
+}
+
+/**
+ * Alter archiver information declared by other modules.
+ *
+ * See hook_archiver_info() for a description of archivers and the archiver
+ * information structure.
+ *
+ * @param $info
+ *   Archiver information to alter (return values from hook_archiver_info()).
+ */
+function hook_archiver_info_alter(&$info) {
+  $info['tar']['extensions'][] = 'tgz';
+}
+
+/**
+ * Define additional date types.
+ *
+ * Next to the 'long', 'medium' and 'short' date types defined in core, any
+ * module can define additional types that can be used when displaying dates,
+ * by implementing this hook. A date type is basically just a name for a date
+ * format.
+ *
+ * Date types are used in the administration interface: a user can assign
+ * date format types defined in hook_date_formats() to date types defined in
+ * this hook. Once a format has been assigned by a user, the machine name of a
+ * type can be used in the format_date() function to format a date using the
+ * chosen formatting.
+ *
+ * To define a date type in a module and make sure a format has been assigned to
+ * it, without requiring a user to visit the administrative interface, use
+ * @code variable_set('date_format_' . $type, $format); @endcode
+ * where $type is the machine-readable name defined here, and $format is a PHP
+ * date format string.
+ *
+ * To avoid namespace collisions with date types defined by other modules, it is
+ * recommended that each date type starts with the module name. A date type
+ * can consist of letters, numbers and underscores.
+ *
+ * @return
+ *   An array of date types where the keys are the machine-readable names and
+ *   the values are the human-readable labels.
+ *
+ * @see hook_date_formats()
+ * @see format_date()
+ */
+function hook_date_format_types() {
+  // Define the core date format types.
+  return array(
+    'long' => t('Long'),
+    'medium' => t('Medium'),
+    'short' => t('Short'),
+  );
+}
+
+/**
+ * Modify existing date types.
+ *
+ * Allows other modules to modify existing date types like 'long'. Called by
+ * _system_date_format_types_build(). For instance, A module may use this hook
+ * to apply settings across all date types, such as locking all date types so
+ * they appear to be provided by the system.
+ *
+ * @param $types
+ *   A list of date types. Each date type is keyed by the machine-readable name
+ *   and the values are associative arrays containing:
+ *   - is_new: Set to FALSE to override previous settings.
+ *   - module: The name of the module that created the date type.
+ *   - type: The machine-readable date type name.
+ *   - title: The human-readable date type name.
+ *   - locked: Specifies that the date type is system-provided.
+ */
+function hook_date_format_types_alter(&$types) {
+  foreach ($types as $name => $type) {
+    $types[$name]['locked'] = 1;
+  }
+}
+
+/**
+ * Define additional date formats.
+ *
+ * This hook is used to define the PHP date format strings that can be assigned
+ * to date types in the administrative interface. A module can provide date
+ * format strings for the core-provided date types ('long', 'medium', and
+ * 'short'), or for date types defined in hook_date_format_types() by itself
+ * or another module.
+ *
+ * Since date formats can be locale-specific, you can specify the locales that
+ * each date format string applies to. There may be more than one locale for a
+ * format. There may also be more than one format for the same locale. For
+ * example d/m/Y and Y/m/d work equally well in some locales. You may wish to
+ * define some additional date formats that aren't specific to any one locale,
+ * for example, "Y m". For these cases, the 'locales' component of the return
+ * value should be omitted.
+ *
+ * Providing a date format here does not normally assign the format to be
+ * used with the associated date type -- a user has to choose a format for each
+ * date type in the administrative interface. There is one exception: locale
+ * initialization chooses a locale-specific format for the three core-provided
+ * types (see locale_get_localized_date_format() for details). If your module
+ * needs to ensure that a date type it defines has a format associated with it,
+ * call @code variable_set('date_format_' . $type, $format); @endcode
+ * where $type is the machine-readable name defined in hook_date_format_types(),
+ * and $format is a PHP date format string.
+ *
+ * @return
+ *   A list of date formats to offer as choices in the administrative
+ *   interface. Each date format is a keyed array consisting of three elements:
+ *   - 'type': The date type name that this format can be used with, as
+ *     declared in an implementation of hook_date_format_types().
+ *   - 'format': A PHP date format string to use when formatting dates. It
+ *     can contain any of the formatting options described at
+ *     http://php.net/manual/function.date.php
+ *   - 'locales': (optional) An array of 2 and 5 character locale codes,
+ *     defining which locales this format applies to (for example, 'en',
+ *     'en-us', etc.). If your date format is not language-specific, leave this
+ *     array empty.
+ *
+ * @see hook_date_format_types()
+ */
+function hook_date_formats() {
+  return array(
+    array(
+      'type' => 'mymodule_extra_long',
+      'format' => 'l jS F Y H:i:s e',
+      'locales' => array('en-ie'),
+    ),
+    array(
+      'type' => 'mymodule_extra_long',
+      'format' => 'l jS F Y h:i:sa',
+      'locales' => array('en', 'en-us'),
+    ),
+    array(
+      'type' => 'short',
+      'format' => 'F Y',
+      'locales' => array(),
+    ),
+  );
+}
+
+/**
+ * Alter date formats declared by another module.
+ *
+ * Called by _system_date_format_types_build() to allow modules to alter the
+ * return values from implementations of hook_date_formats().
+ */
+function hook_date_formats_alter(&$formats) {
+  foreach ($formats as $id => $format) {
+    $formats[$id]['locales'][] = 'en-ca';
+  }
+}
+
+/**
+ * Alters the delivery callback used to send the result of the page callback to the browser.
+ *
+ * Called by drupal_deliver_page() to allow modules to alter how the
+ * page is delivered to the browser.
+ *
+ * This hook is intended for altering the delivery callback based on
+ * information unrelated to the path of the page accessed. For example,
+ * it can be used to set the delivery callback based on a HTTP request
+ * header (as shown in the code sample). To specify a delivery callback
+ * based on path information, use hook_menu() or hook_menu_alter().
+ *
+ * This hook can also be used as an API function that can be used to explicitly
+ * set the delivery callback from some other function. For example, for a module
+ * named MODULE:
+ * @code
+ * function MODULE_page_delivery_callback_alter(&$callback, $set = FALSE) {
+ *   static $stored_callback;
+ *   if ($set) {
+ *     $stored_callback = $callback;
+ *   }
+ *   elseif (isset($stored_callback)) {
+ *     $callback = $stored_callback;
+ *   }
+ * }
+ * function SOMEWHERE_ELSE() {
+ *   $desired_delivery_callback = 'foo';
+ *   MODULE_page_delivery_callback_alter($desired_delivery_callback, TRUE);
+ * }
+ * @endcode
+ *
+ * @param $callback
+ *   The name of a function.
+ *
+ * @see drupal_deliver_page()
+ */
+function hook_page_delivery_callback_alter(&$callback) {
+  // jQuery sets a HTTP_X_REQUESTED_WITH header of 'XMLHttpRequest'.
+  // If a page would normally be delivered as an html page, and it is called
+  // from jQuery, deliver it instead as an Ajax response.
+  if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' && $callback == 'drupal_deliver_html_page') {
+    $callback = 'ajax_deliver';
+  }
+}
+
+/**
+ * Alters theme operation links.
+ *
+ * @param $theme_groups
+ *   An associative array containing groups of themes.
+ *
+ * @see system_themes_page()
+ */
+function hook_system_themes_page_alter(&$theme_groups) {
+  foreach ($theme_groups as $state => &$group) {
+    foreach ($theme_groups[$state] as &$theme) {
+      // Add a foo link to each list of theme operations.
+      $theme->operations[] = array(
+        'title' => t('Foo'),
+        'href' => 'admin/appearance/foo',
+        'query' => array('theme' => $theme->name)
+      );
+    }
+  }
+}
+
+/**
+ * Alters inbound URL requests.
+ *
+ * @param $path
+ *   The path being constructed, which, if a path alias, has been resolved to a
+ *   Drupal path by the database, and which also may have been altered by other
+ *   modules before this one.
+ * @param $original_path
+ *   The original path, before being checked for path aliases or altered by any
+ *   modules.
+ * @param $path_language
+ *   The language of the path.
+ *
+ * @see drupal_get_normal_path()
+ */
+function hook_url_inbound_alter(&$path, $original_path, $path_language) {
+  // Create the path user/me/edit, which allows a user to edit their account.
+  if (preg_match('|^user/me/edit(/.*)?|', $path, $matches)) {
+    global $user;
+    $path = 'user/' . $user->uid . '/edit' . $matches[1];
+  }
+}
+
+/**
+ * Alters outbound URLs.
+ *
+ * @param $path
+ *   The outbound path to alter, not adjusted for path aliases yet. It won't be
+ *   adjusted for path aliases until all modules are finished altering it, thus
+ *   being consistent with hook_url_inbound_alter(), which adjusts for all path
+ *   aliases before allowing modules to alter it. This may have been altered by
+ *   other modules before this one.
+ * @param $options
+ *   A set of URL options for the URL so elements such as a fragment or a query
+ *   string can be added to the URL.
+ * @param $original_path
+ *   The original path, before being altered by any modules.
+ *
+ * @see url()
+ */
+function hook_url_outbound_alter(&$path, &$options, $original_path) {
+  // Use an external RSS feed rather than the Drupal one.
+  if ($path == 'rss.xml') {
+    $path = 'http://example.com/rss.xml';
+    $options['external'] = TRUE;
+  }
+
+  // Instead of pointing to user/[uid]/edit, point to user/me/edit.
+  if (preg_match('|^user/([0-9]*)/edit(/.*)?|', $path, $matches)) {
+    global $user;
+    if ($user->uid == $matches[1]) {
+      $path = 'user/me/edit' . $matches[2];
+    }
+  }
+}
+
+/**
+ * Alter the username that is displayed for a user.
+ *
+ * Called by format_username() to allow modules to alter the username that's
+ * displayed. Can be used to ensure user privacy in situations where
+ * $account->name is too revealing.
+ *
+ * @param $name
+ *   The string that format_username() will return.
+ *
+ * @param $account
+ *   The account object passed to format_username().
+ *
+ * @see format_username()
+ */
+function hook_username_alter(&$name, $account) {
+  // Display the user's uid instead of name.
+  if (isset($account->uid)) {
+    $name = t('User !uid', array('!uid' => $account->uid));
+  }
+}
+
+/**
+ * Provide replacement values for placeholder tokens.
+ *
+ * This hook is invoked when someone calls token_replace(). That function first
+ * scans the text for [type:token] patterns, and splits the needed tokens into
+ * groups by type. Then hook_tokens() is invoked on each token-type group,
+ * allowing your module to respond by providing replacement text for any of
+ * the tokens in the group that your module knows how to process.
+ *
+ * A module implementing this hook should also implement hook_token_info() in
+ * order to list its available tokens on editing screens.
+ *
+ * @param $type
+ *   The machine-readable name of the type (group) of token being replaced, such
+ *   as 'node', 'user', or another type defined by a hook_token_info()
+ *   implementation.
+ * @param $tokens
+ *   An array of tokens to be replaced. The keys are the machine-readable token
+ *   names, and the values are the raw [type:token] strings that appeared in the
+ *   original text.
+ * @param $data
+ *   (optional) An associative array of data objects to be used when generating
+ *   replacement values, as supplied in the $data parameter to token_replace().
+ * @param $options
+ *   (optional) An associative array of options for token replacement; see
+ *   token_replace() for possible values.
+ *
+ * @return
+ *   An associative array of replacement values, keyed by the raw [type:token]
+ *   strings from the original text.
+ *
+ * @see hook_token_info()
+ * @see hook_tokens_alter()
+ */
+function hook_tokens($type, $tokens, array $data = array(), array $options = array()) {
+  $url_options = array('absolute' => TRUE);
+  if (isset($options['language'])) {
+    $url_options['language'] = $options['language'];
+    $language_code = $options['language']->language;
+  }
+  else {
+    $language_code = NULL;
+  }
+  $sanitize = !empty($options['sanitize']);
+
+  $replacements = array();
+
+  if ($type == 'node' && !empty($data['node'])) {
+    $node = $data['node'];
+
+    foreach ($tokens as $name => $original) {
+      switch ($name) {
+        // Simple key values on the node.
+        case 'nid':
+          $replacements[$original] = $node->nid;
+          break;
+
+        case 'title':
+          $replacements[$original] = $sanitize ? check_plain($node->title) : $node->title;
+          break;
+
+        case 'edit-url':
+          $replacements[$original] = url('node/' . $node->nid . '/edit', $url_options);
+          break;
+
+        // Default values for the chained tokens handled below.
+        case 'author':
+          $name = ($node->uid == 0) ? variable_get('anonymous', t('Anonymous')) : $node->name;
+          $replacements[$original] = $sanitize ? filter_xss($name) : $name;
+          break;
+
+        case 'created':
+          $replacements[$original] = format_date($node->created, 'medium', '', NULL, $language_code);
+          break;
+      }
+    }
+
+    if ($author_tokens = token_find_with_prefix($tokens, 'author')) {
+      $author = user_load($node->uid);
+      $replacements += token_generate('user', $author_tokens, array('user' => $author), $options);
+    }
+
+    if ($created_tokens = token_find_with_prefix($tokens, 'created')) {
+      $replacements += token_generate('date', $created_tokens, array('date' => $node->created), $options);
+    }
+  }
+
+  return $replacements;
+}
+
+/**
+ * Alter replacement values for placeholder tokens.
+ *
+ * @param $replacements
+ *   An associative array of replacements returned by hook_tokens().
+ * @param $context
+ *   The context in which hook_tokens() was called. An associative array with
+ *   the following keys, which have the same meaning as the corresponding
+ *   parameters of hook_tokens():
+ *   - 'type'
+ *   - 'tokens'
+ *   - 'data'
+ *   - 'options'
+ *
+ * @see hook_tokens()
+ */
+function hook_tokens_alter(array &$replacements, array $context) {
+  $options = $context['options'];
+
+  if (isset($options['language'])) {
+    $url_options['language'] = $options['language'];
+    $language_code = $options['language']->language;
+  }
+  else {
+    $language_code = NULL;
+  }
+  $sanitize = !empty($options['sanitize']);
+
+  if ($context['type'] == 'node' && !empty($context['data']['node'])) {
+    $node = $context['data']['node'];
+
+    // Alter the [node:title] token, and replace it with the rendered content
+    // of a field (field_title).
+    if (isset($context['tokens']['title'])) {
+      $title = field_view_field('node', $node, 'field_title', 'default', $language_code);
+      $replacements[$context['tokens']['title']] = drupal_render($title);
+    }
+  }
+}
+
+/**
+ * Provide information about available placeholder tokens and token types.
+ *
+ * Tokens are placeholders that can be put into text by using the syntax
+ * [type:token], where type is the machine-readable name of a token type, and
+ * token is the machine-readable name of a token within this group. This hook
+ * provides a list of types and tokens to be displayed on text editing screens,
+ * so that people editing text can see what their token options are.
+ *
+ * The actual token replacement is done by token_replace(), which invokes
+ * hook_tokens(). Your module will need to implement that hook in order to
+ * generate token replacements from the tokens defined here.
+ *
+ * @return
+ *   An associative array of available tokens and token types. The outer array
+ *   has two components:
+ *   - types: An associative array of token types (groups). Each token type is
+ *     an associative array with the following components:
+ *     - name: The translated human-readable short name of the token type.
+ *     - description: A translated longer description of the token type.
+ *     - needs-data: The type of data that must be provided to token_replace()
+ *       in the $data argument (i.e., the key name in $data) in order for tokens
+ *       of this type to be used in the $text being processed. For instance, if
+ *       the token needs a node object, 'needs-data' should be 'node', and to
+ *       use this token in token_replace(), the caller needs to supply a node
+ *       object as $data['node']. Some token data can also be supplied
+ *       indirectly; for instance, a node object in $data supplies a user object
+ *       (the author of the node), allowing user tokens to be used when only
+ *       a node data object is supplied.
+ *   - tokens: An associative array of tokens. The outer array is keyed by the
+ *     group name (the same key as in the types array). Within each group of
+ *     tokens, each token item is keyed by the machine name of the token, and
+ *     each token item has the following components:
+ *     - name: The translated human-readable short name of the token.
+ *     - description: A translated longer description of the token.
+ *     - type (optional): A 'needs-data' data type supplied by this token, which
+ *       should match a 'needs-data' value from another token type. For example,
+ *       the node author token provides a user object, which can then be used
+ *       for token replacement data in token_replace() without having to supply
+ *       a separate user object.
+ *
+ * @see hook_token_info_alter()
+ * @see hook_tokens()
+ */
+function hook_token_info() {
+  $type = array(
+    'name' => t('Nodes'),
+    'description' => t('Tokens related to individual nodes.'),
+    'needs-data' => 'node',
+  );
+
+  // Core tokens for nodes.
+  $node['nid'] = array(
+    'name' => t("Node ID"),
+    'description' => t("The unique ID of the node."),
+  );
+  $node['title'] = array(
+    'name' => t("Title"),
+    'description' => t("The title of the node."),
+  );
+  $node['edit-url'] = array(
+    'name' => t("Edit URL"),
+    'description' => t("The URL of the node's edit page."),
+  );
+
+  // Chained tokens for nodes.
+  $node['created'] = array(
+    'name' => t("Date created"),
+    'description' => t("The date the node was posted."),
+    'type' => 'date',
+  );
+  $node['author'] = array(
+    'name' => t("Author"),
+    'description' => t("The author of the node."),
+    'type' => 'user',
+  );
+
+  return array(
+    'types' => array('node' => $type),
+    'tokens' => array('node' => $node),
+  );
+}
+
+/**
+ * Alter the metadata about available placeholder tokens and token types.
+ *
+ * @param $data
+ *   The associative array of token definitions from hook_token_info().
+ *
+ * @see hook_token_info()
+ */
+function hook_token_info_alter(&$data) {
+  // Modify description of node tokens for our site.
+  $data['tokens']['node']['nid'] = array(
+    'name' => t("Node ID"),
+    'description' => t("The unique ID of the article."),
+  );
+  $data['tokens']['node']['title'] = array(
+    'name' => t("Title"),
+    'description' => t("The title of the article."),
+  );
+
+  // Chained tokens for nodes.
+  $data['tokens']['node']['created'] = array(
+    'name' => t("Date created"),
+    'description' => t("The date the article was posted."),
+    'type' => 'date',
+  );
+}
+
+/**
+ * Alter batch information before a batch is processed.
+ *
+ * Called by batch_process() to allow modules to alter a batch before it is
+ * processed.
+ *
+ * @param $batch
+ *   The associative array of batch information. See batch_set() for details on
+ *   what this could contain.
+ *
+ * @see batch_set()
+ * @see batch_process()
+ *
+ * @ingroup batch
+ */
+function hook_batch_alter(&$batch) {
+  // If the current page request is inside the overlay, add ?render=overlay to
+  // the success callback URL, so that it appears correctly within the overlay.
+  if (overlay_get_mode() == 'child') {
+    if (isset($batch['url_options']['query'])) {
+      $batch['url_options']['query']['render'] = 'overlay';
+    }
+    else {
+      $batch['url_options']['query'] = array('render' => 'overlay');
+    }
+  }
+}
+
+/**
+ * Provide information on Updaters (classes that can update Drupal).
+ *
+ * An Updater is a class that knows how to update various parts of the Drupal
+ * file system, for example to update modules that have newer releases, or to
+ * install a new theme.
+ *
+ * @return
+ *   An associative array of information about the updater(s) being provided.
+ *   This array is keyed by a unique identifier for each updater, and the
+ *   values are subarrays that can contain the following keys:
+ *   - class: The name of the PHP class which implements this updater.
+ *   - name: Human-readable name of this updater.
+ *   - weight: Controls what order the Updater classes are consulted to decide
+ *     which one should handle a given task. When an update task is being run,
+ *     the system will loop through all the Updater classes defined in this
+ *     registry in weight order and let each class respond to the task and
+ *     decide if each Updater wants to handle the task. In general, this
+ *     doesn't matter, but if you need to override an existing Updater, make
+ *     sure your Updater has a lighter weight so that it comes first.
+ *
+ * @see drupal_get_updaters()
+ * @see hook_updater_info_alter()
+ */
+function hook_updater_info() {
+  return array(
+    'module' => array(
+      'class' => 'ModuleUpdater',
+      'name' => t('Update modules'),
+      'weight' => 0,
+    ),
+    'theme' => array(
+      'class' => 'ThemeUpdater',
+      'name' => t('Update themes'),
+      'weight' => 0,
+    ),
+  );
+}
+
+/**
+ * Alter the Updater information array.
+ *
+ * An Updater is a class that knows how to update various parts of the Drupal
+ * file system, for example to update modules that have newer releases, or to
+ * install a new theme.
+ *
+ * @param array $updaters
+ *   Associative array of updaters as defined through hook_updater_info().
+ *   Alter this array directly.
+ *
+ * @see drupal_get_updaters()
+ * @see hook_updater_info()
+ */
+function hook_updater_info_alter(&$updaters) {
+  // Adjust weight so that the theme Updater gets a chance to handle a given
+  // update task before module updaters.
+  $updaters['theme']['weight'] = -1;
+}
+
+/**
+ * Alter the default country list.
+ *
+ * @param $countries
+ *   The associative array of countries keyed by ISO 3166-1 country code.
+ *
+ * @see country_get_list()
+ * @see _country_get_predefined_list()
+ */
+function hook_countries_alter(&$countries) {
+  // Elbonia is now independent, so add it to the country list.
+  $countries['EB'] = 'Elbonia';
+}
+
+/**
+ * Control site status before menu dispatching.
+ *
+ * The hook is called after checking whether the site is offline but before
+ * the current router item is retrieved and executed by
+ * menu_execute_active_handler(). If the site is in offline mode,
+ * $menu_site_status is set to MENU_SITE_OFFLINE.
+ *
+ * @param $menu_site_status
+ *   Supported values are MENU_SITE_OFFLINE, MENU_ACCESS_DENIED,
+ *   MENU_NOT_FOUND and MENU_SITE_ONLINE. Any other value than
+ *   MENU_SITE_ONLINE will skip the default menu handling system and be passed
+ *   for delivery to drupal_deliver_page() with a NULL
+ *   $default_delivery_callback.
+ * @param $path
+ *   Contains the system path that is going to be loaded. This is read only,
+ *   use hook_url_inbound_alter() to change the path.
+ */
+function hook_menu_site_status_alter(&$menu_site_status, $path) {
+  // Allow access to my_module/authentication even if site is in offline mode.
+  if ($menu_site_status == MENU_SITE_OFFLINE && user_is_anonymous() && $path == 'my_module/authentication') {
+    $menu_site_status = MENU_SITE_ONLINE;
+  }
+}
+
+/**
+ * Register information about FileTransfer classes provided by a module.
+ *
+ * The FileTransfer class allows transferring files over a specific type of
+ * connection. Core provides classes for FTP and SSH. Contributed modules are
+ * free to extend the FileTransfer base class to add other connection types,
+ * and if these classes are registered via hook_filetransfer_info(), those
+ * connection types will be available to site administrators using the Update
+ * manager when they are redirected to the authorize.php script to authorize
+ * the file operations.
+ *
+ * @return array
+ *   Nested array of information about FileTransfer classes. Each key is a
+ *   FileTransfer type (not human readable, used for form elements and
+ *   variable names, etc), and the values are subarrays that define properties
+ *   of that type. The keys in each subarray are:
+ *   - 'title': Required. The human-readable name of the connection type.
+ *   - 'class': Required. The name of the FileTransfer class. The constructor
+ *     will always be passed the full path to the root of the site that should
+ *     be used to restrict where file transfer operations can occur (the $jail)
+ *     and an array of settings values returned by the settings form.
+ *   - 'file': Required. The include file containing the FileTransfer class.
+ *     This should be a separate .inc file, not just the .module file, so that
+ *     the minimum possible code is loaded when authorize.php is running.
+ *   - 'file path': Optional. The directory (relative to the Drupal root)
+ *     where the include file lives. If not defined, defaults to the base
+ *     directory of the module implementing the hook.
+ *   - 'weight': Optional. Integer weight used for sorting connection types on
+ *     the authorize.php form.
+ *
+ * @see FileTransfer
+ * @see authorize.php
+ * @see hook_filetransfer_info_alter()
+ * @see drupal_get_filetransfer_info()
+ */
+function hook_filetransfer_info() {
+  $info['sftp'] = array(
+    'title' => t('SFTP (Secure FTP)'),
+    'file' => 'sftp.filetransfer.inc',
+    'class' => 'FileTransferSFTP',
+    'weight' => 10,
+  );
+  return $info;
+}
+
+/**
+ * Alter the FileTransfer class registry.
+ *
+ * @param array $filetransfer_info
+ *   Reference to a nested array containing information about the FileTransfer
+ *   class registry.
+ *
+ * @see hook_filetransfer_info()
+ */
+function hook_filetransfer_info_alter(&$filetransfer_info) {
+  if (variable_get('paranoia', FALSE)) {
+    // Remove the FTP option entirely.
+    unset($filetransfer_info['ftp']);
+    // Make sure the SSH option is listed first.
+    $filetransfer_info['ssh']['weight'] = -10;
+  }
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
+
+/**
+ * @addtogroup callbacks
+ * @{
+ */
+
+/**
+ * Return the URI for an entity.
+ *
+ * Callback for hook_entity_info().
+ *
+ * @param $entity
+ *   The entity to return the URI for.
+ *
+ * @return
+ *   An associative array with the following elements:
+ *   - 'path': The URL path for the entity.
+ *   - 'options': (optional) An array of options for the url() function.
+ *   The actual entity URI can be constructed by passing these elements to
+ *   url().
+ */
+function callback_entity_info_uri($entity) {
+  return array(
+    'path' => 'node/' . $entity->nid,
+  );
+}
+
+/**
+ * Return the label of an entity.
+ *
+ * Callback for hook_entity_info().
+ *
+ * @param $entity
+ *   The entity for which to generate the label.
+ * @param $entity_type
+ *   The entity type; e.g., 'node' or 'user'.
+ *
+ * @return
+ *   An unsanitized string with the label of the entity.
+ *
+ * @see entity_label()
+ */
+function callback_entity_info_label($entity, $entity_type) {
+  return empty($entity->title) ? 'Untitled entity' : $entity->title;
+}
+
+/**
+ * Return the language code of the entity.
+ *
+ * Callback for hook_entity_info().
+ *
+ * The language callback is meant to be used primarily for temporary alterations
+ * of the property value.
+ *
+ * @param $entity
+ *   The entity for which to return the language.
+ * @param $entity_type
+ *   The entity type; e.g., 'node' or 'user'.
+ *
+ * @return
+ *   The language code for the language of the entity.
+ *
+ * @see entity_language()
+ */
+function callback_entity_info_language($entity, $entity_type) {
+  return $entity->language;
+}
+
+/**
+ * @} End of "addtogroup callbacks".
+ */
+
+/**
+ * @defgroup update_api Update versions of API functions
+ * @{
+ * Functions that are similar to normal API functions, but do not invoke hooks.
+ *
+ * These simplified versions of core API functions are provided for use by
+ * update functions (hook_update_N() implementations).
+ *
+ * During database updates the schema of any module could be out of date. For
+ * this reason, caution is needed when using any API function within an update
+ * function - particularly CRUD functions, functions that depend on the schema
+ * (for example by using drupal_write_record()), and any functions that invoke
+ * hooks.
+ *
+ * Instead, a simplified utility function should be used. If a utility version
+ * of the API function you require does not already exist, then you should
+ * create a new function. The new utility function should be named
+ * _update_N_mymodule_my_function(). N is the schema version the function acts
+ * on (the schema version is the number N from the hook_update_N()
+ * implementation where this schema was introduced, or a number following the
+ * same numbering scheme), and mymodule_my_function is the name of the original
+ * API function including the module's name.
+ *
+ * Examples:
+ * - _update_6000_mymodule_save(): This function performs a save operation
+ *   without invoking any hooks using the 6.x schema.
+ * - _update_7000_mymodule_save(): This function performs the same save
+ *   operation using the 7.x schema.
+ *
+ * The utility function should not invoke any hooks, and should perform database
+ * operations using functions from the
+ * @link database Database abstraction layer, @endlink
+ * like db_insert(), db_update(), db_delete(), db_query(), and so on.
+ *
+ * If a change to the schema necessitates a change to the utility function, a
+ * new function should be created with a name based on the version of the schema
+ * it acts on. See _update_7000_bar_get_types() and _update_7001_bar_get_types()
+ * in the code examples that follow.
+ *
+ * For example, foo.install could contain:
+ * @code
+ * function foo_update_dependencies() {
+ *   // foo_update_7010() needs to run after bar_update_7000().
+ *   $dependencies['foo'][7010] = array(
+ *     'bar' => 7000,
+ *   );
+ *
+ *   // foo_update_7036() needs to run after bar_update_7001().
+ *   $dependencies['foo'][7036] = array(
+ *     'bar' => 7001,
+ *   );
+ *
+ *   return $dependencies;
+ * }
+ *
+ * function foo_update_7000() {
+ *   // No updates have been run on the {bar_types} table yet, so this needs
+ *   // to work with the 6.x schema.
+ *   foreach (_update_6000_bar_get_types() as $type) {
+ *     // Rename a variable.
+ *   }
+ * }
+ *
+ * function foo_update_7010() {
+ *    // Since foo_update_7010() is going to run after bar_update_7000(), it
+ *    // needs to operate on the new schema, not the old one.
+ *    foreach (_update_7000_bar_get_types() as $type) {
+ *      // Rename a different variable.
+ *    }
+ * }
+ *
+ * function foo_update_7036() {
+ *   // This update will run after bar_update_7001().
+ *   foreach (_update_7001_bar_get_types() as $type) {
+ *   }
+ * }
+ * @endcode
+ *
+ * And bar.install could contain:
+ * @code
+ * function bar_update_7000() {
+ *   // Type and bundle are confusing, so we renamed the table.
+ *   db_rename_table('bar_types', 'bar_bundles');
+ * }
+ *
+ * function bar_update_7001() {
+ *   // Database table names should be singular when possible.
+ *   db_rename_table('bar_bundles', 'bar_bundle');
+ * }
+ *
+ * function _update_6000_bar_get_types() {
+ *   db_query('SELECT * FROM {bar_types}')->fetchAll();
+ * }
+ *
+ * function _update_7000_bar_get_types() {
+ *   db_query('SELECT * FROM {bar_bundles'})->fetchAll();
+ * }
+ *
+ * function _update_7001_bar_get_types() {
+ *   db_query('SELECT * FROM {bar_bundle}')->fetchAll();
+ * }
+ * @endcode
+ *
+ * @see hook_update_N()
+ * @see hook_update_dependencies()
+ */
+
+/**
+ * @} End of "defgroup update_api".
+ */
diff --git a/htmltest/modules/system/system.archiver.inc b/htmltest/modules/system/system.archiver.inc
new file mode 100644
index 00000000..c37f07da
--- /dev/null
+++ b/htmltest/modules/system/system.archiver.inc
@@ -0,0 +1,139 @@
+<?php
+
+/**
+ * @file
+ * Archiver implementations provided by the system module.
+ */
+
+/**
+ * Archiver for .tar files.
+ */
+class ArchiverTar implements ArchiverInterface {
+
+  /**
+   * The underlying Archive_Tar instance that does the heavy lifting.
+   *
+   * @var Archive_Tar
+   */
+  protected $tar;
+
+  public function __construct($file_path) {
+    $this->tar = new Archive_Tar($file_path);
+  }
+
+  public function add($file_path) {
+    $this->tar->add($file_path);
+
+    return $this;
+  }
+
+  public function remove($file_path) {
+    // @todo Archive_Tar doesn't have a remove operation
+    // so we'll have to simulate it somehow, probably by
+    // creating a new archive with everything but the removed
+    // file.
+
+    return $this;
+  }
+
+  public function extract($path, Array $files = array()) {
+    if ($files) {
+      $this->tar->extractList($files, $path);
+    }
+    else {
+      $this->tar->extract($path);
+    }
+
+    return $this;
+  }
+
+  public function listContents() {
+    $files = array();
+    foreach ($this->tar->listContent() as $file_data) {
+      $files[] = $file_data['filename'];
+    }
+    return $files;
+  }
+
+  /**
+   * Retrieve the tar engine itself.
+   *
+   * In some cases it may be necessary to directly access the underlying
+   * Archive_Tar object for implementation-specific logic. This is for advanced
+   * use only as it is not shared by other implementations of ArchiveInterface.
+   *
+   * @return
+   *   The Archive_Tar object used by this object.
+   */
+  public function getArchive() {
+    return $this->tar;
+  }
+}
+
+/**
+ * Archiver for .zip files.
+ *
+ * @link http://php.net/zip
+ */
+class ArchiverZip implements ArchiverInterface {
+
+  /**
+   * The underlying ZipArchive instance that does the heavy lifting.
+   *
+   * @var ZipArchive
+   */
+  protected $zip;
+
+  public function __construct($file_path) {
+    $this->zip = new ZipArchive();
+    if ($this->zip->open($file_path) !== TRUE) {
+      // @todo: This should be an interface-specific exception some day.
+      throw new Exception(t('Cannot open %file_path', array('%file_path' => $file_path)));
+    }
+  }
+
+  public function add($file_path) {
+    $this->zip->addFile($file_path);
+
+    return $this;
+  }
+
+  public function remove($file_path) {
+    $this->zip->deleteName($file_path);
+
+    return $this;
+  }
+
+  public function extract($path, Array $files = array()) {
+    if ($files) {
+      $this->zip->extractTo($path, $files);
+    }
+    else {
+      $this->zip->extractTo($path);
+    }
+
+    return $this;
+  }
+
+  public function listContents() {
+    $files = array();
+    for ($i=0; $i < $this->zip->numFiles; $i++) {
+      $files[] = $this->zip->getNameIndex($i);
+    }
+    return $files;
+  }
+
+  /**
+   * Retrieve the zip engine itself.
+   *
+   * In some cases it may be necessary to directly access the underlying
+   * ZipArchive object for implementation-specific logic. This is for advanced
+   * use only as it is not shared by other implementations of ArchiveInterface.
+   *
+   * @return
+   *   The ZipArchive object used by this object.
+   */
+  public function getArchive() {
+    return $this->zip;
+  }
+}
diff --git a/htmltest/modules/system/system.base-rtl.css b/htmltest/modules/system/system.base-rtl.css
new file mode 100644
index 00000000..075cafec
--- /dev/null
+++ b/htmltest/modules/system/system.base-rtl.css
@@ -0,0 +1,58 @@
+
+/**
+ * @file
+ * Generic theme-independent base styles.
+ */
+
+/**
+ * Autocomplete.
+ */
+/* Animated throbber */
+html.js input.form-autocomplete {
+  background-position: 0% 2px;
+}
+html.js input.throbbing {
+  background-position: 0% -18px;
+}
+
+/**
+ * Progress bar.
+ */
+.progress .percentage {
+  float: left;
+}
+.progress-disabled {
+  float: right;
+}
+.ajax-progress {
+  float: right;
+}
+.ajax-progress .throbber {
+  float: right;
+}
+
+/**
+ * TableDrag behavior.
+ */
+.draggable a.tabledrag-handle {
+  float: right;
+  margin-right: -1em;
+  margin-left: 0;
+}
+a.tabledrag-handle .handle {
+  margin: -0.4em 0.5em;
+  padding: 0.42em 0.5em;
+}
+div.indentation {
+  float: right;
+  margin: -0.4em -0.4em -0.4em 0.2em;
+  padding: 0.42em 0.6em 0.42em 0;
+}
+div.tree-child,
+div.tree-child-last {
+  background-position: -65px center;
+}
+.tabledrag-toggle-weight-wrapper {
+  text-align: left;
+}
+
diff --git a/htmltest/modules/system/system.base.css b/htmltest/modules/system/system.base.css
new file mode 100644
index 00000000..412b18a8
--- /dev/null
+++ b/htmltest/modules/system/system.base.css
@@ -0,0 +1,270 @@
+
+/**
+ * @file
+ * Generic theme-independent base styles.
+ */
+
+/**
+ * Autocomplete.
+ *
+ * @see autocomplete.js
+ */
+/* Suggestion list */
+#autocomplete {
+  border: 1px solid;
+  overflow: hidden;
+  position: absolute;
+  z-index: 100;
+}
+#autocomplete ul {
+  list-style: none;
+  list-style-image: none;
+  margin: 0;
+  padding: 0;
+}
+#autocomplete li {
+  background: #fff;
+  color: #000;
+  cursor: default;
+  white-space: pre;
+  zoom: 1; /* IE7 */
+}
+/* Animated throbber */
+html.js input.form-autocomplete {
+  background-image: url(../../misc/throbber.gif);
+  background-position: 100% 2px; /* LTR */
+  background-repeat: no-repeat;
+}
+html.js input.throbbing {
+  background-position: 100% -18px; /* LTR */
+}
+
+/**
+ * Collapsible fieldsets.
+ *
+ * @see collapse.js
+ */
+html.js fieldset.collapsed {
+  border-bottom-width: 0;
+  border-left-width: 0;
+  border-right-width: 0;
+  height: 1em;
+}
+html.js fieldset.collapsed .fieldset-wrapper {
+  display: none;
+}
+fieldset.collapsible {
+  position: relative;
+}
+fieldset.collapsible .fieldset-legend {
+  display: block;
+}
+
+/**
+ * Resizable textareas.
+ *
+ * @see textarea.js
+ */
+.form-textarea-wrapper textarea {
+  display: block;
+  margin: 0;
+  width: 100%;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.resizable-textarea .grippie {
+  background: #eee url(../../misc/grippie.png) no-repeat center 2px;
+  border: 1px solid #ddd;
+  border-top-width: 0;
+  cursor: s-resize;
+  height: 9px;
+  overflow: hidden;
+}
+
+/**
+ * TableDrag behavior.
+ *
+ * @see tabledrag.js
+ */
+body.drag {
+  cursor: move;
+}
+.draggable a.tabledrag-handle {
+  cursor: move;
+  float: left; /* LTR */
+  height: 1.7em;
+  margin-left: -1em; /* LTR */
+  overflow: hidden;
+  text-decoration: none;
+}
+a.tabledrag-handle:hover {
+  text-decoration: none;
+}
+a.tabledrag-handle .handle {
+  background: url(../../misc/draggable.png) no-repeat 6px 9px;
+  height: 13px;
+  margin: -0.4em 0.5em; /* LTR */
+  padding: 0.42em 0.5em; /* LTR */
+  width: 13px;
+}
+a.tabledrag-handle-hover .handle {
+  background-position: 6px -11px;
+}
+div.indentation {
+  float: left; /* LTR */
+  height: 1.7em;
+  margin: -0.4em 0.2em -0.4em -0.4em; /* LTR */
+  padding: 0.42em 0 0.42em 0.6em; /* LTR */
+  width: 20px;
+}
+div.tree-child {
+  background: url(../../misc/tree.png) no-repeat 11px center; /* LTR */
+}
+div.tree-child-last {
+  background: url(../../misc/tree-bottom.png) no-repeat 11px center; /* LTR */
+}
+div.tree-child-horizontal {
+  background: url(../../misc/tree.png) no-repeat -11px center;
+}
+.tabledrag-toggle-weight-wrapper {
+  text-align: right; /* LTR */
+}
+
+/**
+ * TableHeader behavior.
+ *
+ * @see tableheader.js
+ */
+table.sticky-header {
+  background-color: #fff;
+  margin-top: 0;
+}
+
+/**
+ * Progress behavior.
+ *
+ * @see progress.js
+ */
+/* Bar */
+.progress .bar {
+  background-color: #fff;
+  border: 1px solid;
+}
+.progress .filled {
+  background-color: #000;
+  height: 1.5em;
+  width: 5px;
+}
+.progress .percentage {
+  float: right; /* LTR */
+}
+/* Throbber */
+.ajax-progress {
+  display: inline-block;
+}
+.ajax-progress .throbber {
+  background: transparent url(../../misc/throbber.gif) no-repeat 0px -18px;
+  float: left; /* LTR */
+  height: 15px;
+  margin: 2px;
+  width: 15px;
+}
+.ajax-progress .message {
+  padding-left: 20px;
+}
+tr .ajax-progress .throbber {
+  margin: 0 2px;
+}
+.ajax-progress-bar {
+  width: 16em;
+}
+
+/**
+ * Inline items.
+ */
+.container-inline div,
+.container-inline label {
+  display: inline;
+}
+/* Fieldset contents always need to be rendered as block. */
+.container-inline .fieldset-wrapper {
+  display: block;
+}
+
+/**
+ * Prevent text wrapping.
+ */
+.nowrap {
+  white-space: nowrap;
+}
+
+/**
+ * For anything you want to hide on page load when JS is enabled, so
+ * that you can use the JS to control visibility and avoid flicker.
+ */
+html.js .js-hide {
+  display: none;
+}
+
+/**
+ * Hide elements from all users.
+ *
+ * Used for elements which should not be immediately displayed to any user. An
+ * example would be a collapsible fieldset that will be expanded with a click
+ * from a user. The effect of this class can be toggled with the jQuery show()
+ * and hide() functions.
+ */
+.element-hidden {
+  display: none;
+}
+
+/**
+ * Hide elements visually, but keep them available for screen-readers.
+ *
+ * Used for information required for screen-reader users to understand and use
+ * the site where visual display is undesirable. Information provided in this
+ * manner should be kept concise, to avoid unnecessary burden on the user.
+ * "!important" is used to prevent unintentional overrides.
+ */
+.element-invisible {
+  position: absolute !important;
+  clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
+  clip: rect(1px, 1px, 1px, 1px);
+  overflow: hidden;
+  height: 1px;
+}
+
+/**
+ * The .element-focusable class extends the .element-invisible class to allow
+ * the element to be focusable when navigated to via the keyboard.
+ */
+.element-invisible.element-focusable:active,
+.element-invisible.element-focusable:focus {
+  position: static !important;
+  clip: auto;
+  overflow: visible;
+  height: auto;
+}
+
+/**
+ * Markup free clearing.
+ *
+ * @see http://perishablepress.com/press/2009/12/06/new-clearfix-hack
+ */
+.clearfix:after {
+  content: ".";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+}
+/* IE6 */
+* html .clearfix {
+  height: 1%;
+}
+/* IE7 */
+*:first-child + html .clearfix {
+  min-height: 1%;
+}
+
diff --git a/htmltest/modules/system/system.cron.js b/htmltest/modules/system/system.cron.js
new file mode 100644
index 00000000..af17dab5
--- /dev/null
+++ b/htmltest/modules/system/system.cron.js
@@ -0,0 +1,19 @@
+(function ($) {
+
+/**
+ * Checks to see if the cron should be automatically run.
+ */
+Drupal.behaviors.cronCheck = {
+  attach: function(context, settings) {
+    if (settings.cronCheck || false) {
+      $('body').once('cron-check', function() {
+        // Only execute the cron check if its the right time.
+        if (Math.round(new Date().getTime() / 1000.0) > settings.cronCheck) {
+          $.get(settings.basePath + 'system/run-cron-check');
+        }
+      });
+    }
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/system/system.info b/htmltest/modules/system/system.info
new file mode 100644
index 00000000..0f4224cd
--- /dev/null
+++ b/htmltest/modules/system/system.info
@@ -0,0 +1,19 @@
+name = System
+description = Handles general site configuration for administrators.
+package = Core
+version = VERSION
+core = 7.x
+files[] = system.archiver.inc
+files[] = system.mail.inc
+files[] = system.queue.inc
+files[] = system.tar.inc
+files[] = system.updater.inc
+files[] = system.test
+required = TRUE
+configure = admin/config/system
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/system/system.install b/htmltest/modules/system/system.install
new file mode 100644
index 00000000..43c7383a
--- /dev/null
+++ b/htmltest/modules/system/system.install
@@ -0,0 +1,3156 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the system module.
+ */
+
+/**
+ * Implements hook_requirements().
+ */
+function system_requirements($phase) {
+  global $base_url;
+  $requirements = array();
+  // Ensure translations don't break during installation.
+  $t = get_t();
+
+  // Report Drupal version
+  if ($phase == 'runtime') {
+    $requirements['drupal'] = array(
+      'title' => $t('Drupal'),
+      'value' => VERSION,
+      'severity' => REQUIREMENT_INFO,
+      'weight' => -10,
+    );
+
+    // Display the currently active installation profile, if the site
+    // is not running the default installation profile.
+    $profile = drupal_get_profile();
+    if ($profile != 'standard') {
+      $info = system_get_info('module', $profile);
+      $requirements['install_profile'] = array(
+        'title' => $t('Install profile'),
+        'value' => $t('%profile_name (%profile-%version)', array(
+          '%profile_name' => $info['name'],
+          '%profile' => $profile,
+          '%version' => $info['version']
+        )),
+        'severity' => REQUIREMENT_INFO,
+        'weight' => -9
+      );
+    }
+  }
+
+  // Web server information.
+  $software = $_SERVER['SERVER_SOFTWARE'];
+  $requirements['webserver'] = array(
+    'title' => $t('Web server'),
+    'value' => $software,
+  );
+
+  // Test PHP version and show link to phpinfo() if it's available
+  $phpversion = phpversion();
+  if (function_exists('phpinfo')) {
+    $requirements['php'] = array(
+      'title' => $t('PHP'),
+      'value' => ($phase == 'runtime') ? $phpversion .' ('. l($t('more information'), 'admin/reports/status/php') .')' : $phpversion,
+    );
+  }
+  else {
+    $requirements['php'] = array(
+      'title' => $t('PHP'),
+      'value' => $phpversion,
+      'description' => $t('The phpinfo() function has been disabled for security reasons. To see your server\'s phpinfo() information, change your PHP settings or contact your server administrator. For more information, <a href="@phpinfo">Enabling and disabling phpinfo()</a> handbook page.', array('@phpinfo' => 'http://drupal.org/node/243993')),
+      'severity' => REQUIREMENT_INFO,
+    );
+  }
+
+  if (version_compare($phpversion, DRUPAL_MINIMUM_PHP) < 0) {
+    $requirements['php']['description'] = $t('Your PHP installation is too old. Drupal requires at least PHP %version.', array('%version' => DRUPAL_MINIMUM_PHP));
+    $requirements['php']['severity'] = REQUIREMENT_ERROR;
+    // If PHP is old, it's not safe to continue with the requirements check.
+    return $requirements;
+  }
+  // Check that htmlspecialchars() is secure if the site is running any PHP
+  // version older than 5.2.5. We don't simply require 5.2.5, because Ubuntu
+  // 8.04 ships with PHP 5.2.4, but includes the necessary security patch.
+  elseif (version_compare($phpversion, '5.2.5') < 0 && strlen(@htmlspecialchars(chr(0xC0) . chr(0xAF), ENT_QUOTES, 'UTF-8'))) {
+    $requirements['php']['description'] = $t('Your PHP installation is too old. Drupal requires at least PHP 5.2.5, or PHP @version with the htmlspecialchars security patch backported.', array('@version' => DRUPAL_MINIMUM_PHP));
+    $requirements['php']['severity'] = REQUIREMENT_ERROR;
+    // If PHP is old, it's not safe to continue with the requirements check.
+    return $requirements;
+  }
+
+  // Test PHP register_globals setting.
+  $requirements['php_register_globals'] = array(
+    'title' => $t('PHP register globals'),
+  );
+  $register_globals = trim(ini_get('register_globals'));
+  // Unfortunately, ini_get() may return many different values, and we can't
+  // be certain which values mean 'on', so we instead check for 'not off'
+  // since we never want to tell the user that their site is secure
+  // (register_globals off), when it is in fact on. We can only guarantee
+  // register_globals is off if the value returned is 'off', '', or 0.
+  if (!empty($register_globals) && strtolower($register_globals) != 'off') {
+    $requirements['php_register_globals']['description'] = $t('<em>register_globals</em> is enabled. Drupal requires this configuration directive to be disabled. Your site may not be secure when <em>register_globals</em> is enabled. The PHP manual has instructions for <a href="http://php.net/configuration.changes">how to change configuration settings</a>.');
+    $requirements['php_register_globals']['severity'] = REQUIREMENT_ERROR;
+    $requirements['php_register_globals']['value'] = $t("Enabled ('@value')", array('@value' => $register_globals));
+  }
+  else {
+    $requirements['php_register_globals']['value'] = $t('Disabled');
+  }
+
+  // Test for PHP extensions.
+  $requirements['php_extensions'] = array(
+    'title' => $t('PHP extensions'),
+  );
+
+  $missing_extensions = array();
+  $required_extensions = array(
+    'date',
+    'dom',
+    'filter',
+    'gd',
+    'hash',
+    'json',
+    'pcre',
+    'pdo',
+    'session',
+    'SimpleXML',
+    'SPL',
+    'xml',
+  );
+  foreach ($required_extensions as $extension) {
+    if (!extension_loaded($extension)) {
+      $missing_extensions[] = $extension;
+    }
+  }
+
+  if (!empty($missing_extensions)) {
+    $description = $t('Drupal requires you to enable the PHP extensions in the following list (see the <a href="@system_requirements">system requirements page</a> for more information):', array(
+      '@system_requirements' => 'http://drupal.org/requirements',
+    ));
+
+    $description .= theme('item_list', array('items' => $missing_extensions));
+
+    $requirements['php_extensions']['value'] = $t('Disabled');
+    $requirements['php_extensions']['severity'] = REQUIREMENT_ERROR;
+    $requirements['php_extensions']['description'] = $description;
+  }
+  else {
+    $requirements['php_extensions']['value'] = $t('Enabled');
+  }
+
+  if ($phase == 'install' || $phase == 'update') {
+    // Test for PDO (database).
+    $requirements['database_extensions'] = array(
+      'title' => $t('Database support'),
+    );
+
+    // Make sure PDO is available.
+    $database_ok = extension_loaded('pdo');
+    if (!$database_ok) {
+      $pdo_message = $t('Your web server does not appear to support PDO (PHP Data Objects). Ask your hosting provider if they support the native PDO extension. See the <a href="@link">system requirements</a> page for more information.', array(
+        '@link' => 'http://drupal.org/requirements/pdo',
+      ));
+    }
+    else {
+      // Make sure at least one supported database driver exists.
+      $drivers = drupal_detect_database_types();
+      if (empty($drivers)) {
+        $database_ok = FALSE;
+        $pdo_message = $t('Your web server does not appear to support any common PDO database extensions. Check with your hosting provider to see if they support PDO (PHP Data Objects) and offer any databases that <a href="@drupal-databases">Drupal supports</a>.', array(
+          '@drupal-databases' => 'http://drupal.org/node/270#database',
+        ));
+      }
+      // Make sure the native PDO extension is available, not the older PEAR
+      // version. (See install_verify_pdo() for details.)
+      if (!defined('PDO::ATTR_DEFAULT_FETCH_MODE')) {
+        $database_ok = FALSE;
+        $pdo_message = $t('Your web server seems to have the wrong version of PDO installed. Drupal 7 requires the PDO extension from PHP core. This system has the older PECL version. See the <a href="@link">system requirements</a> page for more information.', array(
+          '@link' => 'http://drupal.org/requirements/pdo#pecl',
+        ));
+      }
+    }
+
+    if (!$database_ok) {
+      $requirements['database_extensions']['value'] = $t('Disabled');
+      $requirements['database_extensions']['severity'] = REQUIREMENT_ERROR;
+      $requirements['database_extensions']['description'] = $pdo_message;
+    }
+    else {
+      $requirements['database_extensions']['value'] = $t('Enabled');
+    }
+  }
+  else {
+    // Database information.
+    $class = 'DatabaseTasks_' . Database::getConnection()->driver();
+    $tasks = new $class();
+    $requirements['database_system'] = array(
+      'title' => $t('Database system'),
+      'value' => $tasks->name(),
+    );
+    $requirements['database_system_version'] = array(
+      'title' => $t('Database system version'),
+      'value' => Database::getConnection()->version(),
+    );
+  }
+
+  // Test PHP memory_limit
+  $memory_limit = ini_get('memory_limit');
+  $requirements['php_memory_limit'] = array(
+    'title' => $t('PHP memory limit'),
+    'value' => $memory_limit == -1 ? t('-1 (Unlimited)') : $memory_limit,
+  );
+
+  if (!drupal_check_memory_limit(DRUPAL_MINIMUM_PHP_MEMORY_LIMIT, $memory_limit)) {
+    $description = '';
+    if ($phase == 'install') {
+      $description = $t('Consider increasing your PHP memory limit to %memory_minimum_limit to help prevent errors in the installation process.', array('%memory_minimum_limit' => DRUPAL_MINIMUM_PHP_MEMORY_LIMIT));
+    }
+    elseif ($phase == 'update') {
+      $description = $t('Consider increasing your PHP memory limit to %memory_minimum_limit to help prevent errors in the update process.', array('%memory_minimum_limit' => DRUPAL_MINIMUM_PHP_MEMORY_LIMIT));
+    }
+    elseif ($phase == 'runtime') {
+      $description = $t('Depending on your configuration, Drupal can run with a %memory_limit PHP memory limit. However, a %memory_minimum_limit PHP memory limit or above is recommended, especially if your site uses additional custom or contributed modules.', array('%memory_limit' => $memory_limit, '%memory_minimum_limit' => DRUPAL_MINIMUM_PHP_MEMORY_LIMIT));
+    }
+
+    if (!empty($description)) {
+      if ($php_ini_path = get_cfg_var('cfg_file_path')) {
+        $description .= ' ' . $t('Increase the memory limit by editing the memory_limit parameter in the file %configuration-file and then restart your web server (or contact your system administrator or hosting provider for assistance).', array('%configuration-file' => $php_ini_path));
+      }
+      else {
+        $description .= ' ' . $t('Contact your system administrator or hosting provider for assistance with increasing your PHP memory limit.');
+      }
+
+      $requirements['php_memory_limit']['description'] = $description . ' ' . $t('See the <a href="@url">Drupal requirements</a> for more information.', array('@url' => 'http://drupal.org/requirements'));
+      $requirements['php_memory_limit']['severity'] = REQUIREMENT_WARNING;
+    }
+  }
+
+  // Test settings.php file writability
+  if ($phase == 'runtime') {
+    $conf_dir = drupal_verify_install_file(conf_path(), FILE_NOT_WRITABLE, 'dir');
+    $conf_file = drupal_verify_install_file(conf_path() . '/settings.php', FILE_EXIST|FILE_READABLE|FILE_NOT_WRITABLE);
+    if (!$conf_dir || !$conf_file) {
+      $requirements['settings.php'] = array(
+        'value' => $t('Not protected'),
+        'severity' => REQUIREMENT_ERROR,
+        'description' => '',
+      );
+      if (!$conf_dir) {
+        $requirements['settings.php']['description'] .= $t('The directory %file is not protected from modifications and poses a security risk. You must change the directory\'s permissions to be non-writable. ', array('%file' => conf_path()));
+      }
+      if (!$conf_file) {
+        $requirements['settings.php']['description'] .= $t('The file %file is not protected from modifications and poses a security risk. You must change the file\'s permissions to be non-writable.', array('%file' => conf_path() . '/settings.php'));
+      }
+    }
+    else {
+      $requirements['settings.php'] = array(
+        'value' => $t('Protected'),
+      );
+    }
+    $requirements['settings.php']['title'] = $t('Configuration file');
+  }
+
+  // Test the contents of the .htaccess files.
+  if ($phase == 'runtime') {
+    // Try to write the .htaccess files first, to prevent false alarms in case
+    // (for example) the /tmp directory was wiped.
+    file_ensure_htaccess();
+    $htaccess_files['public://.htaccess'] = array(
+      'title' => $t('Public files directory'),
+      'directory' => variable_get('file_public_path', conf_path() . '/files'),
+    );
+    if ($private_files_directory = variable_get('file_private_path')) {
+      $htaccess_files['private://.htaccess'] = array(
+        'title' => $t('Private files directory'),
+        'directory' => $private_files_directory,
+      );
+    }
+    $htaccess_files['temporary://.htaccess'] = array(
+      'title' => $t('Temporary files directory'),
+      'directory' => variable_get('file_temporary_path', file_directory_temp()),
+    );
+    foreach ($htaccess_files as $htaccess_file => $info) {
+      // Check for the string which was added to the recommended .htaccess file
+      // in the latest security update.
+      if (!file_exists($htaccess_file) || !($contents = @file_get_contents($htaccess_file)) || strpos($contents, 'Drupal_Security_Do_Not_Remove_See_SA_2013_003') === FALSE) {
+        $requirements[$htaccess_file] = array(
+          'title' => $info['title'],
+          'value' => $t('Not fully protected'),
+          'severity' => REQUIREMENT_ERROR,
+          'description' => $t('See <a href="@url">@url</a> for information about the recommended .htaccess file which should be added to the %directory directory to help protect against arbitrary code execution.', array('@url' => 'http://drupal.org/SA-CORE-2013-003', '%directory' => $info['directory'])),
+        );
+      }
+    }
+  }
+
+  // Report cron status.
+  if ($phase == 'runtime') {
+    // Cron warning threshold defaults to two days.
+    $threshold_warning = variable_get('cron_threshold_warning', 172800);
+    // Cron error threshold defaults to two weeks.
+    $threshold_error = variable_get('cron_threshold_error', 1209600);
+    // Cron configuration help text.
+    $help = $t('For more information, see the online handbook entry for <a href="@cron-handbook">configuring cron jobs</a>.', array('@cron-handbook' => 'http://drupal.org/cron'));
+
+    // Determine when cron last ran.
+    $cron_last = variable_get('cron_last');
+    if (!is_numeric($cron_last)) {
+      $cron_last = variable_get('install_time', 0);
+    }
+
+    // Determine severity based on time since cron last ran.
+    $severity = REQUIREMENT_OK;
+    if (REQUEST_TIME - $cron_last > $threshold_error) {
+      $severity = REQUIREMENT_ERROR;
+    }
+    elseif (REQUEST_TIME - $cron_last > $threshold_warning) {
+      $severity = REQUIREMENT_WARNING;
+    }
+
+    // Set summary and description based on values determined above.
+    $summary = $t('Last run !time ago', array('!time' => format_interval(REQUEST_TIME - $cron_last)));
+    $description = '';
+    if ($severity != REQUIREMENT_OK) {
+      $description = $t('Cron has not run recently.') . ' ' . $help;
+    }
+
+    $description .= ' ' . $t('You can <a href="@cron">run cron manually</a>.', array('@cron' => url('admin/reports/status/run-cron')));
+    $description .= '<br />' . $t('To run cron from outside the site, go to <a href="!cron">!cron</a>', array('!cron' => url($base_url . '/cron.php', array('external' => TRUE, 'query' => array('cron_key' => variable_get('cron_key', 'drupal'))))));
+
+    $requirements['cron'] = array(
+      'title' => $t('Cron maintenance tasks'),
+      'severity' => $severity,
+      'value' => $summary,
+      'description' => $description
+    );
+  }
+
+  // Test files directories.
+  $directories = array(
+    variable_get('file_public_path', conf_path() . '/files'),
+    // By default no private files directory is configured. For private files
+    // to be secure the admin needs to provide a path outside the webroot.
+    variable_get('file_private_path', FALSE),
+  );
+
+  // Do not check for the temporary files directory during installation
+  // unless it has been set in settings.php. In this case the user has
+  // no alternative but to fix the directory if it is not writable.
+  if ($phase == 'install') {
+    $directories[] = variable_get('file_temporary_path', FALSE);
+  }
+  else {
+    $directories[] = variable_get('file_temporary_path', file_directory_temp());
+  }
+
+  $requirements['file system'] = array(
+    'title' => $t('File system'),
+  );
+
+  $error = '';
+  // For installer, create the directories if possible.
+  foreach ($directories as $directory) {
+    if (!$directory) {
+      continue;
+    }
+    if ($phase == 'install') {
+      file_prepare_directory($directory, FILE_CREATE_DIRECTORY);
+    }
+    $is_writable = is_writable($directory);
+    $is_directory = is_dir($directory);
+    if (!$is_writable || !$is_directory) {
+      $description = '';
+      $requirements['file system']['value'] = $t('Not writable');
+      if (!$is_directory) {
+        $error .= $t('The directory %directory does not exist.', array('%directory' => $directory)) . ' ';
+      }
+      else {
+        $error .= $t('The directory %directory is not writable.', array('%directory' => $directory)) . ' ';
+      }
+      // The files directory requirement check is done only during install and runtime.
+      if ($phase == 'runtime') {
+        $description = $error . $t('You may need to set the correct directory at the <a href="@admin-file-system">file system settings page</a> or change the current directory\'s permissions so that it is writable.', array('@admin-file-system' => url('admin/config/media/file-system')));
+      }
+      elseif ($phase == 'install') {
+        // For the installer UI, we need different wording. 'value' will
+        // be treated as version, so provide none there.
+        $description = $error . $t('An automated attempt to create this directory failed, possibly due to a permissions problem. To proceed with the installation, either create the directory and modify its permissions manually or ensure that the installer has the permissions to create it automatically. For more information, see INSTALL.txt or the <a href="@handbook_url">online handbook</a>.', array('@handbook_url' => 'http://drupal.org/server-permissions'));
+        $requirements['file system']['value'] = '';
+      }
+      if (!empty($description)) {
+        $requirements['file system']['description'] = $description;
+        $requirements['file system']['severity'] = REQUIREMENT_ERROR;
+      }
+    }
+    else {
+      if (file_default_scheme() == 'public') {
+        $requirements['file system']['value'] = $t('Writable (<em>public</em> download method)');
+      }
+      else {
+        $requirements['file system']['value'] = $t('Writable (<em>private</em> download method)');
+      }
+    }
+  }
+
+  // See if updates are available in update.php.
+  if ($phase == 'runtime') {
+    $requirements['update'] = array(
+      'title' => $t('Database updates'),
+      'severity' => REQUIREMENT_OK,
+      'value' => $t('Up to date'),
+    );
+
+    // Check installed modules.
+    foreach (module_list() as $module) {
+      $updates = drupal_get_schema_versions($module);
+      if ($updates !== FALSE) {
+        $default = drupal_get_installed_schema_version($module);
+        if (max($updates) > $default) {
+          $requirements['update']['severity'] = REQUIREMENT_ERROR;
+          $requirements['update']['value'] = $t('Out of date');
+          $requirements['update']['description'] = $t('Some modules have database schema updates to install. You should run the <a href="@update">database update script</a> immediately.', array('@update' => base_path() . 'update.php'));
+          break;
+        }
+      }
+    }
+  }
+
+  // Verify the update.php access setting
+  if ($phase == 'runtime') {
+    if (!empty($GLOBALS['update_free_access'])) {
+      $requirements['update access'] = array(
+        'value' => $t('Not protected'),
+        'severity' => REQUIREMENT_ERROR,
+        'description' => $t('The update.php script is accessible to everyone without authentication check, which is a security risk. You must change the $update_free_access value in your settings.php back to FALSE.'),
+      );
+    }
+    else {
+      $requirements['update access'] = array(
+        'value' => $t('Protected'),
+      );
+    }
+    $requirements['update access']['title'] = $t('Access to update.php');
+  }
+
+  // Display an error if a newly introduced dependency in a module is not resolved.
+  if ($phase == 'update') {
+    $profile = drupal_get_profile();
+    $files = system_rebuild_module_data();
+    foreach ($files as $module => $file) {
+      // Ignore disabled modules and installation profiles.
+      if (!$file->status || $module == $profile) {
+        continue;
+      }
+      // Check the module's PHP version.
+      $name = $file->info['name'];
+      $php = $file->info['php'];
+      if (version_compare($php, PHP_VERSION, '>')) {
+        $requirements['php']['description'] .= $t('@name requires at least PHP @version.', array('@name' => $name, '@version' => $php));
+        $requirements['php']['severity'] = REQUIREMENT_ERROR;
+      }
+      // Check the module's required modules.
+      foreach ($file->requires as $requirement) {
+        $required_module = $requirement['name'];
+        // Check if the module exists.
+        if (!isset($files[$required_module])) {
+          $requirements["$module-$required_module"] = array(
+            'title' => $t('Unresolved dependency'),
+            'description' => $t('@name requires this module.', array('@name' => $name)),
+            'value' => t('@required_name (Missing)', array('@required_name' => $required_module)),
+            'severity' => REQUIREMENT_ERROR,
+          );
+          continue;
+        }
+        // Check for an incompatible version.
+        $required_file = $files[$required_module];
+        $required_name = $required_file->info['name'];
+        $version = str_replace(DRUPAL_CORE_COMPATIBILITY . '-', '', $required_file->info['version']);
+        $compatibility = drupal_check_incompatibility($requirement, $version);
+        if ($compatibility) {
+          $compatibility = rtrim(substr($compatibility, 2), ')');
+          $requirements["$module-$required_module"] = array(
+            'title' => $t('Unresolved dependency'),
+            'description' => $t('@name requires this module and version. Currently using @required_name version @version', array('@name' => $name, '@required_name' => $required_name, '@version' => $version)),
+            'value' => t('@required_name (Version @compatibility required)', array('@required_name' => $required_name, '@compatibility' => $compatibility)),
+            'severity' => REQUIREMENT_ERROR,
+          );
+          continue;
+        }
+      }
+    }
+  }
+
+  // Test Unicode library
+  include_once DRUPAL_ROOT . '/includes/unicode.inc';
+  $requirements = array_merge($requirements, unicode_requirements());
+
+  if ($phase == 'runtime') {
+    // Check for update status module.
+    if (!module_exists('update')) {
+      $requirements['update status'] = array(
+        'value' => $t('Not enabled'),
+        'severity' => REQUIREMENT_WARNING,
+        'description' => $t('Update notifications are not enabled. It is <strong>highly recommended</strong> that you enable the update manager module from the <a href="@module">module administration page</a> in order to stay up-to-date on new releases. For more information, <a href="@update">Update status handbook page</a>.', array('@update' => 'http://drupal.org/documentation/modules/update', '@module' => url('admin/modules'))),
+      );
+    }
+    else {
+      $requirements['update status'] = array(
+        'value' => $t('Enabled'),
+      );
+    }
+    $requirements['update status']['title'] = $t('Update notifications');
+
+    // Check that Drupal can issue HTTP requests.
+    if (variable_get('drupal_http_request_fails', TRUE) && !system_check_http_request()) {
+      $requirements['http requests'] = array(
+        'title' => $t('HTTP request status'),
+        'value' => $t('Fails'),
+        'severity' => REQUIREMENT_ERROR,
+        'description' => $t('Your system or network configuration does not allow Drupal to access web pages, resulting in reduced functionality. This could be due to your webserver configuration or PHP settings, and should be resolved in order to download information about available updates, fetch aggregator feeds, sign in via OpenID, or use other network-dependent services. If you are certain that Drupal can access web pages but you are still seeing this message, you may add <code>$conf[\'drupal_http_request_fails\'] = FALSE;</code> to the bottom of your settings.php file.'),
+      );
+    }
+  }
+
+  return $requirements;
+}
+
+/**
+ * Implements hook_install().
+ */
+function system_install() {
+  // Create tables.
+  drupal_install_schema('system');
+  $versions = drupal_get_schema_versions('system');
+  $version = $versions ? max($versions) : SCHEMA_INSTALLED;
+  drupal_set_installed_schema_version('system', $version);
+
+  // Clear out module list and hook implementation statics before calling
+  // system_rebuild_theme_data().
+  module_list(TRUE);
+  module_implements('', FALSE, TRUE);
+
+  // Load system theme data appropriately.
+  system_rebuild_theme_data();
+
+  // Enable the default theme.
+  variable_set('theme_default', 'bartik');
+  db_update('system')
+    ->fields(array('status' => 1))
+    ->condition('type', 'theme')
+    ->condition('name', 'bartik')
+    ->execute();
+
+  // Populate the cron key variable.
+  $cron_key = drupal_random_key();
+  variable_set('cron_key', $cron_key);
+}
+
+/**
+ * Implements hook_schema().
+ */
+function system_schema() {
+  // NOTE: {variable} needs to be created before all other tables, as
+  // some database drivers, e.g. Oracle and DB2, will require variable_get()
+  // and variable_set() for overcoming some database specific limitations.
+  $schema['variable'] = array(
+    'description' => 'Named variable/value pairs created by Drupal core or any other module or theme. All variables are cached in memory at the start of every Drupal request so developers should not be careless about what is stored here.',
+    'fields' => array(
+      'name' => array(
+        'description' => 'The name of the variable.',
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'value' => array(
+        'description' => 'The value of the variable.',
+        'type' => 'blob',
+        'not null' => TRUE,
+        'size' => 'big',
+        'translatable' => TRUE,
+      ),
+    ),
+    'primary key' => array('name'),
+  );
+
+  $schema['actions'] = array(
+    'description' => 'Stores action information.',
+    'fields' => array(
+      'aid' => array(
+        'description' => 'Primary Key: Unique actions ID.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '0',
+      ),
+      'type' => array(
+        'description' => 'The object that that action acts on (node, user, comment, system or custom types.)',
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'callback' => array(
+        'description' => 'The callback function that executes when the action runs.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'parameters' => array(
+        'description' => 'Parameters to be passed to the callback function.',
+        'type' => 'blob',
+        'not null' => TRUE,
+        'size' => 'big',
+      ),
+      'label' => array(
+        'description' => 'Label of the action.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '0',
+      ),
+    ),
+    'primary key' => array('aid'),
+  );
+
+  $schema['batch'] = array(
+    'description' => 'Stores details about batches (processes that run in multiple HTTP requests).',
+    'fields' => array(
+      'bid' => array(
+        'description' => 'Primary Key: Unique batch ID.',
+        // This is not a serial column, to allow both progressive and
+        // non-progressive batches. See batch_process().
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'token' => array(
+        'description' => "A string token generated against the current user's session id and the batch id, used to ensure that only the user who submitted the batch can effectively access it.",
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+      ),
+      'timestamp' => array(
+        'description' => 'A Unix timestamp indicating when this batch was submitted for processing. Stale batches are purged at cron time.',
+        'type' => 'int',
+        'not null' => TRUE,
+      ),
+      'batch' => array(
+        'description' => 'A serialized array containing the processing data for the batch.',
+        'type' => 'blob',
+        'not null' => FALSE,
+        'size' => 'big',
+      ),
+    ),
+    'primary key' => array('bid'),
+    'indexes' => array(
+      'token' => array('token'),
+    ),
+  );
+
+  $schema['blocked_ips'] = array(
+    'description' => 'Stores blocked IP addresses.',
+    'fields' => array(
+       'iid' => array(
+        'description' => 'Primary Key: unique ID for IP addresses.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'ip' => array(
+        'description' => 'IP address',
+        'type' => 'varchar',
+        'length' => 40,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+    ),
+    'indexes' => array(
+      'blocked_ip' => array('ip'),
+    ),
+    'primary key' => array('iid'),
+  );
+
+  $schema['cache'] = array(
+    'description' => 'Generic cache table for caching things not separated out into their own tables. Contributed modules may also use this to store cached items.',
+    'fields' => array(
+      'cid' => array(
+        'description' => 'Primary Key: Unique cache ID.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'data' => array(
+        'description' => 'A collection of data to cache.',
+        'type' => 'blob',
+        'not null' => FALSE,
+        'size' => 'big',
+      ),
+      'expire' => array(
+        'description' => 'A Unix timestamp indicating when the cache entry should expire, or 0 for never.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'created' => array(
+        'description' => 'A Unix timestamp indicating when the cache entry was created.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'serialized' => array(
+        'description' => 'A flag to indicate whether content is serialized (1) or not (0).',
+        'type' => 'int',
+        'size' => 'small',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'indexes' => array(
+      'expire' => array('expire'),
+    ),
+    'primary key' => array('cid'),
+  );
+  $schema['cache_bootstrap'] = $schema['cache'];
+  $schema['cache_bootstrap']['description'] = 'Cache table for data required to bootstrap Drupal, may be routed to a shared memory cache.';
+  $schema['cache_form'] = $schema['cache'];
+  $schema['cache_form']['description'] = 'Cache table for the form system to store recently built forms and their storage data, to be used in subsequent page requests.';
+  $schema['cache_page'] = $schema['cache'];
+  $schema['cache_page']['description'] = 'Cache table used to store compressed pages for anonymous users, if page caching is enabled.';
+  $schema['cache_menu'] = $schema['cache'];
+  $schema['cache_menu']['description'] = 'Cache table for the menu system to store router information as well as generated link trees for various menu/page/user combinations.';
+  $schema['cache_path'] = $schema['cache'];
+  $schema['cache_path']['description'] = 'Cache table for path alias lookup.';
+
+  $schema['date_format_type'] = array(
+    'description' => 'Stores configured date format types.',
+    'fields' => array(
+      'type' => array(
+        'description' => 'The date format type, e.g. medium.',
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+      ),
+      'title' => array(
+        'description' => 'The human readable name of the format type.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+      ),
+      'locked' => array(
+        'description' => 'Whether or not this is a system provided format.',
+        'type' => 'int',
+        'size' => 'tiny',
+        'default' => 0,
+        'not null' => TRUE,
+      ),
+    ),
+    'primary key' => array('type'),
+    'indexes' => array(
+      'title' => array('title'),
+    ),
+  );
+
+  // This table's name is plural as some versions of MySQL can't create a
+  // table named 'date_format'.
+  $schema['date_formats'] = array(
+    'description' => 'Stores configured date formats.',
+    'fields' => array(
+      'dfid' => array(
+        'description' => 'The date format identifier.',
+        'type' => 'serial',
+        'not null' => TRUE,
+        'unsigned' => TRUE,
+      ),
+      'format' => array(
+        'description' => 'The date format string.',
+        'type' => 'varchar',
+        'length' => 100,
+        'not null' => TRUE,
+        'binary' => TRUE,
+      ),
+      'type' => array(
+        'description' => 'The date format type, e.g. medium.',
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+      ),
+      'locked' => array(
+        'description' => 'Whether or not this format can be modified.',
+        'type' => 'int',
+        'size' => 'tiny',
+        'default' => 0,
+        'not null' => TRUE,
+      ),
+    ),
+    'primary key' => array('dfid'),
+    'unique keys' => array('formats' => array('format', 'type')),
+  );
+
+  $schema['date_format_locale'] = array(
+    'description' => 'Stores configured date formats for each locale.',
+    'fields' => array(
+      'format' => array(
+        'description' => 'The date format string.',
+        'type' => 'varchar',
+        'length' => 100,
+        'not null' => TRUE,
+      ),
+      'type' => array(
+        'description' => 'The date format type, e.g. medium.',
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+      ),
+      'language' => array(
+        'description' => 'A {languages}.language for this format to be used with.',
+        'type' => 'varchar',
+        'length' => 12,
+        'not null' => TRUE,
+      ),
+    ),
+    'primary key' => array('type', 'language'),
+  );
+
+  $schema['file_managed'] = array(
+    'description' => 'Stores information for uploaded files.',
+    'fields' => array(
+      'fid' => array(
+        'description' => 'File ID.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'uid' => array(
+        'description' => 'The {users}.uid of the user who is associated with the file.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'filename' => array(
+        'description' => 'Name of the file with no path components. This may differ from the basename of the URI if the file is renamed to avoid overwriting an existing file.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'uri' => array(
+        'description' => 'The URI to access the file (either local or remote).',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'binary' => TRUE,
+      ),
+      'filemime' => array(
+        'description' => "The file's MIME type.",
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'filesize' => array(
+        'description' => 'The size of the file in bytes.',
+        'type' => 'int',
+        'size' => 'big',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'status' => array(
+        'description' => 'A field indicating the status of the file. Two status are defined in core: temporary (0) and permanent (1). Temporary files older than DRUPAL_MAXIMUM_TEMP_FILE_AGE will be removed during a cron run.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'timestamp' => array(
+        'description' => 'UNIX timestamp for when the file was added.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'indexes' => array(
+      'uid' => array('uid'),
+      'status' => array('status'),
+      'timestamp' => array('timestamp'),
+    ),
+    'unique keys' => array(
+      'uri' => array('uri'),
+    ),
+    'primary key' => array('fid'),
+    'foreign keys' => array(
+      'file_owner' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid'),
+      ),
+    ),
+  );
+
+  $schema['file_usage'] = array(
+    'description' => 'Track where a file is used.',
+    'fields' => array(
+      'fid' => array(
+        'description' => 'File ID.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'module' => array(
+        'description' => 'The name of the module that is using the file.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'type' => array(
+        'description' => 'The name of the object type in which the file is used.',
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'id' => array(
+        'description' => 'The primary key of the object using the file.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'count' => array(
+        'description' => 'The number of times this file is used by this object.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'primary key' => array('fid', 'type', 'id', 'module'),
+    'indexes' => array(
+      'type_id' => array('type', 'id'),
+      'fid_count' => array('fid', 'count'),
+      'fid_module' => array('fid', 'module'),
+    ),
+  );
+
+  $schema['flood'] = array(
+    'description' => 'Flood controls the threshold of events, such as the number of contact attempts.',
+    'fields' => array(
+      'fid' => array(
+        'description' => 'Unique flood event ID.',
+        'type' => 'serial',
+        'not null' => TRUE,
+      ),
+      'event' => array(
+        'description' => 'Name of event (e.g. contact).',
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'identifier' => array(
+        'description' => 'Identifier of the visitor, such as an IP address or hostname.',
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'timestamp' => array(
+        'description' => 'Timestamp of the event.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'expiration' => array(
+        'description' => 'Expiration timestamp. Expired events are purged on cron run.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'primary key' => array('fid'),
+    'indexes' => array(
+      'allow' => array('event', 'identifier', 'timestamp'),
+      'purge' => array('expiration'),
+    ),
+  );
+
+  $schema['menu_router'] = array(
+    'description' => 'Maps paths to various callbacks (access, page and title)',
+    'fields' => array(
+      'path' => array(
+        'description' => 'Primary Key: the Drupal path this entry describes',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'load_functions' => array(
+        'description' => 'A serialized array of function names (like node_load) to be called to load an object corresponding to a part of the current path.',
+        'type' => 'blob',
+        'not null' => TRUE,
+      ),
+      'to_arg_functions' => array(
+        'description' => 'A serialized array of function names (like user_uid_optional_to_arg) to be called to replace a part of the router path with another string.',
+        'type' => 'blob',
+        'not null' => TRUE,
+      ),
+      'access_callback' => array(
+        'description' => 'The callback which determines the access to this router path. Defaults to user_access.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'access_arguments' => array(
+        'description' => 'A serialized array of arguments for the access callback.',
+        'type' => 'blob',
+        'not null' => FALSE,
+      ),
+      'page_callback' => array(
+        'description' => 'The name of the function that renders the page.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'page_arguments' => array(
+        'description' => 'A serialized array of arguments for the page callback.',
+        'type' => 'blob',
+        'not null' => FALSE,
+      ),
+      'delivery_callback' => array(
+        'description' => 'The name of the function that sends the result of the page_callback function to the browser.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'fit' => array(
+        'description' => 'A numeric representation of how specific the path is.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'number_parts' => array(
+        'description' => 'Number of parts in this router path.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'small',
+      ),
+      'context' => array(
+        'description' => 'Only for local tasks (tabs) - the context of a local task to control its placement.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'tab_parent' => array(
+        'description' => 'Only for local tasks (tabs) - the router path of the parent page (which may also be a local task).',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'tab_root' => array(
+        'description' => 'Router path of the closest non-tab parent page. For pages that are not local tasks, this will be the same as the path.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'title' => array(
+        'description' => 'The title for the current page, or the title for the tab if this is a local task.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'title_callback' => array(
+        'description' => 'A function which will alter the title. Defaults to t()',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'title_arguments' => array(
+        'description' => 'A serialized array of arguments for the title callback. If empty, the title will be used as the sole argument for the title callback.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'theme_callback' => array(
+        'description' => 'A function which returns the name of the theme that will be used to render this page. If left empty, the default theme will be used.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'theme_arguments' => array(
+        'description' => 'A serialized array of arguments for the theme callback.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'type' => array(
+        'description' => 'Numeric representation of the type of the menu item, like MENU_LOCAL_TASK.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'description' => array(
+        'description' => 'A description of this item.',
+        'type' => 'text',
+        'not null' => TRUE,
+      ),
+      'position' => array(
+        'description' => 'The position of the block (left or right) on the system administration page for this item.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'weight' => array(
+        'description' => 'Weight of the element. Lighter weights are higher up, heavier weights go down.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'include_file' => array(
+        'description' => 'The file to include for this element, usually the page callback function lives in this file.',
+        'type' => 'text',
+        'size' => 'medium',
+      ),
+    ),
+    'indexes' => array(
+      'fit' => array('fit'),
+      'tab_parent' => array(array('tab_parent', 64), 'weight', 'title'),
+      'tab_root_weight_title' => array(array('tab_root', 64), 'weight', 'title'),
+    ),
+    'primary key' => array('path'),
+  );
+
+  $schema['menu_links'] = array(
+    'description' => 'Contains the individual links within a menu.',
+    'fields' => array(
+     'menu_name' => array(
+        'description' => "The menu name. All links with the same menu name (such as 'navigation') are part of the same menu.",
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'mlid' => array(
+        'description' => 'The menu link ID (mlid) is the integer primary key.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'plid' => array(
+        'description' => 'The parent link ID (plid) is the mlid of the link above in the hierarchy, or zero if the link is at the top level in its menu.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'link_path' => array(
+        'description' => 'The Drupal path or external path this link points to.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'router_path' => array(
+        'description' => 'For links corresponding to a Drupal path (external = 0), this connects the link to a {menu_router}.path for joins.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'link_title' => array(
+      'description' => 'The text displayed for the link, which may be modified by a title callback stored in {menu_router}.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'translatable' => TRUE,
+      ),
+      'options' => array(
+        'description' => 'A serialized array of options to be passed to the url() or l() function, such as a query string or HTML attributes.',
+        'type' => 'blob',
+        'not null' => FALSE,
+        'translatable' => TRUE,
+      ),
+      'module' => array(
+        'description' => 'The name of the module that generated this link.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => 'system',
+      ),
+      'hidden' => array(
+        'description' => 'A flag for whether the link should be rendered in menus. (1 = a disabled menu item that may be shown on admin screens, -1 = a menu callback, 0 = a normal, visible link)',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'small',
+      ),
+      'external' => array(
+        'description' => 'A flag to indicate if the link points to a full URL starting with a protocol, like http:// (1 = external, 0 = internal).',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'small',
+      ),
+      'has_children' => array(
+        'description' => 'Flag indicating whether any links have this link as a parent (1 = children exist, 0 = no children).',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'small',
+      ),
+      'expanded' => array(
+        'description' => 'Flag for whether this link should be rendered as expanded in menus - expanded links always have their child links displayed, instead of only when the link is in the active trail (1 = expanded, 0 = not expanded)',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'small',
+      ),
+      'weight' => array(
+        'description' => 'Link weight among links in the same menu at the same depth.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'depth' => array(
+        'description' => 'The depth relative to the top level. A link with plid == 0 will have depth == 1.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'small',
+      ),
+      'customized' => array(
+        'description' => 'A flag to indicate that the user has manually created or edited the link (1 = customized, 0 = not customized).',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'small',
+      ),
+      'p1' => array(
+        'description' => 'The first mlid in the materialized path. If N = depth, then pN must equal the mlid. If depth > 1 then p(N-1) must equal the plid. All pX where X > depth must equal zero. The columns p1 .. p9 are also called the parents.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'p2' => array(
+        'description' => 'The second mlid in the materialized path. See p1.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'p3' => array(
+        'description' => 'The third mlid in the materialized path. See p1.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'p4' => array(
+        'description' => 'The fourth mlid in the materialized path. See p1.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'p5' => array(
+        'description' => 'The fifth mlid in the materialized path. See p1.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'p6' => array(
+        'description' => 'The sixth mlid in the materialized path. See p1.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'p7' => array(
+        'description' => 'The seventh mlid in the materialized path. See p1.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'p8' => array(
+        'description' => 'The eighth mlid in the materialized path. See p1.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'p9' => array(
+        'description' => 'The ninth mlid in the materialized path. See p1.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'updated' => array(
+        'description' => 'Flag that indicates that this link was generated during the update from Drupal 5.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'small',
+      ),
+    ),
+    'indexes' => array(
+      'path_menu' => array(array('link_path', 128), 'menu_name'),
+      'menu_plid_expand_child' => array('menu_name', 'plid', 'expanded', 'has_children'),
+      'menu_parents' => array('menu_name', 'p1', 'p2', 'p3', 'p4', 'p5', 'p6', 'p7', 'p8', 'p9'),
+      'router_path' => array(array('router_path', 128)),
+    ),
+    'primary key' => array('mlid'),
+  );
+
+  $schema['queue'] = array(
+    'description' => 'Stores items in queues.',
+    'fields' => array(
+      'item_id' => array(
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique item ID.',
+      ),
+      'name' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The queue name.',
+      ),
+      'data' => array(
+        'type' => 'blob',
+        'not null' => FALSE,
+        'size' => 'big',
+        'serialize' => TRUE,
+        'description' => 'The arbitrary data for the item.',
+      ),
+      'expire' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Timestamp when the claim lease expires on the item.',
+      ),
+      'created' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Timestamp when the item was created.',
+      ),
+    ),
+    'primary key' => array('item_id'),
+    'indexes' => array(
+      'name_created' => array('name', 'created'),
+      'expire' => array('expire'),
+    ),
+  );
+
+  $schema['registry'] = array(
+    'description' => "Each record is a function, class, or interface name and the file it is in.",
+    'fields' => array(
+      'name'   => array(
+        'description' => 'The name of the function, class, or interface.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'type'   => array(
+        'description' => 'Either function or class or interface.',
+        'type' => 'varchar',
+        'length' => 9,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'filename'   => array(
+        'description' => 'Name of the file.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+      ),
+      'module' => array(
+        'description' => 'Name of the module the file belongs to.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => ''
+      ),
+      'weight' => array(
+        'description' => "The order in which this module's hooks should be invoked relative to other modules. Equal-weighted modules are ordered by name.",
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'primary key' => array('name', 'type'),
+    'indexes' => array(
+      'hook' => array('type', 'weight', 'module'),
+    ),
+  );
+
+  $schema['registry_file'] = array(
+    'description' => "Files parsed to build the registry.",
+    'fields' => array(
+      'filename'   => array(
+        'description' => 'Path to the file.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+      ),
+      'hash'  => array(
+        'description' => "sha-256 hash of the file's contents when last parsed.",
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+      ),
+    ),
+    'primary key' => array('filename'),
+  );
+
+  $schema['semaphore'] = array(
+    'description' => 'Table for holding semaphores, locks, flags, etc. that cannot be stored as Drupal variables since they must not be cached.',
+    'fields' => array(
+      'name' => array(
+        'description' => 'Primary Key: Unique name.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => ''
+      ),
+      'value' => array(
+        'description' => 'A value for the semaphore.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => ''
+      ),
+      'expire' => array(
+        'description' => 'A Unix timestamp with microseconds indicating when the semaphore should expire.',
+        'type' => 'float',
+        'size' => 'big',
+        'not null' => TRUE
+      ),
+    ),
+    'indexes' => array(
+      'value' => array('value'),
+      'expire' => array('expire'),
+    ),
+    'primary key' => array('name'),
+  );
+
+  $schema['sequences'] = array(
+    'description' => 'Stores IDs.',
+    'fields' => array(
+      'value' => array(
+        'description' => 'The value of the sequence.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+     ),
+    'primary key' => array('value'),
+  );
+
+  $schema['sessions'] = array(
+    'description' => "Drupal's session handlers read and write into the sessions table. Each record represents a user session, either anonymous or authenticated.",
+    'fields' => array(
+      'uid' => array(
+        'description' => 'The {users}.uid corresponding to a session, or 0 for anonymous user.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'sid' => array(
+        'description' => "A session ID. The value is generated by Drupal's session handlers.",
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+      ),
+      'ssid' => array(
+        'description' => "Secure session ID. The value is generated by Drupal's session handlers.",
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'hostname' => array(
+        'description' => 'The IP address that last used this session ID (sid).',
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'timestamp' => array(
+        'description' => 'The Unix timestamp when this session last requested a page. Old records are purged by PHP automatically.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'cache' => array(
+        'description' => "The time of this user's last post. This is used when the site has specified a minimum_cache_lifetime. See cache_get().",
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'session' => array(
+        'description' => 'The serialized contents of $_SESSION, an array of name/value pairs that persists across page requests by this session ID. Drupal loads $_SESSION from here at the start of each request and saves it at the end.',
+        'type' => 'blob',
+        'not null' => FALSE,
+        'size' => 'big',
+      ),
+    ),
+    'primary key' => array(
+      'sid',
+      'ssid',
+    ),
+    'indexes' => array(
+      'timestamp' => array('timestamp'),
+      'uid' => array('uid'),
+      'ssid' => array('ssid'),
+    ),
+    'foreign keys' => array(
+      'session_user' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid'),
+      ),
+    ),
+  );
+
+  $schema['system'] = array(
+    'description' => "A list of all modules, themes, and theme engines that are or have been installed in Drupal's file system.",
+    'fields' => array(
+      'filename' => array(
+        'description' => 'The path of the primary file for this item, relative to the Drupal root; e.g. modules/node/node.module.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'name' => array(
+        'description' => 'The name of the item; e.g. node.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'type' => array(
+        'description' => 'The type of the item, either module, theme, or theme_engine.',
+        'type' => 'varchar',
+        'length' => 12,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'owner' => array(
+        'description' => "A theme's 'parent' . Can be either a theme or an engine.",
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'status' => array(
+        'description' => 'Boolean indicating whether or not this item is enabled.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'bootstrap' => array(
+        'description' => "Boolean indicating whether this module is loaded during Drupal's early bootstrapping phase (e.g. even before the page cache is consulted).",
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'schema_version' => array(
+        'description' => "The module's database schema version number. -1 if the module is not installed (its tables do not exist); 0 or the largest N of the module's hook_update_N() function that has either been run or existed when the module was first installed.",
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => -1,
+        'size' => 'small',
+      ),
+      'weight' => array(
+        'description' => "The order in which this module's hooks should be invoked relative to other modules. Equal-weighted modules are ordered by name.",
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'info' => array(
+        'description' => "A serialized array containing information from the module's .info file; keys can include name, description, package, version, core, dependencies, and php.",
+        'type' => 'blob',
+        'not null' => FALSE,
+      ),
+    ),
+    'primary key' => array('filename'),
+    'indexes' => array(
+      'system_list' => array('status', 'bootstrap', 'type', 'weight', 'name'),
+      'type_name' => array('type', 'name'),
+    ),
+  );
+
+  $schema['url_alias'] = array(
+    'description' => 'A list of URL aliases for Drupal paths; a user may visit either the source or destination path.',
+    'fields' => array(
+      'pid' => array(
+        'description' => 'A unique path alias identifier.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'source' => array(
+        'description' => 'The Drupal path this alias is for; e.g. node/12.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'alias' => array(
+        'description' => 'The alias for this path; e.g. title-of-the-story.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'language' => array(
+        'description' => "The language this alias is for; if 'und', the alias will be used for unknown languages. Each Drupal path can have an alias for each supported language.",
+        'type' => 'varchar',
+        'length' => 12,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+    ),
+    'primary key' => array('pid'),
+    'indexes' => array(
+      'alias_language_pid' => array('alias', 'language', 'pid'),
+      'source_language_pid' => array('source', 'language', 'pid'),
+    ),
+  );
+
+  return $schema;
+}
+
+/**
+ * The cache schema corresponding to system_update_7054.
+ *
+ * Drupal 7 adds several new cache tables. Since they all have identical schema
+ * this helper function allows them to re-use the same definition, without
+ * relying on system_schema(), which may change with future updates.
+ */
+function system_schema_cache_7054() {
+  return array(
+    'description' => 'Generic cache table for caching things not separated out into their own tables. Contributed modules may also use this to store cached items.',
+    'fields' => array(
+      'cid' => array(
+        'description' => 'Primary Key: Unique cache ID.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'data' => array(
+        'description' => 'A collection of data to cache.',
+        'type' => 'blob',
+        'not null' => FALSE,
+        'size' => 'big',
+      ),
+      'expire' => array(
+        'description' => 'A Unix timestamp indicating when the cache entry should expire, or 0 for never.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'created' => array(
+        'description' => 'A Unix timestamp indicating when the cache entry was created.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'serialized' => array(
+        'description' => 'A flag to indicate whether content is serialized (1) or not (0).',
+        'type' => 'int',
+        'size' => 'small',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'indexes' => array(
+      'expire' => array('expire'),
+    ),
+    'primary key' => array('cid'),
+  );
+}
+
+
+// Updates for core.
+
+function system_update_last_removed() {
+  return 6055;
+}
+
+/**
+ * Implements hook_update_dependencies().
+ */
+function system_update_dependencies() {
+  // system_update_7053() queries the {block} table, so it must run after
+  // block_update_7002(), which creates that table.
+  $dependencies['system'][7053] = array(
+    'block' => 7002,
+  );
+
+  // system_update_7061() queries the {node_revision} table, so it must run
+  // after node_update_7001(), which renames the {node_revisions} table.
+  $dependencies['system'][7061] = array(
+    'node' => 7001,
+  );
+
+  // system_update_7067() migrates role permissions and therefore must run
+  // after the {role} and {role_permission} tables are properly set up, which
+  // happens in user_update_7007().
+  $dependencies['system'][7067] = array(
+    'user' => 7007,
+  );
+
+  return $dependencies;
+}
+
+/**
+ * @defgroup updates-6.x-to-7.x Updates from 6.x to 7.x
+ * @{
+ * Update functions from 6.x to 7.x.
+ */
+
+/**
+ * Rename blog and forum permissions to be consistent with other content types.
+ */
+function system_update_7000() {
+  $result = db_query("SELECT rid, perm FROM {permission} ORDER BY rid");
+  foreach ($result as $role) {
+    $renamed_permission = $role->perm;
+    $renamed_permission = preg_replace('/(?<=^|,\ )create\ blog\ entries(?=,|$)/', 'create blog content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )edit\ own\ blog\ entries(?=,|$)/', 'edit own blog content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )edit\ any\ blog\ entry(?=,|$)/', 'edit any blog content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )delete\ own\ blog\ entries(?=,|$)/', 'delete own blog content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )delete\ any\ blog\ entry(?=,|$)/', 'delete any blog content', $renamed_permission);
+
+    $renamed_permission = preg_replace('/(?<=^|,\ )create\ forum\ topics(?=,|$)/', 'create forum content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )delete\ any\ forum\ topic(?=,|$)/', 'delete any forum content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )delete\ own\ forum\ topics(?=,|$)/', 'delete own forum content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )edit\ any\ forum\ topic(?=,|$)/', 'edit any forum content', $renamed_permission);
+    $renamed_permission = preg_replace('/(?<=^|,\ )edit\ own\ forum\ topics(?=,|$)/', 'edit own forum content', $renamed_permission);
+
+    if ($renamed_permission != $role->perm) {
+      db_update('permission')
+        ->fields(array('perm' => $renamed_permission))
+        ->condition('rid', $role->rid)
+        ->execute();
+    }
+  }
+}
+
+/**
+ * Generate a cron key and save it in the variables table.
+ */
+function system_update_7001() {
+  variable_set('cron_key', drupal_random_key());
+}
+
+/**
+ * Add a table to store blocked IP addresses.
+ */
+function system_update_7002() {
+  $schema['blocked_ips'] = array(
+    'description' => 'Stores blocked IP addresses.',
+    'fields' => array(
+      'iid' => array(
+        'description' => 'Primary Key: unique ID for IP addresses.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'ip' => array(
+        'description' => 'IP address',
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+    ),
+    'indexes' => array(
+      'blocked_ip' => array('ip'),
+    ),
+    'primary key' => array('iid'),
+  );
+
+  db_create_table('blocked_ips', $schema['blocked_ips']);
+}
+
+/**
+ * Update {blocked_ips} with valid IP addresses from {access}.
+ */
+function system_update_7003() {
+  $messages = array();
+  $type = 'host';
+  $result = db_query("SELECT mask FROM {access} WHERE status = :status AND type = :type", array(
+    ':status' => 0,
+    ':type' => $type,
+  ));
+  foreach ($result as $blocked) {
+    if (filter_var($blocked->mask, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE) !== FALSE) {
+      db_insert('blocked_ips')
+        ->fields(array('ip' => $blocked->mask))
+        ->execute();
+    }
+    else {
+      $invalid_host = check_plain($blocked->mask);
+      $messages[] = t('The host !host is no longer blocked because it is not a valid IP address.', array('!host' => $invalid_host ));
+    }
+  }
+  if (isset($invalid_host)) {
+    drupal_set_message('Drupal no longer supports wildcard IP address blocking. Visitors whose IP addresses match ranges you have previously set using <em>access rules</em> will no longer be blocked from your site when you put the site online. See the <a href="http://drupal.org/node/24302">IP address and referrer blocking Handbook page</a> for alternative methods.', 'warning');
+  }
+  // Make sure not to block any IP addresses that were specifically allowed by access rules.
+  if (!empty($result)) {
+    $result = db_query("SELECT mask FROM {access} WHERE status = :status AND type = :type", array(
+      ':status' => 1,
+      ':type' => $type,
+    ));
+    $or = db_condition('or');
+    foreach ($result as $allowed) {
+      $or->condition('ip', $allowed->mask, 'LIKE');
+    }
+    if (count($or)) {
+      db_delete('blocked_ips')
+        ->condition($or)
+        ->execute();
+    }
+  }
+}
+
+/**
+ * Remove hardcoded numeric deltas from all blocks in core.
+ */
+function system_update_7004(&$sandbox) {
+  // Get an array of the renamed block deltas, organized by module.
+  $renamed_deltas = array(
+    'blog' => array('0' => 'recent'),
+    'book' => array('0' => 'navigation'),
+    'comment' => array('0' => 'recent'),
+    'forum' => array(
+      '0' => 'active',
+      '1' => 'new',
+    ),
+    'locale' => array('0' => LANGUAGE_TYPE_INTERFACE),
+    'node' => array('0' => 'syndicate'),
+    'poll' => array('0' => 'recent'),
+    'profile' => array('0' => 'author-information'),
+    'search' => array('0' => 'form'),
+    'statistics' => array('0' => 'popular'),
+    'system' => array('0' => 'powered-by'),
+    'user' => array(
+      '0' => 'login',
+      '1' => 'navigation',
+      '2' => 'new',
+      '3' => 'online',
+    ),
+  );
+
+  $moved_deltas = array(
+    'user' => array('navigation' => 'system'),
+  );
+
+  // Only run this the first time through the batch update.
+  if (!isset($sandbox['progress'])) {
+    // Rename forum module's block variables.
+    $forum_block_num_0 = variable_get('forum_block_num_0');
+    if (isset($forum_block_num_0)) {
+      variable_set('forum_block_num_active', $forum_block_num_0);
+      variable_del('forum_block_num_0');
+    }
+    $forum_block_num_1 = variable_get('forum_block_num_1');
+    if (isset($forum_block_num_1)) {
+      variable_set('forum_block_num_new', $forum_block_num_1);
+      variable_del('forum_block_num_1');
+    }
+  }
+
+  update_fix_d7_block_deltas($sandbox, $renamed_deltas, $moved_deltas);
+
+}
+
+/**
+ * Remove throttle columns and variables.
+ */
+function system_update_7005() {
+  db_drop_field('blocks', 'throttle');
+  db_drop_field('system', 'throttle');
+  variable_del('throttle_user');
+  variable_del('throttle_anonymous');
+  variable_del('throttle_level');
+  variable_del('throttle_probability_limiter');
+}
+
+/**
+ * Convert to new method of storing permissions.
+ */
+function system_update_7007() {
+  // Copy the permissions from the old {permission} table to the new {role_permission} table.
+  $messages = array();
+  $result = db_query("SELECT rid, perm FROM {permission} ORDER BY rid ASC");
+  $query = db_insert('role_permission')->fields(array('rid', 'permission'));
+  foreach ($result as $role) {
+    foreach (array_unique(explode(', ', $role->perm)) as $perm) {
+      $query->values(array(
+        'rid' => $role->rid,
+        'permission' => $perm,
+      ));
+    }
+    $messages[] = t('Inserted into {role_permission} the permissions for role ID !id', array('!id' => $role->rid));
+  }
+  $query->execute();
+  db_drop_table('permission');
+
+  return implode(', ', $messages);
+}
+
+/**
+ * Rename the variable for primary links.
+ */
+function system_update_7009() {
+  $current_primary = variable_get('menu_primary_links_source');
+  if (isset($current_primary)) {
+    variable_set('menu_main_links_source', $current_primary);
+    variable_del('menu_primary_links_source');
+  }
+}
+
+/**
+ * Split the 'bypass node access' permission from 'administer nodes'.
+ */
+function system_update_7011() {
+  // Get existing roles that can 'administer nodes'.
+  $rids = array();
+  $rids = db_query("SELECT rid FROM {role_permission} WHERE permission = :perm", array(':perm' => 'administer nodes'))->fetchCol();
+  // None found.
+  if (empty($rids)) {
+    return;
+  }
+  $insert = db_insert('role_permission')->fields(array('rid', 'permission'));
+  foreach ($rids as $rid) {
+    $insert->values(array(
+    'rid' => $rid,
+    'permission' => 'bypass node access',
+    ));
+  }
+  $insert->execute();
+}
+
+/**
+ * Convert default time zone offset to default time zone name.
+ */
+function system_update_7013() {
+  $timezone = NULL;
+  $timezones = system_time_zones();
+  // If the contributed Date module set a default time zone name, use this
+  // setting as the default time zone.
+  if (($timezone_name = variable_get('date_default_timezone_name')) && isset($timezones[$timezone_name])) {
+    $timezone = $timezone_name;
+  }
+  // If the contributed Event module has set a default site time zone, look up
+  // the time zone name and use it as the default time zone.
+  if (!$timezone && ($timezone_id = variable_get('date_default_timezone_id', 0))) {
+    try {
+      $timezone_name = db_query('SELECT name FROM {event_timezones} WHERE timezone = :timezone_id', array(':timezone_id' => $timezone_id))->fetchField();
+      if (($timezone_name = str_replace(' ', '_', $timezone_name)) && isset($timezones[$timezone_name])) {
+        $timezone = $timezone_name;
+      }
+    }
+    catch (PDOException $e) {
+      // Ignore error if event_timezones table does not exist or unexpected
+      // schema found.
+    }
+  }
+
+  // Check to see if timezone was overriden in update_prepare_d7_bootstrap().
+  $offset = variable_get('date_temporary_timezone');
+  // If not, use the default.
+  if (!isset($offset)) {
+    $offset = variable_get('date_default_timezone', 0);
+  }
+
+  // If the previous default time zone was a non-zero offset, guess the site's
+  // intended time zone based on that offset and the server's daylight saving
+  // time status.
+  if (!$timezone && $offset) {
+    $timezone_name = timezone_name_from_abbr('', intval($offset), date('I'));
+    if ($timezone_name && isset($timezones[$timezone_name])) {
+      $timezone = $timezone_name;
+    }
+  }
+  // Otherwise, the default time zone offset was zero, which is UTC.
+  if (!$timezone) {
+    $timezone = 'UTC';
+  }
+  variable_set('date_default_timezone', $timezone);
+  drupal_set_message(format_string('The default time zone has been set to %timezone. Check the <a href="@config-url">date and time configuration page</a> to configure it correctly.', array('%timezone' => $timezone, '@config-url' => url('admin/config/regional/settings'))), 'warning');
+  // Remove temporary override.
+  variable_del('date_temporary_timezone');
+}
+
+/**
+ * Change the user logout path.
+ */
+function system_update_7015() {
+  db_update('menu_links')
+    ->fields(array('link_path' => 'user/logout'))
+    ->condition('link_path', 'logout')
+    ->execute();
+  db_update('menu_links')
+    ->fields(array('router_path' => 'user/logout'))
+    ->condition('router_path', 'logout')
+    ->execute();
+
+  db_update('menu_links')
+    ->fields(array(
+      'menu_name' => 'user-menu',
+      'plid' => 0,
+    ))
+    ->condition(db_or()
+      ->condition('link_path', 'user/logout')
+      ->condition('router_path', 'user/logout')
+    )
+    ->condition('module', 'system')
+    ->condition('customized', 0)
+    ->execute();
+}
+
+/**
+ * Remove custom datatype *_unsigned in PostgreSQL.
+ */
+function system_update_7016() {
+  // Only run these queries if the driver used is pgsql.
+  if (db_driver() == 'pgsql') {
+    $result = db_query("SELECT c.relname AS table, a.attname AS field,
+                        pg_catalog.format_type(a.atttypid, a.atttypmod) AS type
+                        FROM pg_catalog.pg_attribute a
+                        LEFT JOIN pg_class c ON (c.oid =  a.attrelid)
+                        WHERE pg_catalog.pg_table_is_visible(c.oid) AND c.relkind = 'r'
+                        AND pg_catalog.format_type(a.atttypid, a.atttypmod) LIKE '%unsigned%'");
+    foreach ($result as $row) {
+      switch ($row->type) {
+        case 'smallint_unsigned':
+          $datatype = 'int';
+          break;
+        case 'int_unsigned':
+        case 'bigint_unsigned':
+        default:
+          $datatype = 'bigint';
+          break;
+      }
+      db_query('ALTER TABLE ' . $row->table . ' ALTER COLUMN "' . $row->field . '" TYPE ' . $datatype);
+      db_query('ALTER TABLE ' . $row->table . ' ADD CHECK ("' . $row->field . '" >= 0)');
+    }
+    db_query('DROP DOMAIN IF EXISTS smallint_unsigned');
+    db_query('DROP DOMAIN IF EXISTS int_unsigned');
+    db_query('DROP DOMAIN IF EXISTS bigint_unsigned');
+  }
+}
+
+/**
+ * Change the theme setting 'toggle_node_info' into a per content type variable.
+ */
+function system_update_7017() {
+  // Get the global theme settings.
+  $settings = variable_get('theme_settings', array());
+  // Get the settings of the default theme.
+  $settings = array_merge($settings, variable_get('theme_' . variable_get('theme_default', 'garland') . '_settings', array()));
+
+  $types = _update_7000_node_get_types();
+  foreach ($types as $type) {
+    if (isset($settings['toggle_node_info_' . $type->type])) {
+      variable_set('node_submitted_' . $type->type, $settings['toggle_node_info_' . $type->type]);
+    }
+  }
+
+  // Unset deprecated 'toggle_node_info' theme settings.
+  $theme_settings = variable_get('theme_settings', array());
+  foreach ($theme_settings as $setting => $value) {
+    if (substr($setting, 0, 16) == 'toggle_node_info') {
+      unset($theme_settings[$setting]);
+    }
+  }
+  variable_set('theme_settings', $theme_settings);
+}
+
+/**
+ * Shorten the {system}.type column and modify indexes.
+ */
+function system_update_7018() {
+  db_drop_index('system', 'modules');
+  db_drop_index('system', 'type_name');
+  db_change_field('system', 'type', 'type', array('type' => 'varchar', 'length' => 12, 'not null' => TRUE, 'default' => ''));
+  db_add_index('system', 'type_name', array('type', 'name'));
+}
+
+/**
+ * Enable field and field_ui modules.
+ */
+function system_update_7020() {
+  $module_list = array('field_sql_storage', 'field', 'field_ui');
+  module_enable($module_list, FALSE);
+}
+
+/**
+ * Change the PHP for settings permission.
+ */
+function system_update_7021() {
+  db_update('role_permission')
+    ->fields(array('permission' => 'use PHP for settings'))
+    ->condition('permission', 'use PHP for block visibility')
+    ->execute();
+}
+
+/**
+ * Enable field type modules.
+ */
+function system_update_7027() {
+  $module_list = array('text', 'number', 'list', 'options');
+  module_enable($module_list, FALSE);
+}
+
+/**
+ * Add new 'view own unpublished content' permission for authenticated users.
+ * Preserves legacy behavior from Drupal 6.x.
+ */
+function system_update_7029() {
+  db_insert('role_permission')
+    ->fields(array(
+      'rid' => DRUPAL_AUTHENTICATED_RID,
+      'permission' => 'view own unpublished content',
+    ))
+    ->execute();
+}
+
+/**
+* Alter field hostname to identifier in the {flood} table.
+ */
+function system_update_7032() {
+  db_drop_index('flood', 'allow');
+  db_change_field('flood', 'hostname', 'identifier', array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''));
+  db_add_index('flood', 'allow', array('event', 'identifier', 'timestamp'));
+}
+
+/**
+ * Move CACHE_AGGRESSIVE to CACHE_NORMAL.
+ */
+function system_update_7033() {
+  if (variable_get('cache') == 2) {
+    variable_set('cache', 1);
+    return t('Aggressive caching was disabled and replaced with normal caching. Read the page caching section in default.settings.php for more information on how to enable similar functionality.');
+  }
+}
+
+/**
+ * Migrate the file path settings and create the new {file_managed} table.
+ */
+function system_update_7034() {
+  $files_directory = variable_get('file_directory_path', NULL);
+  if (variable_get('file_downloads', 1) == 1) {
+    // Our default is public, so we don't need to set anything.
+    if (!empty($files_directory)) {
+      variable_set('file_public_path', $files_directory);
+    }
+  }
+  elseif (variable_get('file_downloads', 1) == 2) {
+    variable_set('file_default_scheme', 'private');
+    if (!empty($files_directory)) {
+      variable_set('file_private_path', $files_directory);
+    }
+  }
+  variable_del('file_downloads');
+
+  $schema['file_managed'] = array(
+    'description' => 'Stores information for uploaded files.',
+    'fields' => array(
+      'fid' => array(
+        'description' => 'File ID.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'uid' => array(
+        'description' => 'The {user}.uid of the user who is associated with the file.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'filename' => array(
+        'description' => 'Name of the file with no path components. This may differ from the basename of the filepath if the file is renamed to avoid overwriting an existing file.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'binary' => TRUE,
+      ),
+      'uri' => array(
+        'description' => 'URI of file.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'binary' => TRUE,
+      ),
+      'filemime' => array(
+        'description' => "The file's MIME type.",
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'filesize' => array(
+        'description' => 'The size of the file in bytes.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'status' => array(
+        'description' => 'A field indicating the status of the file. Two status are defined in core: temporary (0) and permanent (1). Temporary files older than DRUPAL_MAXIMUM_TEMP_FILE_AGE will be removed during a cron run.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'timestamp' => array(
+        'description' => 'UNIX timestamp for when the file was added.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'indexes' => array(
+      'uid' => array('uid'),
+      'status' => array('status'),
+      'timestamp' => array('timestamp'),
+    ),
+    'unique keys' => array(
+      'uri' => array('uri'),
+    ),
+    'primary key' => array('fid'),
+  );
+
+  db_create_table('file_managed', $schema['file_managed']);
+}
+
+/**
+ * Split the 'access site in maintenance mode' permission from 'administer site configuration'.
+ */
+function system_update_7036() {
+  // Get existing roles that can 'administer site configuration'.
+  $rids = db_query("SELECT rid FROM {role_permission} WHERE permission = :perm", array(':perm' => 'administer site configuration'))->fetchCol();
+  // None found.
+  if (empty($rids)) {
+    return;
+  }
+  $insert = db_insert('role_permission')->fields(array('rid', 'permission'));
+  foreach ($rids as $rid) {
+    $insert->values(array(
+      'rid' => $rid,
+      'permission' => 'access site in maintenance mode',
+    ));
+  }
+  $insert->execute();
+}
+
+/**
+ * Upgrade the {url_alias} table and create a cache bin for path aliases.
+ */
+function system_update_7042() {
+  // update_fix_d7_requirements() adds 'fake' source and alias columns to
+  // allow bootstrap to run without fatal errors. Remove those columns now
+  // so that we can rename properly.
+  db_drop_field('url_alias', 'source');
+  db_drop_field('url_alias', 'alias');
+
+  // Drop indexes.
+  db_drop_index('url_alias', 'src_language_pid');
+  db_drop_unique_key('url_alias', 'dst_language_pid');
+  // Rename the fields, and increase their length to 255 characters.
+  db_change_field('url_alias', 'src', 'source', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''));
+  db_change_field('url_alias', 'dst', 'alias', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''));
+  // Add indexes back. We replace the unique key with an index since it never
+  // provided any meaningful unique constraint ('pid' is a primary key).
+  db_add_index('url_alias', 'source_language_pid', array('source', 'language', 'pid'));
+  db_add_index('url_alias', 'alias_language_pid', array('alias', 'language', 'pid'));
+
+  // Now that the URL aliases are correct, we can rebuild the whitelist.
+  drupal_path_alias_whitelist_rebuild();
+}
+
+/**
+ * Drop the actions_aid table.
+ */
+function system_update_7044() {
+  // The current value of the increment has been taken into account when
+  // creating the sequences table in update_fix_d7_requirements().
+  db_drop_table('actions_aid');
+}
+
+/**
+ * Add expiration field to the {flood} table.
+ */
+function system_update_7045() {
+  db_add_field('flood', 'expiration', array('description' => 'Expiration timestamp. Expired events are purged on cron run.', 'type' => 'int', 'not null' => TRUE, 'default' => 0));
+  db_add_index('flood', 'purge', array('expiration'));
+}
+
+/**
+ * Switch from the Minnelli theme if it is the default or admin theme.
+ */
+function system_update_7046() {
+  if (variable_get('theme_default') == 'minnelli' || variable_get('admin_theme') == 'minnelli') {
+    // Make sure Garland is enabled.
+    db_update('system')
+      ->fields(array('status' => 1))
+      ->condition('type', 'theme')
+      ->condition('name', 'garland')
+      ->execute();
+    if (variable_get('theme_default') != 'garland') {
+      // If the default theme isn't Garland, transfer all of Minnelli's old
+      // settings to Garland.
+      $settings = variable_get('theme_minnelli_settings', array());
+      // Set the theme setting width to "fixed" to match Minnelli's old layout.
+      $settings['garland_width'] = 'fixed';
+      variable_set('theme_garland_settings', $settings);
+      // Remove Garland's color files since they won't match Minnelli's.
+      foreach (variable_get('color_garland_files', array()) as $file) {
+        @drupal_unlink($file);
+      }
+      if (isset($file) && $file = dirname($file)) {
+        @drupal_rmdir($file);
+      }
+      variable_del('color_garland_palette');
+      variable_del('color_garland_stylesheets');
+      variable_del('color_garland_logo');
+      variable_del('color_garland_files');
+      variable_del('color_garland_screenshot');
+    }
+    if (variable_get('theme_default') == 'minnelli') {
+      variable_set('theme_default', 'garland');
+    }
+    if (variable_get('admin_theme') == 'minnelli') {
+      variable_set('admin_theme', 'garland');
+    }
+  }
+}
+
+/**
+ * Normalize the front page path variable.
+ */
+function system_update_7047() {
+  variable_set('site_frontpage', drupal_get_normal_path(variable_get('site_frontpage', 'node')));
+}
+
+/**
+ * Convert path languages from the empty string to LANGUAGE_NONE.
+ */
+function system_update_7048() {
+  db_update('url_alias')
+    ->fields(array('language' => LANGUAGE_NONE))
+    ->condition('language', '')
+    ->execute();
+}
+
+/**
+ * Rename 'Default' profile to 'Standard.'
+ */
+function system_update_7049() {
+  if (variable_get('install_profile', 'standard') == 'default') {
+    variable_set('install_profile', 'standard');
+  }
+}
+
+/**
+ * Change {batch}.id column from serial to regular int.
+ */
+function system_update_7050() {
+  db_change_field('batch', 'bid', 'bid', array('description' => 'Primary Key: Unique batch ID.', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE));
+}
+
+/**
+ * make the IP field IPv6 compatible
+ */
+function system_update_7051() {
+  db_change_field('blocked_ips', 'ip', 'ip', array('description' => 'IP address', 'type' => 'varchar', 'length' => 40, 'not null' => TRUE, 'default' => ''));
+}
+
+/**
+ * Rename file to include_file in {menu_router} table.
+ */
+function system_update_7052() {
+  db_change_field('menu_router', 'file', 'include_file', array('type' => 'text', 'size' => 'medium'));
+}
+
+/**
+ * Upgrade standard blocks and menus.
+ */
+function system_update_7053() {
+  if (db_table_exists('menu_custom')) {
+    // Create the same menus as in menu_install().
+    db_insert('menu_custom')
+      ->fields(array('menu_name' => 'user-menu', 'title' => 'User Menu', 'description' => "The <em>User</em> menu contains links related to the user's account, as well as the 'Log out' link."))
+      ->execute();
+
+    db_insert('menu_custom')
+      ->fields(array('menu_name' => 'management', 'title' => 'Management', 'description' => "The <em>Management</em> menu contains links for administrative tasks."))
+      ->execute();
+  }
+
+  block_flush_caches();
+
+  // Show the new menu blocks along the navigation block.
+  $blocks = db_query("SELECT theme, status, region, weight, visibility, pages FROM {block} WHERE module = 'system' AND delta = 'navigation'");
+  $deltas = db_or()
+    ->condition('delta', 'user-menu')
+    ->condition('delta', 'management');
+
+  foreach ($blocks as $block) {
+    db_update('block')
+      ->fields(array(
+        'status' => $block->status,
+        'region' => $block->region,
+        'weight' => $block->weight,
+        'visibility' => $block->visibility,
+        'pages' => $block->pages,
+      ))
+      ->condition('theme', $block->theme)
+      ->condition('module', 'system')
+      ->condition($deltas)
+      ->execute();
+  }
+}
+
+/**
+ * Remove {cache_*}.headers columns.
+ */
+function system_update_7054() {
+  // Update: update_fix_d7_requirements() installs this version for cache_path
+  // already, so we don't include it in this particular update. It should be
+  // included in later updates though.
+  $cache_tables = array(
+    'cache' => 'Generic cache table for caching things not separated out into their own tables. Contributed modules may also use this to store cached items.',
+    'cache_form' => 'Cache table for the form system to store recently built forms and their storage data, to be used in subsequent page requests.',
+    'cache_page' => 'Cache table used to store compressed pages for anonymous users, if page caching is enabled.',
+    'cache_menu' => 'Cache table for the menu system to store router information as well as generated link trees for various menu/page/user combinations.',
+  );
+  $schema = system_schema_cache_7054();
+  foreach ($cache_tables as $table => $description) {
+    $schema['description'] = $description;
+    db_drop_table($table);
+    db_create_table($table, $schema);
+  }
+}
+
+/**
+ * Converts fields that store serialized variables from text to blob.
+ */
+function system_update_7055() {
+  $spec = array(
+    'description' => 'The value of the variable.',
+    'type' => 'blob',
+    'not null' => TRUE,
+    'size' => 'big',
+    'translatable' => TRUE,
+  );
+  db_change_field('variable', 'value', 'value', $spec);
+
+  $spec = array(
+    'description' => 'Parameters to be passed to the callback function.',
+    'type' => 'blob',
+    'not null' => TRUE,
+    'size' => 'big',
+  );
+  db_change_field('actions', 'parameters', 'parameters', $spec);
+
+  $spec = array(
+    'description' => 'A serialized array containing the processing data for the batch.',
+    'type' => 'blob',
+    'not null' => FALSE,
+    'size' => 'big',
+  );
+  db_change_field('batch', 'batch', 'batch', $spec);
+
+  $spec = array(
+    'description' => 'A serialized array of function names (like node_load) to be called to load an object corresponding to a part of the current path.',
+    'type' => 'blob',
+    'not null' => TRUE,
+  );
+  db_change_field('menu_router', 'load_functions', 'load_functions', $spec);
+
+  $spec = array(
+    'description' => 'A serialized array of function names (like user_uid_optional_to_arg) to be called to replace a part of the router path with another string.',
+    'type' => 'blob',
+    'not null' => TRUE,
+  );
+  db_change_field('menu_router', 'to_arg_functions', 'to_arg_functions', $spec);
+
+  $spec = array(
+    'description' => 'A serialized array of arguments for the access callback.',
+    'type' => 'blob',
+    'not null' => FALSE,
+  );
+  db_change_field('menu_router', 'access_arguments', 'access_arguments', $spec);
+
+  $spec = array(
+    'description' => 'A serialized array of arguments for the page callback.',
+    'type' => 'blob',
+    'not null' => FALSE,
+  );
+  db_change_field('menu_router', 'page_arguments', 'page_arguments', $spec);
+
+  $spec = array(
+    'description' => 'A serialized array of options to be passed to the url() or l() function, such as a query string or HTML attributes.',
+    'type' => 'blob',
+    'not null' => FALSE,
+    'translatable' => TRUE,
+  );
+  db_change_field('menu_links', 'options', 'options', $spec);
+
+  $spec = array(
+    'description' => 'The serialized contents of $_SESSION, an array of name/value pairs that persists across page requests by this session ID. Drupal loads $_SESSION from here at the start of each request and saves it at the end.',
+    'type' => 'blob',
+    'not null' => FALSE,
+    'size' => 'big',
+  );
+  db_change_field('sessions', 'session', 'session', $spec);
+
+  $spec = array(
+    'description' => "A serialized array containing information from the module's .info file; keys can include name, description, package, version, core, dependencies, and php.",
+    'type' => 'blob',
+    'not null' => FALSE,
+  );
+  db_change_field('system', 'info', 'info', $spec);
+}
+
+/**
+ * Increase the size of session-ids.
+ */
+function system_update_7057() {
+  $spec = array(
+    'description' => "A session ID. The value is generated by PHP's Session API.",
+    'type' => 'varchar',
+    'length' => 128,
+    'not null' => TRUE,
+    'default' => '',
+  );
+  db_change_field('sessions', 'sid', 'sid', $spec);
+}
+
+/**
+ * Remove cron semaphore variable.
+ */
+function system_update_7058() {
+  variable_del('cron_semaphore');
+}
+
+/**
+ * Create the {file_usage} table.
+ */
+function system_update_7059() {
+  $spec = array(
+    'description' => 'Track where a file is used.',
+    'fields' => array(
+      'fid' => array(
+        'description' => 'File ID.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'module' => array(
+        'description' => 'The name of the module that is using the file.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'type' => array(
+        'description' => 'The name of the object type in which the file is used.',
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'id' => array(
+        'description' => 'The primary key of the object using the file.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'count' => array(
+        'description' => 'The number of times this file is used by this object.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'primary key' => array('fid', 'type', 'id', 'module'),
+    'indexes' => array(
+      'type_id' => array('type', 'id'),
+      'fid_count' => array('fid', 'count'),
+      'fid_module' => array('fid', 'module'),
+    ),
+  );
+  db_create_table('file_usage', $spec);
+}
+
+/**
+ * Create fields in preparation for migrating upload.module to file.module.
+ */
+function system_update_7060() {
+  if (!db_table_exists('upload')) {
+    return;
+  }
+
+  if (!db_query_range('SELECT 1 FROM {upload}', 0, 1)->fetchField()) {
+    // There is nothing to migrate. Delete variables and the empty table. There
+    // is no need to create fields that are not going to be used.
+    foreach (_update_7000_node_get_types() as $node_type) {
+      variable_del('upload_' . $node_type->type);
+    }
+    db_drop_table('upload');
+    return;
+  }
+
+  // Check which node types have upload.module attachments enabled.
+  $context['types'] = array();
+  foreach (_update_7000_node_get_types() as $node_type) {
+    if (variable_get('upload_' . $node_type->type, 0)) {
+      $context['types'][$node_type->type] = $node_type->type;
+    }
+  }
+
+  // The {upload} table will be deleted when this update is complete so we
+  // want to be careful to migrate all the data, even for node types that
+  // may have had attachments disabled after files were uploaded. Look for
+  // any other node types referenced by the upload records and add those to
+  // the list. The admin can always remove the field later.
+  $results = db_query('SELECT DISTINCT type FROM {node} n INNER JOIN {node_revision} nr ON n.nid = nr.nid INNER JOIN {upload} u ON nr.vid = u.vid');
+  foreach ($results as $row) {
+    if (!isset($context['types'][$row->type])) {
+      drupal_set_message(t('The content type %rowtype had uploads disabled but contained uploaded file data. Uploads have been re-enabled to migrate the existing data. You may delete the "File attachments" field in the %rowtype type if this data is not necessary.', array('%rowtype' => $row->type)));
+      $context['types'][$row->type] = $row->type;
+    }
+  }
+
+  // Create a single "upload" field on all the content types that have uploads
+  // enabled, then add an instance to each enabled type.
+  if (count($context['types']) > 0) {
+    module_enable(array('file'));
+    $field = array(
+      'field_name' => 'upload',
+      'type' => 'file',
+      'module' => 'file',
+      'locked' => FALSE,
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'translatable' => FALSE,
+      'settings' => array(
+        'display_field' => 1,
+        'display_default' => variable_get('upload_list_default', 1),
+        'uri_scheme' => file_default_scheme(),
+        'default_file' => 0,
+      ),
+    );
+
+    $upload_size = variable_get('upload_uploadsize_default', 1);
+    $instance = array(
+      'field_name' => 'upload',
+      'entity_type' => 'node',
+      'bundle' => NULL,
+      'label' => 'File attachments',
+      'required' => 0,
+      'description' => '',
+      'widget' => array(
+        'weight' => '1',
+        'settings' => array(
+          'progress_indicator' => 'throbber',
+        ),
+        'type' => 'file_generic',
+      ),
+      'settings' => array(
+        'max_filesize' => $upload_size ? ($upload_size . ' MB') : '',
+        'file_extensions' => variable_get('upload_extensions_default', 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp'),
+        'file_directory' => '',
+        'description_field' => 1,
+      ),
+      'display' => array(
+        'default' => array(
+          'label' => 'hidden',
+          'type' => 'file_table',
+          'settings' => array(),
+          'weight' => 0,
+          'module' => 'file',
+        ),
+        'full' => array(
+          'label' => 'hidden',
+          'type' => 'file_table',
+          'settings' => array(),
+          'weight' => 0,
+          'module' => 'file',
+        ),
+        'teaser' => array(
+          'label' => 'hidden',
+          'type' => 'hidden',
+          'settings' => array(),
+          'weight' => 0,
+          'module' => NULL,
+        ),
+        'rss' => array(
+          'label' => 'hidden',
+          'type' => 'file_table',
+          'settings' => array(),
+          'weight' => 0,
+          'module' => 'file',
+        ),
+      ),
+    );
+
+    // Create the field.
+    _update_7000_field_create_field($field);
+
+    // Create the instances.
+    foreach ($context['types'] as $bundle) {
+      $instance['bundle'] = $bundle;
+      _update_7000_field_create_instance($field, $instance);
+      // Now that the instance is created, we can safely delete any legacy
+      // node type information.
+      variable_del('upload_' . $bundle);
+    }
+  }
+  else {
+    // No uploads or content types with uploads enabled.
+    db_drop_table('upload');
+  }
+}
+
+/**
+ * Migrate upload.module data to the newly created file field.
+ */
+function system_update_7061(&$sandbox) {
+  if (!db_table_exists('upload')) {
+    return;
+  }
+
+  if (!isset($sandbox['progress'])) {
+    // Delete stale rows from {upload} where the fid is not in the {files} table.
+    db_delete('upload')
+      ->notExists(
+        db_select('files', 'f')
+        ->fields('f', array('fid'))
+        ->where('f.fid = {upload}.fid')
+      )
+      ->execute();
+
+    // Delete stale rows from {upload} where the vid is not in the
+    // {node_revision} table. The table has already been renamed in
+    // node_update_7001().
+    db_delete('upload')
+      ->notExists(
+        db_select('node_revision', 'nr')
+        ->fields('nr', array('vid'))
+        ->where('nr.vid = {upload}.vid')
+      )
+      ->execute();
+
+    // Retrieve a list of node revisions that have uploaded files attached.
+    // DISTINCT queries are expensive, especially when paged, so we store the
+    // data in its own table for the duration of the update.
+    if (!db_table_exists('system_update_7061')) {
+      $table = array(
+        'description' => t('Stores temporary data for system_update_7061.'),
+        'fields' => array('vid' => array('type' => 'int')),
+        'primary key' => array('vid'),
+      );
+      db_create_table('system_update_7061', $table);
+    }
+    $query = db_select('upload', 'u');
+    $query->distinct();
+    $query->addField('u','vid');
+    db_insert('system_update_7061')
+      ->from($query)
+      ->execute();
+
+    // Initialize batch update information.
+    $sandbox['progress'] = 0;
+    $sandbox['last_vid_processed'] = -1;
+    $sandbox['max'] = db_query("SELECT COUNT(*) FROM {system_update_7061}")->fetchField();
+  }
+
+  // Determine vids for this batch.
+  // Process all files attached to a given revision during the same batch.
+  $limit = variable_get('upload_update_batch_size', 100);
+  $vids = db_query_range('SELECT vid FROM {system_update_7061} WHERE vid > :lastvid ORDER BY vid', 0, $limit, array(':lastvid' => $sandbox['last_vid_processed']))
+    ->fetchCol();
+
+  // Retrieve information on all the files attached to these revisions.
+  if (!empty($vids)) {
+    $node_revisions = array();
+    $result = db_query('SELECT u.fid, u.vid, u.list, u.description, n.nid, n.type, u.weight FROM {upload} u INNER JOIN {node_revision} nr ON u.vid = nr.vid INNER JOIN {node} n ON n.nid = nr.nid WHERE u.vid IN (:vids) ORDER BY u.vid, u.weight, u.fid', array(':vids' => $vids));
+    foreach ($result as $record) {
+      // For each uploaded file, retrieve the corresponding data from the old
+      // files table (since upload doesn't know about the new entry in the
+      // file_managed table).
+      $file = db_select('files', 'f')
+        ->fields('f', array('fid', 'uid', 'filename', 'filepath', 'filemime', 'filesize', 'status', 'timestamp'))
+        ->condition('f.fid', $record->fid)
+        ->execute()
+        ->fetchAssoc();
+      if (!$file) {
+        continue;
+      }
+
+      // Add in the file information from the upload table.
+      $file['description'] = $record->description;
+      $file['display'] = $record->list;
+
+      // Create one record for each revision that contains all the uploaded
+      // files.
+      $node_revisions[$record->vid]['nid'] = $record->nid;
+      $node_revisions[$record->vid]['vid'] = $record->vid;
+      $node_revisions[$record->vid]['type'] = $record->type;
+      $node_revisions[$record->vid]['file'][LANGUAGE_NONE][] = $file;
+    }
+
+    // Now that we know which files belong to which revisions, update the
+    // files'// database entries, and save a reference to each file in the
+    // upload field on their node revisions.
+    $basename = variable_get('file_directory_path', conf_path() . '/files');
+    $scheme = file_default_scheme() . '://';
+    foreach ($node_revisions as $vid => $revision) {
+      foreach ($revision['file'][LANGUAGE_NONE] as $delta => $file) {
+        // We will convert filepaths to URI using the default scheme
+        // and stripping off the existing file directory path.
+        $file['uri'] = $scheme . preg_replace('!^' . preg_quote($basename) . '!', '', $file['filepath']);
+        $file['uri'] = file_stream_wrapper_uri_normalize($file['uri']);
+        unset($file['filepath']);
+        // Insert into the file_managed table.
+        // Each fid should only be stored once in file_managed.
+        db_merge('file_managed')
+          ->key(array(
+            'fid' => $file['fid'],
+          ))
+          ->fields(array(
+            'uid' => $file['uid'],
+            'filename' => $file['filename'],
+            'uri' => $file['uri'],
+            'filemime' => $file['filemime'],
+            'filesize' => $file['filesize'],
+            'status' => $file['status'],
+            'timestamp' => $file['timestamp'],
+          ))
+          ->execute();
+
+        // Add the usage entry for the file.
+        $file = (object) $file;
+        file_usage_add($file, 'file', 'node', $revision['nid']);
+
+        // Update the node revision's upload file field with the file data.
+        $revision['file'][LANGUAGE_NONE][$delta] = array('fid' => $file->fid, 'display' => $file->display, 'description' => $file->description);
+      }
+
+      // Write the revision's upload field data into the field_upload tables.
+      $node = (object) $revision;
+      _update_7000_field_sql_storage_write('node', $node->type, $node->nid, $node->vid, 'upload', $node->file);
+
+      // Update our progress information for the batch update.
+      $sandbox['progress']++;
+      $sandbox['last_vid_processed'] = $vid;
+    }
+  }
+
+  // If less than limit node revisions were processed, the update process is
+  // finished.
+  if (count($vids) < $limit) {
+    $finished = TRUE;
+  }
+
+  // If there's no max value then there's nothing to update and we're finished.
+  if (empty($sandbox['max']) || isset($finished)) {
+    db_drop_table('upload');
+    db_drop_table('system_update_7061');
+    return t('Upload module has been migrated to File module.');
+  }
+  else {
+    // Indicate our current progress to the batch update system.
+    $sandbox['#finished'] = $sandbox['progress'] / $sandbox['max'];
+  }
+}
+
+/**
+ * Replace 'system_list' index with 'bootstrap' index on {system}.
+ */
+function system_update_7062() {
+  db_drop_index('system', 'bootstrap');
+  db_drop_index('system', 'system_list');
+  db_add_index('system', 'system_list', array('status', 'bootstrap', 'type', 'weight', 'name'));
+}
+
+/**
+ * Delete {menu_links} records for 'type' => MENU_CALLBACK which would not appear in a fresh install.
+ */
+function system_update_7063() {
+  // For router items where 'type' => MENU_CALLBACK, {menu_router}.type is
+  // stored as 4 in Drupal 6, and 0 in Drupal 7. Fortunately Drupal 7 doesn't
+  // store any types as 4, so delete both.
+  $result = db_query('SELECT ml.mlid FROM {menu_links} ml INNER JOIN {menu_router} mr ON ml.router_path = mr.path WHERE ml.module = :system AND ml.customized = 0 AND mr.type IN(:callbacks)', array(':callbacks' => array(0, 4), ':system' => 'system'));
+  foreach ($result as $record) {
+    db_delete('menu_links')->condition('mlid', $record->mlid)->execute();
+  }
+}
+
+/**
+ * Remove block_callback field from {menu_router}.
+ */
+function system_update_7064() {
+  db_drop_field('menu_router', 'block_callback');
+}
+
+/**
+ * Remove the default value for sid.
+ */
+function system_update_7065() {
+  $spec = array(
+    'description' => "A session ID. The value is generated by Drupal's session handlers.",
+    'type' => 'varchar',
+    'length' => 128,
+    'not null' => TRUE,
+  );
+  db_drop_primary_key('sessions');
+  db_change_field('sessions', 'sid', 'sid', $spec, array('primary key' => array('sid', 'ssid')));
+  // Delete any sessions with empty session ID.
+  db_delete('sessions')->condition('sid', '')->execute();
+}
+
+/**
+ * Migrate the 'file_directory_temp' variable.
+ */
+function system_update_7066() {
+  $d6_file_directory_temp = variable_get('file_directory_temp', file_directory_temp());
+  variable_set('file_temporary_path', $d6_file_directory_temp);
+  variable_del('file_directory_temp');
+}
+
+/**
+ * Grant administrators permission to view the administration theme.
+ */
+function system_update_7067() {
+  // Users with access to administration pages already see the administration
+  // theme in some places (if one is enabled on the site), so we want them to
+  // continue seeing it.
+  $admin_roles = user_roles(FALSE, 'access administration pages');
+  foreach (array_keys($admin_roles) as $rid) {
+    _update_7000_user_role_grant_permissions($rid, array('view the administration theme'), 'system');
+  }
+  // The above check is not guaranteed to reach all administrative users of the
+  // site, so if the site is currently using an administration theme, display a
+  // message also.
+  if (variable_get('admin_theme')) {
+    if (empty($admin_roles)) {
+      drupal_set_message('The new "View the administration theme" permission is required in order to view your site\'s administration theme. You can grant this permission to your site\'s administrators on the <a href="' . url('admin/people/permissions', array('fragment' => 'module-system')) . '">permissions page</a>.');
+    }
+    else {
+      drupal_set_message('The new "View the administration theme" permission is required in order to view your site\'s administration theme. This permission has been automatically granted to the following roles: <em>' . check_plain(implode(', ', $admin_roles)) . '</em>. You can grant this permission to other roles on the <a href="' . url('admin/people/permissions', array('fragment' => 'module-system')) . '">permissions page</a>.');
+    }
+  }
+}
+
+/**
+ * Update {url_alias}.language description.
+ */
+function system_update_7068() {
+  $spec = array(
+    'description' => "The language this alias is for; if 'und', the alias will be used for unknown languages. Each Drupal path can have an alias for each supported language.",
+    'type' => 'varchar',
+    'length' => 12,
+    'not null' => TRUE,
+    'default' => '',
+  );
+  db_change_field('url_alias', 'language', 'language', $spec);
+}
+
+/**
+ * Remove the obsolete 'site_offline' variable.
+ *
+ * @see update_fix_d7_requirements()
+ */
+function system_update_7069() {
+  variable_del('site_offline');
+}
+
+/**
+ * @} End of "defgroup updates-6.x-to-7.x".
+ * The next series of updates should start at 8000.
+ */
+
+/**
+ * @defgroup updates-7.x-extra Extra updates for 7.x
+ * @{
+ * Update functions between 7.x versions.
+ */
+
+/**
+ * Remove the obsolete 'drupal_badge_color' and 'drupal_badge_size' variables.
+ */
+function system_update_7070() {
+  variable_del('drupal_badge_color');
+  variable_del('drupal_badge_size');
+}
+
+/**
+ * Add index missed during upgrade, and fix field default.
+ */
+function system_update_7071() {
+  db_drop_index('date_format_type', 'title');
+  db_add_index('date_format_type', 'title', array('title'));
+  db_change_field('registry', 'filename', 'filename', array(
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => TRUE,
+  ));
+}
+
+/**
+ * Remove the obsolete 'site_offline_message' variable.
+ *
+ * @see update_fix_d7_requirements()
+ */
+function system_update_7072() {
+  variable_del('site_offline_message');
+}
+
+/**
+ * Add binary to {file_managed}, in case system_update_7034() was run without
+ * it.
+ */
+function system_update_7073() {
+  db_change_field('file_managed', 'filename', 'filename', array(
+    'description' => 'Name of the file with no path components. This may differ from the basename of the URI if the file is renamed to avoid overwriting an existing file.',
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => TRUE,
+    'default' => '',
+    'binary' => TRUE,
+  ));
+  db_drop_unique_key('file_managed', 'uri');
+  db_change_field('file_managed', 'uri', 'uri', array(
+    'description' => 'The URI to access the file (either local or remote).',
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => TRUE,
+    'default' => '',
+    'binary' => TRUE,
+  ));
+  db_add_unique_key('file_managed', 'uri', array('uri'));
+}
+
+/**
+ * This update has been removed and will not run.
+ */
+function system_update_7074() {
+  // This update function previously converted menu_links query strings to
+  // arrays. It has been removed for now due to incompatibility with
+  // PostgreSQL.
+}
+
+/**
+ * Convert menu_links query strings into arrays.
+ */
+function system_update_7076() {
+  $query = db_select('menu_links', 'ml', array('fetch' => PDO::FETCH_ASSOC))
+    ->fields('ml', array('mlid', 'options'));
+  foreach ($query->execute() as $menu_link) {
+    if (strpos($menu_link['options'], 'query') !== FALSE) {
+      $menu_link['options'] = unserialize($menu_link['options']);
+      if (isset($menu_link['options']['query']) && is_string($menu_link['options']['query'])) {
+        $menu_link['options']['query'] = drupal_get_query_array($menu_link['options']['query']);
+        db_update('menu_links')
+          ->fields(array(
+            'options' => serialize($menu_link['options']),
+          ))
+          ->condition('mlid', $menu_link['mlid'], '=')
+          ->execute();
+      }
+    }
+  }
+}
+
+/**
+ * Revert {file_managed}.filename changed to a binary column.
+ */
+function system_update_7077() {
+  db_change_field('file_managed', 'filename', 'filename', array(
+    'description' => 'Name of the file with no path components. This may differ from the basename of the URI if the file is renamed to avoid overwriting an existing file.',
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => TRUE,
+    'default' => '',
+  ));
+}
+
+
+/**
+ * Add binary to {date_formats}.format.
+ */
+function system_update_7078() {
+  db_drop_unique_key('date_formats', 'formats');
+  db_change_field('date_formats', 'format', 'format', array(
+    'description' => 'The date format string.',
+    'type' => 'varchar',
+    'length' => 100,
+    'not null' => TRUE,
+    'binary' => TRUE,
+  ), array('unique keys' => array('formats' => array('format', 'type'))));
+}
+
+/**
+ * Convert the 'filesize' column in {file_managed} to a bigint.
+ */
+function system_update_7079() {
+  $spec = array(
+    'description' => 'The size of the file in bytes.',
+    'type' => 'int',
+    'size' => 'big',
+    'unsigned' => TRUE,
+    'not null' => TRUE,
+    'default' => 0,
+  );
+  db_change_field('file_managed', 'filesize', 'filesize', $spec);
+}
+
+/**
+ * @} End of "defgroup updates-7.x-extra".
+ * The next series of updates should start at 8000.
+ */
diff --git a/htmltest/modules/system/system.js b/htmltest/modules/system/system.js
new file mode 100644
index 00000000..910fb5d3
--- /dev/null
+++ b/htmltest/modules/system/system.js
@@ -0,0 +1,140 @@
+(function ($) {
+
+/**
+ * Show/hide the 'Email site administrator when updates are available' checkbox
+ * on the install page.
+ */
+Drupal.hideEmailAdministratorCheckbox = function () {
+  // Make sure the secondary box is shown / hidden as necessary on page load.
+  if ($('#edit-update-status-module-1').is(':checked')) {
+    $('.form-item-update-status-module-2').show();
+  }
+  else {
+    $('.form-item-update-status-module-2').hide();
+  }
+
+  // Toggle the display as necessary when the checkbox is clicked.
+  $('#edit-update-status-module-1').change( function () {
+    $('.form-item-update-status-module-2').toggle();
+  });
+};
+
+/**
+ * Internal function to check using Ajax if clean URLs can be enabled on the
+ * settings page.
+ *
+ * This function is not used to verify whether or not clean URLs
+ * are currently enabled.
+ */
+Drupal.behaviors.cleanURLsSettingsCheck = {
+  attach: function (context, settings) {
+    // This behavior attaches by ID, so is only valid once on a page.
+    // Also skip if we are on an install page, as Drupal.cleanURLsInstallCheck will handle
+    // the processing.
+    if (!($('#edit-clean-url').length) || $('#edit-clean-url.install').once('clean-url').length) {
+      return;
+    }
+    var url = settings.basePath + 'admin/config/search/clean-urls/check';
+    $.ajax({
+      url: location.protocol + '//' + location.host + url,
+      dataType: 'json',
+      success: function () {
+        // Check was successful. Redirect using a "clean URL". This will force the form that allows enabling clean URLs.
+        location = settings.basePath +"admin/config/search/clean-urls";
+      }
+    });
+  }
+};
+
+/**
+ * Internal function to check using Ajax if clean URLs can be enabled on the
+ * install page.
+ *
+ * This function is not used to verify whether or not clean URLs
+ * are currently enabled.
+ */
+Drupal.cleanURLsInstallCheck = function () {
+  var url = location.protocol + '//' + location.host + Drupal.settings.basePath + 'admin/config/search/clean-urls/check';
+  // Submit a synchronous request to avoid database errors associated with
+  // concurrent requests during install.
+  $.ajax({
+    async: false,
+    url: url,
+    dataType: 'json',
+    success: function () {
+      // Check was successful.
+      $('#edit-clean-url').attr('value', 1);
+    }
+  });
+};
+
+/**
+ * When a field is filled out, apply its value to other fields that will likely
+ * use the same value. In the installer this is used to populate the
+ * administrator e-mail address with the same value as the site e-mail address.
+ */
+Drupal.behaviors.copyFieldValue = {
+  attach: function (context, settings) {
+    for (var sourceId in settings.copyFieldValue) {
+      $('#' + sourceId, context).once('copy-field-values').bind('blur', function () {
+        // Get the list of target fields.
+        var targetIds = settings.copyFieldValue[sourceId];
+        // Add the behavior to update target fields on blur of the primary field.
+        for (var delta in targetIds) {
+          var targetField = $('#' + targetIds[delta]);
+          if (targetField.val() == '') {
+            targetField.val(this.value);
+          }
+        }
+      });
+    }
+  }
+};
+
+/**
+ * Show/hide custom format sections on the regional settings page.
+ */
+Drupal.behaviors.dateTime = {
+  attach: function (context, settings) {
+    for (var fieldName in settings.dateTime) {
+      if (settings.dateTime.hasOwnProperty(fieldName)) {
+        (function (fieldSettings, fieldName) {
+          var source = '#edit-' + fieldName;
+          var suffix = source + '-suffix';
+
+          // Attach keyup handler to custom format inputs.
+          $('input' + source, context).once('date-time').keyup(function () {
+            var input = $(this);
+            var url = fieldSettings.lookup + (/\?q=/.test(fieldSettings.lookup) ? '&format=' : '?format=') + encodeURIComponent(input.val());
+            $.getJSON(url, function (data) {
+              $(suffix).empty().append(' ' + fieldSettings.text + ': <em>' + data + '</em>');
+            });
+          });
+        })(settings.dateTime[fieldName], fieldName);
+      }
+    }
+  }
+};
+
+ /**
+ * Show/hide settings for page caching depending on whether page caching is
+ * enabled or not.
+ */
+Drupal.behaviors.pageCache = {
+  attach: function (context, settings) {
+    $('#edit-cache-0', context).change(function () {
+      $('#page-compression-wrapper').hide();
+      $('#cache-error').hide();
+    });
+    $('#edit-cache-1', context).change(function () {
+      $('#page-compression-wrapper').show();
+      $('#cache-error').hide();
+    });
+    $('#edit-cache-2', context).change(function () {
+      $('#page-compression-wrapper').show();
+      $('#cache-error').show();
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/system/system.mail.inc b/htmltest/modules/system/system.mail.inc
new file mode 100644
index 00000000..443e5740
--- /dev/null
+++ b/htmltest/modules/system/system.mail.inc
@@ -0,0 +1,133 @@
+<?php
+
+/**
+ * @file
+ * Drupal core implementations of MailSystemInterface.
+ */
+
+/**
+ * The default Drupal mail backend using PHP's mail function.
+ */
+class DefaultMailSystem implements MailSystemInterface {
+  /**
+   * Concatenate and wrap the e-mail body for plain-text mails.
+   *
+   * @param $message
+   *   A message array, as described in hook_mail_alter().
+   *
+   * @return
+   *   The formatted $message.
+   */
+  public function format(array $message) {
+    // Join the body array into one string.
+    $message['body'] = implode("\n\n", $message['body']);
+    // Convert any HTML to plain-text.
+    $message['body'] = drupal_html_to_text($message['body']);
+    // Wrap the mail body for sending.
+    $message['body'] = drupal_wrap_mail($message['body']);
+    return $message;
+  }
+
+  /**
+   * Send an e-mail message, using Drupal variables and default settings.
+   *
+   * @see http://php.net/manual/function.mail.php
+   * @see drupal_mail()
+   *
+   * @param $message
+   *   A message array, as described in hook_mail_alter().
+   * @return
+   *   TRUE if the mail was successfully accepted, otherwise FALSE.
+   */
+  public function mail(array $message) {
+    // If 'Return-Path' isn't already set in php.ini, we pass it separately
+    // as an additional parameter instead of in the header.
+    // However, if PHP's 'safe_mode' is on, this is not allowed.
+    if (isset($message['headers']['Return-Path']) && !ini_get('safe_mode')) {
+      $return_path_set = strpos(ini_get('sendmail_path'), ' -f');
+      if (!$return_path_set) {
+        $message['Return-Path'] = $message['headers']['Return-Path'];
+        unset($message['headers']['Return-Path']);
+      }
+    }
+    $mimeheaders = array();
+    foreach ($message['headers'] as $name => $value) {
+      $mimeheaders[] = $name . ': ' . mime_header_encode($value);
+    }
+    $line_endings = variable_get('mail_line_endings', MAIL_LINE_ENDINGS);
+    // Prepare mail commands.
+    $mail_subject = mime_header_encode($message['subject']);
+    // Note: e-mail uses CRLF for line-endings. PHP's API requires LF
+    // on Unix and CRLF on Windows. Drupal automatically guesses the
+    // line-ending format appropriate for your system. If you need to
+    // override this, adjust $conf['mail_line_endings'] in settings.php.
+    $mail_body = preg_replace('@\r?\n@', $line_endings, $message['body']);
+    // For headers, PHP's API suggests that we use CRLF normally,
+    // but some MTAs incorrectly replace LF with CRLF. See #234403.
+    $mail_headers = join("\n", $mimeheaders);
+
+    // We suppress warnings and notices from mail() because of issues on some
+    // hosts. The return value of this method will still indicate whether mail
+    // was sent successfully.
+    if (!isset($_SERVER['WINDIR']) && strpos($_SERVER['SERVER_SOFTWARE'], 'Win32') === FALSE) {
+      if (isset($message['Return-Path']) && !ini_get('safe_mode')) {
+        // On most non-Windows systems, the "-f" option to the sendmail command
+        // is used to set the Return-Path. There is no space between -f and
+        // the value of the return path.
+        $mail_result = @mail(
+          $message['to'],
+          $mail_subject,
+          $mail_body,
+          $mail_headers,
+          '-f' . $message['Return-Path']
+        );
+      }
+      else {
+        // The optional $additional_parameters argument to mail() is not
+        // allowed if safe_mode is enabled. Passing any value throws a PHP
+        // warning and makes mail() return FALSE.
+        $mail_result = @mail(
+          $message['to'],
+          $mail_subject,
+          $mail_body,
+          $mail_headers
+        );
+      }
+     }
+     else {
+      // On Windows, PHP will use the value of sendmail_from for the
+      // Return-Path header.
+      $old_from = ini_get('sendmail_from');
+      ini_set('sendmail_from', $message['Return-Path']);
+      $mail_result = @mail(
+         $message['to'],
+         $mail_subject,
+         $mail_body,
+         $mail_headers
+       );
+      ini_set('sendmail_from', $old_from);
+     }
+     return $mail_result;
+  }
+}
+
+/**
+ * A mail sending implementation that captures sent messages to a variable.
+ *
+ * This class is for running tests or for development.
+ */
+class TestingMailSystem extends DefaultMailSystem implements MailSystemInterface {
+  /**
+   * Accept an e-mail message and store it in a variable.
+   *
+   * @param $message
+   *   An e-mail message.
+   */
+  public function mail(array $message) {
+    $captured_emails = variable_get('drupal_test_email_collector', array());
+    $captured_emails[] = $message;
+    variable_set('drupal_test_email_collector', $captured_emails);
+    return TRUE;
+  }
+}
+
diff --git a/htmltest/modules/system/system.maintenance.css b/htmltest/modules/system/system.maintenance.css
new file mode 100644
index 00000000..5543c2db
--- /dev/null
+++ b/htmltest/modules/system/system.maintenance.css
@@ -0,0 +1,55 @@
+
+/**
+ * Update styles
+ */
+#update-results {
+  margin-top: 3em;
+  padding: 0.25em;
+  border: 1px solid #ccc;
+  background: #eee;
+  font-size: smaller;
+}
+#update-results h2 {
+  margin-top: 0.25em;
+}
+#update-results h4 {
+  margin-bottom: 0.25em;
+}
+#update-results li.none {
+  color: #888;
+  font-style: italic;
+}
+#update-results li.failure strong {
+  color: #b63300;
+}
+
+/**
+ * Authorize.php styles
+ */
+.connection-settings-update-filetransfer-default-wrapper {
+  float: left;
+}
+#edit-submit-connection {
+  clear: both;
+}
+.filetransfer {
+  display: none;
+  clear: both;
+}
+#edit-connection-settings-change-connection-type {
+  margin: 2.6em 0.5em 0em 1em;
+}
+
+/**
+ * Installation task list
+ */
+ol.task-list li.active {
+  font-weight: bold;
+}
+
+/**
+ * Installation clean URLs
+ */
+#clean-url.install {
+  display: none;
+}
diff --git a/htmltest/modules/system/system.menus-rtl.css b/htmltest/modules/system/system.menus-rtl.css
new file mode 100644
index 00000000..be85245b
--- /dev/null
+++ b/htmltest/modules/system/system.menus-rtl.css
@@ -0,0 +1,37 @@
+
+/**
+ * @file
+ * RTL styles for menus and navigation markup.
+ */
+
+ul.menu {
+  text-align:right;
+}
+ul.menu li {
+  margin: 0 0.5em 0 0;
+}
+ul li.collapsed {
+  list-style-image: url(../../misc/menu-collapsed-rtl.png);
+}
+li.expanded,
+li.collapsed,
+li.leaf {
+  padding: 0.2em 0 0 0.5em;
+}
+
+/**
+ * Markup generated by theme_menu_local_tasks().
+ */
+ul.primary {
+  padding: 0 1em 0 0;
+}
+ul.primary li a {
+  margin-right: 5px;
+  margin-left: 0.5em;
+}
+ul.secondary li {
+  border-left: 1px solid #ccc;
+  border-right: none;
+  display: inline;
+  padding: 0 1em;
+}
diff --git a/htmltest/modules/system/system.menus.css b/htmltest/modules/system/system.menus.css
new file mode 100644
index 00000000..514b0295
--- /dev/null
+++ b/htmltest/modules/system/system.menus.css
@@ -0,0 +1,116 @@
+
+/**
+ * @file
+ * Styles for menus and navigation markup.
+ */
+
+/**
+ * Markup generated by theme_menu_tree().
+ */
+ul.menu {
+  border: none;
+  list-style: none;
+  text-align: left; /* LTR */
+}
+ul.menu li {
+  margin: 0 0 0 0.5em; /* LTR */
+}
+ul li.expanded {
+  list-style-image: url(../../misc/menu-expanded.png);
+  list-style-type: circle;
+}
+ul li.collapsed {
+  list-style-image: url(../../misc/menu-collapsed.png); /* LTR */
+  list-style-type: disc;
+}
+ul li.leaf {
+  list-style-image: url(../../misc/menu-leaf.png);
+  list-style-type: square;
+}
+li.expanded,
+li.collapsed,
+li.leaf {
+  padding: 0.2em 0.5em 0 0; /* LTR */
+  margin: 0;
+}
+li a.active {
+  color: #000;
+}
+td.menu-disabled {
+  background: #ccc;
+}
+
+/**
+ * Markup generated by theme_links().
+ */
+ul.inline,
+ul.links.inline {
+  display: inline;
+  padding-left: 0;
+}
+ul.inline li {
+  display: inline;
+  list-style-type: none;
+  padding: 0 0.5em;
+}
+
+/**
+ * Markup generated by theme_breadcrumb().
+ */
+.breadcrumb {
+  padding-bottom: 0.5em;
+}
+
+/**
+ * Markup generated by theme_menu_local_tasks().
+ */
+ul.primary {
+  border-bottom: 1px solid #bbb;
+  border-collapse: collapse;
+  height: auto;
+  line-height: normal;
+  list-style: none;
+  margin: 5px;
+  padding: 0 0 0 1em; /* LTR */
+  white-space: nowrap;
+}
+ul.primary li {
+  display: inline;
+}
+ul.primary li a {
+  background-color: #ddd;
+  border-color: #bbb;
+  border-style: solid solid none solid;
+  border-width: 1px;
+  height: auto;
+  margin-right: 0.5em; /* LTR */
+  padding: 0 1em;
+  text-decoration: none;
+}
+ul.primary li.active a {
+  background-color: #fff;
+  border: 1px solid #bbb;
+  border-bottom: 1px solid #fff;
+}
+ul.primary li a:hover {
+  background-color: #eee;
+  border-color: #ccc;
+  border-bottom-color: #eee;
+}
+ul.secondary {
+  border-bottom: 1px solid #bbb;
+  padding: 0.5em 1em;
+  margin: 5px;
+}
+ul.secondary li {
+  border-right: 1px solid #ccc; /* LTR */
+  display: inline;
+  padding: 0 1em;
+}
+ul.secondary a {
+  padding: 0;
+  text-decoration: none;
+}
+ul.secondary a.active {
+  border-bottom: 4px solid #999;
+}
diff --git a/htmltest/modules/system/system.messages-rtl.css b/htmltest/modules/system/system.messages-rtl.css
new file mode 100644
index 00000000..445417b0
--- /dev/null
+++ b/htmltest/modules/system/system.messages-rtl.css
@@ -0,0 +1,13 @@
+
+/**
+ * @file
+ * RTL Styles for system messages.
+ */
+
+div.messages {
+  background-position: 99% 8px;
+  padding: 10px 50px 10px 10px;
+}
+div.messages ul {
+  margin: 0 1em 0 0;
+}
diff --git a/htmltest/modules/system/system.messages.css b/htmltest/modules/system/system.messages.css
new file mode 100644
index 00000000..ffd4e8ef
--- /dev/null
+++ b/htmltest/modules/system/system.messages.css
@@ -0,0 +1,63 @@
+
+/**
+ * @file
+ * Styles for system messages.
+ */
+
+div.messages {
+  background-position: 8px 8px; /* LTR */
+  background-repeat: no-repeat;
+  border: 1px solid;
+  margin: 6px 0;
+  padding: 10px 10px 10px 50px; /* LTR */
+}
+
+div.status {
+  background-image: url(../../misc/message-24-ok.png);
+  border-color: #be7;
+}
+div.status,
+.ok {
+  color: #234600;
+}
+div.status,
+table tr.ok {
+  background-color: #f8fff0;
+}
+
+div.warning {
+  background-image: url(../../misc/message-24-warning.png);
+  border-color: #ed5;
+}
+div.warning,
+.warning {
+  color: #840;
+}
+div.warning,
+table tr.warning {
+  background-color: #fffce5;
+}
+
+div.error {
+  background-image: url(../../misc/message-24-error.png);
+  border-color: #ed541d;
+}
+div.error,
+.error {
+  color: #8c2e0b;
+}
+div.error,
+table tr.error {
+  background-color: #fef5f1;
+}
+div.error p.error {
+  color: #333;
+}
+
+div.messages ul {
+  margin: 0 0 0 1em; /* LTR */
+  padding: 0;
+}
+div.messages ul li {
+  list-style-image: none;
+}
diff --git a/htmltest/modules/system/system.module b/htmltest/modules/system/system.module
new file mode 100644
index 00000000..eada9ffc
--- /dev/null
+++ b/htmltest/modules/system/system.module
@@ -0,0 +1,4021 @@
+<?php
+
+/**
+ * @file
+ * Configuration system that lets administrators modify the workings of the site.
+ */
+
+/**
+ * Maximum age of temporary files in seconds.
+ */
+define('DRUPAL_MAXIMUM_TEMP_FILE_AGE', 21600);
+
+/**
+ * Default interval for automatic cron executions in seconds.
+ */
+define('DRUPAL_CRON_DEFAULT_THRESHOLD', 10800);
+
+/**
+ * New users will be set to the default time zone at registration.
+ */
+define('DRUPAL_USER_TIMEZONE_DEFAULT', 0);
+
+/**
+ * New users will get an empty time zone at registration.
+ */
+define('DRUPAL_USER_TIMEZONE_EMPTY', 1);
+
+/**
+ * New users will select their own timezone at registration.
+ */
+define('DRUPAL_USER_TIMEZONE_SELECT', 2);
+
+ /**
+ * Disabled option on forms and settings
+ */
+define('DRUPAL_DISABLED', 0);
+
+/**
+ * Optional option on forms and settings
+ */
+define('DRUPAL_OPTIONAL', 1);
+
+/**
+ * Required option on forms and settings
+ */
+define('DRUPAL_REQUIRED', 2);
+
+/**
+ * Maximum number of values in a weight select element.
+ *
+ * If the number of values is over the maximum, a text field is used instead.
+ */
+define('DRUPAL_WEIGHT_SELECT_MAX', 100);
+
+/**
+ * Return only visible regions.
+ *
+ * @see system_region_list()
+ */
+define('REGIONS_VISIBLE', 'visible');
+
+/**
+ * Return all regions.
+ *
+ * @see system_region_list()
+ */
+define('REGIONS_ALL', 'all');
+
+/**
+ * Implements hook_help().
+ */
+function system_help($path, $arg) {
+  global $base_url;
+
+  switch ($path) {
+    case 'admin/help#system':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The System module is integral to the site, and provides basic but extensible functionality for use by other modules and themes. Some integral elements of Drupal are contained in and managed by the System module, including caching, enabling and disabling modules and themes, preparing and displaying the administrative page, and configuring fundamental site settings. A number of key system maintenance operations are also part of the System module. For more information, see the online handbook entry for <a href="@system">System module</a>.', array('@system' => 'http://drupal.org/documentation/modules/system')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Managing modules') . '</dt>';
+      $output .= '<dd>' . t('The System module allows users with the appropriate permissions to enable and disable modules on the <a href="@modules">Modules administration page</a>. Drupal comes with a number of core modules, and each module provides a discrete set of features and may be enabled or disabled depending on the needs of the site. Many additional modules contributed by members of the Drupal community are available for download at the <a href="@drupal-modules">Drupal.org module page</a>.', array('@modules' => url('admin/modules'), '@drupal-modules' => 'http://drupal.org/project/modules')) . '</dd>';
+      $output .= '<dt>' . t('Managing themes') . '</dt>';
+      $output .= '<dd>' . t('The System module allows users with the appropriate permissions to enable and disable themes on the <a href="@themes">Appearance administration page</a>. Themes determine the design and presentation of your site. Drupal comes packaged with several core themes, and additional contributed themes are available at the <a href="@drupal-themes">Drupal.org theme page</a>.', array('@themes' => url('admin/appearance'), '@drupal-themes' => 'http://drupal.org/project/themes')) . '</dd>';
+      $output .= '<dt>' . t('Managing caching') . '</dt>';
+      $output .= '<dd>' . t("The System module allows users with the appropriate permissions to manage caching on the <a href='@cache-settings'>Performance settings page</a>. Drupal has a robust caching system that allows the efficient re-use of previously-constructed web pages and web page components. Pages requested by anonymous users are stored in a compressed format; depending on your site configuration and the amount of your web traffic tied to anonymous visitors, the caching system may significantly increase the speed of your site.", array('@cache-settings' => url('admin/config/development/performance'))) . '</dd>';
+      $output .= '<dt>' . t('Performing system maintenance') . '</dt>';
+      $output .= '<dd>' . t('In order for the site and its modules to continue to operate well, a set of routine administrative operations must run on a regular basis. The System module manages this task by making use of a system cron job. You can verify the status of cron tasks by visiting the <a href="@status">Status report page</a>. For more information, see the online handbook entry for <a href="@handbook">configuring cron jobs</a>. You can set up cron job by visiting <a href="@cron">Cron configuration</a> page', array('@status' => url('admin/reports/status'), '@handbook' => 'http://drupal.org/cron', '@cron' => url('admin/config/system/cron'))) . '</dd>';
+      $output .= '<dt>' . t('Configuring basic site settings') . '</dt>';
+      $output .= '<dd>' . t('The System module also handles basic configuration options for your site, including <a href="@date-time-settings">Date and time settings</a>, <a href="@file-system">File system settings</a>, <a href="@clean-url">Clean URL support</a>, <a href="@site-info">Site name and other information</a>, and a <a href="@maintenance-mode">Maintenance mode</a> for taking your site temporarily offline.', array('@date-time-settings' => url('admin/config/regional/date-time'), '@file-system' => url('admin/config/media/file-system'), '@clean-url' => url('admin/config/search/clean-urls'), '@site-info' => url('admin/config/system/site-information'), '@maintenance-mode' => url('admin/config/development/maintenance'))) . '</dd>';
+      $output .= '<dt>' . t('Configuring actions') . '</dt>';
+      $output .= '<dd>' . t('Actions are individual tasks that the system can do, such as unpublishing a piece of content or banning a user. Modules, such as the <a href="@trigger-help">Trigger module</a>, can fire these actions when certain system events happen; for example, when a new post is added or when a user logs in. Modules may also provide additional actions. Visit the <a href="@actions">Actions page</a> to configure actions.', array('@trigger-help' => url('admin/help/trigger'), '@actions' => url('admin/config/system/actions'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'admin/index':
+      return '<p>' . t('This page shows you all available administration tasks for each module.') . '</p>';
+    case 'admin/appearance':
+      $output = '<p>' . t('Set and configure the default theme for your website.  Alternative <a href="@themes">themes</a> are available.', array('@themes' => 'http://drupal.org/project/themes')) . '</p>';
+      return $output;
+    case 'admin/appearance/settings/' . $arg[3]:
+      $theme_list = list_themes();
+      $theme = $theme_list[$arg[3]];
+      return '<p>' . t('These options control the display settings for the %name theme. When your site is displayed using this theme, these settings will be used.', array('%name' => $theme->info['name'])) . '</p>';
+    case 'admin/appearance/settings':
+      return '<p>' . t('These options control the default display settings for your entire site, across all themes. Unless they have been overridden by a specific theme, these settings will be used.') . '</p>';
+    case 'admin/modules':
+      $output = '<p>' . t('Download additional <a href="@modules">contributed modules</a> to extend Drupal\'s functionality.', array('@modules' => 'http://drupal.org/project/modules')) . '</p>';
+      if (module_exists('update')) {
+        if (update_manager_access()) {
+          $output .= '<p>' . t('Regularly review and install <a href="@updates">available updates</a> to maintain a secure and current site. Always run the <a href="@update-php">update script</a> each time a module is updated.', array('@update-php' => $base_url . '/update.php', '@updates' => url('admin/reports/updates'))) . '</p>';
+        }
+        else {
+          $output .= '<p>' . t('Regularly review <a href="@updates">available updates</a> to maintain a secure and current site. Always run the <a href="@update-php">update script</a> each time a module is updated.', array('@update-php' => $base_url . '/update.php', '@updates' => url('admin/reports/updates'))) . '</p>';
+        }
+      }
+      else {
+        $output .= '<p>' . t('Regularly review available updates to maintain a secure and current site. Always run the <a href="@update-php">update script</a> each time a module is updated. Enable the Update manager module to update and install modules and themes.', array('@update-php' => $base_url . '/update.php')) . '</p>';
+      }
+      return $output;
+    case 'admin/modules/uninstall':
+      return '<p>' . t('The uninstall process removes all data related to a module. To uninstall a module, you must first disable it on the main <a href="@modules">Modules page</a>.', array('@modules' => url('admin/modules'))) . '</p>';
+    case 'admin/structure/block/manage':
+      if ($arg[4] == 'system' && $arg[5] == 'powered-by') {
+        return '<p>' . t('The <em>Powered by Drupal</em> block is an optional link to the home page of the Drupal project. While there is absolutely no requirement that sites feature this link, it may be used to show support for Drupal.') . '</p>';
+      }
+      break;
+    case 'admin/config/development/maintenance':
+      global $user;
+      if ($user->uid == 1) {
+        return '<p>' . t('If you are upgrading to a newer version of Drupal or upgrading contributed modules or themes, you may need to run the <a href="@update-php">update script</a>.', array('@update-php' => $base_url . '/update.php')) . '</p>';
+      }
+      break;
+    case 'admin/config/system/actions':
+    case 'admin/config/system/actions/manage':
+      $output = '';
+      $output .= '<p>' . t('There are two types of actions: simple and advanced. Simple actions do not require any additional configuration, and are listed here automatically. Advanced actions need to be created and configured before they can be used, because they have options that need to be specified; for example, sending an e-mail to a specified address, or unpublishing content containing certain words. To create an advanced action, select the action from the drop-down list in the advanced action section below and click the <em>Create</em> button.') . '</p>';
+      if (module_exists('trigger')) {
+        $output .= '<p>' . t('You may proceed to the <a href="@url">Triggers</a> page to assign these actions to system events.', array('@url' => url('admin/structure/trigger'))) . '</p>';
+      }
+      return $output;
+    case 'admin/config/system/actions/configure':
+      return t('An advanced action offers additional configuration options which may be filled out below. Changing the <em>Description</em> field is recommended, in order to better identify the precise action taking place. This description will be displayed in modules such as the Trigger module when assigning actions to system events, so it is best if it is as descriptive as possible (for example, "Send e-mail to Moderation Team" rather than simply "Send e-mail").');
+    case 'admin/config/people/ip-blocking':
+      return '<p>' . t('IP addresses listed here are blocked from your site. Blocked addresses are completely forbidden from accessing the site and instead see a brief message explaining the situation.') . '</p>';
+    case 'admin/reports/status':
+      return '<p>' . t("Here you can find a short overview of your site's parameters as well as any problems detected with your installation. It may be useful to copy and paste this information into support requests filed on drupal.org's support forums and project issue queues.") . '</p>';
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function system_theme() {
+  return array_merge(drupal_common_theme(), array(
+    'system_themes_page' => array(
+      'variables' => array('theme_groups' => NULL),
+      'file' => 'system.admin.inc',
+    ),
+    'system_settings_form' => array(
+      'render element' => 'form',
+    ),
+    'confirm_form' => array(
+      'render element' => 'form',
+    ),
+    'system_modules_fieldset' => array(
+      'render element' => 'form',
+      'file' => 'system.admin.inc',
+    ),
+    'system_modules_incompatible' => array(
+      'variables' => array('message' => NULL),
+      'file' => 'system.admin.inc',
+    ),
+    'system_modules_uninstall' => array(
+      'render element' => 'form',
+      'file' => 'system.admin.inc',
+    ),
+    'status_report' => array(
+      'render element' => 'requirements',
+      'file' => 'system.admin.inc',
+    ),
+    'admin_page' => array(
+      'variables' => array('blocks' => NULL),
+      'file' => 'system.admin.inc',
+    ),
+    'admin_block' => array(
+      'variables' => array('block' => NULL),
+      'file' => 'system.admin.inc',
+    ),
+    'admin_block_content' => array(
+      'variables' => array('content' => NULL),
+      'file' => 'system.admin.inc',
+    ),
+    'system_admin_index' => array(
+      'variables' => array('menu_items' => NULL),
+      'file' => 'system.admin.inc',
+    ),
+    'system_powered_by' => array(
+      'variables' => array(),
+    ),
+    'system_compact_link' => array(
+      'variables' => array(),
+    ),
+    'system_date_time_settings' => array(
+      'render element' => 'form',
+      'file' => 'system.admin.inc',
+    ),
+  ));
+}
+
+/**
+ * Implements hook_permission().
+ */
+function system_permission() {
+  return array(
+    'administer modules' => array(
+      'title' => t('Administer modules'),
+    ),
+    'administer site configuration' => array(
+      'title' => t('Administer site configuration'),
+      'restrict access' => TRUE,
+    ),
+    'administer themes' => array(
+      'title' => t('Administer themes'),
+    ),
+    'administer software updates' => array(
+      'title' => t('Administer software updates'),
+      'restrict access' => TRUE,
+    ),
+    'administer actions' => array(
+      'title' => t('Administer actions'),
+    ),
+    'access administration pages' => array(
+      'title' => t('Use the administration pages and help'),
+    ),
+    'access site in maintenance mode' => array(
+      'title' => t('Use the site in maintenance mode'),
+    ),
+    'view the administration theme' => array(
+      'title' => t('View the administration theme'),
+      'description' => variable_get('admin_theme') ? '' : t('This is only used when the site is configured to use a separate administration theme on the <a href="@appearance-url">Appearance</a> page.', array('@appearance-url' => url('admin/appearance'))),
+    ),
+    'access site reports' => array(
+      'title' => t('View site reports'),
+    ),
+    'block IP addresses' => array(
+      'title' => t('Block IP addresses'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_hook_info().
+ */
+function system_hook_info() {
+  $hooks['token_info'] = array(
+    'group' => 'tokens',
+  );
+  $hooks['token_info_alter'] = array(
+    'group' => 'tokens',
+  );
+  $hooks['tokens'] = array(
+    'group' => 'tokens',
+  );
+  $hooks['tokens_alter'] = array(
+    'group' => 'tokens',
+  );
+
+  return $hooks;
+}
+
+/**
+ * Implements hook_entity_info().
+ */
+function system_entity_info() {
+  return array(
+    'file' => array(
+      'label' => t('File'),
+      'base table' => 'file_managed',
+      'entity keys' => array(
+        'id' => 'fid',
+        'label' => 'filename',
+      ),
+      'static cache' => FALSE,
+    ),
+  );
+}
+
+/**
+ * Implements hook_element_info().
+ */
+function system_element_info() {
+  // Top level elements.
+  $types['form'] = array(
+    '#method' => 'post',
+    '#action' => request_uri(),
+    '#theme_wrappers' => array('form'),
+  );
+  $types['page'] = array(
+    '#show_messages' => TRUE,
+    '#theme' => 'page',
+    '#theme_wrappers' => array('html'),
+  );
+  // By default, we don't want Ajax commands being rendered in the context of an
+  // HTML page, so we don't provide defaults for #theme or #theme_wrappers.
+  // However, modules can set these properties (for example, to provide an HTML
+  // debugging page that displays rather than executes Ajax commands).
+  $types['ajax'] = array(
+    '#header' => TRUE,
+    '#commands' => array(),
+    '#error' => NULL,
+  );
+  $types['html_tag'] = array(
+    '#theme' => 'html_tag',
+    '#pre_render' => array('drupal_pre_render_conditional_comments'),
+    '#attributes' => array(),
+    '#value' => NULL,
+  );
+  $types['styles'] = array(
+    '#items' => array(),
+    '#pre_render' => array('drupal_pre_render_styles'),
+    '#group_callback' => 'drupal_group_css',
+    '#aggregate_callback' => 'drupal_aggregate_css',
+  );
+
+  // Input elements.
+  $types['submit'] = array(
+    '#input' => TRUE,
+    '#name' => 'op',
+    '#button_type' => 'submit',
+    '#executes_submit_callback' => TRUE,
+    '#limit_validation_errors' => FALSE,
+    '#process' => array('ajax_process_form'),
+    '#theme_wrappers' => array('button'),
+  );
+  $types['button'] = array(
+    '#input' => TRUE,
+    '#name' => 'op',
+    '#button_type' => 'submit',
+    '#executes_submit_callback' => FALSE,
+    '#limit_validation_errors' => FALSE,
+    '#process' => array('ajax_process_form'),
+    '#theme_wrappers' => array('button'),
+  );
+  $types['image_button'] = array(
+    '#input' => TRUE,
+    '#button_type' => 'submit',
+    '#executes_submit_callback' => TRUE,
+    '#limit_validation_errors' => FALSE,
+    '#process' => array('ajax_process_form'),
+    '#return_value' => TRUE,
+    '#has_garbage_value' => TRUE,
+    '#src' => NULL,
+    '#theme_wrappers' => array('image_button'),
+  );
+  $types['textfield'] = array(
+    '#input' => TRUE,
+    '#size' => 60,
+    '#maxlength' => 128,
+    '#autocomplete_path' => FALSE,
+    '#process' => array('ajax_process_form'),
+    '#theme' => 'textfield',
+    '#theme_wrappers' => array('form_element'),
+  );
+  $types['machine_name'] = array(
+    '#input' => TRUE,
+    '#default_value' => NULL,
+    '#required' => TRUE,
+    '#maxlength' => 64,
+    '#size' => 60,
+    '#autocomplete_path' => FALSE,
+    '#process' => array('form_process_machine_name', 'ajax_process_form'),
+    '#element_validate' => array('form_validate_machine_name'),
+    '#theme' => 'textfield',
+    '#theme_wrappers' => array('form_element'),
+  );
+  $types['password'] = array(
+    '#input' => TRUE,
+    '#size' => 60,
+    '#maxlength' => 128,
+    '#process' => array('ajax_process_form'),
+    '#theme' => 'password',
+    '#theme_wrappers' => array('form_element'),
+  );
+  $types['password_confirm'] = array(
+    '#input' => TRUE,
+    '#process' => array('form_process_password_confirm', 'user_form_process_password_confirm'),
+    '#theme_wrappers' => array('form_element'),
+  );
+  $types['textarea'] = array(
+    '#input' => TRUE,
+    '#cols' => 60,
+    '#rows' => 5,
+    '#resizable' => TRUE,
+    '#process' => array('ajax_process_form'),
+    '#theme' => 'textarea',
+    '#theme_wrappers' => array('form_element'),
+  );
+  $types['radios'] = array(
+    '#input' => TRUE,
+    '#process' => array('form_process_radios'),
+    '#theme_wrappers' => array('radios'),
+    '#pre_render' => array('form_pre_render_conditional_form_element'),
+  );
+  $types['radio'] = array(
+    '#input' => TRUE,
+    '#default_value' => NULL,
+    '#process' => array('ajax_process_form'),
+    '#theme' => 'radio',
+    '#theme_wrappers' => array('form_element'),
+    '#title_display' => 'after',
+  );
+  $types['checkboxes'] = array(
+    '#input' => TRUE,
+    '#process' => array('form_process_checkboxes'),
+    '#theme_wrappers' => array('checkboxes'),
+    '#pre_render' => array('form_pre_render_conditional_form_element'),
+  );
+  $types['checkbox'] = array(
+    '#input' => TRUE,
+    '#return_value' => 1,
+    '#theme' => 'checkbox',
+    '#process' => array('form_process_checkbox', 'ajax_process_form'),
+    '#theme_wrappers' => array('form_element'),
+    '#title_display' => 'after',
+  );
+  $types['select'] = array(
+    '#input' => TRUE,
+    '#multiple' => FALSE,
+    '#process' => array('form_process_select', 'ajax_process_form'),
+    '#theme' => 'select',
+    '#theme_wrappers' => array('form_element'),
+  );
+  $types['weight'] = array(
+    '#input' => TRUE,
+    '#delta' => 10,
+    '#default_value' => 0,
+    '#process' => array('form_process_weight', 'ajax_process_form'),
+  );
+  $types['date'] = array(
+    '#input' => TRUE,
+    '#element_validate' => array('date_validate'),
+    '#process' => array('form_process_date'),
+    '#theme' => 'date',
+    '#theme_wrappers' => array('form_element'),
+  );
+  $types['file'] = array(
+    '#input' => TRUE,
+    '#size' => 60,
+    '#theme' => 'file',
+    '#theme_wrappers' => array('form_element'),
+  );
+  $types['tableselect'] = array(
+    '#input' => TRUE,
+    '#js_select' => TRUE,
+    '#multiple' => TRUE,
+    '#process' => array('form_process_tableselect'),
+    '#options' => array(),
+    '#empty' => '',
+    '#theme' => 'tableselect',
+  );
+
+  // Form structure.
+  $types['item'] = array(
+    '#markup' => '',
+    '#pre_render' => array('drupal_pre_render_markup'),
+    '#theme_wrappers' => array('form_element'),
+  );
+  $types['hidden'] = array(
+    '#input' => TRUE,
+    '#process' => array('ajax_process_form'),
+    '#theme' => 'hidden',
+  );
+  $types['value'] = array(
+    '#input' => TRUE,
+  );
+  $types['markup'] = array(
+    '#markup' => '',
+    '#pre_render' => array('drupal_pre_render_markup'),
+  );
+  $types['link'] = array(
+    '#pre_render' => array('drupal_pre_render_link', 'drupal_pre_render_markup'),
+  );
+  $types['fieldset'] = array(
+    '#collapsible' => FALSE,
+    '#collapsed' => FALSE,
+    '#value' => NULL,
+    '#process' => array('form_process_fieldset', 'ajax_process_form'),
+    '#pre_render' => array('form_pre_render_fieldset'),
+    '#theme_wrappers' => array('fieldset'),
+  );
+  $types['vertical_tabs'] = array(
+    '#theme_wrappers' => array('vertical_tabs'),
+    '#default_tab' => '',
+    '#process' => array('form_process_vertical_tabs'),
+  );
+
+  $types['container'] = array(
+    '#theme_wrappers' => array('container'),
+    '#process' => array('form_process_container'),
+  );
+  $types['actions'] = array(
+    '#theme_wrappers' => array('container'),
+    '#process' => array('form_process_actions', 'form_process_container'),
+    '#weight' => 100,
+  );
+
+  $types['token'] = array(
+    '#input' => TRUE,
+    '#theme' => 'hidden',
+  );
+
+  return $types;
+}
+
+/**
+ * Implements hook_menu().
+ */
+function system_menu() {
+  $items['system/files'] = array(
+    'title' => 'File download',
+    'page callback' => 'file_download',
+    'page arguments' => array('private'),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['system/temporary'] = array(
+    'title' => 'Temporary files',
+    'page callback' => 'file_download',
+    'page arguments' => array('temporary'),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['system/ajax'] = array(
+    'title' => 'AHAH callback',
+    'page callback' => 'ajax_form_callback',
+    'delivery callback' => 'ajax_deliver',
+    'access callback' => TRUE,
+    'theme callback' => 'ajax_base_page_theme',
+    'type' => MENU_CALLBACK,
+    'file path' => 'includes',
+    'file' => 'form.inc',
+  );
+  $items['system/timezone'] = array(
+    'title' => 'Time zone',
+    'page callback' => 'system_timezone',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin'] = array(
+    'title' => 'Administration',
+    'access arguments' => array('access administration pages'),
+    'page callback' => 'system_admin_menu_block_page',
+    'weight' => 9,
+    'menu_name' => 'management',
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/compact'] = array(
+    'title' => 'Compact mode',
+    'page callback' => 'system_admin_compact_page',
+    'access arguments' => array('access administration pages'),
+    'type' => MENU_CALLBACK,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/tasks'] = array(
+    'title' => 'Tasks',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -20,
+  );
+  $items['admin/index'] = array(
+    'title' => 'Index',
+    'page callback' => 'system_admin_index',
+    'access arguments' => array('access administration pages'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => -18,
+    'file' => 'system.admin.inc',
+  );
+
+  // Menu items that are basically just menu blocks.
+  $items['admin/structure'] = array(
+    'title' => 'Structure',
+    'description' => 'Administer blocks, content types, menus, etc.',
+    'position' => 'right',
+    'weight' => -8,
+    'page callback' => 'system_admin_menu_block_page',
+    'access arguments' => array('access administration pages'),
+    'file' => 'system.admin.inc',
+  );
+  // Appearance.
+  $items['admin/appearance'] = array(
+    'title' => 'Appearance',
+    'description' => 'Select and configure your themes.',
+    'page callback' => 'system_themes_page',
+    'access arguments' => array('administer themes'),
+    'position' => 'left',
+    'weight' => -6,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/appearance/list'] = array(
+    'title' => 'List',
+    'description' => 'Select and configure your theme',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -1,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/appearance/enable'] = array(
+    'title' => 'Enable theme',
+    'page callback' => 'system_theme_enable',
+    'access arguments' => array('administer themes'),
+    'type' => MENU_CALLBACK,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/appearance/disable'] = array(
+    'title' => 'Disable theme',
+    'page callback' => 'system_theme_disable',
+    'access arguments' => array('administer themes'),
+    'type' => MENU_CALLBACK,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/appearance/default'] = array(
+    'title' => 'Set default theme',
+    'page callback' => 'system_theme_default',
+    'access arguments' => array('administer themes'),
+    'type' => MENU_CALLBACK,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/appearance/settings'] = array(
+    'title' => 'Settings',
+    'description' => 'Configure default and theme specific settings.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_theme_settings'),
+    'access arguments' => array('administer themes'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'system.admin.inc',
+    'weight' => 20,
+  );
+  // Theme configuration subtabs.
+  $items['admin/appearance/settings/global'] = array(
+    'title' => 'Global settings',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -1,
+  );
+
+  foreach (list_themes() as $theme) {
+    $items['admin/appearance/settings/' . $theme->name] = array(
+      'title' => $theme->info['name'],
+      'page arguments' => array('system_theme_settings', $theme->name),
+      'type' => MENU_LOCAL_TASK,
+      'access callback' => '_system_themes_access',
+      'access arguments' => array($theme),
+      'file' => 'system.admin.inc',
+    );
+  }
+
+  // Modules.
+  $items['admin/modules'] = array(
+    'title' => 'Modules',
+    'description' => 'Extend site functionality.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_modules'),
+    'access arguments' => array('administer modules'),
+    'file' => 'system.admin.inc',
+    'weight' => -2,
+  );
+  $items['admin/modules/list'] = array(
+    'title' => 'List',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $items['admin/modules/list/confirm'] = array(
+    'title' => 'List',
+    'access arguments' => array('administer modules'),
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+  );
+  $items['admin/modules/uninstall'] = array(
+    'title' => 'Uninstall',
+    'page arguments' => array('system_modules_uninstall'),
+    'access arguments' => array('administer modules'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'system.admin.inc',
+    'weight' => 20,
+  );
+  $items['admin/modules/uninstall/confirm'] = array(
+    'title' => 'Uninstall',
+    'access arguments' => array('administer modules'),
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+    'file' => 'system.admin.inc',
+  );
+
+  // Configuration.
+  $items['admin/config'] = array(
+    'title' => 'Configuration',
+    'description' => 'Administer settings.',
+    'page callback' => 'system_admin_config_page',
+    'access arguments' => array('access administration pages'),
+    'file' => 'system.admin.inc',
+  );
+
+  // IP address blocking.
+  $items['admin/config/people/ip-blocking'] = array(
+    'title' => 'IP address blocking',
+    'description' => 'Manage blocked IP addresses.',
+    'page callback' => 'system_ip_blocking',
+    'access arguments' => array('block IP addresses'),
+    'file' => 'system.admin.inc',
+    'weight' => 10,
+  );
+  $items['admin/config/people/ip-blocking/delete/%blocked_ip'] = array(
+    'title' => 'Delete IP address',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_ip_blocking_delete', 5),
+    'access arguments' => array('block IP addresses'),
+    'file' => 'system.admin.inc',
+  );
+
+  // Media settings.
+  $items['admin/config/media'] = array(
+    'title' => 'Media',
+    'description' => 'Media tools.',
+    'position' => 'left',
+    'weight' => -10,
+    'page callback' => 'system_admin_menu_block_page',
+    'access arguments' => array('access administration pages'),
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/media/file-system'] = array(
+    'title' => 'File system',
+    'description' => 'Tell Drupal where to store uploaded files and how they are accessed.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_file_system_settings'),
+    'access arguments' => array('administer site configuration'),
+    'weight' => -10,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/media/image-toolkit'] = array(
+    'title' => 'Image toolkit',
+    'description' => 'Choose which image toolkit to use if you have installed optional toolkits.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_image_toolkit_settings'),
+    'access arguments' => array('administer site configuration'),
+    'weight' => 20,
+    'file' => 'system.admin.inc',
+  );
+
+  // Service settings.
+  $items['admin/config/services'] = array(
+    'title' => 'Web services',
+    'description' => 'Tools related to web services.',
+    'position' => 'right',
+    'weight' => 0,
+    'page callback' => 'system_admin_menu_block_page',
+    'access arguments' => array('access administration pages'),
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/services/rss-publishing'] = array(
+    'title' => 'RSS publishing',
+    'description' => 'Configure the site description, the number of items per feed and whether feeds should be titles/teasers/full-text.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_rss_feeds_settings'),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'system.admin.inc',
+  );
+
+  // Development settings.
+  $items['admin/config/development'] = array(
+    'title' => 'Development',
+    'description' => 'Development tools.',
+    'position' => 'right',
+    'weight' => -10,
+    'page callback' => 'system_admin_menu_block_page',
+    'access arguments' => array('access administration pages'),
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/development/maintenance'] = array(
+    'title' => 'Maintenance mode',
+    'description' => 'Take the site offline for maintenance or bring it back online.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_site_maintenance_mode'),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'system.admin.inc',
+    'weight' => -10,
+  );
+  $items['admin/config/development/performance'] = array(
+    'title' => 'Performance',
+    'description' => 'Enable or disable page caching for anonymous users and set CSS and JS bandwidth optimization options.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_performance_settings'),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'system.admin.inc',
+    'weight' => -20,
+  );
+  $items['admin/config/development/logging'] = array(
+    'title' => 'Logging and errors',
+    'description' => "Settings for logging and alerts modules. Various modules can route Drupal's system events to different destinations, such as syslog, database, email, etc.",
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_logging_settings'),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'system.admin.inc',
+    'weight' => -15,
+  );
+
+  // Regional and date settings.
+  $items['admin/config/regional'] = array(
+    'title' => 'Regional and language',
+    'description' => 'Regional settings, localization and translation.',
+    'position' => 'left',
+    'weight' => -5,
+    'page callback' => 'system_admin_menu_block_page',
+    'access arguments' => array('access administration pages'),
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/regional/settings'] = array(
+    'title' => 'Regional settings',
+    'description' => "Settings for the site's default time zone and country.",
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_regional_settings'),
+    'access arguments' => array('administer site configuration'),
+    'weight' => -20,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/regional/date-time'] = array(
+    'title' => 'Date and time',
+    'description' => 'Configure display formats for date and time.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_date_time_settings'),
+    'access arguments' => array('administer site configuration'),
+    'weight' => -15,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/regional/date-time/types'] = array(
+    'title' => 'Types',
+    'description' => 'Configure display formats for date and time.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_date_time_settings'),
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/regional/date-time/types/add'] = array(
+    'title' => 'Add date type',
+    'description' => 'Add new date type.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_add_date_format_type_form'),
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_LOCAL_ACTION,
+    'weight' => -10,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/regional/date-time/types/%/delete'] = array(
+    'title' => 'Delete date type',
+    'description' => 'Allow users to delete a configured date type.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_delete_date_format_type_form', 5),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/regional/date-time/formats'] = array(
+    'title' => 'Formats',
+    'description' => 'Configure display format strings for date and time.',
+    'page callback' => 'system_date_time_formats',
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => -9,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/regional/date-time/formats/add'] = array(
+    'title' => 'Add format',
+    'description' => 'Allow users to add additional date formats.',
+    'type' => MENU_LOCAL_ACTION,
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_configure_date_formats_form'),
+    'access arguments' => array('administer site configuration'),
+    'weight' => -10,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/regional/date-time/formats/%/edit'] = array(
+    'title' => 'Edit date format',
+    'description' => 'Allow users to edit a configured date format.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_configure_date_formats_form', 5),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/regional/date-time/formats/%/delete'] = array(
+    'title' => 'Delete date format',
+    'description' => 'Allow users to delete a configured date format.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_date_delete_format_form', 5),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/regional/date-time/formats/lookup'] = array(
+    'title' => 'Date and time lookup',
+    'page callback' => 'system_date_time_lookup',
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_CALLBACK,
+    'file' => 'system.admin.inc',
+  );
+
+  // Search settings.
+  $items['admin/config/search'] = array(
+    'title' => 'Search and metadata',
+    'description' => 'Local site search, metadata and SEO.',
+    'position' => 'left',
+    'weight' => -10,
+    'page callback' => 'system_admin_menu_block_page',
+    'access arguments' => array('access administration pages'),
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/search/clean-urls'] = array(
+    'title' => 'Clean URLs',
+    'description' => 'Enable or disable clean URLs for your site.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_clean_url_settings'),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'system.admin.inc',
+    'weight' => 5,
+  );
+  $items['admin/config/search/clean-urls/check'] = array(
+    'title' => 'Clean URL check',
+    'page callback' => 'drupal_json_output',
+    'page arguments' => array(array('status' => TRUE)),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+    'file' => 'system.admin.inc',
+  );
+
+  // System settings.
+  $items['admin/config/system'] = array(
+    'title' => 'System',
+    'description' => 'General system related configuration.',
+    'position' => 'right',
+    'weight' => -20,
+    'page callback' => 'system_admin_menu_block_page',
+    'access arguments' => array('access administration pages'),
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/system/actions'] = array(
+    'title' => 'Actions',
+    'description' => 'Manage the actions defined for your site.',
+    'access arguments' => array('administer actions'),
+    'page callback' => 'system_actions_manage',
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/system/actions/manage'] = array(
+    'title' => 'Manage actions',
+    'description' => 'Manage the actions defined for your site.',
+    'page callback' => 'system_actions_manage',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -2,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/system/actions/configure'] = array(
+    'title' => 'Configure an advanced action',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_actions_configure'),
+    'access arguments' => array('administer actions'),
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/system/actions/delete/%actions'] = array(
+    'title' => 'Delete action',
+    'description' => 'Delete an action.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_actions_delete_form', 5),
+    'access arguments' => array('administer actions'),
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/system/actions/orphan'] = array(
+    'title' => 'Remove orphans',
+    'page callback' => 'system_actions_remove_orphans',
+    'access arguments' => array('administer actions'),
+    'type' => MENU_CALLBACK,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/system/site-information'] = array(
+    'title' => 'Site information',
+    'description' => 'Change site name, e-mail address, slogan, default front page, and number of posts per page, error pages.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_site_information_settings'),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'system.admin.inc',
+    'weight' => -20,
+  );
+  $items['admin/config/system/cron'] = array(
+    'title' => 'Cron',
+    'description' => 'Manage automatic site maintenance tasks.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_cron_settings'),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'system.admin.inc',
+    'weight' => 20,
+  );
+  // Additional categories
+  $items['admin/config/user-interface'] = array(
+    'title' => 'User interface',
+    'description' => 'Tools that enhance the user interface.',
+    'position' => 'right',
+    'page callback' => 'system_admin_menu_block_page',
+    'access arguments' => array('access administration pages'),
+    'file' => 'system.admin.inc',
+    'weight' => -15,
+  );
+  $items['admin/config/workflow'] = array(
+    'title' => 'Workflow',
+    'description' => 'Content workflow, editorial workflow tools.',
+    'position' => 'right',
+    'weight' => 5,
+    'page callback' => 'system_admin_menu_block_page',
+    'access arguments' => array('access administration pages'),
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/content'] = array(
+    'title' => 'Content authoring',
+    'description' => 'Settings related to formatting and authoring content.',
+    'position' => 'left',
+    'weight' => -15,
+    'page callback' => 'system_admin_menu_block_page',
+    'access arguments' => array('access administration pages'),
+    'file' => 'system.admin.inc',
+  );
+
+  // Reports.
+  $items['admin/reports'] = array(
+    'title' => 'Reports',
+    'description' => 'View reports, updates, and errors.',
+    'page callback' => 'system_admin_menu_block_page',
+    'access arguments' => array('access site reports'),
+    'weight' => 5,
+    'position' => 'left',
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/reports/status'] = array(
+    'title' => 'Status report',
+    'description' => "Get a status report about your site's operation and any detected problems.",
+    'page callback' => 'system_status',
+    'weight' => -60,
+    'access arguments' => array('administer site configuration'),
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/reports/status/run-cron'] = array(
+    'title' => 'Run cron',
+    'page callback' => 'system_run_cron',
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_CALLBACK,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/reports/status/php'] = array(
+    'title' => 'PHP',
+    'page callback' => 'system_php',
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_CALLBACK,
+    'file' => 'system.admin.inc',
+  );
+
+  // Default page for batch operations.
+  $items['batch'] = array(
+    'page callback' => 'system_batch_page',
+    'access callback' => TRUE,
+    'theme callback' => '_system_batch_theme',
+    'type' => MENU_CALLBACK,
+    'file' => 'system.admin.inc',
+  );
+  return $items;
+}
+
+/**
+ * Theme callback for the default batch page.
+ */
+function _system_batch_theme() {
+  // Retrieve the current state of the batch.
+  $batch = &batch_get();
+  if (!$batch && isset($_REQUEST['id'])) {
+    require_once DRUPAL_ROOT . '/includes/batch.inc';
+    $batch = batch_load($_REQUEST['id']);
+  }
+  // Use the same theme as the page that started the batch.
+  if (!empty($batch['theme'])) {
+    return $batch['theme'];
+  }
+}
+
+/**
+ * Implements hook_library().
+ */
+function system_library() {
+  // Drupal's Ajax framework.
+  $libraries['drupal.ajax'] = array(
+    'title' => 'Drupal AJAX',
+    'website' => 'http://api.drupal.org/api/drupal/includes--ajax.inc/group/ajax/7',
+    'version' => VERSION,
+    'js' => array(
+      'misc/ajax.js' => array('group' => JS_LIBRARY, 'weight' => 2),
+    ),
+    'dependencies' => array(
+      array('system', 'drupal.progress'),
+    ),
+  );
+
+  // Drupal's batch API.
+  $libraries['drupal.batch'] = array(
+    'title' => 'Drupal batch API',
+    'version' => VERSION,
+    'js' => array(
+      'misc/batch.js' => array('group' => JS_DEFAULT, 'cache' => FALSE),
+    ),
+    'dependencies' => array(
+      array('system', 'drupal.progress'),
+    ),
+  );
+
+  // Drupal's progress indicator.
+  $libraries['drupal.progress'] = array(
+    'title' => 'Drupal progress indicator',
+    'version' => VERSION,
+    'js' => array(
+      'misc/progress.js' => array('group' => JS_DEFAULT),
+    ),
+  );
+
+  // Drupal's form library.
+  $libraries['drupal.form'] = array(
+    'title' => 'Drupal form library',
+    'version' => VERSION,
+    'js' => array(
+      'misc/form.js' => array('group' => JS_LIBRARY, 'weight' => 1),
+    ),
+  );
+
+  // Drupal's states library.
+  $libraries['drupal.states'] = array(
+    'title' => 'Drupal states',
+    'version' => VERSION,
+    'js' => array(
+      'misc/states.js' => array('group' => JS_LIBRARY, 'weight' => 1),
+    ),
+  );
+
+  // Drupal's collapsible fieldset.
+  $libraries['drupal.collapse'] = array(
+    'title' => 'Drupal collapsible fieldset',
+    'version' => VERSION,
+    'js' => array(
+      'misc/collapse.js' => array('group' => JS_DEFAULT),
+    ),
+    'dependencies' => array(
+      // collapse.js relies on drupalGetSummary in form.js
+      array('system', 'drupal.form'),
+    ),
+  );
+
+  // Drupal's resizable textarea.
+  $libraries['drupal.textarea'] = array(
+    'title' => 'Drupal resizable textarea',
+    'version' => VERSION,
+    'js' => array(
+      'misc/textarea.js' => array('group' => JS_DEFAULT),
+    ),
+  );
+
+  // Drupal's autocomplete widget.
+  $libraries['drupal.autocomplete'] = array(
+    'title' => 'Drupal autocomplete',
+    'version' => VERSION,
+    'js' => array(
+      'misc/autocomplete.js' => array('group' => JS_DEFAULT),
+    ),
+  );
+
+  // jQuery.
+  $libraries['jquery'] = array(
+    'title' => 'jQuery',
+    'website' => 'http://jquery.com',
+    'version' => '1.4.4',
+    'js' => array(
+      'misc/jquery.js' => array('group' => JS_LIBRARY, 'weight' => -20),
+    ),
+  );
+
+  // jQuery Once.
+  $libraries['jquery.once'] = array(
+    'title' => 'jQuery Once',
+    'website' => 'http://plugins.jquery.com/project/once',
+    'version' => '1.2',
+    'js' => array(
+      'misc/jquery.once.js' => array('group' => JS_LIBRARY, 'weight' => -19),
+    ),
+  );
+
+  // jQuery Form Plugin.
+  $libraries['jquery.form'] = array(
+    'title' => 'jQuery Form Plugin',
+    'website' => 'http://malsup.com/jquery/form/',
+    'version' => '2.52',
+    'js' => array(
+      'misc/jquery.form.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'jquery.cookie'),
+    ),
+  );
+
+  // jQuery BBQ plugin.
+  $libraries['jquery.bbq'] = array(
+    'title' => 'jQuery BBQ',
+    'website' => 'http://benalman.com/projects/jquery-bbq-plugin/',
+    'version' => '1.2.1',
+    'js' => array(
+      'misc/jquery.ba-bbq.js' => array(),
+    ),
+  );
+
+  // Vertical Tabs.
+  $libraries['drupal.vertical-tabs'] = array(
+    'title' => 'Vertical Tabs',
+    'website' => 'http://drupal.org/node/323112',
+    'version' => '1.0',
+    'js' => array(
+      'misc/vertical-tabs.js' => array(),
+    ),
+    'css' => array(
+      'misc/vertical-tabs.css' => array(),
+    ),
+    'dependencies' => array(
+      // Vertical tabs relies on drupalGetSummary in form.js
+      array('system', 'drupal.form'),
+    ),
+  );
+
+  // Farbtastic.
+  $libraries['farbtastic'] = array(
+    'title' => 'Farbtastic',
+    'website' => 'http://code.google.com/p/farbtastic/',
+    'version' => '1.2',
+    'js' => array(
+      'misc/farbtastic/farbtastic.js' => array(),
+    ),
+    'css' => array(
+      'misc/farbtastic/farbtastic.css' => array(),
+    ),
+  );
+
+  // Cookie.
+  $libraries['jquery.cookie'] = array(
+    'title' => 'Cookie',
+    'website' => 'http://plugins.jquery.com/project/cookie',
+    'version' => '1.0',
+    'js' => array(
+      'misc/jquery.cookie.js' => array(),
+    ),
+  );
+
+  // jQuery UI.
+  $libraries['ui'] = array(
+    'title' => 'jQuery UI: Core',
+    'website' => 'http://jqueryui.com',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.core.min.js' => array('group' => JS_LIBRARY, 'weight' => -11),
+    ),
+    'css' => array(
+      'misc/ui/jquery.ui.core.css' => array(),
+      'misc/ui/jquery.ui.theme.css' => array(),
+    ),
+  );
+  $libraries['ui.accordion'] = array(
+    'title' => 'jQuery UI: Accordion',
+    'website' => 'http://jqueryui.com/demos/accordion/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.accordion.min.js' => array(),
+    ),
+    'css' => array(
+      'misc/ui/jquery.ui.accordion.css' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui.widget'),
+    ),
+  );
+  $libraries['ui.autocomplete'] = array(
+    'title' => 'jQuery UI: Autocomplete',
+    'website' => 'http://jqueryui.com/demos/autocomplete/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.autocomplete.min.js' => array(),
+    ),
+    'css' => array(
+      'misc/ui/jquery.ui.autocomplete.css' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui.widget'),
+      array('system', 'ui.position'),
+    ),
+  );
+  $libraries['ui.button'] = array(
+    'title' => 'jQuery UI: Button',
+    'website' => 'http://jqueryui.com/demos/button/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.button.min.js' => array(),
+    ),
+    'css' => array(
+      'misc/ui/jquery.ui.button.css' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui.widget'),
+    ),
+  );
+  $libraries['ui.datepicker'] = array(
+    'title' => 'jQuery UI: Date Picker',
+    'website' => 'http://jqueryui.com/demos/datepicker/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.datepicker.min.js' => array(),
+    ),
+    'css' => array(
+      'misc/ui/jquery.ui.datepicker.css' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui'),
+    ),
+  );
+  $libraries['ui.dialog'] = array(
+    'title' => 'jQuery UI: Dialog',
+    'website' => 'http://jqueryui.com/demos/dialog/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.dialog.min.js' => array(),
+    ),
+    'css' => array(
+      'misc/ui/jquery.ui.dialog.css' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui.widget'),
+      array('system', 'ui.button'),
+      array('system', 'ui.draggable'),
+      array('system', 'ui.mouse'),
+      array('system', 'ui.position'),
+      array('system', 'ui.resizable'),
+    ),
+  );
+  $libraries['ui.draggable'] = array(
+    'title' => 'jQuery UI: Draggable',
+    'website' => 'http://jqueryui.com/demos/draggable/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.draggable.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui.widget'),
+      array('system', 'ui.mouse'),
+    ),
+  );
+  $libraries['ui.droppable'] = array(
+    'title' => 'jQuery UI: Droppable',
+    'website' => 'http://jqueryui.com/demos/droppable/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.droppable.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui.widget'),
+      array('system', 'ui.mouse'),
+      array('system', 'ui.draggable'),
+    ),
+  );
+  $libraries['ui.mouse'] = array(
+    'title' => 'jQuery UI: Mouse',
+    'website' => 'http://docs.jquery.com/UI/Mouse',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.mouse.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui.widget'),
+    ),
+  );
+  $libraries['ui.position'] = array(
+    'title' => 'jQuery UI: Position',
+    'website' => 'http://jqueryui.com/demos/position/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.position.min.js' => array(),
+    ),
+  );
+  $libraries['ui.progressbar'] = array(
+    'title' => 'jQuery UI: Progress Bar',
+    'website' => 'http://jqueryui.com/demos/progressbar/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.progressbar.min.js' => array(),
+    ),
+    'css' => array(
+      'misc/ui/jquery.ui.progressbar.css' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui.widget'),
+    ),
+  );
+  $libraries['ui.resizable'] = array(
+    'title' => 'jQuery UI: Resizable',
+    'website' => 'http://jqueryui.com/demos/resizable/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.resizable.min.js' => array(),
+    ),
+    'css' => array(
+      'misc/ui/jquery.ui.resizable.css' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui.widget'),
+      array('system', 'ui.mouse'),
+    ),
+  );
+  $libraries['ui.selectable'] = array(
+    'title' => 'jQuery UI: Selectable',
+    'website' => 'http://jqueryui.com/demos/selectable/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.selectable.min.js' => array(),
+    ),
+    'css' => array(
+      'misc/ui/jquery.ui.selectable.css' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui.widget'),
+      array('system', 'ui.mouse'),
+    ),
+  );
+  $libraries['ui.slider'] = array(
+    'title' => 'jQuery UI: Slider',
+    'website' => 'http://jqueryui.com/demos/slider/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.slider.min.js' => array(),
+    ),
+    'css' => array(
+      'misc/ui/jquery.ui.slider.css' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui.widget'),
+      array('system', 'ui.mouse'),
+    ),
+  );
+  $libraries['ui.sortable'] = array(
+    'title' => 'jQuery UI: Sortable',
+    'website' => 'http://jqueryui.com/demos/sortable/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.sortable.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui.widget'),
+      array('system', 'ui.mouse'),
+    ),
+  );
+  $libraries['ui.tabs'] = array(
+    'title' => 'jQuery UI: Tabs',
+    'website' => 'http://jqueryui.com/demos/tabs/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.tabs.min.js' => array(),
+    ),
+    'css' => array(
+      'misc/ui/jquery.ui.tabs.css' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'ui.widget'),
+    ),
+  );
+  $libraries['ui.widget'] = array(
+    'title' => 'jQuery UI: Widget',
+    'website' => 'http://docs.jquery.com/UI/Widget',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.ui.widget.min.js' => array('group' => JS_LIBRARY, 'weight' => -10),
+    ),
+    'dependencies' => array(
+      array('system', 'ui'),
+    ),
+  );
+  $libraries['effects'] = array(
+    'title' => 'jQuery UI: Effects',
+    'website' => 'http://jqueryui.com/demos/effect/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.effects.core.min.js' => array('group' => JS_LIBRARY, 'weight' => -9),
+    ),
+  );
+  $libraries['effects.blind'] = array(
+    'title' => 'jQuery UI: Effects Blind',
+    'website' => 'http://jqueryui.com/demos/effect/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.effects.blind.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'effects'),
+    ),
+  );
+  $libraries['effects.bounce'] = array(
+    'title' => 'jQuery UI: Effects Bounce',
+    'website' => 'http://jqueryui.com/demos/effect/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.effects.bounce.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'effects'),
+    ),
+  );
+  $libraries['effects.clip'] = array(
+    'title' => 'jQuery UI: Effects Clip',
+    'website' => 'http://jqueryui.com/demos/effect/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.effects.clip.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'effects'),
+    ),
+  );
+  $libraries['effects.drop'] = array(
+    'title' => 'jQuery UI: Effects Drop',
+    'website' => 'http://jqueryui.com/demos/effect/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.effects.drop.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'effects'),
+    ),
+  );
+  $libraries['effects.explode'] = array(
+    'title' => 'jQuery UI: Effects Explode',
+    'website' => 'http://jqueryui.com/demos/effect/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.effects.explode.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'effects'),
+    ),
+  );
+  $libraries['effects.fade'] = array(
+    'title' => 'jQuery UI: Effects Fade',
+    'website' => 'http://jqueryui.com/demos/effect/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.effects.fade.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'effects'),
+    ),
+  );
+  $libraries['effects.fold'] = array(
+    'title' => 'jQuery UI: Effects Fold',
+    'website' => 'http://jqueryui.com/demos/effect/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.effects.fold.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'effects'),
+    ),
+  );
+  $libraries['effects.highlight'] = array(
+    'title' => 'jQuery UI: Effects Highlight',
+    'website' => 'http://jqueryui.com/demos/effect/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.effects.highlight.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'effects'),
+    ),
+  );
+  $libraries['effects.pulsate'] = array(
+    'title' => 'jQuery UI: Effects Pulsate',
+    'website' => 'http://jqueryui.com/demos/effect/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.effects.pulsate.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'effects'),
+    ),
+  );
+  $libraries['effects.scale'] = array(
+    'title' => 'jQuery UI: Effects Scale',
+    'website' => 'http://jqueryui.com/demos/effect/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.effects.scale.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'effects'),
+    ),
+  );
+  $libraries['effects.shake'] = array(
+    'title' => 'jQuery UI: Effects Shake',
+    'website' => 'http://jqueryui.com/demos/effect/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.effects.shake.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'effects'),
+    ),
+  );
+  $libraries['effects.slide'] = array(
+    'title' => 'jQuery UI: Effects Slide',
+    'website' => 'http://jqueryui.com/demos/effect/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.effects.slide.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'effects'),
+    ),
+  );
+  $libraries['effects.transfer'] = array(
+    'title' => 'jQuery UI: Effects Transfer',
+    'website' => 'http://jqueryui.com/demos/effect/',
+    'version' => '1.8.7',
+    'js' => array(
+      'misc/ui/jquery.effects.transfer.min.js' => array(),
+    ),
+    'dependencies' => array(
+      array('system', 'effects'),
+    ),
+  );
+
+  // These library names are deprecated. Earlier versions of Drupal 7 didn't
+  // consistently namespace their libraries, so these names are included for
+  // backwards compatibility with those versions.
+  $libraries['once'] = &$libraries['jquery.once'];
+  $libraries['form'] = &$libraries['jquery.form'];
+  $libraries['jquery-bbq'] = &$libraries['jquery.bbq'];
+  $libraries['vertical-tabs'] = &$libraries['drupal.vertical-tabs'];
+  $libraries['cookie'] = &$libraries['jquery.cookie'];
+
+  return $libraries;
+}
+
+/**
+ * Implements hook_stream_wrappers().
+ */
+function system_stream_wrappers() {
+  $wrappers = array(
+    'public' => array(
+      'name' => t('Public files'),
+      'class' => 'DrupalPublicStreamWrapper',
+      'description' => t('Public local files served by the webserver.'),
+      'type' => STREAM_WRAPPERS_LOCAL_NORMAL,
+    ),
+    'temporary' => array(
+      'name' => t('Temporary files'),
+      'class' => 'DrupalTemporaryStreamWrapper',
+      'description' => t('Temporary local files for upload and previews.'),
+      'type' => STREAM_WRAPPERS_LOCAL_HIDDEN,
+    ),
+  );
+
+  // Only register the private file stream wrapper if a file path has been set.
+  if (variable_get('file_private_path', FALSE)) {
+    $wrappers['private'] = array(
+      'name' => t('Private files'),
+      'class' => 'DrupalPrivateStreamWrapper',
+      'description' => t('Private local files served by Drupal.'),
+      'type' => STREAM_WRAPPERS_LOCAL_NORMAL,
+    );
+  }
+
+  return $wrappers;
+}
+
+/**
+ * Retrieve a blocked IP address from the database.
+ *
+ * @param $iid integer
+ *   The ID of the blocked IP address to retrieve.
+ *
+ * @return
+ *   The blocked IP address from the database as an array.
+ */
+function blocked_ip_load($iid) {
+  return db_query("SELECT * FROM {blocked_ips} WHERE iid = :iid", array(':iid' => $iid))->fetchAssoc();
+}
+
+/**
+ * Menu item access callback - only admin or enabled themes can be accessed.
+ */
+function _system_themes_access($theme) {
+  return user_access('administer themes') && drupal_theme_access($theme);
+}
+
+/**
+ * @defgroup authorize Authorized operations
+ * @{
+ * Functions to run operations with elevated privileges via authorize.php.
+ *
+ * Because of the Update manager functionality included in Drupal core, there
+ * is a mechanism for running operations with elevated file system privileges,
+ * the top-level authorize.php script. This script runs at a reduced Drupal
+ * bootstrap level so that it is not reliant on the entire site being
+ * functional. The operations use a FileTransfer class to manipulate code
+ * installed on the system as the user that owns the files, not the user that
+ * the httpd is running as.
+ *
+ * The first setup is to define a callback function that should be authorized
+ * to run with the elevated privileges. This callback should take a
+ * FileTransfer as its first argument, although you can define an array of
+ * other arguments it should be invoked with. The callback should be placed in
+ * a separate .inc file that will be included by authorize.php.
+ *
+ * To run the operation, certain data must be saved into the SESSION, and then
+ * the flow of control should be redirected to the authorize.php script. There
+ * are two ways to do this, either to call system_authorized_run() directly,
+ * or to call system_authorized_init() and then redirect to authorize.php,
+ * using the URL from system_authorized_get_url(). Redirecting yourself is
+ * necessary when your authorized operation is being triggered by a form
+ * submit handler, since calling drupal_goto() in a submit handler is a bad
+ * idea, and you should instead set $form_state['redirect'].
+ *
+ * Once the SESSION is setup for the operation and the user is redirected to
+ * authorize.php, they will be prompted for their connection credentials (core
+ * provides FTP and SSH by default, although other connection classes can be
+ * added via contributed modules). With valid credentials, authorize.php will
+ * instantiate the appropriate FileTransfer object, and then invoke the
+ * desired operation passing in that object. The authorize.php script can act
+ * as a Batch API processing page, if the operation requires a batch.
+ *
+ * @see authorize.php
+ * @see FileTransfer
+ * @see hook_filetransfer_info()
+ */
+
+/**
+ * Setup a given callback to run via authorize.php with elevated privileges.
+ *
+ * To use authorize.php, certain variables must be stashed into $_SESSION. This
+ * function sets up all the necessary $_SESSION variables. The calling function
+ * should then redirect to authorize.php, using the full path returned by
+ * system_authorized_get_url(). That initiates the workflow that will eventually
+ * lead to the callback being invoked. The callback will be invoked at a low
+ * bootstrap level, without all modules being invoked, so it needs to be careful
+ * not to assume any code exists. Example (system_authorized_run()):
+ * @code
+ *   system_authorized_init($callback, $file, $arguments, $page_title);
+ *   drupal_goto(system_authorized_get_url());
+ * @endcode
+ * Example (update_manager_install_form_submit()):
+ * @code
+ *  system_authorized_init('update_authorize_run_install',
+ *    drupal_get_path('module', 'update') . '/update.authorize.inc',
+ *    $arguments, t('Update manager'));
+ *  $form_state['redirect'] = system_authorized_get_url();
+ * @endcode
+ *
+ * @param $callback
+ *   The name of the function to invoke once the user authorizes the operation.
+ * @param $file
+ *   The full path to the file where the callback function is implemented.
+ * @param $arguments
+ *   Optional array of arguments to pass into the callback when it is invoked.
+ *   Note that the first argument to the callback is always the FileTransfer
+ *   object created by authorize.php when the user authorizes the operation.
+ * @param $page_title
+ *   Optional string to use as the page title once redirected to authorize.php.
+ * @return
+ *   Nothing, this function just initializes variables in the user's session.
+ */
+function system_authorized_init($callback, $file, $arguments = array(), $page_title = NULL) {
+  // First, figure out what file transfer backends the site supports, and put
+  // all of those in the SESSION so that authorize.php has access to all of
+  // them via the class autoloader, even without a full bootstrap.
+  $_SESSION['authorize_filetransfer_info'] = drupal_get_filetransfer_info();
+
+  // Now, define the callback to invoke.
+  $_SESSION['authorize_operation'] = array(
+    'callback' => $callback,
+    'file' => $file,
+    'arguments' => $arguments,
+  );
+
+  if (isset($page_title)) {
+    $_SESSION['authorize_operation']['page_title'] = $page_title;
+  }
+}
+
+/**
+ * Return the URL for the authorize.php script.
+ *
+ * @param array $options
+ *   Optional array of options to pass to url().
+ * @return
+ *   The full URL to authorize.php, using HTTPS if available.
+ *
+ * @see system_authorized_init()
+ */
+function system_authorized_get_url(array $options = array()) {
+  global $base_url;
+  // Force HTTPS if available, regardless of what the caller specifies.
+  $options['https'] = TRUE;
+  // We prefix with $base_url so we get a full path even if clean URLs are
+  // disabled.
+  return url($base_url . '/authorize.php', $options);
+}
+
+/**
+ * Returns the URL for the authorize.php script when it is processing a batch.
+ */
+function system_authorized_batch_processing_url() {
+  return system_authorized_get_url(array('query' => array('batch' => '1')));
+}
+
+/**
+ * Setup and invoke an operation using authorize.php.
+ *
+ * @see system_authorized_init()
+ */
+function system_authorized_run($callback, $file, $arguments = array(), $page_title = NULL) {
+  system_authorized_init($callback, $file, $arguments, $page_title);
+  drupal_goto(system_authorized_get_url());
+}
+
+/**
+ * Use authorize.php to run batch_process().
+ *
+ * @see batch_process()
+ */
+function system_authorized_batch_process() {
+  $finish_url = system_authorized_get_url();
+  $process_url = system_authorized_batch_processing_url();
+  batch_process($finish_url, $process_url);
+}
+
+/**
+ * @} End of "defgroup authorize".
+ */
+
+/**
+ * Implements hook_updater_info().
+ */
+function system_updater_info() {
+  return array(
+    'module' => array(
+      'class' => 'ModuleUpdater',
+      'name' => t('Update modules'),
+      'weight' => 0,
+    ),
+    'theme' => array(
+      'class' => 'ThemeUpdater',
+      'name' => t('Update themes'),
+      'weight' => 0,
+    ),
+  );
+}
+
+/**
+ * Implements hook_filetransfer_info().
+ */
+function system_filetransfer_info() {
+  $backends = array();
+
+  // This is the default, will be available on most systems.
+  if (function_exists('ftp_connect')) {
+    $backends['ftp'] = array(
+      'title' => t('FTP'),
+      'class' => 'FileTransferFTP',
+      'file' => 'ftp.inc',
+      'file path' => 'includes/filetransfer',
+      'weight' => 0,
+    );
+  }
+
+  // SSH2 lib connection is only available if the proper PHP extension is
+  // installed.
+  if (function_exists('ssh2_connect')) {
+    $backends['ssh'] = array(
+      'title' => t('SSH'),
+      'class' => 'FileTransferSSH',
+      'file' => 'ssh.inc',
+      'file path' => 'includes/filetransfer',
+      'weight' => 20,
+    );
+  }
+  return $backends;
+}
+
+/**
+ * Implements hook_init().
+ */
+function system_init() {
+  $path = drupal_get_path('module', 'system');
+  // Add the CSS for this module. These aren't in system.info, because they
+  // need to be in the CSS_SYSTEM group rather than the CSS_DEFAULT group.
+  drupal_add_css($path . '/system.base.css', array('group' => CSS_SYSTEM, 'every_page' => TRUE));
+  if (path_is_admin(current_path())) {
+    drupal_add_css($path . '/system.admin.css', array('group' => CSS_SYSTEM));
+  }
+  drupal_add_css($path . '/system.menus.css', array('group' => CSS_SYSTEM, 'every_page' => TRUE));
+  drupal_add_css($path . '/system.messages.css', array('group' => CSS_SYSTEM, 'every_page' => TRUE));
+  drupal_add_css($path . '/system.theme.css', array('group' => CSS_SYSTEM, 'every_page' => TRUE));
+
+  // Ignore slave database servers for this request.
+  //
+  // In Drupal's distributed database structure, new data is written to the
+  // master and then propagated to the slave servers.  This means there is a
+  // lag between when data is written to the master and when it is available on
+  // the slave. At these times, we will want to avoid using a slave server
+  // temporarily. For example, if a user posts a new node then we want to
+  // disable the slave server for that user temporarily to allow the slave
+  // server to catch up. That way, that user will see their changes immediately
+  // while for other users we still get the benefits of having a slave server,
+  // just with slightly stale data.  Code that wants to disable the slave
+  // server should use the db_ignore_slave() function to set
+  // $_SESSION['ignore_slave_server'] to the timestamp after which the slave
+  // can be re-enabled.
+  if (isset($_SESSION['ignore_slave_server'])) {
+    if ($_SESSION['ignore_slave_server'] >= REQUEST_TIME) {
+      Database::ignoreTarget('default', 'slave');
+    }
+    else {
+      unset($_SESSION['ignore_slave_server']);
+    }
+  }
+
+  // Add CSS/JS files from module .info files.
+  system_add_module_assets();
+}
+
+/**
+ * Adds CSS and JavaScript files declared in module .info files.
+ */
+function system_add_module_assets() {
+  foreach (system_get_info('module') as $module => $info) {
+    if (!empty($info['stylesheets'])) {
+      foreach ($info['stylesheets'] as $media => $stylesheets) {
+        foreach ($stylesheets as $stylesheet) {
+          drupal_add_css($stylesheet, array('every_page' => TRUE, 'media' => $media));
+        }
+      }
+    }
+    if (!empty($info['scripts'])) {
+      foreach ($info['scripts'] as $script) {
+        drupal_add_js($script, array('every_page' => TRUE));
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_custom_theme().
+ */
+function system_custom_theme() {
+  if (user_access('view the administration theme') && path_is_admin(current_path())) {
+    return variable_get('admin_theme');
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function system_form_user_profile_form_alter(&$form, &$form_state) {
+  if ($form['#user_category'] == 'account') {
+    if (variable_get('configurable_timezones', 1)) {
+      system_user_timezone($form, $form_state);
+    }
+    return $form;
+  }
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function system_form_user_register_form_alter(&$form, &$form_state) {
+  if (variable_get('configurable_timezones', 1)) {
+    if (variable_get('user_default_timezone', DRUPAL_USER_TIMEZONE_DEFAULT) == DRUPAL_USER_TIMEZONE_SELECT) {
+      system_user_timezone($form, $form_state);
+    }
+    else {
+      $form['account']['timezone'] = array(
+        '#type' => 'hidden',
+        '#value' => variable_get('user_default_timezone', DRUPAL_USER_TIMEZONE_DEFAULT) ? '' : variable_get('date_default_timezone', ''),
+      );
+    }
+    return $form;
+  }
+}
+
+/**
+ * Implements hook_user_login().
+ */
+function system_user_login(&$edit, $account) {
+  // If the user has a NULL time zone, notify them to set a time zone.
+  if (!$account->timezone && variable_get('configurable_timezones', 1) && variable_get('empty_timezone_message', 0)) {
+    drupal_set_message(t('Configure your <a href="@user-edit">account time zone setting</a>.', array('@user-edit' => url("user/$account->uid/edit", array('query' => drupal_get_destination(), 'fragment' => 'edit-timezone')))));
+  }
+}
+
+/**
+ * Add the time zone field to the user edit and register forms.
+ */
+function system_user_timezone(&$form, &$form_state) {
+  global $user;
+
+  $account = $form['#user'];
+
+  $form['timezone'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Locale settings'),
+    '#weight' => 6,
+    '#collapsible' => TRUE,
+  );
+  $form['timezone']['timezone'] = array(
+    '#type' => 'select',
+    '#title' => t('Time zone'),
+    '#default_value' => isset($account->timezone) ? $account->timezone : ($account->uid == $user->uid ? variable_get('date_default_timezone', '') : ''),
+    '#options' => system_time_zones($account->uid != $user->uid),
+    '#description' => t('Select the desired local time and time zone. Dates and times throughout this site will be displayed using this time zone.'),
+  );
+  if (!isset($account->timezone) && $account->uid == $user->uid && empty($form_state['input']['timezone'])) {
+    $form['timezone']['#description'] = t('Your time zone setting will be automatically detected if possible. Confirm the selection and click save.');
+    $form['timezone']['timezone']['#attributes'] = array('class' => array('timezone-detect'));
+    drupal_add_js('misc/timezone.js');
+  }
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function system_block_info() {
+  $blocks['main'] = array(
+    'info' => t('Main page content'),
+     // Cached elsewhere.
+    'cache' => DRUPAL_NO_CACHE,
+    // Auto-enable in 'content' region by default, which always exists.
+    // @see system_themes_page(), drupal_render_page()
+    'status' => 1,
+    'region' => 'content',
+  );
+  $blocks['powered-by'] = array(
+    'info' => t('Powered by Drupal'),
+    'weight' => '10',
+    'cache' => DRUPAL_NO_CACHE,
+  );
+  $blocks['help'] = array(
+    'info' => t('System help'),
+    'weight' => '5',
+    'cache' => DRUPAL_NO_CACHE,
+    // Auto-enable in 'help' region by default, if the theme defines one.
+    'status' => 1,
+    'region' => 'help',
+  );
+  // System-defined menu blocks.
+  foreach (menu_list_system_menus() as $menu_name => $title) {
+    $blocks[$menu_name]['info'] = t($title);
+    // Menu blocks can't be cached because each menu item can have
+    // a custom access callback. menu.inc manages its own caching.
+    $blocks[$menu_name]['cache'] = DRUPAL_NO_CACHE;
+  }
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_view().
+ *
+ * Generate a block with a promotional link to Drupal.org and
+ * all system menu blocks.
+ */
+function system_block_view($delta = '') {
+  $block = array();
+  switch ($delta) {
+    case 'main':
+      $block['subject'] = NULL;
+      $block['content'] = drupal_set_page_content();
+      return $block;
+    case 'powered-by':
+      $block['subject'] = NULL;
+      $block['content'] = theme('system_powered_by');
+      return $block;
+    case 'help':
+      $block['subject'] = NULL;
+      $block['content'] = menu_get_active_help();
+      return $block;
+    default:
+      // All system menu blocks.
+      $system_menus = menu_list_system_menus();
+      if (isset($system_menus[$delta])) {
+        $block['subject'] = t($system_menus[$delta]);
+        $block['content'] = menu_tree($delta);
+        return $block;
+      }
+      break;
+  }
+}
+
+/**
+ * Implements hook_preprocess_block().
+ */
+function system_preprocess_block(&$variables) {
+  // System menu blocks should get the same class as menu module blocks.
+  if ($variables['block']->module == 'system' && in_array($variables['block']->delta, array_keys(menu_list_system_menus()))) {
+    $variables['classes_array'][] = 'block-menu';
+  }
+}
+
+/**
+ * Provide a single block on the administration overview page.
+ *
+ * @param $item
+ *   The menu item to be displayed.
+ */
+function system_admin_menu_block($item) {
+  $cache = &drupal_static(__FUNCTION__, array());
+  // If we are calling this function for a menu item that corresponds to a
+  // local task (for example, admin/tasks), then we want to retrieve the
+  // parent item's child links, not this item's (since this item won't have
+  // any).
+  if ($item['tab_root'] != $item['path']) {
+    $item = menu_get_item($item['tab_root_href']);
+  }
+
+  if (!isset($item['mlid'])) {
+    $item += db_query("SELECT mlid, menu_name FROM {menu_links} ml WHERE ml.router_path = :path AND module = 'system'", array(':path' => $item['path']))->fetchAssoc();
+  }
+
+  if (isset($cache[$item['mlid']])) {
+    return $cache[$item['mlid']];
+  }
+
+  $content = array();
+  $query = db_select('menu_links', 'ml', array('fetch' => PDO::FETCH_ASSOC));
+  $query->join('menu_router', 'm', 'm.path = ml.router_path');
+  $query
+    ->fields('ml')
+    // Weight should be taken from {menu_links}, not {menu_router}.
+    ->fields('m', array_diff(drupal_schema_fields_sql('menu_router'), array('weight')))
+    ->condition('ml.plid', $item['mlid'])
+    ->condition('ml.menu_name', $item['menu_name'])
+    ->condition('ml.hidden', 0);
+
+  foreach ($query->execute() as $link) {
+    _menu_link_translate($link);
+    if ($link['access']) {
+      // The link description, either derived from 'description' in
+      // hook_menu() or customized via menu module is used as title attribute.
+      if (!empty($link['localized_options']['attributes']['title'])) {
+        $link['description'] = $link['localized_options']['attributes']['title'];
+        unset($link['localized_options']['attributes']['title']);
+      }
+      // Prepare for sorting as in function _menu_tree_check_access().
+      // The weight is offset so it is always positive, with a uniform 5-digits.
+      $key = (50000 + $link['weight']) . ' ' . drupal_strtolower($link['title']) . ' ' . $link['mlid'];
+      $content[$key] = $link;
+    }
+  }
+  ksort($content);
+  $cache[$item['mlid']] = $content;
+  return $content;
+}
+
+/**
+ * Checks the existence of the directory specified in $form_element.
+ *
+ * This function is called from the system_settings form to check all core
+ * file directories (file_public_path, file_private_path, file_temporary_path).
+ *
+ * @param $form_element
+ *   The form element containing the name of the directory to check.
+ */
+function system_check_directory($form_element) {
+  $directory = $form_element['#value'];
+  if (strlen($directory) == 0) {
+    return $form_element;
+  }
+
+  if (!is_dir($directory) && !drupal_mkdir($directory, NULL, TRUE)) {
+    // If the directory does not exists and cannot be created.
+    form_set_error($form_element['#parents'][0], t('The directory %directory does not exist and could not be created.', array('%directory' => $directory)));
+    watchdog('file system', 'The directory %directory does not exist and could not be created.', array('%directory' => $directory), WATCHDOG_ERROR);
+  }
+
+  if (is_dir($directory) && !is_writable($directory) && !drupal_chmod($directory)) {
+    // If the directory is not writable and cannot be made so.
+    form_set_error($form_element['#parents'][0], t('The directory %directory exists but is not writable and could not be made writable.', array('%directory' => $directory)));
+    watchdog('file system', 'The directory %directory exists but is not writable and could not be made writable.', array('%directory' => $directory), WATCHDOG_ERROR);
+  }
+  elseif (is_dir($directory)) {
+    if ($form_element['#name'] == 'file_public_path') {
+      // Create public .htaccess file.
+      file_create_htaccess($directory, FALSE);
+    }
+    else {
+      // Create private .htaccess file.
+      file_create_htaccess($directory);
+    }
+  }
+
+  return $form_element;
+}
+
+/**
+ * Retrieves the current status of an array of files in the system table.
+ *
+ * @param $files
+ *   An array of files to check.
+ * @param $type
+ *   The type of the files.
+ */
+function system_get_files_database(&$files, $type) {
+  // Extract current files from database.
+  $result = db_query("SELECT filename, name, type, status, schema_version, weight FROM {system} WHERE type = :type", array(':type' => $type));
+  foreach ($result as $file) {
+    if (isset($files[$file->name]) && is_object($files[$file->name])) {
+      $file->uri = $file->filename;
+      foreach ($file as $key => $value) {
+        if (!isset($files[$file->name]->$key)) {
+          $files[$file->name]->$key = $value;
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Updates the records in the system table based on the files array.
+ *
+ * @param $files
+ *   An array of files.
+ * @param $type
+ *   The type of the files.
+ */
+function system_update_files_database(&$files, $type) {
+  $result = db_query("SELECT * FROM {system} WHERE type = :type", array(':type' => $type));
+
+  // Add all files that need to be deleted to a DatabaseCondition.
+  $delete = db_or();
+  foreach ($result as $file) {
+    if (isset($files[$file->name]) && is_object($files[$file->name])) {
+      // Keep the old filename from the database in case the file has moved.
+      $old_filename = $file->filename;
+
+      $updated_fields = array();
+
+      // Handle info specially, compare the serialized value.
+      $serialized_info = serialize($files[$file->name]->info);
+      if ($serialized_info != $file->info) {
+        $updated_fields['info'] = $serialized_info;
+      }
+      unset($file->info);
+
+      // Scan remaining fields to find only the updated values.
+      foreach ($file as $key => $value) {
+        if (isset($files[$file->name]->$key) && $files[$file->name]->$key != $value) {
+          $updated_fields[$key] = $files[$file->name]->$key;
+        }
+      }
+
+      // Update the record.
+      if (count($updated_fields)) {
+        db_update('system')
+          ->fields($updated_fields)
+          ->condition('filename', $old_filename)
+          ->execute();
+      }
+
+      // Indicate that the file exists already.
+      $files[$file->name]->exists = TRUE;
+    }
+    else {
+      // File is not found in file system, so delete record from the system table.
+      $delete->condition('filename', $file->filename);
+    }
+  }
+
+  if (count($delete) > 0) {
+    // Delete all missing files from the system table, but only if the plugin
+    // has never been installed.
+    db_delete('system')
+      ->condition($delete)
+      ->condition('schema_version', -1)
+      ->execute();
+  }
+
+  // All remaining files are not in the system table, so we need to add them.
+  $query = db_insert('system')->fields(array('filename', 'name', 'type', 'owner', 'info'));
+  foreach ($files as &$file) {
+    if (isset($file->exists)) {
+      unset($file->exists);
+    }
+    else {
+      $query->values(array(
+        'filename' => $file->uri,
+        'name' => $file->name,
+        'type' => $type,
+        'owner' => isset($file->owner) ? $file->owner : '',
+        'info' => serialize($file->info),
+      ));
+      $file->type = $type;
+      $file->status = 0;
+      $file->schema_version = -1;
+    }
+  }
+  $query->execute();
+
+  // If any module or theme was moved to a new location, we need to reset the
+  // system_list() cache or we will continue to load the old copy, look for
+  // schema updates in the wrong place, etc.
+  system_list_reset();
+}
+
+/**
+ * Returns an array of information about enabled modules or themes.
+ *
+ * This function returns the information from the {system} table corresponding
+ * to the cached contents of the .info file for each active module or theme.
+ *
+ * @param $type
+ *   Either 'module' or 'theme'.
+ * @param $name
+ *   (optional) The name of a module or theme whose information shall be
+ *   returned. If omitted, all records for the provided $type will be returned.
+ *   If $name does not exist in the provided $type or is not enabled, an empty
+ *   array will be returned.
+ *
+ * @return
+ *   An associative array of module or theme information keyed by name, or only
+ *   information for $name, if given. If no records are available, an empty
+ *   array is returned.
+ *
+ * @see system_rebuild_module_data()
+ * @see system_rebuild_theme_data()
+ */
+function system_get_info($type, $name = NULL) {
+  $info = array();
+  if ($type == 'module') {
+    $type = 'module_enabled';
+  }
+  $list = system_list($type);
+  foreach ($list as $shortname => $item) {
+    if (!empty($item->status)) {
+      $info[$shortname] = $item->info;
+    }
+  }
+  if (isset($name)) {
+    return isset($info[$name]) ? $info[$name] : array();
+  }
+  return $info;
+}
+
+/**
+ * Helper function to scan and collect module .info data.
+ *
+ * @return
+ *   An associative array of module information.
+ */
+function _system_rebuild_module_data() {
+  // Find modules
+  $modules = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.module$/', 'modules', 'name', 0);
+
+  // Include the installation profile in modules that are loaded.
+  $profile = drupal_get_profile();
+  $modules[$profile] = new stdClass();
+  $modules[$profile]->name = $profile;
+  $modules[$profile]->uri = 'profiles/' . $profile . '/' . $profile . '.profile';
+  $modules[$profile]->filename = $profile . '.profile';
+
+  // Installation profile hooks are always executed last.
+  $modules[$profile]->weight = 1000;
+
+  // Set defaults for module info.
+  $defaults = array(
+    'dependencies' => array(),
+    'description' => '',
+    'package' => 'Other',
+    'version' => NULL,
+    'php' => DRUPAL_MINIMUM_PHP,
+    'files' => array(),
+    'bootstrap' => 0,
+  );
+
+  // Read info files for each module.
+  foreach ($modules as $key => $module) {
+    // The module system uses the key 'filename' instead of 'uri' so copy the
+    // value so it will be used by the modules system.
+    $modules[$key]->filename = $module->uri;
+
+    // Look for the info file.
+    $module->info = drupal_parse_info_file(dirname($module->uri) . '/' . $module->name . '.info');
+
+    // Skip modules that don't provide info.
+    if (empty($module->info)) {
+      unset($modules[$key]);
+      continue;
+    }
+
+    // Merge in defaults and save.
+    $modules[$key]->info = $module->info + $defaults;
+
+    // Prefix stylesheets and scripts with module path.
+    $path = dirname($module->uri);
+    if (isset($module->info['stylesheets'])) {
+      $module->info['stylesheets'] = _system_info_add_path($module->info['stylesheets'], $path);
+    }
+    if (isset($module->info['scripts'])) {
+      $module->info['scripts'] = _system_info_add_path($module->info['scripts'], $path);
+    }
+
+    // Installation profiles are hidden by default, unless explicitly specified
+    // otherwise in the .info file.
+    if ($key == $profile && !isset($modules[$key]->info['hidden'])) {
+      $modules[$key]->info['hidden'] = TRUE;
+    }
+
+    // Invoke hook_system_info_alter() to give installed modules a chance to
+    // modify the data in the .info files if necessary.
+    $type = 'module';
+    drupal_alter('system_info', $modules[$key]->info, $modules[$key], $type);
+  }
+
+  if (isset($modules[$profile])) {
+    // The installation profile is required, if it's a valid module.
+    $modules[$profile]->info['required'] = TRUE;
+    // Add a default distribution name if the profile did not provide one. This
+    // matches the default value used in install_profile_info().
+    if (!isset($modules[$profile]->info['distribution_name'])) {
+      $modules[$profile]->info['distribution_name'] = 'Drupal';
+    }
+  }
+
+  return $modules;
+}
+
+/**
+ * Rebuild, save, and return data about all currently available modules.
+ *
+ * @return
+ *   Array of all available modules and their data.
+ */
+function system_rebuild_module_data() {
+  $modules_cache = &drupal_static(__FUNCTION__);
+  // Only rebuild once per request. $modules and $modules_cache cannot be
+  // combined into one variable, because the $modules_cache variable is reset by
+  // reference from system_list_reset() during the rebuild.
+  if (!isset($modules_cache)) {
+    $modules = _system_rebuild_module_data();
+    ksort($modules);
+    system_get_files_database($modules, 'module');
+    system_update_files_database($modules, 'module');
+    $modules = _module_build_dependencies($modules);
+    $modules_cache = $modules;
+  }
+  return $modules_cache;
+}
+
+/**
+ * Refresh bootstrap column in the system table.
+ *
+ * This is called internally by module_enable/disable() to flag modules that
+ * implement hooks used during bootstrap, such as hook_boot(). These modules
+ * are loaded earlier to invoke the hooks.
+ */
+function _system_update_bootstrap_status() {
+  $bootstrap_modules = array();
+  foreach (bootstrap_hooks() as $hook) {
+    foreach (module_implements($hook) as $module) {
+      $bootstrap_modules[] = $module;
+    }
+  }
+  $query = db_update('system')->fields(array('bootstrap' => 0));
+  if ($bootstrap_modules) {
+    db_update('system')
+      ->fields(array('bootstrap' => 1))
+      ->condition('name', $bootstrap_modules, 'IN')
+      ->execute();
+    $query->condition('name', $bootstrap_modules, 'NOT IN');
+  }
+  $query->execute();
+  // Reset the cached list of bootstrap modules.
+  system_list_reset();
+}
+
+/**
+ * Helper function to scan and collect theme .info data and their engines.
+ *
+ * @return
+ *   An associative array of themes information.
+ */
+function _system_rebuild_theme_data() {
+  // Find themes
+  $themes = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.info$/', 'themes');
+  // Allow modules to add further themes.
+  if ($module_themes = module_invoke_all('system_theme_info')) {
+    foreach ($module_themes as $name => $uri) {
+      // @see file_scan_directory()
+      $themes[$name] = (object) array(
+        'uri' => $uri,
+        'filename' => pathinfo($uri, PATHINFO_FILENAME),
+        'name' => $name,
+      );
+    }
+  }
+
+  // Find theme engines
+  $engines = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.engine$/', 'themes/engines');
+
+  // Set defaults for theme info.
+  $defaults = array(
+    'engine' => 'phptemplate',
+    'regions' => array(
+      'sidebar_first' => 'Left sidebar',
+      'sidebar_second' => 'Right sidebar',
+      'content' => 'Content',
+      'header' => 'Header',
+      'footer' => 'Footer',
+      'highlighted' => 'Highlighted',
+      'help' => 'Help',
+      'page_top' => 'Page top',
+      'page_bottom' => 'Page bottom',
+    ),
+    'description' => '',
+    'features' => _system_default_theme_features(),
+    'screenshot' => 'screenshot.png',
+    'php' => DRUPAL_MINIMUM_PHP,
+    'stylesheets' => array(),
+    'scripts' => array(),
+  );
+
+  $sub_themes = array();
+  // Read info files for each theme
+  foreach ($themes as $key => $theme) {
+    $themes[$key]->filename = $theme->uri;
+    $themes[$key]->info = drupal_parse_info_file($theme->uri) + $defaults;
+
+    // Invoke hook_system_info_alter() to give installed modules a chance to
+    // modify the data in the .info files if necessary.
+    $type = 'theme';
+    drupal_alter('system_info', $themes[$key]->info, $themes[$key], $type);
+
+    if (!empty($themes[$key]->info['base theme'])) {
+      $sub_themes[] = $key;
+    }
+    if ($themes[$key]->info['engine'] == 'theme') {
+      $filename = dirname($themes[$key]->uri) . '/' . $themes[$key]->name . '.theme';
+      if (file_exists($filename)) {
+        $themes[$key]->owner = $filename;
+        $themes[$key]->prefix = $key;
+      }
+    }
+    else {
+      $engine = $themes[$key]->info['engine'];
+      if (isset($engines[$engine])) {
+        $themes[$key]->owner = $engines[$engine]->uri;
+        $themes[$key]->prefix = $engines[$engine]->name;
+        $themes[$key]->template = TRUE;
+      }
+    }
+
+    // Prefix stylesheets and scripts with module path.
+    $path = dirname($theme->uri);
+    $theme->info['stylesheets'] = _system_info_add_path($theme->info['stylesheets'], $path);
+    $theme->info['scripts'] = _system_info_add_path($theme->info['scripts'], $path);
+
+    // Give the screenshot proper path information.
+    if (!empty($themes[$key]->info['screenshot'])) {
+      $themes[$key]->info['screenshot'] = $path . '/' . $themes[$key]->info['screenshot'];
+    }
+  }
+
+  // Now that we've established all our master themes, go back and fill in data
+  // for subthemes.
+  foreach ($sub_themes as $key) {
+    $themes[$key]->base_themes = drupal_find_base_themes($themes, $key);
+    // Don't proceed if there was a problem with the root base theme.
+    if (!current($themes[$key]->base_themes)) {
+      continue;
+    }
+    $base_key = key($themes[$key]->base_themes);
+    foreach (array_keys($themes[$key]->base_themes) as $base_theme) {
+      $themes[$base_theme]->sub_themes[$key] = $themes[$key]->info['name'];
+    }
+    // Copy the 'owner' and 'engine' over if the top level theme uses a theme
+    // engine.
+    if (isset($themes[$base_key]->owner)) {
+      if (isset($themes[$base_key]->info['engine'])) {
+        $themes[$key]->info['engine'] = $themes[$base_key]->info['engine'];
+        $themes[$key]->owner = $themes[$base_key]->owner;
+        $themes[$key]->prefix = $themes[$base_key]->prefix;
+      }
+      else {
+        $themes[$key]->prefix = $key;
+      }
+    }
+  }
+
+  return $themes;
+}
+
+/**
+ * Rebuild, save, and return data about all currently available themes.
+ *
+ * @return
+ *   Array of all available themes and their data.
+ */
+function system_rebuild_theme_data() {
+  $themes = _system_rebuild_theme_data();
+  ksort($themes);
+  system_get_files_database($themes, 'theme');
+  system_update_files_database($themes, 'theme');
+  return $themes;
+}
+
+/**
+ * Prefixes all values in an .info file array with a given path.
+ *
+ * This helper function is mainly used to prefix all array values of an .info
+ * file property with a single given path (to the module or theme); e.g., to
+ * prefix all values of the 'stylesheets' or 'scripts' properties with the file
+ * path to the defining module/theme.
+ *
+ * @param $info
+ *   A nested array of data of an .info file to be processed.
+ * @param $path
+ *   A file path to prepend to each value in $info.
+ *
+ * @return
+ *   The $info array with prefixed values.
+ *
+ * @see _system_rebuild_module_data()
+ * @see _system_rebuild_theme_data()
+ */
+function _system_info_add_path($info, $path) {
+  foreach ($info as $key => $value) {
+    // Recurse into nested values until we reach the deepest level.
+    if (is_array($value)) {
+      $info[$key] = _system_info_add_path($info[$key], $path);
+    }
+    // Unset the original value's key and set the new value with prefix, using
+    // the original value as key, so original values can still be looked up.
+    else {
+      unset($info[$key]);
+      $info[$value] = $path . '/' . $value;
+    }
+  }
+  return $info;
+}
+
+/**
+ * Returns an array of default theme features.
+ */
+function _system_default_theme_features() {
+  return array(
+    'logo',
+    'favicon',
+    'name',
+    'slogan',
+    'node_user_picture',
+    'comment_user_picture',
+    'comment_user_verification',
+    'main_menu',
+    'secondary_menu',
+  );
+}
+
+/**
+ * Find all the base themes for the specified theme.
+ *
+ * This function has been deprecated in favor of drupal_find_base_themes().
+ */
+function system_find_base_themes($themes, $key, $used_keys = array()) {
+  return drupal_find_base_themes($themes, $key, $used_keys);
+}
+
+/**
+ * Get a list of available regions from a specified theme.
+ *
+ * @param $theme_key
+ *   The name of a theme.
+ * @param $show
+ *   Possible values: REGIONS_ALL or REGIONS_VISIBLE. Visible excludes hidden
+ *   regions.
+ * @return
+ *   An array of regions in the form $region['name'] = 'description'.
+ */
+function system_region_list($theme_key, $show = REGIONS_ALL) {
+  $themes = list_themes();
+  if (!isset($themes[$theme_key])) {
+    return array();
+  }
+
+  $list = array();
+  $info = $themes[$theme_key]->info;
+  // If requested, suppress hidden regions. See block_admin_display_form().
+  foreach ($info['regions'] as $name => $label) {
+    if ($show == REGIONS_ALL || !isset($info['regions_hidden']) || !in_array($name, $info['regions_hidden'])) {
+      $list[$name] = t($label);
+    }
+  }
+
+  return $list;
+}
+
+/**
+ * Implements hook_system_info_alter().
+ */
+function system_system_info_alter(&$info, $file, $type) {
+  // Remove page-top and page-bottom from the blocks UI since they are reserved for
+  // modules to populate from outside the blocks system.
+  if ($type == 'theme') {
+    $info['regions_hidden'][] = 'page_top';
+    $info['regions_hidden'][] = 'page_bottom';
+  }
+}
+
+/**
+ * Get the name of the default region for a given theme.
+ *
+ * @param $theme
+ *   The name of a theme.
+ * @return
+ *   A string that is the region name.
+ */
+function system_default_region($theme) {
+  $regions = array_keys(system_region_list($theme, REGIONS_VISIBLE));
+  return isset($regions[0]) ? $regions[0] : '';
+}
+
+/**
+ * Sets up a form to save information automatically.
+ *
+ * This function adds a submit handler and a submit button to a form array. The
+ * submit function saves all the data in the form, using variable_set(), to
+ * variables named the same as the keys in the form array. Note that this means
+ * you should normally prefix your form array keys with your module name, so
+ * that they are unique when passed into variable_set().
+ *
+ * If you need to manipulate the data in a custom manner, you can either put
+ * your own submission handler in the form array before calling this function,
+ * or just use your own submission handler instead of calling this function.
+ *
+ * @param $form
+ *   An associative array containing the structure of the form.
+ *
+ * @return
+ *   The form structure.
+ *
+ * @see system_settings_form_submit()
+ *
+ * @ingroup forms
+ */
+function system_settings_form($form) {
+  $form['actions']['#type'] = 'actions';
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
+
+  if (!empty($_POST) && form_get_errors()) {
+    drupal_set_message(t('The settings have not been saved because of the errors.'), 'error');
+  }
+  $form['#submit'][] = 'system_settings_form_submit';
+  // By default, render the form using theme_system_settings_form().
+  if (!isset($form['#theme'])) {
+    $form['#theme'] = 'system_settings_form';
+  }
+  return $form;
+}
+
+/**
+ * Form submission handler for system_settings_form().
+ *
+ * If you want node type configure style handling of your checkboxes,
+ * add an array_filter value to your form.
+ */
+function system_settings_form_submit($form, &$form_state) {
+  // Exclude unnecessary elements.
+  form_state_values_clean($form_state);
+
+  foreach ($form_state['values'] as $key => $value) {
+    if (is_array($value) && isset($form_state['values']['array_filter'])) {
+      $value = array_keys(array_filter($value));
+    }
+    variable_set($key, $value);
+  }
+
+  drupal_set_message(t('The configuration options have been saved.'));
+}
+
+/**
+ * Helper function to sort requirements.
+ */
+function _system_sort_requirements($a, $b) {
+  if (!isset($a['weight'])) {
+    if (!isset($b['weight'])) {
+      return strcmp($a['title'], $b['title']);
+    }
+    return -$b['weight'];
+  }
+  return isset($b['weight']) ? $a['weight'] - $b['weight'] : $a['weight'];
+}
+
+/**
+ * Generates a form array for a confirmation form.
+ *
+ * This function returns a complete form array for confirming an action. The
+ * form contains a confirm button as well as a cancellation link that allows a
+ * user to abort the action.
+ *
+ * If the submit handler for a form that implements confirm_form() is invoked,
+ * the user successfully confirmed the action. You should never directly
+ * inspect $_POST to see if an action was confirmed.
+ *
+ * Note - if the parameters $question, $description, $yes, or $no could contain
+ * any user input (such as node titles or taxonomy terms), it is the
+ * responsibility of the code calling confirm_form() to sanitize them first with
+ * a function like check_plain() or filter_xss().
+ *
+ * @param $form
+ *   Additional elements to add to the form. These can be regular form elements,
+ *   #value elements, etc., and their values will be available to the submit
+ *   handler.
+ * @param $question
+ *   The question to ask the user (e.g. "Are you sure you want to delete the
+ *   block <em>foo</em>?"). The page title will be set to this value.
+ * @param $path
+ *   The page to go to if the user cancels the action. This can be either:
+ *   - A string containing a Drupal path.
+ *   - An associative array with a 'path' key. Additional array values are
+ *     passed as the $options parameter to l().
+ *   If the 'destination' query parameter is set in the URL when viewing a
+ *   confirmation form, that value will be used instead of $path.
+ * @param $description
+ *   Additional text to display. Defaults to t('This action cannot be undone.').
+ * @param $yes
+ *   A caption for the button that confirms the action (e.g. "Delete",
+ *   "Replace", ...). Defaults to t('Confirm').
+ * @param $no
+ *   A caption for the link which cancels the action (e.g. "Cancel"). Defaults
+ *   to t('Cancel').
+ * @param $name
+ *   The internal name used to refer to the confirmation item.
+ *
+ * @return
+ *   The form array.
+ */
+function confirm_form($form, $question, $path, $description = NULL, $yes = NULL, $no = NULL, $name = 'confirm') {
+  $description = isset($description) ? $description : t('This action cannot be undone.');
+
+  // Prepare cancel link.
+  if (isset($_GET['destination'])) {
+    $options = drupal_parse_url(urldecode($_GET['destination']));
+  }
+  elseif (is_array($path)) {
+    $options = $path;
+  }
+  else {
+    $options = array('path' => $path);
+  }
+
+  drupal_set_title($question, PASS_THROUGH);
+
+  $form['#attributes']['class'][] = 'confirmation';
+  $form['description'] = array('#markup' => $description);
+  $form[$name] = array('#type' => 'hidden', '#value' => 1);
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => $yes ? $yes : t('Confirm'),
+  );
+  $form['actions']['cancel'] = array(
+    '#type' => 'link',
+    '#title' => $no ? $no : t('Cancel'),
+    '#href' => $options['path'],
+    '#options' => $options,
+  );
+  // By default, render the form using theme_confirm_form().
+  if (!isset($form['#theme'])) {
+    $form['#theme'] = 'confirm_form';
+  }
+  return $form;
+}
+
+/**
+ * Determines whether the current user is in compact mode.
+ *
+ * Compact mode shows certain administration pages with less description text,
+ * such as the configuration page and the permissions page.
+ *
+ * Whether the user is in compact mode is determined by a cookie, which is set
+ * for the user by system_admin_compact_page().
+ *
+ * If the user does not have the cookie, the default value is given by the
+ * system variable 'admin_compact_mode', which itself defaults to FALSE. This
+ * does not have a user interface to set it: it is a hidden variable which can
+ * be set in the settings.php file.
+ *
+ * @return
+ *   TRUE when in compact mode, FALSE when in expanded mode.
+ */
+function system_admin_compact_mode() {
+  // PHP converts dots into underscores in cookie names to avoid problems with
+  // its parser, so we use a converted cookie name.
+  return isset($_COOKIE['Drupal_visitor_admin_compact_mode']) ? $_COOKIE['Drupal_visitor_admin_compact_mode'] : variable_get('admin_compact_mode', FALSE);
+}
+
+/**
+ * Menu callback; Sets whether the admin menu is in compact mode or not.
+ *
+ * @param $mode
+ *   Valid values are 'on' and 'off'.
+ */
+function system_admin_compact_page($mode = 'off') {
+  user_cookie_save(array('admin_compact_mode' => ($mode == 'on')));
+  drupal_goto();
+}
+
+/**
+ * Generate a list of tasks offered by a specified module.
+ *
+ * @param $module
+ *   Module name.
+ * @param $info
+ *   The module's information, as provided by system_get_info().
+ *
+ * @return
+ *   An array of task links.
+ */
+function system_get_module_admin_tasks($module, $info) {
+  $links = &drupal_static(__FUNCTION__);
+
+  if (!isset($links)) {
+    $links = array();
+    $query = db_select('menu_links', 'ml', array('fetch' => PDO::FETCH_ASSOC));
+    $query->join('menu_router', 'm', 'm.path = ml.router_path');
+    $query
+      ->fields('ml')
+      // Weight should be taken from {menu_links}, not {menu_router}.
+      ->fields('m', array_diff(drupal_schema_fields_sql('menu_router'), array('weight')))
+      ->condition('ml.link_path', 'admin/%', 'LIKE')
+      ->condition('ml.hidden', 0, '>=')
+      ->condition('ml.module', 'system')
+      ->condition('m.number_parts', 1, '>')
+      ->condition('m.page_callback', 'system_admin_menu_block_page', '<>');
+    foreach ($query->execute() as $link) {
+      _menu_link_translate($link);
+      if ($link['access']) {
+        $links[$link['router_path']] = $link;
+      }
+    }
+  }
+
+  $admin_tasks = array();
+  $titles = array();
+  if ($menu = module_invoke($module, 'menu')) {
+    foreach ($menu as $path => $item) {
+      if (isset($links[$path])) {
+        $task = $links[$path];
+        // The link description, either derived from 'description' in
+        // hook_menu() or customized via menu module is used as title attribute.
+        if (!empty($task['localized_options']['attributes']['title'])) {
+          $task['description'] = $task['localized_options']['attributes']['title'];
+          unset($task['localized_options']['attributes']['title']);
+        }
+
+        // Check the admin tasks for duplicate names. If one is found,
+        // append the parent menu item's title to differentiate.
+        $duplicate_path = array_search($task['title'], $titles);
+        if ($duplicate_path !== FALSE) {
+          if ($parent = menu_link_load($task['plid'])) {
+            // Append the parent item's title to this task's title.
+            $task['title'] = t('@original_title (@parent_title)', array('@original_title' => $task['title'], '@parent_title' => $parent['title']));
+          }
+          if ($parent = menu_link_load($admin_tasks[$duplicate_path]['plid'])) {
+            // Append the parent item's title to the duplicated task's title.
+            // We use $links[$duplicate_path] in case there are triplicates.
+            $admin_tasks[$duplicate_path]['title'] = t('@original_title (@parent_title)', array('@original_title' => $links[$duplicate_path]['title'], '@parent_title' => $parent['title']));
+          }
+        }
+        else {
+          $titles[$path] = $task['title'];
+        }
+
+        $admin_tasks[$path] = $task;
+      }
+    }
+  }
+
+  // Append link for permissions.
+  if (module_hook($module, 'permission')) {
+    $item = menu_get_item('admin/people/permissions');
+    if (!empty($item['access'])) {
+      $item['link_path'] = $item['href'];
+      $item['title'] = t('Configure @module permissions', array('@module' => $info['name']));
+      unset($item['description']);
+      $item['localized_options']['fragment'] = 'module-' . $module;
+      $admin_tasks["admin/people/permissions#module-$module"] = $item;
+    }
+  }
+
+  return $admin_tasks;
+}
+
+/**
+ * Implements hook_cron().
+ *
+ * Remove older rows from flood and batch table. Remove old temporary files.
+ */
+function system_cron() {
+  // Cleanup the flood.
+  db_delete('flood')
+    ->condition('expiration', REQUEST_TIME, '<')
+    ->execute();
+
+  // Remove temporary files that are older than DRUPAL_MAXIMUM_TEMP_FILE_AGE.
+  // Use separate placeholders for the status to avoid a bug in some versions
+  // of PHP. See http://drupal.org/node/352956.
+  $result = db_query('SELECT fid FROM {file_managed} WHERE status <> :permanent AND timestamp < :timestamp', array(
+    ':permanent' => FILE_STATUS_PERMANENT,
+    ':timestamp' => REQUEST_TIME - DRUPAL_MAXIMUM_TEMP_FILE_AGE
+  ));
+  foreach ($result as $row) {
+    if ($file = file_load($row->fid)) {
+      $references = file_usage_list($file);
+      if (empty($references)) {
+        if (!file_delete($file)) {
+          watchdog('file system', 'Could not delete temporary file "%path" during garbage collection', array('%path' => $file->uri), WATCHDOG_ERROR);
+        }
+      }
+      else {
+        watchdog('file system', 'Did not delete temporary file "%path" during garbage collection, because it is in use by the following modules: %modules.', array('%path' => $file->uri, '%modules' => implode(', ', array_keys($references))), WATCHDOG_INFO);
+      }
+    }
+  }
+
+  $core = array('cache', 'cache_path', 'cache_filter', 'cache_page', 'cache_form', 'cache_menu');
+  $cache_tables = array_merge(module_invoke_all('flush_caches'), $core);
+  foreach ($cache_tables as $table) {
+    cache_clear_all(NULL, $table);
+  }
+
+  // Cleanup the batch table and the queue for failed batches.
+  db_delete('batch')
+    ->condition('timestamp', REQUEST_TIME - 864000, '<')
+    ->execute();
+  db_delete('queue')
+    ->condition('created', REQUEST_TIME - 864000, '<')
+    ->condition('name', 'drupal_batch:%', 'LIKE')
+    ->execute();
+
+  // Reset expired items in the default queue implementation table. If that's
+  // not used, this will simply be a no-op.
+  db_update('queue')
+    ->fields(array(
+      'expire' => 0,
+    ))
+    ->condition('expire', 0, '<>')
+    ->condition('expire', REQUEST_TIME, '<')
+    ->execute();
+}
+
+/**
+ * Implements hook_flush_caches().
+ */
+function system_flush_caches() {
+  // Rebuild list of date formats.
+  system_date_formats_rebuild();
+  // Reset the menu static caches.
+  menu_reset_static_cache();
+}
+
+/**
+ * Implements hook_action_info().
+ */
+function system_action_info() {
+  return array(
+    'system_message_action' => array(
+      'type' => 'system',
+      'label' => t('Display a message to the user'),
+      'configurable' => TRUE,
+      'triggers' => array('any'),
+    ),
+    'system_send_email_action' => array(
+      'type' => 'system',
+      'label' => t('Send e-mail'),
+      'configurable' => TRUE,
+      'triggers' => array('any'),
+    ),
+    'system_block_ip_action' => array(
+      'type' => 'user',
+      'label' => t('Ban IP address of current user'),
+      'configurable' => FALSE,
+      'triggers' => array('any'),
+    ),
+    'system_goto_action' => array(
+      'type' => 'system',
+      'label' => t('Redirect to URL'),
+      'configurable' => TRUE,
+      'triggers' => array('any'),
+    ),
+  );
+}
+
+/**
+ * Return a form definition so the Send email action can be configured.
+ *
+ * @param $context
+ *   Default values (if we are editing an existing action instance).
+ *
+ * @return
+ *   Form definition.
+ *
+ * @see system_send_email_action_validate()
+ * @see system_send_email_action_submit()
+ */
+function system_send_email_action_form($context) {
+  // Set default values for form.
+  if (!isset($context['recipient'])) {
+    $context['recipient'] = '';
+  }
+  if (!isset($context['subject'])) {
+    $context['subject'] = '';
+  }
+  if (!isset($context['message'])) {
+    $context['message'] = '';
+  }
+
+  $form['recipient'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Recipient'),
+    '#default_value' => $context['recipient'],
+    '#maxlength' => '254',
+    '#description' => t('The email address to which the message should be sent OR enter [node:author:mail], [comment:author:mail], etc. if you would like to send an e-mail to the author of the original post.'),
+  );
+  $form['subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#default_value' => $context['subject'],
+    '#maxlength' => '254',
+    '#description' => t('The subject of the message.'),
+  );
+  $form['message'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Message'),
+    '#default_value' => $context['message'],
+    '#cols' => '80',
+    '#rows' => '20',
+    '#description' => t('The message that should be sent. You may include placeholders like [node:title], [user:name], and [comment:body] to represent data that will be different each time message is sent. Not all placeholders will be available in all contexts.'),
+  );
+  return $form;
+}
+
+/**
+ * Validate system_send_email_action form submissions.
+ */
+function system_send_email_action_validate($form, $form_state) {
+  $form_values = $form_state['values'];
+  // Validate the configuration form.
+  if (!valid_email_address($form_values['recipient']) && strpos($form_values['recipient'], ':mail') === FALSE) {
+    // We want the literal %author placeholder to be emphasized in the error message.
+    form_set_error('recipient', t('Enter a valid email address or use a token e-mail address such as %author.', array('%author' => '[node:author:mail]')));
+  }
+}
+
+/**
+ * Process system_send_email_action form submissions.
+ */
+function system_send_email_action_submit($form, $form_state) {
+  $form_values = $form_state['values'];
+  // Process the HTML form to store configuration. The keyed array that
+  // we return will be serialized to the database.
+  $params = array(
+    'recipient' => $form_values['recipient'],
+    'subject'   => $form_values['subject'],
+    'message'   => $form_values['message'],
+  );
+  return $params;
+}
+
+/**
+ * Sends an e-mail message.
+ *
+ * @param object $entity
+ *   An optional node object, which will be added as $context['node'] if
+ *   provided.
+ * @param array $context
+ *   Array with the following elements:
+ *   - 'recipient': E-mail message recipient. This will be passed through
+ *     token_replace().
+ *   - 'subject': The subject of the message. This will be passed through
+ *     token_replace().
+ *   - 'message': The message to send. This will be passed through
+ *     token_replace().
+ *   - Other elements will be used as the data for token replacement.
+ *
+ * @ingroup actions
+ */
+function system_send_email_action($entity, $context) {
+  if (empty($context['node'])) {
+    $context['node'] = $entity;
+  }
+
+  $recipient = token_replace($context['recipient'], $context);
+
+  // If the recipient is a registered user with a language preference, use
+  // the recipient's preferred language. Otherwise, use the system default
+  // language.
+  $recipient_account = user_load_by_mail($recipient);
+  if ($recipient_account) {
+    $language = user_preferred_language($recipient_account);
+  }
+  else {
+    $language = language_default();
+  }
+  $params = array('context' => $context);
+
+  if (drupal_mail('system', 'action_send_email', $recipient, $language, $params)) {
+    watchdog('action', 'Sent email to %recipient', array('%recipient' => $recipient));
+  }
+  else {
+    watchdog('error', 'Unable to send email to %recipient', array('%recipient' => $recipient));
+  }
+}
+
+/**
+ * Implements hook_mail().
+ */
+function system_mail($key, &$message, $params) {
+  $context = $params['context'];
+
+  $subject = token_replace($context['subject'], $context);
+  $body = token_replace($context['message'], $context);
+
+  $message['subject'] .= str_replace(array("\r", "\n"), '', $subject);
+  $message['body'][] = $body;
+}
+
+function system_message_action_form($context) {
+  $form['message'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Message'),
+    '#default_value' => isset($context['message']) ? $context['message'] : '',
+    '#required' => TRUE,
+    '#rows' => '8',
+    '#description' => t('The message to be displayed to the current user. You may include placeholders like [node:title], [user:name], and [comment:body] to represent data that will be different each time message is sent. Not all placeholders will be available in all contexts.'),
+  );
+  return $form;
+}
+
+function system_message_action_submit($form, $form_state) {
+  return array('message' => $form_state['values']['message']);
+}
+
+/**
+ * Sends a message to the current user's screen.
+ *
+ * @param object $entity
+ *   An optional node object, which will be added as $context['node'] if
+ *   provided.
+ * @param array $context
+ *   Array with the following elements:
+ *   - 'message': The message to send. This will be passed through
+ *     token_replace().
+ *   - Other elements will be used as the data for token replacement in
+ *     the message.
+ *
+ * @ingroup actions
+ */
+function system_message_action(&$entity, $context = array()) {
+  if (empty($context['node'])) {
+    $context['node'] = $entity;
+  }
+
+  $context['message'] = token_replace(filter_xss_admin($context['message']), $context);
+  drupal_set_message($context['message']);
+}
+
+/**
+ * Settings form for system_goto_action().
+ */
+function system_goto_action_form($context) {
+  $form['url'] = array(
+    '#type' => 'textfield',
+    '#title' => t('URL'),
+    '#description' => t('The URL to which the user should be redirected. This can be an internal URL like node/1234 or an external URL like http://drupal.org.'),
+    '#default_value' => isset($context['url']) ? $context['url'] : '',
+    '#required' => TRUE,
+  );
+  return $form;
+}
+
+function system_goto_action_submit($form, $form_state) {
+  return array(
+    'url' => $form_state['values']['url']
+  );
+}
+
+/**
+ * Redirects to a different URL.
+ *
+ * @param $entity
+ *   Ignored.
+ * @param array $context
+ *   Array with the following elements:
+ *   - 'url': URL to redirect to. This will be passed through
+ *     token_replace().
+ *   - Other elements will be used as the data for token replacement.
+ *
+ * @ingroup actions
+ */
+function system_goto_action($entity, $context) {
+  drupal_goto(token_replace($context['url'], $context));
+}
+
+/**
+ * Blocks the current user's IP address.
+ *
+ * @ingroup actions
+ */
+function system_block_ip_action() {
+  $ip = ip_address();
+  db_insert('blocked_ips')
+    ->fields(array('ip' => $ip))
+    ->execute();
+  watchdog('action', 'Banned IP address %ip', array('%ip' => $ip));
+}
+
+/**
+ * Generate an array of time zones and their local time&date.
+ *
+ * @param $blank
+ *   If evaluates true, prepend an empty time zone option to the array.
+ */
+function system_time_zones($blank = NULL) {
+  $zonelist = timezone_identifiers_list();
+  $zones = $blank ? array('' => t('- None selected -')) : array();
+  foreach ($zonelist as $zone) {
+    // Because many time zones exist in PHP only for backward compatibility
+    // reasons and should not be used, the list is filtered by a regular
+    // expression.
+    if (preg_match('!^((Africa|America|Antarctica|Arctic|Asia|Atlantic|Australia|Europe|Indian|Pacific)/|UTC$)!', $zone)) {
+      $zones[$zone] = t('@zone: @date', array('@zone' => t(str_replace('_', ' ', $zone)), '@date' => format_date(REQUEST_TIME, 'custom', variable_get('date_format_long', 'l, F j, Y - H:i') . ' O', $zone)));
+    }
+  }
+  // Sort the translated time zones alphabetically.
+  asort($zones);
+  return $zones;
+}
+
+/**
+ * Checks whether the server is capable of issuing HTTP requests.
+ *
+ * The function sets the drupal_http_request_fail system variable to TRUE if
+ * drupal_http_request() does not work and then the system status report page
+ * will contain an error.
+ *
+ * @return
+ *  TRUE if this installation can issue HTTP requests.
+ */
+function system_check_http_request() {
+  // Try to get the content of the front page via drupal_http_request().
+  $result = drupal_http_request(url('', array('absolute' => TRUE)), array('max_redirects' => 0));
+  // We only care that we get a http response - this means that Drupal
+  // can make a http request.
+  $works = isset($result->code) && ($result->code >= 100) && ($result->code < 600);
+  variable_set('drupal_http_request_fails', !$works);
+  return $works;
+}
+
+/**
+ * Menu callback; Retrieve a JSON object containing a suggested time zone name.
+ */
+function system_timezone($abbreviation = '', $offset = -1, $is_daylight_saving_time = NULL) {
+  // An abbreviation of "0" passed in the callback arguments should be
+  // interpreted as the empty string.
+  $abbreviation = $abbreviation ? $abbreviation : '';
+  $timezone = timezone_name_from_abbr($abbreviation, intval($offset), $is_daylight_saving_time);
+  drupal_json_output($timezone);
+}
+
+/**
+ * Returns HTML for the Powered by Drupal text.
+ *
+ * @ingroup themeable
+ */
+function theme_system_powered_by() {
+  return '<span>' . t('Powered by <a href="@poweredby">Drupal</a>', array('@poweredby' => 'http://drupal.org')) . '</span>';
+}
+
+/**
+ * Returns HTML for a link to show or hide inline help descriptions.
+ *
+ * @ingroup themeable
+ */
+function theme_system_compact_link() {
+  $output = '<div class="compact-link">';
+  if (system_admin_compact_mode()) {
+    $output .= l(t('Show descriptions'), 'admin/compact/off', array('attributes' => array('title' => t('Expand layout to include descriptions.')), 'query' => drupal_get_destination()));
+  }
+  else {
+    $output .= l(t('Hide descriptions'), 'admin/compact/on', array('attributes' => array('title' => t('Compress layout by hiding descriptions.')), 'query' => drupal_get_destination()));
+  }
+  $output .= '</div>';
+
+  return $output;
+}
+
+/**
+ * Implements hook_image_toolkits().
+ */
+function system_image_toolkits() {
+  include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'system') . '/' . 'image.gd.inc';
+  return array(
+    'gd' => array(
+      'title' => t('GD2 image manipulation toolkit'),
+      'available' => function_exists('image_gd_check_settings') && image_gd_check_settings(),
+    ),
+  );
+}
+
+/**
+ * Attempts to get a file using drupal_http_request and to store it locally.
+ *
+ * @param $url
+ *   The URL of the file to grab.
+ *
+ * @param $destination
+ *   Stream wrapper URI specifying where the file should be placed. If a
+ *   directory path is provided, the file is saved into that directory under
+ *   its original name. If the path contains a filename as well, that one will
+ *   be used instead.
+ *   If this value is omitted, the site's default files scheme will be used,
+ *   usually "public://".
+ *
+ * @param $managed boolean
+ *   If this is set to TRUE, the file API hooks will be invoked and the file is
+ *   registered in the database.
+ *
+ * @param $replace boolean
+ *   Replace behavior when the destination file already exists:
+ *   - FILE_EXISTS_REPLACE: Replace the existing file.
+ *   - FILE_EXISTS_RENAME: Append _{incrementing number} until the filename is
+ *     unique.
+ *   - FILE_EXISTS_ERROR: Do nothing and return FALSE.
+ *
+ * @return
+ *   On success the location the file was saved to, FALSE on failure.
+ */
+function system_retrieve_file($url, $destination = NULL, $managed = FALSE, $replace = FILE_EXISTS_RENAME) {
+  $parsed_url = parse_url($url);
+  if (!isset($destination)) {
+    $path = file_build_uri(drupal_basename($parsed_url['path']));
+  }
+  else {
+    if (is_dir(drupal_realpath($destination))) {
+      // Prevent URIs with triple slashes when glueing parts together.
+      $path = str_replace('///', '//', "$destination/") . drupal_basename($parsed_url['path']);
+    }
+    else {
+      $path = $destination;
+    }
+  }
+  $result = drupal_http_request($url);
+  if ($result->code != 200) {
+    drupal_set_message(t('HTTP error @errorcode occurred when trying to fetch @remote.', array('@errorcode' => $result->code, '@remote' => $url)), 'error');
+    return FALSE;
+  }
+  $local = $managed ? file_save_data($result->data, $path, $replace) : file_unmanaged_save_data($result->data, $path, $replace);
+  if (!$local) {
+    drupal_set_message(t('@remote could not be saved to @path.', array('@remote' => $url, '@path' => $path)), 'error');
+  }
+
+  return $local;
+}
+
+/**
+ * Implements hook_page_alter().
+ */
+function system_page_alter(&$page) {
+  // Find all non-empty page regions, and add a theme wrapper function that
+  // allows them to be consistently themed.
+  $regions = system_region_list($GLOBALS['theme']);
+  foreach (array_keys($regions) as $region) {
+    if (!empty($page[$region])) {
+      $page[$region]['#theme_wrappers'][] = 'region';
+      $page[$region]['#region'] = $region;
+    }
+  }
+}
+
+/**
+ * Run the automated cron if enabled.
+ */
+function system_run_automated_cron() {
+  // If the site is not fully installed, suppress the automated cron run.
+  // Otherwise it could be triggered prematurely by Ajax requests during
+  // installation.
+  if (($threshold = variable_get('cron_safe_threshold', DRUPAL_CRON_DEFAULT_THRESHOLD)) > 0 && variable_get('install_task') == 'done') {
+    $cron_last = variable_get('cron_last', NULL);
+    if (!isset($cron_last) || (REQUEST_TIME - $cron_last > $threshold)) {
+      drupal_cron_run();
+    }
+  }
+}
+
+/**
+ * Gets the list of available date types and attributes.
+ *
+ * @param $type
+ *   (optional) The date type name.
+ *
+ * @return
+ *   An associative array of date type information keyed by the date type name.
+ *   Each date type information array has the following elements:
+ *   - type: The machine-readable name of the date type.
+ *   - title: The human-readable name of the date type.
+ *   - locked: A boolean indicating whether or not this date type should be
+ *     configurable from the user interface.
+ *   - module: The name of the module that defined this date type in its
+ *     hook_date_format_types(). An empty string if the date type was
+ *     user-defined.
+ *   - is_new: A boolean indicating whether or not this date type is as of yet
+ *     unsaved in the database.
+ *   If $type was defined, only a single associative array with the above
+ *   elements is returned.
+ */
+function system_get_date_types($type = NULL) {
+  $types = &drupal_static(__FUNCTION__);
+
+  if (!isset($types)) {
+    $types = _system_date_format_types_build();
+  }
+
+  return $type ? (isset($types[$type]) ? $types[$type] : FALSE) : $types;
+}
+
+/**
+ * Implements hook_date_format_types().
+ */
+function system_date_format_types() {
+  return array(
+    'long' => t('Long'),
+    'medium' => t('Medium'),
+    'short' => t('Short'),
+  );
+}
+
+/**
+ * Implements hook_date_formats().
+ */
+function system_date_formats() {
+  include_once DRUPAL_ROOT . '/includes/date.inc';
+  return system_default_date_formats();
+}
+
+/**
+ * Gets the list of defined date formats and attributes.
+ *
+ * @param $type
+ *   (optional) The date type name.
+ *
+ * @return
+ *   An associative array of date formats. The top-level keys are the names of
+ *   the date types that the date formats belong to. The values are in turn
+ *   associative arrays keyed by the format string, with the following keys:
+ *   - dfid: The date format ID.
+ *   - format: The format string.
+ *   - type: The machine-readable name of the date type.
+ *   - locales: An array of language codes. This can include both 2 character
+ *     language codes like 'en and 'fr' and 5 character language codes like
+ *     'en-gb' and 'en-us'.
+ *   - locked: A boolean indicating whether or not this date type should be
+ *     configurable from the user interface.
+ *   - module: The name of the module that defined this date format in its
+ *     hook_date_formats(). An empty string if the format was user-defined.
+ *   - is_new: A boolean indicating whether or not this date type is as of yet
+ *     unsaved in the database.
+ *   If $type was defined, only the date formats associated with the given date
+ *   type are returned, in a single associative array keyed by format string.
+ */
+function system_get_date_formats($type = NULL) {
+  $date_formats = &drupal_static(__FUNCTION__);
+
+  if (!isset($date_formats)) {
+    $date_formats = _system_date_formats_build();
+  }
+
+  return $type ? (isset($date_formats[$type]) ? $date_formats[$type] : FALSE) : $date_formats;
+}
+
+/**
+ * Gets the format details for a particular format ID.
+ *
+ * @param $dfid
+ *   A date format ID.
+ *
+ * @return
+ *   A date format object with the following properties:
+ *   - dfid: The date format ID.
+ *   - format: The date format string.
+ *   - type: The name of the date type.
+ *   - locked: Whether the date format can be changed or not.
+ */
+function system_get_date_format($dfid) {
+  return db_query('SELECT df.dfid, df.format, df.type, df.locked FROM {date_formats} df WHERE df.dfid = :dfid', array(':dfid' => $dfid))->fetch();
+}
+
+/**
+ * Resets the database cache of date formats and saves all new date formats.
+ */
+function system_date_formats_rebuild() {
+  drupal_static_reset('system_get_date_formats');
+  $date_formats = system_get_date_formats(NULL);
+
+  foreach ($date_formats as $type => $formats) {
+    foreach ($formats as $format => $info) {
+      system_date_format_save($info);
+    }
+  }
+
+  // Rebuild configured date formats locale list.
+  drupal_static_reset('system_date_format_locale');
+  system_date_format_locale();
+
+  _system_date_formats_build();
+}
+
+/**
+ * Gets the appropriate date format string for a date type and locale.
+ *
+ * @param $langcode
+ *   (optional) Language code for the current locale. This can be a 2 character
+ *   language code like 'en' and 'fr' or a 5 character language code like
+ *   'en-gb' and 'en-us'.
+ * @param $type
+ *   (optional) The date type name.
+ *
+ * @return
+ *   If $type and $langcode are specified, returns the corresponding date format
+ *   string. If only $langcode is specified, returns an array of all date
+ *   format strings for that locale, keyed by the date type. If neither is
+ *   specified, or if no matching formats are found, returns FALSE.
+ */
+function system_date_format_locale($langcode = NULL, $type = NULL) {
+  $formats = &drupal_static(__FUNCTION__);
+
+  if (empty($formats)) {
+    $formats = array();
+    $result = db_query("SELECT format, type, language FROM {date_format_locale}");
+    foreach ($result as $record) {
+      if (!isset($formats[$record->language])) {
+        $formats[$record->language] = array();
+      }
+      $formats[$record->language][$record->type] = $record->format;
+    }
+  }
+
+  if ($type && $langcode && !empty($formats[$langcode][$type])) {
+    return $formats[$langcode][$type];
+  }
+  elseif ($langcode && !empty($formats[$langcode])) {
+    return $formats[$langcode];
+  }
+
+  return FALSE;
+}
+
+/**
+ * Builds and returns information about available date types.
+ *
+ * @return
+ *   An associative array of date type information keyed by name. Each date type
+ *   information array has the following elements:
+ *   - type: The machine-readable name of the date type.
+ *   - title: The human-readable name of the date type.
+ *   - locked: A boolean indicating whether or not this date type should be
+ *     configurable from the user interface.
+ *   - module: The name of the module that defined this format in its
+ *     hook_date_format_types(). An empty string if the format was user-defined.
+ *   - is_new: A boolean indicating whether or not this date type is as of yet
+ *     unsaved in the database.
+ */
+function _system_date_format_types_build() {
+  $types = array();
+
+  // Get list of modules that implement hook_date_format_types().
+  $modules = module_implements('date_format_types');
+
+  foreach ($modules as $module) {
+    $module_types = module_invoke($module, 'date_format_types');
+    foreach ($module_types as $module_type => $type_title) {
+      $type = array();
+      $type['module'] = $module;
+      $type['type'] = $module_type;
+      $type['title'] = $type_title;
+      $type['locked'] = 1;
+      // Will be over-ridden later if in the db.
+      $type['is_new'] = TRUE;
+      $types[$module_type] = $type;
+    }
+  }
+
+  // Get custom formats added to the database by the end user.
+  $result = db_query('SELECT dft.type, dft.title, dft.locked FROM {date_format_type} dft ORDER BY dft.title');
+  foreach ($result as $record) {
+    if (!isset($types[$record->type])) {
+      $type = array();
+      $type['is_new'] = FALSE;
+      $type['module'] = '';
+      $type['type'] = $record->type;
+      $type['title'] = $record->title;
+      $type['locked'] = $record->locked;
+      $types[$record->type] = $type;
+    }
+    else {
+      $type = array();
+      $type['is_new'] = FALSE;  // Over-riding previous setting.
+      $types[$record->type] = array_merge($types[$record->type], $type);
+    }
+  }
+
+  // Allow other modules to modify these date types.
+  drupal_alter('date_format_types', $types);
+
+  return $types;
+}
+
+/**
+ * Builds and returns information about available date formats.
+ *
+ * @return
+ *   An associative array of date formats. The top-level keys are the names of
+ *   the date types that the date formats belong to. The values are in turn
+ *   associative arrays keyed by format with the following keys:
+ *   - dfid: The date format ID.
+ *   - format: The PHP date format string.
+ *   - type: The machine-readable name of the date type the format belongs to.
+ *   - locales: An array of language codes. This can include both 2 character
+ *     language codes like 'en and 'fr' and 5 character language codes like
+ *     'en-gb' and 'en-us'.
+ *   - locked: A boolean indicating whether or not this date type should be
+ *     configurable from the user interface.
+ *   - module: The name of the module that defined this format in its
+ *     hook_date_formats(). An empty string if the format was user-defined.
+ *   - is_new: A boolean indicating whether or not this date type is as of yet
+ *     unsaved in the database.
+ */
+function _system_date_formats_build() {
+  $date_formats = array();
+
+  // First handle hook_date_format_types().
+  $types = _system_date_format_types_build();
+  foreach ($types as $type => $info) {
+    system_date_format_type_save($info);
+  }
+
+  // Get formats supplied by various contrib modules.
+  $module_formats = module_invoke_all('date_formats');
+
+  foreach ($module_formats as $module_format) {
+    // System types are locked.
+    $module_format['locked'] = 1;
+    // If no date type is specified, assign 'custom'.
+    if (!isset($module_format['type'])) {
+      $module_format['type'] = 'custom';
+    }
+    if (!in_array($module_format['type'], array_keys($types))) {
+      continue;
+    }
+    if (!isset($date_formats[$module_format['type']])) {
+      $date_formats[$module_format['type']] = array();
+    }
+
+    // If another module already set this format, merge in the new settings.
+    if (isset($date_formats[$module_format['type']][$module_format['format']])) {
+      $date_formats[$module_format['type']][$module_format['format']] = array_merge_recursive($date_formats[$module_format['type']][$module_format['format']], $module_format);
+    }
+    else {
+      // This setting will be overridden later if it already exists in the db.
+      $module_format['is_new'] = TRUE;
+      $date_formats[$module_format['type']][$module_format['format']] = $module_format;
+    }
+  }
+
+  // Get custom formats added to the database by the end user.
+  $result = db_query('SELECT df.dfid, df.format, df.type, df.locked, dfl.language FROM {date_formats} df LEFT JOIN {date_format_locale} dfl ON df.format = dfl.format AND df.type = dfl.type ORDER BY df.type, df.format');
+  foreach ($result as $record) {
+    // If this date type isn't set, initialise the array.
+    if (!isset($date_formats[$record->type])) {
+      $date_formats[$record->type] = array();
+    }
+    $format = (array) $record;
+    $format['is_new'] = FALSE; // It's in the db, so override this setting.
+    // If this format not already present, add it to the array.
+    if (!isset($date_formats[$record->type][$record->format])) {
+      $format['module'] = '';
+      $format['locales'] = array($record->language);
+      $date_formats[$record->type][$record->format] = $format;
+    }
+    // Format already present, so merge in settings.
+    else {
+      if (!empty($record->language)) {
+        $format['locales'] = array_merge($date_formats[$record->type][$record->format]['locales'], array($record->language));
+      }
+      $date_formats[$record->type][$record->format] = array_merge($date_formats[$record->type][$record->format], $format);
+    }
+  }
+
+  // Allow other modules to modify these formats.
+  drupal_alter('date_formats', $date_formats);
+
+  return $date_formats;
+}
+
+/**
+ * Saves a date type to the database.
+ *
+ * @param $type
+ *   A date type array containing the following keys:
+ *   - type: The machine-readable name of the date type.
+ *   - title: The human-readable name of the date type.
+ *   - locked: A boolean indicating whether or not this date type should be
+ *     configurable from the user interface.
+ *   - is_new: A boolean indicating whether or not this date type is as of yet
+ *     unsaved in the database.
+ */
+function system_date_format_type_save($type) {
+  $info = array();
+  $info['type'] = $type['type'];
+  $info['title'] = $type['title'];
+  $info['locked'] = $type['locked'];
+
+  // Update date_format table.
+  if (!empty($type['is_new'])) {
+    drupal_write_record('date_format_type', $info);
+  }
+  else {
+    drupal_write_record('date_format_type', $info, 'type');
+  }
+}
+
+/**
+ * Deletes a date type from the database.
+ *
+ * @param $type
+ *   The machine-readable name of the date type.
+ */
+function system_date_format_type_delete($type) {
+  db_delete('date_formats')
+    ->condition('type', $type)
+    ->execute();
+  db_delete('date_format_type')
+    ->condition('type', $type)
+    ->execute();
+  db_delete('date_format_locale')
+    ->condition('type', $type)
+    ->execute();
+}
+
+/**
+ * Saves a date format to the database.
+ *
+ * @param $date_format
+ *   A date format array containing the following keys:
+ *   - type: The name of the date type this format is associated with.
+ *   - format: The PHP date format string.
+ *   - locked: A boolean indicating whether or not this format should be
+ *     configurable from the user interface.
+ * @param $dfid
+ *   If set, replace the existing date format having this ID with the
+ *   information specified in $date_format.
+ *
+ * @see system_get_date_types()
+ * @see http://php.net/date
+ */
+function system_date_format_save($date_format, $dfid = 0) {
+  $info = array();
+  $info['dfid'] = $dfid;
+  $info['type'] = $date_format['type'];
+  $info['format'] = $date_format['format'];
+  $info['locked'] = $date_format['locked'];
+
+  // Update date_format table.
+  if (!empty($date_format['is_new'])) {
+    drupal_write_record('date_formats', $info);
+  }
+  else {
+    $keys = ($dfid ? array('dfid') : array('format', 'type'));
+    drupal_write_record('date_formats', $info, $keys);
+  }
+
+  // Retrieve an array of language objects for enabled languages.
+  $languages = language_list('enabled');
+  // This list is keyed off the value of $language->enabled; we want the ones
+  // that are enabled (value of 1).
+  $languages = $languages[1];
+
+  $locale_format = array();
+  $locale_format['type'] = $date_format['type'];
+  $locale_format['format'] = $date_format['format'];
+
+  // Check if the suggested language codes are configured and enabled.
+  if (!empty($date_format['locales'])) {
+    foreach ($date_format['locales'] as $langcode) {
+      // Only proceed if language is enabled.
+      if (isset($languages[$langcode])) {
+        $is_existing = (bool) db_query_range('SELECT 1 FROM {date_format_locale} WHERE type = :type AND language = :language', 0, 1, array(':type' => $date_format['type'], ':language' => $langcode))->fetchField();
+        if (!$is_existing) {
+          $locale_format['language'] = $langcode;
+          drupal_write_record('date_format_locale', $locale_format);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Deletes a date format from the database.
+ *
+ * @param $dfid
+ *   The date format ID.
+ */
+function system_date_format_delete($dfid) {
+  db_delete('date_formats')
+    ->condition('dfid', $dfid)
+    ->execute();
+}
+
+/**
+ * Implements hook_archiver_info().
+ */
+function system_archiver_info() {
+  $archivers['tar'] = array(
+    'class' => 'ArchiverTar',
+    'extensions' => array('tar', 'tgz', 'tar.gz', 'tar.bz2'),
+  );
+  if (function_exists('zip_open')) {
+    $archivers['zip'] = array(
+      'class' => 'ArchiverZip',
+      'extensions' => array('zip'),
+    );
+  }
+  return $archivers;
+}
+
+/**
+ * Returns HTML for a confirmation form.
+ *
+ * By default this does not alter the appearance of a form at all,
+ * but is provided as a convenience for themers.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_confirm_form($variables) {
+  return drupal_render_children($variables['form']);
+}
+
+/**
+ * Returns HTML for a system settings form.
+ *
+ * By default this does not alter the appearance of a form at all,
+ * but is provided as a convenience for themers.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_system_settings_form($variables) {
+  return drupal_render_children($variables['form']);
+}
+
+/**
+ * Returns HTML for an exposed filter form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: An associative array containing the structure of the form.
+ *
+ * @return
+ *   A string containing an HTML-formatted form.
+ *
+ * @ingroup themeable
+ */
+function theme_exposed_filters($variables) {
+  $form = $variables['form'];
+  $output = '';
+
+  if (isset($form['current'])) {
+    $items = array();
+    foreach (element_children($form['current']) as $key) {
+      $items[] = drupal_render($form['current'][$key]);
+    }
+    $output .= theme('item_list', array('items' => $items, 'attributes' => array('class' => array('clearfix', 'current-filters'))));
+  }
+
+  $output .= drupal_render_children($form);
+
+  return '<div class="exposed-filters">' . $output . '</div>';
+}
+
+/**
+ * Implements hook_admin_paths().
+ */
+function system_admin_paths() {
+  $paths = array(
+    'admin' => TRUE,
+    'admin/*' => TRUE,
+    'batch' => TRUE,
+    // This page should not be treated as administrative since it outputs its
+    // own content (outside of any administration theme).
+    'admin/reports/status/php' => FALSE,
+  );
+  return $paths;
+}
diff --git a/htmltest/modules/system/system.queue.inc b/htmltest/modules/system/system.queue.inc
new file mode 100644
index 00000000..901c4d6d
--- /dev/null
+++ b/htmltest/modules/system/system.queue.inc
@@ -0,0 +1,370 @@
+<?php
+
+/**
+ * @file
+ * Queue functionality.
+ */
+
+/**
+ * @defgroup queue Queue operations
+ * @{
+ * Queue items to allow later processing.
+ *
+ * The queue system allows placing items in a queue and processing them later.
+ * The system tries to ensure that only one consumer can process an item.
+ *
+ * Before a queue can be used it needs to be created by
+ * DrupalQueueInterface::createQueue().
+ *
+ * Items can be added to the queue by passing an arbitrary data object to
+ * DrupalQueueInterface::createItem().
+ *
+ * To process an item, call DrupalQueueInterface::claimItem() and specify how
+ * long you want to have a lease for working on that item. When finished
+ * processing, the item needs to be deleted by calling
+ * DrupalQueueInterface::deleteItem(). If the consumer dies, the item will be
+ * made available again by the DrupalQueueInterface implementation once the
+ * lease expires. Another consumer will then be able to receive it when calling
+ * DrupalQueueInterface::claimItem(). Due to this, the processing code should
+ * be aware that an item might be handed over for processing more than once.
+ *
+ * The $item object used by the DrupalQueueInterface can contain arbitrary
+ * metadata depending on the implementation. Systems using the interface should
+ * only rely on the data property which will contain the information passed to
+ * DrupalQueueInterface::createItem(). The full queue item returned by
+ * DrupalQueueInterface::claimItem() needs to be passed to
+ * DrupalQueueInterface::deleteItem() once processing is completed.
+ *
+ * There are two kinds of queue backends available: reliable, which preserves
+ * the order of messages and guarantees that every item will be executed at
+ * least once. The non-reliable kind only does a best effort to preserve order
+ * in messages and to execute them at least once but there is a small chance
+ * that some items get lost. For example, some distributed back-ends like
+ * Amazon SQS will be managing jobs for a large set of producers and consumers
+ * where a strict FIFO ordering will likely not be preserved. Another example
+ * would be an in-memory queue backend which might lose items if it crashes.
+ * However, such a backend would be able to deal with significantly more writes
+ * than a reliable queue and for many tasks this is more important. See
+ * aggregator_cron() for an example of how to effectively utilize a
+ * non-reliable queue. Another example is doing Twitter statistics -- the small
+ * possibility of losing a few items is insignificant next to power of the
+ * queue being able to keep up with writes. As described in the processing
+ * section, regardless of the queue being reliable or not, the processing code
+ * should be aware that an item might be handed over for processing more than
+ * once (because the processing code might time out before it finishes).
+ */
+
+/**
+ * Factory class for interacting with queues.
+ */
+class DrupalQueue {
+  /**
+   * Returns the queue object for a given name.
+   *
+   * The following variables can be set by variable_set or $conf overrides:
+   * - queue_class_$name: the class to be used for the queue $name.
+   * - queue_default_class: the class to use when queue_class_$name is not
+   *   defined. Defaults to SystemQueue, a reliable backend using SQL.
+   * - queue_default_reliable_class: the class to use when queue_class_$name is
+   *   not defined and the queue_default_class is not reliable. Defaults to
+   *   SystemQueue.
+   *
+   * @param $name
+   *   Arbitrary string. The name of the queue to work with.
+   * @param $reliable
+   *   TRUE if the ordering of items and guaranteeing every item executes at
+   *   least once is important, FALSE if scalability is the main concern.
+   *
+   * @return
+   *   The queue object for a given name.
+   */
+  public static function get($name, $reliable = FALSE) {
+    static $queues;
+    if (!isset($queues[$name])) {
+      $class = variable_get('queue_class_' . $name, NULL);
+      if (!$class) {
+        $class = variable_get('queue_default_class', 'SystemQueue');
+      }
+      $object = new $class($name);
+      if ($reliable && !$object instanceof DrupalReliableQueueInterface) {
+        $class = variable_get('queue_default_reliable_class', 'SystemQueue');
+        $object = new $class($name);
+      }
+      $queues[$name] = $object;
+    }
+    return $queues[$name];
+  }
+}
+
+interface DrupalQueueInterface {
+
+  /**
+   * Add a queue item and store it directly to the queue.
+   *
+   * @param $data
+   *   Arbitrary data to be associated with the new task in the queue.
+   * @return
+   *   TRUE if the item was successfully created and was (best effort) added
+   *   to the queue, otherwise FALSE. We don't guarantee the item was
+   *   committed to disk etc, but as far as we know, the item is now in the
+   *   queue.
+   */
+  public function createItem($data);
+
+  /**
+   * Retrieve the number of items in the queue.
+   *
+   * This is intended to provide a "best guess" count of the number of items in
+   * the queue. Depending on the implementation and the setup, the accuracy of
+   * the results of this function may vary.
+   *
+   * e.g. On a busy system with a large number of consumers and items, the
+   * result might only be valid for a fraction of a second and not provide an
+   * accurate representation.
+   *
+   * @return
+   *   An integer estimate of the number of items in the queue.
+   */
+  public function numberOfItems();
+
+  /**
+   * Claim an item in the queue for processing.
+   *
+   * @param $lease_time
+   *   How long the processing is expected to take in seconds, defaults to an
+   *   hour. After this lease expires, the item will be reset and another
+   *   consumer can claim the item. For idempotent tasks (which can be run
+   *   multiple times without side effects), shorter lease times would result
+   *   in lower latency in case a consumer fails. For tasks that should not be
+   *   run more than once (non-idempotent), a larger lease time will make it
+   *   more rare for a given task to run multiple times in cases of failure,
+   *   at the cost of higher latency.
+   * @return
+   *   On success we return an item object. If the queue is unable to claim an
+   *   item it returns false. This implies a best effort to retrieve an item
+   *   and either the queue is empty or there is some other non-recoverable
+   *   problem.
+   */
+  public function claimItem($lease_time = 3600);
+
+  /**
+   * Delete a finished item from the queue.
+   *
+   * @param $item
+   *   The item returned by DrupalQueueInterface::claimItem().
+   */
+  public function deleteItem($item);
+
+  /**
+   * Release an item that the worker could not process, so another
+   * worker can come in and process it before the timeout expires.
+   *
+   * @param $item
+   * @return boolean
+   */
+  public function releaseItem($item);
+
+  /**
+   * Create a queue.
+   *
+   * Called during installation and should be used to perform any necessary
+   * initialization operations. This should not be confused with the
+   * constructor for these objects, which is called every time an object is
+   * instantiated to operate on a queue. This operation is only needed the
+   * first time a given queue is going to be initialized (for example, to make
+   * a new database table or directory to hold tasks for the queue -- it
+   * depends on the queue implementation if this is necessary at all).
+   */
+  public function createQueue();
+
+  /**
+   * Delete a queue and every item in the queue.
+   */
+  public function deleteQueue();
+}
+
+/**
+ * Reliable queue interface.
+ *
+ * Classes implementing this interface preserve the order of messages and
+ * guarantee that every item will be executed at least once.
+ */
+interface DrupalReliableQueueInterface extends DrupalQueueInterface {
+}
+
+/**
+ * Default queue implementation.
+ */
+class SystemQueue implements DrupalReliableQueueInterface {
+  /**
+   * The name of the queue this instance is working with.
+   *
+   * @var string
+   */
+  protected $name;
+
+  public function __construct($name) {
+    $this->name = $name;
+  }
+
+  public function createItem($data) {
+    // During a Drupal 6.x to 7.x update, drupal_get_schema() does not contain
+    // the queue table yet, so we cannot rely on drupal_write_record().
+    $query = db_insert('queue')
+      ->fields(array(
+        'name' => $this->name,
+        'data' => serialize($data),
+        // We cannot rely on REQUEST_TIME because many items might be created
+        // by a single request which takes longer than 1 second.
+        'created' => time(),
+      ));
+    return (bool) $query->execute();
+  }
+
+  public function numberOfItems() {
+    return db_query('SELECT COUNT(item_id) FROM {queue} WHERE name = :name', array(':name' => $this->name))->fetchField();
+  }
+
+  public function claimItem($lease_time = 30) {
+    // Claim an item by updating its expire fields. If claim is not successful
+    // another thread may have claimed the item in the meantime. Therefore loop
+    // until an item is successfully claimed or we are reasonably sure there
+    // are no unclaimed items left.
+    while (TRUE) {
+      $item = db_query_range('SELECT data, item_id FROM {queue} q WHERE expire = 0 AND name = :name ORDER BY created ASC', 0, 1, array(':name' => $this->name))->fetchObject();
+      if ($item) {
+        // Try to update the item. Only one thread can succeed in UPDATEing the
+        // same row. We cannot rely on REQUEST_TIME because items might be
+        // claimed by a single consumer which runs longer than 1 second. If we
+        // continue to use REQUEST_TIME instead of the current time(), we steal
+        // time from the lease, and will tend to reset items before the lease
+        // should really expire.
+        $update = db_update('queue')
+          ->fields(array(
+            'expire' => time() + $lease_time,
+          ))
+          ->condition('item_id', $item->item_id)
+          ->condition('expire', 0);
+        // If there are affected rows, this update succeeded.
+        if ($update->execute()) {
+          $item->data = unserialize($item->data);
+          return $item;
+        }
+      }
+      else {
+        // No items currently available to claim.
+        return FALSE;
+      }
+    }
+  }
+
+  public function releaseItem($item) {
+    $update = db_update('queue')
+      ->fields(array(
+        'expire' => 0,
+      ))
+      ->condition('item_id', $item->item_id);
+      return $update->execute();
+  }
+
+  public function deleteItem($item) {
+    db_delete('queue')
+      ->condition('item_id', $item->item_id)
+      ->execute();
+  }
+
+  public function createQueue() {
+    // All tasks are stored in a single database table (which is created when
+    // Drupal is first installed) so there is nothing we need to do to create
+    // a new queue.
+  }
+
+  public function deleteQueue() {
+    db_delete('queue')
+      ->condition('name', $this->name)
+      ->execute();
+  }
+}
+
+/**
+ * Static queue implementation.
+ *
+ * This allows "undelayed" variants of processes relying on the Queue
+ * interface. The queue data resides in memory. It should only be used for
+ * items that will be queued and dequeued within a given page request.
+ */
+class MemoryQueue implements DrupalQueueInterface {
+  /**
+   * The queue data.
+   *
+   * @var array
+   */
+  protected $queue;
+
+  /**
+   * Counter for item ids.
+   *
+   * @var int
+   */
+  protected $id_sequence;
+
+  /**
+   * Start working with a queue.
+   *
+   * @param $name
+   *   Arbitrary string. The name of the queue to work with.
+   */
+  public function __construct($name) {
+    $this->queue = array();
+    $this->id_sequence = 0;
+  }
+
+  public function createItem($data) {
+    $item = new stdClass();
+    $item->item_id = $this->id_sequence++;
+    $item->data = $data;
+    $item->created = time();
+    $item->expire = 0;
+    $this->queue[$item->item_id] = $item;
+  }
+
+  public function numberOfItems() {
+    return count($this->queue);
+  }
+
+  public function claimItem($lease_time = 30) {
+    foreach ($this->queue as $key => $item) {
+      if ($item->expire == 0) {
+        $item->expire = time() + $lease_time;
+        $this->queue[$key] = $item;
+        return $item;
+      }
+    }
+    return FALSE;
+  }
+
+  public function deleteItem($item) {
+    unset($this->queue[$item->item_id]);
+  }
+
+  public function releaseItem($item) {
+    if (isset($this->queue[$item->item_id]) && $this->queue[$item->item_id]->expire != 0) {
+      $this->queue[$item->item_id]->expire = 0;
+      return TRUE;
+    }
+    return FALSE;
+  }
+
+  public function createQueue() {
+    // Nothing needed here.
+  }
+
+  public function deleteQueue() {
+    $this->queue = array();
+    $this->id_sequence = 0;
+  }
+}
+
+/**
+ * @} End of "defgroup queue".
+ */
diff --git a/htmltest/modules/system/system.tar.inc b/htmltest/modules/system/system.tar.inc
new file mode 100644
index 00000000..32bf7f06
--- /dev/null
+++ b/htmltest/modules/system/system.tar.inc
@@ -0,0 +1,1892 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * File::CSV
+ *
+ * PHP versions 4 and 5
+ *
+ * Copyright (c) 1997-2008,
+ * Vincent Blavet <vincent@phpconcept.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ * @category    File_Formats
+ * @package     Archive_Tar
+ * @author      Vincent Blavet <vincent@phpconcept.net>
+ * @copyright   1997-2008 The Authors
+ * @license     http://www.opensource.org/licenses/bsd-license.php New BSD License
+ * @version     CVS: Id: Tar.php,v 1.43 2008/10/30 17:58:42 dufuz Exp
+ * @link        http://pear.php.net/package/Archive_Tar
+ */
+
+//require_once 'PEAR.php';
+//
+//
+define ('ARCHIVE_TAR_ATT_SEPARATOR', 90001);
+define ('ARCHIVE_TAR_END_BLOCK', pack("a512", ''));
+
+/**
+* Creates a (compressed) Tar archive
+*
+* @author   Vincent Blavet <vincent@phpconcept.net>
+* @version  Revision: 1.43
+* @license  http://www.opensource.org/licenses/bsd-license.php New BSD License
+* @package  Archive_Tar
+*/
+class Archive_Tar // extends PEAR
+{
+    /**
+    * @var string Name of the Tar
+    */
+    var $_tarname='';
+
+    /**
+    * @var boolean if true, the Tar file will be gzipped
+    */
+    var $_compress=false;
+
+    /**
+    * @var string Type of compression : 'none', 'gz' or 'bz2'
+    */
+    var $_compress_type='none';
+
+    /**
+    * @var string Explode separator
+    */
+    var $_separator=' ';
+
+    /**
+    * @var file descriptor
+    */
+    var $_file=0;
+
+    /**
+    * @var string Local Tar name of a remote Tar (http:// or ftp://)
+    */
+    var $_temp_tarname='';
+
+    // {{{ constructor
+    /**
+    * Archive_Tar Class constructor. This flavour of the constructor only
+    * declare a new Archive_Tar object, identifying it by the name of the
+    * tar file.
+    * If the compress argument is set the tar will be read or created as a
+    * gzip or bz2 compressed TAR file.
+    *
+    * @param    string  $p_tarname  The name of the tar archive to create
+    * @param    string  $p_compress can be null, 'gz' or 'bz2'. This
+    *                   parameter indicates if gzip or bz2 compression
+    *                   is required.  For compatibility reason the
+    *                   boolean value 'true' means 'gz'.
+    * @access public
+    */
+//    function Archive_Tar($p_tarname, $p_compress = null)
+    function __construct($p_tarname, $p_compress = null)
+    {
+//        $this->PEAR();
+        $this->_compress = false;
+        $this->_compress_type = 'none';
+        if (($p_compress === null) || ($p_compress == '')) {
+            if (@file_exists($p_tarname)) {
+                if ($fp = @fopen($p_tarname, "rb")) {
+                    // look for gzip magic cookie
+                    $data = fread($fp, 2);
+                    fclose($fp);
+                    if ($data == "\37\213") {
+                        $this->_compress = true;
+                        $this->_compress_type = 'gz';
+                    // No sure it's enought for a magic code ....
+                    } elseif ($data == "BZ") {
+                        $this->_compress = true;
+                        $this->_compress_type = 'bz2';
+                    }
+                }
+            } else {
+                // probably a remote file or some file accessible
+                // through a stream interface
+                if (substr($p_tarname, -2) == 'gz') {
+                    $this->_compress = true;
+                    $this->_compress_type = 'gz';
+                } elseif ((substr($p_tarname, -3) == 'bz2') ||
+                          (substr($p_tarname, -2) == 'bz')) {
+                    $this->_compress = true;
+                    $this->_compress_type = 'bz2';
+                }
+            }
+        } else {
+            if (($p_compress === true) || ($p_compress == 'gz')) {
+                $this->_compress = true;
+                $this->_compress_type = 'gz';
+            } else if ($p_compress == 'bz2') {
+                $this->_compress = true;
+                $this->_compress_type = 'bz2';
+            } else {
+                die("Unsupported compression type '$p_compress'\n".
+                    "Supported types are 'gz' and 'bz2'.\n");
+                return false;
+            }
+        }
+        $this->_tarname = $p_tarname;
+        if ($this->_compress) { // assert zlib or bz2 extension support
+            if ($this->_compress_type == 'gz')
+                $extname = 'zlib';
+            else if ($this->_compress_type == 'bz2')
+                $extname = 'bz2';
+
+            if (!extension_loaded($extname)) {
+//                PEAR::loadExtension($extname);
+                $this->loadExtension($extname);
+            }
+            if (!extension_loaded($extname)) {
+                die("The extension '$extname' couldn't be found.\n".
+                    "Please make sure your version of PHP was built ".
+                    "with '$extname' support.\n");
+                return false;
+            }
+        }
+    }
+    // }}}
+
+    /**
+    * OS independent PHP extension load. Remember to take care
+    * on the correct extension name for case sensitive OSes.
+    * The function is the copy of PEAR::loadExtension().
+    *
+    * @param string $ext The extension name
+    * @return bool Success or not on the dl() call
+    */
+    function loadExtension($ext)
+    {
+        if (!extension_loaded($ext)) {
+            // if either returns true dl() will produce a FATAL error, stop that
+            if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) {
+                return false;
+            }
+
+            if (OS_WINDOWS) {
+                $suffix = '.dll';
+            } elseif (PHP_OS == 'HP-UX') {
+                $suffix = '.sl';
+            } elseif (PHP_OS == 'AIX') {
+                $suffix = '.a';
+            } elseif (PHP_OS == 'OSX') {
+                $suffix = '.bundle';
+            } else {
+                $suffix = '.so';
+            }
+
+            return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix);
+        }
+
+        return true;
+    }
+
+
+    // {{{ destructor
+//    function _Archive_Tar()
+    function __destruct()
+    {
+        $this->_close();
+        // ----- Look for a local copy to delete
+        if ($this->_temp_tarname != '')
+            @drupal_unlink($this->_temp_tarname);
+//        $this->_PEAR();
+    }
+    // }}}
+
+    // {{{ create()
+    /**
+    * This method creates the archive file and add the files / directories
+    * that are listed in $p_filelist.
+    * If a file with the same name exist and is writable, it is replaced
+    * by the new tar.
+    * The method return false and a PEAR error text.
+    * The $p_filelist parameter can be an array of string, each string
+    * representing a filename or a directory name with their path if
+    * needed. It can also be a single string with names separated by a
+    * single blank.
+    * For each directory added in the archive, the files and
+    * sub-directories are also added.
+    * See also createModify() method for more details.
+    *
+    * @param array  $p_filelist An array of filenames and directory names, or a
+	*                           single string with names separated by a single
+	*                           blank space.
+    * @return                   true on success, false on error.
+    * @see createModify()
+    * @access public
+    */
+    function create($p_filelist)
+    {
+        return $this->createModify($p_filelist, '', '');
+    }
+    // }}}
+
+    // {{{ add()
+    /**
+    * This method add the files / directories that are listed in $p_filelist in
+    * the archive. If the archive does not exist it is created.
+    * The method return false and a PEAR error text.
+    * The files and directories listed are only added at the end of the archive,
+    * even if a file with the same name is already archived.
+    * See also createModify() method for more details.
+    *
+    * @param array  $p_filelist An array of filenames and directory names, or a
+	*                           single string with names separated by a single
+	*                           blank space.
+    * @return                   true on success, false on error.
+    * @see createModify()
+    * @access public
+    */
+    function add($p_filelist)
+    {
+        return $this->addModify($p_filelist, '', '');
+    }
+    // }}}
+
+    // {{{ extract()
+    function extract($p_path='')
+    {
+        return $this->extractModify($p_path, '');
+    }
+    // }}}
+
+    // {{{ listContent()
+    function listContent()
+    {
+        $v_list_detail = array();
+
+        if ($this->_openRead()) {
+            if (!$this->_extractList('', $v_list_detail, "list", '', '')) {
+                unset($v_list_detail);
+                $v_list_detail = 0;
+            }
+            $this->_close();
+        }
+
+        return $v_list_detail;
+    }
+    // }}}
+
+    // {{{ createModify()
+    /**
+    * This method creates the archive file and add the files / directories
+    * that are listed in $p_filelist.
+    * If the file already exists and is writable, it is replaced by the
+    * new tar. It is a create and not an add. If the file exists and is
+    * read-only or is a directory it is not replaced. The method return
+    * false and a PEAR error text.
+    * The $p_filelist parameter can be an array of string, each string
+    * representing a filename or a directory name with their path if
+    * needed. It can also be a single string with names separated by a
+    * single blank.
+    * The path indicated in $p_remove_dir will be removed from the
+    * memorized path of each file / directory listed when this path
+    * exists. By default nothing is removed (empty path '')
+    * The path indicated in $p_add_dir will be added at the beginning of
+    * the memorized path of each file / directory listed. However it can
+    * be set to empty ''. The adding of a path is done after the removing
+    * of path.
+    * The path add/remove ability enables the user to prepare an archive
+    * for extraction in a different path than the origin files are.
+    * See also addModify() method for file adding properties.
+    *
+    * @param array  $p_filelist     An array of filenames and directory names,
+	*                               or a single string with names separated by
+	*                               a single blank space.
+    * @param string $p_add_dir      A string which contains a path to be added
+	*                               to the memorized path of each element in
+	*                               the list.
+    * @param string $p_remove_dir   A string which contains a path to be
+	*                               removed from the memorized path of each
+	*                               element in the list, when relevant.
+    * @return boolean               true on success, false on error.
+    * @access public
+    * @see addModify()
+    */
+    function createModify($p_filelist, $p_add_dir, $p_remove_dir='')
+    {
+        $v_result = true;
+
+        if (!$this->_openWrite())
+            return false;
+
+        if ($p_filelist != '') {
+            if (is_array($p_filelist))
+                $v_list = $p_filelist;
+            elseif (is_string($p_filelist))
+                $v_list = explode($this->_separator, $p_filelist);
+            else {
+                $this->_cleanFile();
+                $this->_error('Invalid file list');
+                return false;
+            }
+
+            $v_result = $this->_addList($v_list, $p_add_dir, $p_remove_dir);
+        }
+
+        if ($v_result) {
+            $this->_writeFooter();
+            $this->_close();
+        } else
+            $this->_cleanFile();
+
+        return $v_result;
+    }
+    // }}}
+
+    // {{{ addModify()
+    /**
+    * This method add the files / directories listed in $p_filelist at the
+    * end of the existing archive. If the archive does not yet exists it
+    * is created.
+    * The $p_filelist parameter can be an array of string, each string
+    * representing a filename or a directory name with their path if
+    * needed. It can also be a single string with names separated by a
+    * single blank.
+    * The path indicated in $p_remove_dir will be removed from the
+    * memorized path of each file / directory listed when this path
+    * exists. By default nothing is removed (empty path '')
+    * The path indicated in $p_add_dir will be added at the beginning of
+    * the memorized path of each file / directory listed. However it can
+    * be set to empty ''. The adding of a path is done after the removing
+    * of path.
+    * The path add/remove ability enables the user to prepare an archive
+    * for extraction in a different path than the origin files are.
+    * If a file/dir is already in the archive it will only be added at the
+    * end of the archive. There is no update of the existing archived
+    * file/dir. However while extracting the archive, the last file will
+    * replace the first one. This results in a none optimization of the
+    * archive size.
+    * If a file/dir does not exist the file/dir is ignored. However an
+    * error text is send to PEAR error.
+    * If a file/dir is not readable the file/dir is ignored. However an
+    * error text is send to PEAR error.
+    *
+    * @param array      $p_filelist     An array of filenames and directory
+	*                                   names, or a single string with names
+	*                                   separated by a single blank space.
+    * @param string     $p_add_dir      A string which contains a path to be
+	*                                   added to the memorized path of each
+	*                                   element in the list.
+    * @param string     $p_remove_dir   A string which contains a path to be
+	*                                   removed from the memorized path of
+	*                                   each element in the list, when
+    *                                   relevant.
+    * @return                           true on success, false on error.
+    * @access public
+    */
+    function addModify($p_filelist, $p_add_dir, $p_remove_dir='')
+    {
+        $v_result = true;
+
+        if (!$this->_isArchive())
+            $v_result = $this->createModify($p_filelist, $p_add_dir,
+			                                $p_remove_dir);
+        else {
+            if (is_array($p_filelist))
+                $v_list = $p_filelist;
+            elseif (is_string($p_filelist))
+                $v_list = explode($this->_separator, $p_filelist);
+            else {
+                $this->_error('Invalid file list');
+                return false;
+            }
+
+            $v_result = $this->_append($v_list, $p_add_dir, $p_remove_dir);
+        }
+
+        return $v_result;
+    }
+    // }}}
+
+    // {{{ addString()
+    /**
+    * This method add a single string as a file at the
+    * end of the existing archive. If the archive does not yet exists it
+    * is created.
+    *
+    * @param string     $p_filename     A string which contains the full
+	*                                   filename path that will be associated
+	*                                   with the string.
+    * @param string     $p_string       The content of the file added in
+	*                                   the archive.
+    * @return                           true on success, false on error.
+    * @access public
+    */
+    function addString($p_filename, $p_string)
+    {
+        $v_result = true;
+
+        if (!$this->_isArchive()) {
+            if (!$this->_openWrite()) {
+                return false;
+            }
+            $this->_close();
+        }
+
+        if (!$this->_openAppend())
+            return false;
+
+        // Need to check the get back to the temporary file ? ....
+        $v_result = $this->_addString($p_filename, $p_string);
+
+        $this->_writeFooter();
+
+        $this->_close();
+
+        return $v_result;
+    }
+    // }}}
+
+    // {{{ extractModify()
+    /**
+    * This method extract all the content of the archive in the directory
+    * indicated by $p_path. When relevant the memorized path of the
+    * files/dir can be modified by removing the $p_remove_path path at the
+    * beginning of the file/dir path.
+    * While extracting a file, if the directory path does not exists it is
+    * created.
+    * While extracting a file, if the file already exists it is replaced
+    * without looking for last modification date.
+    * While extracting a file, if the file already exists and is write
+    * protected, the extraction is aborted.
+    * While extracting a file, if a directory with the same name already
+    * exists, the extraction is aborted.
+    * While extracting a directory, if a file with the same name already
+    * exists, the extraction is aborted.
+    * While extracting a file/directory if the destination directory exist
+    * and is write protected, or does not exist but can not be created,
+    * the extraction is aborted.
+    * If after extraction an extracted file does not show the correct
+    * stored file size, the extraction is aborted.
+    * When the extraction is aborted, a PEAR error text is set and false
+    * is returned. However the result can be a partial extraction that may
+    * need to be manually cleaned.
+    *
+    * @param string $p_path         The path of the directory where the
+	*                               files/dir need to by extracted.
+    * @param string $p_remove_path  Part of the memorized path that can be
+	*                               removed if present at the beginning of
+	*                               the file/dir path.
+    * @return boolean               true on success, false on error.
+    * @access public
+    * @see extractList()
+    */
+    function extractModify($p_path, $p_remove_path)
+    {
+        $v_result = true;
+        $v_list_detail = array();
+
+        if ($v_result = $this->_openRead()) {
+            $v_result = $this->_extractList($p_path, $v_list_detail,
+			                                "complete", 0, $p_remove_path);
+            $this->_close();
+        }
+
+        return $v_result;
+    }
+    // }}}
+
+    // {{{ extractInString()
+    /**
+    * This method extract from the archive one file identified by $p_filename.
+    * The return value is a string with the file content, or NULL on error.
+    * @param string $p_filename     The path of the file to extract in a string.
+    * @return                       a string with the file content or NULL.
+    * @access public
+    */
+    function extractInString($p_filename)
+    {
+        if ($this->_openRead()) {
+            $v_result = $this->_extractInString($p_filename);
+            $this->_close();
+        } else {
+            $v_result = NULL;
+        }
+
+        return $v_result;
+    }
+    // }}}
+
+    // {{{ extractList()
+    /**
+    * This method extract from the archive only the files indicated in the
+    * $p_filelist. These files are extracted in the current directory or
+    * in the directory indicated by the optional $p_path parameter.
+    * If indicated the $p_remove_path can be used in the same way as it is
+    * used in extractModify() method.
+    * @param array  $p_filelist     An array of filenames and directory names,
+	*                               or a single string with names separated
+	*                               by a single blank space.
+    * @param string $p_path         The path of the directory where the
+	*                               files/dir need to by extracted.
+    * @param string $p_remove_path  Part of the memorized path that can be
+	*                               removed if present at the beginning of
+	*                               the file/dir path.
+    * @return                       true on success, false on error.
+    * @access public
+    * @see extractModify()
+    */
+    function extractList($p_filelist, $p_path='', $p_remove_path='')
+    {
+        $v_result = true;
+        $v_list_detail = array();
+
+        if (is_array($p_filelist))
+            $v_list = $p_filelist;
+        elseif (is_string($p_filelist))
+            $v_list = explode($this->_separator, $p_filelist);
+        else {
+            $this->_error('Invalid string list');
+            return false;
+        }
+
+        if ($v_result = $this->_openRead()) {
+            $v_result = $this->_extractList($p_path, $v_list_detail, "partial",
+			                                $v_list, $p_remove_path);
+            $this->_close();
+        }
+
+        return $v_result;
+    }
+    // }}}
+
+    // {{{ setAttribute()
+    /**
+    * This method set specific attributes of the archive. It uses a variable
+    * list of parameters, in the format attribute code + attribute values :
+    * $arch->setAttribute(ARCHIVE_TAR_ATT_SEPARATOR, ',');
+    * @param mixed $argv            variable list of attributes and values
+    * @return                       true on success, false on error.
+    * @access public
+    */
+    function setAttribute()
+    {
+        $v_result = true;
+
+        // ----- Get the number of variable list of arguments
+        if (($v_size = func_num_args()) == 0) {
+            return true;
+        }
+
+        // ----- Get the arguments
+        $v_att_list = &func_get_args();
+
+        // ----- Read the attributes
+        $i=0;
+        while ($i<$v_size) {
+
+            // ----- Look for next option
+            switch ($v_att_list[$i]) {
+                // ----- Look for options that request a string value
+                case ARCHIVE_TAR_ATT_SEPARATOR :
+                    // ----- Check the number of parameters
+                    if (($i+1) >= $v_size) {
+                        $this->_error('Invalid number of parameters for '
+						              .'attribute ARCHIVE_TAR_ATT_SEPARATOR');
+                        return false;
+                    }
+
+                    // ----- Get the value
+                    $this->_separator = $v_att_list[$i+1];
+                    $i++;
+                break;
+
+                default :
+                    $this->_error('Unknow attribute code '.$v_att_list[$i].'');
+                    return false;
+            }
+
+            // ----- Next attribute
+            $i++;
+        }
+
+        return $v_result;
+    }
+    // }}}
+
+    // {{{ _error()
+    function _error($p_message)
+    {
+        // ----- To be completed
+//        $this->raiseError($p_message);
+        throw new Exception($p_message);
+    }
+    // }}}
+
+    // {{{ _warning()
+    function _warning($p_message)
+    {
+        // ----- To be completed
+//        $this->raiseError($p_message);
+        throw new Exception($p_message);
+    }
+    // }}}
+
+    // {{{ _isArchive()
+    function _isArchive($p_filename=NULL)
+    {
+        if ($p_filename == NULL) {
+            $p_filename = $this->_tarname;
+        }
+        clearstatcache();
+        return @is_file($p_filename) && !@is_link($p_filename);
+    }
+    // }}}
+
+    // {{{ _openWrite()
+    function _openWrite()
+    {
+        if ($this->_compress_type == 'gz')
+            $this->_file = @gzopen($this->_tarname, "wb9");
+        else if ($this->_compress_type == 'bz2')
+            $this->_file = @bzopen($this->_tarname, "w");
+        else if ($this->_compress_type == 'none')
+            $this->_file = @fopen($this->_tarname, "wb");
+        else
+            $this->_error('Unknown or missing compression type ('
+			              .$this->_compress_type.')');
+
+        if ($this->_file == 0) {
+            $this->_error('Unable to open in write mode \''
+			              .$this->_tarname.'\'');
+            return false;
+        }
+
+        return true;
+    }
+    // }}}
+
+    // {{{ _openRead()
+    function _openRead()
+    {
+        if (strtolower(substr($this->_tarname, 0, 7)) == 'http://') {
+
+          // ----- Look if a local copy need to be done
+          if ($this->_temp_tarname == '') {
+              $this->_temp_tarname = uniqid('tar').'.tmp';
+              if (!$v_file_from = @fopen($this->_tarname, 'rb')) {
+                $this->_error('Unable to open in read mode \''
+				              .$this->_tarname.'\'');
+                $this->_temp_tarname = '';
+                return false;
+              }
+              if (!$v_file_to = @fopen($this->_temp_tarname, 'wb')) {
+                $this->_error('Unable to open in write mode \''
+				              .$this->_temp_tarname.'\'');
+                $this->_temp_tarname = '';
+                return false;
+              }
+              while ($v_data = @fread($v_file_from, 1024))
+                  @fwrite($v_file_to, $v_data);
+              @fclose($v_file_from);
+              @fclose($v_file_to);
+          }
+
+          // ----- File to open if the local copy
+          $v_filename = $this->_temp_tarname;
+
+        } else
+          // ----- File to open if the normal Tar file
+          $v_filename = $this->_tarname;
+
+        if ($this->_compress_type == 'gz')
+            $this->_file = @gzopen($v_filename, "rb");
+        else if ($this->_compress_type == 'bz2')
+            $this->_file = @bzopen($v_filename, "r");
+        else if ($this->_compress_type == 'none')
+            $this->_file = @fopen($v_filename, "rb");
+        else
+            $this->_error('Unknown or missing compression type ('
+			              .$this->_compress_type.')');
+
+        if ($this->_file == 0) {
+            $this->_error('Unable to open in read mode \''.$v_filename.'\'');
+            return false;
+        }
+
+        return true;
+    }
+    // }}}
+
+    // {{{ _openReadWrite()
+    function _openReadWrite()
+    {
+        if ($this->_compress_type == 'gz')
+            $this->_file = @gzopen($this->_tarname, "r+b");
+        else if ($this->_compress_type == 'bz2') {
+            $this->_error('Unable to open bz2 in read/write mode \''
+			              .$this->_tarname.'\' (limitation of bz2 extension)');
+            return false;
+        } else if ($this->_compress_type == 'none')
+            $this->_file = @fopen($this->_tarname, "r+b");
+        else
+            $this->_error('Unknown or missing compression type ('
+			              .$this->_compress_type.')');
+
+        if ($this->_file == 0) {
+            $this->_error('Unable to open in read/write mode \''
+			              .$this->_tarname.'\'');
+            return false;
+        }
+
+        return true;
+    }
+    // }}}
+
+    // {{{ _close()
+    function _close()
+    {
+        //if (isset($this->_file)) {
+        if (is_resource($this->_file)) {
+            if ($this->_compress_type == 'gz')
+                @gzclose($this->_file);
+            else if ($this->_compress_type == 'bz2')
+                @bzclose($this->_file);
+            else if ($this->_compress_type == 'none')
+                @fclose($this->_file);
+            else
+                $this->_error('Unknown or missing compression type ('
+				              .$this->_compress_type.')');
+
+            $this->_file = 0;
+        }
+
+        // ----- Look if a local copy need to be erase
+        // Note that it might be interesting to keep the url for a time : ToDo
+        if ($this->_temp_tarname != '') {
+            @drupal_unlink($this->_temp_tarname);
+            $this->_temp_tarname = '';
+        }
+
+        return true;
+    }
+    // }}}
+
+    // {{{ _cleanFile()
+    function _cleanFile()
+    {
+        $this->_close();
+
+        // ----- Look for a local copy
+        if ($this->_temp_tarname != '') {
+            // ----- Remove the local copy but not the remote tarname
+            @drupal_unlink($this->_temp_tarname);
+            $this->_temp_tarname = '';
+        } else {
+            // ----- Remove the local tarname file
+            @drupal_unlink($this->_tarname);
+        }
+        $this->_tarname = '';
+
+        return true;
+    }
+    // }}}
+
+    // {{{ _writeBlock()
+    function _writeBlock($p_binary_data, $p_len=null)
+    {
+      if (is_resource($this->_file)) {
+          if ($p_len === null) {
+              if ($this->_compress_type == 'gz')
+                  @gzputs($this->_file, $p_binary_data);
+              else if ($this->_compress_type == 'bz2')
+                  @bzwrite($this->_file, $p_binary_data);
+              else if ($this->_compress_type == 'none')
+                  @fputs($this->_file, $p_binary_data);
+              else
+                  $this->_error('Unknown or missing compression type ('
+				                .$this->_compress_type.')');
+          } else {
+              if ($this->_compress_type == 'gz')
+                  @gzputs($this->_file, $p_binary_data, $p_len);
+              else if ($this->_compress_type == 'bz2')
+                  @bzwrite($this->_file, $p_binary_data, $p_len);
+              else if ($this->_compress_type == 'none')
+                  @fputs($this->_file, $p_binary_data, $p_len);
+              else
+                  $this->_error('Unknown or missing compression type ('
+				                .$this->_compress_type.')');
+
+          }
+      }
+      return true;
+    }
+    // }}}
+
+    // {{{ _readBlock()
+    function _readBlock()
+    {
+      $v_block = null;
+      if (is_resource($this->_file)) {
+          if ($this->_compress_type == 'gz')
+              $v_block = @gzread($this->_file, 512);
+          else if ($this->_compress_type == 'bz2')
+              $v_block = @bzread($this->_file, 512);
+          else if ($this->_compress_type == 'none')
+              $v_block = @fread($this->_file, 512);
+          else
+              $this->_error('Unknown or missing compression type ('
+			                .$this->_compress_type.')');
+      }
+      return $v_block;
+    }
+    // }}}
+
+    // {{{ _jumpBlock()
+    function _jumpBlock($p_len=null)
+    {
+      if (is_resource($this->_file)) {
+          if ($p_len === null)
+              $p_len = 1;
+
+          if ($this->_compress_type == 'gz') {
+              @gzseek($this->_file, gztell($this->_file)+($p_len*512));
+          }
+          else if ($this->_compress_type == 'bz2') {
+              // ----- Replace missing bztell() and bzseek()
+              for ($i=0; $i<$p_len; $i++)
+                  $this->_readBlock();
+          } else if ($this->_compress_type == 'none')
+              @fseek($this->_file, ftell($this->_file)+($p_len*512));
+          else
+              $this->_error('Unknown or missing compression type ('
+			                .$this->_compress_type.')');
+
+      }
+      return true;
+    }
+    // }}}
+
+    // {{{ _writeFooter()
+    function _writeFooter()
+    {
+      if (is_resource($this->_file)) {
+          // ----- Write the last 0 filled block for end of archive
+          $v_binary_data = pack('a1024', '');
+          $this->_writeBlock($v_binary_data);
+      }
+      return true;
+    }
+    // }}}
+
+    // {{{ _addList()
+    function _addList($p_list, $p_add_dir, $p_remove_dir)
+    {
+      $v_result=true;
+      $v_header = array();
+
+      // ----- Remove potential windows directory separator
+      $p_add_dir = $this->_translateWinPath($p_add_dir);
+      $p_remove_dir = $this->_translateWinPath($p_remove_dir, false);
+
+      if (!$this->_file) {
+          $this->_error('Invalid file descriptor');
+          return false;
+      }
+
+      if (sizeof($p_list) == 0)
+          return true;
+
+      foreach ($p_list as $v_filename) {
+          if (!$v_result) {
+              break;
+          }
+
+        // ----- Skip the current tar name
+        if ($v_filename == $this->_tarname)
+            continue;
+
+        if ($v_filename == '')
+            continue;
+
+        if (!file_exists($v_filename)) {
+            $this->_warning("File '$v_filename' does not exist");
+            continue;
+        }
+
+        // ----- Add the file or directory header
+        if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir))
+            return false;
+
+        if (@is_dir($v_filename) && !@is_link($v_filename)) {
+            if (!($p_hdir = opendir($v_filename))) {
+                $this->_warning("Directory '$v_filename' can not be read");
+                continue;
+            }
+            while (false !== ($p_hitem = readdir($p_hdir))) {
+                if (($p_hitem != '.') && ($p_hitem != '..')) {
+                    if ($v_filename != ".")
+                        $p_temp_list[0] = $v_filename.'/'.$p_hitem;
+                    else
+                        $p_temp_list[0] = $p_hitem;
+
+                    $v_result = $this->_addList($p_temp_list,
+					                            $p_add_dir,
+												$p_remove_dir);
+                }
+            }
+
+            unset($p_temp_list);
+            unset($p_hdir);
+            unset($p_hitem);
+        }
+      }
+
+      return $v_result;
+    }
+    // }}}
+
+    // {{{ _addFile()
+    function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir)
+    {
+      if (!$this->_file) {
+          $this->_error('Invalid file descriptor');
+          return false;
+      }
+
+      if ($p_filename == '') {
+          $this->_error('Invalid file name');
+          return false;
+      }
+
+      // ----- Calculate the stored filename
+      $p_filename = $this->_translateWinPath($p_filename, false);;
+      $v_stored_filename = $p_filename;
+      if (strcmp($p_filename, $p_remove_dir) == 0) {
+          return true;
+      }
+      if ($p_remove_dir != '') {
+          if (substr($p_remove_dir, -1) != '/')
+              $p_remove_dir .= '/';
+
+          if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir)
+              $v_stored_filename = substr($p_filename, strlen($p_remove_dir));
+      }
+      $v_stored_filename = $this->_translateWinPath($v_stored_filename);
+      if ($p_add_dir != '') {
+          if (substr($p_add_dir, -1) == '/')
+              $v_stored_filename = $p_add_dir.$v_stored_filename;
+          else
+              $v_stored_filename = $p_add_dir.'/'.$v_stored_filename;
+      }
+
+      $v_stored_filename = $this->_pathReduction($v_stored_filename);
+
+      if ($this->_isArchive($p_filename)) {
+          if (($v_file = @fopen($p_filename, "rb")) == 0) {
+              $this->_warning("Unable to open file '".$p_filename
+			                  ."' in binary read mode");
+              return true;
+          }
+
+          if (!$this->_writeHeader($p_filename, $v_stored_filename))
+              return false;
+
+          while (($v_buffer = fread($v_file, 512)) != '') {
+              $v_binary_data = pack("a512", "$v_buffer");
+              $this->_writeBlock($v_binary_data);
+          }
+
+          fclose($v_file);
+
+      } else {
+          // ----- Only header for dir
+          if (!$this->_writeHeader($p_filename, $v_stored_filename))
+              return false;
+      }
+
+      return true;
+    }
+    // }}}
+
+    // {{{ _addString()
+    function _addString($p_filename, $p_string)
+    {
+      if (!$this->_file) {
+          $this->_error('Invalid file descriptor');
+          return false;
+      }
+
+      if ($p_filename == '') {
+          $this->_error('Invalid file name');
+          return false;
+      }
+
+      // ----- Calculate the stored filename
+      $p_filename = $this->_translateWinPath($p_filename, false);;
+
+      if (!$this->_writeHeaderBlock($p_filename, strlen($p_string),
+	                                  time(), 384, "", 0, 0))
+          return false;
+
+      $i=0;
+      while (($v_buffer = substr($p_string, (($i++)*512), 512)) != '') {
+          $v_binary_data = pack("a512", $v_buffer);
+          $this->_writeBlock($v_binary_data);
+      }
+
+      return true;
+    }
+    // }}}
+
+    // {{{ _writeHeader()
+    function _writeHeader($p_filename, $p_stored_filename)
+    {
+        if ($p_stored_filename == '')
+            $p_stored_filename = $p_filename;
+        $v_reduce_filename = $this->_pathReduction($p_stored_filename);
+
+        if (strlen($v_reduce_filename) > 99) {
+          if (!$this->_writeLongHeader($v_reduce_filename))
+            return false;
+        }
+
+        $v_info = lstat($p_filename);
+        $v_uid = sprintf("%6s ", DecOct($v_info[4]));
+        $v_gid = sprintf("%6s ", DecOct($v_info[5]));
+        $v_perms = sprintf("%6s ", DecOct($v_info['mode']));
+
+        $v_mtime = sprintf("%11s", DecOct($v_info['mode']));
+
+        $v_linkname = '';
+
+        if (@is_link($p_filename)) {
+          $v_typeflag = '2';
+          $v_linkname = readlink($p_filename);
+          $v_size = sprintf("%11s ", DecOct(0));
+        } elseif (@is_dir($p_filename)) {
+          $v_typeflag = "5";
+          $v_size = sprintf("%11s ", DecOct(0));
+        } else {
+          $v_typeflag = '';
+          clearstatcache();
+          $v_size = sprintf("%11s ", DecOct($v_info['size']));
+        }
+
+        $v_magic = '';
+
+        $v_version = '';
+
+        $v_uname = '';
+
+        $v_gname = '';
+
+        $v_devmajor = '';
+
+        $v_devminor = '';
+
+        $v_prefix = '';
+
+        $v_binary_data_first = pack("a100a8a8a8a12A12",
+		                            $v_reduce_filename, $v_perms, $v_uid,
+									$v_gid, $v_size, $v_mtime);
+        $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
+		                           $v_typeflag, $v_linkname, $v_magic,
+								   $v_version, $v_uname, $v_gname,
+								   $v_devmajor, $v_devminor, $v_prefix, '');
+
+        // ----- Calculate the checksum
+        $v_checksum = 0;
+        // ..... First part of the header
+        for ($i=0; $i<148; $i++)
+            $v_checksum += ord(substr($v_binary_data_first,$i,1));
+        // ..... Ignore the checksum value and replace it by ' ' (space)
+        for ($i=148; $i<156; $i++)
+            $v_checksum += ord(' ');
+        // ..... Last part of the header
+        for ($i=156, $j=0; $i<512; $i++, $j++)
+            $v_checksum += ord(substr($v_binary_data_last,$j,1));
+
+        // ----- Write the first 148 bytes of the header in the archive
+        $this->_writeBlock($v_binary_data_first, 148);
+
+        // ----- Write the calculated checksum
+        $v_checksum = sprintf("%6s ", DecOct($v_checksum));
+        $v_binary_data = pack("a8", $v_checksum);
+        $this->_writeBlock($v_binary_data, 8);
+
+        // ----- Write the last 356 bytes of the header in the archive
+        $this->_writeBlock($v_binary_data_last, 356);
+
+        return true;
+    }
+    // }}}
+
+    // {{{ _writeHeaderBlock()
+    function _writeHeaderBlock($p_filename, $p_size, $p_mtime=0, $p_perms=0,
+	                           $p_type='', $p_uid=0, $p_gid=0)
+    {
+        $p_filename = $this->_pathReduction($p_filename);
+
+        if (strlen($p_filename) > 99) {
+          if (!$this->_writeLongHeader($p_filename))
+            return false;
+        }
+
+        if ($p_type == "5") {
+          $v_size = sprintf("%11s ", DecOct(0));
+        } else {
+          $v_size = sprintf("%11s ", DecOct($p_size));
+        }
+
+        $v_uid = sprintf("%6s ", DecOct($p_uid));
+        $v_gid = sprintf("%6s ", DecOct($p_gid));
+        $v_perms = sprintf("%6s ", DecOct($p_perms));
+
+        $v_mtime = sprintf("%11s", DecOct($p_mtime));
+
+        $v_linkname = '';
+
+        $v_magic = '';
+
+        $v_version = '';
+
+        $v_uname = '';
+
+        $v_gname = '';
+
+        $v_devmajor = '';
+
+        $v_devminor = '';
+
+        $v_prefix = '';
+
+        $v_binary_data_first = pack("a100a8a8a8a12A12",
+		                            $p_filename, $v_perms, $v_uid, $v_gid,
+									$v_size, $v_mtime);
+        $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
+		                           $p_type, $v_linkname, $v_magic,
+								   $v_version, $v_uname, $v_gname,
+								   $v_devmajor, $v_devminor, $v_prefix, '');
+
+        // ----- Calculate the checksum
+        $v_checksum = 0;
+        // ..... First part of the header
+        for ($i=0; $i<148; $i++)
+            $v_checksum += ord(substr($v_binary_data_first,$i,1));
+        // ..... Ignore the checksum value and replace it by ' ' (space)
+        for ($i=148; $i<156; $i++)
+            $v_checksum += ord(' ');
+        // ..... Last part of the header
+        for ($i=156, $j=0; $i<512; $i++, $j++)
+            $v_checksum += ord(substr($v_binary_data_last,$j,1));
+
+        // ----- Write the first 148 bytes of the header in the archive
+        $this->_writeBlock($v_binary_data_first, 148);
+
+        // ----- Write the calculated checksum
+        $v_checksum = sprintf("%6s ", DecOct($v_checksum));
+        $v_binary_data = pack("a8", $v_checksum);
+        $this->_writeBlock($v_binary_data, 8);
+
+        // ----- Write the last 356 bytes of the header in the archive
+        $this->_writeBlock($v_binary_data_last, 356);
+
+        return true;
+    }
+    // }}}
+
+    // {{{ _writeLongHeader()
+    function _writeLongHeader($p_filename)
+    {
+        $v_size = sprintf("%11s ", DecOct(strlen($p_filename)));
+
+        $v_typeflag = 'L';
+
+        $v_linkname = '';
+
+        $v_magic = '';
+
+        $v_version = '';
+
+        $v_uname = '';
+
+        $v_gname = '';
+
+        $v_devmajor = '';
+
+        $v_devminor = '';
+
+        $v_prefix = '';
+
+        $v_binary_data_first = pack("a100a8a8a8a12A12",
+		                            '././@LongLink', 0, 0, 0, $v_size, 0);
+        $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",
+		                           $v_typeflag, $v_linkname, $v_magic,
+								   $v_version, $v_uname, $v_gname,
+								   $v_devmajor, $v_devminor, $v_prefix, '');
+
+        // ----- Calculate the checksum
+        $v_checksum = 0;
+        // ..... First part of the header
+        for ($i=0; $i<148; $i++)
+            $v_checksum += ord(substr($v_binary_data_first,$i,1));
+        // ..... Ignore the checksum value and replace it by ' ' (space)
+        for ($i=148; $i<156; $i++)
+            $v_checksum += ord(' ');
+        // ..... Last part of the header
+        for ($i=156, $j=0; $i<512; $i++, $j++)
+            $v_checksum += ord(substr($v_binary_data_last,$j,1));
+
+        // ----- Write the first 148 bytes of the header in the archive
+        $this->_writeBlock($v_binary_data_first, 148);
+
+        // ----- Write the calculated checksum
+        $v_checksum = sprintf("%6s ", DecOct($v_checksum));
+        $v_binary_data = pack("a8", $v_checksum);
+        $this->_writeBlock($v_binary_data, 8);
+
+        // ----- Write the last 356 bytes of the header in the archive
+        $this->_writeBlock($v_binary_data_last, 356);
+
+        // ----- Write the filename as content of the block
+        $i=0;
+        while (($v_buffer = substr($p_filename, (($i++)*512), 512)) != '') {
+            $v_binary_data = pack("a512", "$v_buffer");
+            $this->_writeBlock($v_binary_data);
+        }
+
+        return true;
+    }
+    // }}}
+
+    // {{{ _readHeader()
+    function _readHeader($v_binary_data, &$v_header)
+    {
+        if (strlen($v_binary_data)==0) {
+            $v_header['filename'] = '';
+            return true;
+        }
+
+        if (strlen($v_binary_data) != 512) {
+            $v_header['filename'] = '';
+            $this->_error('Invalid block size : '.strlen($v_binary_data));
+            return false;
+        }
+
+        if (!is_array($v_header)) {
+            $v_header = array();
+        }
+        // ----- Calculate the checksum
+        $v_checksum = 0;
+        // ..... First part of the header
+        for ($i=0; $i<148; $i++)
+            $v_checksum+=ord(substr($v_binary_data,$i,1));
+        // ..... Ignore the checksum value and replace it by ' ' (space)
+        for ($i=148; $i<156; $i++)
+            $v_checksum += ord(' ');
+        // ..... Last part of the header
+        for ($i=156; $i<512; $i++)
+           $v_checksum+=ord(substr($v_binary_data,$i,1));
+
+        $v_data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/"
+		                 ."a8checksum/a1typeflag/a100link/a6magic/a2version/"
+						 ."a32uname/a32gname/a8devmajor/a8devminor",
+						 $v_binary_data);
+
+        // ----- Extract the checksum
+        $v_header['checksum'] = OctDec(trim($v_data['checksum']));
+        if ($v_header['checksum'] != $v_checksum) {
+            $v_header['filename'] = '';
+
+            // ----- Look for last block (empty block)
+            if (($v_checksum == 256) && ($v_header['checksum'] == 0))
+                return true;
+
+            $this->_error('Invalid checksum for file "'.$v_data['filename']
+			              .'" : '.$v_checksum.' calculated, '
+						  .$v_header['checksum'].' expected');
+            return false;
+        }
+
+        // ----- Extract the properties
+        $v_header['filename'] = trim($v_data['filename']);
+        if ($this->_maliciousFilename($v_header['filename'])) {
+            $this->_error('Malicious .tar detected, file "' . $v_header['filename'] .
+                '" will not install in desired directory tree');
+            return false;
+        }
+        $v_header['mode'] = OctDec(trim($v_data['mode']));
+        $v_header['uid'] = OctDec(trim($v_data['uid']));
+        $v_header['gid'] = OctDec(trim($v_data['gid']));
+        $v_header['size'] = OctDec(trim($v_data['size']));
+        $v_header['mtime'] = OctDec(trim($v_data['mtime']));
+        if (($v_header['typeflag'] = $v_data['typeflag']) == "5") {
+          $v_header['size'] = 0;
+        }
+        $v_header['link'] = trim($v_data['link']);
+        /* ----- All these fields are removed form the header because
+		they do not carry interesting info
+        $v_header[magic] = trim($v_data[magic]);
+        $v_header[version] = trim($v_data[version]);
+        $v_header[uname] = trim($v_data[uname]);
+        $v_header[gname] = trim($v_data[gname]);
+        $v_header[devmajor] = trim($v_data[devmajor]);
+        $v_header[devminor] = trim($v_data[devminor]);
+        */
+
+        return true;
+    }
+    // }}}
+
+    // {{{ _maliciousFilename()
+    /**
+     * Detect and report a malicious file name
+     *
+     * @param string $file
+     * @return bool
+     * @access private
+     */
+    function _maliciousFilename($file)
+    {
+        if (strpos($file, '/../') !== false) {
+            return true;
+        }
+        if (strpos($file, '../') === 0) {
+            return true;
+        }
+        return false;
+    }
+    // }}}
+
+    // {{{ _readLongHeader()
+    function _readLongHeader(&$v_header)
+    {
+      $v_filename = '';
+      $n = floor($v_header['size']/512);
+      for ($i=0; $i<$n; $i++) {
+        $v_content = $this->_readBlock();
+        $v_filename .= $v_content;
+      }
+      if (($v_header['size'] % 512) != 0) {
+        $v_content = $this->_readBlock();
+        $v_filename .= $v_content;
+      }
+
+      // ----- Read the next header
+      $v_binary_data = $this->_readBlock();
+
+      if (!$this->_readHeader($v_binary_data, $v_header))
+        return false;
+
+      $v_filename = trim($v_filename);
+      $v_header['filename'] = $v_filename;
+        if ($this->_maliciousFilename($v_filename)) {
+            $this->_error('Malicious .tar detected, file "' . $v_filename .
+                '" will not install in desired directory tree');
+            return false;
+      }
+
+      return true;
+    }
+    // }}}
+
+    // {{{ _extractInString()
+    /**
+    * This method extract from the archive one file identified by $p_filename.
+    * The return value is a string with the file content, or NULL on error.
+    * @param string $p_filename     The path of the file to extract in a string.
+    * @return                       a string with the file content or NULL.
+    * @access private
+    */
+    function _extractInString($p_filename)
+    {
+        $v_result_str = "";
+
+        While (strlen($v_binary_data = $this->_readBlock()) != 0)
+        {
+          if (!$this->_readHeader($v_binary_data, $v_header))
+            return NULL;
+
+          if ($v_header['filename'] == '')
+            continue;
+
+          // ----- Look for long filename
+          if ($v_header['typeflag'] == 'L') {
+            if (!$this->_readLongHeader($v_header))
+              return NULL;
+          }
+
+          if ($v_header['filename'] == $p_filename) {
+              if ($v_header['typeflag'] == "5") {
+                  $this->_error('Unable to extract in string a directory '
+				                .'entry {'.$v_header['filename'].'}');
+                  return NULL;
+              } else {
+                  $n = floor($v_header['size']/512);
+                  for ($i=0; $i<$n; $i++) {
+                      $v_result_str .= $this->_readBlock();
+                  }
+                  if (($v_header['size'] % 512) != 0) {
+                      $v_content = $this->_readBlock();
+                      $v_result_str .= substr($v_content, 0,
+					                          ($v_header['size'] % 512));
+                  }
+                  return $v_result_str;
+              }
+          } else {
+              $this->_jumpBlock(ceil(($v_header['size']/512)));
+          }
+        }
+
+        return NULL;
+    }
+    // }}}
+
+    // {{{ _extractList()
+    function _extractList($p_path, &$p_list_detail, $p_mode,
+	                      $p_file_list, $p_remove_path)
+    {
+    $v_result=true;
+    $v_nb = 0;
+    $v_extract_all = true;
+    $v_listing = false;
+
+    $p_path = $this->_translateWinPath($p_path, false);
+    if ($p_path == '' || (substr($p_path, 0, 1) != '/'
+	    && substr($p_path, 0, 3) != "../" && !strpos($p_path, ':'))) {
+      $p_path = "./".$p_path;
+    }
+    $p_remove_path = $this->_translateWinPath($p_remove_path);
+
+    // ----- Look for path to remove format (should end by /)
+    if (($p_remove_path != '') && (substr($p_remove_path, -1) != '/'))
+      $p_remove_path .= '/';
+    $p_remove_path_size = strlen($p_remove_path);
+
+    switch ($p_mode) {
+      case "complete" :
+        $v_extract_all = TRUE;
+        $v_listing = FALSE;
+      break;
+      case "partial" :
+          $v_extract_all = FALSE;
+          $v_listing = FALSE;
+      break;
+      case "list" :
+          $v_extract_all = FALSE;
+          $v_listing = TRUE;
+      break;
+      default :
+        $this->_error('Invalid extract mode ('.$p_mode.')');
+        return false;
+    }
+
+    clearstatcache();
+
+    while (strlen($v_binary_data = $this->_readBlock()) != 0)
+    {
+      $v_extract_file = FALSE;
+      $v_extraction_stopped = 0;
+
+      if (!$this->_readHeader($v_binary_data, $v_header))
+        return false;
+
+      if ($v_header['filename'] == '') {
+        continue;
+      }
+
+      // ----- Look for long filename
+      if ($v_header['typeflag'] == 'L') {
+        if (!$this->_readLongHeader($v_header))
+          return false;
+      }
+
+      if ((!$v_extract_all) && (is_array($p_file_list))) {
+        // ----- By default no unzip if the file is not found
+        $v_extract_file = false;
+
+        for ($i=0; $i<sizeof($p_file_list); $i++) {
+          // ----- Look if it is a directory
+          if (substr($p_file_list[$i], -1) == '/') {
+            // ----- Look if the directory is in the filename path
+            if ((strlen($v_header['filename']) > strlen($p_file_list[$i]))
+			    && (substr($v_header['filename'], 0, strlen($p_file_list[$i]))
+				    == $p_file_list[$i])) {
+              $v_extract_file = TRUE;
+              break;
+            }
+          }
+
+          // ----- It is a file, so compare the file names
+          elseif ($p_file_list[$i] == $v_header['filename']) {
+            $v_extract_file = TRUE;
+            break;
+          }
+        }
+      } else {
+        $v_extract_file = TRUE;
+      }
+
+      // ----- Look if this file need to be extracted
+      if (($v_extract_file) && (!$v_listing))
+      {
+        if (($p_remove_path != '')
+            && (substr($v_header['filename'], 0, $p_remove_path_size)
+			    == $p_remove_path))
+          $v_header['filename'] = substr($v_header['filename'],
+		                                 $p_remove_path_size);
+        if (($p_path != './') && ($p_path != '/')) {
+          while (substr($p_path, -1) == '/')
+            $p_path = substr($p_path, 0, strlen($p_path)-1);
+
+          if (substr($v_header['filename'], 0, 1) == '/')
+              $v_header['filename'] = $p_path.$v_header['filename'];
+          else
+            $v_header['filename'] = $p_path.'/'.$v_header['filename'];
+        }
+        if (file_exists($v_header['filename'])) {
+          if (   (@is_dir($v_header['filename']))
+		      && ($v_header['typeflag'] == '')) {
+            $this->_error('File '.$v_header['filename']
+			              .' already exists as a directory');
+            return false;
+          }
+          if (   ($this->_isArchive($v_header['filename']))
+		      && ($v_header['typeflag'] == "5")) {
+            $this->_error('Directory '.$v_header['filename']
+			              .' already exists as a file');
+            return false;
+          }
+          if (!is_writeable($v_header['filename'])) {
+            $this->_error('File '.$v_header['filename']
+			              .' already exists and is write protected');
+            return false;
+          }
+          if (filemtime($v_header['filename']) > $v_header['mtime']) {
+            // To be completed : An error or silent no replace ?
+          }
+        }
+
+        // ----- Check the directory availability and create it if necessary
+        elseif (($v_result
+		         = $this->_dirCheck(($v_header['typeflag'] == "5"
+				                    ?$v_header['filename']
+									:dirname($v_header['filename'])))) != 1) {
+            $this->_error('Unable to create path for '.$v_header['filename']);
+            return false;
+        }
+
+        if ($v_extract_file) {
+          if ($v_header['typeflag'] == "5") {
+            if (!@file_exists($v_header['filename'])) {
+                // Drupal integration.
+                // Changed the code to use drupal_mkdir() instead of mkdir().
+                if (!@drupal_mkdir($v_header['filename'], 0777)) {
+                    $this->_error('Unable to create directory {'
+					              .$v_header['filename'].'}');
+                    return false;
+                }
+            }
+          } elseif ($v_header['typeflag'] == "2") {
+              if (@file_exists($v_header['filename'])) {
+                  @drupal_unlink($v_header['filename']);
+              }
+              if (!@symlink($v_header['link'], $v_header['filename'])) {
+                  $this->_error('Unable to extract symbolic link {'
+                                .$v_header['filename'].'}');
+                  return false;
+              }
+          } else {
+              if (($v_dest_file = @fopen($v_header['filename'], "wb")) == 0) {
+                  $this->_error('Error while opening {'.$v_header['filename']
+				                .'} in write binary mode');
+                  return false;
+              } else {
+                  $n = floor($v_header['size']/512);
+                  for ($i=0; $i<$n; $i++) {
+                      $v_content = $this->_readBlock();
+                      fwrite($v_dest_file, $v_content, 512);
+                  }
+            if (($v_header['size'] % 512) != 0) {
+              $v_content = $this->_readBlock();
+              fwrite($v_dest_file, $v_content, ($v_header['size'] % 512));
+            }
+
+            @fclose($v_dest_file);
+
+            // ----- Change the file mode, mtime
+            @touch($v_header['filename'], $v_header['mtime']);
+            if ($v_header['mode'] & 0111) {
+                // make file executable, obey umask
+                $mode = fileperms($v_header['filename']) | (~umask() & 0111);
+                @chmod($v_header['filename'], $mode);
+            }
+          }
+
+          // ----- Check the file size
+          clearstatcache();
+          if (filesize($v_header['filename']) != $v_header['size']) {
+              $this->_error('Extracted file '.$v_header['filename']
+			                .' does not have the correct file size \''
+							.filesize($v_header['filename'])
+							.'\' ('.$v_header['size']
+							.' expected). Archive may be corrupted.');
+              return false;
+          }
+          }
+        } else {
+          $this->_jumpBlock(ceil(($v_header['size']/512)));
+        }
+      } else {
+          $this->_jumpBlock(ceil(($v_header['size']/512)));
+      }
+
+      /* TBC : Seems to be unused ...
+      if ($this->_compress)
+        $v_end_of_file = @gzeof($this->_file);
+      else
+        $v_end_of_file = @feof($this->_file);
+        */
+
+      if ($v_listing || $v_extract_file || $v_extraction_stopped) {
+        // ----- Log extracted files
+        if (($v_file_dir = dirname($v_header['filename']))
+		    == $v_header['filename'])
+          $v_file_dir = '';
+        if ((substr($v_header['filename'], 0, 1) == '/') && ($v_file_dir == ''))
+          $v_file_dir = '/';
+
+        $p_list_detail[$v_nb++] = $v_header;
+        if (is_array($p_file_list) && (count($p_list_detail) == count($p_file_list))) {
+            return true;
+        }
+      }
+    }
+
+        return true;
+    }
+    // }}}
+
+    // {{{ _openAppend()
+    function _openAppend()
+    {
+        if (filesize($this->_tarname) == 0)
+          return $this->_openWrite();
+
+        if ($this->_compress) {
+            $this->_close();
+
+            if (!@rename($this->_tarname, $this->_tarname.".tmp")) {
+                $this->_error('Error while renaming \''.$this->_tarname
+				              .'\' to temporary file \''.$this->_tarname
+							  .'.tmp\'');
+                return false;
+            }
+
+            if ($this->_compress_type == 'gz')
+                $v_temp_tar = @gzopen($this->_tarname.".tmp", "rb");
+            elseif ($this->_compress_type == 'bz2')
+                $v_temp_tar = @bzopen($this->_tarname.".tmp", "r");
+
+            if ($v_temp_tar == 0) {
+                $this->_error('Unable to open file \''.$this->_tarname
+				              .'.tmp\' in binary read mode');
+                @rename($this->_tarname.".tmp", $this->_tarname);
+                return false;
+            }
+
+            if (!$this->_openWrite()) {
+                @rename($this->_tarname.".tmp", $this->_tarname);
+                return false;
+            }
+
+            if ($this->_compress_type == 'gz') {
+                while (!@gzeof($v_temp_tar)) {
+                    $v_buffer = @gzread($v_temp_tar, 512);
+                    if ($v_buffer == ARCHIVE_TAR_END_BLOCK) {
+                        // do not copy end blocks, we will re-make them
+                        // after appending
+                        continue;
+                    }
+                    $v_binary_data = pack("a512", $v_buffer);
+                    $this->_writeBlock($v_binary_data);
+                }
+
+                @gzclose($v_temp_tar);
+            }
+            elseif ($this->_compress_type == 'bz2') {
+                while (strlen($v_buffer = @bzread($v_temp_tar, 512)) > 0) {
+                    if ($v_buffer == ARCHIVE_TAR_END_BLOCK) {
+                        continue;
+                    }
+                    $v_binary_data = pack("a512", $v_buffer);
+                    $this->_writeBlock($v_binary_data);
+                }
+
+                @bzclose($v_temp_tar);
+            }
+
+            if (!@drupal_unlink($this->_tarname.".tmp")) {
+                $this->_error('Error while deleting temporary file \''
+				              .$this->_tarname.'.tmp\'');
+            }
+
+        } else {
+            // ----- For not compressed tar, just add files before the last
+			//       one or two 512 bytes block
+            if (!$this->_openReadWrite())
+               return false;
+
+            clearstatcache();
+            $v_size = filesize($this->_tarname);
+
+            // We might have zero, one or two end blocks.
+            // The standard is two, but we should try to handle
+            // other cases.
+            fseek($this->_file, $v_size - 1024);
+            if (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) {
+                fseek($this->_file, $v_size - 1024);
+            }
+            elseif (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) {
+                fseek($this->_file, $v_size - 512);
+            }
+        }
+
+        return true;
+    }
+    // }}}
+
+    // {{{ _append()
+    function _append($p_filelist, $p_add_dir='', $p_remove_dir='')
+    {
+        if (!$this->_openAppend())
+            return false;
+
+        if ($this->_addList($p_filelist, $p_add_dir, $p_remove_dir))
+           $this->_writeFooter();
+
+        $this->_close();
+
+        return true;
+    }
+    // }}}
+
+    // {{{ _dirCheck()
+
+    /**
+     * Check if a directory exists and create it (including parent
+     * dirs) if not.
+     *
+     * @param string $p_dir directory to check
+     *
+     * @return bool TRUE if the directory exists or was created
+     */
+    function _dirCheck($p_dir)
+    {
+        clearstatcache();
+        if ((@is_dir($p_dir)) || ($p_dir == ''))
+            return true;
+
+        $p_parent_dir = dirname($p_dir);
+
+        if (($p_parent_dir != $p_dir) &&
+            ($p_parent_dir != '') &&
+            (!$this->_dirCheck($p_parent_dir)))
+             return false;
+
+        // Drupal integration.
+        // Changed the code to use drupal_mkdir() instead of mkdir().
+        if (!@drupal_mkdir($p_dir, 0777)) {
+            $this->_error("Unable to create directory '$p_dir'");
+            return false;
+        }
+
+        return true;
+    }
+
+    // }}}
+
+    // {{{ _pathReduction()
+
+    /**
+     * Compress path by changing for example "/dir/foo/../bar" to "/dir/bar",
+     * rand emove double slashes.
+     *
+     * @param string $p_dir path to reduce
+     *
+     * @return string reduced path
+     *
+     * @access private
+     *
+     */
+    function _pathReduction($p_dir)
+    {
+        $v_result = '';
+
+        // ----- Look for not empty path
+        if ($p_dir != '') {
+            // ----- Explode path by directory names
+            $v_list = explode('/', $p_dir);
+
+            // ----- Study directories from last to first
+            for ($i=sizeof($v_list)-1; $i>=0; $i--) {
+                // ----- Look for current path
+                if ($v_list[$i] == ".") {
+                    // ----- Ignore this directory
+                    // Should be the first $i=0, but no check is done
+                }
+                else if ($v_list[$i] == "..") {
+                    // ----- Ignore it and ignore the $i-1
+                    $i--;
+                }
+                else if (   ($v_list[$i] == '')
+				         && ($i!=(sizeof($v_list)-1))
+						 && ($i!=0)) {
+                    // ----- Ignore only the double '//' in path,
+                    // but not the first and last /
+                } else {
+                    $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?'/'
+					            .$v_result:'');
+                }
+            }
+        }
+        $v_result = strtr($v_result, '\\', '/');
+        return $v_result;
+    }
+
+    // }}}
+
+    // {{{ _translateWinPath()
+    function _translateWinPath($p_path, $p_remove_disk_letter=true)
+    {
+      if (defined('OS_WINDOWS') && OS_WINDOWS) {
+          // ----- Look for potential disk letter
+          if (   ($p_remove_disk_letter)
+		      && (($v_position = strpos($p_path, ':')) != false)) {
+              $p_path = substr($p_path, $v_position+1);
+          }
+          // ----- Change potential windows directory separator
+          if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) {
+              $p_path = strtr($p_path, '\\', '/');
+          }
+      }
+      return $p_path;
+    }
+    // }}}
+
+}
+?>
diff --git a/htmltest/modules/system/system.test b/htmltest/modules/system/system.test
new file mode 100644
index 00000000..f4fb047d
--- /dev/null
+++ b/htmltest/modules/system/system.test
@@ -0,0 +1,2761 @@
+<?php
+
+/**
+ * @file
+ * Tests for system.module.
+ */
+
+/**
+ * Helper class for module test cases.
+ */
+class ModuleTestCase extends DrupalWebTestCase {
+  protected $admin_user;
+
+  function setUp() {
+    parent::setUp('system_test');
+
+    $this->admin_user = $this->drupalCreateUser(array('access administration pages', 'administer modules'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Assert there are tables that begin with the specified base table name.
+   *
+   * @param $base_table
+   *   Beginning of table name to look for.
+   * @param $count
+   *   (optional) Whether or not to assert that there are tables that match the
+   *   specified base table. Defaults to TRUE.
+   */
+  function assertTableCount($base_table, $count = TRUE) {
+    $tables = db_find_tables(Database::getConnection()->prefixTables('{' . $base_table . '}') . '%');
+
+    if ($count) {
+      return $this->assertTrue($tables, format_string('Tables matching "@base_table" found.', array('@base_table' => $base_table)));
+    }
+    return $this->assertFalse($tables, format_string('Tables matching "@base_table" not found.', array('@base_table' => $base_table)));
+  }
+
+  /**
+   * Assert that all tables defined in a module's hook_schema() exist.
+   *
+   * @param $module
+   *   The name of the module.
+   */
+  function assertModuleTablesExist($module) {
+    $tables = array_keys(drupal_get_schema_unprocessed($module));
+    $tables_exist = TRUE;
+    foreach ($tables as $table) {
+      if (!db_table_exists($table)) {
+        $tables_exist = FALSE;
+      }
+    }
+    return $this->assertTrue($tables_exist, format_string('All database tables defined by the @module module exist.', array('@module' => $module)));
+  }
+
+  /**
+   * Assert that none of the tables defined in a module's hook_schema() exist.
+   *
+   * @param $module
+   *   The name of the module.
+   */
+  function assertModuleTablesDoNotExist($module) {
+    $tables = array_keys(drupal_get_schema_unprocessed($module));
+    $tables_exist = FALSE;
+    foreach ($tables as $table) {
+      if (db_table_exists($table)) {
+        $tables_exist = TRUE;
+      }
+    }
+    return $this->assertFalse($tables_exist, format_string('None of the database tables defined by the @module module exist.', array('@module' => $module)));
+  }
+
+  /**
+   * Assert the list of modules are enabled or disabled.
+   *
+   * @param $modules
+   *   Module list to check.
+   * @param $enabled
+   *   Expected module state.
+   */
+  function assertModules(array $modules, $enabled) {
+    module_list(TRUE);
+    foreach ($modules as $module) {
+      if ($enabled) {
+        $message = 'Module "@module" is enabled.';
+      }
+      else {
+        $message = 'Module "@module" is not enabled.';
+      }
+      $this->assertEqual(module_exists($module), $enabled, format_string($message, array('@module' => $module)));
+    }
+  }
+
+  /**
+   * Verify a log entry was entered for a module's status change.
+   * Called in the same way of the expected original watchdog() execution.
+   *
+   * @param $type
+   *   The category to which this message belongs.
+   * @param $message
+   *   The message to store in the log. Keep $message translatable
+   *   by not concatenating dynamic values into it! Variables in the
+   *   message should be added by using placeholder strings alongside
+   *   the variables argument to declare the value of the placeholders.
+   *   See t() for documentation on how $message and $variables interact.
+   * @param $variables
+   *   Array of variables to replace in the message on display or
+   *   NULL if message is already translated or not possible to
+   *   translate.
+   * @param $severity
+   *   The severity of the message, as per RFC 3164.
+   * @param $link
+   *   A link to associate with the message.
+   */
+  function assertLogMessage($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE, $link = '') {
+    $count = db_select('watchdog', 'w')
+      ->condition('type', $type)
+      ->condition('message', $message)
+      ->condition('variables', serialize($variables))
+      ->condition('severity', $severity)
+      ->condition('link', $link)
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertTrue($count > 0, format_string('watchdog table contains @count rows for @message', array('@count' => $count, '@message' => $message)));
+  }
+}
+
+/**
+ * Test module enabling/disabling functionality.
+ */
+class EnableDisableTestCase extends ModuleTestCase {
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Enable/disable modules',
+      'description' => 'Enable/disable core module and confirm table creation/deletion.',
+      'group' => 'Module',
+    );
+  }
+
+  /**
+   * Test that all core modules can be enabled, disabled and uninstalled.
+   */
+  function testEnableDisable() {
+    // Try to enable, disable and uninstall all core modules, unless they are
+    // hidden or required.
+    $modules = system_rebuild_module_data();
+    foreach ($modules as $name => $module) {
+      if ($module->info['package'] != 'Core' || !empty($module->info['hidden']) || !empty($module->info['required'])) {
+        unset($modules[$name]);
+      }
+    }
+    $this->assertTrue(count($modules), format_string('Found @count core modules that we can try to enable in this test.', array('@count' => count($modules))));
+
+    // Enable the dblog module first, since we will be asserting the presence
+    // of log messages throughout the test.
+   if (isset($modules['dblog'])) {
+     $modules = array('dblog' => $modules['dblog']) + $modules;
+   }
+
+   // Set a variable so that the hook implementations in system_test.module
+   // will display messages via drupal_set_message().
+   variable_set('test_verbose_module_hooks', TRUE);
+
+    // Throughout this test, some modules may be automatically enabled (due to
+    // dependencies). We'll keep track of them in an array, so we can handle
+    // them separately.
+    $automatically_enabled = array();
+
+    // Go through each module in the list and try to enable it (unless it was
+    // already enabled automatically due to a dependency).
+    foreach ($modules as $name => $module) {
+      if (empty($automatically_enabled[$name])) {
+        // Start a list of modules that we expect to be enabled this time.
+        $modules_to_enable = array($name);
+
+        // Find out if the module has any dependencies that aren't enabled yet;
+        // if so, add them to the list of modules we expect to be automatically
+        // enabled.
+        foreach (array_keys($module->requires) as $dependency) {
+          if (isset($modules[$dependency]) && empty($automatically_enabled[$dependency])) {
+            $modules_to_enable[] = $dependency;
+            $automatically_enabled[$dependency] = TRUE;
+          }
+        }
+
+        // Check that each module is not yet enabled and does not have any
+        // database tables yet.
+        foreach ($modules_to_enable as $module_to_enable) {
+          $this->assertModules(array($module_to_enable), FALSE);
+          $this->assertModuleTablesDoNotExist($module_to_enable);
+        }
+
+        // Install and enable the module.
+        $edit = array();
+        $edit['modules[Core][' . $name . '][enable]'] = $name;
+        $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+        // Handle the case where modules were installed along with this one and
+        // where we therefore hit a confirmation screen.
+        if (count($modules_to_enable) > 1) {
+          $this->drupalPost(NULL, array(), t('Continue'));
+        }
+        $this->assertText(t('The configuration options have been saved.'), 'Modules status has been updated.');
+
+        // Check that hook_modules_installed() and hook_modules_enabled() were
+        // invoked with the expected list of modules, that each module's
+        // database tables now exist, and that appropriate messages appear in
+        // the logs.
+        foreach ($modules_to_enable as $module_to_enable) {
+          $this->assertText(t('hook_modules_installed fired for @module', array('@module' => $module_to_enable)));
+          $this->assertText(t('hook_modules_enabled fired for @module', array('@module' => $module_to_enable)));
+          $this->assertModules(array($module_to_enable), TRUE);
+          $this->assertModuleTablesExist($module_to_enable);
+          $this->assertLogMessage('system', "%module module installed.", array('%module' => $module_to_enable), WATCHDOG_INFO);
+          $this->assertLogMessage('system', "%module module enabled.", array('%module' => $module_to_enable), WATCHDOG_INFO);
+        }
+
+        // Disable and uninstall the original module, and check appropriate
+        // hooks, tables, and log messages. (Later, we'll go back and do the
+        // same thing for modules that were enabled automatically.) Skip this
+        // for the dblog module, because that is needed for the test; we'll go
+        // back and do that one at the end also.
+        if ($name != 'dblog') {
+          $this->assertSuccessfulDisableAndUninstall($name);
+        }
+      }
+    }
+
+    // Go through all modules that were automatically enabled, and try to
+    // disable and uninstall them one by one.
+    while (!empty($automatically_enabled)) {
+      $initial_count = count($automatically_enabled);
+      foreach (array_keys($automatically_enabled) as $name) {
+        // If the module can't be disabled due to dependencies, skip it and try
+        // again the next time. Otherwise, try to disable it.
+        $this->drupalGet('admin/modules');
+        $disabled_checkbox = $this->xpath('//input[@type="checkbox" and @disabled="disabled" and @name="modules[Core][' . $name . '][enable]"]');
+        if (empty($disabled_checkbox) && $name != 'dblog') {
+          unset($automatically_enabled[$name]);
+          $this->assertSuccessfulDisableAndUninstall($name);
+        }
+      }
+      $final_count = count($automatically_enabled);
+      // If all checkboxes were disabled, something is really wrong with the
+      // test. Throw a failure and avoid an infinite loop.
+      if ($initial_count == $final_count) {
+        $this->fail(t('Remaining modules could not be disabled.'));
+        break;
+      }
+    }
+
+    // Disable and uninstall the dblog module last, since we needed it for
+    // assertions in all the above tests.
+    if (isset($modules['dblog'])) {
+      $this->assertSuccessfulDisableAndUninstall('dblog');
+    }
+
+    // Now that all modules have been tested, go back and try to enable them
+    // all again at once. This tests two things:
+    // - That each module can be successfully enabled again after being
+    //   uninstalled.
+    // - That enabling more than one module at the same time does not lead to
+    //   any errors.
+    $edit = array();
+    foreach (array_keys($modules) as $name) {
+      $edit['modules[Core][' . $name . '][enable]'] = $name;
+    }
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'Modules status has been updated.');
+  }
+
+  /**
+   * Ensures entity info cache is updated after changes.
+   */
+  function testEntityInfoChanges() {
+    module_enable(array('entity_cache_test'));
+    $entity_info = entity_get_info();
+    $this->assertTrue(isset($entity_info['entity_cache_test']), 'Test entity type found.');
+
+    // Change the label of the test entity type and make sure changes appear
+    // after flushing caches.
+    variable_set('entity_cache_test_label', 'New label.');
+    drupal_flush_all_caches();
+    $info = entity_get_info('entity_cache_test');
+    $this->assertEqual($info['label'], 'New label.', 'New label appears in entity info.');
+
+    // Disable the providing module and make sure the entity type is gone.
+    module_disable(array('entity_cache_test', 'entity_cache_test_dependency'));
+    $entity_info = entity_get_info();
+    $this->assertFalse(isset($entity_info['entity_cache_test']), 'Entity type of the providing module is gone.');
+  }
+
+  /**
+   * Tests entity info cache after enabling a module with a dependency on an entity providing module.
+   *
+   * @see entity_cache_test_watchdog()
+   */
+  function testEntityInfoCacheWatchdog() {
+    module_enable(array('entity_cache_test'));
+    $info = variable_get('entity_cache_test');
+    $this->assertEqual($info['label'], 'Entity Cache Test', 'Entity info label is correct.');
+    $this->assertEqual($info['controller class'], 'DrupalDefaultEntityController', 'Entity controller class info is correct.');
+  }
+
+  /**
+   * Disables and uninstalls a module and asserts that it was done correctly.
+   *
+   * @param $module
+   *   The name of the module to disable and uninstall.
+   */
+  function assertSuccessfulDisableAndUninstall($module) {
+    // Disable the module.
+    $edit = array();
+    $edit['modules[Core][' . $module . '][enable]'] = FALSE;
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'Modules status has been updated.');
+    $this->assertModules(array($module), FALSE);
+
+    // Check that the appropriate hook was fired and the appropriate log
+    // message appears.
+    $this->assertText(t('hook_modules_disabled fired for @module', array('@module' => $module)));
+    $this->assertLogMessage('system', "%module module disabled.", array('%module' => $module), WATCHDOG_INFO);
+
+    //  Check that the module's database tables still exist.
+    $this->assertModuleTablesExist($module);
+
+    // Uninstall the module.
+    $edit = array();
+    $edit['uninstall[' . $module . ']'] = $module;
+    $this->drupalPost('admin/modules/uninstall', $edit, t('Uninstall'));
+    $this->drupalPost(NULL, NULL, t('Uninstall'));
+    $this->assertText(t('The selected modules have been uninstalled.'), 'Modules status has been updated.');
+    $this->assertModules(array($module), FALSE);
+
+    // Check that the appropriate hook was fired and the appropriate log
+    // message appears. (But don't check for the log message if the dblog
+    // module was just uninstalled, since the {watchdog} table won't be there
+    // anymore.)
+    $this->assertText(t('hook_modules_uninstalled fired for @module', array('@module' => $module)));
+    if ($module != 'dblog') {
+      $this->assertLogMessage('system', "%module module uninstalled.", array('%module' => $module), WATCHDOG_INFO);
+    }
+
+    // Check that the module's database tables no longer exist.
+    $this->assertModuleTablesDoNotExist($module);
+  }
+}
+
+/**
+ * Tests failure of hook_requirements('install').
+ */
+class HookRequirementsTestCase extends ModuleTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Requirements hook failure',
+      'description' => "Attempts enabling a module that fails hook_requirements('install').",
+      'group' => 'Module',
+    );
+  }
+
+  /**
+   * Assert that a module cannot be installed if it fails hook_requirements().
+   */
+  function testHookRequirementsFailure() {
+    $this->assertModules(array('requirements1_test'), FALSE);
+
+    // Attempt to install the requirements1_test module.
+    $edit = array();
+    $edit['modules[Testing][requirements1_test][enable]'] = 'requirements1_test';
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+
+    // Makes sure the module was NOT installed.
+    $this->assertText(t('Requirements 1 Test failed requirements'), 'Modules status has been updated.');
+    $this->assertModules(array('requirements1_test'), FALSE);
+  }
+}
+
+/**
+ * Test module dependency functionality.
+ */
+class ModuleDependencyTestCase extends ModuleTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Module dependencies',
+      'description' => 'Enable module without dependency enabled.',
+      'group' => 'Module',
+    );
+  }
+
+  /**
+   * Attempt to enable translation module without locale enabled.
+   */
+  function testEnableWithoutDependency() {
+    // Attempt to enable content translation without locale enabled.
+    $edit = array();
+    $edit['modules[Core][translation][enable]'] = 'translation';
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertText(t('Some required modules must be enabled'), 'Dependency required.');
+
+    $this->assertModules(array('translation', 'locale'), FALSE);
+
+    // Assert that the locale tables weren't enabled.
+    $this->assertTableCount('languages', FALSE);
+    $this->assertTableCount('locale', FALSE);
+
+    $this->drupalPost(NULL, NULL, t('Continue'));
+    $this->assertText(t('The configuration options have been saved.'), 'Modules status has been updated.');
+
+    $this->assertModules(array('translation', 'locale'), TRUE);
+
+    // Assert that the locale tables were enabled.
+    $this->assertTableCount('languages', TRUE);
+    $this->assertTableCount('locale', TRUE);
+  }
+
+  /**
+   * Attempt to enable a module with a missing dependency.
+   */
+  function testMissingModules() {
+    // Test that the system_dependencies_test module is marked
+    // as missing a dependency.
+    $this->drupalGet('admin/modules');
+    $this->assertRaw(t('@module (<span class="admin-missing">missing</span>)', array('@module' => drupal_ucfirst('_missing_dependency'))), 'A module with missing dependencies is marked as such.');
+    $checkbox = $this->xpath('//input[@type="checkbox" and @disabled="disabled" and @name="modules[Testing][system_dependencies_test][enable]"]');
+    $this->assert(count($checkbox) == 1, 'Checkbox for the module is disabled.');
+
+    // Force enable the system_dependencies_test module.
+    module_enable(array('system_dependencies_test'), FALSE);
+
+    // Verify that the module is forced to be disabled when submitting
+    // the module page.
+    $this->drupalPost('admin/modules', array(), t('Save configuration'));
+    $this->assertText(t('The @module module is missing, so the following module will be disabled: @depends.', array('@module' => '_missing_dependency', '@depends' => 'system_dependencies_test')), 'The module missing dependencies will be disabled.');
+
+    // Confirm.
+    $this->drupalPost(NULL, NULL, t('Continue'));
+
+    // Verify that the module has been disabled.
+    $this->assertModules(array('system_dependencies_test'), FALSE);
+  }
+
+  /**
+   * Tests enabling a module that depends on an incompatible version of a module.
+   */
+  function testIncompatibleModuleVersionDependency() {
+    // Test that the system_incompatible_module_version_dependencies_test is
+    // marked as having an incompatible dependency.
+    $this->drupalGet('admin/modules');
+    $this->assertRaw(t('@module (<span class="admin-missing">incompatible with</span> version @version)', array(
+      '@module' => 'System incompatible module version test (>2.0)',
+      '@version' => '1.0',
+    )), 'A module that depends on an incompatible version of a module is marked as such.');
+    $checkbox = $this->xpath('//input[@type="checkbox" and @disabled="disabled" and @name="modules[Testing][system_incompatible_module_version_dependencies_test][enable]"]');
+    $this->assert(count($checkbox) == 1, 'Checkbox for the module is disabled.');
+  }
+
+  /**
+   * Tests enabling a module that depends on a module with an incompatible core version.
+   */
+  function testIncompatibleCoreVersionDependency() {
+    // Test that the system_incompatible_core_version_dependencies_test is
+    // marked as having an incompatible dependency.
+    $this->drupalGet('admin/modules');
+    $this->assertRaw(t('@module (<span class="admin-missing">incompatible with</span> this version of Drupal core)', array(
+      '@module' => 'System incompatible core version test',
+    )), 'A module that depends on a module with an incompatible core version is marked as such.');
+    $checkbox = $this->xpath('//input[@type="checkbox" and @disabled="disabled" and @name="modules[Testing][system_incompatible_core_version_dependencies_test][enable]"]');
+    $this->assert(count($checkbox) == 1, 'Checkbox for the module is disabled.');
+  }
+
+  /**
+   * Tests enabling a module that depends on a module which fails hook_requirements().
+   */
+  function testEnableRequirementsFailureDependency() {
+    $this->assertModules(array('requirements1_test'), FALSE);
+    $this->assertModules(array('requirements2_test'), FALSE);
+
+    // Attempt to install both modules at the same time.
+    $edit = array();
+    $edit['modules[Testing][requirements1_test][enable]'] = 'requirements1_test';
+    $edit['modules[Testing][requirements2_test][enable]'] = 'requirements2_test';
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+
+    // Makes sure the modules were NOT installed.
+    $this->assertText(t('Requirements 1 Test failed requirements'), 'Modules status has been updated.');
+    $this->assertModules(array('requirements1_test'), FALSE);
+    $this->assertModules(array('requirements2_test'), FALSE);
+
+    // Makes sure that already enabled modules the failing modules depend on
+    // were not disabled.
+    $this->assertModules(array('comment'), TRUE);
+
+  }
+
+  /**
+   * Tests that module dependencies are enabled in the correct order via the
+   * UI. Dependencies should be enabled before their dependents.
+   */
+  function testModuleEnableOrder() {
+    module_enable(array('module_test'), FALSE);
+    $this->resetAll();
+    $this->assertModules(array('module_test'), TRUE);
+    variable_set('dependency_test', 'dependency');
+    // module_test creates a dependency chain: forum depends on poll, which
+    // depends on php. The correct enable order is, php, poll, forum.
+    $expected_order = array('php', 'poll', 'forum');
+
+    // Enable the modules through the UI, verifying that the dependency chain
+    // is correct.
+    $edit = array();
+    $edit['modules[Core][forum][enable]'] = 'forum';
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertModules(array('forum'), FALSE);
+    $this->assertText(t('You must enable the Poll, PHP filter modules to install Forum.'), t('Dependency chain created.'));
+    $edit['modules[Core][poll][enable]'] = 'poll';
+    $edit['modules[Core][php][enable]'] = 'php';
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertModules(array('forum', 'poll', 'php'), TRUE);
+
+    // Check the actual order which is saved by module_test_modules_enabled().
+    $this->assertIdentical(variable_get('test_module_enable_order', FALSE), $expected_order, t('Modules enabled in the correct order.'));
+  }
+
+  /**
+   * Tests attempting to uninstall a module that has installed dependents.
+   */
+  function testUninstallDependents() {
+    // Enable the forum module.
+    $edit = array('modules[Core][forum][enable]' => 'forum');
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertModules(array('forum'), TRUE);
+
+    // Disable forum and comment. Both should now be installed but disabled.
+    $edit = array('modules[Core][forum][enable]' => FALSE);
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertModules(array('forum'), FALSE);
+    $edit = array('modules[Core][comment][enable]' => FALSE);
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertModules(array('comment'), FALSE);
+
+    // Check that the taxonomy module cannot be uninstalled.
+    $this->drupalGet('admin/modules/uninstall');
+    $checkbox = $this->xpath('//input[@type="checkbox" and @disabled="disabled" and @name="uninstall[comment]"]');
+    $this->assert(count($checkbox) == 1, 'Checkbox for uninstalling the comment module is disabled.');
+
+    // Uninstall the forum module, and check that taxonomy now can also be
+    // uninstalled.
+    $edit = array('uninstall[forum]' => 'forum');
+    $this->drupalPost('admin/modules/uninstall', $edit, t('Uninstall'));
+    $this->drupalPost(NULL, NULL, t('Uninstall'));
+    $this->assertText(t('The selected modules have been uninstalled.'), 'Modules status has been updated.');
+    $edit = array('uninstall[comment]' => 'comment');
+    $this->drupalPost('admin/modules/uninstall', $edit, t('Uninstall'));
+    $this->drupalPost(NULL, NULL, t('Uninstall'));
+    $this->assertText(t('The selected modules have been uninstalled.'), 'Modules status has been updated.');
+  }
+}
+
+/**
+ * Test module dependency on specific versions.
+ */
+class ModuleVersionTestCase extends ModuleTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Module versions',
+      'description' => 'Check module version dependencies.',
+      'group' => 'Module',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('module_test');
+  }
+
+  /**
+   * Test version dependencies.
+   */
+  function testModuleVersions() {
+    $dependencies = array(
+      // Alternating between being compatible and incompatible with 7.x-2.4-beta3.
+      // The first is always a compatible.
+      'common_test',
+      // Branch incompatibility.
+      'common_test (1.x)',
+      // Branch compatibility.
+      'common_test (2.x)',
+      // Another branch incompatibility.
+      'common_test (>2.x)',
+      // Another branch compatibility.
+      'common_test (<=2.x)',
+      // Another branch incompatibility.
+      'common_test (<2.x)',
+      // Another branch compatibility.
+      'common_test (>=2.x)',
+      // Nonsense, misses a dash. Incompatible with everything.
+      'common_test (=7.x2.x, >=2.4)',
+      // Core version is optional. Compatible.
+      'common_test (=7.x-2.x, >=2.4-alpha2)',
+      // Test !=, explicitly incompatible.
+      'common_test (=2.x, !=2.4-beta3)',
+      // Three operations. Compatible.
+      'common_test (=2.x, !=2.3, <2.5)',
+      // Testing extra version. Incompatible.
+      'common_test (<=2.4-beta2)',
+      // Testing extra version. Compatible.
+      'common_test (>2.4-beta2)',
+      // Testing extra version. Incompatible.
+      'common_test (>2.4-rc0)',
+    );
+    variable_set('dependencies', $dependencies);
+    $n = count($dependencies);
+    for ($i = 0; $i < $n; $i++) {
+      $this->drupalGet('admin/modules');
+      $checkbox = $this->xpath('//input[@id="edit-modules-testing-module-test-enable"]');
+      $this->assertEqual(!empty($checkbox[0]['disabled']), $i % 2, $dependencies[$i]);
+    }
+  }
+}
+
+/**
+ * Test required modules functionality.
+ */
+class ModuleRequiredTestCase extends ModuleTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Required modules',
+      'description' => 'Attempt disabling of required modules.',
+      'group' => 'Module',
+    );
+  }
+
+  /**
+   * Assert that core required modules cannot be disabled.
+   */
+  function testDisableRequired() {
+    $module_info = system_get_info('module');
+    $this->drupalGet('admin/modules');
+    foreach ($module_info as $module => $info) {
+      // Check to make sure the checkbox for each required module is disabled
+      // and checked (or absent from the page if the module is also hidden).
+      if (!empty($info['required'])) {
+        $field_name = "modules[{$info['package']}][$module][enable]";
+        if (empty($info['hidden'])) {
+          $this->assertFieldByXPath("//input[@name='$field_name' and @disabled='disabled' and @checked='checked']", '', format_string('Field @name was disabled and checked.', array('@name' => $field_name)));
+        }
+        else {
+          $this->assertNoFieldByName($field_name);
+        }
+      }
+    }
+  }
+}
+
+class IPAddressBlockingTestCase extends DrupalWebTestCase {
+  protected $blocking_user;
+
+  /**
+   * Implement getInfo().
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'IP address blocking',
+      'description' => 'Test IP address blocking.',
+      'group' => 'System'
+    );
+  }
+
+  /**
+   * Implement setUp().
+   */
+  function setUp() {
+    parent::setUp();
+
+    // Create user.
+    $this->blocking_user = $this->drupalCreateUser(array('block IP addresses'));
+    $this->drupalLogin($this->blocking_user);
+  }
+
+  /**
+   * Test a variety of user input to confirm correct validation and saving of data.
+   */
+  function testIPAddressValidation() {
+    $this->drupalGet('admin/config/people/ip-blocking');
+
+    // Block a valid IP address.
+    $edit = array();
+    $edit['ip'] = '192.168.1.1';
+    $this->drupalPost('admin/config/people/ip-blocking', $edit, t('Add'));
+    $ip = db_query("SELECT iid from {blocked_ips} WHERE ip = :ip", array(':ip' => $edit['ip']))->fetchField();
+    $this->assertTrue($ip, t('IP address found in database.'));
+    $this->assertRaw(t('The IP address %ip has been blocked.', array('%ip' => $edit['ip'])), t('IP address was blocked.'));
+
+    // Try to block an IP address that's already blocked.
+    $edit = array();
+    $edit['ip'] = '192.168.1.1';
+    $this->drupalPost('admin/config/people/ip-blocking', $edit, t('Add'));
+    $this->assertText(t('This IP address is already blocked.'));
+
+    // Try to block a reserved IP address.
+    $edit = array();
+    $edit['ip'] = '255.255.255.255';
+    $this->drupalPost('admin/config/people/ip-blocking', $edit, t('Add'));
+    $this->assertText(t('Enter a valid IP address.'));
+
+    // Try to block a reserved IP address.
+    $edit = array();
+    $edit['ip'] = 'test.example.com';
+    $this->drupalPost('admin/config/people/ip-blocking', $edit, t('Add'));
+    $this->assertText(t('Enter a valid IP address.'));
+
+    // Submit an empty form.
+    $edit = array();
+    $edit['ip'] = '';
+    $this->drupalPost('admin/config/people/ip-blocking', $edit, t('Add'));
+    $this->assertText(t('Enter a valid IP address.'));
+
+    // Pass an IP address as a URL parameter and submit it.
+    $submit_ip = '1.2.3.4';
+    $this->drupalPost('admin/config/people/ip-blocking/' . $submit_ip, NULL, t('Add'));
+    $ip = db_query("SELECT iid from {blocked_ips} WHERE ip = :ip", array(':ip' => $submit_ip))->fetchField();
+    $this->assertTrue($ip, t('IP address found in database'));
+    $this->assertRaw(t('The IP address %ip has been blocked.', array('%ip' => $submit_ip)), t('IP address was blocked.'));
+
+    // Submit your own IP address. This fails, although it works when testing manually.
+     // TODO: on some systems this test fails due to a bug or inconsistency in cURL.
+     // $edit = array();
+     // $edit['ip'] = ip_address();
+     // $this->drupalPost('admin/config/people/ip-blocking', $edit, t('Save'));
+     // $this->assertText(t('You may not block your own IP address.'));
+  }
+}
+
+class CronRunTestCase extends DrupalWebTestCase {
+  /**
+   * Implement getInfo().
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Cron run',
+      'description' => 'Test cron run.',
+      'group' => 'System'
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('common_test', 'common_test_cron_helper'));
+  }
+
+  /**
+   * Test cron runs.
+   */
+  function testCronRun() {
+    global $base_url;
+
+    // Run cron anonymously without any cron key.
+    $this->drupalGet($base_url . '/cron.php', array('external' => TRUE));
+    $this->assertResponse(403);
+
+    // Run cron anonymously with a random cron key.
+    $key = $this->randomName(16);
+    $this->drupalGet($base_url . '/cron.php', array('external' => TRUE, 'query' => array('cron_key' => $key)));
+    $this->assertResponse(403);
+
+    // Run cron anonymously with the valid cron key.
+    $key = variable_get('cron_key', 'drupal');
+    $this->drupalGet($base_url . '/cron.php', array('external' => TRUE, 'query' => array('cron_key' => $key)));
+    $this->assertResponse(200);
+  }
+
+  /**
+   * Ensure that the automatic cron run feature is working.
+   *
+   * In these tests we do not use REQUEST_TIME to track start time, because we
+   * need the exact time when cron is triggered.
+   */
+  function testAutomaticCron() {
+    // Ensure cron does not run when the cron threshold is enabled and was
+    // not passed.
+    $cron_last = time();
+    $cron_safe_threshold = 100;
+    variable_set('cron_last', $cron_last);
+    variable_set('cron_safe_threshold', $cron_safe_threshold);
+    $this->drupalGet('');
+    $this->assertTrue($cron_last == variable_get('cron_last', NULL), 'Cron does not run when the cron threshold is not passed.');
+
+    // Test if cron runs when the cron threshold was passed.
+    $cron_last = time() - 200;
+    variable_set('cron_last', $cron_last);
+    $this->drupalGet('');
+    sleep(1);
+    $this->assertTrue($cron_last < variable_get('cron_last', NULL), 'Cron runs when the cron threshold is passed.');
+
+    // Disable the cron threshold through the interface.
+    $admin_user = $this->drupalCreateUser(array('administer site configuration'));
+    $this->drupalLogin($admin_user);
+    $this->drupalPost('admin/config/system/cron', array('cron_safe_threshold' => 0), t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'));
+    $this->drupalLogout();
+
+    // Test if cron does not run when the cron threshold is disabled.
+    $cron_last = time() - 200;
+    variable_set('cron_last', $cron_last);
+    $this->drupalGet('');
+    $this->assertTrue($cron_last == variable_get('cron_last', NULL), 'Cron does not run when the cron threshold is disabled.');
+  }
+
+  /**
+   * Ensure that temporary files are removed.
+   *
+   * Create files for all the possible combinations of age and status. We are
+   * using UPDATE statements rather than file_save() because it would set the
+   * timestamp.
+   */
+  function testTempFileCleanup() {
+    // Temporary file that is older than DRUPAL_MAXIMUM_TEMP_FILE_AGE.
+    $temp_old = file_save_data('');
+    db_update('file_managed')
+      ->fields(array(
+        'status' => 0,
+        'timestamp' => 1,
+      ))
+      ->condition('fid', $temp_old->fid)
+      ->execute();
+    $this->assertTrue(file_exists($temp_old->uri), 'Old temp file was created correctly.');
+
+    // Temporary file that is less than DRUPAL_MAXIMUM_TEMP_FILE_AGE.
+    $temp_new = file_save_data('');
+    db_update('file_managed')
+      ->fields(array('status' => 0))
+      ->condition('fid', $temp_new->fid)
+      ->execute();
+    $this->assertTrue(file_exists($temp_new->uri), 'New temp file was created correctly.');
+
+    // Permanent file that is older than DRUPAL_MAXIMUM_TEMP_FILE_AGE.
+    $perm_old = file_save_data('');
+    db_update('file_managed')
+      ->fields(array('timestamp' => 1))
+      ->condition('fid', $temp_old->fid)
+      ->execute();
+    $this->assertTrue(file_exists($perm_old->uri), 'Old permanent file was created correctly.');
+
+    // Permanent file that is newer than DRUPAL_MAXIMUM_TEMP_FILE_AGE.
+    $perm_new = file_save_data('');
+    $this->assertTrue(file_exists($perm_new->uri), 'New permanent file was created correctly.');
+
+    // Run cron and then ensure that only the old, temp file was deleted.
+    $this->cronRun();
+    $this->assertFalse(file_exists($temp_old->uri), 'Old temp file was correctly removed.');
+    $this->assertTrue(file_exists($temp_new->uri), 'New temp file was correctly ignored.');
+    $this->assertTrue(file_exists($perm_old->uri), 'Old permanent file was correctly ignored.');
+    $this->assertTrue(file_exists($perm_new->uri), 'New permanent file was correctly ignored.');
+  }
+
+  /**
+   * Make sure exceptions thrown on hook_cron() don't affect other modules.
+   */
+  function testCronExceptions() {
+    variable_del('common_test_cron');
+    // The common_test module throws an exception. If it isn't caught, the tests
+    // won't finish successfully.
+    // The common_test_cron_helper module sets the 'common_test_cron' variable.
+    $this->cronRun();
+    $result = variable_get('common_test_cron');
+    $this->assertEqual($result, 'success', 'Cron correctly handles exceptions thrown during hook_cron() invocations.');
+  }
+}
+
+class AdminMetaTagTestCase extends DrupalWebTestCase {
+  /**
+   * Implement getInfo().
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Fingerprinting meta tag',
+      'description' => 'Confirm that the fingerprinting meta tag appears as expected.',
+      'group' => 'System'
+    );
+  }
+
+  /**
+   * Verify that the meta tag HTML is generated correctly.
+   */
+  public function testMetaTag() {
+    list($version, ) = explode('.', VERSION);
+    $string = '<meta name="Generator" content="Drupal ' . $version . ' (http://drupal.org)" />';
+    $this->drupalGet('node');
+    $this->assertRaw($string, 'Fingerprinting meta tag generated correctly.', 'System');
+  }
+}
+
+/**
+ * Tests custom access denied functionality.
+ */
+class AccessDeniedTestCase extends DrupalWebTestCase {
+  protected $admin_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => '403 functionality',
+      'description' => 'Tests page access denied functionality, including custom 403 pages.',
+      'group' => 'System'
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Create an administrative user.
+    $this->admin_user = $this->drupalCreateUser(array('access administration pages', 'administer site configuration', 'administer blocks'));
+  }
+
+  function testAccessDenied() {
+    $this->drupalGet('admin');
+    $this->assertText(t('Access denied'), 'Found the default 403 page');
+    $this->assertResponse(403);
+
+    $this->drupalLogin($this->admin_user);
+    $edit = array(
+      'title' => $this->randomName(10),
+      'body' => array(LANGUAGE_NONE => array(array('value' => $this->randomName(100)))),
+    );
+    $node = $this->drupalCreateNode($edit);
+
+    // Use a custom 403 page.
+    $this->drupalPost('admin/config/system/site-information', array('site_403' => 'node/' . $node->nid), t('Save configuration'));
+
+    $this->drupalLogout();
+    $this->drupalGet('admin');
+    $this->assertText($node->title, 'Found the custom 403 page');
+
+    // Logout and check that the user login block is shown on custom 403 pages.
+    $this->drupalLogout();
+
+    $this->drupalGet('admin');
+    $this->assertText($node->title, 'Found the custom 403 page');
+    $this->assertText(t('User login'), 'Blocks are shown on the custom 403 page');
+
+    // Log back in and remove the custom 403 page.
+    $this->drupalLogin($this->admin_user);
+    $this->drupalPost('admin/config/system/site-information', array('site_403' => ''), t('Save configuration'));
+
+    // Logout and check that the user login block is shown on default 403 pages.
+    $this->drupalLogout();
+
+    $this->drupalGet('admin');
+    $this->assertText(t('Access denied'), 'Found the default 403 page');
+    $this->assertResponse(403);
+    $this->assertText(t('User login'), 'Blocks are shown on the default 403 page');
+
+    // Log back in, set the custom 403 page to /user and remove the block
+    $this->drupalLogin($this->admin_user);
+    variable_set('site_403', 'user');
+    $this->drupalPost('admin/structure/block', array('blocks[user_login][region]' => '-1'), t('Save blocks'));
+
+    // Check that we can log in from the 403 page.
+    $this->drupalLogout();
+    $edit = array(
+      'name' => $this->admin_user->name,
+      'pass' => $this->admin_user->pass_raw,
+    );
+    $this->drupalPost('admin/config/system/site-information', $edit, t('Log in'));
+
+    // Check that we're still on the same page.
+    $this->assertText(t('Site information'));
+  }
+}
+
+class PageNotFoundTestCase extends DrupalWebTestCase {
+  protected $admin_user;
+
+  /**
+   * Implement getInfo().
+   */
+  public static function getInfo() {
+    return array(
+      'name' => '404 functionality',
+      'description' => "Tests page not found functionality, including custom 404 pages.",
+      'group' => 'System'
+    );
+  }
+
+  /**
+   * Implement setUp().
+   */
+  function setUp() {
+    parent::setUp();
+
+    // Create an administrative user.
+    $this->admin_user = $this->drupalCreateUser(array('administer site configuration'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  function testPageNotFound() {
+    $this->drupalGet($this->randomName(10));
+    $this->assertText(t('Page not found'), 'Found the default 404 page');
+
+    $edit = array(
+      'title' => $this->randomName(10),
+      'body' => array(LANGUAGE_NONE => array(array('value' => $this->randomName(100)))),
+    );
+    $node = $this->drupalCreateNode($edit);
+
+    // Use a custom 404 page.
+    $this->drupalPost('admin/config/system/site-information', array('site_404' => 'node/' . $node->nid), t('Save configuration'));
+
+    $this->drupalGet($this->randomName(10));
+    $this->assertText($node->title, 'Found the custom 404 page');
+  }
+}
+
+/**
+ * Tests site maintenance functionality.
+ */
+class SiteMaintenanceTestCase extends DrupalWebTestCase {
+  protected $admin_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Site maintenance mode functionality',
+      'description' => 'Test access to site while in maintenance mode.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Create a user allowed to access site in maintenance mode.
+    $this->user = $this->drupalCreateUser(array('access site in maintenance mode'));
+    // Create an administrative user.
+    $this->admin_user = $this->drupalCreateUser(array('administer site configuration', 'access site in maintenance mode'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Verify site maintenance mode functionality.
+   */
+  function testSiteMaintenance() {
+    // Turn on maintenance mode.
+    $edit = array(
+      'maintenance_mode' => 1,
+    );
+    $this->drupalPost('admin/config/development/maintenance', $edit, t('Save configuration'));
+
+    $admin_message = t('Operating in maintenance mode. <a href="@url">Go online.</a>', array('@url' => url('admin/config/development/maintenance')));
+    $user_message = t('Operating in maintenance mode.');
+    $offline_message = t('@site is currently under maintenance. We should be back shortly. Thank you for your patience.', array('@site' => variable_get('site_name', 'Drupal')));
+
+    $this->drupalGet('');
+    $this->assertRaw($admin_message, 'Found the site maintenance mode message.');
+
+    // Logout and verify that offline message is displayed.
+    $this->drupalLogout();
+    $this->drupalGet('');
+    $this->assertText($offline_message);
+    $this->drupalGet('node');
+    $this->assertText($offline_message);
+    $this->drupalGet('user/register');
+    $this->assertText($offline_message);
+
+    // Verify that user is able to log in.
+    $this->drupalGet('user');
+    $this->assertNoText($offline_message);
+    $this->drupalGet('user/login');
+    $this->assertNoText($offline_message);
+
+    // Log in user and verify that maintenance mode message is displayed
+    // directly after login.
+    $edit = array(
+      'name' => $this->user->name,
+      'pass' => $this->user->pass_raw,
+    );
+    $this->drupalPost(NULL, $edit, t('Log in'));
+    $this->assertText($user_message);
+
+    // Log in administrative user and configure a custom site offline message.
+    $this->drupalLogout();
+    $this->drupalLogin($this->admin_user);
+    $this->drupalGet('admin/config/development/maintenance');
+    $this->assertNoRaw($admin_message, 'Site maintenance mode message not displayed.');
+
+    $offline_message = 'Sorry, not online.';
+    $edit = array(
+      'maintenance_mode_message' => $offline_message,
+    );
+    $this->drupalPost(NULL, $edit, t('Save configuration'));
+
+    // Logout and verify that custom site offline message is displayed.
+    $this->drupalLogout();
+    $this->drupalGet('');
+    $this->assertRaw($offline_message, 'Found the site offline message.');
+
+    // Verify that custom site offline message is not displayed on user/password.
+    $this->drupalGet('user/password');
+    $this->assertText(t('Username or e-mail address'), 'Anonymous users can access user/password');
+
+    // Submit password reset form.
+    $edit = array(
+      'name' => $this->user->name,
+    );
+    $this->drupalPost('user/password', $edit, t('E-mail new password'));
+    $mails = $this->drupalGetMails();
+    $start = strpos($mails[0]['body'], 'user/reset/'. $this->user->uid);
+    $path = substr($mails[0]['body'], $start, 66 + strlen($this->user->uid));
+
+    // Log in with temporary login link.
+    $this->drupalPost($path, array(), t('Log in'));
+    $this->assertText($user_message);
+  }
+}
+
+/**
+ * Tests generic date and time handling capabilities of Drupal.
+ */
+class DateTimeFunctionalTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Date and time',
+      'description' => 'Configure date and time settings. Test date formatting and time zone handling, including daylight saving time.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('locale'));
+
+    // Create admin user and log in admin user.
+    $this->admin_user = $this->drupalCreateUser(array('administer site configuration'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+
+  /**
+   * Test time zones and DST handling.
+   */
+  function testTimeZoneHandling() {
+    // Setup date/time settings for Honolulu time.
+    variable_set('date_default_timezone', 'Pacific/Honolulu');
+    variable_set('configurable_timezones', 0);
+    variable_set('date_format_medium', 'Y-m-d H:i:s O');
+
+    // Create some nodes with different authored-on dates.
+    $date1 = '2007-01-31 21:00:00 -1000';
+    $date2 = '2007-07-31 21:00:00 -1000';
+    $node1 = $this->drupalCreateNode(array('created' => strtotime($date1), 'type' => 'article'));
+    $node2 = $this->drupalCreateNode(array('created' => strtotime($date2), 'type' => 'article'));
+
+    // Confirm date format and time zone.
+    $this->drupalGet("node/$node1->nid");
+    $this->assertText('2007-01-31 21:00:00 -1000', 'Date should be identical, with GMT offset of -10 hours.');
+    $this->drupalGet("node/$node2->nid");
+    $this->assertText('2007-07-31 21:00:00 -1000', 'Date should be identical, with GMT offset of -10 hours.');
+
+    // Set time zone to Los Angeles time.
+    variable_set('date_default_timezone', 'America/Los_Angeles');
+
+    // Confirm date format and time zone.
+    $this->drupalGet("node/$node1->nid");
+    $this->assertText('2007-01-31 23:00:00 -0800', 'Date should be two hours ahead, with GMT offset of -8 hours.');
+    $this->drupalGet("node/$node2->nid");
+    $this->assertText('2007-08-01 00:00:00 -0700', 'Date should be three hours ahead, with GMT offset of -7 hours.');
+  }
+
+  /**
+   * Test date type configuration.
+   */
+  function testDateTypeConfiguration() {
+    // Confirm system date types appear.
+    $this->drupalGet('admin/config/regional/date-time');
+    $this->assertText(t('Medium'), 'System date types appear in date type list.');
+    $this->assertNoRaw('href="/admin/config/regional/date-time/types/medium/delete"', 'No delete link appear for system date types.');
+
+    // Add custom date type.
+    $this->clickLink(t('Add date type'));
+    $date_type = strtolower($this->randomName(8));
+    $machine_name = 'machine_' . $date_type;
+    $date_format = 'd.m.Y - H:i';
+    $edit = array(
+      'date_type' => $date_type,
+      'machine_name' => $machine_name,
+      'date_format' => $date_format,
+    );
+    $this->drupalPost('admin/config/regional/date-time/types/add', $edit, t('Add date type'));
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/date-time', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->assertText(t('New date type added successfully.'), 'Date type added confirmation message appears.');
+    $this->assertText($date_type, 'Custom date type appears in the date type list.');
+    $this->assertText(t('delete'), 'Delete link for custom date type appears.');
+
+    // Delete custom date type.
+    $this->clickLink(t('delete'));
+    $this->drupalPost('admin/config/regional/date-time/types/' . $machine_name . '/delete', array(), t('Remove'));
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/date-time', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->assertText(t('Removed date type ' . $date_type), 'Custom date type removed.');
+  }
+
+  /**
+   * Test date format configuration.
+   */
+  function testDateFormatConfiguration() {
+    // Confirm 'no custom date formats available' message appears.
+    $this->drupalGet('admin/config/regional/date-time/formats');
+    $this->assertText(t('No custom date formats available.'), 'No custom date formats message appears.');
+
+    // Add custom date format.
+    $this->clickLink(t('Add format'));
+    $edit = array(
+      'date_format' => 'Y',
+    );
+    $this->drupalPost('admin/config/regional/date-time/formats/add', $edit, t('Add format'));
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/date-time/formats', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->assertNoText(t('No custom date formats available.'), 'No custom date formats message does not appear.');
+    $this->assertText(t('Custom date format added.'), 'Custom date format added.');
+
+    // Ensure custom date format appears in date type configuration options.
+    $this->drupalGet('admin/config/regional/date-time');
+    $this->assertRaw('<option value="Y">', 'Custom date format appears in options.');
+
+    // Edit custom date format.
+    $this->drupalGet('admin/config/regional/date-time/formats');
+    $this->clickLink(t('edit'));
+    $edit = array(
+      'date_format' => 'Y m',
+    );
+    $this->drupalPost($this->getUrl(), $edit, t('Save format'));
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/date-time/formats', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->assertText(t('Custom date format updated.'), 'Custom date format successfully updated.');
+
+    // Delete custom date format.
+    $this->clickLink(t('delete'));
+    $this->drupalPost($this->getUrl(), array(), t('Remove'));
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/date-time/formats', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->assertText(t('Removed date format'), 'Custom date format removed successfully.');
+  }
+
+  /**
+   * Test if the date formats are stored properly.
+   */
+  function testDateFormatStorage() {
+    $date_format = array(
+      'type' => 'short',
+      'format' => 'dmYHis',
+      'locked' => 0,
+      'is_new' => 1,
+    );
+    system_date_format_save($date_format);
+
+    $format = db_select('date_formats', 'df')
+      ->fields('df', array('format'))
+      ->condition('type', 'short')
+      ->condition('format', 'dmYHis')
+      ->execute()
+      ->fetchField();
+    $this->verbose($format);
+    $this->assertEqual('dmYHis', $format, 'Unlocalized date format resides in general table.');
+
+    $format = db_select('date_format_locale', 'dfl')
+      ->fields('dfl', array('format'))
+      ->condition('type', 'short')
+      ->condition('format', 'dmYHis')
+      ->execute()
+      ->fetchField();
+    $this->assertFalse($format, 'Unlocalized date format resides not in localized table.');
+
+    // Enable German language
+    locale_add_language('de', NULL, NULL, LANGUAGE_LTR, '', '', TRUE, 'en');
+
+    $date_format = array(
+      'type' => 'short',
+      'format' => 'YMDHis',
+      'locales' => array('de', 'tr'),
+      'locked' => 0,
+      'is_new' => 1,
+    );
+    system_date_format_save($date_format);
+
+    $format = db_select('date_format_locale', 'dfl')
+      ->fields('dfl', array('format'))
+      ->condition('type', 'short')
+      ->condition('format', 'YMDHis')
+      ->condition('language', 'de')
+      ->execute()
+      ->fetchField();
+    $this->assertEqual('YMDHis', $format, 'Localized date format resides in localized table.');
+
+    $format = db_select('date_formats', 'df')
+      ->fields('df', array('format'))
+      ->condition('type', 'short')
+      ->condition('format', 'YMDHis')
+      ->execute()
+      ->fetchField();
+    $this->assertEqual('YMDHis', $format, 'Localized date format resides in general table too.');
+
+    $format = db_select('date_format_locale', 'dfl')
+      ->fields('dfl', array('format'))
+      ->condition('type', 'short')
+      ->condition('format', 'YMDHis')
+      ->condition('language', 'tr')
+      ->execute()
+      ->fetchColumn();
+    $this->assertFalse($format, 'Localized date format for disabled language is ignored.');
+  }
+}
+
+class PageTitleFiltering extends DrupalWebTestCase {
+  protected $content_user;
+  protected $saved_title;
+
+  /**
+   * Implement getInfo().
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'HTML in page titles',
+      'description' => 'Tests correct handling or conversion by drupal_set_title() and drupal_get_title() and checks the correct escaping of site name and slogan.',
+      'group' => 'System'
+    );
+  }
+
+  /**
+   * Implement setUp().
+   */
+  function setUp() {
+    parent::setUp();
+
+    $this->content_user = $this->drupalCreateUser(array('create page content', 'access content', 'administer themes', 'administer site configuration'));
+    $this->drupalLogin($this->content_user);
+    $this->saved_title = drupal_get_title();
+  }
+
+  /**
+   * Reset page title.
+   */
+  function tearDown() {
+    // Restore the page title.
+    drupal_set_title($this->saved_title, PASS_THROUGH);
+
+    parent::tearDown();
+  }
+
+  /**
+   * Tests the handling of HTML by drupal_set_title() and drupal_get_title()
+   */
+  function testTitleTags() {
+    $title = "string with <em>HTML</em>";
+    // drupal_set_title's $filter is CHECK_PLAIN by default, so the title should be
+    // returned with check_plain().
+    drupal_set_title($title, CHECK_PLAIN);
+    $this->assertTrue(strpos(drupal_get_title(), '<em>') === FALSE, 'Tags in title converted to entities when $output is CHECK_PLAIN.');
+    // drupal_set_title's $filter is passed as PASS_THROUGH, so the title should be
+    // returned with HTML.
+    drupal_set_title($title, PASS_THROUGH);
+    $this->assertTrue(strpos(drupal_get_title(), '<em>') !== FALSE, 'Tags in title are not converted to entities when $output is PASS_THROUGH.');
+    // Generate node content.
+    $langcode = LANGUAGE_NONE;
+    $edit = array(
+      "title" => '!SimpleTest! ' . $title . $this->randomName(20),
+      "body[$langcode][0][value]" => '!SimpleTest! test body' . $this->randomName(200),
+    );
+    // Create the node with HTML in the title.
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+
+    $node = $this->drupalGetNodeByTitle($edit["title"]);
+    $this->assertNotNull($node, 'Node created and found in database');
+    $this->drupalGet("node/" . $node->nid);
+    $this->assertText(check_plain($edit["title"]), 'Check to make sure tags in the node title are converted.');
+  }
+  /**
+   * Test if the title of the site is XSS proof.
+   */
+  function testTitleXSS() {
+    // Set some title with JavaScript and HTML chars to escape.
+    $title = '</title><script type="text/javascript">alert("Title XSS!");</script> & < > " \' ';
+    $title_filtered = check_plain($title);
+
+    $slogan = '<script type="text/javascript">alert("Slogan XSS!");</script>';
+    $slogan_filtered = filter_xss_admin($slogan);
+
+    // Activate needed appearance settings.
+    $edit = array(
+      'toggle_name'           => TRUE,
+      'toggle_slogan'         => TRUE,
+      'toggle_main_menu'      => TRUE,
+      'toggle_secondary_menu' => TRUE,
+    );
+    $this->drupalPost('admin/appearance/settings', $edit, t('Save configuration'));
+
+    // Set title and slogan.
+    $edit = array(
+      'site_name'    => $title,
+      'site_slogan'  => $slogan,
+    );
+    $this->drupalPost('admin/config/system/site-information', $edit, t('Save configuration'));
+
+    // Load frontpage.
+    $this->drupalGet('');
+
+    // Test the title.
+    $this->assertNoRaw($title, 'Check for the unfiltered version of the title.');
+    // Adding </title> so we do not test the escaped version from drupal_set_title().
+    $this->assertRaw($title_filtered . '</title>', 'Check for the filtered version of the title.');
+
+    // Test the slogan.
+    $this->assertNoRaw($slogan, 'Check for the unfiltered version of the slogan.');
+    $this->assertRaw($slogan_filtered, 'Check for the filtered version of the slogan.');
+  }
+}
+
+/**
+ * Test front page functionality and administration.
+ */
+class FrontPageTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Front page',
+      'description' => 'Tests front page functionality and administration.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('system_test');
+
+    // Create admin user, log in admin user, and create one node.
+    $this->admin_user = $this->drupalCreateUser(array('access content', 'administer site configuration'));
+    $this->drupalLogin($this->admin_user);
+    $this->node_path = "node/" . $this->drupalCreateNode(array('promote' => 1))->nid;
+
+    // Enable front page logging in system_test.module.
+    variable_set('front_page_output', 1);
+  }
+
+  /**
+   * Test front page functionality.
+   */
+  function testDrupalIsFrontPage() {
+    $this->drupalGet('');
+    $this->assertText(t('On front page.'), 'Path is the front page.');
+    $this->drupalGet('node');
+    $this->assertText(t('On front page.'), 'Path is the front page.');
+    $this->drupalGet($this->node_path);
+    $this->assertNoText(t('On front page.'), 'Path is not the front page.');
+
+    // Change the front page to an invalid path.
+    $edit = array('site_frontpage' => 'kittens');
+    $this->drupalPost('admin/config/system/site-information', $edit, t('Save configuration'));
+    $this->assertText(t("The path '@path' is either invalid or you do not have access to it.", array('@path' => $edit['site_frontpage'])));
+
+    // Change the front page to a valid path.
+    $edit['site_frontpage'] = $this->node_path;
+    $this->drupalPost('admin/config/system/site-information', $edit, t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'The front page path has been saved.');
+
+    $this->drupalGet('');
+    $this->assertText(t('On front page.'), 'Path is the front page.');
+    $this->drupalGet('node');
+    $this->assertNoText(t('On front page.'), 'Path is not the front page.');
+    $this->drupalGet($this->node_path);
+    $this->assertText(t('On front page.'), 'Path is the front page.');
+  }
+}
+
+class SystemBlockTestCase extends DrupalWebTestCase {
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Block functionality',
+      'description' => 'Configure and move powered-by block.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('block');
+
+    // Create and login user
+    $admin_user = $this->drupalCreateUser(array('administer blocks', 'access administration pages'));
+    $this->drupalLogin($admin_user);
+  }
+
+  /**
+   * Test displaying and hiding the powered-by and help blocks.
+   */
+  function testSystemBlocks() {
+    // Set block title and some settings to confirm that the interface is available.
+    $this->drupalPost('admin/structure/block/manage/system/powered-by/configure', array('title' => $this->randomName(8)), t('Save block'));
+    $this->assertText(t('The block configuration has been saved.'), t('Block configuration set.'));
+
+    // Set the powered-by block to the footer region.
+    $edit = array();
+    $edit['blocks[system_powered-by][region]'] = 'footer';
+    $edit['blocks[system_main][region]'] = 'content';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->assertText(t('The block settings have been updated.'), t('Block successfully moved to footer region.'));
+
+    // Confirm that the block is being displayed.
+    $this->drupalGet('node');
+    $this->assertRaw('id="block-system-powered-by"', t('Block successfully being displayed on the page.'));
+
+    // Set the block to the disabled region.
+    $edit = array();
+    $edit['blocks[system_powered-by][region]'] = '-1';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+
+    // Confirm that the block is hidden.
+    $this->assertNoRaw('id="block-system-powered-by"', t('Block no longer appears on page.'));
+
+    // For convenience of developers, set the block to its default settings.
+    $edit = array();
+    $edit['blocks[system_powered-by][region]'] = 'footer';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+    $this->drupalPost('admin/structure/block/manage/system/powered-by/configure', array('title' => ''), t('Save block'));
+
+    // Set the help block to the help region.
+    $edit = array();
+    $edit['blocks[system_help][region]'] = 'help';
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+
+    // Test displaying the help block with block caching enabled.
+    variable_set('block_cache', TRUE);
+    $this->drupalGet('admin/structure/block/add');
+    $this->assertRaw(t('Use this page to create a new custom block.'));
+    $this->drupalGet('admin/index');
+    $this->assertRaw(t('This page shows you all available administration tasks for each module.'));
+  }
+}
+
+/**
+ * Test main content rendering fallback provided by system module.
+ */
+class SystemMainContentFallback extends DrupalWebTestCase {
+  protected $admin_user;
+  protected $web_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Main content rendering fallback',
+      'description' => ' Test system module main content rendering fallback.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('system_test');
+
+    // Create and login admin user.
+    $this->admin_user = $this->drupalCreateUser(array(
+      'access administration pages',
+      'administer site configuration',
+      'administer modules',
+      'administer blocks',
+      'administer nodes',
+    ));
+    $this->drupalLogin($this->admin_user);
+
+    // Create a web user.
+    $this->web_user = $this->drupalCreateUser(array('access user profiles', 'access content'));
+  }
+
+  /**
+   * Test availability of main content.
+   */
+  function testMainContentFallback() {
+    $edit = array();
+    // Disable the dashboard module, which depends on the block module.
+    $edit['modules[Core][dashboard][enable]'] = FALSE;
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'Modules status has been updated.');
+    // Disable the block module.
+    $edit['modules[Core][block][enable]'] = FALSE;
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'Modules status has been updated.');
+    module_list(TRUE);
+    $this->assertFalse(module_exists('block'), 'Block module disabled.');
+
+    // At this point, no region is filled and fallback should be triggered.
+    $this->drupalGet('admin/config/system/site-information');
+    $this->assertField('site_name', 'Admin interface still available.');
+
+    // Fallback should not trigger when another module is handling content.
+    $this->drupalGet('system-test/main-content-handling');
+    $this->assertRaw('id="system-test-content"', 'Content handled by another module');
+    $this->assertText(t('Content to test main content fallback'), 'Main content still displayed.');
+
+    // Fallback should trigger when another module
+    // indicates that it is not handling the content.
+    $this->drupalGet('system-test/main-content-fallback');
+    $this->assertText(t('Content to test main content fallback'), 'Main content fallback properly triggers.');
+
+    // Fallback should not trigger when another module is handling content.
+    // Note that this test ensures that no duplicate
+    // content gets created by the fallback.
+    $this->drupalGet('system-test/main-content-duplication');
+    $this->assertNoText(t('Content to test main content fallback'), 'Main content not duplicated.');
+
+    // Request a user* page and see if it is displayed.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('user/' . $this->web_user->uid . '/edit');
+    $this->assertField('mail', 'User interface still available.');
+
+    // Enable the block module again.
+    $this->drupalLogin($this->admin_user);
+    $edit = array();
+    $edit['modules[Core][block][enable]'] = 'block';
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'Modules status has been updated.');
+    module_list(TRUE);
+    $this->assertTrue(module_exists('block'), 'Block module re-enabled.');
+  }
+}
+
+/**
+ * Tests for the theme interface functionality.
+ */
+class SystemThemeFunctionalTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Theme interface functionality',
+      'description' => 'Tests the theme interface functionality by enabling and switching themes, and using an administration theme.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    $this->admin_user = $this->drupalCreateUser(array('access administration pages', 'view the administration theme', 'administer themes', 'bypass node access', 'administer blocks'));
+    $this->drupalLogin($this->admin_user);
+    $this->node = $this->drupalCreateNode();
+  }
+
+  /**
+   * Test the theme settings form.
+   */
+  function testThemeSettings() {
+    // Specify a filesystem path to be used for the logo.
+    $file = current($this->drupalGetTestFiles('image'));
+    $file_relative = strtr($file->uri, array('public:/' => variable_get('file_public_path', conf_path() . '/files')));
+    $default_theme_path = 'themes/stark';
+
+    $supported_paths = array(
+      // Raw stream wrapper URI.
+      $file->uri => array(
+        'form' => file_uri_target($file->uri),
+        'src' => file_create_url($file->uri),
+      ),
+      // Relative path within the public filesystem.
+      file_uri_target($file->uri) => array(
+        'form' => file_uri_target($file->uri),
+        'src' => file_create_url($file->uri),
+      ),
+      // Relative path to a public file.
+      $file_relative => array(
+        'form' => $file_relative,
+        'src' => file_create_url($file->uri),
+      ),
+      // Relative path to an arbitrary file.
+      'misc/druplicon.png' => array(
+        'form' => 'misc/druplicon.png',
+        'src' => $GLOBALS['base_url'] . '/' . 'misc/druplicon.png',
+      ),
+      // Relative path to a file in a theme.
+      $default_theme_path . '/logo.png' => array(
+        'form' => $default_theme_path . '/logo.png',
+        'src' => $GLOBALS['base_url'] . '/' . $default_theme_path . '/logo.png',
+      ),
+    );
+    foreach ($supported_paths as $input => $expected) {
+      $edit = array(
+        'default_logo' => FALSE,
+        'logo_path' => $input,
+      );
+      $this->drupalPost('admin/appearance/settings', $edit, t('Save configuration'));
+      $this->assertNoText('The custom logo path is invalid.');
+      $this->assertFieldByName('logo_path', $expected['form']);
+
+      // Verify the actual 'src' attribute of the logo being output.
+      $this->drupalGet('');
+      $elements = $this->xpath('//*[@id=:id]/img', array(':id' => 'logo'));
+      $this->assertEqual((string) $elements[0]['src'], $expected['src']);
+    }
+
+    $unsupported_paths = array(
+      // Stream wrapper URI to non-existing file.
+      'public://whatever.png',
+      'private://whatever.png',
+      'temporary://whatever.png',
+      // Bogus stream wrapper URIs.
+      'public:/whatever.png',
+      '://whatever.png',
+      ':whatever.png',
+      'public://',
+      // Relative path within the public filesystem to non-existing file.
+      'whatever.png',
+      // Relative path to non-existing file in public filesystem.
+      variable_get('file_public_path', conf_path() . '/files') . '/whatever.png',
+      // Semi-absolute path to non-existing file in public filesystem.
+      '/' . variable_get('file_public_path', conf_path() . '/files') . '/whatever.png',
+      // Relative path to arbitrary non-existing file.
+      'misc/whatever.png',
+      // Semi-absolute path to arbitrary non-existing file.
+      '/misc/whatever.png',
+      // Absolute paths to any local file (even if it exists).
+      drupal_realpath($file->uri),
+    );
+    $this->drupalGet('admin/appearance/settings');
+    foreach ($unsupported_paths as $path) {
+      $edit = array(
+        'default_logo' => FALSE,
+        'logo_path' => $path,
+      );
+      $this->drupalPost(NULL, $edit, t('Save configuration'));
+      $this->assertText('The custom logo path is invalid.');
+    }
+
+    // Upload a file to use for the logo.
+    $edit = array(
+      'default_logo' => FALSE,
+      'logo_path' => '',
+      'files[logo_upload]' => drupal_realpath($file->uri),
+    );
+    $this->drupalPost('admin/appearance/settings', $edit, t('Save configuration'));
+
+    $fields = $this->xpath($this->constructFieldXpath('name', 'logo_path'));
+    $uploaded_filename = 'public://' . $fields[0]['value'];
+
+    $this->drupalGet('');
+    $elements = $this->xpath('//*[@id=:id]/img', array(':id' => 'logo'));
+    $this->assertEqual($elements[0]['src'], file_create_url($uploaded_filename));
+  }
+
+  /**
+   * Test the administration theme functionality.
+   */
+  function testAdministrationTheme() {
+    theme_enable(array('stark'));
+    variable_set('theme_default', 'stark');
+    // Enable an administration theme and show it on the node admin pages.
+    $edit = array(
+      'admin_theme' => 'seven',
+      'node_admin_theme' => TRUE,
+    );
+    $this->drupalPost('admin/appearance', $edit, t('Save configuration'));
+
+    $this->drupalGet('admin/config');
+    $this->assertRaw('themes/seven', 'Administration theme used on an administration page.');
+
+    $this->drupalGet('node/' . $this->node->nid);
+    $this->assertRaw('themes/stark', 'Site default theme used on node page.');
+
+    $this->drupalGet('node/add');
+    $this->assertRaw('themes/seven', 'Administration theme used on the add content page.');
+
+    $this->drupalGet('node/' . $this->node->nid . '/edit');
+    $this->assertRaw('themes/seven', 'Administration theme used on the edit content page.');
+
+    // Disable the admin theme on the node admin pages.
+    $edit = array(
+      'node_admin_theme' => FALSE,
+    );
+    $this->drupalPost('admin/appearance', $edit, t('Save configuration'));
+
+    $this->drupalGet('admin/config');
+    $this->assertRaw('themes/seven', 'Administration theme used on an administration page.');
+
+    $this->drupalGet('node/add');
+    $this->assertRaw('themes/stark', 'Site default theme used on the add content page.');
+
+    // Reset to the default theme settings.
+    variable_set('theme_default', 'bartik');
+    $edit = array(
+      'admin_theme' => '0',
+      'node_admin_theme' => FALSE,
+    );
+    $this->drupalPost('admin/appearance', $edit, t('Save configuration'));
+
+    $this->drupalGet('admin');
+    $this->assertRaw('themes/bartik', 'Site default theme used on administration page.');
+
+    $this->drupalGet('node/add');
+    $this->assertRaw('themes/bartik', 'Site default theme used on the add content page.');
+  }
+
+  /**
+   * Test switching the default theme.
+   */
+  function testSwitchDefaultTheme() {
+    // Enable "stark" and set it as the default theme.
+    theme_enable(array('stark'));
+    $this->drupalGet('admin/appearance');
+    $this->clickLink(t('Set default'), 1);
+    $this->assertTrue(variable_get('theme_default', '') == 'stark', 'Site default theme switched successfully.');
+
+    // Test the default theme on the secondary links (blocks admin page).
+    $this->drupalGet('admin/structure/block');
+    $this->assertText('Stark(' . t('active tab') . ')', 'Default local task on blocks admin page is the default theme.');
+    // Switch back to Bartik and test again to test that the menu cache is cleared.
+    $this->drupalGet('admin/appearance');
+    $this->clickLink(t('Set default'), 0);
+    $this->drupalGet('admin/structure/block');
+    $this->assertText('Bartik(' . t('active tab') . ')', 'Default local task on blocks admin page has changed.');
+  }
+}
+
+
+/**
+ * Test the basic queue functionality.
+ */
+class QueueTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Queue functionality',
+      'description' => 'Queues and dequeues a set of items to check the basic queue functionality.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Queues and dequeues a set of items to check the basic queue functionality.
+   */
+  function testQueue() {
+    // Create two queues.
+    $queue1 = DrupalQueue::get($this->randomName());
+    $queue1->createQueue();
+    $queue2 = DrupalQueue::get($this->randomName());
+    $queue2->createQueue();
+
+    // Create four items.
+    $data = array();
+    for ($i = 0; $i < 4; $i++) {
+      $data[] = array($this->randomName() => $this->randomName());
+    }
+
+    // Queue items 1 and 2 in the queue1.
+    $queue1->createItem($data[0]);
+    $queue1->createItem($data[1]);
+
+    // Retrieve two items from queue1.
+    $items = array();
+    $new_items = array();
+
+    $items[] = $item = $queue1->claimItem();
+    $new_items[] = $item->data;
+
+    $items[] = $item = $queue1->claimItem();
+    $new_items[] = $item->data;
+
+    // First two dequeued items should match the first two items we queued.
+    $this->assertEqual($this->queueScore($data, $new_items), 2, 'Two items matched');
+
+    // Add two more items.
+    $queue1->createItem($data[2]);
+    $queue1->createItem($data[3]);
+
+    $this->assertTrue($queue1->numberOfItems(), 'Queue 1 is not empty after adding items.');
+    $this->assertFalse($queue2->numberOfItems(), 'Queue 2 is empty while Queue 1 has items');
+
+    $items[] = $item = $queue1->claimItem();
+    $new_items[] = $item->data;
+
+    $items[] = $item = $queue1->claimItem();
+    $new_items[] = $item->data;
+
+    // All dequeued items should match the items we queued exactly once,
+    // therefore the score must be exactly 4.
+    $this->assertEqual($this->queueScore($data, $new_items), 4, 'Four items matched');
+
+    // There should be no duplicate items.
+    $this->assertEqual($this->queueScore($new_items, $new_items), 4, 'Four items matched');
+
+    // Delete all items from queue1.
+    foreach ($items as $item) {
+      $queue1->deleteItem($item);
+    }
+
+    // Check that both queues are empty.
+    $this->assertFalse($queue1->numberOfItems(), 'Queue 1 is empty');
+    $this->assertFalse($queue2->numberOfItems(), 'Queue 2 is empty');
+  }
+
+  /**
+   * This function returns the number of equal items in two arrays.
+   */
+  function queueScore($items, $new_items) {
+    $score = 0;
+    foreach ($items as $item) {
+      foreach ($new_items as $new_item) {
+        if ($item === $new_item) {
+          $score++;
+        }
+      }
+    }
+    return $score;
+  }
+}
+
+/**
+ * Test token replacement in strings.
+ */
+class TokenReplaceTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Token replacement',
+      'description' => 'Generates text using placeholders for dummy content to check token replacement.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Creates a user and a node, then tests the tokens generated from them.
+   */
+  function testTokenReplacement() {
+    // Create the initial objects.
+    $account = $this->drupalCreateUser();
+    $node = $this->drupalCreateNode(array('uid' => $account->uid));
+    $node->title = '<blink>Blinking Text</blink>';
+    global $user, $language;
+
+    $source  = '[node:title]';         // Title of the node we passed in
+    $source .= '[node:author:name]';   // Node author's name
+    $source .= '[node:created:since]'; // Time since the node was created
+    $source .= '[current-user:name]';  // Current user's name
+    $source .= '[date:short]';         // Short date format of REQUEST_TIME
+    $source .= '[user:name]';          // No user passed in, should be untouched
+    $source .= '[bogus:token]';        // Non-existent token
+
+    $target  = check_plain($node->title);
+    $target .= check_plain($account->name);
+    $target .= format_interval(REQUEST_TIME - $node->created, 2, $language->language);
+    $target .= check_plain($user->name);
+    $target .= format_date(REQUEST_TIME, 'short', '', NULL, $language->language);
+
+    // Test that the clear parameter cleans out non-existent tokens.
+    $result = token_replace($source, array('node' => $node), array('language' => $language, 'clear' => TRUE));
+    $result = $this->assertEqual($target, $result, 'Valid tokens replaced while invalid tokens cleared out.');
+
+    // Test without using the clear parameter (non-existent token untouched).
+    $target .= '[user:name]';
+    $target .= '[bogus:token]';
+    $result = token_replace($source, array('node' => $node), array('language' => $language));
+    $this->assertEqual($target, $result, 'Valid tokens replaced while invalid tokens ignored.');
+
+    // Check that the results of token_generate are sanitized properly. This does NOT
+    // test the cleanliness of every token -- just that the $sanitize flag is being
+    // passed properly through the call stack and being handled correctly by a 'known'
+    // token, [node:title].
+    $raw_tokens = array('title' => '[node:title]');
+    $generated = token_generate('node', $raw_tokens, array('node' => $node));
+    $this->assertEqual($generated['[node:title]'], check_plain($node->title), 'Token sanitized.');
+
+    $generated = token_generate('node', $raw_tokens, array('node' => $node), array('sanitize' => FALSE));
+    $this->assertEqual($generated['[node:title]'], $node->title, 'Unsanitized token generated properly.');
+
+    // Test token replacement when the string contains no tokens.
+    $this->assertEqual(token_replace('No tokens here.'), 'No tokens here.');
+  }
+
+  /**
+   * Test whether token-replacement works in various contexts.
+   */
+  function testSystemTokenRecognition() {
+    global $language;
+
+    // Generate prefixes and suffixes for the token context.
+    $tests = array(
+      array('prefix' => 'this is the ', 'suffix' => ' site'),
+      array('prefix' => 'this is the', 'suffix' => 'site'),
+      array('prefix' => '[', 'suffix' => ']'),
+      array('prefix' => '', 'suffix' => ']]]'),
+      array('prefix' => '[[[', 'suffix' => ''),
+      array('prefix' => ':[:', 'suffix' => '--]'),
+      array('prefix' => '-[-', 'suffix' => ':]:'),
+      array('prefix' => '[:', 'suffix' => ']'),
+      array('prefix' => '[site:', 'suffix' => ':name]'),
+      array('prefix' => '[site:', 'suffix' => ']'),
+    );
+
+    // Check if the token is recognized in each of the contexts.
+    foreach ($tests as $test) {
+      $input = $test['prefix'] . '[site:name]' . $test['suffix'];
+      $expected = $test['prefix'] . 'Drupal' . $test['suffix'];
+      $output = token_replace($input, array(), array('language' => $language));
+      $this->assertTrue($output == $expected, format_string('Token recognized in string %string', array('%string' => $input)));
+    }
+  }
+
+  /**
+   * Tests the generation of all system site information tokens.
+   */
+  function testSystemSiteTokenReplacement() {
+    global $language;
+    $url_options = array(
+      'absolute' => TRUE,
+      'language' => $language,
+    );
+
+    // Set a few site variables.
+    variable_set('site_name', '<strong>Drupal<strong>');
+    variable_set('site_slogan', '<blink>Slogan</blink>');
+
+    // Generate and test sanitized tokens.
+    $tests = array();
+    $tests['[site:name]'] = check_plain(variable_get('site_name', 'Drupal'));
+    $tests['[site:slogan]'] = check_plain(variable_get('site_slogan', ''));
+    $tests['[site:mail]'] = 'simpletest@example.com';
+    $tests['[site:url]'] = url('<front>', $url_options);
+    $tests['[site:url-brief]'] = preg_replace(array('!^https?://!', '!/$!'), '', url('<front>', $url_options));
+    $tests['[site:login-url]'] = url('user', $url_options);
+
+    // Test to make sure that we generated something for each token.
+    $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array(), array('language' => $language));
+      $this->assertEqual($output, $expected, format_string('Sanitized system site information token %token replaced.', array('%token' => $input)));
+    }
+
+    // Generate and test unsanitized tokens.
+    $tests['[site:name]'] = variable_get('site_name', 'Drupal');
+    $tests['[site:slogan]'] = variable_get('site_slogan', '');
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array(), array('language' => $language, 'sanitize' => FALSE));
+      $this->assertEqual($output, $expected, format_string('Unsanitized system site information token %token replaced.', array('%token' => $input)));
+    }
+  }
+
+  /**
+   * Tests the generation of all system date tokens.
+   */
+  function testSystemDateTokenReplacement() {
+    global $language;
+
+    // Set time to one hour before request.
+    $date = REQUEST_TIME - 3600;
+
+    // Generate and test tokens.
+    $tests = array();
+    $tests['[date:short]'] = format_date($date, 'short', '', NULL, $language->language);
+    $tests['[date:medium]'] = format_date($date, 'medium', '', NULL, $language->language);
+    $tests['[date:long]'] = format_date($date, 'long', '', NULL, $language->language);
+    $tests['[date:custom:m/j/Y]'] = format_date($date, 'custom', 'm/j/Y', NULL, $language->language);
+    $tests['[date:since]'] = format_interval((REQUEST_TIME - $date), 2, $language->language);
+    $tests['[date:raw]'] = filter_xss($date);
+
+    // Test to make sure that we generated something for each token.
+    $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('date' => $date), array('language' => $language));
+      $this->assertEqual($output, $expected, format_string('Date token %token replaced.', array('%token' => $input)));
+    }
+  }
+}
+
+class InfoFileParserTestCase extends DrupalUnitTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Info file format parser',
+      'description' => 'Tests proper parsing of a .info file formatted string.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Test drupal_parse_info_format().
+   */
+  function testDrupalParseInfoFormat() {
+    $config = '
+simple = Value
+quoted = " Value"
+multiline = "Value
+  Value"
+array[] = Value1
+array[] = Value2
+array_assoc[a] = Value1
+array_assoc[b] = Value2
+array_deep[][][] = Value
+array_deep_assoc[a][b][c] = Value
+array_space[a b] = Value';
+
+    $expected = array(
+      'simple' => 'Value',
+      'quoted' => ' Value',
+      'multiline' => "Value\n  Value",
+      'array' => array(
+        0 => 'Value1',
+        1 => 'Value2',
+      ),
+      'array_assoc' => array(
+        'a' => 'Value1',
+        'b' => 'Value2',
+      ),
+      'array_deep' => array(
+        0 => array(
+          0 => array(
+            0 => 'Value',
+          ),
+        ),
+      ),
+      'array_deep_assoc' => array(
+        'a' => array(
+          'b' => array(
+            'c' => 'Value',
+          ),
+        ),
+      ),
+      'array_space' => array(
+        'a b' => 'Value',
+      ),
+    );
+
+    $parsed = drupal_parse_info_format($config);
+
+    $this->assertEqual($parsed['simple'], $expected['simple'], 'Set a simple value.');
+    $this->assertEqual($parsed['quoted'], $expected['quoted'], 'Set a simple value in quotes.');
+    $this->assertEqual($parsed['multiline'], $expected['multiline'], 'Set a multiline value.');
+    $this->assertEqual($parsed['array'], $expected['array'], 'Set a simple array.');
+    $this->assertEqual($parsed['array_assoc'], $expected['array_assoc'], 'Set an associative array.');
+    $this->assertEqual($parsed['array_deep'], $expected['array_deep'], 'Set a nested array.');
+    $this->assertEqual($parsed['array_deep_assoc'], $expected['array_deep_assoc'], 'Set a nested associative array.');
+    $this->assertEqual($parsed['array_space'], $expected['array_space'], 'Set an array with a whitespace in the key.');
+    $this->assertEqual($parsed, $expected, 'Entire parsed .info string and expected array are identical.');
+  }
+}
+
+/**
+ * Tests the effectiveness of hook_system_info_alter().
+ */
+class SystemInfoAlterTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'System info alter',
+      'description' => 'Tests the effectiveness of hook_system_info_alter().',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Tests that {system}.info is rebuilt after a module that implements
+   * hook_system_info_alter() is enabled. Also tests if core *_list() functions
+   * return freshly altered info.
+   */
+  function testSystemInfoAlter() {
+    // Enable our test module. Flush all caches, which we assert is the only
+    // thing necessary to use the rebuilt {system}.info.
+    module_enable(array('module_test'), FALSE);
+    drupal_flush_all_caches();
+    $this->assertTrue(module_exists('module_test'), 'Test module is enabled.');
+
+    $info = $this->getSystemInfo('seven', 'theme');
+    $this->assertTrue(isset($info['regions']['test_region']), 'Altered theme info was added to {system}.info.');
+    $seven_regions = system_region_list('seven');
+    $this->assertTrue(isset($seven_regions['test_region']), 'Altered theme info was returned by system_region_list().');
+    $system_list_themes = system_list('theme');
+    $info = $system_list_themes['seven']->info;
+    $this->assertTrue(isset($info['regions']['test_region']), 'Altered theme info was returned by system_list().');
+    $list_themes = list_themes();
+    $this->assertTrue(isset($list_themes['seven']->info['regions']['test_region']), 'Altered theme info was returned by list_themes().');
+
+    // Disable the module and verify that {system}.info is rebuilt without it.
+    module_disable(array('module_test'), FALSE);
+    drupal_flush_all_caches();
+    $this->assertFalse(module_exists('module_test'), 'Test module is disabled.');
+
+    $info = $this->getSystemInfo('seven', 'theme');
+    $this->assertFalse(isset($info['regions']['test_region']), 'Altered theme info was removed from {system}.info.');
+    $seven_regions = system_region_list('seven');
+    $this->assertFalse(isset($seven_regions['test_region']), 'Altered theme info was not returned by system_region_list().');
+    $system_list_themes = system_list('theme');
+    $info = $system_list_themes['seven']->info;
+    $this->assertFalse(isset($info['regions']['test_region']), 'Altered theme info was not returned by system_list().');
+    $list_themes = list_themes();
+    $this->assertFalse(isset($list_themes['seven']->info['regions']['test_region']), 'Altered theme info was not returned by list_themes().');
+  }
+
+  /**
+   * Returns the info array as it is stored in {system}.
+   *
+   * @param $name
+   *   The name of the record in {system}.
+   * @param $type
+   *   The type of record in {system}.
+   *
+   * @return
+   *   Array of info, or FALSE if the record is not found.
+   */
+  function getSystemInfo($name, $type) {
+    $raw_info = db_query("SELECT info FROM {system} WHERE name = :name AND type = :type", array(':name' => $name, ':type' => $type))->fetchField();
+    return $raw_info ? unserialize($raw_info) : FALSE;
+  }
+}
+
+/**
+ * Tests for the update system functionality.
+ */
+class UpdateScriptFunctionalTest extends DrupalWebTestCase {
+  private $update_url;
+  private $update_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Update functionality',
+      'description' => 'Tests the update script access and functionality.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('update_script_test');
+    $this->update_url = $GLOBALS['base_url'] . '/update.php';
+    $this->update_user = $this->drupalCreateUser(array('administer software updates'));
+  }
+
+  /**
+   * Tests access to the update script.
+   */
+  function testUpdateAccess() {
+    // Try accessing update.php without the proper permission.
+    $regular_user = $this->drupalCreateUser();
+    $this->drupalLogin($regular_user);
+    $this->drupalGet($this->update_url, array('external' => TRUE));
+    $this->assertResponse(403);
+
+    // Try accessing update.php as an anonymous user.
+    $this->drupalLogout();
+    $this->drupalGet($this->update_url, array('external' => TRUE));
+    $this->assertResponse(403);
+
+    // Access the update page with the proper permission.
+    $this->drupalLogin($this->update_user);
+    $this->drupalGet($this->update_url, array('external' => TRUE));
+    $this->assertResponse(200);
+
+    // Access the update page as user 1.
+    $user1 = user_load(1);
+    $user1->pass_raw = user_password();
+    require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
+    $user1->pass = user_hash_password(trim($user1->pass_raw));
+    db_query("UPDATE {users} SET pass = :pass WHERE uid = :uid", array(':pass' => $user1->pass, ':uid' => $user1->uid));
+    $this->drupalLogin($user1);
+    $this->drupalGet($this->update_url, array('external' => TRUE));
+    $this->assertResponse(200);
+  }
+
+  /**
+   * Tests that requirements warnings and errors are correctly displayed.
+   */
+  function testRequirements() {
+    $this->drupalLogin($this->update_user);
+
+    // If there are no requirements warnings or errors, we expect to be able to
+    // go through the update process uninterrupted.
+    $this->drupalGet($this->update_url, array('external' => TRUE));
+    $this->drupalPost(NULL, array(), t('Continue'));
+    $this->assertText(t('No pending updates.'), 'End of update process was reached.');
+    // Confirm that all caches were cleared.
+    $this->assertText(t('hook_flush_caches() invoked for update_script_test.module.'), 'Caches were cleared when there were no requirements warnings or errors.');
+
+    // If there is a requirements warning, we expect it to be initially
+    // displayed, but clicking the link to proceed should allow us to go
+    // through the rest of the update process uninterrupted.
+
+    // First, run this test with pending updates to make sure they can be run
+    // successfully.
+    variable_set('update_script_test_requirement_type', REQUIREMENT_WARNING);
+    drupal_set_installed_schema_version('update_script_test', drupal_get_installed_schema_version('update_script_test') - 1);
+    $this->drupalGet($this->update_url, array('external' => TRUE));
+    $this->assertText('This is a requirements warning provided by the update_script_test module.');
+    $this->clickLink('try again');
+    $this->assertNoText('This is a requirements warning provided by the update_script_test module.');
+    $this->drupalPost(NULL, array(), t('Continue'));
+    $this->drupalPost(NULL, array(), t('Apply pending updates'));
+    $this->assertText(t('The update_script_test_update_7000() update was executed successfully.'), 'End of update process was reached.');
+    // Confirm that all caches were cleared.
+    $this->assertText(t('hook_flush_caches() invoked for update_script_test.module.'), 'Caches were cleared after resolving a requirements warning and applying updates.');
+
+    // Now try again without pending updates to make sure that works too.
+    $this->drupalGet($this->update_url, array('external' => TRUE));
+    $this->assertText('This is a requirements warning provided by the update_script_test module.');
+    $this->clickLink('try again');
+    $this->assertNoText('This is a requirements warning provided by the update_script_test module.');
+    $this->drupalPost(NULL, array(), t('Continue'));
+    $this->assertText(t('No pending updates.'), 'End of update process was reached.');
+    // Confirm that all caches were cleared.
+    $this->assertText(t('hook_flush_caches() invoked for update_script_test.module.'), 'Caches were cleared after applying updates and re-running the script.');
+
+    // If there is a requirements error, it should be displayed even after
+    // clicking the link to proceed (since the problem that triggered the error
+    // has not been fixed).
+    variable_set('update_script_test_requirement_type', REQUIREMENT_ERROR);
+    $this->drupalGet($this->update_url, array('external' => TRUE));
+    $this->assertText('This is a requirements error provided by the update_script_test module.');
+    $this->clickLink('try again');
+    $this->assertText('This is a requirements error provided by the update_script_test module.');
+  }
+
+  /**
+   * Tests the effect of using the update script on the theme system.
+   */
+  function testThemeSystem() {
+    // Since visiting update.php triggers a rebuild of the theme system from an
+    // unusual maintenance mode environment, we check that this rebuild did not
+    // put any incorrect information about the themes into the database.
+    $original_theme_data = db_query("SELECT * FROM {system} WHERE type = 'theme' ORDER BY name")->fetchAll();
+    $this->drupalLogin($this->update_user);
+    $this->drupalGet($this->update_url, array('external' => TRUE));
+    $final_theme_data = db_query("SELECT * FROM {system} WHERE type = 'theme' ORDER BY name")->fetchAll();
+    $this->assertEqual($original_theme_data, $final_theme_data, 'Visiting update.php does not alter the information about themes stored in the database.');
+  }
+
+  /**
+   * Tests update.php when there are no updates to apply.
+   */
+  function testNoUpdateFunctionality() {
+    // Click through update.php with 'administer software updates' permission.
+    $this->drupalLogin($this->update_user);
+    $this->drupalPost($this->update_url, array(), t('Continue'), array('external' => TRUE));
+    $this->assertText(t('No pending updates.'));
+    $this->assertNoLink('Administration pages');
+    $this->clickLink('Front page');
+    $this->assertResponse(200);
+
+    // Click through update.php with 'access administration pages' permission.
+    $admin_user = $this->drupalCreateUser(array('administer software updates', 'access administration pages'));
+    $this->drupalLogin($admin_user);
+    $this->drupalPost($this->update_url, array(), t('Continue'), array('external' => TRUE));
+    $this->assertText(t('No pending updates.'));
+    $this->clickLink('Administration pages');
+    $this->assertResponse(200);
+  }
+
+  /**
+   * Tests update.php after performing a successful update.
+   */
+  function testSuccessfulUpdateFunctionality() {
+    drupal_set_installed_schema_version('update_script_test', drupal_get_installed_schema_version('update_script_test') - 1);
+    // Click through update.php with 'administer software updates' permission.
+    $this->drupalLogin($this->update_user);
+    $this->drupalPost($this->update_url, array(), t('Continue'), array('external' => TRUE));
+    $this->drupalPost(NULL, array(), t('Apply pending updates'));
+    $this->assertText('Updates were attempted.');
+    $this->assertLink('site');
+    $this->assertNoLink('Administration pages');
+    $this->assertNoLink('logged');
+    $this->clickLink('Front page');
+    $this->assertResponse(200);
+
+    drupal_set_installed_schema_version('update_script_test', drupal_get_installed_schema_version('update_script_test') - 1);
+    // Click through update.php with 'access administration pages' and
+    // 'access site reports' permissions.
+    $admin_user = $this->drupalCreateUser(array('administer software updates', 'access administration pages', 'access site reports'));
+    $this->drupalLogin($admin_user);
+    $this->drupalPost($this->update_url, array(), t('Continue'), array('external' => TRUE));
+    $this->drupalPost(NULL, array(), t('Apply pending updates'));
+    $this->assertText('Updates were attempted.');
+    $this->assertLink('logged');
+    $this->clickLink('Administration pages');
+    $this->assertResponse(200);
+  }
+}
+
+/**
+ * Functional tests for the flood control mechanism.
+ */
+class FloodFunctionalTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Flood control mechanism',
+      'description' => 'Functional tests for the flood control mechanism.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Test flood control mechanism clean-up.
+   */
+  function testCleanUp() {
+    $threshold = 1;
+    $window_expired = -1;
+    $name = 'flood_test_cleanup';
+
+    // Register expired event.
+    flood_register_event($name, $window_expired);
+    // Verify event is not allowed.
+    $this->assertFalse(flood_is_allowed($name, $threshold));
+    // Run cron and verify event is now allowed.
+    $this->cronRun();
+    $this->assertTrue(flood_is_allowed($name, $threshold));
+
+    // Register unexpired event.
+    flood_register_event($name);
+    // Verify event is not allowed.
+    $this->assertFalse(flood_is_allowed($name, $threshold));
+    // Run cron and verify event is still not allowed.
+    $this->cronRun();
+    $this->assertFalse(flood_is_allowed($name, $threshold));
+  }
+}
+
+/**
+ * Test HTTP file downloading capability.
+ */
+class RetrieveFileTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'HTTP file retrieval',
+      'description' => 'Checks HTTP file fetching and error handling.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Invokes system_retrieve_file() in several scenarios.
+   */
+  function testFileRetrieving() {
+    // Test 404 handling by trying to fetch a randomly named file.
+    drupal_mkdir($sourcedir = 'public://' . $this->randomName());
+    $filename = 'Файл для тестирования ' . $this->randomName();
+    $url = file_create_url($sourcedir . '/' . $filename);
+    $retrieved_file = system_retrieve_file($url);
+    $this->assertFalse($retrieved_file, 'Non-existent file not fetched.');
+
+    // Actually create that file, download it via HTTP and test the returned path.
+    file_put_contents($sourcedir . '/' . $filename, 'testing');
+    $retrieved_file = system_retrieve_file($url);
+
+    // URLs could not contains characters outside the ASCII set so $filename
+    // has to be encoded.
+    $encoded_filename = rawurlencode($filename);
+
+    $this->assertEqual($retrieved_file, 'public://' . $encoded_filename, 'Sane path for downloaded file returned (public:// scheme).');
+    $this->assertTrue(is_file($retrieved_file), 'Downloaded file does exist (public:// scheme).');
+    $this->assertEqual(filesize($retrieved_file), 7, 'File size of downloaded file is correct (public:// scheme).');
+    file_unmanaged_delete($retrieved_file);
+
+    // Test downloading file to a different location.
+    drupal_mkdir($targetdir = 'temporary://' . $this->randomName());
+    $retrieved_file = system_retrieve_file($url, $targetdir);
+    $this->assertEqual($retrieved_file, "$targetdir/$encoded_filename", 'Sane path for downloaded file returned (temporary:// scheme).');
+    $this->assertTrue(is_file($retrieved_file), 'Downloaded file does exist (temporary:// scheme).');
+    $this->assertEqual(filesize($retrieved_file), 7, 'File size of downloaded file is correct (temporary:// scheme).');
+    file_unmanaged_delete($retrieved_file);
+
+    file_unmanaged_delete_recursive($sourcedir);
+    file_unmanaged_delete_recursive($targetdir);
+  }
+}
+
+/**
+ * Functional tests shutdown functions.
+ */
+class ShutdownFunctionsTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Shutdown functions',
+      'description' => 'Functional tests for shutdown functions',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('system_test');
+  }
+
+  /**
+   * Test shutdown functions.
+   */
+  function testShutdownFunctions() {
+    $arg1 = $this->randomName();
+    $arg2 = $this->randomName();
+    $this->drupalGet('system-test/shutdown-functions/' . $arg1 . '/' . $arg2);
+    $this->assertText(t('First shutdown function, arg1 : @arg1, arg2: @arg2', array('@arg1' => $arg1, '@arg2' => $arg2)));
+    $this->assertText(t('Second shutdown function, arg1 : @arg1, arg2: @arg2', array('@arg1' => $arg1, '@arg2' => $arg2)));
+
+    // Make sure exceptions displayed through _drupal_render_exception_safe()
+    // are correctly escaped.
+    $this->assertRaw('Drupal is &amp;lt;blink&amp;gt;awesome&amp;lt;/blink&amp;gt;.');
+  }
+}
+
+/**
+ * Tests administrative overview pages.
+ */
+class SystemAdminTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Administrative pages',
+      'description' => 'Tests output on administrative pages and compact mode functionality.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    // testAdminPages() requires Locale module.
+    parent::setUp(array('locale'));
+
+    // Create an administrator with all permissions, as well as a regular user
+    // who can only access administration pages and perform some Locale module
+    // administrative tasks, but not all of them.
+    $this->admin_user = $this->drupalCreateUser(array_keys(module_invoke_all('permission')));
+    $this->web_user = $this->drupalCreateUser(array(
+      'access administration pages',
+      'translate interface',
+    ));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Tests output on administrative listing pages.
+   */
+  function testAdminPages() {
+    // Go to Administration.
+    $this->drupalGet('admin');
+
+    // Verify that all visible, top-level administration links are listed on
+    // the main administration page.
+    foreach (menu_get_router() as $path => $item) {
+      if (strpos($path, 'admin/') === 0 && ($item['type'] & MENU_VISIBLE_IN_TREE) && $item['_number_parts'] == 2) {
+        $this->assertLink($item['title']);
+        $this->assertLinkByHref($path);
+        $this->assertText($item['description']);
+      }
+    }
+
+    // For each administrative listing page on which the Locale module appears,
+    // verify that there are links to the module's primary configuration pages,
+    // but no links to its individual sub-configuration pages. Also verify that
+    // a user with access to only some Locale module administration pages only
+    // sees links to the pages they have access to.
+    $admin_list_pages = array(
+      'admin/index',
+      'admin/config',
+      'admin/config/regional',
+    );
+
+    foreach ($admin_list_pages as $page) {
+      // For the administrator, verify that there are links to Locale's primary
+      // configuration pages, but no links to individual sub-configuration
+      // pages.
+      $this->drupalLogin($this->admin_user);
+      $this->drupalGet($page);
+      $this->assertLinkByHref('admin/config');
+      $this->assertLinkByHref('admin/config/regional/settings');
+      $this->assertLinkByHref('admin/config/regional/date-time');
+      $this->assertLinkByHref('admin/config/regional/language');
+      $this->assertNoLinkByHref('admin/config/regional/language/configure/session');
+      $this->assertNoLinkByHref('admin/config/regional/language/configure/url');
+      $this->assertLinkByHref('admin/config/regional/translate');
+      // On admin/index only, the administrator should also see a "Configure
+      // permissions" link for the Locale module.
+      if ($page == 'admin/index') {
+        $this->assertLinkByHref("admin/people/permissions#module-locale");
+      }
+
+      // For a less privileged user, verify that there are no links to Locale's
+      // primary configuration pages, but a link to the translate page exists.
+      $this->drupalLogin($this->web_user);
+      $this->drupalGet($page);
+      $this->assertLinkByHref('admin/config');
+      $this->assertNoLinkByHref('admin/config/regional/settings');
+      $this->assertNoLinkByHref('admin/config/regional/date-time');
+      $this->assertNoLinkByHref('admin/config/regional/language');
+      $this->assertNoLinkByHref('admin/config/regional/language/configure/session');
+      $this->assertNoLinkByHref('admin/config/regional/language/configure/url');
+      $this->assertLinkByHref('admin/config/regional/translate');
+      // This user cannot configure permissions, so even on admin/index should
+      // not see a "Configure permissions" link for the Locale module.
+      if ($page == 'admin/index') {
+        $this->assertNoLinkByHref("admin/people/permissions#module-locale");
+      }
+    }
+  }
+
+  /**
+   * Test compact mode.
+   */
+  function testCompactMode() {
+    $this->drupalGet('admin/compact/on');
+    $this->assertTrue($this->cookies['Drupal.visitor.admin_compact_mode']['value'], 'Compact mode turns on.');
+    $this->drupalGet('admin/compact/on');
+    $this->assertTrue($this->cookies['Drupal.visitor.admin_compact_mode']['value'], 'Compact mode remains on after a repeat call.');
+    $this->drupalGet('');
+    $this->assertTrue($this->cookies['Drupal.visitor.admin_compact_mode']['value'], 'Compact mode persists on new requests.');
+
+    $this->drupalGet('admin/compact/off');
+    $this->assertEqual($this->cookies['Drupal.visitor.admin_compact_mode']['value'], 'deleted', 'Compact mode turns off.');
+    $this->drupalGet('admin/compact/off');
+    $this->assertEqual($this->cookies['Drupal.visitor.admin_compact_mode']['value'], 'deleted', 'Compact mode remains off after a repeat call.');
+    $this->drupalGet('');
+    $this->assertTrue($this->cookies['Drupal.visitor.admin_compact_mode']['value'], 'Compact mode persists on new requests.');
+  }
+}
+
+/**
+ * Tests authorize.php and related hooks.
+ */
+class SystemAuthorizeCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Authorize API',
+      'description' => 'Tests the authorize.php script and related API.',
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('system_test'));
+
+    variable_set('allow_authorize_operations', TRUE);
+
+    // Create an administrator user.
+    $this->admin_user = $this->drupalCreateUser(array('administer software updates'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Helper function to initialize authorize.php and load it via drupalGet().
+   *
+   * Initializing authorize.php needs to happen in the child Drupal
+   * installation, not the parent. So, we visit a menu callback provided by
+   * system_test.module which calls system_authorized_init() to initialize the
+   * $_SESSION inside the test site, not the framework site. This callback
+   * redirects to authorize.php when it's done initializing.
+   *
+   * @see system_authorized_init().
+   */
+  function drupalGetAuthorizePHP($page_title = 'system-test-auth') {
+    $this->drupalGet('system-test/authorize-init/' . $page_title);
+  }
+
+  /**
+   * Tests the FileTransfer hooks
+   */
+  function testFileTransferHooks() {
+    $page_title = $this->randomName(16);
+    $this->drupalGetAuthorizePHP($page_title);
+    $this->assertTitle(strtr('@title | Drupal', array('@title' => $page_title)), 'authorize.php page title is correct.');
+    $this->assertNoText('It appears you have reached this page in error.');
+    $this->assertText('To continue, provide your server connection details');
+    // Make sure we see the new connection method added by system_test.
+    $this->assertRaw('System Test FileTransfer');
+    // Make sure the settings form callback works.
+    $this->assertText('System Test Username');
+  }
+}
+
+/**
+ * Test the handling of requests containing 'index.php'.
+ */
+class SystemIndexPhpTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Index.php handling',
+      'description' => "Test the handling of requests containing 'index.php'.",
+      'group' => 'System',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+  }
+
+  /**
+   * Test index.php handling.
+   */
+  function testIndexPhpHandling() {
+    $index_php = $GLOBALS['base_url'] . '/index.php';
+
+    $this->drupalGet($index_php, array('external' => TRUE));
+    $this->assertResponse(200, 'Make sure index.php returns a valid page.');
+
+    $this->drupalGet($index_php, array('external' => TRUE, 'query' => array('q' => 'user')));
+    $this->assertResponse(200, 'Make sure index.php?q=user returns a valid page.');
+
+    $this->drupalGet($index_php .'/user', array('external' => TRUE));
+    $this->assertResponse(404, "Make sure index.php/user returns a 'page not found'.");
+  }
+}
+
+/**
+ * Test token replacement in strings.
+ */
+class TokenScanTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Token scanning',
+      'description' => 'Scan token-like patterns in a dummy text to check token scanning.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Scans dummy text, then tests the output.
+   */
+  function testTokenScan() {
+    // Define text with valid and not valid, fake and existing token-like
+    // strings.
+    $text = 'First a [valid:simple], but dummy token, and a dummy [valid:token with: spaces].';
+    $text .= 'Then a [not valid:token].';
+    $text .= 'Last an existing token: [node:author:name].';
+    $token_wannabes = token_scan($text);
+
+    $this->assertTrue(isset($token_wannabes['valid']['simple']), 'A simple valid token has been matched.');
+    $this->assertTrue(isset($token_wannabes['valid']['token with: spaces']), 'A valid token with space characters in the token name has been matched.');
+    $this->assertFalse(isset($token_wannabes['not valid']), 'An invalid token with spaces in the token type has not been matched.');
+    $this->assertTrue(isset($token_wannabes['node']), 'An existing valid token has been matched.');
+  }
+}
+
+/**
+ * Test case for drupal_valid_token().
+ */
+class SystemValidTokenTest extends DrupalUnitTestCase {
+
+  /**
+   * Flag to indicate whether PHP error reportings should be asserted.
+   *
+   * @var bool
+   */
+  protected $assertErrors = TRUE;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Token validation',
+      'description' => 'Test the security token validation.',
+      'group' => 'System',
+    );
+  }
+
+  /**
+   * Tests invalid invocations of drupal_valid_token() that must return FALSE.
+   */
+  public function testTokenValidation() {
+    // The following checks will throw PHP notices, so we disable error
+    // assertions.
+    $this->assertErrors = FALSE;
+    $this->assertFalse(drupal_valid_token(NULL, new stdClass()), 'Token NULL, value object returns FALSE.');
+    $this->assertFalse(drupal_valid_token(0, array()), 'Token 0, value array returns FALSE.');
+    $this->assertFalse(drupal_valid_token('', array()), "Token '', value array returns FALSE.");
+    $this->assertFalse('' === drupal_get_token(array()), 'Token generation does not return an empty string on invalid parameters.');
+    $this->assertErrors = TRUE;
+
+    $this->assertFalse(drupal_valid_token(TRUE, 'foo'), 'Token TRUE, value foo returns FALSE.');
+    $this->assertFalse(drupal_valid_token(0, 'foo'), 'Token 0, value foo returns FALSE.');
+  }
+
+  /**
+   * Overrides DrupalTestCase::errorHandler().
+   */
+  public function errorHandler($severity, $message, $file = NULL, $line = NULL) {
+    if ($this->assertErrors) {
+      return parent::errorHandler($severity, $message, $file, $line);
+    }
+    return TRUE;
+  }
+}
diff --git a/htmltest/modules/system/system.theme-rtl.css b/htmltest/modules/system/system.theme-rtl.css
new file mode 100644
index 00000000..0cd7fa64
--- /dev/null
+++ b/htmltest/modules/system/system.theme-rtl.css
@@ -0,0 +1,53 @@
+
+/**
+ * @file
+ * RTL styles for common markup.
+ */
+
+/**
+ * HTML elements.
+ */
+th {
+  text-align: right;
+  padding-left: 1em;
+  padding-right: 0;
+}
+
+/**
+ * Markup generated by theme_item_list().
+ */
+.item-list ul li {
+  margin: 0 1.5em 0.25em 0;
+}
+
+/**
+ * Markup generated by theme_more_link().
+ */
+.more-link {
+  text-align: left;
+}
+
+/**
+ * Markup generated by theme_more_help_link().
+ */
+.more-help-link {
+  text-align: left;
+}
+.more-help-link a {
+  background-position: 100% 50%;
+  padding: 1px 20px 1px 0;
+}
+
+/**
+ * Collapsible fieldsets.
+ */
+html.js fieldset.collapsible .fieldset-legend {
+  background-position: 98% 75%;
+  padding-left: 0;
+  padding-right: 15px;
+}
+html.js fieldset.collapsed .fieldset-legend {
+  background-image: url(../../misc/menu-collapsed-rtl.png);
+  background-position: 98% 50%;
+}
+
diff --git a/htmltest/modules/system/system.theme.css b/htmltest/modules/system/system.theme.css
new file mode 100644
index 00000000..73cebee7
--- /dev/null
+++ b/htmltest/modules/system/system.theme.css
@@ -0,0 +1,239 @@
+
+/**
+ * @file
+ * Basic styling for common markup.
+ */
+
+/**
+ * HTML elements.
+ */
+fieldset {
+  margin-bottom: 1em;
+  padding: 0.5em;
+}
+form {
+  margin: 0;
+  padding: 0;
+}
+hr {
+  border: 1px solid gray;
+  height: 1px;
+}
+img {
+  border: 0;
+}
+table {
+  border-collapse: collapse;
+}
+th {
+  border-bottom: 3px solid #ccc;
+  padding-right: 1em; /* LTR */
+  text-align: left; /* LTR */
+}
+tbody {
+  border-top: 1px solid #ccc;
+}
+tr.even,
+tr.odd {
+  background-color: #eee;
+  border-bottom: 1px solid #ccc;
+  padding: 0.1em 0.6em;
+}
+
+/**
+ * Markup generated by theme_tablesort_indicator().
+ */
+th.active img {
+  display: inline;
+}
+td.active {
+  background-color: #ddd;
+}
+
+/**
+ * Markup generated by theme_item_list().
+ */
+.item-list .title {
+  font-weight: bold;
+}
+.item-list ul {
+  margin: 0 0 0.75em 0;
+  padding: 0;
+}
+.item-list ul li {
+  margin: 0 0 0.25em 1.5em; /* LTR */
+  padding: 0;
+}
+
+/**
+ * Markup generated by Form API.
+ */
+.form-item,
+.form-actions {
+  margin-top: 1em;
+  margin-bottom: 1em;
+}
+tr.odd .form-item,
+tr.even .form-item {
+  margin-top: 0;
+  margin-bottom: 0;
+  white-space: nowrap;
+}
+.form-item .description {
+  font-size: 0.85em;
+}
+label {
+  display: block;
+  font-weight: bold;
+}
+label.option {
+  display: inline;
+  font-weight: normal;
+}
+.form-checkboxes .form-item,
+.form-radios .form-item {
+  margin-top: 0.4em;
+  margin-bottom: 0.4em;
+}
+.form-type-radio .description,
+.form-type-checkbox .description {
+  margin-left: 2.4em;
+}
+input.form-checkbox,
+input.form-radio {
+  vertical-align: middle;
+}
+.marker,
+.form-required {
+  color: #f00;
+}
+.form-item input.error,
+.form-item textarea.error,
+.form-item select.error {
+  border: 2px solid red;
+}
+
+/**
+ * Inline items.
+ */
+.container-inline .form-actions,
+.container-inline.form-actions {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+/**
+ * Markup generated by theme_more_link().
+ */
+.more-link {
+  text-align: right; /* LTR */
+}
+
+/**
+ * Markup generated by theme_more_help_link().
+ */
+.more-help-link {
+  text-align: right; /* LTR */
+}
+.more-help-link a {
+  background: url(../../misc/help.png) 0 50% no-repeat; /* LTR */
+  padding: 1px 0 1px 20px; /* LTR */
+}
+
+/**
+ * Markup generated by theme_pager().
+ */
+.item-list .pager {
+  clear: both;
+  text-align: center;
+}
+.item-list .pager li {
+  background-image: none;
+  display: inline;
+  list-style-type: none;
+  padding: 0.5em;
+}
+.pager-current {
+  font-weight: bold;
+}
+
+/**
+ * Autocomplete.
+ *
+ * @see autocomplete.js
+ */
+/* Suggestion list */
+#autocomplete li.selected {
+  background: #0072b9;
+  color: #fff;
+}
+
+/**
+ * Collapsible fieldsets.
+ *
+ * @see collapse.js
+ */
+html.js fieldset.collapsible .fieldset-legend {
+  background: url(../../misc/menu-expanded.png) 5px 65% no-repeat; /* LTR */
+  padding-left: 15px; /* LTR */
+}
+html.js fieldset.collapsed .fieldset-legend {
+  background-image: url(../../misc/menu-collapsed.png); /* LTR */
+  background-position: 5px 50%; /* LTR */
+}
+.fieldset-legend span.summary {
+  color: #999;
+  font-size: 0.9em;
+  margin-left: 0.5em;
+}
+
+/**
+ * TableDrag behavior.
+ *
+ * @see tabledrag.js
+ */
+tr.drag {
+  background-color: #fffff0;
+}
+tr.drag-previous {
+  background-color: #ffd;
+}
+.tabledrag-toggle-weight {
+  font-size: 0.9em;
+}
+body div.tabledrag-changed-warning {
+  margin-bottom: 0.5em;
+}
+
+/**
+ * TableSelect behavior.
+ *
+ * @see tableselect.js
+*/
+tr.selected td {
+  background: #ffc;
+}
+td.checkbox,
+th.checkbox {
+  text-align: center;
+}
+
+/**
+ * Progress bar.
+ *
+ * @see progress.js
+ */
+.progress {
+  font-weight: bold;
+}
+.progress .bar {
+  background: #ccc;
+  border-color: #666;
+  margin: 0 0.2em;
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  border-radius: 3px;
+}
+.progress .filled {
+  background: #0072b9 url(../../misc/progress.gif);
+}
diff --git a/htmltest/modules/system/system.tokens.inc b/htmltest/modules/system/system.tokens.inc
new file mode 100644
index 00000000..b612d105
--- /dev/null
+++ b/htmltest/modules/system/system.tokens.inc
@@ -0,0 +1,269 @@
+<?php
+
+/**
+ * @file
+ * Builds placeholder replacement tokens system-wide data.
+ *
+ * This file handles tokens for the global 'site' token type, as well as
+ * 'date' and 'file' tokens.
+ */
+
+/**
+ * Implements hook_token_info().
+ */
+function system_token_info() {
+  $types['site'] = array(
+    'name' => t("Site information"),
+    'description' => t("Tokens for site-wide settings and other global information."),
+  );
+  $types['date'] = array(
+    'name' => t("Dates"),
+    'description' => t("Tokens related to times and dates."),
+  );
+  $types['file'] = array(
+    'name' => t("Files"),
+    'description' => t("Tokens related to uploaded files."),
+    'needs-data' => 'file',
+  );
+
+  // Site-wide global tokens.
+  $site['name'] = array(
+    'name' => t("Name"),
+    'description' => t("The name of the site."),
+  );
+  $site['slogan'] = array(
+    'name' => t("Slogan"),
+    'description' => t("The slogan of the site."),
+  );
+  $site['mail'] = array(
+    'name' => t("Email"),
+    'description' => t("The administrative email address for the site."),
+  );
+  $site['url'] = array(
+    'name' => t("URL"),
+    'description' => t("The URL of the site's front page."),
+  );
+  $site['url-brief'] = array(
+    'name' => t("URL (brief)"),
+    'description' => t("The URL of the site's front page without the protocol."),
+  );
+  $site['login-url'] = array(
+    'name' => t("Login page"),
+    'description' => t("The URL of the site's login page."),
+  );
+
+  // Date related tokens.
+  $date['short'] = array(
+    'name' => t("Short format"),
+    'description' => t("A date in 'short' format. (%date)", array('%date' => format_date(REQUEST_TIME, 'short'))),
+  );
+  $date['medium'] = array(
+    'name' => t("Medium format"),
+    'description' => t("A date in 'medium' format. (%date)", array('%date' => format_date(REQUEST_TIME, 'medium'))),
+  );
+  $date['long'] = array(
+    'name' => t("Long format"),
+    'description' => t("A date in 'long' format. (%date)", array('%date' => format_date(REQUEST_TIME, 'long'))),
+  );
+  $date['custom'] = array(
+    'name' => t("Custom format"),
+    'description' => t("A date in a custom format. See !php-date for details.", array('!php-date' => l(t('the PHP documentation'), 'http://php.net/manual/en/function.date.php'))),
+  );
+  $date['since'] = array(
+    'name' => t("Time-since"),
+    'description' => t("A date in 'time-since' format. (%date)", array('%date' => format_interval(REQUEST_TIME - 360, 2))),
+  );
+  $date['raw'] = array(
+    'name' => t("Raw timestamp"),
+    'description' => t("A date in UNIX timestamp format (%date)", array('%date' => REQUEST_TIME)),
+  );
+
+
+  // File related tokens.
+  $file['fid'] = array(
+    'name' => t("File ID"),
+    'description' => t("The unique ID of the uploaded file."),
+  );
+  $file['name'] = array(
+    'name' => t("File name"),
+    'description' => t("The name of the file on disk."),
+  );
+  $file['path'] = array(
+    'name' => t("Path"),
+    'description' => t("The location of the file relative to Drupal root."),
+  );
+  $file['mime'] = array(
+    'name' => t("MIME type"),
+    'description' => t("The MIME type of the file."),
+  );
+  $file['size'] = array(
+    'name' => t("File size"),
+    'description' => t("The size of the file."),
+  );
+  $file['url'] = array(
+    'name' => t("URL"),
+    'description' => t("The web-accessible URL for the file."),
+  );
+  $file['timestamp'] = array(
+    'name' => t("Timestamp"),
+    'description' => t("The date the file was most recently changed."),
+    'type' => 'date',
+  );
+  $file['owner'] = array(
+    'name' => t("Owner"),
+    'description' => t("The user who originally uploaded the file."),
+    'type' => 'user',
+  );
+
+  return array(
+    'types' => $types,
+    'tokens' => array(
+      'site' => $site,
+      'date' => $date,
+      'file' => $file,
+    ),
+  );
+}
+
+/**
+ * Implements hook_tokens().
+ */
+function system_tokens($type, $tokens, array $data = array(), array $options = array()) {
+  $url_options = array('absolute' => TRUE);
+  if (isset($options['language'])) {
+    $url_options['language'] = $options['language'];
+    $language_code = $options['language']->language;
+  }
+  else {
+    $language_code = NULL;
+  }
+  $sanitize = !empty($options['sanitize']);
+
+  $replacements = array();
+
+  if ($type == 'site') {
+    foreach ($tokens as $name => $original) {
+      switch ($name) {
+        case 'name':
+          $site_name = variable_get('site_name', 'Drupal');
+          $replacements[$original] = $sanitize ? check_plain($site_name) : $site_name;
+          break;
+
+        case 'slogan':
+          $slogan = variable_get('site_slogan', '');
+          $replacements[$original] = $sanitize ? check_plain($slogan) : $slogan;
+          break;
+
+        case 'mail':
+          $replacements[$original] = variable_get('site_mail', '');
+          break;
+
+        case 'url':
+          $replacements[$original] = url('<front>', $url_options);
+          break;
+
+        case 'url-brief':
+          $replacements[$original] = preg_replace(array('!^https?://!', '!/$!'), '', url('<front>', $url_options));
+          break;
+
+        case 'login-url':
+          $replacements[$original] = url('user', $url_options);
+          break;
+      }
+    }
+  }
+
+  elseif ($type == 'date') {
+    if (empty($data['date'])) {
+      $date = REQUEST_TIME;
+    }
+    else {
+      $date = $data['date'];
+    }
+
+    foreach ($tokens as $name => $original) {
+      switch ($name) {
+        case 'short':
+          $replacements[$original] = format_date($date, 'short', '', NULL, $language_code);
+          break;
+
+        case 'medium':
+          $replacements[$original] = format_date($date, 'medium', '', NULL, $language_code);
+          break;
+
+        case 'long':
+          $replacements[$original] = format_date($date, 'long', '', NULL, $language_code);
+          break;
+
+        case 'since':
+          $replacements[$original] = format_interval((REQUEST_TIME - $date), 2, $language_code);
+          break;
+
+        case 'raw':
+          $replacements[$original] = $sanitize ? check_plain($date) : $date;
+          break;
+      }
+    }
+
+    if ($created_tokens = token_find_with_prefix($tokens, 'custom')) {
+      foreach ($created_tokens as $name => $original) {
+        $replacements[$original] = format_date($date, 'custom', $name, NULL, $language_code);
+      }
+    }
+  }
+
+  elseif ($type == 'file' && !empty($data['file'])) {
+    $file = $data['file'];
+
+    foreach ($tokens as $name => $original) {
+      switch ($name) {
+        // Basic keys and values.
+        case 'fid':
+          $replacements[$original] = $file->fid;
+          break;
+
+        // Essential file data
+        case 'name':
+          $replacements[$original] = $sanitize ? check_plain($file->filename) : $file->filename;
+          break;
+
+        case 'path':
+          $replacements[$original] = $sanitize ? check_plain($file->uri) : $file->uri;
+          break;
+
+        case 'mime':
+          $replacements[$original] = $sanitize ? check_plain($file->filemime) : $file->filemime;
+          break;
+
+        case 'size':
+          $replacements[$original] = format_size($file->filesize);
+          break;
+
+        case 'url':
+          $replacements[$original] = $sanitize ? check_plain(file_create_url($file->uri)) : file_create_url($file->uri);
+          break;
+
+        // These tokens are default variations on the chained tokens handled below.
+        case 'timestamp':
+          $replacements[$original] = format_date($file->timestamp, 'medium', '', NULL, $language_code);
+          break;
+
+        case 'owner':
+          $account = user_load($file->uid);
+          $name = format_username($account);
+          $replacements[$original] = $sanitize ? check_plain($name) : $name;
+          break;
+      }
+    }
+
+    if ($date_tokens = token_find_with_prefix($tokens, 'timestamp')) {
+      $replacements += token_generate('date', $date_tokens, array('date' => $file->timestamp), $options);
+    }
+
+    if (($owner_tokens = token_find_with_prefix($tokens, 'owner')) && $account = user_load($file->uid)) {
+      $replacements += token_generate('user', $owner_tokens, array('user' => $account), $options);
+    }
+  }
+
+  return $replacements;
+}
diff --git a/htmltest/modules/system/system.updater.inc b/htmltest/modules/system/system.updater.inc
new file mode 100644
index 00000000..a14d788b
--- /dev/null
+++ b/htmltest/modules/system/system.updater.inc
@@ -0,0 +1,150 @@
+<?php
+
+/**
+ * @file
+ * Subclasses of the Updater class to update Drupal core knows how to update.
+ * At this time, only modules and themes are supported.
+ */
+
+/**
+ * Class for updating modules using FileTransfer classes via authorize.php.
+ */
+class ModuleUpdater extends Updater implements DrupalUpdaterInterface {
+
+  /**
+   * Return the directory where a module should be installed.
+   *
+   * If the module is already installed, drupal_get_path() will return
+   * a valid path and we should install it there (although we need to use an
+   * absolute path, so we prepend DRUPAL_ROOT). If we're installing a new
+   * module, we always want it to go into sites/all/modules, since that's
+   * where all the documentation recommends users install their modules, and
+   * there's no way that can conflict on a multi-site installation, since
+   * the Update manager won't let you install a new module if it's already
+   * found on your system, and if there was a copy in sites/all, we'd see it.
+   */
+  public function getInstallDirectory() {
+    if ($relative_path = drupal_get_path('module', $this->name)) {
+      $relative_path = dirname($relative_path);
+    }
+    else {
+      $relative_path = 'sites/all/modules';
+    }
+    return DRUPAL_ROOT . '/' . $relative_path;
+  }
+
+  public function isInstalled() {
+    return (bool) drupal_get_path('module', $this->name);
+  }
+
+  public static function canUpdateDirectory($directory) {
+    if (file_scan_directory($directory, '/.*\.module$/')) {
+      return TRUE;
+    }
+    return FALSE;
+  }
+
+  public static function canUpdate($project_name) {
+    return (bool) drupal_get_path('module', $project_name);
+  }
+
+  /**
+   * Return available database schema updates one a new version is installed.
+   */
+  public function getSchemaUpdates() {
+    require_once DRUPAL_ROOT . '/includes/install.inc';
+    require_once DRUPAL_ROOT . '/includes/update.inc';
+
+    if (_update_get_project_type($project) != 'module') {
+      return array();
+    }
+    module_load_include('install', $project);
+
+    if (!$updates = drupal_get_schema_versions($project)) {
+      return array();
+    }
+    $updates_to_run = array();
+    $modules_with_updates = update_get_update_list();
+    if ($updates = $modules_with_updates[$project]) {
+      if ($updates['start']) {
+        return $updates['pending'];
+      }
+    }
+    return array();
+  }
+
+  /**
+   * Returns a list of post install actions.
+   */
+  public function postInstallTasks() {
+    return array(
+      l(t('Install another module'), 'admin/modules/install'),
+      l(t('Enable newly added modules'), 'admin/modules'),
+      l(t('Administration pages'), 'admin'),
+    );
+  }
+
+  public function postUpdateTasks() {
+    // We don't want to check for DB updates here, we do that once for all
+    // updated modules on the landing page.
+  }
+
+}
+
+/**
+ * Class for updating themes using FileTransfer classes via authorize.php.
+ */
+class ThemeUpdater extends Updater implements DrupalUpdaterInterface {
+
+  /**
+   * Return the directory where a theme should be installed.
+   *
+   * If the theme is already installed, drupal_get_path() will return
+   * a valid path and we should install it there (although we need to use an
+   * absolute path, so we prepend DRUPAL_ROOT). If we're installing a new
+   * theme, we always want it to go into sites/all/themes, since that's
+   * where all the documentation recommends users install their themes, and
+   * there's no way that can conflict on a multi-site installation, since
+   * the Update manager won't let you install a new theme if it's already
+   * found on your system, and if there was a copy in sites/all, we'd see it.
+   */
+  public function getInstallDirectory() {
+    if ($relative_path = drupal_get_path('theme', $this->name)) {
+      $relative_path = dirname($relative_path);
+    }
+    else {
+      $relative_path = 'sites/all/themes';
+    }
+    return DRUPAL_ROOT . '/' . $relative_path;
+  }
+
+  public function isInstalled() {
+    return (bool) drupal_get_path('theme', $this->name);
+  }
+
+  static function canUpdateDirectory($directory) {
+    // This is a lousy test, but don't know how else to confirm it is a theme.
+    if (file_scan_directory($directory, '/.*\.module$/')) {
+      return FALSE;
+    }
+    return TRUE;
+  }
+
+  public static function canUpdate($project_name) {
+    return (bool) drupal_get_path('theme', $project_name);
+  }
+
+  public function postInstall() {
+    // Update the system table.
+    clearstatcache();
+    system_rebuild_theme_data();
+
+  }
+
+  public function postInstallTasks() {
+    return array(
+      l(t('Enable newly added themes'), 'admin/appearance'),
+      l(t('Administration pages'), 'admin'),
+    );
+  }
+}
diff --git a/htmltest/modules/system/theme.api.php b/htmltest/modules/system/theme.api.php
new file mode 100644
index 00000000..56e9ba1b
--- /dev/null
+++ b/htmltest/modules/system/theme.api.php
@@ -0,0 +1,240 @@
+<?php
+
+/**
+ * @defgroup themeable Default theme implementations
+ * @{
+ * Functions and templates for the user interface to be implemented by themes.
+ *
+ * Drupal's presentation layer is a pluggable system known as the theme
+ * layer. Each theme can take control over most of Drupal's output, and
+ * has complete control over the CSS.
+ *
+ * Inside Drupal, the theme layer is utilized by the use of the theme()
+ * function, which is passed the name of a component (the theme hook)
+ * and an array of variables. For example,
+ * theme('table', array('header' => $header, 'rows' => $rows));
+ * Additionally, the theme() function can take an array of theme
+ * hooks, which can be used to provide 'fallback' implementations to
+ * allow for more specific control of output. For example, the function:
+ * theme(array('table__foo', 'table'), $variables) would look to see if
+ * 'table__foo' is registered anywhere; if it is not, it would 'fall back'
+ * to the generic 'table' implementation. This can be used to attach specific
+ * theme functions to named objects, allowing the themer more control over
+ * specific types of output.
+ *
+ * As of Drupal 6, every theme hook is required to be registered by the
+ * module that owns it, so that Drupal can tell what to do with it and
+ * to make it simple for themes to identify and override the behavior
+ * for these calls.
+ *
+ * The theme hooks are registered via hook_theme(), which returns an
+ * array of arrays with information about the hook. It describes the
+ * arguments the function or template will need, and provides
+ * defaults for the template in case they are not filled in. If the default
+ * implementation is a function, by convention it is named theme_HOOK().
+ *
+ * Each module should provide a default implementation for theme_hooks that
+ * it registers. This implementation may be either a function or a template;
+ * if it is a function it must be specified via hook_theme(). By convention,
+ * default implementations of theme hooks are named theme_HOOK. Default
+ * template implementations are stored in the module directory.
+ *
+ * Drupal's default template renderer is a simple PHP parsing engine that
+ * includes the template and stores the output. Drupal's theme engines
+ * can provide alternate template engines, such as XTemplate, Smarty and
+ * PHPTal. The most common template engine is PHPTemplate (included with
+ * Drupal and implemented in phptemplate.engine, which uses Drupal's default
+ * template renderer.
+ *
+ * In order to create theme-specific implementations of these hooks, themes can
+ * implement their own version of theme hooks, either as functions or templates.
+ * These implementations will be used instead of the default implementation. If
+ * using a pure .theme without an engine, the .theme is required to implement
+ * its own version of hook_theme() to tell Drupal what it is implementing;
+ * themes utilizing an engine will have their well-named theming functions
+ * automatically registered for them. While this can vary based upon the theme
+ * engine, the standard set by phptemplate is that theme functions should be
+ * named THEMENAME_HOOK. For example, for Drupal's default theme (Bartik) to
+ * implement the 'table' hook, the phptemplate.engine would find
+ * bartik_table().
+ *
+ * The theme system is described and defined in theme.inc.
+ *
+ * @see theme()
+ * @see hook_theme()
+ * @see hooks
+ * @see callbacks
+ *
+ * @} End of "defgroup themeable".
+ */
+
+/**
+ * Allow themes to alter the theme-specific settings form.
+ *
+ * With this hook, themes can alter the theme-specific settings form in any way
+ * allowable by Drupal's Form API, such as adding form elements, changing
+ * default values and removing form elements. See the Form API documentation on
+ * api.drupal.org for detailed information.
+ *
+ * Note that the base theme's form alterations will be run before any sub-theme
+ * alterations.
+ *
+ * @param $form
+ *   Nested array of form elements that comprise the form.
+ * @param $form_state
+ *   A keyed array containing the current state of the form.
+ */
+function hook_form_system_theme_settings_alter(&$form, &$form_state) {
+  // Add a checkbox to toggle the breadcrumb trail.
+  $form['toggle_breadcrumb'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Display the breadcrumb'),
+    '#default_value' => theme_get_setting('toggle_breadcrumb'),
+    '#description'   => t('Show a trail of links from the homepage to the current page.'),
+  );
+}
+
+/**
+ * Preprocess theme variables for templates.
+ *
+ * This hook allows modules to preprocess theme variables for theme templates.
+ * It is called for all theme hooks implemented as templates, but not for theme
+ * hooks implemented as functions. hook_preprocess_HOOK() can be used to
+ * preprocess variables for a specific theme hook, whether implemented as a
+ * template or function.
+ *
+ * For more detailed information, see theme().
+ *
+ * @param $variables
+ *   The variables array (modify in place).
+ * @param $hook
+ *   The name of the theme hook.
+ */
+function hook_preprocess(&$variables, $hook) {
+ static $hooks;
+
+  // Add contextual links to the variables, if the user has permission.
+
+  if (!user_access('access contextual links')) {
+    return;
+  }
+
+  if (!isset($hooks)) {
+    $hooks = theme_get_registry();
+  }
+
+  // Determine the primary theme function argument.
+  if (isset($hooks[$hook]['variables'])) {
+    $keys = array_keys($hooks[$hook]['variables']);
+    $key = $keys[0];
+  }
+  else {
+    $key = $hooks[$hook]['render element'];
+  }
+
+  if (isset($variables[$key])) {
+    $element = $variables[$key];
+  }
+
+  if (isset($element) && is_array($element) && !empty($element['#contextual_links'])) {
+    $variables['title_suffix']['contextual_links'] = contextual_links_view($element);
+    if (!empty($variables['title_suffix']['contextual_links'])) {
+      $variables['classes_array'][] = 'contextual-links-region';
+    }
+  }
+}
+
+/**
+ * Preprocess theme variables for a specific theme hook.
+ *
+ * This hook allows modules to preprocess theme variables for a specific theme
+ * hook. It should only be used if a module needs to override or add to the
+ * theme preprocessing for a theme hook it didn't define.
+ *
+ * For more detailed information, see theme().
+ *
+ * @param $variables
+ *   The variables array (modify in place).
+ */
+function hook_preprocess_HOOK(&$variables) {
+  // This example is from rdf_preprocess_image(). It adds an RDF attribute
+  // to the image hook's variables.
+  $variables['attributes']['typeof'] = array('foaf:Image');
+}
+
+/**
+ * Process theme variables for templates.
+ *
+ * This hook allows modules to process theme variables for theme templates. It
+ * is called for all theme hooks implemented as templates, but not for theme
+ * hooks implemented as functions. hook_process_HOOK() can be used to process
+ * variables for a specific theme hook, whether implemented as a template or
+ * function.
+ *
+ * For more detailed information, see theme().
+ *
+ * @param $variables
+ *   The variables array (modify in place).
+ * @param $hook
+ *   The name of the theme hook.
+ */
+function hook_process(&$variables, $hook) {
+  // Wraps variables in RDF wrappers.
+  if (!empty($variables['rdf_template_variable_attributes_array'])) {
+    foreach ($variables['rdf_template_variable_attributes_array'] as $variable_name => $attributes) {
+      $context = array(
+        'hook' => $hook,
+        'variable_name' => $variable_name,
+        'variables' => $variables,
+      );
+      $variables[$variable_name] = theme('rdf_template_variable_wrapper', array('content' => $variables[$variable_name], 'attributes' => $attributes, 'context' => $context));
+    }
+  }
+}
+
+/**
+ * Process theme variables for a specific theme hook.
+ *
+ * This hook allows modules to process theme variables for a specific theme
+ * hook. It should only be used if a module needs to override or add to the
+ * theme processing for a theme hook it didn't define.
+ *
+ * For more detailed information, see theme().
+ *
+ * @param $variables
+ *   The variables array (modify in place).
+ */
+function hook_process_HOOK(&$variables) {
+  // @todo There are no use-cases in Drupal core for this hook. Find one from a
+  //   contributed module, or come up with a good example. Coming up with a good
+  //   example might be tough, since the intent is for nearly everything to be
+  //   achievable via preprocess functions, and for process functions to only be
+  //   used when requiring the later execution time.
+}
+
+/**
+ * Respond to themes being enabled.
+ *
+ * @param array $theme_list
+ *   Array containing the names of the themes being enabled.
+ *
+ * @see theme_enable()
+ */
+function hook_themes_enabled($theme_list) {
+  foreach ($theme_list as $theme) {
+    block_theme_initialize($theme);
+  }
+}
+
+/**
+ * Respond to themes being disabled.
+ *
+ * @param array $theme_list
+ *   Array containing the names of the themes being disabled.
+ *
+ * @see theme_disable()
+ */
+function hook_themes_disabled($theme_list) {
+ // Clear all update module caches.
+  _update_cache_clear();
+}
diff --git a/htmltest/modules/taxonomy/taxonomy-term.tpl.php b/htmltest/modules/taxonomy/taxonomy-term.tpl.php
new file mode 100644
index 00000000..a225c3a5
--- /dev/null
+++ b/htmltest/modules/taxonomy/taxonomy-term.tpl.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to display a term.
+ *
+ * Available variables:
+ * - $name: (deprecated) The unsanitized name of the term. Use $term_name
+ *   instead.
+ * - $content: An array of items for the content of the term (fields and
+ *   description). Use render($content) to print them all, or print a subset
+ *   such as render($content['field_example']). Use
+ *   hide($content['field_example']) to temporarily suppress the printing of a
+ *   given element.
+ * - $term_url: Direct URL of the current term.
+ * - $term_name: Name of the current term.
+ * - $classes: String of classes that can be used to style contextually through
+ *   CSS. It can be manipulated through the variable $classes_array from
+ *   preprocess functions. The default values can be one or more of the following:
+ *   - taxonomy-term: The current template type, i.e., "theming hook".
+ *   - vocabulary-[vocabulary-name]: The vocabulary to which the term belongs to.
+ *     For example, if the term is a "Tag" it would result in "vocabulary-tag".
+ *
+ * Other variables:
+ * - $term: Full term object. Contains data that may not be safe.
+ * - $view_mode: View mode, e.g. 'full', 'teaser'...
+ * - $page: Flag for the full page state.
+ * - $classes_array: Array of html class attribute values. It is flattened
+ *   into a string within the variable $classes.
+ * - $zebra: Outputs either "even" or "odd". Useful for zebra striping in
+ *   teaser listings.
+ * - $id: Position of the term. Increments each time it's output.
+ * - $is_front: Flags true when presented in the front page.
+ * - $logged_in: Flags true when the current user is a logged-in member.
+ * - $is_admin: Flags true when the current user is an administrator.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_taxonomy_term()
+ * @see template_process()
+ *
+ * @ingroup themeable
+ */
+?>
+<div id="taxonomy-term-<?php print $term->tid; ?>" class="<?php print $classes; ?>">
+
+  <?php if (!$page): ?>
+    <h2><a href="<?php print $term_url; ?>"><?php print $term_name; ?></a></h2>
+  <?php endif; ?>
+
+  <div class="content">
+    <?php print render($content); ?>
+  </div>
+
+</div>
diff --git a/htmltest/modules/taxonomy/taxonomy.admin.inc b/htmltest/modules/taxonomy/taxonomy.admin.inc
new file mode 100644
index 00000000..828fde0a
--- /dev/null
+++ b/htmltest/modules/taxonomy/taxonomy.admin.inc
@@ -0,0 +1,984 @@
+<?php
+
+/**
+ * @file
+ * Administrative page callbacks for the taxonomy module.
+ */
+
+/**
+ * Form builder to list and manage vocabularies.
+ *
+ * @ingroup forms
+ * @see taxonomy_overview_vocabularies_submit()
+ * @see theme_taxonomy_overview_vocabularies()
+ */
+function taxonomy_overview_vocabularies($form) {
+  $vocabularies = taxonomy_get_vocabularies();
+  $form['#tree'] = TRUE;
+  foreach ($vocabularies as $vocabulary) {
+    $form[$vocabulary->vid]['#vocabulary'] = $vocabulary;
+    $form[$vocabulary->vid]['name'] = array('#markup' => check_plain($vocabulary->name));
+    $form[$vocabulary->vid]['weight'] = array(
+      '#type' => 'weight',
+      '#title' => t('Weight for @title', array('@title' => $vocabulary->name)),
+      '#title_display' => 'invisible',
+      '#delta' => 10,
+      '#default_value' => $vocabulary->weight,
+    );
+    $form[$vocabulary->vid]['edit'] = array('#type' => 'link', '#title' => t('edit vocabulary'), '#href' => "admin/structure/taxonomy/$vocabulary->machine_name/edit");
+    $form[$vocabulary->vid]['list'] = array('#type' => 'link', '#title' => t('list terms'), '#href' => "admin/structure/taxonomy/$vocabulary->machine_name");
+    $form[$vocabulary->vid]['add'] = array('#type' => 'link', '#title' => t('add terms'), '#href' => "admin/structure/taxonomy/$vocabulary->machine_name/add");
+  }
+
+  // Only make this form include a submit button and weight if more than one
+  // vocabulary exists.
+  if (count($vocabularies) > 1) {
+    $form['actions'] = array('#type' => 'actions');
+    $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save'));
+  }
+  elseif (isset($vocabulary)) {
+    unset($form[$vocabulary->vid]['weight']);
+  }
+  return $form;
+}
+
+/**
+ * Submit handler for vocabularies overview. Updates changed vocabulary weights.
+ *
+ * @see taxonomy_overview_vocabularies()
+ */
+function taxonomy_overview_vocabularies_submit($form, &$form_state) {
+  foreach ($form_state['values'] as $vid => $vocabulary) {
+    if (is_numeric($vid) && $form[$vid]['#vocabulary']->weight != $form_state['values'][$vid]['weight']) {
+      $form[$vid]['#vocabulary']->weight = $form_state['values'][$vid]['weight'];
+      taxonomy_vocabulary_save($form[$vid]['#vocabulary']);
+    }
+  }
+  drupal_set_message(t('The configuration options have been saved.'));
+}
+
+/**
+ * Returns HTML for the vocabulary overview form as a sortable list of vocabularies.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @see taxonomy_overview_vocabularies()
+ * @ingroup themeable
+ */
+function theme_taxonomy_overview_vocabularies($variables) {
+  $form = $variables['form'];
+
+  $rows = array();
+
+  foreach (element_children($form) as $key) {
+    if (isset($form[$key]['name'])) {
+      $vocabulary = &$form[$key];
+
+      $row = array();
+      $row[] = drupal_render($vocabulary['name']);
+      if (isset($vocabulary['weight'])) {
+        $vocabulary['weight']['#attributes']['class'] = array('vocabulary-weight');
+        $row[] = drupal_render($vocabulary['weight']);
+      }
+      $row[] = drupal_render($vocabulary['edit']);
+      $row[] = drupal_render($vocabulary['list']);
+      $row[] = drupal_render($vocabulary['add']);
+      $rows[] = array('data' => $row, 'class' => array('draggable'));
+    }
+  }
+
+  $header = array(t('Vocabulary name'));
+  if (isset($form['actions'])) {
+    $header[] = t('Weight');
+    drupal_add_tabledrag('taxonomy', 'order', 'sibling', 'vocabulary-weight');
+  }
+  $header[] = array('data' => t('Operations'), 'colspan' => '3');
+  return theme('table', array('header' => $header, 'rows' => $rows, 'empty' => t('No vocabularies available. <a href="@link">Add vocabulary</a>.', array('@link' => url('admin/structure/taxonomy/add'))), 'attributes' => array('id' => 'taxonomy'))) . drupal_render_children($form);
+}
+
+/**
+ * Form builder for the vocabulary editing form.
+ *
+ * @ingroup forms
+ * @see taxonomy_form_vocabulary_submit()
+ * @see taxonomy_form_vocabulary_validate()
+ */
+function taxonomy_form_vocabulary($form, &$form_state, $edit = array()) {
+  // During initial form build, add the entity to the form state for use
+  // during form building and processing. During a rebuild, use what is in the
+  // form state.
+  if (!isset($form_state['vocabulary'])) {
+    $vocabulary = is_object($edit) ? $edit : (object) $edit;
+    $defaults = array(
+      'name' => '',
+      'machine_name' => '',
+      'description' => '',
+      'hierarchy' => 0,
+      'weight' => 0,
+    );
+    foreach ($defaults as $key => $value) {
+      if (!isset($vocabulary->$key)) {
+        $vocabulary->$key = $value;
+      }
+    }
+    $form_state['vocabulary'] = $vocabulary;
+  }
+  else {
+    $vocabulary = $form_state['vocabulary'];
+  }
+
+  // @todo Legacy support. Modules are encouraged to access the entity using
+  //   $form_state. Remove in Drupal 8.
+  $form['#vocabulary'] = $form_state['vocabulary'];
+
+  // Check whether we need a deletion confirmation form.
+  if (isset($form_state['confirm_delete']) && isset($form_state['values']['vid'])) {
+    return taxonomy_vocabulary_confirm_delete($form, $form_state, $form_state['values']['vid']);
+  }
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Name'),
+    '#default_value' => $vocabulary->name,
+    '#maxlength' => 255,
+    '#required' => TRUE,
+  );
+  $form['machine_name'] = array(
+    '#type' => 'machine_name',
+    '#default_value' => $vocabulary->machine_name,
+    '#maxlength' => 255,
+    '#machine_name' => array(
+      'exists' => 'taxonomy_vocabulary_machine_name_load',
+    ),
+  );
+  $form['old_machine_name'] = array(
+    '#type' => 'value',
+    '#value' => $vocabulary->machine_name,
+  );
+  $form['description'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Description'),
+    '#default_value' => $vocabulary->description,
+  );
+  // Set the hierarchy to "multiple parents" by default. This simplifies the
+  // vocabulary form and standardizes the term form.
+  $form['hierarchy'] = array(
+    '#type' => 'value',
+    '#value' => '0',
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save'));
+  if (isset($vocabulary->vid)) {
+    $form['actions']['delete'] = array('#type' => 'submit', '#value' => t('Delete'));
+    $form['vid'] = array('#type' => 'value', '#value' => $vocabulary->vid);
+    $form['module'] = array('#type' => 'value', '#value' => $vocabulary->module);
+  }
+  $form['#validate'][] = 'taxonomy_form_vocabulary_validate';
+
+  return $form;
+}
+
+/**
+ * Form validation handler for taxonomy_form_vocabulary().
+ *
+ * Makes sure that the machine name of the vocabulary is not in the
+ * disallowed list (names that conflict with menu items, such as 'list'
+ * and 'add').
+ *
+ * @see taxonomy_form_vocabulary()
+ * @see taxonomy_form_vocabulary_submit()
+ */
+function taxonomy_form_vocabulary_validate($form, &$form_state) {
+  // During the deletion there is no 'machine_name' key
+  if (isset($form_state['values']['machine_name'])) {
+    // Do not allow machine names to conflict with taxonomy path arguments.
+    $machine_name = $form_state['values']['machine_name'];
+    $disallowed = array('add', 'list');
+    if (in_array($machine_name, $disallowed)) {
+      form_set_error('machine_name', t('The machine-readable name cannot be "add" or "list".'));
+    }
+  }
+}
+
+/**
+ * Form submission handler for taxonomy_form_vocabulary().
+ *
+ * @see taxonomy_form_vocabulary()
+ * @see taxonomy_form_vocabulary_validate()
+ */
+function taxonomy_form_vocabulary_submit($form, &$form_state) {
+  if ($form_state['triggering_element']['#value'] == t('Delete')) {
+    // Rebuild the form to confirm vocabulary deletion.
+    $form_state['rebuild'] = TRUE;
+    $form_state['confirm_delete'] = TRUE;
+    return;
+  }
+
+  $vocabulary = $form_state['vocabulary'];
+  entity_form_submit_build_entity('taxonomy_vocabulary', $vocabulary, $form, $form_state);
+
+  switch (taxonomy_vocabulary_save($vocabulary)) {
+    case SAVED_NEW:
+      drupal_set_message(t('Created new vocabulary %name.', array('%name' => $vocabulary->name)));
+      watchdog('taxonomy', 'Created new vocabulary %name.', array('%name' => $vocabulary->name), WATCHDOG_NOTICE, l(t('edit'), 'admin/structure/taxonomy/' . $vocabulary->machine_name . '/edit'));
+      break;
+
+    case SAVED_UPDATED:
+      drupal_set_message(t('Updated vocabulary %name.', array('%name' => $vocabulary->name)));
+      watchdog('taxonomy', 'Updated vocabulary %name.', array('%name' => $vocabulary->name), WATCHDOG_NOTICE, l(t('edit'), 'admin/structure/taxonomy/' . $vocabulary->machine_name . '/edit'));
+      break;
+  }
+
+  $form_state['values']['vid'] = $vocabulary->vid;
+  $form_state['vid'] = $vocabulary->vid;
+  $form_state['redirect'] = 'admin/structure/taxonomy';
+}
+
+/**
+ * Form builder for the taxonomy terms overview.
+ *
+ * Display a tree of all the terms in a vocabulary, with options to edit
+ * each one. The form is made drag and drop by the theme function.
+ *
+ * @ingroup forms
+ * @see taxonomy_overview_terms_submit()
+ * @see theme_taxonomy_overview_terms()
+ */
+function taxonomy_overview_terms($form, &$form_state, $vocabulary) {
+  global $pager_page_array, $pager_total, $pager_total_items;
+
+  // Check for confirmation forms.
+  if (isset($form_state['confirm_reset_alphabetical'])) {
+    return taxonomy_vocabulary_confirm_reset_alphabetical($form, $form_state, $vocabulary->vid);
+  }
+
+  $form['#vocabulary'] = $vocabulary;
+  $form['#tree'] = TRUE;
+  $form['#parent_fields'] = FALSE;
+
+  $page            = isset($_GET['page']) ? $_GET['page'] : 0;
+  $page_increment  = variable_get('taxonomy_terms_per_page_admin', 100);  // Number of terms per page.
+  $page_entries    = 0;   // Elements shown on this page.
+  $before_entries  = 0;   // Elements at the root level before this page.
+  $after_entries   = 0;   // Elements at the root level after this page.
+  $root_entries    = 0;   // Elements at the root level on this page.
+
+  // Terms from previous and next pages are shown if the term tree would have
+  // been cut in the middle. Keep track of how many extra terms we show on each
+  // page of terms.
+  $back_step    = NULL;
+  $forward_step = 0;
+
+  // An array of the terms to be displayed on this page.
+  $current_page = array();
+
+  $delta = 0;
+  $term_deltas = array();
+  $tree = taxonomy_get_tree($vocabulary->vid);
+  $term = current($tree);
+  do {
+    // In case this tree is completely empty.
+    if (empty($term)) {
+      break;
+    }
+    $delta++;
+    // Count entries before the current page.
+    if ($page && ($page * $page_increment) > $before_entries && !isset($back_step)) {
+      $before_entries++;
+      continue;
+    }
+    // Count entries after the current page.
+    elseif ($page_entries > $page_increment && isset($complete_tree)) {
+      $after_entries++;
+      continue;
+    }
+
+    // Do not let a term start the page that is not at the root.
+    if (isset($term->depth) && ($term->depth > 0) && !isset($back_step)) {
+      $back_step = 0;
+      while ($pterm = prev($tree)) {
+        $before_entries--;
+        $back_step++;
+        if ($pterm->depth == 0) {
+          prev($tree);
+          continue 2; // Jump back to the start of the root level parent.
+       }
+      }
+    }
+    $back_step = isset($back_step) ? $back_step : 0;
+
+    // Continue rendering the tree until we reach the a new root item.
+    if ($page_entries >= $page_increment + $back_step + 1 && $term->depth == 0 && $root_entries > 1) {
+      $complete_tree = TRUE;
+      // This new item at the root level is the first item on the next page.
+      $after_entries++;
+      continue;
+    }
+    if ($page_entries >= $page_increment + $back_step) {
+      $forward_step++;
+    }
+
+    // Finally, if we've gotten down this far, we're rendering a term on this page.
+    $page_entries++;
+    $term_deltas[$term->tid] = isset($term_deltas[$term->tid]) ? $term_deltas[$term->tid] + 1 : 0;
+    $key = 'tid:' . $term->tid . ':' . $term_deltas[$term->tid];
+
+    // Keep track of the first term displayed on this page.
+    if ($page_entries == 1) {
+      $form['#first_tid'] = $term->tid;
+    }
+    // Keep a variable to make sure at least 2 root elements are displayed.
+    if ($term->parents[0] == 0) {
+      $root_entries++;
+    }
+    $current_page[$key] = $term;
+  } while ($term = next($tree));
+
+  // Because we didn't use a pager query, set the necessary pager variables.
+  $total_entries = $before_entries + $page_entries + $after_entries;
+  $pager_total_items[0] = $total_entries;
+  $pager_page_array[0] = $page;
+  $pager_total[0] = ceil($total_entries / $page_increment);
+
+  // If this form was already submitted once, it's probably hit a validation
+  // error. Ensure the form is rebuilt in the same order as the user submitted.
+  if (!empty($form_state['input'])) {
+    $order = array_flip(array_keys($form_state['input'])); // Get the $_POST order.
+    $current_page = array_merge($order, $current_page); // Update our form with the new order.
+    foreach ($current_page as $key => $term) {
+      // Verify this is a term for the current page and set at the current depth.
+      if (is_array($form_state['input'][$key]) && is_numeric($form_state['input'][$key]['tid'])) {
+        $current_page[$key]->depth = $form_state['input'][$key]['depth'];
+      }
+      else {
+        unset($current_page[$key]);
+      }
+    }
+  }
+
+  // Build the actual form.
+  foreach ($current_page as $key => $term) {
+    // Save the term for the current page so we don't have to load it a second time.
+    $form[$key]['#term'] = (array) $term;
+    if (isset($term->parents)) {
+      $form[$key]['#term']['parent'] = $term->parent = $term->parents[0];
+      unset($form[$key]['#term']['parents'], $term->parents);
+    }
+
+    $form[$key]['view'] = array('#type' => 'link', '#title' => $term->name, '#href' => "taxonomy/term/$term->tid");
+    if ($vocabulary->hierarchy < 2 && count($tree) > 1) {
+      $form['#parent_fields'] = TRUE;
+      $form[$key]['tid'] = array(
+        '#type' => 'hidden',
+        '#value' => $term->tid
+      );
+      $form[$key]['parent'] = array(
+        '#type' => 'hidden',
+        // Yes, default_value on a hidden. It needs to be changeable by the javascript.
+        '#default_value' => $term->parent,
+      );
+      $form[$key]['depth'] = array(
+        '#type' => 'hidden',
+        // Same as above, the depth is modified by javascript, so it's a default_value.
+        '#default_value' => $term->depth,
+      );
+      $form[$key]['weight'] = array(
+        '#type' => 'weight',
+        '#delta' => $delta,
+        '#title_display' => 'invisible',
+        '#title' => t('Weight for added term'),
+        '#default_value' => $term->weight,
+      );
+    }
+    $form[$key]['edit'] = array('#type' => 'link', '#title' => t('edit'), '#href' => 'taxonomy/term/' . $term->tid . '/edit', '#options' => array('query' => drupal_get_destination()));
+  }
+
+  $form['#total_entries'] = $total_entries;
+  $form['#page_increment'] = $page_increment;
+  $form['#page_entries'] = $page_entries;
+  $form['#back_step'] = $back_step;
+  $form['#forward_step'] = $forward_step;
+  $form['#empty_text'] = t('No terms available. <a href="@link">Add term</a>.', array('@link' => url('admin/structure/taxonomy/' . $vocabulary->machine_name . '/add')));
+
+  if ($vocabulary->hierarchy < 2 && count($tree) > 1) {
+    $form['actions'] = array('#type' => 'actions', '#tree' => FALSE);
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Save')
+    );
+    $form['actions']['reset_alphabetical'] = array(
+      '#type' => 'submit',
+      '#value' => t('Reset to alphabetical')
+    );
+    $form_state['redirect'] = array($_GET['q'], (isset($_GET['page']) ? array('query' => array('page' => $_GET['page'])) : array()));
+  }
+
+  return $form;
+}
+
+/**
+ * Submit handler for terms overview form.
+ *
+ * Rather than using a textfield or weight field, this form depends entirely
+ * upon the order of form elements on the page to determine new weights.
+ *
+ * Because there might be hundreds or thousands of taxonomy terms that need to
+ * be ordered, terms are weighted from 0 to the number of terms in the
+ * vocabulary, rather than the standard -10 to 10 scale. Numbers are sorted
+ * lowest to highest, but are not necessarily sequential. Numbers may be skipped
+ * when a term has children so that reordering is minimal when a child is
+ * added or removed from a term.
+ *
+ * @see taxonomy_overview_terms()
+ */
+function taxonomy_overview_terms_submit($form, &$form_state) {
+  if ($form_state['triggering_element']['#value'] == t('Reset to alphabetical')) {
+    // Execute the reset action.
+    if ($form_state['values']['reset_alphabetical'] === TRUE) {
+      return taxonomy_vocabulary_confirm_reset_alphabetical_submit($form, $form_state);
+    }
+    // Rebuild the form to confirm the reset action.
+    $form_state['rebuild'] = TRUE;
+    $form_state['confirm_reset_alphabetical'] = TRUE;
+    return;
+  }
+
+  // Sort term order based on weight.
+  uasort($form_state['values'], 'drupal_sort_weight');
+
+  $vocabulary = $form['#vocabulary'];
+  $hierarchy = 0; // Update the current hierarchy type as we go.
+
+  $changed_terms = array();
+  $tree = taxonomy_get_tree($vocabulary->vid);
+
+  if (empty($tree)) {
+    return;
+  }
+
+  // Build a list of all terms that need to be updated on previous pages.
+  $weight = 0;
+  $term = (array) $tree[0];
+  while ($term['tid'] != $form['#first_tid']) {
+    if ($term['parents'][0] == 0 && $term['weight'] != $weight) {
+      $term['parent'] = $term['parents'][0];
+      $term['weight'] = $weight;
+      $changed_terms[$term['tid']] = $term;
+    }
+    $weight++;
+    $hierarchy = $term['parents'][0] != 0 ? 1 : $hierarchy;
+    $term = (array) $tree[$weight];
+  }
+
+  // Renumber the current page weights and assign any new parents.
+  $level_weights = array();
+  foreach ($form_state['values'] as $tid => $values) {
+    if (isset($form[$tid]['#term'])) {
+      $term = $form[$tid]['#term'];
+      // Give terms at the root level a weight in sequence with terms on previous pages.
+      if ($values['parent'] == 0 && $term['weight'] != $weight) {
+        $term['weight'] = $weight;
+        $changed_terms[$term['tid']] = $term;
+      }
+      // Terms not at the root level can safely start from 0 because they're all on this page.
+      elseif ($values['parent'] > 0) {
+        $level_weights[$values['parent']] = isset($level_weights[$values['parent']]) ? $level_weights[$values['parent']] + 1 : 0;
+        if ($level_weights[$values['parent']] != $term['weight']) {
+          $term['weight'] = $level_weights[$values['parent']];
+          $changed_terms[$term['tid']] = $term;
+        }
+      }
+      // Update any changed parents.
+      if ($values['parent'] != $term['parent']) {
+        $term['parent'] = $values['parent'];
+        $changed_terms[$term['tid']] = $term;
+      }
+      $hierarchy = $term['parent'] != 0 ? 1 : $hierarchy;
+      $weight++;
+    }
+  }
+
+  // Build a list of all terms that need to be updated on following pages.
+  for ($weight; $weight < count($tree); $weight++) {
+    $term = (array) $tree[$weight];
+    if ($term['parents'][0] == 0 && $term['weight'] != $weight) {
+      $term['parent'] = $term['parents'][0];
+      $term['weight'] = $weight;
+      $changed_terms[$term['tid']] = $term;
+    }
+    $hierarchy = $term['parents'][0] != 0 ? 1 : $hierarchy;
+  }
+
+  // Save all updated terms.
+  foreach ($changed_terms as $changed) {
+    $term = (object) $changed;
+    // Update term_hierachy and term_data directly since we don't have a
+    // fully populated term object to save.
+    db_update('taxonomy_term_hierarchy')
+      ->fields(array('parent' => $term->parent))
+      ->condition('tid', $term->tid, '=')
+      ->execute();
+
+    db_update('taxonomy_term_data')
+      ->fields(array('weight' => $term->weight))
+      ->condition('tid', $term->tid, '=')
+      ->execute();
+  }
+
+  // Update the vocabulary hierarchy to flat or single hierarchy.
+  if ($vocabulary->hierarchy != $hierarchy) {
+    $vocabulary->hierarchy = $hierarchy;
+    taxonomy_vocabulary_save($vocabulary);
+  }
+  drupal_set_message(t('The configuration options have been saved.'));
+}
+
+/**
+ * Returns HTML for a terms overview form as a sortable list of terms.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @see taxonomy_overview_terms()
+ * @ingroup themeable
+ */
+function theme_taxonomy_overview_terms($variables) {
+  $form = $variables['form'];
+
+  $page_increment  = $form['#page_increment'];
+  $page_entries    = $form['#page_entries'];
+  $back_step     = $form['#back_step'];
+  $forward_step  = $form['#forward_step'];
+
+  // Add drag and drop if parent fields are present in the form.
+  if ($form['#parent_fields']) {
+    drupal_add_tabledrag('taxonomy', 'match', 'parent', 'term-parent', 'term-parent', 'term-id', FALSE);
+    drupal_add_tabledrag('taxonomy', 'depth', 'group', 'term-depth', NULL, NULL, FALSE);
+    drupal_add_js(drupal_get_path('module', 'taxonomy') . '/taxonomy.js');
+    drupal_add_js(array('taxonomy' => array('backStep' => $back_step, 'forwardStep' => $forward_step)), 'setting');
+    drupal_add_css(drupal_get_path('module', 'taxonomy') . '/taxonomy.css');
+  }
+  drupal_add_tabledrag('taxonomy', 'order', 'sibling', 'term-weight');
+
+  $errors = form_get_errors() != FALSE ? form_get_errors() : array();
+  $rows = array();
+  foreach (element_children($form) as $key) {
+    if (isset($form[$key]['#term'])) {
+      $term = &$form[$key];
+
+      $row = array();
+      $row[] = (isset($term['#term']['depth']) && $term['#term']['depth'] > 0 ? theme('indentation', array('size' => $term['#term']['depth'])) : ''). drupal_render($term['view']);
+      if ($form['#parent_fields']) {
+        $term['tid']['#attributes']['class'] = array('term-id');
+        $term['parent']['#attributes']['class'] = array('term-parent');
+        $term['depth']['#attributes']['class'] = array('term-depth');
+        $row[0] .= drupal_render($term['parent']) . drupal_render($term['tid']) . drupal_render($term['depth']);
+      }
+      $term['weight']['#attributes']['class'] = array('term-weight');
+      $row[] = drupal_render($term['weight']);
+      $row[] = drupal_render($term['edit']);
+      $row = array('data' => $row);
+      $rows[$key] = $row;
+    }
+  }
+
+  // Add necessary classes to rows.
+  $row_position = 0;
+  foreach ($rows as $key => $row) {
+    $rows[$key]['class'] = array();
+    if (isset($form['#parent_fields'])) {
+      $rows[$key]['class'][] = 'draggable';
+    }
+
+    // Add classes that mark which terms belong to previous and next pages.
+    if ($row_position < $back_step || $row_position >= $page_entries - $forward_step) {
+      $rows[$key]['class'][] = 'taxonomy-term-preview';
+    }
+
+    if ($row_position !== 0 && $row_position !== count($rows) - 1) {
+      if ($row_position == $back_step - 1 || $row_position == $page_entries - $forward_step - 1) {
+        $rows[$key]['class'][] = 'taxonomy-term-divider-top';
+      }
+      elseif ($row_position == $back_step || $row_position == $page_entries - $forward_step) {
+        $rows[$key]['class'][] = 'taxonomy-term-divider-bottom';
+      }
+    }
+
+    // Add an error class if this row contains a form error.
+    foreach ($errors as $error_key => $error) {
+      if (strpos($error_key, $key) === 0) {
+        $rows[$key]['class'][] = 'error';
+      }
+    }
+    $row_position++;
+  }
+
+  if (empty($rows)) {
+    $rows[] = array(array('data' => $form['#empty_text'], 'colspan' => '3'));
+  }
+
+  $header = array(t('Name'), t('Weight'), t('Operations'));
+  $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'taxonomy')));
+  $output .= drupal_render_children($form);
+  $output .= theme('pager');
+
+  return $output;
+}
+
+/**
+ * Form function for the term edit form.
+ *
+ * @ingroup forms
+ * @see taxonomy_form_term_submit()
+ */
+function taxonomy_form_term($form, &$form_state, $edit = array(), $vocabulary = NULL) {
+  // During initial form build, add the term entity to the form state for use
+  // during form building and processing. During a rebuild, use what is in the
+  // form state.
+  if (!isset($form_state['term'])) {
+    $term = is_object($edit) ? $edit : (object) $edit;
+    if (!isset($vocabulary) && isset($term->vid)) {
+      $vocabulary = taxonomy_vocabulary_load($term->vid);
+    }
+    $defaults = array(
+      'name' => '',
+      'description' => '',
+      'format' => NULL,
+      'vocabulary_machine_name' => isset($vocabulary) ? $vocabulary->machine_name : NULL,
+      'tid' => NULL,
+      'weight' => 0,
+    );
+    foreach ($defaults as $key => $value) {
+      if (!isset($term->$key)) {
+        $term->$key = $value;
+      }
+    }
+    $form_state['term'] = $term;
+  }
+  else {
+    $term = $form_state['term'];
+    if (!isset($vocabulary) && isset($term->vid)) {
+      $vocabulary = taxonomy_vocabulary_load($term->vid);
+    }
+  }
+
+  $parent = array_keys(taxonomy_get_parents($term->tid));
+  $form['#term'] = (array) $term;
+  $form['#term']['parent'] = $parent;
+  $form['#vocabulary'] = $vocabulary;
+
+  // Check for confirmation forms.
+  if (isset($form_state['confirm_delete'])) {
+    return array_merge($form, taxonomy_term_confirm_delete($form, $form_state, $term->tid));
+  }
+
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Name'),
+    '#default_value' => $term->name,
+    '#maxlength' => 255,
+    '#required' => TRUE,
+    '#weight' => -5,
+  );
+  $form['description'] = array(
+    '#type' => 'text_format',
+    '#title' => t('Description'),
+    '#default_value' => $term->description,
+    '#format' => $term->format,
+    '#weight' => 0,
+  );
+
+  $form['vocabulary_machine_name'] = array(
+    '#type' => 'value',
+    '#value' => isset($term->vocabulary_machine_name) ? $term->vocabulary_machine_name : $vocabulary->name,
+  );
+
+  $langcode = entity_language('taxonomy_term', $term);
+  field_attach_form('taxonomy_term', $term, $form, $form_state, $langcode);
+
+  $form['relations'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Relations'),
+    '#collapsible' => TRUE,
+    '#collapsed' => $vocabulary->hierarchy < 2,
+    '#weight' => 10,
+  );
+
+  // taxonomy_get_tree and taxonomy_get_parents may contain large numbers of
+  // items so we check for taxonomy_override_selector before loading the
+  // full vocabulary. Contrib modules can then intercept before
+  // hook_form_alter to provide scalable alternatives.
+  if (!variable_get('taxonomy_override_selector', FALSE)) {
+    $parent = array_keys(taxonomy_get_parents($term->tid));
+    $children = taxonomy_get_tree($vocabulary->vid, $term->tid);
+
+    // A term can't be the child of itself, nor of its children.
+    foreach ($children as $child) {
+      $exclude[] = $child->tid;
+    }
+    $exclude[] = $term->tid;
+
+    $tree = taxonomy_get_tree($vocabulary->vid);
+    $options = array('<' . t('root') . '>');
+    if (empty($parent)) {
+      $parent = array(0);
+    }
+    foreach ($tree as $item) {
+      if (!in_array($item->tid, $exclude)) {
+        $options[$item->tid] = str_repeat('-', $item->depth) . $item->name;
+      }
+    }
+    $form['relations']['parent'] = array(
+      '#type' => 'select',
+      '#title' => t('Parent terms'),
+      '#options' => $options,
+      '#default_value' => $parent,
+      '#multiple' => TRUE,
+    );
+
+  }
+  $form['relations']['weight'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Weight'),
+    '#size' => 6,
+    '#default_value' => $term->weight,
+    '#description' => t('Terms are displayed in ascending order by weight.'),
+    '#required' => TRUE,
+  );
+  $form['vid'] = array(
+    '#type' => 'value',
+    '#value' => $vocabulary->vid,
+  );
+  $form['tid'] = array(
+    '#type' => 'value',
+    '#value' => $term->tid,
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+    '#weight' => 5,
+  );
+
+  if ($term->tid) {
+    $form['actions']['delete'] = array(
+      '#type' => 'submit',
+      '#value' => t('Delete'),
+      '#access' => user_access("delete terms in $vocabulary->vid") || user_access('administer taxonomy'),
+      '#weight' => 10,
+    );
+  }
+  else {
+    $form_state['redirect'] = $_GET['q'];
+  }
+
+  return $form;
+}
+
+/**
+ * Validation handler for the term form.
+ *
+ * @see taxonomy_form_term()
+ */
+function taxonomy_form_term_validate($form, &$form_state) {
+  entity_form_field_validate('taxonomy_term', $form, $form_state);
+
+  // Ensure numeric values.
+  if (isset($form_state['values']['weight']) && !is_numeric($form_state['values']['weight'])) {
+    form_set_error('weight', t('Weight value must be numeric.'));
+  }
+}
+
+/**
+ * Submit handler to insert or update a term.
+ *
+ * @see taxonomy_form_term()
+ */
+function taxonomy_form_term_submit($form, &$form_state) {
+  if ($form_state['triggering_element']['#value'] == t('Delete')) {
+    // Execute the term deletion.
+    if ($form_state['values']['delete'] === TRUE) {
+      return taxonomy_term_confirm_delete_submit($form, $form_state);
+    }
+    // Rebuild the form to confirm term deletion.
+    $form_state['rebuild'] = TRUE;
+    $form_state['confirm_delete'] = TRUE;
+    return;
+  }
+
+  $term = taxonomy_form_term_submit_build_taxonomy_term($form, $form_state);
+
+  $status = taxonomy_term_save($term);
+  switch ($status) {
+    case SAVED_NEW:
+      drupal_set_message(t('Created new term %term.', array('%term' => $term->name)));
+      watchdog('taxonomy', 'Created new term %term.', array('%term' => $term->name), WATCHDOG_NOTICE, l(t('edit'), 'taxonomy/term/' . $term->tid . '/edit'));
+      break;
+    case SAVED_UPDATED:
+      drupal_set_message(t('Updated term %term.', array('%term' => $term->name)));
+      watchdog('taxonomy', 'Updated term %term.', array('%term' => $term->name), WATCHDOG_NOTICE, l(t('edit'), 'taxonomy/term/' . $term->tid . '/edit'));
+      // Clear the page and block caches to avoid stale data.
+      cache_clear_all();
+      break;
+  }
+
+  $current_parent_count = count($form_state['values']['parent']);
+  $previous_parent_count = count($form['#term']['parent']);
+  // Root doesn't count if it's the only parent.
+  if ($current_parent_count == 1 && isset($form_state['values']['parent'][0])) {
+    $current_parent_count = 0;
+    $form_state['values']['parent'] = array();
+  }
+
+  // If the number of parents has been reduced to one or none, do a check on the
+  // parents of every term in the vocabulary value.
+  if ($current_parent_count < $previous_parent_count && $current_parent_count < 2) {
+    taxonomy_check_vocabulary_hierarchy($form['#vocabulary'], $form_state['values']);
+  }
+  // If we've increased the number of parents and this is a single or flat
+  // hierarchy, update the vocabulary immediately.
+  elseif ($current_parent_count > $previous_parent_count && $form['#vocabulary']->hierarchy < 2) {
+    $form['#vocabulary']->hierarchy = $current_parent_count == 1 ? 1 : 2;
+    taxonomy_vocabulary_save($form['#vocabulary']);
+  }
+
+  $form_state['values']['tid'] = $term->tid;
+  $form_state['tid'] = $term->tid;
+}
+
+/**
+ * Updates the form state's term entity by processing this submission's values.
+ */
+function taxonomy_form_term_submit_build_taxonomy_term($form, &$form_state) {
+  $term = $form_state['term'];
+  entity_form_submit_build_entity('taxonomy_term', $term, $form, $form_state);
+
+  // Convert text_format field into values expected by taxonomy_term_save().
+  $description = $form_state['values']['description'];
+  $term->description = $description['value'];
+  $term->format = $description['format'];
+  return $term;
+}
+
+/**
+ * Form builder for the term delete form.
+ *
+ * @ingroup forms
+ * @see taxonomy_term_confirm_delete_submit()
+ */
+function taxonomy_term_confirm_delete($form, &$form_state, $tid) {
+  $term = taxonomy_term_load($tid);
+
+  // Always provide entity id in the same form key as in the entity edit form.
+  $form['tid'] = array('#type' => 'value', '#value' => $tid);
+
+  $form['#term'] = $term;
+  $form['type'] = array('#type' => 'value', '#value' => 'term');
+  $form['name'] = array('#type' => 'value', '#value' => $term->name);
+  $form['vocabulary_machine_name'] = array('#type' => 'value', '#value' => $term->vocabulary_machine_name);
+  $form['delete'] = array('#type' => 'value', '#value' => TRUE);
+  return confirm_form($form,
+    t('Are you sure you want to delete the term %title?',
+    array('%title' => $term->name)),
+    'admin/structure/taxonomy',
+    t('Deleting a term will delete all its children if there are any. This action cannot be undone.'),
+    t('Delete'),
+    t('Cancel'));
+}
+
+/**
+ * Submit handler to delete a term after confirmation.
+ *
+ * @see taxonomy_term_confirm_delete()
+ */
+function taxonomy_term_confirm_delete_submit($form, &$form_state) {
+  taxonomy_term_delete($form_state['values']['tid']);
+  taxonomy_check_vocabulary_hierarchy($form['#vocabulary'], $form_state['values']);
+  drupal_set_message(t('Deleted term %name.', array('%name' => $form_state['values']['name'])));
+  watchdog('taxonomy', 'Deleted term %name.', array('%name' => $form_state['values']['name']), WATCHDOG_NOTICE);
+  $form_state['redirect'] = 'admin/structure/taxonomy';
+  cache_clear_all();
+  return;
+}
+
+/**
+ * Form builder for the vocabulary delete confirmation form.
+ *
+ * @ingroup forms
+ * @see taxonomy_vocabulary_confirm_delete_submit()
+ */
+function taxonomy_vocabulary_confirm_delete($form, &$form_state, $vid) {
+  $vocabulary = taxonomy_vocabulary_load($vid);
+
+  // Always provide entity id in the same form key as in the entity edit form.
+  $form['vid'] = array('#type' => 'value', '#value' => $vid);
+
+  $form['#vocabulary'] = $vocabulary;
+  $form['#id'] = 'taxonomy_vocabulary_confirm_delete';
+  $form['type'] = array('#type' => 'value', '#value' => 'vocabulary');
+  $form['name'] = array('#type' => 'value', '#value' => $vocabulary->name);
+  $form['#submit'] = array('taxonomy_vocabulary_confirm_delete_submit');
+  return confirm_form($form,
+    t('Are you sure you want to delete the vocabulary %title?',
+    array('%title' => $vocabulary->name)),
+    'admin/structure/taxonomy',
+    t('Deleting a vocabulary will delete all the terms in it. This action cannot be undone.'),
+    t('Delete'),
+    t('Cancel'));
+}
+
+/**
+ * Submit handler to delete a vocabulary after confirmation.
+ *
+ * @see taxonomy_vocabulary_confirm_delete()
+ */
+function taxonomy_vocabulary_confirm_delete_submit($form, &$form_state) {
+  $status = taxonomy_vocabulary_delete($form_state['values']['vid']);
+  drupal_set_message(t('Deleted vocabulary %name.', array('%name' => $form_state['values']['name'])));
+  watchdog('taxonomy', 'Deleted vocabulary %name.', array('%name' => $form_state['values']['name']), WATCHDOG_NOTICE);
+  $form_state['redirect'] = 'admin/structure/taxonomy';
+  cache_clear_all();
+  return;
+}
+
+/**
+ * Form builder to confirm resetting a vocabulary to alphabetical order.
+ *
+ * @ingroup forms
+ * @see taxonomy_vocabulary_confirm_reset_alphabetical_submit()
+ */
+function taxonomy_vocabulary_confirm_reset_alphabetical($form, &$form_state, $vid) {
+  $vocabulary = taxonomy_vocabulary_load($vid);
+
+  $form['type'] = array('#type' => 'value', '#value' => 'vocabulary');
+  $form['vid'] = array('#type' => 'value', '#value' => $vid);
+  $form['machine_name'] = array('#type' => 'value', '#value' => $vocabulary->machine_name);
+  $form['name'] = array('#type' => 'value', '#value' => $vocabulary->name);
+  $form['reset_alphabetical'] = array('#type' => 'value', '#value' => TRUE);
+  return confirm_form($form,
+                  t('Are you sure you want to reset the vocabulary %title to alphabetical order?',
+                  array('%title' => $vocabulary->name)),
+                  'admin/structure/taxonomy/' . $vocabulary->machine_name,
+                  t('Resetting a vocabulary will discard all custom ordering and sort items alphabetically.'),
+                  t('Reset to alphabetical'),
+                  t('Cancel'));
+}
+
+/**
+ * Submit handler to reset a vocabulary to alphabetical order after confirmation.
+ *
+ * @see taxonomy_vocabulary_confirm_reset_alphabetical()
+ */
+function taxonomy_vocabulary_confirm_reset_alphabetical_submit($form, &$form_state) {
+  db_update('taxonomy_term_data')
+    ->fields(array('weight' => 0))
+    ->condition('vid', $form_state['values']['vid'])
+    ->execute();
+  drupal_set_message(t('Reset vocabulary %name to alphabetical order.', array('%name' => $form_state['values']['name'])));
+  watchdog('taxonomy', 'Reset vocabulary %name to alphabetical order.', array('%name' => $form_state['values']['name']), WATCHDOG_NOTICE);
+  $form_state['redirect'] = 'admin/structure/taxonomy/' . $form_state['values']['machine_name'];
+}
diff --git a/htmltest/modules/taxonomy/taxonomy.api.php b/htmltest/modules/taxonomy/taxonomy.api.php
new file mode 100644
index 00000000..b9c23dbf
--- /dev/null
+++ b/htmltest/modules/taxonomy/taxonomy.api.php
@@ -0,0 +1,231 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Taxonomy module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Act on taxonomy vocabularies when loaded.
+ *
+ * Modules implementing this hook can act on the vocabulary objects before they
+ * are returned by taxonomy_vocabulary_load_multiple().
+ *
+ * @param $vocabulary
+ *   An array of taxonomy vocabulary objects.
+ */
+function hook_taxonomy_vocabulary_load($vocabularies) {
+  $result = db_select('mytable', 'm')
+    ->fields('m', array('vid', 'foo'))
+    ->condition('m.vid', array_keys($vocabularies), 'IN')
+    ->execute();
+  foreach ($result as $record) {
+    $vocabularies[$record->vid]->foo = $record->foo;
+  }
+}
+
+/**
+ * Act on taxonomy vocabularies before they are saved.
+ *
+ * Modules implementing this hook can act on the vocabulary object before it is
+ * inserted or updated.
+ *
+ * @param $vocabulary
+ *   A taxonomy vocabulary object.
+ */
+function hook_taxonomy_vocabulary_presave($vocabulary) {
+  $vocabulary->foo = 'bar';
+}
+
+/**
+ * Act on taxonomy vocabularies when inserted.
+ *
+ * Modules implementing this hook can act on the vocabulary object when saved
+ * to the database.
+ *
+ * @param $vocabulary
+ *   A taxonomy vocabulary object.
+ */
+function hook_taxonomy_vocabulary_insert($vocabulary) {
+  if ($vocabulary->machine_name == 'my_vocabulary') {
+    $vocabulary->weight = 100;
+  }
+}
+
+/**
+ * Act on taxonomy vocabularies when updated.
+ *
+ * Modules implementing this hook can act on the vocabulary object when updated.
+ *
+ * @param $vocabulary
+ *   A taxonomy vocabulary object.
+ */
+function hook_taxonomy_vocabulary_update($vocabulary) {
+  db_update('mytable')
+    ->fields(array('foo' => $vocabulary->foo))
+    ->condition('vid', $vocabulary->vid)
+    ->execute();
+}
+
+/**
+ * Respond to the deletion of taxonomy vocabularies.
+ *
+ * Modules implementing this hook can respond to the deletion of taxonomy
+ * vocabularies from the database.
+ *
+ * @param $vocabulary
+ *   A taxonomy vocabulary object.
+ */
+function hook_taxonomy_vocabulary_delete($vocabulary) {
+  db_delete('mytable')
+    ->condition('vid', $vocabulary->vid)
+    ->execute();
+}
+
+/**
+ * Act on taxonomy terms when loaded.
+ *
+ * Modules implementing this hook can act on the term objects returned by
+ * taxonomy_term_load_multiple().
+ *
+ * For performance reasons, information to be added to term objects should be
+ * loaded in a single query for all terms where possible.
+ *
+ * Since terms are stored and retrieved from cache during a page request, avoid
+ * altering properties provided by the {taxonomy_term_data} table, since this
+ * may affect the way results are loaded from cache in subsequent calls.
+ *
+ * @param $terms
+ *   An array of term objects, indexed by tid.
+ */
+function hook_taxonomy_term_load($terms) {
+  $result = db_select('mytable', 'm')
+    ->fields('m', array('tid', 'foo'))
+    ->condition('m.tid', array_keys($terms), 'IN')
+    ->execute();
+  foreach ($result as $record) {
+    $terms[$record->tid]->foo = $record->foo;
+  }
+}
+
+/**
+ * Act on taxonomy terms before they are saved.
+ *
+ * Modules implementing this hook can act on the term object before it is
+ * inserted or updated.
+ *
+ * @param $term
+ *   A term object.
+ */
+function hook_taxonomy_term_presave($term) {
+  $term->foo = 'bar';
+}
+
+/**
+ * Act on taxonomy terms when inserted.
+ *
+ * Modules implementing this hook can act on the term object when saved to
+ * the database.
+ *
+ * @param $term
+ *   A taxonomy term object.
+ */
+function hook_taxonomy_term_insert($term) {
+  db_insert('mytable')
+    ->fields(array(
+      'tid' => $term->tid,
+      'foo' => $term->foo,
+    ))
+    ->execute();
+}
+
+/**
+ * Act on taxonomy terms when updated.
+ *
+ * Modules implementing this hook can act on the term object when updated.
+ *
+ * @param $term
+ *   A taxonomy term object.
+ */
+function hook_taxonomy_term_update($term) {
+  db_update('mytable')
+    ->fields(array('foo' => $term->foo))
+    ->condition('tid', $term->tid)
+    ->execute();
+}
+
+/**
+ * Respond to the deletion of taxonomy terms.
+ *
+ * Modules implementing this hook can respond to the deletion of taxonomy
+ * terms from the database.
+ *
+ * @param $term
+ *   A taxonomy term object.
+ */
+function hook_taxonomy_term_delete($term) {
+  db_delete('mytable')
+    ->condition('tid', $term->tid)
+    ->execute();
+}
+
+/**
+ * Act on a taxonomy term that is being assembled before rendering.
+ *
+ * The module may add elements to $term->content prior to rendering. The
+ * structure of $term->content is a renderable array as expected by
+ * drupal_render().
+ *
+ * @param $term
+ *   The term that is being assembled for rendering.
+ * @param $view_mode
+ *   The $view_mode parameter from taxonomy_term_view().
+ * @param $langcode
+ *   The language code used for rendering.
+ *
+ * @see hook_entity_view()
+ */
+function hook_taxonomy_term_view($term, $view_mode, $langcode) {
+  $term->content['my_additional_field'] = array(
+    '#markup' => $additional_field,
+    '#weight' => 10,
+    '#theme' => 'mymodule_my_additional_field',
+  );
+}
+
+/**
+ * Alter the results of taxonomy_term_view().
+ *
+ * This hook is called after the content has been assembled in a structured
+ * array and may be used for doing processing which requires that the complete
+ * taxonomy term content structure has been built.
+ *
+ * If the module wishes to act on the rendered HTML of the term rather than the
+ * structured content array, it may use this hook to add a #post_render
+ * callback. Alternatively, it could also implement
+ * hook_preprocess_taxonomy_term(). See drupal_render() and theme()
+ * documentation respectively for details.
+ *
+ * @param $build
+ *   A renderable array representing the node content.
+ *
+ * @see hook_entity_view_alter()
+ */
+function hook_taxonomy_term_view_alter(&$build) {
+  if ($build['#view_mode'] == 'full' && isset($build['an_additional_field'])) {
+    // Change its weight.
+    $build['an_additional_field']['#weight'] = -10;
+  }
+
+  // Add a #post_render callback to act on the rendered HTML of the term.
+  $build['#post_render'][] = 'my_module_node_post_render';
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/taxonomy/taxonomy.css b/htmltest/modules/taxonomy/taxonomy.css
new file mode 100644
index 00000000..36cd641b
--- /dev/null
+++ b/htmltest/modules/taxonomy/taxonomy.css
@@ -0,0 +1,13 @@
+
+tr.taxonomy-term-preview {
+  background-color: #EEE;
+}
+tr.taxonomy-term-divider-top {
+  border-bottom: none;
+}
+tr.taxonomy-term-divider-bottom {
+  border-top: 1px dotted #CCC;
+}
+.taxonomy-term-description {
+  margin: 5px 0 20px;
+}
diff --git a/htmltest/modules/taxonomy/taxonomy.info b/htmltest/modules/taxonomy/taxonomy.info
new file mode 100644
index 00000000..8ef92435
--- /dev/null
+++ b/htmltest/modules/taxonomy/taxonomy.info
@@ -0,0 +1,15 @@
+name = Taxonomy
+description = Enables the categorization of content.
+package = Core
+version = VERSION
+core = 7.x
+dependencies[] = options
+files[] = taxonomy.module
+files[] = taxonomy.test
+configure = admin/structure/taxonomy
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/taxonomy/taxonomy.install b/htmltest/modules/taxonomy/taxonomy.install
new file mode 100644
index 00000000..2d44d3db
--- /dev/null
+++ b/htmltest/modules/taxonomy/taxonomy.install
@@ -0,0 +1,890 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the taxonomy module.
+ */
+
+/**
+ * Implements hook_uninstall().
+ */
+function taxonomy_uninstall() {
+  // Remove variables.
+  variable_del('taxonomy_override_selector');
+  variable_del('taxonomy_terms_per_page_admin');
+  // Remove taxonomy_term bundles.
+  $vocabularies = db_query("SELECT machine_name FROM {taxonomy_vocabulary}")->fetchCol();
+  foreach ($vocabularies as $vocabulary) {
+    field_attach_delete_bundle('taxonomy_term', $vocabulary);
+  }
+}
+
+/**
+ * Implements hook_schema().
+ */
+function taxonomy_schema() {
+  $schema['taxonomy_term_data'] = array(
+    'description' => 'Stores term information.',
+    'fields' => array(
+      'tid' => array(
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique term ID.',
+      ),
+      'vid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The {taxonomy_vocabulary}.vid of the vocabulary to which the term is assigned.',
+      ),
+      'name' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The term name.',
+        'translatable' => TRUE,
+      ),
+      'description' => array(
+        'type' => 'text',
+        'not null' => FALSE,
+        'size' => 'big',
+        'description' => 'A description of the term.',
+        'translatable' => TRUE,
+      ),
+      'format' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => FALSE,
+        'description' => 'The {filter_format}.format of the description.',
+      ),
+      'weight' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The weight of this term in relation to other terms.',
+      ),
+    ),
+    'primary key' => array('tid'),
+    'foreign keys' => array(
+      'vocabulary' => array(
+        'table' => 'taxonomy_vocabulary',
+        'columns' => array('vid' => 'vid'),
+      ),
+    ),
+    'indexes' => array(
+      'taxonomy_tree' => array('vid', 'weight', 'name'),
+      'vid_name' => array('vid', 'name'),
+      'name' => array('name'),
+    ),
+  );
+
+  $schema['taxonomy_term_hierarchy'] = array(
+    'description' => 'Stores the hierarchical relationship between terms.',
+    'fields' => array(
+      'tid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Primary Key: The {taxonomy_term_data}.tid of the term.',
+      ),
+      'parent' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => "Primary Key: The {taxonomy_term_data}.tid of the term's parent. 0 indicates no parent.",
+      ),
+    ),
+    'indexes' => array(
+      'parent' => array('parent'),
+    ),
+    'foreign keys' => array(
+      'taxonomy_term_data' => array(
+        'table' => 'taxonomy_term_data',
+        'columns' => array('tid' => 'tid'),
+      ),
+    ),
+    'primary key' => array('tid', 'parent'),
+  );
+
+  $schema['taxonomy_vocabulary'] = array(
+    'description' => 'Stores vocabulary information.',
+    'fields' => array(
+      'vid' => array(
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique vocabulary ID.',
+      ),
+      'name' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Name of the vocabulary.',
+        'translatable' => TRUE,
+      ),
+      'machine_name' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The vocabulary machine name.',
+      ),
+      'description' => array(
+        'type' => 'text',
+        'not null' => FALSE,
+        'size' => 'big',
+        'description' => 'Description of the vocabulary.',
+        'translatable' => TRUE,
+      ),
+      'hierarchy' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'The type of hierarchy allowed within the vocabulary. (0 = disabled, 1 = single, 2 = multiple)',
+      ),
+      'module' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The module which created the vocabulary.',
+      ),
+      'weight' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The weight of this vocabulary in relation to other vocabularies.',
+      ),
+    ),
+    'primary key' => array('vid'),
+    'indexes' => array(
+      'list' => array('weight', 'name'),
+    ),
+    'unique keys' => array(
+      'machine_name' => array('machine_name'),
+    ),
+  );
+
+  $schema['taxonomy_index'] = array(
+    'description' => 'Maintains denormalized information about node/term relationships.',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The {node}.nid this record tracks.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'tid' => array(
+         'description' => 'The term ID.',
+         'type' => 'int',
+         'unsigned' => TRUE,
+         'not null' => TRUE,
+         'default' => 0,
+      ),
+      'sticky' => array(
+        'description' => 'Boolean indicating whether the node is sticky.',
+        'type' => 'int',
+        'not null' => FALSE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'created' => array(
+        'description' => 'The Unix timestamp when the node was created.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default'=> 0,
+      ),
+    ),
+    'indexes' => array(
+      'term_node' => array('tid', 'sticky', 'created'),
+      'nid' => array('nid'),
+    ),
+    'foreign keys' => array(
+      'tracked_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+      'term' => array(
+        'table' => 'taxonomy_term_data',
+        'columns' => array('tid' => 'tid'),
+      ),
+    ),
+  );
+
+  return $schema;
+}
+
+/**
+ * Implements hook_field_schema().
+ */
+function taxonomy_field_schema($field) {
+  return array(
+    'columns' => array(
+      'tid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => FALSE,
+      ),
+    ),
+    'indexes' => array(
+      'tid' => array('tid'),
+    ),
+    'foreign keys' => array(
+      'tid' => array(
+        'table' => 'taxonomy_term_data',
+        'columns' => array('tid' => 'tid'),
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_update_dependencies().
+ */
+function taxonomy_update_dependencies() {
+  // taxonomy_update_7004() migrates taxonomy term data to fields and therefore
+  // must run after all Field modules have been enabled, which happens in
+  // system_update_7027().
+  $dependencies['taxonomy'][7004] = array(
+    'system' => 7027,
+  );
+
+  return $dependencies;
+}
+
+/**
+ * Utility function: get the list of vocabularies directly from the database.
+ *
+ * This function is valid for a database schema version 7002.
+ *
+ * @ingroup update_api
+ */
+function _update_7002_taxonomy_get_vocabularies() {
+  return db_query('SELECT v.* FROM {taxonomy_vocabulary} v ORDER BY v.weight, v.name')->fetchAllAssoc('vid', PDO::FETCH_OBJ);
+}
+
+/**
+ * Rename taxonomy tables.
+ */
+function taxonomy_update_7001() {
+  db_rename_table('term_data', 'taxonomy_term_data');
+  db_rename_table('term_hierarchy', 'taxonomy_term_hierarchy');
+  db_rename_table('term_node', 'taxonomy_term_node');
+  db_rename_table('term_relation', 'taxonomy_term_relation');
+  db_rename_table('term_synonym', 'taxonomy_term_synonym');
+  db_rename_table('vocabulary', 'taxonomy_vocabulary');
+  db_rename_table('vocabulary_node_types', 'taxonomy_vocabulary_node_type');
+}
+
+/**
+ * Add {vocabulary}.machine_name column.
+ */
+function taxonomy_update_7002() {
+  $field = array(
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => TRUE,
+    'default' => '',
+    'description' => 'The vocabulary machine name.',
+  );
+
+  db_add_field('taxonomy_vocabulary', 'machine_name', $field);
+
+  // Do a direct query here, rather than calling taxonomy_get_vocabularies(),
+  // in case Taxonomy module is disabled.
+  $vids = db_query('SELECT vid FROM {taxonomy_vocabulary}')->fetchCol();
+  foreach ($vids as $vid) {
+    $machine_name = 'vocabulary_' . $vid;
+    db_update('taxonomy_vocabulary')
+      ->fields(array('machine_name' => $machine_name))
+      ->condition('vid', $vid)
+      ->execute();
+  }
+
+  // The machine_name unique key can only be added after we ensure the
+  // machine_name column contains unique values.
+  db_add_unique_key('taxonomy_vocabulary', 'machine_name', array('machine_name'));
+}
+
+/**
+ * Remove the related terms setting from vocabularies.
+ *
+ * This setting has not been used since Drupal 6. The {taxonomy_relations} table
+ * itself is retained to allow for data to be upgraded.
+ */
+function taxonomy_update_7003() {
+  db_drop_field('taxonomy_vocabulary', 'relations');
+}
+
+/**
+ * Move taxonomy vocabulary associations for nodes to fields and field instances.
+ */
+function taxonomy_update_7004() {
+  $taxonomy_index = array(
+    'description' => 'Maintains denormalized information about node/term relationships.',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The {node}.nid this record tracks.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'tid' => array(
+         'description' => 'The term ID.',
+         'type' => 'int',
+         'unsigned' => TRUE,
+         'not null' => TRUE,
+         'default' => 0,
+      ),
+      'sticky' => array(
+        'description' => 'Boolean indicating whether the node is sticky.',
+        'type' => 'int',
+        'not null' => FALSE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'created' => array(
+        'description' => 'The Unix timestamp when the node was created.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default'=> 0,
+      ),
+    ),
+    'indexes' => array(
+      'term_node' => array('tid', 'sticky', 'created'),
+      'nid' => array('nid'),
+    ),
+    'foreign keys' => array(
+      'tracked_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+      'term' => array(
+        'table' => 'taxonomy_term_data',
+        'columns' => array('tid' => 'tid'),
+      ),
+    ),
+  );
+  db_create_table('taxonomy_index', $taxonomy_index);
+
+  // Use an inline version of Drupal 6 taxonomy_get_vocabularies() here since
+  // we can no longer rely on $vocabulary->nodes from the API function.
+  $result = db_query('SELECT v.*, n.type FROM {taxonomy_vocabulary} v LEFT JOIN {taxonomy_vocabulary_node_type} n ON v.vid = n.vid ORDER BY v.weight, v.name');
+  $vocabularies = array();
+  foreach ($result as $record) {
+    // If no node types are associated with a vocabulary, the LEFT JOIN will
+    // return a NULL value for type.
+    if (isset($record->type)) {
+      $node_types[$record->vid][$record->type] = $record->type;
+      unset($record->type);
+      $record->nodes = $node_types[$record->vid];
+    }
+    elseif (!isset($record->nodes)) {
+      $record->nodes = array();
+    }
+    $vocabularies[$record->vid] = $record;
+  }
+
+  foreach ($vocabularies as $vocabulary) {
+    $field_name = 'taxonomy_' . $vocabulary->machine_name;
+    $field = array(
+      'field_name' => $field_name,
+      'module' => 'taxonomy',
+      'type' => 'taxonomy_term_reference',
+      'cardinality' => $vocabulary->multiple || $vocabulary->tags ? FIELD_CARDINALITY_UNLIMITED : 1,
+      'settings' => array(
+        'required' => $vocabulary->required ? TRUE : FALSE,
+        'allowed_values' => array(
+          array(
+            'vocabulary' => $vocabulary->machine_name,
+            'parent' => 0,
+          ),
+        ),
+      ),
+    );
+    _update_7000_field_create_field($field);
+
+    foreach ($vocabulary->nodes as $bundle) {
+      $instance = array(
+        'label' => $vocabulary->name,
+        'field_name' => $field_name,
+        'bundle' => $bundle,
+        'entity_type' => 'node',
+        'settings' => array(),
+        'description' => $vocabulary->help,
+        'required' => $vocabulary->required,
+        'widget' => array(),
+        'display' => array(
+          'default' => array(
+            'type' => 'taxonomy_term_reference_link',
+            'weight' => 10,
+          ),
+          'teaser' => array(
+            'type' => 'taxonomy_term_reference_link',
+            'weight' => 10,
+          ),
+        ),
+      );
+      if ($vocabulary->tags) {
+        $instance['widget'] = array(
+          'type' => 'taxonomy_autocomplete',
+          'module' => 'taxonomy',
+          'settings' => array(
+            'size' => 60,
+            'autocomplete_path' => 'taxonomy/autocomplete',
+          ),
+        );
+      }
+      else {
+        $instance['widget'] = array(
+          'type' => 'select',
+          'module' => 'options',
+          'settings' => array(),
+        );
+      }
+      _update_7000_field_create_instance($field, $instance);
+    }
+  }
+
+  // Some contrib projects stored term node associations without regard for the
+  // selections in the taxonomy_vocabulary_node_types table, or have more terms
+  // for a single node than the vocabulary allowed. We construct the
+  // taxonomyextra field to store all the extra stuff.
+
+  // Allowed values for this extra vocabs field is every vocabulary.
+  $allowed_values = array();
+  foreach (_update_7002_taxonomy_get_vocabularies() as $vocabulary) {
+    $allowed_values[] = array(
+      'vocabulary' => $vocabulary->machine_name,
+      'parent' => 0,
+    );
+  }
+
+  $field_name = 'taxonomyextra';
+  $field = array(
+    'field_name' => $field_name,
+    'module' => 'taxonomy',
+    'type' => 'taxonomy_term_reference',
+    'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+    'settings' => array(
+      'required' => FALSE,
+      'allowed_values' => $allowed_values,
+    ),
+  );
+  _update_7000_field_create_field($field);
+
+  foreach (_update_7000_node_get_types() as $bundle) {
+    $instance = array(
+      'label' => 'Taxonomy upgrade extras',
+      'field_name' => $field_name,
+      'entity_type' => 'node',
+      'bundle' => $bundle->type,
+      'settings' => array(),
+      'description' => 'Debris left over after upgrade from Drupal 6',
+      'widget' => array(
+        'type' => 'taxonomy_autocomplete',
+        'module' => 'taxonomy',
+        'settings' => array(),
+      ),
+      'display' => array(
+        'default' => array(
+          'type' => 'taxonomy_term_reference_link',
+          'weight' => 10,
+        ),
+        'teaser' => array(
+          'type' => 'taxonomy_term_reference_link',
+          'weight' => 10,
+        ),
+      ),
+    );
+    _update_7000_field_create_instance($field, $instance);
+  }
+
+  $fields = array('help', 'multiple', 'required', 'tags');
+  foreach ($fields as $field) {
+    db_drop_field('taxonomy_vocabulary', $field);
+  }
+}
+
+/**
+ * Migrate {taxonomy_term_node} table to field storage.
+ *
+ * @todo: This function can possibly be made much faster by wrapping a
+ * transaction around all the inserts.
+ */
+function taxonomy_update_7005(&$sandbox) {
+  // $sandbox contents:
+  // - total: The total number of term_node relationships to migrate.
+  // - count: The number of term_node relationships that have been
+  //   migrated so far.
+  // - last: The db_query_range() offset to use when querying
+  //   term_node; this field is incremented in quantities of $batch
+  //   (1000) but at the end of each call to this function, last and
+  //   count are the same.
+  // - vocabularies: An associative array mapping vocabulary id and node
+  //   type to field name. If a voc id/node type pair does not appear
+  //   in this array but a term_node relationship exists mapping a
+  //   term in voc id to node of that type, the relationship is
+  //   assigned to the taxonomymyextra field which allows terms of all
+  //   vocabularies.
+  // - cursor[values], cursor[deltas]: The contents of $values and
+  //   $deltas at the end of the previous call to this function. These
+  //   need to be preserved across calls because a single batch of
+  //   1000 rows from term_node may end in the middle of the terms for
+  //   a single node revision.
+  //
+  // $values is the array of values about to be/most recently inserted
+  // into the SQL data table for the taxonomy_term_reference
+  // field. Before $values is constructed for each record, the
+  // $values from the previous insert is checked to see if the two
+  // records are for the same node revision id; this enables knowing
+  // when to reset the delta counters which are incremented across all
+  // terms for a single field on a single revision, but reset for each
+  // new field and revision.
+  //
+  // $deltas is an associative array mapping field name to the number
+  // of term references stored so far for the current revision, which
+  // provides the delta value for each term reference data insert. The
+  // deltas are reset for each new revision.
+  
+  $conditions = array(
+    'type' => 'taxonomy_term_reference',
+    'deleted' => 0,
+  );
+  $field_info = _update_7000_field_read_fields($conditions, 'field_name');
+
+  // This is a multi-pass update. On the first call we need to initialize some
+  // variables.
+  if (!isset($sandbox['total'])) {
+    $sandbox['last'] = 0;
+    $sandbox['count'] = 0;
+
+    // Run the same joins as the query that is used later to retrieve the
+    // term_node data, this ensures that bad records in that table - for
+    // tids which aren't in taxonomy_term_data or nids which aren't in {node}
+    // are not included in the count.
+    $sandbox['total'] = db_query('SELECT COUNT(*) FROM {taxonomy_term_data} td INNER JOIN {taxonomy_term_node} tn ON td.tid = tn.tid INNER JOIN {node} n ON tn.nid = n.nid LEFT JOIN {node} n2 ON tn.vid = n2.vid')->fetchField();
+
+    // Use an inline version of Drupal 6 taxonomy_get_vocabularies() here since
+    // we can no longer rely on $vocabulary->nodes from the API function.
+    $result = db_query('SELECT v.vid, v.machine_name, n.type FROM {taxonomy_vocabulary} v INNER JOIN {taxonomy_vocabulary_node_type} n ON v.vid = n.vid');
+    $vocabularies = array();
+    foreach ($result as $record) {
+
+      // If no node types are associated with a vocabulary, the LEFT JOIN will
+      // return a NULL value for type.
+      if (isset($record->type)) {
+        $vocabularies[$record->vid][$record->type] = 'taxonomy_'. $record->machine_name;
+      }
+    }
+
+    if (!empty($vocabularies)) {
+      $sandbox['vocabularies'] = $vocabularies;
+    }
+
+    db_create_table('taxonomy_update_7005', array(
+      'description' => 'Stores temporary data for taxonomy_update_7005.',
+      'fields' => array(
+        'n' => array(
+          'description' => 'Preserve order.',
+          'type' => 'serial',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+        ),
+        'vocab_id' => array(
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+          'default' => 0,
+        ),
+        'tid' => array(
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+        ),
+        'nid' => array(
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+        ),
+        'vid' => array(
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => FALSE,
+          'default' => NULL,
+        ),
+        'type' => array(
+          'type' => 'varchar',
+          'length' => 32,
+          'not null' => TRUE,
+          'default' => '',
+        ),
+        'created' => array(
+          'type' => 'int',
+          'not null' => FALSE,
+        ),
+        'sticky' => array(
+          'type' => 'int',
+          'not null' => FALSE,
+        ),
+        'is_current' => array(
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => FALSE,
+        ),
+      ),
+      'primary key' => array('n'),
+    ));
+
+    // Query selects all revisions at once and processes them in revision and
+    // term weight order.
+    $query = db_select('taxonomy_term_data', 'td');
+    // We are migrating term-node relationships. If there are none for a
+    // term, we do not need the term_data row.
+    $query->join('taxonomy_term_node', 'tn', 'td.tid = tn.tid');
+    // If a term-node relationship exists for a nid that does not exist, we
+    // cannot migrate it as we have no node to relate it to; thus we do not
+    // need that row from term_node.
+    $query->join('node', 'n', 'tn.nid = n.nid');
+    // If the current term-node relationship is for the current revision of
+    // the node, this left join will match and is_current will be non-NULL
+    // (we also get the current sticky and created in this case). This
+    // tells us whether to insert into the current data tables in addition
+    // to the revision data tables.
+    $query->leftJoin('node', 'n2', 'tn.vid = n2.vid');
+    $query->addField('td', 'vid', 'vocab_id');
+    $query->addField('td', 'tid');
+    $query->addField('tn', 'nid');
+    $query->addField('tn', 'vid');
+    $query->addField('n', 'type');
+    $query->addField('n2', 'created');
+    $query->addField('n2', 'sticky');
+    $query->addField('n2', 'nid', 'is_current');
+    // This query must return a consistent ordering across multiple calls.
+    // We need them ordered by node vid (since we use that to decide when
+    // to reset the delta counters) and by term weight so they appear
+    // within each node in weight order. However, tn.vid,td.weight is not
+    // guaranteed to be unique, so we add tn.tid as an additional sort key
+    // because tn.tid,tn.vid is the primary key of the D6 term_node table
+    // and so is guaranteed unique. Unfortunately it also happens to be in
+    // the wrong order which is less efficient, but c'est la vie.
+    $query->orderBy('tn.vid');
+    $query->orderBy('td.weight');
+    $query->orderBy('tn.tid');
+
+    // Work around a bug in the PostgreSQL driver that would result in fatal
+    // errors when this subquery is used in the insert query below. See
+    // https://drupal.org/node/2057693.
+    $fields = &$query->getFields();
+    unset($fields['td.weight']);
+    unset($fields['tn.tid']);
+
+    db_insert('taxonomy_update_7005')
+      ->from($query)
+      ->execute();
+  }
+  else {
+    // We do each pass in batches of 1000.
+    $batch = 1000;
+
+    $result = db_query_range('SELECT vocab_id, tid, nid, vid, type, created, sticky, is_current FROM {taxonomy_update_7005} ORDER BY n', $sandbox['last'], $batch);
+    if (isset($sandbox['cursor'])) {
+      $values = $sandbox['cursor']['values'];
+      $deltas = $sandbox['cursor']['deltas'];
+    }
+    else {
+      $deltas = array();
+    }
+    foreach ($result as $record) {
+      $sandbox['count'] += 1;
+
+      // Use the valid field for this vocabulary and node type or use the
+      // overflow vocabulary if there is no valid field.
+      $field_name = isset($sandbox['vocabularies'][$record->vocab_id][$record->type]) ? $sandbox['vocabularies'][$record->vocab_id][$record->type] : 'taxonomyextra';
+      $field = $field_info[$field_name];
+
+      // Start deltas from 0, and increment by one for each term attached to a
+      // node.
+      if (!isset($deltas[$field_name])) {
+        $deltas[$field_name] = 0;
+      }
+
+      if (isset($values)) {
+
+        // If the last inserted revision_id is the same as the current record,
+        // use the previous deltas to calculate the next delta.
+        if ($record->vid == $values[2]) {
+
+          // For limited cardinality fields, the delta must not be allowed to
+          // exceed the cardinality during the update. So ensure that the
+          // delta about to be inserted is within this limit.
+          // @see field_default_validate().
+          if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED && ($deltas[$field_name] + 1) > $field['cardinality']) {
+
+            // For excess values of a single-term vocabulary, switch over to
+            // the overflow field.
+            $field_name = 'taxonomyextra';
+            $field = $field_info[$field_name];
+            if (!isset($deltas[$field_name])) {
+              $deltas[$field_name] = 0;
+            }
+          }
+        }
+        else {
+
+          // When the record is a new revision, empty the deltas array.
+          $deltas = array($field_name => 0);
+        }
+      }
+
+      // Table and column found in the field's storage details. During upgrades,
+      // it's always SQL.
+      $table_name = "field_data_{$field_name}";
+      $revision_name = "field_revision_{$field_name}";
+      $value_column = $field_name . '_tid';
+
+      // Column names and values in field storage are the same for current and
+      // revision.
+      $columns = array('entity_type', 'entity_id', 'revision_id', 'bundle', 'language', 'delta', $value_column);
+      $values = array('node', $record->nid, $record->vid, $record->type, LANGUAGE_NONE, $deltas[$field_name]++, $record->tid);
+
+      // Insert rows into the revision table.
+      db_insert($revision_name)->fields($columns)->values($values)->execute();
+
+      // is_current column is a node ID if this revision is also current.
+      if ($record->is_current) {
+        db_insert($table_name)->fields($columns)->values($values)->execute();
+
+        // Update the {taxonomy_index} table.
+        db_insert('taxonomy_index')
+          ->fields(array('nid', 'tid', 'sticky', 'created',))
+          ->values(array($record->nid, $record->tid, $record->sticky, $record->created))
+          ->execute();
+      }
+    }
+
+    // Store the set of inserted values and the current revision's deltas in the
+    // sandbox.
+    $sandbox['cursor'] = array(
+      'values' => $values,
+      'deltas' => $deltas,
+    );
+    $sandbox['last'] += $batch;
+  }
+
+  if ($sandbox['count'] < $sandbox['total']) {
+    $sandbox['#finished'] = FALSE;
+  }
+  else {
+    db_drop_table('taxonomy_vocabulary_node_type');
+    db_drop_table('taxonomy_term_node');
+
+    // If there are no vocabs, we're done.
+    db_drop_table('taxonomy_update_7005');
+    $sandbox['#finished'] = TRUE;
+
+    // Determine necessity of taxonomyextras field.
+    $field = $field_info['taxonomyextra'];
+    $revision_name = 'field_revision_' . $field['field_name'];
+    $node_types = db_select($revision_name)->distinct()->fields($revision_name, array('bundle'))
+      ->execute()->fetchCol();
+
+    if (empty($node_types)) {
+      // Delete the overflow field if there are no rows in the revision table.
+      _update_7000_field_delete_field('taxonomyextra');
+    }
+    else {
+      // Remove instances which are not actually used.
+      $bundles = db_query('SELECT bundle FROM {field_config_instance} WHERE field_name = :field_name', array(':field_name' => 'taxonomyextra'))->fetchCol();
+      $bundles = array_diff($bundles, $node_types);
+      foreach ($bundles as $bundle) {
+        _update_7000_field_delete_instance('taxonomyextra', 'node', $bundle);
+      }
+    }
+  }
+}
+
+/**
+ * Add {taxonomy_term_data}.format column.
+ */
+function taxonomy_update_7006() {
+  db_add_field('taxonomy_term_data', 'format', array(
+    'type' => 'int',
+    'unsigned' => TRUE,
+    'not null' => FALSE,
+    'description' => 'The {filter_format}.format of the description.',
+  ));
+}
+
+/**
+ * Add index on {taxonomy_term_data}.name column to speed up taxonomy_get_term_by_name().
+ */
+function taxonomy_update_7007() {
+  db_add_index('taxonomy_term_data', 'name', array('name'));
+}
+
+/**
+ * Change the weight columns to normal int.
+ */
+function taxonomy_update_7008() {
+  db_drop_index('taxonomy_term_data', 'taxonomy_tree');
+  db_change_field('taxonomy_term_data', 'weight', 'weight', array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'description' => 'The weight of this term in relation to other terms.',
+  ), array(
+    'indexes' => array(
+       'taxonomy_tree' => array('vid', 'weight', 'name'),
+    ),
+  ));
+
+  db_drop_index('taxonomy_vocabulary', 'list');
+  db_change_field('taxonomy_vocabulary', 'weight', 'weight', array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'description' => 'The weight of this vocabulary in relation to other vocabularies.',
+  ), array(
+    'indexes' => array(
+      'list' => array('weight', 'name'),
+    ),
+  ));
+}
+
+/**
+ * Change {taxonomy_term_data}.format into varchar.
+ */
+function taxonomy_update_7009() {
+  db_change_field('taxonomy_term_data', 'format', 'format', array(
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => FALSE,
+    'description' => 'The {filter_format}.format of the description.',
+  ));
+}
+
+/**
+ * Change {taxonomy_index}.created to support signed int.
+*/
+function taxonomy_update_7010() {
+  db_change_field('taxonomy_index', 'created', 'created', array(
+    'description' => 'The Unix timestamp when the node was created.',
+    'type' => 'int',
+    'unsigned' => FALSE,
+    'not null' => TRUE,
+    'default'=> 0,
+  ));
+}
+
diff --git a/htmltest/modules/taxonomy/taxonomy.js b/htmltest/modules/taxonomy/taxonomy.js
new file mode 100644
index 00000000..1a0c7908
--- /dev/null
+++ b/htmltest/modules/taxonomy/taxonomy.js
@@ -0,0 +1,40 @@
+(function ($) {
+
+/**
+ * Move a block in the blocks table from one region to another via select list.
+ *
+ * This behavior is dependent on the tableDrag behavior, since it uses the
+ * objects initialized in that behavior to update the row.
+ */
+Drupal.behaviors.termDrag = {
+  attach: function (context, settings) {
+    var table = $('#taxonomy', context);
+    var tableDrag = Drupal.tableDrag.taxonomy; // Get the blocks tableDrag object.
+    var rows = $('tr', table).length;
+
+    // When a row is swapped, keep previous and next page classes set.
+    tableDrag.row.prototype.onSwap = function (swappedRow) {
+      $('tr.taxonomy-term-preview', table).removeClass('taxonomy-term-preview');
+      $('tr.taxonomy-term-divider-top', table).removeClass('taxonomy-term-divider-top');
+      $('tr.taxonomy-term-divider-bottom', table).removeClass('taxonomy-term-divider-bottom');
+
+      if (settings.taxonomy.backStep) {
+        for (var n = 0; n < settings.taxonomy.backStep; n++) {
+          $(table[0].tBodies[0].rows[n]).addClass('taxonomy-term-preview');
+        }
+        $(table[0].tBodies[0].rows[settings.taxonomy.backStep - 1]).addClass('taxonomy-term-divider-top');
+        $(table[0].tBodies[0].rows[settings.taxonomy.backStep]).addClass('taxonomy-term-divider-bottom');
+      }
+
+      if (settings.taxonomy.forwardStep) {
+        for (var n = rows - settings.taxonomy.forwardStep - 1; n < rows - 1; n++) {
+          $(table[0].tBodies[0].rows[n]).addClass('taxonomy-term-preview');
+        }
+        $(table[0].tBodies[0].rows[rows - settings.taxonomy.forwardStep - 2]).addClass('taxonomy-term-divider-top');
+        $(table[0].tBodies[0].rows[rows - settings.taxonomy.forwardStep - 1]).addClass('taxonomy-term-divider-bottom');
+      }
+    };
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/taxonomy/taxonomy.module b/htmltest/modules/taxonomy/taxonomy.module
new file mode 100644
index 00000000..7ad28e9f
--- /dev/null
+++ b/htmltest/modules/taxonomy/taxonomy.module
@@ -0,0 +1,2048 @@
+<?php
+
+/**
+ * @file
+ * Enables the organization of content into categories.
+ */
+
+/**
+ * Users can create new terms in a free-tagging vocabulary when
+ * submitting a taxonomy_autocomplete_widget. We store a term object
+ * whose tid is 'autocreate' as a field data item during widget
+ * validation and then actually create the term if/when that field
+ * data item makes it to taxonomy_field_insert/update().
+ */
+
+/**
+ * Implements hook_help().
+ */
+function taxonomy_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#taxonomy':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Taxonomy module allows you to classify the content of your website. To classify content, you define <em>vocabularies</em> that contain related <em>terms</em>, and then assign the vocabularies to content types. For more information, see the online handbook entry for the <a href="@taxonomy">Taxonomy module</a>.', array('@taxonomy' => 'http://drupal.org/documentation/modules/taxonomy/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Creating vocabularies') . '</dt>';
+      $output .= '<dd>' . t('Users with sufficient <a href="@perm">permissions</a> can create <em>vocabularies</em> and <em>terms</em> through the <a href="@taxo">Taxonomy page</a>. The page listing the terms provides a drag-and-drop interface for controlling the order of the terms and sub-terms within a vocabulary, in a hierarchical fashion. A <em>controlled vocabulary</em> classifying music by genre with terms and sub-terms could look as follows:', array('@taxo' => url('admin/structure/taxonomy'), '@perm' => url('admin/people/permissions', array('fragment'=>'module-taxonomy'))));
+      $output .= '<ul><li>' . t('<em>vocabulary</em>: Music') . '</li>';
+      $output .= '<ul><li>' . t('<em>term</em>: Jazz') . '</li>';
+      $output .= '<ul><li>' . t('<em>sub-term</em>: Swing') . '</li>';
+      $output .= '<li>' . t('<em>sub-term</em>: Fusion') . '</li></ul></ul>';
+      $output .= '<ul><li>' . t('<em>term</em>: Rock') . '</li>';
+      $output .= '<ul><li>' . t('<em>sub-term</em>: Country rock') . '</li>';
+      $output .= '<li>' . t('<em>sub-term</em>: Hard rock') . '</li></ul></ul></ul>';
+      $output .= t('You can assign a sub-term to multiple parent terms. For example, <em>fusion</em> can be assigned to both <em>rock</em> and <em>jazz</em>.') . '</dd>';
+      $output .= '<dd>' . t('Terms in a <em>free-tagging vocabulary</em> can be built gradually as you create or edit content. This is often done used for blogs or photo management applications.') . '</dd>';
+      $output .= '<dt>' . t('Assigning vocabularies to content types') . '</dt>';
+      $output .= '<dd>' . t('Before you can use a new vocabulary to classify your content, a new Taxonomy term field must be added to a <a href="@ctedit">content type</a> on its <em>manage fields</em> page. When adding a taxonomy field, you choose a <em>widget</em> to use to enter the taxonomy information on the content editing page: a select list, checkboxes, radio buttons, or an auto-complete field (to build a free-tagging vocabulary). After choosing the field type and widget, on the subsequent <em>field settings</em> page you can choose the desired vocabulary, whether one or multiple terms can be chosen from the vocabulary, and other settings. The same vocabulary can be added to multiple content types, by using the "Add existing field" section on the manage fields page.', array('@ctedit' => url('admin/structure/types'))) . '</dd>';
+      $output .= '<dt>' . t('Classifying content') . '</dt>';
+      $output .= '<dd>' . t('After the vocabulary is assigned to the content type, you can start classifying content. The field with terms will appear on the content editing screen when you edit or <a href="@addnode">add new content</a>.', array('@addnode' => url('node/add'))) . '</dd>';
+      $output .= '<dt>' . t('Viewing listings and RSS feeds by term') . '</dt>';
+      $output .= '<dd>' . t("Each taxonomy term automatically provides a page listing content that has its classification, and a corresponding RSS feed. For example, if the taxonomy term <em>country rock</em> has the ID 123 (you can see this by looking at the URL when hovering on the linked term, which you can click to navigate to the listing page), then you will find this list at the path <em>taxonomy/term/123</em>. The RSS feed will use the path <em>taxonomy/term/123/feed</em> (the RSS icon for this term's listing will automatically display in your browser's address bar when viewing the listing page).") . '</dd>';
+      $output .= '<dt>' . t('Extending Taxonomy module') . '</dt>';
+      $output .= '<dd>' . t('There are <a href="@taxcontrib">many contributed modules</a> that extend the behavior of the Taxonomy module for both display and organization of terms.', array('@taxcontrib' => 'http://drupal.org/project/modules?filters=tid:71&solrsort=sis_project_release_usage%20desc'));
+      $output .= '</dl>';
+      return $output;
+    case 'admin/structure/taxonomy':
+      $output = '<p>' . t('Taxonomy is for categorizing content. Terms are grouped into vocabularies. For example, a vocabulary called "Fruit" would contain the terms "Apple" and "Banana".') . '</p>';
+      return $output;
+    case 'admin/structure/taxonomy/%':
+      $vocabulary = taxonomy_vocabulary_machine_name_load($arg[3]);
+      switch ($vocabulary->hierarchy) {
+        case 0:
+          return '<p>' . t('You can reorganize the terms in %capital_name using their drag-and-drop handles, and group terms under a parent term by sliding them under and to the right of the parent.', array('%capital_name' => drupal_ucfirst($vocabulary->name), '%name' => $vocabulary->name)) . '</p>';
+        case 1:
+          return '<p>' . t('%capital_name contains terms grouped under parent terms. You can reorganize the terms in %capital_name using their drag-and-drop handles.', array('%capital_name' => drupal_ucfirst($vocabulary->name), '%name' => $vocabulary->name)) . '</p>';
+        case 2:
+          return '<p>' . t('%capital_name contains terms with multiple parents. Drag and drop of terms with multiple parents is not supported, but you can re-enable drag-and-drop support by editing each term to include only a single parent.', array('%capital_name' => drupal_ucfirst($vocabulary->name))) . '</p>';
+      }
+  }
+}
+
+/**
+ * Implements hook_permission().
+ */
+function taxonomy_permission() {
+  $permissions = array(
+    'administer taxonomy' => array(
+      'title' => t('Administer vocabularies and terms'),
+    ),
+  );
+  foreach (taxonomy_get_vocabularies() as $vocabulary) {
+    $permissions += array(
+      'edit terms in ' . $vocabulary->vid => array(
+        'title' => t('Edit terms in %vocabulary', array('%vocabulary' => $vocabulary->name)),
+      ),
+    );
+    $permissions += array(
+       'delete terms in ' . $vocabulary->vid => array(
+         'title' => t('Delete terms from %vocabulary', array('%vocabulary' => $vocabulary->name)),
+      ),
+    );
+  }
+  return $permissions;
+}
+
+/**
+ * Implements hook_entity_info().
+ */
+function taxonomy_entity_info() {
+  $return = array(
+    'taxonomy_term' => array(
+      'label' => t('Taxonomy term'),
+      'controller class' => 'TaxonomyTermController',
+      'base table' => 'taxonomy_term_data',
+      'uri callback' => 'taxonomy_term_uri',
+      'fieldable' => TRUE,
+      'entity keys' => array(
+        'id' => 'tid',
+        'bundle' => 'vocabulary_machine_name',
+        'label' => 'name',
+      ),
+      'bundle keys' => array(
+        'bundle' => 'machine_name',
+      ),
+      'bundles' => array(),
+      'view modes' => array(
+        // @todo View mode for display as a field (when attached to nodes etc).
+        'full' => array(
+          'label' => t('Taxonomy term page'),
+          'custom settings' => FALSE,
+        ),
+      ),
+    ),
+  );
+  foreach (taxonomy_vocabulary_get_names() as $machine_name => $vocabulary) {
+    $return['taxonomy_term']['bundles'][$machine_name] = array(
+      'label' => $vocabulary->name,
+      'admin' => array(
+        'path' => 'admin/structure/taxonomy/%taxonomy_vocabulary_machine_name',
+        'real path' => 'admin/structure/taxonomy/' . $machine_name,
+        'bundle argument' => 3,
+        'access arguments' => array('administer taxonomy'),
+      ),
+    );
+  }
+  $return['taxonomy_vocabulary'] = array(
+    'label' => t('Taxonomy vocabulary'),
+    'controller class' => 'TaxonomyVocabularyController',
+    'base table' => 'taxonomy_vocabulary',
+    'entity keys' => array(
+      'id' => 'vid',
+      'label' => 'name',
+    ),
+    'fieldable' => FALSE,
+  );
+
+  return $return;
+}
+
+/**
+ * Implements callback_entity_info_uri().
+ */
+function taxonomy_term_uri($term) {
+  return array(
+    'path' => 'taxonomy/term/' . $term->tid,
+  );
+}
+
+/**
+ * Implements hook_field_extra_fields().
+ */
+function taxonomy_field_extra_fields() {
+  $return = array();
+  $info = entity_get_info('taxonomy_term');
+  foreach (array_keys($info['bundles']) as $bundle) {
+    $return['taxonomy_term'][$bundle] = array(
+      'form' => array(
+        'name' => array(
+          'label' => t('Name'),
+          'description' => t('Term name textfield'),
+          'weight' => -5,
+        ),
+        'description' => array(
+          'label' => t('Description'),
+          'description' => t('Term description textarea'),
+          'weight' => 0,
+        ),
+      ),
+      'display' => array(
+        'description' => array(
+          'label' => t('Description'),
+          'description' => t('Term description'),
+          'weight' => 0,
+        ),
+      ),
+    );
+  }
+
+  return $return;
+}
+
+/**
+ * Return nodes attached to a term across all field instances.
+ *
+ * This function requires taxonomy module to be maintaining its own tables,
+ * and will return an empty array if it is not. If using other field storage
+ * methods alternatives methods for listing terms will need to be used.
+ *
+ * @param $tid
+ *   The term ID.
+ * @param $pager
+ *   Boolean to indicate whether a pager should be used.
+ * @param $limit
+ *   Integer. The maximum number of nodes to find.
+ *   Set to FALSE for no limit.
+ * @param $order
+ *   An array of fields and directions.
+ *
+ * @return
+ *   An array of nids matching the query.
+ */
+function taxonomy_select_nodes($tid, $pager = TRUE, $limit = FALSE, $order = array('t.sticky' => 'DESC', 't.created' => 'DESC')) {
+  if (!variable_get('taxonomy_maintain_index_table', TRUE)) {
+    return array();
+  }
+  $query = db_select('taxonomy_index', 't');
+  $query->addTag('node_access');
+  $query->condition('tid', $tid);
+  if ($pager) {
+    $count_query = clone $query;
+    $count_query->addExpression('COUNT(t.nid)');
+
+    $query = $query->extend('PagerDefault');
+    if ($limit !== FALSE) {
+      $query = $query->limit($limit);
+    }
+    $query->setCountQuery($count_query);
+  }
+  else {
+    if ($limit !== FALSE) {
+      $query->range(0, $limit);
+    }
+  }
+  $query->addField('t', 'nid');
+  $query->addField('t', 'tid');
+  foreach ($order as $field => $direction) {
+    $query->orderBy($field, $direction);
+    // ORDER BY fields need to be loaded too, assume they are in the form
+    // table_alias.name
+    list($table_alias, $name) = explode('.', $field);
+    $query->addField($table_alias, $name);
+  }
+  return $query->execute()->fetchCol();
+}
+
+/**
+ * Implements hook_theme().
+ */
+function taxonomy_theme() {
+  return array(
+    'taxonomy_overview_vocabularies' => array(
+      'render element' => 'form',
+    ),
+    'taxonomy_overview_terms' => array(
+      'render element' => 'form',
+    ),
+    'taxonomy_term' => array(
+      'render element' => 'elements',
+      'template' => 'taxonomy-term',
+    ),
+  );
+}
+
+/**
+ * Implements hook_menu().
+ */
+function taxonomy_menu() {
+  $items['admin/structure/taxonomy'] = array(
+    'title' => 'Taxonomy',
+    'description' => 'Manage tagging, categorization, and classification of your content.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('taxonomy_overview_vocabularies'),
+    'access arguments' => array('administer taxonomy'),
+    'file' => 'taxonomy.admin.inc',
+  );
+  $items['admin/structure/taxonomy/list'] = array(
+    'title' => 'List',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['admin/structure/taxonomy/add'] = array(
+    'title' => 'Add vocabulary',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('taxonomy_form_vocabulary'),
+    'access arguments' => array('administer taxonomy'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'taxonomy.admin.inc',
+  );
+
+  $items['taxonomy/term/%taxonomy_term'] = array(
+    'title' => 'Taxonomy term',
+    'title callback' => 'taxonomy_term_title',
+    'title arguments' => array(2),
+    'page callback' => 'taxonomy_term_page',
+    'page arguments' => array(2),
+    'access arguments' => array('access content'),
+    'file' => 'taxonomy.pages.inc',
+  );
+  $items['taxonomy/term/%taxonomy_term/view'] = array(
+    'title' => 'View',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $items['taxonomy/term/%taxonomy_term/edit'] = array(
+    'title' => 'Edit',
+    'page callback' => 'drupal_get_form',
+    // Pass a NULL argument to ensure that additional path components are not
+    // passed to taxonomy_form_term() as the vocabulary machine name argument.
+    'page arguments' => array('taxonomy_form_term', 2, NULL),
+    'access callback' => 'taxonomy_term_edit_access',
+    'access arguments' => array(2),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 10,
+    'file' => 'taxonomy.admin.inc',
+  );
+  $items['taxonomy/term/%taxonomy_term/feed'] = array(
+    'title' => 'Taxonomy term',
+    'title callback' => 'taxonomy_term_title',
+    'title arguments' => array(2),
+    'page callback' => 'taxonomy_term_feed',
+    'page arguments' => array(2),
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+    'file' => 'taxonomy.pages.inc',
+  );
+  $items['taxonomy/autocomplete'] = array(
+    'title' => 'Autocomplete taxonomy',
+    'page callback' => 'taxonomy_autocomplete',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+    'file' => 'taxonomy.pages.inc',
+  );
+
+  $items['admin/structure/taxonomy/%taxonomy_vocabulary_machine_name'] = array(
+    'title callback' => 'entity_label',
+    'title arguments' => array('taxonomy_vocabulary', 3),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('taxonomy_overview_terms', 3),
+    'access arguments' => array('administer taxonomy'),
+    'file' => 'taxonomy.admin.inc',
+  );
+  $items['admin/structure/taxonomy/%taxonomy_vocabulary_machine_name/list'] = array(
+    'title' => 'List',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -20,
+  );
+  $items['admin/structure/taxonomy/%taxonomy_vocabulary_machine_name/edit'] = array(
+    'title' => 'Edit',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('taxonomy_form_vocabulary', 3),
+    'access arguments' => array('administer taxonomy'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => -10,
+    'file' => 'taxonomy.admin.inc',
+  );
+
+  $items['admin/structure/taxonomy/%taxonomy_vocabulary_machine_name/add'] = array(
+    'title' => 'Add term',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('taxonomy_form_term', array(), 3),
+    'access arguments' => array('administer taxonomy'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'taxonomy.admin.inc',
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_admin_paths().
+ */
+function taxonomy_admin_paths() {
+  $paths = array(
+    'taxonomy/term/*/edit' => TRUE,
+  );
+  return $paths;
+}
+
+/**
+ * Return edit access for a given term.
+ */
+function taxonomy_term_edit_access($term) {
+  return user_access("edit terms in $term->vid") || user_access('administer taxonomy');
+}
+
+/**
+ * Returns the sanitized name of a vocabulary.
+ *
+ * Deprecated. This function was previously used as a menu item title callback
+ * but has been replaced by using entity_label() (which does not
+ * sanitize the title, since the menu system does that automatically). In
+ * Drupal 7, use that function for title callbacks, and call check_plain()
+ * directly if you need a sanitized title.
+ */
+function taxonomy_admin_vocabulary_title_callback($vocabulary) {
+  return check_plain($vocabulary->name);
+}
+
+/**
+ * Saves a vocabulary.
+ *
+ * @param $vocabulary
+ *   A vocabulary object with the following properties:
+ *   - vid: (optional) The ID of the vocabulary (omit if creating a new
+ *     vocabulary; only use to update an existing vocabulary).
+ *   - name: The human-readable name of the vocabulary.
+ *   - machine_name: The machine name of the vocabulary.
+ *   - description: (optional) The vocabulary's description.
+ *   - hierarchy: The hierarchy level of the vocabulary.
+ *   - module: (optional) The module altering the vocabulary.
+ *   - weight: (optional) The weight of this vocabulary in relation to other
+ *     vocabularies.
+ *   - original: (optional) The original vocabulary object before any changes
+ *     are applied.
+ *   - old_machine_name: (optional) The original machine name of the
+ *     vocabulary.
+ *
+ * @return
+ *   Status constant indicating whether the vocabulary was inserted (SAVED_NEW)
+ *   or updated (SAVED_UPDATED).
+ */
+function taxonomy_vocabulary_save($vocabulary) {
+  // Prevent leading and trailing spaces in vocabulary names.
+  if (!empty($vocabulary->name)) {
+    $vocabulary->name = trim($vocabulary->name);
+  }
+  // Load the stored entity, if any.
+  if (!empty($vocabulary->vid)) {
+    if (!isset($vocabulary->original)) {
+      $vocabulary->original = entity_load_unchanged('taxonomy_vocabulary', $vocabulary->vid);
+    }
+    // Make sure machine name changes are easily detected.
+    // @todo: Remove in Drupal 8, as it is deprecated by directly reading from
+    // $vocabulary->original.
+    $vocabulary->old_machine_name = $vocabulary->original->machine_name;
+  }
+
+  if (!isset($vocabulary->module)) {
+    $vocabulary->module = 'taxonomy';
+  }
+
+  module_invoke_all('taxonomy_vocabulary_presave', $vocabulary);
+  module_invoke_all('entity_presave', $vocabulary, 'taxonomy_vocabulary');
+
+  if (!empty($vocabulary->vid) && !empty($vocabulary->name)) {
+    $status = drupal_write_record('taxonomy_vocabulary', $vocabulary, 'vid');
+    taxonomy_vocabulary_static_reset(array($vocabulary->vid));
+    if ($vocabulary->old_machine_name != $vocabulary->machine_name) {
+      field_attach_rename_bundle('taxonomy_term', $vocabulary->old_machine_name, $vocabulary->machine_name);
+    }
+    module_invoke_all('taxonomy_vocabulary_update', $vocabulary);
+    module_invoke_all('entity_update', $vocabulary, 'taxonomy_vocabulary');
+  }
+  elseif (empty($vocabulary->vid)) {
+    $status = drupal_write_record('taxonomy_vocabulary', $vocabulary);
+    taxonomy_vocabulary_static_reset();
+    field_attach_create_bundle('taxonomy_term', $vocabulary->machine_name);
+    module_invoke_all('taxonomy_vocabulary_insert', $vocabulary);
+    module_invoke_all('entity_insert', $vocabulary, 'taxonomy_vocabulary');
+  }
+
+  unset($vocabulary->original);
+  cache_clear_all();
+
+  return $status;
+}
+
+/**
+ * Delete a vocabulary.
+ *
+ * @param $vid
+ *   A vocabulary ID.
+ * @return
+ *   Constant indicating items were deleted.
+ */
+function taxonomy_vocabulary_delete($vid) {
+  $vocabulary = taxonomy_vocabulary_load($vid);
+
+  $transaction = db_transaction();
+  try {
+    // Only load terms without a parent, child terms will get deleted too.
+    $result = db_query('SELECT t.tid FROM {taxonomy_term_data} t INNER JOIN {taxonomy_term_hierarchy} th ON th.tid = t.tid WHERE t.vid = :vid AND th.parent = 0', array(':vid' => $vid))->fetchCol();
+    foreach ($result as $tid) {
+      taxonomy_term_delete($tid);
+    }
+    db_delete('taxonomy_vocabulary')
+      ->condition('vid', $vid)
+      ->execute();
+
+    field_attach_delete_bundle('taxonomy_term', $vocabulary->machine_name);
+    module_invoke_all('taxonomy_vocabulary_delete', $vocabulary);
+    module_invoke_all('entity_delete', $vocabulary, 'taxonomy_vocabulary');
+
+    // Load all Taxonomy module fields and delete those which use only this
+    // vocabulary.
+    $taxonomy_fields = field_read_fields(array('module' => 'taxonomy'));
+    foreach ($taxonomy_fields as $field_name => $taxonomy_field) {
+      $modified_field = FALSE;
+      // Term reference fields may reference terms from more than one
+      // vocabulary.
+      foreach ($taxonomy_field['settings']['allowed_values'] as $key => $allowed_value) {
+        if ($allowed_value['vocabulary'] == $vocabulary->machine_name) {
+          unset($taxonomy_field['settings']['allowed_values'][$key]);
+          $modified_field = TRUE;
+        }
+      }
+      if ($modified_field) {
+        if (empty($taxonomy_field['settings']['allowed_values'])) {
+          field_delete_field($field_name);
+        }
+        else {
+          // Update the field definition with the new allowed values.
+          field_update_field($taxonomy_field);
+        }
+      }
+    }
+
+    cache_clear_all();
+    taxonomy_vocabulary_static_reset();
+
+    return SAVED_DELETED;
+  }
+  catch (Exception $e) {
+    $transaction->rollback();
+    watchdog_exception('taxonomy', $e);
+    throw $e;
+  }
+}
+
+/**
+ * Implements hook_taxonomy_vocabulary_update().
+ */
+function taxonomy_taxonomy_vocabulary_update($vocabulary) {
+  // Reflect machine name changes in the definitions of existing 'taxonomy'
+  // fields.
+  if (!empty($vocabulary->old_machine_name) && $vocabulary->old_machine_name != $vocabulary->machine_name) {
+    $fields = field_read_fields();
+    foreach ($fields as $field_name => $field) {
+      $update = FALSE;
+      if ($field['type'] == 'taxonomy_term_reference') {
+        foreach ($field['settings']['allowed_values'] as $key => &$value) {
+          if ($value['vocabulary'] == $vocabulary->old_machine_name) {
+            $value['vocabulary'] = $vocabulary->machine_name;
+            $update = TRUE;
+          }
+        }
+        if ($update) {
+          field_update_field($field);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Checks and updates the hierarchy flag of a vocabulary.
+ *
+ * Checks the current parents of all terms in a vocabulary and updates the
+ * vocabulary's hierarchy setting to the lowest possible level. If no term
+ * has parent terms then the vocabulary will be given a hierarchy of 0.
+ * If any term has a single parent then the vocabulary will be given a
+ * hierarchy of 1. If any term has multiple parents then the vocabulary
+ * will be given a hierarchy of 2.
+ *
+ * @param $vocabulary
+ *   A vocabulary object.
+ * @param $changed_term
+ *   An array of the term structure that was updated.
+ *
+ * @return
+ *   An integer that represents the level of the vocabulary's hierarchy.
+ */
+function taxonomy_check_vocabulary_hierarchy($vocabulary, $changed_term) {
+  $tree = taxonomy_get_tree($vocabulary->vid);
+  $hierarchy = 0;
+  foreach ($tree as $term) {
+    // Update the changed term with the new parent value before comparison.
+    if ($term->tid == $changed_term['tid']) {
+      $term = (object) $changed_term;
+      $term->parents = $term->parent;
+    }
+    // Check this term's parent count.
+    if (count($term->parents) > 1) {
+      $hierarchy = 2;
+      break;
+    }
+    elseif (count($term->parents) == 1 && !isset($term->parents[0])) {
+      $hierarchy = 1;
+    }
+  }
+  if ($hierarchy != $vocabulary->hierarchy) {
+    $vocabulary->hierarchy = $hierarchy;
+    taxonomy_vocabulary_save($vocabulary);
+  }
+
+  return $hierarchy;
+}
+
+/**
+ * Saves a term object to the database.
+ *
+ * @param $term
+ *   The taxonomy term object with the following properties:
+ *   - vid: The ID of the vocabulary the term is assigned to.
+ *   - name: The name of the term.
+ *   - tid: (optional) The unique ID for the term being saved. If $term->tid is
+ *     empty or omitted, a new term will be inserted.
+ *   - description: (optional) The term's description.
+ *   - format: (optional) The text format for the term's description.
+ *   - weight: (optional) The weight of this term in relation to other terms
+ *     within the same vocabulary.
+ *   - parent: (optional) The parent term(s) for this term. This can be a single
+ *     term ID or an array of term IDs. A value of 0 means this term does not
+ *     have any parents. When omitting this variable during an update, the
+ *     existing hierarchy for the term remains unchanged.
+ *   - vocabulary_machine_name: (optional) The machine name of the vocabulary
+ *     the term is assigned to. If not given, this value will be set
+ *     automatically by loading the vocabulary based on $term->vid.
+ *   - original: (optional) The original taxonomy term object before any changes
+ *     were applied. When omitted, the unchanged taxonomy term object is
+ *     loaded from the database and stored in this property.
+ *   Since a taxonomy term is an entity, any fields contained in the term object
+ *   are saved alongside the term object.
+ *
+ * @return
+ *   Status constant indicating whether term was inserted (SAVED_NEW) or updated
+ *   (SAVED_UPDATED). When inserting a new term, $term->tid will contain the
+ *   term ID of the newly created term.
+ */
+function taxonomy_term_save($term) {
+  // Prevent leading and trailing spaces in term names.
+  $term->name = trim($term->name);
+  if (!isset($term->vocabulary_machine_name)) {
+    $vocabulary = taxonomy_vocabulary_load($term->vid);
+    $term->vocabulary_machine_name = $vocabulary->machine_name;
+  }
+
+  // Load the stored entity, if any.
+  if (!empty($term->tid) && !isset($term->original)) {
+    $term->original = entity_load_unchanged('taxonomy_term', $term->tid);
+  }
+
+  field_attach_presave('taxonomy_term', $term);
+  module_invoke_all('taxonomy_term_presave', $term);
+  module_invoke_all('entity_presave', $term, 'taxonomy_term');
+
+  if (empty($term->tid)) {
+    $op = 'insert';
+    $status = drupal_write_record('taxonomy_term_data', $term);
+    field_attach_insert('taxonomy_term', $term);
+    if (!isset($term->parent)) {
+      $term->parent = array(0);
+    }
+  }
+  else {
+    $op = 'update';
+    $status = drupal_write_record('taxonomy_term_data', $term, 'tid');
+    field_attach_update('taxonomy_term', $term);
+    if (isset($term->parent)) {
+      db_delete('taxonomy_term_hierarchy')
+        ->condition('tid', $term->tid)
+        ->execute();
+    }
+  }
+
+  if (isset($term->parent)) {
+    if (!is_array($term->parent)) {
+      $term->parent = array($term->parent);
+    }
+    $query = db_insert('taxonomy_term_hierarchy')
+      ->fields(array('tid', 'parent'));
+    foreach ($term->parent as $parent) {
+      if (is_array($parent)) {
+        foreach ($parent as $tid) {
+          $query->values(array(
+            'tid' => $term->tid,
+            'parent' => $tid
+          ));
+        }
+      }
+      else {
+        $query->values(array(
+          'tid' => $term->tid,
+          'parent' => $parent
+        ));
+      }
+    }
+    $query->execute();
+  }
+
+  // Reset the taxonomy term static variables.
+  taxonomy_terms_static_reset();
+
+  // Invoke the taxonomy hooks.
+  module_invoke_all("taxonomy_term_$op", $term);
+  module_invoke_all("entity_$op", $term, 'taxonomy_term');
+  unset($term->original);
+
+  return $status;
+}
+
+/**
+ * Delete a term.
+ *
+ * @param $tid
+ *   The term ID.
+ * @return
+ *   Status constant indicating deletion.
+ */
+function taxonomy_term_delete($tid) {
+  $transaction = db_transaction();
+  try {
+    $tids = array($tid);
+    while ($tids) {
+      $children_tids = $orphans = array();
+      foreach ($tids as $tid) {
+        // See if any of the term's children are about to be become orphans:
+        if ($children = taxonomy_get_children($tid)) {
+          foreach ($children as $child) {
+            // If the term has multiple parents, we don't delete it.
+            $parents = taxonomy_get_parents($child->tid);
+            if (count($parents) == 1) {
+              $orphans[] = $child->tid;
+            }
+          }
+        }
+
+        if ($term = taxonomy_term_load($tid)) {
+          db_delete('taxonomy_term_data')
+            ->condition('tid', $tid)
+            ->execute();
+          db_delete('taxonomy_term_hierarchy')
+            ->condition('tid', $tid)
+            ->execute();
+
+          field_attach_delete('taxonomy_term', $term);
+          module_invoke_all('taxonomy_term_delete', $term);
+          module_invoke_all('entity_delete', $term, 'taxonomy_term');
+          taxonomy_terms_static_reset();
+        }
+      }
+
+      $tids = $orphans;
+    }
+    return SAVED_DELETED;
+  }
+  catch (Exception $e) {
+    $transaction->rollback();
+    watchdog_exception('taxonomy', $e);
+    throw $e;
+  }
+}
+
+/**
+ * Generates an array which displays a term detail page.
+ *
+ * @param term
+ *   A taxonomy term object.
+ * @return
+ *   A $page element suitable for use by drupal_page_render().
+ */
+function taxonomy_term_show($term) {
+  return taxonomy_term_view_multiple(array($term->tid => $term), 'full');
+}
+
+/**
+ * Constructs a drupal_render() style array from an array of loaded terms.
+ *
+ * @param $terms
+ *   An array of taxonomy terms as returned by taxonomy_term_load_multiple().
+ * @param $view_mode
+ *   View mode, e.g. 'full', 'teaser'...
+ * @param $weight
+ *   An integer representing the weight of the first taxonomy term in the list.
+ * @param $langcode
+ *   (optional) A language code to use for rendering. Defaults to the global
+ *   content language of the current request.
+ *
+ * @return
+ *   An array in the format expected by drupal_render().
+ */
+function taxonomy_term_view_multiple($terms, $view_mode = 'teaser', $weight = 0, $langcode = NULL) {
+  field_attach_prepare_view('taxonomy_term', $terms, $view_mode, $langcode);
+  entity_prepare_view('taxonomy_term', $terms, $langcode);
+  $build = array();
+  foreach ($terms as $term) {
+    $build['taxonomy_terms'][$term->tid] = taxonomy_term_view($term, $view_mode, $langcode);
+    $build['taxonomy_terms'][$term->tid]['#weight'] = $weight;
+    $weight++;
+  }
+  $build['taxonomy_terms']['#sorted'] = TRUE;
+  return $build;
+}
+
+/**
+ * Builds a structured array representing the term's content.
+ *
+ * The content built for the taxonomy term (field values, file attachments or
+ * other term components) will vary depending on the $view_mode parameter.
+ *
+ * Drupal core defines the following view modes for terms, with the following
+ * default use cases:
+ *   - full (default): term is displayed on its own page (taxonomy/term/123)
+ * Contributed modules might define additional view modes, or use existing
+ * view modes in additional contexts.
+ *
+ * @param $term
+ *   A taxonomy term object.
+ * @param $view_mode
+ *   View mode, e.g. 'full', 'teaser'...
+ * @param $langcode
+ *   (optional) A language code to use for rendering. Defaults to the global
+ *   content language of the current request.
+ */
+function taxonomy_term_build_content($term, $view_mode = 'full', $langcode = NULL) {
+  if (!isset($langcode)) {
+    $langcode = $GLOBALS['language_content']->language;
+  }
+
+  // Remove previously built content, if exists.
+  $term->content = array();
+
+  // Allow modules to change the view mode.
+  $context = array(
+    'entity_type' => 'taxonomy_term',
+    'entity' => $term,
+    'langcode' => $langcode,
+  );
+  drupal_alter('entity_view_mode', $view_mode, $context);
+
+  // Add the term description if the term has one and it is visible.
+  $type = 'taxonomy_term';
+  $entity_ids = entity_extract_ids($type, $term);
+  $settings = field_view_mode_settings($type, $entity_ids[2]);
+  $fields = field_extra_fields_get_display($type, $entity_ids[2], $view_mode);
+  if (!empty($term->description) && isset($fields['description']) && $fields['description']['visible']) {
+    $term->content['description'] = array(
+      '#markup' => check_markup($term->description, $term->format, '', TRUE),
+      '#weight' => $fields['description']['weight'],
+      '#prefix' => '<div class="taxonomy-term-description">',
+      '#suffix' => '</div>',
+    );
+  }
+
+  // Build fields content.
+  // In case of a multiple view, taxonomy_term_view_multiple() already ran the
+  // 'prepare_view' step. An internal flag prevents the operation from running
+  // twice.
+  field_attach_prepare_view('taxonomy_term', array($term->tid => $term), $view_mode, $langcode);
+  entity_prepare_view('taxonomy_term', array($term->tid => $term), $langcode);
+  $term->content += field_attach_view('taxonomy_term', $term, $view_mode, $langcode);
+
+  // Allow modules to make their own additions to the taxonomy term.
+  module_invoke_all('taxonomy_term_view', $term, $view_mode, $langcode);
+  module_invoke_all('entity_view', $term, 'taxonomy_term', $view_mode, $langcode);
+
+  // Make sure the current view mode is stored if no module has already
+  // populated the related key.
+  $term->content += array('#view_mode' => $view_mode);
+}
+
+/**
+ * Generate an array for rendering the given term.
+ *
+ * @param $term
+ *   A term object.
+ * @param $view_mode
+ *   View mode, e.g. 'full', 'teaser'...
+ * @param $langcode
+ *   (optional) A language code to use for rendering. Defaults to the global
+ *   content language of the current request.
+ *
+ * @return
+ *   An array as expected by drupal_render().
+ */
+function taxonomy_term_view($term, $view_mode = 'full', $langcode = NULL) {
+  if (!isset($langcode)) {
+    $langcode = $GLOBALS['language_content']->language;
+  }
+
+  // Populate $term->content with a render() array.
+  taxonomy_term_build_content($term, $view_mode, $langcode);
+  $build = $term->content;
+
+  // We don't need duplicate rendering info in $term->content.
+  unset($term->content);
+
+  $build += array(
+    '#theme' => 'taxonomy_term',
+    '#term' => $term,
+    '#view_mode' => $view_mode,
+    '#language' => $langcode,
+  );
+
+  $build['#attached']['css'][] = drupal_get_path('module', 'taxonomy') . '/taxonomy.css';
+
+  // Allow modules to modify the structured taxonomy term.
+  $type = 'taxonomy_term';
+  drupal_alter(array('taxonomy_term_view', 'entity_view'), $build, $type);
+
+  return $build;
+}
+
+/**
+ * Process variables for taxonomy-term.tpl.php.
+ */
+function template_preprocess_taxonomy_term(&$variables) {
+  $variables['view_mode'] = $variables['elements']['#view_mode'];
+  $variables['term'] = $variables['elements']['#term'];
+  $term = $variables['term'];
+
+  $uri = entity_uri('taxonomy_term', $term);
+  $variables['term_url']  = url($uri['path'], $uri['options']);
+  $variables['term_name'] = check_plain($term->name);
+  $variables['page']      = $variables['view_mode'] == 'full' && taxonomy_term_is_page($term);
+
+  // Flatten the term object's member fields.
+  $variables = array_merge((array) $term, $variables);
+
+  // Helpful $content variable for templates.
+  $variables['content'] = array();
+  foreach (element_children($variables['elements']) as $key) {
+    $variables['content'][$key] = $variables['elements'][$key];
+  }
+
+  // field_attach_preprocess() overwrites the $[field_name] variables with the
+  // values of the field in the language that was selected for display, instead
+  // of the raw values in $term->[field_name], which contain all values in all
+  // languages.
+  field_attach_preprocess('taxonomy_term', $term, $variables['content'], $variables);
+
+  // Gather classes, and clean up name so there are no underscores.
+  $vocabulary_name_css = str_replace('_', '-', $term->vocabulary_machine_name);
+  $variables['classes_array'][] = 'vocabulary-' . $vocabulary_name_css;
+
+  $variables['theme_hook_suggestions'][] = 'taxonomy_term__' . $term->vocabulary_machine_name;
+  $variables['theme_hook_suggestions'][] = 'taxonomy_term__' . $term->tid;
+}
+
+/**
+ * Returns whether the current page is the page of the passed-in term.
+ *
+ * @param $term
+ *   A term object.
+ */
+function taxonomy_term_is_page($term) {
+  $page_term = menu_get_object('taxonomy_term', 2);
+  return (!empty($page_term) ? $page_term->tid == $term->tid : FALSE);
+}
+
+/**
+ * Clear all static cache variables for terms.
+ */
+function taxonomy_terms_static_reset() {
+  drupal_static_reset('taxonomy_term_count_nodes');
+  drupal_static_reset('taxonomy_get_tree');
+  drupal_static_reset('taxonomy_get_tree:parents');
+  drupal_static_reset('taxonomy_get_tree:terms');
+  drupal_static_reset('taxonomy_get_parents');
+  drupal_static_reset('taxonomy_get_parents_all');
+  drupal_static_reset('taxonomy_get_children');
+  entity_get_controller('taxonomy_term')->resetCache();
+}
+
+/**
+ * Clear all static cache variables for vocabularies.
+ *
+ * @param $ids
+ * An array of ids to reset in entity controller cache.
+ */
+function taxonomy_vocabulary_static_reset($ids = NULL) {
+  drupal_static_reset('taxonomy_vocabulary_get_names');
+  entity_get_controller('taxonomy_vocabulary')->resetCache($ids);
+}
+
+/**
+ * Return an array of all vocabulary objects.
+ *
+ * @return
+ *   An array of all vocabulary objects, indexed by vid.
+ */
+function taxonomy_get_vocabularies() {
+  return taxonomy_vocabulary_load_multiple(FALSE, array());
+}
+
+/**
+ * Get names for all taxonomy vocabularies.
+ *
+ * @return
+ *   An associative array of objects keyed by vocabulary machine name with
+ *   information about taxonomy vocabularies. Each object has properties:
+ *   - name: The vocabulary name.
+ *   - machine_name: The machine name.
+ *   - vid: The vocabulary ID.
+ */
+function taxonomy_vocabulary_get_names() {
+  $names = &drupal_static(__FUNCTION__);
+
+  if (!isset($names)) {
+    $names = db_query('SELECT name, machine_name, vid FROM {taxonomy_vocabulary}')->fetchAllAssoc('machine_name');
+  }
+
+  return $names;
+}
+
+/**
+ * Finds all parents of a given term ID.
+ *
+ * @param $tid
+ *   A taxonomy term ID.
+ *
+ * @return
+ *   An array of term objects which are the parents of the term $tid, or an
+ *   empty array if parents are not found.
+ */
+function taxonomy_get_parents($tid) {
+  $parents = &drupal_static(__FUNCTION__, array());
+
+  if ($tid && !isset($parents[$tid])) {
+    $query = db_select('taxonomy_term_data', 't');
+    $query->join('taxonomy_term_hierarchy', 'h', 'h.parent = t.tid');
+    $query->addField('t', 'tid');
+    $query->condition('h.tid', $tid);
+    $query->addTag('term_access');
+    $query->orderBy('t.weight');
+    $query->orderBy('t.name');
+    $tids = $query->execute()->fetchCol();
+    $parents[$tid] = taxonomy_term_load_multiple($tids);
+  }
+
+  return isset($parents[$tid]) ? $parents[$tid] : array();
+}
+
+/**
+ * Find all ancestors of a given term ID.
+ */
+function taxonomy_get_parents_all($tid) {
+  $cache = &drupal_static(__FUNCTION__, array());
+
+  if (isset($cache[$tid])) {
+    return $cache[$tid];
+  }
+
+  $parents = array();
+  if ($term = taxonomy_term_load($tid)) {
+    $parents[] = $term;
+    $n = 0;
+    while ($parent = taxonomy_get_parents($parents[$n]->tid)) {
+      $parents = array_merge($parents, $parent);
+      $n++;
+    }
+  }
+
+  $cache[$tid] = $parents;
+
+  return $parents;
+}
+
+/**
+ * Finds all children of a term ID.
+ *
+ * @param $tid
+ *   A taxonomy term ID.
+ * @param $vid
+ *   An optional vocabulary ID to restrict the child search.
+ *
+ * @return
+ *   An array of term objects that are the children of the term $tid, or an
+ *   empty array when no children exist.
+ */
+function taxonomy_get_children($tid, $vid = 0) {
+  $children = &drupal_static(__FUNCTION__, array());
+
+  if ($tid && !isset($children[$tid])) {
+    $query = db_select('taxonomy_term_data', 't');
+    $query->join('taxonomy_term_hierarchy', 'h', 'h.tid = t.tid');
+    $query->addField('t', 'tid');
+    $query->condition('h.parent', $tid);
+    if ($vid) {
+      $query->condition('t.vid', $vid);
+    }
+    $query->addTag('term_access');
+    $query->orderBy('t.weight');
+    $query->orderBy('t.name');
+    $tids = $query->execute()->fetchCol();
+    $children[$tid] = taxonomy_term_load_multiple($tids);
+  }
+
+  return isset($children[$tid]) ? $children[$tid] : array();
+}
+
+/**
+ * Create a hierarchical representation of a vocabulary.
+ *
+ * @param $vid
+ *   Which vocabulary to generate the tree for.
+ * @param $parent
+ *   The term ID under which to generate the tree. If 0, generate the tree
+ *   for the entire vocabulary.
+ * @param $max_depth
+ *   The number of levels of the tree to return. Leave NULL to return all levels.
+ * @param $load_entities
+ *   If TRUE, a full entity load will occur on the term objects. Otherwise they
+ *   are partial objects queried directly from the {taxonomy_term_data} table to
+ *   save execution time and memory consumption when listing large numbers of
+ *   terms. Defaults to FALSE.
+ *
+ * @return
+ *   An array of all term objects in the tree. Each term object is extended
+ *   to have "depth" and "parents" attributes in addition to its normal ones.
+ *   Results are statically cached. Term objects will be partial or complete
+ *   depending on the $load_entities parameter.
+ */
+function taxonomy_get_tree($vid, $parent = 0, $max_depth = NULL, $load_entities = FALSE) {
+  $children = &drupal_static(__FUNCTION__, array());
+  $parents = &drupal_static(__FUNCTION__ . ':parents', array());
+  $terms = &drupal_static(__FUNCTION__ . ':terms', array());
+
+  // We cache trees, so it's not CPU-intensive to call taxonomy_get_tree() on a
+  // term and its children, too.
+  if (!isset($children[$vid])) {
+    $children[$vid] = array();
+    $parents[$vid] = array();
+    $terms[$vid] = array();
+
+    $query = db_select('taxonomy_term_data', 't');
+    $query->join('taxonomy_term_hierarchy', 'h', 'h.tid = t.tid');
+    $result = $query
+      ->addTag('translatable')
+      ->addTag('term_access')
+      ->fields('t')
+      ->fields('h', array('parent'))
+      ->condition('t.vid', $vid)
+      ->orderBy('t.weight')
+      ->orderBy('t.name')
+      ->execute();
+
+    foreach ($result as $term) {
+      $children[$vid][$term->parent][] = $term->tid;
+      $parents[$vid][$term->tid][] = $term->parent;
+      $terms[$vid][$term->tid] = $term;
+    }
+  }
+
+  // Load full entities, if necessary. The entity controller statically
+  // caches the results.
+  if ($load_entities) {
+    $term_entities = taxonomy_term_load_multiple(array_keys($terms[$vid]));
+  }
+
+  $max_depth = (!isset($max_depth)) ? count($children[$vid]) : $max_depth;
+  $tree = array();
+
+  // Keeps track of the parents we have to process, the last entry is used
+  // for the next processing step.
+  $process_parents = array();
+  $process_parents[] = $parent;
+
+  // Loops over the parent terms and adds its children to the tree array.
+  // Uses a loop instead of a recursion, because it's more efficient.
+  while (count($process_parents)) {
+    $parent = array_pop($process_parents);
+    // The number of parents determines the current depth.
+    $depth = count($process_parents);
+    if ($max_depth > $depth && !empty($children[$vid][$parent])) {
+      $has_children = FALSE;
+      $child = current($children[$vid][$parent]);
+      do {
+        if (empty($child)) {
+          break;
+        }
+        $term = $load_entities ? $term_entities[$child] : $terms[$vid][$child];
+        if (isset($parents[$vid][$term->tid])) {
+          // Clone the term so that the depth attribute remains correct
+          // in the event of multiple parents.
+          $term = clone $term;
+        }
+        $term->depth = $depth;
+        unset($term->parent);
+        $term->parents = $parents[$vid][$term->tid];
+        $tree[] = $term;
+        if (!empty($children[$vid][$term->tid])) {
+          $has_children = TRUE;
+
+          // We have to continue with this parent later.
+          $process_parents[] = $parent;
+          // Use the current term as parent for the next iteration.
+          $process_parents[] = $term->tid;
+
+          // Reset pointers for child lists because we step in there more often
+          // with multi parents.
+          reset($children[$vid][$term->tid]);
+          // Move pointer so that we get the correct term the next time.
+          next($children[$vid][$parent]);
+          break;
+        }
+      } while ($child = next($children[$vid][$parent]));
+
+      if (!$has_children) {
+        // We processed all terms in this hierarchy-level, reset pointer
+        // so that this function works the next time it gets called.
+        reset($children[$vid][$parent]);
+      }
+    }
+  }
+
+  return $tree;
+}
+
+/**
+ * Try to map a string to an existing term, as for glossary use.
+ *
+ * Provides a case-insensitive and trimmed mapping, to maximize the
+ * likelihood of a successful match.
+ *
+ * @param $name
+ *   Name of the term to search for.
+ * @param $vocabulary
+ *   (optional) Vocabulary machine name to limit the search. Defaults to NULL.
+ *
+ * @return
+ *   An array of matching term objects.
+ */
+function taxonomy_get_term_by_name($name, $vocabulary = NULL) {
+  $conditions = array('name' => trim($name));
+  if (isset($vocabulary)) {
+    $vocabularies = taxonomy_vocabulary_get_names();
+    if (isset($vocabularies[$vocabulary])) {
+      $conditions['vid'] = $vocabularies[$vocabulary]->vid;
+    }
+    else {
+      // Return an empty array when filtering by a non-existing vocabulary.
+      return array();
+    }
+  }
+  return taxonomy_term_load_multiple(array(), $conditions);
+}
+
+/**
+ * Controller class for taxonomy terms.
+ *
+ * This extends the DrupalDefaultEntityController class. Only alteration is
+ * that we match the condition on term name case-independently.
+ */
+class TaxonomyTermController extends DrupalDefaultEntityController {
+
+  protected function buildQuery($ids, $conditions = array(), $revision_id = FALSE) {
+    $query = parent::buildQuery($ids, $conditions, $revision_id);
+    $query->addTag('translatable');
+    $query->addTag('term_access');
+    // When name is passed as a condition use LIKE.
+    if (isset($conditions['name'])) {
+      $query_conditions = &$query->conditions();
+      foreach ($query_conditions as $key => $condition) {
+        if (is_array($condition) && $condition['field'] == 'base.name') {
+          $query_conditions[$key]['operator'] = 'LIKE';
+          $query_conditions[$key]['value'] = db_like($query_conditions[$key]['value']);
+        }
+      }
+    }
+    // Add the machine name field from the {taxonomy_vocabulary} table.
+    $query->innerJoin('taxonomy_vocabulary', 'v', 'base.vid = v.vid');
+    $query->addField('v', 'machine_name', 'vocabulary_machine_name');
+    return $query;
+  }
+
+  protected function cacheGet($ids, $conditions = array()) {
+    $terms = parent::cacheGet($ids, $conditions);
+    // Name matching is case insensitive, note that with some collations
+    // LOWER() and drupal_strtolower() may return different results.
+    foreach ($terms as $term) {
+      $term_values = (array) $term;
+      if (isset($conditions['name']) && drupal_strtolower($conditions['name'] != drupal_strtolower($term_values['name']))) {
+        unset($terms[$term->tid]);
+      }
+    }
+    return $terms;
+  }
+}
+
+/**
+ * Controller class for taxonomy vocabularies.
+ *
+ * This extends the DrupalDefaultEntityController class, adding required
+ * special handling for taxonomy vocabulary objects.
+ */
+class TaxonomyVocabularyController extends DrupalDefaultEntityController {
+
+  protected function buildQuery($ids, $conditions = array(), $revision_id = FALSE) {
+    $query = parent::buildQuery($ids, $conditions, $revision_id);
+    $query->addTag('translatable');
+    $query->orderBy('base.weight');
+    $query->orderBy('base.name');
+    return $query;
+  }
+}
+
+/**
+ * Load multiple taxonomy terms based on certain conditions.
+ *
+ * This function should be used whenever you need to load more than one term
+ * from the database. Terms are loaded into memory and will not require
+ * database access if loaded again during the same page request.
+ *
+ * @see entity_load()
+ * @see EntityFieldQuery
+ *
+ * @param $tids
+ *   An array of taxonomy term IDs.
+ * @param $conditions
+ *   (deprecated) An associative array of conditions on the {taxonomy_term}
+ *   table, where the keys are the database fields and the values are the
+ *   values those fields must have. Instead, it is preferable to use
+ *   EntityFieldQuery to retrieve a list of entity IDs loadable by
+ *   this function.
+ *
+ * @return
+ *   An array of term objects, indexed by tid. When no results are found, an
+ *   empty array is returned.
+ *
+ * @todo Remove $conditions in Drupal 8.
+ */
+function taxonomy_term_load_multiple($tids = array(), $conditions = array()) {
+  return entity_load('taxonomy_term', $tids, $conditions);
+}
+
+/**
+ * Load multiple taxonomy vocabularies based on certain conditions.
+ *
+ * This function should be used whenever you need to load more than one
+ * vocabulary from the database. Terms are loaded into memory and will not
+ * require database access if loaded again during the same page request.
+ *
+ * @see entity_load()
+ *
+ * @param $vids
+ *  An array of taxonomy vocabulary IDs, or FALSE to load all vocabularies.
+ * @param $conditions
+ *  An array of conditions to add to the query.
+ *
+ * @return
+ *  An array of vocabulary objects, indexed by vid.
+ */
+function taxonomy_vocabulary_load_multiple($vids = array(), $conditions = array()) {
+  return entity_load('taxonomy_vocabulary', $vids, $conditions);
+}
+
+/**
+ * Return the vocabulary object matching a vocabulary ID.
+ *
+ * @param $vid
+ *   The vocabulary's ID.
+ *
+ * @return
+ *   The vocabulary object with all of its metadata, if exists, FALSE otherwise.
+ *   Results are statically cached.
+ *
+ * @see taxonomy_vocabulary_machine_name_load()
+ */
+function taxonomy_vocabulary_load($vid) {
+  $vocabularies = taxonomy_vocabulary_load_multiple(array($vid));
+  return reset($vocabularies);
+}
+
+/**
+ * Return the vocabulary object matching a vocabulary machine name.
+ *
+ * @param $name
+ *   The vocabulary's machine name.
+ *
+ * @return
+ *   The vocabulary object with all of its metadata, if exists, FALSE otherwise.
+ *   Results are statically cached.
+ *
+ * @see taxonomy_vocabulary_load()
+ */
+function taxonomy_vocabulary_machine_name_load($name) {
+  $vocabularies = taxonomy_vocabulary_load_multiple(NULL, array('machine_name' => $name));
+  return reset($vocabularies);
+}
+
+/**
+ * Return the term object matching a term ID.
+ *
+ * @param $tid
+ *   A term's ID
+ *
+ * @return
+ *   A taxonomy term object, or FALSE if the term was not found. Results are
+ *   statically cached.
+ */
+function taxonomy_term_load($tid) {
+  if (!is_numeric($tid)) {
+    return FALSE;
+  }
+  $term = taxonomy_term_load_multiple(array($tid), array());
+  return $term ? $term[$tid] : FALSE;
+}
+
+/**
+ * Helper function for array_map purposes.
+ */
+function _taxonomy_get_tid_from_term($term) {
+  return $term->tid;
+}
+
+/**
+ * Implodes a list of tags of a certain vocabulary into a string.
+ *
+ * @see drupal_explode_tags()
+ */
+function taxonomy_implode_tags($tags, $vid = NULL) {
+  $typed_tags = array();
+  foreach ($tags as $tag) {
+    // Extract terms belonging to the vocabulary in question.
+    if (!isset($vid) || $tag->vid == $vid) {
+      // Make sure we have a completed loaded taxonomy term.
+      if (isset($tag->name)) {
+        // Commas and quotes in tag names are special cases, so encode 'em.
+        if (strpos($tag->name, ',') !== FALSE || strpos($tag->name, '"') !== FALSE) {
+          $typed_tags[] = '"' . str_replace('"', '""', $tag->name) . '"';
+        }
+        else {
+          $typed_tags[] = $tag->name;
+        }
+      }
+    }
+  }
+  return implode(', ', $typed_tags);
+}
+
+/**
+ * Implements hook_field_info().
+ *
+ * Field settings:
+ * - allowed_values: a list array of one or more vocabulary trees:
+ *   - vocabulary: a vocabulary machine name.
+ *   - parent: a term ID of a term whose children are allowed. This should be
+ *     '0' if all terms in a vocabulary are allowed. The allowed values do not
+ *     include the parent term.
+ *
+ */
+function taxonomy_field_info() {
+  return array(
+    'taxonomy_term_reference' => array(
+      'label' => t('Term reference'),
+      'description' => t('This field stores a reference to a taxonomy term.'),
+      'default_widget' => 'options_select',
+      'default_formatter' => 'taxonomy_term_reference_link',
+      'settings' => array(
+        'allowed_values' => array(
+          array(
+            'vocabulary' => '',
+            'parent' => '0',
+          ),
+        ),
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_widget_info().
+ */
+function taxonomy_field_widget_info() {
+  return array(
+    'taxonomy_autocomplete' => array(
+      'label' => t('Autocomplete term widget (tagging)'),
+      'field types' => array('taxonomy_term_reference'),
+      'settings' => array(
+        'size' => 60,
+        'autocomplete_path' => 'taxonomy/autocomplete',
+      ),
+      'behaviors' => array(
+        'multiple values' => FIELD_BEHAVIOR_CUSTOM,
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_widget_info_alter().
+ */
+function taxonomy_field_widget_info_alter(&$info) {
+  $info['options_select']['field types'][] = 'taxonomy_term_reference';
+  $info['options_buttons']['field types'][] = 'taxonomy_term_reference';
+}
+
+/**
+ * Implements hook_options_list().
+ */
+function taxonomy_options_list($field, $instance, $entity_type, $entity) {
+  $function = !empty($field['settings']['options_list_callback']) ? $field['settings']['options_list_callback'] : 'taxonomy_allowed_values';
+  return $function($field);
+}
+
+/**
+ * Implements hook_field_validate().
+ *
+ * Taxonomy field settings allow for either a single vocabulary ID, multiple
+ * vocabulary IDs, or sub-trees of a vocabulary to be specified as allowed
+ * values, although only the first of these is supported via the field UI.
+ * Confirm that terms entered as values meet at least one of these conditions.
+ *
+ * Possible error codes:
+ * - 'taxonomy_term_illegal_value': The value is not part of the list of allowed values.
+ */
+function taxonomy_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
+  // Build an array of existing term IDs so they can be loaded with
+  // taxonomy_term_load_multiple();
+  foreach ($items as $delta => $item) {
+    if (!empty($item['tid']) && $item['tid'] != 'autocreate') {
+      $tids[] = $item['tid'];
+    }
+  }
+  if (!empty($tids)) {
+    $terms = taxonomy_term_load_multiple($tids);
+
+    // Check each existing item to ensure it can be found in the
+    // allowed values for this field.
+    foreach ($items as $delta => $item) {
+      $validate = TRUE;
+      if (!empty($item['tid']) && $item['tid'] != 'autocreate') {
+        $validate = FALSE;
+        foreach ($field['settings']['allowed_values'] as $settings) {
+          // If no parent is specified, check if the term is in the vocabulary.
+          if (isset($settings['vocabulary']) && empty($settings['parent'])) {
+            if ($settings['vocabulary'] == $terms[$item['tid']]->vocabulary_machine_name) {
+              $validate = TRUE;
+              break;
+            }
+          }
+          // If a parent is specified, then to validate it must appear in the
+          // array returned by taxonomy_get_parents_all().
+          elseif (!empty($settings['parent'])) {
+            $ancestors = taxonomy_get_parents_all($item['tid']);
+            foreach ($ancestors as $ancestor) {
+              if ($ancestor->tid == $settings['parent']) {
+                $validate = TRUE;
+                break 2;
+              }
+            }
+          }
+        }
+      }
+      if (!$validate) {
+        $errors[$field['field_name']][$langcode][$delta][] = array(
+          'error' => 'taxonomy_term_reference_illegal_value',
+          'message' => t('%name: illegal value.', array('%name' => $instance['label'])),
+        );
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_is_empty().
+ */
+function taxonomy_field_is_empty($item, $field) {
+  if (!is_array($item) || (empty($item['tid']) && (string) $item['tid'] !== '0')) {
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
+ * Implements hook_field_formatter_info().
+ */
+function taxonomy_field_formatter_info() {
+  return array(
+    'taxonomy_term_reference_link' => array(
+      'label' => t('Link'),
+      'field types' => array('taxonomy_term_reference'),
+    ),
+    'taxonomy_term_reference_plain' => array(
+      'label' => t('Plain text'),
+      'field types' => array('taxonomy_term_reference'),
+    ),
+    'taxonomy_term_reference_rss_category' => array(
+      'label' => t('RSS category'),
+      'field types' => array('taxonomy_term_reference'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_formatter_view().
+ */
+function taxonomy_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  $element = array();
+
+  // Terms whose tid is 'autocreate' do not exist
+  // yet and $item['taxonomy_term'] is not set. Theme such terms as
+  // just their name.
+
+  switch ($display['type']) {
+    case 'taxonomy_term_reference_link':
+      foreach ($items as $delta => $item) {
+        if ($item['tid'] == 'autocreate') {
+          $element[$delta] = array(
+            '#markup' => check_plain($item['name']),
+          );
+        }
+        else {
+          $term = $item['taxonomy_term'];
+          $uri = entity_uri('taxonomy_term', $term);
+          $element[$delta] = array(
+            '#type' => 'link',
+            '#title' => $term->name,
+            '#href' => $uri['path'],
+            '#options' => $uri['options'],
+          );
+        }
+      }
+      break;
+
+    case 'taxonomy_term_reference_plain':
+      foreach ($items as $delta => $item) {
+        $name = ($item['tid'] != 'autocreate' ? $item['taxonomy_term']->name : $item['name']);
+        $element[$delta] = array(
+          '#markup' => check_plain($name),
+        );
+      }
+      break;
+
+    case 'taxonomy_term_reference_rss_category':
+      foreach ($items as $delta => $item) {
+        $entity->rss_elements[] = array(
+          'key' => 'category',
+          'value' => $item['tid'] != 'autocreate' ? $item['taxonomy_term']->name : $item['name'],
+          'attributes' => array(
+            'domain' => $item['tid'] != 'autocreate' ? url('taxonomy/term/' . $item['tid'], array('absolute' => TRUE)) : '',
+          ),
+        );
+      }
+      break;
+  }
+
+  return $element;
+}
+
+/**
+ * Returns the set of valid terms for a taxonomy field.
+ *
+ * @param $field
+ *   The field definition.
+ * @return
+ *   The array of valid terms for this field, keyed by term id.
+ */
+function taxonomy_allowed_values($field) {
+  $options = array();
+  foreach ($field['settings']['allowed_values'] as $tree) {
+    if ($vocabulary = taxonomy_vocabulary_machine_name_load($tree['vocabulary'])) {
+      if ($terms = taxonomy_get_tree($vocabulary->vid, $tree['parent'])) {
+        foreach ($terms as $term) {
+          $options[$term->tid] = str_repeat('-', $term->depth) . $term->name;
+        }
+      }
+    }
+  }
+  return $options;
+}
+
+/**
+ * Implements hook_field_formatter_prepare_view().
+ *
+ * This preloads all taxonomy terms for multiple loaded objects at once and
+ * unsets values for invalid terms that do not exist.
+ */
+function taxonomy_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays) {
+  $tids = array();
+
+  // Collect every possible term attached to any of the fieldable entities.
+  foreach ($entities as $id => $entity) {
+    foreach ($items[$id] as $delta => $item) {
+      // Force the array key to prevent duplicates.
+      if ($item['tid'] != 'autocreate') {
+        $tids[$item['tid']] = $item['tid'];
+      }
+    }
+  }
+  if ($tids) {
+    $terms = taxonomy_term_load_multiple($tids);
+
+    // Iterate through the fieldable entities again to attach the loaded term data.
+    foreach ($entities as $id => $entity) {
+      $rekey = FALSE;
+
+      foreach ($items[$id] as $delta => $item) {
+        // Check whether the taxonomy term field instance value could be loaded.
+        if (isset($terms[$item['tid']])) {
+          // Replace the instance value with the term data.
+          $items[$id][$delta]['taxonomy_term'] = $terms[$item['tid']];
+        }
+        // Terms to be created are not in $terms, but are still legitimate.
+        elseif ($item['tid'] == 'autocreate') {
+          // Leave the item in place.
+        }
+        // Otherwise, unset the instance value, since the term does not exist.
+        else {
+          unset($items[$id][$delta]);
+          $rekey = TRUE;
+        }
+      }
+
+      if ($rekey) {
+        // Rekey the items array.
+        $items[$id] = array_values($items[$id]);
+      }
+    }
+  }
+}
+
+/**
+ * Title callback for term pages.
+ *
+ * @param $term
+ *   A term object.
+ *
+ * @return
+ *   The term name to be used as the page title.
+ */
+function taxonomy_term_title($term) {
+  return $term->name;
+}
+
+/**
+ * Implements hook_field_widget_form().
+ */
+function taxonomy_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  $tags = array();
+  foreach ($items as $item) {
+    $tags[$item['tid']] = isset($item['taxonomy_term']) ? $item['taxonomy_term'] : taxonomy_term_load($item['tid']);
+  }
+
+  $element += array(
+    '#type' => 'textfield',
+    '#default_value' => taxonomy_implode_tags($tags),
+    '#autocomplete_path' => $instance['widget']['settings']['autocomplete_path'] . '/' . $field['field_name'],
+    '#size' => $instance['widget']['settings']['size'],
+    '#maxlength' => 1024,
+    '#element_validate' => array('taxonomy_autocomplete_validate'),
+  );
+
+  return $element;
+}
+
+/**
+ * Form element validate handler for taxonomy term autocomplete element.
+ */
+function taxonomy_autocomplete_validate($element, &$form_state) {
+  // Autocomplete widgets do not send their tids in the form, so we must detect
+  // them here and process them independently.
+  $value = array();
+  if ($tags = $element['#value']) {
+    // Collect candidate vocabularies.
+    $field = field_widget_field($element, $form_state);
+    $vocabularies = array();
+    foreach ($field['settings']['allowed_values'] as $tree) {
+      if ($vocabulary = taxonomy_vocabulary_machine_name_load($tree['vocabulary'])) {
+        $vocabularies[$vocabulary->vid] = $vocabulary;
+      }
+    }
+
+    // Translate term names into actual terms.
+    $typed_terms = drupal_explode_tags($tags);
+    foreach ($typed_terms as $typed_term) {
+      // See if the term exists in the chosen vocabulary and return the tid;
+      // otherwise, create a new 'autocreate' term for insert/update.
+      if ($possibilities = taxonomy_term_load_multiple(array(), array('name' => trim($typed_term), 'vid' => array_keys($vocabularies)))) {
+        $term = array_pop($possibilities);
+      }
+      else {
+        $vocabulary = reset($vocabularies);
+        $term = array(
+          'tid' => 'autocreate',
+          'vid' => $vocabulary->vid,
+          'name' => $typed_term,
+          'vocabulary_machine_name' => $vocabulary->machine_name,
+        );
+      }
+      $value[] = (array)$term;
+    }
+  }
+
+  form_set_value($element, $value, $form_state);
+}
+
+/**
+ * Implements hook_field_widget_error().
+ */
+function taxonomy_field_widget_error($element, $error, $form, &$form_state) {
+  form_error($element, $error['message']);
+}
+/**
+ * Implements hook_field_settings_form().
+ */
+function taxonomy_field_settings_form($field, $instance, $has_data) {
+  // Get proper values for 'allowed_values_function', which is a core setting.
+  $vocabularies = taxonomy_get_vocabularies();
+  $options = array();
+  foreach ($vocabularies as $vocabulary) {
+    $options[$vocabulary->machine_name] = $vocabulary->name;
+  }
+  $form['allowed_values'] = array(
+    '#tree' => TRUE,
+  );
+
+  foreach ($field['settings']['allowed_values'] as $delta => $tree) {
+    $form['allowed_values'][$delta]['vocabulary'] = array(
+      '#type' => 'select',
+      '#title' => t('Vocabulary'),
+      '#default_value' => $tree['vocabulary'],
+      '#options' => $options,
+      '#required' => TRUE,
+      '#description' => t('The vocabulary which supplies the options for this field.'),
+      '#disabled' => $has_data,
+    );
+    $form['allowed_values'][$delta]['parent'] = array(
+      '#type' => 'value',
+      '#value' => $tree['parent'],
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Implements hook_rdf_mapping().
+ *
+ * @return array
+ *   The rdf mapping for vocabularies and terms.
+ */
+function taxonomy_rdf_mapping() {
+  return array(
+    array(
+      'type' => 'taxonomy_term',
+      'bundle' => RDF_DEFAULT_BUNDLE,
+      'mapping' => array(
+        'rdftype' => array('skos:Concept'),
+        'name'   => array(
+          'predicates' => array('rdfs:label', 'skos:prefLabel'),
+        ),
+        'description'   => array(
+          'predicates' => array('skos:definition'),
+        ),
+        'vid'   => array(
+          'predicates' => array('skos:inScheme'),
+          'type' => 'rel',
+        ),
+        'parent'   => array(
+          'predicates' => array('skos:broader'),
+          'type' => 'rel',
+        ),
+      ),
+    ),
+    array(
+      'type' => 'taxonomy_vocabulary',
+      'bundle' => RDF_DEFAULT_BUNDLE,
+      'mapping' => array(
+        'rdftype' => array('skos:ConceptScheme'),
+        'name'   => array(
+          'predicates' => array('dc:title'),
+        ),
+        'description'   => array(
+          'predicates' => array('rdfs:comment'),
+        ),
+      ),
+    ),
+  );
+}
+
+/**
+ * @defgroup taxonomy_index Taxonomy indexing
+ * @{
+ * Functions to maintain taxonomy indexing.
+ *
+ * Taxonomy uses default field storage to store canonical relationships
+ * between terms and fieldable entities. However its most common use case
+ * requires listing all content associated with a term or group of terms
+ * sorted by creation date. To avoid slow queries due to joining across
+ * multiple node and field tables with various conditions and order by criteria,
+ * we maintain a denormalized table with all relationships between terms,
+ * published nodes and common sort criteria such as sticky and created.
+ * This is used as a lookup table by taxonomy_select_nodes(). When using other
+ * field storage engines or alternative methods of denormalizing this data
+ * you should set the variable 'taxonomy_maintain_index_table' to FALSE
+ * to avoid unnecessary writes in SQL.
+ */
+
+/**
+ * Implements hook_field_presave().
+ *
+ * Create any new terms defined in a freetagging vocabulary.
+ */
+function taxonomy_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  foreach ($items as $delta => $item) {
+    if ($item['tid'] == 'autocreate') {
+      $term = (object) $item;
+      unset($term->tid);
+      taxonomy_term_save($term);
+      $items[$delta]['tid'] = $term->tid;
+    }
+  }
+}
+
+/**
+ * Implements hook_node_insert().
+ */
+function taxonomy_node_insert($node) {
+  // Add taxonomy index entries for the node.
+  taxonomy_build_node_index($node);
+}
+
+/**
+ * Builds and inserts taxonomy index entries for a given node.
+ *
+ * The index lists all terms that are related to a given node entity, and is
+ * therefore maintained at the entity level.
+ *
+ * @param $node
+ *   The node object.
+ */
+function taxonomy_build_node_index($node) {
+  // We maintain a denormalized table of term/node relationships, containing
+  // only data for current, published nodes.
+  $status = NULL;
+  if (variable_get('taxonomy_maintain_index_table', TRUE)) {
+    // If a node property is not set in the node object when node_save() is
+    // called, the old value from $node->original is used.
+    if (!empty($node->original)) {
+      $status = (int)(!empty($node->status) || (!isset($node->status) && !empty($node->original->status)));
+      $sticky = (int)(!empty($node->sticky) || (!isset($node->sticky) && !empty($node->original->sticky)));
+    }
+    else {
+      $status = (int)(!empty($node->status));
+      $sticky = (int)(!empty($node->sticky));
+    }
+  }
+  // We only maintain the taxonomy index for published nodes.
+  if ($status) {
+    // Collect a unique list of all the term IDs from all node fields.
+    $tid_all = array();
+    foreach (field_info_instances('node', $node->type) as $instance) {
+      $field_name = $instance['field_name'];
+      $field = field_info_field($field_name);
+      if ($field['module'] == 'taxonomy' && $field['storage']['type'] == 'field_sql_storage') {
+        // If a field value is not set in the node object when node_save() is
+        // called, the old value from $node->original is used.
+        if (isset($node->{$field_name})) {
+          $items = $node->{$field_name};
+        }
+        elseif (isset($node->original->{$field_name})) {
+          $items = $node->original->{$field_name};
+        }
+        else {
+          continue;
+        }
+        foreach (field_available_languages('node', $field) as $langcode) {
+          if (!empty($items[$langcode])) {
+            foreach ($items[$langcode] as $item) {
+              $tid_all[$item['tid']] = $item['tid'];
+            }
+          }
+        }
+      }
+    }
+    // Insert index entries for all the node's terms.
+    if (!empty($tid_all)) {
+      $query = db_insert('taxonomy_index')->fields(array('nid', 'tid', 'sticky', 'created'));
+      foreach ($tid_all as $tid) {
+        $query->values(array(
+          'nid' => $node->nid,
+          'tid' => $tid,
+          'sticky' => $sticky,
+          'created' => $node->created,
+        ));
+      }
+      $query->execute();
+    }
+  }
+}
+
+/**
+ * Implements hook_node_update().
+ */
+function taxonomy_node_update($node) {
+  // Always rebuild the node's taxonomy index entries on node save.
+  taxonomy_delete_node_index($node);
+  taxonomy_build_node_index($node);
+}
+
+/**
+ * Implements hook_node_delete().
+ */
+function taxonomy_node_delete($node) {
+  // Clean up the {taxonomy_index} table when nodes are deleted.
+  taxonomy_delete_node_index($node);
+}
+
+/**
+ * Deletes taxonomy index entries for a given node.
+ *
+ * @param $node
+ *   The node object.
+ */
+function taxonomy_delete_node_index($node) {
+  if (variable_get('taxonomy_maintain_index_table', TRUE)) {
+    db_delete('taxonomy_index')->condition('nid', $node->nid)->execute();
+  }
+}
+
+/**
+ * Implements hook_taxonomy_term_delete().
+ */
+function taxonomy_taxonomy_term_delete($term) {
+  if (variable_get('taxonomy_maintain_index_table', TRUE)) {
+    // Clean up the {taxonomy_index} table when terms are deleted.
+    db_delete('taxonomy_index')->condition('tid', $term->tid)->execute();
+  }
+}
+
+/**
+ * @} End of "defgroup taxonomy_index".
+ */
+
+/**
+ * Implements hook_entity_query_alter().
+ *
+ * Converts EntityFieldQuery instances on taxonomy terms that have an entity
+ * condition on term bundles (vocabulary machine names). Since the vocabulary
+ * machine name is not present in the {taxonomy_term_data} table itself, we have
+ * to convert the bundle condition into a property condition of vocabulary IDs
+ * to match against {taxonomy_term_data}.vid.
+ */
+function taxonomy_entity_query_alter($query) {
+  $conditions = &$query->entityConditions;
+
+  // Alter only taxonomy term queries with bundle conditions.
+  if (isset($conditions['entity_type']) && $conditions['entity_type']['value'] == 'taxonomy_term' && isset($conditions['bundle'])) {
+    // Convert vocabulary machine names to vocabulary IDs.
+    $vocabulary_data = taxonomy_vocabulary_get_names();
+    $vids = array();
+    if (is_array($conditions['bundle']['value'])) {
+      foreach ($conditions['bundle']['value'] as $vocabulary_machine_name) {
+        $vids[] = $vocabulary_data[$vocabulary_machine_name]->vid;
+      }
+    }
+    else {
+      $vocabulary_machine_name = $conditions['bundle']['value'];
+      $vids = $vocabulary_data[$vocabulary_machine_name]->vid;
+    }
+
+    $query->propertyCondition('vid', $vids, $conditions['bundle']['operator']);
+    unset($conditions['bundle']);
+  }
+}
diff --git a/htmltest/modules/taxonomy/taxonomy.pages.inc b/htmltest/modules/taxonomy/taxonomy.pages.inc
new file mode 100644
index 00000000..975ff120
--- /dev/null
+++ b/htmltest/modules/taxonomy/taxonomy.pages.inc
@@ -0,0 +1,181 @@
+<?php
+
+/**
+ * @file
+ * Page callbacks for the taxonomy module.
+ */
+
+/**
+ * Menu callback; displays all nodes associated with a term.
+ *
+ * @param $term
+ *   The taxonomy term.
+ * @return
+ *   The page content.
+ */
+function taxonomy_term_page($term) {
+  // If there is a menu link to this term, the link becomes the last part of
+  // the active trail, and the link name becomes the page title. Thus, we must
+  // explicitly set the page title to be the term title.
+  drupal_set_title($term->name);
+
+  // Build breadcrumb based on the hierarchy of the term.
+  $current = (object) array(
+    'tid' => $term->tid,
+  );
+  // @todo This overrides any other possible breadcrumb and is a pure hard-coded
+  //   presumption. Make this behavior configurable per vocabulary or term.
+  $breadcrumb = array();
+  while ($parents = taxonomy_get_parents($current->tid)) {
+    $current = array_shift($parents);
+    $breadcrumb[] = l($current->name, 'taxonomy/term/' . $current->tid);
+  }
+  $breadcrumb[] = l(t('Home'), NULL);
+  $breadcrumb = array_reverse($breadcrumb);
+  drupal_set_breadcrumb($breadcrumb);
+  drupal_add_feed('taxonomy/term/' . $term->tid . '/feed', 'RSS - ' . $term->name);
+
+  // Set the term path as the canonical URL to prevent duplicate content.
+  $uri = entity_uri('taxonomy_term', $term);
+  drupal_add_html_head_link(array('rel' => 'canonical', 'href' => url($uri['path'], $uri['options'])), TRUE);
+  // Set the non-aliased path as a default shortlink.
+  drupal_add_html_head_link(array('rel' => 'shortlink', 'href' => url($uri['path'], array_merge($uri['options'], array('alias' => TRUE)))), TRUE);
+
+  // Normally we would call taxonomy_term_show() here, but for backwards
+  // compatibility in Drupal 7 we do not want to do that (it produces different
+  // data structures and HTML markup than what Drupal 7 released with). Calling
+  // taxonomy_term_view() directly provides essentially the same thing, but
+  // allows us to wrap the rendered term in our desired array structure.
+  $build['term_heading'] = array(
+    '#prefix' => '<div class="term-listing-heading">',
+    '#suffix' => '</div>',
+    'term' => taxonomy_term_view($term, 'full'),
+  );
+
+  if ($nids = taxonomy_select_nodes($term->tid, TRUE, variable_get('default_nodes_main', 10))) {
+    $nodes = node_load_multiple($nids);
+    $build += node_view_multiple($nodes);
+    $build['pager'] = array(
+      '#theme' => 'pager',
+      '#weight' => 5,
+    );
+  }
+  else {
+    $build['no_content'] = array(
+      '#prefix' => '<p>',
+      '#markup' => t('There is currently no content classified with this term.'),
+      '#suffix' => '</p>',
+    );
+  }
+  return $build;
+}
+
+/**
+ * Generate the content feed for a taxonomy term.
+ *
+ * @param $term
+ *   The taxonomy term.
+ */
+function taxonomy_term_feed($term) {
+  $channel['link'] = url('taxonomy/term/' . $term->tid, array('absolute' => TRUE));
+  $channel['title'] = variable_get('site_name', 'Drupal') . ' - ' . $term->name;
+  // Only display the description if we have a single term, to avoid clutter and confusion.
+  // HTML will be removed from feed description.
+  $channel['description'] = check_markup($term->description, $term->format, '', TRUE);
+  $nids = taxonomy_select_nodes($term->tid, FALSE, variable_get('feed_default_items', 10));
+
+  node_feed($nids, $channel);
+}
+
+/**
+ * Page callback: Outputs JSON for taxonomy autocomplete suggestions.
+ *
+ * Path: taxonomy/autocomplete
+ *
+ * This callback outputs term name suggestions in response to Ajax requests
+ * made by the taxonomy autocomplete widget for taxonomy term reference
+ * fields. The output is a JSON object of plain-text term suggestions, keyed by
+ * the user-entered value with the completed term name appended.  Term names
+ * containing commas are wrapped in quotes.
+ *
+ * For example, suppose the user has entered the string 'red fish, blue' in the
+ * field, and there are two taxonomy terms, 'blue fish' and 'blue moon'. The
+ * JSON output would have the following structure:
+ * @code
+ *   {
+ *     "red fish, blue fish": "blue fish",
+ *     "red fish, blue moon": "blue moon",
+ *   };
+ * @endcode
+ *
+ * @param $field_name
+ *   The name of the term reference field.
+ * @param $tags_typed
+ *   (optional) A comma-separated list of term names entered in the
+ *   autocomplete form element. Only the last term is used for autocompletion.
+ *   Defaults to '' (an empty string).
+ *
+ * @see taxonomy_menu()
+ * @see taxonomy_field_widget_info()
+ */
+function taxonomy_autocomplete($field_name = '', $tags_typed = '') {
+  // If the request has a '/' in the search text, then the menu system will have
+  // split it into multiple arguments, recover the intended $tags_typed.
+  $args = func_get_args();
+  // Shift off the $field_name argument.
+  array_shift($args);
+  $tags_typed = implode('/', $args);
+
+  // Make sure the field exists and is a taxonomy field.
+  if (!($field = field_info_field($field_name)) || $field['type'] !== 'taxonomy_term_reference') {
+    // Error string. The JavaScript handler will realize this is not JSON and
+    // will display it as debugging information.
+    print t('Taxonomy field @field_name not found.', array('@field_name' => $field_name));
+    exit;
+  }
+
+  // The user enters a comma-separated list of tags. We only autocomplete the last tag.
+  $tags_typed = drupal_explode_tags($tags_typed);
+  $tag_last = drupal_strtolower(array_pop($tags_typed));
+
+  $term_matches = array();
+  if ($tag_last != '') {
+
+    // Part of the criteria for the query come from the field's own settings.
+    $vids = array();
+    $vocabularies = taxonomy_vocabulary_get_names();
+    foreach ($field['settings']['allowed_values'] as $tree) {
+      $vids[] = $vocabularies[$tree['vocabulary']]->vid;
+    }
+
+    $query = db_select('taxonomy_term_data', 't');
+    $query->addTag('translatable');
+    $query->addTag('term_access');
+
+    // Do not select already entered terms.
+    if (!empty($tags_typed)) {
+      $query->condition('t.name', $tags_typed, 'NOT IN');
+    }
+    // Select rows that match by term name.
+    $tags_return = $query
+      ->fields('t', array('tid', 'name'))
+      ->condition('t.vid', $vids)
+      ->condition('t.name', '%' . db_like($tag_last) . '%', 'LIKE')
+      ->range(0, 10)
+      ->execute()
+      ->fetchAllKeyed();
+
+    $prefix = count($tags_typed) ? drupal_implode_tags($tags_typed) . ', ' : '';
+
+    foreach ($tags_return as $tid => $name) {
+      $n = $name;
+      // Term names containing commas or quotes must be wrapped in quotes.
+      if (strpos($name, ',') !== FALSE || strpos($name, '"') !== FALSE) {
+        $n = '"' . str_replace('"', '""', $name) . '"';
+      }
+      $term_matches[$prefix . $n] = check_plain($name);
+    }
+  }
+
+  drupal_json_output($term_matches);
+}
diff --git a/htmltest/modules/taxonomy/taxonomy.test b/htmltest/modules/taxonomy/taxonomy.test
new file mode 100644
index 00000000..665f9aeb
--- /dev/null
+++ b/htmltest/modules/taxonomy/taxonomy.test
@@ -0,0 +1,1980 @@
+<?php
+
+/**
+ * @file
+ * Tests for taxonomy.module.
+ */
+
+/**
+ * Provides common helper methods for Taxonomy module tests.
+ */
+class TaxonomyWebTestCase extends DrupalWebTestCase {
+
+  /**
+   * Returns a new vocabulary with random properties.
+   */
+  function createVocabulary() {
+    // Create a vocabulary.
+    $vocabulary = new stdClass();
+    $vocabulary->name = $this->randomName();
+    $vocabulary->description = $this->randomName();
+    $vocabulary->machine_name = drupal_strtolower($this->randomName());
+    $vocabulary->help = '';
+    $vocabulary->nodes = array('article' => 'article');
+    $vocabulary->weight = mt_rand(0, 10);
+    taxonomy_vocabulary_save($vocabulary);
+    return $vocabulary;
+  }
+
+  /**
+   * Returns a new term with random properties in vocabulary $vid.
+   */
+  function createTerm($vocabulary) {
+    $term = new stdClass();
+    $term->name = $this->randomName();
+    $term->description = $this->randomName();
+    // Use the first available text format.
+    $term->format = db_query_range('SELECT format FROM {filter_format}', 0, 1)->fetchField();
+    $term->vid = $vocabulary->vid;
+    taxonomy_term_save($term);
+    return $term;
+  }
+
+}
+
+/**
+ * Tests the taxonomy vocabulary interface.
+ */
+class TaxonomyVocabularyFunctionalTest extends TaxonomyWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Taxonomy vocabulary interface',
+      'description' => 'Test the taxonomy vocabulary interface.',
+      'group' => 'Taxonomy',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $this->admin_user = $this->drupalCreateUser(array('administer taxonomy'));
+    $this->drupalLogin($this->admin_user);
+    $this->vocabulary = $this->createVocabulary();
+  }
+
+  /**
+   * Create, edit and delete a vocabulary via the user interface.
+   */
+  function testVocabularyInterface() {
+    // Visit the main taxonomy administration page.
+    $this->drupalGet('admin/structure/taxonomy');
+
+    // Create a new vocabulary.
+    $this->clickLink(t('Add vocabulary'));
+    $edit = array();
+    $machine_name = drupal_strtolower($this->randomName());
+    $edit['name'] = $this->randomName();
+    $edit['description'] = $this->randomName();
+    $edit['machine_name'] = $machine_name;
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertRaw(t('Created new vocabulary %name.', array('%name' => $edit['name'])), 'Vocabulary created successfully.');
+
+    // Edit the vocabulary.
+    $this->drupalGet('admin/structure/taxonomy');
+    $this->assertText($edit['name'], 'Vocabulary found in the vocabulary overview listing.');
+    $this->clickLink(t('edit vocabulary'));
+    $edit = array();
+    $edit['name'] = $this->randomName();
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->drupalGet('admin/structure/taxonomy');
+    $this->assertText($edit['name'], 'Vocabulary found in the vocabulary overview listing.');
+
+    // Try to submit a vocabulary with a duplicate machine name.
+    $edit['machine_name'] = $machine_name;
+    $this->drupalPost('admin/structure/taxonomy/add', $edit, t('Save'));
+    $this->assertText(t('The machine-readable name is already in use. It must be unique.'));
+
+    // Try to submit an invalid machine name.
+    $edit['machine_name'] = '!&^%';
+    $this->drupalPost('admin/structure/taxonomy/add', $edit, t('Save'));
+    $this->assertText(t('The machine-readable name must contain only lowercase letters, numbers, and underscores.'));
+
+    // Ensure that vocabulary titles are escaped properly.
+    $edit = array();
+    $edit['name'] = 'Don\'t Panic';
+    $edit['description'] = $this->randomName();
+    $edit['machine_name'] = 'don_t_panic';
+    $this->drupalPost('admin/structure/taxonomy/add', $edit, t('Save'));
+
+    $site_name = variable_get('site_name', 'Drupal');
+    $this->drupalGet('admin/structure/taxonomy/don_t_panic');
+    $this->assertTitle(t('Don\'t Panic | @site-name', array('@site-name' => $site_name)));
+    $this->assertNoTitle(t('Don&#039;t Panic | @site-name', array('@site-name' => $site_name)));
+  }
+
+  /**
+   * Changing weights on the vocabulary overview with two or more vocabularies.
+   */
+  function testTaxonomyAdminChangingWeights() {
+    // Create some vocabularies.
+    for ($i = 0; $i < 10; $i++) {
+      $this->createVocabulary();
+    }
+    // Get all vocabularies and change their weights.
+    $vocabularies = taxonomy_get_vocabularies();
+    $edit = array();
+    foreach ($vocabularies as $key => $vocabulary) {
+      $vocabulary->weight = -$vocabulary->weight;
+      $vocabularies[$key]->weight = $vocabulary->weight;
+      $edit[$key . '[weight]'] = $vocabulary->weight;
+    }
+    // Saving the new weights via the interface.
+    $this->drupalPost('admin/structure/taxonomy', $edit, t('Save'));
+
+    // Load the vocabularies from the database.
+    $new_vocabularies = taxonomy_get_vocabularies();
+
+    // Check that the weights are saved in the database correctly.
+    foreach ($vocabularies as $key => $vocabulary) {
+      $this->assertEqual($new_vocabularies[$key]->weight, $vocabularies[$key]->weight, 'The vocabulary weight was changed.');
+    }
+  }
+
+  /**
+   * Test the vocabulary overview with no vocabularies.
+   */
+  function testTaxonomyAdminNoVocabularies() {
+    // Delete all vocabularies.
+    $vocabularies = taxonomy_get_vocabularies();
+    foreach ($vocabularies as $key => $vocabulary) {
+      taxonomy_vocabulary_delete($key);
+    }
+    // Confirm that no vocabularies are found in the database.
+    $this->assertFalse(taxonomy_get_vocabularies(), 'No vocabularies found in the database.');
+    $this->drupalGet('admin/structure/taxonomy');
+    // Check the default message for no vocabularies.
+    $this->assertText(t('No vocabularies available.'), 'No vocabularies were found.');
+  }
+
+  /**
+   * Deleting a vocabulary.
+   */
+  function testTaxonomyAdminDeletingVocabulary() {
+    // Create a vocabulary.
+    $edit = array(
+      'name' => $this->randomName(),
+      'machine_name' => drupal_strtolower($this->randomName()),
+    );
+    $this->drupalPost('admin/structure/taxonomy/add', $edit, t('Save'));
+    $this->assertText(t('Created new vocabulary'), 'New vocabulary was created.');
+
+    // Check the created vocabulary.
+    $vocabularies = taxonomy_get_vocabularies();
+    $vocabularies_keys = array_keys($vocabularies);
+    $vid = $vocabularies[end($vocabularies_keys)]->vid;
+    entity_get_controller('taxonomy_vocabulary')->resetCache();
+    $vocabulary = taxonomy_vocabulary_load($vid);
+    $this->assertTrue($vocabulary, 'Vocabulary found in database.');
+
+    // Delete the vocabulary.
+    $edit = array();
+    $this->drupalPost('admin/structure/taxonomy/' . $vocabulary->machine_name . '/edit', $edit, t('Delete'));
+    $this->assertRaw(t('Are you sure you want to delete the vocabulary %name?', array('%name' => $vocabulary->name)), '[confirm deletion] Asks for confirmation.');
+    $this->assertText(t('Deleting a vocabulary will delete all the terms in it. This action cannot be undone.'), '[confirm deletion] Inform that all terms will be deleted.');
+
+    // Confirm deletion.
+    $this->drupalPost(NULL, NULL, t('Delete'));
+    $this->assertRaw(t('Deleted vocabulary %name.', array('%name' => $vocabulary->name)), 'Vocabulary deleted.');
+    entity_get_controller('taxonomy_vocabulary')->resetCache();
+    $this->assertFalse(taxonomy_vocabulary_load($vid), 'Vocabulary is not found in the database.');
+  }
+
+}
+
+/**
+ * Tests for taxonomy vocabulary functions.
+ */
+class TaxonomyVocabularyTestCase extends TaxonomyWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Taxonomy vocabularies',
+      'description' => 'Test loading, saving and deleting vocabularies.',
+      'group' => 'Taxonomy',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('taxonomy', 'field_test');
+    $admin_user = $this->drupalCreateUser(array('create article content', 'administer taxonomy'));
+    $this->drupalLogin($admin_user);
+    $this->vocabulary = $this->createVocabulary();
+  }
+
+  /**
+   * Ensure that when an invalid vocabulary vid is loaded, it is possible
+   * to load the same vid successfully if it subsequently becomes valid.
+   */
+  function testTaxonomyVocabularyLoadReturnFalse() {
+    // Load a vocabulary that doesn't exist.
+    $vocabularies = taxonomy_get_vocabularies();
+    $vid = count($vocabularies) + 1;
+    $vocabulary = taxonomy_vocabulary_load($vid);
+    // This should not return an object because no such vocabulary exists.
+    $this->assertTrue(empty($vocabulary), 'No object loaded.');
+
+    // Create a new vocabulary.
+    $this->createVocabulary();
+    // Load the vocabulary with the same $vid from earlier.
+    // This should return a vocabulary object since it now matches a real vid.
+    $vocabulary = taxonomy_vocabulary_load($vid);
+    $this->assertTrue(!empty($vocabulary) && is_object($vocabulary), 'Vocabulary is an object.');
+    $this->assertEqual($vocabulary->vid, $vid, 'Valid vocabulary vid is the same as our previously invalid one.');
+  }
+
+  /**
+   * Test deleting a taxonomy that contains terms.
+   */
+  function testTaxonomyVocabularyDeleteWithTerms() {
+    // Delete any existing vocabularies.
+    foreach (taxonomy_get_vocabularies() as $vocabulary) {
+      taxonomy_vocabulary_delete($vocabulary->vid);
+    }
+
+    // Assert that there are no terms left.
+    $this->assertEqual(0, db_query('SELECT COUNT(*) FROM {taxonomy_term_data}')->fetchField());
+
+    // Create a new vocabulary and add a few terms to it.
+    $vocabulary = $this->createVocabulary();
+    $terms = array();
+    for ($i = 0; $i < 5; $i++) {
+      $terms[$i] = $this->createTerm($vocabulary);
+    }
+
+    // Set up hierarchy. term 2 is a child of 1 and 4 a child of 1 and 2.
+    $terms[2]->parent = array($terms[1]->tid);
+    taxonomy_term_save($terms[2]);
+    $terms[4]->parent = array($terms[1]->tid, $terms[2]->tid);
+    taxonomy_term_save($terms[4]);
+
+    // Assert that there are now 5 terms.
+    $this->assertEqual(5, db_query('SELECT COUNT(*) FROM {taxonomy_term_data}')->fetchField());
+
+    taxonomy_vocabulary_delete($vocabulary->vid);
+
+    // Assert that there are no terms left.
+    $this->assertEqual(0, db_query('SELECT COUNT(*) FROM {taxonomy_term_data}')->fetchField());
+  }
+
+  /**
+   * Ensure that the vocabulary static reset works correctly.
+   */
+  function testTaxonomyVocabularyLoadStaticReset() {
+    $original_vocabulary = taxonomy_vocabulary_load($this->vocabulary->vid);
+    $this->assertTrue(is_object($original_vocabulary), 'Vocabulary loaded successfully.');
+    $this->assertEqual($this->vocabulary->name, $original_vocabulary->name, 'Vocabulary loaded successfully.');
+
+    // Change the name and description.
+    $vocabulary = $original_vocabulary;
+    $vocabulary->name = $this->randomName();
+    $vocabulary->description = $this->randomName();
+    taxonomy_vocabulary_save($vocabulary);
+
+    // Load the vocabulary.
+    $new_vocabulary = taxonomy_vocabulary_load($original_vocabulary->vid);
+    $this->assertEqual($new_vocabulary->name, $vocabulary->name);
+    $this->assertEqual($new_vocabulary->name, $vocabulary->name);
+
+    // Delete the vocabulary.
+    taxonomy_vocabulary_delete($this->vocabulary->vid);
+    $vocabularies = taxonomy_get_vocabularies();
+    $this->assertTrue(!isset($vocabularies[$this->vocabulary->vid]), 'The vocabulary was deleted.');
+  }
+
+  /**
+   * Tests for loading multiple vocabularies.
+   */
+  function testTaxonomyVocabularyLoadMultiple() {
+
+    // Delete any existing vocabularies.
+    foreach (taxonomy_get_vocabularies() as $vocabulary) {
+      taxonomy_vocabulary_delete($vocabulary->vid);
+    }
+
+    // Create some vocabularies and assign weights.
+    $vocabulary1 = $this->createVocabulary();
+    $vocabulary1->weight = 0;
+    taxonomy_vocabulary_save($vocabulary1);
+    $vocabulary2 = $this->createVocabulary();
+    $vocabulary2->weight = 1;
+    taxonomy_vocabulary_save($vocabulary2);
+    $vocabulary3 = $this->createVocabulary();
+    $vocabulary3->weight = 2;
+    taxonomy_vocabulary_save($vocabulary3);
+
+    // Fetch the names for all vocabularies, confirm that they are keyed by
+    // machine name.
+    $names = taxonomy_vocabulary_get_names();
+    $this->assertEqual($names[$vocabulary1->machine_name]->name, $vocabulary1->name, 'Vocabulary 1 name found.');
+
+    // Fetch all of the vocabularies using taxonomy_get_vocabularies().
+    // Confirm that the vocabularies are ordered by weight.
+    $vocabularies = taxonomy_get_vocabularies();
+    $this->assertEqual(array_shift($vocabularies)->vid, $vocabulary1->vid, 'Vocabulary was found in the vocabularies array.');
+    $this->assertEqual(array_shift($vocabularies)->vid, $vocabulary2->vid, 'Vocabulary was found in the vocabularies array.');
+    $this->assertEqual(array_shift($vocabularies)->vid, $vocabulary3->vid, 'Vocabulary was found in the vocabularies array.');
+
+    // Fetch the vocabularies with taxonomy_vocabulary_load_multiple(), specifying IDs.
+    // Ensure they are returned in the same order as the original array.
+    $vocabularies = taxonomy_vocabulary_load_multiple(array($vocabulary3->vid, $vocabulary2->vid, $vocabulary1->vid));
+    $this->assertEqual(array_shift($vocabularies)->vid, $vocabulary3->vid, 'Vocabulary loaded successfully by ID.');
+    $this->assertEqual(array_shift($vocabularies)->vid, $vocabulary2->vid, 'Vocabulary loaded successfully by ID.');
+    $this->assertEqual(array_shift($vocabularies)->vid, $vocabulary1->vid, 'Vocabulary loaded successfully by ID.');
+
+    // Fetch vocabulary 1 by name.
+    $vocabulary = current(taxonomy_vocabulary_load_multiple(array(), array('name' => $vocabulary1->name)));
+    $this->assertEqual($vocabulary->vid, $vocabulary1->vid, 'Vocabulary loaded successfully by name.');
+
+    // Fetch vocabulary 1 by name and ID.
+    $this->assertEqual(current(taxonomy_vocabulary_load_multiple(array($vocabulary1->vid), array('name' => $vocabulary1->name)))->vid, $vocabulary1->vid, 'Vocabulary loaded successfully by name and ID.');
+  }
+
+  /**
+   * Tests that machine name changes are properly reflected.
+   */
+  function testTaxonomyVocabularyChangeMachineName() {
+    // Add a field instance to the vocabulary.
+    $field = array(
+      'field_name' => 'field_test',
+      'type' => 'test_field',
+    );
+    field_create_field($field);
+    $instance = array(
+      'field_name' => 'field_test',
+      'entity_type' => 'taxonomy_term',
+      'bundle' => $this->vocabulary->machine_name,
+    );
+    field_create_instance($instance);
+
+    // Change the machine name.
+    $new_name = drupal_strtolower($this->randomName());
+    $this->vocabulary->machine_name = $new_name;
+    taxonomy_vocabulary_save($this->vocabulary);
+
+    // Check that the field instance is still attached to the vocabulary.
+    $this->assertTrue(field_info_instance('taxonomy_term', 'field_test', $new_name), 'The bundle name was updated correctly.');
+  }
+
+  /**
+   * Test uninstall and reinstall of the taxonomy module.
+   */
+  function testUninstallReinstall() {
+    // Fields and field instances attached to taxonomy term bundles should be
+    // removed when the module is uninstalled.
+    $this->field_name = drupal_strtolower($this->randomName() . '_field_name');
+    $this->field = array('field_name' => $this->field_name, 'type' => 'text', 'cardinality' => 4);
+    $this->field = field_create_field($this->field);
+    $this->instance = array(
+      'field_name' => $this->field_name,
+      'entity_type' => 'taxonomy_term',
+      'bundle' => $this->vocabulary->machine_name,
+      'label' => $this->randomName() . '_label',
+    );
+    field_create_instance($this->instance);
+
+    module_disable(array('taxonomy'));
+    require_once DRUPAL_ROOT . '/includes/install.inc';
+    drupal_uninstall_modules(array('taxonomy'));
+    module_enable(array('taxonomy'));
+
+    // Now create a vocabulary with the same name. All field instances
+    // connected to this vocabulary name should have been removed when the
+    // module was uninstalled. Creating a new field with the same name and
+    // an instance of this field on the same bundle name should be successful.
+    unset($this->vocabulary->vid);
+    taxonomy_vocabulary_save($this->vocabulary);
+    unset($this->field['id']);
+    field_create_field($this->field);
+    field_create_instance($this->instance);
+  }
+
+}
+
+/**
+ * Unit tests for taxonomy term functions.
+ */
+class TaxonomyTermFunctionTestCase extends TaxonomyWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Taxonomy term unit tests',
+      'description' => 'Unit tests for taxonomy term functions.',
+      'group' => 'Taxonomy',
+    );
+  }
+
+  function testTermDelete() {
+    $vocabulary = $this->createVocabulary();
+    $valid_term = $this->createTerm($vocabulary);
+    // Delete a valid term.
+    taxonomy_term_delete($valid_term->tid);
+    $terms = taxonomy_term_load_multiple(array(), array('vid' => $vocabulary->vid));
+    $this->assertTrue(empty($terms), 'Vocabulary is empty after deletion.');
+
+    // Delete an invalid term. Should not throw any notices.
+    taxonomy_term_delete(42);
+  }
+
+  /**
+   * Test a taxonomy with terms that have multiple parents of different depths.
+   */
+  function testTaxonomyVocabularyTree() {
+    // Create a new vocabulary with 6 terms.
+    $vocabulary = $this->createVocabulary();
+    $term = array();
+    for ($i = 0; $i < 6; $i++) {
+      $term[$i] = $this->createTerm($vocabulary);
+    }
+
+    // $term[2] is a child of 1 and 5.
+    $term[2]->parent = array($term[1]->tid, $term[5]->tid);
+    taxonomy_term_save($term[2]);
+    // $term[3] is a child of 2.
+    $term[3]->parent = array($term[2]->tid);
+    taxonomy_term_save($term[3]);
+    // $term[5] is a child of 4.
+    $term[5]->parent = array($term[4]->tid);
+    taxonomy_term_save($term[5]);
+
+    /**
+     * Expected tree:
+     * term[0] | depth: 0
+     * term[1] | depth: 0
+     * -- term[2] | depth: 1
+     * ---- term[3] | depth: 2
+     * term[4] | depth: 0
+     * -- term[5] | depth: 1
+     * ---- term[2] | depth: 2
+     * ------ term[3] | depth: 3
+     */
+    // Count $term[1] parents with $max_depth = 1.
+    $tree = taxonomy_get_tree($vocabulary->vid, $term[1]->tid, 1);
+    $this->assertEqual(1, count($tree), 'We have one parent with depth 1.');
+
+    // Count all vocabulary tree elements.
+    $tree = taxonomy_get_tree($vocabulary->vid);
+    $this->assertEqual(8, count($tree), 'We have all vocabulary tree elements.');
+
+    // Count elements in every tree depth.
+    foreach ($tree as $element) {
+      if (!isset($depth_count[$element->depth])) {
+        $depth_count[$element->depth] = 0;
+      }
+      $depth_count[$element->depth]++;
+    }
+    $this->assertEqual(3, $depth_count[0], 'Three elements in taxonomy tree depth 0.');
+    $this->assertEqual(2, $depth_count[1], 'Two elements in taxonomy tree depth 1.');
+    $this->assertEqual(2, $depth_count[2], 'Two elements in taxonomy tree depth 2.');
+    $this->assertEqual(1, $depth_count[3], 'One element in taxonomy tree depth 3.');
+  }
+
+}
+
+/**
+ * Test for legacy node bug.
+ */
+class TaxonomyLegacyTestCase extends TaxonomyWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Test for legacy node bug.',
+      'description' => 'Posts an article with a taxonomy term and a date prior to 1970.',
+      'group' => 'Taxonomy',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('taxonomy');
+    $this->admin_user = $this->drupalCreateUser(array('administer taxonomy', 'administer nodes', 'bypass node access'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Test taxonomy functionality with nodes prior to 1970.
+   */
+  function testTaxonomyLegacyNode() {
+    // Posts an article with a taxonomy term and a date prior to 1970.
+    $langcode = LANGUAGE_NONE;
+    $edit = array();
+    $edit['title'] = $this->randomName();
+    $edit['date'] = '1969-01-01 00:00:00 -0500';
+    $edit["body[$langcode][0][value]"] = $this->randomName();
+    $edit["field_tags[$langcode]"] = $this->randomName();
+    $this->drupalPost('node/add/article', $edit, t('Save'));
+    // Checks that the node has been saved.
+    $node = $this->drupalGetNodeByTitle($edit['title']);
+    $this->assertEqual($node->created, strtotime($edit['date']), 'Legacy node was saved with the right date.');
+  }
+
+}
+
+/**
+ * Tests for taxonomy term functions.
+ */
+class TaxonomyTermTestCase extends TaxonomyWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Taxonomy term functions and forms.',
+      'description' => 'Test load, save and delete for taxonomy terms.',
+      'group' => 'Taxonomy',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('taxonomy');
+    $this->admin_user = $this->drupalCreateUser(array('administer taxonomy', 'bypass node access'));
+    $this->drupalLogin($this->admin_user);
+    $this->vocabulary = $this->createVocabulary();
+
+    $field = array(
+      'field_name' => 'taxonomy_' . $this->vocabulary->machine_name,
+      'type' => 'taxonomy_term_reference',
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'settings' => array(
+        'allowed_values' => array(
+          array(
+            'vocabulary' => $this->vocabulary->machine_name,
+            'parent' => 0,
+          ),
+        ),
+      ),
+    );
+    field_create_field($field);
+
+    $this->instance = array(
+      'field_name' => 'taxonomy_' . $this->vocabulary->machine_name,
+      'bundle' => 'article',
+      'entity_type' => 'node',
+      'widget' => array(
+        'type' => 'options_select',
+      ),
+      'display' => array(
+        'default' => array(
+          'type' => 'taxonomy_term_reference_link',
+        ),
+      ),
+    );
+    field_create_instance($this->instance);
+  }
+
+  /**
+   * Test terms in a single and multiple hierarchy.
+   */
+  function testTaxonomyTermHierarchy() {
+    // Create two taxonomy terms.
+    $term1 = $this->createTerm($this->vocabulary);
+    $term2 = $this->createTerm($this->vocabulary);
+
+    // Check that hierarchy is flat.
+    $vocabulary = taxonomy_vocabulary_load($this->vocabulary->vid);
+    $this->assertEqual(0, $vocabulary->hierarchy, 'Vocabulary is flat.');
+
+    // Edit $term2, setting $term1 as parent.
+    $edit = array();
+    $edit['parent[]'] = array($term1->tid);
+    $this->drupalPost('taxonomy/term/' . $term2->tid . '/edit', $edit, t('Save'));
+
+    // Check the hierarchy.
+    $children = taxonomy_get_children($term1->tid);
+    $parents = taxonomy_get_parents($term2->tid);
+    $this->assertTrue(isset($children[$term2->tid]), 'Child found correctly.');
+    $this->assertTrue(isset($parents[$term1->tid]), 'Parent found correctly.');
+
+    // Load and save a term, confirming that parents are still set.
+    $term = taxonomy_term_load($term2->tid);
+    taxonomy_term_save($term);
+    $parents = taxonomy_get_parents($term2->tid);
+    $this->assertTrue(isset($parents[$term1->tid]), 'Parent found correctly.');
+
+    // Create a third term and save this as a parent of term2.
+    $term3 = $this->createTerm($this->vocabulary);
+    $term2->parent = array($term1->tid, $term3->tid);
+    taxonomy_term_save($term2);
+    $parents = taxonomy_get_parents($term2->tid);
+    $this->assertTrue(isset($parents[$term1->tid]) && isset($parents[$term3->tid]), 'Both parents found successfully.');
+  }
+
+  /**
+   * Test that hook_node_$op implementations work correctly.
+   *
+   * Save & edit a node and assert that taxonomy terms are saved/loaded properly.
+   */
+  function testTaxonomyNode() {
+    // Create two taxonomy terms.
+    $term1 = $this->createTerm($this->vocabulary);
+    $term2 = $this->createTerm($this->vocabulary);
+
+    // Post an article.
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = $this->randomName();
+    $edit["body[$langcode][0][value]"] = $this->randomName();
+    $edit[$this->instance['field_name'] . '[' . $langcode . '][]'] = $term1->tid;
+    $this->drupalPost('node/add/article', $edit, t('Save'));
+
+    // Check that the term is displayed when the node is viewed.
+    $node = $this->drupalGetNodeByTitle($edit["title"]);
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($term1->name, 'Term is displayed when viewing the node.');
+
+    // Edit the node with a different term.
+    $edit[$this->instance['field_name'] . '[' . $langcode . '][]'] = $term2->tid;
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertText($term2->name, 'Term is displayed when viewing the node.');
+
+    // Preview the node.
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Preview'));
+    $this->assertNoUniqueText($term2->name, 'Term is displayed when previewing the node.');
+    $this->drupalPost(NULL, NULL, t('Preview'));
+    $this->assertNoUniqueText($term2->name, 'Term is displayed when previewing the node again.');
+  }
+
+  /**
+   * Test term creation with a free-tagging vocabulary from the node form.
+   */
+  function testNodeTermCreationAndDeletion() {
+    // Enable tags in the vocabulary.
+    $instance = $this->instance;
+    $instance['widget'] = array('type' => 'taxonomy_autocomplete');
+    $instance['bundle'] = 'page';
+    field_create_instance($instance);
+    $terms = array(
+      'term1' => $this->randomName(),
+      'term2' => $this->randomName() . ', ' . $this->randomName(),
+      'term3' => $this->randomName(),
+    );
+
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = $this->randomName();
+    $edit["body[$langcode][0][value]"] = $this->randomName();
+    // Insert the terms in a comma separated list. Vocabulary 1 is a
+    // free-tagging field created by the default profile.
+    $edit[$instance['field_name'] . "[$langcode]"] = drupal_implode_tags($terms);
+
+    // Preview and verify the terms appear but are not created.
+    $this->drupalPost('node/add/page', $edit, t('Preview'));
+    foreach ($terms as $term) {
+      $this->assertText($term, 'The term appears on the node preview.');
+    }
+    $tree = taxonomy_get_tree($this->vocabulary->vid);
+    $this->assertTrue(empty($tree), 'The terms are not created on preview.');
+
+    // taxonomy.module does not maintain its static caches.
+    drupal_static_reset();
+
+    // Save, creating the terms.
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->assertRaw(t('@type %title has been created.', array('@type' => t('Basic page'), '%title' => $edit["title"])), 'The node was created successfully.');
+    foreach ($terms as $term) {
+      $this->assertText($term, 'The term was saved and appears on the node page.');
+    }
+
+    // Get the created terms.
+    $term_objects = array();
+    foreach ($terms as $key => $term) {
+      $term_objects[$key] = taxonomy_get_term_by_name($term);
+      $term_objects[$key] = reset($term_objects[$key]);
+    }
+
+    // Delete term 1.
+    $this->drupalPost('taxonomy/term/' . $term_objects['term1']->tid . '/edit', array(), t('Delete'));
+    $this->drupalPost(NULL, NULL, t('Delete'));
+    $term_names = array($term_objects['term2']->name, $term_objects['term3']->name);
+
+    // Get the node.
+    $node = $this->drupalGetNodeByTitle($edit["title"]);
+    $this->drupalGet('node/' . $node->nid);
+
+    foreach ($term_names as $term_name) {
+      $this->assertText($term_name, format_string('The term %name appears on the node page after one term %deleted was deleted', array('%name' => $term_name, '%deleted' => $term_objects['term1']->name)));
+    }
+    $this->assertNoText($term_objects['term1']->name, format_string('The deleted term %name does not appear on the node page.', array('%name' => $term_objects['term1']->name)));
+
+    // Test autocomplete on term 2, which contains a comma.
+    // The term will be quoted, and the " will be encoded in unicode (\u0022).
+    $input = substr($term_objects['term2']->name, 0, 3);
+    $this->drupalGet('taxonomy/autocomplete/taxonomy_' . $this->vocabulary->machine_name . '/' . $input);
+    $this->assertRaw('{"\u0022' . $term_objects['term2']->name . '\u0022":"' . $term_objects['term2']->name . '"}', format_string('Autocomplete returns term %term_name after typing the first 3 letters.', array('%term_name' => $term_objects['term2']->name)));
+
+    // Test autocomplete on term 3 - it is alphanumeric only, so no extra
+    // quoting.
+    $input = substr($term_objects['term3']->name, 0, 3);
+    $this->drupalGet('taxonomy/autocomplete/taxonomy_' . $this->vocabulary->machine_name . '/' . $input);
+    $this->assertRaw('{"' . $term_objects['term3']->name . '":"' . $term_objects['term3']->name . '"}', format_string('Autocomplete returns term %term_name after typing the first 3 letters.', array('%term_name' => $term_objects['term3']->name)));
+
+    // Test taxonomy autocomplete with a nonexistent field.
+    $field_name = $this->randomName();
+    $tag = $this->randomName();
+    $message = t("Taxonomy field @field_name not found.", array('@field_name' => $field_name));
+    $this->assertFalse(field_info_field($field_name), format_string('Field %field_name does not exist.', array('%field_name' => $field_name)));
+    $this->drupalGet('taxonomy/autocomplete/' . $field_name . '/' . $tag);
+    $this->assertRaw($message, 'Autocomplete returns correct error message when the taxonomy field does not exist.');
+
+    // Test the autocomplete path without passing a field_name and terms.
+    // This should not trigger a PHP notice.
+    $field_name = '';
+    $message = t("Taxonomy field @field_name not found.", array('@field_name' => $field_name));
+    $this->drupalGet('taxonomy/autocomplete');
+    $this->assertRaw($message, 'Autocomplete returns correct error message when no taxonomy field is given.');
+  }
+
+  /**
+   * Tests term autocompletion edge cases with slashes in the names.
+   */
+  function testTermAutocompletion() {
+    // Add a term with a slash in the name.
+    $first_term = $this->createTerm($this->vocabulary);
+    $first_term->name = '10/16/2011';
+    taxonomy_term_save($first_term);
+    // Add another term that differs after the slash character.
+    $second_term = $this->createTerm($this->vocabulary);
+    $second_term->name = '10/17/2011';
+    taxonomy_term_save($second_term);
+    // Add another term that has both a comma and a slash character.
+    $third_term = $this->createTerm($this->vocabulary);
+    $third_term->name = 'term with, a comma and / a slash';
+    taxonomy_term_save($third_term);
+
+    // Try to autocomplete a term name that matches both terms.
+    // We should get both term in a json encoded string.
+    $input = '10/';
+    $path = 'taxonomy/autocomplete/taxonomy_';
+    $path .= $this->vocabulary->machine_name . '/' . $input;
+    // The result order is not guaranteed, so check each term separately.
+    $url = url($path, array('absolute' => TRUE));
+    $result = drupal_http_request($url);
+    $data = drupal_json_decode($result->data);
+    $this->assertEqual($data[$first_term->name], check_plain($first_term->name), 'Autocomplete returned the first matching term.');
+    $this->assertEqual($data[$second_term->name], check_plain($second_term->name), 'Autocomplete returned the second matching term.');
+
+    // Try to autocomplete a term name that matches first term.
+    // We should only get the first term in a json encoded string.
+    $input = '10/16';
+    $url = 'taxonomy/autocomplete/taxonomy_';
+    $url .= $this->vocabulary->machine_name . '/' . $input;
+    $this->drupalGet($url);
+    $target = array($first_term->name => check_plain($first_term->name));
+    $this->assertRaw(drupal_json_encode($target), 'Autocomplete returns only the expected matching term.');
+
+    // Try to autocomplete a term name with both a comma and a slash.
+    $input = '"term with, comma and / a';
+    $url = 'taxonomy/autocomplete/taxonomy_';
+    $url .= $this->vocabulary->machine_name . '/' . $input;
+    $this->drupalGet($url);
+    $n = $third_term->name;
+    // Term names containing commas or quotes must be wrapped in quotes.
+    if (strpos($third_term->name, ',') !== FALSE || strpos($third_term->name, '"') !== FALSE) {
+      $n = '"' . str_replace('"', '""', $third_term->name) . '"';
+    }
+    $target = array($n => check_plain($third_term->name));
+    $this->assertRaw(drupal_json_encode($target), 'Autocomplete returns a term containing a comma and a slash.');
+  }
+
+  /**
+   * Save, edit and delete a term using the user interface.
+   */
+  function testTermInterface() {
+    $edit = array(
+      'name' => $this->randomName(12),
+      'description[value]' => $this->randomName(100),
+    );
+    // Explicitly set the parents field to 'root', to ensure that
+    // taxonomy_form_term_submit() handles the invalid term ID correctly.
+    $edit['parent[]'] = array(0);
+
+    // Create the term to edit.
+    $this->drupalPost('admin/structure/taxonomy/' . $this->vocabulary->machine_name . '/add', $edit, t('Save'));
+
+    $terms = taxonomy_get_term_by_name($edit['name']);
+    $term = reset($terms);
+    $this->assertNotNull($term, 'Term found in database.');
+
+    // Submitting a term takes us to the add page; we need the List page.
+    $this->drupalGet('admin/structure/taxonomy/' . $this->vocabulary->machine_name);
+
+    // Test edit link as accessed from Taxonomy administration pages.
+    // Because Simpletest creates its own database when running tests, we know
+    // the first edit link found on the listing page is to our term.
+    $this->clickLink(t('edit'));
+
+    $this->assertRaw($edit['name'], 'The randomly generated term name is present.');
+    $this->assertText($edit['description[value]'], 'The randomly generated term description is present.');
+
+    $edit = array(
+      'name' => $this->randomName(14),
+      'description[value]' => $this->randomName(102),
+    );
+
+    // Edit the term.
+    $this->drupalPost('taxonomy/term/' . $term->tid . '/edit', $edit, t('Save'));
+
+    // Check that the term is still present at admin UI after edit.
+    $this->drupalGet('admin/structure/taxonomy/' . $this->vocabulary->machine_name);
+    $this->assertText($edit['name'], 'The randomly generated term name is present.');
+    $this->assertLink(t('edit'));
+
+    // View the term and check that it is correct.
+    $this->drupalGet('taxonomy/term/' . $term->tid);
+    $this->assertText($edit['name'], 'The randomly generated term name is present.');
+    $this->assertText($edit['description[value]'], 'The randomly generated term description is present.');
+
+    // Did this page request display a 'term-listing-heading'?
+    $this->assertPattern('|class="taxonomy-term-description"|', 'Term page displayed the term description element.');
+    // Check that it does NOT show a description when description is blank.
+    $term->description = '';
+    taxonomy_term_save($term);
+    $this->drupalGet('taxonomy/term/' . $term->tid);
+    $this->assertNoPattern('|class="taxonomy-term-description"|', 'Term page did not display the term description when description was blank.');
+
+    // Check that the term feed page is working.
+    $this->drupalGet('taxonomy/term/' . $term->tid . '/feed');
+
+    // Check that the term edit page does not try to interpret additional path
+    // components as arguments for taxonomy_form_term().
+    $this->drupalGet('taxonomy/term/' . $term->tid . '/edit/' . $this->randomName());
+
+    // Delete the term.
+    $this->drupalPost('taxonomy/term/' . $term->tid . '/edit', array(), t('Delete'));
+    $this->drupalPost(NULL, NULL, t('Delete'));
+
+    // Assert that the term no longer exists.
+    $this->drupalGet('taxonomy/term/' . $term->tid);
+    $this->assertResponse(404, 'The taxonomy term page was not found.');
+  }
+
+  /**
+   * Save, edit and delete a term using the user interface.
+   */
+  function testTermReorder() {
+    $this->createTerm($this->vocabulary);
+    $this->createTerm($this->vocabulary);
+    $this->createTerm($this->vocabulary);
+
+    // Fetch the created terms in the default alphabetical order, i.e. term1
+    // precedes term2 alphabetically, and term2 precedes term3.
+    drupal_static_reset('taxonomy_get_tree');
+    drupal_static_reset('taxonomy_get_treeparent');
+    drupal_static_reset('taxonomy_get_treeterms');
+    list($term1, $term2, $term3) = taxonomy_get_tree($this->vocabulary->vid);
+
+    $this->drupalGet('admin/structure/taxonomy/' . $this->vocabulary->machine_name);
+
+    // Each term has four hidden fields, "tid:1:0[tid]", "tid:1:0[parent]",
+    // "tid:1:0[depth]", and "tid:1:0[weight]". Change the order to term2,
+    // term3, term1 by setting weight property, make term3 a child of term2 by
+    // setting the parent and depth properties, and update all hidden fields.
+    $edit = array(
+      'tid:' . $term2->tid . ':0[tid]' => $term2->tid,
+      'tid:' . $term2->tid . ':0[parent]' => 0,
+      'tid:' . $term2->tid . ':0[depth]' => 0,
+      'tid:' . $term2->tid . ':0[weight]' => 0,
+      'tid:' . $term3->tid . ':0[tid]' => $term3->tid,
+      'tid:' . $term3->tid . ':0[parent]' => $term2->tid,
+      'tid:' . $term3->tid . ':0[depth]' => 1,
+      'tid:' . $term3->tid . ':0[weight]' => 1,
+      'tid:' . $term1->tid . ':0[tid]' => $term1->tid,
+      'tid:' . $term1->tid . ':0[parent]' => 0,
+      'tid:' . $term1->tid . ':0[depth]' => 0,
+      'tid:' . $term1->tid . ':0[weight]' => 2,
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+
+    drupal_static_reset('taxonomy_get_tree');
+    drupal_static_reset('taxonomy_get_treeparent');
+    drupal_static_reset('taxonomy_get_treeterms');
+    $terms = taxonomy_get_tree($this->vocabulary->vid);
+    $this->assertEqual($terms[0]->tid, $term2->tid, 'Term 2 was moved above term 1.');
+    $this->assertEqual($terms[1]->parents, array($term2->tid), 'Term 3 was made a child of term 2.');
+    $this->assertEqual($terms[2]->tid, $term1->tid, 'Term 1 was moved below term 2.');
+
+    $this->drupalPost('admin/structure/taxonomy/' . $this->vocabulary->machine_name, array(), t('Reset to alphabetical'));
+    // Submit confirmation form.
+    $this->drupalPost(NULL, array(), t('Reset to alphabetical'));
+
+    drupal_static_reset('taxonomy_get_tree');
+    drupal_static_reset('taxonomy_get_treeparent');
+    drupal_static_reset('taxonomy_get_treeterms');
+    $terms = taxonomy_get_tree($this->vocabulary->vid);
+    $this->assertEqual($terms[0]->tid, $term1->tid, 'Term 1 was moved to back above term 2.');
+    $this->assertEqual($terms[1]->tid, $term2->tid, 'Term 2 was moved to back below term 1.');
+    $this->assertEqual($terms[2]->tid, $term3->tid, 'Term 3 is still below term 2.');
+    $this->assertEqual($terms[2]->parents, array($term2->tid), 'Term 3 is still a child of term 2.' . var_export($terms[1]->tid, 1));
+  }
+
+  /**
+   * Test saving a term with multiple parents through the UI.
+   */
+  function testTermMultipleParentsInterface() {
+    // Add a new term to the vocabulary so that we can have multiple parents.
+    $parent = $this->createTerm($this->vocabulary);
+
+    // Add a new term with multiple parents.
+    $edit = array(
+      'name' => $this->randomName(12),
+      'description[value]' => $this->randomName(100),
+      'parent[]' => array(0, $parent->tid),
+    );
+    // Save the new term.
+    $this->drupalPost('admin/structure/taxonomy/' . $this->vocabulary->machine_name . '/add', $edit, t('Save'));
+
+    // Check that the term was successfully created.
+    $terms = taxonomy_get_term_by_name($edit['name']);
+    $term = reset($terms);
+    $this->assertNotNull($term, 'Term found in database.');
+    $this->assertEqual($edit['name'], $term->name, 'Term name was successfully saved.');
+    $this->assertEqual($edit['description[value]'], $term->description, 'Term description was successfully saved.');
+    // Check that the parent tid is still there. The other parent (<root>) is
+    // not added by taxonomy_get_parents().
+    $parents = taxonomy_get_parents($term->tid);
+    $parent = reset($parents);
+    $this->assertEqual($edit['parent[]'][1], $parent->tid, 'Term parents were successfully saved.');
+  }
+
+  /**
+   * Test taxonomy_get_term_by_name().
+   */
+  function testTaxonomyGetTermByName() {
+    $term = $this->createTerm($this->vocabulary);
+
+    // Load the term with the exact name.
+    $terms = taxonomy_get_term_by_name($term->name);
+    $this->assertTrue(isset($terms[$term->tid]), 'Term loaded using exact name.');
+
+    // Load the term with space concatenated.
+    $terms  = taxonomy_get_term_by_name('  ' . $term->name . '   ');
+    $this->assertTrue(isset($terms[$term->tid]), 'Term loaded with extra whitespace.');
+
+    // Load the term with name uppercased.
+    $terms = taxonomy_get_term_by_name(strtoupper($term->name));
+    $this->assertTrue(isset($terms[$term->tid]), 'Term loaded with uppercased name.');
+
+    // Load the term with name lowercased.
+    $terms = taxonomy_get_term_by_name(strtolower($term->name));
+    $this->assertTrue(isset($terms[$term->tid]), 'Term loaded with lowercased name.');
+
+    // Try to load an invalid term name.
+    $terms = taxonomy_get_term_by_name('Banana');
+    $this->assertFalse($terms);
+
+    // Try to load the term using a substring of the name.
+    $terms = taxonomy_get_term_by_name(drupal_substr($term->name, 2));
+    $this->assertFalse($terms);
+
+    // Create a new term in a different vocabulary with the same name.
+    $new_vocabulary = $this->createVocabulary();
+    $new_term = new stdClass();
+    $new_term->name = $term->name;
+    $new_term->vid = $new_vocabulary->vid;
+    taxonomy_term_save($new_term);
+
+    // Load multiple terms with the same name.
+    $terms = taxonomy_get_term_by_name($term->name);
+    $this->assertEqual(count($terms), 2, 'Two terms loaded with the same name.');
+
+    // Load single term when restricted to one vocabulary.
+    $terms = taxonomy_get_term_by_name($term->name, $this->vocabulary->machine_name);
+    $this->assertEqual(count($terms), 1, 'One term loaded when restricted by vocabulary.');
+    $this->assertTrue(isset($terms[$term->tid]), 'Term loaded using exact name and vocabulary machine name.');
+
+    // Create a new term with another name.
+    $term2 = $this->createTerm($this->vocabulary);
+
+    // Try to load a term by name that doesn't exist in this vocabulary but
+    // exists in another vocabulary.
+    $terms = taxonomy_get_term_by_name($term2->name, $new_vocabulary->machine_name);
+    $this->assertFalse($terms, 'Invalid term name restricted by vocabulary machine name not loaded.');
+
+    // Try to load terms filtering by a non-existing vocabulary.
+    $terms = taxonomy_get_term_by_name($term2->name, 'non_existing_vocabulary');
+    $this->assertEqual(count($terms), 0, 'No terms loaded when restricted by a non-existing vocabulary.');
+  }
+
+}
+
+/**
+ * Tests the rendering of term reference fields in RSS feeds.
+ */
+class TaxonomyRSSTestCase extends TaxonomyWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Taxonomy RSS Content.',
+      'description' => 'Ensure that data added as terms appears in RSS feeds if "RSS Category" format is selected.',
+      'group' => 'Taxonomy',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('taxonomy');
+    $this->admin_user = $this->drupalCreateUser(array('administer taxonomy', 'bypass node access', 'administer content types'));
+    $this->drupalLogin($this->admin_user);
+    $this->vocabulary = $this->createVocabulary();
+
+    $field = array(
+      'field_name' => 'taxonomy_' . $this->vocabulary->machine_name,
+      'type' => 'taxonomy_term_reference',
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'settings' => array(
+        'allowed_values' => array(
+          array(
+            'vocabulary' => $this->vocabulary->machine_name,
+            'parent' => 0,
+          ),
+        ),
+      ),
+    );
+    field_create_field($field);
+
+    $this->instance = array(
+      'field_name' => 'taxonomy_' . $this->vocabulary->machine_name,
+      'bundle' => 'article',
+      'entity_type' => 'node',
+      'widget' => array(
+        'type' => 'options_select',
+      ),
+      'display' => array(
+        'default' => array(
+          'type' => 'taxonomy_term_reference_link',
+        ),
+      ),
+    );
+    field_create_instance($this->instance);
+  }
+
+  /**
+   * Tests that terms added to nodes are displayed in core RSS feed.
+   *
+   * Create a node and assert that taxonomy terms appear in rss.xml.
+   */
+  function testTaxonomyRSS() {
+    // Create two taxonomy terms.
+    $term1 = $this->createTerm($this->vocabulary);
+
+    // RSS display must be added manually.
+    $this->drupalGet("admin/structure/types/manage/article/display");
+    $edit = array(
+      "view_modes_custom[rss]" => '1',
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+
+    // Change the format to 'RSS category'.
+    $this->drupalGet("admin/structure/types/manage/article/display/rss");
+    $edit = array(
+      "fields[taxonomy_" . $this->vocabulary->machine_name . "][type]" => 'taxonomy_term_reference_rss_category',
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+
+    // Post an article.
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = $this->randomName();
+    $edit[$this->instance['field_name'] . '[' . $langcode . '][]'] = $term1->tid;
+    $this->drupalPost('node/add/article', $edit, t('Save'));
+
+    // Check that the term is displayed when the RSS feed is viewed.
+    $this->drupalGet('rss.xml');
+    $test_element = array(
+      'key' => 'category',
+      'value' => $term1->name,
+      'attributes' => array(
+        'domain' => url('taxonomy/term/' . $term1->tid, array('absolute' => TRUE)),
+      ),
+    );
+    $this->assertRaw(format_xml_elements(array($test_element)), 'Term is displayed when viewing the rss feed.');
+  }
+
+}
+
+/**
+ * Tests the hook implementations that maintain the taxonomy index.
+ */
+class TaxonomyTermIndexTestCase extends TaxonomyWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Taxonomy term index',
+      'description' => 'Tests the hook implementations that maintain the taxonomy index.',
+      'group' => 'Taxonomy',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('taxonomy');
+
+    // Create an administrative user.
+    $this->admin_user = $this->drupalCreateUser(array('administer taxonomy', 'bypass node access'));
+    $this->drupalLogin($this->admin_user);
+
+    // Create a vocabulary and add two term reference fields to article nodes.
+    $this->vocabulary = $this->createVocabulary();
+
+    $this->field_name_1 = drupal_strtolower($this->randomName());
+    $this->field_1 = array(
+      'field_name' => $this->field_name_1,
+      'type' => 'taxonomy_term_reference',
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'settings' => array(
+        'allowed_values' => array(
+          array(
+            'vocabulary' => $this->vocabulary->machine_name,
+            'parent' => 0,
+          ),
+        ),
+      ),
+    );
+    field_create_field($this->field_1);
+    $this->instance_1 = array(
+      'field_name' => $this->field_name_1,
+      'bundle' => 'article',
+      'entity_type' => 'node',
+      'widget' => array(
+        'type' => 'options_select',
+      ),
+      'display' => array(
+        'default' => array(
+          'type' => 'taxonomy_term_reference_link',
+        ),
+      ),
+    );
+    field_create_instance($this->instance_1);
+
+    $this->field_name_2 = drupal_strtolower($this->randomName());
+    $this->field_2 = array(
+      'field_name' => $this->field_name_2,
+      'type' => 'taxonomy_term_reference',
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'settings' => array(
+        'allowed_values' => array(
+          array(
+            'vocabulary' => $this->vocabulary->machine_name,
+            'parent' => 0,
+          ),
+        ),
+      ),
+    );
+    field_create_field($this->field_2);
+    $this->instance_2 = array(
+      'field_name' => $this->field_name_2,
+      'bundle' => 'article',
+      'entity_type' => 'node',
+      'widget' => array(
+        'type' => 'options_select',
+      ),
+      'display' => array(
+        'default' => array(
+          'type' => 'taxonomy_term_reference_link',
+        ),
+      ),
+    );
+    field_create_instance($this->instance_2);
+  }
+
+  /**
+   * Tests that the taxonomy index is maintained properly.
+   */
+  function testTaxonomyIndex() {
+    // Create terms in the vocabulary.
+    $term_1 = $this->createTerm($this->vocabulary);
+    $term_2 = $this->createTerm($this->vocabulary);
+
+    // Post an article.
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = $this->randomName();
+    $edit["body[$langcode][0][value]"] = $this->randomName();
+    $edit["{$this->field_name_1}[$langcode][]"] = $term_1->tid;
+    $edit["{$this->field_name_2}[$langcode][]"] = $term_1->tid;
+    $this->drupalPost('node/add/article', $edit, t('Save'));
+
+    // Check that the term is indexed, and only once.
+    $node = $this->drupalGetNodeByTitle($edit["title"]);
+    $index_count = db_query('SELECT COUNT(*) FROM {taxonomy_index} WHERE nid = :nid AND tid = :tid', array(
+      ':nid' => $node->nid,
+      ':tid' => $term_1->tid,
+    ))->fetchField();
+    $this->assertEqual(1, $index_count, 'Term 1 is indexed once.');
+
+    // Update the article to change one term.
+    $edit["{$this->field_name_1}[$langcode][]"] = $term_2->tid;
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    // Check that both terms are indexed.
+    $index_count = db_query('SELECT COUNT(*) FROM {taxonomy_index} WHERE nid = :nid AND tid = :tid', array(
+      ':nid' => $node->nid,
+      ':tid' => $term_1->tid,
+    ))->fetchField();
+    $this->assertEqual(1, $index_count, 'Term 1 is indexed.');
+    $index_count = db_query('SELECT COUNT(*) FROM {taxonomy_index} WHERE nid = :nid AND tid = :tid', array(
+      ':nid' => $node->nid,
+      ':tid' => $term_2->tid,
+    ))->fetchField();
+    $this->assertEqual(1, $index_count, 'Term 2 is indexed.');
+
+    // Update the article to change another term.
+    $edit["{$this->field_name_2}[$langcode][]"] = $term_2->tid;
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    // Check that only one term is indexed.
+    $index_count = db_query('SELECT COUNT(*) FROM {taxonomy_index} WHERE nid = :nid AND tid = :tid', array(
+      ':nid' => $node->nid,
+      ':tid' => $term_1->tid,
+    ))->fetchField();
+    $this->assertEqual(0, $index_count, 'Term 1 is not indexed.');
+    $index_count = db_query('SELECT COUNT(*) FROM {taxonomy_index} WHERE nid = :nid AND tid = :tid', array(
+      ':nid' => $node->nid,
+      ':tid' => $term_2->tid,
+    ))->fetchField();
+    $this->assertEqual(1, $index_count, 'Term 2 is indexed once.');
+
+    // Redo the above tests without interface.
+    $update_node = array(
+      'nid' => $node->nid,
+      'vid' => $node->vid,
+      'uid' => $node->uid,
+      'type' => $node->type,
+      'title' => $this->randomName(),
+    );
+
+    // Update the article with no term changed.
+    $updated_node = (object) $update_node;
+    node_save($updated_node);
+
+    // Check that the index was not changed.
+    $index_count = db_query('SELECT COUNT(*) FROM {taxonomy_index} WHERE nid = :nid AND tid = :tid', array(
+      ':nid' => $node->nid,
+      ':tid' => $term_1->tid,
+    ))->fetchField();
+    $this->assertEqual(0, $index_count, 'Term 1 is not indexed.');
+    $index_count = db_query('SELECT COUNT(*) FROM {taxonomy_index} WHERE nid = :nid AND tid = :tid', array(
+      ':nid' => $node->nid,
+      ':tid' => $term_2->tid,
+    ))->fetchField();
+    $this->assertEqual(1, $index_count, 'Term 2 is indexed once.');
+
+    // Update the article to change one term.
+    $update_node[$this->field_name_1][$langcode] = array(array('tid' => $term_1->tid));
+    $updated_node = (object) $update_node;
+    node_save($updated_node);
+
+    // Check that both terms are indexed.
+    $index_count = db_query('SELECT COUNT(*) FROM {taxonomy_index} WHERE nid = :nid AND tid = :tid', array(
+      ':nid' => $node->nid,
+      ':tid' => $term_1->tid,
+    ))->fetchField();
+    $this->assertEqual(1, $index_count, 'Term 1 is indexed.');
+    $index_count = db_query('SELECT COUNT(*) FROM {taxonomy_index} WHERE nid = :nid AND tid = :tid', array(
+      ':nid' => $node->nid,
+      ':tid' => $term_2->tid,
+    ))->fetchField();
+    $this->assertEqual(1, $index_count, 'Term 2 is indexed.');
+
+    // Update the article to change another term.
+    $update_node[$this->field_name_2][$langcode] = array(array('tid' => $term_1->tid));
+    $updated_node = (object) $update_node;
+    node_save($updated_node);
+
+    // Check that only one term is indexed.
+    $index_count = db_query('SELECT COUNT(*) FROM {taxonomy_index} WHERE nid = :nid AND tid = :tid', array(
+      ':nid' => $node->nid,
+      ':tid' => $term_1->tid,
+    ))->fetchField();
+    $this->assertEqual(1, $index_count, 'Term 1 is indexed once.');
+    $index_count = db_query('SELECT COUNT(*) FROM {taxonomy_index} WHERE nid = :nid AND tid = :tid', array(
+      ':nid' => $node->nid,
+      ':tid' => $term_2->tid,
+    ))->fetchField();
+    $this->assertEqual(0, $index_count, 'Term 2 is not indexed.');
+  }
+
+  /**
+   * Tests that there is a link to the parent term on the child term page.
+   */
+  function testTaxonomyTermHierarchyBreadcrumbs() {
+    // Create two taxonomy terms and set term2 as the parent of term1.
+    $term1 = $this->createTerm($this->vocabulary);
+    $term2 = $this->createTerm($this->vocabulary);
+    $term1->parent = array($term2->tid);
+    taxonomy_term_save($term1);
+
+    // Verify that the page breadcrumbs include a link to the parent term.
+    $this->drupalGet('taxonomy/term/' . $term1->tid);
+    $this->assertRaw(l($term2->name, 'taxonomy/term/' . $term2->tid), 'Parent term link is displayed when viewing the node.');
+  }
+
+}
+
+/**
+ * Test the taxonomy_term_load_multiple() function.
+ */
+class TaxonomyLoadMultipleTestCase extends TaxonomyWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Taxonomy term multiple loading',
+      'description' => 'Test the loading of multiple taxonomy terms at once',
+      'group' => 'Taxonomy',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $this->taxonomy_admin = $this->drupalCreateUser(array('administer taxonomy'));
+    $this->drupalLogin($this->taxonomy_admin);
+  }
+
+  /**
+   * Create a vocabulary and some taxonomy terms, ensuring they're loaded
+   * correctly using taxonomy_term_load_multiple().
+   */
+  function testTaxonomyTermMultipleLoad() {
+    // Create a vocabulary.
+    $vocabulary = $this->createVocabulary();
+
+    // Create five terms in the vocabulary.
+    $i = 0;
+    while ($i < 5) {
+      $i++;
+      $this->createTerm($vocabulary);
+    }
+    // Load the terms from the vocabulary.
+    $terms = taxonomy_term_load_multiple(NULL, array('vid' => $vocabulary->vid));
+    $count = count($terms);
+    $this->assertEqual($count, 5, format_string('Correct number of terms were loaded. !count terms.', array('!count' => $count)));
+
+    // Load the same terms again by tid.
+    $terms2 = taxonomy_term_load_multiple(array_keys($terms));
+    $this->assertEqual($count, count($terms2), 'Five terms were loaded by tid.');
+    $this->assertEqual($terms, $terms2, 'Both arrays contain the same terms.');
+
+    // Load the terms by tid, with a condition on vid.
+    $terms3 = taxonomy_term_load_multiple(array_keys($terms2), array('vid' => $vocabulary->vid));
+    $this->assertEqual($terms2, $terms3);
+
+    // Remove one term from the array, then delete it.
+    $deleted = array_shift($terms3);
+    taxonomy_term_delete($deleted->tid);
+    $deleted_term = taxonomy_term_load($deleted->tid);
+    $this->assertFalse($deleted_term);
+
+    // Load terms from the vocabulary by vid.
+    $terms4 = taxonomy_term_load_multiple(NULL, array('vid' => $vocabulary->vid));
+    $this->assertEqual(count($terms4), 4, 'Correct number of terms were loaded.');
+    $this->assertFalse(isset($terms4[$deleted->tid]));
+
+    // Create a single term and load it by name.
+    $term = $this->createTerm($vocabulary);
+    $loaded_terms = taxonomy_term_load_multiple(array(), array('name' => $term->name));
+    $this->assertEqual(count($loaded_terms), 1, 'One term was loaded.');
+    $loaded_term = reset($loaded_terms);
+    $this->assertEqual($term->tid, $loaded_term->tid, 'Term loaded by name successfully.');
+  }
+}
+
+/**
+ * Tests for taxonomy hook invocation.
+ */
+class TaxonomyHooksTestCase extends TaxonomyWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Taxonomy term hooks',
+      'description' => 'Hooks for taxonomy term load/save/delete.',
+      'group' => 'Taxonomy',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('taxonomy', 'taxonomy_test');
+    module_load_include('inc', 'taxonomy', 'taxonomy.pages');
+    $taxonomy_admin = $this->drupalCreateUser(array('administer taxonomy'));
+    $this->drupalLogin($taxonomy_admin);
+  }
+
+  /**
+   * Test that hooks are run correctly on creating, editing, viewing,
+   * and deleting a term.
+   *
+   * @see taxonomy_test.module
+   */
+  function testTaxonomyTermHooks() {
+    $vocabulary = $this->createVocabulary();
+
+    // Create a term with one antonym.
+    $edit = array(
+      'name' => $this->randomName(),
+      'antonym' => 'Long',
+    );
+    $this->drupalPost('admin/structure/taxonomy/' . $vocabulary->machine_name . '/add', $edit, t('Save'));
+    $terms = taxonomy_get_term_by_name($edit['name']);
+    $term = reset($terms);
+    $this->assertEqual($term->antonym, $edit['antonym'], 'Antonym was loaded into the term object.');
+
+    // Update the term with a different antonym.
+    $edit = array(
+      'name' => $this->randomName(),
+      'antonym' => 'Short',
+    );
+    $this->drupalPost('taxonomy/term/' . $term->tid . '/edit', $edit, t('Save'));
+    taxonomy_terms_static_reset();
+    $term = taxonomy_term_load($term->tid);
+    $this->assertEqual($edit['antonym'], $term->antonym, 'Antonym was successfully edited.');
+
+    // View the term and ensure that hook_taxonomy_term_view() and
+    // hook_entity_view() are invoked.
+    $term = taxonomy_term_load($term->tid);
+    $term_build = taxonomy_term_page($term);
+    $this->assertFalse(empty($term_build['term_heading']['term']['taxonomy_test_term_view_check']), 'hook_taxonomy_term_view() was invoked when viewing the term.');
+    $this->assertFalse(empty($term_build['term_heading']['term']['taxonomy_test_entity_view_check']), 'hook_entity_view() was invoked when viewing the term.');
+
+    // Delete the term.
+    taxonomy_term_delete($term->tid);
+    $antonym = db_query('SELECT tid FROM {taxonomy_term_antonym} WHERE tid = :tid', array(':tid' => $term->tid))->fetchField();
+    $this->assertFalse($antonym, 'The antonym were deleted from the database.');
+  }
+
+}
+
+/**
+ * Tests for taxonomy term field and formatter.
+ */
+class TaxonomyTermFieldTestCase extends TaxonomyWebTestCase {
+
+  protected $instance;
+  protected $vocabulary;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Taxonomy term reference field',
+      'description' => 'Test the creation of term fields.',
+      'group' => 'Taxonomy',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('field_test');
+
+    $web_user = $this->drupalCreateUser(array('access field_test content', 'administer field_test content', 'administer taxonomy'));
+    $this->drupalLogin($web_user);
+    $this->vocabulary = $this->createVocabulary();
+
+    // Setup a field and instance.
+    $this->field_name = drupal_strtolower($this->randomName());
+    $this->field = array(
+      'field_name' => $this->field_name,
+      'type' => 'taxonomy_term_reference',
+      'settings' => array(
+        'allowed_values' => array(
+          array(
+            'vocabulary' => $this->vocabulary->machine_name,
+            'parent' => '0',
+          ),
+        ),
+      )
+    );
+    field_create_field($this->field);
+    $this->instance = array(
+      'field_name' => $this->field_name,
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'widget' => array(
+        'type' => 'options_select',
+      ),
+      'display' => array(
+        'full' => array(
+          'type' => 'taxonomy_term_reference_link',
+        ),
+      ),
+    );
+    field_create_instance($this->instance);
+  }
+
+  /**
+   * Test term field validation.
+   */
+  function testTaxonomyTermFieldValidation() {
+    // Test valid and invalid values with field_attach_validate().
+    $langcode = LANGUAGE_NONE;
+    $entity = field_test_create_stub_entity();
+    $term = $this->createTerm($this->vocabulary);
+    $entity->{$this->field_name}[$langcode][0]['tid'] = $term->tid;
+    try {
+      field_attach_validate('test_entity', $entity);
+      $this->pass('Correct term does not cause validation error.');
+    }
+    catch (FieldValidationException $e) {
+      $this->fail('Correct term does not cause validation error.');
+    }
+
+    $entity = field_test_create_stub_entity();
+    $bad_term = $this->createTerm($this->createVocabulary());
+    $entity->{$this->field_name}[$langcode][0]['tid'] = $bad_term->tid;
+    try {
+      field_attach_validate('test_entity', $entity);
+      $this->fail('Wrong term causes validation error.');
+    }
+    catch (FieldValidationException $e) {
+      $this->pass('Wrong term causes validation error.');
+    }
+  }
+
+  /**
+   * Test widgets.
+   */
+  function testTaxonomyTermFieldWidgets() {
+    // Create a term in the vocabulary.
+    $term = $this->createTerm($this->vocabulary);
+
+    // Display creation form.
+    $langcode = LANGUAGE_NONE;
+    $this->drupalGet('test-entity/add/test-bundle');
+    $this->assertFieldByName("{$this->field_name}[$langcode]", '', 'Widget is displayed.');
+
+    // Submit with some value.
+    $edit = array(
+      "{$this->field_name}[$langcode]" => array($term->tid),
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);
+    $id = $match[1];
+    $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), 'Entity was created.');
+
+    // Display the object.
+    $entity = field_test_entity_test_load($id);
+    $entities = array($id => $entity);
+    field_attach_prepare_view('test_entity', $entities, 'full');
+    $entity->content = field_attach_view('test_entity', $entity, 'full');
+    $this->content = drupal_render($entity->content);
+    $this->assertText($term->name, 'Term name is displayed.');
+
+    // Delete the vocabulary and verify that the widget is gone.
+    taxonomy_vocabulary_delete($this->vocabulary->vid);
+    $this->drupalGet('test-entity/add/test-bundle');
+    $this->assertNoFieldByName("{$this->field_name}[$langcode]", '', 'Widget is not displayed.');
+  }
+
+  /**
+   * Tests that vocabulary machine name changes are mirrored in field definitions.
+   */
+  function testTaxonomyTermFieldChangeMachineName() {
+    // Add several entries in the 'allowed_values' setting, to make sure that
+    // they all get updated.
+    $this->field['settings']['allowed_values'] = array(
+      array(
+        'vocabulary' => $this->vocabulary->machine_name,
+        'parent' => '0',
+      ),
+      array(
+        'vocabulary' => $this->vocabulary->machine_name,
+        'parent' => '0',
+      ),
+      array(
+        'vocabulary' => 'foo',
+        'parent' => '0',
+      ),
+    );
+    field_update_field($this->field);
+    // Change the machine name.
+    $old_name = $this->vocabulary->machine_name;
+    $new_name = drupal_strtolower($this->randomName());
+    $this->vocabulary->machine_name = $new_name;
+    taxonomy_vocabulary_save($this->vocabulary);
+
+    // Check that entity bundles are properly updated.
+    $info = entity_get_info('taxonomy_term');
+    $this->assertFalse(isset($info['bundles'][$old_name]), 'The old bundle name does not appear in entity_get_info().');
+    $this->assertTrue(isset($info['bundles'][$new_name]), 'The new bundle name appears in entity_get_info().');
+
+    // Check that the field instance is still attached to the vocabulary.
+    $field = field_info_field($this->field_name);
+    $allowed_values = $field['settings']['allowed_values'];
+    $this->assertEqual($allowed_values[0]['vocabulary'], $new_name, 'Index 0: Machine name was updated correctly.');
+    $this->assertEqual($allowed_values[1]['vocabulary'], $new_name, 'Index 1: Machine name was updated correctly.');
+    $this->assertEqual($allowed_values[2]['vocabulary'], 'foo', 'Index 2: Machine name was left untouched.');
+  }
+
+}
+
+/**
+ * Tests a taxonomy term reference field that allows multiple vocabularies.
+ */
+class TaxonomyTermFieldMultipleVocabularyTestCase extends TaxonomyWebTestCase {
+
+  protected $instance;
+  protected $vocabulary1;
+  protected $vocabulary2;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Multiple vocabulary term reference field',
+      'description' => 'Tests term reference fields that allow multiple vocabularies.',
+      'group' => 'Taxonomy',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('field_test');
+
+    $web_user = $this->drupalCreateUser(array('access field_test content', 'administer field_test content', 'administer taxonomy'));
+    $this->drupalLogin($web_user);
+    $this->vocabulary1 = $this->createVocabulary();
+    $this->vocabulary2 = $this->createVocabulary();
+
+    // Set up a field and instance.
+    $this->field_name = drupal_strtolower($this->randomName());
+    $this->field = array(
+      'field_name' => $this->field_name,
+      'type' => 'taxonomy_term_reference',
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'settings' => array(
+        'allowed_values' => array(
+          array(
+            'vocabulary' => $this->vocabulary1->machine_name,
+            'parent' => '0',
+          ),
+          array(
+            'vocabulary' => $this->vocabulary2->machine_name,
+            'parent' => '0',
+          ),
+        ),
+      )
+    );
+    field_create_field($this->field);
+    $this->instance = array(
+      'field_name' => $this->field_name,
+      'entity_type' => 'test_entity',
+      'bundle' => 'test_bundle',
+      'widget' => array(
+        'type' => 'options_select',
+      ),
+      'display' => array(
+        'full' => array(
+          'type' => 'taxonomy_term_reference_link',
+        ),
+      ),
+    );
+    field_create_instance($this->instance);
+  }
+
+  /**
+   * Tests term reference field and widget with multiple vocabularies.
+   */
+  function testTaxonomyTermFieldMultipleVocabularies() {
+    // Create a term in each vocabulary.
+    $term1 = $this->createTerm($this->vocabulary1);
+    $term2 = $this->createTerm($this->vocabulary2);
+
+    // Submit an entity with both terms.
+    $langcode = LANGUAGE_NONE;
+    $this->drupalGet('test-entity/add/test-bundle');
+    $this->assertFieldByName("{$this->field_name}[$langcode][]", '', 'Widget is displayed.');
+    $edit = array(
+      "{$this->field_name}[$langcode][]" => array($term1->tid, $term2->tid),
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+    preg_match('|test-entity/manage/(\d+)/edit|', $this->url, $match);
+    $id = $match[1];
+    $this->assertRaw(t('test_entity @id has been created.', array('@id' => $id)), 'Entity was created.');
+
+    // Render the entity.
+    $entity = field_test_entity_test_load($id);
+    $entities = array($id => $entity);
+    field_attach_prepare_view('test_entity', $entities, 'full');
+    $entity->content = field_attach_view('test_entity', $entity, 'full');
+    $this->content = drupal_render($entity->content);
+    $this->assertText($term1->name, 'Term 1 name is displayed.');
+    $this->assertText($term2->name, 'Term 2 name is displayed.');
+
+    // Delete vocabulary 2.
+    taxonomy_vocabulary_delete($this->vocabulary2->vid);
+
+    // Re-render the content.
+    $entity = field_test_entity_test_load($id);
+    $entities = array($id => $entity);
+    field_attach_prepare_view('test_entity', $entities, 'full');
+    $entity->content = field_attach_view('test_entity', $entity, 'full');
+    $this->plainTextContent = FALSE;
+    $this->content = drupal_render($entity->content);
+
+    // Term 1 should still be displayed; term 2 should not be.
+    $this->assertText($term1->name, 'Term 1 name is displayed.');
+    $this->assertNoText($term2->name, 'Term 2 name is not displayed.');
+
+    // Verify that field and instance settings are correct.
+    $field_info = field_info_field($this->field_name);
+    $this->assertEqual(sizeof($field_info['settings']['allowed_values']), 1, 'Only one vocabulary is allowed for the field.');
+
+    // The widget should still be displayed.
+    $this->drupalGet('test-entity/add/test-bundle');
+    $this->assertFieldByName("{$this->field_name}[$langcode][]", '', 'Widget is still displayed.');
+
+    // Term 1 should still pass validation.
+    $edit = array(
+      "{$this->field_name}[$langcode][]" => array($term1->tid),
+    );
+    $this->drupalPost(NULL, $edit, t('Save'));
+  }
+
+}
+
+/**
+ * Test taxonomy token replacement in strings.
+ */
+class TaxonomyTokenReplaceTestCase extends TaxonomyWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Taxonomy token replacement',
+      'description' => 'Generates text using placeholders for dummy content to check taxonomy token replacement.',
+      'group' => 'Taxonomy',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $this->admin_user = $this->drupalCreateUser(array('administer taxonomy', 'bypass node access'));
+    $this->drupalLogin($this->admin_user);
+    $this->vocabulary = $this->createVocabulary();
+    $this->langcode = LANGUAGE_NONE;
+
+    $field = array(
+      'field_name' => 'taxonomy_' . $this->vocabulary->machine_name,
+      'type' => 'taxonomy_term_reference',
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+      'settings' => array(
+        'allowed_values' => array(
+          array(
+            'vocabulary' => $this->vocabulary->machine_name,
+            'parent' => 0,
+          ),
+        ),
+      ),
+    );
+    field_create_field($field);
+
+    $this->instance = array(
+      'field_name' => 'taxonomy_' . $this->vocabulary->machine_name,
+      'bundle' => 'article',
+      'entity_type' => 'node',
+      'widget' => array(
+        'type' => 'options_select',
+      ),
+      'display' => array(
+        'default' => array(
+          'type' => 'taxonomy_term_reference_link',
+        ),
+      ),
+    );
+    field_create_instance($this->instance);
+  }
+
+  /**
+   * Creates some terms and a node, then tests the tokens generated from them.
+   */
+  function testTaxonomyTokenReplacement() {
+    global $language;
+
+    // Create two taxonomy terms.
+    $term1 = $this->createTerm($this->vocabulary);
+    $term2 = $this->createTerm($this->vocabulary);
+
+    // Edit $term2, setting $term1 as parent.
+    $edit = array();
+    $edit['name'] = '<blink>Blinking Text</blink>';
+    $edit['parent[]'] = array($term1->tid);
+    $this->drupalPost('taxonomy/term/' . $term2->tid . '/edit', $edit, t('Save'));
+
+    // Create node with term2.
+    $edit = array();
+    $node = $this->drupalCreateNode(array('type' => 'article'));
+    $edit[$this->instance['field_name'] . '[' . $this->langcode . '][]'] = $term2->tid;
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+
+    // Generate and test sanitized tokens for term1.
+    $tests = array();
+    $tests['[term:tid]'] = $term1->tid;
+    $tests['[term:name]'] = check_plain($term1->name);
+    $tests['[term:description]'] = check_markup($term1->description, $term1->format);
+    $tests['[term:url]'] = url('taxonomy/term/' . $term1->tid, array('absolute' => TRUE));
+    $tests['[term:node-count]'] = 0;
+    $tests['[term:parent:name]'] = '[term:parent:name]';
+    $tests['[term:vocabulary:name]'] = check_plain($this->vocabulary->name);
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('term' => $term1), array('language' => $language));
+      $this->assertEqual($output, $expected, format_string('Sanitized taxonomy term token %token replaced.', array('%token' => $input)));
+    }
+
+    // Generate and test sanitized tokens for term2.
+    $tests = array();
+    $tests['[term:tid]'] = $term2->tid;
+    $tests['[term:name]'] = check_plain($term2->name);
+    $tests['[term:description]'] = check_markup($term2->description, $term2->format);
+    $tests['[term:url]'] = url('taxonomy/term/' . $term2->tid, array('absolute' => TRUE));
+    $tests['[term:node-count]'] = 1;
+    $tests['[term:parent:name]'] = check_plain($term1->name);
+    $tests['[term:parent:url]'] = url('taxonomy/term/' . $term1->tid, array('absolute' => TRUE));
+    $tests['[term:parent:parent:name]'] = '[term:parent:parent:name]';
+    $tests['[term:vocabulary:name]'] = check_plain($this->vocabulary->name);
+
+    // Test to make sure that we generated something for each token.
+    $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('term' => $term2), array('language' => $language));
+      $this->assertEqual($output, $expected, format_string('Sanitized taxonomy term token %token replaced.', array('%token' => $input)));
+    }
+
+    // Generate and test unsanitized tokens.
+    $tests['[term:name]'] = $term2->name;
+    $tests['[term:description]'] = $term2->description;
+    $tests['[term:parent:name]'] = $term1->name;
+    $tests['[term:vocabulary:name]'] = $this->vocabulary->name;
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('term' => $term2), array('language' => $language, 'sanitize' => FALSE));
+      $this->assertEqual($output, $expected, format_string('Unsanitized taxonomy term token %token replaced.', array('%token' => $input)));
+    }
+
+    // Generate and test sanitized tokens.
+    $tests = array();
+    $tests['[vocabulary:vid]'] = $this->vocabulary->vid;
+    $tests['[vocabulary:name]'] = check_plain($this->vocabulary->name);
+    $tests['[vocabulary:description]'] = filter_xss($this->vocabulary->description);
+    $tests['[vocabulary:node-count]'] = 1;
+    $tests['[vocabulary:term-count]'] = 2;
+
+    // Test to make sure that we generated something for each token.
+    $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('vocabulary' => $this->vocabulary), array('language' => $language));
+      $this->assertEqual($output, $expected, format_string('Sanitized taxonomy vocabulary token %token replaced.', array('%token' => $input)));
+    }
+
+    // Generate and test unsanitized tokens.
+    $tests['[vocabulary:name]'] = $this->vocabulary->name;
+    $tests['[vocabulary:description]'] = $this->vocabulary->description;
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('vocabulary' => $this->vocabulary), array('language' => $language, 'sanitize' => FALSE));
+      $this->assertEqual($output, $expected, format_string('Unsanitized taxonomy vocabulary token %token replaced.', array('%token' => $input)));
+    }
+  }
+
+}
+
+/**
+ * Tests for verifying that taxonomy pages use the correct theme.
+ */
+class TaxonomyThemeTestCase extends TaxonomyWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Taxonomy theme switching',
+      'description' => 'Verifies that various taxonomy pages use the expected theme.',
+      'group' => 'Taxonomy',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Make sure we are using distinct default and administrative themes for
+    // the duration of these tests.
+    variable_set('theme_default', 'bartik');
+    variable_set('admin_theme', 'seven');
+
+    // Create and log in as a user who has permission to add and edit taxonomy
+    // terms and view the administrative theme.
+    $admin_user = $this->drupalCreateUser(array('administer taxonomy', 'view the administration theme'));
+    $this->drupalLogin($admin_user);
+  }
+
+  /**
+   * Test the theme used when adding, viewing and editing taxonomy terms.
+   */
+  function testTaxonomyTermThemes() {
+    // Adding a term to a vocabulary is considered an administrative action and
+    // should use the administrative theme.
+    $vocabulary = $this->createVocabulary();
+    $this->drupalGet('admin/structure/taxonomy/' . $vocabulary->machine_name . '/add');
+    $this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page for adding a taxonomy term.");
+
+    // Viewing a taxonomy term should use the default theme.
+    $term = $this->createTerm($vocabulary);
+    $this->drupalGet('taxonomy/term/' . $term->tid);
+    $this->assertRaw('bartik/css/style.css', "The default theme's CSS appears on the page for viewing a taxonomy term.");
+
+    // Editing a taxonomy term should use the same theme as adding one.
+    $this->drupalGet('taxonomy/term/' . $term->tid . '/edit');
+    $this->assertRaw('seven/style.css', "The administrative theme's CSS appears on the page for editing a taxonomy term.");
+  }
+
+}
+
+/**
+ * Tests the functionality of EntityFieldQuery for taxonomy entities.
+ */
+class TaxonomyEFQTestCase extends TaxonomyWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Taxonomy EntityFieldQuery',
+      'description' => 'Verifies operation of a taxonomy-based EntityFieldQuery.',
+      'group' => 'Taxonomy',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $this->admin_user = $this->drupalCreateUser(array('administer taxonomy'));
+    $this->drupalLogin($this->admin_user);
+    $this->vocabulary = $this->createVocabulary();
+  }
+
+  /**
+   * Tests that a basic taxonomy EntityFieldQuery works.
+   */
+  function testTaxonomyEFQ() {
+    $terms = array();
+    for ($i = 0; $i < 5; $i++) {
+      $term = $this->createTerm($this->vocabulary);
+      $terms[$term->tid] = $term;
+    }
+    $query = new EntityFieldQuery();
+    $query->entityCondition('entity_type', 'taxonomy_term');
+    $result = $query->execute();
+    $result = $result['taxonomy_term'];
+    asort($result);
+    $this->assertEqual(array_keys($terms), array_keys($result), 'Taxonomy terms were retrieved by EntityFieldQuery.');
+
+    // Create a second vocabulary and five more terms.
+    $vocabulary2 = $this->createVocabulary();
+    $terms2 = array();
+    for ($i = 0; $i < 5; $i++) {
+      $term = $this->createTerm($vocabulary2);
+      $terms2[$term->tid] = $term;
+    }
+
+    $query = new EntityFieldQuery();
+    $query->entityCondition('entity_type', 'taxonomy_term');
+    $query->entityCondition('bundle', $vocabulary2->machine_name);
+    $result = $query->execute();
+    $result = $result['taxonomy_term'];
+    asort($result);
+    $this->assertEqual(array_keys($terms2), array_keys($result), format_string('Taxonomy terms from the %name vocabulary were retrieved by EntityFieldQuery.', array('%name' => $vocabulary2->name)));
+  }
+
+}
diff --git a/htmltest/modules/taxonomy/taxonomy.tokens.inc b/htmltest/modules/taxonomy/taxonomy.tokens.inc
new file mode 100644
index 00000000..f8ae4576
--- /dev/null
+++ b/htmltest/modules/taxonomy/taxonomy.tokens.inc
@@ -0,0 +1,189 @@
+<?php
+
+/**
+ * @file
+ * Builds placeholder replacement tokens for taxonomy terms and vocabularies.
+ */
+
+/**
+ * Implements hook_token_info().
+ */
+function taxonomy_token_info() {
+  $types['term'] = array(
+    'name' => t("Taxonomy terms"),
+    'description' => t("Tokens related to taxonomy terms."),
+    'needs-data' => 'term',
+  );
+  $types['vocabulary'] = array(
+    'name' => t("Vocabularies"),
+    'description' => t("Tokens related to taxonomy vocabularies."),
+    'needs-data' => 'vocabulary',
+  );
+
+  // Taxonomy term related variables.
+  $term['tid'] = array(
+    'name' => t("Term ID"),
+    'description' => t("The unique ID of the taxonomy term."),
+  );
+  $term['name'] = array(
+    'name' => t("Name"),
+    'description' => t("The name of the taxonomy term."),
+  );
+  $term['description'] = array(
+    'name' => t("Description"),
+    'description' => t("The optional description of the taxonomy term."),
+  );
+  $term['node-count'] = array(
+    'name' => t("Node count"),
+    'description' => t("The number of nodes tagged with the taxonomy term."),
+  );
+  $term['url'] = array(
+    'name' => t("URL"),
+    'description' => t("The URL of the taxonomy term."),
+  );
+
+  // Taxonomy vocabulary related variables.
+  $vocabulary['vid'] = array(
+    'name' => t("Vocabulary ID"),
+    'description' => t("The unique ID of the taxonomy vocabulary."),
+  );
+  $vocabulary['name'] = array(
+    'name' => t("Name"),
+    'description' => t("The name of the taxonomy vocabulary."),
+  );
+  $vocabulary['description'] = array(
+    'name' => t("Description"),
+    'description' => t("The optional description of the taxonomy vocabulary."),
+  );
+  $vocabulary['node-count'] = array(
+    'name' => t("Node count"),
+    'description' => t("The number of nodes tagged with terms belonging to the taxonomy vocabulary."),
+  );
+  $vocabulary['term-count'] = array(
+    'name' => t("Term count"),
+    'description' => t("The number of terms belonging to the taxonomy vocabulary."),
+  );
+
+  // Chained tokens for taxonomies
+  $term['vocabulary'] = array(
+    'name' => t("Vocabulary"),
+    'description' => t("The vocabulary the taxonomy term belongs to."),
+    'type' => 'vocabulary',
+  );
+  $term['parent'] = array(
+    'name' => t("Parent term"),
+    'description' => t("The parent term of the taxonomy term, if one exists."),
+    'type' => 'term',
+  );
+
+  return array(
+    'types' => $types,
+    'tokens' => array(
+      'term' => $term,
+      'vocabulary' => $vocabulary,
+    ),
+  );
+}
+
+/**
+ * Implements hook_tokens().
+ */
+function taxonomy_tokens($type, $tokens, array $data = array(), array $options = array()) {
+  $replacements = array();
+  $sanitize = !empty($options['sanitize']);
+
+  if ($type == 'term' && !empty($data['term'])) {
+    $term = $data['term'];
+
+    foreach ($tokens as $name => $original) {
+      switch ($name) {
+        case 'tid':
+          $replacements[$original] = $term->tid;
+          break;
+
+        case 'name':
+          $replacements[$original] = $sanitize ? check_plain($term->name) : $term->name;
+          break;
+
+        case 'description':
+          $replacements[$original] = $sanitize ? check_markup($term->description, $term->format, '', TRUE) : $term->description;
+          break;
+
+        case 'url':
+          $uri = entity_uri('taxonomy_term', $term);
+          $replacements[$original] = url($uri['path'], array_merge($uri['options'], array('absolute' => TRUE)));
+          break;
+
+        case 'node-count':
+          $query = db_select('taxonomy_index');
+          $query->condition('tid', $term->tid);
+          $query->addTag('term_node_count');
+          $count = $query->countQuery()->execute()->fetchField();
+          $replacements[$original] = $count;
+          break;
+
+        case 'vocabulary':
+          $vocabulary = taxonomy_vocabulary_load($term->vid);
+          $replacements[$original] = check_plain($vocabulary->name);
+          break;
+
+        case 'parent':
+          if ($parents = taxonomy_get_parents($term->tid)) {
+            $parent = array_pop($parents);
+            $replacements[$original] = check_plain($parent->name);
+          }
+          break;
+      }
+    }
+
+    if ($vocabulary_tokens = token_find_with_prefix($tokens, 'vocabulary')) {
+      $vocabulary = taxonomy_vocabulary_load($term->vid);
+      $replacements += token_generate('vocabulary', $vocabulary_tokens, array('vocabulary' => $vocabulary), $options);
+    }
+
+    if (($vocabulary_tokens = token_find_with_prefix($tokens, 'parent')) && $parents = taxonomy_get_parents($term->tid)) {
+      $parent = array_pop($parents);
+      $replacements += token_generate('term', $vocabulary_tokens, array('term' => $parent), $options);
+    }
+  }
+
+  elseif ($type == 'vocabulary' && !empty($data['vocabulary'])) {
+    $vocabulary = $data['vocabulary'];
+
+    foreach ($tokens as $name => $original) {
+      switch ($name) {
+        case 'vid':
+          $replacements[$original] = $vocabulary->vid;
+          break;
+
+        case 'name':
+          $replacements[$original] = $sanitize ? check_plain($vocabulary->name) : $vocabulary->name;
+          break;
+
+        case 'description':
+          $replacements[$original] = $sanitize ? filter_xss($vocabulary->description) : $vocabulary->description;
+          break;
+
+        case 'term-count':
+          $query = db_select('taxonomy_term_data');
+          $query->condition('vid', $vocabulary->vid);
+          $query->addTag('vocabulary_term_count');
+          $count = $query->countQuery()->execute()->fetchField();
+          $replacements[$original] = $count;
+          break;
+
+        case 'node-count':
+          $query = db_select('taxonomy_index', 'ti');
+          $query->addExpression('COUNT(DISTINCT ti.nid)');
+          $query->leftJoin('taxonomy_term_data', 'td', 'ti.tid = td.tid');
+          $query->condition('td.vid', $vocabulary->vid);
+          $query->addTag('vocabulary_node_count');
+          $count = $query->execute()->fetchField();
+          $replacements[$original] = $count;
+          break;
+      }
+    }
+  }
+
+  return $replacements;
+}
diff --git a/htmltest/modules/toolbar/toolbar-rtl.css b/htmltest/modules/toolbar/toolbar-rtl.css
new file mode 100644
index 00000000..acbc98f8
--- /dev/null
+++ b/htmltest/modules/toolbar/toolbar-rtl.css
@@ -0,0 +1,41 @@
+
+#toolbar,
+#toolbar * {
+  text-align: right;
+}
+#toolbar ul li {
+  float: right;
+}
+#toolbar ul li a {
+  display: inline-block;
+  float: none;
+  zoom: 1;
+}
+#toolbar div.toolbar-menu {
+  padding: 5px 50px 5px 50px;
+}
+#toolbar-user {
+  float: left;
+}
+#toolbar ul#toolbar-user li {
+  float: none;
+  display: inline;
+}
+#toolbar-menu {
+  float: none;
+}
+#toolbar-home {
+  float: right;
+}
+#toolbar ul li.home a {
+  position: absolute;
+  right: 10px;
+}
+#toolbar div.toolbar-menu a.toggle {
+  left: 10px;
+  right: auto;
+}
+* html #toolbar {
+  left: 0;
+  padding-left: 0;
+}
diff --git a/htmltest/modules/toolbar/toolbar.css b/htmltest/modules/toolbar/toolbar.css
new file mode 100644
index 00000000..cbf3c14c
--- /dev/null
+++ b/htmltest/modules/toolbar/toolbar.css
@@ -0,0 +1,150 @@
+
+body.toolbar {
+  padding-top: 2.2em;
+}
+body.toolbar-drawer {
+  padding-top: 5.3em;
+}
+
+/**
+ * Aggressive resets so we can achieve a consistent look in hostile CSS
+ * environments.
+ */
+#toolbar,
+#toolbar * {
+  border: 0;
+  font-size: 100%;
+  line-height: inherit;
+  list-style: none;
+  margin: 0;
+  outline: 0;
+  padding: 0;
+  text-align: left; /* LTR */
+  vertical-align: baseline;
+}
+
+/**
+ * Base styles.
+ *
+ * We use a keyword for the toolbar font size to make it display consistently
+ * across different themes, while still allowing browsers to resize the text.
+ */
+#toolbar {
+  background: #666;
+  color: #ccc;
+  font: normal small "Lucida Grande", Verdana, sans-serif;
+  left: 0;
+  margin: 0 -20px;
+  padding: 0 20px;
+  position: fixed;
+  right: 0;
+  top: 0;
+  -moz-box-shadow: 0 3px 20px #000;
+  -webkit-box-shadow: 0 3px 20px #000;
+  box-shadow: 0 3px 20px #000;
+  filter: progid:DXImageTransform.Microsoft.Shadow(color=#000000, direction='180', strength='10');
+  -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(color=#000000, direction='180', strength='10')";
+  z-index: 600;
+}
+#toolbar div.collapsed {
+  display: none;
+  visibility: hidden;
+}
+#toolbar a {
+  color: #fff;
+  font-size: .846em;
+  text-decoration: none;
+}
+#toolbar ul li,
+#toolbar ul li a {
+  float: left; /* LTR */
+}
+
+/**
+ * Administration menu.
+ */
+#toolbar div.toolbar-menu {
+  background: #000;
+  line-height: 20px;
+  padding: 5px 50px 5px 10px; /* LTR */
+  position: relative;
+}
+#toolbar-home a span {
+  background: url(toolbar.png) no-repeat 0 -45px;
+  display: block;
+  height: 14px;
+  margin: 3px 0px;
+  text-indent: -9999px;
+  vertical-align: text-bottom;
+  width: 11px;
+}
+#toolbar-user {
+  float: right; /* LTR */
+}
+#toolbar-menu {
+  float: left; /* LTR */
+}
+#toolbar div.toolbar-menu a.toggle {
+  background: url(toolbar.png) 0 -20px no-repeat;
+  bottom: 0;
+  cursor: pointer;
+  height: 25px;
+  overflow: hidden;
+  position: absolute;
+  right: 10px; /* LTR */
+  text-indent: -9999px;
+  width: 25px;
+}
+#toolbar div.toolbar-menu a.toggle:focus,
+#toolbar div.toolbar-menu a.toggle:hover {
+  background-position:  -50px -20px;
+}
+#toolbar div.toolbar-menu a.toggle-active {
+  background-position:  -25px -20px;
+}
+#toolbar div.toolbar-menu a.toggle-active.toggle:focus,
+#toolbar div.toolbar-menu a.toggle-active.toggle:hover {
+  background-position:  -75px -20px;
+}
+#toolbar div.toolbar-menu ul li a {
+  padding: 0 10px;
+  -moz-border-radius: 10px;
+  -webkit-border-radius: 10px;
+  border-radius: 10px;
+}
+#toolbar div.toolbar-menu ul li a:focus,
+#toolbar div.toolbar-menu ul li a:hover,
+#toolbar div.toolbar-menu ul li a:active,
+#toolbar div.toolbar-menu ul li a.active:focus {
+  background: #444;
+}
+#toolbar div.toolbar-menu ul li a.active:hover,
+#toolbar div.toolbar-menu ul li a.active:active,
+#toolbar div.toolbar-menu ul li a.active,
+#toolbar div.toolbar-menu ul li.active-trail a {
+  background: url(toolbar.png) 0 0 repeat-x;
+  text-shadow: #333 0 1px 0;
+}
+
+/**
+ * Collapsed drawer of additional toolbar content.
+ */
+#toolbar div.toolbar-drawer {
+  position: relative;
+  padding: 0 10px;
+}
+
+/**
+ * IE 6 Fix.
+ *
+ * IE 6 shows elements with position:fixed as position:static so we replace
+ * it with position:absolute; toolbar needs its z-index to stay above overlay.
+ */
+* html #toolbar {
+  left: -20px;
+  margin: 0;
+  padding-right: 0;
+  position: absolute;
+  right: 0;
+  width: 100%;
+}
diff --git a/htmltest/modules/toolbar/toolbar.info b/htmltest/modules/toolbar/toolbar.info
new file mode 100644
index 00000000..d1fec6b1
--- /dev/null
+++ b/htmltest/modules/toolbar/toolbar.info
@@ -0,0 +1,11 @@
+name = Toolbar
+description = Provides a toolbar that shows the top-level administration menu items and links from other modules.
+core = 7.x
+package = Core
+version = VERSION
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/toolbar/toolbar.js b/htmltest/modules/toolbar/toolbar.js
new file mode 100644
index 00000000..d50f2056
--- /dev/null
+++ b/htmltest/modules/toolbar/toolbar.js
@@ -0,0 +1,111 @@
+(function ($) {
+
+Drupal.toolbar = Drupal.toolbar || {};
+
+/**
+ * Attach toggling behavior and notify the overlay of the toolbar.
+ */
+Drupal.behaviors.toolbar = {
+  attach: function(context) {
+
+    // Set the initial state of the toolbar.
+    $('#toolbar', context).once('toolbar', Drupal.toolbar.init);
+
+    // Toggling toolbar drawer.
+    $('#toolbar a.toggle', context).once('toolbar-toggle').click(function(e) {
+      Drupal.toolbar.toggle();
+      // Allow resize event handlers to recalculate sizes/positions.
+      $(window).triggerHandler('resize');
+      return false;
+    });
+  }
+};
+
+/**
+ * Retrieve last saved cookie settings and set up the initial toolbar state.
+ */
+Drupal.toolbar.init = function() {
+  // Retrieve the collapsed status from a stored cookie.
+  var collapsed = $.cookie('Drupal.toolbar.collapsed');
+
+  // Expand or collapse the toolbar based on the cookie value.
+  if (collapsed == 1) {
+    Drupal.toolbar.collapse();
+  }
+  else {
+    Drupal.toolbar.expand();
+  }
+};
+
+/**
+ * Collapse the toolbar.
+ */
+Drupal.toolbar.collapse = function() {
+  var toggle_text = Drupal.t('Show shortcuts');
+  $('#toolbar div.toolbar-drawer').addClass('collapsed');
+  $('#toolbar a.toggle')
+    .removeClass('toggle-active')
+    .attr('title',  toggle_text)
+    .html(toggle_text);
+  $('body').removeClass('toolbar-drawer').css('paddingTop', Drupal.toolbar.height());
+  $.cookie(
+    'Drupal.toolbar.collapsed',
+    1,
+    {
+      path: Drupal.settings.basePath,
+      // The cookie should "never" expire.
+      expires: 36500
+    }
+  );
+};
+
+/**
+ * Expand the toolbar.
+ */
+Drupal.toolbar.expand = function() {
+  var toggle_text = Drupal.t('Hide shortcuts');
+  $('#toolbar div.toolbar-drawer').removeClass('collapsed');
+  $('#toolbar a.toggle')
+    .addClass('toggle-active')
+    .attr('title',  toggle_text)
+    .html(toggle_text);
+  $('body').addClass('toolbar-drawer').css('paddingTop', Drupal.toolbar.height());
+  $.cookie(
+    'Drupal.toolbar.collapsed',
+    0,
+    {
+      path: Drupal.settings.basePath,
+      // The cookie should "never" expire.
+      expires: 36500
+    }
+  );
+};
+
+/**
+ * Toggle the toolbar.
+ */
+Drupal.toolbar.toggle = function() {
+  if ($('#toolbar div.toolbar-drawer').hasClass('collapsed')) {
+    Drupal.toolbar.expand();
+  }
+  else {
+    Drupal.toolbar.collapse();
+  }
+};
+
+Drupal.toolbar.height = function() {
+  var $toolbar = $('#toolbar');
+  var height = $toolbar.outerHeight();
+  // In modern browsers (including IE9), when box-shadow is defined, use the
+  // normal height.
+  var cssBoxShadowValue = $toolbar.css('box-shadow');
+  var boxShadow = (typeof cssBoxShadowValue !== 'undefined' && cssBoxShadowValue !== 'none');
+  // In IE8 and below, we use the shadow filter to apply box-shadow styles to
+  // the toolbar. It adds some extra height that we need to remove.
+  if (!boxShadow && /DXImageTransform\.Microsoft\.Shadow/.test($toolbar.css('filter'))) {
+    height -= $toolbar[0].filters.item("DXImageTransform.Microsoft.Shadow").strength;
+  }
+  return height;
+};
+
+})(jQuery);
diff --git a/htmltest/modules/toolbar/toolbar.module b/htmltest/modules/toolbar/toolbar.module
new file mode 100644
index 00000000..6d1b581d
--- /dev/null
+++ b/htmltest/modules/toolbar/toolbar.module
@@ -0,0 +1,363 @@
+<?php
+
+/**
+ * @file
+ * Administration toolbar for quick access to top level administration items.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function toolbar_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#toolbar':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Toolbar module displays links to top-level administration menu items and links from other modules at the top of the screen. For more information, see the online handbook entry for <a href="@toolbar">Toolbar module</a>.', array('@toolbar' => 'http://drupal.org/documentation/modules/toolbar/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Displaying administrative links') . '</dt>';
+      $output .= '<dd>' . t('The Toolbar module displays a bar containing top-level administrative links across the top of the screen. Below that, the Toolbar module has a <em>drawer</em> section where it displays links provided by other modules, such as the core <a href="@shortcuts-help">Shortcut module</a>. The drawer can be hidden/shown by using the show/hide shortcuts link at the end of the toolbar.', array('@shortcuts-help' => url('admin/help/shortcut'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_permission().
+ */
+function toolbar_permission() {
+  return array(
+    'access toolbar' => array(
+      'title' => t('Use the administration toolbar'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_theme().
+ */
+function toolbar_theme($existing, $type, $theme, $path) {
+  $items['toolbar'] = array(
+    'render element' => 'toolbar',
+    'template' => 'toolbar',
+    'path' => drupal_get_path('module', 'toolbar'),
+  );
+  $items['toolbar_toggle'] = array(
+    'variables' => array(
+      'collapsed' => NULL,
+      'attributes' => array(),
+    ),
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_menu().
+ */
+function toolbar_menu() {
+  $items['toolbar/toggle'] = array(
+    'title' => 'Toggle drawer visibility',
+    'type' => MENU_CALLBACK,
+    'page callback' => 'toolbar_toggle_page',
+    'access arguments' => array('access toolbar'),
+  );
+  return $items;
+}
+
+/**
+ * Menu callback; toggles the visibility of the toolbar drawer.
+ */
+function toolbar_toggle_page() {
+  global $base_path;
+  // Toggle the value in the cookie.
+  setcookie('Drupal.toolbar.collapsed', !_toolbar_is_collapsed(), NULL, $base_path);
+  // Redirect the user from where he used the toggle element.
+  drupal_goto();
+}
+
+/**
+ * Formats an element used to toggle the toolbar drawer's visibility.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - collapsed: A boolean value representing the toolbar drawer's visibility.
+ *   - attributes: An associative array of HTML attributes.
+ *
+ * @return
+ *   An HTML string representing the element for toggling.
+ *
+ * @ingroup themable
+ */
+function theme_toolbar_toggle($variables) {
+  if ($variables['collapsed']) {
+    $toggle_text = t('Show shortcuts');
+  }
+  else {
+    $toggle_text = t('Hide shortcuts');
+    $variables['attributes']['class'][] = 'toggle-active';
+  }
+  return l($toggle_text, 'toolbar/toggle', array('query' => drupal_get_destination(), 'attributes' => array('title' => $toggle_text) + $variables['attributes']));
+}
+
+/**
+ * Determines the current state of the toolbar drawer's visibility.
+ *
+ * @return
+ *   TRUE when drawer is collapsed, FALSE when it is expanded.
+ */
+function _toolbar_is_collapsed() {
+  // PHP converts dots into underscores in cookie names to avoid problems with
+  // its parser, so we use a converted cookie name.
+  return isset($_COOKIE['Drupal_toolbar_collapsed']) ? $_COOKIE['Drupal_toolbar_collapsed'] : 0;
+}
+
+/**
+ * Implements hook_page_build().
+ *
+ * Add admin toolbar to the page_top region automatically.
+ */
+function toolbar_page_build(&$page) {
+  $page['page_top']['toolbar'] = array(
+    '#pre_render' => array('toolbar_pre_render'),
+    '#access' => user_access('access toolbar'),
+    'toolbar_drawer' => array(),
+  );
+}
+
+/**
+ * Prerender function for the toolbar.
+ *
+ * Since building the toolbar takes some time, it is done just prior to
+ * rendering to ensure that it is built only if it will be displayed.
+ */
+function toolbar_pre_render($toolbar) {
+  $toolbar = array_merge($toolbar, toolbar_view());
+  return $toolbar;
+}
+
+/**
+ * Implements hook_preprocess_html().
+ *
+ * Add some page classes, so global page theming can adjust to the toolbar.
+ */
+function toolbar_preprocess_html(&$vars) {
+  if (isset($vars['page']['page_top']['toolbar']) && user_access('access toolbar')) {
+    $vars['classes_array'][] = 'toolbar';
+    if (!_toolbar_is_collapsed()) {
+      $vars['classes_array'][] = 'toolbar-drawer';
+    }
+  }
+}
+
+/**
+ * Implements hook_preprocess_toolbar().
+ *
+ * Adding the 'overlay-displace-top' class to the toolbar pushes the overlay
+ * down, so it appears below the toolbar.
+ */
+function toolbar_preprocess_toolbar(&$variables) {
+  $variables['classes_array'][] = "overlay-displace-top";
+}
+
+/**
+ * Implements hook_system_info_alter().
+ *
+ * Indicate that the 'page_top' region (in which the toolbar will be displayed)
+ * is an overlay supplemental region that should be refreshed whenever its
+ * content is updated.
+ *
+ * This information is provided for any module that might need to use it, not
+ * just the core Overlay module.
+ */
+function toolbar_system_info_alter(&$info, $file, $type) {
+  if ($type == 'theme') {
+    $info['overlay_supplemental_regions'][] = 'page_top';
+  }
+}
+
+/**
+ * Builds the admin menu as a structured array ready for drupal_render().
+ *
+ * @return
+ *   Array of links and settings relating to the admin menu.
+ */
+function toolbar_view() {
+  global $user;
+
+  $module_path = drupal_get_path('module', 'toolbar');
+  $build = array(
+    '#theme' => 'toolbar',
+    '#attached'=> array(
+      'js' => array(
+        $module_path . '/toolbar.js',
+        array(
+          'data' => array('tableHeaderOffset' => 'Drupal.toolbar.height'),
+          'type' => 'setting'
+        ),
+      ),
+      'css' => array(
+        $module_path . '/toolbar.css',
+      ),
+      'library' => array(array('system', 'jquery.cookie')),
+    ),
+  );
+
+  // Retrieve the admin menu from the database.
+  $links = toolbar_menu_navigation_links(toolbar_get_menu_tree());
+  $build['toolbar_menu'] = array(
+    '#theme' => 'links__toolbar_menu',
+    '#links' => $links,
+    '#attributes' => array('id' => 'toolbar-menu'),
+    '#heading' => array('text' => t('Administrative toolbar'), 'level' => 'h2', 'class' => 'element-invisible'),
+  );
+
+  // Add logout & user account links or login link.
+  if ($user->uid) {
+    $links = array(
+      'account' => array(
+        'title' => t('Hello <strong>@username</strong>', array('@username' => format_username($user))),
+        'href' => 'user',
+        'html' => TRUE,
+        'attributes' => array('title' => t('User account')),
+      ),
+      'logout' => array(
+        'title' => t('Log out'),
+        'href' => 'user/logout',
+      ),
+    );
+  }
+  else {
+     $links = array(
+      'login' => array(
+        'title' => t('Log in'),
+        'href' => 'user',
+      ),
+    );
+  }
+  $build['toolbar_user'] = array(
+    '#theme' => 'links__toolbar_user',
+    '#links' => $links,
+    '#attributes' => array('id' => 'toolbar-user'),
+  );
+
+  // Add a "home" link.
+  $link = array(
+    'home' => array(
+      'title' => '<span class="home-link">Home</span>',
+      'href' => '<front>',
+      'html' => TRUE,
+      'attributes' => array('title' => t('Home')),
+    ),
+  );
+  $build['toolbar_home'] = array(
+    '#theme' => 'links',
+    '#links' => $link,
+    '#attributes' => array('id' => 'toolbar-home'),
+  );
+
+  // Add an anchor to be able to toggle the visibility of the drawer.
+  $build['toolbar_toggle'] = array(
+    '#theme' => 'toolbar_toggle',
+    '#collapsed' => _toolbar_is_collapsed(),
+    '#attributes' => array('class' => array('toggle')),
+  );
+
+  // Prepare the drawer links CSS classes.
+  $toolbar_drawer_classes = array(
+    'toolbar-drawer',
+    'clearfix',
+  );
+  if(_toolbar_is_collapsed()) {
+    $toolbar_drawer_classes[] = 'collapsed';
+  }
+  $build['toolbar_drawer_classes'] = implode(' ', $toolbar_drawer_classes);
+
+  return $build;
+}
+
+/**
+ * Gets only the top level items below the 'admin' path.
+ *
+ * @return
+ *   An array containing a menu tree of top level items below the 'admin' path.
+ */
+function toolbar_get_menu_tree() {
+  $tree = array();
+  $admin_link = db_query('SELECT * FROM {menu_links} WHERE menu_name = :menu_name AND module = :module AND link_path = :path', array(':menu_name' => 'management', ':module' => 'system', ':path' => 'admin'))->fetchAssoc();
+  if ($admin_link) {
+    $tree = menu_build_tree('management', array(
+      'expanded' => array($admin_link['mlid']),
+      'min_depth' => $admin_link['depth'] + 1,
+      'max_depth' => $admin_link['depth'] + 1,
+    ));
+  }
+
+  return $tree;
+}
+
+/**
+ * Generates a links array from a menu tree array.
+ *
+ * Based on menu_navigation_links(). Adds path based IDs and icon placeholders
+ * to the links.
+ *
+ * @return
+ *   An array of links as defined above.
+ */
+function toolbar_menu_navigation_links($tree) {
+  $links = array();
+  foreach ($tree as $item) {
+    if (!$item['link']['hidden'] && $item['link']['access']) {
+      // Make sure we have a path specific ID in place, so we can attach icons
+      // and behaviors to the items.
+      $id = str_replace(array('/', '<', '>'), array('-', '', ''), $item['link']['href']);
+
+      $link = $item['link']['localized_options'];
+      $link['href'] = $item['link']['href'];
+      // Add icon placeholder.
+      $link['title'] = '<span class="icon"></span>' . check_plain($item['link']['title']);
+      // Add admin link ID.
+      $link['attributes'] = array('id' => 'toolbar-link-' . $id);
+      if (!empty($item['link']['description'])) {
+        $link['title'] .= ' <span class="element-invisible">(' . $item['link']['description'] . ')</span>';
+        $link['attributes']['title'] = $item['link']['description'];
+      }
+      $link['html'] = TRUE;
+
+      $class = ' path-' . $id;
+      if (toolbar_in_active_trail($item['link']['href'])) {
+        $class .= ' active-trail';
+      }
+      $links['menu-' . $item['link']['mlid'] . $class] = $link;
+    }
+  }
+  return $links;
+}
+
+/**
+ * Checks whether an item is in the active trail.
+ *
+ * Useful when using a menu generated by menu_tree_all_data() which does
+ * not set the 'in_active_trail' flag on items.
+ *
+ * @return
+ *   TRUE when path is in the active trail, FALSE if not.
+ *
+ * @todo
+ *   Look at migrating to a menu system level function.
+ */
+function toolbar_in_active_trail($path) {
+  $active_paths = &drupal_static(__FUNCTION__);
+
+  // Gather active paths.
+  if (!isset($active_paths)) {
+    $active_paths = array();
+    $trail = menu_get_active_trail();
+    foreach ($trail as $item) {
+      if (!empty($item['href'])) {
+        $active_paths[] = $item['href'];
+      }
+    }
+  }
+  return in_array($path, $active_paths);
+}
diff --git a/htmltest/modules/toolbar/toolbar.png b/htmltest/modules/toolbar/toolbar.png
new file mode 100644
index 00000000..f2c7f355
Binary files /dev/null and b/htmltest/modules/toolbar/toolbar.png differ
diff --git a/htmltest/modules/toolbar/toolbar.tpl.php b/htmltest/modules/toolbar/toolbar.tpl.php
new file mode 100644
index 00000000..e8521299
--- /dev/null
+++ b/htmltest/modules/toolbar/toolbar.tpl.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Default template for admin toolbar.
+ *
+ * Available variables:
+ * - $classes: String of classes that can be used to style contextually through
+ *   CSS. It can be manipulated through the variable $classes_array from
+ *   preprocess functions. The default value has the following:
+ *   - toolbar: The current template type, i.e., "theming hook".
+ * - $toolbar['toolbar_user']: User account / logout links.
+ * - $toolbar['toolbar_menu']: Top level management menu links.
+ * - $toolbar['toolbar_drawer']: A place for extended toolbar content.
+ *
+ * Other variables:
+ * - $classes_array: Array of html class attribute values. It is flattened
+ *   into a string within the variable $classes.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_toolbar()
+ *
+ * @ingroup themeable
+ */
+?>
+<div id="toolbar" class="<?php print $classes; ?> clearfix">
+  <div class="toolbar-menu clearfix">
+    <?php print render($toolbar['toolbar_home']); ?>
+    <?php print render($toolbar['toolbar_user']); ?>
+    <?php print render($toolbar['toolbar_menu']); ?>
+    <?php if ($toolbar['toolbar_drawer']):?>
+      <?php print render($toolbar['toolbar_toggle']); ?>
+    <?php endif; ?>
+  </div>
+
+  <div class="<?php echo $toolbar['toolbar_drawer_classes']; ?>">
+    <?php print render($toolbar['toolbar_drawer']); ?>
+  </div>
+</div>
diff --git a/htmltest/modules/tracker/tracker.css b/htmltest/modules/tracker/tracker.css
new file mode 100644
index 00000000..d3531c46
--- /dev/null
+++ b/htmltest/modules/tracker/tracker.css
@@ -0,0 +1,7 @@
+
+.page-tracker td.replies {
+  text-align: center;
+}
+.page-tracker table {
+  width: 100%;
+}
diff --git a/htmltest/modules/tracker/tracker.info b/htmltest/modules/tracker/tracker.info
new file mode 100644
index 00000000..4fb17fdb
--- /dev/null
+++ b/htmltest/modules/tracker/tracker.info
@@ -0,0 +1,13 @@
+name = Tracker
+description = Enables tracking of recent content for users.
+dependencies[] = comment
+package = Core
+version = VERSION
+core = 7.x
+files[] = tracker.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/tracker/tracker.install b/htmltest/modules/tracker/tracker.install
new file mode 100644
index 00000000..9967b9db
--- /dev/null
+++ b/htmltest/modules/tracker/tracker.install
@@ -0,0 +1,225 @@
+<?php
+
+/**
+ * @file
+ * Install, update, and uninstall functions for tracker.module.
+ */
+
+/**
+ * Implements hook_uninstall().
+ */
+function tracker_uninstall() {
+  variable_del('tracker_index_nid');
+  variable_del('tracker_batch_size');
+}
+
+/**
+ * Implements hook_enable().
+ */
+function tracker_enable() {
+  $max_nid = db_query('SELECT MAX(nid) FROM {node}')->fetchField();
+  if ($max_nid != 0) {
+    variable_set('tracker_index_nid', $max_nid);
+    // To avoid timing out while attempting to do a complete indexing, we
+    // simply call our cron job to remove stale records and begin the process.
+    tracker_cron();
+  }
+}
+
+/**
+ * Implements hook_schema().
+ */
+function tracker_schema() {
+  $schema['tracker_node'] = array(
+    'description' => 'Tracks when nodes were last changed or commented on.',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The {node}.nid this record tracks.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'published' => array(
+        'description' => 'Boolean indicating whether the node is published.',
+        'type' => 'int',
+        'not null' => FALSE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'changed' => array(
+        'description' => 'The Unix timestamp when the node was most recently saved or commented on.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'indexes' => array(
+      'tracker' => array('published', 'changed'),
+    ),
+    'primary key' => array('nid'),
+    'foreign keys' => array(
+      'tracked_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+    ),
+  );
+
+  $schema['tracker_user'] = array(
+    'description' => 'Tracks when nodes were last changed or commented on, for each user that authored the node or one of its comments.',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The {node}.nid this record tracks.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'uid' => array(
+        'description' => 'The {users}.uid of the node author or commenter.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'published' => array(
+        'description' => 'Boolean indicating whether the node is published.',
+        'type' => 'int',
+        'not null' => FALSE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'changed' => array(
+        'description' => 'The Unix timestamp when the node was most recently saved or commented on.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'indexes' => array(
+      'tracker' => array('uid', 'published', 'changed'),
+    ),
+    'primary key' => array('nid', 'uid'),
+    'foreign keys' => array(
+      'tracked_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+      'tracked_user' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid'),
+      ),
+    ),
+  );
+
+  return $schema;
+}
+
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Create new tracker_node and tracker_user tables.
+ */
+function tracker_update_7000() {
+  $schema['tracker_node'] = array(
+    'description' => 'Tracks when nodes were last changed or commented on',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The {node}.nid this record tracks.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'published' => array(
+        'description' => 'Boolean indicating whether the node is published.',
+        'type' => 'int',
+        'not null' => FALSE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'changed' => array(
+        'description' => 'The Unix timestamp when the node was most recently saved or commented on.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'indexes' => array(
+      'tracker' => array('published', 'changed'),
+    ),
+    'primary key' => array('nid'),
+    'foreign keys' => array(
+      'tracked_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+    ),
+  );
+
+  $schema['tracker_user'] = array(
+    'description' => 'Tracks when nodes were last changed or commented on, for each user that authored the node or one of its comments.',
+    'fields' => array(
+      'nid' => array(
+        'description' => 'The {node}.nid this record tracks.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'uid' => array(
+        'description' => 'The {users}.uid of the node author or commenter.',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'published' => array(
+        'description' => 'Boolean indicating whether the node is published.',
+        'type' => 'int',
+        'not null' => FALSE,
+        'default' => 0,
+        'size' => 'tiny',
+      ),
+      'changed' => array(
+        'description' => 'The Unix timestamp when the node was most recently saved or commented on.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+    ),
+    'indexes' => array(
+      'tracker' => array('uid', 'published', 'changed'),
+    ),
+    'primary key' => array('nid', 'uid'),
+    'foreign keys' => array(
+      'tracked_node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+      'tracked_user' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid'),
+      ),
+    ),
+  );
+
+  foreach ($schema as $name => $table) {
+    db_create_table($name, $table);
+  }
+
+  $max_nid = db_query('SELECT MAX(nid) FROM {node}')->fetchField();
+  if ($max_nid != 0) {
+    variable_set('tracker_index_nid', $max_nid);
+  }
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x".
+ */
diff --git a/htmltest/modules/tracker/tracker.module b/htmltest/modules/tracker/tracker.module
new file mode 100644
index 00000000..8694222d
--- /dev/null
+++ b/htmltest/modules/tracker/tracker.module
@@ -0,0 +1,380 @@
+<?php
+
+/**
+ * @file
+ * Tracks recent content posted by a user or users.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function tracker_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#tracker':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Tracker module displays the most recently added and updated content on your site, and allows you to follow new content created by each user. This module has no configuration options. For more information, see the online handbook entry for <a href="@tracker">Tracker module</a>.', array('@tracker' => 'http://drupal.org/documentation/modules/tracker/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Navigation') . '</dt>';
+      $output .= '<dd>' . t('The Tracker module adds a new menu item to the Navigation menu, called <em>Recent content</em>. You can configure menu items via the <a href="@menus">Menus administration page</a>.', array('@menus' => url('admin/structure/menu'))) . '</dd>';
+      $output .= '<dt>' . t('Tracking new and updated site content') . '</dt>';
+      $output .= '<dd>' . t("The <a href='@recent'>Recent content</a> page shows new and updated content in reverse chronological order, listing the content type, title, author's name, number of comments, and time of last update. Content is considered updated when changes occur in the text, or when new comments are added. The <em>My recent content</em> tab limits the list to the currently logged-in user.", array('@recent' => url('tracker'))) . '</dd>';
+      $output .= '<dt>' . t('Tracking user-specific content') . '</dt>';
+      $output .= '<dd>' . t("To follow a specific user's new and updated content, select the <em>Track</em> tab from the user's profile page.") . '</dd>';
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function tracker_menu() {
+  $items['tracker'] = array(
+    'title' => 'Recent content',
+    'page callback' => 'tracker_page',
+    'access arguments' => array('access content'),
+    'weight' => 1,
+    'file' => 'tracker.pages.inc',
+  );
+  $items['tracker/all'] = array(
+    'title' => 'All recent content',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $items['tracker/%user_uid_optional'] = array(
+    'title' => 'My recent content',
+    'page callback' => 'tracker_page',
+    'access callback' => '_tracker_myrecent_access',
+    'access arguments' => array(1),
+    'page arguments' => array(1),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'tracker.pages.inc',
+  );
+
+  $items['user/%user/track'] = array(
+    'title' => 'Track',
+    'page callback' => 'tracker_page',
+    'page arguments' => array(1, TRUE),
+    'access callback' => '_tracker_user_access',
+    'access arguments' => array(1),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'tracker.pages.inc',
+  );
+  $items['user/%user/track/content'] = array(
+    'title' => 'Track content',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_cron().
+ *
+ * Updates tracking information for any items still to be tracked. The variable
+ * 'tracker_index_nid' is set to ((the last node ID that was indexed) - 1) and
+ * used to select the nodes to be processed. If there are no remaining nodes to
+ * process, 'tracker_index_nid' will be 0.
+ */
+function tracker_cron() {
+  $max_nid = variable_get('tracker_index_nid', 0);
+  $batch_size = variable_get('tracker_batch_size', 1000);
+  if ($max_nid > 0) {
+    $last_nid = FALSE;
+    $result = db_query_range('SELECT nid, uid, status FROM {node} WHERE nid <= :max_nid ORDER BY nid DESC', 0, $batch_size, array(':max_nid' => $max_nid), array('target' => 'slave'));
+
+    $count = 0;
+
+    foreach ($result as $row) {
+      // Calculate the changed timestamp for this node.
+      $changed = _tracker_calculate_changed($row->nid);
+
+      // Remove existing data for this node.
+      db_delete('tracker_node')
+        ->condition('nid', $row->nid)
+        ->execute();
+      db_delete('tracker_user')
+        ->condition('nid', $row->nid)
+        ->execute();
+
+      // Insert the node-level data.
+      db_insert('tracker_node')
+        ->fields(array(
+          'nid' => $row->nid,
+          'published' => $row->status,
+          'changed' => $changed,
+        ))
+        ->execute();
+
+      // Insert the user-level data for the node's author.
+      db_insert('tracker_user')
+        ->fields(array(
+          'nid' => $row->nid,
+          'published' => $row->status,
+          'changed' => $changed,
+          'uid' => $row->uid,
+        ))
+        ->execute();
+
+      $query = db_select('comment', 'c', array('target' => 'slave'));
+      // Force PostgreSQL to do an implicit cast by adding 0.
+      $query->addExpression('0 + :changed', 'changed', array(':changed' => $changed));
+      $query->addField('c', 'status', 'published');
+      $query
+        ->distinct()
+        ->fields('c', array('uid', 'nid'))
+        ->condition('c.nid', $row->nid)
+        ->condition('c.uid', $row->uid, '<>')
+        ->condition('c.status', COMMENT_PUBLISHED);
+
+      // Insert the user-level data for the commenters (except if a commenter
+      // is the node's author).
+      db_insert('tracker_user')
+        ->from($query)
+        ->execute();
+
+      // Note that we have indexed at least one node.
+      $last_nid = $row->nid;
+
+      $count++;
+    }
+
+    if ($last_nid !== FALSE) {
+      // Prepare a starting point for the next run.
+      variable_set('tracker_index_nid', $last_nid - 1);
+
+      watchdog('tracker', 'Indexed %count content items for tracking.', array('%count' => $count));
+    }
+    else {
+      // If all nodes have been indexed, set to zero to skip future cron runs.
+      variable_set('tracker_index_nid', 0);
+    }
+  }
+}
+
+/**
+ * Access callback for tracker/%user_uid_optional.
+ */
+function _tracker_myrecent_access($account) {
+  // This path is only allowed for authenticated users looking at their own content.
+  return $account->uid && ($GLOBALS['user']->uid == $account->uid) && user_access('access content');
+}
+
+/**
+ * Access callback for user/%user/track.
+ */
+function _tracker_user_access($account) {
+  return user_view_access($account) && user_access('access content');
+}
+
+/**
+ * Implements hook_node_insert().
+ *
+ * Adds new tracking information for this node since it's new.
+ */
+function tracker_node_insert($node, $arg = 0) {
+  _tracker_add($node->nid, $node->uid, $node->changed);
+}
+
+/**
+ * Implements hook_node_update().
+ *
+ * Adds tracking information for this node since it's been updated.
+ */
+function tracker_node_update($node, $arg = 0) {
+  _tracker_add($node->nid, $node->uid, $node->changed);
+}
+
+/**
+ * Implements hook_node_delete().
+ *
+ * Deletes tracking information for a node.
+ */
+function tracker_node_delete($node, $arg = 0) {
+  db_delete('tracker_node')
+    ->condition('nid', $node->nid)
+    ->execute();
+  db_delete('tracker_user')
+    ->condition('nid', $node->nid)
+    ->execute();
+}
+
+/**
+ * Implements hook_comment_update().
+ *
+ * Comment module doesn't call hook_comment_unpublish() when saving individual
+ * comments so we need to check for those here.
+ */
+function tracker_comment_update($comment) {
+  // comment_save() calls hook_comment_publish() for all published comments
+  // so we need to handle all other values here.
+  if ($comment->status != COMMENT_PUBLISHED) {
+    _tracker_remove($comment->nid, $comment->uid, $comment->changed);
+  }
+}
+
+/**
+ * Implements hook_comment_publish().
+ *
+ * This actually handles the insert and update of published nodes since
+ * comment_save() calls hook_comment_publish() for all published comments.
+ */
+function tracker_comment_publish($comment) {
+  _tracker_add($comment->nid, $comment->uid, $comment->changed);
+}
+
+/**
+ * Implements hook_comment_unpublish().
+ */
+function tracker_comment_unpublish($comment) {
+  _tracker_remove($comment->nid, $comment->uid, $comment->changed);
+}
+
+/**
+ * Implements hook_comment_delete().
+ */
+function tracker_comment_delete($comment) {
+  _tracker_remove($comment->nid, $comment->uid, $comment->changed);
+}
+
+/**
+ * Updates indexing tables when a node is added, updated, or commented on.
+ *
+ * @param $nid
+ *   A node ID.
+ * @param $uid
+ *   The node or comment author.
+ * @param $changed
+ *   The node updated timestamp or comment timestamp.
+ */
+function _tracker_add($nid, $uid, $changed) {
+  $node = db_query('SELECT nid, status, uid, changed FROM {node} WHERE nid = :nid', array(':nid' => $nid))->fetchObject();
+
+  // Adding a comment can only increase the changed timestamp, so our
+  // calculation here is simple.
+  $changed = max($node->changed, $changed);
+
+  // Update the node-level data.
+  db_merge('tracker_node')
+    ->key(array('nid' => $nid))
+    ->fields(array(
+      'changed' => $changed,
+      'published' => $node->status,
+    ))
+    ->execute();
+
+  // Create or update the user-level data.
+  db_merge('tracker_user')
+    ->key(array(
+      'nid' => $nid,
+      'uid' => $uid,
+    ))
+    ->fields(array(
+      'changed' => $changed,
+      'published' => $node->status,
+    ))
+    ->execute();
+}
+
+/**
+ * Determines the max timestamp between $node->changed and the last comment.
+ *
+ * @param $nid
+ *   A node ID.
+ *
+ * @return
+ *  The $node->changed timestamp, or most recent comment timestamp, whichever
+ *  is the greatest.
+ */
+function _tracker_calculate_changed($nid) {
+  $changed = db_query('SELECT changed FROM {node} WHERE nid = :nid', array(':nid' => $nid), array('target' => 'slave'))->fetchField();
+  $latest_comment = db_query_range('SELECT cid, changed FROM {comment} WHERE nid = :nid AND status = :status ORDER BY changed DESC', 0, 1, array(
+    ':nid' => $nid,
+    ':status' => COMMENT_PUBLISHED,
+  ), array('target' => 'slave'))->fetchObject();
+  if ($latest_comment && $latest_comment->changed > $changed) {
+    $changed = $latest_comment->changed;
+  }
+  return $changed;
+}
+
+/**
+ * Cleans up indexed data when nodes or comments are removed.
+ *
+ * @param $nid
+ *  The node ID.
+ * @param $uid
+ *   The author of the node or comment.
+ * @param $changed
+ *   The last changed timestamp of the node.
+ */
+function _tracker_remove($nid, $uid = NULL, $changed = NULL) {
+  $node = db_query('SELECT nid, status, uid, changed FROM {node} WHERE nid = :nid', array(':nid' => $nid))->fetchObject();
+
+  // The user only keeps his or her subscription if both of the following are true:
+  //   (1) The node exists.
+  //   (2) The user is either the node author or has commented on the node.
+  $keep_subscription = FALSE;
+
+  if ($node) {
+    // Self-authorship is one reason to keep the user's subscription.
+    $keep_subscription = ($node->uid == $uid);
+
+    // Comments are a second reason to keep the user's subscription.
+    if (!$keep_subscription) {
+      // Check if the user has commented at least once on the given nid.
+      $keep_subscription = db_query_range('SELECT COUNT(*) FROM {comment} WHERE nid = :nid AND uid = :uid AND status = :status', 0, 1, array(
+        ':nid' => $nid,
+        ':uid' => $uid,
+        ':status' => COMMENT_PUBLISHED,
+      ))->fetchField();
+    }
+
+    // If we haven't found a reason to keep the user's subscription, delete it.
+    if (!$keep_subscription) {
+      db_delete('tracker_user')
+        ->condition('nid', $nid)
+        ->condition('uid', $uid)
+        ->execute();
+    }
+
+    // Now we need to update the (possibly) changed timestamps for other users
+    // and the node itself.
+    // We only need to do this if the removed item has a timestamp that equals
+    // or exceeds the listed changed timestamp for the node.
+    $tracker_node = db_query('SELECT nid, changed FROM {tracker_node} WHERE nid = :nid', array(':nid' => $nid))->fetchObject();
+    if ($tracker_node && $changed >= $tracker_node->changed) {
+      // If we're here, the item being removed is *possibly* the item that
+      // established the node's changed timestamp.
+
+      // We just have to recalculate things from scratch.
+      $changed = _tracker_calculate_changed($nid);
+
+      // And then we push the out the new changed timestamp to our denormalized
+      // tables.
+      db_update('tracker_node')
+        ->fields(array(
+          'changed' => $changed,
+          'published' => $node->status,
+        ))
+        ->condition('nid', $nid)
+        ->execute();
+      db_update('tracker_node')
+        ->fields(array(
+          'changed' => $changed,
+          'published' => $node->status,
+        ))
+        ->condition('nid', $nid)
+        ->execute();
+    }
+  }
+  else {
+    // If the node doesn't exist, remove everything.
+    db_delete('tracker_node')
+      ->condition('nid', $nid)
+      ->execute();
+    db_delete('tracker_user')
+      ->condition('nid', $nid)
+      ->execute();
+  }
+}
diff --git a/htmltest/modules/tracker/tracker.pages.inc b/htmltest/modules/tracker/tracker.pages.inc
new file mode 100644
index 00000000..baa99866
--- /dev/null
+++ b/htmltest/modules/tracker/tracker.pages.inc
@@ -0,0 +1,129 @@
+<?php
+
+/**
+ * @file
+ * User page callbacks for tracker.module.
+ */
+
+
+/**
+ * Page callback: prints a listing of active nodes on the site.
+ *
+ * Queries the database for info, adds RDFa info if applicable, and generates
+ * the render array that will be used to render the page.
+ */
+function tracker_page($account = NULL, $set_title = FALSE) {
+  if ($account) {
+    $query = db_select('tracker_user', 't')->extend('PagerDefault');
+    $query->condition('t.uid', $account->uid);
+
+    if ($set_title) {
+      // When viewed from user/%user/track, display the name of the user
+      // as page title -- the tab title remains Track so this needs to be done
+      // here and not in the menu definition.
+      drupal_set_title(format_username($account));
+    }
+  }
+  else {
+    $query = db_select('tracker_node', 't', array('target' => 'slave'))->extend('PagerDefault');
+  }
+
+  // This array acts as a placeholder for the data selected later
+  // while keeping the correct order.
+  $nodes = $query
+    ->addTag('node_access')
+    ->fields('t', array('nid', 'changed'))
+    ->condition('t.published', 1)
+    ->orderBy('t.changed', 'DESC')
+    ->limit(25)
+    ->execute()
+    ->fetchAllAssoc('nid');
+
+  $rows = array();
+  if (!empty($nodes)) {
+    // Now, get the data and put into the placeholder array.
+    $result = db_query('SELECT n.nid, n.title, n.type, n.changed, n.uid, u.name, l.comment_count FROM {node} n INNER JOIN {node_comment_statistics} l ON n.nid = l.nid INNER JOIN {users} u ON n.uid = u.uid WHERE n.nid IN (:nids)', array(':nids' => array_keys($nodes)), array('target' => 'slave'));
+    foreach ($result as $node) {
+      $node->last_activity = $nodes[$node->nid]->changed;
+      $nodes[$node->nid] = $node;
+    }
+
+    // Display the data.
+    foreach ($nodes as $node) {
+      // Determine the number of comments.
+      $comments = 0;
+      if ($node->comment_count) {
+        $comments = $node->comment_count;
+
+        if ($new = comment_num_new($node->nid)) {
+          $comments .= '<br />';
+          $comments .= l(format_plural($new, '1 new', '@count new'), 'node/' . $node->nid, array('fragment' => 'new'));
+        }
+      }
+
+      $row = array(
+        'type' => check_plain(node_type_get_name($node->type)),
+        'title' => array('data' => l($node->title, 'node/' . $node->nid) . ' ' . theme('mark', array('type' => node_mark($node->nid, $node->changed)))),
+        'author' => array('data' => theme('username', array('account' => $node))),
+        'replies' => array('class' => array('replies'), 'data' => $comments),
+        'last updated' => array('data' => t('!time ago', array('!time' => format_interval(REQUEST_TIME - $node->last_activity)))),
+      );
+
+      // Adds extra RDFa markup to the $row array if the RDF module is enabled.
+      if (function_exists('rdf_mapping_load')) {
+        // Each node is not loaded for performance reasons, as a result we need
+        // to retrieve the RDF mapping for each node type.
+        $mapping = rdf_mapping_load('node', $node->type);
+        // Adds RDFa markup to the title of the node. Because the RDFa markup is
+        // added to the td tag which might contain HTML code, we specify an
+        // empty datatype to ensure the value of the title read by the RDFa
+        // parsers is a plain literal.
+        $row['title'] += rdf_rdfa_attributes($mapping['title']) + array('datatype' => '');
+        // Annotates the td tag containing the author of the node.
+        $row['author'] += rdf_rdfa_attributes($mapping['uid']);
+        // Annotates the td tag containing the number of replies. We add the
+        // content attribute to ensure that only the comment count is used as
+        // the value for 'num_replies'. Otherwise, other text such as a link
+        // to the number of new comments could be included in the 'num_replies'
+        // value.
+        $row['replies'] += rdf_rdfa_attributes($mapping['comment_count']);
+        $row['replies'] += array('content' => $node->comment_count);
+        // If the node has no comments, we assume the node itself was modified
+        // and apply 'changed' in addition to 'last_activity'.  If there are
+        // comments present, we cannot infer whether the node itself was
+        // modified or a comment was posted, so we use only 'last_activity'.
+        $mapping_last_activity = rdf_rdfa_attributes($mapping['last_activity'], $node->last_activity);
+        if ($node->comment_count == 0) {
+          $mapping_changed = rdf_rdfa_attributes($mapping['changed'], $node->last_activity);
+          $mapping_last_activity['property'] = array_merge($mapping_last_activity['property'], $mapping_changed['property']);
+        }
+        $row['last updated'] += $mapping_last_activity;
+
+        // We need to add the about attribute on the tr tag to specify which
+        // node the RDFa annotations above apply to. We move the content of
+        // $row to a 'data' sub array so we can specify attributes for the row.
+        $row = array('data' => $row);
+        $row['about'] = url('node/' . $node->nid);
+      }
+      $rows[] = $row;
+    }
+  }
+
+  $page['tracker'] = array(
+    '#rows' => $rows,
+    '#header' => array(t('Type'), t('Title'), t('Author'), t('Replies'), t('Last updated')),
+    '#theme' => 'table',
+    '#empty' => t('No content available.'),
+    '#attached' => array(
+      'css' => array(drupal_get_path('module', 'tracker') . '/tracker.css' => array()),
+    ),
+  );
+  $page['pager'] = array(
+    '#theme' => 'pager',
+    '#quantity' => 25,
+    '#weight' => 10,
+  );
+  $page['#sorted'] = TRUE;
+
+  return $page;
+}
diff --git a/htmltest/modules/tracker/tracker.test b/htmltest/modules/tracker/tracker.test
new file mode 100644
index 00000000..66ebb848
--- /dev/null
+++ b/htmltest/modules/tracker/tracker.test
@@ -0,0 +1,268 @@
+<?php
+
+/**
+ * @file
+ * Tests for tracker.module.
+ */
+
+/**
+ * Defines a base class for testing tracker.module.
+ */
+class TrackerTest extends DrupalWebTestCase {
+
+  /**
+   * The main user for testing.
+   *
+   * @var object
+   */
+  protected $user;
+
+  /**
+   * A second user that will 'create' comments and nodes.
+   *
+   * @var object
+   */
+  protected $other_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Tracker',
+      'description' => 'Create and delete nodes and check for their display in the tracker listings.',
+      'group' => 'Tracker'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('comment', 'tracker');
+
+    $permissions = array('access comments', 'create page content', 'post comments', 'skip comment approval');
+    $this->user = $this->drupalCreateUser($permissions);
+    $this->other_user = $this->drupalCreateUser($permissions);
+
+    // Make node preview optional.
+    variable_set('comment_preview_page', 0);
+  }
+
+  /**
+   * Tests for the presence of nodes on the global tracker listing.
+   */
+  function testTrackerAll() {
+    $this->drupalLogin($this->user);
+
+    $unpublished = $this->drupalCreateNode(array(
+      'title' => $this->randomName(8),
+      'status' => 0,
+    ));
+    $published = $this->drupalCreateNode(array(
+      'title' => $this->randomName(8),
+      'status' => 1,
+    ));
+
+    $this->drupalGet('tracker');
+    $this->assertNoText($unpublished->title, 'Unpublished node do not show up in the tracker listing.');
+    $this->assertText($published->title, 'Published node show up in the tracker listing.');
+    $this->assertLink(t('My recent content'), 0, 'User tab shows up on the global tracker page.');
+
+    // Delete a node and ensure it no longer appears on the tracker.
+    node_delete($published->nid);
+    $this->drupalGet('tracker');
+    $this->assertNoText($published->title, 'Deleted node do not show up in the tracker listing.');
+  }
+
+  /**
+   * Tests for the presence of nodes on a user's tracker listing.
+   */
+  function testTrackerUser() {
+    $this->drupalLogin($this->user);
+
+    $unpublished = $this->drupalCreateNode(array(
+      'title' => $this->randomName(8),
+      'uid' => $this->user->uid,
+      'status' => 0,
+    ));
+    $my_published = $this->drupalCreateNode(array(
+      'title' => $this->randomName(8),
+      'uid' => $this->user->uid,
+      'status' => 1,
+    ));
+    $other_published_no_comment = $this->drupalCreateNode(array(
+      'title' => $this->randomName(8),
+      'uid' => $this->other_user->uid,
+      'status' => 1,
+    ));
+    $other_published_my_comment = $this->drupalCreateNode(array(
+      'title' => $this->randomName(8),
+      'uid' => $this->other_user->uid,
+      'status' => 1,
+    ));
+    $comment = array(
+      'subject' => $this->randomName(),
+      'comment_body[' . LANGUAGE_NONE . '][0][value]' => $this->randomName(20),
+    );
+    $this->drupalPost('comment/reply/' . $other_published_my_comment->nid, $comment, t('Save'));
+
+    $this->drupalGet('user/' . $this->user->uid . '/track');
+    $this->assertNoText($unpublished->title, "Unpublished nodes do not show up in the users's tracker listing.");
+    $this->assertText($my_published->title, "Published nodes show up in the user's tracker listing.");
+    $this->assertNoText($other_published_no_comment->title, "Other user's nodes do not show up in the user's tracker listing.");
+    $this->assertText($other_published_my_comment->title, "Nodes that the user has commented on appear in the user's tracker listing.");
+
+    // Verify that unpublished comments are removed from the tracker.
+    $admin_user = $this->drupalCreateUser(array('administer comments', 'access user profiles'));
+    $this->drupalLogin($admin_user);
+    $this->drupalPost('comment/1/edit', array('status' => COMMENT_NOT_PUBLISHED), t('Save'));
+    $this->drupalGet('user/' . $this->user->uid . '/track');
+    $this->assertNoText($other_published_my_comment->title, 'Unpublished comments are not counted on the tracker listing.');
+  }
+
+  /**
+   * Tests for the presence of the "new" flag for nodes.
+   */
+  function testTrackerNewNodes() {
+    $this->drupalLogin($this->user);
+
+    $edit = array(
+      'title' => $this->randomName(8),
+    );
+
+    $node = $this->drupalCreateNode($edit);
+    $title = $edit['title'];
+    $this->drupalGet('tracker');
+    $this->assertPattern('/' . $title . '.*new/', 'New nodes are flagged as such in the tracker listing.');
+
+    $this->drupalGet('node/' . $node->nid);
+    $this->drupalGet('tracker');
+    $this->assertNoPattern('/' . $title . '.*new/', 'Visited nodes are not flagged as new.');
+
+    $this->drupalLogin($this->other_user);
+    $this->drupalGet('tracker');
+    $this->assertPattern('/' . $title . '.*new/', 'For another user, new nodes are flagged as such in the tracker listing.');
+
+    $this->drupalGet('node/' . $node->nid);
+    $this->drupalGet('tracker');
+    $this->assertNoPattern('/' . $title . '.*new/', 'For another user, visited nodes are not flagged as new.');
+  }
+
+  /**
+   * Tests for comment counters on the tracker listing.
+   */
+  function testTrackerNewComments() {
+    $this->drupalLogin($this->user);
+
+    $node = $this->drupalCreateNode(array(
+      'comment' => 2,
+      'title' => array(LANGUAGE_NONE => array(array('value' => $this->randomName(8)))),
+    ));
+
+    // Add a comment to the page.
+    $comment = array(
+      'subject' => $this->randomName(),
+      'comment_body[' . LANGUAGE_NONE . '][0][value]' => $this->randomName(20),
+    );
+    // The new comment is automatically viewed by the current user.
+    $this->drupalPost('comment/reply/' . $node->nid, $comment, t('Save'));
+
+    $this->drupalLogin($this->other_user);
+    $this->drupalGet('tracker');
+    $this->assertText('1 new', 'New comments are counted on the tracker listing pages.');
+    $this->drupalGet('node/' . $node->nid);
+
+    // Add another comment as other_user.
+    $comment = array(
+      'subject' => $this->randomName(),
+      'comment_body[' . LANGUAGE_NONE . '][0][value]' => $this->randomName(20),
+    );
+    // If the comment is posted in the same second as the last one then Drupal
+    // can't tell the difference, so we wait one second here.
+    sleep(1);
+    $this->drupalPost('comment/reply/' . $node->nid, $comment, t('Save'));
+
+    $this->drupalLogin($this->user);
+    $this->drupalGet('tracker');
+    $this->assertText('1 new', 'New comments are counted on the tracker listing pages.');
+  }
+
+  /**
+   * Tests that existing nodes are indexed by cron.
+   */
+  function testTrackerCronIndexing() {
+    $this->drupalLogin($this->user);
+
+    // Create 3 nodes.
+    $edits = array();
+    $nodes = array();
+    for ($i = 1; $i <= 3; $i++) {
+      $edits[$i] = array(
+        'comment' => 2,
+        'title' => $this->randomName(),
+      );
+      $nodes[$i] = $this->drupalCreateNode($edits[$i]);
+    }
+
+    // Add a comment to the last node as other user.
+    $this->drupalLogin($this->other_user);
+    $comment = array(
+      'subject' => $this->randomName(),
+      'comment_body[' . LANGUAGE_NONE . '][0][value]' => $this->randomName(20),
+    );
+    $this->drupalPost('comment/reply/' . $nodes[3]->nid, $comment, t('Save'));
+
+    // Start indexing backwards from node 3.
+    variable_set('tracker_index_nid', 3);
+
+    // Clear the current tracker tables and rebuild them.
+    db_delete('tracker_node')
+      ->execute();
+    db_delete('tracker_user')
+      ->execute();
+    tracker_cron();
+
+    $this->drupalLogin($this->user);
+
+    // Fetch the user's tracker.
+    $this->drupalGet('tracker/' . $this->user->uid);
+
+    // Assert that all node titles are displayed.
+    foreach ($nodes as $i => $node) {
+      $this->assertText($node->title, format_string('Node @i is displayed on the tracker listing pages.', array('@i' => $i)));
+    }
+    $this->assertText('1 new', 'New comment is counted on the tracker listing pages.');
+    $this->assertText('updated', 'Node is listed as updated');
+
+    // Fetch the site-wide tracker.
+    $this->drupalGet('tracker');
+
+    // Assert that all node titles are displayed.
+    foreach ($nodes as $i => $node) {
+      $this->assertText($node->title, format_string('Node @i is displayed on the tracker listing pages.', array('@i' => $i)));
+    }
+    $this->assertText('1 new', 'New comment is counted on the tracker listing pages.');
+  }
+
+  /**
+   * Tests that publish/unpublish works at admin/content/node.
+   */
+  function testTrackerAdminUnpublish() {
+    $admin_user = $this->drupalCreateUser(array('access content overview', 'administer nodes', 'bypass node access'));
+    $this->drupalLogin($admin_user);
+
+    $node = $this->drupalCreateNode(array(
+      'comment' => 2,
+      'title' => $this->randomName(),
+    ));
+
+    // Assert that the node is displayed.
+    $this->drupalGet('tracker');
+    $this->assertText($node->title, 'Node is displayed on the tracker listing pages.');
+
+    // Unpublish the node and ensure that it's no longer displayed.
+    $edit = array(
+      'operation' => 'unpublish',
+      'nodes[' . $node->nid . ']' => $node->nid,
+    );
+    $this->drupalPost('admin/content', $edit, t('Update'));
+
+    $this->drupalGet('tracker');
+    $this->assertText(t('No content available.'), 'Node is displayed on the tracker listing pages.');
+  }
+}
diff --git a/htmltest/modules/translation/tests/translation_test.info b/htmltest/modules/translation/tests/translation_test.info
new file mode 100644
index 00000000..0adb8ad6
--- /dev/null
+++ b/htmltest/modules/translation/tests/translation_test.info
@@ -0,0 +1,12 @@
+name = "Content Translation Test"
+description = "Support module for the content translation tests."
+core = 7.x
+package = Testing
+version = VERSION
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/translation/tests/translation_test.module b/htmltest/modules/translation/tests/translation_test.module
new file mode 100644
index 00000000..e3bb4b5f
--- /dev/null
+++ b/htmltest/modules/translation/tests/translation_test.module
@@ -0,0 +1,13 @@
+<?php
+
+/**
+ * @file
+ * Mock module for content translation tests.
+ */
+
+/**
+ * Implements hook_node_insert().
+ */
+function translation_test_node_insert($node) {
+  drupal_write_record('node', $node, 'nid');
+}
diff --git a/htmltest/modules/translation/translation.info b/htmltest/modules/translation/translation.info
new file mode 100644
index 00000000..a2b82393
--- /dev/null
+++ b/htmltest/modules/translation/translation.info
@@ -0,0 +1,13 @@
+name = Content translation
+description = Allows content to be translated into different languages.
+dependencies[] = locale
+package = Core
+version = VERSION
+core = 7.x
+files[] = translation.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/translation/translation.module b/htmltest/modules/translation/translation.module
new file mode 100644
index 00000000..33123570
--- /dev/null
+++ b/htmltest/modules/translation/translation.module
@@ -0,0 +1,551 @@
+<?php
+
+/**
+ * @file
+ * Manages content translations.
+ *
+ * Translations are managed in sets of posts, which represent the same
+ * information in different languages. Only content types for which the
+ * administrator has explicitly enabled translations could have translations
+ * associated. Translations are managed in sets with exactly one source post
+ * per set. The source post is used to translate to different languages, so if
+ * the source post is significantly updated, the editor can decide to mark all
+ * translations outdated.
+ *
+ * The node table stores the values used by this module:
+ * - tnid: Integer for the translation set ID, which equals the node ID of the
+ *   source post.
+ * - translate: Integer flag, either indicating that the translation is up to
+ *   date (0) or needs to be updated (1).
+ */
+
+/**
+ * Identifies a content type which has translation support enabled.
+ */
+define('TRANSLATION_ENABLED', 2);
+
+/**
+ * Implements hook_help().
+ */
+function translation_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#translation':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Content translation module allows content to be translated into different languages. Working with the <a href="@locale">Locale module</a> (which manages enabled languages and provides translation for the site interface), the Content translation module is key to creating and maintaining translated site content. For more information, see the online handbook entry for <a href="@translation">Content translation module</a>.', array('@locale' => url('admin/help/locale'), '@translation' => 'http://drupal.org/documentation/modules/translation/')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Configuring content types for translation') . '</dt>';
+      $output .= '<dd>' . t('To configure a particular content type for translation, visit the <a href="@content-types">Content types</a> page, and click the <em>edit</em> link for the content type. In the <em>Publishing options</em> section, select <em>Enabled, with translation</em> under <em>Multilingual support</em>.', array('@content-types' => url('admin/structure/types'))) . '</dd>';
+      $output .= '<dt>' . t('Assigning a language to content') . '</dt>';
+      $output .= '<dd>' . t('Use the <em>Language</em> drop down to select the appropriate language when creating or editing content.') . '</dd>';
+      $output .= '<dt>' . t('Translating content') . '</dt>';
+      $output .= '<dd>' . t('Users with the <em>translate content</em> permission can translate content, if the content type has been configured to allow translations. To translate content, select the <em>Translation</em> tab when viewing the content, select the language for which you wish to provide content, and then enter the content.') . '</dd>';
+      $output .= '<dt>' . t('Maintaining translations') . '</dt>';
+      $output .= '<dd>' . t('If editing content in one language requires that translated versions also be updated to reflect the change, use the <em>Flag translations as outdated</em> check box to mark the translations as outdated and in need of revision. Individual translations may also be marked for revision by selecting the <em>This translation needs to be updated</em> check box on the translation editing form.') . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'node/%/translate':
+      $output = '<p>' . t('Translations of a piece of content are managed with translation sets. Each translation set has one source post and any number of translations in any of the <a href="!languages">enabled languages</a>. All translations are tracked to be up to date or outdated based on whether the source post was modified significantly.', array('!languages' => url('admin/config/regional/language'))) . '</p>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function translation_menu() {
+  $items = array();
+  $items['node/%node/translate'] = array(
+    'title' => 'Translate',
+    'page callback' => 'translation_node_overview',
+    'page arguments' => array(1),
+    'access callback' => '_translation_tab_access',
+    'access arguments' => array(1),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 2,
+    'file' => 'translation.pages.inc',
+  );
+  return $items;
+}
+
+/**
+ * Access callback: Checks that the user has permission to 'translate content'.
+ *
+ * Only displays the translation tab for nodes that are not language-neutral
+ * of types that have translation enabled.
+ *
+ * @param $node
+ *   A node object.
+ *
+ * @return
+ *   TRUE if the translation tab should be displayed, FALSE otherwise.
+ *
+ * @see translation_menu()
+ */
+function _translation_tab_access($node) {
+  if (entity_language('node', $node) != LANGUAGE_NONE && translation_supported_type($node->type) && node_access('view', $node)) {
+    return user_access('translate content');
+  }
+  return FALSE;
+}
+
+/**
+ * Implements hook_admin_paths().
+ */
+function translation_admin_paths() {
+  if (variable_get('node_admin_theme')) {
+    $paths = array(
+      'node/*/translate' => TRUE,
+    );
+    return $paths;
+  }
+}
+
+/**
+ * Implements hook_permission().
+ */
+function translation_permission() {
+  return array(
+    'translate content' => array(
+      'title' => t('Translate content'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter() for node_type_form().
+ */
+function translation_form_node_type_form_alter(&$form, &$form_state) {
+  // Add translation option to content type form.
+  $form['workflow']['language_content_type']['#options'][TRANSLATION_ENABLED] = t('Enabled, with translation');
+  // Description based on text from locale.module.
+  $form['workflow']['language_content_type']['#description'] = t('Enable multilingual support for this content type. If enabled, a language selection field will be added to the editing form, allowing you to select from one of the <a href="!languages">enabled languages</a>. You can also turn on translation for this content type, which lets you have content translated to any of the installed languages. If disabled, new posts are saved with the default language. Existing content will not be affected by changing this option.', array('!languages' => url('admin/config/regional/language')));
+}
+
+/**
+ * Implements hook_form_BASE_FORM_ID_alter() for node_form().
+ *
+ * Alters language fields on node edit forms when a translation is about to be
+ * created.
+ *
+ * @see node_form()
+ */
+function translation_form_node_form_alter(&$form, &$form_state) {
+  if (translation_supported_type($form['#node']->type)) {
+    $node = $form['#node'];
+    $languages = language_list('enabled');
+    $disabled_languages = isset($languages[0]) ? $languages[0] : FALSE;
+    $translator_widget = $disabled_languages && user_access('translate content');
+    $groups = array(t('Disabled'), t('Enabled'));
+    // Allow translators to enter content in disabled languages. Translators
+    // might need to distinguish between enabled and disabled languages, hence
+    // we divide them in two option groups.
+    if ($translator_widget) {
+      $options = array($groups[1] => array(LANGUAGE_NONE => t('Language neutral')));
+      $language_list = locale_language_list('name', TRUE);
+      foreach (array(1, 0) as $status) {
+        $group = $groups[$status];
+        foreach ($languages[$status] as $langcode => $language) {
+          $options[$group][$langcode] = $language_list[$langcode];
+        }
+      }
+      $form['language']['#options'] = $options;
+    }
+    if (!empty($node->translation_source)) {
+      // We are creating a translation. Add values and lock language field.
+      $form['translation_source'] = array('#type' => 'value', '#value' => $node->translation_source);
+      $form['language']['#disabled'] = TRUE;
+    }
+    elseif (!empty($node->nid) && !empty($node->tnid)) {
+      // Disable languages for existing translations, so it is not possible to switch this
+      // node to some language which is already in the translation set. Also remove the
+      // language neutral option.
+      unset($form['language']['#options'][LANGUAGE_NONE]);
+      foreach (translation_node_get_translations($node->tnid) as $langcode => $translation) {
+        if ($translation->nid != $node->nid) {
+          if ($translator_widget) {
+            $group = $groups[(int)!isset($disabled_languages[$langcode])];
+            unset($form['language']['#options'][$group][$langcode]);
+          }
+          else {
+            unset($form['language']['#options'][$langcode]);
+          }
+        }
+      }
+      // Add translation values and workflow options.
+      $form['tnid'] = array('#type' => 'value', '#value' => $node->tnid);
+      $form['translation'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('Translation settings'),
+        '#access' => user_access('translate content'),
+        '#collapsible' => TRUE,
+        '#collapsed' => !$node->translate,
+        '#tree' => TRUE,
+        '#weight' => 30,
+      );
+      if ($node->tnid == $node->nid) {
+        // This is the source node of the translation
+        $form['translation']['retranslate'] = array(
+          '#type' => 'checkbox',
+          '#title' => t('Flag translations as outdated'),
+          '#default_value' => 0,
+          '#description' => t('If you made a significant change, which means translations should be updated, you can flag all translations of this post as outdated. This will not change any other property of those posts, like whether they are published or not.'),
+        );
+        $form['translation']['status'] = array('#type' => 'value', '#value' => 0);
+      }
+      else {
+        $form['translation']['status'] = array(
+          '#type' => 'checkbox',
+          '#title' => t('This translation needs to be updated'),
+          '#default_value' => $node->translate,
+          '#description' => t('When this option is checked, this translation needs to be updated because the source post has changed. Uncheck when the translation is up to date again.'),
+        );
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_node_view().
+ *
+ * Displays translation links with language names if this node is part of a
+ * translation set. If no language provider is enabled, "fall back" to simple
+ * links built through the result of translation_node_get_translations().
+ */
+function translation_node_view($node, $view_mode) {
+  // If the site has no translations or is not multilingual we have no content
+  // translation links to display.
+  if (isset($node->tnid) && drupal_multilingual() && $translations = translation_node_get_translations($node->tnid)) {
+    $languages = language_list('enabled');
+    $languages = $languages[1];
+
+    // There might be a language provider enabled defining custom language
+    // switch links which need to be taken into account while generating the
+    // content translation links. As custom language switch links are available
+    // only for configurable language types and interface language is the only
+    // configurable language type in core, we use it as default. Contributed
+    // modules can change this behavior by setting the system variable below.
+    $type = variable_get('translation_language_type', LANGUAGE_TYPE_INTERFACE);
+    $custom_links = language_negotiation_get_switch_links($type, "node/$node->nid");
+    $links = array();
+
+    foreach ($translations as $langcode => $translation) {
+      // Do not show links to the same node, to unpublished translations or to
+      // translations in disabled languages.
+      if ($translation->status && isset($languages[$langcode]) && $langcode != entity_language('node', $node)) {
+        $language = $languages[$langcode];
+        $key = "translation_$langcode";
+
+        if (isset($custom_links->links[$langcode])) {
+          $links[$key] = $custom_links->links[$langcode];
+        }
+        else {
+          $links[$key] = array(
+            'href' => "node/{$translation->nid}",
+            'title' => $language->native,
+            'language' => $language,
+          );
+        }
+
+        // Custom switch links are more generic than content translation links,
+        // hence we override existing attributes with the ones below.
+        $links[$key] += array('attributes' => array());
+        $attributes = array(
+          'title' => $translation->title,
+          'class' => array('translation-link'),
+        );
+        $links[$key]['attributes'] = $attributes + $links[$key]['attributes'];
+      }
+    }
+
+    $node->content['links']['translation'] = array(
+      '#theme' => 'links__node__translation',
+      '#links' => $links,
+      '#attributes' => array('class' => array('links', 'inline')),
+    );
+  }
+}
+
+/**
+ * Implements hook_node_prepare().
+ */
+function translation_node_prepare($node) {
+  // Only act if we are dealing with a content type supporting translations.
+  if (translation_supported_type($node->type) &&
+    // And it's a new node.
+    empty($node->nid) &&
+    // And the user has permission to translate content.
+    user_access('translate content') &&
+    // And the $_GET variables are set properly.
+    isset($_GET['translation']) &&
+    isset($_GET['target']) &&
+    is_numeric($_GET['translation'])) {
+
+    $source_node = node_load($_GET['translation']);
+    if (empty($source_node) || !node_access('view', $source_node)) {
+      // Source node not found or no access to view. We should not check
+      // for edit access, since the translator might not have permissions
+      // to edit the source node but should still be able to translate.
+      return;
+    }
+
+    $language_list = language_list();
+    $langcode = $_GET['target'];
+    if (!isset($language_list[$langcode]) || ($source_node->language == $langcode)) {
+      // If not supported language, or same language as source node, break.
+      return;
+    }
+
+    // Ensure we don't have an existing translation in this language.
+    if (!empty($source_node->tnid)) {
+      $translations = translation_node_get_translations($source_node->tnid);
+      if (isset($translations[$langcode])) {
+        drupal_set_message(t('A translation of %title in %language already exists, a new %type will be created instead of a translation.', array('%title' => $source_node->title, '%language' => $language_list[$langcode]->name, '%type' => $node->type)), 'error');
+        return;
+      }
+    }
+
+    // Populate fields based on source node.
+    $node->language = $langcode;
+    $node->translation_source = $source_node;
+    $node->title = $source_node->title;
+
+    // Add field translations and let other modules module add custom translated
+    // fields.
+    field_attach_prepare_translation('node', $node, $langcode, $source_node, $source_node->language);
+  }
+}
+
+/**
+ * Implements hook_node_insert().
+ */
+function translation_node_insert($node) {
+  // Only act if we are dealing with a content type supporting translations.
+  if (translation_supported_type($node->type)) {
+    if (!empty($node->translation_source)) {
+      if ($node->translation_source->tnid) {
+        // Add node to existing translation set.
+        $tnid = $node->translation_source->tnid;
+      }
+      else {
+        // Create new translation set, using nid from the source node.
+        $tnid = $node->translation_source->nid;
+        db_update('node')
+          ->fields(array(
+            'tnid' => $tnid,
+            'translate' => 0,
+          ))
+          ->condition('nid', $node->translation_source->nid)
+          ->execute();
+      }
+      db_update('node')
+        ->fields(array(
+          'tnid' => $tnid,
+          'translate' => 0,
+        ))
+        ->condition('nid', $node->nid)
+        ->execute();
+      // Save tnid to avoid loss in case of resave.
+      $node->tnid = $tnid;
+    }
+  }
+}
+
+/**
+ * Implements hook_node_update().
+ */
+function translation_node_update($node) {
+  // Only act if we are dealing with a content type supporting translations.
+  if (translation_supported_type($node->type)) {
+    $langcode = entity_language('node', $node);
+    if (isset($node->translation) && $node->translation && !empty($langcode) && $node->tnid) {
+      // Update translation information.
+      db_update('node')
+        ->fields(array(
+          'tnid' => $node->tnid,
+          'translate' => $node->translation['status'],
+        ))
+        ->condition('nid', $node->nid)
+        ->execute();
+      if (!empty($node->translation['retranslate'])) {
+        // This is the source node, asking to mark all translations outdated.
+        db_update('node')
+          ->fields(array('translate' => 1))
+          ->condition('nid', $node->nid, '<>')
+          ->condition('tnid', $node->tnid)
+          ->execute();
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_node_validate().
+ *
+ * Ensures that duplicate translations can't be created for the same source.
+ */
+function translation_node_validate($node, $form) {
+  // Only act on translatable nodes with a tnid or translation_source.
+  if (translation_supported_type($node->type) && (!empty($node->tnid) || !empty($form['#node']->translation_source->nid))) {
+    $tnid = !empty($node->tnid) ? $node->tnid : $form['#node']->translation_source->nid;
+    $translations = translation_node_get_translations($tnid);
+    $langcode = entity_language('node', $node);
+    if (isset($translations[$langcode]) && $translations[$langcode]->nid != $node->nid ) {
+      form_set_error('language', t('There is already a translation in this language.'));
+    }
+  }
+}
+
+/**
+ * Implements hook_node_delete().
+ */
+function translation_node_delete($node) {
+  // Only act if we are dealing with a content type supporting translations.
+  if (translation_supported_type($node->type)) {
+    translation_remove_from_set($node);
+  }
+}
+
+/**
+ * Removes a node from its translation set and updates accordingly.
+ *
+ * @param $node
+ *   A node object.
+ */
+function translation_remove_from_set($node) {
+  if (isset($node->tnid)) {
+    $query = db_update('node')
+      ->fields(array(
+        'tnid' => 0,
+        'translate' => 0,
+      ));
+    if (db_query('SELECT COUNT(*) FROM {node} WHERE tnid = :tnid', array(':tnid' => $node->tnid))->fetchField() == 1) {
+      // There is only one node left in the set: remove the set altogether.
+      $query
+        ->condition('tnid', $node->tnid)
+        ->execute();
+    }
+    else {
+      $query
+        ->condition('nid', $node->nid)
+        ->execute();
+
+      // If the node being removed was the source of the translation set,
+      // we pick a new source - preferably one that is up to date.
+      if ($node->tnid == $node->nid) {
+        $new_tnid = db_query('SELECT nid FROM {node} WHERE tnid = :tnid ORDER BY translate ASC, nid ASC', array(':tnid' => $node->tnid))->fetchField();
+        db_update('node')
+          ->fields(array('tnid' => $new_tnid))
+          ->condition('tnid', $node->tnid)
+          ->execute();
+      }
+    }
+  }
+}
+
+/**
+ * Gets all nodes in a given translation set.
+ *
+ * @param $tnid
+ *   The translation source nid of the translation set, the identifier of the
+ *   node used to derive all translations in the set.
+ *
+ * @return
+ *   Array of partial node objects (nid, title, language) representing all
+ *   nodes in the translation set, in effect all translations of node $tnid,
+ *   including node $tnid itself. Because these are partial nodes, you need to
+ *   node_load() the full node, if you need more properties. The array is
+ *   indexed by language code.
+ */
+function translation_node_get_translations($tnid) {
+  if (is_numeric($tnid) && $tnid) {
+    $translations = &drupal_static(__FUNCTION__, array());
+
+    if (!isset($translations[$tnid])) {
+      $translations[$tnid] = array();
+      $result = db_select('node', 'n')
+        ->fields('n', array('nid', 'type', 'uid', 'status', 'title', 'language'))
+        ->condition('n.tnid', $tnid)
+        ->addTag('node_access')
+        ->execute();
+
+      foreach ($result as $node) {
+        $langcode = entity_language('node', $node);
+        $translations[$tnid][$langcode] = $node;
+      }
+    }
+    return $translations[$tnid];
+  }
+}
+
+/**
+ * Returns whether the given content type has support for translations.
+ *
+ * @return
+ *   TRUE if translation is supported, and FALSE if not.
+ */
+function translation_supported_type($type) {
+  return variable_get('language_content_type_' . $type, 0) == TRANSLATION_ENABLED;
+}
+
+/**
+ * Returns the paths of all translations of a node, based on its Drupal path.
+ *
+ * @param $path
+ *   A Drupal path, for example node/432.
+ *
+ * @return
+ *   An array of paths of translations of the node accessible to the current
+ *   user, keyed with language codes.
+ */
+function translation_path_get_translations($path) {
+  $paths = array();
+  // Check for a node related path, and for its translations.
+  if ((preg_match("!^node/(\d+)(/.+|)$!", $path, $matches)) && ($node = node_load((int) $matches[1])) && !empty($node->tnid)) {
+    foreach (translation_node_get_translations($node->tnid) as $language => $translation_node) {
+      $paths[$language] = 'node/' . $translation_node->nid . $matches[2];
+    }
+  }
+  return $paths;
+}
+
+/**
+ * Implements hook_language_switch_links_alter().
+ *
+ * Replaces links with pointers to translated versions of the content.
+ */
+function translation_language_switch_links_alter(array &$links, $type, $path) {
+  $language_type = variable_get('translation_language_type', LANGUAGE_TYPE_INTERFACE);
+
+  if ($type == $language_type && preg_match("!^node/(\d+)(/.+|)!", $path, $matches)) {
+    $node = node_load((int) $matches[1]);
+
+    if (empty($node->tnid)) {
+      // If the node cannot be found nothing needs to be done. If it does not
+      // have translations it might be a language neutral node, in which case we
+      // must leave the language switch links unaltered. This is true also for
+      // nodes not having translation support enabled.
+      if (empty($node) || entity_language('node', $node) == LANGUAGE_NONE || !translation_supported_type($node->type)) {
+        return;
+      }
+      $langcode = entity_language('node', $node);
+      $translations = array($langcode => $node);
+    }
+    else {
+      $translations = translation_node_get_translations($node->tnid);
+    }
+
+    foreach ($links as $langcode => $link) {
+      if (isset($translations[$langcode]) && $translations[$langcode]->status) {
+        // Translation in a different node.
+        $links[$langcode]['href'] = 'node/' . $translations[$langcode]->nid . $matches[2];
+      }
+      else {
+        // No translation in this language, or no permission to view.
+        unset($links[$langcode]['href']);
+        $links[$langcode]['attributes']['class'][] = 'locale-untranslated';
+      }
+    }
+  }
+}
diff --git a/htmltest/modules/translation/translation.pages.inc b/htmltest/modules/translation/translation.pages.inc
new file mode 100644
index 00000000..110fea60
--- /dev/null
+++ b/htmltest/modules/translation/translation.pages.inc
@@ -0,0 +1,82 @@
+<?php
+
+/**
+ * @file
+ * User page callbacks for the Translation module.
+ */
+
+/**
+ * Page callback: Displays a list of a node's translations.
+ *
+ * @param $node
+ *   A node object.
+ *
+ * @return
+ *   A render array for a page containing a list of content.
+ *
+ * @see translation_menu()
+ */
+function translation_node_overview($node) {
+  include_once DRUPAL_ROOT . '/includes/language.inc';
+
+  if ($node->tnid) {
+    // Already part of a set, grab that set.
+    $tnid = $node->tnid;
+    $translations = translation_node_get_translations($node->tnid);
+  }
+  else {
+    // We have no translation source nid, this could be a new set, emulate that.
+    $tnid = $node->nid;
+    $translations = array(entity_language('node', $node) => $node);
+  }
+
+  $type = variable_get('translation_language_type', LANGUAGE_TYPE_INTERFACE);
+  $header = array(t('Language'), t('Title'), t('Status'), t('Operations'));
+
+  foreach (language_list() as $langcode => $language) {
+    $options = array();
+    $language_name = $language->name;
+    if (isset($translations[$langcode])) {
+      // Existing translation in the translation set: display status.
+      // We load the full node to check whether the user can edit it.
+      $translation_node = node_load($translations[$langcode]->nid);
+      $path = 'node/' . $translation_node->nid;
+      $links = language_negotiation_get_switch_links($type, $path);
+      $title = empty($links->links[$langcode]['href']) ? l($translation_node->title, $path) : l($translation_node->title, $links->links[$langcode]['href'], $links->links[$langcode]);
+      if (node_access('update', $translation_node)) {
+        $text = t('edit');
+        $path = 'node/' . $translation_node->nid . '/edit';
+        $links = language_negotiation_get_switch_links($type, $path);
+        $options[] = empty($links->links[$langcode]['href']) ? l($text, $path) : l($text, $links->links[$langcode]['href'], $links->links[$langcode]);
+      }
+      $status = $translation_node->status ? t('Published') : t('Not published');
+      $status .= $translation_node->translate ? ' - <span class="marker">' . t('outdated') . '</span>' : '';
+      if ($translation_node->nid == $tnid) {
+        $language_name = t('<strong>@language_name</strong> (source)', array('@language_name' => $language_name));
+      }
+    }
+    else {
+      // No such translation in the set yet: help user to create it.
+      $title = t('n/a');
+      if (node_access('create', $node)) {
+        $text = t('add translation');
+        $path = 'node/add/' . str_replace('_', '-', $node->type);
+        $links = language_negotiation_get_switch_links($type, $path);
+        $query = array('query' => array('translation' => $node->nid, 'target' => $langcode));
+        $options[] = empty($links->links[$langcode]['href']) ? l($text, $path, $query) : l($text, $links->links[$langcode]['href'], array_merge_recursive($links->links[$langcode], $query));
+      }
+      $status = t('Not translated');
+    }
+    $rows[] = array($language_name, $title, $status, implode(" | ", $options));
+  }
+
+  drupal_set_title(t('Translations of %title', array('%title' => $node->title)), PASS_THROUGH);
+
+  $build['translation_node_overview'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+  );
+
+  return $build;
+}
diff --git a/htmltest/modules/translation/translation.test b/htmltest/modules/translation/translation.test
new file mode 100644
index 00000000..4d272f3e
--- /dev/null
+++ b/htmltest/modules/translation/translation.test
@@ -0,0 +1,492 @@
+<?php
+
+/**
+ * @file
+ * Tests for the Translation module.
+ */
+
+/**
+ * Functional tests for the Translation module.
+ */
+class TranslationTestCase extends DrupalWebTestCase {
+  protected $book;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Translation functionality',
+      'description' => 'Create a basic page with translation, modify the page outdating translation, and update translation.',
+      'group' => 'Translation'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('locale', 'translation', 'translation_test');
+
+    // Setup users.
+    $this->admin_user = $this->drupalCreateUser(array('bypass node access', 'administer nodes', 'administer languages', 'administer content types', 'administer blocks', 'access administration pages', 'translate content'));
+    $this->translator = $this->drupalCreateUser(array('create page content', 'edit own page content', 'translate content'));
+
+    $this->drupalLogin($this->admin_user);
+
+    // Add languages.
+    $this->addLanguage('en');
+    $this->addLanguage('es');
+    $this->addLanguage('it');
+
+    // Disable Italian to test the translation behavior with disabled languages.
+    $edit = array('enabled[it]' => FALSE);
+    $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
+
+    // Set "Basic page" content type to use multilingual support with
+    // translation.
+    $this->drupalGet('admin/structure/types/manage/page');
+    $edit = array();
+    $edit['language_content_type'] = 2;
+    $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
+    $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), 'Basic page content type has been updated.');
+
+    // Enable the language switcher block.
+    $language_type = LANGUAGE_TYPE_INTERFACE;
+    $edit = array("blocks[locale_$language_type][region]" => 'sidebar_first');
+    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
+
+    // Enable URL language detection and selection to make the language switcher
+    // block appear.
+    $edit = array('language[enabled][locale-url]' => TRUE);
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+    $this->assertRaw(t('Language negotiation configuration saved.'), 'URL language detection enabled.');
+    $this->resetCaches();
+
+    $this->drupalLogin($this->translator);
+  }
+
+  /**
+   * Creates, modifies, and updates a basic page with a translation.
+   */
+  function testContentTranslation() {
+    // Create Basic page in English.
+    $node_title = $this->randomName();
+    $node_body =  $this->randomName();
+    $node = $this->createPage($node_title, $node_body, 'en');
+
+    // Unpublish the original node to check that this has no impact on the
+    // translation overview page, publish it again afterwards.
+    $this->drupalLogin($this->admin_user);
+    $this->drupalPost('node/' . $node->nid . '/edit', array('status' => FALSE), t('Save'));
+    $this->drupalGet('node/' . $node->nid . '/translate');
+    $this->drupalPost('node/' . $node->nid . '/edit', array('status' => NODE_PUBLISHED), t('Save'));
+    $this->drupalLogin($this->translator);
+
+    // Check that the "add translation" link uses a localized path.
+    $languages = language_list();
+    $this->drupalGet('node/' . $node->nid . '/translate');
+    $this->assertLinkByHref($languages['es']->prefix . '/node/add/' . str_replace('_', '-', $node->type), 0, format_string('The "add translation" link for %language points to the localized path of the target language.', array('%language' => $languages['es']->name)));
+
+    // Submit translation in Spanish.
+    $node_translation_title = $this->randomName();
+    $node_translation_body = $this->randomName();
+    $node_translation = $this->createTranslation($node, $node_translation_title, $node_translation_body, 'es');
+
+    // Check that the "edit translation" and "view node" links use localized
+    // paths.
+    $this->drupalGet('node/' . $node->nid . '/translate');
+    $this->assertLinkByHref($languages['es']->prefix . '/node/' . $node_translation->nid . '/edit', 0, format_string('The "edit" link for the translation in %language points to the localized path of the translation language.', array('%language' => $languages['es']->name)));
+    $this->assertLinkByHref($languages['es']->prefix . '/node/' . $node_translation->nid, 0, format_string('The "view" link for the translation in %language points to the localized path of the translation language.', array('%language' => $languages['es']->name)));
+
+    // Attempt to submit a duplicate translation by visiting the node/add page
+    // with identical query string.
+    $this->drupalGet('node/add/page', array('query' => array('translation' => $node->nid, 'target' => 'es')));
+    $this->assertRaw(t('A translation of %title in %language already exists', array('%title' => $node_title, '%language' => $languages['es']->name)), 'Message regarding attempted duplicate translation is displayed.');
+
+    // Attempt a resubmission of the form - this emulates using the back button
+    // to return to the page then resubmitting the form without a refresh.
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = $this->randomName();
+    $edit["body[$langcode][0][value]"] = $this->randomName();
+    $this->drupalPost('node/add/page', $edit, t('Save'), array('query' => array('translation' => $node->nid, 'language' => 'es')));
+    $duplicate = $this->drupalGetNodeByTitle($edit["title"]);
+    $this->assertEqual($duplicate->tnid, 0, 'The node does not have a tnid.');
+
+    // Update original and mark translation as outdated.
+    $node_body = $this->randomName();
+    $node->body[LANGUAGE_NONE][0]['value'] = $node_body;
+    $edit = array();
+    $edit["body[$langcode][0][value]"] = $node_body;
+    $edit['translation[retranslate]'] = TRUE;
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->assertRaw(t('Basic page %title has been updated.', array('%title' => $node_title)), 'Original node updated.');
+
+    // Check to make sure that interface shows translation as outdated.
+    $this->drupalGet('node/' . $node->nid . '/translate');
+    $this->assertRaw('<span class="marker">' . t('outdated') . '</span>', 'Translation marked as outdated.');
+
+    // Update translation and mark as updated.
+    $edit = array();
+    $edit["body[$langcode][0][value]"] = $this->randomName();
+    $edit['translation[status]'] = FALSE;
+    $this->drupalPost('node/' . $node_translation->nid . '/edit', $edit, t('Save'));
+    $this->assertRaw(t('Basic page %title has been updated.', array('%title' => $node_translation_title)), 'Translated node updated.');
+
+    // Confirm that disabled languages are an option for translators when
+    // creating nodes.
+    $this->drupalGet('node/add/page');
+    $this->assertFieldByXPath('//select[@name="language"]//option', 'it', 'Italian (disabled) is available in language selection.');
+    $translation_it = $this->createTranslation($node, $this->randomName(), $this->randomName(), 'it');
+    $this->assertRaw($translation_it->body[LANGUAGE_NONE][0]['value'], 'Content created in Italian (disabled).');
+
+    // Confirm that language neutral is an option for translators when there are
+    // disabled languages.
+    $this->drupalGet('node/add/page');
+    $this->assertFieldByXPath('//select[@name="language"]//option', LANGUAGE_NONE, 'Language neutral is available in language selection with disabled languages.');
+    $node2 = $this->createPage($this->randomName(), $this->randomName(), LANGUAGE_NONE);
+    $this->assertRaw($node2->body[LANGUAGE_NONE][0]['value'], 'Language neutral content created with disabled languages available.');
+
+    // Leave just one language enabled and check that the translation overview
+    // page is still accessible.
+    $this->drupalLogin($this->admin_user);
+    $edit = array('enabled[es]' => FALSE);
+    $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
+    $this->drupalLogin($this->translator);
+    $this->drupalGet('node/' . $node->nid . '/translate');
+    $this->assertRaw(t('Translations of %title', array('%title' => $node->title)), 'Translation overview page available with only one language enabled.');
+  }
+
+  /**
+   * Checks that the language switch links behave properly.
+   */
+  function testLanguageSwitchLinks() {
+    // Create a Basic page in English and its translations in Spanish and
+    // Italian.
+    $node = $this->createPage($this->randomName(), $this->randomName(), 'en');
+    $translation_es = $this->createTranslation($node, $this->randomName(), $this->randomName(), 'es');
+    $translation_it = $this->createTranslation($node, $this->randomName(), $this->randomName(), 'it');
+
+    // Check that language switch links are correctly shown only for enabled
+    // languages.
+    $this->assertLanguageSwitchLinks($node, $translation_es);
+    $this->assertLanguageSwitchLinks($translation_es, $node);
+    $this->assertLanguageSwitchLinks($node, $translation_it, FALSE);
+
+    // Check that links to the displayed translation appear only in the language
+    // switcher block.
+    $this->assertLanguageSwitchLinks($node, $node, FALSE, 'node');
+    $this->assertLanguageSwitchLinks($node, $node, TRUE, 'block-locale');
+
+    // Unpublish the Spanish translation to check that the related language
+    // switch link is not shown.
+    $this->drupalLogin($this->admin_user);
+    $edit = array('status' => FALSE);
+    $this->drupalPost("node/$translation_es->nid/edit", $edit, t('Save'));
+    $this->drupalLogin($this->translator);
+    $this->assertLanguageSwitchLinks($node, $translation_es, FALSE);
+
+    // Check that content translation links are shown even when no language
+    // negotiation is configured.
+    $this->drupalLogin($this->admin_user);
+    $edit = array('language[enabled][locale-url]' => FALSE);
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+    $this->resetCaches();
+    $edit = array('status' => TRUE);
+    $this->drupalPost("node/$translation_es->nid/edit", $edit, t('Save'));
+    $this->drupalLogin($this->translator);
+    $this->assertLanguageSwitchLinks($node, $translation_es, TRUE, 'node');
+  }
+
+  /**
+   * Tests that the language switcher block alterations work as intended.
+   */
+  function testLanguageSwitcherBlockIntegration() {
+    // Enable Italian to have three items in the language switcher block.
+    $this->drupalLogin($this->admin_user);
+    $edit = array('enabled[it]' => TRUE);
+    $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
+    $this->drupalLogin($this->translator);
+
+    // Create a Basic page in English.
+    $type = 'block-locale';
+    $node = $this->createPage($this->randomName(), $this->randomName(), 'en');
+    $this->assertLanguageSwitchLinks($node, $node, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $this->emptyNode('es'), TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $this->emptyNode('it'), TRUE, $type);
+
+    // Create the Spanish translation.
+    $translation_es = $this->createTranslation($node, $this->randomName(), $this->randomName(), 'es');
+    $this->assertLanguageSwitchLinks($node, $node, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $translation_es, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $this->emptyNode('it'), TRUE, $type);
+
+    // Create the Italian translation.
+    $translation_it = $this->createTranslation($node, $this->randomName(), $this->randomName(), 'it');
+    $this->assertLanguageSwitchLinks($node, $node, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $translation_es, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $translation_it, TRUE, $type);
+
+    // Create a language neutral node and check that the language switcher is
+    // left untouched.
+    $node2 = $this->createPage($this->randomName(), $this->randomName(), LANGUAGE_NONE);
+    $node2_en = (object) array('nid' => $node2->nid, 'language' => 'en');
+    $node2_es = (object) array('nid' => $node2->nid, 'language' => 'es');
+    $node2_it = (object) array('nid' => $node2->nid, 'language' => 'it');
+    $this->assertLanguageSwitchLinks($node2_en, $node2_en, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node2_en, $node2_es, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node2_en, $node2_it, TRUE, $type);
+
+    // Disable translation support to check that the language switcher is left
+    // untouched only for new nodes.
+    $this->drupalLogin($this->admin_user);
+    $edit = array('language_content_type' => 0);
+    $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
+    $this->drupalLogin($this->translator);
+
+    // Existing translations trigger alterations even if translation support is
+    // disabled.
+    $this->assertLanguageSwitchLinks($node, $node, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $translation_es, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $translation_it, TRUE, $type);
+
+    // Check that new nodes with a language assigned do not trigger language
+    // switcher alterations when translation support is disabled.
+    $node = $this->createPage($this->randomName(), $this->randomName());
+    $node_es = (object) array('nid' => $node->nid, 'language' => 'es');
+    $node_it = (object) array('nid' => $node->nid, 'language' => 'it');
+    $this->assertLanguageSwitchLinks($node, $node, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $node_es, TRUE, $type);
+    $this->assertLanguageSwitchLinks($node, $node_it, TRUE, $type);
+  }
+
+  /**
+   * Resets static caches to make the test code match the client-side behavior.
+   */
+  function resetCaches() {
+    drupal_static_reset('locale_url_outbound_alter');
+  }
+
+  /**
+   * Returns an empty node data structure.
+   *
+   * @param $langcode
+   *   The language code.
+   *
+   * @return
+   *   An empty node data structure.
+   */
+  function emptyNode($langcode) {
+    return (object) array('nid' => NULL, 'language' => $langcode);
+  }
+
+  /**
+   * Installs the specified language, or enables it if it is already installed.
+   *
+   * @param $language_code
+   *   The language code to check.
+   */
+  function addLanguage($language_code) {
+    // Check to make sure that language has not already been installed.
+    $this->drupalGet('admin/config/regional/language');
+
+    if (strpos($this->drupalGetContent(), 'enabled[' . $language_code . ']') === FALSE) {
+      // Doesn't have language installed so add it.
+      $edit = array();
+      $edit['langcode'] = $language_code;
+      $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+      // Make sure we are not using a stale list.
+      drupal_static_reset('language_list');
+      $languages = language_list('language');
+      $this->assertTrue(array_key_exists($language_code, $languages), 'Language was installed successfully.');
+
+      if (array_key_exists($language_code, $languages)) {
+        $this->assertRaw(t('The language %language has been created and can now be used. More information is available on the <a href="@locale-help">help screen</a>.', array('%language' => $languages[$language_code]->name, '@locale-help' => url('admin/help/locale'))), 'Language has been created.');
+      }
+    }
+    elseif ($this->xpath('//input[@type="checkbox" and @name=:name and @checked="checked"]', array(':name' => 'enabled[' . $language_code . ']'))) {
+      // It's installed and enabled. No need to do anything.
+      $this->assertTrue(true, 'Language [' . $language_code . '] already installed and enabled.');
+    }
+    else {
+      // It's installed but not enabled. Enable it.
+      $this->assertTrue(true, 'Language [' . $language_code . '] already installed.');
+      $this->drupalPost(NULL, array('enabled[' . $language_code . ']' => TRUE), t('Save configuration'));
+      $this->assertRaw(t('Configuration saved.'), 'Language successfully enabled.');
+    }
+  }
+
+  /**
+   * Creates a "Basic page" in the specified language.
+   *
+   * @param $title
+   *   The title of a basic page in the specified language.
+   * @param $body
+   *   The body of a basic page in the specified language.
+   * @param $language
+   *   (optional) Language code.
+   *
+   * @return
+   *   A node object.
+   */
+  function createPage($title, $body, $language = NULL) {
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = $title;
+    $edit["body[$langcode][0][value]"] = $body;
+    if (!empty($language)) {
+      $edit['language'] = $language;
+    }
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->assertRaw(t('Basic page %title has been created.', array('%title' => $title)), 'Basic page created.');
+
+    // Check to make sure the node was created.
+    $node = $this->drupalGetNodeByTitle($title);
+    $this->assertTrue($node, 'Node found in database.');
+
+    return $node;
+  }
+
+  /**
+   * Creates a translation for a basic page in the specified language.
+   *
+   * @param $node
+   *   The basic page to create the translation for.
+   * @param $title
+   *   The title of a basic page in the specified language.
+   * @param $body
+   *   The body of a basic page in the specified language.
+   * @param $language
+   *   Language code.
+   *
+   * @return
+   *   Translation object.
+   */
+  function createTranslation($node, $title, $body, $language) {
+    $this->drupalGet('node/add/page', array('query' => array('translation' => $node->nid, 'target' => $language)));
+
+    $langcode = LANGUAGE_NONE;
+    $body_key = "body[$langcode][0][value]";
+    $this->assertFieldByXPath('//input[@id="edit-title"]', $node->title, "Original title value correctly populated.");
+    $this->assertFieldByXPath("//textarea[@name='$body_key']", $node->body[LANGUAGE_NONE][0]['value'], "Original body value correctly populated.");
+
+    $edit = array();
+    $edit["title"] = $title;
+    $edit[$body_key] = $body;
+    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->assertRaw(t('Basic page %title has been created.', array('%title' => $title)), 'Translation created.');
+
+    // Check to make sure that translation was successful.
+    $translation = $this->drupalGetNodeByTitle($title);
+    $this->assertTrue($translation, 'Node found in database.');
+    $this->assertTrue($translation->tnid == $node->nid, 'Translation set id correctly stored.');
+
+    return $translation;
+  }
+
+  /**
+   * Asserts an element identified by the given XPath has the given content.
+   *
+   * @param $xpath
+   *   The XPath used to find the element.
+   * @param array $arguments
+   *   An array of arguments with keys in the form ':name' matching the
+   *   placeholders in the query. The values may be either strings or numeric
+   *   values.
+   * @param $value
+   *   The text content of the matched element to assert.
+   * @param $message
+   *   The message to display.
+   * @param $group
+   *   The group this message belongs to.
+   *
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  function assertContentByXPath($xpath, array $arguments = array(), $value = NULL, $message = '', $group = 'Other') {
+    $found = $this->findContentByXPath($xpath, $arguments, $value);
+    return $this->assertTrue($found, $message, $group);
+  }
+
+  /**
+   * Tests whether the specified language switch links are found.
+   *
+   * @param $node
+   *   The node to display.
+   * @param $translation
+   *   The translation whose link has to be checked.
+   * @param $find
+   *   TRUE if the link must be present in the node page.
+   * @param $types
+   *   The page areas to be checked.
+   *
+   * @return
+   *   TRUE if the language switch links are found, FALSE if not.
+   */
+  function assertLanguageSwitchLinks($node, $translation, $find = TRUE, $types = NULL) {
+    if (empty($types)) {
+      $types = array('node', 'block-locale');
+    }
+    elseif (is_string($types)) {
+      $types = array($types);
+    }
+
+    $result = TRUE;
+    $languages = language_list();
+    $page_language = $languages[entity_language('node', $node)];
+    $translation_language = $languages[$translation->language];
+    $url = url("node/$translation->nid", array('language' => $translation_language));
+
+    $this->drupalGet("node/$node->nid", array('language' => $page_language));
+
+    foreach ($types as $type) {
+      $args = array('%translation_language' => $translation_language->native, '%page_language' => $page_language->native, '%type' => $type);
+      if ($find) {
+        $message = format_string('[%page_language] Language switch item found for %translation_language language in the %type page area.', $args);
+      }
+      else {
+        $message = format_string('[%page_language] Language switch item not found for %translation_language language in the %type page area.', $args);
+      }
+
+      if (!empty($translation->nid)) {
+        $xpath = '//div[contains(@class, :type)]//a[@href=:url]';
+      }
+      else {
+        $xpath = '//div[contains(@class, :type)]//span[contains(@class, "locale-untranslated")]';
+      }
+
+      $found = $this->findContentByXPath($xpath, array(':type' => $type, ':url' => $url), $translation_language->native);
+      $result = $this->assertTrue($found == $find, $message) && $result;
+    }
+
+    return $result;
+  }
+
+  /**
+   * Searches for elements matching the given xpath and value.
+   *
+   * @param $xpath
+   *   The XPath used to find the element.
+   * @param array $arguments
+   *   An array of arguments with keys in the form ':name' matching the
+   *   placeholders in the query. The values may be either strings or numeric
+   *   values.
+   * @param $value
+   *   The text content of the matched element to assert.
+   *
+   * @return
+   *   TRUE if found, otherwise FALSE.
+   */
+  function findContentByXPath($xpath, array $arguments = array(), $value = NULL) {
+    $elements = $this->xpath($xpath, $arguments);
+
+    $found = TRUE;
+    if ($value && $elements) {
+      $found = FALSE;
+      foreach ($elements as $element) {
+        if ((string) $element == $value) {
+          $found = TRUE;
+          break;
+        }
+      }
+    }
+
+    return $elements && $found;
+  }
+}
diff --git a/htmltest/modules/trigger/tests/trigger_test.info b/htmltest/modules/trigger/tests/trigger_test.info
new file mode 100644
index 00000000..c26fdeb5
--- /dev/null
+++ b/htmltest/modules/trigger/tests/trigger_test.info
@@ -0,0 +1,11 @@
+name = "Trigger Test"
+description = "Support module for Trigger tests."
+package = Testing
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/trigger/tests/trigger_test.module b/htmltest/modules/trigger/tests/trigger_test.module
new file mode 100644
index 00000000..72fe3528
--- /dev/null
+++ b/htmltest/modules/trigger/tests/trigger_test.module
@@ -0,0 +1,136 @@
+<?php
+
+/**
+ * @file
+ * Mock module to aid in testing trigger.module.
+ */
+
+/**
+ * Implements hook_action_info().
+ */
+function trigger_test_action_info() {
+  // Register an action that can be assigned to the trigger "cron".
+  return array(
+    'trigger_test_system_cron_action' => array(
+      'type' => 'system',
+      'label' => t('Cron test action'),
+      'configurable' => FALSE,
+      'triggers' => array('cron'),
+    ),
+    'trigger_test_system_cron_conf_action' => array(
+      'type' => 'system',
+      'label' => t('Cron test configurable action'),
+      'configurable' => TRUE,
+      'triggers' => array('cron'),
+    ),
+    'trigger_test_generic_action' => array(
+      'type' => 'system',
+      'label' => t('Generic test action'),
+      'configurable' => FALSE,
+      'triggers' => array(
+        'taxonomy_term_insert',
+        'taxonomy_term_update',
+        'taxonomy_delete',
+        'comment_insert',
+        'comment_update',
+        'comment_delete',
+        'user_insert',
+        'user_update',
+        'user_delete',
+        'user_login',
+        'user_logout',
+        'user_view',
+      ),
+    ),
+    'trigger_test_generic_any_action' => array(
+      'type' => 'system',
+      'label' => t('Generic test action for any trigger'),
+      'configurable' => FALSE,
+      'triggers' => array('any'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_trigger_info().
+ */
+function trigger_test_trigger_info() {
+  // Register triggers that this module provides. The first is an additional
+  // node trigger and the second is our own, which should create a new tab
+  // on the trigger assignment page. The last tests long trigger names.
+  return array(
+    'node' => array(
+      'node_triggertest' => array(
+        'label' => t('A test trigger is fired'),
+      ),
+    ),
+    'trigger_test' => array(
+      'trigger_test_triggertest' => array(
+        'label' => t('Another test trigger is fired'),
+      ),
+      'trigger_test_we_sweat_it_out_in_the_streets_of_a_runaway_american_dream' => array(
+        'label' => t('A test trigger with a name over 64 characters'),
+      ),
+    ),
+  );
+}
+
+/**
+ * Action fired during the "cron run" trigger test.
+ */
+function trigger_test_system_cron_action() {
+  // Indicate successful execution by setting a persistent variable.
+  variable_set('trigger_test_system_cron_action', TRUE);
+}
+
+/**
+ * Implement a configurable Drupal action.
+ */
+function trigger_test_system_cron_conf_action($object, $context) {
+  // Indicate successful execution by incrementing a persistent variable.
+  $value = variable_get('trigger_test_system_cron_conf_action', 0) + 1;
+  variable_set('trigger_test_system_cron_conf_action', $value);
+}
+
+/**
+ * Form for configurable test action.
+ */
+function trigger_test_system_cron_conf_action_form($context) {
+  if (!isset($context['subject'])) {
+    $context['subject'] = '';
+  }
+  $form['subject'] = array(
+    '#type' => 'textfield',
+    '#default_value' => $context['subject'],
+  );
+  return $form;
+}
+
+/**
+ * Form submission handler for configurable test action.
+ */
+function trigger_test_system_cron_conf_action_submit($form, $form_state) {
+  $form_values = $form_state['values'];
+  // Process the HTML form to store configuration. The keyed array that
+  // we return will be serialized to the database.
+  $params = array(
+    'subject' => $form_values['subject'],
+  );
+  return $params;
+}
+
+/**
+ * Action fired during the "taxonomy", "comment", and "user" trigger tests.
+ */
+function trigger_test_generic_action($context) {
+  // Indicate successful execution by setting a persistent variable.
+  variable_set('trigger_test_generic_action', TRUE);
+}
+
+/**
+ * Action fired during the additional trigger tests.
+ */
+function trigger_test_generic_any_action($context) {
+  // Indicate successful execution by setting a persistent variable.
+  variable_set('trigger_test_generic_any_action', variable_get('trigger_test_generic_any_action', 0) + 1);
+}
diff --git a/htmltest/modules/trigger/trigger.admin.inc b/htmltest/modules/trigger/trigger.admin.inc
new file mode 100644
index 00000000..5b607c85
--- /dev/null
+++ b/htmltest/modules/trigger/trigger.admin.inc
@@ -0,0 +1,319 @@
+<?php
+
+/**
+ * @file
+ * Admin page callbacks for the trigger module.
+ */
+
+/**
+ * Builds a form that allows users to assign actions to triggers.
+ *
+ * @param $module_to_display
+ *   Which tab of triggers to display. E.g., 'node' for all node-related
+ *   triggers.
+ *
+ * @return
+ *   HTML form.
+ *
+ * @see trigger_menu()
+ */
+function trigger_assign($module_to_display = NULL) {
+  // If no type is specified we default to node actions, since they
+  // are the most common.
+  if (!isset($module_to_display)) {
+    drupal_goto('admin/structure/trigger/node');
+  }
+
+  $build = array();
+  $trigger_info = module_invoke_all('trigger_info');
+  drupal_alter('trigger_info', $trigger_info);
+  foreach ($trigger_info as $module => $hooks) {
+    if ($module == $module_to_display) {
+      foreach ($hooks as $hook => $description) {
+        $form_id = 'trigger_' . $hook . '_assign_form';
+        $build[$form_id] = drupal_get_form($form_id, $module, $hook, $description['label']);
+      }
+    }
+  }
+  return $build;
+}
+
+/**
+ * Form constructor for confirmation page for removal of an assigned action.
+ *
+ * @param $module
+ *   The tab of triggers the user will be directed to after successful
+ *   removal of the action, or if the confirmation form is cancelled.
+ * @param $hook
+ *   The name of the trigger hook, e.g., 'node_insert'.
+ * @param $aid
+ *   The action ID.
+ *
+ * @see trigger_unassign_submit()
+ * @ingroup forms
+ */
+function trigger_unassign($form, $form_state, $module, $hook = NULL, $aid = NULL) {
+  if (!isset($hook, $aid)) {
+    drupal_goto('admin/structure/trigger');
+  }
+
+  $form['hook'] = array(
+    '#type' => 'value',
+    '#value' => $hook,
+  );
+  $form['module'] = array(
+    '#type' => 'value',
+    '#value' => $module,
+  );
+  $form['aid'] = array(
+    '#type' => 'value',
+    '#value' => $aid,
+  );
+
+  $action = actions_function_lookup($aid);
+  $actions = actions_get_all_actions();
+
+  $destination = 'admin/structure/trigger/' . $module;
+
+  return confirm_form($form,
+    t('Are you sure you want to unassign the action %title?', array('%title' => $actions[$action]['label'])),
+    $destination,
+    t('You can assign it again later if you wish.'),
+    t('Unassign'), t('Cancel')
+  );
+}
+
+/**
+ * Form submission handler for trigger_unassign().
+ */
+function trigger_unassign_submit($form, &$form_state) {
+  if ($form_state['values']['confirm'] == 1) {
+    $aid = actions_function_lookup($form_state['values']['aid']);
+    db_delete('trigger_assignments')
+      ->condition('hook', $form_state['values']['hook'])
+      ->condition('aid', $aid)
+      ->execute();
+    drupal_static_reset('trigger_get_assigned_actions');
+    $actions = actions_get_all_actions();
+    watchdog('actions', 'Action %action has been unassigned.',  array('%action' => $actions[$aid]['label']));
+    drupal_set_message(t('Action %action has been unassigned.', array('%action' => $actions[$aid]['label'])));
+    $form_state['redirect'] = 'admin/structure/trigger/' . $form_state['values']['module'];
+  }
+  else {
+    drupal_goto('admin/structure/trigger');
+  }
+}
+
+/**
+ * Returns the form for assigning an action to a trigger.
+ *
+ * @param $module
+ *   The name of the trigger group, e.g., 'node'.
+ * @param $hook
+ *   The name of the trigger hook, e.g., 'node_insert'.
+ * @param $label
+ *   A plain English description of what this trigger does.
+ *
+ * @see trigger_assign_form_validate()
+ * @see trigger_assign_form_submit()
+ * @ingroup forms
+ */
+function trigger_assign_form($form, $form_state, $module, $hook, $label) {
+  $form['module'] = array(
+    '#type' => 'hidden',
+    '#value' => $module,
+  );
+  $form['hook'] = array(
+    '#type' => 'hidden',
+    '#value' => $hook,
+  );
+  // All of these forms use the same validate and submit functions.
+  $form['#validate'][] = 'trigger_assign_form_validate';
+  $form['#submit'][] = 'trigger_assign_form_submit';
+
+  $options = array();
+  $functions = array();
+  // Restrict the options list to actions that declare support for this hook.
+  foreach (actions_list() as $func => $metadata) {
+    if (isset($metadata['triggers']) && array_intersect(array($hook, 'any'), $metadata['triggers'])) {
+      $functions[] = $func;
+    }
+  }
+  foreach (actions_actions_map(actions_get_all_actions()) as $aid => $action) {
+    if (in_array($action['callback'], $functions)) {
+      $options[$action['type']][$aid] = $action['label'];
+    }
+  }
+
+  $form[$hook] = array(
+    '#type' => 'fieldset',
+    // !description is correct, since these labels are passed through t() in
+    // hook_trigger_info().
+    '#title' => t('Trigger: !description', array('!description' => $label)),
+    '#theme' => 'trigger_display',
+  );
+
+  // Retrieve actions that are already assigned to this hook combination.
+  $actions = trigger_get_assigned_actions($hook);
+  $form[$hook]['assigned']['#type'] = 'value';
+  $form[$hook]['assigned']['#value'] = array();
+  foreach ($actions as $aid => $info) {
+    // If action is defined unassign it, otherwise offer to delete all orphaned
+    // actions.
+    $hash = drupal_hash_base64($aid, TRUE);
+    if (actions_function_lookup($hash)) {
+      $form[$hook]['assigned']['#value'][$aid] = array(
+        'label' => $info['label'],
+        'link' => l(t('unassign'), "admin/structure/trigger/unassign/$module/$hook/$hash"),
+      );
+    }
+    else {
+      // Link to system_actions_remove_orphans() to do the clean up.
+      $form[$hook]['assigned']['#value'][$aid] = array(
+        'label' => $info['label'],
+        'link' => l(t('Remove orphaned actions'), "admin/config/system/actions/orphan"),
+      );
+    }
+  }
+
+  $form[$hook]['parent'] = array(
+    '#type' => 'container',
+    '#attributes' => array('class' => array('container-inline')),
+  );
+  // List possible actions that may be assigned.
+  if (count($options) != 0) {
+    $form[$hook]['parent']['aid'] = array(
+      '#type' => 'select',
+      '#title' => t('List of trigger actions when !description', array('!description' => $label)),
+      '#title_display' => 'invisible',
+      '#options' => $options,
+      '#empty_option' => t('Choose an action'),
+    );
+    $form[$hook]['parent']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Assign')
+    );
+  }
+  else {
+    $form[$hook]['none'] = array(
+      '#markup' => t('No actions available for this trigger. <a href="@link">Add action</a>.', array('@link' => url('admin/config/system/actions/manage')))
+    );
+  }
+  return $form;
+}
+
+/**
+ * Form validation handler for trigger_assign_form().
+ *
+ * Makes sure that the user is not re-assigning an action to an event.
+ *
+ * @see trigger_assign_form_submit()
+ */
+function trigger_assign_form_validate($form, $form_state) {
+  $form_values = $form_state['values'];
+  if (!empty($form_values['aid'])) {
+    $aid = actions_function_lookup($form_values['aid']);
+    $aid_exists = db_query("SELECT aid FROM {trigger_assignments} WHERE hook = :hook AND aid = :aid", array(
+      ':hook' => $form_values['hook'],
+      ':aid' => $aid,
+    ))->fetchField();
+    if ($aid_exists) {
+      form_set_error($form_values['hook'], t('The action you chose is already assigned to that trigger.'));
+    }
+  }
+}
+
+/**
+ * Form submission handler for trigger_assign_form().
+ *
+ * @see trigger_assign_form_validate()
+ */
+function trigger_assign_form_submit($form, &$form_state) {
+  if (!empty($form_state['values']['aid'])) {
+    $aid = actions_function_lookup($form_state['values']['aid']);
+    $weight = db_query("SELECT MAX(weight) FROM {trigger_assignments} WHERE hook = :hook", array(':hook' => $form_state['values']['hook']))->fetchField();
+
+    // Insert the new action.
+    db_insert('trigger_assignments')
+      ->fields(array(
+        'hook' => $form_state['values']['hook'],
+        'aid' => $aid,
+        'weight' => $weight + 1,
+      ))
+      ->execute();
+
+    // If we are not configuring an action for a "presave" hook and this action
+    // changes an object property, then we need to save the object, so the
+    // property change will persist.
+    $actions = actions_list();
+    if (strpos($form_state['values']['hook'], 'presave') === FALSE && isset($actions[$aid]['behavior']) && in_array('changes_property', $actions[$aid]['behavior'])) {
+      // Determine the corresponding save action name for this action.
+      $save_action = strtok($aid, '_') . '_save_action';
+      // If no corresponding save action exists, we need to bail out.
+      if (!isset($actions[$save_action])) {
+        throw new Exception(t('Missing/undefined save action (%save_aid) for %aid action.', array('%save_aid' => $aid, '%aid' => $aid)));
+      }
+      // Delete previous save action if it exists, and re-add it using a higher
+      // weight.
+      $save_action_assigned = db_query("SELECT aid FROM {trigger_assignments} WHERE hook = :hook AND aid = :aid", array(':hook' => $form_state['values']['hook'], ':aid' => $save_action))->fetchField();
+
+      if ($save_action_assigned) {
+        db_delete('trigger_assignments')
+          ->condition('hook', $form_state['values']['hook'])
+          ->condition('aid', $save_action)
+          ->execute();
+      }
+      db_insert('trigger_assignments')
+        ->fields(array(
+          'hook' => $form_state['values']['hook'],
+          'aid' => $save_action,
+          'weight' => $weight + 2,
+        ))
+        ->execute();
+
+      // If no save action existed before, inform the user about it.
+      if (!$save_action_assigned) {
+        drupal_set_message(t('The %label action has been appended, which is required to save the property change.', array('%label' => $actions[$save_action]['label'])));
+      }
+      // Otherwise, just inform about the new weight.
+      else {
+        drupal_set_message(t('The %label action was moved to save the property change.', array('%label' => $actions[$save_action]['label'])));
+      }
+    }
+  }
+  drupal_static_reset('trigger_get_assigned_actions');
+}
+
+/**
+ * Returns HTML for the form showing actions assigned to a trigger.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - element: The fieldset including all assigned actions.
+ *
+ * @ingroup themeable
+ */
+function theme_trigger_display($variables) {
+  $element = $variables['element'];
+
+  $header = array();
+  $rows = array();
+  if (isset($element['assigned']) && count($element['assigned']['#value'])) {
+    $header = array(array('data' => t('Name')), array('data' => t('Operation')));
+    $rows = array();
+    foreach ($element['assigned']['#value'] as $aid => $info) {
+      $rows[] = array(
+        check_plain($info['label']),
+        $info['link']
+      );
+    }
+  }
+
+  if (count($rows)) {
+    $output = theme('table', array('header' => $header, 'rows' => $rows)) . drupal_render_children($element);
+  }
+  else {
+    $output = drupal_render_children($element);
+  }
+  return $output;
+}
diff --git a/htmltest/modules/trigger/trigger.api.php b/htmltest/modules/trigger/trigger.api.php
new file mode 100644
index 00000000..839c1d48
--- /dev/null
+++ b/htmltest/modules/trigger/trigger.api.php
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Trigger module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Declare triggers (events) for users to assign actions to.
+ *
+ * This hook is used by the trigger module to create a list of triggers (events)
+ * that users can assign actions to. Your module is responsible for detecting
+ * that the events have occurred, calling trigger_get_assigned_actions() to find
+ * out which actions the user has associated with your trigger, and then calling
+ * actions_do() to fire off the actions.
+ *
+ * @return
+ *   A nested associative array.
+ *   - The outermost key is the name of the module that is defining the triggers.
+ *     This will be used to create a local task (tab) in the trigger module's
+ *     user interface. A contrib module may supply a trigger for a core module by
+ *     giving the core module's name as the key. For example, you could use the
+ *     'node' key to add a node-related trigger.
+ *     - Within each module, each individual trigger is keyed by a hook name
+ *       describing the particular trigger (this is not visible to the user, but
+ *       can be used by your module for identification).
+ *       - Each trigger is described by an associative array. Currently, the only
+ *         key-value pair is 'label', which contains a translated human-readable
+ *         description of the triggering event.
+ *   For example, the trigger set for the 'node' module has 'node' as the
+ *   outermost key and defines triggers for 'node_insert', 'node_update',
+ *   'node_delete' etc. that fire when a node is saved, updated, etc.
+ *
+ * @see hook_action_info()
+ * @see hook_trigger_info_alter()
+ */
+function hook_trigger_info() {
+  return array(
+    'node' => array(
+      'node_presave' => array(
+        'label' => t('When either saving new content or updating existing content'),
+      ),
+      'node_insert' => array(
+        'label' => t('After saving new content'),
+      ),
+      'node_update' => array(
+        'label' => t('After saving updated content'),
+      ),
+      'node_delete' => array(
+        'label' => t('After deleting content'),
+      ),
+      'node_view' => array(
+        'label' => t('When content is viewed by an authenticated user'),
+      ),
+    ),
+  );
+}
+
+/**
+ * Alter triggers declared by hook_trigger_info().
+ *
+ * @param $triggers
+ *   Array of trigger information returned by hook_trigger_info()
+ *   implementations. Modify this array in place. See hook_trigger_info()
+ *   for information on what this might contain.
+ */
+function hook_trigger_info_alter(&$triggers) {
+  $triggers['node']['node_insert']['label'] = t('When content is saved');
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/trigger/trigger.info b/htmltest/modules/trigger/trigger.info
new file mode 100644
index 00000000..2c400e4d
--- /dev/null
+++ b/htmltest/modules/trigger/trigger.info
@@ -0,0 +1,13 @@
+name = Trigger
+description = Enables actions to be fired on certain system events, such as when new content is created.
+package = Core
+version = VERSION
+core = 7.x
+files[] = trigger.test
+configure = admin/structure/trigger
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/trigger/trigger.install b/htmltest/modules/trigger/trigger.install
new file mode 100644
index 00000000..779cd2aa
--- /dev/null
+++ b/htmltest/modules/trigger/trigger.install
@@ -0,0 +1,116 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the trigger module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function trigger_schema() {
+  // The total index length (hook and aid) must be less than 333. Since the aid
+  // field is 255 characters, the hook field can have a maximum length of 78.
+  $schema['trigger_assignments'] = array(
+    'description' => 'Maps trigger to hook and operation assignments from trigger.module.',
+    'fields' => array(
+      'hook' => array(
+        'type' => 'varchar',
+        'length' => 78,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Primary Key: The name of the internal Drupal hook; for example, node_insert.',
+      ),
+      'aid' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => "Primary Key: Action's {actions}.aid.",
+      ),
+      'weight' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The weight of the trigger assignment in relation to other triggers.',
+      ),
+    ),
+    'primary key' => array('hook', 'aid'),
+    'foreign keys' => array(
+      'action' => array(
+        'table' => 'actions',
+        'columns' => array('aid' => 'aid'),
+      ),
+    ),
+  );
+  return $schema;
+}
+
+/**
+ * Implements hook_install().
+ */
+function trigger_install() {
+  // Do initial synchronization of actions in code and the database.
+  actions_synchronize();
+}
+
+/**
+ * Alter the "hook" field and drop the "op field" of {trigger_assignments}.
+ *
+ * Increase the length of the "hook" field to 78 characters and adds operation
+ * names to the hook names, and drops the "op" field.
+ */
+function trigger_update_7000() {
+  db_drop_primary_key('trigger_assignments');
+  db_change_field('trigger_assignments', 'hook', 'hook', array('type' => 'varchar', 'length' => 78, 'not null' => TRUE, 'default' => '', 'description' => 'Primary Key: The name of the internal Drupal hook; for example, node_insert.'));
+
+  $result = db_query("SELECT hook, op, aid FROM {trigger_assignments} WHERE op <> ''");
+
+  foreach ($result as $record) {
+    db_update('trigger_assignments')
+      ->fields(array('hook' => $record->hook . '_' . $record->op))
+      ->condition('hook', $record->hook)
+      ->condition('op', $record->op)
+      ->condition('aid', $record->aid)
+      ->execute();
+  }
+  db_drop_field('trigger_assignments', 'op');
+
+  db_add_primary_key('trigger_assignments', array('hook', 'aid'));
+}
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Increase the length of the "hook" field to 78 characters.
+ *
+ * This is a separate function for those who ran an older version of
+ * trigger_update_7000() that did not do this.
+ */
+function trigger_update_7001() {
+  db_drop_primary_key('trigger_assignments');
+  db_change_field('trigger_assignments', 'hook', 'hook', array('type' => 'varchar', 'length' => 78, 'not null' => TRUE, 'default' => '', 'description' => 'Primary Key: The name of the internal Drupal hook; for example, node_insert.', ), array('primary key' => array('hook', 'aid')));
+}
+
+/**
+ * Renames nodeapi to node.
+ */
+function trigger_update_7002() {
+  $result = db_query("SELECT hook, aid FROM {trigger_assignments}");
+
+  foreach($result as $record) {
+    $new_hook = str_replace('nodeapi', 'node', $record->hook);
+    db_update('trigger_assignments')
+      ->fields(array('hook' => $new_hook))
+      ->condition('hook', $record->hook)
+      ->condition('aid', $record->aid)
+      ->execute();
+  }
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra".
+ */
diff --git a/htmltest/modules/trigger/trigger.module b/htmltest/modules/trigger/trigger.module
new file mode 100644
index 00000000..aeb1211c
--- /dev/null
+++ b/htmltest/modules/trigger/trigger.module
@@ -0,0 +1,671 @@
+<?php
+
+/**
+ * @file
+ * Enables functions to be stored and executed at a later time.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function trigger_help($path, $arg) {
+  // Generate help text for admin/structure/trigger/(module) tabs.
+  $matches = array();
+  if (preg_match('|^admin/structure/trigger/(.*)$|', $path, $matches)) {
+    $explanation = '<p>' . t('Triggers are events on your site, such as new content being added or a user logging in. The Trigger module associates these triggers with actions (functional tasks), such as unpublishing content containing certain keywords or e-mailing an administrator. The <a href="@url">Actions settings page</a> contains a list of existing actions and provides the ability to create and configure advanced actions (actions requiring configuration, such as an e-mail address or a list of banned words).', array('@url' => url('admin/config/system/actions'))) . '</p>';
+
+    $module = $matches[1];
+    $trigger_info = _trigger_tab_information();
+    if (!empty($trigger_info[$module])) {
+      $explanation .= '<p>' . t('There is a tab on this page for each module that defines triggers. On this tab you can assign actions to run when triggers from the <a href="@module-help">@module-name module</a> happen.', array('@module-help' => url('admin/help/' . $module), '@module-name' => $trigger_info[$module])) . '</p>';
+    }
+
+    return $explanation;
+  }
+
+  if ($path == 'admin/help#trigger') {
+    $output = '';
+    $output .= '<h3>' . t('About') . '</h3>';
+    $output .= '<p>' . t('The Trigger module provides the ability to cause <em>actions</em> to run when certain <em>triggers</em> take place on your site. Triggers are events, such as new content being added to your site or a user logging in, and actions are tasks, such as unpublishing content or e-mailing an administrator. For more information, see the online handbook entry for <a href="@trigger">Trigger module</a>.', array('@trigger' => 'http://drupal.org/documentation/modules/trigger/')) . '</p>';
+    $output .= '<h3>' . t('Uses') . '</h3>';
+    $output .= '<dl>';
+    $output .= '<dt>' . t('Configuring triggers and actions') . '</dt>';
+    $output .= '<dd>' . t('The combination of actions and triggers can perform many useful tasks, such as e-mailing an administrator if a user account is deleted, or automatically unpublishing comments that contain certain words. To set up a trigger/action combination, first visit the <a href="@actions-page">Actions configuration page</a>, where you can either verify that the action you want is already listed, or create a new <em>advanced</em> action. You will need to set up an advanced action if there are configuration options in your trigger/action combination, such as specifying an e-mail address or a list of banned words. After configuring or verifying your action, visit the <a href="@triggers-page">Triggers configuration page</a> and choose the appropriate tab (Comment, Taxonomy, etc.), where you can assign the action to run when the trigger event occurs.', array('@triggers-page' => url('admin/structure/trigger'), '@actions-page' => url('admin/config/system/actions'))) . '</dd>';
+    $output .= '</dl>';
+    return $output;
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function trigger_menu() {
+  $items['admin/structure/trigger'] = array(
+    'title' => 'Triggers',
+    'description' => 'Configure when to execute actions.',
+    'page callback' => 'trigger_assign',
+    'access arguments' => array('administer actions'),
+    'file' => 'trigger.admin.inc',
+  );
+
+  $trigger_info = _trigger_tab_information();
+  foreach ($trigger_info as $module => $module_name) {
+    $items["admin/structure/trigger/$module"] = array(
+      'title' => $module_name,
+      'page callback' => 'trigger_assign',
+      'page arguments' => array($module),
+      'access arguments' => array('administer actions'),
+      'type' => MENU_LOCAL_TASK,
+      'file' => 'trigger.admin.inc',
+    );
+  }
+
+  $items['admin/structure/trigger/unassign'] = array(
+    'title' => 'Unassign',
+    'description' => 'Unassign an action from a trigger.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('trigger_unassign'),
+    // Only accessible if there are any actions that can be unassigned.
+    'access callback' => 'trigger_menu_unassign_access',
+    // Only output in the breadcrumb, not in menu trees.
+    'type' => MENU_VISIBLE_IN_BREADCRUMB,
+    'file' => 'trigger.admin.inc',
+  );
+
+  return $items;
+}
+
+/**
+ * Access callback: Determines if triggers can be unassigned.
+ *
+ * @return bool
+ *   TRUE if there are triggers that the user can unassign, FALSE otherwise.
+ *
+ * @see trigger_menu()
+ */
+function trigger_menu_unassign_access() {
+  if (!user_access('administer actions')) {
+    return FALSE;
+  }
+  $count = db_select('trigger_assignments')
+    ->countQuery()
+    ->execute()
+    ->fetchField();
+  return $count > 0;
+}
+
+/**
+ * Implements hook_trigger_info().
+ *
+ * Defines all the triggers that this module implements triggers for.
+ */
+function trigger_trigger_info() {
+   return array(
+     'node' => array(
+       'node_presave' => array(
+         'label' => t('When either saving new content or updating existing content'),
+       ),
+       'node_insert' => array(
+         'label' => t('After saving new content'),
+       ),
+       'node_update' => array(
+         'label' => t('After saving updated content'),
+       ),
+       'node_delete' => array(
+         'label' => t('After deleting content'),
+       ),
+       'node_view' => array(
+         'label' => t('When content is viewed by an authenticated user'),
+       ),
+     ),
+     'comment' => array(
+       'comment_presave' => array(
+         'label' => t('When either saving a new comment or updating an existing comment'),
+       ),
+       'comment_insert' => array(
+         'label' => t('After saving a new comment'),
+       ),
+       'comment_update' => array(
+         'label' => t('After saving an updated comment'),
+       ),
+       'comment_delete' => array(
+         'label' => t('After deleting a comment'),
+       ),
+       'comment_view' => array(
+         'label' => t('When a comment is being viewed by an authenticated user'),
+       ),
+     ),
+     'taxonomy' => array(
+       'taxonomy_term_insert' => array(
+         'label' => t('After saving a new term to the database'),
+       ),
+       'taxonomy_term_update' => array(
+         'label' => t('After saving an updated term to the database'),
+       ),
+       'taxonomy_term_delete' => array(
+         'label' => t('After deleting a term'),
+       ),
+     ),
+     'system' => array(
+       'cron' => array(
+         'label' => t('When cron runs'),
+       ),
+     ),
+     'user' => array(
+       'user_insert' => array(
+         'label' => t('After creating a new user account'),
+       ),
+       'user_update' => array(
+         'label' => t('After updating a user account'),
+       ),
+       'user_delete' => array(
+         'label' => t('After a user has been deleted'),
+       ),
+       'user_login' => array(
+         'label' => t('After a user has logged in'),
+       ),
+       'user_logout' => array(
+         'label' => t('After a user has logged out'),
+       ),
+       'user_view' => array(
+         'label' => t("When a user's profile is being viewed"),
+       ),
+     ),
+   );
+ }
+
+/**
+ * Gets the action IDs of actions to be executed for a hook.
+ *
+ * @param $hook
+ *   The name of the hook being fired.
+ *
+ * @return
+ *   An array whose keys are action IDs that the user has associated with
+ *   this trigger, and whose values are arrays containing the action type and
+ *   label.
+ */
+function trigger_get_assigned_actions($hook) {
+  $actions = &drupal_static(__FUNCTION__, array());
+  if (!isset($actions[$hook])) {
+    $actions[$hook] = db_query("SELECT ta.aid, a.type, a.label FROM {trigger_assignments} ta LEFT JOIN {actions} a ON ta.aid = a.aid WHERE ta.hook = :hook ORDER BY ta.weight", array(
+      ':hook' => $hook,
+    ))->fetchAllAssoc('aid', PDO::FETCH_ASSOC);
+  }
+  return $actions[$hook];
+}
+
+/**
+ * Implements hook_theme().
+ */
+function trigger_theme() {
+  return array(
+    'trigger_display' => array(
+      'render element' => 'element',
+      'file' => 'trigger.admin.inc',
+    ),
+  );
+}
+
+/**
+ * Implements hook_forms().
+ *
+ * We re-use code by using the same assignment form definition for each hook.
+ */
+function trigger_forms() {
+  $trigger_info = _trigger_get_all_info();
+  $forms = array();
+  foreach ($trigger_info as $module => $hooks) {
+    foreach ($hooks as $hook => $description) {
+      $forms['trigger_' . $hook . '_assign_form'] = array('callback' => 'trigger_assign_form');
+    }
+  }
+
+  return $forms;
+}
+
+/**
+ * Loads associated objects for node triggers.
+ *
+ * When an action is called in a context that does not match its type, the
+ * object that the action expects must be retrieved. For example, when an action
+ * that works on users is called during a node hook implementation, the user
+ * object is not available since the node hook call doesn't pass it. So here we
+ * load the object the action expects.
+ *
+ * @param $type
+ *   The type of action that is about to be called.
+ * @param $node
+ *   The node that was passed via the node hook.
+ *
+ * @return
+ *   The object expected by the action that is about to be called.
+ */
+function _trigger_normalize_node_context($type, $node) {
+  // Note that comment-type actions are not supported in node contexts,
+  // because we wouldn't know which comment to choose.
+  switch ($type) {
+    // An action that works on users is being called in a node context.
+    // Load the user object of the node's author.
+    case 'user':
+      return user_load($node->uid);
+  }
+}
+
+/**
+ * Calls action functions for node triggers.
+ *
+ * @param $node
+ *   Node object.
+ * @param $hook
+ *   Hook to trigger.
+ * @param $a3
+ *   Additional argument to action function.
+ * @param $a4
+ *   Additional argument to action function.
+ */
+function _trigger_node($node, $hook, $a3 = NULL, $a4 = NULL) {
+  // Keep objects for reuse so that changes actions make to objects can persist.
+  static $objects;
+  // Prevent recursion by tracking which operations have already been called.
+  static $recursion;
+
+  $aids = trigger_get_assigned_actions($hook);
+  if (!$aids) {
+    return;
+  }
+
+  if (isset($recursion[$hook])) {
+    return;
+  }
+  $recursion[$hook] = TRUE;
+
+  $context = array(
+    'group' => 'node',
+    'hook' => $hook,
+  );
+
+  // We need to get the expected object if the action's type is not 'node'.
+  // We keep the object in $objects so we can reuse it if we have multiple actions
+  // that make changes to an object.
+  foreach ($aids as $aid => $info) {
+    $type = $info['type'];
+    if ($type != 'node') {
+      if (!isset($objects[$type])) {
+        $objects[$type] = _trigger_normalize_node_context($type, $node);
+      }
+      // Since we know about the node, we pass that info along to the action.
+      $context['node'] = $node;
+      $result = actions_do($aid, $objects[$type], $context, $a3, $a4);
+    }
+    else {
+      actions_do($aid, $node, $context, $a3, $a4);
+    }
+  }
+
+  unset($recursion[$hook]);
+}
+
+/**
+ * Implements hook_node_view().
+ */
+function trigger_node_view($node, $view_mode) {
+  _trigger_node($node, 'node_view', $view_mode);
+}
+
+/**
+ * Implements hook_node_update().
+ */
+function trigger_node_update($node) {
+  _trigger_node($node, 'node_update');
+}
+
+/**
+ * Implements hook_node_presave().
+ */
+function trigger_node_presave($node) {
+  _trigger_node($node, 'node_presave');
+}
+
+/**
+ * Implements hook_node_insert().
+ */
+function trigger_node_insert($node) {
+  _trigger_node($node, 'node_insert');
+}
+
+/**
+ * Implements hook_node_delete().
+ */
+function trigger_node_delete($node) {
+  _trigger_node($node, 'node_delete');
+}
+
+/**
+ * Loads associated objects for comment triggers.
+ *
+ * When an action is called in a context that does not match its type, the
+ * object that the action expects must be retrieved. For example, when an action
+ * that works on nodes is called during the comment hook, the node object is not
+ * available since the comment hook doesn't pass it. So here we load the object
+ * the action expects.
+ *
+ * @param $type
+ *   The type of action that is about to be called.
+ * @param $comment
+ *   The comment that was passed via the comment hook.
+ *
+ * @return
+ *   The object expected by the action that is about to be called.
+ */
+function _trigger_normalize_comment_context($type, $comment) {
+  switch ($type) {
+    // An action that works with nodes is being called in a comment context.
+    case 'node':
+      return node_load(is_array($comment) ? $comment['nid'] : $comment->nid);
+
+    // An action that works on users is being called in a comment context.
+    case 'user':
+      return user_load(is_array($comment) ? $comment['uid'] : $comment->uid);
+  }
+}
+
+/**
+ * Implements hook_comment_presave().
+ */
+function trigger_comment_presave($comment) {
+  _trigger_comment($comment, 'comment_presave');
+}
+
+/**
+ * Implements hook_comment_insert().
+ */
+function trigger_comment_insert($comment) {
+  _trigger_comment($comment, 'comment_insert');
+}
+
+/**
+ * Implements hook_comment_update().
+ */
+function trigger_comment_update($comment) {
+  _trigger_comment($comment, 'comment_update');
+}
+
+/**
+ * Implements hook_comment_delete().
+ */
+function trigger_comment_delete($comment) {
+  _trigger_comment($comment, 'comment_delete');
+}
+
+/**
+ * Implements hook_comment_view().
+ */
+function trigger_comment_view($comment) {
+  _trigger_comment($comment, 'comment_view');
+}
+
+/**
+ * Calls action functions for comment triggers.
+ *
+ * @param $a1
+ *   Comment object or array of form values.
+ * @param $hook
+ *   Hook to trigger.
+ */
+function _trigger_comment($a1, $hook) {
+  // Keep objects for reuse so that changes actions make to objects can persist.
+  static $objects;
+  $aids = trigger_get_assigned_actions($hook);
+  $context = array(
+    'group' => 'comment',
+    'hook' => $hook,
+  );
+  // We need to get the expected object if the action's type is not 'comment'.
+  // We keep the object in $objects so we can reuse it if we have multiple
+  // actions that make changes to an object.
+  foreach ($aids as $aid => $info) {
+    $type = $info['type'];
+    if ($type != 'comment') {
+      if (!isset($objects[$type])) {
+        $objects[$type] = _trigger_normalize_comment_context($type, $a1);
+      }
+      // Since we know about the comment, we pass it along to the action
+      // in case it wants to peek at it.
+      $context['comment'] = (object) $a1;
+      actions_do($aid, $objects[$type], $context);
+    }
+    else {
+      actions_do($aid, $a1, $context);
+    }
+  }
+}
+
+/**
+ * Implements hook_cron().
+ */
+function trigger_cron() {
+  $aids = trigger_get_assigned_actions('cron');
+  $context = array(
+    'group' => 'cron',
+    'hook' => 'cron',
+  );
+  // Cron does not act on any specific object.
+  $object = NULL;
+  actions_do(array_keys($aids), $object, $context);
+}
+
+/**
+ * Loads associated objects for user triggers.
+ *
+ * When an action is called in a context that does not match its type, the
+ * object that the action expects must be retrieved. For example, when an action
+ * that works on nodes is called during the user hook, the node object is not
+ * available since the user hook doesn't pass it. So here we load the object the
+ * action expects.
+ *
+ * @param $type
+ *   The type of action that is about to be called.
+ * @param $account
+ *   The account object that was passed via the user hook.
+ *
+ * @return
+ *   The object expected by the action that is about to be called.
+ */
+function _trigger_normalize_user_context($type, $account) {
+  // Note that comment-type actions are not supported in user contexts,
+  // because we wouldn't know which comment to choose.
+  switch ($type) {
+    // An action that works with nodes is being called in a user context.
+    // If a single node is being viewed, return the node.
+    case 'node':
+      // If we are viewing an individual node, return the node.
+      if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == NULL) {
+        return node_load(array('nid' => arg(1)));
+      }
+      break;
+  }
+}
+
+/**
+ * Implements hook_user_login().
+ */
+function trigger_user_login(&$edit, $account, $category) {
+  _trigger_user('user_login', $edit, $account, $category);
+}
+
+/**
+ * Implements hook_user_logout().
+ */
+function trigger_user_logout($account) {
+  $edit = array();
+  _trigger_user('user_logout', $edit, $account);
+}
+
+/**
+ * Implements hook_user_insert().
+ */
+function trigger_user_insert(&$edit, $account, $category) {
+  _trigger_user('user_insert', $edit, $account, $category);
+}
+
+/**
+ * Implements hook_user_update().
+ */
+function trigger_user_update(&$edit, $account, $category) {
+  _trigger_user('user_update', $edit, $account, $category);
+}
+
+/**
+ * Implements hook_user_cancel().
+ */
+function trigger_user_cancel($edit, $account, $method) {
+  switch ($method) {
+    case 'user_cancel_reassign':
+      _trigger_user('user_delete', $edit, $account, $method);
+      break;
+  }
+}
+
+/**
+ * Implements hook_user_delete().
+ */
+function trigger_user_delete($account) {
+  $edit = array();
+  _trigger_user('user_delete', $edit, $account, NULL);
+}
+
+/**
+ * Implements hook_user_view().
+ */
+function trigger_user_view($account) {
+  $edit = NULL;
+  _trigger_user('user_view', $edit, $account, NULL);
+}
+
+/**
+ * Calls action functions for user triggers.
+ *
+ * @param $hook
+ *   The hook that called this function.
+ * @param $edit
+ *   Edit variable passed in to the hook or empty array if not needed.
+ * @param $account
+ *   Account variable passed in to the hook.
+ * @param $method
+ *   Method variable passed in to the hook or NULL if not needed.
+ */
+function _trigger_user($hook, &$edit, $account, $category = NULL) {
+  // Keep objects for reuse so that changes actions make to objects can persist.
+  static $objects;
+  $aids = trigger_get_assigned_actions($hook);
+  $context = array(
+    'group' => 'user',
+    'hook' => $hook,
+    'form_values' => &$edit,
+  );
+  foreach ($aids as $aid => $info) {
+    $type = $info['type'];
+    if ($type != 'user') {
+      if (!isset($objects[$type])) {
+        $objects[$type] = _trigger_normalize_user_context($type, $account);
+      }
+      $context['user'] = $account;
+      actions_do($aid, $objects[$type], $context);
+    }
+    else {
+      actions_do($aid, $account, $context, $category);
+    }
+  }
+}
+
+/**
+ * Calls action functions for taxonomy triggers.
+ *
+ * @param $hook
+ *   Hook to trigger actions for taxonomy_term_insert(),
+ *   taxonomy_term_update(), and taxonomy_term_delete().
+ * @param $array
+ *   Item on which operation is being performed, either a term or
+ *   form values.
+ */
+function _trigger_taxonomy($hook, $array) {
+  $aids = trigger_get_assigned_actions($hook);
+  $context = array(
+    'group' => 'taxonomy',
+    'hook' => $hook
+  );
+  actions_do(array_keys($aids), (object) $array, $context);
+}
+
+/**
+ * Implements hook_taxonomy_term_insert().
+ */
+function trigger_taxonomy_term_insert($term) {
+  _trigger_taxonomy('taxonomy_term_insert', (array) $term);
+}
+
+/**
+ * Implements hook_taxonomy_term_update().
+ */
+function trigger_taxonomy_term_update($term) {
+  _trigger_taxonomy('taxonomy_term_update', (array) $term);
+}
+
+/**
+ * Implements hook_taxonomy_term_delete().
+ */
+function trigger_taxonomy_term_delete($term) {
+  _trigger_taxonomy('taxonomy_term_delete', (array) $term);
+}
+
+/**
+ * Implements hook_actions_delete().
+ *
+ * Removes all trigger entries for the given action, when an action is deleted.
+ */
+function trigger_actions_delete($aid) {
+  db_delete('trigger_assignments')
+    ->condition('aid', $aid)
+    ->execute();
+  drupal_static_reset('trigger_get_assigned_actions');
+}
+
+/**
+ * Retrieves and caches information from hook_trigger_info() implementations.
+ *
+ * @return
+ *   Array of all triggers.
+ */
+function _trigger_get_all_info() {
+  $triggers = &drupal_static(__FUNCTION__);
+
+  if (!isset($triggers)) {
+    $triggers = module_invoke_all('trigger_info');
+    drupal_alter('trigger_info', $triggers);
+  }
+
+  return $triggers;
+}
+
+/**
+ * Gathers information about tabs on the triggers administration screen.
+ *
+ * @return
+ *   Array of modules that have triggers, with the keys being the
+ *   machine-readable name of the module, and the values being the
+ *   human-readable name of the module.
+ */
+function _trigger_tab_information() {
+  // Gather information about all triggers and modules.
+  $trigger_info = _trigger_get_all_info();
+  $modules = system_get_info('module');
+  $modules = array_intersect_key($modules, $trigger_info);
+
+  $return_info = array();
+  foreach ($modules as $name => $info) {
+    $return_info[$name] = $info['name'];
+  }
+
+  return $return_info;
+}
diff --git a/htmltest/modules/trigger/trigger.test b/htmltest/modules/trigger/trigger.test
new file mode 100644
index 00000000..9e5f1142
--- /dev/null
+++ b/htmltest/modules/trigger/trigger.test
@@ -0,0 +1,771 @@
+<?php
+
+/**
+ * @file
+ * Tests for trigger.module.
+ */
+
+/**
+ * Provides common helper methods.
+ */
+class TriggerWebTestCase extends DrupalWebTestCase {
+
+  /**
+   * Configures an advanced action.
+   *
+   * @param $action
+   *   The name of the action callback. For example: 'user_block_user_action'
+   * @param $edit
+   *   The $edit array for the form to be used to configure.
+   *   Example members would be 'actions_label' (always), 'message', etc.
+   *
+   * @return
+   *   the aid (action id) of the configured action, or FALSE if none.
+   */
+  protected function configureAdvancedAction($action, $edit) {
+    // Create an advanced action.
+    $hash = drupal_hash_base64($action);
+    $this->drupalPost("admin/config/system/actions/configure/$hash", $edit, t('Save'));
+    $this->assertText(t('The action has been successfully saved.'));
+
+    // Now we have to find out the action ID of what we created.
+    return db_query('SELECT aid FROM {actions} WHERE callback = :callback AND label = :label', array(':callback' => $action, ':label' => $edit['actions_label']))->fetchField();
+  }
+
+}
+
+/**
+ * Provides tests for node triggers.
+ */
+class TriggerContentTestCase extends TriggerWebTestCase {
+  var $_cleanup_roles = array();
+  var $_cleanup_users = array();
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Trigger content (node) actions',
+      'description' => 'Perform various tests with content actions.',
+      'group' => 'Trigger',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('trigger', 'trigger_test');
+  }
+
+  /**
+   * Tests several content-oriented trigger issues.
+   *
+   * These are in one function to assure they happen in the right order.
+   */
+  function testActionsContent() {
+    global $user;
+    $content_actions = array('node_publish_action', 'node_unpublish_action', 'node_make_sticky_action', 'node_make_unsticky_action', 'node_promote_action', 'node_unpromote_action');
+
+    $test_user = $this->drupalCreateUser(array('administer actions'));
+    $web_user = $this->drupalCreateUser(array('create page content', 'access content', 'administer nodes'));
+    foreach ($content_actions as $action) {
+      $hash = drupal_hash_base64($action);
+      $info = $this->actionInfo($action);
+
+      // Assign an action to a trigger, then pull the trigger, and make sure
+      // the actions fire.
+      $this->drupalLogin($test_user);
+      $edit = array('aid' => $hash);
+      $this->drupalPost('admin/structure/trigger/node', $edit, t('Assign'), array(), array(), 'trigger-node-presave-assign-form');
+      // Create an unpublished node.
+      $this->drupalLogin($web_user);
+      $edit = array();
+      $langcode = LANGUAGE_NONE;
+      $edit["title"] = '!SimpleTest test node! ' . $this->randomName(10);
+      $edit["body[$langcode][0][value]"] = '!SimpleTest test body! ' . $this->randomName(32) . ' ' . $this->randomName(32);
+      $edit[$info['property']] = !$info['expected'];
+      $this->drupalPost('node/add/page', $edit, t('Save'));
+      // Make sure the text we want appears.
+      $this->assertRaw(t('!post %title has been created.', array('!post' => 'Basic page', '%title' => $edit["title"])), 'Make sure the Basic page has actually been created');
+      // Action should have been fired.
+      $loaded_node = $this->drupalGetNodeByTitle($edit["title"]);
+      $this->assertTrue($loaded_node->$info['property'] == $info['expected'], format_string('Make sure the @action action fired.', array('@action' => $info['name'])));
+      // Leave action assigned for next test
+
+      // There should be an error when the action is assigned to the trigger
+      // twice.
+      $this->drupalLogin($test_user);
+      // This action already assigned in this test.
+      $edit = array('aid' => $hash);
+      $this->drupalPost('admin/structure/trigger/node', $edit, t('Assign'), array(), array(), 'trigger-node-presave-assign-form');
+      $this->assertRaw(t('The action you chose is already assigned to that trigger.'), 'Check to make sure an error occurs when assigning an action to a trigger twice.');
+
+      // The action should be able to be unassigned from a trigger.
+      $this->drupalPost('admin/structure/trigger/unassign/node/node_presave/' . $hash, array(), t('Unassign'));
+      $this->assertRaw(t('Action %action has been unassigned.', array('%action' => ucfirst($info['name']))), format_string('Check to make sure the @action action can be unassigned from the trigger.', array('@action' => $info['name'])));
+      $assigned = db_query("SELECT COUNT(*) FROM {trigger_assignments} WHERE aid IN (:keys)", array(':keys' => $content_actions))->fetchField();
+      $this->assertFalse($assigned, 'Check to make sure unassign worked properly at the database level.');
+    }
+  }
+
+  /**
+   * Tests multiple node actions.
+   *
+   * Verifies that node actions are fired for each node individually, if acting
+   * on multiple nodes.
+   */
+  function testActionContentMultiple() {
+    // Assign an action to the node save/update trigger.
+    $test_user = $this->drupalCreateUser(array('administer actions', 'administer nodes', 'create page content', 'access administration pages', 'access content overview'));
+    $this->drupalLogin($test_user);
+    $nodes = array();
+
+    for ($index = 0; $index < 3; $index++) {
+      $nodes[] = $this->drupalCreateNode(array('type' => 'page'));
+    }
+
+    $action_id = 'trigger_test_generic_any_action';
+    $hash = drupal_hash_base64($action_id);
+    $edit = array('aid' => $hash);
+    $this->drupalPost('admin/structure/trigger/node', $edit, t('Assign'), array(), array(), 'trigger-node-update-assign-form');
+
+    $edit = array(
+      'operation' => 'unpublish',
+      'nodes[' . $nodes[0]->nid . ']' => TRUE,
+      'nodes[' . $nodes[1]->nid . ']' => TRUE,
+    );
+    $this->drupalPost('admin/content', $edit, t('Update'));
+    $count = variable_get('trigger_test_generic_any_action', 0);
+    $this->assertTrue($count == 2, format_string('Action was triggered 2 times. Actual: %count', array('%count' => $count)));
+  }
+
+  /**
+   * Returns some info about each of the content actions.
+   *
+   * This is helper function for testActionsContent().
+   *
+   * @param $action
+   *   The name of the action to return info about.
+   *
+   * @return
+   *   An associative array of info about the action.
+   */
+  function actionInfo($action) {
+    $info = array(
+      'node_publish_action' => array(
+        'property' => 'status',
+        'expected' => 1,
+        'name' => t('publish content'),
+      ),
+      'node_unpublish_action' => array(
+        'property' => 'status',
+        'expected' => 0,
+        'name' => t('unpublish content'),
+      ),
+      'node_make_sticky_action' => array(
+        'property' => 'sticky',
+        'expected' => 1,
+        'name' => t('make content sticky'),
+      ),
+      'node_make_unsticky_action' => array(
+        'property' => 'sticky',
+        'expected' => 0,
+        'name' => t('make content unsticky'),
+      ),
+      'node_promote_action' => array(
+        'property' => 'promote',
+        'expected' => 1,
+        'name' => t('promote content to front page'),
+      ),
+      'node_unpromote_action' => array(
+        'property' => 'promote',
+        'expected' => 0,
+        'name' => t('remove content from front page'),
+      ),
+    );
+    return $info[$action];
+  }
+}
+
+/**
+ * Tests cron trigger.
+ */
+class TriggerCronTestCase extends TriggerWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Trigger cron (system) actions',
+      'description' => 'Perform various tests with cron trigger.',
+      'group' => 'Trigger',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('trigger', 'trigger_test');
+  }
+
+  /**
+   * Tests assigning multiple actions to the cron trigger.
+   *
+   * This test ensures that both simple and multiple complex actions
+   * succeed properly. This is done in the cron trigger test because
+   * cron allows passing multiple actions in at once.
+   */
+  function testActionsCron() {
+    // Create an administrative user.
+    $test_user = $this->drupalCreateUser(array('administer actions'));
+    $this->drupalLogin($test_user);
+
+    // Assign a non-configurable action to the cron run trigger.
+    $edit = array('aid' => drupal_hash_base64('trigger_test_system_cron_action'));
+    $this->drupalPost('admin/structure/trigger/system', $edit, t('Assign'), array(), array(), 'trigger-cron-assign-form');
+
+    // Assign a configurable action to the cron trigger.
+    $action_label = $this->randomName();
+    $edit = array(
+      'actions_label' => $action_label,
+      'subject' => $action_label,
+    );
+    $aid = $this->configureAdvancedAction('trigger_test_system_cron_conf_action', $edit);
+    // $aid is likely 3 but if we add more uses for the sequences table in
+    // core it might break, so it is easier to get the value from the database.
+    $edit = array('aid' => drupal_hash_base64($aid));
+    $this->drupalPost('admin/structure/trigger/system', $edit, t('Assign'), array(), array(), 'trigger-cron-assign-form');
+
+    // Add a second configurable action to the cron trigger.
+    $action_label = $this->randomName();
+    $edit = array(
+      'actions_label' => $action_label,
+      'subject' => $action_label,
+    );
+    $aid = $this->configureAdvancedAction('trigger_test_system_cron_conf_action', $edit);
+    $edit = array('aid' => drupal_hash_base64($aid));
+    $this->drupalPost('admin/structure/trigger/system', $edit, t('Assign'), array(), array(), 'trigger-cron-assign-form');
+
+    // Force a cron run.
+    $this->cronRun();
+
+    // Make sure the non-configurable action has fired.
+    $action_run = variable_get('trigger_test_system_cron_action', FALSE);
+    $this->assertTrue($action_run, 'Check that the cron run triggered the test action.');
+
+    // Make sure that both configurable actions have fired.
+    $action_run = variable_get('trigger_test_system_cron_conf_action', 0) == 2;
+    $this->assertTrue($action_run, 'Check that the cron run triggered both complex actions.');
+  }
+}
+
+/**
+ * Provides a base class with trigger assignments and test comparisons.
+ */
+class TriggerActionTestCase extends TriggerWebTestCase {
+
+  function setUp() {
+    parent::setUp('trigger');
+  }
+
+  /**
+   * Creates a message with tokens.
+   *
+   * @param $trigger
+   *
+   * @return
+   *   A message with embedded tokens.
+   */
+  function generateMessageWithTokens($trigger) {
+    // Note that subject is limited to 254 characters in action configuration.
+    $message = t('Action was triggered by trigger @trigger user:name=[user:name] user:uid=[user:uid] user:mail=[user:mail] user:url=[user:url] user:edit-url=[user:edit-url] user:created=[user:created]',
+      array('@trigger' => $trigger));
+    return trim($message);
+  }
+
+  /**
+   * Generates a comparison message to match the pre-token-replaced message.
+   *
+   * @param $trigger
+   *   Trigger, like 'user_login'.
+   * @param $account
+   *   Associated user account.
+   *
+   * @return
+   *   The token-replaced equivalent message. This does not use token
+   *   functionality.
+   *
+   * @see generateMessageWithTokens()
+   */
+  function generateTokenExpandedComparison($trigger, $account) {
+    // Note that user:last-login was omitted because it changes and can't
+    // be properly verified.
+    $message = t('Action was triggered by trigger @trigger user:name=@username user:uid=@uid user:mail=@mail user:url=@user_url user:edit-url=@user_edit_url user:created=@user_created',
+       array(
+        '@trigger' => $trigger,
+        '@username' => $account->name,
+        '@uid' => !empty($account->uid) ? $account->uid : t('not yet assigned'),
+        '@mail' => $account->mail,
+        '@user_url' => !empty($account->uid) ? url("user/$account->uid", array('absolute' => TRUE)) : t('not yet assigned'),
+        '@user_edit_url' => !empty($account->uid) ? url("user/$account->uid/edit", array('absolute' => TRUE)) : t('not yet assigned'),
+        '@user_created' => isset($account->created) ? format_date($account->created, 'medium') : t('not yet created'),
+        )
+      );
+      return trim($message);
+  }
+
+
+  /**
+   * Assigns a simple (non-configurable) action to a trigger.
+   *
+   * @param $trigger
+   *   The trigger to assign to, like 'user_login'.
+   * @param $action
+   *   The simple action to be assigned, like 'comment_insert'.
+   */
+  function assignSimpleAction($trigger, $action) {
+    $form_name = "trigger_{$trigger}_assign_form";
+    $form_html_id = strtr($form_name, '_', '-');
+    $edit = array('aid' => drupal_hash_base64($action));
+    $trigger_type = preg_replace('/_.*/', '', $trigger);
+    $this->drupalPost("admin/structure/trigger/$trigger_type", $edit, t('Assign'), array(), array(), $form_html_id);
+    $actions = trigger_get_assigned_actions($trigger);
+    $this->assertTrue(!empty($actions[$action]), format_string('Simple action @action assigned to trigger @trigger', array('@action' => $action, '@trigger' => $trigger)));
+  }
+
+  /**
+   * Assigns a system message action to the passed-in trigger.
+   *
+   * @param $trigger
+   *   For example, 'user_login'
+   */
+  function assignSystemMessageAction($trigger) {
+    $form_name = "trigger_{$trigger}_assign_form";
+    $form_html_id = strtr($form_name, '_', '-');
+    // Assign a configurable action 'System message' to the passed trigger.
+    $action_edit = array(
+      'actions_label' => $trigger . "_system_message_action_" . $this->randomName(16),
+      'message' => $this->generateMessageWithTokens($trigger),
+    );
+
+    // Configure an advanced action that we can assign.
+    $aid = $this->configureAdvancedAction('system_message_action', $action_edit);
+
+    $edit = array('aid' => drupal_hash_base64($aid));
+    $this->drupalPost('admin/structure/trigger/user', $edit, t('Assign'), array(), array(), $form_html_id);
+    drupal_static_reset('trigger_get_asssigned_actions');
+  }
+
+
+  /**
+   * Assigns a system_send_email_action to the passed-in trigger.
+   *
+   * @param $trigger
+   *   For example, 'user_login'
+   */
+  function assignSystemEmailAction($trigger) {
+    $form_name = "trigger_{$trigger}_assign_form";
+    $form_html_id = strtr($form_name, '_', '-');
+
+    $message = $this->generateMessageWithTokens($trigger);
+    // Assign a configurable action 'System message' to the passed trigger.
+    $action_edit = array(
+      // 'actions_label' => $trigger . "_system_send_message_action_" . $this->randomName(16),
+      'actions_label' => $trigger . "_system_send_email_action",
+      'recipient' => '[user:mail]',
+      'subject' => $message,
+      'message' => $message,
+    );
+
+    // Configure an advanced action that we can assign.
+    $aid = $this->configureAdvancedAction('system_send_email_action', $action_edit);
+
+    $edit = array('aid' => drupal_hash_base64($aid));
+    $this->drupalPost('admin/structure/trigger/user', $edit, t('Assign'), array(), array(), $form_html_id);
+    drupal_static_reset('trigger_get_assigned_actions');
+  }
+
+  /**
+   * Asserts correct token replacement in both system message and email.
+   *
+   * @param $trigger
+   *   A trigger like 'user_login'.
+   * @param $account
+   *   The user account which triggered the action.
+   * @param $email_depth
+   *   Number of emails to scan, starting with most recent.
+   */
+  function assertSystemMessageAndEmailTokenReplacement($trigger, $account, $email_depth = 1) {
+    $this->assertSystemMessageTokenReplacement($trigger, $account);
+    $this->assertSystemEmailTokenReplacement($trigger, $account, $email_depth);
+  }
+
+  /**
+   * Asserts correct token replacement for the given trigger and account.
+   *
+   * @param $trigger
+   *   A trigger like 'user_login'.
+   * @param $account
+   *   The user account which triggered the action.
+   */
+  function assertSystemMessageTokenReplacement($trigger, $account) {
+    $expected = $this->generateTokenExpandedComparison($trigger, $account);
+    $this->assertText($expected,
+      format_string('Expected system message to contain token-replaced text "@expected" found in configured system message action', array('@expected' => $expected )) );
+  }
+
+
+  /**
+   * Asserts correct token replacement for the given trigger and account.
+   *
+   * @param $trigger
+   *   A trigger like 'user_login'.
+   * @param $account
+   *   The user account which triggered the action.
+   * @param $email_depth
+   *   Number of emails to scan, starting with most recent.
+   */
+  function assertSystemEmailTokenReplacement($trigger, $account, $email_depth = 1) {
+    $this->verboseEmail($email_depth);
+    $expected = $this->generateTokenExpandedComparison($trigger, $account);
+    $this->assertMailString('subject', $expected, $email_depth);
+    $this->assertMailString('body', $expected, $email_depth);
+    $this->assertMail('to', $account->mail, 'Mail sent to correct destination');
+  }
+}
+
+/**
+ * Tests token substitution in trigger actions.
+ *
+ * This tests nearly every permutation of user triggers with system actions
+ * and checks the token replacement.
+ */
+class TriggerUserTokenTestCase extends TriggerActionTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Test user triggers',
+      'description' => 'Test user triggers and system actions with token replacement.',
+      'group' => 'Trigger',
+    );
+  }
+
+
+  /**
+   * Tests a variety of token replacements in actions.
+   */
+  function testUserTriggerTokenReplacement() {
+    $test_user = $this->drupalCreateUser(array('administer actions', 'administer users', 'change own username', 'access user profiles'));
+    $this->drupalLogin($test_user);
+
+    $triggers = array('user_login', 'user_insert', 'user_update', 'user_delete', 'user_logout', 'user_view');
+    foreach ($triggers as $trigger) {
+      $this->assignSystemMessageAction($trigger);
+      $this->assignSystemEmailAction($trigger);
+    }
+
+    $this->drupalLogout();
+    $this->assertSystemEmailTokenReplacement('user_logout', $test_user);
+
+    $this->drupalLogin($test_user);
+    $this->assertSystemMessageAndEmailTokenReplacement('user_login', $test_user, 2);
+    $this->assertSystemMessageAndEmailTokenReplacement('user_view', $test_user, 2);
+
+    $this->drupalPost("user/{$test_user->uid}/edit", array('name' => $test_user->name . '_changed'), t('Save'));
+    $test_user->name .= '_changed'; // Since we just changed it.
+    $this->assertSystemMessageAndEmailTokenReplacement('user_update', $test_user, 2);
+
+    $this->drupalGet('user');
+    $this->assertSystemMessageAndEmailTokenReplacement('user_view', $test_user);
+
+    $new_user = $this->drupalCreateUser(array('administer actions', 'administer users', 'cancel account', 'access administration pages'));
+    $this->assertSystemEmailTokenReplacement('user_insert', $new_user);
+
+    $this->drupalLogin($new_user);
+    $user_to_delete = $this->drupalCreateUser(array('access content'));
+    variable_set('user_cancel_method', 'user_cancel_delete');
+
+    $this->drupalPost("user/{$user_to_delete->uid}/cancel", array(), t('Cancel account'));
+    $this->assertSystemMessageAndEmailTokenReplacement('user_delete', $user_to_delete);
+  }
+
+
+}
+
+/**
+ * Tests token substitution in trigger actions.
+ *
+ * This tests nearly every permutation of user triggers with system actions
+ * and checks the token replacement.
+ */
+class TriggerUserActionTestCase extends TriggerActionTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Test user actions',
+      'description' => 'Test user actions.',
+      'group' => 'Trigger',
+    );
+  }
+
+  /**
+   * Tests user action assignment and execution.
+   */
+  function testUserActionAssignmentExecution() {
+    $test_user = $this->drupalCreateUser(array('administer actions', 'create article content', 'access comments', 'administer comments', 'skip comment approval', 'edit own comments'));
+    $this->drupalLogin($test_user);
+
+    $triggers = array('comment_presave', 'comment_insert', 'comment_update');
+    // system_block_ip_action is difficult to test without ruining the test.
+    $actions = array('user_block_user_action');
+    foreach ($triggers as $trigger) {
+      foreach ($actions as $action) {
+        $this->assignSimpleAction($trigger, $action);
+      }
+    }
+
+    $node = $this->drupalCreateNode(array('type' => 'article'));
+    $this->drupalPost("node/{$node->nid}", array('comment_body[und][0][value]' => t("my comment"), 'subject' => t("my comment subject")), t('Save'));
+    // Posting a comment should have blocked this user.
+    $account = user_load($test_user->uid, TRUE);
+    $this->assertTrue($account->status == 0, 'Account is blocked');
+    $comment_author_uid = $account->uid;
+    // Now rehabilitate the comment author so it can be be blocked again when
+    // the comment is updated.
+    user_save($account, array('status' => TRUE));
+
+    $test_user = $this->drupalCreateUser(array('administer actions', 'create article content', 'access comments', 'administer comments', 'skip comment approval', 'edit own comments'));
+    $this->drupalLogin($test_user);
+
+    // Our original comment will have been comment 1.
+    $this->drupalPost("comment/1/edit", array('comment_body[und][0][value]' => t("my comment, updated"), 'subject' => t("my comment subject")), t('Save'));
+    $comment_author_account = user_load($comment_author_uid, TRUE);
+    $this->assertTrue($comment_author_account->status == 0, format_string('Comment author account (uid=@uid) is blocked after update to comment', array('@uid' => $comment_author_uid)));
+
+    // Verify that the comment was updated.
+    $test_user = $this->drupalCreateUser(array('administer actions', 'create article content', 'access comments', 'administer comments', 'skip comment approval', 'edit own comments'));
+    $this->drupalLogin($test_user);
+
+    $this->drupalGet("node/$node->nid");
+    $this->assertText(t("my comment, updated"));
+    $this->verboseEmail();
+  }
+}
+
+/**
+ * Tests other triggers.
+ */
+class TriggerOtherTestCase extends TriggerWebTestCase {
+  var $_cleanup_roles = array();
+  var $_cleanup_users = array();
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Trigger other actions',
+      'description' => 'Test triggering of user, comment, taxonomy actions.',
+      'group' => 'Trigger',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('trigger', 'trigger_test', 'contact');
+  }
+
+  /**
+   * Tests triggering on user create and user login.
+   */
+  function testActionsUser() {
+    // Assign an action to the create user trigger.
+    $test_user = $this->drupalCreateUser(array('administer actions'));
+    $this->drupalLogin($test_user);
+    $action_id = 'trigger_test_generic_action';
+    $hash = drupal_hash_base64($action_id);
+    $edit = array('aid' => $hash);
+    $this->drupalPost('admin/structure/trigger/user', $edit, t('Assign'), array(), array(), 'trigger-user-insert-assign-form');
+
+    // Set action variable to FALSE.
+    variable_set($action_id, FALSE);
+
+    // Create an unblocked user
+    $web_user = $this->drupalCreateUser(array('administer users'));
+    $this->drupalLogin($web_user);
+    $name = $this->randomName();
+    $pass = user_password();
+    $edit = array();
+    $edit['name'] = $name;
+    $edit['mail'] = $name . '@example.com';
+    $edit['pass[pass1]'] = $pass;
+    $edit['pass[pass2]'] = $pass;
+    $edit['status'] = 1;
+    $this->drupalPost('admin/people/create', $edit, t('Create new account'));
+
+    // Verify that the action variable has been set.
+    $this->assertTrue(variable_get($action_id, FALSE), 'Check that creating a user triggered the test action.');
+
+    // Reset the action variable.
+    variable_set($action_id, FALSE);
+
+    $this->drupalLogin($test_user);
+    // Assign a configurable action 'System message' to the user_login trigger.
+    $action_edit = array(
+      'actions_label' => $this->randomName(16),
+      'message' => t("You have logged in:") . $this->randomName(16),
+    );
+
+    // Configure an advanced action that we can assign.
+    $aid = $this->configureAdvancedAction('system_message_action', $action_edit);
+    $edit = array('aid' => drupal_hash_base64($aid));
+    $this->drupalPost('admin/structure/trigger/user', $edit, t('Assign'), array(), array(), 'trigger-user-login-assign-form');
+
+    // Verify that the action has been assigned to the correct hook.
+    $actions = trigger_get_assigned_actions('user_login');
+    $this->assertEqual(1, count($actions), 'One Action assigned to the hook');
+    $this->assertEqual($actions[$aid]['label'], $action_edit['actions_label'], 'Correct action label found.');
+
+    // User should get the configured message at login.
+    $contact_user = $this->drupalCreateUser(array('access site-wide contact form'));;
+    $this->drupalLogin($contact_user);
+    $this->assertText($action_edit['message']);
+  }
+
+  /**
+   * Tests triggering on comment save.
+   */
+  function testActionsComment() {
+    // Assign an action to the comment save trigger.
+    $test_user = $this->drupalCreateUser(array('administer actions'));
+    $this->drupalLogin($test_user);
+    $action_id = 'trigger_test_generic_action';
+    $hash = drupal_hash_base64($action_id);
+    $edit = array('aid' => $hash);
+    $this->drupalPost('admin/structure/trigger/comment', $edit, t('Assign'), array(), array(), 'trigger-comment-insert-assign-form');
+
+    // Set action variable to FALSE.
+    variable_set($action_id, FALSE);
+
+    // Create a node and add a comment to it.
+    $web_user = $this->drupalCreateUser(array('create article content', 'access content', 'skip comment approval', 'post comments'));
+    $this->drupalLogin($web_user);
+    $node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
+    $edit = array();
+    $edit['subject'] = $this->randomName(10);
+    $edit['comment_body[' . LANGUAGE_NONE . '][0][value]'] = $this->randomName(10) . ' ' . $this->randomName(10);
+    $this->drupalGet('comment/reply/' . $node->nid);
+    $this->drupalPost(NULL, $edit, t('Save'));
+
+    // Verify that the action variable has been set.
+    $this->assertTrue(variable_get($action_id, FALSE), 'Check that creating a comment triggered the action.');
+  }
+
+  /**
+   * Tests triggering on taxonomy new term.
+   */
+  function testActionsTaxonomy() {
+    // Assign an action to the taxonomy term save trigger.
+    $test_user = $this->drupalCreateUser(array('administer actions'));
+    $this->drupalLogin($test_user);
+    $action_id = 'trigger_test_generic_action';
+    $hash = drupal_hash_base64($action_id);
+    $edit = array('aid' => $hash);
+    $this->drupalPost('admin/structure/trigger/taxonomy', $edit, t('Assign'), array(), array(), 'trigger-taxonomy-term-insert-assign-form');
+
+    // Set action variable to FALSE.
+    variable_set($action_id, FALSE);
+
+    // Create a taxonomy vocabulary and add a term to it.
+
+    // Create a vocabulary.
+    $vocabulary = new stdClass();
+    $vocabulary->name = $this->randomName();
+    $vocabulary->description = $this->randomName();
+    $vocabulary->machine_name = drupal_strtolower($this->randomName());
+    $vocabulary->help = '';
+    $vocabulary->nodes = array('article' => 'article');
+    $vocabulary->weight = mt_rand(0, 10);
+    taxonomy_vocabulary_save($vocabulary);
+
+    $term = new stdClass();
+    $term->name = $this->randomName();
+    $term->vid = $vocabulary->vid;
+    taxonomy_term_save($term);
+
+    // Verify that the action variable has been set.
+    $this->assertTrue(variable_get($action_id, FALSE), 'Check that creating a taxonomy term triggered the action.');
+  }
+
+}
+
+/**
+ * Tests that orphaned actions are properly handled.
+ */
+class TriggerOrphanedActionsTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Trigger orphaned actions',
+      'description' => 'Test triggering an action that has since been removed.',
+      'group' => 'Trigger',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('trigger', 'trigger_test');
+  }
+
+  /**
+   * Tests logic around orphaned actions.
+   */
+  function testActionsOrphaned() {
+    $action = 'trigger_test_generic_any_action';
+    $hash = drupal_hash_base64($action);
+
+    // Assign an action from a disable-able module to a trigger, then pull the
+    // trigger, and make sure the actions fire.
+    $test_user = $this->drupalCreateUser(array('administer actions'));
+    $this->drupalLogin($test_user);
+    $edit = array('aid' => $hash);
+    $this->drupalPost('admin/structure/trigger/node', $edit, t('Assign'), array(), array(), 'trigger-node-presave-assign-form');
+
+    // Create an unpublished node.
+    $web_user = $this->drupalCreateUser(array('create page content', 'edit own page content', 'access content', 'administer nodes'));
+    $this->drupalLogin($web_user);
+    $edit = array();
+    $langcode = LANGUAGE_NONE;
+    $edit["title"] = '!SimpleTest test node! ' . $this->randomName(10);
+    $edit["body[$langcode][0][value]"] = '!SimpleTest test body! ' . $this->randomName(32) . ' ' . $this->randomName(32);
+    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->assertRaw(t('!post %title has been created.', array('!post' => 'Basic page', '%title' => $edit["title"])), 'Make sure the Basic page has actually been created');
+
+    // Action should have been fired.
+    $this->assertTrue(variable_get('trigger_test_generic_any_action', FALSE), 'Trigger test action successfully fired.');
+
+    // Disable the module that provides the action and make sure the trigger
+    // doesn't white screen.
+    module_disable(array('trigger_test'));
+    $loaded_node = $this->drupalGetNodeByTitle($edit["title"]);
+    $edit["body[$langcode][0][value]"] = '!SimpleTest test body! ' . $this->randomName(32) . ' ' . $this->randomName(32);
+    $this->drupalPost("node/$loaded_node->nid/edit", $edit, t('Save'));
+
+    // If the node body was updated successfully we have dealt with the
+    // unavailable action.
+    $this->assertRaw(t('!post %title has been updated.', array('!post' => 'Basic page', '%title' => $edit["title"])), 'Make sure the Basic page can be updated with the missing trigger function.');
+  }
+}
+
+/**
+ * Tests the unassigning of triggers.
+ */
+class TriggerUnassignTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Trigger unassigning',
+      'description' => 'Tests the unassigning of triggers.',
+      'group' => 'Trigger',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('trigger', 'trigger_test');
+    $web_user = $this->drupalCreateUser(array('administer actions'));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Tests an attempt to unassign triggers when none are assigned.
+   */
+  function testUnassignAccessDenied() {
+    $this->drupalGet('admin/structure/trigger/unassign');
+    $this->assertResponse(403, 'If there are no actions available, return access denied.');
+  }
+
+}
diff --git a/htmltest/modules/update/tests/aaa_update_test.1_0.xml b/htmltest/modules/update/tests/aaa_update_test.1_0.xml
new file mode 100644
index 00000000..a168453f
--- /dev/null
+++ b/htmltest/modules/update/tests/aaa_update_test.1_0.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>AAA Update test</title>
+<short_name>aaa_update_test</short_name>
+<dc:creator>Drupal</dc:creator>
+<api_version>7.x</api_version>
+<recommended_major>1</recommended_major>
+<supported_majors>1</supported_majors>
+<default_major>1</default_major>
+<project_status>published</project_status>
+<link>http://example.com/project/aaa_update_test</link>
+  <terms>
+   <term><name>Projects</name><value>Modules</value></term>
+  </terms>
+<releases>
+ <release>
+  <name>aaa_update_test 7.x-1.0</name>
+  <version>7.x-1.0</version>
+  <tag>DRUPAL-7--1-0</tag>
+  <version_major>1</version_major>
+  <version_patch>0</version_patch>
+  <status>published</status>
+  <release_link>http://example.com/aaa_update_test-7-x-1-0-release</release_link>
+  <download_link>http://example.com/aaa_update_test-7.x-1.0.tar.gz</download_link>
+  <date>1250424521</date>
+  <mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
+  <filesize>1073741824</filesize>
+  <terms>
+   <term><name>Release type</name><value>New features</value></term>
+   <term><name>Release type</name><value>Bug fixes</value></term>
+  </terms>
+ </release>
+</releases>
+</project>
diff --git a/htmltest/modules/update/tests/aaa_update_test.info b/htmltest/modules/update/tests/aaa_update_test.info
new file mode 100644
index 00000000..3da5a70a
--- /dev/null
+++ b/htmltest/modules/update/tests/aaa_update_test.info
@@ -0,0 +1,11 @@
+name = AAA Update test
+description = Support module for update module testing.
+package = Testing
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/update/tests/aaa_update_test.module b/htmltest/modules/update/tests/aaa_update_test.module
new file mode 100644
index 00000000..4d67b8e4
--- /dev/null
+++ b/htmltest/modules/update/tests/aaa_update_test.module
@@ -0,0 +1,6 @@
+<?php
+
+/**
+ * @file
+ * Dummy module for testing Update status.
+ */
diff --git a/htmltest/modules/update/tests/aaa_update_test.no-releases.xml b/htmltest/modules/update/tests/aaa_update_test.no-releases.xml
new file mode 100644
index 00000000..e266d499
--- /dev/null
+++ b/htmltest/modules/update/tests/aaa_update_test.no-releases.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?>
+<error>No release history was found for the requested project (aaa_update_test).</error>
diff --git a/htmltest/modules/update/tests/aaa_update_test.tar.gz b/htmltest/modules/update/tests/aaa_update_test.tar.gz
new file mode 100644
index 00000000..22c97191
Binary files /dev/null and b/htmltest/modules/update/tests/aaa_update_test.tar.gz differ
diff --git a/htmltest/modules/update/tests/bbb_update_test.1_0.xml b/htmltest/modules/update/tests/bbb_update_test.1_0.xml
new file mode 100644
index 00000000..bfdf196f
--- /dev/null
+++ b/htmltest/modules/update/tests/bbb_update_test.1_0.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>BBB Update test</title>
+<short_name>bbb_update_test</short_name>
+<dc:creator>Drupal</dc:creator>
+<api_version>7.x</api_version>
+<recommended_major>1</recommended_major>
+<supported_majors>1</supported_majors>
+<default_major>1</default_major>
+<project_status>published</project_status>
+<link>http://example.com/project/bbb_update_test</link>
+  <terms>
+   <term><name>Projects</name><value>Modules</value></term>
+  </terms>
+<releases>
+ <release>
+  <name>bbb_update_test 7.x-1.0</name>
+  <version>7.x-1.0</version>
+  <tag>DRUPAL-7--1-0</tag>
+  <version_major>1</version_major>
+  <version_patch>0</version_patch>
+  <status>published</status>
+  <release_link>http://example.com/bbb_update_test-7-x-1-0-release</release_link>
+  <download_link>http://example.com/bbb_update_test-7.x-1.0.tar.gz</download_link>
+  <date>1250424521</date>
+  <mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
+  <filesize>1073741824</filesize>
+  <terms>
+   <term><name>Release type</name><value>New features</value></term>
+   <term><name>Release type</name><value>Bug fixes</value></term>
+  </terms>
+ </release>
+</releases>
+</project>
diff --git a/htmltest/modules/update/tests/bbb_update_test.info b/htmltest/modules/update/tests/bbb_update_test.info
new file mode 100644
index 00000000..c825b796
--- /dev/null
+++ b/htmltest/modules/update/tests/bbb_update_test.info
@@ -0,0 +1,11 @@
+name = BBB Update test
+description = Support module for update module testing.
+package = Testing
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/update/tests/bbb_update_test.module b/htmltest/modules/update/tests/bbb_update_test.module
new file mode 100644
index 00000000..4d67b8e4
--- /dev/null
+++ b/htmltest/modules/update/tests/bbb_update_test.module
@@ -0,0 +1,6 @@
+<?php
+
+/**
+ * @file
+ * Dummy module for testing Update status.
+ */
diff --git a/htmltest/modules/update/tests/ccc_update_test.1_0.xml b/htmltest/modules/update/tests/ccc_update_test.1_0.xml
new file mode 100644
index 00000000..1b9ba75c
--- /dev/null
+++ b/htmltest/modules/update/tests/ccc_update_test.1_0.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>CCC Update test</title>
+<short_name>ccc_update_test</short_name>
+<dc:creator>Drupal</dc:creator>
+<api_version>7.x</api_version>
+<recommended_major>1</recommended_major>
+<supported_majors>1</supported_majors>
+<default_major>1</default_major>
+<project_status>published</project_status>
+<link>http://example.com/project/ccc_update_test</link>
+  <terms>
+   <term><name>Projects</name><value>Modules</value></term>
+  </terms>
+<releases>
+ <release>
+  <name>ccc_update_test 7.x-1.0</name>
+  <version>7.x-1.0</version>
+  <tag>DRUPAL-7--1-0</tag>
+  <version_major>1</version_major>
+  <version_patch>0</version_patch>
+  <status>published</status>
+  <release_link>http://example.com/ccc_update_test-7-x-1-0-release</release_link>
+  <download_link>http://example.com/ccc_update_test-7.x-1.0.tar.gz</download_link>
+  <date>1250424521</date>
+  <mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
+  <filesize>1073741824</filesize>
+  <terms>
+   <term><name>Release type</name><value>New features</value></term>
+   <term><name>Release type</name><value>Bug fixes</value></term>
+  </terms>
+ </release>
+</releases>
+</project>
diff --git a/htmltest/modules/update/tests/ccc_update_test.info b/htmltest/modules/update/tests/ccc_update_test.info
new file mode 100644
index 00000000..74bb5005
--- /dev/null
+++ b/htmltest/modules/update/tests/ccc_update_test.info
@@ -0,0 +1,11 @@
+name = CCC Update test
+description = Support module for update module testing.
+package = Testing
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/update/tests/ccc_update_test.module b/htmltest/modules/update/tests/ccc_update_test.module
new file mode 100644
index 00000000..4d67b8e4
--- /dev/null
+++ b/htmltest/modules/update/tests/ccc_update_test.module
@@ -0,0 +1,6 @@
+<?php
+
+/**
+ * @file
+ * Dummy module for testing Update status.
+ */
diff --git a/htmltest/modules/update/tests/drupal.0.xml b/htmltest/modules/update/tests/drupal.0.xml
new file mode 100644
index 00000000..701e11e3
--- /dev/null
+++ b/htmltest/modules/update/tests/drupal.0.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Drupal</title>
+<short_name>drupal</short_name>
+<dc:creator>Drupal</dc:creator>
+<api_version>7.x</api_version>
+<recommended_major>7</recommended_major>
+<supported_majors>7</supported_majors>
+<default_major>7</default_major>
+<project_status>published</project_status>
+<link>http://example.com/project/drupal</link>
+  <terms>
+   <term><name>Projects</name><value>Drupal project</value></term>
+  </terms>
+<releases>
+ <release>
+  <name>Drupal 7.0</name>
+  <version>7.0</version>
+  <tag>DRUPAL-7-0</tag>
+  <version_major>7</version_major>
+  <version_patch>0</version_patch>
+  <status>published</status>
+  <release_link>http://example.com/drupal-7-0-release</release_link>
+  <download_link>http://example.com/drupal-7-0.tar.gz</download_link>
+  <date>1250424521</date>
+  <mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
+  <filesize>1073741824</filesize>
+  <terms>
+   <term><name>Release type</name><value>New features</value></term>
+   <term><name>Release type</name><value>Bug fixes</value></term>
+  </terms>
+ </release>
+</releases>
+</project>
diff --git a/htmltest/modules/update/tests/drupal.1.xml b/htmltest/modules/update/tests/drupal.1.xml
new file mode 100644
index 00000000..de4cfd00
--- /dev/null
+++ b/htmltest/modules/update/tests/drupal.1.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Drupal</title>
+<short_name>drupal</short_name>
+<dc:creator>Drupal</dc:creator>
+<api_version>7.x</api_version>
+<recommended_major>7</recommended_major>
+<supported_majors>7</supported_majors>
+<default_major>7</default_major>
+<project_status>published</project_status>
+<link>http://example.com/project/drupal</link>
+  <terms>
+   <term><name>Projects</name><value>Drupal project</value></term>
+  </terms>
+<releases>
+ <release>
+  <name>Drupal 7.1</name>
+  <version>7.1</version>
+  <tag>DRUPAL-7-1</tag>
+  <version_major>7</version_major>
+  <version_patch>1</version_patch>
+  <status>published</status>
+  <release_link>http://example.com/drupal-7-1-release</release_link>
+  <download_link>http://example.com/drupal-7-1.tar.gz</download_link>
+  <date>1250424581</date>
+  <mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
+  <filesize>2147483648</filesize>
+  <terms>
+   <term><name>Release type</name><value>New features</value></term>
+   <term><name>Release type</name><value>Bug fixes</value></term>
+  </terms>
+ </release>
+ <release>
+  <name>Drupal 7.0</name>
+  <version>7.0</version>
+  <tag>DRUPAL-7-0</tag>
+  <version_major>7</version_major>
+  <version_patch>0</version_patch>
+  <status>published</status>
+  <release_link>http://example.com/drupal-7-0-release</release_link>
+  <download_link>http://example.com/drupal-7-0.tar.gz</download_link>
+  <date>1250424521</date>
+  <mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
+  <filesize>1073741824</filesize>
+  <terms>
+   <term><name>Release type</name><value>New features</value></term>
+   <term><name>Release type</name><value>Bug fixes</value></term>
+  </terms>
+ </release>
+</releases>
+</project>
diff --git a/htmltest/modules/update/tests/drupal.2-sec.xml b/htmltest/modules/update/tests/drupal.2-sec.xml
new file mode 100644
index 00000000..1e68c8d5
--- /dev/null
+++ b/htmltest/modules/update/tests/drupal.2-sec.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Drupal</title>
+<short_name>drupal</short_name>
+<dc:creator>Drupal</dc:creator>
+<api_version>7.x</api_version>
+<recommended_major>7</recommended_major>
+<supported_majors>7</supported_majors>
+<default_major>7</default_major>
+<project_status>published</project_status>
+<link>http://example.com/project/drupal</link>
+  <terms>
+   <term><name>Projects</name><value>Drupal project</value></term>
+  </terms>
+<releases>
+ <release>
+  <name>Drupal 7.2</name>
+  <version>7.2</version>
+  <tag>DRUPAL-7-2</tag>
+  <version_major>7</version_major>
+  <version_patch>2</version_patch>
+  <status>published</status>
+  <release_link>http://example.com/drupal-7-2-release</release_link>
+  <download_link>http://example.com/drupal-7-2.tar.gz</download_link>
+  <date>1250424641</date>
+  <mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
+  <filesize>4294967296</filesize>
+  <terms>
+   <term><name>Release type</name><value>New features</value></term>
+   <term><name>Release type</name><value>Bug fixes</value></term>
+   <term><name>Release type</name><value>Security update</value></term>
+  </terms>
+ </release>
+ <release>
+  <name>Drupal 7.1</name>
+  <version>7.1</version>
+  <tag>DRUPAL-7-1</tag>
+  <version_major>7</version_major>
+  <version_patch>1</version_patch>
+  <status>published</status>
+  <release_link>http://example.com/drupal-7-1-release</release_link>
+  <download_link>http://example.com/drupal-7-1.tar.gz</download_link>
+  <date>1250424581</date>
+  <mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
+  <filesize>2147483648</filesize>
+  <terms>
+   <term><name>Release type</name><value>New features</value></term>
+   <term><name>Release type</name><value>Bug fixes</value></term>
+  </terms>
+ </release>
+ <release>
+  <name>Drupal 7.0</name>
+  <version>7.0</version>
+  <tag>DRUPAL-7-0</tag>
+  <version_major>7</version_major>
+  <version_patch>0</version_patch>
+  <status>published</status>
+  <release_link>http://example.com/drupal-7-0-release</release_link>
+  <download_link>http://example.com/drupal-7-0.tar.gz</download_link>
+  <date>1250424521</date>
+  <mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
+  <filesize>1073741824</filesize>
+  <terms>
+   <term><name>Release type</name><value>New features</value></term>
+   <term><name>Release type</name><value>Bug fixes</value></term>
+  </terms>
+ </release>
+</releases>
+</project>
diff --git a/htmltest/modules/update/tests/drupal.dev.xml b/htmltest/modules/update/tests/drupal.dev.xml
new file mode 100644
index 00000000..49dcc3f5
--- /dev/null
+++ b/htmltest/modules/update/tests/drupal.dev.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Drupal</title>
+<short_name>drupal</short_name>
+<dc:creator>Drupal</dc:creator>
+<api_version>7.x</api_version>
+<recommended_major>7</recommended_major>
+<supported_majors>7</supported_majors>
+<default_major>7</default_major>
+<project_status>published</project_status>
+<link>http://example.com/project/drupal</link>
+  <terms>
+   <term><name>Projects</name><value>Drupal project</value></term>
+  </terms>
+<releases>
+ <release>
+  <name>Drupal 7.0</name>
+  <version>7.0</version>
+  <tag>DRUPAL-7-0</tag>
+  <version_major>7</version_major>
+  <version_patch>0</version_patch>
+  <status>published</status>
+  <release_link>http://example.com/drupal-7-0-release</release_link>
+  <download_link>http://example.com/drupal-7-0.tar.gz</download_link>
+  <date>1250424521</date>
+  <mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
+  <filesize>1073741824</filesize>
+  <terms>
+   <term><name>Release type</name><value>New features</value></term>
+   <term><name>Release type</name><value>Bug fixes</value></term>
+  </terms>
+ </release>
+ <release>
+  <name>Drupal 7.x-dev</name>
+  <version>7.x-dev</version>
+  <tag>DRUPAL-7</tag>
+  <version_major>7</version_major>
+  <version_extra>dev</version_extra>
+  <status>published</status>
+  <release_link>http://example.com/drupal-7-x-dev-release</release_link>
+  <download_link>http://example.com/drupal-7.x-dev.tar.gz</download_link>
+  <date>1250424581</date>
+  <mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
+  <filesize>2147483648</filesize>
+  <terms>
+   <term><name>Release type</name><value>Bug fixes</value></term>
+  </terms>
+ </release>
+</releases>
+</project>
diff --git a/htmltest/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info b/htmltest/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info
new file mode 100644
index 00000000..237a5bbc
--- /dev/null
+++ b/htmltest/modules/update/tests/themes/update_test_basetheme/update_test_basetheme.info
@@ -0,0 +1,10 @@
+name = Update test base theme
+description = Test theme which acts as a base theme for other test subthemes.
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info b/htmltest/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info
new file mode 100644
index 00000000..e2e1ca95
--- /dev/null
+++ b/htmltest/modules/update/tests/themes/update_test_subtheme/update_test_subtheme.info
@@ -0,0 +1,11 @@
+name = Update test subtheme
+description = Test theme which uses update_test_basetheme as the base theme.
+core = 7.x
+base theme = update_test_basetheme
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/update/tests/update_test.info b/htmltest/modules/update/tests/update_test.info
new file mode 100644
index 00000000..5726cea6
--- /dev/null
+++ b/htmltest/modules/update/tests/update_test.info
@@ -0,0 +1,12 @@
+name = Update test
+description = Support module for update module testing.
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/update/tests/update_test.module b/htmltest/modules/update/tests/update_test.module
new file mode 100644
index 00000000..6fe4bdde
--- /dev/null
+++ b/htmltest/modules/update/tests/update_test.module
@@ -0,0 +1,191 @@
+<?php
+
+/**
+ * @file
+ * Module for testing Update Manager functionality.
+ */
+
+/**
+ * Implements hook_system_theme_info().
+ */
+function update_test_system_theme_info() {
+  $themes['update_test_basetheme'] = drupal_get_path('module', 'update_test') . '/themes/update_test_basetheme/update_test_basetheme.info';
+  $themes['update_test_subtheme'] = drupal_get_path('module', 'update_test') . '/themes/update_test_subtheme/update_test_subtheme.info';
+  return $themes;
+}
+
+/**
+ * Implements hook_menu().
+ */
+function update_test_menu() {
+  $items = array();
+
+  $items['update-test'] = array(
+    'title' => t('Update test'),
+    'page callback' => 'update_test_mock_page',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+  $items['503-error'] = array(
+    'title' => t('503 Service unavailable'),
+    'page callback' => 'update_callback_service_unavailable',
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_system_info_alter().
+ *
+ * Checks the 'update_test_system_info' variable and sees if we need to alter
+ * the system info for the given $file based on the setting. The setting is
+ * expected to be a nested associative array. If the key '#all' is defined, its
+ * subarray will include .info keys and values for all modules and themes on the
+ * system. Otherwise, the settings array is keyed by the module or theme short
+ * name ($file->name) and the subarrays contain settings just for that module or
+ * theme.
+ */
+function update_test_system_info_alter(&$info, $file) {
+  $setting = variable_get('update_test_system_info', array());
+  foreach (array('#all', $file->name) as $id) {
+    if (!empty($setting[$id])) {
+      foreach ($setting[$id] as $key => $value) {
+        $info[$key] = $value;
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_update_status_alter().
+ *
+ * Checks the 'update_test_update_status' variable and sees if we need to alter
+ * the update status for the given project based on the setting. The setting is
+ * expected to be a nested associative array. If the key '#all' is defined, its
+ * subarray will include .info keys and values for all modules and themes on the
+ * system. Otherwise, the settings array is keyed by the module or theme short
+ * name and the subarrays contain settings just for that module or theme.
+ */
+function update_test_update_status_alter(&$projects) {
+  $setting = variable_get('update_test_update_status', array());
+  if (!empty($setting)) {
+    foreach ($projects as $project_name => &$project) {
+      foreach (array('#all', $project_name) as $id) {
+        if (!empty($setting[$id])) {
+          foreach ($setting[$id] as $key => $value) {
+            $project[$key] = $value;
+          }
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Page callback: Prints mock XML for the Update Manager module.
+ *
+ * The specific XML file to print depends on two things: the project we're
+ * trying to fetch data for, and the desired "availability scenario" for that
+ * project which we're trying to test. Before attempting to fetch this data (by
+ * checking for updates on the available updates report), callers need to define
+ * the 'update_test_xml_map' variable as an array, keyed by project name,
+ * indicating which availability scenario to use for that project.
+ *
+ * @param $project_name
+ *   The project short name the update manager is trying to fetch data for (the
+ *   fetch URLs are of the form: [base_url]/[project_name]/[core_version]).
+ *
+ * @see update_test_menu()
+ */
+function update_test_mock_page($project_name) {
+  $xml_map = variable_get('update_test_xml_map', FALSE);
+  if (isset($xml_map[$project_name])) {
+    $availability_scenario = $xml_map[$project_name];
+  }
+  elseif (isset($xml_map['#all'])) {
+    $availability_scenario = $xml_map['#all'];
+  }
+  else {
+    // The test didn't specify (for example, the webroot has other modules and
+    // themes installed but they're disabled by the version of the site
+    // running the test. So, we default to a file we know won't exist, so at
+    // least we'll get an empty page from readfile instead of a bunch of
+    // Drupal page output.
+    $availability_scenario = '#broken#';
+  }
+
+  $path = drupal_get_path('module', 'update_test');
+  readfile("$path/$project_name.$availability_scenario.xml");
+}
+
+/**
+ * Implements hook_archiver_info().
+ */
+function update_test_archiver_info() {
+  return array(
+    'update_test_archiver' => array(
+      // This is bogus, we only care about the extensions for now.
+      'class' => 'ArchiverUpdateTest',
+      'extensions' => array('update-test-extension'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_filetransfer_info().
+ */
+function update_test_filetransfer_info() {
+  // Define a mock file transfer method, to ensure that there will always be
+  // at least one method available in the user interface (regardless of the
+  // environment in which the update manager tests are run).
+  return array(
+    'system_test' => array(
+      'title' => t('Update Test FileTransfer'),
+      // This should be in an .inc file, but for testing purposes, it is OK to
+      // leave it in the main module file.
+      'file' => 'update_test.module',
+      'class' => 'UpdateTestFileTransfer',
+      'weight' => -20,
+    ),
+  );
+}
+
+/**
+ * Mocks a FileTransfer object to test the settings form functionality.
+ */
+class UpdateTestFileTransfer {
+
+  /**
+   * Returns an UpdateTestFileTransfer object.
+   *
+   * @return
+   *   A new UpdateTestFileTransfer object.
+   */
+  public static function factory() {
+    return new UpdateTestFileTransfer;
+  }
+
+  /**
+   * Returns a settings form with a text field to input a username.
+   */
+  public function getSettingsForm() {
+    $form = array();
+    $form['udpate_test_username'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Update Test Username'),
+    );
+    return $form;
+  }
+}
+
+/**
+ * Page callback: Displays an Error 503 (Service unavailable) page.
+ *
+ * @see update_test_menu()
+ */
+function update_callback_service_unavailable() {
+  drupal_add_http_header('Status', '503 Service unavailable');
+  print "503 Service Temporarily Unavailable";
+}
diff --git a/htmltest/modules/update/tests/update_test_basetheme.1_1-sec.xml b/htmltest/modules/update/tests/update_test_basetheme.1_1-sec.xml
new file mode 100644
index 00000000..5c11c031
--- /dev/null
+++ b/htmltest/modules/update/tests/update_test_basetheme.1_1-sec.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Update test base theme</title>
+<short_name>update_test_basetheme</short_name>
+<dc:creator>Drupal</dc:creator>
+<api_version>7.x</api_version>
+<recommended_major>1</recommended_major>
+<supported_majors>1</supported_majors>
+<default_major>1</default_major>
+<project_status>published</project_status>
+<link>http://example.com/project/update_test_basetheme</link>
+  <terms>
+   <term><name>Projects</name><value>Themes</value></term>
+  </terms>
+<releases>
+ <release>
+  <name>update_test_basetheme 7.x-1.1</name>
+  <version>7.x-1.1</version>
+  <tag>DRUPAL-7--1-1</tag>
+  <version_major>1</version_major>
+  <version_patch>1</version_patch>
+  <status>published</status>
+  <release_link>http://example.com/update_test_basetheme-7-x-1-1-release</release_link>
+  <download_link>http://example.com/update_test_basetheme-7.x-1.1.tar.gz</download_link>
+  <date>1250624521</date>
+  <mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
+  <filesize>1073763241</filesize>
+  <terms>
+   <term><name>Release type</name><value>Security update</value></term>
+   <term><name>Release type</name><value>New features</value></term>
+   <term><name>Release type</name><value>Bug fixes</value></term>
+  </terms>
+ </release>
+ <release>
+  <name>update_test_basetheme 7.x-1.0</name>
+  <version>7.x-1.0</version>
+  <tag>DRUPAL-7--1-0</tag>
+  <version_major>1</version_major>
+  <version_patch>0</version_patch>
+  <status>published</status>
+  <release_link>http://example.com/update_test_basetheme-7-x-1-0-release</release_link>
+  <download_link>http://example.com/update_test_basetheme-7.x-1.0.tar.gz</download_link>
+  <date>1250524521</date>
+  <mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
+  <filesize>1073741824</filesize>
+  <terms>
+   <term><name>Release type</name><value>New features</value></term>
+   <term><name>Release type</name><value>Bug fixes</value></term>
+  </terms>
+ </release>
+</releases>
+</project>
diff --git a/htmltest/modules/update/tests/update_test_subtheme.1_0.xml b/htmltest/modules/update/tests/update_test_subtheme.1_0.xml
new file mode 100644
index 00000000..5d04ec8b
--- /dev/null
+++ b/htmltest/modules/update/tests/update_test_subtheme.1_0.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Update test subtheme</title>
+<short_name>update_test_subtheme</short_name>
+<dc:creator>Drupal</dc:creator>
+<api_version>7.x</api_version>
+<recommended_major>1</recommended_major>
+<supported_majors>1</supported_majors>
+<default_major>1</default_major>
+<project_status>published</project_status>
+<link>http://example.com/project/update_test_subtheme</link>
+  <terms>
+   <term><name>Projects</name><value>Themes</value></term>
+  </terms>
+<releases>
+ <release>
+  <name>update_test_subtheme 7.x-1.0</name>
+  <version>7.x-1.0</version>
+  <tag>DRUPAL-7--1-0</tag>
+  <version_major>1</version_major>
+  <version_patch>0</version_patch>
+  <status>published</status>
+  <release_link>http://example.com/update_test_subtheme-7-x-1-0-release</release_link>
+  <download_link>http://example.com/update_test_subtheme-7.x-1.0.tar.gz</download_link>
+  <date>1250524521</date>
+  <mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
+  <filesize>1073741824</filesize>
+  <terms>
+   <term><name>Release type</name><value>New features</value></term>
+   <term><name>Release type</name><value>Bug fixes</value></term>
+  </terms>
+ </release>
+</releases>
+</project>
diff --git a/htmltest/modules/update/update-rtl.css b/htmltest/modules/update/update-rtl.css
new file mode 100644
index 00000000..f181c845
--- /dev/null
+++ b/htmltest/modules/update/update-rtl.css
@@ -0,0 +1,35 @@
+/**
+ * @file
+ * RTL styles used by the Update Manager module.
+ */
+
+.update .project {
+  padding-right: .25em;
+}
+
+.update .version-status {
+  float: left;
+  padding-left: 10px;
+}
+
+.update .version-status .icon {
+  padding-right: .5em;
+}
+
+.update table.version .version-title {
+  padding-left: 1em;
+}
+
+.update table.version .version-details {
+  padding-left: .5em;
+  direction: ltr;
+}
+
+.update table.version .version-links {
+  text-align: left;
+  padding-left: 1em;
+}
+
+.update .check-manually {
+  padding-right: 1em;
+}
diff --git a/htmltest/modules/update/update.api.php b/htmltest/modules/update/update.api.php
new file mode 100644
index 00000000..cb5669e3
--- /dev/null
+++ b/htmltest/modules/update/update.api.php
@@ -0,0 +1,133 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Update Manager module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Alter the list of projects before fetching data and comparing versions.
+ *
+ * Most modules will never need to implement this hook. It is for advanced
+ * interaction with the Update Manager module. The primary use-case for this
+ * hook is to add projects to the list; for example, to provide update status
+ * data on disabled modules and themes. A contributed module might want to hide
+ * projects from the list; for example, if there is a site-specific module that
+ * doesn't have any official releases, that module could remove itself from this
+ * list to avoid "No available releases found" warnings on the available updates
+ * report. In rare cases, a module might want to alter the data associated with
+ * a project already in the list.
+ *
+ * @param $projects
+ *   Reference to an array of the projects installed on the system. This
+ *   includes all the metadata documented in the comments below for each project
+ *   (either module or theme) that is currently enabled. The array is initially
+ *   populated inside update_get_projects() with the help of
+ *   _update_process_info_list(), so look there for examples of how to populate
+ *   the array with real values.
+ *
+ * @see update_get_projects()
+ * @see _update_process_info_list()
+ */
+function hook_update_projects_alter(&$projects) {
+  // Hide a site-specific module from the list.
+  unset($projects['site_specific_module']);
+
+  // Add a disabled module to the list.
+  // The key for the array should be the machine-readable project "short name".
+  $projects['disabled_project_name'] = array(
+    // Machine-readable project short name (same as the array key above).
+    'name' => 'disabled_project_name',
+    // Array of values from the main .info file for this project.
+    'info' => array(
+      'name' => 'Some disabled module',
+      'description' => 'A module not enabled on the site that you want to see in the available updates report.',
+      'version' => '7.x-1.0',
+      'core' => '7.x',
+      // The maximum file change time (the "ctime" returned by the filectime()
+      // PHP method) for all of the .info files included in this project.
+      '_info_file_ctime' => 1243888165,
+    ),
+    // The date stamp when the project was released, if known. If the disabled
+    // project was an officially packaged release from drupal.org, this will
+    // be included in the .info file as the 'datestamp' field. This only
+    // really matters for development snapshot releases that are regenerated,
+    // so it can be left undefined or set to 0 in most cases.
+    'datestamp' => 1243888185,
+    // Any modules (or themes) included in this project. Keyed by machine-
+    // readable "short name", value is the human-readable project name printed
+    // in the UI.
+    'includes' => array(
+      'disabled_project' => 'Disabled module',
+      'disabled_project_helper' => 'Disabled module helper module',
+      'disabled_project_foo' => 'Disabled module foo add-on module',
+    ),
+    // Does this project contain a 'module', 'theme', 'disabled-module', or
+    // 'disabled-theme'?
+    'project_type' => 'disabled-module',
+  );
+}
+
+/**
+ * Alter the information about available updates for projects.
+ *
+ * @param $projects
+ *   Reference to an array of information about available updates to each
+ *   project installed on the system.
+ *
+ * @see update_calculate_project_data()
+ */
+function hook_update_status_alter(&$projects) {
+  $settings = variable_get('update_advanced_project_settings', array());
+  foreach ($projects as $project => $project_info) {
+    if (isset($settings[$project]) && isset($settings[$project]['check']) &&
+        ($settings[$project]['check'] == 'never' ||
+          (isset($project_info['recommended']) &&
+            $settings[$project]['check'] === $project_info['recommended']))) {
+      $projects[$project]['status'] = UPDATE_NOT_CHECKED;
+      $projects[$project]['reason'] = t('Ignored from settings');
+      if (!empty($settings[$project]['notes'])) {
+        $projects[$project]['extra'][] = array(
+          'class' => array('admin-note'),
+          'label' => t('Administrator note'),
+          'data' => $settings[$project]['notes'],
+        );
+      }
+    }
+  }
+}
+
+/**
+ * Verify an archive after it has been downloaded and extracted.
+ *
+ * @param string $project
+ *   The short name of the project that has been downloaded.
+ * @param string $archive_file
+ *   The filename of the unextracted archive.
+ * @param string $directory
+ *   The directory that the archive was extracted into.
+ *
+ * @return
+ *   If there are any problems, return an array of error messages. If there are
+ *   no problems, return an empty array.
+ *
+ * @see update_manager_archive_verify()
+ * @ingroup update_manager_file
+ */
+function hook_verify_update_archive($project, $archive_file, $directory) {
+  $errors = array();
+  if (!file_exists($directory)) {
+    $errors[] = t('The %directory does not exist.', array('%directory' => $directory));
+  }
+  // Add other checks on the archive integrity here.
+  return $errors;
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/update/update.authorize.inc b/htmltest/modules/update/update.authorize.inc
new file mode 100644
index 00000000..6ddd2c53
--- /dev/null
+++ b/htmltest/modules/update/update.authorize.inc
@@ -0,0 +1,333 @@
+<?php
+
+/**
+ * @file
+ * Callbacks and related functions invoked by authorize.php to update projects.
+ *
+ * We use the Batch API to actually update each individual project on the site.
+ * All of the code in this file is run at a low bootstrap level (modules are not
+ * loaded), so these functions cannot assume access to the rest of the code of
+ * the Update Manager module.
+ */
+
+/**
+ * Updates existing projects when invoked by authorize.php.
+ *
+ * Callback for system_authorized_init() in
+ * update_manager_update_ready_form_submit().
+ *
+ * @param $filetransfer
+ *   The FileTransfer object created by authorize.php for use during this
+ *   operation.
+ * @param $projects
+ *   A nested array of projects to install into the live webroot, keyed by
+ *   project name. Each subarray contains the following keys:
+ *   - project: The canonical project short name.
+ *   - updater_name: The name of the Updater class to use for this project.
+ *   - local_url: The locally installed location of new code to update with.
+ */
+function update_authorize_run_update($filetransfer, $projects) {
+  $operations = array();
+  foreach ($projects as $project => $project_info) {
+    $operations[] = array(
+      'update_authorize_batch_copy_project',
+      array(
+        $project_info['project'],
+        $project_info['updater_name'],
+        $project_info['local_url'],
+        $filetransfer,
+      ),
+    );
+  }
+
+  $batch = array(
+    'title' => t('Installing updates'),
+    'init_message' => t('Preparing to update your site'),
+    'operations' => $operations,
+    'finished' => 'update_authorize_update_batch_finished',
+    'file' => drupal_get_path('module', 'update') . '/update.authorize.inc',
+  );
+
+  batch_set($batch);
+  // Invoke the batch via authorize.php.
+  system_authorized_batch_process();
+}
+
+/**
+ * Installs a new project when invoked by authorize.php.
+ *
+ * Callback for system_authorized_init() in
+ * update_manager_install_form_submit().
+ *
+ * @param FileTransfer $filetransfer
+ *   The FileTransfer object created by authorize.php for use during this
+ *   operation.
+ * @param string $project
+ *   The canonical project short name (e.g., {system}.name).
+ * @param string $updater_name
+ *   The name of the Updater class to use for installing this project.
+ * @param string $local_url
+ *   The URL to the locally installed temp directory where the project has
+ *   already been downloaded and extracted into.
+ */
+function update_authorize_run_install($filetransfer, $project, $updater_name, $local_url) {
+  $operations[] = array(
+    'update_authorize_batch_copy_project',
+    array(
+      $project,
+      $updater_name,
+      $local_url,
+      $filetransfer,
+    ),
+  );
+
+  // @todo Instantiate our Updater to set the human-readable title?
+  $batch = array(
+    'title' => t('Installing %project', array('%project' => $project)),
+    'init_message' => t('Preparing to install'),
+    'operations' => $operations,
+    // @todo Use a different finished callback for different messages?
+    'finished' => 'update_authorize_install_batch_finished',
+    'file' => drupal_get_path('module', 'update') . '/update.authorize.inc',
+  );
+  batch_set($batch);
+
+  // Invoke the batch via authorize.php.
+  system_authorized_batch_process();
+}
+
+/**
+ * Batch callback: Copies project to its proper place when authorized to do so.
+ *
+ * @param string $project
+ *   The canonical short name of the project being installed.
+ * @param string $updater_name
+ *   The name of the Updater class to use for installing this project.
+ * @param string $local_url
+ *   The URL to the locally installed temp directory where the project has
+ *   already been downloaded and extracted into.
+ * @param FileTransfer $filetransfer
+ *   The FileTransfer object to use for performing this operation.
+ * @param array $context
+ *   Reference to an array used for Batch API storage.
+ */
+function update_authorize_batch_copy_project($project, $updater_name, $local_url, $filetransfer, &$context) {
+
+  // Initialize some variables in the Batch API $context array.
+  if (!isset($context['results']['log'])) {
+    $context['results']['log'] = array();
+  }
+  if (!isset($context['results']['log'][$project])) {
+    $context['results']['log'][$project] = array();
+  }
+
+  if (!isset($context['results']['tasks'])) {
+    $context['results']['tasks'] = array();
+  }
+
+  // The batch API uses a session, and since all the arguments are serialized
+  // and unserialized between requests, although the FileTransfer object itself
+  // will be reconstructed, the connection pointer itself will be lost. However,
+  // the FileTransfer object will still have the connection variable, even
+  // though the connection itself is now gone. So, although it's ugly, we have
+  // to unset the connection variable at this point so that the FileTransfer
+  // object will re-initiate the actual connection.
+  unset($filetransfer->connection);
+
+  if (!empty($context['results']['log'][$project]['#abort'])) {
+    $context['finished'] = 1;
+    return;
+  }
+
+  $updater = new $updater_name($local_url);
+
+  try {
+    if ($updater->isInstalled()) {
+      // This is an update.
+      $tasks = $updater->update($filetransfer);
+    }
+    else {
+      $tasks = $updater->install($filetransfer);
+    }
+  }
+  catch (UpdaterException $e) {
+    _update_batch_create_message($context['results']['log'][$project], t('Error installing / updating'), FALSE);
+    _update_batch_create_message($context['results']['log'][$project], $e->getMessage(), FALSE);
+    $context['results']['log'][$project]['#abort'] = TRUE;
+    return;
+  }
+
+  _update_batch_create_message($context['results']['log'][$project], t('Installed %project_name successfully', array('%project_name' => $project)));
+  if (!empty($tasks)) {
+    $context['results']['tasks'] += $tasks;
+  }
+
+  // This particular operation is now complete, even though the batch might
+  // have other operations to perform.
+  $context['finished'] = 1;
+}
+
+/**
+ * Batch callback: Performs actions when the authorized update batch is done.
+ *
+ * This processes the results and stashes them into SESSION such that
+ * authorize.php will render a report. Also responsible for putting the site
+ * back online and clearing the update status cache after a successful update.
+ *
+ * @param $success
+ *   TRUE if the batch operation was successful; FALSE if there were errors.
+ * @param $results
+ *   An associative array of results from the batch operation.
+ */
+function update_authorize_update_batch_finished($success, $results) {
+  foreach ($results['log'] as $project => $messages) {
+    if (!empty($messages['#abort'])) {
+      $success = FALSE;
+    }
+  }
+  $offline = variable_get('maintenance_mode', FALSE);
+  if ($success) {
+    // Now that the update completed, we need to clear the cache of available
+    // update data and recompute our status, so prevent show bogus results.
+    _update_authorize_clear_update_status();
+
+    // Take the site out of maintenance mode if it was previously that way.
+    if ($offline && isset($_SESSION['maintenance_mode']) && $_SESSION['maintenance_mode'] == FALSE) {
+      variable_set('maintenance_mode', FALSE);
+      $page_message = array(
+        'message' => t('Update was completed successfully. Your site has been taken out of maintenance mode.'),
+        'type' => 'status',
+      );
+    }
+    else {
+      $page_message = array(
+        'message' => t('Update was completed successfully.'),
+        'type' => 'status',
+      );
+    }
+  }
+  elseif (!$offline) {
+    $page_message = array(
+      'message' => t('Update failed! See the log below for more information.'),
+      'type' => 'error',
+    );
+  }
+  else {
+    $page_message = array(
+      'message' => t('Update failed! See the log below for more information. Your site is still in maintenance mode.'),
+      'type' => 'error',
+    );
+  }
+  // Since we're doing an update of existing code, always add a task for
+  // running update.php.
+  $results['tasks'][] = t('Your modules have been downloaded and updated.');
+  $results['tasks'][] = t('<a href="@update">Run database updates</a>', array('@update' => base_path() . 'update.php'));
+
+  // Unset the variable since it is no longer needed.
+  unset($_SESSION['maintenance_mode']);
+
+  // Set all these values into the SESSION so authorize.php can display them.
+  $_SESSION['authorize_results']['success'] = $success;
+  $_SESSION['authorize_results']['page_message'] = $page_message;
+  $_SESSION['authorize_results']['messages'] = $results['log'];
+  $_SESSION['authorize_results']['tasks'] = $results['tasks'];
+  $_SESSION['authorize_operation']['page_title'] = t('Update manager');
+}
+
+/**
+ * Batch callback: Performs actions when the authorized install batch is done.
+ *
+ * This processes the results and stashes them into SESSION such that
+ * authorize.php will render a report. Also responsible for putting the site
+ * back online after a successful install if necessary.
+ *
+ * @param $success
+ *   TRUE if the batch operation was a success; FALSE if there were errors.
+ * @param $results
+ *   An associative array of results from the batch operation.
+ */
+function update_authorize_install_batch_finished($success, $results) {
+  foreach ($results['log'] as $project => $messages) {
+    if (!empty($messages['#abort'])) {
+      $success = FALSE;
+    }
+  }
+  $offline = variable_get('maintenance_mode', FALSE);
+  if ($success) {
+    // Take the site out of maintenance mode if it was previously that way.
+    if ($offline && isset($_SESSION['maintenance_mode']) && $_SESSION['maintenance_mode'] == FALSE) {
+      variable_set('maintenance_mode', FALSE);
+      $page_message = array(
+        'message' => t('Installation was completed successfully. Your site has been taken out of maintenance mode.'),
+        'type' => 'status',
+      );
+    }
+    else {
+      $page_message = array(
+        'message' => t('Installation was completed successfully.'),
+        'type' => 'status',
+      );
+    }
+  }
+  elseif (!$success && !$offline) {
+    $page_message = array(
+      'message' => t('Installation failed! See the log below for more information.'),
+      'type' => 'error',
+    );
+  }
+  else {
+    $page_message = array(
+      'message' => t('Installation failed! See the log below for more information. Your site is still in maintenance mode.'),
+      'type' => 'error',
+    );
+  }
+
+  // Unset the variable since it is no longer needed.
+  unset($_SESSION['maintenance_mode']);
+
+  // Set all these values into the SESSION so authorize.php can display them.
+  $_SESSION['authorize_results']['success'] = $success;
+  $_SESSION['authorize_results']['page_message'] = $page_message;
+  $_SESSION['authorize_results']['messages'] = $results['log'];
+  $_SESSION['authorize_results']['tasks'] = $results['tasks'];
+  $_SESSION['authorize_operation']['page_title'] = t('Update manager');
+}
+
+/**
+ * Creates a structure of log messages.
+ *
+ * @param array $project_results
+ *   An associative array of results from the batch operation.
+ * @param string $message
+ *   A string containing a log message.
+ * @param bool $success
+ *   (optional) TRUE if the operation the message is about was a success, FALSE
+ *   if there were errors. Defaults to TRUE.
+ */
+function _update_batch_create_message(&$project_results, $message, $success = TRUE) {
+  $project_results[] = array('message' => $message, 'success' => $success);
+}
+
+/**
+ * Clears cached available update status data.
+ *
+ * Since this function is run at such a low bootstrap level, the Update Manager
+ * module is not loaded. So, we can't just call _update_cache_clear(). However,
+ * the database is bootstrapped, so we can do a query ourselves to clear out
+ * what we want to clear.
+ *
+ * Note that we do not want to just truncate the table, since that would remove
+ * items related to currently pending fetch attempts.
+ *
+ * @see update_authorize_update_batch_finished()
+ * @see _update_cache_clear()
+ */
+function _update_authorize_clear_update_status() {
+  $query = db_delete('cache_update');
+  $query->condition(
+    db_or()
+    ->condition('cid', 'update_project_%', 'LIKE')
+    ->condition('cid', 'available_releases::%', 'LIKE')
+  );
+  $query->execute();
+}
diff --git a/htmltest/modules/update/update.compare.inc b/htmltest/modules/update/update.compare.inc
new file mode 100644
index 00000000..6e0c5fee
--- /dev/null
+++ b/htmltest/modules/update/update.compare.inc
@@ -0,0 +1,831 @@
+<?php
+
+/**
+ * @file
+ * Code required only when comparing available updates to existing data.
+ */
+
+/**
+ * Fetches an array of installed and enabled projects.
+ *
+ * This is only responsible for generating an array of projects (taking into
+ * account projects that include more than one module or theme). Other
+ * information like the specific version and install type (official release,
+ * dev snapshot, etc) is handled later in update_process_project_info() since
+ * that logic is only required when preparing the status report, not for
+ * fetching the available release data.
+ *
+ * This array is fairly expensive to construct, since it involves a lot of disk
+ * I/O, so we cache the results into the {cache_update} table using the
+ * 'update_project_projects' cache ID. However, since this is not the data about
+ * available updates fetched from the network, it is acceptable to invalidate it
+ * somewhat quickly. If we keep this data for very long, site administrators are
+ * more likely to see incorrect results if they upgrade to a newer version of a
+ * module or theme but do not visit certain pages that automatically clear this
+ * cache.
+ *
+ * @return
+ *   An associative array of currently enabled projects keyed by the
+ *   machine-readable project short name. Each project contains:
+ *   - name: The machine-readable project short name.
+ *   - info: An array with values from the main .info file for this project.
+ *     - name: The human-readable name of the project.
+ *     - package: The package that the project is grouped under.
+ *     - version: The version of the project.
+ *     - project: The Drupal.org project name.
+ *     - datestamp: The date stamp of the project's main .info file.
+ *     - _info_file_ctime: The maximum file change time for all of the .info
+ *       files included in this project.
+ *   - datestamp: The date stamp when the project was released, if known.
+ *   - includes: An associative array containing all projects included with this
+ *     project, keyed by the machine-readable short name with the human-readable
+ *     name as value.
+ *   - project_type: The type of project. Allowed values are 'module' and
+ *     'theme'.
+ *   - project_status: This indicates if the project is enabled and will always
+ *     be TRUE, as the function only returns enabled projects.
+ *   - sub_themes: If the project is a theme it contains an associative array of
+ *     all sub-themes.
+ *   - base_themes: If the project is a theme it contains an associative array
+ *     of all base-themes.
+ *
+ * @see update_process_project_info()
+ * @see update_calculate_project_data()
+ * @see update_project_cache()
+ */
+function update_get_projects() {
+  $projects = &drupal_static(__FUNCTION__, array());
+  if (empty($projects)) {
+    // Retrieve the projects from cache, if present.
+    $projects = update_project_cache('update_project_projects');
+    if (empty($projects)) {
+      // Still empty, so we have to rebuild the cache.
+      $module_data = system_rebuild_module_data();
+      $theme_data = system_rebuild_theme_data();
+      _update_process_info_list($projects, $module_data, 'module', TRUE);
+      _update_process_info_list($projects, $theme_data, 'theme', TRUE);
+      if (variable_get('update_check_disabled', FALSE)) {
+        _update_process_info_list($projects, $module_data, 'module', FALSE);
+        _update_process_info_list($projects, $theme_data, 'theme', FALSE);
+      }
+      // Allow other modules to alter projects before fetching and comparing.
+      drupal_alter('update_projects', $projects);
+      // Cache the site's project data for at most 1 hour.
+      _update_cache_set('update_project_projects', $projects, REQUEST_TIME + 3600);
+    }
+  }
+  return $projects;
+}
+
+/**
+ * Populates an array of project data.
+ *
+ * This iterates over a list of the installed modules or themes and groups them
+ * by project and status. A few parts of this function assume that enabled
+ * modules and themes are always processed first, and if disabled modules or
+ * themes are being processed (there is a setting to control if disabled code
+ * should be included or not in the 'Available updates' report), those are only
+ * processed after $projects has been populated with information about the
+ * enabled code. Modules and themes set as hidden are always ignored. This
+ * function also records the latest change time on the .info files for each
+ * module or theme, which is important data which is used when deciding if the
+ * cached available update data should be invalidated.
+ *
+ * @param $projects
+ *   Reference to the array of project data of what's installed on this site.
+ * @param $list
+ *   Array of data to process to add the relevant info to the $projects array.
+ * @param $project_type
+ *   The kind of data in the list. Can be 'module' or 'theme'.
+ * @param $status
+ *   Boolean that controls what status (enabled or disabled) to process out of
+ *   the $list and add to the $projects array.
+ *
+ * @see update_get_projects()
+ */
+function _update_process_info_list(&$projects, $list, $project_type, $status) {
+  foreach ($list as $file) {
+    // A disabled base theme of an enabled sub-theme still has all of its code
+    // run by the sub-theme, so we include it in our "enabled" projects list.
+    if ($status && !$file->status && !empty($file->sub_themes)) {
+      foreach ($file->sub_themes as $key => $name) {
+        // Build a list of enabled sub-themes.
+        if ($list[$key]->status) {
+          $file->enabled_sub_themes[$key] = $name;
+        }
+      }
+      // If there are no enabled subthemes, we should ignore this base theme
+      // for the enabled case. If the site is trying to display disabled
+      // themes, we'll catch it then.
+      if (empty($file->enabled_sub_themes)) {
+        continue;
+      }
+    }
+    // Otherwise, just add projects of the proper status to our list.
+    elseif ($file->status != $status) {
+      continue;
+    }
+
+    // Skip if the .info file is broken.
+    if (empty($file->info)) {
+      continue;
+    }
+
+    // Skip if it's a hidden module or theme.
+    if (!empty($file->info['hidden'])) {
+      continue;
+    }
+
+    // If the .info doesn't define the 'project', try to figure it out.
+    if (!isset($file->info['project'])) {
+      $file->info['project'] = update_get_project_name($file);
+    }
+
+    // If we still don't know the 'project', give up.
+    if (empty($file->info['project'])) {
+      continue;
+    }
+
+    // If we don't already know it, grab the change time on the .info file
+    // itself. Note: we need to use the ctime, not the mtime (modification
+    // time) since many (all?) tar implementations will go out of their way to
+    // set the mtime on the files it creates to the timestamps recorded in the
+    // tarball. We want to see the last time the file was changed on disk,
+    // which is left alone by tar and correctly set to the time the .info file
+    // was unpacked.
+    if (!isset($file->info['_info_file_ctime'])) {
+      $info_filename = dirname($file->uri) . '/' . $file->name . '.info';
+      $file->info['_info_file_ctime'] = filectime($info_filename);
+    }
+
+    if (!isset($file->info['datestamp'])) {
+      $file->info['datestamp'] = 0;
+    }
+
+    $project_name = $file->info['project'];
+
+    // Figure out what project type we're going to use to display this module
+    // or theme. If the project name is 'drupal', we don't want it to show up
+    // under the usual "Modules" section, we put it at a special "Drupal Core"
+    // section at the top of the report.
+    if ($project_name == 'drupal') {
+      $project_display_type = 'core';
+    }
+    else {
+      $project_display_type = $project_type;
+    }
+    if (empty($status) && empty($file->enabled_sub_themes)) {
+      // If we're processing disabled modules or themes, append a suffix.
+      // However, we don't do this to a a base theme with enabled
+      // subthemes, since we treat that case as if it is enabled.
+      $project_display_type .= '-disabled';
+    }
+    // Add a list of sub-themes that "depend on" the project and a list of base
+    // themes that are "required by" the project.
+    if ($project_name == 'drupal') {
+      // Drupal core is always required, so this extra info would be noise.
+      $sub_themes = array();
+      $base_themes = array();
+    }
+    else {
+      // Add list of enabled sub-themes.
+      $sub_themes = !empty($file->enabled_sub_themes) ? $file->enabled_sub_themes : array();
+      // Add list of base themes.
+      $base_themes = !empty($file->base_themes) ? $file->base_themes : array();
+    }
+    if (!isset($projects[$project_name])) {
+      // Only process this if we haven't done this project, since a single
+      // project can have multiple modules or themes.
+      $projects[$project_name] = array(
+        'name' => $project_name,
+        // Only save attributes from the .info file we care about so we do not
+        // bloat our RAM usage needlessly.
+        'info' => update_filter_project_info($file->info),
+        'datestamp' => $file->info['datestamp'],
+        'includes' => array($file->name => $file->info['name']),
+        'project_type' => $project_display_type,
+        'project_status' => $status,
+        'sub_themes' => $sub_themes,
+        'base_themes' => $base_themes,
+      );
+    }
+    elseif ($projects[$project_name]['project_type'] == $project_display_type) {
+      // Only add the file we're processing to the 'includes' array for this
+      // project if it is of the same type and status (which is encoded in the
+      // $project_display_type). This prevents listing all the disabled
+      // modules included with an enabled project if we happen to be checking
+      // for disabled modules, too.
+      $projects[$project_name]['includes'][$file->name] = $file->info['name'];
+      $projects[$project_name]['info']['_info_file_ctime'] = max($projects[$project_name]['info']['_info_file_ctime'], $file->info['_info_file_ctime']);
+      $projects[$project_name]['datestamp'] = max($projects[$project_name]['datestamp'], $file->info['datestamp']);
+      if (!empty($sub_themes)) {
+        $projects[$project_name]['sub_themes'] += $sub_themes;
+      }
+      if (!empty($base_themes)) {
+        $projects[$project_name]['base_themes'] += $base_themes;
+      }
+    }
+    elseif (empty($status)) {
+      // If we have a project_name that matches, but the project_display_type
+      // does not, it means we're processing a disabled module or theme that
+      // belongs to a project that has some enabled code. In this case, we add
+      // the disabled thing into a separate array for separate display.
+      $projects[$project_name]['disabled'][$file->name] = $file->info['name'];
+    }
+  }
+}
+
+/**
+ * Determines what project a given file object belongs to.
+ *
+ * @param $file
+ *   A file object as returned by system_get_files_database().
+ *
+ * @return
+ *   The canonical project short name.
+ *
+ * @see system_get_files_database()
+ */
+function update_get_project_name($file) {
+  $project_name = '';
+  if (isset($file->info['project'])) {
+    $project_name = $file->info['project'];
+  }
+  elseif (isset($file->info['package']) && (strpos($file->info['package'], 'Core') === 0)) {
+    $project_name = 'drupal';
+  }
+  return $project_name;
+}
+
+/**
+ * Determines version and type information for currently installed projects.
+ *
+ * Processes the list of projects on the system to figure out the currently
+ * installed versions, and other information that is required before we can
+ * compare against the available releases to produce the status report.
+ *
+ * @param $projects
+ *   Array of project information from update_get_projects().
+ */
+function update_process_project_info(&$projects) {
+  foreach ($projects as $key => $project) {
+    // Assume an official release until we see otherwise.
+    $install_type = 'official';
+
+    $info = $project['info'];
+
+    if (isset($info['version'])) {
+      // Check for development snapshots
+      if (preg_match('@(dev|HEAD)@', $info['version'])) {
+        $install_type = 'dev';
+      }
+
+      // Figure out what the currently installed major version is. We need
+      // to handle both contribution (e.g. "5.x-1.3", major = 1) and core
+      // (e.g. "5.1", major = 5) version strings.
+      $matches = array();
+      if (preg_match('/^(\d+\.x-)?(\d+)\..*$/', $info['version'], $matches)) {
+        $info['major'] = $matches[2];
+      }
+      elseif (!isset($info['major'])) {
+        // This would only happen for version strings that don't follow the
+        // drupal.org convention. We let contribs define "major" in their
+        // .info in this case, and only if that's missing would we hit this.
+        $info['major'] = -1;
+      }
+    }
+    else {
+      // No version info available at all.
+      $install_type = 'unknown';
+      $info['version'] = t('Unknown');
+      $info['major'] = -1;
+    }
+
+    // Finally, save the results we care about into the $projects array.
+    $projects[$key]['existing_version'] = $info['version'];
+    $projects[$key]['existing_major'] = $info['major'];
+    $projects[$key]['install_type'] = $install_type;
+  }
+}
+
+/**
+ * Calculates the current update status of all projects on the site.
+ *
+ * The results of this function are expensive to compute, especially on sites
+ * with lots of modules or themes, since it involves a lot of comparisons and
+ * other operations. Therefore, we cache the results into the {cache_update}
+ * table using the 'update_project_data' cache ID. However, since this is not
+ * the data about available updates fetched from the network, it is ok to
+ * invalidate it somewhat quickly. If we keep this data for very long, site
+ * administrators are more likely to see incorrect results if they upgrade to a
+ * newer version of a module or theme but do not visit certain pages that
+ * automatically clear this cache.
+ *
+ * @param array $available
+ *   Data about available project releases.
+ *
+ * @return
+ *   An array of installed projects with current update status information.
+ *
+ * @see update_get_available()
+ * @see update_get_projects()
+ * @see update_process_project_info()
+ * @see update_project_cache()
+ */
+function update_calculate_project_data($available) {
+  // Retrieve the projects from cache, if present.
+  $projects = update_project_cache('update_project_data');
+  // If $projects is empty, then the cache must be rebuilt.
+  // Otherwise, return the cached data and skip the rest of the function.
+  if (!empty($projects)) {
+    return $projects;
+  }
+  $projects = update_get_projects();
+  update_process_project_info($projects);
+  foreach ($projects as $project => $project_info) {
+    if (isset($available[$project])) {
+      update_calculate_project_update_status($project, $projects[$project], $available[$project]);
+    }
+    else {
+      $projects[$project]['status'] = UPDATE_UNKNOWN;
+      $projects[$project]['reason'] = t('No available releases found');
+    }
+  }
+  // Give other modules a chance to alter the status (for example, to allow a
+  // contrib module to provide fine-grained settings to ignore specific
+  // projects or releases).
+  drupal_alter('update_status', $projects);
+
+  // Cache the site's update status for at most 1 hour.
+  _update_cache_set('update_project_data', $projects, REQUEST_TIME + 3600);
+  return $projects;
+}
+
+/**
+ * Calculates the current update status of a specific project.
+ *
+ * This function is the heart of the update status feature. For each project it
+ * is invoked with, it first checks if the project has been flagged with a
+ * special status like "unsupported" or "insecure", or if the project node
+ * itself has been unpublished. In any of those cases, the project is marked
+ * with an error and the next project is considered.
+ *
+ * If the project itself is valid, the function decides what major release
+ * series to consider. The project defines what the currently supported major
+ * versions are for each version of core, so the first step is to make sure the
+ * current version is still supported. If so, that's the target version. If the
+ * current version is unsupported, the project maintainer's recommended major
+ * version is used. There's also a check to make sure that this function never
+ * recommends an earlier release than the currently installed major version.
+ *
+ * Given a target major version, the available releases are scanned looking for
+ * the specific release to recommend (avoiding beta releases and development
+ * snapshots if possible). For the target major version, the highest patch level
+ * is found. If there is a release at that patch level with no extra ("beta",
+ * etc.), then the release at that patch level with the most recent release date
+ * is recommended. If every release at that patch level has extra (only betas),
+ * then the latest release from the previous patch level is recommended. For
+ * example:
+ *
+ * - 1.6-bugfix <-- recommended version because 1.6 already exists.
+ * - 1.6
+ *
+ * or
+ *
+ * - 1.6-beta
+ * - 1.5 <-- recommended version because no 1.6 exists.
+ * - 1.4
+ *
+ * Also, the latest release from the same major version is looked for, even beta
+ * releases, to display to the user as the "Latest version" option.
+ * Additionally, the latest official release from any higher major versions that
+ * have been released is searched for to provide a set of "Also available"
+ * options.
+ *
+ * Finally, and most importantly, the release history continues to be scanned
+ * until the currently installed release is reached, searching for anything
+ * marked as a security update. If any security updates have been found between
+ * the recommended release and the installed version, all of the releases that
+ * included a security fix are recorded so that the site administrator can be
+ * warned their site is insecure, and links pointing to the release notes for
+ * each security update can be included (which, in turn, will link to the
+ * official security announcements for each vulnerability).
+ *
+ * This function relies on the fact that the .xml release history data comes
+ * sorted based on major version and patch level, then finally by release date
+ * if there are multiple releases such as betas from the same major.patch
+ * version (e.g., 5.x-1.5-beta1, 5.x-1.5-beta2, and 5.x-1.5). Development
+ * snapshots for a given major version are always listed last.
+ *
+ * @param $project
+ *   An array containing information about a specific project.
+ * @param $project_data
+ *   An array containing information about a specific project.
+ * @param $available
+ *   Data about available project releases of a specific project.
+ */
+function update_calculate_project_update_status($project, &$project_data, $available) {
+  foreach (array('title', 'link') as $attribute) {
+    if (!isset($project_data[$attribute]) && isset($available[$attribute])) {
+      $project_data[$attribute] = $available[$attribute];
+    }
+  }
+
+  // If the project status is marked as something bad, there's nothing else
+  // to consider.
+  if (isset($available['project_status'])) {
+    switch ($available['project_status']) {
+      case 'insecure':
+        $project_data['status'] = UPDATE_NOT_SECURE;
+        if (empty($project_data['extra'])) {
+          $project_data['extra'] = array();
+        }
+        $project_data['extra'][] = array(
+          'class' => array('project-not-secure'),
+          'label' => t('Project not secure'),
+          'data' => t('This project has been labeled insecure by the Drupal security team, and is no longer available for download. Immediately disabling everything included by this project is strongly recommended!'),
+        );
+        break;
+      case 'unpublished':
+      case 'revoked':
+        $project_data['status'] = UPDATE_REVOKED;
+        if (empty($project_data['extra'])) {
+          $project_data['extra'] = array();
+        }
+        $project_data['extra'][] = array(
+          'class' => array('project-revoked'),
+          'label' => t('Project revoked'),
+          'data' => t('This project has been revoked, and is no longer available for download. Disabling everything included by this project is strongly recommended!'),
+        );
+        break;
+      case 'unsupported':
+        $project_data['status'] = UPDATE_NOT_SUPPORTED;
+        if (empty($project_data['extra'])) {
+          $project_data['extra'] = array();
+        }
+        $project_data['extra'][] = array(
+          'class' => array('project-not-supported'),
+          'label' => t('Project not supported'),
+          'data' => t('This project is no longer supported, and is no longer available for download. Disabling everything included by this project is strongly recommended!'),
+        );
+        break;
+      case 'not-fetched':
+        $project_data['status'] = UPDATE_NOT_FETCHED;
+        $project_data['reason'] = t('Failed to get available update data.');
+        break;
+
+      default:
+        // Assume anything else (e.g. 'published') is valid and we should
+        // perform the rest of the logic in this function.
+        break;
+    }
+  }
+
+  if (!empty($project_data['status'])) {
+    // We already know the status for this project, so there's nothing else to
+    // compute. Record the project status into $project_data and we're done.
+    $project_data['project_status'] = $available['project_status'];
+    return;
+  }
+
+  // Figure out the target major version.
+  $existing_major = $project_data['existing_major'];
+  $supported_majors = array();
+  if (isset($available['supported_majors'])) {
+    $supported_majors = explode(',', $available['supported_majors']);
+  }
+  elseif (isset($available['default_major'])) {
+    // Older release history XML file without supported or recommended.
+    $supported_majors[] = $available['default_major'];
+  }
+
+  if (in_array($existing_major, $supported_majors)) {
+    // Still supported, stay at the current major version.
+    $target_major = $existing_major;
+  }
+  elseif (isset($available['recommended_major'])) {
+    // Since 'recommended_major' is defined, we know this is the new XML
+    // format. Therefore, we know the current release is unsupported since
+    // its major version was not in the 'supported_majors' list. We should
+    // find the best release from the recommended major version.
+    $target_major = $available['recommended_major'];
+    $project_data['status'] = UPDATE_NOT_SUPPORTED;
+  }
+  elseif (isset($available['default_major'])) {
+    // Older release history XML file without recommended, so recommend
+    // the currently defined "default_major" version.
+    $target_major = $available['default_major'];
+  }
+  else {
+    // Malformed XML file? Stick with the current version.
+    $target_major = $existing_major;
+  }
+
+  // Make sure we never tell the admin to downgrade. If we recommended an
+  // earlier version than the one they're running, they'd face an
+  // impossible data migration problem, since Drupal never supports a DB
+  // downgrade path. In the unfortunate case that what they're running is
+  // unsupported, and there's nothing newer for them to upgrade to, we
+  // can't print out a "Recommended version", but just have to tell them
+  // what they have is unsupported and let them figure it out.
+  $target_major = max($existing_major, $target_major);
+
+  $release_patch_changed = '';
+  $patch = '';
+
+  // If the project is marked as UPDATE_FETCH_PENDING, it means that the
+  // data we currently have (if any) is stale, and we've got a task queued
+  // up to (re)fetch the data. In that case, we mark it as such, merge in
+  // whatever data we have (e.g. project title and link), and move on.
+  if (!empty($available['fetch_status']) && $available['fetch_status'] == UPDATE_FETCH_PENDING) {
+    $project_data['status'] = UPDATE_FETCH_PENDING;
+    $project_data['reason'] = t('No available update data');
+    $project_data['fetch_status'] = $available['fetch_status'];
+    return;
+  }
+
+  // Defend ourselves from XML history files that contain no releases.
+  if (empty($available['releases'])) {
+    $project_data['status'] = UPDATE_UNKNOWN;
+    $project_data['reason'] = t('No available releases found');
+    return;
+  }
+  foreach ($available['releases'] as $version => $release) {
+    // First, if this is the existing release, check a few conditions.
+    if ($project_data['existing_version'] === $version) {
+      if (isset($release['terms']['Release type']) &&
+          in_array('Insecure', $release['terms']['Release type'])) {
+        $project_data['status'] = UPDATE_NOT_SECURE;
+      }
+      elseif ($release['status'] == 'unpublished') {
+        $project_data['status'] = UPDATE_REVOKED;
+        if (empty($project_data['extra'])) {
+          $project_data['extra'] = array();
+        }
+        $project_data['extra'][] = array(
+          'class' => array('release-revoked'),
+          'label' => t('Release revoked'),
+          'data' => t('Your currently installed release has been revoked, and is no longer available for download. Disabling everything included in this release or upgrading is strongly recommended!'),
+        );
+      }
+      elseif (isset($release['terms']['Release type']) &&
+              in_array('Unsupported', $release['terms']['Release type'])) {
+        $project_data['status'] = UPDATE_NOT_SUPPORTED;
+        if (empty($project_data['extra'])) {
+          $project_data['extra'] = array();
+        }
+        $project_data['extra'][] = array(
+          'class' => array('release-not-supported'),
+          'label' => t('Release not supported'),
+          'data' => t('Your currently installed release is now unsupported, and is no longer available for download. Disabling everything included in this release or upgrading is strongly recommended!'),
+        );
+      }
+    }
+
+    // Otherwise, ignore unpublished, insecure, or unsupported releases.
+    if ($release['status'] == 'unpublished' ||
+        (isset($release['terms']['Release type']) &&
+         (in_array('Insecure', $release['terms']['Release type']) ||
+          in_array('Unsupported', $release['terms']['Release type'])))) {
+      continue;
+    }
+
+    // See if this is a higher major version than our target and yet still
+    // supported. If so, record it as an "Also available" release.
+    // Note: some projects have a HEAD release from CVS days, which could
+    // be one of those being compared. They would not have version_major
+    // set, so we must call isset first.
+    if (isset($release['version_major']) && $release['version_major'] > $target_major) {
+      if (in_array($release['version_major'], $supported_majors)) {
+        if (!isset($project_data['also'])) {
+          $project_data['also'] = array();
+        }
+        if (!isset($project_data['also'][$release['version_major']])) {
+          $project_data['also'][$release['version_major']] = $version;
+          $project_data['releases'][$version] = $release;
+        }
+      }
+      // Otherwise, this release can't matter to us, since it's neither
+      // from the release series we're currently using nor the recommended
+      // release. We don't even care about security updates for this
+      // branch, since if a project maintainer puts out a security release
+      // at a higher major version and not at the lower major version,
+      // they must remove the lower version from the supported major
+      // versions at the same time, in which case we won't hit this code.
+      continue;
+    }
+
+    // Look for the 'latest version' if we haven't found it yet. Latest is
+    // defined as the most recent version for the target major version.
+    if (!isset($project_data['latest_version'])
+        && $release['version_major'] == $target_major) {
+      $project_data['latest_version'] = $version;
+      $project_data['releases'][$version] = $release;
+    }
+
+    // Look for the development snapshot release for this branch.
+    if (!isset($project_data['dev_version'])
+        && $release['version_major'] == $target_major
+        && isset($release['version_extra'])
+        && $release['version_extra'] == 'dev') {
+      $project_data['dev_version'] = $version;
+      $project_data['releases'][$version] = $release;
+    }
+
+    // Look for the 'recommended' version if we haven't found it yet (see
+    // phpdoc at the top of this function for the definition).
+    if (!isset($project_data['recommended'])
+        && $release['version_major'] == $target_major
+        && isset($release['version_patch'])) {
+      if ($patch != $release['version_patch']) {
+        $patch = $release['version_patch'];
+        $release_patch_changed = $release;
+      }
+      if (empty($release['version_extra']) && $patch == $release['version_patch']) {
+        $project_data['recommended'] = $release_patch_changed['version'];
+        $project_data['releases'][$release_patch_changed['version']] = $release_patch_changed;
+      }
+    }
+
+    // Stop searching once we hit the currently installed version.
+    if ($project_data['existing_version'] === $version) {
+      break;
+    }
+
+    // If we're running a dev snapshot and have a timestamp, stop
+    // searching for security updates once we hit an official release
+    // older than what we've got. Allow 100 seconds of leeway to handle
+    // differences between the datestamp in the .info file and the
+    // timestamp of the tarball itself (which are usually off by 1 or 2
+    // seconds) so that we don't flag that as a new release.
+    if ($project_data['install_type'] == 'dev') {
+      if (empty($project_data['datestamp'])) {
+        // We don't have current timestamp info, so we can't know.
+        continue;
+      }
+      elseif (isset($release['date']) && ($project_data['datestamp'] + 100 > $release['date'])) {
+        // We're newer than this, so we can skip it.
+        continue;
+      }
+    }
+
+    // See if this release is a security update.
+    if (isset($release['terms']['Release type'])
+        && in_array('Security update', $release['terms']['Release type'])) {
+      $project_data['security updates'][] = $release;
+    }
+  }
+
+  // If we were unable to find a recommended version, then make the latest
+  // version the recommended version if possible.
+  if (!isset($project_data['recommended']) && isset($project_data['latest_version'])) {
+    $project_data['recommended'] = $project_data['latest_version'];
+  }
+
+  //
+  // Check to see if we need an update or not.
+  //
+
+  if (!empty($project_data['security updates'])) {
+    // If we found security updates, that always trumps any other status.
+    $project_data['status'] = UPDATE_NOT_SECURE;
+  }
+
+  if (isset($project_data['status'])) {
+    // If we already know the status, we're done.
+    return;
+  }
+
+  // If we don't know what to recommend, there's nothing we can report.
+  // Bail out early.
+  if (!isset($project_data['recommended'])) {
+    $project_data['status'] = UPDATE_UNKNOWN;
+    $project_data['reason'] = t('No available releases found');
+    return;
+  }
+
+  // If we're running a dev snapshot, compare the date of the dev snapshot
+  // with the latest official version, and record the absolute latest in
+  // 'latest_dev' so we can correctly decide if there's a newer release
+  // than our current snapshot.
+  if ($project_data['install_type'] == 'dev') {
+    if (isset($project_data['dev_version']) && $available['releases'][$project_data['dev_version']]['date'] > $available['releases'][$project_data['latest_version']]['date']) {
+      $project_data['latest_dev'] = $project_data['dev_version'];
+    }
+    else {
+      $project_data['latest_dev'] = $project_data['latest_version'];
+    }
+  }
+
+  // Figure out the status, based on what we've seen and the install type.
+  switch ($project_data['install_type']) {
+    case 'official':
+      if ($project_data['existing_version'] === $project_data['recommended'] || $project_data['existing_version'] === $project_data['latest_version']) {
+        $project_data['status'] = UPDATE_CURRENT;
+      }
+      else {
+        $project_data['status'] = UPDATE_NOT_CURRENT;
+      }
+      break;
+
+    case 'dev':
+      $latest = $available['releases'][$project_data['latest_dev']];
+      if (empty($project_data['datestamp'])) {
+        $project_data['status'] = UPDATE_NOT_CHECKED;
+        $project_data['reason'] = t('Unknown release date');
+      }
+      elseif (($project_data['datestamp'] + 100 > $latest['date'])) {
+        $project_data['status'] = UPDATE_CURRENT;
+      }
+      else {
+        $project_data['status'] = UPDATE_NOT_CURRENT;
+      }
+      break;
+
+    default:
+      $project_data['status'] = UPDATE_UNKNOWN;
+      $project_data['reason'] = t('Invalid info');
+  }
+}
+
+/**
+ * Retrieves data from {cache_update} or empties the cache when necessary.
+ *
+ * Two very expensive arrays computed by this module are the list of all
+ * installed modules and themes (and .info data, project associations, etc), and
+ * the current status of the site relative to the currently available releases.
+ * These two arrays are cached in the {cache_update} table and used whenever
+ * possible. The cache is cleared whenever the administrator visits the status
+ * report, available updates report, or the module or theme administration
+ * pages, since we should always recompute the most current values on any of
+ * those pages.
+ *
+ * Note: while both of these arrays are expensive to compute (in terms of disk
+ * I/O and some fairly heavy CPU processing), neither of these is the actual
+ * data about available updates that we have to fetch over the network from
+ * updates.drupal.org. That information is stored with the
+ * 'update_available_releases' cache ID -- it needs to persist longer than 1
+ * hour and never get invalidated just by visiting a page on the site.
+ *
+ * @param $cid
+ *   The cache ID of data to return from the cache. Valid options are
+ *   'update_project_data' and 'update_project_projects'.
+ *
+ * @return
+ *   The cached value of the $projects array generated by
+ *   update_calculate_project_data() or update_get_projects(), or an empty array
+ *   when the cache is cleared.
+ */
+function update_project_cache($cid) {
+  $projects = array();
+
+  // On certain paths, we should clear the cache and recompute the projects for
+  // update status of the site to avoid presenting stale information.
+  $q = $_GET['q'];
+  $paths = array(
+    'admin/modules',
+    'admin/modules/update',
+    'admin/appearance',
+    'admin/appearance/update',
+    'admin/reports',
+    'admin/reports/updates',
+    'admin/reports/updates/update',
+    'admin/reports/status',
+    'admin/reports/updates/check',
+  );
+  if (in_array($q, $paths)) {
+    _update_cache_clear($cid);
+  }
+  else {
+    $cache = _update_cache_get($cid);
+    if (!empty($cache->data) && $cache->expire > REQUEST_TIME) {
+      $projects = $cache->data;
+    }
+  }
+  return $projects;
+}
+
+/**
+ * Filters the project .info data to only save attributes we need.
+ *
+ * @param array $info
+ *   Array of .info file data as returned by drupal_parse_info_file().
+ *
+ * @return
+ *   Array of .info file data we need for the update manager.
+ *
+ * @see _update_process_info_list()
+ */
+function update_filter_project_info($info) {
+  $whitelist = array(
+    '_info_file_ctime',
+    'datestamp',
+    'major',
+    'name',
+    'package',
+    'project',
+    'project status url',
+    'version',
+  );
+  return array_intersect_key($info, drupal_map_assoc($whitelist));
+}
diff --git a/htmltest/modules/update/update.css b/htmltest/modules/update/update.css
new file mode 100644
index 00000000..ba45fe6b
--- /dev/null
+++ b/htmltest/modules/update/update.css
@@ -0,0 +1,135 @@
+/**
+ * @file
+ * Styles used by the Update Manager module.
+ */
+
+.update .project {
+  font-weight: bold;
+  font-size: 110%;
+  padding-left: .25em; /* LTR */
+  height: 22px;
+}
+
+.update .version-status {
+  float: right; /* LTR */
+  padding-right: 10px; /* LTR */
+  font-size: 110%;
+  height: 20px;
+}
+
+.update .version-status .icon {
+  padding-left: .5em; /* LTR */
+}
+
+.update .version-date {
+  white-space: nowrap;
+}
+
+.update .info {
+  margin: 0;
+  padding: 1em 1em .25em 1em;
+}
+
+.update tr.even,
+.update tr.odd {
+  border: none;
+}
+
+.update tr td {
+  border-top: 1px solid #ccc;
+  border-bottom: 1px solid #ccc;
+}
+
+.update tr.error {
+  background: #fcc;
+}
+
+.update tr.error .version-recommended {
+  background: #fdd;
+}
+
+.update tr.ok {
+  background: #dfd;
+}
+
+.update tr.warning {
+  background: #ffd;
+}
+
+.update tr.warning .version-recommended {
+  background: #ffe;
+}
+
+.current-version,
+.new-version {
+  direction: ltr; /* Note: version numbers should always be LTR. */
+}
+
+.update tr.unknown {
+  background: #ddd;
+}
+
+table.update,
+.update table.version {
+  width: 100%;
+  margin-top: .5em;
+  border: none;
+}
+
+.update table.version tbody {
+  border: none;
+}
+
+.update table.version tr,
+.update table.version td {
+  line-height: .9em;
+  padding: 0;
+  margin: 0;
+  border: none;
+  background: none;
+}
+
+.update table.version .version-title {
+  padding-left: 1em; /* LTR */
+  width: 14em;
+}
+
+.update table.version .version-details {
+  padding-right: .5em; /* LTR */
+}
+
+.update table.version .version-links {
+  text-align: right; /* LTR */
+  padding-right: 1em; /* LTR */
+}
+
+.update table.version-security .version-title {
+  color: #970F00;
+}
+
+.update table.version-recommended-strong .version-title {
+  font-weight: bold;
+}
+
+.update .security-error {
+  font-weight: bold;
+  color: #970F00;
+}
+
+.update .check-manually {
+  padding-left: 1em; /* LTR */
+}
+
+.update-major-version-warning {
+  color: #ff0000;
+}
+
+table tbody tr.update-security,
+table tbody tr.update-unsupported {
+  background: #fcc;
+}
+
+th.update-project-name {
+  width: 50%;
+}
+
diff --git a/htmltest/modules/update/update.fetch.inc b/htmltest/modules/update/update.fetch.inc
new file mode 100644
index 00000000..9dd2f0ba
--- /dev/null
+++ b/htmltest/modules/update/update.fetch.inc
@@ -0,0 +1,423 @@
+<?php
+
+/**
+ * @file
+ * Code required only when fetching information about available updates.
+ */
+
+/**
+ * Page callback: Checks for updates and displays the update status report.
+ *
+ * Manually checks the update status without the use of cron.
+ *
+ * @see update_menu()
+ */
+function update_manual_status() {
+  _update_refresh();
+  $batch = array(
+    'operations' => array(
+      array('update_fetch_data_batch', array()),
+    ),
+    'finished' => 'update_fetch_data_finished',
+    'title' => t('Checking available update data'),
+    'progress_message' => t('Trying to check available update data ...'),
+    'error_message' => t('Error checking available update data.'),
+    'file' => drupal_get_path('module', 'update') . '/update.fetch.inc',
+  );
+  batch_set($batch);
+  batch_process('admin/reports/updates');
+}
+
+/**
+ * Batch callback: Processes a step in batch for fetching available update data.
+ *
+ * @param $context
+ *   Reference to an array used for Batch API storage.
+ */
+function update_fetch_data_batch(&$context) {
+  $queue = DrupalQueue::get('update_fetch_tasks');
+  if (empty($context['sandbox']['max'])) {
+    $context['finished'] = 0;
+    $context['sandbox']['max'] = $queue->numberOfItems();
+    $context['sandbox']['progress'] = 0;
+    $context['message'] = t('Checking available update data ...');
+    $context['results']['updated'] = 0;
+    $context['results']['failures'] = 0;
+    $context['results']['processed'] = 0;
+  }
+
+  // Grab another item from the fetch queue.
+  for ($i = 0; $i < 5; $i++) {
+    if ($item = $queue->claimItem()) {
+      if (_update_process_fetch_task($item->data)) {
+        $context['results']['updated']++;
+        $context['message'] = t('Checked available update data for %title.', array('%title' => $item->data['info']['name']));
+      }
+      else {
+        $context['message'] = t('Failed to check available update data for %title.', array('%title' => $item->data['info']['name']));
+        $context['results']['failures']++;
+      }
+      $context['sandbox']['progress']++;
+      $context['results']['processed']++;
+      $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
+      $queue->deleteItem($item);
+    }
+    else {
+      // If the queue is currently empty, we're done. It's possible that
+      // another thread might have added new fetch tasks while we were
+      // processing this batch. In that case, the usual 'finished' math could
+      // get confused, since we'd end up processing more tasks that we thought
+      // we had when we started and initialized 'max' with numberOfItems(). By
+      // forcing 'finished' to be exactly 1 here, we ensure that batch
+      // processing is terminated.
+      $context['finished'] = 1;
+      return;
+    }
+  }
+}
+
+/**
+ * Batch callback: Performs actions when all fetch tasks have been completed.
+ *
+ * @param $success
+ *   TRUE if the batch operation was successful; FALSE if there were errors.
+ * @param $results
+ *   An associative array of results from the batch operation, including the key
+ *   'updated' which holds the total number of projects we fetched available
+ *   update data for.
+ */
+function update_fetch_data_finished($success, $results) {
+  if ($success) {
+    if (!empty($results)) {
+      if (!empty($results['updated'])) {
+        drupal_set_message(format_plural($results['updated'], 'Checked available update data for one project.', 'Checked available update data for @count projects.'));
+      }
+      if (!empty($results['failures'])) {
+        drupal_set_message(format_plural($results['failures'], 'Failed to get available update data for one project.', 'Failed to get available update data for @count projects.'), 'error');
+      }
+    }
+  }
+  else {
+    drupal_set_message(t('An error occurred trying to get available update data.'), 'error');
+  }
+}
+
+/**
+ * Attempts to drain the queue of tasks for release history data to fetch.
+ */
+function _update_fetch_data() {
+  $queue = DrupalQueue::get('update_fetch_tasks');
+  $end = time() + variable_get('update_max_fetch_time', UPDATE_MAX_FETCH_TIME);
+  while (time() < $end && ($item = $queue->claimItem())) {
+    _update_process_fetch_task($item->data);
+    $queue->deleteItem($item);
+  }
+}
+
+/**
+ * Processes a task to fetch available update data for a single project.
+ *
+ * Once the release history XML data is downloaded, it is parsed and saved into
+ * the {cache_update} table in an entry just for that project.
+ *
+ * @param $project
+ *   Associative array of information about the project to fetch data for.
+ *
+ * @return
+ *   TRUE if we fetched parsable XML, otherwise FALSE.
+ */
+function _update_process_fetch_task($project) {
+  global $base_url;
+  $fail = &drupal_static(__FUNCTION__, array());
+  // This can be in the middle of a long-running batch, so REQUEST_TIME won't
+  // necessarily be valid.
+  $now = time();
+  if (empty($fail)) {
+    // If we have valid data about release history XML servers that we have
+    // failed to fetch from on previous attempts, load that from the cache.
+    if (($cache = _update_cache_get('fetch_failures')) && ($cache->expire > $now)) {
+      $fail = $cache->data;
+    }
+  }
+
+  $max_fetch_attempts = variable_get('update_max_fetch_attempts', UPDATE_MAX_FETCH_ATTEMPTS);
+
+  $success = FALSE;
+  $available = array();
+  $site_key = drupal_hmac_base64($base_url, drupal_get_private_key());
+  $url = _update_build_fetch_url($project, $site_key);
+  $fetch_url_base = _update_get_fetch_url_base($project);
+  $project_name = $project['name'];
+
+  if (empty($fail[$fetch_url_base]) || $fail[$fetch_url_base] < $max_fetch_attempts) {
+    $xml = drupal_http_request($url);
+    if (!isset($xml->error) && isset($xml->data)) {
+      $data = $xml->data;
+    }
+  }
+
+  if (!empty($data)) {
+    $available = update_parse_xml($data);
+    // @todo: Purge release data we don't need (http://drupal.org/node/238950).
+    if (!empty($available)) {
+      // Only if we fetched and parsed something sane do we return success.
+      $success = TRUE;
+    }
+  }
+  else {
+    $available['project_status'] = 'not-fetched';
+    if (empty($fail[$fetch_url_base])) {
+      $fail[$fetch_url_base] = 1;
+    }
+    else {
+      $fail[$fetch_url_base]++;
+    }
+  }
+
+  $frequency = variable_get('update_check_frequency', 1);
+  $cid = 'available_releases::' . $project_name;
+  _update_cache_set($cid, $available, $now + (60 * 60 * 24 * $frequency));
+
+  // Stash the $fail data back in the DB for the next 5 minutes.
+  _update_cache_set('fetch_failures', $fail, $now + (60 * 5));
+
+  // Whether this worked or not, we did just (try to) check for updates.
+  variable_set('update_last_check', $now);
+
+  // Now that we processed the fetch task for this project, clear out the
+  // record in {cache_update} for this task so we're willing to fetch again.
+  _update_cache_clear('fetch_task::' . $project_name);
+
+  return $success;
+}
+
+/**
+ * Clears out all the cached available update data and initiates re-fetching.
+ */
+function _update_refresh() {
+  module_load_include('inc', 'update', 'update.compare');
+
+  // Since we're fetching new available update data, we want to clear
+  // our cache of both the projects we care about, and the current update
+  // status of the site. We do *not* want to clear the cache of available
+  // releases just yet, since that data (even if it's stale) can be useful
+  // during update_get_projects(); for example, to modules that implement
+  // hook_system_info_alter() such as cvs_deploy.
+  _update_cache_clear('update_project_projects');
+  _update_cache_clear('update_project_data');
+
+  $projects = update_get_projects();
+
+  // Now that we have the list of projects, we should also clear our cache of
+  // available release data, since even if we fail to fetch new data, we need
+  // to clear out the stale data at this point.
+  _update_cache_clear('available_releases::', TRUE);
+
+  foreach ($projects as $key => $project) {
+    update_create_fetch_task($project);
+  }
+}
+
+/**
+ * Adds a task to the queue for fetching release history data for a project.
+ *
+ * We only create a new fetch task if there's no task already in the queue for
+ * this particular project (based on 'fetch_task::' entries in the
+ * {cache_update} table).
+ *
+ * @param $project
+ *   Associative array of information about a project as created by
+ *   update_get_projects(), including keys such as 'name' (short name), and the
+ *   'info' array with data from a .info file for the project.
+ *
+ * @see update_get_projects()
+ * @see update_get_available()
+ * @see update_refresh()
+ * @see update_fetch_data()
+ * @see _update_process_fetch_task()
+ */
+function _update_create_fetch_task($project) {
+  $fetch_tasks = &drupal_static(__FUNCTION__, array());
+  if (empty($fetch_tasks)) {
+    $fetch_tasks = _update_get_cache_multiple('fetch_task');
+  }
+  $cid = 'fetch_task::' . $project['name'];
+  if (empty($fetch_tasks[$cid])) {
+    $queue = DrupalQueue::get('update_fetch_tasks');
+    $queue->createItem($project);
+    // Due to race conditions, it is possible that another process already
+    // inserted a row into the {cache_update} table and the following query will
+    // throw an exception.
+    // @todo: Remove the need for the manual check by relying on a queue that
+    // enforces unique items.
+    try {
+      db_insert('cache_update')
+        ->fields(array(
+          'cid' => $cid,
+          'created' => REQUEST_TIME,
+        ))
+        ->execute();
+    }
+    catch (Exception $e) {
+      // The exception can be ignored safely.
+    }
+    $fetch_tasks[$cid] = REQUEST_TIME;
+  }
+}
+
+/**
+ * Generates the URL to fetch information about project updates.
+ *
+ * This figures out the right URL to use, based on the project's .info file and
+ * the global defaults. Appends optional query arguments when the site is
+ * configured to report usage stats.
+ *
+ * @param $project
+ *   The array of project information from update_get_projects().
+ * @param $site_key
+ *   (optional) The anonymous site key hash. Defaults to an empty string.
+ *
+ * @return
+ *   The URL for fetching information about updates to the specified project.
+ *
+ * @see update_fetch_data()
+ * @see _update_process_fetch_task()
+ * @see update_get_projects()
+ */
+function _update_build_fetch_url($project, $site_key = '') {
+  $name = $project['name'];
+  $url = _update_get_fetch_url_base($project);
+  $url .= '/' . $name . '/' . DRUPAL_CORE_COMPATIBILITY;
+
+  // Only append usage information if we have a site key and the project is
+  // enabled. We do not want to record usage statistics for disabled projects.
+  if (!empty($site_key) && (strpos($project['project_type'], 'disabled') === FALSE)) {
+    // Append the site key.
+    $url .= (strpos($url, '?') !== FALSE) ? '&' : '?';
+    $url .= 'site_key=';
+    $url .= rawurlencode($site_key);
+
+    // Append the version.
+    if (!empty($project['info']['version'])) {
+      $url .= '&version=';
+      $url .= rawurlencode($project['info']['version']);
+    }
+
+    // Append the list of modules or themes enabled.
+    $list = array_keys($project['includes']);
+    $url .= '&list=';
+    $url .= rawurlencode(implode(',', $list));
+  }
+  return $url;
+}
+
+/**
+ * Returns the base of the URL to fetch available update data for a project.
+ *
+ * @param $project
+ *   The array of project information from update_get_projects().
+ *
+ * @return
+ *   The base of the URL used for fetching available update data. This does
+ *   not include the path elements to specify a particular project, version,
+ *   site_key, etc.
+ *
+ * @see _update_build_fetch_url()
+ */
+function _update_get_fetch_url_base($project) {
+  return isset($project['info']['project status url']) ? $project['info']['project status url'] : variable_get('update_fetch_url', UPDATE_DEFAULT_URL);
+}
+
+/**
+ * Performs any notifications that should be done once cron fetches new data.
+ *
+ * This method checks the status of the site using the new data and, depending
+ * on the configuration of the site, notifies administrators via e-mail if there
+ * are new releases or missing security updates.
+ *
+ * @see update_requirements()
+ */
+function _update_cron_notify() {
+  module_load_install('update');
+  $status = update_requirements('runtime');
+  $params = array();
+  $notify_all = (variable_get('update_notification_threshold', 'all') == 'all');
+  foreach (array('core', 'contrib') as $report_type) {
+    $type = 'update_' . $report_type;
+    if (isset($status[$type]['severity'])
+        && ($status[$type]['severity'] == REQUIREMENT_ERROR || ($notify_all && $status[$type]['reason'] == UPDATE_NOT_CURRENT))) {
+      $params[$report_type] = $status[$type]['reason'];
+    }
+  }
+  if (!empty($params)) {
+    $notify_list = variable_get('update_notify_emails', '');
+    if (!empty($notify_list)) {
+      $default_language = language_default();
+      foreach ($notify_list as $target) {
+        if ($target_user = user_load_by_mail($target)) {
+          $target_language = user_preferred_language($target_user);
+        }
+        else {
+          $target_language = $default_language;
+        }
+        $message = drupal_mail('update', 'status_notify', $target, $target_language, $params);
+        // Track when the last mail was successfully sent to avoid sending
+        // too many e-mails.
+        if ($message['result']) {
+          variable_set('update_last_email_notification', REQUEST_TIME);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Parses the XML of the Drupal release history info files.
+ *
+ * @param $raw_xml
+ *   A raw XML string of available release data for a given project.
+ *
+ * @return
+ *   Array of parsed data about releases for a given project, or NULL if there
+ *   was an error parsing the string.
+ */
+function update_parse_xml($raw_xml) {
+  try {
+    $xml = new SimpleXMLElement($raw_xml);
+  }
+  catch (Exception $e) {
+    // SimpleXMLElement::__construct produces an E_WARNING error message for
+    // each error found in the XML data and throws an exception if errors
+    // were detected. Catch any exception and return failure (NULL).
+    return;
+  }
+  // If there is no valid project data, the XML is invalid, so return failure.
+  if (!isset($xml->short_name)) {
+    return;
+  }
+  $short_name = (string) $xml->short_name;
+  $data = array();
+  foreach ($xml as $k => $v) {
+    $data[$k] = (string) $v;
+  }
+  $data['releases'] = array();
+  if (isset($xml->releases)) {
+    foreach ($xml->releases->children() as $release) {
+      $version = (string) $release->version;
+      $data['releases'][$version] = array();
+      foreach ($release->children() as $k => $v) {
+        $data['releases'][$version][$k] = (string) $v;
+      }
+      $data['releases'][$version]['terms'] = array();
+      if ($release->terms) {
+        foreach ($release->terms->children() as $term) {
+          if (!isset($data['releases'][$version]['terms'][(string) $term->name])) {
+            $data['releases'][$version]['terms'][(string) $term->name] = array();
+          }
+          $data['releases'][$version]['terms'][(string) $term->name][] = (string) $term->value;
+        }
+      }
+    }
+  }
+  return $data;
+}
diff --git a/htmltest/modules/update/update.info b/htmltest/modules/update/update.info
new file mode 100644
index 00000000..0ac3750b
--- /dev/null
+++ b/htmltest/modules/update/update.info
@@ -0,0 +1,13 @@
+name = Update manager
+description = Checks for available updates, and can securely install or update modules and themes via a web interface.
+version = VERSION
+package = Core
+core = 7.x
+files[] = update.test
+configure = admin/reports/updates/settings
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/update/update.install b/htmltest/modules/update/update.install
new file mode 100644
index 00000000..baf49538
--- /dev/null
+++ b/htmltest/modules/update/update.install
@@ -0,0 +1,190 @@
+<?php
+
+/**
+ * @file
+ * Install, update, and uninstall functions for the Update Manager module.
+ */
+
+/**
+ * Implements hook_requirements().
+ *
+ * @return
+ *   An array describing the status of the site regarding available updates. If
+ *   there is no update data, only one record will be returned, indicating that
+ *   the status of core can't be determined. If data is available, there will be
+ *   two records: one for core, and another for all of contrib (assuming there
+ *   are any contributed modules or themes enabled on the site). In addition to
+ *   the fields expected by hook_requirements ('value', 'severity', and
+ *   optionally 'description'), this array will contain a 'reason' attribute,
+ *   which is an integer constant to indicate why the given status is being
+ *   returned (UPDATE_NOT_SECURE, UPDATE_NOT_CURRENT, or UPDATE_UNKNOWN). This
+ *   is used for generating the appropriate e-mail notification messages during
+ *   update_cron(), and might be useful for other modules that invoke
+ *   update_requirements() to find out if the site is up to date or not.
+ *
+ * @see _update_message_text()
+ * @see _update_cron_notify()
+ */
+function update_requirements($phase) {
+  $requirements = array();
+  if ($phase == 'runtime') {
+    if ($available = update_get_available(FALSE)) {
+      module_load_include('inc', 'update', 'update.compare');
+      $data = update_calculate_project_data($available);
+      // First, populate the requirements for core:
+      $requirements['update_core'] = _update_requirement_check($data['drupal'], 'core');
+      // We don't want to check drupal a second time.
+      unset($data['drupal']);
+      if (!empty($data)) {
+        // Now, sort our $data array based on each project's status. The
+        // status constants are numbered in the right order of precedence, so
+        // we just need to make sure the projects are sorted in ascending
+        // order of status, and we can look at the first project we find.
+        uasort($data, '_update_project_status_sort');
+        $first_project = reset($data);
+        $requirements['update_contrib'] = _update_requirement_check($first_project, 'contrib');
+      }
+    }
+    else {
+      $requirements['update_core']['title'] = t('Drupal core update status');
+      $requirements['update_core']['value'] = t('No update data available');
+      $requirements['update_core']['severity'] = REQUIREMENT_WARNING;
+      $requirements['update_core']['reason'] = UPDATE_UNKNOWN;
+      $requirements['update_core']['description'] = _update_no_data();
+    }
+  }
+  return $requirements;
+}
+
+/**
+ * Implements hook_schema().
+ */
+function update_schema() {
+  $schema['cache_update'] = drupal_get_schema_unprocessed('system', 'cache');
+  $schema['cache_update']['description'] = 'Cache table for the Update module to store information about available releases, fetched from central server.';
+  return $schema;
+}
+
+/**
+ * Implements hook_install().
+ */
+function update_install() {
+  $queue = DrupalQueue::get('update_fetch_tasks', TRUE);
+  $queue->createQueue();
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function update_uninstall() {
+  // Clear any variables that might be in use
+  $variables = array(
+    'update_check_frequency',
+    'update_fetch_url',
+    'update_last_check',
+    'update_last_email_notification',
+    'update_notification_threshold',
+    'update_notify_emails',
+    'update_max_fetch_attempts',
+    'update_max_fetch_time',
+  );
+  foreach ($variables as $variable) {
+    variable_del($variable);
+  }
+  $queue = DrupalQueue::get('update_fetch_tasks');
+  $queue->deleteQueue();
+}
+
+/**
+ * Fills in the requirements array.
+ *
+ * This is shared for both core and contrib to generate the right elements in
+ * the array for hook_requirements().
+ *
+ * @param $project
+ *   Array of information about the project we're testing as returned by
+ *   update_calculate_project_data().
+ * @param $type
+ *   What kind of project this is ('core' or 'contrib').
+ *
+ * @return
+ *   An array to be included in the nested $requirements array.
+ *
+ * @see hook_requirements()
+ * @see update_requirements()
+ * @see update_calculate_project_data()
+ */
+function _update_requirement_check($project, $type) {
+  $requirement = array();
+  if ($type == 'core') {
+    $requirement['title'] = t('Drupal core update status');
+  }
+  else {
+    $requirement['title'] = t('Module and theme update status');
+  }
+  $status = $project['status'];
+  if ($status != UPDATE_CURRENT) {
+    $requirement['reason'] = $status;
+    $requirement['description'] = _update_message_text($type, $status, TRUE);
+    $requirement['severity'] = REQUIREMENT_ERROR;
+  }
+  switch ($status) {
+    case UPDATE_NOT_SECURE:
+      $requirement_label = t('Not secure!');
+      break;
+    case UPDATE_REVOKED:
+      $requirement_label = t('Revoked!');
+      break;
+    case UPDATE_NOT_SUPPORTED:
+      $requirement_label = t('Unsupported release');
+      break;
+    case UPDATE_NOT_CURRENT:
+      $requirement_label = t('Out of date');
+      $requirement['severity'] = REQUIREMENT_WARNING;
+      break;
+    case UPDATE_UNKNOWN:
+    case UPDATE_NOT_CHECKED:
+    case UPDATE_NOT_FETCHED:
+      $requirement_label = isset($project['reason']) ? $project['reason'] : t('Can not determine status');
+      $requirement['severity'] = REQUIREMENT_WARNING;
+      break;
+    default:
+      $requirement_label = t('Up to date');
+  }
+  if ($status != UPDATE_CURRENT && $type == 'core' && isset($project['recommended'])) {
+    $requirement_label .= ' ' . t('(version @version available)', array('@version' => $project['recommended']));
+  }
+  $requirement['value'] = l($requirement_label, update_manager_access() ? 'admin/reports/updates/update' : 'admin/reports/updates');
+  return $requirement;
+}
+
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Create a queue to store tasks for requests to fetch available update data.
+ */
+function update_update_7000() {
+  module_load_include('inc', 'system', 'system.queue');
+  $queue = DrupalQueue::get('update_fetch_tasks');
+  $queue->createQueue();
+}
+
+/**
+ * Recreates cache_update table.
+ *
+ * Converts fields that hold serialized variables from text to blob.
+ * Removes 'headers' column.
+ */
+function update_update_7001() {
+  $schema = system_schema_cache_7054();
+
+  db_drop_table('cache_update');
+  db_create_table('cache_update', $schema);
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x".
+ */
diff --git a/htmltest/modules/update/update.manager.inc b/htmltest/modules/update/update.manager.inc
new file mode 100644
index 00000000..85b587de
--- /dev/null
+++ b/htmltest/modules/update/update.manager.inc
@@ -0,0 +1,943 @@
+<?php
+
+/**
+ * @file
+ * Administrative screens and processing functions of the Update Manager module.
+ *
+ * This allows site administrators with the 'administer software updates'
+ * permission to either upgrade existing projects, or download and install new
+ * ones, so long as the killswitch setting ('allow_authorize_operations') is
+ * still TRUE.
+ *
+ * To install new code, the administrator is prompted for either the URL of an
+ * archive file, or to directly upload the archive file. The archive is loaded
+ * into a temporary location, extracted, and verified. If everything is
+ * successful, the user is redirected to authorize.php to type in file transfer
+ * credentials and authorize the installation to proceed with elevated
+ * privileges, such that the extracted files can be copied out of the temporary
+ * location and into the live web root.
+ *
+ * Updating existing code is a more elaborate process. The first step is a
+ * selection form where the user is presented with a table of installed projects
+ * that are missing newer releases. The user selects which projects they wish to
+ * update, and presses the "Download updates" button to continue. This sets up a
+ * batch to fetch all the selected releases, and redirects to
+ * admin/update/download to display the batch progress bar as it runs. Each
+ * batch operation is responsible for downloading a single file, extracting the
+ * archive, and verifying the contents. If there are any errors, the user is
+ * redirected back to the first page with the error messages. If all downloads
+ * were extacted and verified, the user is instead redirected to
+ * admin/update/ready, a landing page which reminds them to backup their
+ * database and asks if they want to put the site offline during the update.
+ * Once the user presses the "Install updates" button, they are redirected to
+ * authorize.php to supply their web root file access credentials. The
+ * authorized operation (which lives in update.authorize.inc) sets up a batch to
+ * copy each extracted update from the temporary location into the live web
+ * root.
+ */
+
+/**
+ * @defgroup update_manager_update Update Manager module: update
+ * @{
+ * Update Manager module functionality for updating existing code.
+ *
+ * Provides a user interface to update existing code.
+ */
+
+/**
+ * Form constructor for the update form of the Update Manager module.
+ *
+ * This presents a table with all projects that have available updates with
+ * checkboxes to select which ones to upgrade.
+ *
+ * @param $context
+ *   String representing the context from which we're trying to update.
+ *   Allowed values are 'module', 'theme', and 'report'.
+ *
+ * @see update_manager_update_form_validate()
+ * @see update_manager_update_form_submit()
+ * @see update_menu()
+ * @ingroup forms
+ */
+function update_manager_update_form($form, $form_state = array(), $context) {
+  if (!_update_manager_check_backends($form, 'update')) {
+    return $form;
+  }
+
+  $form['#theme'] = 'update_manager_update_form';
+
+  $available = update_get_available(TRUE);
+  if (empty($available)) {
+    $form['message'] = array(
+      '#markup' => t('There was a problem getting update information. Try again later.'),
+    );
+    return $form;
+  }
+
+  $form['#attached']['css'][] = drupal_get_path('module', 'update') . '/update.css';
+
+  // This will be a nested array. The first key is the kind of project, which
+  // can be either 'enabled', 'disabled', 'manual' (projects which require
+  // manual updates, such as core). Then, each subarray is an array of
+  // projects of that type, indexed by project short name, and containing an
+  // array of data for cells in that project's row in the appropriate table.
+  $projects = array();
+
+  // This stores the actual download link we're going to update from for each
+  // project in the form, regardless of if it's enabled or disabled.
+  $form['project_downloads'] = array('#tree' => TRUE);
+
+  module_load_include('inc', 'update', 'update.compare');
+  $project_data = update_calculate_project_data($available);
+  foreach ($project_data as $name => $project) {
+    // Filter out projects which are up to date already.
+    if ($project['status'] == UPDATE_CURRENT) {
+      continue;
+    }
+    // The project name to display can vary based on the info we have.
+    if (!empty($project['title'])) {
+      if (!empty($project['link'])) {
+        $project_name = l($project['title'], $project['link']);
+      }
+      else {
+        $project_name = check_plain($project['title']);
+      }
+    }
+    elseif (!empty($project['info']['name'])) {
+      $project_name = check_plain($project['info']['name']);
+    }
+    else {
+      $project_name = check_plain($name);
+    }
+    if ($project['project_type'] == 'theme' || $project['project_type'] == 'theme-disabled') {
+      $project_name .= ' ' . t('(Theme)');
+    }
+
+    if (empty($project['recommended'])) {
+      // If we don't know what to recommend they upgrade to, we should skip
+      // the project entirely.
+      continue;
+    }
+
+    $recommended_release = $project['releases'][$project['recommended']];
+    $recommended_version = $recommended_release['version'] . ' ' . l(t('(Release notes)'), $recommended_release['release_link'], array('attributes' => array('title' => t('Release notes for @project_title', array('@project_title' => $project['title'])))));
+    if ($recommended_release['version_major'] != $project['existing_major']) {
+      $recommended_version .= '<div title="Major upgrade warning" class="update-major-version-warning">' . t('This update is a major version update which means that it may not be backwards compatible with your currently running version.  It is recommended that you read the release notes and proceed at your own risk.') . '</div>';
+    }
+
+    // Create an entry for this project.
+    $entry = array(
+      'title' => $project_name,
+      'installed_version' => $project['existing_version'],
+      'recommended_version' => $recommended_version,
+    );
+
+    switch ($project['status']) {
+      case UPDATE_NOT_SECURE:
+      case UPDATE_REVOKED:
+        $entry['title'] .= ' ' . t('(Security update)');
+        $entry['#weight'] = -2;
+        $type = 'security';
+        break;
+
+      case UPDATE_NOT_SUPPORTED:
+        $type = 'unsupported';
+        $entry['title'] .= ' ' . t('(Unsupported)');
+        $entry['#weight'] = -1;
+        break;
+
+      case UPDATE_UNKNOWN:
+      case UPDATE_NOT_FETCHED:
+      case UPDATE_NOT_CHECKED:
+      case UPDATE_NOT_CURRENT:
+        $type = 'recommended';
+        break;
+
+      default:
+        // Jump out of the switch and onto the next project in foreach.
+        continue 2;
+    }
+
+    $entry['#attributes'] = array('class' => array('update-' . $type));
+
+    // Drupal core needs to be upgraded manually.
+    $needs_manual = $project['project_type'] == 'core';
+
+    if ($needs_manual) {
+      // There are no checkboxes in the 'Manual updates' table so it will be
+      // rendered by theme('table'), not theme('tableselect'). Since the data
+      // formats are incompatible, we convert now to the format expected by
+      // theme('table').
+      unset($entry['#weight']);
+      $attributes = $entry['#attributes'];
+      unset($entry['#attributes']);
+      $entry = array(
+        'data' => $entry,
+      ) + $attributes;
+    }
+    else {
+      $form['project_downloads'][$name] = array(
+        '#type' => 'value',
+        '#value' => $recommended_release['download_link'],
+      );
+    }
+
+    // Based on what kind of project this is, save the entry into the
+    // appropriate subarray.
+    switch ($project['project_type']) {
+      case 'core':
+        // Core needs manual updates at this time.
+        $projects['manual'][$name] = $entry;
+        break;
+
+      case 'module':
+      case 'theme':
+        $projects['enabled'][$name] = $entry;
+        break;
+
+      case 'module-disabled':
+      case 'theme-disabled':
+        $projects['disabled'][$name] = $entry;
+        break;
+    }
+  }
+
+  if (empty($projects)) {
+    $form['message'] = array(
+      '#markup' => t('All of your projects are up to date.'),
+    );
+    return $form;
+  }
+
+  $headers = array(
+    'title' => array(
+      'data' => t('Name'),
+      'class' => array('update-project-name'),
+    ),
+    'installed_version' => t('Installed version'),
+    'recommended_version' => t('Recommended version'),
+  );
+
+  if (!empty($projects['enabled'])) {
+    $form['projects'] = array(
+      '#type' => 'tableselect',
+      '#header' => $headers,
+      '#options' => $projects['enabled'],
+    );
+    if (!empty($projects['disabled'])) {
+      $form['projects']['#prefix'] = '<h2>' . t('Enabled') . '</h2>';
+    }
+  }
+
+  if (!empty($projects['disabled'])) {
+    $form['disabled_projects'] = array(
+      '#type' => 'tableselect',
+      '#header' => $headers,
+      '#options' => $projects['disabled'],
+      '#weight' => 1,
+      '#prefix' => '<h2>' . t('Disabled') . '</h2>',
+    );
+  }
+
+  // If either table has been printed yet, we need a submit button and to
+  // validate the checkboxes.
+  if (!empty($projects['enabled']) || !empty($projects['disabled'])) {
+    $form['actions'] = array('#type' => 'actions');
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Download these updates'),
+    );
+    $form['#validate'][] = 'update_manager_update_form_validate';
+  }
+
+  if (!empty($projects['manual'])) {
+    $prefix = '<h2>' . t('Manual updates required') . '</h2>';
+    $prefix .= '<p>' . t('Updates of Drupal core are not supported at this time.') . '</p>';
+    $form['manual_updates'] = array(
+      '#type' => 'markup',
+      '#markup' => theme('table', array('header' => $headers, 'rows' => $projects['manual'])),
+      '#prefix' => $prefix,
+      '#weight' => 120,
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Returns HTML for the first page in the process of updating projects.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_update_manager_update_form($variables) {
+  $form = $variables['form'];
+  $last = variable_get('update_last_check', 0);
+  $output = theme('update_last_check', array('last' => $last));
+  $output .= drupal_render_children($form);
+  return $output;
+}
+
+/**
+ * Form validation handler for update_manager_update_form().
+ *
+ * Ensures that at least one project is selected.
+ *
+ * @see update_manager_update_form_submit()
+ */
+function update_manager_update_form_validate($form, &$form_state) {
+  if (!empty($form_state['values']['projects'])) {
+    $enabled = array_filter($form_state['values']['projects']);
+  }
+  if (!empty($form_state['values']['disabled_projects'])) {
+    $disabled = array_filter($form_state['values']['disabled_projects']);
+  }
+  if (empty($enabled) && empty($disabled)) {
+    form_set_error('projects', t('You must select at least one project to update.'));
+  }
+}
+
+/**
+ * Form submission handler for update_manager_update_form().
+ *
+ * Sets up a batch that downloads, extracts, and verifies the selected releases.
+ *
+ * @see update_manager_update_form_validate()
+ */
+function update_manager_update_form_submit($form, &$form_state) {
+  $projects = array();
+  foreach (array('projects', 'disabled_projects') as $type) {
+    if (!empty($form_state['values'][$type])) {
+      $projects = array_merge($projects, array_keys(array_filter($form_state['values'][$type])));
+    }
+  }
+  $operations = array();
+  foreach ($projects as $project) {
+    $operations[] = array(
+      'update_manager_batch_project_get',
+      array(
+        $project,
+        $form_state['values']['project_downloads'][$project],
+      ),
+    );
+  }
+  $batch = array(
+    'title' => t('Downloading updates'),
+    'init_message' => t('Preparing to download selected updates'),
+    'operations' => $operations,
+    'finished' => 'update_manager_download_batch_finished',
+    'file' => drupal_get_path('module', 'update') . '/update.manager.inc',
+  );
+  batch_set($batch);
+}
+
+/**
+ * Batch callback: Performs actions when the download batch is completed.
+ *
+ * @param $success
+ *   TRUE if the batch operation was successful, FALSE if there were errors.
+ * @param $results
+ *   An associative array of results from the batch operation.
+ */
+function update_manager_download_batch_finished($success, $results) {
+  if (!empty($results['errors'])) {
+    $error_list = array(
+      'title' => t('Downloading updates failed:'),
+      'items' => $results['errors'],
+    );
+    drupal_set_message(theme('item_list', $error_list), 'error');
+  }
+  elseif ($success) {
+    drupal_set_message(t('Updates downloaded successfully.'));
+    $_SESSION['update_manager_update_projects'] = $results['projects'];
+    drupal_goto('admin/update/ready');
+  }
+  else {
+    // Ideally we're catching all Exceptions, so they should never see this,
+    // but just in case, we have to tell them something.
+    drupal_set_message(t('Fatal error trying to download.'), 'error');
+  }
+}
+
+/**
+ * Form constructor for the update ready form.
+ *
+ * Build the form when the site is ready to update (after downloading).
+ *
+ * This form is an intermediary step in the automated update workflow. It is
+ * presented to the site administrator after all the required updates have been
+ * downloaded and verified. The point of this page is to encourage the user to
+ * backup their site, give them the opportunity to put the site offline, and
+ * then ask them to confirm that the update should continue. After this step,
+ * the user is redirected to authorize.php to enter their file transfer
+ * credentials and attempt to complete the update.
+ *
+ * @see update_manager_update_ready_form_submit()
+ * @see update_menu()
+ * @ingroup forms
+ */
+function update_manager_update_ready_form($form, &$form_state) {
+  if (!_update_manager_check_backends($form, 'update')) {
+    return $form;
+  }
+
+  $form['backup'] = array(
+    '#prefix' => '<strong>',
+    '#markup' => t('Back up your database and site before you continue. <a href="@backup_url">Learn how</a>.', array('@backup_url' => url('http://drupal.org/node/22281'))),
+    '#suffix' => '</strong>',
+  );
+
+  $form['maintenance_mode'] = array(
+    '#title' => t('Perform updates with site in maintenance mode (strongly recommended)'),
+    '#type' => 'checkbox',
+    '#default_value' => TRUE,
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Continue'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form submission handler for update_manager_update_ready_form().
+ *
+ * If the site administrator requested that the site is put offline during the
+ * update, do so now. Otherwise, pull information about all the required updates
+ * out of the SESSION, figure out what Drupal\Core\Updater\Updater class is
+ * needed for each one, generate an array of update operations to perform, and
+ * hand it all off to system_authorized_init(), then redirect to authorize.php.
+ *
+ * @see update_authorize_run_update()
+ * @see system_authorized_init()
+ * @see system_authorized_get_url()
+ */
+function update_manager_update_ready_form_submit($form, &$form_state) {
+  // Store maintenance_mode setting so we can restore it when done.
+  $_SESSION['maintenance_mode'] = variable_get('maintenance_mode', FALSE);
+  if ($form_state['values']['maintenance_mode'] == TRUE) {
+    variable_set('maintenance_mode', TRUE);
+  }
+
+  if (!empty($_SESSION['update_manager_update_projects'])) {
+    // Make sure the Updater registry is loaded.
+    drupal_get_updaters();
+
+    $updates = array();
+    $directory = _update_manager_extract_directory();
+
+    $projects = $_SESSION['update_manager_update_projects'];
+    unset($_SESSION['update_manager_update_projects']);
+
+    foreach ($projects as $project => $url) {
+      $project_location = $directory . '/' . $project;
+      $updater = Updater::factory($project_location);
+      $project_real_location = drupal_realpath($project_location);
+      $updates[] = array(
+        'project' => $project,
+        'updater_name' => get_class($updater),
+        'local_url' => $project_real_location,
+      );
+    }
+
+    // If the owner of the last directory we extracted is the same as the
+    // owner of our configuration directory (e.g. sites/default) where we're
+    // trying to install the code, there's no need to prompt for FTP/SSH
+    // credentials. Instead, we instantiate a FileTransferLocal and invoke
+    // update_authorize_run_update() directly.
+    if (fileowner($project_real_location) == fileowner(conf_path())) {
+      module_load_include('inc', 'update', 'update.authorize');
+      $filetransfer = new FileTransferLocal(DRUPAL_ROOT);
+      update_authorize_run_update($filetransfer, $updates);
+    }
+    // Otherwise, go through the regular workflow to prompt for FTP/SSH
+    // credentials and invoke update_authorize_run_update() indirectly with
+    // whatever FileTransfer object authorize.php creates for us.
+    else {
+      system_authorized_init('update_authorize_run_update', drupal_get_path('module', 'update') . '/update.authorize.inc', array($updates), t('Update manager'));
+      $form_state['redirect'] = system_authorized_get_url();
+    }
+  }
+}
+
+/**
+ * @} End of "defgroup update_manager_update".
+ */
+
+/**
+ * @defgroup update_manager_install Update Manager module: install
+ * @{
+ * Update Manager module functionality for installing new code.
+ *
+ * Provides a user interface to install new code.
+ */
+
+/**
+ * Form constructor for the install form of the Update Manager module.
+ *
+ * This presents a place to enter a URL or upload an archive file to use to
+ * install a new module or theme.
+ *
+ * @param $context
+ *   String representing the context from which we're trying to install.
+ *   Allowed values are 'module', 'theme', and 'report'.
+ *
+ * @see update_manager_install_form_validate()
+ * @see update_manager_install_form_submit()
+ * @see update_menu()
+ * @ingroup forms
+ */
+function update_manager_install_form($form, &$form_state, $context) {
+  if (!_update_manager_check_backends($form, 'install')) {
+    return $form;
+  }
+
+  $form['help_text'] = array(
+    '#prefix' => '<p>',
+    '#markup' => t('You can find <a href="@module_url">modules</a> and <a href="@theme_url">themes</a> on <a href="@drupal_org_url">drupal.org</a>. The following file extensions are supported: %extensions.', array(
+      '@module_url' => 'http://drupal.org/project/modules',
+      '@theme_url' => 'http://drupal.org/project/themes',
+      '@drupal_org_url' => 'http://drupal.org',
+      '%extensions' => archiver_get_extensions(),
+    )),
+    '#suffix' => '</p>',
+  );
+
+  $form['project_url'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Install from a URL'),
+    '#description' => t('For example: %url', array('%url' => 'http://ftp.drupal.org/files/projects/name.tar.gz')),
+  );
+
+  $form['information'] = array(
+    '#prefix' => '<strong>',
+    '#markup' => t('Or'),
+    '#suffix' => '</strong>',
+  );
+
+  $form['project_upload'] = array(
+    '#type' => 'file',
+    '#title' => t('Upload a module or theme archive to install'),
+    '#description' => t('For example: %filename from your local computer', array('%filename' => 'name.tar.gz')),
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Install'),
+  );
+
+  return $form;
+}
+
+/**
+ * Checks for file transfer backends and prepares a form fragment about them.
+ *
+ * @param array $form
+ *   Reference to the form array we're building.
+ * @param string $operation
+ *   The update manager operation we're in the middle of. Can be either 'update'
+ *   or 'install'. Use to provide operation-specific interface text.
+ *
+ * @return
+ *   TRUE if the update manager should continue to the next step in the
+ *   workflow, or FALSE if we've hit a fatal configuration and must halt the
+ *   workflow.
+ */
+function _update_manager_check_backends(&$form, $operation) {
+  // If file transfers will be performed locally, we do not need to display any
+  // warnings or notices to the user and should automatically continue the
+  // workflow, since we won't be using a FileTransfer backend that requires
+  // user input or a specific server configuration.
+  if (update_manager_local_transfers_allowed()) {
+    return TRUE;
+  }
+
+  // Otherwise, show the available backends.
+  $form['available_backends'] = array(
+    '#prefix' => '<p>',
+    '#suffix' => '</p>',
+  );
+
+  $available_backends = drupal_get_filetransfer_info();
+  if (empty($available_backends)) {
+    if ($operation == 'update') {
+      $form['available_backends']['#markup'] = t('Your server does not support updating modules and themes from this interface. Instead, update modules and themes by uploading the new versions directly to the server, as described in the <a href="@handbook_url">handbook</a>.', array('@handbook_url' => 'http://drupal.org/getting-started/install-contrib'));
+    }
+    else {
+      $form['available_backends']['#markup'] = t('Your server does not support installing modules and themes from this interface. Instead, install modules and themes by uploading them directly to the server, as described in the <a href="@handbook_url">handbook</a>.', array('@handbook_url' => 'http://drupal.org/getting-started/install-contrib'));
+    }
+    return FALSE;
+  }
+
+  $backend_names = array();
+  foreach ($available_backends as $backend) {
+    $backend_names[] = $backend['title'];
+  }
+  if ($operation == 'update') {
+    $form['available_backends']['#markup'] = format_plural(
+      count($available_backends),
+      'Updating modules and themes requires <strong>@backends access</strong> to your server. See the <a href="@handbook_url">handbook</a> for other update methods.',
+      'Updating modules and themes requires access to your server via one of the following methods: <strong>@backends</strong>. See the <a href="@handbook_url">handbook</a> for other update methods.',
+      array(
+        '@backends' => implode(', ', $backend_names),
+        '@handbook_url' => 'http://drupal.org/getting-started/install-contrib',
+      ));
+  }
+  else {
+    $form['available_backends']['#markup'] = format_plural(
+      count($available_backends),
+      'Installing modules and themes requires <strong>@backends access</strong> to your server. See the <a href="@handbook_url">handbook</a> for other installation methods.',
+      'Installing modules and themes requires access to your server via one of the following methods: <strong>@backends</strong>. See the <a href="@handbook_url">handbook</a> for other installation methods.',
+      array(
+        '@backends' => implode(', ', $backend_names),
+        '@handbook_url' => 'http://drupal.org/getting-started/install-contrib',
+      ));
+  }
+  return TRUE;
+}
+
+/**
+ * Form validation handler for update_manager_install_form().
+ *
+ * @see update_manager_install_form_submit()
+ */
+function update_manager_install_form_validate($form, &$form_state) {
+  if (!($form_state['values']['project_url'] XOR !empty($_FILES['files']['name']['project_upload']))) {
+    form_set_error('project_url', t('You must either provide a URL or upload an archive file to install.'));
+  }
+
+  if ($form_state['values']['project_url']) {
+    if (!valid_url($form_state['values']['project_url'], TRUE)) {
+      form_set_error('project_url', t('The provided URL is invalid.'));
+    }
+  }
+}
+
+/**
+ * Form submission handler for update_manager_install_form().
+ *
+ * Either downloads the file specified in the URL to a temporary cache, or
+ * uploads the file attached to the form, then attempts to extract the archive
+ * into a temporary location and verify it. Instantiate the appropriate
+ * Updater class for this project and make sure it is not already installed in
+ * the live webroot. If everything is successful, setup an operation to run
+ * via authorize.php which will copy the extracted files from the temporary
+ * location into the live site.
+ *
+ * @see update_manager_install_form_validate()
+ * @see update_authorize_run_install()
+ * @see system_authorized_init()
+ * @see system_authorized_get_url()
+ */
+function update_manager_install_form_submit($form, &$form_state) {
+  if ($form_state['values']['project_url']) {
+    $field = 'project_url';
+    $local_cache = update_manager_file_get($form_state['values']['project_url']);
+    if (!$local_cache) {
+      form_set_error($field, t('Unable to retrieve Drupal project from %url.', array('%url' => $form_state['values']['project_url'])));
+      return;
+    }
+  }
+  elseif ($_FILES['files']['name']['project_upload']) {
+    $validators = array('file_validate_extensions' => array(archiver_get_extensions()));
+    $field = 'project_upload';
+    if (!($finfo = file_save_upload($field, $validators, NULL, FILE_EXISTS_REPLACE))) {
+      // Failed to upload the file. file_save_upload() calls form_set_error() on
+      // failure.
+      return;
+    }
+    $local_cache = $finfo->uri;
+  }
+
+  $directory = _update_manager_extract_directory();
+  try {
+    $archive = update_manager_archive_extract($local_cache, $directory);
+  }
+  catch (Exception $e) {
+    form_set_error($field, $e->getMessage());
+    return;
+  }
+
+  $files = $archive->listContents();
+  if (!$files) {
+    form_set_error($field, t('Provided archive contains no files.'));
+    return;
+  }
+
+  // Unfortunately, we can only use the directory name to determine the project
+  // name. Some archivers list the first file as the directory (i.e., MODULE/)
+  // and others list an actual file (i.e., MODULE/README.TXT).
+  $project = strtok($files[0], '/\\');
+
+  $archive_errors = update_manager_archive_verify($project, $local_cache, $directory);
+  if (!empty($archive_errors)) {
+    form_set_error($field, array_shift($archive_errors));
+    // @todo: Fix me in D8: We need a way to set multiple errors on the same
+    // form element and have all of them appear!
+    if (!empty($archive_errors)) {
+      foreach ($archive_errors as $error) {
+        drupal_set_message($error, 'error');
+      }
+    }
+    return;
+  }
+
+  // Make sure the Updater registry is loaded.
+  drupal_get_updaters();
+
+  $project_location = $directory . '/' . $project;
+  try {
+    $updater = Updater::factory($project_location);
+  }
+  catch (Exception $e) {
+    form_set_error($field, $e->getMessage());
+    return;
+  }
+
+  try {
+    $project_title = Updater::getProjectTitle($project_location);
+  }
+  catch (Exception $e) {
+    form_set_error($field, $e->getMessage());
+    return;
+  }
+
+  if (!$project_title) {
+    form_set_error($field, t('Unable to determine %project name.', array('%project' => $project)));
+  }
+
+  if ($updater->isInstalled()) {
+    form_set_error($field, t('%project is already installed.', array('%project' => $project_title)));
+    return;
+  }
+
+  $project_real_location = drupal_realpath($project_location);
+  $arguments = array(
+    'project' => $project,
+    'updater_name' => get_class($updater),
+    'local_url' => $project_real_location,
+  );
+
+  // If the owner of the directory we extracted is the same as the
+  // owner of our configuration directory (e.g. sites/default) where we're
+  // trying to install the code, there's no need to prompt for FTP/SSH
+  // credentials. Instead, we instantiate a FileTransferLocal and invoke
+  // update_authorize_run_install() directly.
+  if (fileowner($project_real_location) == fileowner(conf_path())) {
+    module_load_include('inc', 'update', 'update.authorize');
+    $filetransfer = new FileTransferLocal(DRUPAL_ROOT);
+    call_user_func_array('update_authorize_run_install', array_merge(array($filetransfer), $arguments));
+  }
+  // Otherwise, go through the regular workflow to prompt for FTP/SSH
+  // credentials and invoke update_authorize_run_install() indirectly with
+  // whatever FileTransfer object authorize.php creates for us.
+  else {
+    system_authorized_init('update_authorize_run_install', drupal_get_path('module', 'update') . '/update.authorize.inc', $arguments, t('Update manager'));
+    $form_state['redirect'] = system_authorized_get_url();
+  }
+}
+
+/**
+ * @} End of "defgroup update_manager_install".
+ */
+
+/**
+ * @defgroup update_manager_file Update Manager module: file management
+ * @{
+ * Update Manager module file management functions.
+ *
+ * These functions are used by the update manager to copy, extract, and verify
+ * archive files.
+ */
+
+/**
+ * Unpacks a downloaded archive file.
+ *
+ * @param string $file
+ *   The filename of the archive you wish to extract.
+ * @param string $directory
+ *   The directory you wish to extract the archive into.
+ *
+ * @return Archiver
+ *   The Archiver object used to extract the archive.
+ *
+ * @throws Exception
+ */
+function update_manager_archive_extract($file, $directory) {
+  $archiver = archiver_get_archiver($file);
+  if (!$archiver) {
+    throw new Exception(t('Cannot extract %file, not a valid archive.', array ('%file' => $file)));
+  }
+
+  // Remove the directory if it exists, otherwise it might contain a mixture of
+  // old files mixed with the new files (e.g. in cases where files were removed
+  // from a later release).
+  $files = $archiver->listContents();
+
+  // Unfortunately, we can only use the directory name to determine the project
+  // name. Some archivers list the first file as the directory (i.e., MODULE/)
+  // and others list an actual file (i.e., MODULE/README.TXT).
+  $project = strtok($files[0], '/\\');
+
+  $extract_location = $directory . '/' . $project;
+  if (file_exists($extract_location)) {
+    file_unmanaged_delete_recursive($extract_location);
+  }
+
+  $archiver->extract($directory);
+  return $archiver;
+}
+
+/**
+ * Verifies an archive after it has been downloaded and extracted.
+ *
+ * This function is responsible for invoking hook_verify_update_archive().
+ *
+ * @param string $project
+ *   The short name of the project to download.
+ * @param string $archive_file
+ *   The filename of the unextracted archive.
+ * @param string $directory
+ *   The directory that the archive was extracted into.
+ *
+ * @return array
+ *   An array of error messages to display if the archive was invalid. If there
+ *   are no errors, it will be an empty array.
+ */
+function update_manager_archive_verify($project, $archive_file, $directory) {
+  return module_invoke_all('verify_update_archive', $project, $archive_file, $directory);
+}
+
+/**
+ * Copies a file from the specified URL to the temporary directory for updates.
+ *
+ * Returns the local path if the file has already been downloaded.
+ *
+ * @param $url
+ *   The URL of the file on the server.
+ *
+ * @return string
+ *   Path to local file.
+ */
+function update_manager_file_get($url) {
+  $parsed_url = parse_url($url);
+  $remote_schemes = array('http', 'https', 'ftp', 'ftps', 'smb', 'nfs');
+  if (!in_array($parsed_url['scheme'], $remote_schemes)) {
+    // This is a local file, just return the path.
+    return drupal_realpath($url);
+  }
+
+  // Check the cache and download the file if needed.
+  $cache_directory = _update_manager_cache_directory();
+  $local = $cache_directory . '/' . drupal_basename($parsed_url['path']);
+
+  if (!file_exists($local) || update_delete_file_if_stale($local)) {
+    return system_retrieve_file($url, $local, FALSE, FILE_EXISTS_REPLACE);
+  }
+  else {
+    return $local;
+  }
+}
+
+/**
+ * Batch callback: Downloads, unpacks, and verifies a project.
+ *
+ * This function assumes that the provided URL points to a file archive of some
+ * sort. The URL can have any scheme that we have a file stream wrapper to
+ * support. The file is downloaded to a local cache.
+ *
+ * @param string $project
+ *   The short name of the project to download.
+ * @param string $url
+ *   The URL to download a specific project release archive file.
+ * @param array $context
+ *   Reference to an array used for Batch API storage.
+ *
+ * @see update_manager_download_page()
+ */
+function update_manager_batch_project_get($project, $url, &$context) {
+  // This is here to show the user that we are in the process of downloading.
+  if (!isset($context['sandbox']['started'])) {
+    $context['sandbox']['started'] = TRUE;
+    $context['message'] = t('Downloading %project', array('%project' => $project));
+    $context['finished'] = 0;
+    return;
+  }
+
+  // Actually try to download the file.
+  if (!($local_cache = update_manager_file_get($url))) {
+    $context['results']['errors'][$project] = t('Failed to download %project from %url', array('%project' => $project, '%url' => $url));
+    return;
+  }
+
+  // Extract it.
+  $extract_directory = _update_manager_extract_directory();
+  try {
+    update_manager_archive_extract($local_cache, $extract_directory);
+  }
+  catch (Exception $e) {
+    $context['results']['errors'][$project] = $e->getMessage();
+    return;
+  }
+
+  // Verify it.
+  $archive_errors = update_manager_archive_verify($project, $local_cache, $extract_directory);
+  if (!empty($archive_errors)) {
+    // We just need to make sure our array keys don't collide, so use the
+    // numeric keys from the $archive_errors array.
+    foreach ($archive_errors as $key => $error) {
+      $context['results']['errors']["$project-$key"] = $error;
+    }
+    return;
+  }
+
+  // Yay, success.
+  $context['results']['projects'][$project] = $url;
+  $context['finished'] = 1;
+}
+
+/**
+ * Determines if file transfers will be performed locally.
+ *
+ * If the server is configured such that webserver-created files have the same
+ * owner as the configuration directory (e.g., sites/default) where new code
+ * will eventually be installed, the update manager can transfer files entirely
+ * locally, without changing their ownership (in other words, without prompting
+ * the user for FTP, SSH or other credentials).
+ *
+ * This server configuration is an inherent security weakness because it allows
+ * a malicious webserver process to append arbitrary PHP code and then execute
+ * it. However, it is supported here because it is a common configuration on
+ * shared hosting, and there is nothing Drupal can do to prevent it.
+ *
+ * @return
+ *   TRUE if local file transfers are allowed on this server, or FALSE if not.
+ *
+ * @see update_manager_update_ready_form_submit()
+ * @see update_manager_install_form_submit()
+ * @see install_check_requirements()
+ */
+function update_manager_local_transfers_allowed() {
+  // Compare the owner of a webserver-created temporary file to the owner of
+  // the configuration directory to determine if local transfers will be
+  // allowed.
+  $temporary_file = drupal_tempnam('temporary://', 'update_');
+  $local_transfers_allowed = fileowner($temporary_file) === fileowner(conf_path());
+
+  // Clean up. If this fails, we can ignore it (since this is just a temporary
+  // file anyway).
+  @drupal_unlink($temporary_file);
+
+  return $local_transfers_allowed;
+}
+
+/**
+ * @} End of "defgroup update_manager_file".
+ */
diff --git a/htmltest/modules/update/update.module b/htmltest/modules/update/update.module
new file mode 100644
index 00000000..d5728be3
--- /dev/null
+++ b/htmltest/modules/update/update.module
@@ -0,0 +1,993 @@
+<?php
+
+/**
+ * @file
+ * Handles updates of Drupal core and contributed projects.
+ *
+ * The module checks for available updates of Drupal core and any installed
+ * contributed modules and themes. It warns site administrators if newer
+ * releases are available via the system status report (admin/reports/status),
+ * the module and theme pages, and optionally via e-mail. It also provides the
+ * ability to install contributed modules and themes via an user interface.
+ */
+
+/**
+ * URL to check for updates, if a given project doesn't define its own.
+ */
+define('UPDATE_DEFAULT_URL', 'http://updates.drupal.org/release-history');
+
+// These are internally used constants for this code, do not modify.
+
+/**
+ * Project is missing security update(s).
+ */
+define('UPDATE_NOT_SECURE', 1);
+
+/**
+ * Current release has been unpublished and is no longer available.
+ */
+define('UPDATE_REVOKED', 2);
+
+/**
+ * Current release is no longer supported by the project maintainer.
+ */
+define('UPDATE_NOT_SUPPORTED', 3);
+
+/**
+ * Project has a new release available, but it is not a security release.
+ */
+define('UPDATE_NOT_CURRENT', 4);
+
+/**
+ * Project is up to date.
+ */
+define('UPDATE_CURRENT', 5);
+
+/**
+ * Project's status cannot be checked.
+ */
+define('UPDATE_NOT_CHECKED', -1);
+
+/**
+ * No available update data was found for project.
+ */
+define('UPDATE_UNKNOWN', -2);
+
+/**
+ * There was a failure fetching available update data for this project.
+ */
+define('UPDATE_NOT_FETCHED', -3);
+
+/**
+ * We need to (re)fetch available update data for this project.
+ */
+define('UPDATE_FETCH_PENDING', -4);
+
+/**
+ * Maximum number of attempts to fetch available update data from a given host.
+ */
+define('UPDATE_MAX_FETCH_ATTEMPTS', 2);
+
+/**
+ * Maximum number of seconds to try fetching available update data at a time.
+ */
+define('UPDATE_MAX_FETCH_TIME', 5);
+
+/**
+ * Implements hook_help().
+ */
+function update_help($path, $arg) {
+  switch ($path) {
+    case 'admin/reports/updates':
+      return '<p>' . t('Here you can find information about available updates for your installed modules and themes. Note that each module or theme is part of a "project", which may or may not have the same name, and might include multiple modules or themes within it.') . '</p>';
+
+    case 'admin/help#update':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t("The Update manager module periodically checks for new versions of your site's software (including contributed modules and themes), and alerts administrators to available updates. In order to provide update information, anonymous usage statistics are sent to Drupal.org. If desired, you may disable the Update manager module from the <a href='@modules'>Module administration page</a>. For more information, see the online handbook entry for <a href='@update'>Update manager module</a>.", array('@update' => 'http://drupal.org/documentation/modules/update', '@modules' => url('admin/modules'))) . '</p>';
+      // Only explain the Update manager if it has not been disabled.
+      if (update_manager_access()) {
+        $output .= '<p>' . t('The Update manager also allows administrators to update and install modules and themes through the administration interface.') . '</p>';
+      }
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Checking for available updates') . '</dt>';
+      $output .= '<dd>' . t('A report of <a href="@update-report">available updates</a> will alert you when new releases are available for download. You may configure options for the frequency for checking updates (which are performed during <a href="@cron">cron</a> runs) and e-mail notifications at the <a href="@update-settings">Update manager settings</a>  page.', array('@update-report' => url('admin/reports/updates'), '@cron' => 'http://drupal.org/cron', '@update-settings' => url('admin/reports/updates/settings'))) . '</dd>';
+      // Only explain the Update manager if it has not been disabled.
+      if (update_manager_access()) {
+        $output .= '<dt>' . t('Performing updates through the user interface') . '</dt>';
+        $output .= '<dd>' . t('The Update manager module allows administrators to perform updates directly through the administration interface. At the top of the <a href="@modules_page">modules</a> and <a href="@themes_page">themes</a> pages you will see a link to update to new releases. This will direct you to the <a href="@update-page">update page</a> where you see a listing of all the missing updates and confirm which ones you want to upgrade. From there, you are prompted for your FTP/SSH password, which then transfers the files into your Drupal installation, overwriting your old files. More detailed instructions can be found in the <a href="@update">online handbook</a>.', array('@modules_page' => url('admin/modules'), '@themes_page' => url('admin/appearance'),  '@update-page' => url('admin/reports/updates/update'), '@update' => 'http://drupal.org/documentation/modules/update')) . '</dd>';
+        $output .= '<dt>' . t('Installing new modules and themes through the user interface') . '</dt>';
+        $output .= '<dd>' . t('You can also install new modules and themes in the same fashion, through the <a href="@install">install page</a>, or by clicking the <em>Install new module/theme</em> link at the top of the <a href="@modules_page">modules</a> and <a href="@themes_page">themes</a> pages. In this case, you are prompted to provide either the URL to the download, or to upload a packaged release file from your local computer.', array('@modules_page' => url('admin/modules'), '@themes_page' => url('admin/appearance'), '@install' => url('admin/reports/updates/install'))) . '</dd>';
+      }
+      $output .= '</dl>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_init().
+ */
+function update_init() {
+  if (arg(0) == 'admin' && user_access('administer site configuration')) {
+    switch ($_GET['q']) {
+      // These pages don't need additional nagging.
+      case 'admin/appearance/update':
+      case 'admin/appearance/install':
+      case 'admin/modules/update':
+      case 'admin/modules/install':
+      case 'admin/reports/updates':
+      case 'admin/reports/updates/update':
+      case 'admin/reports/updates/install':
+      case 'admin/reports/updates/settings':
+      case 'admin/reports/status':
+      case 'admin/update/ready':
+        return;
+
+      // If we are on the appearance or modules list, display a detailed report
+      // of the update status.
+      case 'admin/appearance':
+      case 'admin/modules':
+        $verbose = TRUE;
+        break;
+
+    }
+    module_load_install('update');
+    $status = update_requirements('runtime');
+    foreach (array('core', 'contrib') as $report_type) {
+      $type = 'update_' . $report_type;
+      if (!empty($verbose)) {
+        if (isset($status[$type]['severity'])) {
+          if ($status[$type]['severity'] == REQUIREMENT_ERROR) {
+            drupal_set_message($status[$type]['description'], 'error', FALSE);
+          }
+          elseif ($status[$type]['severity'] == REQUIREMENT_WARNING) {
+            drupal_set_message($status[$type]['description'], 'warning', FALSE);
+          }
+        }
+      }
+      // Otherwise, if we're on *any* admin page and there's a security
+      // update missing, print an error message about it.
+      else {
+        if (isset($status[$type])
+            && isset($status[$type]['reason'])
+            && $status[$type]['reason'] === UPDATE_NOT_SECURE) {
+          drupal_set_message($status[$type]['description'], 'error', FALSE);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_menu().
+ */
+function update_menu() {
+  $items = array();
+
+  $items['admin/reports/updates'] = array(
+    'title' => 'Available updates',
+    'description' => 'Get a status report about available updates for your installed modules and themes.',
+    'page callback' => 'update_status',
+    'access arguments' => array('administer site configuration'),
+    'weight' => -50,
+    'file' => 'update.report.inc',
+  );
+  $items['admin/reports/updates/list'] = array(
+    'title' => 'List',
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $items['admin/reports/updates/settings'] = array(
+    'title' => 'Settings',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('update_settings'),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'update.settings.inc',
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 50,
+  );
+  $items['admin/reports/updates/check'] = array(
+    'title' => 'Manual update check',
+    'page callback' => 'update_manual_status',
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_CALLBACK,
+    'file' => 'update.fetch.inc',
+  );
+
+  // We want action links for updating projects at a few different locations:
+  // both the module and theme administration pages, and on the available
+  // updates report itself. The menu items will be mostly identical, except the
+  // paths and titles, so we just define them in a loop. We pass in a string
+  // indicating what context we're entering the action from, so that can
+  // customize the appearance as needed.
+  $paths = array(
+    'report' => 'admin/reports/updates',
+    'module' => 'admin/modules',
+    'theme' => 'admin/appearance',
+  );
+  foreach ($paths as $context => $path) {
+    $items[$path . '/install'] = array(
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('update_manager_install_form', $context),
+      'access callback' => 'update_manager_access',
+      'access arguments' => array(),
+      'weight' => 25,
+      'type' => MENU_LOCAL_ACTION,
+      'file' => 'update.manager.inc',
+    );
+    $items[$path . '/update'] = array(
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('update_manager_update_form', $context),
+      'access callback' => 'update_manager_access',
+      'access arguments' => array(),
+      'weight' => 10,
+      'title' => 'Update',
+      'type' => MENU_LOCAL_TASK,
+      'file' => 'update.manager.inc',
+    );
+  }
+  // Customize the titles of the action links depending on where they appear.
+  // We use += array() to let the translation extractor find these menu titles.
+  $items['admin/reports/updates/install'] += array('title' => 'Install new module or theme');
+  $items['admin/modules/install'] += array('title' => 'Install new module');
+  $items['admin/appearance/install'] += array('title' => 'Install new theme');
+
+  // Menu callback used for the confirmation page after all the releases
+  // have been downloaded, asking you to backup before installing updates.
+  $items['admin/update/ready'] = array(
+    'title' => 'Ready to update',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('update_manager_update_ready_form'),
+    'access callback' => 'update_manager_access',
+    'access arguments' => array(),
+    'type' => MENU_CALLBACK,
+    'file' => 'update.manager.inc',
+  );
+
+  return $items;
+}
+
+/**
+ * Access callback: Resolves if the current user can access updater menu items.
+ *
+ * It both enforces the 'administer software updates' permission and the global
+ * kill switch for the authorize.php script.
+ *
+ * @return
+ *   TRUE if the current user can access the updater menu items; FALSE
+ *   otherwise.
+ *
+ * @see update_menu()
+ */
+function update_manager_access() {
+  return variable_get('allow_authorize_operations', TRUE) && user_access('administer software updates');
+}
+
+/**
+ * Implements hook_theme().
+ */
+function update_theme() {
+  return array(
+    'update_manager_update_form' => array(
+      'render element' => 'form',
+      'file' => 'update.manager.inc',
+    ),
+    'update_last_check' => array(
+      'variables' => array('last' => NULL),
+    ),
+    'update_report' => array(
+      'variables' => array('data' => NULL),
+    ),
+    'update_version' => array(
+      'variables' => array('version' => NULL, 'tag' => NULL, 'class' => array()),
+    ),
+    'update_status_label' => array(
+      'variables' => array('status' => NULL),
+    ),
+  );
+}
+
+/**
+ * Implements hook_cron().
+ */
+function update_cron() {
+  $frequency = variable_get('update_check_frequency', 1);
+  $interval = 60 * 60 * 24 * $frequency;
+  if ((REQUEST_TIME - variable_get('update_last_check', 0)) > $interval) {
+    // If the configured update interval has elapsed, we want to invalidate
+    // the cached data for all projects, attempt to re-fetch, and trigger any
+    // configured notifications about the new status.
+    update_refresh();
+    update_fetch_data();
+  }
+  else {
+    // Otherwise, see if any individual projects are now stale or still
+    // missing data, and if so, try to fetch the data.
+    update_get_available(TRUE);
+  }
+  if ((REQUEST_TIME - variable_get('update_last_email_notification', 0)) > $interval) {
+    // If configured time between notifications elapsed, send email about
+    // updates possibly available.
+    module_load_include('inc', 'update', 'update.fetch');
+    _update_cron_notify();
+  }
+
+  // Clear garbage from disk.
+  update_clear_update_disk_cache();
+}
+
+/**
+ * Implements hook_themes_enabled().
+ *
+ * If themes are enabled, we invalidate the cache of available updates.
+ */
+function update_themes_enabled($themes) {
+  // Clear all update module caches.
+  _update_cache_clear();
+}
+
+/**
+ * Implements hook_themes_disabled().
+ *
+ * If themes are disabled, we invalidate the cache of available updates.
+ */
+function update_themes_disabled($themes) {
+  // Clear all update module caches.
+  _update_cache_clear();
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter() for system_modules().
+ *
+ * Adds a form submission handler to the system modules form, so that if a site
+ * admin saves the form, we invalidate the cache of available updates.
+ *
+ * @see _update_cache_clear()
+ */
+function update_form_system_modules_alter(&$form, $form_state) {
+  $form['#submit'][] = 'update_cache_clear_submit';
+}
+
+/**
+ * Form submission handler for system_modules().
+ *
+ * @see update_form_system_modules_alter()
+ */
+function update_cache_clear_submit($form, &$form_state) {
+  // Clear all update module caches.
+  _update_cache_clear();
+}
+
+/**
+ * Returns a warning message when there is no data about available updates.
+ */
+function _update_no_data() {
+  $destination = drupal_get_destination();
+  return t('No update information available. <a href="@run_cron">Run cron</a> or <a href="@check_manually">check manually</a>.', array(
+    '@run_cron' => url('admin/reports/status/run-cron', array('query' => $destination)),
+    '@check_manually' => url('admin/reports/updates/check', array('query' => $destination)),
+  ));
+}
+
+/**
+ * Tries to get update information from cache and refreshes it when necessary.
+ *
+ * In addition to checking the cache lifetime, this function also ensures that
+ * there are no .info files for enabled modules or themes that have a newer
+ * modification timestamp than the last time we checked for available update
+ * data. If any .info file was modified, it almost certainly means a new version
+ * of something was installed. Without fresh available update data, the logic in
+ * update_calculate_project_data() will be wrong and produce confusing, bogus
+ * results.
+ *
+ * @param $refresh
+ *   (optional) Boolean to indicate if this method should refresh the cache
+ *   automatically if there's no data. Defaults to FALSE.
+ *
+ * @return
+ *   Array of data about available releases, keyed by project shortname.
+ *
+ * @see update_refresh()
+ * @see update_get_projects()
+ */
+function update_get_available($refresh = FALSE) {
+  module_load_include('inc', 'update', 'update.compare');
+  $needs_refresh = FALSE;
+
+  // Grab whatever data we currently have cached in the DB.
+  $available = _update_get_cached_available_releases();
+  $num_avail = count($available);
+
+  $projects = update_get_projects();
+  foreach ($projects as $key => $project) {
+    // If there's no data at all, we clearly need to fetch some.
+    if (empty($available[$key])) {
+      update_create_fetch_task($project);
+      $needs_refresh = TRUE;
+      continue;
+    }
+
+    // See if the .info file is newer than the last time we checked for data,
+    // and if so, mark this project's data as needing to be re-fetched. Any
+    // time an admin upgrades their local installation, the .info file will
+    // be changed, so this is the only way we can be sure we're not showing
+    // bogus information right after they upgrade.
+    if ($project['info']['_info_file_ctime'] > $available[$key]['last_fetch']) {
+      $available[$key]['fetch_status'] = UPDATE_FETCH_PENDING;
+    }
+
+    // If we have project data but no release data, we need to fetch. This
+    // can be triggered when we fail to contact a release history server.
+    if (empty($available[$key]['releases'])) {
+      $available[$key]['fetch_status'] = UPDATE_FETCH_PENDING;
+    }
+
+    // If we think this project needs to fetch, actually create the task now
+    // and remember that we think we're missing some data.
+    if (!empty($available[$key]['fetch_status']) && $available[$key]['fetch_status'] == UPDATE_FETCH_PENDING) {
+      update_create_fetch_task($project);
+      $needs_refresh = TRUE;
+    }
+  }
+
+  if ($needs_refresh && $refresh) {
+    // Attempt to drain the queue of fetch tasks.
+    update_fetch_data();
+    // After processing the queue, we've (hopefully) got better data, so pull
+    // the latest from the cache again and use that directly.
+    $available = _update_get_cached_available_releases();
+  }
+
+  return $available;
+}
+
+/**
+ * Creates a new fetch task after loading the necessary include file.
+ *
+ * @param $project
+ *   Associative array of information about a project. See update_get_projects()
+ *   for the keys used.
+ *
+ * @see _update_create_fetch_task()
+ */
+function update_create_fetch_task($project) {
+  module_load_include('inc', 'update', 'update.fetch');
+  return _update_create_fetch_task($project);
+}
+
+/**
+ * Refreshes the release data after loading the necessary include file.
+ *
+ * @see _update_refresh()
+ */
+function update_refresh() {
+  module_load_include('inc', 'update', 'update.fetch');
+  return _update_refresh();
+}
+
+/**
+ * Attempts to fetch update data after loading the necessary include file.
+ *
+ * @see _update_fetch_data()
+ */
+function update_fetch_data() {
+  module_load_include('inc', 'update', 'update.fetch');
+  return _update_fetch_data();
+}
+
+/**
+ * Returns all currently cached data about available releases for all projects.
+ *
+ * @return
+ *   Array of data about available releases, keyed by project shortname.
+ */
+function _update_get_cached_available_releases() {
+  $data = array();
+  $cache_items = _update_get_cache_multiple('available_releases');
+  foreach ($cache_items as $cid => $cache) {
+    $cache->data['last_fetch'] = $cache->created;
+    if ($cache->expire < REQUEST_TIME) {
+      $cache->data['fetch_status'] = UPDATE_FETCH_PENDING;
+    }
+    // The project shortname is embedded in the cache ID, even if there's no
+    // data for this project in the DB at all, so use that for the indexes in
+    // the array.
+    $parts = explode('::', $cid, 2);
+    $data[$parts[1]] = $cache->data;
+  }
+  return $data;
+}
+
+/**
+ * Implements hook_mail().
+ *
+ * Constructs the e-mail notification message when the site is out of date.
+ *
+ * @param $key
+ *   Unique key to indicate what message to build, always 'status_notify'.
+ * @param $message
+ *   Reference to the message array being built.
+ * @param $params
+ *   Array of parameters to indicate what kind of text to include in the message
+ *   body. This is a keyed array of message type ('core' or 'contrib') as the
+ *   keys, and the status reason constant (UPDATE_NOT_SECURE, etc) for the
+ *   values.
+ *
+ * @see drupal_mail()
+ * @see _update_cron_notify()
+ * @see _update_message_text()
+ */
+function update_mail($key, &$message, $params) {
+  $language = $message['language'];
+  $langcode = $language->language;
+  $message['subject'] .= t('New release(s) available for !site_name', array('!site_name' => variable_get('site_name', 'Drupal')), array('langcode' => $langcode));
+  foreach ($params as $msg_type => $msg_reason) {
+    $message['body'][] = _update_message_text($msg_type, $msg_reason, FALSE, $language);
+  }
+  $message['body'][] = t('See the available updates page for more information:', array(), array('langcode' => $langcode)) . "\n" . url('admin/reports/updates', array('absolute' => TRUE, 'language' => $language));
+  if (update_manager_access()) {
+    $message['body'][] = t('You can automatically install your missing updates using the Update manager:', array(), array('langcode' => $langcode)) . "\n" . url('admin/reports/updates/update', array('absolute' => TRUE, 'language' => $language));
+  }
+  $settings_url = url('admin/reports/updates/settings', array('absolute' => TRUE));
+  if (variable_get('update_notification_threshold', 'all') == 'all') {
+    $message['body'][] = t('Your site is currently configured to send these emails when any updates are available. To get notified only for security updates, !url.', array('!url' => $settings_url));
+  }
+  else {
+    $message['body'][] = t('Your site is currently configured to send these emails only when security updates are available. To get notified for any available updates, !url.', array('!url' => $settings_url));
+  }
+}
+
+/**
+ * Returns the appropriate message text when site is out of date or not secure.
+ *
+ * These error messages are shared by both update_requirements() for the
+ * site-wide status report at admin/reports/status and in the body of the
+ * notification e-mail messages generated by update_cron().
+ *
+ * @param $msg_type
+ *   String to indicate what kind of message to generate. Can be either 'core'
+ *   or 'contrib'.
+ * @param $msg_reason
+ *   Integer constant specifying why message is generated.
+ * @param $report_link
+ *   (optional) Boolean that controls if a link to the updates report should be
+ *   added. Defaults to FALSE.
+ * @param $language
+ *   (optional) A language object to use. Defaults to NULL.
+ *
+ * @return
+ *   The properly translated error message for the given key.
+ */
+function _update_message_text($msg_type, $msg_reason, $report_link = FALSE, $language = NULL) {
+  $langcode = isset($language) ? $language->language : NULL;
+  $text = '';
+  switch ($msg_reason) {
+    case UPDATE_NOT_SECURE:
+      if ($msg_type == 'core') {
+        $text = t('There is a security update available for your version of Drupal. To ensure the security of your server, you should update immediately!', array(), array('langcode' => $langcode));
+      }
+      else {
+        $text = t('There are security updates available for one or more of your modules or themes. To ensure the security of your server, you should update immediately!', array(), array('langcode' => $langcode));
+      }
+      break;
+
+    case UPDATE_REVOKED:
+      if ($msg_type == 'core') {
+        $text = t('Your version of Drupal has been revoked and is no longer available for download. Upgrading is strongly recommended!', array(), array('langcode' => $langcode));
+      }
+      else {
+        $text = t('The installed version of at least one of your modules or themes has been revoked and is no longer available for download. Upgrading or disabling is strongly recommended!', array(), array('langcode' => $langcode));
+      }
+      break;
+
+    case UPDATE_NOT_SUPPORTED:
+      if ($msg_type == 'core') {
+        $text = t('Your version of Drupal is no longer supported. Upgrading is strongly recommended!', array(), array('langcode' => $langcode));
+      }
+      else {
+        $text = t('The installed version of at least one of your modules or themes is no longer supported. Upgrading or disabling is strongly recommended. See the project homepage for more details.', array(), array('langcode' => $langcode));
+      }
+      break;
+
+    case UPDATE_NOT_CURRENT:
+      if ($msg_type == 'core') {
+        $text = t('There are updates available for your version of Drupal. To ensure the proper functioning of your site, you should update as soon as possible.', array(), array('langcode' => $langcode));
+      }
+      else {
+        $text = t('There are updates available for one or more of your modules or themes. To ensure the proper functioning of your site, you should update as soon as possible.', array(), array('langcode' => $langcode));
+      }
+      break;
+
+    case UPDATE_UNKNOWN:
+    case UPDATE_NOT_CHECKED:
+    case UPDATE_NOT_FETCHED:
+    case UPDATE_FETCH_PENDING:
+      if ($msg_type == 'core') {
+        $text = t('There was a problem checking <a href="@update-report">available updates</a> for Drupal.', array('@update-report' => url('admin/reports/updates')), array('langcode' => $langcode));
+      }
+      else {
+        $text = t('There was a problem checking <a href="@update-report">available updates</a> for your modules or themes.', array('@update-report' => url('admin/reports/updates')), array('langcode' => $langcode));
+      }
+      break;
+  }
+
+  if ($report_link) {
+    if (update_manager_access()) {
+      $text .= ' ' . t('See the <a href="@available_updates">available updates</a> page for more information and to install your missing updates.', array('@available_updates' => url('admin/reports/updates/update', array('language' => $language))), array('langcode' => $langcode));
+    }
+    else {
+      $text .= ' ' . t('See the <a href="@available_updates">available updates</a> page for more information.', array('@available_updates' => url('admin/reports/updates', array('language' => $language))), array('langcode' => $langcode));
+    }
+  }
+
+  return $text;
+}
+
+/**
+ * Orders projects based on their status.
+ *
+ * Callback for uasort() within update_requirements().
+ */
+function _update_project_status_sort($a, $b) {
+  // The status constants are numerically in the right order, so we can
+  // usually subtract the two to compare in the order we want. However,
+  // negative status values should be treated as if they are huge, since we
+  // always want them at the bottom of the list.
+  $a_status = $a['status'] > 0 ? $a['status'] : (-10 * $a['status']);
+  $b_status = $b['status'] > 0 ? $b['status'] : (-10 * $b['status']);
+  return $a_status - $b_status;
+}
+
+/**
+ * Returns HTML for the last time we checked for update data.
+ *
+ * In addition to properly formatting the given timestamp, this function also
+ * provides a "Check manually" link that refreshes the available update and
+ * redirects back to the same page.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - last: The timestamp when the site last checked for available updates.
+ *
+ * @see theme_update_report()
+ * @see theme_update_available_updates_form()
+ * @ingroup themeable
+ */
+function theme_update_last_check($variables) {
+  $last = $variables['last'];
+  $output = '<div class="update checked">';
+  $output .= $last ? t('Last checked: @time ago', array('@time' => format_interval(REQUEST_TIME - $last))) : t('Last checked: never');
+  $output .= ' <span class="check-manually">(' . l(t('Check manually'), 'admin/reports/updates/check', array('query' => drupal_get_destination())) . ')</span>';
+  $output .= "</div>\n";
+  return $output;
+}
+
+/**
+ * Implements hook_verify_update_archive().
+ *
+ * First, we ensure that the archive isn't a copy of Drupal core, which the
+ * update manager does not yet support. See http://drupal.org/node/606592
+ *
+ * Then, we make sure that at least one module included in the archive file has
+ * an .info file which claims that the code is compatible with the current
+ * version of Drupal core.
+ *
+ * @see drupal_system_listing()
+ * @see _system_rebuild_module_data()
+ */
+function update_verify_update_archive($project, $archive_file, $directory) {
+  $errors = array();
+
+  // Make sure this isn't a tarball of Drupal core.
+  if (
+    file_exists("$directory/$project/index.php")
+    && file_exists("$directory/$project/update.php")
+    && file_exists("$directory/$project/includes/bootstrap.inc")
+    && file_exists("$directory/$project/modules/node/node.module")
+    && file_exists("$directory/$project/modules/system/system.module")
+  ) {
+    return array(
+      'no-core' => t('Automatic updating of Drupal core is not supported. See the <a href="@upgrade-guide">upgrade guide</a> for information on how to update Drupal core manually.', array('@upgrade-guide' => 'http://drupal.org/upgrade')),
+    );
+  }
+
+  // Parse all the .info files and make sure at least one is compatible with
+  // this version of Drupal core. If one is compatible, then the project as a
+  // whole is considered compatible (since, for example, the project may ship
+  // with some out-of-date modules that are not necessary for its overall
+  // functionality).
+  $compatible_project = FALSE;
+  $incompatible = array();
+  $files = file_scan_directory("$directory/$project", '/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.info$/', array('key' => 'name', 'min_depth' => 0));
+  foreach ($files as $key => $file) {
+    // Get the .info file for the module or theme this file belongs to.
+    $info = drupal_parse_info_file($file->uri);
+
+    // If the module or theme is incompatible with Drupal core, set an error.
+    if (empty($info['core']) || $info['core'] != DRUPAL_CORE_COMPATIBILITY) {
+      $incompatible[] = !empty($info['name']) ? $info['name'] : t('Unknown');
+    }
+    else {
+      $compatible_project = TRUE;
+      break;
+    }
+  }
+
+  if (empty($files)) {
+    $errors[] = t('%archive_file does not contain any .info files.', array('%archive_file' => drupal_basename($archive_file)));
+  }
+  elseif (!$compatible_project) {
+    $errors[] = format_plural(
+      count($incompatible),
+      '%archive_file contains a version of %names that is not compatible with Drupal !version.',
+      '%archive_file contains versions of modules or themes that are not compatible with Drupal !version: %names',
+      array('!version' => DRUPAL_CORE_COMPATIBILITY, '%archive_file' => drupal_basename($archive_file), '%names' => implode(', ', $incompatible))
+    );
+  }
+
+  return $errors;
+}
+
+/**
+ * @defgroup update_status_cache Private update status cache system
+ * @{
+ * Functions to manage the update status cache.
+ *
+ * We specifically do NOT use the core cache API for saving the fetched data
+ * about available updates. It is vitally important that this cache is only
+ * cleared when we're populating it after successfully fetching new available
+ * update data. Usage of the core cache API results in all sorts of potential
+ * problems that would result in attempting to fetch available update data all
+ * the time, including if a site has a "minimum cache lifetime" (which is both a
+ * minimum and a maximum) defined, or if a site uses memcache or another
+ * pluggable cache system that assumes volatile caches.
+ *
+ * The Update Manager module still uses the {cache_update} table, but instead of
+ * using cache_set(), cache_get(), and cache_clear_all(), there are private
+ * helper functions that implement these same basic tasks but ensure that the
+ * cache is not prematurely cleared, and that the data is always stored in the
+ * database, even if memcache or another cache backend is in use.
+ */
+
+/**
+ * Stores data in the private update status cache table.
+ *
+ * @param $cid
+ *   The cache ID to save the data with.
+ * @param $data
+ *   The data to store.
+ * @param $expire
+ *   One of the following values:
+ *   - CACHE_PERMANENT: Indicates that the item should never be removed except
+ *     by explicitly using _update_cache_clear().
+ *   - A Unix timestamp: Indicates that the item should be kept at least until
+ *     the given time, after which it will be invalidated.
+ *
+ * @see _update_cache_get()
+ */
+function _update_cache_set($cid, $data, $expire) {
+  $fields = array(
+    'created' => REQUEST_TIME,
+    'expire' => $expire,
+  );
+  if (!is_string($data)) {
+    $fields['data'] = serialize($data);
+    $fields['serialized'] = 1;
+  }
+  else {
+    $fields['data'] = $data;
+    $fields['serialized'] = 0;
+  }
+  db_merge('cache_update')
+    ->key(array('cid' => $cid))
+    ->fields($fields)
+    ->execute();
+}
+
+/**
+ * Retrieves data from the private update status cache table.
+ *
+ * @param $cid
+ *   The cache ID to retrieve.
+ *
+ * @return
+ *   An array of data for the given cache ID, or NULL if the ID was not found.
+ *
+ * @see _update_cache_set()
+ */
+function _update_cache_get($cid) {
+  $cache = db_query("SELECT data, created, expire, serialized FROM {cache_update} WHERE cid = :cid", array(':cid' => $cid))->fetchObject();
+  if (isset($cache->data)) {
+    if ($cache->serialized) {
+      $cache->data = unserialize($cache->data);
+    }
+  }
+  return $cache;
+}
+
+/**
+ * Returns an array of cache items with a given cache ID prefix.
+ *
+ * @param string $cid_prefix
+ *   The cache ID prefix.
+ *
+ * @return
+ *   Associative array of cache items, keyed by cache ID.
+ */
+function _update_get_cache_multiple($cid_prefix) {
+  $data = array();
+  $result = db_select('cache_update')
+    ->fields('cache_update', array('cid', 'data', 'created', 'expire', 'serialized'))
+    ->condition('cache_update.cid', $cid_prefix . '::%', 'LIKE')
+    ->execute();
+  foreach ($result as $cache) {
+    if ($cache) {
+      if ($cache->serialized) {
+        $cache->data = unserialize($cache->data);
+      }
+      $data[$cache->cid] = $cache;
+    }
+  }
+  return $data;
+}
+
+/**
+ * Invalidates cached data relating to update status.
+ *
+ * @param $cid
+ *   (optional) Cache ID of the record to clear from the private update module
+ *   cache. If empty, all records will be cleared from the table except fetch
+ *   tasks. Defaults to NULL.
+ * @param $wildcard
+ *   (optional) If TRUE, cache IDs starting with $cid are deleted in addition to
+ *   the exact cache ID specified by $cid. Defaults to FALSE.
+ */
+function _update_cache_clear($cid = NULL, $wildcard = FALSE) {
+  if (empty($cid)) {
+    db_delete('cache_update')
+      // Clear everything except fetch task information because these are used
+      // to ensure that the fetch task queue items are not added multiple times.
+      ->condition('cid', 'fetch_task::%', 'NOT LIKE')
+      ->execute();
+  }
+  else {
+    $query = db_delete('cache_update');
+    if ($wildcard) {
+      $query->condition('cid', $cid . '%', 'LIKE');
+    }
+    else {
+      $query->condition('cid', $cid);
+    }
+    $query->execute();
+  }
+}
+
+/**
+ * Implements hook_flush_caches().
+ *
+ * Called from update.php (among others) to flush the caches. Since we're
+ * running update.php, we are likely to install a new version of something, in
+ * which case, we want to check for available update data again. However,
+ * because we have our own caching system, we need to directly clear the
+ * database table ourselves at this point and return nothing, for example, on
+ * sites that use memcache where cache_clear_all() won't know how to purge this
+ * data.
+ *
+ * However, we only want to do this from update.php, since otherwise, we'd lose
+ * all the available update data on every cron run. So, we specifically check if
+ * the site is in MAINTENANCE_MODE == 'update' (which indicates update.php is
+ * running, not update module... alas for overloaded names).
+ */
+function update_flush_caches() {
+  if (defined('MAINTENANCE_MODE') && MAINTENANCE_MODE == 'update') {
+    _update_cache_clear();
+  }
+  return array();
+}
+
+/**
+ * @} End of "defgroup update_status_cache".
+ */
+
+/**
+ * Returns a short unique identifier for this Drupal installation.
+ *
+ * @return
+ *   An eight character string uniquely identifying this Drupal installation.
+ */
+function _update_manager_unique_identifier() {
+  $id = &drupal_static(__FUNCTION__, '');
+  if (empty($id)) {
+    $id = substr(hash('sha256', drupal_get_hash_salt()), 0, 8);
+  }
+  return $id;
+}
+
+/**
+ * Returns the directory where update archive files should be extracted.
+ *
+ * @param $create
+ *   (optional) Whether to attempt to create the directory if it does not
+ *   already exist. Defaults to TRUE.
+ *
+ * @return
+ *   The full path to the temporary directory where update file archives should
+ *   be extracted.
+ */
+function _update_manager_extract_directory($create = TRUE) {
+  $directory = &drupal_static(__FUNCTION__, '');
+  if (empty($directory)) {
+    $directory = 'temporary://update-extraction-' . _update_manager_unique_identifier();
+    if ($create && !file_exists($directory)) {
+      mkdir($directory);
+    }
+  }
+  return $directory;
+}
+
+/**
+ * Returns the directory where update archive files should be cached.
+ *
+ * @param $create
+ *   (optional) Whether to attempt to create the directory if it does not
+ *   already exist. Defaults to TRUE.
+ *
+ * @return
+ *   The full path to the temporary directory where update file archives should
+ *   be cached.
+ */
+function _update_manager_cache_directory($create = TRUE) {
+  $directory = &drupal_static(__FUNCTION__, '');
+  if (empty($directory)) {
+    $directory = 'temporary://update-cache-' . _update_manager_unique_identifier();
+    if ($create && !file_exists($directory)) {
+      mkdir($directory);
+    }
+  }
+  return $directory;
+}
+
+/**
+ * Clears the temporary files and directories based on file age from disk.
+ */
+function update_clear_update_disk_cache() {
+  // List of update module cache directories. Do not create the directories if
+  // they do not exist.
+  $directories = array(
+    _update_manager_cache_directory(FALSE),
+    _update_manager_extract_directory(FALSE),
+  );
+
+  // Search for files and directories in base folder only without recursion.
+  foreach ($directories as $directory) {
+    file_scan_directory($directory, '/.*/', array('callback' => 'update_delete_file_if_stale', 'recurse' => FALSE));
+  }
+}
+
+/**
+ * Deletes stale files and directories from the update manager disk cache.
+ *
+ * Files and directories older than 6 hours and development snapshots older than
+ * 5 minutes are considered stale. We only cache development snapshots for 5
+ * minutes since otherwise updated snapshots might not be downloaded as
+ * expected.
+ *
+ * When checking file ages, we need to use the ctime, not the mtime
+ * (modification time) since many (all?) tar implementations go out of their way
+ * to set the mtime on the files they create to the timestamps recorded in the
+ * tarball. We want to see the last time the file was changed on disk, which is
+ * left alone by tar and correctly set to the time the archive file was
+ * unpacked.
+ *
+ * @param $path
+ *   A string containing a file path or (streamwrapper) URI.
+ */
+function update_delete_file_if_stale($path) {
+  if (file_exists($path)) {
+    $filectime = filectime($path);
+    if (REQUEST_TIME - $filectime > DRUPAL_MAXIMUM_TEMP_FILE_AGE || (preg_match('/.*-dev\.(tar\.gz|zip)/i', $path) && REQUEST_TIME - $filectime > 300)) {
+      file_unmanaged_delete_recursive($path);
+    }
+  }
+}
diff --git a/htmltest/modules/update/update.report.inc b/htmltest/modules/update/update.report.inc
new file mode 100644
index 00000000..f256575f
--- /dev/null
+++ b/htmltest/modules/update/update.report.inc
@@ -0,0 +1,327 @@
+<?php
+
+/**
+ * @file
+ * Code required only when rendering the available updates report.
+ */
+
+/**
+ * Page callback: Generates a page about the update status of projects.
+ *
+ * @see update_menu()
+ */
+function update_status() {
+  if ($available = update_get_available(TRUE)) {
+    module_load_include('inc', 'update', 'update.compare');
+    $data = update_calculate_project_data($available);
+    return theme('update_report', array('data' => $data));
+  }
+  else {
+    return theme('update_report', array('data' => _update_no_data()));
+  }
+}
+
+/**
+ * Returns HTML for the project status report.
+ *
+ * @param array $variables
+ *   An associative array containing:
+ *   - data: An array of data about each project's status.
+ *
+ * @ingroup themeable
+ */
+function theme_update_report($variables) {
+  $data = $variables['data'];
+
+  $last = variable_get('update_last_check', 0);
+  $output = theme('update_last_check', array('last' => $last));
+
+  if (!is_array($data)) {
+    $output .= '<p>' . $data . '</p>';
+    return $output;
+  }
+
+  $header = array();
+  $rows = array();
+
+  $notification_level = variable_get('update_notification_threshold', 'all');
+
+  // Create an array of status values keyed by module or theme name, since
+  // we'll need this while generating the report if we have to cross reference
+  // anything (e.g. subthemes which have base themes missing an update).
+  foreach ($data as $project) {
+    foreach ($project['includes'] as $key => $name) {
+      $status[$key] = $project['status'];
+    }
+  }
+
+  foreach ($data as $project) {
+    switch ($project['status']) {
+      case UPDATE_CURRENT:
+        $class = 'ok';
+        $icon = theme('image', array('path' => 'misc/watchdog-ok.png', 'width' => 18, 'height' => 18, 'alt' => t('ok'), 'title' => t('ok')));
+        break;
+      case UPDATE_UNKNOWN:
+      case UPDATE_FETCH_PENDING:
+      case UPDATE_NOT_FETCHED:
+        $class = 'unknown';
+        $icon = theme('image', array('path' => 'misc/watchdog-warning.png', 'width' => 18, 'height' => 18, 'alt' => t('warning'), 'title' => t('warning')));
+        break;
+      case UPDATE_NOT_SECURE:
+      case UPDATE_REVOKED:
+      case UPDATE_NOT_SUPPORTED:
+        $class = 'error';
+        $icon = theme('image', array('path' => 'misc/watchdog-error.png', 'width' => 18, 'height' => 18, 'alt' => t('error'), 'title' => t('error')));
+        break;
+      case UPDATE_NOT_CHECKED:
+      case UPDATE_NOT_CURRENT:
+      default:
+        $class = 'warning';
+        $icon = theme('image', array('path' => 'misc/watchdog-warning.png', 'width' => 18, 'height' => 18, 'alt' => t('warning'), 'title' => t('warning')));
+        break;
+    }
+
+    $row = '<div class="version-status">';
+    $status_label = theme('update_status_label', array('status' => $project['status']));
+    $row .= !empty($status_label) ? $status_label : check_plain($project['reason']);
+    $row .= '<span class="icon">' . $icon . '</span>';
+    $row .= "</div>\n";
+
+    $row .= '<div class="project">';
+    if (isset($project['title'])) {
+      if (isset($project['link'])) {
+        $row .= l($project['title'], $project['link']);
+      }
+      else {
+        $row .= check_plain($project['title']);
+      }
+    }
+    else {
+      $row .= check_plain($project['name']);
+    }
+    $row .= ' ' . check_plain($project['existing_version']);
+    if ($project['install_type'] == 'dev' && !empty($project['datestamp'])) {
+      $row .= ' <span class="version-date">(' . format_date($project['datestamp'], 'custom', 'Y-M-d') . ')</span>';
+    }
+    $row .= "</div>\n";
+
+    $versions_inner = '';
+    $security_class = array();
+    $version_class = array();
+    if (isset($project['recommended'])) {
+      if ($project['status'] != UPDATE_CURRENT || $project['existing_version'] !== $project['recommended']) {
+
+        // First, figure out what to recommend.
+        // If there's only 1 security update and it has the same version we're
+        // recommending, give it the same CSS class as if it was recommended,
+        // but don't print out a separate "Recommended" line for this project.
+        if (!empty($project['security updates']) && count($project['security updates']) == 1 && $project['security updates'][0]['version'] === $project['recommended']) {
+          $security_class[] = 'version-recommended';
+          $security_class[] = 'version-recommended-strong';
+        }
+        else {
+          $version_class[] = 'version-recommended';
+          // Apply an extra class if we're displaying both a recommended
+          // version and anything else for an extra visual hint.
+          if ($project['recommended'] !== $project['latest_version']
+              || !empty($project['also'])
+              || ($project['install_type'] == 'dev'
+                && isset($project['dev_version'])
+                && $project['latest_version'] !== $project['dev_version']
+                && $project['recommended'] !== $project['dev_version'])
+              || (isset($project['security updates'][0])
+                && $project['recommended'] !== $project['security updates'][0])
+              ) {
+            $version_class[] = 'version-recommended-strong';
+          }
+          $versions_inner .= theme('update_version', array('version' => $project['releases'][$project['recommended']], 'tag' => t('Recommended version:'), 'class' => $version_class));
+        }
+
+        // Now, print any security updates.
+        if (!empty($project['security updates'])) {
+          $security_class[] = 'version-security';
+          foreach ($project['security updates'] as $security_update) {
+            $versions_inner .= theme('update_version', array('version' => $security_update, 'tag' => t('Security update:'), 'class' => $security_class));
+          }
+        }
+      }
+
+      if ($project['recommended'] !== $project['latest_version']) {
+        $versions_inner .= theme('update_version', array('version' => $project['releases'][$project['latest_version']], 'tag' => t('Latest version:'), 'class' => array('version-latest')));
+      }
+      if ($project['install_type'] == 'dev'
+          && $project['status'] != UPDATE_CURRENT
+          && isset($project['dev_version'])
+          && $project['recommended'] !== $project['dev_version']) {
+        $versions_inner .= theme('update_version', array('version' => $project['releases'][$project['dev_version']], 'tag' => t('Development version:'), 'class' => array('version-latest')));
+      }
+    }
+
+    if (isset($project['also'])) {
+      foreach ($project['also'] as $also) {
+        $versions_inner .= theme('update_version', array('version' => $project['releases'][$also], 'tag' => t('Also available:'), 'class' => array('version-also-available')));
+      }
+    }
+
+    if (!empty($versions_inner)) {
+      $row .= "<div class=\"versions\">\n" . $versions_inner . "</div>\n";
+    }
+    $row .= "<div class=\"info\">\n";
+    if (!empty($project['extra'])) {
+      $row .= '<div class="extra">' . "\n";
+      foreach ($project['extra'] as $key => $value) {
+        $row .= '<div class="' . implode(' ', $value['class']) . '">';
+        $row .= check_plain($value['label']) . ': ';
+        $row .= drupal_placeholder($value['data']);
+        $row .= "</div>\n";
+      }
+      $row .= "</div>\n";  // extra div.
+    }
+
+    $row .= '<div class="includes">';
+    sort($project['includes']);
+    if (!empty($project['disabled'])) {
+      sort($project['disabled']);
+      // Make sure we start with a clean slate for each project in the report.
+      $includes_items = array();
+      $row .= t('Includes:');
+      $includes_items[] = t('Enabled: %includes', array('%includes' => implode(', ', $project['includes'])));
+      $includes_items[] = t('Disabled: %disabled', array('%disabled' => implode(', ', $project['disabled'])));
+      $row .= theme('item_list', array('items' => $includes_items));
+    }
+    else {
+      $row .= t('Includes: %includes', array('%includes' => implode(', ', $project['includes'])));
+    }
+    $row .= "</div>\n";
+
+    if (!empty($project['base_themes'])) {
+      $row .= '<div class="basethemes">';
+      asort($project['base_themes']);
+      $base_themes = array();
+      foreach ($project['base_themes'] as $base_key => $base_theme) {
+        switch ($status[$base_key]) {
+          case UPDATE_NOT_SECURE:
+          case UPDATE_REVOKED:
+          case UPDATE_NOT_SUPPORTED:
+            $base_themes[] = t('%base_theme (!base_label)', array('%base_theme' => $base_theme, '!base_label' => theme('update_status_label', array('status' => $status[$base_key]))));
+            break;
+
+          default:
+            $base_themes[] = drupal_placeholder($base_theme);
+        }
+      }
+      $row .= t('Depends on: !basethemes', array('!basethemes' => implode(', ', $base_themes)));
+      $row .= "</div>\n";
+    }
+
+    if (!empty($project['sub_themes'])) {
+      $row .= '<div class="subthemes">';
+      sort($project['sub_themes']);
+      $row .= t('Required by: %subthemes', array('%subthemes' => implode(', ', $project['sub_themes'])));
+      $row .= "</div>\n";
+    }
+
+    $row .= "</div>\n"; // info div.
+
+    if (!isset($rows[$project['project_type']])) {
+      $rows[$project['project_type']] = array();
+    }
+    $row_key = isset($project['title']) ? drupal_strtolower($project['title']) : drupal_strtolower($project['name']);
+    $rows[$project['project_type']][$row_key] = array(
+      'class' => array($class),
+      'data' => array($row),
+    );
+  }
+
+  $project_types = array(
+    'core' => t('Drupal core'),
+    'module' => t('Modules'),
+    'theme' => t('Themes'),
+    'module-disabled' => t('Disabled modules'),
+    'theme-disabled' => t('Disabled themes'),
+  );
+  foreach ($project_types as $type_name => $type_label) {
+    if (!empty($rows[$type_name])) {
+      ksort($rows[$type_name]);
+      $output .= "\n<h3>" . $type_label . "</h3>\n";
+      $output .= theme('table', array('header' => $header, 'rows' => $rows[$type_name], 'attributes' => array('class' => array('update'))));
+    }
+  }
+  drupal_add_css(drupal_get_path('module', 'update') . '/update.css');
+  return $output;
+}
+
+/**
+ * Returns HTML for a label to display for a project's update status.
+ *
+ * @param array $variables
+ *   An associative array containing:
+ *   - status: The integer code for a project's current update status.
+ *
+ * @see update_calculate_project_data()
+ * @ingroup themeable
+ */
+function theme_update_status_label($variables) {
+  switch ($variables['status']) {
+    case UPDATE_NOT_SECURE:
+      return '<span class="security-error">' . t('Security update required!') . '</span>';
+
+    case UPDATE_REVOKED:
+      return '<span class="revoked">' . t('Revoked!') . '</span>';
+
+    case UPDATE_NOT_SUPPORTED:
+      return '<span class="not-supported">' . t('Not supported!') . '</span>';
+
+    case UPDATE_NOT_CURRENT:
+      return '<span class="not-current">' . t('Update available') . '</span>';
+
+    case UPDATE_CURRENT:
+      return '<span class="current">' . t('Up to date') . '</span>';
+
+  }
+}
+
+/**
+ * Returns HTML for the version display of a project.
+ *
+ * @param array $variables
+ *   An associative array containing:
+ *   - version: An array of data about the latest released version, containing:
+ *     - version: The version number.
+ *     - release_link: The URL for the release notes.
+ *     - date: The date of the release.
+ *     - download_link: The URL for the downloadable file.
+ *   - tag: The title of the project.
+ *   - class: A string containing extra classes for the wrapping table.
+ *
+ * @ingroup themeable
+ */
+function theme_update_version($variables) {
+  $version = $variables['version'];
+  $tag = $variables['tag'];
+  $class = implode(' ', $variables['class']);
+
+  $output = '';
+  $output .= '<table class="version ' . $class . '">';
+  $output .= '<tr>';
+  $output .= '<td class="version-title">' . $tag . "</td>\n";
+  $output .= '<td class="version-details">';
+  $output .= l($version['version'], $version['release_link']);
+  $output .= ' <span class="version-date">(' . format_date($version['date'], 'custom', 'Y-M-d') . ')</span>';
+  $output .= "</td>\n";
+  $output .= '<td class="version-links">';
+  $links = array();
+  $links['update-download'] = array(
+    'title' => t('Download'),
+    'href' => $version['download_link'],
+  );
+  $links['update-release-notes'] = array(
+    'title' => t('Release notes'),
+    'href' => $version['release_link'],
+  );
+  $output .= theme('links__update_version', array('links' => $links));
+  $output .= '</td>';
+  $output .= '</tr>';
+  $output .= "</table>\n";
+  return $output;
+}
diff --git a/htmltest/modules/update/update.settings.inc b/htmltest/modules/update/update.settings.inc
new file mode 100644
index 00000000..5cd24149
--- /dev/null
+++ b/htmltest/modules/update/update.settings.inc
@@ -0,0 +1,128 @@
+<?php
+
+/**
+ * @file
+ * Code required only for the update status settings form.
+ */
+
+/**
+ * Form constructor for the update settings form.
+ *
+ * @see update_settings_validate()
+ * @see update_settings_submit()
+ * @ingroup forms
+ */
+function update_settings($form) {
+  $form['update_check_frequency'] = array(
+    '#type' => 'radios',
+    '#title' => t('Check for updates'),
+    '#default_value' => variable_get('update_check_frequency', 1),
+    '#options' => array(
+      '1' => t('Daily'),
+      '7' => t('Weekly'),
+    ),
+    '#description' => t('Select how frequently you want to automatically check for new releases of your currently installed modules and themes.'),
+  );
+
+  $form['update_check_disabled'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Check for updates of disabled modules and themes'),
+    '#default_value' => variable_get('update_check_disabled', FALSE),
+  );
+
+  $notify_emails = variable_get('update_notify_emails', array());
+  $form['update_notify_emails'] = array(
+    '#type' => 'textarea',
+    '#title' => t('E-mail addresses to notify when updates are available'),
+    '#rows' => 4,
+    '#default_value' => implode("\n", $notify_emails),
+    '#description' => t('Whenever your site checks for available updates and finds new releases, it can notify a list of users via e-mail. Put each address on a separate line. If blank, no e-mails will be sent.'),
+  );
+
+  $form['update_notification_threshold'] = array(
+    '#type' => 'radios',
+    '#title' => t('E-mail notification threshold'),
+    '#default_value' => variable_get('update_notification_threshold', 'all'),
+    '#options' => array(
+      'all' => t('All newer versions'),
+      'security' => t('Only security updates'),
+    ),
+    '#description' => t('You can choose to send e-mail only if a security update is available, or to be notified about all newer versions. If there are updates available of Drupal core or any of your installed modules and themes, your site will always print a message on the <a href="@status_report">status report</a> page, and will also display an error message on administration pages if there is a security update.', array('@status_report' => url('admin/reports/status')))
+  );
+
+  $form = system_settings_form($form);
+  // Custom validation callback for the email notification setting.
+  $form['#validate'][] = 'update_settings_validate';
+  // We need to call our own submit callback first, not the one from
+  // system_settings_form(), so that we can process and save the emails.
+  unset($form['#submit']);
+
+  return $form;
+}
+
+/**
+ * Form validation handler for update_settings().
+ *
+ * Validates the e-mail addresses and ensures the field is formatted correctly.
+ *
+ * @see update_settings_submit()
+ */
+function update_settings_validate($form, &$form_state) {
+  if (!empty($form_state['values']['update_notify_emails'])) {
+    $valid = array();
+    $invalid = array();
+    foreach (explode("\n", trim($form_state['values']['update_notify_emails'])) as $email) {
+      $email = trim($email);
+      if (!empty($email)) {
+        if (valid_email_address($email)) {
+          $valid[] = $email;
+        }
+        else {
+          $invalid[] = $email;
+        }
+      }
+    }
+    if (empty($invalid)) {
+      $form_state['notify_emails'] = $valid;
+    }
+    elseif (count($invalid) == 1) {
+      form_set_error('update_notify_emails', t('%email is not a valid e-mail address.', array('%email' => reset($invalid))));
+    }
+    else {
+      form_set_error('update_notify_emails', t('%emails are not valid e-mail addresses.', array('%emails' => implode(', ', $invalid))));
+    }
+  }
+}
+
+/**
+ * Form submission handler for update_settings().
+ *
+ * Also invalidates the cache of available updates if the "Check for updates of
+ * disabled modules and themes" setting is being changed. The available updates
+ * report needs to refetch available update data after this setting changes or
+ * it would show misleading things (e.g., listing the disabled projects on the
+ * site with the "No available releases found" warning).
+ *
+ * @see update_settings_validate()
+ */
+function update_settings_submit($form, $form_state) {
+  $op = $form_state['values']['op'];
+
+  if (empty($form_state['notify_emails'])) {
+    variable_del('update_notify_emails');
+  }
+  else {
+    variable_set('update_notify_emails', $form_state['notify_emails']);
+  }
+  unset($form_state['notify_emails']);
+  unset($form_state['values']['update_notify_emails']);
+
+  // See if the update_check_disabled setting is being changed, and if so,
+  // invalidate all cached update status data.
+  $check_disabled = variable_get('update_check_disabled', FALSE);
+  if ($form_state['values']['update_check_disabled'] != $check_disabled) {
+    _update_cache_clear();
+  }
+
+  system_settings_form_submit($form, $form_state);
+}
diff --git a/htmltest/modules/update/update.test b/htmltest/modules/update/update.test
new file mode 100644
index 00000000..9e04cdae
--- /dev/null
+++ b/htmltest/modules/update/update.test
@@ -0,0 +1,803 @@
+<?php
+
+/**
+ * @file
+ * This file contains tests for the Update Manager module.
+ *
+ * The overarching methodology of these tests is we need to compare a given
+ * state of installed modules and themes (e.g., version, project grouping,
+ * timestamps, etc) against a current state of what the release history XML
+ * files we fetch say is available. We have dummy XML files (in the
+ * modules/update/tests directory) that describe various scenarios of what's
+ * available for different test projects, and we have dummy .info file data
+ * (specified via hook_system_info_alter() in the update_test helper module)
+ * describing what's currently installed. Each test case defines a set of
+ * projects to install, their current state (via the 'update_test_system_info'
+ * variable) and the desired available update data (via the
+ * 'update_test_xml_map' variable), and then performs a series of assertions
+ * that the report matches our expectations given the specific initial state and
+ * availability scenario.
+ */
+
+/**
+ * Defines some shared functions used by all update tests.
+ */
+class UpdateTestHelper extends DrupalWebTestCase {
+
+  /**
+   * Refreshes the update status based on the desired available update scenario.
+   *
+   * @param $xml_map
+   *   Array that maps project names to availability scenarios to fetch. The key
+   *   '#all' is used if a project-specific mapping is not defined.
+   * @param $url
+   *   (optional) A string containing the URL to fetch update data from.
+   *   Defaults to 'update-test'.
+   *
+   * @see update_test_mock_page()
+   */
+  protected function refreshUpdateStatus($xml_map, $url = 'update-test') {
+    // Tell the Update Manager module to fetch from the URL provided by
+    // update_test module.
+    variable_set('update_fetch_url', url($url, array('absolute' => TRUE)));
+    // Save the map for update_test_mock_page() to use.
+    variable_set('update_test_xml_map', $xml_map);
+    // Manually check the update status.
+    $this->drupalGet('admin/reports/updates/check');
+  }
+
+  /**
+   * Runs a series of assertions that are applicable to all update statuses.
+   */
+  protected function standardTests() {
+    $this->assertRaw('<h3>' . t('Drupal core') . '</h3>');
+    $this->assertRaw(l(t('Drupal'), 'http://example.com/project/drupal'), 'Link to the Drupal project appears.');
+    $this->assertNoText(t('No available releases found'));
+  }
+
+}
+
+/**
+ * Tests behavior related to discovering and listing updates to Drupal core.
+ */
+class UpdateCoreTestCase extends UpdateTestHelper {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Update core functionality',
+      'description' => 'Tests the Update Manager module through a series of functional tests using mock XML data.',
+      'group' => 'Update',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('update_test', 'update');
+    $admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer modules'));
+    $this->drupalLogin($admin_user);
+  }
+
+  /**
+   * Tests the Update Manager module when no updates are available.
+   */
+  function testNoUpdatesAvailable() {
+    $this->setSystemInfo7_0();
+    $this->refreshUpdateStatus(array('drupal' => '0'));
+    $this->standardTests();
+    $this->assertText(t('Up to date'));
+    $this->assertNoText(t('Update available'));
+    $this->assertNoText(t('Security update required!'));
+  }
+
+  /**
+   * Tests the Update Manager module when one normal update is available.
+   */
+  function testNormalUpdateAvailable() {
+    $this->setSystemInfo7_0();
+    $this->refreshUpdateStatus(array('drupal' => '1'));
+    $this->standardTests();
+    $this->assertNoText(t('Up to date'));
+    $this->assertText(t('Update available'));
+    $this->assertNoText(t('Security update required!'));
+    $this->assertRaw(l('7.1', 'http://example.com/drupal-7-1-release'), 'Link to release appears.');
+    $this->assertRaw(l(t('Download'), 'http://example.com/drupal-7-1.tar.gz'), 'Link to download appears.');
+    $this->assertRaw(l(t('Release notes'), 'http://example.com/drupal-7-1-release'), 'Link to release notes appears.');
+  }
+
+  /**
+   * Tests the Update Manager module when a security update is available.
+   */
+  function testSecurityUpdateAvailable() {
+    $this->setSystemInfo7_0();
+    $this->refreshUpdateStatus(array('drupal' => '2-sec'));
+    $this->standardTests();
+    $this->assertNoText(t('Up to date'));
+    $this->assertNoText(t('Update available'));
+    $this->assertText(t('Security update required!'));
+    $this->assertRaw(l('7.2', 'http://example.com/drupal-7-2-release'), 'Link to release appears.');
+    $this->assertRaw(l(t('Download'), 'http://example.com/drupal-7-2.tar.gz'), 'Link to download appears.');
+    $this->assertRaw(l(t('Release notes'), 'http://example.com/drupal-7-2-release'), 'Link to release notes appears.');
+  }
+
+  /**
+   * Ensures proper results where there are date mismatches among modules.
+   */
+  function testDatestampMismatch() {
+    $system_info = array(
+      '#all' => array(
+        // We need to think we're running a -dev snapshot to see dates.
+        'version' => '7.0-dev',
+        'datestamp' => time(),
+      ),
+      'block' => array(
+        // This is 2001-09-09 01:46:40 GMT, so test for "2001-Sep-".
+        'datestamp' => '1000000000',
+      ),
+    );
+    variable_set('update_test_system_info', $system_info);
+    $this->refreshUpdateStatus(array('drupal' => 'dev'));
+    $this->assertNoText(t('2001-Sep-'));
+    $this->assertText(t('Up to date'));
+    $this->assertNoText(t('Update available'));
+    $this->assertNoText(t('Security update required!'));
+  }
+
+  /**
+   * Checks that running cron updates the list of available updates.
+   */
+  function testModulePageRunCron() {
+    $this->setSystemInfo7_0();
+    variable_set('update_fetch_url', url('update-test', array('absolute' => TRUE)));
+    variable_set('update_test_xml_map', array('drupal' => '0'));
+
+    $this->cronRun();
+    $this->drupalGet('admin/modules');
+    $this->assertNoText(t('No update information available.'));
+  }
+
+  /**
+   * Checks the messages at admin/modules when the site is up to date.
+   */
+  function testModulePageUpToDate() {
+    $this->setSystemInfo7_0();
+    // Instead of using refreshUpdateStatus(), set these manually.
+    variable_set('update_fetch_url', url('update-test', array('absolute' => TRUE)));
+    variable_set('update_test_xml_map', array('drupal' => '0'));
+
+    $this->drupalGet('admin/reports/updates');
+    $this->clickLink(t('Check manually'));
+    $this->assertText(t('Checked available update data for one project.'));
+    $this->drupalGet('admin/modules');
+    $this->assertNoText(t('There are updates available for your version of Drupal.'));
+    $this->assertNoText(t('There is a security update available for your version of Drupal.'));
+  }
+
+  /**
+   * Checks the messages at admin/modules when an update is missing.
+   */
+  function testModulePageRegularUpdate() {
+    $this->setSystemInfo7_0();
+    // Instead of using refreshUpdateStatus(), set these manually.
+    variable_set('update_fetch_url', url('update-test', array('absolute' => TRUE)));
+    variable_set('update_test_xml_map', array('drupal' => '1'));
+
+    $this->drupalGet('admin/reports/updates');
+    $this->clickLink(t('Check manually'));
+    $this->assertText(t('Checked available update data for one project.'));
+    $this->drupalGet('admin/modules');
+    $this->assertText(t('There are updates available for your version of Drupal.'));
+    $this->assertNoText(t('There is a security update available for your version of Drupal.'));
+  }
+
+  /**
+   * Checks the messages at admin/modules when a security update is missing.
+   */
+  function testModulePageSecurityUpdate() {
+    $this->setSystemInfo7_0();
+    // Instead of using refreshUpdateStatus(), set these manually.
+    variable_set('update_fetch_url', url('update-test', array('absolute' => TRUE)));
+    variable_set('update_test_xml_map', array('drupal' => '2-sec'));
+
+    $this->drupalGet('admin/reports/updates');
+    $this->clickLink(t('Check manually'));
+    $this->assertText(t('Checked available update data for one project.'));
+    $this->drupalGet('admin/modules');
+    $this->assertNoText(t('There are updates available for your version of Drupal.'));
+    $this->assertText(t('There is a security update available for your version of Drupal.'));
+
+    // Make sure admin/appearance warns you you're missing a security update.
+    $this->drupalGet('admin/appearance');
+    $this->assertNoText(t('There are updates available for your version of Drupal.'));
+    $this->assertText(t('There is a security update available for your version of Drupal.'));
+
+    // Make sure duplicate messages don't appear on Update status pages.
+    $this->drupalGet('admin/reports/status');
+    // We're expecting "There is a security update..." inside the status report
+    // itself, but the drupal_set_message() appears as an li so we can prefix
+    // with that and search for the raw HTML.
+    $this->assertNoRaw('<li>' . t('There is a security update available for your version of Drupal.'));
+
+    $this->drupalGet('admin/reports/updates');
+    $this->assertNoText(t('There is a security update available for your version of Drupal.'));
+
+    $this->drupalGet('admin/reports/updates/settings');
+    $this->assertNoText(t('There is a security update available for your version of Drupal.'));
+  }
+
+  /**
+   * Tests the Update Manager module when the update server returns 503 errors.
+   */
+  function testServiceUnavailable() {
+    $this->refreshUpdateStatus(array(), '503-error');
+    // Ensure that no "Warning: SimpleXMLElement..." parse errors are found.
+    $this->assertNoText('SimpleXMLElement');
+    $this->assertUniqueText(t('Failed to get available update data for one project.'));
+  }
+
+  /**
+   * Tests that exactly one fetch task per project is created and not more.
+   */
+  function testFetchTasks() {
+    $projecta = array(
+      'name' => 'aaa_update_test',
+    );
+    $projectb = array(
+      'name' => 'bbb_update_test',
+    );
+    $queue = DrupalQueue::get('update_fetch_tasks');
+    $this->assertEqual($queue->numberOfItems(), 0, 'Queue is empty');
+    update_create_fetch_task($projecta);
+    $this->assertEqual($queue->numberOfItems(), 1, 'Queue contains one item');
+    update_create_fetch_task($projectb);
+    $this->assertEqual($queue->numberOfItems(), 2, 'Queue contains two items');
+    // Try to add project a again.
+    update_create_fetch_task($projecta);
+    $this->assertEqual($queue->numberOfItems(), 2, 'Queue still contains two items');
+
+    // Clear cache and try again.
+    _update_cache_clear();
+    drupal_static_reset('_update_create_fetch_task');
+    update_create_fetch_task($projecta);
+    $this->assertEqual($queue->numberOfItems(), 2, 'Queue contains two items');
+  }
+
+  /**
+   * Sets the version to 7.0 when no project-specific mapping is defined.
+   */
+  protected function setSystemInfo7_0() {
+    $setting = array(
+      '#all' => array(
+        'version' => '7.0',
+      ),
+    );
+    variable_set('update_test_system_info', $setting);
+  }
+
+}
+
+/**
+ * Tests behavior related to handling updates to contributed modules and themes.
+ */
+class UpdateTestContribCase extends UpdateTestHelper {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Update contrib functionality',
+      'description' => 'Tests how the Update Manager module handles contributed modules and themes in a series of functional tests using mock XML data.',
+      'group' => 'Update',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('update_test', 'update', 'aaa_update_test', 'bbb_update_test', 'ccc_update_test');
+    $admin_user = $this->drupalCreateUser(array('administer site configuration'));
+    $this->drupalLogin($admin_user);
+  }
+
+  /**
+   * Tests when there is no available release data for a contrib module.
+   */
+  function testNoReleasesAvailable() {
+    $system_info = array(
+      '#all' => array(
+        'version' => '7.0',
+      ),
+      'aaa_update_test' => array(
+        'project' => 'aaa_update_test',
+        'version' => '7.x-1.0',
+        'hidden' => FALSE,
+      ),
+    );
+    variable_set('update_test_system_info', $system_info);
+    $this->refreshUpdateStatus(array('drupal' => '0', 'aaa_update_test' => 'no-releases'));
+    $this->drupalGet('admin/reports/updates');
+    // Cannot use $this->standardTests() because we need to check for the
+    // 'No available releases found' string.
+    $this->assertRaw('<h3>' . t('Drupal core') . '</h3>');
+    $this->assertRaw(l(t('Drupal'), 'http://example.com/project/drupal'));
+    $this->assertText(t('Up to date'));
+    $this->assertRaw('<h3>' . t('Modules') . '</h3>');
+    $this->assertNoText(t('Update available'));
+    $this->assertText(t('No available releases found'));
+    $this->assertNoRaw(l(t('AAA Update test'), 'http://example.com/project/aaa_update_test'));
+  }
+
+  /**
+   * Tests the basic functionality of a contrib module on the status report.
+   */
+  function testUpdateContribBasic() {
+    $system_info = array(
+      '#all' => array(
+        'version' => '7.0',
+      ),
+      'aaa_update_test' => array(
+        'project' => 'aaa_update_test',
+        'version' => '7.x-1.0',
+        'hidden' => FALSE,
+      ),
+    );
+    variable_set('update_test_system_info', $system_info);
+    $this->refreshUpdateStatus(
+      array(
+        'drupal' => '0',
+        'aaa_update_test' => '1_0',
+      )
+    );
+    $this->standardTests();
+    $this->assertText(t('Up to date'));
+    $this->assertRaw('<h3>' . t('Modules') . '</h3>');
+    $this->assertNoText(t('Update available'));
+    $this->assertRaw(l(t('AAA Update test'), 'http://example.com/project/aaa_update_test'), 'Link to aaa_update_test project appears.');
+  }
+
+  /**
+   * Tests that contrib projects are ordered by project name.
+   *
+   * If a project contains multiple modules, we want to make sure that the
+   * available updates report is sorted by the parent project names, not by the
+   * names of the modules included in each project. In this test case, we have
+   * two contrib projects, "BBB Update test" and "CCC Update test". However, we
+   * have a module called "aaa_update_test" that's part of the "CCC Update test"
+   * project. We need to make sure that we see the "BBB" project before the
+   * "CCC" project, even though "CCC" includes a module that's processed first
+   * if you sort alphabetically by module name (which is the order we see things
+   * inside system_rebuild_module_data() for example).
+   */
+  function testUpdateContribOrder() {
+    // We want core to be version 7.0.
+    $system_info = array(
+      '#all' => array(
+        'version' => '7.0',
+      ),
+      // All the rest should be visible as contrib modules at version 7.x-1.0.
+
+      // aaa_update_test needs to be part of the "CCC Update test" project,
+      // which would throw off the report if we weren't properly sorting by
+      // the project names.
+      'aaa_update_test' => array(
+        'project' => 'ccc_update_test',
+        'version' => '7.x-1.0',
+        'hidden' => FALSE,
+      ),
+
+      // This should be its own project, and listed first on the report.
+      'bbb_update_test' => array(
+        'project' => 'bbb_update_test',
+        'version' => '7.x-1.0',
+        'hidden' => FALSE,
+      ),
+
+      // This will contain both aaa_update_test and ccc_update_test, and
+      // should come after the bbb_update_test project.
+      'ccc_update_test' => array(
+        'project' => 'ccc_update_test',
+        'version' => '7.x-1.0',
+        'hidden' => FALSE,
+      ),
+    );
+    variable_set('update_test_system_info', $system_info);
+    $this->refreshUpdateStatus(array('drupal' => '0', '#all' => '1_0'));
+    $this->standardTests();
+    // We're expecting the report to say all projects are up to date.
+    $this->assertText(t('Up to date'));
+    $this->assertNoText(t('Update available'));
+    // We want to see all 3 module names listed, since they'll show up either
+    // as project names or as modules under the "Includes" listing.
+    $this->assertText(t('AAA Update test'));
+    $this->assertText(t('BBB Update test'));
+    $this->assertText(t('CCC Update test'));
+    // We want aaa_update_test included in the ccc_update_test project, not as
+    // its own project on the report.
+    $this->assertNoRaw(l(t('AAA Update test'), 'http://example.com/project/aaa_update_test'), 'Link to aaa_update_test project does not appear.');
+    // The other two should be listed as projects.
+    $this->assertRaw(l(t('BBB Update test'), 'http://example.com/project/bbb_update_test'), 'Link to bbb_update_test project appears.');
+    $this->assertRaw(l(t('CCC Update test'), 'http://example.com/project/ccc_update_test'), 'Link to bbb_update_test project appears.');
+
+    // We want to make sure we see the BBB project before the CCC project.
+    // Instead of just searching for 'BBB Update test' or something, we want
+    // to use the full markup that starts the project entry itself, so that
+    // we're really testing that the project listings are in the right order.
+    $bbb_project_link = '<div class="project"><a href="http://example.com/project/bbb_update_test">BBB Update test</a>';
+    $ccc_project_link = '<div class="project"><a href="http://example.com/project/ccc_update_test">CCC Update test</a>';
+    $this->assertTrue(strpos($this->drupalGetContent(), $bbb_project_link) < strpos($this->drupalGetContent(), $ccc_project_link), "'BBB Update test' project is listed before the 'CCC Update test' project");
+  }
+
+  /**
+   * Tests that subthemes are notified about security updates for base themes.
+   */
+  function testUpdateBaseThemeSecurityUpdate() {
+    // Only enable the subtheme, not the base theme.
+    db_update('system')
+      ->fields(array('status' => 1))
+      ->condition('type', 'theme')
+      ->condition('name', 'update_test_subtheme')
+      ->execute();
+
+    // Define the initial state for core and the subtheme.
+    $system_info = array(
+      // We want core to be version 7.0.
+      '#all' => array(
+        'version' => '7.0',
+      ),
+      // Show the update_test_basetheme
+      'update_test_basetheme' => array(
+        'project' => 'update_test_basetheme',
+        'version' => '7.x-1.0',
+        'hidden' => FALSE,
+      ),
+      // Show the update_test_subtheme
+      'update_test_subtheme' => array(
+        'project' => 'update_test_subtheme',
+        'version' => '7.x-1.0',
+        'hidden' => FALSE,
+      ),
+    );
+    variable_set('update_test_system_info', $system_info);
+    $xml_mapping = array(
+      'drupal' => '0',
+      'update_test_subtheme' => '1_0',
+      'update_test_basetheme' => '1_1-sec',
+    );
+    $this->refreshUpdateStatus($xml_mapping);
+    $this->assertText(t('Security update required!'));
+    $this->assertRaw(l(t('Update test base theme'), 'http://example.com/project/update_test_basetheme'), 'Link to the Update test base theme project appears.');
+  }
+
+  /**
+   * Tests that disabled themes are only shown when desired.
+   */
+  function testUpdateShowDisabledThemes() {
+    // Make sure all the update_test_* themes are disabled.
+    db_update('system')
+      ->fields(array('status' => 0))
+      ->condition('type', 'theme')
+      ->condition('name', 'update_test_%', 'LIKE')
+      ->execute();
+
+    // Define the initial state for core and the test contrib themes.
+    $system_info = array(
+      // We want core to be version 7.0.
+      '#all' => array(
+        'version' => '7.0',
+      ),
+      // The update_test_basetheme should be visible and up to date.
+      'update_test_basetheme' => array(
+        'project' => 'update_test_basetheme',
+        'version' => '7.x-1.1',
+        'hidden' => FALSE,
+      ),
+      // The update_test_subtheme should be visible and up to date.
+      'update_test_subtheme' => array(
+        'project' => 'update_test_subtheme',
+        'version' => '7.x-1.0',
+        'hidden' => FALSE,
+      ),
+    );
+    // When there are contributed modules in the site's file system, the
+    // total number of attempts made in the test may exceed the default value
+    // of update_max_fetch_attempts. Therefore this variable is set very high
+    // to avoid test failures in those cases.
+    variable_set('update_max_fetch_attempts', 99999);
+    variable_set('update_test_system_info', $system_info);
+    $xml_mapping = array(
+      'drupal' => '0',
+      'update_test_subtheme' => '1_0',
+      'update_test_basetheme' => '1_1-sec',
+    );
+    $base_theme_project_link = l(t('Update test base theme'), 'http://example.com/project/update_test_basetheme');
+    $sub_theme_project_link = l(t('Update test subtheme'), 'http://example.com/project/update_test_subtheme');
+    foreach (array(TRUE, FALSE) as $check_disabled) {
+      variable_set('update_check_disabled', $check_disabled);
+      $this->refreshUpdateStatus($xml_mapping);
+      // In neither case should we see the "Themes" heading for enabled themes.
+      $this->assertNoText(t('Themes'));
+      if ($check_disabled) {
+        $this->assertText(t('Disabled themes'));
+        $this->assertRaw($base_theme_project_link, 'Link to the Update test base theme project appears.');
+        $this->assertRaw($sub_theme_project_link, 'Link to the Update test subtheme project appears.');
+      }
+      else {
+        $this->assertNoText(t('Disabled themes'));
+        $this->assertNoRaw($base_theme_project_link, 'Link to the Update test base theme project does not appear.');
+        $this->assertNoRaw($sub_theme_project_link, 'Link to the Update test subtheme project does not appear.');
+      }
+    }
+  }
+
+  /**
+   * Makes sure that if we fetch from a broken URL, sane things happen.
+   */
+  function testUpdateBrokenFetchURL() {
+    $system_info = array(
+      '#all' => array(
+        'version' => '7.0',
+      ),
+      'aaa_update_test' => array(
+        'project' => 'aaa_update_test',
+        'version' => '7.x-1.0',
+        'hidden' => FALSE,
+      ),
+      'bbb_update_test' => array(
+        'project' => 'bbb_update_test',
+        'version' => '7.x-1.0',
+        'hidden' => FALSE,
+      ),
+      'ccc_update_test' => array(
+        'project' => 'ccc_update_test',
+        'version' => '7.x-1.0',
+        'hidden' => FALSE,
+      ),
+    );
+    variable_set('update_test_system_info', $system_info);
+
+    $xml_mapping = array(
+      'drupal' => '0',
+      'aaa_update_test' => '1_0',
+      'bbb_update_test' => 'does-not-exist',
+      'ccc_update_test' => '1_0',
+    );
+    $this->refreshUpdateStatus($xml_mapping);
+
+    $this->assertText(t('Up to date'));
+    // We're expecting the report to say most projects are up to date, so we
+    // hope that 'Up to date' is not unique.
+    $this->assertNoUniqueText(t('Up to date'));
+    // It should say we failed to get data, not that we're missing an update.
+    $this->assertNoText(t('Update available'));
+
+    // We need to check that this string is found as part of a project row,
+    // not just in the "Failed to get available update data for ..." message
+    // at the top of the page.
+    $this->assertRaw('<div class="version-status">' . t('Failed to get available update data'));
+
+    // We should see the output messages from fetching manually.
+    $this->assertUniqueText(t('Checked available update data for 3 projects.'));
+    $this->assertUniqueText(t('Failed to get available update data for one project.'));
+
+    // The other two should be listed as projects.
+    $this->assertRaw(l(t('AAA Update test'), 'http://example.com/project/aaa_update_test'), 'Link to aaa_update_test project appears.');
+    $this->assertNoRaw(l(t('BBB Update test'), 'http://example.com/project/bbb_update_test'), 'Link to bbb_update_test project does not appear.');
+    $this->assertRaw(l(t('CCC Update test'), 'http://example.com/project/ccc_update_test'), 'Link to bbb_update_test project appears.');
+  }
+
+  /**
+   * Checks that hook_update_status_alter() works to change a status.
+   *
+   * We provide the same external data as if aaa_update_test 7.x-1.0 were
+   * installed and that was the latest release. Then we use
+   * hook_update_status_alter() to try to mark this as missing a security
+   * update, then assert if we see the appropriate warnings on the right pages.
+   */
+  function testHookUpdateStatusAlter() {
+    variable_set('allow_authorize_operations', TRUE);
+    $update_admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer software updates'));
+    $this->drupalLogin($update_admin_user);
+
+    $system_info = array(
+      '#all' => array(
+        'version' => '7.0',
+      ),
+      'aaa_update_test' => array(
+        'project' => 'aaa_update_test',
+        'version' => '7.x-1.0',
+        'hidden' => FALSE,
+      ),
+    );
+    variable_set('update_test_system_info', $system_info);
+    $update_status = array(
+      'aaa_update_test' => array(
+        'status' => UPDATE_NOT_SECURE,
+      ),
+    );
+    variable_set('update_test_update_status', $update_status);
+    $this->refreshUpdateStatus(
+      array(
+        'drupal' => '0',
+        'aaa_update_test' => '1_0',
+      )
+    );
+    $this->drupalGet('admin/reports/updates');
+    $this->assertRaw('<h3>' . t('Modules') . '</h3>');
+    $this->assertText(t('Security update required!'));
+    $this->assertRaw(l(t('AAA Update test'), 'http://example.com/project/aaa_update_test'), 'Link to aaa_update_test project appears.');
+
+    // Visit the reports page again without the altering and make sure the
+    // status is back to normal.
+    variable_set('update_test_update_status', array());
+    $this->drupalGet('admin/reports/updates');
+    $this->assertRaw('<h3>' . t('Modules') . '</h3>');
+    $this->assertNoText(t('Security update required!'));
+    $this->assertRaw(l(t('AAA Update test'), 'http://example.com/project/aaa_update_test'), 'Link to aaa_update_test project appears.');
+
+    // Turn the altering back on and visit the Update manager UI.
+    variable_set('update_test_update_status', $update_status);
+    $this->drupalGet('admin/modules/update');
+    $this->assertText(t('Security update'));
+
+    // Turn the altering back off and visit the Update manager UI.
+    variable_set('update_test_update_status', array());
+    $this->drupalGet('admin/modules/update');
+    $this->assertNoText(t('Security update'));
+  }
+
+}
+
+/**
+ * Tests project upload and extract functionality.
+ */
+class UpdateTestUploadCase extends UpdateTestHelper {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Upload and extract module functionality',
+      'description' => 'Tests the Update Manager module\'s upload and extraction functionality.',
+      'group' => 'Update',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp('update', 'update_test');
+    variable_set('allow_authorize_operations', TRUE);
+    $admin_user = $this->drupalCreateUser(array('administer software updates', 'administer site configuration'));
+    $this->drupalLogin($admin_user);
+  }
+
+  /**
+   * Tests upload and extraction of a module.
+   */
+  public function testUploadModule() {
+    // Images are not valid archives, so get one and try to install it. We
+    // need an extra variable to store the result of drupalGetTestFiles()
+    // since reset() takes an argument by reference and passing in a constant
+    // emits a notice in strict mode.
+    $imageTestFiles = $this->drupalGetTestFiles('image');
+    $invalidArchiveFile = reset($imageTestFiles);
+    $edit = array(
+      'files[project_upload]' => $invalidArchiveFile->uri,
+    );
+    // This also checks that the correct archive extensions are allowed.
+    $this->drupalPost('admin/modules/install', $edit, t('Install'));
+    $this->assertText(t('Only files with the following extensions are allowed: @archive_extensions.', array('@archive_extensions' => archiver_get_extensions())),'Only valid archives can be uploaded.');
+
+    // Check to ensure an existing module can't be reinstalled. Also checks that
+    // the archive was extracted since we can't know if the module is already
+    // installed until after extraction.
+    $validArchiveFile = drupal_get_path('module', 'update') . '/tests/aaa_update_test.tar.gz';
+    $edit = array(
+      'files[project_upload]' => $validArchiveFile,
+    );
+    $this->drupalPost('admin/modules/install', $edit, t('Install'));
+    $this->assertText(t('@module_name is already installed.', array('@module_name' => 'AAA Update test')), 'Existing module was extracted and not reinstalled.');
+  }
+
+  /**
+   * Ensures that archiver extensions are properly merged in the UI.
+   */
+  function testFileNameExtensionMerging() {
+    $this->drupalGet('admin/modules/install');
+    // Make sure the bogus extension supported by update_test.module is there.
+    $this->assertPattern('/file extensions are supported:.*update-test-extension/', "Found 'update-test-extension' extension");
+    // Make sure it didn't clobber the first option from core.
+    $this->assertPattern('/file extensions are supported:.*tar/', "Found 'tar' extension");
+  }
+
+  /**
+   * Checks the messages on update manager pages when missing a security update.
+   */
+  function testUpdateManagerCoreSecurityUpdateMessages() {
+    $setting = array(
+      '#all' => array(
+        'version' => '7.0',
+      ),
+    );
+    variable_set('update_test_system_info', $setting);
+    variable_set('update_fetch_url', url('update-test', array('absolute' => TRUE)));
+    variable_set('update_test_xml_map', array('drupal' => '2-sec'));
+    // Initialize the update status.
+    $this->drupalGet('admin/reports/updates');
+
+    // Now, make sure none of the Update manager pages have duplicate messages
+    // about core missing a security update.
+
+    $this->drupalGet('admin/modules/install');
+    $this->assertNoText(t('There is a security update available for your version of Drupal.'));
+
+    $this->drupalGet('admin/modules/update');
+    $this->assertNoText(t('There is a security update available for your version of Drupal.'));
+
+    $this->drupalGet('admin/appearance/install');
+    $this->assertNoText(t('There is a security update available for your version of Drupal.'));
+
+    $this->drupalGet('admin/appearance/update');
+    $this->assertNoText(t('There is a security update available for your version of Drupal.'));
+
+    $this->drupalGet('admin/reports/updates/install');
+    $this->assertNoText(t('There is a security update available for your version of Drupal.'));
+
+    $this->drupalGet('admin/reports/updates/update');
+    $this->assertNoText(t('There is a security update available for your version of Drupal.'));
+
+    $this->drupalGet('admin/update/ready');
+    $this->assertNoText(t('There is a security update available for your version of Drupal.'));
+  }
+
+}
+
+/**
+ * Tests update functionality unrelated to the database.
+ */
+class UpdateCoreUnitTestCase extends DrupalUnitTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => "Unit tests",
+      'description' => 'Test update funcionality unrelated to the database.',
+      'group' => 'Update',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('update');
+    module_load_include('inc', 'update', 'update.fetch');
+  }
+
+  /**
+   * Tests that _update_build_fetch_url() builds the URL correctly.
+   */
+  function testUpdateBuildFetchUrl() {
+    //first test that we didn't break the trivial case
+    $project['name'] = 'update_test';
+    $project['project_type'] = '';
+    $project['info']['version'] = '';
+    $project['info']['project status url'] = 'http://www.example.com';
+    $project['includes'] = array('module1' => 'Module 1', 'module2' => 'Module 2');
+    $site_key = '';
+    $expected = 'http://www.example.com/' . $project['name'] . '/' . DRUPAL_CORE_COMPATIBILITY;
+    $url = _update_build_fetch_url($project, $site_key);
+    $this->assertEqual($url, $expected, "'$url' when no site_key provided should be '$expected'.");
+
+    //For disabled projects it shouldn't add the site key either.
+    $site_key = 'site_key';
+    $project['project_type'] = 'disabled';
+    $expected = 'http://www.example.com/' . $project['name'] . '/' . DRUPAL_CORE_COMPATIBILITY;
+    $url = _update_build_fetch_url($project, $site_key);
+    $this->assertEqual($url, $expected, "'$url' should be '$expected' for disabled projects.");
+
+    //for enabled projects, adding the site key
+    $project['project_type'] = '';
+    $expected = 'http://www.example.com/' . $project['name'] . '/' . DRUPAL_CORE_COMPATIBILITY;
+    $expected .= '?site_key=site_key';
+    $expected .= '&list=' . rawurlencode('module1,module2');
+    $url = _update_build_fetch_url($project, $site_key);
+    $this->assertEqual($url, $expected, "When site_key provided, '$url' should be '$expected'.");
+
+    // http://drupal.org/node/1481156 test incorrect logic when URL contains
+    // a question mark.
+    $project['info']['project status url'] = 'http://www.example.com/?project=';
+    $expected = 'http://www.example.com/?project=/' . $project['name'] . '/' . DRUPAL_CORE_COMPATIBILITY;
+    $expected .= '&site_key=site_key';
+    $expected .= '&list=' . rawurlencode('module1,module2');
+    $url = _update_build_fetch_url($project, $site_key);
+    $this->assertEqual($url, $expected, "When ? is present, '$url' should be '$expected'.");
+
+  }
+}
\ No newline at end of file
diff --git a/htmltest/modules/user/tests/user_form_test.info b/htmltest/modules/user/tests/user_form_test.info
new file mode 100644
index 00000000..eef5f522
--- /dev/null
+++ b/htmltest/modules/user/tests/user_form_test.info
@@ -0,0 +1,12 @@
+name = "User module form tests"
+description = "Support module for user form testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/user/tests/user_form_test.module b/htmltest/modules/user/tests/user_form_test.module
new file mode 100644
index 00000000..4e907f36
--- /dev/null
+++ b/htmltest/modules/user/tests/user_form_test.module
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * @file
+ * Dummy module implementing a form to test user password validation
+ */
+
+/**
+ * Implements hook_menu().
+ *
+ * Sets up a form that allows a user to validate password.
+ */
+function user_form_test_menu() {
+  $items = array();
+  $items['user_form_test_current_password/%user'] = array(
+    'title' => 'User form test for current password validation',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('user_form_test_current_password',1),
+    'access arguments' => array('administer users'),
+    'type' => MENU_SUGGESTED_ITEM,
+  );
+  return $items;
+}
+
+/**
+ * A test form for user_validate_current_pass().
+ */
+function user_form_test_current_password($form, &$form_state, $account) {
+  $account->user_form_test_field = '';
+  $form['#user'] = $account;
+
+  $form['user_form_test_field'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Test field'),
+    '#description' => t('A field that would require a correct password to change.'),
+    '#required' => TRUE,
+  );
+  
+  $form['current_pass'] = array(
+    '#type' => 'password',
+    '#title' => t('Current password'),
+    '#size' => 25,
+    '#description' => t('Enter your current password'),
+  );
+
+  $form['current_pass_required_values'] = array(
+    '#type' => 'value',
+    '#value' => array('user_form_test_field' => t('Test field')),
+  );
+
+  $form['#validate'][] = 'user_validate_current_pass';
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Test'),
+  );
+  return $form;
+}
+
+/**
+ * Submit function for the test form for user_validate_current_pass().
+ */
+function user_form_test_current_password_submit($form, &$form_state) {
+  drupal_set_message(t('The password has been validated and the form submitted successfully.'));
+}
diff --git a/htmltest/modules/user/user-picture.tpl.php b/htmltest/modules/user/user-picture.tpl.php
new file mode 100644
index 00000000..ee821878
--- /dev/null
+++ b/htmltest/modules/user/user-picture.tpl.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to present a picture configured for the
+ * user's account.
+ *
+ * Available variables:
+ * - $user_picture: Image set by the user or the site's default. Will be linked
+ *   depending on the viewer's permission to view the user's profile page.
+ * - $account: Array of account information. Potentially unsafe. Be sure to
+ *   check_plain() before use.
+ *
+ * @see template_preprocess_user_picture()
+ *
+ * @ingroup themeable
+ */
+?>
+<?php if ($user_picture): ?>
+  <div class="user-picture">
+    <?php print $user_picture; ?>
+  </div>
+<?php endif; ?>
diff --git a/htmltest/modules/user/user-profile-category.tpl.php b/htmltest/modules/user/user-profile-category.tpl.php
new file mode 100644
index 00000000..0a86c762
--- /dev/null
+++ b/htmltest/modules/user/user-profile-category.tpl.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to present profile categories (groups of
+ * profile items).
+ *
+ * Categories are defined when configuring user profile fields for the site.
+ * It can also be defined by modules. All profile items for a category will be
+ * output through the $profile_items variable.
+ *
+ * @see user-profile-item.tpl.php
+ *      where each profile item is rendered. It is implemented as a definition
+ *      list by default.
+ * @see user-profile.tpl.php
+ *      where all items and categories are collected and printed out.
+ *
+ * Available variables:
+ * - $title: Category title for the group of items.
+ * - $profile_items: All the items for the group rendered through
+ *   user-profile-item.tpl.php.
+ * - $attributes: HTML attributes. Usually renders classes.
+ *
+ * @see template_preprocess_user_profile_category()
+ */
+?>
+<?php if ($title): ?>
+  <h3><?php print $title; ?></h3>
+<?php endif; ?>
+
+<dl<?php print $attributes; ?>>
+  <?php print $profile_items; ?>
+</dl>
diff --git a/htmltest/modules/user/user-profile-item.tpl.php b/htmltest/modules/user/user-profile-item.tpl.php
new file mode 100644
index 00000000..042d43a8
--- /dev/null
+++ b/htmltest/modules/user/user-profile-item.tpl.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to present profile items (values from user
+ * account profile fields or modules).
+ *
+ * This template is used to loop through and render each field configured
+ * for the user's account. It can also be the data from modules. The output is
+ * grouped by categories.
+ *
+ * @see user-profile-category.tpl.php
+ *      for the parent markup. Implemented as a definition list by default.
+ * @see user-profile.tpl.php
+ *      where all items and categories are collected and printed out.
+ *
+ * Available variables:
+ * - $title: Field title for the profile item.
+ * - $value: User defined value for the profile item or data from a module.
+ * - $attributes: HTML attributes. Usually renders classes.
+ *
+ * @see template_preprocess_user_profile_item()
+ */
+?>
+<dt<?php print $attributes; ?>><?php print $title; ?></dt>
+<dd<?php print $attributes; ?>><?php print $value; ?></dd>
diff --git a/htmltest/modules/user/user-profile.tpl.php b/htmltest/modules/user/user-profile.tpl.php
new file mode 100644
index 00000000..0a64fed8
--- /dev/null
+++ b/htmltest/modules/user/user-profile.tpl.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to present all user profile data.
+ *
+ * This template is used when viewing a registered member's profile page,
+ * e.g., example.com/user/123. 123 being the users ID.
+ *
+ * Use render($user_profile) to print all profile items, or print a subset
+ * such as render($user_profile['user_picture']). Always call
+ * render($user_profile) at the end in order to print all remaining items. If
+ * the item is a category, it will contain all its profile items. By default,
+ * $user_profile['summary'] is provided, which contains data on the user's
+ * history. Other data can be included by modules. $user_profile['user_picture']
+ * is available for showing the account picture.
+ *
+ * Available variables:
+ *   - $user_profile: An array of profile items. Use render() to print them.
+ *   - Field variables: for each field instance attached to the user a
+ *     corresponding variable is defined; e.g., $account->field_example has a
+ *     variable $field_example defined. When needing to access a field's raw
+ *     values, developers/themers are strongly encouraged to use these
+ *     variables. Otherwise they will have to explicitly specify the desired
+ *     field language, e.g. $account->field_example['en'], thus overriding any
+ *     language negotiation rule that was previously applied.
+ *
+ * @see user-profile-category.tpl.php
+ *   Where the html is handled for the group.
+ * @see user-profile-item.tpl.php
+ *   Where the html is handled for each item in the group.
+ * @see template_preprocess_user_profile()
+ *
+ * @ingroup themeable
+ */
+?>
+<div class="profile"<?php print $attributes; ?>>
+  <?php print render($user_profile); ?>
+</div>
diff --git a/htmltest/modules/user/user-rtl.css b/htmltest/modules/user/user-rtl.css
new file mode 100644
index 00000000..642c9434
--- /dev/null
+++ b/htmltest/modules/user/user-rtl.css
@@ -0,0 +1,34 @@
+
+#permissions td.permission {
+  padding-left: 0;
+  padding-right: 1.5em;
+}
+
+#user-admin-roles .form-item-name {
+  float: right;
+  margin-left: 1em;
+  margin-right: 0;
+}
+
+/**
+ * Password strength indicator.
+ */
+.password-strength {
+  float: left;
+}
+.password-strength-text {
+  float: left;
+}
+div.password-confirm {
+  float: left;
+}
+.confirm-parent,
+.password-parent {
+  clear: right;
+}
+
+/* Generated by user.module but used by profile.module: */
+.profile .user-picture {
+  float: left;
+  margin: 0 0 1em 1em;
+}
diff --git a/htmltest/modules/user/user.admin.inc b/htmltest/modules/user/user.admin.inc
new file mode 100644
index 00000000..6ca330b0
--- /dev/null
+++ b/htmltest/modules/user/user.admin.inc
@@ -0,0 +1,1053 @@
+<?php
+
+/**
+ * @file
+ * Admin page callback file for the user module.
+ */
+
+/**
+ * Page callback: Generates the appropriate user administration form.
+ *
+ * This function generates the user registration, multiple user cancellation,
+ * or filtered user list admin form, depending on the argument and the POST
+ * form values.
+ *
+ * @param string $callback_arg
+ *   (optional) Indicates which form to build. Defaults to '', which will
+ *   trigger the user filter form. If the POST value 'op' is present, this
+ *   function uses that value as the callback argument.
+ *
+ * @return string
+ *   A renderable form array for the respective request.
+ */
+function user_admin($callback_arg = '') {
+  $op = isset($_POST['op']) ? $_POST['op'] : $callback_arg;
+
+  switch ($op) {
+    case t('Create new account'):
+    case 'create':
+      $build['user_register'] = drupal_get_form('user_register_form');
+      break;
+    default:
+      if (!empty($_POST['accounts']) && isset($_POST['operation']) && ($_POST['operation'] == 'cancel')) {
+        $build['user_multiple_cancel_confirm'] = drupal_get_form('user_multiple_cancel_confirm');
+      }
+      else {
+        $build['user_filter_form'] = drupal_get_form('user_filter_form');
+        $build['user_admin_account'] = drupal_get_form('user_admin_account');
+      }
+  }
+  return $build;
+}
+
+/**
+ * Form builder; Return form for user administration filters.
+ *
+ * @ingroup forms
+ * @see user_filter_form_submit()
+ */
+function user_filter_form() {
+  $session = isset($_SESSION['user_overview_filter']) ? $_SESSION['user_overview_filter'] : array();
+  $filters = user_filters();
+
+  $i = 0;
+  $form['filters'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Show only users where'),
+    '#theme' => 'exposed_filters__user',
+  );
+  foreach ($session as $filter) {
+    list($type, $value) = $filter;
+    if ($type == 'permission') {
+      // Merge arrays of module permissions into one.
+      // Slice past the first element '[any]' whose value is not an array.
+      $options = call_user_func_array('array_merge', array_slice($filters[$type]['options'], 1));
+      $value = $options[$value];
+    }
+    else {
+      $value = $filters[$type]['options'][$value];
+    }
+    $t_args = array('%property' => $filters[$type]['title'], '%value' => $value);
+    if ($i++) {
+      $form['filters']['current'][] = array('#markup' => t('and where %property is %value', $t_args));
+    }
+    else {
+      $form['filters']['current'][] = array('#markup' => t('%property is %value', $t_args));
+    }
+  }
+
+  $form['filters']['status'] = array(
+    '#type' => 'container',
+    '#attributes' => array('class' => array('clearfix')),
+    '#prefix' => ($i ? '<div class="additional-filters">' . t('and where') . '</div>' : ''),
+  );
+  $form['filters']['status']['filters'] = array(
+    '#type' => 'container',
+    '#attributes' => array('class' => array('filters')),
+  );
+  foreach ($filters as $key => $filter) {
+    $form['filters']['status']['filters'][$key] = array(
+      '#type' => 'select',
+      '#options' => $filter['options'],
+      '#title' => $filter['title'],
+      '#default_value' => '[any]',
+    );
+  }
+
+  $form['filters']['status']['actions'] = array(
+    '#type' => 'actions',
+    '#attributes' => array('class' => array('container-inline')),
+  );
+  $form['filters']['status']['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => (count($session) ? t('Refine') : t('Filter')),
+  );
+  if (count($session)) {
+    $form['filters']['status']['actions']['undo'] = array(
+      '#type' => 'submit',
+      '#value' => t('Undo'),
+    );
+    $form['filters']['status']['actions']['reset'] = array(
+      '#type' => 'submit',
+      '#value' => t('Reset'),
+    );
+  }
+
+  drupal_add_library('system', 'drupal.form');
+
+  return $form;
+}
+
+/**
+ * Process result from user administration filter form.
+ */
+function user_filter_form_submit($form, &$form_state) {
+  $op = $form_state['values']['op'];
+  $filters = user_filters();
+  switch ($op) {
+    case t('Filter'):
+    case t('Refine'):
+      // Apply every filter that has a choice selected other than 'any'.
+      foreach ($filters as $filter => $options) {
+        if (isset($form_state['values'][$filter]) && $form_state['values'][$filter] != '[any]') {
+          // Merge an array of arrays into one if necessary.
+          $options = ($filter == 'permission') ? form_options_flatten($filters[$filter]['options']) : $filters[$filter]['options'];
+          // Only accept valid selections offered on the dropdown, block bad input.
+          if (isset($options[$form_state['values'][$filter]])) {
+            $_SESSION['user_overview_filter'][] = array($filter, $form_state['values'][$filter]);
+          }
+        }
+      }
+      break;
+    case t('Undo'):
+      array_pop($_SESSION['user_overview_filter']);
+      break;
+    case t('Reset'):
+      $_SESSION['user_overview_filter'] = array();
+      break;
+    case t('Update'):
+      return;
+  }
+
+  $form_state['redirect'] = 'admin/people';
+  return;
+}
+
+/**
+ * Form builder; User administration page.
+ *
+ * @ingroup forms
+ * @see user_admin_account_validate()
+ * @see user_admin_account_submit()
+ */
+function user_admin_account() {
+
+  $header = array(
+    'username' => array('data' => t('Username'), 'field' => 'u.name'),
+    'status' => array('data' => t('Status'), 'field' => 'u.status'),
+    'roles' => array('data' => t('Roles')),
+    'member_for' => array('data' => t('Member for'), 'field' => 'u.created', 'sort' => 'desc'),
+    'access' => array('data' => t('Last access'), 'field' => 'u.access'),
+    'operations' => array('data' => t('Operations')),
+  );
+
+  $query = db_select('users', 'u');
+  $query->condition('u.uid', 0, '<>');
+  user_build_filter_query($query);
+
+  $count_query = clone $query;
+  $count_query->addExpression('COUNT(u.uid)');
+
+  $query = $query->extend('PagerDefault')->extend('TableSort');
+  $query
+    ->fields('u', array('uid', 'name', 'status', 'created', 'access'))
+    ->limit(50)
+    ->orderByHeader($header)
+    ->setCountQuery($count_query);
+  $result = $query->execute();
+
+  $form['options'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Update options'),
+    '#attributes' => array('class' => array('container-inline')),
+  );
+  $options = array();
+  foreach (module_invoke_all('user_operations') as $operation => $array) {
+    $options[$operation] = $array['label'];
+  }
+  $form['options']['operation'] = array(
+    '#type' => 'select',
+    '#title' => t('Operation'),
+    '#title_display' => 'invisible',
+    '#options' => $options,
+    '#default_value' => 'unblock',
+  );
+  $options = array();
+  $form['options']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Update'),
+  );
+
+  $destination = drupal_get_destination();
+
+  $status = array(t('blocked'), t('active'));
+  $roles = array_map('check_plain', user_roles(TRUE));
+  $accounts = array();
+  foreach ($result as $account) {
+    $users_roles = array();
+    $roles_result = db_query('SELECT rid FROM {users_roles} WHERE uid = :uid', array(':uid' => $account->uid));
+    foreach ($roles_result as $user_role) {
+      $users_roles[] = $roles[$user_role->rid];
+    }
+    asort($users_roles);
+
+    $options[$account->uid] = array(
+      'username' => theme('username', array('account' => $account)),
+      'status' =>  $status[$account->status],
+      'roles' => theme('item_list', array('items' => $users_roles)),
+      'member_for' => format_interval(REQUEST_TIME - $account->created),
+      'access' =>  $account->access ? t('@time ago', array('@time' => format_interval(REQUEST_TIME - $account->access))) : t('never'),
+      'operations' => array('data' => array('#type' => 'link', '#title' => t('edit'), '#href' => "user/$account->uid/edit", '#options' => array('query' => $destination))),
+    );
+  }
+
+  $form['accounts'] = array(
+    '#type' => 'tableselect',
+    '#header' => $header,
+    '#options' => $options,
+    '#empty' => t('No people available.'),
+  );
+  $form['pager'] = array('#markup' => theme('pager'));
+
+  return $form;
+}
+
+/**
+ * Submit the user administration update form.
+ */
+function user_admin_account_submit($form, &$form_state) {
+  $operations = module_invoke_all('user_operations', $form, $form_state);
+  $operation = $operations[$form_state['values']['operation']];
+  // Filter out unchecked accounts.
+  $accounts = array_filter($form_state['values']['accounts']);
+  if ($function = $operation['callback']) {
+    // Add in callback arguments if present.
+    if (isset($operation['callback arguments'])) {
+      $args = array_merge(array($accounts), $operation['callback arguments']);
+    }
+    else {
+      $args = array($accounts);
+    }
+    call_user_func_array($function, $args);
+
+    drupal_set_message(t('The update has been performed.'));
+  }
+}
+
+function user_admin_account_validate($form, &$form_state) {
+  $form_state['values']['accounts'] = array_filter($form_state['values']['accounts']);
+  if (count($form_state['values']['accounts']) == 0) {
+    form_set_error('', t('No users selected.'));
+  }
+}
+
+/**
+ * Form builder; Configure user settings for this site.
+ *
+ * @ingroup forms
+ * @see system_settings_form()
+ */
+function user_admin_settings() {
+  // Settings for anonymous users.
+  $form['anonymous_settings'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Anonymous users'),
+  );
+  $form['anonymous_settings']['anonymous'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Name'),
+    '#default_value' => variable_get('anonymous', t('Anonymous')),
+    '#description' => t('The name used to indicate anonymous users.'),
+    '#required' => TRUE,
+  );
+
+  // Administrative role option.
+  $form['admin_role'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Administrator role'),
+  );
+
+  // Do not allow users to set the anonymous or authenticated user roles as the
+  // administrator role.
+  $roles = user_roles();
+  unset($roles[DRUPAL_ANONYMOUS_RID]);
+  unset($roles[DRUPAL_AUTHENTICATED_RID]);
+  $roles[0] = t('disabled');
+
+  $form['admin_role']['user_admin_role'] = array(
+    '#type' => 'select',
+    '#title' => t('Administrator role'),
+    '#default_value' => variable_get('user_admin_role', 0),
+    '#options' => $roles,
+    '#description' => t('This role will be automatically assigned new permissions whenever a module is enabled. Changing this setting will not affect existing permissions.'),
+  );
+
+  // User registration settings.
+  $form['registration_cancellation'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Registration and cancellation'),
+  );
+  $form['registration_cancellation']['user_register'] = array(
+    '#type' => 'radios',
+    '#title' => t('Who can register accounts?'),
+    '#default_value' => variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL),
+    '#options' => array(
+      USER_REGISTER_ADMINISTRATORS_ONLY => t('Administrators only'),
+      USER_REGISTER_VISITORS => t('Visitors'),
+      USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL => t('Visitors, but administrator approval is required'),
+    )
+  );
+  $form['registration_cancellation']['user_email_verification'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Require e-mail verification when a visitor creates an account.'),
+    '#default_value' => variable_get('user_email_verification', TRUE),
+    '#description' => t('New users will be required to validate their e-mail address prior to logging into the site, and will be assigned a system-generated password. With this setting disabled, users will be logged in immediately upon registering, and may select their own passwords during registration.')
+  );
+  module_load_include('inc', 'user', 'user.pages');
+  $form['registration_cancellation']['user_cancel_method'] = array(
+    '#type' => 'item',
+    '#title' => t('When cancelling a user account'),
+    '#description' => t('Users with the %select-cancel-method or %administer-users <a href="@permissions-url">permissions</a> can override this default method.', array('%select-cancel-method' => t('Select method for cancelling account'), '%administer-users' => t('Administer users'), '@permissions-url' => url('admin/people/permissions'))),
+  );
+  $form['registration_cancellation']['user_cancel_method'] += user_cancel_methods();
+  foreach (element_children($form['registration_cancellation']['user_cancel_method']) as $element) {
+    // Remove all account cancellation methods that have #access defined, as
+    // those cannot be configured as default method.
+    if (isset($form['registration_cancellation']['user_cancel_method'][$element]['#access'])) {
+      $form['registration_cancellation']['user_cancel_method'][$element]['#access'] = FALSE;
+    }
+    // Remove the description (only displayed on the confirmation form).
+    else {
+      unset($form['registration_cancellation']['user_cancel_method'][$element]['#description']);
+    }
+  }
+
+  // Account settings.
+  $form['personalization'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Personalization'),
+  );
+  $form['personalization']['user_signatures'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable signatures.'),
+    '#default_value' => variable_get('user_signatures', 0),
+  );
+  // If picture support is enabled, check whether the picture directory exists.
+  if (variable_get('user_pictures', 0)) {
+    $picture_path =  file_default_scheme() . '://' . variable_get('user_picture_path', 'pictures');
+    if (!file_prepare_directory($picture_path, FILE_CREATE_DIRECTORY)) {
+      form_set_error('user_picture_path', t('The directory %directory does not exist or is not writable.', array('%directory' => $picture_path)));
+      watchdog('file system', 'The directory %directory does not exist or is not writable.', array('%directory' => $picture_path), WATCHDOG_ERROR);
+    }
+  }
+  $picture_support = variable_get('user_pictures', 0);
+  $form['personalization']['user_pictures'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable user pictures.'),
+    '#default_value' => $picture_support,
+  );
+  drupal_add_js(drupal_get_path('module', 'user') . '/user.js');
+  $form['personalization']['pictures'] = array(
+    '#type' => 'container',
+    '#states' => array(
+      // Hide the additional picture settings when user pictures are disabled.
+      'invisible' => array(
+        'input[name="user_pictures"]' => array('checked' => FALSE),
+      ),
+    ),
+  );
+  $form['personalization']['pictures']['user_picture_path'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Picture directory'),
+    '#default_value' => variable_get('user_picture_path', 'pictures'),
+    '#size' => 30,
+    '#maxlength' => 255,
+    '#description' => t('Subdirectory in the file upload directory where pictures will be stored.'),
+  );
+  $form['personalization']['pictures']['user_picture_default'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Default picture'),
+    '#default_value' => variable_get('user_picture_default', ''),
+    '#size' => 30,
+    '#maxlength' => 255,
+    '#description' => t('URL of picture to display for users with no custom picture selected. Leave blank for none.'),
+  );
+  if (module_exists('image')) {
+    $form['personalization']['pictures']['settings']['user_picture_style'] = array(
+      '#type' => 'select',
+      '#title' => t('Picture display style'),
+      '#options' => image_style_options(TRUE, PASS_THROUGH),
+      '#default_value' => variable_get('user_picture_style', ''),
+      '#description' => t('The style selected will be used on display, while the original image is retained. Styles may be configured in the <a href="!url">Image styles</a> administration area.', array('!url' => url('admin/config/media/image-styles'))),
+    );
+  }
+  $form['personalization']['pictures']['user_picture_dimensions'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Picture upload dimensions'),
+    '#default_value' => variable_get('user_picture_dimensions', '85x85'),
+    '#size' => 10,
+    '#maxlength' => 10,
+    '#field_suffix' => ' ' . t('pixels'),
+    '#description' => t('Pictures larger than this will be scaled down to this size.'),
+  );
+  $form['personalization']['pictures']['user_picture_file_size'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Picture upload file size'),
+    '#default_value' => variable_get('user_picture_file_size', '30'),
+    '#size' => 10,
+    '#maxlength' => 10,
+    '#field_suffix' => ' ' . t('KB'),
+    '#description' => t('Maximum allowed file size for uploaded pictures. Upload size is normally limited only by the PHP maximum post and file upload settings, and images are automatically scaled down to the dimensions specified above.'),
+    '#element_validate' => array('element_validate_integer_positive'),
+  );
+  $form['personalization']['pictures']['user_picture_guidelines'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Picture guidelines'),
+    '#default_value' => variable_get('user_picture_guidelines', ''),
+    '#description' => t("This text is displayed at the picture upload form in addition to the default guidelines. It's useful for helping or instructing your users."),
+  );
+
+  $form['email_title'] = array(
+    '#type' => 'item',
+    '#title' => t('E-mails'),
+  );
+  $form['email'] = array(
+    '#type' => 'vertical_tabs',
+  );
+  // These email tokens are shared for all settings, so just define
+  // the list once to help ensure they stay in sync.
+  $email_token_help = t('Available variables are: [site:name], [site:url], [user:name], [user:mail], [site:login-url], [site:url-brief], [user:edit-url], [user:one-time-login-url], [user:cancel-url].');
+
+  $form['email_admin_created'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Welcome (new user created by administrator)'),
+    '#collapsible' => TRUE,
+    '#collapsed' => (variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL) != USER_REGISTER_ADMINISTRATORS_ONLY),
+    '#description' => t('Edit the welcome e-mail messages sent to new member accounts created by an administrator.') . ' ' . $email_token_help,
+    '#group' => 'email',
+  );
+  $form['email_admin_created']['user_mail_register_admin_created_subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#default_value' => _user_mail_text('register_admin_created_subject', NULL, array(), FALSE),
+    '#maxlength' => 180,
+  );
+  $form['email_admin_created']['user_mail_register_admin_created_body'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Body'),
+    '#default_value' => _user_mail_text('register_admin_created_body', NULL, array(), FALSE),
+    '#rows' => 15,
+  );
+
+  $form['email_pending_approval'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Welcome (awaiting approval)'),
+    '#collapsible' => TRUE,
+    '#collapsed' => (variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL) != USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL),
+    '#description' => t('Edit the welcome e-mail messages sent to new members upon registering, when administrative approval is required.') . ' ' . $email_token_help,
+    '#group' => 'email',
+  );
+  $form['email_pending_approval']['user_mail_register_pending_approval_subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#default_value' => _user_mail_text('register_pending_approval_subject', NULL, array(), FALSE),
+    '#maxlength' => 180,
+  );
+  $form['email_pending_approval']['user_mail_register_pending_approval_body'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Body'),
+    '#default_value' => _user_mail_text('register_pending_approval_body', NULL, array(), FALSE),
+    '#rows' => 8,
+  );
+
+  $form['email_no_approval_required'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Welcome (no approval required)'),
+    '#collapsible' => TRUE,
+    '#collapsed' => (variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL) != USER_REGISTER_VISITORS),
+    '#description' => t('Edit the welcome e-mail messages sent to new members upon registering, when no administrator approval is required.') . ' ' . $email_token_help,
+    '#group' => 'email',
+  );
+  $form['email_no_approval_required']['user_mail_register_no_approval_required_subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#default_value' => _user_mail_text('register_no_approval_required_subject', NULL, array(), FALSE),
+    '#maxlength' => 180,
+  );
+  $form['email_no_approval_required']['user_mail_register_no_approval_required_body'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Body'),
+    '#default_value' => _user_mail_text('register_no_approval_required_body', NULL, array(), FALSE),
+    '#rows' => 15,
+  );
+
+  $form['email_password_reset'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Password recovery'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#description' => t('Edit the e-mail messages sent to users who request a new password.') . ' ' . $email_token_help,
+    '#group' => 'email',
+    '#weight' => 10,
+  );
+  $form['email_password_reset']['user_mail_password_reset_subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#default_value' => _user_mail_text('password_reset_subject', NULL, array(), FALSE),
+    '#maxlength' => 180,
+  );
+  $form['email_password_reset']['user_mail_password_reset_body'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Body'),
+    '#default_value' => _user_mail_text('password_reset_body', NULL, array(), FALSE),
+    '#rows' => 12,
+  );
+
+  $form['email_activated'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Account activation'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#description' => t('Enable and edit e-mail messages sent to users upon account activation (when an administrator activates an account of a user who has already registered, on a site where administrative approval is required).') . ' ' . $email_token_help,
+    '#group' => 'email',
+  );
+  $form['email_activated']['user_mail_status_activated_notify'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Notify user when account is activated.'),
+    '#default_value' => variable_get('user_mail_status_activated_notify', TRUE),
+  );
+  $form['email_activated']['settings'] = array(
+    '#type' => 'container',
+    '#states' => array(
+      // Hide the additional settings when this email is disabled.
+      'invisible' => array(
+        'input[name="user_mail_status_activated_notify"]' => array('checked' => FALSE),
+      ),
+    ),
+  );
+  $form['email_activated']['settings']['user_mail_status_activated_subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#default_value' => _user_mail_text('status_activated_subject', NULL, array(), FALSE),
+    '#maxlength' => 180,
+  );
+  $form['email_activated']['settings']['user_mail_status_activated_body'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Body'),
+    '#default_value' => _user_mail_text('status_activated_body', NULL, array(), FALSE),
+    '#rows' => 15,
+  );
+
+  $form['email_blocked'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Account blocked'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#description' => t('Enable and edit e-mail messages sent to users when their accounts are blocked.') . ' ' . $email_token_help,
+    '#group' => 'email',
+  );
+  $form['email_blocked']['user_mail_status_blocked_notify'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Notify user when account is blocked.'),
+    '#default_value' => variable_get('user_mail_status_blocked_notify', FALSE),
+  );
+  $form['email_blocked']['settings'] = array(
+    '#type' => 'container',
+    '#states' => array(
+      // Hide the additional settings when the blocked email is disabled.
+      'invisible' => array(
+        'input[name="user_mail_status_blocked_notify"]' => array('checked' => FALSE),
+      ),
+    ),
+  );
+  $form['email_blocked']['settings']['user_mail_status_blocked_subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#default_value' => _user_mail_text('status_blocked_subject', NULL, array(), FALSE),
+    '#maxlength' => 180,
+  );
+  $form['email_blocked']['settings']['user_mail_status_blocked_body'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Body'),
+    '#default_value' => _user_mail_text('status_blocked_body', NULL, array(), FALSE),
+    '#rows' => 3,
+  );
+
+  $form['email_cancel_confirm'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Account cancellation confirmation'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#description' => t('Edit the e-mail messages sent to users when they attempt to cancel their accounts.') . ' ' . $email_token_help,
+    '#group' => 'email',
+  );
+  $form['email_cancel_confirm']['user_mail_cancel_confirm_subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#default_value' => _user_mail_text('cancel_confirm_subject', NULL, array(), FALSE),
+    '#maxlength' => 180,
+  );
+  $form['email_cancel_confirm']['user_mail_cancel_confirm_body'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Body'),
+    '#default_value' => _user_mail_text('cancel_confirm_body', NULL, array(), FALSE),
+    '#rows' => 3,
+  );
+
+  $form['email_canceled'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Account canceled'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#description' => t('Enable and edit e-mail messages sent to users when their accounts are canceled.') . ' ' . $email_token_help,
+    '#group' => 'email',
+  );
+  $form['email_canceled']['user_mail_status_canceled_notify'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Notify user when account is canceled.'),
+    '#default_value' => variable_get('user_mail_status_canceled_notify', FALSE),
+  );
+  $form['email_canceled']['settings'] = array(
+    '#type' => 'container',
+    '#states' => array(
+      // Hide the settings when the cancel notify checkbox is disabled.
+      'invisible' => array(
+        'input[name="user_mail_status_canceled_notify"]' => array('checked' => FALSE),
+      ),
+    ),
+  );
+  $form['email_canceled']['settings']['user_mail_status_canceled_subject'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Subject'),
+    '#default_value' => _user_mail_text('status_canceled_subject', NULL, array(), FALSE),
+    '#maxlength' => 180,
+  );
+  $form['email_canceled']['settings']['user_mail_status_canceled_body'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Body'),
+    '#default_value' => _user_mail_text('status_canceled_body', NULL, array(), FALSE),
+    '#rows' => 3,
+  );
+
+  return system_settings_form($form);
+}
+
+/**
+ * Menu callback: administer permissions.
+ *
+ * @ingroup forms
+ * @see user_admin_permissions_submit()
+ * @see theme_user_admin_permissions()
+ */
+function user_admin_permissions($form, $form_state, $rid = NULL) {
+
+  // Retrieve role names for columns.
+  $role_names = user_roles();
+  if (is_numeric($rid)) {
+    $role_names = array($rid => $role_names[$rid]);
+  }
+  // Fetch permissions for all roles or the one selected role.
+  $role_permissions = user_role_permissions($role_names);
+
+  // Store $role_names for use when saving the data.
+  $form['role_names'] = array(
+    '#type' => 'value',
+    '#value' => $role_names,
+  );
+  // Render role/permission overview:
+  $options = array();
+  $module_info = system_get_info('module');
+  $hide_descriptions = system_admin_compact_mode();
+
+  // Get a list of all the modules implementing a hook_permission() and sort by
+  // display name.
+  $modules = array();
+  foreach (module_implements('permission') as $module) {
+    $modules[$module] = $module_info[$module]['name'];
+  }
+  asort($modules);
+
+  foreach ($modules as $module => $display_name) {
+    if ($permissions = module_invoke($module, 'permission')) {
+      $form['permission'][] = array(
+        '#markup' => $module_info[$module]['name'],
+        '#id' => $module,
+      );
+      foreach ($permissions as $perm => $perm_item) {
+        // Fill in default values for the permission.
+        $perm_item += array(
+          'description' => '',
+          'restrict access' => FALSE,
+          'warning' => !empty($perm_item['restrict access']) ? t('Warning: Give to trusted roles only; this permission has security implications.') : '',
+        );
+        $options[$perm] = '';
+        $form['permission'][$perm] = array(
+          '#type' => 'item',
+          '#markup' => $perm_item['title'],
+          '#description' => theme('user_permission_description', array('permission_item' => $perm_item, 'hide' => $hide_descriptions)),
+        );
+        foreach ($role_names as $rid => $name) {
+          // Builds arrays for checked boxes for each role
+          if (isset($role_permissions[$rid][$perm])) {
+            $status[$rid][] = $perm;
+          }
+        }
+      }
+    }
+  }
+
+  // Have to build checkboxes here after checkbox arrays are built
+  foreach ($role_names as $rid => $name) {
+    $form['checkboxes'][$rid] = array(
+      '#type' => 'checkboxes',
+      '#options' => $options,
+      '#default_value' => isset($status[$rid]) ? $status[$rid] : array(),
+      '#attributes' => array('class' => array('rid-' . $rid)),
+    );
+    $form['role_names'][$rid] = array('#markup' => check_plain($name), '#tree' => TRUE);
+  }
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Save permissions'));
+
+  $form['#attached']['js'][] = drupal_get_path('module', 'user') . '/user.permissions.js';
+
+  return $form;
+}
+
+/**
+ * Save permissions selected on the administer permissions page.
+ *
+ * @see user_admin_permissions()
+ */
+function user_admin_permissions_submit($form, &$form_state) {
+  foreach ($form_state['values']['role_names'] as $rid => $name) {
+    user_role_change_permissions($rid, $form_state['values'][$rid]);
+  }
+
+  drupal_set_message(t('The changes have been saved.'));
+
+  // Clear the cached pages and blocks.
+  cache_clear_all();
+}
+
+/**
+ * Returns HTML for the administer permissions page.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_user_admin_permissions($variables) {
+  $form = $variables['form'];
+
+  $roles = user_roles();
+  foreach (element_children($form['permission']) as $key) {
+    $row = array();
+    // Module name
+    if (is_numeric($key)) {
+      $row[] = array('data' => drupal_render($form['permission'][$key]), 'class' => array('module'), 'id' => 'module-' . $form['permission'][$key]['#id'], 'colspan' => count($form['role_names']['#value']) + 1);
+    }
+    else {
+      // Permission row.
+      $row[] = array(
+        'data' => drupal_render($form['permission'][$key]),
+        'class' => array('permission'),
+      );
+      foreach (element_children($form['checkboxes']) as $rid) {
+        $form['checkboxes'][$rid][$key]['#title'] = $roles[$rid] . ': ' . $form['permission'][$key]['#markup'];
+        $form['checkboxes'][$rid][$key]['#title_display'] = 'invisible';
+        $row[] = array('data' => drupal_render($form['checkboxes'][$rid][$key]), 'class' => array('checkbox'));
+      }
+    }
+    $rows[] = $row;
+  }
+  $header[] = (t('Permission'));
+  foreach (element_children($form['role_names']) as $rid) {
+    $header[] = array('data' => drupal_render($form['role_names'][$rid]), 'class' => array('checkbox'));
+  }
+  $output = theme('system_compact_link');
+  $output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'permissions')));
+  $output .= drupal_render_children($form);
+  return $output;
+}
+
+/**
+ * Returns HTML for an individual permission description.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - permission_item: An associative array representing the permission whose
+ *     description is being themed. Useful keys include:
+ *     - description: The text of the permission description.
+ *     - warning: A security-related warning message about the permission (if
+ *       there is one).
+ *   - hide: A boolean indicating whether or not the permission description was
+ *     requested to be hidden rather than shown.
+ *
+ * @ingroup themeable
+ */
+function theme_user_permission_description($variables) {
+  if (!$variables['hide']) {
+    $description = array();
+    $permission_item = $variables['permission_item'];
+    if (!empty($permission_item['description'])) {
+      $description[] = $permission_item['description'];
+    }
+    if (!empty($permission_item['warning'])) {
+      $description[] = '<em class="permission-warning">' . $permission_item['warning'] . '</em>';
+    }
+    if (!empty($description)) {
+      return implode(' ', $description);
+    }
+  }
+}
+
+/**
+ * Form to re-order roles or add a new one.
+ *
+ * @ingroup forms
+ * @see theme_user_admin_roles()
+ */
+function user_admin_roles($form, $form_state) {
+  $roles = user_roles();
+
+  $form['roles'] = array(
+    '#tree' => TRUE,
+  );
+  $order = 0;
+  foreach ($roles as $rid => $name) {
+    $form['roles'][$rid]['#role'] = (object) array(
+      'rid' => $rid,
+      'name' => $name,
+      'weight' => $order,
+    );
+    $form['roles'][$rid]['#weight'] = $order;
+    $form['roles'][$rid]['weight'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Weight for @title', array('@title' => $name)),
+      '#title_display' => 'invisible',
+      '#size' => 4,
+      '#default_value' => $order,
+      '#attributes' => array('class' => array('role-weight')),
+    );
+    $order++;
+  }
+
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Name'),
+    '#title_display' => 'invisible',
+    '#size' => 32,
+    '#maxlength' => 64,
+  );
+  $form['add'] = array(
+    '#type' => 'submit',
+    '#value' => t('Add role'),
+    '#validate' => array('user_admin_role_validate'),
+    '#submit' => array('user_admin_role_submit'),
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save order'),
+    '#submit' => array('user_admin_roles_order_submit'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form submit function. Update the role weights.
+ */
+function user_admin_roles_order_submit($form, &$form_state) {
+  foreach ($form_state['values']['roles'] as $rid => $role_values) {
+    $role = $form['roles'][$rid]['#role'];
+    $role->weight = $role_values['weight'];
+    user_role_save($role);
+  }
+  drupal_set_message(t('The role settings have been updated.'));
+}
+
+/**
+ * Returns HTML for the role order and new role form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_user_admin_roles($variables) {
+  $form = $variables['form'];
+
+  $header = array(t('Name'), t('Weight'), array('data' => t('Operations'), 'colspan' => 2));
+  foreach (element_children($form['roles']) as $rid) {
+    $name = $form['roles'][$rid]['#role']->name;
+    $row = array();
+    if (in_array($rid, array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID))) {
+      $row[] = t('@name <em>(locked)</em>', array('@name' => $name));
+      $row[] = drupal_render($form['roles'][$rid]['weight']);
+      $row[] = '';
+      $row[] = l(t('edit permissions'), 'admin/people/permissions/' . $rid);
+    }
+    else {
+      $row[] = check_plain($name);
+      $row[] = drupal_render($form['roles'][$rid]['weight']);
+      $row[] = l(t('edit role'), 'admin/people/permissions/roles/edit/' . $rid);
+      $row[] = l(t('edit permissions'), 'admin/people/permissions/' . $rid);
+    }
+    $rows[] = array('data' => $row, 'class' => array('draggable'));
+  }
+  $rows[] = array(array('data' => drupal_render($form['name']) . drupal_render($form['add']), 'colspan' => 4, 'class' => 'edit-name'));
+
+  drupal_add_tabledrag('user-roles', 'order', 'sibling', 'role-weight');
+
+  $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'user-roles')));
+  $output .= drupal_render_children($form);
+
+  return $output;
+}
+
+/**
+ * Form to configure a single role.
+ *
+ * @ingroup forms
+ * @see user_admin_role_validate()
+ * @see user_admin_role_submit()
+ */
+function user_admin_role($form, $form_state, $role) {
+  if ($role->rid == DRUPAL_ANONYMOUS_RID || $role->rid == DRUPAL_AUTHENTICATED_RID) {
+    drupal_goto('admin/people/permissions/roles');
+  }
+
+  // Display the edit role form.
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Role name'),
+    '#default_value' => $role->name,
+    '#size' => 30,
+    '#required' => TRUE,
+    '#maxlength' => 64,
+    '#description' => t('The name for this role. Example: "moderator", "editorial board", "site architect".'),
+  );
+  $form['rid'] = array(
+    '#type' => 'value',
+    '#value' => $role->rid,
+  );
+  $form['weight'] = array(
+    '#type' => 'value',
+    '#value' => $role->weight,
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save role'),
+  );
+  $form['actions']['delete'] = array(
+    '#type' => 'submit',
+    '#value' => t('Delete role'),
+    '#submit' => array('user_admin_role_delete_submit'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form validation handler for the user_admin_role() form.
+ */
+function user_admin_role_validate($form, &$form_state) {
+  if (!empty($form_state['values']['name'])) {
+    if ($form_state['values']['op'] == t('Save role')) {
+      $role = user_role_load_by_name($form_state['values']['name']);
+      if ($role && $role->rid != $form_state['values']['rid']) {
+        form_set_error('name', t('The role name %name already exists. Choose another role name.', array('%name' => $form_state['values']['name'])));
+      }
+    }
+    elseif ($form_state['values']['op'] == t('Add role')) {
+      if (user_role_load_by_name($form_state['values']['name'])) {
+        form_set_error('name', t('The role name %name already exists. Choose another role name.', array('%name' => $form_state['values']['name'])));
+      }
+    }
+  }
+  else {
+    form_set_error('name', t('You must specify a valid role name.'));
+  }
+}
+
+/**
+ * Form submit handler for the user_admin_role() form.
+ */
+function user_admin_role_submit($form, &$form_state) {
+  $role = (object) $form_state['values'];
+  if ($form_state['values']['op'] == t('Save role')) {
+    user_role_save($role);
+    drupal_set_message(t('The role has been renamed.'));
+  }
+  elseif ($form_state['values']['op'] == t('Add role')) {
+    user_role_save($role);
+    drupal_set_message(t('The role has been added.'));
+  }
+  $form_state['redirect'] = 'admin/people/permissions/roles';
+  return;
+}
+
+/**
+ * Form submit handler for the user_admin_role() form.
+ */
+function user_admin_role_delete_submit($form, &$form_state) {
+  $form_state['redirect'] = 'admin/people/permissions/roles/delete/' . $form_state['values']['rid'];
+}
+
+/**
+ * Form to confirm role delete operation.
+ */
+function user_admin_role_delete_confirm($form, &$form_state, $role) {
+  $form['rid'] = array(
+    '#type' => 'value',
+    '#value' => $role->rid,
+  );
+  return confirm_form($form, t('Are you sure you want to delete the role %name ?', array('%name' => $role->name)), 'admin/people/permissions/roles', t('This action cannot be undone.'), t('Delete'));
+}
+
+/**
+ * Form submit handler for user_admin_role_delete_confirm().
+ */
+function user_admin_role_delete_confirm_submit($form, &$form_state) {
+  user_role_delete((int) $form_state['values']['rid']);
+  drupal_set_message(t('The role has been deleted.'));
+  $form_state['redirect'] = 'admin/people/permissions/roles';
+}
+
diff --git a/htmltest/modules/user/user.api.php b/htmltest/modules/user/user.api.php
new file mode 100644
index 00000000..3afc88ab
--- /dev/null
+++ b/htmltest/modules/user/user.api.php
@@ -0,0 +1,469 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the User module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Act on user objects when loaded from the database.
+ *
+ * Due to the static cache in user_load_multiple() you should not use this
+ * hook to modify the user properties returned by the {users} table itself
+ * since this may result in unreliable results when loading from cache.
+ *
+ * @param $users
+ *   An array of user objects, indexed by uid.
+ *
+ * @see user_load_multiple()
+ * @see profile_user_load()
+ */
+function hook_user_load($users) {
+  $result = db_query('SELECT uid, foo FROM {my_table} WHERE uid IN (:uids)', array(':uids' => array_keys($users)));
+  foreach ($result as $record) {
+    $users[$record->uid]->foo = $record->foo;
+  }
+}
+
+/**
+ * Respond to user deletion.
+ *
+ * This hook is invoked from user_delete_multiple() before field_attach_delete()
+ * is called and before users are actually removed from the database.
+ *
+ * Modules should additionally implement hook_user_cancel() to process stored
+ * user data for other account cancellation methods.
+ *
+ * @param $account
+ *   The account that is being deleted.
+ *
+ * @see user_delete_multiple()
+ */
+function hook_user_delete($account) {
+  db_delete('mytable')
+    ->condition('uid', $account->uid)
+    ->execute();
+}
+
+/**
+ * Act on user account cancellations.
+ *
+ * This hook is invoked from user_cancel() before a user account is canceled.
+ * Depending on the account cancellation method, the module should either do
+ * nothing, unpublish content, or anonymize content. See user_cancel_methods()
+ * for the list of default account cancellation methods provided by User module.
+ * Modules may add further methods via hook_user_cancel_methods_alter().
+ *
+ * This hook is NOT invoked for the 'user_cancel_delete' account cancellation
+ * method. To react on this method, implement hook_user_delete() instead.
+ *
+ * Expensive operations should be added to the global account cancellation batch
+ * by using batch_set().
+ *
+ * @param $edit
+ *   The array of form values submitted by the user.
+ * @param $account
+ *   The user object on which the operation is being performed.
+ * @param $method
+ *   The account cancellation method.
+ *
+ * @see user_cancel_methods()
+ * @see hook_user_cancel_methods_alter()
+ */
+function hook_user_cancel($edit, $account, $method) {
+  switch ($method) {
+    case 'user_cancel_block_unpublish':
+      // Unpublish nodes (current revisions).
+      module_load_include('inc', 'node', 'node.admin');
+      $nodes = db_select('node', 'n')
+        ->fields('n', array('nid'))
+        ->condition('uid', $account->uid)
+        ->execute()
+        ->fetchCol();
+      node_mass_update($nodes, array('status' => 0));
+      break;
+
+    case 'user_cancel_reassign':
+      // Anonymize nodes (current revisions).
+      module_load_include('inc', 'node', 'node.admin');
+      $nodes = db_select('node', 'n')
+        ->fields('n', array('nid'))
+        ->condition('uid', $account->uid)
+        ->execute()
+        ->fetchCol();
+      node_mass_update($nodes, array('uid' => 0));
+      // Anonymize old revisions.
+      db_update('node_revision')
+        ->fields(array('uid' => 0))
+        ->condition('uid', $account->uid)
+        ->execute();
+      // Clean history.
+      db_delete('history')
+        ->condition('uid', $account->uid)
+        ->execute();
+      break;
+  }
+}
+
+/**
+ * Modify account cancellation methods.
+ *
+ * By implementing this hook, modules are able to add, customize, or remove
+ * account cancellation methods. All defined methods are turned into radio
+ * button form elements by user_cancel_methods() after this hook is invoked.
+ * The following properties can be defined for each method:
+ * - title: The radio button's title.
+ * - description: (optional) A description to display on the confirmation form
+ *   if the user is not allowed to select the account cancellation method. The
+ *   description is NOT used for the radio button, but instead should provide
+ *   additional explanation to the user seeking to cancel their account.
+ * - access: (optional) A boolean value indicating whether the user can access
+ *   a method. If #access is defined, the method cannot be configured as default
+ *   method.
+ *
+ * @param $methods
+ *   An array containing user account cancellation methods, keyed by method id.
+ *
+ * @see user_cancel_methods()
+ * @see user_cancel_confirm_form()
+ */
+function hook_user_cancel_methods_alter(&$methods) {
+  // Limit access to disable account and unpublish content method.
+  $methods['user_cancel_block_unpublish']['access'] = user_access('administer site configuration');
+
+  // Remove the content re-assigning method.
+  unset($methods['user_cancel_reassign']);
+
+  // Add a custom zero-out method.
+  $methods['mymodule_zero_out'] = array(
+    'title' => t('Delete the account and remove all content.'),
+    'description' => t('All your content will be replaced by empty strings.'),
+    // access should be used for administrative methods only.
+    'access' => user_access('access zero-out account cancellation method'),
+  );
+}
+
+/**
+ * Add mass user operations.
+ *
+ * This hook enables modules to inject custom operations into the mass operations
+ * dropdown found at admin/people, by associating a callback function with
+ * the operation, which is called when the form is submitted. The callback function
+ * receives one initial argument, which is an array of the checked users.
+ *
+ * @return
+ *   An array of operations. Each operation is an associative array that may
+ *   contain the following key-value pairs:
+ *   - "label": Required. The label for the operation, displayed in the dropdown menu.
+ *   - "callback": Required. The function to call for the operation.
+ *   - "callback arguments": Optional. An array of additional arguments to pass to
+ *     the callback function.
+ *
+ */
+function hook_user_operations() {
+  $operations = array(
+    'unblock' => array(
+      'label' => t('Unblock the selected users'),
+      'callback' => 'user_user_operations_unblock',
+    ),
+    'block' => array(
+      'label' => t('Block the selected users'),
+      'callback' => 'user_user_operations_block',
+    ),
+    'cancel' => array(
+      'label' => t('Cancel the selected user accounts'),
+    ),
+  );
+  return $operations;
+}
+
+/**
+ * Retrieve a list of user setting or profile information categories.
+ *
+ * @return
+ *   An array of associative arrays. Each inner array has elements:
+ *   - "name": The internal name of the category.
+ *   - "title": The human-readable, localized name of the category.
+ *   - "weight": An integer specifying the category's sort ordering.
+ *   - "access callback": Name of the access callback function to use to
+ *     determine whether the user can edit the category. Defaults to using
+ *     user_edit_access(). See hook_menu() for more information on access
+ *     callbacks.
+ *   - "access arguments": Arguments for the access callback function. Defaults
+ *     to array(1).
+ */
+function hook_user_categories() {
+  return array(array(
+    'name' => 'account',
+    'title' => t('Account settings'),
+    'weight' => 1,
+  ));
+}
+
+/**
+ * A user account is about to be created or updated.
+ *
+ * This hook is primarily intended for modules that want to store properties in
+ * the serialized {users}.data column, which is automatically loaded whenever a
+ * user account object is loaded, modules may add to $edit['data'] in order
+ * to have their data serialized on save.
+ *
+ * @param $edit
+ *   The array of form values submitted by the user. Assign values to this
+ *   array to save changes in the database.
+ * @param $account
+ *   The user object on which the operation is performed. Values assigned in
+ *   this object will not be saved in the database.
+ * @param $category
+ *   The active category of user information being edited.
+ *
+ * @see hook_user_insert()
+ * @see hook_user_update()
+ */
+function hook_user_presave(&$edit, $account, $category) {
+  // Make sure that our form value 'mymodule_foo' is stored as
+  // 'mymodule_bar' in the 'data' (serialized) column.
+  if (isset($edit['mymodule_foo'])) {
+    $edit['data']['mymodule_bar'] = $edit['mymodule_foo'];
+  }
+}
+
+/**
+ * A user account was created.
+ *
+ * The module should save its custom additions to the user object into the
+ * database.
+ *
+ * @param $edit
+ *   The array of form values submitted by the user.
+ * @param $account
+ *   The user object on which the operation is being performed.
+ * @param $category
+ *   The active category of user information being edited.
+ *
+ * @see hook_user_presave()
+ * @see hook_user_update()
+ */
+function hook_user_insert(&$edit, $account, $category) {
+  db_insert('mytable')
+    ->fields(array(
+      'myfield' => $edit['myfield'],
+      'uid' => $account->uid,
+    ))
+    ->execute();
+}
+
+/**
+ * A user account was updated.
+ *
+ * Modules may use this hook to update their user data in a custom storage
+ * after a user account has been updated.
+ *
+ * @param $edit
+ *   The array of form values submitted by the user.
+ * @param $account
+ *   The user object on which the operation is performed.
+ * @param $category
+ *   The active category of user information being edited.
+ *
+ * @see hook_user_presave()
+ * @see hook_user_insert()
+ */
+function hook_user_update(&$edit, $account, $category) {
+  db_insert('user_changes')
+    ->fields(array(
+      'uid' => $account->uid,
+      'changed' => time(),
+    ))
+    ->execute();
+}
+
+/**
+ * The user just logged in.
+ *
+ * @param $edit
+ *   The array of form values submitted by the user.
+ * @param $account
+ *   The user object on which the operation was just performed.
+ */
+function hook_user_login(&$edit, $account) {
+  // If the user has a NULL time zone, notify them to set a time zone.
+  if (!$account->timezone && variable_get('configurable_timezones', 1) && variable_get('empty_timezone_message', 0)) {
+    drupal_set_message(t('Configure your <a href="@user-edit">account time zone setting</a>.', array('@user-edit' => url("user/$account->uid/edit", array('query' => drupal_get_destination(), 'fragment' => 'edit-timezone')))));
+  }
+}
+
+/**
+ * The user just logged out.
+ *
+ * Note that when this hook is invoked, the changes have not yet been written to
+ * the database, because a database transaction is still in progress. The
+ * transaction is not finalized until the save operation is entirely completed
+ * and user_save() goes out of scope. You should not rely on data in the
+ * database at this time as it is not updated yet. You should also note that any
+ * write/update database queries executed from this hook are also not committed
+ * immediately. Check user_save() and db_transaction() for more info.
+ *
+ * @param $account
+ *   The user object on which the operation was just performed.
+ */
+function hook_user_logout($account) {
+  db_insert('logouts')
+    ->fields(array(
+      'uid' => $account->uid,
+      'time' => time(),
+    ))
+    ->execute();
+}
+
+/**
+ * The user's account information is being displayed.
+ *
+ * The module should format its custom additions for display and add them to the
+ * $account->content array.
+ *
+ * Note that when this hook is invoked, the changes have not yet been written to
+ * the database, because a database transaction is still in progress. The
+ * transaction is not finalized until the save operation is entirely completed
+ * and user_save() goes out of scope. You should not rely on data in the
+ * database at this time as it is not updated yet. You should also note that any
+ * write/update database queries executed from this hook are also not committed
+ * immediately. Check user_save() and db_transaction() for more info.
+ *
+ * @param $account
+ *   The user object on which the operation is being performed.
+ * @param $view_mode
+ *   View mode, e.g. 'full'.
+ * @param $langcode
+ *   The language code used for rendering.
+ *
+ * @see hook_user_view_alter()
+ * @see hook_entity_view()
+ */
+function hook_user_view($account, $view_mode, $langcode) {
+  if (user_access('create blog content', $account)) {
+    $account->content['summary']['blog'] =  array(
+      '#type' => 'user_profile_item',
+      '#title' => t('Blog'),
+      '#markup' => l(t('View recent blog entries'), "blog/$account->uid", array('attributes' => array('title' => t("Read !username's latest blog entries.", array('!username' => format_username($account)))))),
+      '#attributes' => array('class' => array('blog')),
+    );
+  }
+}
+
+/**
+ * The user was built; the module may modify the structured content.
+ *
+ * This hook is called after the content has been assembled in a structured array
+ * and may be used for doing processing which requires that the complete user
+ * content structure has been built.
+ *
+ * If the module wishes to act on the rendered HTML of the user rather than the
+ * structured content array, it may use this hook to add a #post_render callback.
+ * Alternatively, it could also implement hook_preprocess_user_profile(). See
+ * drupal_render() and theme() documentation respectively for details.
+ *
+ * @param $build
+ *   A renderable array representing the user.
+ *
+ * @see user_view()
+ * @see hook_entity_view_alter()
+ */
+function hook_user_view_alter(&$build) {
+  // Check for the existence of a field added by another module.
+  if (isset($build['an_additional_field'])) {
+    // Change its weight.
+    $build['an_additional_field']['#weight'] = -10;
+  }
+
+  // Add a #post_render callback to act on the rendered HTML of the user.
+  $build['#post_render'][] = 'my_module_user_post_render';
+}
+
+/**
+ * Inform other modules that a user role is about to be saved.
+ *
+ * Modules implementing this hook can act on the user role object before
+ * it has been saved to the database.
+ *
+ * @param $role
+ *   A user role object.
+ *
+ * @see hook_user_role_insert()
+ * @see hook_user_role_update()
+ */
+function hook_user_role_presave($role) {
+  // Set a UUID for the user role if it doesn't already exist
+  if (empty($role->uuid)) {
+    $role->uuid = uuid_uuid();
+  }
+}
+
+/**
+ * Inform other modules that a user role has been added.
+ *
+ * Modules implementing this hook can act on the user role object when saved to
+ * the database. It's recommended that you implement this hook if your module
+ * adds additional data to user roles object. The module should save its custom
+ * additions to the database.
+ *
+ * @param $role
+ *   A user role object.
+ */
+function hook_user_role_insert($role) {
+  // Save extra fields provided by the module to user roles.
+  db_insert('my_module_table')
+    ->fields(array(
+      'rid' => $role->rid,
+      'role_description' => $role->description,
+    ))
+    ->execute();
+}
+
+/**
+ * Inform other modules that a user role has been updated.
+ *
+ * Modules implementing this hook can act on the user role object when updated.
+ * It's recommended that you implement this hook if your module adds additional
+ * data to user roles object. The module should save its custom additions to
+ * the database.
+ *
+ * @param $role
+ *   A user role object.
+ */
+function hook_user_role_update($role) {
+  // Save extra fields provided by the module to user roles.
+  db_merge('my_module_table')
+    ->key(array('rid' => $role->rid))
+    ->fields(array(
+      'role_description' => $role->description
+    ))
+    ->execute();
+}
+
+/**
+ * Inform other modules that a user role has been deleted.
+ *
+ * This hook allows you act when a user role has been deleted.
+ * If your module stores references to roles, it's recommended that you
+ * implement this hook and delete existing instances of the deleted role
+ * in your module database tables.
+ *
+ * @param $role
+ *   The $role object being deleted.
+ */
+function hook_user_role_delete($role) {
+  // Delete existing instances of the deleted role.
+  db_delete('my_module_table')
+    ->condition('rid', $role->rid)
+    ->execute();
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/htmltest/modules/user/user.css b/htmltest/modules/user/user.css
new file mode 100644
index 00000000..079ec38a
--- /dev/null
+++ b/htmltest/modules/user/user.css
@@ -0,0 +1,102 @@
+
+#permissions td.module {
+  font-weight: bold;
+}
+#permissions td.permission {
+  padding-left: 1.5em; /* LTR */
+}
+#permissions tr.odd .form-item,
+#permissions tr.even .form-item {
+  white-space: normal;
+}
+#user-admin-settings fieldset .fieldset-description {
+  font-size: 0.85em;
+  padding-bottom: .5em;
+}
+
+/**
+ * Override default textfield float to put the "Add role" button next to
+ * the input textfield.
+ */
+#user-admin-roles td.edit-name {
+  clear: both;
+}
+#user-admin-roles .form-item-name {
+  float: left; /* LTR */
+  margin-right: 1em; /* LTR */
+}
+
+/**
+ * Password strength indicator.
+ */
+.password-strength {
+  width: 17em;
+  float: right;  /* LTR */
+  margin-top: 1.4em;
+}
+.password-strength-title {
+  display: inline;
+}
+.password-strength-text {
+  float: right; /* LTR */
+  font-weight: bold;
+}
+.password-indicator {
+  background-color: #C4C4C4;
+  height: 0.3em;
+  width: 100%;
+}
+.password-indicator div {
+  height: 100%;
+  width: 0%;
+  background-color: #47C965;
+}
+input.password-confirm,
+input.password-field {
+  width: 16em;
+  margin-bottom: 0.4em;
+}
+div.password-confirm {
+  float: right;  /* LTR */
+  margin-top: 1.5em;
+  visibility: hidden;
+  width: 17em;
+}
+div.form-item div.password-suggestions {
+  padding: 0.2em 0.5em;
+  margin: 0.7em 0;
+  width: 38.5em;
+  border: 1px solid #B4B4B4;
+}
+div.password-suggestions ul {
+  margin-bottom: 0;
+}
+.confirm-parent,
+.password-parent {
+  clear: left; /* LTR */
+  margin: 0;
+  width: 36.3em;
+}
+
+/* Generated by user.module but used by profile.module: */
+.profile {
+  clear: both;
+  margin: 1em 0;
+}
+.profile .user-picture {
+  float: right; /* LTR */
+  margin: 0 1em 1em 0; /* LTR */
+}
+.profile h3 {
+  border-bottom: 1px solid #ccc;
+}
+.profile dl {
+  margin: 0 0 1.5em 0;
+}
+.profile dt {
+  margin: 0 0 0.2em 0;
+  font-weight: bold;
+}
+.profile dd {
+  margin: 0 0 1em 0;
+}
diff --git a/htmltest/modules/user/user.info b/htmltest/modules/user/user.info
new file mode 100644
index 00000000..81987cbf
--- /dev/null
+++ b/htmltest/modules/user/user.info
@@ -0,0 +1,16 @@
+name = User
+description = Manages the user registration and login system.
+package = Core
+version = VERSION
+core = 7.x
+files[] = user.module
+files[] = user.test
+required = TRUE
+configure = admin/config/people
+stylesheets[all][] = user.css
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/modules/user/user.install b/htmltest/modules/user/user.install
new file mode 100644
index 00000000..4e1a3c22
--- /dev/null
+++ b/htmltest/modules/user/user.install
@@ -0,0 +1,913 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the user module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function user_schema() {
+  $schema['authmap'] = array(
+    'description' => 'Stores distributed authentication mapping.',
+    'fields' => array(
+      'aid' => array(
+        'description' => 'Primary Key: Unique authmap ID.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'uid' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => "User's {users}.uid.",
+      ),
+      'authname' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Unique authentication name.',
+      ),
+      'module' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Module which is controlling the authentication.',
+      ),
+    ),
+    'unique keys' => array(
+      'authname' => array('authname'),
+    ),
+    'primary key' => array('aid'),
+    'foreign keys' => array(
+      'user' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid'),
+      ),
+    ),
+  );
+
+  $schema['role_permission'] = array(
+    'description' => 'Stores the permissions assigned to user roles.',
+    'fields' => array(
+      'rid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'Foreign Key: {role}.rid.',
+      ),
+      'permission' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'A single permission granted to the role identified by rid.',
+      ),
+      'module' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => "The module declaring the permission.",
+      ),
+    ),
+    'primary key' => array('rid', 'permission'),
+    'indexes' => array(
+      'permission' => array('permission'),
+    ),
+    'foreign keys' => array(
+      'role' => array(
+        'table' => 'roles',
+        'columns' => array('rid' => 'rid'),
+      ),
+    ),
+  );
+
+  $schema['role'] = array(
+    'description' => 'Stores user roles.',
+    'fields' => array(
+      'rid' => array(
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique role ID.',
+      ),
+      'name' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Unique role name.',
+        'translatable' => TRUE,
+      ),
+      'weight' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'The weight of this role in listings and the user interface.',
+      ),
+    ),
+    'unique keys' => array(
+      'name' => array('name'),
+    ),
+    'primary key' => array('rid'),
+    'indexes' => array(
+      'name_weight' => array('name', 'weight'),
+    ),
+  );
+
+  // The table name here is plural, despite Drupal table naming standards,
+  // because "user" is a reserved word in many databases.
+  $schema['users'] = array(
+    'description' => 'Stores user data.',
+    'fields' => array(
+      'uid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique user ID.',
+        'default' => 0,
+      ),
+      'name' => array(
+        'type' => 'varchar',
+        'length' => 60,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Unique user name.',
+      ),
+      'pass' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => "User's password (hashed).",
+      ),
+      'mail' => array(
+        'type' => 'varchar',
+        'length' => 254,
+        'not null' => FALSE,
+        'default' => '',
+        'description' => "User's e-mail address.",
+      ),
+      'theme' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => "User's default theme.",
+      ),
+      'signature' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => "User's signature.",
+      ),
+      'signature_format' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => FALSE,
+        'description' => 'The {filter_format}.format of the signature.',
+      ),
+      'created' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Timestamp for when user was created.',
+      ),
+      'access' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Timestamp for previous time user accessed the site.',
+      ),
+      'login' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => "Timestamp for user's last login.",
+      ),
+      'status' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'Whether the user is active(1) or blocked(0).',
+      ),
+      'timezone' => array(
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => FALSE,
+        'description' => "User's time zone.",
+      ),
+      'language' => array(
+        'type' => 'varchar',
+        'length' => 12,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => "User's default language.",
+      ),
+      'picture' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => "Foreign key: {file_managed}.fid of user's picture.",
+      ),
+      'init' => array(
+        'type' => 'varchar',
+        'length' => 254,
+        'not null' => FALSE,
+        'default' => '',
+        'description' => 'E-mail address used for initial account creation.',
+      ),
+      'data' => array(
+        'type' => 'blob',
+        'not null' => FALSE,
+        'size' => 'big',
+        'serialize' => TRUE,
+        'description' => 'A serialized array of name value pairs that are related to the user. Any form values posted during user edit are stored and are loaded into the $user object during user_load(). Use of this field is discouraged and it will likely disappear in a future version of Drupal.',
+      ),
+    ),
+    'indexes' => array(
+      'access' => array('access'),
+      'created' => array('created'),
+      'mail' => array('mail'),
+      'picture' => array('picture'),
+    ),
+    'unique keys' => array(
+      'name' => array('name'),
+    ),
+    'primary key' => array('uid'),
+    'foreign keys' => array(
+      'signature_format' => array(
+        'table' => 'filter_format',
+        'columns' => array('signature_format' => 'format'),
+      ),
+    ),
+  );
+
+  $schema['users_roles'] = array(
+    'description' => 'Maps users to roles.',
+    'fields' => array(
+      'uid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Primary Key: {users}.uid for user.',
+      ),
+      'rid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Primary Key: {role}.rid for role.',
+      ),
+    ),
+    'primary key' => array('uid', 'rid'),
+    'indexes' => array(
+      'rid' => array('rid'),
+    ),
+    'foreign keys' => array(
+      'user' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid'),
+      ),
+      'role' => array(
+        'table' => 'roles',
+        'columns' => array('rid' => 'rid'),
+      ),
+    ),
+  );
+
+  return $schema;
+}
+
+/**
+ * Implements hook_install().
+ */
+function user_install() {
+  // Insert a row for the anonymous user.
+  db_insert('users')
+    ->fields(array(
+      'uid' => 0,
+      'name' => '',
+      'mail' => '',
+    ))
+    ->execute();
+
+  // We need some placeholders here as name and mail are uniques and data is
+  // presumed to be a serialized array. This will be changed by the settings
+  // form in the installer.
+  db_insert('users')
+    ->fields(array(
+      'uid' => 1,
+      'name' => 'placeholder-for-uid-1',
+      'mail' => 'placeholder-for-uid-1',
+      'created' => REQUEST_TIME,
+      'status' => 1,
+      'data' => NULL,
+    ))
+    ->execute();
+
+  // Built-in roles.
+  $rid_anonymous = db_insert('role')
+    ->fields(array('name' => 'anonymous user', 'weight' => 0))
+    ->execute();
+  $rid_authenticated = db_insert('role')
+    ->fields(array('name' => 'authenticated user', 'weight' => 1))
+    ->execute();
+
+  // Sanity check to ensure the anonymous and authenticated role IDs are the
+  // same as the drupal defined constants. In certain situations, this will
+  // not be true.
+  if ($rid_anonymous != DRUPAL_ANONYMOUS_RID) {
+    db_update('role')
+      ->fields(array('rid' => DRUPAL_ANONYMOUS_RID))
+      ->condition('rid', $rid_anonymous)
+      ->execute();
+  }
+  if ($rid_authenticated != DRUPAL_AUTHENTICATED_RID) {
+    db_update('role')
+      ->fields(array('rid' => DRUPAL_AUTHENTICATED_RID))
+      ->condition('rid', $rid_authenticated)
+      ->execute();
+  }
+}
+
+/**
+ * Implements hook_update_dependencies().
+ */
+function user_update_dependencies() {
+  // user_update_7006() updates data in the {role_permission} table, so it must
+  // run after system_update_7007(), which populates that table.
+  $dependencies['user'][7006] = array(
+    'system' => 7007,
+  );
+
+  // user_update_7010() needs to query the {filter_format} table to get a list
+  // of existing text formats, so it must run after filter_update_7000(), which
+  // creates that table.
+  $dependencies['user'][7010] = array(
+    'filter' => 7000,
+  );
+
+  // user_update_7012() uses the file API, which relies on the {file_managed}
+  // table, so it must run after system_update_7034(), which creates that
+  // table.
+  $dependencies['user'][7012] = array(
+    'system' => 7034,
+  );
+
+  // user_update_7013() uses the file usage API, which relies on the
+  // {file_usage} table, so it must run after system_update_7059(), which
+  // creates that table.
+  $dependencies['user'][7013] = array(
+    'system' => 7059,
+  );
+
+  return $dependencies;
+}
+
+/**
+ * Utility function: grant a set of permissions to a role during update.
+ *
+ * This function is valid for a database schema version 7000.
+ *
+ * @param $rid
+ *   The role ID.
+ * @param $permissions
+ *   An array of permissions names.
+ * @param $module
+ *   The name of the module defining the permissions.
+ * @ingroup update_api
+ */
+function _update_7000_user_role_grant_permissions($rid, array $permissions, $module) {
+  // Grant new permissions for the role.
+  foreach ($permissions as $name) {
+    db_merge('role_permission')
+      ->key(array(
+        'rid' => $rid,
+        'permission' => $name,
+      ))
+      ->fields(array(
+        'module' => $module,
+      ))
+      ->execute();
+  }
+}
+
+/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
+ * Increase the length of the password field to accommodate better hashes.
+ *
+ * Also re-hashes all current passwords to improve security. This may be a
+ * lengthy process, and is performed batch-wise.
+ */
+function user_update_7000(&$sandbox) {
+  $sandbox['#finished'] = 0;
+  // Lower than DRUPAL_HASH_COUNT to make the update run at a reasonable speed.
+  $hash_count_log2 = 11;
+  // Multi-part update.
+  if (!isset($sandbox['user_from'])) {
+    db_change_field('users', 'pass', 'pass', array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''));
+    $sandbox['user_from'] = 0;
+    $sandbox['user_count'] = db_query("SELECT COUNT(uid) FROM {users}")->fetchField();
+  }
+  else {
+    require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
+    //  Hash again all current hashed passwords.
+    $has_rows = FALSE;
+    // Update this many per page load.
+    $count = 1000;
+    $result = db_query_range("SELECT uid, pass FROM {users} WHERE uid > 0 ORDER BY uid", $sandbox['user_from'], $count);
+    foreach ($result as $account) {
+      $has_rows = TRUE;
+
+      // If the $account->pass value is not a MD5 hash (a 32 character
+      // hexadecimal string) then skip it.
+      if (!preg_match('/^[0-9a-f]{32}$/', $account->pass)) {
+        continue;
+      }
+
+      $new_hash = user_hash_password($account->pass, $hash_count_log2);
+      if ($new_hash) {
+        // Indicate an updated password.
+        $new_hash  = 'U' . $new_hash;
+        db_update('users')
+          ->fields(array('pass' => $new_hash))
+          ->condition('uid', $account->uid)
+          ->execute();
+      }
+    }
+    $sandbox['#finished'] = $sandbox['user_from']/$sandbox['user_count'];
+    $sandbox['user_from'] += $count;
+    if (!$has_rows) {
+      $sandbox['#finished'] = 1;
+      return t('User passwords rehashed to improve security');
+    }
+  }
+}
+
+/**
+ * Remove the 'threshold', 'mode' and 'sort' columns from the {users} table.
+ *
+ * These fields were previously used to store per-user comment settings.
+ */
+
+function user_update_7001() {
+  db_drop_field('users', 'threshold');
+  db_drop_field('users', 'mode');
+  db_drop_field('users', 'sort');
+}
+
+/**
+ * Convert user time zones from time zone offsets to time zone names.
+ */
+function user_update_7002(&$sandbox) {
+  $sandbox['#finished'] = 0;
+
+  // Multi-part update.
+  if (!isset($sandbox['user_from'])) {
+    db_change_field('users', 'timezone', 'timezone', array('type' => 'varchar', 'length' => 32, 'not null' => FALSE));
+    $sandbox['user_from'] = 0;
+    $sandbox['user_count'] = db_query("SELECT COUNT(uid) FROM {users}")->fetchField();
+    $sandbox['user_not_migrated'] = 0;
+  }
+  else {
+    $timezones = system_time_zones();
+    // Update this many per page load.
+    $count = 10000;
+    $contributed_date_module = db_field_exists('users', 'timezone_name');
+    $contributed_event_module = db_field_exists('users', 'timezone_id');
+
+    $results = db_query_range("SELECT uid FROM {users} ORDER BY uid", $sandbox['user_from'], $count);
+    foreach ($results as $account) {
+      $timezone = NULL;
+      // If the contributed Date module has created a users.timezone_name
+      // column, use this data to set each user's time zone.
+      if ($contributed_date_module) {
+        $date_timezone = db_query("SELECT timezone_name FROM {users} WHERE uid = :uid", array(':uid' => $account->uid))->fetchField();
+        if (isset($timezones[$date_timezone])) {
+          $timezone = $date_timezone;
+        }
+      }
+      // If the contributed Event module has stored user time zone information
+      // use that information to update the user accounts.
+      if (!$timezone && $contributed_event_module) {
+        try {
+          $event_timezone = db_query("SELECT t.name FROM {users} u LEFT JOIN {event_timezones} t ON u.timezone_id = t.timezone WHERE u.uid = :uid", array(':uid' => $account->uid))->fetchField();
+          $event_timezone = str_replace(' ', '_', $event_timezone);
+          if (isset($timezones[$event_timezone])) {
+            $timezone = $event_timezone;
+          }
+        }
+        catch (PDOException $e) {
+          // Ignore error if event_timezones table does not exist or unexpected
+          // schema found.
+        }
+      }
+      if ($timezone) {
+        db_update('users')
+          ->fields(array('timezone' => $timezone))
+          ->condition('uid', $account->uid)
+          ->execute();
+      }
+      else {
+        $sandbox['user_not_migrated']++;
+        db_update('users')
+          ->fields(array('timezone' => NULL))
+          ->condition('uid', $account->uid)
+          ->execute();
+      }
+      $sandbox['user_from']++;
+    }
+
+    $sandbox['#finished'] = $sandbox['user_from'] / $sandbox['user_count'];
+    if ($sandbox['user_from'] == $sandbox['user_count']) {
+      if ($sandbox['user_not_migrated'] > 0) {
+        variable_set('empty_timezone_message', 1);
+        drupal_set_message(format_string('Some user time zones have been emptied and need to be set to the correct values. Use the new <a href="@config-url">time zone options</a> to choose whether to remind users at login to set the correct time zone.', array('@config-url' => url('admin/config/regional/settings'))), 'warning');
+      }
+      return t('Migrated user time zones');
+    }
+  }
+}
+
+/**
+ * Update user settings for cancelling user accounts.
+ *
+ * Prior to 7.x, users were not able to cancel their accounts. When
+ * administrators deleted an account, all contents were assigned to uid 0,
+ * which is the same as the 'user_cancel_reassign' method now.
+ */
+function user_update_7003() {
+  // Set the default account cancellation method.
+  variable_set('user_cancel_method', 'user_cancel_reassign');
+  // Re-assign notification setting.
+  if ($setting = variable_get('user_mail_status_deleted_notify', FALSE)) {
+    variable_set('user_mail_status_canceled_notify', $setting);
+    variable_del('user_mail_status_deleted_notify');
+  }
+  // Re-assign "Account deleted" mail strings to "Account canceled" mail.
+  if ($setting = variable_get('user_mail_status_deleted_subject', FALSE)) {
+    variable_set('user_mail_status_canceled_subject', $setting);
+    variable_del('user_mail_status_deleted_subject');
+  }
+  if ($setting = variable_get('user_mail_status_deleted_body', FALSE)) {
+    variable_set('user_mail_status_canceled_body', $setting);
+    variable_del('user_mail_status_deleted_body');
+  }
+}
+
+/**
+ * Changes the users table to allow longer e-mail addresses.
+ */
+function user_update_7005(&$sandbox) {
+  $mail_field = array(
+    'type' => 'varchar',
+    'length' => 254,
+    'not null' => FALSE,
+    'default' => '',
+    'description' => "User's e-mail address.",
+  );
+  $init_field = array(
+    'type' => 'varchar',
+    'length' => 254,
+    'not null' => FALSE,
+    'default' => '',
+    'description' => 'E-mail address used for initial account creation.',
+  );
+  db_drop_index('users', 'mail');
+  db_change_field('users', 'mail', 'mail', $mail_field, array('indexes' => array('mail' => array('mail'))));
+  db_change_field('users', 'init', 'init', $init_field);
+}
+
+/**
+ * Add module data to {role_permission}.
+ */
+function user_update_7006(&$sandbox) {
+  $module_field = array(
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => TRUE,
+    'default' => '',
+    'description' => "The module declaring the permission.",
+  );
+  // Check that the field hasn't been updated in an aborted run of this
+  // update.
+  if (!db_field_exists('role_permission', 'module')) {
+    // Add a new field for the fid.
+    db_add_field('role_permission', 'module', $module_field);
+  }
+}
+
+/**
+ * Add a weight column to user roles.
+ */
+function user_update_7007() {
+  db_add_field('role', 'weight', array('type' => 'int', 'not null' => TRUE, 'default' => 0));
+  db_add_index('role', 'name_weight', array('name', 'weight'));
+}
+
+/**
+ * If 'user_register' variable was unset in Drupal 6, set it to be the same as
+ * the Drupal 6 default setting.
+ */
+function user_update_7008() {
+  if (!isset($GLOBALS['conf']['user_register'])) {
+    // Set to the Drupal 6 default, "visitors can create accounts".
+    variable_set('user_register', USER_REGISTER_VISITORS);
+  }
+}
+
+/**
+ * Converts fields that store serialized variables from text to blob.
+ */
+function user_update_7009() {
+  $spec = array(
+    'type' => 'blob',
+    'not null' => FALSE,
+    'size' => 'big',
+    'serialize' => TRUE,
+    'description' => 'A serialized array of name value pairs that are related to the user. Any form values posted during user edit are stored and are loaded into the $user object during user_load(). Use of this field is discouraged and it will likely disappear in a future version of Drupal.',
+  );
+  db_change_field('users', 'data', 'data', $spec);
+}
+
+/**
+ * Update the {user}.signature_format column.
+ */
+function user_update_7010() {
+  // Update the database column to allow NULL values.
+  db_change_field('users', 'signature_format', 'signature_format', array(
+    'type' => 'int',
+    'unsigned' => TRUE,
+    'not null' => FALSE,
+    'description' => 'The {filter_format}.format of the signature.',
+  ));
+
+  // Replace the signature format with NULL if the signature is empty and does
+  // not already have a stored text format.
+  //
+  // In Drupal 6, "0" (the former FILTER_FORMAT_DEFAULT constant) could be used
+  // to indicate this situation, but in Drupal 7, only NULL is supported. This
+  // update therefore preserves the ability of user accounts which were never
+  // given a signature (for example, if the site did not have user signatures
+  // enabled, or if the user never edited their account information) to not
+  // have a particular text format assumed for them the first time the
+  // signature is edited.
+  db_update('users')
+    ->fields(array('signature_format' => NULL))
+    ->condition('signature', '')
+    ->condition('signature_format', 0)
+    ->execute();
+
+  // There are a number of situations in which a Drupal 6 site could store
+  // content with a nonexistent text format. This includes text formats that
+  // had later been deleted, or non-empty content stored with a value of "0"
+  // (the former FILTER_FORMAT_DEFAULT constant). Drupal 6 would filter this
+  // content using whatever the site-wide default text format was at the moment
+  // the text was being displayed.
+  //
+  // In Drupal 7, this behavior is no longer supported, and all content must be
+  // stored with an explicit text format (or it will not be displayed when it
+  // is filtered). Therefore, to preserve the behavior of the site after the
+  // upgrade, we must replace all instances described above with the current
+  // value of the (old) site-wide default format at the moment of the upgrade.
+  $existing_formats = db_query("SELECT format FROM {filter_format}")->fetchCol();
+  $default_format = variable_get('filter_default_format', 1);
+  db_update('users')
+    ->fields(array('signature_format' => $default_format))
+    ->isNotNull('signature_format')
+    ->condition('signature_format', $existing_formats, 'NOT IN')
+    ->execute();
+}
+
+/**
+ * Placeholder function.
+ *
+ * As a fix for user_update_7011() not updating email templates to use the new
+ * tokens, user_update_7017() now targets email templates of Drupal 6 sites and
+ * already upgraded sites.
+ */
+function user_update_7011() {
+}
+
+/**
+ * Add the user's pictures to the {file_managed} table and make them managed
+ * files.
+ */
+function user_update_7012(&$sandbox) {
+
+  $picture_field = array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'default' => 0,
+    'description' => "Foreign key: {file_managed}.fid of user's picture.",
+  );
+
+  if (!isset($sandbox['progress'])) {
+    // Check that the field hasn't been updated in an aborted run of this
+    // update.
+    if (!db_field_exists('users', 'picture_fid')) {
+      // Add a new field for the fid.
+      db_add_field('users', 'picture_fid', $picture_field);
+    }
+
+    // Initialize batch update information.
+    $sandbox['progress'] = 0;
+    $sandbox['last_user_processed'] = -1;
+    $sandbox['max'] = db_query("SELECT COUNT(*) FROM {users} WHERE picture <> ''")->fetchField();
+  }
+
+  // As a batch operation move the photos into the {file_managed} table and
+  // update the {users} records.
+  $limit = 500;
+  $result = db_query_range("SELECT uid, picture FROM {users} WHERE picture <> '' AND uid > :uid ORDER BY uid", 0, $limit, array(':uid' => $sandbox['last_user_processed']));
+  foreach ($result as $user) {
+    // Don't bother adding files that don't exist.
+    if (file_exists($user->picture)) {
+
+      // Check if the file already exists.
+      $files = file_load_multiple(array(), array('uri' => $user->picture));
+      if (count($files)) {
+        $file = reset($files);
+      }
+      else {
+        // Create a file object.
+        $file = new stdClass();
+        $file->uri      = $user->picture;
+        $file->filename = drupal_basename($file->uri);
+        $file->filemime = file_get_mimetype($file->uri);
+        $file->uid      = $user->uid;
+        $file->status   = FILE_STATUS_PERMANENT;
+        $file = file_save($file);
+      }
+
+      db_update('users')
+        ->fields(array('picture_fid' => $file->fid))
+        ->condition('uid', $user->uid)
+        ->execute();
+    }
+
+    // Update our progress information for the batch update.
+    $sandbox['progress']++;
+    $sandbox['last_user_processed'] = $user->uid;
+  }
+
+  // Indicate our current progress to the batch update system. If there's no
+  // max value then there's nothing to update and we're finished.
+  $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);
+
+  // When we're finished, drop the old picture field and rename the new one to
+  // replace it.
+  if (isset($sandbox['#finished']) && $sandbox['#finished'] == 1) {
+    db_drop_field('users', 'picture');
+    db_change_field('users', 'picture_fid', 'picture', $picture_field);
+  }
+}
+
+/**
+ * Add user module file usage entries.
+ */
+function user_update_7013(&$sandbox) {
+  if (!isset($sandbox['progress'])) {
+    // Initialize batch update information.
+    $sandbox['progress'] = 0;
+    $sandbox['last_uid_processed'] = -1;
+    $sandbox['max'] = db_query("SELECT COUNT(*) FROM {users} u WHERE u.picture <> 0")->fetchField();
+  }
+
+  // Add usage entries for the user picture files.
+  $limit = 500;
+  $result = db_query_range('SELECT f.*, u.uid as user_uid FROM {users} u INNER JOIN {file_managed} f ON u.picture = f.fid WHERE u.picture <> 0 AND u.uid > :uid ORDER BY u.uid', 0, $limit, array(':uid' => $sandbox['last_uid_processed']))->fetchAllAssoc('fid', PDO::FETCH_ASSOC);
+  foreach ($result as $row) {
+    $uid = $row['user_uid'];
+    $file = (object) $row;
+    file_usage_add($file, 'user', 'user', $uid);
+
+    // Update our progress information for the batch update.
+    $sandbox['progress']++;
+    $sandbox['last_uid_processed'] = $uid;
+  }
+
+  // Indicate our current progress to the batch update system.
+  $sandbox['#finished'] = empty($sandbox['max']) || ($sandbox['progress'] / $sandbox['max']);
+}
+
+/**
+ * Rename the 'post comments without approval' permission.
+ *
+ * In Drupal 7, this permission has been renamed to 'skip comment approval'.
+ */
+function user_update_7014() {
+  db_update('role_permission')
+        ->fields(array('permission' => 'skip comment approval'))
+        ->condition('permission', 'post comments without approval')
+        ->execute();
+
+  return t("Renamed the 'post comments without approval' permission to 'skip comment approval'.");
+}
+
+/**
+ * Change {users}.signature_format into varchar.
+ */
+function user_update_7015() {
+  db_change_field('users', 'signature_format', 'signature_format', array(
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => FALSE,
+    'description' => 'The {filter_format}.format of the signature.',
+  ));
+}
+
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x".
+ */
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Update the database to match the schema.
+ */
+function user_update_7016() {
+  // Add field default.
+  db_change_field('users', 'uid', 'uid', array(
+    'type' => 'int',
+    'unsigned' => TRUE,
+    'not null' => TRUE,
+    'default' => 0,
+  ));
+}
+
+/**
+ * Update email templates to use new tokens.
+ *
+ * This function upgrades customized email templates from the old !token format
+ * to the new core tokens format. Additionally, in Drupal 7 we no longer e-mail
+ * plain text passwords to users, and there is no token for a plain text
+ * password in the new token system. Therefore, it also modifies any saved
+ * templates using the old '!password' token such that the token is removed, and
+ * displays a warning to users that they may need to go and modify the wording
+ * of their templates.
+ */
+function user_update_7017() {
+  $message = '';
+
+  $tokens = array(
+    '!site' => '[site:name]',
+    '!username' => '[user:name]',
+    '!mailto' => '[user:mail]',
+    '!login_uri' => '[site:login-url]',
+    '!uri_brief' => '[site:url-brief]',
+    '!edit_uri' => '[user:edit-url]',
+    '!login_url' => '[user:one-time-login-url]',
+    '!uri' => '[site:url]',
+    '!date' => '[date:medium]',
+    '!password' => '',
+  );
+
+  $result = db_select('variable', 'v')
+    ->fields('v', array('name'))
+    ->condition('name', db_like('user_mail_') . '%', 'LIKE')
+    ->execute();
+
+  foreach ($result as $row) {
+    // Use variable_get() to get the unserialized value for free.
+    if ($value = variable_get($row->name, FALSE)) {
+
+      if (empty($message) && (strpos($value, '!password') !== FALSE)) {
+        $message = t('The ability to send users their passwords in plain text has been removed in Drupal 7. Your existing email templates have been modified to remove it. You should <a href="@template-url">review these templates</a> to make sure they read properly.', array('@template-url' => url('admin/config/people/accounts')));
+      }
+
+      variable_set($row->name, str_replace(array_keys($tokens), $tokens, $value));
+    }
+  }
+
+  return $message;
+}
+
+/**
+ * Ensure there is an index on {users}.picture.
+ */
+function user_update_7018() {
+  if (!db_index_exists('users', 'picture')) {
+    db_add_index('users', 'picture', array('picture'));
+  }
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra".
+ */
diff --git a/htmltest/modules/user/user.js b/htmltest/modules/user/user.js
new file mode 100644
index 00000000..d182066a
--- /dev/null
+++ b/htmltest/modules/user/user.js
@@ -0,0 +1,196 @@
+(function ($) {
+
+/**
+ * Attach handlers to evaluate the strength of any password fields and to check
+ * that its confirmation is correct.
+ */
+Drupal.behaviors.password = {
+  attach: function (context, settings) {
+    var translate = settings.password;
+    $('input.password-field', context).once('password', function () {
+      var passwordInput = $(this);
+      var innerWrapper = $(this).parent();
+      var outerWrapper = $(this).parent().parent();
+
+      // Add identifying class to password element parent.
+      innerWrapper.addClass('password-parent');
+
+      // Add the password confirmation layer.
+      $('input.password-confirm', outerWrapper).parent().prepend('<div class="password-confirm">' + translate['confirmTitle'] + ' <span></span></div>').addClass('confirm-parent');
+      var confirmInput = $('input.password-confirm', outerWrapper);
+      var confirmResult = $('div.password-confirm', outerWrapper);
+      var confirmChild = $('span', confirmResult);
+
+      // Add the description box.
+      var passwordMeter = '<div class="password-strength"><div class="password-strength-text" aria-live="assertive"></div><div class="password-strength-title">' + translate['strengthTitle'] + '</div><div class="password-indicator"><div class="indicator"></div></div></div>';
+      $(confirmInput).parent().after('<div class="password-suggestions description"></div>');
+      $(innerWrapper).prepend(passwordMeter);
+      var passwordDescription = $('div.password-suggestions', outerWrapper).hide();
+
+      // Check the password strength.
+      var passwordCheck = function () {
+
+        // Evaluate the password strength.
+        var result = Drupal.evaluatePasswordStrength(passwordInput.val(), settings.password);
+
+        // Update the suggestions for how to improve the password.
+        if (passwordDescription.html() != result.message) {
+          passwordDescription.html(result.message);
+        }
+
+        // Only show the description box if there is a weakness in the password.
+        if (result.strength == 100) {
+          passwordDescription.hide();
+        }
+        else {
+          passwordDescription.show();
+        }
+
+        // Adjust the length of the strength indicator.
+        $(innerWrapper).find('.indicator').css('width', result.strength + '%');
+
+        // Update the strength indication text.
+        $(innerWrapper).find('.password-strength-text').html(result.indicatorText);
+
+        passwordCheckMatch();
+      };
+
+      // Check that password and confirmation inputs match.
+      var passwordCheckMatch = function () {
+
+        if (confirmInput.val()) {
+          var success = passwordInput.val() === confirmInput.val();
+
+          // Show the confirm result.
+          confirmResult.css({ visibility: 'visible' });
+
+          // Remove the previous styling if any exists.
+          if (this.confirmClass) {
+            confirmChild.removeClass(this.confirmClass);
+          }
+
+          // Fill in the success message and set the class accordingly.
+          var confirmClass = success ? 'ok' : 'error';
+          confirmChild.html(translate['confirm' + (success ? 'Success' : 'Failure')]).addClass(confirmClass);
+          this.confirmClass = confirmClass;
+        }
+        else {
+          confirmResult.css({ visibility: 'hidden' });
+        }
+      };
+
+      // Monitor keyup and blur events.
+      // Blur must be used because a mouse paste does not trigger keyup.
+      passwordInput.keyup(passwordCheck).focus(passwordCheck).blur(passwordCheck);
+      confirmInput.keyup(passwordCheckMatch).blur(passwordCheckMatch);
+    });
+  }
+};
+
+/**
+ * Evaluate the strength of a user's password.
+ *
+ * Returns the estimated strength and the relevant output message.
+ */
+Drupal.evaluatePasswordStrength = function (password, translate) {
+  var weaknesses = 0, strength = 100, msg = [];
+
+  var hasLowercase = /[a-z]+/.test(password);
+  var hasUppercase = /[A-Z]+/.test(password);
+  var hasNumbers = /[0-9]+/.test(password);
+  var hasPunctuation = /[^a-zA-Z0-9]+/.test(password);
+
+  // If there is a username edit box on the page, compare password to that, otherwise
+  // use value from the database.
+  var usernameBox = $('input.username');
+  var username = (usernameBox.length > 0) ? usernameBox.val() : translate.username;
+
+  // Lose 5 points for every character less than 6, plus a 30 point penalty.
+  if (password.length < 6) {
+    msg.push(translate.tooShort);
+    strength -= ((6 - password.length) * 5) + 30;
+  }
+
+  // Count weaknesses.
+  if (!hasLowercase) {
+    msg.push(translate.addLowerCase);
+    weaknesses++;
+  }
+  if (!hasUppercase) {
+    msg.push(translate.addUpperCase);
+    weaknesses++;
+  }
+  if (!hasNumbers) {
+    msg.push(translate.addNumbers);
+    weaknesses++;
+  }
+  if (!hasPunctuation) {
+    msg.push(translate.addPunctuation);
+    weaknesses++;
+  }
+
+  // Apply penalty for each weakness (balanced against length penalty).
+  switch (weaknesses) {
+    case 1:
+      strength -= 12.5;
+      break;
+
+    case 2:
+      strength -= 25;
+      break;
+
+    case 3:
+      strength -= 40;
+      break;
+
+    case 4:
+      strength -= 40;
+      break;
+  }
+
+  // Check if password is the same as the username.
+  if (password !== '' && password.toLowerCase() === username.toLowerCase()) {
+    msg.push(translate.sameAsUsername);
+    // Passwords the same as username are always very weak.
+    strength = 5;
+  }
+
+  // Based on the strength, work out what text should be shown by the password strength meter.
+  if (strength < 60) {
+    indicatorText = translate.weak;
+  } else if (strength < 70) {
+    indicatorText = translate.fair;
+  } else if (strength < 80) {
+    indicatorText = translate.good;
+  } else if (strength <= 100) {
+    indicatorText = translate.strong;
+  }
+
+  // Assemble the final message.
+  msg = translate.hasWeaknesses + '<ul><li>' + msg.join('</li><li>') + '</li></ul>';
+  return { strength: strength, message: msg, indicatorText: indicatorText };
+
+};
+
+/**
+ * Field instance settings screen: force the 'Display on registration form'
+ * checkbox checked whenever 'Required' is checked.
+ */
+Drupal.behaviors.fieldUserRegistration = {
+  attach: function (context, settings) {
+    var $checkbox = $('form#field-ui-field-edit-form input#edit-instance-settings-user-register-form');
+
+    if ($checkbox.length) {
+      $('input#edit-instance-required', context).once('user-register-form-checkbox', function () {
+        $(this).bind('change', function (e) {
+          if ($(this).attr('checked')) {
+            $checkbox.attr('checked', true);
+          }
+        });
+      });
+
+    }
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/user/user.module b/htmltest/modules/user/user.module
new file mode 100644
index 00000000..9668d3b0
--- /dev/null
+++ b/htmltest/modules/user/user.module
@@ -0,0 +1,4028 @@
+<?php
+
+/**
+ * @file
+ * Enables the user registration and login system.
+ */
+
+/**
+ * Maximum length of username text field.
+ */
+define('USERNAME_MAX_LENGTH', 60);
+
+/**
+ * Maximum length of user e-mail text field.
+ */
+define('EMAIL_MAX_LENGTH', 254);
+
+/**
+ * Only administrators can create user accounts.
+ */
+define('USER_REGISTER_ADMINISTRATORS_ONLY', 0);
+
+/**
+ * Visitors can create their own accounts.
+ */
+define('USER_REGISTER_VISITORS', 1);
+
+/**
+ * Visitors can create accounts, but they don't become active without
+ * administrative approval.
+ */
+define('USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL', 2);
+
+/**
+ * Implement hook_help().
+ */
+function user_help($path, $arg) {
+  global $user;
+
+  switch ($path) {
+    case 'admin/help#user':
+      $output = '';
+      $output .= '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The User module allows users to register, log in, and log out. It also allows users with proper permissions to manage user roles (used to classify users) and permissions associated with those roles. For more information, see the online handbook entry for <a href="@user">User module</a>.', array('@user' => 'http://drupal.org/documentation/modules/user')) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<dl>';
+      $output .= '<dt>' . t('Creating and managing users') . '</dt>';
+      $output .= '<dd>' . t('The User module allows users with the appropriate <a href="@permissions">permissions</a> to create user accounts through the <a href="@people">People administration page</a>, where they can also assign users to one or more roles, and block or delete user accounts. If allowed, users without accounts (anonymous users) can create their own accounts on the <a href="@register">Create new account</a> page.', array('@permissions' => url('admin/people/permissions', array('fragment' => 'module-user')), '@people' => url('admin/people'), '@register' => url('user/register'))) . '</dd>';
+      $output .= '<dt>' . t('User roles and permissions') . '</dt>';
+      $output .= '<dd>' . t('<em>Roles</em> are used to group and classify users; each user can be assigned one or more roles. By default there are two roles: <em>anonymous user</em> (users that are not logged in) and <em>authenticated user</em> (users that are registered and logged in). Depending on choices you made when you installed Drupal, the installation process may have defined more roles, and you can create additional custom roles on the <a href="@roles">Roles page</a>. After creating roles, you can set permissions for each role on the <a href="@permissions_user">Permissions page</a>. Granting a permission allows users who have been assigned a particular role to perform an action on the site, such as viewing a particular type of content, editing or creating content, administering settings for a particular module, or using a particular function of the site (such as search).', array('@permissions_user' => url('admin/people/permissions'), '@roles' => url('admin/people/permissions/roles'))) . '</dd>';
+      $output .= '<dt>' . t('Account settings') . '</dt>';
+      $output .= '<dd>' . t('The <a href="@accounts">Account settings page</a> allows you to manage settings for the displayed name of the anonymous user role, personal contact forms, user registration, and account cancellation. On this page you can also manage settings for account personalization (including signatures and user pictures), and adapt the text for the e-mail messages that are sent automatically during the user registration process.', array('@accounts'  => url('admin/config/people/accounts'))) . '</dd>';
+      $output .= '</dl>';
+      return $output;
+    case 'admin/people/create':
+      return '<p>' . t("This web page allows administrators to register new users. Users' e-mail addresses and usernames must be unique.") . '</p>';
+    case 'admin/people/permissions':
+      return '<p>' . t('Permissions let you control what users can do and see on your site. You can define a specific set of permissions for each role. (See the <a href="@role">Roles</a> page to create a role). Two important roles to consider are Authenticated Users and Administrators. Any permissions granted to the Authenticated Users role will be given to any user who can log into your site. You can make any role the Administrator role for the site, meaning this will be granted all new permissions automatically. You can do this on the <a href="@settings">User Settings</a> page. You should be careful to ensure that only trusted users are given this access and level of control of your site.', array('@role' => url('admin/people/permissions/roles'), '@settings' => url('admin/config/people/accounts'))) . '</p>';
+    case 'admin/people/permissions/roles':
+      $output = '<p>' . t('Roles allow you to fine tune the security and administration of Drupal. A role defines a group of users that have certain privileges as defined on the <a href="@permissions">permissions page</a>. Examples of roles include: anonymous user, authenticated user, moderator, administrator and so on. In this area you will define the names and order of the roles on your site. It is recommended to order your roles from least permissive (anonymous user) to most permissive (administrator). To delete a role choose "edit role".', array('@permissions' => url('admin/people/permissions'))) . '</p>';
+      $output .= '<p>' . t('By default, Drupal comes with two user roles:') . '</p>';
+      $output .= '<ul>';
+      $output .= '<li>' . t("Anonymous user: this role is used for users that don't have a user account or that are not authenticated.") . '</li>';
+      $output .= '<li>' . t('Authenticated user: this role is automatically granted to all logged in users.') . '</li>';
+      $output .= '</ul>';
+      return $output;
+    case 'admin/config/people/accounts/fields':
+      return '<p>' . t('This form lets administrators add, edit, and arrange fields for storing user data.') . '</p>';
+    case 'admin/config/people/accounts/display':
+      return '<p>' . t('This form lets administrators configure how fields should be displayed when rendering a user profile page.') . '</p>';
+    case 'admin/people/search':
+      return '<p>' . t('Enter a simple pattern ("*" may be used as a wildcard match) to search for a username or e-mail address. For example, one may search for "br" and Drupal might return "brian", "brad", and "brenda@example.com".') . '</p>';
+  }
+}
+
+/**
+ * Invokes a user hook in every module.
+ *
+ * We cannot use module_invoke() for this, because the arguments need to
+ * be passed by reference.
+ *
+ * @param $type
+ *   A text string that controls which user hook to invoke.  Valid choices are:
+ *   - cancel: Invokes hook_user_cancel().
+ *   - insert: Invokes hook_user_insert().
+ *   - login: Invokes hook_user_login().
+ *   - presave: Invokes hook_user_presave().
+ *   - update: Invokes hook_user_update().
+ * @param $edit
+ *   An associative array variable containing form values to be passed
+ *   as the first parameter of the hook function.
+ * @param $account
+ *   The user account object to be passed as the second parameter of the hook
+ *   function.
+ * @param $category
+ *   The category of user information being acted upon.
+ */
+function user_module_invoke($type, &$edit, $account, $category = NULL) {
+  foreach (module_implements('user_' . $type) as $module) {
+    $function = $module . '_user_' . $type;
+    $function($edit, $account, $category);
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function user_theme() {
+  return array(
+    'user_picture' => array(
+      'variables' => array('account' => NULL),
+      'template' => 'user-picture',
+    ),
+    'user_profile' => array(
+      'render element' => 'elements',
+      'template' => 'user-profile',
+      'file' => 'user.pages.inc',
+    ),
+    'user_profile_category' => array(
+      'render element' => 'element',
+      'template' => 'user-profile-category',
+      'file' => 'user.pages.inc',
+    ),
+    'user_profile_item' => array(
+      'render element' => 'element',
+      'template' => 'user-profile-item',
+      'file' => 'user.pages.inc',
+    ),
+    'user_list' => array(
+      'variables' => array('users' => NULL, 'title' => NULL),
+    ),
+    'user_admin_permissions' => array(
+      'render element' => 'form',
+      'file' => 'user.admin.inc',
+    ),
+    'user_admin_roles' => array(
+      'render element' => 'form',
+      'file' => 'user.admin.inc',
+    ),
+    'user_permission_description' => array(
+      'variables' => array('permission_item' => NULL, 'hide' => NULL),
+      'file' => 'user.admin.inc',
+    ),
+    'user_signature' => array(
+      'variables' => array('signature' => NULL),
+    ),
+  );
+}
+
+/**
+ * Implements hook_entity_info().
+ */
+function user_entity_info() {
+  $return = array(
+    'user' => array(
+      'label' => t('User'),
+      'controller class' => 'UserController',
+      'base table' => 'users',
+      'uri callback' => 'user_uri',
+      'label callback' => 'format_username',
+      'fieldable' => TRUE,
+      // $user->language is only the preferred user language for the user
+      // interface textual elements. As it is not necessarily related to the
+      // language assigned to fields, we do not define it as the entity language
+      // key.
+      'entity keys' => array(
+        'id' => 'uid',
+      ),
+      'bundles' => array(
+        'user' => array(
+          'label' => t('User'),
+          'admin' => array(
+            'path' => 'admin/config/people/accounts',
+            'access arguments' => array('administer users'),
+          ),
+        ),
+      ),
+      'view modes' => array(
+        'full' => array(
+          'label' => t('User account'),
+          'custom settings' => FALSE,
+        ),
+      ),
+    ),
+  );
+  return $return;
+}
+
+/**
+ * Implements callback_entity_info_uri().
+ */
+function user_uri($user) {
+  return array(
+    'path' => 'user/' . $user->uid,
+  );
+}
+
+/**
+ * Implements hook_field_info_alter().
+ */
+function user_field_info_alter(&$info) {
+  // Add the 'user_register_form' instance setting to all field types.
+  foreach ($info as $field_type => &$field_type_info) {
+    $field_type_info += array('instance_settings' => array());
+    $field_type_info['instance_settings'] += array(
+      'user_register_form' => FALSE,
+    );
+  }
+}
+
+/**
+ * Implements hook_field_extra_fields().
+ */
+function user_field_extra_fields() {
+  $return['user']['user'] = array(
+    'form' => array(
+      'account' => array(
+        'label' => t('User name and password'),
+        'description' => t('User module account form elements.'),
+        'weight' => -10,
+      ),
+      'timezone' => array(
+        'label' => t('Timezone'),
+        'description' => t('User module timezone form element.'),
+        'weight' => 6,
+      ),
+    ),
+    'display' => array(
+      'summary' => array(
+        'label' => t('History'),
+        'description' => t('User module history view element.'),
+        'weight' => 5,
+      ),
+    ),
+  );
+
+  return $return;
+}
+
+/**
+ * Fetches a user object based on an external authentication source.
+ *
+ * @param string $authname
+ *   The external authentication username.
+ *
+ * @return
+ *   A fully-loaded user object if the user is found or FALSE if not found.
+ */
+function user_external_load($authname) {
+  $uid = db_query("SELECT uid FROM {authmap} WHERE authname = :authname", array(':authname' => $authname))->fetchField();
+
+  if ($uid) {
+    return user_load($uid);
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
+ * Load multiple users based on certain conditions.
+ *
+ * This function should be used whenever you need to load more than one user
+ * from the database. Users are loaded into memory and will not require
+ * database access if loaded again during the same page request.
+ *
+ * @param $uids
+ *   An array of user IDs.
+ * @param $conditions
+ *   (deprecated) An associative array of conditions on the {users}
+ *   table, where the keys are the database fields and the values are the
+ *   values those fields must have. Instead, it is preferable to use
+ *   EntityFieldQuery to retrieve a list of entity IDs loadable by
+ *   this function.
+ * @param $reset
+ *   A boolean indicating that the internal cache should be reset. Use this if
+ *   loading a user object which has been altered during the page request.
+ *
+ * @return
+ *   An array of user objects, indexed by uid.
+ *
+ * @see entity_load()
+ * @see user_load()
+ * @see user_load_by_mail()
+ * @see user_load_by_name()
+ * @see EntityFieldQuery
+ *
+ * @todo Remove $conditions in Drupal 8.
+ */
+function user_load_multiple($uids = array(), $conditions = array(), $reset = FALSE) {
+  return entity_load('user', $uids, $conditions, $reset);
+}
+
+/**
+ * Controller class for users.
+ *
+ * This extends the DrupalDefaultEntityController class, adding required
+ * special handling for user objects.
+ */
+class UserController extends DrupalDefaultEntityController {
+
+  function attachLoad(&$queried_users, $revision_id = FALSE) {
+    // Build an array of user picture IDs so that these can be fetched later.
+    $picture_fids = array();
+    foreach ($queried_users as $key => $record) {
+      $picture_fids[] = $record->picture;
+      $queried_users[$key]->data = unserialize($record->data);
+      $queried_users[$key]->roles = array();
+      if ($record->uid) {
+        $queried_users[$record->uid]->roles[DRUPAL_AUTHENTICATED_RID] = 'authenticated user';
+      }
+      else {
+        $queried_users[$record->uid]->roles[DRUPAL_ANONYMOUS_RID] = 'anonymous user';
+      }
+    }
+
+    // Add any additional roles from the database.
+    $result = db_query('SELECT r.rid, r.name, ur.uid FROM {role} r INNER JOIN {users_roles} ur ON ur.rid = r.rid WHERE ur.uid IN (:uids)', array(':uids' => array_keys($queried_users)));
+    foreach ($result as $record) {
+      $queried_users[$record->uid]->roles[$record->rid] = $record->name;
+    }
+
+    // Add the full file objects for user pictures if enabled.
+    if (!empty($picture_fids) && variable_get('user_pictures', 0)) {
+      $pictures = file_load_multiple($picture_fids);
+      foreach ($queried_users as $account) {
+        if (!empty($account->picture) && isset($pictures[$account->picture])) {
+          $account->picture = $pictures[$account->picture];
+        }
+        else {
+          $account->picture = NULL;
+        }
+      }
+    }
+    // Call the default attachLoad() method. This will add fields and call
+    // hook_user_load().
+    parent::attachLoad($queried_users, $revision_id);
+  }
+}
+
+/**
+ * Loads a user object.
+ *
+ * Drupal has a global $user object, which represents the currently-logged-in
+ * user. So to avoid confusion and to avoid clobbering the global $user object,
+ * it is a good idea to assign the result of this function to a different local
+ * variable, generally $account. If you actually do want to act as the user you
+ * are loading, it is essential to call drupal_save_session(FALSE); first.
+ * See
+ * @link http://drupal.org/node/218104 Safely impersonating another user @endlink
+ * for more information.
+ *
+ * @param $uid
+ *   Integer specifying the user ID to load.
+ * @param $reset
+ *   TRUE to reset the internal cache and load from the database; FALSE
+ *   (default) to load from the internal cache, if set.
+ *
+ * @return
+ *   A fully-loaded user object upon successful user load, or FALSE if the user
+ *   cannot be loaded.
+ *
+ * @see user_load_multiple()
+ */
+function user_load($uid, $reset = FALSE) {
+  $users = user_load_multiple(array($uid), array(), $reset);
+  return reset($users);
+}
+
+/**
+ * Fetch a user object by email address.
+ *
+ * @param $mail
+ *   String with the account's e-mail address.
+ * @return
+ *   A fully-loaded $user object upon successful user load or FALSE if user
+ *   cannot be loaded.
+ *
+ * @see user_load_multiple()
+ */
+function user_load_by_mail($mail) {
+  $users = user_load_multiple(array(), array('mail' => $mail));
+  return reset($users);
+}
+
+/**
+ * Fetch a user object by account name.
+ *
+ * @param $name
+ *   String with the account's user name.
+ * @return
+ *   A fully-loaded $user object upon successful user load or FALSE if user
+ *   cannot be loaded.
+ *
+ * @see user_load_multiple()
+ */
+function user_load_by_name($name) {
+  $users = user_load_multiple(array(), array('name' => $name));
+  return reset($users);
+}
+
+/**
+ * Save changes to a user account or add a new user.
+ *
+ * @param $account
+ *   (optional) The user object to modify or add. If you want to modify
+ *   an existing user account, you will need to ensure that (a) $account
+ *   is an object, and (b) you have set $account->uid to the numeric
+ *   user ID of the user account you wish to modify. If you
+ *   want to create a new user account, you can set $account->is_new to
+ *   TRUE or omit the $account->uid field.
+ * @param $edit
+ *   An array of fields and values to save. For example array('name'
+ *   => 'My name'). Key / value pairs added to the $edit['data'] will be
+ *   serialized and saved in the {users.data} column.
+ * @param $category
+ *   (optional) The category for storing profile information in.
+ *
+ * @return
+ *   A fully-loaded $user object upon successful save or FALSE if the save failed.
+ *
+ * @todo D8: Drop $edit and fix user_save() to be consistent with others.
+ */
+function user_save($account, $edit = array(), $category = 'account') {
+  $transaction = db_transaction();
+  try {
+    if (!empty($edit['pass'])) {
+      // Allow alternate password hashing schemes.
+      require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
+      $edit['pass'] = user_hash_password(trim($edit['pass']));
+      // Abort if the hashing failed and returned FALSE.
+      if (!$edit['pass']) {
+        return FALSE;
+      }
+    }
+    else {
+      // Avoid overwriting an existing password with a blank password.
+      unset($edit['pass']);
+    }
+    if (isset($edit['mail'])) {
+      $edit['mail'] = trim($edit['mail']);
+    }
+
+    // Load the stored entity, if any.
+    if (!empty($account->uid) && !isset($account->original)) {
+      $account->original = entity_load_unchanged('user', $account->uid);
+    }
+
+    if (empty($account)) {
+      $account = new stdClass();
+    }
+    if (!isset($account->is_new)) {
+      $account->is_new = empty($account->uid);
+    }
+    // Prepopulate $edit['data'] with the current value of $account->data.
+    // Modules can add to or remove from this array in hook_user_presave().
+    if (!empty($account->data)) {
+      $edit['data'] = !empty($edit['data']) ? array_merge($account->data, $edit['data']) : $account->data;
+    }
+
+    // Invoke hook_user_presave() for all modules.
+    user_module_invoke('presave', $edit, $account, $category);
+
+    // Invoke presave operations of Field Attach API and Entity API. Those APIs
+    // require a fully-fledged and updated entity object. Therefore, we need to
+    // copy any new property values of $edit into it.
+    foreach ($edit as $key => $value) {
+      $account->$key = $value;
+    }
+    field_attach_presave('user', $account);
+    module_invoke_all('entity_presave', $account, 'user');
+
+    if (is_object($account) && !$account->is_new) {
+      // Process picture uploads.
+      if (!empty($account->picture->fid) && (!isset($account->original->picture->fid) || $account->picture->fid != $account->original->picture->fid)) {
+        $picture = $account->picture;
+        // If the picture is a temporary file move it to its final location and
+        // make it permanent.
+        if (!$picture->status) {
+          $info = image_get_info($picture->uri);
+          $picture_directory =  file_default_scheme() . '://' . variable_get('user_picture_path', 'pictures');
+
+          // Prepare the pictures directory.
+          file_prepare_directory($picture_directory, FILE_CREATE_DIRECTORY);
+          $destination = file_stream_wrapper_uri_normalize($picture_directory . '/picture-' . $account->uid . '-' . REQUEST_TIME . '.' . $info['extension']);
+
+          // Move the temporary file into the final location.
+          if ($picture = file_move($picture, $destination, FILE_EXISTS_RENAME)) {
+            $picture->status = FILE_STATUS_PERMANENT;
+            $account->picture = file_save($picture);
+            file_usage_add($picture, 'user', 'user', $account->uid);
+          }
+        }
+        // Delete the previous picture if it was deleted or replaced.
+        if (!empty($account->original->picture->fid)) {
+          file_usage_delete($account->original->picture, 'user', 'user', $account->uid);
+          file_delete($account->original->picture);
+        }
+      }
+      elseif (isset($edit['picture_delete']) && $edit['picture_delete']) {
+        file_usage_delete($account->original->picture, 'user', 'user', $account->uid);
+        file_delete($account->original->picture);
+      }
+      $account->picture = empty($account->picture->fid) ? 0 : $account->picture->fid;
+
+      // Do not allow 'uid' to be changed.
+      $account->uid = $account->original->uid;
+      // Save changes to the user table.
+      $success = drupal_write_record('users', $account, 'uid');
+      if ($success === FALSE) {
+        // The query failed - better to abort the save than risk further
+        // data loss.
+        return FALSE;
+      }
+
+      // Reload user roles if provided.
+      if ($account->roles != $account->original->roles) {
+        db_delete('users_roles')
+          ->condition('uid', $account->uid)
+          ->execute();
+
+        $query = db_insert('users_roles')->fields(array('uid', 'rid'));
+        foreach (array_keys($account->roles) as $rid) {
+          if (!in_array($rid, array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID))) {
+            $query->values(array(
+              'uid' => $account->uid,
+              'rid' => $rid,
+            ));
+          }
+        }
+        $query->execute();
+      }
+
+      // Delete a blocked user's sessions to kick them if they are online.
+      if ($account->original->status != $account->status && $account->status == 0) {
+        drupal_session_destroy_uid($account->uid);
+      }
+
+      // If the password changed, delete all open sessions and recreate
+      // the current one.
+      if ($account->pass != $account->original->pass) {
+        drupal_session_destroy_uid($account->uid);
+        if ($account->uid == $GLOBALS['user']->uid) {
+          drupal_session_regenerate();
+        }
+      }
+
+      // Save Field data.
+      field_attach_update('user', $account);
+
+      // Send emails after we have the new user object.
+      if ($account->status != $account->original->status) {
+        // The user's status is changing; conditionally send notification email.
+        $op = $account->status == 1 ? 'status_activated' : 'status_blocked';
+        _user_mail_notify($op, $account);
+      }
+
+      // Update $edit with any interim changes to $account.
+      foreach ($account as $key => $value) {
+        if (!property_exists($account->original, $key) || $value !== $account->original->$key) {
+          $edit[$key] = $value;
+        }
+      }
+      user_module_invoke('update', $edit, $account, $category);
+      module_invoke_all('entity_update', $account, 'user');
+    }
+    else {
+      // Allow 'uid' to be set by the caller. There is no danger of writing an
+      // existing user as drupal_write_record will do an INSERT.
+      if (empty($account->uid)) {
+        $account->uid = db_next_id(db_query('SELECT MAX(uid) FROM {users}')->fetchField());
+      }
+      // Allow 'created' to be set by the caller.
+      if (!isset($account->created)) {
+        $account->created = REQUEST_TIME;
+      }
+      $success = drupal_write_record('users', $account);
+      if ($success === FALSE) {
+        // On a failed INSERT some other existing user's uid may be returned.
+        // We must abort to avoid overwriting their account.
+        return FALSE;
+      }
+
+      // Make sure $account is properly initialized.
+      $account->roles[DRUPAL_AUTHENTICATED_RID] = 'authenticated user';
+
+      field_attach_insert('user', $account);
+      $edit = (array) $account;
+      user_module_invoke('insert', $edit, $account, $category);
+      module_invoke_all('entity_insert', $account, 'user');
+
+      // Save user roles.
+      if (count($account->roles) > 1) {
+        $query = db_insert('users_roles')->fields(array('uid', 'rid'));
+        foreach (array_keys($account->roles) as $rid) {
+          if (!in_array($rid, array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID))) {
+            $query->values(array(
+              'uid' => $account->uid,
+              'rid' => $rid,
+            ));
+          }
+        }
+        $query->execute();
+      }
+    }
+    // Clear internal properties.
+    unset($account->is_new);
+    unset($account->original);
+    // Clear the static loading cache.
+    entity_get_controller('user')->resetCache(array($account->uid));
+
+    return $account;
+  }
+  catch (Exception $e) {
+    $transaction->rollback();
+    watchdog_exception('user', $e);
+    throw $e;
+  }
+}
+
+/**
+ * Verify the syntax of the given name.
+ */
+function user_validate_name($name) {
+  if (!$name) {
+    return t('You must enter a username.');
+  }
+  if (substr($name, 0, 1) == ' ') {
+    return t('The username cannot begin with a space.');
+  }
+  if (substr($name, -1) == ' ') {
+    return t('The username cannot end with a space.');
+  }
+  if (strpos($name, '  ') !== FALSE) {
+    return t('The username cannot contain multiple spaces in a row.');
+  }
+  if (preg_match('/[^\x{80}-\x{F7} a-z0-9@_.\'-]/i', $name)) {
+    return t('The username contains an illegal character.');
+  }
+  if (preg_match('/[\x{80}-\x{A0}' .         // Non-printable ISO-8859-1 + NBSP
+                  '\x{AD}' .                // Soft-hyphen
+                  '\x{2000}-\x{200F}' .     // Various space characters
+                  '\x{2028}-\x{202F}' .     // Bidirectional text overrides
+                  '\x{205F}-\x{206F}' .     // Various text hinting characters
+                  '\x{FEFF}' .              // Byte order mark
+                  '\x{FF01}-\x{FF60}' .     // Full-width latin
+                  '\x{FFF9}-\x{FFFD}' .     // Replacement characters
+                  '\x{0}-\x{1F}]/u',        // NULL byte and control characters
+                  $name)) {
+    return t('The username contains an illegal character.');
+  }
+  if (drupal_strlen($name) > USERNAME_MAX_LENGTH) {
+    return t('The username %name is too long: it must be %max characters or less.', array('%name' => $name, '%max' => USERNAME_MAX_LENGTH));
+  }
+}
+
+/**
+ * Validates a user's email address.
+ *
+ * Checks that a user's email address exists and follows all standard
+ * validation rules. Returns error messages when the address is invalid.
+ *
+ * @param $mail
+ *   A user's email address.
+ *
+ * @return
+ *   If the address is invalid, a human-readable error message is returned.
+ *   If the address is valid, nothing is returned.
+ */
+function user_validate_mail($mail) {
+  if (!$mail) {
+    return t('You must enter an e-mail address.');
+  }
+  if (!valid_email_address($mail)) {
+    return t('The e-mail address %mail is not valid.', array('%mail' => $mail));
+  }
+}
+
+/**
+ * Validates an image uploaded by a user.
+ *
+ * @see user_account_form()
+ */
+function user_validate_picture(&$form, &$form_state) {
+  // If required, validate the uploaded picture.
+  $validators = array(
+    'file_validate_is_image' => array(),
+    'file_validate_image_resolution' => array(variable_get('user_picture_dimensions', '85x85')),
+    'file_validate_size' => array(variable_get('user_picture_file_size', '30') * 1024),
+  );
+
+  // Save the file as a temporary file.
+  $file = file_save_upload('picture_upload', $validators);
+  if ($file === FALSE) {
+    form_set_error('picture_upload', t("Failed to upload the picture image; the %directory directory doesn't exist or is not writable.", array('%directory' => variable_get('user_picture_path', 'pictures'))));
+  }
+  elseif ($file !== NULL) {
+    $form_state['values']['picture_upload'] = $file;
+  }
+}
+
+/**
+ * Generate a random alphanumeric password.
+ */
+function user_password($length = 10) {
+  // This variable contains the list of allowable characters for the
+  // password. Note that the number 0 and the letter 'O' have been
+  // removed to avoid confusion between the two. The same is true
+  // of 'I', 1, and 'l'.
+  $allowable_characters = 'abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789';
+
+  // Zero-based count of characters in the allowable list:
+  $len = strlen($allowable_characters) - 1;
+
+  // Declare the password as a blank string.
+  $pass = '';
+
+  // Loop the number of times specified by $length.
+  for ($i = 0; $i < $length; $i++) {
+    do {
+      // Find a secure random number within the range needed.
+      $index = ord(drupal_random_bytes(1));
+    } while ($index > $len);
+
+    // Each iteration, pick a random character from the
+    // allowable string and append it to the password:
+    $pass .= $allowable_characters[$index];
+  }
+
+  return $pass;
+}
+
+/**
+ * Determine the permissions for one or more roles.
+ *
+ * @param $roles
+ *   An array whose keys are the role IDs of interest, such as $user->roles.
+ *
+ * @return
+ *   An array indexed by role ID. Each value is an array whose keys are the
+ *   permission strings for the given role ID.
+ */
+function user_role_permissions($roles = array()) {
+  $cache = &drupal_static(__FUNCTION__, array());
+
+  $role_permissions = $fetch = array();
+
+  if ($roles) {
+    foreach ($roles as $rid => $name) {
+      if (isset($cache[$rid])) {
+        $role_permissions[$rid] = $cache[$rid];
+      }
+      else {
+        // Add this rid to the list of those needing to be fetched.
+        $fetch[] = $rid;
+        // Prepare in case no permissions are returned.
+        $cache[$rid] = array();
+      }
+    }
+
+    if ($fetch) {
+      // Get from the database permissions that were not in the static variable.
+      // Only role IDs with at least one permission assigned will return rows.
+      $result = db_query("SELECT rid, permission FROM {role_permission} WHERE rid IN (:fetch)", array(':fetch' => $fetch));
+
+      foreach ($result as $row) {
+        $cache[$row->rid][$row->permission] = TRUE;
+      }
+      foreach ($fetch as $rid) {
+        // For every rid, we know we at least assigned an empty array.
+        $role_permissions[$rid] = $cache[$rid];
+      }
+    }
+  }
+
+  return $role_permissions;
+}
+
+/**
+ * Determine whether the user has a given privilege.
+ *
+ * @param $string
+ *   The permission, such as "administer nodes", being checked for.
+ * @param $account
+ *   (optional) The account to check, if not given use currently logged in user.
+ *
+ * @return
+ *   Boolean TRUE if the current user has the requested permission.
+ *
+ * All permission checks in Drupal should go through this function. This
+ * way, we guarantee consistent behavior, and ensure that the superuser
+ * can perform all actions.
+ */
+function user_access($string, $account = NULL) {
+  global $user;
+
+  if (!isset($account)) {
+    $account = $user;
+  }
+
+  // User #1 has all privileges:
+  if ($account->uid == 1) {
+    return TRUE;
+  }
+
+  // To reduce the number of SQL queries, we cache the user's permissions
+  // in a static variable.
+  // Use the advanced drupal_static() pattern, since this is called very often.
+  static $drupal_static_fast;
+  if (!isset($drupal_static_fast)) {
+    $drupal_static_fast['perm'] = &drupal_static(__FUNCTION__);
+  }
+  $perm = &$drupal_static_fast['perm'];
+  if (!isset($perm[$account->uid])) {
+    $role_permissions = user_role_permissions($account->roles);
+
+    $perms = array();
+    foreach ($role_permissions as $one_role) {
+      $perms += $one_role;
+    }
+    $perm[$account->uid] = $perms;
+  }
+
+  return isset($perm[$account->uid][$string]);
+}
+
+/**
+ * Checks for usernames blocked by user administration.
+ *
+ * @param $name
+ *   A string containing a name of the user.
+ *
+ * @return
+ *   Object with property 'name' (the user name), if the user is blocked;
+ *   FALSE if the user is not blocked.
+ */
+function user_is_blocked($name) {
+  return db_select('users')
+    ->fields('users', array('name'))
+    ->condition('name', db_like($name), 'LIKE')
+    ->condition('status', 0)
+    ->execute()->fetchObject();
+}
+
+/**
+ * Implements hook_permission().
+ */
+function user_permission() {
+  return array(
+    'administer permissions' =>  array(
+      'title' => t('Administer permissions'),
+      'restrict access' => TRUE,
+    ),
+    'administer users' => array(
+      'title' => t('Administer users'),
+      'restrict access' => TRUE,
+    ),
+    'access user profiles' => array(
+      'title' => t('View user profiles'),
+    ),
+    'change own username' => array(
+      'title' => t('Change own username'),
+    ),
+    'cancel account' => array(
+      'title' => t('Cancel own user account'),
+      'description' => t('Note: content may be kept, unpublished, deleted or transferred to the %anonymous-name user depending on the configured <a href="@user-settings-url">user settings</a>.', array('%anonymous-name' => variable_get('anonymous', t('Anonymous')), '@user-settings-url' => url('admin/config/people/accounts'))),
+    ),
+    'select account cancellation method' => array(
+      'title' => t('Select method for cancelling own account'),
+      'restrict access' => TRUE,
+    ),
+  );
+}
+
+/**
+ * Implements hook_file_download().
+ *
+ * Ensure that user pictures (avatars) are always downloadable.
+ */
+function user_file_download($uri) {
+  if (strpos(file_uri_target($uri), variable_get('user_picture_path', 'pictures') . '/picture-') === 0) {
+    $info = image_get_info($uri);
+    return array('Content-Type' => $info['mime_type']);
+  }
+}
+
+/**
+ * Implements hook_file_move().
+ */
+function user_file_move($file, $source) {
+  // If a user's picture is replaced with a new one, update the record in
+  // the users table.
+  if (isset($file->fid) && isset($source->fid) && $file->fid != $source->fid) {
+    db_update('users')
+      ->fields(array(
+        'picture' => $file->fid,
+      ))
+      ->condition('picture', $source->fid)
+      ->execute();
+  }
+}
+
+/**
+ * Implements hook_file_delete().
+ */
+function user_file_delete($file) {
+  // Remove any references to the file.
+  db_update('users')
+    ->fields(array('picture' => 0))
+    ->condition('picture', $file->fid)
+    ->execute();
+}
+
+/**
+ * Implements hook_search_info().
+ */
+function user_search_info() {
+  return array(
+    'title' => 'Users',
+  );
+}
+
+/**
+ * Implements hook_search_access().
+ */
+function user_search_access() {
+  return user_access('access user profiles');
+}
+
+/**
+ * Implements hook_search_execute().
+ */
+function user_search_execute($keys = NULL, $conditions = NULL) {
+  $find = array();
+  // Replace wildcards with MySQL/PostgreSQL wildcards.
+  $keys = preg_replace('!\*+!', '%', $keys);
+  $query = db_select('users')->extend('PagerDefault');
+  $query->fields('users', array('uid'));
+  if (user_access('administer users')) {
+    // Administrators can also search in the otherwise private email field,
+    // and they don't need to be restricted to only active users.
+    $query->fields('users', array('mail'));
+    $query->condition(db_or()->
+      condition('name', '%' . db_like($keys) . '%', 'LIKE')->
+      condition('mail', '%' . db_like($keys) . '%', 'LIKE'));
+  }
+  else {
+    // Regular users can only search via usernames, and we do not show them
+    // blocked accounts.
+    $query->condition('name', '%' . db_like($keys) . '%', 'LIKE')
+      ->condition('status', 1);
+  }
+  $uids = $query
+    ->limit(15)
+    ->execute()
+    ->fetchCol();
+  $accounts = user_load_multiple($uids);
+
+  $results = array();
+  foreach ($accounts as $account) {
+    $result = array(
+      'title' => format_username($account),
+      'link' => url('user/' . $account->uid, array('absolute' => TRUE)),
+    );
+    if (user_access('administer users')) {
+      $result['title'] .= ' (' . $account->mail . ')';
+    }
+    $results[] = $result;
+  }
+
+  return $results;
+}
+
+/**
+ * Implements hook_element_info().
+ */
+function user_element_info() {
+  $types['user_profile_category'] = array(
+    '#theme_wrappers' => array('user_profile_category'),
+  );
+  $types['user_profile_item'] = array(
+    '#theme' => 'user_profile_item',
+  );
+  return $types;
+}
+
+/**
+ * Implements hook_user_view().
+ */
+function user_user_view($account) {
+  $account->content['user_picture'] = array(
+    '#markup' => theme('user_picture', array('account' => $account)),
+    '#weight' => -10,
+  );
+  if (!isset($account->content['summary'])) {
+    $account->content['summary'] = array();
+  }
+  $account->content['summary'] += array(
+    '#type' => 'user_profile_category',
+    '#attributes' => array('class' => array('user-member')),
+    '#weight' => 5,
+    '#title' => t('History'),
+  );
+  $account->content['summary']['member_for'] = array(
+    '#type' => 'user_profile_item',
+    '#title' => t('Member for'),
+    '#markup' => format_interval(REQUEST_TIME - $account->created),
+  );
+}
+
+/**
+ * Helper function to add default user account fields to user registration and edit form.
+ *
+ * @see user_account_form_validate()
+ * @see user_validate_current_pass()
+ * @see user_validate_picture()
+ * @see user_validate_mail()
+ */
+function user_account_form(&$form, &$form_state) {
+  global $user;
+
+  $account = $form['#user'];
+  $register = ($form['#user']->uid > 0 ? FALSE : TRUE);
+
+  $admin = user_access('administer users');
+
+  $form['#validate'][] = 'user_account_form_validate';
+
+  // Account information.
+  $form['account'] = array(
+    '#type'   => 'container',
+    '#weight' => -10,
+  );
+  // Only show name field on registration form or user can change own username.
+  $form['account']['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Username'),
+    '#maxlength' => USERNAME_MAX_LENGTH,
+    '#description' => t('Spaces are allowed; punctuation is not allowed except for periods, hyphens, apostrophes, and underscores.'),
+    '#required' => TRUE,
+    '#attributes' => array('class' => array('username')),
+    '#default_value' => (!$register ? $account->name : ''),
+    '#access' => ($register || ($user->uid == $account->uid && user_access('change own username')) || $admin),
+    '#weight' => -10,
+  );
+
+  $form['account']['mail'] = array(
+    '#type' => 'textfield',
+    '#title' => t('E-mail address'),
+    '#maxlength' => EMAIL_MAX_LENGTH,
+    '#description' => t('A valid e-mail address. All e-mails from the system will be sent to this address. The e-mail address is not made public and will only be used if you wish to receive a new password or wish to receive certain news or notifications by e-mail.'),
+    '#required' => TRUE,
+    '#default_value' => (!$register ? $account->mail : ''),
+  );
+
+  // Display password field only for existing users or when user is allowed to
+  // assign a password during registration.
+  if (!$register) {
+    $form['account']['pass'] = array(
+      '#type' => 'password_confirm',
+      '#size' => 25,
+      '#description' => t('To change the current user password, enter the new password in both fields.'),
+    );
+    // To skip the current password field, the user must have logged in via a
+    // one-time link and have the token in the URL.
+    $pass_reset = isset($_SESSION['pass_reset_' . $account->uid]) && isset($_GET['pass-reset-token']) && ($_GET['pass-reset-token'] == $_SESSION['pass_reset_' . $account->uid]);
+    $protected_values = array();
+    $current_pass_description = '';
+    // The user may only change their own password without their current
+    // password if they logged in via a one-time login link.
+    if (!$pass_reset) {
+      $protected_values['mail'] = $form['account']['mail']['#title'];
+      $protected_values['pass'] = t('Password');
+      $request_new = l(t('Request new password'), 'user/password', array('attributes' => array('title' => t('Request new password via e-mail.'))));
+      $current_pass_description = t('Enter your current password to change the %mail or %pass. !request_new.', array('%mail' => $protected_values['mail'], '%pass' => $protected_values['pass'], '!request_new' => $request_new));
+    }
+    // The user must enter their current password to change to a new one.
+    if ($user->uid == $account->uid) {
+      $form['account']['current_pass_required_values'] = array(
+        '#type' => 'value',
+        '#value' => $protected_values,
+      );
+      $form['account']['current_pass'] = array(
+        '#type' => 'password',
+        '#title' => t('Current password'),
+        '#size' => 25,
+        '#access' => !empty($protected_values),
+        '#description' => $current_pass_description,
+        '#weight' => -5,
+        // Do not let web browsers remember this password, since we are trying
+        // to confirm that the person submitting the form actually knows the
+        // current one.
+        '#attributes' => array('autocomplete' => 'off'),
+      );
+      $form['#validate'][] = 'user_validate_current_pass';
+    }
+  }
+  elseif (!variable_get('user_email_verification', TRUE) || $admin) {
+    $form['account']['pass'] = array(
+      '#type' => 'password_confirm',
+      '#size' => 25,
+      '#description' => t('Provide a password for the new account in both fields.'),
+      '#required' => TRUE,
+    );
+  }
+
+  if ($admin) {
+    $status = isset($account->status) ? $account->status : 1;
+  }
+  else {
+    $status = $register ? variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL) == USER_REGISTER_VISITORS : $account->status;
+  }
+  $form['account']['status'] = array(
+    '#type' => 'radios',
+    '#title' => t('Status'),
+    '#default_value' => $status,
+    '#options' => array(t('Blocked'), t('Active')),
+    '#access' => $admin,
+  );
+
+  $roles = array_map('check_plain', user_roles(TRUE));
+  // The disabled checkbox subelement for the 'authenticated user' role
+  // must be generated separately and added to the checkboxes element,
+  // because of a limitation in Form API not supporting a single disabled
+  // checkbox within a set of checkboxes.
+  // @todo This should be solved more elegantly. See issue #119038.
+  $checkbox_authenticated = array(
+    '#type' => 'checkbox',
+    '#title' => $roles[DRUPAL_AUTHENTICATED_RID],
+    '#default_value' => TRUE,
+    '#disabled' => TRUE,
+  );
+  unset($roles[DRUPAL_AUTHENTICATED_RID]);
+  $form['account']['roles'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Roles'),
+    '#default_value' => (!$register && isset($account->roles) ? array_keys($account->roles) : array()),
+    '#options' => $roles,
+    '#access' => $roles && user_access('administer permissions'),
+    DRUPAL_AUTHENTICATED_RID => $checkbox_authenticated,
+  );
+
+  $form['account']['notify'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Notify user of new account'),
+    '#access' => $register && $admin,
+  );
+
+  // Signature.
+  $form['signature_settings'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Signature settings'),
+    '#weight' => 1,
+    '#access' => (!$register && variable_get('user_signatures', 0)),
+  );
+
+  $form['signature_settings']['signature'] = array(
+    '#type' => 'text_format',
+    '#title' => t('Signature'),
+    '#default_value' => isset($account->signature) ? $account->signature : '',
+    '#description' => t('Your signature will be publicly displayed at the end of your comments.'),
+    '#format' => isset($account->signature_format) ? $account->signature_format : NULL,
+  );
+
+  // Picture/avatar.
+  $form['picture'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Picture'),
+    '#weight' => 1,
+    '#access' => (!$register && variable_get('user_pictures', 0)),
+  );
+  $form['picture']['picture'] = array(
+    '#type' => 'value',
+    '#value' => isset($account->picture) ? $account->picture : NULL,
+  );
+  $form['picture']['picture_current'] = array(
+    '#markup' => theme('user_picture', array('account' => $account)),
+  );
+  $form['picture']['picture_delete'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Delete picture'),
+    '#access' => !empty($account->picture->fid),
+    '#description' => t('Check this box to delete your current picture.'),
+  );
+  $form['picture']['picture_upload'] = array(
+    '#type' => 'file',
+    '#title' => t('Upload picture'),
+    '#size' => 48,
+    '#description' => t('Your virtual face or picture. Pictures larger than @dimensions pixels will be scaled down.', array('@dimensions' => variable_get('user_picture_dimensions', '85x85'))) . ' ' . filter_xss_admin(variable_get('user_picture_guidelines', '')),
+  );
+  $form['#validate'][] = 'user_validate_picture';
+}
+
+/**
+ * Form validation handler for the current password on the user_account_form().
+ *
+ * @see user_account_form()
+ */
+function user_validate_current_pass(&$form, &$form_state) {
+  $account = $form['#user'];
+  foreach ($form_state['values']['current_pass_required_values'] as $key => $name) {
+    // This validation only works for required textfields (like mail) or
+    // form values like password_confirm that have their own validation
+    // that prevent them from being empty if they are changed.
+    if ((strlen(trim($form_state['values'][$key])) > 0) && ($form_state['values'][$key] != $account->$key)) {
+      require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
+      $current_pass_failed = empty($form_state['values']['current_pass']) || !user_check_password($form_state['values']['current_pass'], $account);
+      if ($current_pass_failed) {
+        form_set_error('current_pass', t("Your current password is missing or incorrect; it's required to change the %name.", array('%name' => $name)));
+        form_set_error($key);
+      }
+      // We only need to check the password once.
+      break;
+    }
+  }
+}
+
+/**
+ * Form validation handler for user_account_form().
+ *
+ * @see user_account_form()
+ */
+function user_account_form_validate($form, &$form_state) {
+  if ($form['#user_category'] == 'account' || $form['#user_category'] == 'register') {
+    $account = $form['#user'];
+    // Validate new or changing username.
+    if (isset($form_state['values']['name'])) {
+      if ($error = user_validate_name($form_state['values']['name'])) {
+        form_set_error('name', $error);
+      }
+      elseif ((bool) db_select('users')->fields('users', array('uid'))->condition('uid', $account->uid, '<>')->condition('name', db_like($form_state['values']['name']), 'LIKE')->range(0, 1)->execute()->fetchField()) {
+        form_set_error('name', t('The name %name is already taken.', array('%name' => $form_state['values']['name'])));
+      }
+    }
+
+    // Trim whitespace from mail, to prevent confusing 'e-mail not valid'
+    // warnings often caused by cutting and pasting.
+    $mail = trim($form_state['values']['mail']);
+    form_set_value($form['account']['mail'], $mail, $form_state);
+
+    // Validate the e-mail address, and check if it is taken by an existing user.
+    if ($error = user_validate_mail($form_state['values']['mail'])) {
+      form_set_error('mail', $error);
+    }
+    elseif ((bool) db_select('users')->fields('users', array('uid'))->condition('uid', $account->uid, '<>')->condition('mail', db_like($form_state['values']['mail']), 'LIKE')->range(0, 1)->execute()->fetchField()) {
+      // Format error message dependent on whether the user is logged in or not.
+      if ($GLOBALS['user']->uid) {
+        form_set_error('mail', t('The e-mail address %email is already taken.', array('%email' => $form_state['values']['mail'])));
+      }
+      else {
+        form_set_error('mail', t('The e-mail address %email is already registered. <a href="@password">Have you forgotten your password?</a>', array('%email' => $form_state['values']['mail'], '@password' => url('user/password'))));
+      }
+    }
+
+    // Make sure the signature isn't longer than the size of the database field.
+    // Signatures are disabled by default, so make sure it exists first.
+    if (isset($form_state['values']['signature'])) {
+      // Move text format for user signature into 'signature_format'.
+      $form_state['values']['signature_format'] = $form_state['values']['signature']['format'];
+      // Move text value for user signature into 'signature'.
+      $form_state['values']['signature'] = $form_state['values']['signature']['value'];
+
+      $user_schema = drupal_get_schema('users');
+      if (drupal_strlen($form_state['values']['signature']) > $user_schema['fields']['signature']['length']) {
+        form_set_error('signature', t('The signature is too long: it must be %max characters or less.', array('%max' => $user_schema['fields']['signature']['length'])));
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_user_presave().
+ */
+function user_user_presave(&$edit, $account, $category) {
+  if ($category == 'account' || $category == 'register') {
+    if (!empty($edit['picture_upload'])) {
+      $edit['picture'] = $edit['picture_upload'];
+    }
+    // Delete picture if requested, and if no replacement picture was given.
+    elseif (!empty($edit['picture_delete'])) {
+      $edit['picture'] = NULL;
+    }
+    // Prepare user roles.
+    if (isset($edit['roles'])) {
+      $edit['roles'] = array_filter($edit['roles']);
+    }
+  }
+
+  // Move account cancellation information into $user->data.
+  foreach (array('user_cancel_method', 'user_cancel_notify') as $key) {
+    if (isset($edit[$key])) {
+      $edit['data'][$key] = $edit[$key];
+    }
+  }
+}
+
+/**
+ * Implements hook_user_categories().
+ */
+function user_user_categories() {
+  return array(array(
+    'name' => 'account',
+    'title' => t('Account settings'),
+    'weight' => 1,
+  ));
+}
+
+function user_login_block($form) {
+  $form['#action'] = url(current_path(), array('query' => drupal_get_destination(), 'external' => FALSE));
+  $form['#id'] = 'user-login-form';
+  $form['#validate'] = user_login_default_validators();
+  $form['#submit'][] = 'user_login_submit';
+  $form['name'] = array('#type' => 'textfield',
+    '#title' => t('Username'),
+    '#maxlength' => USERNAME_MAX_LENGTH,
+    '#size' => 15,
+    '#required' => TRUE,
+  );
+  $form['pass'] = array('#type' => 'password',
+    '#title' => t('Password'),
+    '#size' => 15,
+    '#required' => TRUE,
+  );
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit',
+    '#value' => t('Log in'),
+  );
+  $items = array();
+  if (variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL)) {
+    $items[] = l(t('Create new account'), 'user/register', array('attributes' => array('title' => t('Create a new user account.'))));
+  }
+  $items[] = l(t('Request new password'), 'user/password', array('attributes' => array('title' => t('Request new password via e-mail.'))));
+  $form['links'] = array('#markup' => theme('item_list', array('items' => $items)));
+  return $form;
+}
+
+/**
+ * Implements hook_block_info().
+ */
+function user_block_info() {
+  global $user;
+
+  $blocks['login']['info'] = t('User login');
+  // Not worth caching.
+  $blocks['login']['cache'] = DRUPAL_NO_CACHE;
+
+  $blocks['new']['info'] = t('Who\'s new');
+  $blocks['new']['properties']['administrative'] = TRUE;
+
+  // Too dynamic to cache.
+  $blocks['online']['info'] = t('Who\'s online');
+  $blocks['online']['cache'] = DRUPAL_NO_CACHE;
+  $blocks['online']['properties']['administrative'] = TRUE;
+
+  return $blocks;
+}
+
+/**
+ * Implements hook_block_configure().
+ */
+function user_block_configure($delta = '') {
+  global $user;
+
+  switch ($delta) {
+    case 'new':
+      $form['user_block_whois_new_count'] = array(
+        '#type' => 'select',
+        '#title' => t('Number of users to display'),
+        '#default_value' => variable_get('user_block_whois_new_count', 5),
+        '#options' => drupal_map_assoc(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)),
+      );
+      return $form;
+
+    case 'online':
+      $period = drupal_map_assoc(array(30, 60, 120, 180, 300, 600, 900, 1800, 2700, 3600, 5400, 7200, 10800, 21600, 43200, 86400), 'format_interval');
+      $form['user_block_seconds_online'] = array('#type' => 'select', '#title' => t('User activity'), '#default_value' => variable_get('user_block_seconds_online', 900), '#options' => $period, '#description' => t('A user is considered online for this long after they have last viewed a page.'));
+      $form['user_block_max_list_count'] = array('#type' => 'select', '#title' => t('User list length'), '#default_value' => variable_get('user_block_max_list_count', 10), '#options' => drupal_map_assoc(array(0, 5, 10, 15, 20, 25, 30, 40, 50, 75, 100)), '#description' => t('Maximum number of currently online users to display.'));
+      return $form;
+  }
+}
+
+/**
+ * Implements hook_block_save().
+ */
+function user_block_save($delta = '', $edit = array()) {
+  global $user;
+
+  switch ($delta) {
+    case 'new':
+      variable_set('user_block_whois_new_count', $edit['user_block_whois_new_count']);
+      break;
+
+    case 'online':
+      variable_set('user_block_seconds_online', $edit['user_block_seconds_online']);
+      variable_set('user_block_max_list_count', $edit['user_block_max_list_count']);
+      break;
+  }
+}
+
+/**
+ * Implements hook_block_view().
+ */
+function user_block_view($delta = '') {
+  global $user;
+
+  $block = array();
+
+  switch ($delta) {
+    case 'login':
+      // For usability's sake, avoid showing two login forms on one page.
+      if (!$user->uid && !(arg(0) == 'user' && !is_numeric(arg(1)))) {
+
+        $block['subject'] = t('User login');
+        $block['content'] = drupal_get_form('user_login_block');
+      }
+      return $block;
+
+    case 'new':
+      if (user_access('access content')) {
+        // Retrieve a list of new users who have subsequently accessed the site successfully.
+        $items = db_query_range('SELECT uid, name FROM {users} WHERE status <> 0 AND access <> 0 ORDER BY created DESC', 0, variable_get('user_block_whois_new_count', 5))->fetchAll();
+        $output = theme('user_list', array('users' => $items));
+
+        $block['subject'] = t('Who\'s new');
+        $block['content'] = $output;
+      }
+      return $block;
+
+    case 'online':
+      if (user_access('access content')) {
+        // Count users active within the defined period.
+        $interval = REQUEST_TIME - variable_get('user_block_seconds_online', 900);
+
+        // Perform database queries to gather online user lists. We use s.timestamp
+        // rather than u.access because it is much faster.
+        $authenticated_count = db_query("SELECT COUNT(DISTINCT s.uid) FROM {sessions} s WHERE s.timestamp >= :timestamp AND s.uid > 0", array(':timestamp' => $interval))->fetchField();
+
+        $output = '<p>' . format_plural($authenticated_count, 'There is currently 1 user online.', 'There are currently @count users online.') . '</p>';
+
+        // Display a list of currently online users.
+        $max_users = variable_get('user_block_max_list_count', 10);
+        if ($authenticated_count && $max_users) {
+          $items = db_query_range('SELECT u.uid, u.name, MAX(s.timestamp) AS max_timestamp FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.timestamp >= :interval AND s.uid > 0 GROUP BY u.uid, u.name ORDER BY max_timestamp DESC', 0, $max_users, array(':interval' => $interval))->fetchAll();
+          $output .= theme('user_list', array('users' => $items));
+        }
+
+        $block['subject'] = t('Who\'s online');
+        $block['content'] = $output;
+      }
+      return $block;
+  }
+}
+
+/**
+ * Process variables for user-picture.tpl.php.
+ *
+ * The $variables array contains the following arguments:
+ * - $account: A user, node or comment object with 'name', 'uid' and 'picture'
+ *   fields.
+ *
+ * @see user-picture.tpl.php
+ */
+function template_preprocess_user_picture(&$variables) {
+  $variables['user_picture'] = '';
+  if (variable_get('user_pictures', 0)) {
+    $account = $variables['account'];
+    if (!empty($account->picture)) {
+      // @TODO: Ideally this function would only be passed file objects, but
+      // since there's a lot of legacy code that JOINs the {users} table to
+      // {node} or {comments} and passes the results into this function if we
+      // a numeric value in the picture field we'll assume it's a file id
+      // and load it for them. Once we've got user_load_multiple() and
+      // comment_load_multiple() functions the user module will be able to load
+      // the picture files in mass during the object's load process.
+      if (is_numeric($account->picture)) {
+        $account->picture = file_load($account->picture);
+      }
+      if (!empty($account->picture->uri)) {
+        $filepath = $account->picture->uri;
+      }
+    }
+    elseif (variable_get('user_picture_default', '')) {
+      $filepath = variable_get('user_picture_default', '');
+    }
+    if (isset($filepath)) {
+      $alt = t("@user's picture", array('@user' => format_username($account)));
+      // If the image does not have a valid Drupal scheme (for eg. HTTP),
+      // don't load image styles.
+      if (module_exists('image') && file_valid_uri($filepath) && $style = variable_get('user_picture_style', '')) {
+        $variables['user_picture'] = theme('image_style', array('style_name' => $style, 'path' => $filepath, 'alt' => $alt, 'title' => $alt));
+      }
+      else {
+        $variables['user_picture'] = theme('image', array('path' => $filepath, 'alt' => $alt, 'title' => $alt));
+      }
+      if (!empty($account->uid) && user_access('access user profiles')) {
+        $attributes = array('attributes' => array('title' => t('View user profile.')), 'html' => TRUE);
+        $variables['user_picture'] = l($variables['user_picture'], "user/$account->uid", $attributes);
+      }
+    }
+  }
+}
+
+/**
+ * Returns HTML for a list of users.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - users: An array with user objects. Should contain at least the name and
+ *     uid.
+ *   - title: (optional) Title to pass on to theme_item_list().
+ *
+ * @ingroup themeable
+ */
+function theme_user_list($variables) {
+  $users = $variables['users'];
+  $title = $variables['title'];
+  $items = array();
+
+  if (!empty($users)) {
+    foreach ($users as $user) {
+      $items[] = theme('username', array('account' => $user));
+    }
+  }
+  return theme('item_list', array('items' => $items, 'title' => $title));
+}
+
+/**
+ * Determines if the current user is anonymous.
+ *
+ * @return bool
+ *   TRUE if the user is anonymous, FALSE if the user is authenticated.
+ */
+function user_is_anonymous() {
+  // Menu administrators can see items for anonymous when administering.
+  return !$GLOBALS['user']->uid || !empty($GLOBALS['menu_admin']);
+}
+
+/**
+ * Determines if the current user is logged in.
+ *
+ * @return bool
+ *   TRUE if the user is logged in, FALSE if the user is anonymous.
+ */
+function user_is_logged_in() {
+  return (bool) $GLOBALS['user']->uid;
+}
+
+/**
+ * Determines if the current user has access to the user registration page.
+ *
+ * @return bool
+ *   TRUE if the user is not already logged in and can register for an account.
+ */
+function user_register_access() {
+  return user_is_anonymous() && variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL);
+}
+
+/**
+ * User view access callback.
+ *
+ * @param $account
+ *   Can either be a full user object or a $uid.
+ */
+function user_view_access($account) {
+  $uid = is_object($account) ? $account->uid : (int) $account;
+
+  // Never allow access to view the anonymous user account.
+  if ($uid) {
+    // Admins can view all, users can view own profiles at all times.
+    if ($GLOBALS['user']->uid == $uid || user_access('administer users')) {
+      return TRUE;
+    }
+    elseif (user_access('access user profiles')) {
+      // At this point, load the complete account object.
+      if (!is_object($account)) {
+        $account = user_load($uid);
+      }
+      return (is_object($account) && $account->status);
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Access callback for user account editing.
+ */
+function user_edit_access($account) {
+  return (($GLOBALS['user']->uid == $account->uid) || user_access('administer users')) && $account->uid > 0;
+}
+
+/**
+ * Menu access callback; limit access to account cancellation pages.
+ *
+ * Limit access to users with the 'cancel account' permission or administrative
+ * users, and prevent the anonymous user from cancelling the account.
+ */
+function user_cancel_access($account) {
+  return ((($GLOBALS['user']->uid == $account->uid) && user_access('cancel account')) || user_access('administer users')) && $account->uid > 0;
+}
+
+/**
+ * Implements hook_menu().
+ */
+function user_menu() {
+  $items['user/autocomplete'] = array(
+    'title' => 'User autocomplete',
+    'page callback' => 'user_autocomplete',
+    'access callback' => 'user_access',
+    'access arguments' => array('access user profiles'),
+    'type' => MENU_CALLBACK,
+    'file' => 'user.pages.inc',
+  );
+
+  // Registration and login pages.
+  $items['user'] = array(
+    'title' => 'User account',
+    'title callback' => 'user_menu_title',
+    'page callback' => 'user_page',
+    'access callback' => TRUE,
+    'file' => 'user.pages.inc',
+    'weight' => -10,
+    'menu_name' => 'user-menu',
+  );
+
+  $items['user/login'] = array(
+    'title' => 'Log in',
+    'access callback' => 'user_is_anonymous',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+
+  $items['user/register'] = array(
+    'title' => 'Create new account',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('user_register_form'),
+    'access callback' => 'user_register_access',
+    'type' => MENU_LOCAL_TASK,
+  );
+
+  $items['user/password'] = array(
+    'title' => 'Request new password',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('user_pass'),
+    'access callback' => TRUE,
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'user.pages.inc',
+  );
+  $items['user/reset/%/%/%'] = array(
+    'title' => 'Reset password',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('user_pass_reset', 2, 3, 4),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+    'file' => 'user.pages.inc',
+  );
+
+  $items['user/logout'] = array(
+    'title' => 'Log out',
+    'access callback' => 'user_is_logged_in',
+    'page callback' => 'user_logout',
+    'weight' => 10,
+    'menu_name' => 'user-menu',
+    'file' => 'user.pages.inc',
+  );
+
+  // User listing pages.
+  $items['admin/people'] = array(
+    'title' => 'People',
+    'description' => 'Manage user accounts, roles, and permissions.',
+    'page callback' => 'user_admin',
+    'page arguments' => array('list'),
+    'access arguments' => array('administer users'),
+    'position' => 'left',
+    'weight' => -4,
+    'file' => 'user.admin.inc',
+  );
+  $items['admin/people/people'] = array(
+    'title' => 'List',
+    'description' => 'Find and manage people interacting with your site.',
+    'access arguments' => array('administer users'),
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+    'file' => 'user.admin.inc',
+  );
+
+  // Permissions and role forms.
+  $items['admin/people/permissions'] = array(
+    'title' => 'Permissions',
+    'description' => 'Determine access to features by selecting permissions for roles.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('user_admin_permissions'),
+    'access arguments' => array('administer permissions'),
+    'file' => 'user.admin.inc',
+    'type' => MENU_LOCAL_TASK,
+  );
+  $items['admin/people/permissions/list'] = array(
+    'title' => 'Permissions',
+    'description' => 'Determine access to features by selecting permissions for roles.',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -8,
+  );
+  $items['admin/people/permissions/roles'] = array(
+    'title' => 'Roles',
+    'description' => 'List, edit, or add user roles.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('user_admin_roles'),
+    'access arguments' => array('administer permissions'),
+    'file' => 'user.admin.inc',
+    'type' => MENU_LOCAL_TASK,
+    'weight' => -5,
+  );
+  $items['admin/people/permissions/roles/edit/%user_role'] = array(
+    'title' => 'Edit role',
+    'page arguments' => array('user_admin_role', 5),
+    'access callback' => 'user_role_edit_access',
+    'access arguments' => array(5),
+  );
+  $items['admin/people/permissions/roles/delete/%user_role'] = array(
+    'title' => 'Delete role',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('user_admin_role_delete_confirm', 5),
+    'access callback' => 'user_role_edit_access',
+    'access arguments' => array(5),
+    'file' => 'user.admin.inc',
+  );
+
+  $items['admin/people/create'] = array(
+    'title' => 'Add user',
+    'page arguments' => array('create'),
+    'access arguments' => array('administer users'),
+    'type' => MENU_LOCAL_ACTION,
+  );
+
+  // Administration pages.
+  $items['admin/config/people'] = array(
+    'title' => 'People',
+    'description' => 'Configure user accounts.',
+    'position' => 'left',
+    'weight' => -20,
+    'page callback' => 'system_admin_menu_block_page',
+    'access arguments' => array('access administration pages'),
+    'file' => 'system.admin.inc',
+    'file path' => drupal_get_path('module', 'system'),
+  );
+  $items['admin/config/people/accounts'] = array(
+    'title' => 'Account settings',
+    'description' => 'Configure default behavior of users, including registration requirements, e-mails, fields, and user pictures.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('user_admin_settings'),
+    'access arguments' => array('administer users'),
+    'file' => 'user.admin.inc',
+    'weight' => -10,
+  );
+  $items['admin/config/people/accounts/settings'] = array(
+    'title' => 'Settings',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+
+  $items['user/%user'] = array(
+    'title' => 'My account',
+    'title callback' => 'user_page_title',
+    'title arguments' => array(1),
+    'page callback' => 'user_view_page',
+    'page arguments' => array(1),
+    'access callback' => 'user_view_access',
+    'access arguments' => array(1),
+    // By assigning a different menu name, this item (and all registered child
+    // paths) are no longer considered as children of 'user'. When accessing the
+    // user account pages, the preferred menu link that is used to build the
+    // active trail (breadcrumb) will be found in this menu (unless there is
+    // more specific link), so the link to 'user' will not be in the breadcrumb.
+    'menu_name' => 'navigation',
+  );
+
+  $items['user/%user/view'] = array(
+    'title' => 'View',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+
+  $items['user/%user/cancel'] = array(
+    'title' => 'Cancel account',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('user_cancel_confirm_form', 1),
+    'access callback' => 'user_cancel_access',
+    'access arguments' => array(1),
+    'file' => 'user.pages.inc',
+  );
+
+  $items['user/%user/cancel/confirm/%/%'] = array(
+    'title' => 'Confirm account cancellation',
+    'page callback' => 'user_cancel_confirm',
+    'page arguments' => array(1, 4, 5),
+    'access callback' => 'user_cancel_access',
+    'access arguments' => array(1),
+    'file' => 'user.pages.inc',
+  );
+
+  $items['user/%user/edit'] = array(
+    'title' => 'Edit',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('user_profile_form', 1),
+    'access callback' => 'user_edit_access',
+    'access arguments' => array(1),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'user.pages.inc',
+  );
+
+  $items['user/%user_category/edit/account'] = array(
+    'title' => 'Account',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'load arguments' => array('%map', '%index'),
+  );
+
+  if (($categories = _user_categories()) && (count($categories) > 1)) {
+    foreach ($categories as $key => $category) {
+      // 'account' is already handled by the MENU_DEFAULT_LOCAL_TASK.
+      if ($category['name'] != 'account') {
+        $items['user/%user_category/edit/' . $category['name']] = array(
+          'title callback' => 'check_plain',
+          'title arguments' => array($category['title']),
+          'page callback' => 'drupal_get_form',
+          'page arguments' => array('user_profile_form', 1, 3),
+          'access callback' => isset($category['access callback']) ? $category['access callback'] : 'user_edit_access',
+          'access arguments' => isset($category['access arguments']) ? $category['access arguments'] : array(1),
+          'type' => MENU_LOCAL_TASK,
+          'weight' => $category['weight'],
+          'load arguments' => array('%map', '%index'),
+          'tab_parent' => 'user/%/edit',
+          'file' => 'user.pages.inc',
+        );
+      }
+    }
+  }
+  return $items;
+}
+
+/**
+ * Implements hook_menu_site_status_alter().
+ */
+function user_menu_site_status_alter(&$menu_site_status, $path) {
+  if ($menu_site_status == MENU_SITE_OFFLINE) {
+    // If the site is offline, log out unprivileged users.
+    if (user_is_logged_in() && !user_access('access site in maintenance mode')) {
+      module_load_include('pages.inc', 'user', 'user');
+      user_logout();
+    }
+
+    if (user_is_anonymous()) {
+      switch ($path) {
+        case 'user':
+          // Forward anonymous user to login page.
+          drupal_goto('user/login');
+        case 'user/login':
+        case 'user/password':
+          // Disable offline mode.
+          $menu_site_status = MENU_SITE_ONLINE;
+          break;
+        default:
+          if (strpos($path, 'user/reset/') === 0) {
+            // Disable offline mode.
+            $menu_site_status = MENU_SITE_ONLINE;
+          }
+          break;
+      }
+    }
+  }
+  if (user_is_logged_in()) {
+    if ($path == 'user/login') {
+      // If user is logged in, redirect to 'user' instead of giving 403.
+      drupal_goto('user');
+    }
+    if ($path == 'user/register') {
+      // Authenticated user should be redirected to user edit page.
+      drupal_goto('user/' . $GLOBALS['user']->uid . '/edit');
+    }
+  }
+}
+
+/**
+ * Implements hook_menu_link_alter().
+ */
+function user_menu_link_alter(&$link) {
+  // The path 'user' must be accessible for anonymous users, but only visible
+  // for authenticated users. Authenticated users should see "My account", but
+  // anonymous users should not see it at all. Therefore, invoke
+  // user_translated_menu_link_alter() to conditionally hide the link.
+  if ($link['link_path'] == 'user' && $link['module'] == 'system') {
+    $link['options']['alter'] = TRUE;
+  }
+
+  // Force the Logout link to appear on the top-level of 'user-menu' menu by
+  // default (i.e., unless it has been customized).
+  if ($link['link_path'] == 'user/logout' && $link['module'] == 'system' && empty($link['customized'])) {
+    $link['plid'] = 0;
+  }
+}
+
+/**
+ * Implements hook_translated_menu_link_alter().
+ */
+function user_translated_menu_link_alter(&$link) {
+  // Hide the "User account" link for anonymous users.
+  if ($link['link_path'] == 'user' && $link['module'] == 'system' && !$GLOBALS['user']->uid) {
+    $link['hidden'] = 1;
+  }
+}
+
+/**
+ * Implements hook_admin_paths().
+ */
+function user_admin_paths() {
+  $paths = array(
+    'user/*/cancel' => TRUE,
+    'user/*/edit' => TRUE,
+    'user/*/edit/*' => TRUE,
+  );
+  return $paths;
+}
+
+/**
+ * Returns $arg or the user ID of the current user if $arg is '%' or empty.
+ *
+ * Deprecated. Use %user_uid_optional instead.
+ *
+ * @todo D8: Remove.
+ */
+function user_uid_only_optional_to_arg($arg) {
+  return user_uid_optional_to_arg($arg);
+}
+
+/**
+ * Load either a specified or the current user account.
+ *
+ * @param $uid
+ *   An optional user ID of the user to load. If not provided, the current
+ *   user's ID will be used.
+ * @return
+ *   A fully-loaded $user object upon successful user load, FALSE if user
+ *   cannot be loaded.
+ *
+ * @see user_load()
+ * @todo rethink the naming of this in Drupal 8.
+ */
+function user_uid_optional_load($uid = NULL) {
+  if (!isset($uid)) {
+    $uid = $GLOBALS['user']->uid;
+  }
+  return user_load($uid);
+}
+
+/**
+ * Return a user object after checking if any profile category in the path exists.
+ */
+function user_category_load($uid, &$map, $index) {
+  static $user_categories, $accounts;
+
+  // Cache $account - this load function will get called for each profile tab.
+  if (!isset($accounts[$uid])) {
+    $accounts[$uid] = user_load($uid);
+  }
+  $valid = TRUE;
+  if ($account = $accounts[$uid]) {
+    // Since the path is like user/%/edit/category_name, the category name will
+    // be at a position 2 beyond the index corresponding to the % wildcard.
+    $category_index = $index + 2;
+    // Valid categories may contain slashes, and hence need to be imploded.
+    $category_path = implode('/', array_slice($map, $category_index));
+    if ($category_path) {
+      // Check that the requested category exists.
+      $valid = FALSE;
+      if (!isset($user_categories)) {
+        $user_categories = _user_categories();
+      }
+      foreach ($user_categories as $category) {
+        if ($category['name'] == $category_path) {
+          $valid = TRUE;
+          // Truncate the map array in case the category name had slashes.
+          $map = array_slice($map, 0, $category_index);
+          // Assign the imploded category name to the last map element.
+          $map[$category_index] = $category_path;
+          break;
+        }
+      }
+    }
+  }
+  return $valid ? $account : FALSE;
+}
+
+/**
+ * Returns $arg or the user ID of the current user if $arg is '%' or empty.
+ *
+ * @todo rethink the naming of this in Drupal 8.
+ */
+function user_uid_optional_to_arg($arg) {
+  // Give back the current user uid when called from eg. tracker, aka.
+  // with an empty arg. Also use the current user uid when called from
+  // the menu with a % for the current account link.
+  return empty($arg) || $arg == '%' ? $GLOBALS['user']->uid : $arg;
+}
+
+/**
+ * Menu item title callback for the 'user' path.
+ *
+ * Anonymous users should see "User account", but authenticated users are
+ * expected to see "My account".
+ */
+function user_menu_title() {
+  return user_is_logged_in() ? t('My account') : t('User account');
+}
+
+/**
+ * Menu item title callback - use the user name.
+ */
+function user_page_title($account) {
+  return is_object($account) ? format_username($account) : '';
+}
+
+/**
+ * Discover which external authentication module(s) authenticated a username.
+ *
+ * @param $authname
+ *   A username used by an external authentication module.
+ * @return
+ *   An associative array with module as key and username as value.
+ */
+function user_get_authmaps($authname = NULL) {
+  $authmaps = db_query("SELECT module, authname FROM {authmap} WHERE authname = :authname", array(':authname' => $authname))->fetchAllKeyed();
+  return count($authmaps) ? $authmaps : 0;
+}
+
+/**
+ * Save mappings of which external authentication module(s) authenticated
+ * a user. Maps external usernames to user ids in the users table.
+ *
+ * @param $account
+ *   A user object.
+ * @param $authmaps
+ *   An associative array with a compound key and the username as the value.
+ *   The key is made up of 'authname_' plus the name of the external authentication
+ *   module.
+ * @see user_external_login_register()
+ */
+function user_set_authmaps($account, $authmaps) {
+  foreach ($authmaps as $key => $value) {
+    $module = explode('_', $key, 2);
+    if ($value) {
+      db_merge('authmap')
+        ->key(array(
+          'uid' => $account->uid,
+          'module' => $module[1],
+        ))
+        ->fields(array('authname' => $value))
+        ->execute();
+    }
+    else {
+      db_delete('authmap')
+        ->condition('uid', $account->uid)
+        ->condition('module', $module[1])
+        ->execute();
+    }
+  }
+}
+
+/**
+ * Form builder; the main user login form.
+ *
+ * @ingroup forms
+ */
+function user_login($form, &$form_state) {
+  global $user;
+
+  // If we are already logged on, go to the user page instead.
+  if ($user->uid) {
+    drupal_goto('user/' . $user->uid);
+  }
+
+  // Display login form:
+  $form['name'] = array('#type' => 'textfield',
+    '#title' => t('Username'),
+    '#size' => 60,
+    '#maxlength' => USERNAME_MAX_LENGTH,
+    '#required' => TRUE,
+  );
+
+  $form['name']['#description'] = t('Enter your @s username.', array('@s' => variable_get('site_name', 'Drupal')));
+  $form['pass'] = array('#type' => 'password',
+    '#title' => t('Password'),
+    '#description' => t('Enter the password that accompanies your username.'),
+    '#required' => TRUE,
+  );
+  $form['#validate'] = user_login_default_validators();
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Log in'));
+
+  return $form;
+}
+
+/**
+ * Set up a series for validators which check for blocked users,
+ * then authenticate against local database, then return an error if
+ * authentication fails. Distributed authentication modules are welcome
+ * to use hook_form_alter() to change this series in order to
+ * authenticate against their user database instead of the local users
+ * table. If a distributed authentication module is successful, it
+ * should set $form_state['uid'] to a user ID.
+ *
+ * We use three validators instead of one since external authentication
+ * modules usually only need to alter the second validator.
+ *
+ * @see user_login_name_validate()
+ * @see user_login_authenticate_validate()
+ * @see user_login_final_validate()
+ * @return array
+ *   A simple list of validate functions.
+ */
+function user_login_default_validators() {
+  return array('user_login_name_validate', 'user_login_authenticate_validate', 'user_login_final_validate');
+}
+
+/**
+ * A FAPI validate handler. Sets an error if supplied username has been blocked.
+ */
+function user_login_name_validate($form, &$form_state) {
+  if (!empty($form_state['values']['name']) && user_is_blocked($form_state['values']['name'])) {
+    // Blocked in user administration.
+    form_set_error('name', t('The username %name has not been activated or is blocked.', array('%name' => $form_state['values']['name'])));
+  }
+}
+
+/**
+ * A validate handler on the login form. Check supplied username/password
+ * against local users table. If successful, $form_state['uid']
+ * is set to the matching user ID.
+ */
+function user_login_authenticate_validate($form, &$form_state) {
+  $password = trim($form_state['values']['pass']);
+  if (!empty($form_state['values']['name']) && !empty($password)) {
+    // Do not allow any login from the current user's IP if the limit has been
+    // reached. Default is 50 failed attempts allowed in one hour. This is
+    // independent of the per-user limit to catch attempts from one IP to log
+    // in to many different user accounts.  We have a reasonably high limit
+    // since there may be only one apparent IP for all users at an institution.
+    if (!flood_is_allowed('failed_login_attempt_ip', variable_get('user_failed_login_ip_limit', 50), variable_get('user_failed_login_ip_window', 3600))) {
+      $form_state['flood_control_triggered'] = 'ip';
+      return;
+    }
+    $account = db_query("SELECT * FROM {users} WHERE name = :name AND status = 1", array(':name' => $form_state['values']['name']))->fetchObject();
+    if ($account) {
+      if (variable_get('user_failed_login_identifier_uid_only', FALSE)) {
+        // Register flood events based on the uid only, so they apply for any
+        // IP address. This is the most secure option.
+        $identifier = $account->uid;
+      }
+      else {
+        // The default identifier is a combination of uid and IP address. This
+        // is less secure but more resistant to denial-of-service attacks that
+        // could lock out all users with public user names.
+        $identifier = $account->uid . '-' . ip_address();
+      }
+      $form_state['flood_control_user_identifier'] = $identifier;
+
+      // Don't allow login if the limit for this user has been reached.
+      // Default is to allow 5 failed attempts every 6 hours.
+      if (!flood_is_allowed('failed_login_attempt_user', variable_get('user_failed_login_user_limit', 5), variable_get('user_failed_login_user_window', 21600), $identifier)) {
+        $form_state['flood_control_triggered'] = 'user';
+        return;
+      }
+    }
+    // We are not limited by flood control, so try to authenticate.
+    // Set $form_state['uid'] as a flag for user_login_final_validate().
+    $form_state['uid'] = user_authenticate($form_state['values']['name'], $password);
+  }
+}
+
+/**
+ * The final validation handler on the login form.
+ *
+ * Sets a form error if user has not been authenticated, or if too many
+ * logins have been attempted. This validation function should always
+ * be the last one.
+ */
+function user_login_final_validate($form, &$form_state) {
+  if (empty($form_state['uid'])) {
+    // Always register an IP-based failed login event.
+    flood_register_event('failed_login_attempt_ip', variable_get('user_failed_login_ip_window', 3600));
+    // Register a per-user failed login event.
+    if (isset($form_state['flood_control_user_identifier'])) {
+      flood_register_event('failed_login_attempt_user', variable_get('user_failed_login_user_window', 21600), $form_state['flood_control_user_identifier']);
+    }
+
+    if (isset($form_state['flood_control_triggered'])) {
+      if ($form_state['flood_control_triggered'] == 'user') {
+        form_set_error('name', format_plural(variable_get('user_failed_login_user_limit', 5), 'Sorry, there has been more than one failed login attempt for this account. It is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', 'Sorry, there have been more than @count failed login attempts for this account. It is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', array('@url' => url('user/password'))));
+      }
+      else {
+        // We did not find a uid, so the limit is IP-based.
+        form_set_error('name', t('Sorry, too many failed login attempts from your IP address. This IP address is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', array('@url' => url('user/password'))));
+      }
+    }
+    else {
+      form_set_error('name', t('Sorry, unrecognized username or password. <a href="@password">Have you forgotten your password?</a>', array('@password' => url('user/password', array('query' => array('name' => $form_state['values']['name']))))));
+      watchdog('user', 'Login attempt failed for %user.', array('%user' => $form_state['values']['name']));
+    }
+  }
+  elseif (isset($form_state['flood_control_user_identifier'])) {
+    // Clear past failures for this user so as not to block a user who might
+    // log in and out more than once in an hour.
+    flood_clear_event('failed_login_attempt_user', $form_state['flood_control_user_identifier']);
+  }
+}
+
+/**
+ * Try to validate the user's login credentials locally.
+ *
+ * @param $name
+ *   User name to authenticate.
+ * @param $password
+ *   A plain-text password, such as trimmed text from form values.
+ * @return
+ *   The user's uid on success, or FALSE on failure to authenticate.
+ */
+function user_authenticate($name, $password) {
+  $uid = FALSE;
+  if (!empty($name) && !empty($password)) {
+    $account = user_load_by_name($name);
+    if ($account) {
+      // Allow alternate password hashing schemes.
+      require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
+      if (user_check_password($password, $account)) {
+        // Successful authentication.
+        $uid = $account->uid;
+
+        // Update user to new password scheme if needed.
+        if (user_needs_new_hash($account)) {
+          user_save($account, array('pass' => $password));
+        }
+      }
+    }
+  }
+  return $uid;
+}
+
+/**
+ * Finalize the login process. Must be called when logging in a user.
+ *
+ * The function records a watchdog message about the new session, saves the
+ * login timestamp, calls hook_user_login(), and generates a new session.
+ *
+ * @param array $edit
+ *   The array of form values submitted by the user.
+ *
+ * @see hook_user_login()
+ */
+function user_login_finalize(&$edit = array()) {
+  global $user;
+  watchdog('user', 'Session opened for %name.', array('%name' => $user->name));
+  // Update the user table timestamp noting user has logged in.
+  // This is also used to invalidate one-time login links.
+  $user->login = REQUEST_TIME;
+  db_update('users')
+    ->fields(array('login' => $user->login))
+    ->condition('uid', $user->uid)
+    ->execute();
+
+  // Regenerate the session ID to prevent against session fixation attacks.
+  // This is called before hook_user in case one of those functions fails
+  // or incorrectly does a redirect which would leave the old session in place.
+  drupal_session_regenerate();
+
+  user_module_invoke('login', $edit, $user);
+}
+
+/**
+ * Submit handler for the login form. Load $user object and perform standard login
+ * tasks. The user is then redirected to the My Account page. Setting the
+ * destination in the query string overrides the redirect.
+ */
+function user_login_submit($form, &$form_state) {
+  global $user;
+  $user = user_load($form_state['uid']);
+  $form_state['redirect'] = 'user/' . $user->uid;
+
+  user_login_finalize($form_state);
+}
+
+/**
+ * Helper function for authentication modules. Either logs in or registers
+ * the current user, based on username. Either way, the global $user object is
+ * populated and login tasks are performed.
+ */
+function user_external_login_register($name, $module) {
+  $account = user_external_load($name);
+  if (!$account) {
+    // Register this new user.
+    $userinfo = array(
+      'name' => $name,
+      'pass' => user_password(),
+      'init' => $name,
+      'status' => 1,
+      'access' => REQUEST_TIME
+    );
+    $account = user_save(drupal_anonymous_user(), $userinfo);
+    // Terminate if an error occurred during user_save().
+    if (!$account) {
+      drupal_set_message(t("Error saving user account."), 'error');
+      return;
+    }
+    user_set_authmaps($account, array("authname_$module" => $name));
+  }
+
+  // Log user in.
+  $form_state['uid'] = $account->uid;
+  user_login_submit(array(), $form_state);
+}
+
+/**
+ * Generates a unique URL for a user to login and reset their password.
+ *
+ * @param object $account
+ *   An object containing the user account, which must contain at least the
+ *   following properties:
+ *   - uid: The user ID number.
+ *   - login: The UNIX timestamp of the user's last login.
+ *
+ * @return
+ *   A unique URL that provides a one-time log in for the user, from which
+ *   they can change their password.
+ */
+function user_pass_reset_url($account) {
+  $timestamp = REQUEST_TIME;
+  return url("user/reset/$account->uid/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login), array('absolute' => TRUE));
+}
+
+/**
+ * Generates a URL to confirm an account cancellation request.
+ *
+ * @param object $account
+ *   The user account object, which must contain at least the following
+ *   properties:
+ *   - uid: The user ID number.
+ *   - pass: The hashed user password string.
+ *   - login: The UNIX timestamp of the user's last login.
+ *
+ * @return
+ *   A unique URL that may be used to confirm the cancellation of the user
+ *   account.
+ *
+ * @see user_mail_tokens()
+ * @see user_cancel_confirm()
+ */
+function user_cancel_url($account) {
+  $timestamp = REQUEST_TIME;
+  return url("user/$account->uid/cancel/confirm/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login), array('absolute' => TRUE));
+}
+
+/**
+ * Creates a unique hash value for use in time-dependent per-user URLs.
+ *
+ * This hash is normally used to build a unique and secure URL that is sent to
+ * the user by email for purposes such as resetting the user's password. In
+ * order to validate the URL, the same hash can be generated again, from the
+ * same information, and compared to the hash value from the URL. The URL
+ * normally contains both the time stamp and the numeric user ID. The login
+ * timestamp and hashed password are retrieved from the database as necessary.
+ * For a usage example, see user_cancel_url() and user_cancel_confirm().
+ *
+ * @param string $password
+ *   The hashed user account password value.
+ * @param int $timestamp
+ *   A UNIX timestamp, typically REQUEST_TIME.
+ * @param int $login
+ *   The UNIX timestamp of the user's last login.
+ *
+ * @return
+ *   A string that is safe for use in URLs and SQL statements.
+ */
+function user_pass_rehash($password, $timestamp, $login) {
+  return drupal_hmac_base64($timestamp . $login, drupal_get_hash_salt() . $password);
+}
+
+/**
+ * Cancel a user account.
+ *
+ * Since the user cancellation process needs to be run in a batch, either
+ * Form API will invoke it, or batch_process() needs to be invoked after calling
+ * this function and should define the path to redirect to.
+ *
+ * @param $edit
+ *   An array of submitted form values.
+ * @param $uid
+ *   The user ID of the user account to cancel.
+ * @param $method
+ *   The account cancellation method to use.
+ *
+ * @see _user_cancel()
+ */
+function user_cancel($edit, $uid, $method) {
+  global $user;
+
+  $account = user_load($uid);
+
+  if (!$account) {
+    drupal_set_message(t('The user account %id does not exist.', array('%id' => $uid)), 'error');
+    watchdog('user', 'Attempted to cancel non-existing user account: %id.', array('%id' => $uid), WATCHDOG_ERROR);
+    return;
+  }
+
+  // Initialize batch (to set title).
+  $batch = array(
+    'title' => t('Cancelling account'),
+    'operations' => array(),
+  );
+  batch_set($batch);
+
+  // Modules use hook_user_delete() to respond to deletion.
+  if ($method != 'user_cancel_delete') {
+    // Allow modules to add further sets to this batch.
+    module_invoke_all('user_cancel', $edit, $account, $method);
+  }
+
+  // Finish the batch and actually cancel the account.
+  $batch = array(
+    'title' => t('Cancelling user account'),
+    'operations' => array(
+      array('_user_cancel', array($edit, $account, $method)),
+    ),
+  );
+
+  // After cancelling account, ensure that user is logged out.
+  if ($account->uid == $user->uid) {
+    // Batch API stores data in the session, so use the finished operation to
+    // manipulate the current user's session id.
+    $batch['finished'] = '_user_cancel_session_regenerate';
+  }
+
+  batch_set($batch);
+
+  // Batch processing is either handled via Form API or has to be invoked
+  // manually.
+}
+
+/**
+ * Last batch processing step for cancelling a user account.
+ *
+ * Since batch and session API require a valid user account, the actual
+ * cancellation of a user account needs to happen last.
+ *
+ * @see user_cancel()
+ */
+function _user_cancel($edit, $account, $method) {
+  global $user;
+
+  switch ($method) {
+    case 'user_cancel_block':
+    case 'user_cancel_block_unpublish':
+    default:
+      // Send account blocked notification if option was checked.
+      if (!empty($edit['user_cancel_notify'])) {
+        _user_mail_notify('status_blocked', $account);
+      }
+      user_save($account, array('status' => 0));
+      drupal_set_message(t('%name has been disabled.', array('%name' => $account->name)));
+      watchdog('user', 'Blocked user: %name %email.', array('%name' => $account->name, '%email' => '<' . $account->mail . '>'), WATCHDOG_NOTICE);
+      break;
+
+    case 'user_cancel_reassign':
+    case 'user_cancel_delete':
+      // Send account canceled notification if option was checked.
+      if (!empty($edit['user_cancel_notify'])) {
+        _user_mail_notify('status_canceled', $account);
+      }
+      user_delete($account->uid);
+      drupal_set_message(t('%name has been deleted.', array('%name' => $account->name)));
+      watchdog('user', 'Deleted user: %name %email.', array('%name' => $account->name, '%email' => '<' . $account->mail . '>'), WATCHDOG_NOTICE);
+      break;
+  }
+
+  // After cancelling account, ensure that user is logged out. We can't destroy
+  // their session though, as we might have information in it, and we can't
+  // regenerate it because batch API uses the session ID, we will regenerate it
+  // in _user_cancel_session_regenerate().
+  if ($account->uid == $user->uid) {
+    $user = drupal_anonymous_user();
+  }
+
+  // Clear the cache for anonymous users.
+  cache_clear_all();
+}
+
+/**
+ * Finished batch processing callback for cancelling a user account.
+ *
+ * @see user_cancel()
+ */
+function _user_cancel_session_regenerate() {
+  // Regenerate the users session instead of calling session_destroy() as we
+  // want to preserve any messages that might have been set.
+  drupal_session_regenerate();
+}
+
+/**
+ * Delete a user.
+ *
+ * @param $uid
+ *   A user ID.
+ */
+function user_delete($uid) {
+  user_delete_multiple(array($uid));
+}
+
+/**
+ * Delete multiple user accounts.
+ *
+ * @param $uids
+ *   An array of user IDs.
+ */
+function user_delete_multiple(array $uids) {
+  if (!empty($uids)) {
+    $accounts = user_load_multiple($uids, array());
+
+    $transaction = db_transaction();
+    try {
+      foreach ($accounts as $uid => $account) {
+        module_invoke_all('user_delete', $account);
+        module_invoke_all('entity_delete', $account, 'user');
+        field_attach_delete('user', $account);
+        drupal_session_destroy_uid($account->uid);
+      }
+
+      db_delete('users')
+        ->condition('uid', $uids, 'IN')
+        ->execute();
+      db_delete('users_roles')
+        ->condition('uid', $uids, 'IN')
+        ->execute();
+      db_delete('authmap')
+        ->condition('uid', $uids, 'IN')
+        ->execute();
+    }
+    catch (Exception $e) {
+      $transaction->rollback();
+      watchdog_exception('user', $e);
+      throw $e;
+    }
+    entity_get_controller('user')->resetCache();
+  }
+}
+
+/**
+ * Page callback wrapper for user_view().
+ */
+function user_view_page($account) {
+  // An administrator may try to view a non-existent account,
+  // so we give them a 404 (versus a 403 for non-admins).
+  return is_object($account) ? user_view($account) : MENU_NOT_FOUND;
+}
+
+/**
+ * Generate an array for rendering the given user.
+ *
+ * When viewing a user profile, the $page array contains:
+ *
+ * - $page['content']['Profile Category']:
+ *   Profile categories keyed by their human-readable names.
+ * - $page['content']['Profile Category']['profile_machine_name']:
+ *   Profile fields keyed by their machine-readable names.
+ * - $page['content']['user_picture']:
+ *   User's rendered picture.
+ * - $page['content']['summary']:
+ *   Contains the default "History" profile data for a user.
+ * - $page['content']['#account']:
+ *   The user account of the profile being viewed.
+ *
+ * To theme user profiles, copy modules/user/user-profile.tpl.php
+ * to your theme directory, and edit it as instructed in that file's comments.
+ *
+ * @param $account
+ *   A user object.
+ * @param $view_mode
+ *   View mode, e.g. 'full'.
+ * @param $langcode
+ *   (optional) A language code to use for rendering. Defaults to the global
+ *   content language of the current request.
+ *
+ * @return
+ *   An array as expected by drupal_render().
+ */
+function user_view($account, $view_mode = 'full', $langcode = NULL) {
+  if (!isset($langcode)) {
+    $langcode = $GLOBALS['language_content']->language;
+  }
+
+  // Retrieve all profile fields and attach to $account->content.
+  user_build_content($account, $view_mode, $langcode);
+
+  $build = $account->content;
+  // We don't need duplicate rendering info in account->content.
+  unset($account->content);
+
+  $build += array(
+    '#theme' => 'user_profile',
+    '#account' => $account,
+    '#view_mode' => $view_mode,
+    '#language' => $langcode,
+  );
+
+  // Allow modules to modify the structured user.
+  $type = 'user';
+  drupal_alter(array('user_view', 'entity_view'), $build, $type);
+
+  return $build;
+}
+
+/**
+ * Builds a structured array representing the profile content.
+ *
+ * @param $account
+ *   A user object.
+ * @param $view_mode
+ *   View mode, e.g. 'full'.
+ * @param $langcode
+ *   (optional) A language code to use for rendering. Defaults to the global
+ *   content language of the current request.
+ */
+function user_build_content($account, $view_mode = 'full', $langcode = NULL) {
+  if (!isset($langcode)) {
+    $langcode = $GLOBALS['language_content']->language;
+  }
+
+  // Remove previously built content, if exists.
+  $account->content = array();
+
+  // Allow modules to change the view mode.
+  $context = array(
+    'entity_type' => 'user',
+    'entity' => $account,
+    'langcode' => $langcode,
+  );
+  drupal_alter('entity_view_mode', $view_mode, $context);
+
+  // Build fields content.
+  field_attach_prepare_view('user', array($account->uid => $account), $view_mode, $langcode);
+  entity_prepare_view('user', array($account->uid => $account), $langcode);
+  $account->content += field_attach_view('user', $account, $view_mode, $langcode);
+
+  // Populate $account->content with a render() array.
+  module_invoke_all('user_view', $account, $view_mode, $langcode);
+  module_invoke_all('entity_view', $account, 'user', $view_mode, $langcode);
+
+  // Make sure the current view mode is stored if no module has already
+  // populated the related key.
+  $account->content += array('#view_mode' => $view_mode);
+}
+
+/**
+ * Implements hook_mail().
+ */
+function user_mail($key, &$message, $params) {
+  $language = $message['language'];
+  $variables = array('user' => $params['account']);
+  $message['subject'] .= _user_mail_text($key . '_subject', $language, $variables);
+  $message['body'][] = _user_mail_text($key . '_body', $language, $variables);
+}
+
+/**
+ * Returns a mail string for a variable name.
+ *
+ * Used by user_mail() and the settings forms to retrieve strings.
+ */
+function _user_mail_text($key, $language = NULL, $variables = array(), $replace = TRUE) {
+  $langcode = isset($language) ? $language->language : NULL;
+
+  if ($admin_setting = variable_get('user_mail_' . $key, FALSE)) {
+    // An admin setting overrides the default string.
+    $text = $admin_setting;
+  }
+  else {
+    // No override, return default string.
+    switch ($key) {
+      case 'register_no_approval_required_subject':
+        $text = t('Account details for [user:name] at [site:name]', array(), array('langcode' => $langcode));
+        break;
+      case 'register_no_approval_required_body':
+        $text = t("[user:name],
+
+Thank you for registering at [site:name]. You may now log in by clicking this link or copying and pasting it to your browser:
+
+[user:one-time-login-url]
+
+This link can only be used once to log in and will lead you to a page where you can set your password.
+
+After setting your password, you will be able to log in at [site:login-url] in the future using:
+
+username: [user:name]
+password: Your password
+
+--  [site:name] team", array(), array('langcode' => $langcode));
+        break;
+
+      case 'register_admin_created_subject':
+        $text = t('An administrator created an account for you at [site:name]', array(), array('langcode' => $langcode));
+        break;
+      case 'register_admin_created_body':
+        $text = t("[user:name],
+
+A site administrator at [site:name] has created an account for you. You may now log in by clicking this link or copying and pasting it to your browser:
+
+[user:one-time-login-url]
+
+This link can only be used once to log in and will lead you to a page where you can set your password.
+
+After setting your password, you will be able to log in at [site:login-url] in the future using:
+
+username: [user:name]
+password: Your password
+
+--  [site:name] team", array(), array('langcode' => $langcode));
+        break;
+
+      case 'register_pending_approval_subject':
+      case 'register_pending_approval_admin_subject':
+        $text = t('Account details for [user:name] at [site:name] (pending admin approval)', array(), array('langcode' => $langcode));
+        break;
+      case 'register_pending_approval_body':
+        $text = t("[user:name],
+
+Thank you for registering at [site:name]. Your application for an account is currently pending approval. Once it has been approved, you will receive another e-mail containing information about how to log in, set your password, and other details.
+
+
+--  [site:name] team", array(), array('langcode' => $langcode));
+        break;
+      case 'register_pending_approval_admin_body':
+        $text = t("[user:name] has applied for an account.
+
+[user:edit-url]", array(), array('langcode' => $langcode));
+        break;
+
+      case 'password_reset_subject':
+        $text = t('Replacement login information for [user:name] at [site:name]', array(), array('langcode' => $langcode));
+        break;
+      case 'password_reset_body':
+        $text = t("[user:name],
+
+A request to reset the password for your account has been made at [site:name].
+
+You may now log in by clicking this link or copying and pasting it to your browser:
+
+[user:one-time-login-url]
+
+This link can only be used once to log in and will lead you to a page where you can set your password. It expires after one day and nothing will happen if it's not used.
+
+--  [site:name] team", array(), array('langcode' => $langcode));
+        break;
+
+      case 'status_activated_subject':
+        $text = t('Account details for [user:name] at [site:name] (approved)', array(), array('langcode' => $langcode));
+        break;
+      case 'status_activated_body':
+        $text = t("[user:name],
+
+Your account at [site:name] has been activated.
+
+You may now log in by clicking this link or copying and pasting it into your browser:
+
+[user:one-time-login-url]
+
+This link can only be used once to log in and will lead you to a page where you can set your password.
+
+After setting your password, you will be able to log in at [site:login-url] in the future using:
+
+username: [user:name]
+password: Your password
+
+--  [site:name] team", array(), array('langcode' => $langcode));
+        break;
+
+      case 'status_blocked_subject':
+        $text = t('Account details for [user:name] at [site:name] (blocked)', array(), array('langcode' => $langcode));
+        break;
+      case 'status_blocked_body':
+        $text = t("[user:name],
+
+Your account on [site:name] has been blocked.
+
+--  [site:name] team", array(), array('langcode' => $langcode));
+        break;
+
+      case 'cancel_confirm_subject':
+        $text = t('Account cancellation request for [user:name] at [site:name]', array(), array('langcode' => $langcode));
+        break;
+      case 'cancel_confirm_body':
+        $text = t("[user:name],
+
+A request to cancel your account has been made at [site:name].
+
+You may now cancel your account on [site:url-brief] by clicking this link or copying and pasting it into your browser:
+
+[user:cancel-url]
+
+NOTE: The cancellation of your account is not reversible.
+
+This link expires in one day and nothing will happen if it is not used.
+
+--  [site:name] team", array(), array('langcode' => $langcode));
+        break;
+
+      case 'status_canceled_subject':
+        $text = t('Account details for [user:name] at [site:name] (canceled)', array(), array('langcode' => $langcode));
+        break;
+      case 'status_canceled_body':
+        $text = t("[user:name],
+
+Your account on [site:name] has been canceled.
+
+--  [site:name] team", array(), array('langcode' => $langcode));
+        break;
+    }
+  }
+
+  if ($replace) {
+    // We do not sanitize the token replacement, since the output of this
+    // replacement is intended for an e-mail message, not a web browser.
+    return token_replace($text, $variables, array('language' => $language, 'callback' => 'user_mail_tokens', 'sanitize' => FALSE, 'clear' => TRUE));
+  }
+
+  return $text;
+}
+
+/**
+ * Token callback to add unsafe tokens for user mails.
+ *
+ * This function is used by the token_replace() call at the end of
+ * _user_mail_text() to set up some additional tokens that can be
+ * used in email messages generated by user_mail().
+ *
+ * @param $replacements
+ *   An associative array variable containing mappings from token names to
+ *   values (for use with strtr()).
+ * @param $data
+ *   An associative array of token replacement values. If the 'user' element
+ *   exists, it must contain a user account object with the following
+ *   properties:
+ *   - login: The UNIX timestamp of the user's last login.
+ *   - pass: The hashed account login password.
+ * @param $options
+ *   Unused parameter required by the token_replace() function.
+ */
+function user_mail_tokens(&$replacements, $data, $options) {
+  if (isset($data['user'])) {
+    $replacements['[user:one-time-login-url]'] = user_pass_reset_url($data['user']);
+    $replacements['[user:cancel-url]'] = user_cancel_url($data['user']);
+  }
+}
+
+/*** Administrative features ***********************************************/
+
+/**
+ * Retrieve an array of roles matching specified conditions.
+ *
+ * @param $membersonly
+ *   Set this to TRUE to exclude the 'anonymous' role.
+ * @param $permission
+ *   A string containing a permission. If set, only roles containing that
+ *   permission are returned.
+ *
+ * @return
+ *   An associative array with the role id as the key and the role name as
+ *   value.
+ */
+function user_roles($membersonly = FALSE, $permission = NULL) {
+  $query = db_select('role', 'r');
+  $query->addTag('translatable');
+  $query->fields('r', array('rid', 'name'));
+  $query->orderBy('weight');
+  $query->orderBy('name');
+  if (!empty($permission)) {
+    $query->innerJoin('role_permission', 'p', 'r.rid = p.rid');
+    $query->condition('p.permission', $permission);
+  }
+  $result = $query->execute();
+
+  $roles = array();
+  foreach ($result as $role) {
+    switch ($role->rid) {
+      // We only translate the built in role names
+      case DRUPAL_ANONYMOUS_RID:
+        if (!$membersonly) {
+          $roles[$role->rid] = t($role->name);
+        }
+        break;
+      case DRUPAL_AUTHENTICATED_RID:
+        $roles[$role->rid] = t($role->name);
+        break;
+      default:
+        $roles[$role->rid] = $role->name;
+    }
+  }
+
+  return $roles;
+}
+
+/**
+ * Fetches a user role by role ID.
+ *
+ * @param $rid
+ *   An integer representing the role ID.
+ *
+ * @return
+ *   A fully-loaded role object if a role with the given ID exists, or FALSE
+ *   otherwise.
+ *
+ * @see user_role_load_by_name()
+ */
+function user_role_load($rid) {
+  return db_select('role', 'r')
+    ->fields('r')
+    ->condition('rid', $rid)
+    ->execute()
+    ->fetchObject();
+}
+
+/**
+ * Fetches a user role by role name.
+ *
+ * @param $role_name
+ *   A string representing the role name.
+ *
+ * @return
+ *   A fully-loaded role object if a role with the given name exists, or FALSE
+ *   otherwise.
+ *
+ * @see user_role_load()
+ */
+function user_role_load_by_name($role_name) {
+  return db_select('role', 'r')
+    ->fields('r')
+    ->condition('name', $role_name)
+    ->execute()
+    ->fetchObject();
+}
+
+/**
+ * Save a user role to the database.
+ *
+ * @param $role
+ *   A role object to modify or add. If $role->rid is not specified, a new
+ *   role will be created.
+ * @return
+ *   Status constant indicating if role was created or updated.
+ *   Failure to write the user role record will return FALSE. Otherwise.
+ *   SAVED_NEW or SAVED_UPDATED is returned depending on the operation
+ *   performed.
+ */
+function user_role_save($role) {
+  if ($role->name) {
+    // Prevent leading and trailing spaces in role names.
+    $role->name = trim($role->name);
+  }
+  if (!isset($role->weight)) {
+    // Set a role weight to make this new role last.
+    $query = db_select('role');
+    $query->addExpression('MAX(weight)');
+    $role->weight = $query->execute()->fetchField() + 1;
+  }
+
+  // Let modules modify the user role before it is saved to the database.
+  module_invoke_all('user_role_presave', $role);
+
+  if (!empty($role->rid) && $role->name) {
+    $status = drupal_write_record('role', $role, 'rid');
+    module_invoke_all('user_role_update', $role);
+  }
+  else {
+    $status = drupal_write_record('role', $role);
+    module_invoke_all('user_role_insert', $role);
+  }
+
+  // Clear the user access cache.
+  drupal_static_reset('user_access');
+  drupal_static_reset('user_role_permissions');
+
+  return $status;
+}
+
+/**
+ * Delete a user role from database.
+ *
+ * @param $role
+ *   A string with the role name, or an integer with the role ID.
+ */
+function user_role_delete($role) {
+  if (is_int($role)) {
+    $role = user_role_load($role);
+  }
+  else {
+    $role = user_role_load_by_name($role);
+  }
+
+  db_delete('role')
+    ->condition('rid', $role->rid)
+    ->execute();
+  db_delete('role_permission')
+    ->condition('rid', $role->rid)
+    ->execute();
+  // Update the users who have this role set:
+  db_delete('users_roles')
+    ->condition('rid', $role->rid)
+    ->execute();
+
+  module_invoke_all('user_role_delete', $role);
+
+  // Clear the user access cache.
+  drupal_static_reset('user_access');
+  drupal_static_reset('user_role_permissions');
+}
+
+/**
+ * Menu access callback for user role editing.
+ */
+function user_role_edit_access($role) {
+  // Prevent the system-defined roles from being altered or removed.
+  if ($role->rid == DRUPAL_ANONYMOUS_RID || $role->rid == DRUPAL_AUTHENTICATED_RID) {
+    return FALSE;
+  }
+
+  return user_access('administer permissions');
+}
+
+/**
+ * Determine the modules that permissions belong to.
+ *
+ * @return
+ *   An associative array in the format $permission => $module.
+ */
+function user_permission_get_modules() {
+  $permissions = array();
+  foreach (module_implements('permission') as $module) {
+    $perms = module_invoke($module, 'permission');
+    foreach ($perms as $key => $value) {
+      $permissions[$key] = $module;
+    }
+  }
+  return $permissions;
+}
+
+/**
+ * Change permissions for a user role.
+ *
+ * This function may be used to grant and revoke multiple permissions at once.
+ * For example, when a form exposes checkboxes to configure permissions for a
+ * role, the form submit handler may directly pass the submitted values for the
+ * checkboxes form element to this function.
+ *
+ * @param $rid
+ *   The ID of a user role to alter.
+ * @param $permissions
+ *   An associative array, where the key holds the permission name and the value
+ *   determines whether to grant or revoke that permission. Any value that
+ *   evaluates to TRUE will cause the permission to be granted. Any value that
+ *   evaluates to FALSE will cause the permission to be revoked.
+ *   @code
+ *     array(
+ *       'administer nodes' => 0,                // Revoke 'administer nodes'
+ *       'administer blocks' => FALSE,           // Revoke 'administer blocks'
+ *       'access user profiles' => 1,            // Grant 'access user profiles'
+ *       'access content' => TRUE,               // Grant 'access content'
+ *       'access comments' => 'access comments', // Grant 'access comments'
+ *     )
+ *   @endcode
+ *   Existing permissions are not changed, unless specified in $permissions.
+ *
+ * @see user_role_grant_permissions()
+ * @see user_role_revoke_permissions()
+ */
+function user_role_change_permissions($rid, array $permissions = array()) {
+  // Grant new permissions for the role.
+  $grant = array_filter($permissions);
+  if (!empty($grant)) {
+    user_role_grant_permissions($rid, array_keys($grant));
+  }
+  // Revoke permissions for the role.
+  $revoke = array_diff_assoc($permissions, $grant);
+  if (!empty($revoke)) {
+    user_role_revoke_permissions($rid, array_keys($revoke));
+  }
+}
+
+/**
+ * Grant permissions to a user role.
+ *
+ * @param $rid
+ *   The ID of a user role to alter.
+ * @param $permissions
+ *   A list of permission names to grant.
+ *
+ * @see user_role_change_permissions()
+ * @see user_role_revoke_permissions()
+ */
+function user_role_grant_permissions($rid, array $permissions = array()) {
+  $modules = user_permission_get_modules();
+  // Grant new permissions for the role.
+  foreach ($permissions as $name) {
+    db_merge('role_permission')
+      ->key(array(
+        'rid' => $rid,
+        'permission' => $name,
+      ))
+      ->fields(array(
+        'module' => $modules[$name],
+      ))
+      ->execute();
+  }
+
+  // Clear the user access cache.
+  drupal_static_reset('user_access');
+  drupal_static_reset('user_role_permissions');
+}
+
+/**
+ * Revoke permissions from a user role.
+ *
+ * @param $rid
+ *   The ID of a user role to alter.
+ * @param $permissions
+ *   A list of permission names to revoke.
+ *
+ * @see user_role_change_permissions()
+ * @see user_role_grant_permissions()
+ */
+function user_role_revoke_permissions($rid, array $permissions = array()) {
+  // Revoke permissions for the role.
+  db_delete('role_permission')
+    ->condition('rid', $rid)
+    ->condition('permission', $permissions, 'IN')
+    ->execute();
+
+  // Clear the user access cache.
+  drupal_static_reset('user_access');
+  drupal_static_reset('user_role_permissions');
+}
+
+/**
+ * Implements hook_user_operations().
+ */
+function user_user_operations($form = array(), $form_state = array()) {
+  $operations = array(
+    'unblock' => array(
+      'label' => t('Unblock the selected users'),
+      'callback' => 'user_user_operations_unblock',
+    ),
+    'block' => array(
+      'label' => t('Block the selected users'),
+      'callback' => 'user_user_operations_block',
+    ),
+    'cancel' => array(
+      'label' => t('Cancel the selected user accounts'),
+    ),
+  );
+
+  if (user_access('administer permissions')) {
+    $roles = user_roles(TRUE);
+    unset($roles[DRUPAL_AUTHENTICATED_RID]);  // Can't edit authenticated role.
+
+    $add_roles = array();
+    foreach ($roles as $key => $value) {
+      $add_roles['add_role-' . $key] = $value;
+    }
+
+    $remove_roles = array();
+    foreach ($roles as $key => $value) {
+      $remove_roles['remove_role-' . $key] = $value;
+    }
+
+    if (count($roles)) {
+      $role_operations = array(
+        t('Add a role to the selected users') => array(
+          'label' => $add_roles,
+        ),
+        t('Remove a role from the selected users') => array(
+          'label' => $remove_roles,
+        ),
+      );
+
+      $operations += $role_operations;
+    }
+  }
+
+  // If the form has been posted, we need to insert the proper data for
+  // role editing if necessary.
+  if (!empty($form_state['submitted'])) {
+    $operation_rid = explode('-', $form_state['values']['operation']);
+    $operation = $operation_rid[0];
+    if ($operation == 'add_role' || $operation == 'remove_role') {
+      $rid = $operation_rid[1];
+      if (user_access('administer permissions')) {
+        $operations[$form_state['values']['operation']] = array(
+          'callback' => 'user_multiple_role_edit',
+          'callback arguments' => array($operation, $rid),
+        );
+      }
+      else {
+        watchdog('security', 'Detected malicious attempt to alter protected user fields.', array(), WATCHDOG_WARNING);
+        return;
+      }
+    }
+  }
+
+  return $operations;
+}
+
+/**
+ * Callback function for admin mass unblocking users.
+ */
+function user_user_operations_unblock($accounts) {
+  $accounts = user_load_multiple($accounts);
+  foreach ($accounts as $account) {
+    // Skip unblocking user if they are already unblocked.
+    if ($account !== FALSE && $account->status == 0) {
+      user_save($account, array('status' => 1));
+    }
+  }
+}
+
+/**
+ * Callback function for admin mass blocking users.
+ */
+function user_user_operations_block($accounts) {
+  $accounts = user_load_multiple($accounts);
+  foreach ($accounts as $account) {
+    // Skip blocking user if they are already blocked.
+    if ($account !== FALSE && $account->status == 1) {
+      // For efficiency manually save the original account before applying any
+      // changes.
+      $account->original = clone $account;
+      user_save($account, array('status' => 0));
+    }
+  }
+}
+
+/**
+ * Callback function for admin mass adding/deleting a user role.
+ */
+function user_multiple_role_edit($accounts, $operation, $rid) {
+  // The role name is not necessary as user_save() will reload the user
+  // object, but some modules' hook_user() may look at this first.
+  $role_name = db_query('SELECT name FROM {role} WHERE rid = :rid', array(':rid' => $rid))->fetchField();
+
+  switch ($operation) {
+    case 'add_role':
+      $accounts = user_load_multiple($accounts);
+      foreach ($accounts as $account) {
+        // Skip adding the role to the user if they already have it.
+        if ($account !== FALSE && !isset($account->roles[$rid])) {
+          $roles = $account->roles + array($rid => $role_name);
+          // For efficiency manually save the original account before applying
+          // any changes.
+          $account->original = clone $account;
+          user_save($account, array('roles' => $roles));
+        }
+      }
+      break;
+    case 'remove_role':
+      $accounts = user_load_multiple($accounts);
+      foreach ($accounts as $account) {
+        // Skip removing the role from the user if they already don't have it.
+        if ($account !== FALSE && isset($account->roles[$rid])) {
+          $roles = array_diff($account->roles, array($rid => $role_name));
+          // For efficiency manually save the original account before applying
+          // any changes.
+          $account->original = clone $account;
+          user_save($account, array('roles' => $roles));
+        }
+      }
+      break;
+  }
+}
+
+function user_multiple_cancel_confirm($form, &$form_state) {
+  $edit = $form_state['input'];
+
+  $form['accounts'] = array('#prefix' => '<ul>', '#suffix' => '</ul>', '#tree' => TRUE);
+  $accounts = user_load_multiple(array_keys(array_filter($edit['accounts'])));
+  foreach ($accounts as $uid => $account) {
+    // Prevent user 1 from being canceled.
+    if ($uid <= 1) {
+      continue;
+    }
+    $form['accounts'][$uid] = array(
+      '#type' => 'hidden',
+      '#value' => $uid,
+      '#prefix' => '<li>',
+      '#suffix' => check_plain($account->name) . "</li>\n",
+    );
+  }
+
+  // Output a notice that user 1 cannot be canceled.
+  if (isset($accounts[1])) {
+    $redirect = (count($accounts) == 1);
+    $message = t('The user account %name cannot be cancelled.', array('%name' => $accounts[1]->name));
+    drupal_set_message($message, $redirect ? 'error' : 'warning');
+    // If only user 1 was selected, redirect to the overview.
+    if ($redirect) {
+      drupal_goto('admin/people');
+    }
+  }
+
+  $form['operation'] = array('#type' => 'hidden', '#value' => 'cancel');
+
+  module_load_include('inc', 'user', 'user.pages');
+  $form['user_cancel_method'] = array(
+    '#type' => 'item',
+    '#title' => t('When cancelling these accounts'),
+  );
+  $form['user_cancel_method'] += user_cancel_methods();
+  // Remove method descriptions.
+  foreach (element_children($form['user_cancel_method']) as $element) {
+    unset($form['user_cancel_method'][$element]['#description']);
+  }
+
+  // Allow to send the account cancellation confirmation mail.
+  $form['user_cancel_confirm'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Require e-mail confirmation to cancel account.'),
+    '#default_value' => FALSE,
+    '#description' => t('When enabled, the user must confirm the account cancellation via e-mail.'),
+  );
+  // Also allow to send account canceled notification mail, if enabled.
+  $form['user_cancel_notify'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Notify user when account is canceled.'),
+    '#default_value' => FALSE,
+    '#access' => variable_get('user_mail_status_canceled_notify', FALSE),
+    '#description' => t('When enabled, the user will receive an e-mail notification after the account has been cancelled.'),
+  );
+
+  return confirm_form($form,
+                      t('Are you sure you want to cancel these user accounts?'),
+                      'admin/people', t('This action cannot be undone.'),
+                      t('Cancel accounts'), t('Cancel'));
+}
+
+/**
+ * Submit handler for mass-account cancellation form.
+ *
+ * @see user_multiple_cancel_confirm()
+ * @see user_cancel_confirm_form_submit()
+ */
+function user_multiple_cancel_confirm_submit($form, &$form_state) {
+  global $user;
+
+  if ($form_state['values']['confirm']) {
+    foreach ($form_state['values']['accounts'] as $uid => $value) {
+      // Prevent programmatic form submissions from cancelling user 1.
+      if ($uid <= 1) {
+        continue;
+      }
+      // Prevent user administrators from deleting themselves without confirmation.
+      if ($uid == $user->uid) {
+        $admin_form_state = $form_state;
+        unset($admin_form_state['values']['user_cancel_confirm']);
+        $admin_form_state['values']['_account'] = $user;
+        user_cancel_confirm_form_submit(array(), $admin_form_state);
+      }
+      else {
+        user_cancel($form_state['values'], $uid, $form_state['values']['user_cancel_method']);
+      }
+    }
+  }
+  $form_state['redirect'] = 'admin/people';
+}
+
+/**
+ * Retrieve a list of all user setting/information categories and sort them by weight.
+ */
+function _user_categories() {
+  $categories = module_invoke_all('user_categories');
+  usort($categories, '_user_sort');
+
+  return $categories;
+}
+
+function _user_sort($a, $b) {
+  $a = (array) $a + array('weight' => 0, 'title' => '');
+  $b = (array) $b + array('weight' => 0, 'title' => '');
+  return $a['weight'] < $b['weight'] ? -1 : ($a['weight'] > $b['weight'] ? 1 : ($a['title'] < $b['title'] ? -1 : 1));
+}
+
+/**
+ * List user administration filters that can be applied.
+ */
+function user_filters() {
+  // Regular filters
+  $filters = array();
+  $roles = user_roles(TRUE);
+  unset($roles[DRUPAL_AUTHENTICATED_RID]); // Don't list authorized role.
+  if (count($roles)) {
+    $filters['role'] = array(
+      'title' => t('role'),
+      'field' => 'ur.rid',
+      'options' => array(
+        '[any]' => t('any'),
+      ) + $roles,
+    );
+  }
+
+  $options = array();
+  foreach (module_implements('permission') as $module) {
+    $function = $module . '_permission';
+    if ($permissions = $function()) {
+      asort($permissions);
+      foreach ($permissions as $permission => $description) {
+        $options[t('@module module', array('@module' => $module))][$permission] = t($permission);
+      }
+    }
+  }
+  ksort($options);
+  $filters['permission'] = array(
+    'title' => t('permission'),
+    'options' => array(
+      '[any]' => t('any'),
+    ) + $options,
+  );
+
+  $filters['status'] = array(
+    'title' => t('status'),
+    'field' => 'u.status',
+    'options' => array(
+      '[any]' => t('any'),
+      1 => t('active'),
+      0 => t('blocked'),
+    ),
+  );
+  return $filters;
+}
+
+/**
+ * Extends a query object for user administration filters based on session.
+ *
+ * @param $query
+ *   Query object that should be filtered.
+ */
+function user_build_filter_query(SelectQuery $query) {
+  $filters = user_filters();
+  // Extend Query with filter conditions.
+  foreach (isset($_SESSION['user_overview_filter']) ? $_SESSION['user_overview_filter'] : array() as $filter) {
+    list($key, $value) = $filter;
+    // This checks to see if this permission filter is an enabled permission for
+    // the authenticated role. If so, then all users would be listed, and we can
+    // skip adding it to the filter query.
+    if ($key == 'permission') {
+      $account = new stdClass();
+      $account->uid = 'user_filter';
+      $account->roles = array(DRUPAL_AUTHENTICATED_RID => 1);
+      if (user_access($value, $account)) {
+        continue;
+      }
+      $users_roles_alias = $query->join('users_roles', 'ur', '%alias.uid = u.uid');
+      $permission_alias = $query->join('role_permission', 'p', $users_roles_alias . '.rid = %alias.rid');
+      $query->condition($permission_alias . '.permission', $value);
+    }
+    elseif ($key == 'role') {
+      $users_roles_alias = $query->join('users_roles', 'ur', '%alias.uid = u.uid');
+      $query->condition($users_roles_alias . '.rid' , $value);
+    }
+    else {
+      $query->condition($filters[$key]['field'], $value);
+    }
+  }
+}
+
+/**
+ * Implements hook_comment_view().
+ */
+function user_comment_view($comment) {
+  if (variable_get('user_signatures', 0) && !empty($comment->signature)) {
+    // @todo This alters and replaces the original object value, so a
+    //   hypothetical process of loading, viewing, and saving will hijack the
+    //   stored data. Consider renaming to $comment->signature_safe or similar
+    //   here and elsewhere in Drupal 8.
+    $comment->signature = check_markup($comment->signature, $comment->signature_format, '', TRUE);
+  }
+  else {
+    $comment->signature = '';
+  }
+}
+
+/**
+ * Returns HTML for a user signature.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - signature: The user's signature.
+ *
+ * @ingroup themeable
+ */
+function theme_user_signature($variables) {
+  $signature = $variables['signature'];
+  $output = '';
+
+  if ($signature) {
+    $output .= '<div class="clear">';
+    $output .= '<div>—</div>';
+    $output .= $signature;
+    $output .= '</div>';
+  }
+
+  return $output;
+}
+
+/**
+ * Get the language object preferred by the user. This user preference can
+ * be set on the user account editing page, and is only available if there
+ * are more than one languages enabled on the site. If the user did not
+ * choose a preferred language, or is the anonymous user, the $default
+ * value, or if it is not set, the site default language will be returned.
+ *
+ * @param $account
+ *   User account to look up language for.
+ * @param $default
+ *   Optional default language object to return if the account
+ *   has no valid language.
+ */
+function user_preferred_language($account, $default = NULL) {
+  $language_list = language_list();
+  if (!empty($account->language) && isset($language_list[$account->language])) {
+    return $language_list[$account->language];
+  }
+  else {
+    return $default ? $default : language_default();
+  }
+}
+
+/**
+ * Conditionally create and send a notification email when a certain
+ * operation happens on the given user account.
+ *
+ * @see user_mail_tokens()
+ * @see drupal_mail()
+ *
+ * @param $op
+ *   The operation being performed on the account. Possible values:
+ *   - 'register_admin_created': Welcome message for user created by the admin.
+ *   - 'register_no_approval_required': Welcome message when user
+ *     self-registers.
+ *   - 'register_pending_approval': Welcome message, user pending admin
+ *     approval.
+ *   - 'password_reset': Password recovery request.
+ *   - 'status_activated': Account activated.
+ *   - 'status_blocked': Account blocked.
+ *   - 'cancel_confirm': Account cancellation request.
+ *   - 'status_canceled': Account canceled.
+ *
+ * @param $account
+ *   The user object of the account being notified. Must contain at
+ *   least the fields 'uid', 'name', and 'mail'.
+ * @param $language
+ *   Optional language to use for the notification, overriding account language.
+ *
+ * @return
+ *   The return value from drupal_mail_system()->mail(), if ends up being
+ *   called.
+ */
+function _user_mail_notify($op, $account, $language = NULL) {
+  // By default, we always notify except for canceled and blocked.
+  $default_notify = ($op != 'status_canceled' && $op != 'status_blocked');
+  $notify = variable_get('user_mail_' . $op . '_notify', $default_notify);
+  if ($notify) {
+    $params['account'] = $account;
+    $language = $language ? $language : user_preferred_language($account);
+    $mail = drupal_mail('user', $op, $account->mail, $language, $params);
+    if ($op == 'register_pending_approval') {
+      // If a user registered requiring admin approval, notify the admin, too.
+      // We use the site default language for this.
+      drupal_mail('user', 'register_pending_approval_admin', variable_get('site_mail', ini_get('sendmail_from')), language_default(), $params);
+    }
+  }
+  return empty($mail) ? NULL : $mail['result'];
+}
+
+/**
+ * Form element process handler for client-side password validation.
+ *
+ * This #process handler is automatically invoked for 'password_confirm' form
+ * elements to add the JavaScript and string translations for dynamic password
+ * validation.
+ *
+ * @see system_element_info()
+ */
+function user_form_process_password_confirm($element) {
+  global $user;
+
+  $js_settings = array(
+    'password' => array(
+      'strengthTitle' => t('Password strength:'),
+      'hasWeaknesses' => t('To make your password stronger:'),
+      'tooShort' => t('Make it at least 6 characters'),
+      'addLowerCase' => t('Add lowercase letters'),
+      'addUpperCase' => t('Add uppercase letters'),
+      'addNumbers' => t('Add numbers'),
+      'addPunctuation' => t('Add punctuation'),
+      'sameAsUsername' => t('Make it different from your username'),
+      'confirmSuccess' => t('yes'),
+      'confirmFailure' => t('no'),
+      'weak' => t('Weak'),
+      'fair' => t('Fair'),
+      'good' => t('Good'),
+      'strong' => t('Strong'),
+      'confirmTitle' => t('Passwords match:'),
+      'username' => (isset($user->name) ? $user->name : ''),
+    ),
+  );
+
+  $element['#attached']['js'][] = drupal_get_path('module', 'user') . '/user.js';
+  // Ensure settings are only added once per page.
+  static $already_added = FALSE;
+  if (!$already_added) {
+    $already_added = TRUE;
+    $element['#attached']['js'][] = array('data' => $js_settings, 'type' => 'setting');
+  }
+
+  return $element;
+}
+
+/**
+ * Implements hook_node_load().
+ */
+function user_node_load($nodes, $types) {
+  // Build an array of all uids for node authors, keyed by nid.
+  $uids = array();
+  foreach ($nodes as $nid => $node) {
+    $uids[$nid] = $node->uid;
+  }
+
+  // Fetch name, picture, and data for these users.
+  $user_fields = db_query("SELECT uid, name, picture, data FROM {users} WHERE uid IN (:uids)", array(':uids' => $uids))->fetchAllAssoc('uid');
+
+  // Add these values back into the node objects.
+  foreach ($uids as $nid => $uid) {
+    $nodes[$nid]->name = $user_fields[$uid]->name;
+    $nodes[$nid]->picture = $user_fields[$uid]->picture;
+    $nodes[$nid]->data = $user_fields[$uid]->data;
+  }
+}
+
+/**
+ * Implements hook_image_style_delete().
+ */
+function user_image_style_delete($style) {
+  // If a style is deleted, update the variables.
+  // Administrators choose a replacement style when deleting.
+  user_image_style_save($style);
+}
+
+/**
+ * Implements hook_image_style_save().
+ */
+function user_image_style_save($style) {
+  // If a style is renamed, update the variables that use it.
+  if (isset($style['old_name']) && $style['old_name'] == variable_get('user_picture_style', '')) {
+    variable_set('user_picture_style', $style['name']);
+  }
+}
+
+/**
+ * Implements hook_action_info().
+ */
+function user_action_info() {
+  return array(
+    'user_block_user_action' => array(
+      'label' => t('Block current user'),
+      'type' => 'user',
+      'configurable' => FALSE,
+      'triggers' => array('any'),
+    ),
+  );
+}
+
+/**
+ * Blocks a specific user or the current user, if one is not specified.
+ *
+ * @param $entity
+ *   (optional) An entity object; if it is provided and it has a uid property,
+ *   the user with that ID is blocked.
+ * @param $context
+ *   (optional) An associative array; if no user ID is found in $entity, the
+ *   'uid' element of this array determines the user to block.
+ *
+ * @ingroup actions
+ */
+function user_block_user_action(&$entity, $context = array()) {
+  // First priority: If there is a $entity->uid, block that user.
+  // This is most likely a user object or the author if a node or comment.
+  if (isset($entity->uid)) {
+    $uid = $entity->uid;
+  }
+  elseif (isset($context['uid'])) {
+    $uid = $context['uid'];
+  }
+  // If neither of those are valid, then block the current user.
+  else {
+    $uid = $GLOBALS['user']->uid;
+  }
+  $account = user_load($uid);
+  $account = user_save($account, array('status' => 0));
+  watchdog('action', 'Blocked user %name.', array('%name' => $account->name));
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Add a checkbox for the 'user_register_form' instance settings on the 'Edit
+ * field instance' form.
+ */
+function user_form_field_ui_field_edit_form_alter(&$form, &$form_state, $form_id) {
+  $instance = $form['#instance'];
+
+  if ($instance['entity_type'] == 'user' && !$form['#field']['locked']) {
+    $form['instance']['settings']['user_register_form'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Display on user registration form.'),
+      '#description' => t("This is compulsory for 'required' fields."),
+      // Field instances created in D7 beta releases before the setting was
+      // introduced might be set as 'required' and 'not shown on user_register
+      // form'. We make sure the checkbox comes as 'checked' for those.
+      '#default_value' => $instance['settings']['user_register_form'] || $instance['required'],
+      // Display just below the 'required' checkbox.
+      '#weight' => $form['instance']['required']['#weight'] + .1,
+      // Disabled when the 'required' checkbox is checked.
+      '#states' => array(
+        'enabled' => array('input[name="instance[required]"]' => array('checked' => FALSE)),
+      ),
+      // Checked when the 'required' checkbox is checked. This is done through
+      // a custom behavior, since the #states system would also synchronize on
+      // uncheck.
+      '#attached' => array(
+        'js' => array(drupal_get_path('module', 'user') . '/user.js'),
+      ),
+    );
+
+    array_unshift($form['#submit'], 'user_form_field_ui_field_edit_form_submit');
+  }
+}
+
+/**
+ * Additional submit handler for the 'Edit field instance' form.
+ *
+ * Make sure the 'user_register_form' setting is set for required fields.
+ */
+function user_form_field_ui_field_edit_form_submit($form, &$form_state) {
+  $instance = $form_state['values']['instance'];
+
+  if (!empty($instance['required'])) {
+    form_set_value($form['instance']['settings']['user_register_form'], 1, $form_state);
+  }
+}
+
+/**
+ * Form builder; the user registration form.
+ *
+ * @ingroup forms
+ * @see user_account_form()
+ * @see user_account_form_validate()
+ * @see user_register_submit()
+ */
+function user_register_form($form, &$form_state) {
+  global $user;
+
+  $admin = user_access('administer users');
+
+  // Pass access information to the submit handler. Running an access check
+  // inside the submit function interferes with form processing and breaks
+  // hook_form_alter().
+  $form['administer_users'] = array(
+     '#type' => 'value',
+     '#value' => $admin,
+  );
+
+  // If we aren't admin but already logged on, go to the user page instead.
+  if (!$admin && $user->uid) {
+    drupal_goto('user/' . $user->uid);
+  }
+
+  $form['#user'] = drupal_anonymous_user();
+  $form['#user_category'] = 'register';
+
+  $form['#attached']['library'][] = array('system', 'jquery.cookie');
+  $form['#attributes']['class'][] = 'user-info-from-cookie';
+
+  // Start with the default user account fields.
+  user_account_form($form, $form_state);
+
+  // Attach field widgets, and hide the ones where the 'user_register_form'
+  // setting is not on.
+  $langcode = entity_language('user', $form['#user']);
+  field_attach_form('user', $form['#user'], $form, $form_state, $langcode);
+  foreach (field_info_instances('user', 'user') as $field_name => $instance) {
+    if (empty($instance['settings']['user_register_form'])) {
+      $form[$field_name]['#access'] = FALSE;
+    }
+  }
+
+  if ($admin) {
+    // Redirect back to page which initiated the create request;
+    // usually admin/people/create.
+    $form_state['redirect'] = $_GET['q'];
+  }
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Create new account'),
+  );
+
+  $form['#validate'][] = 'user_register_validate';
+  // Add the final user registration form submit handler.
+  $form['#submit'][] = 'user_register_submit';
+
+  return $form;
+}
+
+/**
+ * Validation function for the user registration form.
+ */
+function user_register_validate($form, &$form_state) {
+  entity_form_field_validate('user', $form, $form_state);
+}
+
+/**
+ * Submit handler for the user registration form.
+ *
+ * This function is shared by the installation form and the normal registration form,
+ * which is why it can't be in the user.pages.inc file.
+ *
+ * @see user_register_form()
+ */
+function user_register_submit($form, &$form_state) {
+  $admin = $form_state['values']['administer_users'];
+
+  if (!variable_get('user_email_verification', TRUE) || $admin) {
+    $pass = $form_state['values']['pass'];
+  }
+  else {
+    $pass = user_password();
+  }
+  $notify = !empty($form_state['values']['notify']);
+
+  // Remove unneeded values.
+  form_state_values_clean($form_state);
+
+  $form_state['values']['pass'] = $pass;
+  $form_state['values']['init'] = $form_state['values']['mail'];
+
+  $account = $form['#user'];
+
+  entity_form_submit_build_entity('user', $account, $form, $form_state);
+
+  // Populate $edit with the properties of $account, which have been edited on
+  // this form by taking over all values, which appear in the form values too.
+  $edit = array_intersect_key((array) $account, $form_state['values']);
+  $account = user_save($account, $edit);
+
+  // Terminate if an error occurred during user_save().
+  if (!$account) {
+    drupal_set_message(t("Error saving user account."), 'error');
+    $form_state['redirect'] = '';
+    return;
+  }
+  $form_state['user'] = $account;
+  $form_state['values']['uid'] = $account->uid;
+
+  watchdog('user', 'New user: %name (%email).', array('%name' => $form_state['values']['name'], '%email' => $form_state['values']['mail']), WATCHDOG_NOTICE, l(t('edit'), 'user/' . $account->uid . '/edit'));
+
+  // Add plain text password into user account to generate mail tokens.
+  $account->password = $pass;
+
+  // New administrative account without notification.
+  $uri = entity_uri('user', $account);
+  if ($admin && !$notify) {
+    drupal_set_message(t('Created a new user account for <a href="@url">%name</a>. No e-mail has been sent.', array('@url' => url($uri['path'], $uri['options']), '%name' => $account->name)));
+  }
+  // No e-mail verification required; log in user immediately.
+  elseif (!$admin && !variable_get('user_email_verification', TRUE) && $account->status) {
+    _user_mail_notify('register_no_approval_required', $account);
+    $form_state['uid'] = $account->uid;
+    user_login_submit(array(), $form_state);
+    drupal_set_message(t('Registration successful. You are now logged in.'));
+    $form_state['redirect'] = '';
+  }
+  // No administrator approval required.
+  elseif ($account->status || $notify) {
+    $op = $notify ? 'register_admin_created' : 'register_no_approval_required';
+    _user_mail_notify($op, $account);
+    if ($notify) {
+      drupal_set_message(t('A welcome message with further instructions has been e-mailed to the new user <a href="@url">%name</a>.', array('@url' => url($uri['path'], $uri['options']), '%name' => $account->name)));
+    }
+    else {
+      drupal_set_message(t('A welcome message with further instructions has been sent to your e-mail address.'));
+      $form_state['redirect'] = '';
+    }
+  }
+  // Administrator approval required.
+  else {
+    _user_mail_notify('register_pending_approval', $account);
+    drupal_set_message(t('Thank you for applying for an account. Your account is currently pending approval by the site administrator.<br />In the meantime, a welcome message with further instructions has been sent to your e-mail address.'));
+    $form_state['redirect'] = '';
+  }
+}
+
+/**
+ * Implements hook_modules_installed().
+ */
+function user_modules_installed($modules) {
+  // Assign all available permissions to the administrator role.
+  $rid = variable_get('user_admin_role', 0);
+  if ($rid) {
+    $permissions = array();
+    foreach ($modules as $module) {
+      if ($module_permissions = module_invoke($module, 'permission')) {
+        $permissions = array_merge($permissions, array_keys($module_permissions));
+      }
+    }
+    if (!empty($permissions)) {
+      user_role_grant_permissions($rid, $permissions);
+    }
+  }
+}
+
+/**
+ * Implements hook_modules_uninstalled().
+ */
+function user_modules_uninstalled($modules) {
+   db_delete('role_permission')
+     ->condition('module', $modules, 'IN')
+     ->execute();
+}
+
+/**
+ * Helper function to rewrite the destination to avoid redirecting to login page after login.
+ *
+ * Third-party authentication modules may use this function to determine the
+ * proper destination after a user has been properly logged in.
+ */
+function user_login_destination() {
+  $destination = drupal_get_destination();
+  if ($destination['destination'] == 'user/login') {
+    $destination['destination'] = 'user';
+  }
+  return $destination;
+}
+
+/**
+ * Saves visitor information as a cookie so it can be reused.
+ *
+ * @param $values
+ *   An array of key/value pairs to be saved into a cookie.
+ */
+function user_cookie_save(array $values) {
+  foreach ($values as $field => $value) {
+    // Set cookie for 365 days.
+    setrawcookie('Drupal.visitor.' . $field, rawurlencode($value), REQUEST_TIME + 31536000, '/');
+  }
+}
+
+/**
+ * Delete a visitor information cookie.
+ *
+ * @param $cookie_name
+ *   A cookie name such as 'homepage'.
+ */
+function user_cookie_delete($cookie_name) {
+  setrawcookie('Drupal.visitor.' . $cookie_name, '', REQUEST_TIME - 3600, '/');
+}
+
+/**
+ * Implements hook_rdf_mapping().
+ */
+function user_rdf_mapping() {
+  return array(
+    array(
+      'type' => 'user',
+      'bundle' => RDF_DEFAULT_BUNDLE,
+      'mapping' => array(
+        'rdftype' => array('sioc:UserAccount'),
+        'name' => array(
+          'predicates' => array('foaf:name'),
+        ),
+        'homepage' => array(
+          'predicates' => array('foaf:page'),
+          'type' => 'rel',
+        ),
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_file_download_access().
+ */
+function user_file_download_access($field, $entity_type, $entity) {
+  if ($entity_type == 'user') {
+    return user_view_access($entity);
+  }
+}
+
+/**
+ * Implements hook_system_info_alter().
+ *
+ * Drupal 7 ships with two methods to add additional fields to users: Profile
+ * module, a legacy module dating back from 2002, and Field API integration
+ * with users. While Field API support for users currently provides less end
+ * user features, the inefficient data storage mechanism of Profile module, as
+ * well as its lack of consistency with the rest of the entity / field based
+ * systems in Drupal 7, make this a sub-optimal solution to those who were not
+ * using it in previous releases of Drupal.
+ *
+ * To prevent new Drupal 7 sites from installing Profile module, and
+ * unwittingly ending up with two completely different and incompatible methods
+ * of extending users, only make the Profile module available if the profile_*
+ * tables are present.
+ *
+ * @todo: Remove in D8, pending upgrade path.
+ */
+function user_system_info_alter(&$info, $file, $type) {
+  if ($type == 'module' && $file->name == 'profile' && db_table_exists('profile_field')) {
+    $info['hidden'] = FALSE;
+  }
+}
diff --git a/htmltest/modules/user/user.pages.inc b/htmltest/modules/user/user.pages.inc
new file mode 100644
index 00000000..7d40663e
--- /dev/null
+++ b/htmltest/modules/user/user.pages.inc
@@ -0,0 +1,562 @@
+<?php
+
+/**
+ * @file
+ * User page callback file for the user module.
+ */
+
+/**
+ * Menu callback; Retrieve a JSON object containing autocomplete suggestions for existing users.
+ */
+function user_autocomplete($string = '') {
+  $matches = array();
+  if ($string) {
+    $result = db_select('users')->fields('users', array('name'))->condition('name', db_like($string) . '%', 'LIKE')->range(0, 10)->execute();
+    foreach ($result as $user) {
+      $matches[$user->name] = check_plain($user->name);
+    }
+  }
+
+  drupal_json_output($matches);
+}
+
+/**
+ * Form builder; Request a password reset.
+ *
+ * @ingroup forms
+ * @see user_pass_validate()
+ * @see user_pass_submit()
+ */
+function user_pass() {
+  global $user;
+
+  $form['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Username or e-mail address'),
+    '#size' => 60,
+    '#maxlength' => max(USERNAME_MAX_LENGTH, EMAIL_MAX_LENGTH),
+    '#required' => TRUE,
+    '#default_value' => isset($_GET['name']) ? $_GET['name'] : '',
+  );
+  // Allow logged in users to request this also.
+  if ($user->uid > 0) {
+    $form['name']['#type'] = 'value';
+    $form['name']['#value'] = $user->mail;
+    $form['mail'] = array(
+      '#prefix' => '<p>',
+      '#markup' =>  t('Password reset instructions will be mailed to %email. You must log out to use the password reset link in the e-mail.', array('%email' => $user->mail)),
+      '#suffix' => '</p>',
+    );
+  }
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('E-mail new password'));
+
+  return $form;
+}
+
+function user_pass_validate($form, &$form_state) {
+  $name = trim($form_state['values']['name']);
+  // Try to load by email.
+  $users = user_load_multiple(array(), array('mail' => $name, 'status' => '1'));
+  $account = reset($users);
+  if (!$account) {
+    // No success, try to load by name.
+    $users = user_load_multiple(array(), array('name' => $name, 'status' => '1'));
+    $account = reset($users);
+  }
+  if (isset($account->uid)) {
+    form_set_value(array('#parents' => array('account')), $account, $form_state);
+  }
+  else {
+    form_set_error('name', t('Sorry, %name is not recognized as a user name or an e-mail address.', array('%name' => $name)));
+  }
+}
+
+function user_pass_submit($form, &$form_state) {
+  global $language;
+
+  $account = $form_state['values']['account'];
+  // Mail one time login URL and instructions using current language.
+  $mail = _user_mail_notify('password_reset', $account, $language);
+  if (!empty($mail)) {
+    watchdog('user', 'Password reset instructions mailed to %name at %email.', array('%name' => $account->name, '%email' => $account->mail));
+    drupal_set_message(t('Further instructions have been sent to your e-mail address.'));
+  }
+
+  $form_state['redirect'] = 'user';
+  return;
+}
+
+/**
+ * Menu callback; process one time login link and redirects to the user page on success.
+ */
+function user_pass_reset($form, &$form_state, $uid, $timestamp, $hashed_pass, $action = NULL) {
+  global $user;
+
+  // When processing the one-time login link, we have to make sure that a user
+  // isn't already logged in.
+  if ($user->uid) {
+    // The existing user is already logged in.
+    if ($user->uid == $uid) {
+      drupal_set_message(t('You are logged in as %user. <a href="!user_edit">Change your password.</a>', array('%user' => $user->name, '!user_edit' => url("user/$user->uid/edit"))));
+    }
+    // A different user is already logged in on the computer.
+    else {
+      $reset_link_account = user_load($uid);
+      if (!empty($reset_link_account)) {
+        drupal_set_message(t('Another user (%other_user) is already logged into the site on this computer, but you tried to use a one-time link for user %resetting_user. Please <a href="!logout">logout</a> and try using the link again.',
+          array('%other_user' => $user->name, '%resetting_user' => $reset_link_account->name, '!logout' => url('user/logout'))));
+      } else {
+        // Invalid one-time link specifies an unknown user.
+        drupal_set_message(t('The one-time login link you clicked is invalid.'));
+      }
+    }
+    drupal_goto();
+  }
+  else {
+    // Time out, in seconds, until login URL expires. Defaults to 24 hours =
+    // 86400 seconds.
+    $timeout = variable_get('user_password_reset_timeout', 86400);
+    $current = REQUEST_TIME;
+    // Some redundant checks for extra security ?
+    $users = user_load_multiple(array($uid), array('status' => '1'));
+    if ($timestamp <= $current && $account = reset($users)) {
+      // No time out for first time login.
+      if ($account->login && $current - $timestamp > $timeout) {
+        drupal_set_message(t('You have tried to use a one-time login link that has expired. Please request a new one using the form below.'));
+        drupal_goto('user/password');
+      }
+      elseif ($account->uid && $timestamp >= $account->login && $timestamp <= $current && $hashed_pass == user_pass_rehash($account->pass, $timestamp, $account->login)) {
+        // First stage is a confirmation form, then login
+        if ($action == 'login') {
+          // Set the new user.
+          $user = $account;
+          // user_login_finalize() also updates the login timestamp of the
+          // user, which invalidates further use of the one-time login link.
+          user_login_finalize();
+          watchdog('user', 'User %name used one-time login link at time %timestamp.', array('%name' => $account->name, '%timestamp' => $timestamp));
+          drupal_set_message(t('You have just used your one-time login link. It is no longer necessary to use this link to log in. Please change your password.'));
+          // Let the user's password be changed without the current password check.
+          $token = drupal_random_key();
+          $_SESSION['pass_reset_' . $user->uid] = $token;
+          drupal_goto('user/' . $user->uid . '/edit', array('query' => array('pass-reset-token' => $token)));
+        }
+        else {
+          $form['message'] = array('#markup' => t('<p>This is a one-time login for %user_name and will expire on %expiration_date.</p><p>Click on this button to log in to the site and change your password.</p>', array('%user_name' => $account->name, '%expiration_date' => format_date($timestamp + $timeout))));
+          $form['help'] = array('#markup' => '<p>' . t('This login can be used only once.') . '</p>');
+          $form['actions'] = array('#type' => 'actions');
+          $form['actions']['submit'] = array('#type' => 'submit', '#value' => t('Log in'));
+          $form['#action'] = url("user/reset/$uid/$timestamp/$hashed_pass/login");
+          return $form;
+        }
+      }
+      else {
+        drupal_set_message(t('You have tried to use a one-time login link that has either been used or is no longer valid. Please request a new one using the form below.'));
+        drupal_goto('user/password');
+      }
+    }
+    else {
+      // Deny access, no more clues.
+      // Everything will be in the watchdog's URL for the administrator to check.
+      drupal_access_denied();
+      drupal_exit();
+    }
+  }
+}
+
+/**
+ * Menu callback; logs the current user out, and redirects to the home page.
+ */
+function user_logout() {
+  global $user;
+
+  watchdog('user', 'Session closed for %name.', array('%name' => $user->name));
+
+  module_invoke_all('user_logout', $user);
+
+  // Destroy the current session, and reset $user to the anonymous user.
+  session_destroy();
+
+  drupal_goto();
+}
+
+/**
+ * Process variables for user-profile.tpl.php.
+ *
+ * The $variables array contains the following arguments:
+ * - $account
+ *
+ * @see user-profile.tpl.php
+ */
+function template_preprocess_user_profile(&$variables) {
+  $account = $variables['elements']['#account'];
+
+  // Helpful $user_profile variable for templates.
+  foreach (element_children($variables['elements']) as $key) {
+    $variables['user_profile'][$key] = $variables['elements'][$key];
+  }
+
+  // Preprocess fields.
+  field_attach_preprocess('user', $account, $variables['elements'], $variables);
+}
+
+/**
+ * Process variables for user-profile-item.tpl.php.
+ *
+ * The $variables array contains the following arguments:
+ * - $element
+ *
+ * @see user-profile-item.tpl.php
+ */
+function template_preprocess_user_profile_item(&$variables) {
+  $variables['title'] = $variables['element']['#title'];
+  $variables['value'] = $variables['element']['#markup'];
+  $variables['attributes'] = '';
+  if (isset($variables['element']['#attributes'])) {
+    $variables['attributes'] = drupal_attributes($variables['element']['#attributes']);
+  }
+}
+
+/**
+ * Process variables for user-profile-category.tpl.php.
+ *
+ * The $variables array contains the following arguments:
+ * - $element
+ *
+ * @see user-profile-category.tpl.php
+ */
+function template_preprocess_user_profile_category(&$variables) {
+  $variables['title'] = check_plain($variables['element']['#title']);
+  $variables['profile_items'] = $variables['element']['#children'];
+  $variables['attributes'] = '';
+  if (isset($variables['element']['#attributes'])) {
+    $variables['attributes'] = drupal_attributes($variables['element']['#attributes']);
+  }
+}
+
+/**
+ * Form builder; edit a user account or one of their profile categories.
+ *
+ * @ingroup forms
+ * @see user_account_form()
+ * @see user_account_form_validate()
+ * @see user_profile_form_validate()
+ * @see user_profile_form_submit()
+ * @see user_cancel_confirm_form_submit()
+ */
+function user_profile_form($form, &$form_state, $account, $category = 'account') {
+  global $user;
+
+  // During initial form build, add the entity to the form state for use during
+  // form building and processing. During a rebuild, use what is in the form
+  // state.
+  if (!isset($form_state['user'])) {
+    $form_state['user'] = $account;
+  }
+  else {
+    $account = $form_state['user'];
+  }
+
+  // @todo Legacy support. Modules are encouraged to access the entity using
+  //   $form_state. Remove in Drupal 8.
+  $form['#user'] = $account;
+  $form['#user_category'] = $category;
+
+  if ($category == 'account') {
+    user_account_form($form, $form_state);
+    // Attach field widgets.
+    $langcode = entity_language('user', $account);
+    field_attach_form('user', $account, $form, $form_state, $langcode);
+  }
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+  );
+  if ($category == 'account') {
+    $form['actions']['cancel'] = array(
+      '#type' => 'submit',
+      '#value' => t('Cancel account'),
+      '#submit' => array('user_edit_cancel_submit'),
+      '#access' => $account->uid > 1 && (($account->uid == $user->uid && user_access('cancel account')) || user_access('administer users')),
+    );
+  }
+
+  $form['#validate'][] = 'user_profile_form_validate';
+  // Add the final user profile form submit handler.
+  $form['#submit'][] = 'user_profile_form_submit';
+
+  return $form;
+}
+
+/**
+ * Validation function for the user account and profile editing form.
+ */
+function user_profile_form_validate($form, &$form_state) {
+  entity_form_field_validate('user', $form, $form_state);
+}
+
+/**
+ * Submit function for the user account and profile editing form.
+ */
+function user_profile_form_submit($form, &$form_state) {
+  $account = $form_state['user'];
+  $category = $form['#user_category'];
+  // Remove unneeded values.
+  form_state_values_clean($form_state);
+
+  // Before updating the account entity, keep an unchanged copy for use with
+  // user_save() later. This is necessary for modules implementing the user
+  // hooks to be able to react on changes by comparing the values of $account
+  // and $edit.
+  $account_unchanged = clone $account;
+
+  entity_form_submit_build_entity('user', $account, $form, $form_state);
+
+  // Populate $edit with the properties of $account, which have been edited on
+  // this form by taking over all values, which appear in the form values too.
+  $edit = array_intersect_key((array) $account, $form_state['values']);
+
+  user_save($account_unchanged, $edit, $category);
+  $form_state['values']['uid'] = $account->uid;
+
+  if ($category == 'account' && !empty($edit['pass'])) {
+    // Remove the password reset tag since a new password was saved.
+    unset($_SESSION['pass_reset_'. $account->uid]);
+  }
+  // Clear the page cache because pages can contain usernames and/or profile information:
+  cache_clear_all();
+
+  drupal_set_message(t('The changes have been saved.'));
+}
+
+/**
+ * Submit function for the 'Cancel account' button on the user edit form.
+ */
+function user_edit_cancel_submit($form, &$form_state) {
+  $destination = array();
+  if (isset($_GET['destination'])) {
+    $destination = drupal_get_destination();
+    unset($_GET['destination']);
+  }
+  // Note: We redirect from user/uid/edit to user/uid/cancel to make the tabs disappear.
+  $form_state['redirect'] = array("user/" . $form['#user']->uid . "/cancel", array('query' => $destination));
+}
+
+/**
+ * Form builder; confirm form for cancelling user account.
+ *
+ * @ingroup forms
+ * @see user_edit_cancel_submit()
+ */
+function user_cancel_confirm_form($form, &$form_state, $account) {
+  global $user;
+
+  $form['_account'] = array('#type' => 'value', '#value' => $account);
+
+  // Display account cancellation method selection, if allowed.
+  $default_method = variable_get('user_cancel_method', 'user_cancel_block');
+  $admin_access = user_access('administer users');
+  $can_select_method = $admin_access || user_access('select account cancellation method');
+  $form['user_cancel_method'] = array(
+    '#type' => 'item',
+    '#title' => ($account->uid == $user->uid ? t('When cancelling your account') : t('When cancelling the account')),
+    '#access' => $can_select_method,
+  );
+  $form['user_cancel_method'] += user_cancel_methods();
+
+  // Allow user administrators to skip the account cancellation confirmation
+  // mail (by default), as long as they do not attempt to cancel their own
+  // account.
+  $override_access = $admin_access && ($account->uid != $user->uid);
+  $form['user_cancel_confirm'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Require e-mail confirmation to cancel account.'),
+    '#default_value' => ($override_access ? FALSE : TRUE),
+    '#access' => $override_access,
+    '#description' => t('When enabled, the user must confirm the account cancellation via e-mail.'),
+  );
+  // Also allow to send account canceled notification mail, if enabled.
+  $default_notify = variable_get('user_mail_status_canceled_notify', FALSE);
+  $form['user_cancel_notify'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Notify user when account is canceled.'),
+    '#default_value' => ($override_access ? FALSE : $default_notify),
+    '#access' => $override_access && $default_notify,
+    '#description' => t('When enabled, the user will receive an e-mail notification after the account has been cancelled.'),
+  );
+
+  // Prepare confirmation form page title and description.
+  if ($account->uid == $user->uid) {
+    $question = t('Are you sure you want to cancel your account?');
+  }
+  else {
+    $question = t('Are you sure you want to cancel the account %name?', array('%name' => $account->name));
+  }
+  $description = '';
+  if ($can_select_method) {
+    $description = t('Select the method to cancel the account above.');
+    foreach (element_children($form['user_cancel_method']) as $element) {
+      unset($form['user_cancel_method'][$element]['#description']);
+    }
+  }
+  else {
+    // The radio button #description is used as description for the confirmation
+    // form.
+    foreach (element_children($form['user_cancel_method']) as $element) {
+      if ($form['user_cancel_method'][$element]['#default_value'] == $form['user_cancel_method'][$element]['#return_value']) {
+        $description = $form['user_cancel_method'][$element]['#description'];
+      }
+      unset($form['user_cancel_method'][$element]['#description']);
+    }
+  }
+
+  // Always provide entity id in the same form key as in the entity edit form.
+  $form['uid'] = array('#type' => 'value', '#value' => $account->uid);
+  return confirm_form($form,
+    $question,
+    'user/' . $account->uid,
+    $description . ' ' . t('This action cannot be undone.'),
+    t('Cancel account'), t('Cancel'));
+}
+
+/**
+ * Submit handler for the account cancellation confirm form.
+ *
+ * @see user_cancel_confirm_form()
+ * @see user_multiple_cancel_confirm_submit()
+ */
+function user_cancel_confirm_form_submit($form, &$form_state) {
+  global $user;
+  $account = $form_state['values']['_account'];
+
+  // Cancel account immediately, if the current user has administrative
+  // privileges, no confirmation mail shall be sent, and the user does not
+  // attempt to cancel the own account.
+  if (user_access('administer users') && empty($form_state['values']['user_cancel_confirm']) && $account->uid != $user->uid) {
+    user_cancel($form_state['values'], $account->uid, $form_state['values']['user_cancel_method']);
+
+    $form_state['redirect'] = 'admin/people';
+  }
+  else {
+    // Store cancelling method and whether to notify the user in $account for
+    // user_cancel_confirm().
+    $edit = array(
+      'user_cancel_method' => $form_state['values']['user_cancel_method'],
+      'user_cancel_notify' => $form_state['values']['user_cancel_notify'],
+    );
+    $account = user_save($account, $edit);
+    _user_mail_notify('cancel_confirm', $account);
+    drupal_set_message(t('A confirmation request to cancel your account has been sent to your e-mail address.'));
+    watchdog('user', 'Sent account cancellation request to %name %email.', array('%name' => $account->name, '%email' => '<' . $account->mail . '>'), WATCHDOG_NOTICE);
+
+    $form_state['redirect'] = "user/$account->uid";
+  }
+}
+
+/**
+ * Helper function to return available account cancellation methods.
+ *
+ * See documentation of hook_user_cancel_methods_alter().
+ *
+ * @return
+ *   An array containing all account cancellation methods as form elements.
+ *
+ * @see hook_user_cancel_methods_alter()
+ * @see user_admin_settings()
+ * @see user_cancel_confirm_form()
+ * @see user_multiple_cancel_confirm()
+ */
+function user_cancel_methods() {
+  $methods = array(
+    'user_cancel_block' => array(
+      'title' => t('Disable the account and keep its content.'),
+      'description' => t('Your account will be blocked and you will no longer be able to log in. All of your content will remain attributed to your user name.'),
+    ),
+    'user_cancel_block_unpublish' => array(
+      'title' => t('Disable the account and unpublish its content.'),
+      'description' => t('Your account will be blocked and you will no longer be able to log in. All of your content will be hidden from everyone but administrators.'),
+    ),
+    'user_cancel_reassign' => array(
+      'title' => t('Delete the account and make its content belong to the %anonymous-name user.', array('%anonymous-name' => variable_get('anonymous', t('Anonymous')))),
+      'description' => t('Your account will be removed and all account information deleted. All of your content will be assigned to the %anonymous-name user.', array('%anonymous-name' => variable_get('anonymous', t('Anonymous')))),
+    ),
+    'user_cancel_delete' => array(
+      'title' => t('Delete the account and its content.'),
+      'description' => t('Your account will be removed and all account information deleted. All of your content will also be deleted.'),
+      'access' => user_access('administer users'),
+    ),
+  );
+  // Allow modules to customize account cancellation methods.
+  drupal_alter('user_cancel_methods', $methods);
+
+  // Turn all methods into real form elements.
+  $default_method = variable_get('user_cancel_method', 'user_cancel_block');
+  foreach ($methods as $name => $method) {
+    $form[$name] = array(
+      '#type' => 'radio',
+      '#title' => $method['title'],
+      '#description' => (isset($method['description']) ? $method['description'] : NULL),
+      '#return_value' => $name,
+      '#default_value' => $default_method,
+      '#parents' => array('user_cancel_method'),
+    );
+  }
+  return $form;
+}
+
+/**
+ * Menu callback; Cancel a user account via e-mail confirmation link.
+ *
+ * @see user_cancel_confirm_form()
+ * @see user_cancel_url()
+ */
+function user_cancel_confirm($account, $timestamp = 0, $hashed_pass = '') {
+  // Time out in seconds until cancel URL expires; 24 hours = 86400 seconds.
+  $timeout = 86400;
+  $current = REQUEST_TIME;
+
+  // Basic validation of arguments.
+  if (isset($account->data['user_cancel_method']) && !empty($timestamp) && !empty($hashed_pass)) {
+    // Validate expiration and hashed password/login.
+    if ($timestamp <= $current && $current - $timestamp < $timeout && $account->uid && $timestamp >= $account->login && $hashed_pass == user_pass_rehash($account->pass, $timestamp, $account->login)) {
+      $edit = array(
+        'user_cancel_notify' => isset($account->data['user_cancel_notify']) ? $account->data['user_cancel_notify'] : variable_get('user_mail_status_canceled_notify', FALSE),
+      );
+      user_cancel($edit, $account->uid, $account->data['user_cancel_method']);
+      // Since user_cancel() is not invoked via Form API, batch processing needs
+      // to be invoked manually and should redirect to the front page after
+      // completion.
+      batch_process('');
+    }
+    else {
+      drupal_set_message(t('You have tried to use an account cancellation link that has expired. Please request a new one using the form below.'));
+      drupal_goto("user/$account->uid/cancel");
+    }
+  }
+  return MENU_ACCESS_DENIED;
+}
+
+/**
+ * Page callback: Displays the user page.
+ *
+ * Displays user profile if user is logged in, or login form for anonymous
+ * users.
+ *
+ * @return
+ *   A render array for either a user profile or a login form.
+ *
+ * @see user_view_page()
+ * @see user_login()
+ */
+function user_page() {
+  global $user;
+  if ($user->uid) {
+    menu_set_active_item('user/' . $user->uid);
+    return menu_execute_active_handler(NULL, FALSE);
+  }
+  else {
+    return drupal_get_form('user_login');
+  }
+}
diff --git a/htmltest/modules/user/user.permissions.js b/htmltest/modules/user/user.permissions.js
new file mode 100644
index 00000000..988820e1
--- /dev/null
+++ b/htmltest/modules/user/user.permissions.js
@@ -0,0 +1,69 @@
+(function ($) {
+
+/**
+ * Shows checked and disabled checkboxes for inherited permissions.
+ */
+Drupal.behaviors.permissions = {
+  attach: function (context) {
+    var self = this;
+    $('table#permissions').once('permissions', function () {
+      // On a site with many roles and permissions, this behavior initially has
+      // to perform thousands of DOM manipulations to inject checkboxes and hide
+      // them. By detaching the table from the DOM, all operations can be
+      // performed without triggering internal layout and re-rendering processes
+      // in the browser.
+      var $table = $(this);
+      if ($table.prev().length) {
+        var $ancestor = $table.prev(), method = 'after';
+      }
+      else {
+        var $ancestor = $table.parent(), method = 'append';
+      }
+      $table.detach();
+
+      // Create dummy checkboxes. We use dummy checkboxes instead of reusing
+      // the existing checkboxes here because new checkboxes don't alter the
+      // submitted form. If we'd automatically check existing checkboxes, the
+      // permission table would be polluted with redundant entries. This
+      // is deliberate, but desirable when we automatically check them.
+      var $dummy = $('<input type="checkbox" class="dummy-checkbox" disabled="disabled" checked="checked" />')
+        .attr('title', Drupal.t("This permission is inherited from the authenticated user role."))
+        .hide();
+
+      $('input[type=checkbox]', this).not('.rid-2, .rid-1').addClass('real-checkbox').each(function () {
+        $dummy.clone().insertAfter(this);
+      });
+
+      // Initialize the authenticated user checkbox.
+      $('input[type=checkbox].rid-2', this)
+        .bind('click.permissions', self.toggle)
+        // .triggerHandler() cannot be used here, as it only affects the first
+        // element.
+        .each(self.toggle);
+
+      // Re-insert the table into the DOM.
+      $ancestor[method]($table);
+    });
+  },
+
+  /**
+   * Toggles all dummy checkboxes based on the checkboxes' state.
+   *
+   * If the "authenticated user" checkbox is checked, the checked and disabled
+   * checkboxes are shown, the real checkboxes otherwise.
+   */
+  toggle: function () {
+    var authCheckbox = this, $row = $(this).closest('tr');
+    // jQuery performs too many layout calculations for .hide() and .show(),
+    // leading to a major page rendering lag on sites with many roles and
+    // permissions. Therefore, we toggle visibility directly.
+    $row.find('.real-checkbox').each(function () {
+      this.style.display = (authCheckbox.checked ? 'none' : '');
+    });
+    $row.find('.dummy-checkbox').each(function () {
+      this.style.display = (authCheckbox.checked ? '' : 'none');
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/modules/user/user.test b/htmltest/modules/user/user.test
new file mode 100644
index 00000000..e2086d4f
--- /dev/null
+++ b/htmltest/modules/user/user.test
@@ -0,0 +1,2368 @@
+<?php
+
+/**
+ * @file
+ * Tests for user.module.
+ */
+
+class UserRegistrationTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'User registration',
+      'description' => 'Test registration of user under different configurations.',
+      'group' => 'User'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('field_test');
+  }
+
+  function testRegistrationWithEmailVerification() {
+    // Require e-mail verification.
+    variable_set('user_email_verification', TRUE);
+
+    // Set registration to administrator only.
+    variable_set('user_register', USER_REGISTER_ADMINISTRATORS_ONLY);
+    $this->drupalGet('user/register');
+    $this->assertResponse(403, 'Registration page is inaccessible when only administrators can create accounts.');
+
+    // Allow registration by site visitors without administrator approval.
+    variable_set('user_register', USER_REGISTER_VISITORS);
+    $edit = array();
+    $edit['name'] = $name = $this->randomName();
+    $edit['mail'] = $mail = $edit['name'] . '@example.com';
+    $this->drupalPost('user/register', $edit, t('Create new account'));
+    $this->assertText(t('A welcome message with further instructions has been sent to your e-mail address.'), 'User registered successfully.');
+    $accounts = user_load_multiple(array(), array('name' => $name, 'mail' => $mail));
+    $new_user = reset($accounts);
+    $this->assertTrue($new_user->status, 'New account is active after registration.');
+
+    // Allow registration by site visitors, but require administrator approval.
+    variable_set('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL);
+    $edit = array();
+    $edit['name'] = $name = $this->randomName();
+    $edit['mail'] = $mail = $edit['name'] . '@example.com';
+    $this->drupalPost('user/register', $edit, t('Create new account'));
+    $accounts = user_load_multiple(array(), array('name' => $name, 'mail' => $mail));
+    $new_user = reset($accounts);
+    $this->assertFalse($new_user->status, 'New account is blocked until approved by an administrator.');
+  }
+
+  function testRegistrationWithoutEmailVerification() {
+    // Don't require e-mail verification.
+    variable_set('user_email_verification', FALSE);
+
+    // Allow registration by site visitors without administrator approval.
+    variable_set('user_register', USER_REGISTER_VISITORS);
+    $edit = array();
+    $edit['name'] = $name = $this->randomName();
+    $edit['mail'] = $mail = $edit['name'] . '@example.com';
+
+    // Try entering a mismatching password.
+    $edit['pass[pass1]'] = '99999.0';
+    $edit['pass[pass2]'] = '99999';
+    $this->drupalPost('user/register', $edit, t('Create new account'));
+    $this->assertText(t('The specified passwords do not match.'), 'Typing mismatched passwords displays an error message.');
+
+    // Enter a correct password.
+    $edit['pass[pass1]'] = $new_pass = $this->randomName();
+    $edit['pass[pass2]'] = $new_pass;
+    $this->drupalPost('user/register', $edit, t('Create new account'));
+    $accounts = user_load_multiple(array(), array('name' => $name, 'mail' => $mail));
+    $new_user = reset($accounts);
+    $this->assertText(t('Registration successful. You are now logged in.'), 'Users are logged in after registering.');
+    $this->drupalLogout();
+
+    // Allow registration by site visitors, but require administrator approval.
+    variable_set('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL);
+    $edit = array();
+    $edit['name'] = $name = $this->randomName();
+    $edit['mail'] = $mail = $edit['name'] . '@example.com';
+    $edit['pass[pass1]'] = $pass = $this->randomName();
+    $edit['pass[pass2]'] = $pass;
+    $this->drupalPost('user/register', $edit, t('Create new account'));
+    $this->assertText(t('Thank you for applying for an account. Your account is currently pending approval by the site administrator.'), 'Users are notified of pending approval');
+
+    // Try to login before administrator approval.
+    $auth = array(
+      'name' => $name,
+      'pass' => $pass,
+    );
+    $this->drupalPost('user/login', $auth, t('Log in'));
+    $this->assertText(t('The username @name has not been activated or is blocked.', array('@name' => $name)), 'User cannot login yet.');
+
+    // Activate the new account.
+    $accounts = user_load_multiple(array(), array('name' => $name, 'mail' => $mail));
+    $new_user = reset($accounts);
+    $admin_user = $this->drupalCreateUser(array('administer users'));
+    $this->drupalLogin($admin_user);
+    $edit = array(
+      'status' => 1,
+    );
+    $this->drupalPost('user/' . $new_user->uid . '/edit', $edit, t('Save'));
+    $this->drupalLogout();
+
+    // Login after administrator approval.
+    $this->drupalPost('user/login', $auth, t('Log in'));
+    $this->assertText(t('Member for'), 'User can log in after administrator approval.');
+  }
+
+  function testRegistrationEmailDuplicates() {
+    // Don't require e-mail verification.
+    variable_set('user_email_verification', FALSE);
+
+    // Allow registration by site visitors without administrator approval.
+    variable_set('user_register', USER_REGISTER_VISITORS);
+
+    // Set up a user to check for duplicates.
+    $duplicate_user = $this->drupalCreateUser();
+
+    $edit = array();
+    $edit['name'] = $this->randomName();
+    $edit['mail'] = $duplicate_user->mail;
+
+    // Attempt to create a new account using an existing e-mail address.
+    $this->drupalPost('user/register', $edit, t('Create new account'));
+    $this->assertText(t('The e-mail address @email is already registered.', array('@email' => $duplicate_user->mail)), 'Supplying an exact duplicate email address displays an error message');
+
+    // Attempt to bypass duplicate email registration validation by adding spaces.
+    $edit['mail'] = '   ' . $duplicate_user->mail . '   ';
+
+    $this->drupalPost('user/register', $edit, t('Create new account'));
+    $this->assertText(t('The e-mail address @email is already registered.', array('@email' => $duplicate_user->mail)), 'Supplying a duplicate email address with added whitespace displays an error message');
+  }
+
+  function testRegistrationDefaultValues() {
+    // Allow registration by site visitors without administrator approval.
+    variable_set('user_register', USER_REGISTER_VISITORS);
+
+    // Don't require e-mail verification.
+    variable_set('user_email_verification', FALSE);
+
+    // Set the default timezone to Brussels.
+    variable_set('configurable_timezones', 1);
+    variable_set('date_default_timezone', 'Europe/Brussels');
+
+    // Check that the account information fieldset's options are not displayed
+    // is a fieldset if there is not more than one fieldset in the form.
+    $this->drupalGet('user/register');
+    $this->assertNoRaw('<fieldset id="edit-account"><legend>Account information</legend>', 'Account settings fieldset was hidden.');
+
+    $edit = array();
+    $edit['name'] = $name = $this->randomName();
+    $edit['mail'] = $mail = $edit['name'] . '@example.com';
+    $edit['pass[pass1]'] = $new_pass = $this->randomName();
+    $edit['pass[pass2]'] = $new_pass;
+    $this->drupalPost(NULL, $edit, t('Create new account'));
+
+    // Check user fields.
+    $accounts = user_load_multiple(array(), array('name' => $name, 'mail' => $mail));
+    $new_user = reset($accounts);
+    $this->assertEqual($new_user->name, $name, 'Username matches.');
+    $this->assertEqual($new_user->mail, $mail, 'E-mail address matches.');
+    $this->assertEqual($new_user->theme, '', 'Correct theme field.');
+    $this->assertEqual($new_user->signature, '', 'Correct signature field.');
+    $this->assertTrue(($new_user->created > REQUEST_TIME - 20 ), 'Correct creation time.');
+    $this->assertEqual($new_user->status, variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL) == USER_REGISTER_VISITORS ? 1 : 0, 'Correct status field.');
+    $this->assertEqual($new_user->timezone, variable_get('date_default_timezone'), 'Correct time zone field.');
+    $this->assertEqual($new_user->language, '', 'Correct language field.');
+    $this->assertEqual($new_user->picture, '', 'Correct picture field.');
+    $this->assertEqual($new_user->init, $mail, 'Correct init field.');
+  }
+
+  /**
+   * Tests Field API fields on user registration forms.
+   */
+  function testRegistrationWithUserFields() {
+    // Create a field, and an instance on 'user' entity type.
+    $field = array(
+      'type' => 'test_field',
+      'field_name' => 'test_user_field',
+      'cardinality' => 1,
+    );
+    field_create_field($field);
+    $instance = array(
+      'field_name' => 'test_user_field',
+      'entity_type' => 'user',
+      'label' => 'Some user field',
+      'bundle' => 'user',
+      'required' => TRUE,
+      'settings' => array('user_register_form' => FALSE),
+    );
+    field_create_instance($instance);
+
+    // Check that the field does not appear on the registration form.
+    $this->drupalGet('user/register');
+    $this->assertNoText($instance['label'], 'The field does not appear on user registration form');
+
+    // Have the field appear on the registration form.
+    $instance['settings']['user_register_form'] = TRUE;
+    field_update_instance($instance);
+    $this->drupalGet('user/register');
+    $this->assertText($instance['label'], 'The field appears on user registration form');
+
+    // Check that validation errors are correctly reported.
+    $edit = array();
+    $edit['name'] = $name = $this->randomName();
+    $edit['mail'] = $mail = $edit['name'] . '@example.com';
+    // Missing input in required field.
+    $edit['test_user_field[und][0][value]'] = '';
+    $this->drupalPost(NULL, $edit, t('Create new account'));
+    $this->assertRaw(t('@name field is required.', array('@name' => $instance['label'])), 'Field validation error was correctly reported.');
+    // Invalid input.
+    $edit['test_user_field[und][0][value]'] = '-1';
+    $this->drupalPost(NULL, $edit, t('Create new account'));
+    $this->assertRaw(t('%name does not accept the value -1.', array('%name' => $instance['label'])), 'Field validation error was correctly reported.');
+
+    // Submit with valid data.
+    $value = rand(1, 255);
+    $edit['test_user_field[und][0][value]'] = $value;
+    $this->drupalPost(NULL, $edit, t('Create new account'));
+    // Check user fields.
+    $accounts = user_load_multiple(array(), array('name' => $name, 'mail' => $mail));
+    $new_user = reset($accounts);
+    $this->assertEqual($new_user->test_user_field[LANGUAGE_NONE][0]['value'], $value, 'The field value was correctly saved.');
+
+    // Check that the 'add more' button works.
+    $field['cardinality'] = FIELD_CARDINALITY_UNLIMITED;
+    field_update_field($field);
+    foreach (array('js', 'nojs') as $js) {
+      $this->drupalGet('user/register');
+      // Add two inputs.
+      $value = rand(1, 255);
+      $edit = array();
+      $edit['test_user_field[und][0][value]'] = $value;
+      if ($js == 'js') {
+        $this->drupalPostAJAX(NULL, $edit, 'test_user_field_add_more');
+        $this->drupalPostAJAX(NULL, $edit, 'test_user_field_add_more');
+      }
+      else {
+        $this->drupalPost(NULL, $edit, t('Add another item'));
+        $this->drupalPost(NULL, $edit, t('Add another item'));
+      }
+      // Submit with three values.
+      $edit['test_user_field[und][1][value]'] = $value + 1;
+      $edit['test_user_field[und][2][value]'] = $value + 2;
+      $edit['name'] = $name = $this->randomName();
+      $edit['mail'] = $mail = $edit['name'] . '@example.com';
+      $this->drupalPost(NULL, $edit, t('Create new account'));
+      // Check user fields.
+      $accounts = user_load_multiple(array(), array('name' => $name, 'mail' => $mail));
+      $new_user = reset($accounts);
+      $this->assertEqual($new_user->test_user_field[LANGUAGE_NONE][0]['value'], $value, format_string('@js : The field value was correclty saved.', array('@js' => $js)));
+      $this->assertEqual($new_user->test_user_field[LANGUAGE_NONE][1]['value'], $value + 1, format_string('@js : The field value was correclty saved.', array('@js' => $js)));
+      $this->assertEqual($new_user->test_user_field[LANGUAGE_NONE][2]['value'], $value + 2, format_string('@js : The field value was correclty saved.', array('@js' => $js)));
+    }
+  }
+}
+
+class UserValidationTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Username/e-mail validation',
+      'description' => 'Verify that username/email validity checks behave as designed.',
+      'group' => 'User'
+    );
+  }
+
+  // Username validation.
+  function testUsernames() {
+    $test_cases = array( // '<username>' => array('<description>', 'assert<testName>'),
+      'foo'                    => array('Valid username', 'assertNull'),
+      'FOO'                    => array('Valid username', 'assertNull'),
+      'Foo O\'Bar'             => array('Valid username', 'assertNull'),
+      'foo@bar'                => array('Valid username', 'assertNull'),
+      'foo@example.com'        => array('Valid username', 'assertNull'),
+      'foo@-example.com'       => array('Valid username', 'assertNull'), // invalid domains are allowed in usernames
+      'þòøÇßªř€'               => array('Valid username', 'assertNull'),
+      'ᚠᛇᚻ᛫ᛒᛦᚦ'                => array('Valid UTF8 username', 'assertNull'), // runes
+      ' foo'                   => array('Invalid username that starts with a space', 'assertNotNull'),
+      'foo '                   => array('Invalid username that ends with a space', 'assertNotNull'),
+      'foo  bar'               => array('Invalid username that contains 2 spaces \'&nbsp;&nbsp;\'', 'assertNotNull'),
+      ''                       => array('Invalid empty username', 'assertNotNull'),
+      'foo/'                   => array('Invalid username containing invalid chars', 'assertNotNull'),
+      'foo' . chr(0) . 'bar'   => array('Invalid username containing chr(0)', 'assertNotNull'), // NULL
+      'foo' . chr(13) . 'bar'  => array('Invalid username containing chr(13)', 'assertNotNull'), // CR
+      str_repeat('x', USERNAME_MAX_LENGTH + 1) => array('Invalid excessively long username', 'assertNotNull'),
+    );
+    foreach ($test_cases as $name => $test_case) {
+      list($description, $test) = $test_case;
+      $result = user_validate_name($name);
+      $this->$test($result, $description . ' (' . $name . ')');
+    }
+  }
+
+  // Mail validation. More extensive tests can be found at common.test
+  function testMailAddresses() {
+    $test_cases = array( // '<username>' => array('<description>', 'assert<testName>'),
+      ''                => array('Empty mail address', 'assertNotNull'),
+      'foo'             => array('Invalid mail address', 'assertNotNull'),
+      'foo@example.com' => array('Valid mail address', 'assertNull'),
+    );
+    foreach ($test_cases as $name => $test_case) {
+      list($description, $test) = $test_case;
+      $result = user_validate_mail($name);
+      $this->$test($result, $description . ' (' . $name . ')');
+    }
+  }
+}
+
+/**
+ * Functional tests for user logins, including rate limiting of login attempts.
+ */
+class UserLoginTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'User login',
+      'description' => 'Ensure that login works as expected.',
+      'group' => 'User',
+    );
+  }
+
+  /**
+   * Test the global login flood control.
+   */
+  function testGlobalLoginFloodControl() {
+    // Set the global login limit.
+    variable_set('user_failed_login_ip_limit', 10);
+    // Set a high per-user limit out so that it is not relevant in the test.
+    variable_set('user_failed_login_user_limit', 4000);
+
+    $user1 = $this->drupalCreateUser(array());
+    $incorrect_user1 = clone $user1;
+    $incorrect_user1->pass_raw .= 'incorrect';
+
+    // Try 2 failed logins.
+    for ($i = 0; $i < 2; $i++) {
+      $this->assertFailedLogin($incorrect_user1);
+    }
+
+    // A successful login will not reset the IP-based flood control count.
+    $this->drupalLogin($user1);
+    $this->drupalLogout();
+
+    // Try 8 more failed logins, they should not trigger the flood control
+    // mechanism.
+    for ($i = 0; $i < 8; $i++) {
+      $this->assertFailedLogin($incorrect_user1);
+    }
+
+    // The next login trial should result in an IP-based flood error message.
+    $this->assertFailedLogin($incorrect_user1, 'ip');
+
+    // A login with the correct password should also result in a flood error
+    // message.
+    $this->assertFailedLogin($user1, 'ip');
+  }
+
+  /**
+   * Test the per-user login flood control.
+   */
+  function testPerUserLoginFloodControl() {
+    // Set a high global limit out so that it is not relevant in the test.
+    variable_set('user_failed_login_ip_limit', 4000);
+    // Set the per-user login limit.
+    variable_set('user_failed_login_user_limit', 3);
+
+    $user1 = $this->drupalCreateUser(array());
+    $incorrect_user1 = clone $user1;
+    $incorrect_user1->pass_raw .= 'incorrect';
+
+    $user2 = $this->drupalCreateUser(array());
+
+    // Try 2 failed logins.
+    for ($i = 0; $i < 2; $i++) {
+      $this->assertFailedLogin($incorrect_user1);
+    }
+
+    // A successful login will reset the per-user flood control count.
+    $this->drupalLogin($user1);
+    $this->drupalLogout();
+
+    // Try 3 failed logins for user 1, they will not trigger flood control.
+    for ($i = 0; $i < 3; $i++) {
+      $this->assertFailedLogin($incorrect_user1);
+    }
+
+    // Try one successful attempt for user 2, it should not trigger any
+    // flood control.
+    $this->drupalLogin($user2);
+    $this->drupalLogout();
+
+    // Try one more attempt for user 1, it should be rejected, even if the
+    // correct password has been used.
+    $this->assertFailedLogin($user1, 'user');
+  }
+
+  /**
+   * Test that user password is re-hashed upon login after changing $count_log2.
+   */
+  function testPasswordRehashOnLogin() {
+    // Load password hashing API.
+    require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
+    // Set initial $count_log2 to the default, DRUPAL_HASH_COUNT.
+    variable_set('password_count_log2', DRUPAL_HASH_COUNT);
+    // Create a new user and authenticate.
+    $account = $this->drupalCreateUser(array());
+    $password = $account->pass_raw;
+    $this->drupalLogin($account);
+    $this->drupalLogout();
+    // Load the stored user. The password hash should reflect $count_log2.
+    $account = user_load($account->uid);
+    $this->assertIdentical(_password_get_count_log2($account->pass), DRUPAL_HASH_COUNT);
+    // Change $count_log2 and log in again.
+    variable_set('password_count_log2', DRUPAL_HASH_COUNT + 1);
+    $account->pass_raw = $password;
+    $this->drupalLogin($account);
+    // Load the stored user, which should have a different password hash now.
+    $account = user_load($account->uid, TRUE);
+    $this->assertIdentical(_password_get_count_log2($account->pass), DRUPAL_HASH_COUNT + 1);
+  }
+
+  /**
+   * Make an unsuccessful login attempt.
+   *
+   * @param $account
+   *   A user object with name and pass_raw attributes for the login attempt.
+   * @param $flood_trigger
+   *   Whether or not to expect that the flood control mechanism will be
+   *   triggered.
+   */
+  function assertFailedLogin($account, $flood_trigger = NULL) {
+    $edit = array(
+      'name' => $account->name,
+      'pass' => $account->pass_raw,
+    );
+    $this->drupalPost('user', $edit, t('Log in'));
+    $this->assertNoFieldByXPath("//input[@name='pass' and @value!='']", NULL, 'Password value attribute is blank.');
+    if (isset($flood_trigger)) {
+      if ($flood_trigger == 'user') {
+        $this->assertRaw(format_plural(variable_get('user_failed_login_user_limit', 5), 'Sorry, there has been more than one failed login attempt for this account. It is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', 'Sorry, there have been more than @count failed login attempts for this account. It is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', array('@url' => url('user/password'))));
+      }
+      else {
+        // No uid, so the limit is IP-based.
+        $this->assertRaw(t('Sorry, too many failed login attempts from your IP address. This IP address is temporarily blocked. Try again later or <a href="@url">request a new password</a>.', array('@url' => url('user/password'))));
+      }
+    }
+    else {
+      $this->assertText(t('Sorry, unrecognized username or password. Have you forgotten your password?'));
+    }
+  }
+}
+
+/**
+ * Tests resetting a user password.
+ */
+class UserPasswordResetTestCase extends DrupalWebTestCase {
+  protected $profile = 'standard';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Reset password',
+      'description' => 'Ensure that password reset methods work as expected.',
+      'group' => 'User',
+    );
+  }
+
+  /**
+   * Tests password reset functionality.
+   */
+  function testUserPasswordReset() {
+    // Create a user.
+    $account = $this->drupalCreateUser();
+    $this->drupalLogin($account);
+    $this->drupalLogout();
+    // Attempt to reset password.
+    $edit = array('name' => $account->name);
+    $this->drupalPost('user/password', $edit, t('E-mail new password'));
+    // Confirm the password reset.
+    $this->assertText(t('Further instructions have been sent to your e-mail address.'), 'Password reset instructions mailed message displayed.');
+  }
+
+  /**
+   * Attempts login using an expired password reset link.
+   */
+  function testUserPasswordResetExpired() {
+    // Set password reset timeout variable to 43200 seconds = 12 hours.
+    $timeout = 43200;
+    variable_set('user_password_reset_timeout', $timeout);
+
+    // Create a user.
+    $account = $this->drupalCreateUser();
+    $this->drupalLogin($account);
+    // Load real user object.
+    $account = user_load($account->uid, TRUE);
+    $this->drupalLogout();
+
+    // To attempt an expired password reset, create a password reset link as if
+    // its request time was 60 seconds older than the allowed limit of timeout.
+    $bogus_timestamp = REQUEST_TIME - variable_get('user_password_reset_timeout', 86400) - 60;
+    $this->drupalGet("user/reset/$account->uid/$bogus_timestamp/" . user_pass_rehash($account->pass, $bogus_timestamp, $account->login));
+    $this->assertText(t('You have tried to use a one-time login link that has expired. Please request a new one using the form below.'), 'Expired password reset request rejected.');
+  }
+
+  /**
+   * Prefill the text box on incorrect login via link to password reset page.
+   */
+  function testUserPasswordTextboxFilled() {
+    $this->drupalGet('user/login');
+    $edit = array(
+      'name' => $this->randomName(),
+      'pass' => $this->randomName(),
+    );
+    $this->drupalPost('user', $edit, t('Log in'));
+    $this->assertRaw(t('Sorry, unrecognized username or password. <a href="@password">Have you forgotten your password?</a>',
+      array('@password' => url('user/password', array('query' => array('name' => $edit['name']))))));
+    unset($edit['pass']);
+    $this->drupalGet('user/password', array('query' => array('name' => $edit['name'])));
+    $this->assertFieldByName('name', $edit['name'], 'User name found.');
+  }
+
+}
+
+/**
+ * Test cancelling a user.
+ */
+class UserCancelTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Cancel account',
+      'description' => 'Ensure that account cancellation methods work as expected.',
+      'group' => 'User',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('comment');
+  }
+
+  /**
+   * Attempt to cancel account without permission.
+   */
+  function testUserCancelWithoutPermission() {
+    variable_set('user_cancel_method', 'user_cancel_reassign');
+
+    // Create a user.
+    $account = $this->drupalCreateUser(array());
+    $this->drupalLogin($account);
+    // Load real user object.
+    $account = user_load($account->uid, TRUE);
+
+    // Create a node.
+    $node = $this->drupalCreateNode(array('uid' => $account->uid));
+
+    // Attempt to cancel account.
+    $this->drupalGet('user/' . $account->uid . '/edit');
+    $this->assertNoRaw(t('Cancel account'), 'No cancel account button displayed.');
+
+    // Attempt bogus account cancellation request confirmation.
+    $timestamp = $account->login;
+    $this->drupalGet("user/$account->uid/cancel/confirm/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login));
+    $this->assertResponse(403, 'Bogus cancelling request rejected.');
+    $account = user_load($account->uid);
+    $this->assertTrue($account->status == 1, 'User account was not canceled.');
+
+    // Confirm user's content has not been altered.
+    $test_node = node_load($node->nid, NULL, TRUE);
+    $this->assertTrue(($test_node->uid == $account->uid && $test_node->status == 1), 'Node of the user has not been altered.');
+  }
+
+  /**
+   * Tests that user account for uid 1 cannot be cancelled.
+   *
+   * This should never be possible, or the site owner would become unable to
+   * administer the site.
+   */
+  function testUserCancelUid1() {
+    // Update uid 1's name and password to we know it.
+    $password = user_password();
+    require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
+    $account = array(
+      'name' => 'user1',
+      'pass' => user_hash_password(trim($password)),
+    );
+    // We cannot use user_save() here or the password would be hashed again.
+    db_update('users')
+      ->fields($account)
+      ->condition('uid', 1)
+      ->execute();
+
+    // Reload and log in uid 1.
+    $user1 = user_load(1, TRUE);
+    $user1->pass_raw = $password;
+
+    // Try to cancel uid 1's account with a different user.
+    $this->admin_user = $this->drupalCreateUser(array('administer users'));
+    $this->drupalLogin($this->admin_user);
+    $edit = array(
+      'operation' => 'cancel',
+      'accounts[1]' => TRUE,
+    );
+    $this->drupalPost('admin/people', $edit, t('Update'));
+
+    // Verify that uid 1's account was not cancelled.
+    $user1 = user_load(1, TRUE);
+    $this->assertEqual($user1->status, 1, 'User #1 still exists and is not blocked.');
+  }
+
+  /**
+   * Attempt invalid account cancellations.
+   */
+  function testUserCancelInvalid() {
+    variable_set('user_cancel_method', 'user_cancel_reassign');
+
+    // Create a user.
+    $account = $this->drupalCreateUser(array('cancel account'));
+    $this->drupalLogin($account);
+    // Load real user object.
+    $account = user_load($account->uid, TRUE);
+
+    // Create a node.
+    $node = $this->drupalCreateNode(array('uid' => $account->uid));
+
+    // Attempt to cancel account.
+    $this->drupalPost('user/' . $account->uid . '/edit', NULL, t('Cancel account'));
+
+    // Confirm account cancellation.
+    $timestamp = time();
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+    $this->assertText(t('A confirmation request to cancel your account has been sent to your e-mail address.'), 'Account cancellation request mailed message displayed.');
+
+    // Attempt bogus account cancellation request confirmation.
+    $bogus_timestamp = $timestamp + 60;
+    $this->drupalGet("user/$account->uid/cancel/confirm/$bogus_timestamp/" . user_pass_rehash($account->pass, $bogus_timestamp, $account->login));
+    $this->assertText(t('You have tried to use an account cancellation link that has expired. Please request a new one using the form below.'), 'Bogus cancelling request rejected.');
+    $account = user_load($account->uid);
+    $this->assertTrue($account->status == 1, 'User account was not canceled.');
+
+    // Attempt expired account cancellation request confirmation.
+    $bogus_timestamp = $timestamp - 86400 - 60;
+    $this->drupalGet("user/$account->uid/cancel/confirm/$bogus_timestamp/" . user_pass_rehash($account->pass, $bogus_timestamp, $account->login));
+    $this->assertText(t('You have tried to use an account cancellation link that has expired. Please request a new one using the form below.'), 'Expired cancel account request rejected.');
+    $accounts = user_load_multiple(array($account->uid), array('status' => 1));
+    $this->assertTrue(reset($accounts), 'User account was not canceled.');
+
+    // Confirm user's content has not been altered.
+    $test_node = node_load($node->nid, NULL, TRUE);
+    $this->assertTrue(($test_node->uid == $account->uid && $test_node->status == 1), 'Node of the user has not been altered.');
+  }
+
+  /**
+   * Disable account and keep all content.
+   */
+  function testUserBlock() {
+    variable_set('user_cancel_method', 'user_cancel_block');
+
+    // Create a user.
+    $web_user = $this->drupalCreateUser(array('cancel account'));
+    $this->drupalLogin($web_user);
+
+    // Load real user object.
+    $account = user_load($web_user->uid, TRUE);
+
+    // Attempt to cancel account.
+    $this->drupalGet('user/' . $account->uid . '/edit');
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+    $this->assertText(t('Are you sure you want to cancel your account?'), 'Confirmation form to cancel account displayed.');
+    $this->assertText(t('Your account will be blocked and you will no longer be able to log in. All of your content will remain attributed to your user name.'), 'Informs that all content will be remain as is.');
+    $this->assertNoText(t('Select the method to cancel the account above.'), 'Does not allow user to select account cancellation method.');
+
+    // Confirm account cancellation.
+    $timestamp = time();
+
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+    $this->assertText(t('A confirmation request to cancel your account has been sent to your e-mail address.'), 'Account cancellation request mailed message displayed.');
+
+    // Confirm account cancellation request.
+    $this->drupalGet("user/$account->uid/cancel/confirm/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login));
+    $account = user_load($account->uid, TRUE);
+    $this->assertTrue($account->status == 0, 'User has been blocked.');
+
+    // Confirm that the confirmation message made it through to the end user.
+    $this->assertRaw(t('%name has been disabled.', array('%name' => $account->name)), "Confirmation message displayed to user.");
+  }
+
+  /**
+   * Disable account and unpublish all content.
+   */
+  function testUserBlockUnpublish() {
+    variable_set('user_cancel_method', 'user_cancel_block_unpublish');
+
+    // Create a user.
+    $account = $this->drupalCreateUser(array('cancel account'));
+    $this->drupalLogin($account);
+    // Load real user object.
+    $account = user_load($account->uid, TRUE);
+
+    // Create a node with two revisions.
+    $node = $this->drupalCreateNode(array('uid' => $account->uid));
+    $settings = get_object_vars($node);
+    $settings['revision'] = 1;
+    $node = $this->drupalCreateNode($settings);
+
+    // Attempt to cancel account.
+    $this->drupalGet('user/' . $account->uid . '/edit');
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+    $this->assertText(t('Are you sure you want to cancel your account?'), 'Confirmation form to cancel account displayed.');
+    $this->assertText(t('Your account will be blocked and you will no longer be able to log in. All of your content will be hidden from everyone but administrators.'), 'Informs that all content will be unpublished.');
+
+    // Confirm account cancellation.
+    $timestamp = time();
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+    $this->assertText(t('A confirmation request to cancel your account has been sent to your e-mail address.'), 'Account cancellation request mailed message displayed.');
+
+    // Confirm account cancellation request.
+    $this->drupalGet("user/$account->uid/cancel/confirm/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login));
+    $account = user_load($account->uid, TRUE);
+    $this->assertTrue($account->status == 0, 'User has been blocked.');
+
+    // Confirm user's content has been unpublished.
+    $test_node = node_load($node->nid, NULL, TRUE);
+    $this->assertTrue($test_node->status == 0, 'Node of the user has been unpublished.');
+    $test_node = node_load($node->nid, $node->vid, TRUE);
+    $this->assertTrue($test_node->status == 0, 'Node revision of the user has been unpublished.');
+
+    // Confirm that the confirmation message made it through to the end user.
+    $this->assertRaw(t('%name has been disabled.', array('%name' => $account->name)), "Confirmation message displayed to user.");
+  }
+
+  /**
+   * Delete account and anonymize all content.
+   */
+  function testUserAnonymize() {
+    variable_set('user_cancel_method', 'user_cancel_reassign');
+
+    // Create a user.
+    $account = $this->drupalCreateUser(array('cancel account'));
+    $this->drupalLogin($account);
+    // Load real user object.
+    $account = user_load($account->uid, TRUE);
+
+    // Create a simple node.
+    $node = $this->drupalCreateNode(array('uid' => $account->uid));
+
+    // Create a node with two revisions, the initial one belonging to the
+    // cancelling user.
+    $revision_node = $this->drupalCreateNode(array('uid' => $account->uid));
+    $revision = $revision_node->vid;
+    $settings = get_object_vars($revision_node);
+    $settings['revision'] = 1;
+    $settings['uid'] = 1; // Set new/current revision to someone else.
+    $revision_node = $this->drupalCreateNode($settings);
+
+    // Attempt to cancel account.
+    $this->drupalGet('user/' . $account->uid . '/edit');
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+    $this->assertText(t('Are you sure you want to cancel your account?'), 'Confirmation form to cancel account displayed.');
+    $this->assertRaw(t('Your account will be removed and all account information deleted. All of your content will be assigned to the %anonymous-name user.', array('%anonymous-name' => variable_get('anonymous', t('Anonymous')))), 'Informs that all content will be attributed to anonymous account.');
+
+    // Confirm account cancellation.
+    $timestamp = time();
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+    $this->assertText(t('A confirmation request to cancel your account has been sent to your e-mail address.'), 'Account cancellation request mailed message displayed.');
+
+    // Confirm account cancellation request.
+    $this->drupalGet("user/$account->uid/cancel/confirm/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login));
+    $this->assertFalse(user_load($account->uid, TRUE), 'User is not found in the database.');
+
+    // Confirm that user's content has been attributed to anonymous user.
+    $test_node = node_load($node->nid, NULL, TRUE);
+    $this->assertTrue(($test_node->uid == 0 && $test_node->status == 1), 'Node of the user has been attributed to anonymous user.');
+    $test_node = node_load($revision_node->nid, $revision, TRUE);
+    $this->assertTrue(($test_node->revision_uid == 0 && $test_node->status == 1), 'Node revision of the user has been attributed to anonymous user.');
+    $test_node = node_load($revision_node->nid, NULL, TRUE);
+    $this->assertTrue(($test_node->uid != 0 && $test_node->status == 1), "Current revision of the user's node was not attributed to anonymous user.");
+
+    // Confirm that the confirmation message made it through to the end user.
+    $this->assertRaw(t('%name has been deleted.', array('%name' => $account->name)), "Confirmation message displayed to user.");
+  }
+
+  /**
+   * Delete account and remove all content.
+   */
+  function testUserDelete() {
+    variable_set('user_cancel_method', 'user_cancel_delete');
+
+    // Create a user.
+    $account = $this->drupalCreateUser(array('cancel account', 'post comments', 'skip comment approval'));
+    $this->drupalLogin($account);
+    // Load real user object.
+    $account = user_load($account->uid, TRUE);
+
+    // Create a simple node.
+    $node = $this->drupalCreateNode(array('uid' => $account->uid));
+
+    // Create comment.
+    $langcode = LANGUAGE_NONE;
+    $edit = array();
+    $edit['subject'] = $this->randomName(8);
+    $edit['comment_body[' . $langcode . '][0][value]'] = $this->randomName(16);
+
+    $this->drupalPost('comment/reply/' . $node->nid, $edit, t('Preview'));
+    $this->drupalPost(NULL, array(), t('Save'));
+    $this->assertText(t('Your comment has been posted.'));
+    $comments = comment_load_multiple(array(), array('subject' => $edit['subject']));
+    $comment = reset($comments);
+    $this->assertTrue($comment->cid, 'Comment found.');
+
+    // Create a node with two revisions, the initial one belonging to the
+    // cancelling user.
+    $revision_node = $this->drupalCreateNode(array('uid' => $account->uid));
+    $revision = $revision_node->vid;
+    $settings = get_object_vars($revision_node);
+    $settings['revision'] = 1;
+    $settings['uid'] = 1; // Set new/current revision to someone else.
+    $revision_node = $this->drupalCreateNode($settings);
+
+    // Attempt to cancel account.
+    $this->drupalGet('user/' . $account->uid . '/edit');
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+    $this->assertText(t('Are you sure you want to cancel your account?'), 'Confirmation form to cancel account displayed.');
+    $this->assertText(t('Your account will be removed and all account information deleted. All of your content will also be deleted.'), 'Informs that all content will be deleted.');
+
+    // Confirm account cancellation.
+    $timestamp = time();
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+    $this->assertText(t('A confirmation request to cancel your account has been sent to your e-mail address.'), 'Account cancellation request mailed message displayed.');
+
+    // Confirm account cancellation request.
+    $this->drupalGet("user/$account->uid/cancel/confirm/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login));
+    $this->assertFalse(user_load($account->uid, TRUE), 'User is not found in the database.');
+
+    // Confirm that user's content has been deleted.
+    $this->assertFalse(node_load($node->nid, NULL, TRUE), 'Node of the user has been deleted.');
+    $this->assertFalse(node_load($node->nid, $revision, TRUE), 'Node revision of the user has been deleted.');
+    $this->assertTrue(node_load($revision_node->nid, NULL, TRUE), "Current revision of the user's node was not deleted.");
+    $this->assertFalse(comment_load($comment->cid), 'Comment of the user has been deleted.');
+
+    // Confirm that the confirmation message made it through to the end user.
+    $this->assertRaw(t('%name has been deleted.', array('%name' => $account->name)), "Confirmation message displayed to user.");
+  }
+
+  /**
+   * Create an administrative user and delete another user.
+   */
+  function testUserCancelByAdmin() {
+    variable_set('user_cancel_method', 'user_cancel_reassign');
+
+    // Create a regular user.
+    $account = $this->drupalCreateUser(array());
+
+    // Create administrative user.
+    $admin_user = $this->drupalCreateUser(array('administer users'));
+    $this->drupalLogin($admin_user);
+
+    // Delete regular user.
+    $this->drupalGet('user/' . $account->uid . '/edit');
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+    $this->assertRaw(t('Are you sure you want to cancel the account %name?', array('%name' => $account->name)), 'Confirmation form to cancel account displayed.');
+    $this->assertText(t('Select the method to cancel the account above.'), 'Allows to select account cancellation method.');
+
+    // Confirm deletion.
+    $this->drupalPost(NULL, NULL, t('Cancel account'));
+    $this->assertRaw(t('%name has been deleted.', array('%name' => $account->name)), 'User deleted.');
+    $this->assertFalse(user_load($account->uid), 'User is not found in the database.');
+  }
+
+  /**
+   * Create an administrative user and mass-delete other users.
+   */
+  function testMassUserCancelByAdmin() {
+    variable_set('user_cancel_method', 'user_cancel_reassign');
+    // Enable account cancellation notification.
+    variable_set('user_mail_status_canceled_notify', TRUE);
+
+    // Create administrative user.
+    $admin_user = $this->drupalCreateUser(array('administer users'));
+    $this->drupalLogin($admin_user);
+
+    // Create some users.
+    $users = array();
+    for ($i = 0; $i < 3; $i++) {
+      $account = $this->drupalCreateUser(array());
+      $users[$account->uid] = $account;
+    }
+
+    // Cancel user accounts, including own one.
+    $edit = array();
+    $edit['operation'] = 'cancel';
+    foreach ($users as $uid => $account) {
+      $edit['accounts[' . $uid . ']'] = TRUE;
+    }
+    $edit['accounts[' . $admin_user->uid . ']'] = TRUE;
+    // Also try to cancel uid 1.
+    $edit['accounts[1]'] = TRUE;
+    $this->drupalPost('admin/people', $edit, t('Update'));
+    $this->assertText(t('Are you sure you want to cancel these user accounts?'), 'Confirmation form to cancel accounts displayed.');
+    $this->assertText(t('When cancelling these accounts'), 'Allows to select account cancellation method.');
+    $this->assertText(t('Require e-mail confirmation to cancel account.'), 'Allows to send confirmation mail.');
+    $this->assertText(t('Notify user when account is canceled.'), 'Allows to send notification mail.');
+
+    // Confirm deletion.
+    $this->drupalPost(NULL, NULL, t('Cancel accounts'));
+    $status = TRUE;
+    foreach ($users as $account) {
+      $status = $status && (strpos($this->content, t('%name has been deleted.', array('%name' => $account->name))) !== FALSE);
+      $status = $status && !user_load($account->uid, TRUE);
+    }
+    $this->assertTrue($status, 'Users deleted and not found in the database.');
+
+    // Ensure that admin account was not cancelled.
+    $this->assertText(t('A confirmation request to cancel your account has been sent to your e-mail address.'), 'Account cancellation request mailed message displayed.');
+    $admin_user = user_load($admin_user->uid);
+    $this->assertTrue($admin_user->status == 1, 'Administrative user is found in the database and enabled.');
+
+    // Verify that uid 1's account was not cancelled.
+    $user1 = user_load(1, TRUE);
+    $this->assertEqual($user1->status, 1, 'User #1 still exists and is not blocked.');
+  }
+}
+
+class UserPictureTestCase extends DrupalWebTestCase {
+  protected $user;
+  protected $_directory_test;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Upload user picture',
+      'description' => 'Assure that dimension check, extension check and image scaling work as designed.',
+      'group' => 'User'
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    // Enable user pictures.
+    variable_set('user_pictures', 1);
+
+    $this->user = $this->drupalCreateUser();
+
+    // Test if directories specified in settings exist in filesystem.
+    $file_dir = 'public://';
+    $file_check = file_prepare_directory($file_dir, FILE_CREATE_DIRECTORY);
+    // TODO: Test public and private methods?
+
+    $picture_dir = variable_get('user_picture_path', 'pictures');
+    $picture_path = $file_dir . $picture_dir;
+
+    $pic_check = file_prepare_directory($picture_path, FILE_CREATE_DIRECTORY);
+    $this->_directory_test = is_writable($picture_path);
+    $this->assertTrue($this->_directory_test, "The directory $picture_path doesn't exist or is not writable. Further tests won't be made.");
+  }
+
+  function testNoPicture() {
+    $this->drupalLogin($this->user);
+
+    // Try to upload a file that is not an image for the user picture.
+    $not_an_image = current($this->drupalGetTestFiles('html'));
+    $this->saveUserPicture($not_an_image);
+    $this->assertRaw(t('Only JPEG, PNG and GIF images are allowed.'), 'Non-image files are not accepted.');
+  }
+
+  /**
+   * Do the test:
+   *  GD Toolkit is installed
+   *  Picture has invalid dimension
+   *
+   * results: The image should be uploaded because ImageGDToolkit resizes the picture
+   */
+  function testWithGDinvalidDimension() {
+    if ($this->_directory_test && image_get_toolkit()) {
+      $this->drupalLogin($this->user);
+
+      $image = current($this->drupalGetTestFiles('image'));
+      $info = image_get_info($image->uri);
+
+      // Set new variables: invalid dimensions, valid filesize (0 = no limit).
+      $test_dim = ($info['width'] - 10) . 'x' . ($info['height'] - 10);
+      variable_set('user_picture_dimensions', $test_dim);
+      variable_set('user_picture_file_size', 0);
+
+      $pic_path = $this->saveUserPicture($image);
+      // Check that the image was resized and is being displayed on the
+      // user's profile page.
+      $text = t('The image was resized to fit within the maximum allowed dimensions of %dimensions pixels.', array('%dimensions' => $test_dim));
+      $this->assertRaw($text, 'Image was resized.');
+      $alt = t("@user's picture", array('@user' => format_username($this->user)));
+      $style = variable_get('user_picture_style', '');
+      $this->assertRaw(check_plain(image_style_url($style, $pic_path)), "Image is displayed in user's edit page");
+
+      // Check if file is located in proper directory.
+      $this->assertTrue(is_file($pic_path), "File is located in proper directory");
+    }
+  }
+
+  /**
+   * Do the test:
+   *  GD Toolkit is installed
+   *  Picture has invalid size
+   *
+   * results: The image should be uploaded because ImageGDToolkit resizes the picture
+   */
+  function testWithGDinvalidSize() {
+    if ($this->_directory_test && image_get_toolkit()) {
+      $this->drupalLogin($this->user);
+
+      // Images are sorted first by size then by name. We need an image
+      // bigger than 1 KB so we'll grab the last one.
+      $files = $this->drupalGetTestFiles('image');
+      $image = end($files);
+      $info = image_get_info($image->uri);
+
+      // Set new variables: valid dimensions, invalid filesize.
+      $test_dim = ($info['width'] + 10) . 'x' . ($info['height'] + 10);
+      $test_size = 1;
+      variable_set('user_picture_dimensions', $test_dim);
+      variable_set('user_picture_file_size', $test_size);
+
+      $pic_path = $this->saveUserPicture($image);
+
+      // Test that the upload failed and that the correct reason was cited.
+      $text = t('The specified file %filename could not be uploaded.', array('%filename' => $image->filename));
+      $this->assertRaw($text, 'Upload failed.');
+      $text = t('The file is %filesize exceeding the maximum file size of %maxsize.', array('%filesize' => format_size(filesize($image->uri)), '%maxsize' => format_size($test_size * 1024)));
+      $this->assertRaw($text, 'File size cited as reason for failure.');
+
+      // Check if file is not uploaded.
+      $this->assertFalse(is_file($pic_path), 'File was not uploaded.');
+    }
+  }
+
+  /**
+   * Do the test:
+   *  GD Toolkit is not installed
+   *  Picture has invalid size
+   *
+   * results: The image shouldn't be uploaded
+   */
+  function testWithoutGDinvalidDimension() {
+    if ($this->_directory_test && !image_get_toolkit()) {
+      $this->drupalLogin($this->user);
+
+      $image = current($this->drupalGetTestFiles('image'));
+      $info = image_get_info($image->uri);
+
+      // Set new variables: invalid dimensions, valid filesize (0 = no limit).
+      $test_dim = ($info['width'] - 10) . 'x' . ($info['height'] - 10);
+      variable_set('user_picture_dimensions', $test_dim);
+      variable_set('user_picture_file_size', 0);
+
+      $pic_path = $this->saveUserPicture($image);
+
+      // Test that the upload failed and that the correct reason was cited.
+      $text = t('The specified file %filename could not be uploaded.', array('%filename' => $image->filename));
+      $this->assertRaw($text, 'Upload failed.');
+      $text = t('The image is too large; the maximum dimensions are %dimensions pixels.', array('%dimensions' => $test_dim));
+      $this->assertRaw($text, 'Checking response on invalid image (dimensions).');
+
+      // Check if file is not uploaded.
+      $this->assertFalse(is_file($pic_path), 'File was not uploaded.');
+    }
+  }
+
+  /**
+   * Do the test:
+   *  GD Toolkit is not installed
+   *  Picture has invalid size
+   *
+   * results: The image shouldn't be uploaded
+   */
+  function testWithoutGDinvalidSize() {
+    if ($this->_directory_test && !image_get_toolkit()) {
+      $this->drupalLogin($this->user);
+
+      $image = current($this->drupalGetTestFiles('image'));
+      $info = image_get_info($image->uri);
+
+      // Set new variables: valid dimensions, invalid filesize.
+      $test_dim = ($info['width'] + 10) . 'x' . ($info['height'] + 10);
+      $test_size = 1;
+      variable_set('user_picture_dimensions', $test_dim);
+      variable_set('user_picture_file_size', $test_size);
+
+      $pic_path = $this->saveUserPicture($image);
+
+      // Test that the upload failed and that the correct reason was cited.
+      $text = t('The specified file %filename could not be uploaded.', array('%filename' => $image->filename));
+      $this->assertRaw($text, 'Upload failed.');
+      $text = t('The file is %filesize exceeding the maximum file size of %maxsize.', array('%filesize' => format_size(filesize($image->uri)), '%maxsize' => format_size($test_size * 1024)));
+      $this->assertRaw($text, 'File size cited as reason for failure.');
+
+      // Check if file is not uploaded.
+      $this->assertFalse(is_file($pic_path), 'File was not uploaded.');
+    }
+  }
+
+  /**
+   * Do the test:
+   *  Picture is valid (proper size and dimension)
+   *
+   * results: The image should be uploaded
+   */
+  function testPictureIsValid() {
+    if ($this->_directory_test) {
+      $this->drupalLogin($this->user);
+
+      $image = current($this->drupalGetTestFiles('image'));
+      $info = image_get_info($image->uri);
+
+      // Set new variables: valid dimensions, valid filesize (0 = no limit).
+      $test_dim = ($info['width'] + 10) . 'x' . ($info['height'] + 10);
+      variable_set('user_picture_dimensions', $test_dim);
+      variable_set('user_picture_file_size', 0);
+
+      $pic_path = $this->saveUserPicture($image);
+
+      // Check if image is displayed in user's profile page.
+      $this->drupalGet('user');
+      $this->assertRaw(file_uri_target($pic_path), "Image is displayed in user's profile page");
+
+      // Check if file is located in proper directory.
+      $this->assertTrue(is_file($pic_path), 'File is located in proper directory');
+
+      // Set new picture dimensions.
+      $test_dim = ($info['width'] + 5) . 'x' . ($info['height'] + 5);
+      variable_set('user_picture_dimensions', $test_dim);
+
+      $pic_path2 = $this->saveUserPicture($image);
+      $this->assertNotEqual($pic_path, $pic_path2, 'Filename of second picture is different.');
+    }
+  }
+
+  /**
+   * Test HTTP schema working with user pictures.
+   */
+  function testExternalPicture() {
+    $this->drupalLogin($this->user);
+    // Set the default picture to an URI with a HTTP schema.
+    $images = $this->drupalGetTestFiles('image');
+    $image = $images[0];
+    $pic_path = file_create_url($image->uri);
+    variable_set('user_picture_default', $pic_path);
+
+    // Check if image is displayed in user's profile page.
+    $this->drupalGet('user');
+
+    // Get the user picture image via xpath.
+    $elements = $this->xpath('//div[@class="user-picture"]/img');
+    $this->assertEqual(count($elements), 1, "There is exactly one user picture on the user's profile page");
+    $this->assertEqual($pic_path, (string) $elements[0]['src'], "User picture source is correct.");
+  }
+
+  /**
+   * Tests deletion of user pictures.
+   */
+  function testDeletePicture() {
+    $this->drupalLogin($this->user);
+
+    $image = current($this->drupalGetTestFiles('image'));
+    $info = image_get_info($image->uri);
+
+    // Set new variables: valid dimensions, valid filesize (0 = no limit).
+    $test_dim = ($info['width'] + 10) . 'x' . ($info['height'] + 10);
+    variable_set('user_picture_dimensions', $test_dim);
+    variable_set('user_picture_file_size', 0);
+
+    // Save a new picture.
+    $edit = array('files[picture_upload]' => drupal_realpath($image->uri));
+    $this->drupalPost('user/' . $this->user->uid . '/edit', $edit, t('Save'));
+
+    // Load actual user data from database.
+    $account = user_load($this->user->uid, TRUE);
+    $pic_path = isset($account->picture) ? $account->picture->uri : NULL;
+
+    // Check if image is displayed in user's profile page.
+    $this->drupalGet('user');
+    $this->assertRaw(file_uri_target($pic_path), "Image is displayed in user's profile page");
+
+    // Check if file is located in proper directory.
+    $this->assertTrue(is_file($pic_path), 'File is located in proper directory');
+
+    $edit = array('picture_delete' => 1);
+    $this->drupalPost('user/' . $this->user->uid . '/edit', $edit, t('Save'));
+
+    // Load actual user data from database.
+    $account1 = user_load($this->user->uid, TRUE);
+    $this->assertNull($account1->picture, 'User object has no picture');
+
+    $file = file_load($account->picture->fid);
+    $this->assertFalse($file, 'File is removed from database');
+
+    // Clear out PHP's file stat cache so we see the current value.
+    clearstatcache();
+    $this->assertFalse(is_file($pic_path), 'File is removed from file system');
+  }
+
+  function saveUserPicture($image) {
+    $edit = array('files[picture_upload]' => drupal_realpath($image->uri));
+    $this->drupalPost('user/' . $this->user->uid . '/edit', $edit, t('Save'));
+
+    // Load actual user data from database.
+    $account = user_load($this->user->uid, TRUE);
+    return isset($account->picture) ? $account->picture->uri : NULL;
+  }
+
+  /**
+   * Tests the admin form validates user picture settings.
+   */
+  function testUserPictureAdminFormValidation() {
+    $this->drupalLogin($this->drupalCreateUser(array('administer users')));
+
+    // The default values are valid.
+    $this->drupalPost('admin/config/people/accounts', array(), t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'The default values are valid.');
+
+    // The form does not save with an invalid file size.
+    $edit = array(
+      'user_picture_file_size' => $this->randomName(),
+    );
+    $this->drupalPost('admin/config/people/accounts', $edit, t('Save configuration'));
+    $this->assertNoText(t('The configuration options have been saved.'), 'The form does not save with an invalid file size.');
+  }
+}
+
+
+class UserPermissionsTestCase extends DrupalWebTestCase {
+  protected $admin_user;
+  protected $rid;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Role permissions',
+      'description' => 'Verify that role permissions can be added and removed via the permissions page.',
+      'group' => 'User'
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    $this->admin_user = $this->drupalCreateUser(array('administer permissions', 'access user profiles', 'administer site configuration', 'administer modules', 'administer users'));
+
+    // Find the new role ID - it must be the maximum.
+    $all_rids = array_keys($this->admin_user->roles);
+    sort($all_rids);
+    $this->rid = array_pop($all_rids);
+  }
+
+  /**
+   * Change user permissions and check user_access().
+   */
+  function testUserPermissionChanges() {
+    $this->drupalLogin($this->admin_user);
+    $rid = $this->rid;
+    $account = $this->admin_user;
+
+    // Add a permission.
+    $this->assertFalse(user_access('administer nodes', $account), 'User does not have "administer nodes" permission.');
+    $edit = array();
+    $edit[$rid . '[administer nodes]'] = TRUE;
+    $this->drupalPost('admin/people/permissions', $edit, t('Save permissions'));
+    $this->assertText(t('The changes have been saved.'), 'Successful save message displayed.');
+    drupal_static_reset('user_access');
+    drupal_static_reset('user_role_permissions');
+    $this->assertTrue(user_access('administer nodes', $account), 'User now has "administer nodes" permission.');
+
+    // Remove a permission.
+    $this->assertTrue(user_access('access user profiles', $account), 'User has "access user profiles" permission.');
+    $edit = array();
+    $edit[$rid . '[access user profiles]'] = FALSE;
+    $this->drupalPost('admin/people/permissions', $edit, t('Save permissions'));
+    $this->assertText(t('The changes have been saved.'), 'Successful save message displayed.');
+    drupal_static_reset('user_access');
+    drupal_static_reset('user_role_permissions');
+    $this->assertFalse(user_access('access user profiles', $account), 'User no longer has "access user profiles" permission.');
+  }
+
+  /**
+   * Test assigning of permissions for the administrator role.
+   */
+  function testAdministratorRole() {
+    $this->drupalLogin($this->admin_user);
+    $this->drupalGet('admin/config/people/accounts');
+
+    // Set the user's role to be the administrator role.
+    $edit = array();
+    $edit['user_admin_role'] = $this->rid;
+    $this->drupalPost('admin/config/people/accounts', $edit, t('Save configuration'));
+
+    // Enable aggregator module and ensure the 'administer news feeds'
+    // permission is assigned by default.
+    $edit = array();
+    $edit['modules[Core][aggregator][enable]'] = TRUE;
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+    $this->assertTrue(user_access('administer news feeds', $this->admin_user), 'The permission was automatically assigned to the administrator role');
+  }
+
+  /**
+   * Verify proper permission changes by user_role_change_permissions().
+   */
+  function testUserRoleChangePermissions() {
+    $rid = $this->rid;
+    $account = $this->admin_user;
+
+    // Verify current permissions.
+    $this->assertFalse(user_access('administer nodes', $account), 'User does not have "administer nodes" permission.');
+    $this->assertTrue(user_access('access user profiles', $account), 'User has "access user profiles" permission.');
+    $this->assertTrue(user_access('administer site configuration', $account), 'User has "administer site configuration" permission.');
+
+    // Change permissions.
+    $permissions = array(
+      'administer nodes' => 1,
+      'access user profiles' => 0,
+    );
+    user_role_change_permissions($rid, $permissions);
+
+    // Verify proper permission changes.
+    $this->assertTrue(user_access('administer nodes', $account), 'User now has "administer nodes" permission.');
+    $this->assertFalse(user_access('access user profiles', $account), 'User no longer has "access user profiles" permission.');
+    $this->assertTrue(user_access('administer site configuration', $account), 'User still has "administer site configuration" permission.');
+  }
+}
+
+class UserAdminTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'User administration',
+      'description' => 'Test user administration page functionality.',
+      'group' => 'User'
+    );
+  }
+
+  /**
+   * Registers a user and deletes it.
+   */
+  function testUserAdmin() {
+
+    $user_a = $this->drupalCreateUser(array());
+    $user_b = $this->drupalCreateUser(array('administer taxonomy'));
+    $user_c = $this->drupalCreateUser(array('administer taxonomy'));
+
+    // Create admin user to delete registered user.
+    $admin_user = $this->drupalCreateUser(array('administer users'));
+    $this->drupalLogin($admin_user);
+    $this->drupalGet('admin/people');
+    $this->assertText($user_a->name, 'Found user A on admin users page');
+    $this->assertText($user_b->name, 'Found user B on admin users page');
+    $this->assertText($user_c->name, 'Found user C on admin users page');
+    $this->assertText($admin_user->name, 'Found Admin user on admin users page');
+
+    // Test for existence of edit link in table.
+    $link = l(t('edit'), "user/$user_a->uid/edit", array('query' => array('destination' => 'admin/people')));
+    $this->assertRaw($link, 'Found user A edit link on admin users page');
+
+    // Filter the users by permission 'administer taxonomy'.
+    $edit = array();
+    $edit['permission'] = 'administer taxonomy';
+    $this->drupalPost('admin/people', $edit, t('Filter'));
+
+    // Check if the correct users show up.
+    $this->assertNoText($user_a->name, 'User A not on filtered by perm admin users page');
+    $this->assertText($user_b->name, 'Found user B on filtered by perm admin users page');
+    $this->assertText($user_c->name, 'Found user C on filtered by perm admin users page');
+
+    // Filter the users by role. Grab the system-generated role name for User C.
+    $edit['role'] = max(array_flip($user_c->roles));
+    $this->drupalPost('admin/people', $edit, t('Refine'));
+
+    // Check if the correct users show up when filtered by role.
+    $this->assertNoText($user_a->name, 'User A not on filtered by role on admin users page');
+    $this->assertNoText($user_b->name, 'User B not on filtered by role on admin users page');
+    $this->assertText($user_c->name, 'User C on filtered by role on admin users page');
+
+    // Test blocking of a user.
+    $account = user_load($user_c->uid);
+    $this->assertEqual($account->status, 1, 'User C not blocked');
+    $edit = array();
+    $edit['operation'] = 'block';
+    $edit['accounts[' . $account->uid . ']'] = TRUE;
+    $this->drupalPost('admin/people', $edit, t('Update'));
+    $account = user_load($user_c->uid, TRUE);
+    $this->assertEqual($account->status, 0, 'User C blocked');
+
+    // Test unblocking of a user from /admin/people page and sending of activation mail
+    $editunblock = array();
+    $editunblock['operation'] = 'unblock';
+    $editunblock['accounts[' . $account->uid . ']'] = TRUE;
+    $this->drupalPost('admin/people', $editunblock, t('Update'));
+    $account = user_load($user_c->uid, TRUE);
+    $this->assertEqual($account->status, 1, 'User C unblocked');
+    $this->assertMail("to", $account->mail, "Activation mail sent to user C");
+
+    // Test blocking and unblocking another user from /user/[uid]/edit form and sending of activation mail
+    $user_d = $this->drupalCreateUser(array());
+    $account1 = user_load($user_d->uid, TRUE);
+    $this->drupalPost('user/' . $account1->uid . '/edit', array('status' => 0), t('Save'));
+    $account1 = user_load($user_d->uid, TRUE);
+    $this->assertEqual($account1->status, 0, 'User D blocked');
+    $this->drupalPost('user/' . $account1->uid . '/edit', array('status' => TRUE), t('Save'));
+    $account1 = user_load($user_d->uid, TRUE);
+    $this->assertEqual($account1->status, 1, 'User D unblocked');
+    $this->assertMail("to", $account1->mail, "Activation mail sent to user D");
+  }
+}
+
+/**
+ * Tests for user-configurable time zones.
+ */
+class UserTimeZoneFunctionalTest extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'User time zones',
+      'description' => 'Set a user time zone and verify that dates are displayed in local time.',
+      'group' => 'User',
+    );
+  }
+
+  /**
+   * Tests the display of dates and time when user-configurable time zones are set.
+   */
+  function testUserTimeZone() {
+    // Setup date/time settings for Los Angeles time.
+    variable_set('date_default_timezone', 'America/Los_Angeles');
+    variable_set('configurable_timezones', 1);
+    variable_set('date_format_medium', 'Y-m-d H:i T');
+
+    // Create a user account and login.
+    $web_user = $this->drupalCreateUser();
+    $this->drupalLogin($web_user);
+
+    // Create some nodes with different authored-on dates.
+    // Two dates in PST (winter time):
+    $date1 = '2007-03-09 21:00:00 -0800';
+    $date2 = '2007-03-11 01:00:00 -0800';
+    // One date in PDT (summer time):
+    $date3 = '2007-03-20 21:00:00 -0700';
+    $node1 = $this->drupalCreateNode(array('created' => strtotime($date1), 'type' => 'article'));
+    $node2 = $this->drupalCreateNode(array('created' => strtotime($date2), 'type' => 'article'));
+    $node3 = $this->drupalCreateNode(array('created' => strtotime($date3), 'type' => 'article'));
+
+    // Confirm date format and time zone.
+    $this->drupalGet("node/$node1->nid");
+    $this->assertText('2007-03-09 21:00 PST', 'Date should be PST.');
+    $this->drupalGet("node/$node2->nid");
+    $this->assertText('2007-03-11 01:00 PST', 'Date should be PST.');
+    $this->drupalGet("node/$node3->nid");
+    $this->assertText('2007-03-20 21:00 PDT', 'Date should be PDT.');
+
+    // Change user time zone to Santiago time.
+    $edit = array();
+    $edit['mail'] = $web_user->mail;
+    $edit['timezone'] = 'America/Santiago';
+    $this->drupalPost("user/$web_user->uid/edit", $edit, t('Save'));
+    $this->assertText(t('The changes have been saved.'), 'Time zone changed to Santiago time.');
+
+    // Confirm date format and time zone.
+    $this->drupalGet("node/$node1->nid");
+    $this->assertText('2007-03-10 02:00 CLST', 'Date should be Chile summer time; five hours ahead of PST.');
+    $this->drupalGet("node/$node2->nid");
+    $this->assertText('2007-03-11 05:00 CLT', 'Date should be Chile time; four hours ahead of PST');
+    $this->drupalGet("node/$node3->nid");
+    $this->assertText('2007-03-21 00:00 CLT', 'Date should be Chile time; three hours ahead of PDT.');
+  }
+}
+
+/**
+ * Test user autocompletion.
+ */
+class UserAutocompleteTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'User autocompletion',
+      'description' => 'Test user autocompletion functionality.',
+      'group' => 'User'
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+
+    // Set up two users with different permissions to test access.
+    $this->unprivileged_user = $this->drupalCreateUser();
+    $this->privileged_user = $this->drupalCreateUser(array('access user profiles'));
+  }
+
+  /**
+   * Tests access to user autocompletion and verify the correct results.
+   */
+  function testUserAutocomplete() {
+    // Check access from unprivileged user, should be denied.
+    $this->drupalLogin($this->unprivileged_user);
+    $this->drupalGet('user/autocomplete/' . $this->unprivileged_user->name[0]);
+    $this->assertResponse(403, 'Autocompletion access denied to user without permission.');
+
+    // Check access from privileged user.
+    $this->drupalLogout();
+    $this->drupalLogin($this->privileged_user);
+    $this->drupalGet('user/autocomplete/' . $this->unprivileged_user->name[0]);
+    $this->assertResponse(200, 'Autocompletion access allowed.');
+
+    // Using first letter of the user's name, make sure the user's full name is in the results.
+    $this->assertRaw($this->unprivileged_user->name, 'User name found in autocompletion results.');
+  }
+}
+
+
+/**
+ * Tests user links in the secondary menu.
+ */
+class UserAccountLinksUnitTests extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'User account links',
+      'description' => 'Test user-account links.',
+      'group' => 'User'
+    );
+  }
+
+  function setUp() {
+    parent::setUp('menu');
+  }
+
+  /**
+   * Tests the secondary menu.
+   */
+  function testSecondaryMenu() {
+    // Create a regular user.
+    $user = $this->drupalCreateUser(array());
+
+    // Log in and get the homepage.
+    $this->drupalLogin($user);
+    $this->drupalGet('<front>');
+
+    // For a logged-in user, expect the secondary menu to have links for "My
+    // account" and "Log out".
+    $link = $this->xpath('//ul[@id=:menu_id]/li/a[contains(@href, :href) and text()=:text]', array(
+      ':menu_id' => 'secondary-menu-links',
+      ':href' => 'user',
+      ':text' => 'My account',
+    ));
+    $this->assertEqual(count($link), 1, 'My account link is in secondary menu.');
+
+    $link = $this->xpath('//ul[@id=:menu_id]/li/a[contains(@href, :href) and text()=:text]', array(
+      ':menu_id' => 'secondary-menu-links',
+      ':href' => 'user/logout',
+      ':text' => 'Log out',
+    ));
+    $this->assertEqual(count($link), 1, 'Log out link is in secondary menu.');
+
+    // Log out and get the homepage.
+    $this->drupalLogout();
+    $this->drupalGet('<front>');
+
+    // For a logged-out user, expect no secondary links.
+    $element = $this->xpath('//ul[@id=:menu_id]', array(':menu_id' => 'secondary-menu-links'));
+    $this->assertEqual(count($element), 0, 'No secondary-menu for logged-out users.');
+  }
+
+  /**
+   * Tests disabling the 'My account' link.
+   */
+  function testDisabledAccountLink() {
+    // Create an admin user and log in.
+    $this->drupalLogin($this->drupalCreateUser(array('access administration pages', 'administer menu')));
+
+    // Verify that the 'My account' link is enabled.
+    $this->drupalGet('admin/structure/menu/manage/user-menu');
+    $label = $this->xpath('//label[contains(.,:text)]/@for', array(':text' => 'Enable My account menu link'));
+    $this->assertFieldChecked((string) $label[0], "The 'My account' link is enabled by default.");
+
+    // Disable the 'My account' link.
+    $input = $this->xpath('//input[@id=:field_id]/@name', array(':field_id' => (string)$label[0]));
+    $edit = array(
+      (string) $input[0] => FALSE,
+    );
+    $this->drupalPost('admin/structure/menu/manage/user-menu', $edit, t('Save configuration'));
+
+    // Get the homepage.
+    $this->drupalGet('<front>');
+
+    // Verify that the 'My account' link does not appear when disabled.
+    $link = $this->xpath('//ul[@id=:menu_id]/li/a[contains(@href, :href) and text()=:text]', array(
+      ':menu_id' => 'secondary-menu-links',
+      ':href' => 'user',
+      ':text' => 'My account',
+    ));
+    $this->assertEqual(count($link), 0, 'My account link is not in the secondary menu.');
+  }
+
+}
+
+/**
+ * Test user blocks.
+ */
+class UserBlocksUnitTests extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'User blocks',
+      'description' => 'Test user blocks.',
+      'group' => 'User'
+    );
+  }
+
+  /**
+   * Test the user login block.
+   */
+  function testUserLoginBlock() {
+    // Create a user with some permission that anonymous users lack.
+    $user = $this->drupalCreateUser(array('administer permissions'));
+
+    // Log in using the block.
+    $edit = array();
+    $edit['name'] = $user->name;
+    $edit['pass'] = $user->pass_raw;
+    $this->drupalPost('admin/people/permissions', $edit, t('Log in'));
+    $this->assertNoText(t('User login'), 'Logged in.');
+
+    // Check that we are still on the same page.
+    $this->assertEqual(url('admin/people/permissions', array('absolute' => TRUE)), $this->getUrl(), 'Still on the same page after login for access denied page');
+
+    // Now, log out and repeat with a non-403 page.
+    $this->drupalLogout();
+    $this->drupalPost('filter/tips', $edit, t('Log in'));
+    $this->assertNoText(t('User login'), 'Logged in.');
+    $this->assertPattern('!<title.*?' . t('Compose tips') . '.*?</title>!', 'Still on the same page after login for allowed page');
+
+    // Check that the user login block is not vulnerable to information
+    // disclosure to third party sites.
+    $this->drupalLogout();
+    $this->drupalPost('http://example.com/', $edit, t('Log in'), array('external' => FALSE));
+    // Check that we remain on the site after login.
+    $this->assertEqual(url('user/' . $user->uid, array('absolute' => TRUE)), $this->getUrl(), 'Redirected to user profile page after login from the frontpage');
+  }
+
+  /**
+   * Test the Who's Online block.
+   */
+  function testWhosOnlineBlock() {
+    // Generate users and make sure there are no current user sessions.
+    $user1 = $this->drupalCreateUser(array());
+    $user2 = $this->drupalCreateUser(array());
+    $user3 = $this->drupalCreateUser(array());
+    $this->assertEqual(db_query("SELECT COUNT(*) FROM {sessions}")->fetchField(), 0, 'Sessions table is empty.');
+
+    // Insert a user with two sessions.
+    $this->insertSession(array('uid' => $user1->uid));
+    $this->insertSession(array('uid' => $user1->uid));
+    $this->assertEqual(db_query("SELECT COUNT(*) FROM {sessions} WHERE uid = :uid", array(':uid' => $user1->uid))->fetchField(), 2, 'Duplicate user session has been inserted.');
+
+    // Insert a user with only one session.
+    $this->insertSession(array('uid' => $user2->uid, 'timestamp' => REQUEST_TIME + 1));
+
+    // Insert an inactive logged-in user who should not be seen in the block.
+    $this->insertSession(array('uid' => $user3->uid, 'timestamp' => (REQUEST_TIME - variable_get('user_block_seconds_online', 900) - 1)));
+
+    // Insert two anonymous user sessions.
+    $this->insertSession();
+    $this->insertSession();
+
+    // Test block output.
+    $block = user_block_view('online');
+    $this->drupalSetContent($block['content']);
+    $this->assertRaw(t('2 users'), 'Correct number of online users (2 users).');
+    $this->assertText($user1->name, 'Active user 1 found in online list.');
+    $this->assertText($user2->name, 'Active user 2 found in online list.');
+    $this->assertNoText($user3->name, "Inactive user not found in online list.");
+    $this->assertTrue(strpos($this->drupalGetContent(), $user1->name) > strpos($this->drupalGetContent(), $user2->name), 'Online users are ordered correctly.');
+  }
+
+  /**
+   * Insert a user session into the {sessions} table. This function is used
+   * since we cannot log in more than one user at the same time in tests.
+   */
+  private function insertSession(array $fields = array()) {
+    $fields += array(
+      'uid' => 0,
+      'sid' => drupal_hash_base64(uniqid(mt_rand(), TRUE)),
+      'timestamp' => REQUEST_TIME,
+    );
+    db_insert('sessions')
+      ->fields($fields)
+      ->execute();
+    $this->assertEqual(db_query("SELECT COUNT(*) FROM {sessions} WHERE uid = :uid AND sid = :sid AND timestamp = :timestamp", array(':uid' => $fields['uid'], ':sid' => $fields['sid'], ':timestamp' => $fields['timestamp']))->fetchField(), 1, 'Session record inserted.');
+  }
+}
+
+/**
+ * Tests saving a user account.
+ */
+class UserSaveTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'User save test',
+      'description' => 'Test user_save() for arbitrary new uid.',
+      'group' => 'User',
+    );
+  }
+
+  /**
+   * Test creating a user with arbitrary uid.
+   */
+  function testUserImport() {
+    // User ID must be a number that is not in the database.
+    $max_uid = db_query('SELECT MAX(uid) FROM {users}')->fetchField();
+    $test_uid = $max_uid + mt_rand(1000, 1000000);
+    $test_name = $this->randomName();
+
+    // Create the base user, based on drupalCreateUser().
+    $user = array(
+      'name' => $test_name,
+      'uid' => $test_uid,
+      'mail' => $test_name . '@example.com',
+      'is_new' => TRUE,
+      'pass' => user_password(),
+      'status' => 1,
+    );
+    $user_by_return = user_save(drupal_anonymous_user(), $user);
+    $this->assertTrue($user_by_return, 'Loading user by return of user_save().');
+
+    // Test if created user exists.
+    $user_by_uid = user_load($test_uid);
+    $this->assertTrue($user_by_uid, 'Loading user by uid.');
+
+    $user_by_name = user_load_by_name($test_name);
+    $this->assertTrue($user_by_name, 'Loading user by name.');
+  }
+}
+
+/**
+ * Test the create user administration page.
+ */
+class UserCreateTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'User create',
+      'description' => 'Test the create user administration page.',
+      'group' => 'User',
+    );
+  }
+
+  /**
+   * Create a user through the administration interface and ensure that it
+   * displays in the user list.
+   */
+  protected function testUserAdd() {
+    $user = $this->drupalCreateUser(array('administer users'));
+    $this->drupalLogin($user);
+
+    foreach (array(FALSE, TRUE) as $notify) {
+      $edit = array(
+        'name' => $this->randomName(),
+        'mail' => $this->randomName() . '@example.com',
+        'pass[pass1]' => $pass = $this->randomString(),
+        'pass[pass2]' => $pass,
+        'notify' => $notify,
+      );
+      $this->drupalPost('admin/people/create', $edit, t('Create new account'));
+
+      if ($notify) {
+        $this->assertText(t('A welcome message with further instructions has been e-mailed to the new user @name.', array('@name' => $edit['name'])), 'User created');
+        $this->assertEqual(count($this->drupalGetMails()), 1, 'Notification e-mail sent');
+      }
+      else {
+        $this->assertText(t('Created a new user account for @name. No e-mail has been sent.', array('@name' => $edit['name'])), 'User created');
+        $this->assertEqual(count($this->drupalGetMails()), 0, 'Notification e-mail not sent');
+      }
+
+      $this->drupalGet('admin/people');
+      $this->assertText($edit['name'], 'User found in list of users');
+    }
+  }
+}
+
+/**
+ * Tests editing a user account.
+ */
+class UserEditTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'User edit',
+      'description' => 'Test user edit page.',
+      'group' => 'User',
+    );
+  }
+
+  /**
+   * Test user edit page.
+   */
+  function testUserEdit() {
+    // Test user edit functionality with user pictures disabled.
+    variable_set('user_pictures', 0);
+    $user1 = $this->drupalCreateUser(array('change own username'));
+    $user2 = $this->drupalCreateUser(array());
+    $this->drupalLogin($user1);
+
+    // Test that error message appears when attempting to use a non-unique user name.
+    $edit['name'] = $user2->name;
+    $this->drupalPost("user/$user1->uid/edit", $edit, t('Save'));
+    $this->assertRaw(t('The name %name is already taken.', array('%name' => $edit['name'])));
+
+    // Repeat the test with user pictures enabled, which modifies the form.
+    variable_set('user_pictures', 1);
+    $this->drupalPost("user/$user1->uid/edit", $edit, t('Save'));
+    $this->assertRaw(t('The name %name is already taken.', array('%name' => $edit['name'])));
+
+    // Check that filling out a single password field does not validate.
+    $edit = array();
+    $edit['pass[pass1]'] = '';
+    $edit['pass[pass2]'] = $this->randomName();
+    $this->drupalPost("user/$user1->uid/edit", $edit, t('Save'));
+    $this->assertText(t("The specified passwords do not match."), 'Typing mismatched passwords displays an error message.');
+
+    $edit['pass[pass1]'] = $this->randomName();
+    $edit['pass[pass2]'] = '';
+    $this->drupalPost("user/$user1->uid/edit", $edit, t('Save'));
+    $this->assertText(t("The specified passwords do not match."), 'Typing mismatched passwords displays an error message.');
+
+    // Test that the error message appears when attempting to change the mail or
+    // pass without the current password.
+    $edit = array();
+    $edit['mail'] = $this->randomName() . '@new.example.com';
+    $this->drupalPost("user/$user1->uid/edit", $edit, t('Save'));
+    $this->assertRaw(t("Your current password is missing or incorrect; it's required to change the %name.", array('%name' => t('E-mail address'))));
+
+    $edit['current_pass'] = $user1->pass_raw;
+    $this->drupalPost("user/$user1->uid/edit", $edit, t('Save'));
+    $this->assertRaw(t("The changes have been saved."));
+
+    // Test that the user must enter current password before changing passwords.
+    $edit = array();
+    $edit['pass[pass1]'] = $new_pass = $this->randomName();
+    $edit['pass[pass2]'] = $new_pass;
+    $this->drupalPost("user/$user1->uid/edit", $edit, t('Save'));
+    $this->assertRaw(t("Your current password is missing or incorrect; it's required to change the %name.", array('%name' => t('Password'))));
+
+    // Try again with the current password.
+    $edit['current_pass'] = $user1->pass_raw;
+    $this->drupalPost("user/$user1->uid/edit", $edit, t('Save'));
+    $this->assertRaw(t("The changes have been saved."));
+
+    // Make sure the user can log in with their new password.
+    $this->drupalLogout();
+    $user1->pass_raw = $new_pass;
+    $this->drupalLogin($user1);
+    $this->drupalLogout();
+  }
+}
+
+/**
+ * Test case for user signatures.
+ */
+class UserSignatureTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'User signatures',
+      'description' => 'Test user signatures.',
+      'group' => 'User',
+    );
+  }
+
+  function setUp() {
+    parent::setUp('comment');
+
+    // Enable user signatures.
+    variable_set('user_signatures', 1);
+
+    // Prefetch text formats.
+    $this->full_html_format = filter_format_load('full_html');
+    $this->plain_text_format = filter_format_load('plain_text');
+
+    // Create regular and administrative users.
+    $this->web_user = $this->drupalCreateUser(array());
+    $admin_permissions = array('administer comments');
+    foreach (filter_formats() as $format) {
+      if ($permission = filter_permission_name($format)) {
+        $admin_permissions[] = $permission;
+      }
+    }
+    $this->admin_user = $this->drupalCreateUser($admin_permissions);
+  }
+
+  /**
+   * Test that a user can change their signature format and that it is respected
+   * upon display.
+   */
+  function testUserSignature() {
+    // Create a new node with comments on.
+    $node = $this->drupalCreateNode(array('comment' => COMMENT_NODE_OPEN));
+
+    // Verify that user signature field is not displayed on registration form.
+    $this->drupalGet('user/register');
+    $this->assertNoText(t('Signature'));
+
+    // Log in as a regular user and create a signature.
+    $this->drupalLogin($this->web_user);
+    $signature_text = "<h1>" . $this->randomName() . "</h1>";
+    $edit = array(
+      'signature[value]' => $signature_text,
+      'signature[format]' => $this->plain_text_format->format,
+    );
+    $this->drupalPost('user/' . $this->web_user->uid . '/edit', $edit, t('Save'));
+
+    // Verify that values were stored.
+    $this->assertFieldByName('signature[value]', $edit['signature[value]'], 'Submitted signature text found.');
+    $this->assertFieldByName('signature[format]', $edit['signature[format]'], 'Submitted signature format found.');
+
+    // Create a comment.
+    $langcode = LANGUAGE_NONE;
+    $edit = array();
+    $edit['subject'] = $this->randomName(8);
+    $edit['comment_body[' . $langcode . '][0][value]'] = $this->randomName(16);
+    $this->drupalPost('comment/reply/' . $node->nid, $edit, t('Preview'));
+    $this->drupalPost(NULL, array(), t('Save'));
+
+    // Get the comment ID. (This technique is the same one used in the Comment
+    // module's CommentHelperCase test case.)
+    preg_match('/#comment-([0-9]+)/', $this->getURL(), $match);
+    $comment_id = $match[1];
+
+    // Log in as an administrator and edit the comment to use Full HTML, so
+    // that the comment text itself is not filtered at all.
+    $this->drupalLogin($this->admin_user);
+    $edit['comment_body[' . $langcode . '][0][format]'] = $this->full_html_format->format;
+    $this->drupalPost('comment/' . $comment_id . '/edit', $edit, t('Save'));
+
+    // Assert that the signature did not make it through unfiltered.
+    $this->drupalGet('node/' . $node->nid);
+    $this->assertNoRaw($signature_text, 'Unfiltered signature text not found.');
+    $this->assertRaw(check_markup($signature_text, $this->plain_text_format->format), 'Filtered signature text found.');
+  }
+}
+
+/*
+ * Test that a user, having editing their own account, can still log in.
+ */
+class UserEditedOwnAccountTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'User edited own account',
+      'description' => 'Test user edited own account can still log in.',
+      'group' => 'User',
+    );
+  }
+
+  function testUserEditedOwnAccount() {
+    // Change account setting 'Who can register accounts?' to Administrators
+    // only.
+    variable_set('user_register', USER_REGISTER_ADMINISTRATORS_ONLY);
+
+    // Create a new user account and log in.
+    $account = $this->drupalCreateUser(array('change own username'));
+    $this->drupalLogin($account);
+
+    // Change own username.
+    $edit = array();
+    $edit['name'] = $this->randomName();
+    $this->drupalPost('user/' . $account->uid . '/edit', $edit, t('Save'));
+
+    // Log out.
+    $this->drupalLogout();
+
+    // Set the new name on the user account and attempt to log back in.
+    $account->name = $edit['name'];
+    $this->drupalLogin($account);
+  }
+}
+
+/**
+ * Test case to test adding, editing and deleting roles.
+ */
+class UserRoleAdminTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'User role administration',
+      'description' => 'Test adding, editing and deleting user roles and changing role weights.',
+      'group' => 'User',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $this->admin_user = $this->drupalCreateUser(array('administer permissions', 'administer users'));
+  }
+
+  /**
+   * Test adding, renaming and deleting roles.
+   */
+  function testRoleAdministration() {
+    $this->drupalLogin($this->admin_user);
+
+    // Test adding a role. (In doing so, we use a role name that happens to
+    // correspond to an integer, to test that the role administration pages
+    // correctly distinguish between role names and IDs.)
+    $role_name = '123';
+    $edit = array('name' => $role_name);
+    $this->drupalPost('admin/people/permissions/roles', $edit, t('Add role'));
+    $this->assertText(t('The role has been added.'), 'The role has been added.');
+    $role = user_role_load_by_name($role_name);
+    $this->assertTrue(is_object($role), 'The role was successfully retrieved from the database.');
+
+    // Try adding a duplicate role.
+    $this->drupalPost(NULL, $edit, t('Add role'));
+    $this->assertRaw(t('The role name %name already exists. Choose another role name.', array('%name' => $role_name)), 'Duplicate role warning displayed.');
+
+    // Test renaming a role.
+    $old_name = $role_name;
+    $role_name = '456';
+    $edit = array('name' => $role_name);
+    $this->drupalPost("admin/people/permissions/roles/edit/{$role->rid}", $edit, t('Save role'));
+    $this->assertText(t('The role has been renamed.'), 'The role has been renamed.');
+    $this->assertFalse(user_role_load_by_name($old_name), 'The role can no longer be retrieved from the database using its old name.');
+    $this->assertTrue(is_object(user_role_load_by_name($role_name)), 'The role can be retrieved from the database using its new name.');
+
+    // Test deleting a role.
+    $this->drupalPost("admin/people/permissions/roles/edit/{$role->rid}", NULL, t('Delete role'));
+    $this->drupalPost(NULL, NULL, t('Delete'));
+    $this->assertText(t('The role has been deleted.'), 'The role has been deleted');
+    $this->assertNoLinkByHref("admin/people/permissions/roles/edit/{$role->rid}", 'Role edit link removed.');
+    $this->assertFalse(user_role_load_by_name($role_name), 'A deleted role can no longer be loaded.');
+
+    // Make sure that the system-defined roles cannot be edited via the user
+    // interface.
+    $this->drupalGet('admin/people/permissions/roles/edit/' . DRUPAL_ANONYMOUS_RID);
+    $this->assertResponse(403, 'Access denied when trying to edit the built-in anonymous role.');
+    $this->drupalGet('admin/people/permissions/roles/edit/' . DRUPAL_AUTHENTICATED_RID);
+    $this->assertResponse(403, 'Access denied when trying to edit the built-in authenticated role.');
+  }
+
+  /**
+   * Test user role weight change operation.
+   */
+  function testRoleWeightChange() {
+    $this->drupalLogin($this->admin_user);
+
+    // Pick up a random role and get its weight.
+    $rid = array_rand(user_roles());
+    $role = user_role_load($rid);
+    $old_weight = $role->weight;
+
+    // Change the role weight and submit the form.
+    $edit = array('roles['. $rid .'][weight]' => $old_weight + 1);
+    $this->drupalPost('admin/people/permissions/roles', $edit, t('Save order'));
+    $this->assertText(t('The role settings have been updated.'), 'The role settings form submitted successfully.');
+
+    // Retrieve the saved role and compare its weight.
+    $role = user_role_load($rid);
+    $new_weight = $role->weight;
+    $this->assertTrue(($old_weight + 1) == $new_weight, 'Role weight updated successfully.');
+  }
+}
+
+/**
+ * Test user token replacement in strings.
+ */
+class UserTokenReplaceTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'User token replacement',
+      'description' => 'Generates text using placeholders for dummy content to check user token replacement.',
+      'group' => 'User',
+    );
+  }
+
+  /**
+   * Creates a user, then tests the tokens generated from it.
+   */
+  function testUserTokenReplacement() {
+    global $language;
+    $url_options = array(
+      'absolute' => TRUE,
+      'language' => $language,
+    );
+
+    // Create two users and log them in one after another.
+    $user1 = $this->drupalCreateUser(array());
+    $user2 = $this->drupalCreateUser(array());
+    $this->drupalLogin($user1);
+    $this->drupalLogout();
+    $this->drupalLogin($user2);
+
+    $account = user_load($user1->uid);
+    $global_account = user_load($GLOBALS['user']->uid);
+
+    // Generate and test sanitized tokens.
+    $tests = array();
+    $tests['[user:uid]'] = $account->uid;
+    $tests['[user:name]'] = check_plain(format_username($account));
+    $tests['[user:mail]'] = check_plain($account->mail);
+    $tests['[user:url]'] = url("user/$account->uid", $url_options);
+    $tests['[user:edit-url]'] = url("user/$account->uid/edit", $url_options);
+    $tests['[user:last-login]'] = format_date($account->login, 'medium', '', NULL, $language->language);
+    $tests['[user:last-login:short]'] = format_date($account->login, 'short', '', NULL, $language->language);
+    $tests['[user:created]'] = format_date($account->created, 'medium', '', NULL, $language->language);
+    $tests['[user:created:short]'] = format_date($account->created, 'short', '', NULL, $language->language);
+    $tests['[current-user:name]'] = check_plain(format_username($global_account));
+
+    // Test to make sure that we generated something for each token.
+    $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('user' => $account), array('language' => $language));
+      $this->assertEqual($output, $expected, format_string('Sanitized user token %token replaced.', array('%token' => $input)));
+    }
+
+    // Generate and test unsanitized tokens.
+    $tests['[user:name]'] = format_username($account);
+    $tests['[user:mail]'] = $account->mail;
+    $tests['[current-user:name]'] = format_username($global_account);
+
+    foreach ($tests as $input => $expected) {
+      $output = token_replace($input, array('user' => $account), array('language' => $language, 'sanitize' => FALSE));
+      $this->assertEqual($output, $expected, format_string('Unsanitized user token %token replaced.', array('%token' => $input)));
+    }
+  }
+}
+
+/**
+ * Test user search.
+ */
+class UserUserSearchTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'User search',
+      'description' => 'Tests the user search page and verifies that sensitive information is hidden from unauthorized users.',
+      'group' => 'User',
+    );
+  }
+
+  function testUserSearch() {
+    $user1 = $this->drupalCreateUser(array('access user profiles', 'search content', 'use advanced search'));
+    $this->drupalLogin($user1);
+    $keys = $user1->mail;
+    $edit = array('keys' => $keys);
+    $this->drupalPost('search/user/', $edit, t('Search'));
+    $this->assertNoText($keys);
+    $this->drupalLogout();
+
+    $user2 = $this->drupalCreateUser(array('administer users', 'access user profiles', 'search content', 'use advanced search'));
+    $this->drupalLogin($user2);
+    $keys = $user2->mail;
+    $edit = array('keys' => $keys);
+    $this->drupalPost('search/user/', $edit, t('Search'));
+    $this->assertText($keys);
+
+    // Create a blocked user.
+    $blocked_user = $this->drupalCreateUser();
+    $edit = array('status' => 0);
+    $blocked_user = user_save($blocked_user, $edit);
+
+    // Verify that users with "administer users" permissions can see blocked
+    // accounts in search results.
+    $edit = array('keys' => $blocked_user->name);
+    $this->drupalPost('search/user/', $edit, t('Search'));
+    $this->assertText($blocked_user->name, 'Blocked users are listed on the user search results for users with the "administer users" permission.');
+
+    // Verify that users without "administer users" permissions do not see
+    // blocked accounts in search results.
+    $this->drupalLogin($user1);
+    $edit = array('keys' => $blocked_user->name);
+    $this->drupalPost('search/user/', $edit, t('Search'));
+    $this->assertNoText($blocked_user->name, 'Blocked users are hidden from the user search results.');
+
+    $this->drupalLogout();
+  }
+}
+
+/**
+ * Test role assignment.
+ */
+class UserRolesAssignmentTestCase extends DrupalWebTestCase {
+  protected $admin_user;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Role assignment',
+      'description' => 'Tests that users can be assigned and unassigned roles.',
+      'group' => 'User'
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $this->admin_user = $this->drupalCreateUser(array('administer permissions', 'administer users'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Tests that a user can be assigned a role and that the role can be removed
+   * again.
+   */
+  function testAssignAndRemoveRole()  {
+    $rid = $this->drupalCreateRole(array('administer content types'));
+    $account = $this->drupalCreateUser();
+
+    // Assign the role to the user.
+    $this->drupalPost('user/' . $account->uid . '/edit', array("roles[$rid]" => $rid), t('Save'));
+    $this->assertText(t('The changes have been saved.'));
+    $this->assertFieldChecked('edit-roles-' . $rid, 'Role is assigned.');
+    $this->userLoadAndCheckRoleAssigned($account, $rid);
+
+    // Remove the role from the user.
+    $this->drupalPost('user/' . $account->uid . '/edit', array("roles[$rid]" => FALSE), t('Save'));
+    $this->assertText(t('The changes have been saved.'));
+    $this->assertNoFieldChecked('edit-roles-' . $rid, 'Role is removed from user.');
+    $this->userLoadAndCheckRoleAssigned($account, $rid, FALSE);
+  }
+
+  /**
+   * Tests that when creating a user the role can be assigned. And that it can
+   * be removed again.
+   */
+  function testCreateUserWithRole() {
+    $rid = $this->drupalCreateRole(array('administer content types'));
+    // Create a new user and add the role at the same time.
+    $edit = array(
+      'name' => $this->randomName(),
+      'mail' => $this->randomName() . '@example.com',
+      'pass[pass1]' => $pass = $this->randomString(),
+      'pass[pass2]' => $pass,
+      "roles[$rid]" => $rid,
+    );
+    $this->drupalPost('admin/people/create', $edit, t('Create new account'));
+    $this->assertText(t('Created a new user account for !name.', array('!name' => $edit['name'])));
+    // Get the newly added user.
+    $account = user_load_by_name($edit['name']);
+
+    $this->drupalGet('user/' . $account->uid . '/edit');
+    $this->assertFieldChecked('edit-roles-' . $rid, 'Role is assigned.');
+    $this->userLoadAndCheckRoleAssigned($account, $rid);
+
+    // Remove the role again.
+    $this->drupalPost('user/' . $account->uid . '/edit', array("roles[$rid]" => FALSE), t('Save'));
+    $this->assertText(t('The changes have been saved.'));
+    $this->assertNoFieldChecked('edit-roles-' . $rid, 'Role is removed from user.');
+    $this->userLoadAndCheckRoleAssigned($account, $rid, FALSE);
+  }
+
+  /**
+   * Check role on user object.
+   *
+   * @param object $account
+   *   The user account to check.
+   * @param string $rid
+   *   The role ID to search for.
+   * @param bool $is_assigned
+   *   (optional) Whether to assert that $rid exists (TRUE) or not (FALSE).
+   *   Defaults to TRUE.
+   */
+  private function userLoadAndCheckRoleAssigned($account, $rid, $is_assigned = TRUE) {
+    $account = user_load($account->uid, TRUE);
+    if ($is_assigned) {
+      $this->assertTrue(array_key_exists($rid, $account->roles), 'The role is present in the user object.');
+    }
+    else {
+      $this->assertFalse(array_key_exists($rid, $account->roles), 'The role is not present in the user object.');
+    }
+  }
+}
+
+
+/**
+ * Unit test for authmap assignment.
+ */
+class UserAuthmapAssignmentTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Authmap assignment',
+      'description' => 'Tests that users can be assigned and unassigned authmaps.',
+      'group' => 'User'
+    );
+  }
+
+  /**
+   * Test authmap assignment and retrieval.
+   */
+  function testAuthmapAssignment()  {
+    $account = $this->drupalCreateUser();
+
+    // Assign authmaps to the user.
+    $authmaps = array(
+      'authname_poll' => 'external username one',
+      'authname_book' => 'external username two',
+    );
+    user_set_authmaps($account, $authmaps);
+
+    // Test for expected authmaps.
+    $expected_authmaps = array(
+      'external username one' => array(
+        'poll' => 'external username one',
+      ),
+      'external username two' => array(
+        'book' => 'external username two',
+      ),
+    );
+    foreach ($expected_authmaps as $authname => $expected_output) {
+      $this->assertIdentical(user_get_authmaps($authname), $expected_output, format_string('Authmap for authname %authname was set correctly.', array('%authname' => $authname)));
+    }
+
+    // Remove authmap for module poll, add authmap for module blog.
+    $authmaps = array(
+      'authname_poll' => NULL,
+      'authname_blog' => 'external username three',
+    );
+    user_set_authmaps($account, $authmaps);
+
+    // Assert that external username one does not have authmaps.
+    $remove_username = 'external username one';
+    unset($expected_authmaps[$remove_username]);
+    $this->assertFalse(user_get_authmaps($remove_username), format_string('Authmap for %authname was removed.', array('%authname' => $remove_username)));
+
+    // Assert that a new authmap was created for external username three, and
+    // existing authmaps for external username two were unchanged.
+    $expected_authmaps['external username three'] = array('blog' => 'external username three');
+    foreach ($expected_authmaps as $authname => $expected_output) {
+      $this->assertIdentical(user_get_authmaps($authname), $expected_output, format_string('Authmap for authname %authname was set correctly.', array('%authname' => $authname)));
+    }
+  }
+}
+
+/**
+ * Tests user_validate_current_pass on a custom form.
+ */
+class UserValidateCurrentPassCustomForm extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'User validate current pass custom form',
+      'description' => 'Test that user_validate_current_pass is usable on a custom form.',
+      'group' => 'User',
+    );
+  }
+
+  /**
+   * User with permission to view content.
+   */
+  protected $accessUser;
+
+  /**
+   * User permission to administer users.
+   */
+  protected $adminUser;
+
+  function setUp() {
+    parent::setUp('user_form_test');
+    // Create two users
+    $this->accessUser = $this->drupalCreateUser(array('access content'));
+    $this->adminUser = $this->drupalCreateUser(array('administer users'));
+  }
+
+  /**
+   * Tests that user_validate_current_pass can be reused on a custom form.
+   */
+  function testUserValidateCurrentPassCustomForm() {
+    $this->drupalLogin($this->adminUser);
+
+    // Submit the custom form with the admin user using the access user's password.
+    $edit = array();
+    $edit['user_form_test_field'] = $this->accessUser->name;
+    $edit['current_pass'] = $this->accessUser->pass_raw;
+    $this->drupalPost('user_form_test_current_password/' . $this->accessUser->uid, $edit, t('Test'));
+    $this->assertText(t('The password has been validated and the form submitted successfully.'));
+  }
+}
diff --git a/htmltest/modules/user/user.tokens.inc b/htmltest/modules/user/user.tokens.inc
new file mode 100644
index 00000000..8dcea4b5
--- /dev/null
+++ b/htmltest/modules/user/user.tokens.inc
@@ -0,0 +1,131 @@
+<?php
+
+/**
+ * @file
+ * Builds placeholder replacement tokens for user-related data.
+ */
+
+/**
+ * Implements hook_token_info().
+ */
+function user_token_info() {
+  $types['user'] = array(
+    'name' => t('Users'),
+    'description' => t('Tokens related to individual user accounts.'),
+    'needs-data' => 'user',
+  );
+  $types['current-user'] = array(
+    'name' => t('Current user'),
+    'description' => t('Tokens related to the currently logged in user.'),
+    'type' => 'user',
+  );
+
+  $user['uid'] = array(
+    'name' => t('User ID'),
+    'description' => t("The unique ID of the user account."),
+  );
+  $user['name'] = array(
+    'name' => t("Name"),
+    'description' => t("The login name of the user account."),
+  );
+  $user['mail'] = array(
+    'name' => t("Email"),
+    'description' => t("The email address of the user account."),
+  );
+  $user['url'] = array(
+    'name' => t("URL"),
+    'description' => t("The URL of the account profile page."),
+  );
+  $user['edit-url'] = array(
+    'name' => t("Edit URL"),
+    'description' => t("The URL of the account edit page."),
+  );
+
+  $user['last-login'] = array(
+    'name' => t("Last login"),
+    'description' => t("The date the user last logged in to the site."),
+    'type' => 'date',
+  );
+  $user['created'] = array(
+    'name' => t("Created"),
+    'description' => t("The date the user account was created."),
+    'type' => 'date',
+  );
+
+  return array(
+    'types' => $types,
+    'tokens' => array('user' => $user),
+  );
+}
+
+/**
+ * Implements hook_tokens().
+ */
+function user_tokens($type, $tokens, array $data = array(), array $options = array()) {
+  $url_options = array('absolute' => TRUE);
+  if (isset($options['language'])) {
+    $url_options['language'] = $options['language'];
+    $language_code = $options['language']->language;
+  }
+  else {
+    $language_code = NULL;
+  }
+  $sanitize = !empty($options['sanitize']);
+
+  $replacements = array();
+
+  if ($type == 'user' && !empty($data['user'])) {
+    $account = $data['user'];
+    foreach ($tokens as $name => $original) {
+      switch ($name) {
+        // Basic user account information.
+        case 'uid':
+          // In the case of hook user_presave uid is not set yet.
+          $replacements[$original] = !empty($account->uid) ? $account->uid : t('not yet assigned');
+          break;
+
+        case 'name':
+          $name = format_username($account);
+          $replacements[$original] = $sanitize ? check_plain($name) : $name;
+          break;
+
+        case 'mail':
+          $replacements[$original] = $sanitize ? check_plain($account->mail) : $account->mail;
+          break;
+
+        case 'url':
+          $replacements[$original] = !empty($account->uid) ? url("user/$account->uid", $url_options) : t('not yet assigned');
+          break;
+
+        case 'edit-url':
+          $replacements[$original] = !empty($account->uid) ? url("user/$account->uid/edit", $url_options) : t('not yet assigned');
+          break;
+
+        // These tokens are default variations on the chained tokens handled below.
+        case 'last-login':
+          $replacements[$original] = !empty($account->login) ? format_date($account->login, 'medium', '', NULL, $language_code) : t('never');
+          break;
+
+        case 'created':
+          // In the case of user_presave the created date may not yet be set.
+          $replacements[$original] = !empty($account->created) ? format_date($account->created, 'medium', '', NULL, $language_code) : t('not yet created');
+          break;
+      }
+    }
+
+    if ($login_tokens = token_find_with_prefix($tokens, 'last-login')) {
+      $replacements += token_generate('date', $login_tokens, array('date' => $account->login), $options);
+    }
+
+    if ($registered_tokens = token_find_with_prefix($tokens, 'created')) {
+      $replacements += token_generate('date', $registered_tokens, array('date' => $account->created), $options);
+    }
+  }
+
+  if ($type == 'current-user') {
+    $account = user_load($GLOBALS['user']->uid);
+    $replacements += token_generate('user', $tokens, array('user' => $account), $options);
+  }
+
+  return $replacements;
+}
diff --git a/htmltest/nonotest b/htmltest/nonotest
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/nonotest
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/nzabeetest b/htmltest/nzabeetest
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/nzabeetest
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/phytv b/htmltest/phytv
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/phytv
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/pjury b/htmltest/pjury
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/pjury
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/profiles/minimal/minimal.info b/htmltest/profiles/minimal/minimal.info
new file mode 100644
index 00000000..5335c1ac
--- /dev/null
+++ b/htmltest/profiles/minimal/minimal.info
@@ -0,0 +1,12 @@
+name = Minimal
+description = Start with only a few modules enabled.
+version = VERSION
+core = 7.x
+dependencies[] = block
+dependencies[] = dblog
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/profiles/minimal/minimal.install b/htmltest/profiles/minimal/minimal.install
new file mode 100644
index 00000000..9cf4fa2f
--- /dev/null
+++ b/htmltest/profiles/minimal/minimal.install
@@ -0,0 +1,81 @@
+<?php
+/**
+ * @file
+ * Install, update and uninstall functions for the minimal installation profile.
+ */
+
+/**
+ * Implements hook_install().
+ *
+ * Performs actions to set up the site for this profile.
+ *
+ * @see system_install()
+ */
+function minimal_install() {
+  // Enable some standard blocks.
+  $default_theme = variable_get('theme_default', 'bartik');
+  $values = array(
+    array(
+      'module' => 'system',
+      'delta' => 'main',
+      'theme' => $default_theme,
+      'status' => 1,
+      'weight' => 0,
+      'region' => 'content',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'user',
+      'delta' => 'login',
+      'theme' => $default_theme,
+      'status' => 1,
+      'weight' => 0,
+      'region' => 'sidebar_first',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'system',
+      'delta' => 'navigation',
+      'theme' => $default_theme,
+      'status' => 1,
+      'weight' => 0,
+      'region' => 'sidebar_first',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'system',
+      'delta' => 'management',
+      'theme' => $default_theme,
+      'status' => 1,
+      'weight' => 1,
+      'region' => 'sidebar_first',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'system',
+      'delta' => 'help',
+      'theme' => $default_theme,
+      'status' => 1,
+      'weight' => 0,
+      'region' => 'help',
+      'pages' => '',
+      'cache' => -1,
+    ),
+  );
+  $query = db_insert('block')->fields(array('module', 'delta', 'theme', 'status', 'weight', 'region', 'pages', 'cache'));
+  foreach ($values as $record) {
+    $query->values($record);
+  }
+  $query->execute();
+
+  // Allow visitor account creation, but with administrative approval.
+  variable_set('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL);
+
+  // Enable default permissions for system roles.
+  user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access content'));
+  user_role_grant_permissions(DRUPAL_AUTHENTICATED_RID, array('access content'));
+}
diff --git a/htmltest/profiles/minimal/minimal.profile b/htmltest/profiles/minimal/minimal.profile
new file mode 100644
index 00000000..fe6da8c3
--- /dev/null
+++ b/htmltest/profiles/minimal/minimal.profile
@@ -0,0 +1,15 @@
+<?php
+/**
+ * @file
+ * Enables modules and site configuration for a minimal site installation.
+ */
+
+/**
+ * Implements hook_form_FORM_ID_alter() for install_configure_form().
+ *
+ * Allows the profile to alter the site configuration form.
+ */
+function minimal_form_install_configure_form_alter(&$form, $form_state) {
+  // Pre-populate the site name with the server name.
+  $form['site_information']['site_name']['#default_value'] = $_SERVER['SERVER_NAME'];
+}
diff --git a/htmltest/profiles/minimal/translations/README.txt b/htmltest/profiles/minimal/translations/README.txt
new file mode 100644
index 00000000..a0afa516
--- /dev/null
+++ b/htmltest/profiles/minimal/translations/README.txt
@@ -0,0 +1,3 @@
+
+This directory should be used to place downloaded translations
+for installing Drupal core.
diff --git a/htmltest/profiles/standard/standard.info b/htmltest/profiles/standard/standard.info
new file mode 100644
index 00000000..1f80ebd7
--- /dev/null
+++ b/htmltest/profiles/standard/standard.info
@@ -0,0 +1,31 @@
+name = Standard
+description = Install with commonly used features pre-configured.
+version = VERSION
+core = 7.x
+dependencies[] = block
+dependencies[] = color
+dependencies[] = comment
+dependencies[] = contextual
+dependencies[] = dashboard
+dependencies[] = help
+dependencies[] = image
+dependencies[] = list
+dependencies[] = menu
+dependencies[] = number
+dependencies[] = options
+dependencies[] = path
+dependencies[] = taxonomy
+dependencies[] = dblog
+dependencies[] = search
+dependencies[] = shortcut
+dependencies[] = toolbar
+dependencies[] = overlay
+dependencies[] = field_ui
+dependencies[] = file
+dependencies[] = rdf
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/profiles/standard/standard.install b/htmltest/profiles/standard/standard.install
new file mode 100644
index 00000000..ae34eafa
--- /dev/null
+++ b/htmltest/profiles/standard/standard.install
@@ -0,0 +1,432 @@
+<?php
+/**
+ * @file
+ * Install, update and uninstall functions for the standard installation profile.
+ */
+
+/**
+ * Implements hook_install().
+ *
+ * Perform actions to set up the site for this profile.
+ *
+ * @see system_install()
+ */
+function standard_install() {
+  // Add text formats.
+  $filtered_html_format = array(
+    'format' => 'filtered_html',
+    'name' => 'Filtered HTML',
+    'weight' => 0,
+    'filters' => array(
+      // URL filter.
+      'filter_url' => array(
+        'weight' => 0,
+        'status' => 1,
+      ),
+      // HTML filter.
+      'filter_html' => array(
+        'weight' => 1,
+        'status' => 1,
+      ),
+      // Line break filter.
+      'filter_autop' => array(
+        'weight' => 2,
+        'status' => 1,
+      ),
+      // HTML corrector filter.
+      'filter_htmlcorrector' => array(
+        'weight' => 10,
+        'status' => 1,
+      ),
+    ),
+  );
+  $filtered_html_format = (object) $filtered_html_format;
+  filter_format_save($filtered_html_format);
+
+  $full_html_format = array(
+    'format' => 'full_html',
+    'name' => 'Full HTML',
+    'weight' => 1,
+    'filters' => array(
+      // URL filter.
+      'filter_url' => array(
+        'weight' => 0,
+        'status' => 1,
+      ),
+      // Line break filter.
+      'filter_autop' => array(
+        'weight' => 1,
+        'status' => 1,
+      ),
+      // HTML corrector filter.
+      'filter_htmlcorrector' => array(
+        'weight' => 10,
+        'status' => 1,
+      ),
+    ),
+  );
+  $full_html_format = (object) $full_html_format;
+  filter_format_save($full_html_format);
+
+  // Enable some standard blocks.
+  $default_theme = variable_get('theme_default', 'bartik');
+  $admin_theme = 'seven';
+  $blocks = array(
+    array(
+      'module' => 'system',
+      'delta' => 'main',
+      'theme' => $default_theme,
+      'status' => 1,
+      'weight' => 0,
+      'region' => 'content',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'search',
+      'delta' => 'form',
+      'theme' => $default_theme,
+      'status' => 1,
+      'weight' => -1,
+      'region' => 'sidebar_first',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'node',
+      'delta' => 'recent',
+      'theme' => $admin_theme,
+      'status' => 1,
+      'weight' => 10,
+      'region' => 'dashboard_main',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'user',
+      'delta' => 'login',
+      'theme' => $default_theme,
+      'status' => 1,
+      'weight' => 0,
+      'region' => 'sidebar_first',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'system',
+      'delta' => 'navigation',
+      'theme' => $default_theme,
+      'status' => 1,
+      'weight' => 0,
+      'region' => 'sidebar_first',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'system',
+      'delta' => 'powered-by',
+      'theme' => $default_theme,
+      'status' => 1,
+      'weight' => 10,
+      'region' => 'footer',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'system',
+      'delta' => 'help',
+      'theme' => $default_theme,
+      'status' => 1,
+      'weight' => 0,
+      'region' => 'help',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'system',
+      'delta' => 'main',
+      'theme' => $admin_theme,
+      'status' => 1,
+      'weight' => 0,
+      'region' => 'content',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'system',
+      'delta' => 'help',
+      'theme' => $admin_theme,
+      'status' => 1,
+      'weight' => 0,
+      'region' => 'help',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'user',
+      'delta' => 'login',
+      'theme' => $admin_theme,
+      'status' => 1,
+      'weight' => 10,
+      'region' => 'content',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'user',
+      'delta' => 'new',
+      'theme' => $admin_theme,
+      'status' => 1,
+      'weight' => 0,
+      'region' => 'dashboard_sidebar',
+      'pages' => '',
+      'cache' => -1,
+    ),
+    array(
+      'module' => 'search',
+      'delta' => 'form',
+      'theme' => $admin_theme,
+      'status' => 1,
+      'weight' => -10,
+      'region' => 'dashboard_sidebar',
+      'pages' => '',
+      'cache' => -1,
+    ),
+  );
+  $query = db_insert('block')->fields(array('module', 'delta', 'theme', 'status', 'weight', 'region', 'pages', 'cache'));
+  foreach ($blocks as $block) {
+    $query->values($block);
+  }
+  $query->execute();
+
+  // Insert default pre-defined node types into the database. For a complete
+  // list of available node type attributes, refer to the node type API
+  // documentation at: http://api.drupal.org/api/HEAD/function/hook_node_info.
+  $types = array(
+    array(
+      'type' => 'page',
+      'name' => st('Basic page'),
+      'base' => 'node_content',
+      'description' => st("Use <em>basic pages</em> for your static content, such as an 'About us' page."),
+      'custom' => 1,
+      'modified' => 1,
+      'locked' => 0,
+    ),
+    array(
+      'type' => 'article',
+      'name' => st('Article'),
+      'base' => 'node_content',
+      'description' => st('Use <em>articles</em> for time-sensitive content like news, press releases or blog posts.'),
+      'custom' => 1,
+      'modified' => 1,
+      'locked' => 0,
+    ),
+  );
+
+  foreach ($types as $type) {
+    $type = node_type_set_defaults($type);
+    node_type_save($type);
+    node_add_body_field($type);
+  }
+
+  // Insert default pre-defined RDF mapping into the database.
+  $rdf_mappings = array(
+    array(
+      'type' => 'node',
+      'bundle' => 'page',
+      'mapping' => array(
+        'rdftype' => array('foaf:Document'),
+      ),
+    ),
+    array(
+      'type' => 'node',
+      'bundle' => 'article',
+      'mapping' => array(
+        'field_image' => array(
+          'predicates' => array('og:image', 'rdfs:seeAlso'),
+          'type' => 'rel',
+        ),
+        'field_tags' => array(
+          'predicates' => array('dc:subject'),
+          'type' => 'rel',
+        ),
+      ),
+    ),
+  );
+  foreach ($rdf_mappings as $rdf_mapping) {
+    rdf_mapping_save($rdf_mapping);
+  }
+
+  // Default "Basic page" to not be promoted and have comments disabled.
+  variable_set('node_options_page', array('status'));
+  variable_set('comment_page', COMMENT_NODE_HIDDEN);
+
+  // Don't display date and author information for "Basic page" nodes by default.
+  variable_set('node_submitted_page', FALSE);
+
+  // Enable user picture support and set the default to a square thumbnail option.
+  variable_set('user_pictures', '1');
+  variable_set('user_picture_dimensions', '1024x1024');
+  variable_set('user_picture_file_size', '800');
+  variable_set('user_picture_style', 'thumbnail');
+
+  // Allow visitor account creation with administrative approval.
+  variable_set('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL);
+
+  // Create a default vocabulary named "Tags", enabled for the 'article' content type.
+  $description = st('Use tags to group articles on similar topics into categories.');
+  $vocabulary = (object) array(
+    'name' => st('Tags'),
+    'description' => $description,
+    'machine_name' => 'tags',
+  );
+  taxonomy_vocabulary_save($vocabulary);
+
+  $field = array(
+    'field_name' => 'field_' . $vocabulary->machine_name,
+    'type' => 'taxonomy_term_reference',
+    // Set cardinality to unlimited for tagging.
+    'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+    'settings' => array(
+      'allowed_values' => array(
+        array(
+          'vocabulary' => $vocabulary->machine_name,
+          'parent' => 0,
+        ),
+      ),
+    ),
+  );
+  field_create_field($field);
+
+  $help = st('Enter a comma-separated list of words to describe your content.');
+  $instance = array(
+    'field_name' => 'field_' . $vocabulary->machine_name,
+    'entity_type' => 'node',
+    'label' => 'Tags',
+    'bundle' => 'article',
+    'description' => $help,
+    'widget' => array(
+      'type' => 'taxonomy_autocomplete',
+      'weight' => -4,
+    ),
+    'display' => array(
+      'default' => array(
+        'type' => 'taxonomy_term_reference_link',
+        'weight' => 10,
+      ),
+      'teaser' => array(
+        'type' => 'taxonomy_term_reference_link',
+        'weight' => 10,
+      ),
+    ),
+  );
+  field_create_instance($instance);
+
+
+  // Create an image field named "Image", enabled for the 'article' content type.
+  // Many of the following values will be defaulted, they're included here as an illustrative examples.
+  // See http://api.drupal.org/api/function/field_create_field/7
+
+  $field = array(
+    'field_name' => 'field_image',
+    'type' => 'image',
+    'cardinality' => 1,
+    'locked' => FALSE,
+    'indexes' => array('fid' => array('fid')),
+    'settings' => array(
+      'uri_scheme' => 'public',
+      'default_image' => FALSE,
+    ),
+    'storage' => array(
+      'type' => 'field_sql_storage',
+      'settings' => array(),
+    ),
+  );
+  field_create_field($field);
+
+
+  // Many of the following values will be defaulted, they're included here as an illustrative examples.
+  // See http://api.drupal.org/api/function/field_create_instance/7
+  $instance = array(
+    'field_name' => 'field_image',
+    'entity_type' => 'node',
+    'label' => 'Image',
+    'bundle' => 'article',
+    'description' => st('Upload an image to go with this article.'),
+    'required' => FALSE,
+
+    'settings' => array(
+      'file_directory' => 'field/image',
+      'file_extensions' => 'png gif jpg jpeg',
+      'max_filesize' => '',
+      'max_resolution' => '',
+      'min_resolution' => '',
+      'alt_field' => TRUE,
+      'title_field' => '',
+    ),
+
+    'widget' => array(
+      'type' => 'image_image',
+      'settings' => array(
+        'progress_indicator' => 'throbber',
+        'preview_image_style' => 'thumbnail',
+      ),
+      'weight' => -1,
+    ),
+
+    'display' => array(
+      'default' => array(
+        'label' => 'hidden',
+        'type' => 'image',
+        'settings' => array('image_style' => 'large', 'image_link' => ''),
+        'weight' => -1,
+      ),
+      'teaser' => array(
+        'label' => 'hidden',
+        'type' => 'image',
+        'settings' => array('image_style' => 'medium', 'image_link' => 'content'),
+        'weight' => -1,
+      ),
+    ),
+  );
+  field_create_instance($instance);
+
+  // Enable default permissions for system roles.
+  $filtered_html_permission = filter_permission_name($filtered_html_format);
+  user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access content', 'access comments', $filtered_html_permission));
+  user_role_grant_permissions(DRUPAL_AUTHENTICATED_RID, array('access content', 'access comments', 'post comments', 'skip comment approval', $filtered_html_permission));
+
+  // Create a default role for site administrators, with all available permissions assigned.
+  $admin_role = new stdClass();
+  $admin_role->name = 'administrator';
+  $admin_role->weight = 2;
+  user_role_save($admin_role);
+  user_role_grant_permissions($admin_role->rid, array_keys(module_invoke_all('permission')));
+  // Set this as the administrator role.
+  variable_set('user_admin_role', $admin_role->rid);
+
+  // Assign user 1 the "administrator" role.
+  db_insert('users_roles')
+    ->fields(array('uid' => 1, 'rid' => $admin_role->rid))
+    ->execute();
+
+  // Create a Home link in the main menu.
+  $item = array(
+    'link_title' => st('Home'),
+    'link_path' => '<front>',
+    'menu_name' => 'main-menu',
+  );
+  menu_link_save($item);
+
+  // Update the menu router information.
+  menu_rebuild();
+
+  // Enable the admin theme.
+  db_update('system')
+    ->fields(array('status' => 1))
+    ->condition('type', 'theme')
+    ->condition('name', 'seven')
+    ->execute();
+  variable_set('admin_theme', 'seven');
+  variable_set('node_admin_theme', '1');
+}
diff --git a/htmltest/profiles/standard/standard.profile b/htmltest/profiles/standard/standard.profile
new file mode 100644
index 00000000..d554c937
--- /dev/null
+++ b/htmltest/profiles/standard/standard.profile
@@ -0,0 +1,15 @@
+<?php
+/**
+ * @file
+ * Enables modules and site configuration for a standard site installation.
+ */
+
+/**
+ * Implements hook_form_FORM_ID_alter() for install_configure_form().
+ *
+ * Allows the profile to alter the site configuration form.
+ */
+function standard_form_install_configure_form_alter(&$form, $form_state) {
+  // Pre-populate the site name with the server name.
+  $form['site_information']['site_name']['#default_value'] = $_SERVER['SERVER_NAME'];
+}
diff --git a/htmltest/profiles/standard/translations/README.txt b/htmltest/profiles/standard/translations/README.txt
new file mode 100644
index 00000000..a0afa516
--- /dev/null
+++ b/htmltest/profiles/standard/translations/README.txt
@@ -0,0 +1,3 @@
+
+This directory should be used to place downloaded translations
+for installing Drupal core.
diff --git a/htmltest/profiles/standard/translations/fr.po b/htmltest/profiles/standard/translations/fr.po
new file mode 100644
index 00000000..2571765e
--- /dev/null
+++ b/htmltest/profiles/standard/translations/fr.po
@@ -0,0 +1,16811 @@
+# French translation of Drupal core (7.23)
+# Copyright (c) 2013 by the French translation team
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Drupal core (7.23)\n"
+"POT-Creation-Date: 2013-11-19 15:42+0000\n"
+"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n"
+"Language-Team: French\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n>1);\n"
+
+msgid "Home"
+msgstr "Accueil"
+msgid "User interface"
+msgstr "Interface utilisateur"
+msgid "Title"
+msgstr "Titre"
+msgid "Body"
+msgstr "Corps"
+msgid "Next"
+msgstr "Suivant"
+msgid "user"
+msgstr "utilisateur"
+msgid "Pages"
+msgstr "Pages"
+msgid "Save configuration"
+msgstr "Enregistrer la configuration"
+msgid "Reset to defaults"
+msgstr "Réinitialiser aux valeurs par défaut"
+msgid "delete"
+msgstr "supprimer"
+msgid "Status"
+msgstr "Statut"
+msgid "Create a new user account."
+msgstr "Créer un nouveau compte utilisateur."
+msgid "Request new password via e-mail."
+msgstr "Demander un nouveau mot de passe par courriel."
+msgid "Prefix"
+msgstr "Préfixe"
+msgid "Suffix"
+msgstr "Suffixe"
+msgid "approve"
+msgstr "approuver"
+msgid "E-mail"
+msgstr "Courriel"
+msgid "Approve"
+msgstr "Approuver"
+msgid "Delete"
+msgstr "Supprimer"
+msgid "Operations"
+msgstr "Actions"
+msgid "Content"
+msgstr "Contenu"
+msgid "Username"
+msgstr "Nom d'utilisateur"
+msgid "Email address"
+msgstr "Adresse de courriel"
+msgid "content"
+msgstr "contenu"
+msgid "Development"
+msgstr "Développement"
+msgid "Group"
+msgstr "Groupe"
+msgid "Type"
+msgstr "Type"
+msgid "Author"
+msgstr "Auteur"
+msgid "Replies"
+msgstr "Réponses"
+msgid "Closed"
+msgstr "Fermé"
+msgid "yes"
+msgstr "oui"
+msgid "List"
+msgstr "Lister"
+msgid "Subject"
+msgstr "Objet"
+msgid "closed"
+msgstr "fermé"
+msgid "Actions"
+msgstr "Actions"
+msgid "disabled"
+msgstr "désactivé"
+msgid "Confirm"
+msgstr "Confirmer"
+msgid "Cancel"
+msgstr "Annuler"
+msgid "Remove"
+msgstr "Retirer"
+msgid "administrator"
+msgstr "administrateur"
+msgid "Description"
+msgstr "Description"
+msgid "Language"
+msgstr "Langue"
+msgid "RSS feed"
+msgstr "Flux RSS"
+msgid "Enable"
+msgstr "Activer"
+msgid "Disable"
+msgstr "Désactiver"
+msgid "Explanation or submission guidelines"
+msgstr "Explication ou directives pour la contribution"
+msgid "Article"
+msgstr "Article"
+msgid "Disabled"
+msgstr "Désactivé"
+msgid "Enabled"
+msgstr "Activé"
+msgid "Administration"
+msgstr "Administration"
+msgid "Comments"
+msgstr "Commentaires"
+msgid "More"
+msgstr "Plus"
+msgid "not verified"
+msgstr "non vérifié"
+msgid "Action"
+msgstr "Action"
+msgid "Last updated"
+msgstr "Dernière mise à jour"
+msgid "new"
+msgstr "nouveau"
+msgid "error"
+msgstr "erreur"
+msgid "Tags"
+msgstr "Étiquettes"
+msgid "Block title"
+msgstr "Titre du bloc"
+msgid "The title of the block as shown to the user."
+msgstr "Le titre du bloc tel qu'il est affiché à l'utilisateur"
+msgid "Taxonomy"
+msgstr "Taxonomie"
+msgid "Yes"
+msgstr "Oui"
+msgid "No"
+msgstr "Non"
+msgid "cron"
+msgstr "tâche planifiée (cron)"
+msgid "Blue Lagoon (Default)"
+msgstr "Blue Lagoon (par défaut)"
+msgid "Ash"
+msgstr "Cendre"
+msgid "Aquamarine"
+msgstr "Aigue-marine"
+msgid "Belgian Chocolate"
+msgstr "Chocolat belge"
+msgid "Bluemarine"
+msgstr "Bleu marine"
+msgid "Citrus Blast"
+msgstr "Explosion d'agrume"
+msgid "Cold Day"
+msgstr "Froide journée"
+msgid "Greenbeam"
+msgstr "Rayon vert"
+msgid "Mediterrano"
+msgstr "Mediterrano"
+msgid "Mercury"
+msgstr "Mercure"
+msgid "Nocturnal"
+msgstr "Nocturne"
+msgid "Olivia"
+msgstr "Olivia"
+msgid "Pink Plastic"
+msgstr "Plastique rose"
+msgid "Shiny Tomato"
+msgstr "Tomate brillante"
+msgid "Teal Top"
+msgstr "Bleu sarcelle"
+msgid "Content types"
+msgstr "Types de contenu"
+msgid "Homepage"
+msgstr "Page d'accueil"
+msgid "Home page"
+msgstr "Page d'accueil"
+msgid "Categories"
+msgstr "Catégories"
+msgid "Download"
+msgstr "Téléchargement"
+msgid "Version"
+msgstr "Version"
+msgid "view"
+msgstr "voir"
+msgid "updated"
+msgstr "mis à jour"
+msgid "Overview"
+msgstr "Vue d'ensemble"
+msgid "File information"
+msgstr "Information sur le fichier"
+msgid "File"
+msgstr "Fichier"
+msgid "Advanced options"
+msgstr "Options avancées"
+msgid "Release notes"
+msgstr "Notes de version"
+msgid "Edit"
+msgstr "Modifier"
+msgid "Date"
+msgstr "Date"
+msgid "Size"
+msgstr "Taille"
+msgid "Search"
+msgstr "Rechercher"
+msgid "Reset"
+msgstr "Réinitialiser"
+msgid "Daily"
+msgstr "Quotidien"
+msgid "Weekly"
+msgstr "Hebdomadaire"
+msgid "None"
+msgstr "Aucun(e)"
+msgid "Display settings"
+msgstr "Paramètres d'affichage"
+msgid "This action cannot be undone."
+msgstr "Cette action est irréversible."
+msgid "Test"
+msgstr "Tester"
+msgid "Number"
+msgstr "Nombre"
+msgid "Message"
+msgstr "Message"
+msgid "No log messages available."
+msgstr "Aucune entrée du journal n'est disponible."
+msgid "Password"
+msgstr "Mot de passe"
+msgid "- None -"
+msgstr "- Aucun -"
+msgid "Weight"
+msgstr "Poids"
+msgid "The configuration options have been saved."
+msgstr "Les options de configuration ont été enregistrées."
+msgid "Link"
+msgstr "Lien"
+msgid "Image"
+msgstr "Image"
+msgid "Center"
+msgstr "Centre"
+msgid "Help text"
+msgstr "Texte d'aide"
+msgid "Types"
+msgstr "Types"
+msgid "Required"
+msgstr "Requis"
+msgid "root"
+msgstr "racine"
+msgid "Parent"
+msgstr "Parent"
+msgid "Pages at a given level are ordered first by weight and then by title."
+msgstr ""
+"Les pages d'un même niveau sont d'abord classées par poids, puis "
+"dans l’ordre alphabétique des titres."
+msgid "none"
+msgstr "aucun(e)"
+msgid "Category"
+msgstr "Catégorie"
+msgid "Add container"
+msgstr "Ajouter un conteneur"
+msgid "Settings"
+msgstr "Paramètres"
+msgid "Add category"
+msgstr "Ajouter une catégorie"
+msgid "Name"
+msgstr "Nom"
+msgid "edit container"
+msgstr "modifier le conteneur"
+msgid "edit"
+msgstr "modifier"
+msgid "No categories available."
+msgstr "Pas de catégories."
+msgid "‹ "
+msgstr "‹ "
+msgid "Go to previous page"
+msgstr "Aller à la page précédente"
+msgid "up"
+msgstr "haut"
+msgid "Go to parent page"
+msgstr "Aller à la page parente"
+msgid " ›"
+msgstr " ›"
+msgid "Go to next page"
+msgstr "Aller à la page suivante"
+msgid "Import"
+msgstr "Importer"
+msgid "Book"
+msgstr "Livre"
+msgid "Export"
+msgstr "Exporter"
+msgid "Taxonomy term"
+msgstr "Terme de taxonomie"
+msgid "Field"
+msgstr "Champ"
+msgid "Outline"
+msgstr "Structure"
+msgid "Label"
+msgstr "Étiquette"
+msgid "Preview"
+msgstr "Aperçu"
+msgid "Save"
+msgstr "Enregistrer"
+msgid "Session opened for %name."
+msgstr "Session ouverte pour %name."
+msgid "Help"
+msgstr "Aide"
+msgid "Default"
+msgstr "Par défaut"
+msgid "Summary"
+msgstr "Résumé"
+msgid "Update"
+msgstr "Mettre à jour"
+msgid "Open"
+msgstr "Ouvert"
+msgid "Top"
+msgstr "Haut"
+msgid "Sunday"
+msgstr "Dimanche"
+msgid "Monday"
+msgstr "Lundi"
+msgid "Tuesday"
+msgstr "Mardi"
+msgid "Wednesday"
+msgstr "Mercredi"
+msgid "Thursday"
+msgstr "Jeudi"
+msgid "Friday"
+msgstr "Vendredi"
+msgid "Saturday"
+msgstr "Samedi"
+msgid "Core"
+msgstr "Cœur"
+msgid "Time"
+msgstr "Heure"
+msgid "Add"
+msgstr "Ajouter"
+msgid "View"
+msgstr "Voir"
+msgid "Format"
+msgstr "Format"
+msgid "History"
+msgstr "Historique"
+msgid "URL"
+msgstr "URL"
+msgid "Path"
+msgstr "Chemin"
+msgid "Filename"
+msgstr "Nom du fichier"
+msgid "Vocabularies"
+msgstr "Vocabulaires"
+msgid "Modules"
+msgstr "Modules"
+msgid "Clear index"
+msgstr "Vider l'index"
+msgid "General discussion"
+msgstr "Discussion générale"
+msgid "edit forum"
+msgstr "modifier le forum"
+msgid "Forum name"
+msgstr "Nom du forum"
+msgid "forum"
+msgstr "forum"
+msgid "Are you sure you want to delete the forum %name?"
+msgstr "Êtes-vous sûr(e) de vouloir supprimer le forum %name&nbsp;?"
+msgid "Refresh"
+msgstr "Actualiser"
+msgid "Region"
+msgstr "Région"
+msgid "Visible"
+msgstr "Visible"
+msgid "Anchor"
+msgstr "Ancre"
+msgid "Display"
+msgstr "Affichage"
+msgid "Menu"
+msgstr "Menu"
+msgid "Advanced settings"
+msgstr "Paramètres avancés"
+msgid "results"
+msgstr "résultats"
+msgid "search"
+msgstr "rechercher"
+msgid "Teaser"
+msgstr "Accroche"
+msgid "never"
+msgstr "jamais"
+msgid "The username %name does not exist."
+msgstr "Le nom d'utilisateur %name n'existe pas."
+msgid "mail"
+msgstr "courriel"
+msgid "Updated"
+msgstr "Mis à jour"
+msgid "actions"
+msgstr "actions"
+msgid "Text"
+msgstr "Texte"
+msgid "aggregator"
+msgstr "agrégateur"
+msgid "read more"
+msgstr "lire la suite"
+msgid "Update interval"
+msgstr "Fréquence des mises à jour"
+msgid "The fully-qualified URL of the feed."
+msgstr "L'adresse URL complète du flux."
+msgid "Add forum"
+msgstr "Ajouter un forum"
+msgid "Add term"
+msgstr "Ajouter un terme"
+msgid "theme"
+msgstr "thème"
+msgid "no screenshot"
+msgstr "pas de capture d'écran"
+msgid "Timestamp"
+msgstr "Horodatage"
+msgid "Keywords"
+msgstr "Mots-clés"
+msgid "Access log settings"
+msgstr "Paramètres du journal des accès"
+msgid "Enable access log"
+msgstr "Activer la journalisation des accès"
+msgid "Discard access logs older than"
+msgstr "Supprimer les journaux d'accès plus anciens que"
+msgid "Preview comment"
+msgstr "Aperçu du commentaire"
+msgid "<none>"
+msgstr "--aucun--"
+msgid "Unassign"
+msgstr "Supprimer l'association"
+msgid "Statistics"
+msgstr "Statistiques"
+msgid "Advanced search"
+msgstr "Recherche avancée"
+msgid "You are not authorized to access this page."
+msgstr "Vous n'êtes pas autorisé(e) à accéder à cette page."
+msgid "Unknown"
+msgstr "Inconnu"
+msgid "Attachment"
+msgstr "Fichier attaché"
+msgid "n/a"
+msgstr "n/a"
+msgid "Upload"
+msgstr "Transférer"
+msgid "Picture"
+msgstr "Image"
+msgid "type"
+msgstr "type"
+msgid "Find content"
+msgstr "Rechercher des contenus"
+msgid "Database type"
+msgstr "Type de base de données"
+msgid "User"
+msgstr "Utilisateur"
+msgid "Content type"
+msgstr "Type de contenu"
+msgid "action"
+msgstr "action"
+msgid "Continue"
+msgstr "Continuer"
+msgid "Configure"
+msgstr "Configurer"
+msgid "Email"
+msgstr "Courriel"
+msgid "Files"
+msgstr "Fichiers"
+msgid "file"
+msgstr "fichier"
+msgid "status"
+msgstr "statut"
+msgid "User ID"
+msgstr "Identifiant (ID) utilisateur"
+msgid "Error"
+msgstr "Erreur"
+msgid "Options"
+msgstr "Options"
+msgid "Contact"
+msgstr "Contact"
+msgid "no"
+msgstr "non"
+msgid "Created"
+msgstr "Créé(e)"
+msgid "Node"
+msgstr "Nœud"
+msgid "Sent email to %recipient"
+msgstr "Courriel envoyé à %recipient"
+msgid "Unable to send email to %recipient"
+msgstr "Impossible d'envoyer un courriel à %recipient"
+msgid "The subject of the message."
+msgstr "Le sujet du message."
+msgid "Create"
+msgstr "Créer"
+msgid "Are you sure you want to delete %title?"
+msgstr "Êtes-vous sûr(e) de vouloir supprimer %title ?"
+msgid "Save categories"
+msgstr "Enregistrer les catégories"
+msgid "Parent item"
+msgstr "Élément parent"
+msgid "Question"
+msgstr "Question"
+msgid "Add child page"
+msgstr "Ajouter une page enfant"
+msgid "Printer-friendly version"
+msgstr "Version imprimable"
+msgid "Content type for child pages"
+msgstr "Type de contenu pour les pages enfants"
+msgid "Update options"
+msgstr "Mettre à jour les options"
+msgid "Remove from outline"
+msgstr "Retirer de la structure"
+msgid "Unknown export format."
+msgstr "Format d'export inconnu."
+msgid "All"
+msgstr "Tout"
+msgid "Active"
+msgstr "Actif"
+msgid "Done"
+msgstr "Terminé"
+msgid "Last post"
+msgstr "Dernière contribution"
+msgid "Access denied"
+msgstr "Accès refusé"
+msgid "Year"
+msgstr "Année"
+msgid "Date format"
+msgstr "Format de date"
+msgid "Add content"
+msgstr "Ajouter du contenu"
+msgid "Page title"
+msgstr "Titre de page"
+msgid "Block"
+msgstr "Bloc"
+msgid "Add block"
+msgstr "Ajouter un bloc"
+msgid "Page"
+msgstr "Page"
+msgid "Bottom"
+msgstr "Bas"
+msgid "RSS"
+msgstr "RSS"
+msgid "1 hour"
+msgid_plural "@count hours"
+msgstr[0] "@count heure"
+msgstr[1] "@count heures"
+msgid "1 day"
+msgid_plural "@count days"
+msgstr[0] "@count jour"
+msgstr[1] "@count jours"
+msgid "Configuration saved."
+msgstr "Configuration enregistrée."
+msgid "Taxonomy terms"
+msgstr "Termes de taxonomie"
+msgid "Logo"
+msgstr "Logo"
+msgid "Site name"
+msgstr "Nom du site"
+msgid "Site slogan"
+msgstr "Slogan du site"
+msgid "Good"
+msgstr "Bien"
+msgid "php"
+msgstr "php"
+msgid "Only site administrators can create new user accounts."
+msgstr "Seuls les administrateurs du site peuvent créer de nouveaux comptes."
+msgid "Drupal"
+msgstr "Drupal"
+msgid "Not found"
+msgstr "Non trouvé"
+msgid "Url"
+msgstr "URL"
+msgid "PHP"
+msgstr "PHP"
+msgid "Host"
+msgstr "Hôte"
+msgid "PostgreSQL"
+msgstr "PostgreSQL"
+msgid "Available updates"
+msgstr "Mises à jour disponibles"
+msgid "Manual update check"
+msgstr "Vérification manuelle des mises à jour"
+msgid "Never"
+msgstr "Jamais"
+msgid "Check manually"
+msgstr "Vérifier manuellement"
+msgid "Up to date"
+msgstr "À jour"
+msgid "Update available"
+msgstr "Mise à jour disponible"
+msgid "Drupal core update status"
+msgstr "Statut de mise à jour du cœur de Drupal"
+msgid "Out of date"
+msgstr "Non à jour"
+msgid "Header"
+msgstr "Entête"
+msgid "Left sidebar"
+msgstr "Barre latérale gauche"
+msgid "Right sidebar"
+msgstr "Barre latérale droite"
+msgid "Footer"
+msgstr "Pied de page"
+msgid "Inline"
+msgstr "Sur la même ligne"
+msgid "Recipients"
+msgstr "Destinataires"
+msgid "Selected"
+msgstr "Sélectionné"
+msgid ""
+"Set this to <em>Yes</em> if you would like this category to be "
+"selected by default."
+msgstr ""
+"Définir à <em>Oui</em> si vous souhaitez sélectionner cette "
+"catégorie par défaut."
+msgid "You must enter a category."
+msgstr "Vous devez saisir une catégorie."
+msgid "Are you sure you want to delete %category?"
+msgstr "Êtes-vous sûr(e) de vouloir supprimer %category ?"
+msgid "Category %category has been deleted."
+msgstr "La catégorie %category a été supprimée."
+msgid "Your name"
+msgstr "Votre nom"
+msgid "Your e-mail address"
+msgstr "Votre adresse de courriel"
+msgid "Send e-mail"
+msgstr "Envoyer le courriel"
+msgid "You must select a valid category."
+msgstr "Vous devez choisir une catégorie valide."
+msgid "You must enter a valid e-mail address."
+msgstr "Vous devez saisir une adresse de courriel valide."
+msgid "[!category] !subject"
+msgstr "[!category] !subject"
+msgid "Menu link"
+msgstr "Lien du menu"
+msgid "To"
+msgstr "À"
+msgid "Feed description"
+msgstr "Description du flux"
+msgid "Custom"
+msgstr "Personnalisé"
+msgid "Visibility"
+msgstr "Visibilité"
+msgid "Roles"
+msgstr "Rôles"
+msgid "Revision ID"
+msgstr "Identifiant (ID) de révision"
+msgid "Comment"
+msgstr "Commentaire"
+msgid "Comment ID"
+msgstr "Identifiant (ID) du commentaire"
+msgid "Hostname"
+msgstr "Nom d'hôte"
+msgid "Published"
+msgstr "Publié"
+msgid "Signature"
+msgstr "Signature"
+msgid "Filter"
+msgstr "Filtrer"
+msgid "Location"
+msgstr "Emplacement"
+msgid "Locale"
+msgstr "Localisation"
+msgid "Title field label"
+msgstr "Libellé du champ titre"
+msgid "Promoted to front page"
+msgstr "Promu en page d'accueil"
+msgid "Sticky at top of lists"
+msgstr "Epinglé en haut des listes"
+msgid "Revisions"
+msgstr "Révisions"
+msgid "URL alias"
+msgstr "Alias d'URL"
+msgid "Poll duration"
+msgstr "Durée du sondage"
+msgid "Poll choices"
+msgstr "Choix du sondage"
+msgid "Poll votes"
+msgstr "Votes de sondage"
+msgid "Explanation"
+msgstr "Explication"
+msgid "Selection options"
+msgstr "Options de sélection"
+msgid "File ID"
+msgstr "Identifiant (ID) de fichier"
+msgid "File name"
+msgstr "Nom du fichier"
+msgid "File size"
+msgstr "Taille du fichier"
+msgid "Vocabulary"
+msgstr "Vocabulaire"
+msgid "Vocabulary ID"
+msgstr "Identifiant (ID) de vocabulaire"
+msgid "Vocabulary name"
+msgstr "Nom du vocabulaire"
+msgid "Term ID"
+msgstr "Identifiant (ID) du terme"
+msgid "Role name"
+msgstr "Nom du rôle"
+msgid "E-mail address"
+msgstr "Adresse de courriel"
+msgid "Last access"
+msgstr "Dernier accès"
+msgid "Last login"
+msgstr "Dernière connexion"
+msgid "Time zone"
+msgstr "Fuseau horaire"
+msgid "Severity"
+msgstr "Importance"
+msgid "Field name"
+msgstr "Nom du champ"
+msgid "Field type"
+msgstr "Type de champ"
+msgid "Global settings"
+msgstr "Paramètres globaux"
+msgid "Widget type"
+msgstr "Type de widget"
+msgid "Vote"
+msgstr "Voter"
+msgid "Count"
+msgstr "Décompte"
+msgid "Overridden"
+msgstr "Supplanté"
+msgid "Set name"
+msgstr "Nom de l'ensemble"
+msgid "Original image"
+msgstr "Image originale"
+msgid "RSS - blogs"
+msgstr "RSS - blogs"
+msgid "Heading"
+msgstr "Entête"
+msgid "Search settings"
+msgstr "Paramètres de recherche"
+msgid "Mode"
+msgstr "Mode"
+msgid "Warning"
+msgstr "Avertissement"
+msgid "blocked"
+msgstr "bloqué"
+msgid "active"
+msgstr "actif(s)"
+msgid "N/A"
+msgstr "N/A"
+msgid "OK"
+msgstr "OK"
+msgid "OPML feed"
+msgstr "Flux OPML"
+msgid "configure"
+msgstr "configurer"
+msgid "Number of news items in block"
+msgstr "Nombre d'éléments du bloc"
+msgid "View this feed's recent news."
+msgstr "Voir les nouvelles récentes de ce flux."
+msgid "View this category's recent news."
+msgstr "Voir les dernières publications dans cette catégorie."
+msgid "Feed overview"
+msgstr "Vue d'ensemble par flux"
+msgid "Items"
+msgstr "Éléments"
+msgid "Last update"
+msgstr "Dernière mise à jour"
+msgid "Next update"
+msgstr "Prochaine mise à jour"
+msgid "%time left"
+msgstr "%time restant"
+msgid "remove items"
+msgstr "retirer les éléments"
+msgid "update items"
+msgstr "mettre à jour les éléments"
+msgid "Category overview"
+msgstr "Vue d'ensemble par catégorie"
+msgid "Categorize"
+msgstr "Classer"
+msgid "The categories have been saved."
+msgstr "Les catégories ont été enregistrées."
+msgid "URL:"
+msgstr "URL :"
+msgid "Updated:"
+msgstr "Mis à jour :"
+msgid "%age old"
+msgstr "il y a %age"
+msgid "%ago ago"
+msgstr "il y a %ago"
+msgid "Nodes"
+msgstr "Nœuds"
+msgid "Authored by"
+msgstr "Écrit par"
+msgid "The feed %feed has been updated."
+msgstr "Le flux %feed a été mis à jour."
+msgid "Feed %feed deleted."
+msgstr "Flux %feed supprimé."
+msgid "The feed %feed has been deleted."
+msgstr "Le flux %feed a été supprimé."
+msgid "Feed %feed added."
+msgstr "Le flux %feed a été ajouté."
+msgid "The feed %feed has been added."
+msgstr "Le flux %feed a été ajouté."
+msgid "The news items from %site have been removed."
+msgstr "Les nouvelles de %site ont été supprimées."
+msgid "Performance"
+msgstr "Performance"
+msgid "Width"
+msgstr "Largeur"
+msgid "Height"
+msgstr "Hauteur"
+msgid "This field is required."
+msgstr "Ce champ est requis."
+msgid "Maximum"
+msgstr "Maximum"
+msgid "Line"
+msgstr "Ligne"
+msgid "Scale"
+msgstr "Échelle"
+msgid "Medium"
+msgstr "Moyen"
+msgid "Media"
+msgstr "Média"
+msgid "Plain text"
+msgstr "Texte brut"
+msgid "Caching"
+msgstr "Mise en cache"
+msgid "Month"
+msgstr "Mois"
+msgid "Details"
+msgstr "Détails"
+msgid "Widget"
+msgstr "Widget"
+msgid "Last reply"
+msgstr "Dernière réponse"
+msgid "Prev"
+msgstr "Préc."
+msgid "System"
+msgstr "Système"
+msgid "Domain"
+msgstr "Domaine"
+msgid "Processors"
+msgstr "Processeurs"
+msgid "Unlimited"
+msgstr "Illimité"
+msgid "Send"
+msgstr "Envoyer"
+msgid "Code"
+msgstr "Code"
+msgid "Enter a valid username."
+msgstr "Saisissez un nom d'utilisateur valide."
+msgid "Owner"
+msgstr "Propriétaire"
+msgid "Recipient"
+msgstr "Destinataire"
+msgid "Add a role to the selected users"
+msgstr "Ajouter un rôle aux utilisateurs sélectionnés."
+msgid "Remove a role from the selected users"
+msgstr "Retirer un rôle aux utilisateurs sélectionnés."
+msgid "security"
+msgstr "sécurité"
+msgid "node"
+msgstr "nœud"
+msgid "Administer content"
+msgstr "Administrer le contenu"
+msgid "General"
+msgstr "Général"
+msgid "Method"
+msgstr "Méthode"
+msgid "Egypt"
+msgstr "Égypte"
+msgid "Namibia"
+msgstr "Namibie"
+msgid "Israel"
+msgstr "Israël"
+msgid "Iran"
+msgstr "Iran"
+msgid "New Zealand"
+msgstr "Nouvelle-Zélande"
+msgid "Tonga"
+msgstr "Tonga"
+msgid "Cuba"
+msgstr "Cuba"
+msgid "Brazil"
+msgstr "Brésil"
+msgid "Chile"
+msgstr "Chili"
+msgid "Paraguay"
+msgstr "Paraguay"
+msgid "Jamaica"
+msgstr "Jamaïque"
+msgid "Japan"
+msgstr "Japon"
+msgid "Libya"
+msgstr "Lybie"
+msgid "Navajo"
+msgstr "Navajo"
+msgid "Poland"
+msgstr "Pologne"
+msgid "Portugal"
+msgstr "Portugal"
+msgid "Singapore"
+msgstr "Singapour"
+msgid "Turkey"
+msgstr "Turquie"
+msgid "Day"
+msgstr "Jour"
+msgid "Table"
+msgstr "Tableau"
+msgid "Mon"
+msgstr "lun"
+msgid "Tue"
+msgstr "mar"
+msgid "Wed"
+msgstr "mer"
+msgid "Thu"
+msgstr "jeu"
+msgid "Fri"
+msgstr "ven"
+msgid "Sat"
+msgstr "sam"
+msgid "Sun"
+msgstr "dim"
+msgid "January"
+msgstr "janvier"
+msgid "February"
+msgstr "Février"
+msgid "March"
+msgstr "mars"
+msgid "April"
+msgstr "avril"
+msgid "May"
+msgstr "mai"
+msgid "June"
+msgstr "juin"
+msgid "July"
+msgstr "juillet"
+msgid "August"
+msgstr "août"
+msgid "September"
+msgstr "septembre"
+msgid "October"
+msgstr "octobre"
+msgid "November"
+msgstr "novembre"
+msgid "December"
+msgstr "décembre"
+msgid "am"
+msgstr "am"
+msgid "pm"
+msgstr "pm"
+msgid "Forum"
+msgstr "Forum"
+msgid "Configuration"
+msgstr "Configuration"
+msgid "!time ago"
+msgstr "Il y a !time"
+msgid "Background color"
+msgstr "Couleur d'arrière-plan"
+msgid "Text color"
+msgstr "Couleur du texte"
+msgid "Navigation"
+msgstr "Navigation"
+msgid "Basic"
+msgstr "Basique"
+msgid "Color"
+msgstr "Couleur"
+msgid "Appearance"
+msgstr "Apparence"
+msgid "Role"
+msgstr "Rôle"
+msgid "User login"
+msgstr "Connexion utilisateur"
+msgid "Log in"
+msgstr "Se connecter"
+msgid "Updated URL for feed %title to %url."
+msgstr "URL du flux %url mise à jour pour le flux %title."
+msgid "Blog"
+msgstr "Blog"
+msgid "Jump to the first comment of this posting."
+msgstr "Aller directement au premier commentaire de ce message."
+msgid "Jump to the first new comment of this posting."
+msgstr "Aller directement au premier nouveau commentaire de ce message."
+msgid "Add new comment"
+msgstr "Ajouter un commentaire"
+msgid "Add a new comment to this page."
+msgstr "Ajouter un nouveau commentaire à cette page."
+msgid "Share your thoughts and opinions related to this posting."
+msgstr "Partager vos idées et opinions au sujet de cette contribution."
+msgid "reset"
+msgstr "réinitialiser"
+msgid "String"
+msgstr "Chaîne de caractères"
+msgid "Users"
+msgstr "Utilisateurs"
+msgid "Not installed"
+msgstr "Non installé"
+msgid "Choices"
+msgstr "Choix"
+msgid "Minimum cache lifetime"
+msgstr "Durée de vie minimale de la mémoire cache"
+msgid "Referrer"
+msgstr "Référent"
+msgid "1 vote"
+msgid_plural "@count votes"
+msgstr[0] "@count vote"
+msgstr[1] "@count votes"
+msgid ""
+"@site is currently under maintenance. We should be back shortly. Thank "
+"you for your patience."
+msgstr ""
+"@site est en cours de maintenance. Nous serons de retour très "
+"bientôt. Merci de votre patience."
+msgid "Default front page"
+msgstr "Page d'accueil par défaut"
+msgid "Top pages"
+msgstr "Top des pages"
+msgid "Text processing"
+msgstr "Traitement du texte"
+msgid "Maximum length"
+msgstr "Taille maximale"
+msgid "Rows"
+msgstr "Rangées"
+msgid "Save changes"
+msgstr "Enregistrer les modifications"
+msgid "access denied"
+msgstr "accès refusé"
+msgid "Anonymous"
+msgstr "Anonyme"
+msgid "Uninstall"
+msgstr "Désinstaller"
+msgid "Install"
+msgstr "Installer"
+msgid "Optional"
+msgstr "Facultatif"
+msgid "Order"
+msgstr "Ordre"
+msgid "Recent comments"
+msgstr "Commentaires récents"
+msgid "Recent hits"
+msgstr "Accès récents"
+msgid "Set default"
+msgstr "Définir par défaut"
+msgid "Integer"
+msgstr "Entier"
+msgid "IP Address"
+msgstr "Adresse IP"
+msgid "The comment and all its replies have been deleted."
+msgstr "Le commentaire et toutes ses réponses ont été supprimés."
+msgid "Preformatted"
+msgstr "Texte préformaté"
+msgid "Profile"
+msgstr "Profil"
+msgid "Anonymous users"
+msgstr "Utilisateurs anonymes"
+msgid "Clear cache"
+msgstr "Purger le cache"
+msgid "Visibility settings"
+msgstr "Paramètres de visibilité"
+msgid "Votes"
+msgstr "Votes"
+msgid "Term description"
+msgstr "Description du terme"
+msgid "Save settings"
+msgstr "Enregistrer les paramètres"
+msgid "Operation"
+msgstr "Opération"
+msgid "reply"
+msgstr "répondre"
+msgid "Function"
+msgstr "Fonction"
+msgid "Session closed for %name."
+msgstr "Session fermée pour %name."
+msgid "Tracker"
+msgstr "Suivi"
+msgid "You have to specify a valid date."
+msgstr "Vous devez saisir une date valide."
+msgid "Server settings"
+msgstr "Paramètres du serveur"
+msgid "The field %field is required."
+msgstr "Le champ %field est requis."
+msgid "Germany"
+msgstr "Allemagne"
+msgid "Logout"
+msgstr "Déconnexion"
+msgid "1 new"
+msgid_plural "@count new"
+msgstr[0] "1 nouveau"
+msgstr[1] "@count nouveaux"
+msgid "Default language"
+msgstr "Langue par défaut"
+msgid "Afghanistan"
+msgstr "Afghanistan"
+msgid "Albania"
+msgstr "Albanie"
+msgid "Algeria"
+msgstr "Algérie"
+msgid "American Samoa"
+msgstr "Samoa américaines"
+msgid "Andorra"
+msgstr "Andorre"
+msgid "Angola"
+msgstr "Angola"
+msgid "Anguilla"
+msgstr "Anguilla"
+msgid "Antarctica"
+msgstr "Antarctique"
+msgid "Antigua and Barbuda"
+msgstr "Antigua-et-Barbuda"
+msgid "Argentina"
+msgstr "Argentine"
+msgid "Armenia"
+msgstr "Arménie"
+msgid "Aruba"
+msgstr "Aruba"
+msgid "Australia"
+msgstr "Australie"
+msgid "Austria"
+msgstr "Autriche"
+msgid "Azerbaijan"
+msgstr "Azerbaïdjan"
+msgid "Bahamas"
+msgstr "Bahamas"
+msgid "Bahrain"
+msgstr "Bahreïn"
+msgid "Bangladesh"
+msgstr "Bangladesh"
+msgid "Barbados"
+msgstr "Barbade"
+msgid "Belarus"
+msgstr "Biélorussie"
+msgid "Belgium"
+msgstr "Belgique"
+msgid "Belize"
+msgstr "Belize"
+msgid "Benin"
+msgstr "Bénin"
+msgid "Bermuda"
+msgstr "Bermudes"
+msgid "Bhutan"
+msgstr "Bhoutan"
+msgid "Bolivia"
+msgstr "Bolivie"
+msgid "Bosnia and Herzegovina"
+msgstr "Bosnie-Herzégovine"
+msgid "Botswana"
+msgstr "Botswana"
+msgid "Bouvet Island"
+msgstr "Île Bouvet"
+msgid "Brunei"
+msgstr "Brunei"
+msgid "Bulgaria"
+msgstr "Bulgarie"
+msgid "Burkina Faso"
+msgstr "Burkina Faso"
+msgid "Burundi"
+msgstr "Burundi"
+msgid "Cambodia"
+msgstr "Cambodge"
+msgid "Cameroon"
+msgstr "Cameroun"
+msgid "Canada"
+msgstr "Canada"
+msgid "Cape Verde"
+msgstr "Cap-Vert"
+msgid "Cayman Islands"
+msgstr "Îles Caïmans"
+msgid "Central African Republic"
+msgstr "République centrafricaine"
+msgid "Chad"
+msgstr "Tchad"
+msgid "China"
+msgstr "Chine"
+msgid "Christmas Island"
+msgstr "Île Christmas"
+msgid "Cocos (Keeling) Islands"
+msgstr "Îles Cocos (Keeling)"
+msgid "Colombia"
+msgstr "Colombie"
+msgid "Comoros"
+msgstr "Comores"
+msgid "Cook Islands"
+msgstr "Îles Cook"
+msgid "Costa Rica"
+msgstr "Costa Rica"
+msgid "Cyprus"
+msgstr "Chypre"
+msgid "Czech Republic"
+msgstr "République tchèque"
+msgid "Denmark"
+msgstr "Danemark"
+msgid "Djibouti"
+msgstr "Djibouti"
+msgid "Dominica"
+msgstr "Dominique"
+msgid "Dominican Republic"
+msgstr "République dominicaine"
+msgid "Ecuador"
+msgstr "Équateur"
+msgid "El Salvador"
+msgstr "Salvador"
+msgid "Equatorial Guinea"
+msgstr "Guinée équatoriale"
+msgid "Eritrea"
+msgstr "Érythrée"
+msgid "Estonia"
+msgstr "Estonie"
+msgid "Ethiopia"
+msgstr "Éthiopie"
+msgid "Faroe Islands"
+msgstr "Îles Féroé"
+msgid "Finland"
+msgstr "Finlande"
+msgid "France"
+msgstr "France"
+msgid "French Guiana"
+msgstr "Guyane française"
+msgid "French Polynesia"
+msgstr "Polynésie française"
+msgid "Gabon"
+msgstr "Gabon"
+msgid "Gambia"
+msgstr "Gambie"
+msgid "Georgia"
+msgstr "Géorgie"
+msgid "Ghana"
+msgstr "Ghana"
+msgid "Gibraltar"
+msgstr "Gibraltar"
+msgid "Greece"
+msgstr "Grèce"
+msgid "Greenland"
+msgstr "Groenland"
+msgid "Grenada"
+msgstr "Grenade"
+msgid "Guadeloupe"
+msgstr "Guadeloupe"
+msgid "Guam"
+msgstr "Guam"
+msgid "Guatemala"
+msgstr "Guatemala"
+msgid "Guinea"
+msgstr "Guinée"
+msgid "Guinea-Bissau"
+msgstr "Guinée-Bissau"
+msgid "Guyana"
+msgstr "Guyane"
+msgid "Haiti"
+msgstr "Haïti"
+msgid "Heard Island and McDonald Islands"
+msgstr "Îles Heard et MacDonald"
+msgid "Honduras"
+msgstr "Honduras"
+msgid "Hungary"
+msgstr "Hongrie"
+msgid "Iceland"
+msgstr "Islande"
+msgid "India"
+msgstr "Inde"
+msgid "Indonesia"
+msgstr "Indonésie"
+msgid "Iraq"
+msgstr "Irak"
+msgid "Ireland"
+msgstr "Irlande"
+msgid "Italy"
+msgstr "Italie"
+msgid "Jordan"
+msgstr "Jordanie"
+msgid "Kazakhstan"
+msgstr "Kazakhstan"
+msgid "Kenya"
+msgstr "Kenya"
+msgid "Kiribati"
+msgstr "Kiribati"
+msgid "Kuwait"
+msgstr "Koweït"
+msgid "Kyrgyzstan"
+msgstr "Kirghizistan"
+msgid "Laos"
+msgstr "Laos"
+msgid "Latvia"
+msgstr "Lettonie"
+msgid "Lebanon"
+msgstr "Liban"
+msgid "Lesotho"
+msgstr "Lesotho"
+msgid "Liberia"
+msgstr "Libéria"
+msgid "Liechtenstein"
+msgstr "Liechtenstein"
+msgid "Lithuania"
+msgstr "Lituanie"
+msgid "Luxembourg"
+msgstr "Luxembourg"
+msgid "Madagascar"
+msgstr "Madagascar"
+msgid "Malawi"
+msgstr "Malawi"
+msgid "Malaysia"
+msgstr "Malaisie"
+msgid "Maldives"
+msgstr "Maldives"
+msgid "Mali"
+msgstr "Mali"
+msgid "Malta"
+msgstr "Malte"
+msgid "Marshall Islands"
+msgstr "Îles Marshall"
+msgid "Martinique"
+msgstr "Martinique"
+msgid "Mauritania"
+msgstr "Mauritanie"
+msgid "Mauritius"
+msgstr "Maurice"
+msgid "Mayotte"
+msgstr "Mayotte"
+msgid "Mexico"
+msgstr "Mexique"
+msgid "Micronesia"
+msgstr "Micronésie"
+msgid "Moldova"
+msgstr "Moldavie"
+msgid "Monaco"
+msgstr "Monaco"
+msgid "Mongolia"
+msgstr "Mongolie"
+msgid "Montserrat"
+msgstr "Montserrat"
+msgid "Morocco"
+msgstr "Maroc"
+msgid "Mozambique"
+msgstr "Mozambique"
+msgid "Myanmar"
+msgstr "Birmanie"
+msgid "Nauru"
+msgstr "Nauru"
+msgid "Nepal"
+msgstr "Népal"
+msgid "Netherlands"
+msgstr "Pays-Bas"
+msgid "Netherlands Antilles"
+msgstr "Antilles néerlandaises"
+msgid "New Caledonia"
+msgstr "Nouvelle-Calédonie"
+msgid "Nicaragua"
+msgstr "Nicaragua"
+msgid "Niger"
+msgstr "Niger"
+msgid "Nigeria"
+msgstr "Nigeria"
+msgid "Niue"
+msgstr "Niue"
+msgid "Norfolk Island"
+msgstr "Île Norfolk"
+msgid "North Korea"
+msgstr "Corée du Nord"
+msgid "Northern Mariana Islands"
+msgstr "Îles Mariannes du Nord"
+msgid "Norway"
+msgstr "Norvège"
+msgid "Oman"
+msgstr "Oman"
+msgid "Pakistan"
+msgstr "Pakistan"
+msgid "Palau"
+msgstr "Palaos"
+msgid "Panama"
+msgstr "Panama"
+msgid "Papua New Guinea"
+msgstr "Papouasie-Nouvelle-Guinée"
+msgid "Peru"
+msgstr "Pérou"
+msgid "Philippines"
+msgstr "Philippines"
+msgid "Puerto Rico"
+msgstr "Porto Rico"
+msgid "Qatar"
+msgstr "Qatar"
+msgid "Reunion"
+msgstr "Réunion"
+msgid "Romania"
+msgstr "Roumanie"
+msgid "Russia"
+msgstr "Russie"
+msgid "Rwanda"
+msgstr "Rwanda"
+msgid "Samoa"
+msgstr "Samoa"
+msgid "San Marino"
+msgstr "Saint-Marin"
+msgid "Saudi Arabia"
+msgstr "Arabie Saoudite"
+msgid "Senegal"
+msgstr "Sénégal"
+msgid "Seychelles"
+msgstr "Seychelles"
+msgid "Sierra Leone"
+msgstr "Sierra Leone"
+msgid "Slovakia"
+msgstr "Slovaquie"
+msgid "Slovenia"
+msgstr "Slovénie"
+msgid "Solomon Islands"
+msgstr "Îles Salomon"
+msgid "Somalia"
+msgstr "Somalie"
+msgid "South Africa"
+msgstr "Afrique du Sud"
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Géorgie du Sud et les Îles Sandwich du Sud"
+msgid "Spain"
+msgstr "Espagne"
+msgid "Sri Lanka"
+msgstr "Sri Lanka"
+msgid "Sudan"
+msgstr "Soudan"
+msgid "Suriname"
+msgstr "Suriname"
+msgid "Svalbard and Jan Mayen"
+msgstr "Svalbard et Île Jan Mayen"
+msgid "Swaziland"
+msgstr "Swaziland"
+msgid "Sweden"
+msgstr "Suède"
+msgid "Switzerland"
+msgstr "Suisse"
+msgid "Syria"
+msgstr "Syrie"
+msgid "Taiwan"
+msgstr "Taïwan"
+msgid "Tajikistan"
+msgstr "Tadjikistan"
+msgid "Tanzania"
+msgstr "Tanzanie"
+msgid "Thailand"
+msgstr "Thaïlande"
+msgid "Togo"
+msgstr "Togo"
+msgid "Tokelau"
+msgstr "Tokelau"
+msgid "Trinidad and Tobago"
+msgstr "Trinité-et-Tobago"
+msgid "Tunisia"
+msgstr "Tunisie"
+msgid "Turkmenistan"
+msgstr "Turkménistan"
+msgid "Turks and Caicos Islands"
+msgstr "Îles Turques-et-Caïques"
+msgid "Tuvalu"
+msgstr "Tuvalu"
+msgid "Uganda"
+msgstr "Ouganda"
+msgid "Ukraine"
+msgstr "Ukraine"
+msgid "United Arab Emirates"
+msgstr "Émirats arabes unis"
+msgid "United Kingdom"
+msgstr "Royaume-Uni"
+msgid "United States"
+msgstr "États-Unis"
+msgid "United States Minor Outlying Islands"
+msgstr "Îles mineures éloignées des États-Unis"
+msgid "Uruguay"
+msgstr "Uruguay"
+msgid "Uzbekistan"
+msgstr "Ouzbékistan"
+msgid "Vanuatu"
+msgstr "Vanuatu"
+msgid "Venezuela"
+msgstr "Venezuela"
+msgid "Wallis and Futuna"
+msgstr "Wallis et Futuna"
+msgid "Yemen"
+msgstr "Yémen"
+msgid "Zambia"
+msgstr "Zambie"
+msgid "Zimbabwe"
+msgstr "Zimbabwe"
+msgid "Table prefix"
+msgstr "Préfixe de table"
+msgid "Database username"
+msgstr "Nom d'utilisateur de la base de données"
+msgid "Database password"
+msgstr "Mot de passe de la base de données"
+msgid "Database name"
+msgstr "Nom de la base de données"
+msgid "Add user"
+msgstr "Ajouter un utilisateur"
+msgid "Port"
+msgstr "Port"
+msgid "Size of textfield"
+msgstr "Taille du champ texte"
+msgid "Authoring information"
+msgstr "Informations de publication"
+msgid "Authored on"
+msgstr "Écrit le"
+msgid "Leave blank for %anonymous."
+msgstr "Laisser vide pour %anonymous."
+msgid "Hidden"
+msgstr "Caché"
+msgid "Show"
+msgstr "Afficher"
+msgid ""
+"Enable or disable page caching for anonymous users and set CSS and JS "
+"bandwidth optimization options."
+msgstr ""
+"Activer ou désactiver le cache des pages pour les utilisateurs "
+"anonymes, et régler les options d'optimisation des CSS et des "
+"Javascript."
+msgid "Syslog"
+msgstr "Syslog"
+msgid "Key"
+msgstr "Clef"
+msgid "Enabled languages"
+msgstr "Langues activées"
+msgid "Arabic"
+msgstr "Arabe"
+msgid "English"
+msgstr "Anglais"
+msgid "French"
+msgstr "Français"
+msgid "Italian"
+msgstr "Italien"
+msgid "Spanish"
+msgstr "Espagnol"
+msgid "Japanese"
+msgstr "Japonais"
+msgid "Korean"
+msgstr "Coréen"
+msgid ""
+"A valid e-mail address. All e-mails from the system will be sent to "
+"this address. The e-mail address is not made public and will only be "
+"used if you wish to receive a new password or wish to receive certain "
+"news or notifications by e-mail."
+msgstr ""
+"Une adresse électronique valide. Le système enverra tous les "
+"courriels à cette adresse. L'adresse électronique ne sera pas rendue "
+"publique et ne sera utilisée que pour la réception d'un nouveau mot "
+"de passe ou pour la réception de certaines notifications désirées."
+msgid ""
+"The e-mail address %email is already registered. <a "
+"href=\"@password\">Have you forgotten your password?</a>"
+msgstr ""
+"L'adresse électronique %email est déjà enregistrée. <a "
+"href=\"@password\">Avez-vous oublié votre mot de passe ?</a>"
+msgid "Import OPML"
+msgstr "Import OPML"
+msgid "Remove items"
+msgstr "Supprimer les éléments"
+msgid "OPML File"
+msgstr "Fichier OPML"
+msgid "Allowed HTML tags"
+msgstr "Balises HTML autorisées"
+msgid "Sources"
+msgstr "Sources"
+msgid "!title category latest items"
+msgstr "Derniers éléments de la catégorie !title"
+msgid "!title feed latest items"
+msgstr "Derniers éléments du flux !title"
+msgid "The category %category has been updated."
+msgstr "La catégorie %category a été mise à jour."
+msgid "Category %category deleted."
+msgstr "Catégorie %category supprimée."
+msgid "The category %category has been deleted."
+msgstr "La catégorie %category a été supprimée."
+msgid "Category %category added."
+msgstr "Catégorie %category ajoutée."
+msgid "The category %category has been added."
+msgstr "La catégorie %category a été ajoutée."
+msgid "aggregator - @title"
+msgstr "agrégateur - @title"
+msgid "1 item"
+msgid_plural "@count items"
+msgstr[0] "@count élement"
+msgstr[1] "@count éléments"
+msgid "Add menu"
+msgstr "Ajouter un menu"
+msgid "menu"
+msgstr "menu"
+msgid "‹ previous"
+msgstr "‹ précédent"
+msgid "next ›"
+msgstr "suivant ›"
+msgid "No items selected."
+msgstr "Aucun élément sélectionné."
+msgid "The update has been performed."
+msgstr "La mise à jour a été effectuée."
+msgid "Browser"
+msgstr "Navigateur"
+msgid "View user profile."
+msgstr "Voir le profil utilisateur."
+msgid "Titles only"
+msgstr "Titres seulement"
+msgid "Full text"
+msgstr "Texte entier"
+msgid "This cannot be undone."
+msgstr "Cette opération est irréversible."
+msgid "Upload picture"
+msgstr "Transférer une image"
+msgid "Message:"
+msgstr "Message :"
+msgid "Language file"
+msgstr "Fichier de langue"
+msgid "published"
+msgstr "publié"
+msgid "Average page generation time"
+msgstr "Temps moyen de génération de la page"
+msgid "The changes have been saved."
+msgstr "Les changements ont été enregistrés."
+msgid "Show only users where"
+msgstr "Afficher uniquement les utilisateurs où"
+msgid "Refine"
+msgstr "Affiner"
+msgid "Undo"
+msgstr "Annuler"
+msgid "Member for"
+msgstr "Membre depuis"
+msgid "@time ago"
+msgstr "il y a @time"
+msgid "No users selected."
+msgstr "Aucun utilisateur sélectionné."
+msgid "Detected malicious attempt to alter protected user fields."
+msgstr ""
+"Tentative frauduleuse de modification de champs utilisateur protégés "
+"détectée."
+msgid "Select all rows in this table"
+msgstr "Sélectionner toutes les lignes du tableau"
+msgid "Deselect all rows in this table"
+msgstr "Désélectionner toutes les lignes du tableau"
+msgid "Search results"
+msgstr "Résultats de la recherche"
+msgid "Your search yielded no results"
+msgstr "Votre recherche n'a donné aucun résultat"
+msgid "Please enter some keywords."
+msgstr "Veuillez saisir des mots-clés."
+msgid "Front page"
+msgstr "Page d'accueil"
+msgid "Request new password"
+msgstr "Demander un nouveau mot de passe"
+msgid "Deleted"
+msgstr "Supprimé"
+msgid "Languages"
+msgstr "Langues"
+msgid "Topics"
+msgstr "Sujets"
+msgid "Topic"
+msgstr "Sujet"
+msgid "Allowed values list"
+msgstr "Liste des valeurs autorisées"
+msgid "Today"
+msgstr "Aujourd'hui"
+msgid "Edit menu"
+msgstr "Modifier le menu"
+msgid "Delete menu"
+msgstr "Supprimer le menu"
+msgid "Publishing options"
+msgstr "Options de publication"
+msgid "Create new revision"
+msgstr "Créer une nouvelle révision"
+msgid "Minimum height"
+msgstr "Hauteur minimum"
+msgid "Minimum width"
+msgstr "Largeur minimum"
+msgid "Locale settings"
+msgstr "Paramètres régionaux"
+msgid "Configure block"
+msgstr "Configurer le bloc"
+msgid "How many content items to display in \"day\" list."
+msgstr ""
+"Nombre d'éléments de contenu afficher dans la liste "
+"« aujourd'hui »."
+msgid "Jan"
+msgstr "jan"
+msgid "Feb"
+msgstr "fév"
+msgid "Mar"
+msgstr "mar"
+msgid "Apr"
+msgstr "avr"
+msgid "Jun"
+msgstr "juin"
+msgid "Jul"
+msgstr "juil"
+msgid "Aug"
+msgstr "aoû"
+msgid "Sep"
+msgstr "sep"
+msgid "Oct"
+msgstr "oct"
+msgid "Nov"
+msgstr "nov"
+msgid "Dec"
+msgstr "déc"
+msgid "Select list"
+msgstr "Liste de sélection"
+msgid "Text field"
+msgstr "Champ texte"
+msgid "Long"
+msgstr "Long"
+msgid "Short"
+msgstr "Court"
+msgid "Posts"
+msgstr "Contributions"
+msgid "Configure permissions"
+msgstr "Configurer les droits d'accès"
+msgid "Workflow"
+msgstr "Processus"
+msgid "Randomize"
+msgstr "Générer au hasard"
+msgid "Revert"
+msgstr "Rétablir"
+msgid "Empty"
+msgstr "Vide"
+msgid "Existing system path"
+msgstr "Chemin système existant"
+msgid "Path alias"
+msgstr "Alias de chemin"
+msgid ""
+"Specify an alternative path by which this data can be accessed. For "
+"example, type \"about\" when writing an about page. Use a relative "
+"path and don't add a trailing slash or the URL alias won't work."
+msgstr ""
+"Spécifier un chemin alternatif par lequel cette information peut "
+"être accessible. Par exemple, saisissez \"a-propos\" lors de "
+"l'écriture d'une page présentant votre site. Utilisez un chemin "
+"relatif et n'ajoutez pas la barre oblique de fin sinon l'alias d'URL "
+"ne fonctionnera pas."
+msgid "Greater than"
+msgstr "Supérieur"
+msgid "Less than"
+msgstr "Inférieur"
+msgid "any"
+msgstr "tous"
+msgid "Choice"
+msgstr "Choix"
+msgid "Log out"
+msgstr "Se déconnecter"
+msgid "Number of day's top views to display"
+msgstr "Nombre de visualisations du top du jour à afficher"
+msgid "Number of all time views to display"
+msgstr "Nombre de visualisations depuis toujours à afficher"
+msgid "Number of most recent views to display"
+msgstr "Nombre de visualisations les plus récentes à afficher"
+msgid "The settings have not been saved because of the errors."
+msgstr "Les paramètres n'ont pas été enregistrés du fait d'erreurs."
+msgid "characters"
+msgstr "caractères"
+msgid "profile"
+msgstr "profils"
+msgid "Su"
+msgstr "Di"
+msgid "Mo"
+msgstr "Lu"
+msgid "Tu"
+msgstr "Ma"
+msgid "We"
+msgstr "Me"
+msgid "Th"
+msgstr "Je"
+msgid "Fr"
+msgstr "Ve"
+msgid "Sa"
+msgstr "Sa"
+msgid "First day of week"
+msgstr "Premier jour de la semaine"
+msgid "Autocomplete taxonomy"
+msgstr "Compléter la taxonomie automatiquement"
+msgid "Left"
+msgstr "Gauche"
+msgid "Right"
+msgstr "Droit"
+msgid "Send yourself a copy."
+msgstr "M'envoyer une copie."
+msgid "Your message has been sent."
+msgstr "Votre message a été envoyé."
+msgid "Create new account"
+msgstr "Créer un nouveau compte"
+msgid "role"
+msgstr "rôle"
+msgid "Are you sure you want to delete the block %name?"
+msgstr "Êtes-vous sûr(e) de vouloir supprimer le bloc %name ?"
+msgid "The block %name has been removed."
+msgstr "Le bloc %name a été supprimé."
+msgid "Info"
+msgstr "Info"
+msgid "People"
+msgstr "Personnes"
+msgid "list terms"
+msgstr "lister les termes"
+msgid "add terms"
+msgstr "ajouter des termes"
+msgid "Created new term %term."
+msgstr "Le nouveau terme '%term' a été créé."
+msgid "Are you sure you want to delete the term %title?"
+msgstr "Êtes-vous sûr(e) de vouloir supprimer le terme '%title' ?"
+msgid "Deleted term %name."
+msgstr "Le terme %name a été supprimé."
+msgid "warning"
+msgstr "avertissement"
+msgid "No statistics available."
+msgstr "Aucune statistique n'est disponible."
+msgid "Last run !time ago"
+msgstr "Dernière exécution il y a !time"
+msgid "Site information"
+msgstr "Informations"
+msgid "Blocked"
+msgstr "Bloqué"
+msgid "Enabled filters"
+msgstr "Filtres activés"
+msgid "critical"
+msgstr "critique"
+msgid "Results"
+msgstr "Résultats"
+msgid "Older polls"
+msgstr "Sondages plus anciens"
+msgid "View the list of polls on this site."
+msgstr "Voir la liste des sondages de ce site."
+msgid "Poll settings"
+msgstr "Paramètrage du sondage"
+msgid "You must fill in at least two choices."
+msgstr "Vous devez proposer au moins deux choix de réponse."
+msgid "open"
+msgstr "ouvert"
+msgid ""
+"This table lists all the recorded votes for this poll. If anonymous "
+"users are allowed to vote, they will be identified by the IP address "
+"of the computer they used when they voted."
+msgstr ""
+"Ce tableau dresse la liste de tous les votes enregistrés pour ce "
+"sondage. Si des utilisateurs anonymes sont autorisés à voter, ils "
+"seront identifiés par l'adresse IP de l'ordinateur qu'ils ont "
+"utilisé lors de leur vote."
+msgid "Visitor"
+msgstr "Visiteur"
+msgid "Cancel your vote"
+msgstr "Annuler votre vote"
+msgid "View the current poll results."
+msgstr "Voir les résultats du sondage en cours."
+msgid ""
+"Deleting a term will delete all its children if there are any. This "
+"action cannot be undone."
+msgstr ""
+"La suppression d'un terme supprimera tous les termes enfants s'il y'en "
+"a. Cette action est irréversible."
+msgid "Parent term"
+msgstr "Terme parent"
+msgid "Parent terms"
+msgstr "Termes parents"
+msgid "Syndicate"
+msgstr "Syndiquer"
+msgid "Blogs"
+msgstr "Blogs"
+msgid "Books"
+msgstr "Livres"
+msgid ""
+"The feed from %site seems to be broken, due to an error \"%error\" on "
+"line %line."
+msgstr ""
+"Le flux en provenance de %site semble corrompu à cause de l'erreur "
+"\"%error\" à la ligne %line."
+msgid ""
+"The feed from %site seems to be broken, because of error \"%error\" on "
+"line %line."
+msgstr ""
+"Le flux en provenance de %site semble corrompu en raison de l'erreur "
+"\"%error\" à la ligne %line."
+msgid "Forums"
+msgstr "Forums"
+msgid "Revisions for %title"
+msgstr "Révisions pour « %title »"
+msgid "!date by !username"
+msgstr "!date par !username"
+msgid "revert"
+msgstr "rétablir"
+msgid "Revision"
+msgstr "Révision"
+msgid "current revision"
+msgstr "version en cours"
+msgid "The specified passwords do not match."
+msgstr "Les mots de passe ne correspondent pas."
+msgid "Session"
+msgstr "Session"
+msgid "Track"
+msgstr "Suivi"
+msgid "No forums defined"
+msgstr "Aucun forum défini"
+msgid "This topic has been moved"
+msgstr "Ce sujet a été déplacé"
+msgid "Permissions"
+msgstr "Droits"
+msgid "Your settings have been saved."
+msgstr "Vos paramètres ont été enregistrés."
+msgid "Cron"
+msgstr "Tâche planifiée (cron)"
+msgid "Installed"
+msgstr "Installé"
+msgid "permission"
+msgstr "permission"
+msgid "Your vote was recorded."
+msgstr "Votre vote a été enregistré."
+msgid ""
+"Allows your site to capture votes on different topics in the form of "
+"multiple choice questions."
+msgstr ""
+"Permet à votre site de collecter des votes sur différents sujets "
+"sous la forme de questions à choix multiples."
+msgid "Link color"
+msgstr "Couleur des liens"
+msgid "Date created"
+msgstr "Date de création"
+msgid "Testing"
+msgstr "Test"
+msgid "Standard"
+msgstr "Standard"
+msgid "Aland Islands"
+msgstr "Îles Aland"
+msgid "Fiji"
+msgstr "Fidji"
+msgid "Falkland Islands"
+msgstr "Îles Malouines"
+msgid "Saint Kitts and Nevis"
+msgstr "Saint-Christophe-et-Niévès"
+msgid "South Korea"
+msgstr "Corée du Sud"
+msgid "Saint Lucia"
+msgstr "Sainte-Lucie"
+msgid "Saint Helena"
+msgstr "Sainte-Hélène"
+msgid "Sao Tome and Principe"
+msgstr "Sao Tomé-et-Principe"
+msgid "French Southern Territories"
+msgstr "Terres australes françaises"
+msgid "Saint Vincent and the Grenadines"
+msgstr "Saint-Vincent-et-les-Grenadines"
+msgid "British Virgin Islands"
+msgstr "Îles Vierges britanniques"
+msgid "U.S. Virgin Islands"
+msgstr "Îles Vierges américaines"
+msgid "Vietnam"
+msgstr "Vietnam"
+msgid "Guernsey"
+msgstr "Guernesey"
+msgid "Jersey"
+msgstr "Jersey"
+msgid "%type settings"
+msgstr "Paramètres de '%type'"
+msgid "Not published"
+msgstr "Non publié"
+msgid "Menu settings"
+msgstr "Paramètres du menu"
+msgid "Color scheme"
+msgstr "Schéma de couleurs"
+msgid "Unformatted"
+msgstr "Non mis en forme"
+msgid "Formats"
+msgstr "Formats"
+msgid "@type: deleted %title."
+msgstr "@type : %title supprimé."
+msgid "Allowed file extensions"
+msgstr "Extensions de fichier autorisées"
+msgid "New comments"
+msgstr "Nouveaux commentaires"
+msgid "Redirect to URL"
+msgstr "Redirection vers une URL"
+msgid "details"
+msgstr "détails"
+msgid "The username %name has not been activated or is blocked."
+msgstr "Le nom d'utilisateur %name n'a pas été activé ou est bloqué."
+msgid "Login attempt failed for %user."
+msgstr "Échec de connexion pour %user."
+msgid "image"
+msgstr "image"
+msgid "<Hidden>"
+msgstr "-Caché-"
+msgid "Revision of %title from %date"
+msgstr "Révision de %title du %date"
+msgid "The username of the user to which you would like to assign ownership."
+msgstr ""
+"Le nom d'utilisateur auquel vous voulez donner la possession du "
+"contenu."
+msgid "Manage the actions defined for your site."
+msgstr "Gérer les actions définies pour votre site."
+msgid "Delete action"
+msgstr "Supprimer l'action"
+msgid "The action has been successfully saved."
+msgstr "L'action a été enregistrée."
+msgid "Deleted action %aid (%action)"
+msgstr "Action %aid (%action) supprimée."
+msgid "Action '%action' added."
+msgstr "Action '%action' ajoutée."
+msgid "Remove orphaned actions"
+msgstr "Retirer les actions orphelines"
+msgid "Themes"
+msgstr "Thèmes"
+msgid "JPEG quality"
+msgstr "Qualité JPEG"
+msgid "%"
+msgstr "%"
+msgid "Delete comments"
+msgstr "Supprimer les commentaires"
+msgid "not published"
+msgstr "non publié"
+msgid "Published comments"
+msgstr "Commentaires publiés"
+msgid "!name field is required."
+msgstr "Le champ !name est requis."
+msgid "Protected"
+msgstr "Protégé"
+msgid "Comment settings"
+msgstr "Paramètres des commentaires"
+msgid "Hits"
+msgstr "Accès"
+msgid "not sticky"
+msgstr "non épinglé"
+msgid "sticky"
+msgstr "épinglé"
+msgid "not promoted"
+msgstr "non promu"
+msgid "promoted"
+msgstr "promu"
+msgid "You are here"
+msgstr "Vous êtes ici"
+msgid "Default options"
+msgstr "Options par défaut"
+msgid "Contact settings"
+msgstr "Paramètres de contact"
+msgid "Reset password"
+msgstr "Réinitialiser le mot de passe"
+msgid "Processing"
+msgstr "En cours de traitement"
+msgid "Finished"
+msgstr "Fin de l'installation"
+msgid "disable"
+msgstr "désactiver"
+msgid "Temporary directory"
+msgstr "Dossier temporaire"
+msgid "date"
+msgstr "date"
+msgid "File upload error. Could not move uploaded file."
+msgstr ""
+"Erreur de transfert de fichier. Impossible de déplacer le fichier "
+"transféré."
+msgid "Shortcuts"
+msgstr "Raccourcis"
+msgid "Shortcut"
+msgstr "Raccourci"
+msgid "Default value"
+msgstr "Valeur par défaut"
+msgid "Timezone"
+msgstr "Fuseau horaire"
+msgid "The specified date is invalid."
+msgstr "La date spécifiée est invalide."
+msgid "Password strength:"
+msgstr "Sécurité du mot de passe :"
+msgid "Passwords match:"
+msgstr "Concordance des mots de passe :"
+msgid "Slogan"
+msgstr "Slogan"
+msgid "The name used to indicate anonymous users."
+msgstr "Le nom utilisé pour nommer les utilisateurs anonymes."
+msgid "Alternate text"
+msgstr "Texte alternatif"
+msgid "Please wait..."
+msgstr "Veuillez patienter..."
+msgid "Assign"
+msgstr "Associer"
+msgid "Not translated"
+msgstr "Non traduit"
+msgid "Go to first page"
+msgstr "Aller à la première page"
+msgid "Go to last page"
+msgstr "Aller à la dernière page"
+msgid "Go to page @number"
+msgstr "Aller à la page @number"
+msgid "Enter the terms you wish to search for."
+msgstr "Indiquer les termes à rechercher"
+msgid "Underlined"
+msgstr "Souligné"
+msgid "Tasks"
+msgstr "Tâches"
+msgid "Delete role"
+msgstr "Supprimer le rôle"
+msgid "Basic configuration"
+msgstr "Configuration de base"
+msgid "List menus"
+msgstr "Lister les menus"
+msgid "Customize menu"
+msgstr "Personnaliser le menu"
+msgid "British Indian Ocean Territory"
+msgstr "Territoire britannique de l'océan Indien"
+msgid "Croatia"
+msgstr "Croatie"
+msgid "Macedonia"
+msgstr "Macédoine"
+msgid "Pitcairn"
+msgstr "Pitcairn"
+msgid "Western Sahara"
+msgstr "Sahara occidental"
+msgid "English name"
+msgstr "Nom anglais"
+msgid "Native name"
+msgstr "Nom natif"
+msgid "Block description"
+msgstr "Description du bloc"
+msgid "Form name"
+msgstr "Nom du formulaire"
+msgid ""
+"The title of the new field. The title will be shown to the user. An "
+"example title is \"Favorite color\"."
+msgstr ""
+"Le titre du nouveau champ. Il sera affiché à l'utilisateur. Exemple "
+"de titre : \"Couleur favorite\"."
+msgid ""
+"An optional explanation to go with the new field. The explanation will "
+"be shown to the user."
+msgstr ""
+"Explication optionnelle concernant le nouveau champ. Cette explication "
+"sera montrée à l'utilisateur."
+msgid "Save field"
+msgstr "Enregistrer le champ"
+msgid "Blocks"
+msgstr "Blocs"
+msgid ""
+"Configure what block content appears in your site's sidebars and other "
+"regions."
+msgstr ""
+"Configurer quels blocs apparaissent dans les barres latérales et "
+"autres régions de votre site."
+msgid "Delete block"
+msgstr "Supprimer le bloc"
+msgid "Save blocks"
+msgstr "Enregistrer les blocs"
+msgid "The block settings have been updated."
+msgstr "Les paramètres du bloc ont été mis à jour."
+msgid "'%name' block"
+msgstr "Bloc « %name »"
+msgid ""
+"Allow individual users to customize the visibility of this block in "
+"their account settings."
+msgstr ""
+"Permettre aux utilisateurs de personnaliser la visibilité de ce bloc "
+"dans les paramètres de leur compte."
+msgid "Show block for specific roles"
+msgstr "Afficher le bloc pour des rôles spécifiques"
+msgid ""
+"Show this block only for the selected role(s). If you select no roles, "
+"the block will be visible to all users."
+msgstr ""
+"Afficher ce bloc seulement pour le(s) rôle(s) sélectionné(s). Si "
+"vous ne sélectionnez aucun rôle, le bloc sera visible par tous les "
+"utilisateurs."
+msgid "Show block on specific pages"
+msgstr "Afficher le bloc sur certaines pages seulement"
+msgid "Save block"
+msgstr "Enregistrer le bloc"
+msgid "The block configuration has been saved."
+msgstr "La configuration du bloc a été enregistrée."
+msgid "The block has been created."
+msgstr "Le bloc a été créé."
+msgid "Block body"
+msgstr "Corps du bloc"
+msgid "The content of the block as shown to the user."
+msgstr "Le contenu du bloc vu par l'utilisateur."
+msgid "Menus"
+msgstr "Menus"
+msgid "Any customizations will be lost. This action cannot be undone."
+msgstr ""
+"Toutes les personnalisations seront perdues. Cette action est "
+"irréversible."
+msgid "Allows administrators to customize the site navigation menu."
+msgstr ""
+"Permet aux administrateurs de personnaliser le menu de navigation du "
+"site."
+msgid "Add vocabulary"
+msgstr "Ajouter un vocabulaire"
+msgid "edit vocabulary"
+msgstr "modifier le vocabulaire"
+msgid "Created new vocabulary %name."
+msgstr "Le vocabulaire '%name' a été créé."
+msgid "Updated vocabulary %name."
+msgstr "Le vocabulaire %name a été mis à jour."
+msgid "Are you sure you want to delete the vocabulary %title?"
+msgstr "Êtes-vous sûr de vouloir supprimer le vocabulaire '%title' ?"
+msgid ""
+"Deleting a vocabulary will delete all the terms in it. This action "
+"cannot be undone."
+msgstr ""
+"La suppression d'un vocabulaire entraînera la suppression de tous les "
+"termes qu'il contient. Cette action est irréversible."
+msgid "Deleted vocabulary %name."
+msgstr "Le vocabulaire « %name » a été supprimé."
+msgid "Above"
+msgstr "Au-dessus"
+msgid "Number of values"
+msgstr "Nombre de valeurs"
+msgid "Default time zone"
+msgstr "Fuseau horaire par défaut"
+msgid "Add another item"
+msgstr "Ajouter un autre élément"
+msgid "Manage fields"
+msgstr "Gérer les champs"
+msgid "Add field"
+msgstr "Ajouter un champ"
+msgid "Trimmed"
+msgstr "Coupé"
+msgid "Used in"
+msgstr "Utilisé dans"
+msgid "Add existing field"
+msgstr "Ajouter un champ existant"
+msgid ""
+"If you have any content left in this field, it will be lost. This "
+"action cannot be undone."
+msgstr ""
+"Si vous avez encore du contenu dans ce champ, il sera perdu. Cette "
+"action est irréversible."
+msgid "Save field settings"
+msgstr "Enregistrer les paramètres du champ"
+msgid "The update has encountered an error."
+msgstr "La mise à jour a échoué."
+msgid "1 item successfully processed:"
+msgid_plural "@count items successfully processed:"
+msgstr[0] "1 élément traité avec succès :"
+msgstr[1] "@count éléments traités avec succès :"
+msgid "Decimal"
+msgstr "Décimal"
+msgid "Float"
+msgstr "Réel (Float)"
+msgid "Minimum"
+msgstr "Minimum"
+msgid "Precision"
+msgstr "Précision"
+msgid ""
+"The total number of digits to store in the database, including those "
+"to the right of the decimal."
+msgstr ""
+"Le nombre total de chiffres à stocker dans la base de données, en "
+"incluant ceux à droite de la virgule."
+msgid "The number of digits to the right of the decimal."
+msgstr "Nombre de chiffres à la droite du marqueur décimal."
+msgid "Decimal marker"
+msgstr "Séparateur de décimales"
+msgid "The character users will input to mark the decimal point in forms."
+msgstr ""
+"Le caractère que les utilisateurs saisiront pour séparer les "
+"décimales dans les formulaires."
+msgid "Defines numeric field types."
+msgstr "Définit des types de champs numériques."
+msgid ""
+"For a 'single on/off checkbox' widget, define the 'off' value first, "
+"then the 'on' value in the <strong>Allowed values</strong> section. "
+"Note that the checkbox will be labeled with the label of the 'on' "
+"value."
+msgstr ""
+"Pour un widget 'case à cocher oui/non', définissez la valeur 'non' "
+"en premier, puis la valeur 'oui', dans la section <strong>Valeurs "
+"autorisées</strong>. Notez que la case à cocher sera étiquetée "
+"avec l'étiquette de la valeur du 'oui'."
+msgid "Check boxes/radio buttons"
+msgstr "Cases à cocher/boutons radio"
+msgid "Single on/off checkbox"
+msgstr "Case à cocher on/off unique"
+msgid ""
+"Defines selection, check box and radio button widgets for text and "
+"numeric fields."
+msgstr ""
+"Définit des widgets de liste déroulante, case à cocher et bouton "
+"radio pour des champs texte et numériques."
+msgid "Text area (multiple rows)"
+msgstr "Zone de texte (plusieurs lignes)"
+msgid "Defines simple text field types."
+msgstr "Définit les types de champs en texte simple."
+msgid "Index"
+msgstr "Index"
+msgid "Enable clean URLs"
+msgstr "Activer les URL simplifiées"
+msgid "Permalink"
+msgstr "Permalien"
+msgid "Theme-engine-specific settings"
+msgstr "Paramètres spécifiques du thème dédié aux moteurs de recherche"
+msgid "Debug"
+msgstr "Debug"
+msgid "Exception"
+msgstr "Exception"
+msgid "Permission"
+msgstr "Droit"
+msgid "@module module"
+msgstr "module @module"
+msgid "Incompatible with this version of PHP"
+msgstr "Incompatible avec cette version de PHP"
+msgid ""
+"This module requires PHP version @php_required and is incompatible "
+"with PHP version !php_version."
+msgstr ""
+"Ce module requière la version @php_required de PHP et est "
+"incompatible avec la version !php_version."
+msgid "More information"
+msgstr "Plus d'information"
+msgid "!title !required"
+msgstr "!title !required"
+msgid "My blog"
+msgstr "Mon blog"
+msgid "Hide"
+msgstr "Masquer"
+msgid "Anonymous commenting"
+msgstr "Commentaires anonymes"
+msgid "Anonymous posters may not enter their contact information"
+msgstr "Les utilisateurs anonymes ne peuvent pas saisir leur coordonnées"
+msgid "Anonymous posters may leave their contact information"
+msgstr "Les utilisateurs anonymes peuvent laisser leurs coordonnées"
+msgid "Anonymous posters must leave their contact information"
+msgstr "Les utilisateurs anonymes doivent laisser leur coordonnées"
+msgid ""
+"The content of this field is kept private and will not be shown "
+"publicly."
+msgstr ""
+"Le contenu de ce champ sera maintenu privé et ne sera pas affiché "
+"publiquement."
+msgid "Your signature will be publicly displayed at the end of your comments."
+msgstr ""
+"Votre signature sera affichée publiquement à la fin de vos "
+"commentaires."
+msgid "Date - newest first"
+msgstr "Par date - du plus récent au plus ancien"
+msgid "Date - oldest first"
+msgstr "Par date - du plus ancien au plus récent"
+msgid "1 comment"
+msgid_plural "@count comments"
+msgstr[0] "@count commentaire"
+msgstr[1] "@count commentaires"
+msgid "1 new comment"
+msgid_plural "@count new comments"
+msgstr[0] "@count nouveau commentaire"
+msgstr[1] "@count nouveaux commentaires"
+msgid "Save content type"
+msgstr "Enregistrer le type de contenu"
+msgid "Show descriptions"
+msgstr "Afficher les descriptions"
+msgid "Subtitle"
+msgstr "Sous-titre"
+msgid "Language code"
+msgstr "Code de la langue"
+msgid "Save role"
+msgstr "Enregistrer le rôle"
+msgid "debug"
+msgstr "débogage"
+msgid "file system"
+msgstr "système de fichiers"
+msgid "Menu link title"
+msgstr "Titre du lien dans le menu"
+msgid ""
+"The menu system stores system paths only, but will use the URL alias "
+"for display. %link_path has been stored as %normal_path"
+msgstr ""
+"Le système de menu enregistre uniquement les chemins systèmes, mais "
+"utilisera les alias d'URLs au moment de l'affichage. %link_path a "
+"été enregistré comme %normal_path"
+msgid ""
+"The path '@link_path' is either invalid or you do not have access to "
+"it."
+msgstr ""
+"Le chemin '@link_path' est invalide ou vous n'êtes pas autorisé à y "
+"accéder."
+msgid "There was an error saving the menu link."
+msgstr ""
+"Une erreur s'est produite lors de l'enregistrement de l'élement de "
+"menu."
+msgid "Menu name"
+msgstr "Nom du menu"
+msgid "Are you sure you want to delete the custom menu %title?"
+msgstr ""
+"Êtes-vous certain de vouloir supprimer le menu personnalisé "
+"%title ?"
+msgid "Number of users to display"
+msgstr "Nombre d'utilisateurs à afficher"
+msgid "RSS - !title"
+msgstr "RSS - !title"
+msgid "..."
+msgstr "..."
+msgid "RDF"
+msgstr "RDF"
+msgid "Profiles"
+msgstr "Profils"
+msgid "Edit container"
+msgstr "Modifier le conteneur"
+msgid "Last visit"
+msgstr "Dernière visite"
+msgid "Hot topic threshold"
+msgstr "Seuil de sujet brûlant"
+msgid "Topics per page"
+msgstr "Sujets par page"
+msgid "Posts - most active first"
+msgstr "Contributions - les plus actives d'abord"
+msgid "Posts - least active first"
+msgstr "Contributions - les moins actives d'abord"
+msgid "URL path settings"
+msgstr "Paramètres des chemins d'URL"
+msgid "@user's picture"
+msgstr "Portrait de @user"
+msgid "Are you sure you want to revert to the revision from %revision-date?"
+msgstr "Êtes-vous sûr(e) de vouloir rétablir la version du %revision-date?"
+msgid "Are you sure you want to delete the revision from %revision-date?"
+msgstr ""
+"Êtes vous sûr(e) de vouloir supprimer la version du "
+"%revision-date ?"
+msgid "Maximum upload size"
+msgstr "Taille maximale de transfert"
+msgid "KB"
+msgstr "Ko"
+msgid "Space"
+msgstr "Espace"
+msgid "New forum topics"
+msgstr "Nouveaux sujets"
+msgid "@type: deleted %title revision %revision."
+msgstr "@type : \"%title\" - révision \"%revision\" supprimée."
+msgid "Page not found"
+msgstr "Page non trouvée"
+msgid "Language neutral"
+msgstr "Indépendant de la langue"
+msgid "More help"
+msgstr "Plus d'aide"
+msgid "Preview trimmed version"
+msgstr "Aperçu de la version abrégée"
+msgid "Preview full version"
+msgstr "Aperçu de la version complète"
+msgid "Account blocked"
+msgstr "Compte bloqué"
+msgid "Expand"
+msgstr "Déplier"
+msgid "The name %name is already taken."
+msgstr "Le nom %name est déjà pris."
+msgid "info"
+msgstr "info"
+msgid "OpenID redirect"
+msgstr "Redirection OpenID"
+msgid "OpenID Login"
+msgstr "Connexion OpenID"
+msgid "Delete OpenID"
+msgstr "Supprimer l'OpenID"
+msgid "Log in using OpenID"
+msgstr "Se connecter avec OpenID"
+msgid "Cancel OpenID login"
+msgstr "Annuler la connexion OpenID"
+msgid "What is OpenID?"
+msgstr "Qu'est-ce qu'OpenID ?"
+msgid "OpenID login failed."
+msgstr "La connexion OpenID a échoué."
+msgid "OpenID login cancelled."
+msgstr "la connexion OpenID a été annulée."
+msgid "Successfully added %identity"
+msgstr "%identity ajoutée avec succès"
+msgid "OpenID"
+msgstr "OpenID"
+msgid "Add an OpenID"
+msgstr "Ajouter un OpenID"
+msgid "That OpenID is already in use on this site."
+msgstr "Cet OpenID est déjà en utilisation sur ce site."
+msgid "Are you sure you want to delete the OpenID %authname for %user?"
+msgstr ""
+"Êtes-vous sûr(e) de vouloir supprimer l'identifiant OpenID %authname "
+"pour l'utilisateur %user ?"
+msgid "OpenID deleted."
+msgstr "OpenID supprimé."
+msgid "edit menu"
+msgstr "modifier le menu"
+msgid "« first"
+msgstr "« premier"
+msgid "last »"
+msgstr "dernier »"
+msgid "Overlay"
+msgstr "Premier plan (overlay)"
+msgid "Resize"
+msgstr "Redimensionner"
+msgid "Loading"
+msgstr "En cours de chargement"
+msgid "The directory %directory does not exist."
+msgstr "Le répertoire %directory n'existe pas."
+msgid "Defines a file field type."
+msgstr "Définit un type de champ fichier."
+msgid "Show only items where"
+msgstr "Montrer seulement les éléments pour lesquels"
+msgid "No comments available."
+msgstr "Aucun commentaire disponible."
+msgid "ok"
+msgstr "ok"
+msgid "Rebuild permissions"
+msgstr "Reconstruire les droits d'accès"
+msgid "@type: updated %title."
+msgstr "@type : %title mis à jour."
+msgid "@type: added %title."
+msgstr "@type : %title ajouté."
+msgid "Error saving user account."
+msgstr "Erreur à la sauvegarde du compte utilisateur."
+msgid "Action %action has been unassigned."
+msgstr "L'action %action a été retirée."
+msgid "Add role"
+msgstr "Ajouter un rôle"
+msgid "You must specify a valid role name."
+msgstr "Vous devez saisir un nom de rôle valide."
+msgid "The role has been added."
+msgstr "Le rôle a été ajouté."
+msgid "Path to custom logo"
+msgstr "Chemin vers le logo personnalisé"
+msgid "taxonomy"
+msgstr "taxonomie"
+msgid "Updated term %term."
+msgstr "Le terme '%term' a été mis à jour."
+msgid "- Please choose -"
+msgstr "- Choisissez -"
+msgid "- None selected -"
+msgstr "- Aucun -"
+msgid "Parser"
+msgstr "Analyseur syntaxique"
+msgid "Discard items older than"
+msgstr "Supprimer les éléments plus vieux que"
+msgid "@site_name - aggregated feeds in category @title"
+msgstr "@site_name - flux agrégés dans la catégorie @title"
+msgid "@site_name - aggregated feeds"
+msgstr "@site_name - flux agrégés"
+msgid "@site_name aggregator"
+msgstr "@site_name - agrégateur"
+msgid "!title feed"
+msgstr "flux !title"
+msgid "Aggregator"
+msgstr "Agrégateur"
+msgid "The feed from %site seems to be broken, because of error \"%error\"."
+msgstr ""
+"Le flux en provenance de %site semble corrompu en raison de l'erreur "
+"\"%error\"."
+msgid "There is no new syndicated content from %site."
+msgstr "Il n'y a pas de nouveau contenu syndiqué sur %site."
+msgid "There is new syndicated content from %site."
+msgstr "Il y a du contenu récemment syndiqué sur %site."
+msgid "The feed from %site seems to be broken, due to \"%error\"."
+msgstr ""
+"Le flux en provenance de %site semble corrompu à cause de l'erreur "
+"\"%error\"."
+msgid "Feed aggregator"
+msgstr "Agrégateur de flux"
+msgid "Aggregates syndicated content (RSS, RDF, and Atom feeds)."
+msgstr "Agrège du contenu syndiqué (flux RSS, RDF et Atom)."
+msgid "Alias"
+msgstr "Alias"
+msgid "Account settings"
+msgstr "Paramètres de compte"
+msgid "The content type %name has been deleted."
+msgstr "Le type de contenu %name a été supprimé."
+msgid "Deleted content type %name."
+msgstr "Type de contenu %name supprimé."
+msgid "Enter your keywords"
+msgstr "Saisissez vos mots-clés"
+msgid "Clean URLs"
+msgstr "URL simplifiées"
+msgid "My account"
+msgstr "Mon compte"
+msgid "Number of topics"
+msgstr "Nombre de sujets"
+msgid "Active forum topics"
+msgstr "Sujets actifs"
+msgid "Read the latest forum topics."
+msgstr "Lire les derniers sujets."
+msgid "HTTP authentication"
+msgstr "Authentification HTTP"
+msgid "User activity"
+msgstr "Activité de l'utilisateur"
+msgid ""
+"The category the new field should be part of. Categories are used to "
+"group fields logically. An example category is \"Personal "
+"information\"."
+msgstr ""
+"La catégorie à laquelle le nouveau champ doit appartenir. Les "
+"catégories sont utilisées pour regrouper les champs de façon "
+"logique. Une catégorie d'exemple serait \"Informations "
+"personnelles\"."
+msgid "The user must enter a value."
+msgstr "L'utilisateur doit entrer une valeur."
+msgid "Visible in user registration form."
+msgstr "Visible dans le formulaire d'inscription."
+msgid "New feed items are automatically filed in the checked categories."
+msgstr ""
+"Les nouveaux éléments de flux sont automatiquement classés dans les "
+"catégories sélectionnées."
+msgid ""
+"A user is considered online for this long after they have last viewed "
+"a page."
+msgstr ""
+"Durée pendant laquelle on considère qu'un utilisateur est en ligne "
+"après qu'il ait vu une page pour la dernière fois."
+msgid "Maximum number of currently online users to display."
+msgstr "Nombre maximal d'utilisateurs en ligne à afficher."
+msgid "ajax"
+msgstr "ajax"
+msgid "Context"
+msgstr "Contexte"
+msgid "Book navigation"
+msgstr "Navigation du livre"
+msgid "Taxonomy vocabulary"
+msgstr "Vocabulaire de taxonomie"
+msgid "1 year"
+msgid_plural "@count years"
+msgstr[0] "@count année"
+msgstr[1] "@count années"
+msgid "1 week"
+msgid_plural "@count weeks"
+msgstr[0] "@count semaine"
+msgstr[1] "@count semaines"
+msgid "1 min"
+msgid_plural "@count min"
+msgstr[0] "@count min"
+msgstr[1] "@count min"
+msgid "1 sec"
+msgid_plural "@count sec"
+msgstr[0] "@count sec"
+msgstr[1] "@count sec"
+msgid "-n/a-"
+msgstr "-n/a-"
+msgid "Found the @submit button"
+msgstr "Le bouton @submit a été trouvé"
+msgid "Failed to set field @name to @value"
+msgstr "Impossible de définir la valeur @value dans le champ @name"
+msgid "No temporary directories to remove."
+msgstr "Aucun répertoire temporaire à supprimer."
+msgid ""
+"Run tests against Drupal core and your active modules. These tests "
+"help assure that your site code is working as designed."
+msgstr ""
+"Exécutez les tests sur le cœur de Drupal et sur vos modules actifs. "
+"Ces tests permettent de s'assurer que le code de votre site fonctionne "
+"comme prévu."
+msgid "Palestinian Territory"
+msgstr "Territoire palestinien"
+msgid "Vatican"
+msgstr "Vatican"
+msgid "Bulgarian"
+msgstr "Bulgare"
+msgid "Croatian"
+msgstr "Croate"
+msgid "Czech"
+msgstr "Tchèque"
+msgid "Danish"
+msgstr "Danois"
+msgid "Dutch"
+msgstr "Néerlandais"
+msgid "Finnish"
+msgstr "Finlandais"
+msgid "German"
+msgstr "Allemand"
+msgid "Greek"
+msgstr "Grec"
+msgid "Hebrew"
+msgstr "Hébreux"
+msgid "Hungarian"
+msgstr "Hongrois"
+msgid "Indonesian"
+msgstr "Indonésien"
+msgid "Polish"
+msgstr "Polonais"
+msgid "Romanian"
+msgstr "Roumain"
+msgid "Russian"
+msgstr "Russe"
+msgid "Slovak"
+msgstr "Slovaque"
+msgid "Swedish"
+msgstr "Suédois"
+msgid "Turkish"
+msgstr "Turque"
+msgid "Featured"
+msgstr "Recommandés"
+msgid "Send message"
+msgstr "Envoyer le message"
+msgid "Machine name"
+msgstr "Nom système"
+msgid "Allow Upscaling"
+msgstr "Autoriser l'Agrandissement"
+msgid "Let scale make images larger than their original size"
+msgstr ""
+"Autoriser l'outil d'échelle à rendre les images plus grands que leur "
+"taille originale"
+msgid "Rotation angle"
+msgstr "Angle de rotation"
+msgid ""
+"The number of degrees the image should be rotated. Positive numbers "
+"are clockwise, negative are counter-clockwise."
+msgstr ""
+"Le nombre de degrés duquel l'image doit être pivotée. Les nombres "
+"positifs sont dans le sens des aiguilles d'une montre, les nombres "
+"négatifs dans le sens inverse des aiguilles d'une montre."
+msgid ""
+"Randomize the rotation angle for each image. The angle specified above "
+"is used as a maximum."
+msgstr ""
+"Générer au hasard l'angle de rotation pour chaque image. L'angle "
+"spécifié ci-dessus est utilisé comme maximum."
+msgid "Print"
+msgstr "Imprimer"
+msgid "The file could not be created."
+msgstr "Le fichier n'a pas pu être créé."
+msgid "Locked"
+msgstr "Verrouillé"
+msgid "Password reset instructions mailed to %name at %email."
+msgstr ""
+"Les instructions de réinitialisation de mot de passe ont été "
+"envoyées à %name, à l'adresse %email."
+msgid "The e-mail address %mail is not valid."
+msgstr "L'adresse électronique %mail n'est pas valide."
+msgid "Account"
+msgstr "Compte"
+msgid "authenticated user"
+msgstr "utilisateur authentifié"
+msgid "Any"
+msgstr "Tout"
+msgid "E-mail addresses to notify when updates are available"
+msgstr ""
+"Adresses de courriels à notifier lorsque des mises à jour sont "
+"disponibles"
+msgid ""
+"Whenever your site checks for available updates and finds new "
+"releases, it can notify a list of users via e-mail. Put each address "
+"on a separate line. If blank, no e-mails will be sent."
+msgstr ""
+"Chaque fois que votre site vérifie la disponibilité de mises à jour "
+"et trouve de nouvelles versions, il peut notifier une liste "
+"d'utilisateurs par courriel. Écrivez une adresse par ligne. Si le "
+"champ reste vide, aucun courriel ne sera envoyé."
+msgid "Check for updates"
+msgstr "Vérifier les mises à jour"
+msgid "All newer versions"
+msgstr "Toutes les nouvelles versions"
+msgid "Only security updates"
+msgstr "Les mises à jour de sécurité uniquement"
+msgid "%email is not a valid e-mail address."
+msgstr "%email n'est pas une adresse de courriel valide."
+msgid "%emails are not valid e-mail addresses."
+msgstr "%emails ne sont pas des adresses de courriels valides."
+msgid "No update data available"
+msgstr "Pas de données sur les mises à jour disponibles"
+msgid "Not secure!"
+msgstr "Non sécurisé !"
+msgid "Revoked!"
+msgstr "Révoquée !"
+msgid "Unsupported release"
+msgstr "Version non supportée"
+msgid "Can not determine status"
+msgstr "Impossible de déterminer le status"
+msgid "(version @version available)"
+msgstr "(version @version disponible)"
+msgid "See the available updates page for more information:"
+msgstr "Voir la page des mises à jour disponibles pour plus d'informations :"
+msgid "New release(s) available for !site_name"
+msgstr "Nouvelle(s) version(s) disponible(s) pour !site_name"
+msgid ""
+"There is a security update available for your version of Drupal. To "
+"ensure the security of your server, you should update immediately!"
+msgstr ""
+"Une mise à jour de sécurité est disponible pour votre version de "
+"Drupal. Afin de garantir la sécurité de votre serveur, effectuez "
+"immédiatement la mise à jour !"
+msgid ""
+"Your version of Drupal has been revoked and is no longer available for "
+"download. Upgrading is strongly recommended!"
+msgstr ""
+"La version de Drupal installée a été révoquée et n'est plus "
+"disponible au téléchargement. Il est fortement recommandé de la "
+"mettre à jour !"
+msgid ""
+"The installed version of at least one of your modules or themes has "
+"been revoked and is no longer available for download. Upgrading or "
+"disabling is strongly recommended!"
+msgstr ""
+"La version installée d'au moins un de vos modules ou thèmes a été "
+"révoquée et n'est plus disponible au téléchargement. Il est "
+"fortement recommandé de les mettre à jour ou de les désactiver !"
+msgid ""
+"Your version of Drupal is no longer supported. Upgrading is strongly "
+"recommended!"
+msgstr ""
+"Votre version de Drupal n'est plus supportée. Il est fortement "
+"recommandé de la mettre à jour !"
+msgid ""
+"There are updates available for your version of Drupal. To ensure the "
+"proper functioning of your site, you should update as soon as "
+"possible."
+msgstr ""
+"Des mises à jour sont disponibles pour votre version de Drupal. Pour "
+"assurer le bon fonctionnement de votre site, vous devriez procédez à "
+"la mise à jour dès que possible."
+msgid ""
+"See the <a href=\"@available_updates\">available updates</a> page for "
+"more information."
+msgstr ""
+"Voir la page des <a href=\"@available_updates\">mises à jour "
+"disponibles</a> pour plus d'informations."
+msgid "Project not secure"
+msgstr "Projet non sécurisé"
+msgid ""
+"This project has been labeled insecure by the Drupal security team, "
+"and is no longer available for download. Immediately disabling "
+"everything included by this project is strongly recommended!"
+msgstr ""
+"Ce projet a été marqué comme posant un risque de sécurité par "
+"l'équipe de sécurité de Drupal, et n'est plus disponible au "
+"téléchargement. Il est fortement recommandé de désactiver "
+"immédiatement l'ensemble des modules et thèmes de ce projet !"
+msgid "Project revoked"
+msgstr "Projet rejeté"
+msgid ""
+"This project has been revoked, and is no longer available for "
+"download. Disabling everything included by this project is strongly "
+"recommended!"
+msgstr ""
+"Ce projet a été révoqué, et n'est plus disponible au "
+"téléchargement. Il est fortement recommandé de désactiver "
+"immédiatement l'ensemble des modules et thèmes de ce projet !"
+msgid "Project not supported"
+msgstr "Projet non supporté"
+msgid ""
+"This project is no longer supported, and is no longer available for "
+"download. Disabling everything included by this project is strongly "
+"recommended!"
+msgstr ""
+"Ce projet n'est plus supporté, et n'est plus disponible au "
+"téléchargement. Il est fortement recommandé de désactiver "
+"immédiatement l'ensemble des modules et thèmes de ce projet !"
+msgid "No available releases found"
+msgstr "Aucune version disponible"
+msgid "Release revoked"
+msgstr "Version révoquée"
+msgid ""
+"Your currently installed release has been revoked, and is no longer "
+"available for download. Disabling everything included in this release "
+"or upgrading is strongly recommended!"
+msgstr ""
+"La version installée a été révoquée, et n'est plus disponible au "
+"téléchargement. Il est fortement recommandé de désactiver "
+"immédiatement l'ensemble des modules et thèmes de cette version !"
+msgid "Release not supported"
+msgstr "Version non supportée"
+msgid ""
+"Your currently installed release is now unsupported, and is no longer "
+"available for download. Disabling everything included in this release "
+"or upgrading is strongly recommended!"
+msgstr ""
+"Cette version n'est plus supportée, et n'est plus disponible au "
+"téléchargement. Il est fortement recommandé de désactiver "
+"immédiatement l'ensemble des modules et thèmes de cette version !"
+msgid "Invalid info"
+msgstr "Information invalide"
+msgid "Security update required!"
+msgstr "Mise à jour de sécurité nécessaire !"
+msgid "Not supported!"
+msgstr "Non supportée !"
+msgid "Recommended version:"
+msgstr "Version recommandée :"
+msgid "Security update:"
+msgstr "Mise à jour de sécurité :"
+msgid "Latest version:"
+msgstr "Dernière version :"
+msgid "Development version:"
+msgstr "Version de développement :"
+msgid "Also available:"
+msgstr "Également disponible :"
+msgid "Node count"
+msgstr "Comptage des nœuds"
+msgid "Field settings"
+msgstr "Paramètres du champ"
+msgid "Skip to main content"
+msgstr "Aller au contenu principal"
+msgid "@title"
+msgstr "@title"
+msgid "Edit forum"
+msgstr "Modifier le forum"
+msgid "Default order"
+msgstr "Ordre par défaut"
+msgid ""
+"This is the designated forum vocabulary. Some of the normal vocabulary "
+"options have been removed."
+msgstr ""
+"Ce vocabulaire gère l'arborescence des forums. Certaines des options "
+"habituelles des vocabulaires ont été supprimées."
+msgid "Leave shadow copy"
+msgstr "Laisser une trace"
+msgid ""
+"If you move this topic, you can leave a link in the old forum to the "
+"new forum."
+msgstr ""
+"Si vous déplacez ce sujet, vous pouvez laisser un lien dans l'ancien "
+"forum pointant vers le nouveau."
+msgid "Container name"
+msgstr "Nom du conteneur"
+msgid "forum container"
+msgstr "conteneur de forum"
+msgid "Created new @type %term."
+msgstr "Le @type %term a été créé."
+msgid "The @type %term has been updated."
+msgstr "Le @type %term a été mis à jour."
+msgid "Add new field"
+msgstr "Ajouter un nouveau champ"
+msgid "Containing any of the words"
+msgstr "Contenant n'importe lequel des mots"
+msgid "Containing the phrase"
+msgstr "Contenant l'expression"
+msgid "Containing none of the words"
+msgstr "Ne contenant aucun des mots"
+msgid "Only of the type(s)"
+msgstr "Seulement du ou des types"
+msgid "Content ranking"
+msgstr "Classement du contenu"
+msgid ""
+"The following numbers control which properties the content search "
+"should favor when ordering the results. Higher numbers mean more "
+"influence, zero means the property is ignored. Changing these numbers "
+"does not require the search index to be rebuilt. Changes take effect "
+"immediately."
+msgstr ""
+"Les paramètres suivants permettent de favoriser certaines "
+"propriétés plutôt que d'autres lors du tri des résultats de "
+"recherche. Un nombre plus élevé signifie que la propriété aura "
+"plus d'influence, zero signifie que la propriété sera ignorée. "
+"Changer ces paramètres n'oblige pas à recréer l'index : les "
+"changements prennent effet immédiatement."
+msgid "Keyword relevance"
+msgstr "Pertinence des mots clés"
+msgid "Recently posted"
+msgstr "Posté récemment"
+msgid "Number of comments"
+msgstr "Nombre de commentaires"
+msgid "Number of views"
+msgstr "Nombre de lectures"
+msgid "Factor"
+msgstr "Facteur"
+msgid "Expand layout to include descriptions."
+msgstr "Produit une mise en page moins compacte qui inclut des descriptions."
+msgid "Hide descriptions"
+msgstr "Masquer les descriptions"
+msgid "Compress layout by hiding descriptions."
+msgstr "Produit une mise en page plus compacte en cachant les descriptions."
+msgid "Or"
+msgstr "Ou"
+msgid "Color set"
+msgstr "Jeu de couleurs"
+msgid "Content ID"
+msgstr "Identifiant (ID) du contenu"
+msgid "About"
+msgstr "À propos"
+msgid "Database host"
+msgstr "Serveur de base de données"
+msgid "Maximum link text length"
+msgstr "Longueur maximale des textes des liens"
+msgid ""
+"URLs longer than this number of characters will be truncated to "
+"prevent long strings that break formatting. The link itself will be "
+"retained; just the text portion of the link will be truncated."
+msgstr ""
+"Les URLs comportant plus de caractères que le nombre ci-dessus seront "
+"tronqués pour éviter les chaînes de caractères trop longues, qui "
+"briseraient la mise en page. Le lien en tant que tel sera conservé ; "
+"seule la partie textuelle du lien sera tronquée."
+msgid "Reports"
+msgstr "Rapports"
+msgid "Default picture"
+msgstr "Portrait par défaut"
+msgid ""
+"URL of picture to display for users with no custom picture selected. "
+"Leave blank for none."
+msgstr ""
+"URL du portrait à afficher pour les utilisateurs n'ayant aucun "
+"portrait personnalisé sélectionné. Laisser vide pour aucun."
+msgid ""
+"If the amount of boxes above isn't enough, click here to add more "
+"choices."
+msgstr ""
+"Si la quantité de cases ci-dessus est insuffisante, cliquer ici pour "
+"ajouter plus d'options."
+msgid "Toggle display"
+msgstr "Activer/désactiver l'affichage"
+msgid ""
+"If you don't have direct file access to the server, use this field to "
+"upload your logo."
+msgstr ""
+"Si vous n'avez pas un accès direct aux fichiers sur le serveur, "
+"utilisez ce champs pour téléverser votre logo."
+msgid "Configuration file"
+msgstr "Fichier de configuration"
+msgid "Install profile"
+msgstr "Profil d'installation"
+msgid "%percentage of the site has been indexed."
+msgstr "%percentage du site a été indexé."
+msgid "File directory"
+msgstr "Répertoire du fichier"
+msgid "Default theme"
+msgstr "Thème par défaut"
+msgid "Web server"
+msgstr "Serveur web"
+msgid "There is 1 item left to index."
+msgid_plural "There are @count items left to index."
+msgstr[0] "Il reste @count élément à indexer."
+msgstr[1] "Il reste @count éléments à indexer."
+msgid "The content access permissions have been rebuilt."
+msgstr "Les permissions d'accès au contenu ont été reconstruites."
+msgid "sort by @s"
+msgstr "trier par @s"
+msgid ""
+"Sorry, unrecognized username or password. <a href=\"@password\">Have "
+"you forgotten your password?</a>"
+msgstr ""
+"Désolé, nom d'utilisateur ou mot de passe non reconnu. <a "
+"href=\"@password\">Avez-vous oublié votre mot de passe ?</a>"
+msgid "Publish content"
+msgstr "Publier un contenu"
+msgid ""
+"Stack overflow: too many calls to actions_do(). Aborting to prevent "
+"infinite recursion."
+msgstr ""
+"Dépassement de pile (Stack overflow) : trop d'appels à "
+"actions_do(). Traitement abandonné pour éviter une récursion "
+"infinie."
+msgid "Action %action saved."
+msgstr "Action %action sauvegardée"
+msgid ""
+"You may proceed to the <a href=\"@url\">Triggers</a> page to assign "
+"these actions to system events."
+msgstr ""
+"Vous devez aller sur la page <a href=\"@url\">Déclencheurs</a> pour "
+"assigner ces actions aux évènements système."
+msgid "Manage actions"
+msgstr "Gérer les actions"
+msgid "Configure an advanced action"
+msgstr "Configurer une action avancée"
+msgid "Delete an action."
+msgstr "Supprimer une action."
+msgid "Remove orphans"
+msgstr "Supprimer les actions orphelines"
+msgid "Triggers"
+msgstr "Déclencheurs"
+msgid "Unassign an action from a trigger."
+msgstr "Supprime l'association entre un déclencheur et une action."
+msgid "Choose an advanced action"
+msgstr "Choisissez une action avancée"
+msgid "Action type"
+msgstr "Type d'action"
+msgid "Are you sure you want to delete the action %action?"
+msgstr "Êtes-vous sûr de vouloir supprimer l'action '%action' ?"
+msgid "Action %action was deleted"
+msgstr "L'action '%action' a été supprimée"
+msgid "Deleted orphaned action (%action)."
+msgstr "Les actions orphelines ont été supprimées (%action)."
+msgid "Are you sure you want to unassign the action %title?"
+msgstr "Confirmez-vous vouloir supprimer l'association de l'action %title ?"
+msgid "You can assign it again later if you wish."
+msgstr "Vous pourrez l'associer plus tard si vous le souhaitez."
+msgid "unassign"
+msgstr "supprimer l'association"
+msgid "Choose an action"
+msgstr "Choisir une action"
+msgid "The action you chose is already assigned to that trigger."
+msgstr ""
+"L'action que vous avez choisie est déjà associée à ce "
+"déclencheur."
+msgid "When cron runs"
+msgstr "Lors de l'exécution de la tâche planifiée (cron)"
+msgid ""
+"The URL to which the user should be redirected. This can be an "
+"internal URL like node/1234 or an external URL like http://drupal.org."
+msgstr ""
+"URL vers laquelle l'utilisateur sera redirigé. Cette URL peut être "
+"interne (exemple : node/1234) ou externe comme "
+"http://www.drupalfr.org."
+msgid "When content is viewed by an authenticated user"
+msgstr "Lorsque la contribution est consultée par un utilisateur authentifié"
+msgid "Display a message to the user"
+msgstr "Afficher un message à l'utilisateur"
+msgid "Unpublish comment"
+msgstr "Dépublier le commentaire"
+msgid "Unpublish comment containing keyword(s)"
+msgstr "Retirer les commentaires contenant ce(s) mot(s) clé(s)"
+msgid "Block current user"
+msgstr "Bloquer cet utilisateur"
+msgid "Ban IP address of current user"
+msgstr "Bannir l'adresse IP de l'utilisateur courant"
+msgid "Set @type %title to published."
+msgstr "@type : %title publié."
+msgid "Set @type %title to unpublished."
+msgstr "@type : %title retiré de la publication."
+msgid "Set @type %title to sticky."
+msgstr "@type : %title mis en lumière."
+msgid "Set @type %title to unsticky."
+msgstr "@type : %title retirer de la mise en lumière."
+msgid "Promoted @type %title to front page."
+msgstr "@type : %title promu en page d'accueil."
+msgid "Removed @type %title from front page."
+msgstr "@type : %title retiré de la page d'accueil."
+msgid "Saved @type %title"
+msgstr "@type : %title enregistré"
+msgid "Changed owner of @type %title to uid %name."
+msgstr "@type : %title assigné à l'utilisateur %name."
+msgid "After saving a new comment"
+msgstr "Après l'enregistrement d'un nouveau commentaire"
+msgid "After saving an updated comment"
+msgstr "Après l'enregistrement d'un commentaire mis à jour"
+msgid "After deleting a comment"
+msgstr "Après la suppression d'un commentaire"
+msgid "When a comment is being viewed by an authenticated user"
+msgstr "Lorsqu'un commentaire est consulté par un utilisateur identifié"
+msgid "Unpublished comment %subject."
+msgstr "Commentaire %subject dépublié"
+msgid "After a user has been deleted"
+msgstr "Après la suppression d'un utilisateur"
+msgid "After a user has logged in"
+msgstr "Après la connexion d'un utilisateur"
+msgid "After a user has logged out"
+msgstr "Après la déconnexion d'un utilisateur"
+msgid "When a user's profile is being viewed"
+msgstr "Quand un profile utilisateur est consulté"
+msgid "Blocked user %name."
+msgstr "Utilisateur %name bloqué."
+msgid "Banned IP address %ip"
+msgstr "Adresse IP %ip bannie"
+msgid "After saving a new term to the database"
+msgstr "Après l'enregistrement d'un nouveau terme dans la base de données"
+msgid "After saving an updated term to the database"
+msgstr "Après avoir modifié un terme."
+msgid "After deleting a term"
+msgstr "Après avoir effacé un terme."
+msgid ""
+"Enables actions to be fired on certain system events, such as when new "
+"content is created."
+msgstr ""
+"Permet à des actions d'être lancées suite à certains événements "
+"systèmes, par exemple quand un nouveau contenu est créé."
+msgid "1 read"
+msgid_plural "@count reads"
+msgstr[0] "@count lecture"
+msgstr[1] "@count lectures"
+msgid "- Select -"
+msgstr "- Sélectionner -"
+msgid "Enables the categorization of content."
+msgstr "Permet la classification du contenu."
+msgid "Path prefix"
+msgstr "Prefixe de chemin"
+msgid "Delete contact"
+msgstr "Supprimer le contact"
+msgid "Auto-reply"
+msgstr "Réponse automatique"
+msgid ""
+"Optional auto-reply. Leave empty if you do not want to send the user "
+"an auto-reply message."
+msgstr ""
+"Réponse automatique optionnelle. Laissez vide si vous ne souhaitez "
+"pas envoyer un message de réponse automatique à l'expéditeur."
+msgid "%recipient is an invalid e-mail address."
+msgstr "%recipient n'est pas une adresse de courriel valide."
+msgid "Lithuanian"
+msgstr "Lithuanien"
+msgid "Up to date translation"
+msgstr "Traduction à jour"
+msgid "Outdated translation"
+msgstr "Traduction non à jour"
+msgid "Some required modules must be enabled"
+msgstr "Certains modules requis doivent être activés"
+msgid "New posts"
+msgstr "Nouvelles contributions"
+msgid "mm/dd/yy"
+msgstr "dd/mm/yy"
+msgid "Translate"
+msgstr "Traduire"
+msgid "File to import not found."
+msgstr "Le fichier à importer n'a pas été trouvé."
+msgid ""
+"The translation import failed, because the file %filename could not be "
+"read."
+msgstr ""
+"L'import de la traduction a échoué car le fichier %filename n'a pas "
+"pu être lu."
+msgid ""
+"The translation file %filename contains an error: \"msgstr\" was "
+"expected but not found on line %line."
+msgstr ""
+"Le fichier de traduction %filename contient une erreur : "
+"« msgstr » attendu mais non trouvé à la ligne %line."
+msgid ""
+"The translation file %filename contains an error: \"msgid_plural\" was "
+"expected but not found on line %line."
+msgstr ""
+"Le fichier de traduction %filename contient une erreur : "
+"« msgid_plural » attendu mais non trouvé à la ligne %line."
+msgid "The translation file %filename contains a syntax error on line %line."
+msgstr ""
+"Le fichier de traduction %filename contient une erreur de syntaxe à "
+"la ligne %line."
+msgid ""
+"The translation file %filename contains an error: \"msgid\" is "
+"unexpected on line %line."
+msgstr ""
+"Le fichier de traduction %filename contient une erreur : "
+"« msgid » inattendu à la ligne %line."
+msgid ""
+"The translation file %filename contains an error: \"msgstr[]\" is "
+"unexpected on line %line."
+msgstr ""
+"Le fichier de traduction %filename contient une erreur : \"msgstr[]\" "
+"inattendu à la ligne %line."
+msgid ""
+"The translation file %filename contains an error: \"msgstr\" is "
+"unexpected on line %line."
+msgstr ""
+"Le fichier de traduction %filename contient une erreur : \"msgstr\" "
+"inattendu à la ligne %line."
+msgid ""
+"The translation file %filename contains an error: there is an "
+"unexpected string on line %line."
+msgstr ""
+"Le fichier de traduction %filename contient une erreur : expression "
+"inattendue à la ligne %line."
+msgid "The translation file %filename ended unexpectedly at line %line."
+msgstr ""
+"Le fichier de traduction %filename se termine de façon inattendue à "
+"la ligne %line."
+msgid "Save translations"
+msgstr "Enregistrer les traductions"
+msgid "Export template"
+msgstr "Exporter le modèle"
+msgid "Create @name"
+msgstr "Créer @name"
+msgid "The custom menu %title has been deleted."
+msgstr "Le menu personnalisé '%title' a été supprimé."
+msgid "@type %title has been deleted."
+msgstr "Le contenu '%title', de type '@type', a été supprimé."
+msgid "Crop"
+msgstr "Recadrer"
+msgid "Not enabled"
+msgstr "Non activé"
+msgid ""
+"Instructions to present to the user below this field on the editing "
+"form.<br />Allowed HTML tags: @tags"
+msgstr ""
+"Instructions à présenter à l'utilisateur sous ce champ, dans le "
+"formulaire de modification.<br />Balises HTML autorisées : @tags"
+msgid "anonymous user"
+msgstr "utilisateur anonyme"
+msgid "@module (<span class=\"admin-disabled\">disabled</span>)"
+msgstr "@module (<span class=\"admin-disabled\">désactivé</span>)"
+msgid "@module (<span class=\"admin-enabled\">enabled</span>)"
+msgstr "@module (<span class=\"admin-enabled\">activé</span>)"
+msgid "Web services"
+msgstr "Services Web"
+msgid "Save permissions"
+msgstr "Enregistrer les droits d'accès"
+msgid "The e-mail address %email is already taken."
+msgstr "L'adresse de courriel %email est déjà utilisée."
+msgid "Effect"
+msgstr "Effet"
+msgid "Error message"
+msgstr "Message d'erreur"
+msgid "Original text"
+msgstr "Texte original"
+msgid "Delete content type"
+msgstr "Supprimer le type de contenu"
+msgid "Change book (update list of parents)"
+msgstr "Changer de livre (mettre à jour la liste des parents)"
+msgid "create a new book"
+msgstr "créer un nouveau livre"
+msgid "edit permissions"
+msgstr "modifier les droits"
+msgid "edit order and titles"
+msgstr "modifier l'ordre et les titres"
+msgid "Manage your site's book outlines."
+msgstr "Gérer les structures des livres de votre site."
+msgid "For security reasons, your upload has been renamed to %filename."
+msgstr ""
+"Pour des raisons de sécurité, votre fichier a été renommé en "
+"%filename."
+msgid "Installed version"
+msgstr "Version installée"
+msgid "Recommended version"
+msgstr "Version recommandée"
+msgid "Cron run successfully."
+msgstr "Tâches planifiées (cron) terminées avec succès."
+msgid "notice"
+msgstr "information"
+msgid "User account"
+msgstr "Compte utilisateur"
+msgid "File download"
+msgstr "Téléchargement de fichier"
+msgid "Acronym"
+msgstr "Acronyme"
+msgid "original"
+msgstr "original"
+msgid ""
+"Failed to upload the picture image; the %directory directory doesn't "
+"exist or is not writable."
+msgstr ""
+"Échec du transfert du portrait ; le répertoire %directory n'existe "
+"pas ou n'est pas accessible en écriture."
+msgid "Dates"
+msgstr "Dates"
+msgid "The field has been updated."
+msgstr "Le champ a été mis à jour."
+msgid "pixels"
+msgstr "pixels"
+msgid "1 month"
+msgid_plural "@count months"
+msgstr[0] "@count mois"
+msgstr[1] "@count mois"
+msgid "Save order"
+msgstr "Enregistrer l'ordre"
+msgid "done"
+msgstr "fait"
+msgid "List, edit, or add user roles."
+msgstr "Afficher, ajouter ou modifier des rôles d'utilisateur."
+msgid "edit role"
+msgstr "modifier le rôle"
+msgid "Custom format"
+msgstr "Format d'entrée personnalisé"
+msgid "Direction"
+msgstr "Direction"
+msgid "%name: illegal value."
+msgstr "%name : valeur illégale."
+msgid "Edit %title"
+msgstr "Modifier %title"
+msgid "Drupal core"
+msgstr "Drupal core"
+msgid "Book navigation block display"
+msgstr "Affichage du bloc de navigation du livre"
+msgid "Relations"
+msgstr "Relations"
+msgid "Password field is required."
+msgstr "Le champ mot de passe est obligatoire."
+msgid "Confirm password"
+msgstr "Confirmer le mot de passe"
+msgid "No content available."
+msgstr "Aucun contenu disponible."
+msgid "Administration theme"
+msgstr "Thème de l'administration"
+msgid ""
+"Thank you for applying for an account. Your account is currently "
+"pending approval by the site administrator.<br />In the meantime, a "
+"welcome message with further instructions has been sent to your e-mail "
+"address."
+msgstr ""
+"Merci d'avoir demandé un nouveau compte. Votre demande est en attente "
+"de validation par l'administrateur du site.<br />En attendant, un "
+"message de bienvenue a été envoyé à votre adresse de courriel."
+msgid "Congo (Kinshasa)"
+msgstr "Congo (Kinshasa)"
+msgid "Congo (Brazzaville)"
+msgstr "Congo (Brazzaville)"
+msgid "Ivory Coast"
+msgstr "Côte d’Ivoire"
+msgid "Hong Kong S.A.R., China"
+msgstr "Hong Kong R.A.S., Chine"
+msgid "Isle of Man"
+msgstr "Île de Man"
+msgid "Montenegro"
+msgstr "Monténégro"
+msgid "Macao S.A.R., China"
+msgstr "Macao R.A.S., Chine"
+msgid "Saint Pierre and Miquelon"
+msgstr "Saint-Pierre-et-Miquelon"
+msgid "Serbia"
+msgstr "Serbie"
+msgid "Afar"
+msgstr "Afar"
+msgid "Somali"
+msgstr "Somalien"
+msgid "Komi"
+msgstr "Komi"
+msgid "Run cron"
+msgstr "Lancer la tâche planifiée (cron)"
+msgid "Warning message"
+msgstr "Message d'avertissement"
+msgid ""
+"Security warning: Couldn't write .htaccess file. Please create a "
+".htaccess file in your %directory directory which contains the "
+"following lines: <code>!htaccess</code>"
+msgstr ""
+"Avertissement de sécurité : impossible de créer le fichier "
+".htaccess. Créez un fichier .htaccess dans le répertoire %directory "
+"contenant les lignes suivantes : <code>!htaccess</code>"
+msgid ""
+"The specified file %file could not be copied, because no file by that "
+"name exists. Please check that you supplied the correct filename."
+msgstr ""
+"Le fichier spécifié %file n'a pas pu être copié, car aucun fichier "
+"portant ce nom n'existe. Veuillez vérifier que vous avez fourni le "
+"bon nom de fichier."
+msgid ""
+"The specified file %file was not copied because it would overwrite "
+"itself."
+msgstr ""
+"Le fichier spécifié %file n'a pas pu être copié parce qu'il "
+"s'écraserait lui-même."
+msgid ""
+"The file %file could not be saved, because it exceeds %maxsize, the "
+"maximum allowed size for uploads."
+msgstr ""
+"Le fichier %file n'a pas pu être enregistré parce qu'il dépasse la "
+"taille maximale autorisée (%maxsize)."
+msgid ""
+"The file %file could not be saved, because the upload did not "
+"complete."
+msgstr ""
+"Le fichier %file n'a pas pu être enregistré car le transfert ne "
+"s'est pas terminé."
+msgid "The file %file could not be saved. An unknown error has occurred."
+msgstr ""
+"Le fichier %file n'a pas pu être enregistré. Une erreur inconnue "
+"s'est produite."
+msgid "The specified file %name could not be uploaded."
+msgstr "Le fichier spécifié %name n'a pas pu être transféré."
+msgid "The file's name is empty. Please give a name to the file."
+msgstr "Le nom du fichier est vide. Veuillez donner un nom au fichier."
+msgid "Only files with the following extensions are allowed: %files-allowed."
+msgstr ""
+"Seuls les fichiers se terminant par les extensions suivantes sont "
+"autorisés : %files-allowed."
+msgid "The file is %filesize exceeding the maximum file size of %maxsize."
+msgstr ""
+"Le fichier fait %filesize, ce qui dépasse la taille maximale "
+"autorisée (%maxsize)."
+msgid "The file is %filesize which would exceed your disk quota of %quota."
+msgstr ""
+"Le fichier fait %filesize, ce qui dépasserait votre quota de disque "
+"(%quota)."
+msgid "Only JPEG, PNG and GIF images are allowed."
+msgstr "Seules les images JPEG, PNG et GIF sont autorisées."
+msgid ""
+"The image was resized to fit within the maximum allowed dimensions of "
+"%dimensions pixels."
+msgstr ""
+"L'image a été redimensionnée pour tenir dans les dimensions "
+"maximales autorisées (%dimensions pixels)."
+msgid "The image is too large; the maximum dimensions are %dimensions pixels."
+msgstr ""
+"L'image est trop grande ; les dimensions maximales sont de %dimensions "
+"pixels."
+msgid "The image is too small; the minimum dimensions are %dimensions pixels."
+msgstr ""
+"L'image transférée est trop petite ; les dimensions minimales sont "
+"de %dimensions pixels."
+msgid "The file %path was not deleted, because it does not exist."
+msgstr "Le fichier %path n'a pas été supprimé car il est inexistant."
+msgid ""
+"Upload error. Could not move uploaded file %file to destination "
+"%destination."
+msgstr ""
+"Erreur de transfert. Impossible de déplacer le fichier transféré "
+"(%file) vers la destination (%destination)."
+msgid "Add to book outline"
+msgstr "Ajouter à la structure du livre"
+msgid "Stark"
+msgstr "Stark"
+msgid "New set"
+msgstr "Nouvel ensemble"
+msgid "outdated"
+msgstr "traduction périmée"
+msgid "<strong>@language_name</strong> (source)"
+msgstr "<strong>@language_name</strong> (source)"
+msgid "add translation"
+msgstr "ajouter une traduction"
+msgid "Translations of %title"
+msgstr "Traductions de %title"
+msgid "Manage tagging, categorization, and classification of your content."
+msgstr ""
+"Gérer les étiquettes, les catégories et la classification de votre "
+"contenu."
+msgid "Database port"
+msgstr "Port de la base de données"
+msgid "Re-index site"
+msgstr "Réindexer le site"
+msgid "Are you sure you want to re-index the site?"
+msgstr "Êtes-vous sûr de vouloir réindexer le site ?"
+msgid "cURL"
+msgstr "cURL"
+msgid "Pass"
+msgstr "Réussite"
+msgid "Fail"
+msgstr "Echec"
+msgid "No test results to display."
+msgstr "Aucun résultat de test à afficher."
+msgid "Save and continue"
+msgstr "Enregistrer et continuer"
+msgid ""
+"These options are only necessary for some sites. If you're not sure "
+"what you should enter here, leave the default settings or check with "
+"your hosting provider."
+msgstr ""
+"Ces options ne sont nécessaires que pour certains sites. Si vous ne "
+"savez pas quoi saisir ici, gardez les valeurs par défaut ou "
+"interrogez votre hébergeur."
+msgid "If your database is located on a different server, change this."
+msgstr ""
+"Si votre base de données est située sur un serveur différent, "
+"changez ce paramètre."
+msgid ""
+"If your database server is listening to a non-standard port, enter its "
+"number."
+msgstr ""
+"Si votre base de données écoute sur un port non standard, saisissez "
+"son numéro ici."
+msgid "Database port must be a number."
+msgstr "Le port de la base de données doit être un nombre."
+msgid ""
+"Spaces are allowed; punctuation is not allowed except for periods, "
+"hyphens, and underscores."
+msgstr ""
+"Les espaces sont autorisés, mais pas les signes de ponctuation à "
+"l'exception des points, traits d'unions et tirets bas."
+msgid "IP address"
+msgstr "Adresse IP"
+msgid "Maximum height"
+msgstr "Hauteur maximum"
+msgid "Maximum width"
+msgstr "Largeur maximum"
+msgid "Timor-Leste"
+msgstr "Timor oriental"
+msgid "Primary tabs"
+msgstr "Onglets principaux"
+msgid "Secondary tabs"
+msgstr "Onglets secondaires"
+msgid "Enable or disable the display of certain page elements."
+msgstr "Activer ou désactiver l'affichage de certains éléments des pages."
+msgid "Add new content"
+msgstr "Ajouter du nouveau contenu"
+msgid "Boolean"
+msgstr "Booléen"
+msgid "Maximum image resolution"
+msgstr "Résolution maximale de l'image"
+msgid ""
+"An illegal choice has been detected. Please contact the site "
+"administrator."
+msgstr ""
+"Un choix interdit a été détecté. Veuillez contacter "
+"l'administrateur du site."
+msgid "Illegal choice %choice in !name element."
+msgstr "Choix interdit %choice dans l'élément !name."
+msgid "First sidebar"
+msgstr "Première barre latérale"
+msgid "Status report"
+msgstr "Tableau de bord d'administration"
+msgid "Not writable"
+msgstr "Non accessible en écriture"
+msgid "Decimal point"
+msgstr "Marqueur décimal"
+msgid "Book outline"
+msgstr "Structure du livre"
+msgid "This will be the top-level page in this book."
+msgstr "Ceci sera la préface (niveau supérieur) dans ce livre."
+msgid "Revision information"
+msgstr "Informations sur les révisions"
+msgid "Notify user of new account"
+msgstr "Notifier l'utilisateur de la création de son nouveau compte"
+msgid "View comment"
+msgstr "Voir le commentaire"
+msgid "Comma"
+msgstr "Virgule"
+msgid "Uses"
+msgstr "Utilisations"
+msgid "Path to custom icon"
+msgstr "Chemin vers l'icône personnalisée"
+msgid "Current user"
+msgstr "Utilisateur courant"
+msgid "Digest"
+msgstr "Récapitulatif"
+msgid "You are not authorized to post comments."
+msgstr "Vous n'êtes pas autorisé à poster des commentaires."
+msgid "The comment you are replying to does not exist."
+msgstr "Le commentaire auquel vous répondez n'existe plus."
+msgid "This discussion is closed: you can't post new comments."
+msgstr ""
+"La discussion est fermée, vous ne pouvez pas poster de nouveaux "
+"commentaires."
+msgid "You are not authorized to view comments."
+msgstr "Vous n'êtes pas autorisé à voir les commentaires."
+msgid "Are you sure you want to delete the comment %title?"
+msgstr "Êtes-vous sûr(e) de vouloir supprimer le commentaire %title ?"
+msgid ""
+"Any replies to this comment will be lost. This action cannot be "
+"undone."
+msgstr ""
+"Toutes les réponses à ce commentaire seront perdues. Cette action ne "
+"peut être annulée."
+msgid "Publish the selected comments"
+msgstr "Publier les commentaires sélectionnés"
+msgid "Unpublish the selected comments"
+msgstr "Retirer les commentaires sélectionnés"
+msgid "Are you sure you want to delete these comments and all their children?"
+msgstr ""
+"Êtes-vous sûr de vouloir supprimer ces commentaires et tout leurs "
+"éléments enfants ?"
+msgid "You have to specify a valid author."
+msgstr "Vous devez saisir un auteur valide."
+msgid "The name you used belongs to a registered user."
+msgstr ""
+"Le nom que vous avez utilisé appartient à un utilisateur "
+"enregistré."
+msgid "The e-mail address you specified is not valid."
+msgstr "L'adresse de courriel que vous avez saisie n'est pas valide."
+msgid ""
+"The URL of your homepage is not valid. Remember that it must be fully "
+"qualified, i.e. of the form <code>http://example.com/directory</code>."
+msgstr ""
+"L'URL de votre page personnelle n'est pas valide. Il doit s'agir d'une "
+"URL complète, de la forme <code>http://example.fr/directory</code>"
+msgid "(No subject)"
+msgstr "(sans sujet)"
+msgid "Default image"
+msgstr "Image par défaut"
+msgid ""
+"This text will be used by screen readers, search engines, or when the "
+"image cannot be loaded."
+msgstr ""
+"Ce texte sera utilisé par les lecteurs d'écran, les moteurs de "
+"recherche, ou lorsque l'image ne peut être chargée."
+msgid "Add feed"
+msgstr "Ajouter un flux"
+msgid "List links"
+msgstr "Lister les liens"
+msgid "MIME type"
+msgstr "Type MIME"
+msgid "File system"
+msgstr "Système de fichiers"
+msgid "@name's blog"
+msgstr "Le blog de @name"
+msgid "Toolbar"
+msgstr "Barre d'outils"
+msgid "Enter your @s username."
+msgstr "Saisissez votre nom d'utilisateur pour @s."
+msgid "Posted in"
+msgstr "Posté sur"
+msgid ""
+"Comment: unauthorized comment submitted or comment submitted to a "
+"closed post %subject."
+msgstr ""
+"Commentaire : commentaire non autorisé ou soumis sur un billet fermé "
+"'%subject'."
+msgid "!name's blog"
+msgstr "Blog de !name"
+msgid "Email:"
+msgstr "Courriel :"
+msgid "All languages"
+msgstr "Toutes les langues"
+msgid "Dashboard"
+msgstr "Tableau de bord"
+msgid "Search index"
+msgstr "Index de recherche"
+msgid "The size of the file."
+msgstr "La taille du fichier."
+msgid "The MIME type of the file."
+msgstr "Le type MIME du fichier."
+msgid "@type %title has been created."
+msgstr "Le contenu '%title', de type '@type', a été créé."
+msgid "@type %title has been updated."
+msgstr "Le contenu '%title', de type '@type', a été mis à jour."
+msgid "The post could not be saved."
+msgstr "Le contenu n'a pu être enregistré."
+msgid "1 character"
+msgid_plural "@count characters"
+msgstr[0] "@count caractère"
+msgstr[1] "@count caractères"
+msgid "Filter settings"
+msgstr "Paramètres de filtrage"
+msgid "You do not have any administrative items."
+msgstr "Vous n'avez accès à aucune page d'administration."
+msgid ""
+"One or more problems were detected with your Drupal installation. "
+"Check the <a href=\"@status\">status report</a> for more information."
+msgstr ""
+"Un ou plusieurs problèmes ont été détectés dans votre "
+"installation Drupal. Vérifiez le <a href=\"@status\">tableau de bord "
+"d'administration</a> pour plus d'information."
+msgid "Help topics"
+msgstr "Rubriques d'aide"
+msgid "Help is available on the following items:"
+msgstr "De l'aide est disponible pour les éléments suivants:"
+msgid "No help is available for module %module."
+msgstr "Aucune aide n'est disponible pour le module « %module »."
+msgid "@module administration pages"
+msgstr "Pages d'administration de @module"
+msgid "Translate interface"
+msgstr "Traduire l'interface"
+msgid "Add language"
+msgstr "Ajouter une langue"
+msgid "Edit string"
+msgstr "Modifier le terme"
+msgid "Delete string"
+msgstr "Supprimer le terme"
+msgid "Are you sure you want to delete the language %name?"
+msgstr "Voulez-vous vraiment supprimer la langue %name ?"
+msgid "The language %locale has been removed."
+msgstr "La langue %locale a été supprimée."
+msgid "Are you sure you want to delete the string \"%source\"?"
+msgstr "Voulez-vous vraiment supprimer la chaîne « %source » ?"
+msgid ""
+"Deleting the string will remove all translations of this string in all "
+"languages. This action cannot be undone."
+msgstr ""
+"La suppression d'une chaîne entraînera la suppression de toutes les "
+"traductions de cette chaîne dans toutes les langues. Cette action est "
+"irréversible."
+msgid "locale"
+msgstr "paramètre régional"
+msgid "AM"
+msgstr "AM"
+msgid "PM"
+msgstr "PM"
+msgid "PHP extensions"
+msgstr "Extensions PHP"
+msgid "Comments per page"
+msgstr "Commentaires par page"
+msgid "Multilingual support"
+msgstr "Gestion multilingue"
+msgid "Enabled, with translation"
+msgstr "Activé, avec traductions"
+msgid "Publish comment"
+msgstr "Publier un commentaire"
+msgid "The file could not be uploaded."
+msgstr "Le fichier n'a pas pu être transféré."
+msgid ""
+"The selected image handling toolkit %toolkit can not correctly process "
+"%function."
+msgstr ""
+"La boîte à outils de gestion d'images sélectionnée, %toolkit, ne "
+"peut pas traiter correctement : '%function'."
+msgid "FTP"
+msgstr "FTP"
+msgid ""
+"The directory %file is not protected from modifications and poses a "
+"security risk. You must change the directory's permissions to be "
+"non-writable. "
+msgstr ""
+"Le répertoire %file n'est pas protégé en écriture. Cela pourrait "
+"poser un problème de sécurité, vous devez donc changer les "
+"permissions du fichier pour qu'il ne soit pas accessible en écriture. "
+""
+msgid "Collaboration"
+msgstr "Collaboration"
+msgid "Administration pages"
+msgstr "Pages d’administration"
+msgid "Currently using !item !version"
+msgstr "En cours d'utilisation : !item !version"
+msgid "Created content type %type."
+msgstr "Le type de contenu %type a été créé."
+msgid "User created with name %name and pass %pass"
+msgstr "Utilisateur créé avec le nom %name et le mot de passe %pass"
+msgid "Created permissions: @perms"
+msgstr "Permissions créées : @perms"
+msgid "Invalid permission %permission."
+msgstr "Permission %permission non valide."
+msgid "Username field found."
+msgstr "Champ Nom d'utilisateur trouvé."
+msgid "Password field found."
+msgstr "Champ Mot de passe trouvé."
+msgid "!method @url returned @status (!length)."
+msgstr "!method @url a retourné @status (!length)."
+msgid "Valid HTML found on \"@path\""
+msgstr "HTML valide trouvé dans \"@path\""
+msgid "Parsed page successfully."
+msgstr "Analyse de la page réussi"
+msgid "Found the requested form fields at @path"
+msgstr "Les champs de formulaire demandés ont été trouvé au chemin @path"
+msgid "Did not find field by name @name"
+msgstr "Le champ n'a pas été trouvé à partir de son nom @name"
+msgid "Found field by id @id"
+msgstr "Le champ a été trouvé à partir de son identifiant (ID) @id"
+msgid "Did not find field by id @id"
+msgstr "Le champ n'a pas été trouvé à partir de son identifiant (ID) @id"
+msgid "HTTP response expected !code, actual !curl_code"
+msgstr ""
+"La réponse HTTP attendue est !code or la réponse obtenue est "
+"!curl_code"
+msgid "The website encountered an unexpected error. Please try again later."
+msgstr ""
+"Le site Web a rencontré une erreur inattendue. Veuillez essayer de "
+"nouveau plus tard."
+msgid "Tests"
+msgstr "Tests"
+msgid "Run tests"
+msgstr "Lancer les tests"
+msgid "Clean test environment"
+msgstr "Purger l'environnement de test"
+msgid ""
+"Remove tables with the prefix \"simpletest\" and temporary directories "
+"that are left over from tests that crashed. This is intended for "
+"developers when creating tests."
+msgstr ""
+"Retirer les tables avec le préfixe \"simpletest\" et les répertoires "
+"temporaires laissés par les tests qui ont échoué. Ceci est destiné "
+"aux développeurs lors de la création des tests."
+msgid "Clean environment"
+msgstr "Nettoyer l'environnement"
+msgid "No tests to display."
+msgstr "Aucun test à afficher."
+msgid "@pass, @fail, and @exception"
+msgstr "@pass, @fail et @exception"
+msgid "No test(s) selected."
+msgstr "Aucun test sélectionné."
+msgid "Processing test @num of @max - %test."
+msgstr "Test en cours d'exécution @num de @max - %test."
+msgid "@name: @summary"
+msgstr "@name : @summary"
+msgid "Processed test @num of @max - %test."
+msgstr "Test exécuté @num de @max - %test."
+msgid "1 pass"
+msgid_plural "@count passes"
+msgstr[0] "@count réussi"
+msgstr[1] "@count réussis"
+msgid "1 fail"
+msgid_plural "@count fails"
+msgstr[0] "@count échoué"
+msgstr[1] "@count échoués"
+msgid "1 exception"
+msgid_plural "@count exceptions"
+msgstr[0] "@count exception"
+msgstr[1] "@count exceptions"
+msgid "PHP DOMDocument class"
+msgstr "Classe PHP DOMDocument"
+msgid "Provides a framework for unit and functional testing."
+msgstr "Fournit un framework pour les tests unitaires et fonctionnels."
+msgid "Main menu"
+msgstr "Menu principal"
+msgid "Hindi"
+msgstr "Hindou"
+msgid "User %name used one-time login link at time %timestamp."
+msgstr ""
+"L'utilisateur %name a utilisé un lien de connexion temporaire à "
+"%timestamp."
+msgid ""
+"Created a new user account for <a href=\"@url\">%name</a>. No e-mail "
+"has been sent."
+msgstr ""
+"Nouveau compte utilisateur créé pour <a href=\"@url\">%name</a>. "
+"Aucun e-mail n'a été envoyé."
+msgid "Registration successful. You are now logged in."
+msgstr "Enregistrement effectué. Vous êtes maintenant identifié."
+msgid "New user: %name (%email)."
+msgstr "Nouvel utilisateur : %name (%email)."
+msgid "Trigger"
+msgstr "Déclencheur"
+msgid "Add link"
+msgstr "Ajouter un lien"
+msgid "View comments"
+msgstr "Voir les commentaires"
+msgid "Username or e-mail address"
+msgstr "Nom d'utilisateur ou adresse électronique."
+msgid "%name: this field cannot hold more than @count values."
+msgstr "%name : ce champ ne peut pas contenir plus de @count valeurs."
+msgid "No fields available."
+msgstr "Aucun champ disponible."
+msgid "After saving new content"
+msgstr "Après l'enregistrement d'un nouveau contenu"
+msgid "After deleting content"
+msgstr "Après suppression du contenu"
+msgid "Vertical Tabs"
+msgstr "Vertical Tabs"
+msgid "Not in book"
+msgstr "Pas dans le livre"
+msgid "New book"
+msgstr "Nouveau livre"
+msgid "By @name on @date"
+msgstr "Par @name le @date"
+msgid "By @name"
+msgstr "Par @name"
+msgid "Not in menu"
+msgstr "Pas dans le menu"
+msgid "Alias: @alias"
+msgstr "Alias : @alias"
+msgid "No alias"
+msgstr "Aucun alias"
+msgid "User autocomplete"
+msgstr "Saisie semi-automatique des noms d'utilisateur"
+msgid "Initializing."
+msgstr "Initialisation."
+msgid "An error has occurred."
+msgstr "Une erreur s'est produite."
+msgid "Please continue to <a href=\"@error_url\">the error page</a>"
+msgstr "Veuillez continuer sur la <a href=\"@error_url\">page d'erreur</a>"
+msgid "HTTP POST is required."
+msgstr "La méthode HTTP POST est requise."
+msgid "Your page will be a part of the selected book."
+msgstr "Votre page fera une partie du livre sélectionné."
+msgid "0 sec"
+msgstr "0 s"
+msgid "form"
+msgstr "formulaire"
+msgid "alert"
+msgstr "alerte"
+msgid "emergency"
+msgstr "emergency"
+msgid "Filter log messages"
+msgstr "Filtrer les messages du journal"
+msgid "You must select something to filter by."
+msgstr "Vous devez sélectionnez un critère de filtrage."
+msgid "New revision"
+msgstr "Nouvelle révision"
+msgid ""
+"To change the current user password, enter the new password in both "
+"fields."
+msgstr ""
+"Pour modifier le mot de passe actuel, saisissez le nouveau mot de "
+"passe dans les deux champs de texte."
+msgid ""
+"You have tried to use a one-time login link that has expired. Please "
+"request a new one using the form below."
+msgstr ""
+"Vous avez tenté d'utiliser un lien de connexion temporaire qui a "
+"expiré. Demandez-en un nouveau en utilisant le formulaire ci-dessous."
+msgid "This login can be used only once."
+msgstr "Cet identifiant ne peut être utilisé qu'une fois."
+msgid "The translation import of %filename failed."
+msgstr "L'import de la traduction %filename a échoué."
+msgid "More choices"
+msgstr "Plus d'options"
+msgid "Abbreviation"
+msgstr "Abrévation"
+msgid "Inserted"
+msgstr "Inséré"
+msgid "Provide a password for the new account in both fields."
+msgstr "Saisissez un mot de passe pour le nouveau compte dans les deux champs."
+msgid "(@language)"
+msgstr "(@language)"
+msgid "filter"
+msgstr "filtre"
+msgid "The title of the comment."
+msgstr "Le titre du commentaire."
+msgid "Comment count"
+msgstr "Nombre de commentaires"
+msgid "The title of the node."
+msgstr "Titre du nœud."
+msgid "The date the node was posted."
+msgstr "Date de publication du nœud."
+msgid "Poll"
+msgstr "Sondage"
+msgid "Views today"
+msgstr "Affichages aujourd'hui"
+msgid "contact"
+msgstr "contact"
+msgid ""
+"Search for either of the two terms with uppercase <strong>OR</strong>. "
+"For example, <strong>cats OR dogs</strong>."
+msgstr ""
+"Cherche l'un ou l'autre termes avec <strong>OR</strong> en majuscule. "
+"Par exemple : <strong>chats OR chiens</strong>."
+msgid "PHP filter"
+msgstr "Filtre PHP"
+msgid "Language settings"
+msgstr "Paramètres de langue"
+msgid "Attempting to re-run cron while it is already running."
+msgstr ""
+"Tentative de relance du planificateur de tâche (Cron) alors qu'il "
+"fonctionne déjà."
+msgid "Cron run completed."
+msgstr "Exécution du planificateur de tâche (Cron) réussie."
+msgid "HTTP request status"
+msgstr "Etat de la requête HTTP"
+msgid "Fails"
+msgstr "Échoué"
+msgid "Visitors"
+msgstr "Visiteurs"
+msgid "The maximum length of the field in characters."
+msgstr "La longueur maximale du champ en nombre de caractères."
+msgid "Machine-readable name"
+msgstr "Nom système"
+msgid "Already added languages"
+msgstr "Langues déjà installées"
+msgid "Recent blog posts"
+msgstr "Derniers billets"
+msgid "Who's new"
+msgstr "Nouveaux membres"
+msgid "Language name"
+msgstr "Nom de la langue"
+msgid "Edit language"
+msgstr "Modifier la langue"
+msgid "list links"
+msgstr "lister les liens"
+msgid "Edit category"
+msgstr "Modifier la catégorie"
+msgid "The content type %name has been updated."
+msgstr "Le type de contenu %name a été mis à jour."
+msgid "The content type %name has been added."
+msgstr "Le type de contenu %name a été ajouté."
+msgid "Catalan"
+msgstr "Catalan"
+msgid "Contact form"
+msgstr "Formulaire de contact"
+msgid "Drag to re-order"
+msgstr "Cliquer-déposer pour ré-organiser"
+msgid ""
+"Changes made in this table will not be saved until the form is "
+"submitted."
+msgstr ""
+"Les changements effectués dans ce tableau ne seront pris en compte "
+"que lorsque la configuration aura été enregistrée."
+msgid "Blue Lagoon (default)"
+msgstr "Bleu lagon (par défaut)"
+msgid "The requested page could not be found."
+msgstr "La page demandée n'a pas pu être trouvée."
+msgid "The user account %id does not exist."
+msgstr "Le compte utilisateur %id n'existe pas."
+msgid "Attempted to cancel non-existing user account: %id."
+msgstr "Essaie d'annuler un compte utilisateur inexistant: %id."
+msgid "Requirements problem"
+msgstr "Pré-requis non satisfaits"
+msgid "Database configuration"
+msgstr "Configuration de la base de données"
+msgid "The type of database your @drupal data will be stored in."
+msgstr "Le type de base dans laquelle vos données @drupal seront stockées."
+msgid ""
+"The name of the database your @drupal data will be stored in. It must "
+"exist on your server before @drupal can be installed."
+msgstr ""
+"Le nom de la base dans laquelle les données de @drupal seront "
+"stockées. Cette base doit être créée sur le serveur avant que "
+"@drupal ne puisse y être installé."
+msgid ""
+"If more than one application will be sharing this database, enter a "
+"table prefix such as %prefix for your @drupal site here."
+msgstr ""
+"Si plus d'une application partage cette base de données, indiquez un "
+"préfixe de table pour votre site @drupal, comme par exemple %prefix."
+msgid "Select an installation profile"
+msgstr "Choisissez un profil d'installation"
+msgid "Choose language"
+msgstr "Choix de la langue d'installation"
+msgid "Learn how to install Drupal in other languages"
+msgstr "Comment installer Drupal dans d'autres langues ?"
+msgid "(built-in)"
+msgstr "(interne)"
+msgid "No profiles available"
+msgstr "Aucun profil d'installation n'est disponible"
+msgid "Drupal already installed"
+msgstr "Drupal est déjà installé"
+msgid ""
+"<ul><li>To start over, you must empty your existing "
+"database.</li><li>To install to a different database, edit the "
+"appropriate <em>settings.php</em> file in the <em>sites</em> "
+"folder.</li><li>To upgrade an existing installation, proceed to the <a "
+"href=\"@base-url/update.php\">update script</a>.</li><li>View your <a "
+"href=\"@base-url\">existing site</a>.</li></ul>"
+msgstr ""
+"<ul><li>Pour recommencer l'installation, vous devez vider votre base "
+"de données.</li><li>Pour installer avec une base de données "
+"différente, modifiez le fichier <em>settings.php</em> approprié dans "
+"le répertoire <em>sites</em>.</li><li>Pour mettre à jour une version "
+"existante, lancer le <a href=\"@base-url/update.php\">script de mise "
+"à jour</a>.</li><li>Afficher votre <a href=\"@base-url\">site "
+"actuel</a>.</li></ul>"
+msgid "Installing @drupal"
+msgstr "Installation de @drupal"
+msgid "The installation has encountered an error."
+msgstr "Une erreur s'est produite durant l'installation."
+msgid "Configure site"
+msgstr "Configuration du site"
+msgid "@drupal installation complete"
+msgstr "Installation de @drupal terminée"
+msgid "Installed %module module."
+msgstr "Le module %module a été installé."
+msgid "Choose profile"
+msgstr "Choix du profil"
+msgid "Verify requirements"
+msgstr "Vérification des pré-requis"
+msgid "Set up database"
+msgstr "Installation de la base de données"
+msgid "Set up translations"
+msgstr "Installation des traductions"
+msgid "Install site"
+msgstr "Installation du site"
+msgid "Finish translations"
+msgstr "Finalisation des traductions"
+msgid "Site e-mail address"
+msgstr "Adresse de courriel du site"
+msgid ""
+"The <em>From</em> address in automated e-mails sent during "
+"registration and new password requests, and other notifications. (Use "
+"an address ending in your site's domain to help prevent this e-mail "
+"being flagged as spam.)"
+msgstr ""
+"Le champ <em>De</em> des courriels automatiques envoyés pendant la "
+"procédure d'enregistrement, les demandes de nouveaux mot de passe et "
+"les autres notifications. (Utilisez une adresse se terminant par le "
+"domaine de votre site afin de minimiser les risques que votre courriel "
+"ne soit marqué comme pourriel (spam).)"
+msgid ""
+"By default, dates in this site will be displayed in the chosen time "
+"zone."
+msgstr ""
+"Par défaut, les dates et les heures sur ce site seront affichées "
+"selon ce fuseau horaire."
+msgid "Update notifications"
+msgstr "Notification des mises à jour"
+msgid "Check for updates automatically"
+msgstr "Vérifier automatiquement les mises à jour"
+msgid "Removed orphaned action '%action' from database."
+msgstr "Action orpheline '%action' supprimée de la base de données."
+msgid "Cron run exceeded the time limit and was aborted."
+msgstr ""
+"L'exécution du planificateur de tâche (Cron) a dépassé la limite "
+"de temps et a été annulée."
+msgid "1 byte"
+msgid_plural "@count bytes"
+msgstr[0] "@count octet"
+msgstr[1] "@count octets"
+msgid ""
+"!name cannot be longer than %max characters but is currently %length "
+"characters long."
+msgstr ""
+"Le champ « !name » ne peut pas être plus long que %max caractères "
+"mais comporte actuellement %length caractères."
+msgid "Illegal choice %choice in %name element."
+msgstr "Choix « %choice » interdit dans l'élément « %name »."
+msgid "GD2 image manipulation toolkit"
+msgstr "Boîte à outils de traitement d'image GD2"
+msgid "The GD toolkit is installed and working properly."
+msgstr "La boîte à outils GD2 est installée et fonctionne correctement."
+msgid ""
+"Define the image quality for JPEG manipulations. Ranges from 0 to 100. "
+"Higher values mean better image quality but bigger files."
+msgstr ""
+"Définir la qualité d'image pour les conversions en JPEG, sur une "
+"échelle de 0 à 100. Une valeur élevée signifie une image de "
+"meilleure qualité mais un fichier de taille plus importante."
+msgid ""
+"The GD image toolkit requires that the GD module for PHP be installed "
+"and configured properly. For more information see <a "
+"href=\"@url\">PHP's image documentation</a>."
+msgstr ""
+"La boîte à outils GD2 nécessite que le module GD pour PHP soit "
+"installé et configuré. Pour plus d'information voir <a "
+"href=\"@url\">la documentation de PHP à propos des images</a>."
+msgid "JPEG quality must be a number between 0 and 100."
+msgstr ""
+"La qualité de fichiers JPEG doit être un nombre compris entre 0 et "
+"100."
+msgid "Right to left"
+msgstr "De droite à gauche"
+msgid "Left to right"
+msgstr "De gauche à droite"
+msgid "Predefined language"
+msgstr "Langue prédéfinie"
+msgid "Custom language"
+msgstr "Langue personnalisée"
+msgid "Add custom language"
+msgstr "Ajouter une langue personnalisée"
+msgid "Save language"
+msgstr "Enregistrer la langue"
+msgid ""
+"<a href=\"@rfc4646\">RFC 4646</a> compliant language identifier. "
+"Language codes typically use a country code, and optionally, a script "
+"or regional variant name. <em>Examples: \"en\", \"en-US\" and "
+"\"zh-Hant\".</em>"
+msgstr ""
+"Un code identifiant la langue, conforme à <a href=\"@rfc4646\">RFC "
+"4646</a>. Les codes de langue sont généralement le code du pays, "
+"parfois suivi d'un code identifiant une variante régionale. "
+"<em>Exemples : \"fr\", \"fr-FR\" et \"fr-BE\".</em>"
+msgid "Language name in English"
+msgstr "Nom de la langue en anglais"
+msgid ""
+"Name of the language in English. Will be available for translation in "
+"all languages."
+msgstr ""
+"Nom de la langue en anglais. Sera disponible à la traduction dans les "
+"autres langues."
+msgid "Native language name"
+msgstr "Nom natif de la langue"
+msgid "Name of the language in the language being added."
+msgstr "Nom de la langue en question dans cette même langue."
+msgid "Language domain"
+msgstr "Domaine de la langue"
+msgid "Direction that text in this language is presented."
+msgstr "Direction d'écriture du texte."
+msgid "The language %language (%code) already exists."
+msgstr "La langue %language (%code) existe déjà."
+msgid "Invalid language code."
+msgstr "Code de langue non valide."
+msgid ""
+"The language %language has been created and can now be used. More "
+"information is available on the <a href=\"@locale-help\">help "
+"screen</a>."
+msgstr ""
+"La langue %language a été créée et peut maintenant être "
+"utilisée. Pour plus d'informations, consulter <a "
+"href=\"@locale-help\">l'écran d'aide</a>."
+msgid "Domain and path prefix values should not be set at the same time."
+msgstr ""
+"Le domaine et le préfixe de chemin ne peuvent pas être renseignés "
+"tous les deux."
+msgid "The domain (%domain) is already tied to a language (%language)."
+msgstr "Le domaine '%domaine' est déjà associé à la langue '%language'."
+msgid "Only the default language can have both the domain and prefix empty."
+msgstr ""
+"Seule la langue par défaut peut n'avoir ni domaine ni préfixe de "
+"chemin."
+msgid "The prefix (%prefix) is already tied to a language (%language)."
+msgstr "Le préfixe '%prefix' est déjà associé à la langue '%language'."
+msgid "The English language cannot be deleted."
+msgstr "La langue anglaise, par défaut, ne peut être supprimée."
+msgid "The default language cannot be deleted."
+msgstr "La langue par défaut ne peut être supprimée."
+msgid ""
+"Deleting a language will remove all interface translations associated "
+"with it, and posts in this language will be set to be language "
+"neutral. This action cannot be undone."
+msgstr ""
+"Supprimer une langue supprimera également la traduction de "
+"l'interface qui lui est associée. Les contenus dans cette langue "
+"seront dorénavant indiqués en \"indépendant de la langue\". Cette "
+"action ne peut pas être annulée."
+msgid "Language negotiation configuration saved."
+msgstr "Les options de négociation de la langue ont été enregistrées."
+msgid "English (built-in)"
+msgstr "Anglais (interne)"
+msgid "String contains"
+msgstr "La chaîne contient"
+msgid "Leave blank to show all strings. The search is case sensitive."
+msgstr ""
+"Laisser vide pour afficher tous les termes. La recherche est sensible "
+"à la casse."
+msgid "English (provided by Drupal)"
+msgstr "Anglais (fourni par Drupal)"
+msgid "Search in"
+msgstr "Rechercher dans"
+msgid "Both translated and untranslated strings"
+msgstr "A la fois les chaînes traduites et celles qui ne le sont pas"
+msgid "Only translated strings"
+msgstr "Seulement les termes traduits"
+msgid "Only untranslated strings"
+msgstr "Seulement les termes non traduits"
+msgid "Limit search to"
+msgstr "Limiter la recherche à"
+msgid "All text groups"
+msgstr "Tous les groupes de texte"
+msgid "Languages not yet added"
+msgstr "Langues non encore installées"
+msgid "Import translation"
+msgstr "Importer une traduction"
+msgid "A Gettext Portable Object (<em>.po</em>) file."
+msgstr "Un fichier gettext portable (<em>.po</em>)."
+msgid "Import into"
+msgstr "Importer dans"
+msgid ""
+"Choose the language you want to add strings into. If you choose a "
+"language which is not yet set up, it will be added."
+msgstr ""
+"Choisissez la langue pour laquelle vous voulez ajouter des termes. Si "
+"vous choisissez une langue qui n'est pas encore présente, elle sera "
+"ajoutée."
+msgid "Text group"
+msgstr "Groupes de texte"
+msgid "Imported translations will be added to this text group."
+msgstr "Les traductions importées seront ajoutées dans ce groupe de texte."
+msgid "The language %language has been created."
+msgstr "La langue %language a été créée."
+msgid "Export translation"
+msgstr "Exporter une traduction"
+msgid ""
+"Select the language to export in Gettext Portable Object "
+"(<em>.po</em>) format."
+msgstr ""
+"Sélectionnez la langue que vous voulez exporter au format gettext "
+"portable (<em>.po</em>)."
+msgid ""
+"Generate a Gettext Portable Object Template (<em>.pot</em>) file with "
+"all strings from the Drupal locale database."
+msgstr ""
+"Créer un fichier modèle gettext portable (<em>.pot</em>) contenant "
+"l'ensemble des termes de la base de données de traduction de Drupal."
+msgid "String not found."
+msgstr "Terme non trouvé."
+msgid "The submitted string contains disallowed HTML: %string"
+msgstr "La chaîne soumise contient des balises HTML invalides : %string"
+msgid "The string has been saved."
+msgstr "Le terme a été enregistré."
+msgid "The string has been removed."
+msgstr "La chaîne a été supprimée."
+msgid "The language selected for import is not supported."
+msgstr "La langue choisie pour l'import n'est pas prise en charge."
+msgid ""
+"The translation file %filename appears to have a missing or malformed "
+"header."
+msgstr ""
+"Le fichier de traduction %filename semble avoir un en-tête manquant "
+"ou malformé."
+msgid ""
+"The translation was successfully imported. There are %number newly "
+"created translated strings, %update strings were updated and %delete "
+"strings were removed."
+msgstr ""
+"La traduction a été importée avec succès. Il y a %number "
+"chaîne(s) nouvellement traduite(s), %update chaîne(s) mise(s) à "
+"jour et %delete chaîne(s) supprimée(s)."
+msgid "Importing interface translations"
+msgstr "Importation de traductions de l'interface utilisateur"
+msgid "Starting import"
+msgstr "Début de l'importation"
+msgid "Error importing interface translations"
+msgstr "Erreur à l'importation des traductions de l'interface"
+msgid ""
+"Attempted submission of a translation string with disallowed HTML: "
+"%string"
+msgstr ""
+"Tentative de soumission d'une traduction contenant des balises HTML "
+"invalides : %string"
+msgid "The %language language (%code) has been created."
+msgstr "La langue %language (%code) a été créée."
+msgid ""
+"Imported %file into %locale: %number new strings added, %update "
+"updated and %delete removed."
+msgstr ""
+"Importation du fichier %file dans %locale : %number chaîne(s) "
+"nouvellement traduite(s), %update chaîne(s) mise(s) à jour et "
+"%delete chaîne(s) supprimée(s)."
+msgid "Exported %locale translation file: %filename."
+msgstr "Fichier de traduction %locale exporté : %filename."
+msgid "Exported translation file: %filename."
+msgstr "Fichier de traduction exporté : %filename."
+msgid "Updated JavaScript translation file for the language %language."
+msgstr ""
+"Mise à jour du fichier de traduction Javascript de la langue "
+"%language."
+msgid "Created JavaScript translation file for the language %language."
+msgstr "Création du fichier de traduction Javascript de la langue %language."
+msgid ""
+"Removed JavaScript translation file for the language %language, "
+"because no translations currently exist for that language."
+msgstr ""
+"Le fichier de traduction Javascript pour la langue %language a été "
+"supprimé, parce qu'aucune traduction n'existe pour cette langue."
+msgid ""
+"An error occurred during creation of the JavaScript translation file "
+"for the language %language."
+msgstr ""
+"Une erreur s'est produite lors de la création du fichier de "
+"traduction JavaScript de la langue %language."
+msgid ""
+"One translation string was skipped because it contains disallowed "
+"HTML."
+msgid_plural ""
+"@count translation strings were skipped because they contain "
+"disallowed HTML."
+msgstr[0] ""
+"@count chaîne de traduction a été ignorée car elle contient du "
+"code HTML interdit."
+msgstr[1] ""
+"@count chaînes de traduction ont été ignorées car elles "
+"contiennent du code HTML interdit."
+msgid "One translation file imported for the newly installed modules."
+msgid_plural "@count translation files imported for the newly installed modules."
+msgstr[0] ""
+"@count fichier de traduction a été importé pour le nouveau module "
+"installé."
+msgstr[1] ""
+"@count fichiers de traduction ont été importés pour les nouveaux "
+"modules installés."
+msgid "One translation file imported for the enabled modules."
+msgid_plural "@count translation files imported for the enabled modules."
+msgstr[0] "Un fichier de traduction a été importé pour le module activé."
+msgstr[1] ""
+"@count fichiers de traduction ont été importé pour les modules "
+"activés."
+msgid "Abkhazian"
+msgstr "Abkhaze"
+msgid "Avestan"
+msgstr "Avestan"
+msgid "Afrikaans"
+msgstr "Afrikaans"
+msgid "Akan"
+msgstr "Akan"
+msgid "Amharic"
+msgstr "Amharique"
+msgid "Assamese"
+msgstr "Assamese"
+msgid "Avar"
+msgstr "Avar"
+msgid "Aymara"
+msgstr "Aymara"
+msgid "Azerbaijani"
+msgstr "Azerbaïdjanais"
+msgid "Bashkir"
+msgstr "Bachkir"
+msgid "Belarusian"
+msgstr "Belorussien"
+msgid "Bihari"
+msgstr "Bihari"
+msgid "Bislama"
+msgstr "Bislama"
+msgid "Bambara"
+msgstr "Bambara"
+msgid "Bengali"
+msgstr "Bengali"
+msgid "Tibetan"
+msgstr "Tibétain"
+msgid "Breton"
+msgstr "Breton"
+msgid "Bosnian"
+msgstr "Bosniaque"
+msgid "Chechen"
+msgstr "Tchétchène"
+msgid "Chamorro"
+msgstr "Chamorro"
+msgid "Corsican"
+msgstr "Corse"
+msgid "Cree"
+msgstr "Cree"
+msgid "Old Slavonic"
+msgstr "Vieux Slave"
+msgid "Chuvash"
+msgstr "Chuvash"
+msgid "Welsh"
+msgstr "Gallois"
+msgid "Maldivian"
+msgstr "Maldivian"
+msgid "Bhutani"
+msgstr "Bhutani"
+msgid "Ewe"
+msgstr "Ewé"
+msgid "Esperanto"
+msgstr "Espéranto"
+msgid "Estonian"
+msgstr "Estonien"
+msgid "Basque"
+msgstr "Basque"
+msgid "Persian"
+msgstr "Perse"
+msgid "Fulah"
+msgstr "Fulah"
+msgid "Faeroese"
+msgstr "Féroïen"
+msgid "Frisian"
+msgstr "Frisian"
+msgid "Irish"
+msgstr "Irlandais"
+msgid "Scots Gaelic"
+msgstr "Gaéliques écossais"
+msgid "Galician"
+msgstr "Galicien"
+msgid "Guarani"
+msgstr "Guarani"
+msgid "Gujarati"
+msgstr "Gujarati"
+msgid "Manx"
+msgstr "Mannois"
+msgid "Hausa"
+msgstr "Hausa"
+msgid "Hiri Motu"
+msgstr "Hiri Motu"
+msgid "Armenian"
+msgstr "Arménien"
+msgid "Herero"
+msgstr "Herero"
+msgid "Interlingua"
+msgstr "Interlingua"
+msgid "Interlingue"
+msgstr "Interlingue"
+msgid "Igbo"
+msgstr "Igbo"
+msgid "Inupiak"
+msgstr "Inupiak"
+msgid "Icelandic"
+msgstr "Islandais"
+msgid "Inuktitut"
+msgstr "Inuktitut"
+msgid "Javanese"
+msgstr "Javanais"
+msgid "Georgian"
+msgstr "Géorgien"
+msgid "Kongo"
+msgstr "Congolais"
+msgid "Kikuyu"
+msgstr "Kikuyu"
+msgid "Kwanyama"
+msgstr "Kwanyama"
+msgid "Kazakh"
+msgstr "Kazakh"
+msgid "Greenlandic"
+msgstr "Groenlandais"
+msgid "Cambodian"
+msgstr "Cambodgien"
+msgid "Kannada"
+msgstr "Kannada"
+msgid "Kanuri"
+msgstr "Kanuri"
+msgid "Kashmiri"
+msgstr "Kashmiri"
+msgid "Kurdish"
+msgstr "Kurde"
+msgid "Cornish"
+msgstr "Cornique"
+msgid "Latin"
+msgstr "Latin"
+msgid "Luxembourgish"
+msgstr "Luxembourgeois"
+msgid "Luganda"
+msgstr "Luganda"
+msgid "Lingala"
+msgstr "Lingala"
+msgid "Laothian"
+msgstr "Laotien"
+msgid "Latvian"
+msgstr "Latvian"
+msgid "Malagasy"
+msgstr "Malgache"
+msgid "Marshallese"
+msgstr "Marshallese"
+msgid "Macedonian"
+msgstr "Macédonien"
+msgid "Malayalam"
+msgstr "Malayalam"
+msgid "Mongolian"
+msgstr "Mongolien"
+msgid "Moldavian"
+msgstr "Moldave"
+msgid "Marathi"
+msgstr "Marathi"
+msgid "Malay"
+msgstr "Malais"
+msgid "Maltese"
+msgstr "Maltais"
+msgid "Burmese"
+msgstr "Birman"
+msgid "North Ndebele"
+msgstr "Ndebele du nord"
+msgid "Nepali"
+msgstr "Népalien"
+msgid "Ndonga"
+msgstr "Ndonga"
+msgid "Norwegian Bokmål"
+msgstr "Norvégien classique"
+msgid "Norwegian Nynorsk"
+msgstr "Néo-norvégien"
+msgid "South Ndebele"
+msgstr "Ndebele du sud"
+msgid "Chichewa"
+msgstr "Chichewa"
+msgid "Occitan"
+msgstr "Occitan"
+msgid "Oromo"
+msgstr "Oromo"
+msgid "Oriya"
+msgstr "Oriya"
+msgid "Ossetian"
+msgstr "Ossète"
+msgid "Punjabi"
+msgstr "Pendjabi"
+msgid "Pali"
+msgstr "Pali"
+msgid "Pashto"
+msgstr "Pashto"
+msgid "Portuguese, Portugal"
+msgstr "Portugais, Portugal"
+msgid "Portuguese, Brazil"
+msgstr "Portugais, Brésil"
+msgid "Quechua"
+msgstr "Quechua"
+msgid "Rhaeto-Romance"
+msgstr "Rhaeto-Roman"
+msgid "Kirundi"
+msgstr "Kirundi"
+msgid "Kinyarwanda"
+msgstr "Kinyarwanda"
+msgid "Sanskrit"
+msgstr "Sanskrit"
+msgid "Sardinian"
+msgstr "Sarde"
+msgid "Sindhi"
+msgstr "Shindi"
+msgid "Northern Sami"
+msgstr "Sami Nordique"
+msgid "Sango"
+msgstr "Sango"
+msgid "Serbo-Croatian"
+msgstr "Serbo-Croate"
+msgid "Sinhala"
+msgstr "Sinhala"
+msgid "Slovenian"
+msgstr "Slovène"
+msgid "Samoan"
+msgstr "Samoan"
+msgid "Shona"
+msgstr "Shona"
+msgid "Albanian"
+msgstr "Albanais"
+msgid "Serbian"
+msgstr "Serbe"
+msgid "Siswati"
+msgstr "Siswati"
+msgid "Sesotho"
+msgstr "Sesotho"
+msgid "Sudanese"
+msgstr "Soudanais"
+msgid "Swahili"
+msgstr "Swahili"
+msgid "Tamil"
+msgstr "Tamil"
+msgid "Telugu"
+msgstr "Telugu"
+msgid "Tajik"
+msgstr "Tadjik"
+msgid "Thai"
+msgstr "Thaïlandais"
+msgid "Tigrinya"
+msgstr "Tigrinya"
+msgid "Turkmen"
+msgstr "Turkmène"
+msgid "Tagalog"
+msgstr "Tagalog"
+msgid "Setswana"
+msgstr "Setswana"
+msgid "Tsonga"
+msgstr "Tsonga"
+msgid "Tatar"
+msgstr "Tatare"
+msgid "Twi"
+msgstr "Twi"
+msgid "Tahitian"
+msgstr "Tahitien"
+msgid "Ukrainian"
+msgstr "Ukrainien"
+msgid "Urdu"
+msgstr "Urdu"
+msgid "Uzbek"
+msgstr "Ouzbek"
+msgid "Venda"
+msgstr "Venda"
+msgid "Vietnamese"
+msgstr "Vietnamien"
+msgid "Wolof"
+msgstr "Wolof"
+msgid "Xhosa"
+msgstr "Xhosa"
+msgid "Yiddish"
+msgstr "Yiddish"
+msgid "Yoruba"
+msgstr "Yoruba"
+msgid "Zhuang"
+msgstr "Zhuang"
+msgid "Chinese, Simplified"
+msgstr "Chinois, Simplifié"
+msgid "Chinese, Traditional"
+msgstr "Chinois, Traditionnel"
+msgid "Zulu"
+msgstr "Zoulou"
+msgid "Error sending e-mail (from %from to %to)."
+msgstr "Erreur à l'envoi du courriel (de %from à %to)."
+msgid "sort ascending"
+msgstr "trier par ordre croissant"
+msgid "sort descending"
+msgstr "trier par ordre décroissant"
+msgid ""
+"Operations on Unicode strings are emulated on a best-effort basis. "
+"Install the <a href=\"@url\">PHP mbstring extension</a> for improved "
+"Unicode support."
+msgstr ""
+"Les opérations sur les chaînes de caractères Unicode sont émulées "
+"le mieux possible. Installer <a href=\"@url\">l'extension PHP "
+"mbstring</a> pour une meilleure prise en charge de l'Unicode."
+msgid ""
+"Multibyte string function overloading in PHP is active and must be "
+"disabled. Check the php.ini <em>mbstring.func_overload</em> setting. "
+"Please refer to the <a href=\"@url\">PHP mbstring documentation</a> "
+"for more information."
+msgstr ""
+"La surcharge des fonctions normales par l'extension \"PHP Multibyte\" "
+"est active et doit être désactivée. Vérifiez le paramètre "
+"<em>mbstring.func_overload</em> dans le fichier php.ini. Consultez la "
+"<a href=\"@url\">documentation PHP mbstring</a> pour plus "
+"d'information."
+msgid ""
+"Multibyte string input conversion in PHP is active and must be "
+"disabled. Check the php.ini <em>mbstring.encoding_translation</em> "
+"setting. Please refer to the <a href=\"@url\">PHP mbstring "
+"documentation</a> for more information."
+msgstr ""
+"La conversion des chaînes de caractères multibyte en entrée dans "
+"PHP est active et doit être désactivée. Vérifiez le paramètre "
+"<em>mbstring.encoding_translation</em> dans le fichier php.ini. "
+"Consultez la <a href=\"@url\">documentation PHP mbstring</a> pour plus "
+"d'information."
+msgid ""
+"Multibyte string input conversion in PHP is active and must be "
+"disabled. Check the php.ini <em>mbstring.http_input</em> setting. "
+"Please refer to the <a href=\"@url\">PHP mbstring documentation</a> "
+"for more information."
+msgstr ""
+"La conversion des chaînes de caractères multibyte en entrée dans "
+"PHP est active et doit être désactivée. Vérifiez le paramètre "
+"<em>mbstring.http_input</em> dans le fichier php.ini. Consultez la <a "
+"href=\"@url\">documentation PHP mbstring</a> pour plus d'information."
+msgid ""
+"Multibyte string output conversion in PHP is active and must be "
+"disabled. Check the php.ini <em>mbstring.http_output</em> setting. "
+"Please refer to the <a href=\"@url\">PHP mbstring documentation</a> "
+"for more information."
+msgstr ""
+"La conversion des chaînes de caractères multibyte en sortie dans PHP "
+"est active et doit être désactivée. Vérifiez le paramètre "
+"<em>mbstring.http_output</em> dans le fichier php.ini. Consultez la <a "
+"href=\"@url\">documentation PHP mbstring</a> pour plus d'information."
+msgid "Standard PHP"
+msgstr "PHP standard"
+msgid "PHP Mbstring Extension"
+msgstr "Extension PHP mbstring"
+msgid "Unicode library"
+msgstr "Bibliothèque Unicode"
+msgid "Could not convert XML encoding %s to UTF-8."
+msgstr "Impossible de convertir l'encodage XML %s en UTF-8."
+msgid ""
+"Unsupported encoding %s. Please install iconv, GNU recode or mbstring "
+"for PHP."
+msgstr ""
+"Codage %s non pris en charge. Installez iconv, GNU recode ou mbstring "
+"pour PHP."
+msgid "Parse error. Not well formed"
+msgstr "Erreur d'analyse. Non conforme"
+msgid "Parse error. Request not well formed."
+msgstr "Erreur d'analyse. Requête non conforme."
+msgid "Server error. Invalid XML-RPC. Request must be a methodCall."
+msgstr ""
+"Erreur serveur. XML-RPC non conforme aux spécifications. La requête "
+"doit être un methodCall."
+msgid "Server error. Requested method @methodname not specified."
+msgstr ""
+"Erreur serveur. La méthode demandée (@methodname) n'est pas "
+"spécifiée."
+msgid "Server error. Wrong number of method parameters."
+msgstr "Erreur serveur. Nombre de paramètres erroné."
+msgid "Server error. Invalid method parameters."
+msgstr "Erreur serveur. Paramètres non valides."
+msgid "Server error. Requested function @method does not exist."
+msgstr "Erreur serveur. La méthode demandée (@method) n'existe pas."
+msgid "Invalid syntax for system.multicall."
+msgstr "Syntaxe non valide pour system.multicall."
+msgid "Recursive calls to system.multicall are forbidden."
+msgstr "Les appels récursifs de system.multicall sont interdits."
+msgid "Server error. Requested method @methodname signature not specified."
+msgstr ""
+"Erreur serveur. La signature de la méthode demandée (@methodname) "
+"n'est pas spécifiée."
+msgid "The name of the feed (or the name of the website providing the feed)."
+msgstr "Le nom du flux (ou le nom du site web fournissant le flux)."
+msgid "Categorize news items"
+msgstr "Classer les nouvelles"
+msgid "Are you sure you want to remove all items from the feed %feed?"
+msgstr ""
+"Êtes-vous sûr(e) de vouloir supprimer tous les éléments du flux "
+"%feed ?"
+msgid "checkboxes"
+msgstr "cases à cocher"
+msgid "multiple selector"
+msgstr "sélecteur multiple"
+msgid ""
+"Thousands of sites (particularly news sites and blogs) publish their "
+"latest headlines and posts in feeds, using a number of standardized "
+"XML-based formats. Formats supported by the aggregator include <a "
+"href=\"@rss\">RSS</a>, <a href=\"@rdf\">RDF</a>, and <a "
+"href=\"@atom\">Atom</a>."
+msgstr ""
+"Des milliers de sites (en particulier des sites d'information et des "
+"blogs) publient leurs derniers titres et contibutions dans des flux en "
+"utilisant des formats standardisés basés sur XML. Les formats pris "
+"en charge par l'agrégateur incluent <a href=\"@rss\">RSS</a>, <a "
+"href=\"@rdf\">RDF</a>, et <a href=\"@atom\">Atom</a>."
+msgid ""
+"Current feeds are listed below, and <a href=\"@addfeed\">new feeds may "
+"be added</a>. For each feed or feed category, the <em>latest "
+"items</em> block may be enabled at the <a href=\"@block\">blocks "
+"administration page</a>."
+msgstr ""
+"Les flux actuels sont listés ci-dessous et <a href=\"@addfeed\">de "
+"nouveaux flux peuvent être ajoutés</a>. Pour chaque flux ou "
+"catégorie de flux, le bloc des <em>derniers éléments</em> peut "
+"être activé depuis la <a href=\"@block\">page d'administration des "
+"blocs</a>."
+msgid "Add a feed in RSS, RDF or Atom format. A feed may only have one entry."
+msgstr ""
+"Ajouter un flux au format RSS, RDF ou Atom. Un flux ne peut avoir "
+"qu'une seule entrée."
+msgid ""
+"Categories allow feed items from different feeds to be grouped "
+"together. For example, several sport-related feeds may belong to a "
+"category named <em>Sports</em>. Feed items may be grouped "
+"automatically (by selecting a category when creating or editing a "
+"feed) or manually (via the <em>Categorize</em> page available from "
+"feed item listings). Each category provides its own feed page and "
+"block."
+msgstr ""
+"Les catégories permettent à des éléments de flux différents "
+"d'être regroupés. Par exemple, plusieurs flux relatifs au sport "
+"peuvent appartenir à une catégorie nommée <em>Sports</em>. Les "
+"éléments de flux peuvent être regroupés automatiquement (en "
+"sélectionnant une catégorie lors de la création ou la modification "
+"d'un flux) ou manuellement (via la page <em>Classer</em> disponible "
+"dans les listes d'éléments de flux). Chaque catégorie founit sa "
+"propre page et son propre bloc de flux."
+msgid ""
+"Configure which content your site aggregates from other sites, how "
+"often it polls them, and how they're categorized."
+msgstr ""
+"Configurer quel contenu votre site agrège à partir d'autres sites, "
+"la fréquence d'agrégation et leur catégorisation."
+msgid "Update items"
+msgstr "Mettre à jour les articles"
+msgid "Edit feed"
+msgstr "Modifier le flux"
+msgid "No blocks in this region"
+msgstr "Aucun bloc dans cette région"
+msgid ""
+"The block %info was assigned to the invalid region %region and has "
+"been disabled."
+msgstr ""
+"Le bloc %info était assigné à la région invalide %region et a "
+"été désactivé."
+msgid ""
+"The changes to these blocks will not be saved until the <em>Save "
+"blocks</em> button is clicked."
+msgstr ""
+"N'oubliez pas de cliquer sur <em>Enregistrer les blocs</em> pour "
+"confirmer les modifications apportées ici."
+msgid "Post new blog entry."
+msgstr "Poster un nouveau billet de blog."
+msgid "You are not allowed to post a new blog entry."
+msgstr "Vous n'êtes pas autorisé à poster un nouveau billet de blog."
+msgid "You have not created any blog entries."
+msgstr "Vous n'avez créé aucun billet de blog."
+msgid "!author has not created any blog entries."
+msgstr "!author n'a créé aucun billet de blog."
+msgid "No blog entries have been created."
+msgstr "Aucun billet n'a été créé."
+msgid "Blog entry"
+msgstr "Billet de blog"
+msgid "View recent blog entries"
+msgstr "Voir les billets récents"
+msgid "Read !username's latest blog entries."
+msgstr "Lire les dernières publications du blog de !username."
+msgid "!username's blog"
+msgstr "Blog de !username"
+msgid "Read the latest blog entries."
+msgstr "Lire les billets les plus récents."
+msgid ""
+"The content type for the %add-child link must be one of those selected "
+"as an allowed book outline type."
+msgstr ""
+"Le type de contenu pour le lien %add-child doit être un de ceux "
+"sélectionnés en tant que type de plan de livre autorisé."
+msgid "Save book pages"
+msgstr "Enregistrer les pages du livre"
+msgid ""
+"This book has been modified by another user, the changes could not be "
+"saved."
+msgstr ""
+"Ce livre a été modifié par un autre utilisateur, les changements ne "
+"peuvent pas être enregistrés."
+msgid "Title changed from %original to %current."
+msgstr "Le titre a été modifié de %original en %current."
+msgid "Updated book %title."
+msgstr "Livre %title mis à jour."
+msgid "book: updated %title."
+msgstr "livre : %title mis à jour."
+msgid "Update book outline"
+msgstr "Mettre à jour la structure du livre"
+msgid "Remove from book outline"
+msgstr "Retirer de la structure du livre"
+msgid "No changes were made"
+msgstr "Aucun changement n'a été effectué"
+msgid ""
+"The post has been added to the selected book. You may now position it "
+"relative to other pages."
+msgstr ""
+"La contribution a été ajoutée au livre sélectionné. Vous pouvez "
+"désormais la placer par rapport aux autres pages."
+msgid "The book outline has been updated."
+msgstr "La structure du livre a été mise à jour."
+msgid "There was an error adding the post to the book."
+msgstr "Une erreur est survenue lors de l'ajout de la contribution au livre."
+msgid ""
+"%title has associated child pages, which will be relocated "
+"automatically to maintain their connection to the book. To recreate "
+"the hierarchy (as it was before removing this page), %title may be "
+"added again using the Outline tab, and each of its former child pages "
+"will need to be relocated manually."
+msgstr ""
+"%title dispose de pages associées, lesquelles vont être déplacées "
+"automatiquement afin de maintenir leurs relations au livre. Pour "
+"recréer la hiérarchie (telle qu'elle était avant de supprimer cette "
+"page), %title peut être réintroduit en utilisant l'onglet Plan, "
+"chacune de ces pages enfants devront être déplacées manuellement."
+msgid "%title may be added to hierarchy again using the Outline tab."
+msgstr ""
+"%title peut être réintroduit dans la hiérarchie en utilisant "
+"l'onglet Structure."
+msgid "Are you sure you want to remove %title from the book hierarchy?"
+msgstr ""
+"Êtes-vous sûr(e) de vouloir retirer %title de la hiérarchie du "
+"livre ?"
+msgid "The post has been removed from the book."
+msgstr "La contribution a été retirée du livre."
+msgid "Show a printer-friendly version of this book page and its sub-pages."
+msgstr ""
+"Affiche une version imprimable de cette page de livre et de ses "
+"sous-pages."
+msgid "Show block on all pages"
+msgstr "Afficher le bloc sur toutes les pages"
+msgid "Show block only on book pages"
+msgstr "Afficher le bloc seulement sur les pages de livre"
+msgid ""
+"If <em>Show block on all pages</em> is selected, the block will "
+"contain the automatically generated menus for all of the site's books. "
+"If <em>Show block only on book pages</em> is selected, the block will "
+"contain only the one menu corresponding to the current page's book. In "
+"this case, if the current page is not in a book, no block will be "
+"displayed. The <em>Page specific visibility settings</em> or other "
+"visibility settings can be used in addition to selectively display "
+"this block."
+msgstr ""
+"Si <em>Montrer le bloc sur toutes les pages</em> est sélectionné, le "
+"bloc contiendra le menu généré automatiquement pour tous les livres "
+"du site. Si <em>Montrer le bloc seulement sur les pages de livre</em> "
+"est sélectionné, le bloc contiendra seulement le menu correspondant "
+"aux pages du livre courant. Dans ce cas, si la page courante n'est pas "
+"dans un libre, aucun bloc ne sera affiché. Les <em>Paramètres "
+"spécifiques de visibilité de livre</em> et autres paramètres de "
+"visibilité peuvent être utilisés en complément pour afficher "
+"sélectivement ce bloc."
+msgid "This is the top-level page in this book."
+msgstr "Ceci est la préface (niveau supérieur) du livre."
+msgid "No book selected."
+msgstr "Aucun livre sélectionné."
+msgid ""
+"The parent page in the book. The maximum depth for a book and all "
+"child pages is !maxdepth. Some pages in the selected book may not be "
+"available as parents if selecting them would exceed this limit."
+msgstr ""
+"La page parente dans le livre. La profondeur maximale pour un livre et "
+"toutes ses pages est !maxdepth. Des pages dans le livre sélectionné "
+"pourraient ne pas être accessibles en tant que parents si leur "
+"sélection venait à dépasser cette limite."
+msgid ""
+"%title is part of a book outline, and has associated child pages. If "
+"you proceed with deletion, the child pages will be relocated "
+"automatically."
+msgstr ""
+"%title fait partie de la structure du livre et dispose de pages "
+"enfants. Si vous procédez à sa suppression, les pages enfants seront "
+"déplacées automatiquement."
+msgid "Re-order book pages and change titles"
+msgstr "Réordonner les pages de livre et changer les titres"
+msgid "Book page"
+msgstr "Page de livre"
+msgid "Base color"
+msgstr "Couleur de base"
+msgid "Header top"
+msgstr "Haut de l'en-tête"
+msgid "Header bottom"
+msgstr "Bas de l'en-tête"
+msgid ""
+"There is not enough memory available to PHP to change this theme's "
+"color scheme. You need at least %size more. Check the <a "
+"href=\"@url\">PHP documentation</a> for more information."
+msgstr ""
+"Il n'y pas assez de mémoire pour que PHP puisse changer le schéma de "
+"couleur de ce thème. Il en faut au moins %size de plus. Jetez un œil "
+"à la <a href=\"@url\">documentation PHP</a> pour plus d'information."
+msgid "Delete the selected comments"
+msgstr "Supprimer les commentaires sélectionnés"
+msgid "Allows users to comment on and discuss published content."
+msgstr ""
+"Permet aux utilisateurs de commenter et de discuter le contenu "
+"publié."
+msgid "Example: 'website feedback' or 'product information'."
+msgstr ""
+"Exemple : « votre avis sur le site » ou « information sur les "
+"produits »."
+msgid ""
+"When listing categories, those with lighter (smaller) weights get "
+"listed before categories with heavier (larger) weights. Categories "
+"with equal weights are sorted alphabetically."
+msgstr ""
+"Lors de l'inventaire des catégories, celles ayant des poids plus "
+"légers (plus petits) apparaissent avant les catégories ayant des "
+"poids plus lourds (plus grands). Les catégories de même poids sont "
+"affichées par ordre alphabétique."
+msgid ""
+"The contact form has not been configured. <a href=\"@add\">Add one or "
+"more categories</a> to the form."
+msgstr ""
+"Le formulaire de contact n'est pas configuré. <a "
+"href=\"@add\">Ajouter une ou plusieurs catégories</a> au formulaire."
+msgid "Personal contact form"
+msgstr "Formulaire de contact personnel"
+msgid ""
+"Create a system contact form and set up categories for the form to "
+"use."
+msgstr ""
+"Créer un formulaire de contact système et configurer des catégories "
+"à utiliser pour ce formulaire."
+msgid "Edit contact category"
+msgstr "Modifier la catégorie de contact"
+msgid "Enables the use of both personal and site-wide contact forms."
+msgstr ""
+"Permet l'utilisation de formulaires de contact à la fois pour "
+"l'ensemble du site et pour chaque utilisateur."
+msgid "Database logging"
+msgstr "Journalisation en base de données"
+msgid "View events that have recently been logged."
+msgstr "Voir les événements qui ont été enregistrés récemment."
+msgid "Top 'page not found' errors"
+msgstr "Principales erreurs de type « page non trouvée »"
+msgid "View 'page not found' errors (404s)."
+msgstr "Voir les erreurs « page non trouvée » (404)."
+msgid "Top 'access denied' errors"
+msgstr "Principales erreurs de type « accès refusé »"
+msgid "View 'access denied' errors (403s)."
+msgstr "Voir les erreurs « accès refusé » (403)."
+msgid "Logs and records system events to the database."
+msgstr "Consigne les événements systèmes dans la base de données."
+msgid "No roles may use this format"
+msgstr "Aucun rôle ne peut utiliser ce format"
+msgid "Allowed HTML tags: @tags"
+msgstr "Tags HTML autorisés : @tags"
+msgid "Anchors are used to make links to other pages."
+msgstr ""
+"Les ancres sont utilisées pour établir des liens vers d'autres "
+"pages."
+msgid ""
+"By default line break tags are automatically added, so use this tag to "
+"add additional ones. Use of this tag is different because it is not "
+"used with an open/close pair like all the others. Use the extra \" /\" "
+"inside the tag to maintain XHTML 1.0 compatibility"
+msgstr ""
+"Les balises de saut de ligne sont automatiquement ajoutées par "
+"défaut, utilisez ceci pour en ajouter d'autres. L'usage de cette "
+"balise est différent car elle n'est pas utilisée avec une paire "
+"ouvrante/fermante comme les autres. Utilisez le \" /\" supplémentaire "
+"dans la balise pour conserver la compatibilité XHTML 1.0"
+msgid "Text with <br />line break"
+msgstr "Texte avec <br />saut de ligne"
+msgid ""
+"By default paragraph tags are automatically added, so use this tag to "
+"add additional ones."
+msgstr ""
+"Les balises de paragraphe sont ajoutées par défaut. Utilisez "
+"celle-ci pour en ajouter."
+msgid "Paragraph one."
+msgstr "Paragraphe un."
+msgid "Paragraph two."
+msgstr "Paragraphe deux."
+msgid "Strong"
+msgstr "Fort"
+msgid "Emphasized"
+msgstr "Accentué"
+msgid "Cited"
+msgstr "Citation"
+msgid "Coded text used to show programming source code"
+msgstr "Text codé pour afficher du code de programmation"
+msgid "Coded"
+msgstr "Codé"
+msgid "Bolded"
+msgstr "Gras"
+msgid "Italicized"
+msgstr "Italique"
+msgid "Superscripted"
+msgstr "Exposant"
+msgid "<sup>Super</sup>scripted"
+msgstr "<sup>Exp</sup>osant"
+msgid "Subscripted"
+msgstr "Indice"
+msgid "<sub>Sub</sub>scripted"
+msgstr "<sub>Ind</sub>ice"
+msgid "<abbr title=\"Abbreviation\">Abbrev.</abbr>"
+msgstr "<abbr title=\"Abrévation\">Abrév.</abbr>"
+msgid "<acronym title=\"Three-Letter Acronym\">TLA</acronym>"
+msgstr "<acronym title=\"Acronyme de Trois Lettres\">ATL</acronym>"
+msgid "Block quoted"
+msgstr "Citation longue"
+msgid "Quoted inline"
+msgstr "Citation simple"
+msgid "Table header"
+msgstr "En-tête de tableau"
+msgid "Table cell"
+msgstr "Cellule de tableau"
+msgid "Ordered list - use the &lt;li&gt; to begin each list item"
+msgstr ""
+"Liste ordonnée - utilisez &lt;li&gt; pour débuter chaque élément "
+"de la liste"
+msgid "First item"
+msgstr "Premier élément"
+msgid "Second item"
+msgstr "Second élément"
+msgid "Unordered list - use the &lt;li&gt; to begin each list item"
+msgstr ""
+"Liste non ordonnée - utilisez &lt;li&gt; pour débuter chaque "
+"élément de la liste"
+msgid ""
+"Definition lists are similar to other HTML lists. &lt;dl&gt; begins "
+"the definition list, &lt;dt&gt; begins the definition term and "
+"&lt;dd&gt; begins the definition description."
+msgstr ""
+"Les listes de définition sont similaires aux autres listes HTML. "
+"&lt;dl&gt; délimite la liste de définitions, &lt;dt&gt; délimite le "
+"terme à définir &lt;dd&gt; délimite la définition proprement dite."
+msgid "First term"
+msgstr "Premier terme"
+msgid "First definition"
+msgstr "Première définition"
+msgid "Second term"
+msgstr "Second terme"
+msgid "Second definition"
+msgstr "Seconde définition"
+msgid "Subtitle three"
+msgstr "Sous-titre trois"
+msgid "Subtitle four"
+msgstr "Sous-titre quatre"
+msgid "Subtitle five"
+msgstr "Sous-titre cinq"
+msgid "Subtitle six"
+msgstr "Sous-titre six"
+msgid "Tag Description"
+msgstr "Description de la balise"
+msgid "You Type"
+msgstr "Vous saisissez"
+msgid "You Get"
+msgstr "Vous obtenez"
+msgid "No help provided for tag %tag."
+msgstr "Aucune aide n'est fournie pour la balise %tag."
+msgid "Ampersand"
+msgstr "Et commercial"
+msgid "Quotation mark"
+msgstr "Marque de citation"
+msgid "Character Description"
+msgstr "Description du caractère"
+msgid "Lines and paragraphs break automatically."
+msgstr "Les lignes et les paragraphes vont à la ligne automatiquement."
+msgid ""
+"Lines and paragraphs are automatically recognized. The &lt;br /&gt; "
+"line break, &lt;p&gt; paragraph and &lt;/p&gt; close paragraph tags "
+"are inserted automatically. If paragraphs are not recognized simply "
+"add a couple blank lines."
+msgstr ""
+"Les lignes et les paragraphes sont reconnus automatiquement. Les "
+"balises &lt;br /&gt; saut de ligne, &lt;p&gt; paragraphe et &lt;/p&gt; "
+"fin de paragraphe sont insérées automatiquement.Si les paragraphes "
+"ne sont pas reconnus ajoutez simplement quelques lignes vides."
+msgid "Web page addresses and e-mail addresses turn into links automatically."
+msgstr ""
+"Les adresses de pages web et de courriels sont transformées en liens "
+"automatiquement."
+msgid ""
+"Configure how content input by users is filtered, including allowed "
+"HTML tags. Also allows enabling of module-provided filters."
+msgstr ""
+"Configurer comment le contenu posté par les utilisateurs est filtré, "
+"et en particulier quels tags HTML sont acceptés. Permet également "
+"d'activer les filtres fournis par des modules externes."
+msgid "Compose tips"
+msgstr "Astuces de rédaction"
+msgid "Short but meaningful name for this collection of threaded discussions."
+msgstr ""
+"Nom court (mais significatif) pour cette collection de fils de "
+"discussion."
+msgid "Description and guidelines for discussions within this forum."
+msgstr ""
+"Description et instructions pour les discussions à l'intérieur de ce "
+"forum."
+msgid ""
+"Forums are displayed in ascending order by weight (forums with equal "
+"weights are displayed alphabetically)."
+msgstr ""
+"Les forums sont affichés par ordre croissant de poids (les forums de "
+"même poids sont affichés par ordre alphabétique)."
+msgid "Short but meaningful name for this collection of related forums."
+msgstr "Nom court (mais significatif) pour cette collection de forums liés."
+msgid "Description and guidelines for forums within this container."
+msgstr ""
+"Description et instructions pour les forums à l'intérieur de ce "
+"conteneur."
+msgid ""
+"Containers are displayed in ascending order by weight (containers with "
+"equal weights are displayed alphabetically)."
+msgstr ""
+"Les conteneurs sont affichés par ordre croissant de poids  (les "
+"conteneurs de même poids sont affichés par ordre alphabétique)."
+msgid ""
+"Deleting a forum or container will also delete its sub-forums, if any. "
+"To delete posts in this forum, visit <a href=\"@content\">content "
+"administration</a> first. This action cannot be undone."
+msgstr ""
+"Supprimer un forum ou un conteneur supprimera également ses "
+"sous-forums. Pour supprimer les contributions de ce forum, visitez "
+"d'abord la page <a href=\"@content\">d'administration des "
+"contenus</a>. Cette action est irréversible."
+msgid "Default number of forum topics displayed per page."
+msgstr "Nombre de sujets affichés par défaut sur chaque page."
+msgid "Default display order for topics."
+msgstr "Ordre d'affichage par défaut des sujets de discussion."
+msgid ""
+"Containers are usually placed at the top (root) level, but may also be "
+"placed inside another container or forum."
+msgstr ""
+"Les conteneurs sont généralement placés au niveau le plus haut (la "
+"racine) de votre forum, mais peuvent également être placés à "
+"l'intérieur d'un autre conteneur ou forum."
+msgid ""
+"Forums may be placed at the top (root) level, or inside another "
+"container or forum."
+msgstr ""
+"Les forums peuvent être placés au niveau le plus haut (racine), ou "
+"à l'intérieur d'un autre conteneur ou forum."
+msgid ""
+"For more information, see the online handbook entry for <a "
+"href=\"@forum\">Forum module</a>."
+msgstr ""
+"Pour plus d'informations, consulter l'entrée du manuel en ligne pour "
+"le <a href=\"@forum\">module Forum</a>."
+msgid "Forum topic"
+msgstr "Sujet de discussion"
+msgid "You are not allowed to post new content in the forum."
+msgstr "Vous n'êtes pas autorisé à créer du contenu dans le forum."
+msgid "Manages the display of online help."
+msgstr "Gère l'affichage de l'aide en ligne."
+msgid ""
+"This page provides an overview of available translatable strings. "
+"Drupal displays translatable strings in text groups; modules may "
+"define additional text groups containing other translatable strings. "
+"Because text groups provide a method of grouping related strings, they "
+"are often used to focus translation efforts on specific areas of the "
+"Drupal interface."
+msgstr ""
+"Cette page donne un aperçu des chaînes traduites disponibles. Drupal "
+"affiche les chaînes traduisibles en groupes de texte; les modules "
+"peuvent définir des groupes de texte supplémentaires contenant "
+"d'autres chaînes traduisibles. Parce que les groupes de texte "
+"fournissent une méthode de regroupement de chaînes reliées, ils "
+"sont souvent utilisés pour concentrer les efforts de traduction sur "
+"des domaines spécifiques de l'interface de Drupal."
+msgid ""
+"Note that the <em>.po</em> files within a translation package are "
+"imported automatically (if available) when new modules or themes are "
+"enabled, or as new languages are added. Since this page only allows "
+"the import of one <em>.po</em> file at a time, it may be simpler to "
+"download and extract a translation package into your Drupal "
+"installation directory and <a href=\"@language-add\">add the "
+"language</a> (which automatically imports all <em>.po</em> files "
+"within the package). Translation packages are available for download "
+"on the <a href=\"@translations\">Drupal translation page</a>."
+msgstr ""
+"Notez que les fichiers <em>.po</em> d'un package de traduction sont "
+"importés automatiquement (si disponible) lorsque de nouveaux modules "
+"ou thèmes sont activités, ou lorsque de nouvelles langues sont "
+"ajoutées. Cette page ne permet d'importer qu'un seul fichier "
+"<em>.po</em> à la fois, et il est plus facile de télécharger et "
+"d'extraire un package de traduction dans le répertoire d'installation "
+"de Drupal, et <a href=\"@language-add\">d'ajouter la langue</a>, ce "
+"qui importe automatiquement les fichiers <em>.po</em> du package de "
+"traduction. Les packages de traduction sont disponibles sur la <a "
+"href=\"@translations\">page des traductions de Drupal</a>."
+msgid ""
+"This page exports the translated strings used by your site. An export "
+"file may be in Gettext Portable Object (<em>.po</em>) form, which "
+"includes both the original string and the translation (used to share "
+"translations with others), or in Gettext Portable Object Template "
+"(<em>.pot</em>) form, which includes the original strings only (used "
+"to create new translations with a Gettext translation editor)."
+msgstr ""
+"Cette page permet d'exporter les traductions des chaînes utilisées "
+"sur votre site. Un fichier exporté peut être au format Gettext "
+"Portable Object (<em>.po</em>), qui inclut à la fois les chaînes "
+"originales et les traductions (il est utilisé pour partager les "
+"traductions avec autrui), ou au format Gettext Portable Template "
+"(<em>.pot</em>), qui inclut les chaînes originales seulement (et "
+"permet de créer de nouvelles traductions avec l'aide d'un éditeur de "
+"traduction)."
+msgid "Built-in interface"
+msgstr "Interface utilisateur"
+msgid ""
+"This account's default language for e-mails, and preferred language "
+"for site presentation."
+msgstr ""
+"La langue par défaut de ce compte pour les courriels, et la langue "
+"préférée de présentation du site."
+msgid "This account's default language for e-mails."
+msgstr "La langue par défaut de ce compte pour les courriels."
+msgid ""
+"A path alias set for a specific language will always be used when "
+"displaying this page in that language, and takes precedence over path "
+"aliases set for <em>All languages</em>."
+msgstr ""
+"La définition d'un alias de chemin pour une langue spécifique sera "
+"toujours utilisée lors de l'affichage de cette dans cette langue et "
+"est prioritaire sur les alias de chemin définis pour <em>Toutes les "
+"langues</em>."
+msgid ""
+"Enable multilingual support for this content type. If enabled, a "
+"language selection field will be added to the editing form, allowing "
+"you to select from one of the <a href=\"!languages\">enabled "
+"languages</a>. If disabled, new posts are saved with the default "
+"language. Existing content will not be affected by changing this "
+"option."
+msgstr ""
+"Active la gestion multilingue pour ce type de contenu. Si ce "
+"paramètre est activé, un champ de sélection des langues sera "
+"ajouté au formulaire de modification, ce qui vous permettra de "
+"choisir une des <a href=\"!languages\">langues activées</a>. Si ce "
+"paramètre est désactivé, les nouveaux contenus seront enregistrés "
+"dans la langue par défaut. Les contenus existants ne seront pas "
+"affectés par un changement de ce paramètre."
+msgid "Configure languages for content and the user interface."
+msgstr "Configurer les langues du contenu et de l'interface utilisateur."
+msgid "Translate the built in interface and optionally other text."
+msgstr ""
+"Traduire l'interface utilisateur ainsi que potentiellement d'autres "
+"textes."
+msgid ""
+"Adds language handling functionality and enables the translation of "
+"the user interface to languages other than English."
+msgstr ""
+"Ajouter la prise en charge de langues et permettre la traduction de "
+"l'interface utilisateur dans d'autres langues que l'anglais."
+msgid "Submission form settings"
+msgstr "Paramètres du formulaire de contribution"
+msgid "This content type does not have a title field."
+msgstr "Ce type de contenu n'a pas de champ titre."
+msgid ""
+"The machine-readable name must contain only lowercase letters, "
+"numbers, and underscores."
+msgstr ""
+"Le nom système ne doit contenir que des lettres, des chiffres et des "
+"tirets bas."
+msgid "The human-readable name %name is already taken."
+msgstr "Le nom affiché \"%name\" est déjà utilisé."
+msgid "Are you sure you want to delete the content type %type?"
+msgstr "Voulez-vous vraiment supprimer le type de contenu « %type » ?"
+msgid "Added content type %name."
+msgstr "Type de contenu  %name ajouté."
+msgid "Changed the content type of 1 post from %old-type to %type."
+msgid_plural "Changed the content type of @count posts from %old-type to %type."
+msgstr[0] ""
+"Le type de contenu d'une publication a été changé de '%old-type' "
+"vers '%type'."
+msgstr[1] ""
+"Le type de contenu de @count publications a été changé de "
+"'%old-type' vers '%type'."
+msgid "Are you sure you want to rebuild the permissions on site content?"
+msgstr ""
+"Êtes vous sûrs de vouloir reconstruire les permissions du contenu du "
+"site ?"
+msgid ""
+"This action rebuilds all permissions on site content, and may be a "
+"lengthy process. This action cannot be undone."
+msgstr ""
+"Cette action va reconstruire toutes les permissions sur le contenu du "
+"site, et peut prendre du temps. Cette action ne peut pas être "
+"annulée."
+msgid "language"
+msgstr "langue"
+msgid "An error occurred and processing did not complete."
+msgstr "Une erreur s'est produite et le traitement ne s'est pas terminé."
+msgid ""
+"The trimmed version of your post shows what your post looks like when "
+"promoted to the main page or when exported for syndication.<span "
+"class=\"no-js\"> You can insert the delimiter \"&lt;!--break--&gt;\" "
+"(without the quotes) to fine-tune where your post gets split.</span>"
+msgstr ""
+"La version abrégée de votre contribution montre à quoi elle "
+"ressemble lorsqu'elle est promue sur la page d'accueil ou lorsqu'elle "
+"est exportée pour syndication.<span class=\"no-js\"> Vous pouvez "
+"insérer le délimiteur \"&lt;!--break--&gt;\" (sans les guillemets) "
+"pour ajuster avec finesse l'endroit où votre contribution se trouve "
+"séparée."
+msgid "Copy of the revision from %date."
+msgstr "Copie de la révision du %date."
+msgid ""
+"@type %title has been reverted back to the revision from "
+"%revision-date."
+msgstr "@type %title a été rétabli à la révision du %revision-date."
+msgid "Revision from %revision-date of @type %title has been deleted."
+msgstr ""
+"La version datée du %revision-date du contenu '%title', de type "
+"'@type', a été supprimée."
+msgid "@type: reverted %title revision %revision."
+msgstr "@type : la révision %revision de %title a été rétablie."
+msgid "The content access permissions need to be rebuilt."
+msgstr "Les permissions d'accès au contenu doivent être reconstruites."
+msgid ""
+"<strong>Configure your website</strong> Once logged in, visit the <a "
+"href=\"@admin\">administration section</a>, where you can <a "
+"href=\"@config\">customize and configure</a> all aspects of your "
+"website."
+msgstr ""
+"<strong>Configurez votre site web</strong> Une fois connecté, visitez "
+"la <a href=\"@admin\">section d'administration</a>, où vous pouvez <a "
+"href=\"@config\">personnaliser et configurer</a> tous les aspects de "
+"votre site web."
+msgid ""
+"<strong>Enable additional functionality</strong> Next, visit the <a "
+"href=\"@modules\">module list</a> and enable features which suit your "
+"specific needs. You can find additional modules in the <a "
+"href=\"@download_modules\">Drupal modules download section</a>."
+msgstr ""
+"<strong>Activez des fonctions supplémentaires</strong> Ensuite, "
+"visitez la <a href=\"@modules\">liste des modules</a> et activez les "
+"fonctionnalités qui conviennent à vos besoins spécifiques. Vous "
+"trouverez d'autres modules dans la <a "
+"href=\"@download_modules\">section de téléchargement de modules de "
+"Drupal</a>."
+msgid ""
+"<strong>Customize your website design</strong> To change the \"look "
+"and feel\" of your website, visit the <a href=\"@themes\">themes "
+"section</a>. You may choose from one of the included themes or "
+"download additional themes from the <a "
+"href=\"@download_themes\">Drupal themes download section</a>."
+msgstr ""
+"<strong>Personnaliser l'apparence de votre site web</strong> Pour "
+"changer l'apparence et le comportement de votre site web, visitez la "
+"<a href=\"@themes\">section des thèmes</a>. Vous pouvez choisir un "
+"des thèmes inclus ou télécharger d'autres thèmes dans la <a "
+"href=\"@download_themes\">section de téléchargement des thèmes de "
+"Drupal</a>."
+msgid "Rebuilding content access permissions"
+msgstr "Reconstruire les permissions d'accès au contenu"
+msgid "Content permissions have been rebuilt."
+msgstr "Les permissions d'accès au contenu ont été reconstruites."
+msgid "The content access permissions have not been properly rebuilt."
+msgstr ""
+"Les permission d'accès au contenu n'ont pas pu être reconstruites "
+"correctement."
+msgid "Add content type"
+msgstr "Ajouter un type de contenu"
+msgid "Revert to earlier revision"
+msgstr "Rétablir une version antérieure"
+msgid "Delete earlier revision"
+msgstr "Supprimer une version antérieure"
+msgid "Allows content to be submitted to the site and displayed on pages."
+msgstr "Permet de soumettre du contenu au site et de l'afficher sur les pages."
+msgid ""
+"To use OpenID you must first establish an identity on a public or "
+"private OpenID server. If you do not have an OpenID and would like "
+"one, look into one of the <a href=\"@openid-providers\">free public "
+"providers</a>. You can find out more about OpenID at <a "
+"href=\"@openid-net\">this website</a>."
+msgstr ""
+"Pour utiliser OpenID vous devez au préalable établir une identité "
+"sur un serveur OpenID public ou privé. Si vous n'avez d'OpenID et "
+"désirez en créer un, consultez un des <a "
+"href=\"@openid-providers\">fournisseurs publics gratuits</a>. Vous "
+"trouverez plus d'informations concernant OpenID sur <a "
+"href=\"@openid-net\">ce site Internet</a>."
+msgid "OpenID identities"
+msgstr "Identités OpenID"
+msgid "Allows users to log into your site using OpenID."
+msgstr ""
+"Permet aux utilisateurs de s'identifier sur votre site avec leur "
+"OpenID."
+msgid "The alias %alias is already in use in this language."
+msgstr "L'alias %alias est déjà utilisé dans ce langage."
+msgid "The alias has been saved."
+msgstr "L'alias a été enregistré."
+msgid "Are you sure you want to delete path alias %title?"
+msgstr "Êtes-vous sûr(e) de vouloir supprimer l'alias %title ?"
+msgid "Filter aliases"
+msgstr "Filtrer les alias"
+msgid ""
+"Enter the path you wish to create the alias for, followed by the name "
+"of the new alias."
+msgstr ""
+"Saisissez le chemin pour lequel vous souhaitez créer un alias, suivi "
+"du nom du nouvel alias."
+msgid "URL aliases"
+msgstr "Alias d'URL"
+msgid "Change your site's URL paths by aliasing them."
+msgstr "Modifie les URL de votre site en leur attribuant des alias."
+msgid "Edit alias"
+msgstr "Modifier l'alias"
+msgid "Delete alias"
+msgstr "Supprimer l'alias"
+msgid "Add alias"
+msgstr "Ajouter un alias"
+msgid "Allows users to rename URLs."
+msgstr "Permet aux utilisateurs de renommer les url."
+msgid ""
+"<a href=\"@drupal\">Drupal.org</a> offers <a "
+"href=\"@php-snippets\">some example PHP snippets</a>, or you can "
+"create your own with some PHP experience and knowledge of the Drupal "
+"system."
+msgstr ""
+"<a href=\"@drupal\">Drupal.org</a> offre <a "
+"href=\"@php-snippets\">quelques exemples de codes PHP</a>, ou vous "
+"pouvez créer le vôtre avec un peu d'expérience en PHP et une "
+"connaissance du système Drupal."
+msgid "You may post PHP code. You should include &lt;?php ?&gt; tags."
+msgstr ""
+"Vous pouvez utiliser du code PHP. Vous devrez inclure les tags "
+"&lt;?php ?&gt;."
+msgid "Using custom PHP code"
+msgstr "Utiliser du code PHP personnalisé"
+msgid ""
+"Custom PHP code may be embedded in some types of site content, "
+"including posts and blocks. While embedding PHP code inside a post or "
+"block is a powerful and flexible feature when used by a trusted user "
+"with PHP experience, it is a significant and dangerous security risk "
+"when used improperly. Even a small mistake when posting PHP code may "
+"accidentally compromise your site."
+msgstr ""
+"Du code PHP personnalisé peut être inséré dans certains types de "
+"contenu du site, tels les contribution et les blocs. Même si "
+"l'insertion du code PHP à l'intérieur d'un contenu ou d'un bloc est "
+"une fonctionnalité puissante et flexible pour les utilisateurs de "
+"confiance expérimentés en PHP, c'est une fonctionnalité qui "
+"présente un risque de danger significatif mis entre les mains "
+"d'utilisateurs malveillants. Même une petite erreur lors de "
+"l'inclusion du code PHP peut accidentellement compromettre votre site."
+msgid ""
+"If you are unfamiliar with PHP, SQL, or Drupal, avoid using custom PHP "
+"code within posts. Experimenting with PHP may corrupt your database, "
+"render your site inoperable, or significantly compromise security."
+msgstr ""
+"Si vous n'êtes pas familier de PHP, SQL ou Drupal, évitez d'utiliser "
+"du code PHP personnalisé dans les contributions. L'expérimentation "
+"avec PHP pourrait corrompre votre base de données, rendre votre site "
+"inopérant ou compromettre de façon significative sa sécurité."
+msgid "Notes:"
+msgstr "Notes :"
+msgid ""
+"Remember to double-check each line for syntax and logic errors "
+"<strong>before</strong> saving."
+msgstr ""
+"Souvenez-vous de vérifier par deux fois, ligne par ligne, les erreurs "
+"de syntax et de logique <strong>avant</strong> d'enregistrer."
+msgid "Statements must be correctly terminated with semicolons."
+msgstr ""
+"Les déclarations doivent être convenablement terminées par un "
+"point-virgule."
+msgid ""
+"Global variables used within your PHP code retain their values after "
+"your script executes."
+msgstr ""
+"Les variables globales utilisées au sein de votre code PHP perdurent "
+"après l'exécution de votre script."
+msgid ""
+"<code>register_globals</code> is <strong>turned off</strong>. If you "
+"need to use forms, understand and use the functions in <a "
+"href=\"@formapi\">the Drupal Form API</a>."
+msgstr ""
+"<code>register_globals</code> est <strong>désactivé</strong>. Si "
+"vous devez utiliser des formulaires, comprenez et utilisez les "
+"fonctions de l'<a href=\"@formapi\">API de formulaire Drupal</a>."
+msgid ""
+"Use a <code>print</code> or <code>return</code> statement in your code "
+"to output content."
+msgstr ""
+"Utiliser une déclaration <code>print</code> ou <code>return</code> "
+"dans votre code pour afficher du contenu."
+msgid ""
+"Develop and test your PHP code using a separate test script and sample "
+"database before deploying on a production site."
+msgstr ""
+"Développez et testez votre code PHP en utilisant un script et une "
+"base de données de test avant de déployer sur un site en production."
+msgid ""
+"Consider including your custom PHP code within a site-specific module "
+"or <code>template.php</code> file rather than embedding it directly "
+"into a post or block."
+msgstr ""
+"Envisagez plutôt d'inclure votre code PHP personnalisé au sein d'un "
+"module spécifique au site ou dans le fichier "
+"<code>template.php</code> plutôt que de l'embarquer directement dans "
+"une contribution ou un bloc."
+msgid ""
+"Be aware that the ability to embed PHP code within content is provided "
+"by the PHP Filter module. If this module is disabled or deleted, then "
+"blocks and posts with embedded PHP may display, rather than execute, "
+"the PHP code."
+msgstr ""
+"Soyez avisé que la capacité à inclure du code PHP à l'intérieur "
+"du contenu est fournie par le module PHP Filter. Si ce module est "
+"désactivé ou supprimé, alors les blocs et contributions comportant "
+"du code PHP pourraient afficher, au lieu de l'exécuter, ce code PHP."
+msgid ""
+"A basic example: <em>Creating a \"Welcome\" block that greets visitors "
+"with a simple message.</em>"
+msgstr ""
+"Un exemple de base : <em>Créer un bloc \"Bienvenue\" pour saluer les "
+"visiteurs avec un message simple.</em>"
+msgid "PHP evaluator"
+msgstr "Interpréteur PHP"
+msgid ""
+"Executes a piece of PHP code. The usage of this filter should be "
+"restricted to administrators only!"
+msgstr ""
+"Exécute un morceau de code PHP. Pour des raisons de sécurité, "
+"l'utilisation de ce filtre devrait être réservée seulement aux "
+"administrateurs !"
+msgid "Allows embedded PHP code/snippets to be evaluated."
+msgstr "Permet à du code PHP d'être évalué à l'intérieur des contenus."
+msgid "Total votes: @votes"
+msgstr "Total des votes : @votes"
+msgid "Most recent poll"
+msgstr "Sondage le plus récent"
+msgid ""
+"A <em>poll</em> is a question with a set of possible responses. A "
+"<em>poll</em>, once created, automatically provides a simple running "
+"count of the number of votes received for each response."
+msgstr ""
+"Un <em>sondage</em> est une question avec un ensemble de réponses. Un "
+"<em>sondage</em>, une fois créé, fournit automatiquement un "
+"décompte simple du nombre de votes pour chaque réponse."
+msgid "Poll status"
+msgstr "Statut du sondage"
+msgid "When a poll is closed, visitors can no longer vote for it."
+msgstr ""
+"Quand un sondage est fermé, les visiteurs ne peuvent plus y "
+"participer."
+msgid "After this period, the poll will be closed automatically."
+msgstr "Après cette période, le sondage sera automatiquement fermé."
+msgid "Negative values are not allowed."
+msgstr "Les valeurs négatives ne sont pas autorisées."
+msgid ""
+"Your vote could not be recorded because you did not select any of the "
+"choices."
+msgstr ""
+"Votre vote n'a pas pu être enregistré car vous n'avez sélectionné "
+"aucun des choix."
+msgid "Vote count"
+msgstr "Nombre de votes"
+msgid "Polls"
+msgstr "Sondages"
+msgid "Profile fields have been updated."
+msgstr "Les champs du profil ont été mis à jour."
+msgid ""
+"No fields in this category. If this category remains empty when saved, "
+"it will be removed."
+msgstr ""
+"Aucun champ dans cette catégorie. Si cette catégorie reste vide au "
+"moment de l'enregistrement elle sera supprimée."
+msgid ""
+"The name of the field. The form name is not shown to the user but used "
+"internally in the HTML code and URLs.\n"
+"Unless you know what you are doing, it is highly recommended that you "
+"prefix the form name with <code>profile_</code> to avoid name clashes "
+"with other fields. Spaces or any other special characters except dash "
+"(-) and underscore (_) are not allowed. An example name is "
+"\"profile_favorite_color\" or perhaps just \"profile_color\"."
+msgstr ""
+"Le nom du champ. Le nom du formulaire n'est pas montré à "
+"l'utilisateur, mais utilisé en interne dans le code HTML et les "
+"URL.\r\n"
+"Sauf si vous savez ce que vous faites, il est fortement recommandé de "
+"préfixer le nom du formulaire avec <code>profile_</code>, de manière "
+"à éviter des conflits de nommage avec d'autres champs. Les espaces "
+"ou tout autre caractère, à l'exception du trait d'union (-) et du "
+"tiret bas (_), sont interdits. Exemple de nom : "
+"\"profile_couleur_favorite\" ou plus simplement \"profile_couleur\"."
+msgid ""
+"A list of all options. Put each option on a separate line. Example "
+"options are \"red\", \"blue\", \"green\", etc."
+msgstr ""
+"Une liste de toutes les options. Mettre une option par ligne. Un "
+"exemple d'option est  \"rouge\", \"bleu\", \"vert\", etc."
+msgid ""
+"Hidden profile field, only accessible by administrators, modules and "
+"themes."
+msgstr ""
+"Champ caché du Profile, accessible seulement aux administrateurs, "
+"modules et thèmes."
+msgid "Private field, content only available to privileged users."
+msgstr "Champ privé, contenu seulement visible aux utilisateurs autorisés."
+msgid ""
+"Public field, content shown on profile page but not used on member "
+"list pages."
+msgstr ""
+"Champ public, contenu affiché sur la page de Profile mais non "
+"utilisé sur les pages de liste de membres."
+msgid "Public field, content shown on profile page and on member list pages."
+msgstr ""
+"Champ public, contenu affiché sur la page de Profile et sur les pages "
+"de liste de membres"
+msgid ""
+"The weights define the order in which the form fields are shown. "
+"Lighter fields \"float up\" towards the top of the category."
+msgstr ""
+"Les poids définissent l'ordre dans lequel les champs sont affichés "
+"dans le formulaire. Les champs les plus \"légers\" remontent vers le "
+"sommet de la catégorie."
+msgid "Form will auto-complete while user is typing."
+msgstr ""
+"Le formulaire se complétera automatiquement à mesure de la saisie de "
+"l'utilisateur."
+msgid ""
+"For security, auto-complete will be disabled if the user does not have "
+"access to user profiles."
+msgstr ""
+"Pour des raisons de sécurité, l'auto-complétion sera désactivée "
+"pour les utilisateurs n'ayant pas accès aux profils utilisateurs."
+msgid ""
+"The specified form name contains one or more illegal characters. "
+"Spaces or any other special characters except dash (-) and underscore "
+"(_) are not allowed."
+msgstr ""
+"Le nom de formulaire saisi contient un ou plusieurs caractères "
+"interdits. Les espaces ou tout autre caractère, à l'exception du "
+"trait d'union (-) et du tiret bas (_), ne sont pas autorisés."
+msgid "The specified form name is reserved for use by Drupal."
+msgstr "Le nom de formulaire spécifié est réservé par Drupal."
+msgid "The specified category name is reserved for use by Drupal."
+msgstr "Le nom de catégorie spécifié est réservé par Drupal."
+msgid "The specified title is already in use."
+msgstr "Le titre spécifié est déjà utilisé."
+msgid "The specified name is already in use."
+msgstr "Le nom spécifié est déjà utilisé."
+msgid "A hidden field cannot be required."
+msgstr "Un champ caché ne peut être requis."
+msgid "A hidden field cannot be set to visible on the user registration form."
+msgstr ""
+"Un champ caché ne peut être défini comme visible sur le formulaire "
+"d'inscription."
+msgid "The field has been created."
+msgstr "Le champ a été créé."
+msgid "Are you sure you want to delete the field %field?"
+msgstr "Êtes-vous sûr(e) de vouloir supprimer le champ %field ?"
+msgid ""
+"This action cannot be undone. If users have entered values into this "
+"field in their profile, these entries will also be deleted. If you "
+"want to keep the user-entered data, instead of deleting the field you "
+"may wish to <a href=\"@edit-field\">edit this field</a> and change it "
+"to a hidden profile field so that it may only be accessed by "
+"administrators."
+msgstr ""
+"Cette action est irréversible. Si les utilisateurs ont entré des "
+"valeurs pour ce champ dans leur Profil, ces valeurs seront également "
+"supprimées. Si vous souhaitez conserver les informations saisies par "
+"les utilisateurs, vous pouvez au lieu de supprimer le champ, l'<a "
+"href=\"@edit-field\">modifier</a> et le changer en champ de profile "
+"caché pour qu'il ne soit accessible qu'aux administrateurs."
+msgid "The field %field has been deleted."
+msgstr "Le champ %field a été supprimé."
+msgid "Profile field %field added under category %category."
+msgstr ""
+"Le champ de profil %field  a été ajouté dans la catégorie "
+"%category."
+msgid "Profile field %field deleted."
+msgstr "Le champ de profil %field a été supprimé."
+msgid "User list"
+msgstr "Liste des utilisateurs"
+msgid "single-line textfield"
+msgstr "champ de texte d'une seule ligne"
+msgid "multi-line textfield"
+msgstr "champ de texte multiligne"
+msgid "checkbox"
+msgstr "case à cocher"
+msgid "list selection"
+msgstr "liste de sélection"
+msgid "freeform list"
+msgstr "liste libre"
+msgid "Author information"
+msgstr "Informations sur l'auteur"
+msgid "Link to full user profile"
+msgstr "Lien vers le profil utilisateur complet"
+msgid "Profile fields to display"
+msgstr "Champs du profil à afficher"
+msgid ""
+"Select which profile fields you wish to display in the block. Only "
+"fields designated as public in the <a href=\"@profile-admin\">profile "
+"field configuration</a> are available."
+msgstr ""
+"Choisissez les champs de profil que vous souhaitez afficher dans le "
+"bloc. Seuls les champs indiqués comme publics dans la <a "
+"href=\"@profile-admin\">page de configuration du champ</a> sont "
+"disponibles."
+msgid "View full user profile"
+msgstr "Voir le profil utilisateur complet"
+msgid "About %name"
+msgstr "À propos de %name"
+msgid ""
+"Put each item on a separate line or separate them by commas. No HTML "
+"allowed."
+msgstr ""
+"Mettre chaque élément sur une ligne séparée ou les séparer par "
+"une virgule. Le HTML n'est pas autorisé."
+msgid "The value provided for %field is not a valid URL."
+msgstr "La valeur fournie pour %field n'est pas une URL valide."
+msgid "Create customizable fields for your users."
+msgstr "Créer des champs personnalisables pour vos utilisateurs."
+msgid "Profile category autocomplete"
+msgstr "Autocomplétion de la catégorie de profil."
+msgid "Edit field"
+msgstr "Modifier le champ"
+msgid "Delete field"
+msgstr "Supprimer le champ"
+msgid "Profile autocomplete"
+msgstr "Autocomplétion du profil"
+msgid "Supports configurable user profiles."
+msgstr "Gère des profils utilisateurs configurables."
+msgid "The index will be rebuilt."
+msgstr "L'index va être reconstruit."
+msgid "Indexing status"
+msgstr "Statut de l'indexation"
+msgid "Indexing throttle"
+msgstr "Seuil d'indexation"
+msgid "Number of items to index per cron run"
+msgstr "Nombre d'éléments à indexer par tâche cron"
+msgid ""
+"The maximum number of items indexed in each pass of a <a "
+"href=\"@cron\">cron maintenance task</a>. If necessary, reduce the "
+"number of items to prevent timeouts and memory errors while indexing."
+msgstr ""
+"Le nombre maximum d'éléments indexés lors de chaque passe d'une <a "
+"href=\"@cron\">tâche cron de maintenance</a>. Si nécessaire, "
+"réduire le nombre d'éléments peut prévenir des dépassements de "
+"temps ou de mémoire causant une erreur lors de l'indexation."
+msgid "Indexing settings"
+msgstr "Paramètres d'indexation"
+msgid ""
+"<p><em>Changing the settings below will cause the site index to be "
+"rebuilt. The search index is not cleared but systematically updated to "
+"reflect the new settings. Searching will continue to work but new "
+"content won't be indexed until all existing content has been "
+"re-indexed.</em></p><p><em>The default settings should be appropriate "
+"for the majority of sites.</em></p>"
+msgstr ""
+"<p><em>Changer les réglages suivants aura pour effet de recréer une "
+"indexation du site. L'index de recherche n'est pas initialisé mais "
+"systématiquement mis à jour pour refléter les nouveaux réglages. "
+"La recherche continuera à fonctionner mais les nouveaux contenus ne "
+"seront pas indexés jusqu'à que le contenu existant soit "
+"réindexé.</em></p><p><em>Les réglages par défaut devraient être "
+"idoine pour la plupart des sites.</em></p>"
+msgid "Minimum word length to index"
+msgstr "Taille minimale des mots à indexer"
+msgid ""
+"The number of characters a word has to be to be indexed. A lower "
+"setting means better search result ranking, but also a larger "
+"database. Each search query must contain at least one keyword that is "
+"this size (or longer)."
+msgstr ""
+"Le nombre de caractères qu'un mot doit avoir pour être indexé. Un "
+"paramètre plus faible signifie un meilleur classement des résultats "
+"de recherche, mais aussi une base de données plus grande. Chaque "
+"recherche doit contenir au moins un mot clé de cette taille (ou plus "
+"grand)."
+msgid "Simple CJK handling"
+msgstr "Gestion CJK simple"
+msgid ""
+"Whether to apply a simple Chinese/Japanese/Korean tokenizer based on "
+"overlapping sequences. Turn this off if you want to use an external "
+"preprocessor for this instead. Does not affect other languages."
+msgstr ""
+"Appliquer ou non un indicateur simple Chinois/Japonais/Coréen basé "
+"sur des séquences imbriquées. Désactivez cette option si vous "
+"voulez utiliser un préprocesseur externe pour faire cela. Cela "
+"n'affecte pas les autres langues."
+msgid ""
+"The search engine maintains an index of words found in your site's "
+"content. To build and maintain this index, a correctly configured <a "
+"href=\"@cron\">cron maintenance task</a> is required. Indexing "
+"behavior can be adjusted using the settings below."
+msgstr ""
+"Le moteur de recherche maintient un index des mots trouvés dans le "
+"contenu de votre site. Pour construire et maintenir cet index, <a "
+"href=\"@cron\">une tâche cron de maintenance</a> doit être "
+"correctement configuré. Le procédé d'indexation peut être ajusté "
+"en utilisant les réglages suivants."
+msgid "Search form"
+msgstr "Formulaire de recherche"
+msgid "Top search phrases"
+msgstr "Phrases les plus recherchées"
+msgid "View most popular search phrases."
+msgstr "Voir les phrases les plus recherchées."
+msgid "Enables site-wide keyword searching."
+msgstr "Permet la recherche par mots-clés dans l'ensemble du site."
+msgid "Total page generation time"
+msgstr "Temps total de génération de la page"
+msgid "%time ms"
+msgstr "%time ms"
+msgid "Top pages in the past %interval"
+msgstr "Top des pages depuis %interval"
+msgid "Top visitors in the past %interval"
+msgstr "Top des visiteurs depuis %interval"
+msgid "Top referrers in the past %interval"
+msgstr "Top des références depuis %interval"
+msgid "Log each page access. Required for referrer statistics."
+msgstr ""
+"Journalise chaque accès de page. Nécessaire pour les statistiques de "
+"références."
+msgid ""
+"Older access log entries (including referrer statistics) will be "
+"automatically discarded. (Requires a correctly configured <a "
+"href=\"@cron\">cron maintenance task</a>.)"
+msgstr ""
+"Les vielles entrées du journal d'accès (les statistiques sur les "
+"référants incluses) seront automatiquement supprimées. (Requiert "
+"une <a href=\"@cron\"> tâche cron de maintenance </a> correctement "
+"configurée.)"
+msgid "Content viewing counter settings"
+msgstr "Paramètres du compteur de visualisation de contenu"
+msgid "Count content views"
+msgstr "Compter le nombre d'affichage des contenus"
+msgid "Increment a counter each time content is viewed."
+msgstr "Incrémenter un compteur à chaque fois qu'un contenu est visualisé."
+msgid ""
+"Settings for the statistical information that Drupal will keep about "
+"the site. See <a href=\"@statistics\">site statistics</a> for the "
+"actual information."
+msgstr ""
+"Paramètres pour l'information statistique que Drupal conservera à "
+"propos du site. Voir les <a href=\"@statistics\">statistiques du "
+"site</a> pour l'information réelle."
+msgid "This page displays the site's most recent hits."
+msgstr "Cette page affiche l'activité récente du site."
+msgid ""
+"This page displays all external referrers, or external references to "
+"your website."
+msgstr ""
+"Cette page affiche tous les référents externes ou toutes les "
+"références externes à votre site."
+msgid ""
+"When you ban a visitor, you prevent the visitor's IP address from "
+"accessing your site. Unlike blocking a user, banning a visitor works "
+"even for anonymous users. This is most commonly used to block "
+"resource-intensive bots or web crawlers."
+msgstr ""
+"Quand vous bannissez un visiteur, vous empêchez son adresse IP "
+"d'accéder à votre site. À la différence du blocage d'utilisateur, "
+"le bannissement d'un visiteur fonctionne aussi sur les anonymes. C'est "
+"la solution la plus communément utilisée pour empêcher l'accès "
+"intensif des robots ou des agents."
+msgid "Popular content"
+msgstr "Contenu populaire"
+msgid "How many content items to display in \"all time\" list."
+msgstr ""
+"Nombre d'éléments de contenu afficher dans la liste « depuis "
+"toujours »."
+msgid "How many content items to display in \"recently viewed\" list."
+msgstr ""
+"Nombre d'éléments de contenu afficher dans la liste « vu "
+"récemment »."
+msgid "Today's:"
+msgstr "Aujourd'hui :"
+msgid "All time:"
+msgstr "Depuis toujours :"
+msgid "Last viewed:"
+msgstr "Dernier accès :"
+msgid "View pages that have recently been visited."
+msgstr "Voir les pages qui ont été récemment visitées."
+msgid "View pages that have been hit frequently."
+msgstr "Voir les pages qui ont été fréquemment consultées."
+msgid "Top visitors"
+msgstr "Top des visiteurs"
+msgid "View visitors that hit many pages."
+msgstr "Afficher les visiteurs qui accèdent à de nombreuses pages."
+msgid "Top referrers"
+msgstr "Top des référents"
+msgid "View top referrers."
+msgstr "Voir le top des référents"
+msgid "View access log."
+msgstr "Voir le journal des accès."
+msgid "Track page visits"
+msgstr "Suivre les visites des pages"
+msgid "Logs access statistics for your site."
+msgstr "Enregistre les statistiques d'accès à votre site."
+msgid "Logs and records system events to syslog."
+msgstr "Enregistre les évements systèmes dans le syslog."
+msgid "User pictures in posts"
+msgstr "Portrait des utilisateurs dans les contributions"
+msgid "User pictures in comments"
+msgstr "Portrait des utilisateurs dans les commentaires"
+msgid "Shortcut icon"
+msgstr "Icône de raccourci"
+msgid "Logo image settings"
+msgstr "Paramètres du logo"
+msgid "If toggled on, the following logo will be displayed."
+msgstr "Si cette case est cochée, le logo suivant sera affiché."
+msgid "Use the default logo"
+msgstr "Utiliser le logo par défaut"
+msgid "Check here if you want the theme to use the logo supplied with it."
+msgstr "Cochez si vous voulez que le thème utilise son logo par défaut."
+msgid ""
+"The path to the file you would like to use as your logo file instead "
+"of the default logo."
+msgstr ""
+"Chemin vers le logo que vous voulez utiliser à la place du logo par "
+"défaut."
+msgid "Upload logo image"
+msgstr "Envoyer le logo"
+msgid "Shortcut icon settings"
+msgstr "Paramètres de l'icône de raccourci"
+msgid ""
+"Your shortcut icon, or 'favicon', is displayed in the address bar and "
+"bookmarks of most browsers."
+msgstr ""
+"Votre icône de raccourci ou 'favicon' est affichée dans la barre "
+"d'adresse et les favoris de la plupart des navigateurs."
+msgid "Use the default shortcut icon."
+msgstr "Utiliser l'icône de raccourci par défaut."
+msgid "Check here if you want the theme to use the default shortcut icon."
+msgstr ""
+"Cocher ceci si vous souhaitez que le thème utilise l'icône de "
+"raccourci par défaut."
+msgid ""
+"The path to the image file you would like to use as your custom "
+"shortcut icon."
+msgstr ""
+"Le chemin du fichier image que vous souhaitez utiliser comme icône de "
+"raccourci personnalisée."
+msgid "Upload icon image"
+msgstr "Transférer l'icône"
+msgid ""
+"If you don't have direct file access to the server, use this field to "
+"upload your shortcut icon."
+msgstr ""
+"Si vous n'avez pas un accès direct au serveur, utilisez ce champ pour "
+"transférer votre icône de raccourci."
+msgid "@module (<span class=\"admin-missing\">missing</span>)"
+msgstr "@module (<span class=\"admin-missing\">manquant</span>)"
+msgid ""
+"The following modules will be completely uninstalled from your site, "
+"and <em>all data from these modules will be lost</em>!"
+msgstr ""
+"Les modules suivants vont être complètement désinstallés de votre "
+"site, et <em>toutes les données de ces modules seront perdues</em> !"
+msgid "Confirm uninstall"
+msgstr "Confirmer la désinstallation"
+msgid "Would you like to continue with uninstalling the above?"
+msgstr ""
+"Voulez-vous procéder à la désinstallation des éléments "
+"ci-dessus ?"
+msgid "No modules selected."
+msgstr "Aucun module sélectionné."
+msgid "The selected modules have been uninstalled."
+msgstr "Les modules sélectionnés ont été désinstallés."
+msgid "Default 403 (access denied) page"
+msgstr "Page 403 par défaut (accès refusé)"
+msgid "Default 404 (not found) page"
+msgstr "Page 404 par défaut (page non trouvée)"
+msgid "Caches cleared."
+msgstr "Les caches ont été vidés."
+msgid "Select an image processing toolkit"
+msgstr "Sélectionnez une boîte à outils de traitement d'image"
+msgid "Number of items in each feed"
+msgstr "Nombre d'éléments pour chaque flux"
+msgid "Default number of items to include in each feed."
+msgstr "Le nombre d'éléments par défaut à inclure dans chaque flux."
+msgid "Feed content"
+msgstr "Contenu du flux"
+msgid "Titles plus teaser"
+msgstr "Titres et accroches"
+msgid "Global setting for the default display of content items in each feed."
+msgstr ""
+"Paramètres globaux pour l'affichage, par défaut, du contenu de "
+"chaque flux."
+msgid "Cron ran successfully."
+msgstr "La tâche planifiée (cron) a réussi."
+msgid "Cron run failed."
+msgstr "La tâche planifiée (cron) a échoué."
+msgid "No modules are available to uninstall."
+msgstr "Aucun module ne peut être désinstallé."
+msgid ""
+"This theme requires PHP version @php_required and is incompatible with "
+"PHP version !php_version."
+msgstr ""
+"Ce thème requiert la version @php_required de PHP et est incompatible "
+"avec la version !php_version de PHP."
+msgid ""
+"This page shows you all available administration tasks for each "
+"module."
+msgstr ""
+"Cette page liste les tâches d'administration disponibles pour chaque "
+"module."
+msgid ""
+"These options control the default display settings for your entire "
+"site, across all themes. Unless they have been overridden by a "
+"specific theme, these settings will be used."
+msgstr ""
+"Ces options permettent de contrôler l'aspect général de votre site, "
+"quelque soit le thème. A moins que ces paramètres généraux soient "
+"modifiés par la configuration d'un thème spécifique, ce sont eux "
+"qui seront utilisés par défaut."
+msgid ""
+"The <em>Powered by Drupal</em> block is an optional link to the home "
+"page of the Drupal project. While there is absolutely no requirement "
+"that sites feature this link, it may be used to show support for "
+"Drupal."
+msgstr ""
+"Le bloc <em>Powered by Drupal</em> est un lien optionnel vers la page "
+"d'accueil du projet Drupal. Même s'il n'est absolument pas "
+"obligatoire d'afficher ce lien, cela reste un moyen de promouvoir "
+"Drupal."
+msgid ""
+"Here you can find a short overview of your site's parameters as well "
+"as any problems detected with your installation. It may be useful to "
+"copy and paste this information into support requests filed on "
+"drupal.org's support forums and project issue queues."
+msgstr ""
+"Vous trouverez ici un rapide aperçu des paramètres de votre site "
+"Drupal ainsi que les problèmes détectés dans votre installation. Il "
+"est utile de copier-coller ces informations quand vous demandez de "
+"l'aide sur les forums de drupalfr.org ou sur le système de gestion de "
+"tickets de drupal.org."
+msgid "Powered by Drupal"
+msgstr "Propulsé par Drupal"
+msgid "Could not delete temporary file \"%path\" during garbage collection"
+msgstr ""
+"Impossible de supprimer le fichier temporaire \"%path\" pendant "
+"l'opération de nettoyage"
+msgid "Compact mode"
+msgstr "Mode compact"
+msgid "Tell Drupal where to store uploaded files and how they are accessed."
+msgstr ""
+"Indiquer à Drupal où stocker les fichiers transférés et la "
+"manière d'y accéder."
+msgid "Image toolkit"
+msgstr "Boîte à outils image"
+msgid ""
+"Choose which image toolkit to use if you have installed optional "
+"toolkits."
+msgstr ""
+"Choisir quelle boîte à outils image utiliser si vous avez installé "
+"des boîtes à outils optionnelles."
+msgid "RSS publishing"
+msgstr "Publication RSS"
+msgid "Date and time"
+msgstr "Date et heure"
+msgid "Date and time lookup"
+msgstr "Consultation de date et heure"
+msgid "Enable or disable clean URLs for your site."
+msgstr "Activer ou désactiver les URL simplifiées pour votre site."
+msgid "Clean URL check"
+msgstr "Test des URL simplifiées"
+msgid ""
+"Get a status report about your site's operation and any detected "
+"problems."
+msgstr ""
+"Obtenir un rapport du fonctionnement de votre site et des problèmes "
+"détectés."
+msgid "-1 (Unlimited)"
+msgstr "-1 (infini)"
+msgid ""
+"Your PHP installation is too old. Drupal requires at least PHP "
+"%version."
+msgstr ""
+"Votre version de PHP est trop ancienne. Drupal nécessite au moins la "
+"version %version de PHP."
+msgid "PHP register globals"
+msgstr "PHP 'register globals'"
+msgid ""
+"<em>register_globals</em> is enabled. Drupal requires this "
+"configuration directive to be disabled. Your site may not be secure "
+"when <em>register_globals</em> is enabled. The PHP manual has "
+"instructions for <a href=\"http://php.net/configuration.changes\">how "
+"to change configuration settings</a>."
+msgstr ""
+"La directive <em>register_globals</em> est activée. Drupal nécessite "
+"que cette directive soit desactivée. Votre site peut en effet être "
+"à risque si <em>register_globals</em> est activée. Vous trouverez "
+"les instructions nécessaires <a "
+"href=\"http://php.net/configuration.changes\">pour changer les "
+"paramètres de configuration</a> dans le manuel PHP."
+msgid "Enabled ('@value')"
+msgstr "Activé ('@value')"
+msgid "PHP memory limit"
+msgstr "Plafond mémoire de PHP"
+msgid ""
+"Consider increasing your PHP memory limit to %memory_minimum_limit to "
+"help prevent errors in the installation process."
+msgstr ""
+"Envisagez d'augmenter le plafond mémoire de PHP à "
+"%memory_minimum_limit pour éviter les erreurs durant le processus "
+"d'installation."
+msgid ""
+"Consider increasing your PHP memory limit to %memory_minimum_limit to "
+"help prevent errors in the update process."
+msgstr ""
+"Envisagez d'augmenter le plafond mémoire de PHP à "
+"%memory_minimum_limit pour éviter les erreurs durant le processus "
+"d'installation."
+msgid ""
+"Depending on your configuration, Drupal can run with a %memory_limit "
+"PHP memory limit. However, a %memory_minimum_limit PHP memory limit or "
+"above is recommended, especially if your site uses additional custom "
+"or contributed modules."
+msgstr ""
+"En fonction de votre configuration, Drupal peut fonctionner avec un "
+"plafond mémoire de PHP de %memory_limit. Un plafond de "
+"%memory_minimum_limit ou supérieur est néanmoins recommandé, en "
+"particulier si votre site utiliser des modules additionnels."
+msgid ""
+"Increase the memory limit by editing the memory_limit parameter in the "
+"file %configuration-file and then restart your web server (or contact "
+"your system administrator or hosting provider for assistance)."
+msgstr ""
+"Augmentez le plafond mémoire de PHP en éditant le paramètre "
+"memory_limit dans le fichier de configuration %configuration-file et "
+"redémarrez votre serveur web (ou contactez votre administrateur "
+"système ou votre fournisseur d'hébergement pour cela)."
+msgid ""
+"Contact your system administrator or hosting provider for assistance "
+"with increasing your PHP memory limit."
+msgstr ""
+"Contactez votre administrateur système ou votre fournisseur "
+"d'hébergement pour augmenter le plafond mémoire de PHP."
+msgid "See the <a href=\"@url\">Drupal requirements</a> for more information."
+msgstr ""
+"Consultez <a href=\"@url\">les pré-requis de Drupal</a> pour plus "
+"d'informations."
+msgid "Not protected"
+msgstr "Non protégé."
+msgid ""
+"The file %file is not protected from modifications and poses a "
+"security risk. You must change the file's permissions to be "
+"non-writable."
+msgstr ""
+"Le fichier %file n'est pas protégé en écriture et cela pose un "
+"problème de sécurité. Vous devez changer les permissions du fichier "
+"pour qu'il ne soit pas accessible en écriture."
+msgid ""
+"For more information, see the online handbook entry for <a "
+"href=\"@cron-handbook\">configuring cron jobs</a>."
+msgstr ""
+"Pour plus d'informations reportez-vous à l'entrée sur <a "
+"href=\"@cron-handbook\">la configuration du Cron</a> du manuel en "
+"ligne."
+msgid "Cron has not run recently."
+msgstr "Cron n'a pas été lancé récemment."
+msgid "Cron maintenance tasks"
+msgstr "Tâches planifiées (cron) de maintenance"
+msgid "You can <a href=\"@cron\">run cron manually</a>."
+msgstr "Vous pouvez <a href=\"@cron\">lancer le cron manuellement</a>."
+msgid "The directory %directory is not writable."
+msgstr "Le répertoire %directory n'est pas accessible en écriture."
+msgid ""
+"You may need to set the correct directory at the <a "
+"href=\"@admin-file-system\">file system settings page</a> or change "
+"the current directory's permissions so that it is writable."
+msgstr ""
+"Il est possible que vous deviez définir un répertoire correct sur la "
+"<a href=\"@admin-file-system\">page des paramètres du système de "
+"fichiers</a> ou changer les permissions du répertoire actuel pour "
+"qu'il soit autorisé en écriture."
+msgid "Writable (<em>public</em> download method)"
+msgstr "Inscriptible (méthode de téléchargement <em>publique</em>)"
+msgid "Writable (<em>private</em> download method)"
+msgstr "Inscriptible (méthode de téléchargement <em>privée</em>)"
+msgid "Database updates"
+msgstr "Mises à jour de la base de données"
+msgid ""
+"Some modules have database schema updates to install. You should run "
+"the <a href=\"@update\">database update script</a> immediately."
+msgstr ""
+"Certains modules nécessitent des modifications du schéma de base de "
+"données. Vous devriez lancer <a href=\"@update\">le script de mise à "
+"jour de la base de données</a> immédiatement."
+msgid ""
+"The update.php script is accessible to everyone without authentication "
+"check, which is a security risk. You must change the "
+"$update_free_access value in your settings.php back to FALSE."
+msgstr ""
+"Le script update.php est accessible à tout le monde sans "
+"vérification, ce qui représente un risque de sécurité. Vous devez "
+"attribuer à FALSE la valeur de la variable $update_free_access dans "
+"votre fichier settings.php."
+msgid "Access to update.php"
+msgstr "Accéder à update.php"
+msgid "Handles general site configuration for administrators."
+msgstr ""
+"Permet aux administrateurs de modifier la configuration générale du "
+"site."
+msgid "Reset to alphabetical"
+msgstr "Rétablir l'ordre alphabétique"
+msgid "Terms are displayed in ascending order by weight."
+msgstr "Les termes sont affichés par ordre croissant de poids."
+msgid "Weight value must be numeric."
+msgstr "Le poids doit être numérique."
+msgid ""
+"Are you sure you want to reset the vocabulary %title to alphabetical "
+"order?"
+msgstr ""
+"Êtes-vous sûr de vouloir rétablir l'ordre alphabétique du "
+"vocabulaire %title ?"
+msgid ""
+"Resetting a vocabulary will discard all custom ordering and sort items "
+"alphabetically."
+msgstr ""
+"La réinitialisation d'un vocabulaire annulera l'ordre personnalisé "
+"et organisera les éléments par ordre alphabétique."
+msgid "Reset vocabulary %name to alphabetical order."
+msgstr "Réinitialiser le vocabulaire '%name' par ordre alphabétique."
+msgid ""
+"Translations of a piece of content are managed with translation sets. "
+"Each translation set has one source post and any number of "
+"translations in any of the <a href=\"!languages\">enabled "
+"languages</a>. All translations are tracked to be up to date or "
+"outdated based on whether the source post was modified significantly."
+msgstr ""
+"Les traductions d'un contenu sont gérées par ensembles de "
+"traductions. Chaque ensemble de traductions possède une contribution "
+"source et autant de traductions que de <a href=\"!languages\">langues "
+"activées</a>. Toutes les traductions sont marquées comme à jour ou "
+"périmées en fonction de l'importance des modifications sur la "
+"contribution source."
+msgid "Translation settings"
+msgstr "Paramètres de traduction"
+msgid "Flag translations as outdated"
+msgstr "Périmer toutes les traductions"
+msgid ""
+"If you made a significant change, which means translations should be "
+"updated, you can flag all translations of this post as outdated. This "
+"will not change any other property of those posts, like whether they "
+"are published or not."
+msgstr ""
+"Si vous faites des changements significatifs, qui nécessiteront une "
+"mise à jour des traductions, vous pouvez indiquer que toutes les "
+"traductions liées à cette contribution sont périmées. Cela ne "
+"changera aucune des propriétés de ce contenu, notamment son état de "
+"publication."
+msgid "This translation needs to be updated"
+msgstr "Cette traduction doit être mise à jour"
+msgid ""
+"When this option is checked, this translation needs to be updated "
+"because the source post has changed. Uncheck when the translation is "
+"up to date again."
+msgstr ""
+"Lorsque cette option est cochée, la traduction doit être mise à "
+"jour car la source de la contribution a changé. Décocher quand la "
+"traduction est à nouveau à jour."
+msgid "Content translation"
+msgstr "Traduction du contenu"
+msgid "Allows content to be translated into different languages."
+msgstr "Permet au contenu d'être traduit dans plusieurs langues."
+msgid "Unknown release date"
+msgstr "Date de publication inconnue"
+msgid "Last checked: @time ago"
+msgstr "Dernière vérification : il y a @time"
+msgid "Last checked: never"
+msgstr "Dernière vérification : jamais"
+msgid "Includes: %includes"
+msgstr "Contient : %includes"
+msgid "Disabled modules"
+msgstr "Modules désactivés"
+msgid "Disabled themes"
+msgstr "Thèmes désactivés"
+msgid ""
+"Select how frequently you want to automatically check for new releases "
+"of your currently installed modules and themes."
+msgstr ""
+"Sélectionnez la fréquence de vérification des mises a jour des "
+"modules et thèmes actuellement installés sur votre site."
+msgid "E-mail notification threshold"
+msgstr "Seuil de notification de courriel"
+msgid ""
+"You can choose to send e-mail only if a security update is available, "
+"or to be notified about all newer versions. If there are updates "
+"available of Drupal core or any of your installed modules and themes, "
+"your site will always print a message on the <a "
+"href=\"@status_report\">status report</a> page, and will also display "
+"an error message on administration pages if there is a security "
+"update."
+msgstr ""
+"Vous pouvez choisir de n'envoyer un courriel que si une mise à jour "
+"de sécurité est disponible, ou pour être informé de toutes les "
+"nouvelles versions. Si des mises à jour sont disponibles pour le "
+"cœur de Drupal ou pour les modules et thèmes installés, votre site "
+"affichera toujours un message sur la page <a "
+"href=\"@status_report\">tableau de bord d'administration</a> ainsi "
+"qu'un message d'erreur sur les pages d'administration s'il s'agit "
+"d'une mise à jour de sécurité."
+msgid ""
+"Here you can find information about available updates for your "
+"installed modules and themes. Note that each module or theme is part "
+"of a \"project\", which may or may not have the same name, and might "
+"include multiple modules or themes within it."
+msgstr ""
+"Ici vous pourrez trouver de l'information à propos des mises à jour "
+"disponibles pour vos modules et thèmes installés. Veuillez noter que "
+"chaque module ou thème fait partie d'un \"projet\", lequel peut ou "
+"non avoir le même nom et peut inclure plusieurs modules ou thèmes."
+msgid "Module and theme update status"
+msgstr "Statut de mise à jour des modules et des thèmes"
+msgid ""
+"There are security updates available for one or more of your modules "
+"or themes. To ensure the security of your server, you should update "
+"immediately!"
+msgstr ""
+"Des mises à jour de sécurité sont disponibles pour un ou plusieurs "
+"de vos modules ou thèmes. Afin de garantir la sécurité de votre "
+"serveur, effectuez immédiatement la mise à jour !"
+msgid ""
+"There are updates available for one or more of your modules or themes. "
+"To ensure the proper functioning of your site, you should update as "
+"soon as possible."
+msgstr ""
+"Il y a des mises à jour disponibles pour un ou plusieurs de vos "
+"modules ou thèmes. Afin de garantir la sécurité de votre serveur, "
+"effectuez immédiatement la mise à jour !"
+msgid ""
+"Get a status report about available updates for your installed modules "
+"and themes."
+msgstr ""
+"Afficher l'état des mises à jour disponibles pour vos modules et "
+"thèmes."
+msgid "Notify user when account is activated."
+msgstr "Notifier l'utilisateur quand son compte est activé."
+msgid "Notify user when account is blocked."
+msgstr "Notifier l'utilisateur quand son compte est bloqué."
+msgid "Picture guidelines"
+msgstr "Directives concernant les portraits"
+msgid ""
+"This text is displayed at the picture upload form in addition to the "
+"default guidelines. It's useful for helping or instructing your users."
+msgstr ""
+"Ce texte est affiché dans le formulaire de transfert de portraits, en "
+"complément des directives de base. Il permet de donner des "
+"compléments d'information aux utilisateurs."
+msgid ""
+"The name for this role. Example: \"moderator\", \"editorial board\", "
+"\"site architect\"."
+msgstr ""
+"Le nom pour ce rôle. Exemple : « modérateur », « responsable "
+"de l'édition », « architecte du site »."
+msgid "The role has been renamed."
+msgstr "Le rôle a été renommé."
+msgid "The role has been deleted."
+msgstr "Le rôle a été supprimé."
+msgid "E-mail new password"
+msgstr "Envoyer nouveau mot de passe par courriel"
+msgid "Sorry, %name is not recognized as a user name or an e-mail address."
+msgstr ""
+"Désolé, %name n'est reconnu ni comme un nom d'utilisateur ni comme "
+"une adresse e-mail."
+msgid "Further instructions have been sent to your e-mail address."
+msgstr ""
+"Des instructions détaillées ont été envoyées à votre adresse "
+"électronique."
+msgid "%name has been deleted."
+msgstr "%name a été supprimé."
+msgid "You must enter a username."
+msgstr "Vous devez saisir un nom d'utilisateur."
+msgid "The username cannot begin with a space."
+msgstr "Le nom d'utilisateur ne doit pas commencer par un espace."
+msgid "The username cannot end with a space."
+msgstr "Le nom d'utilisateur ne doit pas se terminer par un espace."
+msgid "The username cannot contain multiple spaces in a row."
+msgstr ""
+"Le nom d'utilisateur ne doit pas contenir plusieurs espaces à la "
+"suite."
+msgid "The username contains an illegal character."
+msgstr "Le nom d'utilisateur contient un caractère non valide."
+msgid "The username %name is too long: it must be %max characters or less."
+msgstr ""
+"Le nom d'utilisateur %name est trop long : sa longueur doit être "
+"inférieure à %max caractères."
+msgid "You must enter an e-mail address."
+msgstr "Vous devez saisir une adresse électronique."
+msgid "Who's online"
+msgstr "Utilisateurs en ligne"
+msgid "User list length"
+msgstr "Longueur de la liste des utilisateurs"
+msgid "Enter the password that accompanies your username."
+msgstr "Saisissez le mot de passe correspondant à votre nom d'utilisateur."
+msgid "Signature settings"
+msgstr "Paramètres de signature"
+msgid "Delete picture"
+msgstr "Supprimer l'image"
+msgid "Check this box to delete your current picture."
+msgstr "Cochez cette case pour supprimer votre portrait actuel."
+msgid "Unblock the selected users"
+msgstr "Débloquer les utilisateurs sélectionnés."
+msgid "Block the selected users"
+msgstr "Bloquer les utilisateurs sélectionnés."
+msgid ""
+"This web page allows administrators to register new users. Users' "
+"e-mail addresses and usernames must be unique."
+msgstr ""
+"Cette page permet à l'administrateur d'inscrire manuellement des "
+"utilisateurs. Les noms d'utilisateurs et les adresses de courriels "
+"doivent être uniques."
+msgid ""
+"Enter a simple pattern (\"*\" may be used as a wildcard match) to "
+"search for a username or e-mail address. For example, one may search "
+"for \"br\" and Drupal might return \"brian\", \"brad\", and "
+"\"brenda@example.com\"."
+msgstr ""
+"Entrez une requête simple (\"*\" peut être utilisé comme joker) "
+"pour rechercher un nom d'utilisateur ou un courriel. Par exemple, on "
+"pourrait rechercher \"je\" et Drupal retournerait "
+"\"Jean\",\"Jean-François\" et \"jeanne@example.com\"."
+msgid "Deleted user: %name %email."
+msgstr "Utilisateur supprimé : %name %email."
+msgid "Determine access to features by selecting permissions for roles."
+msgstr ""
+"Déterminer les accès aux fonctionnalités en choisissant des droits "
+"pour les rôles."
+msgid "Edit role"
+msgstr "Modifier le rôle"
+msgid "Manages the user registration and login system."
+msgstr "Gère l'inscription des utilisateurs et le système d'identification."
+msgid "Garland"
+msgstr "Garland"
+msgid "Run the clean URL test"
+msgstr "Lancer le test des URL simplifiées"
+msgid ""
+"The title is used as a tool tip when the user hovers the mouse over "
+"the image."
+msgstr ""
+"Le titre apparaît sous forme d'infobulle lorsque l'utilisateur "
+"survole l'image avec sa souris."
+msgid "Progress indicator"
+msgstr "Indicateur de progression"
+msgid "Bar with progress meter"
+msgstr "Barre avec mesure de progression"
+msgid "Throbber"
+msgstr "Throbber"
+msgid "The file upload failed. %upload"
+msgstr "Le transfert de fichier a échoué. %upload"
+msgid "URL to file"
+msgstr "Url du fichier"
+msgid ""
+"An unrecoverable error occurred. The uploaded file likely exceeded the "
+"maximum file size (@size) that this server supports."
+msgstr ""
+"Une erreur irrécupérable s'est produite. Le fichier transféré "
+"dépasse la taille de fichier maximum (@size) autorisée par le "
+"serveur."
+msgid "Starting upload..."
+msgstr "Début du transfert..."
+msgid "Uploading... (@current of @total)"
+msgstr "Transfert en cours... (@current sur @total)"
+msgid ""
+"Your server is capable of displaying file upload progress, but does "
+"not have the required libraries. It is recommended to install the <a "
+"href=\"http://pecl.php.net/package/uploadprogress\">PECL "
+"uploadprogress library</a> (preferred) or to install <a "
+"href=\"http://us2.php.net/apc\">APC</a>."
+msgstr ""
+"Votre serveur est capable d'afficher la progression du transfert des "
+"fichiers, mais il ne dispose pas des bibliothèques requises. Il est "
+"recommandé d'installer la <a "
+"href=\"http://pecl.php.net/package/uploadprogress\">bibliothèque PECL "
+"uploadprogress</a> (meilleur choix) ou d'installer <a "
+"href=\"http://us2.php.net/apc\">APC</a>."
+msgid ""
+"Your server is capable of displaying file upload progress using APC "
+"RFC1867. Note that only one upload at a time is supported. It is "
+"recommended to use the <a "
+"href=\"http://pecl.php.net/package/uploadprogress\">PECL "
+"uploadprogress library</a> if possible."
+msgstr ""
+"Votre serveur est capable d'afficher la progression de transfert de "
+"fichier à l'aide d'APC RFC1867. Notez que seul un transfert à la "
+"fois est supporté. Il est recommandé d'utiliser la <a "
+"href=\"http://pecl.php.net/package/uploadprogress\">bibliothèque "
+"Uploadprogress PECL</a> si possible."
+msgid ""
+"Your server is not capable of displaying file upload progress. File "
+"upload progress requires PHP be run with mod_php and not as FastCGI."
+msgstr ""
+"Votre serveur est incapable d'afficher la progression de transfert de "
+"fichier. La progression de transfert de fichier requiert que PHP soit "
+"exécuté avec mod_php et non en tant que FastCGI."
+msgid ""
+"Your server is capable of displaying file upload progress through APC, "
+"but it is not enabled. Add <code>apc.rfc1867 = 1</code> to your "
+"php.ini configuration. Alternatively, it is recommended to use <a "
+"href=\"http://pecl.php.net/package/uploadprogress\">PECL "
+"uploadprogress</a>, which supports more than one simultaneous upload."
+msgstr ""
+"Votre serveur est capable d'afficher la progression du transfert des "
+"fichiers avec APC, mais celui-ci n'est pas activé. Ajouter le code "
+"<code>apc.rfc1867 = 1</code> à votre fichier de configuration "
+"php.ini. Toutefois, il est recommandé d'utiliser la <a "
+"href=\"http://pecl.php.net/package/uploadprogress\">bibliothèque PECL "
+"uploadprogress</a>, car elle supporte le transfert simultané de "
+"plusieurs fichiers (ce qui n'est pas le cas d'APC)."
+msgid ""
+"Enabled (<a "
+"href=\"http://php.net/manual/en/apc.configuration.php#ini.apc.rfc1867\">APC "
+"RFC1867</a>)"
+msgstr ""
+"Activé (<a "
+"href=\"http://php.net/manual/fr/apc.configuration.php#ini.apc.rfc1867\">APC "
+"RFC1867</a>)"
+msgid ""
+"Enabled (<a href=\"http://pecl.php.net/package/uploadprogress\">PECL "
+"uploadprogress</a>)"
+msgstr ""
+"Activé (<a href=\"http://pecl.php.net/package/uploadprogress\">PECL "
+"uploadprogress</a>)"
+msgid "Upload progress"
+msgstr "Transfert en cours"
+msgid "Interface"
+msgstr "Interface"
+msgid "@size KB"
+msgstr "@size Ko"
+msgid "@size MB"
+msgstr "@size Mo"
+msgid "@size GB"
+msgstr "@size Go"
+msgid "@size TB"
+msgstr "@size To"
+msgid "@size PB"
+msgstr "@size Po"
+msgid "@size EB"
+msgstr "@size Eo"
+msgid "@size ZB"
+msgstr "@size Zo"
+msgid "@size YB"
+msgstr "@size Yo"
+msgid "All messages"
+msgstr "Tous les messages"
+msgid "(empty)"
+msgstr "(vide)"
+msgid "Text format"
+msgstr "Format de texte"
+msgid "No new posts"
+msgstr "Aucun nouveau message"
+msgid "Sticky topic"
+msgstr "Sujet épinglé"
+msgid ""
+"The translation file %filename contains an error: \"msgctxt\" is "
+"unexpected on line %line."
+msgstr ""
+"Le fichier de traduction %filename contient une erreur : \"msgctxt\" "
+"inattendu à la ligne %line."
+msgid "The name of the site."
+msgstr "Le nom du site."
+msgid "Region settings"
+msgstr "Paramètres de la région"
+msgid "Format string"
+msgstr "Chaine de format"
+msgid "Are you sure you want to remove the format %format?"
+msgstr "Êtes-vous sûr(e) de vouloir supprimer le format %format ?"
+msgid "Removed date format %format."
+msgstr "Le format %format a été supprimé."
+msgid "Add format"
+msgstr "Ajouter un format"
+msgid "Allow users to add additional date formats."
+msgstr "Permet aux utilisateurs d'ajouter des formats de date additionnels."
+msgid "Delete date format"
+msgstr "Supprimer le format de date"
+msgid "Allow users to delete a configured date format."
+msgstr "Permet aux utilisateurs de supprimer un format de date."
+msgid "Configure date formats for each locale"
+msgstr "Configure les formats de date pour chaque paramètre régional"
+msgid "Content type name"
+msgstr "Nom du type de contenu"
+msgid "Slate"
+msgstr "Slate"
+msgid "manage fields"
+msgstr "gérer les champs"
+msgid "@field_name (Locked)"
+msgstr "@field_name (Verrouillé)"
+msgid "- Select a field type -"
+msgstr "- Choisir un type de champ -"
+msgid "- Select a widget -"
+msgstr "- Sélectionnez un widget -"
+msgid "Type of data to store."
+msgstr "Type de données à stocker."
+msgid "Form element to edit the data."
+msgstr "Elément du formulaire pour l'édition des données."
+msgid "- Select an existing field -"
+msgstr "- Sélectionnez un champ existant -"
+msgid "Field to share"
+msgstr "Champ à partager"
+msgid "Add new field: you need to provide a label."
+msgstr "Ajouter un nouveau champ : vous devez fournir une étiquette."
+msgid "Add new field: you need to provide a field name."
+msgstr "Ajouter un nouveau champ : vous devez fournir un nom de champ."
+msgid "Add new field: you need to select a field type."
+msgstr "Ajouter un nouveau champ : vous devez sélectionner un type de champ."
+msgid "Add new field: you need to select a widget."
+msgstr "Ajouter un nouveau champ : vous devez sélectionner un widget."
+msgid "Add new field: invalid widget."
+msgstr "Ajouter un nouveau champ : widget non valide."
+msgid "Add existing field: you need to provide a label."
+msgstr "Ajouter un champ existant : vous devez fournir une étiquette."
+msgid "Add existing field: you need to select a field."
+msgstr "Ajouter un champ existant : vous devez sélectionner un champ."
+msgid "Add existing field: you need to select a widget."
+msgstr "Ajouter un champ existant: vous devez sélectionner un widget."
+msgid "Add existing field: invalid widget."
+msgstr "Ajouter un champ existant : widget non valide."
+msgid "@type: @field (@label)"
+msgstr "@type : @field (@label)"
+msgid "The field %field is locked and cannot be edited."
+msgstr "Le champ %field est verrouillé et ne peut pas être modifié."
+msgid "Maximum number of values users can enter for this field."
+msgstr ""
+"Le nombre maximum de valeurs qu'un utilisateur peut entrer pour ce "
+"champ."
+msgid ""
+"'Unlimited' will provide an 'Add more' button so the users can add as "
+"many values as they like."
+msgstr ""
+"'Illimité' fournira un bouton 'Ajouter plus' pour que les "
+"utilisateurs puissent ajouter autant de valeurs qu'ils le souhaitent."
+msgid "%name must be an integer."
+msgstr "%name doit être un entier."
+msgid "%name must be a positive integer."
+msgstr "%name doit être un entier positif."
+msgid "%name must be a number."
+msgstr "%name doit être un nombre."
+msgid "Only numbers are allowed in %field."
+msgstr "Seuls les nombres sont autorisés dans %field."
+msgid "Regional settings"
+msgstr "Paramètres régionaux"
+msgid "update.php"
+msgstr "update.php"
+msgid "Rotate"
+msgstr "Rotation"
+msgid "Page top"
+msgstr "Haut de page"
+msgid "Page bottom"
+msgstr "Bas de page"
+msgid "Hello <strong>@username</strong>"
+msgstr "Bonjour <strong>@username</strong>"
+msgid "Show shortcuts"
+msgstr "Afficher les raccourcis"
+msgid "width @width"
+msgstr "largeur @width"
+msgid "height @height"
+msgstr "hauteur @height"
+msgid "upscaling allowed"
+msgstr "agrandissement autorisé"
+msgid "random between -@degrees&deg and @degrees&deg"
+msgstr "Génération aléatoire entre -@degrees&deg et @degrees&deg"
+msgid "@degrees&deg"
+msgstr "@degrees&deg"
+msgid "Sidebar first"
+msgstr "Première barre latérale"
+msgid "Database is encoded in UTF-8"
+msgstr "La base de données est encodée en UTF-8"
+msgid ""
+"Drupal could not determine the encoding of the database was set to "
+"UTF-8"
+msgstr ""
+"Drupal n'a pas pu déterminer si l'encodage de la base de données a "
+"été défini en UTF-8"
+msgid "PostgreSQL has initialized itself."
+msgstr "PostgreSQL s'est initialisé."
+msgid "Structure"
+msgstr "Structure"
+msgid "Created role of name: @name, id: @rid"
+msgstr "Rôle créé, nom : @name, id : @rid"
+msgid "User %name successfully logged in."
+msgstr "Utilisateur %name connecté avec succès."
+msgid "Raw \"@raw\" found"
+msgstr "Le texte brut \"@raw\" a été trouvé"
+msgid "Raw \"@raw\" not found"
+msgstr "Le texte brut \"@raw\" n'a pas été trouvé"
+msgid "\"@text\" found"
+msgstr "\"@text\" trouvé"
+msgid "\"@text\" not found"
+msgstr "\"@text\" non trouvé"
+msgid "Pattern \"@pattern\" found"
+msgstr "Motif \"@pattern\" trouvé"
+msgid "Pattern \"@pattern\" not found"
+msgstr "Motif \"@pattern\" non trouvé"
+msgid "Checkbox field @id is checked."
+msgstr "La case à cocher @id est cochée."
+msgid "Checkbox field @id is not checked."
+msgstr "La case à cocher @id n'est pas cochée."
+msgid "Verbose message"
+msgstr "Message verbeux"
+msgid ""
+"Select the test(s) or test group(s) you would like to run, and click "
+"<em>Run tests</em>."
+msgstr ""
+"Sélectionner le(s) test(s) ou groupe(s) de tests que vous souhaitez "
+"exécuter, et cliquer sur <em>Lancer les tests</em>."
+msgid "All (@count)"
+msgstr "Tous (@count)"
+msgid "Pass (@count)"
+msgstr "Réussi (@count)"
+msgid "Fail (@count)"
+msgstr "Échoué (@count)"
+msgid "Return to list"
+msgstr "Retourner à la liste"
+msgid "Clear results after each complete test suite run"
+msgstr ""
+"Effacer les résultats après chaque lancement de série de tests "
+"complets"
+msgid "Provide verbose information when running tests"
+msgstr "Fournit des informations verbeuses lors de l'exécution des tests"
+msgid ""
+"The verbose data will be printed along with the standard assertions "
+"and is useful for debugging. The verbose data will be erased between "
+"each test suite run. The verbose data output is very detailed and "
+"should only be used when debugging."
+msgstr ""
+"Les données verbeuses seront affichées tout le long avec les "
+"affirmations courantes, ce qui est utile pour le débogage. Les "
+"données verbeuses seront effacées entre chaque exécution de série "
+"de test. La sortie de données verbeuses est très détaillé et ne "
+"doit être utilisé que lors du débogage."
+msgid ""
+"HTTP auth settings to be used by the SimpleTest browser during "
+"testing. Useful when the site requires basic HTTP authentication."
+msgstr ""
+"Paramètres auth HTTP à utiliser par le navigateur en SimpleTest "
+"pendant les tests. Utile lorsque le site nécessite une "
+"authentification HTTP de base."
+msgid "@pass, @fail, @exception, and @debug"
+msgstr "@pass, @fail, @exception et @debug"
+msgid "The test run did not successfully finish."
+msgstr "Le test ne s'est pas terminé avec succès."
+msgid ""
+"Clear results is disabled and the test results table will not be "
+"cleared."
+msgstr ""
+"Effacer les résultats est désactivé et le tableau de résultats des "
+"tests ne sera pas effacé."
+msgid "No leftover tables to remove."
+msgstr "Pas de tables restantes à retirer."
+msgid "1 debug message"
+msgid_plural "@count debug messages"
+msgstr[0] "@count message de débogage"
+msgstr[1] "@count messages de débogage"
+msgid "Removed 1 test result."
+msgid_plural "Removed @count test results."
+msgstr[0] "@count résultat de test supprimé."
+msgstr[1] "@count résultats de test supprimés."
+msgid "Removed 1 leftover table."
+msgid_plural "Removed @count leftover tables."
+msgstr[0] "1 table restante supprimée."
+msgstr[1] "@count tables restantes supprimées."
+msgid "Removed 1 temporary directory."
+msgid_plural "Removed @count temporary directories."
+msgstr[0] "@count répertoire temporaire supprimé."
+msgstr[1] "@count répertoires temporaires supprimés."
+msgid "Test result"
+msgstr "Résultat du test"
+msgid "View result of tests."
+msgstr "Voir le résultat des tests."
+msgid "hash"
+msgstr "Hachage"
+msgid "Comment permalink"
+msgstr "Permalien du commentaire"
+msgid "!site_name blogs"
+msgstr "Les blogs de !site_name"
+msgid "Search block"
+msgstr "Bloc de recherche"
+msgid "Edit style"
+msgstr "Modifier le style"
+msgid "Delete style"
+msgstr "Supprimer le style"
+msgid "Check for updates of disabled modules and themes"
+msgstr "Vérifier les mises à jour des modules et thèmes désactivés"
+msgid "Fetcher"
+msgstr "Extracteur"
+msgid "This permission is inherited from the authenticated user role."
+msgstr "Ce droit est héritée du rôle de l'utilisateur authentifié."
+msgid "Seven"
+msgstr "Seven"
+msgid "openid"
+msgstr "OpenID"
+msgid "Submitted by !username on !datetime"
+msgstr "Soumis par !username le !datetime"
+msgid "Administer forums"
+msgstr "Administrer les forums"
+msgid "Cancel account"
+msgstr "Annuler le compte"
+msgid "Secondary menu"
+msgstr "Menu secondaire"
+msgid "Administrator role"
+msgstr "Rôle administrateur"
+msgid "No revision"
+msgstr "Aucune révision"
+msgid "@number comments per page"
+msgstr "@number commentaires par page"
+msgid "Requires a title"
+msgstr "Titre obligatoire"
+msgid "Private files"
+msgstr "Fichiers privés"
+msgid "Not restricted"
+msgstr "Non restreint"
+msgid "Other blocks"
+msgstr "Autres blocs"
+msgid "The unique ID of the comment."
+msgstr "L'identifiant (ID) unique du commentaire."
+msgid "The IP address of the computer the comment was posted from."
+msgstr ""
+"L'adresse IP de l'ordinateur à partir duquel le commentaire a été "
+"posté."
+msgid "The name left by the comment author."
+msgstr "Le nom laissé par l'auteur du commentaire."
+msgid "The email address left by the comment author."
+msgstr "L'adresse de courriel laissée par l'auteur du commentaire."
+msgid "The home page URL left by the comment author."
+msgstr "L'URL de la page d'accueil Web laissé par l'auteur du commentaire."
+msgid "The formatted content of the comment itself."
+msgstr "Le contenu mis en forme du commentaire lui-même."
+msgid "The URL of the comment."
+msgstr "L'URL du commentaire."
+msgid "Edit URL"
+msgstr "Modifier URL"
+msgid "The URL of the comment's edit page."
+msgstr "L'URL de la page d'édition du commentaire."
+msgid "The date the comment was posted."
+msgstr "La date à laquelle le commentaire a été posté."
+msgid "The comment's parent, if comment threading is active."
+msgstr ""
+"Le parent du commentaire, si le fil de discussion des commentaire est "
+"actif."
+msgid "The node the comment was posted to."
+msgstr "Le nœud sur lequel le commentaire a été posté."
+msgid "The author of the comment, if they were logged in."
+msgstr "L'auteur du commentaire, s'il était connecté."
+msgid "The number of comments posted on a node."
+msgstr "Le nombre de commentaires postés sur un nœud."
+msgid "New comment count"
+msgstr "Comptage des nouveaux commentaires"
+msgid ""
+"The number of comments posted on a node since the reader last viewed "
+"it."
+msgstr ""
+"Le nombre de commentaires postés sur un nœud depuis la dernière "
+"consultation du lecteur."
+msgid "The unique ID of the node's latest revision."
+msgstr "L'identifiant (ID) unique de la dernière révision du nœud."
+msgid "Translation set ID"
+msgstr "Identifiant (ID) du jeu de traduction"
+msgid ""
+"The unique ID of the original-language version of this node, if one "
+"exists."
+msgstr ""
+"L'identifiant (ID) unique de la version de langue originale de ce "
+"nœud, si elle existe."
+msgid "The type of the node."
+msgstr "Le type du nœud."
+msgid "The human-readable name of the node type."
+msgstr "Le nom affiché du type de nœud."
+msgid "The language the node is written in."
+msgstr "La langue dans laquelle le nœud est écrit."
+msgid "The URL of the node."
+msgstr "L'URL du nœud."
+msgid "The URL of the node's edit page."
+msgstr "L'URL de la page d'édition du nœud."
+msgid "Date changed"
+msgstr "Date de modification"
+msgid "The date the node was most recently updated."
+msgstr "La date à laquelle le nœud a été le plus récemment mis à jour."
+msgid "The author of the node."
+msgstr "L'auteur du nœud."
+msgid "Poll winner"
+msgstr "Vainqueur du sondage"
+msgid "The winning poll answer."
+msgstr "La réponse gagnante du sondage."
+msgid "Poll winner votes"
+msgstr "Votes du gagnant du sondage"
+msgid "The number of votes received by the winning poll answer."
+msgstr "Le nombre de votes reçus par la réponse gagnante du sondage."
+msgid "Poll winner percent"
+msgstr "Pourcentage des votes en faveur du vainqueur du sondage"
+msgid "The percentage of votes received by the winning poll answer."
+msgstr "Le pourcentage des votes reçus par la réponse gagnante du sondage."
+msgid "The number of visitors who have read the node."
+msgstr "Le nombre de visiteurs qui ont lu le nœud."
+msgid "The number of visitors who have read the node today."
+msgstr "Le nombre de visiteurs qui ont lu le nœud aujourd'hui."
+msgid "Last view"
+msgstr "Dernière consultation"
+msgid "The date on which a visitor last read the node."
+msgstr "La date à laquelle un visiteur a lu le nœud en dernier."
+msgid "The slogan of the site."
+msgstr "Le slogan du site."
+msgid "The administrative email address for the site."
+msgstr "L'adresse de courriel administrative pour le site."
+msgid "The URL of the site's front page."
+msgstr "L'URL de la page d'accueil du site."
+msgid "Login page"
+msgstr "Page de connexion"
+msgid "The URL of the site's login page."
+msgstr "L'URL de la page de connexion du site."
+msgid "The unique ID of the uploaded file."
+msgstr "L'identifiant (ID) unique du fichier transféré."
+msgid "The name of the file on disk."
+msgstr "Le nom du fichier sur le disque."
+msgid "The web-accessible URL for the file."
+msgstr "L'URL du fichier accessible depuis le web"
+msgid "The date the file was most recently changed."
+msgstr "La date de modification du fichier la plus récente."
+msgid "The user who originally uploaded the file."
+msgstr "L'utilisateur qui a initialement transféré le fichier."
+msgid "The unique ID of the taxonomy term."
+msgstr "L'identifiant (ID) unique du terme de taxonomie."
+msgid "The name of the taxonomy term."
+msgstr "Le nom du terme de taxonomie."
+msgid "The optional description of the taxonomy term."
+msgstr "La description facultative du terme de taxonomie."
+msgid "The number of nodes tagged with the taxonomy term."
+msgstr "Le nombre de nœuds étiquetés avec le terme de taxonomie."
+msgid "The URL of the taxonomy term."
+msgstr "L'URL du terme taxonomie."
+msgid "The vocabulary the taxonomy term belongs to."
+msgstr "Le vocabulaire auquel appartient le terme de taxonomie."
+msgid "The parent term of the taxonomy term, if one exists."
+msgstr "Le terme parent du terme de taxonomie, s'il existe."
+msgid "The unique ID of the taxonomy vocabulary."
+msgstr "L'identifiant (ID) unique du vocabulaire de taxonomie."
+msgid "The name of the taxonomy vocabulary."
+msgstr "Le nom du vocabulaire de taxonomie."
+msgid "The optional description of the taxonomy vocabulary."
+msgstr "La description facultative du vocabulaire de taxonomie."
+msgid ""
+"The number of nodes tagged with terms belonging to the taxonomy "
+"vocabulary."
+msgstr ""
+"Le nombre de nœuds étiquettés avec les termes appartenant au "
+"vocabulaire de taxonomie."
+msgid "Term count"
+msgstr "Nombre de termes"
+msgid "The number of terms belonging to the taxonomy vocabulary."
+msgstr "Le nombre de termes appartenant au vocabulaire de taxonomie."
+msgid "The unique ID of the user account."
+msgstr "L'identifiant unique (ID) du compte d'utilisateur."
+msgid "The login name of the user account."
+msgstr "Le nom de login du compte de l'utilisateur."
+msgid "The email address of the user account."
+msgstr "L'adresse de courriel du compte utilisateur."
+msgid "The URL of the account profile page."
+msgstr "L'URL de la page du profil du compte."
+msgid "The date the user last logged in to the site."
+msgstr "La date de la dernière connexion de l'utilisateur sur le site."
+msgid "The date the user account was created."
+msgstr "La date de création du compte de l'utilisateur."
+msgid "Your OpenID"
+msgstr "Votre OpenID"
+msgid "This OpenID will be attached to your account after registration."
+msgstr "Cet OpenID sera lié à votre compte après inscription."
+msgid "Main page content"
+msgstr "Contenu de la page principale"
+msgid "You are not allowed to access this page."
+msgstr "Vous n'êtes pas autorisé(e) à accéder à cette page."
+msgid "Authorize file system changes"
+msgstr "Autoriser des changements du système de fichier"
+msgid "It appears you have reached this page in error."
+msgstr "Il semblerait que vous soyez sur cette page par erreur."
+msgid "authorize.php"
+msgstr "authorize.php"
+msgid "Cron could not run because an invalid key was used."
+msgstr ""
+"La tâche planifiée (cron) ne s'est pas exécutée en raison de "
+"l'utilisation d'une clé invalide."
+msgid "Cron could not run because the site is in maintenance mode."
+msgstr ""
+"La tâche planifiée (cron) ne peut pas s'exécuter car le site est en "
+"mode maintenance."
+msgid "Default country"
+msgstr "Pays par défaut"
+msgid ""
+"Check the error messages and <a href=\"!url\">proceed with the "
+"installation</a>."
+msgstr ""
+"Consultez le message d'erreur et <a href=\"!url\">poursuivez "
+"l'installation</a>."
+msgid ""
+"In your %settings_file file you have configured @drupal to use a "
+"%driver server, however your PHP installation currently does not "
+"support this database type."
+msgstr ""
+"Vous avez configuré @drupal pour utiliser un serveur %driver dans "
+"votre fichier %settings_file, cependant votre installation php ne "
+"supporte pas ce type de base de données."
+msgid "Sorry, you must select a language to continue the installation."
+msgstr ""
+"Désolé, vous devez choisir une langue afin de poursuivre "
+"l’installation."
+msgid ""
+"We were unable to find any installation profiles. Installation "
+"profiles tell us what modules to enable and what schema to install in "
+"the database. A profile is necessary to continue with the installation "
+"process."
+msgstr ""
+"Il n'a pas été possible de trouver un profil d'installation. Les "
+"profils d'installation précisent quels modules activer et quels "
+"schéma installer dans la base de données. Un profil est nécessaire "
+"pour continuer le processus d'installation."
+msgid "Sorry, the profile you have chosen cannot be loaded."
+msgstr "Désolé, le profil que vous avez choisi ne peut pas être chargé."
+msgid ""
+"All necessary changes to %dir and %file have been made, so you should "
+"remove write permissions to them now in order to avoid security risks. "
+"If you are unsure how to do so, consult the <a "
+"href=\"@handbook_url\">online handbook</a>."
+msgstr ""
+"Tous les changements nécessaires à %dir et %file ont été "
+"effectués, vous devriez donc en retirer les permissions d'écriture "
+"afin d'éviter les risques de sécurité. Si vous n'êtes pas sûr de "
+"savoir comme faire, merci de consulter le <a "
+"href=\"@handbook_url\">manuel en ligne</a>."
+msgid "Congratulations, you installed @drupal!"
+msgstr "Félicitations, vous avez installé @drupal !"
+msgid ""
+"Review the messages above before visiting <a href=\"@url\">your new "
+"site</a>."
+msgstr ""
+"Merci de lire les messages suivants avant de visiter <a "
+"href=\"@url\">votre nouveau site</a>."
+msgid "<a href=\"@url\">Visit your new site</a>."
+msgstr "<a href=\"@url\">Visitez votre nouveau site</a>."
+msgid "Settings file"
+msgstr "Fichier de configuration"
+msgid "The settings file does not exist."
+msgstr "Le fichier de configuration n'existe pas."
+msgid ""
+"The @drupal installer requires that you create a settings file as part "
+"of the installation process. Copy the %default_file file to %file. "
+"More details about installing Drupal are available in <a "
+"href=\"@install_txt\">INSTALL.txt</a>."
+msgstr ""
+"Le processus d'installation de l'installeur <em>@drupal</em> requiert "
+"la création d'un fichier de configuration. <b>Copier</b> le fichier "
+"<em>%default_file</em> en <em>%file</em>. Des détails "
+"supplémentaires concernant l'installation sont disponibles dans <a "
+"href=\"@install_txt\">INSTALL.txt</a>."
+msgid "The %file file exists."
+msgstr "Le fichier %file existe."
+msgid "The settings file is not writable."
+msgstr "Le fichier de configuration n'est pas accessible en écriture."
+msgid ""
+"The @drupal installer requires write permissions to %file during the "
+"installation process. If you are unsure how to grant file permissions, "
+"consult the <a href=\"@handbook_url\">online handbook</a>."
+msgstr ""
+"Le programme d'installation de @drupal a besoin des permissions "
+"d'écriture sur %file pendant la procédure d'installation. Si vous ne "
+"savez pas comment donner la permission d'écriture, merci de consultez "
+"le <a href=\"@handbook_url\">manuel en ligne</a>."
+msgid ""
+"Automated e-mails, such as registration information, will be sent from "
+"this address. Use an address ending in your site's domain to help "
+"prevent these e-mails from being flagged as spam."
+msgstr ""
+"Les courriels automatiques, comme par exemple les informations "
+"d'inscription, seront envoyés depuis cette adresse. Utilisez une "
+"adresse se terminant par le domaine de votre site pour éviter que ces "
+"courriels ne soient signalés comme des pourriels (spam)."
+msgid "Site maintenance account"
+msgstr "Compte de maintenance du site"
+msgid "Select the default country for the site."
+msgstr "Choisissez un pays par défaut pour votre site."
+msgid "Receive e-mail notifications"
+msgstr "Recevoir les courriels de notification"
+msgid ""
+"The system will notify you when updates and important security "
+"releases are available for installed components. Anonymous information "
+"about your site is sent to <a href=\"@drupal\">Drupal.org</a>."
+msgstr ""
+"Le système vous préviendra lorsque de nouvelles versions et des "
+"mises à jour de sécurité importantes seront disponibles pour les "
+"composants installés. Des informations anonymes concernant votre site "
+"sont envoyées à <a href=\"@drupal\">Drupal.org</a>."
+msgid "No pending updates."
+msgstr "Pas de mise à jour en attente."
+msgid "1 pending update"
+msgid_plural "@count pending updates"
+msgstr[0] "@count mise à jour en attente"
+msgstr[1] "@count mises à jour en attente"
+msgid ""
+"An error occurred while handling the request: The server received "
+"invalid input."
+msgstr ""
+"Une erreur s'est produite durant la gestion de la requête&nbsp;: le "
+"serveur a reçu une entrée invalide."
+msgid "Invalid form POST data."
+msgstr "Données du formulaire POST invalides."
+msgid "Unable to continue, no available methods of file transfer"
+msgstr ""
+"Impossible de continuer, aucune méthode de transfert de fichier "
+"disponible"
+msgid ""
+"WARNING: You are not using an encrypted connection, so your password "
+"will be sent in plain text. <a href=\"@https-link\">Learn more</a>."
+msgstr ""
+"ATTENTION : vous n'utilisez pas de connexion cryptée, votre mot de "
+"passe sera donc envoyé en clair. <a href=\"@https-link\">En savoir "
+"plus</a>."
+msgid "To continue, provide your server connection details"
+msgstr "Pour continuer, remplir les informations de connexion au serveur"
+msgid "Connection method"
+msgstr "Méthode de connexion"
+msgid "Enter connection settings"
+msgstr "Saisir les paramètres de connexion"
+msgid "@backend connection settings"
+msgstr "paramètres de connexion @backend"
+msgid "Change connection type"
+msgstr "Changer le type de connexion"
+msgid "Error, this type of connection protocol (%backend) does not exist."
+msgstr "Erreur, ce type de protocole de connexion (%backend) n'existe pas."
+msgid "No active batch."
+msgstr "Aucun traitement par lot actif."
+msgid "Site under maintenance"
+msgstr "Site en maintenance"
+msgid "Archivers can only operate on local files: %file not supported"
+msgstr ""
+"L'archivage ne peut fonctionner que sur des fichiers locaux : %file "
+"non supporté"
+msgid ""
+"The file could not be uploaded, because the destination %destination "
+"is invalid."
+msgstr ""
+"Le fichier n'a pas pu être transféré car la destination "
+"%destination est invalide."
+msgid ""
+"The file %source could not be uploaded because a file by that name "
+"already exists in the destination %directory."
+msgstr ""
+"Le fichier %source n'a pas pu être transféré car un fichier portant "
+"ce nom existe déjà dans la destination %directory."
+msgid ""
+"The file's name exceeds the 240 characters limit. Please rename the "
+"file and try again."
+msgstr ""
+"Le nom du fichier dépasse la limite de 240 caractères. Veuillez "
+"renommer le fichier et essayer à nouveau."
+msgid ""
+"%path is a directory and cannot be removed using "
+"file_unmanaged_delete()."
+msgstr ""
+"%path est un répertoire et ne peut pas être effacé en utilisant "
+"file_unmanaged_delete()."
+msgid "The file %path is not of a recognized type so it was not deleted."
+msgstr ""
+"Le fichier %path n'est pas d'un type reconnu, il n'a donc pas été "
+"effacé."
+msgid "The file permissions could not be set on %uri."
+msgstr "Les droits du fichier ne peuvent pas être appliqués sur %uri."
+msgid "Completed @current of @total."
+msgstr "@current sur @total terminés."
+msgid ""
+"Failed to run all tasks against the database server. The task %task "
+"wasn't found."
+msgstr ""
+"Echec lors du lancement des tâches vers le serveur de base de "
+"données. La tâche  %task n'a pas été trouvée."
+msgid "Failed to modify %settings. Verify the file permissions."
+msgstr ""
+"Impossible de modifier %settings. Veuillez vérifier les droits du "
+"fichier."
+msgid "Failed to open %settings. Verify the file permissions."
+msgstr ""
+"Echec lors de l'ouverture de %settings. Veuillez vérifier les "
+"permissions du fichier."
+msgid "Required modules"
+msgstr "Modules requis"
+msgid "Required modules not found."
+msgstr "Les modules requis sont introuvables."
+msgid ""
+"The following modules are required but were not found. Move them into "
+"the appropriate modules subdirectory, such as "
+"<em>sites/all/modules</em>. Missing modules: !modules"
+msgstr ""
+"Les modules suivants sont nécessaires mais n'ont pas été trouvés.  "
+"Déplacez-les dans le bon sous-répertoire tel que "
+"<em>sites/all/modules</em>. Modules manquants : !modules"
+msgid "system"
+msgstr "système"
+msgid "%module module uninstalled."
+msgstr "Le module %module a été désinstallé."
+msgid "Saint Barthélemy"
+msgstr "Saint-Barthélemy"
+msgid "Saint Martin (French part)"
+msgstr "Saint-Martin (partie française)"
+msgid "Use the default site language (@language_name)."
+msgstr "Utiliser la langue par défaut du site (@language_name)."
+msgid ""
+"The translation file %filepath contains an error: the plural formula "
+"could not be parsed."
+msgstr ""
+"Le fichier de traduction %filepath contient une erreur : la formule du "
+"pluriel n'a pas pu être analysée."
+msgid "No strings available."
+msgstr "Aucune chaîne disponible."
+msgid "@count disallowed HTML string(s) in %file"
+msgstr "@count chaîne(s) HTML interdite(s) dans %file"
+msgid "JavaScript translation file %file.js was lost."
+msgstr "Le fichier de traduction Javascript %file.js a été perdu."
+msgid ""
+"Unable to send e-mail. Contact the site administrator if the problem "
+"persists."
+msgstr ""
+"Impossible d'envoyer le courriel. Contacter l'administrateur du site "
+"si le problème persiste."
+msgid "Class %class does not implement interface %interface"
+msgstr "La classe %class n'implémente pas l'interface %interface"
+msgid "(active tab)"
+msgstr "(onglet actif)"
+msgid "Operating in maintenance mode. <a href=\"@url\">Go online.</a>"
+msgstr ""
+"Site en cours de maintenance. <a href=\"@url\">Remettre le site en "
+"ligne.</a>"
+msgid "Operating in maintenance mode."
+msgstr "Fonctionne en mode maintenance."
+msgid "%module module enabled."
+msgstr "Module %module activé."
+msgid "%module module disabled."
+msgstr "Module %module désactivé."
+msgid "Status message"
+msgstr "Message d'état"
+msgid "Unable to determine the type of the source directory."
+msgstr "Impossible de déterminer le type du répertoire source."
+msgid "Cannot determine the type of project."
+msgstr "Impossible de déterminer le type du projet."
+msgid ""
+"Fatal error in update, cowardly refusing to wipe out the install "
+"directory."
+msgstr ""
+"Erreur fatale lors de la mise à jour, impossible de supprimer le "
+"répertoire d'installation."
+msgid "File Transfer failed, reason: !reason"
+msgstr "Le transfert du fichier a échoué, cause : !reason"
+msgid "Unable to create %directory due to the following: %reason"
+msgstr "Impossible de créer %directory pour cause de : %reason"
+msgid ""
+"Drupal could not be correctly setup with the existing database. Revise "
+"any errors."
+msgstr ""
+"Drupal n'est peut-être pas configuré correctement avec la base de "
+"données existante. Vérifier les erreurs."
+msgid "An AJAX HTTP error occurred."
+msgstr "Une erreur HTTP AJAX s'est produite."
+msgid "HTTP Result Code: !status"
+msgstr "Code de statut HTTP : !status"
+msgid "An AJAX HTTP request terminated abnormally."
+msgstr "Une requête HTTP AJAX s'est terminée anormalement."
+msgid "Debugging information follows."
+msgstr "Informations de débogage ci-dessous."
+msgid "Path: !uri"
+msgstr "Chemin : !uri"
+msgid "StatusText: !statusText"
+msgstr "StatusText: !statusText"
+msgid "ResponseText: !responseText"
+msgstr "ResponseText : !responseText"
+msgid "ReadyState: !readyState"
+msgstr "ReadyState : !readyState"
+msgid "No feeds available. <a href=\"@link\">Add feed</a>."
+msgstr "Aucun flux disponible. <a href=\"@link\">Ajouter un flux</a>."
+msgid "No categories available. <a href=\"@link\">Add category</a>."
+msgstr ""
+"Aucune catégorie disponible. <a href=\"@link\">Ajouter une "
+"catégorie</a>."
+msgid ""
+"The length of time between feed updates. Requires a correctly "
+"configured <a href=\"@cron\">cron maintenance task</a>."
+msgstr ""
+"L'intervalle de temps entre les mises à jour du flux. Requiert une <a "
+"href=\"@cron\">tâche planifiée (cron) de maintenance</a> "
+"correctement configurée."
+msgid "News items in block"
+msgstr "Actualités affichées dans le bloc"
+msgid ""
+"Drupal can make a block with the most recent news items of this feed. "
+"You can <a href=\"@block-admin\">configure blocks</a> to be displayed "
+"in the sidebar of your page. This setting lets you configure the "
+"number of news items to show in this feed's block. If you choose '0' "
+"this feed's block will be disabled."
+msgstr ""
+"Drupal peut créer un bloc avec les actualités les plus récentes de "
+"ce flux. Vous pouvez <a href=\"@block-admin\">configurer les blocs</a> "
+"pour les afficher dans une région de votre page. Ce paramètre permet "
+"de configurer le nombre d'actualités à afficher dans le bloc de ce "
+"flux. Si vous entrez '0', le bloc de ce flux sera désactivé."
+msgid ""
+"The URL %url is invalid. Enter a fully-qualified URL, such as "
+"http://www.example.com/feed.xml."
+msgstr ""
+"L'URL %url n'est pas valide. Entrez une URL correctement saisie telle "
+"que http://www.example.com/feed.xml."
+msgid "A feed named %feed already exists. Enter a unique title."
+msgstr "Un flux nommé %feed existe déjà. Choisissez un titre unique."
+msgid "A feed with this URL %url already exists. Enter a unique URL."
+msgstr ""
+"Il existe déjà un flux pour l'adresse %url. Saisissez une adresse "
+"URL unique."
+msgid "Upload an OPML file containing a list of feeds to be imported."
+msgstr "Transférer un fichier OPML contenant une liste de flux à importer."
+msgid "OPML Remote URL"
+msgstr "URL OPML distante"
+msgid ""
+"Enter the URL of an OPML file. This file will be downloaded and "
+"processed only once on submission of the form."
+msgstr ""
+"Saisir l'URL d'un fichier OPML. Ce fichier sera téléchargé et "
+"traité une fois le formulaire soumis."
+msgid ""
+"Drupal can make a block with the most recent news items of a feed. You "
+"can <a href=\"@block-admin\">configure blocks</a> to be displayed in "
+"the sidebar of your page. This setting lets you configure the number "
+"of news items to show in a feed's block. If you choose '0' these "
+"feeds' blocks will be disabled."
+msgstr ""
+"Drupal peut créer un bloc à partir des éléments les plus récents "
+"d'un flux. Vous pouvez <a href=\"@block-admin\">configurer les "
+"blocs</a> pour qu'ils s'affichent dans la barre latérale de votre "
+"page. Ce paramètre vous permet de configurer le nombre d'éléments "
+"disponibles dans un bloc. Si vous choisissez \"0\", le bloc sera "
+"désactivé."
+msgid "You must <em>either</em> upload a file or enter a URL."
+msgstr "Vous devez <em>au choix</em> transférer un fichier ou saisir une URL."
+msgid "This URL is not valid."
+msgstr "Cette URL n'est pas valide."
+msgid "No new feed has been added."
+msgstr "Aucun nouveau flux n'a été ajouté."
+msgid "The URL %url is invalid."
+msgstr "L'URL %url est invalide."
+msgid "A feed named %title already exists."
+msgstr "Il existe déjà un flux nommé %title."
+msgid "A feed with the URL %url already exists."
+msgstr "Il existe déjà un flux pour l'adresse %url."
+msgid ""
+"Fetchers download data from an external source. Choose a fetcher "
+"suitable for the external source you would like to download from."
+msgstr ""
+"Les extracteurs téléchargent des données depuis une source externe. "
+"Choisissez un chercheur adapté à la source externe à partir de "
+"laquelle vous souhaitez télécharger."
+msgid ""
+"Parsers transform downloaded data into standard structures. Choose a "
+"parser suitable for the type of feeds you would like to aggregate."
+msgstr ""
+"Les analyseurs syntaxiques (<em>parsers</em>) transforment les "
+"données téléchargées en structures standard. Choisissez un "
+"analyseur approprié au type de flux que vous souhaitez agréger."
+msgid ""
+"Processors act on parsed feed data, for example they store feed items. "
+"Choose the processors suitable for your task."
+msgstr ""
+"Les processeurs agissent sur le flux de données analysé, ils "
+"stockent par exemple les éléments de flux. Choisissez les "
+"processeurs adaptés à votre tâche."
+msgid "For most aggregation tasks, the default settings are fine."
+msgstr ""
+"Pour la plupart des tâches d'agrégation, les paramètres par défaut "
+"sont bons."
+msgid "A category named %category already exists. Enter a unique title."
+msgstr ""
+"Une catégorie intitulée %category existe déjà. Saisir un titre "
+"unique."
+msgid "Default fetcher"
+msgstr "Extracteur par défaut"
+msgid "Downloads data from a URL using Drupal's HTTP request handler."
+msgstr ""
+"Télécharge des données à partir d'une URL en utilisant le "
+"gestionnaire de requête HTTP de Drupal."
+msgid "Default parser"
+msgstr "Analyseur syntaxique (parser) par défaut"
+msgid "Parses RSS, Atom and RDF feeds."
+msgstr "Analyse les flux RSS, Atom et RDF."
+msgid "Default processor"
+msgstr "Processeur par défaut"
+msgid "Creates lightweight records from feed items."
+msgstr "Crée des enregistrements allégés, à partir des éléments de flux."
+msgid "Default processor settings"
+msgstr "Paramètres du processeur par défaut"
+msgid "Number of items shown in listing pages"
+msgstr "Nombre d'éléments figurant dans les pages de listes"
+msgid ""
+"Requires a correctly configured <a href=\"@cron\">cron maintenance "
+"task</a>."
+msgstr ""
+"Requiert une <a href=\"@cron\">tâche planifiée (cron) de "
+"maintenance</a> correctement configurée."
+msgid "Select categories using"
+msgstr "Sélectionner les catégories en utilisant"
+msgid ""
+"For a small number of categories, checkboxes are easier to use, while "
+"a multiple selector works well with large numbers of categories."
+msgstr ""
+"Pour un petit nombre de catégories, les cases à cocher sont plus "
+"faciles à utiliser, tandis qu'un sélecteur multiple fonctionne bien "
+"avec un grand nombre de catégories."
+msgid "Length of trimmed description"
+msgstr "Longueur de la description tronquée"
+msgid ""
+"The maximum number of characters used in the trimmed version of "
+"content."
+msgstr ""
+"Le nombre maximum de caractères utilisés dans la version tronquée "
+"du contenu."
+msgid ""
+"The Aggregator module is an on-site syndicator and news reader that "
+"gathers and displays fresh content from RSS-, RDF-, and Atom-based "
+"feeds made available across the web. Thousands of sites (particularly "
+"news sites and blogs) publish their latest headlines in feeds, using a "
+"number of standardized XML-based formats. For more information, see "
+"the online handbook entry for <a "
+"href=\"@aggregator-module\">Aggregator module</a>."
+msgstr ""
+"Le module Aggregator est un syndicateur en ligne et un lecteur "
+"d'actualités qui réunit et affiche des contenus récents à partir "
+"de flux basés sur RSS, RDF et Atom, rendus accessibles via le web. "
+"Des milliers de sites (en particulier les nouveaux sites et blogs) "
+"publient leurs derniers entêtes dans des flux, en utilisant certains "
+"formats standardisés basés sur XML. Pour plus d'informations, voir "
+"la section <a href=\"@aggregator-module\">module Aggregator</a> du "
+"manuel en ligne."
+msgid "Viewing feeds"
+msgstr "Visualiser les flux"
+msgid ""
+"Feeds contain published content, and may be grouped in categories, "
+"generally by topic. Users view feed content in the <a "
+"href=\"@aggregator\">main aggregator display</a>, or by <a "
+"href=\"@aggregator-sources\">their source</a> (usually via an RSS feed "
+"reader). The most recent content in a feed or category can be "
+"displayed as a block through the <a href=\"@admin-block\">Blocks "
+"administration page</a>."
+msgstr ""
+"Les flux contiennent des contenus publiés, et peuvent être groupés "
+"en catégories,  généralement par sujet. Les utilisateurs peuvent "
+"voir le contenu du flux sur <a href=\"@aggregator\">l'affichage de "
+"l'agrégateur principal</a>, ou à <a href=\"@aggregator-sources\">sa "
+"source</a> (en principe via un lecteur de flux RSS). Les contenus les "
+"plus récents dans un flux ou une catégorie peuvent être affichés "
+"dans un bloc via la <a href=\"@admin-block\">page d'administration des "
+"blocs</a>."
+msgid "Adding, editing, and deleting feeds"
+msgstr "Ajout, modification et suppression des flux"
+msgid ""
+"Administrators can add, edit, and delete feeds, and choose how often "
+"to check each feed for newly updated items on the <a "
+"href=\"@feededit\">Feed aggregator administration page</a>."
+msgstr ""
+"Les administrateurs peuvent ajouter, modifier ou supprimer des flux et "
+"choisir à quelle fréquence vérifier la présence d'éléments mis "
+"à jour sur la <a href=\"@feededit\">page d'administration de "
+"l'agrégateur de flux</a>."
+msgid "OPML integration"
+msgstr "Intégration OPML"
+msgid ""
+"A <a href=\"@aggregator-opml\">machine-readable OPML file</a> of all "
+"feeds is available. OPML is an XML-based file format used to share "
+"outline-structured information such as a list of RSS feeds. Feeds can "
+"also be <a href=\"@import-opml\">imported via an OPML file</a>."
+msgstr ""
+"Un <a href=\"@aggregator-opml\">fichier système OPML</a> pour tous "
+"les flux est  disponible. OPML est un fichier basé sur le format XML "
+"utilisé pour partager des informations structurées  telles qu'une "
+"liste de flux RSS. Les flux peuvent aussi être <a "
+"href=\"@import-opml\">importés via un fichier OPML</a>."
+msgid "Configuring cron"
+msgstr "Configuration de la tâche planifiée (cron)"
+msgid ""
+"A correctly configured <a href=\"@cron\">cron maintenance task</a> is "
+"required to update feeds automatically."
+msgstr ""
+"Une <a href=\"@cron\">tâche de maintenance cron</a> est requise pour "
+"mettre automatiquement à jour les flux."
+msgid ""
+"<acronym title=\"Outline Processor Markup Language\">OPML</acronym> is "
+"an XML format used to exchange multiple feeds between aggregators. A "
+"single OPML document may contain a collection of many feeds. Drupal "
+"can parse such a file and import all feeds at once, saving you the "
+"effort of adding them manually. You may either upload a local file "
+"from your computer or enter a URL where Drupal can download it."
+msgstr ""
+"<acronym title=\"Outline Processor Markup Language\">OPML</acronym> "
+"est un format XML utilisé pour échanger des flux multiples entre des "
+"agrégateurs. Un seul document OPML peut contenir une collection de "
+"plusieurs flux. Drupal peut analyser un tel fichier et importer tous "
+"les flux à la fois, vous évitant l'effort de les ajouter "
+"manuellement. Vous pouvez au choix transférer un fichier local à "
+"partir de votre ordinateur ou saisir une URL à partir de laquelle "
+"Drupal peut le télécharger."
+msgid "Administer news feeds"
+msgstr "Administrer les flux d'actualités"
+msgid "View news feeds"
+msgstr "Voir les flux d'actualités"
+msgid ""
+"Configure the behavior of the feed aggregator, including when to "
+"discard feed items and how to present feed items and categories."
+msgstr ""
+"Configurer le comportement de l'agrégateur de flux, y compris quand "
+"nettoyer les éléments de flux et comment présenter les éléments "
+"de flux et de catégories."
+msgid ""
+"Override the default title for the block. Use <em>!placeholder</em> to "
+"display no title, or leave blank to use the default block title."
+msgstr ""
+"Supplante le titre par défaut du bloc. Entrer <em>!placeholder</em> "
+"pour ne pas afficher de titre ou laisser vide pour garder le titre par "
+"défaut du bloc."
+msgid "Specify in which themes and regions this block is displayed."
+msgstr ""
+"Préciser pour chaque thème la région dans laquelle ce bloc est "
+"affiché."
+msgid "All pages except those listed"
+msgstr "Toutes les pages sauf celles listées"
+msgid "Only the listed pages"
+msgstr "Seulement les pages listées"
+msgid ""
+"Specify pages by using their paths. Enter one path per line. The '*' "
+"character is a wildcard. Example paths are %blog for the blog page and "
+"%blog-wildcard for every personal blog. %front is the front page."
+msgstr ""
+"Spécifier les pages en utilisant leurs chemins. Saisir un chemin par "
+"ligne. Le caractère «*» est un caractère de remplacement (aussi "
+"appelé joker ou wildcard). Exemples de chemins : %blog pour la page "
+"du blog et %blog-wildcard pour tous les blogs personnels. %front "
+"représente la page d’accueil."
+msgid "Pages on which this PHP code returns <code>TRUE</code> (experts only)"
+msgstr ""
+"Pages sur lesquelles ce code PHP renvoie <code>TRUE</code> "
+"(recommandés aux experts)"
+msgid "Pages or PHP code"
+msgstr "Pages ou code PHP"
+msgid ""
+"If the PHP option is chosen, enter PHP code between %php. Note that "
+"executing incorrect PHP code can break your Drupal site."
+msgstr ""
+"Si l'option PHP est choisie, saisissez le code PHP entre %php. "
+"Attention, si un code PHP incorrect est exécuté, cela peut faire "
+"tomber votre site Drupal."
+msgid "Customizable per user"
+msgstr "Personnalisable par utilisateur"
+msgid "Not customizable"
+msgstr "Non personnalisable"
+msgid "Customizable, visible by default"
+msgstr "Personnalisable, visible par défaut"
+msgid "Customizable, hidden by default"
+msgstr "Personnalisable, caché par défaut"
+msgid "Ensure that each block description is unique."
+msgstr "Assurez-vous que chaque description de bloc est unique."
+msgid ""
+"The Block module allows you to create boxes of content, which are "
+"rendered into an area, or region, of one or more pages of a website. "
+"The core Seven administration theme, for example, implements the "
+"regions \"Content\", \"Help\", \"Dashboard main\", and \"Dashboard "
+"sidebar\", and a block may appear in any one of these regions. The <a "
+"href=\"@blocks\">Blocks administration page</a> provides a "
+"drag-and-drop interface for assigning a block to a region, and for "
+"controlling the order of blocks within regions. For more information, "
+"see the online handbook entry for <a href=\"@block\">Block module</a>."
+msgstr ""
+"Le module \"<em>Block</em>\" permet de créer des boîtes de contenu "
+"affichées dans une zone ou une région d'une ou plusieurs pages d'un "
+"site web. Par exemple, le thème d'administration Seven intégré au "
+"cœur (<em>core</em>) de Drupal, fournit automatiquement les zones "
+"\"Contenu\", \"Aide\", \"Tableau de bord principal\", et \"Tableau de "
+"bord latéral\". Un bloc de contenu peut apparaître dans n'importe "
+"laquelle de ces zones. \r\n"
+"La <a href=\"@blocks\">page d'administration des blocs</a> présente "
+"une interface avec glisser-déposer qui permet d'affecter un bloc à "
+"une zone et de contrôler l'ordre des blocs dans les zones.\r\n"
+"Pour plus d'informations, voir la section <a href=\"@block\">Block</a> "
+"du manuel en ligne."
+msgid "Positioning content"
+msgstr "Positionnement du contenu"
+msgid ""
+"When working with blocks, remember that all themes do <em>not</em> "
+"implement the same regions, or display regions in the same way. Blocks "
+"are positioned on a per-theme basis. Users with the <em>Administer "
+"blocks</em> permission can disable blocks. Disabled blocks are listed "
+"on the <a href=\"@blocks\">Blocks administration page</a>, but are not "
+"displayed in any region."
+msgstr ""
+"Lorsque vous travaillez avec des blocs, n'oubliez pas que tous les "
+"thèmes </em>ne contiennent pas</em> les mêmes régions et <em>ne les "
+"affichent pas</em>de la même façon. Les blocs sont positionnés "
+"selon la structure de chaque thème. Les utilisateurs ayant les droits "
+"<em>Administrer les blocs</em> peuvent désactiver les blocs. Les "
+"blocs désactivés sont listés sur la page <a "
+"href=\"@blocks\">Administrer les blocs</a>, mais ne sont affichés "
+"dans aucune région."
+msgid "Controlling visibility"
+msgstr "Contrôle de la visibilité"
+msgid ""
+"Blocks can be configured to be visible only on certain pages, only to "
+"users of certain roles, or only on pages displaying certain <a "
+"href=\"@content-type\">content types</a>. Administrators can also "
+"allow specific blocks to be enabled or disabled by users when they "
+"edit their <a href=\"@user\">My account</a> page. Some dynamic blocks, "
+"such as those generated by modules, will be displayed only on certain "
+"pages."
+msgstr ""
+"Les blocs peuvent être configurés pour n'être visibles que sur "
+"certaines pages, seulement pour les utilisateurs ayant un certain "
+"rôle, ou seulement sur des pages affichant certains <a "
+"href=\"@content-type\">types de contenus</a>. Les administrateurs "
+"peuvent aussi permettre aux utilisateurs d'afficher ou non certains "
+"blocs lors de l'édition de la page <a href=\"@user\">Mon profil</a>. "
+"Certains blocs dynamiques, comme ceux qui sont générés par des "
+"modules, ne seront affichés que sur certaines pages."
+msgid "Creating custom blocks"
+msgstr "Création des blocs personnalisés"
+msgid ""
+"Users with the <em>Administer blocks</em> permission can <a "
+"href=\"@block-add\">add custom blocks</a>, which are then listed on "
+"the <a href=\"@blocks\">Blocks administration page</a>. Once created, "
+"custom blocks behave just like default and module-generated blocks."
+msgstr ""
+"Les utilisateurs avec les droits <em>Administrer les blocs</em> "
+"peuvent <a href=\"@block-add\">ajouter des blocs personnalisés</a> "
+"qui sont ensuite listés sur la <a href=\"@blocks\">page "
+"d'administration blocs</a>. Une fois créés, les blocs personnalisés "
+"se comportent comme les blocs par défaut et ceux générés via des "
+"modules tiers."
+msgid ""
+"This page provides a drag-and-drop interface for assigning a block to "
+"a region, and for controlling the order of blocks within regions. "
+"Since not all themes implement the same regions, or display regions in "
+"the same way, blocks are positioned on a per-theme basis. Remember "
+"that your changes will not be saved until you click the <em>Save "
+"blocks</em> button at the bottom of the page. Click the "
+"<em>configure</em> link next to each block to configure its specific "
+"title and visibility settings."
+msgstr ""
+"Cette page fournit une interface avec glisser-déposer pour "
+"l'affectation des blocs aux régions et le contrôle de l'ordre des "
+"blocs dans les régions. Les thèmes ne mettent pas tous en œuvre les "
+"mêmes régions ou ne les affichent pas de la même manière, les "
+"blocs sont donc positionnés par thème. Rappelez-vous que vos "
+"modifications ne seront pas enregistrées tant que vous n'aurez pas "
+"cliqué sur le bouton <em>Enregistrer les blocs</em> au bas de la "
+"page. Cliquez sur le lien <em>Configurer</em> à côté de chaque bloc "
+"pour configurer son titre et ses paramètres de visibilité "
+"spécifiques."
+msgid "Demonstrate block regions (@theme)"
+msgstr "Aperçu des régions des blocs (@theme)"
+msgid "Administer blocks"
+msgstr "Administrer les blocs"
+msgid ""
+"A brief description of your block. Used on the <a "
+"href=\"@overview\">Blocks administration page</a>."
+msgstr ""
+"Une courte description de votre bloc qui sera reprise sur la <a "
+"href=\"@overview\">page d'administration des Blocs</a>."
+msgid "Personalize blocks"
+msgstr "Personnaliser les blocs"
+msgid ""
+"Blocks consist of content or information that complements the main "
+"content of the page. Enable or disable optional blocks using the "
+"checkboxes below."
+msgstr ""
+"Les blocs sont constitués de contenus ou d'informations qui viennent "
+"compléter le contenu principal de la page. Activer ou désactiver les "
+"blocs optionnels en utilisant les cases à cocher ci-dessous."
+msgid "Cache blocks"
+msgstr "Cache des blocs"
+msgid ""
+"Block caching is inactive because you have enabled modules defining "
+"content access restrictions."
+msgstr ""
+"La mise en cache des blocs est inactive car vous avez activé les "
+"modules définissant des restrictions d'accès aux contenus."
+msgid ""
+"Controls the visual building blocks a page is constructed with. Blocks "
+"are boxes of content rendered into an area, or region, of a web page."
+msgstr ""
+"Contrôle la construction visuelle des blocs avec lesquels une page "
+"est composée. Les blocs sont des boîtes affichant du contenu dans "
+"une zone, ou région, d'une page Web."
+msgid "Restricted to certain pages"
+msgstr "Réservé à certaines pages"
+msgid "The block cannot be placed in this region."
+msgstr "Le bloc ne peut pas être placé dans cette région."
+msgid "Use for multi-user blogs. Every user gets a personal blog."
+msgstr ""
+"A utiliser pour les blogs multi-utilisateurs. Chaque utilisateur "
+"obtient un blog personnel."
+msgid "Single-user blogs"
+msgstr "Blogs mono-utilisateur"
+msgid ""
+"Each user's blog entries are automatically displayed with a link to "
+"the user's main blog page. You can create as many single-user blogs as "
+"you have site users with permission to create blog content."
+msgstr ""
+"Chaque entrée de blog de l'utilisateur est automatiquement affichée "
+"avec un lien pointant vers la page principale du blog de "
+"l'utilisateur. Vous pouvez créer autant de blogs mono-utilisateur que "
+"vous avez d'utilisateurs du site avec les droits de créer un contenu "
+"blog."
+msgid "Multi-user blogs"
+msgstr "Blogs multi-utilisateurs"
+msgid ""
+"Blog entries from each single-user blog are also aggregated into one "
+"central multi-user blog, which displays the blog content of all users "
+"in a single listing."
+msgstr ""
+"Les entrées de blog de chaque blog mono-utilisateur sont aussi "
+"regroupés dans un blog central multi-utilisateurs, qui affiche les "
+"contenus de blog de tous les utilisateurs en une liste unique."
+msgid ""
+"There is an optional <em>Blogs</em> menu item added to the Navigation "
+"menu, which displays all blogs available on your site, and a <em>My "
+"blog</em> item displaying the current user's blog entries."
+msgstr ""
+"Il y a un élément de menu optionnel <em>Blogs</em> ajouté dans le "
+"menu de navigation, qui affiche tous les blogs disponibles sur votre "
+"site, et un élément <em>Mon blog </em> qui affiche les entrées de "
+"blog de l'utilisateur courant."
+msgid ""
+"The Blog module also creates a default <em>Recent blog posts</em> "
+"block that may be enabled at the <a href=\"@blocks\">blocks "
+"administration page</a>."
+msgstr ""
+"Le module Blog crée également un bloc des <em>Billets récents</em> "
+"qui peut être activé depuis la <a href=\"@blocks\">page "
+"d'administration des blocs</a>."
+msgid "Create new blog entry"
+msgstr "Créer un nouveau billet de blog"
+msgid "Enables multi-user blogs."
+msgstr "Active les blogs multi-utilisateurs."
+msgid "No books available."
+msgstr "Aucun livre disponible."
+msgid "Content types allowed in book outlines"
+msgstr "Les types de contenu autorisés dans les structures de livre"
+msgid "Users with the %outline-perm permission can add all content types."
+msgstr ""
+"Les utilisateurs avec les droits %outline-perm peuvent ajouter tous "
+"les types de contenu."
+msgid "Administer book outlines"
+msgstr "Administrer les structures de livre"
+msgid ""
+"The Book module is used for creating structured, multi-page content, "
+"such as site resource guides, manuals, and wikis. It allows you to "
+"create content that has chapters, sections, subsections, or any "
+"similarly-tiered structure. For more information, see the online "
+"handbook entry for <a href=\"@book\">Book module</a>."
+msgstr ""
+"Le module Book est utilisé pour créer du contenu structuré sur "
+"plusieurs pages, tels que les guides de ressource du site, les "
+"manuels, les wikis. Il permet aussi de créer du contenu qui contient "
+"des chapitres, sections, sous-sections ou une autre structure "
+"organisée de façon similaire sur plusieurs niveaux. Pour plus "
+"d'informations, voir la section du <a href=\"@book\">module Book</a> "
+"du manuel en ligne."
+msgid "Adding and managing book content"
+msgstr "Ajouter et gérer le contenu du livre"
+msgid ""
+"You can assign separate permissions for <em>creating</em>, "
+"<em>editing</em>, and <em>deleting</em> book content, as well as "
+"<em>adding content to books</em>, and <em>creating new books</em>. "
+"Users with the <em>Administer book outlines</em> permission can add "
+"<em>any</em> type of content to a book by selecting the appropriate "
+"book outline while editing the content. They can also view a list of "
+"all books, and edit and rearrange section titles on the <a "
+"href=\"@admin-book\">Book administration page</a>."
+msgstr ""
+"Vous pouvez assigner des droits séparés pour <em>créer</em>, "
+"<em>modifier</em> et <em>supprimer</em> des contenus de livre, ainsi "
+"que <em>ajouter des contenus aux livres</em> et <em>créer des "
+"nouveaux livres</em>. Les utilisateurs avec les droits <em>Administrer "
+"les structures de livre</em> peuvent ajouter <em>n'importe quel</em> "
+"type de contenu à un livre en sélectionnant la structure de livre "
+"appropriée pendant la modification du contenu. Ils peuvent aussi voir "
+"une liste de tous les livres, ainsi que modifier et réarranger les "
+"titres des sections sur la <a href=\"@admin-block\">page "
+"d'administration des blocs</a>."
+msgid ""
+"Book pages have a default book-specific navigation block. This "
+"navigation block contains links that lead to the previous and next "
+"pages in the book, and to the level above the current page in the "
+"book's structure. This block can be enabled on the <a "
+"href='@admin-block'>Blocks administration page</a>. For book pages to "
+"show up in the book navigation, they must be added to a book outline."
+msgstr ""
+"Les pages du module Book possèdent un bloc de navigation spécifique. "
+"Ce bloc contient des liens menant aux pages précédentes et suivantes "
+"dans le livre, ainsi qu'à la page du niveau supérieur. Les blocs "
+"sont activés sur la <a href='@admin-block'>page d'administration du "
+"module Block</a>. Pour que les blocs puissent apparaître, ils doivent "
+"être ajoutés à la structure d'un livre existant."
+msgid ""
+"Books can be created collaboratively, as they allow users with "
+"appropriate permissions to add pages into existing books, and add "
+"those pages to a custom table of contents menu."
+msgstr ""
+"Les livres peuvent être créés en collaboration en permettant aux "
+"utilisateurs disposant des droits appropriés d'ajouter des pages dans "
+"les livres existants et d'ajouter ces pages dans une table des "
+"matières personnalisée."
+msgid "Printing books"
+msgstr "Impression de livres"
+msgid ""
+"Users with the <em>View printer-friendly books</em> permission can "
+"select the <em>printer-friendly version</em> link visible at the "
+"bottom of a book page's content to generate a printer-friendly display "
+"of the page and all of its subsections."
+msgstr ""
+"Les utilisateurs avec le droit <em>Voir l'impression des livres</em> "
+"peut sélectionner le lien <em>version imprimable</em> visible au bas "
+"du contenu d'une page de livre afin de générer un affichage "
+"imprimable de la page et de toutes ses sous-sections."
+msgid ""
+"The book module offers a means to organize a collection of related "
+"content pages, collectively known as a book. When viewed, this content "
+"automatically displays links to adjacent book pages, providing a "
+"simple navigation system for creating and reviewing structured "
+"content."
+msgstr ""
+"Le module Book permet d'organiser un ensemble de pages de contenus "
+"associés, nommées collectivement \"livre\". Lorsqu'il est "
+"visualisé, ce contenu affiche automatiquement des liens vers les "
+"pages adjacentes du livre, fournissant un système de navigation "
+"simple pour créer et réviser les contenus structurés."
+msgid ""
+"The outline feature allows you to include pages in the <a "
+"href=\"@book\">Book hierarchy</a>, as well as move them within the "
+"hierarchy or to <a href=\"@book-admin\">reorder an entire book</a>."
+msgstr ""
+"L'option de structure vous permet d'inclure des contenus dans <a "
+"href=\"@book\">la hiérarchie du livre</a>, tout comme les déplacer "
+"dans la hiérarchie ou <a href=\"@book-admin\">réorganiser un livre "
+"entier</a>."
+msgid "Create new books"
+msgstr "Créer de nouveaux livres"
+msgid "Add content and child pages to books"
+msgstr "Ajouter du contenu et des pages enfants aux livres"
+msgid "View printer-friendly books"
+msgstr "Voir les livres en version imprimable"
+msgid ""
+"View a book page and all of its sub-pages as a single document for "
+"ease of printing. Can be performance heavy."
+msgstr ""
+"Voir une page de livre et toutes ses sous-pages en un seul document "
+"pour en faciliter l'impression. La performance peut s'en trouver "
+"diminuée."
+msgid ""
+"<em>Books</em> have a built-in hierarchical navigation. Use for "
+"handbooks or tutorials."
+msgstr ""
+"<em>Les livres</em> possèdent une navigation hiérarchique "
+"intégrée. Cela est utile pour des guides ou des tutoriels."
+msgid "Allows users to create and organize related content in an outline."
+msgstr ""
+"Permet aux utilisateurs de créer et d'organiser des contenus "
+"associés dans une structure."
+msgid ""
+"The Color module allows users with the <em>Administer site "
+"configuration</em> permission to quickly and easily change the color "
+"scheme of themes that have been built to be compatible with it. For "
+"more information, see the online handbook entry for <a "
+"href=\"@color\">Color module</a>."
+msgstr ""
+"Le module <em>Color</em> permet aux usagers qui ont les droits "
+"<em>Administration de la configuration du site</em> de modifier "
+"rapidement et simplement le jeu de couleurs des thèmes compatibles "
+"avec ce module. Pour plus d'information, voir le <a "
+"href=\"@color\">guide en ligne du module Color</a>."
+msgid "Changing colors"
+msgstr "Modification des couleurs"
+msgid ""
+"Using the Color module allows you to easily change the color of links, "
+"backgrounds, text, and other theme elements. To change the color "
+"settings for a compatible theme, select the <em>Settings</em> link for "
+"your theme on the <a href='@configure'>Themes administration page</a>. "
+"If you don't see a color picker on that page, then your theme is not "
+"compatible with the color module. If you are sure that the theme does "
+"indeed support the color module, but the color picker does not appear, "
+"then <a href='@troubleshoot'>follow these troubleshooting "
+"procedures</a>."
+msgstr ""
+"Le module <em>Color</em> vous permet de changer facilement les "
+"couleurs des liens, des arrière-plans, des textes et d'autres "
+"éléments du thème. Pour changer les paramètres de couleur d'un "
+"thème compatible, sélectionnez le lien <em>Paramètres</em> de votre "
+"thème sur la <a href='@configure'>Page d'administration des "
+"thèmes</a>. Si vous ne voyez pas le sélecteur de couleur sur cette "
+"page, c'est que votre thème n'est pas compatible avec le module "
+"Color. Si vous êtes certain qu'un thème est compatible avec le "
+"module Color, mais que le sélecteur de couleur n'apparaît pas, <a "
+"href='@troubleshoot'>suivez ces procédures de dépannage</a>."
+msgid ""
+"The Color module saves a modified copy of the theme's specified "
+"stylesheets in the files directory. This means that if you make any "
+"manual changes to your theme's stylesheet, <em>you must save your "
+"color settings again, even if they haven't changed</em>. This step is "
+"required because the module stylesheets (in the files directory) need "
+"to be recreated to include your changes."
+msgstr ""
+"Le module <em>Color</em> enregistre une copie modifiée des feuilles "
+"de style spécifiées du thème dans le répertoire des fichiers. Cela "
+"signifie que si vous apportez des modifications manuelles aux feuilles "
+"de style de votre thème, <em>vous devez de nouveau enregistrer vos "
+"paramètres de couleur, même s'ils n'ont pas changé</em>. Cette "
+"étape est nécessaire car les feuilles de style du module (dans le "
+"répertoire files) doivent être recréées pour inclure vos "
+"changements."
+msgid ""
+"The GD library for PHP is enabled, but was compiled without PNG "
+"support. Check the <a href=\"@url\">PHP image documentation</a> for "
+"information on how to correct this."
+msgstr ""
+"La librairie GD pour PHP est activée, mais elle a été compilée "
+"sans le support du format PNG. Consultez la <a "
+"href=\"@url\">documentation PHP sur le traitement des images</a> pour "
+"corriger ce problème."
+msgid ""
+"The GD library for PHP is missing or outdated. Check the <a "
+"href=\"@url\">PHP image documentation</a> for information on how to "
+"correct this."
+msgstr ""
+"La librairie GD pour PHP est manquante ou obsolète. Consultez la <a "
+"href=\"@url\">documentation PHP concernant les images</a> pour savoir "
+"comment corriger cela."
+msgid "Allows administrators to change the color scheme of compatible themes."
+msgstr ""
+"Permet aux administrateurs de modifier le schéma de couleur des "
+"thèmes compatibles."
+msgid "Select one or more comments to perform the update on."
+msgstr ""
+"Sélectionnez un ou plusieurs commentaires pour effectuer la mise à "
+"jour."
+msgid ""
+"There do not appear to be any comments to delete, or your selected "
+"comment was deleted by another administrator."
+msgstr ""
+"Il ne semble pas y avoir de commentaires à supprimer, ou le "
+"commentaire que vous avez sélectionné a été supprimé par un autre "
+"administrateur."
+msgid "Deleted @count comments."
+msgstr "@count commentaires supprimés"
+msgid "Deleted comment @cid and its replies."
+msgstr "Commentaire @cid supprimé ainsi que ses réponses."
+msgid "Comment approved."
+msgstr "Commentaire approuvé."
+msgid "Tokens for comments posted on the site."
+msgstr "Jetons (<em>tokens</em>) pour les commentaires postés sur le site."
+msgid ""
+"The Comment module allows users to comment on site content, set "
+"commenting defaults and permissions, and moderate comments. For more "
+"information, see the online handbook entry for <a "
+"href=\"@comment\">Comment module</a>."
+msgstr ""
+"Le module Comment permet aux utilisateurs de commenter le contenu du "
+"site, de définir les permissions et les actions par défaut et de "
+"modérer les commentaires. Pour plus d'informations, voir la section "
+"sur le<a href=\"@comment\"> module Comment</a> du manuel en ligne."
+msgid "Default and custom settings"
+msgstr "Paramètres par défaut et personnalisés"
+msgid ""
+"Each <a href='@content-type'>content type</a> can have its own default "
+"comment settings configured as: <em>Open</em> to allow new comments, "
+"<em>Hidden</em> to hide existing comments and prevent new comments, or "
+"<em>Closed</em> to view existing comments, but prevent new comments. "
+"These defaults will apply to all new content created (changes to the "
+"settings on existing content must be done manually). Other comment "
+"settings can also be customized per content type, and can be "
+"overridden for any given item of content. When a comment has no "
+"replies, it remains editable by its author, as long as the author has "
+"a user account and is logged in."
+msgstr ""
+"Pour chaque <a href='@content-type'>type de contenu</a> on peut "
+"définir les paramétrages applqués par défaut concernant les "
+"commentaires : <em>Ouvert</em> pour permettre les nouveaux "
+"commentaires, <em>Caché</em> pour cacher les commentaires existants "
+"et empêcher les nouveaux commentaires, ou <em>Fermé</em> pour voir "
+"les commentaires existants mais empêcher les nouveaux commentaires. "
+"Ce comportement sera appliqué à tout nouveau contenu créé (les "
+"modifications sur les paramètres des contenus déjà existants "
+"doivent être réalisés manuellement). Les autres paramétres "
+"concernant les commentaires peuvent être aussi personnalisés par "
+"type de contenu et peuvent être supplantés pour chaque contenu. "
+"Quand un commentaire n'a pas de réponse, il est modifiable par son "
+"auteur tant que l'auteur dispose de son compte utilisateur et qu'il "
+"est connecté."
+msgid "Full comment"
+msgstr "Commentaire complet"
+msgid "Unapproved comments (@count)"
+msgstr "Commentaires non validés (@count)"
+msgid "Administer comments and comment settings"
+msgstr "Administrer les commentaires et les paramètres de commentaire"
+msgid "Edit own comments"
+msgstr "Modifier ses propres commentaires"
+msgid "Number of recent comments"
+msgstr "Nombre de commentaires récents"
+msgid "Threading"
+msgstr "Indentation (de discussion)"
+msgid "Show comment replies in a threaded list."
+msgstr "Afficher les réponses aux commentaires dans une liste indentée."
+msgid "Default comment setting for new content"
+msgstr "Paramètre de commentaires par défaut pour les nouveaux contenus"
+msgid "Allow comment title"
+msgstr "Autoriser les titres de commentaire"
+msgid "Show reply form on the same page as comments"
+msgstr ""
+"Afficher le formulaire de réponse sur la même page que celle des "
+"commentaires"
+msgid "Users with the \"Post comments\" permission can post comments."
+msgstr ""
+"Les utilisateurs avec le droit \"Poster des commentaires\" peuvent "
+"poster des commentaires."
+msgid "Users cannot post comments, but existing comments will be displayed."
+msgstr ""
+"Les utilisateurs ne peuvent pas poster de commentaires, mais les "
+"commentaires existants seront affichés."
+msgid "Comments are hidden from view."
+msgstr "Les commentaires sont cachés de la vue."
+msgid "Users cannot post comments."
+msgstr "Les utilisateurs ne peuvent pas poster de commentaires."
+msgid ""
+"Your comment has been queued for review by site administrators and "
+"will be published after approval."
+msgstr ""
+"Votre commentaire a été mis en attente pour être modéré par les "
+"administrateurs du site et sera publié après approbation."
+msgid "Your comment has been posted."
+msgstr "Votre commentaire a été posté."
+msgid ""
+"<a href=\"@login\">Log in</a> or <a href=\"@register\">register</a> to "
+"post comments"
+msgstr ""
+"<a href=\"@login\">Connectez-vous</a> ou <a "
+"href=\"@register\">inscrivez-vous</a> pour publier un commentaire"
+msgid "<a href=\"@login\">Log in</a> to post comments"
+msgstr "<a href=\"@login\">Identifiez-vous</a> pour poster des commentaires"
+msgid "Flat list"
+msgstr "Liste à plat"
+msgid "Threaded list"
+msgstr "Liste hiérarchisée"
+msgid "Save comment"
+msgstr "Enregistrer le commentaire"
+msgid ""
+"The comment will be unpublished if it contains any of the phrases "
+"above. Use a case-sensitive, comma-separated list of phrases. Example: "
+"funny, bungee jumping, \"Company, Inc.\""
+msgstr ""
+"Le commentaire sera dépublié s'il contient n'importe laquelle des "
+"phrases ci-dessus. Utiliser une liste de phrases sensibles à la casse "
+"et séparées par des virgules. Exemple : marrant, saut à "
+"l'élastique, \"S.A. Société\""
+msgid "Published comment %subject."
+msgstr "Commentaire %subject publié."
+msgid "Saved comment %title"
+msgstr "Commentaire %subject enregistré."
+msgid "List and edit site comments and the comment approval queue."
+msgstr ""
+"Lister et modifier les commentaires du site et la file d'attente "
+"d'approbation des commentaires."
+msgid "Unapproved comments"
+msgstr "Commentaires non aprouvés"
+msgid ""
+"Example: 'webmaster@example.com' or "
+"'sales@example.com,support@example.com' . To specify multiple "
+"recipients, separate each e-mail address with a comma."
+msgstr ""
+"Exemple : 'webmaster@example.com' ou "
+"'ventes@example.com,support@example.com'. Pour définir plusieurs "
+"destinataires, séparez chaque adresse de courriel par une virgule."
+msgid "Category %category has been saved."
+msgstr "La catégorie %category a été enregistrée."
+msgid ""
+"You cannot send more than %limit messages in @interval. Try again "
+"later."
+msgstr ""
+"Vous ne pouvez pas envoyer plus de %limit messages par période de "
+"@interval. Réessayez ultérieurement."
+msgid "Contact @username"
+msgstr "Contacter @username"
+msgid "%sender-name (@sender-from) sent an e-mail regarding %category."
+msgstr ""
+"%sender-name (@sender-from) a envoyé un courriel à propos de "
+"%category."
+msgid "%sender-name (@sender-from) sent %recipient-name an e-mail."
+msgstr "%sender-name (@sender-from) a envoyé un courriel à %recipient-name."
+msgid ""
+"The Contact module allows visitors to contact site administrators and "
+"other users. Users specify a subject, write their message, and can "
+"have a copy of their message sent to their own e-mail address. For "
+"more information, see the online handbook entry for <a "
+"href=\"@contact\">Contact module</a>."
+msgstr ""
+"Le module Contact permet aux visiteurs de contacter les "
+"administrateurs du site et les autres utilisateurs. Les visiteurs "
+"définissent un objet, écrivent leur message et peuvent recevoir sur "
+"leur adresse de courriel personnelle une copie de ce message. Pour "
+"plus d'informations, voir la section du <a href=\"@contact\">module "
+"Contact</a> du manuel en ligne."
+msgid "User contact forms"
+msgstr "Formulaires de contact utilisateur"
+msgid ""
+"Site users can be contacted with a user contact form that keeps their "
+"e-mail address private. Users may enable or disable their personal "
+"contact forms by editing their <em>My account</em> page. If enabled, a "
+"<em>Contact</em> tab leads to a personal contact form displayed on "
+"their user profile. Site administrators are still able to use the "
+"contact form, even if has been disabled. The <em>Contact</em> tab is "
+"not shown when you view your own profile."
+msgstr ""
+"Les utilisateurs du site peut être contactés directement par un "
+"formulaire de contact tout en conservant leur adresse de courriel "
+"privée. Les utilisateurs peuvent activer ou désactiver leur "
+"formulaire de contact personnel en éditant leur page <em>Mon "
+"compte</em>. S'il est activé, un onglet <em>Contact</em> dirige vers "
+"un formulaire de contact personnel affiché sur leur profil "
+"d'utilisateur. Les administrateurs du site sont toujours en mesure "
+"d'utiliser le formulaire de contact, même s'il a été désactivé. "
+"L'onglet <em>Contact</em> n'est pas affiché lorsque vous consultez "
+"votre propre profil."
+msgid "Site-wide contact forms"
+msgstr "Formulaires de contact généraux"
+msgid ""
+"The <a href=\"@contact\">Contact page</a> provides a simple form for "
+"users with the <em>Use the site-wide contact form</em> permission to "
+"send comments, feedback, or other requests. You can create categories "
+"for directing the contact form messages to a set of defined "
+"recipients. Common categories for a business site, for example, might "
+"include \"Website feedback\" (messages are forwarded to website "
+"administrators) and \"Product information\" (messages are forwarded to "
+"members of the sales department). E-mail addresses defined within a "
+"category are not displayed publicly."
+msgstr ""
+"La <a href=\"@contact\">page Contact</a> fournit un simple formulaire "
+"aux utilisateurs qui disposent des droits <em>Utiliser le formulaire "
+"de contact général</em> afin d'envoyer des commentaires, un avis ou "
+"d'autres demandes. Vous pouvez créer des catégories pour rediriger "
+"les messages du formulaire de contact vers un ensemble de "
+"destinataires prédéfinis. Par exemple, pour un site commercial, les "
+"catégories fréquentes peuvent inclure \"votre avis sur le site (dont "
+"les messages seront redirigés vers les administrateurs du site) et "
+"\"information sur les produits\" (dont les messages seront redirigés "
+"vers les membres du service des ventes). Les adresses de courriel "
+"prédéfinies pour chaque catégorie ne sont pas affichées "
+"publiquement."
+msgid ""
+"When the site-wide contact form is enabled, a link in the main "
+"<em>Navigation</em> menu is created, but the link is disabled by "
+"default. This menu link can be enabled on the <a href='@menu'>Menus "
+"administration page</a>."
+msgstr ""
+"Quand le formulaire de contact général est activé, un lien "
+"(désactivé par défaut) est créé dans le menu principal de "
+"<em>navigation</em>. ce lien peut être activé sur la <a "
+"href='@menu'>page de gestion des menus</a>."
+msgid "Customization"
+msgstr "Personnalisation"
+msgid ""
+"If you would like additional text to appear on the site-wide or "
+"personal contact page, use a block. You can create and edit blocks on "
+"the <a href=\"@blocks\">Blocks administration page</a>."
+msgstr ""
+"Si vous souhaitez voir apparaitre d'autre texte sur le formulaire de "
+"contact général du site ou sur le formulaire de contact personnel, "
+"utilisez un bloc. Vous pouvez créer et modifier des blocs sur la <a "
+"href=\"@blocks\">page de gestion des blocs</a>."
+msgid ""
+"Add one or more categories on this page to set up your site-wide <a "
+"href=\"@form\">contact form</a>."
+msgstr ""
+"Ajoutez au moins une catégorie dans cette page pour personnaliser le "
+"<a href=\"@form\">formulaire de contact général</a> du site."
+msgid ""
+"A <em>Contact</em> menu item (disabled by default) is added to the "
+"Navigation menu, which you can modify on the <a "
+"href=\"@menu-settings\">Menus administration page</a>."
+msgstr ""
+"L'élément de menu <em>Contact</em> (désactivé par défaut) est "
+"ajouté au menu de navigation. Vous pouvez le modifier sur la <a "
+"href=\"@menu-settings\">page de gestion des menus</a>."
+msgid ""
+"If you would like additional text to appear on the site-wide contact "
+"page, use a block. You can create and edit blocks on the <a "
+"href=\"@blocks\">Blocks administration page</a>."
+msgstr ""
+"Si vous souhaitez afficher du texte supplémentaire sur la page de "
+"contact générale du site, créez un bloc. Vous pouvez créer et "
+"modifier des blocs sur la <a href=\"@blocks\">page de gestion des "
+"blocs</a>."
+msgid "Administer contact forms and contact form settings"
+msgstr ""
+"Administrer les formulaires de contact et les paramètres des "
+"formulaires de contact."
+msgid "Use the site-wide contact form"
+msgstr "Utiliser le formulaire de contact général"
+msgid "Use users' personal contact forms"
+msgstr "Utiliser les formulaires de contact personnels des utilisateurs"
+msgid ""
+"!sender-name (!sender-url) sent a message using the contact form at "
+"!form-url."
+msgstr ""
+"!sender-name (!sender-url) a envoyé un message en utilisant le "
+"formulaire de contact suivant : !form-url."
+msgid "[!site-name] !subject"
+msgstr "[!site-name] !subject"
+msgid ""
+"!sender-name (!sender-url) has sent you a message via your contact "
+"form (!form-url) at !site-name."
+msgstr ""
+"!sender-name (!sender-url) vous a envoyé un message en utilisant "
+"votre formulaire de contact personnel (!form-url) sur !site-name."
+msgid ""
+"If you don't want to receive such e-mails, you can change your "
+"settings at !recipient-edit-url."
+msgstr ""
+"Si vous ne souhaitez pas recevoir ces courriels, vous pouvez modifier "
+"vos paramètres ici : !recipient-edit-url."
+msgid ""
+"Allow other users to contact you via a <a href=\"@url\">personal "
+"contact form</a> which keeps your e-mail address hidden. Note that "
+"some privileged users such as site administrators are still able to "
+"contact you even if you choose to disable this feature."
+msgstr ""
+"Permet aux autres utilisateurs de vous contacter via votre <a "
+"href=\"@url\">formulaire de contact personnel</a> et donc garde votre "
+"adresse de courriel cachée. Notez que certains utilisateurs "
+"privilégiés tels que les administrateurs du site sont encore en "
+"mesure de vous contacter même si vous choisissez de désactiver cette "
+"fonctionnalité."
+msgid "Enable the personal contact form by default for new users."
+msgstr ""
+"Activer le formulaire de contact personnel par défaut pour les "
+"nouveaux utilisateurs."
+msgid "Changing this setting will not affect existing users."
+msgstr "Modifier ce paramètre n'affectera pas les utilisateurs existants."
+msgid ""
+"The Contextual links module displays links related to regions of pages "
+"on your site to users with <em>access contextual links</em> "
+"permission. For more information, see the online handbook entry for <a "
+"href=\"@contextual\">Contextual links module</a>."
+msgstr ""
+"Le module <em>Contextual links</em> affiche aux utilisateurs disposant "
+"du droit <em>accéder aux liens contextuels</em> des liens liés a des "
+"régions des pages de votre site. Pour plus d'information, voir la "
+"section <a href=\"@contextual\">Contextual links</a> du manuel en "
+"ligne."
+msgid "Displaying contextual links"
+msgstr "Affichage des liens contextuels"
+msgid ""
+"Contextual links are supplied by modules, to give you quick access to "
+"tasks associated with regions of pages on your site. For instance, if "
+"you have a custom menu block displayed in a sidebar of your site, the "
+"Blocks and Menus modules will supply links to configure the block and "
+"edit the menu. The Contextual links module collects these links into a "
+"list for display by your theme, and also adds JavaScript code to the "
+"page to hide the links initially, and display them when your mouse "
+"hovers over the block."
+msgstr ""
+"Les liens contextuels sont fournis par les modules pour vous donner "
+"accès rapidement aux tâches associées à des régions de pages sur "
+"votre site. Par exemple, si vous avez un bloc de menu personnalisé "
+"affiché dans une barre latérale de votre site, les modules "
+"<em>Menu</em> et <em>Block</em> afficheront des liens pour configurer "
+"le bloc et modifier le menu. Le module <em>Contextual links</em> "
+"collecte ces liens dans une liste pour qu'ils soient affiché par "
+"votre thème graphique. Le <em>Contextual links</em> ajoute aussi du "
+"code JavaScript pour masquer les liens par défaut puis les afficher "
+"quand la souris passe au dessus."
+msgid "Use contextual links"
+msgstr "Utiliser les liens contextuels"
+msgid "Use contextual links to perform actions related to elements on a page."
+msgstr ""
+"Utilisez les liens contextuels pour réaliser des tâches liées à "
+"des composants d'une page."
+msgid "Contextual links"
+msgstr "Liens contextuels"
+msgid ""
+"Provides contextual links to perform actions related to elements on a "
+"page."
+msgstr ""
+"Fournit des liens contextuels pour réaliser des tâches liées aux "
+"composants d'une page."
+msgid "Tracking user activity"
+msgstr "Suivi de l'activité de l'utilisateur"
+msgid ""
+"By enabling blocks such as <em>Who's online</em> and <em>Who's "
+"new</em>, site users can track who is logged in and new user signups "
+"at a centralized location."
+msgstr ""
+"En activant des blocs tels que <em>Membres en ligne</em> et "
+"<em>Nouveaux membres</em>, vous permettez aux utilisateurs du site de "
+"suivre au même endroit qui est connecté et qui vient de s'inscrire."
+msgid "Tracking content activity"
+msgstr "Suivi de l'activité du contenu"
+msgid ""
+"By enabling blocks such as <em>Recent blog posts</em>, <em>New forum "
+"topics</em> and <em>Recent comments</em>, site users can view newly "
+"added site content at a glance."
+msgstr ""
+"En activant des blocs tels que <em>Billets récents</em>, <em>Nouveaux "
+"sujets du forum</em> et <em>Commentaires récents</em>, vous permettez "
+"aux utilisateurs de voir en un coup d'oeil  le contenu nouvellement "
+"ajouté."
+msgid "View the administrative dashboard"
+msgstr "Voir le tableau de bord de gestion"
+msgid ""
+"This dashboard region is empty. Click <em>Customize dashboard</em> to "
+"add blocks to it."
+msgstr ""
+"Cette région du tableau de bord est vide. Cliquez sur "
+"<em>Personnaliser le tableau de bord</em> pour lui  ajouter des blocs."
+msgid "DRAG HERE"
+msgstr "GLISSEZ ICI"
+msgid ""
+"Provides a dashboard page in the administrative interface for "
+"organizing administrative tasks and tracking information within your "
+"site."
+msgstr ""
+"Fournit une page de tableau de bord dans l'interface de gestion pour "
+"organiser les tâches et suivre les informations de votre site."
+msgid "Customize dashboard"
+msgstr "Personnaliser le tableau de bord"
+msgid "Clear log messages"
+msgstr "Effacer les messages du journal"
+msgid "This will permanently remove the log messages from the database."
+msgstr ""
+"Cela supprimera définitivement les messages du journal stockés dans "
+"la base de données."
+msgid "Database log cleared."
+msgstr "Les entrées du journal de la base de données ont été effacées."
+msgid ""
+"The Database logging module logs system events in the Drupal database. "
+"For more information, see the online handbook entry for the <a "
+"href=\"@dblog\">Database logging module</a>."
+msgstr ""
+"Le module <em>Database logging</em> stocke les événements système "
+"dans la base de données. Pour plus d'information, voir la section <a "
+"href=\"@dblog\">Database logging</a> du manuel en ligne."
+msgid "Monitoring your site"
+msgstr "Surveillance de votre site"
+msgid "Debugging site problems"
+msgstr "Débogage des problèmes de site"
+msgid "Field validation errors"
+msgstr "Erreurs de validation du champ"
+msgid "Attempt to create a field with a name longer than 32 characters: %name"
+msgstr ""
+"Tentative de création d'un champ avec un nom plus long que 32 "
+"caractères : %name"
+msgid "Attempt to create field name %name which already exists and is active."
+msgstr "Tentative de création du nom de champ %name déjà existant et actif."
+msgid ""
+"Attempt to create field name %name which already exists, although it "
+"is inactive."
+msgstr ""
+"Tentative de création du nom de champ %name déjà existant mais "
+"inactif."
+msgid ""
+"Attempt to create field name %name which is reserved by entity type "
+"%type."
+msgstr ""
+"Tentative de création du nom de champ %name réservé par l'entité "
+"de type %type."
+msgid "Attempt to create a field of unknown type %type."
+msgstr "Tentative de création d'un champ de type inconnu %type."
+msgid "Attempt to create a field with unknown storage type %type."
+msgstr ""
+"Tentative de création d'un champ avec le type de stockage inconnu "
+"%type."
+msgid "Attempt to create an instance of field @field_name without a bundle."
+msgstr ""
+"Tentative de création d'une instance du champ @field_name sans "
+"paquet."
+msgid "Enabling field types"
+msgstr "Activation des types de champ"
+msgid ""
+"The Field module provides the infrastructure for fields and field "
+"attachment; the field types and input widgets themselves are provided "
+"by additional modules. Some of the modules are required; the optional "
+"modules can be enabled from the <a href=\"@modules\">Modules "
+"administration page</a>. Drupal core includes the following field type "
+"modules: Number (required), Text (required), List (required), Taxonomy "
+"(optional), Image (optional), and File (optional); the required "
+"Options module provides input widgets for other field modules. "
+"Additional fields and widgets may be provided by contributed modules, "
+"which you can find in the <a href=\"@contrib\">contributed module "
+"section of Drupal.org</a>. Currently enabled field and input widget "
+"modules:"
+msgstr ""
+"Le module <em>Field</em> fournit l'infrastructure pour les champs et "
+"attachement de champ ; les types de champ et les widgets de saisie "
+"sont quant à eux fournis par des modules additionnels. Certains "
+"modules sont obligatoires ; les modules optionnels peuvent être "
+"activés depuis la <a href=\"@modules\">page de gestion des "
+"modules</a>. Drupal (<em>Core</em>) inclut les modules de type de "
+"champ suivants : <em>Number</em> (requis), <em>Text</em> (requis), "
+"<em>List</em> (requis), <em>Taxonomy</em> (optionnel), <em>Image</em> "
+"(optionnel) et <em>File</em> (optionnel) ; le module <em>Options</em> "
+"(requis) fournit des widgets de saisie pour d'autres modules de champ. "
+"Des champs et des widgets supplémentaires peuvent être fournis par "
+"des modules contribués que vous trouverez dans la <a "
+"href=\"@contrib\">rubrique des modules contribués de Drupal.org</a>. "
+"Les modules de champ et de widget actuellement activés sont :"
+msgid "Managing field data storage"
+msgstr "Gestion du stockage des données du champ"
+msgid ""
+"Developers of field modules can either use the default <a "
+"href=\"@sql-store\">Field SQL storage module</a> to store data for "
+"their fields, or a contributed or custom module developed using the <a "
+"href=\"@storage-api\">field storage API</a>."
+msgstr ""
+"Les développeurs de modules de champ peuvent utiliser soit le module "
+"<a href=\"@sql-store\"><em>Field SQL storage</em></a> pour stocker les "
+"données de leurs champs, soit un module contribué, soit un module "
+"personnalisé développé utilisant <a href=\"@storage-api\">field "
+"storage API</a>."
+msgid ""
+"The Field SQL storage module stores field data in the database. It is "
+"the default field storage module; other field storage mechanisms may "
+"be available as contributed modules. See the <a "
+"href=\"@field-help\">Field module help page</a> for more information "
+"about fields."
+msgstr ""
+"Le module <em>Field SQL storage</em> stocke les données des champs "
+"dans la base de données. C'est le module de stockage de champ fourni "
+"par défaut. D'autres mécanismes de stockage de champs peuvent être "
+"disponibles sous forme de modules contribués. Pour plus d'information "
+"à propos des champs, voir la section <a "
+"href=\"@field-help\">Field</a> du manuel en ligne."
+msgid "Default SQL storage"
+msgstr "Stockage SQL par défaut"
+msgid "Stores fields in the local SQL database, using per-field tables."
+msgstr ""
+"Stocke les fichiers dans la base de données SQL locale en utilisant "
+"une table par champ."
+msgid "Field SQL storage"
+msgstr "Champ de stockage SQL"
+msgid "Stores field data in an SQL database."
+msgstr "Stocke les données du champ dans une base de données SQL."
+msgid ""
+"The List module defines various fields for storing a list of items, "
+"for use with the Field module. Usually these items are entered through "
+"a select list, checkboxes, or radio buttons. See the <a "
+"href=\"@field-help\">Field module help page</a> for more information "
+"about fields."
+msgstr ""
+"Le module <em>List</em> défini différents champs permettant de "
+"stocker une liste d'éléments, à utiliser avec le module "
+"<em>Field</em>. D'habitude, ces éléments sont saisis via une liste "
+"des cases à cocher ou des radios boutons. Pour plus d'information à "
+"propos des champs, voir voir la section <a "
+"href=\"@field-help\">Field</a> du manuel en ligne."
+msgid "This field stores simple on/off or yes/no options."
+msgstr "Ce champ stocke des options basiques telles que on/off ou oui/non."
+msgid "List (text)"
+msgstr "Liste (texte)"
+msgid ""
+"The 'checkboxes/radio buttons' widget will display checkboxes if the "
+"<em>Number of values</em> option is greater than 1 for this field, "
+"otherwise radios will be displayed."
+msgstr ""
+"Le widget 'cases à cocher/radio boutons' affichera des cases à "
+"cocher si l'option <em>Nombre de valeurs</em> est supérieur à 1 pour "
+"ce champ, sinon des radio boutons seront affichés."
+msgid "Allowed HTML tags in labels: @tags"
+msgstr "Balises HTML autorisées dans les étiquettes : @tags"
+msgid ""
+"The value of this field is being determined by the %function function "
+"and may not be changed."
+msgstr ""
+"La valeur de ce champ est déterminée par la fonction %function et ne "
+"doit pas être modifiée."
+msgid "Allowed values list: each key must be a valid integer or decimal."
+msgstr ""
+"Liste de valeurs autorisées : chaque clé doit être un entier ou un "
+"décimal valide."
+msgid ""
+"Allowed values list: each key must be a string at most 255 characters "
+"long."
+msgstr ""
+"Liste de valeurs autorisées : chaque clé doit être une chaîne de "
+"255 caractères maximum."
+msgid "Allowed values list: keys must be integers."
+msgstr "Liste de valeurs autorisées : les clés doivent êtres des entiers."
+msgid "Defines list field types. Use with Options to create selection lists."
+msgstr ""
+"Définit les types de champ liste. À utiliser avec Options pour "
+"créer des listes déroulantes."
+msgid ""
+"The Number module defines various numeric field types for the Field "
+"module. Numbers can be in integer, decimal, or floating-point form, "
+"and they can be formatted when displayed. Number fields can be limited "
+"to a specific set of input values or to a range of values. See the <a "
+"href=\"@field-help\">Field module help page</a> for more information "
+"about fields."
+msgstr ""
+"Le module <em>Number</em> défini différents types de champs "
+"numériques pour le module <em>Field</em>. Les nombres peuvent être "
+"un entier, un décimal, une virgule flottante et peuvent être "
+"formaté à l'affichage. Les champs numériques peuvent être limités "
+"à un ensemble de valeurs d'entrée ou à une plage de valeurs "
+"d'entrée. Pour plus d'information à propos des champs, voir la "
+"section <a href=\"@field-help\">Field</a> du manuel en ligne."
+msgid "This field stores a number in the database as an integer."
+msgstr ""
+"Ce champ stocke un nombre dans la base de données (sous forme d'un "
+"entier)."
+msgid "This field stores a number in the database in a fixed decimal format."
+msgstr ""
+"Ce champ stocke un nombre dans la base de données (dans un format "
+"décimal fixe)."
+msgid "This field stores a number in the database in a floating point format."
+msgstr ""
+"Ce champ stocke un nombre dans la base de données (dans un format à "
+"virgule flottante)."
+msgid ""
+"The minimum value that should be allowed in this field. Leave blank "
+"for no minimum."
+msgstr ""
+"La valeur minimale qui doit être autorisée dans ce champ. Laisser "
+"vide pour ne pas imposer de minimum."
+msgid ""
+"The maximum value that should be allowed in this field. Leave blank "
+"for no maximum."
+msgstr ""
+"La valeur maximale qui doit être autorisée dans ce champ. Laisser "
+"vide pour ne pas imposer de maximum."
+msgid ""
+"Define a string that should be prefixed to the value, like '$ ' or "
+"'&euro; '. Leave blank for none. Separate singular and plural values "
+"with a pipe ('pound|pounds')."
+msgstr ""
+"Définir une chaîne préfixant la valeur comme par exemple '$ ' ou "
+"'&euro;'. Laisser vide pour ne rien ajouter. Laisser vide pour ne pas "
+"préfixer. Séparer les valeurs du singulier et du pluriel avec un "
+"pipe ('gramme|grammes')."
+msgid "Only numbers and the decimal separator (@separator) allowed in %field."
+msgstr ""
+"Seuls les nombres et le séparateur décimal (@separator) son "
+"autorisés dans %field."
+msgid ""
+"The Options module defines checkbox, selection, and other input "
+"widgets for the Field module. See the <a href=\"@field-help\">Field "
+"module help page</a> for more information about fields."
+msgstr ""
+"Le module <em>Options</em> fourni des widget de saisie pour le module "
+"<em>Field</em> tels que case à cocher, sélection, etc. Pour plus "
+"d'information à propos des champs, voir la section <a "
+"href=\"@field-help\">Field</a> du manuel en ligne."
+msgid ""
+"The Text module defines various text field types for the Field module. "
+"A text field may contain plain text only, or optionally, may use "
+"Drupal's <a href='@filter-help'>text filters</a> to securely manage "
+"HTML output. Text input fields may be either a single line (text "
+"field), multiple lines (text area), or for greater input control, a "
+"select box, checkbox, or radio buttons. If desired, the field can be "
+"validated, so that it is limited to a set of allowed values. See the "
+"<a href='@field-help'>Field module help page</a> for more information "
+"about fields."
+msgstr ""
+"Le module <em>Text</em> défini différents type de champ texte pour "
+"le module <em>Field</em>. Un champ texte ne devrait contenir que du "
+"texte brut, ou, en option, du <a href='@filter-help'>texte filtré</a> "
+"par Drupal pour gérer le rendu HTML de manière sécurisée. Les "
+"champs de saisie texte peuvent être soit une seule ligne (champ "
+"texte) ou plusieurs lignes (zone de texte), ou pour un meilleur "
+"contrôle de la saisie, une liste déroulante, une case à cocher ou "
+"un radio bouton. Si vous le souhaitez, le champ peut être validé de "
+"sorte que seule une liste précise de valeurs est autorisée. Pour "
+"plus d'information sur les champs texte, voir la section <a "
+"href='@field-help'>Field</a> du manuel en ligne."
+msgid "This field stores varchar text in the database."
+msgstr "Ce champ stocke un varchar dans la base de données."
+msgid "Long text"
+msgstr "Texte long"
+msgid "This field stores long text in the database."
+msgstr "Ce champ stocke un texte long dans la base de données."
+msgid "Long text and summary"
+msgstr "Texte long et résumé"
+msgid ""
+"This field stores long text in the database along with optional "
+"summary text."
+msgstr ""
+"Ce champ stocke dans la base de données les textes longs et leur "
+"résumé optionnel."
+msgid "Filtered text (user selects text format)"
+msgstr "Texte filtré (l'utilisateur sélectionne le format de texte)"
+msgid "Summary input"
+msgstr "Champ de saisie du résumé"
+msgid ""
+"This allows authors to input an explicit summary, to be displayed "
+"instead of the automatically trimmed text when using the \"Summary or "
+"trimmed\" display type."
+msgstr ""
+"Cela autorise les auteurs à saisir un résumé explicite qui sera "
+"affiché à la place du texte coupé en utilisant le type d'affichage "
+"\"Résumé ou coupé\"."
+msgid "%name: the text may not be longer than %max characters."
+msgstr "%name : le texte ne devrait pas être plus long que %max caractères."
+msgid "%name: the summary may not be longer than %max characters."
+msgstr "%name : le résumé ne doit pas excéder %max caractères."
+msgid "Summary or trimmed"
+msgstr "Résumé ou coupé"
+msgid "Text area with a summary"
+msgstr "Zone de texte avec un résumé"
+msgid "Leave blank to use trimmed value of full text as the summary."
+msgstr ""
+"Laissez vide pour utiliser la valeur courte du texte intégral en tant "
+"que résumé."
+msgid "Hide summary"
+msgstr "Masquer le résumé"
+msgid "Edit summary"
+msgstr "Modifier le résumé"
+msgid ""
+"%field (@field_name) field requires the %widget_type widget provided "
+"by %widget_module module"
+msgstr ""
+"le champ %field (@field_name) nécessite le widget %widget_type fourni "
+"par le module %widget_module"
+msgid ""
+"Inactive fields are not shown unless their providing modules are "
+"enabled. The following fields are not enabled: !list"
+msgstr ""
+"Les champs inactifs ne sont pas affichés sauf si leurs modules "
+"d'origine sont activés. Les champs suivants ne sont pas activés : "
+"!list"
+msgid "Edit field settings."
+msgstr "Modifier les paramètres du champ."
+msgid "Change widget type."
+msgstr "Modifier le type de widget."
+msgid "Edit instance settings."
+msgstr "Modifier les paramètres de l'instance."
+msgid "Delete instance."
+msgstr "Supprimer l'instance."
+msgid "The field %label cannot be added because it is locked."
+msgstr "Le champ %label ne peut pas être ajouté car il est verrouillé."
+msgid "There was a problem creating field instance %label: @message."
+msgstr ""
+"Il y a eu un problème lors de la création de l'instance du champ "
+"%label : @message."
+msgid ""
+"There are no fields yet added. You can add new fields on the <a "
+"href=\"@link\">Manage fields</a> page."
+msgstr ""
+"Aucun champ n'a encore été ajouté. Vous pouvez ajouter de nouveaux "
+"champs depuis la page <a href=\"@link\">Gérer les champs</a>."
+msgid ""
+"These settings apply to the %field field everywhere it is used. These "
+"settings impact the way that data is stored in the database and cannot "
+"be changed once data has been created."
+msgstr ""
+"Ces paramètres s'appliquent au champ %field partout où il est "
+"utilisé. Ces paramètres impactent la manière dont les données sont "
+"stockées dans la base et ne peuvent être changés après que la "
+"donnée a été créée."
+msgid "%field has no field settings."
+msgstr "%field n'a pas de paramètres de champ."
+msgid "Updated field %label field settings."
+msgstr "Paramètres du champ %label mis à jour."
+msgid "Attempt to update field %label failed: %message."
+msgstr "La tentative de mise à jour du champ %label a échoué : %message."
+msgid "Change widget"
+msgstr "Changer le widget"
+msgid ""
+"The type of form element you would like to present to the user when "
+"creating this field in the %type type."
+msgstr ""
+"Le type d'élément de formulaire que vous aimeriez présenter à "
+"l'utilisateur lors de la création de ce champ dans le type %type."
+msgid "Changed the widget for field %label."
+msgstr "Le widget du champ %label a été modifié."
+msgid "There was a problem changing the widget for field %label."
+msgstr "Il y a eu un problème pour modifier le widget du champ %label."
+msgid "This field is <strong>locked</strong> and cannot be deleted."
+msgstr ""
+"Ce champ est <strong>verrouillé</strong> et ne peut pas être "
+"supprimé."
+msgid "The field %field has been deleted from the %type content type."
+msgstr "Le champ %field a été supprimé du type de contenu %type."
+msgid "There was a problem removing the %field from the %type content type."
+msgstr ""
+"Il y a eu un problème pour supprimer le champ %field du type de "
+"contenu %type."
+msgid ""
+"These settings apply only to the %field field when used in the %type "
+"type."
+msgstr ""
+"Ces paramètres ne s'appliquent au champ %field que lorsqu'il est "
+"utilisé dans le type de contenu %type."
+msgid "Required field"
+msgstr "Champ requis"
+msgid ""
+"These settings apply to the %field field everywhere it is used. "
+"Because the field already has data, some settings can no longer be "
+"changed."
+msgstr ""
+"Ces paramètres s'appliquent au champ %field partout où il est "
+"utilisé. Le champ possédant déjà des données, certains "
+"paramètres ne peuvent plus être modifiés."
+msgid "These settings apply to the %field field everywhere it is used."
+msgstr ""
+"Ces paramètres s'appliquent au champ %field partout où il est "
+"utilisé."
+msgid "%field field settings"
+msgstr "paramètres du champ %field"
+msgid "The default value for this field, used when creating new content."
+msgstr ""
+"La valeur par défaut de ce champ, utilisée lors de la création de "
+"nouveau contenu."
+msgid "Saved %label configuration."
+msgstr "La configuration de %label a été enregistrée."
+msgid "This list shows all fields currently in use for easy reference."
+msgstr ""
+"Cette liste affiche tous les champs actuellement utilisés pour en "
+"faciliter la consultation."
+msgid "Save and add fields"
+msgstr "Enregistrer et ajouter les champs"
+msgid "Field list"
+msgstr "Liste des champs"
+msgid "Manage display"
+msgstr "Gérer l'affichage"
+msgid "Field UI"
+msgstr "Field UI"
+msgid "This field stores the ID of a file as an integer value."
+msgstr ""
+"Ce champ stocke l'identifiant (ID) d'un fichier sous la forme d'un "
+"entier."
+msgid "Enable <em>Display</em> field"
+msgstr "Activer le champ <em>Affichage</em>"
+msgid ""
+"The display option allows users to choose if a file should be shown "
+"when viewing the content."
+msgstr ""
+"L'option d'affichage permet aux utilisateurs de choisir si un fichier "
+"doit être affiché lors de la visualisation du contenu."
+msgid "Files displayed by default"
+msgstr "Fichiers affichés par défaut"
+msgid "This setting only has an effect if the display option is enabled."
+msgstr "Ce paramètre n'a d'effet que si l'option d'affichage est activée."
+msgid "Upload destination"
+msgstr "Destination pour le transfert"
+msgid ""
+"Select where the final files should be stored. Private file storage "
+"has significantly more overhead than public files, but allows "
+"restricted access to files within this field."
+msgstr ""
+"Sélectionnez où les fichiers finaux doivent être stockés. Le "
+"stockage privé de fichier pose beaucoup plus de contraintes que le "
+"stockage public, mais permet un accès restreint aux fichiers pour ce "
+"champ."
+msgid ""
+"Optional subdirectory within the upload destination where files will "
+"be stored. Do not include preceding or trailing slashes."
+msgstr ""
+"Sous-répertoire optionnel dans le répertoire de transfert où les "
+"fichiers seront stockés. Ne pas inclure de slash avant ou après."
+msgid ""
+"Enter a value like \"512\" (bytes), \"80 KB\" (kilobytes) or \"50 MB\" "
+"(megabytes) in order to restrict the allowed file size. If left empty "
+"the file sizes will be limited only by PHP's maximum post and file "
+"upload sizes (current limit <strong>%limit</strong>)."
+msgstr ""
+"Saisissez une valeur comme \"512\" (octets), \"80 KB\" (kilo octets) "
+"ou \"50 MB\" (méga octets) pour restreindre la taille de fichier "
+"autorisée. Si ce champ est laissé vide, la taille du fichier ne sera "
+"limitée que par la taille maximale de transfert de PHP (limite "
+"actuelle <strong>%limit</strong>)."
+msgid "Enable <em>Description</em> field"
+msgstr "Activer le champ <em>Description</em>"
+msgid ""
+"The description field allows users to enter a description about the "
+"uploaded file."
+msgstr ""
+"Le champ description permet aux utilisateurs d'ajouter une description "
+"du fichier transféré."
+msgid ""
+"The \"!name\" option must contain a valid value. You may either leave "
+"the text field empty or enter a string like \"512\" (bytes), \"80 KB\" "
+"(kilobytes) or \"50 MB\" (megabytes)."
+msgstr ""
+"L'option \"!name\" doit contenir une valeur valide. Vous pouvez soit "
+"laisser le champ vide, soit saisir une chaîne telle que \"512\" "
+"(octets), \"80 Ko\" (kilo octets) or \"50 Mo\" (Méga octets)."
+msgid ""
+"The list of allowed extensions is not valid, be sure to exclude "
+"leading dots and to separate extensions with a comma or space."
+msgstr ""
+"La liste des extensions autorisées n'est pas valide. Soyez certains "
+"d'exclure les points précédents l'extension et de séparer les "
+"extensions par un espace ou une virgule."
+msgid "Generic file"
+msgstr "Fichier générique"
+msgid "Table of files"
+msgstr "Tableau des fichiers"
+msgid "Add a new file"
+msgstr "Ajouter un nouveau fichier"
+msgid "Include file in display"
+msgstr "Inclure le fichier dans l'affichage"
+msgid "The description may be used as the label of the link to the file."
+msgstr ""
+"La description peut être utilisée en tant qu'étiquette du lien "
+"pointant vers le fichier."
+msgid "Files must be less than !size."
+msgstr "Les fichiers doivent peser moins de !size."
+msgid "Allowed file types: !extensions."
+msgstr "Extensions autorisées : !extensions."
+msgid "Images must be exactly !size pixels."
+msgstr "Les images doivent faire exactement !size pixels."
+msgid "Images must be between !min and !max pixels."
+msgstr "Les images doivent faire entre !min et !max pixels."
+msgid "Images must be larger than !min pixels."
+msgstr "Les images doivent avoir une définition supérieure à !min pixels."
+msgid "Images must be smaller than !max pixels."
+msgstr "Les images doivent être plus petites que !max pixels."
+msgid ""
+"The File module defines a <em>File</em> field type for the Field "
+"module, which lets you manage and validate uploaded files attached to "
+"content on your site (see the <a href=\"@field-help\">Field module "
+"help page</a> for more information about fields). For more "
+"information, see the online handbook entry for <a href=\"@file\">File "
+"module</a>."
+msgstr ""
+"Le module <em>File</em> défini un champ de type fichier pour le "
+"module <em>Field</em> ce qui vous permet de gérer et valider les "
+"fichiers transférés attachés aux contenus de votre site (voir la <a "
+"href=\"@field-help\">page d'aide du module <em>Field</em></a>). Pour "
+"plus d'information, voir la section <a "
+"href=\"@file\"><em>File</em></a> du manuel en ligne."
+msgid "Attaching files to content"
+msgstr "Attacher des fichiers au contenu"
+msgid ""
+"The File module allows users to attach files to content (e.g., PDF "
+"files, spreadsheets, etc.), when a <em>File</em> field is added to a "
+"given content type using the <a href=\"@fieldui-help\">Field UI "
+"module</a>. You can add validation options to your File field, such as "
+"specifying a maximum file size and allowed file extensions."
+msgstr ""
+"Le module <em>File</em> permet aux utilisateurs d'attacher des "
+"fichiers à un contenu (par exemple, PDF, XLS, etc.) quand un champ "
+"<em>File</em> est ajouté à un type de contenu donné via le module "
+"<a href=\"@fieldui-help\"><em>Field UI</em></a>."
+msgid "Managing attachment display"
+msgstr "Gérer l'affichage des fichiers attachés"
+msgid ""
+"When you attach a file to content, you can specify whether it is "
+"<em>listed</em> or not. Listed files are displayed automatically in a "
+"section at the bottom of your content; non-listed files are available "
+"for embedding in your content, but are not included in the list at the "
+"bottom."
+msgstr ""
+"Quand vous attachez un fichier à un contenu, vous pouvez spécifier "
+"s'il sera <em>listé</em> ou non. Les fichiers <em>listés</em> sont "
+"affichés automatiquement en bas de contenu. Les fichiers <em>non "
+"listés</em> sont disponibles pour être inclus dans le contenu mais "
+"ne sont pas affichés automatiquement en bas de contenu."
+msgid "Managing file locations"
+msgstr "Gérer l'emplacement des fichiers"
+msgid ""
+"When you create a File field, you can specify a directory where the "
+"files will be stored, which can be within either the <em>public</em> "
+"or <em>private</em> files directory. Files in the public directory can "
+"be accessed directly through the web server; when public files are "
+"listed, direct links to the files are used, and anyone who knows a "
+"file's URL can download the file. Files in the private directory are "
+"not accessible directly through the web server; when private files are "
+"listed, the links are Drupal path requests. This adds to server load "
+"and download time, since Drupal must start up and resolve the path for "
+"each file download request, but allows for access restrictions."
+msgstr ""
+"Quand vous créez un champ de type fichier, vous pouvez spécifier un "
+"répertoire dans lequel les fichiers seront stockés. Ce répertoire "
+"peut être situé soit dans le répertoire de fichiers "
+"<em>publique</em> soit dans le répertoire de fichiers "
+"<em>privé</em>. Les fichiers situés dans le répertoire public "
+"peuvent être accédés directement au travers du serveur web. Quand "
+"des fichiers publics sont listés, des liens directs sont utilisés et "
+"tous ceux qui connaissent l'URL d'un fichier peuvent le télécharger. "
+"Les fichiers situés dans le répertoire privé ne sont pas "
+"directement accessibles via le serveur web et les liens sont des "
+"requêtes Drupal. Cela pèse sur la charge serveur et le temps de "
+"téléchargement car Drupal doit démarrer et résoudre le chemin pour "
+"chaque requête de téléchargement. En revanche, cela permet de "
+"restreindre l'accès."
+msgid ""
+"An unrecoverable error occurred. Use of this form has expired. Try "
+"reloading the page and submitting again."
+msgstr ""
+"Une erreur irrécupérable s'est produite. L'utilisation de ce "
+"formulaire a expiré. Essayez de recharger la page et de la renvoyer."
+msgid "The file referenced by the !name field does not exist."
+msgstr "Le fichier référencé par le champ !name n'existe pas."
+msgid "The file in the !name field was unable to be uploaded."
+msgstr "Le fichier dans le champ !name n'a pas pu être transféré."
+msgid ""
+"The upload directory %directory for the file field !name could not be "
+"created or is not accessible. A newly uploaded file could not be saved "
+"in this directory as a consequence, and the upload was canceled."
+msgstr ""
+"Le répertoire de transfert %directory pour le champ de type fichier "
+"!name ne peut pas être créé ou n'est pas accessible. Un fichier "
+"nouvellement transféré ne peut donc pas être enregistré dans ce "
+"répertoire, le transfert a été annulé."
+msgid ""
+"Your server is not capable of displaying file upload progress. File "
+"upload progress requires an Apache server running PHP with mod_php."
+msgstr ""
+"Votre serveur n'est pas capable d'afficher la progression du transfert "
+"d'un fichier. L'affichage de la progression du transfert d'u fichier "
+"nécessite un serveur Apache exécutant PHP avec mod_php."
+msgid "All roles may use this format"
+msgstr "Tous les rôles devraient utiliser ce format"
+msgid "The text format ordering has been saved."
+msgstr "L'ordre des formats de texte a été enregistré."
+msgid "Add text format"
+msgstr "Ajouter un format de texte"
+msgid "All roles for this text format must be enabled and cannot be changed."
+msgstr ""
+"Tous les rôles pour ce format de texte doivent être activés et ne "
+"peuvent pas être changés."
+msgid "Filter processing order"
+msgstr "Ordre de traitement des filtres"
+msgid "Text format names must be unique. A format named %name already exists."
+msgstr ""
+"Les noms des formats texte doivent être uniques. Le nom de format "
+"%name existe déjà."
+msgid "Added text format %format."
+msgstr "Le format texte %format a été ajouté."
+msgid "The text format %format has been updated."
+msgstr "Le format de texte %format a été mis à jour."
+msgid "Text formats"
+msgstr "Formats de texte"
+msgid ""
+"The Filter module allows administrators to configure text formats. A "
+"text format defines the HTML tags, codes, and other input allowed in "
+"content and comments, and is a key feature in guarding against "
+"potentially damaging input from malicious users. For more information, "
+"see the online handbook entry for <a href=\"@filter\">Filter "
+"module</a>."
+msgstr ""
+"Le module <em>Filter</em> permet aux administrateurs de configurer les "
+"formats texte. Un format texte défini les balises HTML, le code et "
+"tout autre type d'entrée autorisés dans le contenu et les "
+"commentaires. C'est une fonctionnalité clé pour se prémunir "
+"d’entrées potentiellement dangereuses émanant d'utilisateurs "
+"malveillants. Pour plus d'information, voir la section <a "
+"href=\"@filter\"><em>Filter module</em></a> du manuel en ligne."
+msgid "Applying filters to text"
+msgstr "Application des filtres au texte"
+msgid ""
+"Each text format uses filters to manipulate text, and most formats "
+"apply several different filters to text in a specific order. Each "
+"filter is designed for a specific purpose, and generally either adds, "
+"removes, or transforms elements within user-entered text before it is "
+"displayed. A filter does not change the actual content, but instead, "
+"modifies it temporarily before it is displayed. One filter may remove "
+"unapproved HTML tags, while another automatically adds HTML to make "
+"URLs display as clickable links."
+msgstr ""
+"Chaque format de texte utilise des filtres pour manipuler le texte et "
+"la plupart des formats appliquent plusieurs filtres dans un ordre "
+"spécifique. Chaque filtre est conçu dans un but spécifique et en "
+"général, il ajoute, supprime ou transforme des éléments dans le "
+"texte saisi par l'utilisateur avant de l'afficher. Un filtre ne change "
+"pas le contenu mais le modifie temporairement avant qu'il ne soit "
+"affiché. Un filtre peut supprimer des balises HTML indésirables "
+"alors qu'un autre filtre ajoutera des balises HTML, par exemple pour "
+"rendre les liens cliquables."
+msgid "Defining text formats"
+msgstr "Définition des formats de texte"
+msgid ""
+"One format is included by default: <em>Plain text</em> (which removes "
+"all HTML tags). Additional formats may be created by your installation "
+"profile when you install Drupal, and more can be created by an "
+"administrator on the <a href=\"@text-formats\">Text formats page</a>."
+msgstr ""
+"Un format est inclus par défaut : <em>Texte brut</em> (supprime "
+"toutes les balises HTML). D'autres formats peuvent être créés par "
+"votre profil lors de l'installation de Drupal, d'autres encore peuvent "
+"être créés par un administrateur dans la <a "
+"href=\"@text-formats\">page de gestion des formats de texte</a>."
+msgid "Choosing a text format"
+msgstr "Choix d'un format de texte"
+msgid ""
+"A text format contains filters that change the user input, for example "
+"stripping out malicious HTML or making URLs clickable. Filters are "
+"executed from top to bottom and the order is important, since one "
+"filter may prevent another filter from doing its job. For example, "
+"when URLs are converted into links before disallowed HTML tags are "
+"removed, all links may be removed. When this happens, the order of "
+"filters may need to be re-arranged."
+msgstr ""
+"Un format texte contient des filtres qui peuvent modifier ce qui est "
+"saisi par l'utilisateur, par exemple en supprimant du HTML malicieux "
+"ou en rendant les URLs cliquables."
+msgid ""
+"Warning: This permission may have security implications depending on "
+"how the text format is configured."
+msgstr ""
+"Alerte : ce droit peut avoir un impact sur la sécurité en fonction "
+"de la manière dont le format de texte est configuré."
+msgid "Use the !text_format text format"
+msgstr "Utiliser le format de texte !text_format"
+msgid "More information about text formats"
+msgstr "Plus d'information sur les formats de texte"
+msgid "Limit allowed HTML tags"
+msgstr "Limiter aux balises HTML autorisées"
+msgid ""
+"Convert line breaks into HTML (i.e. <code>&lt;br&gt;</code> and "
+"<code>&lt;p&gt;</code>)"
+msgstr ""
+"Convertir les sauts de ligne en HTML (par exemple, "
+"<code>&lt;br&gt;</code> et <code>&lt;p&gt;</code>)"
+msgid "Convert URLs into links"
+msgstr "Convertir les URL en liens"
+msgid "Correct faulty and chopped off HTML"
+msgstr "Corriger le HTML défectueux ou coupé"
+msgid "Display any HTML as plain text"
+msgstr "Afficher tout code HTML au format texte"
+msgid ""
+"A list of HTML tags that can be used. JavaScript event attributes, "
+"JavaScript URLs, and CSS are always stripped."
+msgstr ""
+"Une liste de balises HTML pouvant être utilisées. Les attributs "
+"d'événement JavaScript, les URLs JavaScript et les CSS sont toujours "
+"supprimés."
+msgid "Display basic HTML help in long filter tips"
+msgstr "Afficher une aide HTML basique dans conseils étendus sur les filtres"
+msgid "Add rel=\"nofollow\" to all links"
+msgstr "Ajouter rel=\"nofollow\" à tous les liens"
+msgid ""
+"This site allows HTML content. While learning all of HTML may feel "
+"intimidating, learning how to use a very small number of the most "
+"basic HTML \"tags\" is very easy. This table provides examples for "
+"each tag that is enabled on this site."
+msgstr ""
+"Ce site autorise le contenu HTML. Si apprendre tout le HTML peut "
+"paraître intimidant, apprendre comment utiliser les \"balises\" HTML "
+"les plus simples est très facile. Ce tableau fournit des exemples "
+"pour chaque balise autorisée sur ce site."
+msgid ""
+"For more information see W3C's <a href=\"@html-specifications\">HTML "
+"Specifications</a> or use your favorite search engine to find other "
+"sites that explain HTML."
+msgstr ""
+"Pour plus d'information, consultez les <a "
+"href=\"@html-specifications\">spécifications HTML</a> du W3C ou "
+"utilisez votre moteur de recherche favori pour trouver d'autres sites "
+"explicatifs sur le HTML."
+msgid "Most unusual characters can be directly entered without any problems."
+msgstr ""
+"La plupart des caractères non usuels peuvent être saisis sans "
+"problème."
+msgid ""
+"If you do encounter problems, try using HTML character entities. A "
+"common example looks like &amp;amp; for an ampersand &amp; character. "
+"For a full list of entities see HTML's <a "
+"href=\"@html-entities\">entities</a> page. Some of the available "
+"characters include:"
+msgstr ""
+"En cas de problème, essayez d'utiliser des entités HTML. Un exemple "
+"courant est le rendu en &amp;amp; de l'esperluette &amp;. Pour une "
+"liste complète des entités, référez-vous à la page des <a "
+"href=\"@html-entities\">entités HTML</a>. Parmi les caractères "
+"disponibles, on trouve :"
+msgid "No HTML tags allowed."
+msgstr "Aucune balise HTML autorisée."
+msgid "Filters content in preparation for display."
+msgstr "Filtre le contenu en préparation pour l'affichage."
+msgid "By !author @time ago"
+msgstr "Par !author il y a @time"
+msgid "The forum %term and all sub-forums have been deleted."
+msgstr "Le forum %term et tous ses sous-forums ont été supprimés."
+msgid "The number of replies a topic must have to be considered \"hot\"."
+msgstr ""
+"Le nombre de réponses qu'un sujet doit avoir pour être considéré "
+"comme \"brûlant\"."
+msgid ""
+"No containers or forums available. <a href=\"@container\">Add "
+"container</a> or <a href=\"@forum\">Add forum</a>."
+msgstr ""
+"Aucun conteneur ou forum disponible. <a href=\"@container\">Ajouter un "
+"conteneur</a> ou <a href=\"@forum\">ajouter un forum</a>."
+msgid "forum: deleted %term and all its sub-forums."
+msgstr "forum : %term et tous ses sous-forums supprimés."
+msgid ""
+"The Forum module lets you create threaded discussion forums with "
+"functionality similar to other message board systems. Forums are "
+"useful because they allow community members to discuss topics with one "
+"another while ensuring those conversations are archived for later "
+"reference. In a forum, users post topics and threads in nested "
+"hierarchies, allowing discussions to be categorized and grouped. The "
+"forum hierarchy consists of:"
+msgstr ""
+"Le module <em>Forum</em> vous permet de créer un système de "
+"discussion par fil (<em>thread</em>) avec des fonctionnalités "
+"similaires aux autres outils de forum. Les forums sont utiles parce "
+"qu'ils permettent aux membres d'une communauté de discuter de sujets "
+"entre eux tout en garantissant un bon archivage des conversations "
+"permettant de les consulter plus tard. Dans un forum, les utilisateurs "
+"publient des billets dans une hiérarchie arborescente permettant de "
+"catégoriser et regrouper les discussions. Cette hiérarchie est "
+"composée de :"
+msgid "Optional containers (for example, <em>Support</em>), which can hold:"
+msgstr ""
+"Conteneurs optionnels (par exemple, <em>Support</em>), pouvant "
+"contenir :"
+msgid "Forums (for example, <em>Installing Drupal</em>), which can hold:"
+msgstr "Forums (par exemple, <em>Installer Drupal</em>), pouvant contenir :"
+msgid ""
+"Forum topics submitted by users (for example, <em>How to start a "
+"Drupal 6 Multisite</em>), which start discussions and are starting "
+"points for:"
+msgstr ""
+"Sujets de forum soumis par les utilisateurs (par exemple, <em>Comment "
+"créer un multisite avec Drupal 6</em>), déclenchant les discussions "
+"et points de départ pour :"
+msgid ""
+"Threaded comments submitted by users (for example, <em>You have these "
+"options...</em>)."
+msgstr ""
+"Commentaires soumis par les utilisateurs (par exemple, <em>Vous avez "
+"ces options ...</em>)."
+msgid "Setting up forum structure"
+msgstr "Mise en place de la structure du forum"
+msgid ""
+"Visit the <a href=\"@forums\">Forums page</a> to set up containers and "
+"forums to hold your discussion topics."
+msgstr ""
+"Pour mettre en place des conteneurs et des forums abritant vos sujets "
+"de discussion, rendez vous sur la <a href=\"@forums\">page des "
+"Forums</a>."
+msgid "Starting a discussion"
+msgstr "Commencer une discussion"
+msgid ""
+"The <a href=\"@create-topic\">Forum topic</a> link on the <a "
+"href=\"@content-add\">Add new content</a> page creates the first post "
+"of a new threaded discussion, or thread."
+msgstr ""
+"Le lien <a href=\"@create-topic\">Sujet de forum</a> dans la page <a "
+"href=\"@content-add\">Ajouter un nouveau contenu</a> constitue le "
+"premier billet d'une discussion ou d'un fil."
+msgid ""
+"Enabling the Forum module provides a default <em>Forums</em> menu item "
+"in the navigation menu that links to the <a href=\"@forums\">Forums "
+"page</a>."
+msgstr ""
+"Activer le module <em>Forum</em> fournit l'élément de menu par "
+"défaut <em>Forums</em> dans le menu de navigation qui pointe vers la "
+"page <a href=\"@forums\">Forums</a>."
+msgid "Moving forum topics"
+msgstr "Déplacement des sujets du forum"
+msgid ""
+"A forum topic (and all of its comments) may be moved between forums by "
+"selecting a different forum while editing a forum topic. When moving a "
+"forum topic between forums, the <em>Leave shadow copy</em> option "
+"creates a link in the original forum pointing to the new location."
+msgstr ""
+"Un sujet de forum (et tous ses commentaires) peut être déplacé d'un "
+"forum à l'autre en sélectionnant un forum différent lors de la "
+"modification d'un sujet de forum. Lors du déplacement d'un sujet de "
+"forum d'un forum à l'autre, l'option <em>Laisser une copie "
+"cachée</em> crée un lien dans le forum originel pointant vers le "
+"nouvel emplacement."
+msgid "Locking and disabling comments"
+msgstr "Verrouillage et désactivation des commentaires"
+msgid ""
+"Selecting <em>Closed</em> under <em>Comment settings</em> while "
+"editing a forum topic will lock (prevent new comments on) the thread. "
+"Selecting <em>Hidden</em> under <em>Comment settings</em> while "
+"editing a forum topic will hide all existing comments on the thread, "
+"and prevent new ones."
+msgstr ""
+"Choisir <em>Fermé</em> dans <em>Paramètres des commentaires</em> au "
+"cours de la modification d'un sujet de forum bloquera tout nouveau "
+"commentaire sur le fil. Choisir <em>Caché</em> dans <em>Paramètres "
+"des commentaires</em> au cours de la modification d'un sujet de forum "
+"aura pour effet de cacher tous les commentaires existants et "
+"empêchera la saisie de nouveaux commentaires."
+msgid "Forums contain forum topics. Use containers to group related forums."
+msgstr ""
+"Les forums contiennent des sujets de discussion. Utilisez les "
+"conteneurs pour gouper les forums liés."
+msgid "Use containers to group related forums."
+msgstr "Utilisez des conteneurs pour grouper des forums liés."
+msgid "A forum holds related forum topics."
+msgstr "Un forum abrite les sujets de forum liés."
+msgid ""
+"Adjust the display of your forum topics. Organize the forums on the <a "
+"href=\"@forum-structure\">forum structure page</a>."
+msgstr ""
+"Ajuster l'affichage de vos sujets de forum. Organisez vos forums sur "
+"la <a href=\"@forum-structure\">page de structure des forums</a>."
+msgid "Add new @node_type"
+msgstr "Ajouter un nouveau @node_type"
+msgid "<a href=\"@login\">Log in</a> to post new content in the forum."
+msgstr ""
+"<a href=\"@login\">Connectez-vous</a> pour poster un nouveau message "
+"dans le forum."
+msgid ""
+"The item %forum is a forum container, not a forum. Select one of the "
+"forums below instead."
+msgstr ""
+"L'élément %forum est un conteneur de forum, pas un forum. "
+"Sélectionnez l'un des forums ci-dessous à la place."
+msgid "A <em>forum topic</em> starts a new discussion thread within a forum."
+msgstr "Un <em>Sujet</em> commence un nouveau fil de discussion dans un forum."
+msgid "Control forum hierarchy settings."
+msgstr "Contrôlez la hiérarchie de vos forums."
+msgid "Forum navigation vocabulary"
+msgstr "Vocabulaire pour la navigation dans un forum"
+msgid "Provides discussion forums."
+msgstr "Fournit des forums de discussion."
+msgid "Follow these steps to set up and start using your website:"
+msgstr ""
+"Suivez ces étapes pour paramétrer et commencer à utiliser votre "
+"site web:"
+msgid ""
+"<strong>Start posting content</strong> Finally, you can <a "
+"href=\"@content\">add new content</a> for your website."
+msgstr ""
+"<strong>Commencez à publier du contenu</strong> : vous pouvez enfin "
+"<a href=\"@content\">ajouter un nouveau contenu</a> à votre site."
+msgid ""
+"For more information, refer to the specific topics listed in the next "
+"section or to the <a href=\"@handbook\">online Drupal handbooks</a>. "
+"You may also post at the <a href=\"@forum\">Drupal forum</a> or view "
+"the wide range of <a href=\"@support\">other support options</a> "
+"available."
+msgstr ""
+"Pour plus d'informations, consultez les sujets traités dans le "
+"paragraphe suivant ou visitez le <a href=\"@handbook\">manuel Drupal "
+"en ligne</a>. Vous pouvez aussi laisser un billet dans le <a "
+"href=\"@forum\">forum Drupal</a> ou découvrir la <a "
+"href=\"@support\">large gamme d'options de support</a> disponible."
+msgid ""
+"The Help module provides <a href=\"@help-page\">Help reference "
+"pages</a> and context-sensitive advice to guide you through the use "
+"and configuration of modules. It is a starting point for the online <a "
+"href=\"@handbook\">Drupal handbooks</a>. The handbooks contain more "
+"extensive and up-to-date information, are annotated with "
+"user-contributed comments, and serve as the definitive reference point "
+"for all Drupal documentation. For more information, see the online "
+"handbook entry for the <a href=\"@help\">Help module</a>."
+msgstr ""
+"Le module <em>Help</em> fourni des <a href=\"@help-page\">pages "
+"d'aide</a> et des conseils contextuels pour vous guider dans la "
+"configuration puis l'utilisation des modules. C'est le point de "
+"départ du <a href=\"@handbook\">manuel en ligne de Drupal</a>. Le "
+"manuel en ligne contient plus d'informations, plus à jour et "
+"enrichies par les commentaires des utilisateurs. Le manuel en ligne "
+"est la référence définitive pour la documentation. Pour plus "
+"d'information, voir l'entrée du manuel en ligne pour le module <a "
+"href=\"@help\"><em>Help</em></a>."
+msgid "Providing a help reference"
+msgstr "Fournir une aide de référence"
+msgid ""
+"The Help module displays explanations for using each module listed on "
+"the main <a href=\"@help\">Help reference page</a>."
+msgstr ""
+"Le module <em>Help</em> affiche des explications pour l'utilisation de "
+"chaque module listé sur la <a href=\"@help\">page principale de "
+"l'aide</a>."
+msgid "Providing context-sensitive help"
+msgstr "Fournir une aide contextuelle"
+msgid ""
+"The Help module displays context-sensitive advice and explanations on "
+"various pages."
+msgstr ""
+"Le module <em>Help</em> affiche des conseils et des explications sur "
+"différentes pages en fonction du contexte."
+msgid "Edit %name style"
+msgstr "Modifier le style %name"
+msgid ""
+"This image style is currently being provided by a module. Click the "
+"\"Override defaults\" button to change its settings."
+msgstr ""
+"Ce style d'image est actuellement fourni par un module. Cliquez sur le "
+"bouton \"Supplanter les paramètres par défaut\" pour modifier ces "
+"paramètres."
+msgid "Image style name"
+msgstr "Nom du style d'image"
+msgid ""
+"The name is used in URLs for generated images. Use only lowercase "
+"alphanumeric characters, underscores (_), and hyphens (-)."
+msgstr ""
+"Le nom est utilisé dans les URLs des images générées. Utilisez "
+"seulement des caractères alphanumériques en minuscules, des tirets "
+"bas (_) et des traits d'union (-)."
+msgid "Select a new effect"
+msgstr "Sélectionner un nouvel effet"
+msgid "Override defaults"
+msgstr "Supplanter les paramètres par défaut"
+msgid "Update style"
+msgstr "Mettre à jour le style"
+msgid "Select an effect to add."
+msgstr "Choisir un effet à ajouter."
+msgid "The image effect was successfully applied."
+msgstr "L'effet d'image a été appliqué avec succès."
+msgid ""
+"The %style style has been overridden, allowing you to change its "
+"settings."
+msgstr ""
+"Le style %style a été supplanté pour que vous puissiez changer ses "
+"paramètres."
+msgid "Style name"
+msgstr "Nom du style"
+msgid "Create new style"
+msgstr "Créer un nouveau style"
+msgid "Style %name was created."
+msgstr "Le style %name a été créé."
+msgid "The image style name %name is already in use."
+msgstr "Le style d'image %name est déjà utilisé."
+msgid ""
+"Please only use lowercase alphanumeric characters, underscores (_), "
+"and hyphens (-) for style names."
+msgstr ""
+"N'utilisez que des caractères alphanumériques en minuscules, des "
+"tirets bas (_) et des traits d'union (-) pour les noms de style."
+msgid "No replacement, just delete"
+msgstr "Pas de remplacement, juste une suppression"
+msgid "Replacement style"
+msgstr "Style de remplacement"
+msgid "Optionally select a style before deleting %style"
+msgstr "Optionnellement sélectionnez un style avant de supprimer %style"
+msgid ""
+"If this style is in use on the site, you may select another style to "
+"replace it. All images that have been generated for this style will be "
+"permanently deleted."
+msgstr ""
+"Si ce style est déjà en cours d'utilisation sur le site, vous devrez "
+"sélectionner un autre style pour le remplacer. Toutes les images "
+"générées pour ce style seront définitivement supprimées."
+msgid "Style %name was deleted."
+msgstr "Le style %name a été supprimé."
+msgid "Revert the %style style?"
+msgstr "Rétablir le style %style ?"
+msgid ""
+"Reverting this style will delete the customized settings and restore "
+"the defaults provided by the @module module."
+msgstr ""
+"Rétablir ce style va supprimer les paramètres personnalisés et "
+"restaurer les paramètres par défaut fournis par le module "
+"<em>@module</em>."
+msgid "Edit %label effect"
+msgstr "Modifier l'effet %label"
+msgid "Add %label effect"
+msgstr "Ajouter l'effet %label"
+msgid "Update effect"
+msgstr "Mettre à jour l'effet"
+msgid "Add effect"
+msgstr "Ajouter l'effet"
+msgid ""
+"Are you sure you want to delete the @effect effect from the %style "
+"style?"
+msgstr "Êtes-vous sûr de vouloir supprimer l'effet @effect du style %style ?"
+msgid "The image effect %name has been deleted."
+msgstr "L'effet d'image %name a été supprimé."
+msgid "!name must be an integer."
+msgstr "!name doit être un entier."
+msgid "!name must be a positive integer."
+msgstr "!name doit être un entier positif."
+msgid "!name must be a hexadecimal color value."
+msgstr "!name doit être une valeur de couleur en hexadécimal."
+msgid "Width and height can not both be blank."
+msgstr "La largeur et la hauteur ne peuvent pas être toutes les deux vides."
+msgid "The part of the image that will be retained during the crop."
+msgstr "La partie de l'image qui sera supprimée lors du recadrage."
+msgid ""
+"The background color to use for exposed areas of the image. Use "
+"web-style hex colors (#FFFFFF for white, #000000 for black). Leave "
+"blank for transparency on image types that support it."
+msgstr ""
+"Le fond de couleur à utiliser pour les zones de l'image qui seront "
+"vides. Utilisez des couleurs web hexadécimales (par exemple #FFFFFF "
+"pour le blanc ou #000000 pour le noir). Laisser vide pour utiliser la "
+"transparence de l'image pour les formats d'image le permettant."
+msgid "There are currently no styles. <a href=\"!url\">Add a new one</a>."
+msgstr ""
+"Il n'y a actuellement aucun style. <a href=\"!url\">En ajouter un "
+"nouveau</a>."
+msgid ""
+"There are currently no effects in this style. Add one by selecting an "
+"option below."
+msgstr ""
+"Il n'y a actuellement aucun effet pour ce style. Ajoutez-en un en "
+"choisissant une option ci-dessous."
+msgid "view actual size"
+msgstr "voir en taille réelle"
+msgid "Sample original image"
+msgstr "Exemple d'image originale"
+msgid "Sample modified image"
+msgstr "Exemple d'image modifiée"
+msgid ""
+"Resizing will make images an exact set of dimensions. This may cause "
+"images to be stretched or shrunk disproportionately."
+msgstr ""
+"Le redimensionnement ne respecte pas les proportions de l'image. Ce "
+"qui peut se traduire par des images étirées ou compressées."
+msgid ""
+"Scaling will maintain the aspect-ratio of the original image. If only "
+"a single dimension is specified, the other dimension will be "
+"calculated."
+msgstr ""
+"La mise à l'échelle maintiendra les proportions originales de "
+"l'image. Si une seule dimension est précisée, l'autre dimension sera "
+"calculée automatiquement."
+msgid "Scale and crop"
+msgstr "Mise à l’échelle et recadrage"
+msgid ""
+"Scale and crop will maintain the aspect-ratio of the original image, "
+"then crop the larger dimension. This is most useful for creating "
+"perfectly square thumbnails without stretching the image."
+msgstr ""
+"La mise à l'échelle et le recadrage maintiendront les proportions "
+"originales de l'image puis recadreront la dimension la plus large. "
+"C'est très utile pour créer des vignettes carrées sans étirer les "
+"images."
+msgid ""
+"Cropping will remove portions of an image to make it the specified "
+"dimensions."
+msgstr ""
+"Le recadrage supprimera des portions de l'image pour qu'elle rentre "
+"dans la taille spécifiée."
+msgid "Desaturate"
+msgstr "Désaturer"
+msgid "Desaturate converts an image to grayscale."
+msgstr "La désaturation converti l'image en niveaux de gris."
+msgid ""
+"Rotating an image may cause the dimensions of an image to increase to "
+"fit the diagonal."
+msgstr ""
+"Effectuer une rotation sur une image peut avoir pour effet d'augmenter "
+"la taille de l'image pour s'adapter à la diagonale."
+msgid ""
+"Image resize failed using the %toolkit toolkit on %path (%mimetype, "
+"%dimensions)"
+msgstr ""
+"Le redimensionnement de l'image a échoué en utilisant la boite à "
+"outils %toolkit sur le chemin %path (%mimetype, %dimensions)"
+msgid ""
+"Image scale failed using the %toolkit toolkit on %path (%mimetype, "
+"%dimensions)"
+msgstr ""
+"La mise à l'échelle de l'image a échoué en utilisant la boite à "
+"outils %toolkit sur le chemin %path (%mimetype, %dimensions)"
+msgid ""
+"Image crop failed using the %toolkit toolkit on %path (%mimetype, "
+"%dimensions)"
+msgstr ""
+"Le recadrage de l'image a échoué en utilisant la boite à outils "
+"%toolkit sur le chemin %path (%mimetype, %dimensions)"
+msgid ""
+"Image scale and crop failed using the %toolkit toolkit on %path "
+"(%mimetype, %dimensions)"
+msgstr ""
+"Le redimensionnement et le recadrage de l'image %path (%mimetype, "
+"%dimensions), utilisant la boite à outils %toolkit, ont échoué."
+msgid ""
+"Image desaturate failed using the %toolkit toolkit on %path "
+"(%mimetype, %dimensions)"
+msgstr ""
+"La désaturation de l'image %path  (%mimetype, %dimensions), "
+"effectuée avec la boite à outils %toolkit, a échoué."
+msgid ""
+"Image rotate failed using the %toolkit toolkit on %path (%mimetype, "
+"%dimensions)"
+msgstr ""
+"La rotation de l'image %path (%mimetype, %dimensions), effectuée avec "
+"la boite à outils %toolkit, a échoué."
+msgid "This field stores the ID of an image file as an integer value."
+msgstr ""
+"Ce champ stocke l'identifiant (ID) d'un fichier image sous la forme "
+"d'un nombre entier."
+msgid "If no image is uploaded, this image will be shown on display."
+msgstr ""
+"Si aucune image n'est transférée, c'est cette image qui sera "
+"utilisée pour l'affichage."
+msgid ""
+"The maximum allowed image size expressed as WIDTHxHEIGHT (e.g. "
+"640x480). Leave blank for no restriction. If a larger image is "
+"uploaded, it will be resized to reflect the given width and height. "
+"Resizing images on upload will cause the loss of <a "
+"href=\"http://en.wikipedia.org/wiki/Exchangeable_image_file_format\">EXIF "
+"data</a> in the image."
+msgstr ""
+"La taille maximum autorisée pour une image s'écrit LARGEURxHAUTEUR "
+"(par exemple : 640x480). Laisser le champ vide pour que la taille ne "
+"soit pas limitée. Si une image plus grande est transférée, elle "
+"sera redimensionnée pour correspondre à largeur et à la hauteur "
+"indiquées. Le redimensionnement de l'image lors du transfert peut "
+"entrainer la perte des <a "
+"href=\"http://fr.wikipedia.org/wiki/Exchangeable_image_file_format\">données "
+"EXIF</a> de l'image."
+msgid "Minimum image resolution"
+msgstr "Résolution minimum de l'image"
+msgid ""
+"The minimum allowed image size expressed as WIDTHxHEIGHT (e.g. "
+"640x480). Leave blank for no restriction. If a smaller image is "
+"uploaded, it will be rejected."
+msgstr ""
+"La taille minimum autorisée pour une image s'écrit LARGEURxHAUTEUR "
+"(par exemple : 640x480). Laisser le champ vide pour que la taille ne "
+"soit pas limitée. Si une image plus petite est transférée, elle "
+"sera refusée."
+msgid "Enable <em>Alt</em> field"
+msgstr "Activer le champ <em>Alt</em>"
+msgid ""
+"The alt attribute may be used by search engines, screen readers, and "
+"when the image cannot be loaded."
+msgstr ""
+"Le contenu de l'attribut Alt (texte alternatif) peut être utilisé "
+"par les moteurs de recherche, les lecteurs d'écran, et lorsque "
+"l'image ne peut pas être chargée."
+msgid "Enable <em>Title</em> field"
+msgstr "Activer le champ <em>Titre</em>"
+msgid ""
+"The title attribute is used as a tooltip when the mouse hovers over "
+"the image."
+msgstr ""
+"Le contenu de l'attribut <em>Title</em> (\"titre\", en français) "
+"apparait dans une infobulle lorsque le pointeur de la souris survole "
+"l'image."
+msgid "Height and width values must be numeric."
+msgstr "La hauteur et la largeur doivent être des valeurs numériques."
+msgid "Both a height and width value must be specified in the !name field."
+msgstr ""
+"Les valeurs de hauteur et de largeur doivent toutes les deux être "
+"indiquées dans le champ !name."
+msgid "Preview image style"
+msgstr "Aperçu du style d'image"
+msgid "no preview"
+msgstr "pas d'aperçu"
+msgid "The preview image will be shown while editing the content."
+msgstr "L'aperçu de l'image sera affiché pendant la modification du contenu."
+msgid ""
+"The Image module allows you to manipulate images on your website. It "
+"exposes a setting for using the <em>Image toolkit</em>, allows you to "
+"configure <em>Image styles</em> that can be used for resizing or "
+"adjusting images on display, and provides an <em>Image</em> field for "
+"attaching images to content. For more information, see the online "
+"handbook entry for <a href=\"@image\">Image module</a>."
+msgstr ""
+"Le module Image vous permet de manipuler les images de votre site Web. "
+"Il donne accès aux paramètres de la <em>Boite à outils Image</em>, "
+"et vous permet de configurer des <em>Styles d'images</em> pouvant "
+"être utilisés pour redimensionner ou adapter les images à "
+"l'affichage. Il fournit un champ <em>Image</em> permettant d'attacher "
+"des images au contenu. Pour plus d'information, voir la section du <a "
+"href=\"@image\">module Image</a> dans le manuel en ligne."
+msgid "Manipulating images"
+msgstr "Manipulation des images"
+msgid ""
+"With the Image module you can scale, crop, resize, rotate and "
+"desaturate images without affecting the original image using <a "
+"href=\"@image\">image styles</a>. When you change an image style, the "
+"module automatically refreshes all created images. Every image style "
+"must have a name, which will be used in the URL of the generated "
+"images. There are two common approaches to naming image styles (which "
+"you use will depend on how the image style is being applied):"
+msgstr ""
+"Avec le module Image, vous pouvez mettre à l'échelle, recadrer, "
+"redimensionner, faire pivoter et désaturer les images sans altérer "
+"l'original en utilisant des <a href=\"@image\">Styles d'images</a>. "
+"Lorsque vous modifiez des styles d'images, le module rafraichit "
+"automatiquement toutes les images créées. Chaque style d'image doit "
+"avoir un nom pouvant être utilisé dans les URL des images "
+"générées. Il y a deux façons courantes de nommer les styles "
+"d'images (celle que vous utiliserez dépendra de la façon dont le "
+"style d'image sera appliqué)&nbsp;:"
+msgid "Based on where it will be used: eg. <em>profile-picture</em>"
+msgstr ""
+"Basé sur l'emplacement où il sera utilisé&nbsp;: par exemple, "
+"<em>image-de-profil</em>"
+msgid "Describing its appearance: eg. <em>square-85x85</em>"
+msgstr "Description de son apparence&nbsp;: <em>carre-85x85</em>"
+msgid "Attaching images to content as fields"
+msgstr "Attacher des images au contenu en tant que champs"
+msgid ""
+"Image module also allows you to attach images to content as fields. To "
+"add an image field to a <a href='@content-type'>content type</a>, go "
+"to the content type's <em>manage fields</em> page, and add a new field "
+"of type <em>Image</em>. Attaching images to content this way allows "
+"image styles to be applied and maintained, and also allows you more "
+"flexibility when theming."
+msgstr ""
+"Le module Image vous permet aussi d'attacher des images au contenu en "
+"tant que champ. Pour ajouter un champ d'image à un <a "
+"href='@content-type'>type de contenu</a>, allez à la page <em>Gérer "
+"les champs</em> des types de contenu et ajoutez un nouveau champ de "
+"type <em>Image</em>. Cette méthode d'attachement des images permet "
+"d'appliquer et de maintenir des styles d'images et aussi vous offre "
+"une plus grande souplesse pour la réalisation de thèmes."
+msgid ""
+"Image styles commonly provide thumbnail sizes by scaling and cropping "
+"images, but can also add various effects before an image is displayed. "
+"When an image is displayed with a style, a new file is created and the "
+"original image is left unchanged."
+msgstr ""
+"Les styles d'images fournissent habituellement différentes tailles de "
+"vignettes issues de la mise à l'échelle et du recadrage des images, "
+"mais ils peuvent aussi appliquer des effets variés avant qu'une image "
+"ne soit affichée. Lorsqu'une image est affichée avec un style, un "
+"nouveau fichier est créé tandis que l'image originale reste intacte."
+msgid "Administer image styles"
+msgstr "Administrer les styles d'images"
+msgid ""
+"Create and modify styles for generating image modifications such as "
+"thumbnails."
+msgstr ""
+"Création et édition des styles destinés à la génération d'images "
+"modifiées telles que les vignettes."
+msgid "No defined styles"
+msgstr "Aucun styles n'est défini"
+msgid "Image generation in progress. Try again shortly."
+msgstr ""
+"La génération d'image est en cours. Essayer à nouveau un peu plus "
+"tard."
+msgid "Error generating image."
+msgstr "Erreur de génération d'image."
+msgid "Unable to generate the derived image located at %path."
+msgstr ""
+"Impossible de générer l'image dérivée dont l'emplacement est "
+"%path."
+msgid "Failed to create style directory: %directory"
+msgstr "Échec de la création du dossiers des styles&nbsp;: %directory"
+msgid ""
+"Cached image file %destination already exists. There may be an issue "
+"with your rewrite configuration."
+msgstr ""
+"Le fichier d'image caché %destination existe déjà. Cela peut "
+"entrainer des problèmes avec votre configuration de réécriture."
+msgid "Generate image style"
+msgstr "Générer un style d'image"
+msgid "Image styles"
+msgstr "Styles d'images"
+msgid ""
+"Configure styles that can be used for resizing or adjusting images on "
+"display."
+msgstr ""
+"Configurer les styles qui peuvent être utilisés pour redimensionner "
+"ou ajuster les images à l'affichage."
+msgid "List the current image styles on the site."
+msgstr "Liste des styles d'images du site."
+msgid "Add style"
+msgstr "Ajouter un style"
+msgid "Add a new image style."
+msgstr "Ajouter un nouveau style d'image"
+msgid "Configure an image style."
+msgstr "Configurer un style d'image."
+msgid "Delete an image style."
+msgstr "Supprimer un style d'image."
+msgid "Revert style"
+msgstr "Rétablir le style"
+msgid "Revert an image style."
+msgstr "Rétablir un style d'image."
+msgid "Edit image effect"
+msgstr "Modifier l'effet d'image"
+msgid "Delete image effect"
+msgstr "Supprimer un effet d'image"
+msgid "Add image effect"
+msgstr "Ajouter un effet d'image"
+msgid "Add a new effect to a style."
+msgstr "Ajouter un nouvel effet à un  style"
+msgid "Provides image manipulation tools."
+msgstr "Fournit des outils pour manipuler les images."
+msgid ""
+"Use the <em>Custom language</em> section below if your desired "
+"language does not appear in this list."
+msgstr ""
+"Utilisez la section <em>Langue personnalisée</em> ci-dessous si la "
+"langue souhaitée n'apparait pas dans la liste."
+msgid "Path prefix language code"
+msgstr "Code de langue du préfixe de chemin"
+msgid ""
+"Language code or other custom text to use as a path prefix for URL "
+"language detection, if your <em>Detection and selection</em> settings "
+"use URL path prefixes. For the default language, this value may be "
+"left blank. <strong>Modifying this value may break existing URLs. Use "
+"with caution in a production environment.</strong> Example: Specifying "
+"\"deutsch\" as the path prefix code for German results in URLs like "
+"\"example.com/deutsch/contact\"."
+msgstr ""
+"Code de langue ou autre texte personnalisé à utiliser comme préfixe "
+"de chemin pour la détection de langue par URL, si vos paramètres de "
+"<em>Détection et sélection</em> utilisent les préfixes de chemin "
+"d'URL. Pour la langue par défaut, cette valeur peut être laissée "
+"vide. <strong>La modification de cette valeur peut casser les URL "
+"existantes. À utiliser avec prudence dans un environnement en "
+"production.</strong> Exemple : indiquer \"deutsch\" comme code de "
+"préfixe de chemin pour l'allemand donne des URL telles que "
+"\"example.com/deutsch/contact\"."
+msgid "Detection method"
+msgstr "Méthode de détection"
+msgid "Part of the URL that determines language"
+msgstr "Partie de l'URL qui détermine la langue"
+msgid ""
+"<em>Path prefix</em>: URLs like http://example.com/de/contact set "
+"language to German (de). <em>Domain</em>: URLs like "
+"http://de.example.com/contact set the language to German. "
+"<strong>Warning: Changing this setting may break incoming URLs. Use "
+"with caution on a production site.</strong>"
+msgstr ""
+"<em>Préfixe de chemin</em>&nbsp;: les URL comme "
+"http://example.com/de/contact paramètrent la langue en allemand (de). "
+"<em>Nom de domaine</em>&nbsp;: les URL comme "
+"http://de.example.com/contact paramètrent la langue en allemand. "
+"<strong>Attention&nbsp;: modifier ce paramètre peut casser les URL "
+"entrantes.  Utilisez ce paramètre avec prudence dans un site en "
+"production.</strong>"
+msgid "Request/session parameter"
+msgstr "Paramètre de requête/de session"
+msgid ""
+"Name of the request/session parameter used to determine the desired "
+"language."
+msgstr ""
+"Nom du paramètre de requête ou de session utiliser pour déterminer "
+"la langue souhaitée."
+msgid "Filter translatable strings"
+msgstr "Filtrer les chaînes traduisibles"
+msgid "Date type"
+msgstr "Type de date"
+msgid ""
+"Are you sure you want to reset the date formats for %language to the "
+"global defaults?"
+msgstr ""
+"Êtes-vous sûr(e) de vouloir réinitialiser les formats de dates en "
+"%language aux réglages par défaut ?"
+msgid ""
+"Resetting will remove all localized date formats for this language. "
+"This action cannot be undone."
+msgstr ""
+"La réinitialisation va supprimer tous les formats de dates localisés "
+"pour cette langue. Cette opération ne peut pas être annulée."
+msgid ""
+"The Locale module allows your Drupal site to be presented in languages "
+"other than the default English, and to be multilingual. The Locale "
+"module works by maintaining a database of translations, and examining "
+"text as it is about to be displayed. When a translation of the text is "
+"available in the language to be displayed, the translation is "
+"displayed rather than the original text. When a translation is "
+"unavailable, the original text is displayed, and then stored for "
+"review by a translator. For more information, see the online handbook "
+"entry for <a href=\"@locale\">Locale module</a>."
+msgstr ""
+"Le module Locale permet à votre site Drupal d'être affiché dans "
+"d'autres langues que la langue anglaise, utilisée par défaut, ainsi "
+"que d'être multilingue. Le module Locale travaille en maintenant une "
+"base de données des traductions, et en analysant le texte devant "
+"être affiché. Lorsqu'une traduction du texte est disponible dans la "
+"langue à afficher, la traduction est utilisée à la place du texte "
+"original. Lorsque la traduction n'est pas disponible, c'est le texte "
+"d'origine qui est affiché, et ensuite conservé pour être adapté "
+"par un traducteur. Pour plus d'information, voir la section <a "
+"href=\"@locale\">module Locale</a> du manuel en ligne."
+msgid "Translating interface text"
+msgstr "Traduction du texte de l'interface"
+msgid "Translations of text in the Drupal interface may be provided by:"
+msgstr ""
+"Les traductions du texte de l'interface de Drupal peuvent être "
+"fournies par&nbsp;:"
+msgid ""
+"Translating within your site, using the Locale module's integrated <a "
+"href='@translate'>translation interface</a>."
+msgstr ""
+"Traduire à partir de votre site en utilisant l'<a "
+"href='@translate'>interface de traduction</a> intégrée du module "
+"Locale."
+msgid ""
+"Importing files from a set of existing translations, known as a "
+"translation package. A translation package enables the display of a "
+"specific version of Drupal in a specific language, and contains files "
+"in the Gettext Portable Object (<em>.po</em>) format. Although not all "
+"languages are available for every version of Drupal, translation "
+"packages for many languages are available for download from the <a "
+"href=\"@translations\">Drupal translations page</a>."
+msgstr ""
+"Importer des fichiers à partir d'un jeu de traductions existantes, "
+"c'est à dire d'un paquetage de traductions. Un paquetage de "
+"traduction active l'affichage d'une version précise de Drupal dans "
+"une langue précise. Le paquetage contient des fichiers au format "
+"Gettext Portable Object (<em>.po</em>). Toutefois, toutes les langues "
+"ne sont pas disponibles pour chaque version de Drupal, les paquetages "
+"de traductions pour de nombreuses langues sont disponibles en "
+"téléchargement dans la <a href=\"@translations\">page des "
+"tra&dcutions de Drupal</a>."
+msgid ""
+"If an existing translation package does not meet your needs, the "
+"Gettext Portable Object (<em>.po</em>) files within a package may be "
+"modified, or new <em>.po</em> files may be created, using a desktop "
+"Gettext editor. The Locale module's <a href='@import'>import</a> "
+"feature allows the translated strings from a new or modified "
+"<em>.po</em> file to be added to your site. The Locale module's <a "
+"href='@export'>export</a> feature generates files from your site's "
+"translated strings, that can either be shared with others or edited "
+"offline by a Gettext translation editor."
+msgstr ""
+"Si un paquet existant ne correspond pas à vos besoins, vous pouvez "
+"utiliser un logiciel d'édition Gettext pour modifier les fichiers "
+"Gettext Portable Object (<em>.po</em>) du paquet ou créer un nouveau "
+"fichier <em>.po</em>. La fonction <a href='@import'>importer</a> du "
+"module Locale permet d'ajouter à votre site les chaînes de texte "
+"issues d'un fichier <em>.po</em> nouveau ou modifié. La fonction <a "
+"href='@export'>exporter</a> du module Locale permet de générer des "
+"fichiers à partir des chaînes traduites de votre site. Ces fichiers "
+"peuvent être partagés avec d'autres utilisateurs de Drupal ou "
+"modifiés avec un éditeur de traduction Gettext."
+msgid "Configuring a multilingual site"
+msgstr "Configuration d'un site multilingue"
+msgid ""
+"Language negotiation allows your site to automatically change language "
+"based on the domain or path used for each request. Users may "
+"(optionally) select their preferred language on their <em>My "
+"account</em> page, and your site can be configured to honor a web "
+"browser's preferred language settings. Site content can be translated "
+"using the <a href='@content-help'>Content translation module</a>."
+msgstr ""
+"La négociation de langue permet à votre site de changer de langue "
+"automatiquement en se basant sur le nom de domaine ou sur le chemin "
+"utilisé lors de chaque requête. Les utilisateurs peuvent "
+"(optionnellement) choisir leur langue préférée sur le page <em>Mon "
+"compte</em>, et votre site peut être configuré pour prendre en "
+"compte les préférence de langue du navigateur Web. Le contenu du "
+"site peut être traduit en utilisant le <a href='@content-help'>module "
+"Content translation</a>."
+msgid ""
+"With multiple languages enabled, interface text can be translated, "
+"registered users may select their preferred language, and authors can "
+"assign a specific language to content. <a "
+"href=\"@translations\">Download contributed translations</a> from "
+"Drupal.org."
+msgstr ""
+"Avec plusieurs langues activées, le texte de l'interface peut être "
+"traduit, les utilisateurs enregistrés peuvent choisir leur langue "
+"préférée, et les auteurs peuvent assigner une langue spécifique à "
+"leur contenu. <a href=\"@translations\">Télécharger les traductions "
+"contribuées</a> depuis Drupal.org."
+msgid ""
+"Add a language to be supported by your site. If your desired language "
+"is not available in the <em>Language name</em> drop-down, click "
+"<em>Custom language</em> and provide a language code and other details "
+"manually. When providing a language code manually, be sure to enter a "
+"standardized language code, since this code may be used by browsers to "
+"determine an appropriate display language."
+msgstr ""
+"Ajouter une langue pour qu'elle soit utilisable dans votre site. Si la "
+"langue souhaitée n'est pas disponible dans le menu déroulant <em>Nom "
+"de la langue</em>, cliquez sur Langue personnalisée et indiquez le "
+"code de la langue et les autres détails manuellement. Lorsque vous "
+"définissez une langue manuellement, vérifiez que vous entrez un code "
+"de langue standardisé, afin que ce code puisse être compris  par les "
+"navigateurs pour qu'ils utilisent une langue d'affichage appropriée."
+msgid ""
+"Determine the language from a request/session parameter. Example: "
+"\"http://example.com?language=de\" sets language to German based on "
+"the use of \"de\" within the \"language\" parameter."
+msgstr ""
+"Détermine la langue à partir d'un paramètre de requête ou de "
+"session. Par exemple : \"http://example.com?language=de\" règle la "
+"langue sur l'allemand en utilisant le code \"de\" dans le paramètre "
+"\"language\"."
+msgid ""
+"See the <a href=\"@languages\">Languages page</a> for more information "
+"on adding support for additional languages."
+msgstr ""
+"Voir la <a href=\"@languages\">page Langues</a> pour plus "
+"d'information sur l'ajout d'autres langues."
+msgid ""
+"This page imports the translated strings contained in an individual "
+"Gettext Portable Object (<em>.po</em>) file. Normally distributed as "
+"part of a translation package (each translation package may contain "
+"several <em>.po</em> files), a <em>.po</em> file may need to be "
+"imported after offline editing in a Gettext translation editor. "
+"Importing an individual <em>.po</em> file may be a lengthy process."
+msgstr ""
+"Cette page importe les chaînes traduites contenues dans un seul "
+"fichier Gettext Portable Object (<em>.po</em>). Normalement distribué "
+"comme partie d'un paquetage de traduction (chaque paquetage de "
+"traduction peut contenir plusieurs fichiers <em>.po</em>), un fichier "
+"<em>.po</em> peut avoir besoin d'être importé après une traduction "
+"hors ligne dans un logiciel de traduction Gettext. Importer un fichier "
+"<em>.po</em> individuel peut être une opération assez lente."
+msgid ""
+"This page allows a translator to search for specific translated and "
+"untranslated strings, and is used when creating or editing "
+"translations. (Note: For translation tasks involving many strings, it "
+"may be more convenient to <a href=\"@export\">export</a> strings for "
+"offline editing in a desktop Gettext translation editor.) Searches may "
+"be limited to strings found within a specific text group or in a "
+"specific language."
+msgstr ""
+"Cette page permet à un traducteur de rechercher des chaînes de "
+"caractères spécifiques, traduites ou non, et est utilisée lors de "
+"la création ou de la modification de traductions. (À noter&nbsp;: "
+"Pour les tâches de traduction portant sur de nombreuses chaînes, il "
+"peut être plus approprié d'<a href=\"@export\">exporter les "
+"chaînes</a> et de les modifier hors-ligne avec un éditeur de "
+"traduction Gettext.) Les recherches peuvent être limitées aux "
+"chaînes présentes dans un groupe de texte spécifique ou une langue "
+"en particulier."
+msgid "Administer languages"
+msgstr "Administrer les langues"
+msgid "Translate interface texts"
+msgstr "Traduire les textes de l'interface"
+msgid ""
+"Order of language detection methods for content. If a version of "
+"content is available in the detected language, it will be displayed."
+msgstr ""
+"Ordre des méthodes de détection de la langue. Si une version du "
+"contenu est disponible dans la langue détectée, celle-ci sera "
+"affichée."
+msgid ""
+"Order of language detection methods for user interface text. If a "
+"translation of user interface text is available in the detected "
+"language, it will be displayed."
+msgstr ""
+"Ordre des méthodes de détection des langues pour le texte de "
+"l'interface utilisateur. Si une version du texte de l'interface "
+"utilisateur est disponible dans la langue détectée, elle sera "
+"affichée."
+msgid "Determine the language from the URL (Path prefix or domain)."
+msgstr ""
+"Déterminer la langue à partir de l'URL (préfixe de chemin ou nom de "
+"domaine)."
+msgid "Determine the language from a request/session parameter."
+msgstr ""
+"Déterminer la langue à partir d'un paramètre de requête ou de "
+"session."
+msgid "Follow the user's language preference."
+msgstr "Suivre la préférence linguistique de l'utilisateur."
+msgid "Determine the language from the browser's language settings."
+msgstr ""
+"Déterminer la langue à partir des paramètres de langue du "
+"navigateur."
+msgid "Language switcher (@type)"
+msgstr "Sélecteur de langue (@type)"
+msgid "Detection and selection"
+msgstr "Détection et sélection"
+msgid "URL language detection configuration"
+msgstr "Configuration de la détection de langue dans l'URL"
+msgid "Session language detection configuration"
+msgstr "Configuration de la détection de langue dans la session"
+msgid "Localize"
+msgstr "Localiser"
+msgid "Localize date formats"
+msgstr "Localisation des formats de dates"
+msgid "Reset date formats"
+msgstr "Réinitialiser les formats de dates"
+msgid "Reset localized date formats to global defaults"
+msgstr ""
+"Réinitialise les formats de dates vers les formats globaux par "
+"défaut."
+msgctxt "Long month name"
+msgid "January"
+msgstr "Janvier"
+msgctxt "Long month name"
+msgid "February"
+msgstr "Février"
+msgctxt "Long month name"
+msgid "March"
+msgstr "Mars"
+msgctxt "Long month name"
+msgid "April"
+msgstr "Avril"
+msgctxt "Long month name"
+msgid "May"
+msgstr "Mai"
+msgctxt "Long month name"
+msgid "June"
+msgstr "Juin"
+msgctxt "Long month name"
+msgid "July"
+msgstr "Juillet"
+msgctxt "Long month name"
+msgid "August"
+msgstr "Août"
+msgctxt "Long month name"
+msgid "September"
+msgstr "Septembre"
+msgctxt "Long month name"
+msgid "October"
+msgstr "Octobre"
+msgctxt "Long month name"
+msgid "November"
+msgstr "Novembre"
+msgctxt "Long month name"
+msgid "December"
+msgstr "Décembre"
+msgid "add link"
+msgstr "ajouter un lien"
+msgid "There are no menu links yet. <a href=\"@link\">Add link</a>."
+msgstr ""
+"Il n'y a pas encore de lien de menu. <a href=\"@link\"> Ajouter un "
+"lien</a>."
+msgid "The text to be used for this link in the menu."
+msgstr "Le texte à utiliser pour ce lien dans le menu."
+msgid ""
+"The path for this menu link. This can be an internal Drupal path such "
+"as %add-node or an external URL such as %drupal. Enter %front to link "
+"to the front page."
+msgstr ""
+"Le chemin pour ce lien de menu. Cela peut être un chemin interne de "
+"Drupal comme %add-node ou une URL externe comme %drupal. Utiliser "
+"%front pour faire un lien vers la page d'accueil."
+msgid "Menu links that are not enabled will not be listed in any menu."
+msgstr ""
+"Les liens de menu qui ne sont pas activés ne seront pas listés dans "
+"les menus."
+msgid "Show as expanded"
+msgstr "Afficher déplié"
+msgid ""
+"If selected and this menu link has children, the menu will always "
+"appear expanded."
+msgstr ""
+"S'il est sélectionné et qu'il a des enfants, ce menu apparaitra "
+"toujours déplié."
+msgid "Parent link"
+msgstr "Lien parent"
+msgid ""
+"The maximum depth for a link and all its children is fixed at "
+"!maxdepth. Some menu links may not be available as parents if "
+"selecting them would exceed this limit."
+msgstr ""
+"La profondeur maximum pour un lien et tout ses enfants est fixée à  "
+"!maxdepth. Certains liens de menu peuvent ne pas être utilisables "
+"comme parents si la limite est dépassée lorsqu'on les sélectionne."
+msgid ""
+"Optional. In the menu, the heavier links will sink and the lighter "
+"links will be positioned nearer the top."
+msgstr ""
+"Optionnel. Dans ce menu, les liens les plus lourds descendent et les "
+"plus légers montent vers le haut."
+msgid "Are you sure you want to delete the custom menu link %item?"
+msgstr ""
+"Êtes-vous sûr de vouloir supprimer le lien de menu personnalisé "
+"%item&nbsp;?"
+msgid "The menu link %title has been deleted."
+msgstr "Le lien de menu %title a été supprimé."
+msgid "Are you sure you want to reset the link %item to its default values?"
+msgstr ""
+"Êtes-vous sûr(e) de vouloir réinitialiser le lien %item à ses "
+"valeurs par défaut ?"
+msgid "The menu link was reset to its default settings."
+msgstr "Le lien de menu a été réinitialisé à ses valeurs par défaut."
+msgid "No Main links"
+msgstr "Aucun lien principal"
+msgid "Source for the Main links"
+msgstr "Source des Liens principaux"
+msgid ""
+"Select what should be displayed as the Main links (typically at the "
+"top of the page)."
+msgstr ""
+"Sélectionner ce qui doit être affiché comme Liens principaux "
+"(typiquement en haut de page)."
+msgid "No Secondary links"
+msgstr "Aucun lien secondaire"
+msgid "Source for the Secondary links"
+msgstr "Source des Liens secondaires"
+msgid ""
+"Select the source for the Secondary links. An advanced option allows "
+"you to use the same source for both Main links (currently %main) and "
+"Secondary links: if your source menu has two levels of hierarchy, the "
+"top level menu links will appear in the Main links, and the children "
+"of the active link will appear in the Secondary links."
+msgstr ""
+"Sélectionner la source des Liens secondaires. Une option avancée "
+"vous permet d'utiliser la même source pour les Liens principaux "
+"(actuellement %main) et les Liens secondaires. Si votre menu source "
+"contient une hiérarchie de liens à deux niveaux, les liens du "
+"premier niveau seront affichés dans les Liens principaux et les liens "
+"enfants du lien actif dans les Liens secondaires."
+msgid "Deleted custom menu %title and all its menu links."
+msgstr ""
+"Le menu personnalisé %title a été supprimé ainsi que tous ses "
+"liens."
+msgid "Deleted menu link %title."
+msgstr "Le lien de menu %title a été supprimé."
+msgid ""
+"<strong>Warning:</strong> There is currently 1 menu link in %title. It "
+"will be deleted (system-defined items will be reset)."
+msgid_plural ""
+"<strong>Warning:</strong> There are currently @count menu links in "
+"%title. They will be deleted (system-defined links will be reset)."
+msgstr[0] ""
+"<strong>Attention&nbsp;:</strong> Il y a actuellement 1 entrée de "
+"menu dans %title. Elle sera supprimée (les entrées définies par le "
+"système seront réinitialisées)."
+msgstr[1] ""
+"<strong>Attention&nbsp;:</strong> Il y a actuellement @count entrées "
+"de menu dans %title. Elles seront supprimées (les entrées définies "
+"par le système seront réinitialisées)."
+msgid "Managing menus"
+msgstr "Gestion des menus"
+msgid ""
+"Users with the <em>Administer menus and menu items</em> permission can "
+"add, edit and delete custom menus on the <a href=\"@menu\">Menus "
+"administration page</a>. Custom menus can be special site menus, menus "
+"of external links, or any combination of internal and external links. "
+"You may create an unlimited number of additional menus, each of which "
+"will automatically have an associated block. By selecting <em>list "
+"links</em>, you can add, edit, or delete links for a given menu. The "
+"links listing page provides a drag-and-drop interface for controlling "
+"the order of links, and creating a hierarchy within the menu."
+msgstr ""
+"Les utilisateurs disposant de la permission <em>Administrer les menus "
+"et les éléments de menus</em> peuvent ajouter, modifier et supprimer "
+"les menus personnalisés dans la page <a href=\"@menu\">Administration "
+"des menus</a>. Les menus personnalisés peuvent être des menus "
+"spécifiques au site, des menus de liens externes, ou n'importe quelle "
+"combinaison de liens internes ou externes. Vous pouvez créer un "
+"nombre illimité de menus, chacun d'eux disposera automatiquement d'un "
+"bloc associé. En sélectionnant <em>Liste de liens</em>, vous pouvez "
+"ajouter, modifier ou supprimer les liens d'un menu donné. La page "
+"listant les liens fournit une interface de glissé-déposé "
+"(<em>drag-and-drop</em>) permettant de contrôler l'ordre des liens et "
+"de les hiérarchiser au sein menu."
+msgid "Displaying menus"
+msgstr "Affichage des menus"
+msgid ""
+"After you have created a menu, you must enable and position the "
+"associated block on the <a href=\"@blocks\">Blocks administration "
+"page</a>."
+msgstr ""
+"Après avoir créé un menu, vous devez activer et positionner le bloc "
+"associé à partir de la page <a href=\"@blocks\">Administration des "
+"blocs</a>."
+msgid ""
+"You can enable the newly-created block for this menu on the <a "
+"href=\"@blocks\">Blocks administration page</a>."
+msgstr ""
+"Vous pouvez activer le bloc nouvellement créé pour ce menu dans la "
+"page <a href=\"@blocks\">Administration des blocs</a>."
+msgid ""
+"Each menu has a corresponding block that is managed on the <a "
+"href=\"@blocks\">Blocks administration page</a>."
+msgstr ""
+"Chaque menu a un bloc correspondant qui est géré sur la page <a "
+"href=\"@blocks\">d'administration des blocs</a>."
+msgid "Administer menus and menu items"
+msgstr "Administrer les menus et les éléments de menus."
+msgid "Provide a menu link"
+msgstr "Fournir un lien de menu"
+msgid ""
+"Menu links with smaller weights are displayed before links with larger "
+"weights."
+msgstr ""
+"Les liens de menus avec un poids léger seront affichés avant les "
+"liens dotés d'un poids plus lourd."
+msgid "Available menus"
+msgstr "Menus disponibles"
+msgid "The menus available to place links in for this content type."
+msgstr "Menus acceptant les liens de ce type de contenu."
+msgid "Default parent item"
+msgstr "Élément parent par défaut"
+msgid ""
+"Choose the menu item to be the default parent for a new link in the "
+"content authoring form."
+msgstr ""
+"Choisir l'élément de menu qui deviendra le parent par défaut pour "
+"les nouveaux liens dans le formulaire de création de contenu."
+msgid ""
+"Add new menus to your site, edit existing menus, and rename and "
+"reorganize menu links."
+msgstr ""
+"Ajouter de nouveaux menus à votre site, modifier les menus existants, "
+"renommer et réorganiser les liens qui s'y trouvent."
+msgid "Parent menu items"
+msgstr "Éléments du menu parent"
+msgid "Edit menu link"
+msgstr "Modifier le lien de menu"
+msgid "Reset menu link"
+msgstr "Réinitialiser le lien du menu"
+msgid "Delete menu link"
+msgstr "Suppirmer le lien de menu"
+msgid ""
+"The <em>Navigation</em> menu contains links intended for site "
+"visitors. Links are added to the <em>Navigation</em> menu "
+"automatically by some modules."
+msgstr ""
+"Le <em>menu Navigation</em> contient les liens destinés aux visiteurs "
+"du site. Des liens sont automatiquement ajoutés à ce menu par "
+"certains modules."
+msgid ""
+"The <em>User</em> menu contains links related to the user's account, "
+"as well as the 'Log out' link."
+msgstr ""
+"Le menu <em>Utilisateur</em> contient les liens du compte utilisateur, "
+"comme le lien \"Déconnexion\""
+msgid "The <em>Management</em> menu contains links for administrative tasks."
+msgstr ""
+"Le menu <em>Gestion</em> contient les liens des tâches "
+"administratives"
+msgid ""
+"The <em>Main</em> menu is used on many sites to show the major "
+"sections of the site, often in a top navigation bar."
+msgstr ""
+"Le <em>menu Principal</em> est fréquemment utilisé pour afficher les "
+"sections importantes du site, souvent dans la barre de navigation de "
+"haut de page."
+msgid "manage display"
+msgstr "gérer l'affichage"
+msgid "No content types available. <a href=\"@link\">Add content type</a>."
+msgstr ""
+"Aucun type de contenu n'est disponible. <a href=\"@link\">Ajouter un "
+"type de contenu</a>."
+msgid ""
+"The human-readable name of this content type. This text will be "
+"displayed as part of the list on the <em>Add new content</em> page. It "
+"is recommended that this name begin with a capital letter and contain "
+"only letters, numbers, and spaces. This name must be unique."
+msgstr ""
+"Le nom \"lisible par les utilisateurs\" de ce type de contenu. Ce "
+"texte sera affiché comme élément de liste dans la page <em>Ajouter "
+"un nouveau contenu</em>. Il est d'usage que ce nom commence par une "
+"majuscule et ne contienne que des lettres, des nombres et des espaces. "
+"Ce nom doit être unique."
+msgid ""
+"Describe this content type. The text will be displayed on the <em>Add "
+"new content</em> page."
+msgstr ""
+"Décrire ce type de contenu. Le texte sera affiché dans la page "
+"<em>Ajouter un nouveau contenu</em>."
+msgid "Preview before submitting"
+msgstr "Aperçu avant soumission"
+msgid ""
+"This text will be displayed at the top of the page when creating or "
+"editing content of this type."
+msgstr ""
+"Ce texte sera affiché en haut de la page lors de la création ou de "
+"la modification de ce type de contenu."
+msgid ""
+"Users with the <em>Administer content</em> permission will be able to "
+"override these options."
+msgstr ""
+"Les utilisateurs ayant la permission <em>Administrer le contenu</em> "
+"pourront supplanter ces options"
+msgid "Display author and date information."
+msgstr "Afficher l'auteur et la date."
+msgid "Author username and publish date will be displayed."
+msgstr ""
+"Le nom d'utilisateur de l'auteur et la date de publication seront "
+"affichés"
+msgid "Invalid machine-readable name. Enter a name other than %invalid."
+msgstr "Nom interne incorrect. Entrer un nom différent de \"%invalid\"."
+msgid ""
+"%type is used by 1 piece of content on your site. If you remove this "
+"content type, you will not be able to edit the %type content and it "
+"may not display correctly."
+msgid_plural ""
+"%type is used by @count pieces of content on your site. If you remove "
+"%type, you will not be able to edit the %type content and it may not "
+"display correctly."
+msgstr[0] ""
+"%type est utilisé par 1 contenu sur votre site. Il pourrait être "
+"impossible de l'afficher ou de le modifier correctement, si vous "
+"supprimez le type de contenu."
+msgstr[1] ""
+"%type est utilisé par @count contenus sur votre site. Il pourrait "
+"être impossible de les afficher ou les modifier correctement, si vous "
+"supprimez le type de contenu."
+msgid "Publish selected content"
+msgstr "Publier le contenu sélectionné"
+msgid "Unpublish selected content"
+msgstr "Dépublier le contenu sélectionné"
+msgid "Promote selected content to front page"
+msgstr "Promouvoir en page d'accueil le contenu sélectionné"
+msgid "Demote selected content from front page"
+msgstr "Retirer de la page d'accueil le contenu sélectionné"
+msgid "Make selected content sticky"
+msgstr "Épingler en haut des listes le contenu sélectionné"
+msgid "Make selected content not sticky"
+msgstr "Retirer du haut des listes le contenu sélectionné"
+msgid "Delete selected content"
+msgstr "Supprimer le contenu sélectionné"
+msgid "Deleted @count posts."
+msgstr "@count publications supprimées."
+msgid "Are you sure you want to delete this item?"
+msgid_plural "Are you sure you want to delete these items?"
+msgstr[0] "Êtes-vous sûr(e) de vouloir supprimer cet élément ?"
+msgstr[1] "Êtes-vous sûr(e) de vouloir supprimer ces éléments ?"
+msgid "<em>Edit @type</em> @title"
+msgstr "<em>Modifier @type</em> @title"
+msgid ""
+"You have not created any content types yet. Go to the <a "
+"href=\"@create-content\">content type creation page</a> to add a new "
+"content type."
+msgstr ""
+"Vous n'avez aucun type de contenu pour l'instant. Pour ajouter un "
+"nouveau type de contenu, allez à la page de <a "
+"href=\"@create-content\">création d'un type de contenu</a>."
+msgid "Revision log message"
+msgstr "Message du journal de révision"
+msgid ""
+"Provide an explanation of the changes you are making. This will help "
+"other authors understand your motivations."
+msgstr ""
+"Explication des modifications que vous avez effectuées. Cela peut "
+"aider les autres auteurs à mieux comprendre vos motivations."
+msgid "Tokens related to individual content items, or \"nodes\"."
+msgstr ""
+"Jetons (tokens) en rapport avec des éléments individuels, ou "
+"\"nœuds\" (nodes)."
+msgid "The unique ID of the content item, or \"node\"."
+msgstr ""
+"L'identifiant (ID) unique de l'élément de contenu, ou \"nœud\" "
+"(node)."
+msgid "The main body text of the node."
+msgstr "Le corps de texte principal du nœud."
+msgid "The summary of the node's main body text."
+msgstr "Le résumé du corps de texte principal du nœud."
+msgid ""
+"The content access permissions need to be rebuilt. <a "
+"href=\"@node_access_rebuild\">Rebuild permissions</a>."
+msgstr ""
+"Les permissions d'accès au contenu doivent être reconstruites. <a "
+"href=\"@node_access_rebuild\">Reconstruire les permissions</a>."
+msgid ""
+"The Node module manages the creation, editing, deletion, settings, and "
+"display of the main site content. Content items managed by the Node "
+"module are typically displayed as pages on your site, and include a "
+"title, some meta-data (author, creation time, content type, etc.), and "
+"optional fields containing text or other data (fields are managed by "
+"the <a href=\"@field\">Field module</a>). For more information, see "
+"the online handbook entry for <a href=\"@node\">Node module</a>."
+msgstr ""
+"Le module Node gère la création, la modification, la suppression, la "
+"configuration, et l'affichage du contenu principal du site. Les "
+"éléments de contenu (les <strong>nœuds</strong>) gérés par le "
+"module Node sont typiquement affichés en tant que pages de votre "
+"site&nbsp;; ils comprennent un titre, un certain nombre de "
+"métadonnées (auteur, date de création, type de contenu, etc.) et "
+"des champs optionnels pouvant contenir du texte ou d'autres types de "
+"données (les champs sont gérés par le <a href=\"@field\">module "
+"Field</a>). Pour plus d'information, voir la section <a "
+"href=\"@node\">Node</a> du manuel en ligne."
+msgid "Creating content"
+msgstr "Création de contenu"
+msgid ""
+"When new content is created, the Node module records basic information "
+"about the content, including the author, date of creation, and the <a "
+"href=\"@content-type\">Content type</a>. It also manages the "
+"<em>publishing options</em>, which define whether or not the content "
+"is published, promoted to the front page of the site, and/or sticky at "
+"the top of content lists. Default settings can be configured for each "
+"<a href=\"@content-type\">type of content</a> on your site."
+msgstr ""
+"Lorsqu'un nouveau contenu est créé, le module Node enregistre les "
+"informations de base liées à ce contenu&nbsp;; elles comprennent "
+"l'auteur, la date de création, et le <a href=\"@content-type\">type "
+"de contenu</a>. Les <em>options de publication</em> sont aussi "
+"gérées, elles permettent de définir si le contenu est publié ou "
+"non, promu ou pas en page d'acceuil, et/ou épinglé en haut des "
+"listes de contenu. Les paramètres par défaut peuvent être "
+"configurés pour chaque <a href=\"@content-type\">type de contenu</a> "
+"de votre site."
+msgid "Creating custom content types"
+msgstr "Création de types de contenu personnalisés"
+msgid ""
+"The Node module gives users with the <em>Administer content types</em> "
+"permission the ability to <a href=\"@content-new\">create new content "
+"types</a> in addition to the default ones already configured. Creating "
+"custom content types allows you the flexibility to add <a "
+"href=\"@field\">fields</a> and configure default settings that suit "
+"the differing needs of various site content."
+msgstr ""
+"Le module Node donne aux utilisateurs ayant la permission "
+"<em>Administrer les types de contenus</em> la faculté de <a "
+"href=\"@content-new\">créer de nouveaux types de contenus</a> en plus "
+"de ceux qui sont déjà définis par défaut. La création de types de "
+"contenus personnalisés vous permet d'ajouter des  <a "
+"href=\"@field\">champs</a> et de configurer les paramètres par "
+"défaut qui répondent aux besoins de contenus distincts de chaque "
+"site."
+msgid "Administering content"
+msgstr "Administration du contenu"
+msgid ""
+"The <a href=\"@content\">Content administration page</a> allows you to "
+"review and bulk manage your site content."
+msgstr ""
+"La page <a href=\"@content\">Administration du contenu</a> vous permet "
+"de suivre et de gérer globalement le contenu de votre site."
+msgid "Creating revisions"
+msgstr "Création de révisions"
+msgid ""
+"The Node module also enables you to create multiple versions of any "
+"content, and revert to older versions using the <em>Revision "
+"information</em> settings."
+msgstr ""
+"Le module Node permet aussi de créer de multiples versions de "
+"n'importe quel contenu, et de rétablir les versions antérieures en "
+"utilisant les paramètres <em>Informations de révision</em>."
+msgid "User permissions"
+msgstr "Droits de l'utilisateur"
+msgid ""
+"The Node module makes a number of permissions available for each "
+"content type, which can be set by role on the <a "
+"href=\"@permissions\">permissions page</a>."
+msgstr ""
+"Le module Node rend un certain nombre de permissions disponible pour "
+"chaque type de contenu, elles peuvent être paramétrées par rôle "
+"dans la page <a href=\"@permissions\">Permissions</a>."
+msgid ""
+"Individual content types can have different fields, behaviors, and "
+"permissions assigned to them."
+msgstr ""
+"Chaque type de contenu peut recevoir, individuellement, des champs, "
+"des comportements, et des permissions distincts."
+msgid ""
+"Content items can be displayed using different view modes: Teaser, "
+"Full content, Print, RSS, etc. <em>Teaser</em> is a short format that "
+"is typically used in lists of multiple content items. <em>Full "
+"content</em> is typically used when the content is displayed on its "
+"own page."
+msgstr ""
+"Les éléments de contenu peuvent être affichés en utilisant "
+"différents modes de présentation&nbsp;: accroche, contenu intégral, "
+"impression, RSS, etc. L'<em>accroche</em> (<em>teaser</em>) est un "
+"format court qui est typiquement utilisé dans les listes de multiples "
+"éléments de contenus. Le <em>contenu intégral</em> est typiquement "
+"utilisé lorsqu'un contenu est affiché au sein de sa propre page."
+msgid ""
+"Here, you can define which fields are shown and hidden when %type "
+"content is displayed in each view mode, and define how the fields are "
+"displayed in each view mode."
+msgstr ""
+"Ici, vous pouvez définir quels champs seront affichés ou masqués "
+"pour chaque mode de présentation du contenu %type, et définir "
+"comment les champs seront affichés dans chaque mode de présentation."
+msgid ""
+"Revisions allow you to track differences between multiple versions of "
+"your content, and revert back to older versions."
+msgstr ""
+"Les révisions vous permettent de faire le suivi des différences "
+"entre les différentes versions de votre contenu, et de rétablir les "
+"versions plus anciennes."
+msgid "Full content"
+msgstr "Contenu complet"
+msgid "Search result"
+msgstr "Résultat de la recherche"
+msgid ""
+"The content on this page has either been modified by another user, or "
+"you have already submitted modifications using this form. As a result, "
+"your changes cannot be saved."
+msgstr ""
+"Le contenu de cette page a été modifié par un autre utilisateur, ou "
+"c'est vous qui avez déjà soumis des changements en utilisant ce "
+"formulaire. Par conséquent, vos modifications ne peuvent pas être "
+"enregistrées."
+msgid "Administer content types"
+msgstr "Administrer les types de contenus"
+msgid ""
+"Warning: Give to trusted roles only; this permission has security "
+"implications."
+msgstr ""
+"Attention : ne l'attribuer qu'à des rôles de confiance ; cette "
+"permission touche à la sécurité."
+msgid "View published content"
+msgstr "Voir le contenu publié"
+msgid "Access the content overview page"
+msgstr "Accéder à la page de vue d'ensemble du contenu"
+msgid "Bypass content access control"
+msgstr "Outrepasser le contrôle d'accès au contenu"
+msgid "View content revisions"
+msgstr "Voir les révisions de contenu"
+msgid "Revert content revisions"
+msgstr "Rétablir des révisions de contenu"
+msgid "Delete content revisions"
+msgstr "Supprimer des révisions de contenu"
+msgid "View own unpublished content"
+msgstr "Voir le contenu non-publié dont on est l'auteur"
+msgid "Content is sticky at top of lists"
+msgstr "Le contenu est épinglé en haut des listes"
+msgid "Content is promoted to the front page"
+msgstr "Le contenu est promu en page d'accueil"
+msgid "Recent content"
+msgstr "Contenu récent"
+msgid "Number of recent content items to display"
+msgstr "Nombre d'éléments de contenu récent à afficher"
+msgid "Show block for specific content types"
+msgstr "Afficher le bloc pour des types de contenus spécifiques"
+msgid ""
+"Show this block only on pages that display content of the given "
+"type(s). If you select no types, there will be no type-specific "
+"limitation."
+msgstr ""
+"Afficher ce bloc seulement sur les pages qui affichent des contenus du "
+"ou des types indiqués. Si vous ne sélectionnez pas de type, il n'y "
+"aura aucune limitation spécifique aux types."
+msgid "Welcome to @site-name"
+msgstr "Bienvenue sur @site-name"
+msgid "No front page content has been created yet."
+msgstr "Aucun contenu de page d'accueil n'a été créé pour l'instant."
+msgid "Unpublish content"
+msgstr "Dépublier un contenu"
+msgid "Make content sticky"
+msgstr "Épingler un contenu en haut des listes"
+msgid "Make content unsticky"
+msgstr "Retirer un contenu du haut des listes"
+msgid "Promote content to front page"
+msgstr "Promouvoir un contenu en page d'accueil"
+msgid "Remove content from front page"
+msgstr "Retirer un contenu de la page d'accueil"
+msgid "Change the author of content"
+msgstr "Changer l'auteur d'un contenu"
+msgid "Save content"
+msgstr "Enregistrer un contenu"
+msgid "Unpublish content containing keyword(s)"
+msgstr "Dépublier un contenu contenant le(s) mot(s)-clé(s)"
+msgid ""
+"The content will be unpublished if it contains any of the phrases "
+"above. Use a case-sensitive, comma-separated list of phrases. Example: "
+"funny, bungee jumping, \"Company, Inc.\""
+msgstr ""
+"Le contenu sera dépublier s'il contient n'importe laquelle des "
+"phrases ci-dessus. Utiliser une liste de phrases séparées par des "
+"virgules, les phrases sont sensibles à la casse. Exemple&nbsp;: "
+"amusant, saut à l'élastique, \"Company, Inc.\""
+msgid ""
+"If the site is experiencing problems with permissions to content, you "
+"may have to rebuild the permissions cache. Rebuilding will remove all "
+"privileges to content and replace them with permissions based on the "
+"current modules and settings. Rebuilding may take some time if there "
+"is a lot of content or complex permission settings. After rebuilding "
+"has completed, content will automatically use the new permissions."
+msgstr ""
+"Si le site rencontre des problèmes avec les permissions d'accès au "
+"contenu, vous pouvez avoir à reconstruire le cache des permissions. "
+"La reconstruction va supprimer tous les privilèges d'accès et les "
+"remplacer par les permissions basées sur les paramètres et les "
+"modules courants. La reconstruction peut prendre un certain temps si "
+"le contenu est important et les paramètres de permissions complexes. "
+"Après la reconstruction, le contenu utilisera automatiquement les "
+"nouvelles permissions."
+msgid "Node Access Permissions"
+msgstr "Droits d'accès au nœud"
+msgid "One permission in use"
+msgid_plural "@count permissions in use"
+msgstr[0] "@count permission utilisée"
+msgstr[1] "@count permissions utilisées"
+msgid "Find and manage content."
+msgstr "Trouver et gérer un contenu."
+msgid ""
+"Manage content types, including default status, front page promotion, "
+"comment settings, etc."
+msgstr ""
+"Gérer les types de contenu, incluant les valeurs par défaut, la "
+"promotion en page d'accueil, les paramètres des commentaires, etc."
+msgid "Edit content type"
+msgstr "Modifier le type de contenu"
+msgid "Don't display post information"
+msgstr "Ne pas afficher les informations de la contribution"
+msgid ""
+"This site supports <a href=\"@openid-net\">OpenID</a>, a secure way to "
+"log in to many websites using a single username and password. OpenID "
+"can reduce the necessity of managing many usernames and passwords for "
+"many websites."
+msgstr ""
+"Ce site est compatible avec <a href=\"@openid-net\">OpenID</a>, un "
+"moyen sécurisé de se connecter à de nombreux sites en n'utilisant "
+"qu'un seul nom d'utilisateur et qu'un seul mot de passe. OpenID peut "
+"réduire l'obligation de gérer de nombreux noms d'utilisateur et de "
+"mot de passe pour de nombreux sites."
+msgid ""
+"If you already have an OpenID, enter the URL to your OpenID server "
+"below (e.g. myusername.openidprovider.com). Next time you log in, you "
+"will be able to use this URL instead of a regular username and "
+"password. You can have multiple OpenID servers if you like; just keep "
+"adding them here."
+msgstr ""
+"Si vous avez déjà un OpenID, saisissez l'URL de votre serveur OpenID "
+"ci-dessous (par ex.&nbsp;: mon-nom.openprovider.com). La prochaine "
+"fois que vous vous connecterez, vous pourrez utiliser cette URL à la "
+"place des nom d'utilisateur et mot de passe ordinaires. Vous pouvez "
+"avoir plusieurs serveurs OpenID si vous le souhaitez&nbsp;; prenez "
+"juste le temps de les ajouter ici."
+msgid ""
+"The OpenID module allows users to log in using the OpenID single sign "
+"on service. <a href=\"@openid-net\">OpenID</a> is a secure method for "
+"logging into many websites with a single username and password. It "
+"does not require special software, and it does not share passwords "
+"with any site to which it is associated, including the site being "
+"logged into. The main benefit to users is that they can have a single "
+"password that they can use on many websites. This means they can "
+"easily update their single password from a centralized location, "
+"rather than having to change dozens of passwords individually. For "
+"more information, see the online handbook entry for <a "
+"href=\"@handbook\">OpenID module</a>."
+msgstr ""
+"Le module OpenID permet aux utilisateurs de se connecter en utilisant "
+"le service d'authentification unique OpenID. <a "
+"href=\"@openid-net\">OpenID</a> est une méthode sécurisée pour se "
+"connecter à de nombreux sites avec un seul nom d'utilisateur et un "
+"seul mot de passe. Il ne requiert aucun logiciel spécial, et ne "
+"partage aucun mot de passe avec les sites auquels il est associé, pas "
+"plus qu'avec les sites qui s'y connectent. Le principal intérêt pour "
+"les utilisateurs est qu'ils peuvent n 'avoir qu'un seul mot de passe "
+"qu'ils utilisent sur de nombreux sites. Cela signifie qu'ils peuvent "
+"facilement mettre à jour leur unique mot de passe  à partir d'un "
+"emplacement centralisé, au lieu d'avoir à changer des dizaines de "
+"mots de passe un par un. Pour plus d'information, voir le manuel en "
+"ligne à la section <a href=\"@handbook\">module OpenID</a>."
+msgid "Logging in with OpenID"
+msgstr "Se connecter avec OpenID"
+msgid ""
+"To log in using OpenID, a user must already have an OpenID account. "
+"Users can then create site accounts using their OpenID, assign one or "
+"more OpenIDs to an existing account, and log in using an OpenID. This "
+"lowers the barrier to registration, which helps increase the user "
+"base, and offers convenience and security to the users. Because OpenID "
+"cannot guarantee a user is legitimate, email verification is still "
+"necessary. When logging in, users are presented with the option of "
+"entering their OpenID URL, which will look like "
+"<em>myusername.openidprovider.com</em>. The site then communicates "
+"with the OpenID server, asking it to verify the identity of the user. "
+"If the user is logged into their OpenID server, the server "
+"communicates back to your site, verifying the user. If they are not "
+"logged in, the OpenID server will ask the user for their password. At "
+"no point does the site being logged into record the user's OpenID "
+"password."
+msgstr ""
+"Pour se connecter en utilisant OpenID, un utilisateur doit déjà "
+"disposer d'un compte OpenID. Les utilisateurs peuvent alors créer des "
+"comptes sur le site en utilisant leur OpenID, associer un ou plusieurs "
+"identifiants OpenID à un compte existant, et se connecter en "
+"utilisant un identifiant OpenID. Cela permet de réduire la "
+"résistance à l'inscription, d'améliorer la base des utilisateurs et "
+"de leur offrir un meilleur confort et une meilleure sécurité. Étant "
+"donné que le système OpenID de peut pas garantir qu'un utilisateur "
+"est valide, la vérification par courriel reste nécessaire. Durant la "
+"connexion, les utilisateurs voient apparaitre une option pour entrer "
+"leur URL OpenID qui ressemble à ceci&nbsp;: "
+"<em>mon-nom.openidprovider.com</em>. Le site entre en communication "
+"avec le serveur OpenID, et lui demande d'authentifier l'identité de "
+"l'utilisateur. Si l'utilisateur est connecté à son serveur OpenID, "
+"le serveur répond en retour au site, en authentifiant l'utilisateur. "
+"S'il n'est pas connecté, le serveur OpenID va demander son mot de "
+"passe à l'utilisateur. À aucun moment, le site qui se connecte "
+"n'enregistre le mot de passe OpenID de l'utilisateur."
+msgid "Once you have verified your e-mail address, you may log in via OpenID."
+msgstr ""
+"Un fois vous aurez vérifié votre adresse de courriel, vous pourrez "
+"vous connecter via OpenID."
+msgid ""
+"Sorry, that is not a valid OpenID. Ensure you have spelled your ID "
+"correctly."
+msgstr ""
+"Désolé, ce n'est pas un OpenID valide. Assurez-vous d'avoir saisi "
+"votre identifiant (ID) correctement."
+msgid ""
+"Complete the registration by filling out the form below. If you "
+"already have an account, you can <a href=\"@login\">log in</a> now and "
+"add your OpenID under \"My account\"."
+msgstr ""
+"Terminez l'inscription en remplissant le formulaire ci-dessous. Si "
+"vous disposez déjà d'un compte, vous pouvez <a href=\"@login\">vous "
+"connecter</a> maintenant et ajouter votre OpenID dans \"Mon compte\"."
+msgid ""
+"Account registration using the information provided by your OpenID "
+"provider failed due to the reasons listed below. Complete the "
+"registration by filling out the form below. If you already have an "
+"account, you can <a href=\"@login\">log in</a> now and add your OpenID "
+"under \"My account\"."
+msgstr ""
+"L'enregistrement du compte, qui utilise des informations émises par "
+"votre forunisseur OpenID, a échoué pour une des raisons listées "
+"ci-dessous. Terminez l'inscription en remplissant le formulaire "
+"ci-dessous.  Si vous disposez déjà d'un compte, vous pouvez <a "
+"href=\"@login\">vous connecter</a> maintenant et ajouter votre OpenID "
+"dans \"Mon compte\"."
+msgid ""
+"The Overlay module makes the administration pages on your site display "
+"in a JavaScript overlay of the page you were viewing when you clicked "
+"the administrative link, instead of replacing the page in your browser "
+"window. Use the close link on the overlay to return to the page you "
+"were viewing when you clicked the link. For more information, see the "
+"online handbook entry for <a href=\"@overlay\">Overlay module</a>."
+msgstr ""
+"Le module Overlay permet d'afficher les pages administratives de votre "
+"site au sein d'un premier plan (overlay) Javascript qui se superpose "
+"à votre page lorsque vous cliquez sur le lien administratif, au lieu "
+"de remplacer la page dans la fenêtre du navigateur. Utilisez le lien "
+"de fermeture de premier plan (overlay) pour retourner à la page que "
+"vous consultiez lorsque vous avez cliqué sur le lien. Pour plus "
+"d'information, voir le manuel en ligne à la section <a "
+"href=\"@overlay\">module Overlay</a>."
+msgid "Access the administrative overlay"
+msgstr "Accéder au premier plan (overlay)"
+msgid "View administrative pages in the overlay."
+msgstr "Voir les pages administratives dans le premier plan (overlay)."
+msgid "Displays the Drupal administration interface in an overlay."
+msgstr ""
+"Affiche l'interface d'administration de Drupal dans un premier plan "
+"(overlay)."
+msgid "@title dialog"
+msgstr "dialogue de @title"
+msgid ""
+"Specify the existing path you wish to alias. For example: node/28, "
+"forum/1, taxonomy/term/1."
+msgstr ""
+"Spécifiez le chemin existant auquel vous voulez associer un alias. "
+"Par exemple&nbsp;: node/28, forum/1, taxonomy/term/1."
+msgid ""
+"The Path module allows you to specify an alias, or custom URL, for any "
+"existing internal system path. Aliases should not be confused with URL "
+"redirects, which allow you to forward a changed or inactive URL to a "
+"new URL. In addition to making URLs more readable, aliases also help "
+"search engines index content more effectively. Multiple aliases may be "
+"used for a single internal system path. To automate the aliasing of "
+"paths, you can install the contributed module <a "
+"href=\"@pathauto\">Pathauto</a>. For more information, see the online "
+"handbook entry for the <a href=\"@path\">Path module</a>."
+msgstr ""
+"Le module Path vous permet de spécifier un chemin (path), ou une URL "
+"personnalisée, pour n'importe quel chemin interne existant. Les alais "
+"ne doievnt pas être confondus avec les redirections d'URL, qui vous "
+"permettent de rediriger une URL modifiée ou devenue inactive vers une "
+"nouvelle URL. De façon complémentaire, en rendantt les URL plus "
+"lisibles, les alias aide aussi les moteurs de recherche à indexer le "
+"contenu plus efficacement. Plusieurs alias peuvent être utilisés "
+"pour un seul chemin interne. Pour automatiser la création d'alais de "
+"chemins, vous pouvez installer le module contribué <a "
+"href=\"@pathauto\">Pathauto</a>. Pour plus d'information, voir le "
+"manuel en ligne à la section <a href=\"@path\">module Path</a>."
+msgid "Creating aliases"
+msgstr "Création d'alias"
+msgid ""
+"Users with sufficient <a href=\"@permissions\">permissions</a> can "
+"create aliases under the <em>URL path settings</em> section when they "
+"create or edit content. Some examples of aliases are: "
+msgstr ""
+"Les utilisateurs ayant les <a href=\"@permissions\">permissions</a> "
+"convenables peuvent créer des alias dans la section <em>Paramètres "
+"de chemin d'URL</em> lorsqu'ils créent ou éditent un contenu. Voici "
+"quelques exemple d'alias&nbsp;: "
+msgid "<em>member/jane-smith</em> aliased to internal path <em>user/123</em>"
+msgstr ""
+"<em>membre/jeanne-lefevre</em> est l'alias du chemin interne "
+"<em>user/123</em>"
+msgid "<em>about-us/team</em> aliased to internal path <em>node/456</em>"
+msgstr ""
+"<em>a-propos-de-nous/equipe</em> est l'alias du chemin interne "
+"<em>node/456</em>"
+msgid "Managing aliases"
+msgstr "Gestion des alias"
+msgid ""
+"The Path module provides a way to search and view a <a "
+"href=\"@aliases\">list of all aliases</a> that are in use on your "
+"website. Aliases can be added, edited and deleted through this list."
+msgstr ""
+"Le module Path fournit un moyen pour rechercher et afficher une <a "
+"href=\"@aliases\">liste de tous les alias</a> en cours d'utilisation "
+"dans votre site. Les alias peuvent être ajoutés, modifiés et "
+"supprimés à partir de cette liste."
+msgid ""
+"An alias defines a different name for an existing URL path - for "
+"example, the alias 'about' for the URL path 'node/1'. A URL path can "
+"have multiple aliases."
+msgstr ""
+"Un alias définit un nom différent pour le chemin d'une URL existante "
+"- par exemple, l'alias \"a-propos\" pour le chemin de l'URL "
+"\"node/1\". Un même chemin d'URL peut avoir plusieurs alias."
+msgid "Administer URL aliases"
+msgstr "Administrer les alias d'URL"
+msgid "Create and edit URL aliases"
+msgstr "Créer et modifier des alias d'URL"
+msgid "The alias is already in use."
+msgstr "L'alias est déjà utilisé."
+msgid ""
+"Optionally specify an alternative URL by which this term can be "
+"accessed. Use a relative path and don't add a trailing slash or the "
+"URL alias won't work."
+msgstr ""
+"Permet de définir éventuellement une URL alternative pour accéder "
+"au terme du vocabulaire. Utilisez un chemin relatif et n'ajoutez pas "
+"la barre oblique de fin sinon l'alias d'URL ne fonctionnera pas."
+msgid "Enabling execution of PHP in text fields"
+msgstr "Activation de l'exécution du PHP dans les champs de texte."
+msgid ""
+"The PHP filter module allows users with the proper permissions to "
+"include custom PHP code that will get executed when pages of your site "
+"are processed. While this is a powerful and flexible feature if used "
+"by a trusted user with PHP experience, it is a significant and "
+"dangerous security risk in the hands of a malicious or inexperienced "
+"user. Even a trusted user may accidentally compromise the site by "
+"entering malformed or incorrect PHP code. Only the most trusted users "
+"should be granted permission to use the PHP filter, and all PHP code "
+"added through the PHP filter should be carefully examined before use. "
+"<a href=\"@php-snippets\">Example PHP snippets</a> can be found on "
+"Drupal.org."
+msgstr ""
+"Le module PHP filter permet aux utilisateurs ayant les permissions "
+"appropriées d'incorporer du code PHP personnalisé qui sera exécuté "
+"lorsque les pages du site seront traitées. Bien que ce soit une "
+"fonctionnalité souple et puissance lorsqu'elle est utilisée par un "
+"utilisateur de confiance et disposant d'une bonne expérience en PHP, "
+"c'est un facteur de risque significatif et dangereux entre les mains "
+"d'un utilisateur inexpérimenté ou malveillant. Même un utilisateur "
+"de confiance peut compromettre le site accidentellement en insérant "
+"un code PHP incorrect ou mal formé. Seuls les utilisateurs les plus "
+"fiables doivent disposer des permissions leur permettant d'utiliser le "
+"filtre PHP, et chaque code PHP ajouté par le biais du filtre PHP doit "
+"être soigneusement examiné avant d'être mis en oeuvre. Des <a "
+"href=\"@php-snippets\">Exemples de fragments de code PHP "
+"(snippets)</a> peuvent être trouvés sur Drupal.org."
+msgid "Use PHP for settings"
+msgstr "Utiliser PHP pour les paramètres"
+msgid ""
+"<p>Add a custom block to your site, named \"Welcome\" . With its text "
+"format set to \"PHP code\" (or another format supporting PHP input), "
+"add the following in the Block body:</p>\n"
+"<pre>\n"
+"print t('Welcome visitor! Thank you for visiting.');\n"
+"</pre>"
+msgstr ""
+"<p>Ajoute un bloc personnalisé, appelé \"Bienvenue\",  à votre "
+"site. Avec son format de texte paramétré sur \"Code PHP\" (ou un "
+"autre format acceptant les insertions de PHP), ajoutez ce qui suit "
+"dans le corps du bloc&nbsp;:</p>\n"
+"<pre>\n"
+"print t('Bienvenue, cher visiteur ! Merci de votre passage.');\n"
+"</pre>"
+msgid ""
+"<p>To display the name of a registered user, use this instead:</p>\n"
+"<pre>\n"
+"global $user;\n"
+"if ($user->uid) {\n"
+"  print t('Welcome @name! Thank you for visiting.', array('@name' => "
+"format_username($user)));\n"
+"}\n"
+"else {\n"
+"  print t('Welcome visitor! Thank you for visiting.');\n"
+"}\n"
+"</pre>"
+msgstr ""
+"<p>Pour afficher le nom d'un utilisateur inscrit, utilisez ceci à la "
+"place&nbsp;:</p>\r\n"
+"<pre>\r\n"
+"global $user;\r\n"
+"if ($user->uid) {\r\n"
+"  print t('Bienvenue @name ! Merci de votre visite.', array('@name' => "
+"format_username($user)));\r\n"
+"}\r\n"
+"else {\r\n"
+"  print t('Bienvenue, cher visiteur ! Merci de votre visite.');\r\n"
+"}\r\n"
+"</pre>"
+msgid ""
+"The PHP module has been disabled. Any existing content that was using "
+"the PHP filter will now be visible in plain text. This might pose a "
+"security risk by exposing sensitive information, if any, used in the "
+"PHP code."
+msgstr ""
+"Le module PHP a été désactivé. Tous les fragments de code PHP "
+"présents dans le contenu seront dorénavant visibles en tant que "
+"texte brut. Cela peut poser des problèmes de sécurité en dévoilant "
+"des informations sensibles, s'il y en a, présentes dans le code PHP."
+msgid ""
+"The Poll module can be used to create simple surveys or questionnaires "
+"that display cumulative results. A poll is a good way to receive "
+"feedback from site users and community members. For more information, "
+"see the online handbook entry for the <a href=\"@poll\">Poll "
+"module</a>."
+msgstr ""
+"Le module Poll peut être utilisé pour créer des sondages ou des "
+"questionnaires simples qui affichent les résultats cumulés des "
+"votes. Un sondage (poll) est un bon moyen de recevoir un retour des "
+"utilisateurs du site et des membres de la communauté. Pour plus "
+"d'information, voir le manuel en ligne à la section <a "
+"href=\"@poll\">module Poll</a>."
+msgid "Creating a poll"
+msgstr "Création d'un sondage"
+msgid ""
+"Users can create a poll by clicking on Poll on the <a "
+"href=\"@add-content\">Add new content</a> page, and entering the "
+"question being posed, the answer choices, and beginning vote counts "
+"for each choice. The status (closed or active) and duration (length of "
+"time the poll remains active for new votes) can also be specified."
+msgstr ""
+"Les utilisateurs peuvent créer un sondage en cliquant sur Sondage "
+"dans la page <a href=\"@add-content\">Ajouter un nouveau contenu</a>, "
+"et en rédigeant la question à poser, les réponses possibles et en "
+"initialisant le compte des votes pour chaque réponse. Le statut "
+"(fermé ou actif) et la durée (période durant laquelle le sondage "
+"reste ouvert à de nouveaux votes) peuvent aussi être spécifiés."
+msgid "Viewing polls"
+msgstr "Consultation des sondages"
+msgid ""
+"You can visit the <a href=\"@poll\">Polls</a> page to view all current "
+"polls, or alternately enable the <em>Most recent poll</em> block on "
+"the <a href=\"@blocks\">Blocks administration page</a>. To vote in or "
+"view the results of a specific poll, you can click on the poll itself."
+msgstr ""
+"Vous pouvez visiter la page des <a href=\"@poll\">Sondages</a> pour "
+"voir tous les sondages en cours, ou, autrement, activer le bloc "
+"<em>Sondage le plus récent</em> sur la page <a "
+"href=\"@blocks\">Administration des blocs</a>. Pour participer à un "
+"sondage spécifique ou afficher ses résultats, vous pouvez cliquer "
+"sur le sondage lui-même."
+msgid "Vote on polls"
+msgstr "Participer aux sondages"
+msgid "Cancel and change own votes"
+msgstr "Annuler ou modifier ses propres votes"
+msgid "Your vote was cancelled."
+msgstr "Votre vote a été annulé."
+msgid ""
+"To enable browsing this field by value, enter a title for the "
+"resulting page. The word <code>%value</code> will be substituted with "
+"the corresponding value. An example page title is \"People whose "
+"favorite color is %value\" . This is only applicable for a public "
+"field."
+msgstr ""
+"Pour activer le parcours de ce champ par valeur, entrez un titre pour "
+"la page des résultats. Le mot <code>%value</code> sera remplacé par "
+"la valeur correspondante. Un exemple de titre de page est \"Personnes "
+"dont la couleur favorite est le %value\". Ce n'est utilisable que pour "
+"un champ public."
+msgid ""
+"To enable browsing this field by value, enter a title for the "
+"resulting page. An example page title is \"People who are employed\" . "
+"This is only applicable for a public field."
+msgstr ""
+"Pour activer le parcours de ce champ par valeur, entrez un titre pour "
+"la page des résultats. Un exemple de titre de page est \"Personnes "
+"ayant un emploi\". Ce n'est utilisable que pour un champ public."
+msgid ""
+"The Profile module allows site administrators to define custom fields "
+"(such as country, full name, or age) for user profiles, which are then "
+"displayed in the <a href=\"@user\">My Account</a> section. This "
+"permits users of a site to share more information about themselves, "
+"and can help community-based sites organize users around specific "
+"information. For more information, see the online handbook entry for "
+"<a href=\"@profile\">Profile module</a>."
+msgstr ""
+"Le module Profil permet aux administrateurs du site de définir des "
+"champs personnalisés (tels que pays, nom, prénom, ou âge) pour les "
+"profils utilisateur, qui sont ensuite affichés dans la section <a "
+"href=\"@user\">Mon compte</a>. Cela permet aux utilisateurs d'un site "
+"de partager davantage d'informations à leur sujet, et peut aider les "
+"sites communautaires à organiser les utilisateurs autour d'une "
+"information spécifique. Pour plus d'information, consultez l'aide en "
+"ligne au sujet du <a href=\"@profile\">module Profil</a>."
+msgid "Adding fields to the default profile"
+msgstr "Ajouter des champs au profil par défault"
+msgid ""
+"To provide the ability for users to enter more information about "
+"themselves, the Profile module allows additional fields to be added to "
+"the default user profile. Examples of common additions would be "
+"<em>Location</em>, <em>Company</em>, <em>Age</em>, or <em>About "
+"me</em>."
+msgstr ""
+"Pour offrir la possibilité aux utilisateurs de saisir plus "
+"d'informations à leur sujet, le module Profil permet l'ajout de "
+"champs supplémentaires au profil utilisateur par défaut. Des "
+"exemples d'ajouts classiques seraient <em>Adresse</em>, "
+"<em>Entreprise</em>, <em>Âge</em> ou <em>Â mon sujet</em>."
+msgid "User information pages"
+msgstr "Pages d'information utilisateur"
+msgid ""
+"The Profile module enables links to see further information about site "
+"users. You can view both a main <a href=\"@profile\">User list "
+"page</a>, and more specified pages by clicking on linked fields in any "
+"profile. For example, the <a href=\"@profile-country\">People who live "
+"in Canada</a> listing on Drupal.org displays all users who have "
+"entered <em>Canada</em> in the <em>Country</em> field on their user "
+"profile."
+msgstr ""
+"Le module Profil permet l'activation de liens pour voir plus "
+"d'information au sujet des utilisateurs du site. Vous pouvez voir à "
+"la fois <a href=\"@profile\">une page de liste des utilisateurs</a>, "
+"et des pages plus spécifiques en cliquant sur les champs proposants "
+"un lien à partir de n'importe quel profil. Par exemple, la liste <a "
+"href=\"@profile-country\">les gens qui vivent au Canada</a> sur "
+"Drupal.org affiche tous les utilisateurs qui ont saisis "
+"<em>Canada</em> dans le champs <em>Pays</em> de leur profil "
+"utilisateur."
+msgid "Author information block"
+msgstr "Bloc d'information sur l'auteur"
+msgid ""
+"The <em>Author information block</em> is a default block created by "
+"the Profile module that can be enabled on the <a "
+"href=\"@blocks\">Blocks administration page</a>. It shows visitors of "
+"your website information about the author of the page they are "
+"reading."
+msgstr ""
+"Le <em>bloc d'informations sur l'auteur</em> est un bloc créé par "
+"defaut par le module Profil qui peut être activé sur la <a "
+"href=\"@blocks\">page d'administration des blocs</a>. Il montre aux "
+"visiteurs de votre site des informations sur l'auteur de la page "
+"qu'ils lisent."
+msgid ""
+"This page displays a list of the existing custom profile fields to be "
+"displayed on a user's <em>My account</em> page. To provide structure, "
+"similar or related fields may be placed inside a category. To add a "
+"new category (or edit an existing one), edit a profile field and "
+"provide a new category name."
+msgstr ""
+"Cette page liste les champs personnalisés existants pouvant être "
+"affiché sur la page <em>Mon compte</em> d'un utilisateur. Pour "
+"fournir une structure, les champs similaires ou connexes peuvent être "
+"placés dans une catégorie. Pour ajouter une nouvelle catégorie (ou "
+"modifier une existante), modifiez un champ de profil et fournissez un "
+"nouveau nom de catégorie."
+msgid ""
+"Enriches your content with metadata to let other applications (e.g. "
+"search engines, aggregators) better understand its relationships and "
+"attributes."
+msgstr ""
+"Enrichit votre contenu avec des métadonnées pour permettre à "
+"d'autres applications (par ex. des moteurs de recherche ou des "
+"agrégateurs) de mieux comprendre ses relations et attributs."
+msgid "The active search modules have been changed."
+msgstr "Les modules de recherche actifs ont été modifiés"
+msgid ""
+"You must include at least one positive keyword with 1 character or "
+"more."
+msgid_plural ""
+"You must include at least one positive keyword with @count characters "
+"or more."
+msgstr[0] ""
+"Vous devez inclure au moins un mot-clé positif de @count caractère "
+"ou plus."
+msgstr[1] ""
+"Vous devez inclure au moins un mot-clé positif de @count caractères "
+"ou plus."
+msgid "Searched %type for %keys."
+msgstr "Recherché %type pour %keys."
+msgid ""
+"The Search module provides the ability to index and search for content "
+"by exact keywords, and for users by username or e-mail. For more "
+"information, see the online handbook entry for <a "
+"href=\"@search-module\">Search module</a>."
+msgstr ""
+"Le module Recherche offre la possibilité d'indexer et de rechercher "
+"des contenus par mots-clés précis, et des utilisateurs par nom "
+"d'utilisateur ou courriel. Pour plus d'informations, consultez l'aide "
+"en ligne pour le <a href=\"@search-module\">module Recherche</a>."
+msgid "Searching content and users"
+msgstr "Recherche de contenu et d'utilisateurs"
+msgid ""
+"Users with <em>Use search</em> permission can use the search block and "
+"<a href=\"@search\">Search page</a>. Users with the <em>View published "
+"content</em> permission can search for content containing exact "
+"keywords. Users with the <em>View user profiles</em> permission can "
+"search for users containing the keyword anywhere in the user name, and "
+"users with the <em>Administer users</em> permission can search for "
+"users by email address. Additionally, users with <em>Use advanced "
+"search</em> permission can find content using more complex search "
+"methods and filtering by choosing the <em>Advanced search</em> option "
+"on the <a href=\"@search\">Search page</a>."
+msgstr ""
+"Les utilisateurs avec la permission <em>Utiliser la recherche</em> "
+"peuvent le bloc de recherche et <a href=\"@search\">la page de "
+"recherche</a>. Les utilisateurs avec la permission <em>Voir le contenu "
+"publié</em> peuvent rechercher du contenu contenant exactement leurs "
+"mots-clé. Les utilisateurs avec la permission <em>Voir les profils "
+"utilisateur</em> peuvent rechercher des utilisateurs dont le nom "
+"contient le mot-clé, enfin ceux avec la permission <em>Administrer "
+"les utilisateurs</em> peuvent rechercher des utilisateurs par leur "
+"courriel. En outre, les utilisateurs avec la permission <em>Utiliser "
+"la recherche avancée</em> peuvent trouver du contenu en utilisant des "
+"méthodes de recherche et des filtres plus complexe en choisissant "
+"l'option <em>Recherche avancée</em> sur la <a href=\"@search\">page "
+"de recherche</a>."
+msgid "Indexing content with cron"
+msgstr "Indexer le contenu avec la tâche plannifiée"
+msgid "Configuring search settings"
+msgstr "Configuration des paramètres de recherche"
+msgid ""
+"Indexing behavior can be adjusted using the <a "
+"href=\"@searchsettings\">Search settings page</a>. Users with "
+"<em>Administer search</em> permission can control settings such as the "
+"<em>Number of items to index per cron run</em>, <em>Indexing "
+"settings</em> (word length), <em>Active search modules</em>, and "
+"<em>Content ranking</em>, which lets you adjust the priority in which "
+"indexed content is returned in results."
+msgstr ""
+"Le comportement d'indexation peut être modifié en utilisant la <a "
+"href=\"@searchsettings\">page de configuration de la recherche</a>. Un "
+"utilisateur avec la permission </em>Administrer la recherche</em> peut "
+"contrôler les paramètres tel que le <em>Nombre d'éléments à "
+"indexer à chaque excecution de la tâche plannifiée</em>, <em>la "
+"configuration d'indexation</em> (longueur des mots), <em>les modules "
+"de recherche actifs</em>, et <em>le classement du contenu</em>, qui "
+"vous permet d'ajuster la priorité avec laquelle un conteu indexé est "
+"renvoyé dans les résultats."
+msgid ""
+"The Search module includes a default <em>Search form</em> block, which "
+"can be enabled and configured on the <a href=\"@blocks\">Blocks "
+"administration page</a>. The block is available to users with the "
+"<em>Search content</em> permission."
+msgstr ""
+"Le module de recherche inclut un <em>un formulaire de recherche</em> "
+"dans un bloc, qui peuvent être activé et configuré sur la <a "
+"href=\"@blocks\">page d'administration des blocs</a>. Le bloc est "
+"disponible pour les utilisateurs ayant la permission <em>Rechercher "
+"dans le contenu</em>."
+msgid "Extending Search module"
+msgstr "Module de recherche étendue"
+msgid ""
+"By default, the Search module only supports exact keyword matching in "
+"content searches. You can modify this behavior by installing a "
+"language-specific stemming module for your language (such as <a "
+"href=\"http://drupal.org/project/porterstemmer\">Porter Stemmer</a> "
+"for American English), which allows words such as walk, walking, and "
+"walked to be matched in the Search module. Another approach is to use "
+"a third-party search technology with stemming or partial word matching "
+"features built in, such as <a "
+"href=\"http://drupal.org/project/apachesolr\">Apache Solr</a> or <a "
+"href=\"http://drupal.org/project/sphinx\">Sphinx</a>. These and other "
+"<a href=\"@contrib-search\">search-related contributed modules</a> can "
+"be downloaded by visiting Drupal.org."
+msgstr ""
+"Par défaut, le module Recherche ne support que la recherche par mots "
+"clés exacts. Vous pouvez modifier ce comportement par l'installation "
+"d'un module STEMMING spécifique à votre langue (comme <a "
+"href=\"http://drupal.org/project/porterstemmer\">Porter Stemmer</a> "
+"pour l'anglais américain), qui permet à des mots tels que marche, "
+"marcher, marchait d'être trouvé par le module Recherche. Une autre "
+"approche consiste à utiliser des technologies de recherche tierces "
+"qui proposes des fonctionnalités de recherche STEMMING ou de mots "
+"partiels, comme <a "
+"href=\"http://drupal.org/project/apachesolr\">Apache Solr</a> ou <a "
+"href=\"http://drupal.org/project/sphinx\">Sphinx</a>. Ces modules ou "
+"d'autres peuvent être téléchargé sur Drupal.org parmis les <a "
+"href=\"@contrib-search\">module contribué liés à la recherche</a>."
+msgid ""
+"<ul>\n"
+"<li>Check if your spelling is correct.</li>\n"
+"<li>Remove quotes around phrases to search for each word individually. "
+"<em>bike shed</em> will often show more results than <em>&quot;bike "
+"shed&quot;</em>.</li>\n"
+"<li>Consider loosening your query with <em>OR</em>. <em>bike OR "
+"shed</em> will often show more results than <em>bike shed</em>.</li>\n"
+"</ul>"
+msgstr ""
+"<ul>\r\n"
+"<li>Vérifiez que l'orthographe est correcte.</li>\r\n"
+"<li>Supprimez les guillemets autour des expressions pour rechercher "
+"chaque mot séparément. <em>garage à vélo</em> retournera souvent "
+"plus de résultat que <em>&quot;garage à vélo&quot;</em>.</li>\r\n"
+"<li>Envisagez d'élargir votre recherche avec <em>OR</em>. <em>garage "
+"OR vélo</em> retournera souvent plus de résultat que <em>garage à "
+"vélo</em>.</li>\r\n"
+"</ul>"
+msgid "Administer search"
+msgstr "Administrer la recherche"
+msgid "Use search"
+msgstr "Utiliser la recherche"
+msgid "Use advanced search"
+msgstr "Utiliser la recherche avancée"
+msgid "Configure relevance settings for search and other indexing options."
+msgstr ""
+"Configurer les paramètres de pertinence pour la recherche et d'autres "
+"options d'indexation."
+msgid "Choose a set of shortcuts to use"
+msgstr "Choisissez un ensemble de raccourcis à utiliser"
+msgid "Choose a set of shortcuts for this user"
+msgstr "Choisissez un ensemble de raccourcis pour cet utilisateur"
+msgid ""
+"You are now using the new %set_name shortcut set. You can edit it from "
+"this page or <a href=\"@switch-url\">switch back to a different "
+"one.</a>"
+msgstr ""
+"Vous utilisez maintenant le nouvel ensemble de raccourcis %set_name. "
+"Vous pouvez le modifier depuis cette page ou <a "
+"href=\"@switch-url\">changer pour un ensemble différent</a>."
+msgid ""
+"%user is now using a new shortcut set called %set_name. You can edit "
+"it from this page."
+msgstr ""
+"%user utilise maintenant le nouvel ensemble de raccourci %set_name. "
+"Vous pouvez le modifier depuis cette page."
+msgid "You are now using the %set_name shortcut set."
+msgstr "Vous utilisez désormais l'ensemble de raccourcis %set_name."
+msgid "%user is now using the %set_name shortcut set."
+msgstr "%user utilise désormais l'ensemble de raccourcis %set_name."
+msgid "Change set"
+msgstr "Changer d'ensemble"
+msgid "The shortcut set has been updated."
+msgstr "L'ensemble de raccourcis a été mis à jour."
+msgid "Add new shortcut"
+msgstr "Ajouter un nouveau raccourci"
+msgid "Editing @shortcut"
+msgstr "Modification de @shortcut"
+msgid "The name of the shortcut."
+msgstr "Le nom du raccourci"
+msgid "The path to the shortcut."
+msgstr "Le chemin du raccourci"
+msgid "The link must correspond to a valid path on the site."
+msgstr "Le lien doit correspondre à un chemin valide du site."
+msgid "The shortcut %link has been updated."
+msgstr "Le raccourci %link a été mis à jour."
+msgid "Added a shortcut for %title."
+msgstr "Rajout d'un raccourci pour %title."
+msgid "Are you sure you want to delete the shortcut %title?"
+msgstr "Êtes-vous sûr de vouloir supprimer le raccourci %title ?"
+msgid "The shortcut %title has been deleted."
+msgstr "Le raccourci %title a été supprimé."
+msgid "Unable to add a shortcut for %title."
+msgstr "Impossible d'ajouter un raccourci pour %title."
+msgid "Adding and removing shortcuts"
+msgstr "Ajout et suppression de raccourcis"
+msgid "Displaying shortcuts"
+msgstr "Affichage des raccourcis"
+msgid ""
+"You can display your shortcuts by enabling the Shortcuts block on the "
+"<a href=\"@blocks\">Blocks administration page</a>. Certain "
+"administrative modules also display your shortcuts; for example, the "
+"core <a href=\"@toolbar-help\">Toolbar module</a> displays them near "
+"the top of the page, along with an <em>Edit shortcuts</em> link."
+msgstr ""
+"Vous pouvez afficher vos raccourcis en activant le bloc Raccourcis sur "
+"la <a href=\"@blocks\">page d'administration des blocs</a>. Certains "
+"modules d'administration affichent également vos raccourcis; par "
+"exemple, le <a href=\"@toolbar-help\">module <em>Toolbar</em></a> les "
+"affiche vers le haut de la page, à côté d'un lien <em>Modifier les "
+"raccourcis</em>"
+msgid "Administer shortcuts"
+msgstr "Administrer les raccourcis"
+msgid "@shortcut_set shortcuts"
+msgstr "Raccourcis @shortcut_set"
+msgid "Add to %shortcut_set shortcuts"
+msgstr "Ajouter aux raccourcis %shortcut_set"
+msgid "Add to shortcuts"
+msgstr "Ajouter aux raccourcis"
+msgid "Remove from %shortcut_set shortcuts"
+msgstr "Supprimer des raccourcis %shortcut_set"
+msgid "Remove from shortcuts"
+msgstr "Supprimer des raccourcis"
+msgid "Edit shortcuts"
+msgstr "Modifier les raccourcis"
+msgid "Add shortcut"
+msgstr "Ajouter un raccourci"
+msgid "Edit shortcut"
+msgstr "Modifier un raccourci"
+msgid "Delete shortcut"
+msgstr "Supprimer un raccourci"
+msgid "Allows users to manage customizable lists of shortcut links."
+msgstr ""
+"Permet aux utilisateur de gérer des listes de liens de raccourci "
+"configurables"
+msgid "Value @value is TRUE."
+msgstr "La valeur @value est TRUE."
+msgid "Value @value is FALSE."
+msgstr "La valeur @value est FALSE."
+msgid "Value @value is NULL."
+msgstr "La valeur @value est NULL."
+msgid "Value @value is not NULL."
+msgstr "La valeur @value n'est pas NULL."
+msgid "Value @first is equal to value @second."
+msgstr "La valeur @first est égale à la valeur @second."
+msgid "Value @first is not equal to value @second."
+msgstr "La valeur @first n'est pas égale à la valeur @second."
+msgid "Value @first is identical to value @second."
+msgstr "La valeur @first est identique à la valeur @second."
+msgid "Value @first is not identical to value @second."
+msgstr "La valeur @first n'est pas identique à la valeur @second."
+msgid "The test did not complete due to a fatal error."
+msgstr "Le test ne s'est pas terminé en raison d'une erreur fatale."
+msgid "Link with label %label found."
+msgstr "Un lien avec le label %label a été trouvé."
+msgid "Link with label %label not found."
+msgstr "Aucun lien avec le label %label n'a été trouvé."
+msgid "Link containing href %href found."
+msgstr "Un lien contenant href %href a été trouvé."
+msgid "No link containing href %href found."
+msgstr "aucun lien contenant href %href n'a été trouvé."
+msgid "Clicked link %label (@url_target) from @url_before"
+msgstr "Lien %label (@url_target) cliqué depuis @url_before"
+msgid "Option @option for field @id is selected."
+msgstr "L'option @option du champs @id est sélectionnée."
+msgid "Option @option for field @id is not selected."
+msgstr "L'option @option du champs @id n'est pas sélectionnée."
+msgid ""
+"By default SimpleTest will clear the results after they have been "
+"viewed on the results page, but in some cases it may be useful to "
+"leave the results in the database. The results can then be viewed at "
+"<em>admin/config/development/testing/[test_id]</em>. The test ID can "
+"be found in the database, simpletest table, or kept track of when "
+"viewing the results the first time. Additionally, some modules may "
+"provide more analysis or features that require this setting to be "
+"disabled."
+msgstr ""
+"Par défaut Simpletest nettoiera les résultats après qu'ils aient "
+"été vus sur la page de résultats, mais dans certains cas cela peut "
+"être utile de laisser les résultats en base. Les résultats peuvent "
+"être vus sur <em>admin/config/development/testing/[test_id]</em>. "
+"L'identifiant (ID) du test peut être trouvé dans la base de "
+"données, dans la table simpletest, ou gardé en suivi lorsque les "
+"résultats sont vus la première fois. De plus, certains modules "
+"peuvent fournir plus d'analyses ou fonctionnalités qui recquièrent "
+"ce paramètre pour être désactivés."
+msgid "GSS negotiate"
+msgstr "negociation GSS"
+msgid "NTLM"
+msgstr "NTLM"
+msgid "Any safe"
+msgstr "En toute sécurité"
+msgid ""
+"The Testing module provides a framework for running automated unit "
+"tests. It can be used to verify a working state of Drupal before and "
+"after any code changes, or as a means for developers to write and "
+"execute tests for their modules. For more information, see the online "
+"handbook entry for <a href=\"@simpletest\">Testing module</a>."
+msgstr ""
+"Le module Testing fournit un framework pour exécuter des tests "
+"unitaires automatisés. Il peut être utilisé pour vérifier un état "
+"de fonctionnement de Drupal avant et après les modifications du code "
+"ou bien comme un moyen pour les développeurs d'écrire et d'exécuter "
+"des tests pour leurs modules. Pour plus d'informations, voir la "
+"section du <a href=\"@simpletest\">module Testing</a> du manuel en "
+"ligne."
+msgid "Running tests"
+msgstr "Lancement des tests"
+msgid ""
+"Visit the <a href=\"@admin-simpletest\">Testing page</a> to display a "
+"list of available tests. For comprehensive testing, select "
+"<em>all</em> tests, or individually select tests for more targeted "
+"testing. Note that it might take several minutes for all tests to "
+"complete. For more information on creating and modifying your own "
+"tests, see the <a href=\"@simpletest-api\">Testing API "
+"Documentation</a> in the Drupal handbook."
+msgstr ""
+"Visitez la <a href=\"@admin-simpletest\">pages Tests</a> pour afficher "
+"une liste de tests disponibles. Pour exécuter l'ensemble des tests, "
+"sélectionnez <em>tous</em> les tests ou bien sélectionnez des tests "
+"individuellement pour faire des tests plus ciblés. Attention, cela "
+"peut prendre plusieurs minutes avant que tous les tests ne soient "
+"terminés, voir la section <a href=\"@simpletest-api\">Documentation "
+"de l'API des tests</a> du manuel en ligne."
+msgid ""
+"After the tests run, a message will be displayed next to each test "
+"group indicating whether tests within it passed, failed, or had "
+"exceptions. A pass means that the test returned the expected results, "
+"while fail means that it did not. An exception normally indicates an "
+"error outside of the test, such as a PHP warning or notice. If there "
+"were failures or exceptions, the results will be expanded to show "
+"details, and the tests that had failures or exceptions will be "
+"indicated in red or pink rows. You can then use these results to "
+"refine your code and tests, until all tests pass."
+msgstr ""
+"Après l'exécution des tests, un message sera affiché à côté de "
+"chaque groupe de test indiquant si ces tests ont réussi, ont échoué "
+"ou ont généré des exceptions. Une réussite signifie que le test a "
+"renvoyé les résultats attendus, tandis qu'un échec signifie le "
+"contraire. Une exception indique normalement une erreur en dehors du "
+"test, tel qu'un warning ou notice PHP. S'il y a eu des échecs ou des "
+"exceptions, les résultats seront développés pour montrer les "
+"détails et les tests qui ont obtenu des échecs ou des exceptions "
+"seront indiqués dans des lignes rouge ou rose. Vous pouvez utilisez "
+"ces résultats pour revoir votre code et tests jusqu'à ce qu'ils "
+"réussissent."
+msgid "Administer tests"
+msgstr "Administrer les tests"
+msgid "The test run finished in @elapsed."
+msgstr "L'exécution du test s'est terminée en @elapsed"
+msgid ""
+"Use the <em>Clean environment</em> button to clean-up temporary files "
+"and tables."
+msgstr ""
+"Utiliser le bouton <em>Nettoyer l'environnement</em> pour supprimer "
+"les fichiers et tables temporaires ."
+msgid ""
+"The testing framework requires the PHP <a "
+"href=\"@open_basedir-url\">open_basedir</a> restriction to be "
+"disabled. Check your webserver configuration or contact your web host."
+msgstr ""
+"Le framework Testing nécessite que la restriction <a "
+"href=\"@open_basedir-url\">open_basedir</a> de PHP soit désactivée. "
+"Vérifiez la configuration de votre serveur web ou contactez votre "
+"hébergeur."
+msgid ""
+"The testing framework could not be installed because the PHP <a "
+"href=\"@curl_url\">cURL</a> library is not available."
+msgstr ""
+"Le framework de test ne peut pas être installé car la bibliothèque "
+"PHP <a href=\"@curl_url\">cURL</a> n'est pas disponible."
+msgid ""
+"The testing framework could not be installed because the PHP <a "
+"href=\"@hash_url\">hash</a> extension is disabled."
+msgstr ""
+"Le framework de test ne peut pas installé car l'extension PHP <a "
+"href=\"@hash_url\">hash</a> est désactivée."
+msgid "PHP open_basedir restriction"
+msgstr "Restriction open_basedir de PHP"
+msgid "unblock IP address"
+msgstr "Débloquer l'adresse IP"
+msgid "block IP address"
+msgstr "Bloquer l'adresse IP"
+msgid ""
+"The Statistics module shows you how often a given page is viewed, who "
+"viewed it, the previous page the user visited (referrer URL), and when "
+"it was viewed. These statistics are useful in determining how users "
+"are visiting and navigating your site. For more information, see the "
+"online handbook entry for the <a href=\"@statistics\">Statistics "
+"module</a>."
+msgstr ""
+"Le module Statistics vous montre à quelle fréquence une page est "
+"vue, qui l'a vue, la page précédente que l'utilisateur a visité "
+"(URL) et la date à laquelle elle a été vue. Ces statistiques sont "
+"utiles pour déterminer comment les utilisateurs visitent et naviguent "
+"sur votre site. Pour plus d'informations, voir la section du <a "
+"href=\"@statistics\">module Statistics</a> du manuel en ligne."
+msgid "Managing logs"
+msgstr "Gestion des logs"
+msgid ""
+"To enable collection of statistics, the <em>Enable access log</em> "
+"checkbox on the <a href=\"@statistics-settings\">Statistics settings "
+"page</a> must be checked. The <em>Discard access logs older than</em> "
+"setting on the settings page specifies the length of time entries are "
+"kept in the log before they are deleted. This setting requires a "
+"correctly configured <a href=\"@cron\">cron maintenance task</a> to "
+"run."
+msgstr ""
+"Pour activer la collecte de statistiques, la case à cocher "
+"<em>Activer la journalisation des accès</em> sur la <a "
+"href=\"@statistics-settings\">page des paramètres Statistiques</a> "
+"doit être cochée. Le paramètre <em>Supprimer les journaux d'accès "
+"plus anciens que</em> définit la durée pendant laquelle les "
+"informations restent dans le journal avant d'être supprimées. Ce "
+"paramètre nécessite qu'une <a href=\"@cron\">tâche planifiée "
+"(cron) de maintenance</a> soit correctement configurée afin de "
+"fonctionner."
+msgid "Viewing site usage"
+msgstr "Voir l'utilisation du site"
+msgid ""
+"The Statistics module can help you break down details about your users "
+"and how they are using the site. The module offers four reports:"
+msgstr ""
+"Le module Statistics peut vous aider à analyser les détails au sujet "
+"de vos utilisateurs et la façon dont ils utilisent le site. Le module "
+"propose 4 rapports :"
+msgid ""
+"<a href=\"@recent-hits\">Recent hits</a> displays information about "
+"the latest activity on your site, including the URL and title of the "
+"page that was accessed, the user name (if available) and the IP "
+"address of the viewer."
+msgstr ""
+"La page<a href=\"@recent-hits\">Accès récents</a> affiche les "
+"informations concernant les dernières activités du site, incluant "
+"l'URL et le titre de la page qui a été consultée, le nom "
+"d'utilisateur (s'il existe) et l'adresse IP du visiteur."
+msgid ""
+"<a href=\"@top-referrers\">Top referrers</a> displays where visitors "
+"came from (referrer URL)."
+msgstr ""
+"Le <a href=\"@top-referrers\">Top des référents</a> affiche d'où "
+"les visiteurs viennent (URL)"
+msgid ""
+"<a href=\"@top-pages\">Top pages</a> displays a list of pages ordered "
+"by how often they were viewed."
+msgstr ""
+"Le <a href=\"@top-pages\">Top des pages</a> affiche une liste de pages "
+"triées selon la fréquence à laquelle elles ont été vues."
+msgid ""
+"<a href=\"@top-visitors\">Top visitors</a> shows you the most active "
+"visitors for your site and allows you to ban abusive visitors."
+msgstr ""
+"Le <a href=\"@top-visitors\">Top des visiteurs</a> affiche les "
+"visiteurs les plus actifs et vous permet de bannir les utilisateurs "
+"abusifs."
+msgid "Displaying popular content"
+msgstr "Afficher le contenu populaire"
+msgid ""
+"The module includes a <em>Popular content</em> block that displays the "
+"most viewed pages today and for all time, and the last content viewed. "
+"To use the block, enable <em>Count content views</em> on the <a "
+"href=\"@statistics-settings\">statistics settings page</a>, and then "
+"you can enable and configure the block on the <a "
+"href=\"@blocks\">blocks administration page</a>."
+msgstr ""
+"Le module inclut un bloc <em>Contenu populaire</em> qui affiche les "
+"pages les plus vues et ceux vus en dernier. Pour utiliser ce bloc, "
+"activer <em>Compter le nombre d'affichage des contenus</em> sur la <a "
+"href=\"@statistics-settings\">page des paramètres statistiques</a> et "
+"ensuite vous pouvez activer et configurer le bloc à partir de la <a "
+"href=\"@blocks\">page d'administration des blocs</a>."
+msgid "Page view counter"
+msgstr "Compteur de pages vues"
+msgid ""
+"The Statistics module includes a counter for each page that increases "
+"whenever the page is viewed. To use the counter, enable <em>Count "
+"content views</em> on the <a href=\"@statistics-settings\">statistics "
+"settings page</a>, and set the necessary <a "
+"href=\"@permissions\">permissions</a> (<em>View content hits</em>) so "
+"that the counter is visible to the users."
+msgstr ""
+"Le module Statistics inclut un compteur pour chaque page qui "
+"s'incrémente à chaque fois que la page est vue. Pour utiliser le "
+"compteur, activer <em>Compter le nombre d'affichage des contenus</em> "
+"sur la <a href=\"@statistics-settings\">page des paramètres "
+"statistiques</a> et définissez les <a "
+"href=\"@permissions\">droits</a> (<em>Voir les accès au contenu</em>) "
+"afin que les utilisateurs puissent voir le compteur."
+msgid "Administer statistics"
+msgstr "Administrer les statistiques"
+msgid "View content access statistics"
+msgstr "Voir les statistiques d'accès au contenu"
+msgid "View content hits"
+msgstr "Voir les accès au contenu"
+msgid "Control details about what and how your site logs access statistics."
+msgstr ""
+"Contrôle des détails sur quoi et comment votre site enregistre les "
+"statistiques d'accès."
+msgid ""
+"The Syslog module logs events by sending messages to the logging "
+"facility of your web server's operating system. Syslog is an operating "
+"system administrative logging tool that provides valuable information "
+"for use in system management and security auditing. Most suited to "
+"medium and large sites, Syslog provides filtering tools that allow "
+"messages to be routed by type and severity. For more information, see "
+"the online handbook entry for <a href='@syslog'>Syslog module</a> and "
+"PHP's <a href='@php_openlog'>openlog</a> and <a "
+"href='@php_syslog'>syslog</a> functions."
+msgstr ""
+"Le module Syslog journalise les évènements en envoyant des messages "
+"à la fonction de journalisation du système d'exploitation de votre "
+"serveur Web. Syslog est un outil d'administration de la journalisation "
+"du système d'exploitation qui fourni des informations intéressante "
+"à utiliser dans le cadre de la gestion système ou des audits de "
+"sécurité. Très utilisé dans les sites de moyenne et grande taille, "
+"Syslog fourni des outils de filtrage qui permettent aux messages "
+"d'être routés par type et par gravité. Pour plus d'information, "
+"voir les sections <a href='@syslog'>module Syslog</a> du manuel en "
+"ligne et les sections <a href='@php_openlog'>openlog</a> et <a "
+"href='@php_syslog'>syslog</a> de PHP."
+msgid "Logging for UNIX, Linux, and Mac OS X"
+msgstr "Jounalisation pour UNIX, Linux et Mac OS X"
+msgid ""
+"On UNIX, Linux, and Mac OS X, the file <em>/etc/syslog.conf</em> "
+"defines the routing configuration. Messages can be flagged with the "
+"codes <code>LOG_LOCAL0</code> through <code>LOG_LOCAL7</code>. For "
+"information on Syslog facilities, severity levels, and how to set up "
+"<em>syslog.conf</em>, see the <em>syslog.conf</em> manual page on your "
+"command line."
+msgstr ""
+"Sous UNIX, Linux et Mac OS X, le fichier "
+"<em>/etc/syslog.conf</em>definit la configuration du routage. Les "
+"messages peuvent être marqués avec les codes de "
+"<code>LOG_LOCAL0</code> à <code>LOG_LOCAL7</code>. Pour plus "
+"d'informations sur les facilities de Syslog, les niveaux de sécurité "
+"et comment configurer <em>syslog.conf</em>, référez-vous à la page "
+"d'aide sur \"syslog.conf\" de votre ligne de commande."
+msgid "Logging for Microsoft Windows"
+msgstr "Journalisation pour Microsoft Windows"
+msgid ""
+"On Microsoft Windows, messages are always sent to the Event Log using "
+"the code <code>LOG_USER</code>."
+msgstr ""
+"Sous Microsoft Windows, les messages sont toujours envoyés au journal "
+"d'évènements en utilisant le code <code>LOG_USER</code>."
+msgid "Syslog facility"
+msgstr "Fonction Syslog (journal système)"
+msgid ""
+"Depending on the system configuration, Syslog and other logging tools "
+"use this code to identify or filter messages from within the entire "
+"system log."
+msgstr ""
+"En fonction de la configuration du système, Syslog et les outils de "
+"journalisation utilisent ce code pour identifier ou filtrer les "
+"messages du journal du système entier."
+msgid ""
+"The image %file could not be rotated because the imagerotate() "
+"function is not available in this PHP installation."
+msgstr ""
+"L'image %file n'a pas pu être tournée car la fonction imagerorate() "
+"n'est pas disponible danc cette installation de PHP."
+msgid ""
+"The image %file could not be desaturated because the imagefilter() "
+"function is not available in this PHP installation."
+msgstr ""
+"L'image %file n'a pas pu être désaturée car la fonction "
+"imagefilter() n'est pas disponible dans cette installation de php."
+msgid "Screenshot for !theme theme"
+msgstr "Capture d'écran du thème !theme"
+msgid "Settings for !theme theme"
+msgstr "Paramètres du thème !theme"
+msgid "Disable !theme theme"
+msgstr "Désactiver le thème !theme"
+msgid "Set !theme as default theme"
+msgstr "Choisir !theme comme thème par défaut"
+msgid "Enable !theme theme"
+msgstr "Activer le thème !theme"
+msgid "Enable and set default"
+msgstr "Activer et choisir par défaut"
+msgid "Enable !theme as default theme"
+msgstr "Activer !theme comme thème par défaut"
+msgid "default theme"
+msgstr "thème par défaut"
+msgid ""
+"Choose \"Default theme\" to always use the same theme as the rest of "
+"the site."
+msgstr ""
+"Choisissez \"Thème par défaut\" pour toujours utiliser le même "
+"thème sur l'ensemble du site."
+msgid "Use the administration theme when editing or creating content"
+msgstr ""
+"Utiliser le thème d'administration lors de la création ou de la "
+"modification de contenu"
+msgid "The %theme theme has been enabled."
+msgstr "Le thème %theme a été activé."
+msgid "The %theme theme was not found."
+msgstr "Le thème %theme n'a pas été trouvé."
+msgid "%theme is the default theme and cannot be disabled."
+msgstr "%theme est le thème par défaut et il ne peut pas être désactivé."
+msgid "The %theme theme has been disabled."
+msgstr "Le thème %theme a été désactivé."
+msgid ""
+"Please note that the administration theme is still set to the "
+"%admin_theme theme; consequently, the theme on this page remains "
+"unchanged. All non-administrative sections of the site, however, will "
+"show the selected %selected_theme theme by default."
+msgstr ""
+"Merci de prendre en compte que le thème d'administration est toujours "
+"le thème %admin_theme ; en conséquence, le thème de cette page "
+"reste inchangé. Toutefois, toutes les sections de ce site non "
+"relatives à l'administration utilisent le thème par défaut "
+"%selected_theme"
+msgid "%theme is now the default theme."
+msgstr "%theme est désormais le thème par défaut."
+msgid "User verification status in comments"
+msgstr "Vérification du statut de l'utilisateur dans les commentaires"
+msgid ""
+"These settings only exist for the themes based on the %engine theme "
+"engine."
+msgstr ""
+"Ces paramètres existent seulement pour les thèmes basés sur le "
+"moteur de thème %engine."
+msgid "The logo could not be uploaded."
+msgstr "Le logo n'a pas pu être téléchargé sur le serveur."
+msgid "The favicon could not be uploaded."
+msgstr "L'icône de favori n'a pas pu être téléchargé sur le serveur."
+msgid "The custom logo path is invalid."
+msgstr "Le chemin du logo personnalisé n'est pas valide."
+msgid "The custom favicon path is invalid."
+msgstr "Le chemin de l'icône de favori est invalide."
+msgid ""
+"@module (<span class=\"admin-missing\">incompatible with</span> "
+"version @version)"
+msgstr ""
+"@module (<span class=\"admin-missing\">est incompatible avec</span> la "
+"version @version)"
+msgid ""
+"This version is not compatible with Drupal !core_version and should be "
+"replaced."
+msgstr ""
+"Cette version n'est pas compatible avec Drupal !core_version et "
+"devrait être remplacée."
+msgid "Would you like to continue with the above?"
+msgstr "Souhaitez-vous continuer avec ce qui précède ?"
+msgid "Enter a valid IP address."
+msgstr "Entrer une adresse IP valide."
+msgid "This IP address is already blocked."
+msgstr "Cette adresse IP est déjà bloquée."
+msgid "You may not block your own IP address."
+msgstr "Vous ne pouvez pas bloquer votre propre adresse IP."
+msgid "The IP address %ip has been blocked."
+msgstr "L'adresse IP %ip a été bloquée."
+msgid "Are you sure you want to delete %ip?"
+msgstr "Êtes-vous sûr de vouloir supprimer %ip ?"
+msgid "The IP address %ip was deleted."
+msgstr "L'adresse IP %ip a été supprimée."
+msgid "How this is used depends on your site's theme."
+msgstr "La façon dont cela sera utilisé dépend du thème de votre site."
+msgid "Number of posts on front page"
+msgstr "Nombre de contributions sur la page d'accueil"
+msgid ""
+"The maximum number of posts displayed on overview pages such as the "
+"front page."
+msgstr ""
+"Le nombre maximal de contributions affichées sur les pages de vue "
+"d'ensemble comme la page d'accueil."
+msgid ""
+"This page is displayed when the requested document is denied to the "
+"current user. Leave blank to display a generic \"access denied\" page."
+msgstr ""
+"Cette page est affichée lorsque l'affichage du document demandé est "
+"refusé à l'utilisateur actuel. Laisser vide pour afficher une page "
+"\"Accès refusé\" générique."
+msgid ""
+"This page is displayed when no other content matches the requested "
+"document. Leave blank to display a generic \"page not found\" page."
+msgstr ""
+"Cette page est affichée lorsque aucun contenu ne correspond au "
+"document demandé. Laisser vide pour afficher une page \"Page non "
+"trouvée\" générique."
+msgid "Errors and warnings"
+msgstr "Erreurs et avertissements"
+msgid "Clear all caches"
+msgstr "Effacer tous les caches"
+msgid ""
+"<strong class=\"error\">Set up the <a href=\"!file-system\">public "
+"files directory</a> to make these optimizations available.</strong>"
+msgstr ""
+"<strong class=\"error\">Configurer le<a "
+"href=\"!file-system\">répertoire de fichiers publics</a> pour rendre "
+"cette optimisation disponible.</strong>"
+msgid "Bandwidth optimization"
+msgstr "Optimisation de la bande passante"
+msgid "Compress cached pages."
+msgstr "Compression des pages cachées."
+msgid "Public file system path"
+msgstr "Chemin du système public de fichier"
+msgid ""
+"A local file system path where public files will be stored. This "
+"directory must exist and be writable by Drupal. This directory must be "
+"relative to the Drupal installation directory and be accessible over "
+"the web."
+msgstr ""
+"Un chemin sur le système de fichier local où seront stockés les "
+"fichiers publics. Ce répertoire doit exister et être accessible en "
+"écriture par Drupal. Ce répertoire doit être situé dans le "
+"répertoire d'installation de Drupal et doit être accessible à "
+"partir d'internet."
+msgid "Private file system path"
+msgstr "Chemin du système privé de fichier"
+msgid ""
+"A local file system path where temporary files will be stored. This "
+"directory should not be accessible over the web."
+msgstr ""
+"Un chemin sur le système de fichier local où seront stockés les "
+"fichiers temporaires. Ce répertoire ne devrait pas être accessible "
+"à partir d'internet."
+msgid "Default download method"
+msgstr "Méthode de téléchargement par défaut"
+msgid ""
+"This setting is used as the preferred download method. The use of "
+"public files is more efficient, but does not provide any access "
+"control."
+msgstr ""
+"Ce paramètre définit la méthode de téléchargement préférée. "
+"L'utilisation de fichiers publics est plus efficace mais ne fournit "
+"aucun contrôle d'accès."
+msgid ""
+"No image toolkits were detected. Drupal includes support for <a "
+"href='!gd-link'>PHP's built-in image processing functions</a> but they "
+"were not detected on this system. You should consult your system "
+"administrator to have them enabled, or try using a third party "
+"toolkit."
+msgstr ""
+"Aucune boite à outils d'image n'a été détectée. Drupal intègre "
+"un support pour les <a href='!gd-link'>fonctions de traitement "
+"d'images internes à PHP</a>, toutefois celles-ci n'ont pas été "
+"détectées dans votre système. Vous pouvez consulter votre "
+"administrateur système pour qu'il les active, ou essayer d'utiliser "
+"une boite à outils externe."
+msgid "Description of your site, included in each feed."
+msgstr "Description de votre site, sera incluse dans chaque flux."
+msgid "Time zones"
+msgstr "Fuseaux horaires"
+msgid "Users may set their own time zone."
+msgstr "Les utilisateurs peuvent définir leur propre fuseau horaire."
+msgid "Remind users at login if their time zone is not set."
+msgstr ""
+"Rappeler les utilisateurs lors de la connexion si leur fuseau horaire "
+"n'est pas fixé."
+msgid "Only applied if users may set their own time zone."
+msgstr ""
+"Ne s'applique que si les utilisateurs peuvent fixer leur fuseau "
+"horaire."
+msgid "Time zone for new users"
+msgstr "Fuseau horaire pour les nouveaux utilisateurs"
+msgid "Default time zone."
+msgstr "Fuseau horaire par défaut."
+msgid "Empty time zone."
+msgstr "Fuseau horaire vide."
+msgid "Users may set their own time zone at registration."
+msgstr "Les utilisateurs peuvent choisir leur fuseau horaire à l'inscription."
+msgid "No date types available. <a href=\"@link\">Add date type</a>."
+msgstr ""
+"Aucun type de date disponible. <a href=\"@link\">Ajouter un type de "
+"date</a>."
+msgid "Add date type"
+msgstr "Ajouter un type de date"
+msgid ""
+"The date type must contain only alphanumeric characters and "
+"underscores."
+msgstr ""
+"Le type de date ne doit contenir que des caractères alphanumériques "
+"et des tirets bas."
+msgid "This date type already exists. Enter a unique type."
+msgstr "Ce type de date existe déjà, saisir un type unique."
+msgid "New date type added successfully."
+msgstr "Nouveau type de date ajouté avec succès."
+msgid "Put site into maintenance mode"
+msgstr "Mettre le site en mode maintenance"
+msgid "Maintenance mode message"
+msgstr "Message du mode maintenance"
+msgid "Message to show visitors when the site is in maintenance mode."
+msgstr "Message affiché aux visiteurs quand le site est en mode maintenance."
+msgid ""
+"Use URLs like <code>example.com/user</code> instead of "
+"<code>example.com/?q=user</code>."
+msgstr ""
+"Utiliser des URL de la forme <code>example.com/user</code> à la place "
+"de <code>example.com/?q=user</code>."
+msgid "Requires: !module-list"
+msgstr "Requiert : !module-list"
+msgid "Required by: !module-list"
+msgstr "Requis par : !module-list"
+msgid "Are you sure you want to remove the date type %type?"
+msgstr "Êtes-vous sûr de vouloir supprimer le type de date %type ?"
+msgid "Removed date type %type."
+msgstr "Supprimer le type de date %type."
+msgid ""
+"No custom date formats available. <a href=\"@link\">Add date "
+"format</a>."
+msgstr ""
+"Aucun format de date personnalisé disponible. <a "
+"href=\"@link\">Ajouter un format de date</a>."
+msgid "Displayed as"
+msgstr "Affiché comme"
+msgid "Displayed as %date"
+msgstr "Affiché comme %date"
+msgid ""
+"A user-defined date format. See the <a href=\"@url\">PHP manual</a> "
+"for available options."
+msgstr ""
+"Un format de date défini par l'utilisateur. Voir le <a "
+"href=\"@url\">manuel PHP</a> pour les options disponibles."
+msgid "Save format"
+msgstr "Enregistrer le format"
+msgid "This format already exists. Enter a unique format string."
+msgstr "Ce format existe déjà. Saisir un une chaine de format unique."
+msgid "Custom date format updated."
+msgstr "Le format de date personnalisé a été mis à jour."
+msgid "Custom date format added."
+msgstr "Le format de date personnalisé a été ajouté."
+msgid "Available actions:"
+msgstr "Actions disponibles :"
+msgid "Create an advanced action"
+msgstr "Créer une action avancée"
+msgid ""
+"A unique label for this advanced action. This label will be displayed "
+"in the interface of modules that integrate with actions, such as "
+"Trigger module."
+msgstr ""
+"Un label unique pour cette action avancée. Ce label sera affiché "
+"dans l'interface des modules qui intègrent des actions, tels que le "
+"module Trigger."
+msgid "Deleted %ip"
+msgstr "Supprimer %ip"
+msgid "Enabled theme"
+msgid_plural "Enabled themes"
+msgstr[0] "Thème actif"
+msgstr[1] "Thèmes actifs"
+msgid "Disabled theme"
+msgid_plural "Disabled themes"
+msgstr[0] "Thème inactif"
+msgstr[1] "Thèmes inactifs"
+msgid "You must enable the @required module to install @module."
+msgid_plural "You must enable the @required modules to install @module."
+msgstr[0] "Vous devez activer le module @required pour installer @module."
+msgstr[1] "Vous devez activer les modules @required pour installer @module."
+msgid "Tokens for site-wide settings and other global information."
+msgstr ""
+"Jetons pour la configuration générale du site et pour d'autres "
+"informations globales."
+msgid "Tokens related to times and dates."
+msgstr "Jetons (<em>tokens</em>) liés au temps et aux dates."
+msgid "Tokens related to uploaded files."
+msgstr "Jetons (<em>tokens</em>) liés aux fichiers transférés."
+msgid "URL (brief)"
+msgstr "URL (courte)"
+msgid "The URL of the site's front page without the protocol."
+msgstr "L'URL de la page d'accueil du site sans le protocole."
+msgid "Short format"
+msgstr "Format court"
+msgid "A date in 'short' format. (%date)"
+msgstr "Une date au format 'court'. (%date)"
+msgid "Medium format"
+msgstr "Format moyen"
+msgid "A date in 'medium' format. (%date)"
+msgstr "Une date au format 'moyen'. (%date)"
+msgid "Long format"
+msgstr "Format long"
+msgid "A date in 'long' format. (%date)"
+msgstr "Une date au format 'long'. (%date)"
+msgid "A date in a custom format. See !php-date for details."
+msgstr ""
+"Une date dans un format personnalisé. Voir !php-date pour plus de "
+"détails."
+msgid "the PHP documentation"
+msgstr "la documentation PHP"
+msgid "Time-since"
+msgstr "Temps écoulé depuis"
+msgid "Raw timestamp"
+msgstr "Horodatage brut"
+msgid "A date in UNIX timestamp format (%date)"
+msgstr "Une date au format timestamp UNIX (%date)"
+msgid ""
+"The System module is integral to the site, and provides basic but "
+"extensible functionality for use by other modules and themes. Some "
+"integral elements of Drupal are contained in and managed by the System "
+"module, including caching, enabling and disabling modules and themes, "
+"preparing and displaying the administrative page, and configuring "
+"fundamental site settings. A number of key system maintenance "
+"operations are also part of the System module. For more information, "
+"see the online handbook entry for <a href=\"@system\">System "
+"module</a>."
+msgstr ""
+"Le module System est constitutif du site, il fournit les "
+"fonctionnalités de base (mais extensibles) qui seront utilisées par "
+"les autres modules et par les thèmes. Certains des modules "
+"constitutifs de Drupal font partie du module System ou sont gérés "
+"par lui, cela comprend le système de cache, l'activation et la "
+"désactivation des modules et des thèmes, la préparation et "
+"l'affichage des pages d'administration, ainsi que la configuration des "
+"paramètres fondamentaux du site. Un certain nombre d'opérations "
+"clés du système de maintenance font aussi partie du module System. "
+"Pour plus d'information, voir la section <a href=\"@system\">module "
+"System</a> du manuel en ligne."
+msgid "Managing modules"
+msgstr "Gestion des modules"
+msgid ""
+"The System module allows users with the appropriate permissions to "
+"enable and disable modules on the <a href=\"@modules\">Modules "
+"administration page</a>. Drupal comes with a number of core modules, "
+"and each module provides a discrete set of features and may be enabled "
+"or disabled depending on the needs of the site. Many additional "
+"modules contributed by members of the Drupal community are available "
+"for download at the <a href=\"@drupal-modules\">Drupal.org module "
+"page</a>."
+msgstr ""
+"Le module System permet aux utilisateurs disposant des droits "
+"appropriés d'activer ou de désactiver des modules dans la <a "
+"href=\"@modules\">page d'administration Modules</a>. Drupal est fourni "
+"avec un certain nombre de modules composant le coeur (<em>core</em>) "
+"et chaque module fournit un ensemble distinct de fonctionnalités qui "
+"peut être activé ou désactivé suivant les besoins du site. "
+"Beaucoup de modules provenant de la contribution des membres de la "
+"communauté Drupal sont téléchargeables sur la <a "
+"href=\"@drupal-modules\">page module de Drupal.org</a>."
+msgid "Managing themes"
+msgstr "Gestion des thèmes"
+msgid ""
+"The System module allows users with the appropriate permissions to "
+"enable and disable themes on the <a href=\"@themes\">Appearance "
+"administration page</a>. Themes determine the design and presentation "
+"of your site. Drupal comes packaged with several core themes, and "
+"additional contributed themes are available at the <a "
+"href=\"@drupal-themes\">Drupal.org theme page</a>."
+msgstr ""
+"Le module System permet aux utilisateurs disposant des droits "
+"appropriés d'activer ou de désactiver les thèmes sur <a "
+"href=\"@themes\">la page d'administration Apparence</a>. Les thèmes "
+"déterminent l'apparence et la présentation de votre site. De "
+"nombreux thèmes sont fournis avec Drupal et des thèmes "
+"supplémentaires provenant de la communauté sont disponibles sur la "
+"<a href=\"@drupal-themes\">page theme de Drupal.org</a>."
+msgid "Managing caching"
+msgstr "Gérer la mise en cache"
+msgid ""
+"The System module allows users with the appropriate permissions to "
+"manage caching on the <a href='@cache-settings'>Performance settings "
+"page</a>. Drupal has a robust caching system that allows the efficient "
+"re-use of previously-constructed web pages and web page components. "
+"Pages requested by anonymous users are stored in a compressed format; "
+"depending on your site configuration and the amount of your web "
+"traffic tied to anonymous visitors, the caching system may "
+"significantly increase the speed of your site."
+msgstr ""
+"Le module System permet aux utilisateurs ayant les droits appropriés "
+"de gérer la mise en cache depuis la <a href='@cache-settings'>page "
+"des paramètres de Performance</a>. Drupal dispose d'un robuste "
+"système de cache qui permet la réutilisation efficace des pages ou "
+"des éléments de page précédemment construits. Les pages appelées "
+"par les utilisateurs anonymes sont stockées dans un format "
+"compressé&nbsp;; en fonction de la configuration de votre site et du "
+"volume du trafic réalisé par les utilisateurs anonymes, le système "
+"de cache peut améliorer de façon significative la rapidité de votre "
+"site."
+msgid "Performing system maintenance"
+msgstr "Procédure de maintenance du système"
+msgid "Configuring basic site settings"
+msgstr "Configuration des paramètres de base du site"
+msgid ""
+"The System module also handles basic configuration options for your "
+"site, including <a href=\"@date-time-settings\">Date and time "
+"settings</a>, <a href=\"@file-system\">File system settings</a>, <a "
+"href=\"@clean-url\">Clean URL support</a>, <a href=\"@site-info\">Site "
+"name and other information</a>, and a <a "
+"href=\"@maintenance-mode\">Maintenance mode</a> for taking your site "
+"temporarily offline."
+msgstr ""
+"Le module System gère aussi les options de configuration de base de "
+"votre site, incluant <a href=\"@date-time-settings\">les paramètre de "
+"Date et heure</a>, <a href=\"@file-system\">les paramètres du "
+"Système de fichiers</a>, <a href=\"@clean-url\">le support des URL "
+"simplifiées</a>, <a href=\"@site-info\">le nom du Site et diverses "
+"informations</a> ainsi que <a href=\"@maintenance-mode\">le mode "
+"Maintenance</a> qui permet de mettre votre site temporairement hors "
+"ligne."
+msgid "Configuring actions"
+msgstr "Configuration des actions"
+msgid ""
+"Actions are individual tasks that the system can do, such as "
+"unpublishing a piece of content or banning a user. Modules, such as "
+"the <a href=\"@trigger-help\">Trigger module</a>, can fire these "
+"actions when certain system events happen; for example, when a new "
+"post is added or when a user logs in. Modules may also provide "
+"additional actions. Visit the <a href=\"@actions\">Actions page</a> to "
+"configure actions."
+msgstr ""
+"Les Actions sont des tâches particulières que le système peut "
+"exécuter, telles que dépublier un contenu ou exclure un utilisateur. "
+"Des modules, tels que le <a href=\"@trigger-help\">module Trigger</a>, "
+"peuvent déclencher ces actions lorsque certains évènement du "
+"système se produisent ; par exemple, quand une nouvelle contribution "
+"est ajoutée ou lorsqu'un utilisateur se connecte. Des modules peuvent "
+"aussi enrichir la liste d'actions disponibles. Visitez la <a "
+"href=\"@actions\">page Actions</a> pour configurer des actions."
+msgid ""
+"Set and configure the default theme for your website.  Alternative <a "
+"href=\"@themes\">themes</a> are available."
+msgstr ""
+"Choisir et configurer le thème par défaut de votre site. D'autres <a "
+"href=\"@themes\">thèmes</a> sont disponibles."
+msgid ""
+"Download additional <a href=\"@modules\">contributed modules</a> to "
+"extend Drupal's functionality."
+msgstr ""
+"Téléchargez des <a href=\"@modules\">modules contribués</a> "
+"additionnels pour étendre les fonctionnalités de Drupal."
+msgid ""
+"Regularly review and install <a href=\"@updates\">available "
+"updates</a> to maintain a secure and current site. Always run the <a "
+"href=\"@update-php\">update script</a> each time a module is updated."
+msgstr ""
+"Surveillez régulièrement et installez <a href=\"@updates\">les mises "
+"à jour disponibles</a> pour garder un site sécurisé et à jour. "
+"Exécutez toujours le <a href=\"@update-php\">script de mise à "
+"jour</a> à chaque fois qu'un module est mis à jour."
+msgid ""
+"Regularly review <a href=\"@updates\">available updates</a> to "
+"maintain a secure and current site. Always run the <a "
+"href=\"@update-php\">update script</a> each time a module is updated."
+msgstr ""
+"Surveillez régulièrement et installez <a href=\"@updates\">les mises "
+"à jour disponibles</a> pour garder un site sécurisé et à jour. "
+"Exécutez toujours le <a href=\"@update-php\">script de mise à "
+"jour</a> à chaque fois qu'un module est mis à jour."
+msgid ""
+"Regularly review available updates to maintain a secure and current "
+"site. Always run the <a href=\"@update-php\">update script</a> each "
+"time a module is updated. Enable the Update manager module to update "
+"and install modules and themes."
+msgstr ""
+"Surveillez régulièrement et installez <a href=\"@updates\">les mises "
+"à jour disponibles</a> pour garder un site sécurisé et à jour. "
+"Exécutez toujours le <a href=\"@update-php\">script de mise à "
+"jour</a> à chaque fois qu'un module est mis à jour. Activer le "
+"module Gestion des mise à jour pour mettre à jour et installer des "
+"modules ou thèmes."
+msgid ""
+"If you are upgrading to a newer version of Drupal or upgrading "
+"contributed modules or themes, you may need to run the <a "
+"href=\"@update-php\">update script</a>."
+msgstr ""
+"Si vous faites une mise à jour vers une version plus récente de "
+"Drupal, d'un module ou d'un thème contribué, il est peut être "
+"nécessaire de lancer le <a href=\"@update-php\">script de mise à "
+"jour</a>."
+msgid ""
+"There are two types of actions: simple and advanced. Simple actions do "
+"not require any additional configuration, and are listed here "
+"automatically. Advanced actions need to be created and configured "
+"before they can be used, because they have options that need to be "
+"specified; for example, sending an e-mail to a specified address, or "
+"unpublishing content containing certain words. To create an advanced "
+"action, select the action from the drop-down list in the advanced "
+"action section below and click the <em>Create</em> button."
+msgstr ""
+"Il y a deux types d'actions : simples et avancés. Les actions simples "
+"ne demandent pas de configuration supplémentaire et sont listées ici "
+"automatiquement. Les actions avancées nécessitent d'être créées "
+"et configurées avant d'être utilisées car des options doivent être "
+"précisées ; par exemple, définir une adresse pour envoyer un "
+"courriel ou dépublier un contenu incluant certains mots. Pour créer "
+"une action avancée, sélectionnez l'action à partir du menu "
+"déroulant dans la section action avancée ci-dessous et cliquez sur "
+"le bouton <em>Créer</em>."
+msgid ""
+"An advanced action offers additional configuration options which may "
+"be filled out below. Changing the <em>Description</em> field is "
+"recommended, in order to better identify the precise action taking "
+"place. This description will be displayed in modules such as the "
+"Trigger module when assigning actions to system events, so it is best "
+"if it is as descriptive as possible (for example, \"Send e-mail to "
+"Moderation Team\" rather than simply \"Send e-mail\")."
+msgstr ""
+"Une action avancée propose des options de configuration "
+"supplémentaires qui peuvent être saisies ci-dessous. Il est "
+"recommandé de changer le champ <em>Description</em> afin d'identifier "
+"plus précisement l'action qui va se dérouler. Cette description sera "
+"affichée dans des modules tels que Trigger au moment d'associer des "
+"actions aux évènements du système, donc il est préférable de "
+"décrire de façon aussi détaillée que possible (par exemple : "
+"\"envoyer un courriel à l'équipe de modération\" plutôt que "
+"seulement \"envoyer un courriel\")"
+msgid "Administer modules"
+msgstr "Administrer les modules"
+msgid "Administer site configuration"
+msgstr "Administrer la configuration du site"
+msgid "Administer themes"
+msgstr "Administrer les thèmes"
+msgid "Administer actions"
+msgstr "Administrer les actions"
+msgid "Use the administration pages and help"
+msgstr "Utiliser les pages d'administration et l'aide"
+msgid "Use the site in maintenance mode"
+msgstr "Utiliser le site en mode maintenance"
+msgid "View site reports"
+msgstr "Voir les rapports du site"
+msgid "Block IP addresses"
+msgstr "Bloquer des adresses IP"
+msgid "Public files"
+msgstr "Fichiers publics"
+msgid "Public local files served by the webserver."
+msgstr "Les fichiers publics locaux sont servis par le serveur web."
+msgid "Private local files served by Drupal."
+msgstr "Les fichiers privés locaux sont servis par Drupal."
+msgid "Temporary files"
+msgstr "Fichiers temporaires"
+msgid "Temporary local files for upload and previews."
+msgstr "Fichiers locaux temporaires pour chargement et prévisualisation."
+msgid "Update modules"
+msgstr "Mettre à jour les modules"
+msgid "Update themes"
+msgstr "Mettre à jour les thèmes"
+msgid "SSH"
+msgstr "SSH"
+msgid ""
+"Your password is not saved in the database and is only used to "
+"establish a connection."
+msgstr ""
+"Votre mot de passe n'est pas sauvé dans la base de donnée et est "
+"seulement utilisé pour établir une connexion."
+msgid ""
+"The connection will be created between your web server and the machine "
+"hosting the web server files. In the vast majority of cases, this will "
+"be the same machine, and \"localhost\" is correct."
+msgstr ""
+"La connexion sera créée entre votre serveur web et la machine "
+"hébergeant les fichiers du serveur web. Dans la grande majorité des "
+"cas, ce sera la même machine, et \"localhost\" est correct."
+msgid "Configure your <a href=\"@user-edit\">account time zone setting</a>."
+msgstr ""
+"Configurez votre <a href=\"@user-edit\">paramètre de fuseau "
+"horaire</a>."
+msgid ""
+"Select the desired local time and time zone. Dates and times "
+"throughout this site will be displayed using this time zone."
+msgstr ""
+"Sélectionnez l'heure locale et le fuseau horaire souhaité. Les dates "
+"et heures seront affichées selon ce fuseau horaire sur l'ensemble du "
+"site."
+msgid ""
+"Your time zone setting will be automatically detected if possible. "
+"Confirm the selection and click save."
+msgstr ""
+"Votre fuseau horaire sera détecté automatiquement, si possible. "
+"Confirmez la sélection et cliquez sur Créer un nouveau compte."
+msgid "System help"
+msgstr "Aide du système"
+msgid "The directory %directory does not exist and could not be created."
+msgstr "Le répertoire %directory n'existe pas et n'a pas pu être créé."
+msgid ""
+"The directory %directory exists but is not writable and could not be "
+"made writable."
+msgstr ""
+"Le répertoire %directory existe mais n'est pas accessible en "
+"écriture et il n'a pas été possible de le rendre inscriptible."
+msgid ""
+"The email address to which the message should be sent OR enter "
+"[node:author:mail], [comment:author:mail], etc. if you would like to "
+"send an e-mail to the author of the original post."
+msgstr ""
+"L'adresse de courriel à laquelle le message doit être envoyé OU "
+"utiliser [node:author:mail], [comment:author:mail], etc. si vous "
+"voulez envoyer un courriel à l'auteur de la contribution originale."
+msgid ""
+"The message that should be sent. You may include placeholders like "
+"[node:title], [user:name], and [comment:body] to represent data that "
+"will be different each time message is sent. Not all placeholders will "
+"be available in all contexts."
+msgstr ""
+"Le message qui sera envoyé. Vous pouvez utiliser des chaînes de "
+"remplacement comme [node:title], [user:name], and [comment:body] pour "
+"représenter des données qui seront différentes à chaque message "
+"envoyé. Toutes les chaînes de remplacement ne seront pas disponibles "
+"dans tous les contextes."
+msgid ""
+"The message to be displayed to the current user. You may include "
+"placeholders like [node:title], [user:name], and [comment:body] to "
+"represent data that will be different each time message is sent. Not "
+"all placeholders will be available in all contexts."
+msgstr ""
+"Le message à afficher à l'utilisateur courant. Vous pouvez utiliser "
+"des chaînes de remplacement comme [node:title], [user:name], and "
+"[comment:body] pour représenter des données qui seront différentes "
+"à chaque message envoyé. Toutes les chaînes de remplacement ne "
+"seront pas disponibles dans tous les contextes."
+msgid "@zone: @date"
+msgstr "@zone : @date"
+msgid "Powered by <a href=\"@poweredby\">Drupal</a>"
+msgstr "Propulsé par <a href=\"@poweredby\">Drupal</a>"
+msgid "AHAH callback"
+msgstr "AHAH callback"
+msgid "Administer blocks, content types, menus, etc."
+msgstr "Administrer les blocs, les types de contenu, les menus, etc."
+msgid "Select and configure your theme"
+msgstr "Choisir et configurer votre thème"
+msgid "Enable theme"
+msgstr "Activer le thème"
+msgid "Disable theme"
+msgstr "Désactiver le thème"
+msgid "Set default theme"
+msgstr "Choisir comme thème par défaut"
+msgid "Configure default and theme specific settings."
+msgstr "Configurer les paramètres par défaut et spécifique du thème."
+msgid "IP address blocking"
+msgstr "Blocage d'adresses IP"
+msgid "Manage blocked IP addresses."
+msgstr "Gérer les adresses IP bloquées."
+msgid "Delete IP address"
+msgstr "Suppression d'une adresse IP"
+msgid "Media tools."
+msgstr "Outils multimédia."
+msgid "Tools related to web services."
+msgstr "Outils liés aux services web."
+msgid ""
+"Configure the site description, the number of items per feed and "
+"whether feeds should be titles/teasers/full-text."
+msgstr ""
+"Configurer la description du site, le nombre d'élément par flux et "
+"si les flux doivent contenir les titres, les accroches ou le texte "
+"complet."
+msgid "Development tools."
+msgstr "Outils de développement."
+msgid "Maintenance mode"
+msgstr "Mode maintenance"
+msgid "Take the site offline for maintenance or bring it back online."
+msgstr ""
+"Mettre le site hors ligne pour une maintenance ou le remettre en "
+"ligne."
+msgid "Logging and errors"
+msgstr "Journalisation et erreurs"
+msgid ""
+"Settings for logging and alerts modules. Various modules can route "
+"Drupal's system events to different destinations, such as syslog, "
+"database, email, etc."
+msgstr ""
+"Paramètre pour la journalisation et les alertes des modules. "
+"Plusieurs modules peuvent rediriger les événements système de "
+"Drupal vers différentes destinations tel que le fichier syslog, la "
+"base de données, une adresse électroniques, etc."
+msgid "Regional and language"
+msgstr "Régionalisation et langue"
+msgid "Regional settings, localization and translation."
+msgstr "Paramètres régionaux, localisation et traduction."
+msgid "Settings for the site's default time zone and country."
+msgstr "Paramètres pour le fuseau horaire et le pays par défaut du site."
+msgid "Configure display formats for date and time."
+msgstr "Configurer le format d'affichage de la date et de l'heure."
+msgid "Add new date type."
+msgstr "Ajouter un nouveau type de date."
+msgid "Delete date type"
+msgstr "Supprimer un type de date"
+msgid "Allow users to delete a configured date type."
+msgstr "Permettre aux utilisateurs de supprimer un type de date configuré."
+msgid "Configure display format strings for date and time."
+msgstr "Configurer les chaînes de format d'affichage pour la date et l'heure."
+msgid "Edit date format"
+msgstr "Modifier le format de date"
+msgid "Allow users to edit a configured date format."
+msgstr "Permettre aux utilisateurs de modifier un format de date configuré."
+msgid "Search and metadata"
+msgstr "Recherche et metadonnées"
+msgid "Local site search, metadata and SEO."
+msgstr "Recherche sur le site, metadonnée et SEO."
+msgid "General system related configuration."
+msgstr "Configuration générale du système."
+msgid "Tools that enhance the user interface."
+msgstr "Outils d'amélioration de l'interface utilisateur."
+msgid "Content workflow, editorial workflow tools."
+msgstr "Flux de travail du contenu, outils de flux de travail éditorial."
+msgid "Content authoring"
+msgstr "Rédaction de contenu"
+msgid "Settings related to formatting and authoring content."
+msgstr "Paramètres liés à la mise en forme et à la rédaction de contenu."
+msgid ""
+"The host !host is no longer blocked because it is not a valid IP "
+"address."
+msgstr ""
+"L'hôte !host n'est plus bloqué car ce n'est pas une adresse IP "
+"valide."
+msgid "Inserted into {role_permission} the permissions for role ID !id"
+msgstr "Inseré dans {role_permission} la persmission pour le rôle ID !id"
+msgid ""
+"Aggressive caching was disabled and replaced with normal caching. Read "
+"the page caching section in default.settings.php for more information "
+"on how to enable similar functionality."
+msgstr ""
+"Le système de cache aggressif a été désactivé et remplacé par le "
+"cache normal. Lisez la section cache de page dans default.settings.php "
+"pour plus d'informations sur comment activer des fonctionnalités "
+"similaires."
+msgid "%profile_name (%profile-%version)"
+msgstr "%profile_name (%profile-%version)"
+msgid "more information"
+msgstr "plus d'informations"
+msgid ""
+"The phpinfo() function has been disabled for security reasons. To see "
+"your server's phpinfo() information, change your PHP settings or "
+"contact your server administrator. For more information, <a "
+"href=\"@phpinfo\">Enabling and disabling phpinfo()</a> handbook page."
+msgstr ""
+"La fonction phpinfo() a été désactivée pour des raisons de "
+"sécurité. Pour consulter les informations phpinfo() de votre "
+"serveur, modifiez vos paramètres PHP ou contactez l'administrateur de "
+"votre serveur. Pour plus d'informations, consultez la page <a "
+"href=\"@phpinfo\">Activer et désactiver phpinfo()</a> du manuel."
+msgid "To run cron from outside the site, go to <a href=\"!cron\">!cron</a>"
+msgstr ""
+"Pour exécuter le cron depuis l'extérieur de votre site, allez sur <a "
+"href=\"!cron\">!cron</a>"
+msgid ""
+"An automated attempt to create this directory failed, possibly due to "
+"a permissions problem. To proceed with the installation, either create "
+"the directory and modify its permissions manually or ensure that the "
+"installer has the permissions to create it automatically. For more "
+"information, see INSTALL.txt or the <a href=\"@handbook_url\">online "
+"handbook</a>."
+msgstr ""
+"Un essai automatisé de création de ce répertoire a échoué, "
+"probablement en raison d'un problème de permissions. Afin de "
+"poursuivre l'installation, veuillez soit créer le répertoire et "
+"modifier manuellement ses permissions, soit vous assurer que le "
+"programme d'installation possède les permissions pour le créer "
+"automatiquement. Pour plus d'informations, consultez INSTALL.txt ou le "
+"<a href=\"@handbook_url\">manuel en ligne</a>."
+msgid "Your configuration has been saved."
+msgstr "Votre configuration a été enregistrée."
+msgid "No vocabularies available. <a href=\"@link\">Add vocabulary</a>."
+msgstr ""
+"Aucun vocabulaire disponible. <a href=\"@link\">Ajouter un "
+"vocabulaire</a>."
+msgid "No terms available. <a href=\"@link\">Add term</a>."
+msgstr "Aucun terme disponible. <a href=\"@link\">Ajouter un terme</a>."
+msgid "There is currently no content classified with this term."
+msgstr "Il n'y a actuellement aucun contenu classé avec ce terme."
+msgid "Tokens related to taxonomy terms."
+msgstr "Jetons liés aux termes de taxonomie."
+msgid "Tokens related to taxonomy vocabularies."
+msgstr "Jetons liés aux vocabulaires de taxonomie."
+msgid ""
+"The Taxonomy module allows you to classify the content of your "
+"website. To classify content, you define <em>vocabularies</em> that "
+"contain related <em>terms</em>, and then assign the vocabularies to "
+"content types. For more information, see the online handbook entry for "
+"the <a href=\"@taxonomy\">Taxonomy module</a>."
+msgstr ""
+"Le module Taxonomy vous permet de classer le contenu de votre site "
+"web. Pour classer le contenu, vous définissez des "
+"<em>vocabulaires</em>, qui contiennent des <em>termes</em> associés, "
+"puis assignez les vocabulaires aux types de contenu. pour plus "
+"d'informations, consultez la section du manuel en ligne relative au <a "
+"href=\"@taxonomy\">module Taxonomy</a>."
+msgid "Creating vocabularies"
+msgstr "Création des vocabulaires"
+msgid ""
+"Users with sufficient <a href=\"@perm\">permissions</a> can create "
+"<em>vocabularies</em> and <em>terms</em> through the <a "
+"href=\"@taxo\">Taxonomy page</a>. The page listing the terms provides "
+"a drag-and-drop interface for controlling the order of the terms and "
+"sub-terms within a vocabulary, in a hierarchical fashion. A "
+"<em>controlled vocabulary</em> classifying music by genre with terms "
+"and sub-terms could look as follows:"
+msgstr ""
+"Les utilisateurs possédant des <a href=\"@perm\">permissions</a> "
+"suffisantes peuvent créer des <em>vocabulaires</em> et "
+"<em>termes</em> depuis la <a href=\"@taxo\">Page des Taxonomies</a>. "
+"Celle-ci liste les termes et fournit une interface en glisser-déposer "
+"permettant de contrôler l'ordre des termes et sous-termes au sein "
+"d'un vocabulaire, de manière hiérarchique. Un <em>vocabulaire "
+"contrôlé</em> qui classerait la musique par genre, avec des termes "
+"et sous-termes pourrait ressembler à la structure ci-dessous :"
+msgid "<em>vocabulary</em>: Music"
+msgstr "<em>vocabulaire</em> : Musique"
+msgid "<em>term</em>: Jazz"
+msgstr "<em>terme</em> : Jazz"
+msgid "<em>sub-term</em>: Swing"
+msgstr "<em>sous-terme</em> : Swing"
+msgid "<em>sub-term</em>: Fusion"
+msgstr "<em>sous-terme</em> : Fusion"
+msgid "<em>term</em>: Rock"
+msgstr "<em>terme</em> : Rock"
+msgid "<em>sub-term</em>: Country rock"
+msgstr "<em>sous-terme</em> : Rock Country"
+msgid "<em>sub-term</em>: Hard rock"
+msgstr "<em>sous-terme</em> : Hard rock"
+msgid ""
+"You can assign a sub-term to multiple parent terms. For example, "
+"<em>fusion</em> can be assigned to both <em>rock</em> and "
+"<em>jazz</em>."
+msgstr ""
+"Vous pouvez assigner un sous-terme à plusieurs termes parents. Par "
+"exemple, <em>fusion</em> peut être assigné à la fois à "
+"<em>rock</em> et <em>jazz</em>."
+msgid ""
+"Terms in a <em>free-tagging vocabulary</em> can be built gradually as "
+"you create or edit content. This is often done used for blogs or photo "
+"management applications."
+msgstr ""
+"Les termes d'un <em>vocabulaire à étiquetage libre</em> peuvent "
+"être construits progressivement, au fur et mesure que vous créez ou "
+"modifiez du contenu. C'est souvent le cas pour des applications de "
+"type blog ou gestion de photos."
+msgid "Assigning vocabularies to content types"
+msgstr "Assignation des vocabulaires aux types de contenu"
+msgid ""
+"Before you can use a new vocabulary to classify your content, a new "
+"Taxonomy term field must be added to a <a href=\"@ctedit\">content "
+"type</a> on its <em>manage fields</em> page. When adding a taxonomy "
+"field, you choose a <em>widget</em> to use to enter the taxonomy "
+"information on the content editing page: a select list, checkboxes, "
+"radio buttons, or an auto-complete field (to build a free-tagging "
+"vocabulary). After choosing the field type and widget, on the "
+"subsequent <em>field settings</em> page you can choose the desired "
+"vocabulary, whether one or multiple terms can be chosen from the "
+"vocabulary, and other settings. The same vocabulary can be added to "
+"multiple content types, by using the \"Add existing field\" section on "
+"the manage fields page."
+msgstr ""
+"Avant de pouvoir utiliser un nouveau vocabulaire pour classer votre "
+"contenu, un nouveau champ de terme de Taxonomie doit être ajouté à "
+"un <a href=\"@ctedit\">type de contenu</a> sur sa page <em>gérer les "
+"champs</em>. Lors de l'ajout d'un champ taxonomie, vous choisirez un "
+"<em>widget</em> utilisé pour la saisir des informations de taxonomie "
+"sur la page d'édition du contenu : une liste déroulante, des cases "
+"à cocher, des boutons radio, ou un champ à auto-complétion (pour "
+"construire des vocabulaires en étiquetage libre). Après avoir choisi "
+"le type de champ et le widget, sur la page suivante des "
+"<em>paramètres de champ</em>, vous pourrez sélectionner le "
+"vocabulaire désiré, décider si un ou plusieurs termes du "
+"vocabulaire peuvent être choisis, ainsi que d'autres paramètres. Le "
+"même vocabulaire peut être ajouté à plusieurs types de contenu, à "
+"l'aide de la section \"Ajouter un champ existant\" de la page de "
+"gestion des champs."
+msgid "Classifying content"
+msgstr "Classement des contenus"
+msgid ""
+"After the vocabulary is assigned to the content type, you can start "
+"classifying content. The field with terms will appear on the content "
+"editing screen when you edit or <a href=\"@addnode\">add new "
+"content</a>."
+msgstr ""
+"Après avoir assigné le vocabulaire au type de contenu, vous pourrez "
+"commencer à classer votre contenu. Le champ apparaîtra avec les "
+"termes sur la page de modification de contenu, lors de la modification "
+"ou de l'<a href=\"@addnode\">ajout d'un nouveau contenu</a>."
+msgid "Viewing listings and RSS feeds by term"
+msgstr "Vue des listes et des flux RSS par terme"
+msgid ""
+"Each taxonomy term automatically provides a page listing content that "
+"has its classification, and a corresponding RSS feed. For example, if "
+"the taxonomy term <em>country rock</em> has the ID 123 (you can see "
+"this by looking at the URL when hovering on the linked term, which you "
+"can click to navigate to the listing page), then you will find this "
+"list at the path <em>taxonomy/term/123</em>. The RSS feed will use the "
+"path <em>taxonomy/term/123/feed</em> (the RSS icon for this term's "
+"listing will automatically display in your browser's address bar when "
+"viewing the listing page)."
+msgstr ""
+"Chaque terme de taxonomie fournit automatiquement une page listant le "
+"contenu qui possède ce classement, et un flux RSS correspondant. Par "
+"exemple, si un terme de taxonomie <em>rock country</em> possède l'ID "
+"123 (vous pouvez le voir regardant l'URL lors du survol d'un terme "
+"possédant un lien, sur lequel vous pouvez cliquer pour naviguer vers "
+"la page de liste), alors vous pourrez trouver cette liste à l'adresse "
+"<em>taxonomy/term/123</em>. Le flux RSS utilisera l'adresse "
+"<em>taxonomy/term/123/feed</em> (l'icône RSS s'affichera "
+"automatiquement dans la barre d'adresse de votre navigateur à "
+"l'affichage de cette page)."
+msgid "Extending Taxonomy module"
+msgstr "Extension du module Taxonomy"
+msgid ""
+"There are <a href=\"@taxcontrib\">many contributed modules</a> that "
+"extend the behavior of the Taxonomy module for both display and "
+"organization of terms."
+msgstr ""
+"Il existe de <a href=\"@taxcontrib\">nombreux modules contribués</a> "
+"qui étende le comportement du module Taxonomy, à la fois pour "
+"l'affichage et l'organisation des termes."
+msgid ""
+"Taxonomy is for categorizing content. Terms are grouped into "
+"vocabularies. For example, a vocabulary called \"Fruit\" would contain "
+"the terms \"Apple\" and \"Banana\"."
+msgstr ""
+"La Taxonomie sert à catégoriser le contenu. Les termes sont "
+"regroupés dans des vocabulaires. Par exemple, un vocabulaire appelé "
+"\"Fruit\" contiendra les termes \"Pomme\" et \"Banane\"."
+msgid ""
+"You can reorganize the terms in %capital_name using their "
+"drag-and-drop handles, and group terms under a parent term by sliding "
+"them under and to the right of the parent."
+msgstr ""
+"Vous pouvez réorganiser les termes de %capital_name en utilisant les "
+"croix de glisser-déposer ; vous pouvez grouper des termes sous un "
+"terme parent en les glissant en-dessous et à droite du parent."
+msgid ""
+"%capital_name contains terms grouped under parent terms. You can "
+"reorganize the terms in %capital_name using their drag-and-drop "
+"handles."
+msgstr ""
+"%capital_name contient des termes groupés sous des termes parents. "
+"Vous pouvez ré-organiser les termes dans %capital_name en utilisant "
+"les croix de glisser-déposer."
+msgid ""
+"%capital_name contains terms with multiple parents. Drag and drop of "
+"terms with multiple parents is not supported, but you can re-enable "
+"drag-and-drop support by editing each term to include only a single "
+"parent."
+msgstr ""
+"%capital_name contient des termes avec des parents multiples. Le "
+"glisser-déposer de termes avec des parents multiples n'est pas "
+"supporté, mais vous pouvez ré-activer le support du glisser-déposer "
+"en modifiant chaque terme pour qu'il n'inclue qu'un seul parent."
+msgid "Administer vocabularies and terms"
+msgstr "Administrer les vocabulaires et termes"
+msgid "Edit terms in %vocabulary"
+msgstr "Modifier les termes dans %vocabulary"
+msgid "Delete terms from %vocabulary"
+msgstr "Supprimer les termes de %vocabulary"
+msgid "Taxonomy term page"
+msgstr "Page d'un terme de taxonomie"
+msgid "Term reference"
+msgstr "Référence à un terme"
+msgid "This field stores a reference to a taxonomy term."
+msgstr "Ce champ stocke une référence à un terme de taxonomy."
+msgid "Autocomplete term widget (tagging)"
+msgstr "Widget d'auto-complétion de terme (étiquetage)"
+msgid "The vocabulary which supplies the options for this field."
+msgstr "Le vocabulaire fournissant les options de ce champ."
+msgid ""
+"The Toolbar module displays links to top-level administration menu "
+"items and links from other modules at the top of the screen. For more "
+"information, see the online handbook entry for <a "
+"href=\"@toolbar\">Toolbar module</a>."
+msgstr ""
+"Le module Toolbar affiche des liens vers les éléments du plus haut "
+"niveau du menu d'administration, ainsi que des liens d'autres modules "
+"en haut de l'écran. Pour plus d'informations, consultez le manuel en "
+"ligne à propos du <a href=\"@toolbar\">module Toolbar</a>."
+msgid "Displaying administrative links"
+msgstr "Affichage des liens d'administration"
+msgid "Use the administration toolbar"
+msgstr "Utiliser la barre d'outils d'administration"
+msgid "Toggle drawer visibility"
+msgstr "Basculer la visibilité du tiroir"
+msgid ""
+"Provides a toolbar that shows the top-level administration menu items "
+"and links from other modules."
+msgstr ""
+"Fournit une barre d'outils affichant les éléments de plus haut "
+"niveau du menu d'administration, ainsi que des liens provenant "
+"d'autres modules."
+msgid ""
+"The Tracker module displays the most recently added and updated "
+"content on your site, and allows you to follow new content created by "
+"each user. This module has no configuration options. For more "
+"information, see the online handbook entry for <a "
+"href=\"@tracker\">Tracker module</a>."
+msgstr ""
+"Le module Tracker affiche les contenus les plus récemment ajoutés et "
+"mis à jour sur votre site, et vous permet de suivre le nouveau "
+"contenu créé par chaque utilisateur. Ce module ne possède pas "
+"d'options de configuration. Pour plus d'informations, consultez la "
+"section du manuel en ligne concernant le <a href=\"@tracker\">module "
+"Tracker</a>."
+msgid ""
+"The Tracker module adds a new menu item to the Navigation menu, called "
+"<em>Recent content</em>. You can configure menu items via the <a "
+"href=\"@menus\">Menus administration page</a>."
+msgstr ""
+"Le module Tracker ajoute un nouvel élément de menu au menu de "
+"Navigation, appelé <em>Contenu récent</em>. Vous pouvez configurer "
+"les éléments de menu par le biais de la <a href=\"@menus\">Page "
+"d'administration des Menus</a>."
+msgid "Tracking new and updated site content"
+msgstr "Suivi du contenu du site nouveau et mis à jour"
+msgid ""
+"The <a href='@recent'>Recent content</a> page shows new and updated "
+"content in reverse chronological order, listing the content type, "
+"title, author's name, number of comments, and time of last update. "
+"Content is considered updated when changes occur in the text, or when "
+"new comments are added. The <em>My recent content</em> tab limits the "
+"list to the currently logged-in user."
+msgstr ""
+"La page <a href='@recent'>Contenu Récent</a> affiche le contenu "
+"nouveau et mis à jour dans l'ordre anté-chronologique, en listant le "
+"type de contenu, le titre, le nom de l'auteur, le nombre de "
+"commentaires et l'heure de la dernière mise à jour. Le contenu est "
+"considéré comme modifié lorsque des changements ont lieu dans le "
+"texte, ou lorsque des nouveaux commentaires sont ajoutés. L'onglet "
+"<em>Mon contenu récent</em> limite l'affichage de cette liste à "
+"l'utilisateur actuellement connecté."
+msgid "Tracking user-specific content"
+msgstr "Suivi du contenu propre à un utilisateur"
+msgid ""
+"To follow a specific user's new and updated content, select the "
+"<em>Track</em> tab from the user's profile page."
+msgstr ""
+"Afin de suivre le contenu nouvellement créé ou mis à jour par un "
+"utilisateur donné, sélectionnez l'onglet <em>Suivi</em> depuis la "
+"page de profil de l'utilisateur."
+msgid "All recent content"
+msgstr "Tout le contenu récent"
+msgid "My recent content"
+msgstr "Mon contenu récent"
+msgid "Track content"
+msgstr "Suivre le contenu"
+msgid "Enables tracking of recent content for users."
+msgstr "Active le suivi du contenu récent pour les utilisateurs."
+msgid ""
+"The Content translation module allows content to be translated into "
+"different languages. Working with the <a href=\"@locale\">Locale "
+"module</a> (which manages enabled languages and provides translation "
+"for the site interface), the Content translation module is key to "
+"creating and maintaining translated site content. For more "
+"information, see the online handbook entry for <a "
+"href=\"@translation\">Content translation module</a>."
+msgstr ""
+"Le module Content translation permet au contenu d'être traduit dans "
+"différentes langues. Fonctionnant avec le <a href=\"@locale\">module "
+"Locale</a> (qui gère les langues activées et fournit des traductions "
+"pour l'interface du site), le module Content Translation est la clé "
+"de voûte pour créer et maintenir un contenu de site traduit. Pour "
+"plus d'informations, consultez la section du manuel en ligne sur le <a "
+"href=\"@translation\">module Content translation</a>."
+msgid "Configuring content types for translation"
+msgstr "Configuration des types de contenu pour la traduction"
+msgid ""
+"To configure a particular content type for translation, visit the <a "
+"href=\"@content-types\">Content types</a> page, and click the "
+"<em>edit</em> link for the content type. In the <em>Publishing "
+"options</em> section, select <em>Enabled, with translation</em> under "
+"<em>Multilingual support</em>."
+msgstr ""
+"Afin de configurer un type de contenu donné pour la traduction, "
+"visitez la page <a href=\"@content-types\">Types de contenu</a>, et "
+"cliquez sur le lien <em>modifier</em> du type de contenu. Dans la "
+"section <em>Options de publication</em>, sélectionnez la valeur "
+"<em>Activé, avec traduction</em> sous <em>Support Multilingue</em>."
+msgid "Assigning a language to content"
+msgstr "Assignation d'une langue au contenu"
+msgid ""
+"Use the <em>Language</em> drop down to select the appropriate language "
+"when creating or editing content."
+msgstr ""
+"Utilisez la liste déroulante <em>Langue</em> afin de sélectionner la "
+"langue appropriée lors de la création ou de la modification du "
+"contenu."
+msgid "Translating content"
+msgstr "Traduction du contenu"
+msgid ""
+"Users with the <em>translate content</em> permission can translate "
+"content, if the content type has been configured to allow "
+"translations. To translate content, select the <em>Translation</em> "
+"tab when viewing the content, select the language for which you wish "
+"to provide content, and then enter the content."
+msgstr ""
+"Les utilisateurs avec le droit <em>traduire le contenu</em> peuvent "
+"traduire le contenu, si le type de contenu a été configurer pour "
+"accepter les traductions. Pour traduite le contenu, sélectionner "
+"l'onglet <em>Traduction</em> sur la page du contenu, sélectionnez la "
+"langue pour laquelle vous voulez fournir du contenu, et enfin, "
+"saisissez ce contenu."
+msgid "Maintaining translations"
+msgstr "Maintenance des traductions"
+msgid ""
+"If editing content in one language requires that translated versions "
+"also be updated to reflect the change, use the <em>Flag translations "
+"as outdated</em> check box to mark the translations as outdated and in "
+"need of revision. Individual translations may also be marked for "
+"revision by selecting the <em>This translation needs to be "
+"updated</em> check box on the translation editing form."
+msgstr ""
+"Si la modification d'un contenu dans une langue exige que les versions "
+"traduites soient aussi mises à jour pour refléter les changements, "
+"utilisez la case à cocher <em>Marquer les traductions comme non à "
+"jour</em>, pour marquer les traductions comme non à jour, et ayant "
+"besoin d'une révision. Chaque traduction peut être marquée "
+"individuellement pour révision en sélectionnant la case à cocher "
+"<em>Cette traduction doit être mise à jour</em> sur le formulaire de "
+"modification de la traduction."
+msgid "Translate content"
+msgstr "Traduire le contenu"
+msgid "There is already a translation in this language."
+msgstr "Une traduction existe déjà pour cette langue."
+msgid "Trigger: !description"
+msgstr "Déclencheur : !description"
+msgid ""
+"No actions available for this trigger. <a href=\"@link\">Add "
+"action</a>."
+msgstr ""
+"Aucune action n'est disponible pour ce déclencheur. <a "
+"href=\"@link\">Ajouter une action</a>."
+msgid "Missing/undefined save action (%save_aid) for %aid action."
+msgstr ""
+"Action de sauvegarde (%save_aid) manquante ou non définir pour "
+"l'action %aid."
+msgid ""
+"The %label action has been appended, which is required to save the "
+"property change."
+msgstr ""
+"L'action %label a été ajoutée, et est obligatoire pour enregistrer "
+"la modification de la propriété."
+msgid "The %label action was moved to save the property change."
+msgstr ""
+"L'action %label a été déplacée pour enregistrer la modification de "
+"la propriété."
+msgid ""
+"Triggers are events on your site, such as new content being added or a "
+"user logging in. The Trigger module associates these triggers with "
+"actions (functional tasks), such as unpublishing content containing "
+"certain keywords or e-mailing an administrator. The <a "
+"href=\"@url\">Actions settings page</a> contains a list of existing "
+"actions and provides the ability to create and configure advanced "
+"actions (actions requiring configuration, such as an e-mail address or "
+"a list of banned words)."
+msgstr ""
+"Les <em>déclencheurs</em> sont des événements de votre site, tel "
+"que l'ajout d'un nouveau contenu ou encore la connexion d'un "
+"utilisateur. Le module Trigger associe ces déclencheurs à des "
+"<em>actions</em> (tâches fonctionnelles), telles que dépublier les "
+"contenus contenant certains mots-clés, ou bien envoyer un courriel à "
+"l'administrateur. La <a href=\"@url\">page de paramètres des "
+"actions</a> contient une liste des actions existantes, et vous offre "
+"la possibilité de créer et configurer des <em>actions avancées</em> "
+"(i.e. des actions nécessitant un paramétrage, tel qu'une adresse de "
+"courriel ou une liste de mots interdits)."
+msgid ""
+"The Trigger module provides the ability to cause <em>actions</em> to "
+"run when certain <em>triggers</em> take place on your site. Triggers "
+"are events, such as new content being added to your site or a user "
+"logging in, and actions are tasks, such as unpublishing content or "
+"e-mailing an administrator. For more information, see the online "
+"handbook entry for <a href=\"@trigger\">Trigger module</a>."
+msgstr ""
+"Le module Trigger permet d'exécuter des <em>actions</em> lorsque "
+"certains <em>déclencheurs</em> sont exécutés sur votre site. Les "
+"déclencheurs sont des événements, tels que l'ajout d'un nouveau "
+"contenu à votre site, ou la connexion d'un utilisateur ; les actions "
+"sont des tâches, telles que la dépublication d'un contenu ou l'envoi "
+"d'un courriel à un administrateur. Pour plus d'information, consultez "
+"la section sur le <a href=\"@trigger\">module Trigger</a> dans le "
+"manuel en ligne ."
+msgid "Configuring triggers and actions"
+msgstr "Configuration des déclencheurs et des actions"
+msgid ""
+"The combination of actions and triggers can perform many useful tasks, "
+"such as e-mailing an administrator if a user account is deleted, or "
+"automatically unpublishing comments that contain certain words. To set "
+"up a trigger/action combination, first visit the <a "
+"href=\"@actions-page\">Actions configuration page</a>, where you can "
+"either verify that the action you want is already listed, or create a "
+"new <em>advanced</em> action. You will need to set up an advanced "
+"action if there are configuration options in your trigger/action "
+"combination, such as specifying an e-mail address or a list of banned "
+"words. After configuring or verifying your action, visit the <a "
+"href=\"@triggers-page\">Triggers configuration page</a> and choose the "
+"appropriate tab (Comment, Taxonomy, etc.), where you can assign the "
+"action to run when the trigger event occurs."
+msgstr ""
+"La combinaison des actions et des déclencheurs permet d'accomplir de "
+"nombreuses tâches utiles, telles que l'envoi d'un courriel à un "
+"administrateur si un compte utilisateur est supprimé, ou encore la "
+"dépublication automatique de commentaires qui contiennent des mots "
+"donnés. Pour paramétrer une combinaison déclencheur/action, "
+"commencez par visiter la <a href=\"@actions-page\">Page de "
+"configuration des actions</a>, d'où vous pourrez soit vérifier que "
+"l'action souhaitée est déjà listée, soit créer une nouvelle "
+"action <em>avancée</em>. Vous aurez besoin de paramétrer une action "
+"avancée s'il existe des options de configuration pour votre "
+"combinaison déclencheur/action, telles que spécifier une adresse "
+"e-mail ou une liste de mots interdits. Après avoir configuré ou "
+"vérifié votre action, visitez la <a href=\"@triggers-page\">Page de "
+"configuration des déclencheurs</a> et choisissez l'onglet approprié "
+"(Commentaire, Taxonomie, etc...), d'où vous pourrez assigner l'action "
+"à exécuter lorsque l'événement déclencheur se produit."
+msgid "When either saving new content or updating existing content"
+msgstr ""
+"Lors de l'enregistrement d'un nouveau contenu ou de la mise à jour "
+"d'un contenu existant"
+msgid "After saving updated content"
+msgstr "Après l'enregistrement d'un contenu mis à jour"
+msgid "When either saving a new comment or updating an existing comment"
+msgstr ""
+"Lors de l'enregistrement d'un nouveau commentaire ou d'un commentaire "
+"existant"
+msgid "After creating a new user account"
+msgstr "Après la création d'un nouveau compte utilisateur"
+msgid "After updating a user account"
+msgstr "Après la mise à jour d'un compte utilisateur"
+msgid "Configure when to execute actions."
+msgstr "Configurer quand exécuter les actions."
+msgid "Installing updates"
+msgstr "Installation des mises à jour"
+msgid "Preparing to update your site"
+msgstr "Préparation de la mise à jour de votre site"
+msgid "Installing %project"
+msgstr "Installation de %project"
+msgid "Preparing to install"
+msgstr "Préparation de l'installation"
+msgid "Error installing / updating"
+msgstr "Erreur d'installation / de mise à jour"
+msgid "Installed %project_name successfully"
+msgstr "%project_name a été installé avec succès"
+msgid ""
+"Update was completed successfully. Your site has been taken out of "
+"maintenance mode."
+msgstr ""
+"La mise à jour a été terminée avec succès. Votre site a été "
+"retiré du mode maintenance."
+msgid "Update was completed successfully."
+msgstr "La mise à jour a été achevée avec succès."
+msgid "Update failed! See the log below for more information."
+msgstr ""
+"La mise à jour a échoué ! Consultez le journal ci-dessous pour plus "
+"d'informations."
+msgid ""
+"Update failed! See the log below for more information. Your site is "
+"still in maintenance mode."
+msgstr ""
+"La mise à jour a échoué ! Consultez le journal ci-dessous pour plus "
+"d'information. Votre site est toujours en mode maintenance."
+msgid ""
+"Installation was completed successfully. Your site has been taken out "
+"of maintenance mode."
+msgstr ""
+"L'installation a été réalisée avec succès. Votre site n'est plus "
+"en mode maintenance."
+msgid "Installation was completed successfully."
+msgstr "L'installation a été réalisée avec succès."
+msgid "Installation failed! See the log below for more information."
+msgstr ""
+"L'installation a échoué&nbsp;! Consultez le journal ci-dessous pour "
+"plus d'informations."
+msgid ""
+"Installation failed! See the log below for more information. Your site "
+"is still in maintenance mode."
+msgstr ""
+"L'installation a échoué&nbsp;! Consultez le journal ci-dessous pour "
+"plus d'informations. Votre site est toujours en mode maintenance."
+msgid "Failed to get available update data."
+msgstr "La récupération des données de mise à jour disponibles a échoué."
+msgid "No available update data"
+msgstr "Aucune donnée de mise à jour disponible"
+msgid "Checking available update data"
+msgstr "Vérification des données de mise à jour disponibles"
+msgid "Trying to check available update data ..."
+msgstr ""
+"Tentative de vérification des données de mises à jour "
+"disponibles..."
+msgid "Error checking available update data."
+msgstr "Erreur à la vérification des données de mises à jour disponibles."
+msgid "Checking available update data ..."
+msgstr "Vérification des données de mises à jour disponibles ..."
+msgid "Checked available update data for %title."
+msgstr ""
+"Les données de mises à jour disponibles pour %title ont été "
+"vérifiées."
+msgid "Failed to check available update data for %title."
+msgstr ""
+"Échec lors de la vérification des données de mises à jour "
+"disponibles pour %title."
+msgid "An error occurred trying to get available update data."
+msgstr ""
+"Une erreur s'est produite en essayant de récupérer les données de "
+"mises à jour disponibles."
+msgid "Checked available update data for one project."
+msgid_plural "Checked available update data for @count projects."
+msgstr[0] "Données de mises à jour disponibles vérifiées pour @count projet."
+msgstr[1] "Données de mises à jour disponibles vérifiées pour @count projets."
+msgid "Failed to get available update data for one project."
+msgid_plural "Failed to get available update data for @count projects."
+msgstr[0] ""
+"La récupération des informations de mise à jour a échoué pour "
+"@count projet."
+msgstr[1] ""
+"La récupération des informations de mise à jour a échoué pour "
+"@count projets."
+msgid "There was a problem getting update information. Try again later."
+msgstr ""
+"Il y a eu un problème à la récupération des informations de mise "
+"à jour. Veuillez ré-essayer plus tard."
+msgid "(Theme)"
+msgstr "(Thème)"
+msgid "(Release notes)"
+msgstr "(Notes de version)"
+msgid ""
+"This update is a major version update which means that it may not be "
+"backwards compatible with your currently running version.  It is "
+"recommended that you read the release notes and proceed at your own "
+"risk."
+msgstr ""
+"Cette mise à jour est une mise à jour de version majeure, ce qui "
+"signifie qu'elle n'est peut-être pas rétrocompatible avec votre "
+"version actuellement en fonction. Il est recommandé que vous lisiez "
+"les notes de version et, le cas échéant, continuiez à vos risques "
+"et périls."
+msgid "(Security update)"
+msgstr "(Mise à jour de sécurité)"
+msgid "(Unsupported)"
+msgstr "(Non supportée)"
+msgid "All of your projects are up to date."
+msgstr "Tous vos projets sont à jour."
+msgid "Download these updates"
+msgstr "Télécharger ces mises à jour"
+msgid "Manual updates required"
+msgstr "Des mises à jour manuelles sont requises"
+msgid "Updates of Drupal core are not supported at this time."
+msgstr ""
+"Les mises à jour du cœur de Drupal ne sont pas prises en charge pour "
+"le moment."
+msgid "You must select at least one project to update."
+msgstr "Vous devez sélectionner au moins un projet à mettre à jour."
+msgid "Downloading updates"
+msgstr "Téléchargement des mises à jour"
+msgid "Preparing to download selected updates"
+msgstr "Préparation au téléchargement des mises à jour sélectionnées"
+msgid "Downloading updates failed:"
+msgstr "Le téléchargement des mises à jour a échoué :"
+msgid "Updates downloaded successfully."
+msgstr "Les mises à jour ont été téléchargées avec succès."
+msgid "Fatal error trying to download."
+msgstr "Erreur fatale en essayant de télécharger."
+msgid ""
+"Back up your database and site before you continue. <a "
+"href=\"@backup_url\">Learn how</a>."
+msgstr ""
+"Sauvegardez votre base de données et votre site avant de continuer. "
+"<a href=\"@backup_url\">Apprenez comment le faire</a>."
+msgid "Perform updates with site in maintenance mode (strongly recommended)"
+msgstr ""
+"Effectuer les mises à jour avec le site en mode maintenance "
+"(fortement recommandé)"
+msgid "Install from a URL"
+msgstr "Installer depuis une URL"
+msgid "For example: %url"
+msgstr "Par exemple : %url"
+msgid "Upload a module or theme archive to install"
+msgstr "Transférer une archive de module ou de thème à installer"
+msgid "For example: %filename from your local computer"
+msgstr "Par exemple : %filename depuis votre ordinateur local"
+msgid "You must either provide a URL or upload an archive file to install."
+msgstr ""
+"Vous devez soit fournir une URL, soit transférer une archive à "
+"installer."
+msgid "The provided URL is invalid."
+msgstr "L'URL fournie n'est pas valide."
+msgid "Unable to retrieve Drupal project from %url."
+msgstr "Impossible de récupérer le projet Drupal depuis %url."
+msgid "Provided archive contains no files."
+msgstr "L'archive spécifiée ne contient aucun fichier."
+msgid "Unable to determine %project name."
+msgstr "Impossible de déterminer le nom de %project."
+msgid "%project is already installed."
+msgstr "%project est déjà installé."
+msgid "Cannot extract %file, not a valid archive."
+msgstr "Impossible d'extraire %file, ce n'est pas une archive valide."
+msgid "Downloading %project"
+msgstr "Téléchargement de %project"
+msgid "Failed to download %project from %url"
+msgstr "Echec du téléchargement de %project depuis %url"
+msgid "Includes:"
+msgstr "Contient :"
+msgid "Enabled: %includes"
+msgstr "Activé : %includes"
+msgid "Disabled: %disabled"
+msgstr "Désactivé : %disabled"
+msgid "%base_theme (!base_label)"
+msgstr "%base_theme (!base_label)"
+msgid "Depends on: !basethemes"
+msgstr "Dépend de : !basethemes"
+msgid "Required by: %subthemes"
+msgstr "Requis par : %subthemes"
+msgid ""
+"The Update manager module periodically checks for new versions of your "
+"site's software (including contributed modules and themes), and alerts "
+"administrators to available updates. In order to provide update "
+"information, anonymous usage statistics are sent to Drupal.org. If "
+"desired, you may disable the Update manager module from the <a "
+"href='@modules'>Module administration page</a>. For more information, "
+"see the online handbook entry for <a href='@update'>Update manager "
+"module</a>."
+msgstr ""
+"Le module Update manager vérifie périodiquement s'il existe de "
+"nouvelles versions du logiciel de votre site (y compris les modules et "
+"thèmes contribués) et avertit les administrateurs des mises à jour "
+"disponibles. Afin de pouvoir fournir les informations de mise à jour, "
+"des statistiques d'usage anonymes sont envoyées à Drupal.org. Si "
+"vous le souhaitez, vous pouvez désactiver le module Update manager "
+"depuis la <a href='@modules'>Page d'administration des modules</a>. "
+"Pour plus d'information, voir la section <a href='@update'>Update "
+"manager</a> du manuel en ligne."
+msgid ""
+"The Update manager also allows administrators to update and install "
+"modules and themes through the administration interface."
+msgstr ""
+"Le Gestionnaire de mises à jour permet aussi aux administrateurs de "
+"mettre à jour et d'installer des modules et des thèmes au travers de "
+"l'interface d'administration."
+msgid "Checking for available updates"
+msgstr "Vérification des mises à jour disponibles"
+msgid ""
+"A report of <a href=\"@update-report\">available updates</a> will "
+"alert you when new releases are available for download. You may "
+"configure options for the frequency for checking updates (which are "
+"performed during <a href=\"@cron\">cron</a> runs) and e-mail "
+"notifications at the <a href=\"@update-settings\">Update manager "
+"settings</a>  page."
+msgstr ""
+"Un rapport des <a href=\"@update-report\">mises à jour "
+"disponibles</a> vous préviendra de la disponibilité au "
+"téléchargement de nouvelles versions. Vous pouvez configurer les "
+"options de fréquence de vérification des mises à jour (qui sont "
+"réalisées à l'exécution de la <a href=\"@cron\">tâche planifiée "
+"(cron) de maintenance</a>) et les notifications par courriel sur la "
+"page de <a href=\"@update-settings\">Paramètres du Gestionnaire de "
+"mises à jour</a>."
+msgid "Performing updates through the user interface"
+msgstr "Exécution des mises à jour au travers de l'interface utilisateur"
+msgid ""
+"The Update manager module allows administrators to perform updates "
+"directly through the administration interface. At the top of the <a "
+"href=\"@modules_page\">modules</a> and <a "
+"href=\"@themes_page\">themes</a> pages you will see a link to update "
+"to new releases. This will direct you to the <a "
+"href=\"@update-page\">update page</a> where you see a listing of all "
+"the missing updates and confirm which ones you want to upgrade. From "
+"there, you are prompted for your FTP/SSH password, which then "
+"transfers the files into your Drupal installation, overwriting your "
+"old files. More detailed instructions can be found in the <a "
+"href=\"@update\">online handbook</a>."
+msgstr ""
+"Le module Update manager permet aux administrateurs de réaliser des "
+"mises à jour directement par l'interface d'administration. En haut "
+"des pages de <a href=\"@modules_page\">modules</a> et <a "
+"href=\"@themes_page\">thèmes</a>, vous verrez un lien pour mettre à "
+"jour vers les nouvelles versions. Il vous amènera à la <a "
+"href=\"@update-page\">page de mise à jour</a>, où vous trouverez une "
+"liste de toutes les mises à jour manquantes, et confirmerez pour "
+"lesquelles vous voulez mettre à jour. A cet endroit, l'on vous "
+"demandera votre mot de passe FTP/SSH, qui tranfèrera alors les "
+"fichier vers votre installation Drupal, écrasant vos anciens "
+"fichiers. Vous pouvez trouver plus d'instructions détaillées dans le "
+"<a href=\"@update\">manuel en ligne</a>."
+msgid "Installing new modules and themes through the user interface"
+msgstr ""
+"Installation de nouveaux modules et de nouveaux thèmes à partir de "
+"l'interface utilisateur"
+msgid ""
+"You can also install new modules and themes in the same fashion, "
+"through the <a href=\"@install\">install page</a>, or by clicking the "
+"<em>Install new module/theme</em> link at the top of the <a "
+"href=\"@modules_page\">modules</a> and <a "
+"href=\"@themes_page\">themes</a> pages. In this case, you are prompted "
+"to provide either the URL to the download, or to upload a packaged "
+"release file from your local computer."
+msgstr ""
+"Vous pouvez aussi installer de nouveaux modules et thèmes par la "
+"même méthode, par la <a href=\"@install\">page d'installation</a>, "
+"ou en cliquant sur le lien <em>Installer un nouveau module/thème</em> "
+"en haut des pages de <a href=\"@modules_page\">modules</a> et <a "
+"href=\"@themes_page\">thèmes</a>. Le cas échéant, l'on vous "
+"demandera de fournir soit une URL du téléchargement, soit de "
+"transférer un fichier packagé de la version depuis votre ordinateur "
+"local."
+msgid ""
+"No update information available. <a href=\"@run_cron\">Run cron</a> or "
+"<a href=\"@check_manually\">check manually</a>."
+msgstr ""
+"Aucune information de mise à jour disponible. <a "
+"href=\"@run_cron\">Lancer la tâche planifiée (cron)</a> ou <a "
+"href=\"@check_manually\">vérifier manuellement</a>."
+msgid ""
+"You can automatically install your missing updates using the Update "
+"manager:"
+msgstr ""
+"Vous pouvez installer automatiquement vos mises à jour manquantes en "
+"utilisant le Gestionnaire de mise à jour :"
+msgid ""
+"Your site is currently configured to send these emails when any "
+"updates are available. To get notified only for security updates, "
+"!url."
+msgstr ""
+"Votre site est actuellement configuré pour envoyer ces courriels "
+"lorsqu'une mise à jour est disponible. Pour n'être prévenu que pour "
+"les mises à jour de sécurité, !url."
+msgid ""
+"Your site is currently configured to send these emails only when "
+"security updates are available. To get notified for any available "
+"updates, !url."
+msgstr ""
+"Votre site est actuellement configuré pour envoyer ces courriels "
+"seulement lorsque des mises à jour de sécurité sont disponilbles. "
+"Pour être prévenu de toute mise à jour disponible, !url."
+msgid ""
+"The installed version of at least one of your modules or themes is no "
+"longer supported. Upgrading or disabling is strongly recommended. See "
+"the project homepage for more details."
+msgstr ""
+"La version installée comporte au moins un module ou un thème qui "
+"n'est plus supporté à ce jour. Le mettre à jour ou le désactiver "
+"est fortement recommandé. Veuillez consulter la page d'accueil du "
+"projet en question pour plus de détails."
+msgid ""
+"There was a problem checking <a href=\"@update-report\">available "
+"updates</a> for Drupal."
+msgstr ""
+"Il y a eu un problème à la vérification des <a "
+"href=\"@update-report\">mises à jour disponibles</a> pour Drupal."
+msgid ""
+"There was a problem checking <a href=\"@update-report\">available "
+"updates</a> for your modules or themes."
+msgstr ""
+"Il y a eu un problème à la vérification des <a "
+"href=\"@update-report\">mises à jour disponibles</a> pour vos modules "
+"ou thèmes."
+msgid ""
+"See the <a href=\"@available_updates\">available updates</a> page for "
+"more information and to install your missing updates."
+msgstr ""
+"Consultez la page des <a href=\"@available_updates\">mises à jour "
+"disponibles</a> pour plus d'informations et pour installer les mises "
+"à jour manquantes."
+msgid "Ready to update"
+msgstr "Prêt pour la mise à jour"
+msgid "Update manager"
+msgstr "Gestionnaire de mises à jour"
+msgid ""
+"Checks for available updates, and can securely install or update "
+"modules and themes via a web interface."
+msgstr ""
+"Vérifie les mises à jour disponibles, et peut installer ou mettre à "
+"jour de manière sécurisée vos modules et thèmes via une interface "
+"web."
+msgid "No people available."
+msgstr "Personne n'est disponible."
+msgid ""
+"This role will be automatically assigned new permissions whenever a "
+"module is enabled. Changing this setting will not affect existing "
+"permissions."
+msgstr ""
+"Les nouvelles permissions de tout nouveau module activé seront "
+"automatiquement attribuées à ce rôle. Changer ce paramètre "
+"n'affectera pas les permissions existantes."
+msgid "Registration and cancellation"
+msgstr "Inscription et annulation"
+msgid "Who can register accounts?"
+msgstr "Qui peut enregistrer des comptes ?"
+msgid "Administrators only"
+msgstr "Administrateurs seulement"
+msgid "Visitors, but administrator approval is required"
+msgstr "Les visiteurs, mais l'approbation d'un administrateur est requise"
+msgid "Require e-mail verification when a visitor creates an account."
+msgstr ""
+"Exiger la vérification de l'adresse de courriel lorsqu'un visiteur "
+"crée un compte."
+msgid ""
+"New users will be required to validate their e-mail address prior to "
+"logging into the site, and will be assigned a system-generated "
+"password. With this setting disabled, users will be logged in "
+"immediately upon registering, and may select their own passwords "
+"during registration."
+msgstr ""
+"Les nouveaux utilisateurs seront obligés de valider leur adresse de "
+"courriel avant de se connecter au site et un mot de passe généré "
+"par le système leur sera assigné. Si ce paramètre est désactivé, "
+"les utilisateurs seront connectés immédiatement après leur "
+"inscription, et pourront définir leur propre mot de passe lors de "
+"l'inscription."
+msgid "When cancelling a user account"
+msgstr "Lors de l'annulation d'un compte utilisateur"
+msgid ""
+"Users with the %select-cancel-method or %administer-users <a "
+"href=\"@permissions-url\">permissions</a> can override this default "
+"method."
+msgstr ""
+"Les utilisateurs avec les <a href=\"@permissions-url\">droits</a> "
+"%select-cancel-method ou %administer-users peuvent supplanter cette "
+"méthode par défaut."
+msgid "Select method for cancelling account"
+msgstr "Choisissez une méthode pour annuler un compte"
+msgid "Administer users"
+msgstr "Administrer les utilisateurs"
+msgid "Personalization"
+msgstr "Personnalisation"
+msgid "Enable signatures."
+msgstr "Activer les signatures."
+msgid "The directory %directory does not exist or is not writable."
+msgstr ""
+"Le répertoire %directory n'existe pas ou n'est pas accessible en "
+"écriture."
+msgid "Enable user pictures."
+msgstr "Activer les images des utilisateurs."
+msgid "Picture directory"
+msgstr "Répertoire des images"
+msgid "Picture display style"
+msgstr "Style d'affichage des images"
+msgid ""
+"The style selected will be used on display, while the original image "
+"is retained. Styles may be configured in the <a href=\"!url\">Image "
+"styles</a> administration area."
+msgstr ""
+"Le style sélectionné sera utilisé à l'affichage, alors que l'image "
+"originale sera conservée. Les styles peuvent être configurés depuis "
+"la zone d'administration <a href=\"!url\">Style des images</a>."
+msgid "Picture upload dimensions"
+msgstr "Dimensions pour le transfert des images"
+msgid "Picture upload file size"
+msgstr "Taille de fichier pour le transfert des images"
+msgid "E-mails"
+msgstr "Courriels"
+msgid "Welcome (new user created by administrator)"
+msgstr "Bienvenue (nouvel utilisateur créé par un administrateur)"
+msgid ""
+"Edit the welcome e-mail messages sent to new member accounts created "
+"by an administrator."
+msgstr ""
+"Modifier les courriels de bienvenue envoyés aux nouveaux comptes "
+"utilisateur créés par un administrateur."
+msgid "Welcome (awaiting approval)"
+msgstr "Bienvenue (en attente d'approbation)"
+msgid ""
+"Edit the welcome e-mail messages sent to new members upon registering, "
+"when administrative approval is required."
+msgstr ""
+"Modifier les courriels de bienvenue envoyés aux nouveaux membres lors "
+"de leur inscription, lorsqu'une approbation administrative est "
+"requise."
+msgid "Welcome (no approval required)"
+msgstr "Bienvenue (aucune approbation requise)"
+msgid ""
+"Edit the welcome e-mail messages sent to new members upon registering, "
+"when no administrator approval is required."
+msgstr ""
+"Modifier les courriels de bienvenue envoyés aux nouveaux membres lors "
+"de leur inscription, lorsqu'aucune approbation administrative n'est "
+"requise."
+msgid "Password recovery"
+msgstr "Récupération de mot de passe"
+msgid "Edit the e-mail messages sent to users who request a new password."
+msgstr ""
+"Modifier les courriels envoyés aux utilisateurs demandant un nouveau "
+"mot de passe."
+msgid "Account activation"
+msgstr "Activation du compte"
+msgid ""
+"Enable and edit e-mail messages sent to users upon account activation "
+"(when an administrator activates an account of a user who has already "
+"registered, on a site where administrative approval is required)."
+msgstr ""
+"Activer et modifier les courriels envoyés aux utilisateurs à "
+"l'activation de leur compte (lorsqu'un administrateur active le compte "
+"d'un utilisateur qui s'est inscrit sur un site où l'approbation "
+"administrative est requise)."
+msgid ""
+"Enable and edit e-mail messages sent to users when their accounts are "
+"blocked."
+msgstr ""
+"Activer et modifier les courriels envoyés aux utilisateurs lorsque "
+"leur compte est bloqué."
+msgid "Account cancellation confirmation"
+msgstr "Confirmation de l'annulation du compte"
+msgid ""
+"Edit the e-mail messages sent to users when they attempt to cancel "
+"their accounts."
+msgstr ""
+"Modifier les courriels envoyés aux utilisateurs lorsqu'ils demandent "
+"l'annulation de leur compte."
+msgid "Account canceled"
+msgstr "Compte annulé"
+msgid ""
+"Enable and edit e-mail messages sent to users when their accounts are "
+"canceled."
+msgstr ""
+"Activer et modifier les courriels envoyés aux utilisateurs lorsque "
+"leur compte est annulé."
+msgid "Notify user when account is canceled."
+msgstr "Notifier l'utilisateur lorsque son compte est annulé."
+msgid "The role name %name already exists. Choose another role name."
+msgstr "Le nom de rôle %name existe déjà. Choisissez un autre nom de rôle."
+msgid ""
+"You are logged in as %user. <a href=\"!user_edit\">Change your "
+"password.</a>"
+msgstr ""
+"Vous êtes connecté en tant que %user. <a "
+"href=\"!user_edit\">Modifiez votre mot de passe.</a>"
+msgid ""
+"Another user (%other_user) is already logged into the site on this "
+"computer, but you tried to use a one-time link for user "
+"%resetting_user. Please <a href=\"!logout\">logout</a> and try using "
+"the link again."
+msgstr ""
+"Un autre utilisateur (%other_user) est déjà connecté à ce site "
+"depuis cet ordinateur, mais vous avez essayé d'utiliser un lien "
+"unique pour l'utilisateur %resetting_user. Veuillez vous <a "
+"href=\"!logout\">déconnecter</a> et essayer d'utiliser à nouveau ce "
+"lien."
+msgid "The one-time login link you clicked is invalid."
+msgstr ""
+"Le lien de connexion unique sur lequel vous avez cliqué n'est pas "
+"valide."
+msgid ""
+"You have just used your one-time login link. It is no longer necessary "
+"to use this link to log in. Please change your password."
+msgstr ""
+"Vous venez d'utiliser votre lien de connexion unique. Il n'est "
+"désormais plus nécessaire d'utiliser ce lien pour vous connecter. "
+"Veuillez modifier votre mot de passe."
+msgid ""
+"<p>This is a one-time login for %user_name and will expire on "
+"%expiration_date.</p><p>Click on this button to log in to the site and "
+"change your password.</p>"
+msgstr ""
+"<p>Ceci est une connexion unique pour %user_name qui expirera le "
+"%expiration_date.</p><p>Cliquez sur ce bouton pour vous connecter au "
+"site et modifier votre mot de passe.</p>"
+msgid ""
+"You have tried to use a one-time login link that has either been used "
+"or is no longer valid. Please request a new one using the form below."
+msgstr ""
+"Vous avez tenté d'utiliser un lien de connexion unique qui a déjà "
+"été utilisé ou n'est plus valide. Veuillez en demander un nouvau en "
+"utilisant le formulaire ci-dessous."
+msgid "When cancelling your account"
+msgstr "Lors de l'annulation de votre compte"
+msgid "When cancelling the account"
+msgstr "A l'annulation du compte"
+msgid "Require e-mail confirmation to cancel account."
+msgstr "Demander un e-mail de confirmation pour annuler le compte."
+msgid ""
+"When enabled, the user must confirm the account cancellation via "
+"e-mail."
+msgstr ""
+"Si activé, l'utilisateur doit confirmer l'annulation du compte par "
+"courriel."
+msgid ""
+"When enabled, the user will receive an e-mail notification after the "
+"account has been cancelled."
+msgstr ""
+"Si activé, l'utilisateur recevra une notification par courriel après "
+"l'annulation du compte."
+msgid "Are you sure you want to cancel your account?"
+msgstr "Etes-vous sûr(e) de vouloir annuler votre compte ?"
+msgid "Are you sure you want to cancel the account %name?"
+msgstr "Êtes-vous sûr(e) de vouloir annuler le compte %name ?"
+msgid "Select the method to cancel the account above."
+msgstr "Choisir la méthode pour annuler le compte ci-dessus."
+msgid ""
+"A confirmation request to cancel your account has been sent to your "
+"e-mail address."
+msgstr ""
+"Une demande de confirmation d'annulation de votre compte a été "
+"envoyée à votre adresse de courriel."
+msgid ""
+"Your account will be blocked and you will no longer be able to log in. "
+"All of your content will remain attributed to your user name."
+msgstr ""
+"Votre compte sera bloqué et vous ne serez plus autorisé à vous "
+"connecter. Tout vos contenus resteront attribués à votre nom "
+"d'utilisateur."
+msgid ""
+"Your account will be blocked and you will no longer be able to log in. "
+"All of your content will be hidden from everyone but administrators."
+msgstr ""
+"Votre compte sera bloqué et vous ne serez plus autorisé à vous "
+"connecter. Tout vos contenus seront cachés de tous les utilisateurs, "
+"sauf des administrateurs."
+msgid ""
+"Your account will be removed and all account information deleted. All "
+"of your content will be assigned to the %anonymous-name user."
+msgstr ""
+"Votre compte sera supprimé et toutes les informations du compte "
+"supprimées. Tous vos contenus seront assignés à l'utilisateur "
+"%anonymous-name."
+msgid ""
+"Your account will be removed and all account information deleted. All "
+"of your content will also be deleted."
+msgstr ""
+"Votre compte sera supprimé et toutes les informations du compte "
+"supprimées. Tous vos contenus seront aussi supprimés."
+msgid ""
+"You have tried to use an account cancellation link that has expired. "
+"Please request a new one using the form below."
+msgstr ""
+"Vous avez essayé d'utiliser un lien d'annulation de compte ayant "
+"expiré. Veuillez en demander un nouvau en utilisant le formulaire "
+"ci-dessous."
+msgid "Sent account cancellation request to %name %email."
+msgstr "Une demande d'annulation de compte a été envoyée à %name %email."
+msgid "Tokens related to individual user accounts."
+msgstr "Jetons relatifs aux comptes individuels d'utilisateur"
+msgid "Tokens related to the currently logged in user."
+msgstr "Jetons associés à l'utilisateur actuellement connecté"
+msgid ""
+"The User module allows users to register, log in, and log out. It also "
+"allows users with proper permissions to manage user roles (used to "
+"classify users) and permissions associated with those roles. For more "
+"information, see the online handbook entry for <a href=\"@user\">User "
+"module</a>."
+msgstr ""
+"Le module User permet aux utilisateurs de s'inscrire, se connecter, et "
+"se déconnecter. Il permet aussi aux utilisateurs possédant les "
+"droits appropriés d'administrer les rôles utilisateur (utilisés "
+"pour classer les utilisateurs), et les droits associés à ces rôles. "
+"Pour plus d'information, consultez la section sur le <a "
+"href=\"@user\">module User</a> dans le manuel en ligne ."
+msgid "Creating and managing users"
+msgstr "Création et administration des utilisateurs"
+msgid ""
+"The User module allows users with the appropriate <a "
+"href=\"@permissions\">permissions</a> to create user accounts through "
+"the <a href=\"@people\">People administration page</a>, where they can "
+"also assign users to one or more roles, and block or delete user "
+"accounts. If allowed, users without accounts (anonymous users) can "
+"create their own accounts on the <a href=\"@register\">Create new "
+"account</a> page."
+msgstr ""
+"Le module utilisateur permet aux utilisateurs possédant les <a "
+"href=\"@permissions\">permissions</a> appropriées de créer des "
+"comptes utilisateur à travers la <a href=\"@people\">page "
+"administration des utilisateurs</a>, où ils peuvent également "
+"affecter les utilisateurs à un ou plusieurs rôles, et bloquer ou "
+"supprimer des comptes utilisateurs.  Si c'est autorisé, les "
+"utilisateurs sans compte (utilisateurs anonymes) peuvent créer leurs "
+"propres comptes sur la page <a href=\"@register\"> Créer un nouveau "
+"compte</a>."
+msgid "User roles and permissions"
+msgstr "Rôles et droits des utilisateurs"
+msgid ""
+"<em>Roles</em> are used to group and classify users; each user can be "
+"assigned one or more roles. By default there are two roles: "
+"<em>anonymous user</em> (users that are not logged in) and "
+"<em>authenticated user</em> (users that are registered and logged in). "
+"Depending on choices you made when you installed Drupal, the "
+"installation process may have defined more roles, and you can create "
+"additional custom roles on the <a href=\"@roles\">Roles page</a>. "
+"After creating roles, you can set permissions for each role on the <a "
+"href=\"@permissions_user\">Permissions page</a>. Granting a permission "
+"allows users who have been assigned a particular role to perform an "
+"action on the site, such as viewing a particular type of content, "
+"editing or creating content, administering settings for a particular "
+"module, or using a particular function of the site (such as search)."
+msgstr ""
+"Les <em>rôles</em> sont utilisés pour grouper et classer les "
+"utilisateurs ; chaque utilisateur peut être assigné à un ou "
+"plusieurs rôles. Par défaut, il y a deux rôles: l'<em>utilisateur "
+"anonyme</em> (les utilisateurs qui ne sont pas enregistrés) et "
+"l'<em>utilisateur authentifié</em> (les utilisateurs qui sont "
+"enregistrés et connectés). En fonction des choix que vous avez fait "
+"lors de l'installation de Drupal, le processus d'installation a "
+"peut-être défini d'autres rôles, and vous pouvez définir d'autres "
+"rôles personnalisés sur la <a href=\"@roles\">page des rôles</a>. "
+"Après avoir créer les rôles, vous pouvez leur assigner des droits "
+"sur <a href=\"@permissions_user\">la page des droits</a>. Accorder un "
+"droit permet aux utilisateurs d'un rôle particulier d'accomplir des "
+"actions sur le site, comme voir certains types de contenu, modifier ou "
+"créer du contenu, administrer les paramètres de certains modules, ou "
+"encore utiliser une fonctionnalité particulière sur le site (comme "
+"la recherche)."
+msgid ""
+"The <a href=\"@accounts\">Account settings page</a> allows you to "
+"manage settings for the displayed name of the anonymous user role, "
+"personal contact forms, user registration, and account cancellation. "
+"On this page you can also manage settings for account personalization "
+"(including signatures and user pictures), and adapt the text for the "
+"e-mail messages that are sent automatically during the user "
+"registration process."
+msgstr ""
+"La <a href=\"@accounts\">Page des paramètres de compte</a> vous "
+"permet d'administrer les paramètres pour le nom affiché du rôle "
+"utilisateur anonyme, les formulaires de contact personnels, "
+"l'inscription utilisateur, et l'annulation de compte. Sur cette page, "
+"vous pourrez aussi administrer les paramètres de personnalisation des "
+"comptes (y compris les signatures et les images utilisateur), et "
+"adapter le texte des messages e-mail qui sont envoyés automatiquement "
+"lors du processus d'inscription utilisateur."
+msgid "By default, Drupal comes with two user roles:"
+msgstr "Par défaut, Drupal est fourni avec deux rôles utilisateur :"
+msgid ""
+"Anonymous user: this role is used for users that don't have a user "
+"account or that are not authenticated."
+msgstr ""
+"Utilisateur anonyme : ce rôle est utilisé pour les utilisateurs qui "
+"ne possèdent pas de compte utilisateur, ou qui ne sont pas "
+"authentifiés."
+msgid ""
+"Authenticated user: this role is automatically granted to all logged "
+"in users."
+msgstr ""
+"Utilisateur authentifié : ce rôle est automatiquement attribué à "
+"tous les utilisateurs connectés."
+msgid ""
+"This form lets administrators add, edit, and arrange fields for "
+"storing user data."
+msgstr ""
+"Ce formulaire permet aux administrateurs d'ajouter, modifier et "
+"d'organiser les champs qui permettent de stocker les données "
+"utilisateur."
+msgid ""
+"This form lets administrators configure how fields should be displayed "
+"when rendering a user profile page."
+msgstr ""
+"Ce formulaire permet aux administrators de configurer la manière sont "
+"les champs doivent être affichés au rendu d'une page de profil "
+"utilisateur."
+msgid "User module timezone form element."
+msgstr "Élément de formulaire \"fuseau horaire\" du module User"
+msgid "User module history view element."
+msgstr "Elément d'affichage de l'historique du module User"
+msgid "Administer permissions"
+msgstr "Administrer les droits"
+msgid "View user profiles"
+msgstr "Voir les profils utilisateur"
+msgid "Change own username"
+msgstr "Modifier son propre nom d'utilisateur"
+msgid "Cancel own user account"
+msgstr "Annuler son propre compte utilisateur"
+msgid ""
+"Note: content may be kept, unpublished, deleted or transferred to the "
+"%anonymous-name user depending on the configured <a "
+"href=\"@user-settings-url\">user settings</a>."
+msgstr ""
+"Note : le contenu peut être conservé, dépublié, supprimé ou "
+"transféré à l'utilisateur %anonymous-name, en fonction des <a "
+"href=\"@user-settings-url\">paramètres utilisateur</a> configurés."
+msgid "Select method for cancelling own account"
+msgstr "Choisir la méthode de suppression de votre compte"
+msgid ""
+"Spaces are allowed; punctuation is not allowed except for periods, "
+"hyphens, apostrophes, and underscores."
+msgstr ""
+"Les espaces sont autorisés ; la ponctuation n'est pas autorisée à "
+"l'exception des points, traits d'union, apostrophes et tirets bas."
+msgid "The signature is too long: it must be %max characters or less."
+msgstr ""
+"La signature est trop longue : elle doit contenir %max caractères ou "
+"moins."
+msgid ""
+"Sorry, too many failed login attempts from your IP address. This IP "
+"address is temporarily blocked. Try again later or <a "
+"href=\"@url\">request a new password</a>."
+msgstr ""
+"Désolé, trop de tentatives de connexion échouées depuis votre "
+"adresse IP. Cette adresse IP est temporairement bloquée. Veuillez "
+"ré-essayer plus tard ou <a href=\"@url\">demander un nouveau mot  de "
+"passe</a>."
+msgid "Cancelling account"
+msgstr "Annulation du compte"
+msgid "Cancelling user account"
+msgstr "Annulation du compte de l'utilisateur"
+msgid "%name has been disabled."
+msgstr "%name a été désactivé."
+msgid "Account details for [user:name] at [site:name]"
+msgstr "Détails du compte [user:name] sur [site:name]"
+msgid "An administrator created an account for you at [site:name]"
+msgstr "Un administrateur a créé un compte pour vous sur [site:name]"
+msgid ""
+"Account details for [user:name] at [site:name] (pending admin "
+"approval)"
+msgstr ""
+"Détails du compte [user:name] sur [site:name] (en attente "
+"d'approbation)"
+msgid ""
+"[user:name],\n"
+"\n"
+"Thank you for registering at [site:name]. Your application for an "
+"account is currently pending approval. Once it has been approved, you "
+"will receive another e-mail containing information about how to log "
+"in, set your password, and other details.\n"
+"\n"
+"\n"
+"--  [site:name] team"
+msgstr ""
+"[user:name],\r\n"
+"\r\n"
+"Merci pour votre inscription sur [site:name]. Votre demande de compte "
+"est actuellement en attente d'approbation. Quand elle aura été "
+"acceptée, vous recevrez un autre courriel contenant les informations "
+"pour vous connecter, définir votre mot de passe et d'autres "
+"détails.\r\n"
+"\r\n"
+"\r\n"
+"--  L'équipe [site:name]"
+msgid ""
+"[user:name] has applied for an account.\n"
+"\n"
+"[user:edit-url]"
+msgstr ""
+"[user:name] a demandé l'ouverture d'un compte.\r\n"
+"\r\n"
+"[user:edit-url]"
+msgid "Replacement login information for [user:name] at [site:name]"
+msgstr ""
+"Informations de remplacement de connexion pour [user:name] sur "
+"[site:name]"
+msgid "Account details for [user:name] at [site:name] (approved)"
+msgstr "Détails du compte [user:name] sur [site:name] (approuvé)"
+msgid "Account details for [user:name] at [site:name] (blocked)"
+msgstr "Détails du compte [user:name] sur [site:name] (bloqué)"
+msgid "Account cancellation request for [user:name] at [site:name]"
+msgstr "Demande d'annulation de compte pour [user:name] sur [site:name]"
+msgid "Account details for [user:name] at [site:name] (canceled)"
+msgstr "Détails du compte [user:name] sur [site:name] (annulé)"
+msgid "Cancel the selected user accounts"
+msgstr "Annuler les comptes utilisateur sélectionnés"
+msgid "The user account %name cannot be cancelled."
+msgstr "Le compte de l'utilisateur %name ne peut pas être annulé."
+msgid "When cancelling these accounts"
+msgstr "Lors de l'annulation de ces comptes"
+msgid "Are you sure you want to cancel these user accounts?"
+msgstr "Etes vous sûr(e) de vouloir annuler ces comptes utilisateur ?"
+msgid "Cancel accounts"
+msgstr "Supprimer des comptes"
+msgid "To make your password stronger:"
+msgstr "Pour renforcer la sécurité de votre mot de passe :"
+msgid "Make it at least 6 characters"
+msgstr "Saisissez au moins 6 caractères"
+msgid "Add lowercase letters"
+msgstr "Ajoutez des lettres minuscules"
+msgid "Add uppercase letters"
+msgstr "Ajoutez des lettres majuscules"
+msgid "Add numbers"
+msgstr "Ajoutez des chiffres"
+msgid "Add punctuation"
+msgstr "Ajoutez des caractères de ponctuation"
+msgid "Make it different from your username"
+msgstr "Le mot de passe doit être différent du nom d'utilisateur"
+msgid "Weak"
+msgstr "Faible"
+msgid "Fair"
+msgstr "Correct"
+msgid "Blocked user: %name %email."
+msgstr "Utilisateur bloqué : %name %email."
+msgid "There is currently 1 user online."
+msgid_plural "There are currently @count users online."
+msgstr[0] "Il y a actuellement @count utilisateur connecté."
+msgstr[1] "Il y a actuellement @count utilisateurs connectés."
+msgid ""
+"Sorry, there has been more than one failed login attempt for this "
+"account. It is temporarily blocked. Try again later or <a "
+"href=\"@url\">request a new password</a>."
+msgid_plural ""
+"Sorry, there have been more than @count failed login attempts for this "
+"account. It is temporarily blocked. Try again later or <a "
+"href=\"@url\">request a new password</a>."
+msgstr[0] ""
+"Désolé, il y a eu plus d'un essai de connexion raté pour ce compte. "
+"Il a été temporairement bloqué. Recommencer plus tard ou <a "
+"href=\"@url\">faites une demande de nouveau mot de passe</a>."
+msgstr[1] ""
+"Désolé, il y a eu plus de @count essais de connexion ratés pour ce "
+"compte. Il a été temporairement bloqué. Recommencer plus tard ou <a "
+"href=\"@url\">faites une demande de nouveau mot de passe</a>."
+msgid "Find and manage people interacting with your site."
+msgstr "Chercher et gérer les personnes qui utilisent votre site."
+msgid "Confirm account cancellation"
+msgstr "Confirmer l’annulation du compte"
+msgid "User passwords rehashed to improve security"
+msgstr ""
+"Les mots de passe utilisateur ont été ré-encryptés pour renforcer "
+"la sécurité"
+msgid "Migrated user time zones"
+msgstr "Les fuseaux horaires de l'utilisateur ont été migrés"
+msgid "Minimal"
+msgstr "Minimal"
+msgid "Start with only a few modules enabled."
+msgstr "Commencer avec seulement quelques modules activés."
+msgid "Basic page"
+msgstr "Page de base"
+msgid ""
+"Use <em>basic pages</em> for your static content, such as an 'About "
+"us' page."
+msgstr ""
+"Utilisez les <em>pages de base</em> pour votre contenu statique, tel "
+"que la page 'Qui sommes-nous'."
+msgid "Use tags to group articles on similar topics into categories."
+msgstr ""
+"Utilisez les étiquettes pour regrouper les articles sur des sujets "
+"similaires dans des catégories."
+msgid "Enter a comma-separated list of words to describe your content."
+msgstr ""
+"Saisissez une liste de mots séparés par des virgules pour décrire "
+"votre contenu."
+msgid "Install with commonly used features pre-configured."
+msgstr ""
+"Installer avec les fonctionnalités couramment utilisées "
+"pré-configurées."
+msgid "Content width"
+msgstr "Largeur du contenu"
+msgid "Fluid width"
+msgstr "Largeur variable"
+msgid "Fixed width"
+msgstr "Largeur fixe"
+msgid ""
+"Specify whether the content will wrap to a fixed width or will fluidly "
+"expand to the width of the browser window."
+msgstr ""
+"Spécifiez si le contenu aura une largeur fixe, ou s'il s'adaptera de "
+"manière fluide à la largeur de la fenêtre du navigateur."
+msgid ""
+"A multi-column theme which can be configured to modify colors and "
+"switch between fixed and fluid width layouts."
+msgstr ""
+"Un thème à colonnes multiples qui peut être paramétré pour "
+"modifier les couleurs et pour alterner entre mise en page à largeur "
+"fixe ou s'adaptant à la largeur de la fenêtre du navigateur "
+"(fluide)."
+msgid "A simple one-column, tableless, fluid width administration theme."
+msgstr ""
+"Un thème d'administration simple en une colonne, sans table, à "
+"largeur fluide."
+msgid ""
+"This theme demonstrates Drupal's default HTML markup and CSS styles. "
+"To learn how to build your own theme and override Drupal's default "
+"code, see the <a href=\"http://drupal.org/theme-guide\">Theming "
+"Guide</a>."
+msgstr ""
+"Ce thème illustre le balisage HTML et les styles CSS par défaut de "
+"Drupal. Pour apprendre à construire votre propre thème et supplanter "
+"le code par défaut de Drupal, voyez le <a "
+"href=\"http://drupal.org/theme-guide\">guide de theming</a>."
+msgid "Image style"
+msgstr "Style d'image"
+msgid ""
+"1 pending update (@number_applied to be applied, @number_incompatible "
+"skipped)"
+msgid_plural ""
+"@count pending updates (@number_applied to be applied, "
+"@number_incompatible skipped)"
+msgstr[0] ""
+"1 mise à jour en attente (@number_applied à appliquer, "
+"@number_incompatible ignorée)"
+msgstr[1] ""
+"@count mises à jour en attente (@number_applied à appliquer, "
+"@number_incompatible ignorées)"
+msgid ""
+"The Blog module allows registered users to maintain an online journal, "
+"or <em>blog</em>. Blogs are made up of individual <em>blog "
+"entries</em>. By default, the blog entries are displayed by creation "
+"time in descending order, with comments enabled, and are promoted to "
+"the site's front page. For more information, see the online handbook "
+"entry for <a href='@blog'>Blog module</a>."
+msgstr ""
+"Le module Blog permet aux utilisateurs inscrits d'entretenir un "
+"journal en ligne ou <em>blog</em>. Les blogs sont constitués de "
+"<em>billets</em>. Par défaut, les billets sont affichés en première "
+"page par ordre décroissant de date de création et les commentaires "
+"sont activés. Pour plus d'informations, voir la section <a "
+"href='@blog'>module Blog</a> du manuel en ligne."
+msgid "Author textfield"
+msgstr "Champ texte Auteur"
+msgid "Subject textfield"
+msgstr "Champ texte Sujet"
+msgid "A contact form with category %category already exists."
+msgstr "Un formulaire de contact avec la catégorie %category existe déjà."
+msgid "Hello !recipient-name,"
+msgstr "Bonjour !recipient-name,"
+msgid ""
+"Attempt to create an instance of a field @field_name that doesn't "
+"exist or is currently inactive."
+msgstr ""
+"Tentative de créer une instance d'un champ @field_name qui n'existe "
+"pas ou qui est actuellement inactif."
+msgid ""
+"Attempt to create an instance of field @field_name on bundle @bundle "
+"that already has an instance of that field."
+msgstr ""
+"Tentative de créer une instance d'un champ @field_name sur le paquet "
+"@bundle qui a déjà une instance de ce champ."
+msgid "Field API to add fields to entities like nodes and users."
+msgstr ""
+"API afin d'ajouter des champs sur des entités tels que des nœuds ou "
+"des utilisateurs."
+msgid "Overview of fields on all entity types."
+msgstr "Aperçu des champs de tout type d'entités."
+msgid "Configuring text formats"
+msgstr "Configuration des formats de texte"
+msgid ""
+"Configure text formats on the <a href=\"@formats\">Text formats "
+"page</a>. <strong>Improper text format configuration is a security "
+"risk</strong>. To ensure security, untrusted users should only have "
+"access to text formats that restrict them to either plain text or a "
+"safe set of HTML tags, since certain HTML tags can allow embedding "
+"malicious links or scripts in text. More trusted registered users may "
+"be granted permission to use less restrictive text formats in order to "
+"create rich content."
+msgstr ""
+"Configurez les formats de texte dans la page <a "
+"href=\"@formats\"><em>Formats de texte</em></a>.<strong>Une mauvaise "
+"configuration des formats de texte constitue un risque de "
+"sécurité.</strong>Pour garantir la sécurité de votre site, les "
+"utilisateurs non vérifiés ne devraient avoir accès qu'aux formats "
+"qui les limitent à du texte brut ou à un ensemble de balises HTML "
+"sûres (certaines balises HTML permettent d'inclure des liens ou des "
+"scripts malicieux). Les utilisateurs de confiance devraient disposer "
+"de formats de textes plus permissifs leur permettant de créer des "
+"contenus plus riches."
+msgid ""
+"Users with access to more than one text format can use the <em>Text "
+"format</em> fieldset to choose between available text formats when "
+"creating or editing multi-line content. Administrators can define the "
+"text formats available to each user role, and control the order of "
+"formats listed in the <em>Text format</em> fieldset on the <a "
+"href=\"@text-formats\">Text formats page</a>."
+msgstr ""
+"Les utilisateurs qui ont accès à plus d'un format de texte peuvent "
+"utiliser le groupe de champs <em>Format texte</em> pour choisir entre "
+"les formats disponibles lorsqu'ils créent ou modifient un contenu "
+"multiligne. Les administrateurs peuvent définir les formats texte "
+"disponibles pour chaque rôle utilisateur et contrôler l'ordre des "
+"formats listés dans le groupe de champs <em>Format texte</em> à "
+"partir de la <a href=\"@text-formats\">page Formats texte</a>."
+msgid ""
+"Text formats define the HTML tags, code, and other formatting that can "
+"be used when entering text. <strong>Improper text format configuration "
+"is a security risk</strong>. Learn more on the <a "
+"href=\"@filterhelp\">Filter module help page</a>."
+msgstr ""
+"Les formats texte définissent les balises HTML, code et autre "
+"formatage qui peuvent être utilisés lors de la saisie d'un texte. "
+"<strong>Une configuration erronée des formats texte est une menace "
+"pour la sécurité</strong>. Pour plus d'informations, référez-vous "
+"à la <a href=\"@filterhelp\">page d'aide du module Filter</a>."
+msgid "Show more content"
+msgstr "Voir plus de contenu"
+msgid "Collapse"
+msgstr "Replier"
+msgid ""
+"The testing framework requires the DOMDocument class to be available. "
+"Check the configure command at the <a href=\"@link-phpinfo\">PHP info "
+"page</a>."
+msgstr ""
+"Le framework Testing nécessite que la classe DOMDocument soit "
+"disponible. Vérifiez la commande <em>configure</em> sur la <a "
+"href=\"@link-phpinfo\">page d'information PHP</a>."
+msgid "Error messages to display"
+msgstr "Messages d'erreur à afficher"
+msgid ""
+"It is recommended that sites running on production environments do not "
+"display any errors."
+msgstr ""
+"Il est recommandé aux sites fonctionnant dans un environnement de "
+"production de ne pas afficher les erreurs."
+msgid "Cannot open %file_path"
+msgstr "Impossible d'ouvrir %file_path"
+msgid "Term name textfield"
+msgstr "Champ texte nom du terme"
+msgid "Term description textarea"
+msgstr "Zone de texte de description du terme"
+msgid ""
+"Password reset instructions will be mailed to %email. You must log out "
+"to use the password reset link in the e-mail."
+msgstr ""
+"Instructions de réinitialisation de mot de passe envoyées à %email. "
+"Vous devez vous déconnecter pour utiliser le lien de "
+"réinitialisation de mot de passe situé dans le courriel."
+msgid ""
+"Enter your current password to change the %mail or %pass. "
+"!request_new."
+msgstr ""
+"Saisissez votre mot de passe actuel pour changer votre %mail ou votre "
+"%pass. !request_new."
+msgid "Current password"
+msgstr "Mot de passe actuel"
+msgid ""
+"Your current password is missing or incorrect; it's required to change "
+"the %name."
+msgstr ""
+"Votre mot de passe actuel est manquant ou incorrect; il est requis "
+"pour changer : %name"
+msgid ""
+"A welcome message with further instructions has been e-mailed to the "
+"new user <a href=\"@url\">%name</a>."
+msgstr ""
+"Un message de bienvenue avec des instructions supplémentaires a été "
+"envoyé à l'adresse de courriel du nouvel utilisateur <a "
+"href=\"@url\">%name</a>."
+msgid ""
+"A welcome message with further instructions has been sent to your "
+"e-mail address."
+msgstr ""
+"Un message de bienvenue avec des instructions supplémentaires a été "
+"envoyé à votre adresse de courriel."
+msgid "Configure user accounts."
+msgstr "Configurer les comptes utilisateurs."
+msgid ""
+"Configure default behavior of users, including registration "
+"requirements, e-mails, fields, and user pictures."
+msgstr ""
+"Configurer le comportement par défaut des utilisateurs, comprenant "
+"les prérequis d'enregistrement, les courriels, les champs et les "
+"images des utilisateurs."
+msgid "%module module installed."
+msgstr "Module %module installé."
+msgid "Table %name already exists."
+msgstr "La table %name existe déjà."
+msgid "Cannot rename %table to %table_new: table %table doesn't exist."
+msgstr ""
+"Impossible de renommer la table %table en %table_new : la table %table "
+"n'existe pas."
+msgid "Cannot rename %table to %table_new: table %table_new already exists."
+msgstr ""
+"Impossible de renommer la table %table en %table_new : la table "
+"%table_new existe déjà."
+msgid "Cannot add field %table.%field: table doesn't exist."
+msgstr "Impossible d'ajouter le champ %table.%field : la table n'existe pas."
+msgid "Cannot add field %table.%field: field already exists."
+msgstr "Impossible d'ajouter le champ %table.%field : le champ existe déjà."
+msgid "Cannot set default value of field %table.%field: field doesn't exist."
+msgstr ""
+"Impossible de définir la valeur par défaut du champ %table.%field : "
+"le champ n'existe pas."
+msgid ""
+"Cannot remove default value of field %table.%field: field doesn't "
+"exist."
+msgstr ""
+"Impossible de supprimer la valeur par défaut du champ %table.%field : "
+"le champ n'existe pas."
+msgid "Cannot add primary key to table %table: table doesn't exist."
+msgstr ""
+"Impossible d'ajouter la clé primaire à la table %table : la table "
+"n'existe pas."
+msgid "Cannot add primary key to table %table: primary key already exists."
+msgstr ""
+"Impossible d'ajouter la clé primaire à la table %table : une clé "
+"primaire existe déjà."
+msgid "Cannot add unique key %name to table %table: table doesn't exist."
+msgstr ""
+"Impossible d'ajouter la clé unique %name à la table %table : la "
+"table n'existe pas."
+msgid ""
+"Cannot add unique key %name to table %table: unique key already "
+"exists."
+msgstr ""
+"Impossible d'ajouter la clé unique %name à la table %table : une "
+"clé unique existe déjà."
+msgid "Cannot add index %name to table %table: table doesn't exist."
+msgstr ""
+"Impossible d'ajouter l'index %name à la table %table : la table "
+"n'existe pas."
+msgid "Cannot add index %name to table %table: index already exists."
+msgstr ""
+"Impossible d'ajouter l'index %name à la table %table : l'index existe "
+"déjà."
+msgid ""
+"Cannot change the definition of field %table.%name: field doesn't "
+"exist."
+msgstr ""
+"Impossible de changer la définition du champ %table.%name : le champ "
+"n'existe pas."
+msgid ""
+"Cannot rename field %table.%name to %name_new: target field already "
+"exists."
+msgstr ""
+"Impossible de renommer le champ %table.%name en %name_new : le champ "
+"cible existe déjà."
+msgid "Use this page to create a new custom block."
+msgstr "Utiliser cette page pour créer un nouveau bloc personnalisé."
+msgid "Number of recent blog posts to display"
+msgstr "Nombre de billets de blog récents à afficher"
+msgid "@node_type comment"
+msgstr "Commentaire sur @node_type"
+msgid "Edit comment %comment"
+msgstr "Modifier le commentaire %comment"
+msgid ""
+"The Field UI module provides an administrative user interface (UI) for "
+"attaching and managing fields. Fields can be defined at the "
+"content-type level for content items and comments, at the vocabulary "
+"level for taxonomy terms, and at the site level for user accounts. "
+"Other modules may also enable fields to be defined for their data. "
+"Field types (text, image, number, etc.) are defined by modules, and "
+"collected and managed by the <a href=\"@field\">Field module</a>. For "
+"more information, see the online handbook entry for <a "
+"href=\"@field_ui\" target=\"_blank\">Field UI module</a>."
+msgstr ""
+"Le module Field UI fournit une interface utilisateur d'administration "
+"pour attacher et gérer les champs. Les champs peuvent être définis "
+"au niveau des types de contenus pour les contenus et les commentaires, "
+"au niveau des termes de taxonomies ainsi qu'au niveau du site pour les "
+"comptes utilisateurs. D'autres modules peuvent aussi activer des "
+"champs qui sont utilisés pour leurs données. Les types de champs "
+"(texte, image, nombre, etc.) sont définis par des modules, et "
+"collectés et gérés par le <a href=\"@field\">module Field</a>. Pour "
+"plus d'informations, voir la section<a href=\"@field_ui\" "
+"target=\"_blank\">module Field UI</a> du manuel en ligne."
+msgid "Planning fields"
+msgstr "Organiser des champs"
+msgid "What the field will be called"
+msgstr "Le nom du champ"
+msgid ""
+"A field has a <em>label</em> (the name displayed in the user "
+"interface) and a <em>machine name</em> (the name used internally). The "
+"label can be changed after you create the field, if needed, but the "
+"machine name cannot be changed after you have created the field."
+msgstr ""
+"Un champ a un <em>libellé</em> (le nom affiché dans l'interface "
+"utilisateur) et un <em>nom machine</em> (le nom utilisé en interne). "
+"Le libellé peut être changé une fois que vous avez créé le champ "
+"si nécessaire mais pas le nom machine."
+msgid "What type of data the field will store"
+msgstr "Le type de données que le champ stockera"
+msgid ""
+"Each field can store one type of data (text, number, file, etc.). When "
+"you define a field, you choose a particular <em>field type</em>, which "
+"corresponds to the type of data you want to store. The field type "
+"cannot be changed after you have created the field."
+msgstr ""
+"Chaque champ stocke un type de données (texte, nombre, fichier, "
+"etc.). Lorsque vous définissez un champ, vous devez choisir un "
+"<em>type de champ</em> particulier qui correspond au type de données "
+"que vous voulez stocker. Le type de champ ne peut pas être modifié "
+"après que le champ est créé."
+msgid "How the data will be input and displayed"
+msgstr "La façon dont les données seront saisies et affichées"
+msgid "How many values the field will store"
+msgstr "Combien de valeurs le champ stockera"
+msgid ""
+"You can store one value, a specific maximum number of values, or an "
+"unlimited number of values in each field. For example, an employee "
+"identification number field might store a single number, whereas a "
+"phone number field might store multiple phone numbers. This setting "
+"can be changed after you have created the field, but if you reduce the "
+"maximum number of values, you may lose information."
+msgstr ""
+"Vous pouvez stocker une valeur, un nombre spécifique de valeurs ou un "
+"nombre illimité de valeurs pour chaque champ. Par exemple, le champ "
+"du numéro d'identification d'un employé peut stocker un seul nombre "
+"alors que un champ de numéro de téléphone peut stocker plusieurs "
+"numéros. Ce paramètre peut être modifié après que le champ a "
+"été créé mais si vous diminuez le nombre maximum de valeurs, vous "
+"perdrez des informations."
+msgid "Reusing fields"
+msgstr "Champs réutilisables"
+msgid ""
+"Once you have defined a field, you can reuse it. For example, if you "
+"define a custom image field for one content type, and you need to have "
+"an image field with the same parameters on another content type, you "
+"can add the same field to the second content type, in the <em>Add "
+"existing field</em> area of the user interface. You could also add "
+"this field to a taxonomy vocabulary, comments, user accounts, etc."
+msgstr ""
+"Une fois que vous avez défini un champ, vous pouvez le réutiliser. "
+"Par exemple, si vous définissez un champ d'image personnalisé pour "
+"un type de contenu et que vous avez besoin d'utiliser un champ d'image "
+"avec les mêmes paramètres sur un autre type de contenu, vous pouvez "
+"ajouter le même champ sur le second type de contenu dans la partie "
+"<em>Ajouter un champ existant</em> de l'interface utilisateur. Vous "
+"pourriez aussi ajouter ce champ à un vocabulaire de taxonomie, des "
+"commentaires, des comptes utilisateurs, etc."
+msgid ""
+"Some settings of a reused field are unique to each use of the field; "
+"others are shared across all places you use the field. For example, "
+"the label of a text field is unique to each use, while the setting for "
+"the number of values is shared."
+msgstr ""
+"Certains paramètres d'un champ qui est réutilisé sont spécifiques "
+"à chaque utilisation de ce champ ; d'autres sont partagés entre les "
+"occurrences qui utilisent ce champ. Par exemple, le libellé du champ "
+"texte est spécifique à chaque utilisation alors que le paramètre du "
+"nombre de valeurs est partagé."
+msgid ""
+"There are two main reasons for reusing fields. First, reusing fields "
+"can save you time over defining new fields. Second, reusing fields "
+"also allows you to display, filter, group, and sort content together "
+"by field across content types. For example, the contributed Views "
+"module allows you to create lists and tables of content. So if you use "
+"the same field on multiple content types, you can create a View "
+"containing all of those content types together displaying that field, "
+"sorted by that field, and/or filtered by that field."
+msgstr ""
+"Il y a deux raisons principales pour lesquelles les champs sont "
+"réutilisés. D'abord, la réutilisation permet de gagner du temps par "
+"rapport à la définition de nouveaux champs. Ensuite, la "
+"réutilisation permet aussi d'afficher, filtrer, grouper et trier des "
+"contenus ensemble sur ce champ quelque soit leur type de contenu. Par "
+"exemple, le module contribué Views permet de créer des listes et des "
+"tables de contenus. Ainsi, si vous utilisez le même champ sur "
+"plusieurs type de contenu, vous pouvez créer une View contenant "
+"ensemble tout les types de contenu affichant ce champ triés et/ou "
+"filtrés selon ce champ."
+msgid "Fields on content items"
+msgstr "Champs sur des contenus"
+msgid ""
+"Fields on content items are defined at the content-type level, on the "
+"<em>Manage fields</em> tab of the content type edit page (which you "
+"can reach from the <a href=\"@types\">Content types page</a>). When "
+"you define a field for a content type, each content item of that type "
+"will have that field added to it. Some fields, such as the Title and "
+"Body, are provided for you when you create a content type, or are "
+"provided on content types created by your installation profile."
+msgstr ""
+"Les champs sur les éléments de contenus sont définis au niveau du "
+"type de contenu, à l'onglet <em>Gérer les champs</em> sur la <a "
+"href=\"@types\">Page d'édition des types de contenu</a>. Lorsque vous "
+"définissez un champ pour un type de contenu, chaque élément de "
+"contenu de ce type ajoutera ce champ. Certains champs tels que 'Titre' "
+"et 'Corps', sont fournis pour vous quand vous créez un type de "
+"contenu, ou sur les types de contenus créés par votre profil "
+"d'installation."
+msgid "Fields on taxonomy terms"
+msgstr "Champs sur des termes de taxonomie"
+msgid ""
+"Fields on taxonomy terms are defined at the taxonomy vocabulary level, "
+"on the <em>Manage fields</em> tab of the vocabulary edit page (which "
+"you can reach from the <a href=\"@taxonomy\">Taxonomy page</a>). When "
+"you define a field for a vocabulary, each term in that vocabulary will "
+"have that field added to it. For example, you could define an image "
+"field for a vocabulary to store an icon with each term."
+msgstr ""
+"Les champs des termes de taxonomie sont définis au niveau du "
+"vocabulaire, dans l'onglet <em>Gérer les champs</em> de la page de "
+"modification du vocabulaire (à laquelle vous pouvez accéder depuis "
+"la page <a href=\"@taxonomy\"><em>Taxonomie</em></a>). Lorsque vous "
+"définissez un champ pour un vocabulaire, chaque terme du vocabulaire "
+"disposera de ce champ. Vous pouvez par exemple définir un champ image "
+"pour un vocabulaire de manière à stocker une icone pour chaque "
+"terme."
+msgid "Fields on user accounts"
+msgstr "Champs sur des comptes utilisateurs"
+msgid ""
+"Fields on user accounts are defined on a site-wide basis on the <a "
+"href=\"@fields\">Manage fields tab</a> of the <a "
+"href=\"@accounts\">Account settings</a> page. When you define a field "
+"for user accounts, each user account will have that field added to it. "
+"For example, you could add a long text field to allow users to include "
+"a biography."
+msgstr ""
+"Les champs des comptes utilisateurs sont définis pour tous le site "
+"dans l'onglet <a href=\"@fields\"><em>Gérer les champs</em></a> de la "
+"page <a href=\"@accounts\"><em>Paramètres de compte</em></a>. Lorsque "
+"vous définissez un champ pour le compte utilisateur, chaque compte "
+"utilisateur disposera de ce champ. Vous pouvez par exemple ajouter un "
+"champ de texte long pour que les utilisateurs puissent inclure leur "
+"biographie."
+msgid "Fields on comments"
+msgstr "Champs sur des commentaires"
+msgid ""
+"Fields on comments are defined at the content-type level, on the "
+"<em>Comment fields</em> tab of the content type edit page (which you "
+"can reach from the <a href=\"@types\">Content types page</a>). When "
+"you add a field for comments, each comment on a content item of that "
+"type will have that field added to it. For example, you could add a "
+"website field to the comments on forum posts, to allow forum "
+"commenters to add a link to their website."
+msgstr ""
+"Les champs des commentaires sont définis au niveau du type de "
+"contenu, dans l'onglet <em>Champs de commentaire</em> de la page de "
+"modification du type de contenu (à laquelle vous pouvez accéder "
+"depuis la page <a href=\"@types\"><em>Types de contenus</em></a>). "
+"Lorsque vous ajoutez un champ aux commentaires, chaque commentaire de "
+"ce type de contenu disposera du champ. Vous pouvez par exemple ajouter "
+"un champ lien aux commentaires du type de contenu \"Forum\" pour que "
+"les utilisateurs puissent indiquer leur site web."
+msgid "Administer text formats and filters"
+msgstr "Administrer les formats de texte et les filtres"
+msgid "@type language detection"
+msgstr "Détection de la langue @type"
+msgid ""
+"Strings in the uploaded file replace existing ones, new ones are "
+"added. The plural format is updated."
+msgstr ""
+"Les chaînes du fichier transféré remplacent celles existantes alors "
+"que les nouvelles sont ajoutées. Les pluriels sont mis à jour."
+msgid ""
+"Existing strings and the plural format are kept, only new strings are "
+"added."
+msgstr ""
+"Les chaînes existantes et les pluriels sont conservés, seules les "
+"nouvelles chaînes sont ajoutées."
+msgid ""
+"Define how to decide which language is used to display page elements "
+"(primarily text provided by Drupal and modules, such as field labels "
+"and help text). This decision is made by evaluating a series of "
+"detection methods for languages; the first detection method that gets "
+"a result will determine which language is used for that type of text. "
+"Define the order of evaluation of language detection methods on this "
+"page."
+msgstr ""
+"Définissez comment décider quelle langue est utilisée pour afficher "
+"les éléments de page (principalement des textes fournis par Drupal "
+"et les modules, tels que des étiquettes et le texte d'aide). Cette "
+"décision est prise par l'évaluation d'une série de méthodes de "
+"détection pour les langues. La première méthode de détection qui "
+"obtient un résultat détermine la langue utilisée pour ce type de "
+"texte. Définissez l'ordre d'évaluation des méthodes de détection "
+"de la langue sur cette page."
+msgid "User interface text"
+msgstr "Texte de l'interface utilisateur"
+msgid "Use the detected interface language."
+msgstr "Utiliser la langue de l'interface détectée"
+msgid "Add new %type"
+msgstr "Ajouter un nouveau %type"
+msgid ""
+"The new set is created by copying items from your default shortcut "
+"set."
+msgstr ""
+"Le nouvel ensemble est créé en copiant les éléments de votre "
+"ensemble de raccourcis par défaut."
+msgid "The new set is created by copying items from the %default set."
+msgstr ""
+"Le nouvel ensemble est créé en copiant les éléments depuis "
+"l'ensemble %default."
+msgid "You are currently using the %set-name shortcut set."
+msgstr "Vous utilisez actuellement l'ensemble de raccourcis %set-name."
+msgid "edit set name"
+msgstr "modifier le nom de l'ensemble"
+msgid "delete set"
+msgstr "supprimer l'ensemble"
+msgid "Create new set"
+msgstr "Créer un nouvel ensemble"
+msgid ""
+"The %set_name shortcut set has been created. You can edit it from this "
+"page."
+msgstr ""
+"L'ensemble de raccourcis %set_name a été créé. Vous pouvez le "
+"modifier depuis de cette page."
+msgid "Updated set name to %set-name."
+msgstr "Nom de l'ensemble mis à jour à %set-name."
+msgid ""
+"If you have chosen this shortcut set as the default for some or all "
+"users, they may also be affected by deleting it."
+msgstr ""
+"Si vous avez choisi cet ensemble de raccourcis par défaut pour "
+"certains (voire pour tous) les utilisateurs, ils pourront être "
+"affectés par sa suppression."
+msgid "Are you sure you want to delete the shortcut set %title?"
+msgstr "Êtes-vous sûr de vouloir supprimer l'ensemble de raccourcis %title?"
+msgid "The shortcut set %title has been deleted."
+msgstr "L'ensemble de raccourcis %title a été supprimé."
+msgid "1 user has chosen or been assigned to this shortcut set."
+msgid_plural "@count users have chosen or been assigned to this shortcut set."
+msgstr[0] "@count utilisateur utilise cet ensemble de raccourcis."
+msgstr[1] "@count utilisateurs utilisent cet ensemble de raccourcis."
+msgid ""
+"The Shortcut module allows users to create sets of <em>shortcut</em> "
+"links to commonly-visited pages of the site. Shortcuts are contained "
+"within <em>sets</em>. Each user with <em>Select any shortcut set</em> "
+"permission can select a shortcut set created by anyone at the site. "
+"For more information, see the online handbook entry for <a "
+"href=\"@shortcut\">Shortcut module</a>."
+msgstr ""
+"Le module Shortcut permet aux utilisateurs de créer des ensembles de "
+"<em>raccourcis</em> vers les pages régulièrement visitées du site. "
+"Les raccourcis sont groupés dans des <em>ensembles</em>. Chacun des "
+"utilisateurs avec les droits <em>Choisir un ensemble de "
+"raccourcis</em> peut sélectionner un ensemble de raccourcis du site, "
+"quel qu'en soit le créateur. Pour plus d'information, voir la section "
+"du <a href=\"@shortcut\">module Shortcut</a> du manuel en ligne."
+msgid "Administering shortcuts"
+msgstr "Administration des raccourcis"
+msgid ""
+"Users with the <em>Administer shortcuts</em> permission can manage "
+"shortcut sets and edit the shortcuts within sets from the <a "
+"href=\"@shortcuts\">Shortcuts administration page</a>."
+msgstr ""
+"Les utilisateurs avec les droits <em>Administrer les raccourcis<em> "
+"peuvent gérer les ensembles de raccourcis et modifier les raccourcis "
+"au sein de ces ensembles depuis la <a href=\"@shortcuts\">Page "
+"d'administration des raccourcis</a>."
+msgid "Choosing shortcut sets"
+msgstr "Choix des ensembles de raccourcis"
+msgid ""
+"Users with permission to switch shortcut sets can choose a shortcut "
+"set to use from the Shortcuts tab of their user account page."
+msgstr ""
+"Les utilisateurs ayant le droit de changer d'ensemble de raccourcis "
+"peuvent choisir l'ensemble de raccourcis qu'ils souhaitent utiliser "
+"dans l'onglet Raccourcis de leur page de compte utilisateur."
+msgid ""
+"The Shortcut module creates an add/remove link for each page on your "
+"site; the link lets you add or remove the current page from the "
+"currently-enabled set of shortcuts (if your theme displays it and you "
+"have permission to edit your shortcut set). The core Seven "
+"administration theme displays this link next to the page title, as a "
+"small + or - sign. If you click on the + sign, you will add that page "
+"to your preferred set of shortcuts. If the page is already part of "
+"your shortcut set, the link will be a - sign, and will allow you to "
+"remove the current page from your shortcut set."
+msgstr ""
+"Le module Shortcut fournit un lien ajouter/supprimer sur chaque page "
+"de votre site&nbsp;; ce lien vous permet d'ajouter ou supprimer la "
+"page courante au groupe de raccourcis actuellement activé (si votre "
+"thème l'affiche et si vous vous disposez du droit d'éditer votre "
+"propre groupe de raccourcis). Le thème d'administration Seven, fourni "
+"avec le coeur de Drupal, affiche ce lien à côté du titre de la "
+"page, sous la forme d'un petit signe + ou d'un petit signe -. Si vous "
+"cliquez sur le signe +, vous ajouterez la page à votre groupe de "
+"raccourcis préféré. Si la page fait déjà partie de votre groupe "
+"de raccourcis, ce lien prendra la forme d'un signe -, et vous "
+"permettra alors de supprimer la page courante de votre groupe de "
+"raccourcis."
+msgid ""
+"Define which shortcut set you are using on the <a "
+"href=\"@shortcut-link\">Shortcuts tab</a> of your account page."
+msgstr ""
+"Définir quel ensemble de raccourcis vous utilisez dans l'<a "
+"href=\"@shortcut-link\">onglet Raccourcis</a> de votre page de compte "
+"utilisateur."
+msgid "Edit current shortcut set"
+msgstr "Modifier l'ensemble de raccourcis actif"
+msgid ""
+"Editing the current shortcut set will affect other users if that set "
+"has been assigned to or selected by other users. Granting \"Select any "
+"shortcut set\" permission along with this permission will grant "
+"permission to edit any shortcut set."
+msgstr ""
+"La modification de l'ensemble de raccourcis actif affectera les autres "
+"utilisateurs qui l'utilisent. L'octroi des droits \"Choisir un "
+"ensemble de raccourcis\" en plus de ces droits-ci permettra de "
+"modifier n'importe quel ensemble de raccourcis."
+msgid "Select any shortcut set"
+msgstr "Choisir un ensemble de raccourcis"
+msgid ""
+"From all shortcut sets, select one to be own active set. Without this "
+"permission, an administrator selects shortcut sets for users."
+msgstr ""
+"Parmi tous les ensembles de raccourcis, choisissez en un pour qu'il "
+"devienne votre choix par défaut. Sans ces droits, un administrateur "
+"sélectionne les ensembles de raccourcis des utilisateurs."
+msgid "Add and modify shortcut sets."
+msgstr "Ajouter et modifier des raccourcis."
+msgid "Add shortcut set"
+msgstr "Ajouter un ensemble de raccourcis"
+msgid "Edit set name"
+msgstr "Editer le nom de l'ensemble"
+msgid "Delete shortcut set"
+msgstr "Supprimer un ensemble de raccourcis"
+msgid "@remote could not be saved to @path."
+msgstr "@remote n'a pas pu être sauvegardé vers @path."
+msgid ""
+"Drupal requires you to enable the PHP extensions in the following list "
+"(see the <a href=\"@system_requirements\">system requirements page</a> "
+"for more information):"
+msgstr ""
+"Drupal requiert l'activation des extensions PHP figurant dans la liste "
+"suivante (consulter la <a href=\"@system_requirements\">page de "
+"configuration système requise</a> pour plus de détails):"
+msgid "Database support"
+msgstr "Support de base de données"
+msgid ""
+"Your web server does not appear to support any common PDO database "
+"extensions. Check with your hosting provider to see if they support "
+"PDO (PHP Data Objects) and offer any databases that <a "
+"href=\"@drupal-databases\">Drupal supports</a>."
+msgstr ""
+"Votre serveur Web ne semble pas pouvoir supporter les extensions PDO "
+"pour les bases de données. Vérifiez auprès de votre hébergeur pour "
+"voir s'il supporte PDO (<em>PHP Data Objects</em>) et s'il dispose "
+"d'une des bases de données que <a href=\"@drupal-databases\">Drupal "
+"accepte</a>."
+msgid "Footer first column"
+msgstr "Première colonne du pied de page"
+msgid "Footer second column"
+msgstr "Seconde colonne du pied de page"
+msgid "Footer third column"
+msgstr "Troisième colonne du pied de page"
+msgid "Footer fourth column"
+msgstr "Quatrième colonne du pied de page"
+msgid "Kyrgyz"
+msgstr "Kirghiz"
+msgid "theme() may not be called until all modules are loaded."
+msgstr ""
+"La fonction theme() n'est pas appelée tant que tous les modules ne "
+"sont pas chargés."
+msgid "GD library PNG support"
+msgstr "Prise en charge du format PNG par la bibliothèque GD"
+msgid "The date the comment was most recently updated."
+msgstr ""
+"La date à laquelle le commentaire a été le plus récemment mis à "
+"jour."
+msgid "Comment posted: %subject."
+msgstr "Commentaire posté : %subject."
+msgid "On value"
+msgstr "Valeur si coché"
+msgid "If left empty, \"1\" will be used."
+msgstr "Si laissé vide, \"1\" sera utilisé."
+msgid "Off value"
+msgstr "En dehors de la valeur"
+msgid "If left empty, \"0\" will be used."
+msgstr "Si laissé vide, \"0\" sera utilisé."
+msgid ""
+"This field has been disabled because you do not have sufficient "
+"permissions to edit it."
+msgstr ""
+"Ce champ a été desactivé car vous n'avez pas les droits suffisants "
+"pour le modifier."
+msgid "Select a forum."
+msgstr "Sélectionner un forum."
+msgid ""
+"The GD Library for PHP is enabled, but was compiled without support "
+"for functions used by the rotate and desaturate effects. It was "
+"probably compiled using the official GD libraries from "
+"http://www.libgd.org instead of the GD library bundled with PHP. You "
+"should recompile PHP --with-gd using the bundled GD library. See <a "
+"href=\"http://www.php.net/manual/book.image.php\">the PHP manual</a>."
+msgstr ""
+"La bibliothèque de fonctions GD pour PHP est activée, mais elle a "
+"été compilée sans support des fonctions de rotation et de "
+"dé-saturation d'images. Elle a probablement été compilée en "
+"utilisant les bibliothèques officielles de GD provenant de "
+"http://www.libgd.org à la place de la bibliothèque GD livrée avec "
+"PHP. Vous devriez recompiler PHP en utilisant l'option --with-gd. "
+"Consultez <a href=\"http://www.php.net/manual/book.image.php\">le "
+"manuel PHP</a>."
+msgid "GD library rotate and desaturate effects"
+msgstr "Effets de rotation et de désaturation de la bibliothèque GD"
+msgid ""
+"View, edit and delete all content regardless of permission "
+"restrictions."
+msgstr ""
+"Voir, modifier et supprimer tous les contenus sans tenir compte des "
+"restrictions de droits."
+msgid ""
+"You must validate your email address for this account before logging "
+"in via OpenID."
+msgstr ""
+"Vous devez d'abord valider l'adresse de courriel de votre compte avant "
+"de vous connecter via OpenID."
+msgid "The HTML ID %id is unique."
+msgstr "L'identifiant (ID) HTML %id est unique."
+msgid "Syslog format"
+msgstr "Format de Syslog"
+msgid ""
+"Specify the format of the syslog entry. Available variables are: "
+"<dl><dt><code>!base_url</code></dt><dd>Base URL of the "
+"site.</dd><dt><code>!timestamp</code></dt><dd>Unix timestamp of the "
+"log entry.</dd><dt><code>!type</code></dt><dd>The category to which "
+"this message belongs.</dd><dt><code>!ip</code></dt><dd>IP address of "
+"the user triggering the "
+"message.</dd><dt><code>!request_uri</code></dt><dd>The requested "
+"URI.</dd><dt><code>!referer</code></dt><dd>HTTP Referer if "
+"available.</dd><dt><code>!uid</code></dt><dd>User "
+"ID.</dd><dt><code>!link</code></dt><dd>A link to associate with the "
+"message.</dd><dt><code>!message</code></dt><dd>The message to store in "
+"the log.</dd></dl>"
+msgstr ""
+"Spécifier le format des entrées du journal système. Les variables "
+"disponibles sont: <dl><dt><code>!base_url</code></dt><dd>URL de base "
+"du site.</dd><dt><code>!timestamp</code></dt><dd>Horodatage UNIX de "
+"l'entrée du journal.</dd><dt><code>!type</code></dt><dd>La catégorie "
+"à laquelle ce message "
+"appartient.</dd><dt><code>!ip</code></dt><dd>L'adresse IP de "
+"l'utilisateur déclenchant le "
+"message.</dd><dt><code>!request_uri</code></dt><dd>L'URI "
+"demandé..</dd><dt><code>!referer</code></dt><dd>Le HTTP Referer, si "
+"disponible.</dd><dt><code>!uid</code></dt><dd>L'ID "
+"utilisateur.</dd><dt><code>!link</code></dt><dd>Un lien à associer "
+"avec le message.</dd><dt><code>!message</code></dt><dd>Le message à "
+"stocker dans le journal.</dd></dl>"
+msgid ""
+"External resources can be optimized automatically, which can reduce "
+"both the size and number of requests made to your website."
+msgstr ""
+"Les ressources externes peuvent être optimisées automatiquement, ce "
+"qui peut réduire à la fois la taille et le nombre de requêtes "
+"adressées à votre site web."
+msgid "A date in 'time-since' format. (%date)"
+msgstr "Une date dans le format \"temps depuis\". (%date)"
+msgid "The location of the file relative to Drupal root."
+msgstr "L'emplacement du fichier par rapport à la racine de Drupal."
+msgid "HTTP error @errorcode occurred when trying to fetch @remote."
+msgstr ""
+"L'erreur HTTP @errorcode s'est produite lors de la tentative de "
+"récupération de @remote."
+msgid ""
+"Your system or network configuration does not allow Drupal to access "
+"web pages, resulting in reduced functionality. This could be due to "
+"your webserver configuration or PHP settings, and should be resolved "
+"in order to download information about available updates, fetch "
+"aggregator feeds, sign in via OpenID, or use other network-dependent "
+"services. If you are certain that Drupal can access web pages but you "
+"are still seeing this message, you may add "
+"<code>$conf['drupal_http_request_fails'] = FALSE;</code> to the bottom "
+"of your settings.php file."
+msgstr ""
+"Votre configuration système ou réseau n'autorisent pas Drupal à "
+"accéder aux pages web, ce qui réduit ses fonctionalités. Cela peut "
+"être dû à la configuration de votre serveur web ou paramètres PHP "
+"et doit être résolu pour pouvoir télécharger des informations sur "
+"les mises à jour, réaliser les aggrégations de flux, s'enregistrer "
+"via OpenID, ou utiliser des services dépendant du réseau. Si vous "
+"êtes certain que Drupal peut accéder aux pages web mais que vous "
+"voyez toujours ce message, vous pouvez ajouter "
+"<code>$conf['drupal_http_request_fails'] = FALSE;</code> à la fin du "
+"fichier settings.php."
+msgid ""
+"A translation of %title in %language already exists, a new %type will "
+"be created instead of a translation."
+msgstr ""
+"Une traduction de %title en %language existe déjà. Un(e) "
+"nouveau(elle) %type sera créé(e) — et non une nouvelle traduction."
+msgid "Your modules have been downloaded and updated."
+msgstr "Vos modules ont été téléchargés et mis à jour."
+msgid "<a href=\"@update\">Run database updates</a>"
+msgstr ""
+"<a href=\"@update\">Lancer les mises à jour de la base de "
+"données</a>"
+msgid "@name <em>(locked)</em>"
+msgstr "@name <em>(verrouillé)</em>"
+msgid "Are you sure you want to delete the role %name ?"
+msgstr "Êtes-vous sûr(e) de vouloir supprimer le rôle %name ?"
+msgid ""
+"Permissions let you control what users can do and see on your site. "
+"You can define a specific set of permissions for each role. (See the "
+"<a href=\"@role\">Roles</a> page to create a role). Two important "
+"roles to consider are Authenticated Users and Administrators. Any "
+"permissions granted to the Authenticated Users role will be given to "
+"any user who can log into your site. You can make any role the "
+"Administrator role for the site, meaning this will be granted all new "
+"permissions automatically. You can do this on the <a "
+"href=\"@settings\">User Settings</a> page. You should be careful to "
+"ensure that only trusted users are given this access and level of "
+"control of your site."
+msgstr ""
+"Les permissions vous permettent de contrôler ce que les utilisateurs "
+"peuvent voir et faire sur votre site. Vous pouvez définir un ensemble "
+"spécifique de permissions pour chaque rôle. (Voir la page <a "
+"href=\"@role\">Rôles</a> pour créer un rôle. Deux rôles importants "
+"sont à considérer : les utilisateurs authentifiés et les "
+"administrateurs. Toutes les permissions accordées au rôle des "
+"utilisateurs authentifiés seront accordées à tous les utilisateurs "
+"qui se connecteront sur votre site. Tous les rôles peuvent avoir un "
+"rôle d'administrateur pour le site, cela signifie que toutes les "
+"nouvelles permissions lui seront accordées automatiquement. Vous "
+"pouvez le faire sur la page <a href=\"@settings\">de configuration des "
+"utilisateurs</a>. Vous devriez être prudent et vous assurer que seuls "
+"les utilisateurs en qui vous avez confiance obtiennent ce type "
+"d'accès et de contrôle de votre site."
+msgid ""
+"Roles allow you to fine tune the security and administration of "
+"Drupal. A role defines a group of users that have certain privileges "
+"as defined on the <a href=\"@permissions\">permissions page</a>. "
+"Examples of roles include: anonymous user, authenticated user, "
+"moderator, administrator and so on. In this area you will define the "
+"names and order of the roles on your site. It is recommended to order "
+"your roles from least permissive (anonymous user) to most permissive "
+"(administrator). To delete a role choose \"edit role\"."
+msgstr ""
+"Les rôles permettent de définir précisément la sécurité et "
+"l'administration de Drupal. Un rôle définit un groupe d'utilisateurs "
+"qui ont certains privilèges tels que définis dans la <a "
+"href=\"@permissions\">page des droits</a>. Par exemple&nbsp;: "
+"utilisateur anonyme, utilisateur authentifié, modérateur, "
+"administrateur, etc. Dans cette partie, vous pouvez définir les noms "
+"et l'ordre des rôles de votre site. Il est recommandé d'ordonner vos "
+"rôles du moins permissif (utilisateur anonyme) au plus permissif "
+"(administrateur). Pour supprimer un rôle, choisir \"éditer rôle\"."
+msgid ""
+"Use <em>articles</em> for time-sensitive content like news, press "
+"releases or blog posts."
+msgstr ""
+"Utilisez les <em>articles</em> pour des contenus possédant une "
+"temporalité tels que des actualités, des communiqués de presse ou "
+"des billets de blog."
+msgid "Filipino"
+msgstr "Philippin"
+msgid "Swiss German"
+msgstr "Suisse allemand"
+msgid "Scots"
+msgstr "Écossais"
+msgid ""
+"The selected file %filename cannot be uploaded. Only files with the "
+"following extensions are allowed: %extensions."
+msgstr ""
+"Le fichier sélectionné %filename ne peut pas être transféré. "
+"Seulement les fichiers avec les extensions suivantes sont permis : "
+"%extensions."
+msgid "Cache pages for anonymous users"
+msgstr "Mettre en cache les pages pour les utilisateurs anonymes"
+msgid "Bartik"
+msgstr "Bartik"
+msgid "A flexible, recolorable theme with many regions."
+msgstr ""
+"Un thème flexible, dont les couleurs peuvent être modifiées avec "
+"beaucoup de régions."
+msgid "Highlighted"
+msgstr "Mis en évidence"
+msgid "Sidebar second"
+msgstr "Seconde barre latérale"
+msgid "Triptych first"
+msgstr "Premier triptyque"
+msgid "Triptych middle"
+msgstr "Triptyque du milieu"
+msgid "Triptych last"
+msgstr "Dernier triptyque"
+msgid "Main background"
+msgstr "Arrière-plan principal"
+msgid "Sidebar background"
+msgstr "Arrière-plan de la barre latérale"
+msgid "Sidebar borders"
+msgstr "Bordures de la barre latérale"
+msgid "Footer background"
+msgstr "Arrière-plan du pied de page"
+msgid "Plum"
+msgstr "Prune"
+msgid "!local-task-title!active"
+msgstr "!local-task-title!active"
+msgid ""
+"A space-separated list of HTML tags allowed in the content of feed "
+"items. Disallowed tags are stripped from the content."
+msgstr ""
+"Une liste -séparée par des espaces- de balises HTML autorisées dans "
+"le contenu des éléments de flux. Les balises non autorisées sont "
+"automatiquement supprimées du contenu."
+msgid "%field may only contain characters a-z, underscores, or hyphens."
+msgstr ""
+"%field ne peut contenir que les caractères de a-z, soulignement (_), "
+"ou des tirets (-)."
+msgid "%field cannot contain any markup."
+msgstr "%field ne peut pas contenir de balise."
+msgid "No URL aliases available. <a href=\"@link\">Add URL alias</a>."
+msgstr ""
+"Aucun alias d'URL disponible. <a href=\"@link\">Ajouter un alias "
+"d'URL</a>."
+msgid ""
+"To provide keyword searching, the search engine maintains an index of "
+"words found in the content and its fields, along with text added to "
+"your content by other modules (such as comments from the core Comment "
+"module, and taxonomy terms from the core Taxonomy module). To build "
+"and maintain this index, a correctly configured <a href=\"@cron\">cron "
+"maintenance task</a> is required. Users with <em>Administer "
+"search</em> permission can further configure the cron settings on the "
+"<a href=\"@searchsettings\">Search settings page</a>."
+msgstr ""
+"Pour permettre la recherche de mots, le moteur de recherche maintient "
+"un index des mots trouvés dans le contenu et ses champs, ainsi que "
+"ceux ajoutés au contenu par d'autres modules (comme les commentaires "
+"qui proviennent du module Comment inclut au core et les termes de "
+"taxonomie qui proviennent du module Taxonomy inclut au core). Pour "
+"construire ou mettre à jour cet index, une <a href=\"@cron\">tâche "
+"de maintenance Cron</a> correctement configurée est nécessaire. Les "
+"utilisateurs ayant la permission d'<em>Administration des "
+"recherche</em> pourront configurer les paramètres du cron sur la <a "
+"href=\"@searchsettings\">page de configuration du module Search</a>."
+msgid "Content reindexing"
+msgstr "Réindexation du contenu"
+msgid ""
+"Content-related actions on your site (creating, editing, or deleting "
+"content and comments) automatically cause affected content items to be "
+"marked for indexing or reindexing at the next cron run. When content "
+"is marked for reindexing, the previous content remains in the index "
+"until cron runs, at which time it is replaced by the new content. "
+"Unlike content-related actions, actions related to the structure of "
+"your site do not cause affected content to be marked for reindexing. "
+"Examples of structure-related actions that affect content include "
+"deleting or editing taxonomy terms, enabling or disabling modules that "
+"add text to content (such as Taxonomy, Comment, and field-providing "
+"modules), and modifying the fields or display parameters of your "
+"content types. If you take one of these actions and you want to ensure "
+"that the search index is updated to reflect your changed site "
+"structure, you can mark all content for reindexing by clicking the "
+"\"Re-index site\" button on the <a href=\"@searchsettings\">Search "
+"settings page</a>. If you have a lot of content on your site, it may "
+"take several cron runs for the content to be reindexed."
+msgstr ""
+"Les modifications sur le contenu de votre site (créer, éditer ou "
+"supprimer du contenu et des commentaires) ajoute automatiquement ces "
+"éléments comme étant à indexer ou à réindexer lors de la "
+"prochaine exécution du cron. Lorsqu'un contenu est marqué pour la "
+"réindexation, le contenu précédent reste dans l'index jusqu'à ce "
+"que cron s'exécute, après quoi il est remplacé par le nouveau "
+"contenu. Contrairement aux actions liées au contenu, les actions "
+"liées à la structure de votre site ne provoquent pas de "
+"réindexation du contenu concerné. Des actions liées à la structure "
+"qui influent sur le contenu sont par exemple supprimer ou éditer les "
+"termes de taxonomie, activer ou désactiver des modules qui ajoutent "
+"du texte au contenu (Taxonomy, Comment, et des modules fournissant des "
+"champs) et de modifier les champs ou les paramètres d'affichage de "
+"vos types de contenu. Si vous effectuez l'une de ces actions et que "
+"vous voulez faire en sorte que l'index de recherche soit mis à jour "
+"afin de refléter les changements, vous pouvez marquer tout le contenu "
+"pour réindexation en cliquant sur le bouton \"Réindexer le site\" "
+"sur la <a href=\"@searchsettings\">page des paramètres de "
+"recherche</a>. Si vous avez beaucoup de contenu sur votre site, cela "
+"peut prendre plusieurs exécutions du cron pour une réindexation "
+"complète."
+msgid ""
+"Cached pages will not be re-created until at least this much time has "
+"elapsed."
+msgstr ""
+"Les pages mises en cache ne seront pas recréées tant qu'au moins "
+"cette durée ne se sera pas écoulée."
+msgid "Expiration of cached pages"
+msgstr "Expiration des pages en cache"
+msgid "The maximum time an external cache can use an old version of a page."
+msgstr ""
+"La durée maximale pendant laquelle un système de cache externe peut "
+"utiliser une ancienne version d'une page."
+msgid ""
+"These options control the display settings for the %name theme. When "
+"your site is displayed using this theme, these settings will be used."
+msgstr ""
+"Ces options contrôlent les paramètres d'affichage du thème %name. "
+"Lorsque votre site utilisera ce thème, ces paramètres seront "
+"appliqués."
+msgid "Administer software updates"
+msgstr "Gérer la mise à jour logicielle"
+msgid ""
+"Enter a valid email address or use a token e-mail address such as "
+"%author."
+msgstr ""
+"Veuillez saisir une adresse de courriel valide ou utiliser un jeton "
+"d'adresse de courriel tel que %author."
+msgid "@required_name (Missing)"
+msgstr "@required_name (Manquant)"
+msgid "@required_name (Version @compatibility required)"
+msgstr "@required_name (Version @compatibility requise)"
+msgid "@name requires at least PHP @version."
+msgstr "@name requiert au minimum PHP @version."
+msgid "Unresolved dependency"
+msgstr "Dépendance non résolue"
+msgid "@name requires this module."
+msgstr "@name à besoin de ce module."
+msgid ""
+"@name requires this module and version. Currently using @required_name "
+"version @version"
+msgstr ""
+"@name requiert ce module et cette version. Vous utilisez actuellement "
+"@required_name version @version"
+msgid "Site details"
+msgstr "Détails du site"
+msgid "Title and slogan"
+msgstr "Titre et slogan"
+msgid "Firehouse"
+msgstr "Firehouse"
+msgid "Ice"
+msgstr "Glace"
+msgid "Can't handle more than one field storage engine"
+msgstr ""
+"Il n'est pas possible de spécifier plus d'un moteur de stockage de "
+"champ"
+msgid "Field storage engine not found."
+msgstr "Le moteur de stockage de champs n'a pas été trouvé."
+msgid "For this query an entity type must be specified."
+msgstr "Un type d'entité doit être spécifié pour cette requête."
+msgid "Entity %entity has no base table."
+msgstr "L'entité %entity n'a pas de table dans la base."
+msgid "Do not know how to order on @key for @entity_type"
+msgstr "Impossible de trier @entity_type par @key"
+msgid ""
+"The database table prefix you have entered, %prefix, is invalid. The "
+"table prefix can only contain alphanumeric characters, periods, or "
+"underscores."
+msgstr ""
+"Le préfixe %prefix, saisi pour les tables de la base de données est "
+"incorrect. Le préfixe ne peut contenir que des caractères "
+"alphanumériques, des points, ou des tirets bas (_)."
+msgid "Default settings file"
+msgstr "Fichier de configuration par défaut"
+msgid "The default settings file does not exist."
+msgstr "Le fichier de configuration par défaut n'existe pas."
+msgid ""
+"The @drupal installer requires that the %default-file file not be "
+"modified in any way from the original download."
+msgstr ""
+"L'installeur @drupal exige que le fichier %default-file ne soit pas "
+"modifié par rapport à l'original téléchargé."
+msgid "Māori"
+msgstr "Māori"
+msgid "Re-order rows by numerical weight instead of dragging."
+msgstr ""
+"Ré-ordonner les lignes avec des poids numériques plutôt qu'en les "
+"déplaçant."
+msgid "Show row weights"
+msgstr "Afficher le poids des lignes"
+msgid "Hide row weights"
+msgstr "Cacher le poids des lignes"
+msgid ""
+"Attempt to create an instance of field @field_name without an entity "
+"type."
+msgstr ""
+"Tentative de création d'une instance de champ @field_name sans type "
+"d'entité."
+msgid ""
+"Attempt to create an instance of field @field_name on forbidden entity "
+"type @entity_type."
+msgstr ""
+"Tentative de création d'une instance de champ @field_name avec un "
+"type d'entité interdit @entity_type."
+msgid "Attempt to update an instance of a nonexistent field @field."
+msgstr "Tentative de mettre à jour une instance d'un champ inexistant @field."
+msgid ""
+"Attempt to update an instance of field @field on bundle @bundle that "
+"doesn't exist."
+msgstr ""
+"Tentative de mise à jour d'une instance du champ @field sur le paquet "
+"@bundle qui n'existe pas."
+msgid "Attempt to purge a field @field_name that still has instances."
+msgstr ""
+"Tentative de purger un champ @field_name qui possède encore des "
+"instances."
+msgid "%name: the value may be no less than %min."
+msgstr "%name: la valeur ne peut pas être inférieure à %min."
+msgid "%name: the value may be no greater than %max."
+msgstr "%name: la valeur ne peut pas être supérieure à %max."
+msgid "No fields have been defined yet."
+msgstr "Aucun champ n'a encore été défini."
+msgid "Weight for new field"
+msgstr "Poids du nouveau champ"
+msgid "Weight for added field"
+msgstr "Poids du champ ajouté"
+msgid "Custom display settings"
+msgstr "Paramètres d'affichage personnalisés"
+msgid "Use custom display settings for the following view modes"
+msgstr ""
+"Utiliser les paramètres d'affichage personnalisés pour les modes "
+"d'affichage suivants"
+msgid ""
+"The %view_mode mode now uses custom display settings. You might want "
+"to <a href=\"@url\">configure them</a>."
+msgstr ""
+"Le mode %view_mode utilise maintenant une configuration d'affichage "
+"personnalisée. Vous pouvez en <a href=\"@url\">modifier les "
+"paramètres ici</a>."
+msgid "User interface for the Field API."
+msgstr "Interface utilisateur de Field API."
+msgid ""
+"Separate extensions with a space or comma and do not include the "
+"leading dot."
+msgstr ""
+"Séparer les extensions avec un espace ou une virgule sans inclure le "
+"point."
+msgid "Edit an existing effect within a style."
+msgstr "Modifier un effet existant sur un sytle."
+msgid "Delete an existing effect from a style."
+msgstr "Supprimer un effet existant sur un style."
+msgid "Node module element"
+msgstr "Élément du module Node"
+msgid "Close overlay"
+msgstr "Fermer le premier plan (overlay)"
+msgid "Poll module settings"
+msgstr "Paramètres du module de sondage"
+msgid "Poll vote"
+msgstr "Votes du sondage"
+msgid "Poll results"
+msgstr "Résultats du sondage"
+msgid "The new set name is required."
+msgstr "Le nom du nouveau ensemble est requis."
+msgid "The shortcut set %name already exists. Choose another name."
+msgstr "L'ensemble de raccourcis %name existe déjà. Choisissez un autre nom."
+msgid "Expected text found in @field of email message: \"@expected\"."
+msgstr ""
+"Texte attendu trouvé dans @field du message de courriel : "
+"\"@expected\"."
+msgid "1 e-mail was sent during this test."
+msgid_plural "@count e-mails were sent during this test."
+msgstr[0] "@count courriel a été envoyé pendant ce test."
+msgstr[1] "@count courriels ont été envoyés pendant ce test."
+msgid "Blocked IP addresses"
+msgstr "Adresses IP bloquées"
+msgid ""
+"IP addresses listed here are blocked from your site. Blocked addresses "
+"are completely forbidden from accessing the site and instead see a "
+"brief message explaining the situation."
+msgstr ""
+"Les adresses IP listées ici sont bloquées sur votre site. Les "
+"adresses bloquées ont l'interdiction complète d'accéder au site et "
+"à la place peuvent voir un bref message expliquant la situation."
+msgid ""
+"The content type %rowtype had uploads disabled but contained uploaded "
+"file data. Uploads have been re-enabled to migrate the existing data. "
+"You may delete the \"File attachments\" field in the %rowtype type if "
+"this data is not necessary."
+msgstr ""
+"Le type de contenu %rowtype avait les attachements désactivés mais "
+"contient des fichiers attachés. Les attachements ont été "
+"réactivés pour migrer les données existantes. Vous devriez effacer "
+"le champ \"fichier attaché\" dans le type %rowtype si cette donnée "
+"n'est pas nécessaire."
+msgid "Upload module has been migrated to File module."
+msgstr "Le module Upload a été déplacé dans le module File."
+msgid ""
+"Available variables are: [site:name], [site:url], [user:name], "
+"[user:mail], [site:login-url], [site:url-brief], [user:edit-url], "
+"[user:one-time-login-url], [user:cancel-url]."
+msgstr ""
+"Les variables disponibles sont : [site:name], [site:url], [user:name], "
+"[user:mail], [site:login-url], [site:url-brief], [user:edit-url], "
+"[user:one-time-login-url], [user:cancel-url]."
+msgid "not yet assigned"
+msgstr "Pas encore assigné"
+msgid "not yet created"
+msgstr "Pas encore créé"
+msgid ""
+"[user:name],\n"
+"\n"
+"Thank you for registering at [site:name]. You may now log in by "
+"clicking this link or copying and pasting it to your browser:\n"
+"\n"
+"[user:one-time-login-url]\n"
+"\n"
+"This link can only be used once to log in and will lead you to a page "
+"where you can set your password.\n"
+"\n"
+"After setting your password, you will be able to log in at "
+"[site:login-url] in the future using:\n"
+"\n"
+"username: [user:name]\n"
+"password: Your password\n"
+"\n"
+"--  [site:name] team"
+msgstr ""
+"[user:name],\r\n"
+"\r\n"
+"Merci de vous être enregistré sur [site:name]. Vous pouvez "
+"désormais vous identifier en cliquant sur ce lien ou en le copiant "
+"dans votre navigateur :\r\n"
+"\r\n"
+"[user:one-time-login-url]\r\n"
+"\r\n"
+"Ce lien ne peut être utilisé pour s'identifier qu'une seule fois et "
+"il vous conduira à une page où vous pourrez paramétrer votre mot de "
+"passe.\r\n"
+"\r\n"
+"Après avoir paramétré votre mot de passe, vous pourrez vous "
+"identifier à l'adresse [site:login-url] lors de vos prochaines "
+"connexions :\r\n"
+"\r\n"
+"identifiant : [user:name]\r\n"
+"mot de passe : Votre mot de passe\r\n"
+"\r\n"
+"--  L'équipe [site:name]"
+msgid ""
+"[user:name],\n"
+"\n"
+"A site administrator at [site:name] has created an account for you. "
+"You may now log in by clicking this link or copying and pasting it to "
+"your browser:\n"
+"\n"
+"[user:one-time-login-url]\n"
+"\n"
+"This link can only be used once to log in and will lead you to a page "
+"where you can set your password.\n"
+"\n"
+"After setting your password, you will be able to log in at "
+"[site:login-url] in the future using:\n"
+"\n"
+"username: [user:name]\n"
+"password: Your password\n"
+"\n"
+"--  [site:name] team"
+msgstr ""
+"[user:name],\r\n"
+"\r\n"
+"Un administrateur du site [site:name] vous a créé un compte. Vous "
+"pouvez désormais vous identifier en cliquant sur ce lien ou en le "
+"copiant dans votre navigateur :\r\n"
+"\r\n"
+"[user:one-time-login-url]\r\n"
+"\r\n"
+"Ce lien ne peut être utilisé pour s'identifier qu'une seule fois et "
+"il vous conduira à une page où vous pourrez paramétrer votre mot de "
+"passe.\r\n"
+"\r\n"
+"Après avoir paramétré votre mot de passe, vous pourrez vous "
+"identifier à l'adresse [site:login-url] lors de vos prochaines "
+"connexions :\r\n"
+"\r\n"
+"identifiant : [user:name]\r\n"
+"mot de passe : Votre mot de passe\r\n"
+"\r\n"
+"--  L'équipe [site:name]"
+msgid ""
+"[user:name],\n"
+"\n"
+"A request to reset the password for your account has been made at "
+"[site:name].\n"
+"\n"
+"You may now log in by clicking this link or copying and pasting it to "
+"your browser:\n"
+"\n"
+"[user:one-time-login-url]\n"
+"\n"
+"This link can only be used once to log in and will lead you to a page "
+"where you can set your password. It expires after one day and nothing "
+"will happen if it's not used.\n"
+"\n"
+"--  [site:name] team"
+msgstr ""
+"[user:name],\r\n"
+"\r\n"
+"Une demande de renouvellement de mot de passe a été faite pour votre "
+"compte sur [site:name].\r\n"
+"\r\n"
+"Vous pouvez désormais vous identifier en cliquant sur ce lien ou en "
+"le copiant dans votre navigateur :\r\n"
+"\r\n"
+"[user:one-time-login-url]\r\n"
+"\r\n"
+"Ce lien ne peut être utilisé pour s'identifier qu'une seule fois et "
+"il vous conduira à une page où vous pourrez paramétrer votre mot de "
+"passe. Il expirera après un jour et rien ne se passera s'il n'est pas "
+"utilisé.\r\n"
+"\r\n"
+"--  L'équipe [site:name]"
+msgid ""
+"[user:name],\n"
+"\n"
+"Your account on [site:name] has been blocked.\n"
+"\n"
+"--  [site:name] team"
+msgstr ""
+"[user:name],\r\n"
+"\r\n"
+"Votre compte sur [site:name] a été bloqué.\r\n"
+"\r\n"
+"--  L'équipe de [site:name]"
+msgid ""
+"[user:name],\n"
+"\n"
+"A request to cancel your account has been made at [site:name].\n"
+"\n"
+"You may now cancel your account on [site:url-brief] by clicking this "
+"link or copying and pasting it into your browser:\n"
+"\n"
+"[user:cancel-url]\n"
+"\n"
+"NOTE: The cancellation of your account is not reversible.\n"
+"\n"
+"This link expires in one day and nothing will happen if it is not "
+"used.\n"
+"\n"
+"--  [site:name] team"
+msgstr ""
+"[user:name],\r\n"
+"\r\n"
+"Une demande d'annulation de votre compte a été faite sur "
+"[site:name].\r\n"
+"\r\n"
+"Vous pouvez maintenant annuler votre compte sur [site:url-brief] en "
+"cliquant sur ce lien ou en le copiant dans votre navigateur :\r\n"
+"\r\n"
+"[user:cancel-url]\r\n"
+"\r\n"
+"REMARQUE : L'annulation de votre compte n'est pas reversible.\r\n"
+"\r\n"
+"Ce lien expirera après un jour et rien ne se passera s'il n'est pas "
+"utilisé.\r\n"
+"\r\n"
+"--  L'équipe [site:name]"
+msgid ""
+"[user:name],\n"
+"\n"
+"Your account on [site:name] has been canceled.\n"
+"\n"
+"--  [site:name] team"
+msgstr ""
+"[user:name],\r\n"
+"\r\n"
+"Votre compte sur [site:name] a été annulé.\r\n"
+"\r\n"
+"--  L'équipe [site:name]"
+msgid ""
+"The ability to send users their passwords in plain text has been "
+"removed in Drupal 7. Your existing email templates have been modified "
+"to remove it. You should <a href=\"@template-url\">review these "
+"templates</a> to make sure they read properly."
+msgstr ""
+"La possibilité d'envoyer aux utilisateurs leur mot de passe en clair "
+"a été retirée de Drupal 7. Vos gabarits de courriels existants ont "
+"été modifiés pour retirer le mot de passe. Nous vous conseillons de "
+"<a href=\"@template-url\">revoir vos gabarits</a> afin de vous assurer "
+"qu'ils sont correctement lisibles."
+msgid "None (original image)"
+msgstr "Aucun (image d'origine)"
+msgid "The URL of the account edit page."
+msgstr "L'URL de la page de modification du compte."
+msgid ""
+"Nonce from @endpoint rejected because it is not correctly formatted, "
+"nonce: @nonce."
+msgstr ""
+"Le nonce de @endpoint a été rejeté car il n'est pas mis en forme "
+"convenablement, nonce : @nonce."
+msgid ""
+"Nonce received from @endpoint is out of range (time difference: "
+"@intervals). Check possible clock skew."
+msgstr ""
+"Le nonce reçu de @endpoint est hors de portée (différence de temps "
+": @intervals). Vérifier les éventuelles dérives d'horloge."
+msgid "Nonce replay attempt blocked from @ip, nonce: @nonce."
+msgstr "La reproduction du nonce a été bloquée par @ip, nonce: @nonce."
+msgid "Comment display"
+msgstr "Affichage des commentaires"
+msgid "New field name"
+msgstr "Nom du nouveau champ"
+msgid "Error opening socket @socket"
+msgstr "Erreur lors de l'ouverture de la socket @socket"
+msgid "delivery callback not found"
+msgstr "procédure de rappel de livraison non trouvée"
+msgid "callback %callback not found: %q."
+msgstr "procédure de rappel %callback non trouvée : %q."
+msgid ""
+"The specified file %file could not be copied, because the destination "
+"is invalid. More information is available in the system log."
+msgstr ""
+"Le fichier spécifié %file n'a pas pu être copié car l'emplacement "
+"de destination est invalide. Plus d'informations sont disponibles dans "
+"la journalisation du système."
+msgid ""
+"The specified file %file could not be copied, because the destination "
+"directory is not properly configured. This may be caused by a problem "
+"with file or directory permissions. More information is available in "
+"the system log."
+msgstr ""
+"Le fichier spécifié %file n'a pas pu être copié car le répertoire "
+"de destination n'est pas correctement configuré. Cela peut être dû "
+"à un problème de permissions sur le fichier ou le répertoire. Plus "
+"d'informations sont disponibles dans la journalisation du système."
+msgid ""
+"The file %file could not be copied because a file by that name already "
+"exists in the destination directory."
+msgstr ""
+"Le fichier %file n'a pu être copié parce qu'un fichier avec ce nom "
+"existe déjà dans le répertoire de destination"
+msgid ""
+"The specified file %file could not be moved, because the destination "
+"is invalid. More information is available in the system log."
+msgstr ""
+"Le fichier %file spécifié n'a pas pu être déplacé car "
+"l'emplacement de destination est invalide. Plus d'information dans la "
+"journalisation système."
+msgid ""
+"The specified file %file could not be deleted, because it is not a "
+"valid URI. More information is available in the system log."
+msgstr ""
+"Le fichier %file spécifié n'a pas pu être effacé car ce n'est pas "
+"une URI correcte. Plus d'information dans la journalisation système."
+msgid ""
+"The data could not be saved, because the destination is invalid. More "
+"information is available in the system log."
+msgstr ""
+"Les données n'ont pas pu être sauvées car la destination est "
+"invalide. Plus d'informations dans la journalisation système."
+msgid ""
+"File %file (%realpath) could not be copied, because the destination "
+"%destination is invalid. This is often caused by improper use of "
+"file_copy() or a missing stream wrapper."
+msgstr ""
+"Le fichier %file (%realpath) n'a pas pu être copié car l'emplacement "
+"de destination %destination est invalide. Cela est souvent dû à une "
+"utilisation inappropriée de file_copy() ou une balise d'encadrement "
+"manquante."
+msgid "File %file (%realpath) could not be copied because it does not exist."
+msgstr ""
+"Le fichier %file (%realpath) n'a pas pu être copié car il n'existe "
+"pas."
+msgid ""
+"File %file could not be copied because a file by that name already "
+"exists in the destination directory (%directory)"
+msgstr ""
+"Le fichier %file n'a pas pu être copié car un fichier avec ce nom "
+"existe déjà dans le répertoire de destination (%directory)"
+msgid "File %file could not be copied because it would overwrite itself."
+msgstr ""
+"Le fichier %file n'a pas pu être copié car il s'écraserait "
+"lui-même."
+msgid "The specified file %file could not be copied to %destination."
+msgstr "Le fichier %file spécifié n'a pas pu être copié vers %destination."
+msgid ""
+"File %file (%realpath) could not be moved, because the destination "
+"%destination is invalid. This may be caused by improper use of "
+"file_move() or a missing stream wrapper."
+msgstr ""
+"Le fichier %file (%realpath) ne peut pas être déplacé, car la "
+"destination %destination est invalide. Cela peut être causé par un "
+"usage inapproprié de file_move() ou l'absence d'une encapsulation de "
+"flux."
+msgid ""
+"File %file (%realpath) could not be deleted because it is not a valid "
+"URI. This may be caused by improper use of file_delete() or a missing "
+"stream wrapper."
+msgstr ""
+"Le fichier %file (%realpath) ne peut pas être supprimé car l'URI est "
+"invalide. Cela peut être causé par une utilisation inappropriée de "
+"file_delete() ou l'absence d'une encapsulation de flux."
+msgid ""
+"The data could not be saved because the destination %destination is "
+"invalid. This may be caused by improper use of file_save_data() or a "
+"missing stream wrapper."
+msgstr ""
+"Les données n'ont pas pu être sauvées car la destination "
+"%destination est invalide.. Ceci peut etre causé par une mauvaise "
+"utilisation de file_save_data() ou le manque d'un conteneur de stream."
+msgid ""
+"Your PHP configuration only supports a single database type, so it has "
+"been automatically selected."
+msgstr ""
+"Votre configuration PHP ne supporte qu'un type de base de données qui "
+"a donc automatiquement été sélectionné."
+msgid ""
+"Failed to connect to your database server. The server reports the "
+"following message: %error.<ul><li>Is the database server "
+"running?</li><li>Does the database exist, and have you entered the "
+"correct database name?</li><li>Have you entered the correct username "
+"and password?</li><li>Have you entered the correct database "
+"hostname?</li></ul>"
+msgstr ""
+"Échec de connexion au serveur de base de données. Le serveur a "
+"renvoyé le message suivant : %error.<ul><li>Est-ce que le serveur de "
+"base de données fonctionne ?</li><li>Est-ce que la base de données "
+"existe et avez-vous saisi le bon nom de base ?</li><li>Avez vous saisi "
+"les bons nom d'utilisateur et mot de passe ?</li><li>Avez vous saisi "
+"le bon nom d'hôte de la base de données ?</li></ul>"
+msgid ""
+"The version of PHP you are using has known issues with PostgreSQL. You "
+"need to upgrade PHP to 5.2.11, 5.3.1 or greater."
+msgstr ""
+"La version de PHP que vous utilisez a des incompatibilités connues "
+"avec PostgreSQL. Vous devez mettre à jour PHP en version 5.2.11, "
+"5.3.1 ou ultérieure."
+msgid "Exit block region demonstration"
+msgstr "Quitter la présentation des régions de blocs"
+msgid "Customizing the dashboard requires the !permission-name permission."
+msgstr ""
+"La personnalisation du tableau de bord nécessite la permission "
+"!permission-name"
+msgid ""
+"To customize the dashboard page, move blocks to the dashboard regions "
+"on the <a href=\"@dashboard\">Dashboard administration page</a>, or "
+"enable JavaScript on this page to use the drag-and-drop interface."
+msgstr ""
+"Pour personnaliser la page du tableau de bord, déplacer les blocs "
+"dans les régions du tableau de bord sur la <a "
+"href=\"@dashboard\">page d'administration Dashboard</a> ou activer le "
+"support Javascript sur cette page pour utiliser l'interface "
+"glisser-déposer."
+msgid "Configure available dashboard blocks"
+msgstr "Configurer les blocs du tableau de bord disponibles"
+msgid ""
+"Drag and drop these blocks to the columns below. Changes are "
+"automatically saved. More options are available on the <a "
+"href=\"@dashboard-url\">configuration page</a>."
+msgstr ""
+"Glisser et déposer ces blocs dans la colonne ci-dessous. Les "
+"changements sont automatiquement enregistrés. D'autres options sont "
+"disponibles sur la <a href=\"@dashboard-url\">page de "
+"configuration</a>."
+msgid "Configure which blocks can be shown on the dashboard."
+msgstr "Configurer les blocs qui peuvent apparaître sur le tableau de bord."
+msgid ""
+"The Database logging module allows you to view an event log on the <a "
+"href=\"@dblog\">Recent log messages</a> page. The log is a "
+"chronological list of recorded events containing usage data, "
+"performance data, errors, warnings and operational information. "
+"Administrators should check the log on a regular basis to ensure their "
+"site is working properly."
+msgstr ""
+"Le module de journalisation de la base de données vous autorise à "
+"voir l'enregistrement d'un évènement sur la page des <a "
+"href=\"@dblog\">messages récents du journal</a>. Le journal est une "
+"liste chronologique d'évènements enregistrés contenant les données "
+"utilisées, les données de performance, erreurs, avertissements et "
+"informations opérationelles. Les administrateurs devraient vérifier "
+"le journal sur une base régulière pour s'assurer que le site "
+"fonctionne proprement."
+msgid ""
+"In case of errors or problems with the site, the <a "
+"href=\"@dblog\">Recent log messages</a> page can be useful for "
+"debugging, since it shows the sequence of events. The log messages "
+"include usage information, warnings, and errors."
+msgstr ""
+"En cas d'erreurs ou problemes avec le site, les <a "
+"href=\"@dblog\">messages récents du journal</a> peuvent être utiles "
+"pour débugguer, depuis qu'il montre la séquence des évènements. "
+"Les messages du journal incluent des informations sur l'utilisation, "
+"des avertissements et des erreurs."
+msgid ""
+"The Database logging module monitors your website, capturing system "
+"events in a log (shown here) to be reviewed by an authorized "
+"individual at a later time. This log is a list of recorded events "
+"containing usage data, performance data, errors, warnings and "
+"operational information. It is vital to check the Recent log messages "
+"report on a regular basis, as it is often the only way to tell what is "
+"going on."
+msgstr ""
+"Le module Database logging surveille votre site, en enregistrant les "
+"événements système dans un journal (affiché ici) afin de pouvoir "
+"être consulté ultérieurement par un utilisateur habilité. Ce "
+"journal est une liste d'événements contenant des informations "
+"d'utilisation, de performance, d'erreurs, d'avertissements, ainsi que "
+"d'autres informations opérationnelles. Il est important que les "
+"administrateurs du site vérifient régulièrement ce journal afin de "
+"s'assurer que le site fonctionne bien."
+msgid "Database log messages to keep"
+msgstr "Messages de journalisation de la base  à garder."
+msgid ""
+"The maximum number of messages to keep in the database log. Requires a "
+"<a href=\"@cron\">cron maintenance task</a>."
+msgstr ""
+"Nombre maximum de messages à conserver dans le journal. Nécessite "
+"l'<a href=\"@cron\">activation du planificateur de tâche (Cron)</a>."
+msgid "Recent log messages"
+msgstr "Entrées récentes du journal"
+msgid ""
+"Define a string that should be suffixed to the value, like ' m', ' "
+"kb/s'. Leave blank for none. Separate singular and plural values with "
+"a pipe ('pound|pounds')."
+msgstr ""
+"Défini une chaîne qui doit être suffixée par une valeur telle que "
+"'m ' ou 'kb/s'. Laisser vide pour ne rien ajouter. Séparer les "
+"valeurs singulier et pluriel avec un pipe, par exemple : "
+"('mètre|mètres')."
+msgid "Thousand marker"
+msgstr "Marqueur des milliers"
+msgid "Display prefix and suffix."
+msgstr "Afficher le préfixe et le suffixe."
+msgid "Display with prefix and suffix."
+msgstr "Afficher avec le préfixe et le suffixe"
+msgid "- Select a value -"
+msgstr "- Choisir une valeur -"
+msgid "Trim length"
+msgstr "Longueur de coupe"
+msgid "No field is displayed."
+msgstr "Aucun champ n'est affiché."
+msgid "No field is hidden."
+msgstr "Aucun champ n'est caché."
+msgid "Format settings:"
+msgstr "Paramètres de format:"
+msgid "The file used in the !name field may not be referenced."
+msgstr ""
+"Le fichier utilisé dans le champ !name ne peut pas être "
+"référencé."
+msgid ""
+"Text formats are presented on content editing pages in the order "
+"defined on this page. The first format available to a user will be "
+"selected by default."
+msgstr ""
+"Les formats de texte sont présentés sur les pages d'édition de "
+"contenu dans l'ordre défini sur cette page. Le premier format "
+"disponible pour l'utilisateur sera sélectionné par défaut."
+msgid "Missing text format: %format."
+msgstr "Format de texte manquant : %format."
+msgid "Link image to"
+msgstr "Lier l'image à"
+msgid "Image style: @style"
+msgstr "Style d'image : @style"
+msgid "Linked to content"
+msgstr "Lié au contenu"
+msgid "Linked to file"
+msgstr "Lié au fichier"
+msgid "Shown when hovering over the menu link."
+msgstr "S'affiche au survol du lien du menu."
+msgid ""
+"The menu module allows on-the-fly creation of menu links in the "
+"content authoring forms. To configure these settings for a particular "
+"content type, visit the <a href=\"@content-types\">Content types</a> "
+"page, click the <em>edit</em> link for the content type, and go to the "
+"<em>Menu settings</em> section."
+msgstr ""
+"Le module menu permet la création à la volée de liens dans le menu "
+"à partir des formulaires de création de contenu. Pour configurer ces "
+"paramètres pour un type de contenu particulier, visiter la page <a "
+"href=\"@content-types\">Types de contenu</a>, cliquer sur le lien "
+"<em>editer</em> du type de contenu et aller dans la section "
+"<em>Paramètres du menu</em>."
+msgid "Undefined language (@langcode)"
+msgstr "Langue non définie (@langcode)"
+msgid ""
+"Format: %time. The date format is YYYY-MM-DD and %timezone is the time "
+"zone offset from UTC. Leave blank to use the time of form submission."
+msgstr ""
+"Format&nbsp;: %time. Le format de date est AAAA-MM-JJ et %timezone est "
+"le fuseau horaire à partir de l'UTC. Laisser vide pour utiliser la "
+"date de soumission du formulaire."
+msgid "Administrative overlay"
+msgstr "Premier plan (overlay) administratif"
+msgid "Use the overlay for administrative pages."
+msgstr "Utiliser le premier plan (overlay) pour les pages d'administration."
+msgid "Show administrative pages on top of the page you started from."
+msgstr "Afficher les écrans d'administration dans la page en cours (overlay)."
+msgid "A <a href=\"@php-code\">PHP code</a> text format has been created."
+msgstr "Un format de texte <a href=\"@php-code\">PHP code</a> a été créé."
+msgid "Choose which search modules are active from the available modules."
+msgstr ""
+"Choisir quels modules de recherche sont actifs parmi les modules "
+"disponibles"
+msgid "Default search module"
+msgstr "Module de recherche par défaut"
+msgid "Choose which search module is the default."
+msgstr "Choisir le module de recherche par défaut."
+msgid "Your default search module is not selected as an active module."
+msgstr ""
+"Votre module de recherche par défaut n'est pas défini comme module "
+"activé."
+msgid "Search is currently disabled."
+msgstr "La recherche est actuellement désactivée."
+msgid "... !excerpt ... !excerpt ..."
+msgstr "... !excerpt ... !excerpt ..."
+msgid "Syslog identity"
+msgstr "Identité Syslog"
+msgid ""
+"A string that will be prepended to every message logged to Syslog. If "
+"you have multiple sites logging to the same Syslog log file, a unique "
+"identity per site makes it easy to tell the log entries apart."
+msgstr ""
+"Une chaîne qui sera ajoutée devant chaque message enregistré sur "
+"Syslog. Si vous avez plusieurs sites écrivant dans le même fichier "
+"Syslog, un identifiant unique par site facilite la lecture des logs."
+msgid ""
+"Optionally, specify a relative URL to display as the front page.  "
+"Leave blank to display the default content feed."
+msgstr ""
+"Vous pouvez spécifier une URL relative à utiliser comme page "
+"d'accueil. Laissez vide pour afficher le flux de contenu par défaut."
+msgid "Error pages"
+msgstr "Pages d'erreur"
+msgid "The path '%path' is either invalid or you do not have access to it."
+msgstr ""
+"Le chemin '%path' est invalide ou vous n'avez pas le droit d'y "
+"accéder."
+msgid "Last run: %cron-last ago."
+msgstr "Dernière exécution&nbsp;: il y a %cron-last"
+msgid "Run cron every"
+msgstr "Lancer les tâches planifiées (cron) toutes les"
+msgid ""
+"When enabled, only users with the \"Use the site in maintenance mode\" "
+"<a href=\"@permissions-url\">permission</a> are able to access your "
+"site to perform maintenance; all other visitors see the maintenance "
+"mode message configured below. Authorized users can log in directly "
+"via the <a href=\"@user-login\">user login</a> page."
+msgstr ""
+"Une fois activé, seul les utilisateurs avec la <a "
+"href=\"@permissions-url\">permission</a> \"Utiliser le site en mode "
+"maintenance\" sont capables d'accéder à votre site pour effectuer de "
+"la maintenance; tous les autres visiteurs voient le message du mode de "
+"maintenance configuré ci dessous. Les utilisateurs autorisés peuvent "
+"se connecter directement par la <a href=\"@user-login\">page de "
+"connexion utilisateur</a>."
+msgid ""
+"In order for the site and its modules to continue to operate well, a "
+"set of routine administrative operations must run on a regular basis. "
+"The System module manages this task by making use of a system cron "
+"job. You can verify the status of cron tasks by visiting the <a "
+"href=\"@status\">Status report page</a>. For more information, see the "
+"online handbook entry for <a href=\"@handbook\">configuring cron "
+"jobs</a>. You can set up cron job by visiting <a href=\"@cron\">Cron "
+"configuration</a> page"
+msgstr ""
+"Afin que le site et ses modules continuent de fonctionner "
+"correctement, un ensemble d'opérations administratives récurrentes "
+"doivent être exécutées de façon régulière. Le module System "
+"gère cette tâche en utilisant le planificateur de tâches (cron). "
+"Vous pouvez vérifier le statut des tâches planifiées (cron) en "
+"visitant la <a href=\"@status\">page Tableau de bord "
+"d'administration</a>. Pour plus d'informations, voir la page <a "
+"href=\"@handbook\">configuration du planificateur de tâches "
+"(cron)</a>."
+msgid ""
+"Change site name, e-mail address, slogan, default front page, and "
+"number of posts per page, error pages."
+msgstr ""
+"Changer le nom du site, l'adresse de courriel, le slogan, la page "
+"d'accueil par défaut, le nombre de contributions par page et les "
+"pages d'erreur."
+msgid "Manage automatic site maintenance tasks."
+msgstr "Gérer les tâches de maintenance automatique du site."
+msgid ""
+"Did not delete temporary file \"%path\" during garbage collection, "
+"because it is in use by the following modules: %modules."
+msgstr ""
+"N'a pas supprimé le fichier temporaire \"%path\" pendant le nettoyage "
+"de la mémoire car il est utilisé par les modules suivants : "
+"%modules."
+msgid "Weight for added term"
+msgstr "Poids du terme ajouté"
+msgid ""
+"Subdirectory in the file upload directory where pictures will be "
+"stored."
+msgstr ""
+"Sous-répertoire dans le répertoire de téléchargement où les "
+"images seront stockées."
+msgid "Pictures larger than this will be scaled down to this size."
+msgstr "Les images plus grandes seront redimensionnées à cette taille."
+msgid ""
+"Maximum allowed file size for uploaded pictures. Upload size is "
+"normally limited only by the PHP maximum post and file upload "
+"settings, and images are automatically scaled down to the dimensions "
+"specified above."
+msgstr ""
+"Taille de fichier maximale autorisée pour les envois d'images. La "
+"taille d'envoi est en principe uniquement limitée par la "
+"configuration PHP de la taille maximale des envois (post_max_size) et "
+"la taille des fichiers transféré sur le serveur "
+"(upload_max_filesize), de plus les images sont automatiquement "
+"retaillées aux dimensions définies ci-dessus."
+msgid ""
+"Your virtual face or picture. Pictures larger than @dimensions pixels "
+"will be scaled down."
+msgstr ""
+"Votre image ou avatar. Les images de taille supérieure à @dimensions "
+"pixels seront réduites."
+msgid ""
+"[user:name],\n"
+"\n"
+"Your account at [site:name] has been activated.\n"
+"\n"
+"You may now log in by clicking this link or copying and pasting it "
+"into your browser:\n"
+"\n"
+"[user:one-time-login-url]\n"
+"\n"
+"This link can only be used once to log in and will lead you to a page "
+"where you can set your password.\n"
+"\n"
+"After setting your password, you will be able to log in at "
+"[site:login-url] in the future using:\n"
+"\n"
+"username: [user:name]\n"
+"password: Your password\n"
+"\n"
+"--  [site:name] team"
+msgstr ""
+"[user:name],\r\n"
+"\r\n"
+"Votre compte sur [site:name] a été activé.\r\n"
+"\r\n"
+"Vous pouvez désormais vous identifier en cliquant sur ce lien ou en "
+"le copiant dans votre navigateur :\r\n"
+"\r\n"
+"[user:one-time-login-url]\r\n"
+"\r\n"
+"Ce lien ne peut être utilisé pour s'identifier qu'une seule fois et "
+"il vous conduira à une page où vous pourrez paramétrer votre mot de "
+"passe.\r\n"
+"\r\n"
+"Après avoir paramétré votre mot de passe, vous pourrez vous "
+"identifier à l'adresse [site:login-url] lors de vos prochaines "
+"connexions :\r\n"
+"\r\n"
+"identifiant : [user:name]\r\n"
+"mot de passe : Votre mot de passe\r\n"
+"\r\n"
+"--  L'équipe [site:name]"
+msgid "Upload an image to go with this article."
+msgstr "Transférer une image pour accompagner cet article."
+msgid ""
+"Minimal profile for running tests. Includes absolutely required "
+"modules only."
+msgstr ""
+"Profil minimal pour lancer des tests. N'inclut que les modules "
+"absolument nécessaires."
+msgid "The settings file is writable."
+msgstr "Le fichier de configuration est accessible en écriture."
+msgid "The settings file is owned by the web server."
+msgstr "Le fichier de configuration appartient au serveur web."
+msgid ""
+"The @drupal installer failed to create a settings file with proper "
+"file ownership. Log on to your web server, remove the existing %file "
+"file, and create a new one by copying the %default_file file to %file. "
+"More details about installing Drupal are available in <a "
+"href=\"@install_txt\">INSTALL.txt</a>. If you have problems with the "
+"file permissions on your server, consult the <a "
+"href=\"@handbook_url\">online handbook</a>."
+msgstr ""
+"L'installateur @drupal a échoué lors de la création d'un fichier de "
+"paramétrage avec les permissions d'accès adéquates. Connectez-vous "
+"à votre serveur web, supprimez le fichier %file existant, et créez "
+"un nouveau fichier en copiant le fichier %default_file vers %file. "
+"Plus de détails sur l'installation de Drupal sont disponibles dans le "
+"fichier <a href=\"@install_txt\">INSTALL.txt</a>. Si vous avez des "
+"problèmes avec les permissions des fichiers sur votre serveur, "
+"consulter le <a href=\"@handbook_url\">manuel en ligne</a>."
+msgid "Invalid merge query: no conditions"
+msgstr "Requête de fusion invalide : aucune condition"
+msgid "Weight for @block block"
+msgstr "Poids du bloc @block"
+msgid "Region for @block block"
+msgstr "Région du bloc @block"
+msgid "Comment approval"
+msgstr "Approbation de commentaire"
+msgid ""
+"Comments from users who have the <em>Skip comment approval</em> "
+"permission are published immediately. All other comments are placed in "
+"the <a href='@comment-approval'>Unapproved comments</a> queue, until a "
+"user who has permission to <em>Administer comments</em> publishes or "
+"deletes them. Published comments can be bulk managed on the <a "
+"href='@admin-comment'>Published comments</a> administration page."
+msgstr ""
+"Les commentaires des utilisateurs qui ont le droit <em>sauter "
+"l'approbation des commentaires</em> sont publiés immédiatement. Tous "
+"les autres commentaires sont placés dans la file d'attente des <a "
+"href='@comment-approval'>Commentaires non approuvés</a> jusqu'à ce "
+"qu'un utilisateur qui dispose du droit <em>Administrer les "
+"commentaires</em> les publie ou les supprime. Les commentaires "
+"publiés peuvent être gérés en masse à partir de la page "
+"d'administration des <a href='@admin-comment'>Commentaires "
+"publiés</a>."
+msgid "Post comments"
+msgstr "Poster des commentaires"
+msgid "Skip comment approval"
+msgstr "Sauter l'approbation des commentaires"
+msgid "View and customize your dashboard."
+msgstr "Voir et personnaliser votre tableau de bord."
+msgid "Customize your dashboard."
+msgstr "Personnalisez votre tableau de bord."
+msgid "This function can only be used to delete fields without data"
+msgstr ""
+"Cette fonction peut seulement être utilisée pour supprimer des "
+"champs sans données."
+msgid "Are you sure you want to disable the text format %format?"
+msgstr "Êtes-vous sûr de vouloir désactiver le format de texte %format?"
+msgid ""
+"Disabled text formats are completely removed from the administrative "
+"interface, and any content stored with that format will not be "
+"displayed. This action cannot be undone."
+msgstr ""
+"Les formats de texte désactivés sont complètement retirés de "
+"l'interface d'administration et tout contenu enregistré avec ce "
+"format ne sera pas affiché. Cette action ne pourra pas être "
+"annulée."
+msgid "Disabled text format %format."
+msgstr "Format de texte %format désactivé."
+msgid "Text Formats"
+msgstr "Formats de texte"
+msgid "Disable text format"
+msgstr "Désactiver le format de texte"
+msgid "Hot topic, new comments"
+msgstr "Sujet actif, nouveaux commentaires"
+msgid "Hot topic"
+msgstr "Sujet actif"
+msgid "Normal topic"
+msgstr "Sujet normal"
+msgid "Closed topic"
+msgstr "Sujet fermé"
+msgid "Reference for usage, configuration, and modules."
+msgstr "Référence pour l'utilisation, la configuration et les modules."
+msgid "and where %property is %value"
+msgstr "et où %property est %value"
+msgid "where %property is %value"
+msgstr "où %property est %value"
+msgid "and where"
+msgstr "et où"
+msgid ""
+"The RDF module enriches your content with metadata to let other "
+"applications (e.g., search engines, aggregators, and so on) better "
+"understand its relationships and attributes. This semantically "
+"enriched, machine-readable output for Drupal sites uses the <a "
+"href=\"@rdfa\">RDFa specification</a> which allows RDF data to be "
+"embedded in HTML markup. Other modules can define mappings of their "
+"data to RDF terms, and the RDF module makes this RDF data available to "
+"the theme. The core Drupal modules define RDF mappings for their data "
+"model, and the core Drupal themes output this RDF metadata information "
+"along with the human-readable visual information. For more "
+"information, see the online handbook entry for <a href=\"@rdf\">RDF "
+"module</a>."
+msgstr ""
+"Le module RDF enrichit votre contenu avec des métadonnées permettant "
+"à d'autres applications (par ex. : moteurs de recherche, "
+"agrégateurs, etc.) de mieux comprendre ses relations et attributs. "
+"Enrichie sémantiquement et lisible par des systèmes, cette "
+"information produite par les sites Drupal utilise la <a "
+"href=\"@rdfa\">spécification RDFa</a> qui permet aux données RDF "
+"d'être incluses dans le balisage HTML. D'autres modules peuvent "
+"définir des correspondances entre leurs données et des termes RDF, "
+"le module RDF rend alors ces données RDF disponibles pour le thème. "
+"Les modules du cœur de Drupal définissent des correspondances RDF "
+"pour leurs modèles de données, les thèmes du cœur de Drupal "
+"génèrent ces métadonnées RDF ainsi que les informations lisibles "
+"par l'utilisateur. Pour plus d'informations, consulter la section du "
+"manuel en ligne sur le <a href=\"@rdf\">module RDF</a>."
+msgid "Current URL is @url."
+msgstr "L'URL actuelle est @url."
+msgid "Page title @actual is equal to @expected."
+msgstr "Le titre de la page @actual est égal à @expected."
+msgid "Page title @actual is not equal to @unexpected."
+msgstr "Le titre de la page @actual n'est pas égual à @unexpected"
+msgid "HTTP response not expected !code, actual !curl_code"
+msgstr "Réponse HTTP non attendue !code, actuel : !curl_code"
+msgid "Configure @module permissions"
+msgstr "Configurer les droits pour @module"
+msgid "Select and configure your themes."
+msgstr "Choisir et configurer vos thèmes."
+msgid "Administer settings."
+msgstr "Administrer les paramètres."
+msgid "View reports, updates, and errors."
+msgstr "Voir les rapports, les mises à jour et les erreurs."
+msgid "Stores temporary data for system_update_7061."
+msgstr "Stocke des données temporaires pour le system_update_7061."
+msgid "Administrative toolbar"
+msgstr "Barre d'outils d'administration"
+msgid "Install new module or theme"
+msgstr "Installer un nouveau module ou thème"
+msgid "Install new module"
+msgstr "Installer un nouveau module"
+msgid "Install new theme"
+msgstr "Installer un nouveau thème"
+msgid "%property is %value"
+msgstr "%property a pour valeur %value"
+msgid "Manage user accounts, roles, and permissions."
+msgstr "Gérer les comptes utilisateurs, les rôles et les droits."
+msgid ""
+"Renamed the 'post comments without approval' permission to 'skip "
+"comment approval'."
+msgstr ""
+"Renommage de la permission 'soumettre des commentaires sans "
+"approbation' en 'Sauter l'approbation des commentaires'."
+msgid "Nothing"
+msgstr "Rien"
+msgid "Lolspeak"
+msgstr "Lolspeak"
+msgid "%type: !message in %function (line %line of %file)."
+msgstr "%type : !message dans %function (ligne %line dans %file)."
+msgid "Update @title"
+msgstr "Mettre à jour @title"
+msgid ""
+"A unique machine-readable name. Can only contain lowercase letters, "
+"numbers, and underscores."
+msgstr ""
+"Un nom unique compréhensible par une machine. Peut seulement contenir "
+"des lettres minuscules, chiffres, et tirets-bas (_)."
+msgid "The machine-readable name must contain unique characters."
+msgstr "Le nom système doit être unique."
+msgid ""
+"The machine-readable name must contain only lowercase letters, "
+"numbers, and hyphens."
+msgstr ""
+"Le nom compréhensible par une machine ne doit contenir que des "
+"lettres minuscules, chiffres, et traits d'union."
+msgid "The machine-readable name is already in use. It must be unique."
+msgstr "Le nom système est déjà utilisé. Il doit être unique."
+msgid "Asturian"
+msgstr "Asturien"
+msgid "English, British"
+msgstr "Anglais, Britanique"
+msgid "Haitian Creole"
+msgstr "Créole haïtien"
+msgid "Portuguese, International"
+msgstr "Portuguais, International"
+msgid "Weight for @title"
+msgstr "Poids pour @title"
+msgid "Weight for row @number"
+msgstr "Poids pour la ligne @number"
+msgid "Parent for @title"
+msgstr "Parent de @title"
+msgid "New field label"
+msgstr "Étiquette du nouveau champ"
+msgid "Parent for new field"
+msgstr "Parent du nouveau champ"
+msgid "Type of new field"
+msgstr "Type du nouveau champ"
+msgid "Widget for new field"
+msgstr "Widget du nouveau champ"
+msgid "Existing field label"
+msgstr "Étiquette du champ existant"
+msgid "Parent for existing field"
+msgstr "Parent du champ existant"
+msgid "Existing field to share"
+msgstr "Champ existant à partager"
+msgid "Widget for existing field"
+msgstr "Widget pour le champ existant"
+msgid "Label display for @title"
+msgstr "Étiquette affichée pour @title"
+msgid "Formatter for @title"
+msgstr "Mise en forme pour @title"
+msgid "Parents for @title"
+msgstr "Parents pour @title"
+msgid "Visibility for @title"
+msgstr "Visibilité de @title"
+msgid ""
+"There is data for this field in the database. The field settings can "
+"no longer be changed."
+msgstr ""
+"Il y a des données pour ce champ en base de données. Les paramètres "
+"de ce champ ne peuvent plus être modifiés."
+msgid "Weight for new file"
+msgstr "Poids du nouveau fichier"
+msgid "Choose a file"
+msgstr "Choisir un fichier"
+msgid "Weight for new effect"
+msgstr "Poids du nouvel effet"
+msgid "@title language provider"
+msgstr "@title fournisseur de langue"
+msgid "Enable @title menu link"
+msgstr "Activer le lien de menu @title"
+msgid ""
+"A unique name to construct the URL for the menu. It must only contain "
+"lowercase letters, numbers and hyphens."
+msgstr ""
+"Un nom unique pour construire l'URL du menu. Il ne doit contenir que "
+"des lettres minuscules, des nombres et des tirets."
+msgid ""
+"A unique machine-readable name for this content type. It must only "
+"contain lowercase letters, numbers, and underscores. This name will be "
+"used for constructing the URL of the %node-add page, in which "
+"underscores will be converted into hyphens."
+msgstr ""
+"Un nom unique compréhensible par une machine pour ce type de contenu. "
+"Peut seulement contenir des lettres minuscules, chiffres, et "
+"tirets-bas (_). Ce nom sera utilisé pour construire l'URL de la page "
+"%node_add, dans laquelle tirets-bas (_) sera converti en tiret (-)."
+msgid "Choice label"
+msgstr "Étiquette de choix"
+msgid "New choice label"
+msgstr "Nouvelle étiquette de choix"
+msgid "Vote count for choice @label"
+msgstr "Décompte des voix pour le choix @label"
+msgid "Vote count for new choice"
+msgstr "Décompte des voix pour le nouveau choix"
+msgid "Weight for choice @label"
+msgstr "Poids pour le choix @label"
+msgid "Weight for new choice"
+msgstr "Poids du nouveau choix"
+msgid "Category for @title"
+msgstr "Catégorie de @title"
+msgid "Active modules"
+msgstr "Modules actifs"
+msgid "@original_title (@parent_title)"
+msgstr "@original_title (@parent_title)"
+msgid ""
+"Your PHP installation is too old. Drupal requires at least PHP 5.2.5, "
+"or PHP @version with the htmlspecialchars security patch backported."
+msgstr ""
+"Votre installation de PHP est obsolète. Drupal requiert au minimum "
+"PHP 5.2.5, ou PHP @version avec le patch de sécurité "
+"htmlspecialchars appliqué."
+msgid ""
+"Your web server does not appear to support PDO (PHP Data Objects). Ask "
+"your hosting provider if they support the native PDO extension. See "
+"the <a href=\"@link\">system requirements</a> page for more "
+"information."
+msgstr ""
+"Votre serveur web ne semble pas supporter PDO (PHP Data Objects). "
+"Demander à votre hébergeur s'il supporte l'extension native PDO. "
+"Voir la <a href=\"@link\">page des pré-requis système</a> pour plus "
+"d'informations."
+msgid ""
+"Your web server seems to have the wrong version of PDO installed. "
+"Drupal 7 requires the PDO extension from PHP core. This system has the "
+"older PECL version. See the <a href=\"@link\">system requirements</a> "
+"page for more information."
+msgstr ""
+"Votre serveur semble avoir une mauvaise version de PDO installé. "
+"Drupal 7 nécessite l'extension PDO du core de PHP. Ce système a une "
+"version PECL plus ancienne. Voir la <a href=\"@link\">page des "
+"pré-requis système</a> pour plus d'informations."
+msgid "List of trigger actions when !description"
+msgstr "Lister les actions déclenchées quand !description"
+msgid ""
+"The database version %version is less than the minimum required "
+"version %minimum_version."
+msgstr ""
+"La version de la base de données %version est antérieure à la "
+"version minimale requise %minimum_version."
+msgid "!theme (default theme)"
+msgstr "!theme (thème par défaut)"
+msgid "!theme (administration theme)"
+msgstr "!theme (thème pour l'administration)"
+msgid ""
+"The Dashboard module provides a <a href=\"@dashboard\">Dashboard "
+"page</a> in the administrative interface for organizing administrative "
+"tasks and navigation, and tracking information within your site. The "
+"Dashboard page contains blocks, which you can add to and arrange using "
+"the drag-and-drop interface that appears when you click on the "
+"<em>Customize dashboard</em> link. Within this interface, blocks that "
+"are not primarily used for site administration do not appear by "
+"default, but can be added via the <em>Add other blocks</em> link. For "
+"more information, see the online handbook entry for <a "
+"href=\"@handbook\">Dashboard module</a>."
+msgstr ""
+"Le module Dashboard fournit une <a href=\"@dashboard\">page de tableau "
+"de bord</a> dans l'interface d'administration pour organiser les "
+"tâches administratives, la navigation et les données de suivi dans "
+"votre site. La page du tableau de bord contient des blocs que vous "
+"pouvez ajouter ou réarranger en utilisant l'interface par "
+"glisser/déposer qui apparaît quand vous cliquez sur le lien "
+"<em>Personnaliser le tableau de bord</em>. Dans cette interface, les "
+"blocs qui ne sont pas utilisés en priorité pour l'administration du "
+"site n'apparaissent pas par défaut, mais peuvent être ajoutés par "
+"le lien <em>Ajouter un autre bloc</em>. Pour plus d'informations, voir "
+"<a href=\"@handbook\">Dashboard module</a> dans la documentation en "
+"ligne."
+msgid ""
+"Rearrange blocks for display on the <a "
+"href=\"@dashboard-url\">Dashboard page</a>. Blocks placed in the "
+"<em>Dashboard (inactive)</em> region are not displayed when viewing "
+"the Dashboard page, but are available within its <em>Customize "
+"dashboard</em> interface. Removing a block from active dashboard "
+"display makes it available on the main <a href=\"@blocks-url\">blocks "
+"administration page</a>."
+msgstr ""
+"Réarrangez l'affichage des blocs sur la <a "
+"href=\"@dashboard-url\">page du tableau de bord</a>. Les blocs placés "
+"sur la région <em>Tableau de bord (inactif)</em> ne sont pas "
+"affichés lors de la visualisation de la page du tableau de bord, mais "
+"sont accessibles dans l'interface <em>Personnaliser le tableau de "
+"bord</em>. Retirer un bloc depuis l'affichage du tableau de bord actif "
+"le rend accessible sur la <a href=\"@blocks-url\">page principale "
+"d'administration des blocs</a>."
+msgid "Add other blocks"
+msgstr "Ajouter d'autres blocs"
+msgid "URL fallback"
+msgstr "URL de remplacement"
+msgid "Use an already detected language for URLs if none is found."
+msgstr ""
+"Utiliser une langue déjà détecté des URLs si aucune langue n'est "
+"trouvé."
+msgid "%type_name: Create new content"
+msgstr "%type_name&nbsp;: Créer un nouveau contenu"
+msgid "%type_name: Edit own content"
+msgstr "%type_name&nbsp;: Modifier son propre contenu"
+msgid "%type_name: Edit any content"
+msgstr "%type_name&nbsp;: Modifier n'importe quel contenu"
+msgid "%type_name: Delete own content"
+msgstr "%type_name&nbsp;: Supprimer son propre contenu"
+msgid "%type_name: Delete any content"
+msgstr "%type_name&nbsp;: Supprimer n'importe quel contenu"
+msgid ""
+"The message has been dismissed. You can change your overlay settings "
+"at any time by visiting your profile page."
+msgstr ""
+"Le message a été retiré. Vous pouvez changer votre configuration du "
+"premier plan (overlay) à n'importe quel moment en visitant votre page "
+"de profil."
+msgid ""
+"If you have problems accessing administrative pages on this site, "
+"disable the overlay on your profile page."
+msgstr ""
+"Si vous avez des problèmes pour accéder aux pages d'administration "
+"du site, désactiver le premier plan (overlay) dans votre profil."
+msgid "Dismiss this message."
+msgstr "Ignorer ce message."
+msgid "Options for the administrative overlay"
+msgstr "Options du premier plan d'administration (overlay)"
+msgid "Next steps"
+msgstr "Étapes suivantes"
+msgid ""
+"File %file could not be copied, because the destination directory "
+"%destination is not configured correctly."
+msgstr ""
+"Le fichier %file n'a pas pu être copié car le répertoire de "
+"destination %destination n'est pas configuré correctement"
+msgid "@driver_name settings"
+msgstr "Paramètres de @driver_name"
+msgid "MySQL, MariaDB, or equivalent"
+msgstr "MySQL, MariaDB ou équivalent"
+msgid "SQLite"
+msgstr "SQLite"
+msgid "Database file"
+msgstr "Fichier de base de données"
+msgid ""
+"The absolute path to the file where @drupal data will be stored. This "
+"must be writable by the web server and should exist outside of the web "
+"root."
+msgstr ""
+"Le chemin absolu des fichiers où les données @drupal seront "
+"enregistrées. Ce répertoire doit être accessible en écriture par "
+"le serveur web et devrait se trouver en dehors du répertoire racine "
+"du serveur web."
+msgid "The directory you specified is not writable by the web server."
+msgstr ""
+"Le répertoire que vous avez spécifié n'est pas accessible en "
+"écriture par le serveur web."
+msgid "Autocomplete popup"
+msgstr "Popup d'auto-complétion"
+msgid "Searching for matches..."
+msgstr "Recherche de correspondances..."
+msgid ""
+"The Field module allows custom data fields to be defined for "
+"<em>entity</em> types (entities include content items, comments, user "
+"accounts, and taxonomy terms). The Field module takes care of storing, "
+"loading, editing, and rendering field data. Most users will not "
+"interact with the Field module directly, but will instead use the <a "
+"href=\"@field-ui-help\">Field UI module</a> user interface. Module "
+"developers can use the Field API to make new entity types "
+"\"fieldable\" and thus allow fields to be attached to them. For more "
+"information, see the online handbook entry for <a "
+"href=\"@field\">Field module</a>."
+msgstr ""
+"Le module Field permet de personnaliser des champs de données devant "
+"être définis pour les types d'<em>entités</em> (les entités "
+"incluent les éléments de contenu, les commentaires, les comptes "
+"utilisateur et les termes de taxonomie.). Le module Field s'occupe de "
+"l'enregistrement, le chargement, l'édition et le rendu des données "
+"des champs. La plupart des utilisateurs n'agiront pas directement sur "
+"le module Field mais utiliseront plutôt l'interface utilisateur du <a "
+"href=\"@field-ui-help\">module Field UI</a>. Les dévelopeurs de "
+"modules peuvent utiliser la Field API pour créer de nouveaux types "
+"d'entités \"fieldables\" ce qui permet de leur attacher des champs. "
+"Pour plus d'information, voir <a href=\"@field\">Field module</a> dans "
+"la documentation en ligne."
+msgid "No fields are present yet."
+msgstr "Aucun champ n'est encore présent."
+msgctxt "Font weight"
+msgid "Strong"
+msgstr "Gras"
+msgid ""
+"After you create an image style, you can add effects: crop, scale, "
+"resize, rotate, and desaturate (other contributed modules provide "
+"additional effects). For example, by combining effects as crop, scale, "
+"and desaturate, you can create square, grayscale thumbnails."
+msgstr ""
+"Après avoir créé un style d'image, vous pouvez ajouter des effets : "
+"recadrer, agrandir, redimensionner, désaturer, faire pivoter "
+"(d'autres modules peuvent rajouter des effets supplémentaires). Par "
+"exemple, en combinant les effets comme recadrer, agrandir et "
+"désaturer vous pouvez créer des miniatures carrés en niveau de "
+"gris."
+msgid "Read more<span class=\"element-invisible\"> about @title</span>"
+msgstr "Lire la suite<span class=\"element-invisible\"> de @title</span>"
+msgid ""
+"Optionally specify an alternative URL by which this content can be "
+"accessed. For example, type \"about\" when writing an about page. Use "
+"a relative path and don't add a trailing slash or the URL alias won't "
+"work."
+msgstr ""
+"Spécifiez une URL alternative par laquelle il est possible d'accéder "
+"à ce contenu. Par exemple, saisissez \"apropos\" lorsque que vous "
+"écrivez une page qui décrit votre site. Utilisez un chemin relatif "
+"et n'ajoutez pas de slash à la fin sinon quoi l'alias d'URL ne "
+"fonctionnera pas."
+msgid ""
+"The PHP filter module adds a PHP filter to your site, for use with <a "
+"href=\"@filter\">text formats</a>. This filter adds the ability to "
+"execute PHP code in any text field that uses a text format (such as "
+"the body of a content item or the text of a comment). <a "
+"href=\"@php-net\">PHP</a> is a general-purpose scripting language "
+"widely-used for web development, and is the language with which Drupal "
+"has been developed. For more information, see the online handbook "
+"entry for the <a href=\"@php\">PHP filter module</a>."
+msgstr ""
+"Le module PHP filter ajoute un filtre PHP à votre site, pour utiliser "
+"avec les <a href=\"@filter\">formats de texte</a>. Ce filtre ajoute la "
+"possibilité d'exécuter du code PHP dans n'importe quel champ de "
+"texte qui utilise un format de texte (comme le corps de texte d'un "
+"contenu ou le texte d'un commentaire). <a href=\"@php-net\">PHP</a> "
+"est un language de script généraliste largement utilisé dans le "
+"développement web et il est le language dans lequel Drupal a été "
+"développé. Pour plus d'informations, voir <a href=\"@php\">PHP "
+"filter module</a> dans la documentation en ligne."
+msgid "The number of votes that have been cast on a poll."
+msgstr "Le nombre de vote qui ont été enregistré sur un sondage."
+msgid "The length of time the poll is set to run."
+msgstr "La durée pendant laquelle le sondage doit être actif."
+msgid "Uninstall @module module"
+msgstr "Désinstaller le module @module"
+msgid "Aggregate and compress CSS files."
+msgstr "Agréger et compresser les fichiers CSS."
+msgid "Aggregate JavaScript files."
+msgstr "Agréger les fichiers JavaScript."
+msgid ""
+"To uninstall @module, the following module must be uninstalled first: "
+"@required_modules"
+msgid_plural ""
+"To uninstall @module, the following modules must be uninstalled first: "
+"@required_modules"
+msgstr[0] ""
+"Pour désinstaller @module, le module suivant doit être désinstallé "
+"au préalable : @required_modules"
+msgstr[1] ""
+"Pour désinstaller @module, les modules suivants doivent être "
+"désinstallés au préalable : @required_modules"
+msgid "Enable newly added modules"
+msgstr "Activer les modules récemment ajoutés"
+msgid "Enable newly added themes"
+msgstr "Activer les thèmes récemment ajoutés"
+msgid ""
+"The uninstall process removes all data related to a module. To "
+"uninstall a module, you must first disable it on the main <a "
+"href=\"@modules\">Modules page</a>."
+msgstr ""
+"Le processus de désinstallation retire toutes les données relatives "
+"au module. Pour désinstaller un module, vous devez d'abord le "
+"désactiver dans la page <a href=\"@modules\">Modules</a>."
+msgid "View the administration theme"
+msgstr "Voir le thème d'administration"
+msgid ""
+"This is only used when the site is configured to use a separate "
+"administration theme on the <a href=\"@appearance-url\">Appearance</a> "
+"page."
+msgstr ""
+"Seulement utilisé quand le site est configuré pour utiliser un "
+"thème d'administration dédié sur la <a "
+"href=\"@appearance-url\">page de configuration de l'apparence</a>."
+msgid "Database system"
+msgstr "Système de base de données"
+msgid "Database system version"
+msgstr "Version du système de base de données"
+msgid ""
+"The Toolbar module displays a bar containing top-level administrative "
+"links across the top of the screen. Below that, the Toolbar module has "
+"a <em>drawer</em> section where it displays links provided by other "
+"modules, such as the core <a href=\"@shortcuts-help\">Shortcut "
+"module</a>. The drawer can be hidden/shown by using the show/hide "
+"shortcuts link at the end of the toolbar."
+msgstr ""
+"Le module Toolbar affiche une barre en travers de l'écran contenant "
+"les liens d'administration de premier niveau. En dessous, le module "
+"Toolbar possède une section <em>tiroir</em> dans laquelle s'affiche "
+"les liens fournis par les autres modules, comme le module core "
+"Shortcuts. Le tiroir peut être afficher/cacher en utilisant les "
+"raccourcis afficher/cacher à la fin de la barre d'outils."
+msgid "Hide shortcuts"
+msgstr "Cacher les raccourcis"
+msgid "Indexed %count content items for tracking."
+msgstr "%count contenus indexés pour le suivi."
+msgid ""
+"There is a tab on this page for each module that defines triggers. On "
+"this tab you can assign actions to run when triggers from the <a "
+"href=\"@module-help\">@module-name module</a> happen."
+msgstr ""
+"Chaque onglet de cette page correspond à un module qui définit un "
+"déclencheur. Dans cet onglet vous pouvez assigner des actions à "
+"exécuter quand les déclencheurs du <a href=\"@module-help\">module "
+"@module-name</a> se produisent."
+msgid "Release notes for @project_title"
+msgstr "Notes de version pour @project_title"
+msgid "The role settings have been updated."
+msgstr "Les paramètres des rôles ont été mis à jour."
+msgid "Disable the account and keep its content."
+msgstr "Désactiver le compte et garder son contenu."
+msgid "Disable the account and unpublish its content."
+msgstr "Désactiver le compte et dépublier son contenu"
+msgid ""
+"Delete the account and make its content belong to the %anonymous-name "
+"user."
+msgstr ""
+"Supprimer le compte et attribuer son contenu à l'utilisateur "
+"%anonymous-name."
+msgid "Delete the account and its content."
+msgstr "Supprimer le compte et son contenu"
+msgid "Display on user registration form."
+msgstr "Afficher sur le formulaire d'enregistrement d'un utilisateur."
+msgid "This is compulsory for 'required' fields."
+msgstr "C'est obligatoire pour les champs 'requis'."
+msgid "Drupal system listing compatible test"
+msgstr "Test compatible avec le système de listing de Drupal"
+msgid "Support module for testing the drupal_system_listing function."
+msgstr "Module de soutien pour tester la fonction drupal_system_listing."
+msgid "Drupal system listing incompatible test"
+msgstr "Test incompatible avec le système de listing de Drupal"
+msgid "@count orphaned actions (%orphans) exist in the actions table. !link"
+msgstr ""
+"@count actions orphelines (%orphans) existent dans la table des "
+"actions. !link"
+msgid "Deleted 1 comment."
+msgid_plural "Deleted @count comments."
+msgstr[0] "1 commentaire supprimé."
+msgstr[1] "@count commentaires supprimés."
+msgid "Use field label instead of the \"On value\" as label"
+msgstr "Utiliser l'étiquette du champ au lieu de l'étiquette \"Par valeur\""
+msgid "Deleted 1 post."
+msgid_plural "Deleted @count posts."
+msgstr[0] "1 contribution effacée."
+msgstr[1] "@count contributions effacées"
+msgid "tracker"
+msgstr "suivi"
+msgid ""
+"Automatic updating of Drupal core is not supported. See the <a "
+"href=\"@upgrade-guide\">upgrade guide</a> for information on how to "
+"update Drupal core manually."
+msgstr ""
+"La mise à jour automatique du cœur de Drupal n'est pas supportée. "
+"Référez-vous au <a href=\"@upgrade-guide\">guide de mise à jour</a> "
+"pour obtenir des informations sur la façon de mettre à jour le cœur "
+"de Drupal manuellement."
+msgid ""
+"%archive_file contains a version of %names that is not compatible with "
+"Drupal !version."
+msgid_plural ""
+"%archive_file contains versions of modules or themes that are not "
+"compatible with Drupal !version: %names"
+msgstr[0] ""
+"%archive_file contient une version de %names qui est incompatible avec "
+"Drupal !version."
+msgstr[1] ""
+"%archive_file contient des versions de modules ou thèmes qui sont "
+"incompatible avec Drupal !version : %names"
+msgid ""
+"The %setting setting is currently set to '%current_value', but needs "
+"to be '%needed_value'. Change this by running the following query: "
+"!query"
+msgstr ""
+"Le réglage %setting est actuellement défini sur '%current_value', "
+"mais a besoin d'être '%needed_value'. Changez cela en exécutant la "
+"requête suivante : !query"
+msgid "List (integer)"
+msgstr "Liste (entier)"
+msgid ""
+"This field stores integer values from a list of allowed 'value => "
+"label' pairs, i.e. 'Lifetime in days': 1 => 1 day, 7 => 1 week, 31 => "
+"1 month."
+msgstr ""
+"Ce champ enregistre des entiers depuis une liste de valeurs pairées "
+"autorisées. Exemple : 'Lifetime in days': 1 => 1 day, 7 => 1 week, 31 "
+"=> 1 month."
+msgid "List (float)"
+msgstr "Liste (réel à virgule flottante)"
+msgid ""
+"This field stores float values from a list of allowed 'value => label' "
+"pairs, i.e. 'Fraction': 0 => 0, .25 => 1/4, .75 => 3/4, 1 => 1."
+msgstr ""
+"Ce champ enregistre des valeurs décimales depuis une liste de valeurs "
+"pairées autorisées. Exemple : 'Fraction': 0 => 0, .25 => 1/4, .75 => "
+"3/4, 1 => 1."
+msgid ""
+"This field stores text values from a list of allowed 'value => label' "
+"pairs, i.e. 'US States': IL => Illinois, IA => Iowa, IN => Indiana."
+msgstr ""
+"Ce champ enregistre les valeurs de texte depuis une liste de valeurs "
+"pairées autorisées 'valeur => étiquette'. Exemple : 'US States': IL "
+"=> Illinois, IA => Iowa, IN => Indiana."
+msgid ""
+"The possible values this field can contain. Enter one value per line, "
+"in the format key|label."
+msgstr ""
+"Valeurs possibles que ce champ peut contenir. Entrez une valeur par "
+"ligne, dans le format clef|étiquette."
+msgid ""
+"The key is the stored value, and must be numeric. The label will be "
+"used in displayed values and edit forms."
+msgstr ""
+"La clef est une valeur enregistrée, et doit être numérique. "
+"L'étiquette sera utilisée dans les valeurs affichées et les "
+"formulaires d'édition."
+msgid ""
+"The label is optional: if a line contains a single number, it will be "
+"used as key and label."
+msgstr ""
+"L'étiquette est optionnelle : si une ligne contient un nombre seul, "
+"il sera utilisé comme clef et étiquette."
+msgid ""
+"Lists of labels are also accepted (one label per line), only if the "
+"field does not hold any values yet. Numeric keys will be automatically "
+"generated from the positions in the list."
+msgstr ""
+"Les liste d'étiquettes sont aussi acceptées (une étiquette par "
+"ligne), seulement si les champs ne contiennent pas de valeur "
+"actuellement. Les clefs numériques seront automatiquement générées "
+"depuis la position dans la liste."
+msgid ""
+"The key is the stored value. The label will be used in displayed "
+"values and edit forms."
+msgstr ""
+"La clef est la valeur enregistrée. L'étiquette sera utilisée dans "
+"les valeurs affichées et les formulaires d'édition."
+msgid ""
+"The label is optional: if a line contains a single string, it will be "
+"used as key and label."
+msgstr ""
+"L'étiquette est optionnelle : si une ligne contient une phrase "
+"simple, elle sera utilisée comme clef et étiquette."
+msgid "Allowed values list: invalid input."
+msgstr "Liste des valeurs autorisées : entrée invalide."
+msgid ""
+"Allowed values list: some values are being removed while currently in "
+"use."
+msgstr ""
+"Liste des valeurs autorisées : certaines valeurs sont sur le point "
+"d'être retirées alors qu'elles sont actuellement utilisées."
+msgid ""
+"Failed to connect to the server. The server reports the following "
+"message: !message For more help installing or updating code on your "
+"server, see the <a href=\"@handbook_url\">handbook</a>."
+msgstr ""
+"Échec de la connexion au serveur. Le serveur a renvoyé le message "
+"suivant : !message Pour une aide supplémentaire sur l'installation ou "
+"la mise à jour du code sur votre serveur, consultez le <a "
+"href=\"@handbook_url\">manuel</a>."
+msgid "Unable to parse info file: %info_file."
+msgstr "Impossible d'analyser (parser) le fichier info : %info_file"
+msgid "The info file (%info_file) does not define a 'name' attribute."
+msgstr "Le fichier info (%info_file) ne définit pas d'attribut 'name'."
+msgid ""
+"The testing framework requires the PHP memory limit to be at least "
+"%memory_minimum_limit. The current value is %memory_limit. <a "
+"href=\"@url\">Follow these steps to continue</a>."
+msgstr ""
+"Le framework de test nécessite que la limite mémoire de PHP soit au "
+"moins de %memory_minimum_limit. La valeur actuelle est de  "
+"%memory_limit. <a href=\"@url\">Suivez ces étapes pour continuer</a>."
+msgid ""
+"You can find <a href=\"@module_url\">modules</a> and <a "
+"href=\"@theme_url\">themes</a> on <a "
+"href=\"@drupal_org_url\">drupal.org</a>. The following file extensions "
+"are supported: %extensions."
+msgstr ""
+"Vous pouvez trouver des <a href=\"@module_url\">modules</a> et des <a "
+"href=\"@theme_url\">thèmes</a> sur <a "
+"href=\"@drupal_org_url\">drupal.org</a>. Les extensions suivantes sont "
+"supportées : %extensions."
+msgid ""
+"Your server does not support updating modules and themes from this "
+"interface. Instead, update modules and themes by uploading the new "
+"versions directly to the server, as described in the <a "
+"href=\"@handbook_url\">handbook</a>."
+msgstr ""
+"Votre serveur ne supporte pas la mise à jour des modules et thèmes "
+"depuis cette interface. À la place, mettez à jour les modules et "
+"thèmes en transférant les nouvelles versions directement sur le "
+"serveur comme décrit dans le <a href=\"@handbook_url\">manuel</a>."
+msgid ""
+"Your server does not support installing modules and themes from this "
+"interface. Instead, install modules and themes by uploading them "
+"directly to the server, as described in the <a "
+"href=\"@handbook_url\">handbook</a>."
+msgstr ""
+"Votre serveur ne supporte pas la l'installation des modules et thèmes "
+"depuis cette interface. À la place, installer les modules et thèmes "
+"en les transférant directement sur le serveur comme décrit dans le "
+"<a href=\"@handbook_url\">manuel</a>."
+msgid ""
+"Updating modules and themes requires <strong>@backends access</strong> "
+"to your server. See the <a href=\"@handbook_url\">handbook</a> for "
+"other update methods."
+msgid_plural ""
+"Updating modules and themes requires access to your server via one of "
+"the following methods: <strong>@backends</strong>. See the <a "
+"href=\"@handbook_url\">handbook</a> for other update methods."
+msgstr[0] ""
+"La mise à jour des modules et thèmes requiert un <strong>accès "
+"@backends</strong> à votre serveur. Voir le <a "
+"href=\"@handbook_url\">manuel</a> pour les autres méthodes de mises "
+"à jour."
+msgstr[1] ""
+"La mise à jour des modules et thèmes requiert l'accès à votre "
+"serveur par l'une des méthodes suivantes : "
+"<strong>@backends</strong>. Voir le <a "
+"href=\"@handbook_url\">manuel</a> pour les autres méthodes de mises "
+"à jour."
+msgid ""
+"Installing modules and themes requires <strong>@backends "
+"access</strong> to your server. See the <a "
+"href=\"@handbook_url\">handbook</a> for other installation methods."
+msgid_plural ""
+"Installing modules and themes requires access to your server via one "
+"of the following methods: <strong>@backends</strong>. See the <a "
+"href=\"@handbook_url\">handbook</a> for other installation methods."
+msgstr[0] ""
+"L'installation de modules et de thèmes requiert un <strong>accès "
+"@backends</strong> à votre serveur. Consultez la <a "
+"href=\"@handbook_url\">documentation</a> pour d'autres méthodes "
+"d'installation."
+msgstr[1] ""
+"L'installation de modules et de thèmes requiert un accès à votre "
+"serveur par l'une des méthodes suivantes : "
+"<strong>@backends</strong>. Consultez la <a "
+"href=\"@handbook_url\">documentation</a> pour d'autres méthodes "
+"d'installation."
+msgid "%archive_file does not contain any .info files."
+msgstr "%archive_file ne contient pas de fichiers .info."
+msgid "Administer content and comments."
+msgstr "Administrer le contenu et les commentaires."
+msgid "Comment fields"
+msgstr "Champs de commentaires"
+msgid "RSS category"
+msgstr "Catégorie RSS"
+msgid "%name must be a valid hexadecimal CSS color value."
+msgstr "%name doit être une valeur hexadécimale de couleur CSS valide."
+msgid ""
+"Each field type has one or more available <em>widgets</em> associated "
+"with it; each widget provides a mechanism for data input when you are "
+"editing (text box, select list, file upload, etc.). Each field type "
+"also has one or more display options, which determine how the field is "
+"displayed to site visitors. The widget and display options can be "
+"changed after you have created the field."
+msgstr ""
+"Chaque type de champ a un ou plusieurs <em>widgets</em> disponibles "
+"associés à celui-ci ; chaque widget fournit un mécanisme pour la "
+"saisie des données au moment de l'édition (champ texte, listes "
+"déroulantes, envoi de fichier, etc.). Chaque type de champ a aussi un "
+"ou plusieurs options d'affichage, qui déterminent comment le champ "
+"est affiché aux visiteurs du site. Les options du widget et de "
+"l'affichage peuvent être modifiées après que vous ayez créé le "
+"champ."
+msgid ""
+"Cannot rename field %id (%old_field_name) to %new_field_name because "
+"it does not use the field_sql_storage storage type."
+msgstr ""
+"Impossible de renommer le champ %id (%old_field_name) en "
+"%new_field_name car il n'utilise pas le type de stockage "
+"field_sql_storage."
+msgid "Changes to the style have been saved."
+msgstr "Les modifications du style ont été enregistrées."
+msgid ""
+"This block is only shown if <a href=\"@languages\">at least two "
+"languages are enabled</a> and <a href=\"@configuration\">language "
+"negotiation</a> is set to <em>URL</em> or <em>Session</em>."
+msgstr ""
+"Ce bloc est affiché seulement si <a href=\"@languages\">au moins deux "
+"langages sont activés</a> et <a href=\"@configuration\">la sélection "
+"de langue</a> est définie à <em>URL</em> ou <em>Session</em>."
+msgid ""
+"The Menu module provides an interface for managing menus. A menu is a "
+"hierarchical collection of links, which can be within or external to "
+"the site, generally used for navigation. Each menu is rendered in a "
+"block that can be enabled and positioned through the <a "
+"href=\"@blocks\">Blocks administration page</a>. You can view and "
+"manage menus on the <a href=\"@menus\">Menus administration page</a>. "
+"For more information, see the online handbook entry for the <a "
+"href=\"@menu\">Menu module</a>."
+msgstr ""
+"Le module Menu fournit une interface pour gérer les menus. Un menu "
+"est une collection hiérarchique de liens, qui peuvent être externes "
+"ou internes au site, généralement utilisés pour la navigation. "
+"Chaque menu est affiché dans un bloc qui peut être activé et "
+"positionné via la <a href=\"@blocks\">page d'administration des "
+"Blocs</a>. Vous pouvez voir et gérer les menus sur la <a "
+"href=\"@menus\">page d'administration des Menus</a>. Pour plus "
+"d'information, consultez la documentation en ligne pour le <a "
+"href=\"@menu\">module Menu</a>."
+msgid "(Machine name: @type)"
+msgstr "(Nom système : @type)"
+msgid ""
+"OpenID suggests the use of either the <a href=\"@gmp\">GMP Math</a> "
+"(recommended for performance) or <a href=\"@bc\">BC Math</a> libraries "
+"to enable OpenID associations."
+msgstr ""
+"OpenID suggère l'utilisation soit de la librairie <a "
+"href=\"@gmp\">GMP Math</a> (recommandé pour les performances) soit de "
+"la librairie <a href=\"@bc\">BC Math</a> pour activer les associations "
+"OpenID."
+msgid "Not optimized"
+msgstr "Non optimisé"
+msgid ""
+"OpenID suggests the use of the GMP Math library for PHP for optimal "
+"performance. Check the <a href=\"@url\">GMP Math Library "
+"documentation</a> for installation instructions."
+msgstr ""
+"OpenID suggère l'utilisation de la librairie GMP Math pour PHP pour "
+"des performances optimales. Consultez <a href=\"@url\">la "
+"documentation de la librairie GMP Math</a> pour des instructions "
+"d'installation."
+msgid "OpenID Math library"
+msgstr "librairie OpenID Math"
+msgid ""
+"The @module module is missing, so the following module will be "
+"disabled: @depends."
+msgid_plural ""
+"The @module module is missing, so the following modules will be "
+"disabled: @depends."
+msgstr[0] ""
+"Le module @module est manquant, le module suivant sera donc "
+"désactivé : @depends."
+msgstr[1] ""
+"Le module @module est manquant, les modules suivants seront donc "
+"désactivés : @depends."
+msgid "The machine-readable name cannot be \"add\" or \"list\"."
+msgstr "Le nom système ne peut pas être \"add\" ou \"list\"."
+msgid ""
+"Enable multilingual support for this content type. If enabled, a "
+"language selection field will be added to the editing form, allowing "
+"you to select from one of the <a href=\"!languages\">enabled "
+"languages</a>. You can also turn on translation for this content type, "
+"which lets you have content translated to any of the installed "
+"languages. If disabled, new posts are saved with the default language. "
+"Existing content will not be affected by changing this option."
+msgstr ""
+"Active le support multilingue pour ce type de contenu. Si activé, un "
+"champ de sélection de langue sera ajouté au formulaire d'édition, "
+"vous permettant de sélectionner un des <a "
+"href=\"!languages\">langages actifs</a>. Vous pouvez également "
+"activer la traduction pour ce type de contenu, qui vous permet de "
+"traduire le contenu dans n'importe quelle langue installée. Si "
+"désactivé, les nouvelles contributions seront enregistrées avec la "
+"langue par défaut. Le contenu existant ne sera pas affecté par la "
+"modification de cette option."
+msgid ""
+"Query tagged for node access but there is no nid. Add foreign keys to "
+"node.nid in schema to fix."
+msgstr ""
+"Requête étiquetée pour l'accès aux nœuds mais il n'y a pas aucun "
+"nid. Ajoutez des clés étrangères à node.nid dans le schéma de "
+"base de données pour corriger ceci."
+msgid ""
+"Your node listing query is using @fallback as a base table in a query "
+"tagged for node access. This might not be secure and might not even "
+"work. Specify foreign keys in your schema to node.nid "
+msgstr ""
+"Votre requête de listage de nœuds utilise @fallback comme table de "
+"base dans une requête étiquetée pour l'accès aux nœuds. Ceci peut "
+"ne pas être sécurisé et peut même ne pas fonctionner. Spécifiez "
+"les clés étrangères dans votre schéma de base de données à "
+"node.nid "
+msgid "Unknown field: @field_name"
+msgstr "Champ inconnu : @field_name"
+msgid "%field: There should only be one decimal separator (@separator)."
+msgstr ""
+"%field : Il ne doit y avoir qu'un séparateur de décimales "
+"(@separator)."
+msgid "Enable !title"
+msgstr "Activer !title"
+msgid "Set !title as default"
+msgstr "Définir !title par défaut"
+msgid "Enabled modules: %modules"
+msgstr "Modules activés : %modules"
+msgid ""
+"File %file could not be copied, because the destination %destination "
+"is invalid. This is often caused by improper use of file_copy() or a "
+"missing stream wrapper."
+msgstr ""
+"Le fichier %file n'a pas pu être copié, car la cible %destination "
+"est invalide. Ceci est souvent dû à la mauvaise utilisation de "
+"file_copy() ou d'une encapsulation de flux (stream wrapper) manquante."
+msgid "File %file could not be copied because it does not exist."
+msgstr "Le fichier %file n'a pas pu être copié car il n'existe pas."
+msgid ""
+"File %file could not be moved, because the destination %destination is "
+"invalid. This may be caused by improper use of file_move() or a "
+"missing stream wrapper."
+msgstr ""
+"Le fichier %file n'a pas pu être déplacé, car la cible %destination "
+"est invalide. Ceci peut être dû à la mauvaise utilisation de "
+"file_move() ou d'une encapsulation de flux (stream wrapper) manquante."
+msgid ""
+"File %file could not be deleted because it is not a valid URI. This "
+"may be caused by improper use of file_delete() or a missing stream "
+"wrapper."
+msgstr ""
+"Le fichier %file n'a pas pu être supprimé car son URI n'est pas "
+"valide. Ceci peut être dû à la mauvaise utilisation de "
+"file_delete() ou d'une encapsulation de flux (stream wrapper) "
+"manquante."
+msgid ""
+"An existing local file system path for storing private files. It "
+"should be writable by Drupal and not accessible over the web. See the "
+"online handbook for <a href=\"@handbook\">more information about "
+"securing private files</a>."
+msgstr ""
+"Un chemin de fichier local existant pour le stockage de fichiers "
+"privés. Il doit être inscriptible par Drupal et non accessible via "
+"Internet. Consultez la section du manuel en ligne pour <a "
+"href=\"@handbook\">plus d'informations sur la sécurité des fichiers "
+"privés</a>."
+msgid "Curaçao"
+msgstr "Curaçao"
+msgid "Missing bundle property on entity of type @entity_type."
+msgstr "Propriété de bundle manquante sur l'entité de type @entity_type."
+msgid "Fields type(s) in use"
+msgstr "Type(s) de champs en cours d'utilisation"
+msgid "Fields pending deletion"
+msgstr "Champs en attente de suppression"
+msgid "(module: !module)"
+msgstr "(module : !module)"
+msgid "Extend site functionality."
+msgstr "Étendre les fonctionnalités."
+msgid "The requested page \"@path\" could not be found."
+msgstr "La page demandée \"@path\" n'a pas pu être trouvée."
+msgid ""
+"The form has become outdated. Copy any unsaved work in the form below "
+"and then <a href=\"@link\">reload this page</a>."
+msgstr ""
+"Le formulaire n'est plus à jour. Copiez tout travail non enregistré "
+"dans le formulaire ci-dessous puis <a href=\"@link\">rechargez cette "
+"page</a>."
+msgid ""
+"There are several decisions you will need to make before defining a "
+"field for content, comments, etc.:"
+msgstr ""
+"Il y a plusieurs décisions que vous devrez prendre avant de définir "
+"un champ pour le contenu, les commentaires, etc. :"
+msgid ""
+"The throbber display does not show the status of uploads but takes up "
+"less space. The progress bar is helpful for monitoring progress on "
+"large uploads."
+msgstr ""
+"L'indicateur d'activité (throbber) n'affiche pas le statut des "
+"transferts mais prend moins de place. La barre de progression est "
+"utile pour surveiller la progression des gros transferts."
+msgid ""
+"The domain name to use for this language if URL domains are used for "
+"<em>Detection and selection</em>. Leave blank for the default "
+"language. <strong>Changing this value may break existing "
+"URLs.</strong> Example: Specifying \"de.example.com\" as language "
+"domain for German will result in an URL like "
+"\"http://de.example.com/contact\"."
+msgstr ""
+"Le nom de domaine à utiliser pour cette langue si les URL de domaines "
+"sont utilisées pour <em>Détection et Sélection</em>. Laisser vide "
+"pour la langue par défaut. <strong>Modifier cette valeur peut "
+"corrompre les URL existantes.</strong> Exemple : Spécifier "
+"\"de.example.com\" en tant que domaine de langue pour l'Allemand "
+"donnera une URL telle que \"http://de.example.com/contact\"."
+msgid ""
+"New OpenID identifier %identity was added as a replacement for invalid "
+"identifier %invalid_identity. To finish the invalid OpenID transition "
+"process, please go to your <a href=\"@openid_url\">OpenID identities "
+"page</a> and remove the old identifier %invalid_identity."
+msgstr ""
+"Le nouvel identifiant OpenID %identity a été ajouté comme "
+"remplacement de l'identifiant %invalid_identity. Pour finir le "
+"processus de transition d'OpenID invalide, veuillez vous rendre sur la "
+"<a href=\"@openid_url\">page des identifiants OpenID</a> et supprimer "
+"l'ancien identifiant %invalid_identity."
+msgid ""
+"There is already an existing account associated with the OpenID "
+"identifier that you have provided. However, due to a bug in the "
+"previous version of the authentication system, we can't be sure that "
+"this account belongs to you. If you are new on this site, please "
+"continue registering the new user account. If you already have a "
+"registered account on this site associated with the provided OpenID "
+"identifier, please try to <a href=\"@url_password\">reset the "
+"password</a> or contact the site administrator."
+msgstr ""
+"Il y a déjà un compte existant avec l'identifiant OpenID que vous "
+"avez fourni. Cependant, à cause d'un bogue dans la version "
+"précédente du système d'authentification, nous ne pouvons être "
+"certains que ce compte vous appartient. Si vous êtes nouveau sur ce "
+"site, veuillez continuer votre inscription. Si vous avez déjà un "
+"compte utilisateur enregistré sur ce site avec l'identifiant OpenID "
+"fourni, veuillez essayer de  <a href=\"@url_password\">redéfinir le "
+"mot de passe</a> ou contacter l'administrateur du site."
+msgid ""
+"The search index is not cleared but systematically updated to reflect "
+"the new settings. Searching will continue to work but new content "
+"won't be indexed until all existing content has been re-indexed. This "
+"action cannot be undone."
+msgstr ""
+"L'index de la recherche n'est pas vidé mais systématiquement mis à "
+"jour pour refléter les nouveaux paramètres. La recherche continuera "
+"de fonctionner mais le nouveau contenu ne sera pas indexé tant que "
+"tout le contenu existant n'a pas été ré-indexé. Cette action est "
+"irréversible."
+msgid "Active search modules"
+msgstr "Modules de recherche actifs"
+msgid "No shortcuts available. <a href=\"@link\">Add a shortcut</a>."
+msgstr ""
+"Pas de raccourcis disponibles. <a href=\"@link\">Ajouter un "
+"raccourci</a>."
+msgid "Leave this blank to delete both the existing username and password."
+msgstr ""
+"Laisser ceci vide pour supprimer à la fois le nom d'utilisateur "
+"existant et le mot de passe."
+msgid "To change the password, enter the new password here."
+msgstr "Pour modifier le mot de passe, saisissez le nouveau mot de passe ici."
+msgid ""
+"HTTP authentication credentials must include a username in addition to "
+"a password."
+msgstr ""
+"Les informations d'authentification HTTP doivent inclure un nom "
+"d'utilisateur en plus d'un mot de passe."
+msgid "Incompatible with this version of Drupal core."
+msgstr "Incompatible avec cette version du cœur Drupal."
+msgid ""
+"Cron takes care of running periodic tasks like checking for updates "
+"and indexing content for search."
+msgstr ""
+"Le planificateur de tâche (Cron) s'occupe de lancer des tâches "
+"périodiques pour vérifier les mises à jour et indéxer le contenu "
+"pour la recherche."
+msgid "The clean URL test passed."
+msgstr "Le test des URL simplifiées a été passé avec succès."
+msgid ""
+"Clean URLs are enabled, but the clean URL test failed. Uncheck the box "
+"below to disable clean URLs."
+msgstr ""
+"Les URL simplifiées sont activées, mais le test des URL simplifiées "
+"a échoué. Décochez l'option ci-dessous pour désactiver les URL "
+"simplifiées."
+msgid "The clean URL test failed."
+msgstr "Le test des URL simplifiées a échoué."
+msgid ""
+"Clean URLs cannot be enabled. If you are directed to this page or to a "
+"<em>Page not found (404)</em> error after testing for clean URLs, see "
+"the <a href=\"@handbook\">online handbook</a>."
+msgstr ""
+"Les URL simplifiées ne peuvent pas être activées. Si vous êtes "
+"redirigé vers cette page ou vers une erreur <em>Page non trouvée "
+"(404)</em> après avoir testé les URL simplifiées, consultez la <a "
+"href=\"@handbook\">documentation en ligne</a>."
+msgid "User name and password"
+msgstr "Nom d'utilisateur et mot de passe"
+msgid "User module account form elements."
+msgstr "Éléments de formulaire de compte utilisateur du module User."
+msgid "There was a problem creating field %label: !message"
+msgstr "Il y a eu un problème lors de la création du champ %label : !message"
+msgid ""
+"@module (<span class=\"admin-missing\">incompatible with</span> this "
+"version of Drupal core)"
+msgstr ""
+"@module (<span class=\"admin-missing\">incompatible avec</span> cette "
+"version du cœur de Drupal)"
+msgid ""
+"Update notifications are not enabled. It is <strong>highly "
+"recommended</strong> that you enable the update manager module from "
+"the <a href=\"@module\">module administration page</a> in order to "
+"stay up-to-date on new releases. For more information, <a "
+"href=\"@update\">Update status handbook page</a>."
+msgstr ""
+"Les notifications de mise à jour ne sont pas activées. Il est "
+"<strong>vivement recommandé</strong> d'activer le module de gestion "
+"des mises à jour à partir de la <a href=\"@module\">page "
+"d'administration des modules</a> afin d'être informé des nouvelles "
+"versions. Pour plus d'informations, consulter la <a "
+"href=\"@update\">page du manuel sur Update status</a>."
+msgid ""
+"Your search used too many AND/OR expressions. Only the first @count "
+"terms were included in this search."
+msgstr ""
+"Votre recherche comporte trop d'opérateurs AND/OR. Seuls les @count "
+"premiers termes seront pris en compte dans cette recherche."
+msgid "The test cannot be executed because it has not been set up properly."
+msgstr ""
+"Le test ne peut pas être executé car il n'a pas été initialisé "
+"correctement."
+msgid "Found field with name @name"
+msgstr "Un champ avec le nom @field trouvé"
+msgid "Found field with name @name and value @value"
+msgstr "Un champ avec le nom @field et la valeur @value trouvé"
+msgid ""
+"A list field (@field_name) with existing data cannot have its keys "
+"changed."
+msgstr ""
+"Un champ de type liste (@field_name) avec des données existantes ne "
+"peut pas avoir ses clés changées."
+msgid ""
+"A unique machine-readable name containing letters, numbers, and "
+"underscores."
+msgstr ""
+"Un nom système unique contenant des lettres, nombres et des tirets "
+"bas."
+msgid "The %style style has been reverted to its defaults."
+msgstr "Le configuration du style %style a été réinitialisée."
+msgid ""
+"If no image is uploaded, this image will be shown on display and will "
+"override the field's default image."
+msgstr ""
+"Si aucune image n'est transférée, cette image sera montrée à "
+"l'affichage et surchargera l'image par défaut du champ."
+msgid "View details for all votes"
+msgstr "Consulter les détails des votes"
+msgid "No blocked IP addresses available."
+msgstr "Aucune adresse IP bloquée n'est disponible."
+msgid "Taxonomy field @field_name not found."
+msgstr "Le champ de taxonomie @field_name n'a pas été trouvé."
+msgid "Subscribe to !feed-title"
+msgstr "S'abonner à !feed-title"
+msgid "Theme hook %hook not found."
+msgstr "Hook de thème %hook non trouvé"
+msgid "No book content available."
+msgstr "Aucun contenu de livre disponible."
+msgid "Field type(s) in use - see <a href=\"@fields-page\">Field list</a>"
+msgstr ""
+"Type(s) de champ(s) utilisé(s) - voir <a href=\"@fields-page\">Liste "
+"des champs</a>"
+msgid "logged in users only"
+msgstr "utilisateurs connectés seulement"
+msgid "No OpenID identities available for this account."
+msgstr "Aucune identité OpenID disponible pour ce compte."
+msgid "Uyghur"
+msgstr "Ouïghours"
+msgid "Install another module"
+msgstr "Installer un autre module"
diff --git a/htmltest/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info b/htmltest/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info
new file mode 100644
index 00000000..54afb8b6
--- /dev/null
+++ b/htmltest/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info
@@ -0,0 +1,13 @@
+name = "Drupal system listing compatible test"
+description = "Support module for testing the drupal_system_listing function."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+files[] = drupal_system_listing_compatible_test.test
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.module b/htmltest/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.module
new file mode 100644
index 00000000..b3d9bbc7
--- /dev/null
+++ b/htmltest/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.module
@@ -0,0 +1 @@
+<?php
diff --git a/htmltest/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.test b/htmltest/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.test
new file mode 100644
index 00000000..198c1d8a
--- /dev/null
+++ b/htmltest/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.test
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Helper to verify tests in installation profile modules.
+ */
+class DrupalSystemListingCompatibleTestCase extends DrupalWebTestCase {
+  /**
+   * Use the Minimal profile.
+   *
+   * This test needs to use a different installation profile than the test which
+   * asserts that this test is found.
+   *
+   * @see SimpleTestInstallationProfileModuleTestsTestCase
+   */
+  protected $profile = 'minimal';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Installation profile module tests helper',
+      'description' => 'Verifies that tests in installation profile modules are found and may use another profile for running tests.',
+      'group' => 'Installation profile',
+    );
+  }
+
+  function setUp() {
+    // Attempt to install a module in Testing profile, while this test runs with
+    // a different profile.
+    parent::setUp(array('drupal_system_listing_compatible_test'));
+  }
+
+  /**
+   * Non-empty test* method required to executed the test case class.
+   */
+  function testDrupalSystemListing() {
+    $this->pass(__CLASS__ . ' test executed.');
+  }
+}
diff --git a/htmltest/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info b/htmltest/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info
new file mode 100644
index 00000000..8a685464
--- /dev/null
+++ b/htmltest/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info
@@ -0,0 +1,15 @@
+name = "Drupal system listing incompatible test"
+description = "Support module for testing the drupal_system_listing function."
+package = Testing
+version = VERSION
+; This deliberately has the wrong core version, to test that it does not take
+; precedence over the version of the same module that is in the
+; modules/simpletest/tests directory.
+core = 6.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.module b/htmltest/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.module
new file mode 100644
index 00000000..b3d9bbc7
--- /dev/null
+++ b/htmltest/profiles/testing/modules/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.module
@@ -0,0 +1 @@
+<?php
diff --git a/htmltest/profiles/testing/testing.info b/htmltest/profiles/testing/testing.info
new file mode 100644
index 00000000..b274aeea
--- /dev/null
+++ b/htmltest/profiles/testing/testing.info
@@ -0,0 +1,11 @@
+name = Testing
+description = Minimal profile for running tests. Includes absolutely required modules only.
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+; Information added by Drupal.org packaging script on 2014-01-03
+version = "7.25"
+project = "drupal"
+datestamp = "1388709506"
+
diff --git a/htmltest/profiles/testing/testing.install b/htmltest/profiles/testing/testing.install
new file mode 100644
index 00000000..f9d8f585
--- /dev/null
+++ b/htmltest/profiles/testing/testing.install
@@ -0,0 +1,21 @@
+<?php
+/**
+ * @file
+ * Install, update and uninstall functions for the testing profile.
+ */
+
+/**
+ * Implements hook_install().
+ *
+ * Perform actions to set up the site for this profile.
+ *
+ * @see system_install()
+ */
+function testing_install() {
+  // Allow visitor account creation, but with administrative approval.
+  variable_set('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL);
+
+  // Enable default permissions for system roles.
+  user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access content'));
+  user_role_grant_permissions(DRUPAL_AUTHENTICATED_RID, array('access content'));
+}
diff --git a/htmltest/profiles/testing/testing.profile b/htmltest/profiles/testing/testing.profile
new file mode 100644
index 00000000..6a71a66f
--- /dev/null
+++ b/htmltest/profiles/testing/testing.profile
@@ -0,0 +1,6 @@
+<?php
+/**
+ * @file
+ * Installation profile for tests.
+ */
+
diff --git a/htmltest/qharbulot b/htmltest/qharbulot
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/qharbulot
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/rbraun b/htmltest/rbraun
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/rbraun
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/robots.txt b/htmltest/robots.txt
new file mode 100644
index 00000000..7de84356
--- /dev/null
+++ b/htmltest/robots.txt
@@ -0,0 +1,60 @@
+#
+# robots.txt
+#
+# This file is to prevent the crawling and indexing of certain parts
+# of your site by web crawlers and spiders run by sites like Yahoo!
+# and Google. By telling these "robots" where not to go on your site,
+# you save bandwidth and server resources.
+#
+# This file will be ignored unless it is at the root of your host:
+# Used:    http://example.com/robots.txt
+# Ignored: http://example.com/site/robots.txt
+#
+# For more information about the robots.txt standard, see:
+# http://www.robotstxt.org/wc/robots.html
+#
+# For syntax checking, see:
+# http://www.sxw.org.uk/computing/robots/check.html
+
+User-agent: *
+Crawl-delay: 10
+# Directories
+Disallow: /includes/
+Disallow: /misc/
+Disallow: /modules/
+Disallow: /profiles/
+Disallow: /scripts/
+Disallow: /themes/
+# Files
+Disallow: /CHANGELOG.txt
+Disallow: /cron.php
+Disallow: /INSTALL.mysql.txt
+Disallow: /INSTALL.pgsql.txt
+Disallow: /INSTALL.sqlite.txt
+Disallow: /install.php
+Disallow: /INSTALL.txt
+Disallow: /LICENSE.txt
+Disallow: /MAINTAINERS.txt
+Disallow: /update.php
+Disallow: /UPGRADE.txt
+Disallow: /xmlrpc.php
+# Paths (clean URLs)
+Disallow: /admin/
+Disallow: /comment/reply/
+Disallow: /filter/tips/
+Disallow: /node/add/
+Disallow: /search/
+Disallow: /user/register/
+Disallow: /user/password/
+Disallow: /user/login/
+Disallow: /user/logout/
+# Paths (no clean URLs)
+Disallow: /?q=admin/
+Disallow: /?q=comment/reply/
+Disallow: /?q=filter/tips/
+Disallow: /?q=node/add/
+Disallow: /?q=search/
+Disallow: /?q=user/password/
+Disallow: /?q=user/register/
+Disallow: /?q=user/login/
+Disallow: /?q=user/logout/
diff --git a/htmltest/scripts/code-clean.sh b/htmltest/scripts/code-clean.sh
new file mode 100644
index 00000000..3338b6ad
--- /dev/null
+++ b/htmltest/scripts/code-clean.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+find . -name "*~" -type f | xargs rm -f
+find . -name ".#*" -type f | xargs rm -f
+find . -name "*.rej" -type f | xargs rm -f
+find . -name "*.orig" -type f | xargs rm -f
+find . -name "DEADJOE" -type f | xargs rm -f
+find . -type f | grep -v ".psp" | grep -v ".gif" | grep -v ".jpg" | grep -v ".png" | grep -v ".tgz" | grep -v ".ico" | grep -v "druplicon" | xargs perl -wi -pe 's/\s+$/\n/'
+find . -type f | grep -v ".psp" | grep -v ".gif" | grep -v ".jpg" | grep -v ".png" | grep -v ".tgz" | grep -v ".ico" | grep -v "druplicon" | xargs perl -wi -pe 's/\t/  /g'
diff --git a/htmltest/scripts/cron-curl.sh b/htmltest/scripts/cron-curl.sh
new file mode 100644
index 00000000..9b168ab3
--- /dev/null
+++ b/htmltest/scripts/cron-curl.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+curl --silent --compressed http://example.com/cron.php
diff --git a/htmltest/scripts/cron-lynx.sh b/htmltest/scripts/cron-lynx.sh
new file mode 100644
index 00000000..904667ac
--- /dev/null
+++ b/htmltest/scripts/cron-lynx.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+/usr/bin/lynx -source http://example.com/cron.php > /dev/null 2>&1
diff --git a/htmltest/scripts/drupal.sh b/htmltest/scripts/drupal.sh
new file mode 100644
index 00000000..76bd750f
--- /dev/null
+++ b/htmltest/scripts/drupal.sh
@@ -0,0 +1,144 @@
+#!/usr/bin/env php
+<?php
+
+/**
+ * Drupal shell execution script
+ *
+ * Check for your PHP interpreter - on Windows you'll probably have to
+ * replace line 1 with
+ *   #!c:/program files/php/php.exe
+ *
+ * @param path  Drupal's absolute root directory in local file system (optional).
+ * @param URI   A URI to execute, including HTTP protocol prefix.
+ */
+$script = basename(array_shift($_SERVER['argv']));
+
+if (in_array('--help', $_SERVER['argv']) || empty($_SERVER['argv'])) {
+  echo <<<EOF
+
+Execute a Drupal page from the shell.
+
+Usage:        {$script} [OPTIONS] "<URI>"
+Example:      {$script} "http://mysite.org/node"
+
+All arguments are long options.
+
+  --help      This page.
+
+  --root      Set the working directory for the script to the specified path.
+              To execute Drupal this has to be the root directory of your
+              Drupal installation, f.e. /home/www/foo/drupal (assuming Drupal
+              running on Unix). Current directory is not required.
+              Use surrounding quotation marks on Windows.
+
+  --verbose   This option displays the options as they are set, but will
+              produce errors from setting the session.
+
+  URI         The URI to execute, i.e. http://default/foo/bar for executing
+              the path '/foo/bar' in your site 'default'. URI has to be
+              enclosed by quotation marks if there are ampersands in it
+              (f.e. index.php?q=node&foo=bar). Prefix 'http://' is required,
+              and the domain must exist in Drupal's sites-directory.
+
+              If the given path and file exists it will be executed directly,
+              i.e. if URI is set to http://default/bar/foo.php
+              and bar/foo.php exists, this script will be executed without
+              bootstrapping Drupal. To execute Drupal's cron.php, specify
+              http://default/cron.php as the URI.
+
+
+To run this script without --root argument invoke it from the root directory
+of your Drupal installation with
+
+  ./scripts/{$script}
+\n
+EOF;
+  exit;
+}
+
+// define default settings
+$cmd = 'index.php';
+$_SERVER['HTTP_HOST']       = 'default';
+$_SERVER['PHP_SELF']        = '/index.php';
+$_SERVER['REMOTE_ADDR']     = '127.0.0.1';
+$_SERVER['SERVER_SOFTWARE'] = NULL;
+$_SERVER['REQUEST_METHOD']  = 'GET';
+$_SERVER['QUERY_STRING']    = '';
+$_SERVER['PHP_SELF']        = $_SERVER['REQUEST_URI'] = '/';
+$_SERVER['HTTP_USER_AGENT'] = 'console';
+
+// toggle verbose mode
+if (in_array('--verbose', $_SERVER['argv'])) {
+  $_verbose_mode = true;
+}
+else {
+  $_verbose_mode = false;
+}
+
+// parse invocation arguments
+while ($param = array_shift($_SERVER['argv'])) {
+  switch ($param) {
+    case '--root':
+      // change working directory
+      $path = array_shift($_SERVER['argv']);
+      if (is_dir($path)) {
+        chdir($path);
+        if ($_verbose_mode) {
+          echo "cwd changed to: {$path}\n";
+        }
+      }
+      else {
+        echo "\nERROR: {$path} not found.\n\n";
+      }
+      break;
+
+    default:
+      if (substr($param, 0, 2) == '--') {
+        // ignore unknown options
+        break;
+      }
+      else {
+        // parse the URI
+        $path = parse_url($param);
+
+        // set site name
+        if (isset($path['host'])) {
+          $_SERVER['HTTP_HOST'] = $path['host'];
+        }
+
+        // set query string
+        if (isset($path['query'])) {
+          $_SERVER['QUERY_STRING'] = $path['query'];
+          parse_str($path['query'], $_GET);
+          $_REQUEST = $_GET;
+        }
+
+        // set file to execute or Drupal path (clean URLs enabled)
+        if (isset($path['path']) && file_exists(substr($path['path'], 1))) {
+          $_SERVER['PHP_SELF'] = $_SERVER['REQUEST_URI'] = $path['path'];
+          $cmd = substr($path['path'], 1);
+        }
+        elseif (isset($path['path'])) {
+          if (!isset($_GET['q'])) {
+            $_REQUEST['q'] = $_GET['q'] = $path['path'];
+          }
+        }
+
+        // display setup in verbose mode
+        if ($_verbose_mode) {
+          echo "Hostname set to: {$_SERVER['HTTP_HOST']}\n";
+          echo "Script name set to: {$cmd}\n";
+          echo "Path set to: {$_GET['q']}\n";
+        }
+      }
+      break;
+  }
+}
+
+if (file_exists($cmd)) {
+  include $cmd;
+}
+else {
+  echo "\nERROR: {$cmd} not found.\n\n";
+}
+exit();
diff --git a/htmltest/scripts/dump-database-d6.sh b/htmltest/scripts/dump-database-d6.sh
new file mode 100644
index 00000000..41146b07
--- /dev/null
+++ b/htmltest/scripts/dump-database-d6.sh
@@ -0,0 +1,101 @@
+#!/usr/bin/env php
+<?php
+
+/**
+ * Dump a Drupal 6 database into a Drupal 7 PHP script to test the upgrade
+ * process.
+ *
+ * Run this script at the root of an existing Drupal 6 installation.
+ *
+ * The output of this script is a PHP script that can be ran inside Drupal 7
+ * and recreates the Drupal 6 database as dumped. Transient data from cache
+ * session and watchdog tables are not recorded.
+ */
+
+// Define default settings.
+$cmd = 'index.php';
+$_SERVER['HTTP_HOST']       = 'default';
+$_SERVER['PHP_SELF']        = '/index.php';
+$_SERVER['REMOTE_ADDR']     = '127.0.0.1';
+$_SERVER['SERVER_SOFTWARE'] = NULL;
+$_SERVER['REQUEST_METHOD']  = 'GET';
+$_SERVER['QUERY_STRING']    = '';
+$_SERVER['PHP_SELF']        = $_SERVER['REQUEST_URI'] = '/';
+$_SERVER['HTTP_USER_AGENT'] = 'console';
+
+// Bootstrap Drupal.
+include_once './includes/bootstrap.inc';
+drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+
+// Include the utility drupal_var_export() function.
+include_once dirname(__FILE__) . '/../includes/utility.inc';
+
+// Output the PHP header.
+$output = <<<ENDOFHEADER
+<?php
+
+/**
+ * @file
+ * Filled installation of Drupal 6.17, for test purposes.
+ *
+ * This file was generated by the dump-database-d6.sh tool, from an
+ * installation of Drupal 6, filled with data using the generate-d6-content.sh
+ * tool. It has the following modules installed:
+
+ENDOFHEADER;
+
+foreach (module_list() as $module) {
+  $output .= " *  - $module\n";
+}
+$output .= " */\n\n";
+
+// Get the current schema, order it by table name.
+$schema = drupal_get_schema();
+ksort($schema);
+
+// Export all the tables in the schema.
+foreach ($schema as $table => $data) {
+  // Remove descriptions to save time and code.
+  unset($data['description']);
+  foreach ($data['fields'] as &$field) {
+    unset($field['description']);
+  }
+
+  // Dump the table structure.
+  $output .= "db_create_table('" . $table . "', " . drupal_var_export($data) . ");\n";
+
+  // Don't output values for those tables.
+  if (substr($table, 0, 5) == 'cache' || $table == 'sessions' || $table == 'watchdog') {
+    $output .= "\n";
+    continue;
+  }
+
+  // Prepare the export of values.
+  $result = db_query('SELECT * FROM {'. $table .'}');
+  $insert = '';
+  while ($record = db_fetch_array($result)) {
+    // users.uid is a serial and inserting 0 into a serial can break MySQL.
+    // So record uid + 1 instead of uid for every uid and once all records
+    // are in place, fix them up.
+    if ($table == 'users') {
+      $record['uid']++;
+    }
+    $insert .= '->values('. drupal_var_export($record) .")\n";
+  }
+
+  // Dump the values if there are some.
+  if ($insert) {
+    $output .= "db_insert('". $table . "')->fields(". drupal_var_export(array_keys($data['fields'])) .")\n";
+    $output .= $insert;
+    $output .= "->execute();\n";
+  }
+
+  // Add the statement fixing the serial in the user table.
+  if ($table == 'users') {
+    $output .= "db_query('UPDATE {users} SET uid = uid - 1');\n";
+  }
+
+  $output .= "\n";
+}
+
+print $output;
diff --git a/htmltest/scripts/dump-database-d7.sh b/htmltest/scripts/dump-database-d7.sh
new file mode 100644
index 00000000..7692c40d
--- /dev/null
+++ b/htmltest/scripts/dump-database-d7.sh
@@ -0,0 +1,90 @@
+#!/usr/bin/env php
+<?php
+
+/**
+ * @file
+ * Dumps a Drupal 7 database into a PHP script to test the upgrade process.
+ *
+ * Run this script at the root of an existing Drupal 7 installation.
+ *
+ * The output of this script is a PHP script that can be run inside Drupal 7
+ * and recreates the Drupal 7 database as dumped. Transient data from cache,
+ * session, and watchdog tables are not recorded.
+ */
+
+// Define default settings.
+define('DRUPAL_ROOT', getcwd());
+$cmd = 'index.php';
+$_SERVER['HTTP_HOST']       = 'default';
+$_SERVER['REMOTE_ADDR']     = '127.0.0.1';
+$_SERVER['SERVER_SOFTWARE'] = NULL;
+$_SERVER['REQUEST_METHOD']  = 'GET';
+$_SERVER['QUERY_STRING']    = '';
+$_SERVER['PHP_SELF']        = $_SERVER['REQUEST_URI'] = '/';
+$_SERVER['HTTP_USER_AGENT'] = 'console';
+
+// Bootstrap Drupal.
+include_once './includes/bootstrap.inc';
+drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+
+// Include the utility drupal_var_export() function.
+include_once dirname(__FILE__) . '/../includes/utility.inc';
+
+// Output the PHP header.
+$output = <<<ENDOFHEADER
+<?php
+
+/**
+ * @file
+ * Filled installation of Drupal 7.0, for test purposes.
+ *
+ * This file was generated by the dump-database-d7.sh tool, from an
+ * installation of Drupal 7, filled with data using the generate-d7-content.sh
+ * tool. It has the following modules installed:
+
+ENDOFHEADER;
+
+foreach (module_list() as $module) {
+  $output .= " *  - $module\n";
+}
+$output .= " */\n\n";
+
+// Get the current schema, order it by table name.
+$schema = drupal_get_schema();
+ksort($schema);
+
+// Export all the tables in the schema.
+foreach ($schema as $table => $data) {
+  // Remove descriptions to save time and code.
+  unset($data['description']);
+  foreach ($data['fields'] as &$field) {
+    unset($field['description']);
+  }
+
+  // Dump the table structure.
+  $output .= "db_create_table('" . $table . "', " . drupal_var_export($data) . ");\n";
+
+  // Don't output values for those tables.
+  if (substr($table, 0, 5) == 'cache' || $table == 'sessions' || $table == 'watchdog') {
+    $output .= "\n";
+    continue;
+  }
+
+  // Prepare the export of values.
+  $result = db_query('SELECT * FROM {'. $table .'}', array(), array('fetch' => PDO::FETCH_ASSOC));
+  $insert = '';
+  foreach ($result as $record) {
+    $insert .= '->values('. drupal_var_export($record) .")\n";
+  }
+
+  // Dump the values if there are some.
+  if ($insert) {
+    $output .= "db_insert('". $table . "')->fields(". drupal_var_export(array_keys($data['fields'])) .")\n";
+    $output .= $insert;
+    $output .= "->execute();\n";
+  }
+
+  $output .= "\n";
+}
+
+print $output;
diff --git a/htmltest/scripts/generate-d6-content.sh b/htmltest/scripts/generate-d6-content.sh
new file mode 100644
index 00000000..fc4c68f9
--- /dev/null
+++ b/htmltest/scripts/generate-d6-content.sh
@@ -0,0 +1,206 @@
+#!/usr/bin/env php
+<?php
+
+/**
+ * Generate content for a Drupal 6 database to test the upgrade process.
+ *
+ * Run this script at the root of an existing Drupal 6 installation.
+ * Steps to use this generation script:
+ * - Install drupal 6.
+ * - Run this script from your Drupal ROOT directory.
+ * - Use the dump-database-d6.sh to generate the D7 file
+ *   modules/simpletest/tests/upgrade/database.filled.php
+ */
+
+// Define settings.
+$cmd = 'index.php';
+$_SERVER['HTTP_HOST']       = 'default';
+$_SERVER['PHP_SELF']        = '/index.php';
+$_SERVER['REMOTE_ADDR']     = '127.0.0.1';
+$_SERVER['SERVER_SOFTWARE'] = NULL;
+$_SERVER['REQUEST_METHOD']  = 'GET';
+$_SERVER['QUERY_STRING']    = '';
+$_SERVER['PHP_SELF']        = $_SERVER['REQUEST_URI'] = '/';
+$_SERVER['HTTP_USER_AGENT'] = 'console';
+$modules_to_enable          = array('path', 'poll');
+
+// Bootstrap Drupal.
+include_once './includes/bootstrap.inc';
+drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+
+// Enable requested modules
+include_once './modules/system/system.admin.inc';
+$form = system_modules();
+foreach ($modules_to_enable as $module) {
+  $form_state['values']['status'][$module] = TRUE;
+}
+$form_state['values']['disabled_modules'] = $form['disabled_modules'];
+system_modules_submit(NULL, $form_state);
+unset($form_state);
+
+// Run cron after installing
+drupal_cron_run();
+
+// Create six users
+for ($i = 0; $i < 6; $i++) {
+  $name = "test user $i";
+  $pass = md5("test PassW0rd $i !(.)");
+  $mail = "test$i@example.com";
+  $now = mktime(0, 0, 0, 1, $i + 1, 2010);
+  db_query("INSERT INTO {users} (name, pass, mail, status, created, access) VALUES ('%s', '%s', '%s', %d, %d, %d)", $name, $pass, $mail, 1, $now, $now);
+}
+
+
+// Create vocabularies and terms
+
+$terms = array();
+
+// All possible combinations of these vocabulary properties.
+$hierarchy = array(0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2);
+$multiple  = array(0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1);
+$required  = array(0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1);
+
+$voc_id = 0;
+$term_id = 0;
+for ($i = 0; $i < 24; $i++) {
+  $vocabulary = array();
+  ++$voc_id;
+  $vocabulary['name'] = "vocabulary $voc_id (i=$i)";
+  $vocabulary['description'] = "description of ". $vocabulary['name'];
+  $vocabulary['nodes'] = $i > 11 ? array('page' => TRUE) : array();
+  $vocabulary['multiple'] = $multiple[$i % 12];
+  $vocabulary['required'] = $required[$i % 12];
+  $vocabulary['relations'] = 1;
+  $vocabulary['hierarchy'] = $hierarchy[$i % 12];
+  $vocabulary['weight'] = $i;
+  taxonomy_save_vocabulary($vocabulary);
+  $parents = array();
+  // Vocabularies without hierarchy get one term, single parent vocabularies get
+  // one parent and one child term. Multiple parent vocabularies get three
+  // terms: t0, t1, t2 where t0 is a parent of both t1 and t2.
+  for ($j = 0; $j < $vocabulary['hierarchy'] + 1; $j++) {
+    $term = array();
+    $term['vid'] = $vocabulary['vid'];
+    // For multiple parent vocabularies, omit the t0-t1 relation, otherwise
+    // every parent in the vocabulary is a parent.
+    $term['parent'] = $vocabulary['hierarchy'] == 2 && i == 1 ? array() : $parents;
+    ++$term_id;
+    $term['name'] = "term $term_id of vocabulary $voc_id (j=$j)";
+    $term['description'] = 'description of ' . $term['name'];
+    $term['weight'] = $i * 3 + $j;
+    taxonomy_save_term($term);
+    $terms[] = $term['tid'];
+    $parents[] = $term['tid'];
+  }
+}
+
+$node_id = 0;
+$revision_id = 0;
+module_load_include('inc', 'node', 'node.pages');
+for ($i = 0; $i < 24; $i++) {
+  $uid = intval($i / 8) + 3;
+  $user = user_load($uid);
+  $node = new stdClass();
+  $node->uid = $uid;
+  $node->type = $i < 12 ? 'page' : 'story';
+  $node->sticky = 0;
+  ++$node_id;
+  ++$revision_id;
+  $node->title = "node title $node_id rev $revision_id (i=$i)";
+  $type = node_get_types('type', $node->type);
+  if ($type->has_body) {
+    $node->body = str_repeat("node body ($node->type) - $i", 100);
+    $node->teaser = node_teaser($node->body);
+    $node->filter = variable_get('filter_default_format', 1);
+    $node->format = FILTER_FORMAT_DEFAULT;
+  }
+  $node->status = intval($i / 4) % 2;
+  $node->language = '';
+  $node->revision = $i < 12;
+  $node->promote = $i % 2;
+  $node->created = $now + $i * 86400;
+  $node->log = "added $i node";
+  // Make every term association different a little. For nodes with revisions,
+  // make the initial revision have a different set of terms than the
+  // newest revision.
+  $node_terms = $terms;
+  unset($node_terms[$i], $node_terms[47 - $i]);
+  if ($node->revision) {
+    $node->taxonomy = array($i => $terms[$i], 47-$i => $terms[47 - $i]);
+  }
+  else {
+    $node->taxonomy = $node_terms;
+  }
+  node_save($node);
+  path_set_alias("node/$node->nid", "content/$node->created");
+  if ($node->revision) {
+    $user = user_load($uid + 3);
+    ++$revision_id;
+    $node->title .= " rev2 $revision_id";
+    $node->body = str_repeat("node revision body ($node->type) - $i", 100);
+    $node->log = "added $i revision";
+    $node->taxonomy = $node_terms;
+    node_save($node);
+  }
+}
+
+// Create poll content
+for ($i = 0; $i < 12; $i++) {
+  $uid = intval($i / 4) + 3;
+  $user = user_load($uid);
+  $node = new stdClass();
+  $node->uid = $uid;
+  $node->type = 'poll';
+  $node->sticky = 0;
+  $node->title = "poll title $i";
+  $type = node_get_types('type', $node->type);
+  if ($type->has_body) {
+    $node->body = str_repeat("node body ($node->type) - $i", 100);
+    $node->teaser = node_teaser($node->body);
+    $node->filter = variable_get('filter_default_format', 1);
+    $node->format = FILTER_FORMAT_DEFAULT;
+  }
+  $node->status = intval($i / 2) % 2;
+  $node->language = '';
+  $node->revision = 1;
+  $node->promote = $i % 2;
+  $node->created = $now + $i * 43200;
+  $node->log = "added $i poll";
+
+  $nbchoices = ($i % 4) + 2;
+  for ($c = 0; $c < $nbchoices; $c++) {
+    $node->choice[] = array('chtext' => "Choice $c for poll $i");
+  }
+  node_save($node);
+  path_set_alias("node/$node->nid", "content/poll/$i");
+  path_set_alias("node/$node->nid/results", "content/poll/$i/results");
+
+  // Add some votes
+  for ($v = 0; $v < ($i % 4) + 5; $v++) {
+    $c = $v % $nbchoices;
+    $form_state = array();
+    $form_state['values']['choice'] = $c;
+    $form_state['values']['op'] = t('Vote');
+    drupal_execute('poll_view_voting', $form_state, $node);
+  }
+}
+
+$uid = 6;
+$user = user_load($uid);
+$node = new stdClass();
+$node->uid = $uid;
+$node->type = 'broken';
+$node->sticky = 0;
+$node->title = "node title 24";
+$node->body = str_repeat("node body ($node->type) - 37", 100);
+$node->teaser = node_teaser($node->body);
+$node->filter = variable_get('filter_default_format', 1);
+$node->format = FILTER_FORMAT_DEFAULT;
+$node->status = 1;
+$node->language = '';
+$node->revision = 0;
+$node->promote = 0;
+$node->created = 1263769200;
+$node->log = "added $i node";
+node_save($node);
+path_set_alias("node/$node->nid", "content/1263769200");
diff --git a/htmltest/scripts/generate-d7-content.sh b/htmltest/scripts/generate-d7-content.sh
new file mode 100644
index 00000000..1e1d13fa
--- /dev/null
+++ b/htmltest/scripts/generate-d7-content.sh
@@ -0,0 +1,320 @@
+#!/usr/bin/env php
+<?php
+
+/**
+ * @file
+ * Generates content for a Drupal 7 database to test the upgrade process.
+ *
+ * Run this script at the root of an existing Drupal 6 installation.
+ * Steps to use this generation script:
+ * - Install drupal 7.
+ * - Run this script from your Drupal ROOT directory.
+ * - Use the dump-database-d7.sh to generate the D7 file
+ *   modules/simpletest/tests/upgrade/database.filled.php
+ */
+
+// Define settings.
+$cmd = 'index.php';
+define('DRUPAL_ROOT', getcwd());
+$_SERVER['HTTP_HOST']       = 'default';
+$_SERVER['PHP_SELF']        = '/index.php';
+$_SERVER['REMOTE_ADDR']     = '127.0.0.1';
+$_SERVER['SERVER_SOFTWARE'] = NULL;
+$_SERVER['REQUEST_METHOD']  = 'GET';
+$_SERVER['QUERY_STRING']    = '';
+$_SERVER['PHP_SELF']        = $_SERVER['REQUEST_URI'] = '/';
+$_SERVER['HTTP_USER_AGENT'] = 'console';
+$modules_to_enable          = array('path', 'poll', 'taxonomy');
+
+// Bootstrap Drupal.
+include_once './includes/bootstrap.inc';
+drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+
+// Enable requested modules.
+require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
+include_once './modules/system/system.admin.inc';
+$form = system_modules();
+foreach ($modules_to_enable as $module) {
+  $form_state['values']['status'][$module] = TRUE;
+}
+$form_state['values']['disabled_modules'] = $form['disabled_modules'];
+system_modules_submit(NULL, $form_state);
+unset($form_state);
+
+// Run cron after installing.
+drupal_cron_run();
+
+// Create six users.
+$query = db_insert('users')->fields(array('uid', 'name', 'pass', 'mail', 'status', 'created', 'access'));
+for ($i = 0; $i < 6; $i++) {
+  $name = "test user $i";
+  $pass = md5("test PassW0rd $i !(.)");
+  $mail = "test$i@example.com";
+  $now = mktime(0, 0, 0, 1, $i + 1, 2010);
+  $query->values(array(db_next_id(), $name, user_hash_password($pass), $mail, 1, $now, $now));
+}
+$query->execute();
+
+// Create vocabularies and terms.
+
+if (module_exists('taxonomy')) {
+  $terms = array();
+
+  // All possible combinations of these vocabulary properties.
+  $hierarchy = array(0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2);
+  $multiple  = array(0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1);
+  $required  = array(0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1);
+
+  $voc_id = 0;
+  $term_id = 0;
+  for ($i = 0; $i < 24; $i++) {
+    $vocabulary = new stdClass;
+    ++$voc_id;
+    $vocabulary->name = "vocabulary $voc_id (i=$i)";
+    $vocabulary->machine_name = 'vocabulary_' . $voc_id . '_' . $i;
+    $vocabulary->description = "description of ". $vocabulary->name;
+    $vocabulary->multiple = $multiple[$i % 12];
+    $vocabulary->required = $required[$i % 12];
+    $vocabulary->relations = 1;
+    $vocabulary->hierarchy = $hierarchy[$i % 12];
+    $vocabulary->weight = $i;
+    taxonomy_vocabulary_save($vocabulary);
+    $field = array(
+      'field_name' => 'taxonomy_'. $vocabulary->machine_name,
+      'module' => 'taxonomy',
+      'type' => 'taxonomy_term_reference',
+      'cardinality' => $vocabulary->multiple || $vocabulary->tags ? FIELD_CARDINALITY_UNLIMITED : 1,
+      'settings' => array(
+        'required' => $vocabulary->required ? TRUE : FALSE,
+        'allowed_values' => array(
+          array(
+            'vocabulary' => $vocabulary->machine_name,
+            'parent' => 0,
+          ),
+        ),
+      ),
+    );
+    field_create_field($field);
+    $node_types = $i > 11 ? array('page') : array_keys(node_type_get_types());
+    foreach ($node_types as $bundle) {
+      $instance = array(
+        'label' => $vocabulary->name,
+        'field_name' => $field['field_name'],
+        'bundle' => $bundle,
+        'entity_type' => 'node',
+        'settings' => array(),
+        'description' => $vocabulary->help,
+        'required' => $vocabulary->required,
+        'widget' => array(),
+        'display' => array(
+          'default' => array(
+            'type' => 'taxonomy_term_reference_link',
+            'weight' => 10,
+          ),
+          'teaser' => array(
+            'type' => 'taxonomy_term_reference_link',
+            'weight' => 10,
+          ),
+        ),
+      );
+      if ($vocabulary->tags) {
+        $instance['widget'] = array(
+          'type' => 'taxonomy_autocomplete',
+          'module' => 'taxonomy',
+          'settings' => array(
+            'size' => 60,
+            'autocomplete_path' => 'taxonomy/autocomplete',
+          ),
+        );
+      }
+      else {
+        $instance['widget'] = array(
+          'type' => 'options_select',
+          'settings' => array(),
+        );
+      }
+      field_create_instance($instance);
+    }
+    $parents = array();
+    // Vocabularies without hierarchy get one term; single parent vocabularies
+    // get one parent and one child term. Multiple parent vocabularies get
+    // three terms: t0, t1, t2 where t0 is a parent of both t1 and t2.
+    for ($j = 0; $j < $vocabulary->hierarchy + 1; $j++) {
+      $term = new stdClass;
+      $term->vocabulary_machine_name = $vocabulary->machine_name;
+      // For multiple parent vocabularies, omit the t0-t1 relation, otherwise
+      // every parent in the vocabulary is a parent.
+      $term->parent = $vocabulary->hierarchy == 2 && i == 1 ? array() : $parents;
+      ++$term_id;
+      $term->name = "term $term_id of vocabulary $voc_id (j=$j)";
+      $term->description = 'description of ' . $term->name;
+      $term->format = 'filtered_html';
+      $term->weight = $i * 3 + $j;
+      taxonomy_term_save($term);
+      $terms[] = $term->tid;
+      $term_vocabs[$term->tid] = 'taxonomy_' . $vocabulary->machine_name;
+      $parents[] = $term->tid;
+    }
+  }
+}
+
+$node_id = 0;
+$revision_id = 0;
+module_load_include('inc', 'node', 'node.pages');
+for ($i = 0; $i < 24; $i++) {
+  $uid = intval($i / 8) + 3;
+  $user = user_load($uid);
+  $node = new stdClass();
+  $node->uid = $uid;
+  $node->type = $i < 12 ? 'page' : 'story';
+  $node->sticky = 0;
+  ++$node_id;
+  ++$revision_id;
+  $node->title = "node title $node_id rev $revision_id (i=$i)";
+  $node->language = LANGUAGE_NONE;
+  $body_text =  str_repeat("node body ($node->type) - $i", 100);
+  $node->body[$node->language][0]['value'] = $body_text;
+  $node->body[$node->language][0]['summary'] = text_summary($body_text);
+  $node->body[$node->language][0]['format'] = 'filtered_html';
+  $node->status = intval($i / 4) % 2;
+  $node->revision = $i < 12;
+  $node->promote = $i % 2;
+  $node->created = $now + $i * 86400;
+  $node->log = "added $i node";
+  // Make every term association different a little. For nodes with revisions,
+  // make the initial revision have a different set of terms than the
+  // newest revision.
+  $items = array();
+  if (module_exists('taxonomy')) {
+    if ($node->revision) {
+      $node_terms = array($terms[$i], $terms[47-$i]);
+    }
+    else {
+      $node_terms = $terms;
+      unset($node_terms[$i], $node_terms[47 - $i]);
+    }
+    foreach ($node_terms as $tid) {
+      $field_name = $term_vocabs[$tid];
+      $node->{$field_name}[LANGUAGE_NONE][] = array('tid' => $tid);
+    }
+  }
+  $node->path = array('alias' => "content/$node->created");
+  node_save($node);
+  if ($node->revision) {
+    $user = user_load($uid + 3);
+    ++$revision_id;
+    $node->title .= " rev2 $revision_id";
+    $body_text =  str_repeat("node revision body ($node->type) - $i", 100);
+    $node->body[$node->language][0]['value'] = $body_text;
+    $node->body[$node->language][0]['summary'] = text_summary($body_text);
+    $node->body[$node->language][0]['format'] = 'filtered_html';
+    $node->log = "added $i revision";
+    $node_terms = $terms;
+    unset($node_terms[$i], $node_terms[47 - $i]);
+    foreach ($node_terms as $tid) {
+      $field_name = $term_vocabs[$tid];
+      $node->{$field_name}[LANGUAGE_NONE][] = array('tid' => $tid);
+    }
+    node_save($node);
+  }
+}
+
+if (module_exists('poll')) {
+  // Create poll content.
+  for ($i = 0; $i < 12; $i++) {
+    $uid = intval($i / 4) + 3;
+    $user = user_load($uid);
+    $node = new stdClass();
+    $node->uid = $uid;
+    $node->type = 'poll';
+    $node->sticky = 0;
+    $node->title = "poll title $i";
+    $node->language = LANGUAGE_NONE;
+    $node->status = intval($i / 2) % 2;
+    $node->revision = 1;
+    $node->promote = $i % 2;
+    $node->created = REQUEST_TIME + $i * 43200;
+    $node->runtime = 0;
+    $node->active = 1;
+    $node->log = "added $i poll";
+    $node->path = array('alias' => "content/poll/$i");
+
+    $nbchoices = ($i % 4) + 2;
+    for ($c = 0; $c < $nbchoices; $c++) {
+      $node->choice[] = array('chtext' => "Choice $c for poll $i", 'chvotes' => 0, 'weight' => 0);
+    }
+    node_save($node);
+    $path = array(
+      'alias' => "content/poll/$i/results",
+      'source' => "node/$node->nid/results",
+    );
+    path_save($path);
+
+    // Add some votes.
+    $node = node_load($node->nid);
+    $choices = array_keys($node->choice);
+    $original_user = $GLOBALS['user'];
+    for ($v = 0; $v < ($i % 4); $v++) {
+      drupal_static_reset('ip_address');
+      $_SERVER['REMOTE_ADDR'] = "127.0.$v.1";
+      $GLOBALS['user'] = drupal_anonymous_user();// We should have already allowed anon to vote.
+      $c = $v % $nbchoices;
+      $form_state = array();
+      $form_state['values']['choice'] = $choices[$c];
+      $form_state['values']['op'] = t('Vote');
+      drupal_form_submit('poll_view_voting', $form_state, $node);
+    }
+  }
+}
+
+// Test that upgrade works even on a bundle whose parent module was disabled.
+// This is simulated by creating an existing content type and changing the
+// bundle to another type through direct database update queries.
+$node_type = 'broken';
+$uid = 6;
+$user = user_load($uid);
+$node = new stdClass();
+$node->uid = $uid;
+$node->type = 'article';
+$body_text = str_repeat("node body ($node_type) - 37", 100);
+$node->sticky = 0;
+$node->title = "node title 24";
+$node->language = LANGUAGE_NONE;
+$node->body[$node->language][0]['value'] = $body_text;
+$node->body[$node->language][0]['summary'] = text_summary($body_text);
+$node->body[$node->language][0]['format']  = 'filtered_html';
+$node->status = 1;
+$node->revision = 0;
+$node->promote = 0;
+$node->created = 1263769200;
+$node->log = "added a broken node";
+$node->path = array('alias' => "content/1263769200");
+node_save($node);
+db_update('node')
+  ->fields(array(
+    'type' => $node_type,
+  ))
+  ->condition('nid', $node->nid)
+  ->execute();
+if (db_table_exists('field_data_body')) {
+  db_update('field_data_body')
+    ->fields(array(
+      'bundle' => $node_type,
+    ))
+    ->condition('entity_id', $node->nid)
+    ->condition('entity_type', 'node')
+    ->execute();
+  db_update('field_revision_body')
+    ->fields(array(
+      'bundle' => $node_type,
+    ))
+    ->condition('entity_id', $node->nid)
+    ->condition('entity_type', 'node')
+    ->execute();
+}
+db_update('field_config_instance')
+  ->fields(array(
+    'bundle' => $node_type,
+  ))
+  ->condition('bundle', 'article')
+  ->execute();
diff --git a/htmltest/scripts/password-hash.sh b/htmltest/scripts/password-hash.sh
new file mode 100644
index 00000000..004421a8
--- /dev/null
+++ b/htmltest/scripts/password-hash.sh
@@ -0,0 +1,90 @@
+#!/usr/bin/php
+<?php
+
+/**
+ * Drupal hash script - to generate a hash from a plaintext password
+ *
+ * Check for your PHP interpreter - on Windows you'll probably have to
+ * replace line 1 with
+ *   #!c:/program files/php/php.exe
+ *
+ * @param password1 [password2 [password3 ...]]
+ *  Plain-text passwords in quotes (or with spaces backslash escaped).
+ */
+
+if (version_compare(PHP_VERSION, "5.2.0", "<")) {
+  $version  = PHP_VERSION;
+  echo <<<EOF
+
+ERROR: This script requires at least PHP version 5.2.0. You invoked it with
+       PHP version {$version}.
+\n
+EOF;
+  exit;
+}
+
+$script = basename(array_shift($_SERVER['argv']));
+
+if (in_array('--help', $_SERVER['argv']) || empty($_SERVER['argv'])) {
+  echo <<<EOF
+
+Generate Drupal password hashes from the shell.
+
+Usage:        {$script} [OPTIONS] "<plan-text password>"
+Example:      {$script} "mynewpassword"
+
+All arguments are long options.
+
+  --help      Print this page.
+
+  --root <path>
+
+              Set the working directory for the script to the specified path.
+              To execute this script this has to be the root directory of your
+              Drupal installation, e.g. /home/www/foo/drupal (assuming Drupal
+              running on Unix). Use surrounding quotation marks on Windows.
+
+  "<password1>" ["<password2>" ["<password3>" ...]]
+
+              One or more plan-text passwords enclosed by double quotes. The
+              output hash may be manually entered into the {users}.pass field to
+              change a password via SQL to a known value.
+
+To run this script without the --root argument invoke it from the root directory
+of your Drupal installation as
+
+  ./scripts/{$script}
+\n
+EOF;
+  exit;
+}
+
+$passwords = array();
+
+// Parse invocation arguments.
+while ($param = array_shift($_SERVER['argv'])) {
+  switch ($param) {
+    case '--root':
+      // Change the working directory.
+      $path = array_shift($_SERVER['argv']);
+      if (is_dir($path)) {
+        chdir($path);
+      }
+      break;
+    default:
+      // Add a password to the list to be processed.
+      $passwords[] = $param;
+      break;
+  }
+}
+
+define('DRUPAL_ROOT', getcwd());
+
+include_once DRUPAL_ROOT . '/includes/password.inc';
+include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
+
+foreach ($passwords as $password) {
+  print("\npassword: $password \t\thash: ". user_hash_password($password) ."\n");
+}
+print("\n");
+
diff --git a/htmltest/scripts/run-tests.sh b/htmltest/scripts/run-tests.sh
new file mode 100644
index 00000000..189d7f2e
--- /dev/null
+++ b/htmltest/scripts/run-tests.sh
@@ -0,0 +1,676 @@
+<?php
+/**
+ * @file
+ * This script runs Drupal tests from command line.
+ */
+
+define('SIMPLETEST_SCRIPT_COLOR_PASS', 32); // Green.
+define('SIMPLETEST_SCRIPT_COLOR_FAIL', 31); // Red.
+define('SIMPLETEST_SCRIPT_COLOR_EXCEPTION', 33); // Brown.
+
+// Set defaults and get overrides.
+list($args, $count) = simpletest_script_parse_args();
+
+if ($args['help'] || $count == 0) {
+  simpletest_script_help();
+  exit;
+}
+
+if ($args['execute-test']) {
+  // Masquerade as Apache for running tests.
+  simpletest_script_init("Apache");
+  simpletest_script_run_one_test($args['test-id'], $args['execute-test']);
+}
+else {
+  // Run administrative functions as CLI.
+  simpletest_script_init(NULL);
+}
+
+// Bootstrap to perform initial validation or other operations.
+drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+if (!module_exists('simpletest')) {
+  simpletest_script_print_error("The simpletest module must be enabled before this script can run.");
+  exit;
+}
+
+if ($args['clean']) {
+  // Clean up left-over times and directories.
+  simpletest_clean_environment();
+  echo "\nEnvironment cleaned.\n";
+
+  // Get the status messages and print them.
+  $messages = array_pop(drupal_get_messages('status'));
+  foreach ($messages as $text) {
+    echo " - " . $text . "\n";
+  }
+  exit;
+}
+
+// Load SimpleTest files.
+$groups = simpletest_test_get_all();
+$all_tests = array();
+foreach ($groups as $group => $tests) {
+  $all_tests = array_merge($all_tests, array_keys($tests));
+}
+$test_list = array();
+
+if ($args['list']) {
+  // Display all available tests.
+  echo "\nAvailable test groups & classes\n";
+  echo   "-------------------------------\n\n";
+  foreach ($groups as $group => $tests) {
+    echo $group . "\n";
+    foreach ($tests as $class => $info) {
+      echo " - " . $info['name'] . ' (' . $class . ')' . "\n";
+    }
+  }
+  exit;
+}
+
+$test_list = simpletest_script_get_test_list();
+
+// Try to allocate unlimited time to run the tests.
+drupal_set_time_limit(0);
+
+simpletest_script_reporter_init();
+
+// Setup database for test results.
+$test_id = db_insert('simpletest_test_id')->useDefaults(array('test_id'))->execute();
+
+// Execute tests.
+simpletest_script_execute_batch($test_id, simpletest_script_get_test_list());
+
+// Retrieve the last database prefix used for testing and the last test class
+// that was run from. Use the information to read the lgo file in case any
+// fatal errors caused the test to crash.
+list($last_prefix, $last_test_class) = simpletest_last_test_get($test_id);
+simpletest_log_read($test_id, $last_prefix, $last_test_class);
+
+// Stop the timer.
+simpletest_script_reporter_timer_stop();
+
+// Display results before database is cleared.
+simpletest_script_reporter_display_results();
+
+if ($args['xml']) {
+  simpletest_script_reporter_write_xml_results();
+}
+
+// Cleanup our test results.
+simpletest_clean_results_table($test_id);
+
+// Test complete, exit.
+exit;
+
+/**
+ * Print help text.
+ */
+function simpletest_script_help() {
+  global $args;
+
+  echo <<<EOF
+
+Run Drupal tests from the shell.
+
+Usage:        {$args['script']} [OPTIONS] <tests>
+Example:      {$args['script']} Profile
+
+All arguments are long options.
+
+  --help      Print this page.
+
+  --list      Display all available test groups.
+
+  --clean     Cleans up database tables or directories from previous, failed,
+              tests and then exits (no tests are run).
+
+  --url       Immediately precedes a URL to set the host and path. You will
+              need this parameter if Drupal is in a subdirectory on your
+              localhost and you have not set \$base_url in settings.php. Tests
+              can be run under SSL by including https:// in the URL.
+
+  --php       The absolute path to the PHP executable. Usually not needed.
+
+  --concurrency [num]
+
+              Run tests in parallel, up to [num] tests at a time.
+
+  --all       Run all available tests.
+
+  --class     Run tests identified by specific class names, instead of group names.
+
+  --file      Run tests identified by specific file names, instead of group names.
+              Specify the path and the extension (i.e. 'modules/user/user.test').
+
+  --xml       <path>
+
+              If provided, test results will be written as xml files to this path.
+
+  --color     Output text format results with color highlighting.
+
+  --verbose   Output detailed assertion messages in addition to summary.
+
+  <test1>[,<test2>[,<test3> ...]]
+
+              One or more tests to be run. By default, these are interpreted
+              as the names of test groups as shown at
+              ?q=admin/config/development/testing.
+              These group names typically correspond to module names like "User"
+              or "Profile" or "System", but there is also a group "XML-RPC".
+              If --class is specified then these are interpreted as the names of
+              specific test classes whose test methods will be run. Tests must
+              be separated by commas. Ignored if --all is specified.
+
+To run this script you will normally invoke it from the root directory of your
+Drupal installation as the webserver user (differs per configuration), or root:
+
+sudo -u [wwwrun|www-data|etc] php ./scripts/{$args['script']}
+  --url http://example.com/ --all
+sudo -u [wwwrun|www-data|etc] php ./scripts/{$args['script']}
+  --url http://example.com/ --class BlockTestCase
+\n
+EOF;
+}
+
+/**
+ * Parse execution argument and ensure that all are valid.
+ *
+ * @return The list of arguments.
+ */
+function simpletest_script_parse_args() {
+  // Set default values.
+  $args = array(
+    'script' => '',
+    'help' => FALSE,
+    'list' => FALSE,
+    'clean' => FALSE,
+    'url' => '',
+    'php' => '',
+    'concurrency' => 1,
+    'all' => FALSE,
+    'class' => FALSE,
+    'file' => FALSE,
+    'color' => FALSE,
+    'verbose' => FALSE,
+    'test_names' => array(),
+    // Used internally.
+    'test-id' => 0,
+    'execute-test' => '',
+    'xml' => '',
+  );
+
+  // Override with set values.
+  $args['script'] = basename(array_shift($_SERVER['argv']));
+
+  $count = 0;
+  while ($arg = array_shift($_SERVER['argv'])) {
+    if (preg_match('/--(\S+)/', $arg, $matches)) {
+      // Argument found.
+      if (array_key_exists($matches[1], $args)) {
+        // Argument found in list.
+        $previous_arg = $matches[1];
+        if (is_bool($args[$previous_arg])) {
+          $args[$matches[1]] = TRUE;
+        }
+        else {
+          $args[$matches[1]] = array_shift($_SERVER['argv']);
+        }
+        // Clear extraneous values.
+        $args['test_names'] = array();
+        $count++;
+      }
+      else {
+        // Argument not found in list.
+        simpletest_script_print_error("Unknown argument '$arg'.");
+        exit;
+      }
+    }
+    else {
+      // Values found without an argument should be test names.
+      $args['test_names'] += explode(',', $arg);
+      $count++;
+    }
+  }
+
+  // Validate the concurrency argument
+  if (!is_numeric($args['concurrency']) || $args['concurrency'] <= 0) {
+    simpletest_script_print_error("--concurrency must be a strictly positive integer.");
+    exit;
+  }
+
+  return array($args, $count);
+}
+
+/**
+ * Initialize script variables and perform general setup requirements.
+ */
+function simpletest_script_init($server_software) {
+  global $args, $php;
+
+  $host = 'localhost';
+  $path = '';
+  // Determine location of php command automatically, unless a command line argument is supplied.
+  if (!empty($args['php'])) {
+    $php = $args['php'];
+  }
+  elseif ($php_env = getenv('_')) {
+    // '_' is an environment variable set by the shell. It contains the command that was executed.
+    $php = $php_env;
+  }
+  elseif ($sudo = getenv('SUDO_COMMAND')) {
+    // 'SUDO_COMMAND' is an environment variable set by the sudo program.
+    // Extract only the PHP interpreter, not the rest of the command.
+    list($php, ) = explode(' ', $sudo, 2);
+  }
+  else {
+    simpletest_script_print_error('Unable to automatically determine the path to the PHP interpreter. Supply the --php command line argument.');
+    simpletest_script_help();
+    exit();
+  }
+
+  // Get URL from arguments.
+  if (!empty($args['url'])) {
+    $parsed_url = parse_url($args['url']);
+    $host = $parsed_url['host'] . (isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '');
+    $path = isset($parsed_url['path']) ? $parsed_url['path'] : '';
+
+    // If the passed URL schema is 'https' then setup the $_SERVER variables
+    // properly so that testing will run under HTTPS.
+    if ($parsed_url['scheme'] == 'https') {
+      $_SERVER['HTTPS'] = 'on';
+    }
+  }
+
+  $_SERVER['HTTP_HOST'] = $host;
+  $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
+  $_SERVER['SERVER_ADDR'] = '127.0.0.1';
+  $_SERVER['SERVER_SOFTWARE'] = $server_software;
+  $_SERVER['SERVER_NAME'] = 'localhost';
+  $_SERVER['REQUEST_URI'] = $path .'/';
+  $_SERVER['REQUEST_METHOD'] = 'GET';
+  $_SERVER['SCRIPT_NAME'] = $path .'/index.php';
+  $_SERVER['PHP_SELF'] = $path .'/index.php';
+  $_SERVER['HTTP_USER_AGENT'] = 'Drupal command line';
+
+  if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
+    // Ensure that any and all environment variables are changed to https://.
+    foreach ($_SERVER as $key => $value) {
+      $_SERVER[$key] = str_replace('http://', 'https://', $_SERVER[$key]);
+    }
+  }
+
+  chdir(realpath(dirname(__FILE__) . '/..'));
+  define('DRUPAL_ROOT', getcwd());
+  require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
+}
+
+/**
+ * Execute a batch of tests.
+ */
+function simpletest_script_execute_batch($test_id, $test_classes) {
+  global $args;
+
+  // Multi-process execution.
+  $children = array();
+  while (!empty($test_classes) || !empty($children)) {
+    while (count($children) < $args['concurrency']) {
+      if (empty($test_classes)) {
+        break;
+      }
+
+      // Fork a child process.
+      $test_class = array_shift($test_classes);
+      $command = simpletest_script_command($test_id, $test_class);
+      $process = proc_open($command, array(), $pipes, NULL, NULL, array('bypass_shell' => TRUE));
+
+      if (!is_resource($process)) {
+        echo "Unable to fork test process. Aborting.\n";
+        exit;
+      }
+
+      // Register our new child.
+      $children[] = array(
+        'process' => $process,
+        'class' => $test_class,
+        'pipes' => $pipes,
+      );
+    }
+
+    // Wait for children every 200ms.
+    usleep(200000);
+
+    // Check if some children finished.
+    foreach ($children as $cid => $child) {
+      $status = proc_get_status($child['process']);
+      if (empty($status['running'])) {
+        // The child exited, unregister it.
+        proc_close($child['process']);
+        if ($status['exitcode']) {
+          echo 'FATAL ' . $test_class . ': test runner returned a non-zero error code (' . $status['exitcode'] . ').' . "\n";
+        }
+        unset($children[$cid]);
+      }
+    }
+  }
+}
+
+/**
+ * Bootstrap Drupal and run a single test.
+ */
+function simpletest_script_run_one_test($test_id, $test_class) {
+  try {
+    // Bootstrap Drupal.
+    drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+
+    simpletest_classloader_register();
+
+    $test = new $test_class($test_id);
+    $test->run();
+    $info = $test->getInfo();
+
+    $had_fails = (isset($test->results['#fail']) && $test->results['#fail'] > 0);
+    $had_exceptions = (isset($test->results['#exception']) && $test->results['#exception'] > 0);
+    $status = ($had_fails || $had_exceptions ? 'fail' : 'pass');
+    simpletest_script_print($info['name'] . ' ' . _simpletest_format_summary_line($test->results) . "\n", simpletest_script_color_code($status));
+
+    // Finished, kill this runner.
+    exit(0);
+  }
+  catch (Exception $e) {
+    echo (string) $e;
+    exit(1);
+  }
+}
+
+/**
+ * Return a command used to run a test in a separate process.
+ *
+ * @param $test_id
+ *  The current test ID.
+ * @param $test_class
+ *  The name of the test class to run.
+ */
+function simpletest_script_command($test_id, $test_class) {
+  global $args, $php;
+
+  $command = escapeshellarg($php) . ' ' . escapeshellarg('./scripts/' . $args['script']) . ' --url ' . escapeshellarg($args['url']);
+  if ($args['color']) {
+    $command .= ' --color';
+  }
+  $command .= " --php " . escapeshellarg($php) . " --test-id $test_id --execute-test " . escapeshellarg($test_class);
+  return $command;
+}
+
+/**
+ * Get list of tests based on arguments. If --all specified then
+ * returns all available tests, otherwise reads list of tests.
+ *
+ * Will print error and exit if no valid tests were found.
+ *
+ * @return List of tests.
+ */
+function simpletest_script_get_test_list() {
+  global $args, $all_tests, $groups;
+
+  $test_list = array();
+  if ($args['all']) {
+    $test_list = $all_tests;
+  }
+  else {
+    if ($args['class']) {
+      // Check for valid class names.
+      foreach ($args['test_names'] as $class_name) {
+        if (in_array($class_name, $all_tests)) {
+          $test_list[] = $class_name;
+        }
+      }
+    }
+    elseif ($args['file']) {
+      $files = array();
+      foreach ($args['test_names'] as $file) {
+        $files[drupal_realpath($file)] = 1;
+      }
+
+      // Check for valid class names.
+      foreach ($all_tests as $class_name) {
+        $refclass = new ReflectionClass($class_name);
+        $file = $refclass->getFileName();
+        if (isset($files[$file])) {
+          $test_list[] = $class_name;
+        }
+      }
+    }
+    else {
+      // Check for valid group names and get all valid classes in group.
+      foreach ($args['test_names'] as $group_name) {
+        if (isset($groups[$group_name])) {
+          foreach ($groups[$group_name] as $class_name => $info) {
+            $test_list[] = $class_name;
+          }
+        }
+      }
+    }
+  }
+
+  if (empty($test_list)) {
+    simpletest_script_print_error('No valid tests were specified.');
+    exit;
+  }
+  return $test_list;
+}
+
+/**
+ * Initialize the reporter.
+ */
+function simpletest_script_reporter_init() {
+  global $args, $all_tests, $test_list, $results_map;
+
+  $results_map = array(
+    'pass' => 'Pass',
+    'fail' => 'Fail',
+    'exception' => 'Exception'
+  );
+
+  echo "\n";
+  echo "Drupal test run\n";
+  echo "---------------\n";
+  echo "\n";
+
+  // Tell the user about what tests are to be run.
+  if ($args['all']) {
+    echo "All tests will run.\n\n";
+  }
+  else {
+    echo "Tests to be run:\n";
+    foreach ($test_list as $class_name) {
+      $info = call_user_func(array($class_name, 'getInfo'));
+      echo " - " . $info['name'] . ' (' . $class_name . ')' . "\n";
+    }
+    echo "\n";
+  }
+
+  echo "Test run started:\n";
+  echo " " . format_date($_SERVER['REQUEST_TIME'], 'long') . "\n";
+  timer_start('run-tests');
+  echo "\n";
+
+  echo "Test summary\n";
+  echo "------------\n";
+  echo "\n";
+}
+
+/**
+ * Display jUnit XML test results.
+ */
+function simpletest_script_reporter_write_xml_results() {
+  global $args, $test_id, $results_map;
+
+  $results = db_query("SELECT * FROM {simpletest} WHERE test_id = :test_id ORDER BY test_class, message_id", array(':test_id' => $test_id));
+
+  $test_class = '';
+  $xml_files = array();
+
+  foreach ($results as $result) {
+    if (isset($results_map[$result->status])) {
+      if ($result->test_class != $test_class) {
+        // We've moved onto a new class, so write the last classes results to a file:
+        if (isset($xml_files[$test_class])) {
+          file_put_contents($args['xml'] . '/' . $test_class . '.xml', $xml_files[$test_class]['doc']->saveXML());
+          unset($xml_files[$test_class]);
+        }
+        $test_class = $result->test_class;
+        if (!isset($xml_files[$test_class])) {
+          $doc = new DomDocument('1.0');
+          $root = $doc->createElement('testsuite');
+          $root = $doc->appendChild($root);
+          $xml_files[$test_class] = array('doc' => $doc, 'suite' => $root);
+        }
+      }
+
+      // For convenience:
+      $dom_document = &$xml_files[$test_class]['doc'];
+
+      // Create the XML element for this test case:
+      $case = $dom_document->createElement('testcase');
+      $case->setAttribute('classname', $test_class);
+      list($class, $name) = explode('->', $result->function, 2);
+      $case->setAttribute('name', $name);
+
+      // Passes get no further attention, but failures and exceptions get to add more detail:
+      if ($result->status == 'fail') {
+        $fail = $dom_document->createElement('failure');
+        $fail->setAttribute('type', 'failure');
+        $fail->setAttribute('message', $result->message_group);
+        $text = $dom_document->createTextNode($result->message);
+        $fail->appendChild($text);
+        $case->appendChild($fail);
+      }
+      elseif ($result->status == 'exception') {
+        // In the case of an exception the $result->function may not be a class
+        // method so we record the full function name:
+        $case->setAttribute('name', $result->function);
+
+        $fail = $dom_document->createElement('error');
+        $fail->setAttribute('type', 'exception');
+        $fail->setAttribute('message', $result->message_group);
+        $full_message = $result->message . "\n\nline: " . $result->line . "\nfile: " . $result->file;
+        $text = $dom_document->createTextNode($full_message);
+        $fail->appendChild($text);
+        $case->appendChild($fail);
+      }
+      // Append the test case XML to the test suite:
+      $xml_files[$test_class]['suite']->appendChild($case);
+    }
+  }
+  // The last test case hasn't been saved to a file yet, so do that now:
+  if (isset($xml_files[$test_class])) {
+    file_put_contents($args['xml'] . '/' . $test_class . '.xml', $xml_files[$test_class]['doc']->saveXML());
+    unset($xml_files[$test_class]);
+  }
+}
+
+/**
+ * Stop the test timer.
+ */
+function simpletest_script_reporter_timer_stop() {
+  echo "\n";
+  $end = timer_stop('run-tests');
+  echo "Test run duration: " . format_interval($end['time'] / 1000);
+  echo "\n\n";
+}
+
+/**
+ * Display test results.
+ */
+function simpletest_script_reporter_display_results() {
+  global $args, $test_id, $results_map;
+
+  if ($args['verbose']) {
+    // Report results.
+    echo "Detailed test results\n";
+    echo "---------------------\n";
+
+    $results = db_query("SELECT * FROM {simpletest} WHERE test_id = :test_id ORDER BY test_class, message_id", array(':test_id' => $test_id));
+    $test_class = '';
+    foreach ($results as $result) {
+      if (isset($results_map[$result->status])) {
+        if ($result->test_class != $test_class) {
+          // Display test class every time results are for new test class.
+          echo "\n\n---- $result->test_class ----\n\n\n";
+          $test_class = $result->test_class;
+
+          // Print table header.
+          echo "Status    Group      Filename          Line Function                            \n";
+          echo "--------------------------------------------------------------------------------\n";
+        }
+
+        simpletest_script_format_result($result);
+      }
+    }
+  }
+}
+
+/**
+ * Format the result so that it fits within the default 80 character
+ * terminal size.
+ *
+ * @param $result The result object to format.
+ */
+function simpletest_script_format_result($result) {
+  global $results_map, $color;
+
+  $summary = sprintf("%-9.9s %-10.10s %-17.17s %4.4s %-35.35s\n",
+    $results_map[$result->status], $result->message_group, basename($result->file), $result->line, $result->function);
+
+  simpletest_script_print($summary, simpletest_script_color_code($result->status));
+
+  $lines = explode("\n", wordwrap(trim(strip_tags($result->message)), 76));
+  foreach ($lines as $line) {
+    echo "    $line\n";
+  }
+}
+
+/**
+ * Print error message prefixed with "  ERROR: " and displayed in fail color
+ * if color output is enabled.
+ *
+ * @param $message The message to print.
+ */
+function simpletest_script_print_error($message) {
+  simpletest_script_print("  ERROR: $message\n", SIMPLETEST_SCRIPT_COLOR_FAIL);
+}
+
+/**
+ * Print a message to the console, if color is enabled then the specified
+ * color code will be used.
+ *
+ * @param $message The message to print.
+ * @param $color_code The color code to use for coloring.
+ */
+function simpletest_script_print($message, $color_code) {
+  global $args;
+  if ($args['color']) {
+    echo "\033[" . $color_code . "m" . $message . "\033[0m";
+  }
+  else {
+    echo $message;
+  }
+}
+
+/**
+ * Get the color code associated with the specified status.
+ *
+ * @param $status The status string to get code for.
+ * @return Color code.
+ */
+function simpletest_script_color_code($status) {
+  switch ($status) {
+    case 'pass':
+      return SIMPLETEST_SCRIPT_COLOR_PASS;
+    case 'fail':
+      return SIMPLETEST_SCRIPT_COLOR_FAIL;
+    case 'exception':
+      return SIMPLETEST_SCRIPT_COLOR_EXCEPTION;
+  }
+  return 0; // Default formatting.
+}
diff --git a/htmltest/scripts/test.script b/htmltest/scripts/test.script
new file mode 100644
index 00000000..a45f3f0c
--- /dev/null
+++ b/htmltest/scripts/test.script
@@ -0,0 +1,4 @@
+This file is for testing purposes only.
+
+It is used to test the functionality of drupal_get_filename().  See
+BootstrapGetFilenameTestCase::testDrupalGetFilename() for more information.
diff --git a/htmltest/shauville b/htmltest/shauville
new file mode 120000
index 00000000..945c9b46
--- /dev/null
+++ b/htmltest/shauville
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/htmltest/sites/all/README.txt b/htmltest/sites/all/README.txt
new file mode 100644
index 00000000..c8970883
--- /dev/null
+++ b/htmltest/sites/all/README.txt
@@ -0,0 +1,7 @@
+
+This directory should be used to place downloaded and custom modules
+and themes which are common to all sites. Keeping contributed and
+custom modules and themes in the sites directory will aid in upgrading
+Drupal core files. Place contributed and custom modules and themes in
+the sites/all/modules and sites/all/themes directories respectively.
+
diff --git a/htmltest/sites/all/libraries/CAS b/htmltest/sites/all/libraries/CAS
new file mode 120000
index 00000000..f7341639
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS
@@ -0,0 +1 @@
+/usr/local/www/CRI_php_lib/CAS
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS.php
new file mode 100644
index 00000000..bb292100
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS.php
@@ -0,0 +1,1826 @@
+<?php
+
+
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright notice,
+ *       this list of conditions and the following disclaimer in the documentation
+ *       and/or other materials provided with the distribution.
+ *     * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *       Collaborative nor the names of its contributors may be used to endorse or
+ *       promote products derived from this software without specific prior
+ *       written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+//
+// hack by Vangelis Haniotakis to handle the absence of $_SERVER['REQUEST_URI'] in IIS
+//
+if (php_sapi_name() != 'cli') {
+	if (!isset($_SERVER['REQUEST_URI'])) {
+		$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . '?' . $_SERVER['QUERY_STRING'];
+	}
+}
+
+// Add a E_USER_DEPRECATED for php versions <= 5.2
+if (!defined('E_USER_DEPRECATED')){
+	define('E_USER_DEPRECATED', E_USER_NOTICE);
+}
+
+/**
+ * @file CAS/CAS.php
+ * Interface class of the phpCAS library
+ *
+ * @ingroup public
+ */
+
+// ########################################################################
+//  CONSTANTS
+// ########################################################################
+
+// ------------------------------------------------------------------------
+//  CAS VERSIONS
+// ------------------------------------------------------------------------
+
+/**
+ * phpCAS version. accessible for the user by phpCAS::getVersion().
+ */
+define('PHPCAS_VERSION', '1.2.2');
+
+// ------------------------------------------------------------------------
+//  CAS VERSIONS
+// ------------------------------------------------------------------------
+/**
+ * @addtogroup public
+ * @{
+ */
+
+/**
+ * CAS version 1.0
+ */
+define("CAS_VERSION_1_0", '1.0');
+/*!
+ * CAS version 2.0
+ */
+define("CAS_VERSION_2_0", '2.0');
+
+// ------------------------------------------------------------------------
+//  SAML defines
+// ------------------------------------------------------------------------
+
+/**
+ * SAML protocol
+ */
+define("SAML_VERSION_1_1", 'S1');
+
+/**
+ * XML header for SAML POST
+ */
+define("SAML_XML_HEADER", '<?xml version="1.0" encoding="UTF-8"?>');
+
+/**
+ * SOAP envelope for SAML POST
+ */
+define("SAML_SOAP_ENV", '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/>');
+
+/**
+ * SOAP body for SAML POST
+ */
+define("SAML_SOAP_BODY", '<SOAP-ENV:Body>');
+
+/**
+ * SAMLP request
+ */
+define("SAMLP_REQUEST", '<samlp:Request xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"  MajorVersion="1" MinorVersion="1" RequestID="_192.168.16.51.1024506224022" IssueInstant="2002-06-19T17:03:44.022Z">');
+define("SAMLP_REQUEST_CLOSE", '</samlp:Request>');
+
+/**
+ * SAMLP artifact tag (for the ticket)
+ */
+define("SAML_ASSERTION_ARTIFACT", '<samlp:AssertionArtifact>');
+
+/**
+ * SAMLP close
+ */
+define("SAML_ASSERTION_ARTIFACT_CLOSE", '</samlp:AssertionArtifact>');
+
+/**
+ * SOAP body close
+ */
+define("SAML_SOAP_BODY_CLOSE", '</SOAP-ENV:Body>');
+
+/**
+ * SOAP envelope close
+ */
+define("SAML_SOAP_ENV_CLOSE", '</SOAP-ENV:Envelope>');
+
+/**
+ * SAML Attributes
+ */
+define("SAML_ATTRIBUTES", 'SAMLATTRIBS');
+
+/** @} */
+/**
+ * @addtogroup publicPGTStorage
+ * @{
+ */
+// ------------------------------------------------------------------------
+//  FILE PGT STORAGE
+// ------------------------------------------------------------------------
+/**
+ * Default path used when storing PGT's to file
+ */
+define("CAS_PGT_STORAGE_FILE_DEFAULT_PATH", '/tmp');
+/** @} */
+// ------------------------------------------------------------------------
+// SERVICE ACCESS ERRORS
+// ------------------------------------------------------------------------
+/**
+ * @addtogroup publicServices
+ * @{
+ */
+
+/**
+ * phpCAS::service() error code on success
+ */
+define("PHPCAS_SERVICE_OK", 0);
+/**
+ * phpCAS::service() error code when the PT could not retrieve because
+ * the CAS server did not respond.
+ */
+define("PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE", 1);
+/**
+ * phpCAS::service() error code when the PT could not retrieve because
+ * the response of the CAS server was ill-formed.
+ */
+define("PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE", 2);
+/**
+ * phpCAS::service() error code when the PT could not retrieve because
+ * the CAS server did not want to.
+ */
+define("PHPCAS_SERVICE_PT_FAILURE", 3);
+/**
+ * phpCAS::service() error code when the service was not available.
+ */
+define("PHPCAS_SERVICE_NOT_AVAILABLE", 4);
+
+// ------------------------------------------------------------------------
+// SERVICE TYPES
+// ------------------------------------------------------------------------
+/**
+ * phpCAS::getProxiedService() type for HTTP GET
+ */
+define("PHPCAS_PROXIED_SERVICE_HTTP_GET", 'CAS_ProxiedService_Http_Get');
+/**
+ * phpCAS::getProxiedService() type for HTTP POST
+ */
+define("PHPCAS_PROXIED_SERVICE_HTTP_POST", 'CAS_ProxiedService_Http_Post');
+/**
+ * phpCAS::getProxiedService() type for IMAP
+ */
+define("PHPCAS_PROXIED_SERVICE_IMAP", 'CAS_ProxiedService_Imap');
+
+
+/** @} */
+// ------------------------------------------------------------------------
+//  LANGUAGES
+// ------------------------------------------------------------------------
+/**
+ * @addtogroup publicLang
+ * @{
+ */
+
+define("PHPCAS_LANG_ENGLISH", 'english');
+define("PHPCAS_LANG_FRENCH", 'french');
+define("PHPCAS_LANG_GREEK", 'greek');
+define("PHPCAS_LANG_GERMAN", 'german');
+define("PHPCAS_LANG_JAPANESE", 'japanese');
+define("PHPCAS_LANG_SPANISH", 'spanish');
+define("PHPCAS_LANG_CATALAN", 'catalan');
+
+/** @} */
+
+/**
+ * @addtogroup internalLang
+ * @{
+ */
+
+/**
+ * phpCAS default language (when phpCAS::setLang() is not used)
+ */
+define("PHPCAS_LANG_DEFAULT", PHPCAS_LANG_ENGLISH);
+
+/** @} */
+// ------------------------------------------------------------------------
+//  DEBUG
+// ------------------------------------------------------------------------
+/**
+ * @addtogroup publicDebug
+ * @{
+ */
+
+/**
+ * The default directory for the debug file under Unix.
+ */
+define('DEFAULT_DEBUG_DIR', '/tmp/');
+
+/** @} */
+// ------------------------------------------------------------------------
+//  MISC
+// ------------------------------------------------------------------------
+/**
+ * @addtogroup internalMisc
+ * @{
+ */
+
+/**
+ * This global variable is used by the interface class phpCAS.
+ *
+ * @hideinitializer
+ */
+$GLOBALS['PHPCAS_CLIENT'] = null;
+
+/**
+ * This global variable is used to store where the initializer is called from
+ * (to print a comprehensive error in case of multiple calls).
+ *
+ * @hideinitializer
+ */
+$GLOBALS['PHPCAS_INIT_CALL'] = array (
+	'done' => FALSE,
+	'file' => '?',
+	'line' => -1,
+	'method' => '?'
+);
+
+/**
+ * This global variable is used to store where the method checking
+ * the authentication is called from (to print comprehensive errors)
+ *
+ * @hideinitializer
+ */
+$GLOBALS['PHPCAS_AUTH_CHECK_CALL'] = array (
+	'done' => FALSE,
+	'file' => '?',
+	'line' => -1,
+	'method' => '?',
+	'result' => FALSE
+);
+
+/**
+ * This global variable is used to store phpCAS debug mode.
+ *
+ * @hideinitializer
+ */
+$GLOBALS['PHPCAS_DEBUG'] = array (
+	'filename' => FALSE,
+	'indent' => 0,
+	'unique_id' => ''
+);
+
+/** @} */
+
+// ########################################################################
+//  CLIENT CLASS
+// ########################################################################
+
+// include client class
+include_once (dirname(__FILE__) . '/CAS/Client.php');
+
+// ########################################################################
+//  INTERFACE CLASS
+// ########################################################################
+
+/**
+ * @class phpCAS
+ * The phpCAS class is a simple container for the phpCAS library. It provides CAS
+ * authentication for web applications written in PHP.
+ *
+ * @ingroup public
+ * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
+ *
+ * \internal All its methods access the same object ($PHPCAS_CLIENT, declared
+ * at the end of CAS/Client.php).
+ */
+
+class phpCAS {
+
+	// ########################################################################
+	//  INITIALIZATION
+	// ########################################################################
+
+	/**
+	 * @addtogroup publicInit
+	 * @{
+	 */
+
+	/**
+	 * phpCAS client initializer.
+	 * @note Only one of the phpCAS::client() and phpCAS::proxy functions should be
+	 * called, only once, and before all other methods (except phpCAS::getVersion()
+	 * and phpCAS::setDebug()).
+	 *
+	 * @param $server_version the version of the CAS server
+	 * @param $server_hostname the hostname of the CAS server
+	 * @param $server_port the port the CAS server is running on
+	 * @param $server_uri the URI the CAS server is responding on
+	 * @param $start_session Have phpCAS start PHP sessions (default true)
+	 *
+	 * @return a newly created CAS_Client object
+	 */
+	public static function client($server_version, $server_hostname, $server_port, $server_uri, $start_session = true) {
+		global $PHPCAS_CLIENT, $PHPCAS_INIT_CALL;
+
+		phpCAS :: traceBegin();
+		if (is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error($PHPCAS_INIT_CALL['method'] . '() has already been called (at ' . $PHPCAS_INIT_CALL['file'] . ':' . $PHPCAS_INIT_CALL['line'] . ')');
+		}
+		if (gettype($server_version) != 'string') {
+			phpCAS :: error('type mismatched for parameter $server_version (should be `string\')');
+		}
+		if (gettype($server_hostname) != 'string') {
+			phpCAS :: error('type mismatched for parameter $server_hostname (should be `string\')');
+		}
+		if (gettype($server_port) != 'integer') {
+			phpCAS :: error('type mismatched for parameter $server_port (should be `integer\')');
+		}
+		if (gettype($server_uri) != 'string') {
+			phpCAS :: error('type mismatched for parameter $server_uri (should be `string\')');
+		}
+
+		// store where the initializer is called from
+		$dbg = debug_backtrace();
+		$PHPCAS_INIT_CALL = array (
+			'done' => TRUE,
+			'file' => $dbg[0]['file'],
+			'line' => $dbg[0]['line'],
+			'method' => __CLASS__ . '::' . __FUNCTION__
+		);
+
+		// initialize the global object $PHPCAS_CLIENT
+		$PHPCAS_CLIENT = new CAS_Client($server_version, FALSE /*proxy*/
+		, $server_hostname, $server_port, $server_uri, $start_session);
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * phpCAS proxy initializer.
+	 * @note Only one of the phpCAS::client() and phpCAS::proxy functions should be
+	 * called, only once, and before all other methods (except phpCAS::getVersion()
+	 * and phpCAS::setDebug()).
+	 *
+	 * @param $server_version the version of the CAS server
+	 * @param $server_hostname the hostname of the CAS server
+	 * @param $server_port the port the CAS server is running on
+	 * @param $server_uri the URI the CAS server is responding on
+	 * @param $start_session Have phpCAS start PHP sessions (default true)
+	 *
+	 * @return a newly created CAS_Client object
+	 */
+	public static function proxy($server_version, $server_hostname, $server_port, $server_uri, $start_session = true) {
+		global $PHPCAS_CLIENT, $PHPCAS_INIT_CALL;
+
+		phpCAS :: traceBegin();
+		if (is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error($PHPCAS_INIT_CALL['method'] . '() has already been called (at ' . $PHPCAS_INIT_CALL['file'] . ':' . $PHPCAS_INIT_CALL['line'] . ')');
+		}
+		if (gettype($server_version) != 'string') {
+			phpCAS :: error('type mismatched for parameter $server_version (should be `string\')');
+		}
+		if (gettype($server_hostname) != 'string') {
+			phpCAS :: error('type mismatched for parameter $server_hostname (should be `string\')');
+		}
+		if (gettype($server_port) != 'integer') {
+			phpCAS :: error('type mismatched for parameter $server_port (should be `integer\')');
+		}
+		if (gettype($server_uri) != 'string') {
+			phpCAS :: error('type mismatched for parameter $server_uri (should be `string\')');
+		}
+
+		// store where the initialzer is called from
+		$dbg = debug_backtrace();
+		$PHPCAS_INIT_CALL = array (
+			'done' => TRUE,
+			'file' => $dbg[0]['file'],
+			'line' => $dbg[0]['line'],
+			'method' => __CLASS__ . '::' . __FUNCTION__
+		);
+
+		// initialize the global object $PHPCAS_CLIENT
+		$PHPCAS_CLIENT = new CAS_Client($server_version, TRUE /*proxy*/
+		, $server_hostname, $server_port, $server_uri, $start_session);
+		phpCAS :: traceEnd();
+	}
+
+	/** @} */
+	// ########################################################################
+	//  DEBUGGING
+	// ########################################################################
+
+	/**
+	 * @addtogroup publicDebug
+	 * @{
+	 */
+
+	/**
+	 * Set/unset debug mode
+	 *
+	 * @param $filename the name of the file used for logging, or FALSE to stop debugging.
+	 */
+	public static function setDebug($filename = '') {
+		global $PHPCAS_DEBUG;
+
+		if ($filename != FALSE && gettype($filename) != 'string') {
+			phpCAS :: error('type mismatched for parameter $dbg (should be FALSE or the name of the log file)');
+		}
+		if ($filename === FALSE){
+			unset($PHPCAS_DEBUG['filename']);
+		}else{
+			if (empty ($filename)) {
+				if (preg_match('/^Win.*/', getenv('OS'))) {
+					if (isset ($_ENV['TMP'])) {
+						$debugDir = $_ENV['TMP'] . '/';
+					} else
+						if (isset ($_ENV['TEMP'])) {
+							$debugDir = $_ENV['TEMP'] . '/';
+						} else {
+							$debugDir = '';
+						}
+				} else {
+					$debugDir = DEFAULT_DEBUG_DIR;
+				}
+				$filename = $debugDir . 'phpCAS.log';
+			}
+			
+			if (empty ($PHPCAS_DEBUG['unique_id'])) {
+				$PHPCAS_DEBUG['unique_id'] = substr(strtoupper(md5(uniqid(''))), 0, 4);
+			}
+			
+			$PHPCAS_DEBUG['filename'] = $filename;
+			
+			phpCAS :: trace('START phpCAS-' . PHPCAS_VERSION . ' ******************');
+		}
+	}
+
+
+	/**
+	 * Logs a string in debug mode.
+	 *
+	 * @param $str the string to write
+	 *
+	 * @private
+	 */
+	public static function log($str) {
+		$indent_str = ".";
+		global $PHPCAS_DEBUG;
+
+		if ($PHPCAS_DEBUG['filename']) {
+			for ($i = 0; $i < $PHPCAS_DEBUG['indent']; $i++) {
+				$indent_str .= '|    ';
+			}
+			// allow for multiline output with proper identing. Usefull for dumping cas answers etc.
+			$str2 = str_replace("\n", "\n" . $PHPCAS_DEBUG['unique_id'] . ' ' . $indent_str, $str);
+			error_log($PHPCAS_DEBUG['unique_id'] . ' ' . $indent_str . $str2 . "\n", 3, $PHPCAS_DEBUG['filename']);
+		}
+
+	}
+
+	/**
+	 * This method is used by interface methods to print an error and where the function
+	 * was originally called from.
+	 *
+	 * @param $msg the message to print
+	 *
+	 * @private
+	 */
+	public static function error($msg) {
+		$dbg = debug_backtrace();
+		$function = '?';
+		$file = '?';
+		$line = '?';
+		if (is_array($dbg)) {
+			for ($i = 1; $i < sizeof($dbg); $i++) {
+				if (is_array($dbg[$i]) && isset($dbg[$i]['class']) ) {
+					if ($dbg[$i]['class'] == __CLASS__) {
+						$function = $dbg[$i]['function'];
+						$file = $dbg[$i]['file'];
+						$line = $dbg[$i]['line'];
+					}
+				}
+			}
+		}
+		echo "<br />\n<b>phpCAS error</b>: <font color=\"FF0000\"><b>" . __CLASS__ . "::" . $function . '(): ' . htmlentities($msg) . "</b></font> in <b>" . $file . "</b> on line <b>" . $line . "</b><br />\n";
+		phpCAS :: trace($msg);
+		phpCAS :: traceExit();
+		exit ();
+	}
+
+	/**
+	 * This method is used to log something in debug mode.
+	 */
+	public static function trace($str) {
+		$dbg = debug_backtrace();
+		phpCAS :: log($str . ' [' . basename($dbg[0]['file']) . ':' . $dbg[0]['line'] . ']');
+	}
+
+	/**
+	 * This method is used to indicate the start of the execution of a function in debug mode.
+	 */
+	public static function traceBegin() {
+		global $PHPCAS_DEBUG;
+
+		$dbg = debug_backtrace();
+		$str = '=> ';
+		if (!empty ($dbg[1]['class'])) {
+			$str .= $dbg[1]['class'] . '::';
+		}
+		$str .= $dbg[1]['function'] . '(';
+		if (is_array($dbg[1]['args'])) {
+			foreach ($dbg[1]['args'] as $index => $arg) {
+				if ($index != 0) {
+					$str .= ', ';
+				}
+				if(is_object($arg)){
+					$str .= get_class($arg);
+				}else{
+					$str .= str_replace(array("\r\n", "\n", "\r"), "", var_export($arg, TRUE));
+				}
+			}
+		}
+		if (isset($dbg[1]['file']))
+		$file = basename($dbg[1]['file']);
+		else
+		$file = 'unknown_file';
+		if (isset($dbg[1]['line']))
+		$line = $dbg[1]['line'];
+		else
+		$line = 'unknown_line';
+		$str .= ') [' . $file . ':' . $line . ']';
+		phpCAS :: log($str);
+		$PHPCAS_DEBUG['indent']++;
+	}
+
+	/**
+	 * This method is used to indicate the end of the execution of a function in debug mode.
+	 *
+	 * @param $res the result of the function
+	 */
+	public static function traceEnd($res = '') {
+		global $PHPCAS_DEBUG;
+
+		$PHPCAS_DEBUG['indent']--;
+		$dbg = debug_backtrace();
+		$str = '';
+		if(is_object($res)){
+			$str .= '<= ' . get_class($arg);
+		}else{
+			$str .= '<= ' . str_replace(array("\r\n", "\n", "\r"), "", var_export($res, TRUE));
+		}
+		
+		phpCAS :: log($str);
+	}
+
+	/**
+	 * This method is used to indicate the end of the execution of the program
+	 */
+	public static function traceExit() {
+		global $PHPCAS_DEBUG;
+
+		phpCAS :: log('exit()');
+		while ($PHPCAS_DEBUG['indent'] > 0) {
+			phpCAS :: log('-');
+			$PHPCAS_DEBUG['indent']--;
+		}
+	}
+
+	/** @} */
+	// ########################################################################
+	//  INTERNATIONALIZATION
+	// ########################################################################
+	/**
+	 * @addtogroup publicLang
+	 * @{
+	 */
+
+	/**
+	 * This method is used to set the language used by phpCAS.
+	 * @note Can be called only once.
+	 *
+	 * @param $lang a string representing the language.
+	 *
+	 * @sa PHPCAS_LANG_FRENCH, PHPCAS_LANG_ENGLISH
+	 */
+	public static function setLang($lang) {
+		global $PHPCAS_CLIENT;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		if (gettype($lang) != 'string') {
+			phpCAS :: error('type mismatched for parameter $lang (should be `string\')');
+		}
+		$PHPCAS_CLIENT->setLang($lang);
+	}
+
+	/** @} */
+	// ########################################################################
+	//  VERSION
+	// ########################################################################
+	/**
+	 * @addtogroup public
+	 * @{
+	 */
+
+	/**
+	 * This method returns the phpCAS version.
+	 *
+	 * @return the phpCAS version.
+	 */
+	public static function getVersion() {
+		return PHPCAS_VERSION;
+	}
+
+	/** @} */
+	// ########################################################################
+	//  HTML OUTPUT
+	// ########################################################################
+	/**
+	 * @addtogroup publicOutput
+	 * @{
+	 */
+
+	/**
+	 * This method sets the HTML header used for all outputs.
+	 *
+	 * @param $header the HTML header.
+	 */
+	public static function setHTMLHeader($header) {
+		global $PHPCAS_CLIENT;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		if (gettype($header) != 'string') {
+			phpCAS :: error('type mismatched for parameter $header (should be `string\')');
+		}
+		$PHPCAS_CLIENT->setHTMLHeader($header);
+	}
+
+	/**
+	 * This method sets the HTML footer used for all outputs.
+	 *
+	 * @param $footer the HTML footer.
+	 */
+	public static function setHTMLFooter($footer) {
+		global $PHPCAS_CLIENT;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		if (gettype($footer) != 'string') {
+			phpCAS :: error('type mismatched for parameter $footer (should be `string\')');
+		}
+		$PHPCAS_CLIENT->setHTMLFooter($footer);
+	}
+
+	/** @} */
+	// ########################################################################
+	//  PGT STORAGE
+	// ########################################################################
+	/**
+	 * @addtogroup publicPGTStorage
+	 * @{
+	 */
+
+	/**
+	 * This method can be used to set a custom PGT storage object.
+	 *
+	 * @param $storage a PGT storage object that inherits from the CAS_PGTStorage class
+	 */
+	public static function setPGTStorage($storage) {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_CLIENT->isProxy()) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if ($PHPCAS_AUTH_CHECK_CALL['done']) {
+			phpCAS :: error('this method should only be called before ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() (called at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ')');
+		}
+		if ( !($storage instanceof CAS_PGTStorage) ) {
+			phpCAS :: error('type mismatched for parameter $storage (should be a CAS_PGTStorage `object\')');
+		}
+		$PHPCAS_CLIENT->setPGTStorage($storage);
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * This method is used to tell phpCAS to store the response of the
+	 * CAS server to PGT requests in a database.
+	 *
+	 * @param $dsn_or_pdo a dsn string to use for creating a PDO object or a PDO object
+	 * @param $username the username to use when connecting to the database
+	 * @param $password the password to use when connecting to the database
+	 * @param $table the table to use for storing and retrieving PGT's
+	 * @param $driver_options any driver options to use when connecting to the database
+	 */
+	public static function setPGTStorageDb($dsn_or_pdo, $username='', $password='', $table='', $driver_options=null) {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_CLIENT->isProxy()) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if ($PHPCAS_AUTH_CHECK_CALL['done']) {
+			phpCAS :: error('this method should only be called before ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() (called at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ')');
+		}
+		if (gettype($username) != 'string') {
+			phpCAS :: error('type mismatched for parameter $username (should be `string\')');
+		}
+		if (gettype($password) != 'string') {
+			phpCAS :: error('type mismatched for parameter $password (should be `string\')');
+		}
+		if (gettype($table) != 'string') {
+			phpCAS :: error('type mismatched for parameter $table (should be `string\')');
+		}
+		$PHPCAS_CLIENT->setPGTStorageDb($dsn_or_pdo, $username, $password, $table, $driver_options);
+		phpCAS :: traceEnd();
+	}
+	
+	/**
+	 * This method is used to tell phpCAS to store the response of the
+	 * CAS server to PGT requests onto the filesystem.
+	 * @param $format the format used to store the PGT's. This parameter has no effect and is only for backwards compatibility
+	 * @param $path the path where the PGT's should be stored
+	 */
+	public static function setPGTStorageFile($format = '', $path = '') {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_CLIENT->isProxy()) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if ($PHPCAS_AUTH_CHECK_CALL['done']) {
+			phpCAS :: error('this method should only be called before ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() (called at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ')');
+		}
+		if (gettype($format) != 'string') {
+			phpCAS :: error('type mismatched for parameter $format (should be `string\')');
+		}
+		if (gettype($path) != 'string') {
+			phpCAS :: error('type mismatched for parameter $format (should be `string\')');
+		}
+		$PHPCAS_CLIENT->setPGTStorageFile($path);
+		phpCAS :: traceEnd();
+	}
+	
+	/** @} */
+	// ########################################################################
+	// ACCESS TO EXTERNAL SERVICES
+	// ########################################################################
+	/**
+	 * @addtogroup publicServices
+	 * @{
+	 */
+	
+	/**
+	 * Answer a proxy-authenticated service handler.
+	 * 
+	 * @param string $type The service type. One of:
+	 *			PHPCAS_PROXIED_SERVICE_HTTP_GET
+	 *			PHPCAS_PROXIED_SERVICE_HTTP_POST
+	 *			PHPCAS_PROXIED_SERVICE_IMAP
+	 *			
+	 *		
+	 * @return CAS_ProxiedService
+	 * @throws InvalidArgumentException If the service type is unknown.
+	 */
+	public static function getProxiedService ($type) {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_CLIENT->isProxy()) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
+			phpCAS :: error('this method should only be called after the programmer is sure the user has been authenticated (by calling ' . __CLASS__ . '::checkAuthentication() or ' . __CLASS__ . '::forceAuthentication()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
+			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
+		}
+		if (gettype($type) != 'string') {
+			phpCAS :: error('type mismatched for parameter $type (should be `string\')');
+		}
+
+		$res = $PHPCAS_CLIENT->getProxiedService($type);
+
+		phpCAS :: traceEnd();
+		return $res;
+	}
+	
+	/**
+	 * Initialize a proxied-service handler with the proxy-ticket it should use.
+	 * 
+	 * @param CAS_ProxiedService $proxiedService
+	 * @return void
+	 * @throws CAS_ProxyTicketException If there is a proxy-ticket failure.
+	 *		The code of the Exception will be one of: 
+	 *			PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE 
+	 *			PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE
+	 *			PHPCAS_SERVICE_PT_FAILURE
+	 */
+	public static function initializeProxiedService (CAS_ProxiedService $proxiedService) {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_CLIENT->isProxy()) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
+			phpCAS :: error('this method should only be called after the programmer is sure the user has been authenticated (by calling ' . __CLASS__ . '::checkAuthentication() or ' . __CLASS__ . '::forceAuthentication()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
+			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
+		}
+
+		$PHPCAS_CLIENT->initializeProxiedService($proxiedService);
+	}
+	
+	/**
+	 * This method is used to access an HTTP[S] service.
+	 *
+	 * @param $url the service to access.
+	 * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
+	 * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
+	 * PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT_AVAILABLE.
+	 * @param $output the output of the service (also used to give an error
+	 * message on failure).
+	 *
+	 * @return TRUE on success, FALSE otherwise (in this later case, $err_code
+	 * gives the reason why it failed and $output contains an error message).
+	 */
+	public static function serviceWeb($url, & $err_code, & $output) {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_CLIENT->isProxy()) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
+			phpCAS :: error('this method should only be called after the programmer is sure the user has been authenticated (by calling ' . __CLASS__ . '::checkAuthentication() or ' . __CLASS__ . '::forceAuthentication()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
+			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
+		}
+		if (gettype($url) != 'string') {
+			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
+		}
+
+		$res = $PHPCAS_CLIENT->serviceWeb($url, $err_code, $output);
+
+		phpCAS :: traceEnd($res);
+		return $res;
+	}
+
+	/**
+	 * This method is used to access an IMAP/POP3/NNTP service.
+	 *
+	 * @param $url a string giving the URL of the service, including the mailing box
+	 * for IMAP URLs, as accepted by imap_open().
+	 * @param $service a string giving for CAS retrieve Proxy ticket
+	 * @param $flags options given to imap_open().
+	 * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
+	 * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
+	 * PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT_AVAILABLE.
+	 * @param $err_msg an error message on failure
+	 * @param $pt the Proxy Ticket (PT) retrieved from the CAS server to access the URL
+	 * on success, FALSE on error).
+	 *
+	 * @return an IMAP stream on success, FALSE otherwise (in this later case, $err_code
+	 * gives the reason why it failed and $err_msg contains an error message).
+	 */
+	public static function serviceMail($url, $service, $flags, & $err_code, & $err_msg, & $pt) {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_CLIENT->isProxy()) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
+			phpCAS :: error('this method should only be called after the programmer is sure the user has been authenticated (by calling ' . __CLASS__ . '::checkAuthentication() or ' . __CLASS__ . '::forceAuthentication()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
+			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
+		}
+		if (gettype($url) != 'string') {
+			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
+		}
+
+		if (gettype($flags) != 'integer') {
+			phpCAS :: error('type mismatched for parameter $flags (should be `integer\')');
+		}
+
+		$res = $PHPCAS_CLIENT->serviceMail($url, $service, $flags, $err_code, $err_msg, $pt);
+
+		phpCAS :: traceEnd($res);
+		return $res;
+	}
+
+	/** @} */
+	// ########################################################################
+	//  AUTHENTICATION
+	// ########################################################################
+	/**
+	 * @addtogroup publicAuth
+	 * @{
+	 */
+
+	/**
+	 * Set the times authentication will be cached before really accessing the CAS server in gateway mode:
+	 * - -1: check only once, and then never again (until you pree login)
+	 * - 0: always check
+	 * - n: check every "n" time
+	 *
+	 * @param $n an integer.
+	 */
+	public static function setCacheTimesForAuthRecheck($n) {
+		global $PHPCAS_CLIENT;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		if (gettype($n) != 'integer') {
+			phpCAS :: error('type mismatched for parameter $header (should be `string\')');
+		}
+		$PHPCAS_CLIENT->setCacheTimesForAuthRecheck($n);
+	}
+	
+	/**
+	 * Set a callback function to be run when a user authenticates.
+	 *
+	 * The callback function will be passed a $logoutTicket as its first parameter,
+	 * followed by any $additionalArgs you pass. The $logoutTicket parameter is an
+	 * opaque string that can be used to map the session-id to logout request in order
+	 * to support single-signout in applications that manage their own sessions 
+	 * (rather than letting phpCAS start the session).
+	 *
+	 * phpCAS::forceAuthentication() will always exit and forward client unless
+	 * they are already authenticated. To perform an action at the moment the user
+	 * logs in (such as registering an account, performing logging, etc), register
+	 * a callback function here.
+	 * 
+	 * @param callback $function
+	 * @param optional array $additionalArgs
+	 * @return void
+	 */
+	public static function setPostAuthenticateCallback ($function, array $additionalArgs = array()) {
+		global $PHPCAS_CLIENT;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		
+		$PHPCAS_CLIENT->setPostAuthenticateCallback($function, $additionalArgs);
+	}
+	
+	/**
+	 * Set a callback function to be run when a single-signout request is received.
+	 *
+	 * The callback function will be passed a $logoutTicket as its first parameter,
+	 * followed by any $additionalArgs you pass. The $logoutTicket parameter is an
+	 * opaque string that can be used to map a session-id to the logout request in order
+	 * to support single-signout in applications that manage their own sessions 
+	 * (rather than letting phpCAS start and destroy the session).
+	 * 
+	 * @param callback $function
+	 * @param optional array $additionalArgs
+	 * @return void
+	 */
+	public static function setSingleSignoutCallback ($function, array $additionalArgs = array()) {
+		global $PHPCAS_CLIENT;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		
+		$PHPCAS_CLIENT->setSingleSignoutCallback($function, $additionalArgs);
+	}
+
+	/**
+	 * This method is called to check if the user is already authenticated locally or has a global cas session. A already
+	 * existing cas session is determined by a cas gateway call.(cas login call without any interactive prompt)
+	 * @return TRUE when the user is authenticated, FALSE when a previous gateway login failed or
+	 * the function will not return if the user is redirected to the cas server for a gateway login attempt
+	 */
+	public static function checkAuthentication() {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+
+		$auth = $PHPCAS_CLIENT->checkAuthentication();
+
+		// store where the authentication has been checked and the result
+		$dbg = debug_backtrace();
+		$PHPCAS_AUTH_CHECK_CALL = array (
+			'done' => TRUE,
+			'file' => $dbg[0]['file'],
+			'line' => $dbg[0]['line'],
+			'method' => __CLASS__ . '::' . __FUNCTION__,
+			'result' => $auth
+		);
+		phpCAS :: traceEnd($auth);
+		return $auth;
+	}
+
+	/**
+	 * This method is called to force authentication if the user was not already
+	 * authenticated. If the user is not authenticated, halt by redirecting to
+	 * the CAS server.
+	 */
+	public static function forceAuthentication() {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+
+		$auth = $PHPCAS_CLIENT->forceAuthentication();
+
+		// store where the authentication has been checked and the result
+		$dbg = debug_backtrace();
+		$PHPCAS_AUTH_CHECK_CALL = array (
+			'done' => TRUE,
+			'file' => $dbg[0]['file'],
+			'line' => $dbg[0]['line'],
+			'method' => __CLASS__ . '::' . __FUNCTION__,
+			'result' => $auth
+		);
+
+		if (!$auth) {
+			phpCAS :: trace('user is not authenticated, redirecting to the CAS server');
+			$PHPCAS_CLIENT->forceAuthentication();
+		} else {
+			phpCAS :: trace('no need to authenticate (user `' . phpCAS :: getUser() . '\' is already authenticated)');
+		}
+
+		phpCAS :: traceEnd();
+		return $auth;
+	}
+
+	/**
+	 * This method is called to renew the authentication.
+	 **/
+	public static function renewAuthentication() {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		$auth = $PHPCAS_CLIENT->renewAuthentication();
+		// store where the authentication has been checked and the result
+		$dbg = debug_backtrace();
+		$PHPCAS_AUTH_CHECK_CALL = array (
+			'done' => TRUE,
+			'file' => $dbg[0]['file'],
+			'line' => $dbg[0]['line'],
+			'method' => __CLASS__ . '::' . __FUNCTION__,
+			'result' => $auth
+		);
+
+		//$PHPCAS_CLIENT->renewAuthentication();
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * This method is called to check if the user is authenticated (previously or by
+	 * tickets given in the URL).
+	 *
+	 * @return TRUE when the user is authenticated.
+	 */
+	public static function isAuthenticated() {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+
+		// call the isAuthenticated method of the global $PHPCAS_CLIENT object
+		$auth = $PHPCAS_CLIENT->isAuthenticated();
+
+		// store where the authentication has been checked and the result
+		$dbg = debug_backtrace();
+		$PHPCAS_AUTH_CHECK_CALL = array (
+			'done' => TRUE,
+			'file' => $dbg[0]['file'],
+			'line' => $dbg[0]['line'],
+			'method' => __CLASS__ . '::' . __FUNCTION__,
+			'result' => $auth
+		);
+		phpCAS :: traceEnd($auth);
+		return $auth;
+	}
+
+	/**
+	 * Checks whether authenticated based on $_SESSION. Useful to avoid
+	 * server calls.
+	 * @return true if authenticated, false otherwise.
+	 * @since 0.4.22 by Brendan Arnold
+	 */
+	public static function isSessionAuthenticated() {
+		global $PHPCAS_CLIENT;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		return ($PHPCAS_CLIENT->isSessionAuthenticated());
+	}
+
+	/**
+	 * This method returns the CAS user's login name.
+	 * @warning should not be called only after phpCAS::forceAuthentication()
+	 * or phpCAS::checkAuthentication().
+	 *
+	 * @return the login name of the authenticated user
+	 */
+	public static function getUser() {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
+			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
+		}
+		return $PHPCAS_CLIENT->getUser();
+	}
+
+	/**
+	 * Answer attributes about the authenticated user.
+	 *
+	 * @warning should not be called only after phpCAS::forceAuthentication()
+	 * or phpCAS::checkAuthentication().
+	 *
+	 * @return array
+	 */
+	public static function getAttributes() {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
+			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
+		}
+		return $PHPCAS_CLIENT->getAttributes();
+	}
+	
+	/**
+	 * Answer true if there are attributes for the authenticated user.
+	 *
+	 * @warning should not be called only after phpCAS::forceAuthentication()
+	 * or phpCAS::checkAuthentication().
+	 *
+	 * @return boolean
+	 */
+	public static function hasAttributes() {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
+			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
+		}
+		return $PHPCAS_CLIENT->hasAttributes();
+	}
+	
+	/**
+	 * Answer true if an attribute exists for the authenticated user.
+	 *
+	 * @warning should not be called only after phpCAS::forceAuthentication()
+	 * or phpCAS::checkAuthentication().
+	 *
+	 * @param string $key
+	 * @return boolean
+	 */
+	public static function hasAttribute($key) {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
+			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
+		}
+		return $PHPCAS_CLIENT->hasAttribute($key);
+	}
+	
+	/**
+	 * Answer an attribute for the authenticated user.
+	 *
+	 * @warning should not be called only after phpCAS::forceAuthentication()
+	 * or phpCAS::checkAuthentication().
+	 *
+	 * @param string $key
+	 * @return mixed string for a single value or an array if multiple values exist.
+	 */
+	public static function getAttribute($key) {
+		global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['done']) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::forceAuthentication() or ' . __CLASS__ . '::isAuthenticated()');
+		}
+		if (!$PHPCAS_AUTH_CHECK_CALL['result']) {
+			phpCAS :: error('authentication was checked (by ' . $PHPCAS_AUTH_CHECK_CALL['method'] . '() at ' . $PHPCAS_AUTH_CHECK_CALL['file'] . ':' . $PHPCAS_AUTH_CHECK_CALL['line'] . ') but the method returned FALSE');
+		}
+		return $PHPCAS_CLIENT->getAttribute($key);
+	}
+	
+	/**
+	 * Handle logout requests.
+	 */
+	public static function handleLogoutRequests($check_client = true, $allowed_clients = false) {
+		global $PHPCAS_CLIENT;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		return ($PHPCAS_CLIENT->handleLogoutRequests($check_client, $allowed_clients));
+	}
+
+	/**
+	 * This method returns the URL to be used to login.
+	 * or phpCAS::isAuthenticated().
+	 *
+	 * @return the login name of the authenticated user
+	 */
+	public static function getServerLoginURL() {
+		global $PHPCAS_CLIENT;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		return $PHPCAS_CLIENT->getServerLoginURL();
+	}
+
+	/**
+	 * Set the login URL of the CAS server.
+	 * @param $url the login URL
+	 * @since 0.4.21 by Wyman Chan
+	 */
+	public static function setServerLoginURL($url = '') {
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after
+										' . __CLASS__ . '::client()');
+		}
+		if (gettype($url) != 'string') {
+			phpCAS :: error('type mismatched for parameter $url (should be
+									`string\')');
+		}
+		$PHPCAS_CLIENT->setServerLoginURL($url);
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * Set the serviceValidate URL of the CAS server.
+	 * Used only in CAS 1.0 validations
+	 * @param $url the serviceValidate URL
+	 * @since 1.1.0 by Joachim Fritschi
+	 */
+	public static function setServerServiceValidateURL($url = '') {
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after
+										' . __CLASS__ . '::client()');
+		}
+		if (gettype($url) != 'string') {
+			phpCAS :: error('type mismatched for parameter $url (should be
+									`string\')');
+		}
+		$PHPCAS_CLIENT->setServerServiceValidateURL($url);
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * Set the proxyValidate URL of the CAS server.
+	 * Used for all CAS 2.0 validations
+	 * @param $url the proxyValidate URL
+	 * @since 1.1.0 by Joachim Fritschi
+	 */
+	public static function setServerProxyValidateURL($url = '') {
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after
+										' . __CLASS__ . '::client()');
+		}
+		if (gettype($url) != 'string') {
+			phpCAS :: error('type mismatched for parameter $url (should be
+									`string\')');
+		}
+		$PHPCAS_CLIENT->setServerProxyValidateURL($url);
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * Set the samlValidate URL of the CAS server.
+	 * @param $url the samlValidate URL
+	 * @since 1.1.0 by Joachim Fritschi
+	 */
+	public static function setServerSamlValidateURL($url = '') {
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after
+										' . __CLASS__ . '::client()');
+		}
+		if (gettype($url) != 'string') {
+			phpCAS :: error('type mismatched for parameter $url (should be
+									`string\')');
+		}
+		$PHPCAS_CLIENT->setServerSamlValidateURL($url);
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * This method returns the URL to be used to login.
+	 * or phpCAS::isAuthenticated().
+	 *
+	 * @return the login name of the authenticated user
+	 */
+	public static function getServerLogoutURL() {
+		global $PHPCAS_CLIENT;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should not be called before ' . __CLASS__ . '::client() or ' . __CLASS__ . '::proxy()');
+		}
+		return $PHPCAS_CLIENT->getServerLogoutURL();
+	}
+
+	/**
+	 * Set the logout URL of the CAS server.
+	 * @param $url the logout URL
+	 * @since 0.4.21 by Wyman Chan
+	 */
+	public static function setServerLogoutURL($url = '') {
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after
+										' . __CLASS__ . '::client()');
+		}
+		if (gettype($url) != 'string') {
+			phpCAS :: error('type mismatched for parameter $url (should be
+									`string\')');
+		}
+		$PHPCAS_CLIENT->setServerLogoutURL($url);
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * This method is used to logout from CAS.
+	 * @params $params an array that contains the optional url and service parameters that will be passed to the CAS server
+	 * @public
+	 */
+	public static function logout($params = "") {
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
+		}
+		$parsedParams = array ();
+		if ($params != "") {
+			if (is_string($params)) {
+				phpCAS :: error('method `phpCAS::logout($url)\' is now deprecated, use `phpCAS::logoutWithUrl($url)\' instead');
+			}
+			if (!is_array($params)) {
+				phpCAS :: error('type mismatched for parameter $params (should be `array\')');
+			}
+			foreach ($params as $key => $value) {
+				if ($key != "service" && $key != "url") {
+					phpCAS :: error('only `url\' and `service\' parameters are allowed for method `phpCAS::logout($params)\'');
+				}
+				$parsedParams[$key] = $value;
+			}
+		}
+		$PHPCAS_CLIENT->logout($parsedParams);
+		// never reached
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * This method is used to logout from CAS. Halts by redirecting to the CAS server.
+	 * @param $service a URL that will be transmitted to the CAS server
+	 */
+	public static function logoutWithRedirectService($service) {
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
+		}
+		if (!is_string($service)) {
+			phpCAS :: error('type mismatched for parameter $service (should be `string\')');
+		}
+		$PHPCAS_CLIENT->logout(array (
+			"service" => $service
+		));
+		// never reached
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * This method is used to logout from CAS. Halts by redirecting to the CAS server.
+	 * @param $url a URL that will be transmitted to the CAS server
+	 * @deprecated The url parameter has been removed from the CAS server as of version 3.3.5.1
+	 */
+	public static function logoutWithUrl($url) {
+		trigger_error('Function deprecated for cas servers >= 3.3.5.1', E_USER_DEPRECATED);
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
+		}
+		if (!is_string($url)) {
+			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
+		}
+		$PHPCAS_CLIENT->logout(array (
+			"url" => $url
+		));
+		// never reached
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * This method is used to logout from CAS. Halts by redirecting to the CAS server.
+	 * @param $service a URL that will be transmitted to the CAS server
+	 * @param $url a URL that will be transmitted to the CAS server
+	 * @deprecated The url parameter has been removed from the CAS server as of version 3.3.5.1
+	 */
+	public static function logoutWithRedirectServiceAndUrl($service, $url) {
+		trigger_error('Function deprecated for cas servers >= 3.3.5.1', E_USER_DEPRECATED);
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
+		}
+		if (!is_string($service)) {
+			phpCAS :: error('type mismatched for parameter $service (should be `string\')');
+		}
+		if (!is_string($url)) {
+			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
+		}
+		$PHPCAS_CLIENT->logout(array (
+			"service" => $service,
+			"url" => $url
+		));
+		// never reached
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * Set the fixed URL that will be used by the CAS server to transmit the PGT.
+	 * When this method is not called, a phpCAS script uses its own URL for the callback.
+	 *
+	 * @param $url the URL
+	 */
+	public static function setFixedCallbackURL($url = '') {
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (!$PHPCAS_CLIENT->isProxy()) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (gettype($url) != 'string') {
+			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
+		}
+		$PHPCAS_CLIENT->setCallbackURL($url);
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * Set the fixed URL that will be set as the CAS service parameter. When this
+	 * method is not called, a phpCAS script uses its own URL.
+	 *
+	 * @param $url the URL
+	 */
+	public static function setFixedServiceURL($url) {
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (gettype($url) != 'string') {
+			phpCAS :: error('type mismatched for parameter $url (should be `string\')');
+		}
+		$PHPCAS_CLIENT->setURL($url);
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * Get the URL that is set as the CAS service parameter.
+	 */
+	public static function getServiceURL() {
+		global $PHPCAS_CLIENT;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		return ($PHPCAS_CLIENT->getURL());
+	}
+
+	/**
+	 * Retrieve a Proxy Ticket from the CAS server.
+	 */
+	public static function retrievePT($target_service, & $err_code, & $err_msg) {
+		global $PHPCAS_CLIENT;
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::proxy()');
+		}
+		if (gettype($target_service) != 'string') {
+			phpCAS :: error('type mismatched for parameter $target_service(should be `string\')');
+		}
+		return ($PHPCAS_CLIENT->retrievePT($target_service, $err_code, $err_msg));
+	}
+
+	/**
+	 * Set the certificate of the CAS server CA.
+	 *
+	 * @param $cert the CA certificate
+	 */
+	public static function setCasServerCACert($cert) {
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
+		}
+		if (gettype($cert) != 'string') {
+			phpCAS :: error('type mismatched for parameter $cert (should be `string\')');
+		}
+		$PHPCAS_CLIENT->setCasServerCACert($cert);
+		phpCAS :: traceEnd();
+	}
+
+	/**
+	 * Set no SSL validation for the CAS server.
+	 */
+	public static function setNoCasServerValidation() {
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
+		}
+		$PHPCAS_CLIENT->setNoCasServerValidation();
+		phpCAS :: traceEnd();
+	}
+	
+	
+	/**
+	 * Disable the removal of a CAS-Ticket from the URL when authenticating
+	 * DISABLING POSES A SECURITY RISK:
+	 * We normally remove the ticket by an additional redirect as a security precaution
+     * to prevent a ticket in the HTTP_REFERRER or be carried over in the URL parameter
+	 */
+	public static function setNoClearTicketsFromUrl() {
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
+		}
+		$PHPCAS_CLIENT->setNoClearTicketsFromUrl();
+		phpCAS :: traceEnd();
+	}
+
+	/** @} */
+
+	/**
+	 * Change CURL options.
+	 * CURL is used to connect through HTTPS to CAS server
+	 * @param $key the option key
+	 * @param $value the value to set
+	 */
+	public static function setExtraCurlOption($key, $value) {
+		global $PHPCAS_CLIENT;
+		phpCAS :: traceBegin();
+		if (!is_object($PHPCAS_CLIENT)) {
+			phpCAS :: error('this method should only be called after ' . __CLASS__ . '::client() or' . __CLASS__ . '::proxy()');
+		}
+		$PHPCAS_CLIENT->setExtraCurlOption($key, $value);
+		phpCAS :: traceEnd();
+	}
+	
+			
+	/**
+	 * Answer an array of proxies that are sitting in front of this application.
+	 *
+	 * This method will only return a non-empty array if we have received and validated
+	 * a Proxy Ticket.
+	 * 
+	 * @return array
+	 * @access public
+	 * @since 6/25/09
+	 */
+	public static function getProxies () {
+		global $PHPCAS_CLIENT;
+		if ( !is_object($PHPCAS_CLIENT) ) {
+			phpCAS::error('this method should only be called after '.__CLASS__.'::client()');
+		}  
+		
+		return($PHPCAS_CLIENT->getProxies());
+	}
+
+}
+
+// ########################################################################
+// DOCUMENTATION
+// ########################################################################
+
+// ########################################################################
+//  MAIN PAGE
+
+/**
+ * @mainpage
+ *
+ * The following pages only show the source documentation.
+ *
+ */
+
+// ########################################################################
+//  MODULES DEFINITION
+
+/** @defgroup public User interface */
+
+/** @defgroup publicInit Initialization
+ *  @ingroup public */
+
+/** @defgroup publicAuth Authentication
+ *  @ingroup public */
+
+/** @defgroup publicServices Access to external services
+ *  @ingroup public */
+
+/** @defgroup publicConfig Configuration
+ *  @ingroup public */
+
+/** @defgroup publicLang Internationalization
+ *  @ingroup publicConfig */
+
+/** @defgroup publicOutput HTML output
+ *  @ingroup publicConfig */
+
+/** @defgroup publicPGTStorage PGT storage
+ *  @ingroup publicConfig */
+
+/** @defgroup publicDebug Debugging
+ *  @ingroup public */
+
+/** @defgroup internal Implementation */
+
+/** @defgroup internalAuthentication Authentication
+ *  @ingroup internal */
+
+/** @defgroup internalBasic CAS Basic client features (CAS 1.0, Service Tickets)
+ *  @ingroup internal */
+
+/** @defgroup internalProxy CAS Proxy features (CAS 2.0, Proxy Granting Tickets)
+ *  @ingroup internal */
+
+/** @defgroup internalSAML CAS SAML features (SAML 1.1)
+ *  @ingroup internal */
+
+/** @defgroup internalPGTStorage PGT storage
+ *  @ingroup internalProxy */
+
+/** @defgroup internalPGTStorageDb PGT storage in a database
+ *  @ingroup internalPGTStorage */
+
+/** @defgroup internalPGTStorageFile PGT storage on the filesystem
+ *  @ingroup internalPGTStorage */
+
+/** @defgroup internalCallback Callback from the CAS server
+ *  @ingroup internalProxy */
+
+/** @defgroup internalProxyServices Proxy other services
+ *  @ingroup internalProxy */
+
+/** @defgroup internalProxied CAS proxied client features (CAS 2.0, Proxy Tickets)
+ *  @ingroup internal */
+
+/** @defgroup internalConfig Configuration
+ *  @ingroup internal */
+
+/** @defgroup internalBehave Internal behaviour of phpCAS
+ *  @ingroup internalConfig */
+
+/** @defgroup internalOutput HTML output
+ *  @ingroup internalConfig */
+
+/** @defgroup internalLang Internationalization
+ *  @ingroup internalConfig
+ *
+ * To add a new language:
+ * - 1. define a new constant PHPCAS_LANG_XXXXXX in CAS/CAS.php
+ * - 2. copy any file from CAS/languages to CAS/languages/XXXXXX.php
+ * - 3. Make the translations
+ */
+
+/** @defgroup internalDebug Debugging
+ *  @ingroup internal */
+
+/** @defgroup internalMisc Miscellaneous
+ *  @ingroup internal */
+
+// ########################################################################
+//  EXAMPLES
+
+/**
+ * @example example_simple.php
+ */
+/**
+ * @example example_service.php
+ */
+/**
+ * @example example_service_that_proxies.php
+ */
+/**
+ * @example example_service_POST.php
+ */
+/**
+ * @example example_proxy_serviceWeb.php
+ */
+/**
+ * @example example_proxy_serviceWeb_chaining.php
+ */
+/**
+ * @example example_proxy_POST.php
+ */
+/**
+ * @example example_proxy_GET.php
+ */
+/**
+ * @example example_lang.php
+ */
+/**
+ * @example example_html.php
+ */
+/**
+ * @example example_pgt_storage_file.php
+ */
+/**
+ * @example example_gateway.php
+ */
+/**
+ * @example example_logout.php
+ */
+/**
+ * @example example_custom_urls.php
+ */
+/**
+ * @example example_advanced_saml11.php
+ */
+?>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/Client.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/Client.php
new file mode 100644
index 00000000..6dbc1a90
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/Client.php
@@ -0,0 +1,3047 @@
+<?php
+
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright notice,
+ *       this list of conditions and the following disclaimer in the documentation
+ *       and/or other materials provided with the distribution.
+ *     * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *       Collaborative nor the names of its contributors may be used to endorse or
+ *       promote products derived from this software without specific prior
+ *       written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file CAS/Client.php
+ * Main class of the phpCAS library
+ */
+
+// include internationalization stuff
+include_once(dirname(__FILE__).'/languages/languages.php');
+
+// include PGT storage classes
+include_once(dirname(__FILE__).'/PGTStorage/AbstractStorage.php');
+
+// include class for storing service cookies.
+include_once(dirname(__FILE__).'/CookieJar.php');
+
+// include class for fetching web requests.
+include_once(dirname(__FILE__).'/Request/CurlRequest.php');
+
+// include classes for proxying access to services
+include_once(dirname(__FILE__).'/ProxiedService/Http/Get.php');
+include_once(dirname(__FILE__).'/ProxiedService/Http/Post.php');
+include_once(dirname(__FILE__).'/ProxiedService/Imap.php');
+
+// include Exception classes
+include_once(dirname(__FILE__).'/ProxiedService/Exception.php');
+include_once(dirname(__FILE__).'/ProxyTicketException.php');
+include_once(dirname(__FILE__).'/InvalidArgumentException.php');
+
+
+/**
+ * @class CAS_Client
+ * The CAS_Client class is a client interface that provides CAS authentication
+ * to PHP applications.
+ *
+ * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
+ */
+
+class CAS_Client
+{
+
+	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+	// XX                                                                    XX
+	// XX                          CONFIGURATION                             XX
+	// XX                                                                    XX
+	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+	// ########################################################################
+	//  HTML OUTPUT
+	// ########################################################################
+	/**
+	* @addtogroup internalOutput
+	* @{
+	*/
+
+	/**
+	 * This method filters a string by replacing special tokens by appropriate values
+	 * and prints it. The corresponding tokens are taken into account:
+	 * - __CAS_VERSION__
+	 * - __PHPCAS_VERSION__
+	 * - __SERVER_BASE_URL__
+	 *
+	 * Used by CAS_Client::PrintHTMLHeader() and CAS_Client::printHTMLFooter().
+	 *
+	 * @param $str the string to filter and output
+	 */
+	private function HTMLFilterOutput($str)
+	{
+		$str = str_replace('__CAS_VERSION__',$this->getServerVersion(),$str);
+		$str = str_replace('__PHPCAS_VERSION__',phpCAS::getVersion(),$str);
+		$str = str_replace('__SERVER_BASE_URL__',$this->getServerBaseURL(),$str);
+		echo $str;
+	}
+
+	/**
+	 * A string used to print the header of HTML pages. Written by CAS_Client::setHTMLHeader(),
+	 * read by CAS_Client::printHTMLHeader().
+	 *
+	 * @hideinitializer
+	 * @see CAS_Client::setHTMLHeader, CAS_Client::printHTMLHeader()
+	 */
+	private $_output_header = '';
+
+	/**
+	 * This method prints the header of the HTML output (after filtering). If
+	 * CAS_Client::setHTMLHeader() was not used, a default header is output.
+	 *
+	 * @param $title the title of the page
+	 *
+	 * @see HTMLFilterOutput()
+	 */
+	private function printHTMLHeader($title)
+	{
+		$this->HTMLFilterOutput(str_replace('__TITLE__',
+		$title,
+		(empty($this->_output_header)
+		? '<html><head><title>__TITLE__</title></head><body><h1>__TITLE__</h1>'
+		: $this->_output_header)
+		)
+		);
+	}
+
+	/**
+	 * A string used to print the footer of HTML pages. Written by CAS_Client::setHTMLFooter(),
+	 * read by printHTMLFooter().
+	 *
+	 * @hideinitializer
+	 * @see CAS_Client::setHTMLFooter, CAS_Client::printHTMLFooter()
+	 */
+	private $_output_footer = '';
+
+	/**
+	 * This method prints the footer of the HTML output (after filtering). If
+	 * CAS_Client::setHTMLFooter() was not used, a default footer is output.
+	 *
+	 * @see HTMLFilterOutput()
+	 */
+	private function printHTMLFooter()
+	{
+		$this->HTMLFilterOutput(empty($this->_output_footer)
+		?('<hr><address>phpCAS __PHPCAS_VERSION__ '.$this->getString(CAS_STR_USING_SERVER).' <a href="__SERVER_BASE_URL__">__SERVER_BASE_URL__</a> (CAS __CAS_VERSION__)</a></address></body></html>')
+		:$this->_output_footer);
+	}
+
+	/**
+	 * This method set the HTML header used for all outputs.
+	 *
+	 * @param $header the HTML header.
+	 */
+	public function setHTMLHeader($header)
+	{
+		$this->_output_header = $header;
+	}
+
+	/**
+	 * This method set the HTML footer used for all outputs.
+	 *
+	 * @param $footer the HTML footer.
+	 */
+	public function setHTMLFooter($footer)
+	{
+		$this->_output_footer = $footer;
+	}
+	
+	
+	/** @} */
+
+
+	// ########################################################################
+	//  INTERNATIONALIZATION
+	// ########################################################################
+	/**
+	* @addtogroup internalLang
+	* @{
+	*/
+	/**
+	 * A string corresponding to the language used by phpCAS. Written by
+	 * CAS_Client::setLang(), read by CAS_Client::getLang().
+
+	 * @note debugging information is always in english (debug purposes only).
+	 *
+	 * @hideinitializer
+	 * @sa CAS_Client::_strings, CAS_Client::getString()
+	 */
+	private $_lang = '';
+
+	/**
+	 * This method returns the language used by phpCAS.
+	 *
+	 * @return a string representing the language
+	 */
+	private function getLang()
+	{
+		if ( empty($this->_lang) )
+		$this->setLang(PHPCAS_LANG_DEFAULT);
+		return $this->_lang;
+	}
+
+	/**
+	 * array containing the strings used by phpCAS. Written by CAS_Client::setLang(), read by
+	 * CAS_Client::getString() and used by CAS_Client::setLang().
+	 *
+	 * @note This array is filled by instructions in CAS/languages/<$this->_lang>.php
+	 *
+	 * @see CAS_Client::_lang, CAS_Client::getString(), CAS_Client::setLang(), CAS_Client::getLang()
+	 */
+	private $_strings;
+
+	/**
+	 * This method returns a string depending on the language.
+	 *
+	 * @param $str the index of the string in $_string.
+	 *
+	 * @return the string corresponding to $index in $string.
+	 *
+	 */
+	private function getString($str)
+	{
+		// call CASclient::getLang() to be sure the language is initialized
+		$this->getLang();
+
+		if ( !isset($this->_strings[$str]) ) {
+			trigger_error('string `'.$str.'\' not defined for language `'.$this->getLang().'\'',E_USER_ERROR);
+		}
+		return $this->_strings[$str];
+	}
+
+	/**
+	 * This method is used to set the language used by phpCAS.
+	 * @note Can be called only once.
+	 *
+	 * @param $lang a string representing the language.
+	 *
+	 * @sa CAS_LANG_FRENCH, CAS_LANG_ENGLISH
+	 */
+	public function setLang($lang)
+	{
+		// include the corresponding language file
+		include(dirname(__FILE__).'/languages/'.$lang.'.php');
+
+		if ( !is_array($this->_strings) ) {
+			trigger_error('language `'.$lang.'\' is not implemented',E_USER_ERROR);
+		}
+		$this->_lang = $lang;
+	}
+
+	/** @} */
+	// ########################################################################
+	//  CAS SERVER CONFIG
+	// ########################################################################
+	/**
+	* @addtogroup internalConfig
+	* @{
+	*/
+
+	/**
+	 * a record to store information about the CAS server.
+	 * - $_server["version"]: the version of the CAS server
+	 * - $_server["hostname"]: the hostname of the CAS server
+	 * - $_server["port"]: the port the CAS server is running on
+	 * - $_server["uri"]: the base URI the CAS server is responding on
+	 * - $_server["base_url"]: the base URL of the CAS server
+	 * - $_server["login_url"]: the login URL of the CAS server
+	 * - $_server["service_validate_url"]: the service validating URL of the CAS server
+	 * - $_server["proxy_url"]: the proxy URL of the CAS server
+	 * - $_server["proxy_validate_url"]: the proxy validating URL of the CAS server
+	 * - $_server["logout_url"]: the logout URL of the CAS server
+	 *
+	 * $_server["version"], $_server["hostname"], $_server["port"] and $_server["uri"]
+	 * are written by CAS_Client::CAS_Client(), read by CAS_Client::getServerVersion(),
+	 * CAS_Client::getServerHostname(), CAS_Client::getServerPort() and CAS_Client::getServerURI().
+	 *
+	 * The other fields are written and read by CAS_Client::getServerBaseURL(),
+	 * CAS_Client::getServerLoginURL(), CAS_Client::getServerServiceValidateURL(),
+	 * CAS_Client::getServerProxyValidateURL() and CAS_Client::getServerLogoutURL().
+	 *
+	 * @hideinitializer
+	 */
+	private $_server = array(
+		'version' => -1,
+		'hostname' => 'none',
+		'port' => -1,
+		'uri' => 'none');
+
+	/**
+	 * This method is used to retrieve the version of the CAS server.
+	 * @return the version of the CAS server.
+	 */
+	private function getServerVersion()
+	{
+		return $this->_server['version'];
+	}
+
+	/**
+	 * This method is used to retrieve the hostname of the CAS server.
+	 * @return the hostname of the CAS server.
+	 */
+	private function getServerHostname()
+	{ return $this->_server['hostname']; }
+
+	/**
+	 * This method is used to retrieve the port of the CAS server.
+	 * @return the port of the CAS server.
+	 */
+	private function getServerPort()
+	{ return $this->_server['port']; }
+
+	/**
+	 * This method is used to retrieve the URI of the CAS server.
+	 * @return a URI.
+	 */
+	private function getServerURI()
+	{ return $this->_server['uri']; }
+
+	/**
+	 * This method is used to retrieve the base URL of the CAS server.
+	 * @return a URL.
+	 */
+	private function getServerBaseURL()
+	{
+		// the URL is build only when needed
+		if ( empty($this->_server['base_url']) ) {
+			$this->_server['base_url'] = 'https://' . $this->getServerHostname();
+			if ($this->getServerPort()!=443) {
+				$this->_server['base_url'] .= ':'
+				.$this->getServerPort();
+			}
+			$this->_server['base_url'] .= $this->getServerURI();
+		}
+		return $this->_server['base_url'];
+	}
+
+	/**
+	 * This method is used to retrieve the login URL of the CAS server.
+	 * @param $gateway true to check authentication, false to force it
+	 * @param $renew true to force the authentication with the CAS server
+	 * NOTE : It is recommended that CAS implementations ignore the
+	 "gateway" parameter if "renew" is set
+	 * @return a URL.
+	 */
+	public function getServerLoginURL($gateway=false,$renew=false) {
+		phpCAS::traceBegin();
+		// the URL is build only when needed
+		if ( empty($this->_server['login_url']) ) {
+			$this->_server['login_url'] = $this->getServerBaseURL();
+			$this->_server['login_url'] .= 'login?service=';
+			$this->_server['login_url'] .= urlencode($this->getURL());
+		}
+		$url = $this->_server['login_url'];
+		if($renew) {
+			// It is recommended that when the "renew" parameter is set, its value be "true"
+			$url = $this->buildQueryUrl($url, 'renew=true');
+		} elseif ($gateway) {
+			// It is recommended that when the "gateway" parameter is set, its value be "true"
+			$url = $this->buildQueryUrl($url, 'gateway=true');
+		}
+		phpCAS::traceEnd($url);
+		return $url;
+	}
+
+	/**
+	 * This method sets the login URL of the CAS server.
+	 * @param $url the login URL
+	 * @since 0.4.21 by Wyman Chan
+	 */
+	public function setServerLoginURL($url)
+	{
+		return $this->_server['login_url'] = $url;
+	}
+
+
+	/**
+	 * This method sets the serviceValidate URL of the CAS server.
+	 * @param $url the serviceValidate URL
+	 * @since 1.1.0 by Joachim Fritschi
+	 */
+	public function setServerServiceValidateURL($url)
+	{
+		return $this->_server['service_validate_url'] = $url;
+	}
+
+
+	/**
+	 * This method sets the proxyValidate URL of the CAS server.
+	 * @param $url the proxyValidate URL
+	 * @since 1.1.0 by Joachim Fritschi
+	 */
+	public function setServerProxyValidateURL($url)
+	{
+		return $this->_server['proxy_validate_url'] = $url;
+	}
+
+
+	/**
+	 * This method sets the samlValidate URL of the CAS server.
+	 * @param $url the samlValidate URL
+	 * @since 1.1.0 by Joachim Fritschi
+	 */
+	public function setServerSamlValidateURL($url)
+	{
+		return $this->_server['saml_validate_url'] = $url;
+	}
+
+
+	/**
+	 * This method is used to retrieve the service validating URL of the CAS server.
+	 * @return a URL.
+	 */
+	public function getServerServiceValidateURL()
+	{
+		phpCAS::traceBegin();
+		// the URL is build only when needed
+		if ( empty($this->_server['service_validate_url']) ) {
+			switch ($this->getServerVersion()) {
+				case CAS_VERSION_1_0:
+					$this->_server['service_validate_url'] = $this->getServerBaseURL().'validate';
+					break;
+				case CAS_VERSION_2_0:
+					$this->_server['service_validate_url'] = $this->getServerBaseURL().'serviceValidate';
+					break;
+			}
+		}
+		$url = $this->buildQueryUrl($this->_server['service_validate_url'], 'service='.urlencode($this->getURL()));
+		phpCAS::traceEnd($url);
+		return $url;
+	}
+	/**
+	 * This method is used to retrieve the SAML validating URL of the CAS server.
+	 * @return a URL.
+	 */
+	public function getServerSamlValidateURL()
+	{
+		phpCAS::traceBegin();
+		// the URL is build only when needed
+		if ( empty($this->_server['saml_validate_url']) ) {
+			switch ($this->getServerVersion()) {
+				case SAML_VERSION_1_1:
+					$this->_server['saml_validate_url'] = $this->getServerBaseURL().'samlValidate';
+					break;
+			}
+		}
+		
+		$url = $this->buildQueryUrl($this->_server['saml_validate_url'], 'TARGET='.urlencode($this->getURL()));
+		phpCAS::traceEnd($url);
+		return $url;
+	}
+	
+	/**
+	 * This method is used to retrieve the proxy validating URL of the CAS server.
+	 * @return a URL.
+	 */
+	public function getServerProxyValidateURL()
+	{
+		phpCAS::traceBegin();
+		// the URL is build only when needed
+		if ( empty($this->_server['proxy_validate_url']) ) {
+			switch ($this->getServerVersion()) {
+				case CAS_VERSION_1_0:
+					$this->_server['proxy_validate_url'] = '';
+					break;
+				case CAS_VERSION_2_0:
+					$this->_server['proxy_validate_url'] = $this->getServerBaseURL().'proxyValidate';
+					break;
+			}
+		}
+		$url = $this->buildQueryUrl($this->_server['proxy_validate_url'], 'service='.urlencode($this->getURL()));
+		phpCAS::traceEnd($url);
+		return $url;
+	}
+	
+
+	/**
+	 * This method is used to retrieve the proxy URL of the CAS server.
+	 * @return a URL.
+	 */
+	public function getServerProxyURL()
+	{
+		// the URL is build only when needed
+		if ( empty($this->_server['proxy_url']) ) {
+			switch ($this->getServerVersion()) {
+				case CAS_VERSION_1_0:
+					$this->_server['proxy_url'] = '';
+					break;
+				case CAS_VERSION_2_0:
+					$this->_server['proxy_url'] = $this->getServerBaseURL().'proxy';
+					break;
+			}
+		}
+		return $this->_server['proxy_url'];
+	}
+
+	/**
+	 * This method is used to retrieve the logout URL of the CAS server.
+	 * @return a URL.
+	 */
+	public function getServerLogoutURL()
+	{
+		// the URL is build only when needed
+		if ( empty($this->_server['logout_url']) ) {
+			$this->_server['logout_url'] = $this->getServerBaseURL().'logout';
+		}
+		return $this->_server['logout_url'];
+	}
+
+	/**
+	 * This method sets the logout URL of the CAS server.
+	 * @param $url the logout URL
+	 * @since 0.4.21 by Wyman Chan
+	 */
+	public function setServerLogoutURL($url)
+	{
+		return $this->_server['logout_url'] = $url;
+	}
+
+	/**
+	 * An array to store extra curl options.
+	 */
+	private $_curl_options = array();
+
+	/**
+	 * This method is used to set additional user curl options.
+	 */
+	public function setExtraCurlOption($key, $value)
+	{
+		$this->_curl_options[$key] = $value;
+	}
+	
+	/** @} */
+
+	// ########################################################################
+	//  Change the internal behaviour of phpcas
+	// ########################################################################
+	
+	/**
+	* @addtogroup internalBehave
+	* @{
+	*/
+	
+	/**
+	 * The class to instantiate for making web requests in readUrl().
+	 * The class specified must implement the CAS_RequestInterface.
+	 * By default CAS_CurlRequest is used, but this may be overridden to
+	 * supply alternate request mechanisms for testing.
+	 */
+	private $_requestImplementation = 'CAS_CurlRequest';
+
+	/**
+	 * Override the default implementation used to make web requests in readUrl().
+	 * This class must implement the CAS_RequestInterface.
+	 *
+	 * @param string $className
+	 * @return void
+	 */
+	public function setRequestImplementation ($className) {
+		$obj = new $className;
+		if (!($obj instanceof CAS_RequestInterface))
+		throw new CAS_InvalidArgumentException('$className must implement the CAS_RequestInterface');
+
+		$this->_requestImplementation = $className;
+	}
+		
+	/**
+	 * @var boolean $_exitOnAuthError; If true, phpCAS will exit on an authentication error.
+	 */
+	private $_exitOnAuthError = true;
+
+	/**
+	 * Configure the client to not call exit() when an authentication failure occurs.
+	 *
+	 * Needed for testing proper failure handling.
+	 *
+	 * @return void
+	 */
+	public function setNoExitOnAuthError () {
+		$this->_exitOnAuthError = false;
+	}
+	
+	/**
+	 * @var boolean $_clearTicketsFromUrl; If true, phpCAS will clear session tickets from the URL.
+	 * After a successful authentication.
+	 */
+	private $_clearTicketsFromUrl = true;
+	
+	/**
+	 * Configure the client to not send redirect headers and call exit() on authentication
+	 * success. The normal redirect is used to remove the service ticket from the
+	 * client's URL, but for running unit tests we need to continue without exiting.
+	 *
+	 * Needed for testing authentication
+	 *
+	 * @return void
+	 */
+	public function setNoClearTicketsFromUrl () {
+		$this->_clearTicketsFromUrl = false;
+	}
+	
+	/**
+	 * @var callback $_postAuthenticateCallbackFunction;  
+	 */
+	private $_postAuthenticateCallbackFunction = null;
+	
+	/**
+	 * @var array $_postAuthenticateCallbackArgs;  
+	 */
+	private $_postAuthenticateCallbackArgs = array();
+	
+	/**
+	 * Set a callback function to be run when a user authenticates.
+	 *
+	 * The callback function will be passed a $logoutTicket as its first parameter,
+	 * followed by any $additionalArgs you pass. The $logoutTicket parameter is an
+	 * opaque string that can be used to map a session-id to the logout request in order
+	 * to support single-signout in applications that manage their own sessions 
+	 * (rather than letting phpCAS start the session).
+	 *
+	 * phpCAS::forceAuthentication() will always exit and forward client unless
+	 * they are already authenticated. To perform an action at the moment the user
+	 * logs in (such as registering an account, performing logging, etc), register
+	 * a callback function here.
+	 * 
+	 * @param callback $function
+	 * @param optional array $additionalArgs
+	 * @return void
+	 */
+	public function setPostAuthenticateCallback ($function, array $additionalArgs = array()) {
+		$this->_postAuthenticateCallbackFunction = $function;
+		$this->_postAuthenticateCallbackArgs = $additionalArgs;
+	}
+	
+	/**
+	 * @var callback $_signoutCallbackFunction;  
+	 */
+	private $_signoutCallbackFunction = null;
+	
+	/**
+	 * @var array $_signoutCallbackArgs;  
+	 */
+	private $_signoutCallbackArgs = array();
+	
+	/**
+	 * Set a callback function to be run when a single-signout request is received.
+	 *
+	 * The callback function will be passed a $logoutTicket as its first parameter,
+	 * followed by any $additionalArgs you pass. The $logoutTicket parameter is an
+	 * opaque string that can be used to map a session-id to the logout request in order
+	 * to support single-signout in applications that manage their own sessions 
+	 * (rather than letting phpCAS start and destroy the session).
+	 * 
+	 * @param callback $function
+	 * @param optional array $additionalArgs
+	 * @return void
+	 */
+	public function setSingleSignoutCallback ($function, array $additionalArgs = array()) {
+		$this->_signoutCallbackFunction = $function;
+		$this->_signoutCallbackArgs = $additionalArgs;
+	}
+	
+	/** @} */
+
+	// ########################################################################
+	//  CONSTRUCTOR
+	// ########################################################################
+	/**
+	* @addtogroup internalConfig
+	* @{
+	*/
+	
+	/**
+	* CAS_Client constructor.
+	*
+	* @param $server_version the version of the CAS server
+	* @param $proxy TRUE if the CAS client is a CAS proxy, FALSE otherwise
+	* @param $server_hostname the hostname of the CAS server
+	* @param $server_port the port the CAS server is running on
+	* @param $server_uri the URI the CAS server is responding on
+	* @param $start_session Have phpCAS start PHP sessions (default true)
+	*
+	* @return a newly created CAS_Client object
+	*/
+	public function __construct(
+	$server_version,
+	$proxy,
+	$server_hostname,
+	$server_port,
+	$server_uri,
+	$start_session = true) {
+
+		phpCAS::traceBegin();
+
+		$this->_start_session = $start_session;
+
+		if ($this->_start_session && session_id() !== "")
+		{
+			phpCAS :: error("Another session was started before phpcas. Either disable the session" .
+				" handling for phpcas in the client() call or modify your application to leave" .
+				" session handling to phpcas");			
+		}
+		// skip Session Handling for logout requests and if don't want it'
+		if ($start_session && !$this->isLogoutRequest())
+		{
+			phpCAS :: trace("Starting a new session");
+			session_start();
+		}
+
+
+		// are we in proxy mode ?
+		$this->_proxy = $proxy;
+
+		// Make cookie handling available.
+		if ($this->isProxy()) {
+			if (!isset($_SESSION['phpCAS']))
+			$_SESSION['phpCAS'] = array();
+			if (!isset($_SESSION['phpCAS']['service_cookies']))
+			$_SESSION['phpCAS']['service_cookies'] = array();
+			$this->_serviceCookieJar = new CAS_CookieJar($_SESSION['phpCAS']['service_cookies']);
+		}
+
+		//check version
+		switch ($server_version) {
+			case CAS_VERSION_1_0:
+				if ( $this->isProxy() )
+				phpCAS::error('CAS proxies are not supported in CAS '
+				.$server_version);
+				break;
+			case CAS_VERSION_2_0:
+				break;
+			case SAML_VERSION_1_1:
+				break;
+			default:
+				phpCAS::error('this version of CAS (`'
+				.$server_version
+				.'\') is not supported by phpCAS '
+				.phpCAS::getVersion());
+		}
+		$this->_server['version'] = $server_version;
+
+		// check hostname
+		if ( empty($server_hostname)
+		|| !preg_match('/[\.\d\-abcdefghijklmnopqrstuvwxyz]*/',$server_hostname) ) {
+			phpCAS::error('bad CAS server hostname (`'.$server_hostname.'\')');
+		}
+		$this->_server['hostname'] = $server_hostname;
+
+		// check port
+		if ( $server_port == 0
+		|| !is_int($server_port) ) {
+			phpCAS::error('bad CAS server port (`'.$server_hostname.'\')');
+		}
+		$this->_server['port'] = $server_port;
+
+		// check URI
+		if ( !preg_match('/[\.\d\-_abcdefghijklmnopqrstuvwxyz\/]*/',$server_uri) ) {
+			phpCAS::error('bad CAS server URI (`'.$server_uri.'\')');
+		}
+		// add leading and trailing `/' and remove doubles
+		$server_uri = preg_replace('/\/\//','/','/'.$server_uri.'/');
+		$this->_server['uri'] = $server_uri;
+
+		// set to callback mode if PgtIou and PgtId CGI GET parameters are provided
+		if ( $this->isProxy() ) {
+			$this->setCallbackMode(!empty($_GET['pgtIou'])&&!empty($_GET['pgtId']));
+		}
+
+		if ( $this->isCallbackMode() ) {
+			//callback mode: check that phpCAS is secured
+			if ( !$this->isHttps() ) {
+				phpCAS::error('CAS proxies must be secured to use phpCAS; PGT\'s will not be received from the CAS server');
+			}
+		} else {
+			//normal mode: get ticket and remove it from CGI parameters for developpers
+			$ticket = (isset($_GET['ticket']) ? $_GET['ticket'] : null);
+			switch ($this->getServerVersion()) {
+				case CAS_VERSION_1_0: // check for a Service Ticket
+					if( preg_match('/^ST-/',$ticket) ) {
+						phpCAS::trace('ST \''.$ticket.'\' found');
+						//ST present
+						$this->setST($ticket);
+						//ticket has been taken into account, unset it to hide it to applications
+						unset($_GET['ticket']);
+					} else if ( !empty($ticket) ) {
+						//ill-formed ticket, halt
+						phpCAS::error('ill-formed ticket found in the URL (ticket=`'.htmlentities($ticket).'\')');
+					}
+					break;
+				case CAS_VERSION_2_0: // check for a Service or Proxy Ticket
+					if( preg_match('/^[SP]T-/',$ticket) ) {
+						phpCAS::trace('ST or PT \''.$ticket.'\' found');
+						$this->setPT($ticket);
+						unset($_GET['ticket']);
+					} else if ( !empty($ticket) ) {
+						//ill-formed ticket, halt
+						phpCAS::error('ill-formed ticket found in the URL (ticket=`'.htmlentities($ticket).'\')');
+					}
+					break;
+				case SAML_VERSION_1_1: // SAML just does Service Tickets
+					if( preg_match('/^[SP]T-/',$ticket) ) {
+						phpCAS::trace('SA \''.$ticket.'\' found');
+						$this->setSA($ticket);
+						unset($_GET['ticket']);
+					} else if ( !empty($ticket) ) {
+						//ill-formed ticket, halt
+						phpCAS::error('ill-formed ticket found in the URL (ticket=`'.htmlentities($ticket).'\')');
+					}
+					break;
+			}
+		}
+		phpCAS::traceEnd();
+	}
+
+	/** @} */
+
+	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+	// XX                                                                    XX
+	// XX                           Session Handling                         XX
+	// XX                                                                    XX
+	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+	/**
+	* @addtogroup internalConfig
+	* @{
+	*/
+	
+	
+	/**
+	 * A variable to whether phpcas will use its own session handling. Default = true
+	 * @hideinitializer
+	 */
+	private $_start_session = true;
+
+	private function setStartSession($session)
+	{
+		$this->_start_session = session;
+	}
+
+	public function getStartSession($session)
+	{
+		$this->_start_session = session;
+	}
+
+	/** @} */
+	
+	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+	// XX                                                                    XX
+	// XX                           AUTHENTICATION                           XX
+	// XX                                                                    XX
+	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+	/**
+	 * @addtogroup internalAuthentication
+	 * @{
+	 */
+
+	/**
+	 * The Authenticated user. Written by CAS_Client::setUser(), read by CAS_Client::getUser().
+	 * @attention client applications should use phpCAS::getUser().
+	 *
+	 * @hideinitializer
+	 */
+	private $_user = '';
+
+	/**
+	 * This method sets the CAS user's login name.
+	 *
+	 * @param $user the login name of the authenticated user.
+	 *
+	 */
+	private function setUser($user)
+	{
+		$this->_user = $user;
+	}
+
+	/**
+	 * This method returns the CAS user's login name.
+	 * @warning should be called only after CAS_Client::forceAuthentication() or
+	 * CAS_Client::isAuthenticated(), otherwise halt with an error.
+	 *
+	 * @return the login name of the authenticated user
+	 */
+	public function getUser()
+	{
+		if ( empty($this->_user) ) {
+			phpCAS::error('this method should be used only after '.__CLASS__.'::forceAuthentication() or '.__CLASS__.'::isAuthenticated()');
+		}
+		return $this->_user;
+	}
+
+
+
+	/***********************************************************************************************************************
+	 * Atrributes section
+	 *
+	 * @author Matthias Crauwels <matthias.crauwels@ugent.be>, Ghent University, Belgium
+	 *
+	 ***********************************************************************************************************************/
+	/**
+	 * The Authenticated users attributes. Written by CAS_Client::setAttributes(), read by CAS_Client::getAttributes().
+	 * @attention client applications should use phpCAS::getAttributes().
+	 *
+	 * @hideinitializer
+	 */
+	private $_attributes = array();
+
+	public function setAttributes($attributes)
+	{ $this->_attributes = $attributes; }
+
+	public function getAttributes() {
+		if ( empty($this->_user) ) { // if no user is set, there shouldn't be any attributes also...
+			phpCAS::error('this method should be used only after '.__CLASS__.'::forceAuthentication() or '.__CLASS__.'::isAuthenticated()');
+		}
+		return $this->_attributes;
+	}
+
+	public function hasAttributes()
+	{ return !empty($this->_attributes); }
+
+	public function hasAttribute($key)
+	{ return (is_array($this->_attributes) && array_key_exists($key, $this->_attributes)); }
+
+	public function getAttribute($key)	{
+		if($this->hasAttribute($key)) {
+			return $this->_attributes[$key];
+		}
+	}
+
+	/**
+	 * This method is called to renew the authentication of the user
+	 * If the user is authenticated, renew the connection
+	 * If not, redirect to CAS
+	 */
+	public function renewAuthentication(){
+		phpCAS::traceBegin();
+		// Either way, the user is authenticated by CAS
+		if( isset( $_SESSION['phpCAS']['auth_checked'] ) )
+		unset($_SESSION['phpCAS']['auth_checked']);
+		if ( $this->isAuthenticated() ) {
+			phpCAS::trace('user already authenticated; renew');
+			$this->redirectToCas(false,true);
+		} else {
+			$this->redirectToCas();
+		}
+		phpCAS::traceEnd();
+	}
+
+	/**
+	 * This method is called to be sure that the user is authenticated. When not
+	 * authenticated, halt by redirecting to the CAS server; otherwise return TRUE.
+	 * @return TRUE when the user is authenticated; otherwise halt.
+	 */
+	public function forceAuthentication()
+	{
+		phpCAS::traceBegin();
+
+		if ( $this->isAuthenticated() ) {
+			// the user is authenticated, nothing to be done.
+			phpCAS::trace('no need to authenticate');
+			$res = TRUE;
+		} else {
+			// the user is not authenticated, redirect to the CAS server
+			if (isset($_SESSION['phpCAS']['auth_checked'])) {
+				unset($_SESSION['phpCAS']['auth_checked']);
+			}
+			$this->redirectToCas(FALSE/* no gateway */);
+			// never reached
+			$res = FALSE;
+		}
+		phpCAS::traceEnd($res);
+		return $res;
+	}
+
+	/**
+	 * An integer that gives the number of times authentication will be cached before rechecked.
+	 *
+	 * @hideinitializer
+	 */
+	private $_cache_times_for_auth_recheck = 0;
+
+	/**
+	 * Set the number of times authentication will be cached before rechecked.
+	 *
+	 * @param $n an integer.
+	 */
+	public function setCacheTimesForAuthRecheck($n)
+	{
+		$this->_cache_times_for_auth_recheck = $n;
+	}
+
+	/**
+	 * This method is called to check whether the user is authenticated or not.
+	 * @return TRUE when the user is authenticated, FALSE when a previous gateway login failed or
+	 * the function will not return if the user is redirected to the cas server for a gateway login attempt
+	 */
+	public function checkAuthentication()
+	{
+		phpCAS::traceBegin();
+
+		if ( $this->isAuthenticated() ) {
+			phpCAS::trace('user is authenticated');
+			$res = TRUE;
+		} else if (isset($_SESSION['phpCAS']['auth_checked'])) {
+			// the previous request has redirected the client to the CAS server with gateway=true
+			unset($_SESSION['phpCAS']['auth_checked']);
+			$res = FALSE;
+		} else {
+			// avoid a check against CAS on every request
+			if (! isset($_SESSION['phpCAS']['unauth_count']) )
+			$_SESSION['phpCAS']['unauth_count'] = -2; // uninitialized
+				
+			if (($_SESSION['phpCAS']['unauth_count'] != -2 && $this->_cache_times_for_auth_recheck == -1)
+			|| ($_SESSION['phpCAS']['unauth_count'] >= 0 && $_SESSION['phpCAS']['unauth_count'] < $this->_cache_times_for_auth_recheck))
+			{
+				$res = FALSE;
+
+				if ($this->_cache_times_for_auth_recheck != -1)
+				{
+					$_SESSION['phpCAS']['unauth_count']++;
+					phpCAS::trace('user is not authenticated (cached for '.$_SESSION['phpCAS']['unauth_count'].' times of '.$this->_cache_times_for_auth_recheck.')');
+				}
+				else
+				{
+					phpCAS::trace('user is not authenticated (cached for until login pressed)');
+				}
+			}
+			else
+			{
+				$_SESSION['phpCAS']['unauth_count'] = 0;
+				$_SESSION['phpCAS']['auth_checked'] = true;
+				phpCAS::trace('user is not authenticated (cache reset)');
+				$this->redirectToCas(TRUE/* gateway */);
+				// never reached
+				$res = FALSE;
+			}
+		}
+		phpCAS::traceEnd($res);
+		return $res;
+	}
+
+	/**
+	 * This method is called to check if the user is authenticated (previously or by
+	 * tickets given in the URL).
+	 *
+	 * @return TRUE when the user is authenticated. Also may redirect to the same URL without the ticket.
+	 */
+	public function isAuthenticated()
+	{
+		phpCAS::traceBegin();
+		$res = FALSE;
+		$validate_url = '';
+
+		if ( $this->wasPreviouslyAuthenticated() ) {
+			if($this->hasST() || $this->hasPT() || $this->hasSA()){
+				// User has a additional ticket but was already authenticated
+				phpCAS::trace('ticket was present and will be discarded, use renewAuthenticate()');
+				header('Location: '.$this->getURL());
+				phpCAS::trace( "Prepare redirect to remove ticket: ".$this->getURL() );
+				phpCAS::traceExit();
+				exit();
+			}else{
+				// the user has already (previously during the session) been
+				// authenticated, nothing to be done.
+				phpCAS::trace('user was already authenticated, no need to look for tickets');
+				$res = TRUE;
+			}
+		}
+		else {
+			if ( $this->hasST() ) {
+				// if a Service Ticket was given, validate it
+				phpCAS::trace('ST `'.$this->getST().'\' is present');
+				$this->validateST($validate_url,$text_response,$tree_response); // if it fails, it halts
+				phpCAS::trace('ST `'.$this->getST().'\' was validated');
+				if ( $this->isProxy() ) {
+					$this->validatePGT($validate_url,$text_response,$tree_response); // idem
+					phpCAS::trace('PGT `'.$this->getPGT().'\' was validated');
+					$_SESSION['phpCAS']['pgt'] = $this->getPGT();
+				}
+				$_SESSION['phpCAS']['user'] = $this->getUser();
+				if($this->hasAttributes()){
+					$_SESSION['phpCAS']['attributes'] = $this->getAttributes();
+				}
+				$res = TRUE;
+				$logoutTicket = $this->getST();
+			}
+			elseif ( $this->hasPT() ) {
+				// if a Proxy Ticket was given, validate it
+				phpCAS::trace('PT `'.$this->getPT().'\' is present');
+				$this->validatePT($validate_url,$text_response,$tree_response); // note: if it fails, it halts
+				phpCAS::trace('PT `'.$this->getPT().'\' was validated');
+				if ( $this->isProxy() ) {
+					$this->validatePGT($validate_url,$text_response,$tree_response); // idem
+					phpCAS::trace('PGT `'.$this->getPGT().'\' was validated');
+					$_SESSION['phpCAS']['pgt'] = $this->getPGT();
+				}
+				$_SESSION['phpCAS']['user'] = $this->getUser();
+				if($this->hasAttributes()){
+					$_SESSION['phpCAS']['attributes'] = $this->getAttributes();
+				}
+				$res = TRUE;
+				$logoutTicket = $this->getPT();
+			}
+			elseif ( $this->hasSA() ) {
+				// if we have a SAML ticket, validate it.
+				phpCAS::trace('SA `'.$this->getSA().'\' is present');
+				$this->validateSA($validate_url,$text_response,$tree_response); // if it fails, it halts
+				phpCAS::trace('SA `'.$this->getSA().'\' was validated');
+				$_SESSION['phpCAS']['user'] = $this->getUser();
+				$_SESSION['phpCAS']['attributes'] = $this->getAttributes();
+				$res = TRUE;
+				$logoutTicket = $this->getSA();
+			}
+			else {
+				// no ticket given, not authenticated
+				phpCAS::trace('no ticket found');
+			}
+			if ($res) {
+				// Mark the auth-check as complete to allow post-authentication
+				// callbacks to make use of phpCAS::getUser() and similar methods
+				$dbg = debug_backtrace();
+				global $PHPCAS_AUTH_CHECK_CALL;
+				$PHPCAS_AUTH_CHECK_CALL = array (
+					'done' => TRUE,
+					'file' => $dbg[0]['file'],
+					'line' => $dbg[0]['line'],
+					'method' => __CLASS__ . '::' . __FUNCTION__,
+					'result' => $res
+				);
+				
+				// call the post-authenticate callback if registered.
+				if ($this->_postAuthenticateCallbackFunction) {
+					$args = $this->_postAuthenticateCallbackArgs;
+					array_unshift($args, $logoutTicket);
+					call_user_func_array($this->_postAuthenticateCallbackFunction, $args);
+				}
+				
+				// if called with a ticket parameter, we need to redirect to the app without the ticket so that CAS-ification is transparent to the browser (for later POSTS)
+				// most of the checks and errors should have been made now, so we're safe for redirect without masking error messages.
+				// remove the ticket as a security precaution to prevent a ticket in the HTTP_REFERRER
+				if ($this->_clearTicketsFromUrl) {
+					header('Location: '.$this->getURL());
+					phpCAS::trace( "Prepare redirect to : ".$this->getURL() );
+					phpCAS::traceExit();
+					exit();
+				}
+			}
+		}
+
+		phpCAS::traceEnd($res);
+		return $res;
+	}
+
+	/**
+	 * This method tells if the current session is authenticated.
+	 * @return true if authenticated based soley on $_SESSION variable
+	 * @since 0.4.22 by Brendan Arnold
+	 */
+	public function isSessionAuthenticated ()
+	{
+		return !empty($_SESSION['phpCAS']['user']);
+	}
+
+	/**
+	 * This method tells if the user has already been (previously) authenticated
+	 * by looking into the session variables.
+	 *
+	 * @note This function switches to callback mode when needed.
+	 *
+	 * @return TRUE when the user has already been authenticated; FALSE otherwise.
+	 */
+	private function wasPreviouslyAuthenticated()
+	{
+		phpCAS::traceBegin();
+
+		if ( $this->isCallbackMode() ) {
+			$this->callback();
+		}
+
+		$auth = FALSE;
+
+		if ( $this->isProxy() ) {
+			// CAS proxy: username and PGT must be present
+			if ( $this->isSessionAuthenticated() && !empty($_SESSION['phpCAS']['pgt']) ) {
+				// authentication already done
+				$this->setUser($_SESSION['phpCAS']['user']);
+				if(isset($_SESSION['phpCAS']['attributes'])){
+					$this->setAttributes($_SESSION['phpCAS']['attributes']);
+				}
+				$this->setPGT($_SESSION['phpCAS']['pgt']);
+				phpCAS::trace('user = `'.$_SESSION['phpCAS']['user'].'\', PGT = `'.$_SESSION['phpCAS']['pgt'].'\'');
+				
+				// Include the list of proxies
+				if (isset($_SESSION['phpCAS']['proxies'])) {
+					$this->setProxies($_SESSION['phpCAS']['proxies']);
+					phpCAS::trace('proxies = "'.implode('", "', $_SESSION['phpCAS']['proxies']).'"'); 
+				}
+				
+				$auth = TRUE;
+			} elseif ( $this->isSessionAuthenticated() && empty($_SESSION['phpCAS']['pgt']) ) {
+				// these two variables should be empty or not empty at the same time
+				phpCAS::trace('username found (`'.$_SESSION['phpCAS']['user'].'\') but PGT is empty');
+				// unset all tickets to enforce authentication
+				unset($_SESSION['phpCAS']);
+				$this->setST('');
+				$this->setPT('');
+			} elseif ( !$this->isSessionAuthenticated() && !empty($_SESSION['phpCAS']['pgt']) ) {
+				// these two variables should be empty or not empty at the same time
+				phpCAS::trace('PGT found (`'.$_SESSION['phpCAS']['pgt'].'\') but username is empty');
+				// unset all tickets to enforce authentication
+				unset($_SESSION['phpCAS']);
+				$this->setST('');
+				$this->setPT('');
+			} else {
+				phpCAS::trace('neither user not PGT found');
+			}
+		} else {
+			// `simple' CAS client (not a proxy): username must be present
+			if ( $this->isSessionAuthenticated() ) {
+				// authentication already done
+				$this->setUser($_SESSION['phpCAS']['user']);
+				if(isset($_SESSION['phpCAS']['attributes'])){
+					$this->setAttributes($_SESSION['phpCAS']['attributes']);
+				}
+				phpCAS::trace('user = `'.$_SESSION['phpCAS']['user'].'\'');
+				
+				// Include the list of proxies
+				if (isset($_SESSION['phpCAS']['proxies'])) {
+					$this->setProxies($_SESSION['phpCAS']['proxies']);
+					phpCAS::trace('proxies = "'.implode('", "', $_SESSION['phpCAS']['proxies']).'"'); 
+				}
+				
+				$auth = TRUE;
+			} else {
+				phpCAS::trace('no user found');
+			}
+		}
+
+		phpCAS::traceEnd($auth);
+		return $auth;
+	}
+
+	/**
+	 * This method is used to redirect the client to the CAS server.
+	 * It is used by CAS_Client::forceAuthentication() and CAS_Client::checkAuthentication().
+	 * @param $gateway true to check authentication, false to force it
+	 * @param $renew true to force the authentication with the CAS server
+	 */
+	public function redirectToCas($gateway=false,$renew=false){
+		phpCAS::traceBegin();
+		$cas_url = $this->getServerLoginURL($gateway,$renew);
+		header('Location: '.$cas_url);
+		phpCAS::trace( "Redirect to : ".$cas_url );
+
+		$this->printHTMLHeader($this->getString(CAS_STR_AUTHENTICATION_WANTED));
+
+		printf('<p>'.$this->getString(CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED).'</p>',$cas_url);
+		$this->printHTMLFooter();
+
+		phpCAS::traceExit();
+		exit();
+	}
+
+
+	/**
+	 * This method is used to logout from CAS.
+	 * @params $params an array that contains the optional url and service parameters that will be passed to the CAS server
+	 */
+	public function logout($params) {
+		phpCAS::traceBegin();
+		$cas_url = $this->getServerLogoutURL();
+		$paramSeparator = '?';
+		if (isset($params['url'])) {
+			$cas_url = $cas_url . $paramSeparator . "url=" . urlencode($params['url']);
+			$paramSeparator = '&';
+		}
+		if (isset($params['service'])) {
+			$cas_url = $cas_url . $paramSeparator . "service=" . urlencode($params['service']);
+		}
+		header('Location: '.$cas_url);
+		phpCAS::trace( "Prepare redirect to : ".$cas_url );
+
+		session_unset();
+		session_destroy();
+
+		$this->printHTMLHeader($this->getString(CAS_STR_LOGOUT));
+		printf('<p>'.$this->getString(CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED).'</p>',$cas_url);
+		$this->printHTMLFooter();
+
+		phpCAS::traceExit();
+		exit();
+	}
+
+	/**
+	 * @return true if the current request is a logout request.
+	 */
+	private function isLogoutRequest() {
+		return !empty($_POST['logoutRequest']);
+	}
+
+	/**
+	 * This method handles logout requests.
+	 * @param $check_client true to check the client bofore handling the request,
+	 * false not to perform any access control. True by default.
+	 * @param $allowed_clients an array of host names allowed to send logout requests.
+	 * By default, only the CAs server (declared in the constructor) will be allowed.
+	 */
+	public function handleLogoutRequests($check_client=true, $allowed_clients=false) {
+		phpCAS::traceBegin();
+		if (!$this->isLogoutRequest()) {
+			phpCAS::trace("Not a logout request");
+			phpCAS::traceEnd();
+			return;
+		}
+		if(!$this->_start_session && is_null($this->_signoutCallbackFunction)){
+			phpCAS::trace("phpCAS can't handle logout requests if it does not manage the session.");
+		}
+		phpCAS::trace("Logout requested");
+		phpCAS::trace("SAML REQUEST: ".$_POST['logoutRequest']);
+		if ($check_client) {
+			if (!$allowed_clients) {
+				$allowed_clients = array( $this->getServerHostname() );
+			}
+			$client_ip = $_SERVER['REMOTE_ADDR'];
+			$client = gethostbyaddr($client_ip);
+			phpCAS::trace("Client: ".$client."/".$client_ip);
+			$allowed = false;
+			foreach ($allowed_clients as $allowed_client) {
+				if (($client == $allowed_client) or ($client_ip == $allowed_client)) {
+					phpCAS::trace("Allowed client '".$allowed_client."' matches, logout request is allowed");
+					$allowed = true;
+					break;
+				} else {
+					phpCAS::trace("Allowed client '".$allowed_client."' does not match");
+				}
+			}
+			if (!$allowed) {
+				phpCAS::error("Unauthorized logout request from client '".$client."'");
+				printf("Unauthorized!");
+				phpCAS::traceExit();
+				exit();
+			}
+		} else {
+			phpCAS::trace("No access control set");
+		}
+		// Extract the ticket from the SAML Request
+		preg_match("|<samlp:SessionIndex>(.*)</samlp:SessionIndex>|", $_POST['logoutRequest'], $tick, PREG_OFFSET_CAPTURE, 3);
+		$wrappedSamlSessionIndex = preg_replace('|<samlp:SessionIndex>|','',$tick[0][0]);
+		$ticket2logout = preg_replace('|</samlp:SessionIndex>|','',$wrappedSamlSessionIndex);
+		phpCAS::trace("Ticket to logout: ".$ticket2logout);
+		
+		// call the post-authenticate callback if registered.
+		if ($this->_signoutCallbackFunction) {
+			$args = $this->_signoutCallbackArgs;
+			array_unshift($args, $ticket2logout);
+			call_user_func_array($this->_signoutCallbackFunction, $args);
+		}
+		
+		// If phpCAS is managing the session, destroy it.
+		if ($this->_start_session) {
+			$session_id = preg_replace('/[^\w]/','',$ticket2logout);
+			phpCAS::trace("Session id: ".$session_id);
+	
+			// destroy a possible application session created before phpcas
+			if(session_id() !== ""){
+				session_unset();
+				session_destroy();
+			}
+			// fix session ID
+			session_id($session_id);
+			$_COOKIE[session_name()]=$session_id;
+			$_GET[session_name()]=$session_id;
+	
+			// Overwrite session
+			session_start();
+			session_unset();
+			session_destroy();
+		}
+		
+		printf("Disconnected!");
+		phpCAS::traceExit();
+		exit();
+	}
+
+	/** @} */
+
+	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+	// XX                                                                    XX
+	// XX                  BASIC CLIENT FEATURES (CAS 1.0)                   XX
+	// XX                                                                    XX
+	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+	// ########################################################################
+	//  ST
+	// ########################################################################
+	/**
+	* @addtogroup internalBasic
+	* @{
+	*/
+
+	/**
+	 * the Service Ticket provided in the URL of the request if present
+	 * (empty otherwise). Written by CAS_Client::CAS_Client(), read by
+	 * CAS_Client::getST() and CAS_Client::hasPGT().
+	 *
+	 * @hideinitializer
+	 */
+	private $_st = '';
+
+	/**
+	 * This method returns the Service Ticket provided in the URL of the request.
+	 * @return The service ticket.
+	 */
+	public  function getST()
+	{ return $this->_st; }
+
+	/**
+	 * This method stores the Service Ticket.
+	 * @param $st The Service Ticket.
+	 */
+	public function setST($st)
+	{ $this->_st = $st; }
+
+	/**
+	 * This method tells if a Service Ticket was stored.
+	 * @return TRUE if a Service Ticket has been stored.
+	 */
+	public function hasST()
+	{ return !empty($this->_st); }
+
+	/** @} */
+
+	// ########################################################################
+	//  ST VALIDATION
+	// ########################################################################
+	/**
+	* @addtogroup internalBasic
+	* @{
+	*/
+
+	/**
+	 * the certificate of the CAS server CA.
+	 *
+	 * @hideinitializer
+	 */
+	private $_cas_server_ca_cert = '';
+
+	/**
+	 * Set to true not to validate the CAS server.
+	 *
+	 * @hideinitializer
+	 */
+	private $_no_cas_server_validation = false;
+
+
+	/**
+	 * Set the CA certificate of the CAS server.
+	 *
+	 * @param $cert the PEM certificate of the CA that emited the cert of the server
+	 */
+	public function setCasServerCACert($cert)
+	{
+		$this->_cas_server_ca_cert = $cert;
+	}
+
+	/**
+	 * Set no SSL validation for the CAS server.
+	 */
+	public function setNoCasServerValidation()
+	{
+		$this->_no_cas_server_validation = true;
+	}
+
+	/**
+	 * This method is used to validate a ST; halt on failure, and sets $validate_url,
+	 * $text_reponse and $tree_response on success. These parameters are used later
+	 * by CAS_Client::validatePGT() for CAS proxies.
+	 * Used for all CAS 1.0 validations
+	 * @param $validate_url the URL of the request to the CAS server.
+	 * @param $text_response the response of the CAS server, as is (XML text).
+	 * @param $tree_response the response of the CAS server, as a DOM XML tree.
+	 *
+	 * @return bool TRUE when successfull, halt otherwise by calling CAS_Client::authError().
+	 */
+	public function validateST($validate_url,&$text_response,&$tree_response)
+	{
+		phpCAS::traceBegin();
+		// build the URL to validate the ticket
+		$validate_url = $this->getServerServiceValidateURL().'&ticket='.$this->getST();
+		if ( $this->isProxy() ) {
+			// pass the callback url for CAS proxies
+			$validate_url .= '&pgtUrl='.urlencode($this->getCallbackURL());
+		}
+
+		// open and read the URL
+		if ( !$this->readURL($validate_url,$headers,$text_response,$err_msg) ) {
+			phpCAS::trace('could not open URL \''.$validate_url.'\' to validate ('.$err_msg.')');
+			$this->authError('ST not validated',
+			$validate_url,
+			TRUE/*$no_response*/);
+		}
+
+		// analyze the result depending on the version
+		switch ($this->getServerVersion()) {
+			case CAS_VERSION_1_0:
+				if (preg_match('/^no\n/',$text_response)) {
+					phpCAS::trace('ST has not been validated');
+					$this->authError('ST not validated',
+					$validate_url,
+					FALSE/*$no_response*/,
+					FALSE/*$bad_response*/,
+					$text_response);
+				}
+				if (!preg_match('/^yes\n/',$text_response)) {
+					phpCAS::trace('ill-formed response');
+					$this->authError('ST not validated',
+					$validate_url,
+					FALSE/*$no_response*/,
+					TRUE/*$bad_response*/,
+					$text_response);
+				}
+				// ST has been validated, extract the user name
+				$arr = preg_split('/\n/',$text_response);
+				$this->setUser(trim($arr[1]));
+				break;
+			case CAS_VERSION_2_0:
+
+				// create new DOMDocument object
+				$dom = new DOMDocument();
+				// Fix possible whitspace problems
+				$dom->preserveWhiteSpace = false;
+				// read the response of the CAS server into a DOM object
+				if ( !($dom->loadXML($text_response))) {
+					phpCAS::trace('dom->loadXML() failed');
+					$this->authError('ST not validated',
+					$validate_url,
+					FALSE/*$no_response*/,
+					TRUE/*$bad_response*/,
+					$text_response);
+				}
+				// read the root node of the XML tree
+				if ( !($tree_response = $dom->documentElement) ) {
+					phpCAS::trace('documentElement() failed');
+					$this->authError('ST not validated',
+					$validate_url,
+					FALSE/*$no_response*/,
+					TRUE/*$bad_response*/,
+					$text_response);
+				}
+				// insure that tag name is 'serviceResponse'
+				if ( $tree_response->localName != 'serviceResponse' ) {
+					phpCAS::trace('bad XML root node (should be `serviceResponse\' instead of `'.$tree_response->localName.'\'');
+					$this->authError('ST not validated',
+					$validate_url,
+					FALSE/*$no_response*/,
+					TRUE/*$bad_response*/,
+					$text_response);
+				}
+
+				if ( $tree_response->getElementsByTagName("authenticationSuccess")->length != 0) {
+					// authentication succeded, extract the user name
+					$success_elements = $tree_response->getElementsByTagName("authenticationSuccess");
+					if ( $success_elements->item(0)->getElementsByTagName("user")->length == 0) {
+						// no user specified => error
+						$this->authError('ST not validated',
+						$validate_url,
+						FALSE/*$no_response*/,
+						TRUE/*$bad_response*/,
+						$text_response);
+					}
+					$this->setUser(trim($success_elements->item(0)->getElementsByTagName("user")->item(0)->nodeValue));
+					$this->readExtraAttributesCas20($success_elements);
+				} else if ( $tree_response->getElementsByTagName("authenticationFailure")->length != 0) {
+					phpCAS::trace('<authenticationFailure> found');
+					// authentication failed, extract the error code and message
+					$auth_fail_list = $tree_response->getElementsByTagName("authenticationFailure");
+					$this->authError('ST not validated',
+					$validate_url,
+					FALSE/*$no_response*/,
+					FALSE/*$bad_response*/,
+					$text_response,
+					$auth_fail_list->item(0)->getAttribute('code')/*$err_code*/,
+					trim($auth_fail_list->item(0)->nodeValue)/*$err_msg*/);
+				} else {
+					phpCAS::trace('neither <authenticationSuccess> nor <authenticationFailure> found');
+					$this->authError('ST not validated',
+					$validate_url,
+					FALSE/*$no_response*/,
+					TRUE/*$bad_response*/,
+					$text_response);
+				}
+				break;
+		}
+		$this->renameSession($this->getST());
+		// at this step, ST has been validated and $this->_user has been set,
+		phpCAS::traceEnd(TRUE);
+		return TRUE;
+	}
+	
+	/** @} */
+
+	
+	// ########################################################################
+	//  SAML VALIDATION
+	// ########################################################################
+	/**
+	* @addtogroup internalSAML
+	* @{
+	*/
+
+	/**
+	 * This method is used to validate a SAML TICKET; halt on failure, and sets $validate_url,
+	 * $text_reponse and $tree_response on success. These parameters are used later
+	 * by CAS_Client::validatePGT() for CAS proxies.
+	 *
+	 * @param $validate_url the URL of the request to the CAS server.
+	 * @param $text_response the response of the CAS server, as is (XML text).
+	 * @param $tree_response the response of the CAS server, as a DOM XML tree.
+	 *
+	 * @return bool TRUE when successfull, halt otherwise by calling CAS_Client::authError().
+	 */
+	public function validateSA($validate_url,&$text_response,&$tree_response)
+	{
+		phpCAS::traceBegin();
+
+		// build the URL to validate the ticket
+		$validate_url = $this->getServerSamlValidateURL();
+
+		// open and read the URL
+		if ( !$this->readURL($validate_url,$headers,$text_response,$err_msg) ) {
+			phpCAS::trace('could not open URL \''.$validate_url.'\' to validate ('.$err_msg.')');
+			$this->authError('SA not validated', $validate_url, TRUE/*$no_response*/);
+		}
+
+		phpCAS::trace('server version: '.$this->getServerVersion());
+
+		// analyze the result depending on the version
+		switch ($this->getServerVersion()) {
+			case SAML_VERSION_1_1:
+
+				// create new DOMDocument Object
+				$dom = new DOMDocument();
+				// Fix possible whitspace problems
+				$dom->preserveWhiteSpace = false;
+				// read the response of the CAS server into a DOM object
+				if ( !($dom->loadXML($text_response))) {
+					phpCAS::trace('dom->loadXML() failed');
+					$this->authError('SA not validated',
+					$validate_url,
+					FALSE/*$no_response*/,
+					TRUE/*$bad_response*/,
+					$text_response);
+				}
+				// read the root node of the XML tree
+				if ( !($tree_response = $dom->documentElement) ) {
+					phpCAS::trace('documentElement() failed');
+					$this->authError('SA not validated',
+					$validate_url,
+					FALSE/*$no_response*/,
+					TRUE/*$bad_response*/,
+					$text_response);
+				}
+				// insure that tag name is 'Envelope'
+				if ( $tree_response->localName != 'Envelope' ) {
+					phpCAS::trace('bad XML root node (should be `Envelope\' instead of `'.$tree_response->localName.'\'');
+					$this->authError('SA not validated',
+					$validate_url,
+					FALSE/*$no_response*/,
+					TRUE/*$bad_response*/,
+					$text_response);
+				}
+				// check for the NameIdentifier tag in the SAML response
+				if ( $tree_response->getElementsByTagName("NameIdentifier")->length != 0) {
+					$success_elements = $tree_response->getElementsByTagName("NameIdentifier");
+					phpCAS::trace('NameIdentifier found');
+					$user = trim($success_elements->item(0)->nodeValue);
+					phpCAS::trace('user = `'.$user.'`');
+					$this->setUser($user);
+					$this->setSessionAttributes($text_response);
+				} else {
+					phpCAS::trace('no <NameIdentifier> tag found in SAML payload');
+					$this->authError('SA not validated',
+					$validate_url,
+					FALSE/*$no_response*/,
+					TRUE/*$bad_response*/,
+					$text_response);
+				}
+				break;
+		}
+		$this->renameSession($this->getSA());
+		// at this step, ST has been validated and $this->_user has been set,
+		phpCAS::traceEnd(TRUE);
+		return TRUE;
+	}
+
+	/**
+	 * This method will parse the DOM and pull out the attributes from the SAML
+	 * payload and put them into an array, then put the array into the session.
+	 *
+	 * @param $text_response the SAML payload.
+	 * @return bool TRUE when successfull and FALSE if no attributes a found
+	 */
+	private function setSessionAttributes($text_response)
+	{
+		phpCAS::traceBegin();
+
+		$result = FALSE;
+
+		$attr_array = array();
+
+		// create new DOMDocument Object
+		$dom = new DOMDocument();
+		// Fix possible whitspace problems
+		$dom->preserveWhiteSpace = false;
+		if (($dom->loadXML($text_response))) {
+			$xPath = new DOMXpath($dom);
+			$xPath->registerNamespace('samlp', 'urn:oasis:names:tc:SAML:1.0:protocol');
+			$xPath->registerNamespace('saml', 'urn:oasis:names:tc:SAML:1.0:assertion');
+			$nodelist = $xPath->query("//saml:Attribute");
+
+			if($nodelist){
+				foreach($nodelist as $node){
+					$xres = $xPath->query("saml:AttributeValue", $node);
+					$name = $node->getAttribute("AttributeName");
+					$value_array = array();
+					foreach($xres as $node2){
+						$value_array[] = $node2->nodeValue;
+					}
+					$attr_array[$name] = $value_array;
+				}
+				// UGent addition...
+				foreach($attr_array as $attr_key => $attr_value) {
+					if(count($attr_value) > 1) {
+						$this->_attributes[$attr_key] = $attr_value;
+						phpCAS::trace("* " . $attr_key . "=" . $attr_value);
+					}
+					else {
+						$this->_attributes[$attr_key] = $attr_value[0];
+						phpCAS::trace("* " . $attr_key . "=" . $attr_value[0]);
+					}
+				}
+				$result = TRUE;
+			}else{
+				phpCAS::trace("SAML Attributes are empty");
+				$result = FALSE;
+			}
+		}
+		phpCAS::traceEnd($result);
+		return $result;
+	}
+	
+	/**
+	 * This method returns the SAML Ticket provided in the URL of the request.
+	 * @return The SAML ticket.
+	 */
+	public function getSA()
+	{ return 'ST'.substr($this->_sa, 2); }
+
+	/**
+	 * This method stores the SAML Ticket.
+	 * @param $sa The SAML Ticket.
+	 */
+	public function setSA($sa)
+	{ $this->_sa = $sa; }
+
+	/**
+	 * This method tells if a SAML Ticket was stored.
+	 * @return TRUE if a SAML Ticket has been stored.
+	 */
+	public function hasSA()
+	{ return !empty($this->_sa); }
+
+	/** @} */
+
+	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+	// XX                                                                    XX
+	// XX                     PROXY FEATURES (CAS 2.0)                       XX
+	// XX                                                                    XX
+	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+	// ########################################################################
+	//  PROXYING
+	// ########################################################################
+	/**
+	* @addtogroup internalProxy
+	* @{
+	*/
+
+	/**
+	 * A boolean telling if the client is a CAS proxy or not. Written by CAS_Client::CAS_Client(),
+	 * read by CAS_Client::isProxy().
+	 */
+	private $_proxy;
+
+	/**
+	 * Handler for managing service cookies.
+	 */
+	private $_serviceCookieJar;
+
+	/**
+	 * Tells if a CAS client is a CAS proxy or not
+	 *
+	 * @return TRUE when the CAS client is a CAs proxy, FALSE otherwise
+	 */
+	public function isProxy()
+	{
+		return $this->_proxy;
+	}
+
+	/** @} */
+	// ########################################################################
+	//  PGT
+	// ########################################################################
+	/**
+	* @addtogroup internalProxy
+	* @{
+	*/
+
+	/**
+	 * the Proxy Grnting Ticket given by the CAS server (empty otherwise).
+	 * Written by CAS_Client::setPGT(), read by CAS_Client::getPGT() and CAS_Client::hasPGT().
+	 *
+	 * @hideinitializer
+	 */
+	private $_pgt = '';
+
+	/**
+	 * This method returns the Proxy Granting Ticket given by the CAS server.
+	 * @return The Proxy Granting Ticket.
+	 */
+	private function getPGT()
+	{ return $this->_pgt; }
+
+	/**
+	 * This method stores the Proxy Granting Ticket.
+	 * @param $pgt The Proxy Granting Ticket.
+	 */
+	private function setPGT($pgt)
+	{ $this->_pgt = $pgt; }
+
+	/**
+	 * This method tells if a Proxy Granting Ticket was stored.
+	 * @return TRUE if a Proxy Granting Ticket has been stored.
+	 */
+	private function hasPGT()
+	{ return !empty($this->_pgt); }
+
+	/** @} */
+
+	// ########################################################################
+	//  CALLBACK MODE
+	// ########################################################################
+	/**
+	* @addtogroup internalCallback
+	* @{
+	*/
+	/**
+	 * each PHP script using phpCAS in proxy mode is its own callback to get the
+	 * PGT back from the CAS server. callback_mode is detected by the constructor
+	 * thanks to the GET parameters.
+	 */
+
+	/**
+	 * a boolean to know if the CAS client is running in callback mode. Written by
+	 * CAS_Client::setCallBackMode(), read by CAS_Client::isCallbackMode().
+	 *
+	 * @hideinitializer
+	 */
+	private $_callback_mode = FALSE;
+
+	/**
+	 * This method sets/unsets callback mode.
+	 *
+	 * @param $callback_mode TRUE to set callback mode, FALSE otherwise.
+	 */
+	private function setCallbackMode($callback_mode)
+	{
+		$this->_callback_mode = $callback_mode;
+	}
+
+	/**
+	 * This method returns TRUE when the CAs client is running i callback mode,
+	 * FALSE otherwise.
+	 *
+	 * @return A boolean.
+	 */
+	private function isCallbackMode()
+	{
+		return $this->_callback_mode;
+	}
+
+	/**
+	 * the URL that should be used for the PGT callback (in fact the URL of the
+	 * current request without any CGI parameter). Written and read by
+	 * CAS_Client::getCallbackURL().
+	 *
+	 * @hideinitializer
+	 */
+	private $_callback_url = '';
+
+	/**
+	 * This method returns the URL that should be used for the PGT callback (in
+	 * fact the URL of the current request without any CGI parameter, except if
+	 * phpCAS::setFixedCallbackURL() was used).
+	 *
+	 * @return The callback URL
+	 */
+	private function getCallbackURL()
+	{
+		// the URL is built when needed only
+		if ( empty($this->_callback_url) ) {
+			$final_uri = '';
+			// remove the ticket if present in the URL
+			$final_uri = 'https://';
+			$final_uri .= $this->getServerUrl();
+			$request_uri = $_SERVER['REQUEST_URI'];
+			$request_uri = preg_replace('/\?.*$/','',$request_uri);
+			$final_uri .= $request_uri;
+			$this->setCallbackURL($final_uri);
+		}
+		return $this->_callback_url;
+	}
+
+	/**
+	 * This method sets the callback url.
+	 *
+	 * @param $callback_url url to set callback
+	 */
+	public function setCallbackURL($url)
+	{
+		return $this->_callback_url = $url;
+	}
+
+	/**
+	 * This method is called by CAS_Client::CAS_Client() when running in callback
+	 * mode. It stores the PGT and its PGT Iou, prints its output and halts.
+	 */
+	private function callback()
+	{
+		phpCAS::traceBegin();
+		if (preg_match('/PGTIOU-[\.\-\w]/', $_GET['pgtIou'])){
+			if(preg_match('/[PT]GT-[\.\-\w]/', $_GET['pgtId'])){
+				$this->printHTMLHeader('phpCAS callback');
+				$pgt_iou = $_GET['pgtIou'];
+				$pgt = $_GET['pgtId'];
+				phpCAS::trace('Storing PGT `'.$pgt.'\' (id=`'.$pgt_iou.'\')');
+				echo '<p>Storing PGT `'.$pgt.'\' (id=`'.$pgt_iou.'\').</p>';
+				$this->storePGT($pgt,$pgt_iou);
+				$this->printHTMLFooter();
+			}else{
+				phpCAS::error('PGT format invalid' . $_GET['pgtId']);
+			}
+		}else{
+			phpCAS::error('PGTiou format invalid' . $_GET['pgtIou']);
+		}
+		phpCAS::traceExit();
+		exit();
+	}
+
+	/** @} */
+
+	// ########################################################################
+	//  PGT STORAGE
+	// ########################################################################
+	/**
+	* @addtogroup internalPGTStorage
+	* @{
+	*/
+
+	/**
+	 * an instance of a class inheriting of PGTStorage, used to deal with PGT
+	 * storage. Created by CAS_Client::setPGTStorageFile(), used
+	 * by CAS_Client::setPGTStorageFile() and CAS_Client::initPGTStorage().
+	 *
+	 * @hideinitializer
+	 */
+	private $_pgt_storage = null;
+
+	/**
+	 * This method is used to initialize the storage of PGT's.
+	 * Halts on error.
+	 */
+	private function initPGTStorage()
+	{
+		// if no SetPGTStorageXxx() has been used, default to file
+		if ( !is_object($this->_pgt_storage) ) {
+			$this->setPGTStorageFile();
+		}
+
+		// initializes the storage
+		$this->_pgt_storage->init();
+	}
+
+	/**
+	 * This method stores a PGT. Halts on error.
+	 *
+	 * @param $pgt the PGT to store
+	 * @param $pgt_iou its corresponding Iou
+	 */
+	private function storePGT($pgt,$pgt_iou)
+	{
+		// ensure that storage is initialized
+		$this->initPGTStorage();
+		// writes the PGT
+		$this->_pgt_storage->write($pgt,$pgt_iou);
+	}
+
+	/**
+	 * This method reads a PGT from its Iou and deletes the corresponding storage entry.
+	 *
+	 * @param $pgt_iou the PGT Iou
+	 *
+	 * @return The PGT corresponding to the Iou, FALSE when not found.
+	 */
+	private function loadPGT($pgt_iou)
+	{
+		// ensure that storage is initialized
+		$this->initPGTStorage();
+		// read the PGT
+		return $this->_pgt_storage->read($pgt_iou);
+	}
+
+	/**
+	 * This method can be used to set a custom PGT storage object.
+	 *
+	 * @param $storage a PGT storage object that inherits from the CAS_PGTStorage class
+	 */
+	public function setPGTStorage($storage)
+	{
+		// check that the storage has not already been set
+		if ( is_object($this->_pgt_storage) ) {
+			phpCAS::error('PGT storage already defined');
+		}
+
+		// check to make sure a valid storage object was specified
+		if ( !($storage instanceof CAS_PGTStorage_AbstractStorage) ) {
+			phpCAS::error('Invalid PGT storage object');
+		}
+
+		// store the PGTStorage object
+		$this->_pgt_storage = $storage;
+	}
+
+	/**
+	 * This method is used to tell phpCAS to store the response of the
+	 * CAS server to PGT requests in a database.
+	 *
+	 * @param $dsn_or_pdo a dsn string to use for creating a PDO object or a PDO object
+	 * @param $username the username to use when connecting to the database
+	 * @param $password the password to use when connecting to the database
+	 * @param $table the table to use for storing and retrieving PGT's
+	 * @param $driver_options any driver options to use when connecting to the database
+	 */
+	public function setPGTStorageDb($dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)
+	{
+		// create the storage object
+		$this->setPGTStorage(new CAS_PGTStorage_Db($this, $dsn_or_pdo, $username, $password, $table, $driver_options));
+	}
+
+	/**
+	 * This method is used to tell phpCAS to store the response of the
+	 * CAS server to PGT requests onto the filesystem.
+	 *
+	 * @param $format the format used to store the PGT's (`plain' and `xml' allowed)
+	 * @param $path the path where the PGT's should be stored
+	 */
+	public function setPGTStorageFile($path='')
+	{
+		// create the storage object
+		$this->setPGTStorage(new CAS_PGTStorage_File($this,$path));
+	}
+
+
+	// ########################################################################
+	//  PGT VALIDATION
+	// ########################################################################
+	/**
+	* This method is used to validate a PGT; halt on failure.
+	*
+	* @param $validate_url the URL of the request to the CAS server.
+	* @param $text_response the response of the CAS server, as is (XML text); result
+	* of CAS_Client::validateST() or CAS_Client::validatePT().
+	* @param $tree_response the response of the CAS server, as a DOM XML tree; result
+	* of CAS_Client::validateST() or CAS_Client::validatePT().
+	*
+	* @return bool TRUE when successfull, halt otherwise by calling CAS_Client::authError().
+	*/
+	private function validatePGT(&$validate_url,$text_response,$tree_response)
+	{
+		phpCAS::traceBegin();
+		if ( $tree_response->getElementsByTagName("proxyGrantingTicket")->length == 0) {
+			phpCAS::trace('<proxyGrantingTicket> not found');
+			// authentication succeded, but no PGT Iou was transmitted
+			$this->authError('Ticket validated but no PGT Iou transmitted',
+			$validate_url,
+			FALSE/*$no_response*/,
+			FALSE/*$bad_response*/,
+			$text_response);
+		} else {
+			// PGT Iou transmitted, extract it
+			$pgt_iou = trim($tree_response->getElementsByTagName("proxyGrantingTicket")->item(0)->nodeValue);
+			if(preg_match('/PGTIOU-[\.\-\w]/',$pgt_iou)){
+				$pgt = $this->loadPGT($pgt_iou);
+				if ( $pgt == FALSE ) {
+					phpCAS::trace('could not load PGT');
+					$this->authError('PGT Iou was transmitted but PGT could not be retrieved',
+					$validate_url,
+					FALSE/*$no_response*/,
+					FALSE/*$bad_response*/,
+					$text_response);
+				}
+				$this->setPGT($pgt);
+			}else{
+				phpCAS::trace('PGTiou format error');
+				$this->authError('PGT Iou was transmitted but has wrong fromat',
+				$validate_url,
+				FALSE/*$no_response*/,
+				FALSE/*$bad_response*/,
+				$text_response);
+			}
+		}
+		phpCAS::traceEnd(TRUE);
+		return TRUE;
+	}
+
+	// ########################################################################
+	//  PGT VALIDATION
+	// ########################################################################
+
+	/**
+	 * This method is used to retrieve PT's from the CAS server thanks to a PGT.
+	 *
+	 * @param $target_service the service to ask for with the PT.
+	 * @param $err_code an error code (PHPCAS_SERVICE_OK on success).
+	 * @param $err_msg an error message (empty on success).
+	 *
+	 * @return a Proxy Ticket, or FALSE on error.
+	 */
+	public function retrievePT($target_service,&$err_code,&$err_msg)
+	{
+		phpCAS::traceBegin();
+
+		// by default, $err_msg is set empty and $pt to TRUE. On error, $pt is
+		// set to false and $err_msg to an error message. At the end, if $pt is FALSE
+		// and $error_msg is still empty, it is set to 'invalid response' (the most
+		// commonly encountered error).
+		$err_msg = '';
+
+		// build the URL to retrieve the PT
+		$cas_url = $this->getServerProxyURL().'?targetService='.urlencode($target_service).'&pgt='.$this->getPGT();
+
+		// open and read the URL
+		if ( !$this->readURL($cas_url,$headers,$cas_response,$err_msg) ) {
+			phpCAS::trace('could not open URL \''.$cas_url.'\' to validate ('.$err_msg.')');
+			$err_code = PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE;
+			$err_msg = 'could not retrieve PT (no response from the CAS server)';
+			phpCAS::traceEnd(FALSE);
+			return FALSE;
+		}
+
+		$bad_response = FALSE;
+
+		if ( !$bad_response ) {
+			// create new DOMDocument object
+			$dom = new DOMDocument();
+			// Fix possible whitspace problems
+			$dom->preserveWhiteSpace = false;
+			// read the response of the CAS server into a DOM object
+			if ( !($dom->loadXML($cas_response))) {
+				phpCAS::trace('dom->loadXML() failed');
+				// read failed
+				$bad_response = TRUE;
+			}
+		}
+
+		if ( !$bad_response ) {
+			// read the root node of the XML tree
+			if ( !($root = $dom->documentElement) ) {
+				phpCAS::trace('documentElement failed');
+				// read failed
+				$bad_response = TRUE;
+			}
+		}
+
+		if ( !$bad_response ) {
+			// insure that tag name is 'serviceResponse'
+			if ( $root->localName != 'serviceResponse' ) {
+				phpCAS::trace('localName failed');
+				// bad root node
+				$bad_response = TRUE;
+			}
+		}
+
+		if ( !$bad_response ) {
+			// look for a proxySuccess tag
+			if ( $root->getElementsByTagName("proxySuccess")->length != 0) {
+				$proxy_success_list = $root->getElementsByTagName("proxySuccess");
+
+				// authentication succeded, look for a proxyTicket tag
+				if ( $proxy_success_list->item(0)->getElementsByTagName("proxyTicket")->length != 0) {
+					$err_code = PHPCAS_SERVICE_OK;
+					$err_msg = '';
+					$pt = trim($proxy_success_list->item(0)->getElementsByTagName("proxyTicket")->item(0)->nodeValue);
+					phpCAS::trace('original PT: '.trim($pt));
+					phpCAS::traceEnd($pt);
+					return $pt;
+				} else {
+					phpCAS::trace('<proxySuccess> was found, but not <proxyTicket>');
+				}
+			}
+			// look for a proxyFailure tag
+			else if ( $root->getElementsByTagName("proxyFailure")->length != 0) {
+				$proxy_failure_list = $root->getElementsByTagName("proxyFailure");
+
+				// authentication failed, extract the error
+				$err_code = PHPCAS_SERVICE_PT_FAILURE;
+				$err_msg = 'PT retrieving failed (code=`'
+				.$proxy_failure_list->item(0)->getAttribute('code')
+				.'\', message=`'
+				.trim($proxy_failure_list->item(0)->nodeValue)
+				.'\')';
+				phpCAS::traceEnd(FALSE);
+				return FALSE;
+			} else {
+				phpCAS::trace('neither <proxySuccess> nor <proxyFailure> found');
+			}
+		}
+
+		// at this step, we are sure that the response of the CAS server was ill-formed
+		$err_code = PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE;
+		$err_msg = 'Invalid response from the CAS server (response=`'.$cas_response.'\')';
+
+		phpCAS::traceEnd(FALSE);
+		return FALSE;
+	}
+	
+		/** @} */
+
+	// ########################################################################
+	// READ CAS SERVER ANSWERS
+	// ########################################################################
+	
+	/**
+	* @addtogroup internalMisc
+	* @{
+	*/
+	
+	/**
+	 * This method is used to acces a remote URL.
+	 *
+	 * @param $url the URL to access.
+	 * @param $headers an array containing the HTTP header lines of the response
+	 * (an empty array on failure).
+	 * @param $body the body of the response, as a string (empty on failure).
+	 * @param $err_msg an error message, filled on failure.
+	 *
+	 * @return TRUE on success, FALSE otherwise (in this later case, $err_msg
+	 * contains an error message).
+	 */
+	private function readURL($url, &$headers, &$body, &$err_msg)
+	{
+		$className = $this->_requestImplementation;
+		$request = new $className();
+
+		if (count($this->_curl_options)) {
+			$request->setCurlOptions($this->_curl_options);
+		}
+
+		$request->setUrl($url);
+		
+		if (empty($this->_cas_server_ca_cert) && !$this->_no_cas_server_validation) {
+			phpCAS::error('one of the methods phpCAS::setCasServerCACert() or phpCAS::setNoCasServerValidation() must be called.');
+		}
+		if ($this->_cas_server_ca_cert != '') {
+			$request->setSslCaCert($this->_cas_server_ca_cert);
+		}
+
+		// add extra stuff if SAML
+		if ($this->hasSA()) {
+			$request->addHeader("soapaction: http://www.oasis-open.org/committees/security");
+			$request->addHeader("cache-control: no-cache");
+			$request->addHeader("pragma: no-cache");
+			$request->addHeader("accept: text/xml");
+			$request->addHeader("connection: keep-alive");
+			$request->addHeader("content-type: text/xml");
+			$request->makePost();
+			$request->setPostBody($this->buildSAMLPayload());
+		}
+
+		if ($request->send()) {
+			$headers = $request->getResponseHeaders();
+			$body = $request->getResponseBody();
+			$err_msg = '';
+			return true;
+		} else {
+			$headers = '';
+			$body = '';
+			$err_msg = $request->getErrorMessage();
+			return false;
+		}
+	}
+
+	/**
+	 * This method is used to build the SAML POST body sent to /samlValidate URL.
+	 *
+	 * @return the SOAP-encased SAMLP artifact (the ticket).
+	 */
+	private function buildSAMLPayload()
+	{
+		phpCAS::traceBegin();
+
+		//get the ticket
+		$sa = $this->getSA();
+
+		$body=SAML_SOAP_ENV.SAML_SOAP_BODY.SAMLP_REQUEST.SAML_ASSERTION_ARTIFACT.$sa.SAML_ASSERTION_ARTIFACT_CLOSE.SAMLP_REQUEST_CLOSE.SAML_SOAP_BODY_CLOSE.SAML_SOAP_ENV_CLOSE;
+
+		phpCAS::traceEnd($body);
+		return ($body);
+	}
+
+	private  $_curl_headers = array();
+	/**
+	 * This method is the callback used by readURL method to request HTTP headers.
+	 */
+	public function _curl_read_headers($ch, $header)
+	{
+		$this->_curl_headers[] = $header;
+		return strlen($header);
+	}
+	
+	/** @} **/
+	
+	// ########################################################################
+	// ACCESS TO EXTERNAL SERVICES
+	// ########################################################################
+	
+	/**
+	* @addtogroup internalProxyServices
+	* @{
+	*/
+	
+	
+	/**
+	 * Answer a proxy-authenticated service handler.
+	 * 
+	 * @param string $type The service type. One of:
+	 *			PHPCAS_PROXIED_SERVICE_HTTP_GET
+	 *			PHPCAS_PROXIED_SERVICE_HTTP_POST
+	 *			PHPCAS_PROXIED_SERVICE_IMAP
+	 *			
+	 *		
+	 * @return CAS_ProxiedService
+	 * @throws InvalidArgumentException If the service type is unknown.
+	 */
+	public function getProxiedService ($type) {
+		switch ($type) {
+			case PHPCAS_PROXIED_SERVICE_HTTP_GET:
+			case PHPCAS_PROXIED_SERVICE_HTTP_POST:
+				$requestClass = $this->_requestImplementation;
+				$request = new $requestClass();	
+				if (count($this->_curl_options)) {
+					$request->setCurlOptions($this->_curl_options);
+				}
+				$proxiedService = new $type($request, $this->_serviceCookieJar);
+				if ($proxiedService instanceof CAS_ProxiedService_Testable)
+					$proxiedService->setCasClient($this);
+				return $proxiedService;
+			case PHPCAS_PROXIED_SERVICE_IMAP;
+				$proxiedService = new CAS_ProxiedService_Imap($this->getUser());
+				if ($proxiedService instanceof CAS_ProxiedService_Testable)
+					$proxiedService->setCasClient($this);
+				return $proxiedService;
+			default:
+				throw new CAS_InvalidArgumentException("Unknown proxied-service type, $type.");
+		}
+	}
+	
+	/**
+	 * Initialize a proxied-service handler with the proxy-ticket it should use.
+	 * 
+	 * @param CAS_ProxiedService $proxiedService
+	 * @return void
+	 * @throws CAS_ProxyTicketException If there is a proxy-ticket failure.
+	 *		The code of the Exception will be one of: 
+	 *			PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE 
+	 *			PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE
+	 *			PHPCAS_SERVICE_PT_FAILURE
+	 * @throws CAS_ProxiedService_Exception If there is a failure getting the url from the proxied service.
+	 */
+	public function initializeProxiedService (CAS_ProxiedService $proxiedService) {
+		$url = $proxiedService->getServiceUrl();
+		if (!is_string($url))
+			throw new CAS_ProxiedService_Exception("Proxied Service ".get_class($proxiedService)."->getServiceUrl() should have returned a string, returned a ".gettype($url)." instead.");
+		
+		$pt = $this->retrievePT($url, $err_code, $err_msg);
+		if (!$pt)
+			throw new CAS_ProxyTicketException($err_msg, $err_code);
+		$proxiedService->setProxyTicket($pt);
+	}
+
+	/**
+	 * This method is used to access an HTTP[S] service.
+	 *
+	 * @param $url the service to access.
+	 * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
+	 * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
+	 * PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT_AVAILABLE.
+	 * @param $output the output of the service (also used to give an error
+	 * message on failure).
+	 *
+	 * @return TRUE on success, FALSE otherwise (in this later case, $err_code
+	 * gives the reason why it failed and $output contains an error message).
+	 */
+	public function serviceWeb($url,&$err_code,&$output)
+	{
+		try {
+			$service = $this->getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_GET);
+			$service->setUrl($url);
+			$service->send();
+			$output = $service->getResponseBody();
+			$err_code = PHPCAS_SERVICE_OK;
+			return TRUE;
+		} catch (CAS_ProxyTicketException $e) {
+			$err_code = $e->getCode();
+			$output = $e->getMessage();
+			return FALSE;
+		} catch (CAS_ProxiedService_Exception $e) {
+			$output = sprintf($this->getString(CAS_STR_SERVICE_UNAVAILABLE), $url, $e->getMessage());
+			$err_code = PHPCAS_SERVICE_NOT_AVAILABLE;
+			return FALSE;
+		}
+	}
+
+	/**
+	 * This method is used to access an IMAP/POP3/NNTP service.
+	 *
+	 * @param $url a string giving the URL of the service, including the mailing box
+	 * for IMAP URLs, as accepted by imap_open().
+	 * @param $service a string giving for CAS retrieve Proxy ticket
+	 * @param $flags options given to imap_open().
+	 * @param $err_code an error code Possible values are PHPCAS_SERVICE_OK (on
+	 * success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
+	 * PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT_AVAILABLE.
+	 * @param $err_msg an error message on failure
+	 * @param $pt the Proxy Ticket (PT) retrieved from the CAS server to access the URL
+	 * on success, FALSE on error).
+	 *
+	 * @return an IMAP stream on success, FALSE otherwise (in this later case, $err_code
+	 * gives the reason why it failed and $err_msg contains an error message).
+	 */
+	public function serviceMail($url,$serviceUrl,$flags,&$err_code,&$err_msg,&$pt)
+	{
+		try {
+			$service = $this->getProxiedService(PHPCAS_PROXIED_SERVICE_IMAP);
+			$service->setServiceUrl($serviceUrl);
+			$service->setMailbox($url);
+			$service->setOptions($flags);
+			
+			$stream = $service->open();
+			$err_code = PHPCAS_SERVICE_OK;
+			$pt = $service->getImapProxyTicket();
+			return $stream;
+		} catch (CAS_ProxyTicketException $e) {
+			$err_msg = $e->getMessage();
+			$err_code = $e->getCode();
+			$pt = FALSE;
+			return FALSE;
+		} catch (CAS_ProxiedService_Exception $e) {
+			$err_msg = sprintf($this->getString(CAS_STR_SERVICE_UNAVAILABLE), $url, $e->getMessage());
+			$err_code = PHPCAS_SERVICE_NOT_AVAILABLE;
+			$pt = FALSE;
+			return FALSE;
+		}
+	}
+
+	/** @} **/
+
+	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+	// XX                                                                    XX
+	// XX                  PROXIED CLIENT FEATURES (CAS 2.0)                 XX
+	// XX                                                                    XX
+	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+	// ########################################################################
+	//  PT
+	// ########################################################################
+	/**
+	* @addtogroup internalProxied
+	* @{
+	*/
+
+	/**
+	 * the Proxy Ticket provided in the URL of the request if present
+	 * (empty otherwise). Written by CAS_Client::CAS_Client(), read by
+	 * CAS_Client::getPT() and CAS_Client::hasPGT().
+	 *
+	 * @hideinitializer
+	 */
+	private  $_pt = '';
+
+	/**
+	 * This method returns the Proxy Ticket provided in the URL of the request.
+	 * @return The proxy ticket.
+	 */
+	public function getPT()
+	{
+		//      return 'ST'.substr($this->_pt, 2);
+		return $this->_pt;
+	}
+
+	/**
+	 * This method stores the Proxy Ticket.
+	 * @param $pt The Proxy Ticket.
+	 */
+	public function setPT($pt)
+	{ $this->_pt = $pt; }
+
+	/**
+	 * This method tells if a Proxy Ticket was stored.
+	 * @return TRUE if a Proxy Ticket has been stored.
+	 */
+	public function hasPT()
+	{ return !empty($this->_pt); }
+	
+	
+	/**
+	 * This array will store a list of proxies in front of this application. This
+	 * property will only be populated if this script is being proxied rather than
+	 * accessed directly.
+	 *
+	 * It is set in CAS_Client::validatePT() and can be read by CAS_Client::getProxies()
+	 * @access private
+	 */
+	private $_proxies = array();
+	
+	/**
+	 * Answer an array of proxies that are sitting in front of this application.
+	 *
+	 * This method will only return a non-empty array if we have received and validated
+	 * a Proxy Ticket.
+	 * 
+	 * @return array
+	 * @access public
+	 * @since 6/25/09
+	 */
+	public function getProxies () {
+		return $this->_proxies;
+	}
+	
+	/**
+	 * Set the Proxy array, probably from persistant storage.
+	 * 
+	 * @param array $proxies
+	 * @return void
+	 * @access private
+	 * @since 6/25/09
+	 */
+	private function setProxies ($proxies) {
+		$this->_proxies = $proxies;
+	}
+	
+
+	/** @} */
+	// ########################################################################
+	//  PT VALIDATION
+	// ########################################################################
+	/**
+	* @addtogroup internalProxied
+	* @{
+	*/
+
+	/**
+	 * This method is used to validate a ST or PT; halt on failure
+	 * Used for all CAS 2.0 validations
+	 * @return bool TRUE when successfull, halt otherwise by calling CAS_Client::authError().
+	 */
+	public function validatePT(&$validate_url,&$text_response,&$tree_response)
+	{
+		phpCAS::traceBegin();
+		phpCAS::trace($text_response);
+		// build the URL to validate the ticket
+		$validate_url = $this->getServerProxyValidateURL().'&ticket='.$this->getPT();
+
+		if ( $this->isProxy() ) {
+			// pass the callback url for CAS proxies
+			$validate_url .= '&pgtUrl='.urlencode($this->getCallbackURL());
+		}
+
+		// open and read the URL
+		if ( !$this->readURL($validate_url,$headers,$text_response,$err_msg) ) {
+			phpCAS::trace('could not open URL \''.$validate_url.'\' to validate ('.$err_msg.')');
+			$this->authError('PT not validated',
+			$validate_url,
+			TRUE/*$no_response*/);
+		}
+
+		// create new DOMDocument object
+		$dom = new DOMDocument();
+		// Fix possible whitspace problems
+		$dom->preserveWhiteSpace = false;
+		// read the response of the CAS server into a DOMDocument object
+		if ( !($dom->loadXML($text_response))) {
+			// read failed
+			$this->authError('PT not validated',
+			$validate_url,
+			FALSE/*$no_response*/,
+			TRUE/*$bad_response*/,
+			$text_response);
+		}
+
+		// read the root node of the XML tree
+		if ( !($tree_response = $dom->documentElement) ) {
+			// read failed
+			$this->authError('PT not validated',
+			$validate_url,
+			FALSE/*$no_response*/,
+			TRUE/*$bad_response*/,
+			$text_response);
+		}
+		// insure that tag name is 'serviceResponse'
+		if ( $tree_response->localName != 'serviceResponse' ) {
+			// bad root node
+			$this->authError('PT not validated',
+			$validate_url,
+			FALSE/*$no_response*/,
+			TRUE/*$bad_response*/,
+			$text_response);
+		}
+		if ( $tree_response->getElementsByTagName("authenticationSuccess")->length != 0) {
+			// authentication succeded, extract the user name
+			$success_elements = $tree_response->getElementsByTagName("authenticationSuccess");
+			if ( $success_elements->item(0)->getElementsByTagName("user")->length == 0) {
+				// no user specified => error
+				$this->authError('PT not validated',
+				$validate_url,
+				FALSE/*$no_response*/,
+				TRUE/*$bad_response*/,
+				$text_response);
+			}
+
+			$this->setUser(trim($success_elements->item(0)->getElementsByTagName("user")->item(0)->nodeValue));
+			$this->readExtraAttributesCas20($success_elements);
+			
+			// Store the proxies we are sitting behind for authorization checking
+			if ( sizeof($arr = $success_elements->item(0)->getElementsByTagName("proxy")) > 0) {
+				foreach ($arr as $proxyElem) {
+					phpCAS::trace("Storing Proxy: ".$proxyElem->nodeValue);
+					$this->_proxies[] = trim($proxyElem->nodeValue);
+				}
+				$_SESSION['phpCAS']['proxies'] = $this->_proxies;
+			}
+			
+		} else if ( $tree_response->getElementsByTagName("authenticationFailure")->length != 0) {
+			// authentication succeded, extract the error code and message
+			$auth_fail_list = $tree_response->getElementsByTagName("authenticationFailure");
+			$this->authError('PT not validated',
+			$validate_url,
+			FALSE/*$no_response*/,
+			FALSE/*$bad_response*/,
+			$text_response,
+			$auth_fail_list->item(0)->getAttribute('code')/*$err_code*/,
+			trim($auth_fail_list->item(0)->nodeValue)/*$err_msg*/);
+		} else {
+			$this->authError('PT not validated',
+			$validate_url,
+			FALSE/*$no_response*/,
+			TRUE/*$bad_response*/,
+			$text_response);
+		}
+
+		$this->renameSession($this->getPT());
+		// at this step, PT has been validated and $this->_user has been set,
+
+		phpCAS::traceEnd(TRUE);
+		return TRUE;
+	}
+	
+	
+	/**
+	 * This method will parse the DOM and pull out the attributes from the XML
+	 * payload and put them into an array, then put the array into the session.
+	 *
+	 * @param $text_response the XML payload.
+	 * @return bool TRUE when successfull, halt otherwise by calling CAS_Client::authError().
+	 */
+	private function readExtraAttributesCas20($success_elements)
+	{
+		# PHPCAS-43 add CAS-2.0 extra attributes
+		phpCAS::traceBegin();
+
+		$extra_attributes = array();
+		
+		// "Jasig Style" Attributes:
+		// 
+		// 	<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
+		// 		<cas:authenticationSuccess>
+		// 			<cas:user>jsmith</cas:user>
+		// 			<cas:attributes>
+		// 				<cas:attraStyle>RubyCAS</cas:attraStyle>
+		// 				<cas:surname>Smith</cas:surname>
+		// 				<cas:givenName>John</cas:givenName>
+		// 				<cas:memberOf>CN=Staff,OU=Groups,DC=example,DC=edu</cas:memberOf>
+		// 				<cas:memberOf>CN=Spanish Department,OU=Departments,OU=Groups,DC=example,DC=edu</cas:memberOf>
+		// 			</cas:attributes>
+		// 			<cas:proxyGrantingTicket>PGTIOU-84678-8a9d2sfa23casd</cas:proxyGrantingTicket>
+		// 		</cas:authenticationSuccess>
+		// 	</cas:serviceResponse>
+		// 
+		if ( $success_elements->item(0)->getElementsByTagName("attributes")->length != 0) {
+			$attr_nodes = $success_elements->item(0)->getElementsByTagName("attributes");
+			phpCas :: trace("Found nested jasig style attributes");
+			if($attr_nodes->item(0)->hasChildNodes()){
+				// Nested Attributes
+				foreach ($attr_nodes->item(0)->childNodes as $attr_child) {
+					phpCas :: trace("Attribute [".$attr_child->localName."] = ".$attr_child->nodeValue);
+					$this->addAttributeToArray($extra_attributes, $attr_child->localName, $attr_child->nodeValue);
+				}
+			}
+		} 
+		// "RubyCAS Style" attributes
+		// 
+		// 	<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
+		// 		<cas:authenticationSuccess>
+		// 			<cas:user>jsmith</cas:user>
+		// 			
+		// 			<cas:attraStyle>RubyCAS</cas:attraStyle>
+		// 			<cas:surname>Smith</cas:surname>
+		// 			<cas:givenName>John</cas:givenName>
+		// 			<cas:memberOf>CN=Staff,OU=Groups,DC=example,DC=edu</cas:memberOf>
+		// 			<cas:memberOf>CN=Spanish Department,OU=Departments,OU=Groups,DC=example,DC=edu</cas:memberOf>
+		// 			
+		// 			<cas:proxyGrantingTicket>PGTIOU-84678-8a9d2sfa23casd</cas:proxyGrantingTicket>
+		// 		</cas:authenticationSuccess>
+		// 	</cas:serviceResponse>
+		// 
+		else {
+			phpCas :: trace("Testing for rubycas style attributes");
+			$childnodes = $success_elements->item(0)->childNodes;
+			foreach ($childnodes as $attr_node) {
+				switch ($attr_node->localName) {
+					case 'user':
+					case 'proxies':
+					case 'proxyGrantingTicket':
+						continue;
+					default:
+						if (strlen(trim($attr_node->nodeValue))) {
+							phpCas :: trace("Attribute [".$attr_node->localName."] = ".$attr_node->nodeValue);
+							$this->addAttributeToArray($extra_attributes, $attr_node->localName, $attr_node->nodeValue);
+						}
+				}
+			}
+		}
+		
+		// "Name-Value" attributes.
+		// 
+		// Attribute format from these mailing list thread:
+		// http://jasig.275507.n4.nabble.com/CAS-attributes-and-how-they-appear-in-the-CAS-response-td264272.html
+		// Note: This is a less widely used format, but in use by at least two institutions.
+		// 
+		// 	<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
+		// 		<cas:authenticationSuccess>
+		// 			<cas:user>jsmith</cas:user>
+		// 			
+		// 			<cas:attribute name='attraStyle' value='Name-Value' />
+		// 			<cas:attribute name='surname' value='Smith' />
+		// 			<cas:attribute name='givenName' value='John' />
+		// 			<cas:attribute name='memberOf' value='CN=Staff,OU=Groups,DC=example,DC=edu' />
+		// 			<cas:attribute name='memberOf' value='CN=Spanish Department,OU=Departments,OU=Groups,DC=example,DC=edu' />
+		// 			
+		// 			<cas:proxyGrantingTicket>PGTIOU-84678-8a9d2sfa23casd</cas:proxyGrantingTicket>
+		// 		</cas:authenticationSuccess>
+		// 	</cas:serviceResponse>
+		// 
+		if (!count($extra_attributes) && $success_elements->item(0)->getElementsByTagName("attribute")->length != 0) {
+			$attr_nodes = $success_elements->item(0)->getElementsByTagName("attribute");
+			$firstAttr = $attr_nodes->item(0);
+			if (!$firstAttr->hasChildNodes() && $firstAttr->hasAttribute('name') && $firstAttr->hasAttribute('value')) {
+				phpCas :: trace("Found Name-Value style attributes");
+				// Nested Attributes
+				foreach ($attr_nodes as $attr_node) {
+					if ($attr_node->hasAttribute('name') && $attr_node->hasAttribute('value')) {
+						phpCas :: trace("Attribute [".$attr_node->getAttribute('name')."] = ".$attr_node->getAttribute('value'));
+						$this->addAttributeToArray($extra_attributes, $attr_node->getAttribute('name'), $attr_node->getAttribute('value'));
+					}
+				}
+			}
+		}
+		
+		$this->setAttributes($extra_attributes);
+		phpCAS::traceEnd();
+		return TRUE;
+	}
+	
+	/**
+	 * Add an attribute value to an array of attributes.
+	 * 
+	 * @param ref array $array
+	 * @param string $name
+	 * @param string $value
+	 * @return void
+	 */
+	private function addAttributeToArray (array &$attributeArray, $name, $value) {
+		// If multiple attributes exist, add as an array value
+		if (isset($attributeArray[$name])) {
+			// Initialize the array with the existing value
+			if (!is_array($attributeArray[$name])) {
+				$existingValue = $attributeArray[$name];
+				$attributeArray[$name] = array($existingValue);
+			}
+			
+			$attributeArray[$name][] = trim($value);
+		} else {
+			$attributeArray[$name] = trim($value);
+		}
+	}
+
+	/** @} */
+
+	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+	// XX                                                                    XX
+	// XX                               MISC                                 XX
+	// XX                                                                    XX
+	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+	/**
+	 * @addtogroup internalMisc
+	 * @{
+	 */
+
+	// ########################################################################
+	//  URL
+	// ########################################################################
+	/**
+	* the URL of the current request (without any ticket CGI parameter). Written
+	* and read by CAS_Client::getURL().
+	*
+	* @hideinitializer
+	*/
+	private $_url = '';
+
+	
+	/**
+	 * This method sets the URL of the current request
+	 *
+	 * @param $url url to set for service
+	 */
+	public function setURL($url)
+	{
+		$this->_url = $url;
+	}
+	
+	/**
+	 * This method returns the URL of the current request (without any ticket
+	 * CGI parameter).
+	 *
+	 * @return The URL
+	 */
+	public function getURL()
+	{
+		phpCAS::traceBegin();
+		// the URL is built when needed only
+		if ( empty($this->_url) ) {
+			$final_uri = '';
+			// remove the ticket if present in the URL
+			$final_uri = ($this->isHttps()) ? 'https' : 'http';
+			$final_uri .= '://';
+
+			$final_uri .= $this->getServerUrl();
+			$request_uri	= explode('?', $_SERVER['REQUEST_URI'], 2);
+			$final_uri		.= $request_uri[0];
+				
+			if (isset($request_uri[1]) && $request_uri[1])
+			{
+				$query_string	= $this->removeParameterFromQueryString('ticket', $request_uri[1]);
+
+				// If the query string still has anything left, append it to the final URI
+				if ($query_string !== '')
+				$final_uri	.= "?$query_string";
+
+			}
+				
+			phpCAS::trace("Final URI: $final_uri");
+			$this->setURL($final_uri);
+		}
+		phpCAS::traceEnd($this->_url);
+		return $this->_url;
+	}
+	
+
+	/**
+	 * Try to figure out the server URL with possible Proxys / Ports etc.
+	 * @return Server URL with domain:port
+	 */
+	private function getServerUrl(){
+		$server_url = '';
+		if(!empty($_SERVER['HTTP_X_FORWARDED_HOST'])){
+			// explode the host list separated by comma and use the first host
+			$hosts = explode(',', $_SERVER['HTTP_X_FORWARDED_HOST']);
+			$server_url = $hosts[0];
+		}else if(!empty($_SERVER['HTTP_X_FORWARDED_SERVER'])){
+			$server_url = $_SERVER['HTTP_X_FORWARDED_SERVER'];
+		}else{
+			if (empty($_SERVER['SERVER_NAME'])) {
+				$server_url = $_SERVER['HTTP_HOST'];
+			} else {
+				$server_url = $_SERVER['SERVER_NAME'];
+			}
+		}
+		if (!strpos($server_url, ':')) {
+			if ( ($this->isHttps() && $_SERVER['SERVER_PORT']!=443)
+			|| (!$this->isHttps() && $_SERVER['SERVER_PORT']!=80) ) {
+				$server_url .= ':';
+				$server_url .= $_SERVER['SERVER_PORT'];
+			}
+		}
+		return $server_url;
+	}
+
+	/**
+	 * This method checks to see if the request is secured via HTTPS
+	 * @return true if https, false otherwise
+	 */
+	private function isHttps() {
+		if ( isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * Removes a parameter from a query string
+	 *
+	 * @param string $parameterName
+	 * @param string $queryString
+	 * @return string
+	 *
+	 * @link http://stackoverflow.com/questions/1842681/regular-expression-to-remove-one-parameter-from-query-string
+	 */
+	private function removeParameterFromQueryString($parameterName, $queryString)
+	{
+		$parameterName	= preg_quote($parameterName);
+		return preg_replace("/&$parameterName(=[^&]*)?|^$parameterName(=[^&]*)?&?/", '', $queryString);
+	}
+	
+	/**
+	 * This method is used to append query parameters to an url. Since the url
+	 * might already contain parameter it has to be detected and to build a proper
+	 * URL
+	 * @param $url  base url to add the query params to
+	 * @param $query params in query form with & separated
+	 * @return url with query params 
+	 */
+	private function buildQueryUrl($url, $query) {
+		$url .= (strstr($url,'?') === FALSE) ? '?' : '&';
+		$url .= $query;
+		return $url;
+	}
+	
+	/**
+	 * Renaming the session
+	 */
+	private function renameSession($ticket)
+	{
+		phpCAS::traceBegin();
+		if($this->_start_session){
+			if (!empty ($this->_user))
+			{
+				$old_session = $_SESSION;
+				session_destroy();
+				// set up a new session, of name based on the ticket
+				$session_id = preg_replace('/[^\w]/', '', $ticket);
+				phpCAS :: trace("Session ID: ".$session_id);
+				session_id($session_id);
+				session_start();
+				phpCAS :: trace("Restoring old session vars");
+				$_SESSION = $old_session;
+			} else
+			{
+				phpCAS :: error('Session should only be renamed after successfull authentication');
+			}
+		}else{
+			phpCAS :: trace("Skipping session rename since phpCAS is not handling the session.");
+		}
+		phpCAS::traceEnd();
+	}
+
+	
+	// ########################################################################
+	//  AUTHENTICATION ERROR HANDLING
+	// ########################################################################
+	/**
+	* This method is used to print the HTML output when the user was not authenticated.
+	*
+	* @param $failure the failure that occured
+	* @param $cas_url the URL the CAS server was asked for
+	* @param $no_response the response from the CAS server (other
+	* parameters are ignored if TRUE)
+	* @param $bad_response bad response from the CAS server ($err_code
+	* and $err_msg ignored if TRUE)
+	* @param $cas_response the response of the CAS server
+	* @param $err_code the error code given by the CAS server
+	* @param $err_msg the error message given by the CAS server
+	*/
+	private function authError($failure,$cas_url,$no_response,$bad_response='',$cas_response='',$err_code='',$err_msg='')
+	{
+		phpCAS::traceBegin();
+
+		$this->printHTMLHeader($this->getString(CAS_STR_AUTHENTICATION_FAILED));
+		printf($this->getString(CAS_STR_YOU_WERE_NOT_AUTHENTICATED),htmlentities($this->getURL()),$_SERVER['SERVER_ADMIN']);
+		phpCAS::trace('CAS URL: '.$cas_url);
+		phpCAS::trace('Authentication failure: '.$failure);
+		if ( $no_response ) {
+			phpCAS::trace('Reason: no response from the CAS server');
+		} else {
+			if ( $bad_response ) {
+				phpCAS::trace('Reason: bad response from the CAS server');
+			} else {
+				switch ($this->getServerVersion()) {
+					case CAS_VERSION_1_0:
+						phpCAS::trace('Reason: CAS error');
+						break;
+					case CAS_VERSION_2_0:
+						if ( empty($err_code) )
+						phpCAS::trace('Reason: no CAS error');
+						else
+						phpCAS::trace('Reason: ['.$err_code.'] CAS error: '.$err_msg);
+						break;
+				}
+			}
+			phpCAS::trace('CAS response: '.$cas_response);
+		}
+		$this->printHTMLFooter();
+		phpCAS::traceExit();
+
+		if ($this->_exitOnAuthError)
+		exit();
+	}
+
+	/** @} */
+}
+
+?>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/CookieJar.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/CookieJar.php
new file mode 100644
index 00000000..b45daba3
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/CookieJar.php
@@ -0,0 +1,329 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright notice,
+ *       this list of conditions and the following disclaimer in the documentation
+ *       and/or other materials provided with the distribution.
+ *     * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *       Collaborative nor the names of its contributors may be used to endorse or
+ *       promote products derived from this software without specific prior
+ *       written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+include_once(dirname(__FILE__).'/InvalidArgumentException.php');
+
+/**
+ * This class provides access to service cookies and handles parsing of response
+ * headers to pull out cookie values.
+ *
+ */
+class CAS_CookieJar {
+
+	private $_cookies;
+
+	/**
+	 * Create a new cookie jar by passing it a reference to an array in which it
+	 * should store cookies.
+	 *
+	 * @param ref array $storageArray
+	 * @return void
+	 */
+	public function __construct (array &$storageArray) {
+		$this->_cookies =& $storageArray;
+	}
+
+	/**
+	 * Store cookies for a web service request.
+	 * Cookie storage is based on RFC 2965: http://www.ietf.org/rfc/rfc2965.txt
+	 *
+	 * @param string $request_url The URL that generated the response headers.
+	 * @param array $response_headers An array of the HTTP response header strings.
+	 *
+	 * @return void
+	 *
+	 * @access private
+	 */
+	public function storeCookies ($request_url, $response_headers) {
+		$urlParts = parse_url($request_url);
+		$defaultDomain = $urlParts['host'];
+
+		$cookies = $this->parseCookieHeaders($response_headers, $defaultDomain);
+
+		// var_dump($cookies);
+		foreach ($cookies as $cookie) {
+			// Enforce the same-origin policy by verifying that the cookie
+			// would match the url that is setting it
+			if (!$this->cookieMatchesTarget($cookie, $urlParts))
+				continue;
+
+			// store the cookie
+			$this->storeCookie($cookie);
+
+			phpCAS::trace($cookie['name'].' -> '.$cookie['value']);
+		}
+	}
+
+	/**
+	 * Retrieve cookies applicable for a web service request.
+	 * Cookie applicability is based on RFC 2965: http://www.ietf.org/rfc/rfc2965.txt
+	 *
+	 * @param string $request_url The url that the cookies will be for.
+	 *
+	 * @return array An array containing cookies. E.g. array('name' => 'val');
+	 *
+	 * @access private
+	 */
+	public function getCookies ($request_url) {
+		if (!count($this->_cookies))
+			return array();
+
+		// If our request URL can't be parsed, no cookies apply.
+		$target = parse_url($request_url);
+		if ($target === FALSE)
+			return array();
+
+		$this->expireCookies();
+
+		$matching_cookies = array();
+		foreach ($this->_cookies as $key => $cookie) {
+			if ($this->cookieMatchesTarget($cookie, $target)) {
+				$matching_cookies[$cookie['name']] = $cookie['value'];
+			}
+		}
+		return $matching_cookies;
+	}
+
+
+	/**
+	 * Parse Cookies without PECL
+	 * From the comments in http://php.net/manual/en/function.http-parse-cookie.php
+	 * @param array $header 	An array of header lines.
+	 * @param string $defaultDomain 	The domain to use if none is specified in the cookie.
+	 * @return array of cookies
+	 */
+	protected function parseCookieHeaders( $header, $defaultDomain ) {
+		phpCAS::traceBegin();
+		$cookies = array();
+		foreach( $header as $line ) {
+			if( preg_match( '/^Set-Cookie2?: /i', $line ) ) {
+				$cookies[] = $this->parseCookieHeader($line, $defaultDomain);
+			}
+		}
+
+		phpCAS::traceEnd($cookies);
+		return $cookies;
+	}
+
+	/**
+	 * Parse a single cookie header line.
+	 *
+	 * Based on RFC2965 http://www.ietf.org/rfc/rfc2965.txt
+	 *
+	 * @param string $line The header line.
+	 * @param string $defaultDomain The domain to use if none is specified in the cookie.
+	 * @return array
+	 */
+	protected function parseCookieHeader ($line, $defaultDomain) {
+		if (!$defaultDomain)
+			throw new CAS_InvalidArgumentException('$defaultDomain was not provided.');
+
+		// Set our default values
+		$cookie = array(
+			'domain' => $defaultDomain,
+			'path' => '/',
+			'secure' => false,
+		);
+
+		$line = preg_replace( '/^Set-Cookie2?: /i', '', trim( $line ) );
+
+		// trim any trailing semicolons.
+		$line = trim($line, ';');
+
+		phpCAS::trace("Cookie Line: $line");
+
+		// This implementation makes the assumption that semicolons will not
+		// be present in quoted attribute values. While attribute values that
+		// contain semicolons are allowed by RFC2965, they are hopefully rare
+		// enough to ignore for our purposes. Most browsers make the same 
+		// assumption.
+		$attributeStrings = explode( ';', $line );
+
+		foreach( $attributeStrings as $attributeString ) {
+			// split on the first equals sign and use the rest as value
+			$attributeParts = explode( '=', $attributeString, 2);
+
+			$attributeName = trim($attributeParts[0]);
+			$attributeNameLC = strtolower($attributeName);
+
+			if (isset($attributeParts[1])) {
+				$attributeValue = trim($attributeParts[1]);
+				// Values may be quoted strings.
+				if (strpos($attributeValue, '"') === 0) {
+					$attributeValue = trim($attributeValue, '"');
+					// unescape any escaped quotes:
+					$attributeValue = str_replace('\"', '"', $attributeValue);
+				}
+			} else {
+				$attributeValue = null;
+			}
+
+			switch ($attributeNameLC) {
+				case 'expires':
+					$cookie['expires'] = strtotime($attributeValue);
+					break;
+				case 'max-age':
+					$cookie['max-age'] = (int)$attributeValue;
+					// Set an expiry time based on the max-age
+					if ($cookie['max-age'])
+						$cookie['expires'] = time() + $cookie['max-age'];
+					// If max-age is zero, then the cookie should be removed imediately
+					// so set an expiry before now.
+					else
+						$cookie['expires'] = time() - 1;
+					break;
+				case 'secure':
+					$cookie['secure'] = true;
+					break;
+				case 'domain':
+				case 'path':
+				case 'port':
+				case 'version':
+				case 'comment':
+				case 'commenturl':
+				case 'discard':
+				case 'httponly':
+					$cookie[$attributeNameLC] = $attributeValue;
+					break;
+				default:
+					$cookie['name'] = $attributeName;
+					$cookie['value'] = $attributeValue;
+			}
+		}
+
+		return $cookie;
+	}
+
+	/**
+	 * Add, update, or remove a cookie.
+	 *
+	 * @param array $cookie A cookie array as created by parseCookieHeaders()
+	 *
+	 * @return void
+	 *
+	 * @access private
+	 */
+	protected function storeCookie ($cookie) {
+		// Discard any old versions of this cookie.
+		$this->discardCookie($cookie);
+		$this->_cookies[] = $cookie;
+
+	}
+
+	/**
+	 * Discard an existing cookie
+	 *
+	 * @param stdClass $cookie
+	 *
+	 * @return void
+	 *
+	 * @access private
+	 */
+	protected function discardCookie ($cookie) {
+		if (!isset($cookie['domain']) || !isset($cookie['path']) || !isset($cookie['path']))
+			throw new CAS_InvalidArgumentException('Invalid Cookie array passed.');
+
+		foreach ($this->_cookies as $key => $old_cookie) {
+			if ($cookie['domain'] == $old_cookie['domain']
+			&& $cookie['path'] == $old_cookie['path']
+			&& $cookie['name'] == $old_cookie['name'])
+			{
+				unset($this->_cookies[$key]);
+			}
+		}
+	}
+
+	/**
+	 * Go through our stored cookies and remove any that are expired.
+	 *
+	 * @return void
+	 *
+	 * @access private
+	 */
+	protected function expireCookies () {
+		foreach ($this->_cookies as $key => $cookie) {
+			if (isset($cookie['expires']) && $cookie['expires'] < time()) {
+				unset($this->_cookies[$key]);
+			}
+		}
+	}
+
+	/**
+	 * Answer true if cookie is applicable to a target.
+	 *
+	 * @param array $cookie An array of cookie attributes.
+	 * @param array $target An array of URL attributes as generated by parse_url().
+	 *
+	 * @return boolean
+	 *
+	 * @access private
+	 */
+	protected function cookieMatchesTarget ($cookie, $target) {
+		if (!is_array($target))
+			throw new CAS_InvalidArgumentException('$target must be an array of URL attributes as generated by parse_url().');
+		if (!isset($target['host']))
+			throw new CAS_InvalidArgumentException('$target must be an array of URL attributes as generated by parse_url().');
+
+		// Verify that the scheme matches
+		if ($cookie['secure'] && $target['scheme'] != 'https')
+		return false;
+		
+		// Verify that the host matches
+		// Match domain and mulit-host cookies
+		if (strpos($cookie['domain'], '.') === 0) {
+			// check that the target host a.b.c.edu is within .b.c.edu
+			$pos = strripos($target['host'], $cookie['domain']);
+			if (!$pos)
+			return false;
+			// verify that the cookie domain is the last part of the host.
+			if ($pos + strlen($cookie['domain']) != strlen($target['host']))
+			return false;
+		}
+		// If the cookie host doesn't begin with '.', the host must case-insensitive
+		// match exactly
+		else {
+			if (strcasecmp($target['host'], $cookie['domain']) !== 0)
+			return false;
+		}
+
+		// Verify that the port matches
+		if (isset($cookie['ports']) && !in_array($target['port'], $cookie['ports']))
+		return false;
+
+		// Verify that the path matches
+		if (strpos($target['path'], $cookie['path']) !== 0)
+		return false;
+
+		return true;
+	}
+
+}
+
+?>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/Exception.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/Exception.php
new file mode 100644
index 00000000..3f49c5ee
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/Exception.php
@@ -0,0 +1,51 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *		 * Redistributions of source code must retain the above copyright notice,
+ *			 this list of conditions and the following disclaimer.
+ *		 * Redistributions in binary form must reproduce the above copyright notice,
+ *			 this list of conditions and the following disclaimer in the documentation
+ *			 and/or other materials provided with the distribution.
+ *		 * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *			 Collaborative nor the names of its contributors may be used to endorse or
+ *			 promote products derived from this software without specific prior
+ *			 written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+/**
+ * A root exception interface for all exceptions in phpCAS.
+ *
+ * All exceptions thrown in phpCAS should implement this interface to allow them
+ * to be caught as a category by clients. Each phpCAS exception should extend
+ * an appropriate SPL exception class that best fits its type.
+ *
+ * For example, an InvalidArgumentException in phpCAS should be defined as
+ *
+ *		class CAS_InvalidArgumentException 
+ *			extends InvalidArgumentException 
+ *			implements CAS_Exception
+ *		{ }
+ *
+ * This definition allows the CAS_InvalidArgumentException to be caught as either 
+ * an InvalidArgumentException or as a CAS_Exception.
+ */
+interface CAS_Exception {
+
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/InvalidArgumentException.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/InvalidArgumentException.php
new file mode 100644
index 00000000..1a61fb28
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/InvalidArgumentException.php
@@ -0,0 +1,41 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *		 * Redistributions of source code must retain the above copyright notice,
+ *			 this list of conditions and the following disclaimer.
+ *		 * Redistributions in binary form must reproduce the above copyright notice,
+ *			 this list of conditions and the following disclaimer in the documentation
+ *			 and/or other materials provided with the distribution.
+ *		 * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *			 Collaborative nor the names of its contributors may be used to endorse or
+ *			 promote products derived from this software without specific prior
+ *			 written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+require_once(dirname(__FILE__).'/Exception.php');
+
+/**
+ * Exception that denotes invalid arguments were passed. 
+ */
+class CAS_InvalidArgumentException
+	extends InvalidArgumentException
+	implements CAS_Exception
+{
+
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/OutOfSequenceException.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/OutOfSequenceException.php
new file mode 100644
index 00000000..a88d08cc
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/OutOfSequenceException.php
@@ -0,0 +1,44 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *		 * Redistributions of source code must retain the above copyright notice,
+ *			 this list of conditions and the following disclaimer.
+ *		 * Redistributions in binary form must reproduce the above copyright notice,
+ *			 this list of conditions and the following disclaimer in the documentation
+ *			 and/or other materials provided with the distribution.
+ *		 * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *			 Collaborative nor the names of its contributors may be used to endorse or
+ *			 promote products derived from this software without specific prior
+ *			 written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+require_once(dirname(__FILE__).'/Exception.php');
+
+/**
+ * This class defines Exceptions that should be thrown when the sequence of operations
+ * is invalid. Examples are:
+ *		- Requesting the response before executing a request.
+ *		- Changing the URL of a request after executing the request.
+ */
+class CAS_OutOfSequenceException
+	extends BadMethodCallException
+	implements CAS_Exception
+{
+
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/PGTStorage/AbstractStorage.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/PGTStorage/AbstractStorage.php
new file mode 100644
index 00000000..d430e254
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/PGTStorage/AbstractStorage.php
@@ -0,0 +1,215 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright notice,
+ *       this list of conditions and the following disclaimer in the documentation
+ *       and/or other materials provided with the distribution.
+ *     * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *       Collaborative nor the names of its contributors may be used to endorse or
+ *       promote products derived from this software without specific prior
+ *       written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/**
+ * @file CAS/PGTStorage/AbstractStorage.php
+ * Basic class for PGT storage
+ */
+
+/**
+ * @class CAS_PGTStorage_AbstractStorage
+ * The CAS_PGTStorage_AbstractStorage class is a generic class for PGT storage. This class should
+ * not be instanciated itself but inherited by specific PGT storage classes.
+ *
+ * @author   Pascal Aubry <pascal.aubry at univ-rennes1.fr>
+ *
+ * @ingroup internalPGTStorage
+ */
+
+abstract class CAS_PGTStorage_AbstractStorage
+{
+	/**
+	 * @addtogroup internalPGTStorage
+	 * @{
+	 */
+
+	// ########################################################################
+	//  CONSTRUCTOR
+	// ########################################################################
+
+	/**
+	 * The constructor of the class, should be called only by inherited classes.
+	 *
+	 * @param $cas_parent the CASclient instance that creates the current object.
+	 *
+	 * @protected
+	 */
+	function __construct($cas_parent)
+	{
+		phpCAS::traceBegin();
+		if ( !$cas_parent->isProxy() ) {
+			phpCAS::error('defining PGT storage makes no sense when not using a CAS proxy');
+		}
+		phpCAS::traceEnd();
+	}
+
+	// ########################################################################
+	//  DEBUGGING
+	// ########################################################################
+
+	/**
+	 * This virtual method returns an informational string giving the type of storage
+	 * used by the object (used for debugging purposes).
+	 *
+	 * @public
+	 */
+	function getStorageType()
+	{
+		phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called');
+	}
+
+	/**
+	 * This virtual method returns an informational string giving informations on the
+	 * parameters of the storage.(used for debugging purposes).
+	 *
+	 * @public
+	 */
+	function getStorageInfo()
+	{
+		phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called');
+	}
+
+	// ########################################################################
+	//  ERROR HANDLING
+	// ########################################################################
+
+	/**
+	 * string used to store an error message. Written by PGTStorage::setErrorMessage(),
+	 * read by PGTStorage::getErrorMessage().
+	 *
+	 * @hideinitializer
+	 * @private
+	 * @deprecated not used.
+	 */
+	var $_error_message=FALSE;
+
+	/**
+	 * This method sets en error message, which can be read later by
+	 * PGTStorage::getErrorMessage().
+	 *
+	 * @param $error_message an error message
+	 *
+	 * @protected
+	 * @deprecated not used.
+	 */
+	function setErrorMessage($error_message)
+	{
+		$this->_error_message = $error_message;
+	}
+
+	/**
+	 * This method returns an error message set by PGTStorage::setErrorMessage().
+	 *
+	 * @return an error message when set by PGTStorage::setErrorMessage(), FALSE
+	 * otherwise.
+	 *
+	 * @public
+	 * @deprecated not used.
+	 */
+	function getErrorMessage()
+	{
+		return $this->_error_message;
+	}
+
+	// ########################################################################
+	//  INITIALIZATION
+	// ########################################################################
+
+	/**
+	 * a boolean telling if the storage has already been initialized. Written by
+	 * PGTStorage::init(), read by PGTStorage::isInitialized().
+	 *
+	 * @hideinitializer
+	 * @private
+	 */
+	var $_initialized = FALSE;
+
+	/**
+	 * This method tells if the storage has already been intialized.
+	 *
+	 * @return a boolean
+	 *
+	 * @protected
+	 */
+	function isInitialized()
+	{
+		return $this->_initialized;
+	}
+
+	/**
+	 * This virtual method initializes the object.
+	 *
+	 * @protected
+	 */
+	function init()
+	{
+		$this->_initialized = TRUE;
+	}
+
+	// ########################################################################
+	//  PGT I/O
+	// ########################################################################
+
+	/**
+	 * This virtual method stores a PGT and its corresponding PGT Iuo.
+	 * @note Should never be called.
+	 *
+	 * @param $pgt the PGT
+	 * @param $pgt_iou the PGT iou
+	 *
+	 * @protected
+	 */
+	function write($pgt,$pgt_iou)
+	{
+		phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called');
+	}
+
+	/**
+	 * This virtual method reads a PGT corresponding to a PGT Iou and deletes
+	 * the corresponding storage entry.
+	 * @note Should never be called.
+	 *
+	 * @param $pgt_iou the PGT iou
+	 *
+	 * @protected
+	 */
+	function read($pgt_iou)
+	{
+		phpCAS::error(__CLASS__.'::'.__FUNCTION__.'() should never be called');
+	}
+
+	/** @} */
+
+}
+
+// include specific PGT storage classes
+include_once(dirname(__FILE__).'/Db.php');
+include_once(dirname(__FILE__).'/File.php');
+
+?>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/PGTStorage/Db.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/PGTStorage/Db.php
new file mode 100644
index 00000000..2bfce159
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/PGTStorage/Db.php
@@ -0,0 +1,400 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright notice,
+ *       this list of conditions and the following disclaimer in the documentation
+ *       and/or other materials provided with the distribution.
+ *     * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *       Collaborative nor the names of its contributors may be used to endorse or
+ *       promote products derived from this software without specific prior
+ *       written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/**
+ * @file CAS/PGTStorage/Db.php
+ * Basic class for PGT database storage
+ */
+
+/**
+ * @class CAS_PGTStorage_Db
+ * The CAS_PGTStorage_Db class is a class for PGT database storage.
+ *
+ * @author Daniel Frett <daniel.frett at gmail.com>
+ *
+ * @ingroup internalPGTStorageDb
+ */
+
+define('CAS_PGT_STORAGE_DB_DEFAULT_TABLE', 'cas_pgts');
+
+class CAS_PGTStorage_Db extends CAS_PGTStorage_AbstractStorage
+{
+	/**
+	 * @addtogroup internalCAS_PGTStorageDb
+	 * @{
+	 */
+
+	/**
+	 * the PDO object to use for database interactions
+	 */
+	private $_pdo;
+
+	/**
+	 * This method returns the PDO object to use for database interactions.
+	 *
+	 * @return the PDO object
+	 */
+	private function getPdo()
+	{
+		return $this->_pdo;
+	}
+
+	/**
+	 * database connection options to use when creating a new PDO object
+	 */
+	private $_dsn;
+	private $_username;
+	private $_password;
+	private $_table_options;
+
+	/**
+	 * the table to use for storing/retrieving pgt's
+	 */
+	private $_table;
+
+	/**
+	 * This method returns the table to use when storing/retrieving PGT's
+	 *
+	 * @return the name of the pgt storage table.
+	 */
+	private function getTable()
+	{
+		return $this->_table;
+	}
+
+	// ########################################################################
+	//  DEBUGGING
+	// ########################################################################
+
+	/**
+	 * This method returns an informational string giving the type of storage
+	 * used by the object (used for debugging purposes).
+	 *
+	 * @return an informational string.
+	 */
+	public function getStorageType()
+	{
+		return "db";
+	}
+
+	/**
+	 * This method returns an informational string giving informations on the
+	 * parameters of the storage.(used for debugging purposes).
+	 *
+	 * @return an informational string.
+	 * @public
+	 */
+	public function getStorageInfo()
+	{
+		return 'table=`'.$this->getTable().'\'';
+	}
+
+	// ########################################################################
+	//  CONSTRUCTOR
+	// ########################################################################
+
+	/**
+	 * The class constructor.
+	 *
+	 * @param $cas_parent the CAS_Client instance that creates the object.
+	 * @param $dsn_or_pdo a dsn string to use for creating a PDO object or a PDO object
+	 * @param $username the username to use when connecting to the database
+	 * @param $password the password to use when connecting to the database
+	 * @param $table the table to use for storing and retrieving PGT's
+	 * @param $driver_options any driver options to use when connecting to the database
+	 */
+	public function __construct($cas_parent, $dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)
+	{
+		phpCAS::traceBegin();
+		// call the ancestor's constructor
+		parent::__construct($cas_parent);
+
+		// set default values
+		if ( empty($table) ) $table = CAS_PGT_STORAGE_DB_DEFAULT_TABLE;
+		if ( !is_array($driver_options) ) $driver_options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
+
+		// store the specified parameters
+		if($dsn_or_pdo instanceof PDO) {
+			$this->_pdo = $dsn_or_pdo;
+		}
+		else {
+			$this->_dsn = $dsn_or_pdo;
+			$this->_username = $username;
+			$this->_password = $password;
+			$this->_driver_options = $driver_options;
+		}
+
+		// store the table name
+		$this->_table = $table;
+
+		phpCAS::traceEnd();
+	}
+
+	// ########################################################################
+	//  INITIALIZATION
+	// ########################################################################
+
+	/**
+	 * This method is used to initialize the storage. Halts on error.
+	 */
+	public function init()
+	{
+		phpCAS::traceBegin();
+		// if the storage has already been initialized, return immediatly
+		if ( $this->isInitialized() )
+		return;
+
+		// initialize the base object
+		parent::init();
+
+		// create the PDO object if it doesn't exist already
+		if(!($this->_pdo instanceof PDO)) {
+			try {
+				$this->_pdo = new PDO($this->_dsn, $this->_username, $this->_password, $this->_driver_options);
+			}
+			catch(PDOException $e) {
+				phpCAS::error('Database connection error: ' . $e->getMessage());
+			}
+		}
+		
+		phpCAS::traceEnd();
+	}
+
+	// ########################################################################
+	//  PDO database interaction
+	// ########################################################################
+
+	/**
+	 * attribute that stores the previous error mode for the PDO handle while processing a transaction
+	 */
+	private $_errMode;
+
+	/**
+	 * This method will enable the Exception error mode on the PDO object
+	 */
+	private function setErrorMode()
+	{
+		// get PDO object and enable exception error mode
+		$pdo = $this->getPdo();
+		$this->_errMode = $pdo->getAttribute(PDO::ATTR_ERRMODE);
+		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+	}
+
+	/**
+	 * this method will reset the error mode on the PDO object
+	 */
+	private function resetErrorMode()
+	{
+		// get PDO object and reset the error mode to what it was originally
+		$pdo = $this->getPdo();
+		$pdo->setAttribute(PDO::ATTR_ERRMODE, $this->_errMode);
+	}
+
+	// ########################################################################
+	//  database queries
+	// ########################################################################
+	// these queries are potentially unsafe because the person using this library
+	// can set the table to use, but there is no reliable way to escape SQL
+	// fieldnames in PDO yet
+
+	/**
+	 * This method returns the query used to create a pgt storage table
+	 *
+	 * @return the create table SQL, no bind params in query
+	 */
+	protected function _createTableSql()
+	{
+		return 'CREATE TABLE ' . $this->getTable() . ' (pgt_iou VARCHAR(255) NOT NULL PRIMARY KEY, pgt VARCHAR(255) NOT NULL)';
+	}
+
+	/**
+	 * This method returns the query used to store a pgt
+	 *
+	 * @return the store PGT SQL, :pgt and :pgt_iou are the bind params contained in the query
+	 */
+	protected function _storePgtSql()
+	{
+		return 'INSERT INTO ' . $this->getTable() . ' (pgt_iou, pgt) VALUES (:pgt_iou, :pgt)';
+	}
+
+	/**
+	 * This method returns the query used to retrieve a pgt. the first column of the first row should contain the pgt
+	 *
+	 * @return the retrieve PGT SQL, :pgt_iou is the only bind param contained in the query
+	 */
+	protected function _retrievePgtSql()
+	{
+		return 'SELECT pgt FROM ' . $this->getTable() . ' WHERE pgt_iou = :pgt_iou';
+	}
+
+	/**
+	 * This method returns the query used to delete a pgt.
+	 *
+	 * @return the delete PGT SQL, :pgt_iou is the only bind param contained in the query
+	 */
+	protected function _deletePgtSql()
+	{
+		return 'DELETE FROM ' . $this->getTable() . ' WHERE pgt_iou = :pgt_iou';
+	}
+
+	// ########################################################################
+	//  PGT I/O
+	// ########################################################################
+
+	/**
+	 * This method creates the database table used to store pgt's and pgtiou's
+	 */
+	public function createTable()
+	{
+		phpCAS::traceBegin();
+
+		// initialize the PDO object for this method
+		$pdo = $this->getPdo();
+		$this->setErrorMode();
+
+		try {
+			$pdo->beginTransaction();
+
+			$query = $pdo->query($this->_createTableSQL());
+			$query->closeCursor();
+
+			$pdo->commit();
+		}
+		catch(PDOException $e) {
+			// attempt rolling back the transaction before throwing a phpCAS error
+			try {
+				$pdo->rollBack();
+			}
+			catch(PDOException $e) {}
+			phpCAS::error('error creating PGT storage table: ' . $e->getMessage());
+		}
+
+		// reset the PDO object
+		$this->resetErrorMode();
+
+		phpCAS::traceEnd();
+	}
+
+	/**
+	 * This method stores a PGT and its corresponding PGT Iou in the database. Echoes a
+	 * warning on error.
+	 *
+	 * @param $pgt the PGT
+	 * @param $pgt_iou the PGT iou
+	 */
+	public function write($pgt, $pgt_iou)
+	{
+		phpCAS::traceBegin();
+
+		// initialize the PDO object for this method
+		$pdo = $this->getPdo();
+		$this->setErrorMode();
+
+		try {
+			$pdo->beginTransaction();
+
+			$query = $pdo->prepare($this->_storePgtSql());
+			$query->bindValue(':pgt', $pgt, PDO::PARAM_STR);
+			$query->bindValue(':pgt_iou', $pgt_iou, PDO::PARAM_STR);
+			$query->execute();
+			$query->closeCursor();
+
+			$pdo->commit();
+		}
+		catch(PDOException $e) {
+			// attempt rolling back the transaction before throwing a phpCAS error
+			try {
+				$pdo->rollBack();
+			}
+			catch(PDOException $e) {}
+			phpCAS::error('error writing PGT to database: ' . $e->getMessage());
+		}
+
+		// reset the PDO object
+		$this->resetErrorMode();
+
+		phpCAS::traceEnd();
+	}
+
+	/**
+	 * This method reads a PGT corresponding to a PGT Iou and deletes the
+	 * corresponding db entry.
+	 *
+	 * @param $pgt_iou the PGT iou
+	 *
+	 * @return the corresponding PGT, or FALSE on error
+	 */
+	public function read($pgt_iou)
+	{
+		phpCAS::traceBegin();
+		$pgt = FALSE;
+
+		// initialize the PDO object for this method
+		$pdo = $this->getPdo();
+		$this->setErrorMode();
+
+		try {
+			$pdo->beginTransaction();
+
+			// fetch the pgt for the specified pgt_iou
+			$query = $pdo->prepare($this->_retrievePgtSql());
+			$query->bindValue(':pgt_iou', $pgt_iou, PDO::PARAM_STR);
+			$query->execute();
+			$pgt = $query->fetchColumn(0);
+			$query->closeCursor();
+
+			// delete the specified pgt_iou from the database
+			$query = $pdo->prepare($this->_deletePgtSql());
+			$query->bindValue(':pgt_iou', $pgt_iou, PDO::PARAM_STR);
+			$query->execute();
+			$query->closeCursor();
+
+			$pdo->commit();
+		}
+		catch(PDOException $e) {
+			// attempt rolling back the transaction before throwing a phpCAS error
+			try {
+				$pdo->rollBack();
+			}
+			catch(PDOException $e) {}
+			phpCAS::trace('error reading PGT from database: ' . $e->getMessage());
+		}
+
+		// reset the PDO object
+		$this->resetErrorMode();
+
+		phpCAS::traceEnd();
+		return $pgt;
+	}
+
+	/** @} */
+
+}
+
+?>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/PGTStorage/File.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/PGTStorage/File.php
new file mode 100644
index 00000000..b997cc4d
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/PGTStorage/File.php
@@ -0,0 +1,251 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright notice,
+ *       this list of conditions and the following disclaimer in the documentation
+ *       and/or other materials provided with the distribution.
+ *     * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *       Collaborative nor the names of its contributors may be used to endorse or
+ *       promote products derived from this software without specific prior
+ *       written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/**
+ * @file CAS/PGTStorage/File.php
+ * Basic class for PGT file storage
+ */
+
+/**
+ * @class CAS_PGTStorage_File
+ * The CAS_PGTStorage_File class is a class for PGT file storage. An instance of
+ * this class is returned by CAS_Client::SetPGTStorageFile().
+ *
+ * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
+ *
+ * @ingroup internalPGTStorageFile
+ */
+
+class CAS_PGTStorage_File extends CAS_PGTStorage_AbstractStorage
+{
+	/**
+	 * @addtogroup internalPGTStorageFile
+	 * @{
+	 */
+
+	/**
+	 * a string telling where PGT's should be stored on the filesystem. Written by
+	 * PGTStorageFile::PGTStorageFile(), read by getPath().
+	 *
+	 * @private
+	 */
+	var $_path;
+
+	/**
+	 * This method returns the name of the directory where PGT's should be stored
+	 * on the filesystem.
+	 *
+	 * @return the name of a directory (with leading and trailing '/')
+	 *
+	 * @private
+	 */
+	function getPath()
+	{
+		return $this->_path;
+	}
+
+	// ########################################################################
+	//  DEBUGGING
+	// ########################################################################
+
+	/**
+	 * This method returns an informational string giving the type of storage
+	 * used by the object (used for debugging purposes).
+	 *
+	 * @return an informational string.
+	 * @public
+	 */
+	function getStorageType()
+	{
+		return "file";
+	}
+
+	/**
+	 * This method returns an informational string giving informations on the
+	 * parameters of the storage.(used for debugging purposes).
+	 *
+	 * @return an informational string.
+	 * @public
+	 */
+	function getStorageInfo()
+	{
+		return 'path=`'.$this->getPath().'\'';
+	}
+
+	// ########################################################################
+	//  CONSTRUCTOR
+	// ########################################################################
+
+	/**
+	 * The class constructor, called by CAS_Client::SetPGTStorageFile().
+	 *
+	 * @param $cas_parent the CAS_Client instance that creates the object.
+	 * @param $path the path where the PGT's should be stored
+	 *
+	 * @public
+	 */
+	function __construct($cas_parent,$path)
+	{
+		phpCAS::traceBegin();
+		// call the ancestor's constructor
+		parent::__construct($cas_parent);
+		
+		if (empty($path) ) $path = CAS_PGT_STORAGE_FILE_DEFAULT_PATH;
+		// check that the path is an absolute path
+		if (getenv("OS")=="Windows_NT"){
+			 
+			if (!preg_match('`^[a-zA-Z]:`', $path)) {
+				phpCAS::error('an absolute path is needed for PGT storage to file');
+			}
+			 
+		}
+		else
+		{
+
+			if ( $path[0] != '/' ) {
+				phpCAS::error('an absolute path is needed for PGT storage to file');
+			}
+
+			// store the path (with a leading and trailing '/')
+			$path = preg_replace('|[/]*$|','/',$path);
+			$path = preg_replace('|^[/]*|','/',$path);
+		}
+
+		$this->_path = $path;
+		phpCAS::traceEnd();
+	}
+
+	// ########################################################################
+	//  INITIALIZATION
+	// ########################################################################
+
+	/**
+	 * This method is used to initialize the storage. Halts on error.
+	 *
+	 * @public
+	 */
+	function init()
+	{
+		phpCAS::traceBegin();
+		// if the storage has already been initialized, return immediatly
+		if ( $this->isInitialized() )
+		return;
+		// call the ancestor's method (mark as initialized)
+		parent::init();
+		phpCAS::traceEnd();
+	}
+
+	// ########################################################################
+	//  PGT I/O
+	// ########################################################################
+
+	/**
+	 * This method returns the filename corresponding to a PGT Iou.
+	 *
+	 * @param $pgt_iou the PGT iou.
+	 *
+	 * @return a filename
+	 * @private
+	 */
+	function getPGTIouFilename($pgt_iou)
+	{
+		phpCAS::traceBegin();
+		$filename = $this->getPath().$pgt_iou.'.plain';
+		phpCAS::traceEnd($filename);
+		return $filename;
+	}
+
+	/**
+	 * This method stores a PGT and its corresponding PGT Iou into a file. Echoes a
+	 * warning on error.
+	 *
+	 * @param $pgt the PGT
+	 * @param $pgt_iou the PGT iou
+	 *
+	 * @public
+	 */
+	function write($pgt,$pgt_iou)
+	{
+		phpCAS::traceBegin();
+		$fname = $this->getPGTIouFilename($pgt_iou);
+		if(!file_exists($fname)){
+			if ($f=fopen($fname,"w") ) {
+				if ( fputs($f,$pgt) === FALSE ) {
+					phpCAS::error('could not write PGT to `'.$fname.'\'');
+				}
+				fclose($f);
+			} else {
+				phpCAS::error('could not open `'.$fname.'\'');
+			}
+		}else{
+			phpCAS::error('File exists: `'.$fname.'\'');
+		}
+		phpCAS::traceEnd();
+	}
+
+	/**
+	 * This method reads a PGT corresponding to a PGT Iou and deletes the
+	 * corresponding file.
+	 *
+	 * @param $pgt_iou the PGT iou
+	 *
+	 * @return the corresponding PGT, or FALSE on error
+	 *
+	 * @public
+	 */
+	function read($pgt_iou)
+	{
+		phpCAS::traceBegin();
+		$pgt = FALSE;
+		$fname = $this->getPGTIouFilename($pgt_iou);
+		if (file_exists($fname)){
+			if ( !($f=fopen($fname,"r")) ) {
+				phpCAS::trace('could not open `'.$fname.'\'');
+			} else {
+				if ( ($pgt=fgets($f)) === FALSE ) {
+					phpCAS::trace('could not read PGT from `'.$fname.'\'');
+				}
+				fclose($f);
+			}
+			
+			// delete the PGT file
+			@unlink($fname);
+		}else{
+			phpCAS::trace('No such file `'.$fname.'\'');
+		}
+		phpCAS::traceEnd($pgt);
+		return $pgt;
+	}
+
+	/** @} */
+
+}
+
+
+?>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService.php
new file mode 100644
index 00000000..5e488fa6
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService.php
@@ -0,0 +1,61 @@
+<?php
+/*
+ * Copyright � 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *		 * Redistributions of source code must retain the above copyright notice,
+ *			 this list of conditions and the following disclaimer.
+ *		 * Redistributions in binary form must reproduce the above copyright notice,
+ *			 this list of conditions and the following disclaimer in the documentation
+ *			 and/or other materials provided with the distribution.
+ *		 * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *			 Collaborative nor the names of its contributors may be used to endorse or
+ *			 promote products derived from this software without specific prior
+ *			 written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * This interface defines methods that allow proxy-authenticated service handlers
+ * to interact with phpCAS.
+ * 
+ * Proxy service handlers must implement this interface as well as call
+ * phpCAS::initializeProxiedService($this) at some point in their implementation.
+ *
+ * While not required, proxy-authenticated service handlers are encouraged to
+ * implement the CAS_ProxiedService_Testable interface to facilitate unit testing.
+ */
+interface CAS_ProxiedService {
+		
+	/**
+	 * Answer a service identifier (URL) for whom we should fetch a proxy ticket.
+	 * 
+	 * @return string
+	 * @throws Exception If no service url is available.
+	 */
+	public function getServiceUrl ();
+	
+	/**
+	 * Register a proxy ticket with the ProxiedService that it can use when making requests.
+	 * 
+	 * @param string $proxyTicket
+	 * @return void
+	 * @throws InvalidArgumentException If the $proxyTicket is invalid.
+	 * @throws CAS_OutOfSequenceException If called after a proxy ticket has already been initialized/set.
+	 */
+	public function setProxyTicket ($proxyTicket);
+	
+}
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Abstract.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Abstract.php
new file mode 100644
index 00000000..d05628a4
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Abstract.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ * Copyright � 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *		 * Redistributions of source code must retain the above copyright notice,
+ *			 this list of conditions and the following disclaimer.
+ *		 * Redistributions in binary form must reproduce the above copyright notice,
+ *			 this list of conditions and the following disclaimer in the documentation
+ *			 and/or other materials provided with the distribution.
+ *		 * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *			 Collaborative nor the names of its contributors may be used to endorse or
+ *			 promote products derived from this software without specific prior
+ *			 written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+require_once(dirname(__FILE__).'/../ProxiedService.php');
+require_once(dirname(__FILE__).'/Testable.php');
+include_once(dirname(__FILE__).'/../InvalidArgumentException.php');
+include_once(dirname(__FILE__).'/../OutOfSequenceException.php');
+
+
+/**
+ * This class implements common methods for ProxiedService implementations included
+ * with phpCAS.
+ */
+abstract class CAS_ProxiedService_Abstract
+	implements CAS_ProxiedService, CAS_ProxiedService_Testable
+{
+	
+	/**
+	 * The proxy ticket that can be used when making service requests.
+	 * @var string $_proxyTicket; 
+	 */
+	private $_proxyTicket;
+	
+	/**
+	 * Register a proxy ticket with the Proxy that it can use when making requests.
+	 * 
+	 * @param string $proxyTicket
+	 * @return void
+	 * @throws InvalidArgumentException If the $proxyTicket is invalid.
+	 * @throws CAS_OutOfSequenceException If called after a proxy ticket has already been initialized/set.
+	 */
+	public function setProxyTicket ($proxyTicket) {
+		if (empty($proxyTicket))
+			throw new CAS_InvalidArgumentException("Trying to initialize with an empty proxy ticket.");
+		if (!empty($this->_proxyTicket))
+			throw new CAS_OutOfSequenceException('Already initialized, cannot change the proxy ticket.');
+		
+		$this->_proxyTicket = $proxyTicket;
+	}
+	
+	/**
+	 * Answer the proxy ticket to be used when making requests.
+	 * 
+	 * @return string
+	 * @throws CAS_OutOfSequenceException If called before a proxy ticket has already been initialized/set.
+	 */
+	protected function getProxyTicket () {
+		if (empty($this->_proxyTicket))
+			throw new CAS_OutOfSequenceException('No proxy ticket yet. Call $this->initializeProxyTicket() to aquire the proxy ticket.');
+		
+		return $this->_proxyTicket;
+	}
+	
+	/**
+	 * @var CAS_Client $_casClient; 
+	 */
+	private $_casClient;
+	
+	/**
+	 * Use a particular CAS_Client->initializeProxiedService() rather than the 
+	 * static phpCAS::initializeProxiedService().
+	 *
+	 * This method should not be called in standard operation, but is needed for unit
+	 * testing.
+	 * 
+	 * @param CAS_Client $casClient
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after a proxy ticket has already been initialized/set.
+	 */
+	public function setCasClient (CAS_Client $casClient) {
+		if (!empty($this->_proxyTicket))
+			throw new CAS_OutOfSequenceException('Already initialized, cannot change the CAS_Client.');
+		
+		$this->_casClient = $casClient;
+	}
+	
+	/**
+	 * Fetch our proxy ticket.
+	 *
+	 * Descendent classes should call this method once their service URL is available
+	 * to initialize their proxy ticket.
+	 *
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after a proxy ticket has already been initialized.
+	 */
+	protected function initializeProxyTicket() {
+		if (!empty($this->_proxyTicket))
+			throw new CAS_OutOfSequenceException('Already initialized, cannot initialize again.');
+		
+		// Allow usage of a particular CAS_Client for unit testing.
+		if (empty($this->_casClient))
+			phpCAS::initializeProxiedService($this);
+		else
+			$this->_casClient->initializeProxiedService($this);
+	}
+	
+}
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Exception.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Exception.php
new file mode 100644
index 00000000..ffeaa552
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Exception.php
@@ -0,0 +1,41 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *		 * Redistributions of source code must retain the above copyright notice,
+ *			 this list of conditions and the following disclaimer.
+ *		 * Redistributions in binary form must reproduce the above copyright notice,
+ *			 this list of conditions and the following disclaimer in the documentation
+ *			 and/or other materials provided with the distribution.
+ *		 * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *			 Collaborative nor the names of its contributors may be used to endorse or
+ *			 promote products derived from this software without specific prior
+ *			 written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+require_once(dirname(__FILE__).'/../Exception.php');
+
+/**
+ * An Exception for problems communicating with a proxied service.
+ */
+class CAS_ProxiedService_Exception
+	extends Exception
+	implements CAS_Exception
+{
+
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Http.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Http.php
new file mode 100644
index 00000000..ea8a8fea
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Http.php
@@ -0,0 +1,82 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *		 * Redistributions of source code must retain the above copyright notice,
+ *			 this list of conditions and the following disclaimer.
+ *		 * Redistributions in binary form must reproduce the above copyright notice,
+ *			 this list of conditions and the following disclaimer in the documentation
+ *			 and/or other materials provided with the distribution.
+ *		 * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *			 Collaborative nor the names of its contributors may be used to endorse or
+ *			 promote products derived from this software without specific prior
+ *			 written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * This interface defines methods that clients should use for configuring, sending,
+ * and receiving proxied HTTP requests.
+ */
+interface CAS_ProxiedService_Http {
+	
+	/*********************************************************
+	 * Configure the Request
+	 *********************************************************/
+
+	/**
+	 * Set the URL of the Request
+	 *
+	 * @param string $url
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function setUrl ($url);
+	
+	/*********************************************************
+	 * 2. Send the Request
+	 *********************************************************/
+
+	/**
+	 * Perform the request.
+	 *
+	 * @return boolean TRUE on success, FALSE on failure.
+	 * @throws CAS_OutOfSequenceException If called multiple times.
+	 */
+	public function send ();
+
+	/*********************************************************
+	 * 3. Access the response
+	 *********************************************************/
+
+	/**
+	 * Answer the headers of the response.
+	 *
+	 * @return array An array of header strings.
+	 * @throws CAS_OutOfSequenceException If called before the Request has been sent.
+	 */
+	public function getResponseHeaders ();
+
+	/**
+	 * Answer the body of response.
+	 *
+	 * @return string
+	 * @throws CAS_OutOfSequenceException If called before the Request has been sent.
+	 */
+	public function getResponseBody ();
+	
+}
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Http/Abstract.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Http/Abstract.php
new file mode 100644
index 00000000..c3df57f0
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Http/Abstract.php
@@ -0,0 +1,308 @@
+<?php
+/*
+ * Copyright � 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *		 * Redistributions of source code must retain the above copyright notice,
+ *			 this list of conditions and the following disclaimer.
+ *		 * Redistributions in binary form must reproduce the above copyright notice,
+ *			 this list of conditions and the following disclaimer in the documentation
+ *			 and/or other materials provided with the distribution.
+ *		 * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *			 Collaborative nor the names of its contributors may be used to endorse or
+ *			 promote products derived from this software without specific prior
+ *			 written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+require_once(dirname(__FILE__).'/../Abstract.php');
+require_once(dirname(__FILE__).'/../Http.php');
+include_once(dirname(__FILE__).'/../Exception.php');
+include_once(dirname(__FILE__).'/../../InvalidArgumentException.php');
+include_once(dirname(__FILE__).'/../../OutOfSequenceException.php');
+
+
+/**
+ * This class implements common methods for ProxiedService implementations included
+ * with phpCAS.
+ */
+abstract class CAS_ProxiedService_Http_Abstract
+	extends CAS_ProxiedService_Abstract
+	implements CAS_ProxiedService_Http
+{
+	/**
+	 * The HTTP request mechanism talking to the target service.
+	 *
+	 * @var CAS_RequestInterface $_requestHandler
+	 */
+	protected $_requestHandler;
+	
+	/**
+	 * The storage mechanism for cookies set by the target service.
+	 *
+	 * @var CAS_CookieJar $_cookieJar
+	 */
+	private $_cookieJar;
+	
+	/**
+	 * Constructor.
+	 * 
+	 * @param CAS_RequestInterface $requestHandler
+	 * @param CAS_CookieJar $cookieJar
+	 * @return void
+	 */
+	public function __construct (CAS_RequestInterface $requestHandler, CAS_CookieJar $cookieJar) {
+		$this->_requestHandler = $requestHandler;
+		$this->_cookieJar = $cookieJar;
+	}
+	
+	/**
+	 * The target service url.
+	 * @var string $_url;
+	 */
+	private $_url;
+	
+	/**
+	 * Answer a service identifier (URL) for whom we should fetch a proxy ticket.
+	 * 
+	 * @return string
+	 * @throws Exception If no service url is available.
+	 */
+	public function getServiceUrl () {
+		if (empty($this->_url))
+			throw new CAS_ProxiedService_Exception('No URL set via '.get_class($this).'->setUrl($url).');
+		
+		return $this->_url;
+	}
+	
+	/*********************************************************
+	 * Configure the Request
+	 *********************************************************/
+
+	/**
+	 * Set the URL of the Request
+	 *
+	 * @param string $url
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function setUrl ($url) {
+		if ($this->hasBeenSent())
+			throw new CAS_OutOfSequenceException('Cannot set the URL, request already sent.');
+		if (!is_string($url))
+			throw new CAS_InvalidArgumentException('$url must be a string.');
+		
+		$this->_url = $url;
+	}
+	
+	/*********************************************************
+	 * 2. Send the Request
+	 *********************************************************/
+
+	/**
+	 * Perform the request.
+	 *
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called multiple times.
+	 * @throws CAS_ProxyTicketException If there is a proxy-ticket failure.
+	 *		The code of the Exception will be one of: 
+	 *			PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE 
+	 *			PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE
+	 *			PHPCAS_SERVICE_PT_FAILURE
+	 * @throws CAS_ProxiedService_Exception If there is a failure sending the request to the target service.
+	 */
+	public function send () {
+		if ($this->hasBeenSent())
+			throw new CAS_OutOfSequenceException('Cannot send, request already sent.');
+		
+		phpCAS::traceBegin();
+		
+		// Get our proxy ticket and append it to our URL.
+		$this->initializeProxyTicket();
+		$url = $this->getServiceUrl();
+		if ( strstr($url,'?') === FALSE ) {
+			$url = $url.'?ticket='.$this->getProxyTicket();
+		} else {
+			$url = $url.'&ticket='.$this->getProxyTicket();
+		}
+		
+		try {
+			$this->makeRequest($url);
+		} catch (Exception $e) {
+			phpCAS::traceEnd();
+			throw $e;
+		}
+	}
+	
+	/**
+	 * Indicator of the number of requests (including redirects performed.
+	 *
+	 * @var int $_numRequests;  
+	 */
+	private $_numRequests = 0;
+	
+	/**
+	 * The response headers.
+	 *
+	 * @var array $_responseHeaders;  
+	 */
+	private $_responseHeaders = array();
+	
+	/**
+	 * The response status code.
+	 *
+	 * @var string $_responseStatusCode;  
+	 */
+	private $_responseStatusCode = '';
+	
+	/**
+	 * The response headers.
+	 *
+	 * @var string $_responseBody;  
+	 */
+	private $_responseBody = '';
+	
+	/**
+	 * Build and perform a request, following redirects
+	 * 
+	 * @param string $url
+	 * @return void
+	 * @throws CAS_ProxyTicketException If there is a proxy-ticket failure.
+	 *		The code of the Exception will be one of: 
+	 *			PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE 
+	 *			PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE
+	 *			PHPCAS_SERVICE_PT_FAILURE
+	 * @throws CAS_ProxiedService_Exception If there is a failure sending the request to the target service.
+	 */
+	protected function makeRequest ($url) {
+		// Verify that we are not in a redirect loop
+		$this->_numRequests++;
+		if ($this->_numRequests > 4) {
+			$message = 'Exceeded the maximum number of redirects (3) in proxied service request.';
+			phpCAS::trace($message);
+			throw new CAS_ProxiedService_Exception($message);
+		}
+		
+		// Create a new request.
+		$request = clone $this->_requestHandler;
+		$request->setUrl($url);
+		
+		// Add any cookies to the request.
+		$request->addCookies($this->_cookieJar->getCookies($url));
+		
+		// Add any other parts of the request needed by concrete classes
+		$this->populateRequest($request);
+		
+		// Perform the request.
+		phpCAS::trace('Performing proxied service request to \''.$url.'\'');
+		if (!$request->send()) {
+			$message = 'Could not perform proxied service request to URL`'.$url.'\'. '.$request->getErrorMessage();
+			phpCAS::trace($message);
+			throw new CAS_ProxiedService_Exception($message);
+		}
+		
+		// Store any cookies from the response;
+		$this->_cookieJar->storeCookies($url, $request->getResponseHeaders());
+		
+		// Follow any redirects
+		if ($redirectUrl = $this->getRedirectUrl($request->getResponseHeaders())) {
+			phpCAS :: trace('Found redirect:'.$redirectUrl);
+			$this->makeRequest($redirectUrl);
+		} else {
+			
+			$this->_responseHeaders = $request->getResponseHeaders();
+			$this->_responseBody = $request->getResponseBody();
+			$this->_responseStatusCode = $request->getResponseStatusCode();
+		}
+	}
+	
+	/**
+	 * Add any other parts of the request needed by concrete classes
+	 * 
+	 * @param CAS_RequestInterface $request
+	 * @return void
+	 */
+	abstract protected function populateRequest (CAS_RequestInterface $request);
+	
+	/**
+	 * Answer a redirect URL if a redirect header is found, otherwise null.
+	 * 
+	 * @param array $responseHeaders
+	 * @return string or null
+	 */
+	private function getRedirectUrl (array $responseHeaders) {
+		// Check for the redirect after authentication
+		foreach($responseHeaders as $header){
+			if (preg_match('/^(Location:|URI:)\s*([^\s]+.*)$/', $header, $matches)) {
+				return trim(array_pop($matches));
+			}
+		}
+		return null;
+	}
+
+	/*********************************************************
+	 * 3. Access the response
+	 *********************************************************/
+	
+	/**
+	 * Answer true if our request has been sent yet.
+	 * 
+	 * @return boolean
+	 */
+	protected function hasBeenSent () {
+		return ($this->_numRequests > 0);
+	}
+
+	/**
+	 * Answer the headers of the response.
+	 *
+	 * @return array An array of header strings.
+	 * @throws CAS_OutOfSequenceException If called before the Request has been sent.
+	 */
+	public function getResponseHeaders () {
+		if (!$this->hasBeenSent())
+			throw new CAS_OutOfSequenceException('Cannot access response, request not sent yet.');
+		
+		return $this->_responseHeaders;
+	}
+	
+	/**
+	 * Answer HTTP status code of the response
+	 *
+	 * @return integer
+	 * @throws CAS_OutOfSequenceException If called before the Request has been sent.
+	 */
+	public function getResponseStatusCode () {
+		if (!$this->hasBeenSent())
+			throw new CAS_OutOfSequenceException('Cannot access response, request not sent yet.');
+		
+		return $this->_responseStatusCode;
+	}
+
+	/**
+	 * Answer the body of response.
+	 *
+	 * @return string
+	 * @throws CAS_OutOfSequenceException If called before the Request has been sent.
+	 */
+	public function getResponseBody () {
+		if (!$this->hasBeenSent())
+			throw new CAS_OutOfSequenceException('Cannot access response, request not sent yet.');
+		
+		return $this->_responseBody;
+	}
+	
+}
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Http/Get.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Http/Get.php
new file mode 100644
index 00000000..7239d37d
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Http/Get.php
@@ -0,0 +1,80 @@
+<?php
+/*
+ * Copyright � 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *		 * Redistributions of source code must retain the above copyright notice,
+ *			 this list of conditions and the following disclaimer.
+ *		 * Redistributions in binary form must reproduce the above copyright notice,
+ *			 this list of conditions and the following disclaimer in the documentation
+ *			 and/or other materials provided with the distribution.
+ *		 * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *			 Collaborative nor the names of its contributors may be used to endorse or
+ *			 promote products derived from this software without specific prior
+ *			 written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+require_once(dirname(__FILE__).'/Abstract.php');
+
+/**
+ * This class is used to make proxied service requests via the HTTP GET method.
+ *
+ * Usage Example:
+ *		
+ *			try {
+ * 				$service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_GET);
+ * 				$service->setUrl('http://www.example.com/path/');
+ * 				$service->send();
+ *				if ($service->getResponseStatusCode() == 200)
+ *					return $service->getResponseBody();
+ *				else
+ *					// The service responded with an error code 404, 500, etc.
+ *					throw new Exception('The service responded with an error.');
+ *				
+ *			} catch (CAS_ProxyTicketException $e) {
+ *				if ($e->getCode() == PHPCAS_SERVICE_PT_FAILURE)
+ *					return "Your login has timed out. You need to log in again.";
+ *				else
+ *					// Other proxy ticket errors are from bad request format (shouldn't happen)
+ *					// or CAS server failure (unlikely) so lets just stop if we hit those.
+ *					throw $e; 
+ *			} catch (CAS_ProxiedService_Exception $e) {
+ *				// Something prevented the service request from being sent or received.
+ *				// We didn't even get a valid error response (404, 500, etc), so this
+ *				// might be caused by a network error or a DNS resolution failure.
+ *				// We could handle it in some way, but for now we will just stop.
+ *				throw $e;
+ *			}
+ *
+ */
+class CAS_ProxiedService_Http_Get
+	extends CAS_ProxiedService_Http_Abstract
+{
+	
+	/**
+	 * Add any other parts of the request needed by concrete classes
+	 * 
+	 * @param CAS_RequestInterface $request
+	 * @return void
+	 */
+	protected function populateRequest (CAS_RequestInterface $request) {
+		// do nothing, since the URL has already been sent and that is our
+		// only data.
+	}
+
+	
+}
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Http/Post.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Http/Post.php
new file mode 100644
index 00000000..f80d3cf0
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Http/Post.php
@@ -0,0 +1,133 @@
+<?php
+/*
+ * Copyright � 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *		 * Redistributions of source code must retain the above copyright notice,
+ *			 this list of conditions and the following disclaimer.
+ *		 * Redistributions in binary form must reproduce the above copyright notice,
+ *			 this list of conditions and the following disclaimer in the documentation
+ *			 and/or other materials provided with the distribution.
+ *		 * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *			 Collaborative nor the names of its contributors may be used to endorse or
+ *			 promote products derived from this software without specific prior
+ *			 written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+require_once(dirname(__FILE__).'/Abstract.php');
+include_once(dirname(__FILE__).'/../Exception.php');
+include_once(dirname(__FILE__).'/../../InvalidArgumentException.php');
+include_once(dirname(__FILE__).'/../../OutOfSequenceException.php');
+
+/**
+ * This class is used to make proxied service requests via the HTTP POST method.
+ *
+ * Usage Example:
+ *		
+ *			try {
+ * 				$service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_POST);
+ * 				$service->setUrl('http://www.example.com/path/');
+ *				$service->setContentType('text/xml');
+ *				$service->setBody(''<?xml version="1.0"?'.'><methodCall><methodName>example.search</methodName></methodCall>');
+ * 				$service->send();
+ *				if ($service->getResponseStatusCode() == 200)
+ *					return $service->getResponseBody();
+ *				else
+ *					// The service responded with an error code 404, 500, etc.
+ *					throw new Exception('The service responded with an error.');
+ *				
+ *			} catch (CAS_ProxyTicketException $e) {
+ *				if ($e->getCode() == PHPCAS_SERVICE_PT_FAILURE)
+ *					return "Your login has timed out. You need to log in again.";
+ *				else
+ *					// Other proxy ticket errors are from bad request format (shouldn't happen)
+ *					// or CAS server failure (unlikely) so lets just stop if we hit those.
+ *					throw $e; 
+ *			} catch (CAS_ProxiedService_Exception $e) {
+ *				// Something prevented the service request from being sent or received.
+ *				// We didn't even get a valid error response (404, 500, etc), so this
+ *				// might be caused by a network error or a DNS resolution failure.
+ *				// We could handle it in some way, but for now we will just stop.
+ *				throw $e;
+ *			}
+ */
+class CAS_ProxiedService_Http_Post
+	extends CAS_ProxiedService_Http_Abstract
+{
+
+	/**
+	 * The content-type of this request
+	 * 
+	 * @var string $_contentType
+	 */
+	private $_contentType;
+	
+	/**
+	 * The body of the this request
+	 * 
+	 * @var string $_body
+	 */
+	private $_body;
+	
+	/**
+	 * Set the content type of this POST request.
+	 * 
+	 * @param string $contentType
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function setContentType ($contentType) {
+		if ($this->hasBeenSent())
+			throw new CAS_OutOfSequenceException('Cannot set the content type, request already sent.');
+		
+		$this->_contentType = $contentType;
+	}
+
+	/**
+	 * Set the body of this POST request.
+	 * 
+	 * @param string $body
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function setBody ($body) {
+		if ($this->hasBeenSent())
+			throw new CAS_OutOfSequenceException('Cannot set the body, request already sent.');
+		
+		$this->_body = $body;
+	}
+	
+	/**
+	 * Add any other parts of the request needed by concrete classes
+	 * 
+	 * @param CAS_RequestInterface $request
+	 * @return void
+	 */
+	protected function populateRequest (CAS_RequestInterface $request) {
+		if (empty($this->_contentType) && !empty($this->_body))
+			throw new CAS_ProxiedService_Exception("If you pass a POST body, you must specify a content type via ".get_class($this).'->setContentType($contentType).');
+		
+		$request->makePost();
+		if (!empty($this->_body)) {
+			$request->addHeader('Content-Type: '.$this->_contentType);
+			$request->addHeader('Content-Length: '.strlen($this->_body));
+			$request->setPostBody($this->_body);
+		}
+	}
+
+	
+}
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Imap.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Imap.php
new file mode 100644
index 00000000..7aba1e8c
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Imap.php
@@ -0,0 +1,234 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *		 * Redistributions of source code must retain the above copyright notice,
+ *			 this list of conditions and the following disclaimer.
+ *		 * Redistributions in binary form must reproduce the above copyright notice,
+ *			 this list of conditions and the following disclaimer in the documentation
+ *			 and/or other materials provided with the distribution.
+ *		 * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *			 Collaborative nor the names of its contributors may be used to endorse or
+ *			 promote products derived from this software without specific prior
+ *			 written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+require_once(dirname(__FILE__).'/Abstract.php');
+include_once(dirname(__FILE__).'/../Exception.php');
+include_once(dirname(__FILE__).'/../InvalidArgumentException.php');
+include_once(dirname(__FILE__).'/../OutOfSequenceException.php');
+
+/**
+ * Provides access to a proxy-authenticated IMAP stream
+ */
+class CAS_ProxiedService_Imap
+	extends CAS_ProxiedService_Abstract
+{
+	
+	/**
+	 * The username to send via imap_open.
+	 *
+	 * @var string $_username;
+	 */
+	private $_username;
+	
+	/**
+	 * Constructor.
+	 * 
+	 * @param string $username
+	 * @return void
+	 */
+	public function __construct ($username) {
+		if (!is_string($username) || !strlen($username))
+			throw new CAS_InvalidArgumentException('Invalid username.');
+		
+		$this->_username = $username;
+	}
+	
+	/**
+	 * The target service url.
+	 * @var string $_url;
+	 */
+	private $_url;
+	
+	/**
+	 * Answer a service identifier (URL) for whom we should fetch a proxy ticket.
+	 * 
+	 * @return string
+	 * @throws Exception If no service url is available.
+	 */
+	public function getServiceUrl () {
+		if (empty($this->_url))
+			throw new CAS_ProxiedService_Exception('No URL set via '.get_class($this).'->getServiceUrl($url).');
+		
+		return $this->_url;
+	}
+	
+	/*********************************************************
+	 * Configure the Stream
+	 *********************************************************/
+
+	/**
+	 * Set the URL of the service to pass to CAS for proxy-ticket retrieval.
+	 *
+	 * @param string $url
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the stream has been opened.
+	 */
+	public function setServiceUrl ($url) {
+		if ($this->hasBeenOpened())
+			throw new CAS_OutOfSequenceException('Cannot set the URL, stream already opened.');
+		if (!is_string($url) || !strlen($url))
+			throw new CAS_InvalidArgumentException('Invalid url.');
+		
+		$this->_url = $url;
+	}
+	
+	/**
+	 * The mailbox to open. See the $mailbox parameter of imap_open().
+	 * 
+	 * @var string $_mailbox
+	 */
+	private $_mailbox;
+	
+	/**
+	 * Set the mailbox to open. See the $mailbox parameter of imap_open().
+	 * 
+	 * @param string $mailbox
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the stream has been opened.
+	 */
+	public function setMailbox ($mailbox) {
+		if ($this->hasBeenOpened())
+			throw new CAS_OutOfSequenceException('Cannot set the mailbox, stream already opened.');
+		if (!is_string($mailbox) || !strlen($mailbox))
+			throw new CAS_InvalidArgumentException('Invalid mailbox.');
+		
+		$this->_mailbox = $mailbox;
+	}
+	
+	/**
+	 * A bit mask of options to pass to imap_open() as the $options parameter.
+	 * 
+	 * @var int $_options
+	 */
+	private $_options = NULL;
+	
+	/**
+	 * Set the options for opening the stream. See the $options parameter of imap_open().
+	 * 
+	 * @param int $options
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the stream has been opened.
+	 */
+	public function setOptions ($options) {
+		if ($this->hasBeenOpened())
+			throw new CAS_OutOfSequenceException('Cannot set options, stream already opened.');
+		if (!is_int($options))
+			throw new CAS_InvalidArgumentException('Invalid options.');
+		
+		$this->_options = $options;
+	}
+	
+	/*********************************************************
+	 * 2. Open the stream
+	 *********************************************************/
+
+	/**
+	 * Open the IMAP stream (similar to imap_open()).
+	 *
+	 * @return resource Returns an IMAP stream on success
+	 * @throws CAS_OutOfSequenceException If called multiple times.
+	 * @throws CAS_ProxyTicketException If there is a proxy-ticket failure.
+	 *		The code of the Exception will be one of: 
+	 *			PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE 
+	 *			PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE
+	 *			PHPCAS_SERVICE_PT_FAILURE
+	 * @throws CAS_ProxiedService_Exception If there is a failure sending the request to the target service.	 */
+	public function open () {
+		if ($this->hasBeenOpened())
+			throw new CAS_OutOfSequenceException('Stream already opened.');
+		if (empty($this->_mailbox))
+			throw new CAS_ProxiedService_Exception('You must specify a mailbox via '.get_class($this).'->setMailbox($mailbox)');
+		
+		phpCAS::traceBegin();
+		
+		// Get our proxy ticket and append it to our URL.
+		$this->initializeProxyTicket();
+		phpCAS::trace('opening IMAP mailbox `'.$this->_mailbox.'\'...');
+		$this->_stream = @imap_open($this->_mailbox, $this->_username, $this->getProxyTicket(), $this->_options);
+		if ($this->_stream) {
+			phpCAS::trace('ok');
+		} else {
+			phpCAS::trace('could not open mailbox');
+			// @todo add localization integration.
+// 			$this->_errorMessage = sprintf($this->getString(CAS_STR_SERVICE_UNAVAILABLE), $url, var_export(imap_errors(),TRUE));
+			$message = 'IMAP Error: '.$url.' '. var_export(imap_errors(),TRUE);
+			phpCAS::trace($message);
+			throw new CAS_ProxiedService_Exception($message);
+		}
+				
+		phpCAS::traceEnd();
+		return $this->_stream;
+	}
+	
+	/**
+	 * Answer true if our request has been sent yet.
+	 * 
+	 * @return boolean
+	 */
+	protected function hasBeenOpened () {
+		return !empty($this->_stream);
+	}
+
+	/*********************************************************
+	 * 3. Access the result
+	 *********************************************************/
+	/**
+	 * The IMAP stream
+	 * 
+	 * @var resource $_stream
+	 */
+	private $_stream;
+	
+	/**
+	 * Answer the IMAP stream
+	 * 
+	 * @return resource
+	 */
+	public function getStream () {
+		if (!$this->hasBeenOpened())
+			throw new CAS_OutOfSequenceException('Cannot access stream, not opened yet.');
+		
+		return $this->_stream;
+	}
+	
+	/**
+	 * CAS_Client::serviceMail() needs to return the proxy ticket for some reason,
+	 * so this method provides access to it.
+	 * 
+	 * @return string 
+	 * @throws CAS_OutOfSequenceException If called before the stream has been opened.
+	 */
+	public function getImapProxyTicket () {
+		if (!$this->hasBeenOpened())
+			throw new CAS_OutOfSequenceException('Cannot access errors, stream not opened yet.');
+		
+		return $this->getProxyTicket();
+	}
+}
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Testable.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Testable.php
new file mode 100644
index 00000000..aaf748bb
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxiedService/Testable.php
@@ -0,0 +1,65 @@
+<?php
+/*
+ * Copyright � 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *		 * Redistributions of source code must retain the above copyright notice,
+ *			 this list of conditions and the following disclaimer.
+ *		 * Redistributions in binary form must reproduce the above copyright notice,
+ *			 this list of conditions and the following disclaimer in the documentation
+ *			 and/or other materials provided with the distribution.
+ *		 * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *			 Collaborative nor the names of its contributors may be used to endorse or
+ *			 promote products derived from this software without specific prior
+ *			 written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * This interface defines methods that allow proxy-authenticated service handlers
+ * to be tested in unit tests.
+ *
+ * Classes implementing this interface SHOULD store the CAS_Client passed and initialize
+ * themselves with that client rather than via the static phpCAS method. For example:
+ *
+ *		/ **
+ *		 * Fetch our proxy ticket.
+ *		 * /
+ *		protected function initializeProxyTicket() {
+ *			// Allow usage of a particular CAS_Client for unit testing.
+ *			if (is_null($this->casClient))
+ *				phpCAS::initializeProxiedService($this);
+ *			else
+ *				$this->casClient->initializeProxiedService($this);
+ *		}
+ * 
+ */
+interface CAS_ProxiedService_Testable {
+		
+	/**
+	 * Use a particular CAS_Client->initializeProxiedService() rather than the 
+	 * static phpCAS::initializeProxiedService().
+	 *
+	 * This method should not be called in standard operation, but is needed for unit
+	 * testing.
+	 * 
+	 * @param CAS_Client $casClient
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after a proxy ticket has already been initialized/set.
+	 */
+	public function setCasClient (CAS_Client $casClient);
+	
+}
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxyTicketException.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxyTicketException.php
new file mode 100644
index 00000000..7d9fb9f2
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/ProxyTicketException.php
@@ -0,0 +1,62 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *		 * Redistributions of source code must retain the above copyright notice,
+ *			 this list of conditions and the following disclaimer.
+ *		 * Redistributions in binary form must reproduce the above copyright notice,
+ *			 this list of conditions and the following disclaimer in the documentation
+ *			 and/or other materials provided with the distribution.
+ *		 * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *			 Collaborative nor the names of its contributors may be used to endorse or
+ *			 promote products derived from this software without specific prior
+ *			 written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+require_once(dirname(__FILE__).'/Exception.php');
+
+/**
+ * An Exception for errors related to fetching or validating proxy tickets.
+ */
+class CAS_ProxyTicketException
+	extends BadMethodCallException
+	implements CAS_Exception
+{
+	
+	/**
+	 * Constructor
+	 * 
+	 * @param string $message
+	 * @param optional int $code
+	 * @param optional Exception $previous
+	 * @return void
+	 */
+	public function __construct ($message, $code = PHPCAS_SERVICE_PT_FAILURE) {
+		// Warn if the code is not in our allowed list
+		$ptCodes = array(
+			PHPCAS_SERVICE_PT_FAILURE, 
+			PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, 
+			PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE,
+		);
+		if (!in_array($code, $ptCodes)) {
+			trigger_error('Invalid code '.$code.' passed. Must be one of PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, or PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE.');
+		}
+		
+		parent::__construct($message, $code);
+	}
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/Request/AbstractRequest.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/Request/AbstractRequest.php
new file mode 100644
index 00000000..65a7ce99
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/Request/AbstractRequest.php
@@ -0,0 +1,299 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *	   * Redistributions of source code must retain the above copyright notice,
+ *		 this list of conditions and the following disclaimer.
+ *	   * Redistributions in binary form must reproduce the above copyright notice,
+ *		 this list of conditions and the following disclaimer in the documentation
+ *		 and/or other materials provided with the distribution.
+ *	   * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *		 Collaborative nor the names of its contributors may be used to endorse or
+ *		 promote products derived from this software without specific prior
+ *		 written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+require_once dirname(__FILE__).'/RequestInterface.php';
+include_once(dirname(__FILE__).'/Exception.php');
+include_once(dirname(__FILE__).'/../InvalidArgumentException.php');
+include_once(dirname(__FILE__).'/../OutOfSequenceException.php');
+
+/**
+ * Provides support for performing web-requests via curl
+ */
+abstract class CAS_AbstractRequest
+	implements CAS_RequestInterface
+{
+
+	protected $url = null;
+	protected $cookies = array();
+	protected $headers = array();
+	protected $isPost = FALSE;
+	protected $postBody = null;
+	protected $caCertPath = null;
+	private $sent = FALSE;
+	private $responseHeaders = array();
+	private $responseBody = null;
+	private $errorMessage = '';
+
+	/*********************************************************
+	 * Configure the Request
+	 *********************************************************/
+
+	/**
+	 * Set the URL of the Request
+	 *
+	 * @param string $url
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function setUrl ($url) {
+		if ($this->sent)
+			throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+
+		$this->url = $url;
+	}
+
+	/**
+	 * Add a cookie to the request.
+	 *
+	 * @param string $name
+	 * @param string $value
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function addCookie ($name, $value) {
+		if ($this->sent)
+			throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+
+		$this->cookies[$name] = $value;
+	}
+
+	/**
+	 * Add an array of cookies to the request.
+	 * The cookie array is of the form
+	 *     array('cookie_name' => 'cookie_value', 'cookie_name2' => cookie_value2')
+	 *
+	 * @param array $cookies
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function addCookies (array $cookies) {
+		if ($this->sent)
+			throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+
+		$this->cookies = array_merge($this->cookies, $cookies);
+	}
+
+	/**
+	 * Add a header string to the request.
+	 *
+	 * @param string $header
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function addHeader ($header) {
+		if ($this->sent)
+			throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+
+		$this->headers[] = $header;
+	}
+
+	/**
+	 * Add an array of header strings to the request.
+	 *
+	 * @param array $headers
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function addHeaders (array $headers) {
+		if ($this->sent)
+			throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+
+		$this->headers = array_merge($this->headers, $headers);
+	}
+
+	/**
+	 * Make the request a POST request rather than the default GET request.
+	 *
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function makePost () {
+		if ($this->sent)
+			throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+
+		$this->isPost = TRUE;
+	}
+
+	/**
+	 * Add a POST body to the request
+	 *
+	 * @param string $body
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function setPostBody ($body) {
+		if ($this->sent)
+			throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+		if (!$this->isPost)
+			throw new CAS_OutOfSequenceException('Cannot add a POST body to a GET request, use makePost() first.');
+
+		$this->postBody = $body;
+	}
+
+	/**
+	 * Specify the path to an SSL CA certificate to validate the server with.
+	 *
+	 * @param string $sslCertPath
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function setSslCaCert ($caCertPath) {
+		if ($this->sent)
+			throw new CAS_OutOfSequenceException('Request has already been sent cannot '.__METHOD__);
+
+		$this->caCertPath = $caCertPath;
+	}
+
+	/*********************************************************
+	 * 2. Send the Request
+	 *********************************************************/
+
+	/**
+	 * Perform the request.
+	 *
+	 * @return boolean TRUE on success, FALSE on failure.
+	 * @throws CAS_OutOfSequenceException If called multiple times.
+	 */
+	public function send () {
+		if ($this->sent)
+			throw new CAS_OutOfSequenceException('Request has already been sent cannot send again.');
+		if (is_null($this->url) || !$this->url)
+			throw new CAS_OutOfSequenceException('A url must be specified via setUrl() before the request can be sent.');
+
+		$this->sent = true;
+		return $this->_sendRequest();
+	}
+
+	/**
+	 * Send the request and store the results.
+	 *
+	 * @return boolean TRUE on success, FALSE on failure.
+	 */
+	abstract protected function _sendRequest ();
+
+	/**
+	 * Store the response headers.
+	 *
+	 * @param array $headers
+	 * @return void
+	 */
+	protected function storeResponseHeaders (array $headers) {
+		$this->responseHeaders = array_merge($this->responseHeaders, $headers);
+	}
+
+	/**
+	 * Store a single response header to our array.
+	 *
+	 * @param string $header
+	 * @return void
+	 */
+	protected function storeResponseHeader ($header) {
+		$this->responseHeaders[] = $header;
+	}
+
+	/**
+	 * Store the response body.
+	 *
+	 * @param string $body
+	 * @return void
+	 */
+	protected function storeResponseBody ($body) {
+		$this->responseBody = $body;
+	}
+
+	/**
+	 * Add a string to our error message.
+	 *
+	 * @param string $message
+	 * @return void
+	 */
+	protected function storeErrorMessage ($message) {
+		$this->errorMessage .= $message;
+	}
+
+	/*********************************************************
+	 * 3. Access the response
+	 *********************************************************/
+
+	/**
+	 * Answer the headers of the response.
+	 *
+	 * @return array An array of header strings.
+	 * @throws CAS_OutOfSequenceException If called before the Request has been sent.
+	 */
+	public function getResponseHeaders () {
+		if (!$this->sent)
+			throw new CAS_OutOfSequenceException('Request has not been sent yet. Cannot '.__METHOD__);
+
+		return $this->responseHeaders;
+	}
+	
+	/**
+	 * Answer HTTP status code of the response
+	 *
+	 * @return integer
+	 * @throws CAS_OutOfSequenceException If called before the Request has been sent.
+	 */
+	public function getResponseStatusCode () {
+		if (!$this->sent)
+			throw new CAS_OutOfSequenceException('Request has not been sent yet. Cannot '.__METHOD__);
+		
+		if (!preg_match('/HTTP\/[0-9.]+\s+([0-9]+)\s*(.*)/', $this->responseHeaders[0], $matches))
+			throw new CAS_Request_Exception("Bad response, no status code was found in the first line.");
+		
+		return intval($matches[1]);
+	}
+
+	/**
+	 * Answer the body of response.
+	 *
+	 * @return string
+	 * @throws CAS_OutOfSequenceException If called before the Request has been sent.
+	 */
+	public function getResponseBody () {
+		if (!$this->sent)
+			throw new CAS_OutOfSequenceException('Request has not been sent yet. Cannot '.__METHOD__);
+
+		return $this->responseBody;
+	}
+
+	/**
+	 * Answer a message describing any errors if the request failed.
+	 *
+	 * @return string
+	 * @throws CAS_OutOfSequenceException If called before the Request has been sent.
+	 */
+	public function getErrorMessage () {
+		if (!$this->sent)
+			throw new CAS_OutOfSequenceException('Request has not been sent yet. Cannot '.__METHOD__);
+
+		return $this->errorMessage;
+	}
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/Request/CurlRequest.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/Request/CurlRequest.php
new file mode 100644
index 00000000..5081f23b
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/Request/CurlRequest.php
@@ -0,0 +1,155 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *	   * Redistributions of source code must retain the above copyright notice,
+ *		 this list of conditions and the following disclaimer.
+ *	   * Redistributions in binary form must reproduce the above copyright notice,
+ *		 this list of conditions and the following disclaimer in the documentation
+ *		 and/or other materials provided with the distribution.
+ *	   * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *		 Collaborative nor the names of its contributors may be used to endorse or
+ *		 promote products derived from this software without specific prior
+ *		 written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+require_once dirname(__FILE__).'/RequestInterface.php';
+require_once dirname(__FILE__).'/AbstractRequest.php';
+
+/**
+ * Provides support for performing web-requests via curl
+ */
+class CAS_CurlRequest
+	extends CAS_AbstractRequest
+	implements CAS_RequestInterface
+{
+
+	/**
+	 * Set additional curl options
+	 *
+	 * @param array $options
+	 * @return void
+	 */
+	public function setCurlOptions (array $options) {
+		$this->curlOptions = $options;
+	}
+	private $curlOptions = array();
+
+	/**
+	 * Send the request and store the results.
+	 *
+	 * @return boolean TRUE on success, FALSE on failure.
+	 */
+	protected function _sendRequest () {
+		phpCAS::traceBegin();
+
+		/*********************************************************
+		 * initialize the CURL session
+		 *********************************************************/
+		$ch = curl_init($this->url);
+
+		if (version_compare(PHP_VERSION,'5.1.3','>=')) {
+			//only avaible in php5
+			curl_setopt_array($ch, $this->curlOptions);
+		} else {
+			foreach ($this->curlOptions as $key => $value) {
+				curl_setopt($ch, $key, $value);
+			}
+		}
+
+		/*********************************************************
+		 * Set SSL configuration
+		 *********************************************************/
+		if ($this->caCertPath) {
+			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
+			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
+			curl_setopt($ch, CURLOPT_CAINFO, $this->caCertPath);
+			phpCAS::trace('CURL: Set CURLOPT_CAINFO');
+		} else {
+			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
+			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
+		}
+
+		/*********************************************************
+		 * Configure curl to capture our output.
+		 *********************************************************/
+		// return the CURL output into a variable
+		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+
+		// get the HTTP header with a callback
+		curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, '_curlReadHeaders'));
+
+		/*********************************************************
+		 * Add cookie headers to our request.
+		 *********************************************************/
+		if (count($this->cookies)) {
+			$cookieStrings = array();
+			foreach ($this->cookies as $name => $val) {
+				$cookieStrings[] = $name.'='.$val;
+			}
+			curl_setopt($ch, CURLOPT_COOKIE, implode(';', $cookieStrings));
+		}
+
+		/*********************************************************
+		 * Add any additional headers
+		 *********************************************************/
+		if (count($this->headers)) {
+			curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers);
+		}
+
+		/*********************************************************
+		 * Flag and Body for POST requests
+		 *********************************************************/
+		if ($this->isPost) {
+			curl_setopt($ch, CURLOPT_POST, 1);
+			curl_setopt($ch, CURLOPT_POSTFIELDS, $this->postBody);
+		}
+
+		/*********************************************************
+		 * Perform the query
+		 *********************************************************/
+		$buf = curl_exec ($ch);
+		if ( $buf === FALSE ) {
+			phpCAS::trace('curl_exec() failed');
+			$this->storeErrorMessage('CURL error #'.curl_errno($ch).': '.curl_error($ch));
+			$res = FALSE;
+		} else {
+			$this->storeResponseBody($buf);
+			phpCAS::trace("Response Body: \n".$buf."\n");
+			$res = TRUE;
+
+		}
+		// close the CURL session
+		curl_close ($ch);
+
+		phpCAS::traceEnd($res);
+		return $res;
+	}
+
+	/**
+	 * Internal method for capturing the headers from a curl request.
+	 *
+	 * @param handle $ch
+	 * @param string $header
+	 * @return void
+	 */
+	public function _curlReadHeaders ($ch, $header) {
+		$this->storeResponseHeader($header);
+		return strlen($header);
+	}
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/Request/Exception.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/Request/Exception.php
new file mode 100644
index 00000000..6f6fd43c
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/Request/Exception.php
@@ -0,0 +1,41 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *		 * Redistributions of source code must retain the above copyright notice,
+ *			 this list of conditions and the following disclaimer.
+ *		 * Redistributions in binary form must reproduce the above copyright notice,
+ *			 this list of conditions and the following disclaimer in the documentation
+ *			 and/or other materials provided with the distribution.
+ *		 * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *			 Collaborative nor the names of its contributors may be used to endorse or
+ *			 promote products derived from this software without specific prior
+ *			 written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+require_once(dirname(__FILE__).'/../Exception.php');
+
+/**
+ * An Exception for problems performing requests
+ */
+class CAS_Request_Exception
+	extends Exception
+	implements CAS_Exception
+{
+
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/Request/RequestInterface.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/Request/RequestInterface.php
new file mode 100644
index 00000000..98c274ff
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/Request/RequestInterface.php
@@ -0,0 +1,164 @@
+<?php
+/*
+ * Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *	   * Redistributions of source code must retain the above copyright notice,
+ *		 this list of conditions and the following disclaimer.
+ *	   * Redistributions in binary form must reproduce the above copyright notice,
+ *		 this list of conditions and the following disclaimer in the documentation
+ *		 and/or other materials provided with the distribution.
+ *	   * Neither the name of the ESUP-Portail consortium & the JA-SIG
+ *		 Collaborative nor the names of its contributors may be used to endorse or
+ *		 promote products derived from this software without specific prior
+ *		 written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * This interface defines a class library for performing web requests.
+ */
+interface CAS_RequestInterface {
+
+	/*********************************************************
+	 * Configure the Request
+	 *********************************************************/
+
+	/**
+	 * Set the URL of the Request
+	 *
+	 * @param string $url
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function setUrl ($url);
+
+	/**
+	 * Add a cookie to the request.
+	 *
+	 * @param string $name
+	 * @param string $value
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function addCookie ($name, $value);
+
+	/**
+	 * Add an array of cookies to the request.
+	 * The cookie array is of the form
+	 *     array('cookie_name' => 'cookie_value', 'cookie_name2' => cookie_value2')
+	 *
+	 * @param array $cookies
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function addCookies (array $cookies);
+
+	/**
+	 * Add a header string to the request.
+	 *
+	 * @param string $header
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function addHeader ($header);
+
+	/**
+	 * Add an array of header strings to the request.
+	 *
+	 * @param array $headers
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function addHeaders (array $headers);
+
+	/**
+	 * Make the request a POST request rather than the default GET request.
+	 *
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function makePost ();
+
+	/**
+	 * Add a POST body to the request
+	 *
+	 * @param string $body
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function setPostBody ($body);
+
+
+	/**
+	 * Specify the path to an SSL CA certificate to validate the server with.
+	 *
+	 * @param string $sslCertPath
+	 * @return void
+	 * @throws CAS_OutOfSequenceException If called after the Request has been sent.
+	 */
+	public function setSslCaCert ($caCertPath);
+
+
+
+	/*********************************************************
+	 * 2. Send the Request
+	 *********************************************************/
+
+	/**
+	 * Perform the request.
+	 *
+	 * @return boolean TRUE on success, FALSE on failure.
+	 * @throws CAS_OutOfSequenceException If called multiple times.
+	 */
+	public function send ();
+
+	/*********************************************************
+	 * 3. Access the response
+	 *********************************************************/
+
+	/**
+	 * Answer the headers of the response.
+	 *
+	 * @return array An array of header strings.
+	 * @throws CAS_OutOfSequenceException If called before the Request has been sent.
+	 */
+	public function getResponseHeaders ();
+	
+	/**
+	 * Answer HTTP status code of the response
+	 *
+	 * @return integer
+	 * @throws CAS_OutOfSequenceException If called before the Request has been sent.
+	 */
+	public function getResponseStatusCode ();
+	
+	/**
+	 * Answer the body of response.
+	 *
+	 * @return string
+	 * @throws CAS_OutOfSequenceException If called before the Request has been sent.
+	 */
+	public function getResponseBody ();
+
+	/**
+	 * Answer a message describing any errors if the request failed.
+	 *
+	 * @return string
+	 * @throws CAS_OutOfSequenceException If called before the Request has been sent.
+	 */
+	public function getErrorMessage ();
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/catalan.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/catalan.php
new file mode 100644
index 00000000..a5c6e2a4
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/catalan.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file languages/spanish.php
+ * @author Iván-Benjamín García Torà <ivaniclixx AT gmail DOT com
+ * @sa @link internalLang Internationalization @endlink
+ * @ingroup internalLang
+ */
+
+$this->_strings = array(
+CAS_STR_USING_SERVER
+=> 'usant servidor',
+CAS_STR_AUTHENTICATION_WANTED
+=> 'Autentificació CAS necessària!',
+CAS_STR_LOGOUT
+=> 'Sortida de CAS necessària!',
+CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED
+=> 'Ja hauria d\ haver estat redireccionat al servidor CAS. Feu click <a href="%s">aquí</a> per a continuar.',
+CAS_STR_AUTHENTICATION_FAILED
+=> 'Autentificació CAS fallida!',
+CAS_STR_YOU_WERE_NOT_AUTHENTICATED
+=> '<p>No estàs autentificat.</p><p>Pots tornar a intentar-ho fent click <a href="%s">aquí</a>.</p><p>Si el problema persisteix hauría de contactar amb l\'<a href="mailto:%s">administrador d\'aquest llocc</a>.</p>',
+CAS_STR_SERVICE_UNAVAILABLE
+=> 'El servei `<b>%s</b>\' no està disponible (<b>%s</b>).'
+);
+
+?>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/english.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/english.php
new file mode 100644
index 00000000..d035012b
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/english.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file languages/english.php
+ * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
+ * @sa @link internalLang Internationalization @endlink
+ * @ingroup internalLang
+ */
+
+$this->_strings = array(
+CAS_STR_USING_SERVER
+=> 'using server',
+CAS_STR_AUTHENTICATION_WANTED
+=> 'CAS Authentication wanted!',
+CAS_STR_LOGOUT
+=> 'CAS logout wanted!',
+CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED
+=> 'You should already have been redirected to the CAS server. Click <a href="%s">here</a> to continue.',
+CAS_STR_AUTHENTICATION_FAILED
+=> 'CAS Authentication failed!',
+CAS_STR_YOU_WERE_NOT_AUTHENTICATED
+=> '<p>You were not authenticated.</p><p>You may submit your request again by clicking <a href="%s">here</a>.</p><p>If the problem persists, you may contact <a href="mailto:%s">the administrator of this site</a>.</p>',
+CAS_STR_SERVICE_UNAVAILABLE
+=> 'The service `<b>%s</b>\' is not available (<b>%s</b>).'
+);
+
+?>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/french.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/french.php
new file mode 100644
index 00000000..769f8138
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/french.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @file languages/english.php
+ * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
+ * @sa @link internalLang Internationalization @endlink
+ * @ingroup internalLang
+ */
+
+$this->_strings = array(
+CAS_STR_USING_SERVER
+=> 'utilisant le serveur',
+CAS_STR_AUTHENTICATION_WANTED
+=> 'Authentication CAS n�cessaire&nbsp;!',
+CAS_STR_LOGOUT
+=> 'D�connexion demand�e&nbsp;!',
+CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED
+=> 'Vous auriez du etre redirig�(e) vers le serveur CAS. Cliquez <a href="%s">ici</a> pour continuer.',
+CAS_STR_AUTHENTICATION_FAILED
+=> 'Authentification CAS infructueuse&nbsp;!',
+CAS_STR_YOU_WERE_NOT_AUTHENTICATED
+=> '<p>Vous n\'avez pas �t� authentifi�(e).</p><p>Vous pouvez soumettre votre requete � nouveau en cliquant <a href="%s">ici</a>.</p><p>Si le probl�me persiste, vous pouvez contacter <a href="mailto:%s">l\'administrateur de ce site</a>.</p>',
+CAS_STR_SERVICE_UNAVAILABLE
+=> 'Le service `<b>%s</b>\' est indisponible (<b>%s</b>)'
+
+);
+
+?>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/german.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/german.php
new file mode 100644
index 00000000..173ca618
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/german.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file languages/german.php
+ * @author Henrik Genssen <hg at mediafactory.de>
+ * @sa @link internalLang Internationalization @endlink
+ * @ingroup internalLang
+ */
+
+$this->_strings = array(
+CAS_STR_USING_SERVER
+=> 'via Server',
+CAS_STR_AUTHENTICATION_WANTED
+=> 'CAS Authentifizierung erforderlich!',
+CAS_STR_LOGOUT
+=> 'CAS Abmeldung!',
+CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED
+=> 'eigentlich h&auml;ten Sie zum CAS Server weitergeleitet werden sollen. Dr&uuml;cken Sie <a href="%s">hier</a> um fortzufahren.',
+CAS_STR_AUTHENTICATION_FAILED
+=> 'CAS Anmeldung fehlgeschlagen!',
+CAS_STR_YOU_WERE_NOT_AUTHENTICATED
+=> '<p>Sie wurden nicht angemeldet.</p><p>Um es erneut zu versuchen klicken Sie <a href="%s">hier</a>.</p><p>Wenn das Problem bestehen bleibt, kontkatieren Sie den <a href="mailto:%s">Administrator</a> dieser Seite.</p>',
+CAS_STR_SERVICE_UNAVAILABLE
+=> 'Der Dienst `<b>%s</b>\' ist nicht verf&uuml;gbar (<b>%s</b>).'
+);
+
+?>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/greek.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/greek.php
new file mode 100644
index 00000000..fdff77e4
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/greek.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file languages/greek.php
+ * @author Vangelis Haniotakis <haniotak at ucnet.uoc.gr>
+ * @sa @link internalLang Internationalization @endlink
+ * @ingroup internalLang
+ */
+
+$this->_strings = array(
+ CAS_STR_USING_SERVER 
+ => '��������������� � ������������',
+ CAS_STR_AUTHENTICATION_WANTED 
+ => '���������� � ����������� CAS!',
+ CAS_STR_LOGOUT 
+ => '���������� � ���������� ��� CAS!',
+ CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED 
+ => '�� ������ �� ������ �������������� ���� ����������� CAS. ����� ���� <a href="%s">���</a> ��� �� ����������.',
+ CAS_STR_AUTHENTICATION_FAILED 
+ => '� ����������� CAS �������!',
+ CAS_STR_YOU_WERE_NOT_AUTHENTICATED 
+ => '<p>��� ���������������.</p><p>�������� �� ����������������, �������� ���� <a href="%s">���</a>.</p><p>��� �� �������� ���������, ����� �� ����� �� ��� <a href="mailto:%s">�����������</a>.</p>',
+ CAS_STR_SERVICE_UNAVAILABLE
+ => '� �������� `<b>%s</b>\' ��� ����� ��������� (<b>%s</b>).'
+);
+
+?>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/japanese.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/japanese.php
new file mode 100644
index 00000000..50925809
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/japanese.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file languages/japanese.php
+ * @author fnorif (fnorif@yahoo.co.jp)
+ *
+ * Now Encoding is EUC-JP and LF
+ **/
+
+$this->_strings = array(
+CAS_STR_USING_SERVER
+=> 'using server',
+CAS_STR_AUTHENTICATION_WANTED
+=> 'CAS�ˤ��ǧ�ڤ�Ԥ��ޤ�',
+CAS_STR_LOGOUT
+=> 'CAS����?�����Ȥ��ޤ�!',
+CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED
+=> 'CAS�����Ф˹Ԥ�ɬ�פ�����ޤ�����ưŪ��ž������ʤ����� <a href="%s">������</a> �򥯥�å�����³�Ԥ��ޤ���',
+CAS_STR_AUTHENTICATION_FAILED
+=> 'CAS�ˤ��ǧ�ڤ˼��Ԥ��ޤ���',
+CAS_STR_YOU_WERE_NOT_AUTHENTICATED
+=> '<p>ǧ�ڤǤ��ޤ���Ǥ���.</p><p>�⤦���٥ꥯ�����Ȥ������������<a href="%s">������</a>�򥯥�å�.</p><p>���꤬��褷�ʤ����� <a href="mailto:%s">���Υ����Ȥδ����</a>���䤤��碌�Ƥ�������.</p>',
+CAS_STR_SERVICE_UNAVAILABLE
+=> '�����ӥ� `<b>%s</b>\' �����ѤǤ��ޤ��� (<b>%s</b>).'
+);
+
+?>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/languages.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/languages.php
new file mode 100644
index 00000000..2c6f8bb3
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/languages.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @file languages/languages.php
+ * Internationalization constants
+ * @author Pascal Aubry <pascal.aubry at univ-rennes1.fr>
+ * @sa @link internalLang Internationalization @endlink
+ * @ingroup internalLang
+ */
+
+//@{
+/**
+ * a phpCAS string index
+ */
+define("CAS_STR_USING_SERVER",                1);
+define("CAS_STR_AUTHENTICATION_WANTED",       2);
+define("CAS_STR_LOGOUT",                      3);
+define("CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED", 4);
+define("CAS_STR_AUTHENTICATION_FAILED",       5);
+define("CAS_STR_YOU_WERE_NOT_AUTHENTICATED",  6);
+define("CAS_STR_SERVICE_UNAVAILABLE",         7);
+//@}
+
+?>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/spanish.php b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/spanish.php
new file mode 100644
index 00000000..96cc82df
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/CAS/languages/spanish.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file languages/spanish.php
+ * @author Iván-Benjamín García Torà <ivaniclixx AT gmail DOT com
+ * @sa @link internalLang Internationalization @endlink
+ * @ingroup internalLang
+ */
+
+$this->_strings = array(
+CAS_STR_USING_SERVER
+=> 'usando servidor',
+CAS_STR_AUTHENTICATION_WANTED
+=> '¡Autentificación CAS necesaria!',
+CAS_STR_LOGOUT
+=> '¡Salida CAS necesaria!',
+CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED
+=> 'Ya debería haber sido redireccionado al servidor CAS. Haga click <a href="%s">aquí</a> para continuar.',
+CAS_STR_AUTHENTICATION_FAILED
+=> '¡Autentificación CAS fallida!',
+CAS_STR_YOU_WERE_NOT_AUTHENTICATED
+=> '<p>No estás autentificado.</p><p>Puedes volver a intentarlo haciendo click <a href="%s">aquí</a>.</p><p>Si el problema persiste debería contactar con el <a href="mailto:%s">administrador de este sitio</a>.</p>',
+CAS_STR_SERVICE_UNAVAILABLE
+=> 'El servicio `<b>%s</b>\' no está disponible (<b>%s</b>).'
+);
+
+?>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/ChangeLog b/htmltest/sites/all/libraries/CAS.dgeo/docs/ChangeLog
new file mode 100644
index 00000000..cabdf27e
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/ChangeLog
@@ -0,0 +1,452 @@
+Changes in version 1.2.2
+
+Bug Fixes:
+    * Improve compatibility with php < 5.3 for E_USER_DEPRECATED [PHPCAS-116] (Hugh Eaves)
+
+Changes in version 1.2.2RC1
+
+Bug Fixes:
+    * CASClient::getURL() cannot be private [PHPCAS-103] (Joachim Fritschi)
+    * CASClient::getServerServiceValidateURL() doesn't respect existing query strings [PHPCAS-104] (Bradley Froehle, Joachim Fritschi)
+    * CASClient::retrievePT() must be a public function [PHPCAS-107] (Joachim Fritschi)
+    * Expose setNoClearTicketsFromUrl() to the client [PHPCAS-108]  (Joachim Fritschi)
+    * Remove the PGT filestorage in xml format that is not implemented [PHPCAS-112] (Joachim Fritschi)
+    * Fix compatibility of the PGT db storage interface with postgres [PHPCAS-113] (Joachim Fritschi)
+
+Improvement
+    * Support for proxied POST requests. [PHPCAS-90] (Adam Franco)
+    * Add missing example for the new pgt-db storage [PHPCAS-101] (Joachim Fritschi)
+    * CASClient::getServerLoginURL(): Don't cache gateway/renew parameters [PHPCAS-105] (Bradley Froehle)
+    * fix parsing of cookies with special symbols in their values [PHPCAS-106] (Joachim Fritschi)
+    * Removal of the debug_backtrace hack for php4 [PHPCAS-110] (Joachim Fritschi)
+    * Clean up the naming structure of the classes [PHPCAS-111] (Joachim Fritschi)
+    * Better debug log output format [PHPCAS-114] (Joachim Fritschi)
+    * Many more examples and one central config. Improved code documentation [PHPCAS-86] (Joachim Fritschi, Adam Franco)
+
+Changes in version 1.2.1
+   * None
+
+Changes in version 1.2.1RC1
+Improvements
+   * add support for storing PGTs in a database [PHPCAS-94] (Daniel Frett)
+    
+Bug Fixes
+   * phpCAS::setDebug(FALSE) should stop logging [PHPCAS-95] (Joachim Fritschi)
+   * fix checkAuthenticate return value documentation [PHPCAS-92] (Joachim Fritschi)
+   * fix PGTStorage contructor name [PHPCAS-93] (Daniel Frett)
+   * fix the PHPCAS_SERVICE_NOT_AVAILABLE constant [PHPCAS-91] (Daniel Frett)
+   * fix redirection with multiple proxies in HTTP_X_FORWARDED_HOST [PHPCAS-98] (Joachim Fritschi)
+   * fix some undefinde variable warnings in debug mode [PHPCAS-96] (Joachim Fritschi)
+
+Changes in version 1.2.0
+   * None
+   
+Changes in version 1.2.0RC2
+Improvements
+   * add callback hooks during authentication and single sign-out [PHPCAS-76] (Adam Franco)
+
+Changes in version 1.2.0RC1
+Improvements
+   * add hasAttribute($key) and getAttribute($key) [PHPCAS-43] (Adam Franco)
+   * add unit tests for cas 2.0 attribute support [PHPCAS-88] (Adam Franco)
+   * expose the proxy chain through the phpcas interface [PHPCAS-89] (Adam Franco)
+   * add deprecation messages to the logout functions with an url parameter [PHPCAS-85] (Joachim Fritschi)
+
+Bug Fixes
+	* fix  public/private modifier for some functions [PHPCAS-87] (Joachim Fritschi)
+
+Changes in version 1.2.0-beta1
+
+Bug Fixes
+  * fix redirection behind a proxy. [PHPCAS-78] (Alex Barker)
+  * remove the bogus setCasServerCert() function and clean up the curl ssl settings [PHPCAS-84] (Joachim Fritschi)
+  
+Improvements
+   * mark the logout functions with an url parameter a deprecated [PHPCAS-85] (Joachim Fritschi)
+   * add public/private modifier for all vars and functions [PHPCAS-77] (Joachim Fritschi)
+   * add a testing framwork that implement on and offline testing capabilities [PHPCAS-66] (Adam Franco)
+   * add RFC compliant cookie storage for the proxy() mode. [PHPCAS-54] (Adam Franco)
+   * removal of the domxml compatibility lib [PHPCAS-72] (Matthew Brooks, Joachim Fritschi)
+   * add support for attributes for the cas_2.0 protocol [PHPCAS-43] (Joachim Fritschi, Adam Franco)
+   * removal of unused code and comments [PHPCAS-63] (Joachim Fritschi)
+   * fix static function warnings for php 5.x [PHPCAS-46] (Joachim Fritschi)
+   
+Changes in version 1.1.3
+  Bug Fixes
+   * removal of the non functional pgt-db backend [PHPCAS-65] (Joachim Fritschi)
+
+Changes in version 1.1.3RC1
+ Security Issue
+    * CVE-2010-3690 phpCAS: XSS during a proxy callback [PHPCAS-80] (Joachim Fritschi)
+    * CVE-2010-3691 phpCAS: prevent symlink attacks during a proxy callback [PHPCAS-80] (Joachim Fritschi)
+    * CVE-2010-3692 phpCAS: directory traversal during a proxy callback [PHPCAS-80] (Joachim Fritschi)
+
+ Bug Fixes
+   * fix missing $this in domxml-php4-to-php5 [PHPCAS-73] (Iñaki Arenaza)
+   * fix broken redirection with safari [PHPCAS-79] (Alex Barker)
+   * fix missing exit() call during ticket validation [PHPCAS-76] (Igor Blanco,Joachim Fritschi)
+   * fix a notice because REQUEST_URL is not defined on IIS [PHPCAS-81] (Iñaki Arenaza)
+   * fix a typo in pgt-db.php [PHPCAS-75] (Julien Cochennec)
+ 
+ Improvements
+   * upgrade domxml-php4-to-php5 to the newest version [PHPCAS-74] (Joachim Fritschi)
+
+Changes in version 1.1.2
+   * None
+   
+Changes in version 1.1.2RC2
+ Bug Fixes
+    * Prevent domxml-php4-to-php5 to be inclueded twice [PHPCAS-48] (Brad Krane)
+
+Changes in version 1.1.2RC1
+Security Issue
+    * Fix a session hijacking hole CVE-2010-2795 [PHPCAS-61] (Joachim Fritschi)
+    * callbackurl in proxy mode should be urlencoded CVE-2010-2796 [PHPCAS-67] (Joachim Fritschi)
+
+ Improvement
+    * Debuglog contains phpCAS version information [PHPCAS-62] (Joachim Fritschi)
+    
+ Bug Fixes   
+    * Fix warnings for SAML responses without attributes [PHPCAS-59] (Joachim Fritschi)
+    * Fix duplicate SAML debug output [PHPCAS-64] (Joachim Fritschi)
+    * Providing a new ST/PT/SA during an authenticated session will be ignored 
+      and a warning will be issued to the debug log. [PHPCAS-61] (Joachim Fritschi)
+    * fix 2 undefinded variable notices in serviceWeb() [PHPCAS-68] (Joachim Fritschi)
+
+Changes in version 1.1.1
+Improvement
+    * On Single Sign Out destroy any existing application session before deleting the phpcas session [PHPCAS-58] (Joachim Fritschi)
+    
+Changes in version 1.1.1RC2
+Bug fixes
+    * Fix bug in handling urls containing parameters without values [PHPCAS-57] (Joe Lencioni)
+    * New XSS patch for PHPCAS-52 that was undone in r48507 [PHPCAS-57] (Joachim Fritschi)
+
+Changes in version 1.1.1RC1
+Bug fixes
+    * Fix bug in restoring an existing session [PHPCAS-55] (Joachim Fritschi)
+    
+Changes in version 1.1.0
+Improvement
+    * Replace deprecated split() with explode(). [PHPCAS-42] (Joe Lencioni)
+
+Changes in version 1.1.0RC8
+Bug fixes
+    * Add additional comments regarding the use of serviceValidate and proxyValdiate [PHPCAS-44] (Joachim Fritschi)
+    * Revert all changes made to the ticket parsing in r47347 r48210 [PHPCAS-44] (Joachim Fritschi)
+    * Fix warning when destroying uninitialized session [PHPCAS-53] (Yann Richard,Joachim Fritschi)
+
+Changes in version 1.1.0RC7
+Security fixes
+    * Fix XSS Vulnerability. Sanatize parameters before using the url submitted by a client [PHPCAS-52] (Joachim Fritschi)
+    
+Changes in version 1.1.0RC6
+Bug fixes
+    * restore any possible old session before renaming the session [PHPCAS-50] (Joachim Fritschi)
+
+Changes in version 1.1.0RC5
+Bug fixes
+    * fixed don't destroy existing sessions unless needed, more debug output [PHPCAS-50] (Joachim Fritschi)
+
+Changes in version 1.1.0RC4
+Bug fixes
+
+    * fixed use PHP4 functions to parse saml11 attributes [PHPCAS-51] (Joachim Fritschi)
+
+Changes in version 1.1.0RC3
+Bug fixes
+
+    * added a check for missing params [PHPCAS-42] (Joachim Fritschi)
+
+Changes in version 1.1.0RC2
+New features
+
+    * added custom validation Urls [PHPCAS-45] (Joachim Fritschi).
+
+Bug fixes
+
+    * fixed PGT DB storage parameter list [PHPCAS-47] (Paul Merchant, Jr.)
+    * fixed parsing of STs [PHPCAS-44] (Joachim Fritschi)
+    * fixed session initialisation [PHPCAS-50] (Joachim Fritschi)
+    * fixed urls with than one query parameter [PHPCAS-42] (Caio Chassot)
+
+Changes in version 1.1.0RC1
+New features
+
+    * added SAML support [PHPCAS-40] (Brian Long and Matthias Crauwels).
+
+Bug fixes
+
+    * fixed invalid validation URLs [PHPCAS-39] (Alex Danieli).
+    * removed old PHP4 references [PHPCAS-41] (Yann Richard).
+    * fixed curl options [PHPCAS-38] (Andy Cowling).
+
+Improvement
+
+    * added accept IP addresses for allowed clients [PHPCAS-37] (Arunas Stockus) 
+
+Changes in version 1.0.2RC1
+Bug fixes
+
+    * fix redirections masking error messages [PHPCAS-36] (Olivier Berger) 	 
+    * fixed validatePGT() failing on phpCAS::traceBegin() with newer domxml-php4-to-php5.php [PHPCAS-35] (Olivier Berger) 	 
+    * Fixed missing exit() at end of callback() method [PHPCAS-34] (Olivier Berger)
+    * Update included domxml-php4-php5.php to most recent version now under LGPL [PHPCAS-30] (Olivier Berger) 	  
+    * fixed empty $target_service in CAS_Client:serviceMail [PHPCAS-22] (Julien Marchal).
+
+Changes in version 1.0.1
+Bug fixes
+
+    * fixed PEAR base install directory [PHPCAS-28] (Brett Bieber).
+    * fixed illegal characters in session id [PHPCAS-29] (Michael Ströder, Brett Bieber).
+    * fixed refresh with ticket causes authentication failure [related to PHPCAS-27] (Brett Bieber).
+    * fixed conflict with custom session handlers [PHPCAS-26] (Martin Gonzalez).
+
+Changes in version 1.0.0
+New features
+
+    * phpCAS is now PEAR-installable (Brett Bieber).
+    * added method handleLogoutRequests() to handle logout requests incoming from the CAS server (Julien Marchal and Pascal Aubry, requested by Craig Andrews).
+    * added methods setHttpProxy(), setNetworkInterface() and setExtraCurlOptions() (Stéphane Gully).
+
+Enhancements
+
+    * removed undesirable notice (Glennie Vignarajah).
+    * removed PEAR DB dependency when storing PGTs to the filesytem (Stéphane Gully).
+
+Changes in version 0.6.0
+New features
+
+    * added methods setCasServerCert() and setCasServerCaCert() to authenticate the CAS server, and method setNoCasServerValidation() to skip the SSL checks (Pascal Aubry, requested by Andrew Petro).
+    * Added spanish and catalan translations (Ivan Garcia).
+
+Bug fix
+
+    * fixed PGT storage path on Windows (Olivier Thebault).
+
+Changes in version 0.5.1
+New features
+
+    * restored method isAuthenticated() (Julien Marchal).
+
+Changes in version 0.5.0
+New features
+
+    * added japanese translation (Noriyuki Fukuoka).
+    * added german translation (Henrik Genssen).
+    * phpCAS now works for CAS v3 proxy tickets (Matt Zukowski).
+    * phpCAS now also works with lighttpd (Marvin Addison)
+
+Bug fixes
+
+    * fixed method setHTMLFooter() (Noriyuki Fukuoka).
+    * fixed method setHTMLHeader() (Xavier Castanho).
+    * fixed method isHttps() (Henrik Genssen).
+    * fixed method PGTStorageDB() (Ray Lambe).
+    * encode all the parameters, not only '&' characters (Matthew Debus).
+    * fixed ST proxy tickets (Julien Marchal).
+
+Changes in version 0.4.23
+Enhancement
+
+    * removed notice messages (David Lowry).
+
+Changes in version 0.4.22
+Bug fix
+
+    * added default value for parameter gateway in methods setServerLoginUrl() and redirectToCas() (Velpi).
+
+New Feature
+
+    * added method isSessionAuthenticated() (Brendan Arnold).
+
+Other change
+
+    * removed the call to error_reporting() to allow the configuration of error reporting at server level (Pascal Aubry, requested by Sylvain Derosiaux).
+
+Changes in version 0.4.21
+Bug fix
+
+    * some URLs were ill-formed in some rare circumstances (Jérôme Andrieux).
+
+New Feature
+
+    * added methods setServerLoginURL() and setServerLogoutURL() (Wyman Chan).
+
+Changes in version 0.4.20
+New feature
+
+    * phpCAS::checkAuthentication() implements the gateway feature of CAS (Pascal Aubry, requested by Romuald Lorthioir).
+
+Other change
+
+    * phpCAS::authenticateIfNeeded() was renamed phpCAS::forceAuthentication() (Pascal Aubry).
+
+Changes in version 0.4.19
+New features
+
+    * the service URL for the CAs server can be fixed with method phpCAS::setFixedServiceURL (Julien Marchal).
+    * the callback URL used to receive PGTs can be fixed with method phpCAS::setFixedCallbackURL() (Julien Marchal).
+
+    * added a CAS_Client wrapper to class phpCAS for method retrievePGT() (Julien Marchal).
+
+Changes in version 0.4.18
+Bug fixes
+
+    * debugging information was missing (Alexandre Boisseau).
+    * used an undefined variable in pgt-file.php (Alexandre Boisseau).
+
+Changes in version 0.4.17
+Enhancement
+
+    * made phpCAS PHP5 compliant (Vangelis Haniotakis).
+
+Changes in version 0.4.16
+Enhancement
+
+    * added the possibility not to start the session management (Vangelis Haniotakis).
+
+Changes in version 0.4.15
+Enhancement
+
+    * added a hack to make phpCAS work with IIS (Vangelis Haniotakis).
+
+Changes in version 0.4.14
+Enhancement
+
+    * a URL can be given to the CAS server on logout (Sébastien Gougeon and Yann Richard).
+
+Changes in version 0.4.13
+Bug fix
+
+    * Removed infinite loop in debug mode (Robert Legros).
+
+Changes in version 0.4.12
+Enhancement
+
+    * phpCAS now works even if the web server does not set SERVER_NAME, by relying on HTTP_HOST (Terence Chiu).
+
+Changes in version 0.4.11
+Bug fix
+
+    * A typo prevented ticket validation to work correctly (Robert Legros).
+
+Changes in version 0.4.10
+Enhancement
+
+    * phpCAS was previously working with PHP >= 4.3.0. A debug_backtrace() wrapper was added and get_elements_by_tagname() calls were modified to make phpCAS work with phpCAS >= 4.2.2 (Robert Legros).
+
+Changes in version 0.4.9
+New features
+
+    * Added greek translation (Haniotakis Vangelis).
+
+Changes in version 0.4.8
+Enhancements
+
+    * PEAR's DB.php inclusion is done only if a DB class was not already included. This eases the integration into some stand-alone tools that already include DB.php, like Tikiwiki (Pascal Aubry, requested by Terence Chiu).
+
+Changes in version 0.4.7
+Enhancements
+
+    * PHP session is now destroyed when using the phpCAS::logout() method (Pascal Aubry, requested by Ruben Recaba).
+    * Call getenv() whenever possible instead of directly dealing with environment variables (with $_ENV['xxx']), as $_ENV is not available par default on some Windows systems (Pascal Aubry).
+    * Set error reporting level to E_ALL ~ E_NOTICE (Pascal Aubry).
+    * Added the release number in the name of the main directory of the zip distribution file (Pascal Aubry, requested by Vincent Mathieu).
+    * Explicitly set certificate control to get round with different curl default configurations (Wyman Chan).
+
+Changes in version 0.4.6
+Security bug fix
+
+    * Credentials given to HTTP realms were given in the service URLs to the CAS server (Julien Marchal).
+
+Enhancements
+
+    * phpCAS now works behind an Apache reverse proxy (Julien Marchal).
+
+Changes in version 0.4.5
+Enhancements
+
+    * Developer releasing is now made by ant (Pascal Aubry).
+
+Bug fixes
+
+    * CAS/PGTStorage files have been renamed to fit to Windows case insensitivity (Pascal Aubry);
+    * %TMP% and %TEMP% environment variables are now taken into account to set the location of the log file (Pascal Aubry).
+
+Changes in version 0.4.4
+Enhancement
+
+    * ticket retrieval and validation is now made with curl (Pascal Aubry).
+
+Changes in version 0.4.3
+Bug fix
+
+    * phpCAS was not exiting right after redirecting in callback mode (Julien Marchal)
+
+Changes in version 0.4.2
+New features
+
+    * Authentication checking is not necessarily redirecting to the CAS server (introduced phpCAS::isAuthenticated()) (Pascal Aubry)
+    * phpCAS can now be used to access IMAP/POP3/NNTP services (cf phpCAS::serviceMail()) (Pascal Aubry)
+
+Enhancements
+
+    * debugging informations has been improved and is now send to a separate file (/tmp/phpCAS.log by default, can be changed by phpCAS::setDebug()) (Pascal Aubry)
+
+Changes
+
+    * phpCAS::authenticate() is replaced by phpCAS::authenticateIfNeeded() (semantics unchanged) (Pascal Aubry)
+    * phpCAS::service() is replaced by phpCAS::serviceWeb() (semantics unchanged) (Pascal Aubry)
+    * phpCAS::setDebug() accepts FALSE (to stop debugging) or the name of a file (to log informations) (Pascal Aubry)
+
+Changes in version 0.4.1
+New features
+
+    * Sessionning between CAS proxies and services (Pascal Aubry)
+
+Changes in version 0.4
+New features
+
+    * CAS proxies can be chained (Pascal Aubry)
+    * improved error printing and debugging (introduced phpCAS::error()) (Pascal Aubry)
+
+Enhancements
+
+    * proxy parameter removed from phpCAS::client() and introduced phpCAS::proxy() (Pascal Aubry)
+    * moved history from CAS/doc.php to history.php (create_version script updated accordingly) (Pascal Aubry)
+    * improved type-checking and controls for phpCAS methods (Pascal Aubry)
+
+Changes in version 0.3.2
+New features
+
+    * CAS proxies now work with HTTP (HTTPS only used for callbacks) (Pascal Aubry)
+
+Changes in version 0.3.1
+Bug fixes
+
+    * syntax error in CAS/Client.php (Julien Marchal)
+
+Changes in version 0.3
+New features
+
+    * CAS proxies are now supported (but no PGT retrieving for proxied client) (Pascal Aubry)
+    * introduced phpCAS container (Pascal Aubry)
+
+Bug fixes
+
+    * CAS_LANG_DEFAULT is now taken into account (Pascal Aubry)
+
+TODO
+
+    * support for PGT storage to databases (Pascal Aubry)
+    * PGT retrieving for proxied clients (Pascal Aubry)
+
+Version 0.2
+Features (Pascal Aubry)
+
+    * `Basic' (1.0) CAS mechanism supported (CAS proxies not implemented)
+    * Support for CAS versions 1.0 and 2.0 URL's
+    * Debug mode
+    * Customization of all output pages
+    * Internationalization (english and french, looking for translators...)
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/README b/htmltest/sites/all/libraries/CAS.dgeo/docs/README
new file mode 100644
index 00000000..afad0abd
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/README
@@ -0,0 +1,36 @@
+README
+phpCAS - https://wiki.jasig.org/display/CASC/phpCAS
+This software contains a client library for PHP, which can be used to identify
+Central Authentication Service (CAS) authenticated users.
+
+Please see the phpCAS website for more information.
+
+https://wiki.jasig.org/display/CASC/phpCAS
+
+LICENSE
+Copyright © 2003-2010, The ESUP-Portail consortium & the JA-SIG Collaborative.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of the ESUP-Portail consortium & the JA-SIG
+      Collaborative nor the names of its contributors may be used to endorse or
+      promote products derived from this software without specific prior
+      written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/AbstractRequest_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/AbstractRequest_8php.html
new file mode 100644
index 00000000..86a73cd9
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/AbstractRequest_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/Request/AbstractRequest.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/Request/AbstractRequest.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="AbstractRequest_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/AbstractRequest_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/AbstractRequest_8php_source.html
new file mode 100644
index 00000000..b40d84b5
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/AbstractRequest_8php_source.html
@@ -0,0 +1,218 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/Request/AbstractRequest.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/Request/AbstractRequest.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="AbstractRequest_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *         * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *               this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *         * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *               this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *               and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *         * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *               Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *               promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *               written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"></span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 require_once dirname(__FILE__).<span class="stringliteral">&#39;/RequestInterface.php&#39;</span>;
+<a name="l00032"></a>00032 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/Exception.php&#39;</span>);
+<a name="l00033"></a>00033 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/../InvalidArgumentException.php&#39;</span>);
+<a name="l00034"></a>00034 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/../OutOfSequenceException.php&#39;</span>);
+<a name="l00035"></a>00035 
+<a name="l00039"></a><a class="code" href="classCAS__AbstractRequest.html">00039</a> <span class="keyword">abstract</span> <span class="keyword">class </span><a class="code" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a>
+<a name="l00040"></a>00040         <span class="keyword">implements</span> <a class="code" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a>
+<a name="l00041"></a>00041 {
+<a name="l00042"></a>00042 
+<a name="l00043"></a><a class="code" href="classCAS__AbstractRequest.html#ab16b0fdb897db17ac1ff688e1d958de7">00043</a>         <span class="keyword">protected</span> <a class="code" href="classCAS__AbstractRequest.html#ab16b0fdb897db17ac1ff688e1d958de7">$url</a> = null;
+<a name="l00044"></a><a class="code" href="classCAS__AbstractRequest.html#aac0a3f05ed0ede8440d471e6fac19d80">00044</a>         <span class="keyword">protected</span> <a class="code" href="classCAS__AbstractRequest.html#aac0a3f05ed0ede8440d471e6fac19d80">$cookies</a> = array();
+<a name="l00045"></a><a class="code" href="classCAS__AbstractRequest.html#ab754b8d9e59974c4b11c849d8ac6880a">00045</a>         <span class="keyword">protected</span> <a class="code" href="classCAS__AbstractRequest.html#ab754b8d9e59974c4b11c849d8ac6880a">$headers</a> = array();
+<a name="l00046"></a><a class="code" href="classCAS__AbstractRequest.html#a575df6fa81b65ed3dffb3f5e12dad1db">00046</a>         <span class="keyword">protected</span> <a class="code" href="classCAS__AbstractRequest.html#a575df6fa81b65ed3dffb3f5e12dad1db">$isPost</a> = FALSE;
+<a name="l00047"></a><a class="code" href="classCAS__AbstractRequest.html#a11ff9877605f46c02d157fe3d8e4ba13">00047</a>         <span class="keyword">protected</span> <a class="code" href="classCAS__AbstractRequest.html#a11ff9877605f46c02d157fe3d8e4ba13">$postBody</a> = null;
+<a name="l00048"></a><a class="code" href="classCAS__AbstractRequest.html#ae6a9874cd7a448aad2e2c4f1cadc219d">00048</a>         <span class="keyword">protected</span> <a class="code" href="classCAS__AbstractRequest.html#ae6a9874cd7a448aad2e2c4f1cadc219d">$caCertPath</a> = null;
+<a name="l00049"></a><a class="code" href="classCAS__AbstractRequest.html#a9b557de521c65ab01b2dba5ecaaa9019">00049</a>         <span class="keyword">private</span> <a class="code" href="classCAS__AbstractRequest.html#a9b557de521c65ab01b2dba5ecaaa9019">$sent</a> = FALSE;
+<a name="l00050"></a><a class="code" href="classCAS__AbstractRequest.html#affe123d99a4af63b66c3ed889421c471">00050</a>         <span class="keyword">private</span> <a class="code" href="classCAS__AbstractRequest.html#affe123d99a4af63b66c3ed889421c471">$responseHeaders</a> = array();
+<a name="l00051"></a><a class="code" href="classCAS__AbstractRequest.html#a99007554a5272f4d755981f6d9d60f8c">00051</a>         <span class="keyword">private</span> <a class="code" href="classCAS__AbstractRequest.html#a99007554a5272f4d755981f6d9d60f8c">$responseBody</a> = null;
+<a name="l00052"></a><a class="code" href="classCAS__AbstractRequest.html#aaeae803137d9e0853b4f74be77717746">00052</a>         <span class="keyword">private</span> <a class="code" href="classCAS__AbstractRequest.html#aaeae803137d9e0853b4f74be77717746">$errorMessage</a> = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l00053"></a>00053 
+<a name="l00054"></a>00054         <span class="comment">/*********************************************************</span>
+<a name="l00055"></a>00055 <span class="comment">         * Configure the Request</span>
+<a name="l00056"></a>00056 <span class="comment">         *********************************************************/</span>
+<a name="l00057"></a>00057 
+<a name="l00065"></a><a class="code" href="classCAS__AbstractRequest.html#aba433b87d3204f928b8fe1af4b1a1df8">00065</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__AbstractRequest.html#aba433b87d3204f928b8fe1af4b1a1df8">setUrl</a> (<a class="code" href="classCAS__AbstractRequest.html#ab16b0fdb897db17ac1ff688e1d958de7">$url</a>) {
+<a name="l00066"></a>00066                 <span class="keywordflow">if</span> ($this-&gt;sent)
+<a name="l00067"></a>00067                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Request has already been sent cannot &#39;</span>.__METHOD__);
+<a name="l00068"></a>00068 
+<a name="l00069"></a>00069                 $this-&gt;url = <a class="code" href="classCAS__AbstractRequest.html#ab16b0fdb897db17ac1ff688e1d958de7">$url</a>;
+<a name="l00070"></a>00070         }
+<a name="l00071"></a>00071 
+<a name="l00080"></a><a class="code" href="classCAS__AbstractRequest.html#a2e29d483c57f1046e23571507a45d5f3">00080</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__AbstractRequest.html#a2e29d483c57f1046e23571507a45d5f3">addCookie</a> ($name, $value) {
+<a name="l00081"></a>00081                 <span class="keywordflow">if</span> ($this-&gt;sent)
+<a name="l00082"></a>00082                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Request has already been sent cannot &#39;</span>.__METHOD__);
+<a name="l00083"></a>00083 
+<a name="l00084"></a>00084                 $this-&gt;cookies[$name] = $value;
+<a name="l00085"></a>00085         }
+<a name="l00086"></a>00086 
+<a name="l00096"></a><a class="code" href="classCAS__AbstractRequest.html#a6e8e852978e024cbf7ace013305fa189">00096</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__AbstractRequest.html#a6e8e852978e024cbf7ace013305fa189">addCookies</a> (array <a class="code" href="classCAS__AbstractRequest.html#aac0a3f05ed0ede8440d471e6fac19d80">$cookies</a>) {
+<a name="l00097"></a>00097                 <span class="keywordflow">if</span> ($this-&gt;sent)
+<a name="l00098"></a>00098                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Request has already been sent cannot &#39;</span>.__METHOD__);
+<a name="l00099"></a>00099 
+<a name="l00100"></a>00100                 $this-&gt;cookies = array_merge($this-&gt;cookies, $cookies);
+<a name="l00101"></a>00101         }
+<a name="l00102"></a>00102 
+<a name="l00110"></a><a class="code" href="classCAS__AbstractRequest.html#adae53ccc81ddd2cb2fbeceba12fcb5d6">00110</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__AbstractRequest.html#adae53ccc81ddd2cb2fbeceba12fcb5d6">addHeader</a> ($header) {
+<a name="l00111"></a>00111                 <span class="keywordflow">if</span> ($this-&gt;sent)
+<a name="l00112"></a>00112                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Request has already been sent cannot &#39;</span>.__METHOD__);
+<a name="l00113"></a>00113 
+<a name="l00114"></a>00114                 $this-&gt;headers[] = $header;
+<a name="l00115"></a>00115         }
+<a name="l00116"></a>00116 
+<a name="l00124"></a><a class="code" href="classCAS__AbstractRequest.html#ab21afb8f694810cbc7f6111005f39e40">00124</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__AbstractRequest.html#ab21afb8f694810cbc7f6111005f39e40">addHeaders</a> (array <a class="code" href="classCAS__AbstractRequest.html#ab754b8d9e59974c4b11c849d8ac6880a">$headers</a>) {
+<a name="l00125"></a>00125                 <span class="keywordflow">if</span> ($this-&gt;sent)
+<a name="l00126"></a>00126                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Request has already been sent cannot &#39;</span>.__METHOD__);
+<a name="l00127"></a>00127 
+<a name="l00128"></a>00128                 $this-&gt;headers = array_merge($this-&gt;headers, $headers);
+<a name="l00129"></a>00129         }
+<a name="l00130"></a>00130 
+<a name="l00137"></a><a class="code" href="classCAS__AbstractRequest.html#ac430f85c6303a96ffc854c6bbdefd95e">00137</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__AbstractRequest.html#ac430f85c6303a96ffc854c6bbdefd95e">makePost</a> () {
+<a name="l00138"></a>00138                 <span class="keywordflow">if</span> ($this-&gt;sent)
+<a name="l00139"></a>00139                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Request has already been sent cannot &#39;</span>.__METHOD__);
+<a name="l00140"></a>00140 
+<a name="l00141"></a>00141                 $this-&gt;isPost = TRUE;
+<a name="l00142"></a>00142         }
+<a name="l00143"></a>00143 
+<a name="l00151"></a><a class="code" href="classCAS__AbstractRequest.html#a99f6b47e913ed0be7a2e64e3595fed8d">00151</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__AbstractRequest.html#a99f6b47e913ed0be7a2e64e3595fed8d">setPostBody</a> ($body) {
+<a name="l00152"></a>00152                 <span class="keywordflow">if</span> ($this-&gt;sent)
+<a name="l00153"></a>00153                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Request has already been sent cannot &#39;</span>.__METHOD__);
+<a name="l00154"></a>00154                 <span class="keywordflow">if</span> (!$this-&gt;isPost)
+<a name="l00155"></a>00155                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Cannot add a POST body to a GET request, use makePost() first.&#39;</span>);
+<a name="l00156"></a>00156 
+<a name="l00157"></a>00157                 $this-&gt;postBody = $body;
+<a name="l00158"></a>00158         }
+<a name="l00159"></a>00159 
+<a name="l00167"></a><a class="code" href="classCAS__AbstractRequest.html#ae4dd91db303801bfb205aa9f0f12b7f6">00167</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__AbstractRequest.html#ae4dd91db303801bfb205aa9f0f12b7f6">setSslCaCert</a> (<a class="code" href="classCAS__AbstractRequest.html#ae6a9874cd7a448aad2e2c4f1cadc219d">$caCertPath</a>) {
+<a name="l00168"></a>00168                 <span class="keywordflow">if</span> ($this-&gt;sent)
+<a name="l00169"></a>00169                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Request has already been sent cannot &#39;</span>.__METHOD__);
+<a name="l00170"></a>00170 
+<a name="l00171"></a>00171                 $this-&gt;caCertPath = <a class="code" href="classCAS__AbstractRequest.html#ae6a9874cd7a448aad2e2c4f1cadc219d">$caCertPath</a>;
+<a name="l00172"></a>00172         }
+<a name="l00173"></a>00173 
+<a name="l00174"></a>00174         <span class="comment">/*********************************************************</span>
+<a name="l00175"></a>00175 <span class="comment">         * 2. Send the Request</span>
+<a name="l00176"></a>00176 <span class="comment">         *********************************************************/</span>
+<a name="l00177"></a>00177 
+<a name="l00184"></a><a class="code" href="classCAS__AbstractRequest.html#abbd007c2f687b52d0718ce209c325e80">00184</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__AbstractRequest.html#abbd007c2f687b52d0718ce209c325e80">send</a> () {
+<a name="l00185"></a>00185                 <span class="keywordflow">if</span> ($this-&gt;sent)
+<a name="l00186"></a>00186                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Request has already been sent cannot send again.&#39;</span>);
+<a name="l00187"></a>00187                 <span class="keywordflow">if</span> (is_null($this-&gt;url) || !$this-&gt;url)
+<a name="l00188"></a>00188                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;A url must be specified via setUrl() before the request can be sent.&#39;</span>);
+<a name="l00189"></a>00189 
+<a name="l00190"></a>00190                 $this-&gt;sent = <span class="keyword">true</span>;
+<a name="l00191"></a>00191                 <span class="keywordflow">return</span> $this-&gt;<a class="code" href="classCAS__AbstractRequest.html#a43e6cdeecffb2d9eacb6cf0c345903f5">_sendRequest</a>();
+<a name="l00192"></a>00192         }
+<a name="l00193"></a>00193 
+<a name="l00199"></a>00199         <span class="keyword">abstract</span> <span class="keyword">protected</span> function <a class="code" href="classCAS__AbstractRequest.html#a43e6cdeecffb2d9eacb6cf0c345903f5">_sendRequest</a> ();
+<a name="l00200"></a>00200 
+<a name="l00207"></a><a class="code" href="classCAS__AbstractRequest.html#a7a671fde2517c97054187ffe2ba303da">00207</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__AbstractRequest.html#a7a671fde2517c97054187ffe2ba303da">storeResponseHeaders</a> (array <a class="code" href="classCAS__AbstractRequest.html#ab754b8d9e59974c4b11c849d8ac6880a">$headers</a>) {
+<a name="l00208"></a>00208                 $this-&gt;responseHeaders = array_merge($this-&gt;responseHeaders, $headers);
+<a name="l00209"></a>00209         }
+<a name="l00210"></a>00210 
+<a name="l00217"></a><a class="code" href="classCAS__AbstractRequest.html#af99b6e9695cb90d0a1dfd6b117ab06a7">00217</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__AbstractRequest.html#af99b6e9695cb90d0a1dfd6b117ab06a7">storeResponseHeader</a> ($header) {
+<a name="l00218"></a>00218                 $this-&gt;responseHeaders[] = $header;
+<a name="l00219"></a>00219         }
+<a name="l00220"></a>00220 
+<a name="l00227"></a><a class="code" href="classCAS__AbstractRequest.html#a39f3b67606a2d40b23263f8ca257f7f5">00227</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__AbstractRequest.html#a39f3b67606a2d40b23263f8ca257f7f5">storeResponseBody</a> ($body) {
+<a name="l00228"></a>00228                 $this-&gt;responseBody = $body;
+<a name="l00229"></a>00229         }
+<a name="l00230"></a>00230 
+<a name="l00237"></a><a class="code" href="classCAS__AbstractRequest.html#ad0a53a42fa2ebc75e6758521d6c7466b">00237</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__AbstractRequest.html#ad0a53a42fa2ebc75e6758521d6c7466b">storeErrorMessage</a> ($message) {
+<a name="l00238"></a>00238                 $this-&gt;errorMessage .= $message;
+<a name="l00239"></a>00239         }
+<a name="l00240"></a>00240 
+<a name="l00241"></a>00241         <span class="comment">/*********************************************************</span>
+<a name="l00242"></a>00242 <span class="comment">         * 3. Access the response</span>
+<a name="l00243"></a>00243 <span class="comment">         *********************************************************/</span>
+<a name="l00244"></a>00244 
+<a name="l00251"></a><a class="code" href="classCAS__AbstractRequest.html#a3004eb18cf732bb9a79b7a26b765147b">00251</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__AbstractRequest.html#a3004eb18cf732bb9a79b7a26b765147b">getResponseHeaders</a> () {
+<a name="l00252"></a>00252                 <span class="keywordflow">if</span> (!$this-&gt;sent)
+<a name="l00253"></a>00253                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Request has not been sent yet. Cannot &#39;</span>.__METHOD__);
+<a name="l00254"></a>00254 
+<a name="l00255"></a>00255                 <span class="keywordflow">return</span> $this-&gt;responseHeaders;
+<a name="l00256"></a>00256         }
+<a name="l00257"></a>00257         
+<a name="l00264"></a><a class="code" href="classCAS__AbstractRequest.html#ac60da872e526cdd006204502240ad755">00264</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__AbstractRequest.html#ac60da872e526cdd006204502240ad755">getResponseStatusCode</a> () {
+<a name="l00265"></a>00265                 <span class="keywordflow">if</span> (!$this-&gt;sent)
+<a name="l00266"></a>00266                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Request has not been sent yet. Cannot &#39;</span>.__METHOD__);
+<a name="l00267"></a>00267                 
+<a name="l00268"></a>00268                 <span class="keywordflow">if</span> (!preg_match(<span class="stringliteral">&#39;/HTTP\/[0-9.]+\s+([0-9]+)\s*(.*)/&#39;</span>, $this-&gt;responseHeaders[0], $matches))
+<a name="l00269"></a>00269                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__Request__Exception.html">CAS_Request_Exception</a>(<span class="stringliteral">&quot;Bad response, no status code was found in the first line.&quot;</span>);
+<a name="l00270"></a>00270                 
+<a name="l00271"></a>00271                 <span class="keywordflow">return</span> intval($matches[1]);
+<a name="l00272"></a>00272         }
+<a name="l00273"></a>00273 
+<a name="l00280"></a><a class="code" href="classCAS__AbstractRequest.html#a6eadacb1d96591a8f3c45175754d10c5">00280</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__AbstractRequest.html#a6eadacb1d96591a8f3c45175754d10c5">getResponseBody</a> () {
+<a name="l00281"></a>00281                 <span class="keywordflow">if</span> (!$this-&gt;sent)
+<a name="l00282"></a>00282                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Request has not been sent yet. Cannot &#39;</span>.__METHOD__);
+<a name="l00283"></a>00283 
+<a name="l00284"></a>00284                 <span class="keywordflow">return</span> $this-&gt;responseBody;
+<a name="l00285"></a>00285         }
+<a name="l00286"></a>00286 
+<a name="l00293"></a><a class="code" href="classCAS__AbstractRequest.html#a2ef7ce228560085d1897b9283389a524">00293</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__AbstractRequest.html#a2ef7ce228560085d1897b9283389a524">getErrorMessage</a> () {
+<a name="l00294"></a>00294                 <span class="keywordflow">if</span> (!$this-&gt;sent)
+<a name="l00295"></a>00295                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Request has not been sent yet. Cannot &#39;</span>.__METHOD__);
+<a name="l00296"></a>00296 
+<a name="l00297"></a>00297                 <span class="keywordflow">return</span> $this-&gt;errorMessage;
+<a name="l00298"></a>00298         }
+<a name="l00299"></a>00299 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/AbstractStorage_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/AbstractStorage_8php.html
new file mode 100644
index 00000000..5a749e4b
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/AbstractStorage_8php.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/PGTStorage/AbstractStorage.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/PGTStorage/AbstractStorage.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="AbstractStorage_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>Basic class for PGT storage </p>
+
+<p>Definition in file <a class="el" href="AbstractStorage_8php_source.html">AbstractStorage.php</a>.</p>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/AbstractStorage_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/AbstractStorage_8php_source.html
new file mode 100644
index 00000000..10fdd9ff
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/AbstractStorage_8php_source.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/PGTStorage/AbstractStorage.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/PGTStorage/AbstractStorage.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="AbstractStorage_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *     * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *     * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *     * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"></span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00045"></a><a class="code" href="classCAS__PGTStorage__AbstractStorage.html">00045</a> <span class="keyword">abstract</span> <span class="keyword">class </span><a class="code" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a>
+<a name="l00046"></a>00046 {
+<a name="l00052"></a>00052         <span class="comment">// ########################################################################</span>
+<a name="l00053"></a>00053         <span class="comment">//  CONSTRUCTOR</span>
+<a name="l00054"></a>00054         <span class="comment">// ########################################################################</span>
+<a name="l00055"></a>00055 
+<a name="l00063"></a><a class="code" href="group__internalPGTStorage.html#ga9ffd47d7bbf118b901bf1c449f4b20c2">00063</a>         function <a class="code" href="group__internalPGTStorage.html#ga9ffd47d7bbf118b901bf1c449f4b20c2">__construct</a>($cas_parent)
+<a name="l00064"></a>00064         {
+<a name="l00065"></a>00065                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00066"></a>00066                 <span class="keywordflow">if</span> ( !$cas_parent-&gt;isProxy() ) {
+<a name="l00067"></a>00067                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;defining PGT storage makes no sense when not using a CAS proxy&#39;</span>);
+<a name="l00068"></a>00068                 }
+<a name="l00069"></a>00069                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l00070"></a>00070         }
+<a name="l00071"></a>00071 
+<a name="l00072"></a>00072         <span class="comment">// ########################################################################</span>
+<a name="l00073"></a>00073         <span class="comment">//  DEBUGGING</span>
+<a name="l00074"></a>00074         <span class="comment">// ########################################################################</span>
+<a name="l00075"></a>00075 
+<a name="l00082"></a><a class="code" href="group__internalPGTStorage.html#gae0be262b206d9b1c3d5b73ccf91355eb">00082</a>         function <a class="code" href="group__internalPGTStorage.html#gae0be262b206d9b1c3d5b73ccf91355eb">getStorageType</a>()
+<a name="l00083"></a>00083         {
+<a name="l00084"></a>00084                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(__CLASS__.<span class="stringliteral">&#39;::&#39;</span>.__FUNCTION__.<span class="stringliteral">&#39;() should never be called&#39;</span>);
+<a name="l00085"></a>00085         }
+<a name="l00086"></a>00086 
+<a name="l00093"></a><a class="code" href="group__internalPGTStorage.html#ga9611a5217179596541d29d0a8d9ee7e7">00093</a>         function <a class="code" href="group__internalPGTStorage.html#ga9611a5217179596541d29d0a8d9ee7e7">getStorageInfo</a>()
+<a name="l00094"></a>00094         {
+<a name="l00095"></a>00095                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(__CLASS__.<span class="stringliteral">&#39;::&#39;</span>.__FUNCTION__.<span class="stringliteral">&#39;() should never be called&#39;</span>);
+<a name="l00096"></a>00096         }
+<a name="l00097"></a>00097 
+<a name="l00098"></a>00098         <span class="comment">// ########################################################################</span>
+<a name="l00099"></a>00099         <span class="comment">//  ERROR HANDLING</span>
+<a name="l00100"></a>00100         <span class="comment">// ########################################################################</span>
+<a name="l00101"></a>00101 
+<a name="l00110"></a><a class="code" href="group__internalPGTStorage.html#ga90ed7dc15a9c24154900bccc2ea5925d">00110</a>         var <a class="code" href="group__internalPGTStorage.html#ga90ed7dc15a9c24154900bccc2ea5925d">$_error_message</a>=FALSE;
+<a name="l00111"></a>00111 
+<a name="l00121"></a><a class="code" href="group__internalPGTStorage.html#ga1fe701d2302688bb7876eb4f8d7580d8">00121</a>         function <a class="code" href="group__internalPGTStorage.html#ga1fe701d2302688bb7876eb4f8d7580d8">setErrorMessage</a>($error_message)
+<a name="l00122"></a>00122         {
+<a name="l00123"></a>00123                 $this-&gt;_error_message = $error_message;
+<a name="l00124"></a>00124         }
+<a name="l00125"></a>00125 
+<a name="l00135"></a><a class="code" href="group__internalPGTStorage.html#ga68540ebebfe710140d16bab3ef1d61c1">00135</a>         function <a class="code" href="group__internalPGTStorage.html#ga68540ebebfe710140d16bab3ef1d61c1">getErrorMessage</a>()
+<a name="l00136"></a>00136         {
+<a name="l00137"></a>00137                 <span class="keywordflow">return</span> $this-&gt;_error_message;
+<a name="l00138"></a>00138         }
+<a name="l00139"></a>00139 
+<a name="l00140"></a>00140         <span class="comment">// ########################################################################</span>
+<a name="l00141"></a>00141         <span class="comment">//  INITIALIZATION</span>
+<a name="l00142"></a>00142         <span class="comment">// ########################################################################</span>
+<a name="l00143"></a>00143 
+<a name="l00151"></a><a class="code" href="group__internalPGTStorage.html#ga5bab9d6ccaeca2cbcc04ab1a2c0e4d16">00151</a>         var <a class="code" href="group__internalPGTStorage.html#ga5bab9d6ccaeca2cbcc04ab1a2c0e4d16">$_initialized</a> = FALSE;
+<a name="l00152"></a>00152 
+<a name="l00160"></a><a class="code" href="group__internalPGTStorage.html#gad9cadc643a37b8a000acd42189fff761">00160</a>         function <a class="code" href="group__internalPGTStorage.html#gad9cadc643a37b8a000acd42189fff761">isInitialized</a>()
+<a name="l00161"></a>00161         {
+<a name="l00162"></a>00162                 <span class="keywordflow">return</span> $this-&gt;_initialized;
+<a name="l00163"></a>00163         }
+<a name="l00164"></a>00164 
+<a name="l00170"></a><a class="code" href="group__internalPGTStorage.html#gacee98b92299f2aded9f8792005d2eefc">00170</a>         function <a class="code" href="group__internalPGTStorage.html#gacee98b92299f2aded9f8792005d2eefc">init</a>()
+<a name="l00171"></a>00171         {
+<a name="l00172"></a>00172                 $this-&gt;_initialized = TRUE;
+<a name="l00173"></a>00173         }
+<a name="l00174"></a>00174 
+<a name="l00175"></a>00175         <span class="comment">// ########################################################################</span>
+<a name="l00176"></a>00176         <span class="comment">//  PGT I/O</span>
+<a name="l00177"></a>00177         <span class="comment">// ########################################################################</span>
+<a name="l00178"></a>00178 
+<a name="l00188"></a><a class="code" href="group__internalPGTStorage.html#ga28d2bcce9ce91978761746fd9d039edc">00188</a>         function <a class="code" href="group__internalPGTStorage.html#ga28d2bcce9ce91978761746fd9d039edc">write</a>($pgt,$pgt_iou)
+<a name="l00189"></a>00189         {
+<a name="l00190"></a>00190                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(__CLASS__.<span class="stringliteral">&#39;::&#39;</span>.__FUNCTION__.<span class="stringliteral">&#39;() should never be called&#39;</span>);
+<a name="l00191"></a>00191         }
+<a name="l00192"></a>00192 
+<a name="l00202"></a><a class="code" href="group__internalPGTStorage.html#ga67ea1647d16892d59f8e2fd4523f6dc7">00202</a>         function <a class="code" href="group__internalPGTStorage.html#ga67ea1647d16892d59f8e2fd4523f6dc7">read</a>($pgt_iou)
+<a name="l00203"></a>00203         {
+<a name="l00204"></a>00204                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(__CLASS__.<span class="stringliteral">&#39;::&#39;</span>.__FUNCTION__.<span class="stringliteral">&#39;() should never be called&#39;</span>);
+<a name="l00205"></a>00205         }
+<a name="l00206"></a>00206 
+<a name="l00209"></a>00209 }
+<a name="l00210"></a>00210 
+<a name="l00211"></a>00211 <span class="comment">// include specific PGT storage classes</span>
+<a name="l00212"></a>00212 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/Db.php&#39;</span>);
+<a name="l00213"></a>00213 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/File.php&#39;</span>);
+<a name="l00214"></a>00214 
+<a name="l00215"></a>00215 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Abstract_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Abstract_8php.html
new file mode 100644
index 00000000..cbd4da07
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Abstract_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Abstract.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Abstract.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="Abstract_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Abstract_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Abstract_8php_source.html
new file mode 100644
index 00000000..e7943787
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Abstract_8php_source.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Abstract.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Abstract.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="Abstract_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright � 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *               * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *                       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *               * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *                       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *                       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *               * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *                       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *                       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *                       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 require_once(dirname(__FILE__).<span class="stringliteral">&#39;/../ProxiedService.php&#39;</span>);
+<a name="l00032"></a>00032 require_once(dirname(__FILE__).<span class="stringliteral">&#39;/Testable.php&#39;</span>);
+<a name="l00033"></a>00033 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/../InvalidArgumentException.php&#39;</span>);
+<a name="l00034"></a>00034 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/../OutOfSequenceException.php&#39;</span>);
+<a name="l00035"></a>00035 
+<a name="l00036"></a>00036 
+<a name="l00041"></a><a class="code" href="classCAS__ProxiedService__Abstract.html">00041</a> <span class="keyword">abstract</span> <span class="keyword">class </span><a class="code" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a>
+<a name="l00042"></a>00042         <span class="keyword">implements</span> <a class="code" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a>, <a class="code" href="interfaceCAS__ProxiedService__Testable.html">CAS_ProxiedService_Testable</a>
+<a name="l00043"></a>00043 {
+<a name="l00044"></a>00044         
+<a name="l00049"></a><a class="code" href="classCAS__ProxiedService__Abstract.html#ab8c4883fd2ce6a059fdaaba258ecc521">00049</a>         <span class="keyword">private</span> <a class="code" href="classCAS__ProxiedService__Abstract.html#ab8c4883fd2ce6a059fdaaba258ecc521">$_proxyTicket</a>;
+<a name="l00050"></a>00050         
+<a name="l00059"></a><a class="code" href="classCAS__ProxiedService__Abstract.html#a98f8a839194f72d7d6ab05931b9878dc">00059</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxiedService__Abstract.html#a98f8a839194f72d7d6ab05931b9878dc">setProxyTicket</a> ($proxyTicket) {
+<a name="l00060"></a>00060                 <span class="keywordflow">if</span> (empty($proxyTicket))
+<a name="l00061"></a>00061                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a>(<span class="stringliteral">&quot;Trying to initialize with an empty proxy ticket.&quot;</span>);
+<a name="l00062"></a>00062                 <span class="keywordflow">if</span> (!empty($this-&gt;_proxyTicket))
+<a name="l00063"></a>00063                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Already initialized, cannot change the proxy ticket.&#39;</span>);
+<a name="l00064"></a>00064                 
+<a name="l00065"></a>00065                 $this-&gt;_proxyTicket = $proxyTicket;
+<a name="l00066"></a>00066         }
+<a name="l00067"></a>00067         
+<a name="l00074"></a><a class="code" href="classCAS__ProxiedService__Abstract.html#ae0935c6797975015804403ea217b8c9a">00074</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__ProxiedService__Abstract.html#ae0935c6797975015804403ea217b8c9a">getProxyTicket</a> () {
+<a name="l00075"></a>00075                 <span class="keywordflow">if</span> (empty($this-&gt;_proxyTicket))
+<a name="l00076"></a>00076                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;No proxy ticket yet. Call $this-&gt;initializeProxyTicket() to aquire the proxy ticket.&#39;</span>);
+<a name="l00077"></a>00077                 
+<a name="l00078"></a>00078                 <span class="keywordflow">return</span> $this-&gt;_proxyTicket;
+<a name="l00079"></a>00079         }
+<a name="l00080"></a>00080         
+<a name="l00084"></a><a class="code" href="classCAS__ProxiedService__Abstract.html#aa0ae0bb2854d179f8d72756fe7894394">00084</a>         <span class="keyword">private</span> <a class="code" href="classCAS__ProxiedService__Abstract.html#aa0ae0bb2854d179f8d72756fe7894394">$_casClient</a>;
+<a name="l00085"></a>00085         
+<a name="l00097"></a><a class="code" href="classCAS__ProxiedService__Abstract.html#a8287e46abc27c66a92f3c5162b586310">00097</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxiedService__Abstract.html#a8287e46abc27c66a92f3c5162b586310">setCasClient</a> (<a class="code" href="classCAS__Client.html">CAS_Client</a> $casClient) {
+<a name="l00098"></a>00098                 <span class="keywordflow">if</span> (!empty($this-&gt;_proxyTicket))
+<a name="l00099"></a>00099                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Already initialized, cannot change the CAS_Client.&#39;</span>);
+<a name="l00100"></a>00100                 
+<a name="l00101"></a>00101                 $this-&gt;_casClient = $casClient;
+<a name="l00102"></a>00102         }
+<a name="l00103"></a>00103         
+<a name="l00113"></a><a class="code" href="classCAS__ProxiedService__Abstract.html#a8d16ba3f8db0c521f88440b685746693">00113</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__ProxiedService__Abstract.html#a8d16ba3f8db0c521f88440b685746693">initializeProxyTicket</a>() {
+<a name="l00114"></a>00114                 <span class="keywordflow">if</span> (!empty($this-&gt;_proxyTicket))
+<a name="l00115"></a>00115                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Already initialized, cannot initialize again.&#39;</span>);
+<a name="l00116"></a>00116                 
+<a name="l00117"></a>00117                 <span class="comment">// Allow usage of a particular CAS_Client for unit testing.</span>
+<a name="l00118"></a>00118                 <span class="keywordflow">if</span> (empty($this-&gt;_casClient))
+<a name="l00119"></a>00119                         <a class="code" href="group__publicServices.html#ga36fd2939c6bb0d45567512de80994569">phpCAS::initializeProxiedService</a>($this);
+<a name="l00120"></a>00120                 <span class="keywordflow">else</span>
+<a name="l00121"></a>00121                         $this-&gt;_casClient-&gt;initializeProxiedService($this);
+<a name="l00122"></a>00122         }
+<a name="l00123"></a>00123         
+<a name="l00124"></a>00124 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CAS_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CAS_8php.html
new file mode 100644
index 00000000..c1023af6
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CAS_8php.html
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>CAS.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="CAS_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphpCAS.html">phpCAS</a></td></tr>
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="CAS_8php.html#a3e4542187a4c56565db4f8358c9b5164">PHPCAS_VERSION</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga0904e4fb51e532bbba51832326dbf8fb">CAS_VERSION_1_0</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#gaa6440870ffb0a81c5403ac10faa25f33">SAML_VERSION_1_1</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#gacd26ca2be2ce186d1615dfccb376f9bc">SAML_XML_HEADER</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga65ee3a785f518156c26141fe132e5a27">SAML_SOAP_ENV</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga5dd903ec8d4b28382e6e6855d395fc17">SAML_SOAP_BODY</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga8bfd01226a65a1b6adf3a79107c3d0fe">SAMLP_REQUEST</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga513c3d47c1ba7496a57ad89b29594a90">SAMLP_REQUEST_CLOSE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga501612cd6f764c67738e2793ef4c6956">SAML_ASSERTION_ARTIFACT</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga2f7d873f4eb1f98316b3ee7fc9810fc3">SAML_ASSERTION_ARTIFACT_CLOSE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga625743ae96c6e64e2b61f2913aa71d29">SAML_SOAP_BODY_CLOSE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#gac209765f2f59e1ca882627eea2474578">SAML_SOAP_ENV_CLOSE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga3dc3b3b94ff4576889e9d2b5c77a3056">SAML_ATTRIBUTES</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicPGTStorage.html#gaaca9f0a80adfc04e5e274f3b87ea13c4">CAS_PGT_STORAGE_FILE_DEFAULT_PATH</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga30974f0204d0c1e9cf8b0807a1a1a55e">PHPCAS_SERVICE_OK</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga7de1d5537c1fa74b4a180d94dc165c37">PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#gab8fd1de27f50f53dac55bf1287ad0e70">PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga63639adfb3fdbe13a1708e4823380b4d">PHPCAS_SERVICE_PT_FAILURE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#gac745d5b4a48841c8111cbc443fa57211">PHPCAS_SERVICE_NOT_AVAILABLE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga801276ad2c3f6bd1ff8c953891f3693a">PHPCAS_PROXIED_SERVICE_HTTP_GET</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#gaf6e2ec1349ecbe7d039df99ca450dd18">PHPCAS_PROXIED_SERVICE_HTTP_POST</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga78c77beb2a5e39f1cf7a42b547dad39c">PHPCAS_PROXIED_SERVICE_IMAP</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga5984586a097c0e917dd20363600b110c">PHPCAS_LANG_ENGLISH</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga2625c23a266bd8018ac7ed2dd8bc592c">PHPCAS_LANG_FRENCH</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga2ddaa47b527b9c822787762ae7b8728b">PHPCAS_LANG_GREEK</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga085ffcd2c3dbdeb25d603581c042302f">PHPCAS_LANG_GERMAN</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga5f7de216237ed042d381ee6ec78872fe">PHPCAS_LANG_JAPANESE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga1c9367d17d67e279dd9d0fcfc6b121c4">PHPCAS_LANG_SPANISH</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga06f9fdc1bf4d3f97e8e13baa9fb79876">PHPCAS_LANG_CATALAN</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalLang.html#ga09705919fa8acfdfe25b3d8bf78309ac">PHPCAS_LANG_DEFAULT</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#gab6968f526a29ba688e250949b56c0395">DEFAULT_DEBUG_DIR</a> </td></tr>
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga08974bbe1899b5ddc7570d454ca27c80">$GLOBALS</a> ['PHPCAS_CLIENT']</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#gae4b200587aaf8750dd62b04054781032">$GLOBALS</a> ['PHPCAS_INIT_CALL']</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga0833844c10e860f74fe6dadc02d3b8b7">$GLOBALS</a> ['PHPCAS_AUTH_CHECK_CALL']</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga2abd10340f5965a876ccabd507ef8f45">$GLOBALS</a> ['PHPCAS_DEBUG']</td></tr>
+</table>
+<hr/><h2>Enumeration Type Documentation</h2>
+<a class="anchor" id="a3e4542187a4c56565db4f8358c9b5164"></a><!-- doxytag: member="CAS.php::PHPCAS_VERSION" ref="a3e4542187a4c56565db4f8358c9b5164" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="CAS_8php.html#a3e4542187a4c56565db4f8358c9b5164">PHPCAS_VERSION</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="classphpCAS.html">phpCAS</a> version. accessible for the user by phpCAS::getVersion(). </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00065">65</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CAS_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CAS_8php_source.html
new file mode 100644
index 00000000..9586ec0d
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CAS_8php_source.html
@@ -0,0 +1,1148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="CAS_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">/*</span>
+<a name="l00005"></a>00005 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00006"></a>00006 <span class="comment"> * All rights reserved.</span>
+<a name="l00007"></a>00007 <span class="comment"> *</span>
+<a name="l00008"></a>00008 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00009"></a>00009 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00010"></a>00010 <span class="comment"> *</span>
+<a name="l00011"></a>00011 <span class="comment"> *     * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *       this list of conditions and the following disclaimer.</span>
+<a name="l00013"></a>00013 <span class="comment"> *     * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00014"></a>00014 <span class="comment"> *       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00015"></a>00015 <span class="comment"> *       and/or other materials provided with the distribution.</span>
+<a name="l00016"></a>00016 <span class="comment"> *     * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00017"></a>00017 <span class="comment"> *       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00018"></a>00018 <span class="comment"> *       promote products derived from this software without specific prior</span>
+<a name="l00019"></a>00019 <span class="comment"> *       written permission.</span>
+<a name="l00020"></a>00020 <span class="comment"></span>
+<a name="l00021"></a>00021 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00022"></a>00022 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00023"></a>00023 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00024"></a>00024 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00025"></a>00025 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00026"></a>00026 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00027"></a>00027 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00028"></a>00028 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00029"></a>00029 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00030"></a>00030 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00031"></a>00031 <span class="comment"> */</span>
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033 <span class="comment">//</span>
+<a name="l00034"></a>00034 <span class="comment">// hack by Vangelis Haniotakis to handle the absence of $_SERVER[&#39;REQUEST_URI&#39;] in IIS</span>
+<a name="l00035"></a>00035 <span class="comment">//</span>
+<a name="l00036"></a>00036 <span class="keywordflow">if</span> (php_sapi_name() != <span class="stringliteral">&#39;cli&#39;</span>) {
+<a name="l00037"></a>00037         <span class="keywordflow">if</span> (!isset($_SERVER[<span class="stringliteral">&#39;REQUEST_URI&#39;</span>])) {
+<a name="l00038"></a>00038                 $_SERVER[<span class="stringliteral">&#39;REQUEST_URI&#39;</span>] = $_SERVER[<span class="stringliteral">&#39;SCRIPT_NAME&#39;</span>] . <span class="charliteral">&#39;?&#39;</span> . $_SERVER[<span class="stringliteral">&#39;QUERY_STRING&#39;</span>];
+<a name="l00039"></a>00039         }
+<a name="l00040"></a>00040 }
+<a name="l00041"></a>00041 
+<a name="l00042"></a>00042 <span class="comment">// Add a E_USER_DEPRECATED for php versions &lt;= 5.2</span>
+<a name="l00043"></a>00043 <span class="keywordflow">if</span> (!defined(<span class="stringliteral">&#39;E_USER_DEPRECATED&#39;</span>)){
+<a name="l00044"></a>00044         define(<span class="stringliteral">&#39;E_USER_DEPRECATED&#39;</span>, E_USER_NOTICE);
+<a name="l00045"></a>00045 }
+<a name="l00046"></a>00046 
+<a name="l00054"></a>00054 <span class="comment">// ########################################################################</span>
+<a name="l00055"></a>00055 <span class="comment">//  CONSTANTS</span>
+<a name="l00056"></a>00056 <span class="comment">// ########################################################################</span>
+<a name="l00057"></a>00057 
+<a name="l00058"></a>00058 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00059"></a>00059 <span class="comment">//  CAS VERSIONS</span>
+<a name="l00060"></a>00060 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00061"></a>00061 
+<a name="l00065"></a><a class="code" href="CAS_8php.html#a3e4542187a4c56565db4f8358c9b5164">00065</a> define(<span class="stringliteral">&#39;PHPCAS_VERSION&#39;</span>, <span class="stringliteral">&#39;1.2.2&#39;</span>);
+<a name="l00066"></a>00066 
+<a name="l00067"></a>00067 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00068"></a>00068 <span class="comment">//  CAS VERSIONS</span>
+<a name="l00069"></a>00069 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00078"></a><a class="code" href="group__public.html#ga0904e4fb51e532bbba51832326dbf8fb">00078</a> <span class="comment"></span>define(<span class="stringliteral">&quot;CAS_VERSION_1_0&quot;</span>, <span class="stringliteral">&#39;1.0&#39;</span>);
+<a name="l00082"></a><a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">00082</a> define(<span class="stringliteral">&quot;CAS_VERSION_2_0&quot;</span>, <span class="stringliteral">&#39;2.0&#39;</span>);
+<a name="l00083"></a>00083 
+<a name="l00084"></a>00084 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00085"></a>00085 <span class="comment">//  SAML defines</span>
+<a name="l00086"></a>00086 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00087"></a>00087 
+<a name="l00091"></a><a class="code" href="group__public.html#gaa6440870ffb0a81c5403ac10faa25f33">00091</a> define(<span class="stringliteral">&quot;SAML_VERSION_1_1&quot;</span>, <span class="stringliteral">&#39;S1&#39;</span>);
+<a name="l00092"></a>00092 
+<a name="l00096"></a><a class="code" href="group__public.html#gacd26ca2be2ce186d1615dfccb376f9bc">00096</a> define(<span class="stringliteral">&quot;SAML_XML_HEADER&quot;</span>, <span class="stringliteral">&#39;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#39;</span>);
+<a name="l00097"></a>00097 
+<a name="l00101"></a><a class="code" href="group__public.html#ga65ee3a785f518156c26141fe132e5a27">00101</a> define(<span class="stringliteral">&quot;SAML_SOAP_ENV&quot;</span>, <span class="stringliteral">&#39;&lt;SOAP-ENV:Envelope xmlns:SOAP-ENV=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;&gt;&lt;SOAP-ENV:Header/&gt;&#39;</span>);
+<a name="l00102"></a>00102 
+<a name="l00106"></a><a class="code" href="group__public.html#ga5dd903ec8d4b28382e6e6855d395fc17">00106</a> define(<span class="stringliteral">&quot;SAML_SOAP_BODY&quot;</span>, <span class="stringliteral">&#39;&lt;SOAP-ENV:Body&gt;&#39;</span>);
+<a name="l00107"></a>00107 
+<a name="l00111"></a><a class="code" href="group__public.html#ga8bfd01226a65a1b6adf3a79107c3d0fe">00111</a> define(<span class="stringliteral">&quot;SAMLP_REQUEST&quot;</span>, <span class="stringliteral">&#39;&lt;samlp:Request xmlns:samlp=&quot;urn:oasis:names:tc:SAML:1.0:protocol&quot;  MajorVersion=&quot;1&quot; MinorVersion=&quot;1&quot; RequestID=&quot;_192.168.16.51.1024506224022&quot; IssueInstant=&quot;2002-06-19T17:03:44.022Z&quot;&gt;&#39;</span>);
+<a name="l00112"></a><a class="code" href="group__public.html#ga513c3d47c1ba7496a57ad89b29594a90">00112</a> define(<span class="stringliteral">&quot;SAMLP_REQUEST_CLOSE&quot;</span>, <span class="stringliteral">&#39;&lt;/samlp:Request&gt;&#39;</span>);
+<a name="l00113"></a>00113 
+<a name="l00117"></a><a class="code" href="group__public.html#ga501612cd6f764c67738e2793ef4c6956">00117</a> define(<span class="stringliteral">&quot;SAML_ASSERTION_ARTIFACT&quot;</span>, <span class="stringliteral">&#39;&lt;samlp:AssertionArtifact&gt;&#39;</span>);
+<a name="l00118"></a>00118 
+<a name="l00122"></a><a class="code" href="group__public.html#ga2f7d873f4eb1f98316b3ee7fc9810fc3">00122</a> define(<span class="stringliteral">&quot;SAML_ASSERTION_ARTIFACT_CLOSE&quot;</span>, <span class="stringliteral">&#39;&lt;/samlp:AssertionArtifact&gt;&#39;</span>);
+<a name="l00123"></a>00123 
+<a name="l00127"></a><a class="code" href="group__public.html#ga625743ae96c6e64e2b61f2913aa71d29">00127</a> define(<span class="stringliteral">&quot;SAML_SOAP_BODY_CLOSE&quot;</span>, <span class="stringliteral">&#39;&lt;/SOAP-ENV:Body&gt;&#39;</span>);
+<a name="l00128"></a>00128 
+<a name="l00132"></a><a class="code" href="group__public.html#gac209765f2f59e1ca882627eea2474578">00132</a> define(<span class="stringliteral">&quot;SAML_SOAP_ENV_CLOSE&quot;</span>, <span class="stringliteral">&#39;&lt;/SOAP-ENV:Envelope&gt;&#39;</span>);
+<a name="l00133"></a>00133 
+<a name="l00137"></a><a class="code" href="group__public.html#ga3dc3b3b94ff4576889e9d2b5c77a3056">00137</a> define(<span class="stringliteral">&quot;SAML_ATTRIBUTES&quot;</span>, <span class="stringliteral">&#39;SAMLATTRIBS&#39;</span>);
+<a name="l00138"></a>00138 
+<a name="l00144"></a>00144 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00145"></a>00145 <span class="comment">//  FILE PGT STORAGE</span>
+<a name="l00146"></a>00146 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00150"></a><a class="code" href="group__publicPGTStorage.html#gaaca9f0a80adfc04e5e274f3b87ea13c4">00150</a> <span class="comment"></span>define(<span class="stringliteral">&quot;CAS_PGT_STORAGE_FILE_DEFAULT_PATH&quot;</span>, <span class="stringliteral">&#39;/tmp&#39;</span>);
+<a name="l00152"></a>00152 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00153"></a>00153 <span class="comment">// SERVICE ACCESS ERRORS</span>
+<a name="l00154"></a>00154 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00163"></a><a class="code" href="group__publicServices.html#ga30974f0204d0c1e9cf8b0807a1a1a55e">00163</a> <span class="comment"></span>define(<span class="stringliteral">&quot;PHPCAS_SERVICE_OK&quot;</span>, 0);
+<a name="l00168"></a><a class="code" href="group__publicServices.html#ga7de1d5537c1fa74b4a180d94dc165c37">00168</a> define(<span class="stringliteral">&quot;PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE&quot;</span>, 1);
+<a name="l00173"></a><a class="code" href="group__publicServices.html#gab8fd1de27f50f53dac55bf1287ad0e70">00173</a> define(<span class="stringliteral">&quot;PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE&quot;</span>, 2);
+<a name="l00178"></a><a class="code" href="group__publicServices.html#ga63639adfb3fdbe13a1708e4823380b4d">00178</a> define(<span class="stringliteral">&quot;PHPCAS_SERVICE_PT_FAILURE&quot;</span>, 3);
+<a name="l00182"></a><a class="code" href="group__publicServices.html#gac745d5b4a48841c8111cbc443fa57211">00182</a> define(<span class="stringliteral">&quot;PHPCAS_SERVICE_NOT_AVAILABLE&quot;</span>, 4);
+<a name="l00183"></a>00183 
+<a name="l00184"></a>00184 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00185"></a>00185 <span class="comment">// SERVICE TYPES</span>
+<a name="l00186"></a>00186 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00190"></a><a class="code" href="group__publicServices.html#ga801276ad2c3f6bd1ff8c953891f3693a">00190</a> <span class="comment"></span>define(<span class="stringliteral">&quot;PHPCAS_PROXIED_SERVICE_HTTP_GET&quot;</span>, <span class="stringliteral">&#39;CAS_ProxiedService_Http_Get&#39;</span>);
+<a name="l00194"></a><a class="code" href="group__publicServices.html#gaf6e2ec1349ecbe7d039df99ca450dd18">00194</a> define(<span class="stringliteral">&quot;PHPCAS_PROXIED_SERVICE_HTTP_POST&quot;</span>, <span class="stringliteral">&#39;CAS_ProxiedService_Http_Post&#39;</span>);
+<a name="l00198"></a><a class="code" href="group__publicServices.html#ga78c77beb2a5e39f1cf7a42b547dad39c">00198</a> define(<span class="stringliteral">&quot;PHPCAS_PROXIED_SERVICE_IMAP&quot;</span>, <span class="stringliteral">&#39;CAS_ProxiedService_Imap&#39;</span>);
+<a name="l00199"></a>00199 
+<a name="l00200"></a>00200 
+<a name="l00202"></a>00202 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00203"></a>00203 <span class="comment">//  LANGUAGES</span>
+<a name="l00204"></a>00204 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00210"></a><a class="code" href="group__publicLang.html#ga5984586a097c0e917dd20363600b110c">00210</a> <span class="comment"></span>define(<span class="stringliteral">&quot;PHPCAS_LANG_ENGLISH&quot;</span>, <span class="stringliteral">&#39;english&#39;</span>);
+<a name="l00211"></a><a class="code" href="group__publicLang.html#ga2625c23a266bd8018ac7ed2dd8bc592c">00211</a> define(<span class="stringliteral">&quot;PHPCAS_LANG_FRENCH&quot;</span>, <span class="stringliteral">&#39;french&#39;</span>);
+<a name="l00212"></a><a class="code" href="group__publicLang.html#ga2ddaa47b527b9c822787762ae7b8728b">00212</a> define(<span class="stringliteral">&quot;PHPCAS_LANG_GREEK&quot;</span>, <span class="stringliteral">&#39;greek&#39;</span>);
+<a name="l00213"></a><a class="code" href="group__publicLang.html#ga085ffcd2c3dbdeb25d603581c042302f">00213</a> define(<span class="stringliteral">&quot;PHPCAS_LANG_GERMAN&quot;</span>, <span class="stringliteral">&#39;german&#39;</span>);
+<a name="l00214"></a><a class="code" href="group__publicLang.html#ga5f7de216237ed042d381ee6ec78872fe">00214</a> define(<span class="stringliteral">&quot;PHPCAS_LANG_JAPANESE&quot;</span>, <span class="stringliteral">&#39;japanese&#39;</span>);
+<a name="l00215"></a><a class="code" href="group__publicLang.html#ga1c9367d17d67e279dd9d0fcfc6b121c4">00215</a> define(<span class="stringliteral">&quot;PHPCAS_LANG_SPANISH&quot;</span>, <span class="stringliteral">&#39;spanish&#39;</span>);
+<a name="l00216"></a><a class="code" href="group__publicLang.html#ga06f9fdc1bf4d3f97e8e13baa9fb79876">00216</a> define(<span class="stringliteral">&quot;PHPCAS_LANG_CATALAN&quot;</span>, <span class="stringliteral">&#39;catalan&#39;</span>);
+<a name="l00217"></a>00217 
+<a name="l00228"></a><a class="code" href="group__internalLang.html#ga09705919fa8acfdfe25b3d8bf78309ac">00228</a> define(<span class="stringliteral">&quot;PHPCAS_LANG_DEFAULT&quot;</span>, <a class="code" href="group__publicLang.html#ga5984586a097c0e917dd20363600b110c">PHPCAS_LANG_ENGLISH</a>);
+<a name="l00229"></a>00229 
+<a name="l00231"></a>00231 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00232"></a>00232 <span class="comment">//  DEBUG</span>
+<a name="l00233"></a>00233 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00242"></a><a class="code" href="group__publicDebug.html#gab6968f526a29ba688e250949b56c0395">00242</a> <span class="comment"></span>define(<span class="stringliteral">&#39;DEFAULT_DEBUG_DIR&#39;</span>, <span class="stringliteral">&#39;/tmp/&#39;</span>);
+<a name="l00243"></a>00243 
+<a name="l00245"></a>00245 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00246"></a>00246 <span class="comment">//  MISC</span>
+<a name="l00247"></a>00247 <span class="comment">// ------------------------------------------------------------------------</span>
+<a name="l00258"></a><a class="code" href="group__internalMisc.html#ga08974bbe1899b5ddc7570d454ca27c80">00258</a> <span class="comment"></span><a class="code" href="group__internalMisc.html#ga08974bbe1899b5ddc7570d454ca27c80">$GLOBALS</a>[<span class="stringliteral">&#39;PHPCAS_CLIENT&#39;</span>] = null;
+<a name="l00259"></a>00259 
+<a name="l00266"></a><a class="code" href="group__internalMisc.html#gae4b200587aaf8750dd62b04054781032">00266</a> <a class="code" href="group__internalMisc.html#ga08974bbe1899b5ddc7570d454ca27c80">$GLOBALS</a>[<span class="stringliteral">&#39;PHPCAS_INIT_CALL&#39;</span>] = array (
+<a name="l00267"></a>00267         <span class="stringliteral">&#39;done&#39;</span> =&gt; FALSE,
+<a name="l00268"></a>00268         <span class="stringliteral">&#39;file&#39;</span> =&gt; <span class="charliteral">&#39;?&#39;</span>,
+<a name="l00269"></a>00269         <span class="stringliteral">&#39;line&#39;</span> =&gt; -1,
+<a name="l00270"></a>00270         <span class="stringliteral">&#39;method&#39;</span> =&gt; <span class="charliteral">&#39;?&#39;</span>
+<a name="l00271"></a>00271 );
+<a name="l00272"></a>00272 
+<a name="l00279"></a><a class="code" href="group__internalMisc.html#ga0833844c10e860f74fe6dadc02d3b8b7">00279</a> <a class="code" href="group__internalMisc.html#ga08974bbe1899b5ddc7570d454ca27c80">$GLOBALS</a>[<span class="stringliteral">&#39;PHPCAS_AUTH_CHECK_CALL&#39;</span>] = array (
+<a name="l00280"></a>00280         <span class="stringliteral">&#39;done&#39;</span> =&gt; FALSE,
+<a name="l00281"></a>00281         <span class="stringliteral">&#39;file&#39;</span> =&gt; <span class="charliteral">&#39;?&#39;</span>,
+<a name="l00282"></a>00282         <span class="stringliteral">&#39;line&#39;</span> =&gt; -1,
+<a name="l00283"></a>00283         <span class="stringliteral">&#39;method&#39;</span> =&gt; <span class="charliteral">&#39;?&#39;</span>,
+<a name="l00284"></a>00284         <span class="stringliteral">&#39;result&#39;</span> =&gt; FALSE
+<a name="l00285"></a>00285 );
+<a name="l00286"></a>00286 
+<a name="l00292"></a><a class="code" href="group__internalMisc.html#ga2abd10340f5965a876ccabd507ef8f45">00292</a> <a class="code" href="group__internalMisc.html#ga08974bbe1899b5ddc7570d454ca27c80">$GLOBALS</a>[<span class="stringliteral">&#39;PHPCAS_DEBUG&#39;</span>] = array (
+<a name="l00293"></a>00293         <span class="stringliteral">&#39;filename&#39;</span> =&gt; FALSE,
+<a name="l00294"></a>00294         <span class="stringliteral">&#39;indent&#39;</span> =&gt; 0,
+<a name="l00295"></a>00295         <span class="stringliteral">&#39;unique_id&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>
+<a name="l00296"></a>00296 );
+<a name="l00297"></a>00297 
+<a name="l00300"></a>00300 <span class="comment">// ########################################################################</span>
+<a name="l00301"></a>00301 <span class="comment">//  CLIENT CLASS</span>
+<a name="l00302"></a>00302 <span class="comment">// ########################################################################</span>
+<a name="l00303"></a>00303 
+<a name="l00304"></a>00304 <span class="comment">// include client class</span>
+<a name="l00305"></a>00305 include_once (dirname(__FILE__) . <span class="stringliteral">&#39;/CAS/Client.php&#39;</span>);
+<a name="l00306"></a>00306 
+<a name="l00307"></a>00307 <span class="comment">// ########################################################################</span>
+<a name="l00308"></a>00308 <span class="comment">//  INTERFACE CLASS</span>
+<a name="l00309"></a>00309 <span class="comment">// ########################################################################</span>
+<a name="l00310"></a>00310 
+<a name="l00323"></a><a class="code" href="classphpCAS.html">00323</a> <span class="keyword">class </span><a class="code" href="classphpCAS.html">phpCAS</a> {
+<a name="l00324"></a>00324 
+<a name="l00325"></a>00325         <span class="comment">// ########################################################################</span>
+<a name="l00326"></a>00326         <span class="comment">//  INITIALIZATION</span>
+<a name="l00327"></a>00327         <span class="comment">// ########################################################################</span>
+<a name="l00328"></a>00328 
+<a name="l00348"></a><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">00348</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">client</a>($server_version, $server_hostname, $server_port, $server_uri, $start_session = <span class="keyword">true</span>) {
+<a name="l00349"></a>00349                 global $PHPCAS_CLIENT, $PHPCAS_INIT_CALL;
+<a name="l00350"></a>00350 
+<a name="l00351"></a>00351                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l00352"></a>00352                 <span class="keywordflow">if</span> (is_object($PHPCAS_CLIENT)) {
+<a name="l00353"></a>00353                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>($PHPCAS_INIT_CALL[<span class="stringliteral">&#39;method&#39;</span>] . <span class="stringliteral">&#39;() has already been called (at &#39;</span> . $PHPCAS_INIT_CALL[<span class="stringliteral">&#39;file&#39;</span>] . <span class="charliteral">&#39;:&#39;</span> . $PHPCAS_INIT_CALL[<span class="stringliteral">&#39;line&#39;</span>] . <span class="charliteral">&#39;)&#39;</span>);
+<a name="l00354"></a>00354                 }
+<a name="l00355"></a>00355                 <span class="keywordflow">if</span> (gettype($server_version) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00356"></a>00356                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $server_version (should be `string\&#39;)&#39;</span>);
+<a name="l00357"></a>00357                 }
+<a name="l00358"></a>00358                 <span class="keywordflow">if</span> (gettype($server_hostname) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00359"></a>00359                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $server_hostname (should be `string\&#39;)&#39;</span>);
+<a name="l00360"></a>00360                 }
+<a name="l00361"></a>00361                 <span class="keywordflow">if</span> (gettype($server_port) != <span class="stringliteral">&#39;integer&#39;</span>) {
+<a name="l00362"></a>00362                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $server_port (should be `integer\&#39;)&#39;</span>);
+<a name="l00363"></a>00363                 }
+<a name="l00364"></a>00364                 <span class="keywordflow">if</span> (gettype($server_uri) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00365"></a>00365                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $server_uri (should be `string\&#39;)&#39;</span>);
+<a name="l00366"></a>00366                 }
+<a name="l00367"></a>00367 
+<a name="l00368"></a>00368                 <span class="comment">// store where the initializer is called from</span>
+<a name="l00369"></a>00369                 $dbg = debug_backtrace();
+<a name="l00370"></a>00370                 $PHPCAS_INIT_CALL = array (
+<a name="l00371"></a>00371                         <span class="stringliteral">&#39;done&#39;</span> =&gt; TRUE,
+<a name="l00372"></a>00372                         <span class="stringliteral">&#39;file&#39;</span> =&gt; $dbg[0][<span class="stringliteral">&#39;file&#39;</span>],
+<a name="l00373"></a>00373                         <span class="stringliteral">&#39;line&#39;</span> =&gt; $dbg[0][<span class="stringliteral">&#39;line&#39;</span>],
+<a name="l00374"></a>00374                         <span class="stringliteral">&#39;method&#39;</span> =&gt; __CLASS__ . <span class="stringliteral">&#39;::&#39;</span> . __FUNCTION__
+<a name="l00375"></a>00375                 );
+<a name="l00376"></a>00376 
+<a name="l00377"></a>00377                 <span class="comment">// initialize the global object $PHPCAS_CLIENT</span>
+<a name="l00378"></a>00378                 $PHPCAS_CLIENT = <span class="keyword">new</span> <a class="code" href="classCAS__Client.html">CAS_Client</a>($server_version, FALSE <span class="comment">/*proxy*/</span>
+<a name="l00379"></a>00379                 , $server_hostname, $server_port, $server_uri, $start_session);
+<a name="l00380"></a>00380                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l00381"></a>00381         }
+<a name="l00382"></a>00382 
+<a name="l00397"></a><a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">00397</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">proxy</a>($server_version, $server_hostname, $server_port, $server_uri, $start_session = <span class="keyword">true</span>) {
+<a name="l00398"></a>00398                 global $PHPCAS_CLIENT, $PHPCAS_INIT_CALL;
+<a name="l00399"></a>00399 
+<a name="l00400"></a>00400                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l00401"></a>00401                 <span class="keywordflow">if</span> (is_object($PHPCAS_CLIENT)) {
+<a name="l00402"></a>00402                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>($PHPCAS_INIT_CALL[<span class="stringliteral">&#39;method&#39;</span>] . <span class="stringliteral">&#39;() has already been called (at &#39;</span> . $PHPCAS_INIT_CALL[<span class="stringliteral">&#39;file&#39;</span>] . <span class="charliteral">&#39;:&#39;</span> . $PHPCAS_INIT_CALL[<span class="stringliteral">&#39;line&#39;</span>] . <span class="charliteral">&#39;)&#39;</span>);
+<a name="l00403"></a>00403                 }
+<a name="l00404"></a>00404                 <span class="keywordflow">if</span> (gettype($server_version) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00405"></a>00405                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $server_version (should be `string\&#39;)&#39;</span>);
+<a name="l00406"></a>00406                 }
+<a name="l00407"></a>00407                 <span class="keywordflow">if</span> (gettype($server_hostname) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00408"></a>00408                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $server_hostname (should be `string\&#39;)&#39;</span>);
+<a name="l00409"></a>00409                 }
+<a name="l00410"></a>00410                 <span class="keywordflow">if</span> (gettype($server_port) != <span class="stringliteral">&#39;integer&#39;</span>) {
+<a name="l00411"></a>00411                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $server_port (should be `integer\&#39;)&#39;</span>);
+<a name="l00412"></a>00412                 }
+<a name="l00413"></a>00413                 <span class="keywordflow">if</span> (gettype($server_uri) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00414"></a>00414                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $server_uri (should be `string\&#39;)&#39;</span>);
+<a name="l00415"></a>00415                 }
+<a name="l00416"></a>00416 
+<a name="l00417"></a>00417                 <span class="comment">// store where the initialzer is called from</span>
+<a name="l00418"></a>00418                 $dbg = debug_backtrace();
+<a name="l00419"></a>00419                 $PHPCAS_INIT_CALL = array (
+<a name="l00420"></a>00420                         <span class="stringliteral">&#39;done&#39;</span> =&gt; TRUE,
+<a name="l00421"></a>00421                         <span class="stringliteral">&#39;file&#39;</span> =&gt; $dbg[0][<span class="stringliteral">&#39;file&#39;</span>],
+<a name="l00422"></a>00422                         <span class="stringliteral">&#39;line&#39;</span> =&gt; $dbg[0][<span class="stringliteral">&#39;line&#39;</span>],
+<a name="l00423"></a>00423                         <span class="stringliteral">&#39;method&#39;</span> =&gt; __CLASS__ . <span class="stringliteral">&#39;::&#39;</span> . __FUNCTION__
+<a name="l00424"></a>00424                 );
+<a name="l00425"></a>00425 
+<a name="l00426"></a>00426                 <span class="comment">// initialize the global object $PHPCAS_CLIENT</span>
+<a name="l00427"></a>00427                 $PHPCAS_CLIENT = <span class="keyword">new</span> <a class="code" href="classCAS__Client.html">CAS_Client</a>($server_version, TRUE <span class="comment">/*proxy*/</span>
+<a name="l00428"></a>00428                 , $server_hostname, $server_port, $server_uri, $start_session);
+<a name="l00429"></a>00429                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l00430"></a>00430         }
+<a name="l00431"></a>00431 
+<a name="l00433"></a>00433         <span class="comment">// ########################################################################</span>
+<a name="l00434"></a>00434         <span class="comment">//  DEBUGGING</span>
+<a name="l00435"></a>00435         <span class="comment">// ########################################################################</span>
+<a name="l00436"></a>00436 
+<a name="l00447"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">00447</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">setDebug</a>($filename = <span class="stringliteral">&#39;&#39;</span>) {
+<a name="l00448"></a>00448                 global $PHPCAS_DEBUG;
+<a name="l00449"></a>00449 
+<a name="l00450"></a>00450                 <span class="keywordflow">if</span> ($filename != FALSE &amp;&amp; gettype($filename) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00451"></a>00451                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $dbg (should be FALSE or the name of the log file)&#39;</span>);
+<a name="l00452"></a>00452                 }
+<a name="l00453"></a>00453                 <span class="keywordflow">if</span> ($filename === FALSE){
+<a name="l00454"></a>00454                         unset($PHPCAS_DEBUG[<span class="stringliteral">&#39;filename&#39;</span>]);
+<a name="l00455"></a>00455                 }<span class="keywordflow">else</span>{
+<a name="l00456"></a>00456                         <span class="keywordflow">if</span> (empty ($filename)) {
+<a name="l00457"></a>00457                                 <span class="keywordflow">if</span> (preg_match(<span class="stringliteral">&#39;/^Win.*/&#39;</span>, getenv(<span class="stringliteral">&#39;OS&#39;</span>))) {
+<a name="l00458"></a>00458                                         <span class="keywordflow">if</span> (isset ($_ENV[<span class="stringliteral">&#39;TMP&#39;</span>])) {
+<a name="l00459"></a>00459                                                 $debugDir = $_ENV[<span class="stringliteral">&#39;TMP&#39;</span>] . <span class="charliteral">&#39;/&#39;</span>;
+<a name="l00460"></a>00460                                         } <span class="keywordflow">else</span>
+<a name="l00461"></a>00461                                                 <span class="keywordflow">if</span> (isset ($_ENV[<span class="stringliteral">&#39;TEMP&#39;</span>])) {
+<a name="l00462"></a>00462                                                         $debugDir = $_ENV[<span class="stringliteral">&#39;TEMP&#39;</span>] . <span class="charliteral">&#39;/&#39;</span>;
+<a name="l00463"></a>00463                                                 } <span class="keywordflow">else</span> {
+<a name="l00464"></a>00464                                                         $debugDir = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l00465"></a>00465                                                 }
+<a name="l00466"></a>00466                                 } <span class="keywordflow">else</span> {
+<a name="l00467"></a>00467                                         $debugDir = DEFAULT_DEBUG_DIR;
+<a name="l00468"></a>00468                                 }
+<a name="l00469"></a>00469                                 $filename = $debugDir . <span class="stringliteral">&#39;phpCAS.log&#39;</span>;
+<a name="l00470"></a>00470                         }
+<a name="l00471"></a>00471                         
+<a name="l00472"></a>00472                         <span class="keywordflow">if</span> (empty ($PHPCAS_DEBUG[<span class="stringliteral">&#39;unique_id&#39;</span>])) {
+<a name="l00473"></a>00473                                 $PHPCAS_DEBUG[<span class="stringliteral">&#39;unique_id&#39;</span>] = substr(strtoupper(md5(uniqid(<span class="stringliteral">&#39;&#39;</span>))), 0, 4);
+<a name="l00474"></a>00474                         }
+<a name="l00475"></a>00475                         
+<a name="l00476"></a>00476                         $PHPCAS_DEBUG[<span class="stringliteral">&#39;filename&#39;</span>] = $filename;
+<a name="l00477"></a>00477                         
+<a name="l00478"></a>00478                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS :: trace</a>(<span class="stringliteral">&#39;START phpCAS-&#39;</span> . <a class="code" href="CAS_8php.html#a3e4542187a4c56565db4f8358c9b5164">PHPCAS_VERSION</a> . <span class="stringliteral">&#39; ******************&#39;</span>);
+<a name="l00479"></a>00479                 }
+<a name="l00480"></a>00480         }
+<a name="l00481"></a>00481 
+<a name="l00482"></a>00482 
+<a name="l00490"></a><a class="code" href="group__publicDebug.html#ga7e3b47a04a67d840cc60a765090c5505">00490</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicDebug.html#ga7e3b47a04a67d840cc60a765090c5505">log</a>($str) {
+<a name="l00491"></a>00491                 $indent_str = <span class="stringliteral">&quot;.&quot;</span>;
+<a name="l00492"></a>00492                 global $PHPCAS_DEBUG;
+<a name="l00493"></a>00493 
+<a name="l00494"></a>00494                 <span class="keywordflow">if</span> ($PHPCAS_DEBUG[<span class="stringliteral">&#39;filename&#39;</span>]) {
+<a name="l00495"></a>00495                         <span class="keywordflow">for</span> ($i = 0; $i &lt; $PHPCAS_DEBUG[<span class="stringliteral">&#39;indent&#39;</span>]; $i++) {
+<a name="l00496"></a>00496                                 $indent_str .= <span class="stringliteral">&#39;|    &#39;</span>;
+<a name="l00497"></a>00497                         }
+<a name="l00498"></a>00498                         <span class="comment">// allow for multiline output with proper identing. Usefull for dumping cas answers etc.</span>
+<a name="l00499"></a>00499                         $str2 = str_replace(<span class="stringliteral">&quot;\n&quot;</span>, <span class="stringliteral">&quot;\n&quot;</span> . $PHPCAS_DEBUG[<span class="stringliteral">&#39;unique_id&#39;</span>] . <span class="charliteral">&#39; &#39;</span> . $indent_str, $str);
+<a name="l00500"></a>00500                         error_log($PHPCAS_DEBUG[<span class="stringliteral">&#39;unique_id&#39;</span>] . <span class="charliteral">&#39; &#39;</span> . $indent_str . $str2 . <span class="stringliteral">&quot;\n&quot;</span>, 3, $PHPCAS_DEBUG[<span class="stringliteral">&#39;filename&#39;</span>]);
+<a name="l00501"></a>00501                 }
+<a name="l00502"></a>00502 
+<a name="l00503"></a>00503         }
+<a name="l00504"></a>00504 
+<a name="l00513"></a><a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">00513</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">error</a>($msg) {
+<a name="l00514"></a>00514                 $dbg = debug_backtrace();
+<a name="l00515"></a>00515                 $function = <span class="charliteral">&#39;?&#39;</span>;
+<a name="l00516"></a>00516                 $file = <span class="charliteral">&#39;?&#39;</span>;
+<a name="l00517"></a>00517                 $line = <span class="charliteral">&#39;?&#39;</span>;
+<a name="l00518"></a>00518                 <span class="keywordflow">if</span> (is_array($dbg)) {
+<a name="l00519"></a>00519                         <span class="keywordflow">for</span> ($i = 1; $i &lt; <span class="keyword">sizeof</span>($dbg); $i++) {
+<a name="l00520"></a>00520                                 <span class="keywordflow">if</span> (is_array($dbg[$i]) &amp;&amp; isset($dbg[$i][<span class="stringliteral">&#39;class&#39;</span>]) ) {
+<a name="l00521"></a>00521                                         <span class="keywordflow">if</span> ($dbg[$i][<span class="stringliteral">&#39;class&#39;</span>] == __CLASS__) {
+<a name="l00522"></a>00522                                                 $function = $dbg[$i][<span class="stringliteral">&#39;function&#39;</span>];
+<a name="l00523"></a>00523                                                 $file = $dbg[$i][<span class="stringliteral">&#39;file&#39;</span>];
+<a name="l00524"></a>00524                                                 $line = $dbg[$i][<span class="stringliteral">&#39;line&#39;</span>];
+<a name="l00525"></a>00525                                         }
+<a name="l00526"></a>00526                                 }
+<a name="l00527"></a>00527                         }
+<a name="l00528"></a>00528                 }
+<a name="l00529"></a>00529                 echo <span class="stringliteral">&quot;&lt;br /&gt;\n&lt;b&gt;phpCAS error&lt;/b&gt;: &lt;font color=\&quot;FF0000\&quot;&gt;&lt;b&gt;&quot;</span> . __CLASS__ . <span class="stringliteral">&quot;::&quot;</span> . $function . <span class="stringliteral">&#39;(): &#39;</span> . htmlentities($msg) . <span class="stringliteral">&quot;&lt;/b&gt;&lt;/font&gt; in &lt;b&gt;&quot;</span> . $file . <span class="stringliteral">&quot;&lt;/b&gt; on line &lt;b&gt;&quot;</span> . $line . <span class="stringliteral">&quot;&lt;/b&gt;&lt;br /&gt;\n&quot;</span>;
+<a name="l00530"></a>00530                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS :: trace</a>($msg);
+<a name="l00531"></a>00531                 <a class="code" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">phpCAS :: traceExit</a>();
+<a name="l00532"></a>00532                 exit ();
+<a name="l00533"></a>00533         }
+<a name="l00534"></a>00534 
+<a name="l00538"></a><a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">00538</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">trace</a>($str) {
+<a name="l00539"></a>00539                 $dbg = debug_backtrace();
+<a name="l00540"></a>00540                 <a class="code" href="group__publicDebug.html#ga7e3b47a04a67d840cc60a765090c5505">phpCAS :: log</a>($str . <span class="stringliteral">&#39; [&#39;</span> . basename($dbg[0][<span class="stringliteral">&#39;file&#39;</span>]) . <span class="charliteral">&#39;:&#39;</span> . $dbg[0][<span class="stringliteral">&#39;line&#39;</span>] . <span class="charliteral">&#39;]&#39;</span>);
+<a name="l00541"></a>00541         }
+<a name="l00542"></a>00542 
+<a name="l00546"></a><a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">00546</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">traceBegin</a>() {
+<a name="l00547"></a>00547                 global $PHPCAS_DEBUG;
+<a name="l00548"></a>00548 
+<a name="l00549"></a>00549                 $dbg = debug_backtrace();
+<a name="l00550"></a>00550                 $str = <span class="stringliteral">&#39;=&gt; &#39;</span>;
+<a name="l00551"></a>00551                 <span class="keywordflow">if</span> (!empty ($dbg[1][<span class="stringliteral">&#39;class&#39;</span>])) {
+<a name="l00552"></a>00552                         $str .= $dbg[1][<span class="stringliteral">&#39;class&#39;</span>] . <span class="stringliteral">&#39;::&#39;</span>;
+<a name="l00553"></a>00553                 }
+<a name="l00554"></a>00554                 $str .= $dbg[1][<span class="stringliteral">&#39;function&#39;</span>] . <span class="charliteral">&#39;(&#39;</span>;
+<a name="l00555"></a>00555                 <span class="keywordflow">if</span> (is_array($dbg[1][<span class="stringliteral">&#39;args&#39;</span>])) {
+<a name="l00556"></a>00556                         <span class="keywordflow">foreach</span> ($dbg[1][<span class="stringliteral">&#39;args&#39;</span>] as $index =&gt; $arg) {
+<a name="l00557"></a>00557                                 <span class="keywordflow">if</span> ($index != 0) {
+<a name="l00558"></a>00558                                         $str .= <span class="stringliteral">&#39;, &#39;</span>;
+<a name="l00559"></a>00559                                 }
+<a name="l00560"></a>00560                                 <span class="keywordflow">if</span>(is_object($arg)){
+<a name="l00561"></a>00561                                         $str .= get_class($arg);
+<a name="l00562"></a>00562                                 }<span class="keywordflow">else</span>{
+<a name="l00563"></a>00563                                         $str .= str_replace(array(<span class="stringliteral">&quot;\r\n&quot;</span>, <span class="stringliteral">&quot;\n&quot;</span>, <span class="stringliteral">&quot;\r&quot;</span>), <span class="stringliteral">&quot;&quot;</span>, var_export($arg, TRUE));
+<a name="l00564"></a>00564                                 }
+<a name="l00565"></a>00565                         }
+<a name="l00566"></a>00566                 }
+<a name="l00567"></a>00567                 <span class="keywordflow">if</span> (isset($dbg[1][<span class="stringliteral">&#39;file&#39;</span>]))
+<a name="l00568"></a>00568                 $file = basename($dbg[1][<span class="stringliteral">&#39;file&#39;</span>]);
+<a name="l00569"></a>00569                 <span class="keywordflow">else</span>
+<a name="l00570"></a>00570                 $file = <span class="stringliteral">&#39;unknown_file&#39;</span>;
+<a name="l00571"></a>00571                 <span class="keywordflow">if</span> (isset($dbg[1][<span class="stringliteral">&#39;line&#39;</span>]))
+<a name="l00572"></a>00572                 $line = $dbg[1][<span class="stringliteral">&#39;line&#39;</span>];
+<a name="l00573"></a>00573                 <span class="keywordflow">else</span>
+<a name="l00574"></a>00574                 $line = <span class="stringliteral">&#39;unknown_line&#39;</span>;
+<a name="l00575"></a>00575                 $str .= <span class="stringliteral">&#39;) [&#39;</span> . $file . <span class="charliteral">&#39;:&#39;</span> . $line . <span class="charliteral">&#39;]&#39;</span>;
+<a name="l00576"></a>00576                 <a class="code" href="group__publicDebug.html#ga7e3b47a04a67d840cc60a765090c5505">phpCAS :: log</a>($str);
+<a name="l00577"></a>00577                 $PHPCAS_DEBUG[<span class="stringliteral">&#39;indent&#39;</span>]++;
+<a name="l00578"></a>00578         }
+<a name="l00579"></a>00579 
+<a name="l00585"></a><a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">00585</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">traceEnd</a>($res = <span class="stringliteral">&#39;&#39;</span>) {
+<a name="l00586"></a>00586                 global $PHPCAS_DEBUG;
+<a name="l00587"></a>00587 
+<a name="l00588"></a>00588                 $PHPCAS_DEBUG[<span class="stringliteral">&#39;indent&#39;</span>]--;
+<a name="l00589"></a>00589                 $dbg = debug_backtrace();
+<a name="l00590"></a>00590                 $str = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l00591"></a>00591                 <span class="keywordflow">if</span>(is_object($res)){
+<a name="l00592"></a>00592                         $str .= <span class="stringliteral">&#39;&lt;= &#39;</span> . get_class($arg);
+<a name="l00593"></a>00593                 }<span class="keywordflow">else</span>{
+<a name="l00594"></a>00594                         $str .= <span class="stringliteral">&#39;&lt;= &#39;</span> . str_replace(array(<span class="stringliteral">&quot;\r\n&quot;</span>, <span class="stringliteral">&quot;\n&quot;</span>, <span class="stringliteral">&quot;\r&quot;</span>), <span class="stringliteral">&quot;&quot;</span>, var_export($res, TRUE));
+<a name="l00595"></a>00595                 }
+<a name="l00596"></a>00596                 
+<a name="l00597"></a>00597                 <a class="code" href="group__publicDebug.html#ga7e3b47a04a67d840cc60a765090c5505">phpCAS :: log</a>($str);
+<a name="l00598"></a>00598         }
+<a name="l00599"></a>00599 
+<a name="l00603"></a><a class="code" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">00603</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">traceExit</a>() {
+<a name="l00604"></a>00604                 global $PHPCAS_DEBUG;
+<a name="l00605"></a>00605 
+<a name="l00606"></a>00606                 <a class="code" href="group__publicDebug.html#ga7e3b47a04a67d840cc60a765090c5505">phpCAS :: log</a>(<span class="stringliteral">&#39;exit()&#39;</span>);
+<a name="l00607"></a>00607                 <span class="keywordflow">while</span> ($PHPCAS_DEBUG[<span class="stringliteral">&#39;indent&#39;</span>] &gt; 0) {
+<a name="l00608"></a>00608                         <a class="code" href="group__publicDebug.html#ga7e3b47a04a67d840cc60a765090c5505">phpCAS :: log</a>(<span class="charliteral">&#39;-&#39;</span>);
+<a name="l00609"></a>00609                         $PHPCAS_DEBUG[<span class="stringliteral">&#39;indent&#39;</span>]--;
+<a name="l00610"></a>00610                 }
+<a name="l00611"></a>00611         }
+<a name="l00612"></a>00612 
+<a name="l00614"></a>00614         <span class="comment">// ########################################################################</span>
+<a name="l00615"></a>00615         <span class="comment">//  INTERNATIONALIZATION</span>
+<a name="l00616"></a>00616         <span class="comment">// ########################################################################</span>
+<a name="l00630"></a><a class="code" href="group__publicLang.html#ga7eea67859bdfac8e89460a95f5bc961e">00630</a> <span class="comment"></span>        <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicLang.html#ga7eea67859bdfac8e89460a95f5bc961e">setLang</a>($lang) {
+<a name="l00631"></a>00631                 global $PHPCAS_CLIENT;
+<a name="l00632"></a>00632                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l00633"></a>00633                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should not be called before &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00634"></a>00634                 }
+<a name="l00635"></a>00635                 <span class="keywordflow">if</span> (gettype($lang) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00636"></a>00636                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $lang (should be `string\&#39;)&#39;</span>);
+<a name="l00637"></a>00637                 }
+<a name="l00638"></a>00638                 $PHPCAS_CLIENT-&gt;setLang($lang);
+<a name="l00639"></a>00639         }
+<a name="l00640"></a>00640 
+<a name="l00642"></a>00642         <span class="comment">// ########################################################################</span>
+<a name="l00643"></a>00643         <span class="comment">//  VERSION</span>
+<a name="l00644"></a>00644         <span class="comment">// ########################################################################</span>
+<a name="l00655"></a><a class="code" href="group__public.html#ga5c971143e0c319b1268233907ca193b9">00655</a> <span class="comment"></span>        <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__public.html#ga5c971143e0c319b1268233907ca193b9">getVersion</a>() {
+<a name="l00656"></a>00656                 <span class="keywordflow">return</span> PHPCAS_VERSION;
+<a name="l00657"></a>00657         }
+<a name="l00658"></a>00658 
+<a name="l00660"></a>00660         <span class="comment">// ########################################################################</span>
+<a name="l00661"></a>00661         <span class="comment">//  HTML OUTPUT</span>
+<a name="l00662"></a>00662         <span class="comment">// ########################################################################</span>
+<a name="l00673"></a><a class="code" href="group__publicOutput.html#ga9beb490d4e355f131998f1a73c9d6065">00673</a> <span class="comment"></span>        <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicOutput.html#ga9beb490d4e355f131998f1a73c9d6065">setHTMLHeader</a>($header) {
+<a name="l00674"></a>00674                 global $PHPCAS_CLIENT;
+<a name="l00675"></a>00675                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l00676"></a>00676                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should not be called before &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00677"></a>00677                 }
+<a name="l00678"></a>00678                 <span class="keywordflow">if</span> (gettype($header) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00679"></a>00679                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $header (should be `string\&#39;)&#39;</span>);
+<a name="l00680"></a>00680                 }
+<a name="l00681"></a>00681                 $PHPCAS_CLIENT-&gt;setHTMLHeader($header);
+<a name="l00682"></a>00682         }
+<a name="l00683"></a>00683 
+<a name="l00689"></a><a class="code" href="group__publicOutput.html#ga166cd942019d96ef8b4504f2bfb9effd">00689</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicOutput.html#ga166cd942019d96ef8b4504f2bfb9effd">setHTMLFooter</a>($footer) {
+<a name="l00690"></a>00690                 global $PHPCAS_CLIENT;
+<a name="l00691"></a>00691                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l00692"></a>00692                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should not be called before &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00693"></a>00693                 }
+<a name="l00694"></a>00694                 <span class="keywordflow">if</span> (gettype($footer) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00695"></a>00695                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $footer (should be `string\&#39;)&#39;</span>);
+<a name="l00696"></a>00696                 }
+<a name="l00697"></a>00697                 $PHPCAS_CLIENT-&gt;setHTMLFooter($footer);
+<a name="l00698"></a>00698         }
+<a name="l00699"></a>00699 
+<a name="l00701"></a>00701         <span class="comment">// ########################################################################</span>
+<a name="l00702"></a>00702         <span class="comment">//  PGT STORAGE</span>
+<a name="l00703"></a>00703         <span class="comment">// ########################################################################</span>
+<a name="l00714"></a><a class="code" href="group__publicPGTStorage.html#ga66de471cfec81a09a24d482d472706cf">00714</a> <span class="comment"></span>        <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicPGTStorage.html#ga66de471cfec81a09a24d482d472706cf">setPGTStorage</a>($storage) {
+<a name="l00715"></a>00715                 global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+<a name="l00716"></a>00716 
+<a name="l00717"></a>00717                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l00718"></a>00718                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l00719"></a>00719                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00720"></a>00720                 }
+<a name="l00721"></a>00721                 <span class="keywordflow">if</span> (!$PHPCAS_CLIENT-&gt;isProxy()) {
+<a name="l00722"></a>00722                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00723"></a>00723                 }
+<a name="l00724"></a>00724                 <span class="keywordflow">if</span> ($PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;done&#39;</span>]) {
+<a name="l00725"></a>00725                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called before &#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;method&#39;</span>] . <span class="stringliteral">&#39;() (called at &#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;file&#39;</span>] . <span class="charliteral">&#39;:&#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;line&#39;</span>] . <span class="charliteral">&#39;)&#39;</span>);
+<a name="l00726"></a>00726                 }
+<a name="l00727"></a>00727                 <span class="keywordflow">if</span> ( !($storage instanceof CAS_PGTStorage) ) {
+<a name="l00728"></a>00728                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $storage (should be a CAS_PGTStorage `object\&#39;)&#39;</span>);
+<a name="l00729"></a>00729                 }
+<a name="l00730"></a>00730                 $PHPCAS_CLIENT-&gt;setPGTStorage($storage);
+<a name="l00731"></a>00731                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l00732"></a>00732         }
+<a name="l00733"></a>00733 
+<a name="l00744"></a><a class="code" href="group__publicPGTStorage.html#ga10e7b70f0634dc65bb19db50f3cc847b">00744</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicPGTStorage.html#ga10e7b70f0634dc65bb19db50f3cc847b">setPGTStorageDb</a>($dsn_or_pdo, $username=<span class="stringliteral">&#39;&#39;</span>, $password=<span class="stringliteral">&#39;&#39;</span>, $table=<span class="stringliteral">&#39;&#39;</span>, $driver_options=null) {
+<a name="l00745"></a>00745                 global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+<a name="l00746"></a>00746 
+<a name="l00747"></a>00747                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l00748"></a>00748                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l00749"></a>00749                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00750"></a>00750                 }
+<a name="l00751"></a>00751                 <span class="keywordflow">if</span> (!$PHPCAS_CLIENT-&gt;isProxy()) {
+<a name="l00752"></a>00752                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00753"></a>00753                 }
+<a name="l00754"></a>00754                 <span class="keywordflow">if</span> ($PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;done&#39;</span>]) {
+<a name="l00755"></a>00755                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called before &#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;method&#39;</span>] . <span class="stringliteral">&#39;() (called at &#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;file&#39;</span>] . <span class="charliteral">&#39;:&#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;line&#39;</span>] . <span class="charliteral">&#39;)&#39;</span>);
+<a name="l00756"></a>00756                 }
+<a name="l00757"></a>00757                 <span class="keywordflow">if</span> (gettype($username) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00758"></a>00758                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $username (should be `string\&#39;)&#39;</span>);
+<a name="l00759"></a>00759                 }
+<a name="l00760"></a>00760                 <span class="keywordflow">if</span> (gettype($password) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00761"></a>00761                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $password (should be `string\&#39;)&#39;</span>);
+<a name="l00762"></a>00762                 }
+<a name="l00763"></a>00763                 <span class="keywordflow">if</span> (gettype($table) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00764"></a>00764                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $table (should be `string\&#39;)&#39;</span>);
+<a name="l00765"></a>00765                 }
+<a name="l00766"></a>00766                 $PHPCAS_CLIENT-&gt;setPGTStorageDb($dsn_or_pdo, $username, $password, $table, $driver_options);
+<a name="l00767"></a>00767                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l00768"></a>00768         }
+<a name="l00769"></a>00769         
+<a name="l00776"></a><a class="code" href="group__publicPGTStorage.html#gafad174fa82241a2d6aef2d7be15fa387">00776</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicPGTStorage.html#gafad174fa82241a2d6aef2d7be15fa387">setPGTStorageFile</a>($format = <span class="stringliteral">&#39;&#39;</span>, $path = <span class="stringliteral">&#39;&#39;</span>) {
+<a name="l00777"></a>00777                 global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+<a name="l00778"></a>00778 
+<a name="l00779"></a>00779                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l00780"></a>00780                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l00781"></a>00781                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00782"></a>00782                 }
+<a name="l00783"></a>00783                 <span class="keywordflow">if</span> (!$PHPCAS_CLIENT-&gt;isProxy()) {
+<a name="l00784"></a>00784                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00785"></a>00785                 }
+<a name="l00786"></a>00786                 <span class="keywordflow">if</span> ($PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;done&#39;</span>]) {
+<a name="l00787"></a>00787                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called before &#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;method&#39;</span>] . <span class="stringliteral">&#39;() (called at &#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;file&#39;</span>] . <span class="charliteral">&#39;:&#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;line&#39;</span>] . <span class="charliteral">&#39;)&#39;</span>);
+<a name="l00788"></a>00788                 }
+<a name="l00789"></a>00789                 <span class="keywordflow">if</span> (gettype($format) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00790"></a>00790                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $format (should be `string\&#39;)&#39;</span>);
+<a name="l00791"></a>00791                 }
+<a name="l00792"></a>00792                 <span class="keywordflow">if</span> (gettype($path) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00793"></a>00793                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $format (should be `string\&#39;)&#39;</span>);
+<a name="l00794"></a>00794                 }
+<a name="l00795"></a>00795                 $PHPCAS_CLIENT-&gt;setPGTStorageFile($path);
+<a name="l00796"></a>00796                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l00797"></a>00797         }
+<a name="l00798"></a>00798         
+<a name="l00800"></a>00800         <span class="comment">// ########################################################################</span>
+<a name="l00801"></a>00801         <span class="comment">// ACCESS TO EXTERNAL SERVICES</span>
+<a name="l00802"></a>00802         <span class="comment">// ########################################################################</span>
+<a name="l00820"></a><a class="code" href="group__publicServices.html#gaf3de7e9db40d6b15b6c8cb8dc8cb42eb">00820</a> <span class="comment"></span>        <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicServices.html#gaf3de7e9db40d6b15b6c8cb8dc8cb42eb">getProxiedService</a> ($type) {
+<a name="l00821"></a>00821                 global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+<a name="l00822"></a>00822 
+<a name="l00823"></a>00823                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l00824"></a>00824                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l00825"></a>00825                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00826"></a>00826                 }
+<a name="l00827"></a>00827                 <span class="keywordflow">if</span> (!$PHPCAS_CLIENT-&gt;isProxy()) {
+<a name="l00828"></a>00828                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00829"></a>00829                 }
+<a name="l00830"></a>00830                 <span class="keywordflow">if</span> (!$PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;done&#39;</span>]) {
+<a name="l00831"></a>00831                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after the programmer is sure the user has been authenticated (by calling &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::checkAuthentication() or &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::forceAuthentication()&#39;</span>);
+<a name="l00832"></a>00832                 }
+<a name="l00833"></a>00833                 <span class="keywordflow">if</span> (!$PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;result&#39;</span>]) {
+<a name="l00834"></a>00834                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;authentication was checked (by &#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;method&#39;</span>] . <span class="stringliteral">&#39;() at &#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;file&#39;</span>] . <span class="charliteral">&#39;:&#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;line&#39;</span>] . <span class="stringliteral">&#39;) but the method returned FALSE&#39;</span>);
+<a name="l00835"></a>00835                 }
+<a name="l00836"></a>00836                 <span class="keywordflow">if</span> (gettype($type) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00837"></a>00837                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $type (should be `string\&#39;)&#39;</span>);
+<a name="l00838"></a>00838                 }
+<a name="l00839"></a>00839 
+<a name="l00840"></a>00840                 $res = $PHPCAS_CLIENT-&gt;getProxiedService($type);
+<a name="l00841"></a>00841 
+<a name="l00842"></a>00842                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l00843"></a>00843                 <span class="keywordflow">return</span> $res;
+<a name="l00844"></a>00844         }
+<a name="l00845"></a>00845         
+<a name="l00857"></a><a class="code" href="group__publicServices.html#ga36fd2939c6bb0d45567512de80994569">00857</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicServices.html#ga36fd2939c6bb0d45567512de80994569">initializeProxiedService</a> (<a class="code" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a> $proxiedService) {
+<a name="l00858"></a>00858                 global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+<a name="l00859"></a>00859 
+<a name="l00860"></a>00860                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l00861"></a>00861                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00862"></a>00862                 }
+<a name="l00863"></a>00863                 <span class="keywordflow">if</span> (!$PHPCAS_CLIENT-&gt;isProxy()) {
+<a name="l00864"></a>00864                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00865"></a>00865                 }
+<a name="l00866"></a>00866                 <span class="keywordflow">if</span> (!$PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;done&#39;</span>]) {
+<a name="l00867"></a>00867                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after the programmer is sure the user has been authenticated (by calling &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::checkAuthentication() or &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::forceAuthentication()&#39;</span>);
+<a name="l00868"></a>00868                 }
+<a name="l00869"></a>00869                 <span class="keywordflow">if</span> (!$PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;result&#39;</span>]) {
+<a name="l00870"></a>00870                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;authentication was checked (by &#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;method&#39;</span>] . <span class="stringliteral">&#39;() at &#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;file&#39;</span>] . <span class="charliteral">&#39;:&#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;line&#39;</span>] . <span class="stringliteral">&#39;) but the method returned FALSE&#39;</span>);
+<a name="l00871"></a>00871                 }
+<a name="l00872"></a>00872 
+<a name="l00873"></a>00873                 $PHPCAS_CLIENT-&gt;initializeProxiedService($proxiedService);
+<a name="l00874"></a>00874         }
+<a name="l00875"></a>00875         
+<a name="l00889"></a><a class="code" href="group__publicServices.html#ga11e980f85bd420a42672148e9f1f8d82">00889</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicServices.html#ga11e980f85bd420a42672148e9f1f8d82">serviceWeb</a>($url, &amp; $err_code, &amp; $output) {
+<a name="l00890"></a>00890                 global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+<a name="l00891"></a>00891 
+<a name="l00892"></a>00892                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l00893"></a>00893                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l00894"></a>00894                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00895"></a>00895                 }
+<a name="l00896"></a>00896                 <span class="keywordflow">if</span> (!$PHPCAS_CLIENT-&gt;isProxy()) {
+<a name="l00897"></a>00897                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00898"></a>00898                 }
+<a name="l00899"></a>00899                 <span class="keywordflow">if</span> (!$PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;done&#39;</span>]) {
+<a name="l00900"></a>00900                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after the programmer is sure the user has been authenticated (by calling &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::checkAuthentication() or &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::forceAuthentication()&#39;</span>);
+<a name="l00901"></a>00901                 }
+<a name="l00902"></a>00902                 <span class="keywordflow">if</span> (!$PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;result&#39;</span>]) {
+<a name="l00903"></a>00903                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;authentication was checked (by &#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;method&#39;</span>] . <span class="stringliteral">&#39;() at &#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;file&#39;</span>] . <span class="charliteral">&#39;:&#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;line&#39;</span>] . <span class="stringliteral">&#39;) but the method returned FALSE&#39;</span>);
+<a name="l00904"></a>00904                 }
+<a name="l00905"></a>00905                 <span class="keywordflow">if</span> (gettype($url) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00906"></a>00906                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $url (should be `string\&#39;)&#39;</span>);
+<a name="l00907"></a>00907                 }
+<a name="l00908"></a>00908 
+<a name="l00909"></a>00909                 $res = $PHPCAS_CLIENT-&gt;serviceWeb($url, $err_code, $output);
+<a name="l00910"></a>00910 
+<a name="l00911"></a>00911                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>($res);
+<a name="l00912"></a>00912                 <span class="keywordflow">return</span> $res;
+<a name="l00913"></a>00913         }
+<a name="l00914"></a>00914 
+<a name="l00932"></a><a class="code" href="group__publicServices.html#ga700b64756f9a83b13365dc79ccd5e9ac">00932</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicServices.html#ga700b64756f9a83b13365dc79ccd5e9ac">serviceMail</a>($url, $service, $flags, &amp; $err_code, &amp; $err_msg, &amp; $pt) {
+<a name="l00933"></a>00933                 global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+<a name="l00934"></a>00934 
+<a name="l00935"></a>00935                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l00936"></a>00936                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l00937"></a>00937                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00938"></a>00938                 }
+<a name="l00939"></a>00939                 <span class="keywordflow">if</span> (!$PHPCAS_CLIENT-&gt;isProxy()) {
+<a name="l00940"></a>00940                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00941"></a>00941                 }
+<a name="l00942"></a>00942                 <span class="keywordflow">if</span> (!$PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;done&#39;</span>]) {
+<a name="l00943"></a>00943                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after the programmer is sure the user has been authenticated (by calling &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::checkAuthentication() or &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::forceAuthentication()&#39;</span>);
+<a name="l00944"></a>00944                 }
+<a name="l00945"></a>00945                 <span class="keywordflow">if</span> (!$PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;result&#39;</span>]) {
+<a name="l00946"></a>00946                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;authentication was checked (by &#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;method&#39;</span>] . <span class="stringliteral">&#39;() at &#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;file&#39;</span>] . <span class="charliteral">&#39;:&#39;</span> . $PHPCAS_AUTH_CHECK_CALL[<span class="stringliteral">&#39;line&#39;</span>] . <span class="stringliteral">&#39;) but the method returned FALSE&#39;</span>);
+<a name="l00947"></a>00947                 }
+<a name="l00948"></a>00948                 <span class="keywordflow">if</span> (gettype($url) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l00949"></a>00949                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $url (should be `string\&#39;)&#39;</span>);
+<a name="l00950"></a>00950                 }
+<a name="l00951"></a>00951 
+<a name="l00952"></a>00952                 <span class="keywordflow">if</span> (gettype($flags) != <span class="stringliteral">&#39;integer&#39;</span>) {
+<a name="l00953"></a>00953                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $flags (should be `integer\&#39;)&#39;</span>);
+<a name="l00954"></a>00954                 }
+<a name="l00955"></a>00955 
+<a name="l00956"></a>00956                 $res = $PHPCAS_CLIENT-&gt;serviceMail($url, $service, $flags, $err_code, $err_msg, $pt);
+<a name="l00957"></a>00957 
+<a name="l00958"></a>00958                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>($res);
+<a name="l00959"></a>00959                 <span class="keywordflow">return</span> $res;
+<a name="l00960"></a>00960         }
+<a name="l00961"></a>00961 
+<a name="l00963"></a>00963         <span class="comment">// ########################################################################</span>
+<a name="l00964"></a>00964         <span class="comment">//  AUTHENTICATION</span>
+<a name="l00965"></a>00965         <span class="comment">// ########################################################################</span>
+<a name="l00979"></a><a class="code" href="group__publicAuth.html#ga6c3433e912dce36c51ebd5732bd43d07">00979</a> <span class="comment"></span>        <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga6c3433e912dce36c51ebd5732bd43d07">setCacheTimesForAuthRecheck</a>($n) {
+<a name="l00980"></a>00980                 global $PHPCAS_CLIENT;
+<a name="l00981"></a>00981                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l00982"></a>00982                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should not be called before &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l00983"></a>00983                 }
+<a name="l00984"></a>00984                 <span class="keywordflow">if</span> (gettype($n) != <span class="stringliteral">&#39;integer&#39;</span>) {
+<a name="l00985"></a>00985                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $header (should be `string\&#39;)&#39;</span>);
+<a name="l00986"></a>00986                 }
+<a name="l00987"></a>00987                 $PHPCAS_CLIENT-&gt;setCacheTimesForAuthRecheck($n);
+<a name="l00988"></a>00988         }
+<a name="l00989"></a>00989         
+<a name="l01008"></a><a class="code" href="group__publicAuth.html#gaef46bf2c415a72f1e81a1bf3a75b1324">01008</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#gaef46bf2c415a72f1e81a1bf3a75b1324">setPostAuthenticateCallback</a> ($function, array $additionalArgs = array()) {
+<a name="l01009"></a>01009                 global $PHPCAS_CLIENT;
+<a name="l01010"></a>01010                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01011"></a>01011                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should not be called before &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01012"></a>01012                 }
+<a name="l01013"></a>01013                 
+<a name="l01014"></a>01014                 $PHPCAS_CLIENT-&gt;setPostAuthenticateCallback($function, $additionalArgs);
+<a name="l01015"></a>01015         }
+<a name="l01016"></a>01016         
+<a name="l01030"></a><a class="code" href="group__publicAuth.html#ga996cb0478f7f35fca4dd33c9714d2452">01030</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga996cb0478f7f35fca4dd33c9714d2452">setSingleSignoutCallback</a> ($function, array $additionalArgs = array()) {
+<a name="l01031"></a>01031                 global $PHPCAS_CLIENT;
+<a name="l01032"></a>01032                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01033"></a>01033                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should not be called before &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01034"></a>01034                 }
+<a name="l01035"></a>01035                 
+<a name="l01036"></a>01036                 $PHPCAS_CLIENT-&gt;setSingleSignoutCallback($function, $additionalArgs);
+<a name="l01037"></a>01037         }
+<a name="l01038"></a>01038 
+<a name="l01045"></a><a class="code" href="group__publicAuth.html#ga21fd1c2665d2e21c03e6a6dd1860cf4d">01045</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga21fd1c2665d2e21c03e6a6dd1860cf4d">checkAuthentication</a>() {
+<a name="l01046"></a>01046                 global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+<a name="l01047"></a>01047 
+<a name="l01048"></a>01048                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01049"></a>01049                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01050"></a>01050                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should not be called before &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01051"></a>01051                 }
+<a name="l01052"></a>01052 
+<a name="l01053"></a>01053                 <a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a> = $PHPCAS_CLIENT-&gt;checkAuthentication();
+<a name="l01054"></a>01054 
+<a name="l01055"></a>01055                 <span class="comment">// store where the authentication has been checked and the result</span>
+<a name="l01056"></a>01056                 $dbg = debug_backtrace();
+<a name="l01057"></a>01057                 $PHPCAS_AUTH_CHECK_CALL = array (
+<a name="l01058"></a>01058                         <span class="stringliteral">&#39;done&#39;</span> =&gt; TRUE,
+<a name="l01059"></a>01059                         <span class="stringliteral">&#39;file&#39;</span> =&gt; $dbg[0][<span class="stringliteral">&#39;file&#39;</span>],
+<a name="l01060"></a>01060                         <span class="stringliteral">&#39;line&#39;</span> =&gt; $dbg[0][<span class="stringliteral">&#39;line&#39;</span>],
+<a name="l01061"></a>01061                         <span class="stringliteral">&#39;method&#39;</span> =&gt; __CLASS__ . <span class="stringliteral">&#39;::&#39;</span> . __FUNCTION__,
+<a name="l01062"></a>01062                         <span class="stringliteral">&#39;result&#39;</span> =&gt; <a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a>
+<a name="l01063"></a>01063                 );
+<a name="l01064"></a>01064                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>(<a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a>);
+<a name="l01065"></a>01065                 <span class="keywordflow">return</span> <a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a>;
+<a name="l01066"></a>01066         }
+<a name="l01067"></a>01067 
+<a name="l01073"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">01073</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">forceAuthentication</a>() {
+<a name="l01074"></a>01074                 global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;
+<a name="l01075"></a>01075 
+<a name="l01076"></a>01076                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01077"></a>01077                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01078"></a>01078                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should not be called before &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01079"></a>01079                 }
+<a name="l01080"></a>01080 
+<a name="l01081"></a>01081                 <a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a> = $PHPCAS_CLIENT-&gt;forceAuthentication();
+<a name="l01082"></a>01082 
+<a name="l01083"></a>01083                 <span class="comment">// store where the authentication has been checked and the result</span>
+<a name="l01084"></a>01084                 $dbg = debug_backtrace();
+<a name="l01085"></a>01085                 $PHPCAS_AUTH_CHECK_CALL = array (
+<a name="l01086"></a>01086                         <span class="stringliteral">&#39;done&#39;</span> =&gt; TRUE,
+<a name="l01087"></a>01087                         <span class="stringliteral">&#39;file&#39;</span> =&gt; $dbg[0][<span class="stringliteral">&#39;file&#39;</span>],
+<a name="l01088"></a>01088                         <span class="stringliteral">&#39;line&#39;</span> =&gt; $dbg[0][<span class="stringliteral">&#39;line&#39;</span>],
+<a name="l01089"></a>01089                         <span class="stringliteral">&#39;method&#39;</span> =&gt; __CLASS__ . <span class="stringliteral">&#39;::&#39;</span> . __FUNCTION__,
+<a name="l01090"></a>01090                         <span class="stringliteral">&#39;result&#39;</span> =&gt; <a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a>
+<a name="l01091"></a>01091                 );
+<a name="l01092"></a>01092 
+<a name="l01093"></a>01093                 <span class="keywordflow">if</span> (!<a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a>) {
+<a name="l01094"></a>01094                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS :: trace</a>(<span class="stringliteral">&#39;user is not authenticated, redirecting to the CAS server&#39;</span>);
+<a name="l01095"></a>01095                         $PHPCAS_CLIENT-&gt;forceAuthentication();
+<a name="l01096"></a>01096                 } <span class="keywordflow">else</span> {
+<a name="l01097"></a>01097                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS :: trace</a>(<span class="stringliteral">&#39;no need to authenticate (user `&#39;</span> . <a class="code" href="group__publicAuth.html#ga4c9f984b474b550cf316396e87670b18">phpCAS :: getUser</a>() . <span class="charliteral">&#39;\&#39;</span> is already authenticated)<span class="stringliteral">&#39;);</span>
+<a name="l01098"></a>01098 <span class="stringliteral">                }</span>
+<a name="l01099"></a>01099 <span class="stringliteral"></span>
+<a name="l01100"></a>01100 <span class="stringliteral">                phpCAS :: traceEnd();</span>
+<a name="l01101"></a>01101 <span class="stringliteral">                return $auth;</span>
+<a name="l01102"></a>01102 <span class="stringliteral">        }</span>
+<a name="l01103"></a>01103 <span class="stringliteral"></span>
+<a name="l01107"></a><a class="code" href="group__publicAuth.html#ga368b22dab91392a949dbfe902f2ac5f5">01107</a> <span class="stringliteral">        public static function renewAuthentication() {</span>
+<a name="l01108"></a>01108 <span class="stringliteral">                global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;</span>
+<a name="l01109"></a>01109 <span class="stringliteral"></span>
+<a name="l01110"></a>01110 <span class="stringliteral">                phpCAS :: traceBegin();</span>
+<a name="l01111"></a>01111 <span class="stringliteral">                if (!is_object($PHPCAS_CLIENT)) {</span>
+<a name="l01112"></a>01112 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should not be called before<span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">::client</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">proxy</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01113"></a>01113 <span class="stringliteral">                }</span>
+<a name="l01114"></a>01114 <span class="stringliteral">                $auth = $PHPCAS_CLIENT-&gt;renewAuthentication();</span>
+<a name="l01115"></a>01115 <span class="stringliteral">                // store where the authentication has been checked and the result</span>
+<a name="l01116"></a>01116 <span class="stringliteral">                $dbg = debug_backtrace();</span>
+<a name="l01117"></a>01117 <span class="stringliteral">                $PHPCAS_AUTH_CHECK_CALL = array (</span>
+<a name="l01118"></a>01118 <span class="stringliteral">                        &#39;</span>done<span class="stringliteral">&#39; =&gt; TRUE,</span>
+<a name="l01119"></a>01119 <span class="stringliteral">                        &#39;</span>file<span class="stringliteral">&#39; =&gt; $dbg[0][&#39;</span>file<span class="stringliteral">&#39;],</span>
+<a name="l01120"></a>01120 <span class="stringliteral">                        &#39;</span>line<span class="stringliteral">&#39; =&gt; $dbg[0][&#39;</span>line<span class="stringliteral">&#39;],</span>
+<a name="l01121"></a>01121 <span class="stringliteral">                        &#39;</span>method<span class="stringliteral">&#39; =&gt; __CLASS__ . &#39;</span>::<span class="stringliteral">&#39; . __FUNCTION__,</span>
+<a name="l01122"></a>01122 <span class="stringliteral">                        &#39;</span>result<span class="stringliteral">&#39; =&gt; $auth</span>
+<a name="l01123"></a>01123 <span class="stringliteral">                );</span>
+<a name="l01124"></a>01124 <span class="stringliteral"></span>
+<a name="l01125"></a>01125 <span class="stringliteral">                //$PHPCAS_CLIENT-&gt;renewAuthentication();</span>
+<a name="l01126"></a>01126 <span class="stringliteral">                phpCAS :: traceEnd();</span>
+<a name="l01127"></a>01127 <span class="stringliteral">        }</span>
+<a name="l01128"></a>01128 <span class="stringliteral"></span>
+<a name="l01135"></a><a class="code" href="group__publicAuth.html#ga48c16f6ef7158f8cf32dec4d1a68cbe5">01135</a> <span class="stringliteral">        public static function isAuthenticated() {</span>
+<a name="l01136"></a>01136 <span class="stringliteral">                global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;</span>
+<a name="l01137"></a>01137 <span class="stringliteral"></span>
+<a name="l01138"></a>01138 <span class="stringliteral">                phpCAS :: traceBegin();</span>
+<a name="l01139"></a>01139 <span class="stringliteral">                if (!is_object($PHPCAS_CLIENT)) {</span>
+<a name="l01140"></a>01140 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should not be called before <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">::client</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">proxy</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01141"></a>01141 <span class="stringliteral">                }</span>
+<a name="l01142"></a>01142 <span class="stringliteral"></span>
+<a name="l01143"></a>01143 <span class="stringliteral">                // call the isAuthenticated method of the global $PHPCAS_CLIENT object</span>
+<a name="l01144"></a>01144 <span class="stringliteral">                $auth = $PHPCAS_CLIENT-&gt;isAuthenticated();</span>
+<a name="l01145"></a>01145 <span class="stringliteral"></span>
+<a name="l01146"></a>01146 <span class="stringliteral">                // store where the authentication has been checked and the result</span>
+<a name="l01147"></a>01147 <span class="stringliteral">                $dbg = debug_backtrace();</span>
+<a name="l01148"></a>01148 <span class="stringliteral">                $PHPCAS_AUTH_CHECK_CALL = array (</span>
+<a name="l01149"></a>01149 <span class="stringliteral">                        &#39;</span>done<span class="stringliteral">&#39; =&gt; TRUE,</span>
+<a name="l01150"></a>01150 <span class="stringliteral">                        &#39;</span>file<span class="stringliteral">&#39; =&gt; $dbg[0][&#39;</span>file<span class="stringliteral">&#39;],</span>
+<a name="l01151"></a>01151 <span class="stringliteral">                        &#39;</span>line<span class="stringliteral">&#39; =&gt; $dbg[0][&#39;</span>line<span class="stringliteral">&#39;],</span>
+<a name="l01152"></a>01152 <span class="stringliteral">                        &#39;</span>method<span class="stringliteral">&#39; =&gt; __CLASS__ . &#39;</span>::<span class="stringliteral">&#39; . __FUNCTION__,</span>
+<a name="l01153"></a>01153 <span class="stringliteral">                        &#39;</span>result<span class="stringliteral">&#39; =&gt; $auth</span>
+<a name="l01154"></a>01154 <span class="stringliteral">                );</span>
+<a name="l01155"></a>01155 <span class="stringliteral">                phpCAS :: traceEnd($auth);</span>
+<a name="l01156"></a>01156 <span class="stringliteral">                return $auth;</span>
+<a name="l01157"></a>01157 <span class="stringliteral">        }</span>
+<a name="l01158"></a>01158 <span class="stringliteral"></span>
+<a name="l01165"></a><a class="code" href="group__publicAuth.html#gac79ced3333492b28b9d3849c56becb9e">01165</a> <span class="stringliteral">        public static function isSessionAuthenticated() {</span>
+<a name="l01166"></a>01166 <span class="stringliteral">                global $PHPCAS_CLIENT;</span>
+<a name="l01167"></a>01167 <span class="stringliteral">                if (!is_object($PHPCAS_CLIENT)) {</span>
+<a name="l01168"></a>01168 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should not be called before <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">::client</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">proxy</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01169"></a>01169 <span class="stringliteral">                }</span>
+<a name="l01170"></a>01170 <span class="stringliteral">                return ($PHPCAS_CLIENT-&gt;isSessionAuthenticated());</span>
+<a name="l01171"></a>01171 <span class="stringliteral">        }</span>
+<a name="l01172"></a>01172 <span class="stringliteral"></span>
+<a name="l01180"></a><a class="code" href="group__publicAuth.html#ga4c9f984b474b550cf316396e87670b18">01180</a> <span class="stringliteral">        public static function getUser() {</span>
+<a name="l01181"></a>01181 <span class="stringliteral">                global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;</span>
+<a name="l01182"></a>01182 <span class="stringliteral">                if (!is_object($PHPCAS_CLIENT)) {</span>
+<a name="l01183"></a>01183 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should not be called before <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">::client</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">proxy</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01184"></a>01184 <span class="stringliteral">                }</span>
+<a name="l01185"></a>01185 <span class="stringliteral">                if (!$PHPCAS_AUTH_CHECK_CALL[&#39;</span>done<span class="stringliteral">&#39;]) {</span>
+<a name="l01186"></a>01186 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should only be called after <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">::forceAuthentication</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicAuth.html#ga48c16f6ef7158f8cf32dec4d1a68cbe5">isAuthenticated</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01187"></a>01187 <span class="stringliteral">                }</span>
+<a name="l01188"></a>01188 <span class="stringliteral">                if (!$PHPCAS_AUTH_CHECK_CALL[&#39;</span>result<span class="stringliteral">&#39;]) {</span>
+<a name="l01189"></a>01189 <span class="stringliteral">                        phpCAS :: error(&#39;</span>authentication was checked (by <span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>method<span class="stringliteral">&#39;] . &#39;</span>() at <span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>file<span class="stringliteral">&#39;] . &#39;</span>:<span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>line<span class="stringliteral">&#39;] . &#39;</span>) but the method returned FALSE<span class="stringliteral">&#39;);</span>
+<a name="l01190"></a>01190 <span class="stringliteral">                }</span>
+<a name="l01191"></a>01191 <span class="stringliteral">                return $PHPCAS_CLIENT-&gt;getUser();</span>
+<a name="l01192"></a>01192 <span class="stringliteral">        }</span>
+<a name="l01193"></a>01193 <span class="stringliteral"></span>
+<a name="l01202"></a><a class="code" href="group__publicAuth.html#ga9972fbb286fe7e8d726b2e776b150233">01202</a> <span class="stringliteral">        public static function getAttributes() {</span>
+<a name="l01203"></a>01203 <span class="stringliteral">                global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;</span>
+<a name="l01204"></a>01204 <span class="stringliteral">                if (!is_object($PHPCAS_CLIENT)) {</span>
+<a name="l01205"></a>01205 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should not be called before <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">::client</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">proxy</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01206"></a>01206 <span class="stringliteral">                }</span>
+<a name="l01207"></a>01207 <span class="stringliteral">                if (!$PHPCAS_AUTH_CHECK_CALL[&#39;</span>done<span class="stringliteral">&#39;]) {</span>
+<a name="l01208"></a>01208 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should only be called after <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">::forceAuthentication</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicAuth.html#ga48c16f6ef7158f8cf32dec4d1a68cbe5">isAuthenticated</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01209"></a>01209 <span class="stringliteral">                }</span>
+<a name="l01210"></a>01210 <span class="stringliteral">                if (!$PHPCAS_AUTH_CHECK_CALL[&#39;</span>result<span class="stringliteral">&#39;]) {</span>
+<a name="l01211"></a>01211 <span class="stringliteral">                        phpCAS :: error(&#39;</span>authentication was checked (by <span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>method<span class="stringliteral">&#39;] . &#39;</span>() at <span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>file<span class="stringliteral">&#39;] . &#39;</span>:<span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>line<span class="stringliteral">&#39;] . &#39;</span>) but the method returned FALSE<span class="stringliteral">&#39;);</span>
+<a name="l01212"></a>01212 <span class="stringliteral">                }</span>
+<a name="l01213"></a>01213 <span class="stringliteral">                return $PHPCAS_CLIENT-&gt;getAttributes();</span>
+<a name="l01214"></a>01214 <span class="stringliteral">        }</span>
+<a name="l01215"></a>01215 <span class="stringliteral">        </span>
+<a name="l01224"></a><a class="code" href="group__publicAuth.html#gaeee7fd7060e5edbf791e71b49270c9e1">01224</a> <span class="stringliteral">        public static function hasAttributes() {</span>
+<a name="l01225"></a>01225 <span class="stringliteral">                global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;</span>
+<a name="l01226"></a>01226 <span class="stringliteral">                if (!is_object($PHPCAS_CLIENT)) {</span>
+<a name="l01227"></a>01227 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should not be called before <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">::client</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">proxy</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01228"></a>01228 <span class="stringliteral">                }</span>
+<a name="l01229"></a>01229 <span class="stringliteral">                if (!$PHPCAS_AUTH_CHECK_CALL[&#39;</span>done<span class="stringliteral">&#39;]) {</span>
+<a name="l01230"></a>01230 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should only be called after <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">::forceAuthentication</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicAuth.html#ga48c16f6ef7158f8cf32dec4d1a68cbe5">isAuthenticated</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01231"></a>01231 <span class="stringliteral">                }</span>
+<a name="l01232"></a>01232 <span class="stringliteral">                if (!$PHPCAS_AUTH_CHECK_CALL[&#39;</span>result<span class="stringliteral">&#39;]) {</span>
+<a name="l01233"></a>01233 <span class="stringliteral">                        phpCAS :: error(&#39;</span>authentication was checked (by <span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>method<span class="stringliteral">&#39;] . &#39;</span>() at <span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>file<span class="stringliteral">&#39;] . &#39;</span>:<span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>line<span class="stringliteral">&#39;] . &#39;</span>) but the method returned FALSE<span class="stringliteral">&#39;);</span>
+<a name="l01234"></a>01234 <span class="stringliteral">                }</span>
+<a name="l01235"></a>01235 <span class="stringliteral">                return $PHPCAS_CLIENT-&gt;hasAttributes();</span>
+<a name="l01236"></a>01236 <span class="stringliteral">        }</span>
+<a name="l01237"></a>01237 <span class="stringliteral">        </span>
+<a name="l01247"></a><a class="code" href="group__publicAuth.html#ga261a58590cfc17399398ec5db81c2d7e">01247</a> <span class="stringliteral">        public static function hasAttribute($key) {</span>
+<a name="l01248"></a>01248 <span class="stringliteral">                global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;</span>
+<a name="l01249"></a>01249 <span class="stringliteral">                if (!is_object($PHPCAS_CLIENT)) {</span>
+<a name="l01250"></a>01250 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should not be called before <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">::client</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">proxy</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01251"></a>01251 <span class="stringliteral">                }</span>
+<a name="l01252"></a>01252 <span class="stringliteral">                if (!$PHPCAS_AUTH_CHECK_CALL[&#39;</span>done<span class="stringliteral">&#39;]) {</span>
+<a name="l01253"></a>01253 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should only be called after <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">::forceAuthentication</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicAuth.html#ga48c16f6ef7158f8cf32dec4d1a68cbe5">isAuthenticated</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01254"></a>01254 <span class="stringliteral">                }</span>
+<a name="l01255"></a>01255 <span class="stringliteral">                if (!$PHPCAS_AUTH_CHECK_CALL[&#39;</span>result<span class="stringliteral">&#39;]) {</span>
+<a name="l01256"></a>01256 <span class="stringliteral">                        phpCAS :: error(&#39;</span>authentication was checked (by <span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>method<span class="stringliteral">&#39;] . &#39;</span>() at <span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>file<span class="stringliteral">&#39;] . &#39;</span>:<span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>line<span class="stringliteral">&#39;] . &#39;</span>) but the method returned FALSE<span class="stringliteral">&#39;);</span>
+<a name="l01257"></a>01257 <span class="stringliteral">                }</span>
+<a name="l01258"></a>01258 <span class="stringliteral">                return $PHPCAS_CLIENT-&gt;hasAttribute($key);</span>
+<a name="l01259"></a>01259 <span class="stringliteral">        }</span>
+<a name="l01260"></a>01260 <span class="stringliteral">        </span>
+<a name="l01270"></a><a class="code" href="group__publicAuth.html#ga46f77015f5e206ad4956edae2905857c">01270</a> <span class="stringliteral">        public static function getAttribute($key) {</span>
+<a name="l01271"></a>01271 <span class="stringliteral">                global $PHPCAS_CLIENT, $PHPCAS_AUTH_CHECK_CALL;</span>
+<a name="l01272"></a>01272 <span class="stringliteral">                if (!is_object($PHPCAS_CLIENT)) {</span>
+<a name="l01273"></a>01273 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should not be called before <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">::client</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">proxy</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01274"></a>01274 <span class="stringliteral">                }</span>
+<a name="l01275"></a>01275 <span class="stringliteral">                if (!$PHPCAS_AUTH_CHECK_CALL[&#39;</span>done<span class="stringliteral">&#39;]) {</span>
+<a name="l01276"></a>01276 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should only be called after <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">::forceAuthentication</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicAuth.html#ga48c16f6ef7158f8cf32dec4d1a68cbe5">isAuthenticated</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01277"></a>01277 <span class="stringliteral">                }</span>
+<a name="l01278"></a>01278 <span class="stringliteral">                if (!$PHPCAS_AUTH_CHECK_CALL[&#39;</span>result<span class="stringliteral">&#39;]) {</span>
+<a name="l01279"></a>01279 <span class="stringliteral">                        phpCAS :: error(&#39;</span>authentication was checked (by <span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>method<span class="stringliteral">&#39;] . &#39;</span>() at <span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>file<span class="stringliteral">&#39;] . &#39;</span>:<span class="stringliteral">&#39; . $PHPCAS_AUTH_CHECK_CALL[&#39;</span>line<span class="stringliteral">&#39;] . &#39;</span>) but the method returned FALSE<span class="stringliteral">&#39;);</span>
+<a name="l01280"></a>01280 <span class="stringliteral">                }</span>
+<a name="l01281"></a>01281 <span class="stringliteral">                return $PHPCAS_CLIENT-&gt;getAttribute($key);</span>
+<a name="l01282"></a>01282 <span class="stringliteral">        }</span>
+<a name="l01283"></a>01283 <span class="stringliteral">        </span>
+<a name="l01287"></a><a class="code" href="group__publicAuth.html#ga33a0cf0299f96e23893ce4ff6cc76584">01287</a> <span class="stringliteral">        public static function handleLogoutRequests($check_client = true, $allowed_clients = false) {</span>
+<a name="l01288"></a>01288 <span class="stringliteral">                global $PHPCAS_CLIENT;</span>
+<a name="l01289"></a>01289 <span class="stringliteral">                if (!is_object($PHPCAS_CLIENT)) {</span>
+<a name="l01290"></a>01290 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should not be called before <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">::client</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">proxy</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01291"></a>01291 <span class="stringliteral">                }</span>
+<a name="l01292"></a>01292 <span class="stringliteral">                return ($PHPCAS_CLIENT-&gt;handleLogoutRequests($check_client, $allowed_clients));</span>
+<a name="l01293"></a>01293 <span class="stringliteral">        }</span>
+<a name="l01294"></a>01294 <span class="stringliteral"></span>
+<a name="l01301"></a><a class="code" href="group__publicAuth.html#ga7c01939d204339fcab6a4d3f15557a90">01301</a> <span class="stringliteral">        public static function getServerLoginURL() {</span>
+<a name="l01302"></a>01302 <span class="stringliteral">                global $PHPCAS_CLIENT;</span>
+<a name="l01303"></a>01303 <span class="stringliteral">                if (!is_object($PHPCAS_CLIENT)) {</span>
+<a name="l01304"></a>01304 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should not be called before <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">::client</a>() or <span class="stringliteral">&#39; . __CLASS__ . &#39;</span>::<a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">proxy</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01305"></a>01305 <span class="stringliteral">                }</span>
+<a name="l01306"></a>01306 <span class="stringliteral">                return $PHPCAS_CLIENT-&gt;getServerLoginURL();</span>
+<a name="l01307"></a>01307 <span class="stringliteral">        }</span>
+<a name="l01308"></a>01308 <span class="stringliteral"></span>
+<a name="l01314"></a><a class="code" href="group__publicAuth.html#ga3bae96f4d17cdc12ac2e81334ba44fc1">01314</a> <span class="stringliteral">        public static function setServerLoginURL($url = &#39;</span><span class="stringliteral">&#39;) {</span>
+<a name="l01315"></a>01315 <span class="stringliteral">                global $PHPCAS_CLIENT;</span>
+<a name="l01316"></a>01316 <span class="stringliteral">                phpCAS :: traceBegin();</span>
+<a name="l01317"></a>01317 <span class="stringliteral">                if (!is_object($PHPCAS_CLIENT)) {</span>
+<a name="l01318"></a>01318 <span class="stringliteral">                        phpCAS :: error(&#39;</span><span class="keyword">this</span> method should only be called after
+<a name="l01319"></a>01319                                                                                 <span class="stringliteral">&#39; . __CLASS__ . &#39;</span><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">::client</a>()<span class="stringliteral">&#39;);</span>
+<a name="l01320"></a>01320 <span class="stringliteral">                }</span>
+<a name="l01321"></a>01321 <span class="stringliteral">                if (gettype($url) != &#39;</span><span class="keywordtype">string</span><span class="stringliteral">&#39;) {</span>
+<a name="l01322"></a>01322 <span class="stringliteral">                        phpCAS :: error(&#39;</span>type mismatched <span class="keywordflow">for</span> parameter $url (should be
+<a name="l01323"></a>01323                                                                         `<span class="keywordtype">string</span>\<span class="charliteral">&#39;)&#39;</span>);
+<a name="l01324"></a>01324                 }
+<a name="l01325"></a>01325                 $PHPCAS_CLIENT-&gt;setServerLoginURL($url);
+<a name="l01326"></a>01326                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01327"></a>01327         }
+<a name="l01328"></a>01328 
+<a name="l01335"></a><a class="code" href="group__publicAuth.html#ga70abe40a03b6ebb068eecba436dd7a8c">01335</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga70abe40a03b6ebb068eecba436dd7a8c">setServerServiceValidateURL</a>($url = <span class="stringliteral">&#39;&#39;</span>) {
+<a name="l01336"></a>01336                 global $PHPCAS_CLIENT;
+<a name="l01337"></a>01337                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01338"></a>01338                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01339"></a>01339                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after</span>
+<a name="l01340"></a>01340 <span class="stringliteral">                                                                                &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client()&#39;</span>);
+<a name="l01341"></a>01341                 }
+<a name="l01342"></a>01342                 <span class="keywordflow">if</span> (gettype($url) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l01343"></a>01343                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $url (should be</span>
+<a name="l01344"></a>01344 <span class="stringliteral">                                                                        `string\&#39;)&#39;</span>);
+<a name="l01345"></a>01345                 }
+<a name="l01346"></a>01346                 $PHPCAS_CLIENT-&gt;setServerServiceValidateURL($url);
+<a name="l01347"></a>01347                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01348"></a>01348         }
+<a name="l01349"></a>01349 
+<a name="l01356"></a><a class="code" href="group__publicAuth.html#ga11d1c13ed3d5008984ef5999a9389104">01356</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga11d1c13ed3d5008984ef5999a9389104">setServerProxyValidateURL</a>($url = <span class="stringliteral">&#39;&#39;</span>) {
+<a name="l01357"></a>01357                 global $PHPCAS_CLIENT;
+<a name="l01358"></a>01358                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01359"></a>01359                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01360"></a>01360                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after</span>
+<a name="l01361"></a>01361 <span class="stringliteral">                                                                                &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client()&#39;</span>);
+<a name="l01362"></a>01362                 }
+<a name="l01363"></a>01363                 <span class="keywordflow">if</span> (gettype($url) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l01364"></a>01364                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $url (should be</span>
+<a name="l01365"></a>01365 <span class="stringliteral">                                                                        `string\&#39;)&#39;</span>);
+<a name="l01366"></a>01366                 }
+<a name="l01367"></a>01367                 $PHPCAS_CLIENT-&gt;setServerProxyValidateURL($url);
+<a name="l01368"></a>01368                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01369"></a>01369         }
+<a name="l01370"></a>01370 
+<a name="l01376"></a><a class="code" href="group__publicAuth.html#ga22ccd6f45db38b80f3549fc7691b1c8b">01376</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga22ccd6f45db38b80f3549fc7691b1c8b">setServerSamlValidateURL</a>($url = <span class="stringliteral">&#39;&#39;</span>) {
+<a name="l01377"></a>01377                 global $PHPCAS_CLIENT;
+<a name="l01378"></a>01378                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01379"></a>01379                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01380"></a>01380                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after</span>
+<a name="l01381"></a>01381 <span class="stringliteral">                                                                                &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client()&#39;</span>);
+<a name="l01382"></a>01382                 }
+<a name="l01383"></a>01383                 <span class="keywordflow">if</span> (gettype($url) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l01384"></a>01384                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $url (should be</span>
+<a name="l01385"></a>01385 <span class="stringliteral">                                                                        `string\&#39;)&#39;</span>);
+<a name="l01386"></a>01386                 }
+<a name="l01387"></a>01387                 $PHPCAS_CLIENT-&gt;setServerSamlValidateURL($url);
+<a name="l01388"></a>01388                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01389"></a>01389         }
+<a name="l01390"></a>01390 
+<a name="l01397"></a><a class="code" href="group__publicAuth.html#ga280605a8665ce91117b796d3470d0c2d">01397</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga280605a8665ce91117b796d3470d0c2d">getServerLogoutURL</a>() {
+<a name="l01398"></a>01398                 global $PHPCAS_CLIENT;
+<a name="l01399"></a>01399                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01400"></a>01400                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should not be called before &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01401"></a>01401                 }
+<a name="l01402"></a>01402                 <span class="keywordflow">return</span> $PHPCAS_CLIENT-&gt;getServerLogoutURL();
+<a name="l01403"></a>01403         }
+<a name="l01404"></a>01404 
+<a name="l01410"></a><a class="code" href="group__publicAuth.html#ga090c9e2112180f4073cd2583c5c07800">01410</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga090c9e2112180f4073cd2583c5c07800">setServerLogoutURL</a>($url = <span class="stringliteral">&#39;&#39;</span>) {
+<a name="l01411"></a>01411                 global $PHPCAS_CLIENT;
+<a name="l01412"></a>01412                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01413"></a>01413                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01414"></a>01414                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after</span>
+<a name="l01415"></a>01415 <span class="stringliteral">                                                                                &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client()&#39;</span>);
+<a name="l01416"></a>01416                 }
+<a name="l01417"></a>01417                 <span class="keywordflow">if</span> (gettype($url) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l01418"></a>01418                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $url (should be</span>
+<a name="l01419"></a>01419 <span class="stringliteral">                                                                        `string\&#39;)&#39;</span>);
+<a name="l01420"></a>01420                 }
+<a name="l01421"></a>01421                 $PHPCAS_CLIENT-&gt;setServerLogoutURL($url);
+<a name="l01422"></a>01422                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01423"></a>01423         }
+<a name="l01424"></a>01424 
+<a name="l01430"></a><a class="code" href="group__publicAuth.html#ga9989272833c5170c3b7c7027beab795b">01430</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga9989272833c5170c3b7c7027beab795b">logout</a>($params = <span class="stringliteral">&quot;&quot;</span>) {
+<a name="l01431"></a>01431                 global $PHPCAS_CLIENT;
+<a name="l01432"></a>01432                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01433"></a>01433                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01434"></a>01434                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or&#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01435"></a>01435                 }
+<a name="l01436"></a>01436                 $parsedParams = array ();
+<a name="l01437"></a>01437                 <span class="keywordflow">if</span> ($params != <span class="stringliteral">&quot;&quot;</span>) {
+<a name="l01438"></a>01438                         <span class="keywordflow">if</span> (is_string($params)) {
+<a name="l01439"></a>01439                                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;method `phpCAS::logout($url)\&#39; is now deprecated, use `phpCAS::logoutWithUrl($url)\&#39; instead&#39;</span>);
+<a name="l01440"></a>01440                         }
+<a name="l01441"></a>01441                         <span class="keywordflow">if</span> (!is_array($params)) {
+<a name="l01442"></a>01442                                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $params (should be `array\&#39;)&#39;</span>);
+<a name="l01443"></a>01443                         }
+<a name="l01444"></a>01444                         <span class="keywordflow">foreach</span> ($params as $key =&gt; $value) {
+<a name="l01445"></a>01445                                 <span class="keywordflow">if</span> ($key != <span class="stringliteral">&quot;service&quot;</span> &amp;&amp; $key != <span class="stringliteral">&quot;url&quot;</span>) {
+<a name="l01446"></a>01446                                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;only `url\&#39; and `service\&#39; parameters are allowed for method `phpCAS::logout($params)\&#39;&#39;</span>);
+<a name="l01447"></a>01447                                 }
+<a name="l01448"></a>01448                                 $parsedParams[$key] = $value;
+<a name="l01449"></a>01449                         }
+<a name="l01450"></a>01450                 }
+<a name="l01451"></a>01451                 $PHPCAS_CLIENT-&gt;logout($parsedParams);
+<a name="l01452"></a>01452                 <span class="comment">// never reached</span>
+<a name="l01453"></a>01453                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01454"></a>01454         }
+<a name="l01455"></a>01455 
+<a name="l01460"></a><a class="code" href="group__publicAuth.html#ga8121363b18b23a7ff84850851d85fcc1">01460</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga8121363b18b23a7ff84850851d85fcc1">logoutWithRedirectService</a>($service) {
+<a name="l01461"></a>01461                 global $PHPCAS_CLIENT;
+<a name="l01462"></a>01462                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01463"></a>01463                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01464"></a>01464                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or&#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01465"></a>01465                 }
+<a name="l01466"></a>01466                 <span class="keywordflow">if</span> (!is_string($service)) {
+<a name="l01467"></a>01467                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $service (should be `string\&#39;)&#39;</span>);
+<a name="l01468"></a>01468                 }
+<a name="l01469"></a>01469                 $PHPCAS_CLIENT-&gt;logout(array (
+<a name="l01470"></a>01470                         <span class="stringliteral">&quot;service&quot;</span> =&gt; $service
+<a name="l01471"></a>01471                 ));
+<a name="l01472"></a>01472                 <span class="comment">// never reached</span>
+<a name="l01473"></a>01473                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01474"></a>01474         }
+<a name="l01475"></a>01475 
+<a name="l01481"></a><a class="code" href="group__publicAuth.html#gaf747b39e646075718b6504ae30d6df87">01481</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#gaf747b39e646075718b6504ae30d6df87">logoutWithUrl</a>($url) {
+<a name="l01482"></a>01482                 trigger_error(<span class="stringliteral">&#39;Function deprecated for cas servers &gt;= 3.3.5.1&#39;</span>, E_USER_DEPRECATED);
+<a name="l01483"></a>01483                 global $PHPCAS_CLIENT;
+<a name="l01484"></a>01484                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01485"></a>01485                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01486"></a>01486                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or&#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01487"></a>01487                 }
+<a name="l01488"></a>01488                 <span class="keywordflow">if</span> (!is_string($url)) {
+<a name="l01489"></a>01489                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $url (should be `string\&#39;)&#39;</span>);
+<a name="l01490"></a>01490                 }
+<a name="l01491"></a>01491                 $PHPCAS_CLIENT-&gt;logout(array (
+<a name="l01492"></a>01492                         <span class="stringliteral">&quot;url&quot;</span> =&gt; $url
+<a name="l01493"></a>01493                 ));
+<a name="l01494"></a>01494                 <span class="comment">// never reached</span>
+<a name="l01495"></a>01495                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01496"></a>01496         }
+<a name="l01497"></a>01497 
+<a name="l01504"></a><a class="code" href="group__publicAuth.html#ga03f02d32829f8e2dd7056aaa94dcfb79">01504</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga03f02d32829f8e2dd7056aaa94dcfb79">logoutWithRedirectServiceAndUrl</a>($service, $url) {
+<a name="l01505"></a>01505                 trigger_error(<span class="stringliteral">&#39;Function deprecated for cas servers &gt;= 3.3.5.1&#39;</span>, E_USER_DEPRECATED);
+<a name="l01506"></a>01506                 global $PHPCAS_CLIENT;
+<a name="l01507"></a>01507                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01508"></a>01508                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01509"></a>01509                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or&#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01510"></a>01510                 }
+<a name="l01511"></a>01511                 <span class="keywordflow">if</span> (!is_string($service)) {
+<a name="l01512"></a>01512                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $service (should be `string\&#39;)&#39;</span>);
+<a name="l01513"></a>01513                 }
+<a name="l01514"></a>01514                 <span class="keywordflow">if</span> (!is_string($url)) {
+<a name="l01515"></a>01515                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $url (should be `string\&#39;)&#39;</span>);
+<a name="l01516"></a>01516                 }
+<a name="l01517"></a>01517                 $PHPCAS_CLIENT-&gt;logout(array (
+<a name="l01518"></a>01518                         <span class="stringliteral">&quot;service&quot;</span> =&gt; $service,
+<a name="l01519"></a>01519                         <span class="stringliteral">&quot;url&quot;</span> =&gt; $url
+<a name="l01520"></a>01520                 ));
+<a name="l01521"></a>01521                 <span class="comment">// never reached</span>
+<a name="l01522"></a>01522                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01523"></a>01523         }
+<a name="l01524"></a>01524 
+<a name="l01531"></a><a class="code" href="group__publicAuth.html#ga8d7426d23b152ea51c1bdefdd6516df6">01531</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga8d7426d23b152ea51c1bdefdd6516df6">setFixedCallbackURL</a>($url = <span class="stringliteral">&#39;&#39;</span>) {
+<a name="l01532"></a>01532                 global $PHPCAS_CLIENT;
+<a name="l01533"></a>01533                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01534"></a>01534                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01535"></a>01535                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01536"></a>01536                 }
+<a name="l01537"></a>01537                 <span class="keywordflow">if</span> (!$PHPCAS_CLIENT-&gt;isProxy()) {
+<a name="l01538"></a>01538                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01539"></a>01539                 }
+<a name="l01540"></a>01540                 <span class="keywordflow">if</span> (gettype($url) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l01541"></a>01541                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $url (should be `string\&#39;)&#39;</span>);
+<a name="l01542"></a>01542                 }
+<a name="l01543"></a>01543                 $PHPCAS_CLIENT-&gt;setCallbackURL($url);
+<a name="l01544"></a>01544                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01545"></a>01545         }
+<a name="l01546"></a>01546 
+<a name="l01553"></a><a class="code" href="group__publicAuth.html#ga6a67472e035941451db7d22d51d3017b">01553</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga6a67472e035941451db7d22d51d3017b">setFixedServiceURL</a>($url) {
+<a name="l01554"></a>01554                 global $PHPCAS_CLIENT;
+<a name="l01555"></a>01555                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01556"></a>01556                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01557"></a>01557                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01558"></a>01558                 }
+<a name="l01559"></a>01559                 <span class="keywordflow">if</span> (gettype($url) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l01560"></a>01560                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $url (should be `string\&#39;)&#39;</span>);
+<a name="l01561"></a>01561                 }
+<a name="l01562"></a>01562                 $PHPCAS_CLIENT-&gt;setURL($url);
+<a name="l01563"></a>01563                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01564"></a>01564         }
+<a name="l01565"></a>01565 
+<a name="l01569"></a><a class="code" href="group__publicAuth.html#ga929af13df94ab3033ab915b02eed74e2">01569</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga929af13df94ab3033ab915b02eed74e2">getServiceURL</a>() {
+<a name="l01570"></a>01570                 global $PHPCAS_CLIENT;
+<a name="l01571"></a>01571                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01572"></a>01572                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01573"></a>01573                 }
+<a name="l01574"></a>01574                 <span class="keywordflow">return</span> ($PHPCAS_CLIENT-&gt;getURL());
+<a name="l01575"></a>01575         }
+<a name="l01576"></a>01576 
+<a name="l01580"></a><a class="code" href="group__publicAuth.html#ga68624158674efe68505c247942ee129b">01580</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#ga68624158674efe68505c247942ee129b">retrievePT</a>($target_service, &amp; $err_code, &amp; $err_msg) {
+<a name="l01581"></a>01581                 global $PHPCAS_CLIENT;
+<a name="l01582"></a>01582                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01583"></a>01583                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01584"></a>01584                 }
+<a name="l01585"></a>01585                 <span class="keywordflow">if</span> (gettype($target_service) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l01586"></a>01586                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $target_service(should be `string\&#39;)&#39;</span>);
+<a name="l01587"></a>01587                 }
+<a name="l01588"></a>01588                 <span class="keywordflow">return</span> ($PHPCAS_CLIENT-&gt;retrievePT($target_service, $err_code, $err_msg));
+<a name="l01589"></a>01589         }
+<a name="l01590"></a>01590 
+<a name="l01596"></a><a class="code" href="group__publicAuth.html#gac7c2da957fdd437f1e23147f83daffcb">01596</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#gac7c2da957fdd437f1e23147f83daffcb">setCasServerCACert</a>($cert) {
+<a name="l01597"></a>01597                 global $PHPCAS_CLIENT;
+<a name="l01598"></a>01598                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01599"></a>01599                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01600"></a>01600                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or&#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01601"></a>01601                 }
+<a name="l01602"></a>01602                 <span class="keywordflow">if</span> (gettype($cert) != <span class="stringliteral">&#39;string&#39;</span>) {
+<a name="l01603"></a>01603                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;type mismatched for parameter $cert (should be `string\&#39;)&#39;</span>);
+<a name="l01604"></a>01604                 }
+<a name="l01605"></a>01605                 $PHPCAS_CLIENT-&gt;setCasServerCACert($cert);
+<a name="l01606"></a>01606                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01607"></a>01607         }
+<a name="l01608"></a>01608 
+<a name="l01612"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">01612</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">setNoCasServerValidation</a>() {
+<a name="l01613"></a>01613                 global $PHPCAS_CLIENT;
+<a name="l01614"></a>01614                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01615"></a>01615                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01616"></a>01616                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or&#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01617"></a>01617                 }
+<a name="l01618"></a>01618                 $PHPCAS_CLIENT-&gt;setNoCasServerValidation();
+<a name="l01619"></a>01619                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01620"></a>01620         }
+<a name="l01621"></a>01621         
+<a name="l01622"></a>01622         
+<a name="l01629"></a><a class="code" href="group__publicAuth.html#gac7a6eeb2bfd55a432c57f5d18bd35048">01629</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="group__publicAuth.html#gac7a6eeb2bfd55a432c57f5d18bd35048">setNoClearTicketsFromUrl</a>() {
+<a name="l01630"></a>01630                 global $PHPCAS_CLIENT;
+<a name="l01631"></a>01631                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01632"></a>01632                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01633"></a>01633                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or&#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01634"></a>01634                 }
+<a name="l01635"></a>01635                 $PHPCAS_CLIENT-&gt;setNoClearTicketsFromUrl();
+<a name="l01636"></a>01636                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01637"></a>01637         }
+<a name="l01638"></a>01638 
+<a name="l01647"></a><a class="code" href="classphpCAS.html#a26ba0156e03fede5cd0c6bacbae8e928">01647</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="classphpCAS.html#a26ba0156e03fede5cd0c6bacbae8e928">setExtraCurlOption</a>($key, $value) {
+<a name="l01648"></a>01648                 global $PHPCAS_CLIENT;
+<a name="l01649"></a>01649                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS :: traceBegin</a>();
+<a name="l01650"></a>01650                 <span class="keywordflow">if</span> (!is_object($PHPCAS_CLIENT)) {
+<a name="l01651"></a>01651                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::client() or&#39;</span> . __CLASS__ . <span class="stringliteral">&#39;::proxy()&#39;</span>);
+<a name="l01652"></a>01652                 }
+<a name="l01653"></a>01653                 $PHPCAS_CLIENT-&gt;setExtraCurlOption($key, $value);
+<a name="l01654"></a>01654                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS :: traceEnd</a>();
+<a name="l01655"></a>01655         }
+<a name="l01656"></a>01656         
+<a name="l01657"></a>01657                         
+<a name="l01668"></a><a class="code" href="classphpCAS.html#a5ba42b7bc46a67e897753efdb2c19d14">01668</a>         <span class="keyword">public</span> <span class="keyword">static</span> function <a class="code" href="classphpCAS.html#a5ba42b7bc46a67e897753efdb2c19d14">getProxies</a> () {
+<a name="l01669"></a>01669                 global $PHPCAS_CLIENT;
+<a name="l01670"></a>01670                 <span class="keywordflow">if</span> ( !is_object($PHPCAS_CLIENT) ) {
+<a name="l01671"></a>01671                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;this method should only be called after &#39;</span>.__CLASS__.<span class="stringliteral">&#39;::client()&#39;</span>);
+<a name="l01672"></a>01672                 }  
+<a name="l01673"></a>01673                 
+<a name="l01674"></a>01674                 <span class="keywordflow">return</span>($PHPCAS_CLIENT-&gt;getProxies());
+<a name="l01675"></a>01675         }
+<a name="l01676"></a>01676 
+<a name="l01677"></a>01677 }
+<a name="l01678"></a>01678 
+<a name="l01679"></a>01679 <span class="comment">// ########################################################################</span>
+<a name="l01680"></a>01680 <span class="comment">// DOCUMENTATION</span>
+<a name="l01681"></a>01681 <span class="comment">// ########################################################################</span>
+<a name="l01682"></a>01682 
+<a name="l01683"></a>01683 <span class="comment">// ########################################################################</span>
+<a name="l01684"></a>01684 <span class="comment">//  MAIN PAGE</span>
+<a name="l01685"></a>01685 
+<a name="l01693"></a>01693 <span class="comment">// ########################################################################</span>
+<a name="l01694"></a>01694 <span class="comment">//  MODULES DEFINITION</span>
+<a name="l01695"></a>01695 
+<a name="l01778"></a>01778 <span class="comment">// ########################################################################</span>
+<a name="l01779"></a>01779 <span class="comment">//  EXAMPLES</span>
+<a name="l01780"></a>01780 
+<a name="l01826"></a>01826 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Client_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Client_8php.html
new file mode 100644
index 00000000..4dbcfff8
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Client_8php.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/Client.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/Client.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="Client_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__Client.html">CAS_Client</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>Main class of the <a class="el" href="classphpCAS.html">phpCAS</a> library </p>
+
+<p>Definition in file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Client_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Client_8php_source.html
new file mode 100644
index 00000000..d3df233c
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Client_8php_source.html
@@ -0,0 +1,2152 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/Client.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/Client.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="Client_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 
+<a name="l00003"></a>00003 <span class="comment">/*</span>
+<a name="l00004"></a>00004 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00005"></a>00005 <span class="comment"> * All rights reserved.</span>
+<a name="l00006"></a>00006 <span class="comment"> *</span>
+<a name="l00007"></a>00007 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00008"></a>00008 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00009"></a>00009 <span class="comment"> *</span>
+<a name="l00010"></a>00010 <span class="comment"> *     * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00011"></a>00011 <span class="comment"> *       this list of conditions and the following disclaimer.</span>
+<a name="l00012"></a>00012 <span class="comment"> *     * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00013"></a>00013 <span class="comment"> *       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00014"></a>00014 <span class="comment"> *       and/or other materials provided with the distribution.</span>
+<a name="l00015"></a>00015 <span class="comment"> *     * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00016"></a>00016 <span class="comment"> *       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00017"></a>00017 <span class="comment"> *       promote products derived from this software without specific prior</span>
+<a name="l00018"></a>00018 <span class="comment"> *       written permission.</span>
+<a name="l00019"></a>00019 <span class="comment"></span>
+<a name="l00020"></a>00020 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00021"></a>00021 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00022"></a>00022 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00023"></a>00023 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00024"></a>00024 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00025"></a>00025 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00026"></a>00026 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00027"></a>00027 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00028"></a>00028 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00029"></a>00029 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00030"></a>00030 <span class="comment"> */</span>
+<a name="l00031"></a>00031 
+<a name="l00037"></a>00037 <span class="comment">// include internationalization stuff</span>
+<a name="l00038"></a>00038 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/languages/languages.php&#39;</span>);
+<a name="l00039"></a>00039 
+<a name="l00040"></a>00040 <span class="comment">// include PGT storage classes</span>
+<a name="l00041"></a>00041 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/PGTStorage/AbstractStorage.php&#39;</span>);
+<a name="l00042"></a>00042 
+<a name="l00043"></a>00043 <span class="comment">// include class for storing service cookies.</span>
+<a name="l00044"></a>00044 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/CookieJar.php&#39;</span>);
+<a name="l00045"></a>00045 
+<a name="l00046"></a>00046 <span class="comment">// include class for fetching web requests.</span>
+<a name="l00047"></a>00047 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/Request/CurlRequest.php&#39;</span>);
+<a name="l00048"></a>00048 
+<a name="l00049"></a>00049 <span class="comment">// include classes for proxying access to services</span>
+<a name="l00050"></a>00050 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/ProxiedService/Http/Get.php&#39;</span>);
+<a name="l00051"></a>00051 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/ProxiedService/Http/Post.php&#39;</span>);
+<a name="l00052"></a>00052 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/ProxiedService/Imap.php&#39;</span>);
+<a name="l00053"></a>00053 
+<a name="l00054"></a>00054 <span class="comment">// include Exception classes</span>
+<a name="l00055"></a>00055 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/ProxiedService/Exception.php&#39;</span>);
+<a name="l00056"></a>00056 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/ProxyTicketException.php&#39;</span>);
+<a name="l00057"></a>00057 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/InvalidArgumentException.php&#39;</span>);
+<a name="l00058"></a>00058 
+<a name="l00059"></a>00059 
+<a name="l00068"></a><a class="code" href="classCAS__Client.html">00068</a> <span class="keyword">class </span><a class="code" href="classCAS__Client.html">CAS_Client</a>
+<a name="l00069"></a>00069 {
+<a name="l00070"></a>00070 
+<a name="l00071"></a>00071         <span class="comment">// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span>
+<a name="l00072"></a>00072         <span class="comment">// XX                                                                    XX</span>
+<a name="l00073"></a>00073         <span class="comment">// XX                          CONFIGURATION                             XX</span>
+<a name="l00074"></a>00074         <span class="comment">// XX                                                                    XX</span>
+<a name="l00075"></a>00075         <span class="comment">// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span>
+<a name="l00076"></a>00076 
+<a name="l00077"></a>00077         <span class="comment">// ########################################################################</span>
+<a name="l00078"></a>00078         <span class="comment">//  HTML OUTPUT</span>
+<a name="l00079"></a>00079         <span class="comment">// ########################################################################</span>
+<a name="l00096"></a><a class="code" href="group__internalOutput.html#gad7299282ff326a3c3438d0ef20c0fdc5">00096</a> <span class="comment"></span>        <span class="keyword">private</span> function <a class="code" href="group__internalOutput.html#gad7299282ff326a3c3438d0ef20c0fdc5">HTMLFilterOutput</a>($str)
+<a name="l00097"></a>00097         {
+<a name="l00098"></a>00098                 $str = str_replace(<span class="stringliteral">&#39;__CAS_VERSION__&#39;</span>,$this-&gt;<a class="code" href="group__internalConfig.html#ga0dfec4f2b30a20582355a0252d7644fa">getServerVersion</a>(),$str);
+<a name="l00099"></a>00099                 $str = str_replace(<span class="stringliteral">&#39;__PHPCAS_VERSION__&#39;</span>,<a class="code" href="group__public.html#ga5c971143e0c319b1268233907ca193b9">phpCAS::getVersion</a>(),$str);
+<a name="l00100"></a>00100                 $str = str_replace(<span class="stringliteral">&#39;__SERVER_BASE_URL__&#39;</span>,$this-&gt;<a class="code" href="group__internalConfig.html#gaa50d82f0d6951d1ff1305b870155febe">getServerBaseURL</a>(),$str);
+<a name="l00101"></a>00101                 echo $str;
+<a name="l00102"></a>00102         }
+<a name="l00103"></a>00103 
+<a name="l00111"></a><a class="code" href="group__internalOutput.html#gaf411bbf487e36147d8835ea4337305a9">00111</a>         <span class="keyword">private</span> <a class="code" href="group__internalOutput.html#gaf411bbf487e36147d8835ea4337305a9">$_output_header</a> = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l00112"></a>00112 
+<a name="l00121"></a><a class="code" href="group__internalOutput.html#ga37ddf683af4f98f07f64ce4bf8b6667a">00121</a>         <span class="keyword">private</span> function <a class="code" href="group__internalOutput.html#ga37ddf683af4f98f07f64ce4bf8b6667a">printHTMLHeader</a>($title)
+<a name="l00122"></a>00122         {
+<a name="l00123"></a>00123                 $this-&gt;<a class="code" href="group__internalOutput.html#gad7299282ff326a3c3438d0ef20c0fdc5">HTMLFilterOutput</a>(str_replace(<span class="stringliteral">&#39;__TITLE__&#39;</span>,
+<a name="l00124"></a>00124                 $title,
+<a name="l00125"></a>00125                 (empty($this-&gt;_output_header)
+<a name="l00126"></a>00126                 ? <span class="stringliteral">&#39;&lt;html&gt;&lt;head&gt;&lt;title&gt;__TITLE__&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;h1&gt;__TITLE__&lt;/h1&gt;&#39;</span>
+<a name="l00127"></a>00127                 : $this-&gt;_output_header)
+<a name="l00128"></a>00128                 )
+<a name="l00129"></a>00129                 );
+<a name="l00130"></a>00130         }
+<a name="l00131"></a>00131 
+<a name="l00139"></a><a class="code" href="group__internalOutput.html#gaa90031f70e10981383b813385869f96e">00139</a>         <span class="keyword">private</span> <a class="code" href="group__internalOutput.html#gaa90031f70e10981383b813385869f96e">$_output_footer</a> = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l00140"></a>00140 
+<a name="l00147"></a><a class="code" href="group__internalOutput.html#ga0ff1bdc24180f4f60ffa07dfc8b81d61">00147</a>         <span class="keyword">private</span> function <a class="code" href="group__internalOutput.html#ga0ff1bdc24180f4f60ffa07dfc8b81d61">printHTMLFooter</a>()
+<a name="l00148"></a>00148         {
+<a name="l00149"></a>00149                 $this-&gt;<a class="code" href="group__internalOutput.html#gad7299282ff326a3c3438d0ef20c0fdc5">HTMLFilterOutput</a>(empty($this-&gt;_output_footer)
+<a name="l00150"></a>00150                 ?(<span class="stringliteral">&#39;&lt;hr&gt;&lt;address&gt;phpCAS __PHPCAS_VERSION__ &#39;</span>.$this-&gt;<a class="code" href="group__internalLang.html#ga18db72fc208dacf384d74dfc5c3713ad">getString</a>(<a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a>).<span class="stringliteral">&#39; &lt;a href=&quot;__SERVER_BASE_URL__&quot;&gt;__SERVER_BASE_URL__&lt;/a&gt; (CAS __CAS_VERSION__)&lt;/a&gt;&lt;/address&gt;&lt;/body&gt;&lt;/html&gt;&#39;</span>)
+<a name="l00151"></a>00151                 :$this-&gt;_output_footer);
+<a name="l00152"></a>00152         }
+<a name="l00153"></a>00153 
+<a name="l00159"></a><a class="code" href="group__internalOutput.html#ga7c05d2293082e77a79799c009dd979c9">00159</a>         <span class="keyword">public</span> function <a class="code" href="group__internalOutput.html#ga7c05d2293082e77a79799c009dd979c9">setHTMLHeader</a>($header)
+<a name="l00160"></a>00160         {
+<a name="l00161"></a>00161                 $this-&gt;_output_header = $header;
+<a name="l00162"></a>00162         }
+<a name="l00163"></a>00163 
+<a name="l00169"></a><a class="code" href="group__internalOutput.html#ga379dd7ed8f510e03321b449369024535">00169</a>         <span class="keyword">public</span> function <a class="code" href="group__internalOutput.html#ga379dd7ed8f510e03321b449369024535">setHTMLFooter</a>($footer)
+<a name="l00170"></a>00170         {
+<a name="l00171"></a>00171                 $this-&gt;_output_footer = $footer;
+<a name="l00172"></a>00172         }
+<a name="l00173"></a>00173         
+<a name="l00174"></a>00174         
+<a name="l00178"></a>00178         <span class="comment">// ########################################################################</span>
+<a name="l00179"></a>00179         <span class="comment">//  INTERNATIONALIZATION</span>
+<a name="l00180"></a>00180         <span class="comment">// ########################################################################</span>
+<a name="l00194"></a><a class="code" href="group__internalLang.html#ga38abc1fb5f662312e367c8b8bad449c5">00194</a> <span class="comment"></span>        <span class="keyword">private</span> <a class="code" href="group__internalLang.html#ga38abc1fb5f662312e367c8b8bad449c5">$_lang</a> = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l00195"></a>00195 
+<a name="l00201"></a><a class="code" href="group__internalLang.html#gab30d0e0fc8414be34c1f2a28649124d0">00201</a>         <span class="keyword">private</span> function <a class="code" href="group__internalLang.html#gab30d0e0fc8414be34c1f2a28649124d0">getLang</a>()
+<a name="l00202"></a>00202         {
+<a name="l00203"></a>00203                 <span class="keywordflow">if</span> ( empty($this-&gt;_lang) )
+<a name="l00204"></a>00204                 $this-&gt;<a class="code" href="group__internalLang.html#ga29c04b71561ffeed72ef005dadf7dc95">setLang</a>(<a class="code" href="group__internalLang.html#ga09705919fa8acfdfe25b3d8bf78309ac">PHPCAS_LANG_DEFAULT</a>);
+<a name="l00205"></a>00205                 <span class="keywordflow">return</span> $this-&gt;_lang;
+<a name="l00206"></a>00206         }
+<a name="l00207"></a>00207 
+<a name="l00216"></a><a class="code" href="group__internalLang.html#ga66167ea1adb6c18e3141d8ca90df6044">00216</a>         <span class="keyword">private</span> <a class="code" href="group__internalLang.html#ga66167ea1adb6c18e3141d8ca90df6044">$_strings</a>;
+<a name="l00217"></a>00217 
+<a name="l00226"></a><a class="code" href="group__internalLang.html#ga18db72fc208dacf384d74dfc5c3713ad">00226</a>         <span class="keyword">private</span> function <a class="code" href="group__internalLang.html#ga18db72fc208dacf384d74dfc5c3713ad">getString</a>($str)
+<a name="l00227"></a>00227         {
+<a name="l00228"></a>00228                 <span class="comment">// call CASclient::getLang() to be sure the language is initialized</span>
+<a name="l00229"></a>00229                 $this-&gt;<a class="code" href="group__internalLang.html#gab30d0e0fc8414be34c1f2a28649124d0">getLang</a>();
+<a name="l00230"></a>00230 
+<a name="l00231"></a>00231                 <span class="keywordflow">if</span> ( !isset($this-&gt;<a class="code" href="catalan_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a>[$str]) ) {
+<a name="l00232"></a>00232                         trigger_error(<span class="stringliteral">&#39;string `&#39;</span>.$str.<span class="charliteral">&#39;\&#39;</span> not defined <span class="keywordflow">for</span> language `<span class="stringliteral">&#39;.$this-&gt;getLang().&#39;</span>\<span class="stringliteral">&#39;&#39;</span>,E_USER_ERROR);
+<a name="l00233"></a>00233                 }
+<a name="l00234"></a>00234                 <span class="keywordflow">return</span> $this-&gt;<a class="code" href="catalan_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a>[$str];
+<a name="l00235"></a>00235         }
+<a name="l00236"></a>00236 
+<a name="l00245"></a><a class="code" href="group__internalLang.html#ga29c04b71561ffeed72ef005dadf7dc95">00245</a>         <span class="keyword">public</span> function <a class="code" href="group__internalLang.html#ga29c04b71561ffeed72ef005dadf7dc95">setLang</a>($lang)
+<a name="l00246"></a>00246         {
+<a name="l00247"></a>00247                 <span class="comment">// include the corresponding language file</span>
+<a name="l00248"></a>00248                 include(dirname(__FILE__).<span class="stringliteral">&#39;/languages/&#39;</span>.$lang.<span class="stringliteral">&#39;.php&#39;</span>);
+<a name="l00249"></a>00249 
+<a name="l00250"></a>00250                 <span class="keywordflow">if</span> ( !is_array($this-&gt;<a class="code" href="catalan_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a>) ) {
+<a name="l00251"></a>00251                         trigger_error(<span class="stringliteral">&#39;language `&#39;</span>.$lang.<span class="charliteral">&#39;\&#39;</span> is not implemented<span class="stringliteral">&#39;,E_USER_ERROR);</span>
+<a name="l00252"></a>00252 <span class="stringliteral">                }</span>
+<a name="l00253"></a>00253 <span class="stringliteral">                $this-&gt;_lang = $lang;</span>
+<a name="l00254"></a>00254 <span class="stringliteral">        }</span>
+<a name="l00255"></a>00255 <span class="stringliteral"></span>
+<a name="l00257"></a>00257 <span class="stringliteral">        // ########################################################################</span>
+<a name="l00258"></a>00258 <span class="stringliteral">        //  CAS SERVER CONFIG</span>
+<a name="l00259"></a>00259 <span class="stringliteral">        // ########################################################################</span>
+<a name="l00288"></a><a class="code" href="group__internalConfig.html#gaab876894f8f80166fdc3632274178a05">00288</a> <span class="stringliteral">        private $_server = array(</span>
+<a name="l00289"></a>00289 <span class="stringliteral">                &#39;</span>version<span class="stringliteral">&#39; =&gt; -1,</span>
+<a name="l00290"></a>00290 <span class="stringliteral">                &#39;</span>hostname<span class="stringliteral">&#39; =&gt; &#39;</span>none<span class="stringliteral">&#39;,</span>
+<a name="l00291"></a>00291 <span class="stringliteral">                &#39;</span>port<span class="stringliteral">&#39; =&gt; -1,</span>
+<a name="l00292"></a>00292 <span class="stringliteral">                &#39;</span>uri<span class="stringliteral">&#39; =&gt; &#39;</span>none<span class="stringliteral">&#39;);</span>
+<a name="l00293"></a>00293 <span class="stringliteral"></span>
+<a name="l00298"></a><a class="code" href="group__internalConfig.html#ga0dfec4f2b30a20582355a0252d7644fa">00298</a> <span class="stringliteral">        private function getServerVersion()</span>
+<a name="l00299"></a>00299 <span class="stringliteral">        {</span>
+<a name="l00300"></a>00300 <span class="stringliteral">                return $this-&gt;_server[&#39;</span>version<span class="stringliteral">&#39;];</span>
+<a name="l00301"></a>00301 <span class="stringliteral">        }</span>
+<a name="l00302"></a>00302 <span class="stringliteral"></span>
+<a name="l00307"></a><a class="code" href="group__internalConfig.html#ga8ee3ab0acca92bd0e489e4f3708c177a">00307</a> <span class="stringliteral">        private function getServerHostname()</span>
+<a name="l00308"></a>00308 <span class="stringliteral">        { return $this-&gt;_server[&#39;</span>hostname<span class="stringliteral">&#39;]; }</span>
+<a name="l00309"></a>00309 <span class="stringliteral"></span>
+<a name="l00314"></a><a class="code" href="group__internalConfig.html#gaae25f38d63393d7335596f76f21f24f1">00314</a> <span class="stringliteral">        private function getServerPort()</span>
+<a name="l00315"></a>00315 <span class="stringliteral">        { return $this-&gt;_server[&#39;</span>port<span class="stringliteral">&#39;]; }</span>
+<a name="l00316"></a>00316 <span class="stringliteral"></span>
+<a name="l00321"></a><a class="code" href="group__internalConfig.html#gab0963ff44b9a9d900585c89c881fb678">00321</a> <span class="stringliteral">        private function getServerURI()</span>
+<a name="l00322"></a>00322 <span class="stringliteral">        { return $this-&gt;_server[&#39;</span>uri<span class="stringliteral">&#39;]; }</span>
+<a name="l00323"></a>00323 <span class="stringliteral"></span>
+<a name="l00328"></a><a class="code" href="group__internalConfig.html#gaa50d82f0d6951d1ff1305b870155febe">00328</a> <span class="stringliteral">        private function getServerBaseURL()</span>
+<a name="l00329"></a>00329 <span class="stringliteral">        {</span>
+<a name="l00330"></a>00330 <span class="stringliteral">                // the URL is build only when needed</span>
+<a name="l00331"></a>00331 <span class="stringliteral">                if ( empty($this-&gt;_server[&#39;</span>base_url<span class="stringliteral">&#39;]) ) {</span>
+<a name="l00332"></a>00332 <span class="stringliteral">                        $this-&gt;_server[&#39;</span>base_url<span class="stringliteral">&#39;] = &#39;</span>https:<span class="comment">//&#39; . $this-&gt;getServerHostname();</span>
+<a name="l00333"></a>00333                         if ($this-&gt;<a class="code" href="group__internalConfig.html#gaae25f38d63393d7335596f76f21f24f1">getServerPort</a>()!=443) {
+<a name="l00334"></a>00334                                 $this-&gt;_server[<span class="stringliteral">&#39;base_url&#39;</span>] .= <span class="charliteral">&#39;:&#39;</span>
+<a name="l00335"></a>00335                                 .$this-&gt;getServerPort();
+<a name="l00336"></a>00336                         }
+<a name="l00337"></a>00337                         $this-&gt;_server[<span class="stringliteral">&#39;base_url&#39;</span>] .= $this-&gt;<a class="code" href="group__internalConfig.html#gab0963ff44b9a9d900585c89c881fb678">getServerURI</a>();
+<a name="l00338"></a>00338                 }
+<a name="l00339"></a>00339                 <span class="keywordflow">return</span> $this-&gt;_server[<span class="stringliteral">&#39;base_url&#39;</span>];
+<a name="l00340"></a>00340         }
+<a name="l00341"></a>00341 
+<a name="l00350"></a><a class="code" href="group__internalConfig.html#ga75782f9ef91325ce1f235eec5367df5b">00350</a>         <span class="keyword">public</span> function <a class="code" href="group__internalConfig.html#ga75782f9ef91325ce1f235eec5367df5b">getServerLoginURL</a>($gateway=<span class="keyword">false</span>,$renew=<span class="keyword">false</span>) {
+<a name="l00351"></a>00351                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00352"></a>00352                 <span class="comment">// the URL is build only when needed</span>
+<a name="l00353"></a>00353                 <span class="keywordflow">if</span> ( empty($this-&gt;_server[<span class="stringliteral">&#39;login_url&#39;</span>]) ) {
+<a name="l00354"></a>00354                         $this-&gt;_server[<span class="stringliteral">&#39;login_url&#39;</span>] = $this-&gt;<a class="code" href="group__internalConfig.html#gaa50d82f0d6951d1ff1305b870155febe">getServerBaseURL</a>();
+<a name="l00355"></a>00355                         $this-&gt;_server[<span class="stringliteral">&#39;login_url&#39;</span>] .= <span class="stringliteral">&#39;login?service=&#39;</span>;
+<a name="l00356"></a>00356                         $this-&gt;_server[<span class="stringliteral">&#39;login_url&#39;</span>] .= urlencode($this-&gt;<a class="code" href="group__internalMisc.html#gaa7564ffa02c80ebf8ec2d7238a22f9e0">getURL</a>());
+<a name="l00357"></a>00357                 }
+<a name="l00358"></a>00358                 $url = $this-&gt;_server[<span class="stringliteral">&#39;login_url&#39;</span>];
+<a name="l00359"></a>00359                 <span class="keywordflow">if</span>($renew) {
+<a name="l00360"></a>00360                         <span class="comment">// It is recommended that when the &quot;renew&quot; parameter is set, its value be &quot;true&quot;</span>
+<a name="l00361"></a>00361                         $url = $this-&gt;<a class="code" href="group__internalMisc.html#gac0540d05b6f1e0d67c43980abeece437">buildQueryUrl</a>($url, <span class="stringliteral">&#39;renew=true&#39;</span>);
+<a name="l00362"></a>00362                 } elseif ($gateway) {
+<a name="l00363"></a>00363                         <span class="comment">// It is recommended that when the &quot;gateway&quot; parameter is set, its value be &quot;true&quot;</span>
+<a name="l00364"></a>00364                         $url = $this-&gt;<a class="code" href="group__internalMisc.html#gac0540d05b6f1e0d67c43980abeece437">buildQueryUrl</a>($url, <span class="stringliteral">&#39;gateway=true&#39;</span>);
+<a name="l00365"></a>00365                 }
+<a name="l00366"></a>00366                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>($url);
+<a name="l00367"></a>00367                 <span class="keywordflow">return</span> $url;
+<a name="l00368"></a>00368         }
+<a name="l00369"></a>00369 
+<a name="l00375"></a><a class="code" href="group__internalConfig.html#gac2d9a37c0dca05e079b078ca67a9c325">00375</a>         <span class="keyword">public</span> function <a class="code" href="group__internalConfig.html#gac2d9a37c0dca05e079b078ca67a9c325">setServerLoginURL</a>($url)
+<a name="l00376"></a>00376         {
+<a name="l00377"></a>00377                 <span class="keywordflow">return</span> $this-&gt;_server[<span class="stringliteral">&#39;login_url&#39;</span>] = $url;
+<a name="l00378"></a>00378         }
+<a name="l00379"></a>00379 
+<a name="l00380"></a>00380 
+<a name="l00386"></a><a class="code" href="group__internalConfig.html#ga21a9660c25cba68f165b7c4b1ea0456d">00386</a>         <span class="keyword">public</span> function <a class="code" href="group__internalConfig.html#ga21a9660c25cba68f165b7c4b1ea0456d">setServerServiceValidateURL</a>($url)
+<a name="l00387"></a>00387         {
+<a name="l00388"></a>00388                 <span class="keywordflow">return</span> $this-&gt;_server[<span class="stringliteral">&#39;service_validate_url&#39;</span>] = $url;
+<a name="l00389"></a>00389         }
+<a name="l00390"></a>00390 
+<a name="l00391"></a>00391 
+<a name="l00397"></a><a class="code" href="group__internalConfig.html#gadccec5ba83d4719f433adab32068421b">00397</a>         <span class="keyword">public</span> function <a class="code" href="group__internalConfig.html#gadccec5ba83d4719f433adab32068421b">setServerProxyValidateURL</a>($url)
+<a name="l00398"></a>00398         {
+<a name="l00399"></a>00399                 <span class="keywordflow">return</span> $this-&gt;_server[<span class="stringliteral">&#39;proxy_validate_url&#39;</span>] = $url;
+<a name="l00400"></a>00400         }
+<a name="l00401"></a>00401 
+<a name="l00402"></a>00402 
+<a name="l00408"></a><a class="code" href="group__internalConfig.html#ga39f47156d1e059502f8a3f6f497a461b">00408</a>         <span class="keyword">public</span> function <a class="code" href="group__internalConfig.html#ga39f47156d1e059502f8a3f6f497a461b">setServerSamlValidateURL</a>($url)
+<a name="l00409"></a>00409         {
+<a name="l00410"></a>00410                 <span class="keywordflow">return</span> $this-&gt;_server[<span class="stringliteral">&#39;saml_validate_url&#39;</span>] = $url;
+<a name="l00411"></a>00411         }
+<a name="l00412"></a>00412 
+<a name="l00413"></a>00413 
+<a name="l00418"></a><a class="code" href="group__internalConfig.html#ga0035da23a096dd33bdbbb14ab36ca759">00418</a>         <span class="keyword">public</span> function <a class="code" href="group__internalConfig.html#ga0035da23a096dd33bdbbb14ab36ca759">getServerServiceValidateURL</a>()
+<a name="l00419"></a>00419         {
+<a name="l00420"></a>00420                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00421"></a>00421                 <span class="comment">// the URL is build only when needed</span>
+<a name="l00422"></a>00422                 <span class="keywordflow">if</span> ( empty($this-&gt;_server[<span class="stringliteral">&#39;service_validate_url&#39;</span>]) ) {
+<a name="l00423"></a>00423                         <span class="keywordflow">switch</span> ($this-&gt;<a class="code" href="group__internalConfig.html#ga0dfec4f2b30a20582355a0252d7644fa">getServerVersion</a>()) {
+<a name="l00424"></a>00424                                 <span class="keywordflow">case</span> <a class="code" href="group__public.html#ga0904e4fb51e532bbba51832326dbf8fb">CAS_VERSION_1_0</a>:
+<a name="l00425"></a>00425                                         $this-&gt;_server[<span class="stringliteral">&#39;service_validate_url&#39;</span>] = $this-&gt;<a class="code" href="group__internalConfig.html#gaa50d82f0d6951d1ff1305b870155febe">getServerBaseURL</a>().<span class="stringliteral">&#39;validate&#39;</span>;
+<a name="l00426"></a>00426                                         <span class="keywordflow">break</span>;
+<a name="l00427"></a>00427                                 <span class="keywordflow">case</span> <a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>:
+<a name="l00428"></a>00428                                         $this-&gt;_server[<span class="stringliteral">&#39;service_validate_url&#39;</span>] = $this-&gt;<a class="code" href="group__internalConfig.html#gaa50d82f0d6951d1ff1305b870155febe">getServerBaseURL</a>().<span class="stringliteral">&#39;serviceValidate&#39;</span>;
+<a name="l00429"></a>00429                                         <span class="keywordflow">break</span>;
+<a name="l00430"></a>00430                         }
+<a name="l00431"></a>00431                 }
+<a name="l00432"></a>00432                 $url = $this-&gt;<a class="code" href="group__internalMisc.html#gac0540d05b6f1e0d67c43980abeece437">buildQueryUrl</a>($this-&gt;_server[<span class="stringliteral">&#39;service_validate_url&#39;</span>], <span class="stringliteral">&#39;service=&#39;</span>.urlencode($this-&gt;<a class="code" href="group__internalMisc.html#gaa7564ffa02c80ebf8ec2d7238a22f9e0">getURL</a>()));
+<a name="l00433"></a>00433                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>($url);
+<a name="l00434"></a>00434                 <span class="keywordflow">return</span> $url;
+<a name="l00435"></a>00435         }
+<a name="l00440"></a><a class="code" href="group__internalConfig.html#gae3728c61321dd40d1b59780c15cf24ba">00440</a>         <span class="keyword">public</span> function <a class="code" href="group__internalConfig.html#gae3728c61321dd40d1b59780c15cf24ba">getServerSamlValidateURL</a>()
+<a name="l00441"></a>00441         {
+<a name="l00442"></a>00442                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00443"></a>00443                 <span class="comment">// the URL is build only when needed</span>
+<a name="l00444"></a>00444                 <span class="keywordflow">if</span> ( empty($this-&gt;_server[<span class="stringliteral">&#39;saml_validate_url&#39;</span>]) ) {
+<a name="l00445"></a>00445                         <span class="keywordflow">switch</span> ($this-&gt;<a class="code" href="group__internalConfig.html#ga0dfec4f2b30a20582355a0252d7644fa">getServerVersion</a>()) {
+<a name="l00446"></a>00446                                 <span class="keywordflow">case</span> <a class="code" href="group__public.html#gaa6440870ffb0a81c5403ac10faa25f33">SAML_VERSION_1_1</a>:
+<a name="l00447"></a>00447                                         $this-&gt;_server[<span class="stringliteral">&#39;saml_validate_url&#39;</span>] = $this-&gt;<a class="code" href="group__internalConfig.html#gaa50d82f0d6951d1ff1305b870155febe">getServerBaseURL</a>().<span class="stringliteral">&#39;samlValidate&#39;</span>;
+<a name="l00448"></a>00448                                         <span class="keywordflow">break</span>;
+<a name="l00449"></a>00449                         }
+<a name="l00450"></a>00450                 }
+<a name="l00451"></a>00451                 
+<a name="l00452"></a>00452                 $url = $this-&gt;<a class="code" href="group__internalMisc.html#gac0540d05b6f1e0d67c43980abeece437">buildQueryUrl</a>($this-&gt;_server[<span class="stringliteral">&#39;saml_validate_url&#39;</span>], <span class="stringliteral">&#39;TARGET=&#39;</span>.urlencode($this-&gt;<a class="code" href="group__internalMisc.html#gaa7564ffa02c80ebf8ec2d7238a22f9e0">getURL</a>()));
+<a name="l00453"></a>00453                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>($url);
+<a name="l00454"></a>00454                 <span class="keywordflow">return</span> $url;
+<a name="l00455"></a>00455         }
+<a name="l00456"></a>00456         
+<a name="l00461"></a><a class="code" href="group__internalConfig.html#ga1232d737fafbe6db69cabce81d863d71">00461</a>         <span class="keyword">public</span> function <a class="code" href="group__internalConfig.html#ga1232d737fafbe6db69cabce81d863d71">getServerProxyValidateURL</a>()
+<a name="l00462"></a>00462         {
+<a name="l00463"></a>00463                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00464"></a>00464                 <span class="comment">// the URL is build only when needed</span>
+<a name="l00465"></a>00465                 <span class="keywordflow">if</span> ( empty($this-&gt;_server[<span class="stringliteral">&#39;proxy_validate_url&#39;</span>]) ) {
+<a name="l00466"></a>00466                         <span class="keywordflow">switch</span> ($this-&gt;<a class="code" href="group__internalConfig.html#ga0dfec4f2b30a20582355a0252d7644fa">getServerVersion</a>()) {
+<a name="l00467"></a>00467                                 <span class="keywordflow">case</span> <a class="code" href="group__public.html#ga0904e4fb51e532bbba51832326dbf8fb">CAS_VERSION_1_0</a>:
+<a name="l00468"></a>00468                                         $this-&gt;_server[<span class="stringliteral">&#39;proxy_validate_url&#39;</span>] = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l00469"></a>00469                                         <span class="keywordflow">break</span>;
+<a name="l00470"></a>00470                                 <span class="keywordflow">case</span> <a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>:
+<a name="l00471"></a>00471                                         $this-&gt;_server[<span class="stringliteral">&#39;proxy_validate_url&#39;</span>] = $this-&gt;<a class="code" href="group__internalConfig.html#gaa50d82f0d6951d1ff1305b870155febe">getServerBaseURL</a>().<span class="stringliteral">&#39;proxyValidate&#39;</span>;
+<a name="l00472"></a>00472                                         <span class="keywordflow">break</span>;
+<a name="l00473"></a>00473                         }
+<a name="l00474"></a>00474                 }
+<a name="l00475"></a>00475                 $url = $this-&gt;<a class="code" href="group__internalMisc.html#gac0540d05b6f1e0d67c43980abeece437">buildQueryUrl</a>($this-&gt;_server[<span class="stringliteral">&#39;proxy_validate_url&#39;</span>], <span class="stringliteral">&#39;service=&#39;</span>.urlencode($this-&gt;<a class="code" href="group__internalMisc.html#gaa7564ffa02c80ebf8ec2d7238a22f9e0">getURL</a>()));
+<a name="l00476"></a>00476                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>($url);
+<a name="l00477"></a>00477                 <span class="keywordflow">return</span> $url;
+<a name="l00478"></a>00478         }
+<a name="l00479"></a>00479         
+<a name="l00480"></a>00480 
+<a name="l00485"></a><a class="code" href="group__internalConfig.html#ga2ecb28daad3c50c0f6b3ef125ab1faaa">00485</a>         <span class="keyword">public</span> function <a class="code" href="group__internalConfig.html#ga2ecb28daad3c50c0f6b3ef125ab1faaa">getServerProxyURL</a>()
+<a name="l00486"></a>00486         {
+<a name="l00487"></a>00487                 <span class="comment">// the URL is build only when needed</span>
+<a name="l00488"></a>00488                 <span class="keywordflow">if</span> ( empty($this-&gt;_server[<span class="stringliteral">&#39;proxy_url&#39;</span>]) ) {
+<a name="l00489"></a>00489                         <span class="keywordflow">switch</span> ($this-&gt;<a class="code" href="group__internalConfig.html#ga0dfec4f2b30a20582355a0252d7644fa">getServerVersion</a>()) {
+<a name="l00490"></a>00490                                 <span class="keywordflow">case</span> <a class="code" href="group__public.html#ga0904e4fb51e532bbba51832326dbf8fb">CAS_VERSION_1_0</a>:
+<a name="l00491"></a>00491                                         $this-&gt;_server[<span class="stringliteral">&#39;proxy_url&#39;</span>] = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l00492"></a>00492                                         <span class="keywordflow">break</span>;
+<a name="l00493"></a>00493                                 <span class="keywordflow">case</span> <a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>:
+<a name="l00494"></a>00494                                         $this-&gt;_server[<span class="stringliteral">&#39;proxy_url&#39;</span>] = $this-&gt;<a class="code" href="group__internalConfig.html#gaa50d82f0d6951d1ff1305b870155febe">getServerBaseURL</a>().<span class="stringliteral">&#39;proxy&#39;</span>;
+<a name="l00495"></a>00495                                         <span class="keywordflow">break</span>;
+<a name="l00496"></a>00496                         }
+<a name="l00497"></a>00497                 }
+<a name="l00498"></a>00498                 <span class="keywordflow">return</span> $this-&gt;_server[<span class="stringliteral">&#39;proxy_url&#39;</span>];
+<a name="l00499"></a>00499         }
+<a name="l00500"></a>00500 
+<a name="l00505"></a><a class="code" href="group__internalConfig.html#ga46c09b45a560eb7dec420e6807fcf16c">00505</a>         <span class="keyword">public</span> function <a class="code" href="group__internalConfig.html#ga46c09b45a560eb7dec420e6807fcf16c">getServerLogoutURL</a>()
+<a name="l00506"></a>00506         {
+<a name="l00507"></a>00507                 <span class="comment">// the URL is build only when needed</span>
+<a name="l00508"></a>00508                 <span class="keywordflow">if</span> ( empty($this-&gt;_server[<span class="stringliteral">&#39;logout_url&#39;</span>]) ) {
+<a name="l00509"></a>00509                         $this-&gt;_server[<span class="stringliteral">&#39;logout_url&#39;</span>] = $this-&gt;<a class="code" href="group__internalConfig.html#gaa50d82f0d6951d1ff1305b870155febe">getServerBaseURL</a>().<span class="stringliteral">&#39;logout&#39;</span>;
+<a name="l00510"></a>00510                 }
+<a name="l00511"></a>00511                 <span class="keywordflow">return</span> $this-&gt;_server[<span class="stringliteral">&#39;logout_url&#39;</span>];
+<a name="l00512"></a>00512         }
+<a name="l00513"></a>00513 
+<a name="l00519"></a><a class="code" href="group__internalConfig.html#ga526dca6da322ff2b00e792c7b7a850ec">00519</a>         <span class="keyword">public</span> function <a class="code" href="group__internalConfig.html#ga526dca6da322ff2b00e792c7b7a850ec">setServerLogoutURL</a>($url)
+<a name="l00520"></a>00520         {
+<a name="l00521"></a>00521                 <span class="keywordflow">return</span> $this-&gt;_server[<span class="stringliteral">&#39;logout_url&#39;</span>] = $url;
+<a name="l00522"></a>00522         }
+<a name="l00523"></a>00523 
+<a name="l00527"></a><a class="code" href="group__internalConfig.html#gaf9dfac02c509a43b201bbfccf7402c94">00527</a>         <span class="keyword">private</span> <a class="code" href="group__internalConfig.html#gaf9dfac02c509a43b201bbfccf7402c94">$_curl_options</a> = array();
+<a name="l00528"></a>00528 
+<a name="l00532"></a><a class="code" href="group__internalConfig.html#gaa6e5e8340332023e6d6553a423641da5">00532</a>         <span class="keyword">public</span> function <a class="code" href="group__internalConfig.html#gaa6e5e8340332023e6d6553a423641da5">setExtraCurlOption</a>($key, $value)
+<a name="l00533"></a>00533         {
+<a name="l00534"></a>00534                 $this-&gt;_curl_options[$key] = $value;
+<a name="l00535"></a>00535         }
+<a name="l00536"></a>00536         
+<a name="l00539"></a>00539         <span class="comment">// ########################################################################</span>
+<a name="l00540"></a>00540         <span class="comment">//  Change the internal behaviour of phpcas</span>
+<a name="l00541"></a>00541         <span class="comment">// ########################################################################</span>
+<a name="l00542"></a>00542         
+<a name="l00554"></a><a class="code" href="group__internalBehave.html#ga0c0b9532eb79b569e05c386642632bad">00554</a>         <span class="keyword">private</span> <a class="code" href="group__internalBehave.html#ga0c0b9532eb79b569e05c386642632bad">$_requestImplementation</a> = <span class="stringliteral">&#39;CAS_CurlRequest&#39;</span>;
+<a name="l00555"></a>00555 
+<a name="l00563"></a><a class="code" href="group__internalBehave.html#ga276759918857eddc4fd10d04702d5502">00563</a>         <span class="keyword">public</span> function <a class="code" href="group__internalBehave.html#ga276759918857eddc4fd10d04702d5502">setRequestImplementation</a> ($className) {
+<a name="l00564"></a>00564                 $obj = <span class="keyword">new</span> $className;
+<a name="l00565"></a>00565                 <span class="keywordflow">if</span> (!($obj instanceof <a class="code" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a>))
+<a name="l00566"></a>00566                 <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a>(<span class="stringliteral">&#39;$className must implement the CAS_RequestInterface&#39;</span>);
+<a name="l00567"></a>00567 
+<a name="l00568"></a>00568                 $this-&gt;_requestImplementation = $className;
+<a name="l00569"></a>00569         }
+<a name="l00570"></a>00570                 
+<a name="l00574"></a><a class="code" href="group__internalBehave.html#ga70bec4461feb938a60eb0c70792d8aba">00574</a>         <span class="keyword">private</span> <a class="code" href="group__internalBehave.html#ga70bec4461feb938a60eb0c70792d8aba">$_exitOnAuthError</a> = <span class="keyword">true</span>;
+<a name="l00575"></a>00575 
+<a name="l00583"></a><a class="code" href="group__internalBehave.html#gad914221096da4e9915660b2770347cd1">00583</a>         <span class="keyword">public</span> function <a class="code" href="group__internalBehave.html#gad914221096da4e9915660b2770347cd1">setNoExitOnAuthError</a> () {
+<a name="l00584"></a>00584                 $this-&gt;_exitOnAuthError = <span class="keyword">false</span>;
+<a name="l00585"></a>00585         }
+<a name="l00586"></a>00586         
+<a name="l00591"></a><a class="code" href="group__internalBehave.html#ga46713aa9224ac1fb8789a48dca4b988c">00591</a>         <span class="keyword">private</span> <a class="code" href="group__internalBehave.html#ga46713aa9224ac1fb8789a48dca4b988c">$_clearTicketsFromUrl</a> = <span class="keyword">true</span>;
+<a name="l00592"></a>00592         
+<a name="l00602"></a><a class="code" href="group__internalBehave.html#gafe794b80449acacbdb6c0d30863a6683">00602</a>         <span class="keyword">public</span> function <a class="code" href="group__internalBehave.html#gafe794b80449acacbdb6c0d30863a6683">setNoClearTicketsFromUrl</a> () {
+<a name="l00603"></a>00603                 $this-&gt;_clearTicketsFromUrl = <span class="keyword">false</span>;
+<a name="l00604"></a>00604         }
+<a name="l00605"></a>00605         
+<a name="l00609"></a><a class="code" href="group__internalBehave.html#gaed60210e7c5d6d398dd3277ca95ac657">00609</a>         <span class="keyword">private</span> <a class="code" href="group__internalBehave.html#gaed60210e7c5d6d398dd3277ca95ac657">$_postAuthenticateCallbackFunction</a> = null;
+<a name="l00610"></a>00610         
+<a name="l00614"></a><a class="code" href="group__internalBehave.html#ga22b6717169f18156da150b60a59b2ded">00614</a>         <span class="keyword">private</span> <a class="code" href="group__internalBehave.html#ga22b6717169f18156da150b60a59b2ded">$_postAuthenticateCallbackArgs</a> = array();
+<a name="l00615"></a>00615         
+<a name="l00634"></a><a class="code" href="group__internalBehave.html#ga41c4204c3ab191548f1ae48984f73848">00634</a>         <span class="keyword">public</span> function <a class="code" href="group__internalBehave.html#ga41c4204c3ab191548f1ae48984f73848">setPostAuthenticateCallback</a> ($function, array $additionalArgs = array()) {
+<a name="l00635"></a>00635                 $this-&gt;_postAuthenticateCallbackFunction = $function;
+<a name="l00636"></a>00636                 $this-&gt;_postAuthenticateCallbackArgs = $additionalArgs;
+<a name="l00637"></a>00637         }
+<a name="l00638"></a>00638         
+<a name="l00642"></a><a class="code" href="group__internalBehave.html#ga02105ca843402cbb747c693272dbec97">00642</a>         <span class="keyword">private</span> <a class="code" href="group__internalBehave.html#ga02105ca843402cbb747c693272dbec97">$_signoutCallbackFunction</a> = null;
+<a name="l00643"></a>00643         
+<a name="l00647"></a><a class="code" href="group__internalBehave.html#ga3e2359bc41599cca4a89f6a06a3318d9">00647</a>         <span class="keyword">private</span> <a class="code" href="group__internalBehave.html#ga3e2359bc41599cca4a89f6a06a3318d9">$_signoutCallbackArgs</a> = array();
+<a name="l00648"></a>00648         
+<a name="l00662"></a><a class="code" href="group__internalBehave.html#ga61a82c256483dff20a09cd9ca9c33a62">00662</a>         <span class="keyword">public</span> function <a class="code" href="group__internalBehave.html#ga61a82c256483dff20a09cd9ca9c33a62">setSingleSignoutCallback</a> ($function, array $additionalArgs = array()) {
+<a name="l00663"></a>00663                 $this-&gt;_signoutCallbackFunction = $function;
+<a name="l00664"></a>00664                 $this-&gt;_signoutCallbackArgs = $additionalArgs;
+<a name="l00665"></a>00665         }
+<a name="l00666"></a>00666         
+<a name="l00669"></a>00669         <span class="comment">// ########################################################################</span>
+<a name="l00670"></a>00670         <span class="comment">//  CONSTRUCTOR</span>
+<a name="l00671"></a>00671         <span class="comment">// ########################################################################</span>
+<a name="l00689"></a><a class="code" href="group__internalConfig.html#gadf63185159d9018b2e0bd31f5d2a06e7">00689</a> <span class="comment"></span>        <span class="keyword">public</span> function <a class="code" href="group__internalConfig.html#gadf63185159d9018b2e0bd31f5d2a06e7">__construct</a>(
+<a name="l00690"></a>00690         $server_version,
+<a name="l00691"></a>00691         $proxy,
+<a name="l00692"></a>00692         $server_hostname,
+<a name="l00693"></a>00693         $server_port,
+<a name="l00694"></a>00694         $server_uri,
+<a name="l00695"></a>00695         $start_session = <span class="keyword">true</span>) {
+<a name="l00696"></a>00696 
+<a name="l00697"></a>00697                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00698"></a>00698 
+<a name="l00699"></a>00699                 $this-&gt;_start_session = $start_session;
+<a name="l00700"></a>00700 
+<a name="l00701"></a>00701                 <span class="keywordflow">if</span> ($this-&gt;_start_session &amp;&amp; session_id() !== <span class="stringliteral">&quot;&quot;</span>)
+<a name="l00702"></a>00702                 {
+<a name="l00703"></a>00703                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&quot;Another session was started before phpcas. Either disable the session&quot;</span> .
+<a name="l00704"></a>00704                                 <span class="stringliteral">&quot; handling for phpcas in the client() call or modify your application to leave&quot;</span> .
+<a name="l00705"></a>00705                                 <span class="stringliteral">&quot; session handling to phpcas&quot;</span>);                 
+<a name="l00706"></a>00706                 }
+<a name="l00707"></a>00707                 <span class="comment">// skip Session Handling for logout requests and if don&#39;t want it&#39;</span>
+<a name="l00708"></a>00708                 <span class="keywordflow">if</span> ($start_session &amp;&amp; !$this-&gt;<a class="code" href="group__internalAuthentication.html#ga399b37acdc834f245baf9ae78669397e">isLogoutRequest</a>())
+<a name="l00709"></a>00709                 {
+<a name="l00710"></a>00710                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS :: trace</a>(<span class="stringliteral">&quot;Starting a new session&quot;</span>);
+<a name="l00711"></a>00711                         session_start();
+<a name="l00712"></a>00712                 }
+<a name="l00713"></a>00713 
+<a name="l00714"></a>00714 
+<a name="l00715"></a>00715                 <span class="comment">// are we in proxy mode ?</span>
+<a name="l00716"></a>00716                 $this-&gt;_proxy = $proxy;
+<a name="l00717"></a>00717 
+<a name="l00718"></a>00718                 <span class="comment">// Make cookie handling available.</span>
+<a name="l00719"></a>00719                 <span class="keywordflow">if</span> ($this-&gt;<a class="code" href="group__internalProxy.html#ga0dfba2b184668dda8892c385c3f04096">isProxy</a>()) {
+<a name="l00720"></a>00720                         <span class="keywordflow">if</span> (!isset($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>]))
+<a name="l00721"></a>00721                         $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>] = array();
+<a name="l00722"></a>00722                         <span class="keywordflow">if</span> (!isset($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;service_cookies&#39;</span>]))
+<a name="l00723"></a>00723                         $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;service_cookies&#39;</span>] = array();
+<a name="l00724"></a>00724                         $this-&gt;_serviceCookieJar = <span class="keyword">new</span> <a class="code" href="classCAS__CookieJar.html">CAS_CookieJar</a>($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;service_cookies&#39;</span>]);
+<a name="l00725"></a>00725                 }
+<a name="l00726"></a>00726 
+<a name="l00727"></a>00727                 <span class="comment">//check version</span>
+<a name="l00728"></a>00728                 <span class="keywordflow">switch</span> ($server_version) {
+<a name="l00729"></a>00729                         <span class="keywordflow">case</span> <a class="code" href="group__public.html#ga0904e4fb51e532bbba51832326dbf8fb">CAS_VERSION_1_0</a>:
+<a name="l00730"></a>00730                                 <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalProxy.html#ga0dfba2b184668dda8892c385c3f04096">isProxy</a>() )
+<a name="l00731"></a>00731                                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;CAS proxies are not supported in CAS &#39;</span>
+<a name="l00732"></a>00732                                 .$server_version);
+<a name="l00733"></a>00733                                 <span class="keywordflow">break</span>;
+<a name="l00734"></a>00734                         <span class="keywordflow">case</span> <a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>:
+<a name="l00735"></a>00735                                 <span class="keywordflow">break</span>;
+<a name="l00736"></a>00736                         <span class="keywordflow">case</span> <a class="code" href="group__public.html#gaa6440870ffb0a81c5403ac10faa25f33">SAML_VERSION_1_1</a>:
+<a name="l00737"></a>00737                                 <span class="keywordflow">break</span>;
+<a name="l00738"></a>00738                         <span class="keywordflow">default</span>:
+<a name="l00739"></a>00739                                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;this version of CAS (`&#39;</span>
+<a name="l00740"></a>00740                                 .$server_version
+<a name="l00741"></a>00741                                 .<span class="charliteral">&#39;\&#39;</span>) is not supported by <a class="code" href="classphpCAS.html">phpCAS</a> <span class="stringliteral">&#39;</span>
+<a name="l00742"></a>00742 <span class="stringliteral">                                .phpCAS::getVersion());</span>
+<a name="l00743"></a>00743 <span class="stringliteral">                }</span>
+<a name="l00744"></a>00744 <span class="stringliteral">                $this-&gt;_server[&#39;</span>version<span class="stringliteral">&#39;] = $server_version;</span>
+<a name="l00745"></a>00745 <span class="stringliteral"></span>
+<a name="l00746"></a>00746 <span class="stringliteral">                // check hostname</span>
+<a name="l00747"></a>00747 <span class="stringliteral">                if ( empty($server_hostname)</span>
+<a name="l00748"></a>00748 <span class="stringliteral">                || !preg_match(&#39;</span>/[\.\d\-abcdefghijklmnopqrstuvwxyz]*/<span class="stringliteral">&#39;,$server_hostname) ) {</span>
+<a name="l00749"></a>00749 <span class="stringliteral">                        phpCAS::error(&#39;</span>bad CAS server hostname (`<span class="stringliteral">&#39;.$server_hostname.&#39;</span>\<span class="charliteral">&#39;)&#39;</span>);
+<a name="l00750"></a>00750                 }
+<a name="l00751"></a>00751                 $this-&gt;_server[<span class="stringliteral">&#39;hostname&#39;</span>] = $server_hostname;
+<a name="l00752"></a>00752 
+<a name="l00753"></a>00753                 <span class="comment">// check port</span>
+<a name="l00754"></a>00754                 <span class="keywordflow">if</span> ( $server_port == 0
+<a name="l00755"></a>00755                 || !is_int($server_port) ) {
+<a name="l00756"></a>00756                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;bad CAS server port (`&#39;</span>.$server_hostname.<span class="charliteral">&#39;\&#39;</span>)<span class="stringliteral">&#39;);</span>
+<a name="l00757"></a>00757 <span class="stringliteral">                }</span>
+<a name="l00758"></a>00758 <span class="stringliteral">                $this-&gt;_server[&#39;</span>port<span class="stringliteral">&#39;] = $server_port;</span>
+<a name="l00759"></a>00759 <span class="stringliteral"></span>
+<a name="l00760"></a>00760 <span class="stringliteral">                // check URI</span>
+<a name="l00761"></a>00761 <span class="stringliteral">                if ( !preg_match(&#39;</span>/[\.\d\-_abcdefghijklmnopqrstuvwxyz\/]*/<span class="stringliteral">&#39;,$server_uri) ) {</span>
+<a name="l00762"></a>00762 <span class="stringliteral">                        phpCAS::error(&#39;</span>bad CAS server URI (`<span class="stringliteral">&#39;.$server_uri.&#39;</span>\<span class="charliteral">&#39;)&#39;</span>);
+<a name="l00763"></a>00763                 }
+<a name="l00764"></a>00764                 <span class="comment">// add leading and trailing `/&#39; and remove doubles</span>
+<a name="l00765"></a>00765                 $server_uri = preg_replace(<span class="stringliteral">&#39;/\/\//&#39;</span>,<span class="charliteral">&#39;/&#39;</span>,<span class="charliteral">&#39;/&#39;</span>.$server_uri.<span class="charliteral">&#39;/&#39;</span>);
+<a name="l00766"></a>00766                 $this-&gt;_server[<span class="stringliteral">&#39;uri&#39;</span>] = $server_uri;
+<a name="l00767"></a>00767 
+<a name="l00768"></a>00768                 <span class="comment">// set to callback mode if PgtIou and PgtId CGI GET parameters are provided</span>
+<a name="l00769"></a>00769                 <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalProxy.html#ga0dfba2b184668dda8892c385c3f04096">isProxy</a>() ) {
+<a name="l00770"></a>00770                         $this-&gt;<a class="code" href="group__internalCallback.html#ga18db51da1c4c0324fd3a3f6ab79f6aab">setCallbackMode</a>(!empty($_GET[<span class="stringliteral">&#39;pgtIou&#39;</span>])&amp;&amp;!empty($_GET[<span class="stringliteral">&#39;pgtId&#39;</span>]));
+<a name="l00771"></a>00771                 }
+<a name="l00772"></a>00772 
+<a name="l00773"></a>00773                 <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalCallback.html#ga445e92539e88bfaf0670da31f8ba68d8">isCallbackMode</a>() ) {
+<a name="l00774"></a>00774                         <span class="comment">//callback mode: check that phpCAS is secured</span>
+<a name="l00775"></a>00775                         <span class="keywordflow">if</span> ( !$this-&gt;<a class="code" href="group__internalMisc.html#gab152ae390e1930f926b5f7bba8be050c">isHttps</a>() ) {
+<a name="l00776"></a>00776                                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;CAS proxies must be secured to use phpCAS; PGT\&#39;s will not be received from the CAS server&#39;</span>);
+<a name="l00777"></a>00777                         }
+<a name="l00778"></a>00778                 } <span class="keywordflow">else</span> {
+<a name="l00779"></a>00779                         <span class="comment">//normal mode: get ticket and remove it from CGI parameters for developpers</span>
+<a name="l00780"></a>00780                         $ticket = (isset($_GET[<span class="stringliteral">&#39;ticket&#39;</span>]) ? $_GET[<span class="stringliteral">&#39;ticket&#39;</span>] : null);
+<a name="l00781"></a>00781                         <span class="keywordflow">switch</span> ($this-&gt;<a class="code" href="group__internalConfig.html#ga0dfec4f2b30a20582355a0252d7644fa">getServerVersion</a>()) {
+<a name="l00782"></a>00782                                 <span class="keywordflow">case</span> <a class="code" href="group__public.html#ga0904e4fb51e532bbba51832326dbf8fb">CAS_VERSION_1_0</a>: <span class="comment">// check for a Service Ticket</span>
+<a name="l00783"></a>00783                                         <span class="keywordflow">if</span>( preg_match(<span class="stringliteral">&#39;/^ST-/&#39;</span>,$ticket) ) {
+<a name="l00784"></a>00784                                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;ST \&#39;&#39;</span>.$ticket.<span class="charliteral">&#39;\&#39;</span> found<span class="stringliteral">&#39;);</span>
+<a name="l00785"></a>00785 <span class="stringliteral">                                                //ST present</span>
+<a name="l00786"></a>00786 <span class="stringliteral">                                                $this-&gt;setST($ticket);</span>
+<a name="l00787"></a>00787 <span class="stringliteral">                                                //ticket has been taken into account, unset it to hide it to applications</span>
+<a name="l00788"></a>00788 <span class="stringliteral">                                                unset($_GET[&#39;</span>ticket<span class="stringliteral">&#39;]);</span>
+<a name="l00789"></a>00789 <span class="stringliteral">                                        } else if ( !empty($ticket) ) {</span>
+<a name="l00790"></a>00790 <span class="stringliteral">                                                //ill-formed ticket, halt</span>
+<a name="l00791"></a>00791 <span class="stringliteral">                                                phpCAS::error(&#39;</span>ill-formed ticket found in the URL (ticket=`<span class="stringliteral">&#39;.htmlentities($ticket).&#39;</span>\<span class="charliteral">&#39;)&#39;</span>);
+<a name="l00792"></a>00792                                         }
+<a name="l00793"></a>00793                                         <span class="keywordflow">break</span>;
+<a name="l00794"></a>00794                                 <span class="keywordflow">case</span> <a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>: <span class="comment">// check for a Service or Proxy Ticket</span>
+<a name="l00795"></a>00795                                         <span class="keywordflow">if</span>( preg_match(<span class="stringliteral">&#39;/^[SP]T-/&#39;</span>,$ticket) ) {
+<a name="l00796"></a>00796                                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;ST or PT \&#39;&#39;</span>.$ticket.<span class="charliteral">&#39;\&#39;</span> found<span class="stringliteral">&#39;);</span>
+<a name="l00797"></a>00797 <span class="stringliteral">                                                $this-&gt;setPT($ticket);</span>
+<a name="l00798"></a>00798 <span class="stringliteral">                                                unset($_GET[&#39;</span>ticket<span class="stringliteral">&#39;]);</span>
+<a name="l00799"></a>00799 <span class="stringliteral">                                        } else if ( !empty($ticket) ) {</span>
+<a name="l00800"></a>00800 <span class="stringliteral">                                                //ill-formed ticket, halt</span>
+<a name="l00801"></a>00801 <span class="stringliteral">                                                phpCAS::error(&#39;</span>ill-formed ticket found in the URL (ticket=`<span class="stringliteral">&#39;.htmlentities($ticket).&#39;</span>\<span class="charliteral">&#39;)&#39;</span>);
+<a name="l00802"></a>00802                                         }
+<a name="l00803"></a>00803                                         <span class="keywordflow">break</span>;
+<a name="l00804"></a>00804                                 <span class="keywordflow">case</span> <a class="code" href="group__public.html#gaa6440870ffb0a81c5403ac10faa25f33">SAML_VERSION_1_1</a>: <span class="comment">// SAML just does Service Tickets</span>
+<a name="l00805"></a>00805                                         <span class="keywordflow">if</span>( preg_match(<span class="stringliteral">&#39;/^[SP]T-/&#39;</span>,$ticket) ) {
+<a name="l00806"></a>00806                                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;SA \&#39;&#39;</span>.$ticket.<span class="charliteral">&#39;\&#39;</span> found<span class="stringliteral">&#39;);</span>
+<a name="l00807"></a>00807 <span class="stringliteral">                                                $this-&gt;setSA($ticket);</span>
+<a name="l00808"></a>00808 <span class="stringliteral">                                                unset($_GET[&#39;</span>ticket<span class="stringliteral">&#39;]);</span>
+<a name="l00809"></a>00809 <span class="stringliteral">                                        } else if ( !empty($ticket) ) {</span>
+<a name="l00810"></a>00810 <span class="stringliteral">                                                //ill-formed ticket, halt</span>
+<a name="l00811"></a>00811 <span class="stringliteral">                                                phpCAS::error(&#39;</span>ill-formed ticket found in the URL (ticket=`<span class="stringliteral">&#39;.htmlentities($ticket).&#39;</span>\<span class="charliteral">&#39;)&#39;</span>);
+<a name="l00812"></a>00812                                         }
+<a name="l00813"></a>00813                                         <span class="keywordflow">break</span>;
+<a name="l00814"></a>00814                         }
+<a name="l00815"></a>00815                 }
+<a name="l00816"></a>00816                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l00817"></a>00817         }
+<a name="l00818"></a>00818 
+<a name="l00821"></a>00821         <span class="comment">// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span>
+<a name="l00822"></a>00822         <span class="comment">// XX                                                                    XX</span>
+<a name="l00823"></a>00823         <span class="comment">// XX                           Session Handling                         XX</span>
+<a name="l00824"></a>00824         <span class="comment">// XX                                                                    XX</span>
+<a name="l00825"></a>00825         <span class="comment">// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span>
+<a name="l00826"></a>00826 
+<a name="l00837"></a><a class="code" href="group__internalConfig.html#ga345e16e8ff0427eea158d2b118f6c5d8">00837</a>         <span class="keyword">private</span> <a class="code" href="group__internalConfig.html#ga345e16e8ff0427eea158d2b118f6c5d8">$_start_session</a> = <span class="keyword">true</span>;
+<a name="l00838"></a>00838 
+<a name="l00839"></a><a class="code" href="group__internalConfig.html#ga54eebbdc5fd41b77de3de25f3bd71c84">00839</a>         <span class="keyword">private</span> function <a class="code" href="group__internalConfig.html#ga54eebbdc5fd41b77de3de25f3bd71c84">setStartSession</a>($session)
+<a name="l00840"></a>00840         {
+<a name="l00841"></a>00841                 $this-&gt;_start_session = session;
+<a name="l00842"></a>00842         }
+<a name="l00843"></a>00843 
+<a name="l00844"></a><a class="code" href="group__internalConfig.html#gad91c4f6f554470da2c3071e073c68bff">00844</a>         <span class="keyword">public</span> function <a class="code" href="group__internalConfig.html#gad91c4f6f554470da2c3071e073c68bff">getStartSession</a>($session)
+<a name="l00845"></a>00845         {
+<a name="l00846"></a>00846                 $this-&gt;_start_session = session;
+<a name="l00847"></a>00847         }
+<a name="l00848"></a>00848 
+<a name="l00851"></a>00851         <span class="comment">// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span>
+<a name="l00852"></a>00852         <span class="comment">// XX                                                                    XX</span>
+<a name="l00853"></a>00853         <span class="comment">// XX                           AUTHENTICATION                           XX</span>
+<a name="l00854"></a>00854         <span class="comment">// XX                                                                    XX</span>
+<a name="l00855"></a>00855         <span class="comment">// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span>
+<a name="l00856"></a>00856 
+<a name="l00868"></a><a class="code" href="group__internalAuthentication.html#ga1edc9e777bc4dc2a5213f3000a85e019">00868</a>         <span class="keyword">private</span> <a class="code" href="group__internalAuthentication.html#ga1edc9e777bc4dc2a5213f3000a85e019">$_user</a> = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l00869"></a>00869 
+<a name="l00876"></a><a class="code" href="group__internalAuthentication.html#gaab7eded3796f3a506c71221413dc95a1">00876</a>         <span class="keyword">private</span> function <a class="code" href="group__internalAuthentication.html#gaab7eded3796f3a506c71221413dc95a1">setUser</a>($user)
+<a name="l00877"></a>00877         {
+<a name="l00878"></a>00878                 $this-&gt;_user = $user;
+<a name="l00879"></a>00879         }
+<a name="l00880"></a>00880 
+<a name="l00888"></a><a class="code" href="group__internalAuthentication.html#ga18a943d6984497f7fcde795fb4e57372">00888</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#ga18a943d6984497f7fcde795fb4e57372">getUser</a>()
+<a name="l00889"></a>00889         {
+<a name="l00890"></a>00890                 <span class="keywordflow">if</span> ( empty($this-&gt;_user) ) {
+<a name="l00891"></a>00891                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;this method should be used only after &#39;</span>.__CLASS__.<span class="stringliteral">&#39;::forceAuthentication() or &#39;</span>.__CLASS__.<span class="stringliteral">&#39;::isAuthenticated()&#39;</span>);
+<a name="l00892"></a>00892                 }
+<a name="l00893"></a>00893                 <span class="keywordflow">return</span> $this-&gt;_user;
+<a name="l00894"></a>00894         }
+<a name="l00895"></a>00895 
+<a name="l00896"></a>00896 
+<a name="l00897"></a>00897 
+<a name="l00898"></a>00898         <span class="comment">/***********************************************************************************************************************</span>
+<a name="l00899"></a>00899 <span class="comment">         * Atrributes section</span>
+<a name="l00900"></a>00900 <span class="comment">         *</span>
+<a name="l00901"></a>00901 <span class="comment">         * @author Matthias Crauwels &lt;matthias.crauwels@ugent.be&gt;, Ghent University, Belgium</span>
+<a name="l00902"></a>00902 <span class="comment">         *</span>
+<a name="l00903"></a>00903 <span class="comment">         ***********************************************************************************************************************/</span>
+<a name="l00910"></a><a class="code" href="group__internalAuthentication.html#gab4713832a3000332ddb87a9689bc6a15">00910</a>         <span class="keyword">private</span> <a class="code" href="group__internalAuthentication.html#gab4713832a3000332ddb87a9689bc6a15">$_attributes</a> = array();
+<a name="l00911"></a>00911 
+<a name="l00912"></a><a class="code" href="group__internalAuthentication.html#ga4f0c191193884b48a66a63c871dd660e">00912</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#ga4f0c191193884b48a66a63c871dd660e">setAttributes</a>($attributes)
+<a name="l00913"></a>00913         { $this-&gt;_attributes = $attributes; }
+<a name="l00914"></a>00914 
+<a name="l00915"></a><a class="code" href="group__internalAuthentication.html#ga2c0120dc035c092f00b74a512fc78d4f">00915</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#ga2c0120dc035c092f00b74a512fc78d4f">getAttributes</a>() {
+<a name="l00916"></a>00916                 <span class="keywordflow">if</span> ( empty($this-&gt;_user) ) { <span class="comment">// if no user is set, there shouldn&#39;t be any attributes also...</span>
+<a name="l00917"></a>00917                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;this method should be used only after &#39;</span>.__CLASS__.<span class="stringliteral">&#39;::forceAuthentication() or &#39;</span>.__CLASS__.<span class="stringliteral">&#39;::isAuthenticated()&#39;</span>);
+<a name="l00918"></a>00918                 }
+<a name="l00919"></a>00919                 <span class="keywordflow">return</span> $this-&gt;_attributes;
+<a name="l00920"></a>00920         }
+<a name="l00921"></a>00921 
+<a name="l00922"></a><a class="code" href="group__internalAuthentication.html#ga5201e6b88a4190f8050ea0436af908b7">00922</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#ga5201e6b88a4190f8050ea0436af908b7">hasAttributes</a>()
+<a name="l00923"></a>00923         { <span class="keywordflow">return</span> !empty($this-&gt;_attributes); }
+<a name="l00924"></a>00924 
+<a name="l00925"></a><a class="code" href="group__internalAuthentication.html#ga2dbf501e0c59acffe19bca8fba2b35e3">00925</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#ga2dbf501e0c59acffe19bca8fba2b35e3">hasAttribute</a>($key)
+<a name="l00926"></a>00926         { <span class="keywordflow">return</span> (is_array($this-&gt;_attributes) &amp;&amp; array_key_exists($key, $this-&gt;_attributes)); }
+<a name="l00927"></a>00927 
+<a name="l00928"></a><a class="code" href="group__internalAuthentication.html#ga4e16e6d440ee792bfa63e090b87fcef1">00928</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#ga4e16e6d440ee792bfa63e090b87fcef1">getAttribute</a>($key)      {
+<a name="l00929"></a>00929                 <span class="keywordflow">if</span>($this-&gt;<a class="code" href="group__internalAuthentication.html#ga2dbf501e0c59acffe19bca8fba2b35e3">hasAttribute</a>($key)) {
+<a name="l00930"></a>00930                         <span class="keywordflow">return</span> $this-&gt;_attributes[$key];
+<a name="l00931"></a>00931                 }
+<a name="l00932"></a>00932         }
+<a name="l00933"></a>00933 
+<a name="l00939"></a><a class="code" href="group__internalAuthentication.html#gafd45658b37e0bc420d60331430bca670">00939</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#gafd45658b37e0bc420d60331430bca670">renewAuthentication</a>(){
+<a name="l00940"></a>00940                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00941"></a>00941                 <span class="comment">// Either way, the user is authenticated by CAS</span>
+<a name="l00942"></a>00942                 <span class="keywordflow">if</span>( isset( $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;auth_checked&#39;</span>] ) )
+<a name="l00943"></a>00943                 unset($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;auth_checked&#39;</span>]);
+<a name="l00944"></a>00944                 <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalAuthentication.html#gafd9afb9e2bc2db5529129b5e2a07def0">isAuthenticated</a>() ) {
+<a name="l00945"></a>00945                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;user already authenticated; renew&#39;</span>);
+<a name="l00946"></a>00946                         $this-&gt;<a class="code" href="group__internalAuthentication.html#gac116a7ff5b1424645c45abafbaf5b35f">redirectToCas</a>(<span class="keyword">false</span>,<span class="keyword">true</span>);
+<a name="l00947"></a>00947                 } <span class="keywordflow">else</span> {
+<a name="l00948"></a>00948                         $this-&gt;<a class="code" href="group__internalAuthentication.html#gac116a7ff5b1424645c45abafbaf5b35f">redirectToCas</a>();
+<a name="l00949"></a>00949                 }
+<a name="l00950"></a>00950                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l00951"></a>00951         }
+<a name="l00952"></a>00952 
+<a name="l00958"></a><a class="code" href="group__internalAuthentication.html#gaf42af5d18c13a0df62b18c1cd54deaa0">00958</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#gaf42af5d18c13a0df62b18c1cd54deaa0">forceAuthentication</a>()
+<a name="l00959"></a>00959         {
+<a name="l00960"></a>00960                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00961"></a>00961 
+<a name="l00962"></a>00962                 <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalAuthentication.html#gafd9afb9e2bc2db5529129b5e2a07def0">isAuthenticated</a>() ) {
+<a name="l00963"></a>00963                         <span class="comment">// the user is authenticated, nothing to be done.</span>
+<a name="l00964"></a>00964                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;no need to authenticate&#39;</span>);
+<a name="l00965"></a>00965                         $res = TRUE;
+<a name="l00966"></a>00966                 } <span class="keywordflow">else</span> {
+<a name="l00967"></a>00967                         <span class="comment">// the user is not authenticated, redirect to the CAS server</span>
+<a name="l00968"></a>00968                         <span class="keywordflow">if</span> (isset($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;auth_checked&#39;</span>])) {
+<a name="l00969"></a>00969                                 unset($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;auth_checked&#39;</span>]);
+<a name="l00970"></a>00970                         }
+<a name="l00971"></a>00971                         $this-&gt;<a class="code" href="group__internalAuthentication.html#gac116a7ff5b1424645c45abafbaf5b35f">redirectToCas</a>(FALSE<span class="comment">/* no gateway */</span>);
+<a name="l00972"></a>00972                         <span class="comment">// never reached</span>
+<a name="l00973"></a>00973                         $res = FALSE;
+<a name="l00974"></a>00974                 }
+<a name="l00975"></a>00975                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>($res);
+<a name="l00976"></a>00976                 <span class="keywordflow">return</span> $res;
+<a name="l00977"></a>00977         }
+<a name="l00978"></a>00978 
+<a name="l00984"></a><a class="code" href="group__internalAuthentication.html#ga478decd824592dcf1abd27002559452c">00984</a>         <span class="keyword">private</span> <a class="code" href="group__internalAuthentication.html#ga478decd824592dcf1abd27002559452c">$_cache_times_for_auth_recheck</a> = 0;
+<a name="l00985"></a>00985 
+<a name="l00991"></a><a class="code" href="group__internalAuthentication.html#ga7adf25029965e95b87977c929d9c44b3">00991</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#ga7adf25029965e95b87977c929d9c44b3">setCacheTimesForAuthRecheck</a>($n)
+<a name="l00992"></a>00992         {
+<a name="l00993"></a>00993                 $this-&gt;_cache_times_for_auth_recheck = $n;
+<a name="l00994"></a>00994         }
+<a name="l00995"></a>00995 
+<a name="l01001"></a><a class="code" href="group__internalAuthentication.html#ga374ff1ed51254c75c6ed6bddc6765d2d">01001</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#ga374ff1ed51254c75c6ed6bddc6765d2d">checkAuthentication</a>()
+<a name="l01002"></a>01002         {
+<a name="l01003"></a>01003                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l01004"></a>01004 
+<a name="l01005"></a>01005                 <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalAuthentication.html#gafd9afb9e2bc2db5529129b5e2a07def0">isAuthenticated</a>() ) {
+<a name="l01006"></a>01006                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;user is authenticated&#39;</span>);
+<a name="l01007"></a>01007                         $res = TRUE;
+<a name="l01008"></a>01008                 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (isset($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;auth_checked&#39;</span>])) {
+<a name="l01009"></a>01009                         <span class="comment">// the previous request has redirected the client to the CAS server with gateway=true</span>
+<a name="l01010"></a>01010                         unset($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;auth_checked&#39;</span>]);
+<a name="l01011"></a>01011                         $res = FALSE;
+<a name="l01012"></a>01012                 } <span class="keywordflow">else</span> {
+<a name="l01013"></a>01013                         <span class="comment">// avoid a check against CAS on every request</span>
+<a name="l01014"></a>01014                         <span class="keywordflow">if</span> (! isset($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;unauth_count&#39;</span>]) )
+<a name="l01015"></a>01015                         $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;unauth_count&#39;</span>] = -2; <span class="comment">// uninitialized</span>
+<a name="l01016"></a>01016                                 
+<a name="l01017"></a>01017                         <span class="keywordflow">if</span> (($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;unauth_count&#39;</span>] != -2 &amp;&amp; $this-&gt;_cache_times_for_auth_recheck == -1)
+<a name="l01018"></a>01018                         || ($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;unauth_count&#39;</span>] &gt;= 0 &amp;&amp; $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;unauth_count&#39;</span>] &lt; $this-&gt;_cache_times_for_auth_recheck))
+<a name="l01019"></a>01019                         {
+<a name="l01020"></a>01020                                 $res = FALSE;
+<a name="l01021"></a>01021 
+<a name="l01022"></a>01022                                 <span class="keywordflow">if</span> ($this-&gt;_cache_times_for_auth_recheck != -1)
+<a name="l01023"></a>01023                                 {
+<a name="l01024"></a>01024                                         $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;unauth_count&#39;</span>]++;
+<a name="l01025"></a>01025                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;user is not authenticated (cached for &#39;</span>.$_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;unauth_count&#39;</span>].<span class="stringliteral">&#39; times of &#39;</span>.$this-&gt;_cache_times_for_auth_recheck.<span class="charliteral">&#39;)&#39;</span>);
+<a name="l01026"></a>01026                                 }
+<a name="l01027"></a>01027                                 <span class="keywordflow">else</span>
+<a name="l01028"></a>01028                                 {
+<a name="l01029"></a>01029                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;user is not authenticated (cached for until login pressed)&#39;</span>);
+<a name="l01030"></a>01030                                 }
+<a name="l01031"></a>01031                         }
+<a name="l01032"></a>01032                         <span class="keywordflow">else</span>
+<a name="l01033"></a>01033                         {
+<a name="l01034"></a>01034                                 $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;unauth_count&#39;</span>] = 0;
+<a name="l01035"></a>01035                                 $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;auth_checked&#39;</span>] = <span class="keyword">true</span>;
+<a name="l01036"></a>01036                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;user is not authenticated (cache reset)&#39;</span>);
+<a name="l01037"></a>01037                                 $this-&gt;<a class="code" href="group__internalAuthentication.html#gac116a7ff5b1424645c45abafbaf5b35f">redirectToCas</a>(TRUE<span class="comment">/* gateway */</span>);
+<a name="l01038"></a>01038                                 <span class="comment">// never reached</span>
+<a name="l01039"></a>01039                                 $res = FALSE;
+<a name="l01040"></a>01040                         }
+<a name="l01041"></a>01041                 }
+<a name="l01042"></a>01042                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>($res);
+<a name="l01043"></a>01043                 <span class="keywordflow">return</span> $res;
+<a name="l01044"></a>01044         }
+<a name="l01045"></a>01045 
+<a name="l01052"></a><a class="code" href="group__internalAuthentication.html#gafd9afb9e2bc2db5529129b5e2a07def0">01052</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#gafd9afb9e2bc2db5529129b5e2a07def0">isAuthenticated</a>()
+<a name="l01053"></a>01053         {
+<a name="l01054"></a>01054                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l01055"></a>01055                 $res = FALSE;
+<a name="l01056"></a>01056                 $validate_url = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l01057"></a>01057 
+<a name="l01058"></a>01058                 <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalAuthentication.html#gaaf695bdc9b1784d15437cd49a3be59a6">wasPreviouslyAuthenticated</a>() ) {
+<a name="l01059"></a>01059                         <span class="keywordflow">if</span>($this-&gt;<a class="code" href="group__internalBasic.html#ga4acc5e4ed6e778f942c36273dd9c8766">hasST</a>() || $this-&gt;<a class="code" href="group__internalProxied.html#gafd4a9d8c389825ed8b23331493fde437">hasPT</a>() || $this-&gt;<a class="code" href="group__internalSAML.html#ga436daacbfb73a41424dd24e116acc112">hasSA</a>()){
+<a name="l01060"></a>01060                                 <span class="comment">// User has a additional ticket but was already authenticated</span>
+<a name="l01061"></a>01061                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;ticket was present and will be discarded, use renewAuthenticate()&#39;</span>);
+<a name="l01062"></a>01062                                 header(<span class="stringliteral">&#39;Location: &#39;</span>.$this-&gt;<a class="code" href="group__internalMisc.html#gaa7564ffa02c80ebf8ec2d7238a22f9e0">getURL</a>());
+<a name="l01063"></a>01063                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>( <span class="stringliteral">&quot;Prepare redirect to remove ticket: &quot;</span>.$this-&gt;<a class="code" href="group__internalMisc.html#gaa7564ffa02c80ebf8ec2d7238a22f9e0">getURL</a>() );
+<a name="l01064"></a>01064                                 <a class="code" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">phpCAS::traceExit</a>();
+<a name="l01065"></a>01065                                 exit();
+<a name="l01066"></a>01066                         }<span class="keywordflow">else</span>{
+<a name="l01067"></a>01067                                 <span class="comment">// the user has already (previously during the session) been</span>
+<a name="l01068"></a>01068                                 <span class="comment">// authenticated, nothing to be done.</span>
+<a name="l01069"></a>01069                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;user was already authenticated, no need to look for tickets&#39;</span>);
+<a name="l01070"></a>01070                                 $res = TRUE;
+<a name="l01071"></a>01071                         }
+<a name="l01072"></a>01072                 }
+<a name="l01073"></a>01073                 <span class="keywordflow">else</span> {
+<a name="l01074"></a>01074                         <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalBasic.html#ga4acc5e4ed6e778f942c36273dd9c8766">hasST</a>() ) {
+<a name="l01075"></a>01075                                 <span class="comment">// if a Service Ticket was given, validate it</span>
+<a name="l01076"></a>01076                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;ST `&#39;</span>.$this-&gt;<a class="code" href="group__internalBasic.html#ga13a1fac978baa6cc99f6a443bdb7f402">getST</a>().<span class="charliteral">&#39;\&#39;</span> is present<span class="stringliteral">&#39;);</span>
+<a name="l01077"></a>01077 <span class="stringliteral">                                $this-&gt;validateST($validate_url,$text_response,$tree_response); // if it fails, it halts</span>
+<a name="l01078"></a>01078 <span class="stringliteral">                                phpCAS::trace(&#39;</span>ST `<span class="stringliteral">&#39;.$this-&gt;getST().&#39;</span>\<span class="stringliteral">&#39; was validated&#39;</span>);
+<a name="l01079"></a>01079                                 <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalProxy.html#ga0dfba2b184668dda8892c385c3f04096">isProxy</a>() ) {
+<a name="l01080"></a>01080                                         $this-&gt;<a class="code" href="group__internalPGTStorage.html#ga8c7c97937692e79da12a8be3df634cbe">validatePGT</a>($validate_url,$text_response,$tree_response); <span class="comment">// idem</span>
+<a name="l01081"></a>01081                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;PGT `&#39;</span>.$this-&gt;<a class="code" href="group__internalProxy.html#ga34d29abe0254d1b5752e4f3557865157">getPGT</a>().<span class="charliteral">&#39;\&#39;</span> was validated<span class="stringliteral">&#39;);</span>
+<a name="l01082"></a>01082 <span class="stringliteral">                                        $_SESSION[&#39;</span><a class="code" href="classphpCAS.html">phpCAS</a><span class="stringliteral">&#39;][&#39;</span>pgt<span class="stringliteral">&#39;] = $this-&gt;getPGT();</span>
+<a name="l01083"></a>01083 <span class="stringliteral">                                }</span>
+<a name="l01084"></a>01084 <span class="stringliteral">                                $_SESSION[&#39;</span><a class="code" href="classphpCAS.html">phpCAS</a><span class="stringliteral">&#39;][&#39;</span>user<span class="stringliteral">&#39;] = $this-&gt;getUser();</span>
+<a name="l01085"></a>01085 <span class="stringliteral">                                if($this-&gt;hasAttributes()){</span>
+<a name="l01086"></a>01086 <span class="stringliteral">                                        $_SESSION[&#39;</span><a class="code" href="classphpCAS.html">phpCAS</a><span class="stringliteral">&#39;][&#39;</span>attributes<span class="stringliteral">&#39;] = $this-&gt;getAttributes();</span>
+<a name="l01087"></a>01087 <span class="stringliteral">                                }</span>
+<a name="l01088"></a>01088 <span class="stringliteral">                                $res = TRUE;</span>
+<a name="l01089"></a>01089 <span class="stringliteral">                                $logoutTicket = $this-&gt;getST();</span>
+<a name="l01090"></a>01090 <span class="stringliteral">                        }</span>
+<a name="l01091"></a>01091 <span class="stringliteral">                        elseif ( $this-&gt;hasPT() ) {</span>
+<a name="l01092"></a>01092 <span class="stringliteral">                                // if a Proxy Ticket was given, validate it</span>
+<a name="l01093"></a>01093 <span class="stringliteral">                                phpCAS::trace(&#39;</span>PT `<span class="stringliteral">&#39;.$this-&gt;getPT().&#39;</span>\<span class="stringliteral">&#39; is present&#39;</span>);
+<a name="l01094"></a>01094                                 $this-&gt;<a class="code" href="group__internalProxied.html#ga5aa61d302edfacbaaf176a94bf228807">validatePT</a>($validate_url,$text_response,$tree_response); <span class="comment">// note: if it fails, it halts</span>
+<a name="l01095"></a>01095                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;PT `&#39;</span>.$this-&gt;<a class="code" href="group__internalProxied.html#ga9f6fe06d8349d51a53a1397b6fb266f0">getPT</a>().<span class="charliteral">&#39;\&#39;</span> was validated<span class="stringliteral">&#39;);</span>
+<a name="l01096"></a>01096 <span class="stringliteral">                                if ( $this-&gt;isProxy() ) {</span>
+<a name="l01097"></a>01097 <span class="stringliteral">                                        $this-&gt;validatePGT($validate_url,$text_response,$tree_response); // idem</span>
+<a name="l01098"></a>01098 <span class="stringliteral">                                        phpCAS::trace(&#39;</span>PGT `<span class="stringliteral">&#39;.$this-&gt;getPGT().&#39;</span>\<span class="stringliteral">&#39; was validated&#39;</span>);
+<a name="l01099"></a>01099                                         $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;pgt&#39;</span>] = $this-&gt;<a class="code" href="group__internalProxy.html#ga34d29abe0254d1b5752e4f3557865157">getPGT</a>();
+<a name="l01100"></a>01100                                 }
+<a name="l01101"></a>01101                                 $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;user&#39;</span>] = $this-&gt;<a class="code" href="group__internalAuthentication.html#ga18a943d6984497f7fcde795fb4e57372">getUser</a>();
+<a name="l01102"></a>01102                                 <span class="keywordflow">if</span>($this-&gt;<a class="code" href="group__internalAuthentication.html#ga5201e6b88a4190f8050ea0436af908b7">hasAttributes</a>()){
+<a name="l01103"></a>01103                                         $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;attributes&#39;</span>] = $this-&gt;<a class="code" href="group__internalAuthentication.html#ga2c0120dc035c092f00b74a512fc78d4f">getAttributes</a>();
+<a name="l01104"></a>01104                                 }
+<a name="l01105"></a>01105                                 $res = TRUE;
+<a name="l01106"></a>01106                                 $logoutTicket = $this-&gt;<a class="code" href="group__internalProxied.html#ga9f6fe06d8349d51a53a1397b6fb266f0">getPT</a>();
+<a name="l01107"></a>01107                         }
+<a name="l01108"></a>01108                         elseif ( $this-&gt;<a class="code" href="group__internalSAML.html#ga436daacbfb73a41424dd24e116acc112">hasSA</a>() ) {
+<a name="l01109"></a>01109                                 <span class="comment">// if we have a SAML ticket, validate it.</span>
+<a name="l01110"></a>01110                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;SA `&#39;</span>.$this-&gt;<a class="code" href="group__internalSAML.html#gabbfc9663e999471633c4b5cc1a1f2751">getSA</a>().<span class="charliteral">&#39;\&#39;</span> is present<span class="stringliteral">&#39;);</span>
+<a name="l01111"></a>01111 <span class="stringliteral">                                $this-&gt;validateSA($validate_url,$text_response,$tree_response); // if it fails, it halts</span>
+<a name="l01112"></a>01112 <span class="stringliteral">                                phpCAS::trace(&#39;</span>SA `<span class="stringliteral">&#39;.$this-&gt;getSA().&#39;</span>\<span class="stringliteral">&#39; was validated&#39;</span>);
+<a name="l01113"></a>01113                                 $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;user&#39;</span>] = $this-&gt;<a class="code" href="group__internalAuthentication.html#ga18a943d6984497f7fcde795fb4e57372">getUser</a>();
+<a name="l01114"></a>01114                                 $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;attributes&#39;</span>] = $this-&gt;<a class="code" href="group__internalAuthentication.html#ga2c0120dc035c092f00b74a512fc78d4f">getAttributes</a>();
+<a name="l01115"></a>01115                                 $res = TRUE;
+<a name="l01116"></a>01116                                 $logoutTicket = $this-&gt;<a class="code" href="group__internalSAML.html#gabbfc9663e999471633c4b5cc1a1f2751">getSA</a>();
+<a name="l01117"></a>01117                         }
+<a name="l01118"></a>01118                         <span class="keywordflow">else</span> {
+<a name="l01119"></a>01119                                 <span class="comment">// no ticket given, not authenticated</span>
+<a name="l01120"></a>01120                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;no ticket found&#39;</span>);
+<a name="l01121"></a>01121                         }
+<a name="l01122"></a>01122                         <span class="keywordflow">if</span> ($res) {
+<a name="l01123"></a>01123                                 <span class="comment">// Mark the auth-check as complete to allow post-authentication</span>
+<a name="l01124"></a>01124                                 <span class="comment">// callbacks to make use of phpCAS::getUser() and similar methods</span>
+<a name="l01125"></a>01125                                 $dbg = debug_backtrace();
+<a name="l01126"></a>01126                                 global $PHPCAS_AUTH_CHECK_CALL;
+<a name="l01127"></a>01127                                 $PHPCAS_AUTH_CHECK_CALL = array (
+<a name="l01128"></a>01128                                         <span class="stringliteral">&#39;done&#39;</span> =&gt; TRUE,
+<a name="l01129"></a>01129                                         <span class="stringliteral">&#39;file&#39;</span> =&gt; $dbg[0][<span class="stringliteral">&#39;file&#39;</span>],
+<a name="l01130"></a>01130                                         <span class="stringliteral">&#39;line&#39;</span> =&gt; $dbg[0][<span class="stringliteral">&#39;line&#39;</span>],
+<a name="l01131"></a>01131                                         <span class="stringliteral">&#39;method&#39;</span> =&gt; __CLASS__ . <span class="stringliteral">&#39;::&#39;</span> . __FUNCTION__,
+<a name="l01132"></a>01132                                         <span class="stringliteral">&#39;result&#39;</span> =&gt; $res
+<a name="l01133"></a>01133                                 );
+<a name="l01134"></a>01134                                 
+<a name="l01135"></a>01135                                 <span class="comment">// call the post-authenticate callback if registered.</span>
+<a name="l01136"></a>01136                                 <span class="keywordflow">if</span> ($this-&gt;_postAuthenticateCallbackFunction) {
+<a name="l01137"></a>01137                                         $args = $this-&gt;_postAuthenticateCallbackArgs;
+<a name="l01138"></a>01138                                         array_unshift($args, $logoutTicket);
+<a name="l01139"></a>01139                                         call_user_func_array($this-&gt;_postAuthenticateCallbackFunction, $args);
+<a name="l01140"></a>01140                                 }
+<a name="l01141"></a>01141                                 
+<a name="l01142"></a>01142                                 <span class="comment">// if called with a ticket parameter, we need to redirect to the app without the ticket so that CAS-ification is transparent to the browser (for later POSTS)</span>
+<a name="l01143"></a>01143                                 <span class="comment">// most of the checks and errors should have been made now, so we&#39;re safe for redirect without masking error messages.</span>
+<a name="l01144"></a>01144                                 <span class="comment">// remove the ticket as a security precaution to prevent a ticket in the HTTP_REFERRER</span>
+<a name="l01145"></a>01145                                 <span class="keywordflow">if</span> ($this-&gt;_clearTicketsFromUrl) {
+<a name="l01146"></a>01146                                         header(<span class="stringliteral">&#39;Location: &#39;</span>.$this-&gt;<a class="code" href="group__internalMisc.html#gaa7564ffa02c80ebf8ec2d7238a22f9e0">getURL</a>());
+<a name="l01147"></a>01147                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>( <span class="stringliteral">&quot;Prepare redirect to : &quot;</span>.$this-&gt;<a class="code" href="group__internalMisc.html#gaa7564ffa02c80ebf8ec2d7238a22f9e0">getURL</a>() );
+<a name="l01148"></a>01148                                         <a class="code" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">phpCAS::traceExit</a>();
+<a name="l01149"></a>01149                                         exit();
+<a name="l01150"></a>01150                                 }
+<a name="l01151"></a>01151                         }
+<a name="l01152"></a>01152                 }
+<a name="l01153"></a>01153 
+<a name="l01154"></a>01154                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>($res);
+<a name="l01155"></a>01155                 <span class="keywordflow">return</span> $res;
+<a name="l01156"></a>01156         }
+<a name="l01157"></a>01157 
+<a name="l01163"></a><a class="code" href="group__internalAuthentication.html#ga3c432f5cdfdef6a37f90c5b548610125">01163</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#ga3c432f5cdfdef6a37f90c5b548610125">isSessionAuthenticated</a> ()
+<a name="l01164"></a>01164         {
+<a name="l01165"></a>01165                 <span class="keywordflow">return</span> !empty($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;user&#39;</span>]);
+<a name="l01166"></a>01166         }
+<a name="l01167"></a>01167 
+<a name="l01176"></a><a class="code" href="group__internalAuthentication.html#gaaf695bdc9b1784d15437cd49a3be59a6">01176</a>         <span class="keyword">private</span> function <a class="code" href="group__internalAuthentication.html#gaaf695bdc9b1784d15437cd49a3be59a6">wasPreviouslyAuthenticated</a>()
+<a name="l01177"></a>01177         {
+<a name="l01178"></a>01178                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l01179"></a>01179 
+<a name="l01180"></a>01180                 <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalCallback.html#ga445e92539e88bfaf0670da31f8ba68d8">isCallbackMode</a>() ) {
+<a name="l01181"></a>01181                         $this-&gt;<a class="code" href="group__internalCallback.html#ga7a7208da84825f761a76246080d12ec0">callback</a>();
+<a name="l01182"></a>01182                 }
+<a name="l01183"></a>01183 
+<a name="l01184"></a>01184                 <a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a> = FALSE;
+<a name="l01185"></a>01185 
+<a name="l01186"></a>01186                 <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalProxy.html#ga0dfba2b184668dda8892c385c3f04096">isProxy</a>() ) {
+<a name="l01187"></a>01187                         <span class="comment">// CAS proxy: username and PGT must be present</span>
+<a name="l01188"></a>01188                         <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalAuthentication.html#ga3c432f5cdfdef6a37f90c5b548610125">isSessionAuthenticated</a>() &amp;&amp; !empty($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;pgt&#39;</span>]) ) {
+<a name="l01189"></a>01189                                 <span class="comment">// authentication already done</span>
+<a name="l01190"></a>01190                                 $this-&gt;<a class="code" href="group__internalAuthentication.html#gaab7eded3796f3a506c71221413dc95a1">setUser</a>($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;user&#39;</span>]);
+<a name="l01191"></a>01191                                 <span class="keywordflow">if</span>(isset($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;attributes&#39;</span>])){
+<a name="l01192"></a>01192                                         $this-&gt;<a class="code" href="group__internalAuthentication.html#ga4f0c191193884b48a66a63c871dd660e">setAttributes</a>($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;attributes&#39;</span>]);
+<a name="l01193"></a>01193                                 }
+<a name="l01194"></a>01194                                 $this-&gt;<a class="code" href="group__internalProxy.html#ga7750adb0745c0b005ff8b305e7a060e0">setPGT</a>($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;pgt&#39;</span>]);
+<a name="l01195"></a>01195                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;user = `&#39;</span>.$_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;user&#39;</span>].<span class="charliteral">&#39;\&#39;</span>, PGT = `<span class="stringliteral">&#39;.$_SESSION[&#39;</span><a class="code" href="classphpCAS.html">phpCAS</a><span class="stringliteral">&#39;][&#39;</span>pgt<span class="stringliteral">&#39;].&#39;</span>\<span class="stringliteral">&#39;&#39;</span>);
+<a name="l01196"></a>01196                                 
+<a name="l01197"></a>01197                                 <span class="comment">// Include the list of proxies</span>
+<a name="l01198"></a>01198                                 <span class="keywordflow">if</span> (isset($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;proxies&#39;</span>])) {
+<a name="l01199"></a>01199                                         $this-&gt;<a class="code" href="group__internalProxied.html#ga5afeadecc91ada8d11abc1ec74bdefd5">setProxies</a>($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;proxies&#39;</span>]);
+<a name="l01200"></a>01200                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;proxies = &quot;&#39;</span>.implode(<span class="stringliteral">&#39;&quot;, &quot;&#39;</span>, $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;proxies&#39;</span>]).<span class="charliteral">&#39;&quot;&#39;</span>); 
+<a name="l01201"></a>01201                                 }
+<a name="l01202"></a>01202                                 
+<a name="l01203"></a>01203                                 <a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a> = TRUE;
+<a name="l01204"></a>01204                         } elseif ( $this-&gt;<a class="code" href="group__internalAuthentication.html#ga3c432f5cdfdef6a37f90c5b548610125">isSessionAuthenticated</a>() &amp;&amp; empty($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;pgt&#39;</span>]) ) {
+<a name="l01205"></a>01205                                 <span class="comment">// these two variables should be empty or not empty at the same time</span>
+<a name="l01206"></a>01206                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;username found (`&#39;</span>.$_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;user&#39;</span>].<span class="charliteral">&#39;\&#39;</span>) but PGT is empty<span class="stringliteral">&#39;);</span>
+<a name="l01207"></a>01207 <span class="stringliteral">                                // unset all tickets to enforce authentication</span>
+<a name="l01208"></a>01208 <span class="stringliteral">                                unset($_SESSION[&#39;</span><a class="code" href="classphpCAS.html">phpCAS</a><span class="stringliteral">&#39;]);</span>
+<a name="l01209"></a>01209 <span class="stringliteral">                                $this-&gt;setST(&#39;</span><span class="stringliteral">&#39;);</span>
+<a name="l01210"></a>01210 <span class="stringliteral">                                $this-&gt;setPT(&#39;</span><span class="stringliteral">&#39;);</span>
+<a name="l01211"></a>01211 <span class="stringliteral">                        } elseif ( !$this-&gt;isSessionAuthenticated() &amp;&amp; !empty($_SESSION[&#39;</span><a class="code" href="classphpCAS.html">phpCAS</a><span class="stringliteral">&#39;][&#39;</span>pgt<span class="stringliteral">&#39;]) ) {</span>
+<a name="l01212"></a>01212 <span class="stringliteral">                                // these two variables should be empty or not empty at the same time</span>
+<a name="l01213"></a>01213 <span class="stringliteral">                                phpCAS::trace(&#39;</span>PGT found (`<span class="stringliteral">&#39;.$_SESSION[&#39;</span><a class="code" href="classphpCAS.html">phpCAS</a><span class="stringliteral">&#39;][&#39;</span>pgt<span class="stringliteral">&#39;].&#39;</span>\<span class="stringliteral">&#39;) but username is empty&#39;</span>);
+<a name="l01214"></a>01214                                 <span class="comment">// unset all tickets to enforce authentication</span>
+<a name="l01215"></a>01215                                 unset($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>]);
+<a name="l01216"></a>01216                                 $this-&gt;<a class="code" href="group__internalBasic.html#ga7baa4852ccb4e30280e825d95b496952">setST</a>(<span class="stringliteral">&#39;&#39;</span>);
+<a name="l01217"></a>01217                                 $this-&gt;<a class="code" href="group__internalProxied.html#gaad9f4d2b7243796555c01edecc85006e">setPT</a>(<span class="stringliteral">&#39;&#39;</span>);
+<a name="l01218"></a>01218                         } <span class="keywordflow">else</span> {
+<a name="l01219"></a>01219                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;neither user not PGT found&#39;</span>);
+<a name="l01220"></a>01220                         }
+<a name="l01221"></a>01221                 } <span class="keywordflow">else</span> {
+<a name="l01222"></a>01222                         <span class="comment">// `simple&#39; CAS client (not a proxy): username must be present</span>
+<a name="l01223"></a>01223                         <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalAuthentication.html#ga3c432f5cdfdef6a37f90c5b548610125">isSessionAuthenticated</a>() ) {
+<a name="l01224"></a>01224                                 <span class="comment">// authentication already done</span>
+<a name="l01225"></a>01225                                 $this-&gt;<a class="code" href="group__internalAuthentication.html#gaab7eded3796f3a506c71221413dc95a1">setUser</a>($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;user&#39;</span>]);
+<a name="l01226"></a>01226                                 <span class="keywordflow">if</span>(isset($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;attributes&#39;</span>])){
+<a name="l01227"></a>01227                                         $this-&gt;<a class="code" href="group__internalAuthentication.html#ga4f0c191193884b48a66a63c871dd660e">setAttributes</a>($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;attributes&#39;</span>]);
+<a name="l01228"></a>01228                                 }
+<a name="l01229"></a>01229                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;user = `&#39;</span>.$_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;user&#39;</span>].<span class="charliteral">&#39;\&#39;&#39;</span>);
+<a name="l01230"></a>01230                                 
+<a name="l01231"></a>01231                                 <span class="comment">// Include the list of proxies</span>
+<a name="l01232"></a>01232                                 <span class="keywordflow">if</span> (isset($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;proxies&#39;</span>])) {
+<a name="l01233"></a>01233                                         $this-&gt;<a class="code" href="group__internalProxied.html#ga5afeadecc91ada8d11abc1ec74bdefd5">setProxies</a>($_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;proxies&#39;</span>]);
+<a name="l01234"></a>01234                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;proxies = &quot;&#39;</span>.implode(<span class="stringliteral">&#39;&quot;, &quot;&#39;</span>, $_SESSION[<span class="stringliteral">&#39;phpCAS&#39;</span>][<span class="stringliteral">&#39;proxies&#39;</span>]).<span class="charliteral">&#39;&quot;&#39;</span>); 
+<a name="l01235"></a>01235                                 }
+<a name="l01236"></a>01236                                 
+<a name="l01237"></a>01237                                 <a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a> = TRUE;
+<a name="l01238"></a>01238                         } <span class="keywordflow">else</span> {
+<a name="l01239"></a>01239                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;no user found&#39;</span>);
+<a name="l01240"></a>01240                         }
+<a name="l01241"></a>01241                 }
+<a name="l01242"></a>01242 
+<a name="l01243"></a>01243                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>(<a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a>);
+<a name="l01244"></a>01244                 <span class="keywordflow">return</span> <a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a>;
+<a name="l01245"></a>01245         }
+<a name="l01246"></a>01246 
+<a name="l01253"></a><a class="code" href="group__internalAuthentication.html#gac116a7ff5b1424645c45abafbaf5b35f">01253</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#gac116a7ff5b1424645c45abafbaf5b35f">redirectToCas</a>($gateway=<span class="keyword">false</span>,$renew=<span class="keyword">false</span>){
+<a name="l01254"></a>01254                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l01255"></a>01255                 <a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a> = $this-&gt;<a class="code" href="group__internalConfig.html#ga75782f9ef91325ce1f235eec5367df5b">getServerLoginURL</a>($gateway,$renew);
+<a name="l01256"></a>01256                 header(<span class="stringliteral">&#39;Location: &#39;</span>.<a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a>);
+<a name="l01257"></a>01257                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>( <span class="stringliteral">&quot;Redirect to : &quot;</span>.<a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a> );
+<a name="l01258"></a>01258 
+<a name="l01259"></a>01259                 $this-&gt;<a class="code" href="group__internalOutput.html#ga37ddf683af4f98f07f64ce4bf8b6667a">printHTMLHeader</a>($this-&gt;<a class="code" href="group__internalLang.html#ga18db72fc208dacf384d74dfc5c3713ad">getString</a>(<a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a>));
+<a name="l01260"></a>01260 
+<a name="l01261"></a>01261                 printf(<span class="stringliteral">&#39;&lt;p&gt;&#39;</span>.$this-&gt;<a class="code" href="group__internalLang.html#ga18db72fc208dacf384d74dfc5c3713ad">getString</a>(<a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a>).<span class="stringliteral">&#39;&lt;/p&gt;&#39;</span>,<a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a>);
+<a name="l01262"></a>01262                 $this-&gt;<a class="code" href="group__internalOutput.html#ga0ff1bdc24180f4f60ffa07dfc8b81d61">printHTMLFooter</a>();
+<a name="l01263"></a>01263 
+<a name="l01264"></a>01264                 <a class="code" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">phpCAS::traceExit</a>();
+<a name="l01265"></a>01265                 exit();
+<a name="l01266"></a>01266         }
+<a name="l01267"></a>01267 
+<a name="l01268"></a>01268 
+<a name="l01273"></a><a class="code" href="group__internalAuthentication.html#gac725f9fbb5de957bdd75a5334379b45d">01273</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#gac725f9fbb5de957bdd75a5334379b45d">logout</a>($params) {
+<a name="l01274"></a>01274                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l01275"></a>01275                 <a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a> = $this-&gt;<a class="code" href="group__internalConfig.html#ga46c09b45a560eb7dec420e6807fcf16c">getServerLogoutURL</a>();
+<a name="l01276"></a>01276                 $paramSeparator = <span class="charliteral">&#39;?&#39;</span>;
+<a name="l01277"></a>01277                 <span class="keywordflow">if</span> (isset($params[<span class="stringliteral">&#39;url&#39;</span>])) {
+<a name="l01278"></a>01278                         <a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a> = <a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a> . $paramSeparator . <span class="stringliteral">&quot;url=&quot;</span> . urlencode($params[<span class="stringliteral">&#39;url&#39;</span>]);
+<a name="l01279"></a>01279                         $paramSeparator = <span class="charliteral">&#39;&amp;&#39;</span>;
+<a name="l01280"></a>01280                 }
+<a name="l01281"></a>01281                 <span class="keywordflow">if</span> (isset($params[<span class="stringliteral">&#39;service&#39;</span>])) {
+<a name="l01282"></a>01282                         <a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a> = <a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a> . $paramSeparator . <span class="stringliteral">&quot;service=&quot;</span> . urlencode($params[<span class="stringliteral">&#39;service&#39;</span>]);
+<a name="l01283"></a>01283                 }
+<a name="l01284"></a>01284                 header(<span class="stringliteral">&#39;Location: &#39;</span>.<a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a>);
+<a name="l01285"></a>01285                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>( <span class="stringliteral">&quot;Prepare redirect to : &quot;</span>.<a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a> );
+<a name="l01286"></a>01286 
+<a name="l01287"></a>01287                 session_unset();
+<a name="l01288"></a>01288                 session_destroy();
+<a name="l01289"></a>01289 
+<a name="l01290"></a>01290                 $this-&gt;<a class="code" href="group__internalOutput.html#ga37ddf683af4f98f07f64ce4bf8b6667a">printHTMLHeader</a>($this-&gt;<a class="code" href="group__internalLang.html#ga18db72fc208dacf384d74dfc5c3713ad">getString</a>(<a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a>));
+<a name="l01291"></a>01291                 printf(<span class="stringliteral">&#39;&lt;p&gt;&#39;</span>.$this-&gt;<a class="code" href="group__internalLang.html#ga18db72fc208dacf384d74dfc5c3713ad">getString</a>(<a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a>).<span class="stringliteral">&#39;&lt;/p&gt;&#39;</span>,<a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a>);
+<a name="l01292"></a>01292                 $this-&gt;<a class="code" href="group__internalOutput.html#ga0ff1bdc24180f4f60ffa07dfc8b81d61">printHTMLFooter</a>();
+<a name="l01293"></a>01293 
+<a name="l01294"></a>01294                 <a class="code" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">phpCAS::traceExit</a>();
+<a name="l01295"></a>01295                 exit();
+<a name="l01296"></a>01296         }
+<a name="l01297"></a>01297 
+<a name="l01301"></a><a class="code" href="group__internalAuthentication.html#ga399b37acdc834f245baf9ae78669397e">01301</a>         <span class="keyword">private</span> function <a class="code" href="group__internalAuthentication.html#ga399b37acdc834f245baf9ae78669397e">isLogoutRequest</a>() {
+<a name="l01302"></a>01302                 <span class="keywordflow">return</span> !empty($_POST[<span class="stringliteral">&#39;logoutRequest&#39;</span>]);
+<a name="l01303"></a>01303         }
+<a name="l01304"></a>01304 
+<a name="l01312"></a><a class="code" href="group__internalAuthentication.html#gae2f5c90e92e32f31dafeee19d338f1be">01312</a>         <span class="keyword">public</span> function <a class="code" href="group__internalAuthentication.html#gae2f5c90e92e32f31dafeee19d338f1be">handleLogoutRequests</a>($check_client=<span class="keyword">true</span>, $allowed_clients=<span class="keyword">false</span>) {
+<a name="l01313"></a>01313                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l01314"></a>01314                 <span class="keywordflow">if</span> (!$this-&gt;<a class="code" href="group__internalAuthentication.html#ga399b37acdc834f245baf9ae78669397e">isLogoutRequest</a>()) {
+<a name="l01315"></a>01315                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;Not a logout request&quot;</span>);
+<a name="l01316"></a>01316                         <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l01317"></a>01317                         <span class="keywordflow">return</span>;
+<a name="l01318"></a>01318                 }
+<a name="l01319"></a>01319                 <span class="keywordflow">if</span>(!$this-&gt;_start_session &amp;&amp; is_null($this-&gt;_signoutCallbackFunction)){
+<a name="l01320"></a>01320                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;phpCAS can&#39;t handle logout requests if it does not manage the session.&quot;</span>);
+<a name="l01321"></a>01321                 }
+<a name="l01322"></a>01322                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;Logout requested&quot;</span>);
+<a name="l01323"></a>01323                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;SAML REQUEST: &quot;</span>.$_POST[<span class="stringliteral">&#39;logoutRequest&#39;</span>]);
+<a name="l01324"></a>01324                 <span class="keywordflow">if</span> ($check_client) {
+<a name="l01325"></a>01325                         <span class="keywordflow">if</span> (!$allowed_clients) {
+<a name="l01326"></a>01326                                 $allowed_clients = array( $this-&gt;<a class="code" href="group__internalConfig.html#ga8ee3ab0acca92bd0e489e4f3708c177a">getServerHostname</a>() );
+<a name="l01327"></a>01327                         }
+<a name="l01328"></a>01328                         $client_ip = $_SERVER[<span class="stringliteral">&#39;REMOTE_ADDR&#39;</span>];
+<a name="l01329"></a>01329                         $client = gethostbyaddr($client_ip);
+<a name="l01330"></a>01330                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;Client: &quot;</span>.$client.<span class="stringliteral">&quot;/&quot;</span>.$client_ip);
+<a name="l01331"></a>01331                         $allowed = <span class="keyword">false</span>;
+<a name="l01332"></a>01332                         <span class="keywordflow">foreach</span> ($allowed_clients as $allowed_client) {
+<a name="l01333"></a>01333                                 <span class="keywordflow">if</span> (($client == $allowed_client) or ($client_ip == $allowed_client)) {
+<a name="l01334"></a>01334                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;Allowed client &#39;&quot;</span>.$allowed_client.<span class="stringliteral">&quot;&#39; matches, logout request is allowed&quot;</span>);
+<a name="l01335"></a>01335                                         $allowed = <span class="keyword">true</span>;
+<a name="l01336"></a>01336                                         <span class="keywordflow">break</span>;
+<a name="l01337"></a>01337                                 } <span class="keywordflow">else</span> {
+<a name="l01338"></a>01338                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;Allowed client &#39;&quot;</span>.$allowed_client.<span class="stringliteral">&quot;&#39; does not match&quot;</span>);
+<a name="l01339"></a>01339                                 }
+<a name="l01340"></a>01340                         }
+<a name="l01341"></a>01341                         <span class="keywordflow">if</span> (!$allowed) {
+<a name="l01342"></a>01342                                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&quot;Unauthorized logout request from client &#39;&quot;</span>.$client.<span class="stringliteral">&quot;&#39;&quot;</span>);
+<a name="l01343"></a>01343                                 printf(<span class="stringliteral">&quot;Unauthorized!&quot;</span>);
+<a name="l01344"></a>01344                                 <a class="code" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">phpCAS::traceExit</a>();
+<a name="l01345"></a>01345                                 exit();
+<a name="l01346"></a>01346                         }
+<a name="l01347"></a>01347                 } <span class="keywordflow">else</span> {
+<a name="l01348"></a>01348                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;No access control set&quot;</span>);
+<a name="l01349"></a>01349                 }
+<a name="l01350"></a>01350                 <span class="comment">// Extract the ticket from the SAML Request</span>
+<a name="l01351"></a>01351                 preg_match(<span class="stringliteral">&quot;|&lt;samlp:SessionIndex&gt;(.*)&lt;/samlp:SessionIndex&gt;|&quot;</span>, $_POST[<span class="stringliteral">&#39;logoutRequest&#39;</span>], $tick, PREG_OFFSET_CAPTURE, 3);
+<a name="l01352"></a>01352                 $wrappedSamlSessionIndex = preg_replace(<span class="stringliteral">&#39;|&lt;samlp:SessionIndex&gt;|&#39;</span>,<span class="stringliteral">&#39;&#39;</span>,$tick[0][0]);
+<a name="l01353"></a>01353                 $ticket2logout = preg_replace(<span class="stringliteral">&#39;|&lt;/samlp:SessionIndex&gt;|&#39;</span>,<span class="stringliteral">&#39;&#39;</span>,$wrappedSamlSessionIndex);
+<a name="l01354"></a>01354                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;Ticket to logout: &quot;</span>.$ticket2logout);
+<a name="l01355"></a>01355                 
+<a name="l01356"></a>01356                 <span class="comment">// call the post-authenticate callback if registered.</span>
+<a name="l01357"></a>01357                 <span class="keywordflow">if</span> ($this-&gt;_signoutCallbackFunction) {
+<a name="l01358"></a>01358                         $args = $this-&gt;_signoutCallbackArgs;
+<a name="l01359"></a>01359                         array_unshift($args, $ticket2logout);
+<a name="l01360"></a>01360                         call_user_func_array($this-&gt;_signoutCallbackFunction, $args);
+<a name="l01361"></a>01361                 }
+<a name="l01362"></a>01362                 
+<a name="l01363"></a>01363                 <span class="comment">// If phpCAS is managing the session, destroy it.</span>
+<a name="l01364"></a>01364                 <span class="keywordflow">if</span> ($this-&gt;_start_session) {
+<a name="l01365"></a>01365                         $session_id = preg_replace(<span class="stringliteral">&#39;/[^\w]/&#39;</span>,<span class="stringliteral">&#39;&#39;</span>,$ticket2logout);
+<a name="l01366"></a>01366                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;Session id: &quot;</span>.$session_id);
+<a name="l01367"></a>01367         
+<a name="l01368"></a>01368                         <span class="comment">// destroy a possible application session created before phpcas</span>
+<a name="l01369"></a>01369                         <span class="keywordflow">if</span>(session_id() !== <span class="stringliteral">&quot;&quot;</span>){
+<a name="l01370"></a>01370                                 session_unset();
+<a name="l01371"></a>01371                                 session_destroy();
+<a name="l01372"></a>01372                         }
+<a name="l01373"></a>01373                         <span class="comment">// fix session ID</span>
+<a name="l01374"></a>01374                         session_id($session_id);
+<a name="l01375"></a>01375                         $_COOKIE[session_name()]=$session_id;
+<a name="l01376"></a>01376                         $_GET[session_name()]=$session_id;
+<a name="l01377"></a>01377         
+<a name="l01378"></a>01378                         <span class="comment">// Overwrite session</span>
+<a name="l01379"></a>01379                         session_start();
+<a name="l01380"></a>01380                         session_unset();
+<a name="l01381"></a>01381                         session_destroy();
+<a name="l01382"></a>01382                 }
+<a name="l01383"></a>01383                 
+<a name="l01384"></a>01384                 printf(<span class="stringliteral">&quot;Disconnected!&quot;</span>);
+<a name="l01385"></a>01385                 <a class="code" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">phpCAS::traceExit</a>();
+<a name="l01386"></a>01386                 exit();
+<a name="l01387"></a>01387         }
+<a name="l01388"></a>01388 
+<a name="l01391"></a>01391         <span class="comment">// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span>
+<a name="l01392"></a>01392         <span class="comment">// XX                                                                    XX</span>
+<a name="l01393"></a>01393         <span class="comment">// XX                  BASIC CLIENT FEATURES (CAS 1.0)                   XX</span>
+<a name="l01394"></a>01394         <span class="comment">// XX                                                                    XX</span>
+<a name="l01395"></a>01395         <span class="comment">// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span>
+<a name="l01396"></a>01396 
+<a name="l01397"></a>01397         <span class="comment">// ########################################################################</span>
+<a name="l01398"></a>01398         <span class="comment">//  ST</span>
+<a name="l01399"></a>01399         <span class="comment">// ########################################################################</span>
+<a name="l01412"></a><a class="code" href="group__internalBasic.html#ga0dbca451ba0b1bddbf02f5663ca83d1f">01412</a> <span class="comment"></span>        <span class="keyword">private</span> <a class="code" href="group__internalBasic.html#ga0dbca451ba0b1bddbf02f5663ca83d1f">$_st</a> = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l01413"></a>01413 
+<a name="l01418"></a><a class="code" href="group__internalBasic.html#ga13a1fac978baa6cc99f6a443bdb7f402">01418</a>         <span class="keyword">public</span>  function <a class="code" href="group__internalBasic.html#ga13a1fac978baa6cc99f6a443bdb7f402">getST</a>()
+<a name="l01419"></a>01419         { <span class="keywordflow">return</span> $this-&gt;_st; }
+<a name="l01420"></a>01420 
+<a name="l01425"></a><a class="code" href="group__internalBasic.html#ga7baa4852ccb4e30280e825d95b496952">01425</a>         <span class="keyword">public</span> function <a class="code" href="group__internalBasic.html#ga7baa4852ccb4e30280e825d95b496952">setST</a>($st)
+<a name="l01426"></a>01426         { $this-&gt;_st = $st; }
+<a name="l01427"></a>01427 
+<a name="l01432"></a><a class="code" href="group__internalBasic.html#ga4acc5e4ed6e778f942c36273dd9c8766">01432</a>         <span class="keyword">public</span> function <a class="code" href="group__internalBasic.html#ga4acc5e4ed6e778f942c36273dd9c8766">hasST</a>()
+<a name="l01433"></a>01433         { <span class="keywordflow">return</span> !empty($this-&gt;_st); }
+<a name="l01434"></a>01434 
+<a name="l01437"></a>01437         <span class="comment">// ########################################################################</span>
+<a name="l01438"></a>01438         <span class="comment">//  ST VALIDATION</span>
+<a name="l01439"></a>01439         <span class="comment">// ########################################################################</span>
+<a name="l01450"></a><a class="code" href="group__internalBasic.html#ga17f31ab4f36a637672e5f23c895c4acf">01450</a> <span class="comment"></span>        <span class="keyword">private</span> <a class="code" href="group__internalBasic.html#ga17f31ab4f36a637672e5f23c895c4acf">$_cas_server_ca_cert</a> = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l01451"></a>01451 
+<a name="l01457"></a><a class="code" href="group__internalBasic.html#gad410c54bdfd9b65f063bc9d52afae72d">01457</a>         <span class="keyword">private</span> <a class="code" href="group__internalBasic.html#gad410c54bdfd9b65f063bc9d52afae72d">$_no_cas_server_validation</a> = <span class="keyword">false</span>;
+<a name="l01458"></a>01458 
+<a name="l01459"></a>01459 
+<a name="l01465"></a><a class="code" href="group__internalBasic.html#ga548bebec55f195988aba071ddc340596">01465</a>         <span class="keyword">public</span> function <a class="code" href="group__internalBasic.html#ga548bebec55f195988aba071ddc340596">setCasServerCACert</a>($cert)
+<a name="l01466"></a>01466         {
+<a name="l01467"></a>01467                 $this-&gt;_cas_server_ca_cert = $cert;
+<a name="l01468"></a>01468         }
+<a name="l01469"></a>01469 
+<a name="l01473"></a><a class="code" href="group__internalBasic.html#gafa13a188b0b07c1f0631c0f844cdd11f">01473</a>         <span class="keyword">public</span> function <a class="code" href="group__internalBasic.html#gafa13a188b0b07c1f0631c0f844cdd11f">setNoCasServerValidation</a>()
+<a name="l01474"></a>01474         {
+<a name="l01475"></a>01475                 $this-&gt;_no_cas_server_validation = <span class="keyword">true</span>;
+<a name="l01476"></a>01476         }
+<a name="l01477"></a>01477 
+<a name="l01489"></a><a class="code" href="group__internalBasic.html#ga0a9d9d436a1b2b101ebe767617ac62ad">01489</a>         <span class="keyword">public</span> function <a class="code" href="group__internalBasic.html#ga0a9d9d436a1b2b101ebe767617ac62ad">validateST</a>($validate_url,&amp;$text_response,&amp;$tree_response)
+<a name="l01490"></a>01490         {
+<a name="l01491"></a>01491                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l01492"></a>01492                 <span class="comment">// build the URL to validate the ticket</span>
+<a name="l01493"></a>01493                 $validate_url = $this-&gt;<a class="code" href="group__internalConfig.html#ga0035da23a096dd33bdbbb14ab36ca759">getServerServiceValidateURL</a>().<span class="stringliteral">&#39;&amp;ticket=&#39;</span>.$this-&gt;<a class="code" href="group__internalBasic.html#ga13a1fac978baa6cc99f6a443bdb7f402">getST</a>();
+<a name="l01494"></a>01494                 <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalProxy.html#ga0dfba2b184668dda8892c385c3f04096">isProxy</a>() ) {
+<a name="l01495"></a>01495                         <span class="comment">// pass the callback url for CAS proxies</span>
+<a name="l01496"></a>01496                         $validate_url .= <span class="stringliteral">&#39;&amp;pgtUrl=&#39;</span>.urlencode($this-&gt;<a class="code" href="group__internalCallback.html#gaf4703672977711e0ecc3c616cc70215b">getCallbackURL</a>());
+<a name="l01497"></a>01497                 }
+<a name="l01498"></a>01498 
+<a name="l01499"></a>01499                 <span class="comment">// open and read the URL</span>
+<a name="l01500"></a>01500                 <span class="keywordflow">if</span> ( !$this-&gt;<a class="code" href="group__internalMisc.html#ga4a53dbb5ea834fc4593077481573b36e">readURL</a>($validate_url,$headers,$text_response,$err_msg) ) {
+<a name="l01501"></a>01501                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;could not open URL \&#39;&#39;</span>.$validate_url.<span class="charliteral">&#39;\&#39;</span> to validate (<span class="stringliteral">&#39;.$err_msg.&#39;</span>)<span class="stringliteral">&#39;);</span>
+<a name="l01502"></a>01502 <span class="stringliteral">                        $this-&gt;authError(&#39;</span>ST not validated<span class="stringliteral">&#39;,</span>
+<a name="l01503"></a>01503 <span class="stringliteral">                        $validate_url,</span>
+<a name="l01504"></a>01504 <span class="stringliteral">                        TRUE/*$no_response*/);</span>
+<a name="l01505"></a>01505 <span class="stringliteral">                }</span>
+<a name="l01506"></a>01506 <span class="stringliteral"></span>
+<a name="l01507"></a>01507 <span class="stringliteral">                // analyze the result depending on the version</span>
+<a name="l01508"></a>01508 <span class="stringliteral">                switch ($this-&gt;getServerVersion()) {</span>
+<a name="l01509"></a>01509 <span class="stringliteral">                        case CAS_VERSION_1_0:</span>
+<a name="l01510"></a>01510 <span class="stringliteral">                                if (preg_match(&#39;</span>/^no\n/<span class="stringliteral">&#39;,$text_response)) {</span>
+<a name="l01511"></a>01511 <span class="stringliteral">                                        phpCAS::trace(&#39;</span>ST has not been validated<span class="stringliteral">&#39;);</span>
+<a name="l01512"></a>01512 <span class="stringliteral">                                        $this-&gt;authError(&#39;</span>ST not validated<span class="stringliteral">&#39;,</span>
+<a name="l01513"></a>01513 <span class="stringliteral">                                        $validate_url,</span>
+<a name="l01514"></a>01514 <span class="stringliteral">                                        FALSE/*$no_response*/,</span>
+<a name="l01515"></a>01515 <span class="stringliteral">                                        FALSE/*$bad_response*/,</span>
+<a name="l01516"></a>01516 <span class="stringliteral">                                        $text_response);</span>
+<a name="l01517"></a>01517 <span class="stringliteral">                                }</span>
+<a name="l01518"></a>01518 <span class="stringliteral">                                if (!preg_match(&#39;</span>/^yes\n/<span class="stringliteral">&#39;,$text_response)) {</span>
+<a name="l01519"></a>01519 <span class="stringliteral">                                        phpCAS::trace(&#39;</span>ill-formed response<span class="stringliteral">&#39;);</span>
+<a name="l01520"></a>01520 <span class="stringliteral">                                        $this-&gt;authError(&#39;</span>ST not validated<span class="stringliteral">&#39;,</span>
+<a name="l01521"></a>01521 <span class="stringliteral">                                        $validate_url,</span>
+<a name="l01522"></a>01522 <span class="stringliteral">                                        FALSE/*$no_response*/,</span>
+<a name="l01523"></a>01523 <span class="stringliteral">                                        TRUE/*$bad_response*/,</span>
+<a name="l01524"></a>01524 <span class="stringliteral">                                        $text_response);</span>
+<a name="l01525"></a>01525 <span class="stringliteral">                                }</span>
+<a name="l01526"></a>01526 <span class="stringliteral">                                // ST has been validated, extract the user name</span>
+<a name="l01527"></a>01527 <span class="stringliteral">                                $arr = preg_split(&#39;</span>/\n/<span class="stringliteral">&#39;,$text_response);</span>
+<a name="l01528"></a>01528 <span class="stringliteral">                                $this-&gt;setUser(trim($arr[1]));</span>
+<a name="l01529"></a>01529 <span class="stringliteral">                                break;</span>
+<a name="l01530"></a>01530 <span class="stringliteral">                        case CAS_VERSION_2_0:</span>
+<a name="l01531"></a>01531 <span class="stringliteral"></span>
+<a name="l01532"></a>01532 <span class="stringliteral">                                // create new DOMDocument object</span>
+<a name="l01533"></a>01533 <span class="stringliteral">                                $dom = new DOMDocument();</span>
+<a name="l01534"></a>01534 <span class="stringliteral">                                // Fix possible whitspace problems</span>
+<a name="l01535"></a>01535 <span class="stringliteral">                                $dom-&gt;preserveWhiteSpace = false;</span>
+<a name="l01536"></a>01536 <span class="stringliteral">                                // read the response of the CAS server into a DOM object</span>
+<a name="l01537"></a>01537 <span class="stringliteral">                                if ( !($dom-&gt;loadXML($text_response))) {</span>
+<a name="l01538"></a>01538 <span class="stringliteral">                                        phpCAS::trace(&#39;</span>dom-&gt;loadXML() failed<span class="stringliteral">&#39;);</span>
+<a name="l01539"></a>01539 <span class="stringliteral">                                        $this-&gt;authError(&#39;</span>ST not validated<span class="stringliteral">&#39;,</span>
+<a name="l01540"></a>01540 <span class="stringliteral">                                        $validate_url,</span>
+<a name="l01541"></a>01541 <span class="stringliteral">                                        FALSE/*$no_response*/,</span>
+<a name="l01542"></a>01542 <span class="stringliteral">                                        TRUE/*$bad_response*/,</span>
+<a name="l01543"></a>01543 <span class="stringliteral">                                        $text_response);</span>
+<a name="l01544"></a>01544 <span class="stringliteral">                                }</span>
+<a name="l01545"></a>01545 <span class="stringliteral">                                // read the root node of the XML tree</span>
+<a name="l01546"></a>01546 <span class="stringliteral">                                if ( !($tree_response = $dom-&gt;documentElement) ) {</span>
+<a name="l01547"></a>01547 <span class="stringliteral">                                        phpCAS::trace(&#39;</span>documentElement() failed<span class="stringliteral">&#39;);</span>
+<a name="l01548"></a>01548 <span class="stringliteral">                                        $this-&gt;authError(&#39;</span>ST not validated<span class="stringliteral">&#39;,</span>
+<a name="l01549"></a>01549 <span class="stringliteral">                                        $validate_url,</span>
+<a name="l01550"></a>01550 <span class="stringliteral">                                        FALSE/*$no_response*/,</span>
+<a name="l01551"></a>01551 <span class="stringliteral">                                        TRUE/*$bad_response*/,</span>
+<a name="l01552"></a>01552 <span class="stringliteral">                                        $text_response);</span>
+<a name="l01553"></a>01553 <span class="stringliteral">                                }</span>
+<a name="l01554"></a>01554 <span class="stringliteral">                                // insure that tag name is &#39;</span>serviceResponse<span class="stringliteral">&#39;</span>
+<a name="l01555"></a>01555 <span class="stringliteral">                                if ( $tree_response-&gt;localName != &#39;</span>serviceResponse<span class="stringliteral">&#39; ) {</span>
+<a name="l01556"></a>01556 <span class="stringliteral">                                        phpCAS::trace(&#39;</span>bad XML root node (should be `serviceResponse\<span class="stringliteral">&#39; instead of `&#39;</span>.$tree_response-&gt;localName.<span class="charliteral">&#39;\&#39;&#39;</span>);
+<a name="l01557"></a>01557                                         $this-&gt;<a class="code" href="group__internalMisc.html#ga1d8d2502381f066a46433693f7eac14f">authError</a>(<span class="stringliteral">&#39;ST not validated&#39;</span>,
+<a name="l01558"></a>01558                                         $validate_url,
+<a name="l01559"></a>01559                                         FALSE<span class="comment">/*$no_response*/</span>,
+<a name="l01560"></a>01560                                         TRUE<span class="comment">/*$bad_response*/</span>,
+<a name="l01561"></a>01561                                         $text_response);
+<a name="l01562"></a>01562                                 }
+<a name="l01563"></a>01563 
+<a name="l01564"></a>01564                                 <span class="keywordflow">if</span> ( $tree_response-&gt;getElementsByTagName(<span class="stringliteral">&quot;authenticationSuccess&quot;</span>)-&gt;length != 0) {
+<a name="l01565"></a>01565                                         <span class="comment">// authentication succeded, extract the user name</span>
+<a name="l01566"></a>01566                                         $success_elements = $tree_response-&gt;getElementsByTagName(<span class="stringliteral">&quot;authenticationSuccess&quot;</span>);
+<a name="l01567"></a>01567                                         <span class="keywordflow">if</span> ( $success_elements-&gt;item(0)-&gt;getElementsByTagName(<span class="stringliteral">&quot;user&quot;</span>)-&gt;length == 0) {
+<a name="l01568"></a>01568                                                 <span class="comment">// no user specified =&gt; error</span>
+<a name="l01569"></a>01569                                                 $this-&gt;<a class="code" href="group__internalMisc.html#ga1d8d2502381f066a46433693f7eac14f">authError</a>(<span class="stringliteral">&#39;ST not validated&#39;</span>,
+<a name="l01570"></a>01570                                                 $validate_url,
+<a name="l01571"></a>01571                                                 FALSE<span class="comment">/*$no_response*/</span>,
+<a name="l01572"></a>01572                                                 TRUE<span class="comment">/*$bad_response*/</span>,
+<a name="l01573"></a>01573                                                 $text_response);
+<a name="l01574"></a>01574                                         }
+<a name="l01575"></a>01575                                         $this-&gt;<a class="code" href="group__internalAuthentication.html#gaab7eded3796f3a506c71221413dc95a1">setUser</a>(trim($success_elements-&gt;item(0)-&gt;getElementsByTagName(<span class="stringliteral">&quot;user&quot;</span>)-&gt;item(0)-&gt;nodeValue));
+<a name="l01576"></a>01576                                         $this-&gt;<a class="code" href="group__internalProxied.html#ga7d1f0e097dcfe2a4c2576b2be012a13c">readExtraAttributesCas20</a>($success_elements);
+<a name="l01577"></a>01577                                 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( $tree_response-&gt;getElementsByTagName(<span class="stringliteral">&quot;authenticationFailure&quot;</span>)-&gt;length != 0) {
+<a name="l01578"></a>01578                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;&lt;authenticationFailure&gt; found&#39;</span>);
+<a name="l01579"></a>01579                                         <span class="comment">// authentication failed, extract the error code and message</span>
+<a name="l01580"></a>01580                                         $auth_fail_list = $tree_response-&gt;getElementsByTagName(<span class="stringliteral">&quot;authenticationFailure&quot;</span>);
+<a name="l01581"></a>01581                                         $this-&gt;<a class="code" href="group__internalMisc.html#ga1d8d2502381f066a46433693f7eac14f">authError</a>(<span class="stringliteral">&#39;ST not validated&#39;</span>,
+<a name="l01582"></a>01582                                         $validate_url,
+<a name="l01583"></a>01583                                         FALSE<span class="comment">/*$no_response*/</span>,
+<a name="l01584"></a>01584                                         FALSE<span class="comment">/*$bad_response*/</span>,
+<a name="l01585"></a>01585                                         $text_response,
+<a name="l01586"></a>01586                                         $auth_fail_list-&gt;item(0)-&gt;getAttribute(<span class="stringliteral">&#39;code&#39;</span>)<span class="comment">/*$err_code*/</span>,
+<a name="l01587"></a>01587                                         trim($auth_fail_list-&gt;item(0)-&gt;nodeValue)<span class="comment">/*$err_msg*/</span>);
+<a name="l01588"></a>01588                                 } <span class="keywordflow">else</span> {
+<a name="l01589"></a>01589                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;neither &lt;authenticationSuccess&gt; nor &lt;authenticationFailure&gt; found&#39;</span>);
+<a name="l01590"></a>01590                                         $this-&gt;<a class="code" href="group__internalMisc.html#ga1d8d2502381f066a46433693f7eac14f">authError</a>(<span class="stringliteral">&#39;ST not validated&#39;</span>,
+<a name="l01591"></a>01591                                         $validate_url,
+<a name="l01592"></a>01592                                         FALSE<span class="comment">/*$no_response*/</span>,
+<a name="l01593"></a>01593                                         TRUE<span class="comment">/*$bad_response*/</span>,
+<a name="l01594"></a>01594                                         $text_response);
+<a name="l01595"></a>01595                                 }
+<a name="l01596"></a>01596                                 <span class="keywordflow">break</span>;
+<a name="l01597"></a>01597                 }
+<a name="l01598"></a>01598                 $this-&gt;<a class="code" href="group__internalMisc.html#ga889fb725f0c8f080963ee30872031d4d">renameSession</a>($this-&gt;<a class="code" href="group__internalBasic.html#ga13a1fac978baa6cc99f6a443bdb7f402">getST</a>());
+<a name="l01599"></a>01599                 <span class="comment">// at this step, ST has been validated and $this-&gt;_user has been set,</span>
+<a name="l01600"></a>01600                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>(TRUE);
+<a name="l01601"></a>01601                 <span class="keywordflow">return</span> TRUE;
+<a name="l01602"></a>01602         }
+<a name="l01603"></a>01603         
+<a name="l01607"></a>01607         <span class="comment">// ########################################################################</span>
+<a name="l01608"></a>01608         <span class="comment">//  SAML VALIDATION</span>
+<a name="l01609"></a>01609         <span class="comment">// ########################################################################</span>
+<a name="l01626"></a><a class="code" href="group__internalSAML.html#ga07f487f79659e810085f37fafafc90a0">01626</a> <span class="comment"></span>        <span class="keyword">public</span> function validateSA($validate_url,&amp;$text_response,&amp;$tree_response)
+<a name="l01627"></a>01627         {
+<a name="l01628"></a>01628                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l01629"></a>01629 
+<a name="l01630"></a>01630                 <span class="comment">// build the URL to validate the ticket</span>
+<a name="l01631"></a>01631                 $validate_url = $this-&gt;getServerSamlValidateURL();
+<a name="l01632"></a>01632 
+<a name="l01633"></a>01633                 <span class="comment">// open and read the URL</span>
+<a name="l01634"></a>01634                 <span class="keywordflow">if</span> ( !$this-&gt;readURL($validate_url,$headers,$text_response,$err_msg) ) {
+<a name="l01635"></a>01635                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;could not open URL \&#39;&#39;</span>.$validate_url.<span class="charliteral">&#39;\&#39;</span> to validate (<span class="stringliteral">&#39;.$err_msg.&#39;</span>)<span class="stringliteral">&#39;);</span>
+<a name="l01636"></a>01636 <span class="stringliteral">                        $this-&gt;authError(&#39;</span>SA not validated<span class="stringliteral">&#39;, $validate_url, TRUE/*$no_response*/);</span>
+<a name="l01637"></a>01637 <span class="stringliteral">                }</span>
+<a name="l01638"></a>01638 <span class="stringliteral"></span>
+<a name="l01639"></a>01639 <span class="stringliteral">                phpCAS::trace(&#39;</span>server version: <span class="stringliteral">&#39;.$this-&gt;getServerVersion());</span>
+<a name="l01640"></a>01640 <span class="stringliteral"></span>
+<a name="l01641"></a>01641 <span class="stringliteral">                // analyze the result depending on the version</span>
+<a name="l01642"></a>01642 <span class="stringliteral">                switch ($this-&gt;getServerVersion()) {</span>
+<a name="l01643"></a>01643 <span class="stringliteral">                        case SAML_VERSION_1_1:</span>
+<a name="l01644"></a>01644 <span class="stringliteral"></span>
+<a name="l01645"></a>01645 <span class="stringliteral">                                // create new DOMDocument Object</span>
+<a name="l01646"></a>01646 <span class="stringliteral">                                $dom = new DOMDocument();</span>
+<a name="l01647"></a>01647 <span class="stringliteral">                                // Fix possible whitspace problems</span>
+<a name="l01648"></a>01648 <span class="stringliteral">                                $dom-&gt;preserveWhiteSpace = false;</span>
+<a name="l01649"></a>01649 <span class="stringliteral">                                // read the response of the CAS server into a DOM object</span>
+<a name="l01650"></a>01650 <span class="stringliteral">                                if ( !($dom-&gt;loadXML($text_response))) {</span>
+<a name="l01651"></a>01651 <span class="stringliteral">                                        phpCAS::trace(&#39;</span>dom-&gt;loadXML() failed<span class="stringliteral">&#39;);</span>
+<a name="l01652"></a>01652 <span class="stringliteral">                                        $this-&gt;authError(&#39;</span>SA not validated<span class="stringliteral">&#39;,</span>
+<a name="l01653"></a>01653 <span class="stringliteral">                                        $validate_url,</span>
+<a name="l01654"></a>01654 <span class="stringliteral">                                        FALSE/*$no_response*/,</span>
+<a name="l01655"></a>01655 <span class="stringliteral">                                        TRUE/*$bad_response*/,</span>
+<a name="l01656"></a>01656 <span class="stringliteral">                                        $text_response);</span>
+<a name="l01657"></a>01657 <span class="stringliteral">                                }</span>
+<a name="l01658"></a>01658 <span class="stringliteral">                                // read the root node of the XML tree</span>
+<a name="l01659"></a>01659 <span class="stringliteral">                                if ( !($tree_response = $dom-&gt;documentElement) ) {</span>
+<a name="l01660"></a>01660 <span class="stringliteral">                                        phpCAS::trace(&#39;</span>documentElement() failed<span class="stringliteral">&#39;);</span>
+<a name="l01661"></a>01661 <span class="stringliteral">                                        $this-&gt;authError(&#39;</span>SA not validated<span class="stringliteral">&#39;,</span>
+<a name="l01662"></a>01662 <span class="stringliteral">                                        $validate_url,</span>
+<a name="l01663"></a>01663 <span class="stringliteral">                                        FALSE/*$no_response*/,</span>
+<a name="l01664"></a>01664 <span class="stringliteral">                                        TRUE/*$bad_response*/,</span>
+<a name="l01665"></a>01665 <span class="stringliteral">                                        $text_response);</span>
+<a name="l01666"></a>01666 <span class="stringliteral">                                }</span>
+<a name="l01667"></a>01667 <span class="stringliteral">                                // insure that tag name is &#39;</span>Envelope<span class="stringliteral">&#39;</span>
+<a name="l01668"></a>01668 <span class="stringliteral">                                if ( $tree_response-&gt;localName != &#39;</span>Envelope<span class="stringliteral">&#39; ) {</span>
+<a name="l01669"></a>01669 <span class="stringliteral">                                        phpCAS::trace(&#39;</span>bad XML root node (should be `Envelope\<span class="stringliteral">&#39; instead of `&#39;</span>.$tree_response-&gt;localName.<span class="charliteral">&#39;\&#39;&#39;</span>);
+<a name="l01670"></a>01670                                         $this-&gt;authError(<span class="stringliteral">&#39;SA not validated&#39;</span>,
+<a name="l01671"></a>01671                                         $validate_url,
+<a name="l01672"></a>01672                                         FALSE<span class="comment">/*$no_response*/</span>,
+<a name="l01673"></a>01673                                         TRUE<span class="comment">/*$bad_response*/</span>,
+<a name="l01674"></a>01674                                         $text_response);
+<a name="l01675"></a>01675                                 }
+<a name="l01676"></a>01676                                 <span class="comment">// check for the NameIdentifier tag in the SAML response</span>
+<a name="l01677"></a>01677                                 <span class="keywordflow">if</span> ( $tree_response-&gt;getElementsByTagName(<span class="stringliteral">&quot;NameIdentifier&quot;</span>)-&gt;length != 0) {
+<a name="l01678"></a>01678                                         $success_elements = $tree_response-&gt;getElementsByTagName(<span class="stringliteral">&quot;NameIdentifier&quot;</span>);
+<a name="l01679"></a>01679                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;NameIdentifier found&#39;</span>);
+<a name="l01680"></a>01680                                         $user = trim($success_elements-&gt;item(0)-&gt;nodeValue);
+<a name="l01681"></a>01681                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;user = `&#39;</span>.$user.<span class="charliteral">&#39;`&#39;</span>);
+<a name="l01682"></a>01682                                         $this-&gt;setUser($user);
+<a name="l01683"></a>01683                                         $this-&gt;setSessionAttributes($text_response);
+<a name="l01684"></a>01684                                 } <span class="keywordflow">else</span> {
+<a name="l01685"></a>01685                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;no &lt;NameIdentifier&gt; tag found in SAML payload&#39;</span>);
+<a name="l01686"></a>01686                                         $this-&gt;authError(<span class="stringliteral">&#39;SA not validated&#39;</span>,
+<a name="l01687"></a>01687                                         $validate_url,
+<a name="l01688"></a>01688                                         FALSE<span class="comment">/*$no_response*/</span>,
+<a name="l01689"></a>01689                                         TRUE<span class="comment">/*$bad_response*/</span>,
+<a name="l01690"></a>01690                                         $text_response);
+<a name="l01691"></a>01691                                 }
+<a name="l01692"></a>01692                                 <span class="keywordflow">break</span>;
+<a name="l01693"></a>01693                 }
+<a name="l01694"></a>01694                 $this-&gt;renameSession($this-&gt;getSA());
+<a name="l01695"></a>01695                 <span class="comment">// at this step, ST has been validated and $this-&gt;_user has been set,</span>
+<a name="l01696"></a>01696                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>(TRUE);
+<a name="l01697"></a>01697                 <span class="keywordflow">return</span> TRUE;
+<a name="l01698"></a>01698         }
+<a name="l01699"></a>01699 
+<a name="l01707"></a><a class="code" href="group__internalSAML.html#gaf0f93cd303855b62c04ca667dc741ee5">01707</a>         <span class="keyword">private</span> function setSessionAttributes($text_response)
+<a name="l01708"></a>01708         {
+<a name="l01709"></a>01709                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l01710"></a>01710 
+<a name="l01711"></a>01711                 $result = FALSE;
+<a name="l01712"></a>01712 
+<a name="l01713"></a>01713                 $attr_array = array();
+<a name="l01714"></a>01714 
+<a name="l01715"></a>01715                 <span class="comment">// create new DOMDocument Object</span>
+<a name="l01716"></a>01716                 $dom = <span class="keyword">new</span> DOMDocument();
+<a name="l01717"></a>01717                 <span class="comment">// Fix possible whitspace problems</span>
+<a name="l01718"></a>01718                 $dom-&gt;preserveWhiteSpace = <span class="keyword">false</span>;
+<a name="l01719"></a>01719                 <span class="keywordflow">if</span> (($dom-&gt;loadXML($text_response))) {
+<a name="l01720"></a>01720                         $xPath = <span class="keyword">new</span> DOMXpath($dom);
+<a name="l01721"></a>01721                         $xPath-&gt;registerNamespace(<span class="stringliteral">&#39;samlp&#39;</span>, <span class="stringliteral">&#39;urn:oasis:names:tc:SAML:1.0:protocol&#39;</span>);
+<a name="l01722"></a>01722                         $xPath-&gt;registerNamespace(<span class="stringliteral">&#39;saml&#39;</span>, <span class="stringliteral">&#39;urn:oasis:names:tc:SAML:1.0:assertion&#39;</span>);
+<a name="l01723"></a>01723                         $nodelist = $xPath-&gt;query(<span class="stringliteral">&quot;//saml:Attribute&quot;</span>);
+<a name="l01724"></a>01724 
+<a name="l01725"></a>01725                         <span class="keywordflow">if</span>($nodelist){
+<a name="l01726"></a>01726                                 <span class="keywordflow">foreach</span>($nodelist as $node){
+<a name="l01727"></a>01727                                         $xres = $xPath-&gt;query(<span class="stringliteral">&quot;saml:AttributeValue&quot;</span>, $node);
+<a name="l01728"></a>01728                                         $name = $node-&gt;getAttribute(<span class="stringliteral">&quot;AttributeName&quot;</span>);
+<a name="l01729"></a>01729                                         $value_array = array();
+<a name="l01730"></a>01730                                         <span class="keywordflow">foreach</span>($xres as $node2){
+<a name="l01731"></a>01731                                                 $value_array[] = $node2-&gt;nodeValue;
+<a name="l01732"></a>01732                                         }
+<a name="l01733"></a>01733                                         $attr_array[$name] = $value_array;
+<a name="l01734"></a>01734                                 }
+<a name="l01735"></a>01735                                 <span class="comment">// UGent addition...</span>
+<a name="l01736"></a>01736                                 <span class="keywordflow">foreach</span>($attr_array as $attr_key =&gt; $attr_value) {
+<a name="l01737"></a>01737                                         <span class="keywordflow">if</span>(count($attr_value) &gt; 1) {
+<a name="l01738"></a>01738                                                 $this-&gt;_attributes[$attr_key] = $attr_value;
+<a name="l01739"></a>01739                                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;* &quot;</span> . $attr_key . <span class="stringliteral">&quot;=&quot;</span> . $attr_value);
+<a name="l01740"></a>01740                                         }
+<a name="l01741"></a>01741                                         <span class="keywordflow">else</span> {
+<a name="l01742"></a>01742                                                 $this-&gt;_attributes[$attr_key] = $attr_value[0];
+<a name="l01743"></a>01743                                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;* &quot;</span> . $attr_key . <span class="stringliteral">&quot;=&quot;</span> . $attr_value[0]);
+<a name="l01744"></a>01744                                         }
+<a name="l01745"></a>01745                                 }
+<a name="l01746"></a>01746                                 $result = TRUE;
+<a name="l01747"></a>01747                         }<span class="keywordflow">else</span>{
+<a name="l01748"></a>01748                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;SAML Attributes are empty&quot;</span>);
+<a name="l01749"></a>01749                                 $result = FALSE;
+<a name="l01750"></a>01750                         }
+<a name="l01751"></a>01751                 }
+<a name="l01752"></a>01752                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>($result);
+<a name="l01753"></a>01753                 <span class="keywordflow">return</span> $result;
+<a name="l01754"></a>01754         }
+<a name="l01755"></a>01755         
+<a name="l01760"></a><a class="code" href="group__internalSAML.html#gabbfc9663e999471633c4b5cc1a1f2751">01760</a>         <span class="keyword">public</span> function getSA()
+<a name="l01761"></a>01761         { <span class="keywordflow">return</span> <span class="stringliteral">&#39;ST&#39;</span>.substr($this-&gt;_sa, 2); }
+<a name="l01762"></a>01762 
+<a name="l01767"></a><a class="code" href="group__internalSAML.html#gab543514ee8feaf062af84e78fa26f19f">01767</a>         <span class="keyword">public</span> function setSA($sa)
+<a name="l01768"></a>01768         { $this-&gt;_sa = $sa; }
+<a name="l01769"></a>01769 
+<a name="l01774"></a><a class="code" href="group__internalSAML.html#ga436daacbfb73a41424dd24e116acc112">01774</a>         <span class="keyword">public</span> function hasSA()
+<a name="l01775"></a>01775         { <span class="keywordflow">return</span> !empty($this-&gt;_sa); }
+<a name="l01776"></a>01776 
+<a name="l01779"></a>01779         <span class="comment">// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span>
+<a name="l01780"></a>01780         <span class="comment">// XX                                                                    XX</span>
+<a name="l01781"></a>01781         <span class="comment">// XX                     PROXY FEATURES (CAS 2.0)                       XX</span>
+<a name="l01782"></a>01782         <span class="comment">// XX                                                                    XX</span>
+<a name="l01783"></a>01783         <span class="comment">// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span>
+<a name="l01784"></a>01784 
+<a name="l01785"></a>01785         <span class="comment">// ########################################################################</span>
+<a name="l01786"></a>01786         <span class="comment">//  PROXYING</span>
+<a name="l01787"></a>01787         <span class="comment">// ########################################################################</span>
+<a name="l01797"></a><a class="code" href="group__internalProxy.html#ga93e5bc863e46e09173b578b79a45b760">01797</a> <span class="comment"></span>        <span class="keyword">private</span> $_proxy;
+<a name="l01798"></a>01798 
+<a name="l01802"></a><a class="code" href="group__internalProxy.html#ga1f1bcaf4533a30cf236fc0b531aede62">01802</a>         <span class="keyword">private</span> $_serviceCookieJar;
+<a name="l01803"></a>01803 
+<a name="l01809"></a><a class="code" href="group__internalProxy.html#ga0dfba2b184668dda8892c385c3f04096">01809</a>         <span class="keyword">public</span> function isProxy()
+<a name="l01810"></a>01810         {
+<a name="l01811"></a>01811                 <span class="keywordflow">return</span> $this-&gt;_proxy;
+<a name="l01812"></a>01812         }
+<a name="l01813"></a>01813 
+<a name="l01815"></a>01815         <span class="comment">// ########################################################################</span>
+<a name="l01816"></a>01816         <span class="comment">//  PGT</span>
+<a name="l01817"></a>01817         <span class="comment">// ########################################################################</span>
+<a name="l01829"></a><a class="code" href="group__internalProxy.html#ga2c3d4f2d4cb694f1687f561e8483a4c9">01829</a> <span class="comment"></span>        <span class="keyword">private</span> $_pgt = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l01830"></a>01830 
+<a name="l01835"></a><a class="code" href="group__internalProxy.html#ga34d29abe0254d1b5752e4f3557865157">01835</a>         <span class="keyword">private</span> function getPGT()
+<a name="l01836"></a>01836         { <span class="keywordflow">return</span> $this-&gt;_pgt; }
+<a name="l01837"></a>01837 
+<a name="l01842"></a><a class="code" href="group__internalProxy.html#ga7750adb0745c0b005ff8b305e7a060e0">01842</a>         <span class="keyword">private</span> function setPGT($pgt)
+<a name="l01843"></a>01843         { $this-&gt;_pgt = $pgt; }
+<a name="l01844"></a>01844 
+<a name="l01849"></a><a class="code" href="group__internalProxy.html#gaece996995e43de2f4a14600a1de1ec86">01849</a>         <span class="keyword">private</span> function hasPGT()
+<a name="l01850"></a>01850         { <span class="keywordflow">return</span> !empty($this-&gt;_pgt); }
+<a name="l01851"></a>01851 
+<a name="l01854"></a>01854         <span class="comment">// ########################################################################</span>
+<a name="l01855"></a>01855         <span class="comment">//  CALLBACK MODE</span>
+<a name="l01856"></a>01856         <span class="comment">// ########################################################################</span>
+<a name="l01873"></a><a class="code" href="group__internalCallback.html#gaed4f8867a062dd1ece2e51e9ec31df58">01873</a> <span class="comment"></span>        <span class="keyword">private</span> $_callback_mode = FALSE;
+<a name="l01874"></a>01874 
+<a name="l01880"></a><a class="code" href="group__internalCallback.html#ga18db51da1c4c0324fd3a3f6ab79f6aab">01880</a>         <span class="keyword">private</span> function setCallbackMode($callback_mode)
+<a name="l01881"></a>01881         {
+<a name="l01882"></a>01882                 $this-&gt;_callback_mode = $callback_mode;
+<a name="l01883"></a>01883         }
+<a name="l01884"></a>01884 
+<a name="l01891"></a><a class="code" href="group__internalCallback.html#ga445e92539e88bfaf0670da31f8ba68d8">01891</a>         <span class="keyword">private</span> function isCallbackMode()
+<a name="l01892"></a>01892         {
+<a name="l01893"></a>01893                 <span class="keywordflow">return</span> $this-&gt;_callback_mode;
+<a name="l01894"></a>01894         }
+<a name="l01895"></a>01895 
+<a name="l01903"></a><a class="code" href="group__internalCallback.html#ga4e021ea01bd0aebe95d458a5c7997747">01903</a>         <span class="keyword">private</span> $_callback_url = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l01904"></a>01904 
+<a name="l01912"></a><a class="code" href="group__internalCallback.html#gaf4703672977711e0ecc3c616cc70215b">01912</a>         <span class="keyword">private</span> function getCallbackURL()
+<a name="l01913"></a>01913         {
+<a name="l01914"></a>01914                 <span class="comment">// the URL is built when needed only</span>
+<a name="l01915"></a>01915                 <span class="keywordflow">if</span> ( empty($this-&gt;_callback_url) ) {
+<a name="l01916"></a>01916                         $final_uri = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l01917"></a>01917                         <span class="comment">// remove the ticket if present in the URL</span>
+<a name="l01918"></a>01918                         $final_uri = <span class="stringliteral">&#39;https://&#39;</span>;
+<a name="l01919"></a>01919                         $final_uri .= $this-&gt;getServerUrl();
+<a name="l01920"></a>01920                         $request_uri = $_SERVER[<span class="stringliteral">&#39;REQUEST_URI&#39;</span>];
+<a name="l01921"></a>01921                         $request_uri = preg_replace(<span class="stringliteral">&#39;/\?.*$/&#39;</span>,<span class="stringliteral">&#39;&#39;</span>,$request_uri);
+<a name="l01922"></a>01922                         $final_uri .= $request_uri;
+<a name="l01923"></a>01923                         $this-&gt;setCallbackURL($final_uri);
+<a name="l01924"></a>01924                 }
+<a name="l01925"></a>01925                 <span class="keywordflow">return</span> $this-&gt;_callback_url;
+<a name="l01926"></a>01926         }
+<a name="l01927"></a>01927 
+<a name="l01933"></a><a class="code" href="group__internalCallback.html#gac8f0af91cf84fb7dbd78c1acb0d7b921">01933</a>         <span class="keyword">public</span> function setCallbackURL($url)
+<a name="l01934"></a>01934         {
+<a name="l01935"></a>01935                 <span class="keywordflow">return</span> $this-&gt;_callback_url = $url;
+<a name="l01936"></a>01936         }
+<a name="l01937"></a>01937 
+<a name="l01942"></a><a class="code" href="group__internalCallback.html#ga7a7208da84825f761a76246080d12ec0">01942</a>         <span class="keyword">private</span> function callback()
+<a name="l01943"></a>01943         {
+<a name="l01944"></a>01944                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l01945"></a>01945                 <span class="keywordflow">if</span> (preg_match(<span class="stringliteral">&#39;/PGTIOU-[\.\-\w]/&#39;</span>, $_GET[<span class="stringliteral">&#39;pgtIou&#39;</span>])){
+<a name="l01946"></a>01946                         <span class="keywordflow">if</span>(preg_match(<span class="stringliteral">&#39;/[PT]GT-[\.\-\w]/&#39;</span>, $_GET[<span class="stringliteral">&#39;pgtId&#39;</span>])){
+<a name="l01947"></a>01947                                 $this-&gt;printHTMLHeader(<span class="stringliteral">&#39;phpCAS callback&#39;</span>);
+<a name="l01948"></a>01948                                 $pgt_iou = $_GET[<span class="stringliteral">&#39;pgtIou&#39;</span>];
+<a name="l01949"></a>01949                                 $pgt = $_GET[<span class="stringliteral">&#39;pgtId&#39;</span>];
+<a name="l01950"></a>01950                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;Storing PGT `&#39;</span>.$pgt.<span class="charliteral">&#39;\&#39;</span> (<span class="keywordtype">id</span>=`<span class="stringliteral">&#39;.$pgt_iou.&#39;</span>\<span class="charliteral">&#39;)&#39;</span>);
+<a name="l01951"></a>01951                                 echo <span class="stringliteral">&#39;&lt;p&gt;Storing PGT `&#39;</span>.$pgt.<span class="charliteral">&#39;\&#39;</span> (<span class="keywordtype">id</span>=`<span class="stringliteral">&#39;.$pgt_iou.&#39;</span>\<span class="stringliteral">&#39;).&lt;/p&gt;&#39;</span>;
+<a name="l01952"></a>01952                                 $this-&gt;storePGT($pgt,$pgt_iou);
+<a name="l01953"></a>01953                                 $this-&gt;printHTMLFooter();
+<a name="l01954"></a>01954                         }<span class="keywordflow">else</span>{
+<a name="l01955"></a>01955                                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;PGT format invalid&#39;</span> . $_GET[<span class="stringliteral">&#39;pgtId&#39;</span>]);
+<a name="l01956"></a>01956                         }
+<a name="l01957"></a>01957                 }<span class="keywordflow">else</span>{
+<a name="l01958"></a>01958                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;PGTiou format invalid&#39;</span> . $_GET[<span class="stringliteral">&#39;pgtIou&#39;</span>]);
+<a name="l01959"></a>01959                 }
+<a name="l01960"></a>01960                 <a class="code" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">phpCAS::traceExit</a>();
+<a name="l01961"></a>01961                 exit();
+<a name="l01962"></a>01962         }
+<a name="l01963"></a>01963 
+<a name="l01966"></a>01966         <span class="comment">// ########################################################################</span>
+<a name="l01967"></a>01967         <span class="comment">//  PGT STORAGE</span>
+<a name="l01968"></a>01968         <span class="comment">// ########################################################################</span>
+<a name="l01981"></a><a class="code" href="group__internalPGTStorage.html#gad1f8471bde7999b0465c8f3f109a6aba">01981</a> <span class="comment"></span>        <span class="keyword">private</span> $_pgt_storage = null;
+<a name="l01982"></a>01982 
+<a name="l01987"></a><a class="code" href="group__internalPGTStorage.html#ga511cf65486f483837a48c50588b638a0">01987</a>         <span class="keyword">private</span> function initPGTStorage()
+<a name="l01988"></a>01988         {
+<a name="l01989"></a>01989                 <span class="comment">// if no SetPGTStorageXxx() has been used, default to file</span>
+<a name="l01990"></a>01990                 <span class="keywordflow">if</span> ( !is_object($this-&gt;_pgt_storage) ) {
+<a name="l01991"></a>01991                         $this-&gt;setPGTStorageFile();
+<a name="l01992"></a>01992                 }
+<a name="l01993"></a>01993 
+<a name="l01994"></a>01994                 <span class="comment">// initializes the storage</span>
+<a name="l01995"></a>01995                 $this-&gt;_pgt_storage-&gt;init();
+<a name="l01996"></a>01996         }
+<a name="l01997"></a>01997 
+<a name="l02004"></a><a class="code" href="group__internalPGTStorage.html#ga244695840dc3a3964707cc355a0b631c">02004</a>         <span class="keyword">private</span> function storePGT($pgt,$pgt_iou)
+<a name="l02005"></a>02005         {
+<a name="l02006"></a>02006                 <span class="comment">// ensure that storage is initialized</span>
+<a name="l02007"></a>02007                 $this-&gt;initPGTStorage();
+<a name="l02008"></a>02008                 <span class="comment">// writes the PGT</span>
+<a name="l02009"></a>02009                 $this-&gt;_pgt_storage-&gt;write($pgt,$pgt_iou);
+<a name="l02010"></a>02010         }
+<a name="l02011"></a>02011 
+<a name="l02019"></a><a class="code" href="group__internalPGTStorage.html#gab185f7f3bf5bd642ce35978f6b0c7ab8">02019</a>         <span class="keyword">private</span> function loadPGT($pgt_iou)
+<a name="l02020"></a>02020         {
+<a name="l02021"></a>02021                 <span class="comment">// ensure that storage is initialized</span>
+<a name="l02022"></a>02022                 $this-&gt;initPGTStorage();
+<a name="l02023"></a>02023                 <span class="comment">// read the PGT</span>
+<a name="l02024"></a>02024                 <span class="keywordflow">return</span> $this-&gt;_pgt_storage-&gt;read($pgt_iou);
+<a name="l02025"></a>02025         }
+<a name="l02026"></a>02026 
+<a name="l02032"></a><a class="code" href="group__internalPGTStorage.html#ga4d407488ad4ca4409e4128a98d1d3801">02032</a>         <span class="keyword">public</span> function setPGTStorage($storage)
+<a name="l02033"></a>02033         {
+<a name="l02034"></a>02034                 <span class="comment">// check that the storage has not already been set</span>
+<a name="l02035"></a>02035                 <span class="keywordflow">if</span> ( is_object($this-&gt;_pgt_storage) ) {
+<a name="l02036"></a>02036                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;PGT storage already defined&#39;</span>);
+<a name="l02037"></a>02037                 }
+<a name="l02038"></a>02038 
+<a name="l02039"></a>02039                 <span class="comment">// check to make sure a valid storage object was specified</span>
+<a name="l02040"></a>02040                 <span class="keywordflow">if</span> ( !($storage instanceof <a class="code" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a>) ) {
+<a name="l02041"></a>02041                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;Invalid PGT storage object&#39;</span>);
+<a name="l02042"></a>02042                 }
+<a name="l02043"></a>02043 
+<a name="l02044"></a>02044                 <span class="comment">// store the PGTStorage object</span>
+<a name="l02045"></a>02045                 $this-&gt;_pgt_storage = $storage;
+<a name="l02046"></a>02046         }
+<a name="l02047"></a>02047 
+<a name="l02058"></a><a class="code" href="group__internalPGTStorage.html#ga37d474907361e521a00259c04b712fe4">02058</a>         <span class="keyword">public</span> function setPGTStorageDb($dsn_or_pdo, $username=<span class="stringliteral">&#39;&#39;</span>, $password=<span class="stringliteral">&#39;&#39;</span>, $table=<span class="stringliteral">&#39;&#39;</span>, $driver_options=null)
+<a name="l02059"></a>02059         {
+<a name="l02060"></a>02060                 <span class="comment">// create the storage object</span>
+<a name="l02061"></a>02061                 $this-&gt;setPGTStorage(<span class="keyword">new</span> <a class="code" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a>($this, $dsn_or_pdo, $username, $password, $table, $driver_options));
+<a name="l02062"></a>02062         }
+<a name="l02063"></a>02063 
+<a name="l02071"></a><a class="code" href="group__internalPGTStorage.html#gac179a4316bd15cd498f90a6599c7df4c">02071</a>         <span class="keyword">public</span> function setPGTStorageFile($path=<span class="stringliteral">&#39;&#39;</span>)
+<a name="l02072"></a>02072         {
+<a name="l02073"></a>02073                 <span class="comment">// create the storage object</span>
+<a name="l02074"></a>02074                 $this-&gt;setPGTStorage(<span class="keyword">new</span> <a class="code" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a>($this,$path));
+<a name="l02075"></a>02075         }
+<a name="l02076"></a>02076 
+<a name="l02077"></a>02077 
+<a name="l02078"></a>02078         <span class="comment">// ########################################################################</span>
+<a name="l02079"></a>02079         <span class="comment">//  PGT VALIDATION</span>
+<a name="l02080"></a>02080         <span class="comment">// ########################################################################</span>
+<a name="l02092"></a><a class="code" href="group__internalPGTStorage.html#ga8c7c97937692e79da12a8be3df634cbe">02092</a> <span class="comment"></span>        <span class="keyword">private</span> function validatePGT(&amp;$validate_url,$text_response,$tree_response)
+<a name="l02093"></a>02093         {
+<a name="l02094"></a>02094                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l02095"></a>02095                 <span class="keywordflow">if</span> ( $tree_response-&gt;getElementsByTagName(<span class="stringliteral">&quot;proxyGrantingTicket&quot;</span>)-&gt;length == 0) {
+<a name="l02096"></a>02096                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;&lt;proxyGrantingTicket&gt; not found&#39;</span>);
+<a name="l02097"></a>02097                         <span class="comment">// authentication succeded, but no PGT Iou was transmitted</span>
+<a name="l02098"></a>02098                         $this-&gt;authError(<span class="stringliteral">&#39;Ticket validated but no PGT Iou transmitted&#39;</span>,
+<a name="l02099"></a>02099                         $validate_url,
+<a name="l02100"></a>02100                         FALSE<span class="comment">/*$no_response*/</span>,
+<a name="l02101"></a>02101                         FALSE<span class="comment">/*$bad_response*/</span>,
+<a name="l02102"></a>02102                         $text_response);
+<a name="l02103"></a>02103                 } <span class="keywordflow">else</span> {
+<a name="l02104"></a>02104                         <span class="comment">// PGT Iou transmitted, extract it</span>
+<a name="l02105"></a>02105                         $pgt_iou = trim($tree_response-&gt;getElementsByTagName(<span class="stringliteral">&quot;proxyGrantingTicket&quot;</span>)-&gt;item(0)-&gt;nodeValue);
+<a name="l02106"></a>02106                         <span class="keywordflow">if</span>(preg_match(<span class="stringliteral">&#39;/PGTIOU-[\.\-\w]/&#39;</span>,$pgt_iou)){
+<a name="l02107"></a>02107                                 $pgt = $this-&gt;loadPGT($pgt_iou);
+<a name="l02108"></a>02108                                 <span class="keywordflow">if</span> ( $pgt == FALSE ) {
+<a name="l02109"></a>02109                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;could not load PGT&#39;</span>);
+<a name="l02110"></a>02110                                         $this-&gt;authError(<span class="stringliteral">&#39;PGT Iou was transmitted but PGT could not be retrieved&#39;</span>,
+<a name="l02111"></a>02111                                         $validate_url,
+<a name="l02112"></a>02112                                         FALSE<span class="comment">/*$no_response*/</span>,
+<a name="l02113"></a>02113                                         FALSE<span class="comment">/*$bad_response*/</span>,
+<a name="l02114"></a>02114                                         $text_response);
+<a name="l02115"></a>02115                                 }
+<a name="l02116"></a>02116                                 $this-&gt;setPGT($pgt);
+<a name="l02117"></a>02117                         }<span class="keywordflow">else</span>{
+<a name="l02118"></a>02118                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;PGTiou format error&#39;</span>);
+<a name="l02119"></a>02119                                 $this-&gt;authError(<span class="stringliteral">&#39;PGT Iou was transmitted but has wrong fromat&#39;</span>,
+<a name="l02120"></a>02120                                 $validate_url,
+<a name="l02121"></a>02121                                 FALSE<span class="comment">/*$no_response*/</span>,
+<a name="l02122"></a>02122                                 FALSE<span class="comment">/*$bad_response*/</span>,
+<a name="l02123"></a>02123                                 $text_response);
+<a name="l02124"></a>02124                         }
+<a name="l02125"></a>02125                 }
+<a name="l02126"></a>02126                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>(TRUE);
+<a name="l02127"></a>02127                 <span class="keywordflow">return</span> TRUE;
+<a name="l02128"></a>02128         }
+<a name="l02129"></a>02129 
+<a name="l02130"></a>02130         <span class="comment">// ########################################################################</span>
+<a name="l02131"></a>02131         <span class="comment">//  PGT VALIDATION</span>
+<a name="l02132"></a>02132         <span class="comment">// ########################################################################</span>
+<a name="l02133"></a>02133 
+<a name="l02143"></a><a class="code" href="group__internalPGTStorage.html#ga0c5561328fcab419325ae53d70dddf12">02143</a>         <span class="keyword">public</span> function retrievePT($target_service,&amp;$err_code,&amp;$err_msg)
+<a name="l02144"></a>02144         {
+<a name="l02145"></a>02145                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l02146"></a>02146 
+<a name="l02147"></a>02147                 <span class="comment">// by default, $err_msg is set empty and $pt to TRUE. On error, $pt is</span>
+<a name="l02148"></a>02148                 <span class="comment">// set to false and $err_msg to an error message. At the end, if $pt is FALSE</span>
+<a name="l02149"></a>02149                 <span class="comment">// and $error_msg is still empty, it is set to &#39;invalid response&#39; (the most</span>
+<a name="l02150"></a>02150                 <span class="comment">// commonly encountered error).</span>
+<a name="l02151"></a>02151                 $err_msg = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l02152"></a>02152 
+<a name="l02153"></a>02153                 <span class="comment">// build the URL to retrieve the PT</span>
+<a name="l02154"></a>02154                 <a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a> = $this-&gt;getServerProxyURL().<span class="stringliteral">&#39;?targetService=&#39;</span>.urlencode($target_service).<span class="stringliteral">&#39;&amp;pgt=&#39;</span>.$this-&gt;getPGT();
+<a name="l02155"></a>02155 
+<a name="l02156"></a>02156                 <span class="comment">// open and read the URL</span>
+<a name="l02157"></a>02157                 <span class="keywordflow">if</span> ( !$this-&gt;readURL(<a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a>,$headers,$cas_response,$err_msg) ) {
+<a name="l02158"></a>02158                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;could not open URL \&#39;&#39;</span>.<a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a>.<span class="charliteral">&#39;\&#39;</span> to validate (<span class="stringliteral">&#39;.$err_msg.&#39;</span>)<span class="stringliteral">&#39;);</span>
+<a name="l02159"></a>02159 <span class="stringliteral">                        $err_code = PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE;</span>
+<a name="l02160"></a>02160 <span class="stringliteral">                        $err_msg = &#39;</span>could not retrieve PT (no response from the CAS server)<span class="stringliteral">&#39;;</span>
+<a name="l02161"></a>02161 <span class="stringliteral">                        phpCAS::traceEnd(FALSE);</span>
+<a name="l02162"></a>02162 <span class="stringliteral">                        return FALSE;</span>
+<a name="l02163"></a>02163 <span class="stringliteral">                }</span>
+<a name="l02164"></a>02164 <span class="stringliteral"></span>
+<a name="l02165"></a>02165 <span class="stringliteral">                $bad_response = FALSE;</span>
+<a name="l02166"></a>02166 <span class="stringliteral"></span>
+<a name="l02167"></a>02167 <span class="stringliteral">                if ( !$bad_response ) {</span>
+<a name="l02168"></a>02168 <span class="stringliteral">                        // create new DOMDocument object</span>
+<a name="l02169"></a>02169 <span class="stringliteral">                        $dom = new DOMDocument();</span>
+<a name="l02170"></a>02170 <span class="stringliteral">                        // Fix possible whitspace problems</span>
+<a name="l02171"></a>02171 <span class="stringliteral">                        $dom-&gt;preserveWhiteSpace = false;</span>
+<a name="l02172"></a>02172 <span class="stringliteral">                        // read the response of the CAS server into a DOM object</span>
+<a name="l02173"></a>02173 <span class="stringliteral">                        if ( !($dom-&gt;loadXML($cas_response))) {</span>
+<a name="l02174"></a>02174 <span class="stringliteral">                                phpCAS::trace(&#39;</span>dom-&gt;loadXML() failed<span class="stringliteral">&#39;);</span>
+<a name="l02175"></a>02175 <span class="stringliteral">                                // read failed</span>
+<a name="l02176"></a>02176 <span class="stringliteral">                                $bad_response = TRUE;</span>
+<a name="l02177"></a>02177 <span class="stringliteral">                        }</span>
+<a name="l02178"></a>02178 <span class="stringliteral">                }</span>
+<a name="l02179"></a>02179 <span class="stringliteral"></span>
+<a name="l02180"></a>02180 <span class="stringliteral">                if ( !$bad_response ) {</span>
+<a name="l02181"></a>02181 <span class="stringliteral">                        // read the root node of the XML tree</span>
+<a name="l02182"></a>02182 <span class="stringliteral">                        if ( !($root = $dom-&gt;documentElement) ) {</span>
+<a name="l02183"></a>02183 <span class="stringliteral">                                phpCAS::trace(&#39;</span>documentElement failed<span class="stringliteral">&#39;);</span>
+<a name="l02184"></a>02184 <span class="stringliteral">                                // read failed</span>
+<a name="l02185"></a>02185 <span class="stringliteral">                                $bad_response = TRUE;</span>
+<a name="l02186"></a>02186 <span class="stringliteral">                        }</span>
+<a name="l02187"></a>02187 <span class="stringliteral">                }</span>
+<a name="l02188"></a>02188 <span class="stringliteral"></span>
+<a name="l02189"></a>02189 <span class="stringliteral">                if ( !$bad_response ) {</span>
+<a name="l02190"></a>02190 <span class="stringliteral">                        // insure that tag name is &#39;</span>serviceResponse<span class="stringliteral">&#39;</span>
+<a name="l02191"></a>02191 <span class="stringliteral">                        if ( $root-&gt;localName != &#39;</span>serviceResponse<span class="stringliteral">&#39; ) {</span>
+<a name="l02192"></a>02192 <span class="stringliteral">                                phpCAS::trace(&#39;</span>localName failed<span class="stringliteral">&#39;);</span>
+<a name="l02193"></a>02193 <span class="stringliteral">                                // bad root node</span>
+<a name="l02194"></a>02194 <span class="stringliteral">                                $bad_response = TRUE;</span>
+<a name="l02195"></a>02195 <span class="stringliteral">                        }</span>
+<a name="l02196"></a>02196 <span class="stringliteral">                }</span>
+<a name="l02197"></a>02197 <span class="stringliteral"></span>
+<a name="l02198"></a>02198 <span class="stringliteral">                if ( !$bad_response ) {</span>
+<a name="l02199"></a>02199 <span class="stringliteral">                        // look for a proxySuccess tag</span>
+<a name="l02200"></a>02200 <span class="stringliteral">                        if ( $root-&gt;getElementsByTagName(&quot;proxySuccess&quot;)-&gt;length != 0) {</span>
+<a name="l02201"></a>02201 <span class="stringliteral">                                $proxy_success_list = $root-&gt;getElementsByTagName(&quot;proxySuccess&quot;);</span>
+<a name="l02202"></a>02202 <span class="stringliteral"></span>
+<a name="l02203"></a>02203 <span class="stringliteral">                                // authentication succeded, look for a proxyTicket tag</span>
+<a name="l02204"></a>02204 <span class="stringliteral">                                if ( $proxy_success_list-&gt;item(0)-&gt;getElementsByTagName(&quot;proxyTicket&quot;)-&gt;length != 0) {</span>
+<a name="l02205"></a>02205 <span class="stringliteral">                                        $err_code = PHPCAS_SERVICE_OK;</span>
+<a name="l02206"></a>02206 <span class="stringliteral">                                        $err_msg = &#39;</span><span class="stringliteral">&#39;;</span>
+<a name="l02207"></a>02207 <span class="stringliteral">                                        $pt = trim($proxy_success_list-&gt;item(0)-&gt;getElementsByTagName(&quot;proxyTicket&quot;)-&gt;item(0)-&gt;nodeValue);</span>
+<a name="l02208"></a>02208 <span class="stringliteral">                                        phpCAS::trace(&#39;</span>original PT: <span class="stringliteral">&#39;.trim($pt));</span>
+<a name="l02209"></a>02209 <span class="stringliteral">                                        phpCAS::traceEnd($pt);</span>
+<a name="l02210"></a>02210 <span class="stringliteral">                                        return $pt;</span>
+<a name="l02211"></a>02211 <span class="stringliteral">                                } else {</span>
+<a name="l02212"></a>02212 <span class="stringliteral">                                        phpCAS::trace(&#39;</span>&lt;proxySuccess&gt; was found, but not &lt;proxyTicket&gt;<span class="stringliteral">&#39;);</span>
+<a name="l02213"></a>02213 <span class="stringliteral">                                }</span>
+<a name="l02214"></a>02214 <span class="stringliteral">                        }</span>
+<a name="l02215"></a>02215 <span class="stringliteral">                        // look for a proxyFailure tag</span>
+<a name="l02216"></a>02216 <span class="stringliteral">                        else if ( $root-&gt;getElementsByTagName(&quot;proxyFailure&quot;)-&gt;length != 0) {</span>
+<a name="l02217"></a>02217 <span class="stringliteral">                                $proxy_failure_list = $root-&gt;getElementsByTagName(&quot;proxyFailure&quot;);</span>
+<a name="l02218"></a>02218 <span class="stringliteral"></span>
+<a name="l02219"></a>02219 <span class="stringliteral">                                // authentication failed, extract the error</span>
+<a name="l02220"></a>02220 <span class="stringliteral">                                $err_code = PHPCAS_SERVICE_PT_FAILURE;</span>
+<a name="l02221"></a>02221 <span class="stringliteral">                                $err_msg = &#39;</span>PT retrieving failed (code=`<span class="stringliteral">&#39;</span>
+<a name="l02222"></a>02222 <span class="stringliteral">                                .$proxy_failure_list-&gt;item(0)-&gt;getAttribute(&#39;</span>code<span class="stringliteral">&#39;)</span>
+<a name="l02223"></a>02223 <span class="stringliteral">                                .&#39;</span>\<span class="stringliteral">&#39;, message=`&#39;</span>
+<a name="l02224"></a>02224                                 .trim($proxy_failure_list-&gt;item(0)-&gt;nodeValue)
+<a name="l02225"></a>02225                                 .<span class="charliteral">&#39;\&#39;</span>)<span class="stringliteral">&#39;;</span>
+<a name="l02226"></a>02226 <span class="stringliteral">                                phpCAS::traceEnd(FALSE);</span>
+<a name="l02227"></a>02227 <span class="stringliteral">                                return FALSE;</span>
+<a name="l02228"></a>02228 <span class="stringliteral">                        } else {</span>
+<a name="l02229"></a>02229 <span class="stringliteral">                                phpCAS::trace(&#39;</span>neither &lt;proxySuccess&gt; nor &lt;proxyFailure&gt; found<span class="stringliteral">&#39;);</span>
+<a name="l02230"></a>02230 <span class="stringliteral">                        }</span>
+<a name="l02231"></a>02231 <span class="stringliteral">                }</span>
+<a name="l02232"></a>02232 <span class="stringliteral"></span>
+<a name="l02233"></a>02233 <span class="stringliteral">                // at this step, we are sure that the response of the CAS server was ill-formed</span>
+<a name="l02234"></a>02234 <span class="stringliteral">                $err_code = PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE;</span>
+<a name="l02235"></a>02235 <span class="stringliteral">                $err_msg = &#39;</span>Invalid response from the CAS server (response=`<span class="stringliteral">&#39;.$cas_response.&#39;</span>\<span class="charliteral">&#39;)&#39;</span>;
+<a name="l02236"></a>02236 
+<a name="l02237"></a>02237                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>(FALSE);
+<a name="l02238"></a>02238                 <span class="keywordflow">return</span> FALSE;
+<a name="l02239"></a>02239         }
+<a name="l02240"></a>02240         
+<a name="l02243"></a>02243         <span class="comment">// ########################################################################</span>
+<a name="l02244"></a>02244         <span class="comment">// READ CAS SERVER ANSWERS</span>
+<a name="l02245"></a>02245         <span class="comment">// ########################################################################</span>
+<a name="l02246"></a>02246         
+<a name="l02264"></a><a class="code" href="group__internalMisc.html#ga4a53dbb5ea834fc4593077481573b36e">02264</a>         <span class="keyword">private</span> function readURL($url, &amp;$headers, &amp;$body, &amp;$err_msg)
+<a name="l02265"></a>02265         {
+<a name="l02266"></a>02266                 $className = $this-&gt;_requestImplementation;
+<a name="l02267"></a>02267                 $request = <span class="keyword">new</span> $className();
+<a name="l02268"></a>02268 
+<a name="l02269"></a>02269                 <span class="keywordflow">if</span> (count($this-&gt;_curl_options)) {
+<a name="l02270"></a>02270                         $request-&gt;setCurlOptions($this-&gt;_curl_options);
+<a name="l02271"></a>02271                 }
+<a name="l02272"></a>02272 
+<a name="l02273"></a>02273                 $request-&gt;setUrl($url);
+<a name="l02274"></a>02274                 
+<a name="l02275"></a>02275                 <span class="keywordflow">if</span> (empty($this-&gt;_cas_server_ca_cert) &amp;&amp; !$this-&gt;_no_cas_server_validation) {
+<a name="l02276"></a>02276                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;one of the methods phpCAS::setCasServerCACert() or phpCAS::setNoCasServerValidation() must be called.&#39;</span>);
+<a name="l02277"></a>02277                 }
+<a name="l02278"></a>02278                 <span class="keywordflow">if</span> ($this-&gt;_cas_server_ca_cert != <span class="stringliteral">&#39;&#39;</span>) {
+<a name="l02279"></a>02279                         $request-&gt;setSslCaCert($this-&gt;_cas_server_ca_cert);
+<a name="l02280"></a>02280                 }
+<a name="l02281"></a>02281 
+<a name="l02282"></a>02282                 <span class="comment">// add extra stuff if SAML</span>
+<a name="l02283"></a>02283                 <span class="keywordflow">if</span> ($this-&gt;hasSA()) {
+<a name="l02284"></a>02284                         $request-&gt;addHeader(<span class="stringliteral">&quot;soapaction: http://www.oasis-open.org/committees/security&quot;</span>);
+<a name="l02285"></a>02285                         $request-&gt;addHeader(<span class="stringliteral">&quot;cache-control: no-cache&quot;</span>);
+<a name="l02286"></a>02286                         $request-&gt;addHeader(<span class="stringliteral">&quot;pragma: no-cache&quot;</span>);
+<a name="l02287"></a>02287                         $request-&gt;addHeader(<span class="stringliteral">&quot;accept: text/xml&quot;</span>);
+<a name="l02288"></a>02288                         $request-&gt;addHeader(<span class="stringliteral">&quot;connection: keep-alive&quot;</span>);
+<a name="l02289"></a>02289                         $request-&gt;addHeader(<span class="stringliteral">&quot;content-type: text/xml&quot;</span>);
+<a name="l02290"></a>02290                         $request-&gt;makePost();
+<a name="l02291"></a>02291                         $request-&gt;setPostBody($this-&gt;buildSAMLPayload());
+<a name="l02292"></a>02292                 }
+<a name="l02293"></a>02293 
+<a name="l02294"></a>02294                 <span class="keywordflow">if</span> ($request-&gt;send()) {
+<a name="l02295"></a>02295                         $headers = $request-&gt;getResponseHeaders();
+<a name="l02296"></a>02296                         $body = $request-&gt;getResponseBody();
+<a name="l02297"></a>02297                         $err_msg = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l02298"></a>02298                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l02299"></a>02299                 } <span class="keywordflow">else</span> {
+<a name="l02300"></a>02300                         $headers = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l02301"></a>02301                         $body = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l02302"></a>02302                         $err_msg = $request-&gt;getErrorMessage();
+<a name="l02303"></a>02303                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l02304"></a>02304                 }
+<a name="l02305"></a>02305         }
+<a name="l02306"></a>02306 
+<a name="l02312"></a><a class="code" href="group__internalMisc.html#ga03ddc75a7cdf1f5ba02d4818e1e603b6">02312</a>         <span class="keyword">private</span> function buildSAMLPayload()
+<a name="l02313"></a>02313         {
+<a name="l02314"></a>02314                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l02315"></a>02315 
+<a name="l02316"></a>02316                 <span class="comment">//get the ticket</span>
+<a name="l02317"></a>02317                 $sa = $this-&gt;getSA();
+<a name="l02318"></a>02318 
+<a name="l02319"></a>02319                 $body=<a class="code" href="group__public.html#ga65ee3a785f518156c26141fe132e5a27">SAML_SOAP_ENV</a>.SAML_SOAP_BODY.SAMLP_REQUEST.SAML_ASSERTION_ARTIFACT.$sa.SAML_ASSERTION_ARTIFACT_CLOSE.SAMLP_REQUEST_CLOSE.SAML_SOAP_BODY_CLOSE.SAML_SOAP_ENV_CLOSE;
+<a name="l02320"></a>02320 
+<a name="l02321"></a>02321                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>($body);
+<a name="l02322"></a>02322                 <span class="keywordflow">return</span> ($body);
+<a name="l02323"></a>02323         }
+<a name="l02324"></a>02324 
+<a name="l02325"></a><a class="code" href="group__internalMisc.html#ga2b0b79203463993ca19271ce06eb57df">02325</a>         <span class="keyword">private</span>  $_curl_headers = array();
+<a name="l02329"></a><a class="code" href="group__internalMisc.html#ga26a5099cda64d77d48bbafd6f3ba10ae">02329</a>         <span class="keyword">public</span> function _curl_read_headers($ch, $header)
+<a name="l02330"></a>02330         {
+<a name="l02331"></a>02331                 $this-&gt;_curl_headers[] = $header;
+<a name="l02332"></a>02332                 <span class="keywordflow">return</span> strlen($header);
+<a name="l02333"></a>02333         }
+<a name="l02334"></a>02334         
+<a name="l02337"></a>02337         <span class="comment">// ########################################################################</span>
+<a name="l02338"></a>02338         <span class="comment">// ACCESS TO EXTERNAL SERVICES</span>
+<a name="l02339"></a>02339         <span class="comment">// ########################################################################</span>
+<a name="l02340"></a>02340         
+<a name="l02359"></a><a class="code" href="group__internalProxyServices.html#ga2e0f5cb74d8116e3a9b9dc951f1cc3bf">02359</a>         <span class="keyword">public</span> function <a class="code" href="group__internalProxyServices.html#ga2e0f5cb74d8116e3a9b9dc951f1cc3bf">getProxiedService</a> ($type) {
+<a name="l02360"></a>02360                 <span class="keywordflow">switch</span> ($type) {
+<a name="l02361"></a>02361                         <span class="keywordflow">case</span> <a class="code" href="group__publicServices.html#ga801276ad2c3f6bd1ff8c953891f3693a">PHPCAS_PROXIED_SERVICE_HTTP_GET</a>:
+<a name="l02362"></a>02362                         <span class="keywordflow">case</span> <a class="code" href="group__publicServices.html#gaf6e2ec1349ecbe7d039df99ca450dd18">PHPCAS_PROXIED_SERVICE_HTTP_POST</a>:
+<a name="l02363"></a>02363                                 $requestClass = $this-&gt;_requestImplementation;
+<a name="l02364"></a>02364                                 $request = <span class="keyword">new</span> $requestClass(); 
+<a name="l02365"></a>02365                                 <span class="keywordflow">if</span> (count($this-&gt;_curl_options)) {
+<a name="l02366"></a>02366                                         $request-&gt;setCurlOptions($this-&gt;_curl_options);
+<a name="l02367"></a>02367                                 }
+<a name="l02368"></a>02368                                 $proxiedService = <span class="keyword">new</span> $type($request, $this-&gt;_serviceCookieJar);
+<a name="l02369"></a>02369                                 <span class="keywordflow">if</span> ($proxiedService instanceof <a class="code" href="interfaceCAS__ProxiedService__Testable.html">CAS_ProxiedService_Testable</a>)
+<a name="l02370"></a>02370                                         $proxiedService-&gt;setCasClient($this);
+<a name="l02371"></a>02371                                 <span class="keywordflow">return</span> $proxiedService;
+<a name="l02372"></a>02372                         <span class="keywordflow">case</span> PHPCAS_PROXIED_SERVICE_IMAP;
+<a name="l02373"></a>02373                                 $proxiedService = <span class="keyword">new</span> <a class="code" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a>($this-&gt;getUser());
+<a name="l02374"></a>02374                                 <span class="keywordflow">if</span> ($proxiedService instanceof CAS_ProxiedService_Testable)
+<a name="l02375"></a>02375                                         $proxiedService-&gt;setCasClient($this);
+<a name="l02376"></a>02376                                 <span class="keywordflow">return</span> $proxiedService;
+<a name="l02377"></a>02377                         <span class="keywordflow">default</span>:
+<a name="l02378"></a>02378                                 <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a>(<span class="stringliteral">&quot;Unknown proxied-service type, $type.&quot;</span>);
+<a name="l02379"></a>02379                 }
+<a name="l02380"></a>02380         }
+<a name="l02381"></a>02381         
+<a name="l02394"></a><a class="code" href="group__internalProxyServices.html#ga80ffa273c63053c94f8d2affd1091720">02394</a>         <span class="keyword">public</span> function <a class="code" href="group__internalProxyServices.html#ga80ffa273c63053c94f8d2affd1091720">initializeProxiedService</a> (<a class="code" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a> $proxiedService) {
+<a name="l02395"></a>02395                 $url = $proxiedService-&gt;<a class="code" href="interfaceCAS__ProxiedService.html#a60e1ce4d0228964a02f8747466011600">getServiceUrl</a>();
+<a name="l02396"></a>02396                 <span class="keywordflow">if</span> (!is_string($url))
+<a name="l02397"></a>02397                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a>(<span class="stringliteral">&quot;Proxied Service &quot;</span>.get_class($proxiedService).<span class="stringliteral">&quot;-&gt;getServiceUrl() should have returned a string, returned a &quot;</span>.gettype($url).<span class="stringliteral">&quot; instead.&quot;</span>);
+<a name="l02398"></a>02398                 
+<a name="l02399"></a>02399                 $pt = $this-&gt;retrievePT($url, $err_code, $err_msg);
+<a name="l02400"></a>02400                 <span class="keywordflow">if</span> (!$pt)
+<a name="l02401"></a>02401                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a>($err_msg, $err_code);
+<a name="l02402"></a>02402                 $proxiedService-&gt;<a class="code" href="interfaceCAS__ProxiedService.html#aca7cf518dffecf31b2a311a9b80589e4">setProxyTicket</a>($pt);
+<a name="l02403"></a>02403         }
+<a name="l02404"></a>02404 
+<a name="l02418"></a><a class="code" href="group__internalProxyServices.html#ga48201373f1bc2e02d48a8d337a5cd00e">02418</a>         <span class="keyword">public</span> function serviceWeb($url,&amp;$err_code,&amp;$output)
+<a name="l02419"></a>02419         {
+<a name="l02420"></a>02420                 <span class="keywordflow">try</span> {
+<a name="l02421"></a>02421                         $service = $this-&gt;getProxiedService(<a class="code" href="group__publicServices.html#ga801276ad2c3f6bd1ff8c953891f3693a">PHPCAS_PROXIED_SERVICE_HTTP_GET</a>);
+<a name="l02422"></a>02422                         $service-&gt;setUrl($url);
+<a name="l02423"></a>02423                         $service-&gt;send();
+<a name="l02424"></a>02424                         $output = $service-&gt;getResponseBody();
+<a name="l02425"></a>02425                         $err_code = PHPCAS_SERVICE_OK;
+<a name="l02426"></a>02426                         <span class="keywordflow">return</span> TRUE;
+<a name="l02427"></a>02427                 } <span class="keywordflow">catch</span> (<a class="code" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a> $e) {
+<a name="l02428"></a>02428                         $err_code = $e-&gt;getCode();
+<a name="l02429"></a>02429                         $output = $e-&gt;getMessage();
+<a name="l02430"></a>02430                         <span class="keywordflow">return</span> FALSE;
+<a name="l02431"></a>02431                 } <span class="keywordflow">catch</span> (<a class="code" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a> $e) {
+<a name="l02432"></a>02432                         $output = sprintf($this-&gt;getString(<a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>), $url, $e-&gt;getMessage());
+<a name="l02433"></a>02433                         $err_code = PHPCAS_SERVICE_NOT_AVAILABLE;
+<a name="l02434"></a>02434                         <span class="keywordflow">return</span> FALSE;
+<a name="l02435"></a>02435                 }
+<a name="l02436"></a>02436         }
+<a name="l02437"></a>02437 
+<a name="l02455"></a><a class="code" href="group__internalProxyServices.html#ga7c0c2ac8d3cc57a31728ae901bafab67">02455</a>         <span class="keyword">public</span> function serviceMail($url,<a class="code" href="config_8php.html#a92b2154d49731d7315ea689667265ec5">$serviceUrl</a>,$flags,&amp;$err_code,&amp;$err_msg,&amp;$pt)
+<a name="l02456"></a>02456         {
+<a name="l02457"></a>02457                 <span class="keywordflow">try</span> {
+<a name="l02458"></a>02458                         $service = $this-&gt;getProxiedService(<a class="code" href="group__publicServices.html#ga78c77beb2a5e39f1cf7a42b547dad39c">PHPCAS_PROXIED_SERVICE_IMAP</a>);
+<a name="l02459"></a>02459                         $service-&gt;setServiceUrl(<a class="code" href="config_8php.html#a92b2154d49731d7315ea689667265ec5">$serviceUrl</a>);
+<a name="l02460"></a>02460                         $service-&gt;setMailbox($url);
+<a name="l02461"></a>02461                         $service-&gt;setOptions($flags);
+<a name="l02462"></a>02462                         
+<a name="l02463"></a>02463                         $stream = $service-&gt;open();
+<a name="l02464"></a>02464                         $err_code = PHPCAS_SERVICE_OK;
+<a name="l02465"></a>02465                         $pt = $service-&gt;getImapProxyTicket();
+<a name="l02466"></a>02466                         <span class="keywordflow">return</span> $stream;
+<a name="l02467"></a>02467                 } <span class="keywordflow">catch</span> (<a class="code" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a> $e) {
+<a name="l02468"></a>02468                         $err_msg = $e-&gt;getMessage();
+<a name="l02469"></a>02469                         $err_code = $e-&gt;getCode();
+<a name="l02470"></a>02470                         $pt = FALSE;
+<a name="l02471"></a>02471                         <span class="keywordflow">return</span> FALSE;
+<a name="l02472"></a>02472                 } <span class="keywordflow">catch</span> (<a class="code" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a> $e) {
+<a name="l02473"></a>02473                         $err_msg = sprintf($this-&gt;getString(<a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>), $url, $e-&gt;getMessage());
+<a name="l02474"></a>02474                         $err_code = PHPCAS_SERVICE_NOT_AVAILABLE;
+<a name="l02475"></a>02475                         $pt = FALSE;
+<a name="l02476"></a>02476                         <span class="keywordflow">return</span> FALSE;
+<a name="l02477"></a>02477                 }
+<a name="l02478"></a>02478         }
+<a name="l02479"></a>02479 
+<a name="l02482"></a>02482         <span class="comment">// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span>
+<a name="l02483"></a>02483         <span class="comment">// XX                                                                    XX</span>
+<a name="l02484"></a>02484         <span class="comment">// XX                  PROXIED CLIENT FEATURES (CAS 2.0)                 XX</span>
+<a name="l02485"></a>02485         <span class="comment">// XX                                                                    XX</span>
+<a name="l02486"></a>02486         <span class="comment">// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span>
+<a name="l02487"></a>02487 
+<a name="l02488"></a>02488         <span class="comment">// ########################################################################</span>
+<a name="l02489"></a>02489         <span class="comment">//  PT</span>
+<a name="l02490"></a>02490         <span class="comment">// ########################################################################</span>
+<a name="l02503"></a><a class="code" href="group__internalProxied.html#ga0345fd992cc17a481dd37e1d5c19f595">02503</a> <span class="comment"></span>        <span class="keyword">private</span>  $_pt = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l02504"></a>02504 
+<a name="l02509"></a><a class="code" href="group__internalProxied.html#ga9f6fe06d8349d51a53a1397b6fb266f0">02509</a>         <span class="keyword">public</span> function getPT()
+<a name="l02510"></a>02510         {
+<a name="l02511"></a>02511                 <span class="comment">//      return &#39;ST&#39;.substr($this-&gt;_pt, 2);</span>
+<a name="l02512"></a>02512                 <span class="keywordflow">return</span> $this-&gt;_pt;
+<a name="l02513"></a>02513         }
+<a name="l02514"></a>02514 
+<a name="l02519"></a><a class="code" href="group__internalProxied.html#gaad9f4d2b7243796555c01edecc85006e">02519</a>         <span class="keyword">public</span> function setPT($pt)
+<a name="l02520"></a>02520         { $this-&gt;_pt = $pt; }
+<a name="l02521"></a>02521 
+<a name="l02526"></a><a class="code" href="group__internalProxied.html#gafd4a9d8c389825ed8b23331493fde437">02526</a>         <span class="keyword">public</span> function hasPT()
+<a name="l02527"></a>02527         { <span class="keywordflow">return</span> !empty($this-&gt;_pt); }
+<a name="l02528"></a>02528         
+<a name="l02529"></a>02529         
+<a name="l02538"></a><a class="code" href="group__internalProxied.html#ga082ab34c6c2bf014314fe02504c4ad67">02538</a>         <span class="keyword">private</span> $_proxies = array();
+<a name="l02539"></a>02539         
+<a name="l02550"></a><a class="code" href="group__internalProxied.html#gac97879b556d2b09f5e3b6ba2bfe33a2c">02550</a>         <span class="keyword">public</span> function <a class="code" href="group__internalProxied.html#gac97879b556d2b09f5e3b6ba2bfe33a2c">getProxies</a> () {
+<a name="l02551"></a>02551                 <span class="keywordflow">return</span> $this-&gt;_proxies;
+<a name="l02552"></a>02552         }
+<a name="l02553"></a>02553         
+<a name="l02562"></a><a class="code" href="group__internalProxied.html#ga5afeadecc91ada8d11abc1ec74bdefd5">02562</a>         <span class="keyword">private</span> function <a class="code" href="group__internalProxied.html#ga5afeadecc91ada8d11abc1ec74bdefd5">setProxies</a> ($proxies) {
+<a name="l02563"></a>02563                 $this-&gt;_proxies = $proxies;
+<a name="l02564"></a>02564         }
+<a name="l02565"></a>02565         
+<a name="l02566"></a>02566 
+<a name="l02568"></a>02568         <span class="comment">// ########################################################################</span>
+<a name="l02569"></a>02569         <span class="comment">//  PT VALIDATION</span>
+<a name="l02570"></a>02570         <span class="comment">// ########################################################################</span>
+<a name="l02581"></a><a class="code" href="group__internalProxied.html#ga5aa61d302edfacbaaf176a94bf228807">02581</a> <span class="comment"></span>        <span class="keyword">public</span> function validatePT(&amp;$validate_url,&amp;$text_response,&amp;$tree_response)
+<a name="l02582"></a>02582         {
+<a name="l02583"></a>02583                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l02584"></a>02584                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>($text_response);
+<a name="l02585"></a>02585                 <span class="comment">// build the URL to validate the ticket</span>
+<a name="l02586"></a>02586                 $validate_url = $this-&gt;getServerProxyValidateURL().<span class="stringliteral">&#39;&amp;ticket=&#39;</span>.$this-&gt;getPT();
+<a name="l02587"></a>02587 
+<a name="l02588"></a>02588                 <span class="keywordflow">if</span> ( $this-&gt;isProxy() ) {
+<a name="l02589"></a>02589                         <span class="comment">// pass the callback url for CAS proxies</span>
+<a name="l02590"></a>02590                         $validate_url .= <span class="stringliteral">&#39;&amp;pgtUrl=&#39;</span>.urlencode($this-&gt;getCallbackURL());
+<a name="l02591"></a>02591                 }
+<a name="l02592"></a>02592 
+<a name="l02593"></a>02593                 <span class="comment">// open and read the URL</span>
+<a name="l02594"></a>02594                 <span class="keywordflow">if</span> ( !$this-&gt;readURL($validate_url,$headers,$text_response,$err_msg) ) {
+<a name="l02595"></a>02595                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;could not open URL \&#39;&#39;</span>.$validate_url.<span class="charliteral">&#39;\&#39;</span> to validate (<span class="stringliteral">&#39;.$err_msg.&#39;</span>)<span class="stringliteral">&#39;);</span>
+<a name="l02596"></a>02596 <span class="stringliteral">                        $this-&gt;authError(&#39;</span>PT not validated<span class="stringliteral">&#39;,</span>
+<a name="l02597"></a>02597 <span class="stringliteral">                        $validate_url,</span>
+<a name="l02598"></a>02598 <span class="stringliteral">                        TRUE/*$no_response*/);</span>
+<a name="l02599"></a>02599 <span class="stringliteral">                }</span>
+<a name="l02600"></a>02600 <span class="stringliteral"></span>
+<a name="l02601"></a>02601 <span class="stringliteral">                // create new DOMDocument object</span>
+<a name="l02602"></a>02602 <span class="stringliteral">                $dom = new DOMDocument();</span>
+<a name="l02603"></a>02603 <span class="stringliteral">                // Fix possible whitspace problems</span>
+<a name="l02604"></a>02604 <span class="stringliteral">                $dom-&gt;preserveWhiteSpace = false;</span>
+<a name="l02605"></a>02605 <span class="stringliteral">                // read the response of the CAS server into a DOMDocument object</span>
+<a name="l02606"></a>02606 <span class="stringliteral">                if ( !($dom-&gt;loadXML($text_response))) {</span>
+<a name="l02607"></a>02607 <span class="stringliteral">                        // read failed</span>
+<a name="l02608"></a>02608 <span class="stringliteral">                        $this-&gt;authError(&#39;</span>PT not validated<span class="stringliteral">&#39;,</span>
+<a name="l02609"></a>02609 <span class="stringliteral">                        $validate_url,</span>
+<a name="l02610"></a>02610 <span class="stringliteral">                        FALSE/*$no_response*/,</span>
+<a name="l02611"></a>02611 <span class="stringliteral">                        TRUE/*$bad_response*/,</span>
+<a name="l02612"></a>02612 <span class="stringliteral">                        $text_response);</span>
+<a name="l02613"></a>02613 <span class="stringliteral">                }</span>
+<a name="l02614"></a>02614 <span class="stringliteral"></span>
+<a name="l02615"></a>02615 <span class="stringliteral">                // read the root node of the XML tree</span>
+<a name="l02616"></a>02616 <span class="stringliteral">                if ( !($tree_response = $dom-&gt;documentElement) ) {</span>
+<a name="l02617"></a>02617 <span class="stringliteral">                        // read failed</span>
+<a name="l02618"></a>02618 <span class="stringliteral">                        $this-&gt;authError(&#39;</span>PT not validated<span class="stringliteral">&#39;,</span>
+<a name="l02619"></a>02619 <span class="stringliteral">                        $validate_url,</span>
+<a name="l02620"></a>02620 <span class="stringliteral">                        FALSE/*$no_response*/,</span>
+<a name="l02621"></a>02621 <span class="stringliteral">                        TRUE/*$bad_response*/,</span>
+<a name="l02622"></a>02622 <span class="stringliteral">                        $text_response);</span>
+<a name="l02623"></a>02623 <span class="stringliteral">                }</span>
+<a name="l02624"></a>02624 <span class="stringliteral">                // insure that tag name is &#39;</span>serviceResponse<span class="stringliteral">&#39;</span>
+<a name="l02625"></a>02625 <span class="stringliteral">                if ( $tree_response-&gt;localName != &#39;</span>serviceResponse<span class="stringliteral">&#39; ) {</span>
+<a name="l02626"></a>02626 <span class="stringliteral">                        // bad root node</span>
+<a name="l02627"></a>02627 <span class="stringliteral">                        $this-&gt;authError(&#39;</span>PT not validated<span class="stringliteral">&#39;,</span>
+<a name="l02628"></a>02628 <span class="stringliteral">                        $validate_url,</span>
+<a name="l02629"></a>02629 <span class="stringliteral">                        FALSE/*$no_response*/,</span>
+<a name="l02630"></a>02630 <span class="stringliteral">                        TRUE/*$bad_response*/,</span>
+<a name="l02631"></a>02631 <span class="stringliteral">                        $text_response);</span>
+<a name="l02632"></a>02632 <span class="stringliteral">                }</span>
+<a name="l02633"></a>02633 <span class="stringliteral">                if ( $tree_response-&gt;getElementsByTagName(&quot;authenticationSuccess&quot;)-&gt;length != 0) {</span>
+<a name="l02634"></a>02634 <span class="stringliteral">                        // authentication succeded, extract the user name</span>
+<a name="l02635"></a>02635 <span class="stringliteral">                        $success_elements = $tree_response-&gt;getElementsByTagName(&quot;authenticationSuccess&quot;);</span>
+<a name="l02636"></a>02636 <span class="stringliteral">                        if ( $success_elements-&gt;item(0)-&gt;getElementsByTagName(&quot;user&quot;)-&gt;length == 0) {</span>
+<a name="l02637"></a>02637 <span class="stringliteral">                                // no user specified =&gt; error</span>
+<a name="l02638"></a>02638 <span class="stringliteral">                                $this-&gt;authError(&#39;</span>PT not validated<span class="stringliteral">&#39;,</span>
+<a name="l02639"></a>02639 <span class="stringliteral">                                $validate_url,</span>
+<a name="l02640"></a>02640 <span class="stringliteral">                                FALSE/*$no_response*/,</span>
+<a name="l02641"></a>02641 <span class="stringliteral">                                TRUE/*$bad_response*/,</span>
+<a name="l02642"></a>02642 <span class="stringliteral">                                $text_response);</span>
+<a name="l02643"></a>02643 <span class="stringliteral">                        }</span>
+<a name="l02644"></a>02644 <span class="stringliteral"></span>
+<a name="l02645"></a>02645 <span class="stringliteral">                        $this-&gt;setUser(trim($success_elements-&gt;item(0)-&gt;getElementsByTagName(&quot;user&quot;)-&gt;item(0)-&gt;nodeValue));</span>
+<a name="l02646"></a>02646 <span class="stringliteral">                        $this-&gt;readExtraAttributesCas20($success_elements);</span>
+<a name="l02647"></a>02647 <span class="stringliteral">                        </span>
+<a name="l02648"></a>02648 <span class="stringliteral">                        // Store the proxies we are sitting behind for authorization checking</span>
+<a name="l02649"></a>02649 <span class="stringliteral">                        if ( sizeof($arr = $success_elements-&gt;item(0)-&gt;getElementsByTagName(&quot;proxy&quot;)) &gt; 0) {</span>
+<a name="l02650"></a>02650 <span class="stringliteral">                                foreach ($arr as $proxyElem) {</span>
+<a name="l02651"></a>02651 <span class="stringliteral">                                        phpCAS::trace(&quot;Storing Proxy: &quot;.$proxyElem-&gt;nodeValue);</span>
+<a name="l02652"></a>02652 <span class="stringliteral">                                        $this-&gt;_proxies[] = trim($proxyElem-&gt;nodeValue);</span>
+<a name="l02653"></a>02653 <span class="stringliteral">                                }</span>
+<a name="l02654"></a>02654 <span class="stringliteral">                                $_SESSION[&#39;</span><a class="code" href="classphpCAS.html">phpCAS</a><span class="stringliteral">&#39;][&#39;</span>proxies<span class="stringliteral">&#39;] = $this-&gt;_proxies;</span>
+<a name="l02655"></a>02655 <span class="stringliteral">                        }</span>
+<a name="l02656"></a>02656 <span class="stringliteral">                        </span>
+<a name="l02657"></a>02657 <span class="stringliteral">                } else if ( $tree_response-&gt;getElementsByTagName(&quot;authenticationFailure&quot;)-&gt;length != 0) {</span>
+<a name="l02658"></a>02658 <span class="stringliteral">                        // authentication succeded, extract the error code and message</span>
+<a name="l02659"></a>02659 <span class="stringliteral">                        $auth_fail_list = $tree_response-&gt;getElementsByTagName(&quot;authenticationFailure&quot;);</span>
+<a name="l02660"></a>02660 <span class="stringliteral">                        $this-&gt;authError(&#39;</span>PT not validated<span class="stringliteral">&#39;,</span>
+<a name="l02661"></a>02661 <span class="stringliteral">                        $validate_url,</span>
+<a name="l02662"></a>02662 <span class="stringliteral">                        FALSE/*$no_response*/,</span>
+<a name="l02663"></a>02663 <span class="stringliteral">                        FALSE/*$bad_response*/,</span>
+<a name="l02664"></a>02664 <span class="stringliteral">                        $text_response,</span>
+<a name="l02665"></a>02665 <span class="stringliteral">                        $auth_fail_list-&gt;item(0)-&gt;getAttribute(&#39;</span>code<span class="stringliteral">&#39;)/*$err_code*/,</span>
+<a name="l02666"></a>02666 <span class="stringliteral">                        trim($auth_fail_list-&gt;item(0)-&gt;nodeValue)/*$err_msg*/);</span>
+<a name="l02667"></a>02667 <span class="stringliteral">                } else {</span>
+<a name="l02668"></a>02668 <span class="stringliteral">                        $this-&gt;authError(&#39;</span>PT not validated<span class="stringliteral">&#39;,</span>
+<a name="l02669"></a>02669 <span class="stringliteral">                        $validate_url,</span>
+<a name="l02670"></a>02670 <span class="stringliteral">                        FALSE/*$no_response*/,</span>
+<a name="l02671"></a>02671 <span class="stringliteral">                        TRUE/*$bad_response*/,</span>
+<a name="l02672"></a>02672 <span class="stringliteral">                        $text_response);</span>
+<a name="l02673"></a>02673 <span class="stringliteral">                }</span>
+<a name="l02674"></a>02674 <span class="stringliteral"></span>
+<a name="l02675"></a>02675 <span class="stringliteral">                $this-&gt;renameSession($this-&gt;getPT());</span>
+<a name="l02676"></a>02676 <span class="stringliteral">                // at this step, PT has been validated and $this-&gt;_user has been set,</span>
+<a name="l02677"></a>02677 <span class="stringliteral"></span>
+<a name="l02678"></a>02678 <span class="stringliteral">                phpCAS::traceEnd(TRUE);</span>
+<a name="l02679"></a>02679 <span class="stringliteral">                return TRUE;</span>
+<a name="l02680"></a>02680 <span class="stringliteral">        }</span>
+<a name="l02681"></a>02681 <span class="stringliteral">        </span>
+<a name="l02682"></a>02682 <span class="stringliteral">        </span>
+<a name="l02690"></a><a class="code" href="group__internalProxied.html#ga7d1f0e097dcfe2a4c2576b2be012a13c">02690</a> <span class="stringliteral">        private function readExtraAttributesCas20($success_elements)</span>
+<a name="l02691"></a>02691 <span class="stringliteral">        {</span>
+<a name="l02692"></a>02692 <span class="stringliteral">                # PHPCAS-43 add CAS-2.0 extra attributes</span>
+<a name="l02693"></a>02693 <span class="stringliteral">                phpCAS::traceBegin();</span>
+<a name="l02694"></a>02694 <span class="stringliteral"></span>
+<a name="l02695"></a>02695 <span class="stringliteral">                $extra_attributes = array();</span>
+<a name="l02696"></a>02696 <span class="stringliteral">                </span>
+<a name="l02697"></a>02697 <span class="stringliteral">                // &quot;Jasig Style&quot; Attributes:</span>
+<a name="l02698"></a>02698 <span class="stringliteral">                // </span>
+<a name="l02699"></a>02699 <span class="stringliteral">                //      &lt;cas:serviceResponse xmlns:cas=&#39;</span>http:<span class="comment">//www.yale.edu/tp/cas&#39;&gt;</span>
+<a name="l02700"></a>02700                 <span class="comment">//              &lt;cas:authenticationSuccess&gt;</span>
+<a name="l02701"></a>02701                 <span class="comment">//                      &lt;cas:user&gt;jsmith&lt;/cas:user&gt;</span>
+<a name="l02702"></a>02702                 <span class="comment">//                      &lt;cas:attributes&gt;</span>
+<a name="l02703"></a>02703                 <span class="comment">//                              &lt;cas:attraStyle&gt;RubyCAS&lt;/cas:attraStyle&gt;</span>
+<a name="l02704"></a>02704                 <span class="comment">//                              &lt;cas:surname&gt;Smith&lt;/cas:surname&gt;</span>
+<a name="l02705"></a>02705                 <span class="comment">//                              &lt;cas:givenName&gt;John&lt;/cas:givenName&gt;</span>
+<a name="l02706"></a>02706                 <span class="comment">//                              &lt;cas:memberOf&gt;CN=Staff,OU=Groups,DC=example,DC=edu&lt;/cas:memberOf&gt;</span>
+<a name="l02707"></a>02707                 <span class="comment">//                              &lt;cas:memberOf&gt;CN=Spanish Department,OU=Departments,OU=Groups,DC=example,DC=edu&lt;/cas:memberOf&gt;</span>
+<a name="l02708"></a>02708                 <span class="comment">//                      &lt;/cas:attributes&gt;</span>
+<a name="l02709"></a>02709                 <span class="comment">//                      &lt;cas:proxyGrantingTicket&gt;PGTIOU-84678-8a9d2sfa23casd&lt;/cas:proxyGrantingTicket&gt;</span>
+<a name="l02710"></a>02710                 <span class="comment">//              &lt;/cas:authenticationSuccess&gt;</span>
+<a name="l02711"></a>02711                 <span class="comment">//      &lt;/cas:serviceResponse&gt;</span>
+<a name="l02712"></a>02712                 <span class="comment">// </span>
+<a name="l02713"></a>02713                 <span class="keywordflow">if</span> ( $success_elements-&gt;item(0)-&gt;getElementsByTagName(<span class="stringliteral">&quot;attributes&quot;</span>)-&gt;length != 0) {
+<a name="l02714"></a>02714                         $attr_nodes = $success_elements-&gt;item(0)-&gt;getElementsByTagName(<span class="stringliteral">&quot;attributes&quot;</span>);
+<a name="l02715"></a>02715                         phpCas :: trace(<span class="stringliteral">&quot;Found nested jasig style attributes&quot;</span>);
+<a name="l02716"></a>02716                         <span class="keywordflow">if</span>($attr_nodes-&gt;item(0)-&gt;hasChildNodes()){
+<a name="l02717"></a>02717                                 <span class="comment">// Nested Attributes</span>
+<a name="l02718"></a>02718                                 <span class="keywordflow">foreach</span> ($attr_nodes-&gt;item(0)-&gt;childNodes as $attr_child) {
+<a name="l02719"></a>02719                                         phpCas :: trace(<span class="stringliteral">&quot;Attribute [&quot;</span>.$attr_child-&gt;localName.<span class="stringliteral">&quot;] = &quot;</span>.$attr_child-&gt;nodeValue);
+<a name="l02720"></a>02720                                         $this-&gt;addAttributeToArray($extra_attributes, $attr_child-&gt;localName, $attr_child-&gt;nodeValue);
+<a name="l02721"></a>02721                                 }
+<a name="l02722"></a>02722                         }
+<a name="l02723"></a>02723                 } 
+<a name="l02724"></a>02724                 <span class="comment">// &quot;RubyCAS Style&quot; attributes</span>
+<a name="l02725"></a>02725                 <span class="comment">// </span>
+<a name="l02726"></a>02726                 <span class="comment">//      &lt;cas:serviceResponse xmlns:cas=&#39;http://www.yale.edu/tp/cas&#39;&gt;</span>
+<a name="l02727"></a>02727                 <span class="comment">//              &lt;cas:authenticationSuccess&gt;</span>
+<a name="l02728"></a>02728                 <span class="comment">//                      &lt;cas:user&gt;jsmith&lt;/cas:user&gt;</span>
+<a name="l02729"></a>02729                 <span class="comment">//                      </span>
+<a name="l02730"></a>02730                 <span class="comment">//                      &lt;cas:attraStyle&gt;RubyCAS&lt;/cas:attraStyle&gt;</span>
+<a name="l02731"></a>02731                 <span class="comment">//                      &lt;cas:surname&gt;Smith&lt;/cas:surname&gt;</span>
+<a name="l02732"></a>02732                 <span class="comment">//                      &lt;cas:givenName&gt;John&lt;/cas:givenName&gt;</span>
+<a name="l02733"></a>02733                 <span class="comment">//                      &lt;cas:memberOf&gt;CN=Staff,OU=Groups,DC=example,DC=edu&lt;/cas:memberOf&gt;</span>
+<a name="l02734"></a>02734                 <span class="comment">//                      &lt;cas:memberOf&gt;CN=Spanish Department,OU=Departments,OU=Groups,DC=example,DC=edu&lt;/cas:memberOf&gt;</span>
+<a name="l02735"></a>02735                 <span class="comment">//                      </span>
+<a name="l02736"></a>02736                 <span class="comment">//                      &lt;cas:proxyGrantingTicket&gt;PGTIOU-84678-8a9d2sfa23casd&lt;/cas:proxyGrantingTicket&gt;</span>
+<a name="l02737"></a>02737                 <span class="comment">//              &lt;/cas:authenticationSuccess&gt;</span>
+<a name="l02738"></a>02738                 <span class="comment">//      &lt;/cas:serviceResponse&gt;</span>
+<a name="l02739"></a>02739                 <span class="comment">// </span>
+<a name="l02740"></a>02740                 <span class="keywordflow">else</span> {
+<a name="l02741"></a>02741                         phpCas :: trace(<span class="stringliteral">&quot;Testing for rubycas style attributes&quot;</span>);
+<a name="l02742"></a>02742                         $childnodes = $success_elements-&gt;item(0)-&gt;childNodes;
+<a name="l02743"></a>02743                         <span class="keywordflow">foreach</span> ($childnodes as $attr_node) {
+<a name="l02744"></a>02744                                 <span class="keywordflow">switch</span> ($attr_node-&gt;localName) {
+<a name="l02745"></a>02745                                         <span class="keywordflow">case</span> <span class="stringliteral">&#39;user&#39;</span>:
+<a name="l02746"></a>02746                                         <span class="keywordflow">case</span> <span class="stringliteral">&#39;proxies&#39;</span>:
+<a name="l02747"></a>02747                                         <span class="keywordflow">case</span> <span class="stringliteral">&#39;proxyGrantingTicket&#39;</span>:
+<a name="l02748"></a>02748                                                 <span class="keywordflow">continue</span>;
+<a name="l02749"></a>02749                                         <span class="keywordflow">default</span>:
+<a name="l02750"></a>02750                                                 <span class="keywordflow">if</span> (strlen(trim($attr_node-&gt;nodeValue))) {
+<a name="l02751"></a>02751                                                         phpCas :: trace(<span class="stringliteral">&quot;Attribute [&quot;</span>.$attr_node-&gt;localName.<span class="stringliteral">&quot;] = &quot;</span>.$attr_node-&gt;nodeValue);
+<a name="l02752"></a>02752                                                         $this-&gt;addAttributeToArray($extra_attributes, $attr_node-&gt;localName, $attr_node-&gt;nodeValue);
+<a name="l02753"></a>02753                                                 }
+<a name="l02754"></a>02754                                 }
+<a name="l02755"></a>02755                         }
+<a name="l02756"></a>02756                 }
+<a name="l02757"></a>02757                 
+<a name="l02758"></a>02758                 <span class="comment">// &quot;Name-Value&quot; attributes.</span>
+<a name="l02759"></a>02759                 <span class="comment">// </span>
+<a name="l02760"></a>02760                 <span class="comment">// Attribute format from these mailing list thread:</span>
+<a name="l02761"></a>02761                 <span class="comment">// http://jasig.275507.n4.nabble.com/CAS-attributes-and-how-they-appear-in-the-CAS-response-td264272.html</span>
+<a name="l02762"></a>02762                 <span class="comment">// Note: This is a less widely used format, but in use by at least two institutions.</span>
+<a name="l02763"></a>02763                 <span class="comment">// </span>
+<a name="l02764"></a>02764                 <span class="comment">//      &lt;cas:serviceResponse xmlns:cas=&#39;http://www.yale.edu/tp/cas&#39;&gt;</span>
+<a name="l02765"></a>02765                 <span class="comment">//              &lt;cas:authenticationSuccess&gt;</span>
+<a name="l02766"></a>02766                 <span class="comment">//                      &lt;cas:user&gt;jsmith&lt;/cas:user&gt;</span>
+<a name="l02767"></a>02767                 <span class="comment">//                      </span>
+<a name="l02768"></a>02768                 <span class="comment">//                      &lt;cas:attribute name=&#39;attraStyle&#39; value=&#39;Name-Value&#39; /&gt;</span>
+<a name="l02769"></a>02769                 <span class="comment">//                      &lt;cas:attribute name=&#39;surname&#39; value=&#39;Smith&#39; /&gt;</span>
+<a name="l02770"></a>02770                 <span class="comment">//                      &lt;cas:attribute name=&#39;givenName&#39; value=&#39;John&#39; /&gt;</span>
+<a name="l02771"></a>02771                 <span class="comment">//                      &lt;cas:attribute name=&#39;memberOf&#39; value=&#39;CN=Staff,OU=Groups,DC=example,DC=edu&#39; /&gt;</span>
+<a name="l02772"></a>02772                 <span class="comment">//                      &lt;cas:attribute name=&#39;memberOf&#39; value=&#39;CN=Spanish Department,OU=Departments,OU=Groups,DC=example,DC=edu&#39; /&gt;</span>
+<a name="l02773"></a>02773                 <span class="comment">//                      </span>
+<a name="l02774"></a>02774                 <span class="comment">//                      &lt;cas:proxyGrantingTicket&gt;PGTIOU-84678-8a9d2sfa23casd&lt;/cas:proxyGrantingTicket&gt;</span>
+<a name="l02775"></a>02775                 <span class="comment">//              &lt;/cas:authenticationSuccess&gt;</span>
+<a name="l02776"></a>02776                 <span class="comment">//      &lt;/cas:serviceResponse&gt;</span>
+<a name="l02777"></a>02777                 <span class="comment">// </span>
+<a name="l02778"></a>02778                 <span class="keywordflow">if</span> (!count($extra_attributes) &amp;&amp; $success_elements-&gt;item(0)-&gt;getElementsByTagName(<span class="stringliteral">&quot;attribute&quot;</span>)-&gt;length != 0) {
+<a name="l02779"></a>02779                         $attr_nodes = $success_elements-&gt;item(0)-&gt;getElementsByTagName(<span class="stringliteral">&quot;attribute&quot;</span>);
+<a name="l02780"></a>02780                         $firstAttr = $attr_nodes-&gt;item(0);
+<a name="l02781"></a>02781                         <span class="keywordflow">if</span> (!$firstAttr-&gt;hasChildNodes() &amp;&amp; $firstAttr-&gt;hasAttribute(<span class="stringliteral">&#39;name&#39;</span>) &amp;&amp; $firstAttr-&gt;hasAttribute(<span class="stringliteral">&#39;value&#39;</span>)) {
+<a name="l02782"></a>02782                                 phpCas :: trace(<span class="stringliteral">&quot;Found Name-Value style attributes&quot;</span>);
+<a name="l02783"></a>02783                                 <span class="comment">// Nested Attributes</span>
+<a name="l02784"></a>02784                                 <span class="keywordflow">foreach</span> ($attr_nodes as $attr_node) {
+<a name="l02785"></a>02785                                         <span class="keywordflow">if</span> ($attr_node-&gt;hasAttribute(<span class="stringliteral">&#39;name&#39;</span>) &amp;&amp; $attr_node-&gt;hasAttribute(<span class="stringliteral">&#39;value&#39;</span>)) {
+<a name="l02786"></a>02786                                                 phpCas :: trace(<span class="stringliteral">&quot;Attribute [&quot;</span>.$attr_node-&gt;getAttribute(<span class="stringliteral">&#39;name&#39;</span>).<span class="stringliteral">&quot;] = &quot;</span>.$attr_node-&gt;getAttribute(<span class="stringliteral">&#39;value&#39;</span>));
+<a name="l02787"></a>02787                                                 $this-&gt;addAttributeToArray($extra_attributes, $attr_node-&gt;getAttribute(<span class="stringliteral">&#39;name&#39;</span>), $attr_node-&gt;getAttribute(<span class="stringliteral">&#39;value&#39;</span>));
+<a name="l02788"></a>02788                                         }
+<a name="l02789"></a>02789                                 }
+<a name="l02790"></a>02790                         }
+<a name="l02791"></a>02791                 }
+<a name="l02792"></a>02792                 
+<a name="l02793"></a>02793                 $this-&gt;setAttributes($extra_attributes);
+<a name="l02794"></a>02794                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l02795"></a>02795                 <span class="keywordflow">return</span> TRUE;
+<a name="l02796"></a>02796         }
+<a name="l02797"></a>02797         
+<a name="l02806"></a><a class="code" href="group__internalProxied.html#gabfbdb4ba817d27bf951b9bce6154f4f7">02806</a>         <span class="keyword">private</span> function <a class="code" href="group__internalProxied.html#gabfbdb4ba817d27bf951b9bce6154f4f7">addAttributeToArray</a> (array &amp;$attributeArray, $name, $value) {
+<a name="l02807"></a>02807                 <span class="comment">// If multiple attributes exist, add as an array value</span>
+<a name="l02808"></a>02808                 <span class="keywordflow">if</span> (isset($attributeArray[$name])) {
+<a name="l02809"></a>02809                         <span class="comment">// Initialize the array with the existing value</span>
+<a name="l02810"></a>02810                         <span class="keywordflow">if</span> (!is_array($attributeArray[$name])) {
+<a name="l02811"></a>02811                                 $existingValue = $attributeArray[$name];
+<a name="l02812"></a>02812                                 $attributeArray[$name] = array($existingValue);
+<a name="l02813"></a>02813                         }
+<a name="l02814"></a>02814                         
+<a name="l02815"></a>02815                         $attributeArray[$name][] = trim($value);
+<a name="l02816"></a>02816                 } <span class="keywordflow">else</span> {
+<a name="l02817"></a>02817                         $attributeArray[$name] = trim($value);
+<a name="l02818"></a>02818                 }
+<a name="l02819"></a>02819         }
+<a name="l02820"></a>02820 
+<a name="l02823"></a>02823         <span class="comment">// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span>
+<a name="l02824"></a>02824         <span class="comment">// XX                                                                    XX</span>
+<a name="l02825"></a>02825         <span class="comment">// XX                               MISC                                 XX</span>
+<a name="l02826"></a>02826         <span class="comment">// XX                                                                    XX</span>
+<a name="l02827"></a>02827         <span class="comment">// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span>
+<a name="l02828"></a>02828 
+<a name="l02834"></a>02834         <span class="comment">// ########################################################################</span>
+<a name="l02835"></a>02835         <span class="comment">//  URL</span>
+<a name="l02836"></a>02836         <span class="comment">// ########################################################################</span>
+<a name="l02843"></a><a class="code" href="group__internalMisc.html#gaed9c4090f713574a6df8fdc2e32409ca">02843</a> <span class="comment"></span>        <span class="keyword">private</span> $_url = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l02844"></a>02844 
+<a name="l02845"></a>02845         
+<a name="l02851"></a><a class="code" href="group__internalMisc.html#ga8bd9440411c9be24e955c9edd74e49de">02851</a>         <span class="keyword">public</span> function setURL($url)
+<a name="l02852"></a>02852         {
+<a name="l02853"></a>02853                 $this-&gt;_url = $url;
+<a name="l02854"></a>02854         }
+<a name="l02855"></a>02855         
+<a name="l02862"></a><a class="code" href="group__internalMisc.html#gaa7564ffa02c80ebf8ec2d7238a22f9e0">02862</a>         <span class="keyword">public</span> function getURL()
+<a name="l02863"></a>02863         {
+<a name="l02864"></a>02864                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l02865"></a>02865                 <span class="comment">// the URL is built when needed only</span>
+<a name="l02866"></a>02866                 <span class="keywordflow">if</span> ( empty($this-&gt;_url) ) {
+<a name="l02867"></a>02867                         $final_uri = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l02868"></a>02868                         <span class="comment">// remove the ticket if present in the URL</span>
+<a name="l02869"></a>02869                         $final_uri = ($this-&gt;isHttps()) ? <span class="stringliteral">&#39;https&#39;</span> : <span class="stringliteral">&#39;http&#39;</span>;
+<a name="l02870"></a>02870                         $final_uri .= <span class="stringliteral">&#39;://&#39;</span>;
+<a name="l02871"></a>02871 
+<a name="l02872"></a>02872                         $final_uri .= $this-&gt;getServerUrl();
+<a name="l02873"></a>02873                         $request_uri    = explode(<span class="charliteral">&#39;?&#39;</span>, $_SERVER[<span class="stringliteral">&#39;REQUEST_URI&#39;</span>], 2);
+<a name="l02874"></a>02874                         $final_uri              .= $request_uri[0];
+<a name="l02875"></a>02875                                 
+<a name="l02876"></a>02876                         <span class="keywordflow">if</span> (isset($request_uri[1]) &amp;&amp; $request_uri[1])
+<a name="l02877"></a>02877                         {
+<a name="l02878"></a>02878                                 $query_string   = $this-&gt;removeParameterFromQueryString(<span class="stringliteral">&#39;ticket&#39;</span>, $request_uri[1]);
+<a name="l02879"></a>02879 
+<a name="l02880"></a>02880                                 <span class="comment">// If the query string still has anything left, append it to the final URI</span>
+<a name="l02881"></a>02881                                 <span class="keywordflow">if</span> ($query_string !== <span class="stringliteral">&#39;&#39;</span>)
+<a name="l02882"></a>02882                                 $final_uri      .= <span class="stringliteral">&quot;?$query_string&quot;</span>;
+<a name="l02883"></a>02883 
+<a name="l02884"></a>02884                         }
+<a name="l02885"></a>02885                                 
+<a name="l02886"></a>02886                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;Final URI: $final_uri&quot;</span>);
+<a name="l02887"></a>02887                         $this-&gt;setURL($final_uri);
+<a name="l02888"></a>02888                 }
+<a name="l02889"></a>02889                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>($this-&gt;_url);
+<a name="l02890"></a>02890                 <span class="keywordflow">return</span> $this-&gt;_url;
+<a name="l02891"></a>02891         }
+<a name="l02892"></a>02892         
+<a name="l02893"></a>02893 
+<a name="l02898"></a><a class="code" href="group__internalMisc.html#ga6cc85870c043cb9ed421344d25c23571">02898</a>         <span class="keyword">private</span> function <a class="code" href="group__internalMisc.html#ga6cc85870c043cb9ed421344d25c23571">getServerUrl</a>(){
+<a name="l02899"></a>02899                 $server_url = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l02900"></a>02900                 <span class="keywordflow">if</span>(!empty($_SERVER[<span class="stringliteral">&#39;HTTP_X_FORWARDED_HOST&#39;</span>])){
+<a name="l02901"></a>02901                         <span class="comment">// explode the host list separated by comma and use the first host</span>
+<a name="l02902"></a>02902                         $hosts = explode(<span class="charliteral">&#39;,&#39;</span>, $_SERVER[<span class="stringliteral">&#39;HTTP_X_FORWARDED_HOST&#39;</span>]);
+<a name="l02903"></a>02903                         $server_url = $hosts[0];
+<a name="l02904"></a>02904                 }<span class="keywordflow">else</span> <span class="keywordflow">if</span>(!empty($_SERVER[<span class="stringliteral">&#39;HTTP_X_FORWARDED_SERVER&#39;</span>])){
+<a name="l02905"></a>02905                         $server_url = $_SERVER[<span class="stringliteral">&#39;HTTP_X_FORWARDED_SERVER&#39;</span>];
+<a name="l02906"></a>02906                 }<span class="keywordflow">else</span>{
+<a name="l02907"></a>02907                         <span class="keywordflow">if</span> (empty($_SERVER[<span class="stringliteral">&#39;SERVER_NAME&#39;</span>])) {
+<a name="l02908"></a>02908                                 $server_url = $_SERVER[<span class="stringliteral">&#39;HTTP_HOST&#39;</span>];
+<a name="l02909"></a>02909                         } <span class="keywordflow">else</span> {
+<a name="l02910"></a>02910                                 $server_url = $_SERVER[<span class="stringliteral">&#39;SERVER_NAME&#39;</span>];
+<a name="l02911"></a>02911                         }
+<a name="l02912"></a>02912                 }
+<a name="l02913"></a>02913                 <span class="keywordflow">if</span> (!strpos($server_url, <span class="charliteral">&#39;:&#39;</span>)) {
+<a name="l02914"></a>02914                         <span class="keywordflow">if</span> ( ($this-&gt;isHttps() &amp;&amp; $_SERVER[<span class="stringliteral">&#39;SERVER_PORT&#39;</span>]!=443)
+<a name="l02915"></a>02915                         || (!$this-&gt;isHttps() &amp;&amp; $_SERVER[<span class="stringliteral">&#39;SERVER_PORT&#39;</span>]!=80) ) {
+<a name="l02916"></a>02916                                 $server_url .= <span class="charliteral">&#39;:&#39;</span>;
+<a name="l02917"></a>02917                                 $server_url .= $_SERVER[<span class="stringliteral">&#39;SERVER_PORT&#39;</span>];
+<a name="l02918"></a>02918                         }
+<a name="l02919"></a>02919                 }
+<a name="l02920"></a>02920                 <span class="keywordflow">return</span> $server_url;
+<a name="l02921"></a>02921         }
+<a name="l02922"></a>02922 
+<a name="l02927"></a><a class="code" href="group__internalMisc.html#gab152ae390e1930f926b5f7bba8be050c">02927</a>         <span class="keyword">private</span> function <a class="code" href="group__internalMisc.html#gab152ae390e1930f926b5f7bba8be050c">isHttps</a>() {
+<a name="l02928"></a>02928                 <span class="keywordflow">if</span> ( isset($_SERVER[<span class="stringliteral">&#39;HTTPS&#39;</span>]) &amp;&amp; !empty($_SERVER[<span class="stringliteral">&#39;HTTPS&#39;</span>]) &amp;&amp; $_SERVER[<span class="stringliteral">&#39;HTTPS&#39;</span>] == <span class="stringliteral">&#39;on&#39;</span>) {
+<a name="l02929"></a>02929                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l02930"></a>02930                 } <span class="keywordflow">else</span> {
+<a name="l02931"></a>02931                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l02932"></a>02932                 }
+<a name="l02933"></a>02933         }
+<a name="l02934"></a>02934 
+<a name="l02944"></a><a class="code" href="group__internalMisc.html#ga17d50d97a83a4925a08dced7e231d6d9">02944</a>         <span class="keyword">private</span> function removeParameterFromQueryString($parameterName, $queryString)
+<a name="l02945"></a>02945         {
+<a name="l02946"></a>02946                 $parameterName  = preg_quote($parameterName);
+<a name="l02947"></a>02947                 <span class="keywordflow">return</span> preg_replace(<span class="stringliteral">&quot;/&amp;$parameterName(=[^&amp;]*)?|^$parameterName(=[^&amp;]*)?&amp;?/&quot;</span>, <span class="stringliteral">&#39;&#39;</span>, $queryString);
+<a name="l02948"></a>02948         }
+<a name="l02949"></a>02949         
+<a name="l02958"></a><a class="code" href="group__internalMisc.html#gac0540d05b6f1e0d67c43980abeece437">02958</a>         <span class="keyword">private</span> function <a class="code" href="group__internalMisc.html#gac0540d05b6f1e0d67c43980abeece437">buildQueryUrl</a>($url, $query) {
+<a name="l02959"></a>02959                 $url .= (strstr($url,<span class="charliteral">&#39;?&#39;</span>) === FALSE) ? <span class="charliteral">&#39;?&#39;</span> : <span class="charliteral">&#39;&amp;&#39;</span>;
+<a name="l02960"></a>02960                 $url .= $query;
+<a name="l02961"></a>02961                 <span class="keywordflow">return</span> $url;
+<a name="l02962"></a>02962         }
+<a name="l02963"></a>02963         
+<a name="l02967"></a><a class="code" href="group__internalMisc.html#ga889fb725f0c8f080963ee30872031d4d">02967</a>         <span class="keyword">private</span> function renameSession($ticket)
+<a name="l02968"></a>02968         {
+<a name="l02969"></a>02969                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l02970"></a>02970                 <span class="keywordflow">if</span>($this-&gt;_start_session){
+<a name="l02971"></a>02971                         <span class="keywordflow">if</span> (!empty ($this-&gt;_user))
+<a name="l02972"></a>02972                         {
+<a name="l02973"></a>02973                                 $old_session = $_SESSION;
+<a name="l02974"></a>02974                                 session_destroy();
+<a name="l02975"></a>02975                                 <span class="comment">// set up a new session, of name based on the ticket</span>
+<a name="l02976"></a>02976                                 $session_id = preg_replace(<span class="stringliteral">&#39;/[^\w]/&#39;</span>, <span class="stringliteral">&#39;&#39;</span>, $ticket);
+<a name="l02977"></a>02977                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS :: trace</a>(<span class="stringliteral">&quot;Session ID: &quot;</span>.$session_id);
+<a name="l02978"></a>02978                                 session_id($session_id);
+<a name="l02979"></a>02979                                 session_start();
+<a name="l02980"></a>02980                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS :: trace</a>(<span class="stringliteral">&quot;Restoring old session vars&quot;</span>);
+<a name="l02981"></a>02981                                 $_SESSION = $old_session;
+<a name="l02982"></a>02982                         } <span class="keywordflow">else</span>
+<a name="l02983"></a>02983                         {
+<a name="l02984"></a>02984                                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS :: error</a>(<span class="stringliteral">&#39;Session should only be renamed after successfull authentication&#39;</span>);
+<a name="l02985"></a>02985                         }
+<a name="l02986"></a>02986                 }<span class="keywordflow">else</span>{
+<a name="l02987"></a>02987                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS :: trace</a>(<span class="stringliteral">&quot;Skipping session rename since phpCAS is not handling the session.&quot;</span>);
+<a name="l02988"></a>02988                 }
+<a name="l02989"></a>02989                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l02990"></a>02990         }
+<a name="l02991"></a>02991 
+<a name="l02992"></a>02992         
+<a name="l02993"></a>02993         <span class="comment">// ########################################################################</span>
+<a name="l02994"></a>02994         <span class="comment">//  AUTHENTICATION ERROR HANDLING</span>
+<a name="l02995"></a>02995         <span class="comment">// ########################################################################</span>
+<a name="l03009"></a><a class="code" href="group__internalMisc.html#ga1d8d2502381f066a46433693f7eac14f">03009</a> <span class="comment"></span>        <span class="keyword">private</span> function authError($failure,<a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a>,$no_response,$bad_response=<span class="stringliteral">&#39;&#39;</span>,$cas_response=<span class="stringliteral">&#39;&#39;</span>,$err_code=<span class="stringliteral">&#39;&#39;</span>,$err_msg=<span class="stringliteral">&#39;&#39;</span>)
+<a name="l03010"></a>03010         {
+<a name="l03011"></a>03011                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l03012"></a>03012 
+<a name="l03013"></a>03013                 $this-&gt;printHTMLHeader($this-&gt;getString(<a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a>));
+<a name="l03014"></a>03014                 printf($this-&gt;getString(<a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a>),htmlentities($this-&gt;getURL()),$_SERVER[<span class="stringliteral">&#39;SERVER_ADMIN&#39;</span>]);
+<a name="l03015"></a>03015                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;CAS URL: &#39;</span>.<a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a>);
+<a name="l03016"></a>03016                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;Authentication failure: &#39;</span>.$failure);
+<a name="l03017"></a>03017                 <span class="keywordflow">if</span> ( $no_response ) {
+<a name="l03018"></a>03018                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;Reason: no response from the CAS server&#39;</span>);
+<a name="l03019"></a>03019                 } <span class="keywordflow">else</span> {
+<a name="l03020"></a>03020                         <span class="keywordflow">if</span> ( $bad_response ) {
+<a name="l03021"></a>03021                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;Reason: bad response from the CAS server&#39;</span>);
+<a name="l03022"></a>03022                         } <span class="keywordflow">else</span> {
+<a name="l03023"></a>03023                                 <span class="keywordflow">switch</span> ($this-&gt;getServerVersion()) {
+<a name="l03024"></a>03024                                         <span class="keywordflow">case</span> <a class="code" href="group__public.html#ga0904e4fb51e532bbba51832326dbf8fb">CAS_VERSION_1_0</a>:
+<a name="l03025"></a>03025                                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;Reason: CAS error&#39;</span>);
+<a name="l03026"></a>03026                                                 <span class="keywordflow">break</span>;
+<a name="l03027"></a>03027                                         <span class="keywordflow">case</span> <a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>:
+<a name="l03028"></a>03028                                                 <span class="keywordflow">if</span> ( empty($err_code) )
+<a name="l03029"></a>03029                                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;Reason: no CAS error&#39;</span>);
+<a name="l03030"></a>03030                                                 <span class="keywordflow">else</span>
+<a name="l03031"></a>03031                                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;Reason: [&#39;</span>.$err_code.<span class="stringliteral">&#39;] CAS error: &#39;</span>.$err_msg);
+<a name="l03032"></a>03032                                                 <span class="keywordflow">break</span>;
+<a name="l03033"></a>03033                                 }
+<a name="l03034"></a>03034                         }
+<a name="l03035"></a>03035                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;CAS response: &#39;</span>.$cas_response);
+<a name="l03036"></a>03036                 }
+<a name="l03037"></a>03037                 $this-&gt;printHTMLFooter();
+<a name="l03038"></a>03038                 <a class="code" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">phpCAS::traceExit</a>();
+<a name="l03039"></a>03039 
+<a name="l03040"></a>03040                 <span class="keywordflow">if</span> ($this-&gt;_exitOnAuthError)
+<a name="l03041"></a>03041                 exit();
+<a name="l03042"></a>03042         }
+<a name="l03043"></a>03043 
+<a name="l03045"></a>03045 }
+<a name="l03046"></a>03046 
+<a name="l03047"></a>03047 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CookieJar_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CookieJar_8php.html
new file mode 100644
index 00000000..287d6030
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CookieJar_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/CookieJar.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/CookieJar.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="CookieJar_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CookieJar_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CookieJar_8php_source.html
new file mode 100644
index 00000000..60c1aa5a
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CookieJar_8php_source.html
@@ -0,0 +1,284 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/CookieJar.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/CookieJar.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="CookieJar_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *     * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *     * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *     * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"></span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/InvalidArgumentException.php&#39;</span>);
+<a name="l00032"></a>00032 
+<a name="l00038"></a><a class="code" href="classCAS__CookieJar.html">00038</a> <span class="keyword">class </span><a class="code" href="classCAS__CookieJar.html">CAS_CookieJar</a> {
+<a name="l00039"></a>00039 
+<a name="l00040"></a><a class="code" href="classCAS__CookieJar.html#af9d334b3919452f41285c455704f9aef">00040</a>         <span class="keyword">private</span> <a class="code" href="classCAS__CookieJar.html#af9d334b3919452f41285c455704f9aef">$_cookies</a>;
+<a name="l00041"></a>00041 
+<a name="l00049"></a><a class="code" href="classCAS__CookieJar.html#ab9f5a872c4bfdf47f5a5afb89d77a216">00049</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__CookieJar.html#ab9f5a872c4bfdf47f5a5afb89d77a216">__construct</a> (array &amp;$storageArray) {
+<a name="l00050"></a>00050                 $this-&gt;_cookies =&amp; $storageArray;
+<a name="l00051"></a>00051         }
+<a name="l00052"></a>00052 
+<a name="l00064"></a><a class="code" href="classCAS__CookieJar.html#a133963d2952a02084388a81ca2356d4b">00064</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__CookieJar.html#a133963d2952a02084388a81ca2356d4b">storeCookies</a> ($request_url, $response_headers) {
+<a name="l00065"></a>00065                 $urlParts = parse_url($request_url);
+<a name="l00066"></a>00066                 $defaultDomain = $urlParts[<span class="stringliteral">&#39;host&#39;</span>];
+<a name="l00067"></a>00067 
+<a name="l00068"></a>00068                 $cookies = $this-&gt;<a class="code" href="classCAS__CookieJar.html#af81c4ba23ca24d56e308a1a6cbb8464f">parseCookieHeaders</a>($response_headers, $defaultDomain);
+<a name="l00069"></a>00069 
+<a name="l00070"></a>00070                 <span class="comment">// var_dump($cookies);</span>
+<a name="l00071"></a>00071                 <span class="keywordflow">foreach</span> ($cookies as $cookie) {
+<a name="l00072"></a>00072                         <span class="comment">// Enforce the same-origin policy by verifying that the cookie</span>
+<a name="l00073"></a>00073                         <span class="comment">// would match the url that is setting it</span>
+<a name="l00074"></a>00074                         <span class="keywordflow">if</span> (!$this-&gt;<a class="code" href="classCAS__CookieJar.html#a1a4419c2c934a7edbd380171bca6f7c2">cookieMatchesTarget</a>($cookie, $urlParts))
+<a name="l00075"></a>00075                                 <span class="keywordflow">continue</span>;
+<a name="l00076"></a>00076 
+<a name="l00077"></a>00077                         <span class="comment">// store the cookie</span>
+<a name="l00078"></a>00078                         $this-&gt;<a class="code" href="classCAS__CookieJar.html#ac1de792f07c3fad7659a9448ba233c7f">storeCookie</a>($cookie);
+<a name="l00079"></a>00079 
+<a name="l00080"></a>00080                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>($cookie[<span class="stringliteral">&#39;name&#39;</span>].<span class="stringliteral">&#39; -&gt; &#39;</span>.$cookie[<span class="stringliteral">&#39;value&#39;</span>]);
+<a name="l00081"></a>00081                 }
+<a name="l00082"></a>00082         }
+<a name="l00083"></a>00083 
+<a name="l00094"></a><a class="code" href="classCAS__CookieJar.html#ac5d8875ce623ff288094f7167cc3ddbe">00094</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__CookieJar.html#ac5d8875ce623ff288094f7167cc3ddbe">getCookies</a> ($request_url) {
+<a name="l00095"></a>00095                 <span class="keywordflow">if</span> (!count($this-&gt;_cookies))
+<a name="l00096"></a>00096                         <span class="keywordflow">return</span> array();
+<a name="l00097"></a>00097 
+<a name="l00098"></a>00098                 <span class="comment">// If our request URL can&#39;t be parsed, no cookies apply.</span>
+<a name="l00099"></a>00099                 $target = parse_url($request_url);
+<a name="l00100"></a>00100                 <span class="keywordflow">if</span> ($target === FALSE)
+<a name="l00101"></a>00101                         <span class="keywordflow">return</span> array();
+<a name="l00102"></a>00102 
+<a name="l00103"></a>00103                 $this-&gt;<a class="code" href="classCAS__CookieJar.html#a4a6e9f572711a19e53a1f6104f56fb8a">expireCookies</a>();
+<a name="l00104"></a>00104 
+<a name="l00105"></a>00105                 $matching_cookies = array();
+<a name="l00106"></a>00106                 <span class="keywordflow">foreach</span> ($this-&gt;_cookies as $key =&gt; $cookie) {
+<a name="l00107"></a>00107                         <span class="keywordflow">if</span> ($this-&gt;<a class="code" href="classCAS__CookieJar.html#a1a4419c2c934a7edbd380171bca6f7c2">cookieMatchesTarget</a>($cookie, $target)) {
+<a name="l00108"></a>00108                                 $matching_cookies[$cookie[<span class="stringliteral">&#39;name&#39;</span>]] = $cookie[<span class="stringliteral">&#39;value&#39;</span>];
+<a name="l00109"></a>00109                         }
+<a name="l00110"></a>00110                 }
+<a name="l00111"></a>00111                 <span class="keywordflow">return</span> $matching_cookies;
+<a name="l00112"></a>00112         }
+<a name="l00113"></a>00113 
+<a name="l00114"></a>00114 
+<a name="l00122"></a><a class="code" href="classCAS__CookieJar.html#af81c4ba23ca24d56e308a1a6cbb8464f">00122</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__CookieJar.html#af81c4ba23ca24d56e308a1a6cbb8464f">parseCookieHeaders</a>( $header, $defaultDomain ) {
+<a name="l00123"></a>00123                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00124"></a>00124                 $cookies = array();
+<a name="l00125"></a>00125                 <span class="keywordflow">foreach</span>( $header as $line ) {
+<a name="l00126"></a>00126                         <span class="keywordflow">if</span>( preg_match( <span class="stringliteral">&#39;/^Set-Cookie2?: /i&#39;</span>, $line ) ) {
+<a name="l00127"></a>00127                                 $cookies[] = $this-&gt;<a class="code" href="classCAS__CookieJar.html#a022858f118e1b08cc1beba50a9046504">parseCookieHeader</a>($line, $defaultDomain);
+<a name="l00128"></a>00128                         }
+<a name="l00129"></a>00129                 }
+<a name="l00130"></a>00130 
+<a name="l00131"></a>00131                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>($cookies);
+<a name="l00132"></a>00132                 <span class="keywordflow">return</span> $cookies;
+<a name="l00133"></a>00133         }
+<a name="l00134"></a>00134 
+<a name="l00144"></a><a class="code" href="classCAS__CookieJar.html#a022858f118e1b08cc1beba50a9046504">00144</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__CookieJar.html#a022858f118e1b08cc1beba50a9046504">parseCookieHeader</a> ($line, $defaultDomain) {
+<a name="l00145"></a>00145                 <span class="keywordflow">if</span> (!$defaultDomain)
+<a name="l00146"></a>00146                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a>(<span class="stringliteral">&#39;$defaultDomain was not provided.&#39;</span>);
+<a name="l00147"></a>00147 
+<a name="l00148"></a>00148                 <span class="comment">// Set our default values</span>
+<a name="l00149"></a>00149                 $cookie = array(
+<a name="l00150"></a>00150                         <span class="stringliteral">&#39;domain&#39;</span> =&gt; $defaultDomain,
+<a name="l00151"></a>00151                         <span class="stringliteral">&#39;path&#39;</span> =&gt; <span class="charliteral">&#39;/&#39;</span>,
+<a name="l00152"></a>00152                         <span class="stringliteral">&#39;secure&#39;</span> =&gt; <span class="keyword">false</span>,
+<a name="l00153"></a>00153                 );
+<a name="l00154"></a>00154 
+<a name="l00155"></a>00155                 $line = preg_replace( <span class="stringliteral">&#39;/^Set-Cookie2?: /i&#39;</span>, <span class="stringliteral">&#39;&#39;</span>, trim( $line ) );
+<a name="l00156"></a>00156 
+<a name="l00157"></a>00157                 <span class="comment">// trim any trailing semicolons.</span>
+<a name="l00158"></a>00158                 $line = trim($line, <span class="charliteral">&#39;;&#39;</span>);
+<a name="l00159"></a>00159 
+<a name="l00160"></a>00160                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;Cookie Line: $line&quot;</span>);
+<a name="l00161"></a>00161 
+<a name="l00162"></a>00162                 <span class="comment">// This implementation makes the assumption that semicolons will not</span>
+<a name="l00163"></a>00163                 <span class="comment">// be present in quoted attribute values. While attribute values that</span>
+<a name="l00164"></a>00164                 <span class="comment">// contain semicolons are allowed by RFC2965, they are hopefully rare</span>
+<a name="l00165"></a>00165                 <span class="comment">// enough to ignore for our purposes. Most browsers make the same </span>
+<a name="l00166"></a>00166                 <span class="comment">// assumption.</span>
+<a name="l00167"></a>00167                 $attributeStrings = explode( <span class="charliteral">&#39;;&#39;</span>, $line );
+<a name="l00168"></a>00168 
+<a name="l00169"></a>00169                 <span class="keywordflow">foreach</span>( $attributeStrings as $attributeString ) {
+<a name="l00170"></a>00170                         <span class="comment">// split on the first equals sign and use the rest as value</span>
+<a name="l00171"></a>00171                         $attributeParts = explode( <span class="charliteral">&#39;=&#39;</span>, $attributeString, 2);
+<a name="l00172"></a>00172 
+<a name="l00173"></a>00173                         $attributeName = trim($attributeParts[0]);
+<a name="l00174"></a>00174                         $attributeNameLC = strtolower($attributeName);
+<a name="l00175"></a>00175 
+<a name="l00176"></a>00176                         <span class="keywordflow">if</span> (isset($attributeParts[1])) {
+<a name="l00177"></a>00177                                 $attributeValue = trim($attributeParts[1]);
+<a name="l00178"></a>00178                                 <span class="comment">// Values may be quoted strings.</span>
+<a name="l00179"></a>00179                                 <span class="keywordflow">if</span> (strpos($attributeValue, <span class="charliteral">&#39;&quot;&#39;</span>) === 0) {
+<a name="l00180"></a>00180                                         $attributeValue = trim($attributeValue, <span class="charliteral">&#39;&quot;&#39;</span>);
+<a name="l00181"></a>00181                                         <span class="comment">// unescape any escaped quotes:</span>
+<a name="l00182"></a>00182                                         $attributeValue = str_replace(<span class="charliteral">&#39;\&quot;&#39;</span>, <span class="charliteral">&#39;&quot;&#39;</span>, $attributeValue);
+<a name="l00183"></a>00183                                 }
+<a name="l00184"></a>00184                         } <span class="keywordflow">else</span> {
+<a name="l00185"></a>00185                                 $attributeValue = null;
+<a name="l00186"></a>00186                         }
+<a name="l00187"></a>00187 
+<a name="l00188"></a>00188                         <span class="keywordflow">switch</span> ($attributeNameLC) {
+<a name="l00189"></a>00189                                 <span class="keywordflow">case</span> <span class="stringliteral">&#39;expires&#39;</span>:
+<a name="l00190"></a>00190                                         $cookie[<span class="stringliteral">&#39;expires&#39;</span>] = strtotime($attributeValue);
+<a name="l00191"></a>00191                                         <span class="keywordflow">break</span>;
+<a name="l00192"></a>00192                                 <span class="keywordflow">case</span> <span class="stringliteral">&#39;max-age&#39;</span>:
+<a name="l00193"></a>00193                                         $cookie[<span class="stringliteral">&#39;max-age&#39;</span>] = (int)$attributeValue;
+<a name="l00194"></a>00194                                         <span class="comment">// Set an expiry time based on the max-age</span>
+<a name="l00195"></a>00195                                         <span class="keywordflow">if</span> ($cookie[<span class="stringliteral">&#39;max-age&#39;</span>])
+<a name="l00196"></a>00196                                                 $cookie[<span class="stringliteral">&#39;expires&#39;</span>] = time() + $cookie[<span class="stringliteral">&#39;max-age&#39;</span>];
+<a name="l00197"></a>00197                                         <span class="comment">// If max-age is zero, then the cookie should be removed imediately</span>
+<a name="l00198"></a>00198                                         <span class="comment">// so set an expiry before now.</span>
+<a name="l00199"></a>00199                                         <span class="keywordflow">else</span>
+<a name="l00200"></a>00200                                                 $cookie[<span class="stringliteral">&#39;expires&#39;</span>] = time() - 1;
+<a name="l00201"></a>00201                                         <span class="keywordflow">break</span>;
+<a name="l00202"></a>00202                                 <span class="keywordflow">case</span> <span class="stringliteral">&#39;secure&#39;</span>:
+<a name="l00203"></a>00203                                         $cookie[<span class="stringliteral">&#39;secure&#39;</span>] = <span class="keyword">true</span>;
+<a name="l00204"></a>00204                                         <span class="keywordflow">break</span>;
+<a name="l00205"></a>00205                                 <span class="keywordflow">case</span> <span class="stringliteral">&#39;domain&#39;</span>:
+<a name="l00206"></a>00206                                 <span class="keywordflow">case</span> <span class="stringliteral">&#39;path&#39;</span>:
+<a name="l00207"></a>00207                                 <span class="keywordflow">case</span> <span class="stringliteral">&#39;port&#39;</span>:
+<a name="l00208"></a>00208                                 <span class="keywordflow">case</span> <span class="stringliteral">&#39;version&#39;</span>:
+<a name="l00209"></a>00209                                 <span class="keywordflow">case</span> <span class="stringliteral">&#39;comment&#39;</span>:
+<a name="l00210"></a>00210                                 <span class="keywordflow">case</span> <span class="stringliteral">&#39;commenturl&#39;</span>:
+<a name="l00211"></a>00211                                 <span class="keywordflow">case</span> <span class="stringliteral">&#39;discard&#39;</span>:
+<a name="l00212"></a>00212                                 <span class="keywordflow">case</span> <span class="stringliteral">&#39;httponly&#39;</span>:
+<a name="l00213"></a>00213                                         $cookie[$attributeNameLC] = $attributeValue;
+<a name="l00214"></a>00214                                         <span class="keywordflow">break</span>;
+<a name="l00215"></a>00215                                 <span class="keywordflow">default</span>:
+<a name="l00216"></a>00216                                         $cookie[<span class="stringliteral">&#39;name&#39;</span>] = $attributeName;
+<a name="l00217"></a>00217                                         $cookie[<span class="stringliteral">&#39;value&#39;</span>] = $attributeValue;
+<a name="l00218"></a>00218                         }
+<a name="l00219"></a>00219                 }
+<a name="l00220"></a>00220 
+<a name="l00221"></a>00221                 <span class="keywordflow">return</span> $cookie;
+<a name="l00222"></a>00222         }
+<a name="l00223"></a>00223 
+<a name="l00233"></a><a class="code" href="classCAS__CookieJar.html#ac1de792f07c3fad7659a9448ba233c7f">00233</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__CookieJar.html#ac1de792f07c3fad7659a9448ba233c7f">storeCookie</a> ($cookie) {
+<a name="l00234"></a>00234                 <span class="comment">// Discard any old versions of this cookie.</span>
+<a name="l00235"></a>00235                 $this-&gt;<a class="code" href="classCAS__CookieJar.html#a5b957149a51af3f67cef6b2591591144">discardCookie</a>($cookie);
+<a name="l00236"></a>00236                 $this-&gt;_cookies[] = $cookie;
+<a name="l00237"></a>00237 
+<a name="l00238"></a>00238         }
+<a name="l00239"></a>00239 
+<a name="l00249"></a><a class="code" href="classCAS__CookieJar.html#a5b957149a51af3f67cef6b2591591144">00249</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__CookieJar.html#a5b957149a51af3f67cef6b2591591144">discardCookie</a> ($cookie) {
+<a name="l00250"></a>00250                 <span class="keywordflow">if</span> (!isset($cookie[<span class="stringliteral">&#39;domain&#39;</span>]) || !isset($cookie[<span class="stringliteral">&#39;path&#39;</span>]) || !isset($cookie[<span class="stringliteral">&#39;path&#39;</span>]))
+<a name="l00251"></a>00251                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a>(<span class="stringliteral">&#39;Invalid Cookie array passed.&#39;</span>);
+<a name="l00252"></a>00252 
+<a name="l00253"></a>00253                 <span class="keywordflow">foreach</span> ($this-&gt;_cookies as $key =&gt; $old_cookie) {
+<a name="l00254"></a>00254                         <span class="keywordflow">if</span> ($cookie[<span class="stringliteral">&#39;domain&#39;</span>] == $old_cookie[<span class="stringliteral">&#39;domain&#39;</span>]
+<a name="l00255"></a>00255                         &amp;&amp; $cookie[<span class="stringliteral">&#39;path&#39;</span>] == $old_cookie[<span class="stringliteral">&#39;path&#39;</span>]
+<a name="l00256"></a>00256                         &amp;&amp; $cookie[<span class="stringliteral">&#39;name&#39;</span>] == $old_cookie[<span class="stringliteral">&#39;name&#39;</span>])
+<a name="l00257"></a>00257                         {
+<a name="l00258"></a>00258                                 unset($this-&gt;_cookies[$key]);
+<a name="l00259"></a>00259                         }
+<a name="l00260"></a>00260                 }
+<a name="l00261"></a>00261         }
+<a name="l00262"></a>00262 
+<a name="l00270"></a><a class="code" href="classCAS__CookieJar.html#a4a6e9f572711a19e53a1f6104f56fb8a">00270</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__CookieJar.html#a4a6e9f572711a19e53a1f6104f56fb8a">expireCookies</a> () {
+<a name="l00271"></a>00271                 <span class="keywordflow">foreach</span> ($this-&gt;_cookies as $key =&gt; $cookie) {
+<a name="l00272"></a>00272                         <span class="keywordflow">if</span> (isset($cookie[<span class="stringliteral">&#39;expires&#39;</span>]) &amp;&amp; $cookie[<span class="stringliteral">&#39;expires&#39;</span>] &lt; time()) {
+<a name="l00273"></a>00273                                 unset($this-&gt;_cookies[$key]);
+<a name="l00274"></a>00274                         }
+<a name="l00275"></a>00275                 }
+<a name="l00276"></a>00276         }
+<a name="l00277"></a>00277 
+<a name="l00288"></a><a class="code" href="classCAS__CookieJar.html#a1a4419c2c934a7edbd380171bca6f7c2">00288</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__CookieJar.html#a1a4419c2c934a7edbd380171bca6f7c2">cookieMatchesTarget</a> ($cookie, $target) {
+<a name="l00289"></a>00289                 <span class="keywordflow">if</span> (!is_array($target))
+<a name="l00290"></a>00290                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a>(<span class="stringliteral">&#39;$target must be an array of URL attributes as generated by parse_url().&#39;</span>);
+<a name="l00291"></a>00291                 <span class="keywordflow">if</span> (!isset($target[<span class="stringliteral">&#39;host&#39;</span>]))
+<a name="l00292"></a>00292                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a>(<span class="stringliteral">&#39;$target must be an array of URL attributes as generated by parse_url().&#39;</span>);
+<a name="l00293"></a>00293 
+<a name="l00294"></a>00294                 <span class="comment">// Verify that the scheme matches</span>
+<a name="l00295"></a>00295                 <span class="keywordflow">if</span> ($cookie[<span class="stringliteral">&#39;secure&#39;</span>] &amp;&amp; $target[<span class="stringliteral">&#39;scheme&#39;</span>] != <span class="stringliteral">&#39;https&#39;</span>)
+<a name="l00296"></a>00296                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00297"></a>00297                 
+<a name="l00298"></a>00298                 <span class="comment">// Verify that the host matches</span>
+<a name="l00299"></a>00299                 <span class="comment">// Match domain and mulit-host cookies</span>
+<a name="l00300"></a>00300                 <span class="keywordflow">if</span> (strpos($cookie[<span class="stringliteral">&#39;domain&#39;</span>], <span class="charliteral">&#39;.&#39;</span>) === 0) {
+<a name="l00301"></a>00301                         <span class="comment">// check that the target host a.b.c.edu is within .b.c.edu</span>
+<a name="l00302"></a>00302                         $pos = strripos($target[<span class="stringliteral">&#39;host&#39;</span>], $cookie[<span class="stringliteral">&#39;domain&#39;</span>]);
+<a name="l00303"></a>00303                         <span class="keywordflow">if</span> (!$pos)
+<a name="l00304"></a>00304                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00305"></a>00305                         <span class="comment">// verify that the cookie domain is the last part of the host.</span>
+<a name="l00306"></a>00306                         <span class="keywordflow">if</span> ($pos + strlen($cookie[<span class="stringliteral">&#39;domain&#39;</span>]) != strlen($target[<span class="stringliteral">&#39;host&#39;</span>]))
+<a name="l00307"></a>00307                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00308"></a>00308                 }
+<a name="l00309"></a>00309                 <span class="comment">// If the cookie host doesn&#39;t begin with &#39;.&#39;, the host must case-insensitive</span>
+<a name="l00310"></a>00310                 <span class="comment">// match exactly</span>
+<a name="l00311"></a>00311                 <span class="keywordflow">else</span> {
+<a name="l00312"></a>00312                         <span class="keywordflow">if</span> (strcasecmp($target[<span class="stringliteral">&#39;host&#39;</span>], $cookie[<span class="stringliteral">&#39;domain&#39;</span>]) !== 0)
+<a name="l00313"></a>00313                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00314"></a>00314                 }
+<a name="l00315"></a>00315 
+<a name="l00316"></a>00316                 <span class="comment">// Verify that the port matches</span>
+<a name="l00317"></a>00317                 <span class="keywordflow">if</span> (isset($cookie[<span class="stringliteral">&#39;ports&#39;</span>]) &amp;&amp; !in_array($target[<span class="stringliteral">&#39;port&#39;</span>], $cookie[<span class="stringliteral">&#39;ports&#39;</span>]))
+<a name="l00318"></a>00318                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00319"></a>00319 
+<a name="l00320"></a>00320                 <span class="comment">// Verify that the path matches</span>
+<a name="l00321"></a>00321                 <span class="keywordflow">if</span> (strpos($target[<span class="stringliteral">&#39;path&#39;</span>], $cookie[<span class="stringliteral">&#39;path&#39;</span>]) !== 0)
+<a name="l00322"></a>00322                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00323"></a>00323 
+<a name="l00324"></a>00324                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00325"></a>00325         }
+<a name="l00326"></a>00326 
+<a name="l00327"></a>00327 }
+<a name="l00328"></a>00328 
+<a name="l00329"></a>00329 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CurlRequest_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CurlRequest_8php.html
new file mode 100644
index 00000000..6a890017
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CurlRequest_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/Request/CurlRequest.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/Request/CurlRequest.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="CurlRequest_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CurlRequest.html">CAS_CurlRequest</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CurlRequest_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CurlRequest_8php_source.html
new file mode 100644
index 00000000..a3b1fcec
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/CurlRequest_8php_source.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/Request/CurlRequest.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/Request/CurlRequest.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="CurlRequest_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *         * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *               this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *         * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *               this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *               and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *         * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *               Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *               promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *               written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"></span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 require_once dirname(__FILE__).<span class="stringliteral">&#39;/RequestInterface.php&#39;</span>;
+<a name="l00032"></a>00032 require_once dirname(__FILE__).<span class="stringliteral">&#39;/AbstractRequest.php&#39;</span>;
+<a name="l00033"></a>00033 
+<a name="l00037"></a><a class="code" href="classCAS__CurlRequest.html">00037</a> <span class="keyword">class </span><a class="code" href="classCAS__CurlRequest.html">CAS_CurlRequest</a>
+<a name="l00038"></a>00038         <span class="keyword">extends</span> <a class="code" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a>
+<a name="l00039"></a>00039         implements <a class="code" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a>
+<a name="l00040"></a>00040 {
+<a name="l00041"></a>00041 
+<a name="l00048"></a><a class="code" href="classCAS__CurlRequest.html#ae34cc30ad201b2f1164e40aef609102b">00048</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__CurlRequest.html#ae34cc30ad201b2f1164e40aef609102b">setCurlOptions</a> (array $options) {
+<a name="l00049"></a>00049                 $this-&gt;curlOptions = $options;
+<a name="l00050"></a>00050         }
+<a name="l00051"></a><a class="code" href="classCAS__CurlRequest.html#a91dc734468fb10a927c7b86dbb5606d2">00051</a>         <span class="keyword">private</span> <a class="code" href="classCAS__CurlRequest.html#a91dc734468fb10a927c7b86dbb5606d2">$curlOptions</a> = array();
+<a name="l00052"></a>00052 
+<a name="l00058"></a><a class="code" href="classCAS__CurlRequest.html#aa4e10d6814c606547cec548e1f6fd18b">00058</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__CurlRequest.html#aa4e10d6814c606547cec548e1f6fd18b">_sendRequest</a> () {
+<a name="l00059"></a>00059                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00060"></a>00060 
+<a name="l00061"></a>00061                 <span class="comment">/*********************************************************</span>
+<a name="l00062"></a>00062 <span class="comment">                 * initialize the CURL session</span>
+<a name="l00063"></a>00063 <span class="comment">                 *********************************************************/</span>
+<a name="l00064"></a>00064                 $ch = curl_init($this-&gt;url);
+<a name="l00065"></a>00065 
+<a name="l00066"></a>00066                 <span class="keywordflow">if</span> (version_compare(PHP_VERSION,<span class="stringliteral">&#39;5.1.3&#39;</span>,<span class="stringliteral">&#39;&gt;=&#39;</span>)) {
+<a name="l00067"></a>00067                         <span class="comment">//only avaible in php5</span>
+<a name="l00068"></a>00068                         curl_setopt_array($ch, $this-&gt;curlOptions);
+<a name="l00069"></a>00069                 } <span class="keywordflow">else</span> {
+<a name="l00070"></a>00070                         <span class="keywordflow">foreach</span> ($this-&gt;curlOptions as $key =&gt; $value) {
+<a name="l00071"></a>00071                                 curl_setopt($ch, $key, $value);
+<a name="l00072"></a>00072                         }
+<a name="l00073"></a>00073                 }
+<a name="l00074"></a>00074 
+<a name="l00075"></a>00075                 <span class="comment">/*********************************************************</span>
+<a name="l00076"></a>00076 <span class="comment">                 * Set SSL configuration</span>
+<a name="l00077"></a>00077 <span class="comment">                 *********************************************************/</span>
+<a name="l00078"></a>00078                 <span class="keywordflow">if</span> ($this-&gt;caCertPath) {
+<a name="l00079"></a>00079                         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
+<a name="l00080"></a>00080                         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
+<a name="l00081"></a>00081                         curl_setopt($ch, CURLOPT_CAINFO, $this-&gt;caCertPath);
+<a name="l00082"></a>00082                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;CURL: Set CURLOPT_CAINFO&#39;</span>);
+<a name="l00083"></a>00083                 } <span class="keywordflow">else</span> {
+<a name="l00084"></a>00084                         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
+<a name="l00085"></a>00085                         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
+<a name="l00086"></a>00086                 }
+<a name="l00087"></a>00087 
+<a name="l00088"></a>00088                 <span class="comment">/*********************************************************</span>
+<a name="l00089"></a>00089 <span class="comment">                 * Configure curl to capture our output.</span>
+<a name="l00090"></a>00090 <span class="comment">                 *********************************************************/</span>
+<a name="l00091"></a>00091                 <span class="comment">// return the CURL output into a variable</span>
+<a name="l00092"></a>00092                 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+<a name="l00093"></a>00093 
+<a name="l00094"></a>00094                 <span class="comment">// get the HTTP header with a callback</span>
+<a name="l00095"></a>00095                 curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, <span class="stringliteral">&#39;_curlReadHeaders&#39;</span>));
+<a name="l00096"></a>00096 
+<a name="l00097"></a>00097                 <span class="comment">/*********************************************************</span>
+<a name="l00098"></a>00098 <span class="comment">                 * Add cookie headers to our request.</span>
+<a name="l00099"></a>00099 <span class="comment">                 *********************************************************/</span>
+<a name="l00100"></a>00100                 <span class="keywordflow">if</span> (count($this-&gt;cookies)) {
+<a name="l00101"></a>00101                         $cookieStrings = array();
+<a name="l00102"></a>00102                         <span class="keywordflow">foreach</span> ($this-&gt;cookies as $name =&gt; $val) {
+<a name="l00103"></a>00103                                 $cookieStrings[] = $name.<span class="charliteral">&#39;=&#39;</span>.$val;
+<a name="l00104"></a>00104                         }
+<a name="l00105"></a>00105                         curl_setopt($ch, CURLOPT_COOKIE, implode(<span class="charliteral">&#39;;&#39;</span>, $cookieStrings));
+<a name="l00106"></a>00106                 }
+<a name="l00107"></a>00107 
+<a name="l00108"></a>00108                 <span class="comment">/*********************************************************</span>
+<a name="l00109"></a>00109 <span class="comment">                 * Add any additional headers</span>
+<a name="l00110"></a>00110 <span class="comment">                 *********************************************************/</span>
+<a name="l00111"></a>00111                 <span class="keywordflow">if</span> (count($this-&gt;headers)) {
+<a name="l00112"></a>00112                         curl_setopt($ch, CURLOPT_HTTPHEADER, $this-&gt;headers);
+<a name="l00113"></a>00113                 }
+<a name="l00114"></a>00114 
+<a name="l00115"></a>00115                 <span class="comment">/*********************************************************</span>
+<a name="l00116"></a>00116 <span class="comment">                 * Flag and Body for POST requests</span>
+<a name="l00117"></a>00117 <span class="comment">                 *********************************************************/</span>
+<a name="l00118"></a>00118                 <span class="keywordflow">if</span> ($this-&gt;isPost) {
+<a name="l00119"></a>00119                         curl_setopt($ch, CURLOPT_POST, 1);
+<a name="l00120"></a>00120                         curl_setopt($ch, CURLOPT_POSTFIELDS, $this-&gt;postBody);
+<a name="l00121"></a>00121                 }
+<a name="l00122"></a>00122 
+<a name="l00123"></a>00123                 <span class="comment">/*********************************************************</span>
+<a name="l00124"></a>00124 <span class="comment">                 * Perform the query</span>
+<a name="l00125"></a>00125 <span class="comment">                 *********************************************************/</span>
+<a name="l00126"></a>00126                 $buf = curl_exec ($ch);
+<a name="l00127"></a>00127                 <span class="keywordflow">if</span> ( $buf === FALSE ) {
+<a name="l00128"></a>00128                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;curl_exec() failed&#39;</span>);
+<a name="l00129"></a>00129                         $this-&gt;<a class="code" href="classCAS__AbstractRequest.html#ad0a53a42fa2ebc75e6758521d6c7466b">storeErrorMessage</a>(<span class="stringliteral">&#39;CURL error #&#39;</span>.curl_errno($ch).<span class="stringliteral">&#39;: &#39;</span>.curl_error($ch));
+<a name="l00130"></a>00130                         $res = FALSE;
+<a name="l00131"></a>00131                 } <span class="keywordflow">else</span> {
+<a name="l00132"></a>00132                         $this-&gt;<a class="code" href="classCAS__AbstractRequest.html#a39f3b67606a2d40b23263f8ca257f7f5">storeResponseBody</a>($buf);
+<a name="l00133"></a>00133                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&quot;Response Body: \n&quot;</span>.$buf.<span class="stringliteral">&quot;\n&quot;</span>);
+<a name="l00134"></a>00134                         $res = TRUE;
+<a name="l00135"></a>00135 
+<a name="l00136"></a>00136                 }
+<a name="l00137"></a>00137                 <span class="comment">// close the CURL session</span>
+<a name="l00138"></a>00138                 curl_close ($ch);
+<a name="l00139"></a>00139 
+<a name="l00140"></a>00140                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>($res);
+<a name="l00141"></a>00141                 <span class="keywordflow">return</span> $res;
+<a name="l00142"></a>00142         }
+<a name="l00143"></a>00143 
+<a name="l00151"></a><a class="code" href="classCAS__CurlRequest.html#a4238fbfb24854b910f8c83855c51f15b">00151</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__CurlRequest.html#a4238fbfb24854b910f8c83855c51f15b">_curlReadHeaders</a> ($ch, $header) {
+<a name="l00152"></a>00152                 $this-&gt;<a class="code" href="classCAS__AbstractRequest.html#af99b6e9695cb90d0a1dfd6b117ab06a7">storeResponseHeader</a>($header);
+<a name="l00153"></a>00153                 <span class="keywordflow">return</span> strlen($header);
+<a name="l00154"></a>00154         }
+<a name="l00155"></a>00155 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Db_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Db_8php.html
new file mode 100644
index 00000000..bab60a83
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Db_8php.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/PGTStorage/Db.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#enum-members">Enumerations</a>  </div>
+  <div class="headertitle">
+<h1>CAS/PGTStorage/Db.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="Db_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td></tr>
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="Db_8php.html#a072d8c6ec2753e58f251cba9db5490eb">CAS_PGT_STORAGE_DB_DEFAULT_TABLE</a> </td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>Basic class for PGT database storage </p>
+
+<p>Definition in file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+<hr/><h2>Enumeration Type Documentation</h2>
+<a class="anchor" id="a072d8c6ec2753e58f251cba9db5490eb"></a><!-- doxytag: member="Db.php::CAS_PGT_STORAGE_DB_DEFAULT_TABLE" ref="a072d8c6ec2753e58f251cba9db5490eb" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="Db_8php.html#a072d8c6ec2753e58f251cba9db5490eb">CAS_PGT_STORAGE_DB_DEFAULT_TABLE</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00044">44</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Db_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Db_8php_source.html
new file mode 100644
index 00000000..4ae06cb8
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Db_8php_source.html
@@ -0,0 +1,326 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/PGTStorage/Db.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/PGTStorage/Db.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="Db_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *     * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *     * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *     * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"></span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00044"></a><a class="code" href="Db_8php.html#a072d8c6ec2753e58f251cba9db5490eb">00044</a> define(<span class="stringliteral">&#39;CAS_PGT_STORAGE_DB_DEFAULT_TABLE&#39;</span>, <span class="stringliteral">&#39;cas_pgts&#39;</span>);
+<a name="l00045"></a>00045 
+<a name="l00046"></a><a class="code" href="classCAS__PGTStorage__Db.html">00046</a> <span class="keyword">class </span><a class="code" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a> <span class="keyword">extends</span> <a class="code" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a>
+<a name="l00047"></a>00047 {
+<a name="l00056"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#gac156a575124a0b6f2722d8892909b51a">00056</a>         <span class="keyword">private</span> <a class="code" href="group__internalCAS__PGTStorageDb.html#gac156a575124a0b6f2722d8892909b51a">$_pdo</a>;
+<a name="l00057"></a>00057 
+<a name="l00063"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#ga20d1b72b4a5ffd6c162925cd614a0031">00063</a>         <span class="keyword">private</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#ga20d1b72b4a5ffd6c162925cd614a0031">getPdo</a>()
+<a name="l00064"></a>00064         {
+<a name="l00065"></a>00065                 <span class="keywordflow">return</span> $this-&gt;_pdo;
+<a name="l00066"></a>00066         }
+<a name="l00067"></a>00067 
+<a name="l00071"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#gaf411a0dde3a26af1136ced781eda9ce4">00071</a>         <span class="keyword">private</span> <a class="code" href="group__internalCAS__PGTStorageDb.html#gaf411a0dde3a26af1136ced781eda9ce4">$_dsn</a>;
+<a name="l00072"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#ga0cb86fcfcc709f502d6eac01389b2cca">00072</a>         <span class="keyword">private</span> <a class="code" href="group__internalCAS__PGTStorageDb.html#ga0cb86fcfcc709f502d6eac01389b2cca">$_username</a>;
+<a name="l00073"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#ga9e7f285d618bb73b8d91496ebf1e6e83">00073</a>         <span class="keyword">private</span> <a class="code" href="group__internalCAS__PGTStorageDb.html#ga9e7f285d618bb73b8d91496ebf1e6e83">$_password</a>;
+<a name="l00074"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#gaeb3ecc301193541bd3aec19e9b71367b">00074</a>         <span class="keyword">private</span> <a class="code" href="group__internalCAS__PGTStorageDb.html#gaeb3ecc301193541bd3aec19e9b71367b">$_table_options</a>;
+<a name="l00075"></a>00075 
+<a name="l00079"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#ga0d7548f5a7d2c6c5a91b044f89055641">00079</a>         <span class="keyword">private</span> <a class="code" href="group__internalCAS__PGTStorageDb.html#ga0d7548f5a7d2c6c5a91b044f89055641">$_table</a>;
+<a name="l00080"></a>00080 
+<a name="l00086"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#ga3b535ed0b0bc84801c4bf04b337cd431">00086</a>         <span class="keyword">private</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#ga3b535ed0b0bc84801c4bf04b337cd431">getTable</a>()
+<a name="l00087"></a>00087         {
+<a name="l00088"></a>00088                 <span class="keywordflow">return</span> $this-&gt;_table;
+<a name="l00089"></a>00089         }
+<a name="l00090"></a>00090 
+<a name="l00091"></a>00091         <span class="comment">// ########################################################################</span>
+<a name="l00092"></a>00092         <span class="comment">//  DEBUGGING</span>
+<a name="l00093"></a>00093         <span class="comment">// ########################################################################</span>
+<a name="l00094"></a>00094 
+<a name="l00101"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#ga7d60f1fd625678603f67fc1960ab0fbd">00101</a>         <span class="keyword">public</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#ga7d60f1fd625678603f67fc1960ab0fbd">getStorageType</a>()
+<a name="l00102"></a>00102         {
+<a name="l00103"></a>00103                 <span class="keywordflow">return</span> <span class="stringliteral">&quot;db&quot;</span>;
+<a name="l00104"></a>00104         }
+<a name="l00105"></a>00105 
+<a name="l00113"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#gaa453c54860a59f8bf1e1550334717542">00113</a>         <span class="keyword">public</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#gaa453c54860a59f8bf1e1550334717542">getStorageInfo</a>()
+<a name="l00114"></a>00114         {
+<a name="l00115"></a>00115                 <span class="keywordflow">return</span> <span class="stringliteral">&#39;table=`&#39;</span>.$this-&gt;getTable().<span class="charliteral">&#39;\&#39;&#39;</span>;
+<a name="l00116"></a>00116         }
+<a name="l00117"></a>00117 
+<a name="l00118"></a>00118         <span class="comment">// ########################################################################</span>
+<a name="l00119"></a>00119         <span class="comment">//  CONSTRUCTOR</span>
+<a name="l00120"></a>00120         <span class="comment">// ########################################################################</span>
+<a name="l00121"></a>00121 
+<a name="l00132"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#gafeb1ab0741a5ec3cd5eae2003464f457">00132</a>         <span class="keyword">public</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#gafeb1ab0741a5ec3cd5eae2003464f457">__construct</a>($cas_parent, $dsn_or_pdo, $username=<span class="stringliteral">&#39;&#39;</span>, $password=<span class="stringliteral">&#39;&#39;</span>, $table=<span class="stringliteral">&#39;&#39;</span>, $driver_options=null)
+<a name="l00133"></a>00133         {
+<a name="l00134"></a>00134                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00135"></a>00135                 <span class="comment">// call the ancestor&#39;s constructor</span>
+<a name="l00136"></a>00136                 <a class="code" href="group__internalCAS__PGTStorageDb.html#gafeb1ab0741a5ec3cd5eae2003464f457">parent::__construct</a>($cas_parent);
+<a name="l00137"></a>00137 
+<a name="l00138"></a>00138                 <span class="comment">// set default values</span>
+<a name="l00139"></a>00139                 <span class="keywordflow">if</span> ( empty($table) ) $table = CAS_PGT_STORAGE_DB_DEFAULT_TABLE;
+<a name="l00140"></a>00140                 <span class="keywordflow">if</span> ( !is_array($driver_options) ) $driver_options = array(PDO::ATTR_ERRMODE =&gt; PDO::ERRMODE_EXCEPTION);
+<a name="l00141"></a>00141 
+<a name="l00142"></a>00142                 <span class="comment">// store the specified parameters</span>
+<a name="l00143"></a>00143                 <span class="keywordflow">if</span>($dsn_or_pdo instanceof PDO) {
+<a name="l00144"></a>00144                         $this-&gt;_pdo = $dsn_or_pdo;
+<a name="l00145"></a>00145                 }
+<a name="l00146"></a>00146                 <span class="keywordflow">else</span> {
+<a name="l00147"></a>00147                         $this-&gt;_dsn = $dsn_or_pdo;
+<a name="l00148"></a>00148                         $this-&gt;_username = $username;
+<a name="l00149"></a>00149                         $this-&gt;_password = $password;
+<a name="l00150"></a>00150                         $this-&gt;_driver_options = $driver_options;
+<a name="l00151"></a>00151                 }
+<a name="l00152"></a>00152 
+<a name="l00153"></a>00153                 <span class="comment">// store the table name</span>
+<a name="l00154"></a>00154                 $this-&gt;_table = $table;
+<a name="l00155"></a>00155 
+<a name="l00156"></a>00156                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l00157"></a>00157         }
+<a name="l00158"></a>00158 
+<a name="l00159"></a>00159         <span class="comment">// ########################################################################</span>
+<a name="l00160"></a>00160         <span class="comment">//  INITIALIZATION</span>
+<a name="l00161"></a>00161         <span class="comment">// ########################################################################</span>
+<a name="l00162"></a>00162 
+<a name="l00166"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#gaa320ce6db1544a8964fc908fbd0783df">00166</a>         <span class="keyword">public</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#gaa320ce6db1544a8964fc908fbd0783df">init</a>()
+<a name="l00167"></a>00167         {
+<a name="l00168"></a>00168                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00169"></a>00169                 <span class="comment">// if the storage has already been initialized, return immediatly</span>
+<a name="l00170"></a>00170                 <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalPGTStorage.html#gad9cadc643a37b8a000acd42189fff761">isInitialized</a>() )
+<a name="l00171"></a>00171                 <span class="keywordflow">return</span>;
+<a name="l00172"></a>00172 
+<a name="l00173"></a>00173                 <span class="comment">// initialize the base object</span>
+<a name="l00174"></a>00174                 <a class="code" href="group__internalCAS__PGTStorageDb.html#gaa320ce6db1544a8964fc908fbd0783df">parent::init</a>();
+<a name="l00175"></a>00175 
+<a name="l00176"></a>00176                 <span class="comment">// create the PDO object if it doesn&#39;t exist already</span>
+<a name="l00177"></a>00177                 <span class="keywordflow">if</span>(!($this-&gt;_pdo instanceof PDO)) {
+<a name="l00178"></a>00178                         <span class="keywordflow">try</span> {
+<a name="l00179"></a>00179                                 $this-&gt;_pdo = <span class="keyword">new</span> PDO($this-&gt;_dsn, $this-&gt;_username, $this-&gt;_password, $this-&gt;_driver_options);
+<a name="l00180"></a>00180                         }
+<a name="l00181"></a>00181                         <span class="keywordflow">catch</span>(PDOException $e) {
+<a name="l00182"></a>00182                                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;Database connection error: &#39;</span> . $e-&gt;getMessage());
+<a name="l00183"></a>00183                         }
+<a name="l00184"></a>00184                 }
+<a name="l00185"></a>00185                 
+<a name="l00186"></a>00186                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l00187"></a>00187         }
+<a name="l00188"></a>00188 
+<a name="l00189"></a>00189         <span class="comment">// ########################################################################</span>
+<a name="l00190"></a>00190         <span class="comment">//  PDO database interaction</span>
+<a name="l00191"></a>00191         <span class="comment">// ########################################################################</span>
+<a name="l00192"></a>00192 
+<a name="l00196"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#ga3c6c1256599c435efbab44881c8ec88c">00196</a>         <span class="keyword">private</span> <a class="code" href="group__internalCAS__PGTStorageDb.html#ga3c6c1256599c435efbab44881c8ec88c">$_errMode</a>;
+<a name="l00197"></a>00197 
+<a name="l00201"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#ga99a44e639bda1b88710fb08f619ab5f7">00201</a>         <span class="keyword">private</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#ga99a44e639bda1b88710fb08f619ab5f7">setErrorMode</a>()
+<a name="l00202"></a>00202         {
+<a name="l00203"></a>00203                 <span class="comment">// get PDO object and enable exception error mode</span>
+<a name="l00204"></a>00204                 $pdo = $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga20d1b72b4a5ffd6c162925cd614a0031">getPdo</a>();
+<a name="l00205"></a>00205                 $this-&gt;_errMode = $pdo-&gt;getAttribute(PDO::ATTR_ERRMODE);
+<a name="l00206"></a>00206                 $pdo-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+<a name="l00207"></a>00207         }
+<a name="l00208"></a>00208 
+<a name="l00212"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#ga2f1a321e90d6f94fca09ab6f288327b8">00212</a>         <span class="keyword">private</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#ga2f1a321e90d6f94fca09ab6f288327b8">resetErrorMode</a>()
+<a name="l00213"></a>00213         {
+<a name="l00214"></a>00214                 <span class="comment">// get PDO object and reset the error mode to what it was originally</span>
+<a name="l00215"></a>00215                 $pdo = $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga20d1b72b4a5ffd6c162925cd614a0031">getPdo</a>();
+<a name="l00216"></a>00216                 $pdo-&gt;setAttribute(PDO::ATTR_ERRMODE, $this-&gt;_errMode);
+<a name="l00217"></a>00217         }
+<a name="l00218"></a>00218 
+<a name="l00219"></a>00219         <span class="comment">// ########################################################################</span>
+<a name="l00220"></a>00220         <span class="comment">//  database queries</span>
+<a name="l00221"></a>00221         <span class="comment">// ########################################################################</span>
+<a name="l00222"></a>00222         <span class="comment">// these queries are potentially unsafe because the person using this library</span>
+<a name="l00223"></a>00223         <span class="comment">// can set the table to use, but there is no reliable way to escape SQL</span>
+<a name="l00224"></a>00224         <span class="comment">// fieldnames in PDO yet</span>
+<a name="l00225"></a>00225 
+<a name="l00231"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#gae635e9f0b055b3004779294efb933976">00231</a>         <span class="keyword">protected</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#gae635e9f0b055b3004779294efb933976">_createTableSql</a>()
+<a name="l00232"></a>00232         {
+<a name="l00233"></a>00233                 <span class="keywordflow">return</span> <span class="stringliteral">&#39;CREATE TABLE &#39;</span> . $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga3b535ed0b0bc84801c4bf04b337cd431">getTable</a>() . <span class="stringliteral">&#39; (pgt_iou VARCHAR(255) NOT NULL PRIMARY KEY, pgt VARCHAR(255) NOT NULL)&#39;</span>;
+<a name="l00234"></a>00234         }
+<a name="l00235"></a>00235 
+<a name="l00241"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#ga316e6232a75c060e13ab495e163a3196">00241</a>         <span class="keyword">protected</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#ga316e6232a75c060e13ab495e163a3196">_storePgtSql</a>()
+<a name="l00242"></a>00242         {
+<a name="l00243"></a>00243                 <span class="keywordflow">return</span> <span class="stringliteral">&#39;INSERT INTO &#39;</span> . $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga3b535ed0b0bc84801c4bf04b337cd431">getTable</a>() . <span class="stringliteral">&#39; (pgt_iou, pgt) VALUES (:pgt_iou, :pgt)&#39;</span>;
+<a name="l00244"></a>00244         }
+<a name="l00245"></a>00245 
+<a name="l00251"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#ga00f6c60f19bd223c0787a18f8ce7c703">00251</a>         <span class="keyword">protected</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#ga00f6c60f19bd223c0787a18f8ce7c703">_retrievePgtSql</a>()
+<a name="l00252"></a>00252         {
+<a name="l00253"></a>00253                 <span class="keywordflow">return</span> <span class="stringliteral">&#39;SELECT pgt FROM &#39;</span> . $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga3b535ed0b0bc84801c4bf04b337cd431">getTable</a>() . <span class="stringliteral">&#39; WHERE pgt_iou = :pgt_iou&#39;</span>;
+<a name="l00254"></a>00254         }
+<a name="l00255"></a>00255 
+<a name="l00261"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#ga57155c9d2f208404eb4ae55729559cd7">00261</a>         <span class="keyword">protected</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#ga57155c9d2f208404eb4ae55729559cd7">_deletePgtSql</a>()
+<a name="l00262"></a>00262         {
+<a name="l00263"></a>00263                 <span class="keywordflow">return</span> <span class="stringliteral">&#39;DELETE FROM &#39;</span> . $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga3b535ed0b0bc84801c4bf04b337cd431">getTable</a>() . <span class="stringliteral">&#39; WHERE pgt_iou = :pgt_iou&#39;</span>;
+<a name="l00264"></a>00264         }
+<a name="l00265"></a>00265 
+<a name="l00266"></a>00266         <span class="comment">// ########################################################################</span>
+<a name="l00267"></a>00267         <span class="comment">//  PGT I/O</span>
+<a name="l00268"></a>00268         <span class="comment">// ########################################################################</span>
+<a name="l00269"></a>00269 
+<a name="l00273"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#gad007b1dbc652edfd508e1c0fc94b0f8b">00273</a>         <span class="keyword">public</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#gad007b1dbc652edfd508e1c0fc94b0f8b">createTable</a>()
+<a name="l00274"></a>00274         {
+<a name="l00275"></a>00275                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00276"></a>00276 
+<a name="l00277"></a>00277                 <span class="comment">// initialize the PDO object for this method</span>
+<a name="l00278"></a>00278                 $pdo = $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga20d1b72b4a5ffd6c162925cd614a0031">getPdo</a>();
+<a name="l00279"></a>00279                 $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga99a44e639bda1b88710fb08f619ab5f7">setErrorMode</a>();
+<a name="l00280"></a>00280 
+<a name="l00281"></a>00281                 <span class="keywordflow">try</span> {
+<a name="l00282"></a>00282                         $pdo-&gt;beginTransaction();
+<a name="l00283"></a>00283 
+<a name="l00284"></a>00284                         $query = $pdo-&gt;query($this-&gt;_createTableSQL());
+<a name="l00285"></a>00285                         $query-&gt;closeCursor();
+<a name="l00286"></a>00286 
+<a name="l00287"></a>00287                         $pdo-&gt;commit();
+<a name="l00288"></a>00288                 }
+<a name="l00289"></a>00289                 <span class="keywordflow">catch</span>(PDOException $e) {
+<a name="l00290"></a>00290                         <span class="comment">// attempt rolling back the transaction before throwing a phpCAS error</span>
+<a name="l00291"></a>00291                         <span class="keywordflow">try</span> {
+<a name="l00292"></a>00292                                 $pdo-&gt;rollBack();
+<a name="l00293"></a>00293                         }
+<a name="l00294"></a>00294                         <span class="keywordflow">catch</span>(PDOException $e) {}
+<a name="l00295"></a>00295                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;error creating PGT storage table: &#39;</span> . $e-&gt;getMessage());
+<a name="l00296"></a>00296                 }
+<a name="l00297"></a>00297 
+<a name="l00298"></a>00298                 <span class="comment">// reset the PDO object</span>
+<a name="l00299"></a>00299                 $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga2f1a321e90d6f94fca09ab6f288327b8">resetErrorMode</a>();
+<a name="l00300"></a>00300 
+<a name="l00301"></a>00301                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l00302"></a>00302         }
+<a name="l00303"></a>00303 
+<a name="l00311"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#ga82e33c56ba5fea740d57fd3711652898">00311</a>         <span class="keyword">public</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#ga82e33c56ba5fea740d57fd3711652898">write</a>($pgt, $pgt_iou)
+<a name="l00312"></a>00312         {
+<a name="l00313"></a>00313                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00314"></a>00314 
+<a name="l00315"></a>00315                 <span class="comment">// initialize the PDO object for this method</span>
+<a name="l00316"></a>00316                 $pdo = $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga20d1b72b4a5ffd6c162925cd614a0031">getPdo</a>();
+<a name="l00317"></a>00317                 $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga99a44e639bda1b88710fb08f619ab5f7">setErrorMode</a>();
+<a name="l00318"></a>00318 
+<a name="l00319"></a>00319                 <span class="keywordflow">try</span> {
+<a name="l00320"></a>00320                         $pdo-&gt;beginTransaction();
+<a name="l00321"></a>00321 
+<a name="l00322"></a>00322                         $query = $pdo-&gt;prepare($this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga316e6232a75c060e13ab495e163a3196">_storePgtSql</a>());
+<a name="l00323"></a>00323                         $query-&gt;bindValue(<span class="stringliteral">&#39;:pgt&#39;</span>, $pgt, PDO::PARAM_STR);
+<a name="l00324"></a>00324                         $query-&gt;bindValue(<span class="stringliteral">&#39;:pgt_iou&#39;</span>, $pgt_iou, PDO::PARAM_STR);
+<a name="l00325"></a>00325                         $query-&gt;execute();
+<a name="l00326"></a>00326                         $query-&gt;closeCursor();
+<a name="l00327"></a>00327 
+<a name="l00328"></a>00328                         $pdo-&gt;commit();
+<a name="l00329"></a>00329                 }
+<a name="l00330"></a>00330                 <span class="keywordflow">catch</span>(PDOException $e) {
+<a name="l00331"></a>00331                         <span class="comment">// attempt rolling back the transaction before throwing a phpCAS error</span>
+<a name="l00332"></a>00332                         <span class="keywordflow">try</span> {
+<a name="l00333"></a>00333                                 $pdo-&gt;rollBack();
+<a name="l00334"></a>00334                         }
+<a name="l00335"></a>00335                         <span class="keywordflow">catch</span>(PDOException $e) {}
+<a name="l00336"></a>00336                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;error writing PGT to database: &#39;</span> . $e-&gt;getMessage());
+<a name="l00337"></a>00337                 }
+<a name="l00338"></a>00338 
+<a name="l00339"></a>00339                 <span class="comment">// reset the PDO object</span>
+<a name="l00340"></a>00340                 $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga2f1a321e90d6f94fca09ab6f288327b8">resetErrorMode</a>();
+<a name="l00341"></a>00341 
+<a name="l00342"></a>00342                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l00343"></a>00343         }
+<a name="l00344"></a>00344 
+<a name="l00353"></a><a class="code" href="group__internalCAS__PGTStorageDb.html#ga100a2b62fd644d608059563606717b48">00353</a>         <span class="keyword">public</span> function <a class="code" href="group__internalCAS__PGTStorageDb.html#ga100a2b62fd644d608059563606717b48">read</a>($pgt_iou)
+<a name="l00354"></a>00354         {
+<a name="l00355"></a>00355                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00356"></a>00356                 $pgt = FALSE;
+<a name="l00357"></a>00357 
+<a name="l00358"></a>00358                 <span class="comment">// initialize the PDO object for this method</span>
+<a name="l00359"></a>00359                 $pdo = $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga20d1b72b4a5ffd6c162925cd614a0031">getPdo</a>();
+<a name="l00360"></a>00360                 $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga99a44e639bda1b88710fb08f619ab5f7">setErrorMode</a>();
+<a name="l00361"></a>00361 
+<a name="l00362"></a>00362                 <span class="keywordflow">try</span> {
+<a name="l00363"></a>00363                         $pdo-&gt;beginTransaction();
+<a name="l00364"></a>00364 
+<a name="l00365"></a>00365                         <span class="comment">// fetch the pgt for the specified pgt_iou</span>
+<a name="l00366"></a>00366                         $query = $pdo-&gt;prepare($this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga00f6c60f19bd223c0787a18f8ce7c703">_retrievePgtSql</a>());
+<a name="l00367"></a>00367                         $query-&gt;bindValue(<span class="stringliteral">&#39;:pgt_iou&#39;</span>, $pgt_iou, PDO::PARAM_STR);
+<a name="l00368"></a>00368                         $query-&gt;execute();
+<a name="l00369"></a>00369                         $pgt = $query-&gt;fetchColumn(0);
+<a name="l00370"></a>00370                         $query-&gt;closeCursor();
+<a name="l00371"></a>00371 
+<a name="l00372"></a>00372                         <span class="comment">// delete the specified pgt_iou from the database</span>
+<a name="l00373"></a>00373                         $query = $pdo-&gt;prepare($this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga57155c9d2f208404eb4ae55729559cd7">_deletePgtSql</a>());
+<a name="l00374"></a>00374                         $query-&gt;bindValue(<span class="stringliteral">&#39;:pgt_iou&#39;</span>, $pgt_iou, PDO::PARAM_STR);
+<a name="l00375"></a>00375                         $query-&gt;execute();
+<a name="l00376"></a>00376                         $query-&gt;closeCursor();
+<a name="l00377"></a>00377 
+<a name="l00378"></a>00378                         $pdo-&gt;commit();
+<a name="l00379"></a>00379                 }
+<a name="l00380"></a>00380                 <span class="keywordflow">catch</span>(PDOException $e) {
+<a name="l00381"></a>00381                         <span class="comment">// attempt rolling back the transaction before throwing a phpCAS error</span>
+<a name="l00382"></a>00382                         <span class="keywordflow">try</span> {
+<a name="l00383"></a>00383                                 $pdo-&gt;rollBack();
+<a name="l00384"></a>00384                         }
+<a name="l00385"></a>00385                         <span class="keywordflow">catch</span>(PDOException $e) {}
+<a name="l00386"></a>00386                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;error reading PGT from database: &#39;</span> . $e-&gt;getMessage());
+<a name="l00387"></a>00387                 }
+<a name="l00388"></a>00388 
+<a name="l00389"></a>00389                 <span class="comment">// reset the PDO object</span>
+<a name="l00390"></a>00390                 $this-&gt;<a class="code" href="group__internalCAS__PGTStorageDb.html#ga2f1a321e90d6f94fca09ab6f288327b8">resetErrorMode</a>();
+<a name="l00391"></a>00391 
+<a name="l00392"></a>00392                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l00393"></a>00393                 <span class="keywordflow">return</span> $pgt;
+<a name="l00394"></a>00394         }
+<a name="l00395"></a>00395 
+<a name="l00398"></a>00398 }
+<a name="l00399"></a>00399 
+<a name="l00400"></a>00400 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Exception_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Exception_8php.html
new file mode 100644
index 00000000..fed66455
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Exception_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/Exception.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/Exception.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="Exception_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">interface &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__Exception.html">CAS_Exception</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Exception_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Exception_8php_source.html
new file mode 100644
index 00000000..27c8db41
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Exception_8php_source.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/Exception.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/Exception.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="Exception_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *               * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *                       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *               * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *                       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *                       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *               * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *                       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *                       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *                       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 
+<a name="l00049"></a><a class="code" href="interfaceCAS__Exception.html">00049</a> interface <a class="code" href="interfaceCAS__Exception.html">CAS_Exception</a> {
+<a name="l00050"></a>00050 
+<a name="l00051"></a>00051 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/File_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/File_8php.html
new file mode 100644
index 00000000..c9d005ff
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/File_8php.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/PGTStorage/File.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/PGTStorage/File.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="File_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>Basic class for PGT file storage </p>
+
+<p>Definition in file <a class="el" href="File_8php_source.html">File.php</a>.</p>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/File_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/File_8php_source.html
new file mode 100644
index 00000000..7d37aab2
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/File_8php_source.html
@@ -0,0 +1,200 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/PGTStorage/File.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/PGTStorage/File.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="File_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *     * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *     * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *     * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"></span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00045"></a><a class="code" href="classCAS__PGTStorage__File.html">00045</a> <span class="keyword">class </span><a class="code" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a> <span class="keyword">extends</span> <a class="code" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a>
+<a name="l00046"></a>00046 {
+<a name="l00058"></a><a class="code" href="group__internalPGTStorageFile.html#ga2808f4969d1a4310bcdaa7e02f0ea607">00058</a>         var <a class="code" href="group__internalPGTStorageFile.html#ga2808f4969d1a4310bcdaa7e02f0ea607">$_path</a>;
+<a name="l00059"></a>00059 
+<a name="l00068"></a><a class="code" href="group__internalPGTStorageFile.html#ga85d57a19425e0850dbd81aa7afe6b7a7">00068</a>         function <a class="code" href="group__internalPGTStorageFile.html#ga85d57a19425e0850dbd81aa7afe6b7a7">getPath</a>()
+<a name="l00069"></a>00069         {
+<a name="l00070"></a>00070                 <span class="keywordflow">return</span> $this-&gt;_path;
+<a name="l00071"></a>00071         }
+<a name="l00072"></a>00072 
+<a name="l00073"></a>00073         <span class="comment">// ########################################################################</span>
+<a name="l00074"></a>00074         <span class="comment">//  DEBUGGING</span>
+<a name="l00075"></a>00075         <span class="comment">// ########################################################################</span>
+<a name="l00076"></a>00076 
+<a name="l00084"></a><a class="code" href="group__internalPGTStorageFile.html#ga19d04a68b743138f9545176ba75ff58d">00084</a>         function <a class="code" href="group__internalPGTStorageFile.html#ga19d04a68b743138f9545176ba75ff58d">getStorageType</a>()
+<a name="l00085"></a>00085         {
+<a name="l00086"></a>00086                 <span class="keywordflow">return</span> <span class="stringliteral">&quot;file&quot;</span>;
+<a name="l00087"></a>00087         }
+<a name="l00088"></a>00088 
+<a name="l00096"></a><a class="code" href="group__internalPGTStorageFile.html#gad68bdd31082cd1b7852d671d0078d6ca">00096</a>         function <a class="code" href="group__internalPGTStorageFile.html#gad68bdd31082cd1b7852d671d0078d6ca">getStorageInfo</a>()
+<a name="l00097"></a>00097         {
+<a name="l00098"></a>00098                 <span class="keywordflow">return</span> <span class="stringliteral">&#39;path=`&#39;</span>.$this-&gt;getPath().<span class="charliteral">&#39;\&#39;&#39;</span>;
+<a name="l00099"></a>00099         }
+<a name="l00100"></a>00100 
+<a name="l00101"></a>00101         <span class="comment">// ########################################################################</span>
+<a name="l00102"></a>00102         <span class="comment">//  CONSTRUCTOR</span>
+<a name="l00103"></a>00103         <span class="comment">// ########################################################################</span>
+<a name="l00104"></a>00104 
+<a name="l00113"></a><a class="code" href="group__internalPGTStorageFile.html#ga23f7f09dd29619bd2550562c36713473">00113</a>         function <a class="code" href="group__internalPGTStorageFile.html#ga23f7f09dd29619bd2550562c36713473">__construct</a>($cas_parent,$path)
+<a name="l00114"></a>00114         {
+<a name="l00115"></a>00115                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00116"></a>00116                 <span class="comment">// call the ancestor&#39;s constructor</span>
+<a name="l00117"></a>00117                 <a class="code" href="group__internalPGTStorageFile.html#ga23f7f09dd29619bd2550562c36713473">parent::__construct</a>($cas_parent);
+<a name="l00118"></a>00118                 
+<a name="l00119"></a>00119                 <span class="keywordflow">if</span> (empty($path) ) $path = CAS_PGT_STORAGE_FILE_DEFAULT_PATH;
+<a name="l00120"></a>00120                 <span class="comment">// check that the path is an absolute path</span>
+<a name="l00121"></a>00121                 <span class="keywordflow">if</span> (getenv(<span class="stringliteral">&quot;OS&quot;</span>)==<span class="stringliteral">&quot;Windows_NT&quot;</span>){
+<a name="l00122"></a>00122                          
+<a name="l00123"></a>00123                         <span class="keywordflow">if</span> (!preg_match(<span class="stringliteral">&#39;`^[a-zA-Z]:`&#39;</span>, $path)) {
+<a name="l00124"></a>00124                                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;an absolute path is needed for PGT storage to file&#39;</span>);
+<a name="l00125"></a>00125                         }
+<a name="l00126"></a>00126                          
+<a name="l00127"></a>00127                 }
+<a name="l00128"></a>00128                 <span class="keywordflow">else</span>
+<a name="l00129"></a>00129                 {
+<a name="l00130"></a>00130 
+<a name="l00131"></a>00131                         <span class="keywordflow">if</span> ( $path[0] != <span class="charliteral">&#39;/&#39;</span> ) {
+<a name="l00132"></a>00132                                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;an absolute path is needed for PGT storage to file&#39;</span>);
+<a name="l00133"></a>00133                         }
+<a name="l00134"></a>00134 
+<a name="l00135"></a>00135                         <span class="comment">// store the path (with a leading and trailing &#39;/&#39;)</span>
+<a name="l00136"></a>00136                         $path = preg_replace(<span class="stringliteral">&#39;|[/]*$|&#39;</span>,<span class="charliteral">&#39;/&#39;</span>,$path);
+<a name="l00137"></a>00137                         $path = preg_replace(<span class="stringliteral">&#39;|^[/]*|&#39;</span>,<span class="charliteral">&#39;/&#39;</span>,$path);
+<a name="l00138"></a>00138                 }
+<a name="l00139"></a>00139 
+<a name="l00140"></a>00140                 $this-&gt;_path = $path;
+<a name="l00141"></a>00141                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l00142"></a>00142         }
+<a name="l00143"></a>00143 
+<a name="l00144"></a>00144         <span class="comment">// ########################################################################</span>
+<a name="l00145"></a>00145         <span class="comment">//  INITIALIZATION</span>
+<a name="l00146"></a>00146         <span class="comment">// ########################################################################</span>
+<a name="l00147"></a>00147 
+<a name="l00153"></a><a class="code" href="group__internalPGTStorageFile.html#ga422f5a7ca597539b816e87b51f445843">00153</a>         function <a class="code" href="group__internalPGTStorageFile.html#ga422f5a7ca597539b816e87b51f445843">init</a>()
+<a name="l00154"></a>00154         {
+<a name="l00155"></a>00155                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00156"></a>00156                 <span class="comment">// if the storage has already been initialized, return immediatly</span>
+<a name="l00157"></a>00157                 <span class="keywordflow">if</span> ( $this-&gt;<a class="code" href="group__internalPGTStorage.html#gad9cadc643a37b8a000acd42189fff761">isInitialized</a>() )
+<a name="l00158"></a>00158                 <span class="keywordflow">return</span>;
+<a name="l00159"></a>00159                 <span class="comment">// call the ancestor&#39;s method (mark as initialized)</span>
+<a name="l00160"></a>00160                 <a class="code" href="group__internalPGTStorageFile.html#ga422f5a7ca597539b816e87b51f445843">parent::init</a>();
+<a name="l00161"></a>00161                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l00162"></a>00162         }
+<a name="l00163"></a>00163 
+<a name="l00164"></a>00164         <span class="comment">// ########################################################################</span>
+<a name="l00165"></a>00165         <span class="comment">//  PGT I/O</span>
+<a name="l00166"></a>00166         <span class="comment">// ########################################################################</span>
+<a name="l00167"></a>00167 
+<a name="l00176"></a><a class="code" href="group__internalPGTStorageFile.html#ga0ea66347a5ab05db314d50c4212c867c">00176</a>         function <a class="code" href="group__internalPGTStorageFile.html#ga0ea66347a5ab05db314d50c4212c867c">getPGTIouFilename</a>($pgt_iou)
+<a name="l00177"></a>00177         {
+<a name="l00178"></a>00178                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00179"></a>00179                 $filename = $this-&gt;<a class="code" href="group__internalPGTStorageFile.html#ga85d57a19425e0850dbd81aa7afe6b7a7">getPath</a>().$pgt_iou.<span class="stringliteral">&#39;.plain&#39;</span>;
+<a name="l00180"></a>00180                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>($filename);
+<a name="l00181"></a>00181                 <span class="keywordflow">return</span> $filename;
+<a name="l00182"></a>00182         }
+<a name="l00183"></a>00183 
+<a name="l00193"></a><a class="code" href="group__internalPGTStorageFile.html#gae9dcfc67632d53bb890484862254ffef">00193</a>         function <a class="code" href="group__internalPGTStorageFile.html#gae9dcfc67632d53bb890484862254ffef">write</a>($pgt,$pgt_iou)
+<a name="l00194"></a>00194         {
+<a name="l00195"></a>00195                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00196"></a>00196                 $fname = $this-&gt;<a class="code" href="group__internalPGTStorageFile.html#ga0ea66347a5ab05db314d50c4212c867c">getPGTIouFilename</a>($pgt_iou);
+<a name="l00197"></a>00197                 <span class="keywordflow">if</span>(!file_exists($fname)){
+<a name="l00198"></a>00198                         <span class="keywordflow">if</span> ($f=fopen($fname,<span class="stringliteral">&quot;w&quot;</span>) ) {
+<a name="l00199"></a>00199                                 <span class="keywordflow">if</span> ( fputs($f,$pgt) === FALSE ) {
+<a name="l00200"></a>00200                                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;could not write PGT to `&#39;</span>.$fname.<span class="charliteral">&#39;\&#39;&#39;</span>);
+<a name="l00201"></a>00201                                 }
+<a name="l00202"></a>00202                                 fclose($f);
+<a name="l00203"></a>00203                         } <span class="keywordflow">else</span> {
+<a name="l00204"></a>00204                                 <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;could not open `&#39;</span>.$fname.<span class="charliteral">&#39;\&#39;&#39;</span>);
+<a name="l00205"></a>00205                         }
+<a name="l00206"></a>00206                 }<span class="keywordflow">else</span>{
+<a name="l00207"></a>00207                         <a class="code" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a>(<span class="stringliteral">&#39;File exists: `&#39;</span>.$fname.<span class="charliteral">&#39;\&#39;&#39;</span>);
+<a name="l00208"></a>00208                 }
+<a name="l00209"></a>00209                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l00210"></a>00210         }
+<a name="l00211"></a>00211 
+<a name="l00222"></a><a class="code" href="group__internalPGTStorageFile.html#ga14fe054afb4c780b567a5d8ac8214754">00222</a>         function <a class="code" href="group__internalPGTStorageFile.html#ga14fe054afb4c780b567a5d8ac8214754">read</a>($pgt_iou)
+<a name="l00223"></a>00223         {
+<a name="l00224"></a>00224                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00225"></a>00225                 $pgt = FALSE;
+<a name="l00226"></a>00226                 $fname = $this-&gt;<a class="code" href="group__internalPGTStorageFile.html#ga0ea66347a5ab05db314d50c4212c867c">getPGTIouFilename</a>($pgt_iou);
+<a name="l00227"></a>00227                 <span class="keywordflow">if</span> (file_exists($fname)){
+<a name="l00228"></a>00228                         <span class="keywordflow">if</span> ( !($f=fopen($fname,<span class="stringliteral">&quot;r&quot;</span>)) ) {
+<a name="l00229"></a>00229                                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;could not open `&#39;</span>.$fname.<span class="charliteral">&#39;\&#39;&#39;</span>);
+<a name="l00230"></a>00230                         } <span class="keywordflow">else</span> {
+<a name="l00231"></a>00231                                 <span class="keywordflow">if</span> ( ($pgt=fgets($f)) === FALSE ) {
+<a name="l00232"></a>00232                                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;could not read PGT from `&#39;</span>.$fname.<span class="charliteral">&#39;\&#39;&#39;</span>);
+<a name="l00233"></a>00233                                 }
+<a name="l00234"></a>00234                                 fclose($f);
+<a name="l00235"></a>00235                         }
+<a name="l00236"></a>00236                         
+<a name="l00237"></a>00237                         <span class="comment">// delete the PGT file</span>
+<a name="l00238"></a>00238                         @unlink($fname);
+<a name="l00239"></a>00239                 }<span class="keywordflow">else</span>{
+<a name="l00240"></a>00240                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;No such file `&#39;</span>.$fname.<span class="charliteral">&#39;\&#39;&#39;</span>);
+<a name="l00241"></a>00241                 }
+<a name="l00242"></a>00242                 <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>($pgt);
+<a name="l00243"></a>00243                 <span class="keywordflow">return</span> $pgt;
+<a name="l00244"></a>00244         }
+<a name="l00245"></a>00245 
+<a name="l00248"></a>00248 }
+<a name="l00249"></a>00249 
+<a name="l00250"></a>00250 
+<a name="l00251"></a>00251 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Get_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Get_8php.html
new file mode 100644
index 00000000..f817ef5d
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Get_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Http/Get.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Http/Get.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="Get_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Get.html">CAS_ProxiedService_Http_Get</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Get_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Get_8php_source.html
new file mode 100644
index 00000000..5164da2e
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Get_8php_source.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Http/Get.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Http/Get.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="Get_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright � 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *               * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *                       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *               * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *                       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *                       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *               * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *                       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *                       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *                       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 require_once(dirname(__FILE__).<span class="stringliteral">&#39;/Abstract.php&#39;</span>);
+<a name="l00032"></a>00032 
+<a name="l00064"></a><a class="code" href="classCAS__ProxiedService__Http__Get.html">00064</a> <span class="keyword">class </span><a class="code" href="classCAS__ProxiedService__Http__Get.html">CAS_ProxiedService_Http_Get</a>
+<a name="l00065"></a>00065         <span class="keyword">extends</span> <a class="code" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a>
+<a name="l00066"></a>00066 {
+<a name="l00067"></a>00067         
+<a name="l00074"></a><a class="code" href="classCAS__ProxiedService__Http__Get.html#aaedb46c8bbc400c2d01bdcf4b585245e">00074</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__ProxiedService__Http__Get.html#aaedb46c8bbc400c2d01bdcf4b585245e">populateRequest</a> (<a class="code" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a> $request) {
+<a name="l00075"></a>00075                 <span class="comment">// do nothing, since the URL has already been sent and that is our</span>
+<a name="l00076"></a>00076                 <span class="comment">// only data.</span>
+<a name="l00077"></a>00077         }
+<a name="l00078"></a>00078 
+<a name="l00079"></a>00079         
+<a name="l00080"></a>00080 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Http_2Abstract_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Http_2Abstract_8php.html
new file mode 100644
index 00000000..b8df8648
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Http_2Abstract_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Http/Abstract.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Http/Abstract.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="Http_2Abstract_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Http_2Abstract_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Http_2Abstract_8php_source.html
new file mode 100644
index 00000000..db18aaf1
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Http_2Abstract_8php_source.html
@@ -0,0 +1,230 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Http/Abstract.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Http/Abstract.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="Http_2Abstract_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright � 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *               * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *                       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *               * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *                       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *                       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *               * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *                       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *                       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *                       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 require_once(dirname(__FILE__).<span class="stringliteral">&#39;/../Abstract.php&#39;</span>);
+<a name="l00032"></a>00032 require_once(dirname(__FILE__).<span class="stringliteral">&#39;/../Http.php&#39;</span>);
+<a name="l00033"></a>00033 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/../Exception.php&#39;</span>);
+<a name="l00034"></a>00034 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/../../InvalidArgumentException.php&#39;</span>);
+<a name="l00035"></a>00035 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/../../OutOfSequenceException.php&#39;</span>);
+<a name="l00036"></a>00036 
+<a name="l00037"></a>00037 
+<a name="l00042"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html">00042</a> <span class="keyword">abstract</span> <span class="keyword">class </span><a class="code" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a>
+<a name="l00043"></a>00043         <span class="keyword">extends</span> <a class="code" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a>
+<a name="l00044"></a>00044         implements <a class="code" href="interfaceCAS__ProxiedService__Http.html">CAS_ProxiedService_Http</a>
+<a name="l00045"></a>00045 {
+<a name="l00051"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#acaa100e7268141dcd143f5ecc37320e9">00051</a>         <span class="keyword">protected</span> <a class="code" href="classCAS__ProxiedService__Http__Abstract.html#acaa100e7268141dcd143f5ecc37320e9">$_requestHandler</a>;
+<a name="l00052"></a>00052         
+<a name="l00058"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#ab730aea3d2b79064c658abedbcc42943">00058</a>         <span class="keyword">private</span> <a class="code" href="classCAS__ProxiedService__Http__Abstract.html#ab730aea3d2b79064c658abedbcc42943">$_cookieJar</a>;
+<a name="l00059"></a>00059         
+<a name="l00067"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#ab63e0a909fceda402baa3eeeacbdfde0">00067</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxiedService__Http__Abstract.html#ab63e0a909fceda402baa3eeeacbdfde0">__construct</a> (<a class="code" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a> $requestHandler, <a class="code" href="classCAS__CookieJar.html">CAS_CookieJar</a> $cookieJar) {
+<a name="l00068"></a>00068                 $this-&gt;_requestHandler = $requestHandler;
+<a name="l00069"></a>00069                 $this-&gt;_cookieJar = $cookieJar;
+<a name="l00070"></a>00070         }
+<a name="l00071"></a>00071         
+<a name="l00076"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#afccfaa50645a8464363f43791bdaa43a">00076</a>         <span class="keyword">private</span> <a class="code" href="classCAS__ProxiedService__Http__Abstract.html#afccfaa50645a8464363f43791bdaa43a">$_url</a>;
+<a name="l00077"></a>00077         
+<a name="l00084"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#aa7c012da853d7333857199121cf1e002">00084</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxiedService__Http__Abstract.html#aa7c012da853d7333857199121cf1e002">getServiceUrl</a> () {
+<a name="l00085"></a>00085                 <span class="keywordflow">if</span> (empty($this-&gt;_url))
+<a name="l00086"></a>00086                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a>(<span class="stringliteral">&#39;No URL set via &#39;</span>.get_class($this).<span class="stringliteral">&#39;-&gt;setUrl($url).&#39;</span>);
+<a name="l00087"></a>00087                 
+<a name="l00088"></a>00088                 <span class="keywordflow">return</span> $this-&gt;_url;
+<a name="l00089"></a>00089         }
+<a name="l00090"></a>00090         
+<a name="l00091"></a>00091         <span class="comment">/*********************************************************</span>
+<a name="l00092"></a>00092 <span class="comment">         * Configure the Request</span>
+<a name="l00093"></a>00093 <span class="comment">         *********************************************************/</span>
+<a name="l00094"></a>00094 
+<a name="l00102"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a660204c7162343fc9878cd95b15a7273">00102</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a660204c7162343fc9878cd95b15a7273">setUrl</a> ($url) {
+<a name="l00103"></a>00103                 <span class="keywordflow">if</span> ($this-&gt;<a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a49cb4bf2481ac55f091434f0e7054d67">hasBeenSent</a>())
+<a name="l00104"></a>00104                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Cannot set the URL, request already sent.&#39;</span>);
+<a name="l00105"></a>00105                 <span class="keywordflow">if</span> (!is_string($url))
+<a name="l00106"></a>00106                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a>(<span class="stringliteral">&#39;$url must be a string.&#39;</span>);
+<a name="l00107"></a>00107                 
+<a name="l00108"></a>00108                 $this-&gt;_url = $url;
+<a name="l00109"></a>00109         }
+<a name="l00110"></a>00110         
+<a name="l00111"></a>00111         <span class="comment">/*********************************************************</span>
+<a name="l00112"></a>00112 <span class="comment">         * 2. Send the Request</span>
+<a name="l00113"></a>00113 <span class="comment">         *********************************************************/</span>
+<a name="l00114"></a>00114 
+<a name="l00127"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a27175aea106f5ae5bc8461f6ac4c1fc6">00127</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a27175aea106f5ae5bc8461f6ac4c1fc6">send</a> () {
+<a name="l00128"></a>00128                 <span class="keywordflow">if</span> ($this-&gt;<a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a49cb4bf2481ac55f091434f0e7054d67">hasBeenSent</a>())
+<a name="l00129"></a>00129                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Cannot send, request already sent.&#39;</span>);
+<a name="l00130"></a>00130                 
+<a name="l00131"></a>00131                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00132"></a>00132                 
+<a name="l00133"></a>00133                 <span class="comment">// Get our proxy ticket and append it to our URL.</span>
+<a name="l00134"></a>00134                 $this-&gt;<a class="code" href="classCAS__ProxiedService__Abstract.html#a8d16ba3f8db0c521f88440b685746693">initializeProxyTicket</a>();
+<a name="l00135"></a>00135                 $url = $this-&gt;<a class="code" href="classCAS__ProxiedService__Http__Abstract.html#aa7c012da853d7333857199121cf1e002">getServiceUrl</a>();
+<a name="l00136"></a>00136                 <span class="keywordflow">if</span> ( strstr($url,<span class="charliteral">&#39;?&#39;</span>) === FALSE ) {
+<a name="l00137"></a>00137                         $url = $url.<span class="stringliteral">&#39;?ticket=&#39;</span>.$this-&gt;<a class="code" href="classCAS__ProxiedService__Abstract.html#ae0935c6797975015804403ea217b8c9a">getProxyTicket</a>();
+<a name="l00138"></a>00138                 } <span class="keywordflow">else</span> {
+<a name="l00139"></a>00139                         $url = $url.<span class="stringliteral">&#39;&amp;ticket=&#39;</span>.$this-&gt;<a class="code" href="classCAS__ProxiedService__Abstract.html#ae0935c6797975015804403ea217b8c9a">getProxyTicket</a>();
+<a name="l00140"></a>00140                 }
+<a name="l00141"></a>00141                 
+<a name="l00142"></a>00142                 <span class="keywordflow">try</span> {
+<a name="l00143"></a>00143                         $this-&gt;<a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a3f31c2009c2b099167ee9a37f72a278e">makeRequest</a>($url);
+<a name="l00144"></a>00144                 } <span class="keywordflow">catch</span> (Exception $e) {
+<a name="l00145"></a>00145                         <a class="code" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a>();
+<a name="l00146"></a>00146                         <span class="keywordflow">throw</span> $e;
+<a name="l00147"></a>00147                 }
+<a name="l00148"></a>00148         }
+<a name="l00149"></a>00149         
+<a name="l00155"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a186d09097c0291a981e0759a3b147b4e">00155</a>         <span class="keyword">private</span> <a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a186d09097c0291a981e0759a3b147b4e">$_numRequests</a> = 0;
+<a name="l00156"></a>00156         
+<a name="l00162"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#afeb924a6df557c0bb60db7669f2cac36">00162</a>         <span class="keyword">private</span> <a class="code" href="classCAS__ProxiedService__Http__Abstract.html#afeb924a6df557c0bb60db7669f2cac36">$_responseHeaders</a> = array();
+<a name="l00163"></a>00163         
+<a name="l00169"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a91190f3df8797b6015cc19d44867e075">00169</a>         <span class="keyword">private</span> <a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a91190f3df8797b6015cc19d44867e075">$_responseStatusCode</a> = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l00170"></a>00170         
+<a name="l00176"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#aa34f1b8b2524408a9e3f46704464d596">00176</a>         <span class="keyword">private</span> <a class="code" href="classCAS__ProxiedService__Http__Abstract.html#aa34f1b8b2524408a9e3f46704464d596">$_responseBody</a> = <span class="stringliteral">&#39;&#39;</span>;
+<a name="l00177"></a>00177         
+<a name="l00190"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a3f31c2009c2b099167ee9a37f72a278e">00190</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a3f31c2009c2b099167ee9a37f72a278e">makeRequest</a> ($url) {
+<a name="l00191"></a>00191                 <span class="comment">// Verify that we are not in a redirect loop</span>
+<a name="l00192"></a>00192                 $this-&gt;_numRequests++;
+<a name="l00193"></a>00193                 <span class="keywordflow">if</span> ($this-&gt;_numRequests &gt; 4) {
+<a name="l00194"></a>00194                         $message = <span class="stringliteral">&#39;Exceeded the maximum number of redirects (3) in proxied service request.&#39;</span>;
+<a name="l00195"></a>00195                         <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>($message);
+<a name="l00196"></a>00196                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a>($message);
+<a name="l00197"></a>00197                 }
+<a name="l00198"></a>00198                 
+<a name="l00199"></a>00199                 <span class="comment">// Create a new request.</span>
+<a name="l00200"></a>00200                 $request = clone $this-&gt;_requestHandler;
+<a name="l00201"></a>00201                 $request-&gt;setUrl($url);
+<a name="l00202"></a>00202                 
+<a name="l00203"></a>00203                 <span class="comment">// Add any cookies to the request.</span>
+<a name="l00204"></a>00204                 $request-&gt;addCookies($this-&gt;_cookieJar-&gt;getCookies($url));
+<a name="l00205"></a>00205                 
+<a name="l00206"></a>00206                 <span class="comment">// Add any other parts of the request needed by concrete classes</span>
+<a name="l00207"></a>00207                 $this-&gt;<a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a842fd1fe2423e9761a36d025687d2696">populateRequest</a>($request);
+<a name="l00208"></a>00208                 
+<a name="l00209"></a>00209                 <span class="comment">// Perform the request.</span>
+<a name="l00210"></a>00210                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;Performing proxied service request to \&#39;&#39;</span>.$url.<span class="charliteral">&#39;\&#39;&#39;</span>);
+<a name="l00211"></a>00211                 <span class="keywordflow">if</span> (!$request-&gt;send()) {
+<a name="l00212"></a>00212                         $message = <span class="stringliteral">&#39;Could not perform proxied service request to URL`&#39;</span>.$url.<span class="charliteral">&#39;\&#39;</span>. <span class="stringliteral">&#39;.$request-&gt;getErrorMessage();</span>
+<a name="l00213"></a>00213 <span class="stringliteral">                        phpCAS::trace($message);</span>
+<a name="l00214"></a>00214 <span class="stringliteral">                        throw new CAS_ProxiedService_Exception($message);</span>
+<a name="l00215"></a>00215 <span class="stringliteral">                }</span>
+<a name="l00216"></a>00216 <span class="stringliteral">                </span>
+<a name="l00217"></a>00217 <span class="stringliteral">                // Store any cookies from the response;</span>
+<a name="l00218"></a>00218 <span class="stringliteral">                $this-&gt;_cookieJar-&gt;storeCookies($url, $request-&gt;getResponseHeaders());</span>
+<a name="l00219"></a>00219 <span class="stringliteral">                </span>
+<a name="l00220"></a>00220 <span class="stringliteral">                // Follow any redirects</span>
+<a name="l00221"></a>00221 <span class="stringliteral">                if ($redirectUrl = $this-&gt;getRedirectUrl($request-&gt;getResponseHeaders())) {</span>
+<a name="l00222"></a>00222 <span class="stringliteral">                        phpCAS :: trace(&#39;</span>Found redirect:<span class="stringliteral">&#39;.$redirectUrl);</span>
+<a name="l00223"></a>00223 <span class="stringliteral">                        $this-&gt;makeRequest($redirectUrl);</span>
+<a name="l00224"></a>00224 <span class="stringliteral">                } else {</span>
+<a name="l00225"></a>00225 <span class="stringliteral">                        </span>
+<a name="l00226"></a>00226 <span class="stringliteral">                        $this-&gt;_responseHeaders = $request-&gt;getResponseHeaders();</span>
+<a name="l00227"></a>00227 <span class="stringliteral">                        $this-&gt;_responseBody = $request-&gt;getResponseBody();</span>
+<a name="l00228"></a>00228 <span class="stringliteral">                        $this-&gt;_responseStatusCode = $request-&gt;getResponseStatusCode();</span>
+<a name="l00229"></a>00229 <span class="stringliteral">                }</span>
+<a name="l00230"></a>00230 <span class="stringliteral">        }</span>
+<a name="l00231"></a>00231 <span class="stringliteral">        </span>
+<a name="l00238"></a>00238 <span class="stringliteral">        abstract protected function populateRequest (CAS_RequestInterface $request);</span>
+<a name="l00239"></a>00239 <span class="stringliteral">        </span>
+<a name="l00246"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#ab388296ed4aee809f34b17d07d24a33f">00246</a> <span class="stringliteral">        private function getRedirectUrl (array $responseHeaders) {</span>
+<a name="l00247"></a>00247 <span class="stringliteral">                // Check for the redirect after authentication</span>
+<a name="l00248"></a>00248 <span class="stringliteral">                foreach($responseHeaders as $header){</span>
+<a name="l00249"></a>00249 <span class="stringliteral">                        if (preg_match(&#39;</span>/^(Location:|URI:)\s*([^\s]+.*)$/<span class="stringliteral">&#39;, $header, $matches)) {</span>
+<a name="l00250"></a>00250 <span class="stringliteral">                                return trim(array_pop($matches));</span>
+<a name="l00251"></a>00251 <span class="stringliteral">                        }</span>
+<a name="l00252"></a>00252 <span class="stringliteral">                }</span>
+<a name="l00253"></a>00253 <span class="stringliteral">                return null;</span>
+<a name="l00254"></a>00254 <span class="stringliteral">        }</span>
+<a name="l00255"></a>00255 <span class="stringliteral"></span>
+<a name="l00256"></a>00256 <span class="stringliteral">        /*********************************************************</span>
+<a name="l00257"></a>00257 <span class="stringliteral">         * 3. Access the response</span>
+<a name="l00258"></a>00258 <span class="stringliteral">         *********************************************************/</span>
+<a name="l00259"></a>00259 <span class="stringliteral">        </span>
+<a name="l00265"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a49cb4bf2481ac55f091434f0e7054d67">00265</a> <span class="stringliteral">        protected function hasBeenSent () {</span>
+<a name="l00266"></a>00266 <span class="stringliteral">                return ($this-&gt;_numRequests &gt; 0);</span>
+<a name="l00267"></a>00267 <span class="stringliteral">        }</span>
+<a name="l00268"></a>00268 <span class="stringliteral"></span>
+<a name="l00275"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a400962d54b27e83597583ab96e25910c">00275</a> <span class="stringliteral">        public function getResponseHeaders () {</span>
+<a name="l00276"></a>00276 <span class="stringliteral">                if (!$this-&gt;hasBeenSent())</span>
+<a name="l00277"></a>00277 <span class="stringliteral">                        throw new CAS_OutOfSequenceException(&#39;</span>Cannot access response, request not sent yet.<span class="stringliteral">&#39;);</span>
+<a name="l00278"></a>00278 <span class="stringliteral">                </span>
+<a name="l00279"></a>00279 <span class="stringliteral">                return $this-&gt;_responseHeaders;</span>
+<a name="l00280"></a>00280 <span class="stringliteral">        }</span>
+<a name="l00281"></a>00281 <span class="stringliteral">        </span>
+<a name="l00288"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#aa276ab33d13b9b54ba59d71ae993423f">00288</a> <span class="stringliteral">        public function getResponseStatusCode () {</span>
+<a name="l00289"></a>00289 <span class="stringliteral">                if (!$this-&gt;hasBeenSent())</span>
+<a name="l00290"></a>00290 <span class="stringliteral">                        throw new CAS_OutOfSequenceException(&#39;</span>Cannot access response, request not sent yet.<span class="stringliteral">&#39;);</span>
+<a name="l00291"></a>00291 <span class="stringliteral">                </span>
+<a name="l00292"></a>00292 <span class="stringliteral">                return $this-&gt;_responseStatusCode;</span>
+<a name="l00293"></a>00293 <span class="stringliteral">        }</span>
+<a name="l00294"></a>00294 <span class="stringliteral"></span>
+<a name="l00301"></a><a class="code" href="classCAS__ProxiedService__Http__Abstract.html#aebc91e27fc543255ec29ed274fc2cd02">00301</a> <span class="stringliteral">        public function getResponseBody () {</span>
+<a name="l00302"></a>00302 <span class="stringliteral">                if (!$this-&gt;hasBeenSent())</span>
+<a name="l00303"></a>00303 <span class="stringliteral">                        throw new CAS_OutOfSequenceException(&#39;</span>Cannot access response, request not sent yet.<span class="stringliteral">&#39;);</span>
+<a name="l00304"></a>00304 <span class="stringliteral">                </span>
+<a name="l00305"></a>00305 <span class="stringliteral">                return $this-&gt;_responseBody;</span>
+<a name="l00306"></a>00306 <span class="stringliteral">        }</span>
+<a name="l00307"></a>00307 <span class="stringliteral">        </span>
+<a name="l00308"></a>00308 <span class="stringliteral">}</span>
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Http_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Http_8php.html
new file mode 100644
index 00000000..21774b6b
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Http_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Http.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Http.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="Http_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">interface &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__ProxiedService__Http.html">CAS_ProxiedService_Http</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Http_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Http_8php_source.html
new file mode 100644
index 00000000..0edc65af
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Http_8php_source.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Http.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Http.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="Http_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *               * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *                       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *               * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *                       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *                       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *               * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *                       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *                       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *                       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00035"></a><a class="code" href="interfaceCAS__ProxiedService__Http.html">00035</a> interface <a class="code" href="interfaceCAS__ProxiedService__Http.html">CAS_ProxiedService_Http</a> {
+<a name="l00036"></a>00036         
+<a name="l00037"></a>00037         <span class="comment">/*********************************************************</span>
+<a name="l00038"></a>00038 <span class="comment">         * Configure the Request</span>
+<a name="l00039"></a>00039 <span class="comment">         *********************************************************/</span>
+<a name="l00040"></a>00040 
+<a name="l00048"></a>00048         <span class="keyword">public</span> function setUrl ($url);
+<a name="l00049"></a>00049         
+<a name="l00050"></a>00050         <span class="comment">/*********************************************************</span>
+<a name="l00051"></a>00051 <span class="comment">         * 2. Send the Request</span>
+<a name="l00052"></a>00052 <span class="comment">         *********************************************************/</span>
+<a name="l00053"></a>00053 
+<a name="l00060"></a>00060         <span class="keyword">public</span> function send ();
+<a name="l00061"></a>00061 
+<a name="l00062"></a>00062         <span class="comment">/*********************************************************</span>
+<a name="l00063"></a>00063 <span class="comment">         * 3. Access the response</span>
+<a name="l00064"></a>00064 <span class="comment">         *********************************************************/</span>
+<a name="l00065"></a>00065 
+<a name="l00072"></a>00072         <span class="keyword">public</span> function getResponseHeaders ();
+<a name="l00073"></a>00073 
+<a name="l00080"></a>00080         <span class="keyword">public</span> function getResponseBody ();
+<a name="l00081"></a>00081         
+<a name="l00082"></a>00082 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Imap_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Imap_8php.html
new file mode 100644
index 00000000..1aa43645
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Imap_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Imap.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Imap.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="Imap_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Imap_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Imap_8php_source.html
new file mode 100644
index 00000000..c7b89081
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Imap_8php_source.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Imap.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Imap.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="Imap_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *               * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *                       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *               * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *                       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *                       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *               * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *                       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *                       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *                       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 require_once(dirname(__FILE__).<span class="stringliteral">&#39;/Abstract.php&#39;</span>);
+<a name="l00032"></a>00032 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/../Exception.php&#39;</span>);
+<a name="l00033"></a>00033 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/../InvalidArgumentException.php&#39;</span>);
+<a name="l00034"></a>00034 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/../OutOfSequenceException.php&#39;</span>);
+<a name="l00035"></a>00035 
+<a name="l00039"></a><a class="code" href="classCAS__ProxiedService__Imap.html">00039</a> <span class="keyword">class </span><a class="code" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a>
+<a name="l00040"></a>00040         <span class="keyword">extends</span> <a class="code" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a>
+<a name="l00041"></a>00041 {
+<a name="l00042"></a>00042         
+<a name="l00048"></a><a class="code" href="classCAS__ProxiedService__Imap.html#a93c53744acb8415e337707339e31b80f">00048</a>         <span class="keyword">private</span> <a class="code" href="classCAS__ProxiedService__Imap.html#a93c53744acb8415e337707339e31b80f">$_username</a>;
+<a name="l00049"></a>00049         
+<a name="l00056"></a><a class="code" href="classCAS__ProxiedService__Imap.html#a8fdeebc729d0136f0417fed01a9347af">00056</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxiedService__Imap.html#a8fdeebc729d0136f0417fed01a9347af">__construct</a> ($username) {
+<a name="l00057"></a>00057                 <span class="keywordflow">if</span> (!is_string($username) || !strlen($username))
+<a name="l00058"></a>00058                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a>(<span class="stringliteral">&#39;Invalid username.&#39;</span>);
+<a name="l00059"></a>00059                 
+<a name="l00060"></a>00060                 $this-&gt;_username = $username;
+<a name="l00061"></a>00061         }
+<a name="l00062"></a>00062         
+<a name="l00067"></a><a class="code" href="classCAS__ProxiedService__Imap.html#a2f542818b5f70dcd3e1a4ce7af84b2b9">00067</a>         <span class="keyword">private</span> <a class="code" href="classCAS__ProxiedService__Imap.html#a2f542818b5f70dcd3e1a4ce7af84b2b9">$_url</a>;
+<a name="l00068"></a>00068         
+<a name="l00075"></a><a class="code" href="classCAS__ProxiedService__Imap.html#a04473ce2d439ac35a6aacde9812477e0">00075</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxiedService__Imap.html#a04473ce2d439ac35a6aacde9812477e0">getServiceUrl</a> () {
+<a name="l00076"></a>00076                 <span class="keywordflow">if</span> (empty($this-&gt;_url))
+<a name="l00077"></a>00077                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a>(<span class="stringliteral">&#39;No URL set via &#39;</span>.get_class($this).<span class="stringliteral">&#39;-&gt;getServiceUrl($url).&#39;</span>);
+<a name="l00078"></a>00078                 
+<a name="l00079"></a>00079                 <span class="keywordflow">return</span> $this-&gt;_url;
+<a name="l00080"></a>00080         }
+<a name="l00081"></a>00081         
+<a name="l00082"></a>00082         <span class="comment">/*********************************************************</span>
+<a name="l00083"></a>00083 <span class="comment">         * Configure the Stream</span>
+<a name="l00084"></a>00084 <span class="comment">         *********************************************************/</span>
+<a name="l00085"></a>00085 
+<a name="l00093"></a><a class="code" href="classCAS__ProxiedService__Imap.html#a7163e006f08994bd5a8ccef7a1992379">00093</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxiedService__Imap.html#a7163e006f08994bd5a8ccef7a1992379">setServiceUrl</a> ($url) {
+<a name="l00094"></a>00094                 <span class="keywordflow">if</span> ($this-&gt;<a class="code" href="classCAS__ProxiedService__Imap.html#ace7f52150a572d314eee16c440370b33">hasBeenOpened</a>())
+<a name="l00095"></a>00095                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Cannot set the URL, stream already opened.&#39;</span>);
+<a name="l00096"></a>00096                 <span class="keywordflow">if</span> (!is_string($url) || !strlen($url))
+<a name="l00097"></a>00097                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a>(<span class="stringliteral">&#39;Invalid url.&#39;</span>);
+<a name="l00098"></a>00098                 
+<a name="l00099"></a>00099                 $this-&gt;_url = $url;
+<a name="l00100"></a>00100         }
+<a name="l00101"></a>00101         
+<a name="l00107"></a><a class="code" href="classCAS__ProxiedService__Imap.html#aa966d995726481c804be491db720d6fd">00107</a>         <span class="keyword">private</span> <a class="code" href="classCAS__ProxiedService__Imap.html#aa966d995726481c804be491db720d6fd">$_mailbox</a>;
+<a name="l00108"></a>00108         
+<a name="l00116"></a><a class="code" href="classCAS__ProxiedService__Imap.html#a70f4b28a1bfbbb562cb12f2a57b5bd18">00116</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxiedService__Imap.html#a70f4b28a1bfbbb562cb12f2a57b5bd18">setMailbox</a> ($mailbox) {
+<a name="l00117"></a>00117                 <span class="keywordflow">if</span> ($this-&gt;<a class="code" href="classCAS__ProxiedService__Imap.html#ace7f52150a572d314eee16c440370b33">hasBeenOpened</a>())
+<a name="l00118"></a>00118                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Cannot set the mailbox, stream already opened.&#39;</span>);
+<a name="l00119"></a>00119                 <span class="keywordflow">if</span> (!is_string($mailbox) || !strlen($mailbox))
+<a name="l00120"></a>00120                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a>(<span class="stringliteral">&#39;Invalid mailbox.&#39;</span>);
+<a name="l00121"></a>00121                 
+<a name="l00122"></a>00122                 $this-&gt;_mailbox = $mailbox;
+<a name="l00123"></a>00123         }
+<a name="l00124"></a>00124         
+<a name="l00130"></a><a class="code" href="classCAS__ProxiedService__Imap.html#a4b4476e2b7611e508dc6d948499a3dce">00130</a>         <span class="keyword">private</span> <a class="code" href="classCAS__ProxiedService__Imap.html#a4b4476e2b7611e508dc6d948499a3dce">$_options</a> = NULL;
+<a name="l00131"></a>00131         
+<a name="l00139"></a><a class="code" href="classCAS__ProxiedService__Imap.html#a8c79192515b195decc7b3d2062d97de0">00139</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxiedService__Imap.html#a8c79192515b195decc7b3d2062d97de0">setOptions</a> ($options) {
+<a name="l00140"></a>00140                 <span class="keywordflow">if</span> ($this-&gt;<a class="code" href="classCAS__ProxiedService__Imap.html#ace7f52150a572d314eee16c440370b33">hasBeenOpened</a>())
+<a name="l00141"></a>00141                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Cannot set options, stream already opened.&#39;</span>);
+<a name="l00142"></a>00142                 <span class="keywordflow">if</span> (!is_int($options))
+<a name="l00143"></a>00143                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a>(<span class="stringliteral">&#39;Invalid options.&#39;</span>);
+<a name="l00144"></a>00144                 
+<a name="l00145"></a>00145                 $this-&gt;_options = $options;
+<a name="l00146"></a>00146         }
+<a name="l00147"></a>00147         
+<a name="l00148"></a>00148         <span class="comment">/*********************************************************</span>
+<a name="l00149"></a>00149 <span class="comment">         * 2. Open the stream</span>
+<a name="l00150"></a>00150 <span class="comment">         *********************************************************/</span>
+<a name="l00151"></a>00151 
+<a name="l00163"></a><a class="code" href="classCAS__ProxiedService__Imap.html#ae8b09f2de23a34d420b6627dfab5efa8">00163</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxiedService__Imap.html#ae8b09f2de23a34d420b6627dfab5efa8">open</a> () {
+<a name="l00164"></a>00164                 <span class="keywordflow">if</span> ($this-&gt;<a class="code" href="classCAS__ProxiedService__Imap.html#ace7f52150a572d314eee16c440370b33">hasBeenOpened</a>())
+<a name="l00165"></a>00165                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Stream already opened.&#39;</span>);
+<a name="l00166"></a>00166                 <span class="keywordflow">if</span> (empty($this-&gt;_mailbox))
+<a name="l00167"></a>00167                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a>(<span class="stringliteral">&#39;You must specify a mailbox via &#39;</span>.get_class($this).<span class="stringliteral">&#39;-&gt;setMailbox($mailbox)&#39;</span>);
+<a name="l00168"></a>00168                 
+<a name="l00169"></a>00169                 <a class="code" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a>();
+<a name="l00170"></a>00170                 
+<a name="l00171"></a>00171                 <span class="comment">// Get our proxy ticket and append it to our URL.</span>
+<a name="l00172"></a>00172                 $this-&gt;<a class="code" href="classCAS__ProxiedService__Abstract.html#a8d16ba3f8db0c521f88440b685746693">initializeProxyTicket</a>();
+<a name="l00173"></a>00173                 <a class="code" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a>(<span class="stringliteral">&#39;opening IMAP mailbox `&#39;</span>.$this-&gt;_mailbox.<span class="charliteral">&#39;\&#39;</span>...<span class="stringliteral">&#39;);</span>
+<a name="l00174"></a>00174 <span class="stringliteral">                $this-&gt;_stream = @imap_open($this-&gt;_mailbox, $this-&gt;_username, $this-&gt;getProxyTicket(), $this-&gt;_options);</span>
+<a name="l00175"></a>00175 <span class="stringliteral">                if ($this-&gt;_stream) {</span>
+<a name="l00176"></a>00176 <span class="stringliteral">                        phpCAS::trace(&#39;</span>ok<span class="stringliteral">&#39;);</span>
+<a name="l00177"></a>00177 <span class="stringliteral">                } else {</span>
+<a name="l00178"></a>00178 <span class="stringliteral">                        phpCAS::trace(&#39;</span>could not <a class="code" href="classCAS__ProxiedService__Imap.html#ae8b09f2de23a34d420b6627dfab5efa8">open</a> mailbox<span class="stringliteral">&#39;);</span>
+<a name="l00179"></a>00179 <span class="stringliteral">                        // @todo add localization integration.</span>
+<a name="l00180"></a>00180 <span class="stringliteral">//                      $this-&gt;_errorMessage = sprintf($this-&gt;getString(CAS_STR_SERVICE_UNAVAILABLE), $url, var_export(imap_errors(),TRUE));</span>
+<a name="l00181"></a>00181 <span class="stringliteral">                        $message = &#39;</span>IMAP Error: <span class="stringliteral">&#39;.$url.&#39;</span> <span class="stringliteral">&#39;. var_export(imap_errors(),TRUE);</span>
+<a name="l00182"></a>00182 <span class="stringliteral">                        phpCAS::trace($message);</span>
+<a name="l00183"></a>00183 <span class="stringliteral">                        throw new CAS_ProxiedService_Exception($message);</span>
+<a name="l00184"></a>00184 <span class="stringliteral">                }</span>
+<a name="l00185"></a>00185 <span class="stringliteral">                                </span>
+<a name="l00186"></a>00186 <span class="stringliteral">                phpCAS::traceEnd();</span>
+<a name="l00187"></a>00187 <span class="stringliteral">                return $this-&gt;_stream;</span>
+<a name="l00188"></a>00188 <span class="stringliteral">        }</span>
+<a name="l00189"></a>00189 <span class="stringliteral">        </span>
+<a name="l00195"></a><a class="code" href="classCAS__ProxiedService__Imap.html#ace7f52150a572d314eee16c440370b33">00195</a> <span class="stringliteral">        protected function hasBeenOpened () {</span>
+<a name="l00196"></a>00196 <span class="stringliteral">                return !empty($this-&gt;_stream);</span>
+<a name="l00197"></a>00197 <span class="stringliteral">        }</span>
+<a name="l00198"></a>00198 <span class="stringliteral"></span>
+<a name="l00199"></a>00199 <span class="stringliteral">        /*********************************************************</span>
+<a name="l00200"></a>00200 <span class="stringliteral">         * 3. Access the result</span>
+<a name="l00201"></a>00201 <span class="stringliteral">         *********************************************************/</span>
+<a name="l00207"></a><a class="code" href="classCAS__ProxiedService__Imap.html#a15ac9a76b096f86951f83271c8ee869a">00207</a> <span class="stringliteral">        private $_stream;</span>
+<a name="l00208"></a>00208 <span class="stringliteral">        </span>
+<a name="l00214"></a><a class="code" href="classCAS__ProxiedService__Imap.html#a29172ade9c38c472c6ee12fcf3857dfc">00214</a> <span class="stringliteral">        public function getStream () {</span>
+<a name="l00215"></a>00215 <span class="stringliteral">                if (!$this-&gt;hasBeenOpened())</span>
+<a name="l00216"></a>00216 <span class="stringliteral">                        throw new CAS_OutOfSequenceException(&#39;</span>Cannot access stream, not opened yet.<span class="stringliteral">&#39;);</span>
+<a name="l00217"></a>00217 <span class="stringliteral">                </span>
+<a name="l00218"></a>00218 <span class="stringliteral">                return $this-&gt;_stream;</span>
+<a name="l00219"></a>00219 <span class="stringliteral">        }</span>
+<a name="l00220"></a>00220 <span class="stringliteral">        </span>
+<a name="l00228"></a><a class="code" href="classCAS__ProxiedService__Imap.html#ad93fa5f8b2cf87375c0838c2ef8ef3b8">00228</a> <span class="stringliteral">        public function getImapProxyTicket () {</span>
+<a name="l00229"></a>00229 <span class="stringliteral">                if (!$this-&gt;hasBeenOpened())</span>
+<a name="l00230"></a>00230 <span class="stringliteral">                        throw new CAS_OutOfSequenceException(&#39;</span>Cannot access errors, stream not opened yet.<span class="stringliteral">&#39;);</span>
+<a name="l00231"></a>00231 <span class="stringliteral">                </span>
+<a name="l00232"></a>00232 <span class="stringliteral">                return $this-&gt;getProxyTicket();</span>
+<a name="l00233"></a>00233 <span class="stringliteral">        }</span>
+<a name="l00234"></a>00234 <span class="stringliteral">}</span>
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/InvalidArgumentException_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/InvalidArgumentException_8php.html
new file mode 100644
index 00000000..3fb83c3b
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/InvalidArgumentException_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/InvalidArgumentException.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/InvalidArgumentException.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="InvalidArgumentException_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/InvalidArgumentException_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/InvalidArgumentException_8php_source.html
new file mode 100644
index 00000000..bf2497b4
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/InvalidArgumentException_8php_source.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/InvalidArgumentException.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/InvalidArgumentException.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="InvalidArgumentException_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *               * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *                       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *               * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *                       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *                       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *               * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *                       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *                       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *                       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 require_once(dirname(__FILE__).<span class="stringliteral">&#39;/Exception.php&#39;</span>);
+<a name="l00032"></a>00032 
+<a name="l00036"></a><a class="code" href="classCAS__InvalidArgumentException.html">00036</a> <span class="keyword">class </span><a class="code" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a>
+<a name="l00037"></a>00037         <span class="keyword">extends</span> InvalidArgumentException
+<a name="l00038"></a>00038         implements <a class="code" href="interfaceCAS__Exception.html">CAS_Exception</a>
+<a name="l00039"></a>00039 {
+<a name="l00040"></a>00040 
+<a name="l00041"></a>00041 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/OutOfSequenceException_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/OutOfSequenceException_8php.html
new file mode 100644
index 00000000..dd97286e
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/OutOfSequenceException_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/OutOfSequenceException.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/OutOfSequenceException.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="OutOfSequenceException_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/OutOfSequenceException_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/OutOfSequenceException_8php_source.html
new file mode 100644
index 00000000..59d19b29
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/OutOfSequenceException_8php_source.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/OutOfSequenceException.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/OutOfSequenceException.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="OutOfSequenceException_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *               * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *                       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *               * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *                       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *                       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *               * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *                       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *                       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *                       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 require_once(dirname(__FILE__).<span class="stringliteral">&#39;/Exception.php&#39;</span>);
+<a name="l00032"></a>00032 
+<a name="l00039"></a><a class="code" href="classCAS__OutOfSequenceException.html">00039</a> <span class="keyword">class </span><a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>
+<a name="l00040"></a>00040         <span class="keyword">extends</span> BadMethodCallException
+<a name="l00041"></a>00041         implements <a class="code" href="interfaceCAS__Exception.html">CAS_Exception</a>
+<a name="l00042"></a>00042 {
+<a name="l00043"></a>00043 
+<a name="l00044"></a>00044 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Post_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Post_8php.html
new file mode 100644
index 00000000..6a0a98a9
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Post_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Http/Post.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Http/Post.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="Post_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Post.html">CAS_ProxiedService_Http_Post</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Post_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Post_8php_source.html
new file mode 100644
index 00000000..7559766a
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Post_8php_source.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Http/Post.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Http/Post.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="Post_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright � 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *               * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *                       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *               * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *                       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *                       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *               * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *                       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *                       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *                       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 require_once(dirname(__FILE__).<span class="stringliteral">&#39;/Abstract.php&#39;</span>);
+<a name="l00032"></a>00032 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/../Exception.php&#39;</span>);
+<a name="l00033"></a>00033 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/../../InvalidArgumentException.php&#39;</span>);
+<a name="l00034"></a>00034 include_once(dirname(__FILE__).<span class="stringliteral">&#39;/../../OutOfSequenceException.php&#39;</span>);
+<a name="l00035"></a>00035 
+<a name="l00068"></a><a class="code" href="classCAS__ProxiedService__Http__Post.html">00068</a> <span class="keyword">class </span><a class="code" href="classCAS__ProxiedService__Http__Post.html">CAS_ProxiedService_Http_Post</a>
+<a name="l00069"></a>00069         <span class="keyword">extends</span> <a class="code" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a>
+<a name="l00070"></a>00070 {
+<a name="l00071"></a>00071 
+<a name="l00077"></a><a class="code" href="classCAS__ProxiedService__Http__Post.html#a7c0840bde188bed301609ca92b77efcb">00077</a>         <span class="keyword">private</span> <a class="code" href="classCAS__ProxiedService__Http__Post.html#a7c0840bde188bed301609ca92b77efcb">$_contentType</a>;
+<a name="l00078"></a>00078         
+<a name="l00084"></a><a class="code" href="classCAS__ProxiedService__Http__Post.html#a0e064cede54799dcf885dfdc807b1d72">00084</a>         <span class="keyword">private</span> <a class="code" href="classCAS__ProxiedService__Http__Post.html#a0e064cede54799dcf885dfdc807b1d72">$_body</a>;
+<a name="l00085"></a>00085         
+<a name="l00093"></a><a class="code" href="classCAS__ProxiedService__Http__Post.html#a22b8ab783f8a614c82320269a4c66f9a">00093</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxiedService__Http__Post.html#a22b8ab783f8a614c82320269a4c66f9a">setContentType</a> ($contentType) {
+<a name="l00094"></a>00094                 <span class="keywordflow">if</span> ($this-&gt;<a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a49cb4bf2481ac55f091434f0e7054d67">hasBeenSent</a>())
+<a name="l00095"></a>00095                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Cannot set the content type, request already sent.&#39;</span>);
+<a name="l00096"></a>00096                 
+<a name="l00097"></a>00097                 $this-&gt;_contentType = $contentType;
+<a name="l00098"></a>00098         }
+<a name="l00099"></a>00099 
+<a name="l00107"></a><a class="code" href="classCAS__ProxiedService__Http__Post.html#aef5a1524cefe9cd2e08e7700cf2151f9">00107</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxiedService__Http__Post.html#aef5a1524cefe9cd2e08e7700cf2151f9">setBody</a> ($body) {
+<a name="l00108"></a>00108                 <span class="keywordflow">if</span> ($this-&gt;<a class="code" href="classCAS__ProxiedService__Http__Abstract.html#a49cb4bf2481ac55f091434f0e7054d67">hasBeenSent</a>())
+<a name="l00109"></a>00109                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>(<span class="stringliteral">&#39;Cannot set the body, request already sent.&#39;</span>);
+<a name="l00110"></a>00110                 
+<a name="l00111"></a>00111                 $this-&gt;_body = $body;
+<a name="l00112"></a>00112         }
+<a name="l00113"></a>00113         
+<a name="l00120"></a><a class="code" href="classCAS__ProxiedService__Http__Post.html#a53443c2638d51a29006056f42d28128b">00120</a>         <span class="keyword">protected</span> function <a class="code" href="classCAS__ProxiedService__Http__Post.html#a53443c2638d51a29006056f42d28128b">populateRequest</a> (<a class="code" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a> $request) {
+<a name="l00121"></a>00121                 <span class="keywordflow">if</span> (empty($this-&gt;_contentType) &amp;&amp; !empty($this-&gt;_body))
+<a name="l00122"></a>00122                         <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a>(<span class="stringliteral">&quot;If you pass a POST body, you must specify a content type via &quot;</span>.get_class($this).<span class="stringliteral">&#39;-&gt;setContentType($contentType).&#39;</span>);
+<a name="l00123"></a>00123                 
+<a name="l00124"></a>00124                 $request-&gt;<a class="code" href="interfaceCAS__RequestInterface.html#abc0658bec27d70286f12712944229e9b">makePost</a>();
+<a name="l00125"></a>00125                 <span class="keywordflow">if</span> (!empty($this-&gt;_body)) {
+<a name="l00126"></a>00126                         $request-&gt;<a class="code" href="interfaceCAS__RequestInterface.html#a01f51e770a063eb289ac12c03a5346e6">addHeader</a>(<span class="stringliteral">&#39;Content-Type: &#39;</span>.$this-&gt;_contentType);
+<a name="l00127"></a>00127                         $request-&gt;<a class="code" href="interfaceCAS__RequestInterface.html#a01f51e770a063eb289ac12c03a5346e6">addHeader</a>(<span class="stringliteral">&#39;Content-Length: &#39;</span>.strlen($this-&gt;_body));
+<a name="l00128"></a>00128                         $request-&gt;<a class="code" href="interfaceCAS__RequestInterface.html#aab89b06410e705f16528f8883bb8f496">setPostBody</a>($this-&gt;_body);
+<a name="l00129"></a>00129                 }
+<a name="l00130"></a>00130         }
+<a name="l00131"></a>00131 
+<a name="l00132"></a>00132         
+<a name="l00133"></a>00133 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxiedService_2Exception_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxiedService_2Exception_8php.html
new file mode 100644
index 00000000..86344d86
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxiedService_2Exception_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Exception.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Exception.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="ProxiedService_2Exception_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxiedService_2Exception_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxiedService_2Exception_8php_source.html
new file mode 100644
index 00000000..297f5ce0
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxiedService_2Exception_8php_source.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Exception.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Exception.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="ProxiedService_2Exception_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *               * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *                       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *               * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *                       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *                       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *               * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *                       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *                       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *                       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 require_once(dirname(__FILE__).<span class="stringliteral">&#39;/../Exception.php&#39;</span>);
+<a name="l00032"></a>00032 
+<a name="l00036"></a><a class="code" href="classCAS__ProxiedService__Exception.html">00036</a> <span class="keyword">class </span><a class="code" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a>
+<a name="l00037"></a>00037         <span class="keyword">extends</span> Exception
+<a name="l00038"></a>00038         implements <a class="code" href="interfaceCAS__Exception.html">CAS_Exception</a>
+<a name="l00039"></a>00039 {
+<a name="l00040"></a>00040 
+<a name="l00041"></a>00041 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxiedService_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxiedService_8php.html
new file mode 100644
index 00000000..5a828dcd
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxiedService_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/ProxiedService.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="ProxiedService_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">interface &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxiedService_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxiedService_8php_source.html
new file mode 100644
index 00000000..0b4d3ff4
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxiedService_8php_source.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/ProxiedService.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="ProxiedService_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright � 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *               * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *                       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *               * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *                       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *                       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *               * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *                       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *                       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *                       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00041"></a><a class="code" href="interfaceCAS__ProxiedService.html">00041</a> interface <a class="code" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a> {
+<a name="l00042"></a>00042                 
+<a name="l00049"></a>00049         <span class="keyword">public</span> function getServiceUrl ();
+<a name="l00050"></a>00050         
+<a name="l00059"></a>00059         <span class="keyword">public</span> function setProxyTicket ($proxyTicket);
+<a name="l00060"></a>00060         
+<a name="l00061"></a>00061 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxyTicketException_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxyTicketException_8php.html
new file mode 100644
index 00000000..46a7e0cb
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxyTicketException_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxyTicketException.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/ProxyTicketException.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="ProxyTicketException_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxyTicketException_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxyTicketException_8php_source.html
new file mode 100644
index 00000000..b549ffc6
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/ProxyTicketException_8php_source.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxyTicketException.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/ProxyTicketException.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="ProxyTicketException_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *               * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *                       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *               * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *                       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *                       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *               * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *                       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *                       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *                       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 require_once(dirname(__FILE__).<span class="stringliteral">&#39;/Exception.php&#39;</span>);
+<a name="l00032"></a>00032 
+<a name="l00036"></a><a class="code" href="classCAS__ProxyTicketException.html">00036</a> <span class="keyword">class </span><a class="code" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a>
+<a name="l00037"></a>00037         <span class="keyword">extends</span> BadMethodCallException
+<a name="l00038"></a>00038         implements <a class="code" href="interfaceCAS__Exception.html">CAS_Exception</a>
+<a name="l00039"></a>00039 {
+<a name="l00040"></a>00040         
+<a name="l00049"></a><a class="code" href="classCAS__ProxyTicketException.html#ad451fec20aa0b3b9cd3f8c711195bacd">00049</a>         <span class="keyword">public</span> function <a class="code" href="classCAS__ProxyTicketException.html#ad451fec20aa0b3b9cd3f8c711195bacd">__construct</a> ($message, $code = <a class="code" href="group__publicServices.html#ga63639adfb3fdbe13a1708e4823380b4d">PHPCAS_SERVICE_PT_FAILURE</a>) {
+<a name="l00050"></a>00050                 <span class="comment">// Warn if the code is not in our allowed list</span>
+<a name="l00051"></a>00051                 $ptCodes = array(
+<a name="l00052"></a>00052                         <a class="code" href="group__publicServices.html#ga63639adfb3fdbe13a1708e4823380b4d">PHPCAS_SERVICE_PT_FAILURE</a>, 
+<a name="l00053"></a>00053                         <a class="code" href="group__publicServices.html#ga7de1d5537c1fa74b4a180d94dc165c37">PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE</a>, 
+<a name="l00054"></a>00054                         <a class="code" href="group__publicServices.html#gab8fd1de27f50f53dac55bf1287ad0e70">PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE</a>,
+<a name="l00055"></a>00055                 );
+<a name="l00056"></a>00056                 <span class="keywordflow">if</span> (!in_array($code, $ptCodes)) {
+<a name="l00057"></a>00057                         trigger_error(<span class="stringliteral">&#39;Invalid code &#39;</span>.$code.<span class="stringliteral">&#39; passed. Must be one of PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, or PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE.&#39;</span>);
+<a name="l00058"></a>00058                 }
+<a name="l00059"></a>00059                 
+<a name="l00060"></a>00060                 <a class="code" href="classCAS__ProxyTicketException.html#ad451fec20aa0b3b9cd3f8c711195bacd">parent::__construct</a>($message, $code);
+<a name="l00061"></a>00061         }
+<a name="l00062"></a>00062 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/RequestInterface_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/RequestInterface_8php.html
new file mode 100644
index 00000000..22904391
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/RequestInterface_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/Request/RequestInterface.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/Request/RequestInterface.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="RequestInterface_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">interface &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/RequestInterface_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/RequestInterface_8php_source.html
new file mode 100644
index 00000000..872bc740
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/RequestInterface_8php_source.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/Request/RequestInterface.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/Request/RequestInterface.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="RequestInterface_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *         * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *               this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *         * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *               this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *               and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *         * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *               Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *               promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *               written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"></span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00034"></a><a class="code" href="interfaceCAS__RequestInterface.html">00034</a> interface <a class="code" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a> {
+<a name="l00035"></a>00035 
+<a name="l00036"></a>00036         <span class="comment">/*********************************************************</span>
+<a name="l00037"></a>00037 <span class="comment">         * Configure the Request</span>
+<a name="l00038"></a>00038 <span class="comment">         *********************************************************/</span>
+<a name="l00039"></a>00039 
+<a name="l00047"></a>00047         <span class="keyword">public</span> function setUrl ($url);
+<a name="l00048"></a>00048 
+<a name="l00057"></a>00057         <span class="keyword">public</span> function addCookie ($name, $value);
+<a name="l00058"></a>00058 
+<a name="l00068"></a>00068         <span class="keyword">public</span> function addCookies (array $cookies);
+<a name="l00069"></a>00069 
+<a name="l00077"></a>00077         <span class="keyword">public</span> function addHeader ($header);
+<a name="l00078"></a>00078 
+<a name="l00086"></a>00086         <span class="keyword">public</span> function addHeaders (array $headers);
+<a name="l00087"></a>00087 
+<a name="l00094"></a>00094         <span class="keyword">public</span> function makePost ();
+<a name="l00095"></a>00095 
+<a name="l00103"></a>00103         <span class="keyword">public</span> function setPostBody ($body);
+<a name="l00104"></a>00104 
+<a name="l00105"></a>00105 
+<a name="l00113"></a>00113         <span class="keyword">public</span> function setSslCaCert ($caCertPath);
+<a name="l00114"></a>00114 
+<a name="l00115"></a>00115 
+<a name="l00116"></a>00116 
+<a name="l00117"></a>00117         <span class="comment">/*********************************************************</span>
+<a name="l00118"></a>00118 <span class="comment">         * 2. Send the Request</span>
+<a name="l00119"></a>00119 <span class="comment">         *********************************************************/</span>
+<a name="l00120"></a>00120 
+<a name="l00127"></a>00127         <span class="keyword">public</span> function send ();
+<a name="l00128"></a>00128 
+<a name="l00129"></a>00129         <span class="comment">/*********************************************************</span>
+<a name="l00130"></a>00130 <span class="comment">         * 3. Access the response</span>
+<a name="l00131"></a>00131 <span class="comment">         *********************************************************/</span>
+<a name="l00132"></a>00132 
+<a name="l00139"></a>00139         <span class="keyword">public</span> function getResponseHeaders ();
+<a name="l00140"></a>00140         
+<a name="l00147"></a>00147         <span class="keyword">public</span> function getResponseStatusCode ();
+<a name="l00148"></a>00148         
+<a name="l00155"></a>00155         <span class="keyword">public</span> function getResponseBody ();
+<a name="l00156"></a>00156 
+<a name="l00163"></a>00163         <span class="keyword">public</span> function getErrorMessage ();
+<a name="l00164"></a>00164 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Request_2Exception_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Request_2Exception_8php.html
new file mode 100644
index 00000000..543efe47
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Request_2Exception_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/Request/Exception.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/Request/Exception.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="Request_2Exception_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__Request__Exception.html">CAS_Request_Exception</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Request_2Exception_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Request_2Exception_8php_source.html
new file mode 100644
index 00000000..e710da33
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Request_2Exception_8php_source.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/Request/Exception.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/Request/Exception.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="Request_2Exception_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright © 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *               * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *                       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *               * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *                       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *                       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *               * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *                       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *                       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *                       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 require_once(dirname(__FILE__).<span class="stringliteral">&#39;/../Exception.php&#39;</span>);
+<a name="l00032"></a>00032 
+<a name="l00036"></a><a class="code" href="classCAS__Request__Exception.html">00036</a> <span class="keyword">class </span><a class="code" href="classCAS__Request__Exception.html">CAS_Request_Exception</a>
+<a name="l00037"></a>00037         <span class="keyword">extends</span> Exception
+<a name="l00038"></a>00038         implements <a class="code" href="interfaceCAS__Exception.html">CAS_Exception</a>
+<a name="l00039"></a>00039 {
+<a name="l00040"></a>00040 
+<a name="l00041"></a>00041 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Testable_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Testable_8php.html
new file mode 100644
index 00000000..4dcc7ed5
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Testable_8php.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Testable.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Testable.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="Testable_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">interface &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__ProxiedService__Testable.html">CAS_ProxiedService_Testable</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Testable_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Testable_8php_source.html
new file mode 100644
index 00000000..ada61af8
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/Testable_8php_source.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/ProxiedService/Testable.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/ProxiedService/Testable.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="Testable_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">/*</span>
+<a name="l00003"></a>00003 <span class="comment"> * Copyright � 2003-2010, The ESUP-Portail consortium &amp; the JA-SIG Collaborative.</span>
+<a name="l00004"></a>00004 <span class="comment"> * All rights reserved.</span>
+<a name="l00005"></a>00005 <span class="comment"> *</span>
+<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
+<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions are met:</span>
+<a name="l00008"></a>00008 <span class="comment"> *</span>
+<a name="l00009"></a>00009 <span class="comment"> *               * Redistributions of source code must retain the above copyright notice,</span>
+<a name="l00010"></a>00010 <span class="comment"> *                       this list of conditions and the following disclaimer.</span>
+<a name="l00011"></a>00011 <span class="comment"> *               * Redistributions in binary form must reproduce the above copyright notice,</span>
+<a name="l00012"></a>00012 <span class="comment"> *                       this list of conditions and the following disclaimer in the documentation</span>
+<a name="l00013"></a>00013 <span class="comment"> *                       and/or other materials provided with the distribution.</span>
+<a name="l00014"></a>00014 <span class="comment"> *               * Neither the name of the ESUP-Portail consortium &amp; the JA-SIG</span>
+<a name="l00015"></a>00015 <span class="comment"> *                       Collaborative nor the names of its contributors may be used to endorse or</span>
+<a name="l00016"></a>00016 <span class="comment"> *                       promote products derived from this software without specific prior</span>
+<a name="l00017"></a>00017 <span class="comment"> *                       written permission.</span>
+<a name="l00018"></a>00018 <span class="comment"> *</span>
+<a name="l00019"></a>00019 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span>
+<a name="l00020"></a>00020 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
+<a name="l00021"></a>00021 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
+<a name="l00022"></a>00022 <span class="comment"> * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR</span>
+<a name="l00023"></a>00023 <span class="comment"> * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span>
+<a name="l00024"></a>00024 <span class="comment"> * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span>
+<a name="l00025"></a>00025 <span class="comment"> * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON</span>
+<a name="l00026"></a>00026 <span class="comment"> * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
+<a name="l00027"></a>00027 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
+<a name="l00028"></a>00028 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
+<a name="l00029"></a>00029 <span class="comment"> */</span>
+<a name="l00030"></a>00030 
+<a name="l00050"></a><a class="code" href="interfaceCAS__ProxiedService__Testable.html">00050</a> interface <a class="code" href="interfaceCAS__ProxiedService__Testable.html">CAS_ProxiedService_Testable</a> {
+<a name="l00051"></a>00051                 
+<a name="l00063"></a>00063         <span class="keyword">public</span> function setCasClient (<a class="code" href="classCAS__Client.html">CAS_Client</a> $casClient);
+<a name="l00064"></a>00064         
+<a name="l00065"></a>00065 }
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/annotated.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/annotated.html
new file mode 100644
index 00000000..aabb1c1a
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/annotated.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Class List</h1>  </div>
+</div>
+<div class="contents">
+Here are the classes, structs, unions and interfaces with brief descriptions:<table>
+  <tr><td class="indexkey"><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__CurlRequest.html">CAS_CurlRequest</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="interfaceCAS__Exception.html">CAS_Exception</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="interfaceCAS__ProxiedService__Http.html">CAS_ProxiedService_Http</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__ProxiedService__Http__Get.html">CAS_ProxiedService_Http_Get</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__ProxiedService__Http__Post.html">CAS_ProxiedService_Http_Post</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="interfaceCAS__ProxiedService__Testable.html">CAS_ProxiedService_Testable</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classCAS__Request__Exception.html">CAS_Request_Exception</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="classphpCAS.html">phpCAS</a></td><td class="indexvalue"></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/bc_s.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/bc_s.png
new file mode 100644
index 00000000..e4018628
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/bc_s.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/catalan_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/catalan_8php.html
new file mode 100644
index 00000000..d54e952b
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/catalan_8php.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/catalan.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>CAS/languages/catalan.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="catalan_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">$this&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="catalan_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a></td></tr>
+</table>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="a3e2715c2e334fb91d34437e4ff025f1f"></a><!-- doxytag: member="catalan.php::_strings" ref="a3e2715c2e334fb91d34437e4ff025f1f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$this <a class="el" href="spanish_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<b>Initial value:</b><div class="fragment"><pre class="fragment"> array(
+<a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a>
+=&gt; <span class="stringliteral">&#39;usant servidor&#39;</span>,
+<a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a>
+=&gt; <span class="stringliteral">&#39;Autentificació CAS necessària!&#39;</span>,
+<a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a>
+=&gt; <span class="stringliteral">&#39;Sortida de CAS necessària!&#39;</span>,
+<a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a>
+=&gt; <span class="stringliteral">&#39;Ja hauria d\ haver estat redireccionat al servidor CAS. Feu click &lt;a href=&quot;%s&quot;&gt;aquí&lt;/a&gt; per a continuar.&#39;</span>,
+<a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a>
+=&gt; <span class="stringliteral">&#39;Autentificació CAS fallida!&#39;</span>,
+<a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a>
+=&gt; <span class="stringliteral">&#39;&lt;p&gt;No estàs autentificat.&lt;/p&gt;&lt;p&gt;Pots tornar a intentar-ho fent click &lt;a href=&quot;%s&quot;&gt;aquí&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Si el problema persisteix hauría de contactar amb l\&#39;&lt;a href=&quot;mailto:%s&quot;&gt;administrador d\&#39;aquest llocc&lt;/a&gt;.&lt;/p&gt;&#39;</span>,
+<a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>
+=&gt; <span class="stringliteral">&#39;El servei `&lt;b&gt;%s&lt;/b&gt;\&#39; no està disponible (&lt;b&gt;%s&lt;/b&gt;).&#39;</span>
+)
+</pre></div>
+<p>Definition at line <a class="el" href="catalan_8php_source.html#l00010">10</a> of file <a class="el" href="catalan_8php_source.html">catalan.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00226">CAS_Client::getString()</a>, and <a class="el" href="Client_8php_source.html#l00245">CAS_Client::setLang()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/catalan_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/catalan_8php_source.html
new file mode 100644
index 00000000..f885931b
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/catalan_8php_source.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/catalan.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/languages/catalan.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="catalan_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 
+<a name="l00010"></a><a class="code" href="catalan_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">00010</a> $this-&gt;<a class="code" href="catalan_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a> = array(
+<a name="l00011"></a>00011 <a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a>
+<a name="l00012"></a>00012 =&gt; <span class="stringliteral">&#39;usant servidor&#39;</span>,
+<a name="l00013"></a>00013 <a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a>
+<a name="l00014"></a>00014 =&gt; <span class="stringliteral">&#39;Autentificació CAS necessària!&#39;</span>,
+<a name="l00015"></a>00015 <a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a>
+<a name="l00016"></a>00016 =&gt; <span class="stringliteral">&#39;Sortida de CAS necessària!&#39;</span>,
+<a name="l00017"></a>00017 <a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a>
+<a name="l00018"></a>00018 =&gt; <span class="stringliteral">&#39;Ja hauria d\ haver estat redireccionat al servidor CAS. Feu click &lt;a href=&quot;%s&quot;&gt;aquí&lt;/a&gt; per a continuar.&#39;</span>,
+<a name="l00019"></a>00019 <a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a>
+<a name="l00020"></a>00020 =&gt; <span class="stringliteral">&#39;Autentificació CAS fallida!&#39;</span>,
+<a name="l00021"></a>00021 <a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a>
+<a name="l00022"></a>00022 =&gt; <span class="stringliteral">&#39;&lt;p&gt;No estàs autentificat.&lt;/p&gt;&lt;p&gt;Pots tornar a intentar-ho fent click &lt;a href=&quot;%s&quot;&gt;aquí&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Si el problema persisteix hauría de contactar amb l\&#39;&lt;a href=&quot;mailto:%s&quot;&gt;administrador d\&#39;aquest llocc&lt;/a&gt;.&lt;/p&gt;&#39;</span>,
+<a name="l00023"></a>00023 <a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>
+<a name="l00024"></a>00024 =&gt; <span class="stringliteral">&#39;El servei `&lt;b&gt;%s&lt;/b&gt;\&#39; no està disponible (&lt;b&gt;%s&lt;/b&gt;).&#39;</span>
+<a name="l00025"></a>00025 );
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__AbstractRequest-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__AbstractRequest-members.html
new file mode 100644
index 00000000..4f9bfb79
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__AbstractRequest-members.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_AbstractRequest Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ae6a9874cd7a448aad2e2c4f1cadc219d">$caCertPath</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#aac0a3f05ed0ede8440d471e6fac19d80">$cookies</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#aaeae803137d9e0853b4f74be77717746">$errorMessage</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ab754b8d9e59974c4b11c849d8ac6880a">$headers</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a575df6fa81b65ed3dffb3f5e12dad1db">$isPost</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a11ff9877605f46c02d157fe3d8e4ba13">$postBody</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a99007554a5272f4d755981f6d9d60f8c">$responseBody</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#affe123d99a4af63b66c3ed889421c471">$responseHeaders</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a9b557de521c65ab01b2dba5ecaaa9019">$sent</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ab16b0fdb897db17ac1ff688e1d958de7">$url</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a43e6cdeecffb2d9eacb6cf0c345903f5">_sendRequest</a>()</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a2e29d483c57f1046e23571507a45d5f3">addCookie</a>($name, $value)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a6e8e852978e024cbf7ace013305fa189">addCookies</a>(array $cookies)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#adae53ccc81ddd2cb2fbeceba12fcb5d6">addHeader</a>($header)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ab21afb8f694810cbc7f6111005f39e40">addHeaders</a>(array $headers)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a2ef7ce228560085d1897b9283389a524">getErrorMessage</a>()</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a6eadacb1d96591a8f3c45175754d10c5">getResponseBody</a>()</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a3004eb18cf732bb9a79b7a26b765147b">getResponseHeaders</a>()</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ac60da872e526cdd006204502240ad755">getResponseStatusCode</a>()</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ac430f85c6303a96ffc854c6bbdefd95e">makePost</a>()</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#abbd007c2f687b52d0718ce209c325e80">send</a>()</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a99f6b47e913ed0be7a2e64e3595fed8d">setPostBody</a>($body)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ae4dd91db303801bfb205aa9f0f12b7f6">setSslCaCert</a>($caCertPath)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#aba433b87d3204f928b8fe1af4b1a1df8">setUrl</a>($url)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ad0a53a42fa2ebc75e6758521d6c7466b">storeErrorMessage</a>($message)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a39f3b67606a2d40b23263f8ca257f7f5">storeResponseBody</a>($body)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#af99b6e9695cb90d0a1dfd6b117ab06a7">storeResponseHeader</a>($header)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a7a671fde2517c97054187ffe2ba303da">storeResponseHeaders</a>(array $headers)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__AbstractRequest.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__AbstractRequest.html
new file mode 100644
index 00000000..6bae3479
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__AbstractRequest.html
@@ -0,0 +1,836 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_AbstractRequest Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pro-attribs">Protected Attributes</a> &#124;
+<a href="#pri-attribs">Private Attributes</a>  </div>
+  <div class="headertitle">
+<h1>CAS_AbstractRequest Class Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_AbstractRequest" --><!-- doxytag: inherits="CAS_RequestInterface" --><div class="dynheader">
+Inheritance diagram for CAS_AbstractRequest:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__AbstractRequest.png" usemap="#CAS_AbstractRequest_map" alt=""/>
+  <map id="CAS_AbstractRequest_map" name="CAS_AbstractRequest_map">
+<area href="interfaceCAS__RequestInterface.html" alt="CAS_RequestInterface" shape="rect" coords="0,0,139,24"/>
+<area href="classCAS__CurlRequest.html" alt="CAS_CurlRequest" shape="rect" coords="0,112,139,136"/>
+</map>
+</div>
+
+<p><a href="classCAS__AbstractRequest-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#aba433b87d3204f928b8fe1af4b1a1df8">setUrl</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#a2e29d483c57f1046e23571507a45d5f3">addCookie</a> ($name, $value)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#a6e8e852978e024cbf7ace013305fa189">addCookies</a> (array $cookies)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#adae53ccc81ddd2cb2fbeceba12fcb5d6">addHeader</a> ($header)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#ab21afb8f694810cbc7f6111005f39e40">addHeaders</a> (array $headers)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#ac430f85c6303a96ffc854c6bbdefd95e">makePost</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#a99f6b47e913ed0be7a2e64e3595fed8d">setPostBody</a> ($body)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#ae4dd91db303801bfb205aa9f0f12b7f6">setSslCaCert</a> ($caCertPath)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#abbd007c2f687b52d0718ce209c325e80">send</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#a3004eb18cf732bb9a79b7a26b765147b">getResponseHeaders</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#ac60da872e526cdd006204502240ad755">getResponseStatusCode</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#a6eadacb1d96591a8f3c45175754d10c5">getResponseBody</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#a2ef7ce228560085d1897b9283389a524">getErrorMessage</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#a43e6cdeecffb2d9eacb6cf0c345903f5">_sendRequest</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#a7a671fde2517c97054187ffe2ba303da">storeResponseHeaders</a> (array $headers)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#af99b6e9695cb90d0a1dfd6b117ab06a7">storeResponseHeader</a> ($header)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#a39f3b67606a2d40b23263f8ca257f7f5">storeResponseBody</a> ($body)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#ad0a53a42fa2ebc75e6758521d6c7466b">storeErrorMessage</a> ($message)</td></tr>
+<tr><td colspan="2"><h2><a name="pro-attribs"></a>
+Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#ab16b0fdb897db17ac1ff688e1d958de7">$url</a> = null</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#aac0a3f05ed0ede8440d471e6fac19d80">$cookies</a> = array()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#ab754b8d9e59974c4b11c849d8ac6880a">$headers</a> = array()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#a575df6fa81b65ed3dffb3f5e12dad1db">$isPost</a> = FALSE</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#a11ff9877605f46c02d157fe3d8e4ba13">$postBody</a> = null</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#ae6a9874cd7a448aad2e2c4f1cadc219d">$caCertPath</a> = null</td></tr>
+<tr><td colspan="2"><h2><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#a9b557de521c65ab01b2dba5ecaaa9019">$sent</a> = FALSE</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#affe123d99a4af63b66c3ed889421c471">$responseHeaders</a> = array()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#a99007554a5272f4d755981f6d9d60f8c">$responseBody</a> = null</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__AbstractRequest.html#aaeae803137d9e0853b4f74be77717746">$errorMessage</a> = ''</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>Provides support for performing web-requests via curl </p>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00039">39</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a43e6cdeecffb2d9eacb6cf0c345903f5"></a><!-- doxytag: member="CAS_AbstractRequest::_sendRequest" ref="a43e6cdeecffb2d9eacb6cf0c345903f5" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::_sendRequest </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [abstract, protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Send the request and store the results.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>boolean TRUE on success, FALSE on failure. </dd></dl>
+
+<p>Referenced by <a class="el" href="AbstractRequest_8php_source.html#l00184">send()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2e29d483c57f1046e23571507a45d5f3"></a><!-- doxytag: member="CAS_AbstractRequest::addCookie" ref="a2e29d483c57f1046e23571507a45d5f3" args="($name, $value)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::addCookie </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>value</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add a cookie to the request.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$name </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$value </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__RequestInterface.html#a9e0bbff9f3e6c5ffed093a19badff849">CAS_RequestInterface</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00080">80</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6e8e852978e024cbf7ace013305fa189"></a><!-- doxytag: member="CAS_AbstractRequest::addCookies" ref="a6e8e852978e024cbf7ace013305fa189" args="(array $cookies)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::addCookies </td>
+          <td>(</td>
+          <td class="paramtype">array $&nbsp;</td>
+          <td class="paramname"> <em>cookies</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add an array of cookies to the request. The cookie array is of the form array('cookie_name' =&gt; 'cookie_value', 'cookie_name2' =&gt; cookie_value2')</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>array</em>&nbsp;</td><td>$cookies </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__RequestInterface.html#ad11ecc76349ac2921f927451d89b2059">CAS_RequestInterface</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00096">96</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adae53ccc81ddd2cb2fbeceba12fcb5d6"></a><!-- doxytag: member="CAS_AbstractRequest::addHeader" ref="adae53ccc81ddd2cb2fbeceba12fcb5d6" args="($header)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::addHeader </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>header</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add a header string to the request.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$header </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__RequestInterface.html#a01f51e770a063eb289ac12c03a5346e6">CAS_RequestInterface</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00110">110</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab21afb8f694810cbc7f6111005f39e40"></a><!-- doxytag: member="CAS_AbstractRequest::addHeaders" ref="ab21afb8f694810cbc7f6111005f39e40" args="(array $headers)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::addHeaders </td>
+          <td>(</td>
+          <td class="paramtype">array $&nbsp;</td>
+          <td class="paramname"> <em>headers</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add an array of header strings to the request.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>array</em>&nbsp;</td><td>$headers </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__RequestInterface.html#a1c2daa885fd39fce99cfd99837669132">CAS_RequestInterface</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00124">124</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2ef7ce228560085d1897b9283389a524"></a><!-- doxytag: member="CAS_AbstractRequest::getErrorMessage" ref="a2ef7ce228560085d1897b9283389a524" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::getErrorMessage </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer a message describing any errors if the request failed.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>string </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__RequestInterface.html#a1cc14181f19677291c1d4f0201b5e391">CAS_RequestInterface</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00293">293</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6eadacb1d96591a8f3c45175754d10c5"></a><!-- doxytag: member="CAS_AbstractRequest::getResponseBody" ref="a6eadacb1d96591a8f3c45175754d10c5" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::getResponseBody </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer the body of response.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>string </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__RequestInterface.html#a78155f887fad699fd34259e33093fca0">CAS_RequestInterface</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00280">280</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3004eb18cf732bb9a79b7a26b765147b"></a><!-- doxytag: member="CAS_AbstractRequest::getResponseHeaders" ref="a3004eb18cf732bb9a79b7a26b765147b" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::getResponseHeaders </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer the headers of the response.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>array An array of header strings. </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__RequestInterface.html#a5e458c85b176e914a280488fe4287993">CAS_RequestInterface</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00251">251</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac60da872e526cdd006204502240ad755"></a><!-- doxytag: member="CAS_AbstractRequest::getResponseStatusCode" ref="ac60da872e526cdd006204502240ad755" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::getResponseStatusCode </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer HTTP status code of the response</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>integer </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__RequestInterface.html#afaabea191fa4715fc2b13372d82830cd">CAS_RequestInterface</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00264">264</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac430f85c6303a96ffc854c6bbdefd95e"></a><!-- doxytag: member="CAS_AbstractRequest::makePost" ref="ac430f85c6303a96ffc854c6bbdefd95e" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::makePost </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Make the request a POST request rather than the default GET request.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__RequestInterface.html#abc0658bec27d70286f12712944229e9b">CAS_RequestInterface</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00137">137</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abbd007c2f687b52d0718ce209c325e80"></a><!-- doxytag: member="CAS_AbstractRequest::send" ref="abbd007c2f687b52d0718ce209c325e80" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::send </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Perform the request.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>boolean TRUE on success, FALSE on failure. </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called multiple times. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__RequestInterface.html#a848d1e939e5ff94aeb49ec8fff49f712">CAS_RequestInterface</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00184">184</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+<p>References <a class="el" href="classCAS__AbstractRequest.html#a43e6cdeecffb2d9eacb6cf0c345903f5">_sendRequest()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a99f6b47e913ed0be7a2e64e3595fed8d"></a><!-- doxytag: member="CAS_AbstractRequest::setPostBody" ref="a99f6b47e913ed0be7a2e64e3595fed8d" args="($body)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::setPostBody </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>body</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add a POST body to the request</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$body </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__RequestInterface.html#aab89b06410e705f16528f8883bb8f496">CAS_RequestInterface</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00151">151</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae4dd91db303801bfb205aa9f0f12b7f6"></a><!-- doxytag: member="CAS_AbstractRequest::setSslCaCert" ref="ae4dd91db303801bfb205aa9f0f12b7f6" args="($caCertPath)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::setSslCaCert </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>caCertPath</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Specify the path to an SSL CA certificate to validate the server with.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$sslCertPath </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__RequestInterface.html#abad222cd355bfaa207bcb26675147f1e">CAS_RequestInterface</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00167">167</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+<p>References <a class="el" href="AbstractRequest_8php_source.html#l00048">$caCertPath</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aba433b87d3204f928b8fe1af4b1a1df8"></a><!-- doxytag: member="CAS_AbstractRequest::setUrl" ref="aba433b87d3204f928b8fe1af4b1a1df8" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::setUrl </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the URL of the Request</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$url </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__RequestInterface.html#ae5fc480f05a815f035574619df9915de">CAS_RequestInterface</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00065">65</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+<p>References <a class="el" href="AbstractRequest_8php_source.html#l00043">$url</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad0a53a42fa2ebc75e6758521d6c7466b"></a><!-- doxytag: member="CAS_AbstractRequest::storeErrorMessage" ref="ad0a53a42fa2ebc75e6758521d6c7466b" args="($message)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::storeErrorMessage </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>message</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add a string to our error message.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$message </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00237">237</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+<p>Referenced by <a class="el" href="CurlRequest_8php_source.html#l00058">CAS_CurlRequest::_sendRequest()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a39f3b67606a2d40b23263f8ca257f7f5"></a><!-- doxytag: member="CAS_AbstractRequest::storeResponseBody" ref="a39f3b67606a2d40b23263f8ca257f7f5" args="($body)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::storeResponseBody </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>body</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Store the response body.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$body </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00227">227</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+<p>Referenced by <a class="el" href="CurlRequest_8php_source.html#l00058">CAS_CurlRequest::_sendRequest()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af99b6e9695cb90d0a1dfd6b117ab06a7"></a><!-- doxytag: member="CAS_AbstractRequest::storeResponseHeader" ref="af99b6e9695cb90d0a1dfd6b117ab06a7" args="($header)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::storeResponseHeader </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>header</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Store a single response header to our array.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$header </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00217">217</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+<p>Referenced by <a class="el" href="CurlRequest_8php_source.html#l00151">CAS_CurlRequest::_curlReadHeaders()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7a671fde2517c97054187ffe2ba303da"></a><!-- doxytag: member="CAS_AbstractRequest::storeResponseHeaders" ref="a7a671fde2517c97054187ffe2ba303da" args="(array $headers)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::storeResponseHeaders </td>
+          <td>(</td>
+          <td class="paramtype">array $&nbsp;</td>
+          <td class="paramname"> <em>headers</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Store the response headers.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>array</em>&nbsp;</td><td>$headers </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00207">207</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="ae6a9874cd7a448aad2e2c4f1cadc219d"></a><!-- doxytag: member="CAS_AbstractRequest::$caCertPath" ref="ae6a9874cd7a448aad2e2c4f1cadc219d" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::$caCertPath = null<code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00048">48</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+<p>Referenced by <a class="el" href="AbstractRequest_8php_source.html#l00167">setSslCaCert()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aac0a3f05ed0ede8440d471e6fac19d80"></a><!-- doxytag: member="CAS_AbstractRequest::$cookies" ref="aac0a3f05ed0ede8440d471e6fac19d80" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::$cookies = array()<code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00044">44</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaeae803137d9e0853b4f74be77717746"></a><!-- doxytag: member="CAS_AbstractRequest::$errorMessage" ref="aaeae803137d9e0853b4f74be77717746" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::$errorMessage = ''<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00052">52</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab754b8d9e59974c4b11c849d8ac6880a"></a><!-- doxytag: member="CAS_AbstractRequest::$headers" ref="ab754b8d9e59974c4b11c849d8ac6880a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::$headers = array()<code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00045">45</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a575df6fa81b65ed3dffb3f5e12dad1db"></a><!-- doxytag: member="CAS_AbstractRequest::$isPost" ref="a575df6fa81b65ed3dffb3f5e12dad1db" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::$isPost = FALSE<code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00046">46</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a11ff9877605f46c02d157fe3d8e4ba13"></a><!-- doxytag: member="CAS_AbstractRequest::$postBody" ref="a11ff9877605f46c02d157fe3d8e4ba13" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::$postBody = null<code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00047">47</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a99007554a5272f4d755981f6d9d60f8c"></a><!-- doxytag: member="CAS_AbstractRequest::$responseBody" ref="a99007554a5272f4d755981f6d9d60f8c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::$responseBody = null<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00051">51</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="affe123d99a4af63b66c3ed889421c471"></a><!-- doxytag: member="CAS_AbstractRequest::$responseHeaders" ref="affe123d99a4af63b66c3ed889421c471" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::$responseHeaders = array()<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00050">50</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9b557de521c65ab01b2dba5ecaaa9019"></a><!-- doxytag: member="CAS_AbstractRequest::$sent" ref="a9b557de521c65ab01b2dba5ecaaa9019" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::$sent = FALSE<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00049">49</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab16b0fdb897db17ac1ff688e1d958de7"></a><!-- doxytag: member="CAS_AbstractRequest::$url" ref="ab16b0fdb897db17ac1ff688e1d958de7" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_AbstractRequest::$url = null<code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="AbstractRequest_8php_source.html#l00043">43</a> of file <a class="el" href="AbstractRequest_8php_source.html">AbstractRequest.php</a>.</p>
+
+<p>Referenced by <a class="el" href="AbstractRequest_8php_source.html#l00065">setUrl()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__AbstractRequest.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__AbstractRequest.png
new file mode 100644
index 00000000..b40081e4
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__AbstractRequest.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__Client-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__Client-members.html
new file mode 100644
index 00000000..0005e2c6
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__Client-members.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_Client Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classCAS__Client.html">CAS_Client</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#gab4713832a3000332ddb87a9689bc6a15">$_attributes</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#ga478decd824592dcf1abd27002559452c">$_cache_times_for_auth_recheck</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCallback.html#gaed4f8867a062dd1ece2e51e9ec31df58">$_callback_mode</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCallback.html#ga4e021ea01bd0aebe95d458a5c7997747">$_callback_url</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBasic.html#ga17f31ab4f36a637672e5f23c895c4acf">$_cas_server_ca_cert</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBehave.html#ga46713aa9224ac1fb8789a48dca4b988c">$_clearTicketsFromUrl</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalMisc.html#ga2b0b79203463993ca19271ce06eb57df">$_curl_headers</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#gaf9dfac02c509a43b201bbfccf7402c94">$_curl_options</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBehave.html#ga70bec4461feb938a60eb0c70792d8aba">$_exitOnAuthError</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalLang.html#ga38abc1fb5f662312e367c8b8bad449c5">$_lang</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBasic.html#gad410c54bdfd9b65f063bc9d52afae72d">$_no_cas_server_validation</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalOutput.html#gaa90031f70e10981383b813385869f96e">$_output_footer</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalOutput.html#gaf411bbf487e36147d8835ea4337305a9">$_output_header</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxy.html#ga2c3d4f2d4cb694f1687f561e8483a4c9">$_pgt</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#gad1f8471bde7999b0465c8f3f109a6aba">$_pgt_storage</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBehave.html#ga22b6717169f18156da150b60a59b2ded">$_postAuthenticateCallbackArgs</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBehave.html#gaed60210e7c5d6d398dd3277ca95ac657">$_postAuthenticateCallbackFunction</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxied.html#ga082ab34c6c2bf014314fe02504c4ad67">$_proxies</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxy.html#ga93e5bc863e46e09173b578b79a45b760">$_proxy</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxied.html#ga0345fd992cc17a481dd37e1d5c19f595">$_pt</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBehave.html#ga0c0b9532eb79b569e05c386642632bad">$_requestImplementation</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#gaab876894f8f80166fdc3632274178a05">$_server</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxy.html#ga1f1bcaf4533a30cf236fc0b531aede62">$_serviceCookieJar</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBehave.html#ga3e2359bc41599cca4a89f6a06a3318d9">$_signoutCallbackArgs</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBehave.html#ga02105ca843402cbb747c693272dbec97">$_signoutCallbackFunction</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBasic.html#ga0dbca451ba0b1bddbf02f5663ca83d1f">$_st</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#ga345e16e8ff0427eea158d2b118f6c5d8">$_start_session</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalLang.html#ga66167ea1adb6c18e3141d8ca90df6044">$_strings</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalMisc.html#gaed9c4090f713574a6df8fdc2e32409ca">$_url</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#ga1edc9e777bc4dc2a5213f3000a85e019">$_user</a></td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#gadf63185159d9018b2e0bd31f5d2a06e7">__construct</a>($server_version, $proxy, $server_hostname, $server_port, $server_uri, $start_session=true)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalMisc.html#ga26a5099cda64d77d48bbafd6f3ba10ae">_curl_read_headers</a>($ch, $header)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxied.html#gabfbdb4ba817d27bf951b9bce6154f4f7">addAttributeToArray</a>(array &amp;$attributeArray, $name, $value)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalMisc.html#ga1d8d2502381f066a46433693f7eac14f">authError</a>($failure, $cas_url, $no_response, $bad_response='', $cas_response='', $err_code='', $err_msg='')</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalMisc.html#gac0540d05b6f1e0d67c43980abeece437">buildQueryUrl</a>($url, $query)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalMisc.html#ga03ddc75a7cdf1f5ba02d4818e1e603b6">buildSAMLPayload</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCallback.html#ga7a7208da84825f761a76246080d12ec0">callback</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#ga374ff1ed51254c75c6ed6bddc6765d2d">checkAuthentication</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#gaf42af5d18c13a0df62b18c1cd54deaa0">forceAuthentication</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#ga4e16e6d440ee792bfa63e090b87fcef1">getAttribute</a>($key)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#ga2c0120dc035c092f00b74a512fc78d4f">getAttributes</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCallback.html#gaf4703672977711e0ecc3c616cc70215b">getCallbackURL</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalLang.html#gab30d0e0fc8414be34c1f2a28649124d0">getLang</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxy.html#ga34d29abe0254d1b5752e4f3557865157">getPGT</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxyServices.html#ga2e0f5cb74d8116e3a9b9dc951f1cc3bf">getProxiedService</a>($type)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxied.html#gac97879b556d2b09f5e3b6ba2bfe33a2c">getProxies</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxied.html#ga9f6fe06d8349d51a53a1397b6fb266f0">getPT</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalSAML.html#gabbfc9663e999471633c4b5cc1a1f2751">getSA</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#gaa50d82f0d6951d1ff1305b870155febe">getServerBaseURL</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#ga8ee3ab0acca92bd0e489e4f3708c177a">getServerHostname</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#ga75782f9ef91325ce1f235eec5367df5b">getServerLoginURL</a>($gateway=false, $renew=false)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#ga46c09b45a560eb7dec420e6807fcf16c">getServerLogoutURL</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#gaae25f38d63393d7335596f76f21f24f1">getServerPort</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#ga2ecb28daad3c50c0f6b3ef125ab1faaa">getServerProxyURL</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#ga1232d737fafbe6db69cabce81d863d71">getServerProxyValidateURL</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#gae3728c61321dd40d1b59780c15cf24ba">getServerSamlValidateURL</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#ga0035da23a096dd33bdbbb14ab36ca759">getServerServiceValidateURL</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#gab0963ff44b9a9d900585c89c881fb678">getServerURI</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalMisc.html#ga6cc85870c043cb9ed421344d25c23571">getServerUrl</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#ga0dfec4f2b30a20582355a0252d7644fa">getServerVersion</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBasic.html#ga13a1fac978baa6cc99f6a443bdb7f402">getST</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#gad91c4f6f554470da2c3071e073c68bff">getStartSession</a>($session)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalLang.html#ga18db72fc208dacf384d74dfc5c3713ad">getString</a>($str)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalMisc.html#gaa7564ffa02c80ebf8ec2d7238a22f9e0">getURL</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#ga18a943d6984497f7fcde795fb4e57372">getUser</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#gae2f5c90e92e32f31dafeee19d338f1be">handleLogoutRequests</a>($check_client=true, $allowed_clients=false)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#ga2dbf501e0c59acffe19bca8fba2b35e3">hasAttribute</a>($key)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#ga5201e6b88a4190f8050ea0436af908b7">hasAttributes</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxy.html#gaece996995e43de2f4a14600a1de1ec86">hasPGT</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxied.html#gafd4a9d8c389825ed8b23331493fde437">hasPT</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalSAML.html#ga436daacbfb73a41424dd24e116acc112">hasSA</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBasic.html#ga4acc5e4ed6e778f942c36273dd9c8766">hasST</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalOutput.html#gad7299282ff326a3c3438d0ef20c0fdc5">HTMLFilterOutput</a>($str)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxyServices.html#ga80ffa273c63053c94f8d2affd1091720">initializeProxiedService</a>(CAS_ProxiedService $proxiedService)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga511cf65486f483837a48c50588b638a0">initPGTStorage</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#gafd9afb9e2bc2db5529129b5e2a07def0">isAuthenticated</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCallback.html#ga445e92539e88bfaf0670da31f8ba68d8">isCallbackMode</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalMisc.html#gab152ae390e1930f926b5f7bba8be050c">isHttps</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#ga399b37acdc834f245baf9ae78669397e">isLogoutRequest</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxy.html#ga0dfba2b184668dda8892c385c3f04096">isProxy</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#ga3c432f5cdfdef6a37f90c5b548610125">isSessionAuthenticated</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#gab185f7f3bf5bd642ce35978f6b0c7ab8">loadPGT</a>($pgt_iou)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#gac725f9fbb5de957bdd75a5334379b45d">logout</a>($params)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalOutput.html#ga0ff1bdc24180f4f60ffa07dfc8b81d61">printHTMLFooter</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalOutput.html#ga37ddf683af4f98f07f64ce4bf8b6667a">printHTMLHeader</a>($title)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxied.html#ga7d1f0e097dcfe2a4c2576b2be012a13c">readExtraAttributesCas20</a>($success_elements)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalMisc.html#ga4a53dbb5ea834fc4593077481573b36e">readURL</a>($url, &amp;$headers, &amp;$body, &amp;$err_msg)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#gac116a7ff5b1424645c45abafbaf5b35f">redirectToCas</a>($gateway=false, $renew=false)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalMisc.html#ga17d50d97a83a4925a08dced7e231d6d9">removeParameterFromQueryString</a>($parameterName, $queryString)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalMisc.html#ga889fb725f0c8f080963ee30872031d4d">renameSession</a>($ticket)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#gafd45658b37e0bc420d60331430bca670">renewAuthentication</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga0c5561328fcab419325ae53d70dddf12">retrievePT</a>($target_service, &amp;$err_code, &amp;$err_msg)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxyServices.html#ga7c0c2ac8d3cc57a31728ae901bafab67">serviceMail</a>($url, $serviceUrl, $flags, &amp;$err_code, &amp;$err_msg, &amp;$pt)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxyServices.html#ga48201373f1bc2e02d48a8d337a5cd00e">serviceWeb</a>($url, &amp;$err_code, &amp;$output)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#ga4f0c191193884b48a66a63c871dd660e">setAttributes</a>($attributes)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#ga7adf25029965e95b87977c929d9c44b3">setCacheTimesForAuthRecheck</a>($n)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCallback.html#ga18db51da1c4c0324fd3a3f6ab79f6aab">setCallbackMode</a>($callback_mode)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCallback.html#gac8f0af91cf84fb7dbd78c1acb0d7b921">setCallbackURL</a>($url)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBasic.html#ga548bebec55f195988aba071ddc340596">setCasServerCACert</a>($cert)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#gaa6e5e8340332023e6d6553a423641da5">setExtraCurlOption</a>($key, $value)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalOutput.html#ga379dd7ed8f510e03321b449369024535">setHTMLFooter</a>($footer)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalOutput.html#ga7c05d2293082e77a79799c009dd979c9">setHTMLHeader</a>($header)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalLang.html#ga29c04b71561ffeed72ef005dadf7dc95">setLang</a>($lang)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBasic.html#gafa13a188b0b07c1f0631c0f844cdd11f">setNoCasServerValidation</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBehave.html#gafe794b80449acacbdb6c0d30863a6683">setNoClearTicketsFromUrl</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBehave.html#gad914221096da4e9915660b2770347cd1">setNoExitOnAuthError</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxy.html#ga7750adb0745c0b005ff8b305e7a060e0">setPGT</a>($pgt)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga4d407488ad4ca4409e4128a98d1d3801">setPGTStorage</a>($storage)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga37d474907361e521a00259c04b712fe4">setPGTStorageDb</a>($dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#gac179a4316bd15cd498f90a6599c7df4c">setPGTStorageFile</a>($path='')</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBehave.html#ga41c4204c3ab191548f1ae48984f73848">setPostAuthenticateCallback</a>($function, array $additionalArgs=array())</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxied.html#ga5afeadecc91ada8d11abc1ec74bdefd5">setProxies</a>($proxies)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxied.html#gaad9f4d2b7243796555c01edecc85006e">setPT</a>($pt)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBehave.html#ga276759918857eddc4fd10d04702d5502">setRequestImplementation</a>($className)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalSAML.html#gab543514ee8feaf062af84e78fa26f19f">setSA</a>($sa)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#gac2d9a37c0dca05e079b078ca67a9c325">setServerLoginURL</a>($url)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#ga526dca6da322ff2b00e792c7b7a850ec">setServerLogoutURL</a>($url)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#gadccec5ba83d4719f433adab32068421b">setServerProxyValidateURL</a>($url)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#ga39f47156d1e059502f8a3f6f497a461b">setServerSamlValidateURL</a>($url)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#ga21a9660c25cba68f165b7c4b1ea0456d">setServerServiceValidateURL</a>($url)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalSAML.html#gaf0f93cd303855b62c04ca667dc741ee5">setSessionAttributes</a>($text_response)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBehave.html#ga61a82c256483dff20a09cd9ca9c33a62">setSingleSignoutCallback</a>($function, array $additionalArgs=array())</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBasic.html#ga7baa4852ccb4e30280e825d95b496952">setST</a>($st)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalConfig.html#ga54eebbdc5fd41b77de3de25f3bd71c84">setStartSession</a>($session)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalMisc.html#ga8bd9440411c9be24e955c9edd74e49de">setURL</a>($url)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#gaab7eded3796f3a506c71221413dc95a1">setUser</a>($user)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga244695840dc3a3964707cc355a0b631c">storePGT</a>($pgt, $pgt_iou)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga8c7c97937692e79da12a8be3df634cbe">validatePGT</a>(&amp;$validate_url, $text_response, $tree_response)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalProxied.html#ga5aa61d302edfacbaaf176a94bf228807">validatePT</a>(&amp;$validate_url, &amp;$text_response, &amp;$tree_response)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalSAML.html#ga07f487f79659e810085f37fafafc90a0">validateSA</a>($validate_url, &amp;$text_response, &amp;$tree_response)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalBasic.html#ga0a9d9d436a1b2b101ebe767617ac62ad">validateST</a>($validate_url, &amp;$text_response, &amp;$tree_response)</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalAuthentication.html#gaaf695bdc9b1784d15437cd49a3be59a6">wasPreviouslyAuthenticated</a>()</td><td><a class="el" href="classCAS__Client.html">CAS_Client</a></td><td><code> [private]</code></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__Client.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__Client.html
new file mode 100644
index 00000000..f587196e
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__Client.html
@@ -0,0 +1,191 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_Client Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pri-methods">Private Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a>  </div>
+  <div class="headertitle">
+<h1>CAS_Client Class Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_Client" -->
+<p><a href="classCAS__Client-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html#ga7c05d2293082e77a79799c009dd979c9">setHTMLHeader</a> ($header)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html#ga379dd7ed8f510e03321b449369024535">setHTMLFooter</a> ($footer)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalLang.html#ga29c04b71561ffeed72ef005dadf7dc95">setLang</a> ($lang)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga75782f9ef91325ce1f235eec5367df5b">getServerLoginURL</a> ($gateway=false, $renew=false)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gac2d9a37c0dca05e079b078ca67a9c325">setServerLoginURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga21a9660c25cba68f165b7c4b1ea0456d">setServerServiceValidateURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gadccec5ba83d4719f433adab32068421b">setServerProxyValidateURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga39f47156d1e059502f8a3f6f497a461b">setServerSamlValidateURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga0035da23a096dd33bdbbb14ab36ca759">getServerServiceValidateURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gae3728c61321dd40d1b59780c15cf24ba">getServerSamlValidateURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga1232d737fafbe6db69cabce81d863d71">getServerProxyValidateURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga2ecb28daad3c50c0f6b3ef125ab1faaa">getServerProxyURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga46c09b45a560eb7dec420e6807fcf16c">getServerLogoutURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga526dca6da322ff2b00e792c7b7a850ec">setServerLogoutURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gaa6e5e8340332023e6d6553a423641da5">setExtraCurlOption</a> ($key, $value)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga276759918857eddc4fd10d04702d5502">setRequestImplementation</a> ($className)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#gad914221096da4e9915660b2770347cd1">setNoExitOnAuthError</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#gafe794b80449acacbdb6c0d30863a6683">setNoClearTicketsFromUrl</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga41c4204c3ab191548f1ae48984f73848">setPostAuthenticateCallback</a> ($function, array $additionalArgs=array())</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga61a82c256483dff20a09cd9ca9c33a62">setSingleSignoutCallback</a> ($function, array $additionalArgs=array())</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gadf63185159d9018b2e0bd31f5d2a06e7">__construct</a> ($server_version, $proxy, $server_hostname, $server_port, $server_uri, $start_session=true)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gad91c4f6f554470da2c3071e073c68bff">getStartSession</a> ($session)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga18a943d6984497f7fcde795fb4e57372">getUser</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga4f0c191193884b48a66a63c871dd660e">setAttributes</a> ($attributes)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga2c0120dc035c092f00b74a512fc78d4f">getAttributes</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga5201e6b88a4190f8050ea0436af908b7">hasAttributes</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga2dbf501e0c59acffe19bca8fba2b35e3">hasAttribute</a> ($key)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga4e16e6d440ee792bfa63e090b87fcef1">getAttribute</a> ($key)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gafd45658b37e0bc420d60331430bca670">renewAuthentication</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gaf42af5d18c13a0df62b18c1cd54deaa0">forceAuthentication</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga7adf25029965e95b87977c929d9c44b3">setCacheTimesForAuthRecheck</a> ($n)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga374ff1ed51254c75c6ed6bddc6765d2d">checkAuthentication</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gafd9afb9e2bc2db5529129b5e2a07def0">isAuthenticated</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga3c432f5cdfdef6a37f90c5b548610125">isSessionAuthenticated</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gac116a7ff5b1424645c45abafbaf5b35f">redirectToCas</a> ($gateway=false, $renew=false)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gac725f9fbb5de957bdd75a5334379b45d">logout</a> ($params)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gae2f5c90e92e32f31dafeee19d338f1be">handleLogoutRequests</a> ($check_client=true, $allowed_clients=false)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#ga13a1fac978baa6cc99f6a443bdb7f402">getST</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#ga7baa4852ccb4e30280e825d95b496952">setST</a> ($st)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#ga4acc5e4ed6e778f942c36273dd9c8766">hasST</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#ga548bebec55f195988aba071ddc340596">setCasServerCACert</a> ($cert)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#gafa13a188b0b07c1f0631c0f844cdd11f">setNoCasServerValidation</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#ga0a9d9d436a1b2b101ebe767617ac62ad">validateST</a> ($validate_url, &amp;$text_response, &amp;$tree_response)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalSAML.html#ga07f487f79659e810085f37fafafc90a0">validateSA</a> ($validate_url, &amp;$text_response, &amp;$tree_response)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalSAML.html#gabbfc9663e999471633c4b5cc1a1f2751">getSA</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalSAML.html#gab543514ee8feaf062af84e78fa26f19f">setSA</a> ($sa)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalSAML.html#ga436daacbfb73a41424dd24e116acc112">hasSA</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html#ga0dfba2b184668dda8892c385c3f04096">isProxy</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html#gac8f0af91cf84fb7dbd78c1acb0d7b921">setCallbackURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga4d407488ad4ca4409e4128a98d1d3801">setPGTStorage</a> ($storage)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga37d474907361e521a00259c04b712fe4">setPGTStorageDb</a> ($dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#gac179a4316bd15cd498f90a6599c7df4c">setPGTStorageFile</a> ($path='')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga0c5561328fcab419325ae53d70dddf12">retrievePT</a> ($target_service, &amp;$err_code, &amp;$err_msg)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga26a5099cda64d77d48bbafd6f3ba10ae">_curl_read_headers</a> ($ch, $header)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxyServices.html#ga2e0f5cb74d8116e3a9b9dc951f1cc3bf">getProxiedService</a> ($type)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxyServices.html#ga80ffa273c63053c94f8d2affd1091720">initializeProxiedService</a> (<a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a> $proxiedService)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxyServices.html#ga48201373f1bc2e02d48a8d337a5cd00e">serviceWeb</a> ($url, &amp;$err_code, &amp;$output)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxyServices.html#ga7c0c2ac8d3cc57a31728ae901bafab67">serviceMail</a> ($url, $serviceUrl, $flags, &amp;$err_code, &amp;$err_msg, &amp;$pt)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#ga9f6fe06d8349d51a53a1397b6fb266f0">getPT</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#gaad9f4d2b7243796555c01edecc85006e">setPT</a> ($pt)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#gafd4a9d8c389825ed8b23331493fde437">hasPT</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#gac97879b556d2b09f5e3b6ba2bfe33a2c">getProxies</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#ga5aa61d302edfacbaaf176a94bf228807">validatePT</a> (&amp;$validate_url, &amp;$text_response, &amp;$tree_response)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga8bd9440411c9be24e955c9edd74e49de">setURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#gaa7564ffa02c80ebf8ec2d7238a22f9e0">getURL</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="pri-methods"></a>
+Private Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html#gad7299282ff326a3c3438d0ef20c0fdc5">HTMLFilterOutput</a> ($str)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html#ga37ddf683af4f98f07f64ce4bf8b6667a">printHTMLHeader</a> ($title)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html#ga0ff1bdc24180f4f60ffa07dfc8b81d61">printHTMLFooter</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalLang.html#gab30d0e0fc8414be34c1f2a28649124d0">getLang</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalLang.html#ga18db72fc208dacf384d74dfc5c3713ad">getString</a> ($str)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga0dfec4f2b30a20582355a0252d7644fa">getServerVersion</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga8ee3ab0acca92bd0e489e4f3708c177a">getServerHostname</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gaae25f38d63393d7335596f76f21f24f1">getServerPort</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gab0963ff44b9a9d900585c89c881fb678">getServerURI</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gaa50d82f0d6951d1ff1305b870155febe">getServerBaseURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga54eebbdc5fd41b77de3de25f3bd71c84">setStartSession</a> ($session)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gaab7eded3796f3a506c71221413dc95a1">setUser</a> ($user)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gaaf695bdc9b1784d15437cd49a3be59a6">wasPreviouslyAuthenticated</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga399b37acdc834f245baf9ae78669397e">isLogoutRequest</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalSAML.html#gaf0f93cd303855b62c04ca667dc741ee5">setSessionAttributes</a> ($text_response)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html#ga34d29abe0254d1b5752e4f3557865157">getPGT</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html#ga7750adb0745c0b005ff8b305e7a060e0">setPGT</a> ($pgt)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html#gaece996995e43de2f4a14600a1de1ec86">hasPGT</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html#ga18db51da1c4c0324fd3a3f6ab79f6aab">setCallbackMode</a> ($callback_mode)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html#ga445e92539e88bfaf0670da31f8ba68d8">isCallbackMode</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html#gaf4703672977711e0ecc3c616cc70215b">getCallbackURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html#ga7a7208da84825f761a76246080d12ec0">callback</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga511cf65486f483837a48c50588b638a0">initPGTStorage</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga244695840dc3a3964707cc355a0b631c">storePGT</a> ($pgt, $pgt_iou)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#gab185f7f3bf5bd642ce35978f6b0c7ab8">loadPGT</a> ($pgt_iou)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga8c7c97937692e79da12a8be3df634cbe">validatePGT</a> (&amp;$validate_url, $text_response, $tree_response)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga4a53dbb5ea834fc4593077481573b36e">readURL</a> ($url, &amp;$headers, &amp;$body, &amp;$err_msg)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga03ddc75a7cdf1f5ba02d4818e1e603b6">buildSAMLPayload</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#ga5afeadecc91ada8d11abc1ec74bdefd5">setProxies</a> ($proxies)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#ga7d1f0e097dcfe2a4c2576b2be012a13c">readExtraAttributesCas20</a> ($success_elements)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#gabfbdb4ba817d27bf951b9bce6154f4f7">addAttributeToArray</a> (array &amp;$attributeArray, $name, $value)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga6cc85870c043cb9ed421344d25c23571">getServerUrl</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#gab152ae390e1930f926b5f7bba8be050c">isHttps</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga17d50d97a83a4925a08dced7e231d6d9">removeParameterFromQueryString</a> ($parameterName, $queryString)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#gac0540d05b6f1e0d67c43980abeece437">buildQueryUrl</a> ($url, $query)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga889fb725f0c8f080963ee30872031d4d">renameSession</a> ($ticket)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga1d8d2502381f066a46433693f7eac14f">authError</a> ($failure, $cas_url, $no_response, $bad_response='', $cas_response='', $err_code='', $err_msg='')</td></tr>
+<tr><td colspan="2"><h2><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html#gaf411bbf487e36147d8835ea4337305a9">$_output_header</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html#gaa90031f70e10981383b813385869f96e">$_output_footer</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalLang.html#ga38abc1fb5f662312e367c8b8bad449c5">$_lang</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalLang.html#ga66167ea1adb6c18e3141d8ca90df6044">$_strings</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gaab876894f8f80166fdc3632274178a05">$_server</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gaf9dfac02c509a43b201bbfccf7402c94">$_curl_options</a> = array()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga0c0b9532eb79b569e05c386642632bad">$_requestImplementation</a> = '<a class="el" href="classCAS__CurlRequest.html">CAS_CurlRequest</a>'</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga70bec4461feb938a60eb0c70792d8aba">$_exitOnAuthError</a> = true</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga46713aa9224ac1fb8789a48dca4b988c">$_clearTicketsFromUrl</a> = true</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#gaed60210e7c5d6d398dd3277ca95ac657">$_postAuthenticateCallbackFunction</a> = null</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga22b6717169f18156da150b60a59b2ded">$_postAuthenticateCallbackArgs</a> = array()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga02105ca843402cbb747c693272dbec97">$_signoutCallbackFunction</a> = null</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga3e2359bc41599cca4a89f6a06a3318d9">$_signoutCallbackArgs</a> = array()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga345e16e8ff0427eea158d2b118f6c5d8">$_start_session</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga1edc9e777bc4dc2a5213f3000a85e019">$_user</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gab4713832a3000332ddb87a9689bc6a15">$_attributes</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga478decd824592dcf1abd27002559452c">$_cache_times_for_auth_recheck</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#ga0dbca451ba0b1bddbf02f5663ca83d1f">$_st</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#ga17f31ab4f36a637672e5f23c895c4acf">$_cas_server_ca_cert</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#gad410c54bdfd9b65f063bc9d52afae72d">$_no_cas_server_validation</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html#ga93e5bc863e46e09173b578b79a45b760">$_proxy</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html#ga1f1bcaf4533a30cf236fc0b531aede62">$_serviceCookieJar</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html#ga2c3d4f2d4cb694f1687f561e8483a4c9">$_pgt</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html#gaed4f8867a062dd1ece2e51e9ec31df58">$_callback_mode</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html#ga4e021ea01bd0aebe95d458a5c7997747">$_callback_url</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#gad1f8471bde7999b0465c8f3f109a6aba">$_pgt_storage</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga2b0b79203463993ca19271ce06eb57df">$_curl_headers</a> = array()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#ga0345fd992cc17a481dd37e1d5c19f595">$_pt</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#ga082ab34c6c2bf014314fe02504c4ad67">$_proxies</a> = array()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#gaed9c4090f713574a6df8fdc2e32409ca">$_url</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>The <a class="el" href="classCAS__Client.html">CAS_Client</a> class is a client interface that provides CAS authentication to PHP applications.</p>
+<dl class="author"><dt><b>Author:</b></dt><dd>Pascal Aubry &lt;pascal.aubry at univ-rennes1.fr&gt; </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00068">68</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CookieJar-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CookieJar-members.html
new file mode 100644
index 00000000..eae7f489
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CookieJar-members.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_CookieJar Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="classCAS__CookieJar.html#af9d334b3919452f41285c455704f9aef">$_cookies</a></td><td><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__CookieJar.html#ab9f5a872c4bfdf47f5a5afb89d77a216">__construct</a>(array &amp;$storageArray)</td><td><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__CookieJar.html#a1a4419c2c934a7edbd380171bca6f7c2">cookieMatchesTarget</a>($cookie, $target)</td><td><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__CookieJar.html#a5b957149a51af3f67cef6b2591591144">discardCookie</a>($cookie)</td><td><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__CookieJar.html#a4a6e9f572711a19e53a1f6104f56fb8a">expireCookies</a>()</td><td><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__CookieJar.html#ac5d8875ce623ff288094f7167cc3ddbe">getCookies</a>($request_url)</td><td><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__CookieJar.html#a022858f118e1b08cc1beba50a9046504">parseCookieHeader</a>($line, $defaultDomain)</td><td><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__CookieJar.html#af81c4ba23ca24d56e308a1a6cbb8464f">parseCookieHeaders</a>($header, $defaultDomain)</td><td><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__CookieJar.html#ac1de792f07c3fad7659a9448ba233c7f">storeCookie</a>($cookie)</td><td><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__CookieJar.html#a133963d2952a02084388a81ca2356d4b">storeCookies</a>($request_url, $response_headers)</td><td><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a></td><td></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CookieJar.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CookieJar.html
new file mode 100644
index 00000000..cfb58022
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CookieJar.html
@@ -0,0 +1,400 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_CookieJar Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a>  </div>
+  <div class="headertitle">
+<h1>CAS_CookieJar Class Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_CookieJar" -->
+<p><a href="classCAS__CookieJar-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CookieJar.html#ab9f5a872c4bfdf47f5a5afb89d77a216">__construct</a> (array &amp;$storageArray)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CookieJar.html#a133963d2952a02084388a81ca2356d4b">storeCookies</a> ($request_url, $response_headers)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CookieJar.html#ac5d8875ce623ff288094f7167cc3ddbe">getCookies</a> ($request_url)</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CookieJar.html#af81c4ba23ca24d56e308a1a6cbb8464f">parseCookieHeaders</a> ($header, $defaultDomain)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CookieJar.html#a022858f118e1b08cc1beba50a9046504">parseCookieHeader</a> ($line, $defaultDomain)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CookieJar.html#ac1de792f07c3fad7659a9448ba233c7f">storeCookie</a> ($cookie)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CookieJar.html#a5b957149a51af3f67cef6b2591591144">discardCookie</a> ($cookie)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CookieJar.html#a4a6e9f572711a19e53a1f6104f56fb8a">expireCookies</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CookieJar.html#a1a4419c2c934a7edbd380171bca6f7c2">cookieMatchesTarget</a> ($cookie, $target)</td></tr>
+<tr><td colspan="2"><h2><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CookieJar.html#af9d334b3919452f41285c455704f9aef">$_cookies</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>This class provides access to service cookies and handles parsing of response headers to pull out cookie values. </p>
+
+<p>Definition at line <a class="el" href="CookieJar_8php_source.html#l00038">38</a> of file <a class="el" href="CookieJar_8php_source.html">CookieJar.php</a>.</p>
+<hr/><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="ab9f5a872c4bfdf47f5a5afb89d77a216"></a><!-- doxytag: member="CAS_CookieJar::__construct" ref="ab9f5a872c4bfdf47f5a5afb89d77a216" args="(array &amp;$storageArray)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_CookieJar::__construct </td>
+          <td>(</td>
+          <td class="paramtype">array &amp;$&nbsp;</td>
+          <td class="paramname"> <em>storageArray</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Create a new cookie jar by passing it a reference to an array in which it should store cookies.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ref</em>&nbsp;</td><td>array $storageArray </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="CookieJar_8php_source.html#l00049">49</a> of file <a class="el" href="CookieJar_8php_source.html">CookieJar.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a1a4419c2c934a7edbd380171bca6f7c2"></a><!-- doxytag: member="CAS_CookieJar::cookieMatchesTarget" ref="a1a4419c2c934a7edbd380171bca6f7c2" args="($cookie, $target)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_CookieJar::cookieMatchesTarget </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>cookie</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>target</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer true if cookie is applicable to a target.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>array</em>&nbsp;</td><td>$cookie An array of cookie attributes. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>array</em>&nbsp;</td><td>$target An array of URL attributes as generated by parse_url().</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>boolean</dd></dl>
+<p>private </p>
+
+<p>Definition at line <a class="el" href="CookieJar_8php_source.html#l00288">288</a> of file <a class="el" href="CookieJar_8php_source.html">CookieJar.php</a>.</p>
+
+<p>Referenced by <a class="el" href="CookieJar_8php_source.html#l00094">getCookies()</a>, and <a class="el" href="CookieJar_8php_source.html#l00064">storeCookies()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5b957149a51af3f67cef6b2591591144"></a><!-- doxytag: member="CAS_CookieJar::discardCookie" ref="a5b957149a51af3f67cef6b2591591144" args="($cookie)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_CookieJar::discardCookie </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>cookie</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Discard an existing cookie</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>stdClass</em>&nbsp;</td><td>$cookie</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void</dd></dl>
+<p>private </p>
+
+<p>Definition at line <a class="el" href="CookieJar_8php_source.html#l00249">249</a> of file <a class="el" href="CookieJar_8php_source.html">CookieJar.php</a>.</p>
+
+<p>Referenced by <a class="el" href="CookieJar_8php_source.html#l00233">storeCookie()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4a6e9f572711a19e53a1f6104f56fb8a"></a><!-- doxytag: member="CAS_CookieJar::expireCookies" ref="a4a6e9f572711a19e53a1f6104f56fb8a" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_CookieJar::expireCookies </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Go through our stored cookies and remove any that are expired.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void</dd></dl>
+<p>private </p>
+
+<p>Definition at line <a class="el" href="CookieJar_8php_source.html#l00270">270</a> of file <a class="el" href="CookieJar_8php_source.html">CookieJar.php</a>.</p>
+
+<p>Referenced by <a class="el" href="CookieJar_8php_source.html#l00094">getCookies()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac5d8875ce623ff288094f7167cc3ddbe"></a><!-- doxytag: member="CAS_CookieJar::getCookies" ref="ac5d8875ce623ff288094f7167cc3ddbe" args="($request_url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_CookieJar::getCookies </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>request_url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Retrieve cookies applicable for a web service request. Cookie applicability is based on RFC 2965: <a href="http://www.ietf.org/rfc/rfc2965.txt">http://www.ietf.org/rfc/rfc2965.txt</a></p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$request_url The url that the cookies will be for.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>array An array containing cookies. E.g. array('name' =&gt; 'val');</dd></dl>
+<p>private </p>
+
+<p>Definition at line <a class="el" href="CookieJar_8php_source.html#l00094">94</a> of file <a class="el" href="CookieJar_8php_source.html">CookieJar.php</a>.</p>
+
+<p>References <a class="el" href="CookieJar_8php_source.html#l00288">cookieMatchesTarget()</a>, and <a class="el" href="CookieJar_8php_source.html#l00270">expireCookies()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a022858f118e1b08cc1beba50a9046504"></a><!-- doxytag: member="CAS_CookieJar::parseCookieHeader" ref="a022858f118e1b08cc1beba50a9046504" args="($line, $defaultDomain)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_CookieJar::parseCookieHeader </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>line</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>defaultDomain</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Parse a single cookie header line.</p>
+<p>Based on RFC2965 <a href="http://www.ietf.org/rfc/rfc2965.txt">http://www.ietf.org/rfc/rfc2965.txt</a></p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$line The header line. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$defaultDomain The domain to use if none is specified in the cookie. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>array </dd></dl>
+
+<p>Definition at line <a class="el" href="CookieJar_8php_source.html#l00144">144</a> of file <a class="el" href="CookieJar_8php_source.html">CookieJar.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>.</p>
+
+<p>Referenced by <a class="el" href="CookieJar_8php_source.html#l00122">parseCookieHeaders()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af81c4ba23ca24d56e308a1a6cbb8464f"></a><!-- doxytag: member="CAS_CookieJar::parseCookieHeaders" ref="af81c4ba23ca24d56e308a1a6cbb8464f" args="($header, $defaultDomain)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_CookieJar::parseCookieHeaders </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>header</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>defaultDomain</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Parse Cookies without PECL From the comments in <a href="http://php.net/manual/en/function.http-parse-cookie.php">http://php.net/manual/en/function.http-parse-cookie.php</a> </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>array</em>&nbsp;</td><td>$header An array of header lines. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$defaultDomain The domain to use if none is specified in the cookie. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>array of cookies </dd></dl>
+
+<p>Definition at line <a class="el" href="CookieJar_8php_source.html#l00122">122</a> of file <a class="el" href="CookieJar_8php_source.html">CookieJar.php</a>.</p>
+
+<p>References <a class="el" href="CookieJar_8php_source.html#l00144">parseCookieHeader()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+<p>Referenced by <a class="el" href="CookieJar_8php_source.html#l00064">storeCookies()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac1de792f07c3fad7659a9448ba233c7f"></a><!-- doxytag: member="CAS_CookieJar::storeCookie" ref="ac1de792f07c3fad7659a9448ba233c7f" args="($cookie)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_CookieJar::storeCookie </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>cookie</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add, update, or remove a cookie.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>array</em>&nbsp;</td><td>$cookie A cookie array as created by <a class="el" href="classCAS__CookieJar.html#af81c4ba23ca24d56e308a1a6cbb8464f">parseCookieHeaders()</a></td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void</dd></dl>
+<p>private </p>
+
+<p>Definition at line <a class="el" href="CookieJar_8php_source.html#l00233">233</a> of file <a class="el" href="CookieJar_8php_source.html">CookieJar.php</a>.</p>
+
+<p>References <a class="el" href="CookieJar_8php_source.html#l00249">discardCookie()</a>.</p>
+
+<p>Referenced by <a class="el" href="CookieJar_8php_source.html#l00064">storeCookies()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a133963d2952a02084388a81ca2356d4b"></a><!-- doxytag: member="CAS_CookieJar::storeCookies" ref="a133963d2952a02084388a81ca2356d4b" args="($request_url, $response_headers)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_CookieJar::storeCookies </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>request_url</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>response_headers</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Store cookies for a web service request. Cookie storage is based on RFC 2965: <a href="http://www.ietf.org/rfc/rfc2965.txt">http://www.ietf.org/rfc/rfc2965.txt</a></p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$request_url The URL that generated the response headers. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>array</em>&nbsp;</td><td>$response_headers An array of the HTTP response header strings.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void</dd></dl>
+<p>private </p>
+
+<p>Definition at line <a class="el" href="CookieJar_8php_source.html#l00064">64</a> of file <a class="el" href="CookieJar_8php_source.html">CookieJar.php</a>.</p>
+
+<p>References <a class="el" href="CookieJar_8php_source.html#l00288">cookieMatchesTarget()</a>, <a class="el" href="CookieJar_8php_source.html#l00122">parseCookieHeaders()</a>, <a class="el" href="CookieJar_8php_source.html#l00233">storeCookie()</a>, and <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="af9d334b3919452f41285c455704f9aef"></a><!-- doxytag: member="CAS_CookieJar::$_cookies" ref="af9d334b3919452f41285c455704f9aef" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_CookieJar::$_cookies<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="CookieJar_8php_source.html#l00040">40</a> of file <a class="el" href="CookieJar_8php_source.html">CookieJar.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CurlRequest-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CurlRequest-members.html
new file mode 100644
index 00000000..bc1dbfc4
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CurlRequest-members.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_CurlRequest Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classCAS__CurlRequest.html">CAS_CurlRequest</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ae6a9874cd7a448aad2e2c4f1cadc219d">$caCertPath</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#aac0a3f05ed0ede8440d471e6fac19d80">$cookies</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__CurlRequest.html#a91dc734468fb10a927c7b86dbb5606d2">$curlOptions</a></td><td><a class="el" href="classCAS__CurlRequest.html">CAS_CurlRequest</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ab754b8d9e59974c4b11c849d8ac6880a">$headers</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a575df6fa81b65ed3dffb3f5e12dad1db">$isPost</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a11ff9877605f46c02d157fe3d8e4ba13">$postBody</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ab16b0fdb897db17ac1ff688e1d958de7">$url</a></td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__CurlRequest.html#a4238fbfb24854b910f8c83855c51f15b">_curlReadHeaders</a>($ch, $header)</td><td><a class="el" href="classCAS__CurlRequest.html">CAS_CurlRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__CurlRequest.html#aa4e10d6814c606547cec548e1f6fd18b">_sendRequest</a>()</td><td><a class="el" href="classCAS__CurlRequest.html">CAS_CurlRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a43e6cdeecffb2d9eacb6cf0c345903f5">CAS_AbstractRequest::_sendRequest</a>()</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a2e29d483c57f1046e23571507a45d5f3">addCookie</a>($name, $value)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a6e8e852978e024cbf7ace013305fa189">addCookies</a>(array $cookies)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#adae53ccc81ddd2cb2fbeceba12fcb5d6">addHeader</a>($header)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ab21afb8f694810cbc7f6111005f39e40">addHeaders</a>(array $headers)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a2ef7ce228560085d1897b9283389a524">getErrorMessage</a>()</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a6eadacb1d96591a8f3c45175754d10c5">getResponseBody</a>()</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a3004eb18cf732bb9a79b7a26b765147b">getResponseHeaders</a>()</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ac60da872e526cdd006204502240ad755">getResponseStatusCode</a>()</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ac430f85c6303a96ffc854c6bbdefd95e">makePost</a>()</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#abbd007c2f687b52d0718ce209c325e80">send</a>()</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__CurlRequest.html#ae34cc30ad201b2f1164e40aef609102b">setCurlOptions</a>(array $options)</td><td><a class="el" href="classCAS__CurlRequest.html">CAS_CurlRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a99f6b47e913ed0be7a2e64e3595fed8d">setPostBody</a>($body)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ae4dd91db303801bfb205aa9f0f12b7f6">setSslCaCert</a>($caCertPath)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#aba433b87d3204f928b8fe1af4b1a1df8">setUrl</a>($url)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#ad0a53a42fa2ebc75e6758521d6c7466b">storeErrorMessage</a>($message)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a39f3b67606a2d40b23263f8ca257f7f5">storeResponseBody</a>($body)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#af99b6e9695cb90d0a1dfd6b117ab06a7">storeResponseHeader</a>($header)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__AbstractRequest.html#a7a671fde2517c97054187ffe2ba303da">storeResponseHeaders</a>(array $headers)</td><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a></td><td><code> [protected]</code></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CurlRequest.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CurlRequest.html
new file mode 100644
index 00000000..bb152deb
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CurlRequest.html
@@ -0,0 +1,181 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_CurlRequest Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a>  </div>
+  <div class="headertitle">
+<h1>CAS_CurlRequest Class Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_CurlRequest" --><!-- doxytag: inherits="CAS_AbstractRequest,CAS_RequestInterface" --><div class="dynheader">
+Inheritance diagram for CAS_CurlRequest:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__CurlRequest.png" usemap="#CAS_CurlRequest_map" alt=""/>
+  <map id="CAS_CurlRequest_map" name="CAS_CurlRequest_map">
+<area href="classCAS__AbstractRequest.html" alt="CAS_AbstractRequest" shape="rect" coords="0,56,139,80"/>
+<area href="interfaceCAS__RequestInterface.html" alt="CAS_RequestInterface" shape="rect" coords="149,56,288,80"/>
+<area href="interfaceCAS__RequestInterface.html" alt="CAS_RequestInterface" shape="rect" coords="0,0,139,24"/>
+</map>
+</div>
+
+<p><a href="classCAS__CurlRequest-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CurlRequest.html#ae34cc30ad201b2f1164e40aef609102b">setCurlOptions</a> (array $options)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CurlRequest.html#a4238fbfb24854b910f8c83855c51f15b">_curlReadHeaders</a> ($ch, $header)</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CurlRequest.html#aa4e10d6814c606547cec548e1f6fd18b">_sendRequest</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__CurlRequest.html#a91dc734468fb10a927c7b86dbb5606d2">$curlOptions</a> = array()</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>Provides support for performing web-requests via curl </p>
+
+<p>Definition at line <a class="el" href="CurlRequest_8php_source.html#l00037">37</a> of file <a class="el" href="CurlRequest_8php_source.html">CurlRequest.php</a>.</p>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a4238fbfb24854b910f8c83855c51f15b"></a><!-- doxytag: member="CAS_CurlRequest::_curlReadHeaders" ref="a4238fbfb24854b910f8c83855c51f15b" args="($ch, $header)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_CurlRequest::_curlReadHeaders </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>ch</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>header</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Internal method for capturing the headers from a curl request.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>handle</em>&nbsp;</td><td>$ch </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$header </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="CurlRequest_8php_source.html#l00151">151</a> of file <a class="el" href="CurlRequest_8php_source.html">CurlRequest.php</a>.</p>
+
+<p>References <a class="el" href="AbstractRequest_8php_source.html#l00217">CAS_AbstractRequest::storeResponseHeader()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa4e10d6814c606547cec548e1f6fd18b"></a><!-- doxytag: member="CAS_CurlRequest::_sendRequest" ref="aa4e10d6814c606547cec548e1f6fd18b" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_CurlRequest::_sendRequest </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Send the request and store the results.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>boolean TRUE on success, FALSE on failure. </dd></dl>
+
+<p>Definition at line <a class="el" href="CurlRequest_8php_source.html#l00058">58</a> of file <a class="el" href="CurlRequest_8php_source.html">CurlRequest.php</a>.</p>
+
+<p>References <a class="el" href="AbstractRequest_8php_source.html#l00237">CAS_AbstractRequest::storeErrorMessage()</a>, <a class="el" href="AbstractRequest_8php_source.html#l00227">CAS_AbstractRequest::storeResponseBody()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae34cc30ad201b2f1164e40aef609102b"></a><!-- doxytag: member="CAS_CurlRequest::setCurlOptions" ref="ae34cc30ad201b2f1164e40aef609102b" args="(array $options)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_CurlRequest::setCurlOptions </td>
+          <td>(</td>
+          <td class="paramtype">array $&nbsp;</td>
+          <td class="paramname"> <em>options</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set additional curl options</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>array</em>&nbsp;</td><td>$options </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="CurlRequest_8php_source.html#l00048">48</a> of file <a class="el" href="CurlRequest_8php_source.html">CurlRequest.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a91dc734468fb10a927c7b86dbb5606d2"></a><!-- doxytag: member="CAS_CurlRequest::$curlOptions" ref="a91dc734468fb10a927c7b86dbb5606d2" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_CurlRequest::$curlOptions = array()<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="CurlRequest_8php_source.html#l00051">51</a> of file <a class="el" href="CurlRequest_8php_source.html">CurlRequest.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CurlRequest.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CurlRequest.png
new file mode 100644
index 00000000..c2a8e7c5
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__CurlRequest.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__InvalidArgumentException.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__InvalidArgumentException.html
new file mode 100644
index 00000000..4a057a03
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__InvalidArgumentException.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_InvalidArgumentException Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_InvalidArgumentException Class Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_InvalidArgumentException" --><!-- doxytag: inherits="CAS_Exception" --><div class="dynheader">
+Inheritance diagram for CAS_InvalidArgumentException:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__InvalidArgumentException.png" usemap="#CAS_InvalidArgumentException_map" alt=""/>
+  <map id="CAS_InvalidArgumentException_map" name="CAS_InvalidArgumentException_map">
+<area href="interfaceCAS__Exception.html" alt="CAS_Exception" shape="rect" coords="0,0,191,24"/>
+</map>
+</div>
+<table class="memberdecls">
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>Exception that denotes invalid arguments were passed. </p>
+
+<p>Definition at line <a class="el" href="InvalidArgumentException_8php_source.html#l00036">36</a> of file <a class="el" href="InvalidArgumentException_8php_source.html">InvalidArgumentException.php</a>.</p>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__InvalidArgumentException.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__InvalidArgumentException.png
new file mode 100644
index 00000000..de8442aa
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__InvalidArgumentException.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__OutOfSequenceException.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__OutOfSequenceException.html
new file mode 100644
index 00000000..ec517168
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__OutOfSequenceException.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_OutOfSequenceException Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_OutOfSequenceException Class Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_OutOfSequenceException" --><!-- doxytag: inherits="CAS_Exception" --><div class="dynheader">
+Inheritance diagram for CAS_OutOfSequenceException:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__OutOfSequenceException.png" usemap="#CAS_OutOfSequenceException_map" alt=""/>
+  <map id="CAS_OutOfSequenceException_map" name="CAS_OutOfSequenceException_map">
+<area href="interfaceCAS__Exception.html" alt="CAS_Exception" shape="rect" coords="0,0,190,24"/>
+</map>
+</div>
+<table class="memberdecls">
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>This class defines Exceptions that should be thrown when the sequence of operations is invalid. Examples are:</p>
+<ul>
+<li>Requesting the response before executing a request.</li>
+<li>Changing the URL of a request after executing the request. </li>
+</ul>
+
+<p>Definition at line <a class="el" href="OutOfSequenceException_8php_source.html#l00039">39</a> of file <a class="el" href="OutOfSequenceException_8php_source.html">OutOfSequenceException.php</a>.</p>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__OutOfSequenceException.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__OutOfSequenceException.png
new file mode 100644
index 00000000..34705ded
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__OutOfSequenceException.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__AbstractStorage-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__AbstractStorage-members.html
new file mode 100644
index 00000000..4aa886da
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__AbstractStorage-members.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_PGTStorage_AbstractStorage Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga90ed7dc15a9c24154900bccc2ea5925d">$_error_message</a></td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga5bab9d6ccaeca2cbcc04ab1a2c0e4d16">$_initialized</a></td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga9ffd47d7bbf118b901bf1c449f4b20c2">__construct</a>($cas_parent)</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga68540ebebfe710140d16bab3ef1d61c1">getErrorMessage</a>()</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga9611a5217179596541d29d0a8d9ee7e7">getStorageInfo</a>()</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#gae0be262b206d9b1c3d5b73ccf91355eb">getStorageType</a>()</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#gacee98b92299f2aded9f8792005d2eefc">init</a>()</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#gad9cadc643a37b8a000acd42189fff761">isInitialized</a>()</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga67ea1647d16892d59f8e2fd4523f6dc7">read</a>($pgt_iou)</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga1fe701d2302688bb7876eb4f8d7580d8">setErrorMessage</a>($error_message)</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga28d2bcce9ce91978761746fd9d039edc">write</a>($pgt, $pgt_iou)</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td><code> [protected]</code></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__AbstractStorage.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__AbstractStorage.html
new file mode 100644
index 00000000..dfd1d85f
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__AbstractStorage.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_PGTStorage_AbstractStorage Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a>  </div>
+  <div class="headertitle">
+<h1>CAS_PGTStorage_AbstractStorage Class Reference<br/>
+<small>
+[<a class="el" href="group__internalPGTStorage.html">PGT storage</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_PGTStorage_AbstractStorage" --><div class="dynheader">
+Inheritance diagram for CAS_PGTStorage_AbstractStorage:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__PGTStorage__AbstractStorage.png" usemap="#CAS_PGTStorage_AbstractStorage_map" alt=""/>
+  <map id="CAS_PGTStorage_AbstractStorage_map" name="CAS_PGTStorage_AbstractStorage_map">
+<area href="classCAS__PGTStorage__Db.html" alt="CAS_PGTStorage_Db" shape="rect" coords="0,56,211,80"/>
+<area href="classCAS__PGTStorage__File.html" alt="CAS_PGTStorage_File" shape="rect" coords="221,56,432,80"/>
+</map>
+</div>
+
+<p><a href="classCAS__PGTStorage__AbstractStorage-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#gae0be262b206d9b1c3d5b73ccf91355eb">getStorageType</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga9611a5217179596541d29d0a8d9ee7e7">getStorageInfo</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga68540ebebfe710140d16bab3ef1d61c1">getErrorMessage</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga9ffd47d7bbf118b901bf1c449f4b20c2">__construct</a> ($cas_parent)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga1fe701d2302688bb7876eb4f8d7580d8">setErrorMessage</a> ($error_message)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#gad9cadc643a37b8a000acd42189fff761">isInitialized</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#gacee98b92299f2aded9f8792005d2eefc">init</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga28d2bcce9ce91978761746fd9d039edc">write</a> ($pgt, $pgt_iou)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga67ea1647d16892d59f8e2fd4523f6dc7">read</a> ($pgt_iou)</td></tr>
+<tr><td colspan="2"><h2><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga90ed7dc15a9c24154900bccc2ea5925d">$_error_message</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga5bab9d6ccaeca2cbcc04ab1a2c0e4d16">$_initialized</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>The <a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a> class is a generic class for PGT storage. This class should not be instanciated itself but inherited by specific PGT storage classes.</p>
+<dl class="author"><dt><b>Author:</b></dt><dd>Pascal Aubry &lt;pascal.aubry at univ-rennes1.fr&gt; </dd></dl>
+
+<p>Definition at line <a class="el" href="AbstractStorage_8php_source.html#l00045">45</a> of file <a class="el" href="AbstractStorage_8php_source.html">AbstractStorage.php</a>.</p>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__AbstractStorage.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__AbstractStorage.png
new file mode 100644
index 00000000..dccc746f
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__AbstractStorage.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__Db-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__Db-members.html
new file mode 100644
index 00000000..38001833
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__Db-members.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_PGTStorage_Db Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#gaf411a0dde3a26af1136ced781eda9ce4">$_dsn</a></td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#ga3c6c1256599c435efbab44881c8ec88c">$_errMode</a></td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#ga9e7f285d618bb73b8d91496ebf1e6e83">$_password</a></td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#gac156a575124a0b6f2722d8892909b51a">$_pdo</a></td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#ga0d7548f5a7d2c6c5a91b044f89055641">$_table</a></td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#gaeb3ecc301193541bd3aec19e9b71367b">$_table_options</a></td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#ga0cb86fcfcc709f502d6eac01389b2cca">$_username</a></td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#gafeb1ab0741a5ec3cd5eae2003464f457">__construct</a>($cas_parent, $dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga9ffd47d7bbf118b901bf1c449f4b20c2">CAS_PGTStorage_AbstractStorage::__construct</a>($cas_parent)</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#gae635e9f0b055b3004779294efb933976">_createTableSql</a>()</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#ga57155c9d2f208404eb4ae55729559cd7">_deletePgtSql</a>()</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#ga00f6c60f19bd223c0787a18f8ce7c703">_retrievePgtSql</a>()</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#ga316e6232a75c060e13ab495e163a3196">_storePgtSql</a>()</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#gad007b1dbc652edfd508e1c0fc94b0f8b">createTable</a>()</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga68540ebebfe710140d16bab3ef1d61c1">getErrorMessage</a>()</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#ga20d1b72b4a5ffd6c162925cd614a0031">getPdo</a>()</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#gaa453c54860a59f8bf1e1550334717542">getStorageInfo</a>()</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#ga7d60f1fd625678603f67fc1960ab0fbd">getStorageType</a>()</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#ga3b535ed0b0bc84801c4bf04b337cd431">getTable</a>()</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#gaa320ce6db1544a8964fc908fbd0783df">init</a>()</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#gad9cadc643a37b8a000acd42189fff761">isInitialized</a>()</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#ga100a2b62fd644d608059563606717b48">read</a>($pgt_iou)</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#ga2f1a321e90d6f94fca09ab6f288327b8">resetErrorMode</a>()</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga1fe701d2302688bb7876eb4f8d7580d8">setErrorMessage</a>($error_message)</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#ga99a44e639bda1b88710fb08f619ab5f7">setErrorMode</a>()</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalCAS__PGTStorageDb.html#ga82e33c56ba5fea740d57fd3711652898">write</a>($pgt, $pgt_iou)</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td><td></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__Db.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__Db.html
new file mode 100644
index 00000000..26c5411c
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__Db.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_PGTStorage_Db Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pri-methods">Private Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a>  </div>
+  <div class="headertitle">
+<h1>CAS_PGTStorage_Db Class Reference<br/>
+<small>
+[<a class="el" href="group__internalPGTStorageDb.html">PGT storage in a database</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_PGTStorage_Db" --><!-- doxytag: inherits="CAS_PGTStorage_AbstractStorage" --><div class="dynheader">
+Inheritance diagram for CAS_PGTStorage_Db:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__PGTStorage__Db.png" usemap="#CAS_PGTStorage_Db_map" alt=""/>
+  <map id="CAS_PGTStorage_Db_map" name="CAS_PGTStorage_Db_map">
+<area href="classCAS__PGTStorage__AbstractStorage.html" alt="CAS_PGTStorage_AbstractStorage" shape="rect" coords="0,0,211,24"/>
+</map>
+</div>
+
+<p><a href="classCAS__PGTStorage__Db-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga7d60f1fd625678603f67fc1960ab0fbd">getStorageType</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gaa453c54860a59f8bf1e1550334717542">getStorageInfo</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gafeb1ab0741a5ec3cd5eae2003464f457">__construct</a> ($cas_parent, $dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gaa320ce6db1544a8964fc908fbd0783df">init</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gad007b1dbc652edfd508e1c0fc94b0f8b">createTable</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga82e33c56ba5fea740d57fd3711652898">write</a> ($pgt, $pgt_iou)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga100a2b62fd644d608059563606717b48">read</a> ($pgt_iou)</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gae635e9f0b055b3004779294efb933976">_createTableSql</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga316e6232a75c060e13ab495e163a3196">_storePgtSql</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga00f6c60f19bd223c0787a18f8ce7c703">_retrievePgtSql</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga57155c9d2f208404eb4ae55729559cd7">_deletePgtSql</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="pri-methods"></a>
+Private Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga20d1b72b4a5ffd6c162925cd614a0031">getPdo</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga3b535ed0b0bc84801c4bf04b337cd431">getTable</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga99a44e639bda1b88710fb08f619ab5f7">setErrorMode</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga2f1a321e90d6f94fca09ab6f288327b8">resetErrorMode</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gac156a575124a0b6f2722d8892909b51a">$_pdo</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gaf411a0dde3a26af1136ced781eda9ce4">$_dsn</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga0cb86fcfcc709f502d6eac01389b2cca">$_username</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga9e7f285d618bb73b8d91496ebf1e6e83">$_password</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gaeb3ecc301193541bd3aec19e9b71367b">$_table_options</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga0d7548f5a7d2c6c5a91b044f89055641">$_table</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga3c6c1256599c435efbab44881c8ec88c">$_errMode</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>The <a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a> class is a class for PGT database storage.</p>
+<dl class="author"><dt><b>Author:</b></dt><dd>Daniel Frett &lt;daniel.frett at gmail.com&gt; </dd></dl>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00046">46</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__Db.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__Db.png
new file mode 100644
index 00000000..5477481d
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__Db.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__File-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__File-members.html
new file mode 100644
index 00000000..5d801914
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__File-members.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_PGTStorage_File Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorageFile.html#ga2808f4969d1a4310bcdaa7e02f0ea607">$_path</a></td><td><a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorageFile.html#ga23f7f09dd29619bd2550562c36713473">__construct</a>($cas_parent, $path)</td><td><a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga9ffd47d7bbf118b901bf1c449f4b20c2">CAS_PGTStorage_AbstractStorage::__construct</a>($cas_parent)</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga68540ebebfe710140d16bab3ef1d61c1">getErrorMessage</a>()</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorageFile.html#ga85d57a19425e0850dbd81aa7afe6b7a7">getPath</a>()</td><td><a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorageFile.html#ga0ea66347a5ab05db314d50c4212c867c">getPGTIouFilename</a>($pgt_iou)</td><td><a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorageFile.html#gad68bdd31082cd1b7852d671d0078d6ca">getStorageInfo</a>()</td><td><a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorageFile.html#ga19d04a68b743138f9545176ba75ff58d">getStorageType</a>()</td><td><a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorageFile.html#ga422f5a7ca597539b816e87b51f445843">init</a>()</td><td><a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#gad9cadc643a37b8a000acd42189fff761">isInitialized</a>()</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorageFile.html#ga14fe054afb4c780b567a5d8ac8214754">read</a>($pgt_iou)</td><td><a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorage.html#ga1fe701d2302688bb7876eb4f8d7580d8">setErrorMessage</a>($error_message)</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__internalPGTStorageFile.html#gae9dcfc67632d53bb890484862254ffef">write</a>($pgt, $pgt_iou)</td><td><a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a></td><td></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__File.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__File.html
new file mode 100644
index 00000000..5e45bfdc
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__File.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_PGTStorage_File Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pri-methods">Private Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a>  </div>
+  <div class="headertitle">
+<h1>CAS_PGTStorage_File Class Reference<br/>
+<small>
+[<a class="el" href="group__internalPGTStorageFile.html">PGT storage on the filesystem</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_PGTStorage_File" --><!-- doxytag: inherits="CAS_PGTStorage_AbstractStorage" --><div class="dynheader">
+Inheritance diagram for CAS_PGTStorage_File:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__PGTStorage__File.png" usemap="#CAS_PGTStorage_File_map" alt=""/>
+  <map id="CAS_PGTStorage_File_map" name="CAS_PGTStorage_File_map">
+<area href="classCAS__PGTStorage__AbstractStorage.html" alt="CAS_PGTStorage_AbstractStorage" shape="rect" coords="0,0,211,24"/>
+</map>
+</div>
+
+<p><a href="classCAS__PGTStorage__File-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#ga19d04a68b743138f9545176ba75ff58d">getStorageType</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#gad68bdd31082cd1b7852d671d0078d6ca">getStorageInfo</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#ga23f7f09dd29619bd2550562c36713473">__construct</a> ($cas_parent, $path)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#ga422f5a7ca597539b816e87b51f445843">init</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#gae9dcfc67632d53bb890484862254ffef">write</a> ($pgt, $pgt_iou)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#ga14fe054afb4c780b567a5d8ac8214754">read</a> ($pgt_iou)</td></tr>
+<tr><td colspan="2"><h2><a name="pri-methods"></a>
+Private Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#ga85d57a19425e0850dbd81aa7afe6b7a7">getPath</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#ga0ea66347a5ab05db314d50c4212c867c">getPGTIouFilename</a> ($pgt_iou)</td></tr>
+<tr><td colspan="2"><h2><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#ga2808f4969d1a4310bcdaa7e02f0ea607">$_path</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>The <a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a> class is a class for PGT file storage. An instance of this class is returned by CAS_Client::SetPGTStorageFile().</p>
+<dl class="author"><dt><b>Author:</b></dt><dd>Pascal Aubry &lt;pascal.aubry at univ-rennes1.fr&gt; </dd></dl>
+
+<p>Definition at line <a class="el" href="File_8php_source.html#l00045">45</a> of file <a class="el" href="File_8php_source.html">File.php</a>.</p>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__File.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__File.png
new file mode 100644
index 00000000..2a74ce2e
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__PGTStorage__File.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Abstract-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Abstract-members.html
new file mode 100644
index 00000000..835b9435
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Abstract-members.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Abstract Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#aa0ae0bb2854d179f8d72756fe7894394">$_casClient</a></td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#ab8c4883fd2ce6a059fdaaba258ecc521">$_proxyTicket</a></td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#ae0935c6797975015804403ea217b8c9a">getProxyTicket</a>()</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService.html#a60e1ce4d0228964a02f8747466011600">getServiceUrl</a>()</td><td><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a8d16ba3f8db0c521f88440b685746693">initializeProxyTicket</a>()</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a8287e46abc27c66a92f3c5162b586310">setCasClient</a>(CAS_Client $casClient)</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a98f8a839194f72d7d6ab05931b9878dc">setProxyTicket</a>($proxyTicket)</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService.html#aca7cf518dffecf31b2a311a9b80589e4">CAS_ProxiedService::setProxyTicket</a>($proxyTicket)</td><td><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></td><td></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Abstract.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Abstract.html
new file mode 100644
index 00000000..c33abd1c
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Abstract.html
@@ -0,0 +1,244 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_ProxiedService_Abstract Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a>  </div>
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Abstract Class Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_ProxiedService_Abstract" --><!-- doxytag: inherits="CAS_ProxiedService,CAS_ProxiedService_Testable" --><div class="dynheader">
+Inheritance diagram for CAS_ProxiedService_Abstract:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__ProxiedService__Abstract.png" usemap="#CAS_ProxiedService_Abstract_map" alt=""/>
+  <map id="CAS_ProxiedService_Abstract_map" name="CAS_ProxiedService_Abstract_map">
+<area href="interfaceCAS__ProxiedService.html" alt="CAS_ProxiedService" shape="rect" coords="112,0,327,24"/>
+<area href="interfaceCAS__ProxiedService__Testable.html" alt="CAS_ProxiedService_Testable" shape="rect" coords="337,0,552,24"/>
+<area href="classCAS__ProxiedService__Http__Abstract.html" alt="CAS_ProxiedService_Http_Abstract" shape="rect" coords="112,112,327,136"/>
+<area href="classCAS__ProxiedService__Imap.html" alt="CAS_ProxiedService_Imap" shape="rect" coords="337,112,552,136"/>
+<area href="classCAS__ProxiedService__Http__Get.html" alt="CAS_ProxiedService_Http_Get" shape="rect" coords="0,168,215,192"/>
+<area href="classCAS__ProxiedService__Http__Post.html" alt="CAS_ProxiedService_Http_Post" shape="rect" coords="225,168,440,192"/>
+</map>
+</div>
+
+<p><a href="classCAS__ProxiedService__Abstract-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Abstract.html#a98f8a839194f72d7d6ab05931b9878dc">setProxyTicket</a> ($proxyTicket)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Abstract.html#a8287e46abc27c66a92f3c5162b586310">setCasClient</a> (<a class="el" href="classCAS__Client.html">CAS_Client</a> $casClient)</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Abstract.html#ae0935c6797975015804403ea217b8c9a">getProxyTicket</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Abstract.html#a8d16ba3f8db0c521f88440b685746693">initializeProxyTicket</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Abstract.html#ab8c4883fd2ce6a059fdaaba258ecc521">$_proxyTicket</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Abstract.html#aa0ae0bb2854d179f8d72756fe7894394">$_casClient</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>This class implements common methods for ProxiedService implementations included with <a class="el" href="classphpCAS.html">phpCAS</a>. </p>
+
+<p>Definition at line <a class="el" href="Abstract_8php_source.html#l00041">41</a> of file <a class="el" href="Abstract_8php_source.html">Abstract.php</a>.</p>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="ae0935c6797975015804403ea217b8c9a"></a><!-- doxytag: member="CAS_ProxiedService_Abstract::getProxyTicket" ref="ae0935c6797975015804403ea217b8c9a" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Abstract::getProxyTicket </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer the proxy ticket to be used when making requests.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>string </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before a proxy ticket has already been initialized/set. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Abstract_8php_source.html#l00074">74</a> of file <a class="el" href="Abstract_8php_source.html">Abstract.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Http_2Abstract_8php_source.html#l00127">CAS_ProxiedService_Http_Abstract::send()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8d16ba3f8db0c521f88440b685746693"></a><!-- doxytag: member="CAS_ProxiedService_Abstract::initializeProxyTicket" ref="a8d16ba3f8db0c521f88440b685746693" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Abstract::initializeProxyTicket </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Fetch our proxy ticket.</p>
+<p>Descendent classes should call this method once their service URL is available to initialize their proxy ticket.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after a proxy ticket has already been initialized. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Abstract_8php_source.html#l00113">113</a> of file <a class="el" href="Abstract_8php_source.html">Abstract.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00857">phpCAS::initializeProxiedService()</a>.</p>
+
+<p>Referenced by <a class="el" href="Imap_8php_source.html#l00163">CAS_ProxiedService_Imap::open()</a>, and <a class="el" href="Http_2Abstract_8php_source.html#l00127">CAS_ProxiedService_Http_Abstract::send()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8287e46abc27c66a92f3c5162b586310"></a><!-- doxytag: member="CAS_ProxiedService_Abstract::setCasClient" ref="a8287e46abc27c66a92f3c5162b586310" args="(CAS_Client $casClient)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Abstract::setCasClient </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="classCAS__Client.html">CAS_Client</a> $&nbsp;</td>
+          <td class="paramname"> <em>casClient</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Use a particular CAS_Client-&gt;initializeProxiedService() rather than the static phpCAS::initializeProxiedService().</p>
+<p>This method should not be called in standard operation, but is needed for unit testing.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__Client.html">CAS_Client</a></em>&nbsp;</td><td>$casClient </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after a proxy ticket has already been initialized/set. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__ProxiedService__Testable.html#ad5f7b693a160d64f36abf91ccf9cece9">CAS_ProxiedService_Testable</a>.</p>
+
+<p>Definition at line <a class="el" href="Abstract_8php_source.html#l00097">97</a> of file <a class="el" href="Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a98f8a839194f72d7d6ab05931b9878dc"></a><!-- doxytag: member="CAS_ProxiedService_Abstract::setProxyTicket" ref="a98f8a839194f72d7d6ab05931b9878dc" args="($proxyTicket)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Abstract::setProxyTicket </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>proxyTicket</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Register a proxy ticket with the Proxy that it can use when making requests.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$proxyTicket </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>InvalidArgumentException</em>&nbsp;</td><td>If the $proxyTicket is invalid. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after a proxy ticket has already been initialized/set. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Abstract_8php_source.html#l00059">59</a> of file <a class="el" href="Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="aa0ae0bb2854d179f8d72756fe7894394"></a><!-- doxytag: member="CAS_ProxiedService_Abstract::$_casClient" ref="aa0ae0bb2854d179f8d72756fe7894394" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="classCAS__Client.html">CAS_Client</a> CAS_ProxiedService_Abstract::$_casClient<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Abstract_8php_source.html#l00084">84</a> of file <a class="el" href="Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab8c4883fd2ce6a059fdaaba258ecc521"></a><!-- doxytag: member="CAS_ProxiedService_Abstract::$_proxyTicket" ref="ab8c4883fd2ce6a059fdaaba258ecc521" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">string CAS_ProxiedService_Abstract::$_proxyTicket<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The proxy ticket that can be used when making service requests. </p>
+
+<p>Definition at line <a class="el" href="Abstract_8php_source.html#l00049">49</a> of file <a class="el" href="Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Abstract.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Abstract.png
new file mode 100644
index 00000000..6c2f8de1
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Abstract.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Exception.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Exception.html
new file mode 100644
index 00000000..33887560
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Exception.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_ProxiedService_Exception Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Exception Class Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_ProxiedService_Exception" --><!-- doxytag: inherits="CAS_Exception" --><div class="dynheader">
+Inheritance diagram for CAS_ProxiedService_Exception:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__ProxiedService__Exception.png" usemap="#CAS_ProxiedService_Exception_map" alt=""/>
+  <map id="CAS_ProxiedService_Exception_map" name="CAS_ProxiedService_Exception_map">
+<area href="interfaceCAS__Exception.html" alt="CAS_Exception" shape="rect" coords="0,0,194,24"/>
+</map>
+</div>
+<table class="memberdecls">
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>An Exception for problems communicating with a proxied service. </p>
+<dl><dt><b>Examples: </b></dt><dd>
+<p><a class="el" href="example__proxy__GET_8php-example.html#_a9">example_proxy_GET.php</a>, and <a class="el" href="example__proxy__POST_8php-example.html#_a10">example_proxy_POST.php</a>.</p>
+</dd>
+</dl>
+<p>Definition at line <a class="el" href="ProxiedService_2Exception_8php_source.html#l00036">36</a> of file <a class="el" href="ProxiedService_2Exception_8php_source.html">Exception.php</a>.</p>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Exception.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Exception.png
new file mode 100644
index 00000000..cd1ebadc
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Exception.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Abstract-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Abstract-members.html
new file mode 100644
index 00000000..c9e199c6
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Abstract-members.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Http_Abstract Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#ab730aea3d2b79064c658abedbcc42943">$_cookieJar</a></td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a186d09097c0291a981e0759a3b147b4e">$_numRequests</a></td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#acaa100e7268141dcd143f5ecc37320e9">$_requestHandler</a></td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa34f1b8b2524408a9e3f46704464d596">$_responseBody</a></td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#afeb924a6df557c0bb60db7669f2cac36">$_responseHeaders</a></td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a91190f3df8797b6015cc19d44867e075">$_responseStatusCode</a></td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#afccfaa50645a8464363f43791bdaa43a">$_url</a></td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#ab63e0a909fceda402baa3eeeacbdfde0">__construct</a>(CAS_RequestInterface $requestHandler, CAS_CookieJar $cookieJar)</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#ae0935c6797975015804403ea217b8c9a">getProxyTicket</a>()</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#ab388296ed4aee809f34b17d07d24a33f">getRedirectUrl</a>(array $responseHeaders)</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aebc91e27fc543255ec29ed274fc2cd02">getResponseBody</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a400962d54b27e83597583ab96e25910c">getResponseHeaders</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa276ab33d13b9b54ba59d71ae993423f">getResponseStatusCode</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa7c012da853d7333857199121cf1e002">getServiceUrl</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService.html#a60e1ce4d0228964a02f8747466011600">CAS_ProxiedService_Abstract::getServiceUrl</a>()</td><td><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a49cb4bf2481ac55f091434f0e7054d67">hasBeenSent</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a8d16ba3f8db0c521f88440b685746693">initializeProxyTicket</a>()</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a3f31c2009c2b099167ee9a37f72a278e">makeRequest</a>($url)</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a842fd1fe2423e9761a36d025687d2696">populateRequest</a>(CAS_RequestInterface $request)</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a27175aea106f5ae5bc8461f6ac4c1fc6">send</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a8287e46abc27c66a92f3c5162b586310">setCasClient</a>(CAS_Client $casClient)</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a98f8a839194f72d7d6ab05931b9878dc">setProxyTicket</a>($proxyTicket)</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService.html#aca7cf518dffecf31b2a311a9b80589e4">CAS_ProxiedService::setProxyTicket</a>($proxyTicket)</td><td><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a660204c7162343fc9878cd95b15a7273">setUrl</a>($url)</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Abstract.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Abstract.html
new file mode 100644
index 00000000..b3874bc2
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Abstract.html
@@ -0,0 +1,554 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_ProxiedService_Http_Abstract Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pro-attribs">Protected Attributes</a> &#124;
+<a href="#pri-methods">Private Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a>  </div>
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Http_Abstract Class Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_ProxiedService_Http_Abstract" --><!-- doxytag: inherits="CAS_ProxiedService_Abstract,CAS_ProxiedService_Http" --><div class="dynheader">
+Inheritance diagram for CAS_ProxiedService_Http_Abstract:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__ProxiedService__Http__Abstract.png" usemap="#CAS_ProxiedService_Http_Abstract_map" alt=""/>
+  <map id="CAS_ProxiedService_Http_Abstract_map" name="CAS_ProxiedService_Http_Abstract_map">
+<area href="classCAS__ProxiedService__Abstract.html" alt="CAS_ProxiedService_Abstract" shape="rect" coords="112,56,327,80"/>
+<area href="interfaceCAS__ProxiedService__Http.html" alt="CAS_ProxiedService_Http" shape="rect" coords="337,56,552,80"/>
+<area href="interfaceCAS__ProxiedService.html" alt="CAS_ProxiedService" shape="rect" coords="0,0,215,24"/>
+<area href="interfaceCAS__ProxiedService__Testable.html" alt="CAS_ProxiedService_Testable" shape="rect" coords="225,0,440,24"/>
+<area href="classCAS__ProxiedService__Http__Get.html" alt="CAS_ProxiedService_Http_Get" shape="rect" coords="112,168,327,192"/>
+<area href="classCAS__ProxiedService__Http__Post.html" alt="CAS_ProxiedService_Http_Post" shape="rect" coords="337,168,552,192"/>
+</map>
+</div>
+
+<p><a href="classCAS__ProxiedService__Http__Abstract-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#ab63e0a909fceda402baa3eeeacbdfde0">__construct</a> (<a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a> $requestHandler, <a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a> $cookieJar)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa7c012da853d7333857199121cf1e002">getServiceUrl</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a660204c7162343fc9878cd95b15a7273">setUrl</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a27175aea106f5ae5bc8461f6ac4c1fc6">send</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a400962d54b27e83597583ab96e25910c">getResponseHeaders</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa276ab33d13b9b54ba59d71ae993423f">getResponseStatusCode</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aebc91e27fc543255ec29ed274fc2cd02">getResponseBody</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a3f31c2009c2b099167ee9a37f72a278e">makeRequest</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a842fd1fe2423e9761a36d025687d2696">populateRequest</a> (<a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a> $request)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a49cb4bf2481ac55f091434f0e7054d67">hasBeenSent</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="pro-attribs"></a>
+Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#acaa100e7268141dcd143f5ecc37320e9">$_requestHandler</a></td></tr>
+<tr><td colspan="2"><h2><a name="pri-methods"></a>
+Private Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#ab388296ed4aee809f34b17d07d24a33f">getRedirectUrl</a> (array $responseHeaders)</td></tr>
+<tr><td colspan="2"><h2><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#ab730aea3d2b79064c658abedbcc42943">$_cookieJar</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#afccfaa50645a8464363f43791bdaa43a">$_url</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a186d09097c0291a981e0759a3b147b4e">$_numRequests</a> = 0</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#afeb924a6df557c0bb60db7669f2cac36">$_responseHeaders</a> = array()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a91190f3df8797b6015cc19d44867e075">$_responseStatusCode</a> = ''</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa34f1b8b2524408a9e3f46704464d596">$_responseBody</a> = ''</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>This class implements common methods for ProxiedService implementations included with <a class="el" href="classphpCAS.html">phpCAS</a>. </p>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00042">42</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+<hr/><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="ab63e0a909fceda402baa3eeeacbdfde0"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::__construct" ref="ab63e0a909fceda402baa3eeeacbdfde0" args="(CAS_RequestInterface $requestHandler, CAS_CookieJar $cookieJar)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Abstract::__construct </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a> $&nbsp;</td>
+          <td class="paramname"> <em>requestHandler</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a> $&nbsp;</td>
+          <td class="paramname"> <em>cookieJar</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Constructor.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></em>&nbsp;</td><td>$requestHandler </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a></em>&nbsp;</td><td>$cookieJar </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00067">67</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="ab388296ed4aee809f34b17d07d24a33f"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::getRedirectUrl" ref="ab388296ed4aee809f34b17d07d24a33f" args="(array $responseHeaders)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Abstract::getRedirectUrl </td>
+          <td>(</td>
+          <td class="paramtype">array $&nbsp;</td>
+          <td class="paramname"> <em>responseHeaders</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer a redirect URL if a redirect header is found, otherwise null.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>array</em>&nbsp;</td><td>$responseHeaders </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>string or null </dd></dl>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00246">246</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aebc91e27fc543255ec29ed274fc2cd02"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::getResponseBody" ref="aebc91e27fc543255ec29ed274fc2cd02" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Abstract::getResponseBody </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer the body of response.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>string </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__ProxiedService__Http.html#a492aa219ade6a93a56011108f80c452c">CAS_ProxiedService_Http</a>.</p>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00301">301</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a400962d54b27e83597583ab96e25910c"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::getResponseHeaders" ref="a400962d54b27e83597583ab96e25910c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Abstract::getResponseHeaders </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer the headers of the response.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>array An array of header strings. </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__ProxiedService__Http.html#abb17d77f4a62879a71ddc8c5dc38f679">CAS_ProxiedService_Http</a>.</p>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00275">275</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa276ab33d13b9b54ba59d71ae993423f"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::getResponseStatusCode" ref="aa276ab33d13b9b54ba59d71ae993423f" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Abstract::getResponseStatusCode </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer HTTP status code of the response</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>integer </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00288">288</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa7c012da853d7333857199121cf1e002"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::getServiceUrl" ref="aa7c012da853d7333857199121cf1e002" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Abstract::getServiceUrl </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer a service identifier (URL) for whom we should fetch a proxy ticket.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>string </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>Exception</em>&nbsp;</td><td>If no service url is available. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00084">84</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Http_2Abstract_8php_source.html#l00127">send()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a49cb4bf2481ac55f091434f0e7054d67"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::hasBeenSent" ref="a49cb4bf2481ac55f091434f0e7054d67" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Abstract::hasBeenSent </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer true if our request has been sent yet.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>boolean </dd></dl>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00265">265</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Http_2Abstract_8php_source.html#l00127">send()</a>, <a class="el" href="Post_8php_source.html#l00107">CAS_ProxiedService_Http_Post::setBody()</a>, <a class="el" href="Post_8php_source.html#l00093">CAS_ProxiedService_Http_Post::setContentType()</a>, and <a class="el" href="Http_2Abstract_8php_source.html#l00102">setUrl()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3f31c2009c2b099167ee9a37f72a278e"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::makeRequest" ref="a3f31c2009c2b099167ee9a37f72a278e" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Abstract::makeRequest </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Build and perform a request, following redirects</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$url </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a></em>&nbsp;</td><td>If there is a proxy-ticket failure. The code of the Exception will be one of: PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE PHPCAS_SERVICE_PT_FAILURE </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a></em>&nbsp;</td><td>If there is a failure sending the request to the target service. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00190">190</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+<p>References <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a842fd1fe2423e9761a36d025687d2696">populateRequest()</a>, and <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>.</p>
+
+<p>Referenced by <a class="el" href="Http_2Abstract_8php_source.html#l00127">send()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a842fd1fe2423e9761a36d025687d2696"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::populateRequest" ref="a842fd1fe2423e9761a36d025687d2696" args="(CAS_RequestInterface $request)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Abstract::populateRequest </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a> $&nbsp;</td>
+          <td class="paramname"> <em>request</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [abstract, protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add any other parts of the request needed by concrete classes</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></em>&nbsp;</td><td>$request </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Reimplemented in <a class="el" href="classCAS__ProxiedService__Http__Get.html#aaedb46c8bbc400c2d01bdcf4b585245e">CAS_ProxiedService_Http_Get</a>, and <a class="el" href="classCAS__ProxiedService__Http__Post.html#a53443c2638d51a29006056f42d28128b">CAS_ProxiedService_Http_Post</a>.</p>
+
+<p>Referenced by <a class="el" href="Http_2Abstract_8php_source.html#l00190">makeRequest()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a27175aea106f5ae5bc8461f6ac4c1fc6"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::send" ref="a27175aea106f5ae5bc8461f6ac4c1fc6" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Abstract::send </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Perform the request.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called multiple times. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a></em>&nbsp;</td><td>If there is a proxy-ticket failure. The code of the Exception will be one of: PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE PHPCAS_SERVICE_PT_FAILURE </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a></em>&nbsp;</td><td>If there is a failure sending the request to the target service. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__ProxiedService__Http.html#a424660c77d00a62c03c0c3c25aeeeb6a">CAS_ProxiedService_Http</a>.</p>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00127">127</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+<p>References <a class="el" href="Abstract_8php_source.html#l00074">CAS_ProxiedService_Abstract::getProxyTicket()</a>, <a class="el" href="Http_2Abstract_8php_source.html#l00084">getServiceUrl()</a>, <a class="el" href="Http_2Abstract_8php_source.html#l00265">hasBeenSent()</a>, <a class="el" href="Abstract_8php_source.html#l00113">CAS_ProxiedService_Abstract::initializeProxyTicket()</a>, <a class="el" href="Http_2Abstract_8php_source.html#l00190">makeRequest()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a660204c7162343fc9878cd95b15a7273"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::setUrl" ref="a660204c7162343fc9878cd95b15a7273" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Abstract::setUrl </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the URL of the Request</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$url </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implements <a class="el" href="interfaceCAS__ProxiedService__Http.html#a6bd6113c6e47a143756b6267aa77928b">CAS_ProxiedService_Http</a>.</p>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00102">102</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+<p>References <a class="el" href="Http_2Abstract_8php_source.html#l00265">hasBeenSent()</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="ab730aea3d2b79064c658abedbcc42943"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::$_cookieJar" ref="ab730aea3d2b79064c658abedbcc42943" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a> CAS_ProxiedService_Http_Abstract::$_cookieJar<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The storage mechanism for cookies set by the target service. </p>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00058">58</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a186d09097c0291a981e0759a3b147b4e"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::$_numRequests" ref="a186d09097c0291a981e0759a3b147b4e" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int CAS_ProxiedService_Http_Abstract::$_numRequests = 0<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Indicator of the number of requests (including redirects performed. </p>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00155">155</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acaa100e7268141dcd143f5ecc37320e9"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::$_requestHandler" ref="acaa100e7268141dcd143f5ecc37320e9" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a> CAS_ProxiedService_Http_Abstract::$_requestHandler<code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The HTTP request mechanism talking to the target service. </p>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00051">51</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa34f1b8b2524408a9e3f46704464d596"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::$_responseBody" ref="aa34f1b8b2524408a9e3f46704464d596" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">string CAS_ProxiedService_Http_Abstract::$_responseBody = ''<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The response headers. </p>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00176">176</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afeb924a6df557c0bb60db7669f2cac36"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::$_responseHeaders" ref="afeb924a6df557c0bb60db7669f2cac36" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">array CAS_ProxiedService_Http_Abstract::$_responseHeaders = array()<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The response headers. </p>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00162">162</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a91190f3df8797b6015cc19d44867e075"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::$_responseStatusCode" ref="a91190f3df8797b6015cc19d44867e075" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">string CAS_ProxiedService_Http_Abstract::$_responseStatusCode = ''<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The response status code. </p>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00169">169</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afccfaa50645a8464363f43791bdaa43a"></a><!-- doxytag: member="CAS_ProxiedService_Http_Abstract::$_url" ref="afccfaa50645a8464363f43791bdaa43a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">string CAS_ProxiedService_Http_Abstract::$_url<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The target service url. </p>
+
+<p>Definition at line <a class="el" href="Http_2Abstract_8php_source.html#l00076">76</a> of file <a class="el" href="Http_2Abstract_8php_source.html">Abstract.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Abstract.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Abstract.png
new file mode 100644
index 00000000..9f7f99c1
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Abstract.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Get-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Get-members.html
new file mode 100644
index 00000000..bbce1eea
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Get-members.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Http_Get Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classCAS__ProxiedService__Http__Get.html">CAS_ProxiedService_Http_Get</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#acaa100e7268141dcd143f5ecc37320e9">$_requestHandler</a></td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#ab63e0a909fceda402baa3eeeacbdfde0">__construct</a>(CAS_RequestInterface $requestHandler, CAS_CookieJar $cookieJar)</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#ae0935c6797975015804403ea217b8c9a">getProxyTicket</a>()</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aebc91e27fc543255ec29ed274fc2cd02">getResponseBody</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a400962d54b27e83597583ab96e25910c">getResponseHeaders</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa276ab33d13b9b54ba59d71ae993423f">getResponseStatusCode</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa7c012da853d7333857199121cf1e002">getServiceUrl</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService.html#a60e1ce4d0228964a02f8747466011600">CAS_ProxiedService_Abstract::getServiceUrl</a>()</td><td><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a49cb4bf2481ac55f091434f0e7054d67">hasBeenSent</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a8d16ba3f8db0c521f88440b685746693">initializeProxyTicket</a>()</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a3f31c2009c2b099167ee9a37f72a278e">makeRequest</a>($url)</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Get.html#aaedb46c8bbc400c2d01bdcf4b585245e">populateRequest</a>(CAS_RequestInterface $request)</td><td><a class="el" href="classCAS__ProxiedService__Http__Get.html">CAS_ProxiedService_Http_Get</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a27175aea106f5ae5bc8461f6ac4c1fc6">send</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a8287e46abc27c66a92f3c5162b586310">setCasClient</a>(CAS_Client $casClient)</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a98f8a839194f72d7d6ab05931b9878dc">setProxyTicket</a>($proxyTicket)</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService.html#aca7cf518dffecf31b2a311a9b80589e4">CAS_ProxiedService::setProxyTicket</a>($proxyTicket)</td><td><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a660204c7162343fc9878cd95b15a7273">setUrl</a>($url)</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Get.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Get.html
new file mode 100644
index 00000000..c61909fb
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Get.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_ProxiedService_Http_Get Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pro-methods">Protected Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Http_Get Class Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_ProxiedService_Http_Get" --><!-- doxytag: inherits="CAS_ProxiedService_Http_Abstract" --><div class="dynheader">
+Inheritance diagram for CAS_ProxiedService_Http_Get:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__ProxiedService__Http__Get.png" usemap="#CAS_ProxiedService_Http_Get_map" alt=""/>
+  <map id="CAS_ProxiedService_Http_Get_map" name="CAS_ProxiedService_Http_Get_map">
+<area href="classCAS__ProxiedService__Http__Abstract.html" alt="CAS_ProxiedService_Http_Abstract" shape="rect" coords="225,112,440,136"/>
+<area href="classCAS__ProxiedService__Abstract.html" alt="CAS_ProxiedService_Abstract" shape="rect" coords="112,56,327,80"/>
+<area href="interfaceCAS__ProxiedService__Http.html" alt="CAS_ProxiedService_Http" shape="rect" coords="337,56,552,80"/>
+<area href="interfaceCAS__ProxiedService.html" alt="CAS_ProxiedService" shape="rect" coords="0,0,215,24"/>
+<area href="interfaceCAS__ProxiedService__Testable.html" alt="CAS_ProxiedService_Testable" shape="rect" coords="225,0,440,24"/>
+</map>
+</div>
+
+<p><a href="classCAS__ProxiedService__Http__Get-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Get.html#aaedb46c8bbc400c2d01bdcf4b585245e">populateRequest</a> (<a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a> $request)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>This class is used to make proxied service requests via the HTTP GET method.</p>
+<p>Usage Example:</p>
+<p>try { $service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_GET); $service-&gt;setUrl('http://www.example.com/path/'); $service-&gt;<a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a27175aea106f5ae5bc8461f6ac4c1fc6">send()</a>; if ($service-&gt;<a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa276ab33d13b9b54ba59d71ae993423f">getResponseStatusCode()</a> == 200) return $service-&gt;<a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aebc91e27fc543255ec29ed274fc2cd02">getResponseBody()</a>; else // The service responded with an error code 404, 500, etc. throw new Exception('The service responded with an error.');</p>
+<p>} catch (<a class="el" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a> $e) { if ($e-&gt;getCode() == PHPCAS_SERVICE_PT_FAILURE) return "Your login has timed out. You need to log in again."; else // Other proxy ticket errors are from bad request format (shouldn't happen) // or CAS server failure (unlikely) so lets just stop if we hit those. throw $e; } catch (<a class="el" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a> $e) { // Something prevented the service request from being sent or received. // We didn't even get a valid error response (404, 500, etc), so this // might be caused by a network error or a DNS resolution failure. // We could handle it in some way, but for now we will just stop. throw $e; } </p>
+
+<p>Definition at line <a class="el" href="Get_8php_source.html#l00064">64</a> of file <a class="el" href="Get_8php_source.html">Get.php</a>.</p>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="aaedb46c8bbc400c2d01bdcf4b585245e"></a><!-- doxytag: member="CAS_ProxiedService_Http_Get::populateRequest" ref="aaedb46c8bbc400c2d01bdcf4b585245e" args="(CAS_RequestInterface $request)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Get::populateRequest </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a> $&nbsp;</td>
+          <td class="paramname"> <em>request</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add any other parts of the request needed by concrete classes</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></em>&nbsp;</td><td>$request </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Reimplemented from <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a842fd1fe2423e9761a36d025687d2696">CAS_ProxiedService_Http_Abstract</a>.</p>
+
+<p>Definition at line <a class="el" href="Get_8php_source.html#l00074">74</a> of file <a class="el" href="Get_8php_source.html">Get.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Get.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Get.png
new file mode 100644
index 00000000..90a79b77
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Get.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Post-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Post-members.html
new file mode 100644
index 00000000..3609c3fb
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Post-members.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Http_Post Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classCAS__ProxiedService__Http__Post.html">CAS_ProxiedService_Http_Post</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Post.html#a0e064cede54799dcf885dfdc807b1d72">$_body</a></td><td><a class="el" href="classCAS__ProxiedService__Http__Post.html">CAS_ProxiedService_Http_Post</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Post.html#a7c0840bde188bed301609ca92b77efcb">$_contentType</a></td><td><a class="el" href="classCAS__ProxiedService__Http__Post.html">CAS_ProxiedService_Http_Post</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#acaa100e7268141dcd143f5ecc37320e9">$_requestHandler</a></td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#ab63e0a909fceda402baa3eeeacbdfde0">__construct</a>(CAS_RequestInterface $requestHandler, CAS_CookieJar $cookieJar)</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#ae0935c6797975015804403ea217b8c9a">getProxyTicket</a>()</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aebc91e27fc543255ec29ed274fc2cd02">getResponseBody</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a400962d54b27e83597583ab96e25910c">getResponseHeaders</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa276ab33d13b9b54ba59d71ae993423f">getResponseStatusCode</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa7c012da853d7333857199121cf1e002">getServiceUrl</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService.html#a60e1ce4d0228964a02f8747466011600">CAS_ProxiedService_Abstract::getServiceUrl</a>()</td><td><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a49cb4bf2481ac55f091434f0e7054d67">hasBeenSent</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a8d16ba3f8db0c521f88440b685746693">initializeProxyTicket</a>()</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a3f31c2009c2b099167ee9a37f72a278e">makeRequest</a>($url)</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Post.html#a53443c2638d51a29006056f42d28128b">populateRequest</a>(CAS_RequestInterface $request)</td><td><a class="el" href="classCAS__ProxiedService__Http__Post.html">CAS_ProxiedService_Http_Post</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a27175aea106f5ae5bc8461f6ac4c1fc6">send</a>()</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Post.html#aef5a1524cefe9cd2e08e7700cf2151f9">setBody</a>($body)</td><td><a class="el" href="classCAS__ProxiedService__Http__Post.html">CAS_ProxiedService_Http_Post</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a8287e46abc27c66a92f3c5162b586310">setCasClient</a>(CAS_Client $casClient)</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Post.html#a22b8ab783f8a614c82320269a4c66f9a">setContentType</a>($contentType)</td><td><a class="el" href="classCAS__ProxiedService__Http__Post.html">CAS_ProxiedService_Http_Post</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a98f8a839194f72d7d6ab05931b9878dc">setProxyTicket</a>($proxyTicket)</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService.html#aca7cf518dffecf31b2a311a9b80589e4">CAS_ProxiedService::setProxyTicket</a>($proxyTicket)</td><td><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a660204c7162343fc9878cd95b15a7273">setUrl</a>($url)</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></td><td></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Post.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Post.html
new file mode 100644
index 00000000..f32d5072
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Post.html
@@ -0,0 +1,217 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_ProxiedService_Http_Post Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a>  </div>
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Http_Post Class Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_ProxiedService_Http_Post" --><!-- doxytag: inherits="CAS_ProxiedService_Http_Abstract" --><div class="dynheader">
+Inheritance diagram for CAS_ProxiedService_Http_Post:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__ProxiedService__Http__Post.png" usemap="#CAS_ProxiedService_Http_Post_map" alt=""/>
+  <map id="CAS_ProxiedService_Http_Post_map" name="CAS_ProxiedService_Http_Post_map">
+<area href="classCAS__ProxiedService__Http__Abstract.html" alt="CAS_ProxiedService_Http_Abstract" shape="rect" coords="225,112,440,136"/>
+<area href="classCAS__ProxiedService__Abstract.html" alt="CAS_ProxiedService_Abstract" shape="rect" coords="112,56,327,80"/>
+<area href="interfaceCAS__ProxiedService__Http.html" alt="CAS_ProxiedService_Http" shape="rect" coords="337,56,552,80"/>
+<area href="interfaceCAS__ProxiedService.html" alt="CAS_ProxiedService" shape="rect" coords="0,0,215,24"/>
+<area href="interfaceCAS__ProxiedService__Testable.html" alt="CAS_ProxiedService_Testable" shape="rect" coords="225,0,440,24"/>
+</map>
+</div>
+
+<p><a href="classCAS__ProxiedService__Http__Post-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Post.html#a22b8ab783f8a614c82320269a4c66f9a">setContentType</a> ($contentType)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Post.html#aef5a1524cefe9cd2e08e7700cf2151f9">setBody</a> ($body)</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Post.html#a53443c2638d51a29006056f42d28128b">populateRequest</a> (<a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a> $request)</td></tr>
+<tr><td colspan="2"><h2><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Post.html#a7c0840bde188bed301609ca92b77efcb">$_contentType</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Http__Post.html#a0e064cede54799dcf885dfdc807b1d72">$_body</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>This class is used to make proxied service requests via the HTTP POST method.</p>
+<p>Usage Example:</p>
+<p>try { $service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_POST); $service-&gt;setUrl('http://www.example.com/path/'); $service-&gt;setContentType('text/xml'); $service-&gt;setBody(''&lt;?xml version="1.0"?'.'&gt;&lt;methodCall&gt;&lt;methodName&gt;example.search&lt;/methodName&gt;&lt;/methodCall&gt;'); $service-&gt;<a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a27175aea106f5ae5bc8461f6ac4c1fc6">send()</a>; if ($service-&gt;<a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa276ab33d13b9b54ba59d71ae993423f">getResponseStatusCode()</a> == 200) return $service-&gt;<a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aebc91e27fc543255ec29ed274fc2cd02">getResponseBody()</a>; else // The service responded with an error code 404, 500, etc. throw new Exception('The service responded with an error.');</p>
+<p>} catch (<a class="el" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a> $e) { if ($e-&gt;getCode() == PHPCAS_SERVICE_PT_FAILURE) return "Your login has timed out. You need to log in again."; else // Other proxy ticket errors are from bad request format (shouldn't happen) // or CAS server failure (unlikely) so lets just stop if we hit those. throw $e; } catch (<a class="el" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a> $e) { // Something prevented the service request from being sent or received. // We didn't even get a valid error response (404, 500, etc), so this // might be caused by a network error or a DNS resolution failure. // We could handle it in some way, but for now we will just stop. throw $e; } </p>
+
+<p>Definition at line <a class="el" href="Post_8php_source.html#l00068">68</a> of file <a class="el" href="Post_8php_source.html">Post.php</a>.</p>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a53443c2638d51a29006056f42d28128b"></a><!-- doxytag: member="CAS_ProxiedService_Http_Post::populateRequest" ref="a53443c2638d51a29006056f42d28128b" args="(CAS_RequestInterface $request)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Post::populateRequest </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a> $&nbsp;</td>
+          <td class="paramname"> <em>request</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add any other parts of the request needed by concrete classes</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></em>&nbsp;</td><td>$request </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Reimplemented from <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a842fd1fe2423e9761a36d025687d2696">CAS_ProxiedService_Http_Abstract</a>.</p>
+
+<p>Definition at line <a class="el" href="Post_8php_source.html#l00120">120</a> of file <a class="el" href="Post_8php_source.html">Post.php</a>.</p>
+
+<p>References <a class="el" href="interfaceCAS__RequestInterface.html#a01f51e770a063eb289ac12c03a5346e6">CAS_RequestInterface::addHeader()</a>, <a class="el" href="interfaceCAS__RequestInterface.html#abc0658bec27d70286f12712944229e9b">CAS_RequestInterface::makePost()</a>, and <a class="el" href="interfaceCAS__RequestInterface.html#aab89b06410e705f16528f8883bb8f496">CAS_RequestInterface::setPostBody()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aef5a1524cefe9cd2e08e7700cf2151f9"></a><!-- doxytag: member="CAS_ProxiedService_Http_Post::setBody" ref="aef5a1524cefe9cd2e08e7700cf2151f9" args="($body)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Post::setBody </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>body</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the body of this POST request.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$body </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Post_8php_source.html#l00107">107</a> of file <a class="el" href="Post_8php_source.html">Post.php</a>.</p>
+
+<p>References <a class="el" href="Http_2Abstract_8php_source.html#l00265">CAS_ProxiedService_Http_Abstract::hasBeenSent()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a22b8ab783f8a614c82320269a4c66f9a"></a><!-- doxytag: member="CAS_ProxiedService_Http_Post::setContentType" ref="a22b8ab783f8a614c82320269a4c66f9a" args="($contentType)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http_Post::setContentType </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>contentType</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the content type of this POST request.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$contentType </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Post_8php_source.html#l00093">93</a> of file <a class="el" href="Post_8php_source.html">Post.php</a>.</p>
+
+<p>References <a class="el" href="Http_2Abstract_8php_source.html#l00265">CAS_ProxiedService_Http_Abstract::hasBeenSent()</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="a0e064cede54799dcf885dfdc807b1d72"></a><!-- doxytag: member="CAS_ProxiedService_Http_Post::$_body" ref="a0e064cede54799dcf885dfdc807b1d72" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">string CAS_ProxiedService_Http_Post::$_body<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The body of the this request </p>
+
+<p>Definition at line <a class="el" href="Post_8php_source.html#l00084">84</a> of file <a class="el" href="Post_8php_source.html">Post.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7c0840bde188bed301609ca92b77efcb"></a><!-- doxytag: member="CAS_ProxiedService_Http_Post::$_contentType" ref="a7c0840bde188bed301609ca92b77efcb" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">string CAS_ProxiedService_Http_Post::$_contentType<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The content-type of this request </p>
+
+<p>Definition at line <a class="el" href="Post_8php_source.html#l00077">77</a> of file <a class="el" href="Post_8php_source.html">Post.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Post.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Post.png
new file mode 100644
index 00000000..c25912b6
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Http__Post.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Imap-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Imap-members.html
new file mode 100644
index 00000000..ba86b9ce
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Imap-members.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Imap Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Imap.html#aa966d995726481c804be491db720d6fd">$_mailbox</a></td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Imap.html#a4b4476e2b7611e508dc6d948499a3dce">$_options</a></td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Imap.html#a15ac9a76b096f86951f83271c8ee869a">$_stream</a></td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Imap.html#a2f542818b5f70dcd3e1a4ce7af84b2b9">$_url</a></td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Imap.html#a93c53744acb8415e337707339e31b80f">$_username</a></td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td><code> [private]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Imap.html#a8fdeebc729d0136f0417fed01a9347af">__construct</a>($username)</td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Imap.html#ad93fa5f8b2cf87375c0838c2ef8ef3b8">getImapProxyTicket</a>()</td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#ae0935c6797975015804403ea217b8c9a">getProxyTicket</a>()</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Imap.html#a04473ce2d439ac35a6aacde9812477e0">getServiceUrl</a>()</td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService.html#a60e1ce4d0228964a02f8747466011600">CAS_ProxiedService_Abstract::getServiceUrl</a>()</td><td><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Imap.html#a29172ade9c38c472c6ee12fcf3857dfc">getStream</a>()</td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Imap.html#ace7f52150a572d314eee16c440370b33">hasBeenOpened</a>()</td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a8d16ba3f8db0c521f88440b685746693">initializeProxyTicket</a>()</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Imap.html#ae8b09f2de23a34d420b6627dfab5efa8">open</a>()</td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a8287e46abc27c66a92f3c5162b586310">setCasClient</a>(CAS_Client $casClient)</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Imap.html#a70f4b28a1bfbbb562cb12f2a57b5bd18">setMailbox</a>($mailbox)</td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Imap.html#a8c79192515b195decc7b3d2062d97de0">setOptions</a>($options)</td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Abstract.html#a98f8a839194f72d7d6ab05931b9878dc">setProxyTicket</a>($proxyTicket)</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService.html#aca7cf518dffecf31b2a311a9b80589e4">CAS_ProxiedService::setProxyTicket</a>($proxyTicket)</td><td><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxiedService__Imap.html#a7163e006f08994bd5a8ccef7a1992379">setServiceUrl</a>($url)</td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></td><td></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Imap.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Imap.html
new file mode 100644
index 00000000..6b673dc9
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Imap.html
@@ -0,0 +1,431 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_ProxiedService_Imap Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a>  </div>
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Imap Class Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_ProxiedService_Imap" --><!-- doxytag: inherits="CAS_ProxiedService_Abstract" --><div class="dynheader">
+Inheritance diagram for CAS_ProxiedService_Imap:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__ProxiedService__Imap.png" usemap="#CAS_ProxiedService_Imap_map" alt=""/>
+  <map id="CAS_ProxiedService_Imap_map" name="CAS_ProxiedService_Imap_map">
+<area href="classCAS__ProxiedService__Abstract.html" alt="CAS_ProxiedService_Abstract" shape="rect" coords="98,56,284,80"/>
+<area href="interfaceCAS__ProxiedService.html" alt="CAS_ProxiedService" shape="rect" coords="0,0,186,24"/>
+<area href="interfaceCAS__ProxiedService__Testable.html" alt="CAS_ProxiedService_Testable" shape="rect" coords="196,0,382,24"/>
+</map>
+</div>
+
+<p><a href="classCAS__ProxiedService__Imap-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html#a8fdeebc729d0136f0417fed01a9347af">__construct</a> ($username)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html#a04473ce2d439ac35a6aacde9812477e0">getServiceUrl</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html#a7163e006f08994bd5a8ccef7a1992379">setServiceUrl</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html#a70f4b28a1bfbbb562cb12f2a57b5bd18">setMailbox</a> ($mailbox)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html#a8c79192515b195decc7b3d2062d97de0">setOptions</a> ($options)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html#ae8b09f2de23a34d420b6627dfab5efa8">open</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html#a29172ade9c38c472c6ee12fcf3857dfc">getStream</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html#ad93fa5f8b2cf87375c0838c2ef8ef3b8">getImapProxyTicket</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html#ace7f52150a572d314eee16c440370b33">hasBeenOpened</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html#a93c53744acb8415e337707339e31b80f">$_username</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html#a2f542818b5f70dcd3e1a4ce7af84b2b9">$_url</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html#aa966d995726481c804be491db720d6fd">$_mailbox</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html#a4b4476e2b7611e508dc6d948499a3dce">$_options</a> = NULL</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxiedService__Imap.html#a15ac9a76b096f86951f83271c8ee869a">$_stream</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>Provides access to a proxy-authenticated IMAP stream </p>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00039">39</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+<hr/><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a8fdeebc729d0136f0417fed01a9347af"></a><!-- doxytag: member="CAS_ProxiedService_Imap::__construct" ref="a8fdeebc729d0136f0417fed01a9347af" args="($username)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Imap::__construct </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>username</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Constructor.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$username </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00056">56</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="ad93fa5f8b2cf87375c0838c2ef8ef3b8"></a><!-- doxytag: member="CAS_ProxiedService_Imap::getImapProxyTicket" ref="ad93fa5f8b2cf87375c0838c2ef8ef3b8" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Imap::getImapProxyTicket </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>CAS_Client::serviceMail() needs to return the proxy ticket for some reason, so this method provides access to it.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>string </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before the stream has been opened. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00228">228</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a04473ce2d439ac35a6aacde9812477e0"></a><!-- doxytag: member="CAS_ProxiedService_Imap::getServiceUrl" ref="a04473ce2d439ac35a6aacde9812477e0" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Imap::getServiceUrl </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer a service identifier (URL) for whom we should fetch a proxy ticket.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>string </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>Exception</em>&nbsp;</td><td>If no service url is available. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00075">75</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a29172ade9c38c472c6ee12fcf3857dfc"></a><!-- doxytag: member="CAS_ProxiedService_Imap::getStream" ref="a29172ade9c38c472c6ee12fcf3857dfc" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Imap::getStream </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer the IMAP stream</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>resource </dd></dl>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00214">214</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ace7f52150a572d314eee16c440370b33"></a><!-- doxytag: member="CAS_ProxiedService_Imap::hasBeenOpened" ref="ace7f52150a572d314eee16c440370b33" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Imap::hasBeenOpened </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer true if our request has been sent yet.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>boolean </dd></dl>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00195">195</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Imap_8php_source.html#l00163">open()</a>, <a class="el" href="Imap_8php_source.html#l00116">setMailbox()</a>, <a class="el" href="Imap_8php_source.html#l00139">setOptions()</a>, and <a class="el" href="Imap_8php_source.html#l00093">setServiceUrl()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae8b09f2de23a34d420b6627dfab5efa8"></a><!-- doxytag: member="CAS_ProxiedService_Imap::open" ref="ae8b09f2de23a34d420b6627dfab5efa8" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Imap::open </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Open the IMAP stream (similar to imap_open()).</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>resource Returns an IMAP stream on success </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called multiple times. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a></em>&nbsp;</td><td>If there is a proxy-ticket failure. The code of the Exception will be one of: PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE PHPCAS_SERVICE_PT_FAILURE </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a></em>&nbsp;</td><td>If there is a failure sending the request to the target service. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00163">163</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+
+<p>References <a class="el" href="Imap_8php_source.html#l00195">hasBeenOpened()</a>, <a class="el" href="Abstract_8php_source.html#l00113">CAS_ProxiedService_Abstract::initializeProxyTicket()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, and <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a70f4b28a1bfbbb562cb12f2a57b5bd18"></a><!-- doxytag: member="CAS_ProxiedService_Imap::setMailbox" ref="a70f4b28a1bfbbb562cb12f2a57b5bd18" args="($mailbox)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Imap::setMailbox </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>mailbox</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the mailbox to open. See the $mailbox parameter of imap_open().</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$mailbox </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the stream has been opened. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00116">116</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+
+<p>References <a class="el" href="Imap_8php_source.html#l00195">hasBeenOpened()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8c79192515b195decc7b3d2062d97de0"></a><!-- doxytag: member="CAS_ProxiedService_Imap::setOptions" ref="a8c79192515b195decc7b3d2062d97de0" args="($options)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Imap::setOptions </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>options</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the options for opening the stream. See the $options parameter of imap_open().</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>int</em>&nbsp;</td><td>$options </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the stream has been opened. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00139">139</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+
+<p>References <a class="el" href="Imap_8php_source.html#l00195">hasBeenOpened()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7163e006f08994bd5a8ccef7a1992379"></a><!-- doxytag: member="CAS_ProxiedService_Imap::setServiceUrl" ref="a7163e006f08994bd5a8ccef7a1992379" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Imap::setServiceUrl </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the URL of the service to pass to CAS for proxy-ticket retrieval.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$url </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the stream has been opened. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00093">93</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+
+<p>References <a class="el" href="Imap_8php_source.html#l00195">hasBeenOpened()</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Member Data Documentation</h2>
+<a class="anchor" id="aa966d995726481c804be491db720d6fd"></a><!-- doxytag: member="CAS_ProxiedService_Imap::$_mailbox" ref="aa966d995726481c804be491db720d6fd" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">string CAS_ProxiedService_Imap::$_mailbox<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The mailbox to open. See the $mailbox parameter of imap_open(). </p>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00107">107</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4b4476e2b7611e508dc6d948499a3dce"></a><!-- doxytag: member="CAS_ProxiedService_Imap::$_options" ref="a4b4476e2b7611e508dc6d948499a3dce" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int CAS_ProxiedService_Imap::$_options = NULL<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>A bit mask of options to pass to imap_open() as the $options parameter. </p>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00130">130</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a15ac9a76b096f86951f83271c8ee869a"></a><!-- doxytag: member="CAS_ProxiedService_Imap::$_stream" ref="a15ac9a76b096f86951f83271c8ee869a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">resource CAS_ProxiedService_Imap::$_stream<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The IMAP stream </p>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00207">207</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2f542818b5f70dcd3e1a4ce7af84b2b9"></a><!-- doxytag: member="CAS_ProxiedService_Imap::$_url" ref="a2f542818b5f70dcd3e1a4ce7af84b2b9" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">string CAS_ProxiedService_Imap::$_url<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The target service url. </p>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00067">67</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a93c53744acb8415e337707339e31b80f"></a><!-- doxytag: member="CAS_ProxiedService_Imap::$_username" ref="a93c53744acb8415e337707339e31b80f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">string CAS_ProxiedService_Imap::$_username<code> [private]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The username to send via imap_open. </p>
+
+<p>Definition at line <a class="el" href="Imap_8php_source.html#l00048">48</a> of file <a class="el" href="Imap_8php_source.html">Imap.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Imap.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Imap.png
new file mode 100644
index 00000000..03bb9a72
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxiedService__Imap.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxyTicketException-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxyTicketException-members.html
new file mode 100644
index 00000000..f7ed1939
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxyTicketException-members.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_ProxyTicketException Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="classCAS__ProxyTicketException.html#ad451fec20aa0b3b9cd3f8c711195bacd">__construct</a>($message, $code=PHPCAS_SERVICE_PT_FAILURE)</td><td><a class="el" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a></td><td></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxyTicketException.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxyTicketException.html
new file mode 100644
index 00000000..60da827a
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxyTicketException.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_ProxyTicketException Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>CAS_ProxyTicketException Class Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_ProxyTicketException" --><!-- doxytag: inherits="CAS_Exception" --><div class="dynheader">
+Inheritance diagram for CAS_ProxyTicketException:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__ProxyTicketException.png" usemap="#CAS_ProxyTicketException_map" alt=""/>
+  <map id="CAS_ProxyTicketException_map" name="CAS_ProxyTicketException_map">
+<area href="interfaceCAS__Exception.html" alt="CAS_Exception" shape="rect" coords="0,0,166,24"/>
+</map>
+</div>
+
+<p><a href="classCAS__ProxyTicketException-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__ProxyTicketException.html#ad451fec20aa0b3b9cd3f8c711195bacd">__construct</a> ($message, $code=<a class="el" href="group__publicServices.html#ga63639adfb3fdbe13a1708e4823380b4d">PHPCAS_SERVICE_PT_FAILURE</a>)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>An Exception for errors related to fetching or validating proxy tickets. </p>
+
+<p>Definition at line <a class="el" href="ProxyTicketException_8php_source.html#l00036">36</a> of file <a class="el" href="ProxyTicketException_8php_source.html">ProxyTicketException.php</a>.</p>
+<hr/><h2>Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="ad451fec20aa0b3b9cd3f8c711195bacd"></a><!-- doxytag: member="CAS_ProxyTicketException::__construct" ref="ad451fec20aa0b3b9cd3f8c711195bacd" args="($message, $code=PHPCAS_SERVICE_PT_FAILURE)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxyTicketException::__construct </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>message</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>code</em> = <code><a class="el" href="group__publicServices.html#ga63639adfb3fdbe13a1708e4823380b4d">PHPCAS_SERVICE_PT_FAILURE</a></code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Constructor</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$message </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>optional</em>&nbsp;</td><td>int $code </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>optional</em>&nbsp;</td><td>Exception $previous </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="ProxyTicketException_8php_source.html#l00049">49</a> of file <a class="el" href="ProxyTicketException_8php_source.html">ProxyTicketException.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxyTicketException.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxyTicketException.png
new file mode 100644
index 00000000..ebcd5a8c
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__ProxyTicketException.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__Request__Exception.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__Request__Exception.html
new file mode 100644
index 00000000..123063a7
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__Request__Exception.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_Request_Exception Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_Request_Exception Class Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_Request_Exception" --><!-- doxytag: inherits="CAS_Exception" --><div class="dynheader">
+Inheritance diagram for CAS_Request_Exception:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="classCAS__Request__Exception.png" usemap="#CAS_Request_Exception_map" alt=""/>
+  <map id="CAS_Request_Exception_map" name="CAS_Request_Exception_map">
+<area href="interfaceCAS__Exception.html" alt="CAS_Exception" shape="rect" coords="0,0,151,24"/>
+</map>
+</div>
+<table class="memberdecls">
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>An Exception for problems performing requests </p>
+
+<p>Definition at line <a class="el" href="Request_2Exception_8php_source.html#l00036">36</a> of file <a class="el" href="Request_2Exception_8php_source.html">Exception.php</a>.</p>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__Request__Exception.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__Request__Exception.png
new file mode 100644
index 00000000..d0f7ade4
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classCAS__Request__Exception.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classes.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classes.html
new file mode 100644
index 00000000..f663c0e1
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classes.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Alphabetical List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Class Index</h1>  </div>
+</div>
+<div class="contents">
+<div class="qindex"><a class="qindex" href="#letter_C">C</a>&nbsp;|&nbsp;<a class="qindex" href="#letter_P">P</a></div>
+<table align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
+<tr><td><a name="letter_C"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&nbsp;&nbsp;C&nbsp;&nbsp;</div></td></tr></table>
+</td><td><a class="el" href="interfaceCAS__Exception.html">CAS_Exception</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a>&nbsp;&nbsp;&nbsp;</td></tr><tr><td><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classCAS__ProxiedService__Http__Get.html">CAS_ProxiedService_Http_Get</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classCAS__Request__Exception.html">CAS_Request_Exception</a>&nbsp;&nbsp;&nbsp;</td></tr><tr><td><a class="el" href="classCAS__Client.html">CAS_Client</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classCAS__ProxiedService__Http__Post.html">CAS_ProxiedService_Http_Post</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a>&nbsp;&nbsp;&nbsp;</td></tr><tr><td><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a>&nbsp;&nbsp;&nbsp;</td><td><a name="letter_P"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&nbsp;&nbsp;P&nbsp;&nbsp;</div></td></tr></table>
+</td></tr><tr><td><a class="el" href="classCAS__CurlRequest.html">CAS_CurlRequest</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="interfaceCAS__ProxiedService__Http.html">CAS_ProxiedService_Http</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="interfaceCAS__ProxiedService__Testable.html">CAS_ProxiedService_Testable</a>&nbsp;&nbsp;&nbsp;</td><td><a class="el" href="classphpCAS.html">phpCAS</a>&nbsp;&nbsp;&nbsp;</td></tr></table><div class="qindex"><a class="qindex" href="#letter_C">C</a>&nbsp;|&nbsp;<a class="qindex" href="#letter_P">P</a></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classphpCAS-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classphpCAS-members.html
new file mode 100644
index 00000000..0c9e035a
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classphpCAS-members.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>phpCAS Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="classphpCAS.html">phpCAS</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga21fd1c2665d2e21c03e6a6dd1860cf4d">checkAuthentication</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">client</a>($server_version, $server_hostname, $server_port, $server_uri, $start_session=true)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">error</a>($msg)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">forceAuthentication</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga46f77015f5e206ad4956edae2905857c">getAttribute</a>($key)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga9972fbb286fe7e8d726b2e776b150233">getAttributes</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicServices.html#gaf3de7e9db40d6b15b6c8cb8dc8cb42eb">getProxiedService</a>($type)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classphpCAS.html#a5ba42b7bc46a67e897753efdb2c19d14">getProxies</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga7c01939d204339fcab6a4d3f15557a90">getServerLoginURL</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga280605a8665ce91117b796d3470d0c2d">getServerLogoutURL</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga929af13df94ab3033ab915b02eed74e2">getServiceURL</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga4c9f984b474b550cf316396e87670b18">getUser</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__public.html#ga5c971143e0c319b1268233907ca193b9">getVersion</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga33a0cf0299f96e23893ce4ff6cc76584">handleLogoutRequests</a>($check_client=true, $allowed_clients=false)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga261a58590cfc17399398ec5db81c2d7e">hasAttribute</a>($key)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#gaeee7fd7060e5edbf791e71b49270c9e1">hasAttributes</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicServices.html#ga36fd2939c6bb0d45567512de80994569">initializeProxiedService</a>(CAS_ProxiedService $proxiedService)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga48c16f6ef7158f8cf32dec4d1a68cbe5">isAuthenticated</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#gac79ced3333492b28b9d3849c56becb9e">isSessionAuthenticated</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicDebug.html#ga7e3b47a04a67d840cc60a765090c5505">log</a>($str)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga9989272833c5170c3b7c7027beab795b">logout</a>($params=&quot;&quot;)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga8121363b18b23a7ff84850851d85fcc1">logoutWithRedirectService</a>($service)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga03f02d32829f8e2dd7056aaa94dcfb79">logoutWithRedirectServiceAndUrl</a>($service, $url)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#gaf747b39e646075718b6504ae30d6df87">logoutWithUrl</a>($url)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">proxy</a>($server_version, $server_hostname, $server_port, $server_uri, $start_session=true)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga368b22dab91392a949dbfe902f2ac5f5">renewAuthentication</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga68624158674efe68505c247942ee129b">retrievePT</a>($target_service, &amp;$err_code, &amp;$err_msg)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicServices.html#ga700b64756f9a83b13365dc79ccd5e9ac">serviceMail</a>($url, $service, $flags, &amp;$err_code, &amp;$err_msg, &amp;$pt)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicServices.html#ga11e980f85bd420a42672148e9f1f8d82">serviceWeb</a>($url, &amp;$err_code, &amp;$output)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga6c3433e912dce36c51ebd5732bd43d07">setCacheTimesForAuthRecheck</a>($n)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#gac7c2da957fdd437f1e23147f83daffcb">setCasServerCACert</a>($cert)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">setDebug</a>($filename= '')</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="classphpCAS.html#a26ba0156e03fede5cd0c6bacbae8e928">setExtraCurlOption</a>($key, $value)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga8d7426d23b152ea51c1bdefdd6516df6">setFixedCallbackURL</a>($url= '')</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga6a67472e035941451db7d22d51d3017b">setFixedServiceURL</a>($url)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicOutput.html#ga166cd942019d96ef8b4504f2bfb9effd">setHTMLFooter</a>($footer)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicOutput.html#ga9beb490d4e355f131998f1a73c9d6065">setHTMLHeader</a>($header)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicLang.html#ga7eea67859bdfac8e89460a95f5bc961e">setLang</a>($lang)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">setNoCasServerValidation</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#gac7a6eeb2bfd55a432c57f5d18bd35048">setNoClearTicketsFromUrl</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicPGTStorage.html#ga66de471cfec81a09a24d482d472706cf">setPGTStorage</a>($storage)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicPGTStorage.html#ga10e7b70f0634dc65bb19db50f3cc847b">setPGTStorageDb</a>($dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicPGTStorage.html#gafad174fa82241a2d6aef2d7be15fa387">setPGTStorageFile</a>($format= '', $path= '')</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#gaef46bf2c415a72f1e81a1bf3a75b1324">setPostAuthenticateCallback</a>($function, array $additionalArgs=array())</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga3bae96f4d17cdc12ac2e81334ba44fc1">setServerLoginURL</a>($url= '')</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga090c9e2112180f4073cd2583c5c07800">setServerLogoutURL</a>($url= '')</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga11d1c13ed3d5008984ef5999a9389104">setServerProxyValidateURL</a>($url= '')</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga22ccd6f45db38b80f3549fc7691b1c8b">setServerSamlValidateURL</a>($url= '')</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga70abe40a03b6ebb068eecba436dd7a8c">setServerServiceValidateURL</a>($url= '')</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicAuth.html#ga996cb0478f7f35fca4dd33c9714d2452">setSingleSignoutCallback</a>($function, array $additionalArgs=array())</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">trace</a>($str)</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">traceBegin</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">traceEnd</a>($res= '')</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">traceExit</a>()</td><td><a class="el" href="classphpCAS.html">phpCAS</a></td><td><code> [static]</code></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classphpCAS.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classphpCAS.html
new file mode 100644
index 00000000..a20d0e89
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/classphpCAS.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: phpCAS Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-static-methods">Static Public Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>phpCAS Class Reference<br/>
+<small>
+[<a class="el" href="group__public.html">User interface</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="phpCAS" -->
+<p><a href="classphpCAS-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">client</a> ($server_version, $server_hostname, $server_port, $server_uri, $start_session=true)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">proxy</a> ($server_version, $server_hostname, $server_port, $server_uri, $start_session=true)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">setDebug</a> ($filename= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#ga7e3b47a04a67d840cc60a765090c5505">log</a> ($str)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">error</a> ($msg)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">trace</a> ($str)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">traceBegin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">traceEnd</a> ($res= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">traceExit</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga7eea67859bdfac8e89460a95f5bc961e">setLang</a> ($lang)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga5c971143e0c319b1268233907ca193b9">getVersion</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicOutput.html#ga9beb490d4e355f131998f1a73c9d6065">setHTMLHeader</a> ($header)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicOutput.html#ga166cd942019d96ef8b4504f2bfb9effd">setHTMLFooter</a> ($footer)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicPGTStorage.html#ga66de471cfec81a09a24d482d472706cf">setPGTStorage</a> ($storage)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicPGTStorage.html#ga10e7b70f0634dc65bb19db50f3cc847b">setPGTStorageDb</a> ($dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicPGTStorage.html#gafad174fa82241a2d6aef2d7be15fa387">setPGTStorageFile</a> ($format= '', $path= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#gaf3de7e9db40d6b15b6c8cb8dc8cb42eb">getProxiedService</a> ($type)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga36fd2939c6bb0d45567512de80994569">initializeProxiedService</a> (<a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a> $proxiedService)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga11e980f85bd420a42672148e9f1f8d82">serviceWeb</a> ($url, &amp;$err_code, &amp;$output)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga700b64756f9a83b13365dc79ccd5e9ac">serviceMail</a> ($url, $service, $flags, &amp;$err_code, &amp;$err_msg, &amp;$pt)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga6c3433e912dce36c51ebd5732bd43d07">setCacheTimesForAuthRecheck</a> ($n)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#gaef46bf2c415a72f1e81a1bf3a75b1324">setPostAuthenticateCallback</a> ($function, array $additionalArgs=array())</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga996cb0478f7f35fca4dd33c9714d2452">setSingleSignoutCallback</a> ($function, array $additionalArgs=array())</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga21fd1c2665d2e21c03e6a6dd1860cf4d">checkAuthentication</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">forceAuthentication</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga368b22dab91392a949dbfe902f2ac5f5">renewAuthentication</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga48c16f6ef7158f8cf32dec4d1a68cbe5">isAuthenticated</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#gac79ced3333492b28b9d3849c56becb9e">isSessionAuthenticated</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga4c9f984b474b550cf316396e87670b18">getUser</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga9972fbb286fe7e8d726b2e776b150233">getAttributes</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#gaeee7fd7060e5edbf791e71b49270c9e1">hasAttributes</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga261a58590cfc17399398ec5db81c2d7e">hasAttribute</a> ($key)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga46f77015f5e206ad4956edae2905857c">getAttribute</a> ($key)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga33a0cf0299f96e23893ce4ff6cc76584">handleLogoutRequests</a> ($check_client=true, $allowed_clients=false)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga7c01939d204339fcab6a4d3f15557a90">getServerLoginURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga3bae96f4d17cdc12ac2e81334ba44fc1">setServerLoginURL</a> ($url= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga70abe40a03b6ebb068eecba436dd7a8c">setServerServiceValidateURL</a> ($url= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga11d1c13ed3d5008984ef5999a9389104">setServerProxyValidateURL</a> ($url= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga22ccd6f45db38b80f3549fc7691b1c8b">setServerSamlValidateURL</a> ($url= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga280605a8665ce91117b796d3470d0c2d">getServerLogoutURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga090c9e2112180f4073cd2583c5c07800">setServerLogoutURL</a> ($url= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga9989272833c5170c3b7c7027beab795b">logout</a> ($params=&quot;&quot;)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga8121363b18b23a7ff84850851d85fcc1">logoutWithRedirectService</a> ($service)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#gaf747b39e646075718b6504ae30d6df87">logoutWithUrl</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga03f02d32829f8e2dd7056aaa94dcfb79">logoutWithRedirectServiceAndUrl</a> ($service, $url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga8d7426d23b152ea51c1bdefdd6516df6">setFixedCallbackURL</a> ($url= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga6a67472e035941451db7d22d51d3017b">setFixedServiceURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga929af13df94ab3033ab915b02eed74e2">getServiceURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga68624158674efe68505c247942ee129b">retrievePT</a> ($target_service, &amp;$err_code, &amp;$err_msg)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#gac7c2da957fdd437f1e23147f83daffcb">setCasServerCACert</a> ($cert)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">setNoCasServerValidation</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#gac7a6eeb2bfd55a432c57f5d18bd35048">setNoClearTicketsFromUrl</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphpCAS.html#a26ba0156e03fede5cd0c6bacbae8e928">setExtraCurlOption</a> ($key, $value)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphpCAS.html#a5ba42b7bc46a67e897753efdb2c19d14">getProxies</a> ()</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>The <a class="el" href="classphpCAS.html">phpCAS</a> class is a simple container for the <a class="el" href="classphpCAS.html">phpCAS</a> library. It provides CAS authentication for web applications written in PHP.</p>
+<dl class="author"><dt><b>Author:</b></dt><dd>Pascal Aubry &lt;pascal.aubry at univ-rennes1.fr&gt; </dd></dl>
+<dl><dt><b>Examples: </b></dt><dd>
+<p><a class="el" href="example__custom__urls_8php-example.html#_a10">example_custom_urls.php</a>, <a class="el" href="example__gateway_8php-example.html#_a11">example_gateway.php</a>, <a class="el" href="example__html_8php-example.html#_a10">example_html.php</a>, <a class="el" href="example__lang_8php-example.html#_a10">example_lang.php</a>, <a class="el" href="example__logout_8php-example.html#_a9">example_logout.php</a>, <a class="el" href="example__pgt__storage__file_8php-example.html#_a9">example_pgt_storage_file.php</a>, <a class="el" href="example__proxy__GET_8php-example.html#_a8">example_proxy_GET.php</a>, <a class="el" href="example__proxy__POST_8php-example.html#_a9">example_proxy_POST.php</a>, <a class="el" href="example__proxy__serviceWeb_8php-example.html#_a8">example_proxy_serviceWeb.php</a>, <a class="el" href="example__proxy__serviceWeb__chaining_8php-example.html#_a8">example_proxy_serviceWeb_chaining.php</a>, <a class="el" href="example__service__that__proxies_8php-example.html#_a8">example_service_that_proxies.php</a>, and <a class="el" href="example__simple_8php-example.html#_a9">example_simple.php</a>.</p>
+</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00323">323</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a5ba42b7bc46a67e897753efdb2c19d14"></a><!-- doxytag: member="phpCAS::getProxies" ref="a5ba42b7bc46a67e897753efdb2c19d14" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::getProxies </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer an array of proxies that are sitting in front of this application.</p>
+<p>This method will only return a non-empty array if we have received and validated a Proxy Ticket.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>array  public </dd></dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>6/25/09 </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01668">1668</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">error()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a26ba0156e03fede5cd0c6bacbae8e928"></a><!-- doxytag: member="phpCAS::setExtraCurlOption" ref="a26ba0156e03fede5cd0c6bacbae8e928" args="($key, $value)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setExtraCurlOption </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>key</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>value</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Change CURL options. CURL is used to connect through HTTPS to CAS server </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$key</em>&nbsp;</td><td>the option key </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$value</em>&nbsp;</td><td>the value to set </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01647">1647</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">error()</a>, <a class="el" href="CAS_8php_source.html#l00546">traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">traceEnd()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/closed.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/closed.png
new file mode 100644
index 00000000..b7d4bd9f
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/closed.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/config_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/config_8php.html
new file mode 100644
index 00000000..9769e5bd
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/config_8php.html
@@ -0,0 +1,286 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/config.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>docs/examples/config.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="config_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a> = '../../source/'</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a> = '192.168.178.254'</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a> = '/cas'</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a> = 8443</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="config_8php.html#a18552b2559a8de847b82b43b94adf047">$cas_server_ca_cert_path</a> = '/usr/local/share/ca-certificates/3some-cacert.crt'</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="config_8php.html#a636310976f993bc089ccc97652a28f28">$cas_real_hosts</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="config_8php.html#a1fa3127fc82f96b1436d871ef02be319">$db</a> = 'mysql:host=localhost;dbname=phpcas'</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="config_8php.html#a6a2ff59abacecba75a151826de414a27">$db_user</a> = 'root'</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="config_8php.html#a2962c2bda65ca19dd4dd12d7160f1bf8">$db_password</a> = 'test1234'</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="config_8php.html#a4593d4f8d59e41d620062617d48414e7">$db_table</a> = 'phpcas'</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="config_8php.html#a9a7b40881ec71841fae33b61dc061b60">$curdir</a> = &quot;/&quot;</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="config_8php.html#a92b2154d49731d7315ea689667265ec5">$serviceUrl</a> = $curbase.$curdir.'example_service.php'</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="config_8php.html#aeade28b58d5a23ee6eaf2a9663ba30dc">$serviceUrl2</a> = $curbase.$curdir.'example_service_that_proxies.php'</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a> = 'https://'.$cas_host</td></tr>
+</table>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="a172ba1fc184d6b0aec09f41f6ab4c892"></a><!-- doxytag: member="config.php::$cas_context" ref="a172ba1fc184d6b0aec09f41f6ab4c892" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$cas_context = '/cas'</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__advanced__saml11_8php-example.html#a5">example_advanced_saml11.php</a>, <a class="el" href="example__custom__urls_8php-example.html#a5">example_custom_urls.php</a>, <a class="el" href="example__gateway_8php-example.html#a5">example_gateway.php</a>, <a class="el" href="example__html_8php-example.html#a5">example_html.php</a>, <a class="el" href="example__lang_8php-example.html#a5">example_lang.php</a>, <a class="el" href="example__logout_8php-example.html#a5">example_logout.php</a>, <a class="el" href="example__pgt__storage__file_8php-example.html#a5">example_pgt_storage_file.php</a>, <a class="el" href="example__proxy__GET_8php-example.html#a5">example_proxy_GET.php</a>, <a class="el" href="example__proxy__POST_8php-example.html#a5">example_proxy_POST.php</a>, <a class="el" href="example__proxy__serviceWeb_8php-example.html#a5">example_proxy_serviceWeb.php</a>, <a class="el" href="example__proxy__serviceWeb__chaining_8php-example.html#a5">example_proxy_serviceWeb_chaining.php</a>, <a class="el" href="example__service_8php-example.html#a5">example_service.php</a>, <a class="el" href="example__service__POST_8php-example.html#a5">example_service_POST.php</a>, <a class="el" href="example__service__that__proxies_8php-example.html#a5">example_service_that_proxies.php</a>, and <a class="el" href="example__simple_8php-example.html#a5">example_simple.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="config_8php_source.html#l00016">16</a> of file <a class="el" href="config_8php_source.html">config.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae0aae118a26d9a1950cde9b6489bd75a"></a><!-- doxytag: member="config.php::$cas_host" ref="ae0aae118a26d9a1950cde9b6489bd75a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$cas_host = '192.168.178.254'</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__advanced__saml11_8php-example.html#a3">example_advanced_saml11.php</a>, <a class="el" href="example__custom__urls_8php-example.html#a3">example_custom_urls.php</a>, <a class="el" href="example__gateway_8php-example.html#a3">example_gateway.php</a>, <a class="el" href="example__html_8php-example.html#a3">example_html.php</a>, <a class="el" href="example__lang_8php-example.html#a3">example_lang.php</a>, <a class="el" href="example__logout_8php-example.html#a3">example_logout.php</a>, <a class="el" href="example__pgt__storage__file_8php-example.html#a3">example_pgt_storage_file.php</a>, <a class="el" href="example__proxy__GET_8php-example.html#a3">example_proxy_GET.php</a>, <a class="el" href="example__proxy__POST_8php-example.html#a3">example_proxy_POST.php</a>, <a class="el" href="example__proxy__serviceWeb_8php-example.html#a3">example_proxy_serviceWeb.php</a>, <a class="el" href="example__proxy__serviceWeb__chaining_8php-example.html#a3">example_proxy_serviceWeb_chaining.php</a>, <a class="el" href="example__service_8php-example.html#a3">example_service.php</a>, <a class="el" href="example__service__POST_8php-example.html#a3">example_service_POST.php</a>, <a class="el" href="example__service__that__proxies_8php-example.html#a3">example_service_that_proxies.php</a>, and <a class="el" href="example__simple_8php-example.html#a3">example_simple.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="config_8php_source.html#l00013">13</a> of file <a class="el" href="config_8php_source.html">config.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a522cb5480c329476a07bfd98d90eeded"></a><!-- doxytag: member="config.php::$cas_port" ref="a522cb5480c329476a07bfd98d90eeded" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$cas_port = 8443</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__advanced__saml11_8php-example.html#a4">example_advanced_saml11.php</a>, <a class="el" href="example__custom__urls_8php-example.html#a4">example_custom_urls.php</a>, <a class="el" href="example__gateway_8php-example.html#a4">example_gateway.php</a>, <a class="el" href="example__html_8php-example.html#a4">example_html.php</a>, <a class="el" href="example__lang_8php-example.html#a4">example_lang.php</a>, <a class="el" href="example__logout_8php-example.html#a4">example_logout.php</a>, <a class="el" href="example__pgt__storage__file_8php-example.html#a4">example_pgt_storage_file.php</a>, <a class="el" href="example__proxy__GET_8php-example.html#a4">example_proxy_GET.php</a>, <a class="el" href="example__proxy__POST_8php-example.html#a4">example_proxy_POST.php</a>, <a class="el" href="example__proxy__serviceWeb_8php-example.html#a4">example_proxy_serviceWeb.php</a>, <a class="el" href="example__proxy__serviceWeb__chaining_8php-example.html#a4">example_proxy_serviceWeb_chaining.php</a>, <a class="el" href="example__service_8php-example.html#a4">example_service.php</a>, <a class="el" href="example__service__POST_8php-example.html#a4">example_service_POST.php</a>, <a class="el" href="example__service__that__proxies_8php-example.html#a4">example_service_that_proxies.php</a>, and <a class="el" href="example__simple_8php-example.html#a4">example_simple.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="config_8php_source.html#l00019">19</a> of file <a class="el" href="config_8php_source.html">config.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a636310976f993bc089ccc97652a28f28"></a><!-- doxytag: member="config.php::$cas_real_hosts" ref="a636310976f993bc089ccc97652a28f28" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$cas_real_hosts</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<b>Initial value:</b><div class="fragment"><pre class="fragment"> array (
+        <span class="stringliteral">&#39;192.168.178.254&#39;</span>
+)
+</pre></div><dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__advanced__saml11_8php-example.html#a9">example_advanced_saml11.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="config_8php_source.html#l00030">30</a> of file <a class="el" href="config_8php_source.html">config.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a18552b2559a8de847b82b43b94adf047"></a><!-- doxytag: member="config.php::$cas_server_ca_cert_path" ref="a18552b2559a8de847b82b43b94adf047" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$cas_server_ca_cert_path = '/usr/local/share/ca-certificates/3some-cacert.crt'</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__advanced__saml11_8php-example.html#a7">example_advanced_saml11.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="config_8php_source.html#l00022">22</a> of file <a class="el" href="config_8php_source.html">config.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad82993472f3d28477de70f77603c0c01"></a><!-- doxytag: member="config.php::$cas_url" ref="ad82993472f3d28477de70f77603c0c01" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">if ($cas_port!= '443') $cas_url = 'https://'.$cas_host</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="config_8php_source.html#l00063">63</a> of file <a class="el" href="config_8php_source.html">config.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l03009">CAS_Client::authError()</a>, <a class="el" href="Client_8php_source.html#l01273">CAS_Client::logout()</a>, <a class="el" href="Client_8php_source.html#l01253">CAS_Client::redirectToCas()</a>, and <a class="el" href="Client_8php_source.html#l02143">CAS_Client::retrievePT()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9a7b40881ec71841fae33b61dc061b60"></a><!-- doxytag: member="config.php::$curdir" ref="a9a7b40881ec71841fae33b61dc061b60" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$curdir = &quot;/&quot;</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="config_8php_source.html#l00056">56</a> of file <a class="el" href="config_8php_source.html">config.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1fa3127fc82f96b1436d871ef02be319"></a><!-- doxytag: member="config.php::$db" ref="a1fa3127fc82f96b1436d871ef02be319" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$db = 'mysql:host=localhost;dbname=phpcas'</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="config_8php_source.html#l00036">36</a> of file <a class="el" href="config_8php_source.html">config.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2962c2bda65ca19dd4dd12d7160f1bf8"></a><!-- doxytag: member="config.php::$db_password" ref="a2962c2bda65ca19dd4dd12d7160f1bf8" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$db_password = 'test1234'</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="config_8php_source.html#l00040">40</a> of file <a class="el" href="config_8php_source.html">config.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4593d4f8d59e41d620062617d48414e7"></a><!-- doxytag: member="config.php::$db_table" ref="a4593d4f8d59e41d620062617d48414e7" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$db_table = 'phpcas'</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="config_8php_source.html#l00041">41</a> of file <a class="el" href="config_8php_source.html">config.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6a2ff59abacecba75a151826de414a27"></a><!-- doxytag: member="config.php::$db_user" ref="a6a2ff59abacecba75a151826de414a27" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$db_user = 'root'</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="config_8php_source.html#l00039">39</a> of file <a class="el" href="config_8php_source.html">config.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aeb426124815566a4c80104ce25a6d46f"></a><!-- doxytag: member="config.php::$phpcas_path" ref="aeb426124815566a4c80104ce25a6d46f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$phpcas_path = '../../source/'</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__advanced__saml11_8php-example.html#a0">example_advanced_saml11.php</a>, <a class="el" href="example__custom__urls_8php-example.html#a0">example_custom_urls.php</a>, <a class="el" href="example__gateway_8php-example.html#a0">example_gateway.php</a>, <a class="el" href="example__html_8php-example.html#a0">example_html.php</a>, <a class="el" href="example__lang_8php-example.html#a0">example_lang.php</a>, <a class="el" href="example__logout_8php-example.html#a0">example_logout.php</a>, <a class="el" href="example__pgt__storage__file_8php-example.html#a0">example_pgt_storage_file.php</a>, <a class="el" href="example__proxy__GET_8php-example.html#a0">example_proxy_GET.php</a>, <a class="el" href="example__proxy__POST_8php-example.html#a0">example_proxy_POST.php</a>, <a class="el" href="example__proxy__serviceWeb_8php-example.html#a0">example_proxy_serviceWeb.php</a>, <a class="el" href="example__proxy__serviceWeb__chaining_8php-example.html#a0">example_proxy_serviceWeb_chaining.php</a>, <a class="el" href="example__service_8php-example.html#a0">example_service.php</a>, <a class="el" href="example__service__POST_8php-example.html#a0">example_service_POST.php</a>, <a class="el" href="example__service__that__proxies_8php-example.html#a0">example_service_that_proxies.php</a>, and <a class="el" href="example__simple_8php-example.html#a0">example_simple.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="config_8php_source.html#l00006">6</a> of file <a class="el" href="config_8php_source.html">config.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a92b2154d49731d7315ea689667265ec5"></a><!-- doxytag: member="config.php::$serviceUrl" ref="a92b2154d49731d7315ea689667265ec5" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$serviceUrl = $curbase.$curdir.'example_service.php'</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__proxy__POST_8php-example.html#a8">example_proxy_POST.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="config_8php_source.html#l00059">59</a> of file <a class="el" href="config_8php_source.html">config.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l02455">CAS_Client::serviceMail()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aeade28b58d5a23ee6eaf2a9663ba30dc"></a><!-- doxytag: member="config.php::$serviceUrl2" ref="aeade28b58d5a23ee6eaf2a9663ba30dc" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$serviceUrl2 = $curbase.$curdir.'example_service_that_proxies.php'</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="config_8php_source.html#l00061">61</a> of file <a class="el" href="config_8php_source.html">config.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/config_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/config_8php_source.html
new file mode 100644
index 00000000..a4d7da76
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/config_8php_source.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/config.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/config.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="config_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 
+<a name="l00003"></a>00003 <span class="comment">// The purpose of this central config file is configuring all examples</span>
+<a name="l00004"></a>00004 <span class="comment">// in one place with minimal work for your working environment</span>
+<a name="l00005"></a>00005 
+<a name="l00006"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">00006</a> <a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a> = <span class="stringliteral">&#39;../../source/&#39;</span>;
+<a name="l00007"></a>00007 
+<a name="l00009"></a>00009 <span class="comment">// Basic Config of the phpCAS client //</span>
+<a name="l00011"></a>00011 <span class="comment"></span>
+<a name="l00012"></a>00012 <span class="comment">// Full Hostname of your CAS Server</span>
+<a name="l00013"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">00013</a> <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a> = <span class="stringliteral">&#39;192.168.178.254&#39;</span>;
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// Context of the CAS Server</span>
+<a name="l00016"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">00016</a> <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a> = <span class="stringliteral">&#39;/cas&#39;</span>;
+<a name="l00017"></a>00017 
+<a name="l00018"></a>00018 <span class="comment">// Port of your CAS server. Normally for a https server it&#39;s 443</span>
+<a name="l00019"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">00019</a> <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a> = 8443;
+<a name="l00020"></a>00020 
+<a name="l00021"></a>00021 <span class="comment">// Path to the ca chain that issued the cas server certificate</span>
+<a name="l00022"></a><a class="code" href="config_8php.html#a18552b2559a8de847b82b43b94adf047">00022</a> <a class="code" href="config_8php.html#a18552b2559a8de847b82b43b94adf047">$cas_server_ca_cert_path</a> = <span class="stringliteral">&#39;/usr/local/share/ca-certificates/3some-cacert.crt&#39;</span>;
+<a name="l00023"></a>00023 
+<a name="l00025"></a>00025 <span class="comment">// Advanced Config for special purposes //</span>
+<a name="l00027"></a>00027 <span class="comment"></span>
+<a name="l00028"></a>00028 <span class="comment">// The &quot;real&quot; hosts of clustered cas server that send SAML logout messages</span>
+<a name="l00029"></a>00029 <span class="comment">// Assumes the cas server is load balanced across multiple hosts</span>
+<a name="l00030"></a><a class="code" href="config_8php.html#a636310976f993bc089ccc97652a28f28">00030</a> <a class="code" href="config_8php.html#a636310976f993bc089ccc97652a28f28">$cas_real_hosts</a> = array (
+<a name="l00031"></a>00031         <span class="stringliteral">&#39;192.168.178.254&#39;</span>
+<a name="l00032"></a>00032 );
+<a name="l00033"></a>00033 
+<a name="l00034"></a>00034 <span class="comment">// Database config for PGT Storage</span>
+<a name="l00035"></a>00035 <span class="comment">//$db = &#39;pgsql:host=localhost;dbname=phpcas&#39;;</span>
+<a name="l00036"></a><a class="code" href="config_8php.html#a1fa3127fc82f96b1436d871ef02be319">00036</a> <a class="code" href="config_8php.html#a1fa3127fc82f96b1436d871ef02be319">$db</a> = <span class="stringliteral">&#39;mysql:host=localhost;dbname=phpcas&#39;</span>;
+<a name="l00037"></a>00037 <span class="comment">//$db_user = &#39;phpcas&#39;;</span>
+<a name="l00038"></a>00038 <span class="comment">//$db_password = &#39;1938r132rwv12cadl&#39;;</span>
+<a name="l00039"></a><a class="code" href="config_8php.html#a6a2ff59abacecba75a151826de414a27">00039</a> <a class="code" href="config_8php.html#a6a2ff59abacecba75a151826de414a27">$db_user</a> = <span class="stringliteral">&#39;root&#39;</span>;
+<a name="l00040"></a><a class="code" href="config_8php.html#a2962c2bda65ca19dd4dd12d7160f1bf8">00040</a> <a class="code" href="config_8php.html#a2962c2bda65ca19dd4dd12d7160f1bf8">$db_password</a> = <span class="stringliteral">&#39;test1234&#39;</span>;
+<a name="l00041"></a><a class="code" href="config_8php.html#a4593d4f8d59e41d620062617d48414e7">00041</a> <a class="code" href="config_8php.html#a4593d4f8d59e41d620062617d48414e7">$db_table</a> = <span class="stringliteral">&#39;phpcas&#39;</span>;
+<a name="l00042"></a>00042 
+<a name="l00044"></a>00044 <span class="comment">// End Configuration -- Don&#39;t edit below //</span>
+<a name="l00046"></a>00046 <span class="comment"></span>
+<a name="l00047"></a>00047 <span class="comment">// Generating the URLS for the local cas example services for proxy testing</span>
+<a name="l00048"></a>00048 <span class="keywordflow">if</span> ( isset($_SERVER[<span class="stringliteral">&#39;HTTPS&#39;</span>]) &amp;&amp; $_SERVER[<span class="stringliteral">&#39;HTTPS&#39;</span>] == <span class="stringliteral">&#39;on&#39;</span>){
+<a name="l00049"></a>00049         $curbase = <span class="stringliteral">&#39;https://&#39;</span>.$_SERVER[<span class="stringliteral">&#39;SERVER_NAME&#39;</span>];
+<a name="l00050"></a>00050 }<span class="keywordflow">else</span>{
+<a name="l00051"></a>00051         $curbase = <span class="stringliteral">&#39;http://&#39;</span>.$_SERVER[<span class="stringliteral">&#39;SERVER_NAME&#39;</span>];
+<a name="l00052"></a>00052 }
+<a name="l00053"></a>00053 <span class="keywordflow">if</span> ($_SERVER[<span class="stringliteral">&#39;SERVER_PORT&#39;</span>] != 80 &amp;&amp; $_SERVER[<span class="stringliteral">&#39;SERVER_PORT&#39;</span>] != 443)
+<a name="l00054"></a>00054         $curbase .= <span class="charliteral">&#39;:&#39;</span>.$_SERVER[<span class="stringliteral">&#39;SERVER_PORT&#39;</span>];
+<a name="l00055"></a>00055 
+<a name="l00056"></a><a class="code" href="config_8php.html#a9a7b40881ec71841fae33b61dc061b60">00056</a> <a class="code" href="config_8php.html#a9a7b40881ec71841fae33b61dc061b60">$curdir</a> = dirname($_SERVER[<span class="stringliteral">&#39;REQUEST_URI&#39;</span>]).<span class="stringliteral">&quot;/&quot;</span>;
+<a name="l00057"></a>00057 
+<a name="l00058"></a>00058 <span class="comment">// access to a single service</span>
+<a name="l00059"></a><a class="code" href="config_8php.html#a92b2154d49731d7315ea689667265ec5">00059</a> <a class="code" href="config_8php.html#a92b2154d49731d7315ea689667265ec5">$serviceUrl</a> = $curbase.$curdir.<span class="stringliteral">&#39;example_service.php&#39;</span>;
+<a name="l00060"></a>00060 <span class="comment">// access to a second service</span>
+<a name="l00061"></a><a class="code" href="config_8php.html#aeade28b58d5a23ee6eaf2a9663ba30dc">00061</a> <a class="code" href="config_8php.html#aeade28b58d5a23ee6eaf2a9663ba30dc">$serviceUrl2</a> = $curbase.$curdir.<span class="stringliteral">&#39;example_service_that_proxies.php&#39;</span>;
+<a name="l00062"></a>00062 
+<a name="l00063"></a><a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">00063</a> <a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a> = <span class="stringliteral">&#39;https://&#39;</span>.$cas_host;
+<a name="l00064"></a>00064 <span class="keywordflow">if</span> (<a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a> != <span class="stringliteral">&#39;443&#39;</span>)
+<a name="l00065"></a>00065 {
+<a name="l00066"></a>00066         <a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a> = <a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a>.<span class="charliteral">&#39;:&#39;</span>.<a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>;
+<a name="l00067"></a>00067 }
+<a name="l00068"></a>00068 <a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a> = <a class="code" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">$cas_url</a>.$cas_context;
+<a name="l00069"></a>00069 
+<a name="l00070"></a>00070 
+<a name="l00071"></a>00071 <span class="comment">// Set the session-name to be unique to the current script so that the client script</span>
+<a name="l00072"></a>00072 <span class="comment">// doesn&#39;t share its session with a proxied script.</span>
+<a name="l00073"></a>00073 <span class="comment">// This is just useful when running the example code, but not normally.</span>
+<a name="l00074"></a>00074 session_name(<span class="stringliteral">&#39;session_for:&#39;</span>.preg_replace(<span class="stringliteral">&#39;/[^a-z0-9-]/i&#39;</span>, <span class="charliteral">&#39;_&#39;</span>, basename($_SERVER[<span class="stringliteral">&#39;SCRIPT_NAME&#39;</span>])));
+<a name="l00075"></a>00075 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/deprecated.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/deprecated.html
new file mode 100644
index 00000000..61da9fe4
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/deprecated.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Deprecated List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Deprecated List </h1>  </div>
+</div>
+<div class="contents">
+<p><a class="anchor" id="_deprecated000001"></a> </p>
+<dl>
+<dt>Member <a class="el" href="group__internalPGTStorage.html#ga90ed7dc15a9c24154900bccc2ea5925d">CAS_PGTStorage_AbstractStorage::$_error_message</a>  </dt>
+<dd>not used. </dd>
+</dl>
+<p><a class="anchor" id="_deprecated000003"></a> </p>
+<dl>
+<dt>Member <a class="el" href="group__internalPGTStorage.html#ga68540ebebfe710140d16bab3ef1d61c1">CAS_PGTStorage_AbstractStorage::getErrorMessage</a> () </dt>
+<dd>not used. </dd>
+</dl>
+<p><a class="anchor" id="_deprecated000002"></a> </p>
+<dl>
+<dt>Member <a class="el" href="group__internalPGTStorage.html#ga1fe701d2302688bb7876eb4f8d7580d8">CAS_PGTStorage_AbstractStorage::setErrorMessage</a> ($error_message) </dt>
+<dd>not used. </dd>
+</dl>
+<p><a class="anchor" id="_deprecated000005"></a> </p>
+<dl>
+<dt>Member <a class="el" href="group__publicAuth.html#ga03f02d32829f8e2dd7056aaa94dcfb79">phpCAS::logoutWithRedirectServiceAndUrl</a> ($service, $url) </dt>
+<dd>The url parameter has been removed from the CAS server as of version 3.3.5.1 </dd>
+</dl>
+<p><a class="anchor" id="_deprecated000004"></a> </p>
+<dl>
+<dt>Member <a class="el" href="group__publicAuth.html#gaf747b39e646075718b6504ae30d6df87">phpCAS::logoutWithUrl</a> ($url) </dt>
+<dd>The url parameter has been removed from the CAS server as of version 3.3.5.1 </dd>
+</dl>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/doxygen.css b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/doxygen.css
new file mode 100644
index 00000000..658686fe
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/doxygen.css
@@ -0,0 +1,656 @@
+/* The standard CSS for doxygen */
+
+body, table, div, p, dl {
+	font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
+	font-size: 12px;
+}
+
+/* @group Heading Levels */
+
+h1 {
+	font-size: 150%;
+}
+
+h2 {
+	font-size: 120%;
+}
+
+h3 {
+	font-size: 100%;
+}
+
+dt {
+	font-weight: bold;
+}
+
+div.multicol {
+	-moz-column-gap: 1em;
+	-webkit-column-gap: 1em;
+	-moz-column-count: 3;
+	-webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+	margin-top: 2px;
+}
+
+p.endli {
+	margin-bottom: 0px;
+}
+
+p.enddd {
+	margin-bottom: 4px;
+}
+
+p.endtd {
+	margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+	font-weight: bold;
+}
+
+span.legend {
+        font-size: 70%;
+        text-align: center;
+}
+
+h3.version {
+        font-size: 90%;
+        text-align: center;
+}
+
+div.qindex, div.navtab{
+	background-color: #EBEFF6;
+	border: 1px solid #A3B4D7;
+	text-align: center;
+	margin: 2px;
+	padding: 2px;
+}
+
+div.qindex, div.navpath {
+	width: 100%;
+	line-height: 140%;
+}
+
+div.navtab {
+	margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+	color: #3D578C;
+	font-weight: normal;
+	text-decoration: none;
+}
+
+.contents a:visited {
+	color: #4665A2;
+}
+
+a:hover {
+	text-decoration: underline;
+}
+
+a.qindex {
+	font-weight: bold;
+}
+
+a.qindexHL {
+	font-weight: bold;
+	background-color: #9CAFD4;
+	color: #ffffff;
+	border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+        color: #ffffff;
+}
+
+a.el {
+	font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code {
+	color: #4665A2;
+}
+
+a.codeRef {
+	color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+	margin-left: -1cm;
+}
+
+.fragment {
+	font-family: monospace, fixed;
+	font-size: 105%;
+}
+
+pre.fragment {
+	border: 1px solid #C4CFE5;
+	background-color: #FBFCFD;
+	padding: 4px 6px;
+	margin: 4px 8px 4px 2px;
+	overflow: auto;
+	word-wrap: break-word;
+	font-size:  9pt;
+	line-height: 125%;
+}
+
+div.ah {
+	background-color: black;
+	font-weight: bold;
+	color: #ffffff;
+	margin-bottom: 3px;
+	margin-top: 3px;
+	padding: 0.2em;
+	border: solid thin #333;
+	border-radius: 0.5em;
+	-webkit-border-radius: .5em;
+	-moz-border-radius: .5em;
+	-webkit-box-shadow: 2px 2px 3px #999;
+	-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+	background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+	background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+	margin-left: 16px;
+	margin-top: 12px;
+	margin-bottom: 6px;
+	font-weight: bold;
+}
+
+div.groupText {
+	margin-left: 16px;
+	font-style: italic;
+}
+
+body {
+	background: white;
+	color: black;
+        margin: 0;
+}
+
+div.contents {
+	margin-top: 10px;
+	margin-left: 10px;
+	margin-right: 10px;
+}
+
+td.indexkey {
+	background-color: #EBEFF6;
+	font-weight: bold;
+	border: 1px solid #C4CFE5;
+	margin: 2px 0px 2px 0;
+	padding: 2px 10px;
+}
+
+td.indexvalue {
+	background-color: #EBEFF6;
+	border: 1px solid #C4CFE5;
+	padding: 2px 10px;
+	margin: 2px 0px;
+}
+
+tr.memlist {
+	background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+	text-align: center;
+}
+
+img.formulaDsp {
+	
+}
+
+img.formulaInl {
+	vertical-align: middle;
+}
+
+div.center {
+	text-align: center;
+        margin-top: 0px;
+        margin-bottom: 0px;
+        padding: 0px;
+}
+
+div.center img {
+	border: 0px;
+}
+
+address.footer {
+	text-align: right;
+	padding-right: 12px;
+}
+
+img.footer {
+	border: 0px;
+	vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+	color: #008000
+}
+
+span.keywordtype {
+	color: #604020
+}
+
+span.keywordflow {
+	color: #e08000
+}
+
+span.comment {
+	color: #800000
+}
+
+span.preprocessor {
+	color: #806020
+}
+
+span.stringliteral {
+	color: #002080
+}
+
+span.charliteral {
+	color: #008080
+}
+
+span.vhdldigit { 
+	color: #ff00ff 
+}
+
+span.vhdlchar { 
+	color: #000000 
+}
+
+span.vhdlkeyword { 
+	color: #700070 
+}
+
+span.vhdllogic { 
+	color: #ff0000 
+}
+
+/* @end */
+
+/*
+.search {
+	color: #003399;
+	font-weight: bold;
+}
+
+form.search {
+	margin-bottom: 0px;
+	margin-top: 0px;
+}
+
+input.search {
+	font-size: 75%;
+	color: #000080;
+	font-weight: normal;
+	background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+	font-size: 75%;
+}
+
+.dirtab {
+	padding: 4px;
+	border-collapse: collapse;
+	border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+	background: #EBEFF6;
+	font-weight: bold;
+}
+
+hr {
+	height: 0px;
+	border: none;
+	border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+	height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+	border-spacing: 0px;
+	padding: 0px;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+	background-color: #F9FAFC;
+	border: none;
+	margin: 4px;
+	padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+	padding: 0px 8px 4px 8px;
+	color: #555;
+}
+
+.memItemLeft, .memItemRight, .memTemplParams {
+	border-top: 1px solid #C4CFE5;
+}
+
+.memItemLeft, .memTemplItemLeft {
+        white-space: nowrap;
+}
+
+.memTemplParams {
+	color: #4665A2;
+        white-space: nowrap;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+	font-size: 80%;
+	color: #4665A2;
+	font-weight: normal;
+	margin-left: 3px;
+}
+
+.memnav {
+	background-color: #EBEFF6;
+	border: 1px solid #A3B4D7;
+	text-align: center;
+	margin: 2px;
+	margin-right: 15px;
+	padding: 2px;
+}
+
+.memitem {
+	padding: 0;
+	margin-bottom: 10px;
+}
+
+.memname {
+        white-space: nowrap;
+        font-weight: bold;
+        margin-left: 6px;
+}
+
+.memproto {
+        border-top: 1px solid #A8B8D9;
+        border-left: 1px solid #A8B8D9;
+        border-right: 1px solid #A8B8D9;
+        padding: 6px 0px 6px 0px;
+        color: #253555;
+        font-weight: bold;
+        text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+        /* firefox specific markup */
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        -moz-border-radius-topright: 8px;
+        -moz-border-radius-topleft: 8px;
+        /* webkit specific markup */
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        -webkit-border-top-right-radius: 8px;
+        -webkit-border-top-left-radius: 8px;
+        background-image:url('nav_f.png');
+        background-repeat:repeat-x;
+        background-color: #E2E8F2;
+
+}
+
+.memdoc {
+        border-bottom: 1px solid #A8B8D9;      
+        border-left: 1px solid #A8B8D9;      
+        border-right: 1px solid #A8B8D9; 
+        padding: 2px 5px;
+        background-color: #FBFCFD;
+        border-top-width: 0;
+        /* firefox specific markup */
+        -moz-border-radius-bottomleft: 8px;
+        -moz-border-radius-bottomright: 8px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7);
+        /* webkit specific markup */
+        -webkit-border-bottom-left-radius: 8px;
+        -webkit-border-bottom-right-radius: 8px;
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7));
+}
+
+.paramkey {
+	text-align: right;
+}
+
+.paramtype {
+	white-space: nowrap;
+}
+
+.paramname {
+	color: #602020;
+	white-space: nowrap;
+}
+.paramname em {
+	font-style: normal;
+}
+
+/* @end */
+
+/* @group Directory (tree) */
+
+/* for the tree view */
+
+.ftvtree {
+	font-family: sans-serif;
+	margin: 0px;
+}
+
+/* these are for tree view when used as main index */
+
+.directory {
+	font-size: 9pt;
+	font-weight: bold;
+	margin: 5px;
+}
+
+.directory h3 {
+	margin: 0px;
+	margin-top: 1em;
+	font-size: 11pt;
+}
+
+/*
+The following two styles can be used to replace the root node title
+with an image of your choice.  Simply uncomment the next two styles,
+specify the name of your image and be sure to set 'height' to the
+proper pixel height of your image.
+*/
+
+/*
+.directory h3.swap {
+	height: 61px;
+	background-repeat: no-repeat;
+	background-image: url("yourimage.gif");
+}
+.directory h3.swap span {
+	display: none;
+}
+*/
+
+.directory > h3 {
+	margin-top: 0;
+}
+
+.directory p {
+	margin: 0px;
+	white-space: nowrap;
+}
+
+.directory div {
+	display: none;
+	margin: 0px;
+}
+
+.directory img {
+	vertical-align: -30%;
+}
+
+/* these are for tree view when not used as main index */
+
+.directory-alt {
+	font-size: 100%;
+	font-weight: bold;
+}
+
+.directory-alt h3 {
+	margin: 0px;
+	margin-top: 1em;
+	font-size: 11pt;
+}
+
+.directory-alt > h3 {
+	margin-top: 0;
+}
+
+.directory-alt p {
+	margin: 0px;
+	white-space: nowrap;
+}
+
+.directory-alt div {
+	display: none;
+	margin: 0px;
+}
+
+.directory-alt img {
+	vertical-align: -30%;
+}
+
+/* @end */
+
+div.dynheader {
+        margin-top: 8px;
+}
+
+address {
+	font-style: normal;
+	color: #2A3D61;
+}
+
+table.doxtable {
+	border-collapse:collapse;
+}
+
+table.doxtable td, table.doxtable th {
+	border: 1px solid #2D4068;
+	padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+	background-color: #374F7F;
+	color: #FFFFFF;
+	font-size: 110%;
+	padding-bottom: 4px;
+	padding-top: 5px;
+	text-align:left;
+}
+
+.tabsearch {
+	top: 0px;
+	left: 10px;
+	height: 36px;
+	background-image: url('tab_b.png');
+	z-index: 101;
+	overflow: hidden;
+	font-size: 13px;
+}
+
+.navpath ul
+{
+	font-size: 11px;
+	background-image:url('tab_b.png');
+	background-repeat:repeat-x;
+	height:30px;
+	line-height:30px;
+	color:#8AA0CC;
+	border:solid 1px #C2CDE4;
+	overflow:hidden;
+	margin:0px;
+	padding:0px;
+}
+
+.navpath li
+{
+	list-style-type:none;
+	float:left;
+	padding-left:10px;
+	padding-right: 15px;
+	background-image:url('bc_s.png');
+	background-repeat:no-repeat;
+	background-position:right;
+	color:#364D7C;
+}
+
+.navpath a
+{
+	height:32px;
+	display:block;
+	text-decoration: none;
+	outline: none;
+}
+
+.navpath a:hover
+{
+	color:#6884BD;
+}
+
+div.summary
+{
+	float: right;
+	font-size: 8pt;
+	padding-right: 5px;
+	width: 50%;
+	text-align: right;
+}       
+
+div.summary a
+{
+	white-space: nowrap;
+}
+
+div.header
+{
+        background-image:url('nav_h.png');
+        background-repeat:repeat-x;
+	background-color: #F9FAFC;
+	margin:  0px;
+	border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+	padding: 5px 5px 5px 10px;
+}
+
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/doxygen.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/doxygen.png
new file mode 100644
index 00000000..635ed52f
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/doxygen.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/english_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/english_8php.html
new file mode 100644
index 00000000..1470bcb9
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/english_8php.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/english.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>CAS/languages/english.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="english_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">$this&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="english_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<dl class="author"><dt><b>Author:</b></dt><dd>Pascal Aubry &lt;pascal.aubry at univ-rennes1.fr&gt; </dd></dl>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__internalLang.html">Internationalization </a> </dd></dl>
+
+<p>Definition in file <a class="el" href="english_8php_source.html">english.php</a>.</p>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="a3e2715c2e334fb91d34437e4ff025f1f"></a><!-- doxytag: member="english.php::_strings" ref="a3e2715c2e334fb91d34437e4ff025f1f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$this <a class="el" href="spanish_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<b>Initial value:</b><div class="fragment"><pre class="fragment"> array(
+<a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a>
+=&gt; <span class="stringliteral">&#39;using server&#39;</span>,
+<a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a>
+=&gt; <span class="stringliteral">&#39;CAS Authentication wanted!&#39;</span>,
+<a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a>
+=&gt; <span class="stringliteral">&#39;CAS logout wanted!&#39;</span>,
+<a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a>
+=&gt; <span class="stringliteral">&#39;You should already have been redirected to the CAS server. Click &lt;a href=&quot;%s&quot;&gt;here&lt;/a&gt; to continue.&#39;</span>,
+<a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a>
+=&gt; <span class="stringliteral">&#39;CAS Authentication failed!&#39;</span>,
+<a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a>
+=&gt; <span class="stringliteral">&#39;&lt;p&gt;You were not authenticated.&lt;/p&gt;&lt;p&gt;You may submit your request again by clicking &lt;a href=&quot;%s&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If the problem persists, you may contact &lt;a href=&quot;mailto:%s&quot;&gt;the administrator of this site&lt;/a&gt;.&lt;/p&gt;&#39;</span>,
+<a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>
+=&gt; <span class="stringliteral">&#39;The service `&lt;b&gt;%s&lt;/b&gt;\&#39; is not available (&lt;b&gt;%s&lt;/b&gt;).&#39;</span>
+)
+</pre></div>
+<p>Definition at line <a class="el" href="english_8php_source.html#l00010">10</a> of file <a class="el" href="english_8php_source.html">english.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/english_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/english_8php_source.html
new file mode 100644
index 00000000..def956f2
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/english_8php_source.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/english.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/languages/english.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="english_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 
+<a name="l00010"></a><a class="code" href="english_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">00010</a> $this-&gt;<a class="code" href="catalan_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a> = array(
+<a name="l00011"></a>00011 <a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a>
+<a name="l00012"></a>00012 =&gt; <span class="stringliteral">&#39;using server&#39;</span>,
+<a name="l00013"></a>00013 <a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a>
+<a name="l00014"></a>00014 =&gt; <span class="stringliteral">&#39;CAS Authentication wanted!&#39;</span>,
+<a name="l00015"></a>00015 <a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a>
+<a name="l00016"></a>00016 =&gt; <span class="stringliteral">&#39;CAS logout wanted!&#39;</span>,
+<a name="l00017"></a>00017 <a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a>
+<a name="l00018"></a>00018 =&gt; <span class="stringliteral">&#39;You should already have been redirected to the CAS server. Click &lt;a href=&quot;%s&quot;&gt;here&lt;/a&gt; to continue.&#39;</span>,
+<a name="l00019"></a>00019 <a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a>
+<a name="l00020"></a>00020 =&gt; <span class="stringliteral">&#39;CAS Authentication failed!&#39;</span>,
+<a name="l00021"></a>00021 <a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a>
+<a name="l00022"></a>00022 =&gt; <span class="stringliteral">&#39;&lt;p&gt;You were not authenticated.&lt;/p&gt;&lt;p&gt;You may submit your request again by clicking &lt;a href=&quot;%s&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If the problem persists, you may contact &lt;a href=&quot;mailto:%s&quot;&gt;the administrator of this site&lt;/a&gt;.&lt;/p&gt;&#39;</span>,
+<a name="l00023"></a>00023 <a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>
+<a name="l00024"></a>00024 =&gt; <span class="stringliteral">&#39;The service `&lt;b&gt;%s&lt;/b&gt;\&#39; is not available (&lt;b&gt;%s&lt;/b&gt;).&#39;</span>
+<a name="l00025"></a>00025 );
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__advanced__saml11_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__advanced__saml11_8php.html
new file mode 100644
index 00000000..4482432c
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__advanced__saml11_8php.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_advanced_saml11.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_advanced_saml11.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__advanced__saml11_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__advanced__saml11_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__advanced__saml11_8php_source.html
new file mode 100644
index 00000000..f32fea68
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__advanced__saml11_8php_source.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_advanced_saml11.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_advanced_saml11.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__advanced__saml11_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Advanced example for SAML with attributes and single logout</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#gaa6440870ffb0a81c5403ac10faa25f33">SAML_VERSION_1_1</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <a class="code" href="group__publicAuth.html#gac7c2da957fdd437f1e23147f83daffcb">phpCAS::setCasServerCACert</a>(<a class="code" href="config_8php.html#a18552b2559a8de847b82b43b94adf047">$cas_server_ca_cert_path</a>);
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <span class="comment">// phpCAS::setNoCasServerValidation();</span>
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// Handle SAML logout requests that emanate from the CAS host exclusively.</span>
+<a name="l00025"></a>00025 <span class="comment">// Failure to restrict SAML logout requests to authorized hosts could</span>
+<a name="l00026"></a>00026 <span class="comment">// allow denial of service attacks where at the least the server is</span>
+<a name="l00027"></a>00027 <span class="comment">// tied up parsing bogus XML messages.</span>
+<a name="l00028"></a>00028 <a class="code" href="group__publicAuth.html#ga33a0cf0299f96e23893ce4ff6cc76584">phpCAS::handleLogoutRequests</a>(<span class="keyword">true</span>, <a class="code" href="config_8php.html#a636310976f993bc089ccc97652a28f28">$cas_real_hosts</a>);
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030 <span class="comment">// Force CAS authentication on any page that includes this file</span>
+<a name="l00031"></a>00031 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033 ?&gt;
+<a name="l00034"></a>00034 &lt;h2&gt;Secure Page&lt;/h2&gt;
+<a name="l00035"></a>00035 &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+<a name="l00036"></a>00036 
+<a name="l00037"></a>00037 Authentication succeeded <span class="keywordflow">for</span> user
+<a name="l00038"></a>00038 &lt;strong&gt;&lt;?php echo <a class="code" href="group__publicAuth.html#ga4c9f984b474b550cf316396e87670b18">phpCAS::getUser</a>(); ?&gt;&lt;/strong&gt;.
+<a name="l00039"></a>00039 
+<a name="l00040"></a>00040 &lt;h3&gt;User Attributes&lt;/h3&gt;
+<a name="l00041"></a>00041 &lt;ul&gt;
+<a name="l00042"></a>00042 &lt;?php
+<a name="l00043"></a>00043 <span class="keywordflow">foreach</span> (<a class="code" href="group__publicAuth.html#ga9972fbb286fe7e8d726b2e776b150233">phpCAS::getAttributes</a>() as $key =&gt; $value) {
+<a name="l00044"></a>00044 <span class="keywordflow">if</span> (is_array($value)) {
+<a name="l00045"></a>00045 echo <span class="stringliteral">&#39;&lt;li&gt;&#39;</span>, $key, <span class="stringliteral">&#39;:&lt;ol&gt;&#39;</span>;
+<a name="l00046"></a>00046 <span class="keywordflow">foreach</span>($value as $item) {
+<a name="l00047"></a>00047       echo <span class="stringliteral">&#39;&lt;li&gt;&lt;strong&gt;&#39;</span>, $item, <span class="stringliteral">&#39;&lt;/strong&gt;&lt;/li&gt;&#39;</span>;
+<a name="l00048"></a>00048     }
+<a name="l00049"></a>00049 echo <span class="stringliteral">&#39;&lt;/ol&gt;&lt;/li&gt;&#39;</span>;
+<a name="l00050"></a>00050 } <span class="keywordflow">else</span> {
+<a name="l00051"></a>00051     echo <span class="stringliteral">&#39;&lt;li&gt;&#39;</span>, $key, <span class="stringliteral">&#39;: &lt;strong&gt;&#39;</span>, $value, <span class="stringliteral">&#39;&lt;/strong&gt;&lt;/li&gt;&#39;</span>;
+<a name="l00052"></a>00052   }
+<a name="l00053"></a>00053 }
+<a name="l00054"></a>00054 ?&gt;
+<a name="l00055"></a>00055 &lt;/ul&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__custom__urls_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__custom__urls_8php.html
new file mode 100644
index 00000000..6e2fee3a
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__custom__urls_8php.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_custom_urls.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_custom_urls.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__custom__urls_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__custom__urls_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__custom__urls_8php_source.html
new file mode 100644
index 00000000..184288e5
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__custom__urls_8php_source.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_custom_urls.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_custom_urls.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__custom__urls_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example for overriding validation urls</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 
+<a name="l00025"></a>00025 <span class="comment">// Override the validation url for any (ST and PT) CAS 2.0 validation</span>
+<a name="l00026"></a>00026 <a class="code" href="group__publicAuth.html#ga11d1c13ed3d5008984ef5999a9389104">phpCAS::setServerProxyValidateURL</a>(<span class="stringliteral">&#39;https://sso.hrz.tu-darmstadt.de:1443/proxyValidate&#39;</span>);
+<a name="l00027"></a>00027 <span class="comment">// Override the validation url for any CAS 1.0 validation</span>
+<a name="l00028"></a>00028 <span class="comment">//phpCAS::setServerServiceValidateURL(&#39;https://sso.hrz.tu-darmstadt.de:1443/serviceValidate&#39;);</span>
+<a name="l00029"></a>00029 <span class="comment">//Override the validation url for any SAML11 validation</span>
+<a name="l00030"></a>00030 <span class="comment">//phpCAS::setServerSamlValidateURL(&#39;https://sso.hrz.tu-darmstadt.de:1443/samlValidate&#39;);</span>
+<a name="l00031"></a>00031 
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033 <span class="comment">// force CAS authentication</span>
+<a name="l00034"></a>00034 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00035"></a>00035 
+<a name="l00036"></a>00036 <span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<a name="l00037"></a>00037 <span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+<a name="l00038"></a>00038 
+<a name="l00039"></a>00039 <span class="comment">// logout if desired</span>
+<a name="l00040"></a>00040 <span class="keywordflow">if</span> (isset($_REQUEST[<span class="stringliteral">&#39;logout&#39;</span>])) {
+<a name="l00041"></a>00041         <a class="code" href="group__publicAuth.html#ga9989272833c5170c3b7c7027beab795b">phpCAS::logout</a>();
+<a name="l00042"></a>00042 }
+<a name="l00043"></a>00043 
+<a name="l00044"></a>00044 <span class="comment">// for this test, simply print that the authentication was successfull</span>
+<a name="l00045"></a>00045 ?&gt;
+<a name="l00046"></a>00046 &lt;html&gt;
+<a name="l00047"></a>00047   &lt;head&gt;
+<a name="l00048"></a>00048     &lt;title&gt;<a class="code" href="classphpCAS.html">phpCAS</a> simple client&lt;/title&gt;
+<a name="l00049"></a>00049   &lt;/head&gt;
+<a name="l00050"></a>00050   &lt;body&gt;
+<a name="l00051"></a>00051     &lt;h1&gt;Successfull Authentication!&lt;/h1&gt;
+<a name="l00052"></a>00052     &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+<a name="l00053"></a>00053     &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00054"></a>00054 <span class="stringliteral">    &lt;p&gt;phpCAS version is &lt;b&gt;&lt;?php echo phpCAS::getVersion(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00055"></a>00055 <span class="stringliteral">    &lt;p&gt;&lt;a href=&quot;?logout=&quot;&gt;Logout&lt;/a&gt;&lt;/p&gt;</span>
+<a name="l00056"></a>00056 <span class="stringliteral">  &lt;/body&gt;</span>
+<a name="l00057"></a>00057 <span class="stringliteral">&lt;/html&gt;</span>
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__gateway_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__gateway_8php.html
new file mode 100644
index 00000000..b6f21121
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__gateway_8php.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_gateway.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>docs/examples/example_gateway.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__gateway_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">if(isset($_REQUEST['logout'])) <br class="typebreak"/>
+if(isset($_REQUEST['login']))&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a> = phpCAS::checkAuthentication()</td></tr>
+</table>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="ac04d7c68e6cc24979a835aeb3b238a91"></a><!-- doxytag: member="example_gateway.php::$auth" ref="ac04d7c68e6cc24979a835aeb3b238a91" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">if (isset($_REQUEST['logout'])) if (isset($_REQUEST['login'])) $auth = phpCAS::checkAuthentication()</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__gateway_8php-example.html#a9">example_gateway.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="example__gateway_8php_source.html#l00032">32</a> of file <a class="el" href="example__gateway_8php_source.html">example_gateway.php</a>.</p>
+
+<p>Referenced by <a class="el" href="CAS_8php_source.html#l01045">phpCAS::checkAuthentication()</a>, <a class="el" href="CAS_8php_source.html#l01073">phpCAS::forceAuthentication()</a>, and <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__gateway_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__gateway_8php_source.html
new file mode 100644
index 00000000..7704ec24
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__gateway_8php_source.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_gateway.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_gateway.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__gateway_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example that uses the CAS gateway feature</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="keywordflow">if</span> (isset($_REQUEST[<span class="stringliteral">&#39;logout&#39;</span>])) {
+<a name="l00025"></a>00025   <a class="code" href="group__publicAuth.html#ga9989272833c5170c3b7c7027beab795b">phpCAS::logout</a>();
+<a name="l00026"></a>00026 }
+<a name="l00027"></a>00027 <span class="keywordflow">if</span> (isset($_REQUEST[<span class="stringliteral">&#39;login&#39;</span>])) {
+<a name="l00028"></a>00028   <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00029"></a>00029 }
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 <span class="comment">// check CAS authentication</span>
+<a name="l00032"></a><a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">00032</a> <a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a> = <a class="code" href="group__publicAuth.html#ga21fd1c2665d2e21c03e6a6dd1860cf4d">phpCAS::checkAuthentication</a>();
+<a name="l00033"></a>00033 
+<a name="l00034"></a>00034 ?&gt;
+<a name="l00035"></a>00035 &lt;html&gt;
+<a name="l00036"></a>00036   &lt;head&gt;
+<a name="l00037"></a>00037     &lt;title&gt;<a class="code" href="classphpCAS.html">phpCAS</a> simple client&lt;/title&gt;
+<a name="l00038"></a>00038   &lt;/head&gt;
+<a name="l00039"></a>00039   &lt;body&gt;
+<a name="l00040"></a>00040 &lt;?php
+<a name="l00041"></a>00041 <span class="keywordflow">if</span> (<a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a>) {
+<a name="l00042"></a>00042   <span class="comment">// for this test, simply print that the authentication was successfull</span>
+<a name="l00043"></a>00043 ?&gt;
+<a name="l00044"></a>00044     &lt;h1&gt;Successfull Authentication!&lt;/h1&gt;
+<a name="l00045"></a>00045     &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+<a name="l00046"></a>00046     &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00047"></a>00047 <span class="stringliteral">    &lt;p&gt;&lt;a href=&quot;?logout=&quot;&gt;Logout&lt;/a&gt;&lt;/p&gt;</span>
+<a name="l00048"></a>00048 <span class="stringliteral">&lt;?php</span>
+<a name="l00049"></a>00049 <span class="stringliteral">} else {</span>
+<a name="l00050"></a>00050 <span class="stringliteral">?&gt;</span>
+<a name="l00051"></a>00051 <span class="stringliteral">    &lt;h1&gt;Guest mode&lt;/h1&gt;</span>
+<a name="l00052"></a>00052 <span class="stringliteral">    &lt;p&gt;&lt;a href=&quot;?login=&quot;&gt;Login&lt;/a&gt;&lt;/p&gt;</span>
+<a name="l00053"></a>00053 <span class="stringliteral">&lt;?php</span>
+<a name="l00054"></a>00054 <span class="stringliteral">}</span>
+<a name="l00055"></a>00055 <span class="stringliteral">?&gt;</span>
+<a name="l00056"></a>00056 <span class="stringliteral">    &lt;p&gt;phpCAS version is &lt;b&gt;&lt;?php echo phpCAS::getVersion(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00057"></a>00057 <span class="stringliteral">  &lt;/body&gt;</span>
+<a name="l00058"></a>00058 <span class="stringliteral">&lt;/html&gt;</span>
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__html_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__html_8php.html
new file mode 100644
index 00000000..6938680d
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__html_8php.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_html.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_html.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__html_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__html_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__html_8php_source.html
new file mode 100644
index 00000000..5eb54677
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__html_8php_source.html
@@ -0,0 +1,101 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_html.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_html.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__html_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example that changes html of phpcas messages</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// customize HTML output</span>
+<a name="l00025"></a>00025 <a class="code" href="group__publicOutput.html#ga9beb490d4e355f131998f1a73c9d6065">phpCAS::setHTMLHeader</a>(<span class="stringliteral">&#39;</span>
+<a name="l00026"></a>00026 <span class="stringliteral">&lt;html&gt;</span>
+<a name="l00027"></a>00027 <span class="stringliteral">  &lt;head&gt;</span>
+<a name="l00028"></a>00028 <span class="stringliteral">    &lt;title&gt;__TITLE__&lt;/title&gt;</span>
+<a name="l00029"></a>00029 <span class="stringliteral">  &lt;/head&gt;</span>
+<a name="l00030"></a>00030 <span class="stringliteral">  &lt;body&gt;</span>
+<a name="l00031"></a>00031 <span class="stringliteral">  &lt;h1&gt;__TITLE__&lt;/h1&gt;</span>
+<a name="l00032"></a>00032 <span class="stringliteral">&#39;</span>);
+<a name="l00033"></a>00033 <a class="code" href="group__publicOutput.html#ga166cd942019d96ef8b4504f2bfb9effd">phpCAS::setHTMLFooter</a>(<span class="stringliteral">&#39;</span>
+<a name="l00034"></a>00034 <span class="stringliteral">    &lt;hr&gt;</span>
+<a name="l00035"></a>00035 <span class="stringliteral">    &lt;address&gt;</span>
+<a name="l00036"></a>00036 <span class="stringliteral">      phpCAS __PHPCAS_VERSION__, </span>
+<a name="l00037"></a>00037 <span class="stringliteral">      CAS __CAS_VERSION__ (__SERVER_BASE_URL__)</span>
+<a name="l00038"></a>00038 <span class="stringliteral">    &lt;/address&gt;</span>
+<a name="l00039"></a>00039 <span class="stringliteral">  &lt;/body&gt;</span>
+<a name="l00040"></a>00040 <span class="stringliteral">&lt;/html&gt;</span>
+<a name="l00041"></a>00041 <span class="stringliteral">&#39;</span>);
+<a name="l00042"></a>00042 
+<a name="l00043"></a>00043 
+<a name="l00044"></a>00044 <span class="comment">// force CAS authentication</span>
+<a name="l00045"></a>00045 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00046"></a>00046 
+<a name="l00047"></a>00047 <span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<a name="l00048"></a>00048 <span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+<a name="l00049"></a>00049 
+<a name="l00050"></a>00050 <span class="comment">// for this test, simply print that the authentication was successfull</span>
+<a name="l00051"></a>00051 ?&gt;
+<a name="l00052"></a>00052 &lt;html&gt;
+<a name="l00053"></a>00053   &lt;head&gt;
+<a name="l00054"></a>00054     &lt;title&gt;<a class="code" href="classphpCAS.html">phpCAS</a> simple client with HTML output customization&lt;/title&gt;
+<a name="l00055"></a>00055   &lt;/head&gt;
+<a name="l00056"></a>00056   &lt;body&gt;
+<a name="l00057"></a>00057     &lt;h1&gt;Successfull Authentication!&lt;/h1&gt;
+<a name="l00058"></a>00058     &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+<a name="l00059"></a>00059     &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00060"></a>00060 <span class="stringliteral">    &lt;p&gt;phpCAS version is &lt;b&gt;&lt;?php echo phpCAS::getVersion(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00061"></a>00061 <span class="stringliteral">  &lt;/body&gt;</span>
+<a name="l00062"></a>00062 <span class="stringliteral">&lt;/html&gt;</span>
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__lang_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__lang_8php.html
new file mode 100644
index 00000000..c5a11c0a
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__lang_8php.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_lang.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_lang.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__lang_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__lang_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__lang_8php_source.html
new file mode 100644
index 00000000..b97c93c0
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__lang_8php_source.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_lang.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_lang.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__lang_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example that changes language of phpcas pages</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// set the language to french</span>
+<a name="l00025"></a>00025 <a class="code" href="group__publicLang.html#ga7eea67859bdfac8e89460a95f5bc961e">phpCAS::setLang</a>(<a class="code" href="group__publicLang.html#ga2625c23a266bd8018ac7ed2dd8bc592c">PHPCAS_LANG_FRENCH</a>);
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 <span class="comment">// force CAS authentication</span>
+<a name="l00028"></a>00028 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030 <span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<a name="l00031"></a>00031 <span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033 <span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<a name="l00034"></a>00034 <span class="comment">// permit to gain accesses to new services.</span>
+<a name="l00035"></a>00035 
+<a name="l00036"></a>00036 <span class="comment">// for this test, simply print that the authentication was successfull</span>
+<a name="l00037"></a>00037 ?&gt;
+<a name="l00038"></a>00038 &lt;html&gt;
+<a name="l00039"></a>00039   &lt;head&gt;
+<a name="l00040"></a>00040     &lt;title&gt;Exemple d<span class="stringliteral">&#39;internationalisation de phpCAS&lt;/title&gt;</span>
+<a name="l00041"></a>00041 <span class="stringliteral">  &lt;/head&gt;</span>
+<a name="l00042"></a>00042 <span class="stringliteral">  &lt;body&gt;</span>
+<a name="l00043"></a>00043 <span class="stringliteral">    &lt;h1&gt;Authentification r&amp;eacute;ussie&amp;nbsp;!&lt;/h1&gt;</span>
+<a name="l00044"></a>00044 <span class="stringliteral">    &lt;?php include &#39;</span>script_info.php<span class="stringliteral">&#39; ?&gt;</span>
+<a name="l00045"></a>00045 <span class="stringliteral">    &lt;p&gt;L&#39;</span>utilisateur connect&amp;eacute; est &lt;b&gt;&lt;?php echo <a class="code" href="group__publicAuth.html#ga4c9f984b474b550cf316396e87670b18">phpCAS::getUser</a>(); ?&gt;&lt;/b&gt;.&lt;/p&gt;
+<a name="l00046"></a>00046     &lt;p&gt;La version de <a class="code" href="classphpCAS.html">phpCAS</a> est &lt;b&gt;&lt;?php echo <a class="code" href="group__public.html#ga5c971143e0c319b1268233907ca193b9">phpCAS::getVersion</a>(); ?&gt;&lt;/b&gt;.&lt;/p&gt;
+<a name="l00047"></a>00047   &lt;/body&gt;
+<a name="l00048"></a>00048 &lt;/html&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__logout_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__logout_8php.html
new file mode 100644
index 00000000..d0622699
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__logout_8php.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_logout.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_logout.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__logout_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__logout_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__logout_8php_source.html
new file mode 100644
index 00000000..bb0f8af1
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__logout_8php_source.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_logout.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_logout.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__logout_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example for handling logout requests</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// handle incoming logout requests</span>
+<a name="l00025"></a>00025 <a class="code" href="group__publicAuth.html#ga33a0cf0299f96e23893ce4ff6cc76584">phpCAS::handleLogoutRequests</a>();
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 <span class="comment">// Or as an advanced featue handle SAML logout requests that emanate from the CAS host exclusively.</span>
+<a name="l00028"></a>00028 <span class="comment">// Failure to restrict SAML logout requests to authorized hosts could</span>
+<a name="l00029"></a>00029 <span class="comment">// allow denial of service attacks where at the least the server is</span>
+<a name="l00030"></a>00030 <span class="comment">// tied up parsing bogus XML messages.</span>
+<a name="l00031"></a>00031 <span class="comment">// phpCAS::handleLogoutRequests(true, $cas_real_hosts);</span>
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033 
+<a name="l00034"></a>00034 <span class="comment">// force CAS authentication</span>
+<a name="l00035"></a>00035 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00036"></a>00036 
+<a name="l00037"></a>00037 <span class="comment">// for this test, simply print that the authentication was successfull</span>
+<a name="l00038"></a>00038 ?&gt;
+<a name="l00039"></a>00039 &lt;html&gt;
+<a name="l00040"></a>00040   &lt;head&gt;
+<a name="l00041"></a>00041     &lt;title&gt;<a class="code" href="classphpCAS.html">phpCAS</a> simple client&lt;/title&gt;
+<a name="l00042"></a>00042   &lt;/head&gt;
+<a name="l00043"></a>00043   &lt;body&gt;
+<a name="l00044"></a>00044     &lt;h1&gt;Successfull Authentication!&lt;/h1&gt;
+<a name="l00045"></a>00045     &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+<a name="l00046"></a>00046     &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00047"></a>00047 <span class="stringliteral">    &lt;p&gt;phpCAS version is &lt;b&gt;&lt;?php echo phpCAS::getVersion(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00048"></a>00048 <span class="stringliteral">  &lt;/body&gt;</span>
+<a name="l00049"></a>00049 <span class="stringliteral">&lt;/html&gt;</span>
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__pgt__storage__db_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__pgt__storage__db_8php.html
new file mode 100644
index 00000000..01707587
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__pgt__storage__db_8php.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_pgt_storage_db.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_pgt_storage_db.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__pgt__storage__db_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__pgt__storage__db_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__pgt__storage__db_8php_source.html
new file mode 100644
index 00000000..19999d53
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__pgt__storage__db_8php_source.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_pgt_storage_db.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_pgt_storage_db.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__pgt__storage__db_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example that changes the storage of the pgt tickets</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS::proxy</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// set PGT storage to file in plain format in the same directory as session files</span>
+<a name="l00025"></a>00025 phpCAS::setPGTStorageDB(<a class="code" href="config_8php.html#a1fa3127fc82f96b1436d871ef02be319">$db</a>,<a class="code" href="config_8php.html#a6a2ff59abacecba75a151826de414a27">$db_user</a>,<a class="code" href="config_8php.html#a2962c2bda65ca19dd4dd12d7160f1bf8">$db_password</a>,<a class="code" href="config_8php.html#a4593d4f8d59e41d620062617d48414e7">$db_table</a>);
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 <span class="comment">// force CAS authentication</span>
+<a name="l00028"></a>00028 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030 <span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<a name="l00031"></a>00031 <span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033 <span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<a name="l00034"></a>00034 <span class="comment">// permit to gain accesses to new services.</span>
+<a name="l00035"></a>00035 
+<a name="l00036"></a>00036 ?&gt;
+<a name="l00037"></a>00037 &lt;html&gt;
+<a name="l00038"></a>00038   &lt;head&gt;
+<a name="l00039"></a>00039     &lt;title&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxy example with PGT storage to a database&lt;/title&gt;
+<a name="l00040"></a>00040     &lt;link rel=<span class="stringliteral">&quot;stylesheet&quot;</span> type=<span class="stringliteral">&#39;text/css&#39;</span> href=<span class="stringliteral">&#39;example.css&#39;</span>/&gt;
+<a name="l00041"></a>00041   &lt;/head&gt;
+<a name="l00042"></a>00042   &lt;body&gt;
+<a name="l00043"></a>00043     &lt;h1&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxy example with PGT storage to file&lt;/h1&gt;
+<a name="l00044"></a>00044     &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+<a name="l00045"></a>00045     &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00046"></a>00046 <span class="stringliteral">    &lt;h2&gt;Response from service &lt;?php echo $serviceUrl; ?&gt;&lt;/h2&gt;</span>
+<a name="l00047"></a>00047 <span class="stringliteral">&lt;?php</span>
+<a name="l00048"></a>00048 <span class="stringliteral">  flush();</span>
+<a name="l00049"></a>00049 <span class="stringliteral">  // call a service and change the color depending on the result</span>
+<a name="l00050"></a>00050 <span class="stringliteral">  if ( phpCAS::serviceWeb($serviceUrl,$err_code,$output) ) {</span>
+<a name="l00051"></a>00051 <span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;success&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00052"></a>00052 <span class="stringliteral">  } else {</span>
+<a name="l00053"></a>00053 <span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00054"></a>00054 <span class="stringliteral">  }</span>
+<a name="l00055"></a>00055 <span class="stringliteral">  echo $output;</span>
+<a name="l00056"></a>00056 <span class="stringliteral">  echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00057"></a>00057 <span class="stringliteral">?&gt;</span>
+<a name="l00058"></a>00058 <span class="stringliteral">  &lt;/body&gt;</span>
+<a name="l00059"></a>00059 <span class="stringliteral">&lt;/html&gt;</span>
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__pgt__storage__file_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__pgt__storage__file_8php.html
new file mode 100644
index 00000000..14b1489f
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__pgt__storage__file_8php.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_pgt_storage_file.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_pgt_storage_file.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__pgt__storage__file_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__pgt__storage__file_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__pgt__storage__file_8php_source.html
new file mode 100644
index 00000000..d394a08b
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__pgt__storage__file_8php_source.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_pgt_storage_file.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_pgt_storage_file.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__pgt__storage__file_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example that changes the storage of the pgt tickets</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS::proxy</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// set PGT storage to file in plain format in the same directory as session files</span>
+<a name="l00025"></a>00025 <a class="code" href="group__publicPGTStorage.html#gafad174fa82241a2d6aef2d7be15fa387">phpCAS::setPGTStorageFile</a>(<span class="stringliteral">&#39;plain&#39;</span>,session_save_path());
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 <span class="comment">// force CAS authentication</span>
+<a name="l00028"></a>00028 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030 <span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<a name="l00031"></a>00031 <span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033 <span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<a name="l00034"></a>00034 <span class="comment">// permit to gain accesses to new services.</span>
+<a name="l00035"></a>00035 
+<a name="l00036"></a>00036 ?&gt;
+<a name="l00037"></a>00037 &lt;html&gt;
+<a name="l00038"></a>00038   &lt;head&gt;
+<a name="l00039"></a>00039     &lt;title&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxy example with PGT storage to file&lt;/title&gt;
+<a name="l00040"></a>00040     &lt;link rel=<span class="stringliteral">&quot;stylesheet&quot;</span> type=<span class="stringliteral">&#39;text/css&#39;</span> href=<span class="stringliteral">&#39;example.css&#39;</span>/&gt;
+<a name="l00041"></a>00041   &lt;/head&gt;
+<a name="l00042"></a>00042   &lt;body&gt;
+<a name="l00043"></a>00043     &lt;h1&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxy example with PGT storage to file&lt;/h1&gt;
+<a name="l00044"></a>00044     &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+<a name="l00045"></a>00045     &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00046"></a>00046 <span class="stringliteral">    &lt;h2&gt;Response from service &lt;?php echo $serviceUrl; ?&gt;&lt;/h2&gt;</span>
+<a name="l00047"></a>00047 <span class="stringliteral">&lt;?php</span>
+<a name="l00048"></a>00048 <span class="stringliteral">  flush();</span>
+<a name="l00049"></a>00049 <span class="stringliteral">  // call a service and change the color depending on the result</span>
+<a name="l00050"></a>00050 <span class="stringliteral">  if ( phpCAS::serviceWeb($serviceUrl,$err_code,$output) ) {</span>
+<a name="l00051"></a>00051 <span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;success&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00052"></a>00052 <span class="stringliteral">  } else {</span>
+<a name="l00053"></a>00053 <span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00054"></a>00054 <span class="stringliteral">  }</span>
+<a name="l00055"></a>00055 <span class="stringliteral">  echo $output;</span>
+<a name="l00056"></a>00056 <span class="stringliteral">  echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00057"></a>00057 <span class="stringliteral">?&gt;</span>
+<a name="l00058"></a>00058 <span class="stringliteral">  &lt;/body&gt;</span>
+<a name="l00059"></a>00059 <span class="stringliteral">&lt;/html&gt;</span>
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__GET_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__GET_8php.html
new file mode 100644
index 00000000..3e8209fc
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__GET_8php.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_proxy_GET.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_proxy_GET.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__proxy__GET_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__GET_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__GET_8php_source.html
new file mode 100644
index 00000000..5dadf7fc
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__GET_8php_source.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_proxy_GET.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_proxy_GET.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__proxy__GET_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example for a proxy that makes a GET request.</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS::proxy</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// force CAS authentication</span>
+<a name="l00025"></a>00025 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 <span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<a name="l00028"></a>00028 <span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030 <span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<a name="l00031"></a>00031 <span class="comment">// permit to gain accesses to new services.</span>
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033 ?&gt;
+<a name="l00034"></a>00034 &lt;html&gt;
+<a name="l00035"></a>00035   &lt;head&gt;
+<a name="l00036"></a>00036     &lt;title&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxy example #2&lt;/title&gt;
+<a name="l00037"></a>00037     &lt;link rel=<span class="stringliteral">&quot;stylesheet&quot;</span> type=<span class="stringliteral">&#39;text/css&#39;</span> href=<span class="stringliteral">&#39;example.css&#39;</span>/&gt;
+<a name="l00038"></a>00038   &lt;/head&gt;
+<a name="l00039"></a>00039   &lt;body&gt;
+<a name="l00040"></a>00040     &lt;h1&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxied proxy example&lt;/h1&gt;
+<a name="l00041"></a>00041     &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+<a name="l00042"></a>00042     &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00043"></a>00043 <span class="stringliteral">    &lt;h2&gt;Response from service &lt;?php echo $serviceUrl; ?&gt;&lt;/h2&gt;</span>
+<a name="l00044"></a>00044 <span class="stringliteral">&lt;?php</span>
+<a name="l00045"></a>00045 <span class="stringliteral">        flush();</span>
+<a name="l00046"></a>00046 <span class="stringliteral">        </span>
+<a name="l00047"></a>00047 <span class="stringliteral">        // call a service and change the color depending on the result</span>
+<a name="l00048"></a>00048 <span class="stringliteral">        try {</span>
+<a name="l00049"></a>00049 <span class="stringliteral">                $service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_GET);</span>
+<a name="l00050"></a>00050 <span class="stringliteral">                $service-&gt;setUrl($serviceUrl);</span>
+<a name="l00051"></a>00051 <span class="stringliteral">                $service-&gt;send();</span>
+<a name="l00052"></a>00052 <span class="stringliteral">                if ($service-&gt;getResponseStatusCode() == 200) {</span>
+<a name="l00053"></a>00053 <span class="stringliteral">                        echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;success&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00054"></a>00054 <span class="stringliteral">                        echo $service-&gt;getResponseBody();</span>
+<a name="l00055"></a>00055 <span class="stringliteral">                        echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00056"></a>00056 <span class="stringliteral">                } else {</span>
+<a name="l00057"></a>00057 <span class="stringliteral">                        // The service responded with an error code 404, 500, etc.</span>
+<a name="l00058"></a>00058 <span class="stringliteral">                        echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00059"></a>00059 <span class="stringliteral">                        echo &#39;</span>The service responded with a <span class="stringliteral">&#39;.$service-&gt;getResponseStatusCode().&#39;</span> error.<span class="stringliteral">&#39;;</span>
+<a name="l00060"></a>00060 <span class="stringliteral">                        echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00061"></a>00061 <span class="stringliteral">                }</span>
+<a name="l00062"></a>00062 <span class="stringliteral">        } catch (CAS_ProxyTicketException $e) {</span>
+<a name="l00063"></a>00063 <span class="stringliteral">                if ($e-&gt;getCode() == PHPCAS_SERVICE_PT_FAILURE) {</span>
+<a name="l00064"></a>00064 <span class="stringliteral">                        echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00065"></a>00065 <span class="stringliteral">                        echo &quot;Your login has timed out. You need to log in again.&quot;;</span>
+<a name="l00066"></a>00066 <span class="stringliteral">                        echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00067"></a>00067 <span class="stringliteral">                } else</span>
+<a name="l00068"></a>00068 <span class="stringliteral">                        // Other proxy ticket errors are from bad request format (shouldn&#39;</span>t happen)
+<a name="l00069"></a>00069                         <span class="comment">// or CAS server failure (unlikely) so lets just stop if we hit those.</span>
+<a name="l00070"></a>00070                         <span class="keywordflow">throw</span> $e; 
+<a name="l00071"></a>00071         } <span class="keywordflow">catch</span> (<a class="code" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a> $e) {
+<a name="l00072"></a>00072                 <span class="comment">// Something prevented the service request from being sent or received.</span>
+<a name="l00073"></a>00073                 <span class="comment">// We didn&#39;t even get a valid error response (404, 500, etc), so this</span>
+<a name="l00074"></a>00074                 <span class="comment">// might be caused by a network error or a DNS resolution failure.</span>
+<a name="l00075"></a>00075                 <span class="comment">// We could handle it in some way, but for now we will just stop.</span>
+<a name="l00076"></a>00076                 <span class="keywordflow">throw</span> $e;
+<a name="l00077"></a>00077         }
+<a name="l00078"></a>00078         
+<a name="l00079"></a>00079         
+<a name="l00080"></a>00080 ?&gt;
+<a name="l00081"></a>00081   &lt;/body&gt;
+<a name="l00082"></a>00082 &lt;/html&gt;
+<a name="l00083"></a>00083 
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__POST_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__POST_8php.html
new file mode 100644
index 00000000..baed025e
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__POST_8php.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_proxy_POST.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>docs/examples/example_proxy_POST.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__proxy__POST_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="example__proxy__POST_8php.html#a92b2154d49731d7315ea689667265ec5">$serviceUrl</a> = $curbase.$curdir.'example_service_POST.php'</td></tr>
+</table>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="a92b2154d49731d7315ea689667265ec5"></a><!-- doxytag: member="example_proxy_POST.php::$serviceUrl" ref="a92b2154d49731d7315ea689667265ec5" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$serviceUrl = $curbase.$curdir.'example_service_POST.php'</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="example__proxy__POST_8php_source.html#l00033">33</a> of file <a class="el" href="example__proxy__POST_8php_source.html">example_proxy_POST.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__POST_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__POST_8php_source.html
new file mode 100644
index 00000000..bec5e3c1
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__POST_8php_source.html
@@ -0,0 +1,127 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_proxy_POST.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_proxy_POST.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__proxy__POST_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example for a proxy that makes a GET request.</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS::proxy</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// force CAS authentication</span>
+<a name="l00025"></a>00025 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 <span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<a name="l00028"></a>00028 <span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030 <span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<a name="l00031"></a>00031 <span class="comment">// permit to gain accesses to new services.</span>
+<a name="l00032"></a>00032 
+<a name="l00033"></a><a class="code" href="example__proxy__POST_8php.html#a92b2154d49731d7315ea689667265ec5">00033</a> <a class="code" href="config_8php.html#a92b2154d49731d7315ea689667265ec5">$serviceUrl</a> = $curbase.$curdir.<span class="stringliteral">&#39;example_service_POST.php&#39;</span>;
+<a name="l00034"></a>00034 
+<a name="l00035"></a>00035 ?&gt;
+<a name="l00036"></a>00036 &lt;html&gt;
+<a name="l00037"></a>00037   &lt;head&gt;
+<a name="l00038"></a>00038     &lt;title&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxy POST example&lt;/title&gt;
+<a name="l00039"></a>00039     &lt;link rel=<span class="stringliteral">&quot;stylesheet&quot;</span> type=<span class="stringliteral">&#39;text/css&#39;</span> href=<span class="stringliteral">&#39;example.css&#39;</span>/&gt;
+<a name="l00040"></a>00040   &lt;/head&gt;
+<a name="l00041"></a>00041   &lt;body&gt;
+<a name="l00042"></a>00042     &lt;h1&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxy POST example&lt;/h1&gt;
+<a name="l00043"></a>00043     &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+<a name="l00044"></a>00044     &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00045"></a>00045 <span class="stringliteral">    &lt;h2&gt;Response from service &lt;?php echo $serviceUrl; ?&gt;&lt;/h2&gt;</span>
+<a name="l00046"></a>00046 <span class="stringliteral">&lt;?php</span>
+<a name="l00047"></a>00047 <span class="stringliteral">        flush();</span>
+<a name="l00048"></a>00048 <span class="stringliteral">        </span>
+<a name="l00049"></a>00049 <span class="stringliteral">        // call a service and change the color depending on the result</span>
+<a name="l00050"></a>00050 <span class="stringliteral">        try {</span>
+<a name="l00051"></a>00051 <span class="stringliteral">                $service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_POST);</span>
+<a name="l00052"></a>00052 <span class="stringliteral">                $service-&gt;setUrl($serviceUrl);</span>
+<a name="l00053"></a>00053 <span class="stringliteral">                $service-&gt;setContentType(&#39;</span>application/x-www-form-urlencoded<span class="stringliteral">&#39;);</span>
+<a name="l00054"></a>00054 <span class="stringliteral">                $service-&gt;setBody(&#39;</span>favorite_color=blue<span class="stringliteral">&#39;);</span>
+<a name="l00055"></a>00055 <span class="stringliteral">                $service-&gt;send();</span>
+<a name="l00056"></a>00056 <span class="stringliteral">                if ($service-&gt;getResponseStatusCode() == 200) {</span>
+<a name="l00057"></a>00057 <span class="stringliteral">                        echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;success&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00058"></a>00058 <span class="stringliteral">                        echo $service-&gt;getResponseBody();</span>
+<a name="l00059"></a>00059 <span class="stringliteral">                        echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00060"></a>00060 <span class="stringliteral">                } else {</span>
+<a name="l00061"></a>00061 <span class="stringliteral">                        // The service responded with an error code 404, 500, etc.</span>
+<a name="l00062"></a>00062 <span class="stringliteral">                        echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00063"></a>00063 <span class="stringliteral">                        echo &#39;</span>The service responded with a <span class="stringliteral">&#39;.$service-&gt;getResponseStatusCode().&#39;</span> error.<span class="stringliteral">&#39;;</span>
+<a name="l00064"></a>00064 <span class="stringliteral">                        echo $service-&gt;getResponseBody();</span>
+<a name="l00065"></a>00065 <span class="stringliteral">                        echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00066"></a>00066 <span class="stringliteral">                }</span>
+<a name="l00067"></a>00067 <span class="stringliteral">        } catch (CAS_ProxyTicketException $e) {</span>
+<a name="l00068"></a>00068 <span class="stringliteral">                if ($e-&gt;getCode() == PHPCAS_SERVICE_PT_FAILURE) {</span>
+<a name="l00069"></a>00069 <span class="stringliteral">                        echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00070"></a>00070 <span class="stringliteral">                        echo &quot;Your login has timed out. You need to log in again.&quot;;</span>
+<a name="l00071"></a>00071 <span class="stringliteral">                        echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00072"></a>00072 <span class="stringliteral">                } else</span>
+<a name="l00073"></a>00073 <span class="stringliteral">                        // Other proxy ticket errors are from bad request format (shouldn&#39;</span>t happen)
+<a name="l00074"></a>00074                         <span class="comment">// or CAS server failure (unlikely) so lets just stop if we hit those.</span>
+<a name="l00075"></a>00075                         <span class="keywordflow">throw</span> $e; 
+<a name="l00076"></a>00076         } <span class="keywordflow">catch</span> (<a class="code" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a> $e) {
+<a name="l00077"></a>00077                 <span class="comment">// Something prevented the service request from being sent or received.</span>
+<a name="l00078"></a>00078                 <span class="comment">// We didn&#39;t even get a valid error response (404, 500, etc), so this</span>
+<a name="l00079"></a>00079                 <span class="comment">// might be caused by a network error or a DNS resolution failure.</span>
+<a name="l00080"></a>00080                 <span class="comment">// We could handle it in some way, but for now we will just stop.</span>
+<a name="l00081"></a>00081                 <span class="keywordflow">throw</span> $e;
+<a name="l00082"></a>00082         }
+<a name="l00083"></a>00083         
+<a name="l00084"></a>00084         
+<a name="l00085"></a>00085 ?&gt;
+<a name="l00086"></a>00086   &lt;/body&gt;
+<a name="l00087"></a>00087 &lt;/html&gt;
+<a name="l00088"></a>00088 
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__serviceWeb_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__serviceWeb_8php.html
new file mode 100644
index 00000000..762317cc
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__serviceWeb_8php.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_proxy_serviceWeb.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_proxy_serviceWeb.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__proxy__serviceWeb_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__serviceWeb_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__serviceWeb_8php_source.html
new file mode 100644
index 00000000..b40ad918
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__serviceWeb_8php_source.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_proxy_serviceWeb.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_proxy_serviceWeb.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__proxy__serviceWeb_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example for a proxy with session usage</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS::proxy</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// force CAS authentication</span>
+<a name="l00025"></a>00025 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 <span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<a name="l00028"></a>00028 <span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030 <span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<a name="l00031"></a>00031 <span class="comment">// permit to gain accesses to new services.</span>
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033 ?&gt;
+<a name="l00034"></a>00034 &lt;html&gt;
+<a name="l00035"></a>00035   &lt;head&gt;
+<a name="l00036"></a>00036     &lt;title&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxied proxy example (with sessioning)&lt;/title&gt;
+<a name="l00037"></a>00037     &lt;link rel=<span class="stringliteral">&quot;stylesheet&quot;</span> type=<span class="stringliteral">&#39;text/css&#39;</span> href=<span class="stringliteral">&#39;example.css&#39;</span>/&gt;
+<a name="l00038"></a>00038   &lt;/head&gt;
+<a name="l00039"></a>00039   &lt;body&gt;
+<a name="l00040"></a>00040     &lt;h1&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxied proxy example (with sessioning)&lt;/h1&gt;
+<a name="l00041"></a>00041     &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+<a name="l00042"></a>00042     &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00043"></a>00043 <span class="stringliteral">    &lt;h2&gt;Response from service &lt;?php echo $serviceUrl; ?&gt;&lt;/h2&gt;</span>
+<a name="l00044"></a>00044 <span class="stringliteral">&lt;?php</span>
+<a name="l00045"></a>00045 <span class="stringliteral">  flush();</span>
+<a name="l00046"></a>00046 <span class="stringliteral">  // call a service and change the color depending on the result</span>
+<a name="l00047"></a>00047 <span class="stringliteral">  if ( phpCAS::serviceWeb($serviceUrl,$err_code,$output) ) {</span>
+<a name="l00048"></a>00048 <span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;success&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00049"></a>00049 <span class="stringliteral">  } else {</span>
+<a name="l00050"></a>00050 <span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00051"></a>00051 <span class="stringliteral">  }</span>
+<a name="l00052"></a>00052 <span class="stringliteral">  echo $output;</span>
+<a name="l00053"></a>00053 <span class="stringliteral">  echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00054"></a>00054 <span class="stringliteral">?&gt;</span>
+<a name="l00055"></a>00055 <span class="stringliteral">  &lt;/body&gt;</span>
+<a name="l00056"></a>00056 <span class="stringliteral">&lt;/html&gt;</span>
+<a name="l00057"></a>00057 <span class="stringliteral"></span>
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__serviceWeb__chaining_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__serviceWeb__chaining_8php.html
new file mode 100644
index 00000000..8f1ad284
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__serviceWeb__chaining_8php.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_proxy_serviceWeb_chaining.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_proxy_serviceWeb_chaining.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__proxy__serviceWeb__chaining_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__serviceWeb__chaining_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__serviceWeb__chaining_8php_source.html
new file mode 100644
index 00000000..00d397a4
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__proxy__serviceWeb__chaining_8php_source.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_proxy_serviceWeb_chaining.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_proxy_serviceWeb_chaining.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__proxy__serviceWeb__chaining_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example for a proxy with session usage</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS::proxy</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// force CAS authentication</span>
+<a name="l00025"></a>00025 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 <span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<a name="l00028"></a>00028 <span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030 <span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<a name="l00031"></a>00031 <span class="comment">// permit to gain accesses to new services.</span>
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033 ?&gt;
+<a name="l00034"></a>00034 &lt;html&gt;
+<a name="l00035"></a>00035   &lt;head&gt;
+<a name="l00036"></a>00036     &lt;title&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxy example #2&lt;/title&gt;
+<a name="l00037"></a>00037     &lt;link rel=<span class="stringliteral">&quot;stylesheet&quot;</span> type=<span class="stringliteral">&#39;text/css&#39;</span> href=<span class="stringliteral">&#39;example.css&#39;</span>/&gt;
+<a name="l00038"></a>00038   &lt;/head&gt;
+<a name="l00039"></a>00039   &lt;body&gt;
+<a name="l00040"></a>00040     &lt;h1&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxied proxy example&lt;/h1&gt;
+<a name="l00041"></a>00041     &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+<a name="l00042"></a>00042     &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00043"></a>00043 <span class="stringliteral">    &lt;h2&gt;Response from service &lt;?php echo $serviceUrl2; ?&gt;&lt;/h2&gt;</span>
+<a name="l00044"></a>00044 <span class="stringliteral">&lt;?php</span>
+<a name="l00045"></a>00045 <span class="stringliteral">  flush();</span>
+<a name="l00046"></a>00046 <span class="stringliteral">  // call a service and change the color depending on the result</span>
+<a name="l00047"></a>00047 <span class="stringliteral">  if ( phpCAS::serviceWeb($serviceUrl2,$err_code,$output) ) {</span>
+<a name="l00048"></a>00048 <span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;success&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00049"></a>00049 <span class="stringliteral">  } else {</span>
+<a name="l00050"></a>00050 <span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00051"></a>00051 <span class="stringliteral">  }</span>
+<a name="l00052"></a>00052 <span class="stringliteral">  echo $output;</span>
+<a name="l00053"></a>00053 <span class="stringliteral">  echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00054"></a>00054 <span class="stringliteral">?&gt;</span>
+<a name="l00055"></a>00055 <span class="stringliteral">  &lt;/body&gt;</span>
+<a name="l00056"></a>00056 <span class="stringliteral">&lt;/html&gt;</span>
+<a name="l00057"></a>00057 <span class="stringliteral"></span>
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service_8php.html
new file mode 100644
index 00000000..6336911b
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service_8php.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_service.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>docs/examples/example_service.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__service_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">print</a></td></tr>
+</table>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="a3ad3a4240c0f97c7e85aff5c52a454d4"></a><!-- doxytag: member="example_service.php::print" ref="a3ad3a4240c0f97c7e85aff5c52a454d4" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="example__service__POST_8php.html#a5f56630a17ebf6a4aa83e982595b6f38">print</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__service_8php-example.html#a8">example_service.php</a>, and <a class="el" href="example__service__POST_8php-example.html#a8">example_service_POST.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="example__service_8php_source.html#l00027">27</a> of file <a class="el" href="example__service_8php_source.html">example_service.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service_8php_source.html
new file mode 100644
index 00000000..40b965bc
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service_8php_source.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_service.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_service.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__service_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example for proxied service with session support</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// force CAS authentication</span>
+<a name="l00025"></a>00025 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00026"></a>00026 
+<a name="l00027"></a><a class="code" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">00027</a> <a class="code" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">print</a> <span class="stringliteral">&#39;&lt;h1&gt;I am a service that can be proxied.&lt;/h1&gt;&#39;</span>;
+<a name="l00028"></a>00028 
+<a name="l00029"></a>00029 <span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<a name="l00030"></a>00030 <span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+<a name="l00031"></a>00031 include <span class="stringliteral">&#39;script_info.php&#39;</span>;
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033 <span class="comment">// for this test, simply print that the authentication was successfull</span>
+<a name="l00034"></a>00034 echo <span class="stringliteral">&#39;&lt;p&gt;The user\&#39;s login is &lt;b&gt;&#39;</span>.phpCAS::getUser().<span class="stringliteral">&#39;&lt;/b&gt;.&lt;/p&gt;&#39;</span>;
+<a name="l00035"></a>00035 
+<a name="l00036"></a>00036 <span class="comment">// increment the number of requests of the session and print it</span>
+<a name="l00037"></a>00037 <span class="keywordflow">if</span> (!isset($_SESSION[<span class="charliteral">&#39;n&#39;</span>]))
+<a name="l00038"></a>00038         $_SESSION[<span class="charliteral">&#39;n&#39;</span>] = 0;
+<a name="l00039"></a>00039 echo <span class="stringliteral">&#39;&lt;p&gt;request #&#39;</span>.(++$_SESSION[<span class="charliteral">&#39;n&#39;</span>]).<span class="stringliteral">&#39;&lt;/p&gt;&#39;</span>;
+<a name="l00040"></a>00040 
+<a name="l00041"></a>00041 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service__POST_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service__POST_8php.html
new file mode 100644
index 00000000..17263224
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service__POST_8php.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_service_POST.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>docs/examples/example_service_POST.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__service__POST_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">if($_SERVER['REQUEST_METHOD']!= <br class="typebreak"/>
+'POST') if(empty($_POST['favorite_color']))&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="example__service__POST_8php.html#a5f56630a17ebf6a4aa83e982595b6f38">print</a></td></tr>
+</table>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="a5f56630a17ebf6a4aa83e982595b6f38"></a><!-- doxytag: member="example_service_POST.php::print" ref="a5f56630a17ebf6a4aa83e982595b6f38" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">if ($_SERVER['REQUEST_METHOD']!= 'POST') if (empty($_POST['favorite_color'])) <a class="el" href="example__service__POST_8php.html#a5f56630a17ebf6a4aa83e982595b6f38">print</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="example__service__POST_8php_source.html#l00032">32</a> of file <a class="el" href="example__service__POST_8php_source.html">example_service_POST.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service__POST_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service__POST_8php_source.html
new file mode 100644
index 00000000..1b371171
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service__POST_8php_source.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_service_POST.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_service_POST.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__service__POST_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example for proxied service with session support</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// force CAS authentication</span>
+<a name="l00025"></a>00025 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 <span class="keywordflow">if</span> ($_SERVER[<span class="stringliteral">&#39;REQUEST_METHOD&#39;</span>] != <span class="stringliteral">&#39;POST&#39;</span>) {
+<a name="l00028"></a>00028         header(<span class="stringliteral">&#39;HTTP/1.1 400 Bad Request&#39;</span>);
+<a name="l00029"></a>00029         <a class="code" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">print</a> <span class="stringliteral">&quot;&lt;h1&gt;I only respond to POST requests. This is a &quot;</span>.$_SERVER[<span class="stringliteral">&#39;REQUEST_METHOD&#39;</span>].<span class="stringliteral">&quot; request.&lt;/h1&gt;&quot;</span>;
+<a name="l00030"></a>00030         exit;
+<a name="l00031"></a>00031 }
+<a name="l00032"></a><a class="code" href="example__service__POST_8php.html#a5f56630a17ebf6a4aa83e982595b6f38">00032</a> <span class="keywordflow">if</span> (empty($_POST[<span class="stringliteral">&#39;favorite_color&#39;</span>])) {
+<a name="l00033"></a>00033         header(<span class="stringliteral">&#39;HTTP/1.1 400 Bad Request&#39;</span>);
+<a name="l00034"></a>00034         <a class="code" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">print</a> <span class="stringliteral">&#39;&lt;h1&gt;You must post a &lt;strong&gt;favorite_color&lt;/strong&gt;.&lt;/h1&gt;&#39;</span>;
+<a name="l00035"></a>00035         exit;
+<a name="l00036"></a>00036 }
+<a name="l00037"></a>00037 
+<a name="l00038"></a>00038 <a class="code" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">print</a> <span class="stringliteral">&#39;&lt;h1&gt;I am a service that responds to POST requests.&lt;/h1&gt;&#39;</span>;
+<a name="l00039"></a>00039 
+<a name="l00040"></a>00040 <span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<a name="l00041"></a>00041 <span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+<a name="l00042"></a>00042 include <span class="stringliteral">&#39;script_info.php&#39;</span>;
+<a name="l00043"></a>00043 
+<a name="l00044"></a>00044 <span class="comment">// for this test, simply print that the authentication was successfull</span>
+<a name="l00045"></a>00045 echo <span class="stringliteral">&#39;&lt;p&gt;The user\&#39;s login is &lt;b&gt;&#39;</span>.phpCAS::getUser().<span class="stringliteral">&#39;&lt;/b&gt;.&lt;/p&gt;&#39;</span>;
+<a name="l00046"></a>00046 
+<a name="l00047"></a>00047 <a class="code" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">print</a> <span class="stringliteral">&#39;&lt;h1&gt;Your favorite color is &#39;</span>.htmlentities($_POST[<span class="stringliteral">&#39;favorite_color&#39;</span>]).<span class="stringliteral">&#39;&lt;/h1&gt;&#39;</span>;
+<a name="l00048"></a>00048 
+<a name="l00049"></a>00049 <span class="comment">// increment the number of requests of the session and print it</span>
+<a name="l00050"></a>00050 <span class="keywordflow">if</span> (!isset($_SESSION[<span class="charliteral">&#39;n&#39;</span>]))
+<a name="l00051"></a>00051         $_SESSION[<span class="charliteral">&#39;n&#39;</span>] = 0;
+<a name="l00052"></a>00052 echo <span class="stringliteral">&#39;&lt;p&gt;request #&#39;</span>.(++$_SESSION[<span class="charliteral">&#39;n&#39;</span>]).<span class="stringliteral">&#39;&lt;/p&gt;&#39;</span>;
+<a name="l00053"></a>00053 
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service__that__proxies_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service__that__proxies_8php.html
new file mode 100644
index 00000000..82ad3547
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service__that__proxies_8php.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_service_that_proxies.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_service_that_proxies.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__service__that__proxies_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service__that__proxies_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service__that__proxies_8php_source.html
new file mode 100644
index 00000000..daf93197
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__service__that__proxies_8php_source.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_service_that_proxies.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_service_that_proxies.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__service__that__proxies_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example for a proxied proxy</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS::proxy</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// force CAS authentication</span>
+<a name="l00025"></a>00025 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 <span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<a name="l00028"></a>00028 <span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030 <span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<a name="l00031"></a>00031 <span class="comment">// permit to gain accesses to new services.</span>
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033 
+<a name="l00034"></a>00034 
+<a name="l00035"></a>00035 ?&gt;
+<a name="l00036"></a>00036 &lt;html&gt;
+<a name="l00037"></a>00037   &lt;head&gt;
+<a name="l00038"></a>00038     &lt;title&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxied proxy service example&lt;/title&gt;
+<a name="l00039"></a>00039     &lt;link rel=<span class="stringliteral">&quot;stylesheet&quot;</span> type=<span class="stringliteral">&#39;text/css&#39;</span> href=<span class="stringliteral">&#39;example.css&#39;</span>/&gt;
+<a name="l00040"></a>00040   &lt;/head&gt;
+<a name="l00041"></a>00041   &lt;body&gt;
+<a name="l00042"></a>00042     &lt;h1&gt;I am a service that can be proxied. In turn, I proxy another service.&lt;/h1&gt;
+<a name="l00043"></a>00043     &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+<a name="l00044"></a>00044     &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00045"></a>00045 <span class="stringliteral">    &lt;h2&gt;Response from service &lt;?php echo $serviceUrl; ?&gt;&lt;/h2&gt;</span>
+<a name="l00046"></a>00046 <span class="stringliteral">&lt;?php</span>
+<a name="l00047"></a>00047 <span class="stringliteral">  flush();</span>
+<a name="l00048"></a>00048 <span class="stringliteral">  // call a service and change the color depending on the result</span>
+<a name="l00049"></a>00049 <span class="stringliteral">  if ( phpCAS::serviceWeb($serviceUrl,$err_code,$output) ) {</span>
+<a name="l00050"></a>00050 <span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;success&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00051"></a>00051 <span class="stringliteral">  } else {</span>
+<a name="l00052"></a>00052 <span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00053"></a>00053 <span class="stringliteral">  }</span>
+<a name="l00054"></a>00054 <span class="stringliteral">  echo $output;</span>
+<a name="l00055"></a>00055 <span class="stringliteral">  echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<a name="l00056"></a>00056 <span class="stringliteral">?&gt;</span>
+<a name="l00057"></a>00057 <span class="stringliteral">  &lt;/body&gt;</span>
+<a name="l00058"></a>00058 <span class="stringliteral">&lt;/html&gt;</span>
+<a name="l00059"></a>00059 <span class="stringliteral"></span>
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__simple_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__simple_8php.html
new file mode 100644
index 00000000..6db217a2
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__simple_8php.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_simple.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_simple.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="example__simple_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__simple_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__simple_8php_source.html
new file mode 100644
index 00000000..38225c89
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example__simple_8php_source.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/example_simple.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/example_simple.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="example__simple_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 <span class="comment">// Example for a simple client</span>
+<a name="l00003"></a>00003 
+<a name="l00004"></a>00004 <span class="comment">// Load the settings from the central config file</span>
+<a name="l00005"></a>00005 include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<a name="l00006"></a>00006 <span class="comment">// Load the CAS lib</span>
+<a name="l00007"></a>00007 include_once(<a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+<a name="l00008"></a>00008 
+<a name="l00009"></a>00009 <span class="comment">// Uncomment to enable debugging</span>
+<a name="l00010"></a>00010 <a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+<a name="l00011"></a>00011 
+<a name="l00012"></a>00012 <span class="comment">// Initialize phpCAS</span>
+<a name="l00013"></a>00013 <a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+<a name="l00014"></a>00014 
+<a name="l00015"></a>00015 <span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<a name="l00016"></a>00016 <span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="l00017"></a>00017 <span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+<a name="l00018"></a>00018 
+<a name="l00019"></a>00019 <span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<a name="l00020"></a>00020 <span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<a name="l00021"></a>00021 <span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="l00022"></a>00022 <a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="comment">// force CAS authentication</span>
+<a name="l00025"></a>00025 <a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 <span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<a name="l00028"></a>00028 <span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030 <span class="comment">// logout if desired</span>
+<a name="l00031"></a>00031 <span class="keywordflow">if</span> (isset($_REQUEST[<span class="stringliteral">&#39;logout&#39;</span>])) {
+<a name="l00032"></a>00032         <a class="code" href="group__publicAuth.html#ga9989272833c5170c3b7c7027beab795b">phpCAS::logout</a>();
+<a name="l00033"></a>00033 }
+<a name="l00034"></a>00034 
+<a name="l00035"></a>00035 <span class="comment">// for this test, simply print that the authentication was successfull</span>
+<a name="l00036"></a>00036 ?&gt;
+<a name="l00037"></a>00037 &lt;html&gt;
+<a name="l00038"></a>00038   &lt;head&gt;
+<a name="l00039"></a>00039     &lt;title&gt;<a class="code" href="classphpCAS.html">phpCAS</a> simple client&lt;/title&gt;
+<a name="l00040"></a>00040   &lt;/head&gt;
+<a name="l00041"></a>00041   &lt;body&gt;
+<a name="l00042"></a>00042     &lt;h1&gt;Successfull Authentication!&lt;/h1&gt;
+<a name="l00043"></a>00043     &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+<a name="l00044"></a>00044     &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00045"></a>00045 <span class="stringliteral">    &lt;p&gt;phpCAS version is &lt;b&gt;&lt;?php echo phpCAS::getVersion(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<a name="l00046"></a>00046 <span class="stringliteral">    &lt;p&gt;&lt;a href=&quot;?logout=&quot;&gt;Logout&lt;/a&gt;&lt;/p&gt;</span>
+<a name="l00047"></a>00047 <span class="stringliteral">  &lt;/body&gt;</span>
+<a name="l00048"></a>00048 <span class="stringliteral">&lt;/html&gt;</span>
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_advanced_saml11_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_advanced_saml11_8php-example.html
new file mode 100644
index 00000000..47b02520
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_advanced_saml11_8php-example.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_advanced_saml11.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_advanced_saml11.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Advanced example for SAML with attributes and single logout</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#gaa6440870ffb0a81c5403ac10faa25f33">SAML_VERSION_1_1</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gac7c2da957fdd437f1e23147f83daffcb">phpCAS::setCasServerCACert</a>(<a name="a7"></a><a class="code" href="config_8php.html#a18552b2559a8de847b82b43b94adf047">$cas_server_ca_cert_path</a>);
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<span class="comment">// phpCAS::setNoCasServerValidation();</span>
+
+<span class="comment">// Handle SAML logout requests that emanate from the CAS host exclusively.</span>
+<span class="comment">// Failure to restrict SAML logout requests to authorized hosts could</span>
+<span class="comment">// allow denial of service attacks where at the least the server is</span>
+<span class="comment">// tied up parsing bogus XML messages.</span>
+<a name="a8"></a><a class="code" href="group__publicAuth.html#ga33a0cf0299f96e23893ce4ff6cc76584">phpCAS::handleLogoutRequests</a>(<span class="keyword">true</span>, <a name="a9"></a><a class="code" href="config_8php.html#a636310976f993bc089ccc97652a28f28">$cas_real_hosts</a>);
+
+<span class="comment">// Force CAS authentication on any page that includes this file</span>
+<a name="a10"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+
+?&gt;
+&lt;h2&gt;Secure Page&lt;/h2&gt;
+&lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+
+Authentication succeeded <span class="keywordflow">for</span> user
+&lt;strong&gt;&lt;?php echo <a name="a11"></a><a class="code" href="group__publicAuth.html#ga4c9f984b474b550cf316396e87670b18">phpCAS::getUser</a>(); ?&gt;&lt;/strong&gt;.
+
+&lt;h3&gt;User Attributes&lt;/h3&gt;
+&lt;ul&gt;
+&lt;?php
+<span class="keywordflow">foreach</span> (<a name="a12"></a><a class="code" href="group__publicAuth.html#ga9972fbb286fe7e8d726b2e776b150233">phpCAS::getAttributes</a>() as $key =&gt; $value) {
+<span class="keywordflow">if</span> (is_array($value)) {
+echo <span class="stringliteral">&#39;&lt;li&gt;&#39;</span>, $key, <span class="stringliteral">&#39;:&lt;ol&gt;&#39;</span>;
+<span class="keywordflow">foreach</span>($value as $item) {
+      echo <span class="stringliteral">&#39;&lt;li&gt;&lt;strong&gt;&#39;</span>, $item, <span class="stringliteral">&#39;&lt;/strong&gt;&lt;/li&gt;&#39;</span>;
+    }
+echo <span class="stringliteral">&#39;&lt;/ol&gt;&lt;/li&gt;&#39;</span>;
+} <span class="keywordflow">else</span> {
+    echo <span class="stringliteral">&#39;&lt;li&gt;&#39;</span>, $key, <span class="stringliteral">&#39;: &lt;strong&gt;&#39;</span>, $value, <span class="stringliteral">&#39;&lt;/strong&gt;&lt;/li&gt;&#39;</span>;
+  }
+}
+?&gt;
+&lt;/ul&gt;
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_custom_urls_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_custom_urls_8php-example.html
new file mode 100644
index 00000000..13a3b15e
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_custom_urls_8php-example.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_custom_urls.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_custom_urls.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Example for overriding validation urls</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+
+
+<span class="comment">// Override the validation url for any (ST and PT) CAS 2.0 validation</span>
+<a name="a7"></a><a class="code" href="group__publicAuth.html#ga11d1c13ed3d5008984ef5999a9389104">phpCAS::setServerProxyValidateURL</a>(<span class="stringliteral">&#39;https://sso.hrz.tu-darmstadt.de:1443/proxyValidate&#39;</span>);
+<span class="comment">// Override the validation url for any CAS 1.0 validation</span>
+<span class="comment">//phpCAS::setServerServiceValidateURL(&#39;https://sso.hrz.tu-darmstadt.de:1443/serviceValidate&#39;);</span>
+<span class="comment">//Override the validation url for any SAML11 validation</span>
+<span class="comment">//phpCAS::setServerSamlValidateURL(&#39;https://sso.hrz.tu-darmstadt.de:1443/samlValidate&#39;);</span>
+
+
+<span class="comment">// force CAS authentication</span>
+<a name="a8"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+
+<span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+
+<span class="comment">// logout if desired</span>
+<span class="keywordflow">if</span> (isset($_REQUEST[<span class="stringliteral">&#39;logout&#39;</span>])) {
+        <a name="a9"></a><a class="code" href="group__publicAuth.html#ga9989272833c5170c3b7c7027beab795b">phpCAS::logout</a>();
+}
+
+<span class="comment">// for this test, simply print that the authentication was successfull</span>
+?&gt;
+&lt;html&gt;
+  &lt;head&gt;
+    &lt;title&gt;<a name="_a10"></a><a class="code" href="classphpCAS.html">phpCAS</a> simple client&lt;/title&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+    &lt;h1&gt;Successfull Authentication!&lt;/h1&gt;
+    &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+    &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">    &lt;p&gt;phpCAS version is &lt;b&gt;&lt;?php echo phpCAS::getVersion(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">    &lt;p&gt;&lt;a href=&quot;?logout=&quot;&gt;Logout&lt;/a&gt;&lt;/p&gt;</span>
+<span class="stringliteral">  &lt;/body&gt;</span>
+<span class="stringliteral">&lt;/html&gt;</span>
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_gateway_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_gateway_8php-example.html
new file mode 100644
index 00000000..d4202fd6
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_gateway_8php-example.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_gateway.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_gateway.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Example that uses the CAS gateway feature</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+
+<span class="keywordflow">if</span> (isset($_REQUEST[<span class="stringliteral">&#39;logout&#39;</span>])) {
+  <a name="a7"></a><a class="code" href="group__publicAuth.html#ga9989272833c5170c3b7c7027beab795b">phpCAS::logout</a>();
+}
+<span class="keywordflow">if</span> (isset($_REQUEST[<span class="stringliteral">&#39;login&#39;</span>])) {
+  <a name="a8"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+}
+
+<span class="comment">// check CAS authentication</span>
+<a name="a9"></a><a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a> = <a name="a10"></a><a class="code" href="group__publicAuth.html#ga21fd1c2665d2e21c03e6a6dd1860cf4d">phpCAS::checkAuthentication</a>();
+
+?&gt;
+&lt;html&gt;
+  &lt;head&gt;
+    &lt;title&gt;<a name="_a11"></a><a class="code" href="classphpCAS.html">phpCAS</a> simple client&lt;/title&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+&lt;?php
+<span class="keywordflow">if</span> (<a class="code" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">$auth</a>) {
+  <span class="comment">// for this test, simply print that the authentication was successfull</span>
+?&gt;
+    &lt;h1&gt;Successfull Authentication!&lt;/h1&gt;
+    &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+    &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">    &lt;p&gt;&lt;a href=&quot;?logout=&quot;&gt;Logout&lt;/a&gt;&lt;/p&gt;</span>
+<span class="stringliteral">&lt;?php</span>
+<span class="stringliteral">} else {</span>
+<span class="stringliteral">?&gt;</span>
+<span class="stringliteral">    &lt;h1&gt;Guest mode&lt;/h1&gt;</span>
+<span class="stringliteral">    &lt;p&gt;&lt;a href=&quot;?login=&quot;&gt;Login&lt;/a&gt;&lt;/p&gt;</span>
+<span class="stringliteral">&lt;?php</span>
+<span class="stringliteral">}</span>
+<span class="stringliteral">?&gt;</span>
+<span class="stringliteral">    &lt;p&gt;phpCAS version is &lt;b&gt;&lt;?php echo phpCAS::getVersion(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">  &lt;/body&gt;</span>
+<span class="stringliteral">&lt;/html&gt;</span>
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_html_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_html_8php-example.html
new file mode 100644
index 00000000..83e8f869
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_html_8php-example.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_html.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_html.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Example that changes html of phpcas messages</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+
+<span class="comment">// customize HTML output</span>
+<a name="a7"></a><a class="code" href="group__publicOutput.html#ga9beb490d4e355f131998f1a73c9d6065">phpCAS::setHTMLHeader</a>(<span class="stringliteral">&#39;</span>
+<span class="stringliteral">&lt;html&gt;</span>
+<span class="stringliteral">  &lt;head&gt;</span>
+<span class="stringliteral">    &lt;title&gt;__TITLE__&lt;/title&gt;</span>
+<span class="stringliteral">  &lt;/head&gt;</span>
+<span class="stringliteral">  &lt;body&gt;</span>
+<span class="stringliteral">  &lt;h1&gt;__TITLE__&lt;/h1&gt;</span>
+<span class="stringliteral">&#39;</span>);
+<a name="a8"></a><a class="code" href="group__publicOutput.html#ga166cd942019d96ef8b4504f2bfb9effd">phpCAS::setHTMLFooter</a>(<span class="stringliteral">&#39;</span>
+<span class="stringliteral">    &lt;hr&gt;</span>
+<span class="stringliteral">    &lt;address&gt;</span>
+<span class="stringliteral">      phpCAS __PHPCAS_VERSION__, </span>
+<span class="stringliteral">      CAS __CAS_VERSION__ (__SERVER_BASE_URL__)</span>
+<span class="stringliteral">    &lt;/address&gt;</span>
+<span class="stringliteral">  &lt;/body&gt;</span>
+<span class="stringliteral">&lt;/html&gt;</span>
+<span class="stringliteral">&#39;</span>);
+
+
+<span class="comment">// force CAS authentication</span>
+<a name="a9"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+
+<span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+
+<span class="comment">// for this test, simply print that the authentication was successfull</span>
+?&gt;
+&lt;html&gt;
+  &lt;head&gt;
+    &lt;title&gt;<a name="_a10"></a><a class="code" href="classphpCAS.html">phpCAS</a> simple client with HTML output customization&lt;/title&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+    &lt;h1&gt;Successfull Authentication!&lt;/h1&gt;
+    &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+    &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">    &lt;p&gt;phpCAS version is &lt;b&gt;&lt;?php echo phpCAS::getVersion(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">  &lt;/body&gt;</span>
+<span class="stringliteral">&lt;/html&gt;</span>
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_lang_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_lang_8php-example.html
new file mode 100644
index 00000000..607cab34
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_lang_8php-example.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_lang.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_lang.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Example that changes language of phpcas pages</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+
+<span class="comment">// set the language to french</span>
+<a name="a7"></a><a class="code" href="group__publicLang.html#ga7eea67859bdfac8e89460a95f5bc961e">phpCAS::setLang</a>(<a class="code" href="group__publicLang.html#ga2625c23a266bd8018ac7ed2dd8bc592c">PHPCAS_LANG_FRENCH</a>);
+
+<span class="comment">// force CAS authentication</span>
+<a name="a8"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+
+<span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+
+<span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<span class="comment">// permit to gain accesses to new services.</span>
+
+<span class="comment">// for this test, simply print that the authentication was successfull</span>
+?&gt;
+&lt;html&gt;
+  &lt;head&gt;
+    &lt;title&gt;Exemple d<span class="stringliteral">&#39;internationalisation de phpCAS&lt;/title&gt;</span>
+<span class="stringliteral">  &lt;/head&gt;</span>
+<span class="stringliteral">  &lt;body&gt;</span>
+<span class="stringliteral">    &lt;h1&gt;Authentification r&amp;eacute;ussie&amp;nbsp;!&lt;/h1&gt;</span>
+<span class="stringliteral">    &lt;?php include &#39;</span>script_info.php<span class="stringliteral">&#39; ?&gt;</span>
+<span class="stringliteral">    &lt;p&gt;L&#39;</span>utilisateur connect&amp;eacute; est &lt;b&gt;&lt;?php echo <a name="a9"></a><a class="code" href="group__publicAuth.html#ga4c9f984b474b550cf316396e87670b18">phpCAS::getUser</a>(); ?&gt;&lt;/b&gt;.&lt;/p&gt;
+    &lt;p&gt;La version de <a name="_a10"></a><a class="code" href="classphpCAS.html">phpCAS</a> est &lt;b&gt;&lt;?php echo <a name="a11"></a><a class="code" href="group__public.html#ga5c971143e0c319b1268233907ca193b9">phpCAS::getVersion</a>(); ?&gt;&lt;/b&gt;.&lt;/p&gt;
+  &lt;/body&gt;
+&lt;/html&gt;
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_logout_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_logout_8php-example.html
new file mode 100644
index 00000000..2b477467
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_logout_8php-example.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_logout.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_logout.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Example for handling logout requests</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+
+<span class="comment">// handle incoming logout requests</span>
+<a name="a7"></a><a class="code" href="group__publicAuth.html#ga33a0cf0299f96e23893ce4ff6cc76584">phpCAS::handleLogoutRequests</a>();
+
+<span class="comment">// Or as an advanced featue handle SAML logout requests that emanate from the CAS host exclusively.</span>
+<span class="comment">// Failure to restrict SAML logout requests to authorized hosts could</span>
+<span class="comment">// allow denial of service attacks where at the least the server is</span>
+<span class="comment">// tied up parsing bogus XML messages.</span>
+<span class="comment">// phpCAS::handleLogoutRequests(true, $cas_real_hosts);</span>
+
+
+<span class="comment">// force CAS authentication</span>
+<a name="a8"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+
+<span class="comment">// for this test, simply print that the authentication was successfull</span>
+?&gt;
+&lt;html&gt;
+  &lt;head&gt;
+    &lt;title&gt;<a name="_a9"></a><a class="code" href="classphpCAS.html">phpCAS</a> simple client&lt;/title&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+    &lt;h1&gt;Successfull Authentication!&lt;/h1&gt;
+    &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+    &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">    &lt;p&gt;phpCAS version is &lt;b&gt;&lt;?php echo phpCAS::getVersion(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">  &lt;/body&gt;</span>
+<span class="stringliteral">&lt;/html&gt;</span>
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_pgt_storage_file_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_pgt_storage_file_8php-example.html
new file mode 100644
index 00000000..40be56eb
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_pgt_storage_file_8php-example.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_pgt_storage_file.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_pgt_storage_file.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Example that changes the storage of the pgt tickets</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS::proxy</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+
+<span class="comment">// set PGT storage to file in plain format in the same directory as session files</span>
+<a name="a7"></a><a class="code" href="group__publicPGTStorage.html#gafad174fa82241a2d6aef2d7be15fa387">phpCAS::setPGTStorageFile</a>(<span class="stringliteral">&#39;plain&#39;</span>,session_save_path());
+
+<span class="comment">// force CAS authentication</span>
+<a name="a8"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+
+<span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+
+<span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<span class="comment">// permit to gain accesses to new services.</span>
+
+?&gt;
+&lt;html&gt;
+  &lt;head&gt;
+    &lt;title&gt;<a name="_a9"></a><a class="code" href="classphpCAS.html">phpCAS</a> proxy example with PGT storage to file&lt;/title&gt;
+    &lt;link rel=<span class="stringliteral">&quot;stylesheet&quot;</span> type=<span class="stringliteral">&#39;text/css&#39;</span> href=<span class="stringliteral">&#39;example.css&#39;</span>/&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+    &lt;h1&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxy example with PGT storage to file&lt;/h1&gt;
+    &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+    &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">    &lt;h2&gt;Response from service &lt;?php echo $serviceUrl; ?&gt;&lt;/h2&gt;</span>
+<span class="stringliteral">&lt;?php</span>
+<span class="stringliteral">  flush();</span>
+<span class="stringliteral">  // call a service and change the color depending on the result</span>
+<span class="stringliteral">  if ( phpCAS::serviceWeb($serviceUrl,$err_code,$output) ) {</span>
+<span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;success&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">  } else {</span>
+<span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">  }</span>
+<span class="stringliteral">  echo $output;</span>
+<span class="stringliteral">  echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">?&gt;</span>
+<span class="stringliteral">  &lt;/body&gt;</span>
+<span class="stringliteral">&lt;/html&gt;</span>
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_proxy_GET_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_proxy_GET_8php-example.html
new file mode 100644
index 00000000..a97daf98
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_proxy_GET_8php-example.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_proxy_GET.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_proxy_GET.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Example for a proxy that makes a GET request.</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS::proxy</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+
+<span class="comment">// force CAS authentication</span>
+<a name="a7"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+
+<span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+
+<span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<span class="comment">// permit to gain accesses to new services.</span>
+
+?&gt;
+&lt;html&gt;
+  &lt;head&gt;
+    &lt;title&gt;<a name="_a8"></a><a class="code" href="classphpCAS.html">phpCAS</a> proxy example #2&lt;/title&gt;
+    &lt;link rel=<span class="stringliteral">&quot;stylesheet&quot;</span> type=<span class="stringliteral">&#39;text/css&#39;</span> href=<span class="stringliteral">&#39;example.css&#39;</span>/&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+    &lt;h1&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxied proxy example&lt;/h1&gt;
+    &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+    &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">    &lt;h2&gt;Response from service &lt;?php echo $serviceUrl; ?&gt;&lt;/h2&gt;</span>
+<span class="stringliteral">&lt;?php</span>
+<span class="stringliteral">        flush();</span>
+<span class="stringliteral">        </span>
+<span class="stringliteral">        // call a service and change the color depending on the result</span>
+<span class="stringliteral">        try {</span>
+<span class="stringliteral">                $service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_GET);</span>
+<span class="stringliteral">                $service-&gt;setUrl($serviceUrl);</span>
+<span class="stringliteral">                $service-&gt;send();</span>
+<span class="stringliteral">                if ($service-&gt;getResponseStatusCode() == 200) {</span>
+<span class="stringliteral">                        echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;success&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">                        echo $service-&gt;getResponseBody();</span>
+<span class="stringliteral">                        echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">                } else {</span>
+<span class="stringliteral">                        // The service responded with an error code 404, 500, etc.</span>
+<span class="stringliteral">                        echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">                        echo &#39;</span>The service responded with a <span class="stringliteral">&#39;.$service-&gt;getResponseStatusCode().&#39;</span> error.<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">                        echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">                }</span>
+<span class="stringliteral">        } catch (CAS_ProxyTicketException $e) {</span>
+<span class="stringliteral">                if ($e-&gt;getCode() == PHPCAS_SERVICE_PT_FAILURE) {</span>
+<span class="stringliteral">                        echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">                        echo &quot;Your login has timed out. You need to log in again.&quot;;</span>
+<span class="stringliteral">                        echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">                } else</span>
+<span class="stringliteral">                        // Other proxy ticket errors are from bad request format (shouldn&#39;</span>t happen)
+                        <span class="comment">// or CAS server failure (unlikely) so lets just stop if we hit those.</span>
+                        <span class="keywordflow">throw</span> $e; 
+        } <span class="keywordflow">catch</span> (<a name="_a9"></a><a class="code" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a> $e) {
+                <span class="comment">// Something prevented the service request from being sent or received.</span>
+                <span class="comment">// We didn&#39;t even get a valid error response (404, 500, etc), so this</span>
+                <span class="comment">// might be caused by a network error or a DNS resolution failure.</span>
+                <span class="comment">// We could handle it in some way, but for now we will just stop.</span>
+                <span class="keywordflow">throw</span> $e;
+        }
+        
+        
+?&gt;
+  &lt;/body&gt;
+&lt;/html&gt;
+
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_proxy_POST_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_proxy_POST_8php-example.html
new file mode 100644
index 00000000..0f4fd040
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_proxy_POST_8php-example.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_proxy_POST.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_proxy_POST.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Example for a proxy that makes a GET request.</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS::proxy</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+
+<span class="comment">// force CAS authentication</span>
+<a name="a7"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+
+<span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+
+<span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<span class="comment">// permit to gain accesses to new services.</span>
+
+<a name="a8"></a><a class="code" href="config_8php.html#a92b2154d49731d7315ea689667265ec5">$serviceUrl</a> = $curbase.$curdir.<span class="stringliteral">&#39;example_service_POST.php&#39;</span>;
+
+?&gt;
+&lt;html&gt;
+  &lt;head&gt;
+    &lt;title&gt;<a name="_a9"></a><a class="code" href="classphpCAS.html">phpCAS</a> proxy POST example&lt;/title&gt;
+    &lt;link rel=<span class="stringliteral">&quot;stylesheet&quot;</span> type=<span class="stringliteral">&#39;text/css&#39;</span> href=<span class="stringliteral">&#39;example.css&#39;</span>/&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+    &lt;h1&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxy POST example&lt;/h1&gt;
+    &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+    &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">    &lt;h2&gt;Response from service &lt;?php echo $serviceUrl; ?&gt;&lt;/h2&gt;</span>
+<span class="stringliteral">&lt;?php</span>
+<span class="stringliteral">        flush();</span>
+<span class="stringliteral">        </span>
+<span class="stringliteral">        // call a service and change the color depending on the result</span>
+<span class="stringliteral">        try {</span>
+<span class="stringliteral">                $service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_POST);</span>
+<span class="stringliteral">                $service-&gt;setUrl($serviceUrl);</span>
+<span class="stringliteral">                $service-&gt;setContentType(&#39;</span>application/x-www-form-urlencoded<span class="stringliteral">&#39;);</span>
+<span class="stringliteral">                $service-&gt;setBody(&#39;</span>favorite_color=blue<span class="stringliteral">&#39;);</span>
+<span class="stringliteral">                $service-&gt;send();</span>
+<span class="stringliteral">                if ($service-&gt;getResponseStatusCode() == 200) {</span>
+<span class="stringliteral">                        echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;success&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">                        echo $service-&gt;getResponseBody();</span>
+<span class="stringliteral">                        echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">                } else {</span>
+<span class="stringliteral">                        // The service responded with an error code 404, 500, etc.</span>
+<span class="stringliteral">                        echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">                        echo &#39;</span>The service responded with a <span class="stringliteral">&#39;.$service-&gt;getResponseStatusCode().&#39;</span> error.<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">                        echo $service-&gt;getResponseBody();</span>
+<span class="stringliteral">                        echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">                }</span>
+<span class="stringliteral">        } catch (CAS_ProxyTicketException $e) {</span>
+<span class="stringliteral">                if ($e-&gt;getCode() == PHPCAS_SERVICE_PT_FAILURE) {</span>
+<span class="stringliteral">                        echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">                        echo &quot;Your login has timed out. You need to log in again.&quot;;</span>
+<span class="stringliteral">                        echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">                } else</span>
+<span class="stringliteral">                        // Other proxy ticket errors are from bad request format (shouldn&#39;</span>t happen)
+                        <span class="comment">// or CAS server failure (unlikely) so lets just stop if we hit those.</span>
+                        <span class="keywordflow">throw</span> $e; 
+        } <span class="keywordflow">catch</span> (<a name="_a10"></a><a class="code" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a> $e) {
+                <span class="comment">// Something prevented the service request from being sent or received.</span>
+                <span class="comment">// We didn&#39;t even get a valid error response (404, 500, etc), so this</span>
+                <span class="comment">// might be caused by a network error or a DNS resolution failure.</span>
+                <span class="comment">// We could handle it in some way, but for now we will just stop.</span>
+                <span class="keywordflow">throw</span> $e;
+        }
+        
+        
+?&gt;
+  &lt;/body&gt;
+&lt;/html&gt;
+
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_proxy_serviceWeb_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_proxy_serviceWeb_8php-example.html
new file mode 100644
index 00000000..b48bc42d
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_proxy_serviceWeb_8php-example.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_proxy_serviceWeb.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_proxy_serviceWeb.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Example for a proxy with session usage</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS::proxy</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+
+<span class="comment">// force CAS authentication</span>
+<a name="a7"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+
+<span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+
+<span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<span class="comment">// permit to gain accesses to new services.</span>
+
+?&gt;
+&lt;html&gt;
+  &lt;head&gt;
+    &lt;title&gt;<a name="_a8"></a><a class="code" href="classphpCAS.html">phpCAS</a> proxied proxy example (with sessioning)&lt;/title&gt;
+    &lt;link rel=<span class="stringliteral">&quot;stylesheet&quot;</span> type=<span class="stringliteral">&#39;text/css&#39;</span> href=<span class="stringliteral">&#39;example.css&#39;</span>/&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+    &lt;h1&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxied proxy example (with sessioning)&lt;/h1&gt;
+    &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+    &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">    &lt;h2&gt;Response from service &lt;?php echo $serviceUrl; ?&gt;&lt;/h2&gt;</span>
+<span class="stringliteral">&lt;?php</span>
+<span class="stringliteral">  flush();</span>
+<span class="stringliteral">  // call a service and change the color depending on the result</span>
+<span class="stringliteral">  if ( phpCAS::serviceWeb($serviceUrl,$err_code,$output) ) {</span>
+<span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;success&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">  } else {</span>
+<span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">  }</span>
+<span class="stringliteral">  echo $output;</span>
+<span class="stringliteral">  echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">?&gt;</span>
+<span class="stringliteral">  &lt;/body&gt;</span>
+<span class="stringliteral">&lt;/html&gt;</span>
+<span class="stringliteral"></span>
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_proxy_serviceWeb_chaining_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_proxy_serviceWeb_chaining_8php-example.html
new file mode 100644
index 00000000..1670683e
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_proxy_serviceWeb_chaining_8php-example.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_proxy_serviceWeb_chaining.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_proxy_serviceWeb_chaining.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Example for a proxy with session usage</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS::proxy</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+
+<span class="comment">// force CAS authentication</span>
+<a name="a7"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+
+<span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+
+<span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<span class="comment">// permit to gain accesses to new services.</span>
+
+?&gt;
+&lt;html&gt;
+  &lt;head&gt;
+    &lt;title&gt;<a name="_a8"></a><a class="code" href="classphpCAS.html">phpCAS</a> proxy example #2&lt;/title&gt;
+    &lt;link rel=<span class="stringliteral">&quot;stylesheet&quot;</span> type=<span class="stringliteral">&#39;text/css&#39;</span> href=<span class="stringliteral">&#39;example.css&#39;</span>/&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+    &lt;h1&gt;<a class="code" href="classphpCAS.html">phpCAS</a> proxied proxy example&lt;/h1&gt;
+    &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+    &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">    &lt;h2&gt;Response from service &lt;?php echo $serviceUrl2; ?&gt;&lt;/h2&gt;</span>
+<span class="stringliteral">&lt;?php</span>
+<span class="stringliteral">  flush();</span>
+<span class="stringliteral">  // call a service and change the color depending on the result</span>
+<span class="stringliteral">  if ( phpCAS::serviceWeb($serviceUrl2,$err_code,$output) ) {</span>
+<span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;success&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">  } else {</span>
+<span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">  }</span>
+<span class="stringliteral">  echo $output;</span>
+<span class="stringliteral">  echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">?&gt;</span>
+<span class="stringliteral">  &lt;/body&gt;</span>
+<span class="stringliteral">&lt;/html&gt;</span>
+<span class="stringliteral"></span>
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_service_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_service_8php-example.html
new file mode 100644
index 00000000..a2977603
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_service_8php-example.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_service.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_service.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Example for proxied service with session support</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+
+<span class="comment">// force CAS authentication</span>
+<a name="a7"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+
+<a name="a8"></a><a class="code" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">print</a> <span class="stringliteral">&#39;&lt;h1&gt;I am a service that can be proxied.&lt;/h1&gt;&#39;</span>;
+
+<span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+include <span class="stringliteral">&#39;script_info.php&#39;</span>;
+
+<span class="comment">// for this test, simply print that the authentication was successfull</span>
+echo <span class="stringliteral">&#39;&lt;p&gt;The user\&#39;s login is &lt;b&gt;&#39;</span>.phpCAS::getUser().<span class="stringliteral">&#39;&lt;/b&gt;.&lt;/p&gt;&#39;</span>;
+
+<span class="comment">// increment the number of requests of the session and print it</span>
+<span class="keywordflow">if</span> (!isset($_SESSION[<span class="charliteral">&#39;n&#39;</span>]))
+        $_SESSION[<span class="charliteral">&#39;n&#39;</span>] = 0;
+echo <span class="stringliteral">&#39;&lt;p&gt;request #&#39;</span>.(++$_SESSION[<span class="charliteral">&#39;n&#39;</span>]).<span class="stringliteral">&#39;&lt;/p&gt;&#39;</span>;
+
+?&gt;
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_service_POST_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_service_POST_8php-example.html
new file mode 100644
index 00000000..570f7234
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_service_POST_8php-example.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_service_POST.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_service_POST.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Example for proxied service with session support</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+
+<span class="comment">// force CAS authentication</span>
+<a name="a7"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+
+<span class="keywordflow">if</span> ($_SERVER[<span class="stringliteral">&#39;REQUEST_METHOD&#39;</span>] != <span class="stringliteral">&#39;POST&#39;</span>) {
+        header(<span class="stringliteral">&#39;HTTP/1.1 400 Bad Request&#39;</span>);
+        <a name="a8"></a><a class="code" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">print</a> <span class="stringliteral">&quot;&lt;h1&gt;I only respond to POST requests. This is a &quot;</span>.$_SERVER[<span class="stringliteral">&#39;REQUEST_METHOD&#39;</span>].<span class="stringliteral">&quot; request.&lt;/h1&gt;&quot;</span>;
+        exit;
+}
+<span class="keywordflow">if</span> (empty($_POST[<span class="stringliteral">&#39;favorite_color&#39;</span>])) {
+        header(<span class="stringliteral">&#39;HTTP/1.1 400 Bad Request&#39;</span>);
+        <a class="code" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">print</a> <span class="stringliteral">&#39;&lt;h1&gt;You must post a &lt;strong&gt;favorite_color&lt;/strong&gt;.&lt;/h1&gt;&#39;</span>;
+        exit;
+}
+
+<a class="code" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">print</a> <span class="stringliteral">&#39;&lt;h1&gt;I am a service that responds to POST requests.&lt;/h1&gt;&#39;</span>;
+
+<span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+include <span class="stringliteral">&#39;script_info.php&#39;</span>;
+
+<span class="comment">// for this test, simply print that the authentication was successfull</span>
+echo <span class="stringliteral">&#39;&lt;p&gt;The user\&#39;s login is &lt;b&gt;&#39;</span>.phpCAS::getUser().<span class="stringliteral">&#39;&lt;/b&gt;.&lt;/p&gt;&#39;</span>;
+
+<a class="code" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">print</a> <span class="stringliteral">&#39;&lt;h1&gt;Your favorite color is &#39;</span>.htmlentities($_POST[<span class="stringliteral">&#39;favorite_color&#39;</span>]).<span class="stringliteral">&#39;&lt;/h1&gt;&#39;</span>;
+
+<span class="comment">// increment the number of requests of the session and print it</span>
+<span class="keywordflow">if</span> (!isset($_SESSION[<span class="charliteral">&#39;n&#39;</span>]))
+        $_SESSION[<span class="charliteral">&#39;n&#39;</span>] = 0;
+echo <span class="stringliteral">&#39;&lt;p&gt;request #&#39;</span>.(++$_SESSION[<span class="charliteral">&#39;n&#39;</span>]).<span class="stringliteral">&#39;&lt;/p&gt;&#39;</span>;
+
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_service_that_proxies_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_service_that_proxies_8php-example.html
new file mode 100644
index 00000000..b8853d1b
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_service_that_proxies_8php-example.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_service_that_proxies.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_service_that_proxies.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Example for a proxied proxy</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS::proxy</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+
+<span class="comment">// force CAS authentication</span>
+<a name="a7"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+
+<span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+
+<span class="comment">// moreover, a PGT was retrieved from the CAS server that will</span>
+<span class="comment">// permit to gain accesses to new services.</span>
+
+
+
+?&gt;
+&lt;html&gt;
+  &lt;head&gt;
+    &lt;title&gt;<a name="_a8"></a><a class="code" href="classphpCAS.html">phpCAS</a> proxied proxy service example&lt;/title&gt;
+    &lt;link rel=<span class="stringliteral">&quot;stylesheet&quot;</span> type=<span class="stringliteral">&#39;text/css&#39;</span> href=<span class="stringliteral">&#39;example.css&#39;</span>/&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+    &lt;h1&gt;I am a service that can be proxied. In turn, I proxy another service.&lt;/h1&gt;
+    &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+    &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">    &lt;h2&gt;Response from service &lt;?php echo $serviceUrl; ?&gt;&lt;/h2&gt;</span>
+<span class="stringliteral">&lt;?php</span>
+<span class="stringliteral">  flush();</span>
+<span class="stringliteral">  // call a service and change the color depending on the result</span>
+<span class="stringliteral">  if ( phpCAS::serviceWeb($serviceUrl,$err_code,$output) ) {</span>
+<span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;success&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">  } else {</span>
+<span class="stringliteral">    echo &#39;</span>&lt;div <span class="keyword">class</span>=<span class="stringliteral">&quot;error&quot;</span>&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">  }</span>
+<span class="stringliteral">  echo $output;</span>
+<span class="stringliteral">  echo &#39;</span>&lt;/div&gt;<span class="stringliteral">&#39;;</span>
+<span class="stringliteral">?&gt;</span>
+<span class="stringliteral">  &lt;/body&gt;</span>
+<span class="stringliteral">&lt;/html&gt;</span>
+<span class="stringliteral"></span>
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_simple_8php-example.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_simple_8php-example.html
new file mode 100644
index 00000000..554df875
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/example_simple_8php-example.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: example_simple.php</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>example_simple.php</h1>  </div>
+</div>
+<div class="contents">
+<div class="fragment"><pre class="fragment">&lt;?php
+<span class="comment">// Example for a simple client</span>
+
+<span class="comment">// Load the settings from the central config file</span>
+include_once(<span class="stringliteral">&#39;config.php&#39;</span>);
+<span class="comment">// Load the CAS lib</span>
+include_once(<a name="a0"></a><a class="code" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">$phpcas_path</a>.<span class="stringliteral">&#39;/CAS.php&#39;</span>);
+
+<span class="comment">// Uncomment to enable debugging</span>
+<a name="a1"></a><a class="code" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a>();
+
+<span class="comment">// Initialize phpCAS</span>
+<a name="a2"></a><a class="code" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a>(<a class="code" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a>, <a name="a3"></a><a class="code" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">$cas_host</a>, <a name="a4"></a><a class="code" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">$cas_port</a>, <a name="a5"></a><a class="code" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">$cas_context</a>);
+
+<span class="comment">// For production use set the CA certificate that is the issuer of the cert </span>
+<span class="comment">// on the CAS server and uncomment the line below</span>
+<span class="comment">// phpCAS::setCasServerCACert($cas_server_ca_cert_path);</span>
+
+<span class="comment">// For quick testing you can disable SSL validation of the CAS server. </span>
+<span class="comment">// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. </span>
+<span class="comment">// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! </span>
+<a name="a6"></a><a class="code" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a>();
+
+<span class="comment">// force CAS authentication</span>
+<a name="a7"></a><a class="code" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a>();
+
+<span class="comment">// at this step, the user has been authenticated by the CAS server</span>
+<span class="comment">// and the user&#39;s login name can be read with phpCAS::getUser().</span>
+
+<span class="comment">// logout if desired</span>
+<span class="keywordflow">if</span> (isset($_REQUEST[<span class="stringliteral">&#39;logout&#39;</span>])) {
+        <a name="a8"></a><a class="code" href="group__publicAuth.html#ga9989272833c5170c3b7c7027beab795b">phpCAS::logout</a>();
+}
+
+<span class="comment">// for this test, simply print that the authentication was successfull</span>
+?&gt;
+&lt;html&gt;
+  &lt;head&gt;
+    &lt;title&gt;<a name="_a9"></a><a class="code" href="classphpCAS.html">phpCAS</a> simple client&lt;/title&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+    &lt;h1&gt;Successfull Authentication!&lt;/h1&gt;
+    &lt;?php include <span class="stringliteral">&#39;script_info.php&#39;</span> ?&gt;
+    &lt;p&gt;the user<span class="stringliteral">&#39;s login is &lt;b&gt;&lt;?php echo phpCAS::getUser(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">    &lt;p&gt;phpCAS version is &lt;b&gt;&lt;?php echo phpCAS::getVersion(); ?&gt;&lt;/b&gt;.&lt;/p&gt;</span>
+<span class="stringliteral">    &lt;p&gt;&lt;a href=&quot;?logout=&quot;&gt;Logout&lt;/a&gt;&lt;/p&gt;</span>
+<span class="stringliteral">  &lt;/body&gt;</span>
+<span class="stringliteral">&lt;/html&gt;</span>
+</pre></div> </div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/examples.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/examples.html
new file mode 100644
index 00000000..67e7a83a
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/examples.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Examples</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li class="current"><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Examples</h1>  </div>
+</div>
+<div class="contents">
+Here is a list of all examples:<ul>
+<li><a class="el" href="example_advanced_saml11_8php-example.html">example_advanced_saml11.php</a></li>
+
+<li><a class="el" href="example_custom_urls_8php-example.html">example_custom_urls.php</a></li>
+
+<li><a class="el" href="example_gateway_8php-example.html">example_gateway.php</a></li>
+
+<li><a class="el" href="example_html_8php-example.html">example_html.php</a></li>
+
+<li><a class="el" href="example_lang_8php-example.html">example_lang.php</a></li>
+
+<li><a class="el" href="example_logout_8php-example.html">example_logout.php</a></li>
+
+<li><a class="el" href="example_pgt_storage_file_8php-example.html">example_pgt_storage_file.php</a></li>
+
+<li><a class="el" href="example_proxy_GET_8php-example.html">example_proxy_GET.php</a></li>
+
+<li><a class="el" href="example_proxy_POST_8php-example.html">example_proxy_POST.php</a></li>
+
+<li><a class="el" href="example_proxy_serviceWeb_8php-example.html">example_proxy_serviceWeb.php</a></li>
+
+<li><a class="el" href="example_proxy_serviceWeb_chaining_8php-example.html">example_proxy_serviceWeb_chaining.php</a></li>
+
+<li><a class="el" href="example_service_8php-example.html">example_service.php</a></li>
+
+<li><a class="el" href="example_service_POST_8php-example.html">example_service_POST.php</a></li>
+
+<li><a class="el" href="example_service_that_proxies_8php-example.html">example_service_that_proxies.php</a></li>
+
+<li><a class="el" href="example_simple_8php-example.html">example_simple.php</a></li>
+
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/files.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/files.html
new file mode 100644
index 00000000..6fc16e3c
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/files.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: File Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>File List</h1>  </div>
+</div>
+<div class="contents">
+Here is a list of all files with brief descriptions:<table>
+  <tr><td class="indexkey"><a class="el" href="CAS_8php.html">CAS.php</a> <a href="CAS_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/<a class="el" href="Client_8php.html">Client.php</a> <a href="Client_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/<a class="el" href="CookieJar_8php.html">CookieJar.php</a> <a href="CookieJar_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/<a class="el" href="Exception_8php.html">Exception.php</a> <a href="Exception_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/<a class="el" href="InvalidArgumentException_8php.html">InvalidArgumentException.php</a> <a href="InvalidArgumentException_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/<a class="el" href="OutOfSequenceException_8php.html">OutOfSequenceException.php</a> <a href="OutOfSequenceException_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/<a class="el" href="ProxiedService_8php.html">ProxiedService.php</a> <a href="ProxiedService_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/<a class="el" href="ProxyTicketException_8php.html">ProxyTicketException.php</a> <a href="ProxyTicketException_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/languages/<a class="el" href="catalan_8php.html">catalan.php</a> <a href="catalan_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/languages/<a class="el" href="english_8php.html">english.php</a> <a href="english_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/languages/<a class="el" href="french_8php.html">french.php</a> <a href="french_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/languages/<a class="el" href="german_8php.html">german.php</a> <a href="german_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/languages/<a class="el" href="greek_8php.html">greek.php</a> <a href="greek_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/languages/<a class="el" href="japanese_8php.html">japanese.php</a> <a href="japanese_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/languages/<a class="el" href="languages_8php.html">languages.php</a> <a href="languages_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/languages/<a class="el" href="spanish_8php.html">spanish.php</a> <a href="spanish_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/PGTStorage/<a class="el" href="AbstractStorage_8php.html">AbstractStorage.php</a> <a href="AbstractStorage_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/PGTStorage/<a class="el" href="Db_8php.html">Db.php</a> <a href="Db_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/PGTStorage/<a class="el" href="File_8php.html">File.php</a> <a href="File_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/ProxiedService/<a class="el" href="Abstract_8php.html">Abstract.php</a> <a href="Abstract_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/ProxiedService/<a class="el" href="ProxiedService_2Exception_8php.html">Exception.php</a> <a href="ProxiedService_2Exception_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/ProxiedService/<a class="el" href="Http_8php.html">Http.php</a> <a href="Http_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/ProxiedService/<a class="el" href="Imap_8php.html">Imap.php</a> <a href="Imap_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/ProxiedService/<a class="el" href="Testable_8php.html">Testable.php</a> <a href="Testable_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/ProxiedService/Http/<a class="el" href="Http_2Abstract_8php.html">Abstract.php</a> <a href="Http_2Abstract_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/ProxiedService/Http/<a class="el" href="Get_8php.html">Get.php</a> <a href="Get_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/ProxiedService/Http/<a class="el" href="Post_8php.html">Post.php</a> <a href="Post_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/Request/<a class="el" href="AbstractRequest_8php.html">AbstractRequest.php</a> <a href="AbstractRequest_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/Request/<a class="el" href="CurlRequest_8php.html">CurlRequest.php</a> <a href="CurlRequest_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/Request/<a class="el" href="Request_2Exception_8php.html">Exception.php</a> <a href="Request_2Exception_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">CAS/Request/<a class="el" href="RequestInterface_8php.html">RequestInterface.php</a> <a href="RequestInterface_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="config_8php.html">config.php</a> <a href="config_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__advanced__saml11_8php.html">example_advanced_saml11.php</a> <a href="example__advanced__saml11_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__custom__urls_8php.html">example_custom_urls.php</a> <a href="example__custom__urls_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__gateway_8php.html">example_gateway.php</a> <a href="example__gateway_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__html_8php.html">example_html.php</a> <a href="example__html_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__lang_8php.html">example_lang.php</a> <a href="example__lang_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__logout_8php.html">example_logout.php</a> <a href="example__logout_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__pgt__storage__db_8php.html">example_pgt_storage_db.php</a> <a href="example__pgt__storage__db_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__pgt__storage__file_8php.html">example_pgt_storage_file.php</a> <a href="example__pgt__storage__file_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__proxy__GET_8php.html">example_proxy_GET.php</a> <a href="example__proxy__GET_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__proxy__POST_8php.html">example_proxy_POST.php</a> <a href="example__proxy__POST_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__proxy__serviceWeb_8php.html">example_proxy_serviceWeb.php</a> <a href="example__proxy__serviceWeb_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__proxy__serviceWeb__chaining_8php.html">example_proxy_serviceWeb_chaining.php</a> <a href="example__proxy__serviceWeb__chaining_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__service_8php.html">example_service.php</a> <a href="example__service_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__service__POST_8php.html">example_service_POST.php</a> <a href="example__service__POST_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__service__that__proxies_8php.html">example_service_that_proxies.php</a> <a href="example__service__that__proxies_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="example__simple_8php.html">example_simple.php</a> <a href="example__simple_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey">docs/examples/<a class="el" href="script__info_8php.html">script_info.php</a> <a href="script__info_8php_source.html">[code]</a></td><td class="indexvalue"></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/french_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/french_8php.html
new file mode 100644
index 00000000..484f9fff
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/french_8php.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/french.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>CAS/languages/french.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="french_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">$this&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="french_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a></td></tr>
+</table>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="a3e2715c2e334fb91d34437e4ff025f1f"></a><!-- doxytag: member="french.php::_strings" ref="a3e2715c2e334fb91d34437e4ff025f1f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$this <a class="el" href="spanish_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<b>Initial value:</b><div class="fragment"><pre class="fragment"> array(
+<a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a>
+=&gt; <span class="stringliteral">&#39;utilisant le serveur&#39;</span>,
+<a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a>
+=&gt; <span class="stringliteral">&#39;Authentication CAS n�cessaire&amp;nbsp;!&#39;</span>,
+<a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a>
+=&gt; <span class="stringliteral">&#39;D�connexion demand�e&amp;nbsp;!&#39;</span>,
+<a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a>
+=&gt; <span class="stringliteral">&#39;Vous auriez du etre redirig�(e) vers le serveur CAS. Cliquez &lt;a href=&quot;%s&quot;&gt;ici&lt;/a&gt; pour continuer.&#39;</span>,
+<a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a>
+=&gt; <span class="stringliteral">&#39;Authentification CAS infructueuse&amp;nbsp;!&#39;</span>,
+<a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a>
+=&gt; <span class="stringliteral">&#39;&lt;p&gt;Vous n\&#39;avez pas �t� authentifi�(e).&lt;/p&gt;&lt;p&gt;Vous pouvez soumettre votre requete � nouveau en cliquant &lt;a href=&quot;%s&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Si le probl�me persiste, vous pouvez contacter &lt;a href=&quot;mailto:%s&quot;&gt;l\&#39;administrateur de ce site&lt;/a&gt;.&lt;/p&gt;&#39;</span>,
+<a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>
+=&gt; <span class="stringliteral">&#39;Le service `&lt;b&gt;%s&lt;/b&gt;\&#39; est indisponible (&lt;b&gt;%s&lt;/b&gt;)&#39;</span>
+
+)
+</pre></div>
+<p>Definition at line <a class="el" href="french_8php_source.html#l00010">10</a> of file <a class="el" href="french_8php_source.html">french.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/french_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/french_8php_source.html
new file mode 100644
index 00000000..70e3b349
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/french_8php_source.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/french.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/languages/french.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="french_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 
+<a name="l00010"></a><a class="code" href="french_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">00010</a> $this-&gt;<a class="code" href="catalan_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a> = array(
+<a name="l00011"></a>00011 <a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a>
+<a name="l00012"></a>00012 =&gt; <span class="stringliteral">&#39;utilisant le serveur&#39;</span>,
+<a name="l00013"></a>00013 <a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a>
+<a name="l00014"></a>00014 =&gt; <span class="stringliteral">&#39;Authentication CAS n�cessaire&amp;nbsp;!&#39;</span>,
+<a name="l00015"></a>00015 <a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a>
+<a name="l00016"></a>00016 =&gt; <span class="stringliteral">&#39;D�connexion demand�e&amp;nbsp;!&#39;</span>,
+<a name="l00017"></a>00017 <a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a>
+<a name="l00018"></a>00018 =&gt; <span class="stringliteral">&#39;Vous auriez du etre redirig�(e) vers le serveur CAS. Cliquez &lt;a href=&quot;%s&quot;&gt;ici&lt;/a&gt; pour continuer.&#39;</span>,
+<a name="l00019"></a>00019 <a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a>
+<a name="l00020"></a>00020 =&gt; <span class="stringliteral">&#39;Authentification CAS infructueuse&amp;nbsp;!&#39;</span>,
+<a name="l00021"></a>00021 <a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a>
+<a name="l00022"></a>00022 =&gt; <span class="stringliteral">&#39;&lt;p&gt;Vous n\&#39;avez pas �t� authentifi�(e).&lt;/p&gt;&lt;p&gt;Vous pouvez soumettre votre requete � nouveau en cliquant &lt;a href=&quot;%s&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Si le probl�me persiste, vous pouvez contacter &lt;a href=&quot;mailto:%s&quot;&gt;l\&#39;administrateur de ce site&lt;/a&gt;.&lt;/p&gt;&#39;</span>,
+<a name="l00023"></a>00023 <a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>
+<a name="l00024"></a>00024 =&gt; <span class="stringliteral">&#39;Le service `&lt;b&gt;%s&lt;/b&gt;\&#39; est indisponible (&lt;b&gt;%s&lt;/b&gt;)&#39;</span>
+<a name="l00025"></a>00025 
+<a name="l00026"></a>00026 );
+<a name="l00027"></a>00027 
+<a name="l00028"></a>00028 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions.html
new file mode 100644
index 00000000..1f065779
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions.html
@@ -0,0 +1,269 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_0x24"></a>- $ -</h3><ul>
+<li>$_attributes
+: <a class="el" href="group__internalAuthentication.html#gab4713832a3000332ddb87a9689bc6a15">CAS_Client</a>
+</li>
+<li>$_body
+: <a class="el" href="classCAS__ProxiedService__Http__Post.html#a0e064cede54799dcf885dfdc807b1d72">CAS_ProxiedService_Http_Post</a>
+</li>
+<li>$_cache_times_for_auth_recheck
+: <a class="el" href="group__internalAuthentication.html#ga478decd824592dcf1abd27002559452c">CAS_Client</a>
+</li>
+<li>$_callback_mode
+: <a class="el" href="group__internalCallback.html#gaed4f8867a062dd1ece2e51e9ec31df58">CAS_Client</a>
+</li>
+<li>$_callback_url
+: <a class="el" href="group__internalCallback.html#ga4e021ea01bd0aebe95d458a5c7997747">CAS_Client</a>
+</li>
+<li>$_cas_server_ca_cert
+: <a class="el" href="group__internalBasic.html#ga17f31ab4f36a637672e5f23c895c4acf">CAS_Client</a>
+</li>
+<li>$_casClient
+: <a class="el" href="classCAS__ProxiedService__Abstract.html#aa0ae0bb2854d179f8d72756fe7894394">CAS_ProxiedService_Abstract</a>
+</li>
+<li>$_clearTicketsFromUrl
+: <a class="el" href="group__internalBehave.html#ga46713aa9224ac1fb8789a48dca4b988c">CAS_Client</a>
+</li>
+<li>$_contentType
+: <a class="el" href="classCAS__ProxiedService__Http__Post.html#a7c0840bde188bed301609ca92b77efcb">CAS_ProxiedService_Http_Post</a>
+</li>
+<li>$_cookieJar
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#ab730aea3d2b79064c658abedbcc42943">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>$_cookies
+: <a class="el" href="classCAS__CookieJar.html#af9d334b3919452f41285c455704f9aef">CAS_CookieJar</a>
+</li>
+<li>$_curl_headers
+: <a class="el" href="group__internalMisc.html#ga2b0b79203463993ca19271ce06eb57df">CAS_Client</a>
+</li>
+<li>$_curl_options
+: <a class="el" href="group__internalConfig.html#gaf9dfac02c509a43b201bbfccf7402c94">CAS_Client</a>
+</li>
+<li>$_dsn
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#gaf411a0dde3a26af1136ced781eda9ce4">CAS_PGTStorage_Db</a>
+</li>
+<li>$_errMode
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga3c6c1256599c435efbab44881c8ec88c">CAS_PGTStorage_Db</a>
+</li>
+<li>$_error_message
+: <a class="el" href="group__internalPGTStorage.html#ga90ed7dc15a9c24154900bccc2ea5925d">CAS_PGTStorage_AbstractStorage</a>
+</li>
+<li>$_exitOnAuthError
+: <a class="el" href="group__internalBehave.html#ga70bec4461feb938a60eb0c70792d8aba">CAS_Client</a>
+</li>
+<li>$_initialized
+: <a class="el" href="group__internalPGTStorage.html#ga5bab9d6ccaeca2cbcc04ab1a2c0e4d16">CAS_PGTStorage_AbstractStorage</a>
+</li>
+<li>$_lang
+: <a class="el" href="group__internalLang.html#ga38abc1fb5f662312e367c8b8bad449c5">CAS_Client</a>
+</li>
+<li>$_mailbox
+: <a class="el" href="classCAS__ProxiedService__Imap.html#aa966d995726481c804be491db720d6fd">CAS_ProxiedService_Imap</a>
+</li>
+<li>$_no_cas_server_validation
+: <a class="el" href="group__internalBasic.html#gad410c54bdfd9b65f063bc9d52afae72d">CAS_Client</a>
+</li>
+<li>$_numRequests
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a186d09097c0291a981e0759a3b147b4e">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>$_options
+: <a class="el" href="classCAS__ProxiedService__Imap.html#a4b4476e2b7611e508dc6d948499a3dce">CAS_ProxiedService_Imap</a>
+</li>
+<li>$_output_footer
+: <a class="el" href="group__internalOutput.html#gaa90031f70e10981383b813385869f96e">CAS_Client</a>
+</li>
+<li>$_output_header
+: <a class="el" href="group__internalOutput.html#gaf411bbf487e36147d8835ea4337305a9">CAS_Client</a>
+</li>
+<li>$_password
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga9e7f285d618bb73b8d91496ebf1e6e83">CAS_PGTStorage_Db</a>
+</li>
+<li>$_path
+: <a class="el" href="group__internalPGTStorageFile.html#ga2808f4969d1a4310bcdaa7e02f0ea607">CAS_PGTStorage_File</a>
+</li>
+<li>$_pdo
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#gac156a575124a0b6f2722d8892909b51a">CAS_PGTStorage_Db</a>
+</li>
+<li>$_pgt
+: <a class="el" href="group__internalProxy.html#ga2c3d4f2d4cb694f1687f561e8483a4c9">CAS_Client</a>
+</li>
+<li>$_pgt_storage
+: <a class="el" href="group__internalPGTStorage.html#gad1f8471bde7999b0465c8f3f109a6aba">CAS_Client</a>
+</li>
+<li>$_postAuthenticateCallbackArgs
+: <a class="el" href="group__internalBehave.html#ga22b6717169f18156da150b60a59b2ded">CAS_Client</a>
+</li>
+<li>$_postAuthenticateCallbackFunction
+: <a class="el" href="group__internalBehave.html#gaed60210e7c5d6d398dd3277ca95ac657">CAS_Client</a>
+</li>
+<li>$_proxies
+: <a class="el" href="group__internalProxied.html#ga082ab34c6c2bf014314fe02504c4ad67">CAS_Client</a>
+</li>
+<li>$_proxy
+: <a class="el" href="group__internalProxy.html#ga93e5bc863e46e09173b578b79a45b760">CAS_Client</a>
+</li>
+<li>$_proxyTicket
+: <a class="el" href="classCAS__ProxiedService__Abstract.html#ab8c4883fd2ce6a059fdaaba258ecc521">CAS_ProxiedService_Abstract</a>
+</li>
+<li>$_pt
+: <a class="el" href="group__internalProxied.html#ga0345fd992cc17a481dd37e1d5c19f595">CAS_Client</a>
+</li>
+<li>$_requestHandler
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#acaa100e7268141dcd143f5ecc37320e9">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>$_requestImplementation
+: <a class="el" href="group__internalBehave.html#ga0c0b9532eb79b569e05c386642632bad">CAS_Client</a>
+</li>
+<li>$_responseBody
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa34f1b8b2524408a9e3f46704464d596">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>$_responseHeaders
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#afeb924a6df557c0bb60db7669f2cac36">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>$_responseStatusCode
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a91190f3df8797b6015cc19d44867e075">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>$_server
+: <a class="el" href="group__internalConfig.html#gaab876894f8f80166fdc3632274178a05">CAS_Client</a>
+</li>
+<li>$_serviceCookieJar
+: <a class="el" href="group__internalProxy.html#ga1f1bcaf4533a30cf236fc0b531aede62">CAS_Client</a>
+</li>
+<li>$_signoutCallbackArgs
+: <a class="el" href="group__internalBehave.html#ga3e2359bc41599cca4a89f6a06a3318d9">CAS_Client</a>
+</li>
+<li>$_signoutCallbackFunction
+: <a class="el" href="group__internalBehave.html#ga02105ca843402cbb747c693272dbec97">CAS_Client</a>
+</li>
+<li>$_st
+: <a class="el" href="group__internalBasic.html#ga0dbca451ba0b1bddbf02f5663ca83d1f">CAS_Client</a>
+</li>
+<li>$_start_session
+: <a class="el" href="group__internalConfig.html#ga345e16e8ff0427eea158d2b118f6c5d8">CAS_Client</a>
+</li>
+<li>$_stream
+: <a class="el" href="classCAS__ProxiedService__Imap.html#a15ac9a76b096f86951f83271c8ee869a">CAS_ProxiedService_Imap</a>
+</li>
+<li>$_strings
+: <a class="el" href="group__internalLang.html#ga66167ea1adb6c18e3141d8ca90df6044">CAS_Client</a>
+</li>
+<li>$_table
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga0d7548f5a7d2c6c5a91b044f89055641">CAS_PGTStorage_Db</a>
+</li>
+<li>$_table_options
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#gaeb3ecc301193541bd3aec19e9b71367b">CAS_PGTStorage_Db</a>
+</li>
+<li>$_url
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#afccfaa50645a8464363f43791bdaa43a">CAS_ProxiedService_Http_Abstract</a>
+, <a class="el" href="classCAS__ProxiedService__Imap.html#a2f542818b5f70dcd3e1a4ce7af84b2b9">CAS_ProxiedService_Imap</a>
+, <a class="el" href="group__internalMisc.html#gaed9c4090f713574a6df8fdc2e32409ca">CAS_Client</a>
+</li>
+<li>$_user
+: <a class="el" href="group__internalAuthentication.html#ga1edc9e777bc4dc2a5213f3000a85e019">CAS_Client</a>
+</li>
+<li>$_username
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga0cb86fcfcc709f502d6eac01389b2cca">CAS_PGTStorage_Db</a>
+, <a class="el" href="classCAS__ProxiedService__Imap.html#a93c53744acb8415e337707339e31b80f">CAS_ProxiedService_Imap</a>
+</li>
+<li>$caCertPath
+: <a class="el" href="classCAS__AbstractRequest.html#ae6a9874cd7a448aad2e2c4f1cadc219d">CAS_AbstractRequest</a>
+</li>
+<li>$cookies
+: <a class="el" href="classCAS__AbstractRequest.html#aac0a3f05ed0ede8440d471e6fac19d80">CAS_AbstractRequest</a>
+</li>
+<li>$curlOptions
+: <a class="el" href="classCAS__CurlRequest.html#a91dc734468fb10a927c7b86dbb5606d2">CAS_CurlRequest</a>
+</li>
+<li>$errorMessage
+: <a class="el" href="classCAS__AbstractRequest.html#aaeae803137d9e0853b4f74be77717746">CAS_AbstractRequest</a>
+</li>
+<li>$headers
+: <a class="el" href="classCAS__AbstractRequest.html#ab754b8d9e59974c4b11c849d8ac6880a">CAS_AbstractRequest</a>
+</li>
+<li>$isPost
+: <a class="el" href="classCAS__AbstractRequest.html#a575df6fa81b65ed3dffb3f5e12dad1db">CAS_AbstractRequest</a>
+</li>
+<li>$postBody
+: <a class="el" href="classCAS__AbstractRequest.html#a11ff9877605f46c02d157fe3d8e4ba13">CAS_AbstractRequest</a>
+</li>
+<li>$responseBody
+: <a class="el" href="classCAS__AbstractRequest.html#a99007554a5272f4d755981f6d9d60f8c">CAS_AbstractRequest</a>
+</li>
+<li>$responseHeaders
+: <a class="el" href="classCAS__AbstractRequest.html#affe123d99a4af63b66c3ed889421c471">CAS_AbstractRequest</a>
+</li>
+<li>$sent
+: <a class="el" href="classCAS__AbstractRequest.html#a9b557de521c65ab01b2dba5ecaaa9019">CAS_AbstractRequest</a>
+</li>
+<li>$url
+: <a class="el" href="classCAS__AbstractRequest.html#ab16b0fdb897db17ac1ff688e1d958de7">CAS_AbstractRequest</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x5f.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x5f.html
new file mode 100644
index 00000000..e8cd394b
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x5f.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li class="current"><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>__construct()
+: <a class="el" href="group__internalConfig.html#gadf63185159d9018b2e0bd31f5d2a06e7">CAS_Client</a>
+, <a class="el" href="classCAS__CookieJar.html#ab9f5a872c4bfdf47f5a5afb89d77a216">CAS_CookieJar</a>
+, <a class="el" href="group__internalCAS__PGTStorageDb.html#gafeb1ab0741a5ec3cd5eae2003464f457">CAS_PGTStorage_Db</a>
+, <a class="el" href="classCAS__ProxyTicketException.html#ad451fec20aa0b3b9cd3f8c711195bacd">CAS_ProxyTicketException</a>
+, <a class="el" href="group__internalPGTStorageFile.html#ga23f7f09dd29619bd2550562c36713473">CAS_PGTStorage_File</a>
+, <a class="el" href="group__internalPGTStorage.html#ga9ffd47d7bbf118b901bf1c449f4b20c2">CAS_PGTStorage_AbstractStorage</a>
+, <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#ab63e0a909fceda402baa3eeeacbdfde0">CAS_ProxiedService_Http_Abstract</a>
+, <a class="el" href="classCAS__ProxiedService__Imap.html#a8fdeebc729d0136f0417fed01a9347af">CAS_ProxiedService_Imap</a>
+</li>
+<li>_createTableSql()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#gae635e9f0b055b3004779294efb933976">CAS_PGTStorage_Db</a>
+</li>
+<li>_curl_read_headers()
+: <a class="el" href="group__internalMisc.html#ga26a5099cda64d77d48bbafd6f3ba10ae">CAS_Client</a>
+</li>
+<li>_curlReadHeaders()
+: <a class="el" href="classCAS__CurlRequest.html#a4238fbfb24854b910f8c83855c51f15b">CAS_CurlRequest</a>
+</li>
+<li>_deletePgtSql()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga57155c9d2f208404eb4ae55729559cd7">CAS_PGTStorage_Db</a>
+</li>
+<li>_retrievePgtSql()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga00f6c60f19bd223c0787a18f8ce7c703">CAS_PGTStorage_Db</a>
+</li>
+<li>_sendRequest()
+: <a class="el" href="classCAS__CurlRequest.html#aa4e10d6814c606547cec548e1f6fd18b">CAS_CurlRequest</a>
+, <a class="el" href="classCAS__AbstractRequest.html#a43e6cdeecffb2d9eacb6cf0c345903f5">CAS_AbstractRequest</a>
+</li>
+<li>_storePgtSql()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga316e6232a75c060e13ab495e163a3196">CAS_PGTStorage_Db</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x61.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x61.html
new file mode 100644
index 00000000..ebaf8b0f
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x61.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li class="current"><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>addAttributeToArray()
+: <a class="el" href="group__internalProxied.html#gabfbdb4ba817d27bf951b9bce6154f4f7">CAS_Client</a>
+</li>
+<li>addCookie()
+: <a class="el" href="classCAS__AbstractRequest.html#a2e29d483c57f1046e23571507a45d5f3">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#a9e0bbff9f3e6c5ffed093a19badff849">CAS_RequestInterface</a>
+</li>
+<li>addCookies()
+: <a class="el" href="classCAS__AbstractRequest.html#a6e8e852978e024cbf7ace013305fa189">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#ad11ecc76349ac2921f927451d89b2059">CAS_RequestInterface</a>
+</li>
+<li>addHeader()
+: <a class="el" href="interfaceCAS__RequestInterface.html#a01f51e770a063eb289ac12c03a5346e6">CAS_RequestInterface</a>
+, <a class="el" href="classCAS__AbstractRequest.html#adae53ccc81ddd2cb2fbeceba12fcb5d6">CAS_AbstractRequest</a>
+</li>
+<li>addHeaders()
+: <a class="el" href="classCAS__AbstractRequest.html#ab21afb8f694810cbc7f6111005f39e40">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#a1c2daa885fd39fce99cfd99837669132">CAS_RequestInterface</a>
+</li>
+<li>authError()
+: <a class="el" href="group__internalMisc.html#ga1d8d2502381f066a46433693f7eac14f">CAS_Client</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x62.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x62.html
new file mode 100644
index 00000000..06c17b67
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x62.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li class="current"><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>buildQueryUrl()
+: <a class="el" href="group__internalMisc.html#gac0540d05b6f1e0d67c43980abeece437">CAS_Client</a>
+</li>
+<li>buildSAMLPayload()
+: <a class="el" href="group__internalMisc.html#ga03ddc75a7cdf1f5ba02d4818e1e603b6">CAS_Client</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x63.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x63.html
new file mode 100644
index 00000000..b32b61f7
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x63.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li class="current"><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>callback()
+: <a class="el" href="group__internalCallback.html#ga7a7208da84825f761a76246080d12ec0">CAS_Client</a>
+</li>
+<li>checkAuthentication()
+: <a class="el" href="group__internalAuthentication.html#ga374ff1ed51254c75c6ed6bddc6765d2d">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga21fd1c2665d2e21c03e6a6dd1860cf4d">phpCAS</a>
+</li>
+<li>client()
+: <a class="el" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS</a>
+</li>
+<li>cookieMatchesTarget()
+: <a class="el" href="classCAS__CookieJar.html#a1a4419c2c934a7edbd380171bca6f7c2">CAS_CookieJar</a>
+</li>
+<li>createTable()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#gad007b1dbc652edfd508e1c0fc94b0f8b">CAS_PGTStorage_Db</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x64.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x64.html
new file mode 100644
index 00000000..33c3b1cd
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x64.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li class="current"><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>discardCookie()
+: <a class="el" href="classCAS__CookieJar.html#a5b957149a51af3f67cef6b2591591144">CAS_CookieJar</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x65.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x65.html
new file mode 100644
index 00000000..993a5c63
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x65.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li class="current"><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>error()
+: <a class="el" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS</a>
+</li>
+<li>expireCookies()
+: <a class="el" href="classCAS__CookieJar.html#a4a6e9f572711a19e53a1f6104f56fb8a">CAS_CookieJar</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x66.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x66.html
new file mode 100644
index 00000000..24f45125
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x66.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li class="current"><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>forceAuthentication()
+: <a class="el" href="group__internalAuthentication.html#gaf42af5d18c13a0df62b18c1cd54deaa0">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x67.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x67.html
new file mode 100644
index 00000000..dab87959
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x67.html
@@ -0,0 +1,226 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li class="current"><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>getAttribute()
+: <a class="el" href="group__internalAuthentication.html#ga4e16e6d440ee792bfa63e090b87fcef1">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga46f77015f5e206ad4956edae2905857c">phpCAS</a>
+</li>
+<li>getAttributes()
+: <a class="el" href="group__publicAuth.html#ga9972fbb286fe7e8d726b2e776b150233">phpCAS</a>
+, <a class="el" href="group__internalAuthentication.html#ga2c0120dc035c092f00b74a512fc78d4f">CAS_Client</a>
+</li>
+<li>getCallbackURL()
+: <a class="el" href="group__internalCallback.html#gaf4703672977711e0ecc3c616cc70215b">CAS_Client</a>
+</li>
+<li>getCookies()
+: <a class="el" href="classCAS__CookieJar.html#ac5d8875ce623ff288094f7167cc3ddbe">CAS_CookieJar</a>
+</li>
+<li>getErrorMessage()
+: <a class="el" href="classCAS__AbstractRequest.html#a2ef7ce228560085d1897b9283389a524">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#a1cc14181f19677291c1d4f0201b5e391">CAS_RequestInterface</a>
+, <a class="el" href="group__internalPGTStorage.html#ga68540ebebfe710140d16bab3ef1d61c1">CAS_PGTStorage_AbstractStorage</a>
+</li>
+<li>getImapProxyTicket()
+: <a class="el" href="classCAS__ProxiedService__Imap.html#ad93fa5f8b2cf87375c0838c2ef8ef3b8">CAS_ProxiedService_Imap</a>
+</li>
+<li>getLang()
+: <a class="el" href="group__internalLang.html#gab30d0e0fc8414be34c1f2a28649124d0">CAS_Client</a>
+</li>
+<li>getPath()
+: <a class="el" href="group__internalPGTStorageFile.html#ga85d57a19425e0850dbd81aa7afe6b7a7">CAS_PGTStorage_File</a>
+</li>
+<li>getPdo()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga20d1b72b4a5ffd6c162925cd614a0031">CAS_PGTStorage_Db</a>
+</li>
+<li>getPGT()
+: <a class="el" href="group__internalProxy.html#ga34d29abe0254d1b5752e4f3557865157">CAS_Client</a>
+</li>
+<li>getPGTIouFilename()
+: <a class="el" href="group__internalPGTStorageFile.html#ga0ea66347a5ab05db314d50c4212c867c">CAS_PGTStorage_File</a>
+</li>
+<li>getProxiedService()
+: <a class="el" href="group__internalProxyServices.html#ga2e0f5cb74d8116e3a9b9dc951f1cc3bf">CAS_Client</a>
+, <a class="el" href="group__publicServices.html#gaf3de7e9db40d6b15b6c8cb8dc8cb42eb">phpCAS</a>
+</li>
+<li>getProxies()
+: <a class="el" href="group__internalProxied.html#gac97879b556d2b09f5e3b6ba2bfe33a2c">CAS_Client</a>
+, <a class="el" href="classphpCAS.html#a5ba42b7bc46a67e897753efdb2c19d14">phpCAS</a>
+</li>
+<li>getProxyTicket()
+: <a class="el" href="classCAS__ProxiedService__Abstract.html#ae0935c6797975015804403ea217b8c9a">CAS_ProxiedService_Abstract</a>
+</li>
+<li>getPT()
+: <a class="el" href="group__internalProxied.html#ga9f6fe06d8349d51a53a1397b6fb266f0">CAS_Client</a>
+</li>
+<li>getRedirectUrl()
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#ab388296ed4aee809f34b17d07d24a33f">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>getResponseBody()
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aebc91e27fc543255ec29ed274fc2cd02">CAS_ProxiedService_Http_Abstract</a>
+, <a class="el" href="interfaceCAS__ProxiedService__Http.html#a492aa219ade6a93a56011108f80c452c">CAS_ProxiedService_Http</a>
+, <a class="el" href="classCAS__AbstractRequest.html#a6eadacb1d96591a8f3c45175754d10c5">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#a78155f887fad699fd34259e33093fca0">CAS_RequestInterface</a>
+</li>
+<li>getResponseHeaders()
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a400962d54b27e83597583ab96e25910c">CAS_ProxiedService_Http_Abstract</a>
+, <a class="el" href="interfaceCAS__ProxiedService__Http.html#abb17d77f4a62879a71ddc8c5dc38f679">CAS_ProxiedService_Http</a>
+, <a class="el" href="classCAS__AbstractRequest.html#a3004eb18cf732bb9a79b7a26b765147b">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#a5e458c85b176e914a280488fe4287993">CAS_RequestInterface</a>
+</li>
+<li>getResponseStatusCode()
+: <a class="el" href="classCAS__AbstractRequest.html#ac60da872e526cdd006204502240ad755">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#afaabea191fa4715fc2b13372d82830cd">CAS_RequestInterface</a>
+, <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa276ab33d13b9b54ba59d71ae993423f">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>getSA()
+: <a class="el" href="group__internalSAML.html#gabbfc9663e999471633c4b5cc1a1f2751">CAS_Client</a>
+</li>
+<li>getServerBaseURL()
+: <a class="el" href="group__internalConfig.html#gaa50d82f0d6951d1ff1305b870155febe">CAS_Client</a>
+</li>
+<li>getServerHostname()
+: <a class="el" href="group__internalConfig.html#ga8ee3ab0acca92bd0e489e4f3708c177a">CAS_Client</a>
+</li>
+<li>getServerLoginURL()
+: <a class="el" href="group__internalConfig.html#ga75782f9ef91325ce1f235eec5367df5b">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga7c01939d204339fcab6a4d3f15557a90">phpCAS</a>
+</li>
+<li>getServerLogoutURL()
+: <a class="el" href="group__publicAuth.html#ga280605a8665ce91117b796d3470d0c2d">phpCAS</a>
+, <a class="el" href="group__internalConfig.html#ga46c09b45a560eb7dec420e6807fcf16c">CAS_Client</a>
+</li>
+<li>getServerPort()
+: <a class="el" href="group__internalConfig.html#gaae25f38d63393d7335596f76f21f24f1">CAS_Client</a>
+</li>
+<li>getServerProxyURL()
+: <a class="el" href="group__internalConfig.html#ga2ecb28daad3c50c0f6b3ef125ab1faaa">CAS_Client</a>
+</li>
+<li>getServerProxyValidateURL()
+: <a class="el" href="group__internalConfig.html#ga1232d737fafbe6db69cabce81d863d71">CAS_Client</a>
+</li>
+<li>getServerSamlValidateURL()
+: <a class="el" href="group__internalConfig.html#gae3728c61321dd40d1b59780c15cf24ba">CAS_Client</a>
+</li>
+<li>getServerServiceValidateURL()
+: <a class="el" href="group__internalConfig.html#ga0035da23a096dd33bdbbb14ab36ca759">CAS_Client</a>
+</li>
+<li>getServerURI()
+: <a class="el" href="group__internalConfig.html#gab0963ff44b9a9d900585c89c881fb678">CAS_Client</a>
+</li>
+<li>getServerUrl()
+: <a class="el" href="group__internalMisc.html#ga6cc85870c043cb9ed421344d25c23571">CAS_Client</a>
+</li>
+<li>getServerVersion()
+: <a class="el" href="group__internalConfig.html#ga0dfec4f2b30a20582355a0252d7644fa">CAS_Client</a>
+</li>
+<li>getServiceUrl()
+: <a class="el" href="interfaceCAS__ProxiedService.html#a60e1ce4d0228964a02f8747466011600">CAS_ProxiedService</a>
+, <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa7c012da853d7333857199121cf1e002">CAS_ProxiedService_Http_Abstract</a>
+, <a class="el" href="classCAS__ProxiedService__Imap.html#a04473ce2d439ac35a6aacde9812477e0">CAS_ProxiedService_Imap</a>
+</li>
+<li>getServiceURL()
+: <a class="el" href="group__publicAuth.html#ga929af13df94ab3033ab915b02eed74e2">phpCAS</a>
+</li>
+<li>getST()
+: <a class="el" href="group__internalBasic.html#ga13a1fac978baa6cc99f6a443bdb7f402">CAS_Client</a>
+</li>
+<li>getStartSession()
+: <a class="el" href="group__internalConfig.html#gad91c4f6f554470da2c3071e073c68bff">CAS_Client</a>
+</li>
+<li>getStorageInfo()
+: <a class="el" href="group__internalPGTStorageFile.html#gad68bdd31082cd1b7852d671d0078d6ca">CAS_PGTStorage_File</a>
+, <a class="el" href="group__internalCAS__PGTStorageDb.html#gaa453c54860a59f8bf1e1550334717542">CAS_PGTStorage_Db</a>
+, <a class="el" href="group__internalPGTStorage.html#ga9611a5217179596541d29d0a8d9ee7e7">CAS_PGTStorage_AbstractStorage</a>
+</li>
+<li>getStorageType()
+: <a class="el" href="group__internalPGTStorageFile.html#ga19d04a68b743138f9545176ba75ff58d">CAS_PGTStorage_File</a>
+, <a class="el" href="group__internalPGTStorage.html#gae0be262b206d9b1c3d5b73ccf91355eb">CAS_PGTStorage_AbstractStorage</a>
+, <a class="el" href="group__internalCAS__PGTStorageDb.html#ga7d60f1fd625678603f67fc1960ab0fbd">CAS_PGTStorage_Db</a>
+</li>
+<li>getStream()
+: <a class="el" href="classCAS__ProxiedService__Imap.html#a29172ade9c38c472c6ee12fcf3857dfc">CAS_ProxiedService_Imap</a>
+</li>
+<li>getString()
+: <a class="el" href="group__internalLang.html#ga18db72fc208dacf384d74dfc5c3713ad">CAS_Client</a>
+</li>
+<li>getTable()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga3b535ed0b0bc84801c4bf04b337cd431">CAS_PGTStorage_Db</a>
+</li>
+<li>getURL()
+: <a class="el" href="group__internalMisc.html#gaa7564ffa02c80ebf8ec2d7238a22f9e0">CAS_Client</a>
+</li>
+<li>getUser()
+: <a class="el" href="group__internalAuthentication.html#ga18a943d6984497f7fcde795fb4e57372">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga4c9f984b474b550cf316396e87670b18">phpCAS</a>
+</li>
+<li>getVersion()
+: <a class="el" href="group__public.html#ga5c971143e0c319b1268233907ca193b9">phpCAS</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x68.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x68.html
new file mode 100644
index 00000000..ef5c4c22
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x68.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li class="current"><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>handleLogoutRequests()
+: <a class="el" href="group__internalAuthentication.html#gae2f5c90e92e32f31dafeee19d338f1be">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga33a0cf0299f96e23893ce4ff6cc76584">phpCAS</a>
+</li>
+<li>hasAttribute()
+: <a class="el" href="group__publicAuth.html#ga261a58590cfc17399398ec5db81c2d7e">phpCAS</a>
+, <a class="el" href="group__internalAuthentication.html#ga2dbf501e0c59acffe19bca8fba2b35e3">CAS_Client</a>
+</li>
+<li>hasAttributes()
+: <a class="el" href="group__internalAuthentication.html#ga5201e6b88a4190f8050ea0436af908b7">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#gaeee7fd7060e5edbf791e71b49270c9e1">phpCAS</a>
+</li>
+<li>hasBeenOpened()
+: <a class="el" href="classCAS__ProxiedService__Imap.html#ace7f52150a572d314eee16c440370b33">CAS_ProxiedService_Imap</a>
+</li>
+<li>hasBeenSent()
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a49cb4bf2481ac55f091434f0e7054d67">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>hasPGT()
+: <a class="el" href="group__internalProxy.html#gaece996995e43de2f4a14600a1de1ec86">CAS_Client</a>
+</li>
+<li>hasPT()
+: <a class="el" href="group__internalProxied.html#gafd4a9d8c389825ed8b23331493fde437">CAS_Client</a>
+</li>
+<li>hasSA()
+: <a class="el" href="group__internalSAML.html#ga436daacbfb73a41424dd24e116acc112">CAS_Client</a>
+</li>
+<li>hasST()
+: <a class="el" href="group__internalBasic.html#ga4acc5e4ed6e778f942c36273dd9c8766">CAS_Client</a>
+</li>
+<li>HTMLFilterOutput()
+: <a class="el" href="group__internalOutput.html#gad7299282ff326a3c3438d0ef20c0fdc5">CAS_Client</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x69.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x69.html
new file mode 100644
index 00000000..1b0cf092
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x69.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li class="current"><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>init()
+: <a class="el" href="group__internalPGTStorage.html#gacee98b92299f2aded9f8792005d2eefc">CAS_PGTStorage_AbstractStorage</a>
+, <a class="el" href="group__internalCAS__PGTStorageDb.html#gaa320ce6db1544a8964fc908fbd0783df">CAS_PGTStorage_Db</a>
+, <a class="el" href="group__internalPGTStorageFile.html#ga422f5a7ca597539b816e87b51f445843">CAS_PGTStorage_File</a>
+</li>
+<li>initializeProxiedService()
+: <a class="el" href="group__internalProxyServices.html#ga80ffa273c63053c94f8d2affd1091720">CAS_Client</a>
+, <a class="el" href="group__publicServices.html#ga36fd2939c6bb0d45567512de80994569">phpCAS</a>
+</li>
+<li>initializeProxyTicket()
+: <a class="el" href="classCAS__ProxiedService__Abstract.html#a8d16ba3f8db0c521f88440b685746693">CAS_ProxiedService_Abstract</a>
+</li>
+<li>initPGTStorage()
+: <a class="el" href="group__internalPGTStorage.html#ga511cf65486f483837a48c50588b638a0">CAS_Client</a>
+</li>
+<li>isAuthenticated()
+: <a class="el" href="group__internalAuthentication.html#gafd9afb9e2bc2db5529129b5e2a07def0">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga48c16f6ef7158f8cf32dec4d1a68cbe5">phpCAS</a>
+</li>
+<li>isCallbackMode()
+: <a class="el" href="group__internalCallback.html#ga445e92539e88bfaf0670da31f8ba68d8">CAS_Client</a>
+</li>
+<li>isHttps()
+: <a class="el" href="group__internalMisc.html#gab152ae390e1930f926b5f7bba8be050c">CAS_Client</a>
+</li>
+<li>isInitialized()
+: <a class="el" href="group__internalPGTStorage.html#gad9cadc643a37b8a000acd42189fff761">CAS_PGTStorage_AbstractStorage</a>
+</li>
+<li>isLogoutRequest()
+: <a class="el" href="group__internalAuthentication.html#ga399b37acdc834f245baf9ae78669397e">CAS_Client</a>
+</li>
+<li>isProxy()
+: <a class="el" href="group__internalProxy.html#ga0dfba2b184668dda8892c385c3f04096">CAS_Client</a>
+</li>
+<li>isSessionAuthenticated()
+: <a class="el" href="group__internalAuthentication.html#ga3c432f5cdfdef6a37f90c5b548610125">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#gac79ced3333492b28b9d3849c56becb9e">phpCAS</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x6c.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x6c.html
new file mode 100644
index 00000000..c4121d74
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x6c.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li class="current"><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>loadPGT()
+: <a class="el" href="group__internalPGTStorage.html#gab185f7f3bf5bd642ce35978f6b0c7ab8">CAS_Client</a>
+</li>
+<li>log()
+: <a class="el" href="group__publicDebug.html#ga7e3b47a04a67d840cc60a765090c5505">phpCAS</a>
+</li>
+<li>logout()
+: <a class="el" href="group__publicAuth.html#ga9989272833c5170c3b7c7027beab795b">phpCAS</a>
+, <a class="el" href="group__internalAuthentication.html#gac725f9fbb5de957bdd75a5334379b45d">CAS_Client</a>
+</li>
+<li>logoutWithRedirectService()
+: <a class="el" href="group__publicAuth.html#ga8121363b18b23a7ff84850851d85fcc1">phpCAS</a>
+</li>
+<li>logoutWithRedirectServiceAndUrl()
+: <a class="el" href="group__publicAuth.html#ga03f02d32829f8e2dd7056aaa94dcfb79">phpCAS</a>
+</li>
+<li>logoutWithUrl()
+: <a class="el" href="group__publicAuth.html#gaf747b39e646075718b6504ae30d6df87">phpCAS</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x6d.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x6d.html
new file mode 100644
index 00000000..4a6c7081
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x6d.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li class="current"><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<li>makePost()
+: <a class="el" href="classCAS__AbstractRequest.html#ac430f85c6303a96ffc854c6bbdefd95e">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#abc0658bec27d70286f12712944229e9b">CAS_RequestInterface</a>
+</li>
+<li>makeRequest()
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a3f31c2009c2b099167ee9a37f72a278e">CAS_ProxiedService_Http_Abstract</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x6f.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x6f.html
new file mode 100644
index 00000000..8adec221
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x6f.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li class="current"><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>open()
+: <a class="el" href="classCAS__ProxiedService__Imap.html#ae8b09f2de23a34d420b6627dfab5efa8">CAS_ProxiedService_Imap</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x70.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x70.html
new file mode 100644
index 00000000..ca59c7ff
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x70.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li class="current"><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>parseCookieHeader()
+: <a class="el" href="classCAS__CookieJar.html#a022858f118e1b08cc1beba50a9046504">CAS_CookieJar</a>
+</li>
+<li>parseCookieHeaders()
+: <a class="el" href="classCAS__CookieJar.html#af81c4ba23ca24d56e308a1a6cbb8464f">CAS_CookieJar</a>
+</li>
+<li>populateRequest()
+: <a class="el" href="classCAS__ProxiedService__Http__Get.html#aaedb46c8bbc400c2d01bdcf4b585245e">CAS_ProxiedService_Http_Get</a>
+, <a class="el" href="classCAS__ProxiedService__Http__Post.html#a53443c2638d51a29006056f42d28128b">CAS_ProxiedService_Http_Post</a>
+, <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a842fd1fe2423e9761a36d025687d2696">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>printHTMLFooter()
+: <a class="el" href="group__internalOutput.html#ga0ff1bdc24180f4f60ffa07dfc8b81d61">CAS_Client</a>
+</li>
+<li>printHTMLHeader()
+: <a class="el" href="group__internalOutput.html#ga37ddf683af4f98f07f64ce4bf8b6667a">CAS_Client</a>
+</li>
+<li>proxy()
+: <a class="el" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x72.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x72.html
new file mode 100644
index 00000000..0519c536
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x72.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li class="current"><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>read()
+: <a class="el" href="group__internalPGTStorage.html#ga67ea1647d16892d59f8e2fd4523f6dc7">CAS_PGTStorage_AbstractStorage</a>
+, <a class="el" href="group__internalCAS__PGTStorageDb.html#ga100a2b62fd644d608059563606717b48">CAS_PGTStorage_Db</a>
+, <a class="el" href="group__internalPGTStorageFile.html#ga14fe054afb4c780b567a5d8ac8214754">CAS_PGTStorage_File</a>
+</li>
+<li>readExtraAttributesCas20()
+: <a class="el" href="group__internalProxied.html#ga7d1f0e097dcfe2a4c2576b2be012a13c">CAS_Client</a>
+</li>
+<li>readURL()
+: <a class="el" href="group__internalMisc.html#ga4a53dbb5ea834fc4593077481573b36e">CAS_Client</a>
+</li>
+<li>redirectToCas()
+: <a class="el" href="group__internalAuthentication.html#gac116a7ff5b1424645c45abafbaf5b35f">CAS_Client</a>
+</li>
+<li>removeParameterFromQueryString()
+: <a class="el" href="group__internalMisc.html#ga17d50d97a83a4925a08dced7e231d6d9">CAS_Client</a>
+</li>
+<li>renameSession()
+: <a class="el" href="group__internalMisc.html#ga889fb725f0c8f080963ee30872031d4d">CAS_Client</a>
+</li>
+<li>renewAuthentication()
+: <a class="el" href="group__internalAuthentication.html#gafd45658b37e0bc420d60331430bca670">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga368b22dab91392a949dbfe902f2ac5f5">phpCAS</a>
+</li>
+<li>resetErrorMode()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga2f1a321e90d6f94fca09ab6f288327b8">CAS_PGTStorage_Db</a>
+</li>
+<li>retrievePT()
+: <a class="el" href="group__publicAuth.html#ga68624158674efe68505c247942ee129b">phpCAS</a>
+, <a class="el" href="group__internalPGTStorage.html#ga0c5561328fcab419325ae53d70dddf12">CAS_Client</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x73.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x73.html
new file mode 100644
index 00000000..8bc56dbe
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x73.html
@@ -0,0 +1,277 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li class="current"><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>send()
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a27175aea106f5ae5bc8461f6ac4c1fc6">CAS_ProxiedService_Http_Abstract</a>
+, <a class="el" href="interfaceCAS__ProxiedService__Http.html#a424660c77d00a62c03c0c3c25aeeeb6a">CAS_ProxiedService_Http</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#a848d1e939e5ff94aeb49ec8fff49f712">CAS_RequestInterface</a>
+, <a class="el" href="classCAS__AbstractRequest.html#abbd007c2f687b52d0718ce209c325e80">CAS_AbstractRequest</a>
+</li>
+<li>serviceMail()
+: <a class="el" href="group__internalProxyServices.html#ga7c0c2ac8d3cc57a31728ae901bafab67">CAS_Client</a>
+, <a class="el" href="group__publicServices.html#ga700b64756f9a83b13365dc79ccd5e9ac">phpCAS</a>
+</li>
+<li>serviceWeb()
+: <a class="el" href="group__publicServices.html#ga11e980f85bd420a42672148e9f1f8d82">phpCAS</a>
+, <a class="el" href="group__internalProxyServices.html#ga48201373f1bc2e02d48a8d337a5cd00e">CAS_Client</a>
+</li>
+<li>setAttributes()
+: <a class="el" href="group__internalAuthentication.html#ga4f0c191193884b48a66a63c871dd660e">CAS_Client</a>
+</li>
+<li>setBody()
+: <a class="el" href="classCAS__ProxiedService__Http__Post.html#aef5a1524cefe9cd2e08e7700cf2151f9">CAS_ProxiedService_Http_Post</a>
+</li>
+<li>setCacheTimesForAuthRecheck()
+: <a class="el" href="group__internalAuthentication.html#ga7adf25029965e95b87977c929d9c44b3">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga6c3433e912dce36c51ebd5732bd43d07">phpCAS</a>
+</li>
+<li>setCallbackMode()
+: <a class="el" href="group__internalCallback.html#ga18db51da1c4c0324fd3a3f6ab79f6aab">CAS_Client</a>
+</li>
+<li>setCallbackURL()
+: <a class="el" href="group__internalCallback.html#gac8f0af91cf84fb7dbd78c1acb0d7b921">CAS_Client</a>
+</li>
+<li>setCasClient()
+: <a class="el" href="interfaceCAS__ProxiedService__Testable.html#ad5f7b693a160d64f36abf91ccf9cece9">CAS_ProxiedService_Testable</a>
+, <a class="el" href="classCAS__ProxiedService__Abstract.html#a8287e46abc27c66a92f3c5162b586310">CAS_ProxiedService_Abstract</a>
+</li>
+<li>setCasServerCACert()
+: <a class="el" href="group__internalBasic.html#ga548bebec55f195988aba071ddc340596">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#gac7c2da957fdd437f1e23147f83daffcb">phpCAS</a>
+</li>
+<li>setContentType()
+: <a class="el" href="classCAS__ProxiedService__Http__Post.html#a22b8ab783f8a614c82320269a4c66f9a">CAS_ProxiedService_Http_Post</a>
+</li>
+<li>setCurlOptions()
+: <a class="el" href="classCAS__CurlRequest.html#ae34cc30ad201b2f1164e40aef609102b">CAS_CurlRequest</a>
+</li>
+<li>setDebug()
+: <a class="el" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS</a>
+</li>
+<li>setErrorMessage()
+: <a class="el" href="group__internalPGTStorage.html#ga1fe701d2302688bb7876eb4f8d7580d8">CAS_PGTStorage_AbstractStorage</a>
+</li>
+<li>setErrorMode()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga99a44e639bda1b88710fb08f619ab5f7">CAS_PGTStorage_Db</a>
+</li>
+<li>setExtraCurlOption()
+: <a class="el" href="group__internalConfig.html#gaa6e5e8340332023e6d6553a423641da5">CAS_Client</a>
+, <a class="el" href="classphpCAS.html#a26ba0156e03fede5cd0c6bacbae8e928">phpCAS</a>
+</li>
+<li>setFixedCallbackURL()
+: <a class="el" href="group__publicAuth.html#ga8d7426d23b152ea51c1bdefdd6516df6">phpCAS</a>
+</li>
+<li>setFixedServiceURL()
+: <a class="el" href="group__publicAuth.html#ga6a67472e035941451db7d22d51d3017b">phpCAS</a>
+</li>
+<li>setHTMLFooter()
+: <a class="el" href="group__internalOutput.html#ga379dd7ed8f510e03321b449369024535">CAS_Client</a>
+, <a class="el" href="group__publicOutput.html#ga166cd942019d96ef8b4504f2bfb9effd">phpCAS</a>
+</li>
+<li>setHTMLHeader()
+: <a class="el" href="group__internalOutput.html#ga7c05d2293082e77a79799c009dd979c9">CAS_Client</a>
+, <a class="el" href="group__publicOutput.html#ga9beb490d4e355f131998f1a73c9d6065">phpCAS</a>
+</li>
+<li>setLang()
+: <a class="el" href="group__internalLang.html#ga29c04b71561ffeed72ef005dadf7dc95">CAS_Client</a>
+, <a class="el" href="group__publicLang.html#ga7eea67859bdfac8e89460a95f5bc961e">phpCAS</a>
+</li>
+<li>setMailbox()
+: <a class="el" href="classCAS__ProxiedService__Imap.html#a70f4b28a1bfbbb562cb12f2a57b5bd18">CAS_ProxiedService_Imap</a>
+</li>
+<li>setNoCasServerValidation()
+: <a class="el" href="group__internalBasic.html#gafa13a188b0b07c1f0631c0f844cdd11f">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS</a>
+</li>
+<li>setNoClearTicketsFromUrl()
+: <a class="el" href="group__internalBehave.html#gafe794b80449acacbdb6c0d30863a6683">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#gac7a6eeb2bfd55a432c57f5d18bd35048">phpCAS</a>
+</li>
+<li>setNoExitOnAuthError()
+: <a class="el" href="group__internalBehave.html#gad914221096da4e9915660b2770347cd1">CAS_Client</a>
+</li>
+<li>setOptions()
+: <a class="el" href="classCAS__ProxiedService__Imap.html#a8c79192515b195decc7b3d2062d97de0">CAS_ProxiedService_Imap</a>
+</li>
+<li>setPGT()
+: <a class="el" href="group__internalProxy.html#ga7750adb0745c0b005ff8b305e7a060e0">CAS_Client</a>
+</li>
+<li>setPGTStorage()
+: <a class="el" href="group__internalPGTStorage.html#ga4d407488ad4ca4409e4128a98d1d3801">CAS_Client</a>
+, <a class="el" href="group__publicPGTStorage.html#ga66de471cfec81a09a24d482d472706cf">phpCAS</a>
+</li>
+<li>setPGTStorageDb()
+: <a class="el" href="group__internalPGTStorage.html#ga37d474907361e521a00259c04b712fe4">CAS_Client</a>
+, <a class="el" href="group__publicPGTStorage.html#ga10e7b70f0634dc65bb19db50f3cc847b">phpCAS</a>
+</li>
+<li>setPGTStorageFile()
+: <a class="el" href="group__publicPGTStorage.html#gafad174fa82241a2d6aef2d7be15fa387">phpCAS</a>
+, <a class="el" href="group__internalPGTStorage.html#gac179a4316bd15cd498f90a6599c7df4c">CAS_Client</a>
+</li>
+<li>setPostAuthenticateCallback()
+: <a class="el" href="group__internalBehave.html#ga41c4204c3ab191548f1ae48984f73848">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#gaef46bf2c415a72f1e81a1bf3a75b1324">phpCAS</a>
+</li>
+<li>setPostBody()
+: <a class="el" href="classCAS__AbstractRequest.html#a99f6b47e913ed0be7a2e64e3595fed8d">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#aab89b06410e705f16528f8883bb8f496">CAS_RequestInterface</a>
+</li>
+<li>setProxies()
+: <a class="el" href="group__internalProxied.html#ga5afeadecc91ada8d11abc1ec74bdefd5">CAS_Client</a>
+</li>
+<li>setProxyTicket()
+: <a class="el" href="classCAS__ProxiedService__Abstract.html#a98f8a839194f72d7d6ab05931b9878dc">CAS_ProxiedService_Abstract</a>
+, <a class="el" href="interfaceCAS__ProxiedService.html#aca7cf518dffecf31b2a311a9b80589e4">CAS_ProxiedService</a>
+</li>
+<li>setPT()
+: <a class="el" href="group__internalProxied.html#gaad9f4d2b7243796555c01edecc85006e">CAS_Client</a>
+</li>
+<li>setRequestImplementation()
+: <a class="el" href="group__internalBehave.html#ga276759918857eddc4fd10d04702d5502">CAS_Client</a>
+</li>
+<li>setSA()
+: <a class="el" href="group__internalSAML.html#gab543514ee8feaf062af84e78fa26f19f">CAS_Client</a>
+</li>
+<li>setServerLoginURL()
+: <a class="el" href="group__publicAuth.html#ga3bae96f4d17cdc12ac2e81334ba44fc1">phpCAS</a>
+, <a class="el" href="group__internalConfig.html#gac2d9a37c0dca05e079b078ca67a9c325">CAS_Client</a>
+</li>
+<li>setServerLogoutURL()
+: <a class="el" href="group__publicAuth.html#ga090c9e2112180f4073cd2583c5c07800">phpCAS</a>
+, <a class="el" href="group__internalConfig.html#ga526dca6da322ff2b00e792c7b7a850ec">CAS_Client</a>
+</li>
+<li>setServerProxyValidateURL()
+: <a class="el" href="group__publicAuth.html#ga11d1c13ed3d5008984ef5999a9389104">phpCAS</a>
+, <a class="el" href="group__internalConfig.html#gadccec5ba83d4719f433adab32068421b">CAS_Client</a>
+</li>
+<li>setServerSamlValidateURL()
+: <a class="el" href="group__internalConfig.html#ga39f47156d1e059502f8a3f6f497a461b">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga22ccd6f45db38b80f3549fc7691b1c8b">phpCAS</a>
+</li>
+<li>setServerServiceValidateURL()
+: <a class="el" href="group__internalConfig.html#ga21a9660c25cba68f165b7c4b1ea0456d">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga70abe40a03b6ebb068eecba436dd7a8c">phpCAS</a>
+</li>
+<li>setServiceUrl()
+: <a class="el" href="classCAS__ProxiedService__Imap.html#a7163e006f08994bd5a8ccef7a1992379">CAS_ProxiedService_Imap</a>
+</li>
+<li>setSessionAttributes()
+: <a class="el" href="group__internalSAML.html#gaf0f93cd303855b62c04ca667dc741ee5">CAS_Client</a>
+</li>
+<li>setSingleSignoutCallback()
+: <a class="el" href="group__publicAuth.html#ga996cb0478f7f35fca4dd33c9714d2452">phpCAS</a>
+, <a class="el" href="group__internalBehave.html#ga61a82c256483dff20a09cd9ca9c33a62">CAS_Client</a>
+</li>
+<li>setSslCaCert()
+: <a class="el" href="classCAS__AbstractRequest.html#ae4dd91db303801bfb205aa9f0f12b7f6">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#abad222cd355bfaa207bcb26675147f1e">CAS_RequestInterface</a>
+</li>
+<li>setST()
+: <a class="el" href="group__internalBasic.html#ga7baa4852ccb4e30280e825d95b496952">CAS_Client</a>
+</li>
+<li>setStartSession()
+: <a class="el" href="group__internalConfig.html#ga54eebbdc5fd41b77de3de25f3bd71c84">CAS_Client</a>
+</li>
+<li>setUrl()
+: <a class="el" href="interfaceCAS__ProxiedService__Http.html#a6bd6113c6e47a143756b6267aa77928b">CAS_ProxiedService_Http</a>
+</li>
+<li>setURL()
+: <a class="el" href="group__internalMisc.html#ga8bd9440411c9be24e955c9edd74e49de">CAS_Client</a>
+</li>
+<li>setUrl()
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a660204c7162343fc9878cd95b15a7273">CAS_ProxiedService_Http_Abstract</a>
+, <a class="el" href="classCAS__AbstractRequest.html#aba433b87d3204f928b8fe1af4b1a1df8">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#ae5fc480f05a815f035574619df9915de">CAS_RequestInterface</a>
+</li>
+<li>setUser()
+: <a class="el" href="group__internalAuthentication.html#gaab7eded3796f3a506c71221413dc95a1">CAS_Client</a>
+</li>
+<li>storeCookie()
+: <a class="el" href="classCAS__CookieJar.html#ac1de792f07c3fad7659a9448ba233c7f">CAS_CookieJar</a>
+</li>
+<li>storeCookies()
+: <a class="el" href="classCAS__CookieJar.html#a133963d2952a02084388a81ca2356d4b">CAS_CookieJar</a>
+</li>
+<li>storeErrorMessage()
+: <a class="el" href="classCAS__AbstractRequest.html#ad0a53a42fa2ebc75e6758521d6c7466b">CAS_AbstractRequest</a>
+</li>
+<li>storePGT()
+: <a class="el" href="group__internalPGTStorage.html#ga244695840dc3a3964707cc355a0b631c">CAS_Client</a>
+</li>
+<li>storeResponseBody()
+: <a class="el" href="classCAS__AbstractRequest.html#a39f3b67606a2d40b23263f8ca257f7f5">CAS_AbstractRequest</a>
+</li>
+<li>storeResponseHeader()
+: <a class="el" href="classCAS__AbstractRequest.html#af99b6e9695cb90d0a1dfd6b117ab06a7">CAS_AbstractRequest</a>
+</li>
+<li>storeResponseHeaders()
+: <a class="el" href="classCAS__AbstractRequest.html#a7a671fde2517c97054187ffe2ba303da">CAS_AbstractRequest</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x74.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x74.html
new file mode 100644
index 00000000..07d8a56d
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x74.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li class="current"><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>trace()
+: <a class="el" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS</a>
+</li>
+<li>traceBegin()
+: <a class="el" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS</a>
+</li>
+<li>traceEnd()
+: <a class="el" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS</a>
+</li>
+<li>traceExit()
+: <a class="el" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">phpCAS</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x76.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x76.html
new file mode 100644
index 00000000..1a18ce46
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x76.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li class="current"><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>validatePGT()
+: <a class="el" href="group__internalPGTStorage.html#ga8c7c97937692e79da12a8be3df634cbe">CAS_Client</a>
+</li>
+<li>validatePT()
+: <a class="el" href="group__internalProxied.html#ga5aa61d302edfacbaaf176a94bf228807">CAS_Client</a>
+</li>
+<li>validateSA()
+: <a class="el" href="group__internalSAML.html#ga07f487f79659e810085f37fafafc90a0">CAS_Client</a>
+</li>
+<li>validateST()
+: <a class="el" href="group__internalBasic.html#ga0a9d9d436a1b2b101ebe767617ac62ad">CAS_Client</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x77.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x77.html
new file mode 100644
index 00000000..4346b4a4
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_0x77.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions.html#index_$"><span>$</span></a></li>
+      <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+      <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+      <li class="current"><a href="functions_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all class members with links to the classes they belong to:
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>wasPreviouslyAuthenticated()
+: <a class="el" href="group__internalAuthentication.html#gaaf695bdc9b1784d15437cd49a3be59a6">CAS_Client</a>
+</li>
+<li>write()
+: <a class="el" href="group__internalPGTStorageFile.html#gae9dcfc67632d53bb890484862254ffef">CAS_PGTStorage_File</a>
+, <a class="el" href="group__internalCAS__PGTStorageDb.html#ga82e33c56ba5fea740d57fd3711652898">CAS_PGTStorage_Db</a>
+, <a class="el" href="group__internalPGTStorage.html#ga28d2bcce9ce91978761746fd9d039edc">CAS_PGTStorage_AbstractStorage</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func.html
new file mode 100644
index 00000000..ae5fc890
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li class="current"><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>__construct()
+: <a class="el" href="group__internalConfig.html#gadf63185159d9018b2e0bd31f5d2a06e7">CAS_Client</a>
+, <a class="el" href="classCAS__CookieJar.html#ab9f5a872c4bfdf47f5a5afb89d77a216">CAS_CookieJar</a>
+, <a class="el" href="group__internalCAS__PGTStorageDb.html#gafeb1ab0741a5ec3cd5eae2003464f457">CAS_PGTStorage_Db</a>
+, <a class="el" href="classCAS__ProxyTicketException.html#ad451fec20aa0b3b9cd3f8c711195bacd">CAS_ProxyTicketException</a>
+, <a class="el" href="group__internalPGTStorageFile.html#ga23f7f09dd29619bd2550562c36713473">CAS_PGTStorage_File</a>
+, <a class="el" href="group__internalPGTStorage.html#ga9ffd47d7bbf118b901bf1c449f4b20c2">CAS_PGTStorage_AbstractStorage</a>
+, <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#ab63e0a909fceda402baa3eeeacbdfde0">CAS_ProxiedService_Http_Abstract</a>
+, <a class="el" href="classCAS__ProxiedService__Imap.html#a8fdeebc729d0136f0417fed01a9347af">CAS_ProxiedService_Imap</a>
+</li>
+<li>_createTableSql()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#gae635e9f0b055b3004779294efb933976">CAS_PGTStorage_Db</a>
+</li>
+<li>_curl_read_headers()
+: <a class="el" href="group__internalMisc.html#ga26a5099cda64d77d48bbafd6f3ba10ae">CAS_Client</a>
+</li>
+<li>_curlReadHeaders()
+: <a class="el" href="classCAS__CurlRequest.html#a4238fbfb24854b910f8c83855c51f15b">CAS_CurlRequest</a>
+</li>
+<li>_deletePgtSql()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga57155c9d2f208404eb4ae55729559cd7">CAS_PGTStorage_Db</a>
+</li>
+<li>_retrievePgtSql()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga00f6c60f19bd223c0787a18f8ce7c703">CAS_PGTStorage_Db</a>
+</li>
+<li>_sendRequest()
+: <a class="el" href="classCAS__CurlRequest.html#aa4e10d6814c606547cec548e1f6fd18b">CAS_CurlRequest</a>
+, <a class="el" href="classCAS__AbstractRequest.html#a43e6cdeecffb2d9eacb6cf0c345903f5">CAS_AbstractRequest</a>
+</li>
+<li>_storePgtSql()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga316e6232a75c060e13ab495e163a3196">CAS_PGTStorage_Db</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x61.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x61.html
new file mode 100644
index 00000000..08310a59
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x61.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li class="current"><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>addAttributeToArray()
+: <a class="el" href="group__internalProxied.html#gabfbdb4ba817d27bf951b9bce6154f4f7">CAS_Client</a>
+</li>
+<li>addCookie()
+: <a class="el" href="classCAS__AbstractRequest.html#a2e29d483c57f1046e23571507a45d5f3">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#a9e0bbff9f3e6c5ffed093a19badff849">CAS_RequestInterface</a>
+</li>
+<li>addCookies()
+: <a class="el" href="classCAS__AbstractRequest.html#a6e8e852978e024cbf7ace013305fa189">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#ad11ecc76349ac2921f927451d89b2059">CAS_RequestInterface</a>
+</li>
+<li>addHeader()
+: <a class="el" href="interfaceCAS__RequestInterface.html#a01f51e770a063eb289ac12c03a5346e6">CAS_RequestInterface</a>
+, <a class="el" href="classCAS__AbstractRequest.html#adae53ccc81ddd2cb2fbeceba12fcb5d6">CAS_AbstractRequest</a>
+</li>
+<li>addHeaders()
+: <a class="el" href="classCAS__AbstractRequest.html#ab21afb8f694810cbc7f6111005f39e40">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#a1c2daa885fd39fce99cfd99837669132">CAS_RequestInterface</a>
+</li>
+<li>authError()
+: <a class="el" href="group__internalMisc.html#ga1d8d2502381f066a46433693f7eac14f">CAS_Client</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x62.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x62.html
new file mode 100644
index 00000000..2af969c7
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x62.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li class="current"><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>buildQueryUrl()
+: <a class="el" href="group__internalMisc.html#gac0540d05b6f1e0d67c43980abeece437">CAS_Client</a>
+</li>
+<li>buildSAMLPayload()
+: <a class="el" href="group__internalMisc.html#ga03ddc75a7cdf1f5ba02d4818e1e603b6">CAS_Client</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x63.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x63.html
new file mode 100644
index 00000000..fc65c4a9
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x63.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li class="current"><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>callback()
+: <a class="el" href="group__internalCallback.html#ga7a7208da84825f761a76246080d12ec0">CAS_Client</a>
+</li>
+<li>checkAuthentication()
+: <a class="el" href="group__internalAuthentication.html#ga374ff1ed51254c75c6ed6bddc6765d2d">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga21fd1c2665d2e21c03e6a6dd1860cf4d">phpCAS</a>
+</li>
+<li>client()
+: <a class="el" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS</a>
+</li>
+<li>cookieMatchesTarget()
+: <a class="el" href="classCAS__CookieJar.html#a1a4419c2c934a7edbd380171bca6f7c2">CAS_CookieJar</a>
+</li>
+<li>createTable()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#gad007b1dbc652edfd508e1c0fc94b0f8b">CAS_PGTStorage_Db</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x64.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x64.html
new file mode 100644
index 00000000..db0d5531
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x64.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li class="current"><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>discardCookie()
+: <a class="el" href="classCAS__CookieJar.html#a5b957149a51af3f67cef6b2591591144">CAS_CookieJar</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x65.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x65.html
new file mode 100644
index 00000000..9ed9a4a5
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x65.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li class="current"><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>error()
+: <a class="el" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS</a>
+</li>
+<li>expireCookies()
+: <a class="el" href="classCAS__CookieJar.html#a4a6e9f572711a19e53a1f6104f56fb8a">CAS_CookieJar</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x66.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x66.html
new file mode 100644
index 00000000..63bef19a
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x66.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li class="current"><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>forceAuthentication()
+: <a class="el" href="group__internalAuthentication.html#gaf42af5d18c13a0df62b18c1cd54deaa0">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x67.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x67.html
new file mode 100644
index 00000000..320a1c8a
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x67.html
@@ -0,0 +1,225 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li class="current"><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>getAttribute()
+: <a class="el" href="group__internalAuthentication.html#ga4e16e6d440ee792bfa63e090b87fcef1">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga46f77015f5e206ad4956edae2905857c">phpCAS</a>
+</li>
+<li>getAttributes()
+: <a class="el" href="group__publicAuth.html#ga9972fbb286fe7e8d726b2e776b150233">phpCAS</a>
+, <a class="el" href="group__internalAuthentication.html#ga2c0120dc035c092f00b74a512fc78d4f">CAS_Client</a>
+</li>
+<li>getCallbackURL()
+: <a class="el" href="group__internalCallback.html#gaf4703672977711e0ecc3c616cc70215b">CAS_Client</a>
+</li>
+<li>getCookies()
+: <a class="el" href="classCAS__CookieJar.html#ac5d8875ce623ff288094f7167cc3ddbe">CAS_CookieJar</a>
+</li>
+<li>getErrorMessage()
+: <a class="el" href="classCAS__AbstractRequest.html#a2ef7ce228560085d1897b9283389a524">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#a1cc14181f19677291c1d4f0201b5e391">CAS_RequestInterface</a>
+, <a class="el" href="group__internalPGTStorage.html#ga68540ebebfe710140d16bab3ef1d61c1">CAS_PGTStorage_AbstractStorage</a>
+</li>
+<li>getImapProxyTicket()
+: <a class="el" href="classCAS__ProxiedService__Imap.html#ad93fa5f8b2cf87375c0838c2ef8ef3b8">CAS_ProxiedService_Imap</a>
+</li>
+<li>getLang()
+: <a class="el" href="group__internalLang.html#gab30d0e0fc8414be34c1f2a28649124d0">CAS_Client</a>
+</li>
+<li>getPath()
+: <a class="el" href="group__internalPGTStorageFile.html#ga85d57a19425e0850dbd81aa7afe6b7a7">CAS_PGTStorage_File</a>
+</li>
+<li>getPdo()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga20d1b72b4a5ffd6c162925cd614a0031">CAS_PGTStorage_Db</a>
+</li>
+<li>getPGT()
+: <a class="el" href="group__internalProxy.html#ga34d29abe0254d1b5752e4f3557865157">CAS_Client</a>
+</li>
+<li>getPGTIouFilename()
+: <a class="el" href="group__internalPGTStorageFile.html#ga0ea66347a5ab05db314d50c4212c867c">CAS_PGTStorage_File</a>
+</li>
+<li>getProxiedService()
+: <a class="el" href="group__internalProxyServices.html#ga2e0f5cb74d8116e3a9b9dc951f1cc3bf">CAS_Client</a>
+, <a class="el" href="group__publicServices.html#gaf3de7e9db40d6b15b6c8cb8dc8cb42eb">phpCAS</a>
+</li>
+<li>getProxies()
+: <a class="el" href="group__internalProxied.html#gac97879b556d2b09f5e3b6ba2bfe33a2c">CAS_Client</a>
+, <a class="el" href="classphpCAS.html#a5ba42b7bc46a67e897753efdb2c19d14">phpCAS</a>
+</li>
+<li>getProxyTicket()
+: <a class="el" href="classCAS__ProxiedService__Abstract.html#ae0935c6797975015804403ea217b8c9a">CAS_ProxiedService_Abstract</a>
+</li>
+<li>getPT()
+: <a class="el" href="group__internalProxied.html#ga9f6fe06d8349d51a53a1397b6fb266f0">CAS_Client</a>
+</li>
+<li>getRedirectUrl()
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#ab388296ed4aee809f34b17d07d24a33f">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>getResponseBody()
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aebc91e27fc543255ec29ed274fc2cd02">CAS_ProxiedService_Http_Abstract</a>
+, <a class="el" href="interfaceCAS__ProxiedService__Http.html#a492aa219ade6a93a56011108f80c452c">CAS_ProxiedService_Http</a>
+, <a class="el" href="classCAS__AbstractRequest.html#a6eadacb1d96591a8f3c45175754d10c5">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#a78155f887fad699fd34259e33093fca0">CAS_RequestInterface</a>
+</li>
+<li>getResponseHeaders()
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a400962d54b27e83597583ab96e25910c">CAS_ProxiedService_Http_Abstract</a>
+, <a class="el" href="interfaceCAS__ProxiedService__Http.html#abb17d77f4a62879a71ddc8c5dc38f679">CAS_ProxiedService_Http</a>
+, <a class="el" href="classCAS__AbstractRequest.html#a3004eb18cf732bb9a79b7a26b765147b">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#a5e458c85b176e914a280488fe4287993">CAS_RequestInterface</a>
+</li>
+<li>getResponseStatusCode()
+: <a class="el" href="classCAS__AbstractRequest.html#ac60da872e526cdd006204502240ad755">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#afaabea191fa4715fc2b13372d82830cd">CAS_RequestInterface</a>
+, <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa276ab33d13b9b54ba59d71ae993423f">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>getSA()
+: <a class="el" href="group__internalSAML.html#gabbfc9663e999471633c4b5cc1a1f2751">CAS_Client</a>
+</li>
+<li>getServerBaseURL()
+: <a class="el" href="group__internalConfig.html#gaa50d82f0d6951d1ff1305b870155febe">CAS_Client</a>
+</li>
+<li>getServerHostname()
+: <a class="el" href="group__internalConfig.html#ga8ee3ab0acca92bd0e489e4f3708c177a">CAS_Client</a>
+</li>
+<li>getServerLoginURL()
+: <a class="el" href="group__internalConfig.html#ga75782f9ef91325ce1f235eec5367df5b">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga7c01939d204339fcab6a4d3f15557a90">phpCAS</a>
+</li>
+<li>getServerLogoutURL()
+: <a class="el" href="group__publicAuth.html#ga280605a8665ce91117b796d3470d0c2d">phpCAS</a>
+, <a class="el" href="group__internalConfig.html#ga46c09b45a560eb7dec420e6807fcf16c">CAS_Client</a>
+</li>
+<li>getServerPort()
+: <a class="el" href="group__internalConfig.html#gaae25f38d63393d7335596f76f21f24f1">CAS_Client</a>
+</li>
+<li>getServerProxyURL()
+: <a class="el" href="group__internalConfig.html#ga2ecb28daad3c50c0f6b3ef125ab1faaa">CAS_Client</a>
+</li>
+<li>getServerProxyValidateURL()
+: <a class="el" href="group__internalConfig.html#ga1232d737fafbe6db69cabce81d863d71">CAS_Client</a>
+</li>
+<li>getServerSamlValidateURL()
+: <a class="el" href="group__internalConfig.html#gae3728c61321dd40d1b59780c15cf24ba">CAS_Client</a>
+</li>
+<li>getServerServiceValidateURL()
+: <a class="el" href="group__internalConfig.html#ga0035da23a096dd33bdbbb14ab36ca759">CAS_Client</a>
+</li>
+<li>getServerURI()
+: <a class="el" href="group__internalConfig.html#gab0963ff44b9a9d900585c89c881fb678">CAS_Client</a>
+</li>
+<li>getServerUrl()
+: <a class="el" href="group__internalMisc.html#ga6cc85870c043cb9ed421344d25c23571">CAS_Client</a>
+</li>
+<li>getServerVersion()
+: <a class="el" href="group__internalConfig.html#ga0dfec4f2b30a20582355a0252d7644fa">CAS_Client</a>
+</li>
+<li>getServiceUrl()
+: <a class="el" href="interfaceCAS__ProxiedService.html#a60e1ce4d0228964a02f8747466011600">CAS_ProxiedService</a>
+, <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa7c012da853d7333857199121cf1e002">CAS_ProxiedService_Http_Abstract</a>
+, <a class="el" href="classCAS__ProxiedService__Imap.html#a04473ce2d439ac35a6aacde9812477e0">CAS_ProxiedService_Imap</a>
+</li>
+<li>getServiceURL()
+: <a class="el" href="group__publicAuth.html#ga929af13df94ab3033ab915b02eed74e2">phpCAS</a>
+</li>
+<li>getST()
+: <a class="el" href="group__internalBasic.html#ga13a1fac978baa6cc99f6a443bdb7f402">CAS_Client</a>
+</li>
+<li>getStartSession()
+: <a class="el" href="group__internalConfig.html#gad91c4f6f554470da2c3071e073c68bff">CAS_Client</a>
+</li>
+<li>getStorageInfo()
+: <a class="el" href="group__internalPGTStorageFile.html#gad68bdd31082cd1b7852d671d0078d6ca">CAS_PGTStorage_File</a>
+, <a class="el" href="group__internalCAS__PGTStorageDb.html#gaa453c54860a59f8bf1e1550334717542">CAS_PGTStorage_Db</a>
+, <a class="el" href="group__internalPGTStorage.html#ga9611a5217179596541d29d0a8d9ee7e7">CAS_PGTStorage_AbstractStorage</a>
+</li>
+<li>getStorageType()
+: <a class="el" href="group__internalPGTStorageFile.html#ga19d04a68b743138f9545176ba75ff58d">CAS_PGTStorage_File</a>
+, <a class="el" href="group__internalPGTStorage.html#gae0be262b206d9b1c3d5b73ccf91355eb">CAS_PGTStorage_AbstractStorage</a>
+, <a class="el" href="group__internalCAS__PGTStorageDb.html#ga7d60f1fd625678603f67fc1960ab0fbd">CAS_PGTStorage_Db</a>
+</li>
+<li>getStream()
+: <a class="el" href="classCAS__ProxiedService__Imap.html#a29172ade9c38c472c6ee12fcf3857dfc">CAS_ProxiedService_Imap</a>
+</li>
+<li>getString()
+: <a class="el" href="group__internalLang.html#ga18db72fc208dacf384d74dfc5c3713ad">CAS_Client</a>
+</li>
+<li>getTable()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga3b535ed0b0bc84801c4bf04b337cd431">CAS_PGTStorage_Db</a>
+</li>
+<li>getURL()
+: <a class="el" href="group__internalMisc.html#gaa7564ffa02c80ebf8ec2d7238a22f9e0">CAS_Client</a>
+</li>
+<li>getUser()
+: <a class="el" href="group__internalAuthentication.html#ga18a943d6984497f7fcde795fb4e57372">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga4c9f984b474b550cf316396e87670b18">phpCAS</a>
+</li>
+<li>getVersion()
+: <a class="el" href="group__public.html#ga5c971143e0c319b1268233907ca193b9">phpCAS</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x68.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x68.html
new file mode 100644
index 00000000..d575aa82
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x68.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li class="current"><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>handleLogoutRequests()
+: <a class="el" href="group__internalAuthentication.html#gae2f5c90e92e32f31dafeee19d338f1be">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga33a0cf0299f96e23893ce4ff6cc76584">phpCAS</a>
+</li>
+<li>hasAttribute()
+: <a class="el" href="group__publicAuth.html#ga261a58590cfc17399398ec5db81c2d7e">phpCAS</a>
+, <a class="el" href="group__internalAuthentication.html#ga2dbf501e0c59acffe19bca8fba2b35e3">CAS_Client</a>
+</li>
+<li>hasAttributes()
+: <a class="el" href="group__internalAuthentication.html#ga5201e6b88a4190f8050ea0436af908b7">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#gaeee7fd7060e5edbf791e71b49270c9e1">phpCAS</a>
+</li>
+<li>hasBeenOpened()
+: <a class="el" href="classCAS__ProxiedService__Imap.html#ace7f52150a572d314eee16c440370b33">CAS_ProxiedService_Imap</a>
+</li>
+<li>hasBeenSent()
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a49cb4bf2481ac55f091434f0e7054d67">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>hasPGT()
+: <a class="el" href="group__internalProxy.html#gaece996995e43de2f4a14600a1de1ec86">CAS_Client</a>
+</li>
+<li>hasPT()
+: <a class="el" href="group__internalProxied.html#gafd4a9d8c389825ed8b23331493fde437">CAS_Client</a>
+</li>
+<li>hasSA()
+: <a class="el" href="group__internalSAML.html#ga436daacbfb73a41424dd24e116acc112">CAS_Client</a>
+</li>
+<li>hasST()
+: <a class="el" href="group__internalBasic.html#ga4acc5e4ed6e778f942c36273dd9c8766">CAS_Client</a>
+</li>
+<li>HTMLFilterOutput()
+: <a class="el" href="group__internalOutput.html#gad7299282ff326a3c3438d0ef20c0fdc5">CAS_Client</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x69.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x69.html
new file mode 100644
index 00000000..1524838c
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x69.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li class="current"><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>init()
+: <a class="el" href="group__internalPGTStorage.html#gacee98b92299f2aded9f8792005d2eefc">CAS_PGTStorage_AbstractStorage</a>
+, <a class="el" href="group__internalCAS__PGTStorageDb.html#gaa320ce6db1544a8964fc908fbd0783df">CAS_PGTStorage_Db</a>
+, <a class="el" href="group__internalPGTStorageFile.html#ga422f5a7ca597539b816e87b51f445843">CAS_PGTStorage_File</a>
+</li>
+<li>initializeProxiedService()
+: <a class="el" href="group__internalProxyServices.html#ga80ffa273c63053c94f8d2affd1091720">CAS_Client</a>
+, <a class="el" href="group__publicServices.html#ga36fd2939c6bb0d45567512de80994569">phpCAS</a>
+</li>
+<li>initializeProxyTicket()
+: <a class="el" href="classCAS__ProxiedService__Abstract.html#a8d16ba3f8db0c521f88440b685746693">CAS_ProxiedService_Abstract</a>
+</li>
+<li>initPGTStorage()
+: <a class="el" href="group__internalPGTStorage.html#ga511cf65486f483837a48c50588b638a0">CAS_Client</a>
+</li>
+<li>isAuthenticated()
+: <a class="el" href="group__internalAuthentication.html#gafd9afb9e2bc2db5529129b5e2a07def0">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga48c16f6ef7158f8cf32dec4d1a68cbe5">phpCAS</a>
+</li>
+<li>isCallbackMode()
+: <a class="el" href="group__internalCallback.html#ga445e92539e88bfaf0670da31f8ba68d8">CAS_Client</a>
+</li>
+<li>isHttps()
+: <a class="el" href="group__internalMisc.html#gab152ae390e1930f926b5f7bba8be050c">CAS_Client</a>
+</li>
+<li>isInitialized()
+: <a class="el" href="group__internalPGTStorage.html#gad9cadc643a37b8a000acd42189fff761">CAS_PGTStorage_AbstractStorage</a>
+</li>
+<li>isLogoutRequest()
+: <a class="el" href="group__internalAuthentication.html#ga399b37acdc834f245baf9ae78669397e">CAS_Client</a>
+</li>
+<li>isProxy()
+: <a class="el" href="group__internalProxy.html#ga0dfba2b184668dda8892c385c3f04096">CAS_Client</a>
+</li>
+<li>isSessionAuthenticated()
+: <a class="el" href="group__internalAuthentication.html#ga3c432f5cdfdef6a37f90c5b548610125">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#gac79ced3333492b28b9d3849c56becb9e">phpCAS</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x6c.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x6c.html
new file mode 100644
index 00000000..2698ce8c
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x6c.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li class="current"><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>loadPGT()
+: <a class="el" href="group__internalPGTStorage.html#gab185f7f3bf5bd642ce35978f6b0c7ab8">CAS_Client</a>
+</li>
+<li>log()
+: <a class="el" href="group__publicDebug.html#ga7e3b47a04a67d840cc60a765090c5505">phpCAS</a>
+</li>
+<li>logout()
+: <a class="el" href="group__publicAuth.html#ga9989272833c5170c3b7c7027beab795b">phpCAS</a>
+, <a class="el" href="group__internalAuthentication.html#gac725f9fbb5de957bdd75a5334379b45d">CAS_Client</a>
+</li>
+<li>logoutWithRedirectService()
+: <a class="el" href="group__publicAuth.html#ga8121363b18b23a7ff84850851d85fcc1">phpCAS</a>
+</li>
+<li>logoutWithRedirectServiceAndUrl()
+: <a class="el" href="group__publicAuth.html#ga03f02d32829f8e2dd7056aaa94dcfb79">phpCAS</a>
+</li>
+<li>logoutWithUrl()
+: <a class="el" href="group__publicAuth.html#gaf747b39e646075718b6504ae30d6df87">phpCAS</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x6d.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x6d.html
new file mode 100644
index 00000000..7f5eca22
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x6d.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li class="current"><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<li>makePost()
+: <a class="el" href="classCAS__AbstractRequest.html#ac430f85c6303a96ffc854c6bbdefd95e">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#abc0658bec27d70286f12712944229e9b">CAS_RequestInterface</a>
+</li>
+<li>makeRequest()
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a3f31c2009c2b099167ee9a37f72a278e">CAS_ProxiedService_Http_Abstract</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x6f.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x6f.html
new file mode 100644
index 00000000..6abcccbf
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x6f.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li class="current"><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>open()
+: <a class="el" href="classCAS__ProxiedService__Imap.html#ae8b09f2de23a34d420b6627dfab5efa8">CAS_ProxiedService_Imap</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x70.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x70.html
new file mode 100644
index 00000000..e2353d93
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x70.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li class="current"><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>parseCookieHeader()
+: <a class="el" href="classCAS__CookieJar.html#a022858f118e1b08cc1beba50a9046504">CAS_CookieJar</a>
+</li>
+<li>parseCookieHeaders()
+: <a class="el" href="classCAS__CookieJar.html#af81c4ba23ca24d56e308a1a6cbb8464f">CAS_CookieJar</a>
+</li>
+<li>populateRequest()
+: <a class="el" href="classCAS__ProxiedService__Http__Get.html#aaedb46c8bbc400c2d01bdcf4b585245e">CAS_ProxiedService_Http_Get</a>
+, <a class="el" href="classCAS__ProxiedService__Http__Post.html#a53443c2638d51a29006056f42d28128b">CAS_ProxiedService_Http_Post</a>
+, <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a842fd1fe2423e9761a36d025687d2696">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>printHTMLFooter()
+: <a class="el" href="group__internalOutput.html#ga0ff1bdc24180f4f60ffa07dfc8b81d61">CAS_Client</a>
+</li>
+<li>printHTMLHeader()
+: <a class="el" href="group__internalOutput.html#ga37ddf683af4f98f07f64ce4bf8b6667a">CAS_Client</a>
+</li>
+<li>proxy()
+: <a class="el" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x72.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x72.html
new file mode 100644
index 00000000..2b09095d
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x72.html
@@ -0,0 +1,101 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li class="current"><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>read()
+: <a class="el" href="group__internalPGTStorage.html#ga67ea1647d16892d59f8e2fd4523f6dc7">CAS_PGTStorage_AbstractStorage</a>
+, <a class="el" href="group__internalCAS__PGTStorageDb.html#ga100a2b62fd644d608059563606717b48">CAS_PGTStorage_Db</a>
+, <a class="el" href="group__internalPGTStorageFile.html#ga14fe054afb4c780b567a5d8ac8214754">CAS_PGTStorage_File</a>
+</li>
+<li>readExtraAttributesCas20()
+: <a class="el" href="group__internalProxied.html#ga7d1f0e097dcfe2a4c2576b2be012a13c">CAS_Client</a>
+</li>
+<li>readURL()
+: <a class="el" href="group__internalMisc.html#ga4a53dbb5ea834fc4593077481573b36e">CAS_Client</a>
+</li>
+<li>redirectToCas()
+: <a class="el" href="group__internalAuthentication.html#gac116a7ff5b1424645c45abafbaf5b35f">CAS_Client</a>
+</li>
+<li>removeParameterFromQueryString()
+: <a class="el" href="group__internalMisc.html#ga17d50d97a83a4925a08dced7e231d6d9">CAS_Client</a>
+</li>
+<li>renameSession()
+: <a class="el" href="group__internalMisc.html#ga889fb725f0c8f080963ee30872031d4d">CAS_Client</a>
+</li>
+<li>renewAuthentication()
+: <a class="el" href="group__internalAuthentication.html#gafd45658b37e0bc420d60331430bca670">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga368b22dab91392a949dbfe902f2ac5f5">phpCAS</a>
+</li>
+<li>resetErrorMode()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga2f1a321e90d6f94fca09ab6f288327b8">CAS_PGTStorage_Db</a>
+</li>
+<li>retrievePT()
+: <a class="el" href="group__publicAuth.html#ga68624158674efe68505c247942ee129b">phpCAS</a>
+, <a class="el" href="group__internalPGTStorage.html#ga0c5561328fcab419325ae53d70dddf12">CAS_Client</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x73.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x73.html
new file mode 100644
index 00000000..252285af
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x73.html
@@ -0,0 +1,276 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li class="current"><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>send()
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a27175aea106f5ae5bc8461f6ac4c1fc6">CAS_ProxiedService_Http_Abstract</a>
+, <a class="el" href="interfaceCAS__ProxiedService__Http.html#a424660c77d00a62c03c0c3c25aeeeb6a">CAS_ProxiedService_Http</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#a848d1e939e5ff94aeb49ec8fff49f712">CAS_RequestInterface</a>
+, <a class="el" href="classCAS__AbstractRequest.html#abbd007c2f687b52d0718ce209c325e80">CAS_AbstractRequest</a>
+</li>
+<li>serviceMail()
+: <a class="el" href="group__internalProxyServices.html#ga7c0c2ac8d3cc57a31728ae901bafab67">CAS_Client</a>
+, <a class="el" href="group__publicServices.html#ga700b64756f9a83b13365dc79ccd5e9ac">phpCAS</a>
+</li>
+<li>serviceWeb()
+: <a class="el" href="group__publicServices.html#ga11e980f85bd420a42672148e9f1f8d82">phpCAS</a>
+, <a class="el" href="group__internalProxyServices.html#ga48201373f1bc2e02d48a8d337a5cd00e">CAS_Client</a>
+</li>
+<li>setAttributes()
+: <a class="el" href="group__internalAuthentication.html#ga4f0c191193884b48a66a63c871dd660e">CAS_Client</a>
+</li>
+<li>setBody()
+: <a class="el" href="classCAS__ProxiedService__Http__Post.html#aef5a1524cefe9cd2e08e7700cf2151f9">CAS_ProxiedService_Http_Post</a>
+</li>
+<li>setCacheTimesForAuthRecheck()
+: <a class="el" href="group__internalAuthentication.html#ga7adf25029965e95b87977c929d9c44b3">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga6c3433e912dce36c51ebd5732bd43d07">phpCAS</a>
+</li>
+<li>setCallbackMode()
+: <a class="el" href="group__internalCallback.html#ga18db51da1c4c0324fd3a3f6ab79f6aab">CAS_Client</a>
+</li>
+<li>setCallbackURL()
+: <a class="el" href="group__internalCallback.html#gac8f0af91cf84fb7dbd78c1acb0d7b921">CAS_Client</a>
+</li>
+<li>setCasClient()
+: <a class="el" href="interfaceCAS__ProxiedService__Testable.html#ad5f7b693a160d64f36abf91ccf9cece9">CAS_ProxiedService_Testable</a>
+, <a class="el" href="classCAS__ProxiedService__Abstract.html#a8287e46abc27c66a92f3c5162b586310">CAS_ProxiedService_Abstract</a>
+</li>
+<li>setCasServerCACert()
+: <a class="el" href="group__internalBasic.html#ga548bebec55f195988aba071ddc340596">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#gac7c2da957fdd437f1e23147f83daffcb">phpCAS</a>
+</li>
+<li>setContentType()
+: <a class="el" href="classCAS__ProxiedService__Http__Post.html#a22b8ab783f8a614c82320269a4c66f9a">CAS_ProxiedService_Http_Post</a>
+</li>
+<li>setCurlOptions()
+: <a class="el" href="classCAS__CurlRequest.html#ae34cc30ad201b2f1164e40aef609102b">CAS_CurlRequest</a>
+</li>
+<li>setDebug()
+: <a class="el" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS</a>
+</li>
+<li>setErrorMessage()
+: <a class="el" href="group__internalPGTStorage.html#ga1fe701d2302688bb7876eb4f8d7580d8">CAS_PGTStorage_AbstractStorage</a>
+</li>
+<li>setErrorMode()
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga99a44e639bda1b88710fb08f619ab5f7">CAS_PGTStorage_Db</a>
+</li>
+<li>setExtraCurlOption()
+: <a class="el" href="group__internalConfig.html#gaa6e5e8340332023e6d6553a423641da5">CAS_Client</a>
+, <a class="el" href="classphpCAS.html#a26ba0156e03fede5cd0c6bacbae8e928">phpCAS</a>
+</li>
+<li>setFixedCallbackURL()
+: <a class="el" href="group__publicAuth.html#ga8d7426d23b152ea51c1bdefdd6516df6">phpCAS</a>
+</li>
+<li>setFixedServiceURL()
+: <a class="el" href="group__publicAuth.html#ga6a67472e035941451db7d22d51d3017b">phpCAS</a>
+</li>
+<li>setHTMLFooter()
+: <a class="el" href="group__internalOutput.html#ga379dd7ed8f510e03321b449369024535">CAS_Client</a>
+, <a class="el" href="group__publicOutput.html#ga166cd942019d96ef8b4504f2bfb9effd">phpCAS</a>
+</li>
+<li>setHTMLHeader()
+: <a class="el" href="group__internalOutput.html#ga7c05d2293082e77a79799c009dd979c9">CAS_Client</a>
+, <a class="el" href="group__publicOutput.html#ga9beb490d4e355f131998f1a73c9d6065">phpCAS</a>
+</li>
+<li>setLang()
+: <a class="el" href="group__internalLang.html#ga29c04b71561ffeed72ef005dadf7dc95">CAS_Client</a>
+, <a class="el" href="group__publicLang.html#ga7eea67859bdfac8e89460a95f5bc961e">phpCAS</a>
+</li>
+<li>setMailbox()
+: <a class="el" href="classCAS__ProxiedService__Imap.html#a70f4b28a1bfbbb562cb12f2a57b5bd18">CAS_ProxiedService_Imap</a>
+</li>
+<li>setNoCasServerValidation()
+: <a class="el" href="group__internalBasic.html#gafa13a188b0b07c1f0631c0f844cdd11f">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS</a>
+</li>
+<li>setNoClearTicketsFromUrl()
+: <a class="el" href="group__internalBehave.html#gafe794b80449acacbdb6c0d30863a6683">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#gac7a6eeb2bfd55a432c57f5d18bd35048">phpCAS</a>
+</li>
+<li>setNoExitOnAuthError()
+: <a class="el" href="group__internalBehave.html#gad914221096da4e9915660b2770347cd1">CAS_Client</a>
+</li>
+<li>setOptions()
+: <a class="el" href="classCAS__ProxiedService__Imap.html#a8c79192515b195decc7b3d2062d97de0">CAS_ProxiedService_Imap</a>
+</li>
+<li>setPGT()
+: <a class="el" href="group__internalProxy.html#ga7750adb0745c0b005ff8b305e7a060e0">CAS_Client</a>
+</li>
+<li>setPGTStorage()
+: <a class="el" href="group__internalPGTStorage.html#ga4d407488ad4ca4409e4128a98d1d3801">CAS_Client</a>
+, <a class="el" href="group__publicPGTStorage.html#ga66de471cfec81a09a24d482d472706cf">phpCAS</a>
+</li>
+<li>setPGTStorageDb()
+: <a class="el" href="group__internalPGTStorage.html#ga37d474907361e521a00259c04b712fe4">CAS_Client</a>
+, <a class="el" href="group__publicPGTStorage.html#ga10e7b70f0634dc65bb19db50f3cc847b">phpCAS</a>
+</li>
+<li>setPGTStorageFile()
+: <a class="el" href="group__publicPGTStorage.html#gafad174fa82241a2d6aef2d7be15fa387">phpCAS</a>
+, <a class="el" href="group__internalPGTStorage.html#gac179a4316bd15cd498f90a6599c7df4c">CAS_Client</a>
+</li>
+<li>setPostAuthenticateCallback()
+: <a class="el" href="group__internalBehave.html#ga41c4204c3ab191548f1ae48984f73848">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#gaef46bf2c415a72f1e81a1bf3a75b1324">phpCAS</a>
+</li>
+<li>setPostBody()
+: <a class="el" href="classCAS__AbstractRequest.html#a99f6b47e913ed0be7a2e64e3595fed8d">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#aab89b06410e705f16528f8883bb8f496">CAS_RequestInterface</a>
+</li>
+<li>setProxies()
+: <a class="el" href="group__internalProxied.html#ga5afeadecc91ada8d11abc1ec74bdefd5">CAS_Client</a>
+</li>
+<li>setProxyTicket()
+: <a class="el" href="classCAS__ProxiedService__Abstract.html#a98f8a839194f72d7d6ab05931b9878dc">CAS_ProxiedService_Abstract</a>
+, <a class="el" href="interfaceCAS__ProxiedService.html#aca7cf518dffecf31b2a311a9b80589e4">CAS_ProxiedService</a>
+</li>
+<li>setPT()
+: <a class="el" href="group__internalProxied.html#gaad9f4d2b7243796555c01edecc85006e">CAS_Client</a>
+</li>
+<li>setRequestImplementation()
+: <a class="el" href="group__internalBehave.html#ga276759918857eddc4fd10d04702d5502">CAS_Client</a>
+</li>
+<li>setSA()
+: <a class="el" href="group__internalSAML.html#gab543514ee8feaf062af84e78fa26f19f">CAS_Client</a>
+</li>
+<li>setServerLoginURL()
+: <a class="el" href="group__publicAuth.html#ga3bae96f4d17cdc12ac2e81334ba44fc1">phpCAS</a>
+, <a class="el" href="group__internalConfig.html#gac2d9a37c0dca05e079b078ca67a9c325">CAS_Client</a>
+</li>
+<li>setServerLogoutURL()
+: <a class="el" href="group__publicAuth.html#ga090c9e2112180f4073cd2583c5c07800">phpCAS</a>
+, <a class="el" href="group__internalConfig.html#ga526dca6da322ff2b00e792c7b7a850ec">CAS_Client</a>
+</li>
+<li>setServerProxyValidateURL()
+: <a class="el" href="group__publicAuth.html#ga11d1c13ed3d5008984ef5999a9389104">phpCAS</a>
+, <a class="el" href="group__internalConfig.html#gadccec5ba83d4719f433adab32068421b">CAS_Client</a>
+</li>
+<li>setServerSamlValidateURL()
+: <a class="el" href="group__internalConfig.html#ga39f47156d1e059502f8a3f6f497a461b">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga22ccd6f45db38b80f3549fc7691b1c8b">phpCAS</a>
+</li>
+<li>setServerServiceValidateURL()
+: <a class="el" href="group__internalConfig.html#ga21a9660c25cba68f165b7c4b1ea0456d">CAS_Client</a>
+, <a class="el" href="group__publicAuth.html#ga70abe40a03b6ebb068eecba436dd7a8c">phpCAS</a>
+</li>
+<li>setServiceUrl()
+: <a class="el" href="classCAS__ProxiedService__Imap.html#a7163e006f08994bd5a8ccef7a1992379">CAS_ProxiedService_Imap</a>
+</li>
+<li>setSessionAttributes()
+: <a class="el" href="group__internalSAML.html#gaf0f93cd303855b62c04ca667dc741ee5">CAS_Client</a>
+</li>
+<li>setSingleSignoutCallback()
+: <a class="el" href="group__publicAuth.html#ga996cb0478f7f35fca4dd33c9714d2452">phpCAS</a>
+, <a class="el" href="group__internalBehave.html#ga61a82c256483dff20a09cd9ca9c33a62">CAS_Client</a>
+</li>
+<li>setSslCaCert()
+: <a class="el" href="classCAS__AbstractRequest.html#ae4dd91db303801bfb205aa9f0f12b7f6">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#abad222cd355bfaa207bcb26675147f1e">CAS_RequestInterface</a>
+</li>
+<li>setST()
+: <a class="el" href="group__internalBasic.html#ga7baa4852ccb4e30280e825d95b496952">CAS_Client</a>
+</li>
+<li>setStartSession()
+: <a class="el" href="group__internalConfig.html#ga54eebbdc5fd41b77de3de25f3bd71c84">CAS_Client</a>
+</li>
+<li>setUrl()
+: <a class="el" href="interfaceCAS__ProxiedService__Http.html#a6bd6113c6e47a143756b6267aa77928b">CAS_ProxiedService_Http</a>
+</li>
+<li>setURL()
+: <a class="el" href="group__internalMisc.html#ga8bd9440411c9be24e955c9edd74e49de">CAS_Client</a>
+</li>
+<li>setUrl()
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a660204c7162343fc9878cd95b15a7273">CAS_ProxiedService_Http_Abstract</a>
+, <a class="el" href="classCAS__AbstractRequest.html#aba433b87d3204f928b8fe1af4b1a1df8">CAS_AbstractRequest</a>
+, <a class="el" href="interfaceCAS__RequestInterface.html#ae5fc480f05a815f035574619df9915de">CAS_RequestInterface</a>
+</li>
+<li>setUser()
+: <a class="el" href="group__internalAuthentication.html#gaab7eded3796f3a506c71221413dc95a1">CAS_Client</a>
+</li>
+<li>storeCookie()
+: <a class="el" href="classCAS__CookieJar.html#ac1de792f07c3fad7659a9448ba233c7f">CAS_CookieJar</a>
+</li>
+<li>storeCookies()
+: <a class="el" href="classCAS__CookieJar.html#a133963d2952a02084388a81ca2356d4b">CAS_CookieJar</a>
+</li>
+<li>storeErrorMessage()
+: <a class="el" href="classCAS__AbstractRequest.html#ad0a53a42fa2ebc75e6758521d6c7466b">CAS_AbstractRequest</a>
+</li>
+<li>storePGT()
+: <a class="el" href="group__internalPGTStorage.html#ga244695840dc3a3964707cc355a0b631c">CAS_Client</a>
+</li>
+<li>storeResponseBody()
+: <a class="el" href="classCAS__AbstractRequest.html#a39f3b67606a2d40b23263f8ca257f7f5">CAS_AbstractRequest</a>
+</li>
+<li>storeResponseHeader()
+: <a class="el" href="classCAS__AbstractRequest.html#af99b6e9695cb90d0a1dfd6b117ab06a7">CAS_AbstractRequest</a>
+</li>
+<li>storeResponseHeaders()
+: <a class="el" href="classCAS__AbstractRequest.html#a7a671fde2517c97054187ffe2ba303da">CAS_AbstractRequest</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x74.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x74.html
new file mode 100644
index 00000000..12d02a37
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x74.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li class="current"><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>trace()
+: <a class="el" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS</a>
+</li>
+<li>traceBegin()
+: <a class="el" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS</a>
+</li>
+<li>traceEnd()
+: <a class="el" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS</a>
+</li>
+<li>traceExit()
+: <a class="el" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">phpCAS</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x76.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x76.html
new file mode 100644
index 00000000..b815478e
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x76.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li class="current"><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>validatePGT()
+: <a class="el" href="group__internalPGTStorage.html#ga8c7c97937692e79da12a8be3df634cbe">CAS_Client</a>
+</li>
+<li>validatePT()
+: <a class="el" href="group__internalProxied.html#ga5aa61d302edfacbaaf176a94bf228807">CAS_Client</a>
+</li>
+<li>validateSA()
+: <a class="el" href="group__internalSAML.html#ga07f487f79659e810085f37fafafc90a0">CAS_Client</a>
+</li>
+<li>validateST()
+: <a class="el" href="group__internalBasic.html#ga0a9d9d436a1b2b101ebe767617ac62ad">CAS_Client</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x77.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x77.html
new file mode 100644
index 00000000..17371d71
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_func_0x77.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+      <li><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="functions_func.html#index__"><span>_</span></a></li>
+      <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+      <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+      <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+      <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+      <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+      <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+      <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+      <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+      <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+      <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+      <li><a href="functions_func_0x6d.html#index_m"><span>m</span></a></li>
+      <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+      <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+      <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+      <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+      <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+      <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+      <li class="current"><a href="functions_func_0x77.html#index_w"><span>w</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>wasPreviouslyAuthenticated()
+: <a class="el" href="group__internalAuthentication.html#gaaf695bdc9b1784d15437cd49a3be59a6">CAS_Client</a>
+</li>
+<li>write()
+: <a class="el" href="group__internalPGTStorageFile.html#gae9dcfc67632d53bb890484862254ffef">CAS_PGTStorage_File</a>
+, <a class="el" href="group__internalCAS__PGTStorageDb.html#ga82e33c56ba5fea740d57fd3711652898">CAS_PGTStorage_Db</a>
+, <a class="el" href="group__internalPGTStorage.html#ga28d2bcce9ce91978761746fd9d039edc">CAS_PGTStorage_AbstractStorage</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_vars.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_vars.html
new file mode 100644
index 00000000..8b9c7c57
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/functions_vars.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li class="current"><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="functions.html"><span>All</span></a></li>
+      <li><a href="functions_func.html"><span>Functions</span></a></li>
+      <li class="current"><a href="functions_vars.html"><span>Variables</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="#index_$"><span>$</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_0x24"></a>- $ -</h3><ul>
+<li>$_attributes
+: <a class="el" href="group__internalAuthentication.html#gab4713832a3000332ddb87a9689bc6a15">CAS_Client</a>
+</li>
+<li>$_body
+: <a class="el" href="classCAS__ProxiedService__Http__Post.html#a0e064cede54799dcf885dfdc807b1d72">CAS_ProxiedService_Http_Post</a>
+</li>
+<li>$_cache_times_for_auth_recheck
+: <a class="el" href="group__internalAuthentication.html#ga478decd824592dcf1abd27002559452c">CAS_Client</a>
+</li>
+<li>$_callback_mode
+: <a class="el" href="group__internalCallback.html#gaed4f8867a062dd1ece2e51e9ec31df58">CAS_Client</a>
+</li>
+<li>$_callback_url
+: <a class="el" href="group__internalCallback.html#ga4e021ea01bd0aebe95d458a5c7997747">CAS_Client</a>
+</li>
+<li>$_cas_server_ca_cert
+: <a class="el" href="group__internalBasic.html#ga17f31ab4f36a637672e5f23c895c4acf">CAS_Client</a>
+</li>
+<li>$_casClient
+: <a class="el" href="classCAS__ProxiedService__Abstract.html#aa0ae0bb2854d179f8d72756fe7894394">CAS_ProxiedService_Abstract</a>
+</li>
+<li>$_clearTicketsFromUrl
+: <a class="el" href="group__internalBehave.html#ga46713aa9224ac1fb8789a48dca4b988c">CAS_Client</a>
+</li>
+<li>$_contentType
+: <a class="el" href="classCAS__ProxiedService__Http__Post.html#a7c0840bde188bed301609ca92b77efcb">CAS_ProxiedService_Http_Post</a>
+</li>
+<li>$_cookieJar
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#ab730aea3d2b79064c658abedbcc42943">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>$_cookies
+: <a class="el" href="classCAS__CookieJar.html#af9d334b3919452f41285c455704f9aef">CAS_CookieJar</a>
+</li>
+<li>$_curl_headers
+: <a class="el" href="group__internalMisc.html#ga2b0b79203463993ca19271ce06eb57df">CAS_Client</a>
+</li>
+<li>$_curl_options
+: <a class="el" href="group__internalConfig.html#gaf9dfac02c509a43b201bbfccf7402c94">CAS_Client</a>
+</li>
+<li>$_dsn
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#gaf411a0dde3a26af1136ced781eda9ce4">CAS_PGTStorage_Db</a>
+</li>
+<li>$_errMode
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga3c6c1256599c435efbab44881c8ec88c">CAS_PGTStorage_Db</a>
+</li>
+<li>$_error_message
+: <a class="el" href="group__internalPGTStorage.html#ga90ed7dc15a9c24154900bccc2ea5925d">CAS_PGTStorage_AbstractStorage</a>
+</li>
+<li>$_exitOnAuthError
+: <a class="el" href="group__internalBehave.html#ga70bec4461feb938a60eb0c70792d8aba">CAS_Client</a>
+</li>
+<li>$_initialized
+: <a class="el" href="group__internalPGTStorage.html#ga5bab9d6ccaeca2cbcc04ab1a2c0e4d16">CAS_PGTStorage_AbstractStorage</a>
+</li>
+<li>$_lang
+: <a class="el" href="group__internalLang.html#ga38abc1fb5f662312e367c8b8bad449c5">CAS_Client</a>
+</li>
+<li>$_mailbox
+: <a class="el" href="classCAS__ProxiedService__Imap.html#aa966d995726481c804be491db720d6fd">CAS_ProxiedService_Imap</a>
+</li>
+<li>$_no_cas_server_validation
+: <a class="el" href="group__internalBasic.html#gad410c54bdfd9b65f063bc9d52afae72d">CAS_Client</a>
+</li>
+<li>$_numRequests
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a186d09097c0291a981e0759a3b147b4e">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>$_options
+: <a class="el" href="classCAS__ProxiedService__Imap.html#a4b4476e2b7611e508dc6d948499a3dce">CAS_ProxiedService_Imap</a>
+</li>
+<li>$_output_footer
+: <a class="el" href="group__internalOutput.html#gaa90031f70e10981383b813385869f96e">CAS_Client</a>
+</li>
+<li>$_output_header
+: <a class="el" href="group__internalOutput.html#gaf411bbf487e36147d8835ea4337305a9">CAS_Client</a>
+</li>
+<li>$_password
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga9e7f285d618bb73b8d91496ebf1e6e83">CAS_PGTStorage_Db</a>
+</li>
+<li>$_path
+: <a class="el" href="group__internalPGTStorageFile.html#ga2808f4969d1a4310bcdaa7e02f0ea607">CAS_PGTStorage_File</a>
+</li>
+<li>$_pdo
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#gac156a575124a0b6f2722d8892909b51a">CAS_PGTStorage_Db</a>
+</li>
+<li>$_pgt
+: <a class="el" href="group__internalProxy.html#ga2c3d4f2d4cb694f1687f561e8483a4c9">CAS_Client</a>
+</li>
+<li>$_pgt_storage
+: <a class="el" href="group__internalPGTStorage.html#gad1f8471bde7999b0465c8f3f109a6aba">CAS_Client</a>
+</li>
+<li>$_postAuthenticateCallbackArgs
+: <a class="el" href="group__internalBehave.html#ga22b6717169f18156da150b60a59b2ded">CAS_Client</a>
+</li>
+<li>$_postAuthenticateCallbackFunction
+: <a class="el" href="group__internalBehave.html#gaed60210e7c5d6d398dd3277ca95ac657">CAS_Client</a>
+</li>
+<li>$_proxies
+: <a class="el" href="group__internalProxied.html#ga082ab34c6c2bf014314fe02504c4ad67">CAS_Client</a>
+</li>
+<li>$_proxy
+: <a class="el" href="group__internalProxy.html#ga93e5bc863e46e09173b578b79a45b760">CAS_Client</a>
+</li>
+<li>$_proxyTicket
+: <a class="el" href="classCAS__ProxiedService__Abstract.html#ab8c4883fd2ce6a059fdaaba258ecc521">CAS_ProxiedService_Abstract</a>
+</li>
+<li>$_pt
+: <a class="el" href="group__internalProxied.html#ga0345fd992cc17a481dd37e1d5c19f595">CAS_Client</a>
+</li>
+<li>$_requestHandler
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#acaa100e7268141dcd143f5ecc37320e9">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>$_requestImplementation
+: <a class="el" href="group__internalBehave.html#ga0c0b9532eb79b569e05c386642632bad">CAS_Client</a>
+</li>
+<li>$_responseBody
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aa34f1b8b2524408a9e3f46704464d596">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>$_responseHeaders
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#afeb924a6df557c0bb60db7669f2cac36">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>$_responseStatusCode
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a91190f3df8797b6015cc19d44867e075">CAS_ProxiedService_Http_Abstract</a>
+</li>
+<li>$_server
+: <a class="el" href="group__internalConfig.html#gaab876894f8f80166fdc3632274178a05">CAS_Client</a>
+</li>
+<li>$_serviceCookieJar
+: <a class="el" href="group__internalProxy.html#ga1f1bcaf4533a30cf236fc0b531aede62">CAS_Client</a>
+</li>
+<li>$_signoutCallbackArgs
+: <a class="el" href="group__internalBehave.html#ga3e2359bc41599cca4a89f6a06a3318d9">CAS_Client</a>
+</li>
+<li>$_signoutCallbackFunction
+: <a class="el" href="group__internalBehave.html#ga02105ca843402cbb747c693272dbec97">CAS_Client</a>
+</li>
+<li>$_st
+: <a class="el" href="group__internalBasic.html#ga0dbca451ba0b1bddbf02f5663ca83d1f">CAS_Client</a>
+</li>
+<li>$_start_session
+: <a class="el" href="group__internalConfig.html#ga345e16e8ff0427eea158d2b118f6c5d8">CAS_Client</a>
+</li>
+<li>$_stream
+: <a class="el" href="classCAS__ProxiedService__Imap.html#a15ac9a76b096f86951f83271c8ee869a">CAS_ProxiedService_Imap</a>
+</li>
+<li>$_strings
+: <a class="el" href="group__internalLang.html#ga66167ea1adb6c18e3141d8ca90df6044">CAS_Client</a>
+</li>
+<li>$_table
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga0d7548f5a7d2c6c5a91b044f89055641">CAS_PGTStorage_Db</a>
+</li>
+<li>$_table_options
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#gaeb3ecc301193541bd3aec19e9b71367b">CAS_PGTStorage_Db</a>
+</li>
+<li>$_url
+: <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#afccfaa50645a8464363f43791bdaa43a">CAS_ProxiedService_Http_Abstract</a>
+, <a class="el" href="classCAS__ProxiedService__Imap.html#a2f542818b5f70dcd3e1a4ce7af84b2b9">CAS_ProxiedService_Imap</a>
+, <a class="el" href="group__internalMisc.html#gaed9c4090f713574a6df8fdc2e32409ca">CAS_Client</a>
+</li>
+<li>$_user
+: <a class="el" href="group__internalAuthentication.html#ga1edc9e777bc4dc2a5213f3000a85e019">CAS_Client</a>
+</li>
+<li>$_username
+: <a class="el" href="group__internalCAS__PGTStorageDb.html#ga0cb86fcfcc709f502d6eac01389b2cca">CAS_PGTStorage_Db</a>
+, <a class="el" href="classCAS__ProxiedService__Imap.html#a93c53744acb8415e337707339e31b80f">CAS_ProxiedService_Imap</a>
+</li>
+<li>$caCertPath
+: <a class="el" href="classCAS__AbstractRequest.html#ae6a9874cd7a448aad2e2c4f1cadc219d">CAS_AbstractRequest</a>
+</li>
+<li>$cookies
+: <a class="el" href="classCAS__AbstractRequest.html#aac0a3f05ed0ede8440d471e6fac19d80">CAS_AbstractRequest</a>
+</li>
+<li>$curlOptions
+: <a class="el" href="classCAS__CurlRequest.html#a91dc734468fb10a927c7b86dbb5606d2">CAS_CurlRequest</a>
+</li>
+<li>$errorMessage
+: <a class="el" href="classCAS__AbstractRequest.html#aaeae803137d9e0853b4f74be77717746">CAS_AbstractRequest</a>
+</li>
+<li>$headers
+: <a class="el" href="classCAS__AbstractRequest.html#ab754b8d9e59974c4b11c849d8ac6880a">CAS_AbstractRequest</a>
+</li>
+<li>$isPost
+: <a class="el" href="classCAS__AbstractRequest.html#a575df6fa81b65ed3dffb3f5e12dad1db">CAS_AbstractRequest</a>
+</li>
+<li>$postBody
+: <a class="el" href="classCAS__AbstractRequest.html#a11ff9877605f46c02d157fe3d8e4ba13">CAS_AbstractRequest</a>
+</li>
+<li>$responseBody
+: <a class="el" href="classCAS__AbstractRequest.html#a99007554a5272f4d755981f6d9d60f8c">CAS_AbstractRequest</a>
+</li>
+<li>$responseHeaders
+: <a class="el" href="classCAS__AbstractRequest.html#affe123d99a4af63b66c3ed889421c471">CAS_AbstractRequest</a>
+</li>
+<li>$sent
+: <a class="el" href="classCAS__AbstractRequest.html#a9b557de521c65ab01b2dba5ecaaa9019">CAS_AbstractRequest</a>
+</li>
+<li>$url
+: <a class="el" href="classCAS__AbstractRequest.html#ab16b0fdb897db17ac1ff688e1d958de7">CAS_AbstractRequest</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/german_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/german_8php.html
new file mode 100644
index 00000000..fbc73f76
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/german_8php.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/german.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>CAS/languages/german.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="german_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">$this&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="german_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<dl class="author"><dt><b>Author:</b></dt><dd>Henrik Genssen &lt;hg at mediafactory.de&gt; </dd></dl>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__internalLang.html">Internationalization </a> </dd></dl>
+
+<p>Definition in file <a class="el" href="german_8php_source.html">german.php</a>.</p>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="a3e2715c2e334fb91d34437e4ff025f1f"></a><!-- doxytag: member="german.php::_strings" ref="a3e2715c2e334fb91d34437e4ff025f1f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$this <a class="el" href="spanish_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<b>Initial value:</b><div class="fragment"><pre class="fragment"> array(
+<a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a>
+=&gt; <span class="stringliteral">&#39;via Server&#39;</span>,
+<a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a>
+=&gt; <span class="stringliteral">&#39;CAS Authentifizierung erforderlich!&#39;</span>,
+<a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a>
+=&gt; <span class="stringliteral">&#39;CAS Abmeldung!&#39;</span>,
+<a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a>
+=&gt; <span class="stringliteral">&#39;eigentlich h&amp;auml;ten Sie zum CAS Server weitergeleitet werden sollen. Dr&amp;uuml;cken Sie &lt;a href=&quot;%s&quot;&gt;hier&lt;/a&gt; um fortzufahren.&#39;</span>,
+<a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a>
+=&gt; <span class="stringliteral">&#39;CAS Anmeldung fehlgeschlagen!&#39;</span>,
+<a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a>
+=&gt; <span class="stringliteral">&#39;&lt;p&gt;Sie wurden nicht angemeldet.&lt;/p&gt;&lt;p&gt;Um es erneut zu versuchen klicken Sie &lt;a href=&quot;%s&quot;&gt;hier&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Wenn das Problem bestehen bleibt, kontkatieren Sie den &lt;a href=&quot;mailto:%s&quot;&gt;Administrator&lt;/a&gt; dieser Seite.&lt;/p&gt;&#39;</span>,
+<a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>
+=&gt; <span class="stringliteral">&#39;Der Dienst `&lt;b&gt;%s&lt;/b&gt;\&#39; ist nicht verf&amp;uuml;gbar (&lt;b&gt;%s&lt;/b&gt;).&#39;</span>
+)
+</pre></div>
+<p>Definition at line <a class="el" href="german_8php_source.html#l00010">10</a> of file <a class="el" href="german_8php_source.html">german.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/german_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/german_8php_source.html
new file mode 100644
index 00000000..7da05963
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/german_8php_source.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/german.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/languages/german.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="german_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 
+<a name="l00010"></a><a class="code" href="german_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">00010</a> $this-&gt;<a class="code" href="catalan_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a> = array(
+<a name="l00011"></a>00011 <a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a>
+<a name="l00012"></a>00012 =&gt; <span class="stringliteral">&#39;via Server&#39;</span>,
+<a name="l00013"></a>00013 <a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a>
+<a name="l00014"></a>00014 =&gt; <span class="stringliteral">&#39;CAS Authentifizierung erforderlich!&#39;</span>,
+<a name="l00015"></a>00015 <a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a>
+<a name="l00016"></a>00016 =&gt; <span class="stringliteral">&#39;CAS Abmeldung!&#39;</span>,
+<a name="l00017"></a>00017 <a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a>
+<a name="l00018"></a>00018 =&gt; <span class="stringliteral">&#39;eigentlich h&amp;auml;ten Sie zum CAS Server weitergeleitet werden sollen. Dr&amp;uuml;cken Sie &lt;a href=&quot;%s&quot;&gt;hier&lt;/a&gt; um fortzufahren.&#39;</span>,
+<a name="l00019"></a>00019 <a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a>
+<a name="l00020"></a>00020 =&gt; <span class="stringliteral">&#39;CAS Anmeldung fehlgeschlagen!&#39;</span>,
+<a name="l00021"></a>00021 <a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a>
+<a name="l00022"></a>00022 =&gt; <span class="stringliteral">&#39;&lt;p&gt;Sie wurden nicht angemeldet.&lt;/p&gt;&lt;p&gt;Um es erneut zu versuchen klicken Sie &lt;a href=&quot;%s&quot;&gt;hier&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Wenn das Problem bestehen bleibt, kontkatieren Sie den &lt;a href=&quot;mailto:%s&quot;&gt;Administrator&lt;/a&gt; dieser Seite.&lt;/p&gt;&#39;</span>,
+<a name="l00023"></a>00023 <a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>
+<a name="l00024"></a>00024 =&gt; <span class="stringliteral">&#39;Der Dienst `&lt;b&gt;%s&lt;/b&gt;\&#39; ist nicht verf&amp;uuml;gbar (&lt;b&gt;%s&lt;/b&gt;).&#39;</span>
+<a name="l00025"></a>00025 );
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/globals.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/globals.html
new file mode 100644
index 00000000..5c87a967
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/globals.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li class="current"><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li class="current"><a href="globals.html"><span>All</span></a></li>
+      <li><a href="globals_vars.html"><span>Variables</span></a></li>
+      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="#index_$"><span>$</span></a></li>
+      <li><a href="#index__"><span>_</span></a></li>
+      <li><a href="#index_c"><span>c</span></a></li>
+      <li><a href="#index_d"><span>d</span></a></li>
+      <li><a href="#index_p"><span>p</span></a></li>
+      <li><a href="#index_s"><span>s</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+Here is a list of all file members with links to the files they belong to:
+
+<h3><a class="anchor" id="index_0x24"></a>- $ -</h3><ul>
+<li>$auth
+: <a class="el" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">example_gateway.php</a>
+</li>
+<li>$cas_context
+: <a class="el" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">config.php</a>
+</li>
+<li>$cas_host
+: <a class="el" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">config.php</a>
+</li>
+<li>$cas_port
+: <a class="el" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">config.php</a>
+</li>
+<li>$cas_real_hosts
+: <a class="el" href="config_8php.html#a636310976f993bc089ccc97652a28f28">config.php</a>
+</li>
+<li>$cas_server_ca_cert_path
+: <a class="el" href="config_8php.html#a18552b2559a8de847b82b43b94adf047">config.php</a>
+</li>
+<li>$cas_url
+: <a class="el" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">config.php</a>
+</li>
+<li>$curdir
+: <a class="el" href="config_8php.html#a9a7b40881ec71841fae33b61dc061b60">config.php</a>
+</li>
+<li>$db
+: <a class="el" href="config_8php.html#a1fa3127fc82f96b1436d871ef02be319">config.php</a>
+</li>
+<li>$db_password
+: <a class="el" href="config_8php.html#a2962c2bda65ca19dd4dd12d7160f1bf8">config.php</a>
+</li>
+<li>$db_table
+: <a class="el" href="config_8php.html#a4593d4f8d59e41d620062617d48414e7">config.php</a>
+</li>
+<li>$db_user
+: <a class="el" href="config_8php.html#a6a2ff59abacecba75a151826de414a27">config.php</a>
+</li>
+<li>$GLOBALS
+: <a class="el" href="group__internalMisc.html#ga2abd10340f5965a876ccabd507ef8f45">CAS.php</a>
+</li>
+<li>$phpcas_path
+: <a class="el" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">config.php</a>
+</li>
+<li>$serviceUrl
+: <a class="el" href="example__proxy__POST_8php.html#a92b2154d49731d7315ea689667265ec5">example_proxy_POST.php</a>
+, <a class="el" href="config_8php.html#a92b2154d49731d7315ea689667265ec5">config.php</a>
+</li>
+<li>$serviceUrl2
+: <a class="el" href="config_8php.html#aeade28b58d5a23ee6eaf2a9663ba30dc">config.php</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>_strings
+: <a class="el" href="catalan_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">catalan.php</a>
+, <a class="el" href="spanish_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">spanish.php</a>
+, <a class="el" href="japanese_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">japanese.php</a>
+, <a class="el" href="greek_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">greek.php</a>
+, <a class="el" href="german_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">german.php</a>
+, <a class="el" href="french_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">french.php</a>
+, <a class="el" href="english_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">english.php</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>CAS_PGT_STORAGE_DB_DEFAULT_TABLE
+: <a class="el" href="Db_8php.html#a072d8c6ec2753e58f251cba9db5490eb">Db.php</a>
+</li>
+<li>CAS_PGT_STORAGE_FILE_DEFAULT_PATH
+: <a class="el" href="group__publicPGTStorage.html#gaaca9f0a80adfc04e5e274f3b87ea13c4">CAS.php</a>
+</li>
+<li>CAS_STR_AUTHENTICATION_FAILED
+: <a class="el" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">languages.php</a>
+</li>
+<li>CAS_STR_AUTHENTICATION_WANTED
+: <a class="el" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">languages.php</a>
+</li>
+<li>CAS_STR_LOGOUT
+: <a class="el" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">languages.php</a>
+</li>
+<li>CAS_STR_SERVICE_UNAVAILABLE
+: <a class="el" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">languages.php</a>
+</li>
+<li>CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED
+: <a class="el" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">languages.php</a>
+</li>
+<li>CAS_STR_USING_SERVER
+: <a class="el" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">languages.php</a>
+</li>
+<li>CAS_STR_YOU_WERE_NOT_AUTHENTICATED
+: <a class="el" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">languages.php</a>
+</li>
+<li>CAS_VERSION_1_0
+: <a class="el" href="group__public.html#ga0904e4fb51e532bbba51832326dbf8fb">CAS.php</a>
+</li>
+<li>CAS_VERSION_2_0
+: <a class="el" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS.php</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>DEFAULT_DEBUG_DIR
+: <a class="el" href="group__publicDebug.html#gab6968f526a29ba688e250949b56c0395">CAS.php</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>PHPCAS_LANG_CATALAN
+: <a class="el" href="group__publicLang.html#ga06f9fdc1bf4d3f97e8e13baa9fb79876">CAS.php</a>
+</li>
+<li>PHPCAS_LANG_DEFAULT
+: <a class="el" href="group__internalLang.html#ga09705919fa8acfdfe25b3d8bf78309ac">CAS.php</a>
+</li>
+<li>PHPCAS_LANG_ENGLISH
+: <a class="el" href="group__publicLang.html#ga5984586a097c0e917dd20363600b110c">CAS.php</a>
+</li>
+<li>PHPCAS_LANG_FRENCH
+: <a class="el" href="group__publicLang.html#ga2625c23a266bd8018ac7ed2dd8bc592c">CAS.php</a>
+</li>
+<li>PHPCAS_LANG_GERMAN
+: <a class="el" href="group__publicLang.html#ga085ffcd2c3dbdeb25d603581c042302f">CAS.php</a>
+</li>
+<li>PHPCAS_LANG_GREEK
+: <a class="el" href="group__publicLang.html#ga2ddaa47b527b9c822787762ae7b8728b">CAS.php</a>
+</li>
+<li>PHPCAS_LANG_JAPANESE
+: <a class="el" href="group__publicLang.html#ga5f7de216237ed042d381ee6ec78872fe">CAS.php</a>
+</li>
+<li>PHPCAS_LANG_SPANISH
+: <a class="el" href="group__publicLang.html#ga1c9367d17d67e279dd9d0fcfc6b121c4">CAS.php</a>
+</li>
+<li>PHPCAS_PROXIED_SERVICE_HTTP_GET
+: <a class="el" href="group__publicServices.html#ga801276ad2c3f6bd1ff8c953891f3693a">CAS.php</a>
+</li>
+<li>PHPCAS_PROXIED_SERVICE_HTTP_POST
+: <a class="el" href="group__publicServices.html#gaf6e2ec1349ecbe7d039df99ca450dd18">CAS.php</a>
+</li>
+<li>PHPCAS_PROXIED_SERVICE_IMAP
+: <a class="el" href="group__publicServices.html#ga78c77beb2a5e39f1cf7a42b547dad39c">CAS.php</a>
+</li>
+<li>PHPCAS_SERVICE_NOT_AVAILABLE
+: <a class="el" href="group__publicServices.html#gac745d5b4a48841c8111cbc443fa57211">CAS.php</a>
+</li>
+<li>PHPCAS_SERVICE_OK
+: <a class="el" href="group__publicServices.html#ga30974f0204d0c1e9cf8b0807a1a1a55e">CAS.php</a>
+</li>
+<li>PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE
+: <a class="el" href="group__publicServices.html#gab8fd1de27f50f53dac55bf1287ad0e70">CAS.php</a>
+</li>
+<li>PHPCAS_SERVICE_PT_FAILURE
+: <a class="el" href="group__publicServices.html#ga63639adfb3fdbe13a1708e4823380b4d">CAS.php</a>
+</li>
+<li>PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE
+: <a class="el" href="group__publicServices.html#ga7de1d5537c1fa74b4a180d94dc165c37">CAS.php</a>
+</li>
+<li>PHPCAS_VERSION
+: <a class="el" href="CAS_8php.html#a3e4542187a4c56565db4f8358c9b5164">CAS.php</a>
+</li>
+<li>print
+: <a class="el" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">example_service.php</a>
+, <a class="el" href="example__service__POST_8php.html#a5f56630a17ebf6a4aa83e982595b6f38">example_service_POST.php</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>SAML_ASSERTION_ARTIFACT
+: <a class="el" href="group__public.html#ga501612cd6f764c67738e2793ef4c6956">CAS.php</a>
+</li>
+<li>SAML_ASSERTION_ARTIFACT_CLOSE
+: <a class="el" href="group__public.html#ga2f7d873f4eb1f98316b3ee7fc9810fc3">CAS.php</a>
+</li>
+<li>SAML_ATTRIBUTES
+: <a class="el" href="group__public.html#ga3dc3b3b94ff4576889e9d2b5c77a3056">CAS.php</a>
+</li>
+<li>SAML_SOAP_BODY
+: <a class="el" href="group__public.html#ga5dd903ec8d4b28382e6e6855d395fc17">CAS.php</a>
+</li>
+<li>SAML_SOAP_BODY_CLOSE
+: <a class="el" href="group__public.html#ga625743ae96c6e64e2b61f2913aa71d29">CAS.php</a>
+</li>
+<li>SAML_SOAP_ENV
+: <a class="el" href="group__public.html#ga65ee3a785f518156c26141fe132e5a27">CAS.php</a>
+</li>
+<li>SAML_SOAP_ENV_CLOSE
+: <a class="el" href="group__public.html#gac209765f2f59e1ca882627eea2474578">CAS.php</a>
+</li>
+<li>SAML_VERSION_1_1
+: <a class="el" href="group__public.html#gaa6440870ffb0a81c5403ac10faa25f33">CAS.php</a>
+</li>
+<li>SAML_XML_HEADER
+: <a class="el" href="group__public.html#gacd26ca2be2ce186d1615dfccb376f9bc">CAS.php</a>
+</li>
+<li>SAMLP_REQUEST
+: <a class="el" href="group__public.html#ga8bfd01226a65a1b6adf3a79107c3d0fe">CAS.php</a>
+</li>
+<li>SAMLP_REQUEST_CLOSE
+: <a class="el" href="group__public.html#ga513c3d47c1ba7496a57ad89b29594a90">CAS.php</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/globals_enum.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/globals_enum.html
new file mode 100644
index 00000000..d7a21105
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/globals_enum.html
@@ -0,0 +1,186 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li class="current"><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="globals.html"><span>All</span></a></li>
+      <li><a href="globals_vars.html"><span>Variables</span></a></li>
+      <li class="current"><a href="globals_enum.html"><span>Enumerations</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs3">
+    <ul class="tablist">
+      <li><a href="#index_c"><span>c</span></a></li>
+      <li><a href="#index_d"><span>d</span></a></li>
+      <li><a href="#index_p"><span>p</span></a></li>
+      <li><a href="#index_s"><span>s</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>CAS_PGT_STORAGE_DB_DEFAULT_TABLE
+: <a class="el" href="Db_8php.html#a072d8c6ec2753e58f251cba9db5490eb">Db.php</a>
+</li>
+<li>CAS_PGT_STORAGE_FILE_DEFAULT_PATH
+: <a class="el" href="group__publicPGTStorage.html#gaaca9f0a80adfc04e5e274f3b87ea13c4">CAS.php</a>
+</li>
+<li>CAS_STR_AUTHENTICATION_FAILED
+: <a class="el" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">languages.php</a>
+</li>
+<li>CAS_STR_AUTHENTICATION_WANTED
+: <a class="el" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">languages.php</a>
+</li>
+<li>CAS_STR_LOGOUT
+: <a class="el" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">languages.php</a>
+</li>
+<li>CAS_STR_SERVICE_UNAVAILABLE
+: <a class="el" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">languages.php</a>
+</li>
+<li>CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED
+: <a class="el" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">languages.php</a>
+</li>
+<li>CAS_STR_USING_SERVER
+: <a class="el" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">languages.php</a>
+</li>
+<li>CAS_STR_YOU_WERE_NOT_AUTHENTICATED
+: <a class="el" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">languages.php</a>
+</li>
+<li>CAS_VERSION_1_0
+: <a class="el" href="group__public.html#ga0904e4fb51e532bbba51832326dbf8fb">CAS.php</a>
+</li>
+<li>CAS_VERSION_2_0
+: <a class="el" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS.php</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>DEFAULT_DEBUG_DIR
+: <a class="el" href="group__publicDebug.html#gab6968f526a29ba688e250949b56c0395">CAS.php</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>PHPCAS_LANG_CATALAN
+: <a class="el" href="group__publicLang.html#ga06f9fdc1bf4d3f97e8e13baa9fb79876">CAS.php</a>
+</li>
+<li>PHPCAS_LANG_DEFAULT
+: <a class="el" href="group__internalLang.html#ga09705919fa8acfdfe25b3d8bf78309ac">CAS.php</a>
+</li>
+<li>PHPCAS_LANG_ENGLISH
+: <a class="el" href="group__publicLang.html#ga5984586a097c0e917dd20363600b110c">CAS.php</a>
+</li>
+<li>PHPCAS_LANG_FRENCH
+: <a class="el" href="group__publicLang.html#ga2625c23a266bd8018ac7ed2dd8bc592c">CAS.php</a>
+</li>
+<li>PHPCAS_LANG_GERMAN
+: <a class="el" href="group__publicLang.html#ga085ffcd2c3dbdeb25d603581c042302f">CAS.php</a>
+</li>
+<li>PHPCAS_LANG_GREEK
+: <a class="el" href="group__publicLang.html#ga2ddaa47b527b9c822787762ae7b8728b">CAS.php</a>
+</li>
+<li>PHPCAS_LANG_JAPANESE
+: <a class="el" href="group__publicLang.html#ga5f7de216237ed042d381ee6ec78872fe">CAS.php</a>
+</li>
+<li>PHPCAS_LANG_SPANISH
+: <a class="el" href="group__publicLang.html#ga1c9367d17d67e279dd9d0fcfc6b121c4">CAS.php</a>
+</li>
+<li>PHPCAS_PROXIED_SERVICE_HTTP_GET
+: <a class="el" href="group__publicServices.html#ga801276ad2c3f6bd1ff8c953891f3693a">CAS.php</a>
+</li>
+<li>PHPCAS_PROXIED_SERVICE_HTTP_POST
+: <a class="el" href="group__publicServices.html#gaf6e2ec1349ecbe7d039df99ca450dd18">CAS.php</a>
+</li>
+<li>PHPCAS_PROXIED_SERVICE_IMAP
+: <a class="el" href="group__publicServices.html#ga78c77beb2a5e39f1cf7a42b547dad39c">CAS.php</a>
+</li>
+<li>PHPCAS_SERVICE_NOT_AVAILABLE
+: <a class="el" href="group__publicServices.html#gac745d5b4a48841c8111cbc443fa57211">CAS.php</a>
+</li>
+<li>PHPCAS_SERVICE_OK
+: <a class="el" href="group__publicServices.html#ga30974f0204d0c1e9cf8b0807a1a1a55e">CAS.php</a>
+</li>
+<li>PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE
+: <a class="el" href="group__publicServices.html#gab8fd1de27f50f53dac55bf1287ad0e70">CAS.php</a>
+</li>
+<li>PHPCAS_SERVICE_PT_FAILURE
+: <a class="el" href="group__publicServices.html#ga63639adfb3fdbe13a1708e4823380b4d">CAS.php</a>
+</li>
+<li>PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE
+: <a class="el" href="group__publicServices.html#ga7de1d5537c1fa74b4a180d94dc165c37">CAS.php</a>
+</li>
+<li>PHPCAS_VERSION
+: <a class="el" href="CAS_8php.html#a3e4542187a4c56565db4f8358c9b5164">CAS.php</a>
+</li>
+</ul>
+
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>SAML_ASSERTION_ARTIFACT
+: <a class="el" href="group__public.html#ga501612cd6f764c67738e2793ef4c6956">CAS.php</a>
+</li>
+<li>SAML_ASSERTION_ARTIFACT_CLOSE
+: <a class="el" href="group__public.html#ga2f7d873f4eb1f98316b3ee7fc9810fc3">CAS.php</a>
+</li>
+<li>SAML_ATTRIBUTES
+: <a class="el" href="group__public.html#ga3dc3b3b94ff4576889e9d2b5c77a3056">CAS.php</a>
+</li>
+<li>SAML_SOAP_BODY
+: <a class="el" href="group__public.html#ga5dd903ec8d4b28382e6e6855d395fc17">CAS.php</a>
+</li>
+<li>SAML_SOAP_BODY_CLOSE
+: <a class="el" href="group__public.html#ga625743ae96c6e64e2b61f2913aa71d29">CAS.php</a>
+</li>
+<li>SAML_SOAP_ENV
+: <a class="el" href="group__public.html#ga65ee3a785f518156c26141fe132e5a27">CAS.php</a>
+</li>
+<li>SAML_SOAP_ENV_CLOSE
+: <a class="el" href="group__public.html#gac209765f2f59e1ca882627eea2474578">CAS.php</a>
+</li>
+<li>SAML_VERSION_1_1
+: <a class="el" href="group__public.html#gaa6440870ffb0a81c5403ac10faa25f33">CAS.php</a>
+</li>
+<li>SAML_XML_HEADER
+: <a class="el" href="group__public.html#gacd26ca2be2ce186d1615dfccb376f9bc">CAS.php</a>
+</li>
+<li>SAMLP_REQUEST
+: <a class="el" href="group__public.html#ga8bfd01226a65a1b6adf3a79107c3d0fe">CAS.php</a>
+</li>
+<li>SAMLP_REQUEST_CLOSE
+: <a class="el" href="group__public.html#ga513c3d47c1ba7496a57ad89b29594a90">CAS.php</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/globals_vars.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/globals_vars.html
new file mode 100644
index 00000000..77fb3326
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/globals_vars.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li class="current"><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="globals.html"><span>All</span></a></li>
+      <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+      <li><a href="globals_enum.html"><span>Enumerations</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="contents">
+&nbsp;<ul>
+<li>$auth
+: <a class="el" href="example__gateway_8php.html#ac04d7c68e6cc24979a835aeb3b238a91">example_gateway.php</a>
+</li>
+<li>$cas_context
+: <a class="el" href="config_8php.html#a172ba1fc184d6b0aec09f41f6ab4c892">config.php</a>
+</li>
+<li>$cas_host
+: <a class="el" href="config_8php.html#ae0aae118a26d9a1950cde9b6489bd75a">config.php</a>
+</li>
+<li>$cas_port
+: <a class="el" href="config_8php.html#a522cb5480c329476a07bfd98d90eeded">config.php</a>
+</li>
+<li>$cas_real_hosts
+: <a class="el" href="config_8php.html#a636310976f993bc089ccc97652a28f28">config.php</a>
+</li>
+<li>$cas_server_ca_cert_path
+: <a class="el" href="config_8php.html#a18552b2559a8de847b82b43b94adf047">config.php</a>
+</li>
+<li>$cas_url
+: <a class="el" href="config_8php.html#ad82993472f3d28477de70f77603c0c01">config.php</a>
+</li>
+<li>$curdir
+: <a class="el" href="config_8php.html#a9a7b40881ec71841fae33b61dc061b60">config.php</a>
+</li>
+<li>$db
+: <a class="el" href="config_8php.html#a1fa3127fc82f96b1436d871ef02be319">config.php</a>
+</li>
+<li>$db_password
+: <a class="el" href="config_8php.html#a2962c2bda65ca19dd4dd12d7160f1bf8">config.php</a>
+</li>
+<li>$db_table
+: <a class="el" href="config_8php.html#a4593d4f8d59e41d620062617d48414e7">config.php</a>
+</li>
+<li>$db_user
+: <a class="el" href="config_8php.html#a6a2ff59abacecba75a151826de414a27">config.php</a>
+</li>
+<li>$GLOBALS
+: <a class="el" href="group__internalMisc.html#ga2abd10340f5965a876ccabd507ef8f45">CAS.php</a>
+</li>
+<li>$phpcas_path
+: <a class="el" href="config_8php.html#aeb426124815566a4c80104ce25a6d46f">config.php</a>
+</li>
+<li>$serviceUrl
+: <a class="el" href="example__proxy__POST_8php.html#a92b2154d49731d7315ea689667265ec5">example_proxy_POST.php</a>
+, <a class="el" href="config_8php.html#a92b2154d49731d7315ea689667265ec5">config.php</a>
+</li>
+<li>$serviceUrl2
+: <a class="el" href="config_8php.html#aeade28b58d5a23ee6eaf2a9663ba30dc">config.php</a>
+</li>
+<li>_strings
+: <a class="el" href="catalan_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">catalan.php</a>
+, <a class="el" href="spanish_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">spanish.php</a>
+, <a class="el" href="japanese_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">japanese.php</a>
+, <a class="el" href="greek_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">greek.php</a>
+, <a class="el" href="german_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">german.php</a>
+, <a class="el" href="french_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">french.php</a>
+, <a class="el" href="english_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">english.php</a>
+</li>
+<li>print
+: <a class="el" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">example_service.php</a>
+, <a class="el" href="example__service__POST_8php.html#a5f56630a17ebf6a4aa83e982595b6f38">example_service_POST.php</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/greek_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/greek_8php.html
new file mode 100644
index 00000000..e0c2339f
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/greek_8php.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/greek.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>CAS/languages/greek.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="greek_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">$this&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="greek_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<dl class="author"><dt><b>Author:</b></dt><dd>Vangelis Haniotakis &lt;haniotak at ucnet.uoc.gr&gt; </dd></dl>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__internalLang.html">Internationalization </a> </dd></dl>
+
+<p>Definition in file <a class="el" href="greek_8php_source.html">greek.php</a>.</p>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="a3e2715c2e334fb91d34437e4ff025f1f"></a><!-- doxytag: member="greek.php::_strings" ref="a3e2715c2e334fb91d34437e4ff025f1f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$this <a class="el" href="spanish_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<b>Initial value:</b><div class="fragment"><pre class="fragment"> array(
+ <a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a> 
+ =&gt; <span class="stringliteral">&#39;��������������� � ������������&#39;</span>,
+ <a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a> 
+ =&gt; <span class="stringliteral">&#39;���������� � ����������� CAS!&#39;</span>,
+ <a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a> 
+ =&gt; <span class="stringliteral">&#39;���������� � ���������� ��� CAS!&#39;</span>,
+ <a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a> 
+ =&gt; <span class="stringliteral">&#39;�� ������ �� ������ �������������� ���� ����������� CAS. ����� ���� &lt;a href=&quot;%s&quot;&gt;���&lt;/a&gt; ��� �� ����������.&#39;</span>,
+ <a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a> 
+ =&gt; <span class="stringliteral">&#39;� ����������� CAS �������!&#39;</span>,
+ <a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a> 
+ =&gt; <span class="stringliteral">&#39;&lt;p&gt;��� ���������������.&lt;/p&gt;&lt;p&gt;�������� �� ����������������, �������� ���� &lt;a href=&quot;%s&quot;&gt;���&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;��� �� �������� ���������, ����� �� ����� �� ��� &lt;a href=&quot;mailto:%s&quot;&gt;�����������&lt;/a&gt;.&lt;/p&gt;&#39;</span>,
+ <a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>
+ =&gt; <span class="stringliteral">&#39;� �������� `&lt;b&gt;%s&lt;/b&gt;\&#39; ��� ����� ��������� (&lt;b&gt;%s&lt;/b&gt;).&#39;</span>
+)
+</pre></div>
+<p>Definition at line <a class="el" href="greek_8php_source.html#l00010">10</a> of file <a class="el" href="greek_8php_source.html">greek.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/greek_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/greek_8php_source.html
new file mode 100644
index 00000000..2a225b8f
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/greek_8php_source.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/greek.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/languages/greek.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="greek_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 
+<a name="l00010"></a><a class="code" href="greek_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">00010</a> $this-&gt;<a class="code" href="catalan_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a> = array(
+<a name="l00011"></a>00011  <a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a> 
+<a name="l00012"></a>00012  =&gt; <span class="stringliteral">&#39;��������������� � ������������&#39;</span>,
+<a name="l00013"></a>00013  <a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a> 
+<a name="l00014"></a>00014  =&gt; <span class="stringliteral">&#39;���������� � ����������� CAS!&#39;</span>,
+<a name="l00015"></a>00015  <a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a> 
+<a name="l00016"></a>00016  =&gt; <span class="stringliteral">&#39;���������� � ���������� ��� CAS!&#39;</span>,
+<a name="l00017"></a>00017  <a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a> 
+<a name="l00018"></a>00018  =&gt; <span class="stringliteral">&#39;�� ������ �� ������ �������������� ���� ����������� CAS. ����� ���� &lt;a href=&quot;%s&quot;&gt;���&lt;/a&gt; ��� �� ����������.&#39;</span>,
+<a name="l00019"></a>00019  <a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a> 
+<a name="l00020"></a>00020  =&gt; <span class="stringliteral">&#39;� ����������� CAS �������!&#39;</span>,
+<a name="l00021"></a>00021  <a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a> 
+<a name="l00022"></a>00022  =&gt; <span class="stringliteral">&#39;&lt;p&gt;��� ���������������.&lt;/p&gt;&lt;p&gt;�������� �� ����������������, �������� ���� &lt;a href=&quot;%s&quot;&gt;���&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;��� �� �������� ���������, ����� �� ����� �� ��� &lt;a href=&quot;mailto:%s&quot;&gt;�����������&lt;/a&gt;.&lt;/p&gt;&#39;</span>,
+<a name="l00023"></a>00023  <a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>
+<a name="l00024"></a>00024  =&gt; <span class="stringliteral">&#39;� �������� `&lt;b&gt;%s&lt;/b&gt;\&#39; ��� ����� ��������� (&lt;b&gt;%s&lt;/b&gt;).&#39;</span>
+<a name="l00025"></a>00025 );
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internal.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internal.html
new file mode 100644
index 00000000..de1a005d
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internal.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Implementation</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<h1>Implementation</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="groups"></a>
+Modules</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html">Authentication</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html">CAS Basic client features (CAS 1.0, Service Tickets)</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html">CAS Proxy features (CAS 2.0, Proxy Granting Tickets)</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalSAML.html">CAS SAML features (SAML 1.1)</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html">CAS proxied client features (CAS 2.0, Proxy Tickets)</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html">Configuration</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalDebug.html">Debugging</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html">Miscellaneous</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalAuthentication.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalAuthentication.html
new file mode 100644
index 00000000..02fcf2c7
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalAuthentication.html
@@ -0,0 +1,578 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Authentication</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>Authentication<br/>
+<small>
+[<a class="el" href="group__internal.html">Implementation</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gaab7eded3796f3a506c71221413dc95a1">CAS_Client::setUser</a> ($user)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga18a943d6984497f7fcde795fb4e57372">CAS_Client::getUser</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga4f0c191193884b48a66a63c871dd660e">CAS_Client::setAttributes</a> ($attributes)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga2c0120dc035c092f00b74a512fc78d4f">CAS_Client::getAttributes</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga5201e6b88a4190f8050ea0436af908b7">CAS_Client::hasAttributes</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga2dbf501e0c59acffe19bca8fba2b35e3">CAS_Client::hasAttribute</a> ($key)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga4e16e6d440ee792bfa63e090b87fcef1">CAS_Client::getAttribute</a> ($key)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gafd45658b37e0bc420d60331430bca670">CAS_Client::renewAuthentication</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gaf42af5d18c13a0df62b18c1cd54deaa0">CAS_Client::forceAuthentication</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga7adf25029965e95b87977c929d9c44b3">CAS_Client::setCacheTimesForAuthRecheck</a> ($n)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga374ff1ed51254c75c6ed6bddc6765d2d">CAS_Client::checkAuthentication</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gafd9afb9e2bc2db5529129b5e2a07def0">CAS_Client::isAuthenticated</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga3c432f5cdfdef6a37f90c5b548610125">CAS_Client::isSessionAuthenticated</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gaaf695bdc9b1784d15437cd49a3be59a6">CAS_Client::wasPreviouslyAuthenticated</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gac116a7ff5b1424645c45abafbaf5b35f">CAS_Client::redirectToCas</a> ($gateway=false, $renew=false)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gac725f9fbb5de957bdd75a5334379b45d">CAS_Client::logout</a> ($params)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga399b37acdc834f245baf9ae78669397e">CAS_Client::isLogoutRequest</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gae2f5c90e92e32f31dafeee19d338f1be">CAS_Client::handleLogoutRequests</a> ($check_client=true, $allowed_clients=false)</td></tr>
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga1edc9e777bc4dc2a5213f3000a85e019">CAS_Client::$_user</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#gab4713832a3000332ddb87a9689bc6a15">CAS_Client::$_attributes</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalAuthentication.html#ga478decd824592dcf1abd27002559452c">CAS_Client::$_cache_times_for_auth_recheck</a></td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ga374ff1ed51254c75c6ed6bddc6765d2d"></a><!-- doxytag: member="CAS_Client::checkAuthentication" ref="ga374ff1ed51254c75c6ed6bddc6765d2d" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::checkAuthentication </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is called to check whether the user is authenticated or not. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>TRUE when the user is authenticated, FALSE when a previous gateway login failed or the function will not return if the user is redirected to the cas server for a gateway login attempt </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01001">1001</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>, <a class="el" href="Client_8php_source.html#l01253">CAS_Client::redirectToCas()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaf42af5d18c13a0df62b18c1cd54deaa0"></a><!-- doxytag: member="CAS_Client::forceAuthentication" ref="gaf42af5d18c13a0df62b18c1cd54deaa0" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::forceAuthentication </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is called to be sure that the user is authenticated. When not authenticated, halt by redirecting to the CAS server; otherwise return TRUE. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>TRUE when the user is authenticated; otherwise halt. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00958">958</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>, <a class="el" href="Client_8php_source.html#l01253">CAS_Client::redirectToCas()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga4e16e6d440ee792bfa63e090b87fcef1"></a><!-- doxytag: member="CAS_Client::getAttribute" ref="ga4e16e6d440ee792bfa63e090b87fcef1" args="($key)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getAttribute </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>key</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00928">928</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l00925">CAS_Client::hasAttribute()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga2c0120dc035c092f00b74a512fc78d4f"></a><!-- doxytag: member="CAS_Client::getAttributes" ref="ga2c0120dc035c092f00b74a512fc78d4f" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getAttributes </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00915">915</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga18a943d6984497f7fcde795fb4e57372"></a><!-- doxytag: member="CAS_Client::getUser" ref="ga18a943d6984497f7fcde795fb4e57372" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getUser </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the CAS user's login name. </p>
+<dl class="warning"><dt><b>Warning:</b></dt><dd>should be called only after CAS_Client::forceAuthentication() or CAS_Client::isAuthenticated(), otherwise halt with an error.</dd></dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the login name of the authenticated user </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00888">888</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gae2f5c90e92e32f31dafeee19d338f1be"></a><!-- doxytag: member="CAS_Client::handleLogoutRequests" ref="gae2f5c90e92e32f31dafeee19d338f1be" args="($check_client=true, $allowed_clients=false)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::handleLogoutRequests </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>check_client</em> = <code>true</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>allowed_clients</em> = <code>false</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method handles logout requests. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$check_client</em>&nbsp;</td><td>true to check the client bofore handling the request, false not to perform any access control. True by default. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$allowed_clients</em>&nbsp;</td><td>an array of host names allowed to send logout requests. By default, only the CAs server (declared in the constructor) will be allowed. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01312">1312</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="Client_8php_source.html#l00307">CAS_Client::getServerHostname()</a>, <a class="el" href="Client_8php_source.html#l01301">CAS_Client::isLogoutRequest()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>, and <a class="el" href="CAS_8php_source.html#l00603">phpCAS::traceExit()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga2dbf501e0c59acffe19bca8fba2b35e3"></a><!-- doxytag: member="CAS_Client::hasAttribute" ref="ga2dbf501e0c59acffe19bca8fba2b35e3" args="($key)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::hasAttribute </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>key</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00925">925</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00928">CAS_Client::getAttribute()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga5201e6b88a4190f8050ea0436af908b7"></a><!-- doxytag: member="CAS_Client::hasAttributes" ref="ga5201e6b88a4190f8050ea0436af908b7" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::hasAttributes </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00922">922</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gafd9afb9e2bc2db5529129b5e2a07def0"></a><!-- doxytag: member="CAS_Client::isAuthenticated" ref="gafd9afb9e2bc2db5529129b5e2a07def0" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::isAuthenticated </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is called to check if the user is authenticated (previously or by tickets given in the URL).</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>TRUE when the user is authenticated. Also may redirect to the same URL without the ticket. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01052">1052</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l00915">CAS_Client::getAttributes()</a>, <a class="el" href="Client_8php_source.html#l01835">CAS_Client::getPGT()</a>, <a class="el" href="Client_8php_source.html#l02509">CAS_Client::getPT()</a>, <a class="el" href="Client_8php_source.html#l01760">CAS_Client::getSA()</a>, <a class="el" href="Client_8php_source.html#l01418">CAS_Client::getST()</a>, <a class="el" href="Client_8php_source.html#l02862">CAS_Client::getURL()</a>, <a class="el" href="Client_8php_source.html#l00888">CAS_Client::getUser()</a>, <a class="el" href="Client_8php_source.html#l00922">CAS_Client::hasAttributes()</a>, <a class="el" href="Client_8php_source.html#l02526">CAS_Client::hasPT()</a>, <a class="el" href="Client_8php_source.html#l01774">CAS_Client::hasSA()</a>, <a class="el" href="Client_8php_source.html#l01432">CAS_Client::hasST()</a>, <a class="el" href="Client_8php_source.html#l01809">CAS_Client::isProxy()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>, <a class="el" href="CAS_8php_source.html#l00603">phpCAS::traceExit()</a>, <a class="el" href="Client_8php_source.html#l02092">CAS_Client::validatePGT()</a>, <a class="el" href="Client_8php_source.html#l02581">CAS_Client::validatePT()</a>, and <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01001">CAS_Client::checkAuthentication()</a>, <a class="el" href="Client_8php_source.html#l00958">CAS_Client::forceAuthentication()</a>, and <a class="el" href="Client_8php_source.html#l00939">CAS_Client::renewAuthentication()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga399b37acdc834f245baf9ae78669397e"></a><!-- doxytag: member="CAS_Client::isLogoutRequest" ref="ga399b37acdc834f245baf9ae78669397e" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::isLogoutRequest </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<dl class="return"><dt><b>Returns:</b></dt><dd>true if the current request is a logout request. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01301">1301</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00689">CAS_Client::__construct()</a>, and <a class="el" href="Client_8php_source.html#l01312">CAS_Client::handleLogoutRequests()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga3c432f5cdfdef6a37f90c5b548610125"></a><!-- doxytag: member="CAS_Client::isSessionAuthenticated" ref="ga3c432f5cdfdef6a37f90c5b548610125" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::isSessionAuthenticated </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method tells if the current session is authenticated. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>true if authenticated based soley on $_SESSION variable </dd></dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>0.4.22 by Brendan Arnold </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01163">1163</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gac725f9fbb5de957bdd75a5334379b45d"></a><!-- doxytag: member="CAS_Client::logout" ref="gac725f9fbb5de957bdd75a5334379b45d" args="($params)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::logout </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>params</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to logout from CAS.  $params an array that contains the optional url and service parameters that will be passed to the CAS server </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01273">1273</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="config_8php_source.html#l00063">$cas_url</a>, <a class="el" href="Client_8php_source.html#l00505">CAS_Client::getServerLogoutURL()</a>, <a class="el" href="Client_8php_source.html#l00226">CAS_Client::getString()</a>, <a class="el" href="Client_8php_source.html#l00147">CAS_Client::printHTMLFooter()</a>, <a class="el" href="Client_8php_source.html#l00121">CAS_Client::printHTMLHeader()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00603">phpCAS::traceExit()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gac116a7ff5b1424645c45abafbaf5b35f"></a><!-- doxytag: member="CAS_Client::redirectToCas" ref="gac116a7ff5b1424645c45abafbaf5b35f" args="($gateway=false, $renew=false)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::redirectToCas </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>gateway</em> = <code>false</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>renew</em> = <code>false</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to redirect the client to the CAS server. It is used by CAS_Client::forceAuthentication() and CAS_Client::checkAuthentication(). </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$gateway</em>&nbsp;</td><td>true to check authentication, false to force it </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$renew</em>&nbsp;</td><td>true to force the authentication with the CAS server </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01253">1253</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="config_8php_source.html#l00063">$cas_url</a>, <a class="el" href="Client_8php_source.html#l00350">CAS_Client::getServerLoginURL()</a>, <a class="el" href="Client_8php_source.html#l00226">CAS_Client::getString()</a>, <a class="el" href="Client_8php_source.html#l00147">CAS_Client::printHTMLFooter()</a>, <a class="el" href="Client_8php_source.html#l00121">CAS_Client::printHTMLHeader()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00603">phpCAS::traceExit()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01001">CAS_Client::checkAuthentication()</a>, <a class="el" href="Client_8php_source.html#l00958">CAS_Client::forceAuthentication()</a>, and <a class="el" href="Client_8php_source.html#l00939">CAS_Client::renewAuthentication()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gafd45658b37e0bc420d60331430bca670"></a><!-- doxytag: member="CAS_Client::renewAuthentication" ref="gafd45658b37e0bc420d60331430bca670" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::renewAuthentication </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is called to renew the authentication of the user If the user is authenticated, renew the connection If not, redirect to CAS </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00939">939</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>, <a class="el" href="Client_8php_source.html#l01253">CAS_Client::redirectToCas()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga4f0c191193884b48a66a63c871dd660e"></a><!-- doxytag: member="CAS_Client::setAttributes" ref="ga4f0c191193884b48a66a63c871dd660e" args="($attributes)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setAttributes </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>attributes</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00912">912</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga7adf25029965e95b87977c929d9c44b3"></a><!-- doxytag: member="CAS_Client::setCacheTimesForAuthRecheck" ref="ga7adf25029965e95b87977c929d9c44b3" args="($n)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setCacheTimesForAuthRecheck </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>n</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the number of times authentication will be cached before rechecked.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$n</em>&nbsp;</td><td>an integer. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00991">991</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaab7eded3796f3a506c71221413dc95a1"></a><!-- doxytag: member="CAS_Client::setUser" ref="gaab7eded3796f3a506c71221413dc95a1" args="($user)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setUser </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>user</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method sets the CAS user's login name.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$user</em>&nbsp;</td><td>the login name of the authenticated user. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00876">876</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01489">CAS_Client::validateST()</a>, and <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaaf695bdc9b1784d15437cd49a3be59a6"></a><!-- doxytag: member="CAS_Client::wasPreviouslyAuthenticated" ref="gaaf695bdc9b1784d15437cd49a3be59a6" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::wasPreviouslyAuthenticated </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method tells if the user has already been (previously) authenticated by looking into the session variables.</p>
+<dl class="note"><dt><b>Note:</b></dt><dd>This function switches to callback mode when needed.</dd></dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>TRUE when the user has already been authenticated; FALSE otherwise. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01176">1176</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="example__gateway_8php_source.html#l00032">$auth</a>, <a class="el" href="Client_8php_source.html#l01942">CAS_Client::callback()</a>, <a class="el" href="Client_8php_source.html#l01891">CAS_Client::isCallbackMode()</a>, <a class="el" href="Client_8php_source.html#l01809">CAS_Client::isProxy()</a>, <a class="el" href="Client_8php_source.html#l01163">CAS_Client::isSessionAuthenticated()</a>, <a class="el" href="Client_8php_source.html#l00912">CAS_Client::setAttributes()</a>, <a class="el" href="Client_8php_source.html#l01842">CAS_Client::setPGT()</a>, <a class="el" href="Client_8php_source.html#l02562">CAS_Client::setProxies()</a>, <a class="el" href="Client_8php_source.html#l02519">CAS_Client::setPT()</a>, <a class="el" href="Client_8php_source.html#l01425">CAS_Client::setST()</a>, <a class="el" href="Client_8php_source.html#l00876">CAS_Client::setUser()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="gab4713832a3000332ddb87a9689bc6a15"></a><!-- doxytag: member="CAS_Client::$_attributes" ref="gab4713832a3000332ddb87a9689bc6a15" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_attributes<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The Authenticated users attributes. Written by CAS_Client::setAttributes(), read by CAS_Client::getAttributes(). </p>
+<dl class="attention"><dt><b>Attention:</b></dt><dd>client applications should use phpCAS::getAttributes(). </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00910">910</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga478decd824592dcf1abd27002559452c"></a><!-- doxytag: member="CAS_Client::$_cache_times_for_auth_recheck" ref="ga478decd824592dcf1abd27002559452c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_cache_times_for_auth_recheck<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>An integer that gives the number of times authentication will be cached before rechecked. </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00984">984</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga1edc9e777bc4dc2a5213f3000a85e019"></a><!-- doxytag: member="CAS_Client::$_user" ref="ga1edc9e777bc4dc2a5213f3000a85e019" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_user<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The Authenticated user. Written by CAS_Client::setUser(), read by CAS_Client::getUser(). </p>
+<dl class="attention"><dt><b>Attention:</b></dt><dd>client applications should use phpCAS::getUser(). </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00868">868</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalBasic.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalBasic.html
new file mode 100644
index 00000000..d2b7faac
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalBasic.html
@@ -0,0 +1,273 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS Basic client features (CAS 1.0, Service Tickets)</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>CAS Basic client features (CAS 1.0, Service Tickets)<br/>
+<small>
+[<a class="el" href="group__internal.html">Implementation</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#ga13a1fac978baa6cc99f6a443bdb7f402">CAS_Client::getST</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#ga7baa4852ccb4e30280e825d95b496952">CAS_Client::setST</a> ($st)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#ga4acc5e4ed6e778f942c36273dd9c8766">CAS_Client::hasST</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#ga548bebec55f195988aba071ddc340596">CAS_Client::setCasServerCACert</a> ($cert)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#gafa13a188b0b07c1f0631c0f844cdd11f">CAS_Client::setNoCasServerValidation</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#ga0a9d9d436a1b2b101ebe767617ac62ad">CAS_Client::validateST</a> ($validate_url, &amp;$text_response, &amp;$tree_response)</td></tr>
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#ga0dbca451ba0b1bddbf02f5663ca83d1f">CAS_Client::$_st</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#ga17f31ab4f36a637672e5f23c895c4acf">CAS_Client::$_cas_server_ca_cert</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBasic.html#gad410c54bdfd9b65f063bc9d52afae72d">CAS_Client::$_no_cas_server_validation</a></td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ga13a1fac978baa6cc99f6a443bdb7f402"></a><!-- doxytag: member="CAS_Client::getST" ref="ga13a1fac978baa6cc99f6a443bdb7f402" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getST </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the Service Ticket provided in the URL of the request. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The service ticket. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01418">1418</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>, and <a class="el" href="Client_8php_source.html#l01489">CAS_Client::validateST()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga4acc5e4ed6e778f942c36273dd9c8766"></a><!-- doxytag: member="CAS_Client::hasST" ref="ga4acc5e4ed6e778f942c36273dd9c8766" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::hasST </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method tells if a Service Ticket was stored. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>TRUE if a Service Ticket has been stored. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01432">1432</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga548bebec55f195988aba071ddc340596"></a><!-- doxytag: member="CAS_Client::setCasServerCACert" ref="ga548bebec55f195988aba071ddc340596" args="($cert)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setCasServerCACert </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>cert</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the CA certificate of the CAS server.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$cert</em>&nbsp;</td><td>the PEM certificate of the CA that emited the cert of the server </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01465">1465</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gafa13a188b0b07c1f0631c0f844cdd11f"></a><!-- doxytag: member="CAS_Client::setNoCasServerValidation" ref="gafa13a188b0b07c1f0631c0f844cdd11f" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setNoCasServerValidation </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set no SSL validation for the CAS server. </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01473">1473</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga7baa4852ccb4e30280e825d95b496952"></a><!-- doxytag: member="CAS_Client::setST" ref="ga7baa4852ccb4e30280e825d95b496952" args="($st)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setST </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>st</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method stores the Service Ticket. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$st</em>&nbsp;</td><td>The Service Ticket. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01425">1425</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga0a9d9d436a1b2b101ebe767617ac62ad"></a><!-- doxytag: member="CAS_Client::validateST" ref="ga0a9d9d436a1b2b101ebe767617ac62ad" args="($validate_url, &amp;$text_response, &amp;$tree_response)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::validateST </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>validate_url</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>text_response</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>tree_response</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to validate a ST; halt on failure, and sets $validate_url, $text_reponse and $tree_response on success. These parameters are used later by CAS_Client::validatePGT() for CAS proxies. Used for all CAS 1.0 validations </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$validate_url</em>&nbsp;</td><td>the URL of the request to the CAS server. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$text_response</em>&nbsp;</td><td>the response of the CAS server, as is (XML text). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$tree_response</em>&nbsp;</td><td>the response of the CAS server, as a DOM XML tree.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>bool TRUE when successfull, halt otherwise by calling CAS_Client::authError(). </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01489">1489</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l03009">CAS_Client::authError()</a>, <a class="el" href="Client_8php_source.html#l01912">CAS_Client::getCallbackURL()</a>, <a class="el" href="Client_8php_source.html#l00418">CAS_Client::getServerServiceValidateURL()</a>, <a class="el" href="Client_8php_source.html#l01418">CAS_Client::getST()</a>, <a class="el" href="Client_8php_source.html#l01809">CAS_Client::isProxy()</a>, <a class="el" href="Client_8php_source.html#l02690">CAS_Client::readExtraAttributesCas20()</a>, <a class="el" href="Client_8php_source.html#l02264">CAS_Client::readURL()</a>, <a class="el" href="Client_8php_source.html#l00876">CAS_Client::setUser()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, and <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="ga17f31ab4f36a637672e5f23c895c4acf"></a><!-- doxytag: member="CAS_Client::$_cas_server_ca_cert" ref="ga17f31ab4f36a637672e5f23c895c4acf" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_cas_server_ca_cert<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>the certificate of the CAS server CA. </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01450">1450</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gad410c54bdfd9b65f063bc9d52afae72d"></a><!-- doxytag: member="CAS_Client::$_no_cas_server_validation" ref="gad410c54bdfd9b65f063bc9d52afae72d" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_no_cas_server_validation<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set to true not to validate the CAS server. </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01457">1457</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga0dbca451ba0b1bddbf02f5663ca83d1f"></a><!-- doxytag: member="CAS_Client::$_st" ref="ga0dbca451ba0b1bddbf02f5663ca83d1f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_st<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>the Service Ticket provided in the URL of the request if present (empty otherwise). Written by CAS_Client::CAS_Client(), read by CAS_Client::getST() and CAS_Client::hasPGT(). </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01412">1412</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalBehave.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalBehave.html
new file mode 100644
index 00000000..2871b2d3
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalBehave.html
@@ -0,0 +1,316 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Internal behaviour of phpCAS</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>Internal behaviour of phpCAS<br/>
+<small>
+[<a class="el" href="group__internalConfig.html">Configuration</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga276759918857eddc4fd10d04702d5502">CAS_Client::setRequestImplementation</a> ($className)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#gad914221096da4e9915660b2770347cd1">CAS_Client::setNoExitOnAuthError</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#gafe794b80449acacbdb6c0d30863a6683">CAS_Client::setNoClearTicketsFromUrl</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga41c4204c3ab191548f1ae48984f73848">CAS_Client::setPostAuthenticateCallback</a> ($function, array $additionalArgs=array())</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga61a82c256483dff20a09cd9ca9c33a62">CAS_Client::setSingleSignoutCallback</a> ($function, array $additionalArgs=array())</td></tr>
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga0c0b9532eb79b569e05c386642632bad">CAS_Client::$_requestImplementation</a> = '<a class="el" href="classCAS__CurlRequest.html">CAS_CurlRequest</a>'</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga70bec4461feb938a60eb0c70792d8aba">CAS_Client::$_exitOnAuthError</a> = true</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga46713aa9224ac1fb8789a48dca4b988c">CAS_Client::$_clearTicketsFromUrl</a> = true</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#gaed60210e7c5d6d398dd3277ca95ac657">CAS_Client::$_postAuthenticateCallbackFunction</a> = null</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga22b6717169f18156da150b60a59b2ded">CAS_Client::$_postAuthenticateCallbackArgs</a> = array()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga02105ca843402cbb747c693272dbec97">CAS_Client::$_signoutCallbackFunction</a> = null</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html#ga3e2359bc41599cca4a89f6a06a3318d9">CAS_Client::$_signoutCallbackArgs</a> = array()</td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="gafe794b80449acacbdb6c0d30863a6683"></a><!-- doxytag: member="CAS_Client::setNoClearTicketsFromUrl" ref="gafe794b80449acacbdb6c0d30863a6683" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setNoClearTicketsFromUrl </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Configure the client to not send redirect headers and call exit() on authentication success. The normal redirect is used to remove the service ticket from the client's URL, but for running unit tests we need to continue without exiting.</p>
+<p>Needed for testing authentication</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00602">602</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gad914221096da4e9915660b2770347cd1"></a><!-- doxytag: member="CAS_Client::setNoExitOnAuthError" ref="gad914221096da4e9915660b2770347cd1" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setNoExitOnAuthError </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Configure the client to not call exit() when an authentication failure occurs.</p>
+<p>Needed for testing proper failure handling.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00583">583</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga41c4204c3ab191548f1ae48984f73848"></a><!-- doxytag: member="CAS_Client::setPostAuthenticateCallback" ref="ga41c4204c3ab191548f1ae48984f73848" args="($function, array $additionalArgs=array())" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setPostAuthenticateCallback </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>function</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">array $&nbsp;</td>
+          <td class="paramname"> <em>additionalArgs</em> = <code>array()</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set a callback function to be run when a user authenticates.</p>
+<p>The callback function will be passed a $logoutTicket as its first parameter, followed by any $additionalArgs you pass. The $logoutTicket parameter is an opaque string that can be used to map a session-id to the logout request in order to support single-signout in applications that manage their own sessions (rather than letting <a class="el" href="classphpCAS.html">phpCAS</a> start the session).</p>
+<p>phpCAS::forceAuthentication() will always exit and forward client unless they are already authenticated. To perform an action at the moment the user logs in (such as registering an account, performing logging, etc), register a callback function here.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>callback</em>&nbsp;</td><td>$function </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>optional</em>&nbsp;</td><td>array $additionalArgs </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00634">634</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga276759918857eddc4fd10d04702d5502"></a><!-- doxytag: member="CAS_Client::setRequestImplementation" ref="ga276759918857eddc4fd10d04702d5502" args="($className)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setRequestImplementation </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>className</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Override the default implementation used to make web requests in readUrl(). This class must implement the <a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a>.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$className </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00563">563</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga61a82c256483dff20a09cd9ca9c33a62"></a><!-- doxytag: member="CAS_Client::setSingleSignoutCallback" ref="ga61a82c256483dff20a09cd9ca9c33a62" args="($function, array $additionalArgs=array())" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setSingleSignoutCallback </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>function</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">array $&nbsp;</td>
+          <td class="paramname"> <em>additionalArgs</em> = <code>array()</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set a callback function to be run when a single-signout request is received.</p>
+<p>The callback function will be passed a $logoutTicket as its first parameter, followed by any $additionalArgs you pass. The $logoutTicket parameter is an opaque string that can be used to map a session-id to the logout request in order to support single-signout in applications that manage their own sessions (rather than letting <a class="el" href="classphpCAS.html">phpCAS</a> start and destroy the session).</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>callback</em>&nbsp;</td><td>$function </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>optional</em>&nbsp;</td><td>array $additionalArgs </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00662">662</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="ga46713aa9224ac1fb8789a48dca4b988c"></a><!-- doxytag: member="CAS_Client::$_clearTicketsFromUrl" ref="ga46713aa9224ac1fb8789a48dca4b988c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_clearTicketsFromUrl = true<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00591">591</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga70bec4461feb938a60eb0c70792d8aba"></a><!-- doxytag: member="CAS_Client::$_exitOnAuthError" ref="ga70bec4461feb938a60eb0c70792d8aba" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_exitOnAuthError = true<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00574">574</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga22b6717169f18156da150b60a59b2ded"></a><!-- doxytag: member="CAS_Client::$_postAuthenticateCallbackArgs" ref="ga22b6717169f18156da150b60a59b2ded" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">array CAS_Client::$_postAuthenticateCallbackArgs = array()<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00614">614</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaed60210e7c5d6d398dd3277ca95ac657"></a><!-- doxytag: member="CAS_Client::$_postAuthenticateCallbackFunction" ref="gaed60210e7c5d6d398dd3277ca95ac657" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">callback CAS_Client::$_postAuthenticateCallbackFunction = null<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00609">609</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga0c0b9532eb79b569e05c386642632bad"></a><!-- doxytag: member="CAS_Client::$_requestImplementation" ref="ga0c0b9532eb79b569e05c386642632bad" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_requestImplementation = '<a class="el" href="classCAS__CurlRequest.html">CAS_CurlRequest</a>'<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The class to instantiate for making web requests in readUrl(). The class specified must implement the <a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a>. By default <a class="el" href="classCAS__CurlRequest.html">CAS_CurlRequest</a> is used, but this may be overridden to supply alternate request mechanisms for testing. </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00554">554</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga3e2359bc41599cca4a89f6a06a3318d9"></a><!-- doxytag: member="CAS_Client::$_signoutCallbackArgs" ref="ga3e2359bc41599cca4a89f6a06a3318d9" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">array CAS_Client::$_signoutCallbackArgs = array()<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00647">647</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga02105ca843402cbb747c693272dbec97"></a><!-- doxytag: member="CAS_Client::$_signoutCallbackFunction" ref="ga02105ca843402cbb747c693272dbec97" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">callback CAS_Client::$_signoutCallbackFunction = null<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00642">642</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalCAS__PGTStorageDb.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalCAS__PGTStorageDb.html
new file mode 100644
index 00000000..fa0f7c83
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalCAS__PGTStorageDb.html
@@ -0,0 +1,599 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: InternalCAS_PGTStorageDb</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>InternalCAS_PGTStorageDb</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga20d1b72b4a5ffd6c162925cd614a0031">CAS_PGTStorage_Db::getPdo</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga3b535ed0b0bc84801c4bf04b337cd431">CAS_PGTStorage_Db::getTable</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga7d60f1fd625678603f67fc1960ab0fbd">CAS_PGTStorage_Db::getStorageType</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gaa453c54860a59f8bf1e1550334717542">CAS_PGTStorage_Db::getStorageInfo</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gafeb1ab0741a5ec3cd5eae2003464f457">CAS_PGTStorage_Db::__construct</a> ($cas_parent, $dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gaa320ce6db1544a8964fc908fbd0783df">CAS_PGTStorage_Db::init</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga99a44e639bda1b88710fb08f619ab5f7">CAS_PGTStorage_Db::setErrorMode</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga2f1a321e90d6f94fca09ab6f288327b8">CAS_PGTStorage_Db::resetErrorMode</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gae635e9f0b055b3004779294efb933976">CAS_PGTStorage_Db::_createTableSql</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga316e6232a75c060e13ab495e163a3196">CAS_PGTStorage_Db::_storePgtSql</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga00f6c60f19bd223c0787a18f8ce7c703">CAS_PGTStorage_Db::_retrievePgtSql</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga57155c9d2f208404eb4ae55729559cd7">CAS_PGTStorage_Db::_deletePgtSql</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gad007b1dbc652edfd508e1c0fc94b0f8b">CAS_PGTStorage_Db::createTable</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga82e33c56ba5fea740d57fd3711652898">CAS_PGTStorage_Db::write</a> ($pgt, $pgt_iou)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga100a2b62fd644d608059563606717b48">CAS_PGTStorage_Db::read</a> ($pgt_iou)</td></tr>
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gac156a575124a0b6f2722d8892909b51a">CAS_PGTStorage_Db::$_pdo</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gaf411a0dde3a26af1136ced781eda9ce4">CAS_PGTStorage_Db::$_dsn</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga0cb86fcfcc709f502d6eac01389b2cca">CAS_PGTStorage_Db::$_username</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga9e7f285d618bb73b8d91496ebf1e6e83">CAS_PGTStorage_Db::$_password</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#gaeb3ecc301193541bd3aec19e9b71367b">CAS_PGTStorage_Db::$_table_options</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga0d7548f5a7d2c6c5a91b044f89055641">CAS_PGTStorage_Db::$_table</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCAS__PGTStorageDb.html#ga3c6c1256599c435efbab44881c8ec88c">CAS_PGTStorage_Db::$_errMode</a></td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="gafeb1ab0741a5ec3cd5eae2003464f457"></a><!-- doxytag: member="CAS_PGTStorage_Db::__construct" ref="gafeb1ab0741a5ec3cd5eae2003464f457" args="($cas_parent, $dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::__construct </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>cas_parent</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>dsn_or_pdo</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>username</em> = <code>''</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>password</em> = <code>''</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>table</em> = <code>''</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>driver_options</em> = <code>null</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The class constructor.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$cas_parent</em>&nbsp;</td><td>the <a class="el" href="classCAS__Client.html">CAS_Client</a> instance that creates the object. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$dsn_or_pdo</em>&nbsp;</td><td>a dsn string to use for creating a PDO object or a PDO object </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$username</em>&nbsp;</td><td>the username to use when connecting to the database </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$password</em>&nbsp;</td><td>the password to use when connecting to the database </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$table</em>&nbsp;</td><td>the table to use for storing and retrieving PGT's </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$driver_options</em>&nbsp;</td><td>any driver options to use when connecting to the database </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00132">132</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gae635e9f0b055b3004779294efb933976"></a><!-- doxytag: member="CAS_PGTStorage_Db::_createTableSql" ref="gae635e9f0b055b3004779294efb933976" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::_createTableSql </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the query used to create a pgt storage table</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the create table SQL, no bind params in query </dd></dl>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00231">231</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+<p>References <a class="el" href="Db_8php_source.html#l00086">CAS_PGTStorage_Db::getTable()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga57155c9d2f208404eb4ae55729559cd7"></a><!-- doxytag: member="CAS_PGTStorage_Db::_deletePgtSql" ref="ga57155c9d2f208404eb4ae55729559cd7" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::_deletePgtSql </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the query used to delete a pgt.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the delete PGT SQL, :pgt_iou is the only bind param contained in the query </dd></dl>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00261">261</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+<p>References <a class="el" href="Db_8php_source.html#l00086">CAS_PGTStorage_Db::getTable()</a>.</p>
+
+<p>Referenced by <a class="el" href="Db_8php_source.html#l00353">CAS_PGTStorage_Db::read()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga00f6c60f19bd223c0787a18f8ce7c703"></a><!-- doxytag: member="CAS_PGTStorage_Db::_retrievePgtSql" ref="ga00f6c60f19bd223c0787a18f8ce7c703" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::_retrievePgtSql </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the query used to retrieve a pgt. the first column of the first row should contain the pgt</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the retrieve PGT SQL, :pgt_iou is the only bind param contained in the query </dd></dl>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00251">251</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+<p>References <a class="el" href="Db_8php_source.html#l00086">CAS_PGTStorage_Db::getTable()</a>.</p>
+
+<p>Referenced by <a class="el" href="Db_8php_source.html#l00353">CAS_PGTStorage_Db::read()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga316e6232a75c060e13ab495e163a3196"></a><!-- doxytag: member="CAS_PGTStorage_Db::_storePgtSql" ref="ga316e6232a75c060e13ab495e163a3196" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::_storePgtSql </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the query used to store a pgt</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the store PGT SQL, :pgt and :pgt_iou are the bind params contained in the query </dd></dl>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00241">241</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+<p>References <a class="el" href="Db_8php_source.html#l00086">CAS_PGTStorage_Db::getTable()</a>.</p>
+
+<p>Referenced by <a class="el" href="Db_8php_source.html#l00311">CAS_PGTStorage_Db::write()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gad007b1dbc652edfd508e1c0fc94b0f8b"></a><!-- doxytag: member="CAS_PGTStorage_Db::createTable" ref="gad007b1dbc652edfd508e1c0fc94b0f8b" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::createTable </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method creates the database table used to store pgt's and pgtiou's </p>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00273">273</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="Db_8php_source.html#l00063">CAS_PGTStorage_Db::getPdo()</a>, <a class="el" href="Db_8php_source.html#l00212">CAS_PGTStorage_Db::resetErrorMode()</a>, <a class="el" href="Db_8php_source.html#l00201">CAS_PGTStorage_Db::setErrorMode()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga20d1b72b4a5ffd6c162925cd614a0031"></a><!-- doxytag: member="CAS_PGTStorage_Db::getPdo" ref="ga20d1b72b4a5ffd6c162925cd614a0031" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::getPdo </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the PDO object to use for database interactions.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the PDO object </dd></dl>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00063">63</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Db_8php_source.html#l00273">CAS_PGTStorage_Db::createTable()</a>, <a class="el" href="Db_8php_source.html#l00353">CAS_PGTStorage_Db::read()</a>, <a class="el" href="Db_8php_source.html#l00212">CAS_PGTStorage_Db::resetErrorMode()</a>, <a class="el" href="Db_8php_source.html#l00201">CAS_PGTStorage_Db::setErrorMode()</a>, and <a class="el" href="Db_8php_source.html#l00311">CAS_PGTStorage_Db::write()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaa453c54860a59f8bf1e1550334717542"></a><!-- doxytag: member="CAS_PGTStorage_Db::getStorageInfo" ref="gaa453c54860a59f8bf1e1550334717542" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::getStorageInfo </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns an informational string giving informations on the parameters of the storage.(used for debugging purposes).</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>an informational string. </dd></dl>
+
+<p>Reimplemented from <a class="el" href="group__internalPGTStorage.html#ga9611a5217179596541d29d0a8d9ee7e7">CAS_PGTStorage_AbstractStorage</a>.</p>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00113">113</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga7d60f1fd625678603f67fc1960ab0fbd"></a><!-- doxytag: member="CAS_PGTStorage_Db::getStorageType" ref="ga7d60f1fd625678603f67fc1960ab0fbd" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::getStorageType </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns an informational string giving the type of storage used by the object (used for debugging purposes).</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>an informational string. </dd></dl>
+
+<p>Reimplemented from <a class="el" href="group__internalPGTStorage.html#gae0be262b206d9b1c3d5b73ccf91355eb">CAS_PGTStorage_AbstractStorage</a>.</p>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00101">101</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga3b535ed0b0bc84801c4bf04b337cd431"></a><!-- doxytag: member="CAS_PGTStorage_Db::getTable" ref="ga3b535ed0b0bc84801c4bf04b337cd431" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::getTable </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the table to use when storing/retrieving PGT's</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the name of the pgt storage table. </dd></dl>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00086">86</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Db_8php_source.html#l00231">CAS_PGTStorage_Db::_createTableSql()</a>, <a class="el" href="Db_8php_source.html#l00261">CAS_PGTStorage_Db::_deletePgtSql()</a>, <a class="el" href="Db_8php_source.html#l00251">CAS_PGTStorage_Db::_retrievePgtSql()</a>, and <a class="el" href="Db_8php_source.html#l00241">CAS_PGTStorage_Db::_storePgtSql()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaa320ce6db1544a8964fc908fbd0783df"></a><!-- doxytag: member="CAS_PGTStorage_Db::init" ref="gaa320ce6db1544a8964fc908fbd0783df" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::init </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to initialize the storage. Halts on error. </p>
+
+<p>Reimplemented from <a class="el" href="group__internalPGTStorage.html#gacee98b92299f2aded9f8792005d2eefc">CAS_PGTStorage_AbstractStorage</a>.</p>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00166">166</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="AbstractStorage_8php_source.html#l00160">CAS_PGTStorage_AbstractStorage::isInitialized()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga100a2b62fd644d608059563606717b48"></a><!-- doxytag: member="CAS_PGTStorage_Db::read" ref="ga100a2b62fd644d608059563606717b48" args="($pgt_iou)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::read </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pgt_iou</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method reads a PGT corresponding to a PGT Iou and deletes the corresponding db entry.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$pgt_iou</em>&nbsp;</td><td>the PGT iou</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the corresponding PGT, or FALSE on error </dd></dl>
+
+<p>Reimplemented from <a class="el" href="group__internalPGTStorage.html#ga67ea1647d16892d59f8e2fd4523f6dc7">CAS_PGTStorage_AbstractStorage</a>.</p>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00353">353</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+<p>References <a class="el" href="Db_8php_source.html#l00261">CAS_PGTStorage_Db::_deletePgtSql()</a>, <a class="el" href="Db_8php_source.html#l00251">CAS_PGTStorage_Db::_retrievePgtSql()</a>, <a class="el" href="Db_8php_source.html#l00063">CAS_PGTStorage_Db::getPdo()</a>, <a class="el" href="Db_8php_source.html#l00212">CAS_PGTStorage_Db::resetErrorMode()</a>, <a class="el" href="Db_8php_source.html#l00201">CAS_PGTStorage_Db::setErrorMode()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga2f1a321e90d6f94fca09ab6f288327b8"></a><!-- doxytag: member="CAS_PGTStorage_Db::resetErrorMode" ref="ga2f1a321e90d6f94fca09ab6f288327b8" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::resetErrorMode </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>this method will reset the error mode on the PDO object </p>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00212">212</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+<p>References <a class="el" href="Db_8php_source.html#l00063">CAS_PGTStorage_Db::getPdo()</a>.</p>
+
+<p>Referenced by <a class="el" href="Db_8php_source.html#l00273">CAS_PGTStorage_Db::createTable()</a>, <a class="el" href="Db_8php_source.html#l00353">CAS_PGTStorage_Db::read()</a>, and <a class="el" href="Db_8php_source.html#l00311">CAS_PGTStorage_Db::write()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga99a44e639bda1b88710fb08f619ab5f7"></a><!-- doxytag: member="CAS_PGTStorage_Db::setErrorMode" ref="ga99a44e639bda1b88710fb08f619ab5f7" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::setErrorMode </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method will enable the Exception error mode on the PDO object </p>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00201">201</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+<p>References <a class="el" href="Db_8php_source.html#l00063">CAS_PGTStorage_Db::getPdo()</a>.</p>
+
+<p>Referenced by <a class="el" href="Db_8php_source.html#l00273">CAS_PGTStorage_Db::createTable()</a>, <a class="el" href="Db_8php_source.html#l00353">CAS_PGTStorage_Db::read()</a>, and <a class="el" href="Db_8php_source.html#l00311">CAS_PGTStorage_Db::write()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga82e33c56ba5fea740d57fd3711652898"></a><!-- doxytag: member="CAS_PGTStorage_Db::write" ref="ga82e33c56ba5fea740d57fd3711652898" args="($pgt, $pgt_iou)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::write </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pgt</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pgt_iou</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method stores a PGT and its corresponding PGT Iou in the database. Echoes a warning on error.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$pgt</em>&nbsp;</td><td>the PGT </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$pgt_iou</em>&nbsp;</td><td>the PGT iou </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Reimplemented from <a class="el" href="group__internalPGTStorage.html#ga28d2bcce9ce91978761746fd9d039edc">CAS_PGTStorage_AbstractStorage</a>.</p>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00311">311</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+<p>References <a class="el" href="Db_8php_source.html#l00241">CAS_PGTStorage_Db::_storePgtSql()</a>, <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="Db_8php_source.html#l00063">CAS_PGTStorage_Db::getPdo()</a>, <a class="el" href="Db_8php_source.html#l00212">CAS_PGTStorage_Db::resetErrorMode()</a>, <a class="el" href="Db_8php_source.html#l00201">CAS_PGTStorage_Db::setErrorMode()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="gaf411a0dde3a26af1136ced781eda9ce4"></a><!-- doxytag: member="CAS_PGTStorage_Db::$_dsn" ref="gaf411a0dde3a26af1136ced781eda9ce4" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::$_dsn<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>database connection options to use when creating a new PDO object </p>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00071">71</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga3c6c1256599c435efbab44881c8ec88c"></a><!-- doxytag: member="CAS_PGTStorage_Db::$_errMode" ref="ga3c6c1256599c435efbab44881c8ec88c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::$_errMode<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>attribute that stores the previous error mode for the PDO handle while processing a transaction </p>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00196">196</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga9e7f285d618bb73b8d91496ebf1e6e83"></a><!-- doxytag: member="CAS_PGTStorage_Db::$_password" ref="ga9e7f285d618bb73b8d91496ebf1e6e83" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::$_password<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00073">73</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gac156a575124a0b6f2722d8892909b51a"></a><!-- doxytag: member="CAS_PGTStorage_Db::$_pdo" ref="gac156a575124a0b6f2722d8892909b51a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::$_pdo<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>the PDO object to use for database interactions </p>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00056">56</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga0d7548f5a7d2c6c5a91b044f89055641"></a><!-- doxytag: member="CAS_PGTStorage_Db::$_table" ref="ga0d7548f5a7d2c6c5a91b044f89055641" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::$_table<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>the table to use for storing/retrieving pgt's </p>
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00079">79</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaeb3ecc301193541bd3aec19e9b71367b"></a><!-- doxytag: member="CAS_PGTStorage_Db::$_table_options" ref="gaeb3ecc301193541bd3aec19e9b71367b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::$_table_options<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00074">74</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga0cb86fcfcc709f502d6eac01389b2cca"></a><!-- doxytag: member="CAS_PGTStorage_Db::$_username" ref="ga0cb86fcfcc709f502d6eac01389b2cca" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_Db::$_username<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Db_8php_source.html#l00072">72</a> of file <a class="el" href="Db_8php_source.html">Db.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalCallback.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalCallback.html
new file mode 100644
index 00000000..9e00374e
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalCallback.html
@@ -0,0 +1,212 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Callback from the CAS server</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>Callback from the CAS server<br/>
+<small>
+[<a class="el" href="group__internalProxy.html">CAS Proxy features (CAS 2.0, Proxy Granting Tickets)</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html#ga18db51da1c4c0324fd3a3f6ab79f6aab">CAS_Client::setCallbackMode</a> ($callback_mode)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html#ga445e92539e88bfaf0670da31f8ba68d8">CAS_Client::isCallbackMode</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html#gaf4703672977711e0ecc3c616cc70215b">CAS_Client::getCallbackURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html#gac8f0af91cf84fb7dbd78c1acb0d7b921">CAS_Client::setCallbackURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html#ga7a7208da84825f761a76246080d12ec0">CAS_Client::callback</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html#gaed4f8867a062dd1ece2e51e9ec31df58">CAS_Client::$_callback_mode</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html#ga4e021ea01bd0aebe95d458a5c7997747">CAS_Client::$_callback_url</a></td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ga7a7208da84825f761a76246080d12ec0"></a><!-- doxytag: member="CAS_Client::callback" ref="ga7a7208da84825f761a76246080d12ec0" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::callback </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is called by CAS_Client::CAS_Client() when running in callback mode. It stores the PGT and its PGT Iou, prints its output and halts. </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01942">1942</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00603">phpCAS::traceExit()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaf4703672977711e0ecc3c616cc70215b"></a><!-- doxytag: member="CAS_Client::getCallbackURL" ref="gaf4703672977711e0ecc3c616cc70215b" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getCallbackURL </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the URL that should be used for the PGT callback (in fact the URL of the current request without any CGI parameter, except if phpCAS::setFixedCallbackURL() was used).</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The callback URL </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01912">1912</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01489">CAS_Client::validateST()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga445e92539e88bfaf0670da31f8ba68d8"></a><!-- doxytag: member="CAS_Client::isCallbackMode" ref="ga445e92539e88bfaf0670da31f8ba68d8" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::isCallbackMode </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns TRUE when the CAs client is running i callback mode, FALSE otherwise.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>A boolean. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01891">1891</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00689">CAS_Client::__construct()</a>, and <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga18db51da1c4c0324fd3a3f6ab79f6aab"></a><!-- doxytag: member="CAS_Client::setCallbackMode" ref="ga18db51da1c4c0324fd3a3f6ab79f6aab" args="($callback_mode)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setCallbackMode </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>callback_mode</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method sets/unsets callback mode.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$callback_mode</em>&nbsp;</td><td>TRUE to set callback mode, FALSE otherwise. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01880">1880</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00689">CAS_Client::__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gac8f0af91cf84fb7dbd78c1acb0d7b921"></a><!-- doxytag: member="CAS_Client::setCallbackURL" ref="gac8f0af91cf84fb7dbd78c1acb0d7b921" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setCallbackURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method sets the callback url.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$callback_url</em>&nbsp;</td><td>url to set callback </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01933">1933</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="gaed4f8867a062dd1ece2e51e9ec31df58"></a><!-- doxytag: member="CAS_Client::$_callback_mode" ref="gaed4f8867a062dd1ece2e51e9ec31df58" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_callback_mode<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>each PHP script using <a class="el" href="classphpCAS.html">phpCAS</a> in proxy mode is its own callback to get the PGT back from the CAS server. callback_mode is detected by the constructor thanks to the GET parameters. a boolean to know if the CAS client is running in callback mode. Written by CAS_Client::setCallBackMode(), read by CAS_Client::isCallbackMode(). </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01873">1873</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga4e021ea01bd0aebe95d458a5c7997747"></a><!-- doxytag: member="CAS_Client::$_callback_url" ref="ga4e021ea01bd0aebe95d458a5c7997747" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_callback_url<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>the URL that should be used for the PGT callback (in fact the URL of the current request without any CGI parameter). Written and read by CAS_Client::getCallbackURL(). </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01903">1903</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalConfig.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalConfig.html
new file mode 100644
index 00000000..39ed3745
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalConfig.html
@@ -0,0 +1,688 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Configuration</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>Configuration<br/>
+<small>
+[<a class="el" href="group__internal.html">Implementation</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="groups"></a>
+Modules</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalBehave.html">Internal behaviour of phpCAS</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html">HTML output</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalLang.html">Internationalization</a></td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga0dfec4f2b30a20582355a0252d7644fa">CAS_Client::getServerVersion</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga8ee3ab0acca92bd0e489e4f3708c177a">CAS_Client::getServerHostname</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gaae25f38d63393d7335596f76f21f24f1">CAS_Client::getServerPort</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gab0963ff44b9a9d900585c89c881fb678">CAS_Client::getServerURI</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gaa50d82f0d6951d1ff1305b870155febe">CAS_Client::getServerBaseURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga75782f9ef91325ce1f235eec5367df5b">CAS_Client::getServerLoginURL</a> ($gateway=false, $renew=false)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gac2d9a37c0dca05e079b078ca67a9c325">CAS_Client::setServerLoginURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga21a9660c25cba68f165b7c4b1ea0456d">CAS_Client::setServerServiceValidateURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gadccec5ba83d4719f433adab32068421b">CAS_Client::setServerProxyValidateURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga39f47156d1e059502f8a3f6f497a461b">CAS_Client::setServerSamlValidateURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga0035da23a096dd33bdbbb14ab36ca759">CAS_Client::getServerServiceValidateURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gae3728c61321dd40d1b59780c15cf24ba">CAS_Client::getServerSamlValidateURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga1232d737fafbe6db69cabce81d863d71">CAS_Client::getServerProxyValidateURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga2ecb28daad3c50c0f6b3ef125ab1faaa">CAS_Client::getServerProxyURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga46c09b45a560eb7dec420e6807fcf16c">CAS_Client::getServerLogoutURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga526dca6da322ff2b00e792c7b7a850ec">CAS_Client::setServerLogoutURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gaa6e5e8340332023e6d6553a423641da5">CAS_Client::setExtraCurlOption</a> ($key, $value)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gadf63185159d9018b2e0bd31f5d2a06e7">CAS_Client::__construct</a> ($server_version, $proxy, $server_hostname, $server_port, $server_uri, $start_session=true)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga54eebbdc5fd41b77de3de25f3bd71c84">CAS_Client::setStartSession</a> ($session)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gad91c4f6f554470da2c3071e073c68bff">CAS_Client::getStartSession</a> ($session)</td></tr>
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gaab876894f8f80166fdc3632274178a05">CAS_Client::$_server</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#gaf9dfac02c509a43b201bbfccf7402c94">CAS_Client::$_curl_options</a> = array()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalConfig.html#ga345e16e8ff0427eea158d2b118f6c5d8">CAS_Client::$_start_session</a></td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="gadf63185159d9018b2e0bd31f5d2a06e7"></a><!-- doxytag: member="CAS_Client::__construct" ref="gadf63185159d9018b2e0bd31f5d2a06e7" args="($server_version, $proxy, $server_hostname, $server_port, $server_uri, $start_session=true)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::__construct </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>server_version</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>proxy</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>server_hostname</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>server_port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>server_uri</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>start_session</em> = <code>true</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="classCAS__Client.html">CAS_Client</a> constructor.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$server_version</em>&nbsp;</td><td>the version of the CAS server </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$proxy</em>&nbsp;</td><td>TRUE if the CAS client is a CAS proxy, FALSE otherwise </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$server_hostname</em>&nbsp;</td><td>the hostname of the CAS server </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$server_port</em>&nbsp;</td><td>the port the CAS server is running on </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$server_uri</em>&nbsp;</td><td>the URI the CAS server is responding on </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$start_session</em>&nbsp;</td><td>Have <a class="el" href="classphpCAS.html">phpCAS</a> start PHP sessions (default true)</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a newly created <a class="el" href="classCAS__Client.html">CAS_Client</a> object </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00689">689</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="Client_8php_source.html#l00298">CAS_Client::getServerVersion()</a>, <a class="el" href="Client_8php_source.html#l01891">CAS_Client::isCallbackMode()</a>, <a class="el" href="Client_8php_source.html#l02927">CAS_Client::isHttps()</a>, <a class="el" href="Client_8php_source.html#l01301">CAS_Client::isLogoutRequest()</a>, <a class="el" href="Client_8php_source.html#l01809">CAS_Client::isProxy()</a>, <a class="el" href="Client_8php_source.html#l01880">CAS_Client::setCallbackMode()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaa50d82f0d6951d1ff1305b870155febe"></a><!-- doxytag: member="CAS_Client::getServerBaseURL" ref="gaa50d82f0d6951d1ff1305b870155febe" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getServerBaseURL </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to retrieve the base URL of the CAS server. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a URL. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00328">328</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00350">CAS_Client::getServerLoginURL()</a>, <a class="el" href="Client_8php_source.html#l00505">CAS_Client::getServerLogoutURL()</a>, <a class="el" href="Client_8php_source.html#l00485">CAS_Client::getServerProxyURL()</a>, <a class="el" href="Client_8php_source.html#l00461">CAS_Client::getServerProxyValidateURL()</a>, <a class="el" href="Client_8php_source.html#l00440">CAS_Client::getServerSamlValidateURL()</a>, <a class="el" href="Client_8php_source.html#l00418">CAS_Client::getServerServiceValidateURL()</a>, and <a class="el" href="Client_8php_source.html#l00096">CAS_Client::HTMLFilterOutput()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga8ee3ab0acca92bd0e489e4f3708c177a"></a><!-- doxytag: member="CAS_Client::getServerHostname" ref="ga8ee3ab0acca92bd0e489e4f3708c177a" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getServerHostname </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to retrieve the hostname of the CAS server. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the hostname of the CAS server. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00307">307</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01312">CAS_Client::handleLogoutRequests()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga75782f9ef91325ce1f235eec5367df5b"></a><!-- doxytag: member="CAS_Client::getServerLoginURL" ref="ga75782f9ef91325ce1f235eec5367df5b" args="($gateway=false, $renew=false)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getServerLoginURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>gateway</em> = <code>false</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>renew</em> = <code>false</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to retrieve the login URL of the CAS server. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$gateway</em>&nbsp;</td><td>true to check authentication, false to force it </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$renew</em>&nbsp;</td><td>true to force the authentication with the CAS server NOTE : It is recommended that CAS implementations ignore the "gateway" parameter if "renew" is set </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a URL. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00350">350</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l02958">CAS_Client::buildQueryUrl()</a>, <a class="el" href="Client_8php_source.html#l00328">CAS_Client::getServerBaseURL()</a>, <a class="el" href="Client_8php_source.html#l02862">CAS_Client::getURL()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01253">CAS_Client::redirectToCas()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga46c09b45a560eb7dec420e6807fcf16c"></a><!-- doxytag: member="CAS_Client::getServerLogoutURL" ref="ga46c09b45a560eb7dec420e6807fcf16c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getServerLogoutURL </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to retrieve the logout URL of the CAS server. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a URL. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00505">505</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l00328">CAS_Client::getServerBaseURL()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01273">CAS_Client::logout()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaae25f38d63393d7335596f76f21f24f1"></a><!-- doxytag: member="CAS_Client::getServerPort" ref="gaae25f38d63393d7335596f76f21f24f1" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getServerPort </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to retrieve the port of the CAS server. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the port of the CAS server. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00314">314</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga2ecb28daad3c50c0f6b3ef125ab1faaa"></a><!-- doxytag: member="CAS_Client::getServerProxyURL" ref="ga2ecb28daad3c50c0f6b3ef125ab1faaa" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getServerProxyURL </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to retrieve the proxy URL of the CAS server. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a URL. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00485">485</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l00328">CAS_Client::getServerBaseURL()</a>, and <a class="el" href="Client_8php_source.html#l00298">CAS_Client::getServerVersion()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga1232d737fafbe6db69cabce81d863d71"></a><!-- doxytag: member="CAS_Client::getServerProxyValidateURL" ref="ga1232d737fafbe6db69cabce81d863d71" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getServerProxyValidateURL </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to retrieve the proxy validating URL of the CAS server. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a URL. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00461">461</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l02958">CAS_Client::buildQueryUrl()</a>, <a class="el" href="Client_8php_source.html#l00328">CAS_Client::getServerBaseURL()</a>, <a class="el" href="Client_8php_source.html#l00298">CAS_Client::getServerVersion()</a>, <a class="el" href="Client_8php_source.html#l02862">CAS_Client::getURL()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gae3728c61321dd40d1b59780c15cf24ba"></a><!-- doxytag: member="CAS_Client::getServerSamlValidateURL" ref="gae3728c61321dd40d1b59780c15cf24ba" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getServerSamlValidateURL </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to retrieve the SAML validating URL of the CAS server. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a URL. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00440">440</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l02958">CAS_Client::buildQueryUrl()</a>, <a class="el" href="Client_8php_source.html#l00328">CAS_Client::getServerBaseURL()</a>, <a class="el" href="Client_8php_source.html#l00298">CAS_Client::getServerVersion()</a>, <a class="el" href="Client_8php_source.html#l02862">CAS_Client::getURL()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga0035da23a096dd33bdbbb14ab36ca759"></a><!-- doxytag: member="CAS_Client::getServerServiceValidateURL" ref="ga0035da23a096dd33bdbbb14ab36ca759" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getServerServiceValidateURL </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to retrieve the service validating URL of the CAS server. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a URL. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00418">418</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l02958">CAS_Client::buildQueryUrl()</a>, <a class="el" href="Client_8php_source.html#l00328">CAS_Client::getServerBaseURL()</a>, <a class="el" href="Client_8php_source.html#l00298">CAS_Client::getServerVersion()</a>, <a class="el" href="Client_8php_source.html#l02862">CAS_Client::getURL()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01489">CAS_Client::validateST()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gab0963ff44b9a9d900585c89c881fb678"></a><!-- doxytag: member="CAS_Client::getServerURI" ref="gab0963ff44b9a9d900585c89c881fb678" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getServerURI </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to retrieve the URI of the CAS server. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a URI. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00321">321</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga0dfec4f2b30a20582355a0252d7644fa"></a><!-- doxytag: member="CAS_Client::getServerVersion" ref="ga0dfec4f2b30a20582355a0252d7644fa" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getServerVersion </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to retrieve the version of the CAS server. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the version of the CAS server. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00298">298</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00689">CAS_Client::__construct()</a>, <a class="el" href="Client_8php_source.html#l00485">CAS_Client::getServerProxyURL()</a>, <a class="el" href="Client_8php_source.html#l00461">CAS_Client::getServerProxyValidateURL()</a>, <a class="el" href="Client_8php_source.html#l00440">CAS_Client::getServerSamlValidateURL()</a>, <a class="el" href="Client_8php_source.html#l00418">CAS_Client::getServerServiceValidateURL()</a>, and <a class="el" href="Client_8php_source.html#l00096">CAS_Client::HTMLFilterOutput()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gad91c4f6f554470da2c3071e073c68bff"></a><!-- doxytag: member="CAS_Client::getStartSession" ref="gad91c4f6f554470da2c3071e073c68bff" args="($session)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getStartSession </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>session</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00844">844</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaa6e5e8340332023e6d6553a423641da5"></a><!-- doxytag: member="CAS_Client::setExtraCurlOption" ref="gaa6e5e8340332023e6d6553a423641da5" args="($key, $value)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setExtraCurlOption </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>key</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>value</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to set additional user curl options. </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00532">532</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gac2d9a37c0dca05e079b078ca67a9c325"></a><!-- doxytag: member="CAS_Client::setServerLoginURL" ref="gac2d9a37c0dca05e079b078ca67a9c325" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setServerLoginURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method sets the login URL of the CAS server. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the login URL </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>0.4.21 by Wyman Chan </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00375">375</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga526dca6da322ff2b00e792c7b7a850ec"></a><!-- doxytag: member="CAS_Client::setServerLogoutURL" ref="ga526dca6da322ff2b00e792c7b7a850ec" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setServerLogoutURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method sets the logout URL of the CAS server. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the logout URL </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>0.4.21 by Wyman Chan </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00519">519</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gadccec5ba83d4719f433adab32068421b"></a><!-- doxytag: member="CAS_Client::setServerProxyValidateURL" ref="gadccec5ba83d4719f433adab32068421b" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setServerProxyValidateURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method sets the proxyValidate URL of the CAS server. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the proxyValidate URL </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>1.1.0 by Joachim Fritschi </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00397">397</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga39f47156d1e059502f8a3f6f497a461b"></a><!-- doxytag: member="CAS_Client::setServerSamlValidateURL" ref="ga39f47156d1e059502f8a3f6f497a461b" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setServerSamlValidateURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method sets the samlValidate URL of the CAS server. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the samlValidate URL </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>1.1.0 by Joachim Fritschi </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00408">408</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga21a9660c25cba68f165b7c4b1ea0456d"></a><!-- doxytag: member="CAS_Client::setServerServiceValidateURL" ref="ga21a9660c25cba68f165b7c4b1ea0456d" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setServerServiceValidateURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method sets the serviceValidate URL of the CAS server. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the serviceValidate URL </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>1.1.0 by Joachim Fritschi </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00386">386</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga54eebbdc5fd41b77de3de25f3bd71c84"></a><!-- doxytag: member="CAS_Client::setStartSession" ref="ga54eebbdc5fd41b77de3de25f3bd71c84" args="($session)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setStartSession </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>session</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00839">839</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="gaf9dfac02c509a43b201bbfccf7402c94"></a><!-- doxytag: member="CAS_Client::$_curl_options" ref="gaf9dfac02c509a43b201bbfccf7402c94" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_curl_options = array()<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>An array to store extra curl options. </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00527">527</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaab876894f8f80166fdc3632274178a05"></a><!-- doxytag: member="CAS_Client::$_server" ref="gaab876894f8f80166fdc3632274178a05" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_server<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>a record to store information about the CAS server.</p>
+<ul>
+<li>$_server["version"]: the version of the CAS server</li>
+<li>$_server["hostname"]: the hostname of the CAS server</li>
+<li>$_server["port"]: the port the CAS server is running on</li>
+<li>$_server["uri"]: the base URI the CAS server is responding on</li>
+<li>$_server["base_url"]: the base URL of the CAS server</li>
+<li>$_server["login_url"]: the login URL of the CAS server</li>
+<li>$_server["service_validate_url"]: the service validating URL of the CAS server</li>
+<li>$_server["proxy_url"]: the proxy URL of the CAS server</li>
+<li>$_server["proxy_validate_url"]: the proxy validating URL of the CAS server</li>
+<li>$_server["logout_url"]: the logout URL of the CAS server</li>
+</ul>
+<p>$_server["version"], $_server["hostname"], $_server["port"] and $_server["uri"] are written by CAS_Client::CAS_Client(), read by CAS_Client::getServerVersion(), CAS_Client::getServerHostname(), CAS_Client::getServerPort() and CAS_Client::getServerURI().</p>
+<p>The other fields are written and read by CAS_Client::getServerBaseURL(), CAS_Client::getServerLoginURL(), CAS_Client::getServerServiceValidateURL(), CAS_Client::getServerProxyValidateURL() and CAS_Client::getServerLogoutURL(). </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00288">288</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga345e16e8ff0427eea158d2b118f6c5d8"></a><!-- doxytag: member="CAS_Client::$_start_session" ref="ga345e16e8ff0427eea158d2b118f6c5d8" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_start_session<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>A variable to whether phpcas will use its own session handling. Default = true </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00837">837</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalDebug.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalDebug.html
new file mode 100644
index 00000000..eaa8ae2f
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalDebug.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Debugging</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Debugging<br/>
+<small>
+[<a class="el" href="group__internal.html">Implementation</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalLang.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalLang.html
new file mode 100644
index 00000000..e9c67542
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalLang.html
@@ -0,0 +1,216 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Internationalization</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#files">Files</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>Internationalization<br/>
+<small>
+[<a class="el" href="group__internalConfig.html">Configuration</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="files"></a>
+Files</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="spanish_8php.html">spanish.php</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="english_8php.html">english.php</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="english_8php.html">english.php</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="german_8php.html">german.php</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="greek_8php.html">greek.php</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="languages_8php.html">languages.php</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="spanish_8php.html">spanish.php</a></td></tr>
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalLang.html#ga09705919fa8acfdfe25b3d8bf78309ac">PHPCAS_LANG_DEFAULT</a> </td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalLang.html#gab30d0e0fc8414be34c1f2a28649124d0">CAS_Client::getLang</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalLang.html#ga18db72fc208dacf384d74dfc5c3713ad">CAS_Client::getString</a> ($str)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalLang.html#ga29c04b71561ffeed72ef005dadf7dc95">CAS_Client::setLang</a> ($lang)</td></tr>
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalLang.html#ga38abc1fb5f662312e367c8b8bad449c5">CAS_Client::$_lang</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalLang.html#ga66167ea1adb6c18e3141d8ca90df6044">CAS_Client::$_strings</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>To add a new language:</p>
+<ul>
+<li>1. define a new constant PHPCAS_LANG_XXXXXX in CAS/CAS.php</li>
+<li>2. copy any file from CAS/languages to CAS/languages/XXXXXX.php</li>
+<li>3. Make the translations </li>
+</ul>
+<hr/><h2>Enumeration Type Documentation</h2>
+<a class="anchor" id="ga09705919fa8acfdfe25b3d8bf78309ac"></a><!-- doxytag: member="CAS.php::PHPCAS_LANG_DEFAULT" ref="ga09705919fa8acfdfe25b3d8bf78309ac" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__internalLang.html#ga09705919fa8acfdfe25b3d8bf78309ac">PHPCAS_LANG_DEFAULT</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="classphpCAS.html">phpCAS</a> default language (when phpCAS::setLang() is not used) </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00228">228</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="gab30d0e0fc8414be34c1f2a28649124d0"></a><!-- doxytag: member="CAS_Client::getLang" ref="gab30d0e0fc8414be34c1f2a28649124d0" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getLang </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the language used by <a class="el" href="classphpCAS.html">phpCAS</a>.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a string representing the language </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00201">201</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l00245">CAS_Client::setLang()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00226">CAS_Client::getString()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga18db72fc208dacf384d74dfc5c3713ad"></a><!-- doxytag: member="CAS_Client::getString" ref="ga18db72fc208dacf384d74dfc5c3713ad" args="($str)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getString </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>str</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns a string depending on the language.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$str</em>&nbsp;</td><td>the index of the string in $_string.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the string corresponding to $index in $string. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00226">226</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="catalan_8php_source.html#l00010">_strings</a>, and <a class="el" href="Client_8php_source.html#l00201">CAS_Client::getLang()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01273">CAS_Client::logout()</a>, <a class="el" href="Client_8php_source.html#l00147">CAS_Client::printHTMLFooter()</a>, and <a class="el" href="Client_8php_source.html#l01253">CAS_Client::redirectToCas()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga29c04b71561ffeed72ef005dadf7dc95"></a><!-- doxytag: member="CAS_Client::setLang" ref="ga29c04b71561ffeed72ef005dadf7dc95" args="($lang)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setLang </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>lang</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to set the language used by <a class="el" href="classphpCAS.html">phpCAS</a>. </p>
+<dl class="note"><dt><b>Note:</b></dt><dd>Can be called only once.</dd></dl>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$lang</em>&nbsp;</td><td>a string representing the language.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="see"><dt><b>See also:</b></dt><dd>CAS_LANG_FRENCH, CAS_LANG_ENGLISH </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00245">245</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="catalan_8php_source.html#l00010">_strings</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00201">CAS_Client::getLang()</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="ga38abc1fb5f662312e367c8b8bad449c5"></a><!-- doxytag: member="CAS_Client::$_lang" ref="ga38abc1fb5f662312e367c8b8bad449c5" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_lang<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>A string corresponding to the language used by <a class="el" href="classphpCAS.html">phpCAS</a>. Written by CAS_Client::setLang(), read by CAS_Client::getLang().</p>
+<dl class="note"><dt><b>Note:</b></dt><dd>debugging information is always in english (debug purposes only).</dd></dl>
+<dl class="see"><dt><b>See also:</b></dt><dd>CAS_Client::_strings, CAS_Client::getString() </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00194">194</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga66167ea1adb6c18e3141d8ca90df6044"></a><!-- doxytag: member="CAS_Client::$_strings" ref="ga66167ea1adb6c18e3141d8ca90df6044" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$<a class="el" href="spanish_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>array containing the strings used by <a class="el" href="classphpCAS.html">phpCAS</a>. Written by CAS_Client::setLang(), read by CAS_Client::getString() and used by CAS_Client::setLang().</p>
+<dl class="note"><dt><b>Note:</b></dt><dd>This array is filled by instructions in CAS/languages/&lt;$this-&gt;_lang&gt;.php</dd></dl>
+<dl class="see"><dt><b>See also:</b></dt><dd>CAS_Client::_lang, CAS_Client::getString(), CAS_Client::setLang(), CAS_Client::getLang() </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00216">216</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalMisc.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalMisc.html
new file mode 100644
index 00000000..dbe00659
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalMisc.html
@@ -0,0 +1,542 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Miscellaneous</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>Miscellaneous<br/>
+<small>
+[<a class="el" href="group__internal.html">Implementation</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga4a53dbb5ea834fc4593077481573b36e">CAS_Client::readURL</a> ($url, &amp;$headers, &amp;$body, &amp;$err_msg)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga03ddc75a7cdf1f5ba02d4818e1e603b6">CAS_Client::buildSAMLPayload</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga26a5099cda64d77d48bbafd6f3ba10ae">CAS_Client::_curl_read_headers</a> ($ch, $header)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga8bd9440411c9be24e955c9edd74e49de">CAS_Client::setURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#gaa7564ffa02c80ebf8ec2d7238a22f9e0">CAS_Client::getURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga6cc85870c043cb9ed421344d25c23571">CAS_Client::getServerUrl</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#gab152ae390e1930f926b5f7bba8be050c">CAS_Client::isHttps</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga17d50d97a83a4925a08dced7e231d6d9">CAS_Client::removeParameterFromQueryString</a> ($parameterName, $queryString)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#gac0540d05b6f1e0d67c43980abeece437">CAS_Client::buildQueryUrl</a> ($url, $query)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga889fb725f0c8f080963ee30872031d4d">CAS_Client::renameSession</a> ($ticket)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga1d8d2502381f066a46433693f7eac14f">CAS_Client::authError</a> ($failure, $cas_url, $no_response, $bad_response='', $cas_response='', $err_code='', $err_msg='')</td></tr>
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga2b0b79203463993ca19271ce06eb57df">CAS_Client::$_curl_headers</a> = array()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#gaed9c4090f713574a6df8fdc2e32409ca">CAS_Client::$_url</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga08974bbe1899b5ddc7570d454ca27c80">$GLOBALS</a> ['PHPCAS_CLIENT']</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#gae4b200587aaf8750dd62b04054781032">$GLOBALS</a> ['PHPCAS_INIT_CALL']</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga0833844c10e860f74fe6dadc02d3b8b7">$GLOBALS</a> ['PHPCAS_AUTH_CHECK_CALL']</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalMisc.html#ga2abd10340f5965a876ccabd507ef8f45">$GLOBALS</a> ['PHPCAS_DEBUG']</td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ga26a5099cda64d77d48bbafd6f3ba10ae"></a><!-- doxytag: member="CAS_Client::_curl_read_headers" ref="ga26a5099cda64d77d48bbafd6f3ba10ae" args="($ch, $header)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::_curl_read_headers </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>ch</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>header</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is the callback used by readURL method to request HTTP headers. </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02329">2329</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga1d8d2502381f066a46433693f7eac14f"></a><!-- doxytag: member="CAS_Client::authError" ref="ga1d8d2502381f066a46433693f7eac14f" args="($failure, $cas_url, $no_response, $bad_response='', $cas_response='', $err_code='', $err_msg='')" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::authError </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>failure</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>cas_url</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>no_response</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>bad_response</em> = <code>''</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>cas_response</em> = <code>''</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>err_code</em> = <code>''</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>err_msg</em> = <code>''</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to print the HTML output when the user was not authenticated.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$failure</em>&nbsp;</td><td>the failure that occured </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$cas_url</em>&nbsp;</td><td>the URL the CAS server was asked for </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$no_response</em>&nbsp;</td><td>the response from the CAS server (other parameters are ignored if TRUE) </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$bad_response</em>&nbsp;</td><td>bad response from the CAS server ($err_code and $err_msg ignored if TRUE) </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$cas_response</em>&nbsp;</td><td>the response of the CAS server </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$err_code</em>&nbsp;</td><td>the error code given by the CAS server </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$err_msg</em>&nbsp;</td><td>the error message given by the CAS server </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l03009">3009</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="config_8php_source.html#l00063">$cas_url</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00603">phpCAS::traceExit()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01489">CAS_Client::validateST()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gac0540d05b6f1e0d67c43980abeece437"></a><!-- doxytag: member="CAS_Client::buildQueryUrl" ref="gac0540d05b6f1e0d67c43980abeece437" args="($url, $query)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::buildQueryUrl </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>query</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to append query parameters to an url. Since the url might already contain parameter it has to be detected and to build a proper URL </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>base url to add the query params to </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$query</em>&nbsp;</td><td>params in query form with &amp; separated </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>url with query params </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02958">2958</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00350">CAS_Client::getServerLoginURL()</a>, <a class="el" href="Client_8php_source.html#l00461">CAS_Client::getServerProxyValidateURL()</a>, <a class="el" href="Client_8php_source.html#l00440">CAS_Client::getServerSamlValidateURL()</a>, and <a class="el" href="Client_8php_source.html#l00418">CAS_Client::getServerServiceValidateURL()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga03ddc75a7cdf1f5ba02d4818e1e603b6"></a><!-- doxytag: member="CAS_Client::buildSAMLPayload" ref="ga03ddc75a7cdf1f5ba02d4818e1e603b6" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::buildSAMLPayload </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to build the SAML POST body sent to /samlValidate URL.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the SOAP-encased SAMLP artifact (the ticket). </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02312">2312</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga6cc85870c043cb9ed421344d25c23571"></a><!-- doxytag: member="CAS_Client::getServerUrl" ref="ga6cc85870c043cb9ed421344d25c23571" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getServerUrl </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Try to figure out the server URL with possible Proxys / Ports etc. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>Server URL with domain:port </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02898">2898</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaa7564ffa02c80ebf8ec2d7238a22f9e0"></a><!-- doxytag: member="CAS_Client::getURL" ref="gaa7564ffa02c80ebf8ec2d7238a22f9e0" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getURL </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the URL of the current request (without any ticket CGI parameter).</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The URL </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02862">2862</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00350">CAS_Client::getServerLoginURL()</a>, <a class="el" href="Client_8php_source.html#l00461">CAS_Client::getServerProxyValidateURL()</a>, <a class="el" href="Client_8php_source.html#l00440">CAS_Client::getServerSamlValidateURL()</a>, <a class="el" href="Client_8php_source.html#l00418">CAS_Client::getServerServiceValidateURL()</a>, and <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gab152ae390e1930f926b5f7bba8be050c"></a><!-- doxytag: member="CAS_Client::isHttps" ref="gab152ae390e1930f926b5f7bba8be050c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::isHttps </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method checks to see if the request is secured via HTTPS </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>true if https, false otherwise </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02927">2927</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00689">CAS_Client::__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga4a53dbb5ea834fc4593077481573b36e"></a><!-- doxytag: member="CAS_Client::readURL" ref="ga4a53dbb5ea834fc4593077481573b36e" args="($url, &amp;$headers, &amp;$body, &amp;$err_msg)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::readURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>headers</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>body</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>err_msg</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to acces a remote URL.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the URL to access. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$headers</em>&nbsp;</td><td>an array containing the HTTP header lines of the response (an empty array on failure). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$body</em>&nbsp;</td><td>the body of the response, as a string (empty on failure). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$err_msg</em>&nbsp;</td><td>an error message, filled on failure.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>TRUE on success, FALSE otherwise (in this later case, $err_msg contains an error message). </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02264">2264</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01489">CAS_Client::validateST()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga17d50d97a83a4925a08dced7e231d6d9"></a><!-- doxytag: member="CAS_Client::removeParameterFromQueryString" ref="ga17d50d97a83a4925a08dced7e231d6d9" args="($parameterName, $queryString)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::removeParameterFromQueryString </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>parameterName</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>queryString</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Removes a parameter from a query string</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$parameterName </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$queryString </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>string</dd></dl>
+<p><a class="el" href="">http://stackoverflow.com/questions/1842681/regular-expression-to-remove-one-parameter-from-query-string</a></p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02944">2944</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga889fb725f0c8f080963ee30872031d4d"></a><!-- doxytag: member="CAS_Client::renameSession" ref="ga889fb725f0c8f080963ee30872031d4d" args="($ticket)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::renameSession </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>ticket</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Renaming the session </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02967">2967</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga8bd9440411c9be24e955c9edd74e49de"></a><!-- doxytag: member="CAS_Client::setURL" ref="ga8bd9440411c9be24e955c9edd74e49de" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method sets the URL of the current request</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>url to set for service </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02851">2851</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="ga2b0b79203463993ca19271ce06eb57df"></a><!-- doxytag: member="CAS_Client::$_curl_headers" ref="ga2b0b79203463993ca19271ce06eb57df" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_curl_headers = array()<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02325">2325</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaed9c4090f713574a6df8fdc2e32409ca"></a><!-- doxytag: member="CAS_Client::$_url" ref="gaed9c4090f713574a6df8fdc2e32409ca" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_url<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>the URL of the current request (without any ticket CGI parameter). Written and read by CAS_Client::getURL(). </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02843">2843</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga0833844c10e860f74fe6dadc02d3b8b7"></a><!-- doxytag: member="CAS.php::$GLOBALS" ref="ga0833844c10e860f74fe6dadc02d3b8b7" args="['PHPCAS_AUTH_CHECK_CALL']" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$GLOBALS['PHPCAS_AUTH_CHECK_CALL']</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This global variable is used to store where the method checking the authentication is called from (to print comprehensive errors) </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00279">279</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gae4b200587aaf8750dd62b04054781032"></a><!-- doxytag: member="CAS.php::$GLOBALS" ref="gae4b200587aaf8750dd62b04054781032" args="['PHPCAS_INIT_CALL']" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$GLOBALS['PHPCAS_INIT_CALL']</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This global variable is used to store where the initializer is called from (to print a comprehensive error in case of multiple calls). </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00266">266</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga08974bbe1899b5ddc7570d454ca27c80"></a><!-- doxytag: member="CAS.php::$GLOBALS" ref="ga08974bbe1899b5ddc7570d454ca27c80" args="['PHPCAS_CLIENT']" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$GLOBALS['PHPCAS_CLIENT']</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This global variable is used by the interface class <a class="el" href="classphpCAS.html">phpCAS</a>. </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00258">258</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga2abd10340f5965a876ccabd507ef8f45"></a><!-- doxytag: member="CAS.php::$GLOBALS" ref="ga2abd10340f5965a876ccabd507ef8f45" args="['PHPCAS_DEBUG']" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$GLOBALS['PHPCAS_DEBUG']</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This global variable is used to store <a class="el" href="classphpCAS.html">phpCAS</a> debug mode. </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00292">292</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalOutput.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalOutput.html
new file mode 100644
index 00000000..cfb06171
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalOutput.html
@@ -0,0 +1,236 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: HTML output</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>HTML output<br/>
+<small>
+[<a class="el" href="group__internalConfig.html">Configuration</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html#gad7299282ff326a3c3438d0ef20c0fdc5">CAS_Client::HTMLFilterOutput</a> ($str)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html#ga37ddf683af4f98f07f64ce4bf8b6667a">CAS_Client::printHTMLHeader</a> ($title)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html#ga0ff1bdc24180f4f60ffa07dfc8b81d61">CAS_Client::printHTMLFooter</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html#ga7c05d2293082e77a79799c009dd979c9">CAS_Client::setHTMLHeader</a> ($header)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html#ga379dd7ed8f510e03321b449369024535">CAS_Client::setHTMLFooter</a> ($footer)</td></tr>
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html#gaf411bbf487e36147d8835ea4337305a9">CAS_Client::$_output_header</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalOutput.html#gaa90031f70e10981383b813385869f96e">CAS_Client::$_output_footer</a></td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="gad7299282ff326a3c3438d0ef20c0fdc5"></a><!-- doxytag: member="CAS_Client::HTMLFilterOutput" ref="gad7299282ff326a3c3438d0ef20c0fdc5" args="($str)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::HTMLFilterOutput </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>str</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method filters a string by replacing special tokens by appropriate values and prints it. The corresponding tokens are taken into account:</p>
+<ul>
+<li>__CAS_VERSION__</li>
+<li>__PHPCAS_VERSION__</li>
+<li>__SERVER_BASE_URL__</li>
+</ul>
+<p>Used by CAS_Client::PrintHTMLHeader() and CAS_Client::printHTMLFooter().</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$str</em>&nbsp;</td><td>the string to filter and output </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00096">96</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l00328">CAS_Client::getServerBaseURL()</a>, <a class="el" href="Client_8php_source.html#l00298">CAS_Client::getServerVersion()</a>, and <a class="el" href="CAS_8php_source.html#l00655">phpCAS::getVersion()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00147">CAS_Client::printHTMLFooter()</a>, and <a class="el" href="Client_8php_source.html#l00121">CAS_Client::printHTMLHeader()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga0ff1bdc24180f4f60ffa07dfc8b81d61"></a><!-- doxytag: member="CAS_Client::printHTMLFooter" ref="ga0ff1bdc24180f4f60ffa07dfc8b81d61" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::printHTMLFooter </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method prints the footer of the HTML output (after filtering). If CAS_Client::setHTMLFooter() was not used, a default footer is output.</p>
+<dl class="see"><dt><b>See also:</b></dt><dd>HTMLFilterOutput() </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00147">147</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l00226">CAS_Client::getString()</a>, and <a class="el" href="Client_8php_source.html#l00096">CAS_Client::HTMLFilterOutput()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01273">CAS_Client::logout()</a>, and <a class="el" href="Client_8php_source.html#l01253">CAS_Client::redirectToCas()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga37ddf683af4f98f07f64ce4bf8b6667a"></a><!-- doxytag: member="CAS_Client::printHTMLHeader" ref="ga37ddf683af4f98f07f64ce4bf8b6667a" args="($title)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::printHTMLHeader </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>title</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method prints the header of the HTML output (after filtering). If CAS_Client::setHTMLHeader() was not used, a default header is output.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$title</em>&nbsp;</td><td>the title of the page</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="see"><dt><b>See also:</b></dt><dd>HTMLFilterOutput() </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00121">121</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="Client_8php_source.html#l00096">CAS_Client::HTMLFilterOutput()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01273">CAS_Client::logout()</a>, and <a class="el" href="Client_8php_source.html#l01253">CAS_Client::redirectToCas()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga379dd7ed8f510e03321b449369024535"></a><!-- doxytag: member="CAS_Client::setHTMLFooter" ref="ga379dd7ed8f510e03321b449369024535" args="($footer)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setHTMLFooter </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>footer</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method set the HTML footer used for all outputs.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$footer</em>&nbsp;</td><td>the HTML footer. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00169">169</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga7c05d2293082e77a79799c009dd979c9"></a><!-- doxytag: member="CAS_Client::setHTMLHeader" ref="ga7c05d2293082e77a79799c009dd979c9" args="($header)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setHTMLHeader </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>header</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method set the HTML header used for all outputs.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$header</em>&nbsp;</td><td>the HTML header. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00159">159</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="gaa90031f70e10981383b813385869f96e"></a><!-- doxytag: member="CAS_Client::$_output_footer" ref="gaa90031f70e10981383b813385869f96e" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_output_footer<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>A string used to print the footer of HTML pages. Written by CAS_Client::setHTMLFooter(), read by printHTMLFooter().</p>
+<dl class="see"><dt><b>See also:</b></dt><dd>CAS_Client::setHTMLFooter, CAS_Client::printHTMLFooter() </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00139">139</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaf411bbf487e36147d8835ea4337305a9"></a><!-- doxytag: member="CAS_Client::$_output_header" ref="gaf411bbf487e36147d8835ea4337305a9" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_output_header<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>A string used to print the header of HTML pages. Written by CAS_Client::setHTMLHeader(), read by CAS_Client::printHTMLHeader().</p>
+<dl class="see"><dt><b>See also:</b></dt><dd>CAS_Client::setHTMLHeader, CAS_Client::printHTMLHeader() </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l00111">111</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalPGTStorage.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalPGTStorage.html
new file mode 100644
index 00000000..84c776f7
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalPGTStorage.html
@@ -0,0 +1,667 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: PGT storage</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#groups">Modules</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>PGT storage<br/>
+<small>
+[<a class="el" href="group__internalProxy.html">CAS Proxy features (CAS 2.0, Proxy Granting Tickets)</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a></td></tr>
+<tr><td colspan="2"><h2><a name="groups"></a>
+Modules</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageDb.html">PGT storage in a database</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html">PGT storage on the filesystem</a></td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga511cf65486f483837a48c50588b638a0">CAS_Client::initPGTStorage</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga244695840dc3a3964707cc355a0b631c">CAS_Client::storePGT</a> ($pgt, $pgt_iou)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#gab185f7f3bf5bd642ce35978f6b0c7ab8">CAS_Client::loadPGT</a> ($pgt_iou)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga4d407488ad4ca4409e4128a98d1d3801">CAS_Client::setPGTStorage</a> ($storage)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga37d474907361e521a00259c04b712fe4">CAS_Client::setPGTStorageDb</a> ($dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#gac179a4316bd15cd498f90a6599c7df4c">CAS_Client::setPGTStorageFile</a> ($path='')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga8c7c97937692e79da12a8be3df634cbe">CAS_Client::validatePGT</a> (&amp;$validate_url, $text_response, $tree_response)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga0c5561328fcab419325ae53d70dddf12">CAS_Client::retrievePT</a> ($target_service, &amp;$err_code, &amp;$err_msg)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga9ffd47d7bbf118b901bf1c449f4b20c2">CAS_PGTStorage_AbstractStorage::__construct</a> ($cas_parent)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#gae0be262b206d9b1c3d5b73ccf91355eb">CAS_PGTStorage_AbstractStorage::getStorageType</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga9611a5217179596541d29d0a8d9ee7e7">CAS_PGTStorage_AbstractStorage::getStorageInfo</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga1fe701d2302688bb7876eb4f8d7580d8">CAS_PGTStorage_AbstractStorage::setErrorMessage</a> ($error_message)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga68540ebebfe710140d16bab3ef1d61c1">CAS_PGTStorage_AbstractStorage::getErrorMessage</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#gad9cadc643a37b8a000acd42189fff761">CAS_PGTStorage_AbstractStorage::isInitialized</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#gacee98b92299f2aded9f8792005d2eefc">CAS_PGTStorage_AbstractStorage::init</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga28d2bcce9ce91978761746fd9d039edc">CAS_PGTStorage_AbstractStorage::write</a> ($pgt, $pgt_iou)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga67ea1647d16892d59f8e2fd4523f6dc7">CAS_PGTStorage_AbstractStorage::read</a> ($pgt_iou)</td></tr>
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#gad1f8471bde7999b0465c8f3f109a6aba">CAS_Client::$_pgt_storage</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga90ed7dc15a9c24154900bccc2ea5925d">CAS_PGTStorage_AbstractStorage::$_error_message</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html#ga5bab9d6ccaeca2cbcc04ab1a2c0e4d16">CAS_PGTStorage_AbstractStorage::$_initialized</a></td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ga9ffd47d7bbf118b901bf1c449f4b20c2"></a><!-- doxytag: member="CAS_PGTStorage_AbstractStorage::__construct" ref="ga9ffd47d7bbf118b901bf1c449f4b20c2" args="($cas_parent)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_AbstractStorage::__construct </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>cas_parent</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The constructor of the class, should be called only by inherited classes.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$cas_parent</em>&nbsp;</td><td>the CASclient instance that creates the current object. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="AbstractStorage_8php_source.html#l00063">63</a> of file <a class="el" href="AbstractStorage_8php_source.html">AbstractStorage.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga68540ebebfe710140d16bab3ef1d61c1"></a><!-- doxytag: member="CAS_PGTStorage_AbstractStorage::getErrorMessage" ref="ga68540ebebfe710140d16bab3ef1d61c1" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_AbstractStorage::getErrorMessage </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns an error message set by PGTStorage::setErrorMessage().</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>an error message when set by PGTStorage::setErrorMessage(), FALSE otherwise.</dd></dl>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000003">Deprecated:</a></b></dt><dd>not used. </dd></dl>
+
+<p>Definition at line <a class="el" href="AbstractStorage_8php_source.html#l00135">135</a> of file <a class="el" href="AbstractStorage_8php_source.html">AbstractStorage.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga9611a5217179596541d29d0a8d9ee7e7"></a><!-- doxytag: member="CAS_PGTStorage_AbstractStorage::getStorageInfo" ref="ga9611a5217179596541d29d0a8d9ee7e7" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_AbstractStorage::getStorageInfo </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This virtual method returns an informational string giving informations on the parameters of the storage.(used for debugging purposes). </p>
+
+<p>Reimplemented in <a class="el" href="group__internalCAS__PGTStorageDb.html#gaa453c54860a59f8bf1e1550334717542">CAS_PGTStorage_Db</a>, and <a class="el" href="group__internalPGTStorageFile.html#gad68bdd31082cd1b7852d671d0078d6ca">CAS_PGTStorage_File</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractStorage_8php_source.html#l00093">93</a> of file <a class="el" href="AbstractStorage_8php_source.html">AbstractStorage.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gae0be262b206d9b1c3d5b73ccf91355eb"></a><!-- doxytag: member="CAS_PGTStorage_AbstractStorage::getStorageType" ref="gae0be262b206d9b1c3d5b73ccf91355eb" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_AbstractStorage::getStorageType </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This virtual method returns an informational string giving the type of storage used by the object (used for debugging purposes). </p>
+
+<p>Reimplemented in <a class="el" href="group__internalCAS__PGTStorageDb.html#ga7d60f1fd625678603f67fc1960ab0fbd">CAS_PGTStorage_Db</a>, and <a class="el" href="group__internalPGTStorageFile.html#ga19d04a68b743138f9545176ba75ff58d">CAS_PGTStorage_File</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractStorage_8php_source.html#l00082">82</a> of file <a class="el" href="AbstractStorage_8php_source.html">AbstractStorage.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gacee98b92299f2aded9f8792005d2eefc"></a><!-- doxytag: member="CAS_PGTStorage_AbstractStorage::init" ref="gacee98b92299f2aded9f8792005d2eefc" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_AbstractStorage::init </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This virtual method initializes the object. </p>
+
+<p>Reimplemented in <a class="el" href="group__internalCAS__PGTStorageDb.html#gaa320ce6db1544a8964fc908fbd0783df">CAS_PGTStorage_Db</a>, and <a class="el" href="group__internalPGTStorageFile.html#ga422f5a7ca597539b816e87b51f445843">CAS_PGTStorage_File</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractStorage_8php_source.html#l00170">170</a> of file <a class="el" href="AbstractStorage_8php_source.html">AbstractStorage.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga511cf65486f483837a48c50588b638a0"></a><!-- doxytag: member="CAS_Client::initPGTStorage" ref="ga511cf65486f483837a48c50588b638a0" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::initPGTStorage </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to initialize the storage of PGT's. Halts on error. </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01987">1987</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gad9cadc643a37b8a000acd42189fff761"></a><!-- doxytag: member="CAS_PGTStorage_AbstractStorage::isInitialized" ref="gad9cadc643a37b8a000acd42189fff761" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_AbstractStorage::isInitialized </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method tells if the storage has already been intialized.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a boolean </dd></dl>
+
+<p>Definition at line <a class="el" href="AbstractStorage_8php_source.html#l00160">160</a> of file <a class="el" href="AbstractStorage_8php_source.html">AbstractStorage.php</a>.</p>
+
+<p>Referenced by <a class="el" href="File_8php_source.html#l00153">CAS_PGTStorage_File::init()</a>, and <a class="el" href="Db_8php_source.html#l00166">CAS_PGTStorage_Db::init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gab185f7f3bf5bd642ce35978f6b0c7ab8"></a><!-- doxytag: member="CAS_Client::loadPGT" ref="gab185f7f3bf5bd642ce35978f6b0c7ab8" args="($pgt_iou)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::loadPGT </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pgt_iou</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method reads a PGT from its Iou and deletes the corresponding storage entry.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$pgt_iou</em>&nbsp;</td><td>the PGT Iou</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The PGT corresponding to the Iou, FALSE when not found. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02019">2019</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga67ea1647d16892d59f8e2fd4523f6dc7"></a><!-- doxytag: member="CAS_PGTStorage_AbstractStorage::read" ref="ga67ea1647d16892d59f8e2fd4523f6dc7" args="($pgt_iou)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_AbstractStorage::read </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pgt_iou</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This virtual method reads a PGT corresponding to a PGT Iou and deletes the corresponding storage entry. </p>
+<dl class="note"><dt><b>Note:</b></dt><dd>Should never be called.</dd></dl>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$pgt_iou</em>&nbsp;</td><td>the PGT iou </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Reimplemented in <a class="el" href="group__internalCAS__PGTStorageDb.html#ga100a2b62fd644d608059563606717b48">CAS_PGTStorage_Db</a>, and <a class="el" href="group__internalPGTStorageFile.html#ga14fe054afb4c780b567a5d8ac8214754">CAS_PGTStorage_File</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractStorage_8php_source.html#l00202">202</a> of file <a class="el" href="AbstractStorage_8php_source.html">AbstractStorage.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga0c5561328fcab419325ae53d70dddf12"></a><!-- doxytag: member="CAS_Client::retrievePT" ref="ga0c5561328fcab419325ae53d70dddf12" args="($target_service, &amp;$err_code, &amp;$err_msg)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::retrievePT </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>target_service</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>err_code</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>err_msg</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to retrieve PT's from the CAS server thanks to a PGT.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$target_service</em>&nbsp;</td><td>the service to ask for with the PT. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$err_code</em>&nbsp;</td><td>an error code (PHPCAS_SERVICE_OK on success). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$err_msg</em>&nbsp;</td><td>an error message (empty on success).</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a Proxy Ticket, or FALSE on error. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02143">2143</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="config_8php_source.html#l00063">$cas_url</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga1fe701d2302688bb7876eb4f8d7580d8"></a><!-- doxytag: member="CAS_PGTStorage_AbstractStorage::setErrorMessage" ref="ga1fe701d2302688bb7876eb4f8d7580d8" args="($error_message)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_AbstractStorage::setErrorMessage </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>error_message</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [protected, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method sets en error message, which can be read later by PGTStorage::getErrorMessage().</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$error_message</em>&nbsp;</td><td>an error message</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>not used. </dd></dl>
+
+<p>Definition at line <a class="el" href="AbstractStorage_8php_source.html#l00121">121</a> of file <a class="el" href="AbstractStorage_8php_source.html">AbstractStorage.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga4d407488ad4ca4409e4128a98d1d3801"></a><!-- doxytag: member="CAS_Client::setPGTStorage" ref="ga4d407488ad4ca4409e4128a98d1d3801" args="($storage)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setPGTStorage </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>storage</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method can be used to set a custom PGT storage object.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$storage</em>&nbsp;</td><td>a PGT storage object that inherits from the CAS_PGTStorage class </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02032">2032</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga37d474907361e521a00259c04b712fe4"></a><!-- doxytag: member="CAS_Client::setPGTStorageDb" ref="ga37d474907361e521a00259c04b712fe4" args="($dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setPGTStorageDb </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>dsn_or_pdo</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>username</em> = <code>''</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>password</em> = <code>''</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>table</em> = <code>''</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>driver_options</em> = <code>null</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to tell <a class="el" href="classphpCAS.html">phpCAS</a> to store the response of the CAS server to PGT requests in a database.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$dsn_or_pdo</em>&nbsp;</td><td>a dsn string to use for creating a PDO object or a PDO object </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$username</em>&nbsp;</td><td>the username to use when connecting to the database </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$password</em>&nbsp;</td><td>the password to use when connecting to the database </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$table</em>&nbsp;</td><td>the table to use for storing and retrieving PGT's </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$driver_options</em>&nbsp;</td><td>any driver options to use when connecting to the database </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02058">2058</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gac179a4316bd15cd498f90a6599c7df4c"></a><!-- doxytag: member="CAS_Client::setPGTStorageFile" ref="gac179a4316bd15cd498f90a6599c7df4c" args="($path='')" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setPGTStorageFile </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>path</em> = <code>''</code></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to tell <a class="el" href="classphpCAS.html">phpCAS</a> to store the response of the CAS server to PGT requests onto the filesystem.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$format</em>&nbsp;</td><td>the format used to store the PGT's (`plain' and `xml' allowed) </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$path</em>&nbsp;</td><td>the path where the PGT's should be stored </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02071">2071</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga244695840dc3a3964707cc355a0b631c"></a><!-- doxytag: member="CAS_Client::storePGT" ref="ga244695840dc3a3964707cc355a0b631c" args="($pgt, $pgt_iou)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::storePGT </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pgt</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pgt_iou</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method stores a PGT. Halts on error.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$pgt</em>&nbsp;</td><td>the PGT to store </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$pgt_iou</em>&nbsp;</td><td>its corresponding Iou </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02004">2004</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga8c7c97937692e79da12a8be3df634cbe"></a><!-- doxytag: member="CAS_Client::validatePGT" ref="ga8c7c97937692e79da12a8be3df634cbe" args="(&amp;$validate_url, $text_response, $tree_response)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::validatePGT </td>
+          <td>(</td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>validate_url</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>text_response</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>tree_response</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to validate a PGT; halt on failure.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$validate_url</em>&nbsp;</td><td>the URL of the request to the CAS server. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$text_response</em>&nbsp;</td><td>the response of the CAS server, as is (XML text); result of CAS_Client::validateST() or CAS_Client::validatePT(). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$tree_response</em>&nbsp;</td><td>the response of the CAS server, as a DOM XML tree; result of CAS_Client::validateST() or CAS_Client::validatePT().</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>bool TRUE when successfull, halt otherwise by calling CAS_Client::authError(). </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02092">2092</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga28d2bcce9ce91978761746fd9d039edc"></a><!-- doxytag: member="CAS_PGTStorage_AbstractStorage::write" ref="ga28d2bcce9ce91978761746fd9d039edc" args="($pgt, $pgt_iou)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_AbstractStorage::write </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pgt</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pgt_iou</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [protected, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This virtual method stores a PGT and its corresponding PGT Iuo. </p>
+<dl class="note"><dt><b>Note:</b></dt><dd>Should never be called.</dd></dl>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$pgt</em>&nbsp;</td><td>the PGT </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$pgt_iou</em>&nbsp;</td><td>the PGT iou </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Reimplemented in <a class="el" href="group__internalCAS__PGTStorageDb.html#ga82e33c56ba5fea740d57fd3711652898">CAS_PGTStorage_Db</a>, and <a class="el" href="group__internalPGTStorageFile.html#gae9dcfc67632d53bb890484862254ffef">CAS_PGTStorage_File</a>.</p>
+
+<p>Definition at line <a class="el" href="AbstractStorage_8php_source.html#l00188">188</a> of file <a class="el" href="AbstractStorage_8php_source.html">AbstractStorage.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="ga90ed7dc15a9c24154900bccc2ea5925d"></a><!-- doxytag: member="CAS_PGTStorage_AbstractStorage::$_error_message" ref="ga90ed7dc15a9c24154900bccc2ea5925d" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_AbstractStorage::$_error_message<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>string used to store an error message. Written by PGTStorage::setErrorMessage(), read by PGTStorage::getErrorMessage().</p>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>not used. </dd></dl>
+
+<p>Definition at line <a class="el" href="AbstractStorage_8php_source.html#l00110">110</a> of file <a class="el" href="AbstractStorage_8php_source.html">AbstractStorage.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga5bab9d6ccaeca2cbcc04ab1a2c0e4d16"></a><!-- doxytag: member="CAS_PGTStorage_AbstractStorage::$_initialized" ref="ga5bab9d6ccaeca2cbcc04ab1a2c0e4d16" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_AbstractStorage::$_initialized<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>a boolean telling if the storage has already been initialized. Written by PGTStorage::init(), read by PGTStorage::isInitialized(). </p>
+
+<p>Definition at line <a class="el" href="AbstractStorage_8php_source.html#l00151">151</a> of file <a class="el" href="AbstractStorage_8php_source.html">AbstractStorage.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gad1f8471bde7999b0465c8f3f109a6aba"></a><!-- doxytag: member="CAS_Client::$_pgt_storage" ref="gad1f8471bde7999b0465c8f3f109a6aba" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_pgt_storage<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>an instance of a class inheriting of PGTStorage, used to deal with PGT storage. Created by CAS_Client::setPGTStorageFile(), used by CAS_Client::setPGTStorageFile() and CAS_Client::initPGTStorage(). </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01981">1981</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalPGTStorageDb.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalPGTStorageDb.html
new file mode 100644
index 00000000..47c8d8fb
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalPGTStorageDb.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: PGT storage in a database</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a>  </div>
+  <div class="headertitle">
+<h1>PGT storage in a database<br/>
+<small>
+[<a class="el" href="group__internalPGTStorage.html">PGT storage</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalPGTStorageFile.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalPGTStorageFile.html
new file mode 100644
index 00000000..b67e17ba
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalPGTStorageFile.html
@@ -0,0 +1,313 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: PGT storage on the filesystem</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>PGT storage on the filesystem<br/>
+<small>
+[<a class="el" href="group__internalPGTStorage.html">PGT storage</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a></td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#ga85d57a19425e0850dbd81aa7afe6b7a7">CAS_PGTStorage_File::getPath</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#ga19d04a68b743138f9545176ba75ff58d">CAS_PGTStorage_File::getStorageType</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#gad68bdd31082cd1b7852d671d0078d6ca">CAS_PGTStorage_File::getStorageInfo</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#ga23f7f09dd29619bd2550562c36713473">CAS_PGTStorage_File::__construct</a> ($cas_parent, $path)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#ga422f5a7ca597539b816e87b51f445843">CAS_PGTStorage_File::init</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#ga0ea66347a5ab05db314d50c4212c867c">CAS_PGTStorage_File::getPGTIouFilename</a> ($pgt_iou)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#gae9dcfc67632d53bb890484862254ffef">CAS_PGTStorage_File::write</a> ($pgt, $pgt_iou)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#ga14fe054afb4c780b567a5d8ac8214754">CAS_PGTStorage_File::read</a> ($pgt_iou)</td></tr>
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorageFile.html#ga2808f4969d1a4310bcdaa7e02f0ea607">CAS_PGTStorage_File::$_path</a></td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ga23f7f09dd29619bd2550562c36713473"></a><!-- doxytag: member="CAS_PGTStorage_File::__construct" ref="ga23f7f09dd29619bd2550562c36713473" args="($cas_parent, $path)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_File::__construct </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>cas_parent</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>path</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The class constructor, called by CAS_Client::SetPGTStorageFile().</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$cas_parent</em>&nbsp;</td><td>the <a class="el" href="classCAS__Client.html">CAS_Client</a> instance that creates the object. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$path</em>&nbsp;</td><td>the path where the PGT's should be stored </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="File_8php_source.html#l00113">113</a> of file <a class="el" href="File_8php_source.html">File.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga85d57a19425e0850dbd81aa7afe6b7a7"></a><!-- doxytag: member="CAS_PGTStorage_File::getPath" ref="ga85d57a19425e0850dbd81aa7afe6b7a7" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_File::getPath </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the name of the directory where PGT's should be stored on the filesystem.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the name of a directory (with leading and trailing '/') </dd></dl>
+
+<p>Definition at line <a class="el" href="File_8php_source.html#l00068">68</a> of file <a class="el" href="File_8php_source.html">File.php</a>.</p>
+
+<p>Referenced by <a class="el" href="File_8php_source.html#l00176">CAS_PGTStorage_File::getPGTIouFilename()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga0ea66347a5ab05db314d50c4212c867c"></a><!-- doxytag: member="CAS_PGTStorage_File::getPGTIouFilename" ref="ga0ea66347a5ab05db314d50c4212c867c" args="($pgt_iou)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_File::getPGTIouFilename </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pgt_iou</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the filename corresponding to a PGT Iou.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$pgt_iou</em>&nbsp;</td><td>the PGT iou.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a filename </dd></dl>
+
+<p>Definition at line <a class="el" href="File_8php_source.html#l00176">176</a> of file <a class="el" href="File_8php_source.html">File.php</a>.</p>
+
+<p>References <a class="el" href="File_8php_source.html#l00068">CAS_PGTStorage_File::getPath()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+<p>Referenced by <a class="el" href="File_8php_source.html#l00222">CAS_PGTStorage_File::read()</a>, and <a class="el" href="File_8php_source.html#l00193">CAS_PGTStorage_File::write()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gad68bdd31082cd1b7852d671d0078d6ca"></a><!-- doxytag: member="CAS_PGTStorage_File::getStorageInfo" ref="gad68bdd31082cd1b7852d671d0078d6ca" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_File::getStorageInfo </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns an informational string giving informations on the parameters of the storage.(used for debugging purposes).</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>an informational string. </dd></dl>
+
+<p>Reimplemented from <a class="el" href="group__internalPGTStorage.html#ga9611a5217179596541d29d0a8d9ee7e7">CAS_PGTStorage_AbstractStorage</a>.</p>
+
+<p>Definition at line <a class="el" href="File_8php_source.html#l00096">96</a> of file <a class="el" href="File_8php_source.html">File.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga19d04a68b743138f9545176ba75ff58d"></a><!-- doxytag: member="CAS_PGTStorage_File::getStorageType" ref="ga19d04a68b743138f9545176ba75ff58d" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_File::getStorageType </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns an informational string giving the type of storage used by the object (used for debugging purposes).</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>an informational string. </dd></dl>
+
+<p>Reimplemented from <a class="el" href="group__internalPGTStorage.html#gae0be262b206d9b1c3d5b73ccf91355eb">CAS_PGTStorage_AbstractStorage</a>.</p>
+
+<p>Definition at line <a class="el" href="File_8php_source.html#l00084">84</a> of file <a class="el" href="File_8php_source.html">File.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga422f5a7ca597539b816e87b51f445843"></a><!-- doxytag: member="CAS_PGTStorage_File::init" ref="ga422f5a7ca597539b816e87b51f445843" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_File::init </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to initialize the storage. Halts on error. </p>
+
+<p>Reimplemented from <a class="el" href="group__internalPGTStorage.html#gacee98b92299f2aded9f8792005d2eefc">CAS_PGTStorage_AbstractStorage</a>.</p>
+
+<p>Definition at line <a class="el" href="File_8php_source.html#l00153">153</a> of file <a class="el" href="File_8php_source.html">File.php</a>.</p>
+
+<p>References <a class="el" href="AbstractStorage_8php_source.html#l00160">CAS_PGTStorage_AbstractStorage::isInitialized()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga14fe054afb4c780b567a5d8ac8214754"></a><!-- doxytag: member="CAS_PGTStorage_File::read" ref="ga14fe054afb4c780b567a5d8ac8214754" args="($pgt_iou)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_File::read </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pgt_iou</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method reads a PGT corresponding to a PGT Iou and deletes the corresponding file.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$pgt_iou</em>&nbsp;</td><td>the PGT iou</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the corresponding PGT, or FALSE on error </dd></dl>
+
+<p>Reimplemented from <a class="el" href="group__internalPGTStorage.html#ga67ea1647d16892d59f8e2fd4523f6dc7">CAS_PGTStorage_AbstractStorage</a>.</p>
+
+<p>Definition at line <a class="el" href="File_8php_source.html#l00222">222</a> of file <a class="el" href="File_8php_source.html">File.php</a>.</p>
+
+<p>References <a class="el" href="File_8php_source.html#l00176">CAS_PGTStorage_File::getPGTIouFilename()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gae9dcfc67632d53bb890484862254ffef"></a><!-- doxytag: member="CAS_PGTStorage_File::write" ref="gae9dcfc67632d53bb890484862254ffef" args="($pgt, $pgt_iou)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_File::write </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pgt</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pgt_iou</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method stores a PGT and its corresponding PGT Iou into a file. Echoes a warning on error.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$pgt</em>&nbsp;</td><td>the PGT </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$pgt_iou</em>&nbsp;</td><td>the PGT iou </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Reimplemented from <a class="el" href="group__internalPGTStorage.html#ga28d2bcce9ce91978761746fd9d039edc">CAS_PGTStorage_AbstractStorage</a>.</p>
+
+<p>Definition at line <a class="el" href="File_8php_source.html#l00193">193</a> of file <a class="el" href="File_8php_source.html">File.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="File_8php_source.html#l00176">CAS_PGTStorage_File::getPGTIouFilename()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="ga2808f4969d1a4310bcdaa7e02f0ea607"></a><!-- doxytag: member="CAS_PGTStorage_File::$_path" ref="ga2808f4969d1a4310bcdaa7e02f0ea607" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_PGTStorage_File::$_path<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>a string telling where PGT's should be stored on the filesystem. Written by PGTStorageFile::PGTStorageFile(), read by getPath(). </p>
+
+<p>Definition at line <a class="el" href="File_8php_source.html#l00058">58</a> of file <a class="el" href="File_8php_source.html">File.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalProxied.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalProxied.html
new file mode 100644
index 00000000..57fdcc11
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalProxied.html
@@ -0,0 +1,335 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS proxied client features (CAS 2.0, Proxy Tickets)</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>CAS proxied client features (CAS 2.0, Proxy Tickets)<br/>
+<small>
+[<a class="el" href="group__internal.html">Implementation</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#ga9f6fe06d8349d51a53a1397b6fb266f0">CAS_Client::getPT</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#gaad9f4d2b7243796555c01edecc85006e">CAS_Client::setPT</a> ($pt)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#gafd4a9d8c389825ed8b23331493fde437">CAS_Client::hasPT</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#gac97879b556d2b09f5e3b6ba2bfe33a2c">CAS_Client::getProxies</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#ga5afeadecc91ada8d11abc1ec74bdefd5">CAS_Client::setProxies</a> ($proxies)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#ga5aa61d302edfacbaaf176a94bf228807">CAS_Client::validatePT</a> (&amp;$validate_url, &amp;$text_response, &amp;$tree_response)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#ga7d1f0e097dcfe2a4c2576b2be012a13c">CAS_Client::readExtraAttributesCas20</a> ($success_elements)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#gabfbdb4ba817d27bf951b9bce6154f4f7">CAS_Client::addAttributeToArray</a> (array &amp;$attributeArray, $name, $value)</td></tr>
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#ga0345fd992cc17a481dd37e1d5c19f595">CAS_Client::$_pt</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxied.html#ga082ab34c6c2bf014314fe02504c4ad67">CAS_Client::$_proxies</a> = array()</td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="gabfbdb4ba817d27bf951b9bce6154f4f7"></a><!-- doxytag: member="CAS_Client::addAttributeToArray" ref="gabfbdb4ba817d27bf951b9bce6154f4f7" args="(array &amp;$attributeArray, $name, $value)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::addAttributeToArray </td>
+          <td>(</td>
+          <td class="paramtype">array &amp;$&nbsp;</td>
+          <td class="paramname"> <em>attributeArray</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>value</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add an attribute value to an array of attributes.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>ref</em>&nbsp;</td><td>array $array </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$name </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$value </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02806">2806</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gac97879b556d2b09f5e3b6ba2bfe33a2c"></a><!-- doxytag: member="CAS_Client::getProxies" ref="gac97879b556d2b09f5e3b6ba2bfe33a2c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getProxies </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer an array of proxies that are sitting in front of this application.</p>
+<p>This method will only return a non-empty array if we have received and validated a Proxy Ticket.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>array  public </dd></dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>6/25/09 </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02550">2550</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga9f6fe06d8349d51a53a1397b6fb266f0"></a><!-- doxytag: member="CAS_Client::getPT" ref="ga9f6fe06d8349d51a53a1397b6fb266f0" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getPT </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the Proxy Ticket provided in the URL of the request. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The proxy ticket. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02509">2509</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gafd4a9d8c389825ed8b23331493fde437"></a><!-- doxytag: member="CAS_Client::hasPT" ref="gafd4a9d8c389825ed8b23331493fde437" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::hasPT </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method tells if a Proxy Ticket was stored. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>TRUE if a Proxy Ticket has been stored. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02526">2526</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga7d1f0e097dcfe2a4c2576b2be012a13c"></a><!-- doxytag: member="CAS_Client::readExtraAttributesCas20" ref="ga7d1f0e097dcfe2a4c2576b2be012a13c" args="($success_elements)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::readExtraAttributesCas20 </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>success_elements</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method will parse the DOM and pull out the attributes from the XML payload and put them into an array, then put the array into the session.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$text_response</em>&nbsp;</td><td>the XML payload. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>bool TRUE when successfull, halt otherwise by calling CAS_Client::authError(). </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02690">2690</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01489">CAS_Client::validateST()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga5afeadecc91ada8d11abc1ec74bdefd5"></a><!-- doxytag: member="CAS_Client::setProxies" ref="ga5afeadecc91ada8d11abc1ec74bdefd5" args="($proxies)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setProxies </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>proxies</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the Proxy array, probably from persistant storage.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>array</em>&nbsp;</td><td>$proxies </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void  private </dd></dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>6/25/09 </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02562">2562</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaad9f4d2b7243796555c01edecc85006e"></a><!-- doxytag: member="CAS_Client::setPT" ref="gaad9f4d2b7243796555c01edecc85006e" args="($pt)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setPT </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pt</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method stores the Proxy Ticket. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$pt</em>&nbsp;</td><td>The Proxy Ticket. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02519">2519</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga5aa61d302edfacbaaf176a94bf228807"></a><!-- doxytag: member="CAS_Client::validatePT" ref="ga5aa61d302edfacbaaf176a94bf228807" args="(&amp;$validate_url, &amp;$text_response, &amp;$tree_response)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::validatePT </td>
+          <td>(</td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>validate_url</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>text_response</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>tree_response</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to validate a ST or PT; halt on failure Used for all CAS 2.0 validations </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>bool TRUE when successfull, halt otherwise by calling CAS_Client::authError(). </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02581">2581</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, and <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="ga082ab34c6c2bf014314fe02504c4ad67"></a><!-- doxytag: member="CAS_Client::$_proxies" ref="ga082ab34c6c2bf014314fe02504c4ad67" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_proxies = array()<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This array will store a list of proxies in front of this application. This property will only be populated if this script is being proxied rather than accessed directly.</p>
+<p>It is set in CAS_Client::validatePT() and can be read by CAS_Client::getProxies()  private </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02538">2538</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga0345fd992cc17a481dd37e1d5c19f595"></a><!-- doxytag: member="CAS_Client::$_pt" ref="ga0345fd992cc17a481dd37e1d5c19f595" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_pt<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>the Proxy Ticket provided in the URL of the request if present (empty otherwise). Written by CAS_Client::CAS_Client(), read by CAS_Client::getPT() and CAS_Client::hasPGT(). </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02503">2503</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalProxy.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalProxy.html
new file mode 100644
index 00000000..b40728f3
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalProxy.html
@@ -0,0 +1,204 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS Proxy features (CAS 2.0, Proxy Granting Tickets)</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>CAS Proxy features (CAS 2.0, Proxy Granting Tickets)<br/>
+<small>
+[<a class="el" href="group__internal.html">Implementation</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="groups"></a>
+Modules</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalPGTStorage.html">PGT storage</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalCallback.html">Callback from the CAS server</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxyServices.html">Proxy other services</a></td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html#ga0dfba2b184668dda8892c385c3f04096">CAS_Client::isProxy</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html#ga34d29abe0254d1b5752e4f3557865157">CAS_Client::getPGT</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html#ga7750adb0745c0b005ff8b305e7a060e0">CAS_Client::setPGT</a> ($pgt)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html#gaece996995e43de2f4a14600a1de1ec86">CAS_Client::hasPGT</a> ()</td></tr>
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html#ga93e5bc863e46e09173b578b79a45b760">CAS_Client::$_proxy</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html#ga1f1bcaf4533a30cf236fc0b531aede62">CAS_Client::$_serviceCookieJar</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxy.html#ga2c3d4f2d4cb694f1687f561e8483a4c9">CAS_Client::$_pgt</a></td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ga34d29abe0254d1b5752e4f3557865157"></a><!-- doxytag: member="CAS_Client::getPGT" ref="ga34d29abe0254d1b5752e4f3557865157" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getPGT </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the Proxy Granting Ticket given by the CAS server. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The Proxy Granting Ticket. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01835">1835</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaece996995e43de2f4a14600a1de1ec86"></a><!-- doxytag: member="CAS_Client::hasPGT" ref="gaece996995e43de2f4a14600a1de1ec86" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::hasPGT </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method tells if a Proxy Granting Ticket was stored. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>TRUE if a Proxy Granting Ticket has been stored. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01849">1849</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga0dfba2b184668dda8892c385c3f04096"></a><!-- doxytag: member="CAS_Client::isProxy" ref="ga0dfba2b184668dda8892c385c3f04096" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::isProxy </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Tells if a CAS client is a CAS proxy or not</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>TRUE when the CAS client is a CAs proxy, FALSE otherwise </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01809">1809</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00689">CAS_Client::__construct()</a>, <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>, <a class="el" href="Client_8php_source.html#l01489">CAS_Client::validateST()</a>, and <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga7750adb0745c0b005ff8b305e7a060e0"></a><!-- doxytag: member="CAS_Client::setPGT" ref="ga7750adb0745c0b005ff8b305e7a060e0" args="($pgt)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setPGT </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>pgt</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method stores the Proxy Granting Ticket. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$pgt</em>&nbsp;</td><td>The Proxy Granting Ticket. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01842">1842</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="ga2c3d4f2d4cb694f1687f561e8483a4c9"></a><!-- doxytag: member="CAS_Client::$_pgt" ref="ga2c3d4f2d4cb694f1687f561e8483a4c9" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_pgt<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>the Proxy Grnting Ticket given by the CAS server (empty otherwise). Written by CAS_Client::setPGT(), read by CAS_Client::getPGT() and CAS_Client::hasPGT(). </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01829">1829</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga93e5bc863e46e09173b578b79a45b760"></a><!-- doxytag: member="CAS_Client::$_proxy" ref="ga93e5bc863e46e09173b578b79a45b760" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_proxy<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>A boolean telling if the client is a CAS proxy or not. Written by CAS_Client::CAS_Client(), read by CAS_Client::isProxy(). </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01797">1797</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga1f1bcaf4533a30cf236fc0b531aede62"></a><!-- doxytag: member="CAS_Client::$_serviceCookieJar" ref="ga1f1bcaf4533a30cf236fc0b531aede62" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::$_serviceCookieJar<code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Handler for managing service cookies. </p>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01802">1802</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalProxyServices.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalProxyServices.html
new file mode 100644
index 00000000..d89020dc
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalProxyServices.html
@@ -0,0 +1,231 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Proxy other services</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>Proxy other services<br/>
+<small>
+[<a class="el" href="group__internalProxy.html">CAS Proxy features (CAS 2.0, Proxy Granting Tickets)</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxyServices.html#ga2e0f5cb74d8116e3a9b9dc951f1cc3bf">CAS_Client::getProxiedService</a> ($type)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxyServices.html#ga80ffa273c63053c94f8d2affd1091720">CAS_Client::initializeProxiedService</a> (<a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a> $proxiedService)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxyServices.html#ga48201373f1bc2e02d48a8d337a5cd00e">CAS_Client::serviceWeb</a> ($url, &amp;$err_code, &amp;$output)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalProxyServices.html#ga7c0c2ac8d3cc57a31728ae901bafab67">CAS_Client::serviceMail</a> ($url, $serviceUrl, $flags, &amp;$err_code, &amp;$err_msg, &amp;$pt)</td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ga2e0f5cb74d8116e3a9b9dc951f1cc3bf"></a><!-- doxytag: member="CAS_Client::getProxiedService" ref="ga2e0f5cb74d8116e3a9b9dc951f1cc3bf" args="($type)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getProxiedService </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>type</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer a proxy-authenticated service handler.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$type The service type. One of: PHPCAS_PROXIED_SERVICE_HTTP_GET PHPCAS_PROXIED_SERVICE_HTTP_POST PHPCAS_PROXIED_SERVICE_IMAP</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a> </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>InvalidArgumentException</em>&nbsp;</td><td>If the service type is unknown. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02359">2359</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga80ffa273c63053c94f8d2affd1091720"></a><!-- doxytag: member="CAS_Client::initializeProxiedService" ref="ga80ffa273c63053c94f8d2affd1091720" args="(CAS_ProxiedService $proxiedService)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::initializeProxiedService </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a> $&nbsp;</td>
+          <td class="paramname"> <em>proxiedService</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Initialize a proxied-service handler with the proxy-ticket it should use.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></em>&nbsp;</td><td>$proxiedService </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a></em>&nbsp;</td><td>If there is a proxy-ticket failure. The code of the Exception will be one of: PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE PHPCAS_SERVICE_PT_FAILURE </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a></em>&nbsp;</td><td>If there is a failure getting the url from the proxied service. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02394">2394</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="interfaceCAS__ProxiedService.html#a60e1ce4d0228964a02f8747466011600">CAS_ProxiedService::getServiceUrl()</a>, and <a class="el" href="interfaceCAS__ProxiedService.html#aca7cf518dffecf31b2a311a9b80589e4">CAS_ProxiedService::setProxyTicket()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga7c0c2ac8d3cc57a31728ae901bafab67"></a><!-- doxytag: member="CAS_Client::serviceMail" ref="ga7c0c2ac8d3cc57a31728ae901bafab67" args="($url, $serviceUrl, $flags, &amp;$err_code, &amp;$err_msg, &amp;$pt)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::serviceMail </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>serviceUrl</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>flags</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>err_code</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>err_msg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>pt</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to access an IMAP/POP3/NNTP service.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>a string giving the URL of the service, including the mailing box for IMAP URLs, as accepted by imap_open(). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$service</em>&nbsp;</td><td>a string giving for CAS retrieve Proxy ticket </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$flags</em>&nbsp;</td><td>options given to imap_open(). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$err_code</em>&nbsp;</td><td>an error code Possible values are PHPCAS_SERVICE_OK (on success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE, PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT_AVAILABLE. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$err_msg</em>&nbsp;</td><td>an error message on failure </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$pt</em>&nbsp;</td><td>the Proxy Ticket (PT) retrieved from the CAS server to access the URL on success, FALSE on error).</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>an IMAP stream on success, FALSE otherwise (in this later case, $err_code gives the reason why it failed and $err_msg contains an error message). </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02455">2455</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="config_8php_source.html#l00059">$serviceUrl</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga48201373f1bc2e02d48a8d337a5cd00e"></a><!-- doxytag: member="CAS_Client::serviceWeb" ref="ga48201373f1bc2e02d48a8d337a5cd00e" args="($url, &amp;$err_code, &amp;$output)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::serviceWeb </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>err_code</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>output</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to access an HTTP[S] service.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the service to access. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$err_code</em>&nbsp;</td><td>an error code Possible values are PHPCAS_SERVICE_OK (on success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE, PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT_AVAILABLE. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$output</em>&nbsp;</td><td>the output of the service (also used to give an error message on failure).</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>TRUE on success, FALSE otherwise (in this later case, $err_code gives the reason why it failed and $output contains an error message). </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l02418">2418</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalSAML.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalSAML.html
new file mode 100644
index 00000000..2bd4a588
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__internalSAML.html
@@ -0,0 +1,198 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS SAML features (SAML 1.1)</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>CAS SAML features (SAML 1.1)<br/>
+<small>
+[<a class="el" href="group__internal.html">Implementation</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalSAML.html#ga07f487f79659e810085f37fafafc90a0">CAS_Client::validateSA</a> ($validate_url, &amp;$text_response, &amp;$tree_response)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalSAML.html#gaf0f93cd303855b62c04ca667dc741ee5">CAS_Client::setSessionAttributes</a> ($text_response)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalSAML.html#gabbfc9663e999471633c4b5cc1a1f2751">CAS_Client::getSA</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalSAML.html#gab543514ee8feaf062af84e78fa26f19f">CAS_Client::setSA</a> ($sa)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__internalSAML.html#ga436daacbfb73a41424dd24e116acc112">CAS_Client::hasSA</a> ()</td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="gabbfc9663e999471633c4b5cc1a1f2751"></a><!-- doxytag: member="CAS_Client::getSA" ref="gabbfc9663e999471633c4b5cc1a1f2751" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::getSA </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the SAML Ticket provided in the URL of the request. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>The SAML ticket. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01760">1760</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga436daacbfb73a41424dd24e116acc112"></a><!-- doxytag: member="CAS_Client::hasSA" ref="ga436daacbfb73a41424dd24e116acc112" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::hasSA </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method tells if a SAML Ticket was stored. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>TRUE if a SAML Ticket has been stored. </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01774">1774</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gab543514ee8feaf062af84e78fa26f19f"></a><!-- doxytag: member="CAS_Client::setSA" ref="gab543514ee8feaf062af84e78fa26f19f" args="($sa)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setSA </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>sa</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method stores the SAML Ticket. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$sa</em>&nbsp;</td><td>The SAML Ticket. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01767">1767</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaf0f93cd303855b62c04ca667dc741ee5"></a><!-- doxytag: member="CAS_Client::setSessionAttributes" ref="gaf0f93cd303855b62c04ca667dc741ee5" args="($text_response)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::setSessionAttributes </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>text_response</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [private, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method will parse the DOM and pull out the attributes from the SAML payload and put them into an array, then put the array into the session.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$text_response</em>&nbsp;</td><td>the SAML payload. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>bool TRUE when successfull and FALSE if no attributes a found </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01707">1707</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga07f487f79659e810085f37fafafc90a0"></a><!-- doxytag: member="CAS_Client::validateSA" ref="ga07f487f79659e810085f37fafafc90a0" args="($validate_url, &amp;$text_response, &amp;$tree_response)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_Client::validateSA </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>validate_url</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>text_response</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>tree_response</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to validate a SAML TICKET; halt on failure, and sets $validate_url, $text_reponse and $tree_response on success. These parameters are used later by CAS_Client::validatePGT() for CAS proxies.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$validate_url</em>&nbsp;</td><td>the URL of the request to the CAS server. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$text_response</em>&nbsp;</td><td>the response of the CAS server, as is (XML text). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$tree_response</em>&nbsp;</td><td>the response of the CAS server, as a DOM XML tree.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>bool TRUE when successfull, halt otherwise by calling CAS_Client::authError(). </dd></dl>
+
+<p>Definition at line <a class="el" href="Client_8php_source.html#l01626">1626</a> of file <a class="el" href="Client_8php_source.html">Client.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, and <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__public.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__public.html
new file mode 100644
index 00000000..672ecf94
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__public.html
@@ -0,0 +1,301 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: User interface</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#groups">Modules</a> &#124;
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>User interface</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">class &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphpCAS.html">phpCAS</a></td></tr>
+<tr><td colspan="2"><h2><a name="groups"></a>
+Modules</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicInit.html">Initialization</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html">Authentication</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html">Access to external services</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicConfig.html">Configuration</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html">Debugging</a></td></tr>
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga0904e4fb51e532bbba51832326dbf8fb">CAS_VERSION_1_0</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#gaa6440870ffb0a81c5403ac10faa25f33">SAML_VERSION_1_1</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#gacd26ca2be2ce186d1615dfccb376f9bc">SAML_XML_HEADER</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga65ee3a785f518156c26141fe132e5a27">SAML_SOAP_ENV</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga5dd903ec8d4b28382e6e6855d395fc17">SAML_SOAP_BODY</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga8bfd01226a65a1b6adf3a79107c3d0fe">SAMLP_REQUEST</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga513c3d47c1ba7496a57ad89b29594a90">SAMLP_REQUEST_CLOSE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga501612cd6f764c67738e2793ef4c6956">SAML_ASSERTION_ARTIFACT</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga2f7d873f4eb1f98316b3ee7fc9810fc3">SAML_ASSERTION_ARTIFACT_CLOSE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga625743ae96c6e64e2b61f2913aa71d29">SAML_SOAP_BODY_CLOSE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#gac209765f2f59e1ca882627eea2474578">SAML_SOAP_ENV_CLOSE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga3dc3b3b94ff4576889e9d2b5c77a3056">SAML_ATTRIBUTES</a> </td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__public.html#ga5c971143e0c319b1268233907ca193b9">phpCAS::getVersion</a> ()</td></tr>
+</table>
+<hr/><h2>Enumeration Type Documentation</h2>
+<a class="anchor" id="ga0904e4fb51e532bbba51832326dbf8fb"></a><!-- doxytag: member="CAS.php::CAS_VERSION_1_0" ref="ga0904e4fb51e532bbba51832326dbf8fb" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__public.html#ga0904e4fb51e532bbba51832326dbf8fb">CAS_VERSION_1_0</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>CAS version 1.0 </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00078">78</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga33db27557b9b055f0cff75481f46a4bc"></a><!-- doxytag: member="CAS.php::CAS_VERSION_2_0" ref="ga33db27557b9b055f0cff75481f46a4bc" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__public.html#ga33db27557b9b055f0cff75481f46a4bc">CAS_VERSION_2_0</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>CAS version 2.0 </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00082">82</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga501612cd6f764c67738e2793ef4c6956"></a><!-- doxytag: member="CAS.php::SAML_ASSERTION_ARTIFACT" ref="ga501612cd6f764c67738e2793ef4c6956" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__public.html#ga501612cd6f764c67738e2793ef4c6956">SAML_ASSERTION_ARTIFACT</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>SAMLP artifact tag (for the ticket) </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00117">117</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga2f7d873f4eb1f98316b3ee7fc9810fc3"></a><!-- doxytag: member="CAS.php::SAML_ASSERTION_ARTIFACT_CLOSE" ref="ga2f7d873f4eb1f98316b3ee7fc9810fc3" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__public.html#ga2f7d873f4eb1f98316b3ee7fc9810fc3">SAML_ASSERTION_ARTIFACT_CLOSE</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>SAMLP close </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00122">122</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga3dc3b3b94ff4576889e9d2b5c77a3056"></a><!-- doxytag: member="CAS.php::SAML_ATTRIBUTES" ref="ga3dc3b3b94ff4576889e9d2b5c77a3056" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__public.html#ga3dc3b3b94ff4576889e9d2b5c77a3056">SAML_ATTRIBUTES</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>SAML Attributes </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00137">137</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga5dd903ec8d4b28382e6e6855d395fc17"></a><!-- doxytag: member="CAS.php::SAML_SOAP_BODY" ref="ga5dd903ec8d4b28382e6e6855d395fc17" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__public.html#ga5dd903ec8d4b28382e6e6855d395fc17">SAML_SOAP_BODY</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>SOAP body for SAML POST </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00106">106</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga625743ae96c6e64e2b61f2913aa71d29"></a><!-- doxytag: member="CAS.php::SAML_SOAP_BODY_CLOSE" ref="ga625743ae96c6e64e2b61f2913aa71d29" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__public.html#ga625743ae96c6e64e2b61f2913aa71d29">SAML_SOAP_BODY_CLOSE</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>SOAP body close </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00127">127</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga65ee3a785f518156c26141fe132e5a27"></a><!-- doxytag: member="CAS.php::SAML_SOAP_ENV" ref="ga65ee3a785f518156c26141fe132e5a27" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__public.html#ga65ee3a785f518156c26141fe132e5a27">SAML_SOAP_ENV</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>SOAP envelope for SAML POST </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00101">101</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gac209765f2f59e1ca882627eea2474578"></a><!-- doxytag: member="CAS.php::SAML_SOAP_ENV_CLOSE" ref="gac209765f2f59e1ca882627eea2474578" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__public.html#gac209765f2f59e1ca882627eea2474578">SAML_SOAP_ENV_CLOSE</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>SOAP envelope close </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00132">132</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaa6440870ffb0a81c5403ac10faa25f33"></a><!-- doxytag: member="CAS.php::SAML_VERSION_1_1" ref="gaa6440870ffb0a81c5403ac10faa25f33" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__public.html#gaa6440870ffb0a81c5403ac10faa25f33">SAML_VERSION_1_1</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>SAML protocol </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00091">91</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gacd26ca2be2ce186d1615dfccb376f9bc"></a><!-- doxytag: member="CAS.php::SAML_XML_HEADER" ref="gacd26ca2be2ce186d1615dfccb376f9bc" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__public.html#gacd26ca2be2ce186d1615dfccb376f9bc">SAML_XML_HEADER</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>XML header for SAML POST </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00096">96</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga8bfd01226a65a1b6adf3a79107c3d0fe"></a><!-- doxytag: member="CAS.php::SAMLP_REQUEST" ref="ga8bfd01226a65a1b6adf3a79107c3d0fe" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__public.html#ga8bfd01226a65a1b6adf3a79107c3d0fe">SAMLP_REQUEST</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>SAMLP request </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00111">111</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga513c3d47c1ba7496a57ad89b29594a90"></a><!-- doxytag: member="CAS.php::SAMLP_REQUEST_CLOSE" ref="ga513c3d47c1ba7496a57ad89b29594a90" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__public.html#ga513c3d47c1ba7496a57ad89b29594a90">SAMLP_REQUEST_CLOSE</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00112">112</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ga5c971143e0c319b1268233907ca193b9"></a><!-- doxytag: member="phpCAS::getVersion" ref="ga5c971143e0c319b1268233907ca193b9" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::getVersion </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the <a class="el" href="classphpCAS.html">phpCAS</a> version.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the <a class="el" href="classphpCAS.html">phpCAS</a> version. </dd></dl>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__lang_8php-example.html#a11">example_lang.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00655">655</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00096">CAS_Client::HTMLFilterOutput()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicAuth.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicAuth.html
new file mode 100644
index 00000000..dfa28eb5
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicAuth.html
@@ -0,0 +1,970 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Authentication</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>Authentication<br/>
+<small>
+[<a class="el" href="group__public.html">User interface</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga6c3433e912dce36c51ebd5732bd43d07">phpCAS::setCacheTimesForAuthRecheck</a> ($n)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#gaef46bf2c415a72f1e81a1bf3a75b1324">phpCAS::setPostAuthenticateCallback</a> ($function, array $additionalArgs=array())</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga996cb0478f7f35fca4dd33c9714d2452">phpCAS::setSingleSignoutCallback</a> ($function, array $additionalArgs=array())</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga21fd1c2665d2e21c03e6a6dd1860cf4d">phpCAS::checkAuthentication</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga78e2d918ae65a0ff649e755a34ed9bf3">phpCAS::forceAuthentication</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga368b22dab91392a949dbfe902f2ac5f5">phpCAS::renewAuthentication</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga48c16f6ef7158f8cf32dec4d1a68cbe5">phpCAS::isAuthenticated</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#gac79ced3333492b28b9d3849c56becb9e">phpCAS::isSessionAuthenticated</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga4c9f984b474b550cf316396e87670b18">phpCAS::getUser</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga9972fbb286fe7e8d726b2e776b150233">phpCAS::getAttributes</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#gaeee7fd7060e5edbf791e71b49270c9e1">phpCAS::hasAttributes</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga261a58590cfc17399398ec5db81c2d7e">phpCAS::hasAttribute</a> ($key)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga46f77015f5e206ad4956edae2905857c">phpCAS::getAttribute</a> ($key)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga33a0cf0299f96e23893ce4ff6cc76584">phpCAS::handleLogoutRequests</a> ($check_client=true, $allowed_clients=false)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga7c01939d204339fcab6a4d3f15557a90">phpCAS::getServerLoginURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga3bae96f4d17cdc12ac2e81334ba44fc1">phpCAS::setServerLoginURL</a> ($url= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga70abe40a03b6ebb068eecba436dd7a8c">phpCAS::setServerServiceValidateURL</a> ($url= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga11d1c13ed3d5008984ef5999a9389104">phpCAS::setServerProxyValidateURL</a> ($url= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga22ccd6f45db38b80f3549fc7691b1c8b">phpCAS::setServerSamlValidateURL</a> ($url= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga280605a8665ce91117b796d3470d0c2d">phpCAS::getServerLogoutURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga090c9e2112180f4073cd2583c5c07800">phpCAS::setServerLogoutURL</a> ($url= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga9989272833c5170c3b7c7027beab795b">phpCAS::logout</a> ($params=&quot;&quot;)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga8121363b18b23a7ff84850851d85fcc1">phpCAS::logoutWithRedirectService</a> ($service)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#gaf747b39e646075718b6504ae30d6df87">phpCAS::logoutWithUrl</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga03f02d32829f8e2dd7056aaa94dcfb79">phpCAS::logoutWithRedirectServiceAndUrl</a> ($service, $url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga8d7426d23b152ea51c1bdefdd6516df6">phpCAS::setFixedCallbackURL</a> ($url= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga6a67472e035941451db7d22d51d3017b">phpCAS::setFixedServiceURL</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga929af13df94ab3033ab915b02eed74e2">phpCAS::getServiceURL</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#ga68624158674efe68505c247942ee129b">phpCAS::retrievePT</a> ($target_service, &amp;$err_code, &amp;$err_msg)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#gac7c2da957fdd437f1e23147f83daffcb">phpCAS::setCasServerCACert</a> ($cert)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#gacff185b5b08e4ff603d0f6f1cb76e4ce">phpCAS::setNoCasServerValidation</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicAuth.html#gac7a6eeb2bfd55a432c57f5d18bd35048">phpCAS::setNoClearTicketsFromUrl</a> ()</td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ga21fd1c2665d2e21c03e6a6dd1860cf4d"></a><!-- doxytag: member="phpCAS::checkAuthentication" ref="ga21fd1c2665d2e21c03e6a6dd1860cf4d" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::checkAuthentication </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is called to check if the user is already authenticated locally or has a global cas session. A already existing cas session is determined by a cas gateway call.(cas login call without any interactive prompt) </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>TRUE when the user is authenticated, FALSE when a previous gateway login failed or the function will not return if the user is redirected to the cas server for a gateway login attempt </dd></dl>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__gateway_8php-example.html#a10">example_gateway.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01045">1045</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="example__gateway_8php_source.html#l00032">$auth</a>, <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga78e2d918ae65a0ff649e755a34ed9bf3"></a><!-- doxytag: member="phpCAS::forceAuthentication" ref="ga78e2d918ae65a0ff649e755a34ed9bf3" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::forceAuthentication </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is called to force authentication if the user was not already authenticated. If the user is not authenticated, halt by redirecting to the CAS server. </p>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__advanced__saml11_8php-example.html#a10">example_advanced_saml11.php</a>, <a class="el" href="example__custom__urls_8php-example.html#a8">example_custom_urls.php</a>, <a class="el" href="example__gateway_8php-example.html#a8">example_gateway.php</a>, <a class="el" href="example__html_8php-example.html#a9">example_html.php</a>, <a class="el" href="example__lang_8php-example.html#a8">example_lang.php</a>, <a class="el" href="example__logout_8php-example.html#a8">example_logout.php</a>, <a class="el" href="example__pgt__storage__file_8php-example.html#a8">example_pgt_storage_file.php</a>, <a class="el" href="example__proxy__GET_8php-example.html#a7">example_proxy_GET.php</a>, <a class="el" href="example__proxy__POST_8php-example.html#a7">example_proxy_POST.php</a>, <a class="el" href="example__proxy__serviceWeb_8php-example.html#a7">example_proxy_serviceWeb.php</a>, <a class="el" href="example__proxy__serviceWeb__chaining_8php-example.html#a7">example_proxy_serviceWeb_chaining.php</a>, <a class="el" href="example__service_8php-example.html#a7">example_service.php</a>, <a class="el" href="example__service__POST_8php-example.html#a7">example_service_POST.php</a>, <a class="el" href="example__service__that__proxies_8php-example.html#a7">example_service_that_proxies.php</a>, and <a class="el" href="example__simple_8php-example.html#a7">example_simple.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01073">1073</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="example__gateway_8php_source.html#l00032">$auth</a>, <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l01180">phpCAS::getUser()</a>, <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, and <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga46f77015f5e206ad4956edae2905857c"></a><!-- doxytag: member="phpCAS::getAttribute" ref="ga46f77015f5e206ad4956edae2905857c" args="($key)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::getAttribute </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>key</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer an attribute for the authenticated user.</p>
+<dl class="warning"><dt><b>Warning:</b></dt><dd>should not be called only after phpCAS::forceAuthentication() or phpCAS::checkAuthentication().</dd></dl>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$key </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>mixed string for a single value or an array if multiple values exist. </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01270">1270</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga9972fbb286fe7e8d726b2e776b150233"></a><!-- doxytag: member="phpCAS::getAttributes" ref="ga9972fbb286fe7e8d726b2e776b150233" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::getAttributes </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer attributes about the authenticated user.</p>
+<dl class="warning"><dt><b>Warning:</b></dt><dd>should not be called only after phpCAS::forceAuthentication() or phpCAS::checkAuthentication().</dd></dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>array </dd></dl>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__advanced__saml11_8php-example.html#a12">example_advanced_saml11.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01202">1202</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga7c01939d204339fcab6a4d3f15557a90"></a><!-- doxytag: member="phpCAS::getServerLoginURL" ref="ga7c01939d204339fcab6a4d3f15557a90" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::getServerLoginURL </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the URL to be used to login. or phpCAS::isAuthenticated().</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the login name of the authenticated user </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01301">1301</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga280605a8665ce91117b796d3470d0c2d"></a><!-- doxytag: member="phpCAS::getServerLogoutURL" ref="ga280605a8665ce91117b796d3470d0c2d" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::getServerLogoutURL </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the URL to be used to login. or phpCAS::isAuthenticated().</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the login name of the authenticated user </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01397">1397</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga929af13df94ab3033ab915b02eed74e2"></a><!-- doxytag: member="phpCAS::getServiceURL" ref="ga929af13df94ab3033ab915b02eed74e2" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::getServiceURL </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Get the URL that is set as the CAS service parameter. </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01569">1569</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga4c9f984b474b550cf316396e87670b18"></a><!-- doxytag: member="phpCAS::getUser" ref="ga4c9f984b474b550cf316396e87670b18" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::getUser </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method returns the CAS user's login name. </p>
+<dl class="warning"><dt><b>Warning:</b></dt><dd>should not be called only after phpCAS::forceAuthentication() or phpCAS::checkAuthentication().</dd></dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>the login name of the authenticated user </dd></dl>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__advanced__saml11_8php-example.html#a11">example_advanced_saml11.php</a>, and <a class="el" href="example__lang_8php-example.html#a9">example_lang.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01180">1180</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>Referenced by <a class="el" href="CAS_8php_source.html#l01073">phpCAS::forceAuthentication()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga33a0cf0299f96e23893ce4ff6cc76584"></a><!-- doxytag: member="phpCAS::handleLogoutRequests" ref="ga33a0cf0299f96e23893ce4ff6cc76584" args="($check_client=true, $allowed_clients=false)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::handleLogoutRequests </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>check_client</em> = <code>true</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>allowed_clients</em> = <code>false</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Handle logout requests. </p>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__advanced__saml11_8php-example.html#a8">example_advanced_saml11.php</a>, and <a class="el" href="example__logout_8php-example.html#a7">example_logout.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01287">1287</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga261a58590cfc17399398ec5db81c2d7e"></a><!-- doxytag: member="phpCAS::hasAttribute" ref="ga261a58590cfc17399398ec5db81c2d7e" args="($key)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::hasAttribute </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>key</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer true if an attribute exists for the authenticated user.</p>
+<dl class="warning"><dt><b>Warning:</b></dt><dd>should not be called only after phpCAS::forceAuthentication() or phpCAS::checkAuthentication().</dd></dl>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$key </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>boolean </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01247">1247</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaeee7fd7060e5edbf791e71b49270c9e1"></a><!-- doxytag: member="phpCAS::hasAttributes" ref="gaeee7fd7060e5edbf791e71b49270c9e1" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::hasAttributes </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer true if there are attributes for the authenticated user.</p>
+<dl class="warning"><dt><b>Warning:</b></dt><dd>should not be called only after phpCAS::forceAuthentication() or phpCAS::checkAuthentication().</dd></dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>boolean </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01224">1224</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga48c16f6ef7158f8cf32dec4d1a68cbe5"></a><!-- doxytag: member="phpCAS::isAuthenticated" ref="ga48c16f6ef7158f8cf32dec4d1a68cbe5" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::isAuthenticated </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is called to check if the user is authenticated (previously or by tickets given in the URL).</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>TRUE when the user is authenticated. </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01135">1135</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gac79ced3333492b28b9d3849c56becb9e"></a><!-- doxytag: member="phpCAS::isSessionAuthenticated" ref="gac79ced3333492b28b9d3849c56becb9e" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::isSessionAuthenticated </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Checks whether authenticated based on $_SESSION. Useful to avoid server calls. </p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>true if authenticated, false otherwise. </dd></dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>0.4.22 by Brendan Arnold </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01165">1165</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga9989272833c5170c3b7c7027beab795b"></a><!-- doxytag: member="phpCAS::logout" ref="ga9989272833c5170c3b7c7027beab795b" args="($params=&quot;&quot;)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::logout </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>params</em> = <code>&quot;&quot;</code></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to logout from CAS.  $params an array that contains the optional url and service parameters that will be passed to the CAS server </p>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__custom__urls_8php-example.html#a9">example_custom_urls.php</a>, <a class="el" href="example__gateway_8php-example.html#a7">example_gateway.php</a>, and <a class="el" href="example__simple_8php-example.html#a8">example_simple.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01430">1430</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga8121363b18b23a7ff84850851d85fcc1"></a><!-- doxytag: member="phpCAS::logoutWithRedirectService" ref="ga8121363b18b23a7ff84850851d85fcc1" args="($service)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::logoutWithRedirectService </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>service</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to logout from CAS. Halts by redirecting to the CAS server. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$service</em>&nbsp;</td><td>a URL that will be transmitted to the CAS server </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01460">1460</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga03f02d32829f8e2dd7056aaa94dcfb79"></a><!-- doxytag: member="phpCAS::logoutWithRedirectServiceAndUrl" ref="ga03f02d32829f8e2dd7056aaa94dcfb79" args="($service, $url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::logoutWithRedirectServiceAndUrl </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>service</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to logout from CAS. Halts by redirecting to the CAS server. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$service</em>&nbsp;</td><td>a URL that will be transmitted to the CAS server </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>a URL that will be transmitted to the CAS server </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000005">Deprecated:</a></b></dt><dd>The url parameter has been removed from the CAS server as of version 3.3.5.1 </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01504">1504</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaf747b39e646075718b6504ae30d6df87"></a><!-- doxytag: member="phpCAS::logoutWithUrl" ref="gaf747b39e646075718b6504ae30d6df87" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::logoutWithUrl </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to logout from CAS. Halts by redirecting to the CAS server. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>a URL that will be transmitted to the CAS server </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000004">Deprecated:</a></b></dt><dd>The url parameter has been removed from the CAS server as of version 3.3.5.1 </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01481">1481</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga368b22dab91392a949dbfe902f2ac5f5"></a><!-- doxytag: member="phpCAS::renewAuthentication" ref="ga368b22dab91392a949dbfe902f2ac5f5" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::renewAuthentication </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is called to renew the authentication. </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01107">1107</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga68624158674efe68505c247942ee129b"></a><!-- doxytag: member="phpCAS::retrievePT" ref="ga68624158674efe68505c247942ee129b" args="($target_service, &amp;$err_code, &amp;$err_msg)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::retrievePT </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>target_service</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>err_code</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>err_msg</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Retrieve a Proxy Ticket from the CAS server. </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01580">1580</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga6c3433e912dce36c51ebd5732bd43d07"></a><!-- doxytag: member="phpCAS::setCacheTimesForAuthRecheck" ref="ga6c3433e912dce36c51ebd5732bd43d07" args="($n)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setCacheTimesForAuthRecheck </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>n</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the times authentication will be cached before really accessing the CAS server in gateway mode:</p>
+<ul>
+<li>-1: check only once, and then never again (until you pree login)</li>
+<li>0: always check</li>
+<li>n: check every "n" time</li>
+</ul>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$n</em>&nbsp;</td><td>an integer. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00979">979</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gac7c2da957fdd437f1e23147f83daffcb"></a><!-- doxytag: member="phpCAS::setCasServerCACert" ref="gac7c2da957fdd437f1e23147f83daffcb" args="($cert)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setCasServerCACert </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>cert</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the certificate of the CAS server CA.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$cert</em>&nbsp;</td><td>the CA certificate </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__advanced__saml11_8php-example.html#a6">example_advanced_saml11.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01596">1596</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga8d7426d23b152ea51c1bdefdd6516df6"></a><!-- doxytag: member="phpCAS::setFixedCallbackURL" ref="ga8d7426d23b152ea51c1bdefdd6516df6" args="($url= '')" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setFixedCallbackURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em> = <code>''</code></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the fixed URL that will be used by the CAS server to transmit the PGT. When this method is not called, a <a class="el" href="classphpCAS.html">phpCAS</a> script uses its own URL for the callback.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the URL </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01531">1531</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga6a67472e035941451db7d22d51d3017b"></a><!-- doxytag: member="phpCAS::setFixedServiceURL" ref="ga6a67472e035941451db7d22d51d3017b" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setFixedServiceURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the fixed URL that will be set as the CAS service parameter. When this method is not called, a <a class="el" href="classphpCAS.html">phpCAS</a> script uses its own URL.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the URL </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01553">1553</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gacff185b5b08e4ff603d0f6f1cb76e4ce"></a><!-- doxytag: member="phpCAS::setNoCasServerValidation" ref="gacff185b5b08e4ff603d0f6f1cb76e4ce" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setNoCasServerValidation </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set no SSL validation for the CAS server. </p>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__custom__urls_8php-example.html#a6">example_custom_urls.php</a>, <a class="el" href="example__gateway_8php-example.html#a6">example_gateway.php</a>, <a class="el" href="example__html_8php-example.html#a6">example_html.php</a>, <a class="el" href="example__lang_8php-example.html#a6">example_lang.php</a>, <a class="el" href="example__logout_8php-example.html#a6">example_logout.php</a>, <a class="el" href="example__pgt__storage__file_8php-example.html#a6">example_pgt_storage_file.php</a>, <a class="el" href="example__proxy__GET_8php-example.html#a6">example_proxy_GET.php</a>, <a class="el" href="example__proxy__POST_8php-example.html#a6">example_proxy_POST.php</a>, <a class="el" href="example__proxy__serviceWeb_8php-example.html#a6">example_proxy_serviceWeb.php</a>, <a class="el" href="example__proxy__serviceWeb__chaining_8php-example.html#a6">example_proxy_serviceWeb_chaining.php</a>, <a class="el" href="example__service_8php-example.html#a6">example_service.php</a>, <a class="el" href="example__service__POST_8php-example.html#a6">example_service_POST.php</a>, <a class="el" href="example__service__that__proxies_8php-example.html#a6">example_service_that_proxies.php</a>, and <a class="el" href="example__simple_8php-example.html#a6">example_simple.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01612">1612</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gac7a6eeb2bfd55a432c57f5d18bd35048"></a><!-- doxytag: member="phpCAS::setNoClearTicketsFromUrl" ref="gac7a6eeb2bfd55a432c57f5d18bd35048" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setNoClearTicketsFromUrl </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Disable the removal of a CAS-Ticket from the URL when authenticating DISABLING POSES A SECURITY RISK: We normally remove the ticket by an additional redirect as a security precaution to prevent a ticket in the HTTP_REFERRER or be carried over in the URL parameter </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01629">1629</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaef46bf2c415a72f1e81a1bf3a75b1324"></a><!-- doxytag: member="phpCAS::setPostAuthenticateCallback" ref="gaef46bf2c415a72f1e81a1bf3a75b1324" args="($function, array $additionalArgs=array())" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setPostAuthenticateCallback </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>function</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">array $&nbsp;</td>
+          <td class="paramname"> <em>additionalArgs</em> = <code>array()</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set a callback function to be run when a user authenticates.</p>
+<p>The callback function will be passed a $logoutTicket as its first parameter, followed by any $additionalArgs you pass. The $logoutTicket parameter is an opaque string that can be used to map the session-id to logout request in order to support single-signout in applications that manage their own sessions (rather than letting <a class="el" href="classphpCAS.html">phpCAS</a> start the session).</p>
+<p>phpCAS::forceAuthentication() will always exit and forward client unless they are already authenticated. To perform an action at the moment the user logs in (such as registering an account, performing logging, etc), register a callback function here.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>callback</em>&nbsp;</td><td>$function </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>optional</em>&nbsp;</td><td>array $additionalArgs </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01008">1008</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga3bae96f4d17cdc12ac2e81334ba44fc1"></a><!-- doxytag: member="phpCAS::setServerLoginURL" ref="ga3bae96f4d17cdc12ac2e81334ba44fc1" args="($url= '')" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setServerLoginURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em> = <code>''</code></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the login URL of the CAS server. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the login URL </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>0.4.21 by Wyman Chan </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01314">1314</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga090c9e2112180f4073cd2583c5c07800"></a><!-- doxytag: member="phpCAS::setServerLogoutURL" ref="ga090c9e2112180f4073cd2583c5c07800" args="($url= '')" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setServerLogoutURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em> = <code>''</code></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the logout URL of the CAS server. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the logout URL </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>0.4.21 by Wyman Chan </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01410">1410</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga11d1c13ed3d5008984ef5999a9389104"></a><!-- doxytag: member="phpCAS::setServerProxyValidateURL" ref="ga11d1c13ed3d5008984ef5999a9389104" args="($url= '')" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setServerProxyValidateURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em> = <code>''</code></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the proxyValidate URL of the CAS server. Used for all CAS 2.0 validations </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the proxyValidate URL </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>1.1.0 by Joachim Fritschi </dd></dl>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__custom__urls_8php-example.html#a7">example_custom_urls.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01356">1356</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga22ccd6f45db38b80f3549fc7691b1c8b"></a><!-- doxytag: member="phpCAS::setServerSamlValidateURL" ref="ga22ccd6f45db38b80f3549fc7691b1c8b" args="($url= '')" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setServerSamlValidateURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em> = <code>''</code></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the samlValidate URL of the CAS server. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the samlValidate URL </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>1.1.0 by Joachim Fritschi </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01376">1376</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga70abe40a03b6ebb068eecba436dd7a8c"></a><!-- doxytag: member="phpCAS::setServerServiceValidateURL" ref="ga70abe40a03b6ebb068eecba436dd7a8c" args="($url= '')" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setServerServiceValidateURL </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em> = <code>''</code></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the serviceValidate URL of the CAS server. Used only in CAS 1.0 validations </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the serviceValidate URL </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="since"><dt><b>Since:</b></dt><dd>1.1.0 by Joachim Fritschi </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01335">1335</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga996cb0478f7f35fca4dd33c9714d2452"></a><!-- doxytag: member="phpCAS::setSingleSignoutCallback" ref="ga996cb0478f7f35fca4dd33c9714d2452" args="($function, array $additionalArgs=array())" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setSingleSignoutCallback </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>function</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">array $&nbsp;</td>
+          <td class="paramname"> <em>additionalArgs</em> = <code>array()</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set a callback function to be run when a single-signout request is received.</p>
+<p>The callback function will be passed a $logoutTicket as its first parameter, followed by any $additionalArgs you pass. The $logoutTicket parameter is an opaque string that can be used to map a session-id to the logout request in order to support single-signout in applications that manage their own sessions (rather than letting <a class="el" href="classphpCAS.html">phpCAS</a> start and destroy the session).</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>callback</em>&nbsp;</td><td>$function </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>optional</em>&nbsp;</td><td>array $additionalArgs </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l01030">1030</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicConfig.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicConfig.html
new file mode 100644
index 00000000..bbb71c22
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicConfig.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Configuration</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#groups">Modules</a>  </div>
+  <div class="headertitle">
+<h1>Configuration<br/>
+<small>
+[<a class="el" href="group__public.html">User interface</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="groups"></a>
+Modules</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html">Internationalization</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicOutput.html">HTML output</a></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicPGTStorage.html">PGT storage</a></td></tr>
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicDebug.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicDebug.html
new file mode 100644
index 00000000..8711872d
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicDebug.html
@@ -0,0 +1,265 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Debugging</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>Debugging<br/>
+<small>
+[<a class="el" href="group__public.html">User interface</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#gab6968f526a29ba688e250949b56c0395">DEFAULT_DEBUG_DIR</a> </td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#ga3b7fb5108aa7a21f3d09bebe5fc8c81e">phpCAS::setDebug</a> ($filename= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#ga7e3b47a04a67d840cc60a765090c5505">phpCAS::log</a> ($str)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#gad2ce3598515785f17e401e79b04c46b6">phpCAS::error</a> ($msg)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#ga1cfa88b981cd6da70bc2647e8a3c4a7c">phpCAS::trace</a> ($str)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#gacd102f5ed044b0138a6a1d6ae43360d5">phpCAS::traceBegin</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#ga66c089cec3dd91508167dbcb6c0e00d8">phpCAS::traceEnd</a> ($res= '')</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicDebug.html#gaeac0ae59564b18b9f61d20747693019e">phpCAS::traceExit</a> ()</td></tr>
+</table>
+<hr/><h2>Enumeration Type Documentation</h2>
+<a class="anchor" id="gab6968f526a29ba688e250949b56c0395"></a><!-- doxytag: member="CAS.php::DEFAULT_DEBUG_DIR" ref="gab6968f526a29ba688e250949b56c0395" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicDebug.html#gab6968f526a29ba688e250949b56c0395">DEFAULT_DEBUG_DIR</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>The default directory for the debug file under Unix. </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00242">242</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="gad2ce3598515785f17e401e79b04c46b6"></a><!-- doxytag: member="phpCAS::error" ref="gad2ce3598515785f17e401e79b04c46b6" args="($msg)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::error </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>msg</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used by interface methods to print an error and where the function was originally called from.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$msg</em>&nbsp;</td><td>the message to print </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00513">513</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, and <a class="el" href="CAS_8php_source.html#l00603">phpCAS::traceExit()</a>.</p>
+
+<p>Referenced by <a class="el" href="File_8php_source.html#l00113">CAS_PGTStorage_File::__construct()</a>, <a class="el" href="AbstractStorage_8php_source.html#l00063">CAS_PGTStorage_AbstractStorage::__construct()</a>, <a class="el" href="Client_8php_source.html#l00689">CAS_Client::__construct()</a>, <a class="el" href="Client_8php_source.html#l01942">CAS_Client::callback()</a>, <a class="el" href="CAS_8php_source.html#l01045">phpCAS::checkAuthentication()</a>, <a class="el" href="CAS_8php_source.html#l00348">phpCAS::client()</a>, <a class="el" href="Db_8php_source.html#l00273">CAS_PGTStorage_Db::createTable()</a>, <a class="el" href="CAS_8php_source.html#l01073">phpCAS::forceAuthentication()</a>, <a class="el" href="Client_8php_source.html#l00915">CAS_Client::getAttributes()</a>, <a class="el" href="CAS_8php_source.html#l00820">phpCAS::getProxiedService()</a>, <a class="el" href="CAS_8php_source.html#l01668">phpCAS::getProxies()</a>, <a class="el" href="CAS_8php_source.html#l01397">phpCAS::getServerLogoutURL()</a>, <a class="el" href="CAS_8php_source.html#l01569">phpCAS::getServiceURL()</a>, <a class="el" href="AbstractStorage_8php_source.html#l00093">CAS_PGTStorage_AbstractStorage::getStorageInfo()</a>, <a class="el" href="AbstractStorage_8php_source.html#l00082">CAS_PGTStorage_AbstractStorage::getStorageType()</a>, <a class="el" href="Client_8php_source.html#l00888">CAS_Client::getUser()</a>, <a class="el" href="Client_8php_source.html#l01312">CAS_Client::handleLogoutRequests()</a>, <a class="el" href="Db_8php_source.html#l00166">CAS_PGTStorage_Db::init()</a>, <a class="el" href="CAS_8php_source.html#l00857">phpCAS::initializeProxiedService()</a>, <a class="el" href="CAS_8php_source.html#l01430">phpCAS::logout()</a>, <a class="el" href="CAS_8php_source.html#l01460">phpCAS::logoutWithRedirectService()</a>, <a class="el" href="CAS_8php_source.html#l01504">phpCAS::logoutWithRedirectServiceAndUrl()</a>, <a class="el" href="CAS_8php_source.html#l01481">phpCAS::logoutWithUrl()</a>, <a class="el" href="CAS_8php_source.html#l00397">phpCAS::proxy()</a>, <a class="el" href="AbstractStorage_8php_source.html#l00202">CAS_PGTStorage_AbstractStorage::read()</a>, <a class="el" href="Client_8php_source.html#l02264">CAS_Client::readURL()</a>, <a class="el" href="Client_8php_source.html#l02967">CAS_Client::renameSession()</a>, <a class="el" href="CAS_8php_source.html#l01580">phpCAS::retrievePT()</a>, <a class="el" href="CAS_8php_source.html#l00932">phpCAS::serviceMail()</a>, <a class="el" href="CAS_8php_source.html#l00889">phpCAS::serviceWeb()</a>, <a class="el" href="CAS_8php_source.html#l00979">phpCAS::setCacheTimesForAuthRecheck()</a>, <a class="el" href="CAS_8php_source.html#l01596">phpCAS::setCasServerCACert()</a>, <a class="el" href="CAS_8php_source.html#l00447">phpCAS::setDebug()</a>, <a class="el" href="CAS_8php_source.html#l01647">phpCAS::setExtraCurlOption()</a>, <a class="el" href="CAS_8php_source.html#l01531">phpCAS::setFixedCallbackURL()</a>, <a class="el" href="CAS_8php_source.html#l01553">phpCAS::setFixedServiceURL()</a>, <a class="el" href="CAS_8php_source.html#l00689">phpCAS::setHTMLFooter()</a>, <a class="el" href="CAS_8php_source.html#l00673">phpCAS::setHTMLHeader()</a>, <a class="el" href="CAS_8php_source.html#l00630">phpCAS::setLang()</a>, <a class="el" href="CAS_8php_source.html#l01612">phpCAS::setNoCasServerValidation()</a>, <a class="el" href="CAS_8php_source.html#l01629">phpCAS::setNoClearTicketsFromUrl()</a>, <a class="el" href="Client_8php_source.html#l02032">CAS_Client::setPGTStorage()</a>, <a class="el" href="CAS_8php_source.html#l00714">phpCAS::setPGTStorage()</a>, <a class="el" href="CAS_8php_source.html#l00744">phpCAS::setPGTStorageDb()</a>, <a class="el" href="CAS_8php_source.html#l00776">phpCAS::setPGTStorageFile()</a>, <a class="el" href="CAS_8php_source.html#l01008">phpCAS::setPostAuthenticateCallback()</a>, <a class="el" href="CAS_8php_source.html#l01410">phpCAS::setServerLogoutURL()</a>, <a class="el" href="CAS_8php_source.html#l01356">phpCAS::setServerProxyValidateURL()</a>, <a class="el" href="CAS_8php_source.html#l01376">phpCAS::setServerSamlValidateURL()</a>, <a class="el" href="CAS_8php_source.html#l01335">phpCAS::setServerServiceValidateURL()</a>, <a class="el" href="CAS_8php_source.html#l01030">phpCAS::setSingleSignoutCallback()</a>, <a class="el" href="File_8php_source.html#l00193">CAS_PGTStorage_File::write()</a>, <a class="el" href="Db_8php_source.html#l00311">CAS_PGTStorage_Db::write()</a>, and <a class="el" href="AbstractStorage_8php_source.html#l00188">CAS_PGTStorage_AbstractStorage::write()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga7e3b47a04a67d840cc60a765090c5505"></a><!-- doxytag: member="phpCAS::log" ref="ga7e3b47a04a67d840cc60a765090c5505" args="($str)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::log </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>str</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Logs a string in debug mode.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$str</em>&nbsp;</td><td>the string to write </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00490">490</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>Referenced by <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>, and <a class="el" href="CAS_8php_source.html#l00603">phpCAS::traceExit()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga3b7fb5108aa7a21f3d09bebe5fc8c81e"></a><!-- doxytag: member="phpCAS::setDebug" ref="ga3b7fb5108aa7a21f3d09bebe5fc8c81e" args="($filename= '')" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setDebug </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>filename</em> = <code>''</code></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set/unset debug mode</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$filename</em>&nbsp;</td><td>the name of the file used for logging, or FALSE to stop debugging. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__advanced__saml11_8php-example.html#a1">example_advanced_saml11.php</a>, <a class="el" href="example__custom__urls_8php-example.html#a1">example_custom_urls.php</a>, <a class="el" href="example__gateway_8php-example.html#a1">example_gateway.php</a>, <a class="el" href="example__html_8php-example.html#a1">example_html.php</a>, <a class="el" href="example__lang_8php-example.html#a1">example_lang.php</a>, <a class="el" href="example__logout_8php-example.html#a1">example_logout.php</a>, <a class="el" href="example__pgt__storage__file_8php-example.html#a1">example_pgt_storage_file.php</a>, <a class="el" href="example__proxy__GET_8php-example.html#a1">example_proxy_GET.php</a>, <a class="el" href="example__proxy__POST_8php-example.html#a1">example_proxy_POST.php</a>, <a class="el" href="example__proxy__serviceWeb_8php-example.html#a1">example_proxy_serviceWeb.php</a>, <a class="el" href="example__proxy__serviceWeb__chaining_8php-example.html#a1">example_proxy_serviceWeb_chaining.php</a>, <a class="el" href="example__service_8php-example.html#a1">example_service.php</a>, <a class="el" href="example__service__POST_8php-example.html#a1">example_service_POST.php</a>, <a class="el" href="example__service__that__proxies_8php-example.html#a1">example_service_that_proxies.php</a>, and <a class="el" href="example__simple_8php-example.html#a1">example_simple.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00447">447</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, and <a class="el" href="CAS_8php_source.html#l00538">phpCAS::trace()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga1cfa88b981cd6da70bc2647e8a3c4a7c"></a><!-- doxytag: member="phpCAS::trace" ref="ga1cfa88b981cd6da70bc2647e8a3c4a7c" args="($str)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::trace </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>str</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to log something in debug mode. </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00538">538</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00490">phpCAS::log()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l00689">CAS_Client::__construct()</a>, <a class="el" href="CurlRequest_8php_source.html#l00058">CAS_CurlRequest::_sendRequest()</a>, <a class="el" href="Client_8php_source.html#l03009">CAS_Client::authError()</a>, <a class="el" href="Client_8php_source.html#l01942">CAS_Client::callback()</a>, <a class="el" href="Client_8php_source.html#l01001">CAS_Client::checkAuthentication()</a>, <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="Client_8php_source.html#l00958">CAS_Client::forceAuthentication()</a>, <a class="el" href="CAS_8php_source.html#l01073">phpCAS::forceAuthentication()</a>, <a class="el" href="Client_8php_source.html#l02862">CAS_Client::getURL()</a>, <a class="el" href="Client_8php_source.html#l01312">CAS_Client::handleLogoutRequests()</a>, <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>, <a class="el" href="Client_8php_source.html#l01273">CAS_Client::logout()</a>, <a class="el" href="Http_2Abstract_8php_source.html#l00190">CAS_ProxiedService_Http_Abstract::makeRequest()</a>, <a class="el" href="Imap_8php_source.html#l00163">CAS_ProxiedService_Imap::open()</a>, <a class="el" href="CookieJar_8php_source.html#l00144">CAS_CookieJar::parseCookieHeader()</a>, <a class="el" href="File_8php_source.html#l00222">CAS_PGTStorage_File::read()</a>, <a class="el" href="Db_8php_source.html#l00353">CAS_PGTStorage_Db::read()</a>, <a class="el" href="Client_8php_source.html#l01253">CAS_Client::redirectToCas()</a>, <a class="el" href="Client_8php_source.html#l02967">CAS_Client::renameSession()</a>, <a class="el" href="Client_8php_source.html#l00939">CAS_Client::renewAuthentication()</a>, <a class="el" href="Client_8php_source.html#l02143">CAS_Client::retrievePT()</a>, <a class="el" href="CAS_8php_source.html#l00447">phpCAS::setDebug()</a>, <a class="el" href="Client_8php_source.html#l01707">CAS_Client::setSessionAttributes()</a>, <a class="el" href="CookieJar_8php_source.html#l00064">CAS_CookieJar::storeCookies()</a>, <a class="el" href="Client_8php_source.html#l02092">CAS_Client::validatePGT()</a>, <a class="el" href="Client_8php_source.html#l02581">CAS_Client::validatePT()</a>, <a class="el" href="Client_8php_source.html#l01626">CAS_Client::validateSA()</a>, <a class="el" href="Client_8php_source.html#l01489">CAS_Client::validateST()</a>, and <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gacd102f5ed044b0138a6a1d6ae43360d5"></a><!-- doxytag: member="phpCAS::traceBegin" ref="gacd102f5ed044b0138a6a1d6ae43360d5" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::traceBegin </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to indicate the start of the execution of a function in debug mode. </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00546">546</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00490">phpCAS::log()</a>.</p>
+
+<p>Referenced by <a class="el" href="File_8php_source.html#l00113">CAS_PGTStorage_File::__construct()</a>, <a class="el" href="Db_8php_source.html#l00132">CAS_PGTStorage_Db::__construct()</a>, <a class="el" href="AbstractStorage_8php_source.html#l00063">CAS_PGTStorage_AbstractStorage::__construct()</a>, <a class="el" href="Client_8php_source.html#l00689">CAS_Client::__construct()</a>, <a class="el" href="CurlRequest_8php_source.html#l00058">CAS_CurlRequest::_sendRequest()</a>, <a class="el" href="Client_8php_source.html#l03009">CAS_Client::authError()</a>, <a class="el" href="Client_8php_source.html#l02312">CAS_Client::buildSAMLPayload()</a>, <a class="el" href="Client_8php_source.html#l01942">CAS_Client::callback()</a>, <a class="el" href="Client_8php_source.html#l01001">CAS_Client::checkAuthentication()</a>, <a class="el" href="CAS_8php_source.html#l01045">phpCAS::checkAuthentication()</a>, <a class="el" href="CAS_8php_source.html#l00348">phpCAS::client()</a>, <a class="el" href="Db_8php_source.html#l00273">CAS_PGTStorage_Db::createTable()</a>, <a class="el" href="Client_8php_source.html#l00958">CAS_Client::forceAuthentication()</a>, <a class="el" href="CAS_8php_source.html#l01073">phpCAS::forceAuthentication()</a>, <a class="el" href="File_8php_source.html#l00176">CAS_PGTStorage_File::getPGTIouFilename()</a>, <a class="el" href="CAS_8php_source.html#l00820">phpCAS::getProxiedService()</a>, <a class="el" href="Client_8php_source.html#l00350">CAS_Client::getServerLoginURL()</a>, <a class="el" href="Client_8php_source.html#l00461">CAS_Client::getServerProxyValidateURL()</a>, <a class="el" href="Client_8php_source.html#l00440">CAS_Client::getServerSamlValidateURL()</a>, <a class="el" href="Client_8php_source.html#l00418">CAS_Client::getServerServiceValidateURL()</a>, <a class="el" href="Client_8php_source.html#l02862">CAS_Client::getURL()</a>, <a class="el" href="Client_8php_source.html#l01312">CAS_Client::handleLogoutRequests()</a>, <a class="el" href="File_8php_source.html#l00153">CAS_PGTStorage_File::init()</a>, <a class="el" href="Db_8php_source.html#l00166">CAS_PGTStorage_Db::init()</a>, <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>, <a class="el" href="Client_8php_source.html#l01273">CAS_Client::logout()</a>, <a class="el" href="CAS_8php_source.html#l01430">phpCAS::logout()</a>, <a class="el" href="CAS_8php_source.html#l01460">phpCAS::logoutWithRedirectService()</a>, <a class="el" href="CAS_8php_source.html#l01504">phpCAS::logoutWithRedirectServiceAndUrl()</a>, <a class="el" href="CAS_8php_source.html#l01481">phpCAS::logoutWithUrl()</a>, <a class="el" href="Imap_8php_source.html#l00163">CAS_ProxiedService_Imap::open()</a>, <a class="el" href="CookieJar_8php_source.html#l00122">CAS_CookieJar::parseCookieHeaders()</a>, <a class="el" href="CAS_8php_source.html#l00397">phpCAS::proxy()</a>, <a class="el" href="File_8php_source.html#l00222">CAS_PGTStorage_File::read()</a>, <a class="el" href="Db_8php_source.html#l00353">CAS_PGTStorage_Db::read()</a>, <a class="el" href="Client_8php_source.html#l01253">CAS_Client::redirectToCas()</a>, <a class="el" href="Client_8php_source.html#l02967">CAS_Client::renameSession()</a>, <a class="el" href="Client_8php_source.html#l00939">CAS_Client::renewAuthentication()</a>, <a class="el" href="Client_8php_source.html#l02143">CAS_Client::retrievePT()</a>, <a class="el" href="Http_2Abstract_8php_source.html#l00127">CAS_ProxiedService_Http_Abstract::send()</a>, <a class="el" href="CAS_8php_source.html#l00932">phpCAS::serviceMail()</a>, <a class="el" href="CAS_8php_source.html#l00889">phpCAS::serviceWeb()</a>, <a class="el" href="CAS_8php_source.html#l01596">phpCAS::setCasServerCACert()</a>, <a class="el" href="CAS_8php_source.html#l01647">phpCAS::setExtraCurlOption()</a>, <a class="el" href="CAS_8php_source.html#l01531">phpCAS::setFixedCallbackURL()</a>, <a class="el" href="CAS_8php_source.html#l01553">phpCAS::setFixedServiceURL()</a>, <a class="el" href="CAS_8php_source.html#l01612">phpCAS::setNoCasServerValidation()</a>, <a class="el" href="CAS_8php_source.html#l01629">phpCAS::setNoClearTicketsFromUrl()</a>, <a class="el" href="CAS_8php_source.html#l00714">phpCAS::setPGTStorage()</a>, <a class="el" href="CAS_8php_source.html#l00744">phpCAS::setPGTStorageDb()</a>, <a class="el" href="CAS_8php_source.html#l00776">phpCAS::setPGTStorageFile()</a>, <a class="el" href="CAS_8php_source.html#l01410">phpCAS::setServerLogoutURL()</a>, <a class="el" href="CAS_8php_source.html#l01356">phpCAS::setServerProxyValidateURL()</a>, <a class="el" href="CAS_8php_source.html#l01376">phpCAS::setServerSamlValidateURL()</a>, <a class="el" href="CAS_8php_source.html#l01335">phpCAS::setServerServiceValidateURL()</a>, <a class="el" href="Client_8php_source.html#l01707">CAS_Client::setSessionAttributes()</a>, <a class="el" href="Client_8php_source.html#l02092">CAS_Client::validatePGT()</a>, <a class="el" href="Client_8php_source.html#l02581">CAS_Client::validatePT()</a>, <a class="el" href="Client_8php_source.html#l01626">CAS_Client::validateSA()</a>, <a class="el" href="Client_8php_source.html#l01489">CAS_Client::validateST()</a>, <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>, <a class="el" href="File_8php_source.html#l00193">CAS_PGTStorage_File::write()</a>, and <a class="el" href="Db_8php_source.html#l00311">CAS_PGTStorage_Db::write()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga66c089cec3dd91508167dbcb6c0e00d8"></a><!-- doxytag: member="phpCAS::traceEnd" ref="ga66c089cec3dd91508167dbcb6c0e00d8" args="($res= '')" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::traceEnd </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>res</em> = <code>''</code></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to indicate the end of the execution of a function in debug mode.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$res</em>&nbsp;</td><td>the result of the function </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00585">585</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00490">phpCAS::log()</a>.</p>
+
+<p>Referenced by <a class="el" href="File_8php_source.html#l00113">CAS_PGTStorage_File::__construct()</a>, <a class="el" href="Db_8php_source.html#l00132">CAS_PGTStorage_Db::__construct()</a>, <a class="el" href="AbstractStorage_8php_source.html#l00063">CAS_PGTStorage_AbstractStorage::__construct()</a>, <a class="el" href="Client_8php_source.html#l00689">CAS_Client::__construct()</a>, <a class="el" href="CurlRequest_8php_source.html#l00058">CAS_CurlRequest::_sendRequest()</a>, <a class="el" href="Client_8php_source.html#l02312">CAS_Client::buildSAMLPayload()</a>, <a class="el" href="Client_8php_source.html#l01001">CAS_Client::checkAuthentication()</a>, <a class="el" href="CAS_8php_source.html#l01045">phpCAS::checkAuthentication()</a>, <a class="el" href="CAS_8php_source.html#l00348">phpCAS::client()</a>, <a class="el" href="Db_8php_source.html#l00273">CAS_PGTStorage_Db::createTable()</a>, <a class="el" href="Client_8php_source.html#l00958">CAS_Client::forceAuthentication()</a>, <a class="el" href="File_8php_source.html#l00176">CAS_PGTStorage_File::getPGTIouFilename()</a>, <a class="el" href="CAS_8php_source.html#l00820">phpCAS::getProxiedService()</a>, <a class="el" href="Client_8php_source.html#l00350">CAS_Client::getServerLoginURL()</a>, <a class="el" href="Client_8php_source.html#l00461">CAS_Client::getServerProxyValidateURL()</a>, <a class="el" href="Client_8php_source.html#l00440">CAS_Client::getServerSamlValidateURL()</a>, <a class="el" href="Client_8php_source.html#l00418">CAS_Client::getServerServiceValidateURL()</a>, <a class="el" href="Client_8php_source.html#l02862">CAS_Client::getURL()</a>, <a class="el" href="Client_8php_source.html#l01312">CAS_Client::handleLogoutRequests()</a>, <a class="el" href="File_8php_source.html#l00153">CAS_PGTStorage_File::init()</a>, <a class="el" href="Db_8php_source.html#l00166">CAS_PGTStorage_Db::init()</a>, <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>, <a class="el" href="CAS_8php_source.html#l01430">phpCAS::logout()</a>, <a class="el" href="CAS_8php_source.html#l01460">phpCAS::logoutWithRedirectService()</a>, <a class="el" href="CAS_8php_source.html#l01504">phpCAS::logoutWithRedirectServiceAndUrl()</a>, <a class="el" href="CAS_8php_source.html#l01481">phpCAS::logoutWithUrl()</a>, <a class="el" href="CookieJar_8php_source.html#l00122">CAS_CookieJar::parseCookieHeaders()</a>, <a class="el" href="CAS_8php_source.html#l00397">phpCAS::proxy()</a>, <a class="el" href="File_8php_source.html#l00222">CAS_PGTStorage_File::read()</a>, <a class="el" href="Db_8php_source.html#l00353">CAS_PGTStorage_Db::read()</a>, <a class="el" href="Client_8php_source.html#l02967">CAS_Client::renameSession()</a>, <a class="el" href="Client_8php_source.html#l00939">CAS_Client::renewAuthentication()</a>, <a class="el" href="Client_8php_source.html#l02143">CAS_Client::retrievePT()</a>, <a class="el" href="Http_2Abstract_8php_source.html#l00127">CAS_ProxiedService_Http_Abstract::send()</a>, <a class="el" href="CAS_8php_source.html#l00932">phpCAS::serviceMail()</a>, <a class="el" href="CAS_8php_source.html#l00889">phpCAS::serviceWeb()</a>, <a class="el" href="CAS_8php_source.html#l01596">phpCAS::setCasServerCACert()</a>, <a class="el" href="CAS_8php_source.html#l01647">phpCAS::setExtraCurlOption()</a>, <a class="el" href="CAS_8php_source.html#l01531">phpCAS::setFixedCallbackURL()</a>, <a class="el" href="CAS_8php_source.html#l01553">phpCAS::setFixedServiceURL()</a>, <a class="el" href="CAS_8php_source.html#l01612">phpCAS::setNoCasServerValidation()</a>, <a class="el" href="CAS_8php_source.html#l01629">phpCAS::setNoClearTicketsFromUrl()</a>, <a class="el" href="CAS_8php_source.html#l00714">phpCAS::setPGTStorage()</a>, <a class="el" href="CAS_8php_source.html#l00744">phpCAS::setPGTStorageDb()</a>, <a class="el" href="CAS_8php_source.html#l00776">phpCAS::setPGTStorageFile()</a>, <a class="el" href="CAS_8php_source.html#l01410">phpCAS::setServerLogoutURL()</a>, <a class="el" href="CAS_8php_source.html#l01356">phpCAS::setServerProxyValidateURL()</a>, <a class="el" href="CAS_8php_source.html#l01376">phpCAS::setServerSamlValidateURL()</a>, <a class="el" href="CAS_8php_source.html#l01335">phpCAS::setServerServiceValidateURL()</a>, <a class="el" href="Client_8php_source.html#l01707">CAS_Client::setSessionAttributes()</a>, <a class="el" href="Client_8php_source.html#l02092">CAS_Client::validatePGT()</a>, <a class="el" href="Client_8php_source.html#l01176">CAS_Client::wasPreviouslyAuthenticated()</a>, <a class="el" href="File_8php_source.html#l00193">CAS_PGTStorage_File::write()</a>, and <a class="el" href="Db_8php_source.html#l00311">CAS_PGTStorage_Db::write()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaeac0ae59564b18b9f61d20747693019e"></a><!-- doxytag: member="phpCAS::traceExit" ref="gaeac0ae59564b18b9f61d20747693019e" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::traceExit </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to indicate the end of the execution of the program </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00603">603</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00490">phpCAS::log()</a>.</p>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l03009">CAS_Client::authError()</a>, <a class="el" href="Client_8php_source.html#l01942">CAS_Client::callback()</a>, <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="Client_8php_source.html#l01312">CAS_Client::handleLogoutRequests()</a>, <a class="el" href="Client_8php_source.html#l01052">CAS_Client::isAuthenticated()</a>, <a class="el" href="Client_8php_source.html#l01273">CAS_Client::logout()</a>, and <a class="el" href="Client_8php_source.html#l01253">CAS_Client::redirectToCas()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicInit.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicInit.html
new file mode 100644
index 00000000..ab550a2d
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicInit.html
@@ -0,0 +1,171 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Initialization</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>Initialization<br/>
+<small>
+[<a class="el" href="group__public.html">User interface</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicInit.html#gaac131c0cead58496e2239ed2ccbcecef">phpCAS::client</a> ($server_version, $server_hostname, $server_port, $server_uri, $start_session=true)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicInit.html#ga11f7ebc04450414039632feccec5acc0">phpCAS::proxy</a> ($server_version, $server_hostname, $server_port, $server_uri, $start_session=true)</td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="gaac131c0cead58496e2239ed2ccbcecef"></a><!-- doxytag: member="phpCAS::client" ref="gaac131c0cead58496e2239ed2ccbcecef" args="($server_version, $server_hostname, $server_port, $server_uri, $start_session=true)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::client </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>server_version</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>server_hostname</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>server_port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>server_uri</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>start_session</em> = <code>true</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="classphpCAS.html">phpCAS</a> client initializer. </p>
+<dl class="note"><dt><b>Note:</b></dt><dd>Only one of the phpCAS::client() and phpCAS::proxy functions should be called, only once, and before all other methods (except phpCAS::getVersion() and phpCAS::setDebug()).</dd></dl>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$server_version</em>&nbsp;</td><td>the version of the CAS server </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$server_hostname</em>&nbsp;</td><td>the hostname of the CAS server </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$server_port</em>&nbsp;</td><td>the port the CAS server is running on </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$server_uri</em>&nbsp;</td><td>the URI the CAS server is responding on </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$start_session</em>&nbsp;</td><td>Have <a class="el" href="classphpCAS.html">phpCAS</a> start PHP sessions (default true)</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a newly created <a class="el" href="classCAS__Client.html">CAS_Client</a> object </dd></dl>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__advanced__saml11_8php-example.html#a2">example_advanced_saml11.php</a>, <a class="el" href="example__custom__urls_8php-example.html#a2">example_custom_urls.php</a>, <a class="el" href="example__gateway_8php-example.html#a2">example_gateway.php</a>, <a class="el" href="example__html_8php-example.html#a2">example_html.php</a>, <a class="el" href="example__lang_8php-example.html#a2">example_lang.php</a>, <a class="el" href="example__logout_8php-example.html#a2">example_logout.php</a>, <a class="el" href="example__service_8php-example.html#a2">example_service.php</a>, <a class="el" href="example__service__POST_8php-example.html#a2">example_service_POST.php</a>, and <a class="el" href="example__simple_8php-example.html#a2">example_simple.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00348">348</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga11f7ebc04450414039632feccec5acc0"></a><!-- doxytag: member="phpCAS::proxy" ref="ga11f7ebc04450414039632feccec5acc0" args="($server_version, $server_hostname, $server_port, $server_uri, $start_session=true)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::proxy </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>server_version</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>server_hostname</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>server_port</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>server_uri</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>start_session</em> = <code>true</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p><a class="el" href="classphpCAS.html">phpCAS</a> proxy initializer. </p>
+<dl class="note"><dt><b>Note:</b></dt><dd>Only one of the phpCAS::client() and phpCAS::proxy functions should be called, only once, and before all other methods (except phpCAS::getVersion() and phpCAS::setDebug()).</dd></dl>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$server_version</em>&nbsp;</td><td>the version of the CAS server </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$server_hostname</em>&nbsp;</td><td>the hostname of the CAS server </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$server_port</em>&nbsp;</td><td>the port the CAS server is running on </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$server_uri</em>&nbsp;</td><td>the URI the CAS server is responding on </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$start_session</em>&nbsp;</td><td>Have <a class="el" href="classphpCAS.html">phpCAS</a> start PHP sessions (default true)</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>a newly created <a class="el" href="classCAS__Client.html">CAS_Client</a> object </dd></dl>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__pgt__storage__file_8php-example.html#a2">example_pgt_storage_file.php</a>, <a class="el" href="example__proxy__GET_8php-example.html#a2">example_proxy_GET.php</a>, <a class="el" href="example__proxy__POST_8php-example.html#a2">example_proxy_POST.php</a>, <a class="el" href="example__proxy__serviceWeb_8php-example.html#a2">example_proxy_serviceWeb.php</a>, <a class="el" href="example__proxy__serviceWeb__chaining_8php-example.html#a2">example_proxy_serviceWeb_chaining.php</a>, and <a class="el" href="example__service__that__proxies_8php-example.html#a2">example_service_that_proxies.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00397">397</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicLang.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicLang.html
new file mode 100644
index 00000000..47e848fe
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicLang.html
@@ -0,0 +1,192 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Internationalization</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>Internationalization<br/>
+<small>
+[<a class="el" href="group__publicConfig.html">Configuration</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga5984586a097c0e917dd20363600b110c">PHPCAS_LANG_ENGLISH</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga2625c23a266bd8018ac7ed2dd8bc592c">PHPCAS_LANG_FRENCH</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga2ddaa47b527b9c822787762ae7b8728b">PHPCAS_LANG_GREEK</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga085ffcd2c3dbdeb25d603581c042302f">PHPCAS_LANG_GERMAN</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga5f7de216237ed042d381ee6ec78872fe">PHPCAS_LANG_JAPANESE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga1c9367d17d67e279dd9d0fcfc6b121c4">PHPCAS_LANG_SPANISH</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga06f9fdc1bf4d3f97e8e13baa9fb79876">PHPCAS_LANG_CATALAN</a> </td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicLang.html#ga7eea67859bdfac8e89460a95f5bc961e">phpCAS::setLang</a> ($lang)</td></tr>
+</table>
+<hr/><h2>Enumeration Type Documentation</h2>
+<a class="anchor" id="ga06f9fdc1bf4d3f97e8e13baa9fb79876"></a><!-- doxytag: member="CAS.php::PHPCAS_LANG_CATALAN" ref="ga06f9fdc1bf4d3f97e8e13baa9fb79876" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicLang.html#ga06f9fdc1bf4d3f97e8e13baa9fb79876">PHPCAS_LANG_CATALAN</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00216">216</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga5984586a097c0e917dd20363600b110c"></a><!-- doxytag: member="CAS.php::PHPCAS_LANG_ENGLISH" ref="ga5984586a097c0e917dd20363600b110c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicLang.html#ga5984586a097c0e917dd20363600b110c">PHPCAS_LANG_ENGLISH</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00210">210</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga2625c23a266bd8018ac7ed2dd8bc592c"></a><!-- doxytag: member="CAS.php::PHPCAS_LANG_FRENCH" ref="ga2625c23a266bd8018ac7ed2dd8bc592c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicLang.html#ga2625c23a266bd8018ac7ed2dd8bc592c">PHPCAS_LANG_FRENCH</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00211">211</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga085ffcd2c3dbdeb25d603581c042302f"></a><!-- doxytag: member="CAS.php::PHPCAS_LANG_GERMAN" ref="ga085ffcd2c3dbdeb25d603581c042302f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicLang.html#ga085ffcd2c3dbdeb25d603581c042302f">PHPCAS_LANG_GERMAN</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00213">213</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga2ddaa47b527b9c822787762ae7b8728b"></a><!-- doxytag: member="CAS.php::PHPCAS_LANG_GREEK" ref="ga2ddaa47b527b9c822787762ae7b8728b" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicLang.html#ga2ddaa47b527b9c822787762ae7b8728b">PHPCAS_LANG_GREEK</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00212">212</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga5f7de216237ed042d381ee6ec78872fe"></a><!-- doxytag: member="CAS.php::PHPCAS_LANG_JAPANESE" ref="ga5f7de216237ed042d381ee6ec78872fe" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicLang.html#ga5f7de216237ed042d381ee6ec78872fe">PHPCAS_LANG_JAPANESE</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00214">214</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga1c9367d17d67e279dd9d0fcfc6b121c4"></a><!-- doxytag: member="CAS.php::PHPCAS_LANG_SPANISH" ref="ga1c9367d17d67e279dd9d0fcfc6b121c4" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicLang.html#ga1c9367d17d67e279dd9d0fcfc6b121c4">PHPCAS_LANG_SPANISH</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00215">215</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ga7eea67859bdfac8e89460a95f5bc961e"></a><!-- doxytag: member="phpCAS::setLang" ref="ga7eea67859bdfac8e89460a95f5bc961e" args="($lang)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setLang </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>lang</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to set the language used by <a class="el" href="classphpCAS.html">phpCAS</a>. </p>
+<dl class="note"><dt><b>Note:</b></dt><dd>Can be called only once.</dd></dl>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$lang</em>&nbsp;</td><td>a string representing the language.</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__publicLang.html#ga2625c23a266bd8018ac7ed2dd8bc592c">PHPCAS_LANG_FRENCH</a>, <a class="el" href="group__publicLang.html#ga5984586a097c0e917dd20363600b110c">PHPCAS_LANG_ENGLISH</a> </dd></dl>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__lang_8php-example.html#a7">example_lang.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00630">630</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicOutput.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicOutput.html
new file mode 100644
index 00000000..11069490
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicOutput.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: HTML output</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>HTML output<br/>
+<small>
+[<a class="el" href="group__publicConfig.html">Configuration</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicOutput.html#ga9beb490d4e355f131998f1a73c9d6065">phpCAS::setHTMLHeader</a> ($header)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicOutput.html#ga166cd942019d96ef8b4504f2bfb9effd">phpCAS::setHTMLFooter</a> ($footer)</td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ga166cd942019d96ef8b4504f2bfb9effd"></a><!-- doxytag: member="phpCAS::setHTMLFooter" ref="ga166cd942019d96ef8b4504f2bfb9effd" args="($footer)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setHTMLFooter </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>footer</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method sets the HTML footer used for all outputs.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$footer</em>&nbsp;</td><td>the HTML footer. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__html_8php-example.html#a8">example_html.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00689">689</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga9beb490d4e355f131998f1a73c9d6065"></a><!-- doxytag: member="phpCAS::setHTMLHeader" ref="ga9beb490d4e355f131998f1a73c9d6065" args="($header)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setHTMLHeader </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>header</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method sets the HTML header used for all outputs.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$header</em>&nbsp;</td><td>the HTML header. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__html_8php-example.html#a7">example_html.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00673">673</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicPGTStorage.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicPGTStorage.html
new file mode 100644
index 00000000..3cf5726e
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicPGTStorage.html
@@ -0,0 +1,196 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: PGT storage</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>PGT storage<br/>
+<small>
+[<a class="el" href="group__publicConfig.html">Configuration</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicPGTStorage.html#gaaca9f0a80adfc04e5e274f3b87ea13c4">CAS_PGT_STORAGE_FILE_DEFAULT_PATH</a> </td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicPGTStorage.html#ga66de471cfec81a09a24d482d472706cf">phpCAS::setPGTStorage</a> ($storage)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicPGTStorage.html#ga10e7b70f0634dc65bb19db50f3cc847b">phpCAS::setPGTStorageDb</a> ($dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicPGTStorage.html#gafad174fa82241a2d6aef2d7be15fa387">phpCAS::setPGTStorageFile</a> ($format= '', $path= '')</td></tr>
+</table>
+<hr/><h2>Enumeration Type Documentation</h2>
+<a class="anchor" id="gaaca9f0a80adfc04e5e274f3b87ea13c4"></a><!-- doxytag: member="CAS.php::CAS_PGT_STORAGE_FILE_DEFAULT_PATH" ref="gaaca9f0a80adfc04e5e274f3b87ea13c4" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicPGTStorage.html#gaaca9f0a80adfc04e5e274f3b87ea13c4">CAS_PGT_STORAGE_FILE_DEFAULT_PATH</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Default path used when storing PGT's to file </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00150">150</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="ga66de471cfec81a09a24d482d472706cf"></a><!-- doxytag: member="phpCAS::setPGTStorage" ref="ga66de471cfec81a09a24d482d472706cf" args="($storage)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setPGTStorage </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>storage</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method can be used to set a custom PGT storage object.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$storage</em>&nbsp;</td><td>a PGT storage object that inherits from the CAS_PGTStorage class </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00714">714</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga10e7b70f0634dc65bb19db50f3cc847b"></a><!-- doxytag: member="phpCAS::setPGTStorageDb" ref="ga10e7b70f0634dc65bb19db50f3cc847b" args="($dsn_or_pdo, $username='', $password='', $table='', $driver_options=null)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setPGTStorageDb </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>dsn_or_pdo</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>username</em> = <code>''</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>password</em> = <code>''</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>table</em> = <code>''</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>driver_options</em> = <code>null</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to tell <a class="el" href="classphpCAS.html">phpCAS</a> to store the response of the CAS server to PGT requests in a database.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$dsn_or_pdo</em>&nbsp;</td><td>a dsn string to use for creating a PDO object or a PDO object </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$username</em>&nbsp;</td><td>the username to use when connecting to the database </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$password</em>&nbsp;</td><td>the password to use when connecting to the database </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$table</em>&nbsp;</td><td>the table to use for storing and retrieving PGT's </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$driver_options</em>&nbsp;</td><td>any driver options to use when connecting to the database </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00744">744</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gafad174fa82241a2d6aef2d7be15fa387"></a><!-- doxytag: member="phpCAS::setPGTStorageFile" ref="gafad174fa82241a2d6aef2d7be15fa387" args="($format= '', $path= '')" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::setPGTStorageFile </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>format</em> = <code>''</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>path</em> = <code>''</code></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to tell <a class="el" href="classphpCAS.html">phpCAS</a> to store the response of the CAS server to PGT requests onto the filesystem. </p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$format</em>&nbsp;</td><td>the format used to store the PGT's. This parameter has no effect and is only for backwards compatibility </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$path</em>&nbsp;</td><td>the path where the PGT's should be stored </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl><dt><b>Examples: </b></dt><dd><a class="el" href="example__pgt__storage__file_8php-example.html#a7">example_pgt_storage_file.php</a>.</dd>
+</dl>
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00776">776</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicServices.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicServices.html
new file mode 100644
index 00000000..70fbc2c9
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/group__publicServices.html
@@ -0,0 +1,376 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Access to external services</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#enum-members">Enumerations</a> &#124;
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<h1>Access to external services<br/>
+<small>
+[<a class="el" href="group__public.html">User interface</a>]</small>
+</h1>  </div>
+</div>
+<div class="contents">
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga30974f0204d0c1e9cf8b0807a1a1a55e">PHPCAS_SERVICE_OK</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga7de1d5537c1fa74b4a180d94dc165c37">PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#gab8fd1de27f50f53dac55bf1287ad0e70">PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga63639adfb3fdbe13a1708e4823380b4d">PHPCAS_SERVICE_PT_FAILURE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#gac745d5b4a48841c8111cbc443fa57211">PHPCAS_SERVICE_NOT_AVAILABLE</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga801276ad2c3f6bd1ff8c953891f3693a">PHPCAS_PROXIED_SERVICE_HTTP_GET</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#gaf6e2ec1349ecbe7d039df99ca450dd18">PHPCAS_PROXIED_SERVICE_HTTP_POST</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga78c77beb2a5e39f1cf7a42b547dad39c">PHPCAS_PROXIED_SERVICE_IMAP</a> </td></tr>
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#gaf3de7e9db40d6b15b6c8cb8dc8cb42eb">phpCAS::getProxiedService</a> ($type)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga36fd2939c6bb0d45567512de80994569">phpCAS::initializeProxiedService</a> (<a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a> $proxiedService)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga11e980f85bd420a42672148e9f1f8d82">phpCAS::serviceWeb</a> ($url, &amp;$err_code, &amp;$output)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__publicServices.html#ga700b64756f9a83b13365dc79ccd5e9ac">phpCAS::serviceMail</a> ($url, $service, $flags, &amp;$err_code, &amp;$err_msg, &amp;$pt)</td></tr>
+</table>
+<hr/><h2>Enumeration Type Documentation</h2>
+<a class="anchor" id="ga801276ad2c3f6bd1ff8c953891f3693a"></a><!-- doxytag: member="CAS.php::PHPCAS_PROXIED_SERVICE_HTTP_GET" ref="ga801276ad2c3f6bd1ff8c953891f3693a" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicServices.html#ga801276ad2c3f6bd1ff8c953891f3693a">PHPCAS_PROXIED_SERVICE_HTTP_GET</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>phpCAS::getProxiedService() type for HTTP GET </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00190">190</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gaf6e2ec1349ecbe7d039df99ca450dd18"></a><!-- doxytag: member="CAS.php::PHPCAS_PROXIED_SERVICE_HTTP_POST" ref="gaf6e2ec1349ecbe7d039df99ca450dd18" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicServices.html#gaf6e2ec1349ecbe7d039df99ca450dd18">PHPCAS_PROXIED_SERVICE_HTTP_POST</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>phpCAS::getProxiedService() type for HTTP POST </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00194">194</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga78c77beb2a5e39f1cf7a42b547dad39c"></a><!-- doxytag: member="CAS.php::PHPCAS_PROXIED_SERVICE_IMAP" ref="ga78c77beb2a5e39f1cf7a42b547dad39c" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicServices.html#ga78c77beb2a5e39f1cf7a42b547dad39c">PHPCAS_PROXIED_SERVICE_IMAP</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>phpCAS::getProxiedService() type for IMAP </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00198">198</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gac745d5b4a48841c8111cbc443fa57211"></a><!-- doxytag: member="CAS.php::PHPCAS_SERVICE_NOT_AVAILABLE" ref="gac745d5b4a48841c8111cbc443fa57211" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicServices.html#gac745d5b4a48841c8111cbc443fa57211">PHPCAS_SERVICE_NOT_AVAILABLE</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>phpCAS::service() error code when the service was not available. </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00182">182</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga30974f0204d0c1e9cf8b0807a1a1a55e"></a><!-- doxytag: member="CAS.php::PHPCAS_SERVICE_OK" ref="ga30974f0204d0c1e9cf8b0807a1a1a55e" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicServices.html#ga30974f0204d0c1e9cf8b0807a1a1a55e">PHPCAS_SERVICE_OK</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>phpCAS::service() error code on success </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00163">163</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="gab8fd1de27f50f53dac55bf1287ad0e70"></a><!-- doxytag: member="CAS.php::PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE" ref="gab8fd1de27f50f53dac55bf1287ad0e70" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicServices.html#gab8fd1de27f50f53dac55bf1287ad0e70">PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>phpCAS::service() error code when the PT could not retrieve because the response of the CAS server was ill-formed. </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00173">173</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga63639adfb3fdbe13a1708e4823380b4d"></a><!-- doxytag: member="CAS.php::PHPCAS_SERVICE_PT_FAILURE" ref="ga63639adfb3fdbe13a1708e4823380b4d" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicServices.html#ga63639adfb3fdbe13a1708e4823380b4d">PHPCAS_SERVICE_PT_FAILURE</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>phpCAS::service() error code when the PT could not retrieve because the CAS server did not want to. </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00178">178</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga7de1d5537c1fa74b4a180d94dc165c37"></a><!-- doxytag: member="CAS.php::PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE" ref="ga7de1d5537c1fa74b4a180d94dc165c37" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="group__publicServices.html#ga7de1d5537c1fa74b4a180d94dc165c37">PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>phpCAS::service() error code when the PT could not retrieve because the CAS server did not respond. </p>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00168">168</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+</div>
+</div>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="gaf3de7e9db40d6b15b6c8cb8dc8cb42eb"></a><!-- doxytag: member="phpCAS::getProxiedService" ref="gaf3de7e9db40d6b15b6c8cb8dc8cb42eb" args="($type)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::getProxiedService </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>type</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer a proxy-authenticated service handler.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$type The service type. One of: PHPCAS_PROXIED_SERVICE_HTTP_GET PHPCAS_PROXIED_SERVICE_HTTP_POST PHPCAS_PROXIED_SERVICE_IMAP</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a> </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>InvalidArgumentException</em>&nbsp;</td><td>If the service type is unknown. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00820">820</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga36fd2939c6bb0d45567512de80994569"></a><!-- doxytag: member="phpCAS::initializeProxiedService" ref="ga36fd2939c6bb0d45567512de80994569" args="(CAS_ProxiedService $proxiedService)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::initializeProxiedService </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a> $&nbsp;</td>
+          <td class="paramname"> <em>proxiedService</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Initialize a proxied-service handler with the proxy-ticket it should use.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></em>&nbsp;</td><td>$proxiedService </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a></em>&nbsp;</td><td>If there is a proxy-ticket failure. The code of the Exception will be one of: PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE PHPCAS_SERVICE_PT_FAILURE </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00857">857</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>.</p>
+
+<p>Referenced by <a class="el" href="Abstract_8php_source.html#l00113">CAS_ProxiedService_Abstract::initializeProxyTicket()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga700b64756f9a83b13365dc79ccd5e9ac"></a><!-- doxytag: member="phpCAS::serviceMail" ref="ga700b64756f9a83b13365dc79ccd5e9ac" args="($url, $service, $flags, &amp;$err_code, &amp;$err_msg, &amp;$pt)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::serviceMail </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>service</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>flags</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>err_code</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>err_msg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>pt</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to access an IMAP/POP3/NNTP service.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>a string giving the URL of the service, including the mailing box for IMAP URLs, as accepted by imap_open(). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$service</em>&nbsp;</td><td>a string giving for CAS retrieve Proxy ticket </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$flags</em>&nbsp;</td><td>options given to imap_open(). </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$err_code</em>&nbsp;</td><td>an error code Possible values are PHPCAS_SERVICE_OK (on success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE, PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT_AVAILABLE. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$err_msg</em>&nbsp;</td><td>an error message on failure </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$pt</em>&nbsp;</td><td>the Proxy Ticket (PT) retrieved from the CAS server to access the URL on success, FALSE on error).</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>an IMAP stream on success, FALSE otherwise (in this later case, $err_code gives the reason why it failed and $err_msg contains an error message). </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00932">932</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ga11e980f85bd420a42672148e9f1f8d82"></a><!-- doxytag: member="phpCAS::serviceWeb" ref="ga11e980f85bd420a42672148e9f1f8d82" args="($url, &amp;$err_code, &amp;$output)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static phpCAS::serviceWeb </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>err_code</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">&amp;$&nbsp;</td>
+          <td class="paramname"> <em>output</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td><code> [static, inherited]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This method is used to access an HTTP[S] service.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>$url</em>&nbsp;</td><td>the service to access. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$err_code</em>&nbsp;</td><td>an error code Possible values are PHPCAS_SERVICE_OK (on success), PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE, PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_NOT_AVAILABLE. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>$output</em>&nbsp;</td><td>the output of the service (also used to give an error message on failure).</td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>TRUE on success, FALSE otherwise (in this later case, $err_code gives the reason why it failed and $output contains an error message). </dd></dl>
+
+<p>Definition at line <a class="el" href="CAS_8php_source.html#l00889">889</a> of file <a class="el" href="CAS_8php_source.html">CAS.php</a>.</p>
+
+<p>References <a class="el" href="CAS_8php_source.html#l00513">phpCAS::error()</a>, <a class="el" href="CAS_8php_source.html#l00546">phpCAS::traceBegin()</a>, and <a class="el" href="CAS_8php_source.html#l00585">phpCAS::traceEnd()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/hierarchy.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/hierarchy.html
new file mode 100644
index 00000000..81bc17c2
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/hierarchy.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Hierarchical Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li class="current"><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Class Hierarchy</h1>  </div>
+</div>
+<div class="contents">
+This inheritance list is sorted roughly, but not completely, alphabetically:<ul>
+<li><a class="el" href="classCAS__Client.html">CAS_Client</a></li>
+<li><a class="el" href="classCAS__CookieJar.html">CAS_CookieJar</a></li>
+<li><a class="el" href="interfaceCAS__Exception.html">CAS_Exception</a><ul>
+<li><a class="el" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a></li>
+<li><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></li>
+<li><a class="el" href="classCAS__ProxiedService__Exception.html">CAS_ProxiedService_Exception</a></li>
+<li><a class="el" href="classCAS__ProxyTicketException.html">CAS_ProxyTicketException</a></li>
+<li><a class="el" href="classCAS__Request__Exception.html">CAS_Request_Exception</a></li>
+</ul>
+</li>
+<li><a class="el" href="classCAS__PGTStorage__AbstractStorage.html">CAS_PGTStorage_AbstractStorage</a><ul>
+<li><a class="el" href="classCAS__PGTStorage__Db.html">CAS_PGTStorage_Db</a></li>
+<li><a class="el" href="classCAS__PGTStorage__File.html">CAS_PGTStorage_File</a></li>
+</ul>
+</li>
+<li><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a><ul>
+<li><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a><ul>
+<li><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a><ul>
+<li><a class="el" href="classCAS__ProxiedService__Http__Get.html">CAS_ProxiedService_Http_Get</a></li>
+<li><a class="el" href="classCAS__ProxiedService__Http__Post.html">CAS_ProxiedService_Http_Post</a></li>
+</ul>
+</li>
+<li><a class="el" href="classCAS__ProxiedService__Imap.html">CAS_ProxiedService_Imap</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="el" href="interfaceCAS__ProxiedService__Http.html">CAS_ProxiedService_Http</a><ul>
+<li><a class="el" href="classCAS__ProxiedService__Http__Abstract.html">CAS_ProxiedService_Http_Abstract</a></li>
+</ul>
+</li>
+<li><a class="el" href="interfaceCAS__ProxiedService__Testable.html">CAS_ProxiedService_Testable</a><ul>
+<li><a class="el" href="classCAS__ProxiedService__Abstract.html">CAS_ProxiedService_Abstract</a></li>
+</ul>
+</li>
+<li><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a><ul>
+<li><a class="el" href="classCAS__AbstractRequest.html">CAS_AbstractRequest</a><ul>
+<li><a class="el" href="classCAS__CurlRequest.html">CAS_CurlRequest</a></li>
+</ul>
+</li>
+<li><a class="el" href="classCAS__CurlRequest.html">CAS_CurlRequest</a></li>
+</ul>
+</li>
+<li><a class="el" href="classphpCAS.html">phpCAS</a></li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/index.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/index.html
new file mode 100644
index 00000000..f264c2c6
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/index.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Main Page</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li class="current"><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>phpCAS Documentation</h1>  </div>
+</div>
+<div class="contents">
+<h3 class="version">version 1.2.2 </h3><p>The following pages only show the source documentation. </p>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__Exception.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__Exception.html
new file mode 100644
index 00000000..73ef4904
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__Exception.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_Exception Interface Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_Exception Interface Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_Exception" --><div class="dynheader">
+Inheritance diagram for CAS_Exception:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="interfaceCAS__Exception.png" usemap="#CAS_Exception_map" alt=""/>
+  <map id="CAS_Exception_map" name="CAS_Exception_map">
+<area href="classCAS__InvalidArgumentException.html" alt="CAS_InvalidArgumentException" shape="rect" coords="0,56,194,80"/>
+<area href="classCAS__OutOfSequenceException.html" alt="CAS_OutOfSequenceException" shape="rect" coords="204,56,398,80"/>
+<area href="classCAS__ProxiedService__Exception.html" alt="CAS_ProxiedService_Exception" shape="rect" coords="408,56,602,80"/>
+<area href="classCAS__ProxyTicketException.html" alt="CAS_ProxyTicketException" shape="rect" coords="612,56,806,80"/>
+<area href="classCAS__Request__Exception.html" alt="CAS_Request_Exception" shape="rect" coords="816,56,1010,80"/>
+</map>
+</div>
+<table class="memberdecls">
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>A root exception interface for all exceptions in <a class="el" href="classphpCAS.html">phpCAS</a>.</p>
+<p>All exceptions thrown in <a class="el" href="classphpCAS.html">phpCAS</a> should implement this interface to allow them to be caught as a category by clients. Each <a class="el" href="classphpCAS.html">phpCAS</a> exception should extend an appropriate SPL exception class that best fits its type.</p>
+<p>For example, an InvalidArgumentException in <a class="el" href="classphpCAS.html">phpCAS</a> should be defined as</p>
+<p>class <a class="el" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a> extends InvalidArgumentException implements <a class="el" href="interfaceCAS__Exception.html">CAS_Exception</a> { }</p>
+<p>This definition allows the <a class="el" href="classCAS__InvalidArgumentException.html">CAS_InvalidArgumentException</a> to be caught as either an InvalidArgumentException or as a <a class="el" href="interfaceCAS__Exception.html">CAS_Exception</a>. </p>
+
+<p>Definition at line <a class="el" href="Exception_8php_source.html#l00049">49</a> of file <a class="el" href="Exception_8php_source.html">Exception.php</a>.</p>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__Exception.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__Exception.png
new file mode 100644
index 00000000..408c0db3
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__Exception.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService-members.html
new file mode 100644
index 00000000..fd49c89c
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService-members.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_ProxiedService Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService.html#a60e1ce4d0228964a02f8747466011600">getServiceUrl</a>()</td><td><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService.html#aca7cf518dffecf31b2a311a9b80589e4">setProxyTicket</a>($proxyTicket)</td><td><a class="el" href="interfaceCAS__ProxiedService.html">CAS_ProxiedService</a></td><td></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService.html
new file mode 100644
index 00000000..99d007db
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_ProxiedService Interface Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>CAS_ProxiedService Interface Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_ProxiedService" --><div class="dynheader">
+Inheritance diagram for CAS_ProxiedService:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="interfaceCAS__ProxiedService.png" usemap="#CAS_ProxiedService_map" alt=""/>
+  <map id="CAS_ProxiedService_map" name="CAS_ProxiedService_map">
+<area href="classCAS__ProxiedService__Abstract.html" alt="CAS_ProxiedService_Abstract" shape="rect" coords="225,56,440,80"/>
+<area href="classCAS__ProxiedService__Http__Abstract.html" alt="CAS_ProxiedService_Http_Abstract" shape="rect" coords="112,112,327,136"/>
+<area href="classCAS__ProxiedService__Imap.html" alt="CAS_ProxiedService_Imap" shape="rect" coords="337,112,552,136"/>
+<area href="classCAS__ProxiedService__Http__Get.html" alt="CAS_ProxiedService_Http_Get" shape="rect" coords="0,168,215,192"/>
+<area href="classCAS__ProxiedService__Http__Post.html" alt="CAS_ProxiedService_Http_Post" shape="rect" coords="225,168,440,192"/>
+</map>
+</div>
+
+<p><a href="interfaceCAS__ProxiedService-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__ProxiedService.html#a60e1ce4d0228964a02f8747466011600">getServiceUrl</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__ProxiedService.html#aca7cf518dffecf31b2a311a9b80589e4">setProxyTicket</a> ($proxyTicket)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>This interface defines methods that allow proxy-authenticated service handlers to interact with <a class="el" href="classphpCAS.html">phpCAS</a>.</p>
+<p>Proxy service handlers must implement this interface as well as call phpCAS::initializeProxiedService($this) at some point in their implementation.</p>
+<p>While not required, proxy-authenticated service handlers are encouraged to implement the <a class="el" href="interfaceCAS__ProxiedService__Testable.html">CAS_ProxiedService_Testable</a> interface to facilitate unit testing. </p>
+
+<p>Definition at line <a class="el" href="ProxiedService_8php_source.html#l00041">41</a> of file <a class="el" href="ProxiedService_8php_source.html">ProxiedService.php</a>.</p>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a60e1ce4d0228964a02f8747466011600"></a><!-- doxytag: member="CAS_ProxiedService::getServiceUrl" ref="a60e1ce4d0228964a02f8747466011600" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService::getServiceUrl </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer a service identifier (URL) for whom we should fetch a proxy ticket.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>string </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>Exception</em>&nbsp;</td><td>If no service url is available. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l02394">CAS_Client::initializeProxiedService()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aca7cf518dffecf31b2a311a9b80589e4"></a><!-- doxytag: member="CAS_ProxiedService::setProxyTicket" ref="aca7cf518dffecf31b2a311a9b80589e4" args="($proxyTicket)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService::setProxyTicket </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>proxyTicket</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Register a proxy ticket with the ProxiedService that it can use when making requests.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$proxyTicket </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>InvalidArgumentException</em>&nbsp;</td><td>If the $proxyTicket is invalid. </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after a proxy ticket has already been initialized/set. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="Client_8php_source.html#l02394">CAS_Client::initializeProxiedService()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService.png
new file mode 100644
index 00000000..e0747c59
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Http-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Http-members.html
new file mode 100644
index 00000000..a8ec45c8
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Http-members.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Http Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="interfaceCAS__ProxiedService__Http.html">CAS_ProxiedService_Http</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService__Http.html#a492aa219ade6a93a56011108f80c452c">getResponseBody</a>()</td><td><a class="el" href="interfaceCAS__ProxiedService__Http.html">CAS_ProxiedService_Http</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService__Http.html#abb17d77f4a62879a71ddc8c5dc38f679">getResponseHeaders</a>()</td><td><a class="el" href="interfaceCAS__ProxiedService__Http.html">CAS_ProxiedService_Http</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService__Http.html#a424660c77d00a62c03c0c3c25aeeeb6a">send</a>()</td><td><a class="el" href="interfaceCAS__ProxiedService__Http.html">CAS_ProxiedService_Http</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService__Http.html#a6bd6113c6e47a143756b6267aa77928b">setUrl</a>($url)</td><td><a class="el" href="interfaceCAS__ProxiedService__Http.html">CAS_ProxiedService_Http</a></td><td></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Http.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Http.html
new file mode 100644
index 00000000..e963a743
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Http.html
@@ -0,0 +1,183 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_ProxiedService_Http Interface Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Http Interface Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_ProxiedService_Http" --><div class="dynheader">
+Inheritance diagram for CAS_ProxiedService_Http:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="interfaceCAS__ProxiedService__Http.png" usemap="#CAS_ProxiedService_Http_map" alt=""/>
+  <map id="CAS_ProxiedService_Http_map" name="CAS_ProxiedService_Http_map">
+<area href="classCAS__ProxiedService__Http__Abstract.html" alt="CAS_ProxiedService_Http_Abstract" shape="rect" coords="112,56,327,80"/>
+<area href="classCAS__ProxiedService__Http__Get.html" alt="CAS_ProxiedService_Http_Get" shape="rect" coords="0,112,215,136"/>
+<area href="classCAS__ProxiedService__Http__Post.html" alt="CAS_ProxiedService_Http_Post" shape="rect" coords="225,112,440,136"/>
+</map>
+</div>
+
+<p><a href="interfaceCAS__ProxiedService__Http-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__ProxiedService__Http.html#a6bd6113c6e47a143756b6267aa77928b">setUrl</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__ProxiedService__Http.html#a424660c77d00a62c03c0c3c25aeeeb6a">send</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__ProxiedService__Http.html#abb17d77f4a62879a71ddc8c5dc38f679">getResponseHeaders</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__ProxiedService__Http.html#a492aa219ade6a93a56011108f80c452c">getResponseBody</a> ()</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>This interface defines methods that clients should use for configuring, sending, and receiving proxied HTTP requests. </p>
+
+<p>Definition at line <a class="el" href="Http_8php_source.html#l00035">35</a> of file <a class="el" href="Http_8php_source.html">Http.php</a>.</p>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a492aa219ade6a93a56011108f80c452c"></a><!-- doxytag: member="CAS_ProxiedService_Http::getResponseBody" ref="a492aa219ade6a93a56011108f80c452c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http::getResponseBody </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer the body of response.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>string </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#aebc91e27fc543255ec29ed274fc2cd02">CAS_ProxiedService_Http_Abstract</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abb17d77f4a62879a71ddc8c5dc38f679"></a><!-- doxytag: member="CAS_ProxiedService_Http::getResponseHeaders" ref="abb17d77f4a62879a71ddc8c5dc38f679" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http::getResponseHeaders </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer the headers of the response.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>array An array of header strings. </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a400962d54b27e83597583ab96e25910c">CAS_ProxiedService_Http_Abstract</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a424660c77d00a62c03c0c3c25aeeeb6a"></a><!-- doxytag: member="CAS_ProxiedService_Http::send" ref="a424660c77d00a62c03c0c3c25aeeeb6a" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http::send </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Perform the request.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>boolean TRUE on success, FALSE on failure. </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called multiple times. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a27175aea106f5ae5bc8461f6ac4c1fc6">CAS_ProxiedService_Http_Abstract</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6bd6113c6e47a143756b6267aa77928b"></a><!-- doxytag: member="CAS_ProxiedService_Http::setUrl" ref="a6bd6113c6e47a143756b6267aa77928b" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Http::setUrl </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the URL of the Request</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$url </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__ProxiedService__Http__Abstract.html#a660204c7162343fc9878cd95b15a7273">CAS_ProxiedService_Http_Abstract</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Http.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Http.png
new file mode 100644
index 00000000..782daa3e
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Http.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Testable-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Testable-members.html
new file mode 100644
index 00000000..af1573a7
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Testable-members.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Testable Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="interfaceCAS__ProxiedService__Testable.html">CAS_ProxiedService_Testable</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__ProxiedService__Testable.html#ad5f7b693a160d64f36abf91ccf9cece9">setCasClient</a>(CAS_Client $casClient)</td><td><a class="el" href="interfaceCAS__ProxiedService__Testable.html">CAS_ProxiedService_Testable</a></td><td></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Testable.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Testable.html
new file mode 100644
index 00000000..21ef71a9
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Testable.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_ProxiedService_Testable Interface Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>CAS_ProxiedService_Testable Interface Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_ProxiedService_Testable" --><div class="dynheader">
+Inheritance diagram for CAS_ProxiedService_Testable:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="interfaceCAS__ProxiedService__Testable.png" usemap="#CAS_ProxiedService_Testable_map" alt=""/>
+  <map id="CAS_ProxiedService_Testable_map" name="CAS_ProxiedService_Testable_map">
+<area href="classCAS__ProxiedService__Abstract.html" alt="CAS_ProxiedService_Abstract" shape="rect" coords="225,56,440,80"/>
+<area href="classCAS__ProxiedService__Http__Abstract.html" alt="CAS_ProxiedService_Http_Abstract" shape="rect" coords="112,112,327,136"/>
+<area href="classCAS__ProxiedService__Imap.html" alt="CAS_ProxiedService_Imap" shape="rect" coords="337,112,552,136"/>
+<area href="classCAS__ProxiedService__Http__Get.html" alt="CAS_ProxiedService_Http_Get" shape="rect" coords="0,168,215,192"/>
+<area href="classCAS__ProxiedService__Http__Post.html" alt="CAS_ProxiedService_Http_Post" shape="rect" coords="225,168,440,192"/>
+</map>
+</div>
+
+<p><a href="interfaceCAS__ProxiedService__Testable-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__ProxiedService__Testable.html#ad5f7b693a160d64f36abf91ccf9cece9">setCasClient</a> (<a class="el" href="classCAS__Client.html">CAS_Client</a> $casClient)</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>This interface defines methods that allow proxy-authenticated service handlers to be tested in unit tests.</p>
+<p>Classes implementing this interface SHOULD store the <a class="el" href="classCAS__Client.html">CAS_Client</a> passed and initialize themselves with that client rather than via the static <a class="el" href="classphpCAS.html">phpCAS</a> method. For example:</p>
+<p>/ ** * Fetch our proxy ticket. * / protected function initializeProxyTicket() { // Allow usage of a particular <a class="el" href="classCAS__Client.html">CAS_Client</a> for unit testing. if (is_null($this-&gt;casClient)) phpCAS::initializeProxiedService($this); else $this-&gt;casClient-&gt;initializeProxiedService($this); } </p>
+
+<p>Definition at line <a class="el" href="Testable_8php_source.html#l00050">50</a> of file <a class="el" href="Testable_8php_source.html">Testable.php</a>.</p>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="ad5f7b693a160d64f36abf91ccf9cece9"></a><!-- doxytag: member="CAS_ProxiedService_Testable::setCasClient" ref="ad5f7b693a160d64f36abf91ccf9cece9" args="(CAS_Client $casClient)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_ProxiedService_Testable::setCasClient </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="classCAS__Client.html">CAS_Client</a> $&nbsp;</td>
+          <td class="paramname"> <em>casClient</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Use a particular CAS_Client-&gt;initializeProxiedService() rather than the static phpCAS::initializeProxiedService().</p>
+<p>This method should not be called in standard operation, but is needed for unit testing.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__Client.html">CAS_Client</a></em>&nbsp;</td><td>$casClient </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after a proxy ticket has already been initialized/set. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__ProxiedService__Abstract.html#a8287e46abc27c66a92f3c5162b586310">CAS_ProxiedService_Abstract</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Testable.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Testable.png
new file mode 100644
index 00000000..582a85b2
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__ProxiedService__Testable.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__RequestInterface-members.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__RequestInterface-members.html
new file mode 100644
index 00000000..44f12f2d
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__RequestInterface-members.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS_RequestInterface Member List</h1>  </div>
+</div>
+<div class="contents">
+This is the complete list of members for <a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a>, including all inherited members.<table>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__RequestInterface.html#a9e0bbff9f3e6c5ffed093a19badff849">addCookie</a>($name, $value)</td><td><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__RequestInterface.html#ad11ecc76349ac2921f927451d89b2059">addCookies</a>(array $cookies)</td><td><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__RequestInterface.html#a01f51e770a063eb289ac12c03a5346e6">addHeader</a>($header)</td><td><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__RequestInterface.html#a1c2daa885fd39fce99cfd99837669132">addHeaders</a>(array $headers)</td><td><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__RequestInterface.html#a1cc14181f19677291c1d4f0201b5e391">getErrorMessage</a>()</td><td><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__RequestInterface.html#a78155f887fad699fd34259e33093fca0">getResponseBody</a>()</td><td><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__RequestInterface.html#a5e458c85b176e914a280488fe4287993">getResponseHeaders</a>()</td><td><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__RequestInterface.html#afaabea191fa4715fc2b13372d82830cd">getResponseStatusCode</a>()</td><td><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__RequestInterface.html#abc0658bec27d70286f12712944229e9b">makePost</a>()</td><td><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__RequestInterface.html#a848d1e939e5ff94aeb49ec8fff49f712">send</a>()</td><td><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__RequestInterface.html#aab89b06410e705f16528f8883bb8f496">setPostBody</a>($body)</td><td><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__RequestInterface.html#abad222cd355bfaa207bcb26675147f1e">setSslCaCert</a>($caCertPath)</td><td><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="interfaceCAS__RequestInterface.html#ae5fc480f05a815f035574619df9915de">setUrl</a>($url)</td><td><a class="el" href="interfaceCAS__RequestInterface.html">CAS_RequestInterface</a></td><td></td></tr>
+</table></div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__RequestInterface.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__RequestInterface.html
new file mode 100644
index 00000000..cb5fab74
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__RequestInterface.html
@@ -0,0 +1,493 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS_RequestInterface Interface Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
+      <li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
+      <li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#pub-methods">Public Member Functions</a>  </div>
+  <div class="headertitle">
+<h1>CAS_RequestInterface Interface Reference</h1>  </div>
+</div>
+<div class="contents">
+<!-- doxytag: class="CAS_RequestInterface" --><div class="dynheader">
+Inheritance diagram for CAS_RequestInterface:</div>
+<div class="dyncontent">
+ <div class="center">
+  <img src="interfaceCAS__RequestInterface.png" usemap="#CAS_RequestInterface_map" alt=""/>
+  <map id="CAS_RequestInterface_map" name="CAS_RequestInterface_map">
+<area href="classCAS__AbstractRequest.html" alt="CAS_AbstractRequest" shape="rect" coords="0,56,139,80"/>
+<area href="classCAS__CurlRequest.html" alt="CAS_CurlRequest" shape="rect" coords="149,56,288,80"/>
+<area href="classCAS__CurlRequest.html" alt="CAS_CurlRequest" shape="rect" coords="0,112,139,136"/>
+</map>
+</div>
+
+<p><a href="interfaceCAS__RequestInterface-members.html">List of all members.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__RequestInterface.html#ae5fc480f05a815f035574619df9915de">setUrl</a> ($url)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__RequestInterface.html#a9e0bbff9f3e6c5ffed093a19badff849">addCookie</a> ($name, $value)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__RequestInterface.html#ad11ecc76349ac2921f927451d89b2059">addCookies</a> (array $cookies)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__RequestInterface.html#a01f51e770a063eb289ac12c03a5346e6">addHeader</a> ($header)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__RequestInterface.html#a1c2daa885fd39fce99cfd99837669132">addHeaders</a> (array $headers)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__RequestInterface.html#abc0658bec27d70286f12712944229e9b">makePost</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__RequestInterface.html#aab89b06410e705f16528f8883bb8f496">setPostBody</a> ($body)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__RequestInterface.html#abad222cd355bfaa207bcb26675147f1e">setSslCaCert</a> ($caCertPath)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__RequestInterface.html#a848d1e939e5ff94aeb49ec8fff49f712">send</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__RequestInterface.html#a5e458c85b176e914a280488fe4287993">getResponseHeaders</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__RequestInterface.html#afaabea191fa4715fc2b13372d82830cd">getResponseStatusCode</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__RequestInterface.html#a78155f887fad699fd34259e33093fca0">getResponseBody</a> ()</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceCAS__RequestInterface.html#a1cc14181f19677291c1d4f0201b5e391">getErrorMessage</a> ()</td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>This interface defines a class library for performing web requests. </p>
+
+<p>Definition at line <a class="el" href="RequestInterface_8php_source.html#l00034">34</a> of file <a class="el" href="RequestInterface_8php_source.html">RequestInterface.php</a>.</p>
+<hr/><h2>Member Function Documentation</h2>
+<a class="anchor" id="a9e0bbff9f3e6c5ffed093a19badff849"></a><!-- doxytag: member="CAS_RequestInterface::addCookie" ref="a9e0bbff9f3e6c5ffed093a19badff849" args="($name, $value)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_RequestInterface::addCookie </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>value</em></td><td>&nbsp;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add a cookie to the request.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$name </td></tr>
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$value </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__AbstractRequest.html#a2e29d483c57f1046e23571507a45d5f3">CAS_AbstractRequest</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad11ecc76349ac2921f927451d89b2059"></a><!-- doxytag: member="CAS_RequestInterface::addCookies" ref="ad11ecc76349ac2921f927451d89b2059" args="(array $cookies)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_RequestInterface::addCookies </td>
+          <td>(</td>
+          <td class="paramtype">array $&nbsp;</td>
+          <td class="paramname"> <em>cookies</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add an array of cookies to the request. The cookie array is of the form array('cookie_name' =&gt; 'cookie_value', 'cookie_name2' =&gt; cookie_value2')</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>array</em>&nbsp;</td><td>$cookies </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__AbstractRequest.html#a6e8e852978e024cbf7ace013305fa189">CAS_AbstractRequest</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a01f51e770a063eb289ac12c03a5346e6"></a><!-- doxytag: member="CAS_RequestInterface::addHeader" ref="a01f51e770a063eb289ac12c03a5346e6" args="($header)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_RequestInterface::addHeader </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>header</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add a header string to the request.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$header </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__AbstractRequest.html#adae53ccc81ddd2cb2fbeceba12fcb5d6">CAS_AbstractRequest</a>.</p>
+
+<p>Referenced by <a class="el" href="Post_8php_source.html#l00120">CAS_ProxiedService_Http_Post::populateRequest()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1c2daa885fd39fce99cfd99837669132"></a><!-- doxytag: member="CAS_RequestInterface::addHeaders" ref="a1c2daa885fd39fce99cfd99837669132" args="(array $headers)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_RequestInterface::addHeaders </td>
+          <td>(</td>
+          <td class="paramtype">array $&nbsp;</td>
+          <td class="paramname"> <em>headers</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add an array of header strings to the request.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>array</em>&nbsp;</td><td>$headers </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__AbstractRequest.html#ab21afb8f694810cbc7f6111005f39e40">CAS_AbstractRequest</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1cc14181f19677291c1d4f0201b5e391"></a><!-- doxytag: member="CAS_RequestInterface::getErrorMessage" ref="a1cc14181f19677291c1d4f0201b5e391" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_RequestInterface::getErrorMessage </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer a message describing any errors if the request failed.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>string </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__AbstractRequest.html#a2ef7ce228560085d1897b9283389a524">CAS_AbstractRequest</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a78155f887fad699fd34259e33093fca0"></a><!-- doxytag: member="CAS_RequestInterface::getResponseBody" ref="a78155f887fad699fd34259e33093fca0" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_RequestInterface::getResponseBody </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer the body of response.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>string </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__AbstractRequest.html#a6eadacb1d96591a8f3c45175754d10c5">CAS_AbstractRequest</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5e458c85b176e914a280488fe4287993"></a><!-- doxytag: member="CAS_RequestInterface::getResponseHeaders" ref="a5e458c85b176e914a280488fe4287993" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_RequestInterface::getResponseHeaders </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer the headers of the response.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>array An array of header strings. </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__AbstractRequest.html#a3004eb18cf732bb9a79b7a26b765147b">CAS_AbstractRequest</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afaabea191fa4715fc2b13372d82830cd"></a><!-- doxytag: member="CAS_RequestInterface::getResponseStatusCode" ref="afaabea191fa4715fc2b13372d82830cd" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_RequestInterface::getResponseStatusCode </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Answer HTTP status code of the response</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>integer </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called before the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__AbstractRequest.html#ac60da872e526cdd006204502240ad755">CAS_AbstractRequest</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abc0658bec27d70286f12712944229e9b"></a><!-- doxytag: member="CAS_RequestInterface::makePost" ref="abc0658bec27d70286f12712944229e9b" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_RequestInterface::makePost </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Make the request a POST request rather than the default GET request.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__AbstractRequest.html#ac430f85c6303a96ffc854c6bbdefd95e">CAS_AbstractRequest</a>.</p>
+
+<p>Referenced by <a class="el" href="Post_8php_source.html#l00120">CAS_ProxiedService_Http_Post::populateRequest()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a848d1e939e5ff94aeb49ec8fff49f712"></a><!-- doxytag: member="CAS_RequestInterface::send" ref="a848d1e939e5ff94aeb49ec8fff49f712" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_RequestInterface::send </td>
+          <td>(</td>
+          <td class="paramname"></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Perform the request.</p>
+<dl class="return"><dt><b>Returns:</b></dt><dd>boolean TRUE on success, FALSE on failure. </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called multiple times. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__AbstractRequest.html#abbd007c2f687b52d0718ce209c325e80">CAS_AbstractRequest</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aab89b06410e705f16528f8883bb8f496"></a><!-- doxytag: member="CAS_RequestInterface::setPostBody" ref="aab89b06410e705f16528f8883bb8f496" args="($body)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_RequestInterface::setPostBody </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>body</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Add a POST body to the request</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$body </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__AbstractRequest.html#a99f6b47e913ed0be7a2e64e3595fed8d">CAS_AbstractRequest</a>.</p>
+
+<p>Referenced by <a class="el" href="Post_8php_source.html#l00120">CAS_ProxiedService_Http_Post::populateRequest()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abad222cd355bfaa207bcb26675147f1e"></a><!-- doxytag: member="CAS_RequestInterface::setSslCaCert" ref="abad222cd355bfaa207bcb26675147f1e" args="($caCertPath)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_RequestInterface::setSslCaCert </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>caCertPath</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Specify the path to an SSL CA certificate to validate the server with.</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$sslCertPath </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__AbstractRequest.html#ae4dd91db303801bfb205aa9f0f12b7f6">CAS_AbstractRequest</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae5fc480f05a815f035574619df9915de"></a><!-- doxytag: member="CAS_RequestInterface::setUrl" ref="ae5fc480f05a815f035574619df9915de" args="($url)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">CAS_RequestInterface::setUrl </td>
+          <td>(</td>
+          <td class="paramtype">$&nbsp;</td>
+          <td class="paramname"> <em>url</em></td>
+          <td>&nbsp;)&nbsp;</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>Set the URL of the Request</p>
+<dl><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>string</em>&nbsp;</td><td>$url </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="return"><dt><b>Returns:</b></dt><dd>void </dd></dl>
+<dl><dt><b>Exceptions:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em><a class="el" href="classCAS__OutOfSequenceException.html">CAS_OutOfSequenceException</a></em>&nbsp;</td><td>If called after the Request has been sent. </td></tr>
+  </table>
+  </dd>
+</dl>
+
+<p>Implemented in <a class="el" href="classCAS__AbstractRequest.html#aba433b87d3204f928b8fe1af4b1a1df8">CAS_AbstractRequest</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:27 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__RequestInterface.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__RequestInterface.png
new file mode 100644
index 00000000..bcd2858f
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/interfaceCAS__RequestInterface.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/japanese_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/japanese_8php.html
new file mode 100644
index 00000000..bd91c827
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/japanese_8php.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/japanese.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>CAS/languages/japanese.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="japanese_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">$this&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="japanese_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<dl class="author"><dt><b>Author:</b></dt><dd>fnorif (<a href="mailto:fnorif@yahoo.co.jp">fnorif@yahoo.co.jp</a>)</dd></dl>
+<p>Now Encoding is EUC-JP and LF </p>
+
+<p>Definition in file <a class="el" href="japanese_8php_source.html">japanese.php</a>.</p>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="a3e2715c2e334fb91d34437e4ff025f1f"></a><!-- doxytag: member="japanese.php::_strings" ref="a3e2715c2e334fb91d34437e4ff025f1f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$this <a class="el" href="spanish_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<b>Initial value:</b><div class="fragment"><pre class="fragment"> array(
+<a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a>
+=&gt; <span class="stringliteral">&#39;using server&#39;</span>,
+<a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a>
+=&gt; <span class="stringliteral">&#39;CAS�ˤ��ǧ�ڤ�Ԥ��ޤ�&#39;</span>,
+<a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a>
+=&gt; <span class="stringliteral">&#39;CAS����?�����Ȥ��ޤ�!&#39;</span>,
+<a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a>
+=&gt; <span class="stringliteral">&#39;CAS�����Ф˹Ԥ�ɬ�פ�����ޤ�����ưŪ��ž������ʤ����� &lt;a href=&quot;%s&quot;&gt;������&lt;/a&gt; �򥯥�å�����³�Ԥ��ޤ���&#39;</span>,
+<a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a>
+=&gt; <span class="stringliteral">&#39;CAS�ˤ��ǧ�ڤ˼��Ԥ��ޤ���&#39;</span>,
+<a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a>
+=&gt; <span class="stringliteral">&#39;&lt;p&gt;ǧ�ڤǤ��ޤ���Ǥ���.&lt;/p&gt;&lt;p&gt;�⤦���٥ꥯ�����Ȥ������������&lt;a href=&quot;%s&quot;&gt;������&lt;/a&gt;�򥯥�å�.&lt;/p&gt;&lt;p&gt;���꤬��褷�ʤ����� &lt;a href=&quot;mailto:%s&quot;&gt;���Υ����Ȥδ����&lt;/a&gt;���䤤��碌�Ƥ�������.&lt;/p&gt;&#39;</span>,
+<a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>
+=&gt; <span class="stringliteral">&#39;�����ӥ� `&lt;b&gt;%s&lt;/b&gt;\&#39; �����ѤǤ��ޤ��� (&lt;b&gt;%s&lt;/b&gt;).&#39;</span>
+)
+</pre></div>
+<p>Definition at line <a class="el" href="japanese_8php_source.html#l00010">10</a> of file <a class="el" href="japanese_8php_source.html">japanese.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/japanese_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/japanese_8php_source.html
new file mode 100644
index 00000000..94516f0a
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/japanese_8php_source.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/japanese.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/languages/japanese.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="japanese_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 
+<a name="l00010"></a><a class="code" href="japanese_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">00010</a> $this-&gt;<a class="code" href="catalan_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a> = array(
+<a name="l00011"></a>00011 <a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a>
+<a name="l00012"></a>00012 =&gt; <span class="stringliteral">&#39;using server&#39;</span>,
+<a name="l00013"></a>00013 <a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a>
+<a name="l00014"></a>00014 =&gt; <span class="stringliteral">&#39;CAS�ˤ��ǧ�ڤ�Ԥ��ޤ�&#39;</span>,
+<a name="l00015"></a>00015 <a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a>
+<a name="l00016"></a>00016 =&gt; <span class="stringliteral">&#39;CAS����?�����Ȥ��ޤ�!&#39;</span>,
+<a name="l00017"></a>00017 <a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a>
+<a name="l00018"></a>00018 =&gt; <span class="stringliteral">&#39;CAS�����Ф˹Ԥ�ɬ�פ�����ޤ�����ưŪ��ž������ʤ����� &lt;a href=&quot;%s&quot;&gt;������&lt;/a&gt; �򥯥�å�����³�Ԥ��ޤ���&#39;</span>,
+<a name="l00019"></a>00019 <a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a>
+<a name="l00020"></a>00020 =&gt; <span class="stringliteral">&#39;CAS�ˤ��ǧ�ڤ˼��Ԥ��ޤ���&#39;</span>,
+<a name="l00021"></a>00021 <a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a>
+<a name="l00022"></a>00022 =&gt; <span class="stringliteral">&#39;&lt;p&gt;ǧ�ڤǤ��ޤ���Ǥ���.&lt;/p&gt;&lt;p&gt;�⤦���٥ꥯ�����Ȥ������������&lt;a href=&quot;%s&quot;&gt;������&lt;/a&gt;�򥯥�å�.&lt;/p&gt;&lt;p&gt;���꤬��褷�ʤ����� &lt;a href=&quot;mailto:%s&quot;&gt;���Υ����Ȥδ����&lt;/a&gt;���䤤��碌�Ƥ�������.&lt;/p&gt;&#39;</span>,
+<a name="l00023"></a>00023 <a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>
+<a name="l00024"></a>00024 =&gt; <span class="stringliteral">&#39;�����ӥ� `&lt;b&gt;%s&lt;/b&gt;\&#39; �����ѤǤ��ޤ��� (&lt;b&gt;%s&lt;/b&gt;).&#39;</span>
+<a name="l00025"></a>00025 );
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/languages_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/languages_8php.html
new file mode 100644
index 00000000..f25e6ac8
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/languages_8php.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/languages.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/languages/languages.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="languages_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="enum-members"></a>
+Enumerations</h2></td></tr>
+<tr><td colspan="2"><div class="groupHeader"></div></td></tr>
+<tr><td colspan="2"><div class="groupText"><p><a class="anchor" id="amgrpd41d8cd98f00b204e9800998ecf8427e"></a> </p>
+</div></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a> </td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a> </td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<p>Internationalization constants </p>
+<dl class="author"><dt><b>Author:</b></dt><dd>Pascal Aubry &lt;pascal.aubry at univ-rennes1.fr&gt; </dd></dl>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__internalLang.html">Internationalization </a> </dd></dl>
+
+<p>Definition in file <a class="el" href="languages_8php_source.html">languages.php</a>.</p>
+<hr/><h2>Enumeration Type Documentation</h2>
+<a class="anchor" id="a54b561ecd13a0e2d6d916e33d92a550d"></a><!-- doxytag: member="languages.php::CAS_STR_AUTHENTICATION_FAILED" ref="a54b561ecd13a0e2d6d916e33d92a550d" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="languages_8php_source.html#l00019">19</a> of file <a class="el" href="languages_8php_source.html">languages.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a999b1717ee6dd2a0dac03e37c934761d"></a><!-- doxytag: member="languages.php::CAS_STR_AUTHENTICATION_WANTED" ref="a999b1717ee6dd2a0dac03e37c934761d" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="languages_8php_source.html#l00016">16</a> of file <a class="el" href="languages_8php_source.html">languages.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a13b03baa656e8d87381b940fd861a991"></a><!-- doxytag: member="languages.php::CAS_STR_LOGOUT" ref="a13b03baa656e8d87381b940fd861a991" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="languages_8php_source.html#l00017">17</a> of file <a class="el" href="languages_8php_source.html">languages.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abbacf10862ddf542ca5bf4dcebe26882"></a><!-- doxytag: member="languages.php::CAS_STR_SERVICE_UNAVAILABLE" ref="abbacf10862ddf542ca5bf4dcebe26882" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="languages_8php_source.html#l00021">21</a> of file <a class="el" href="languages_8php_source.html">languages.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe67c82a8a48d757da2d1953885cce74"></a><!-- doxytag: member="languages.php::CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED" ref="afe67c82a8a48d757da2d1953885cce74" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="languages_8php_source.html#l00018">18</a> of file <a class="el" href="languages_8php_source.html">languages.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5240d70ccee91bef362f140ac1b2ed00"></a><!-- doxytag: member="languages.php::CAS_STR_USING_SERVER" ref="a5240d70ccee91bef362f140ac1b2ed00" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>a <a class="el" href="classphpCAS.html">phpCAS</a> string index </p>
+
+<p>Definition at line <a class="el" href="languages_8php_source.html#l00015">15</a> of file <a class="el" href="languages_8php_source.html">languages.php</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af832fd46e6e716b47f2c711aa96fe197"></a><!-- doxytag: member="languages.php::CAS_STR_YOU_WERE_NOT_AUTHENTICATED" ref="af832fd46e6e716b47f2c711aa96fe197" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="languages_8php_source.html#l00020">20</a> of file <a class="el" href="languages_8php_source.html">languages.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/languages_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/languages_8php_source.html
new file mode 100644
index 00000000..2749d462
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/languages_8php_source.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/languages.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/languages/languages.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="languages_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 
+<a name="l00015"></a><a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">00015</a> define(<span class="stringliteral">&quot;CAS_STR_USING_SERVER&quot;</span>,                1);
+<a name="l00016"></a><a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">00016</a> define(<span class="stringliteral">&quot;CAS_STR_AUTHENTICATION_WANTED&quot;</span>,       2);
+<a name="l00017"></a><a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">00017</a> define(<span class="stringliteral">&quot;CAS_STR_LOGOUT&quot;</span>,                      3);
+<a name="l00018"></a><a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">00018</a> define(<span class="stringliteral">&quot;CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED&quot;</span>, 4);
+<a name="l00019"></a><a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">00019</a> define(<span class="stringliteral">&quot;CAS_STR_AUTHENTICATION_FAILED&quot;</span>,       5);
+<a name="l00020"></a><a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">00020</a> define(<span class="stringliteral">&quot;CAS_STR_YOU_WERE_NOT_AUTHENTICATED&quot;</span>,  6);
+<a name="l00021"></a><a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">00021</a> define(<span class="stringliteral">&quot;CAS_STR_SERVICE_UNAVAILABLE&quot;</span>,         7);
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/modules.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/modules.html
new file mode 100644
index 00000000..658cbd6a
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/modules.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Module Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li class="current"><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Modules</h1>  </div>
+</div>
+<div class="contents">
+Here is a list of all modules:<ul>
+<li><a class="el" href="group__public.html">User interface</a><ul>
+<li><a class="el" href="group__publicInit.html">Initialization</a></li>
+<li><a class="el" href="group__publicAuth.html">Authentication</a></li>
+<li><a class="el" href="group__publicServices.html">Access to external services</a></li>
+<li><a class="el" href="group__publicConfig.html">Configuration</a><ul>
+<li><a class="el" href="group__publicLang.html">Internationalization</a></li>
+<li><a class="el" href="group__publicOutput.html">HTML output</a></li>
+<li><a class="el" href="group__publicPGTStorage.html">PGT storage</a></li>
+</ul>
+</li>
+<li><a class="el" href="group__publicDebug.html">Debugging</a></li>
+</ul>
+</li>
+<li><a class="el" href="group__internal.html">Implementation</a><ul>
+<li><a class="el" href="group__internalAuthentication.html">Authentication</a></li>
+<li><a class="el" href="group__internalBasic.html">CAS Basic client features (CAS 1.0, Service Tickets)</a></li>
+<li><a class="el" href="group__internalProxy.html">CAS Proxy features (CAS 2.0, Proxy Granting Tickets)</a><ul>
+<li><a class="el" href="group__internalPGTStorage.html">PGT storage</a><ul>
+<li><a class="el" href="group__internalPGTStorageDb.html">PGT storage in a database</a></li>
+<li><a class="el" href="group__internalPGTStorageFile.html">PGT storage on the filesystem</a></li>
+</ul>
+</li>
+<li><a class="el" href="group__internalCallback.html">Callback from the CAS server</a></li>
+<li><a class="el" href="group__internalProxyServices.html">Proxy other services</a></li>
+</ul>
+</li>
+<li><a class="el" href="group__internalSAML.html">CAS SAML features (SAML 1.1)</a></li>
+<li><a class="el" href="group__internalProxied.html">CAS proxied client features (CAS 2.0, Proxy Tickets)</a></li>
+<li><a class="el" href="group__internalConfig.html">Configuration</a><ul>
+<li><a class="el" href="group__internalBehave.html">Internal behaviour of phpCAS</a></li>
+<li><a class="el" href="group__internalOutput.html">HTML output</a></li>
+<li><a class="el" href="group__internalLang.html">Internationalization</a></li>
+</ul>
+</li>
+<li><a class="el" href="group__internalDebug.html">Debugging</a></li>
+<li><a class="el" href="group__internalMisc.html">Miscellaneous</a></li>
+</ul>
+</li>
+<li><a class="el" href="group__internalCAS__PGTStorageDb.html">InternalCAS_PGTStorageDb</a></li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/nav_f.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/nav_f.png
new file mode 100644
index 00000000..1b07a162
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/nav_f.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/nav_h.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/nav_h.png
new file mode 100644
index 00000000..01f5fa6a
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/nav_h.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/open.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/open.png
new file mode 100644
index 00000000..7b35d2c2
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/open.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/pages.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/pages.html
new file mode 100644
index 00000000..ff04392f
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/pages.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: Page Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>Related Pages</h1>  </div>
+</div>
+<div class="contents">
+Here is a list of all related documentation pages:<ul>
+<li><a class="el" href="deprecated.html">Deprecated List</a>
+</li>
+</ul>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/script__info_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/script__info_8php.html
new file mode 100644
index 00000000..86eaffbb
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/script__info_8php.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/script_info.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/script_info.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="script__info_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+</table>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/script__info_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/script__info_8php_source.html
new file mode 100644
index 00000000..3ff27b2d
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/script__info_8php_source.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: docs/examples/script_info.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>docs/examples/script_info.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="script__info_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001     &lt;dl style=<span class="stringliteral">&#39;border: 1px dotted; padding: 5px;&#39;</span>&gt;
+<a name="l00002"></a>00002       &lt;dt&gt;Current script&lt;/dt&gt;&lt;dd&gt;&lt;?php <a class="code" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">print</a> basename($_SERVER[<span class="stringliteral">&#39;SCRIPT_NAME&#39;</span>]); ?&gt;&lt;/dd&gt;
+<a name="l00003"></a>00003       &lt;dt&gt;session_name():&lt;/dt&gt;&lt;dd&gt; &lt;?php <a class="code" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">print</a> session_name(); ?&gt;&lt;/dd&gt;
+<a name="l00004"></a>00004       &lt;dt&gt;session_id():&lt;/dt&gt;&lt;dd&gt; &lt;?php <a class="code" href="example__service_8php.html#a3ad3a4240c0f97c7e85aff5c52a454d4">print</a> session_id(); ?&gt;&lt;/dd&gt;
+<a name="l00005"></a>00005     &lt;/dl&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/spanish_8php.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/spanish_8php.html
new file mode 100644
index 00000000..d13bbc56
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/spanish_8php.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/spanish.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#var-members">Variables</a>  </div>
+  <div class="headertitle">
+<h1>CAS/languages/spanish.php File Reference</h1>  </div>
+</div>
+<div class="contents">
+
+<p><a href="spanish_8php_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">$this&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="spanish_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a></td></tr>
+</table>
+<hr/><a name="_details"></a><h2>Detailed Description</h2>
+<dl class="author"><dt><b>Author:</b></dt><dd>Iván-Benjamín García Torà &lt;ivaniclixx AT gmail DOT com </dd></dl>
+<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="group__internalLang.html">Internationalization </a> </dd></dl>
+
+<p>Definition in file <a class="el" href="spanish_8php_source.html">spanish.php</a>.</p>
+<hr/><h2>Variable Documentation</h2>
+<a class="anchor" id="a3e2715c2e334fb91d34437e4ff025f1f"></a><!-- doxytag: member="spanish.php::_strings" ref="a3e2715c2e334fb91d34437e4ff025f1f" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">$this <a class="el" href="spanish_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<b>Initial value:</b><div class="fragment"><pre class="fragment"> array(
+<a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a>
+=&gt; <span class="stringliteral">&#39;usando servidor&#39;</span>,
+<a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a>
+=&gt; <span class="stringliteral">&#39;¡Autentificación CAS necesaria!&#39;</span>,
+<a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a>
+=&gt; <span class="stringliteral">&#39;¡Salida CAS necesaria!&#39;</span>,
+<a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a>
+=&gt; <span class="stringliteral">&#39;Ya debería haber sido redireccionado al servidor CAS. Haga click &lt;a href=&quot;%s&quot;&gt;aquí&lt;/a&gt; para continuar.&#39;</span>,
+<a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a>
+=&gt; <span class="stringliteral">&#39;¡Autentificación CAS fallida!&#39;</span>,
+<a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a>
+=&gt; <span class="stringliteral">&#39;&lt;p&gt;No estás autentificado.&lt;/p&gt;&lt;p&gt;Puedes volver a intentarlo haciendo click &lt;a href=&quot;%s&quot;&gt;aquí&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Si el problema persiste debería contactar con el &lt;a href=&quot;mailto:%s&quot;&gt;administrador de este sitio&lt;/a&gt;.&lt;/p&gt;&#39;</span>,
+<a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>
+=&gt; <span class="stringliteral">&#39;El servicio `&lt;b&gt;%s&lt;/b&gt;\&#39; no está disponible (&lt;b&gt;%s&lt;/b&gt;).&#39;</span>
+)
+</pre></div>
+<p>Definition at line <a class="el" href="spanish_8php_source.html#l00010">10</a> of file <a class="el" href="spanish_8php_source.html">spanish.php</a>.</p>
+
+</div>
+</div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/spanish_8php_source.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/spanish_8php_source.html
new file mode 100644
index 00000000..11ac2915
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/spanish_8php_source.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>phpCAS: CAS/languages/spanish.php Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.7.1 -->
+<div class="navigation" id="top">
+  <div class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="examples.html"><span>Examples</span></a></li>
+    </ul>
+  </div>
+  <div class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
+      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
+    </ul>
+  </div>
+<div class="header">
+  <div class="headertitle">
+<h1>CAS/languages/spanish.php</h1>  </div>
+</div>
+<div class="contents">
+<a href="spanish_8php.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 &lt;?php
+<a name="l00002"></a>00002 
+<a name="l00010"></a><a class="code" href="spanish_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">00010</a> $this-&gt;<a class="code" href="catalan_8php.html#a3e2715c2e334fb91d34437e4ff025f1f">_strings</a> = array(
+<a name="l00011"></a>00011 <a class="code" href="languages_8php.html#a5240d70ccee91bef362f140ac1b2ed00">CAS_STR_USING_SERVER</a>
+<a name="l00012"></a>00012 =&gt; <span class="stringliteral">&#39;usando servidor&#39;</span>,
+<a name="l00013"></a>00013 <a class="code" href="languages_8php.html#a999b1717ee6dd2a0dac03e37c934761d">CAS_STR_AUTHENTICATION_WANTED</a>
+<a name="l00014"></a>00014 =&gt; <span class="stringliteral">&#39;¡Autentificación CAS necesaria!&#39;</span>,
+<a name="l00015"></a>00015 <a class="code" href="languages_8php.html#a13b03baa656e8d87381b940fd861a991">CAS_STR_LOGOUT</a>
+<a name="l00016"></a>00016 =&gt; <span class="stringliteral">&#39;¡Salida CAS necesaria!&#39;</span>,
+<a name="l00017"></a>00017 <a class="code" href="languages_8php.html#afe67c82a8a48d757da2d1953885cce74">CAS_STR_SHOULD_HAVE_BEEN_REDIRECTED</a>
+<a name="l00018"></a>00018 =&gt; <span class="stringliteral">&#39;Ya debería haber sido redireccionado al servidor CAS. Haga click &lt;a href=&quot;%s&quot;&gt;aquí&lt;/a&gt; para continuar.&#39;</span>,
+<a name="l00019"></a>00019 <a class="code" href="languages_8php.html#a54b561ecd13a0e2d6d916e33d92a550d">CAS_STR_AUTHENTICATION_FAILED</a>
+<a name="l00020"></a>00020 =&gt; <span class="stringliteral">&#39;¡Autentificación CAS fallida!&#39;</span>,
+<a name="l00021"></a>00021 <a class="code" href="languages_8php.html#af832fd46e6e716b47f2c711aa96fe197">CAS_STR_YOU_WERE_NOT_AUTHENTICATED</a>
+<a name="l00022"></a>00022 =&gt; <span class="stringliteral">&#39;&lt;p&gt;No estás autentificado.&lt;/p&gt;&lt;p&gt;Puedes volver a intentarlo haciendo click &lt;a href=&quot;%s&quot;&gt;aquí&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Si el problema persiste debería contactar con el &lt;a href=&quot;mailto:%s&quot;&gt;administrador de este sitio&lt;/a&gt;.&lt;/p&gt;&#39;</span>,
+<a name="l00023"></a>00023 <a class="code" href="languages_8php.html#abbacf10862ddf542ca5bf4dcebe26882">CAS_STR_SERVICE_UNAVAILABLE</a>
+<a name="l00024"></a>00024 =&gt; <span class="stringliteral">&#39;El servicio `&lt;b&gt;%s&lt;/b&gt;\&#39; no está disponible (&lt;b&gt;%s&lt;/b&gt;).&#39;</span>
+<a name="l00025"></a>00025 );
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 ?&gt;
+</pre></div></div>
+</div>
+<hr class="footer"/><address class="footer"><small>Generated on Sun Jun 5 2011 19:05:26 for phpCAS by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tab_a.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tab_a.png
new file mode 100644
index 00000000..2d99ef23
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tab_a.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tab_b.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tab_b.png
new file mode 100644
index 00000000..b2c3d2be
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tab_b.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tab_h.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tab_h.png
new file mode 100644
index 00000000..c11f48f1
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tab_h.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tab_s.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tab_s.png
new file mode 100644
index 00000000..978943ac
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tab_s.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tabs.css b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tabs.css
new file mode 100644
index 00000000..21920562
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/api/tabs.css
@@ -0,0 +1,59 @@
+.tabs, .tabs2, .tabs3 {
+    background-image: url('tab_b.png');
+    width: 100%;
+    z-index: 101;
+    font-size: 13px;
+}
+
+.tabs2 {
+    font-size: 10px;
+}
+.tabs3 {
+    font-size: 9px;
+}
+
+.tablist {
+    margin: 0;
+    padding: 0;
+    display: table;
+}
+
+.tablist li {
+    float: left;
+    display: table-cell;
+    background-image: url('tab_b.png');
+    line-height: 36px;
+    list-style: none;
+}
+
+.tablist a {
+    display: block;
+    padding: 0 20px;
+    font-weight: bold;
+    background-image:url('tab_s.png');
+    background-repeat:no-repeat;
+    background-position:right;
+    color: #283A5D;
+    text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+    text-decoration: none;
+    outline: none;
+}
+
+.tabs3 .tablist a {
+    padding: 0 10px;
+}
+
+.tablist a:hover {
+    background-image: url('tab_h.png');
+    background-repeat:repeat-x;
+    color: #fff;
+    text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+    text-decoration: none;
+}
+
+.tablist li.current a {
+    background-image: url('tab_a.png');
+    background-repeat:repeat-x;
+    color: #fff;
+    text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/config.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/config.php
new file mode 100644
index 00000000..afc1526f
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/config.php
@@ -0,0 +1,75 @@
+<?php
+
+// The purpose of this central config file is configuring all examples
+// in one place with minimal work for your working environment
+
+$phpcas_path = '../../source/';
+
+///////////////////////////////////////
+// Basic Config of the phpCAS client //
+///////////////////////////////////////
+
+// Full Hostname of your CAS Server
+$cas_host = '192.168.178.254';
+
+// Context of the CAS Server
+$cas_context = '/cas';
+
+// Port of your CAS server. Normally for a https server it's 443
+$cas_port = 8443;
+
+// Path to the ca chain that issued the cas server certificate
+$cas_server_ca_cert_path = '/usr/local/share/ca-certificates/3some-cacert.crt';
+
+//////////////////////////////////////////
+// Advanced Config for special purposes //
+//////////////////////////////////////////
+
+// The "real" hosts of clustered cas server that send SAML logout messages
+// Assumes the cas server is load balanced across multiple hosts
+$cas_real_hosts = array (
+	'192.168.178.254'
+);
+
+// Database config for PGT Storage
+//$db = 'pgsql:host=localhost;dbname=phpcas';
+$db = 'mysql:host=localhost;dbname=phpcas';
+//$db_user = 'phpcas';
+//$db_password = '1938r132rwv12cadl';
+$db_user = 'root';
+$db_password = 'test1234';
+$db_table = 'phpcas';
+
+///////////////////////////////////////////
+// End Configuration -- Don't edit below //
+///////////////////////////////////////////
+
+// Generating the URLS for the local cas example services for proxy testing
+if ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'){
+	$curbase = 'https://'.$_SERVER['SERVER_NAME'];
+}else{
+	$curbase = 'http://'.$_SERVER['SERVER_NAME'];
+}
+if ($_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443)
+	$curbase .= ':'.$_SERVER['SERVER_PORT'];
+
+$curdir = dirname($_SERVER['REQUEST_URI'])."/";
+
+// access to a single service
+$serviceUrl = $curbase.$curdir.'example_service.php';
+// access to a second service
+$serviceUrl2 = $curbase.$curdir.'example_service_that_proxies.php';
+
+$cas_url = 'https://'.$cas_host;
+if ($cas_port != '443')
+{
+	$cas_url = $cas_url.':'.$cas_port;
+}
+$cas_url = $cas_url.$cas_context;
+
+
+// Set the session-name to be unique to the current script so that the client script
+// doesn't share its session with a proxied script.
+// This is just useful when running the example code, but not normally.
+session_name('session_for:'.preg_replace('/[^a-z0-9-]/i', '_', basename($_SERVER['SCRIPT_NAME'])));
+?>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/config.php.example b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/config.php.example
new file mode 100644
index 00000000..2b2d113e
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/config.php.example
@@ -0,0 +1,76 @@
+<?php
+
+// The purpose of this central config file is configuring all examples
+// in one place with minimal work for your working environment
+// Just configure all the items in this config according to your environment
+// and rename the file to config.php
+
+$phpcas_path = '../../source/';
+
+///////////////////////////////////////
+// Basic Config of the phpCAS client //
+///////////////////////////////////////
+
+// Full Hostname of your CAS Server
+$cas_host = 'cas.example.com';
+
+// Context of the CAS Server
+$cas_context = '/cas';
+
+// Port of your CAS server. Normally for a https server it's 443
+$cas_port = 443;
+
+// Path to the ca chain that issued the cas server certificate
+$cas_server_ca_cert_path = '/path/to/cachain.pem';
+
+//////////////////////////////////////////
+// Advanced Config for special purposes //
+//////////////////////////////////////////
+
+// The "real" hosts of clustered cas server that send SAML logout messages
+// Assumes the cas server is load balanced across multiple hosts
+$cas_real_hosts = array (
+	'cas-real-1.example.com',
+	'cas-real-2.example.com'
+);
+
+// Database config for PGT Storage
+$db = 'pgsql:host=localhost;dbname=phpcas';
+//$db = 'mysql:host=localhost;dbname=phpcas';
+$db_user = 'phpcasuser';
+$db_password = 'mysupersecretpass';
+$db_table = 'phpcastabel';
+
+///////////////////////////////////////////
+// End Configuration -- Don't edit below //
+///////////////////////////////////////////
+
+// Generating the URLS for the local cas example services for proxy testing
+if ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'){
+	$curbase = 'https://'.$_SERVER['SERVER_NAME'];
+}else{
+	$curbase = 'http://'.$_SERVER['SERVER_NAME'];
+}
+if ($_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443)
+	$curbase .= ':'.$_SERVER['SERVER_PORT'];
+
+$curdir = dirname($_SERVER['REQUEST_URI'])."/";
+
+// access to a single service
+$serviceUrl = $curbase.$curdir.'example_service.php';
+// access to a second service
+$serviceUrl2 = $curbase.$curdir.'example_service_that_proxies.php';
+
+$cas_url = 'https://'.$cas_host;
+if ($cas_port != '443')
+{
+	$cas_url = $cas_url.':'.$cas_port;
+}
+$cas_url = $cas_url.$cas_context;
+
+
+// Set the session-name to be unique to the current script so that the client script
+// doesn't share its session with a proxied script.
+// This is just useful when running the example code, but not normally.
+session_name('session_for:'.preg_replace('/[^a-z0-9-]/i', '_', basename($_SERVER['SCRIPT_NAME'])));
+?>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example.css b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example.css
new file mode 100644
index 00000000..bf7f6c48
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example.css
@@ -0,0 +1,10 @@
+.error {
+	border: 1px solid #aa0000;
+	color: #aa0000;
+	padding: 5px;
+}
+.success {
+	border: 1px solid #00aa00;
+	color: #00aa00;
+	padding: 5px;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_advanced_saml11.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_advanced_saml11.php
new file mode 100644
index 00000000..2cdda6ad
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_advanced_saml11.php
@@ -0,0 +1,55 @@
+<?php
+// Advanced example for SAML with attributes and single logout
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::client(SAML_VERSION_1_1, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+// phpCAS::setNoCasServerValidation();
+
+// Handle SAML logout requests that emanate from the CAS host exclusively.
+// Failure to restrict SAML logout requests to authorized hosts could
+// allow denial of service attacks where at the least the server is
+// tied up parsing bogus XML messages.
+phpCAS::handleLogoutRequests(true, $cas_real_hosts);
+
+// Force CAS authentication on any page that includes this file
+phpCAS::forceAuthentication();
+
+?>
+<h2>Secure Page</h2>
+<?php include 'script_info.php' ?>
+
+Authentication succeeded for user
+<strong><?php echo phpCAS::getUser(); ?></strong>.
+
+<h3>User Attributes</h3>
+<ul>
+<?php
+foreach (phpCAS::getAttributes() as $key => $value) {
+if (is_array($value)) {
+echo '<li>', $key, ':<ol>';
+foreach($value as $item) {
+      echo '<li><strong>', $item, '</strong></li>';
+    }
+echo '</ol></li>';
+} else {
+    echo '<li>', $key, ': <strong>', $value, '</strong></li>';
+  }
+}
+?>
+</ul>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_custom_urls.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_custom_urls.php
new file mode 100644
index 00000000..b27a93e9
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_custom_urls.php
@@ -0,0 +1,57 @@
+<?php
+// Example for overriding validation urls
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::client(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+
+// Override the validation url for any (ST and PT) CAS 2.0 validation
+phpCAS::setServerProxyValidateURL('https://sso.hrz.tu-darmstadt.de:1443/proxyValidate');
+// Override the validation url for any CAS 1.0 validation
+//phpCAS::setServerServiceValidateURL('https://sso.hrz.tu-darmstadt.de:1443/serviceValidate');
+//Override the validation url for any SAML11 validation
+//phpCAS::setServerSamlValidateURL('https://sso.hrz.tu-darmstadt.de:1443/samlValidate');
+
+
+// force CAS authentication
+phpCAS::forceAuthentication();
+
+// at this step, the user has been authenticated by the CAS server
+// and the user's login name can be read with phpCAS::getUser().
+
+// logout if desired
+if (isset($_REQUEST['logout'])) {
+	phpCAS::logout();
+}
+
+// for this test, simply print that the authentication was successfull
+?>
+<html>
+  <head>
+    <title>phpCAS simple client</title>
+  </head>
+  <body>
+    <h1>Successfull Authentication!</h1>
+    <?php include 'script_info.php' ?>
+    <p>the user's login is <b><?php echo phpCAS::getUser(); ?></b>.</p>
+    <p>phpCAS version is <b><?php echo phpCAS::getVersion(); ?></b>.</p>
+    <p><a href="?logout=">Logout</a></p>
+  </body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_gateway.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_gateway.php
new file mode 100644
index 00000000..611fad82
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_gateway.php
@@ -0,0 +1,58 @@
+<?php
+// Example that uses the CAS gateway feature
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::client(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+if (isset($_REQUEST['logout'])) {
+  phpCAS::logout();
+}
+if (isset($_REQUEST['login'])) {
+  phpCAS::forceAuthentication();
+}
+
+// check CAS authentication
+$auth = phpCAS::checkAuthentication();
+
+?>
+<html>
+  <head>
+    <title>phpCAS simple client</title>
+  </head>
+  <body>
+<?php
+if ($auth) {
+  // for this test, simply print that the authentication was successfull
+?>
+    <h1>Successfull Authentication!</h1>
+    <?php include 'script_info.php' ?>
+    <p>the user's login is <b><?php echo phpCAS::getUser(); ?></b>.</p>
+    <p><a href="?logout=">Logout</a></p>
+<?php
+} else {
+?>
+    <h1>Guest mode</h1>
+    <p><a href="?login=">Login</a></p>
+<?php
+}
+?>
+    <p>phpCAS version is <b><?php echo phpCAS::getVersion(); ?></b>.</p>
+  </body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_html.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_html.php
new file mode 100644
index 00000000..eb590c46
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_html.php
@@ -0,0 +1,62 @@
+<?php
+// Example that changes html of phpcas messages
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::client(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+// customize HTML output
+phpCAS::setHTMLHeader('
+<html>
+  <head>
+    <title>__TITLE__</title>
+  </head>
+  <body>
+  <h1>__TITLE__</h1>
+');
+phpCAS::setHTMLFooter('
+    <hr>
+    <address>
+      phpCAS __PHPCAS_VERSION__, 
+      CAS __CAS_VERSION__ (__SERVER_BASE_URL__)
+    </address>
+  </body>
+</html>
+');
+
+
+// force CAS authentication
+phpCAS::forceAuthentication();
+
+// at this step, the user has been authenticated by the CAS server
+// and the user's login name can be read with phpCAS::getUser().
+
+// for this test, simply print that the authentication was successfull
+?>
+<html>
+  <head>
+    <title>phpCAS simple client with HTML output customization</title>
+  </head>
+  <body>
+    <h1>Successfull Authentication!</h1>
+    <?php include 'script_info.php' ?>
+    <p>the user's login is <b><?php echo phpCAS::getUser(); ?></b>.</p>
+    <p>phpCAS version is <b><?php echo phpCAS::getVersion(); ?></b>.</p>
+  </body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_lang.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_lang.php
new file mode 100644
index 00000000..d82ac722
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_lang.php
@@ -0,0 +1,48 @@
+<?php
+// Example that changes language of phpcas pages
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::client(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+// set the language to french
+phpCAS::setLang(PHPCAS_LANG_FRENCH);
+
+// force CAS authentication
+phpCAS::forceAuthentication();
+
+// at this step, the user has been authenticated by the CAS server
+// and the user's login name can be read with phpCAS::getUser().
+
+// moreover, a PGT was retrieved from the CAS server that will
+// permit to gain accesses to new services.
+
+// for this test, simply print that the authentication was successfull
+?>
+<html>
+  <head>
+    <title>Exemple d'internationalisation de phpCAS</title>
+  </head>
+  <body>
+    <h1>Authentification r&eacute;ussie&nbsp;!</h1>
+    <?php include 'script_info.php' ?>
+    <p>L'utilisateur connect&eacute; est <b><?php echo phpCAS::getUser(); ?></b>.</p>
+    <p>La version de phpCAS est <b><?php echo phpCAS::getVersion(); ?></b>.</p>
+  </body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_logout.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_logout.php
new file mode 100644
index 00000000..4647d201
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_logout.php
@@ -0,0 +1,49 @@
+<?php
+// Example for handling logout requests
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::client(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+// handle incoming logout requests
+phpCAS::handleLogoutRequests();
+
+// Or as an advanced featue handle SAML logout requests that emanate from the CAS host exclusively.
+// Failure to restrict SAML logout requests to authorized hosts could
+// allow denial of service attacks where at the least the server is
+// tied up parsing bogus XML messages.
+// phpCAS::handleLogoutRequests(true, $cas_real_hosts);
+
+
+// force CAS authentication
+phpCAS::forceAuthentication();
+
+// for this test, simply print that the authentication was successfull
+?>
+<html>
+  <head>
+    <title>phpCAS simple client</title>
+  </head>
+  <body>
+    <h1>Successfull Authentication!</h1>
+    <?php include 'script_info.php' ?>
+    <p>the user's login is <b><?php echo phpCAS::getUser(); ?></b>.</p>
+    <p>phpCAS version is <b><?php echo phpCAS::getVersion(); ?></b>.</p>
+  </body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_pgt_storage_db.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_pgt_storage_db.php
new file mode 100644
index 00000000..1595220b
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_pgt_storage_db.php
@@ -0,0 +1,59 @@
+<?php
+// Example that changes the storage of the pgt tickets
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::proxy(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+// set PGT storage to file in plain format in the same directory as session files
+phpCAS::setPGTStorageDB($db,$db_user,$db_password,$db_table);
+
+// force CAS authentication
+phpCAS::forceAuthentication();
+
+// at this step, the user has been authenticated by the CAS server
+// and the user's login name can be read with phpCAS::getUser().
+
+// moreover, a PGT was retrieved from the CAS server that will
+// permit to gain accesses to new services.
+
+?>
+<html>
+  <head>
+    <title>phpCAS proxy example with PGT storage to a database</title>
+    <link rel="stylesheet" type='text/css' href='example.css'/>
+  </head>
+  <body>
+    <h1>phpCAS proxy example with PGT storage to file</h1>
+    <?php include 'script_info.php' ?>
+    <p>the user's login is <b><?php echo phpCAS::getUser(); ?></b>.</p>
+    <h2>Response from service <?php echo $serviceUrl; ?></h2>
+<?php
+  flush();
+  // call a service and change the color depending on the result
+  if ( phpCAS::serviceWeb($serviceUrl,$err_code,$output) ) {
+    echo '<div class="success">';
+  } else {
+    echo '<div class="error">';
+  }
+  echo $output;
+  echo '</div>';
+?>
+  </body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_pgt_storage_file.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_pgt_storage_file.php
new file mode 100644
index 00000000..9b496945
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_pgt_storage_file.php
@@ -0,0 +1,59 @@
+<?php
+// Example that changes the storage of the pgt tickets
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::proxy(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+// set PGT storage to file in plain format in the same directory as session files
+phpCAS::setPGTStorageFile('plain',session_save_path());
+
+// force CAS authentication
+phpCAS::forceAuthentication();
+
+// at this step, the user has been authenticated by the CAS server
+// and the user's login name can be read with phpCAS::getUser().
+
+// moreover, a PGT was retrieved from the CAS server that will
+// permit to gain accesses to new services.
+
+?>
+<html>
+  <head>
+    <title>phpCAS proxy example with PGT storage to file</title>
+    <link rel="stylesheet" type='text/css' href='example.css'/>
+  </head>
+  <body>
+    <h1>phpCAS proxy example with PGT storage to file</h1>
+    <?php include 'script_info.php' ?>
+    <p>the user's login is <b><?php echo phpCAS::getUser(); ?></b>.</p>
+    <h2>Response from service <?php echo $serviceUrl; ?></h2>
+<?php
+  flush();
+  // call a service and change the color depending on the result
+  if ( phpCAS::serviceWeb($serviceUrl,$err_code,$output) ) {
+    echo '<div class="success">';
+  } else {
+    echo '<div class="error">';
+  }
+  echo $output;
+  echo '</div>';
+?>
+  </body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_proxy_GET.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_proxy_GET.php
new file mode 100644
index 00000000..f879b632
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_proxy_GET.php
@@ -0,0 +1,83 @@
+<?php
+// Example for a proxy that makes a GET request.
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::proxy(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+// force CAS authentication
+phpCAS::forceAuthentication();
+
+// at this step, the user has been authenticated by the CAS server
+// and the user's login name can be read with phpCAS::getUser().
+
+// moreover, a PGT was retrieved from the CAS server that will
+// permit to gain accesses to new services.
+
+?>
+<html>
+  <head>
+    <title>phpCAS proxy example #2</title>
+    <link rel="stylesheet" type='text/css' href='example.css'/>
+  </head>
+  <body>
+    <h1>phpCAS proxied proxy example</h1>
+    <?php include 'script_info.php' ?>
+    <p>the user's login is <b><?php echo phpCAS::getUser(); ?></b>.</p>
+    <h2>Response from service <?php echo $serviceUrl; ?></h2>
+<?php
+	flush();
+	
+	// call a service and change the color depending on the result
+	try {
+		$service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_GET);
+		$service->setUrl($serviceUrl);
+		$service->send();
+		if ($service->getResponseStatusCode() == 200) {
+			echo '<div class="success">';
+			echo $service->getResponseBody();
+			echo '</div>';
+		} else {
+			// The service responded with an error code 404, 500, etc.
+			echo '<div class="error">';
+			echo 'The service responded with a '.$service->getResponseStatusCode().' error.';
+			echo '</div>';
+		}
+	} catch (CAS_ProxyTicketException $e) {
+		if ($e->getCode() == PHPCAS_SERVICE_PT_FAILURE) {
+			echo '<div class="error">';
+			echo "Your login has timed out. You need to log in again.";
+			echo '</div>';
+		} else
+			// Other proxy ticket errors are from bad request format (shouldn't happen)
+			// or CAS server failure (unlikely) so lets just stop if we hit those.
+			throw $e; 
+	} catch (CAS_ProxiedService_Exception $e) {
+		// Something prevented the service request from being sent or received.
+		// We didn't even get a valid error response (404, 500, etc), so this
+		// might be caused by a network error or a DNS resolution failure.
+		// We could handle it in some way, but for now we will just stop.
+		throw $e;
+	}
+	
+	
+?>
+  </body>
+</html>
+
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_proxy_POST.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_proxy_POST.php
new file mode 100644
index 00000000..c9b3b85c
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_proxy_POST.php
@@ -0,0 +1,88 @@
+<?php
+// Example for a proxy that makes a GET request.
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::proxy(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+// force CAS authentication
+phpCAS::forceAuthentication();
+
+// at this step, the user has been authenticated by the CAS server
+// and the user's login name can be read with phpCAS::getUser().
+
+// moreover, a PGT was retrieved from the CAS server that will
+// permit to gain accesses to new services.
+
+$serviceUrl = $curbase.$curdir.'example_service_POST.php';
+
+?>
+<html>
+  <head>
+    <title>phpCAS proxy POST example</title>
+    <link rel="stylesheet" type='text/css' href='example.css'/>
+  </head>
+  <body>
+    <h1>phpCAS proxy POST example</h1>
+    <?php include 'script_info.php' ?>
+    <p>the user's login is <b><?php echo phpCAS::getUser(); ?></b>.</p>
+    <h2>Response from service <?php echo $serviceUrl; ?></h2>
+<?php
+	flush();
+	
+	// call a service and change the color depending on the result
+	try {
+		$service = phpCAS::getProxiedService(PHPCAS_PROXIED_SERVICE_HTTP_POST);
+		$service->setUrl($serviceUrl);
+		$service->setContentType('application/x-www-form-urlencoded');
+		$service->setBody('favorite_color=blue');
+		$service->send();
+		if ($service->getResponseStatusCode() == 200) {
+			echo '<div class="success">';
+			echo $service->getResponseBody();
+			echo '</div>';
+		} else {
+			// The service responded with an error code 404, 500, etc.
+			echo '<div class="error">';
+			echo 'The service responded with a '.$service->getResponseStatusCode().' error.';
+			echo $service->getResponseBody();
+			echo '</div>';
+		}
+	} catch (CAS_ProxyTicketException $e) {
+		if ($e->getCode() == PHPCAS_SERVICE_PT_FAILURE) {
+			echo '<div class="error">';
+			echo "Your login has timed out. You need to log in again.";
+			echo '</div>';
+		} else
+			// Other proxy ticket errors are from bad request format (shouldn't happen)
+			// or CAS server failure (unlikely) so lets just stop if we hit those.
+			throw $e; 
+	} catch (CAS_ProxiedService_Exception $e) {
+		// Something prevented the service request from being sent or received.
+		// We didn't even get a valid error response (404, 500, etc), so this
+		// might be caused by a network error or a DNS resolution failure.
+		// We could handle it in some way, but for now we will just stop.
+		throw $e;
+	}
+	
+	
+?>
+  </body>
+</html>
+
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_proxy_serviceWeb.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_proxy_serviceWeb.php
new file mode 100644
index 00000000..5a6a235d
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_proxy_serviceWeb.php
@@ -0,0 +1,57 @@
+<?php
+// Example for a proxy with session usage
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::proxy(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+// force CAS authentication
+phpCAS::forceAuthentication();
+
+// at this step, the user has been authenticated by the CAS server
+// and the user's login name can be read with phpCAS::getUser().
+
+// moreover, a PGT was retrieved from the CAS server that will
+// permit to gain accesses to new services.
+
+?>
+<html>
+  <head>
+    <title>phpCAS proxied proxy example (with sessioning)</title>
+    <link rel="stylesheet" type='text/css' href='example.css'/>
+  </head>
+  <body>
+    <h1>phpCAS proxied proxy example (with sessioning)</h1>
+    <?php include 'script_info.php' ?>
+    <p>the user's login is <b><?php echo phpCAS::getUser(); ?></b>.</p>
+    <h2>Response from service <?php echo $serviceUrl; ?></h2>
+<?php
+  flush();
+  // call a service and change the color depending on the result
+  if ( phpCAS::serviceWeb($serviceUrl,$err_code,$output) ) {
+    echo '<div class="success">';
+  } else {
+    echo '<div class="error">';
+  }
+  echo $output;
+  echo '</div>';
+?>
+  </body>
+</html>
+
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_proxy_serviceWeb_chaining.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_proxy_serviceWeb_chaining.php
new file mode 100644
index 00000000..ab852e50
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_proxy_serviceWeb_chaining.php
@@ -0,0 +1,57 @@
+<?php
+// Example for a proxy with session usage
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::proxy(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+// force CAS authentication
+phpCAS::forceAuthentication();
+
+// at this step, the user has been authenticated by the CAS server
+// and the user's login name can be read with phpCAS::getUser().
+
+// moreover, a PGT was retrieved from the CAS server that will
+// permit to gain accesses to new services.
+
+?>
+<html>
+  <head>
+    <title>phpCAS proxy example #2</title>
+    <link rel="stylesheet" type='text/css' href='example.css'/>
+  </head>
+  <body>
+    <h1>phpCAS proxied proxy example</h1>
+    <?php include 'script_info.php' ?>
+    <p>the user's login is <b><?php echo phpCAS::getUser(); ?></b>.</p>
+    <h2>Response from service <?php echo $serviceUrl2; ?></h2>
+<?php
+  flush();
+  // call a service and change the color depending on the result
+  if ( phpCAS::serviceWeb($serviceUrl2,$err_code,$output) ) {
+    echo '<div class="success">';
+  } else {
+    echo '<div class="error">';
+  }
+  echo $output;
+  echo '</div>';
+?>
+  </body>
+</html>
+
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_service.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_service.php
new file mode 100644
index 00000000..8ffa60ce
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_service.php
@@ -0,0 +1,41 @@
+<?php
+// Example for proxied service with session support
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::client(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+// force CAS authentication
+phpCAS::forceAuthentication();
+
+print '<h1>I am a service that can be proxied.</h1>';
+
+// at this step, the user has been authenticated by the CAS server
+// and the user's login name can be read with phpCAS::getUser().
+include 'script_info.php';
+
+// for this test, simply print that the authentication was successfull
+echo '<p>The user\'s login is <b>'.phpCAS::getUser().'</b>.</p>';
+
+// increment the number of requests of the session and print it
+if (!isset($_SESSION['n']))
+	$_SESSION['n'] = 0;
+echo '<p>request #'.(++$_SESSION['n']).'</p>';
+
+?>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_service_POST.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_service_POST.php
new file mode 100644
index 00000000..cc86089b
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_service_POST.php
@@ -0,0 +1,53 @@
+<?php
+// Example for proxied service with session support
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::client(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+// force CAS authentication
+phpCAS::forceAuthentication();
+
+if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+	header('HTTP/1.1 400 Bad Request');
+	print "<h1>I only respond to POST requests. This is a ".$_SERVER['REQUEST_METHOD']." request.</h1>";
+	exit;
+}
+if (empty($_POST['favorite_color'])) {
+	header('HTTP/1.1 400 Bad Request');
+	print '<h1>You must post a <strong>favorite_color</strong>.</h1>';
+	exit;
+}
+
+print '<h1>I am a service that responds to POST requests.</h1>';
+
+// at this step, the user has been authenticated by the CAS server
+// and the user's login name can be read with phpCAS::getUser().
+include 'script_info.php';
+
+// for this test, simply print that the authentication was successfull
+echo '<p>The user\'s login is <b>'.phpCAS::getUser().'</b>.</p>';
+
+print '<h1>Your favorite color is '.htmlentities($_POST['favorite_color']).'</h1>';
+
+// increment the number of requests of the session and print it
+if (!isset($_SESSION['n']))
+	$_SESSION['n'] = 0;
+echo '<p>request #'.(++$_SESSION['n']).'</p>';
+
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_service_that_proxies.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_service_that_proxies.php
new file mode 100644
index 00000000..0e078d73
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_service_that_proxies.php
@@ -0,0 +1,59 @@
+<?php
+// Example for a proxied proxy
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::proxy(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+// force CAS authentication
+phpCAS::forceAuthentication();
+
+// at this step, the user has been authenticated by the CAS server
+// and the user's login name can be read with phpCAS::getUser().
+
+// moreover, a PGT was retrieved from the CAS server that will
+// permit to gain accesses to new services.
+
+
+
+?>
+<html>
+  <head>
+    <title>phpCAS proxied proxy service example</title>
+    <link rel="stylesheet" type='text/css' href='example.css'/>
+  </head>
+  <body>
+    <h1>I am a service that can be proxied. In turn, I proxy another service.</h1>
+    <?php include 'script_info.php' ?>
+    <p>the user's login is <b><?php echo phpCAS::getUser(); ?></b>.</p>
+    <h2>Response from service <?php echo $serviceUrl; ?></h2>
+<?php
+  flush();
+  // call a service and change the color depending on the result
+  if ( phpCAS::serviceWeb($serviceUrl,$err_code,$output) ) {
+    echo '<div class="success">';
+  } else {
+    echo '<div class="error">';
+  }
+  echo $output;
+  echo '</div>';
+?>
+  </body>
+</html>
+
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_simple.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_simple.php
new file mode 100644
index 00000000..930b9627
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/example_simple.php
@@ -0,0 +1,48 @@
+<?php
+// Example for a simple client
+
+// Load the settings from the central config file
+include_once('config.php');
+// Load the CAS lib
+include_once($phpcas_path.'/CAS.php');
+
+// Uncomment to enable debugging
+phpCAS::setDebug();
+
+// Initialize phpCAS
+phpCAS::client(CAS_VERSION_2_0, $cas_host, $cas_port, $cas_context);
+
+// For production use set the CA certificate that is the issuer of the cert 
+// on the CAS server and uncomment the line below
+// phpCAS::setCasServerCACert($cas_server_ca_cert_path);
+
+// For quick testing you can disable SSL validation of the CAS server. 
+// THIS SETTING IS NOT RECOMMENDED FOR PRODUCTION. 
+// VALIDATING THE CAS SERVER IS CRUCIAL TO THE SECURITY OF THE CAS PROTOCOL! 
+phpCAS::setNoCasServerValidation();
+
+// force CAS authentication
+phpCAS::forceAuthentication();
+
+// at this step, the user has been authenticated by the CAS server
+// and the user's login name can be read with phpCAS::getUser().
+
+// logout if desired
+if (isset($_REQUEST['logout'])) {
+	phpCAS::logout();
+}
+
+// for this test, simply print that the authentication was successfull
+?>
+<html>
+  <head>
+    <title>phpCAS simple client</title>
+  </head>
+  <body>
+    <h1>Successfull Authentication!</h1>
+    <?php include 'script_info.php' ?>
+    <p>the user's login is <b><?php echo phpCAS::getUser(); ?></b>.</p>
+    <p>phpCAS version is <b><?php echo phpCAS::getVersion(); ?></b>.</p>
+    <p><a href="?logout=">Logout</a></p>
+  </body>
+</html>
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/script_info.php b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/script_info.php
new file mode 100644
index 00000000..d37ccfba
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/examples/script_info.php
@@ -0,0 +1,5 @@
+    <dl style='border: 1px dotted; padding: 5px;'>
+      <dt>Current script</dt><dd><?php print basename($_SERVER['SCRIPT_NAME']); ?></dd>
+      <dt>session_name():</dt><dd> <?php print session_name(); ?></dd>
+      <dt>session_id():</dt><dd> <?php print session_id(); ?></dd>
+    </dl>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/images/esup-portail.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/images/esup-portail.png
new file mode 100644
index 00000000..ed6e6661
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/images/esup-portail.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/images/jasig.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/images/jasig.png
new file mode 100644
index 00000000..38952bd2
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/images/jasig.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/images/phpcas.png b/htmltest/sites/all/libraries/CAS.dgeo/docs/images/phpcas.png
new file mode 100644
index 00000000..0fed45d3
Binary files /dev/null and b/htmltest/sites/all/libraries/CAS.dgeo/docs/images/phpcas.png differ
diff --git a/htmltest/sites/all/libraries/CAS.dgeo/docs/index.html b/htmltest/sites/all/libraries/CAS.dgeo/docs/index.html
new file mode 100644
index 00000000..dce47b10
--- /dev/null
+++ b/htmltest/sites/all/libraries/CAS.dgeo/docs/index.html
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <title>phpCAS</title>
+  </head>
+  <body>
+	<p><img src="images/phpcas.png" width="191" height="68"/></p>
+	<p>phpCAS documentation is hosted at <a href="https://wiki.jasig.org/display/CASC/phpCAS">https://wiki.jasig.org/display/CASC/phpCAS</a>.</p>
+	<ul>
+	  <li><a href="examples">examples</a></li>
+	  <li><a href="api/index.html">source documentation</a></li>
+  </ul>
+	<p><img src="images/esup-portail.png" width="182" height="68"/> <img src="images/jasig.png" width="169" height="87"/></p>
+	<p>&nbsp;</p>
+  </body>
+</html>
+  
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/README b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/README
new file mode 100644
index 00000000..fb79ab44
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/README
@@ -0,0 +1,100 @@
+Superfish library
+
+About:
+------
+This is the Superfish library for the Superfish module of the Drupal CMS.
+http://drupal.org/project/superfish
+
+The homepage of the jQuery Superfish plug-in is located at:
+http://users.tpg.com.au/j_birch/plugins/superfish
+
+
+Important:
+----------
+Do not modify any files of the Superfish library. The only acceptable change is addition of new CSS
+files to the /style directory. Read the module README or the documentation for more information.
+
+
+Requirements:
+-------------
+- jQuery version 1.3.x or later.
+- jQuery version 1.6.1 or later if you are going to use the jQuery Easing plugin.
+
+
+Contents:
+---------
+- superfish.js 
+-- The jQuery Superfish plug-in version 1.4.8.
+-- It is slightly modified in order to make it compatible with screen reader software.
+-- The original Superfish plug-in can be found at the homepage of the jQuery Superfish plugin.
+
+- supersubs.js
+-- The jQuery Supersubs plug-in version 0.2-beta.
+-- It is slightly modified because of the Superfish project of the Drupal CMS.
+-- The original Supersubs plug-in can be found at the homepage of the jQuery Superfish plug-in.
+
+- supposition.js
+-- The jQuery Supposition plug-in version 0.2.
+-- It is heavily modified in order to work flawlessly.
+-- The original Supposition plug-in can be found at:
+   http://users.tpg.com.au/j_birch/plugins/superfish/supposition-test/
+
+- sftouchscreen.js
+-- The jQuery sf-Touchscreen plug-in version 1.2-beta.
+-- It is developed as a part of the Superfish project of the Drupal CMS.
+
+- sfsmallscreen.js
+-- The jQuery sf-Smallscreen plug-in version 1.0-beta.
+-- It is developed as a part of the Superfish project of the Drupal CMS.
+
+- jquery.bgiframe.min.js
+-- The jQuery bgIframe plug-in version 2.1.2.
+
+- jquery.hoverIntent.minified.js
+-- The jQuery hoverIntent plug-in r6.
+
+
+Changes:
+--------
+May, 2013
+---------
+- Added a few help pages to the /style directory.
+- Added a file to check the library version.
+- Fixed an image.
+
+February, 2013
+--------------
+- sfSmallscreen plug-in.
+- sfTouchscreen overhaul.
+- Potential bug fixed.
+- Color change for the .sf-description in all the styles in the /styles folder.
+
+February, 2012
+--------------
+- Some important CSS improvements.
+- supposition.js improved.
+- /style/simple/simple.css improved.
+- Added a centre-aligned version of the Simple style.
+
+January, 2012
+-------------
+- superfish.js slightly modified in order to work with screen reader software.
+
+December, 2011
+--------------
+- Several changes to the core CSS files.
+- Introducing Simple, a beautiful new style.
+
+September, 2011
+---------------
+- style/light-blue.css image path fixed.
+- style/spring.css image path fixed.
+- style/white.css image path fixed.
+
+March, 2011
+-----------
+- supersubs.js slightly modified in order to ignore the Mega-menus.
+
+January, 2011
+-------------
+- supersubs.js slightly modified to skip one level if the menu was a Navbar.
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/VERSION b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/VERSION
new file mode 100644
index 00000000..9f8e9b69
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/VERSION
@@ -0,0 +1 @@
+1.0
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/css/superfish-navbar.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/css/superfish-navbar.css
new file mode 100644
index 00000000..bb80e730
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/css/superfish-navbar.css
@@ -0,0 +1,62 @@
+.sf-navbar {
+  position: relative;
+}
+.sf-navbar li {
+  position: static;
+}
+.sf-navbar li li {
+  position: relative;
+}
+.sf-navbar li ul,
+.sf-navbar li li li {
+  width: 100%;
+}
+.sf-navbar li li {
+  width: auto;
+  float: left;
+}
+.sf-navbar li li:hover > ul,
+.sf-navbar li li.sfHover > ul,
+.sf-navbar > li.active-trail > ul {
+  left: 0;
+  top: 2.5em;
+}
+.sf-navbar li li li:hover > ul,
+.sf-navbar li li li.sfHover > ul {
+  left: 12em;
+  top: 0;
+}
+.sf-navbar ul .sf-sub-indicator {
+  background-position: -10px -100px;
+}
+.sf-navbar ul a > .sf-sub-indicator {
+  background-position: 0 -100px;
+}
+.sf-navbar ul a:focus > .sf-sub-indicator,
+.sf-navbar ul a:hover > .sf-sub-indicator,
+.sf-navbar ul a:active > .sf-sub-indicator,
+.sf-navbar ul li:hover > a > .sf-sub-indicator,
+.sf-navbar ul li.sfHover > a > .sf-sub-indicator {
+  background-position: -10px -100px;
+}
+.sf-navbar ul ul .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-navbar ul ul a > .sf-sub-indicator {
+  background-position: 0 0;
+}
+.sf-navbar ul ul a:focus > .sf-sub-indicator,
+.sf-navbar ul ul a:hover > .sf-sub-indicator,
+.sf-navbar ul ul a:active > .sf-sub-indicator,
+.sf-navbar ul ul li:hover > a > .sf-sub-indicator,
+.sf-navbar ul ul li.sfHover > a > .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-navbar > li > ul {
+  background: transparent;
+  padding: 0;
+  -moz-border-radius-bottomleft: 0;
+  -moz-border-radius-topright: 0;
+  -webkit-border-top-right-radius: 0;
+  -webkit-border-bottom-left-radius: 0;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/css/superfish-vertical.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/css/superfish-vertical.css
new file mode 100644
index 00000000..9ad8f536
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/css/superfish-vertical.css
@@ -0,0 +1,22 @@
+.sf-vertical,
+.sf-vertical li {
+  width: 12em;
+}
+.sf-vertical li:hover > ul,
+.sf-vertical li.sfHover > ul {
+  left: 12em;
+  top: 0;
+}
+.sf-vertical .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-vertical a > .sf-sub-indicator {
+  background-position: 0 0;
+}
+.sf-vertical a:focus > .sf-sub-indicator,
+.sf-vertical a:hover > .sf-sub-indicator,
+.sf-vertical a:active > .sf-sub-indicator,
+.sf-vertical li:hover > a > .sf-sub-indicator,
+.sf-vertical li.sfHover > a > .sf-sub-indicator {
+  background-position: -10px 0;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/css/superfish.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/css/superfish.css
new file mode 100644
index 00000000..b87e3664
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/css/superfish.css
@@ -0,0 +1,228 @@
+.sf-menu,
+.sf-menu * {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.sf-menu {
+  line-height: 1.0;
+  z-index: 497;
+}
+.sf-menu ul {
+  left: 0;
+  position: absolute;
+  top: -99999em;
+  width: 12em;
+}
+.sf-menu ul li {
+  width: 100%;
+}
+.sf-menu li {
+  float: left;
+  position: relative;
+  z-index: 498;
+}
+.sf-menu a {
+  display: block;
+  position: relative;
+}
+.sf-menu li:hover,
+.sf-menu li.sfHover,
+.sf-menu li:hover ul,
+.sf-menu li.sfHover ul {
+  z-index: 499;
+}
+.sf-menu li:hover > ul,
+.sf-menu li.sfHover > ul {
+  left: 0;
+  top: 2.5em;
+}
+.sf-menu li li:hover > ul,
+.sf-menu li li.sfHover > ul {
+  left: 12em;
+  top: 0;
+}
+.sf-hidden {
+  left: 0 !important;
+  top: -99999em !important;
+}
+.sf-menu a.sf-with-ul {
+  min-width: 1px;
+}
+.sf-sub-indicator {
+  background: url('../images/arrows-ffffff.png') no-repeat -10px -100px;
+  display: block;
+  height: 10px;
+  overflow: hidden;
+  position: absolute;
+  right: 0.75em;
+  text-indent: -999em;
+  top: 1.05em;
+  width: 10px;
+}
+a > .sf-sub-indicator {
+  top: 0.8em;
+  background-position: 0 -100px;
+}
+a:focus > .sf-sub-indicator,
+a:hover > .sf-sub-indicator,
+a:active > .sf-sub-indicator,
+li:hover > a > .sf-sub-indicator,
+li.sfHover > a > .sf-sub-indicator {
+  background-position: -10px -100px;
+}
+.sf-menu ul .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-menu ul a > .sf-sub-indicator {
+  background-position: 0 0;
+}
+.sf-menu ul a:focus > .sf-sub-indicator,
+.sf-menu ul a:hover > .sf-sub-indicator,
+.sf-menu ul a:active > .sf-sub-indicator,
+.sf-menu ul li:hover > a > .sf-sub-indicator,
+.sf-menu ul li.sfHover > a > .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-menu.sf-horizontal.sf-shadow ul,
+.sf-menu.sf-vertical.sf-shadow ul,
+.sf-menu.sf-navbar.sf-shadow ul ul {
+  background: url('../images/shadow.png') no-repeat right bottom;
+  padding: 0 8px 9px 0 !important;
+  -webkit-border-top-right-radius: 8px;
+  -webkit-border-bottom-left-radius: 8px;
+  -moz-border-radius-topright: 8px;
+  -moz-border-radius-bottomleft: 8px;
+  border-top-right-radius: 8px;
+  border-bottom-left-radius: 8px;
+}
+.sf-shadow ul.sf-shadow-off {
+  background: transparent;
+}
+.sf-menu.rtl,
+.sf-menu.rtl li {
+  float: right;
+}
+.sf-menu.rtl li:hover > ul,
+.sf-menu.rtl li.sfHover > ul {
+  left: auto;
+  right: 0;
+}
+.sf-menu.rtl li li:hover > ul,
+.sf-menu.rtl li li.sfHover > ul {
+  left: auto;
+  right: 12em;
+}
+.sf-menu.rtl ul {
+  left: auto;
+  right: 0;
+}
+.sf-menu.rtl .sf-sub-indicator {
+  left: 0.75em;
+  right: auto;
+  background: url('../images/arrows-ffffff-rtl.png') no-repeat -10px -100px;
+}
+.sf-menu.rtl a > .sf-sub-indicator {
+  top: 0.8em;
+  background-position: -10px -100px;
+}
+.sf-menu.rtl a:focus > .sf-sub-indicator,
+.sf-menu.rtl a:hover > .sf-sub-indicator,
+.sf-menu.rtl a:active > .sf-sub-indicator,
+.sf-menu.rtl li:hover > a > .sf-sub-indicator,
+.sf-menu.rtl li.sfHover > a > .sf-sub-indicator {
+  background-position: 0 -100px;
+}
+.sf-menu.rtl ul .sf-sub-indicator {
+  background-position: 0 0;
+}
+.sf-menu.rtl ul a > .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-menu.rtl ul a:focus > .sf-sub-indicator,
+.sf-menu.rtl ul a:hover > .sf-sub-indicator,
+.sf-menu.rtl ul a:active > .sf-sub-indicator,
+.sf-menu.rtl ul li:hover > a > .sf-sub-indicator,
+.sf-menu.rtl ul li.sfHover > a > .sf-sub-indicator {
+  background-position: 0 0;
+}
+.sf-menu.rtl.sf-horizontal.sf-shadow ul,
+.sf-menu.rtl.sf-vertical.sf-shadow ul,
+.sf-menu.rtl.sf-navbar.sf-shadow ul ul {
+  background-position: bottom left;
+  padding: 0 0 9px 8px !important;
+  -webkit-border-radius: 8px;
+  -webkit-border-top-right-radius: 0;
+  -webkit-border-bottom-left-radius: 0;
+  -moz-border-radius: 8px;
+  -moz-border-radius-topright: 0;
+  -moz-border-radius-bottomleft: 0;
+  border-radius: 8px;
+  border-top-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.sf-vertical.rtl li:hover > ul,
+.sf-vertical.rtl li.sfHover > ul {
+  left: auto;
+  right: 12em;
+}
+.sf-vertical.rtl .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-vertical.rtl a > .sf-sub-indicator {
+  background-position: 0 0;
+}
+.sf-vertical.rtl a:focus > .sf-sub-indicator,
+.sf-vertical.rtl a:hover > .sf-sub-indicator,
+.sf-vertical.rtl a:active > .sf-sub-indicator,
+.sf-vertical.rtl li:hover > a > .sf-sub-indicator,
+.sf-vertical.rtl li.sfHover > a > .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-navbar.rtl li li {
+  float: right;
+}
+.sf-navbar.rtl ul .sf-sub-indicator {
+  background-position: 0 -100px;
+}
+.sf-navbar.rtl ul a > .sf-sub-indicator {
+  background-position: -10px -100px;
+}
+.sf-navbar.rtl ul a:focus > .sf-sub-indicator,
+.sf-navbar.rtl ul a:hover > .sf-sub-indicator,
+.sf-navbar.rtl ul a:active > .sf-sub-indicator,
+.sf-navbar.rtl ul li:hover > a > .sf-sub-indicator,
+.sf-navbar.rtl ul li.sfHover > a > .sf-sub-indicator {
+  background-position: 0 -100px;
+}
+.sf-navbar.rtl ul ul .sf-sub-indicator {
+  background-position:  0 0;
+}
+.sf-navbar.rtl ul ul a > .sf-sub-indicator {
+  background-position:  -10px 0;
+}
+.sf-navbar.rtl ul ul a:focus > .sf-sub-indicator,
+.sf-navbar.rtl ul ul a:hover > .sf-sub-indicator,
+.sf-navbar.rtl ul ul a:active > .sf-sub-indicator,
+.sf-navbar.rtl ul ul li:hover > a > .sf-sub-indicator,
+.sf-navbar.rtl ul ul li.sfHover > a > .sf-sub-indicator {
+  background-position: 0 0;
+}
+.sf-navbar.rtl li li:hover > ul,
+.sf-navbar.rtl li li.sfHover > ul {
+  left: auto;
+  right: 0;
+}
+.sf-navbar.rtl li li li:hover > ul,
+.sf-navbar.rtl li li li.sfHover > ul {
+  left: auto;
+  right: 12em;
+}
+.sf-navbar.rtl > li > ul {
+  background: transparent;
+  padding: 0;
+  -moz-border-radius-bottomright: 0;
+  -moz-border-radius-topleft: 0;
+  -webkit-border-top-left-radius: 0;
+  -webkit-border-bottom-right-radius: 0;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/arrows-777777-rtl.png b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/arrows-777777-rtl.png
new file mode 100644
index 00000000..3e5757fd
Binary files /dev/null and b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/arrows-777777-rtl.png differ
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/arrows-777777.png b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/arrows-777777.png
new file mode 100644
index 00000000..92f2571e
Binary files /dev/null and b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/arrows-777777.png differ
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/arrows-ffffff-rtl.png b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/arrows-ffffff-rtl.png
new file mode 100644
index 00000000..93e87522
Binary files /dev/null and b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/arrows-ffffff-rtl.png differ
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/arrows-ffffff.png b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/arrows-ffffff.png
new file mode 100644
index 00000000..4d34b389
Binary files /dev/null and b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/arrows-ffffff.png differ
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/shadow.png b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/shadow.png
new file mode 100644
index 00000000..d8badfa4
Binary files /dev/null and b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/images/shadow.png differ
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/jquery.bgiframe.min.js b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/jquery.bgiframe.min.js
new file mode 100644
index 00000000..47339286
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/jquery.bgiframe.min.js
@@ -0,0 +1,6 @@
+/* Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net)
+ * Licensed under the MIT License (LICENSE.txt).
+ *
+ * Version 2.1.2
+ */
+(function(a){a.fn.bgiframe=(a.browser.msie&&/msie 6\.0/i.test(navigator.userAgent)?function(d){d=a.extend({top:"auto",left:"auto",width:"auto",height:"auto",opacity:true,src:"javascript:false;"},d);var c='<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+d.src+'"style="display:block;position:absolute;z-index:-1;'+(d.opacity!==false?"filter:Alpha(Opacity='0');":"")+"top:"+(d.top=="auto"?"expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+'px')":b(d.top))+";left:"+(d.left=="auto"?"expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+'px')":b(d.left))+";width:"+(d.width=="auto"?"expression(this.parentNode.offsetWidth+'px')":b(d.width))+";height:"+(d.height=="auto"?"expression(this.parentNode.offsetHeight+'px')":b(d.height))+';"/>';return this.each(function(){if(a(this).children("iframe.bgiframe").length===0){this.insertBefore(document.createElement(c),this.firstChild)}})}:function(){return this});a.fn.bgIframe=a.fn.bgiframe;function b(c){return c&&c.constructor===Number?c+"px":c}})(jQuery);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/jquery.hoverIntent.minified.js b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/jquery.hoverIntent.minified.js
new file mode 100644
index 00000000..75c22ca3
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/jquery.hoverIntent.minified.js
@@ -0,0 +1,9 @@
+/**
+* hoverIntent r6 // 2011.02.26 // jQuery 1.5.1+
+* <http://cherne.net/brian/resources/jquery.hoverIntent.html>
+* 
+* @param  f  onMouseOver function || An object with configuration options
+* @param  g  onMouseOut function  || Nothing (use configuration options object)
+* @author    Brian Cherne brian(at)cherne(dot)net
+*/
+(function($){$.fn.hoverIntent=function(f,g){var cfg={sensitivity:7,interval:100,timeout:0};cfg=$.extend(cfg,g?{over:f,out:g}:f);var cX,cY,pX,pY;var track=function(ev){cX=ev.pageX;cY=ev.pageY};var compare=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);if((Math.abs(pX-cX)+Math.abs(pY-cY))<cfg.sensitivity){$(ob).unbind("mousemove",track);ob.hoverIntent_s=1;return cfg.over.apply(ob,[ev])}else{pX=cX;pY=cY;ob.hoverIntent_t=setTimeout(function(){compare(ev,ob)},cfg.interval)}};var delay=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);ob.hoverIntent_s=0;return cfg.out.apply(ob,[ev])};var handleHover=function(e){var ev=jQuery.extend({},e);var ob=this;if(ob.hoverIntent_t){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t)}if(e.type=="mouseenter"){pX=ev.pageX;pY=ev.pageY;$(ob).bind("mousemove",track);if(ob.hoverIntent_s!=1){ob.hoverIntent_t=setTimeout(function(){compare(ev,ob)},cfg.interval)}}else{$(ob).unbind("mousemove",track);if(ob.hoverIntent_s==1){ob.hoverIntent_t=setTimeout(function(){delay(ev,ob)},cfg.timeout)}}};return this.bind('mouseenter',handleHover).bind('mouseleave',handleHover)}})(jQuery);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/sfsmallscreen.js b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/sfsmallscreen.js
new file mode 100644
index 00000000..fe616249
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/sfsmallscreen.js
@@ -0,0 +1,149 @@
+/*
+ * sf-Smallscreen v1.0b - Provides small-screen compatibility for the jQuery Superfish plugin.
+ *
+ * Developer's note:
+ * Built as a part of the Superfish project for Drupal (http://drupal.org/project/superfish)
+ * Found any bug? have any cool ideas? contact me right away! http://drupal.org/user/619294/contact
+ *
+ * jQuery version: 1.3.x or higher.
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *  http://www.opensource.org/licenses/mit-license.php
+ *  http://www.gnu.org/licenses/gpl.html
+ */
+
+(function($){
+  $.fn.sfsmallscreen = function(options){
+    options = $.extend({
+      mode: 'inactive',
+      breakpoint: 768,
+      useragent: '',
+      title: '',
+      addSelected: true,
+      menuClasses: true,
+      hyperlinkClasses: true,
+      excludeClass_menu: '',
+      excludeClass_hyperlink: '',
+      includeClass_menu: '',
+      includeClass_hyperlink: ''
+    }, options);
+
+    // We need to clean up the menu from anything unnecessary.
+    function refine(menu){
+      if ($('.sf-megamenu', menu).length > 0){
+        var refined = menu.clone();
+        refined.find('div.sf-megamenu-column > ol').each(function(){
+          $(this).replaceWith('<ul>' + $(this).html() + '</ul>');
+        });
+        refined.find('div.sf-megamenu-column').each(function(){
+          $(this).replaceWith($(this).html());
+        }).end().find('.sf-megamenu-wrapper > ol').each(function(){
+          $(this).replaceWith($(this).html());
+        }).end().find('li.sf-megamenu-wrapper').each(function(){
+          $(this).replaceWith($(this).html());
+        });
+      } else {
+        var refined = menu.clone();
+      }
+      refined.find('.sf-smallscreen-remove').each(function(){
+        $(this).replaceWith($(this).html());
+      }).end().find('.sf-sub-indicator, .sf-description').each(function(){
+        $(this).remove();
+      });
+      return refined;
+    }
+
+    // Currently the only available reaction is converting the menu into a <select> element;
+    // In the next version there will be another reaction that will create a "compact" version of
+    // the menu, using <ul> element hence easy to style with CSS and so on and so forth.
+    function toSelect(menu, level){
+      var items = '';
+      $(menu).children('li').each(function(){
+        var list = $(this);
+        list.children('a, span').each(function(){
+          var item = $(this),
+          path = item.is('a') ? item.attr('href') : '',
+          itemClone = item.clone(),
+          classes = (options.hyperlinkClasses) ? ((options.excludeClass_hyperlink && itemClone.hasClass(options.excludeClass_hyperlink)) ? itemClone.removeClass(options.excludeClass_hyperlink).attr('class') : itemClone.attr('class')) : '',
+          classes = (options.includeClass_hyperlink && !itemClone.hasClass(options.includeClass_hyperlink)) ? ((options.hyperlinkClasses) ? itemClone.addClass(options.includeClass_hyperlink).attr('class') : options.includeClass_hyperlink) : classes,
+          classes = (classes) ? ' class="' + classes + '"' : '',
+          disable = item.is('span') ? ' disabled="disabled"' : '',
+          subIndicator = 1 < level ? Array(level).join('-') + ' ' : '';
+          items += '<option value="' + path + '"' + classes + disable + '>' + subIndicator + $.trim(item.text()) +'</option>';
+          list.find('> ul').each(function(){
+            items += toSelect(this, level + 1);
+          });
+        });
+      });
+      return items;
+    }
+
+    // Create the new version, hide the original.
+    function convert(menu){
+      var menuClone = menu.clone(), classes = (options.menuClasses) ? ((options.excludeClass_menu && menuClone.hasClass(options.excludeClass_menu)) ? menuClone.removeClass(options.excludeClass_menu).attr('class') : menuClone.attr('class')) : '',
+      classes = (options.includeClass_menu && !menuClone.hasClass(options.includeClass_menu)) ? ((options.menuClasses) ? menuClone.addClass(options.includeClass_menu).attr('class') : options.includeClass_menu) : classes,
+      classes = (classes) ? ' class="' + classes + '"' : '';
+      if ($('#' + menu.attr('id') + '-select').length == 0){
+        var selectList = $('<select' + classes + ' id="' + menu.attr('id') + '-select"/>'),
+        refinedMenu = refine(menu);
+        newMenu = toSelect(refinedMenu, 1);
+        selectList.append('<option>' + options.title + '</option>').append(newMenu).change(function(){
+          window.location = selectList.val();
+        });
+        if (options.addSelected) {
+          selectList.find('.active').attr("selected", !0);
+        }
+        menu.before(selectList).hide();
+      }
+    }
+
+    // Turn everything back to normal.
+    function turnBack(menu){
+      var id = '#' + menu.attr('id');
+      $(id + '-select').remove();
+      $(id).show();
+    }
+
+    // Return original object to support chaining.
+    return this.each(function(){
+      var menu = $(this),
+      mode = options.mode;
+      // The rest is crystal clear, isn't it? :)
+      switch (mode){
+        case 'always_active' :
+          convert(menu);
+        break;
+        case 'window_width' :
+          if ($(window).width() < options.breakpoint){
+            convert(menu);
+          }
+          var timer;
+          $(window).resize(function(){
+            clearTimeout(timer);
+            timer = setTimeout(function(){
+              if ($(window).width() < options.breakpoint){
+                convert(menu);
+              }
+              else {
+                turnBack(menu);
+              }
+            }, 100);
+          });
+        break;
+        case 'useragent_custom' :
+          if (options.useragent != ''){
+            var ua = RegExp(options.useragent, 'i');
+            if (navigator.userAgent.match(ua)){
+              convert(menu);
+            }
+          }
+        break;
+        case 'useragent_predefined' :
+          if (navigator.userAgent.match(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i)){
+            convert(menu);
+          }
+        break;
+      }
+    });
+  };
+})(jQuery);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/sftouchscreen.js b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/sftouchscreen.js
new file mode 100644
index 00000000..4359dde3
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/sftouchscreen.js
@@ -0,0 +1,83 @@
+/*
+ * sf-Touchscreen v1.2b - Provides touchscreen compatibility for the jQuery Superfish plugin.
+ *
+ * Developer's note:
+ * Built as a part of the Superfish project for Drupal (http://drupal.org/project/superfish)
+ * Found any bug? have any cool ideas? contact me right away! http://drupal.org/user/619294/contact
+ *
+ * jQuery version: 1.3.x or higher.
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *  http://www.opensource.org/licenses/mit-license.php
+ *  http://www.gnu.org/licenses/gpl.html
+ */
+
+(function($){
+  $.fn.sftouchscreen = function(options){
+    options = $.extend({
+      mode: 'inactive',
+      breakpoint: 768,
+      useragent: ''
+    }, options);
+
+    function activate(menu){
+      // Select hyperlinks from parent menu items.
+      menu.find('li > ul').closest('li').children('a').each(function(){
+        var item = $(this);
+        // No .toggle() here as it's not possible to reset it.
+        item.click(function(event){
+          // Already clicked? proceed to the URL.
+          if (item.hasClass('sf-clicked')){
+            window.location = item.attr('href');
+          }
+          // Prevent it otherwise.
+          else {
+            event.preventDefault();
+            item.addClass('sf-clicked');
+          }
+        }).closest('li').mouseleave(function(){
+          // Reset everything.
+          item.removeClass('sf-clicked');
+        });
+      });
+    }
+    // Return original object to support chaining.
+    return this.each(function(){
+      var menu = $(this),
+      mode = options.mode;
+      // The rest is crystal clear, isn't it? :)
+      switch (mode){
+        case 'always_active' :
+          activate(menu);
+        break;
+        case 'window_width' :
+          if ($(window).width() < options.breakpoint){
+            activate(menu);
+          }
+          var timer;
+          $(window).resize(function(){
+            clearTimeout(timer);
+            timer = setTimeout(function(){
+              if ($(window).width() < options.breakpoint){
+                activate(menu);
+              }
+            }, 100);
+          });
+        break;
+        case 'useragent_custom' :
+          if (options.useragent != ''){
+            var ua = RegExp(options.useragent, 'i');
+            if (navigator.userAgent.match(ua)){
+              activate(menu);
+            }
+          }
+        break;
+        case 'useragent_predefined' :
+          if (navigator.userAgent.match(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i)){
+            activate(menu);
+          }
+        break;
+      }
+    });
+  };
+})(jQuery);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/ABOUT_THIS_DIRECTORY.txt b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/ABOUT_THIS_DIRECTORY.txt
new file mode 100644
index 00000000..013ed1c2
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/ABOUT_THIS_DIRECTORY.txt
@@ -0,0 +1,13 @@
+About this directory
+--------------------
+
+The Superfish block configuration form scans this directory (libraries/superfish/style) in order to
+create a list of the available Superfish styles in the the Superfish library.
+
+The recommended way of styling a Superfish mneu is doing it through the theme, but alternatively you
+can add your own self-made styles to this directory too, but this requires following this tiny rule:
+
+You can remove or add files to this directory, but YOU SHOULD NOT edit the files that are part of
+the Superfish library
+
+For more information, look at the SAMPLES directory and read the README too.
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/SAMPLES/STYLE_DIRECTORY.txt b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/SAMPLES/STYLE_DIRECTORY.txt
new file mode 100644
index 00000000..0ef4697f
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/SAMPLES/STYLE_DIRECTORY.txt
@@ -0,0 +1,110 @@
+/*
+ * Sample CSS for adding new styles to the /style directory of the Superfish library.
+ * 
+ * Instructions:
+ *
+ * 1. Replace the STYLENAME (below) with the name of the new style.
+ *    For example, if the style name is drupal, the class will be sf-style-drupal .
+ *
+ * 2. Save the file as CSS with the style name as its name.
+ *    For example, if the style name is drupal the file will be drupal.css and therefore
+ *    libraries/superfish/style/drupal.css.
+ *
+ * 3. That's it! go to the block conifguration, use the new style, make sure everything is right :)
+ *
+ */
+
+.sf-menu.sf-style-STYLENAME {
+  float: left;
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-STYLENAME.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-STYLENAME ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-STYLENAME a  {
+  color: #0000ff;
+  padding: 0.75em 1em;
+}
+.sf-menu.sf-style-STYLENAME a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-STYLENAME.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-STYLENAME span.sf-description {
+  color: #0000ff;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-STYLENAME li,
+.sf-menu.sf-style-STYLENAME.sf-navbar {
+  background: #f0f0f0;
+}
+.sf-menu.sf-style-STYLENAME li li {
+  background: #e0e0e0;
+}
+.sf-menu.sf-style-STYLENAME li li li {
+  background: #d0d0d0;
+}
+.sf-menu.sf-style-STYLENAME li:hover,
+.sf-menu.sf-style-STYLENAME li.sfHover,
+.sf-menu.sf-style-STYLENAME a:focus,
+.sf-menu.sf-style-STYLENAME a:hover,
+.sf-menu.sf-style-STYLENAME a:active {
+  background: #c0c0c0;
+  outline: 0;
+}
+.sf-menu.sf-style-STYLENAME ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-STYLENAME ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-STYLENAME ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+  font-weight: bold;
+}
+.sf-menu.sf-style-STYLENAME ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  display: inline;
+  float: left;
+  width: 12em;
+}
+.sf-menu.sf-style-STYLENAME.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  float: right;
+}
+.sf-menu.sf-style-STYLENAME li.sf-parent-children-1 ul.sf-megamenu {
+  width: 12em;
+}
+.sf-menu.sf-style-STYLENAME li.sf-parent-children-2 ul.sf-megamenu {
+  width: 24em;
+}
+.sf-menu.sf-style-STYLENAME li.sf-parent-children-3 ul.sf-megamenu {
+  width: 36em;
+}
+.sf-menu.sf-style-STYLENAME li.sf-parent-children-4 ul.sf-megamenu {
+  width: 48em;
+}
+.sf-menu.sf-style-STYLENAME li.sf-parent-children-5 ul.sf-megamenu {
+  width: 60em;
+}
+.sf-menu.sf-style-STYLENAME li.sf-parent-children-6 ul.sf-megamenu {
+  width: 72em;
+}
+.sf-menu.sf-style-STYLENAME li.sf-parent-children-7 ul.sf-megamenu {
+  width: 84em;
+}
+.sf-menu.sf-style-STYLENAME li.sf-parent-children-8 ul.sf-megamenu {
+  width: 96em;
+}
+.sf-menu.sf-style-STYLENAME li.sf-parent-children-9 ul.sf-megamenu {
+  width: 108em;
+}
+.sf-menu.sf-style-STYLENAME li.sf-parent-children-10 ul.sf-megamenu {
+  width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/SAMPLES/THEMES.txt b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/SAMPLES/THEMES.txt
new file mode 100644
index 00000000..53f7e2ec
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/SAMPLES/THEMES.txt
@@ -0,0 +1,108 @@
+/*
+ * Sample CSS for adding Superfish styles to themes.
+ *
+ * Instructions:
+ * 
+ * 1. Change the #superfish-1 (below) to the ID of your Superfish menu.
+ *
+ * 2. Add the CSS to your theme, either as a separate CSS file or as a part of the main CSS file.
+ *
+ * 3. Note that by removing the .sf-style-none, the style will be applied to the menu regardless of
+ *    the Style selected in the block configuration.
+ *
+ */
+
+#superfish-1.sf-style-none {
+  float: left;
+  margin: 0;
+  padding: 0;
+}
+#superfish-1.sf-style-none.sf-navbar {
+  width: 100%;
+}
+#superfish-1.sf-style-none ul {
+  padding-left: 0;
+}
+#superfish-1.sf-style-none a  {
+  color: #0000ff;
+  padding: 0.75em 1em;
+}
+#superfish-1.sf-style-none a.sf-with-ul {
+  padding-right: 2.25em;
+}
+#superfish-1.sf-style-none.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+#superfish-1.sf-style-none span.sf-description {
+  color: #0000ff;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+#superfish-1.sf-style-none li,
+#superfish-1.sf-style-none.sf-navbar {
+  background: #f0f0f0;
+}
+#superfish-1.sf-style-none li li {
+  background: #e0e0e0;
+}
+#superfish-1.sf-style-none li li li {
+  background: #d0d0d0;
+}
+#superfish-1.sf-style-none li:hover,
+#superfish-1.sf-style-none li.sfHover,
+#superfish-1.sf-style-none a:focus,
+#superfish-1.sf-style-none a:hover,
+#superfish-1.sf-style-none a:active {
+  background: #c0c0c0;
+  outline: 0;
+}
+#superfish-1.sf-style-none ul.sf-megamenu li.sf-megamenu-wrapper ol,
+#superfish-1.sf-style-none ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+  margin: 0;
+  padding: 0;
+}
+#superfish-1.sf-style-none ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+  font-weight: bold;
+}
+#superfish-1.sf-style-none ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  display: inline;
+  float: left;
+  width: 12em;
+}
+#superfish-1.sf-style-none.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  float: right;
+}
+#superfish-1.sf-style-none li.sf-parent-children-1 ul.sf-megamenu {
+  width: 12em;
+}
+#superfish-1.sf-style-none li.sf-parent-children-2 ul.sf-megamenu {
+  width: 24em;
+}
+#superfish-1.sf-style-none li.sf-parent-children-3 ul.sf-megamenu {
+  width: 36em;
+}
+#superfish-1.sf-style-none li.sf-parent-children-4 ul.sf-megamenu {
+  width: 48em;
+}
+#superfish-1.sf-style-none li.sf-parent-children-5 ul.sf-megamenu {
+  width: 60em;
+}
+#superfish-1.sf-style-none li.sf-parent-children-6 ul.sf-megamenu {
+  width: 72em;
+}
+#superfish-1.sf-style-none li.sf-parent-children-7 ul.sf-megamenu {
+  width: 84em;
+}
+#superfish-1.sf-style-none li.sf-parent-children-8 ul.sf-megamenu {
+  width: 96em;
+}
+#superfish-1.sf-style-none li.sf-parent-children-9 ul.sf-megamenu {
+  width: 108em;
+}
+#superfish-1.sf-style-none li.sf-parent-children-10 ul.sf-megamenu {
+  width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/blue.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/blue.css
new file mode 100644
index 00000000..9a35eff1
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/blue.css
@@ -0,0 +1,106 @@
+.sf-menu.sf-style-blue {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-blue.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-blue ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-blue a {
+  border: 1px outset #003973;
+  color: #ffffff;
+  padding: 0.75em 1em;
+}
+.sf-menu.sf-style-blue a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-blue.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-blue.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-blue span.sf-description {
+  color: #ffffff;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-blue li,
+.sf-menu.sf-style-blue.sf-navbar {
+  background: #095cb1;
+}
+.sf-menu.sf-style-blue li li {
+  background: #0151a4;
+}
+.sf-menu.sf-style-blue li li li {
+  background: #00478f;
+}
+.sf-menu.sf-style-blue li:hover,
+.sf-menu.sf-style-blue li.sfHover,
+.sf-menu.sf-style-blue li.active a,
+.sf-menu.sf-style-blue a:focus,
+.sf-menu.sf-style-blue a:hover,
+.sf-menu.sf-style-blue a:active,
+.sf-menu.sf-style-blue.sf-navbar li li {
+  background: #3270c5;
+  color: #ffea00;
+}
+.sf-menu.sf-style-blue.sf-navbar li ul {
+  background-color: #3270c5;
+}
+.sf-menu.sf-style-blue.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-blue ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-blue ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-blue ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+  font-weight: bold;
+}
+.sf-menu.sf-style-blue ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  display: inline;
+  float: left;
+  width: 12em;
+}
+.sf-menu.sf-style-blue.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  float: right;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-1 ul.sf-megamenu {
+  width: 12em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-2 ul.sf-megamenu {
+  width: 24em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-3 ul.sf-megamenu {
+  width: 36em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-4 ul.sf-megamenu {
+  width: 48em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-5 ul.sf-megamenu {
+  width: 60em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-6 ul.sf-megamenu {
+  width: 72em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-7 ul.sf-megamenu {
+  width: 84em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-8 ul.sf-megamenu {
+  width: 96em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-9 ul.sf-megamenu {
+  width: 108em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-10 ul.sf-megamenu {
+  width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/coffee.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/coffee.css
new file mode 100644
index 00000000..4ade23d4
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/coffee.css
@@ -0,0 +1,107 @@
+.sf-menu.sf-style-coffee {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-coffee.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-coffee ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-coffee a {
+  border: 1px solid #381301;
+  color: #f1dec6;
+  font-weight: bold;
+  padding: 0.75em 1em;
+}
+.sf-menu.sf-style-coffee a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-coffee.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-coffee.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-coffee span.sf-description {
+  color: #f1dec6;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-coffee li,
+.sf-menu.sf-style-coffee.sf-navbar {
+  background: #210c02;
+}
+.sf-menu.sf-style-coffee li li {
+  background: #290f03;
+}
+.sf-menu.sf-style-coffee li li li {
+  background: #311304;
+}
+.sf-menu.sf-style-coffee li:hover,
+.sf-menu.sf-style-coffee li.sfHover,
+.sf-menu.sf-style-coffee li.active a,
+.sf-menu.sf-style-coffee a:focus,
+.sf-menu.sf-style-coffee a:hover,
+.sf-menu.sf-style-coffee a:active,
+.sf-menu.sf-style-coffee.sf-navbar li li {
+  background: #52250f;
+  color: #ffffff;
+}
+.sf-menu.sf-style-coffee.sf-navbar li ul {
+  background-color: #52250f;
+}
+.sf-menu.sf-style-coffee.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-coffee ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-coffee ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-coffee ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+  font-weight: bold;
+}
+.sf-menu.sf-style-coffee ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  display: inline;
+  float: left;
+  width: 12em;
+}
+.sf-menu.sf-style-coffee.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  float: right;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-1 ul.sf-megamenu {
+  width: 12em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-2 ul.sf-megamenu {
+  width: 24em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-3 ul.sf-megamenu {
+  width: 36em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-4 ul.sf-megamenu {
+  width: 48em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-5 ul.sf-megamenu {
+  width: 60em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-6 ul.sf-megamenu {
+  width: 72em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-7 ul.sf-megamenu {
+  width: 84em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-8 ul.sf-megamenu {
+  width: 96em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-9 ul.sf-megamenu {
+  width: 108em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-10 ul.sf-megamenu {
+  width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/default.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/default.css
new file mode 100644
index 00000000..793417fc
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/default.css
@@ -0,0 +1,99 @@
+.sf-menu.sf-style-default {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-default.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-default ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-default a {
+  border-left: 1px solid #fff;
+  border-top: 1px solid #CFDEFF;
+  padding: 0.75em 1em;
+}
+.sf-menu.sf-style-default a,
+.sf-menu.sf-style-default a:visited  {
+  color: #13a;
+}
+.sf-menu.sf-style-default a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-default.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-default span.sf-description {
+  color: #13a;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-default li,
+.sf-menu.sf-style-default.sf-navbar {
+  background: #BDD2FF;
+}
+.sf-menu.sf-style-default li li {
+  background: #AABDE6;
+}
+.sf-menu.sf-style-default li li li {
+  background: #9AAEDB;
+}
+.sf-menu.sf-style-default li:hover,
+.sf-menu.sf-style-default li.sfHover,
+.sf-menu.sf-style-default a:focus,
+.sf-menu.sf-style-default a:hover,
+.sf-menu.sf-style-default a:active {
+  background: #CFDEFF;
+  outline: 0;
+}
+.sf-menu.sf-style-default ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-default ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-default ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+  font-weight: bold;
+}
+.sf-menu.sf-style-default ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  display: inline;
+  float: left;
+  width: 12em;
+}
+.sf-menu.sf-style-default.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  float: right;
+}
+.sf-menu.sf-style-default li.sf-parent-children-1 ul.sf-megamenu {
+  width: 12em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-2 ul.sf-megamenu {
+  width: 24em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-3 ul.sf-megamenu {
+  width: 36em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-4 ul.sf-megamenu {
+  width: 48em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-5 ul.sf-megamenu {
+  width: 60em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-6 ul.sf-megamenu {
+  width: 72em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-7 ul.sf-megamenu {
+  width: 84em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-8 ul.sf-megamenu {
+  width: 96em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-9 ul.sf-megamenu {
+  width: 108em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-10 ul.sf-megamenu {
+  width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/light-blue.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/light-blue.css
new file mode 100644
index 00000000..c4fc8d91
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/light-blue.css
@@ -0,0 +1,112 @@
+.sf-menu.sf-style-light-blue {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-light-blue.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-light-blue ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-light-blue a {
+  border: 1px solid #b7d5f3;
+  color: #00305f;
+  padding: 0.75em 1em;
+}
+.sf-menu.sf-style-light-blue a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-light-blue.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-light-blue.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-light-blue span.sf-description {
+  color: #00305f;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-light-blue li,
+.sf-menu.sf-style-light-blue.sf-navbar {
+  background: #d9ecff;
+}
+.sf-menu.sf-style-light-blue li li {
+  background: #d1e8ff;
+}
+.sf-menu.sf-style-light-blue li li li {
+  background: #c6e3ff;
+}
+.sf-menu.sf-style-light-blue li:hover,
+.sf-menu.sf-style-light-blue li.sfHover,
+.sf-menu.sf-style-light-blue li.active a,
+.sf-menu.sf-style-light-blue a:focus,
+.sf-menu.sf-style-light-blue a:hover,
+.sf-menu.sf-style-light-blue a:active,
+.sf-menu.sf-style-light-blue.sf-navbar li li {
+  background: #b5d8fa;
+  color: #001020;
+}
+.sf-menu.sf-style-light-blue.sf-navbar li ul {
+  background-color: #b5d8fa;
+}
+.sf-menu.sf-style-light-blue.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-light-blue .sf-sub-indicator {
+  background-image: url('../images/arrows-ffffff.png');
+}
+.sf-menu.rtl.sf-style-light-blue .sf-sub-indicator {
+  background-image: url('../images/arrows-ffffff-rtl.png');
+}
+.sf-menu.sf-style-light-blue ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-light-blue ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-light-blue ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+  font-weight: bold;
+}
+.sf-menu.sf-style-light-blue ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  display: inline;
+  float: left;
+  width: 12em;
+}
+.sf-menu.sf-style-light-blue.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  float: right;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-1 ul.sf-megamenu {
+  width: 12em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-2 ul.sf-megamenu {
+  width: 24em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-3 ul.sf-megamenu {
+  width: 36em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-4 ul.sf-megamenu {
+  width: 48em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-5 ul.sf-megamenu {
+  width: 60em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-6 ul.sf-megamenu {
+  width: 72em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-7 ul.sf-megamenu {
+  width: 84em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-8 ul.sf-megamenu {
+  width: 96em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-9 ul.sf-megamenu {
+  width: 108em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-10 ul.sf-megamenu {
+  width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/pomegranate.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/pomegranate.css
new file mode 100644
index 00000000..a9dc094c
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/pomegranate.css
@@ -0,0 +1,106 @@
+.sf-menu.sf-style-pomegranate {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-pomegranate.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-pomegranate ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-pomegranate a {
+  border: 1px outset #68000e;
+  color: #ffebee;
+  padding: 0.75em 1em;
+}
+.sf-menu.sf-style-pomegranate a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-pomegranate.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-pomegranate.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-pomegranate span.sf-description {
+  color: #ffebee;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-pomegranate li,
+.sf-menu.sf-style-pomegranate.sf-navbar {
+  background: #79001c;
+}
+.sf-menu.sf-style-pomegranate li li{
+  background: #6c0019;
+}
+.sf-menu.sf-style-pomegranate li li li {
+  background: #5f0016;
+}
+.sf-menu.sf-style-pomegranate li:hover,
+.sf-menu.sf-style-pomegranate li.sfHover,
+.sf-menu.sf-style-pomegranate li.active a,
+.sf-menu.sf-style-pomegranate a:focus,
+.sf-menu.sf-style-pomegranate a:hover,
+.sf-menu.sf-style-pomegranate a:active,
+.sf-menu.sf-style-pomegranate.sf-navbar li li {
+  background: #4c0012;
+  color: #ffffff;
+}
+.sf-menu.sf-style-pomegranate.sf-navbar li ul {
+  background-color: #4c0012;
+}
+.sf-menu.sf-style-pomegranate.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-pomegranate ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-pomegranate ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-pomegranate ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+  font-weight: bold;
+}
+.sf-menu.sf-style-pomegranate ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  display: inline;
+  float: left;
+  width: 12em;
+}
+.sf-menu.sf-style-pomegranate.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  float: right;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-1 ul.sf-megamenu {
+  width: 12em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-2 ul.sf-megamenu {
+  width: 24em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-3 ul.sf-megamenu {
+  width: 36em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-4 ul.sf-megamenu {
+  width: 48em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-5 ul.sf-megamenu {
+  width: 60em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-6 ul.sf-megamenu {
+  width: 72em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-7 ul.sf-megamenu {
+  width: 84em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-8 ul.sf-megamenu {
+  width: 96em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-9 ul.sf-megamenu {
+  width: 108em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-10 ul.sf-megamenu {
+  width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-arrows-rtl.png b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-arrows-rtl.png
new file mode 100644
index 00000000..74db7e24
Binary files /dev/null and b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-arrows-rtl.png differ
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-arrows.png b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-arrows.png
new file mode 100644
index 00000000..ed6d2083
Binary files /dev/null and b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-arrows.png differ
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-background-active.png b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-background-active.png
new file mode 100644
index 00000000..e3c33106
Binary files /dev/null and b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-background-active.png differ
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-background.png b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-background.png
new file mode 100644
index 00000000..0a19fd4c
Binary files /dev/null and b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-background.png differ
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-list.png b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-list.png
new file mode 100644
index 00000000..a3b679c1
Binary files /dev/null and b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/images/simple-list.png differ
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/simple-centre-aligned.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/simple-centre-aligned.css
new file mode 100644
index 00000000..02605652
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/simple-centre-aligned.css
@@ -0,0 +1,449 @@
+.block-superfish {
+  overflow: visible;
+  width: 100%;
+}
+.sf-menu.sf-style-simple-centre-aligned {
+  float: left;
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-simple-centre-aligned a > .sf-sub-indicator {
+  top: 1.5em;
+  background-image: url('images/simple-arrows.png');
+}
+.sf-menu.sf-style-simple-centre-aligned.rtl a > .sf-sub-indicator {
+  background-image: url('images/simple-arrows-rtl.png');
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical a > .sf-sub-indicator {
+  top: 1.1em;
+}
+.sf-menu.sf-style-simple-centre-aligned li li .sf-sub-indicator,
+.sf-menu.sf-style-simple-centre-aligned li li a > .sf-sub-indicator {
+  top: 1em;
+}
+.sf-menu.sf-style-simple-centre-aligned ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-simple-centre-aligned.rtl ul {
+  padding-left: auto;
+  padding-right: 0;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.sf-shadow ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical.sf-shadow ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar.sf-shadow ul ul {
+  padding: 0 8px 7px 0 !important;
+  -webkit-border-top-right-radius: 15px;
+  -webkit-border-bottom-left-radius: 15px;
+  -moz-border-radius-topright: 15px;
+  -moz-border-radius-bottomleft: 15px;
+  border-top-right-radius: 15px;
+  border-bottom-left-radius: 15px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.sf-shadow.rtl ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical.sf-shadow.rtl ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar.sf-shadow.rtl ul ul {
+  padding: 0 0 7px 8px !important;
+  -webkit-border-top-left-radius: 15px;
+  -webkit-border-top-right-radius: 0;
+  -webkit-border-bottom-right-radius: 15px;
+  -webkit-border-bottom-left-radius: 0;
+  -moz-border-radius-topleft: 15px;
+  -moz-border-radius-topright: 0;
+  -moz-border-radius-bottomright: 15px;
+  -moz-border-radius-bottomleft: 0;
+  border-top-left-radius: 15px;
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 15px;
+  border-bottom-left-radius: 0;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal li:hover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal li.sfHover > ul {
+  top: 48px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal > li:hover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal > li.sfHover > ul {
+  left: -1px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.rtl > li:hover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.rtl > li.sfHover > ul {
+  left: auto;
+  right: -1px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal li li:hover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal li li.sfHover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical li:hover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical li.sfHover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li li li:hover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li li li.sfHover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li li li.active-trail ul {
+  top: -1px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal > li.first:hover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal > li.first.sfHover > ul {
+  left: 10px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.rtl > li.first:hover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.rtl > li.first.sfHover > ul {
+  left: auto;
+  right: 10px
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal li li li.first:hover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal li li li.first.sfHover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical li.first:hover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical li.first.sfHover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li li li li.first:hover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li li li li.first.sfHover > ul {
+  top: 10px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar > li:hover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar > li.sfHover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar > li.active-trail > ul {
+  top: 44px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li li:hover > ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li li.sfHover > ul {
+  top: 38px;
+}
+.sf-menu.sf-style-simple-centre-aligned a,
+.sf-menu.sf-style-simple-centre-aligned a:visited  {
+  color: #555555;
+  font: normal 12px Arial, Helvetica, Tahoma, Verdana, Sans-serif;
+  padding: 1.4em 1.5em;
+  text-decoration: none;
+  text-shadow: 1px 1px 0 #ffffff;
+}
+.sf-menu.sf-style-simple-centre-aligned a:focus,
+.sf-menu.sf-style-simple-centre-aligned a:hover,
+.sf-menu.sf-style-simple-centre-aligned a:active,
+.sf-menu.sf-style-simple-centre-aligned li:hover > a,
+.sf-menu.sf-style-simple-centre-aligned li.sfHover > a {
+  color: #222222;
+}
+.sf-menu.sf-style-simple-centre-aligned li li a,
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical a {
+  padding: 1em 1.5em;
+}
+.sf-menu.sf-style-simple-centre-aligned a.sf-with-ul {
+  padding-right: 3em;
+}
+.sf-menu.sf-style-simple-centre-aligned.rtl a.sf-with-ul {
+  padding-left: 3em;
+  padding-right: 1.5em;
+}
+.sf-menu.sf-style-simple-centre-aligned span.sf-description {
+  color: #666666;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal li,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li {
+  border: 1px solid #e0e0e0;
+  border-left-color: #ffffff;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal > li.first,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar > li.first {
+  border-left-color: #e0e0e0;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.rtl > li.first,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar.rtl > li.first {
+  border-left-color: #ffffff;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.rtl > li.last,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar.rtl > li.last {
+  border-left-color: #e0e0e0;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li > ul > li {
+  border: 0 none;
+  border-bottom: 1px solid #e0e0e0;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li > ul > li.first,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar.rtl li > ul > li.last {
+  border-left: 1px solid #e0e0e0;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li > ul > li.last,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar.rtl li > ul > li.first {
+  border-right: 1px solid #e0e0e0;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical li,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal li li,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li li li {
+  border: 1px solid #e0e0e0;
+  border-top-color: #ffffff;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical li.first,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal li li li.first,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li li li li.first,
+.sf-menu.sf-style-simple-centre-aligned li ul.sf-megamenu li.sf-megamenu-wrapper {
+  border-top-color: #e0e0e0;
+}
+.sf-menu.sf-style-simple-centre-aligned li {
+  background: url('images/simple-background.png') repeat-x top left #eeeeee;
+}
+.sf-menu.sf-style-simple-centre-aligned li:hover,
+.sf-menu.sf-style-simple-centre-aligned li.sfHover {
+  background: url('images/simple-background-active.png') repeat-x top left #fefefe;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal > li.first {
+  -webkit-border-top-left-radius: 8px;
+  -webkit-border-bottom-left-radius: 8px;
+  -moz-border-radius-topleft: 8px;
+  -moz-border-radius-bottomleft: 8px;
+  border-top-left-radius: 8px;
+  border-bottom-left-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal > li.last,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal li li.sf-total-children-1 > ul > li.first,
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical li li.sf-total-children-1 > ul > li.first,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li li li.sf-total-children-1 > ul > li.first {
+  -webkit-border-top-right-radius: 8px;
+  -webkit-border-bottom-right-radius: 8px;
+  -moz-border-radius-topright: 8px;
+  -moz-border-radius-bottomright: 8px;
+  border-top-right-radius: 8px;
+  border-bottom-right-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical > li.first {
+  -webkit-border-top-left-radius: 8px;
+  -webkit-border-top-right-radius: 8px;
+  -moz-border-radius-topleft: 8px;
+  -moz-border-radius-topright: 8px;
+  border-top-left-radius: 8px;
+  border-top-right-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical li.last,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal li li.last,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li li li.last,
+.sf-menu.sf-style-simple-centre-aligned li.sf-total-children-1 > ul > li.first {
+  -webkit-border-bottom-right-radius: 8px;
+  -webkit-border-bottom-left-radius: 8px;
+  -moz-border-radius-bottomright: 8px;
+  -moz-border-radius-bottomleft: 8px;
+  border-bottom-right-radius: 8px;
+  border-bottom-left-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical.sf-total-items-1 > li.first,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.sf-total-items-1 > li.first {
+  -webkit-border-radius: 8px;
+  -moz-border-radius: 8px;
+  border-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar > li.first {
+  -webkit-border-top-left-radius: 8px;
+  -moz-border-radius-topleft: 8px;
+  border-top-left-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar > li > ul > li.first {
+  -webkit-border-bottom-left-radius: 8px;
+  -moz-border-radius-bottomleft: 8px;
+  border-bottom-left-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar > li > ul > li.last {
+  -webkit-border-bottom-right-radius: 8px;
+  -moz-border-radius-bottomright: 8px;
+  border-bottom-right-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar > li.last,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li li li li.first,
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical li li.first,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal li li li.first {
+  -webkit-border-top-right-radius: 8px;
+  -moz-border-radius-topright: 8px;
+  border-top-right-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar.rtl > li.first {
+  -webkit-border-radius: 0;
+  -webkit-border-top-right-radius: 8px;
+  -moz-border-radius: 0;
+  -moz-border-radius-topright: 8px;
+  border-radius: 0;
+  border-top-right-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.rtl > li.last,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.rtl li li.sf-total-children-1 > ul > li.first,
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical.rtl li li.sf-total-children-1 > ul > li.first,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar.rtl li li li.sf-total-children-1 > ul > li.first {
+  -webkit-border-radius: 8px;
+  -webkit-border-top-right-radius: 0;
+  -webkit-border-bottom-right-radius: 0;
+  -moz-border-radius: 8px;
+  -moz-border-radius-topright: 0;
+  -moz-border-radius-bottomright: 0;
+  border-radius: 8px;
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.rtl > li.first {
+  -webkit-border-radius: 0;
+  -webkit-border-top-right-radius: 8px;
+  -webkit-border-bottom-right-radius: 8px;
+  -moz-border-radius: 0;
+  -moz-border-radius-topright: 8px;
+  -moz-border-radius-bottomright: 8px;
+  border-radius: 0;
+  border-top-right-radius: 8px;
+  border-bottom-right-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar.rtl > li > ul > li.first {
+  -webkit-border-radius: 0;
+  -webkit-border-bottom-right-radius: 8px;
+  -moz-border-radius: 0;
+  -moz-border-radius-bottomright: 8px;
+  border-radius: 0;
+  border-bottom-right-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar.rtl > li.last,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar.rtl li li li li.first,
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical.rtl li li.first,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.rtl li li li.first {
+  -webkit-border-radius: 0;
+  -webkit-border-top-left-radius: 8px;
+  -moz-border-radius: 0;
+  -moz-border-radius-topleft: 8px;
+  border-radius: 0;
+  border-top-left-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar.rtl > li > ul > li.last {
+  -webkit-border-radius: 0;
+  -webkit-border-bottom-left-radius: 8px;
+  -moz-border-radius: 0;
+  -moz-border-radius-bottomleft: 8px;
+  border-radius: 0;
+  border-bottom-left-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical.rtl li.last,
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.rtl li li.last,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar.rtl li li li.last,
+.sf-menu.sf-style-simple-centre-aligned.rtl li.sf-total-children-1 > ul > li.first {
+  -webkit-border-bottom-right-radius: 8px;
+  -webkit-border-bottom-left-radius: 8px;
+  -moz-border-radius-bottomright: 8px;
+  -moz-border-radius-bottomleft: 8px;
+  border-bottom-right-radius: 8px;
+  border-bottom-left-radius: 8px;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal,
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar {
+  text-align: center;
+  width: 100%;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar ul ul {
+  text-align: left;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal.rtl ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical.rtl ul,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar.rtl ul ul {
+  text-align: right;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal a,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar a  {
+  display: inline;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal li li a,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar li li li a {
+  display: block;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-horizontal > li,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar > li,
+.sf-menu.sf-style-simple-centre-aligned.sf-navbar > li > ul > li  {
+  display: inline;
+  float: none;
+  padding: 1em 0 !important;
+}
+.sf-menu.sf-style-simple-centre-aligned.sf-vertical > li {
+  display: block;
+  float: none;
+  margin: 0 auto;
+  text-align: left;
+}
+.sf-menu.sf-style-simple-centre-aligned li ul.sf-megamenu li ol li {
+  background: none;
+  border: 0 none;
+}
+.sf-menu.sf-style-simple-centre-aligned li ul.sf-megamenu li.sf-megamenu-wrapper {
+  -webkit-border-radius: 8px;
+  -webkit-border-top-left-radius: 0;
+  -moz-border-radius: 8px;
+  -moz-border-radius-topleft: 0;
+  border-radius: 8px;
+  border-top-left-radius: 0;
+}
+.sf-menu.sf-style-simple-centre-aligned li ul.sf-megamenu  li.sf-megamenu-wrapper,
+.sf-menu.sf-style-simple-centre-aligned li ul.sf-megamenu  li.sf-megamenu-wrapper:hover,
+.sf-menu.sf-style-simple-centre-aligned li ul.sf-megamenu  li.sf-megamenu-wrapper.sfHover {
+  background: url('images/simple-background.png') repeat-x top left #eeeeee;
+}
+.sf-menu.sf-style-simple-centre-aligned li ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-simple-centre-aligned li ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-simple-centre-aligned ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column > a {
+  font-weight: bold;
+  padding: 1em;
+}
+.sf-menu.sf-style-simple-centre-aligned ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column:hover > a {
+  color: #555555;
+}
+.sf-menu.sf-style-simple-centre-aligned ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column > a:focus,
+.sf-menu.sf-style-simple-centre-aligned ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column > a:hover,
+.sf-menu.sf-style-simple-centre-aligned ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column > a:active {
+  color: #222222;
+}
+.sf-menu.sf-style-simple-centre-aligned ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column ol li {
+  background: url('images/simple-list.png') no-repeat left center;
+  margin: 0 0 0 1em;
+  padding: 0 0 0 1em;
+}
+.sf-menu.sf-style-simple-centre-aligned.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column ol li {
+  background-position: right center;
+  margin: 0 1em 0 0;
+  padding: 0 1em 0 0;
+}
+.sf-menu.sf-style-simple-centre-aligned ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column ol li a {
+  font-size: 0.8em;
+  padding: 0.5em 0;
+}
+.sf-menu.sf-style-simple-centre-aligned ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  display: inline;
+  float: left;
+  width: 12em;
+}
+.sf-menu.sf-style-simple-centre-aligned.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  float: right;
+}
+.sf-menu.sf-style-simple-centre-aligned li.sf-parent-children-1 ul.sf-megamenu {
+  width: 12em;
+}
+.sf-menu.sf-style-simple-centre-aligned li.sf-parent-children-2 ul.sf-megamenu {
+  width: 24em;
+}
+.sf-menu.sf-style-simple-centre-aligned li.sf-parent-children-3 ul.sf-megamenu {
+  width: 36em;
+}
+.sf-menu.sf-style-simple-centre-aligned li.sf-parent-children-4 ul.sf-megamenu {
+  width: 48em;
+}
+.sf-menu.sf-style-simple-centre-aligned li.sf-parent-children-5 ul.sf-megamenu {
+  width: 60em;
+}
+.sf-menu.sf-style-simple-centre-aligned li.sf-parent-children-6 ul.sf-megamenu {
+  width: 72em;
+}
+.sf-menu.sf-style-simple-centre-aligned li.sf-parent-children-7 ul.sf-megamenu {
+  width: 84em;
+}
+.sf-menu.sf-style-simple-centre-aligned li.sf-parent-children-8 ul.sf-megamenu {
+  width: 96em;
+}
+.sf-menu.sf-style-simple-centre-aligned li.sf-parent-children-9 ul.sf-megamenu {
+  width: 108em;
+}
+.sf-menu.sf-style-simple-centre-aligned li.sf-parent-children-10 ul.sf-megamenu {
+  width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/simple.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/simple.css
new file mode 100644
index 00000000..f05607a8
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/simple/simple.css
@@ -0,0 +1,411 @@
+.block-superfish {
+  overflow: visible;
+}
+.sf-menu.sf-style-simple {
+  float: left;
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-simple a > .sf-sub-indicator {
+  top: 1.5em;
+  background-image: url('images/simple-arrows.png');
+}
+.sf-menu.sf-style-simple.rtl a > .sf-sub-indicator {
+  background-image: url('images/simple-arrows-rtl.png');
+}
+.sf-menu.sf-style-simple.sf-vertical a > .sf-sub-indicator {
+  top: 1.1em;
+}
+.sf-menu.sf-style-simple li li .sf-sub-indicator,
+.sf-menu.sf-style-simple li li a > .sf-sub-indicator {
+  top: 1em;
+}
+.sf-menu.sf-style-simple ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-simple.rtl ul {
+  padding-left: auto;
+  padding-right: 0;
+}
+.sf-menu.sf-style-simple.sf-horizontal.sf-shadow ul,
+.sf-menu.sf-style-simple.sf-vertical.sf-shadow ul,
+.sf-menu.sf-style-simple.sf-navbar.sf-shadow ul ul {
+  padding: 0 8px 7px 0 !important;
+  -webkit-border-top-right-radius: 15px;
+  -webkit-border-bottom-left-radius: 15px;
+  -moz-border-radius-topright: 15px;
+  -moz-border-radius-bottomleft: 15px;
+  border-top-right-radius: 15px;
+  border-bottom-left-radius: 15px;
+}
+.sf-menu.sf-style-simple.sf-horizontal.sf-shadow.rtl ul,
+.sf-menu.sf-style-simple.sf-vertical.sf-shadow.rtl ul,
+.sf-menu.sf-style-simple.sf-navbar.sf-shadow.rtl ul ul {
+  padding: 0 0 7px 8px !important;
+  -webkit-border-top-left-radius: 15px;
+  -webkit-border-top-right-radius: 0;
+  -webkit-border-bottom-right-radius: 15px;
+  -webkit-border-bottom-left-radius: 0;
+  -moz-border-radius-topleft: 15px;
+  -moz-border-radius-topright: 0;
+  -moz-border-radius-bottomright: 15px;
+  -moz-border-radius-bottomleft: 0;
+  border-top-left-radius: 15px;
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 15px;
+  border-bottom-left-radius: 0;
+}
+.sf-menu.sf-style-simple.sf-horizontal li:hover > ul,
+.sf-menu.sf-style-simple.sf-horizontal li.sfHover > ul {
+  top: 48px;
+}
+.sf-menu.sf-style-simple.sf-horizontal > li:hover > ul,
+.sf-menu.sf-style-simple.sf-horizontal > li.sfHover > ul {
+  left: -1px;
+}
+.sf-menu.sf-style-simple.sf-horizontal.rtl > li:hover > ul,
+.sf-menu.sf-style-simple.sf-horizontal.rtl > li.sfHover > ul {
+  left: auto;
+  right: -1px;
+}
+.sf-menu.sf-style-simple.sf-horizontal li li:hover > ul,
+.sf-menu.sf-style-simple.sf-horizontal li li.sfHover > ul,
+.sf-menu.sf-style-simple.sf-vertical li:hover > ul,
+.sf-menu.sf-style-simple.sf-vertical li.sfHover > ul,
+.sf-menu.sf-style-simple.sf-navbar li li li:hover > ul,
+.sf-menu.sf-style-simple.sf-navbar li li li.sfHover > ul,
+.sf-menu.sf-style-simple.sf-navbar li li li.active-trail ul {
+  top: -1px;
+}
+.sf-menu.sf-style-simple.sf-horizontal > li.first:hover > ul,
+.sf-menu.sf-style-simple.sf-horizontal > li.first.sfHover > ul {
+  left: 10px;
+}
+.sf-menu.sf-style-simple.sf-horizontal.rtl > li.first:hover > ul,
+.sf-menu.sf-style-simple.sf-horizontal.rtl > li.first.sfHover > ul {
+  left: auto;
+  right: 10px;
+}
+.sf-menu.sf-style-simple.sf-horizontal li li li.first:hover > ul,
+.sf-menu.sf-style-simple.sf-horizontal li li li.first.sfHover > ul,
+.sf-menu.sf-style-simple.sf-vertical li.first:hover > ul,
+.sf-menu.sf-style-simple.sf-vertical li.first.sfHover > ul,
+.sf-menu.sf-style-simple.sf-navbar li li li li.first:hover > ul,
+.sf-menu.sf-style-simple.sf-navbar li li li li.first.sfHover > ul {
+  top: 10px;
+}
+.sf-menu.sf-style-simple.sf-navbar > li:hover > ul,
+.sf-menu.sf-style-simple.sf-navbar > li.sfHover > ul,
+.sf-menu.sf-style-simple.sf-navbar > li.active-trail > ul {
+  top: 50px;
+}
+.sf-menu.sf-style-simple.sf-navbar li li:hover > ul,
+.sf-menu.sf-style-simple.sf-navbar li li.sfHover > ul {
+  top: 38px;
+}
+.sf-menu.sf-style-simple a,
+.sf-menu.sf-style-simple a:visited  {
+  color: #555555;
+  font: normal 12px Arial, Helvetica, Tahoma, Verdana, Sans-serif;
+  padding: 1.4em 1.5em;
+  text-decoration: none;
+  text-shadow: 1px 1px 0 #ffffff;
+}
+.sf-menu.sf-style-simple a:focus,
+.sf-menu.sf-style-simple a:hover,
+.sf-menu.sf-style-simple a:active,
+.sf-menu.sf-style-simple li:hover > a,
+.sf-menu.sf-style-simple li.sfHover > a {
+  color: #222222;
+}
+.sf-menu.sf-style-simple li li a,
+.sf-menu.sf-style-simple.sf-vertical a {
+  padding: 1em 1.5em;
+}
+.sf-menu.sf-style-simple a.sf-with-ul {
+  padding-right: 3em;
+}
+.sf-menu.sf-style-simple.rtl a.sf-with-ul {
+  padding-left: 3em;
+  padding-right: 1.5em;
+}
+.sf-menu.sf-style-simple span.sf-description {
+  color: #666666;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-simple.sf-horizontal li,
+.sf-menu.sf-style-simple.sf-navbar li {
+  border: 1px solid #e0e0e0;
+  border-left-color: #ffffff;
+}
+.sf-menu.sf-style-simple.sf-horizontal > li.first,
+.sf-menu.sf-style-simple.sf-navbar > li.first {
+  border-left-color: #e0e0e0;
+}
+.sf-menu.sf-style-simple.sf-horizontal.rtl > li.first,
+.sf-menu.sf-style-simple.sf-navbar.rtl > li.first {
+  border-left-color: #ffffff;
+}
+.sf-menu.sf-style-simple.sf-horizontal.rtl > li.last,
+.sf-menu.sf-style-simple.sf-navbar.rtl > li.last {
+  border-left-color: #e0e0e0;
+}
+.sf-menu.sf-style-simple.sf-navbar li > ul > li {
+  border: 0 none;
+  border-bottom: 1px solid #e0e0e0;
+}
+.sf-menu.sf-style-simple.sf-navbar li > ul > li.first,
+.sf-menu.sf-style-simple.sf-navbar.rtl li > ul > li.last {
+  border-left: 1px solid #e0e0e0;
+}
+.sf-menu.sf-style-simple.sf-navbar li > ul > li.last,
+.sf-menu.sf-style-simple.sf-navbar.rtl li > ul > li.first {
+  border-right: 1px solid #e0e0e0;
+}
+.sf-menu.sf-style-simple.sf-vertical li,
+.sf-menu.sf-style-simple.sf-horizontal li li,
+.sf-menu.sf-style-simple.sf-navbar li li li {
+  border: 1px solid #e0e0e0;
+  border-top-color: #ffffff;
+}
+.sf-menu.sf-style-simple.sf-vertical li.first,
+.sf-menu.sf-style-simple.sf-horizontal li li li.first,
+.sf-menu.sf-style-simple.sf-navbar li li li li.first,
+.sf-menu.sf-style-simple li ul.sf-megamenu li.sf-megamenu-wrapper {
+  border-top-color: #e0e0e0;
+}
+.sf-menu.sf-style-simple li {
+  background: url('images/simple-background.png') repeat-x top left #eeeeee;
+}
+.sf-menu.sf-style-simple li:hover,
+.sf-menu.sf-style-simple li.sfHover {
+  background: url('images/simple-background-active.png') repeat-x top left #fefefe;
+}
+.sf-menu.sf-style-simple.sf-horizontal > li.first {
+  -webkit-border-top-left-radius: 8px;
+  -webkit-border-bottom-left-radius: 8px;
+  -moz-border-radius-topleft: 8px;
+  -moz-border-radius-bottomleft: 8px;
+  border-top-left-radius: 8px;
+  border-bottom-left-radius: 8px;
+}
+.sf-menu.sf-style-simple.sf-horizontal > li.last,
+.sf-menu.sf-style-simple.sf-horizontal li li.sf-total-children-1 > ul > li.first,
+.sf-menu.sf-style-simple.sf-vertical li li.sf-total-children-1 > ul > li.first,
+.sf-menu.sf-style-simple.sf-navbar li li li.sf-total-children-1 > ul > li.first {
+  -webkit-border-top-right-radius: 8px;
+  -webkit-border-bottom-right-radius: 8px;
+  -moz-border-radius-topright: 8px;
+  -moz-border-radius-bottomright: 8px;
+  border-top-right-radius: 8px;
+  border-bottom-right-radius: 8px;
+}
+.sf-menu.sf-style-simple.sf-vertical > li.first {
+  -webkit-border-top-left-radius: 8px;
+  -webkit-border-top-right-radius: 8px;
+  -moz-border-radius-topleft: 8px;
+  -moz-border-radius-topright: 8px;
+  border-top-left-radius: 8px;
+  border-top-right-radius: 8px;
+}
+.sf-menu.sf-style-simple.sf-vertical li.last,
+.sf-menu.sf-style-simple.sf-horizontal li li.last,
+.sf-menu.sf-style-simple.sf-navbar li li li.last,
+.sf-menu.sf-style-simple li.sf-total-children-1 > ul > li.first {
+  -webkit-border-bottom-right-radius: 8px;
+  -webkit-border-bottom-left-radius: 8px;
+  -moz-border-radius-bottomright: 8px;
+  -moz-border-radius-bottomleft: 8px;
+  border-bottom-right-radius: 8px;
+  border-bottom-left-radius: 8px;
+}
+.sf-menu.sf-style-simple.sf-vertical.sf-total-items-1 > li.first,
+.sf-menu.sf-style-simple.sf-horizontal.sf-total-items-1 > li.first {
+  -webkit-border-radius: 8px;
+  -moz-border-radius: 8px;
+  border-radius: 8px;
+}
+.sf-menu.sf-style-simple.sf-navbar > li.first {
+  -webkit-border-top-left-radius: 8px;
+  -moz-border-radius-topleft: 8px;
+  border-top-left-radius: 8px;
+}
+.sf-menu.sf-style-simple.sf-navbar > li > ul > li.first {
+  -webkit-border-bottom-left-radius: 8px;
+  -moz-border-radius-bottomleft: 8px;
+  border-bottom-left-radius: 8px;
+}
+.sf-menu.sf-style-simple.sf-navbar > li > ul > li.last {
+  -webkit-border-bottom-right-radius: 8px;
+  -moz-border-radius-bottomright: 8px;
+  border-bottom-right-radius: 8px;
+}
+.sf-menu.sf-style-simple.sf-navbar > li.last,
+.sf-menu.sf-style-simple.sf-navbar li li li li.first,
+.sf-menu.sf-style-simple.sf-vertical li li.first,
+.sf-menu.sf-style-simple.sf-horizontal li li li.first {
+  -webkit-border-top-right-radius: 8px;
+  -moz-border-radius-topright: 8px;
+  border-top-right-radius: 8px;
+}
+.sf-menu.sf-style-simple.sf-navbar.rtl > li.first {
+  -webkit-border-radius: 0;
+  -webkit-border-top-right-radius: 8px;
+  -moz-border-radius: 0;
+  -moz-border-radius-topright: 8px;
+  border-radius: 0;
+  border-top-right-radius: 8px;
+}
+.sf-menu.sf-style-simple.sf-horizontal.rtl > li.last,
+.sf-menu.sf-style-simple.sf-horizontal.rtl li li.sf-total-children-1 > ul > li.first,
+.sf-menu.sf-style-simple.sf-vertical.rtl li li.sf-total-children-1 > ul > li.first,
+.sf-menu.sf-style-simple.sf-navbar.rtl li li li.sf-total-children-1 > ul > li.first {
+  -webkit-border-radius: 8px;
+  -webkit-border-top-right-radius: 0;
+  -webkit-border-bottom-right-radius: 0;
+  -moz-border-radius: 8px;
+  -moz-border-radius-topright: 0;
+  -moz-border-radius-bottomright: 0;
+  border-radius: 8px;
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.sf-menu.sf-style-simple.sf-horizontal.rtl > li.first {
+  -webkit-border-radius: 0;
+  -webkit-border-top-right-radius: 8px;
+  -webkit-border-bottom-right-radius: 8px;
+  -moz-border-radius: 0;
+  -moz-border-radius-topright: 8px;
+  -moz-border-radius-bottomright: 8px;
+  border-radius: 0;
+  border-top-right-radius: 8px;
+  border-bottom-right-radius: 8px;
+}
+.sf-menu.sf-style-simple.sf-navbar.rtl > li > ul > li.first {
+  -webkit-border-radius: 0;
+  -webkit-border-bottom-right-radius: 8px;
+  -moz-border-radius: 0;
+  -moz-border-radius-bottomright: 8px;
+  border-radius: 0;
+  border-bottom-right-radius: 8px;
+}
+.sf-menu.sf-style-simple.sf-navbar.rtl > li.last,
+.sf-menu.sf-style-simple.sf-navbar.rtl li li li li.first,
+.sf-menu.sf-style-simple.sf-vertical.rtl li li.first,
+.sf-menu.sf-style-simple.sf-horizontal.rtl li li li.first {
+  -webkit-border-radius: 0;
+  -webkit-border-top-left-radius: 8px;
+  -moz-border-radius: 0;
+  -moz-border-radius-topleft: 8px;
+  border-radius: 0;
+  border-top-left-radius: 8px;
+}
+.sf-menu.sf-style-simple.sf-navbar.rtl > li > ul > li.last {
+  -webkit-border-radius: 0;
+  -webkit-border-bottom-left-radius: 8px;
+  -moz-border-radius: 0;
+  -moz-border-radius-bottomleft: 8px;
+  border-radius: 0;
+  border-bottom-left-radius: 8px;
+}
+.sf-menu.sf-style-simple.sf-vertical.rtl li.last,
+.sf-menu.sf-style-simple.sf-horizontal.rtl li li.last,
+.sf-menu.sf-style-simple.sf-navbar.rtl li li li.last,
+.sf-menu.sf-style-simple.rtl li.sf-total-children-1 > ul > li.first {
+  -webkit-border-bottom-right-radius: 8px;
+  -webkit-border-bottom-left-radius: 8px;
+  -moz-border-radius-bottomright: 8px;
+  -moz-border-radius-bottomleft: 8px;
+  border-bottom-right-radius: 8px;
+  border-bottom-left-radius: 8px;
+}
+.sf-menu.sf-style-simple li ul.sf-megamenu li ol li {
+  background: none;
+  border: 0 none;
+}
+.sf-menu.sf-style-simple li ul.sf-megamenu li.sf-megamenu-wrapper {
+  -webkit-border-radius: 8px;
+  -webkit-border-top-left-radius: 0;
+  -moz-border-radius: 8px;
+  -moz-border-radius-topleft: 0;
+  border-radius: 8px;
+  border-top-left-radius: 0;
+}
+.sf-menu.sf-style-simple li ul.sf-megamenu  li.sf-megamenu-wrapper,
+.sf-menu.sf-style-simple li ul.sf-megamenu  li.sf-megamenu-wrapper:hover,
+.sf-menu.sf-style-simple li ul.sf-megamenu  li.sf-megamenu-wrapper.sfHover {
+  background: url('images/simple-background.png') repeat-x top left #eeeeee;
+}
+.sf-menu.sf-style-simple li ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-simple li ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-simple ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column > a {
+  font-weight: bold;
+  padding: 1em;
+}
+.sf-menu.sf-style-simple ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column:hover > a {
+  color: #555555;
+}
+.sf-menu.sf-style-simple ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column > a:focus,
+.sf-menu.sf-style-simple ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column > a:hover,
+.sf-menu.sf-style-simple ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column > a:active {
+  color: #222222;
+}
+.sf-menu.sf-style-simple ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column ol li {
+  background: url('images/simple-list.png') no-repeat left center;
+  margin: 0 0 0 1em;
+  padding: 0 0 0 1em;
+}
+.sf-menu.sf-style-simple.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column ol li {
+  background-position: right center;
+  margin: 0 1em 0 0;
+  padding: 0 1em 0 0;
+}
+.sf-menu.sf-style-simple ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column ol li a {
+  font-size: 0.8em;
+  padding: 0.5em 0;
+}
+.sf-menu.sf-style-simple ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  display: inline;
+  float: left;
+  width: 12em;
+}
+.sf-menu.sf-style-simple.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  float: right;
+}
+.sf-menu.sf-style-simple li.sf-parent-children-1 ul.sf-megamenu {
+  width: 12em;
+}
+.sf-menu.sf-style-simple li.sf-parent-children-2 ul.sf-megamenu {
+  width: 24em;
+}
+.sf-menu.sf-style-simple li.sf-parent-children-3 ul.sf-megamenu {
+  width: 36em;
+}
+.sf-menu.sf-style-simple li.sf-parent-children-4 ul.sf-megamenu {
+  width: 48em;
+}
+.sf-menu.sf-style-simple li.sf-parent-children-5 ul.sf-megamenu {
+  width: 60em;
+}
+.sf-menu.sf-style-simple li.sf-parent-children-6 ul.sf-megamenu {
+  width: 72em;
+}
+.sf-menu.sf-style-simple li.sf-parent-children-7 ul.sf-megamenu {
+  width: 84em;
+}
+.sf-menu.sf-style-simple li.sf-parent-children-8 ul.sf-megamenu {
+  width: 96em;
+}
+.sf-menu.sf-style-simple li.sf-parent-children-9 ul.sf-megamenu {
+  width: 108em;
+}
+.sf-menu.sf-style-simple li.sf-parent-children-10 ul.sf-megamenu {
+  width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/space-orange.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/space-orange.css
new file mode 100644
index 00000000..4b5dc389
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/space-orange.css
@@ -0,0 +1,102 @@
+.sf-menu.sf-style-space-orange {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-space-orange.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-space-orange ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-space-orange a {
+  border: 1px outset #000000;
+  color: #f1f1f1;
+  padding: 0.75em 1em;
+}
+.sf-menu.sf-style-space-orange a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-space-orange.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-space-orange.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-space-orange span.sf-description {
+  color: #f1f1f1;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-space-orange li,
+.sf-menu.sf-style-space-orange li li,
+.sf-menu.sf-style-space-orange li li li,
+.sf-menu.sf-style-space-orange.sf-navbar {
+  background: #333333;
+}
+.sf-menu.sf-style-space-orange li:hover,
+.sf-menu.sf-style-space-orange li.sfHover,
+.sf-menu.sf-style-space-orange li.active a,
+.sf-menu.sf-style-space-orange a:focus,
+.sf-menu.sf-style-space-orange a:hover,
+.sf-menu.sf-style-space-orange a:active,
+.sf-menu.sf-style-space-orange.sf-navbar li li {
+  background: #dc5300;
+  color: #ffffff;
+}
+.sf-menu.sf-style-space-orange.sf-navbar li ul {
+  background-color: #dc5300;
+}
+.sf-menu.sf-style-space-orange.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-space-orange ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-space-orange ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-space-orange ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+  font-weight: bold;
+}
+.sf-menu.sf-style-space-orange ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  display: inline;
+  float: left;
+  width: 12em;
+}
+.sf-menu.sf-style-space.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  float: right;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-1 ul.sf-megamenu {
+  width: 12em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-2 ul.sf-megamenu {
+  width: 24em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-3 ul.sf-megamenu {
+  width: 36em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-4 ul.sf-megamenu {
+  width: 48em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-5 ul.sf-megamenu {
+  width: 60em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-6 ul.sf-megamenu {
+  width: 72em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-7 ul.sf-megamenu {
+  width: 84em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-8 ul.sf-megamenu {
+  width: 96em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-9 ul.sf-megamenu {
+  width: 108em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-10 ul.sf-megamenu {
+  width: 120em;
+} 
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/space-teal.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/space-teal.css
new file mode 100644
index 00000000..0d3d5f90
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/space-teal.css
@@ -0,0 +1,102 @@
+.sf-menu.sf-style-space-teal {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-space-teal.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-space-teal ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-space-teal a {
+  border: 1px outset #000000;
+  color: #f1f1f1;
+  padding: 0.75em 1em;
+}
+.sf-menu.sf-style-space-teal a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-space-teal.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-space-teal.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-space-teal span.sf-description {
+  color: #f1f1f1;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-space-teal li,
+.sf-menu.sf-style-space-teal li li,
+.sf-menu.sf-style-space-teal li li li,
+.sf-menu.sf-style-space-teal.sf-navbar {
+  background: #333333;
+}
+.sf-menu.sf-style-space-teal li:hover,
+.sf-menu.sf-style-space-teal li.sfHover,
+.sf-menu.sf-style-space-teal li.active a,
+.sf-menu.sf-style-space-teal a:focus,
+.sf-menu.sf-style-space-teal a:hover,
+.sf-menu.sf-style-space-teal a:active,
+.sf-menu.sf-style-space-teal.sf-navbar li li {
+  background: #08997f;
+  color: #ffffff;
+}
+.sf-menu.sf-style-space-teal.sf-navbar li ul {
+  background-color: #08997f;
+}
+.sf-menu.sf-style-space-teal.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-space-teal ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-space-teal ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-space-teal ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+  font-weight: bold;
+}
+.sf-menu.sf-style-space-teal ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  display: inline;
+  float: left;
+  width: 12em;
+}
+.sf-menu.sf-style-space-teal.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  float: right;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-1 ul.sf-megamenu {
+  width: 12em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-2 ul.sf-megamenu {
+  width: 24em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-3 ul.sf-megamenu {
+  width: 36em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-4 ul.sf-megamenu {
+  width: 48em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-5 ul.sf-megamenu {
+  width: 60em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-6 ul.sf-megamenu {
+  width: 72em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-7 ul.sf-megamenu {
+  width: 84em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-8 ul.sf-megamenu {
+  width: 96em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-9 ul.sf-megamenu {
+  width: 108em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-10 ul.sf-megamenu {
+  width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/space.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/space.css
new file mode 100644
index 00000000..b6f12c3e
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/space.css
@@ -0,0 +1,102 @@
+.sf-menu.sf-style-space {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-space.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-space ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-space a {
+  border: 1px outset #000000;
+  color: #f1f1f1;
+  padding: 0.75em 1em;
+}
+.sf-menu.sf-style-space a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-space.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-space.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-space span.sf-description {
+  color: #f1f1f1;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-space li,
+.sf-menu.sf-style-space li li,
+.sf-menu.sf-style-space li li li,
+.sf-menu.sf-style-space.sf-navbar {
+  background: #333333;
+}
+.sf-menu.sf-style-space li:hover,
+.sf-menu.sf-style-space li.sfHover,
+.sf-menu.sf-style-space li.active a,
+.sf-menu.sf-style-space a:focus,
+.sf-menu.sf-style-space a:hover,
+.sf-menu.sf-style-space a:active,
+.sf-menu.sf-style-space.sf-navbar li li {
+  background: #008ad2;
+  color: #ffffff;
+}
+.sf-menu.sf-style-space.sf-navbar li ul {
+  background-color: #008ad2;
+}
+.sf-menu.sf-style-space.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-space ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-space ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-space ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+  font-weight: bold;
+}
+.sf-menu.sf-style-space ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  display: inline;
+  float: left;
+  width: 12em;
+}
+.sf-menu.sf-style-space.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  float: right;
+}
+.sf-menu.sf-style-space li.sf-parent-children-1 ul.sf-megamenu {
+  width: 12em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-2 ul.sf-megamenu {
+  width: 24em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-3 ul.sf-megamenu {
+  width: 36em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-4 ul.sf-megamenu {
+  width: 48em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-5 ul.sf-megamenu {
+  width: 60em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-6 ul.sf-megamenu {
+  width: 72em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-7 ul.sf-megamenu {
+  width: 84em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-8 ul.sf-megamenu {
+  width: 96em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-9 ul.sf-megamenu {
+  width: 108em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-10 ul.sf-megamenu {
+  width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/spring.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/spring.css
new file mode 100644
index 00000000..6136ed05
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/spring.css
@@ -0,0 +1,111 @@
+.sf-menu.sf-style-spring {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-spring.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-spring ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-spring a {
+  border: 1px solid #ffffff;
+  color: #37731f;
+  padding: 0.75em 1em;
+}
+.sf-menu.sf-style-spring a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-spring.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-spring.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-spring span.sf-description {
+  color: #37731f;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-spring li,
+.sf-menu.sf-style-spring.sf-navbar {
+  background: #ecffdf;
+}
+.sf-menu.sf-style-spring li li {
+  background: #eaffdb;
+}
+.sf-menu.sf-style-spring li li li {
+  background: #daf8c5;
+}
+.sf-menu.sf-style-spring li:hover,
+.sf-menu.sf-style-spring li.sfHover,
+.sf-menu.sf-style-spring li.active a,
+.sf-menu.sf-style-spring a:focus,
+.sf-menu.sf-style-spring a:hover,
+.sf-menu.sf-style-spring a:active,
+.sf-menu.sf-style-spring.sf-navbar li li {
+  background: #bff6a9;
+}
+.sf-menu.sf-style-spring.sf-navbar li ul {
+  background-color: #bff6a9;
+}
+.sf-menu.sf-style-spring.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-spring .sf-sub-indicator {
+  background-image: url('../images/arrows-777777.png');
+}
+.sf-menu.sf-style-spring.rtl .sf-sub-indicator {
+  background-image: url('../images/arrows-777777-rtl.png');
+}
+.sf-menu.sf-style-spring ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-spring ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-spring ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+  font-weight: bold;
+}
+.sf-menu.sf-style-spring ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  display: inline;
+  float: left;
+  width: 12em;
+}
+.sf-menu.sf-style-spring.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  float: right;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-1 ul.sf-megamenu {
+  width: 12em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-2 ul.sf-megamenu {
+  width: 24em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-3 ul.sf-megamenu {
+  width: 36em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-4 ul.sf-megamenu {
+  width: 48em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-5 ul.sf-megamenu {
+  width: 60em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-6 ul.sf-megamenu {
+  width: 72em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-7 ul.sf-megamenu {
+  width: 84em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-8 ul.sf-megamenu {
+  width: 96em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-9 ul.sf-megamenu {
+  width: 108em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-10 ul.sf-megamenu {
+  width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/white.css b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/white.css
new file mode 100644
index 00000000..0f9c2615
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/style/white.css
@@ -0,0 +1,111 @@
+.sf-menu.sf-style-white {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-white.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-white ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-white a {
+  border: 1px solid #e1e1e1;
+  color: #555555;
+  padding: 0.75em 1em;
+}
+.sf-menu.sf-style-white a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-white.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-white.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-white span.sf-description {
+  color: #555555;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-white li,
+.sf-menu.sf-style-white.sf-navbar {
+  background: #f9f9f9;
+}
+.sf-menu.sf-style-white li li {
+  background: #f7f7f7;
+}
+.sf-menu.sf-style-white li li li {
+  background: #f5f5f5;
+}
+.sf-menu.sf-style-white li:hover,
+.sf-menu.sf-style-white li.sfHover,
+.sf-menu.sf-style-white li.active a,
+.sf-menu.sf-style-white a:focus,
+.sf-menu.sf-style-white a:hover,
+.sf-menu.sf-style-white a:active,
+.sf-menu.sf-style-white.sf-navbar li li {
+  background: #e9e9e9;
+}
+.sf-menu.sf-style-white.sf-navbar li ul {
+  background-color: #e9e9e9;
+}
+.sf-menu.sf-style-white.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-white .sf-sub-indicator {
+  background-image: url('../images/arrows-777777.png');
+}
+.sf-menu.sf-style-white.rtl .sf-sub-indicator {
+  background-image: url('../images/arrows-777777-rtl.png');
+}
+.sf-menu.sf-style-white ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-white ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+  margin: 0;
+  padding: 0;
+}
+.sf-menu.sf-style-white ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+  font-weight: bold;
+}
+.sf-menu.sf-style-white ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  display: inline;
+  float: left;
+  width: 12em;
+}
+.sf-menu.sf-style-white.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+  float: right;
+}
+.sf-menu.sf-style-white li.sf-parent-children-1 ul.sf-megamenu {
+  width: 12em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-2 ul.sf-megamenu {
+  width: 24em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-3 ul.sf-megamenu {
+  width: 36em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-4 ul.sf-megamenu {
+  width: 48em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-5 ul.sf-megamenu {
+  width: 60em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-6 ul.sf-megamenu {
+  width: 72em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-7 ul.sf-megamenu {
+  width: 84em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-8 ul.sf-megamenu {
+  width: 96em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-9 ul.sf-megamenu {
+  width: 108em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-10 ul.sf-megamenu {
+  width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/superfish.js b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/superfish.js
new file mode 100644
index 00000000..4244a37e
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/superfish.js
@@ -0,0 +1,122 @@
+/*
+ * Superfish v1.4.8 - jQuery menu widget
+ * Copyright (c) 2008 Joel Birch
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *  http://www.opensource.org/licenses/mit-license.php
+ *  http://www.gnu.org/licenses/gpl.html
+ *
+ * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
+ */
+/*
+ * This is not the original jQuery Supersubs plugin.
+ * Please refer to the README for more information.
+ */
+
+(function($){
+  $.fn.superfish = function(op){
+    var sf = $.fn.superfish,
+      c = sf.c,
+      $arrow = $(['<span class="',c.arrowClass,'"> &#187;</span>'].join('')),
+      over = function(){
+        var $$ = $(this), menu = getMenu($$);
+        clearTimeout(menu.sfTimer);
+        $$.showSuperfishUl().siblings().hideSuperfishUl();
+      },
+      out = function(){
+        var $$ = $(this), menu = getMenu($$), o = sf.op;
+        clearTimeout(menu.sfTimer);
+        menu.sfTimer=setTimeout(function(){
+          o.retainPath=($.inArray($$[0],o.$path)>-1);
+          $$.hideSuperfishUl();
+          if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
+        },o.delay);
+      },
+      getMenu = function($menu){
+        var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
+        sf.op = sf.o[menu.serial];
+        return menu;
+      },
+      addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); };
+
+    return this.each(function() {
+      var s = this.serial = sf.o.length;
+      var o = $.extend({},sf.defaults,op);
+      o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
+        $(this).addClass([o.hoverClass,c.bcClass].join(' '))
+          .filter('li:has(ul)').removeClass(o.pathClass);
+      });
+      sf.o[s] = sf.op = o;
+
+      $('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() {
+        if (o.autoArrows) addArrow( $('>a:first-child',this) );
+      })
+      .not('.'+c.bcClass)
+        .hideSuperfishUl();
+
+      var $a = $('a',this);
+      $a.each(function(i){
+        var $li = $a.eq(i).parents('li');
+        $a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
+      });
+      o.onInit.call(this);
+
+    }).each(function() {
+      var menuClasses = [c.menuClass];
+      if (sf.op.dropShadows  && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass);
+      $(this).addClass(menuClasses.join(' '));
+    });
+  };
+
+  var sf = $.fn.superfish;
+  sf.o = [];
+  sf.op = {};
+  sf.IE7fix = function(){
+    var o = sf.op;
+    if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined)
+      this.toggleClass(sf.c.shadowClass+'-off');
+    };
+  sf.c = {
+    bcClass: 'sf-breadcrumb',
+    menuClass: 'sf-js-enabled',
+    anchorClass: 'sf-with-ul',
+    arrowClass: 'sf-sub-indicator',
+    shadowClass: 'sf-shadow'
+  };
+  sf.defaults = {
+    hoverClass: 'sfHover',
+    pathClass: 'overideThisToUse',
+    pathLevels: 1,
+    delay: 800,
+    animation: {opacity:'show'},
+    speed: 'normal',
+    autoArrows: true,
+    dropShadows: true,
+    disableHI: false, // true disables hoverIntent detection
+    onInit: function(){}, // callback functions
+    onBeforeShow: function(){},
+    onShow: function(){},
+    onHide: function(){}
+  };
+  $.fn.extend({
+    hideSuperfishUl : function(){
+      var o = sf.op,
+        not = (o.retainPath===true) ? o.$path : '';
+      o.retainPath = false;
+      var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
+          .find('>ul').addClass('sf-hidden');
+      o.onHide.call($ul);
+      return this;
+    },
+    showSuperfishUl : function(){
+      var o = sf.op,
+        sh = sf.c.shadowClass+'-off',
+        $ul = this.addClass(o.hoverClass)
+          .find('>ul.sf-hidden').hide().removeClass('sf-hidden');
+      sf.IE7fix.call($ul);
+      o.onBeforeShow.call($ul);
+      $ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); });
+      return this;
+    }
+  });
+})(jQuery);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/supersubs.js b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/supersubs.js
new file mode 100644
index 00000000..512f9250
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/supersubs.js
@@ -0,0 +1,94 @@
+/*
+ * Supersubs v0.2b - jQuery plugin
+ * Copyright (c) 2008 Joel Birch
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *  http://www.opensource.org/licenses/mit-license.php
+ *  http://www.gnu.org/licenses/gpl.html
+ *
+ * This plugin automatically adjusts submenu widths of suckerfish-style menus to that of
+ * their longest list item children. If you use this, please expect bugs and report them
+ * to the jQuery Google Group with the word 'Superfish' in the subject line.
+ *
+ */
+/*
+ * This is not the original jQuery Supersubs plugin.
+ * Please refer to the README for more information.
+ */
+
+(function($){ // $ will refer to jQuery within this closure
+  $.fn.supersubs = function(options){
+    var opts = $.extend({}, $.fn.supersubs.defaults, options);
+    // return original object to support chaining
+    return this.each(function() {
+      // cache selections
+      var $$ = $(this);
+      // support metadata
+      var o = $.meta ? $.extend({}, opts, $$.data()) : opts;
+      // get the font size of menu.
+      // .css('fontSize') returns various results cross-browser, so measure an em dash instead
+      var fontsize = $('<li id="menu-fontsize">&#8212;</li>').css({
+        'padding' : 0,
+        'position' : 'absolute',
+        'top' : '-99999em',
+        'width' : 'auto'
+      }).appendTo($$).width(); //clientWidth is faster, but was incorrect here
+      // remove em dash
+      $('#menu-fontsize').remove();
+
+      // Jump on level if it's a "NavBar"
+      if ($$.hasClass('sf-navbar')) {
+        $$ = $('li > ul', $$);
+      }
+      // cache all ul elements 
+      $ULs = $$.find('ul:not(.sf-megamenu)');
+      // loop through each ul in menu
+      $ULs.each(function(i) {
+        // cache this ul
+        var $ul = $ULs.eq(i);
+        // get all (li) children of this ul
+        var $LIs = $ul.children();
+        // get all anchor grand-children
+        var $As = $LIs.children('a');
+        // force content to one line and save current float property
+        var liFloat = $LIs.css('white-space','nowrap').css('float');
+        // remove width restrictions and floats so elements remain vertically stacked
+        var emWidth = $ul.add($LIs).add($As).css({
+          'float' : 'none',
+          'width'  : 'auto'
+        })
+        // this ul will now be shrink-wrapped to longest li due to position:absolute
+        // so save its width as ems. Clientwidth is 2 times faster than .width() - thanks Dan Switzer
+        .end().end()[0].clientWidth / fontsize;
+        // add more width to ensure lines don't turn over at certain sizes in various browsers
+        emWidth += o.extraWidth;
+        // restrict to at least minWidth and at most maxWidth
+        if (emWidth > o.maxWidth)    { emWidth = o.maxWidth; }
+        else if (emWidth < o.minWidth)  { emWidth = o.minWidth; }
+        emWidth += 'em';
+        // set ul to width in ems
+        $ul.css('width',emWidth);
+        // restore li floats to avoid IE bugs
+        // set li width to full width of this ul
+        // revert white-space to normal
+        $LIs.css({
+          'float' : liFloat,
+          'width' : '100%',
+          'white-space' : 'normal'
+        })
+        // update offset position of descendant ul to reflect new width of parent
+        .each(function(){
+          var $childUl = $('>ul',this);
+          var offsetDirection = $childUl.css('left')!==undefined ? 'left' : 'right';
+          $childUl.css(offsetDirection,emWidth);
+        });
+      });
+    });
+  };
+  // expose defaults
+  $.fn.supersubs.defaults = {
+    minWidth: 9, // requires em unit.
+    maxWidth: 25, // requires em unit.
+    extraWidth: 0 // extra width can ensure lines don't sometimes turn over due to slight browser differences in how they round-off values
+  };
+})(jQuery); // plugin code ends
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/supposition.js b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/supposition.js
new file mode 100644
index 00000000..c90437cc
--- /dev/null
+++ b/htmltest/sites/all/libraries/Superfish-for-Drupal-1.x/supposition.js
@@ -0,0 +1,83 @@
+/*
+ * Supposition v0.2 - an optional enhancer for Superfish jQuery menu widget.
+ *
+ * Copyright (c) 2008 Joel Birch - based mostly on work by Jesse Klaasse and credit goes largely to him.
+ * Special thanks to Karl Swedberg for valuable input.
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *  http://www.opensource.org/licenses/mit-license.php
+ *  http://www.gnu.org/licenses/gpl.html
+ */
+/*
+ * This is not the original jQuery Supersubs plugin.
+ * Please refer to the README for more information.
+ */
+
+(function($){
+  $.fn.supposition = function(){
+    var $w = $(window), /*do this once instead of every onBeforeShow call*/
+    _offset = function(dir) {
+      return window[dir == 'y' ? 'pageYOffset' : 'pageXOffset']
+      || document.documentElement && document.documentElement[dir=='y' ? 'scrollTop' : 'scrollLeft']
+      || document.body[dir=='y' ? 'scrollTop' : 'scrollLeft'];
+    },
+    onHide = function(){
+      this.css({bottom:''});
+    },
+    onBeforeShow = function(){
+      this.each(function(){
+        var $u = $(this);
+        $u.css('display','block');
+        var menuWidth = $u.width(),
+        menuParentWidth = $u.closest('li').outerWidth(true),
+        menuParentLeft = $u.closest('li').offset().left,
+        totalRight = $w.width() + _offset('x'),
+        menuRight = $u.offset().left + menuWidth,
+        exactMenuWidth = (menuRight > (menuParentWidth + menuParentLeft)) ? menuWidth - (menuRight - (menuParentWidth + menuParentLeft)) : menuWidth;  
+        if ($u.parents('.sf-js-enabled').hasClass('rtl')) {
+          if (menuParentLeft < exactMenuWidth) {
+            $u.css('left', menuParentWidth + 'px');
+            $u.css('right', 'auto');
+          }
+        }
+        else {
+          if (menuRight > totalRight && menuParentLeft > menuWidth) {
+            $u.css('right', menuParentWidth + 'px');
+            $u.css('left', 'auto');
+          }
+        }
+        var windowHeight = $w.height(),
+        offsetTop = $u.offset().top,
+        menuParentShadow = ($u.closest('.sf-menu').hasClass('sf-shadow') && $u.css('padding-bottom').length > 0) ? parseInt($u.css('padding-bottom').slice(0,-2)) : 0,
+        menuParentHeight = ($u.closest('.sf-menu').hasClass('sf-vertical')) ? '-' + menuParentShadow : $u.parent().outerHeight(true) - menuParentShadow,
+        menuHeight = $u.height(),
+        baseline = windowHeight + _offset('y');
+        var expandUp = ((offsetTop + menuHeight > baseline) && (offsetTop > menuHeight));
+        if (expandUp) {
+          $u.css('bottom', menuParentHeight + 'px');
+          $u.css('top', 'auto');
+        }
+        $u.css('display','none');
+      });
+    };
+
+    return this.each(function() {
+      var o = $.fn.superfish.o[this.serial]; /* get this menu's options */
+
+      /* if callbacks already set, store them */
+      var _onBeforeShow = o.onBeforeShow,
+      _onHide = o.onHide;
+
+      $.extend($.fn.superfish.o[this.serial],{
+        onBeforeShow: function() {
+          onBeforeShow.call(this); /* fire our Supposition callback */
+          _onBeforeShow.call(this); /* fire stored callbacks */
+        },
+        onHide: function() {
+          onHide.call(this); /* fire our Supposition callback */
+          _onHide.call(this); /* fire stored callbacks */
+        }
+      });
+    });
+  };
+})(jQuery);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor b/htmltest/sites/all/libraries/ckeditor
new file mode 120000
index 00000000..7875f570
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor
@@ -0,0 +1 @@
+ckeditor-version
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/CHANGES.md b/htmltest/sites/all/libraries/ckeditor-version/CHANGES.md
new file mode 100644
index 00000000..eb0096fc
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/CHANGES.md
@@ -0,0 +1,233 @@
+CKEditor 4 Changelog
+====================
+
+## CKEditor 4.2.1
+
+Fixed Issues:
+
+* [#10301](http://dev.ckeditor.com/ticket/10301): [IE9-10] Undo fails after 3+ consecutive paste actions with a JavaScript error.
+* [#10689](http://dev.ckeditor.com/ticket/10689): Save toolbar button saves only the first editor instance.
+* [#10368](http://dev.ckeditor.com/ticket/10368): Move language reading direction definition (`dir`) from main language file to core.
+* [#9330](http://dev.ckeditor.com/ticket/9330): Fixed pasting anchors from MS Word.
+* [#8103](http://dev.ckeditor.com/ticket/8103): Fixed pasting nested lists from MS Word.
+* [#9958](http://dev.ckeditor.com/ticket/9958): [IE9] Pressing the "OK" button will trigger the `onbeforeunload` event in the popup dialog.
+* [#10662](http://dev.ckeditor.com/ticket/10662): Fixed styles from the Styles drop-down list not registering to the ACF in case when the [Shared Spaces plugin](http://ckeditor.com/addon/sharedspace) is used.
+* [#9654](http://dev.ckeditor.com/ticket/9654): Problems with Internet Explorer 10 Quirks Mode.
+* [#9816](http://dev.ckeditor.com/ticket/9816): Floating toolbar does not reposition vertically in several cases.
+* [#10646](http://dev.ckeditor.com/ticket/10646): Removing a selected sublist or nested table with *Backspace/Delete* removes the parent element.
+* [#10623](http://dev.ckeditor.com/ticket/10623): [WebKit] Page is scrolled when opening a drop-down list.
+* [#10004](http://dev.ckeditor.com/ticket/10004): [ChromeVox] Button names are not announced.
+* [#10731](http://dev.ckeditor.com/ticket/10731): [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin breaks cloning of editor configuration.
+* It is now possible to set per instance [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin configuration instead of setting the configuration globally.
+
+## CKEditor 4.2
+
+**Important Notes:**
+
+* Dropped compatibility support for Internet Explorer 7 and Firefox 3.6.
+
+* Both the Basic and the Standard distribution packages will not contain the new [Indent Block](http://ckeditor.com/addon/indentblock) plugin. Because of this the [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) might remove block indentations from existing contents. If you want to prevent this, either [add an appropriate ACF rule to your filter](http://docs.ckeditor.com/#!/guide/dev_allowed_content_rules) or create a custom build based on the Basic/Standard package and add the Indent Block plugin in [CKBuilder](http://ckeditor.com/builder).
+
+New Features:
+
+* [#10027](http://dev.ckeditor.com/ticket/10027): Separated list and block indentation into two plugins: [Indent List](http://ckeditor.com/addon/indentlist) and [Indent Block](http://ckeditor.com/addon/indentblock).
+* [#8244](http://dev.ckeditor.com/ticket/8244): Use *(Shift+)Tab* to indent and outdent lists.
+* [#10281](http://dev.ckeditor.com/ticket/10281): The [jQuery Adapter](http://docs.ckeditor.com/#!/guide/dev_jquery) is now available. Several jQuery-related issues fixed: [#8261](http://dev.ckeditor.com/ticket/8261), [#9077](http://dev.ckeditor.com/ticket/9077), [#8710](http://dev.ckeditor.com/ticket/8710), [#8530](http://dev.ckeditor.com/ticket/8530), [#9019](http://dev.ckeditor.com/ticket/9019), [#6181](http://dev.ckeditor.com/ticket/6181), [#7876](http://dev.ckeditor.com/ticket/7876), [#6906](http://dev.ckeditor.com/ticket/6906).
+* [#10042](http://dev.ckeditor.com/ticket/10042): Introduced [`config.title`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-title) setting to change the human-readable title of the editor.
+* [#9794](http://dev.ckeditor.com/ticket/9794): Added [`editor.onChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-change) event.
+* [#9923](http://dev.ckeditor.com/ticket/9923): HiDPI support in the editor UI. HiDPI icons for [Moono skin](http://ckeditor.com/addon/moono) added.
+* [#8031](http://dev.ckeditor.com/ticket/8031): Handle `required` attributes on `<textarea>` elements &mdash; introduced [`editor.required`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-required) event.
+* [#10280](http://dev.ckeditor.com/ticket/10280): Ability to replace `<textarea>` elements with the inline editor.
+
+Fixed Issues:
+
+* [#10599](http://dev.ckeditor.com/ticket/10599): [Indent](http://ckeditor.com/addon/indent) plugin is no longer required by the [List](http://ckeditor.com/addon/list) plugin.
+* [#10370](http://dev.ckeditor.com/ticket/10370): Inconsistency in data events between framed and inline editors.
+* [#10438](http://dev.ckeditor.com/ticket/10438): [FF, IE] No selection is done on an editable element on executing [`editor.setData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setData).
+
+## CKEditor 4.1.3
+
+New Features:
+
+* Added new translation: Indonesian.
+
+Fixed Issues:
+
+* [#10644](http://dev.ckeditor.com/ticket/10644): Fixed a critical bug when pasting plain text in Blink-based browsers.
+* [#5189](http://dev.ckeditor.com/ticket/5189): [Find/Replace](http://ckeditor.com/addon/find) dialog window: rename "Cancel" button to "Close".
+* [#10562](http://dev.ckeditor.com/ticket/10562): [Housekeeping] Unified CSS gradient filter formats in the [Moono](http://ckeditor.com/addon/moono) skin.
+* [#10537](http://dev.ckeditor.com/ticket/10537): Advanced Content Filter should register a default rule for [`config.shiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-shiftEnterMode).
+* [#10610](http://dev.ckeditor.com/ticket/10610): [`CKEDITOR.dialog.addIframe()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dialog-static-method-addIframe) incorrectly sets the iframe size in dialog windows.
+
+## CKEditor 4.1.2
+
+New Features:
+
+* Added new translation: Sinhala.
+
+Fixed Issues:
+
+* [#10339](http://dev.ckeditor.com/ticket/10339): Fixed: Error thrown when inserted data was totally stripped out after filtering and processing.
+* [#10298](http://dev.ckeditor.com/ticket/10298): Fixed: Data processor breaks attributes containing protected parts.
+* [#10367](http://dev.ckeditor.com/ticket/10367): Fixed: [`editable.insertText()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-method-insertText) loses characters when `RegExp` replace controls are being inserted.
+* [#10165](http://dev.ckeditor.com/ticket/10165): [IE] Access denied error when `document.domain` has been altered.
+* [#9761](http://dev.ckeditor.com/ticket/9761): Update the *Backspace* key state in [`keystrokeHandler.blockedKeystrokes`](http://docs.ckeditor.com/#!/api/CKEDITOR.keystrokeHandler-property-blockedKeystrokes) when calling [`editor.setReadOnly()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setReadOnly).
+* [#6504](http://dev.ckeditor.com/ticket/6504): Fixed: Race condition while loading several [`config.customConfig`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-customConfig) files.
+* [#10146](http://dev.ckeditor.com/ticket/10146): [Firefox] Empty lines are being removed while [`config.enterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode) is [`CKEDITOR.ENTER_BR`](http://docs.ckeditor.com/#!/api/CKEDITOR-property-ENTER_BR).
+* [#10360](http://dev.ckeditor.com/ticket/10360): Fixed: ARIA `role="application"` should not be used for dialog windows.
+* [#10361](http://dev.ckeditor.com/ticket/10361): Fixed: ARIA `role="application"` should not be used for floating panels.
+* [#10510](http://dev.ckeditor.com/ticket/10510): Introduced unique voice labels to differentiate between different editor instances.
+* [#9945](http://dev.ckeditor.com/ticket/9945): [iOS] Scrolling not possible on iPad.
+* [#10389](http://dev.ckeditor.com/ticket/10389): Fixed: Invalid HTML in the "Text and Table" template.
+* [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin user interface was changed to match CKEditor 4 style.
+
+## CKEditor 4.1.1
+
+New Features:
+
+* Added new translation: Albanian.
+
+Fixed Issues:
+
+* [#10172](http://dev.ckeditor.com/ticket/10172): Pressing *Delete* or *Backspace* in an empty table cell moves the cursor to the next/previous cell.
+* [#10219](http://dev.ckeditor.com/ticket/10219): Error thrown when destroying an editor instance in parallel with a `mouseup` event.
+* [#10265](http://dev.ckeditor.com/ticket/10265): Wrong loop type in the [File Browser](http://ckeditor.com/addon/filebrowser) plugin.
+* [#10249](http://dev.ckeditor.com/ticket/10249): Wrong undo/redo states at start.
+* [#10268](http://dev.ckeditor.com/ticket/10268): [Show Blocks](http://ckeditor.com/addon/showblocks) does not recover after switching to Source view.
+* [#9995](http://dev.ckeditor.com/ticket/9995): HTML code in the `<textarea>` should not be modified by the [`htmlDataProcessor`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlDataProcessor).
+* [#10320](http://dev.ckeditor.com/ticket/10320): [Justify](http://ckeditor.com/addon/justify) plugin should add elements to Advanced Content Filter based on current [Enter mode](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode).
+* [#10260](http://dev.ckeditor.com/ticket/10260): Fixed: Advanced Content Filter blocks [`tabSpaces`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-tabSpaces). Unified `data-cke-*` attributes filtering.
+* [#10315](http://dev.ckeditor.com/ticket/10315): [WebKit] [Undo manager](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.undo.UndoManager) should not record snapshots after a filling character was added/removed.
+* [#10291](http://dev.ckeditor.com/ticket/10291): [WebKit] Space after a filling character should be secured.
+* [#10330](http://dev.ckeditor.com/ticket/10330): [WebKit] The filling character is not removed on `keydown` in specific cases.
+* [#10285](http://dev.ckeditor.com/ticket/10285): Fixed: Styled text pasted from MS Word causes an infinite loop.
+* [#10131](http://dev.ckeditor.com/ticket/10131): Fixed: [`undoManager.update()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.undo.UndoManager-method-update) does not refresh the command state.
+* [#10337](http://dev.ckeditor.com/ticket/10337): Fixed: Unable to remove `<s>` using [Remove Format](http://ckeditor.com/addon/removeformat).
+
+## CKEditor 4.1
+
+Fixed Issues:
+
+* [#10192](http://dev.ckeditor.com/ticket/10192): Closing lists with the *Enter* key does not work with [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) in several cases.
+* [#10191](http://dev.ckeditor.com/ticket/10191): Fixed allowed content rules unification, so the [`filter.allowedContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.filter-property-allowedContent) property always contains rules in the same format.
+* [#10224](http://dev.ckeditor.com/ticket/10224): Advanced Content Filter does not remove non-empty `<a>` elements anymore.
+* Minor issues in plugin integration with Advanced Content Filter:
+  * [#10166](http://dev.ckeditor.com/ticket/10166): Added transformation from the `align` attribute to `float` style to preserve backward compatibility after the introduction of Advanced Content Filter.
+  * [#10195](http://dev.ckeditor.com/ticket/10195): [Image](http://ckeditor.com/addon/image) plugin no longer registers rules for links to Advanced Content Filter.
+  * [#10213](http://dev.ckeditor.com/ticket/10213): [Justify](http://ckeditor.com/addon/justify) plugin is now correctly registering rules to Advanced Content Filter when [`config.justifyClasses`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-justifyClasses) is defined.
+
+## CKEditor 4.1 RC
+
+New Features:
+
+* [#9829](http://dev.ckeditor.com/ticket/9829): Advanced Content Filter - data and features activation based on editor configuration.
+
+  Brand new data filtering system that works in 2 modes:
+
+  * Based on loaded features (toolbar items, plugins) - the data will be filtered according to what the editor in its
+  current configuration can handle.
+  * Based on [`config.allowedContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent) rules - the data
+  will be filtered and the editor features (toolbar items, commands, keystrokes) will be enabled if they are allowed.
+
+  See the `datafiltering.html` sample, [guides](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) and [`CKEDITOR.filter` API documentation](http://docs.ckeditor.com/#!/api/CKEDITOR.filter).
+* [#9387](http://dev.ckeditor.com/ticket/9387): Reintroduced [Shared Spaces](http://ckeditor.com/addon/sharedspace) - the ability to display toolbar and bottom editor space in selected locations and to share them by different editor instances.
+* [#9907](http://dev.ckeditor.com/ticket/9907): Added the [`contentPreview`](http://docs.ckeditor.com/#!/api/CKEDITOR-event-contentPreview) event for preview data manipulation.
+* [#9713](http://dev.ckeditor.com/ticket/9713): Introduced the [Source Dialog](http://ckeditor.com/addon/sourcedialog) plugin that brings raw HTML editing for inline editor instances.
+* Included in [#9829](http://dev.ckeditor.com/ticket/9829): Introduced new events, [`toHtml`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-toHtml) and [`toDataFormat`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-toDataFormat), allowing for better integration with data processing.
+* [#9981](http://dev.ckeditor.com/ticket/9981): Added ability to filter [`htmlParser.fragment`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.fragment), [`htmlParser.element`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.element) etc. by many [`htmlParser.filter`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter)s before writing structure to an HTML string.
+* Included in [#10103](http://dev.ckeditor.com/ticket/10103):
+  * Introduced the [`editor.status`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-status) property to make it easier to check the current status of the editor.
+  * Default [`command`](http://docs.ckeditor.com/#!/api/CKEDITOR.command) state is now [`CKEDITOR.TRISTATE_DISABLE`](http://docs.ckeditor.com/#!/api/CKEDITOR-property-TRISTATE_DISABLED). It will be activated on [`editor.instanceReady`](http://docs.ckeditor.com/#!/api/CKEDITOR-event-instanceReady) or immediately after being added if the editor is already initialized.
+* [#9796](http://dev.ckeditor.com/ticket/9796): Introduced `<s>` as a default tag for strikethrough, which replaces obsolete `<strike>` in HTML5.
+
+## CKEditor 4.0.3
+
+Fixed Issues:
+
+* [#10196](http://dev.ckeditor.com/ticket/10196): Fixed context menus not opening with keyboard shortcuts when [Autogrow](http://ckeditor.com/addon/autogrow) is enabled.
+* [#10212](http://dev.ckeditor.com/ticket/10212): [IE7-10] Undo command throws errors after multiple switches between Source and WYSIWYG view.
+* [#10219](http://dev.ckeditor.com/ticket/10219): [Inline editor] Error thrown after calling [`editor.destroy()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-destroy).
+
+## CKEditor 4.0.2
+
+Fixed Issues:
+
+* [#9779](http://dev.ckeditor.com/ticket/9779): Fixed overriding [`CKEDITOR.getUrl()`](http://docs.ckeditor.com/#!/api/CKEDITOR-method-getUrl) with `CKEDITOR_GETURL`.
+* [#9772](http://dev.ckeditor.com/ticket/9772): Custom buttons in the dialog window footer have different look and size ([Moono](http://ckeditor.com/addon/moono), [Kama](http://ckeditor.com/addon/kama) skins).
+* [#9029](http://dev.ckeditor.com/ticket/9029): Custom styles added with the [`stylesSet.add()`](http://docs.ckeditor.com/#!/api/CKEDITOR.stylesSet-method-add) are displayed in the wrong order.
+* [#9887](http://dev.ckeditor.com/ticket/9887): Disable [Magic Line](http://ckeditor.com/addon/magicline) when [`editor.readOnly`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-readOnly) is set.
+* [#9882](http://dev.ckeditor.com/ticket/9882): Fixed empty document title on [`editor.getData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getData) if set via the Document Properties dialog window.
+* [#9773](http://dev.ckeditor.com/ticket/9773): Fixed rendering problems with selection fields in the Kama skin.
+* [#9851](http://dev.ckeditor.com/ticket/9851): The [`selectionChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-selectionChange) event is not fired when mouse selection ended outside editable.
+* [#9903](http://dev.ckeditor.com/ticket/9903): [Inline editor] Bad positioning of floating space with page horizontal scroll.
+* [#9872](http://dev.ckeditor.com/ticket/9872): [`editor.checkDirty()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-checkDirty) returns `true` when called onload. Removed the obsolete `editor.mayBeDirty` flag.
+* [#9893](http://dev.ckeditor.com/ticket/9893): [IE] Fixed broken toolbar when editing mixed direction content in Quirks mode.
+* [#9845](http://dev.ckeditor.com/ticket/9845): Fixed TAB navigation in the [Link](http://ckeditor.com/addon/link) dialog window when the Anchor option is used and no anchors are available.
+* [#9883](http://dev.ckeditor.com/ticket/9883): Maximizing was making the entire page editable with [divarea](http://ckeditor.com/addon/divarea)-based editors.
+* [#9940](http://dev.ckeditor.com/ticket/9940): [Firefox] Navigating back to a page with the editor was making the entire page editable.
+* [#9966](http://dev.ckeditor.com/ticket/9966): Fixed: Unable to type square brackets with French keyboard layout. Changed [Magic Line](http://ckeditor.com/addon/magicline) keystrokes.
+* [#9507](http://dev.ckeditor.com/ticket/9507): [Firefox] Selection is moved before editable position when the editor is focused for the first time.
+* [#9947](http://dev.ckeditor.com/ticket/9947): [WebKit] Editor overflows parent container in some edge cases.
+* [#10105](http://dev.ckeditor.com/ticket/10105): Fixed: Broken [sourcearea](http://ckeditor.com/addon/sourcearea) view when an RTL language is set.
+* [#10123](http://dev.ckeditor.com/ticket/10123): [WebKit] Fixed: Several dialog windows have broken layout since the latest WebKit release.
+* [#10152](http://dev.ckeditor.com/ticket/10152): Fixed: Invalid ARIA property used on menu items.
+
+## CKEditor 4.0.1.1
+
+Fixed Issues:
+
+* Security update: Added protection against XSS attack and possible path disclosure in the PHP sample.
+
+## CKEditor 4.0.1
+
+Fixed Issues:
+
+* [#9655](http://dev.ckeditor.com/ticket/9655): Support for IE Quirks Mode in the new [Moono skin](http://ckeditor.com/addon/moono).
+* Accessibility issues (mainly in inline editor): [#9364](http://dev.ckeditor.com/ticket/9364), [#9368](http://dev.ckeditor.com/ticket/9368), [#9369](http://dev.ckeditor.com/ticket/9369), [#9370](http://dev.ckeditor.com/ticket/9370), [#9541](http://dev.ckeditor.com/ticket/9541), [#9543](http://dev.ckeditor.com/ticket/9543), [#9841](http://dev.ckeditor.com/ticket/9841), [#9844](http://dev.ckeditor.com/ticket/9844).
+* [Magic Line](http://ckeditor.com/addon/magicline) plugin:
+    * [#9481](http://dev.ckeditor.com/ticket/9481): Added accessibility support for Magic Line.
+    * [#9509](http://dev.ckeditor.com/ticket/9509): Added Magic Line support for forms.
+    * [#9573](http://dev.ckeditor.com/ticket/9573): Magic Line does not disappear on `mouseout` in a specific case.
+* [#9754](http://dev.ckeditor.com/ticket/9754): [WebKit] Cutting & pasting simple unformatted text generates an inline wrapper in WebKit browsers.
+* [#9456](http://dev.ckeditor.com/ticket/9456): [Chrome] Properly paste bullet list style from MS Word.
+* [#9699](http://dev.ckeditor.com/ticket/9699), [#9758](http://dev.ckeditor.com/ticket/9758): Improved selection locking when selecting by dragging.
+* Context menu:
+    * [#9712](http://dev.ckeditor.com/ticket/9712): Opening the context menu destroys editor focus.
+    * [#9366](http://dev.ckeditor.com/ticket/9366): Context menu should be displayed over the floating toolbar.
+    * [#9706](http://dev.ckeditor.com/ticket/9706): Context menu generates a JavaScript error in inline mode when the editor is attached to a header element.
+* [#9800](http://dev.ckeditor.com/ticket/9800): Hide float panel when resizing the window.
+* [#9721](http://dev.ckeditor.com/ticket/9721): Padding in content of div-based editor puts the editing area under the bottom UI space.
+* [#9528](http://dev.ckeditor.com/ticket/9528): Host page `box-sizing` style should not influence the editor UI elements.
+* [#9503](http://dev.ckeditor.com/ticket/9503): [Form Elements](http://ckeditor.com/addon/forms) plugin adds context menu listeners only on supported input types. Added support for `tel`, `email`, `search` and `url` input types.
+* [#9769](http://dev.ckeditor.com/ticket/9769): Improved floating toolbar positioning in a narrow window.
+* [#9875](http://dev.ckeditor.com/ticket/9875): Table dialog window does not populate width correctly.
+* [#8675](http://dev.ckeditor.com/ticket/8675): Deleting cells in a nested table removes the outer table cell.
+* [#9815](http://dev.ckeditor.com/ticket/9815): Cannot edit dialog window fields in an editor initialized in the jQuery UI modal dialog.
+* [#8888](http://dev.ckeditor.com/ticket/8888): CKEditor dialog windows do not show completely in a small window.
+* [#9360](http://dev.ckeditor.com/ticket/9360): [Inline editor] Blocks shown for a `<div>` element stay permanently even after the user exits editing the `<div>`.
+* [#9531](http://dev.ckeditor.com/ticket/9531): [Firefox & Inline editor] Toolbar is lost when closing the Format drop-down list by clicking its button.
+* [#9553](http://dev.ckeditor.com/ticket/9553): Table width incorrectly set when the `border-width` style is specified.
+* [#9594](http://dev.ckeditor.com/ticket/9594): Cannot tab past CKEditor when it is in read-only mode.
+* [#9658](http://dev.ckeditor.com/ticket/9658): [IE9] Justify not working on selected images.
+* [#9686](http://dev.ckeditor.com/ticket/9686): Added missing contents styles for `<pre>` elements.
+* [#9709](http://dev.ckeditor.com/ticket/9709): [Paste from Word](http://ckeditor.com/addon/pastefromword) should not depend on configuration from other styles.
+* [#9726](http://dev.ckeditor.com/ticket/9726): Removed [Color Dialog](http://ckeditor.com/addon/colordialog) plugin dependency from [Table Tools](http://ckeditor.com/addon/tabletools).
+* [#9765](http://dev.ckeditor.com/ticket/9765): Toolbar Collapse command documented incorrectly in the [Accessibility Instructions](http://ckeditor.com/addon/a11yhelp) dialog window.
+* [#9771](http://dev.ckeditor.com/ticket/9771): [WebKit & Opera] Fixed scrolling issues when pasting.
+* [#9787](http://dev.ckeditor.com/ticket/9787): [IE9] `onChange` is not fired for checkboxes in dialogs.
+* [#9842](http://dev.ckeditor.com/ticket/9842): [Firefox 17] When opening a toolbar menu for the first time and pressing the *Down Arrow* key, focus goes to the next toolbar button instead of the menu options.
+* [#9847](http://dev.ckeditor.com/ticket/9847): [Elements Path](http://ckeditor.com/addon/elementspath) should not be initialized in the inline editor.
+* [#9853](http://dev.ckeditor.com/ticket/9853): [`editor.addRemoveFormatFilter()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-addRemoveFormatFilter) is exposed before it really works.
+* [#8893](http://dev.ckeditor.com/ticket/8893): Value of the [`pasteFromWordCleanupFile`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-pasteFromWordCleanupFile) configuration option is now taken from the instance configuration.
+* [#9693](http://dev.ckeditor.com/ticket/9693): Removed "Live Preview" checkbox from UI color picker.
+
+
+## CKEditor 4.0
+
+The first stable release of the new CKEditor 4 code line.
+
+The CKEditor JavaScript API has been kept compatible with CKEditor 4, whenever
+possible. The list of relevant changes can be found in the [API Changes page of
+the CKEditor 4 documentation][1].
+
+[1]: http://docs.ckeditor.com/#!/guide/dev_api_changes "API Changes"
diff --git a/htmltest/sites/all/libraries/ckeditor-version/LICENSE.md b/htmltest/sites/all/libraries/ckeditor-version/LICENSE.md
new file mode 100644
index 00000000..d447c67b
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/LICENSE.md
@@ -0,0 +1,1264 @@
+Software License Agreement
+==========================
+
+CKEditor - The text editor for Internet - http://ckeditor.com
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+
+Licensed under the terms of any of the following licenses at your
+choice:
+
+ - GNU General Public License Version 2 or later (the "GPL")
+   http://www.gnu.org/licenses/gpl.html
+   (See Appendix A)
+
+ - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+   http://www.gnu.org/licenses/lgpl.html
+   (See Appendix B)
+
+ - Mozilla Public License Version 1.1 or later (the "MPL")
+   http://www.mozilla.org/MPL/MPL-1.1.html
+   (See Appendix C)
+
+You are not required to, but if you want to explicitly declare the
+license you have chosen to be bound to when using, reproducing,
+modifying and distributing this software, just include a text file
+titled "legal.txt" in your version of this software, indicating your
+license choice. In any case, your choice will not restrict any
+recipient of your version of this software to use, reproduce, modify
+and distribute this software under any of the above licenses.
+
+Sources of Intellectual Property Included in CKEditor
+-----------------------------------------------------
+
+Where not otherwise indicated, all CKEditor content is authored by
+CKSource engineers and consists of CKSource-owned intellectual
+property. In some specific instances, CKEditor will incorporate work
+done by developers outside of CKSource with their express permission.
+
+Trademarks
+----------
+
+CKEditor is a trademark of CKSource - Frederico Knabben. All other brand
+and product names are trademarks, registered trademarks or service
+marks of their respective holders.
+
+---
+
+Appendix A: The GPL License
+---------------------------
+
+GNU GENERAL PUBLIC LICENSE
+Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software-to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+GNU GENERAL PUBLIC LICENSE
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+
+Appendix B: The LGPL License
+----------------------------
+
+GNU LESSER GENERAL PUBLIC LICENSE
+Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software-to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages-typically libraries-of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+GNU LESSER GENERAL PUBLIC LICENSE
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+
+Appendix C: The MPL License
+---------------------------
+
+MOZILLA PUBLIC LICENSE
+Version 1.1
+
+1. Definitions.
+
+     1.0.1. "Commercial Use" means distribution or otherwise making the
+     Covered Code available to a third party.
+
+     1.1. "Contributor" means each entity that creates or contributes to
+     the creation of Modifications.
+
+     1.2. "Contributor Version" means the combination of the Original
+     Code, prior Modifications used by a Contributor, and the Modifications
+     made by that particular Contributor.
+
+     1.3. "Covered Code" means the Original Code or Modifications or the
+     combination of the Original Code and Modifications, in each case
+     including portions thereof.
+
+     1.4. "Electronic Distribution Mechanism" means a mechanism generally
+     accepted in the software development community for the electronic
+     transfer of data.
+
+     1.5. "Executable" means Covered Code in any form other than Source
+     Code.
+
+     1.6. "Initial Developer" means the individual or entity identified
+     as the Initial Developer in the Source Code notice required by Exhibit
+     A.
+
+     1.7. "Larger Work" means a work which combines Covered Code or
+     portions thereof with code not governed by the terms of this License.
+
+     1.8. "License" means this document.
+
+     1.8.1. "Licensable" means having the right to grant, to the maximum
+     extent possible, whether at the time of the initial grant or
+     subsequently acquired, any and all of the rights conveyed herein.
+
+     1.9. "Modifications" means any addition to or deletion from the
+     substance or structure of either the Original Code or any previous
+     Modifications. When Covered Code is released as a series of files, a
+     Modification is:
+          A. Any addition to or deletion from the contents of a file
+          containing Original Code or previous Modifications.
+
+          B. Any new file that contains any part of the Original Code or
+          previous Modifications.
+
+     1.10. "Original Code" means Source Code of computer software code
+     which is described in the Source Code notice required by Exhibit A as
+     Original Code, and which, at the time of its release under this
+     License is not already Covered Code governed by this License.
+
+     1.10.1. "Patent Claims" means any patent claim(s), now owned or
+     hereafter acquired, including without limitation,  method, process,
+     and apparatus claims, in any patent Licensable by grantor.
+
+     1.11. "Source Code" means the preferred form of the Covered Code for
+     making modifications to it, including all modules it contains, plus
+     any associated interface definition files, scripts used to control
+     compilation and installation of an Executable, or source code
+     differential comparisons against either the Original Code or another
+     well known, available Covered Code of the Contributor's choice. The
+     Source Code can be in a compressed or archival form, provided the
+     appropriate decompression or de-archiving software is widely available
+     for no charge.
+
+     1.12. "You" (or "Your")  means an individual or a legal entity
+     exercising rights under, and complying with all of the terms of, this
+     License or a future version of this License issued under Section 6.1.
+     For legal entities, "You" includes any entity which controls, is
+     controlled by, or is under common control with You. For purposes of
+     this definition, "control" means (a) the power, direct or indirect,
+     to cause the direction or management of such entity, whether by
+     contract or otherwise, or (b) ownership of more than fifty percent
+     (50%) of the outstanding shares or beneficial ownership of such
+     entity.
+
+2. Source Code License.
+
+     2.1. The Initial Developer Grant.
+     The Initial Developer hereby grants You a world-wide, royalty-free,
+     non-exclusive license, subject to third party intellectual property
+     claims:
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Initial Developer to use, reproduce,
+          modify, display, perform, sublicense and distribute the Original
+          Code (or portions thereof) with or without Modifications, and/or
+          as part of a Larger Work; and
+
+          (b) under Patents Claims infringed by the making, using or
+          selling of Original Code, to make, have made, use, practice,
+          sell, and offer for sale, and/or otherwise dispose of the
+          Original Code (or portions thereof).
+
+          (c) the licenses granted in this Section 2.1(a) and (b) are
+          effective on the date Initial Developer first distributes
+          Original Code under the terms of this License.
+
+          (d) Notwithstanding Section 2.1(b) above, no patent license is
+          granted: 1) for code that You delete from the Original Code; 2)
+          separate from the Original Code;  or 3) for infringements caused
+          by: i) the modification of the Original Code or ii) the
+          combination of the Original Code with other software or devices.
+
+     2.2. Contributor Grant.
+     Subject to third party intellectual property claims, each Contributor
+     hereby grants You a world-wide, royalty-free, non-exclusive license
+
+          (a)  under intellectual property rights (other than patent or
+          trademark) Licensable by Contributor, to use, reproduce, modify,
+          display, perform, sublicense and distribute the Modifications
+          created by such Contributor (or portions thereof) either on an
+          unmodified basis, with other Modifications, as Covered Code
+          and/or as part of a Larger Work; and
+
+          (b) under Patent Claims infringed by the making, using, or
+          selling of  Modifications made by that Contributor either alone
+          and/or in combination with its Contributor Version (or portions
+          of such combination), to make, use, sell, offer for sale, have
+          made, and/or otherwise dispose of: 1) Modifications made by that
+          Contributor (or portions thereof); and 2) the combination of
+          Modifications made by that Contributor with its Contributor
+          Version (or portions of such combination).
+
+          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+          effective on the date Contributor first makes Commercial Use of
+          the Covered Code.
+
+          (d)    Notwithstanding Section 2.2(b) above, no patent license is
+          granted: 1) for any code that Contributor has deleted from the
+          Contributor Version; 2)  separate from the Contributor Version;
+          3)  for infringements caused by: i) third party modifications of
+          Contributor Version or ii)  the combination of Modifications made
+          by that Contributor with other software  (except as part of the
+          Contributor Version) or other devices; or 4) under Patent Claims
+          infringed by Covered Code in the absence of Modifications made by
+          that Contributor.
+
+3. Distribution Obligations.
+
+     3.1. Application of License.
+     The Modifications which You create or to which You contribute are
+     governed by the terms of this License, including without limitation
+     Section 2.2. The Source Code version of Covered Code may be
+     distributed only under the terms of this License or a future version
+     of this License released under Section 6.1, and You must include a
+     copy of this License with every copy of the Source Code You
+     distribute. You may not offer or impose any terms on any Source Code
+     version that alters or restricts the applicable version of this
+     License or the recipients' rights hereunder. However, You may include
+     an additional document offering the additional rights described in
+     Section 3.5.
+
+     3.2. Availability of Source Code.
+     Any Modification which You create or to which You contribute must be
+     made available in Source Code form under the terms of this License
+     either on the same media as an Executable version or via an accepted
+     Electronic Distribution Mechanism to anyone to whom you made an
+     Executable version available; and if made available via Electronic
+     Distribution Mechanism, must remain available for at least twelve (12)
+     months after the date it initially became available, or at least six
+     (6) months after a subsequent version of that particular Modification
+     has been made available to such recipients. You are responsible for
+     ensuring that the Source Code version remains available even if the
+     Electronic Distribution Mechanism is maintained by a third party.
+
+     3.3. Description of Modifications.
+     You must cause all Covered Code to which You contribute to contain a
+     file documenting the changes You made to create that Covered Code and
+     the date of any change. You must include a prominent statement that
+     the Modification is derived, directly or indirectly, from Original
+     Code provided by the Initial Developer and including the name of the
+     Initial Developer in (a) the Source Code, and (b) in any notice in an
+     Executable version or related documentation in which You describe the
+     origin or ownership of the Covered Code.
+
+     3.4. Intellectual Property Matters
+          (a) Third Party Claims.
+          If Contributor has knowledge that a license under a third party's
+          intellectual property rights is required to exercise the rights
+          granted by such Contributor under Sections 2.1 or 2.2,
+          Contributor must include a text file with the Source Code
+          distribution titled "LEGAL" which describes the claim and the
+          party making the claim in sufficient detail that a recipient will
+          know whom to contact. If Contributor obtains such knowledge after
+          the Modification is made available as described in Section 3.2,
+          Contributor shall promptly modify the LEGAL file in all copies
+          Contributor makes available thereafter and shall take other steps
+          (such as notifying appropriate mailing lists or newsgroups)
+          reasonably calculated to inform those who received the Covered
+          Code that new knowledge has been obtained.
+
+          (b) Contributor APIs.
+          If Contributor's Modifications include an application programming
+          interface and Contributor has knowledge of patent licenses which
+          are reasonably necessary to implement that API, Contributor must
+          also include this information in the LEGAL file.
+
+               (c)    Representations.
+          Contributor represents that, except as disclosed pursuant to
+          Section 3.4(a) above, Contributor believes that Contributor's
+          Modifications are Contributor's original creation(s) and/or
+          Contributor has sufficient rights to grant the rights conveyed by
+          this License.
+
+     3.5. Required Notices.
+     You must duplicate the notice in Exhibit A in each file of the Source
+     Code.  If it is not possible to put such notice in a particular Source
+     Code file due to its structure, then You must include such notice in a
+     location (such as a relevant directory) where a user would be likely
+     to look for such a notice.  If You created one or more Modification(s)
+     You may add your name as a Contributor to the notice described in
+     Exhibit A.  You must also duplicate this License in any documentation
+     for the Source Code where You describe recipients' rights or ownership
+     rights relating to Covered Code.  You may choose to offer, and to
+     charge a fee for, warranty, support, indemnity or liability
+     obligations to one or more recipients of Covered Code. However, You
+     may do so only on Your own behalf, and not on behalf of the Initial
+     Developer or any Contributor. You must make it absolutely clear than
+     any such warranty, support, indemnity or liability obligation is
+     offered by You alone, and You hereby agree to indemnify the Initial
+     Developer and every Contributor for any liability incurred by the
+     Initial Developer or such Contributor as a result of warranty,
+     support, indemnity or liability terms You offer.
+
+     3.6. Distribution of Executable Versions.
+     You may distribute Covered Code in Executable form only if the
+     requirements of Section 3.1-3.5 have been met for that Covered Code,
+     and if You include a notice stating that the Source Code version of
+     the Covered Code is available under the terms of this License,
+     including a description of how and where You have fulfilled the
+     obligations of Section 3.2. The notice must be conspicuously included
+     in any notice in an Executable version, related documentation or
+     collateral in which You describe recipients' rights relating to the
+     Covered Code. You may distribute the Executable version of Covered
+     Code or ownership rights under a license of Your choice, which may
+     contain terms different from this License, provided that You are in
+     compliance with the terms of this License and that the license for the
+     Executable version does not attempt to limit or alter the recipient's
+     rights in the Source Code version from the rights set forth in this
+     License. If You distribute the Executable version under a different
+     license You must make it absolutely clear that any terms which differ
+     from this License are offered by You alone, not by the Initial
+     Developer or any Contributor. You hereby agree to indemnify the
+     Initial Developer and every Contributor for any liability incurred by
+     the Initial Developer or such Contributor as a result of any such
+     terms You offer.
+
+     3.7. Larger Works.
+     You may create a Larger Work by combining Covered Code with other code
+     not governed by the terms of this License and distribute the Larger
+     Work as a single product. In such a case, You must make sure the
+     requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+     If it is impossible for You to comply with any of the terms of this
+     License with respect to some or all of the Covered Code due to
+     statute, judicial order, or regulation then You must: (a) comply with
+     the terms of this License to the maximum extent possible; and (b)
+     describe the limitations and the code they affect. Such description
+     must be included in the LEGAL file described in Section 3.4 and must
+     be included with all distributions of the Source Code. Except to the
+     extent prohibited by statute or regulation, such description must be
+     sufficiently detailed for a recipient of ordinary skill to be able to
+     understand it.
+
+5. Application of this License.
+
+     This License applies to code to which the Initial Developer has
+     attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+     6.1. New Versions.
+     Netscape Communications Corporation ("Netscape") may publish revised
+     and/or new versions of the License from time to time. Each version
+     will be given a distinguishing version number.
+
+     6.2. Effect of New Versions.
+     Once Covered Code has been published under a particular version of the
+     License, You may always continue to use it under the terms of that
+     version. You may also choose to use such Covered Code under the terms
+     of any subsequent version of the License published by Netscape. No one
+     other than Netscape has the right to modify the terms applicable to
+     Covered Code created under this License.
+
+     6.3. Derivative Works.
+     If You create or use a modified version of this License (which you may
+     only do in order to apply it to code which is not already Covered Code
+     governed by this License), You must (a) rename Your license so that
+     the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+     "MPL", "NPL" or any confusingly similar phrase do not appear in your
+     license (except to note that your license differs from this License)
+     and (b) otherwise make it clear that Your version of the license
+     contains terms which differ from the Mozilla Public License and
+     Netscape Public License. (Filling in the name of the Initial
+     Developer, Original Code or Contributor in the notice described in
+     Exhibit A shall not of themselves be deemed to be modifications of
+     this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+     8.1.  This License and the rights granted hereunder will terminate
+     automatically if You fail to comply with terms herein and fail to cure
+     such breach within 30 days of becoming aware of the breach. All
+     sublicenses to the Covered Code which are properly granted shall
+     survive any termination of this License. Provisions which, by their
+     nature, must remain in effect beyond the termination of this License
+     shall survive.
+
+     8.2.  If You initiate litigation by asserting a patent infringement
+     claim (excluding declatory judgment actions) against Initial Developer
+     or a Contributor (the Initial Developer or Contributor against whom
+     You file such action is referred to as "Participant")  alleging that:
+
+     (a)  such Participant's Contributor Version directly or indirectly
+     infringes any patent, then any and all rights granted by such
+     Participant to You under Sections 2.1 and/or 2.2 of this License
+     shall, upon 60 days notice from Participant terminate prospectively,
+     unless if within 60 days after receipt of notice You either: (i)
+     agree in writing to pay Participant a mutually agreeable reasonable
+     royalty for Your past and future use of Modifications made by such
+     Participant, or (ii) withdraw Your litigation claim with respect to
+     the Contributor Version against such Participant.  If within 60 days
+     of notice, a reasonable royalty and payment arrangement are not
+     mutually agreed upon in writing by the parties or the litigation claim
+     is not withdrawn, the rights granted by Participant to You under
+     Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+     the 60 day notice period specified above.
+
+     (b)  any software, hardware, or device, other than such Participant's
+     Contributor Version, directly or indirectly infringes any patent, then
+     any rights granted to You by such Participant under Sections 2.1(b)
+     and 2.2(b) are revoked effective as of the date You first made, used,
+     sold, distributed, or had made, Modifications made by that
+     Participant.
+
+     8.3.  If You assert a patent infringement claim against Participant
+     alleging that such Participant's Contributor Version directly or
+     indirectly infringes any patent where such claim is resolved (such as
+     by license or settlement) prior to the initiation of patent
+     infringement litigation, then the reasonable value of the licenses
+     granted by such Participant under Sections 2.1 or 2.2 shall be taken
+     into account in determining the amount or value of any payment or
+     license.
+
+     8.4.  In the event of termination under Sections 8.1 or 8.2 above,
+     all end user license agreements (excluding distributors and resellers)
+     which have been validly granted by You or any distributor hereunder
+     prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+     The Covered Code is a "commercial item," as that term is defined in
+     48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+     software" and "commercial computer software documentation," as such
+     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+     all U.S. Government End Users acquire Covered Code with only those
+     rights set forth herein.
+
+11. MISCELLANEOUS.
+
+     This License represents the complete agreement concerning subject
+     matter hereof. If any provision of this License is held to be
+     unenforceable, such provision shall be reformed only to the extent
+     necessary to make it enforceable. This License shall be governed by
+     California law provisions (except to the extent applicable law, if
+     any, provides otherwise), excluding its conflict-of-law provisions.
+     With respect to disputes in which at least one party is a citizen of,
+     or an entity chartered or registered to do business in the United
+     States of America, any litigation relating to this License shall be
+     subject to the jurisdiction of the Federal Courts of the Northern
+     District of California, with venue lying in Santa Clara County,
+     California, with the losing party responsible for costs, including
+     without limitation, court costs and reasonable attorneys' fees and
+     expenses. The application of the United Nations Convention on
+     Contracts for the International Sale of Goods is expressly excluded.
+     Any law or regulation which provides that the language of a contract
+     shall be construed against the drafter shall not apply to this
+     License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+     As between Initial Developer and the Contributors, each party is
+     responsible for claims and damages arising, directly or indirectly,
+     out of its utilization of rights under this License and You agree to
+     work with Initial Developer and Contributors to distribute such
+     responsibility on an equitable basis. Nothing herein is intended or
+     shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+     Initial Developer may designate portions of the Covered Code as
+     "Multiple-Licensed".  "Multiple-Licensed" means that the Initial
+     Developer permits you to utilize portions of the Covered Code under
+     Your choice of the NPL or the alternative licenses, if any, specified
+     by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+     ``The contents of this file are subject to the Mozilla Public License
+     Version 1.1 (the "License"); you may not use this file except in
+     compliance with the License. You may obtain a copy of the License at
+     http://www.mozilla.org/MPL/
+
+     Software distributed under the License is distributed on an "AS IS"
+     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+     License for the specific language governing rights and limitations
+     under the License.
+
+     The Original Code is ______________________________________.
+
+     The Initial Developer of the Original Code is ________________________.
+     Portions created by ______________________ are Copyright (C) ______
+     _______________________. All Rights Reserved.
+
+     Contributor(s): ______________________________________.
+
+     Alternatively, the contents of this file may be used under the terms
+     of the _____ license (the  "[___] License"), in which case the
+     provisions of [______] License are applicable instead of those
+     above.  If you wish to allow use of your version of this file only
+     under the terms of the [____] License and not to allow others to use
+     your version of this file under the MPL, indicate your decision by
+     deleting  the provisions above and replace  them with the notice and
+     other provisions required by the [___] License.  If you do not delete
+     the provisions above, a recipient may use your version of this file
+     under either the MPL or the [___] License."
+
+     [NOTE: The text of this Exhibit A may differ slightly from the text of
+     the notices in the Source Code files of the Original Code. You should
+     use the text of this Exhibit A rather than the text found in the
+     Original Code Source Code for Your Modifications.]
diff --git a/htmltest/sites/all/libraries/ckeditor-version/README.md b/htmltest/sites/all/libraries/ckeditor-version/README.md
new file mode 100644
index 00000000..378c267e
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/README.md
@@ -0,0 +1,39 @@
+CKEditor 4
+==========
+
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.  
+http://ckeditor.com - See LICENSE.md for license information.
+
+CKEditor is a text editor to be used inside web pages. It's not a replacement
+for desktop text editors like Word or OpenOffice, but a component to be used as
+part of web applications and websites.
+
+## Documentation
+
+The full editor documentation is available online at the following address:
+http://docs.ckeditor.com
+
+## Installation
+
+Installing CKEditor is an easy task. Just follow these simple steps:
+
+ 1. **Download** the latest version from the CKEditor website:
+    http://ckeditor.com. You should have already completed this step, but be
+    sure you have the very latest version.
+ 2. **Extract** (decompress) the downloaded file into the root of your website.
+
+**Note:** CKEditor is by default installed in the `ckeditor` folder. You can
+place the files in whichever you want though.
+
+## Checking Your Installation
+
+The editor comes with a few sample pages that can be used to verify that
+installation proceeded properly. Take a look at the `samples` directory.
+
+To test your installation, just call the following page at your website:
+
+	http://<your site>/<CKEditor installation path>/samples/index.html
+
+For example:
+
+	http://www.example.com/ckeditor/samples/index.html
diff --git a/htmltest/sites/all/libraries/ckeditor-version/adapters/jquery.js b/htmltest/sites/all/libraries/ckeditor-version/adapters/jquery.js
new file mode 100644
index 00000000..2851ea44
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/adapters/jquery.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(a){CKEDITOR.config.jqueryOverrideVal="undefined"==typeof CKEDITOR.config.jqueryOverrideVal?!0:CKEDITOR.config.jqueryOverrideVal;"undefined"!=typeof a&&(a.extend(a.fn,{ckeditorGet:function(){var a=this.eq(0).data("ckeditorInstance");if(!a)throw"CKEditor is not initialized yet, use ckeditor() with a callback.";return a},ckeditor:function(g,d){if(!CKEDITOR.env.isCompatible)throw Error("The environment is incompatible.");if(!a.isFunction(g))var k=d,d=g,g=k;var i=[],d=d||{};this.each(function(){var b=
+a(this),c=b.data("ckeditorInstance"),f=b.data("_ckeditorInstanceLock"),h=this,j=new a.Deferred;i.push(j.promise());if(c&&!f)g&&g.apply(c,[this]),j.resolve();else if(f)c.once("instanceReady",function(){setTimeout(function(){c.element?(c.element.$==h&&g&&g.apply(c,[h]),j.resolve()):setTimeout(arguments.callee,100)},0)},null,null,9999);else{if(d.autoUpdateElement||"undefined"==typeof d.autoUpdateElement&&CKEDITOR.config.autoUpdateElement)d.autoUpdateElementJquery=!0;d.autoUpdateElement=!1;b.data("_ckeditorInstanceLock",
+!0);c=a(this).is("textarea")?CKEDITOR.replace(h,d):CKEDITOR.inline(h,d);b.data("ckeditorInstance",c);c.on("instanceReady",function(d){var e=d.editor;setTimeout(function(){if(e.element){d.removeListener();e.on("dataReady",function(){b.trigger("dataReady.ckeditor",[e])});e.on("setData",function(a){b.trigger("setData.ckeditor",[e,a.data])});e.on("getData",function(a){b.trigger("getData.ckeditor",[e,a.data])},999);e.on("destroy",function(){b.trigger("destroy.ckeditor",[e])});e.on("save",function(){a(h.form).submit();
+return!1},null,null,20);if(e.config.autoUpdateElementJquery&&b.is("textarea")&&a(h.form).length){var c=function(){b.ckeditor(function(){e.updateElement()})};a(h.form).submit(c);a(h.form).bind("form-pre-serialize",c);b.bind("destroy.ckeditor",function(){a(h.form).unbind("submit",c);a(h.form).unbind("form-pre-serialize",c)})}e.on("destroy",function(){b.removeData("ckeditorInstance")});b.removeData("_ckeditorInstanceLock");b.trigger("instanceReady.ckeditor",[e]);g&&g.apply(e,[h]);j.resolve()}else setTimeout(arguments.callee,
+100)},0)},null,null,9999)}});var f=new a.Deferred;this.promise=f.promise();a.when.apply(this,i).then(function(){f.resolve()});this.editor=this.eq(0).data("ckeditorInstance");return this}}),CKEDITOR.config.jqueryOverrideVal&&(a.fn.val=CKEDITOR.tools.override(a.fn.val,function(g){return function(d){if(arguments.length){var k=this,i=[],f=this.each(function(){var b=a(this),c=b.data("ckeditorInstance");if(b.is("textarea")&&c){var f=new a.Deferred;c.setData(d,function(){f.resolve()});i.push(f.promise());
+return!0}return g.call(b,d)});if(i.length){var b=new a.Deferred;a.when.apply(this,i).done(function(){b.resolveWith(k)});return b.promise()}return f}var f=a(this).eq(0),c=f.data("ckeditorInstance");return f.is("textarea")&&c?c.getData():g.call(f)}})))})(window.jQuery);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/build-config.js b/htmltest/sites/all/libraries/ckeditor-version/build-config.js
new file mode 100644
index 00000000..c9c7d385
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/build-config.js
@@ -0,0 +1,166 @@
+﻿
+/**
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.html or http://ckeditor.com/license
+ */
+
+/**
+ * This file was added automatically by CKEditor builder.
+ * You may re-use it at any time at http://ckeditor.com/builder to build CKEditor again.
+ * 
+ * NOTE: 
+ *    This file is not used by CKEditor, you may remove it.
+ *    Changing this file will not change your CKEditor configuration.
+ */
+
+var CKBUILDER_CONFIG = {
+	skin: 'moono',
+	preset: 'full',
+	ignore: [
+		'dev',
+		'.gitignore',
+		'.gitattributes',
+		'README.md',
+		'.mailmap'
+	],
+	plugins : {
+		'about' : 1,
+		'a11yhelp' : 1,
+		'dialogadvtab' : 1,
+		'basicstyles' : 1,
+		'bidi' : 1,
+		'blockquote' : 1,
+		'clipboard' : 1,
+		'colorbutton' : 1,
+		'colordialog' : 1,
+		'templates' : 1,
+		'contextmenu' : 1,
+		'div' : 1,
+		'resize' : 1,
+		'toolbar' : 1,
+		'elementspath' : 1,
+		'enterkey' : 1,
+		'entities' : 1,
+		'filebrowser' : 1,
+		'find' : 1,
+		'flash' : 1,
+		'floatingspace' : 1,
+		'font' : 1,
+		'forms' : 1,
+		'format' : 1,
+		'horizontalrule' : 1,
+		'htmlwriter' : 1,
+		'iframe' : 1,
+		'wysiwygarea' : 1,
+		'image' : 1,
+		'indentblock' : 1,
+		'indentlist' : 1,
+		'smiley' : 1,
+		'justify' : 1,
+		'link' : 1,
+		'list' : 1,
+		'liststyle' : 1,
+		'magicline' : 1,
+		'maximize' : 1,
+		'newpage' : 1,
+		'pagebreak' : 1,
+		'pastetext' : 1,
+		'pastefromword' : 1,
+		'preview' : 1,
+		'print' : 1,
+		'removeformat' : 1,
+		'save' : 1,
+		'selectall' : 1,
+		'showblocks' : 1,
+		'showborders' : 1,
+		'sourcearea' : 1,
+		'specialchar' : 1,
+		'scayt' : 1,
+		'stylescombo' : 1,
+		'tab' : 1,
+		'table' : 1,
+		'tabletools' : 1,
+		'undo' : 1,
+		'wsc' : 1,
+		'dialog' : 1,
+		'dialogui' : 1,
+		'panelbutton' : 1,
+		'button' : 1,
+		'floatpanel' : 1,
+		'panel' : 1,
+		'menu' : 1,
+		'popup' : 1,
+		'fakeobjects' : 1,
+		'richcombo' : 1,
+		'listblock' : 1,
+		'indent' : 1,
+		'menubutton' : 1
+	},
+	languages : {
+		'af' : 1,
+		'sq' : 1,
+		'ar' : 1,
+		'eu' : 1,
+		'bn' : 1,
+		'bs' : 1,
+		'bg' : 1,
+		'ca' : 1,
+		'zh-cn' : 1,
+		'zh' : 1,
+		'hr' : 1,
+		'cs' : 1,
+		'da' : 1,
+		'nl' : 1,
+		'en' : 1,
+		'en-au' : 1,
+		'en-ca' : 1,
+		'en-gb' : 1,
+		'eo' : 1,
+		'et' : 1,
+		'fo' : 1,
+		'fi' : 1,
+		'fr' : 1,
+		'fr-ca' : 1,
+		'gl' : 1,
+		'ka' : 1,
+		'de' : 1,
+		'el' : 1,
+		'gu' : 1,
+		'he' : 1,
+		'hi' : 1,
+		'hu' : 1,
+		'is' : 1,
+		'id' : 1,
+		'it' : 1,
+		'ja' : 1,
+		'km' : 1,
+		'ko' : 1,
+		'ku' : 1,
+		'lv' : 1,
+		'lt' : 1,
+		'mk' : 1,
+		'ms' : 1,
+		'mn' : 1,
+		'no' : 1,
+		'nb' : 1,
+		'fa' : 1,
+		'pl' : 1,
+		'pt-br' : 1,
+		'pt' : 1,
+		'ro' : 1,
+		'ru' : 1,
+		'sr' : 1,
+		'sr-latn' : 1,
+		'si' : 1,
+		'sk' : 1,
+		'sl' : 1,
+		'es' : 1,
+		'sv' : 1,
+		'th' : 1,
+		'tr' : 1,
+		'ug' : 1,
+		'uk' : 1,
+		'vi' : 1,
+		'cy' : 1,
+	}
+};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/ckeditor-version b/htmltest/sites/all/libraries/ckeditor-version/ckeditor-version
new file mode 120000
index 00000000..7875f570
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/ckeditor-version
@@ -0,0 +1 @@
+ckeditor-version
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/ckeditor.js b/htmltest/sites/all/libraries/ckeditor-version/ckeditor.js
new file mode 100644
index 00000000..0bd6f490
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/ckeditor.js
@@ -0,0 +1,929 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var b={timestamp:"D8AD",version:"4.2.1",revision:"5010dd4",rnd:Math.floor(900*Math.random())+100,_:{pending:[]},status:"unloaded",basePath:function(){var a=window.CKEDITOR_BASEPATH||"";if(!a)for(var b=document.getElementsByTagName("script"),e=0;e<b.length;e++){var c=b[e].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(c){a=c[1];break}}-1==a.indexOf(":/")&&(a=0===a.indexOf("/")?location.href.match(/^.*?:\/\/[^\/]*/)[0]+a:location.href.match(/^[^\?]*\/(?:)/)[0]+
+a);if(!a)throw'The CKEditor installation path could not be automatically detected. Please set the global variable "CKEDITOR_BASEPATH" before creating editor instances.';return a}(),getUrl:function(a){-1==a.indexOf(":/")&&0!==a.indexOf("/")&&(a=this.basePath+a);this.timestamp&&("/"!=a.charAt(a.length-1)&&!/[&?]t=/.test(a))&&(a+=(0<=a.indexOf("?")?"&":"?")+"t="+this.timestamp);return a},domReady:function(){function a(){try{document.addEventListener?(document.removeEventListener("DOMContentLoaded",a,
+!1),b()):document.attachEvent&&"complete"===document.readyState&&(document.detachEvent("onreadystatechange",a),b())}catch(e){}}function b(){for(var a;a=e.shift();)a()}var e=[];return function(b){e.push(b);"complete"===document.readyState&&setTimeout(a,1);if(1==e.length)if(document.addEventListener)document.addEventListener("DOMContentLoaded",a,!1),window.addEventListener("load",a,!1);else if(document.attachEvent){document.attachEvent("onreadystatechange",a);window.attachEvent("onload",a);b=!1;try{b=
+!window.frameElement}catch(d){}if(document.documentElement.doScroll&&b){var c=function(){try{document.documentElement.doScroll("left")}catch(b){setTimeout(c,1);return}a()};c()}}}}()},c=window.CKEDITOR_GETURL;if(c){var a=b.getUrl;b.getUrl=function(f){return c.call(b,f)||a.call(b,f)}}return b}());
+CKEDITOR.event||(CKEDITOR.event=function(){},CKEDITOR.event.implementOn=function(b){var c=CKEDITOR.event.prototype,a;for(a in c)b[a]==void 0&&(b[a]=c[a])},CKEDITOR.event.prototype=function(){function b(f){var b=c(this);return b[f]||(b[f]=new a(f))}var c=function(a){a=a.getPrivate&&a.getPrivate()||a._||(a._={});return a.events||(a.events={})},a=function(a){this.name=a;this.listeners=[]};a.prototype={getListenerIndex:function(a){for(var b=0,e=this.listeners;b<e.length;b++)if(e[b].fn==a)return b;return-1}};
+return{define:function(a,d){var e=b.call(this,a);CKEDITOR.tools.extend(e,d,true)},on:function(a,d,e,c,j){function i(b,g,m,q){b={name:a,sender:this,editor:b,data:g,listenerData:c,stop:m,cancel:q,removeListener:k};return d.call(e,b)===false?false:b.data}function k(){q.removeListener(a,d)}var m=b.call(this,a);if(m.getListenerIndex(d)<0){m=m.listeners;e||(e=this);isNaN(j)&&(j=10);var q=this;i.fn=d;i.priority=j;for(var r=m.length-1;r>=0;r--)if(m[r].priority<=j){m.splice(r+1,0,i);return{removeListener:k}}m.unshift(i)}return{removeListener:k}},
+once:function(){var a=arguments[1];arguments[1]=function(b){b.removeListener();return a.apply(this,arguments)};return this.on.apply(this,arguments)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,b=function(){a=1},e=0,h=function(){e=1};return function(j,i,k){var m=c(this)[j],j=a,q=e;a=e=0;if(m){var r=m.listeners;if(r.length)for(var r=r.slice(0),l,g=0;g<r.length;g++){if(m.errorProof)try{l=r[g].call(this,
+k,i,b,h)}catch(p){}else l=r[g].call(this,k,i,b,h);l===false?e=1:typeof l!="undefined"&&(i=l);if(a||e)break}}i=e?false:typeof i=="undefined"?true:i;a=j;e=q;return i}}(),fireOnce:function(a,b,e){b=this.fire(a,b,e);delete c(this)[a];return b},removeListener:function(a,b){var e=c(this)[a];if(e){var h=e.getListenerIndex(b);h>=0&&e.listeners.splice(h,1)}},removeAllListeners:function(){var a=c(this),b;for(b in a)delete a[b]},hasListeners:function(a){return(a=c(this)[a])&&a.listeners.length>0}}}());
+CKEDITOR.editor||(CKEDITOR.editor=function(){CKEDITOR._.pending.push([this,arguments]);CKEDITOR.event.call(this)},CKEDITOR.editor.prototype.fire=function(b,c){b in{instanceReady:1,loaded:1}&&(this[b]=true);return CKEDITOR.event.prototype.fire.call(this,b,c,this)},CKEDITOR.editor.prototype.fireOnce=function(b,c){b in{instanceReady:1,loaded:1}&&(this[b]=true);return CKEDITOR.event.prototype.fireOnce.call(this,b,c,this)},CKEDITOR.event.implementOn(CKEDITOR.editor.prototype));
+CKEDITOR.env||(CKEDITOR.env=function(){var b=navigator.userAgent.toLowerCase(),c=window.opera,a={ie:eval("/*@cc_on!@*/false"),opera:!!c&&c.version,webkit:b.indexOf(" applewebkit/")>-1,air:b.indexOf(" adobeair/")>-1,mac:b.indexOf("macintosh")>-1,quirks:document.compatMode=="BackCompat",mobile:b.indexOf("mobile")>-1,iOS:/(ipad|iphone|ipod)/.test(b),isCustomDomain:function(){if(!this.ie)return false;var a=document.domain,f=window.location.hostname;return a!=f&&a!="["+f+"]"},secure:location.protocol==
+"https:"};a.gecko=navigator.product=="Gecko"&&!a.webkit&&!a.opera;if(a.webkit)b.indexOf("chrome")>-1?a.chrome=true:a.safari=true;var f=0;if(a.ie){f=a.quirks||!document.documentMode?parseFloat(b.match(/msie (\d+)/)[1]):document.documentMode;a.ie9Compat=f==9;a.ie8Compat=f==8;a.ie7Compat=f==7;a.ie6Compat=f<7||a.quirks&&f<10}if(a.gecko){var d=b.match(/rv:([\d\.]+)/);if(d){d=d[1].split(".");f=d[0]*1E4+(d[1]||0)*100+(d[2]||0)*1}}a.opera&&(f=parseFloat(c.version()));a.air&&(f=parseFloat(b.match(/ adobeair\/(\d+)/)[1]));
+a.webkit&&(f=parseFloat(b.match(/ applewebkit\/(\d+)/)[1]));a.version=f;a.isCompatible=a.iOS&&f>=534||!a.mobile&&(a.ie&&f>6||a.gecko&&f>=10801||a.opera&&f>=9.5||a.air&&f>=1||a.webkit&&f>=522||false);a.hidpi=window.devicePixelRatio>=2;a.cssClass="cke_browser_"+(a.ie?"ie":a.gecko?"gecko":a.opera?"opera":a.webkit?"webkit":"unknown");if(a.quirks)a.cssClass=a.cssClass+" cke_browser_quirks";if(a.ie){a.cssClass=a.cssClass+(" cke_browser_ie"+(a.quirks||a.version<7?"6":a.version));if(a.quirks)a.cssClass=a.cssClass+
+" cke_browser_iequirks"}if(a.gecko)if(f<10900)a.cssClass=a.cssClass+" cke_browser_gecko18";else if(f<=11E3)a.cssClass=a.cssClass+" cke_browser_gecko19";if(a.air)a.cssClass=a.cssClass+" cke_browser_air";if(a.iOS)a.cssClass=a.cssClass+" cke_browser_ios";if(a.hidpi)a.cssClass=a.cssClass+" cke_hidpi";return a}());
+"unloaded"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if(CKEDITOR.status!="basic_ready")CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var b=document.createElement("script");b.type="text/javascript";b.src=CKEDITOR.basePath+"ckeditor.js";document.getElementsByTagName("head")[0].appendChild(b)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(b){(this._.pending||(this._.pending=[])).push(b)};(function(){CKEDITOR.domReady(function(){var b=
+CKEDITOR.loadFullCore,c=CKEDITOR.loadFullCoreTimeout;if(b){CKEDITOR.status="basic_ready";b&&b._load?b():c&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},c*1E3)}})})();CKEDITOR.status="basic_loaded"}();CKEDITOR.dom={};
+(function(){var b=[],c=CKEDITOR.env.gecko?"-moz-":CKEDITOR.env.webkit?"-webkit-":CKEDITOR.env.opera?"-o-":CKEDITOR.env.ie?"-ms-":"";CKEDITOR.on("reset",function(){b=[]});CKEDITOR.tools={arrayCompare:function(a,f){if(!a&&!f)return true;if(!a||!f||a.length!=f.length)return false;for(var b=0;b<a.length;b++)if(a[b]!=f[b])return false;return true},clone:function(a){var f;if(a&&a instanceof Array){f=[];for(var b=0;b<a.length;b++)f[b]=CKEDITOR.tools.clone(a[b]);return f}if(a===null||typeof a!="object"||
+a instanceof String||a instanceof Number||a instanceof Boolean||a instanceof Date||a instanceof RegExp)return a;f=new a.constructor;for(b in a)f[b]=CKEDITOR.tools.clone(a[b]);return f},capitalize:function(a){return a.charAt(0).toUpperCase()+a.substring(1).toLowerCase()},extend:function(a){var f=arguments.length,b,e;if(typeof(b=arguments[f-1])=="boolean")f--;else if(typeof(b=arguments[f-2])=="boolean"){e=arguments[f-1];f=f-2}for(var c=1;c<f;c++){var j=arguments[c],i;for(i in j)if(b===true||a[i]==void 0)if(!e||
+i in e)a[i]=j[i]}return a},prototypedCopy:function(a){var b=function(){};b.prototype=a;return new b},copy:function(a){var b={},d;for(d in a)b[d]=a[d];return b},isArray:function(a){return!!a&&a instanceof Array},isEmpty:function(a){for(var b in a)if(a.hasOwnProperty(b))return false;return true},cssVendorPrefix:function(a,b,d){if(d)return c+a+":"+b+";"+a+":"+b;d={};d[a]=b;d[c+a]=b;return d},cssStyleToDomStyle:function(){var a=document.createElement("div").style,b=typeof a.cssFloat!="undefined"?"cssFloat":
+typeof a.styleFloat!="undefined"?"styleFloat":"float";return function(a){return a=="float"?b:a.replace(/-./g,function(a){return a.substr(1).toUpperCase()})}}(),buildStyleHtml:function(a){for(var a=[].concat(a),b,d=[],c=0;c<a.length;c++)if(b=a[c])/@import|[{}]/.test(b)?d.push("<style>"+b+"</style>"):d.push('<link type="text/css" rel=stylesheet href="'+b+'">');return d.join("")},htmlEncode:function(a){return(""+a).replace(/&/g,"&amp;").replace(/>/g,"&gt;").replace(/</g,"&lt;")},htmlEncodeAttr:function(a){return a.replace(/"/g,
+"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")},getNextNumber:function(){var a=0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},override:function(a,b){var d=b(a);d.prototype=a.prototype;return d},setTimeout:function(a,b,d,c,h){h||(h=window);d||(d=h);return h.setTimeout(function(){c?a.apply(d,[].concat(c)):a.apply(d)},b||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(b){return b.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;
+return function(b){return b.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g;return function(b){return b.replace(a,"")}}(),indexOf:function(a,b){if(typeof b=="function")for(var d=0,c=a.length;d<c;d++){if(b(a[d]))return d}else{if(a.indexOf)return a.indexOf(b);d=0;for(c=a.length;d<c;d++)if(a[d]===b)return d}return-1},search:function(a,b){var d=CKEDITOR.tools.indexOf(a,b);return d>=0?a[d]:null},bind:function(a,b){return function(){return a.apply(b,arguments)}},createClass:function(a){var b=a.$,
+d=a.base,c=a.privates||a._,h=a.proto,a=a.statics;!b&&(b=function(){d&&this.base.apply(this,arguments)});if(c)var j=b,b=function(){var a=this._||(this._={}),b;for(b in c){var f=c[b];a[b]=typeof f=="function"?CKEDITOR.tools.bind(f,this):f}j.apply(this,arguments)};if(d){b.prototype=this.prototypedCopy(d.prototype);b.prototype.constructor=b;b.base=d;b.baseProto=d.prototype;b.prototype.base=function(){this.base=d.prototype.base;d.apply(this,arguments);this.base=arguments.callee}}h&&this.extend(b.prototype,
+h,true);a&&this.extend(b,a,true);return b},addFunction:function(a,f){return b.push(function(){return a.apply(f||this,arguments)})-1},removeFunction:function(a){b[a]=null},callFunction:function(a){var f=b[a];return f&&f.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a=/^-?\d+\.?\d*px$/,b;return function(d){b=CKEDITOR.tools.trim(d+"")+"px";return a.test(b)?b:d||""}}(),convertToPx:function(){var a;return function(b){if(!a){a=CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;margin:0px;padding:0px;border:0px;"></div>',
+CKEDITOR.document);CKEDITOR.document.getBody().append(a)}if(!/%$/.test(b)){a.setStyle("width",b);return a.$.clientWidth}return b}}(),repeat:function(a,b){return Array(b+1).join(a)},tryThese:function(){for(var a,b=0,d=arguments.length;b<d;b++){var c=arguments[b];try{a=c();break}catch(h){}}return a},genKey:function(){return Array.prototype.slice.call(arguments).join("-")},defer:function(a){return function(){var b=arguments,d=this;window.setTimeout(function(){a.apply(d,b)},0)}},normalizeCssText:function(a,
+b){var d=[],c,h=CKEDITOR.tools.parseCssText(a,true,b);for(c in h)d.push(c+":"+h[c]);d.sort();return d.length?d.join(";")+";":""},convertRgbToHex:function(a){return a.replace(/(?:rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\))/gi,function(a,b,c,h){a=[b,c,h];for(b=0;b<3;b++)a[b]=("0"+parseInt(a[b],10).toString(16)).slice(-2);return"#"+a.join("")})},parseCssText:function(a,b,d){var c={};if(d){d=new CKEDITOR.dom.element("span");d.setAttribute("style",a);a=CKEDITOR.tools.convertRgbToHex(d.getAttribute("style")||
+"")}if(!a||a==";")return c;a.replace(/&quot;/g,'"').replace(/\s*([^:;\s]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,d,i){if(b){d=d.toLowerCase();d=="font-family"&&(i=i.toLowerCase().replace(/["']/g,"").replace(/\s*,\s*/g,","));i=CKEDITOR.tools.trim(i)}c[d]=i});return c},writeCssText:function(a,b){var d,c=[];for(d in a)c.push(d+":"+a[d]);b&&c.sort();return c.join("; ")},objectCompare:function(a,b,d){var c;if(!a&&!b)return true;if(!a||!b)return false;for(c in a)if(a[c]!=b[c])return false;if(!d)for(c in b)if(a[c]!=
+b[c])return false;return true},objectKeys:function(a){var b=[],d;for(d in a)b.push(d);return b},convertArrayToObject:function(a,b){var d={};arguments.length==1&&(b=true);for(var c=0,h=a.length;c<h;++c)d[a[c]]=b;return d},fixDomain:function(){for(var a;;)try{a=window.parent.document.domain;break}catch(b){a=a?a.replace(/.+?(?:\.|$)/,""):document.domain;if(!a)break;document.domain=a}return!!a},eventsBuffer:function(a,b){function d(){h=(new Date).getTime();c=false;b()}var c,h=0;return{input:function(){if(!c){var b=
+(new Date).getTime()-h;b<a?c=setTimeout(d,a-b):d()}},reset:function(){c&&clearTimeout(c);c=h=0}}}}})();
+CKEDITOR.dtd=function(){var b=CKEDITOR.tools.extend,c=function(a,b){for(var f=CKEDITOR.tools.clone(a),d=1;d<arguments.length;d++){var b=arguments[d],c;for(c in b)delete f[c]}return f},a={},f={},d={address:1,article:1,aside:1,blockquote:1,details:1,div:1,dl:1,fieldset:1,figure:1,footer:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,header:1,hgroup:1,hr:1,menu:1,nav:1,ol:1,p:1,pre:1,section:1,table:1,ul:1},e={command:1,link:1,meta:1,noscript:1,script:1,style:1},h={},j={"#":1},i={center:1,dir:1,noframes:1};
+b(a,{a:1,abbr:1,area:1,audio:1,b:1,bdi:1,bdo:1,br:1,button:1,canvas:1,cite:1,code:1,command:1,datalist:1,del:1,dfn:1,em:1,embed:1,i:1,iframe:1,img:1,input:1,ins:1,kbd:1,keygen:1,label:1,map:1,mark:1,meter:1,noscript:1,object:1,output:1,progress:1,q:1,ruby:1,s:1,samp:1,script:1,select:1,small:1,span:1,strong:1,sub:1,sup:1,textarea:1,time:1,u:1,"var":1,video:1,wbr:1},j,{acronym:1,applet:1,basefont:1,big:1,font:1,isindex:1,strike:1,style:1,tt:1});b(f,d,a,i);c={a:c(a,{a:1,button:1}),abbr:a,address:f,
+area:h,article:b({style:1},f),aside:b({style:1},f),audio:b({source:1,track:1},f),b:a,base:h,bdi:a,bdo:a,blockquote:f,body:f,br:h,button:c(a,{a:1,button:1}),canvas:a,caption:f,cite:a,code:a,col:h,colgroup:{col:1},command:h,datalist:b({option:1},a),dd:f,del:a,details:b({summary:1},f),dfn:a,div:b({style:1},f),dl:{dt:1,dd:1},dt:f,em:a,embed:h,fieldset:b({legend:1},f),figcaption:f,figure:b({figcaption:1},f),footer:f,form:f,h1:a,h2:a,h3:a,h4:a,h5:a,h6:a,head:b({title:1,base:1},e),header:f,hgroup:{h1:1,
+h2:1,h3:1,h4:1,h5:1,h6:1},hr:h,html:b({head:1,body:1},f,e),i:a,iframe:j,img:h,input:h,ins:a,kbd:a,keygen:h,label:a,legend:a,li:f,link:h,map:f,mark:a,menu:b({li:1},f),meta:h,meter:c(a,{meter:1}),nav:f,noscript:b({link:1,meta:1,style:1},a),object:b({param:1},a),ol:{li:1},optgroup:{option:1},option:j,output:a,p:a,param:h,pre:a,progress:c(a,{progress:1}),q:a,rp:a,rt:a,ruby:b({rp:1,rt:1},a),s:a,samp:a,script:j,section:b({style:1},f),select:{optgroup:1,option:1},small:a,source:h,span:a,strong:a,style:j,
+sub:a,summary:a,sup:a,table:{caption:1,colgroup:1,thead:1,tfoot:1,tbody:1,tr:1},tbody:{tr:1},td:f,textarea:j,tfoot:{tr:1},th:f,thead:{tr:1},time:c(a,{time:1}),title:j,tr:{th:1,td:1},track:h,u:a,ul:{li:1},"var":a,video:b({source:1,track:1},f),wbr:h,acronym:a,applet:b({param:1},f),basefont:h,big:a,center:f,dialog:h,dir:{li:1},font:a,isindex:h,noframes:f,strike:a,tt:a};b(c,{$block:b({audio:1,dd:1,dt:1,li:1,video:1},d,i),$blockLimit:{article:1,aside:1,audio:1,body:1,caption:1,details:1,dir:1,div:1,dl:1,
+fieldset:1,figure:1,footer:1,form:1,header:1,hgroup:1,menu:1,nav:1,ol:1,section:1,table:1,td:1,th:1,tr:1,ul:1,video:1},$cdata:{script:1,style:1},$editable:{address:1,article:1,aside:1,blockquote:1,body:1,details:1,div:1,fieldset:1,footer:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,header:1,hgroup:1,nav:1,p:1,pre:1,section:1},$empty:{area:1,base:1,basefont:1,br:1,col:1,command:1,dialog:1,embed:1,hr:1,img:1,input:1,isindex:1,keygen:1,link:1,meta:1,param:1,source:1,track:1,wbr:1},$inline:a,$list:{dl:1,ol:1,
+ul:1},$listItem:{dd:1,dt:1,li:1},$nonBodyContent:b({body:1,head:1,html:1},c.head),$nonEditable:{applet:1,audio:1,button:1,embed:1,iframe:1,map:1,object:1,option:1,param:1,script:1,textarea:1,video:1},$object:{applet:1,audio:1,button:1,hr:1,iframe:1,img:1,input:1,object:1,select:1,table:1,textarea:1,video:1},$removeEmpty:{abbr:1,acronym:1,b:1,bdi:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,mark:1,meter:1,output:1,q:1,ruby:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,
+sub:1,sup:1,time:1,tt:1,u:1,"var":1},$tabIndex:{a:1,area:1,button:1,input:1,object:1,select:1,textarea:1},$tableContent:{caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1},$transparent:{a:1,audio:1,canvas:1,del:1,ins:1,map:1,noscript:1,object:1,video:1},$intermediate:{caption:1,colgroup:1,dd:1,dt:1,figcaption:1,legend:1,li:1,optgroup:1,option:1,rp:1,rt:1,summary:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1}});return c}();CKEDITOR.dom.event=function(b){this.$=b};
+CKEDITOR.dom.event.prototype={getKey:function(){return this.$.keyCode||this.$.which},getKeystroke:function(){var b=this.getKey();if(this.$.ctrlKey||this.$.metaKey)b=b+CKEDITOR.CTRL;this.$.shiftKey&&(b=b+CKEDITOR.SHIFT);this.$.altKey&&(b=b+CKEDITOR.ALT);return b},preventDefault:function(b){var c=this.$;c.preventDefault?c.preventDefault():c.returnValue=false;b&&this.stopPropagation()},stopPropagation:function(){var b=this.$;b.stopPropagation?b.stopPropagation():b.cancelBubble=true},getTarget:function(){var b=
+this.$.target||this.$.srcElement;return b?new CKEDITOR.dom.node(b):null},getPhase:function(){return this.$.eventPhase||2},getPageOffset:function(){var b=this.getTarget().getDocument().$;return{x:this.$.pageX||this.$.clientX+(b.documentElement.scrollLeft||b.body.scrollLeft),y:this.$.pageY||this.$.clientY+(b.documentElement.scrollTop||b.body.scrollTop)}}};CKEDITOR.CTRL=1114112;CKEDITOR.SHIFT=2228224;CKEDITOR.ALT=4456448;CKEDITOR.EVENT_PHASE_CAPTURING=1;CKEDITOR.EVENT_PHASE_AT_TARGET=2;
+CKEDITOR.EVENT_PHASE_BUBBLING=3;CKEDITOR.dom.domObject=function(b){if(b)this.$=b};
+CKEDITOR.dom.domObject.prototype=function(){var b=function(b,a){return function(f){typeof CKEDITOR!="undefined"&&b.fire(a,new CKEDITOR.dom.event(f))}};return{getPrivate:function(){var b;if(!(b=this.getCustomData("_")))this.setCustomData("_",b={});return b},on:function(c){var a=this.getCustomData("_cke_nativeListeners");if(!a){a={};this.setCustomData("_cke_nativeListeners",a)}if(!a[c]){a=a[c]=b(this,c);this.$.addEventListener?this.$.addEventListener(c,a,!!CKEDITOR.event.useCapture):this.$.attachEvent&&
+this.$.attachEvent("on"+c,a)}return CKEDITOR.event.prototype.on.apply(this,arguments)},removeListener:function(b){CKEDITOR.event.prototype.removeListener.apply(this,arguments);if(!this.hasListeners(b)){var a=this.getCustomData("_cke_nativeListeners"),f=a&&a[b];if(f){this.$.removeEventListener?this.$.removeEventListener(b,f,false):this.$.detachEvent&&this.$.detachEvent("on"+b,f);delete a[b]}}},removeAllListeners:function(){var b=this.getCustomData("_cke_nativeListeners"),a;for(a in b){var f=b[a];this.$.detachEvent?
+this.$.detachEvent("on"+a,f):this.$.removeEventListener&&this.$.removeEventListener(a,f,false);delete b[a]}}}}();
+(function(b){var c={};CKEDITOR.on("reset",function(){c={}});b.equals=function(a){try{return a&&a.$===this.$}catch(b){return false}};b.setCustomData=function(a,b){var d=this.getUniqueId();(c[d]||(c[d]={}))[a]=b;return this};b.getCustomData=function(a){var b=this.$["data-cke-expando"];return(b=b&&c[b])&&a in b?b[a]:null};b.removeCustomData=function(a){var b=this.$["data-cke-expando"],b=b&&c[b],d,e;if(b){d=b[a];e=a in b;delete b[a]}return e?d:null};b.clearCustomData=function(){this.removeAllListeners();
+var a=this.$["data-cke-expando"];a&&delete c[a]};b.getUniqueId=function(){return this.$["data-cke-expando"]||(this.$["data-cke-expando"]=CKEDITOR.tools.getNextNumber())};CKEDITOR.event.implementOn(b)})(CKEDITOR.dom.domObject.prototype);
+CKEDITOR.dom.node=function(b){return b?new CKEDITOR.dom[b.nodeType==CKEDITOR.NODE_DOCUMENT?"document":b.nodeType==CKEDITOR.NODE_ELEMENT?"element":b.nodeType==CKEDITOR.NODE_TEXT?"text":b.nodeType==CKEDITOR.NODE_COMMENT?"comment":b.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT?"documentFragment":"domObject"](b):this};CKEDITOR.dom.node.prototype=new CKEDITOR.dom.domObject;CKEDITOR.NODE_ELEMENT=1;CKEDITOR.NODE_DOCUMENT=9;CKEDITOR.NODE_TEXT=3;CKEDITOR.NODE_COMMENT=8;CKEDITOR.NODE_DOCUMENT_FRAGMENT=11;
+CKEDITOR.POSITION_IDENTICAL=0;CKEDITOR.POSITION_DISCONNECTED=1;CKEDITOR.POSITION_FOLLOWING=2;CKEDITOR.POSITION_PRECEDING=4;CKEDITOR.POSITION_IS_CONTAINED=8;CKEDITOR.POSITION_CONTAINS=16;
+CKEDITOR.tools.extend(CKEDITOR.dom.node.prototype,{appendTo:function(b,c){b.append(this,c);return b},clone:function(b,c){var a=this.$.cloneNode(b),f=function(a){a["data-cke-expando"]&&(a["data-cke-expando"]=false);if(a.nodeType==CKEDITOR.NODE_ELEMENT){c||a.removeAttribute("id",false);if(b)for(var a=a.childNodes,e=0;e<a.length;e++)f(a[e])}};f(a);return new CKEDITOR.dom.node(a)},hasPrevious:function(){return!!this.$.previousSibling},hasNext:function(){return!!this.$.nextSibling},insertAfter:function(b){b.$.parentNode.insertBefore(this.$,
+b.$.nextSibling);return b},insertBefore:function(b){b.$.parentNode.insertBefore(this.$,b.$);return b},insertBeforeMe:function(b){this.$.parentNode.insertBefore(b.$,this.$);return b},getAddress:function(b){for(var c=[],a=this.getDocument().$.documentElement,f=this.$;f&&f!=a;){var d=f.parentNode;d&&c.unshift(this.getIndex.call({$:f},b));f=d}return c},getDocument:function(){return new CKEDITOR.dom.document(this.$.ownerDocument||this.$.parentNode.ownerDocument)},getIndex:function(b){var c=this.$,a=-1,
+f;if(!this.$.parentNode)return a;do if(!b||!(c!=this.$&&c.nodeType==CKEDITOR.NODE_TEXT&&(f||!c.nodeValue))){a++;f=c.nodeType==CKEDITOR.NODE_TEXT}while(c=c.previousSibling);return a},getNextSourceNode:function(b,c,a){if(a&&!a.call)var f=a,a=function(a){return!a.equals(f)};var b=!b&&this.getFirst&&this.getFirst(),d;if(!b){if(this.type==CKEDITOR.NODE_ELEMENT&&a&&a(this,true)===false)return null;b=this.getNext()}for(;!b&&(d=(d||this).getParent());){if(a&&a(d,true)===false)return null;b=d.getNext()}return!b||
+a&&a(b)===false?null:c&&c!=b.type?b.getNextSourceNode(false,c,a):b},getPreviousSourceNode:function(b,c,a){if(a&&!a.call)var f=a,a=function(a){return!a.equals(f)};var b=!b&&this.getLast&&this.getLast(),d;if(!b){if(this.type==CKEDITOR.NODE_ELEMENT&&a&&a(this,true)===false)return null;b=this.getPrevious()}for(;!b&&(d=(d||this).getParent());){if(a&&a(d,true)===false)return null;b=d.getPrevious()}return!b||a&&a(b)===false?null:c&&b.type!=c?b.getPreviousSourceNode(false,c,a):b},getPrevious:function(b){var c=
+this.$,a;do a=(c=c.previousSibling)&&c.nodeType!=10&&new CKEDITOR.dom.node(c);while(a&&b&&!b(a));return a},getNext:function(b){var c=this.$,a;do a=(c=c.nextSibling)&&new CKEDITOR.dom.node(c);while(a&&b&&!b(a));return a},getParent:function(b){var c=this.$.parentNode;return c&&(c.nodeType==CKEDITOR.NODE_ELEMENT||b&&c.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT)?new CKEDITOR.dom.node(c):null},getParents:function(b){var c=this,a=[];do a[b?"push":"unshift"](c);while(c=c.getParent());return a},getCommonAncestor:function(b){if(b.equals(this))return this;
+if(b.contains&&b.contains(this))return b;var c=this.contains?this:this.getParent();do if(c.contains(b))return c;while(c=c.getParent());return null},getPosition:function(b){var c=this.$,a=b.$;if(c.compareDocumentPosition)return c.compareDocumentPosition(a);if(c==a)return CKEDITOR.POSITION_IDENTICAL;if(this.type==CKEDITOR.NODE_ELEMENT&&b.type==CKEDITOR.NODE_ELEMENT){if(c.contains){if(c.contains(a))return CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING;if(a.contains(c))return CKEDITOR.POSITION_IS_CONTAINED+
+CKEDITOR.POSITION_FOLLOWING}if("sourceIndex"in c)return c.sourceIndex<0||a.sourceIndex<0?CKEDITOR.POSITION_DISCONNECTED:c.sourceIndex<a.sourceIndex?CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_FOLLOWING}for(var c=this.getAddress(),b=b.getAddress(),a=Math.min(c.length,b.length),f=0;f<=a-1;f++)if(c[f]!=b[f]){if(f<a)return c[f]<b[f]?CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_FOLLOWING;break}return c.length<b.length?CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_IS_CONTAINED+
+CKEDITOR.POSITION_FOLLOWING},getAscendant:function(b,c){var a=this.$,f;if(!c)a=a.parentNode;for(;a;){if(a.nodeName&&(f=a.nodeName.toLowerCase(),typeof b=="string"?f==b:f in b))return new CKEDITOR.dom.node(a);try{a=a.parentNode}catch(d){a=null}}return null},hasAscendant:function(b,c){var a=this.$;if(!c)a=a.parentNode;for(;a;){if(a.nodeName&&a.nodeName.toLowerCase()==b)return true;a=a.parentNode}return false},move:function(b,c){b.append(this.remove(),c)},remove:function(b){var c=this.$,a=c.parentNode;
+if(a){if(b)for(;b=c.firstChild;)a.insertBefore(c.removeChild(b),c);a.removeChild(c)}return this},replace:function(b){this.insertBefore(b);b.remove()},trim:function(){this.ltrim();this.rtrim()},ltrim:function(){for(var b;this.getFirst&&(b=this.getFirst());){if(b.type==CKEDITOR.NODE_TEXT){var c=CKEDITOR.tools.ltrim(b.getText()),a=b.getLength();if(c){if(c.length<a){b.split(a-c.length);this.$.removeChild(this.$.firstChild)}}else{b.remove();continue}}break}},rtrim:function(){for(var b;this.getLast&&(b=
+this.getLast());){if(b.type==CKEDITOR.NODE_TEXT){var c=CKEDITOR.tools.rtrim(b.getText()),a=b.getLength();if(c){if(c.length<a){b.split(c.length);this.$.lastChild.parentNode.removeChild(this.$.lastChild)}}else{b.remove();continue}}break}if(!CKEDITOR.env.ie&&!CKEDITOR.env.opera)(b=this.$.lastChild)&&(b.type==1&&b.nodeName.toLowerCase()=="br")&&b.parentNode.removeChild(b)},isReadOnly:function(){var b=this;this.type!=CKEDITOR.NODE_ELEMENT&&(b=this.getParent());if(b&&typeof b.$.isContentEditable!="undefined")return!(b.$.isContentEditable||
+b.data("cke-editable"));for(;b;){if(b.data("cke-editable"))break;if(b.getAttribute("contentEditable")=="false")return true;if(b.getAttribute("contentEditable")=="true")break;b=b.getParent()}return!b}});CKEDITOR.dom.window=function(b){CKEDITOR.dom.domObject.call(this,b)};CKEDITOR.dom.window.prototype=new CKEDITOR.dom.domObject;
+CKEDITOR.tools.extend(CKEDITOR.dom.window.prototype,{focus:function(){this.$.focus()},getViewPaneSize:function(){var b=this.$.document,c=b.compatMode=="CSS1Compat";return{width:(c?b.documentElement.clientWidth:b.body.clientWidth)||0,height:(c?b.documentElement.clientHeight:b.body.clientHeight)||0}},getScrollPosition:function(){var b=this.$;if("pageXOffset"in b)return{x:b.pageXOffset||0,y:b.pageYOffset||0};b=b.document;return{x:b.documentElement.scrollLeft||b.body.scrollLeft||0,y:b.documentElement.scrollTop||
+b.body.scrollTop||0}},getFrame:function(){var b=this.$.frameElement;return b?new CKEDITOR.dom.element.get(b):null}});CKEDITOR.dom.document=function(b){CKEDITOR.dom.domObject.call(this,b)};CKEDITOR.dom.document.prototype=new CKEDITOR.dom.domObject;
+CKEDITOR.tools.extend(CKEDITOR.dom.document.prototype,{type:CKEDITOR.NODE_DOCUMENT,appendStyleSheet:function(b){if(this.$.createStyleSheet)this.$.createStyleSheet(b);else{var c=new CKEDITOR.dom.element("link");c.setAttributes({rel:"stylesheet",type:"text/css",href:b});this.getHead().append(c)}},appendStyleText:function(b){if(this.$.createStyleSheet){var c=this.$.createStyleSheet("");c.cssText=b}else{var a=new CKEDITOR.dom.element("style",this);a.append(new CKEDITOR.dom.text(b,this));this.getHead().append(a)}return c||
+a.$.sheet},createElement:function(b,c){var a=new CKEDITOR.dom.element(b,this);if(c){c.attributes&&a.setAttributes(c.attributes);c.styles&&a.setStyles(c.styles)}return a},createText:function(b){return new CKEDITOR.dom.text(b,this)},focus:function(){this.getWindow().focus()},getActive:function(){return new CKEDITOR.dom.element(this.$.activeElement)},getById:function(b){return(b=this.$.getElementById(b))?new CKEDITOR.dom.element(b):null},getByAddress:function(b,c){for(var a=this.$.documentElement,f=
+0;a&&f<b.length;f++){var d=b[f];if(c)for(var e=-1,h=0;h<a.childNodes.length;h++){var j=a.childNodes[h];if(!(c===true&&j.nodeType==3&&j.previousSibling&&j.previousSibling.nodeType==3)){e++;if(e==d){a=j;break}}}else a=a.childNodes[d]}return a?new CKEDITOR.dom.node(a):null},getElementsByTag:function(b,c){if((!CKEDITOR.env.ie||document.documentMode>8)&&c)b=c+":"+b;return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(b))},getHead:function(){var b=this.$.getElementsByTagName("head")[0];return b=
+b?new CKEDITOR.dom.element(b):this.getDocumentElement().append(new CKEDITOR.dom.element("head"),true)},getBody:function(){return new CKEDITOR.dom.element(this.$.body)},getDocumentElement:function(){return new CKEDITOR.dom.element(this.$.documentElement)},getWindow:function(){return new CKEDITOR.dom.window(this.$.parentWindow||this.$.defaultView)},write:function(b){this.$.open("text/html","replace");CKEDITOR.env.ie&&(b=b.replace(/(?:^\s*<!DOCTYPE[^>]*?>)|^/i,'$&\n<script data-cke-temp="1">('+CKEDITOR.tools.fixDomain+
+")();<\/script>"));this.$.write(b);this.$.close()}});CKEDITOR.dom.nodeList=function(b){this.$=b};CKEDITOR.dom.nodeList.prototype={count:function(){return this.$.length},getItem:function(b){if(b<0||b>=this.$.length)return null;return(b=this.$[b])?new CKEDITOR.dom.node(b):null}};CKEDITOR.dom.element=function(b,c){typeof b=="string"&&(b=(c?c.$:document).createElement(b));CKEDITOR.dom.domObject.call(this,b)};
+CKEDITOR.dom.element.get=function(b){return(b=typeof b=="string"?document.getElementById(b)||document.getElementsByName(b)[0]:b)&&(b.$?b:new CKEDITOR.dom.element(b))};CKEDITOR.dom.element.prototype=new CKEDITOR.dom.node;CKEDITOR.dom.element.createFromHtml=function(b,c){var a=new CKEDITOR.dom.element("div",c);a.setHtml(b);return a.getFirst().remove()};
+CKEDITOR.dom.element.setMarker=function(b,c,a,f){var d=c.getCustomData("list_marker_id")||c.setCustomData("list_marker_id",CKEDITOR.tools.getNextNumber()).getCustomData("list_marker_id"),e=c.getCustomData("list_marker_names")||c.setCustomData("list_marker_names",{}).getCustomData("list_marker_names");b[d]=c;e[a]=1;return c.setCustomData(a,f)};CKEDITOR.dom.element.clearAllMarkers=function(b){for(var c in b)CKEDITOR.dom.element.clearMarkers(b,b[c],1)};
+CKEDITOR.dom.element.clearMarkers=function(b,c,a){var f=c.getCustomData("list_marker_names"),d=c.getCustomData("list_marker_id"),e;for(e in f)c.removeCustomData(e);c.removeCustomData("list_marker_names");if(a){c.removeCustomData("list_marker_id");delete b[d]}};
+(function(){function b(a){for(var b=0,d=0,e=c[a].length;d<e;d++)b=b+(parseInt(this.getComputedStyle(c[a][d])||0,10)||0);return b}CKEDITOR.tools.extend(CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_ELEMENT,addClass:function(a){var b=this.$.className;b&&(RegExp("(?:^|\\s)"+a+"(?:\\s|$)","").test(b)||(b=b+(" "+a)));this.$.className=b||a},removeClass:function(a){var b=this.getAttribute("class");if(b){a=RegExp("(?:^|\\s+)"+a+"(?=\\s|$)","i");if(a.test(b))(b=b.replace(a,"").replace(/^\s+/,""))?this.setAttribute("class",
+b):this.removeAttribute("class")}return this},hasClass:function(a){return RegExp("(?:^|\\s+)"+a+"(?=\\s|$)","").test(this.getAttribute("class"))},append:function(a,b){typeof a=="string"&&(a=this.getDocument().createElement(a));b?this.$.insertBefore(a.$,this.$.firstChild):this.$.appendChild(a.$);return a},appendHtml:function(a){if(this.$.childNodes.length){var b=new CKEDITOR.dom.element("div",this.getDocument());b.setHtml(a);b.moveChildren(this)}else this.setHtml(a)},appendText:function(a){this.$.text!=
+void 0?this.$.text=this.$.text+a:this.append(new CKEDITOR.dom.text(a))},appendBogus:function(){for(var a=this.getLast();a&&a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.rtrim(a.getText());)a=a.getPrevious();if(!a||!a.is||!a.is("br")){a=CKEDITOR.env.opera?this.getDocument().createText(""):this.getDocument().createElement("br");CKEDITOR.env.gecko&&a.setAttribute("type","_moz");this.append(a)}},breakParent:function(a){var b=new CKEDITOR.dom.range(this.getDocument());b.setStartAfter(this);b.setEndAfter(a);
+a=b.extractContents();b.insertNode(this.remove());a.insertAfterNode(this)},contains:CKEDITOR.env.ie||CKEDITOR.env.webkit?function(a){var b=this.$;return a.type!=CKEDITOR.NODE_ELEMENT?b.contains(a.getParent().$):b!=a.$&&b.contains(a.$)}:function(a){return!!(this.$.compareDocumentPosition(a.$)&16)},focus:function(){function a(){try{this.$.focus()}catch(a){}}return function(b){b?CKEDITOR.tools.setTimeout(a,100,this):a.call(this)}}(),getHtml:function(){var a=this.$.innerHTML;return CKEDITOR.env.ie?a.replace(/<\?[^>]*>/g,
+""):a},getOuterHtml:function(){if(this.$.outerHTML)return this.$.outerHTML.replace(/<\?[^>]*>/,"");var a=this.$.ownerDocument.createElement("div");a.appendChild(this.$.cloneNode(true));return a.innerHTML},getClientRect:function(){var a=CKEDITOR.tools.extend({},this.$.getBoundingClientRect());!a.width&&(a.width=a.right-a.left);!a.height&&(a.height=a.bottom-a.top);return a},setHtml:function(){var a=function(a){return this.$.innerHTML=a};return CKEDITOR.env.ie&&CKEDITOR.env.version<9?function(a){try{return this.$.innerHTML=
+a}catch(b){this.$.innerHTML="";var c=new CKEDITOR.dom.element("body",this.getDocument());c.$.innerHTML=a;for(c=c.getChildren();c.count();)this.append(c.getItem(0));return a}}:a}(),setText:function(a){CKEDITOR.dom.element.prototype.setText=this.$.innerText!=void 0?function(a){return this.$.innerText=a}:function(a){return this.$.textContent=a};return this.setText(a)},getAttribute:function(){var a=function(a){return this.$.getAttribute(a,2)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?
+function(a){switch(a){case "class":a="className";break;case "http-equiv":a="httpEquiv";break;case "name":return this.$.name;case "tabindex":a=this.$.getAttribute(a,2);a!==0&&this.$.tabIndex===0&&(a=null);return a;case "checked":a=this.$.attributes.getNamedItem(a);return(a.specified?a.nodeValue:this.$.checked)?"checked":null;case "hspace":case "value":return this.$[a];case "style":return this.$.style.cssText;case "contenteditable":case "contentEditable":return this.$.attributes.getNamedItem("contentEditable").specified?
+this.$.getAttribute("contentEditable"):null}return this.$.getAttribute(a,2)}:a}(),getChildren:function(){return new CKEDITOR.dom.nodeList(this.$.childNodes)},getComputedStyle:CKEDITOR.env.ie?function(a){return this.$.currentStyle[CKEDITOR.tools.cssStyleToDomStyle(a)]}:function(a){var b=this.getWindow().$.getComputedStyle(this.$,null);return b?b.getPropertyValue(a):""},getDtd:function(){var a=CKEDITOR.dtd[this.getName()];this.getDtd=function(){return a};return a},getElementsByTag:CKEDITOR.dom.document.prototype.getElementsByTag,
+getTabIndex:CKEDITOR.env.ie?function(){var a=this.$.tabIndex;a===0&&(!CKEDITOR.dtd.$tabIndex[this.getName()]&&parseInt(this.getAttribute("tabindex"),10)!==0)&&(a=-1);return a}:CKEDITOR.env.webkit?function(){var a=this.$.tabIndex;if(a==void 0){a=parseInt(this.getAttribute("tabindex"),10);isNaN(a)&&(a=-1)}return a}:function(){return this.$.tabIndex},getText:function(){return this.$.textContent||this.$.innerText||""},getWindow:function(){return this.getDocument().getWindow()},getId:function(){return this.$.id||
+null},getNameAtt:function(){return this.$.name||null},getName:function(){var a=this.$.nodeName.toLowerCase();if(CKEDITOR.env.ie&&!(document.documentMode>8)){var b=this.$.scopeName;b!="HTML"&&(a=b.toLowerCase()+":"+a)}return(this.getName=function(){return a})()},getValue:function(){return this.$.value},getFirst:function(a){var b=this.$.firstChild;(b=b&&new CKEDITOR.dom.node(b))&&(a&&!a(b))&&(b=b.getNext(a));return b},getLast:function(a){var b=this.$.lastChild;(b=b&&new CKEDITOR.dom.node(b))&&(a&&!a(b))&&
+(b=b.getPrevious(a));return b},getStyle:function(a){return this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]},is:function(){var a=this.getName();if(typeof arguments[0]=="object")return!!arguments[0][a];for(var b=0;b<arguments.length;b++)if(arguments[b]==a)return true;return false},isEditable:function(a){var b=this.getName();if(this.isReadOnly()||this.getComputedStyle("display")=="none"||this.getComputedStyle("visibility")=="hidden"||CKEDITOR.dtd.$nonEditable[b]||CKEDITOR.dtd.$empty[b]||this.is("a")&&
+(this.data("cke-saved-name")||this.hasAttribute("name"))&&!this.getChildCount())return false;if(a!==false){a=CKEDITOR.dtd[b]||CKEDITOR.dtd.span;return!(!a||!a["#"])}return true},isIdentical:function(a){var b=this.clone(0,1),a=a.clone(0,1);b.removeAttributes(["_moz_dirty","data-cke-expando","data-cke-saved-href","data-cke-saved-name"]);a.removeAttributes(["_moz_dirty","data-cke-expando","data-cke-saved-href","data-cke-saved-name"]);if(b.$.isEqualNode){b.$.style.cssText=CKEDITOR.tools.normalizeCssText(b.$.style.cssText);
+a.$.style.cssText=CKEDITOR.tools.normalizeCssText(a.$.style.cssText);return b.$.isEqualNode(a.$)}b=b.getOuterHtml();a=a.getOuterHtml();if(CKEDITOR.env.ie&&CKEDITOR.env.version<9&&this.is("a")){var d=this.getParent();if(d.type==CKEDITOR.NODE_ELEMENT){d=d.clone();d.setHtml(b);b=d.getHtml();d.setHtml(a);a=d.getHtml()}}return b==a},isVisible:function(){var a=(this.$.offsetHeight||this.$.offsetWidth)&&this.getComputedStyle("visibility")!="hidden",b,d;if(a&&(CKEDITOR.env.webkit||CKEDITOR.env.opera)){b=
+this.getWindow();if(!b.equals(CKEDITOR.document.getWindow())&&(d=b.$.frameElement))a=(new CKEDITOR.dom.element(d)).isVisible()}return!!a},isEmptyInlineRemoveable:function(){if(!CKEDITOR.dtd.$removeEmpty[this.getName()])return false;for(var a=this.getChildren(),b=0,d=a.count();b<d;b++){var c=a.getItem(b);if(!(c.type==CKEDITOR.NODE_ELEMENT&&c.data("cke-bookmark"))&&(c.type==CKEDITOR.NODE_ELEMENT&&!c.isEmptyInlineRemoveable()||c.type==CKEDITOR.NODE_TEXT&&CKEDITOR.tools.trim(c.getText())))return false}return true},
+hasAttributes:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(){for(var a=this.$.attributes,b=0;b<a.length;b++){var d=a[b];switch(d.nodeName){case "class":if(this.getAttribute("class"))return true;case "data-cke-expando":continue;default:if(d.specified)return true}}return false}:function(){var a=this.$.attributes,b=a.length,d={"data-cke-expando":1,_moz_dirty:1};return b>0&&(b>2||!d[a[0].nodeName]||b==2&&!d[a[1].nodeName])},hasAttribute:function(){function a(a){a=this.$.attributes.getNamedItem(a);
+return!(!a||!a.specified)}return CKEDITOR.env.ie&&CKEDITOR.env.version<8?function(b){return b=="name"?!!this.$.name:a.call(this,b)}:a}(),hide:function(){this.setStyle("display","none")},moveChildren:function(a,b){var d=this.$,a=a.$;if(d!=a){var c;if(b)for(;c=d.lastChild;)a.insertBefore(d.removeChild(c),a.firstChild);else for(;c=d.firstChild;)a.appendChild(d.removeChild(c))}},mergeSiblings:function(){function a(a,b,c){if(b&&b.type==CKEDITOR.NODE_ELEMENT){for(var h=[];b.data("cke-bookmark")||b.isEmptyInlineRemoveable();){h.push(b);
+b=c?b.getNext():b.getPrevious();if(!b||b.type!=CKEDITOR.NODE_ELEMENT)return}if(a.isIdentical(b)){for(var j=c?a.getLast():a.getFirst();h.length;)h.shift().move(a,!c);b.moveChildren(a,!c);b.remove();j&&j.type==CKEDITOR.NODE_ELEMENT&&j.mergeSiblings()}}}return function(b){if(b===false||CKEDITOR.dtd.$removeEmpty[this.getName()]||this.is("a")){a(this,this.getNext(),true);a(this,this.getPrevious())}}}(),show:function(){this.setStyles({display:"",visibility:""})},setAttribute:function(){var a=function(a,
+b){this.$.setAttribute(a,b);return this};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(b,c){b=="class"?this.$.className=c:b=="style"?this.$.style.cssText=c:b=="tabindex"?this.$.tabIndex=c:b=="checked"?this.$.checked=c:b=="contenteditable"?a.call(this,"contentEditable",c):a.apply(this,arguments);return this}:CKEDITOR.env.ie8Compat&&CKEDITOR.env.secure?function(b,c){if(b=="src"&&c.match(/^http:\/\//))try{a.apply(this,arguments)}catch(e){}else a.apply(this,arguments);
+return this}:a}(),setAttributes:function(a){for(var b in a)this.setAttribute(b,a[b]);return this},setValue:function(a){this.$.value=a;return this},removeAttribute:function(){var a=function(a){this.$.removeAttribute(a)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(a){a=="class"?a="className":a=="tabindex"?a="tabIndex":a=="contenteditable"&&(a="contentEditable");this.$.removeAttribute(a)}:a}(),removeAttributes:function(a){if(CKEDITOR.tools.isArray(a))for(var b=0;b<
+a.length;b++)this.removeAttribute(a[b]);else for(b in a)a.hasOwnProperty(b)&&this.removeAttribute(b)},removeStyle:function(a){var b=this.$.style;if(!b.removeProperty&&(a=="border"||a=="margin"||a=="padding")){var c=["top","left","right","bottom"],e;a=="border"&&(e=["color","style","width"]);for(var b=[],h=0;h<c.length;h++)if(e)for(var j=0;j<e.length;j++)b.push([a,c[h],e[j]].join("-"));else b.push([a,c[h]].join("-"));for(a=0;a<b.length;a++)this.removeStyle(b[a])}else{b.removeProperty?b.removeProperty(a):
+b.removeAttribute(CKEDITOR.tools.cssStyleToDomStyle(a));this.$.style.cssText||this.removeAttribute("style")}},setStyle:function(a,b){this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]=b;return this},setStyles:function(a){for(var b in a)this.setStyle(b,a[b]);return this},setOpacity:function(a){if(CKEDITOR.env.ie&&CKEDITOR.env.version<9){a=Math.round(a*100);this.setStyle("filter",a>=100?"":"progid:DXImageTransform.Microsoft.Alpha(opacity="+a+")")}else this.setStyle("opacity",a)},unselectable:function(){this.setStyles(CKEDITOR.tools.cssVendorPrefix("user-select",
+"none"));if(CKEDITOR.env.ie||CKEDITOR.env.opera){this.setAttribute("unselectable","on");for(var a,b=this.getElementsByTag("*"),c=0,e=b.count();c<e;c++){a=b.getItem(c);a.setAttribute("unselectable","on")}}},getPositionedAncestor:function(){for(var a=this;a.getName()!="html";){if(a.getComputedStyle("position")!="static")return a;a=a.getParent()}return null},getDocumentPosition:function(a){var b=0,c=0,e=this.getDocument(),h=e.getBody(),j=e.$.compatMode=="BackCompat";if(document.documentElement.getBoundingClientRect){var i=
+this.$.getBoundingClientRect(),k=e.$.documentElement,m=k.clientTop||h.$.clientTop||0,q=k.clientLeft||h.$.clientLeft||0,r=true;if(CKEDITOR.env.ie){r=e.getDocumentElement().contains(this);e=e.getBody().contains(this);r=j&&e||!j&&r}if(r){b=i.left+(!j&&k.scrollLeft||h.$.scrollLeft);b=b-q;c=i.top+(!j&&k.scrollTop||h.$.scrollTop);c=c-m}}else{h=this;for(e=null;h&&!(h.getName()=="body"||h.getName()=="html");){b=b+(h.$.offsetLeft-h.$.scrollLeft);c=c+(h.$.offsetTop-h.$.scrollTop);if(!h.equals(this)){b=b+(h.$.clientLeft||
+0);c=c+(h.$.clientTop||0)}for(;e&&!e.equals(h);){b=b-e.$.scrollLeft;c=c-e.$.scrollTop;e=e.getParent()}e=h;h=(i=h.$.offsetParent)?new CKEDITOR.dom.element(i):null}}if(a){h=this.getWindow();e=a.getWindow();if(!h.equals(e)&&h.$.frameElement){a=(new CKEDITOR.dom.element(h.$.frameElement)).getDocumentPosition(a);b=b+a.x;c=c+a.y}}if(!document.documentElement.getBoundingClientRect&&CKEDITOR.env.gecko&&!j){b=b+(this.$.clientLeft?1:0);c=c+(this.$.clientTop?1:0)}return{x:b,y:c}},scrollIntoView:function(a){var b=
+this.getParent();if(b){do{(b.$.clientWidth&&b.$.clientWidth<b.$.scrollWidth||b.$.clientHeight&&b.$.clientHeight<b.$.scrollHeight)&&!b.is("body")&&this.scrollIntoParent(b,a,1);if(b.is("html")){var c=b.getWindow();try{var e=c.$.frameElement;e&&(b=new CKEDITOR.dom.element(e))}catch(h){}}}while(b=b.getParent())}},scrollIntoParent:function(a,b,c){var e,h,j,i;function k(b,g){if(/body|html/.test(a.getName()))a.getWindow().$.scrollBy(b,g);else{a.$.scrollLeft=a.$.scrollLeft+b;a.$.scrollTop=a.$.scrollTop+g}}
+function m(a,b){var g={x:0,y:0};if(!a.is(r?"body":"html")){var c=a.$.getBoundingClientRect();g.x=c.left;g.y=c.top}c=a.getWindow();if(!c.equals(b)){c=m(CKEDITOR.dom.element.get(c.$.frameElement),b);g.x=g.x+c.x;g.y=g.y+c.y}return g}function q(a,b){return parseInt(a.getComputedStyle("margin-"+b)||0,10)||0}!a&&(a=this.getWindow());j=a.getDocument();var r=j.$.compatMode=="BackCompat";a instanceof CKEDITOR.dom.window&&(a=r?j.getBody():j.getDocumentElement());j=a.getWindow();h=m(this,j);var l=m(a,j),g=this.$.offsetHeight;
+e=this.$.offsetWidth;var p=a.$.clientHeight,v=a.$.clientWidth;j=h.x-q(this,"left")-l.x||0;i=h.y-q(this,"top")-l.y||0;e=h.x+e+q(this,"right")-(l.x+v)||0;h=h.y+g+q(this,"bottom")-(l.y+p)||0;if(i<0||h>0)k(0,b===true?i:b===false?h:i<0?i:h);if(c&&(j<0||e>0))k(j<0?j:e,0)},setState:function(a,b,c){b=b||"cke";switch(a){case CKEDITOR.TRISTATE_ON:this.addClass(b+"_on");this.removeClass(b+"_off");this.removeClass(b+"_disabled");c&&this.setAttribute("aria-pressed",true);c&&this.removeAttribute("aria-disabled");
+break;case CKEDITOR.TRISTATE_DISABLED:this.addClass(b+"_disabled");this.removeClass(b+"_off");this.removeClass(b+"_on");c&&this.setAttribute("aria-disabled",true);c&&this.removeAttribute("aria-pressed");break;default:this.addClass(b+"_off");this.removeClass(b+"_on");this.removeClass(b+"_disabled");c&&this.removeAttribute("aria-pressed");c&&this.removeAttribute("aria-disabled")}},getFrameDocument:function(){var a=this.$;try{a.contentWindow.document}catch(b){a.src=a.src}return a&&new CKEDITOR.dom.document(a.contentWindow.document)},
+copyAttributes:function(a,b){for(var c=this.$.attributes,b=b||{},e=0;e<c.length;e++){var h=c[e],j=h.nodeName.toLowerCase(),i;if(!(j in b))if(j=="checked"&&(i=this.getAttribute(j)))a.setAttribute(j,i);else if(h.specified||CKEDITOR.env.ie&&h.nodeValue&&j=="value"){i=this.getAttribute(j);if(i===null)i=h.nodeValue;a.setAttribute(j,i)}}if(this.$.style.cssText!=="")a.$.style.cssText=this.$.style.cssText},renameNode:function(a){if(this.getName()!=a){var b=this.getDocument(),a=new CKEDITOR.dom.element(a,
+b);this.copyAttributes(a);this.moveChildren(a);this.getParent()&&this.$.parentNode.replaceChild(a.$,this.$);a.$["data-cke-expando"]=this.$["data-cke-expando"];this.$=a.$}},getChild:function(){function a(a,b){var c=a.childNodes;if(b>=0&&b<c.length)return c[b]}return function(b){var c=this.$;if(b.slice)for(;b.length>0&&c;)c=a(c,b.shift());else c=a(c,b);return c?new CKEDITOR.dom.node(c):null}}(),getChildCount:function(){return this.$.childNodes.length},disableContextMenu:function(){this.on("contextmenu",
+function(a){a.data.getTarget().hasClass("cke_enable_context_menu")||a.data.preventDefault()})},getDirection:function(a){return a?this.getComputedStyle("direction")||this.getDirection()||this.getParent()&&this.getParent().getDirection(1)||this.getDocument().$.dir||"ltr":this.getStyle("direction")||this.getAttribute("dir")},data:function(a,b){a="data-"+a;if(b===void 0)return this.getAttribute(a);b===false?this.removeAttribute(a):this.setAttribute(a,b);return null},getEditor:function(){var a=CKEDITOR.instances,
+b,c;for(b in a){c=a[b];if(c.element.equals(this)&&c.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO)return c}return null}});var c={width:["border-left-width","border-right-width","padding-left","padding-right"],height:["border-top-width","border-bottom-width","padding-top","padding-bottom"]};CKEDITOR.dom.element.prototype.setSize=function(a,c,d){if(typeof c=="number"){if(d&&(!CKEDITOR.env.ie||!CKEDITOR.env.quirks))c=c-b.call(this,a);this.setStyle(a,c+"px")}};CKEDITOR.dom.element.prototype.getSize=function(a,
+c){var d=Math.max(this.$["offset"+CKEDITOR.tools.capitalize(a)],this.$["client"+CKEDITOR.tools.capitalize(a)])||0;c&&(d=d-b.call(this,a));return d}})();CKEDITOR.dom.documentFragment=function(b){b=b||CKEDITOR.document;this.$=b.type==CKEDITOR.NODE_DOCUMENT?b.$.createDocumentFragment():b};
+CKEDITOR.tools.extend(CKEDITOR.dom.documentFragment.prototype,CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,insertAfterNode:function(b){b=b.$;b.parentNode.insertBefore(this.$,b.nextSibling)}},!0,{append:1,appendBogus:1,getFirst:1,getLast:1,getParent:1,getNext:1,getPrevious:1,appendTo:1,moveChildren:1,insertBefore:1,insertAfterNode:1,replace:1,trim:1,type:1,ltrim:1,rtrim:1,getDocument:1,getChildCount:1,getChild:1,getChildren:1});
+(function(){function b(a,b){var c=this.range;if(this._.end)return null;if(!this._.start){this._.start=1;if(c.collapsed){this.end();return null}c.optimize()}var d,m=c.startContainer;d=c.endContainer;var q=c.startOffset,f=c.endOffset,l,g=this.guard,p=this.type,e=a?"getPreviousSourceNode":"getNextSourceNode";if(!a&&!this._.guardLTR){var u=d.type==CKEDITOR.NODE_ELEMENT?d:d.getParent(),o=d.type==CKEDITOR.NODE_ELEMENT?d.getChild(f):d.getNext();this._.guardLTR=function(a,b){return(!b||!u.equals(a))&&(!o||
+!a.equals(o))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}if(a&&!this._.guardRTL){var F=m.type==CKEDITOR.NODE_ELEMENT?m:m.getParent(),A=m.type==CKEDITOR.NODE_ELEMENT?q?m.getChild(q-1):null:m.getPrevious();this._.guardRTL=function(a,b){return(!b||!F.equals(a))&&(!A||!a.equals(A))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}var s=a?this._.guardRTL:this._.guardLTR;l=g?function(a,b){return s(a,b)===false?false:g(a,b)}:s;if(this.current)d=this.current[e](false,p,l);else{if(a)d.type==
+CKEDITOR.NODE_ELEMENT&&(d=f>0?d.getChild(f-1):l(d,true)===false?null:d.getPreviousSourceNode(true,p,l));else{d=m;if(d.type==CKEDITOR.NODE_ELEMENT&&!(d=d.getChild(q)))d=l(m,true)===false?null:m.getNextSourceNode(true,p,l)}d&&l(d)===false&&(d=null)}for(;d&&!this._.end;){this.current=d;if(!this.evaluator||this.evaluator(d)!==false){if(!b)return d}else if(b&&this.evaluator)return false;d=d[e](false,p,l)}this.end();return this.current=null}function c(a){for(var c,d=null;c=b.call(this,a);)d=c;return d}
+CKEDITOR.dom.walker=CKEDITOR.tools.createClass({$:function(a){this.range=a;this._={}},proto:{end:function(){this._.end=1},next:function(){return b.call(this)},previous:function(){return b.call(this,1)},checkForward:function(){return b.call(this,0,1)!==false},checkBackward:function(){return b.call(this,1,1)!==false},lastForward:function(){return c.call(this)},lastBackward:function(){return c.call(this,1)},reset:function(){delete this.current;this._={}}}});var a={block:1,"list-item":1,table:1,"table-row-group":1,
+"table-header-group":1,"table-footer-group":1,"table-row":1,"table-column-group":1,"table-column":1,"table-cell":1,"table-caption":1};CKEDITOR.dom.element.prototype.isBlockBoundary=function(b){b=b?CKEDITOR.tools.extend({},CKEDITOR.dtd.$block,b||{}):CKEDITOR.dtd.$block;return this.getComputedStyle("float")=="none"&&a[this.getComputedStyle("display")]||b[this.getName()]};CKEDITOR.dom.walker.blockBoundary=function(a){return function(b){return!(b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary(a))}};CKEDITOR.dom.walker.listItemBoundary=
+function(){return this.blockBoundary({br:1})};CKEDITOR.dom.walker.bookmark=function(a,b){function c(a){return a&&a.getName&&a.getName()=="span"&&a.data("cke-bookmark")}return function(d){var m,q;m=d&&d.type!=CKEDITOR.NODE_ELEMENT&&(q=d.getParent())&&c(q);m=a?m:m||c(d);return!!(b^m)}};CKEDITOR.dom.walker.whitespaces=function(a){return function(b){var c;b&&b.type==CKEDITOR.NODE_TEXT&&(c=!CKEDITOR.tools.trim(b.getText())||CKEDITOR.env.webkit&&b.getText()=="​");return!!(a^c)}};CKEDITOR.dom.walker.invisible=
+function(a){var b=CKEDITOR.dom.walker.whitespaces();return function(c){if(b(c))c=1;else{c.type==CKEDITOR.NODE_TEXT&&(c=c.getParent());c=!c.$.offsetHeight}return!!(a^c)}};CKEDITOR.dom.walker.nodeType=function(a,b){return function(c){return!!(b^c.type==a)}};CKEDITOR.dom.walker.bogus=function(a){function b(a){return!d(a)&&!e(a)}return function(c){var d=!CKEDITOR.env.ie?c.is&&c.is("br"):c.getText&&f.test(c.getText());if(d){d=c.getParent();c=c.getNext(b);d=d.isBlockBoundary()&&(!c||c.type==CKEDITOR.NODE_ELEMENT&&
+c.isBlockBoundary())}return!!(a^d)}};var f=/^[\t\r\n ]*(?:&nbsp;|\xa0)$/,d=CKEDITOR.dom.walker.whitespaces(),e=CKEDITOR.dom.walker.bookmark();CKEDITOR.dom.element.prototype.getBogus=function(){var a=this;do a=a.getPreviousSourceNode();while(e(a)||d(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in CKEDITOR.dtd.$inline&&!(a.getName()in CKEDITOR.dtd.$empty));return a&&(!CKEDITOR.env.ie?a.is&&a.is("br"):a.getText&&f.test(a.getText()))?a:false}})();
+CKEDITOR.dom.range=function(b){this.endOffset=this.endContainer=this.startOffset=this.startContainer=null;this.collapsed=true;var c=b instanceof CKEDITOR.dom.document;this.document=c?b:b.getDocument();this.root=c?b.getBody():b};
+(function(){function b(){var a=false,b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(true),l=CKEDITOR.dom.walker.bogus();return function(g){if(c(g)||b(g))return true;if(l(g)&&!a)return a=true;return g.type==CKEDITOR.NODE_TEXT&&(g.hasAscendant("pre")||CKEDITOR.tools.trim(g.getText()).length)||g.type==CKEDITOR.NODE_ELEMENT&&!g.is(e)?false:true}}function c(a){var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(1);return function(l){return c(l)||b(l)?true:!a&&h(l)||
+l.type==CKEDITOR.NODE_ELEMENT&&l.is(CKEDITOR.dtd.$removeEmpty)}}function a(a){return!j(a)&&!i(a)}var f=function(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer.equals(a.endContainer)&&a.startOffset==a.endOffset},d=function(a,b,c,l){a.optimizeBookmark();var g=a.startContainer,d=a.endContainer,f=a.startOffset,e=a.endOffset,h,i;if(d.type==CKEDITOR.NODE_TEXT)d=d.split(e);else if(d.getChildCount()>0)if(e>=d.getChildCount()){d=d.append(a.document.createText(""));i=true}else d=d.getChild(e);
+if(g.type==CKEDITOR.NODE_TEXT){g.split(f);g.equals(d)&&(d=g.getNext())}else if(f)if(f>=g.getChildCount()){g=g.append(a.document.createText(""));h=true}else g=g.getChild(f).getPrevious();else{g=g.append(a.document.createText(""),1);h=true}var f=g.getParents(),e=d.getParents(),j,s,x;for(j=0;j<f.length;j++){s=f[j];x=e[j];if(!s.equals(x))break}for(var k=c,t,C,y,n=j;n<f.length;n++){t=f[n];k&&!t.equals(g)&&(C=k.append(t.clone()));for(t=t.getNext();t;){if(t.equals(e[n])||t.equals(d))break;y=t.getNext();
+if(b==2)k.append(t.clone(true));else{t.remove();b==1&&k.append(t)}t=y}k&&(k=C)}k=c;for(c=j;c<e.length;c++){t=e[c];b>0&&!t.equals(d)&&(C=k.append(t.clone()));if(!f[c]||t.$.parentNode!=f[c].$.parentNode)for(t=t.getPrevious();t;){if(t.equals(f[c])||t.equals(g))break;y=t.getPrevious();if(b==2)k.$.insertBefore(t.$.cloneNode(true),k.$.firstChild);else{t.remove();b==1&&k.$.insertBefore(t.$,k.$.firstChild)}t=y}k&&(k=C)}if(b==2){s=a.startContainer;if(s.type==CKEDITOR.NODE_TEXT){s.$.data=s.$.data+s.$.nextSibling.data;
+s.$.parentNode.removeChild(s.$.nextSibling)}a=a.endContainer;if(a.type==CKEDITOR.NODE_TEXT&&a.$.nextSibling){a.$.data=a.$.data+a.$.nextSibling.data;a.$.parentNode.removeChild(a.$.nextSibling)}}else{if(s&&x&&(g.$.parentNode!=s.$.parentNode||d.$.parentNode!=x.$.parentNode)){b=x.getIndex();h&&x.$.parentNode==g.$.parentNode&&b--;if(l&&s.type==CKEDITOR.NODE_ELEMENT){l=CKEDITOR.dom.element.createFromHtml('<span data-cke-bookmark="1" style="display:none">&nbsp;</span>',a.document);l.insertAfter(s);s.mergeSiblings(false);
+a.moveToBookmark({startNode:l})}else a.setStart(x.getParent(),b)}a.collapse(true)}h&&g.remove();i&&d.$.parentNode&&d.remove()},e={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,"var":1},h=CKEDITOR.dom.walker.bogus(),j=new CKEDITOR.dom.walker.whitespaces,i=new CKEDITOR.dom.walker.bookmark,k=/^[\t\r\n ]*(?:&nbsp;|\xa0)$/;CKEDITOR.dom.range.prototype={clone:function(){var a=new CKEDITOR.dom.range(this.root);
+a.startContainer=this.startContainer;a.startOffset=this.startOffset;a.endContainer=this.endContainer;a.endOffset=this.endOffset;a.collapsed=this.collapsed;return a},collapse:function(a){if(a){this.endContainer=this.startContainer;this.endOffset=this.startOffset}else{this.startContainer=this.endContainer;this.startOffset=this.endOffset}this.collapsed=true},cloneContents:function(){var a=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||d(this,2,a);return a},deleteContents:function(a){this.collapsed||
+d(this,0,null,a)},extractContents:function(a){var b=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||d(this,1,b,a);return b},createBookmark:function(a){var b,c,d,g,p=this.collapsed;b=this.document.createElement("span");b.data("cke-bookmark",1);b.setStyle("display","none");b.setHtml("&nbsp;");if(a){d="cke_bm_"+CKEDITOR.tools.getNextNumber();b.setAttribute("id",d+(p?"C":"S"))}if(!p){c=b.clone();c.setHtml("&nbsp;");a&&c.setAttribute("id",d+"E");g=this.clone();g.collapse();g.insertNode(c)}g=
+this.clone();g.collapse(true);g.insertNode(b);if(c){this.setStartAfter(b);this.setEndBefore(c)}else this.moveToPosition(b,CKEDITOR.POSITION_AFTER_END);return{startNode:a?d+(p?"C":"S"):b,endNode:a?d+"E":c,serializable:a,collapsed:p}},createBookmark2:function(){function a(b,c){return c>0&&b&&b.type==CKEDITOR.NODE_TEXT&&b.getPrevious()&&b.getPrevious().type==CKEDITOR.NODE_TEXT}function b(c){var d,g,p=c.container,q=c.offset;if(p.type==CKEDITOR.NODE_ELEMENT){if(d=p.getChild(q)){if(a(d,q)){p=d;q=0}}else{d=
+p.getLast();if(a(d,q)){p=d;q=d.getLength()}}d&&d.type==CKEDITOR.NODE_ELEMENT&&(q=d.getIndex(1))}for(;p.type==CKEDITOR.NODE_TEXT&&(g=p.getPrevious())&&g.type==CKEDITOR.NODE_TEXT;){p=g;q=q+g.getLength()}c.container=p;c.offset=q}return function(a){var c=this.collapsed,g={container:this.startContainer,offset:this.startOffset},d={container:this.endContainer,offset:this.endOffset};if(!g.container||!d.container)return{start:0,end:0};if(a){b(g);c||b(d)}return{start:g.container.getAddress(a),end:c?null:d.container.getAddress(a),
+startOffset:g.offset,endOffset:d.offset,normalized:a,collapsed:c,is2:true}}}(),moveToBookmark:function(a){if(a.is2){var b=this.document.getByAddress(a.start,a.normalized),c=a.startOffset,d=a.end&&this.document.getByAddress(a.end,a.normalized),a=a.endOffset;this.setStart(b,c);d?this.setEnd(d,a):this.collapse(true)}else{b=(c=a.serializable)?this.document.getById(a.startNode):a.startNode;a=c?this.document.getById(a.endNode):a.endNode;this.setStartBefore(b);b.remove();if(a){this.setEndBefore(a);a.remove()}else this.collapse(true)}},
+getBoundaryNodes:function(){var a=this.startContainer,b=this.endContainer,c=this.startOffset,d=this.endOffset,g;if(a.type==CKEDITOR.NODE_ELEMENT){g=a.getChildCount();if(g>c)a=a.getChild(c);else if(g<1)a=a.getPreviousSourceNode();else{for(a=a.$;a.lastChild;)a=a.lastChild;a=new CKEDITOR.dom.node(a);a=a.getNextSourceNode()||a}}if(b.type==CKEDITOR.NODE_ELEMENT){g=b.getChildCount();if(g>d)b=b.getChild(d).getPreviousSourceNode(true);else if(g<1)b=b.getPreviousSourceNode();else{for(b=b.$;b.lastChild;)b=
+b.lastChild;b=new CKEDITOR.dom.node(b)}}a.getPosition(b)&CKEDITOR.POSITION_FOLLOWING&&(a=b);return{startNode:a,endNode:b}},getCommonAncestor:function(a,b){var c=this.startContainer,d=this.endContainer,c=c.equals(d)?a&&c.type==CKEDITOR.NODE_ELEMENT&&this.startOffset==this.endOffset-1?c.getChild(this.startOffset):c:c.getCommonAncestor(d);return b&&!c.is?c.getParent():c},optimize:function(){var a=this.startContainer,b=this.startOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setStartAfter(a):
+this.setStartBefore(a));a=this.endContainer;b=this.endOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setEndAfter(a):this.setEndBefore(a))},optimizeBookmark:function(){var a=this.startContainer,b=this.endContainer;a.is&&(a.is("span")&&a.data("cke-bookmark"))&&this.setStartAt(a,CKEDITOR.POSITION_BEFORE_START);b&&(b.is&&b.is("span")&&b.data("cke-bookmark"))&&this.setEndAt(b,CKEDITOR.POSITION_AFTER_END)},trim:function(a,b){var c=this.startContainer,d=this.startOffset,g=this.collapsed;
+if((!a||g)&&c&&c.type==CKEDITOR.NODE_TEXT){if(d)if(d>=c.getLength()){d=c.getIndex()+1;c=c.getParent()}else{var p=c.split(d),d=c.getIndex()+1,c=c.getParent();if(this.startContainer.equals(this.endContainer))this.setEnd(p,this.endOffset-this.startOffset);else if(c.equals(this.endContainer))this.endOffset=this.endOffset+1}else{d=c.getIndex();c=c.getParent()}this.setStart(c,d);if(g){this.collapse(true);return}}c=this.endContainer;d=this.endOffset;if(!b&&!g&&c&&c.type==CKEDITOR.NODE_TEXT){if(d){d>=c.getLength()||
+c.split(d);d=c.getIndex()+1}else d=c.getIndex();c=c.getParent();this.setEnd(c,d)}},enlarge:function(a,b){switch(a){case CKEDITOR.ENLARGE_INLINE:var c=1;case CKEDITOR.ENLARGE_ELEMENT:if(this.collapsed)break;var d=this.getCommonAncestor(),g=this.root,p,f,e,h,i,j=false,s,x;s=this.startContainer;x=this.startOffset;if(s.type==CKEDITOR.NODE_TEXT){if(x){s=!CKEDITOR.tools.trim(s.substring(0,x)).length&&s;j=!!s}if(s&&!(h=s.getPrevious()))e=s.getParent()}else{x&&(h=s.getChild(x-1)||s.getLast());h||(e=s)}for(;e||
+h;){if(e&&!h){!i&&e.equals(d)&&(i=true);if(c?e.isBlockBoundary():!g.contains(e))break;if(!j||e.getComputedStyle("display")!="inline"){j=false;i?p=e:this.setStartBefore(e)}h=e.getPrevious()}for(;h;){s=false;if(h.type==CKEDITOR.NODE_COMMENT)h=h.getPrevious();else{if(h.type==CKEDITOR.NODE_TEXT){x=h.getText();/[^\s\ufeff]/.test(x)&&(h=null);s=/[\s\ufeff]$/.test(x)}else if((h.$.offsetWidth>0||b&&h.is("br"))&&!h.data("cke-bookmark"))if(j&&CKEDITOR.dtd.$removeEmpty[h.getName()]){x=h.getText();if(/[^\s\ufeff]/.test(x))h=
+null;else for(var k=h.$.getElementsByTagName("*"),t=0,C;C=k[t++];)if(!CKEDITOR.dtd.$removeEmpty[C.nodeName.toLowerCase()]){h=null;break}h&&(s=!!x.length)}else h=null;s&&(j?i?p=e:e&&this.setStartBefore(e):j=true);if(h){s=h.getPrevious();if(!e&&!s){e=h;h=null;break}h=s}else e=null}}e&&(e=e.getParent())}s=this.endContainer;x=this.endOffset;e=h=null;i=j=false;if(s.type==CKEDITOR.NODE_TEXT){s=!CKEDITOR.tools.trim(s.substring(x)).length&&s;j=!(s&&s.getLength());if(s&&!(h=s.getNext()))e=s.getParent()}else(h=
+s.getChild(x))||(e=s);for(;e||h;){if(e&&!h){!i&&e.equals(d)&&(i=true);if(c?e.isBlockBoundary():!g.contains(e))break;if(!j||e.getComputedStyle("display")!="inline"){j=false;i?f=e:e&&this.setEndAfter(e)}h=e.getNext()}for(;h;){s=false;if(h.type==CKEDITOR.NODE_TEXT){x=h.getText();/[^\s\ufeff]/.test(x)&&(h=null);s=/^[\s\ufeff]/.test(x)}else if(h.type==CKEDITOR.NODE_ELEMENT){if((h.$.offsetWidth>0||b&&h.is("br"))&&!h.data("cke-bookmark"))if(j&&CKEDITOR.dtd.$removeEmpty[h.getName()]){x=h.getText();if(/[^\s\ufeff]/.test(x))h=
+null;else{k=h.$.getElementsByTagName("*");for(t=0;C=k[t++];)if(!CKEDITOR.dtd.$removeEmpty[C.nodeName.toLowerCase()]){h=null;break}}h&&(s=!!x.length)}else h=null}else s=1;s&&j&&(i?f=e:this.setEndAfter(e));if(h){s=h.getNext();if(!e&&!s){e=h;h=null;break}h=s}else e=null}e&&(e=e.getParent())}if(p&&f){d=p.contains(f)?f:p;this.setStartBefore(d);this.setEndAfter(d)}break;case CKEDITOR.ENLARGE_BLOCK_CONTENTS:case CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:e=new CKEDITOR.dom.range(this.root);g=this.root;e.setStartAt(g,
+CKEDITOR.POSITION_AFTER_START);e.setEnd(this.startContainer,this.startOffset);e=new CKEDITOR.dom.walker(e);var y,n,w=CKEDITOR.dom.walker.blockBoundary(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?{br:1}:null),I=function(a){var b=w(a);b||(y=a);return b},c=function(a){var b=I(a);!b&&(a.is&&a.is("br"))&&(n=a);return b};e.guard=I;e=e.lastBackward();y=y||g;this.setStartAt(y,!y.is("br")&&(!e&&this.checkStartOfBlock()||e&&y.contains(e))?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_AFTER_END);if(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS){e=
+this.clone();e=new CKEDITOR.dom.walker(e);var G=CKEDITOR.dom.walker.whitespaces(),D=CKEDITOR.dom.walker.bookmark();e.evaluator=function(a){return!G(a)&&!D(a)};if((e=e.previous())&&e.type==CKEDITOR.NODE_ELEMENT&&e.is("br"))break}e=this.clone();e.collapse();e.setEndAt(g,CKEDITOR.POSITION_BEFORE_END);e=new CKEDITOR.dom.walker(e);e.guard=a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?c:I;y=null;e=e.lastForward();y=y||g;this.setEndAt(y,!e&&this.checkEndOfBlock()||e&&y.contains(e)?CKEDITOR.POSITION_BEFORE_END:
+CKEDITOR.POSITION_BEFORE_START);n&&this.setEndAfter(n)}},shrink:function(a,b,c){if(!this.collapsed){var a=a||CKEDITOR.SHRINK_TEXT,d=this.clone(),g=this.startContainer,e=this.endContainer,f=this.startOffset,h=this.endOffset,i=1,j=1;if(g&&g.type==CKEDITOR.NODE_TEXT)if(f)if(f>=g.getLength())d.setStartAfter(g);else{d.setStartBefore(g);i=0}else d.setStartBefore(g);if(e&&e.type==CKEDITOR.NODE_TEXT)if(h)if(h>=e.getLength())d.setEndAfter(e);else{d.setEndAfter(e);j=0}else d.setEndBefore(e);var d=new CKEDITOR.dom.walker(d),
+k=CKEDITOR.dom.walker.bookmark();d.evaluator=function(b){return b.type==(a==CKEDITOR.SHRINK_ELEMENT?CKEDITOR.NODE_ELEMENT:CKEDITOR.NODE_TEXT)};var s;d.guard=function(b,g){if(k(b))return true;if(a==CKEDITOR.SHRINK_ELEMENT&&b.type==CKEDITOR.NODE_TEXT||g&&b.equals(s)||c===false&&b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary())return false;!g&&b.type==CKEDITOR.NODE_ELEMENT&&(s=b);return true};if(i)(g=d[a==CKEDITOR.SHRINK_ELEMENT?"lastForward":"next"]())&&this.setStartAt(g,b?CKEDITOR.POSITION_AFTER_START:
+CKEDITOR.POSITION_BEFORE_START);if(j){d.reset();(d=d[a==CKEDITOR.SHRINK_ELEMENT?"lastBackward":"previous"]())&&this.setEndAt(d,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_END)}return!(!i&&!j)}},insertNode:function(a){this.optimizeBookmark();this.trim(false,true);var b=this.startContainer,c=b.getChild(this.startOffset);c?a.insertBefore(c):b.append(a);a.getParent()&&a.getParent().equals(this.endContainer)&&this.endOffset++;this.setStartBefore(a)},moveToPosition:function(a,b){this.setStartAt(a,
+b);this.collapse(true)},moveToRange:function(a){this.setStart(a.startContainer,a.startOffset);this.setEnd(a.endContainer,a.endOffset)},selectNodeContents:function(a){this.setStart(a,0);this.setEnd(a,a.type==CKEDITOR.NODE_TEXT?a.getLength():a.getChildCount())},setStart:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex();a=a.getParent()}this.startContainer=a;this.startOffset=b;if(!this.endContainer){this.endContainer=a;this.endOffset=b}f(this)},setEnd:function(a,
+b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex()+1;a=a.getParent()}this.endContainer=a;this.endOffset=b;if(!this.startContainer){this.startContainer=a;this.startOffset=b}f(this)},setStartAfter:function(a){this.setStart(a.getParent(),a.getIndex()+1)},setStartBefore:function(a){this.setStart(a.getParent(),a.getIndex())},setEndAfter:function(a){this.setEnd(a.getParent(),a.getIndex()+1)},setEndBefore:function(a){this.setEnd(a.getParent(),a.getIndex())},setStartAt:function(a,
+b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setStart(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type==CKEDITOR.NODE_TEXT?this.setStart(a,a.getLength()):this.setStart(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setStartBefore(a);break;case CKEDITOR.POSITION_AFTER_END:this.setStartAfter(a)}f(this)},setEndAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setEnd(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type==CKEDITOR.NODE_TEXT?this.setEnd(a,
+a.getLength()):this.setEnd(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setEndBefore(a);break;case CKEDITOR.POSITION_AFTER_END:this.setEndAfter(a)}f(this)},fixBlock:function(a,b){var c=this.createBookmark(),d=this.document.createElement(b);this.collapse(a);this.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);this.extractContents().appendTo(d);d.trim();CKEDITOR.env.ie||d.appendBogus();this.insertNode(d);this.moveToBookmark(c);return d},splitBlock:function(a){var b=new CKEDITOR.dom.elementPath(this.startContainer,
+this.root),c=new CKEDITOR.dom.elementPath(this.endContainer,this.root),d=b.block,g=c.block,e=null;if(!b.blockLimit.equals(c.blockLimit))return null;if(a!="br"){if(!d){d=this.fixBlock(true,a);g=(new CKEDITOR.dom.elementPath(this.endContainer,this.root)).block}g||(g=this.fixBlock(false,a))}a=d&&this.checkStartOfBlock();b=g&&this.checkEndOfBlock();this.deleteContents();if(d&&d.equals(g))if(b){e=new CKEDITOR.dom.elementPath(this.startContainer,this.root);this.moveToPosition(g,CKEDITOR.POSITION_AFTER_END);
+g=null}else if(a){e=new CKEDITOR.dom.elementPath(this.startContainer,this.root);this.moveToPosition(d,CKEDITOR.POSITION_BEFORE_START);d=null}else{g=this.splitElement(d);!CKEDITOR.env.ie&&!d.is("ul","ol")&&d.appendBogus()}return{previousBlock:d,nextBlock:g,wasStartOfBlock:a,wasEndOfBlock:b,elementPath:e}},splitElement:function(a){if(!this.collapsed)return null;this.setEndAt(a,CKEDITOR.POSITION_BEFORE_END);var b=this.extractContents(),c=a.clone(false);b.appendTo(c);c.insertAfter(a);this.moveToPosition(a,
+CKEDITOR.POSITION_AFTER_END);return c},removeEmptyBlocksAtEnd:function(){function a(d){return function(a){return b(a)||(c(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.isEmptyInlineRemoveable())||d.is("table")&&a.is("caption")?false:true}}var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(false);return function(b){for(var c=this.createBookmark(),d=this[b?"endPath":"startPath"](),e=d.block||d.blockLimit,f;e&&!e.equals(d.root)&&!e.getFirst(a(e));){f=e.getParent();this[b?"setEndAt":"setStartAt"](e,
+CKEDITOR.POSITION_AFTER_END);e.remove(1);e=f}this.moveToBookmark(c)}}(),startPath:function(){return new CKEDITOR.dom.elementPath(this.startContainer,this.root)},endPath:function(){return new CKEDITOR.dom.elementPath(this.endContainer,this.root)},checkBoundaryOfElement:function(a,b){var d=b==CKEDITOR.START,e=this.clone();e.collapse(d);e[d?"setStartAt":"setEndAt"](a,d?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END);e=new CKEDITOR.dom.walker(e);e.evaluator=c(d);return e[d?"checkBackward":
+"checkForward"]()},checkStartOfBlock:function(){var a=this.startContainer,c=this.startOffset;if(CKEDITOR.env.ie&&c&&a.type==CKEDITOR.NODE_TEXT){a=CKEDITOR.tools.ltrim(a.substring(0,c));k.test(a)&&this.trim(0,1)}this.trim();a=new CKEDITOR.dom.elementPath(this.startContainer,this.root);c=this.clone();c.collapse(true);c.setStartAt(a.block||a.blockLimit,CKEDITOR.POSITION_AFTER_START);a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkBackward()},checkEndOfBlock:function(){var a=this.endContainer,
+c=this.endOffset;if(CKEDITOR.env.ie&&a.type==CKEDITOR.NODE_TEXT){a=CKEDITOR.tools.rtrim(a.substring(c));k.test(a)&&this.trim(1,0)}this.trim();a=new CKEDITOR.dom.elementPath(this.endContainer,this.root);c=this.clone();c.collapse(false);c.setEndAt(a.block||a.blockLimit,CKEDITOR.POSITION_BEFORE_END);a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkForward()},getPreviousNode:function(a,b,c){var d=this.clone();d.collapse(1);d.setStartAt(c||this.root,CKEDITOR.POSITION_AFTER_START);c=new CKEDITOR.dom.walker(d);
+c.evaluator=a;c.guard=b;return c.previous()},getNextNode:function(a,b,c){var d=this.clone();d.collapse();d.setEndAt(c||this.root,CKEDITOR.POSITION_BEFORE_END);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.next()},checkReadOnly:function(){function a(b,c){for(;b;){if(b.type==CKEDITOR.NODE_ELEMENT){if(b.getAttribute("contentEditable")=="false"&&!b.data("cke-editable"))return 0;if(b.is("html")||b.getAttribute("contentEditable")=="true"&&(b.contains(c)||b.equals(c)))break}b=b.getParent()}return 1}
+return function(){var b=this.startContainer,c=this.endContainer;return!(a(b,c)&&a(c,b))}}(),moveToElementEditablePosition:function(b,c){if(b.type==CKEDITOR.NODE_ELEMENT&&!b.isEditable(false)){this.moveToPosition(b,c?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);return true}for(var d=0;b;){if(b.type==CKEDITOR.NODE_TEXT){c&&this.checkEndOfBlock()&&k.test(b.getText())?this.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START):this.moveToPosition(b,c?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);
+d=1;break}if(b.type==CKEDITOR.NODE_ELEMENT)if(b.isEditable()){this.moveToPosition(b,c?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_START);d=1}else c&&(b.is("br")&&this.checkEndOfBlock())&&this.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START);var e=b,g=d,f=void 0;e.type==CKEDITOR.NODE_ELEMENT&&e.isEditable(false)&&(f=e[c?"getLast":"getFirst"](a));!g&&!f&&(f=e[c?"getPrevious":"getNext"](a));b=f}return!!d},moveToElementEditStart:function(a){return this.moveToElementEditablePosition(a)},moveToElementEditEnd:function(a){return this.moveToElementEditablePosition(a,
+true)},getEnclosedNode:function(){var a=this.clone();a.optimize();if(a.startContainer.type!=CKEDITOR.NODE_ELEMENT||a.endContainer.type!=CKEDITOR.NODE_ELEMENT)return null;var a=new CKEDITOR.dom.walker(a),b=CKEDITOR.dom.walker.bookmark(false,true),c=CKEDITOR.dom.walker.whitespaces(true);a.evaluator=function(a){return c(a)&&b(a)};var d=a.next();a.reset();return d&&d.equals(a.previous())?d:null},getTouchedStartNode:function(){var a=this.startContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?
+a:a.getChild(this.startOffset)||a},getTouchedEndNode:function(){var a=this.endContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.endOffset-1)||a},scrollIntoView:function(){var a=new CKEDITOR.dom.element.createFromHtml("<span>&nbsp;</span>",this.document),b,c,d,g=this.clone();g.optimize();if(d=g.startContainer.type==CKEDITOR.NODE_TEXT){c=g.startContainer.getText();b=g.startContainer.split(g.startOffset);a.insertAfter(g.startContainer)}else g.insertNode(a);a.scrollIntoView();
+if(d){g.startContainer.setText(c);b.remove()}a.remove()}}})();CKEDITOR.POSITION_AFTER_START=1;CKEDITOR.POSITION_BEFORE_END=2;CKEDITOR.POSITION_BEFORE_START=3;CKEDITOR.POSITION_AFTER_END=4;CKEDITOR.ENLARGE_ELEMENT=1;CKEDITOR.ENLARGE_BLOCK_CONTENTS=2;CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS=3;CKEDITOR.ENLARGE_INLINE=4;CKEDITOR.START=1;CKEDITOR.END=2;CKEDITOR.SHRINK_ELEMENT=1;CKEDITOR.SHRINK_TEXT=2;
+(function(){function b(a){if(!(arguments.length<1)){this.range=a;this.forceBrBreak=0;this.enlargeBr=1;this.enforceRealBlocks=0;this._||(this._={})}}function c(a,b,c){for(a=a.getNextSourceNode(b,null,c);!f(a);)a=a.getNextSourceNode(b,null,c);return a}var a=/^[\r\n\t ]+$/,f=CKEDITOR.dom.walker.bookmark(false,true),d=CKEDITOR.dom.walker.whitespaces(true),e=function(a){return f(a)&&d(a)};b.prototype={getNextParagraph:function(b){b=b||"p";if(!CKEDITOR.dtd[this.range.root.getName()][b])return null;var d,
+i,k,m,q,r;if(!this._.started){i=this.range.clone();i.shrink(CKEDITOR.NODE_ELEMENT,true);m=i.endContainer.hasAscendant("pre",true)||i.startContainer.hasAscendant("pre",true);i.enlarge(this.forceBrBreak&&!m||!this.enlargeBr?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:CKEDITOR.ENLARGE_BLOCK_CONTENTS);if(!i.collapsed){m=new CKEDITOR.dom.walker(i.clone());var l=CKEDITOR.dom.walker.bookmark(true,true);m.evaluator=l;this._.nextNode=m.next();m=new CKEDITOR.dom.walker(i.clone());m.evaluator=l;m=m.previous();this._.lastNode=
+m.getNextSourceNode(true);if(this._.lastNode&&this._.lastNode.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(this._.lastNode.getText())&&this._.lastNode.getParent().isBlockBoundary()){l=this.range.clone();l.moveToPosition(this._.lastNode,CKEDITOR.POSITION_AFTER_END);if(l.checkEndOfBlock()){l=new CKEDITOR.dom.elementPath(l.endContainer,l.root);this._.lastNode=(l.block||l.blockLimit).getNextSourceNode(true)}}if(!this._.lastNode){this._.lastNode=this._.docEndMarker=i.document.createText("");this._.lastNode.insertAfter(m)}i=
+null}this._.started=1}l=this._.nextNode;m=this._.lastNode;for(this._.nextNode=null;l;){var g=0,p=l.hasAscendant("pre"),v=l.type!=CKEDITOR.NODE_ELEMENT,u=0;if(v)l.type==CKEDITOR.NODE_TEXT&&a.test(l.getText())&&(v=0);else{var o=l.getName();if(l.isBlockBoundary(this.forceBrBreak&&!p&&{br:1})){if(o=="br")v=1;else if(!i&&!l.getChildCount()&&o!="hr"){d=l;k=l.equals(m);break}if(i){i.setEndAt(l,CKEDITOR.POSITION_BEFORE_START);if(o!="br")this._.nextNode=l}g=1}else{if(l.getFirst()){if(!i){i=this.range.clone();
+i.setStartAt(l,CKEDITOR.POSITION_BEFORE_START)}l=l.getFirst();continue}v=1}}if(v&&!i){i=this.range.clone();i.setStartAt(l,CKEDITOR.POSITION_BEFORE_START)}k=(!g||v)&&l.equals(m);if(i&&!g)for(;!l.getNext(e)&&!k;){o=l.getParent();if(o.isBlockBoundary(this.forceBrBreak&&!p&&{br:1})){g=1;v=0;k||o.equals(m);i.setEndAt(o,CKEDITOR.POSITION_BEFORE_END);break}l=o;v=1;k=l.equals(m);u=1}v&&i.setEndAt(l,CKEDITOR.POSITION_AFTER_END);l=c(l,u,m);if((k=!l)||g&&i)break}if(!d){if(!i){this._.docEndMarker&&this._.docEndMarker.remove();
+return this._.nextNode=null}d=new CKEDITOR.dom.elementPath(i.startContainer,i.root);l=d.blockLimit;g={div:1,th:1,td:1};d=d.block;if(!d&&l&&!this.enforceRealBlocks&&g[l.getName()]&&i.checkStartOfBlock()&&i.checkEndOfBlock()&&!l.equals(i.root))d=l;else if(!d||this.enforceRealBlocks&&d.getName()=="li"){d=this.range.document.createElement(b);i.extractContents().appendTo(d);d.trim();i.insertNode(d);q=r=true}else if(d.getName()!="li"){if(!i.checkStartOfBlock()||!i.checkEndOfBlock()){d=d.clone(false);i.extractContents().appendTo(d);
+d.trim();r=i.splitBlock();q=!r.wasStartOfBlock;r=!r.wasEndOfBlock;i.insertNode(d)}}else if(!k)this._.nextNode=d.equals(m)?null:c(i.getBoundaryNodes().endNode,1,m)}if(q)(i=d.getPrevious())&&i.type==CKEDITOR.NODE_ELEMENT&&(i.getName()=="br"?i.remove():i.getLast()&&i.getLast().$.nodeName.toLowerCase()=="br"&&i.getLast().remove());if(r)(i=d.getLast())&&i.type==CKEDITOR.NODE_ELEMENT&&i.getName()=="br"&&(CKEDITOR.env.ie||i.getPrevious(f)||i.getNext(f))&&i.remove();if(!this._.nextNode)this._.nextNode=k||
+d.equals(m)||!m?null:c(d,1,m);return d}};CKEDITOR.dom.range.prototype.createIterator=function(){return new b(this)}})();
+CKEDITOR.command=function(b,c){this.uiItems=[];this.exec=function(a){if(this.state==CKEDITOR.TRISTATE_DISABLED||!this.checkAllowed())return false;this.editorFocus&&b.focus();return this.fire("exec")===false?true:c.exec.call(this,b,a)!==false};this.refresh=function(a,b){if(!this.readOnly&&a.readOnly)return true;if(this.context&&!b.isContextFor(this.context)){this.disable();return true}this.enable();return this.fire("refresh",{editor:a,path:b})===false?true:c.refresh&&c.refresh.apply(this,arguments)!==
+false};var a;this.checkAllowed=function(){return typeof a=="boolean"?a:a=b.filter.checkFeature(this)};CKEDITOR.tools.extend(this,c,{modes:{wysiwyg:1},editorFocus:1,contextSensitive:!!c.context,state:CKEDITOR.TRISTATE_DISABLED});CKEDITOR.event.call(this)};
+CKEDITOR.command.prototype={enable:function(){this.state==CKEDITOR.TRISTATE_DISABLED&&this.checkAllowed()&&this.setState(!this.preserveState||typeof this.previousState=="undefined"?CKEDITOR.TRISTATE_OFF:this.previousState)},disable:function(){this.setState(CKEDITOR.TRISTATE_DISABLED)},setState:function(b){if(this.state==b||!this.checkAllowed())return false;this.previousState=this.state;this.state=b;this.fire("state");return true},toggleState:function(){this.state==CKEDITOR.TRISTATE_OFF?this.setState(CKEDITOR.TRISTATE_ON):
+this.state==CKEDITOR.TRISTATE_ON&&this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.event.implementOn(CKEDITOR.command.prototype);CKEDITOR.ENTER_P=1;CKEDITOR.ENTER_BR=2;CKEDITOR.ENTER_DIV=3;
+CKEDITOR.config={customConfig:"config.js",autoUpdateElement:!0,language:"",defaultLanguage:"en",contentsLangDirection:"",enterMode:CKEDITOR.ENTER_P,forceEnterMode:!1,shiftEnterMode:CKEDITOR.ENTER_BR,docType:"<!DOCTYPE html>",bodyId:"",bodyClass:"",fullPage:!1,height:200,extraPlugins:"",removePlugins:"",protectedSource:[],tabIndex:0,width:"",baseFloatZIndex:1E4,blockedKeystrokes:[CKEDITOR.CTRL+66,CKEDITOR.CTRL+73,CKEDITOR.CTRL+85]};
+(function(){function b(a,b,g,e,f){var p=b.name;if((e||typeof a.elements!="function"||a.elements(p))&&(!a.match||a.match(b))){if(e=!f){a:if(a.nothingRequired)e=true;else{if(f=a.requiredClasses){p=b.classes;for(e=0;e<f.length;++e)if(CKEDITOR.tools.indexOf(p,f[e])==-1){e=false;break a}}e=d(b.styles,a.requiredStyles)&&d(b.attributes,a.requiredAttributes)}e=!e}if(!e){if(!a.propertiesOnly)g.valid=true;if(!g.allAttributes)g.allAttributes=c(a.attributes,b.attributes,g.validAttributes);if(!g.allStyles)g.allStyles=
+c(a.styles,b.styles,g.validStyles);if(!g.allClasses){a=a.classes;b=b.classes;e=g.validClasses;if(a)if(a===true)b=true;else{for(var f=0,p=b.length,h;f<p;++f){h=b[f];e[h]||(e[h]=a(h))}b=false}else b=false;g.allClasses=b}}}}function c(a,b,c){if(!a)return false;if(a===true)return true;for(var d in b)c[d]||(c[d]=a(d,b[d]));return false}function a(a,b){if(!a)return false;if(a===true)return a;if(typeof a=="string"){a=x(a);return a=="*"?true:CKEDITOR.tools.convertArrayToObject(a.split(b))}if(CKEDITOR.tools.isArray(a))return a.length?
+CKEDITOR.tools.convertArrayToObject(a):false;var c={},d=0,g;for(g in a){c[g]=a[g];d++}return d?c:false}function f(a){if(a._.filterFunction)return a._.filterFunction;var c=/^cke:(object|embed|param)$/,d=/^(object|embed|param)$/;return a._.filterFunction=function(g,e,f,h,l,q,n){var o=g.name,v,j=false;if(l)g.name=o=o.replace(c,"$1");if(f=f&&f[o]){i(g);for(o=0;o<f.length;++o)p(a,g,f[o]);k(g)}if(e){var o=g.name,f=e.elements[o],u=e.generic,e={valid:false,validAttributes:{},validClasses:{},validStyles:{},
+allAttributes:false,allClasses:false,allStyles:false};if(!f&&!u){h.push(g);return true}i(g);if(f){o=0;for(v=f.length;o<v;++o)b(f[o],g,e,true,q)}if(u){o=0;for(v=u.length;o<v;++o)b(u[o],g,e,false,q)}if(!e.valid){h.push(g);return true}q=e.validAttributes;o=e.validStyles;f=e.validClasses;v=g.attributes;var u=g.styles,s=v["class"],w=v.style,r,x,A=[],t=[],F=/^data-cke-/,z=false;delete v.style;delete v["class"];if(!e.allAttributes)for(r in v)if(!q[r])if(F.test(r)){if(r!=(x=r.replace(/^data-cke-saved-/,""))&&
+!q[x]){delete v[r];z=true}}else{delete v[r];z=true}if(e.allStyles){if(w)v.style=w}else{for(r in u)o[r]?A.push(r+":"+u[r]):z=true;if(A.length)v.style=A.sort().join("; ")}if(e.allClasses)s&&(v["class"]=s);else{for(r in f)f[r]&&t.push(r);t.length&&(v["class"]=t.sort().join(" "));s&&t.length<s.split(/\s+/).length&&(z=true)}z&&(j=true);if(!n&&!m(g)){h.push(g);return true}}if(l)g.name=g.name.replace(d,"cke:$1");return j}}function d(a,b){if(!b)return true;for(var c=0;c<b.length;++c)if(!(b[c]in a))return false;
+return true}function e(a){if(!a)return{};for(var a=a.split(/\s*,\s*/).sort(),b={};a.length;)b[a.shift()]=z;return b}function h(a){for(var b,c,g,d,e={},f=1,a=x(a);b=a.match(y);){if(c=b[2]){g=j(c,"styles");d=j(c,"attrs");c=j(c,"classes")}else g=d=c=null;e["$"+f++]={elements:b[1],classes:c,styles:g,attributes:d};a=a.slice(b[0].length)}return e}function j(a,b){var c=a.match(n[b]);return c?x(c[1]):null}function i(a){if(!a.styles)a.styles=CKEDITOR.tools.parseCssText(a.attributes.style||"",1);if(!a.classes)a.classes=
+a.attributes["class"]?a.attributes["class"].split(/\s+/):[]}function k(a){var b=a.attributes,c;delete b.style;delete b["class"];if(c=CKEDITOR.tools.writeCssText(a.styles,true))b.style=c;a.classes.length&&(b["class"]=a.classes.sort().join(" "))}function m(a){switch(a.name){case "a":if(!a.children.length&&!a.attributes.name)return false;break;case "img":if(!a.attributes.src)return false}return true}function q(a){return!a?false:a===true?true:function(b){return b in a}}function r(){return new CKEDITOR.htmlParser.element("br")}
+function l(a){return a.type==CKEDITOR.NODE_ELEMENT&&(a.name=="br"||A.$block[a.name])}function g(a,b,c){var g=a.name;if(A.$empty[g]||!a.children.length)if(g=="hr"&&b=="br")a.replaceWith(r());else{a.parent&&c.push({check:"it",el:a.parent});a.remove()}else if(A.$block[g]||g=="tr")if(b=="br"){if(a.previous&&!l(a.previous)){b=r();b.insertBefore(a)}if(a.next&&!l(a.next)){b=r();b.insertAfter(a)}a.replaceWithChildren()}else{var g=a.children,d;b:{d=A[b];for(var e=0,f=g.length,p;e<f;++e){p=g[e];if(p.type==
+CKEDITOR.NODE_ELEMENT&&!d[p.name]){d=false;break b}}d=true}if(d){a.name=b;a.attributes={};c.push({check:"parent-down",el:a})}else{d=a.parent;for(var e=d.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT||d.name=="body",h,f=g.length;f>0;){p=g[--f];if(e&&(p.type==CKEDITOR.NODE_TEXT||p.type==CKEDITOR.NODE_ELEMENT&&A.$inline[p.name])){if(!h){h=new CKEDITOR.htmlParser.element(b);h.insertAfter(a);c.push({check:"parent-down",el:h})}h.add(p,0)}else{h=null;p.insertAfter(a);d.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&&(p.type==
+CKEDITOR.NODE_ELEMENT&&!A[d.name][p.name])&&c.push({check:"el-up",el:p})}}a.remove()}}else if(g=="style")a.remove();else{a.parent&&c.push({check:"it",el:a.parent});a.replaceWithChildren()}}function p(a,b,c){var g,d;for(g=0;g<c.length;++g){d=c[g];if((!d.check||a.check(d.check,false))&&(!d.left||d.left(b))){d.right(b,w);break}}}function v(a,b){var c=b.getDefinition(),g=c.attributes,d=c.styles,e,f,p,h;if(a.name!=c.element)return false;for(e in g)if(e=="class"){c=g[e].split(/\s+/);for(p=a.classes.join("|");h=
+c.pop();)if(p.indexOf(h)==-1)return false}else if(a.attributes[e]!=g[e])return false;for(f in d)if(a.styles[f]!=d[f])return false;return true}function u(a,b){var c,g;if(typeof a=="string")c=a;else if(a instanceof CKEDITOR.style)g=a;else{c=a[0];g=a[1]}return[{element:c,left:g,right:function(a,c){c.transform(a,b)}}]}function o(a){return function(b){return v(b,a)}}function F(a){return function(b,c){c[a](b)}}var A=CKEDITOR.dtd,s=CKEDITOR.tools.copy,x=CKEDITOR.tools.trim,z="cke-test";CKEDITOR.filter=function(a){this.allowedContent=
+[];this.disabled=false;this.editor=null;this.enterMode=CKEDITOR.ENTER_P;this._={rules:{},transformations:{},cachedTests:{}};if(a instanceof CKEDITOR.editor){var b=this.editor=a;this.customConfig=true;var a=b.config.allowedContent,c;if(a===true)this.disabled=true;else{if(!a)this.customConfig=false;this.enterMode=c=b.blockless?CKEDITOR.ENTER_BR:b.config.enterMode;var g=["br"],d=b.blockless?CKEDITOR.ENTER_BR:b.config.shiftEnterMode;(c==CKEDITOR.ENTER_P||d==CKEDITOR.ENTER_P)&&g.push("p");(c==CKEDITOR.ENTER_DIV||
+d==CKEDITOR.ENTER_DIV)&&g.push("div");this.allow(g.join(" "),"default",1);this.allow(a,"config",1);this.allow(b.config.extraAllowedContent,"extra",1);this._.toHtmlListener=b.on("toHtml",function(a){this.applyTo(a.data.dataValue,true,a.data.dontFilter)&&b.fire("dataFiltered")},this,null,6);this._.toDataFormatListener=b.on("toDataFormat",function(a){this.applyTo(a.data.dataValue,false,true)},this,null,11)}}else{this.customConfig=false;this.allow(a,"default",1)}};CKEDITOR.filter.prototype={allow:function(b,
+c,g){if(this.disabled||this.customConfig&&!g||!b)return false;this._.cachedChecks={};var d,e;if(typeof b=="string")b=h(b);else if(b instanceof CKEDITOR.style){e=b.getDefinition();g={};b=e.attributes;g[e.element]=e={styles:e.styles,requiredStyles:e.styles&&CKEDITOR.tools.objectKeys(e.styles)};if(b){b=s(b);e.classes=b["class"]?b["class"].split(/\s+/):null;e.requiredClasses=e.classes;delete b["class"];e.attributes=b;e.requiredAttributes=b&&CKEDITOR.tools.objectKeys(b)}b=g}else if(CKEDITOR.tools.isArray(b)){for(d=
+0;d<b.length;++d)e=this.allow(b[d],c,g);return e}var f,g=[];for(f in b){e=b[f];e=typeof e=="boolean"?{}:typeof e=="function"?{match:e}:s(e);if(f.charAt(0)!="$")e.elements=f;if(c)e.featureName=c.toLowerCase();var p=e;p.elements=a(p.elements,/\s+/)||null;p.propertiesOnly=p.propertiesOnly||p.elements===true;var l=/\s*,\s*/,n=void 0;for(n in t){p[n]=a(p[n],l)||null;var o=p,v=C[n],i=a(p[C[n]],l),j=p[n],u=[],r=true,w=void 0;i?r=false:i={};for(w in j)if(w.charAt(0)=="!"){w=w.slice(1);u.push(w);i[w]=true;
+r=false}for(;w=u.pop();){j[w]=j["!"+w];delete j["!"+w]}o[v]=(r?false:i)||null}p.match=p.match||null;this.allowedContent.push(e);g.push(e)}c=this._.rules;f=c.elements||{};b=c.generic||[];e=0;for(p=g.length;e<p;++e){l=s(g[e]);n=l.classes===true||l.styles===true||l.attributes===true;o=l;v=void 0;for(v in t)o[v]=q(o[v]);i=true;for(v in C){v=C[v];o[v]=CKEDITOR.tools.objectKeys(o[v]);o[v]&&(i=false)}o.nothingRequired=i;if(l.elements===true||l.elements===null){l.elements=q(l.elements);b[n?"unshift":"push"](l)}else{o=
+l.elements;delete l.elements;for(d in o)if(f[d])f[d][n?"unshift":"push"](l);else f[d]=[l]}}c.elements=f;c.generic=b.length?b:null;return true},applyTo:function(a,b,c){var d=[],e=!c&&this._.rules,p=this._.transformations,h=f(this),l=this.editor&&this.editor.config.protectedSource,q=false;a.forEach(function(a){if(a.type==CKEDITOR.NODE_ELEMENT){if(!b||!(a.name=="span"&&~CKEDITOR.tools.objectKeys(a.attributes).join("|").indexOf("data-cke-")))h(a,e,p,d,b)&&(q=true)}else if(a.type==CKEDITOR.NODE_COMMENT&&
+a.value.match(/^\{cke_protected\}(?!\{C\})/)){var c;a:{var g=decodeURIComponent(a.value.replace(/^\{cke_protected\}/,""));c=[];var f,n,o;if(l)for(n=0;n<l.length;++n)if((o=g.match(l[n]))&&o[0].length==g.length){c=true;break a}g=CKEDITOR.htmlParser.fragment.fromHtml(g);g.children.length==1&&(f=g.children[0]).type==CKEDITOR.NODE_ELEMENT&&h(f,e,p,c,b);c=!c.length}c||d.push(a)}},null,true);d.length&&(q=true);for(var n,o,a=[],c=["p","br","div"][this.enterMode-1];n=d.pop();)n.type==CKEDITOR.NODE_ELEMENT?
+g(n,c,a):n.remove();for(;o=a.pop();){n=o.el;if(n.parent)switch(o.check){case "it":A.$removeEmpty[n.name]&&!n.children.length?g(n,c,a):m(n)||g(n,c,a);break;case "el-up":n.parent.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&&!A[n.parent.name][n.name]&&g(n,c,a);break;case "parent-down":n.parent.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&&!A[n.parent.name][n.name]&&g(n.parent,c,a)}}return q},checkFeature:function(a){if(this.disabled||!a)return true;a.toFeature&&(a=a.toFeature(this.editor));return!a.requiredContent||
+this.check(a.requiredContent)},disable:function(){this.disabled=true;this._.toHtmlListener&&this._.toHtmlListener.removeListener();this._.toDataFormatListener&&this._.toDataFormatListener.removeListener()},addContentForms:function(a){if(!this.disabled&&a){var b,c,g=[],d;for(b=0;b<a.length&&!d;++b){c=a[b];if((typeof c=="string"||c instanceof CKEDITOR.style)&&this.check(c))d=c}if(d){for(b=0;b<a.length;++b)g.push(u(a[b],d));this.addTransformations(g)}}},addFeature:function(a){if(this.disabled||!a)return true;
+a.toFeature&&(a=a.toFeature(this.editor));this.allow(a.allowedContent,a.name);this.addTransformations(a.contentTransformations);this.addContentForms(a.contentForms);return this.customConfig&&a.requiredContent?this.check(a.requiredContent):true},addTransformations:function(a){var b,c;if(!this.disabled&&a){var g=this._.transformations,d;for(d=0;d<a.length;++d){b=a[d];var e=void 0,f=void 0,p=void 0,h=void 0,l=void 0,n=void 0;c=[];for(f=0;f<b.length;++f){p=b[f];if(typeof p=="string"){p=p.split(/\s*:\s*/);
+h=p[0];l=null;n=p[1]}else{h=p.check;l=p.left;n=p.right}if(!e){e=p;e=e.element?e.element:h?h.match(/^([a-z0-9]+)/i)[0]:e.left.getDefinition().element}l instanceof CKEDITOR.style&&(l=o(l));c.push({check:h==e?null:h,left:l,right:typeof n=="string"?F(n):n})}b=e;g[b]||(g[b]=[]);g[b].push(c)}}},check:function(a,b,c){if(this.disabled)return true;if(CKEDITOR.tools.isArray(a)){for(var g=a.length;g--;)if(this.check(a[g],b,c))return true;return false}var d,l;if(typeof a=="string"){l=a+"<"+(b===false?"0":"1")+
+(c?"1":"0")+">";if(l in this._.cachedChecks)return this._.cachedChecks[l];g=h(a).$1;d=g.styles;var n=g.classes;g.name=g.elements;g.classes=n=n?n.split(/\s*,\s*/):[];g.styles=e(d);g.attributes=e(g.attributes);g.children=[];n.length&&(g.attributes["class"]=n.join(" "));if(d)g.attributes.style=CKEDITOR.tools.writeCssText(g.styles);d=g}else{g=a.getDefinition();d=g.styles;n=g.attributes||{};if(d){d=s(d);n.style=CKEDITOR.tools.writeCssText(d,true)}else d={};d={name:g.element,attributes:n,classes:n["class"]?
+n["class"].split(/\s+/):[],styles:d,children:[]}}var n=CKEDITOR.tools.clone(d),q=[],o;if(b!==false&&(o=this._.transformations[d.name])){for(g=0;g<o.length;++g)p(this,d,o[g]);k(d)}f(this)(n,this._.rules,b===false?false:this._.transformations,q,false,!c,!c);b=q.length>0?false:CKEDITOR.tools.objectCompare(d.attributes,n.attributes,true)?true:false;typeof a=="string"&&(this._.cachedChecks[l]=b);return b}};var t={styles:1,attributes:1,classes:1},C={styles:"requiredStyles",attributes:"requiredAttributes",
+classes:"requiredClasses"},y=/^([a-z0-9*\s]+)((?:\s*\{[!\w\-,\s\*]+\}\s*|\s*\[[!\w\-,\s\*]+\]\s*|\s*\([!\w\-,\s\*]+\)\s*){0,3})(?:;\s*|$)/i,n={styles:/{([^}]+)}/,attrs:/\[([^\]]+)\]/,classes:/\(([^\)]+)\)/},w=CKEDITOR.filter.transformationsTools={sizeToStyle:function(a){this.lengthToStyle(a,"width");this.lengthToStyle(a,"height")},sizeToAttribute:function(a){this.lengthToAttribute(a,"width");this.lengthToAttribute(a,"height")},lengthToStyle:function(a,b,c){c=c||b;if(!(c in a.styles)){var g=a.attributes[b];
+if(g){/^\d+$/.test(g)&&(g=g+"px");a.styles[c]=g}}delete a.attributes[b]},lengthToAttribute:function(a,b,c){c=c||b;if(!(c in a.attributes)){var g=a.styles[b],d=g&&g.match(/^(\d+)(?:\.\d*)?px$/);d?a.attributes[c]=d[1]:g==z&&(a.attributes[c]=z)}delete a.styles[b]},alignmentToStyle:function(a){if(!("float"in a.styles)){var b=a.attributes.align;if(b=="left"||b=="right")a.styles["float"]=b}delete a.attributes.align},alignmentToAttribute:function(a){if(!("align"in a.attributes)){var b=a.styles["float"];
+if(b=="left"||b=="right")a.attributes.align=b}delete a.styles["float"]},matchesStyle:v,transform:function(a,b){if(typeof b=="string")a.name=b;else{var c=b.getDefinition(),g=c.styles,d=c.attributes,e,f,p,h;a.name=c.element;for(e in d)if(e=="class"){c=a.classes.join("|");for(p=d[e].split(/\s+/);h=p.pop();)c.indexOf(h)==-1&&a.classes.push(h)}else a.attributes[e]=d[e];for(f in g)a.styles[f]=g[f]}}}})();
+(function(){CKEDITOR.focusManager=function(b){if(b.focusManager)return b.focusManager;this.hasFocus=false;this.currentActive=null;this._={editor:b};return this};CKEDITOR.focusManager._={blurDelay:200};CKEDITOR.focusManager.prototype={focus:function(){this._.timer&&clearTimeout(this._.timer);if(!this.hasFocus&&!this._.locked){var b=CKEDITOR.currentInstance;b&&b.focusManager.blur(1);this.hasFocus=true;(b=this._.editor.container)&&b.addClass("cke_focus");this._.editor.fire("focus")}},lock:function(){this._.locked=
+1},unlock:function(){delete this._.locked},blur:function(b){function c(){if(this.hasFocus){this.hasFocus=false;var a=this._.editor.container;a&&a.removeClass("cke_focus");this._.editor.fire("blur")}}if(!this._.locked){this._.timer&&clearTimeout(this._.timer);var a=CKEDITOR.focusManager._.blurDelay;b||!a?c.call(this):this._.timer=CKEDITOR.tools.setTimeout(function(){delete this._.timer;c.call(this)},a,this)}},add:function(b,c){var a=b.getCustomData("focusmanager");if(!a||a!=this){a&&a.remove(b);var a=
+"focus",f="blur";if(c)if(CKEDITOR.env.ie){a="focusin";f="focusout"}else CKEDITOR.event.useCapture=1;var d={blur:function(){b.equals(this.currentActive)&&this.blur()},focus:function(){this.currentActive=b;this.focus()}};b.on(a,d.focus,this);b.on(f,d.blur,this);if(c)CKEDITOR.event.useCapture=0;b.setCustomData("focusmanager",this);b.setCustomData("focusmanager_handlers",d)}},remove:function(b){b.removeCustomData("focusmanager");var c=b.removeCustomData("focusmanager_handlers");b.removeListener("blur",
+c.blur);b.removeListener("focus",c.focus)}}})();CKEDITOR.keystrokeHandler=function(b){if(b.keystrokeHandler)return b.keystrokeHandler;this.keystrokes={};this.blockedKeystrokes={};this._={editor:b};return this};
+(function(){var b,c=function(a){var a=a.data,c=a.getKeystroke(),e=this.keystrokes[c],h=this._.editor;b=h.fire("key",{keyCode:c})===false;if(!b){e&&(b=h.execCommand(e,{from:"keystrokeHandler"})!==false);b||(b=!!this.blockedKeystrokes[c])}b&&a.preventDefault(true);return!b},a=function(a){if(b){b=false;a.data.preventDefault(true)}};CKEDITOR.keystrokeHandler.prototype={attach:function(b){b.on("keydown",c,this);if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)b.on("keypress",a,this)}}})();
+(function(){CKEDITOR.lang={languages:{af:1,ar:1,bg:1,bn:1,bs:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,"en-au":1,"en-ca":1,"en-gb":1,en:1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fo:1,"fr-ca":1,fr:1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,id:1,is:1,it:1,ja:1,ka:1,km:1,ko:1,ku:1,lt:1,lv:1,mk:1,mn:1,ms:1,nb:1,nl:1,no:1,pl:1,"pt-br":1,pt:1,ro:1,ru:1,si:1,sk:1,sl:1,sq:1,"sr-latn":1,sr:1,sv:1,th:1,tr:1,ug:1,uk:1,vi:1,"zh-cn":1,zh:1},rtl:{ar:1,fa:1,he:1,ku:1,ug:1},load:function(b,c,a){if(!b||!CKEDITOR.lang.languages[b])b=this.detect(c,
+b);this[b]?a(b,this[b]):CKEDITOR.scriptLoader.load(CKEDITOR.getUrl("lang/"+b+".js"),function(){this[b].dir=this.rtl[b]?"rtl":"ltr";a(b,this[b])},this)},detect:function(b,c){var a=this.languages,c=c||navigator.userLanguage||navigator.language||b,f=c.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),d=f[1],f=f[2];a[d+"-"+f]?d=d+"-"+f:a[d]||(d=null);CKEDITOR.lang.detect=d?function(){return d}:function(a){return a};return d||b}}})();
+CKEDITOR.scriptLoader=function(){var b={},c={};return{load:function(a,f,d,e){var h=typeof a=="string";h&&(a=[a]);d||(d=CKEDITOR);var j=a.length,i=[],k=[],m=function(a){f&&(h?f.call(d,a):f.call(d,i,k))};if(j===0)m(true);else{var q=function(a,b){(b?i:k).push(a);if(--j<=0){e&&CKEDITOR.document.getDocumentElement().removeStyle("cursor");m(b)}},r=function(a,g){b[a]=1;var d=c[a];delete c[a];for(var e=0;e<d.length;e++)d[e](a,g)},l=function(a){if(b[a])q(a,true);else{var g=c[a]||(c[a]=[]);g.push(q);if(!(g.length>
+1)){var d=new CKEDITOR.dom.element("script");d.setAttributes({type:"text/javascript",src:a});if(f)if(CKEDITOR.env.ie)d.$.onreadystatechange=function(){if(d.$.readyState=="loaded"||d.$.readyState=="complete"){d.$.onreadystatechange=null;r(a,true)}};else{d.$.onload=function(){setTimeout(function(){r(a,true)},0)};d.$.onerror=function(){r(a,false)}}d.appendTo(CKEDITOR.document.getHead())}}};e&&CKEDITOR.document.getDocumentElement().setStyle("cursor","wait");for(var g=0;g<j;g++)l(a[g])}},queue:function(){function a(){var a;
+(a=b[0])&&this.load(a.scriptUrl,a.callback,CKEDITOR,0)}var b=[];return function(c,e){var h=this;b.push({scriptUrl:c,callback:function(){e&&e.apply(this,arguments);b.shift();a.call(h)}});b.length==1&&a.call(this)}}()}}();CKEDITOR.resourceManager=function(b,c){this.basePath=b;this.fileName=c;this.registered={};this.loaded={};this.externals={};this._={waitingList:{}}};
+CKEDITOR.resourceManager.prototype={add:function(b,c){if(this.registered[b])throw'[CKEDITOR.resourceManager.add] The resource name "'+b+'" is already registered.';var a=this.registered[b]=c||{};a.name=b;a.path=this.getPath(b);CKEDITOR.fire(b+CKEDITOR.tools.capitalize(this.fileName)+"Ready",a);return this.get(b)},get:function(b){return this.registered[b]||null},getPath:function(b){var c=this.externals[b];return CKEDITOR.getUrl(c&&c.dir||this.basePath+b+"/")},getFilePath:function(b){var c=this.externals[b];
+return CKEDITOR.getUrl(this.getPath(b)+(c&&typeof c.file=="string"?c.file:this.fileName+".js"))},addExternal:function(b,c,a){for(var b=b.split(","),f=0;f<b.length;f++)this.externals[b[f]]={dir:c,file:a}},load:function(b,c,a){CKEDITOR.tools.isArray(b)||(b=b?[b]:[]);for(var f=this.loaded,d=this.registered,e=[],h={},j={},i=0;i<b.length;i++){var k=b[i];if(k)if(!f[k]&&!d[k]){var m=this.getFilePath(k);e.push(m);m in h||(h[m]=[]);h[m].push(k)}else j[k]=this.get(k)}CKEDITOR.scriptLoader.load(e,function(b,
+d){if(d.length)throw'[CKEDITOR.resourceManager.load] Resource name "'+h[d[0]].join(",")+'" was not found at "'+d[0]+'".';for(var e=0;e<b.length;e++)for(var g=h[b[e]],p=0;p<g.length;p++){var i=g[p];j[i]=this.get(i);f[i]=1}c.call(a,j)},this)}};CKEDITOR.plugins=new CKEDITOR.resourceManager("plugins/","plugin");
+CKEDITOR.plugins.load=CKEDITOR.tools.override(CKEDITOR.plugins.load,function(b){var c={};return function(a,f,d){var e={},h=function(a){b.call(this,a,function(a){CKEDITOR.tools.extend(e,a);var b=[],j;for(j in a){var q=a[j],r=q&&q.requires;if(!c[j]){if(q.icons)for(var l=q.icons.split(","),g=l.length;g--;)CKEDITOR.skin.addIcon(l[g],q.path+"icons/"+(CKEDITOR.env.hidpi&&q.hidpi?"hidpi/":"")+l[g]+".png");c[j]=1}if(r){r.split&&(r=r.split(","));for(q=0;q<r.length;q++)e[r[q]]||b.push(r[q])}}if(b.length)h.call(this,
+b);else{for(j in e){q=e[j];if(q.onLoad&&!q.onLoad._called){q.onLoad()===false&&delete e[j];q.onLoad._called=1}}f&&f.call(d||window,e)}},this)};h.call(this,a)}});CKEDITOR.plugins.setLang=function(b,c,a){var f=this.get(b),b=f.langEntries||(f.langEntries={}),f=f.lang||(f.lang=[]);f.split&&(f=f.split(","));CKEDITOR.tools.indexOf(f,c)==-1&&f.push(c);b[c]=a};CKEDITOR.ui=function(b){if(b.ui)return b.ui;this.items={};this.instances={};this.editor=b;this._={handlers:{}};return this};
+CKEDITOR.ui.prototype={add:function(b,c,a){a.name=b.toLowerCase();var f=this.items[b]={type:c,command:a.command||null,args:Array.prototype.slice.call(arguments,2)};CKEDITOR.tools.extend(f,a)},get:function(b){return this.instances[b]},create:function(b){var c=this.items[b],a=c&&this._.handlers[c.type],f=c&&c.command&&this.editor.getCommand(c.command),a=a&&a.create.apply(this,c.args);this.instances[b]=a;f&&f.uiItems.push(a);if(a&&!a.type)a.type=c.type;return a},addHandler:function(b,c){this._.handlers[b]=
+c},space:function(b){return CKEDITOR.document.getById(this.spaceId(b))},spaceId:function(b){return this.editor.id+"_"+b}};CKEDITOR.event.implementOn(CKEDITOR.ui);
+(function(){function b(b,e,f){CKEDITOR.event.call(this);b=b&&CKEDITOR.tools.clone(b);if(e!==void 0){if(e instanceof CKEDITOR.dom.element){if(!f)throw Error("One of the element modes must be specified.");}else throw Error("Expect element of type CKEDITOR.dom.element.");if(CKEDITOR.env.ie&&CKEDITOR.env.quirks&&f==CKEDITOR.ELEMENT_MODE_INLINE)throw Error("Inline element mode is not supported on IE quirks.");if(!(f==CKEDITOR.ELEMENT_MODE_INLINE?e.is(CKEDITOR.dtd.$editable)||e.is("textarea"):f==CKEDITOR.ELEMENT_MODE_REPLACE?
+!e.is(CKEDITOR.dtd.$nonBodyContent):1))throw Error('The specified element mode is not supported on element: "'+e.getName()+'".');this.element=e;this.elementMode=f;this.name=this.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO&&(e.getId()||e.getNameAtt())}else this.elementMode=CKEDITOR.ELEMENT_MODE_NONE;this._={};this.commands={};this.templates={};this.name=this.name||c();this.id=CKEDITOR.tools.getNextId();this.status="unloaded";this.config=CKEDITOR.tools.prototypedCopy(CKEDITOR.config);this.ui=new CKEDITOR.ui(this);
+this.focusManager=new CKEDITOR.focusManager(this);this.keystrokeHandler=new CKEDITOR.keystrokeHandler(this);this.on("readOnly",a);this.on("selectionChange",d);this.on("mode",a);this.on("instanceReady",function(){this.config.startupFocus&&this.focus()});CKEDITOR.fire("instanceCreated",null,this);CKEDITOR.add(this);CKEDITOR.tools.setTimeout(function(){h(this,b)},0,this)}function c(){do var a="editor"+ ++r;while(CKEDITOR.instances[a]);return a}function a(){var a=this.commands,b;for(b in a)f(this,a[b])}
+function f(a,b){b[b.startDisabled?"disable":a.readOnly&&!b.readOnly?"disable":b.modes[a.mode]?"enable":"disable"]()}function d(a){var b=this.commands,c=a.editor,d=a.data.path,e;for(e in b){a=b[e];a.contextSensitive&&a.refresh(c,d)}}function e(a){var b=a.config.customConfig;if(!b)return false;var b=CKEDITOR.getUrl(b),c=l[b]||(l[b]={});if(c.fn){c.fn.call(a,a.config);(CKEDITOR.getUrl(a.config.customConfig)==b||!e(a))&&a.fireOnce("customConfigLoaded")}else CKEDITOR.scriptLoader.queue(b,function(){c.fn=
+CKEDITOR.editorConfig?CKEDITOR.editorConfig:function(){};e(a)});return true}function h(a,b){a.on("customConfigLoaded",function(){if(b){if(b.on)for(var c in b.on)a.on(c,b.on[c]);CKEDITOR.tools.extend(a.config,b,true);delete a.config.on}a.readOnly=!(!a.config.readOnly&&!(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.element.is("textarea")?a.element.hasAttribute("disabled"):a.element.isReadOnly():a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&a.element.hasAttribute("disabled")));a.blockless=a.elementMode==
+CKEDITOR.ELEMENT_MODE_INLINE?!(a.element.is("textarea")||CKEDITOR.dtd[a.element.getName()].p):false;a.tabIndex=a.config.tabIndex||a.element&&a.element.getAttribute("tabindex")||0;if(a.config.skin)CKEDITOR.skinName=a.config.skin;a.fireOnce("configLoaded");a.dataProcessor=new CKEDITOR.htmlDataProcessor(a);a.filter=new CKEDITOR.filter(a);j(a)});if(b&&b.customConfig!=void 0)a.config.customConfig=b.customConfig;e(a)||a.fireOnce("customConfigLoaded")}function j(a){CKEDITOR.skin.loadPart("editor",function(){i(a)})}
+function i(a){CKEDITOR.lang.load(a.config.language,a.config.defaultLanguage,function(b,c){var d=a.config.title;a.langCode=b;a.lang=CKEDITOR.tools.prototypedCopy(c);a.title=typeof d=="string"||d===false?d:[a.lang.editor,a.name].join(", ");if(CKEDITOR.env.gecko&&CKEDITOR.env.version<10900&&a.lang.dir=="rtl")a.lang.dir="ltr";if(!a.config.contentsLangDirection)a.config.contentsLangDirection=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.element.getDirection(1):a.lang.dir;a.fire("langLoaded");k(a)})}function k(a){a.getStylesSet(function(b){a.once("loaded",
+function(){a.fire("stylesSet",{styles:b})},null,null,1);m(a)})}function m(a){var b=a.config,c=b.plugins,d=b.extraPlugins,e=b.removePlugins;if(d)var f=RegExp("(?:^|,)(?:"+d.replace(/\s*,\s*/g,"|")+")(?=,|$)","g"),c=c.replace(f,""),c=c+(","+d);if(e)var h=RegExp("(?:^|,)(?:"+e.replace(/\s*,\s*/g,"|")+")(?=,|$)","g"),c=c.replace(h,"");CKEDITOR.env.air&&(c=c+",adobeair");CKEDITOR.plugins.load(c.split(","),function(c){var d=[],e=[],f=[];a.plugins=c;for(var l in c){var q=c[l],n=q.lang,o=null,i=q.requires,
+j;CKEDITOR.tools.isArray(i)&&(i=i.join(","));if(i&&(j=i.match(h)))for(;i=j.pop();)CKEDITOR.tools.setTimeout(function(a,b){throw Error('Plugin "'+a.replace(",","")+'" cannot be removed from the plugins list, because it\'s required by "'+b+'" plugin.');},0,null,[i,l]);if(n&&!a.lang[l]){n.split&&(n=n.split(","));if(CKEDITOR.tools.indexOf(n,a.langCode)>=0)o=a.langCode;else{o=a.langCode.replace(/-.*/,"");o=o!=a.langCode&&CKEDITOR.tools.indexOf(n,o)>=0?o:CKEDITOR.tools.indexOf(n,"en")>=0?"en":n[0]}if(!q.langEntries||
+!q.langEntries[o])f.push(CKEDITOR.getUrl(q.path+"lang/"+o+".js"));else{a.lang[l]=q.langEntries[o];o=null}}e.push(o);d.push(q)}CKEDITOR.scriptLoader.load(f,function(){for(var c=["beforeInit","init","afterInit"],f=0;f<c.length;f++)for(var h=0;h<d.length;h++){var l=d[h];f===0&&(e[h]&&l.lang&&l.langEntries)&&(a.lang[l.name]=l.langEntries[e[h]]);if(l[c[f]])l[c[f]](a)}a.fireOnce("pluginsLoaded");b.keystrokes&&a.setKeystroke(a.config.keystrokes);for(h=0;h<a.config.blockedKeystrokes.length;h++)a.keystrokeHandler.blockedKeystrokes[a.config.blockedKeystrokes[h]]=
+1;a.status="loaded";a.fireOnce("loaded");CKEDITOR.fire("instanceLoaded",null,a)})})}function q(){var a=this.element;if(a&&this.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO){var b=this.getData();this.config.htmlEncodeOutput&&(b=CKEDITOR.tools.htmlEncode(b));a.is("textarea")?a.setValue(b):a.setHtml(b);return true}return false}b.prototype=CKEDITOR.editor.prototype;CKEDITOR.editor=b;var r=0,l={};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{addCommand:function(a,b){b.name=a.toLowerCase();var c=new CKEDITOR.command(this,
+b);this.mode&&f(this,c);return this.commands[a]=c},_attachToForm:function(){var a=this,b=a.element,c=new CKEDITOR.dom.element(b.$.form);if(b.is("textarea")&&c){var d=function(c){a.updateElement();a._.required&&(!b.getValue()&&a.fire("required")===false)&&c.data.preventDefault()};c.on("submit",d);if(c.$.submit&&c.$.submit.call&&c.$.submit.apply)c.$.submit=CKEDITOR.tools.override(c.$.submit,function(a){return function(){d();a.apply?a.apply(this):a()}});a.on("destroy",function(){c.removeListener("submit",
+d)})}},destroy:function(a){this.fire("beforeDestroy");!a&&q.call(this);this.editable(null);this.status="destroyed";this.fire("destroy");this.removeAllListeners();CKEDITOR.remove(this);CKEDITOR.fire("instanceDestroyed",null,this)},elementPath:function(a){return(a=a||this.getSelection().getStartElement())?new CKEDITOR.dom.elementPath(a,this.editable()):null},createRange:function(){var a=this.editable();return a?new CKEDITOR.dom.range(a):null},execCommand:function(a,b){var c=this.getCommand(a),d={name:a,
+commandData:b,command:c};if(c&&c.state!=CKEDITOR.TRISTATE_DISABLED&&this.fire("beforeCommandExec",d)!==true){d.returnValue=c.exec(d.commandData);if(!c.async&&this.fire("afterCommandExec",d)!==true)return d.returnValue}return false},getCommand:function(a){return this.commands[a]},getData:function(a){!a&&this.fire("beforeGetData");var b=this._.data;if(typeof b!="string")b=(b=this.element)&&this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE?b.is("textarea")?b.getValue():b.getHtml():"";b={dataValue:b};!a&&
+this.fire("getData",b);return b.dataValue},getSnapshot:function(){var a=this.fire("getSnapshot");if(typeof a!="string"){var b=this.element;b&&this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&(a=b.is("textarea")?b.getValue():b.getHtml())}return a},loadSnapshot:function(a){this.fire("loadSnapshot",a)},setData:function(a,b,c){if(b)this.on("dataReady",function(a){a.removeListener();b.call(a.editor)});a={dataValue:a};!c&&this.fire("setData",a);this._.data=a.dataValue;!c&&this.fire("afterSetData",a)},setReadOnly:function(a){a=
+a==void 0||a;if(this.readOnly!=a){this.readOnly=a;this.keystrokeHandler.blockedKeystrokes[8]=+a;this.editable().setReadOnly(a);this.fire("readOnly")}},insertHtml:function(a,b){this.fire("insertHtml",{dataValue:a,mode:b})},insertText:function(a){this.fire("insertText",a)},insertElement:function(a){this.fire("insertElement",a)},focus:function(){this.fire("beforeFocus")},checkDirty:function(){return this.status=="ready"&&this._.previousValue!==this.getSnapshot()},resetDirty:function(){this._.previousValue=
+this.getSnapshot()},updateElement:function(){return q.call(this)},setKeystroke:function(){for(var a=this.keystrokeHandler.keystrokes,b=CKEDITOR.tools.isArray(arguments[0])?arguments[0]:[[].slice.call(arguments,0)],c,d,e=b.length;e--;){c=b[e];d=0;if(CKEDITOR.tools.isArray(c)){d=c[1];c=c[0]}d?a[c]=d:delete a[c]}},addFeature:function(a){return this.filter.addFeature(a)}})})();CKEDITOR.ELEMENT_MODE_NONE=0;CKEDITOR.ELEMENT_MODE_REPLACE=1;CKEDITOR.ELEMENT_MODE_APPENDTO=2;CKEDITOR.ELEMENT_MODE_INLINE=3;
+CKEDITOR.htmlParser=function(){this._={htmlPartsRegex:RegExp("<(?:(?:\\/([^>]+)>)|(?:!--([\\S|\\s]*?)--\>)|(?:([^\\s>]+)\\s*((?:(?:\"[^\"]*\")|(?:'[^']*')|[^\"'>])*)\\/?>))","g")}};
+(function(){var b=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,c={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};CKEDITOR.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(a){for(var f,d,e=0,h;f=this._.htmlPartsRegex.exec(a);){d=f.index;if(d>e){e=a.substring(e,d);if(h)h.push(e);else this.onText(e)}e=
+this._.htmlPartsRegex.lastIndex;if(d=f[1]){d=d.toLowerCase();if(h&&CKEDITOR.dtd.$cdata[d]){this.onCDATA(h.join(""));h=null}if(!h){this.onTagClose(d);continue}}if(h)h.push(f[0]);else if(d=f[3]){d=d.toLowerCase();if(!/="/.test(d)){var j={},i;f=f[4];var k=!!(f&&f.charAt(f.length-1)=="/");if(f)for(;i=b.exec(f);){var m=i[1].toLowerCase();i=i[2]||i[3]||i[4]||"";j[m]=!i&&c[m]?m:i}this.onTagOpen(d,j,k);!h&&CKEDITOR.dtd.$cdata[d]&&(h=[])}}else if(d=f[2])this.onComment(d)}if(a.length>e)this.onText(a.substring(e,
+a.length))}}})();
+CKEDITOR.htmlParser.basicWriter=CKEDITOR.tools.createClass({$:function(){this._={output:[]}},proto:{openTag:function(b){this._.output.push("<",b)},openTagClose:function(b,c){c?this._.output.push(" />"):this._.output.push(">")},attribute:function(b,c){typeof c=="string"&&(c=CKEDITOR.tools.htmlEncodeAttr(c));this._.output.push(" ",b,'="',c,'"')},closeTag:function(b){this._.output.push("</",b,">")},text:function(b){this._.output.push(b)},comment:function(b){this._.output.push("<\!--",b,"--\>")},write:function(b){this._.output.push(b)},
+reset:function(){this._.output=[];this._.indent=false},getHtml:function(b){var c=this._.output.join("");b&&this.reset();return c}}});"use strict";
+(function(){CKEDITOR.htmlParser.node=function(){};CKEDITOR.htmlParser.node.prototype={remove:function(){var b=this.parent.children,c=CKEDITOR.tools.indexOf(b,this),a=this.previous,f=this.next;a&&(a.next=f);f&&(f.previous=a);b.splice(c,1);this.parent=null},replaceWith:function(b){var c=this.parent.children,a=CKEDITOR.tools.indexOf(c,this),f=b.previous=this.previous,d=b.next=this.next;f&&(f.next=b);d&&(d.previous=b);c[a]=b;b.parent=this.parent;this.parent=null},insertAfter:function(b){var c=b.parent.children,
+a=CKEDITOR.tools.indexOf(c,b),f=b.next;c.splice(a+1,0,this);this.next=b.next;this.previous=b;b.next=this;f&&(f.previous=this);this.parent=b.parent},insertBefore:function(b){var c=b.parent.children,a=CKEDITOR.tools.indexOf(c,b);c.splice(a,0,this);this.next=b;(this.previous=b.previous)&&(b.previous.next=this);b.previous=this;this.parent=b.parent}}})();"use strict";CKEDITOR.htmlParser.comment=function(b){this.value=b;this._={isBlockLike:false}};
+CKEDITOR.htmlParser.comment.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_COMMENT,filter:function(b){var c=this.value;if(!(c=b.onComment(c,this))){this.remove();return false}if(typeof c!="string"){this.replaceWith(c);return false}this.value=c;return true},writeHtml:function(b,c){c&&this.filter(c);b.comment(this.value)}});"use strict";
+(function(){CKEDITOR.htmlParser.text=function(b){this.value=b;this._={isBlockLike:false}};CKEDITOR.htmlParser.text.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(b){if(!(this.value=b.onText(this.value,this))){this.remove();return false}},writeHtml:function(b,c){c&&this.filter(c);b.text(this.value)}})})();"use strict";
+(function(){CKEDITOR.htmlParser.cdata=function(b){this.value=b};CKEDITOR.htmlParser.cdata.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(){},writeHtml:function(b){b.write(this.value)}})})();"use strict";CKEDITOR.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:true,hasInlineStarted:false}};
+(function(){function b(a){return a.name=="a"&&a.attributes.href||CKEDITOR.dtd.$removeEmpty[a.name]}var c=CKEDITOR.tools.extend({table:1,ul:1,ol:1,dl:1},CKEDITOR.dtd.table,CKEDITOR.dtd.ul,CKEDITOR.dtd.ol,CKEDITOR.dtd.dl),a={ol:1,ul:1},f=CKEDITOR.tools.extend({},{html:1},CKEDITOR.dtd.html,CKEDITOR.dtd.body,CKEDITOR.dtd.head,{style:1,script:1});CKEDITOR.htmlParser.fragment.fromHtml=function(d,e,h){function j(a){var b;if(p.length>0)for(var c=0;c<p.length;c++){var d=p[c],e=d.name,g=CKEDITOR.dtd[e],f=u.name&&
+CKEDITOR.dtd[u.name];if((!f||f[e])&&(!a||!g||g[a]||!CKEDITOR.dtd[a])){if(!b){i();b=1}d=d.clone();d.parent=u;u=d;p.splice(c,1);c--}else if(e==u.name){m(u,u.parent,1);c--}}}function i(){for(;v.length;)m(v.shift(),u)}function k(a){if(a._.isBlockLike&&a.name!="pre"&&a.name!="textarea"){var b=a.children.length,c=a.children[b-1],d;if(c&&c.type==CKEDITOR.NODE_TEXT)(d=CKEDITOR.tools.rtrim(c.value))?c.value=d:a.children.length=b-1}}function m(a,c,d){var c=c||u||g,e=u;if(a.previous===void 0){if(q(c,a)){u=c;
+l.onTagOpen(h,{});a.returnPoint=c=u}k(a);(!b(a)||a.children.length)&&c.add(a);a.name=="pre"&&(F=false);a.name=="textarea"&&(o=false)}if(a.returnPoint){u=a.returnPoint;delete a.returnPoint}else u=d?c:e}function q(a,b){if((a==g||a.name=="body")&&h&&(!a.name||CKEDITOR.dtd[a.name][h])){var c,d;return(c=b.attributes&&(d=b.attributes["data-cke-real-element-type"])?d:b.name)&&c in CKEDITOR.dtd.$inline&&!(c in CKEDITOR.dtd.head)&&!b.isOrphan||b.type==CKEDITOR.NODE_TEXT}}function r(a,b){return a in CKEDITOR.dtd.$listItem||
+a in CKEDITOR.dtd.$tableContent?a==b||a=="dt"&&b=="dd"||a=="dd"&&b=="dt":false}var l=new CKEDITOR.htmlParser,g=e instanceof CKEDITOR.htmlParser.element?e:typeof e=="string"?new CKEDITOR.htmlParser.element(e):new CKEDITOR.htmlParser.fragment,p=[],v=[],u=g,o=g.name=="textarea",F=g.name=="pre";l.onTagOpen=function(d,e,g,h){e=new CKEDITOR.htmlParser.element(d,e);if(e.isUnknown&&g)e.isEmpty=true;e.isOptionalClose=h;if(b(e))p.push(e);else{if(d=="pre")F=true;else{if(d=="br"&&F){u.add(new CKEDITOR.htmlParser.text("\n"));
+return}d=="textarea"&&(o=true)}if(d=="br")v.push(e);else{for(;;){h=(g=u.name)?CKEDITOR.dtd[g]||(u._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span):f;if(!e.isUnknown&&!u.isUnknown&&!h[d])if(u.isOptionalClose)l.onTagClose(g);else if(d in a&&g in a){g=u.children;(g=g[g.length-1])&&g.name=="li"||m(g=new CKEDITOR.htmlParser.element("li"),u);!e.returnPoint&&(e.returnPoint=u);u=g}else if(d in CKEDITOR.dtd.$listItem&&!r(d,g))l.onTagOpen(d=="li"?"ul":"dl",{},0,1);else if(g in c&&!r(d,g)){!e.returnPoint&&
+(e.returnPoint=u);u=u.parent}else{g in CKEDITOR.dtd.$inline&&p.unshift(u);if(u.parent)m(u,u.parent,1);else{e.isOrphan=1;break}}else break}j(d);i();e.parent=u;e.isEmpty?m(e):u=e}}};l.onTagClose=function(a){for(var b=p.length-1;b>=0;b--)if(a==p[b].name){p.splice(b,1);return}for(var c=[],d=[],e=u;e!=g&&e.name!=a;){e._.isBlockLike||d.unshift(e);c.push(e);e=e.returnPoint||e.parent}if(e!=g){for(b=0;b<c.length;b++){var f=c[b];m(f,f.parent)}u=e;e._.isBlockLike&&i();m(e,e.parent);if(e==u)u=u.parent;p=p.concat(d)}a==
+"body"&&(h=false)};l.onText=function(b){if((!u._.hasInlineStarted||v.length)&&!F&&!o){b=CKEDITOR.tools.ltrim(b);if(b.length===0)return}var d=u.name,e=d?CKEDITOR.dtd[d]||(u._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span):f;if(!o&&!e["#"]&&d in c){l.onTagOpen(d in a?"li":d=="dl"?"dd":d=="table"?"tr":d=="tr"?"td":"");l.onText(b)}else{i();j();!F&&!o&&(b=b.replace(/[\t\r\n ]{2,}|[\t\r\n]/g," "));b=new CKEDITOR.htmlParser.text(b);if(q(u,b))this.onTagOpen(h,{},0,1);u.add(b)}};l.onCDATA=function(a){u.add(new CKEDITOR.htmlParser.cdata(a))};
+l.onComment=function(a){i();j();u.add(new CKEDITOR.htmlParser.comment(a))};l.parse(d);for(i(!CKEDITOR.env.ie&&1);u!=g;)m(u,u.parent,1);k(g);return g};CKEDITOR.htmlParser.fragment.prototype={type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,add:function(a,b){isNaN(b)&&(b=this.children.length);var c=b>0?this.children[b-1]:null;if(c){if(a._.isBlockLike&&c.type==CKEDITOR.NODE_TEXT){c.value=CKEDITOR.tools.rtrim(c.value);if(c.value.length===0){this.children.pop();this.add(a);return}}c.next=a}a.previous=c;a.parent=this;
+this.children.splice(b,0,a);if(!this._.hasInlineStarted)this._.hasInlineStarted=a.type==CKEDITOR.NODE_TEXT||a.type==CKEDITOR.NODE_ELEMENT&&!a._.isBlockLike},filter:function(a){a.onRoot(this);this.filterChildren(a)},filterChildren:function(a,b){if(this.childrenFilteredBy!=a.id){if(b&&!this.parent)a.onRoot(this);this.childrenFilteredBy=a.id;for(var c=0;c<this.children.length;c++)this.children[c].filter(a)===false&&c--}},writeHtml:function(a,b){b&&this.filter(b);this.writeChildrenHtml(a)},writeChildrenHtml:function(a,
+b,c){if(c&&!this.parent&&b)b.onRoot(this);b&&this.filterChildren(b);for(var b=0,c=this.children,f=c.length;b<f;b++)c[b].writeHtml(a)},forEach:function(a,b,c){!c&&(!b||this.type==b)&&a(this);for(var c=this.children,f,i=0,k=c.length;i<k;i++){f=c[i];f.type==CKEDITOR.NODE_ELEMENT?f.forEach(a,b):(!b||f.type==b)&&a(f)}}}})();
+(function(){function b(a,b){for(var c=0;a&&c<b.length;c++)var d=b[c],a=a.replace(d[0],d[1]);return a}function c(a,b,c){typeof b=="function"&&(b=[b]);var d,f;f=a.length;var m=b&&b.length;if(m){for(d=0;d<f&&a[d].pri<=c;d++);for(f=m-1;f>=0;f--)if(m=b[f]){m.pri=c;a.splice(d,0,m)}}}function a(a,b,c){if(b)for(var d in b){var k=a[d];a[d]=f(k,b[d],c);k||a.$length++}}function f(a,b,f){if(b){b.pri=f;if(a){if(a.splice)c(a,b,f);else{a=a.pri>f?[b,a]:[a,b];a.filter=d}return a}return b.filter=b}}function d(a){for(var b=
+a.type||a instanceof CKEDITOR.htmlParser.fragment,c=0;c<this.length;c++){if(b)var d=a.type,f=a.name;var m=this[c].apply(window,arguments);if(m===false)return m;if(b){if(m&&(m.name!=f||m.type!=d))return m}else if(typeof m!="string")return m;m!=void 0&&(a=m)}return a}CKEDITOR.htmlParser.filter=CKEDITOR.tools.createClass({$:function(a){this.id=CKEDITOR.tools.getNextNumber();this._={elementNames:[],attributeNames:[],elements:{$length:0},attributes:{$length:0}};a&&this.addRules(a,10)},proto:{addRules:function(b,
+d){typeof d!="number"&&(d=10);c(this._.elementNames,b.elementNames,d);c(this._.attributeNames,b.attributeNames,d);a(this._.elements,b.elements,d);a(this._.attributes,b.attributes,d);this._.text=f(this._.text,b.text,d)||this._.text;this._.comment=f(this._.comment,b.comment,d)||this._.comment;this._.root=f(this._.root,b.root,d)||this._.root},applyTo:function(a){a.filter(this)},onElementName:function(a){return b(a,this._.elementNames)},onAttributeName:function(a){return b(a,this._.attributeNames)},onText:function(a){var b=
+this._.text;return b?b.filter(a):a},onComment:function(a,b){var c=this._.comment;return c?c.filter(a,b):a},onRoot:function(a){var b=this._.root;return b?b.filter(a):a},onElement:function(a){for(var b=[this._.elements["^"],this._.elements[a.name],this._.elements.$],c,d=0;d<3;d++)if(c=b[d]){c=c.filter(a,this);if(c===false)return null;if(c&&c!=a)return this.onNode(c);if(a.parent&&!a.name)break}return a},onNode:function(a){var b=a.type;return b==CKEDITOR.NODE_ELEMENT?this.onElement(a):b==CKEDITOR.NODE_TEXT?
+new CKEDITOR.htmlParser.text(this.onText(a.value)):b==CKEDITOR.NODE_COMMENT?new CKEDITOR.htmlParser.comment(this.onComment(a.value)):null},onAttribute:function(a,b,c){if(b=this._.attributes[b]){a=b.filter(c,a,this);if(a===false)return false;if(typeof a!="undefined")return a}return c}}})})();
+(function(){function b(b,c){function g(a){return a||CKEDITOR.env.ie?new CKEDITOR.htmlParser.text(" "):new CKEDITOR.htmlParser.element("br",{"data-cke-bogus":1})}function l(b,c){return function(d){if(d.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT){var l=[],h=a(d),n,o;if(h)for(p(h,1)&&l.push(h);h;){if(e(h)&&(n=f(h))&&p(n))if((o=f(n))&&!e(o))l.push(n);else{var r=n,w=g(q),j=r.parent.children,B=CKEDITOR.tools.indexOf(j,r);j.splice(B+1,0,w);j=r.next;r.next=w;w.previous=r;w.parent=r.parent;w.next=j;i(n)}h=h.previous}for(h=
+0;h<l.length;h++)i(l[h]);if(l=CKEDITOR.env.opera&&!b||(typeof c=="function"?c(d)!==false:c))if(!q&&CKEDITOR.env.ie&&d.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)l=false;else if(!q&&CKEDITOR.env.ie&&(document.documentMode>7||d.name in CKEDITOR.dtd.tr||d.name in CKEDITOR.dtd.$listItem))l=false;else{l=a(d);l=!l||d.name=="form"&&l.name=="input"}l&&d.add(g(b))}}}function p(a,b){if((!q||!CKEDITOR.env.ie)&&a.type==CKEDITOR.NODE_ELEMENT&&a.name=="br"&&!a.attributes["data-cke-eol"])return true;var c;if(a.type==
+CKEDITOR.NODE_TEXT&&(c=a.value.match(F))){if(c.index){h(a,new CKEDITOR.htmlParser.text(a.value.substring(0,c.index)));a.value=c[0]}if(CKEDITOR.env.ie&&q&&(!b||a.parent.name in o))return true;if(!q)if((c=a.previous)&&c.name=="br"||!c||e(c))return true}return false}var n={elements:{}},q=c=="html",o=CKEDITOR.tools.extend({},z),r;for(r in o)"#"in s[r]||delete o[r];for(r in o)n.elements[r]=l(q,b.config.fillEmptyBlocks!==false);n.root=l(q);n.elements.br=function(a){return function(b){if(b.parent.type!=
+CKEDITOR.NODE_DOCUMENT_FRAGMENT){var c=b.attributes;if("data-cke-bogus"in c||"data-cke-eol"in c)delete c["data-cke-bogus"];else{for(c=b.next;c&&d(c);)c=c.next;var l=f(b);!c&&e(b.parent)?j(b.parent,g(a)):e(c)&&(l&&!e(l))&&h(c,g(a))}}}}(q);return n}function c(a){return a.enterMode!=CKEDITOR.ENTER_BR&&a.autoParagraph!==false?a.enterMode==CKEDITOR.ENTER_DIV?"div":"p":false}function a(a){for(a=a.children[a.children.length-1];a&&d(a);)a=a.previous;return a}function f(a){for(a=a.previous;a&&d(a);)a=a.previous;
+return a}function d(a){return a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(a.value)||a.type==CKEDITOR.NODE_ELEMENT&&a.attributes["data-cke-bookmark"]}function e(a){return a&&(a.type==CKEDITOR.NODE_ELEMENT&&a.name in z||a.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)}function h(a,b){var c=a.parent.children,d=CKEDITOR.tools.indexOf(c,a);c.splice(d,0,b);c=a.previous;a.previous=b;b.next=a;b.parent=a.parent;if(c){b.previous=c;c.next=b}}function j(a,b){var c=a.children[a.children.length-1];a.children.push(b);
+b.parent=a;if(c){c.next=b;b.previous=c}}function i(a){var b=a.parent.children,c=CKEDITOR.tools.indexOf(b,a),d=a.previous,a=a.next;d&&(d.next=a);a&&(a.previous=d);b.splice(c,1)}function k(a){var b=a.parent;return b?CKEDITOR.tools.indexOf(b.children,a):-1}function m(a){a=a.attributes;a.contenteditable!="false"&&(a["data-cke-editable"]=a.contenteditable?"true":1);a.contenteditable="false"}function q(a){a=a.attributes;switch(a["data-cke-editable"]){case "true":a.contenteditable="true";break;case "1":delete a.contenteditable}}
+function r(a){return a.replace(n,function(a,b,c){return"<"+b+c.replace(w,function(a,b){if(!/^on/.test(b)&&c.indexOf("data-cke-saved-"+b)==-1){a=a.slice(1);return" data-cke-saved-"+a+" data-cke-"+CKEDITOR.rnd+"-"+a}return a})+">"})}function l(a,b){return a.replace(b,function(a,b,c){a.indexOf("<textarea")===0&&(a=b+v(c).replace(/</g,"&lt;").replace(/>/g,"&gt;")+"</textarea>");return"<cke:encoded>"+encodeURIComponent(a)+"</cke:encoded>"})}function g(a){return a.replace(D,function(a,b){return decodeURIComponent(b)})}
+function p(a){return a.replace(/<\!--(?!{cke_protected})[\s\S]+?--\>/g,function(a){return"<\!--"+A+"{C}"+encodeURIComponent(a).replace(/--/g,"%2D%2D")+"--\>"})}function v(a){return a.replace(/<\!--\{cke_protected\}\{C\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)})}function u(a,b){var c=b._.dataStore;return a.replace(/<\!--\{cke_protected\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)}).replace(/\{cke_protected_(\d+)\}/g,function(a,b){return c&&c[b]||""})}function o(a,
+b){for(var c=[],d=b.config.protectedSource,g=b._.dataStore||(b._.dataStore={id:1}),e=/<\!--\{cke_temp(comment)?\}(\d*?)--\>/g,d=[/<script[\s\S]*?<\/script>/gi,/<noscript[\s\S]*?<\/noscript>/gi].concat(d),a=a.replace(/<\!--[\s\S]*?--\>/g,function(a){return"<\!--{cke_tempcomment}"+(c.push(a)-1)+"--\>"}),f=0;f<d.length;f++)a=a.replace(d[f],function(a){a=a.replace(e,function(a,b,d){return c[d]});return/cke_temp(comment)?/.test(a)?a:"<\!--{cke_temp}"+(c.push(a)-1)+"--\>"});a=a.replace(e,function(a,b,d){return"<\!--"+
+A+(b?"{C}":"")+encodeURIComponent(c[d]).replace(/--/g,"%2D%2D")+"--\>"});return a.replace(/(['"]).*?\1/g,function(a){return a.replace(/<\!--\{cke_protected\}([\s\S]+?)--\>/g,function(a,b){g[g.id]=decodeURIComponent(b);return"{cke_protected_"+g.id++ +"}"})})}CKEDITOR.htmlDataProcessor=function(a){var d,e,f=this;this.editor=a;this.dataFilter=d=new CKEDITOR.htmlParser.filter;this.htmlFilter=e=new CKEDITOR.htmlParser.filter;this.writer=new CKEDITOR.htmlParser.basicWriter;d.addRules(t);d.addRules(b(a,
+"data"));e.addRules(C);e.addRules(b(a,"html"));a.on("toHtml",function(b){var b=b.data,d=b.dataValue,d=o(d,a),d=l(d,G),d=r(d),d=l(d,I),d=d.replace(Q,"$1cke:$2"),d=d.replace(E,"<cke:$1$2></cke:$1>"),d=CKEDITOR.env.opera?d:d.replace(/(<pre\b[^>]*>)(\r\n|\n)/g,"$1$2$2"),e=b.context||a.editable().getName(),f;if(CKEDITOR.env.ie&&CKEDITOR.env.version<9&&e=="pre"){e="div";d="<pre>"+d+"</pre>";f=1}e=a.document.createElement(e);e.setHtml("a"+d);d=e.getHtml().substr(1);d=d.replace(RegExp(" data-cke-"+CKEDITOR.rnd+
+"-","ig")," ");f&&(d=d.replace(/^<pre>|<\/pre>$/gi,""));d=d.replace(L,"$1$2");d=g(d);d=v(d);b.dataValue=CKEDITOR.htmlParser.fragment.fromHtml(d,b.context,b.fixForBody===false?false:c(a.config))},null,null,5);a.on("toHtml",function(a){a.data.dataValue.filterChildren(f.dataFilter,true)},null,null,10);a.on("toHtml",function(a){var a=a.data,b=a.dataValue,c=new CKEDITOR.htmlParser.basicWriter;b.writeChildrenHtml(c);b=c.getHtml(true);a.dataValue=p(b)},null,null,15);a.on("toDataFormat",function(b){b.data.dataValue=
+CKEDITOR.htmlParser.fragment.fromHtml(b.data.dataValue,a.editable().getName(),c(a.config))},null,null,5);a.on("toDataFormat",function(a){a.data.dataValue.filterChildren(f.htmlFilter,true)},null,null,10);a.on("toDataFormat",function(b){var c=b.data.dataValue,d=f.writer;d.reset();c.writeChildrenHtml(d);c=d.getHtml(true);c=v(c);c=u(c,a);b.data.dataValue=c},null,null,15)};CKEDITOR.htmlDataProcessor.prototype={toHtml:function(a,b,c,d){var g=this.editor;!b&&b!==null&&(b=g.editable().getName());return g.fire("toHtml",
+{dataValue:a,context:b,fixForBody:c,dontFilter:!!d}).dataValue},toDataFormat:function(a){return this.editor.fire("toDataFormat",{dataValue:a}).dataValue}};var F=/(?:&nbsp;|\xa0)$/,A="{cke_protected}",s=CKEDITOR.dtd,x=["caption","colgroup","col","thead","tfoot","tbody"],z=CKEDITOR.tools.extend({},s.$blockLimit,s.$block),t={elements:{},attributeNames:[[/^on/,"data-cke-pa-on"]]},C={elementNames:[[/^cke:/,""],[/^\?xml:namespace$/,""]],attributeNames:[[/^data-cke-(saved|pa)-/,""],[/^data-cke-.*/,""],["hidefocus",
+""]],elements:{$:function(a){var b=a.attributes;if(b){if(b["data-cke-temp"])return false;for(var c=["name","href","src"],d,g=0;g<c.length;g++){d="data-cke-saved-"+c[g];d in b&&delete b[c[g]]}}return a},table:function(a){a.children.slice(0).sort(function(a,b){var c,d;if(a.type==CKEDITOR.NODE_ELEMENT&&b.type==a.type){c=CKEDITOR.tools.indexOf(x,a.name);d=CKEDITOR.tools.indexOf(x,b.name)}if(!(c>-1&&d>-1&&c!=d)){c=k(a);d=k(b)}return c>d?1:-1})},embed:function(a){var b=a.parent;if(b&&b.name=="object"){var c=
+b.attributes.width,b=b.attributes.height;c&&(a.attributes.width=c);b&&(a.attributes.height=b)}},param:function(a){a.children=[];a.isEmpty=true;return a},a:function(a){if(!a.children.length&&!a.attributes.name&&!a.attributes["data-cke-saved-name"])return false},span:function(a){a.attributes["class"]=="Apple-style-span"&&delete a.name},html:function(a){delete a.attributes.contenteditable;delete a.attributes["class"]},body:function(a){delete a.attributes.spellcheck;delete a.attributes.contenteditable},
+style:function(a){var b=a.children[0];b&&b.value&&(b.value=CKEDITOR.tools.trim(b.value));if(!a.attributes.type)a.attributes.type="text/css"},title:function(a){var b=a.children[0];!b&&j(a,b=new CKEDITOR.htmlParser.text);b.value=a.attributes["data-cke-title"]||""}},attributes:{"class":function(a){return CKEDITOR.tools.ltrim(a.replace(/(?:^|\s+)cke_[^\s]*/g,""))||false}}};if(CKEDITOR.env.ie)C.attributes.style=function(a){return a.replace(/(^|;)([^\:]+)/g,function(a){return a.toLowerCase()})};for(var y in{input:1,
+textarea:1}){t.elements[y]=m;C.elements[y]=q}var n=/<(a|area|img|input|source)\b([^>]*)>/gi,w=/\s(on\w+|href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,I=/(?:<style(?=[ >])[^>]*>[\s\S]*?<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,G=/(<textarea(?=[ >])[^>]*>)([\s\S]*?)(?:<\/textarea>)/gi,D=/<cke:encoded>([^<]*)<\/cke:encoded>/gi,Q=/(<\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,L=/(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,E=/<cke:(param|embed)([^>]*?)\/?>(?!\s*<\/cke:\1)/gi})();
+"use strict";CKEDITOR.htmlParser.element=function(b,c){this.name=b;this.attributes=c||{};this.children=[];var a=b||"",f=a.match(/^cke:(.*)/);f&&(a=f[1]);a=!(!CKEDITOR.dtd.$nonBodyContent[a]&&!CKEDITOR.dtd.$block[a]&&!CKEDITOR.dtd.$listItem[a]&&!CKEDITOR.dtd.$tableContent[a]&&!(CKEDITOR.dtd.$nonEditable[a]||a=="br"));this.isEmpty=!!CKEDITOR.dtd.$empty[b];this.isUnknown=!CKEDITOR.dtd[b];this._={isBlockLike:a,hasInlineStarted:this.isEmpty||!a}};
+CKEDITOR.htmlParser.cssStyle=function(b){var c={};((b instanceof CKEDITOR.htmlParser.element?b.attributes.style:b)||"").replace(/&quot;/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,b,d){b=="font-family"&&(d=d.replace(/["']/g,""));c[b.toLowerCase()]=d});return{rules:c,populate:function(a){var b=this.toString();if(b)a instanceof CKEDITOR.dom.element?a.setAttribute("style",b):a instanceof CKEDITOR.htmlParser.element?a.attributes.style=b:a.style=b},toString:function(){var a=[],b;
+for(b in c)c[b]&&a.push(b,":",c[b],";");return a.join("")}}};
+(function(){var b=function(a,b){a=a[0];b=b[0];return a<b?-1:a>b?1:0},c=CKEDITOR.htmlParser.fragment.prototype;CKEDITOR.htmlParser.element.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_ELEMENT,add:c.add,clone:function(){return new CKEDITOR.htmlParser.element(this.name,this.attributes)},filter:function(a){var b=this,c,e;if(!b.parent)a.onRoot(b);for(;;){c=b.name;if(!(e=a.onElementName(c))){this.remove();return false}b.name=e;if(!(b=a.onElement(b))){this.remove();return false}if(b!==
+this){this.replaceWith(b);return false}if(b.name==c)break;if(b.type!=CKEDITOR.NODE_ELEMENT){this.replaceWith(b);return false}if(!b.name){this.replaceWithChildren();return false}}c=b.attributes;var h,j;for(h in c){j=h;for(e=c[h];;)if(j=a.onAttributeName(h))if(j!=h){delete c[h];h=j}else break;else{delete c[h];break}j&&((e=a.onAttribute(b,j,e))===false?delete c[j]:c[j]=e)}b.isEmpty||this.filterChildren(a);return true},filterChildren:c.filterChildren,writeHtml:function(a,c){c&&this.filter(c);var d=this.name,
+e=[],h=this.attributes,j,i;a.openTag(d,h);for(j in h)e.push([j,h[j]]);a.sortAttributes&&e.sort(b);j=0;for(i=e.length;j<i;j++){h=e[j];a.attribute(h[0],h[1])}a.openTagClose(d,this.isEmpty);this.writeChildrenHtml(a);this.isEmpty||a.closeTag(d)},writeChildrenHtml:c.writeChildrenHtml,replaceWithChildren:function(){for(var a=this.children,b=a.length;b;)a[--b].insertAfter(this);this.remove()},forEach:c.forEach})})();
+(function(){var b={};CKEDITOR.template=function(c){if(b[c])this.output=b[c];else{var a=c.replace(/'/g,"\\'").replace(/{([^}]+)}/g,function(a,b){return"',data['"+b+"']==undefined?'{"+b+"}':data['"+b+"'],'"});this.output=b[c]=Function("data","buffer","return buffer?buffer.push('"+a+"'):['"+a+"'].join('');")}}})();delete CKEDITOR.loadFullCore;CKEDITOR.instances={};CKEDITOR.document=new CKEDITOR.dom.document(document);
+CKEDITOR.add=function(b){CKEDITOR.instances[b.name]=b;b.on("focus",function(){if(CKEDITOR.currentInstance!=b){CKEDITOR.currentInstance=b;CKEDITOR.fire("currentInstance")}});b.on("blur",function(){if(CKEDITOR.currentInstance==b){CKEDITOR.currentInstance=null;CKEDITOR.fire("currentInstance")}});CKEDITOR.fire("instance",null,b)};CKEDITOR.remove=function(b){delete CKEDITOR.instances[b.name]};
+(function(){var b={};CKEDITOR.addTemplate=function(c,a){var f=b[c];if(f)return f;f={name:c,source:a};CKEDITOR.fire("template",f);return b[c]=new CKEDITOR.template(f.source)};CKEDITOR.getTemplate=function(c){return b[c]}})();(function(){var b=[];CKEDITOR.addCss=function(c){b.push(c)};CKEDITOR.getCss=function(){return b.join("\n")}})();CKEDITOR.on("instanceDestroyed",function(){CKEDITOR.tools.isEmpty(this.instances)&&CKEDITOR.fire("reset")});CKEDITOR.TRISTATE_ON=1;CKEDITOR.TRISTATE_OFF=2;
+CKEDITOR.TRISTATE_DISABLED=0;
+(function(){CKEDITOR.inline=function(b,c){if(!CKEDITOR.env.isCompatible)return null;b=CKEDITOR.dom.element.get(b);if(b.getEditor())throw'The editor instance "'+b.getEditor().name+'" is already attached to the provided element.';var a=new CKEDITOR.editor(c,b,CKEDITOR.ELEMENT_MODE_INLINE),f=b.is("textarea")?b:null;if(f){a.setData(f.getValue(),null,true);b=CKEDITOR.dom.element.createFromHtml('<div contenteditable="'+!!a.readOnly+'" class="cke_textarea_inline">'+f.getValue()+"</div>",CKEDITOR.document);
+b.insertAfter(f);f.hide();f.$.form&&a._attachToForm()}else a.setData(b.getHtml(),null,true);a.on("loaded",function(){a.fire("uiReady");a.editable(b);a.container=b;a.setData(a.getData(1));a.resetDirty();a.fire("contentDom");a.mode="wysiwyg";a.fire("mode");a.status="ready";a.fireOnce("instanceReady");CKEDITOR.fire("instanceReady",null,a)},null,null,1E4);a.on("destroy",function(){if(f){a.container.clearCustomData();a.container.remove();f.show()}a.element.clearCustomData();delete a.element});return a};
+CKEDITOR.inlineAll=function(){var b,c,a;for(a in CKEDITOR.dtd.$editable)for(var f=CKEDITOR.document.getElementsByTag(a),d=0,e=f.count();d<e;d++){b=f.getItem(d);if(b.getAttribute("contenteditable")=="true"){c={element:b,config:{}};CKEDITOR.fire("inline",c)!==false&&CKEDITOR.inline(b,c.config)}}};CKEDITOR.domReady(function(){!CKEDITOR.disableAutoInline&&CKEDITOR.inlineAll()})})();CKEDITOR.replaceClass="ckeditor";
+(function(){function b(b,e,f,j){if(!CKEDITOR.env.isCompatible)return null;b=CKEDITOR.dom.element.get(b);if(b.getEditor())throw'The editor instance "'+b.getEditor().name+'" is already attached to the provided element.';var i=new CKEDITOR.editor(e,b,j);if(j==CKEDITOR.ELEMENT_MODE_REPLACE){b.setStyle("visibility","hidden");i._.required=b.hasAttribute("required");b.removeAttribute("required")}f&&i.setData(f,null,true);i.on("loaded",function(){a(i);j==CKEDITOR.ELEMENT_MODE_REPLACE&&(i.config.autoUpdateElement&&
+b.$.form)&&i._attachToForm();i.setMode(i.config.startupMode,function(){i.resetDirty();i.status="ready";i.fireOnce("instanceReady");CKEDITOR.fire("instanceReady",null,i)})});i.on("destroy",c);return i}function c(){var a=this.container,b=this.element;if(a){a.clearCustomData();a.remove()}if(b){b.clearCustomData();if(this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE){b.show();this._.required&&b.setAttribute("required","required")}delete this.element}}function a(a){var b=a.name,c=a.element,j=a.elementMode,
+i=a.fire("uiSpace",{space:"top",html:""}).html,k=a.fire("uiSpace",{space:"bottom",html:""}).html;f||(f=CKEDITOR.addTemplate("maincontainer",'<{outerEl} id="cke_{name}" class="{id} cke cke_reset cke_chrome cke_editor_{name} cke_{langDir} '+CKEDITOR.env.cssClass+'"  dir="{langDir}" lang="{langCode}" role="application" aria-labelledby="cke_{name}_arialbl"><span id="cke_{name}_arialbl" class="cke_voice_label">{voiceLabel}</span><{outerEl} class="cke_inner cke_reset" role="presentation">{topHtml}<{outerEl} id="{contentId}" class="cke_contents cke_reset" role="presentation"></{outerEl}>{bottomHtml}</{outerEl}></{outerEl}>'));
+b=CKEDITOR.dom.element.createFromHtml(f.output({id:a.id,name:b,langDir:a.lang.dir,langCode:a.langCode,voiceLabel:[a.lang.editor,a.name].join(", "),topHtml:i?'<span id="'+a.ui.spaceId("top")+'" class="cke_top cke_reset_all" role="presentation" style="height:auto">'+i+"</span>":"",contentId:a.ui.spaceId("contents"),bottomHtml:k?'<span id="'+a.ui.spaceId("bottom")+'" class="cke_bottom cke_reset_all" role="presentation">'+k+"</span>":"",outerEl:CKEDITOR.env.ie?"span":"div"}));if(j==CKEDITOR.ELEMENT_MODE_REPLACE){c.hide();
+b.insertAfter(c)}else c.append(b);a.container=b;i&&a.ui.space("top").unselectable();k&&a.ui.space("bottom").unselectable();c=a.config.width;j=a.config.height;c&&b.setStyle("width",CKEDITOR.tools.cssLength(c));j&&a.ui.space("contents").setStyle("height",CKEDITOR.tools.cssLength(j));b.disableContextMenu();CKEDITOR.env.webkit&&b.on("focus",function(){a.focus()});a.fireOnce("uiReady")}CKEDITOR.replace=function(a,c){return b(a,c,null,CKEDITOR.ELEMENT_MODE_REPLACE)};CKEDITOR.appendTo=function(a,c,f){return b(a,
+c,f,CKEDITOR.ELEMENT_MODE_APPENDTO)};CKEDITOR.replaceAll=function(){for(var a=document.getElementsByTagName("textarea"),b=0;b<a.length;b++){var c=null,f=a[b];if(f.name||f.id){if(typeof arguments[0]=="string"){if(!RegExp("(?:^|\\s)"+arguments[0]+"(?:$|\\s)").test(f.className))continue}else if(typeof arguments[0]=="function"){c={};if(arguments[0](f,c)===false)continue}this.replace(f,c)}}};CKEDITOR.editor.prototype.addMode=function(a,b){(this._.modes||(this._.modes={}))[a]=b};CKEDITOR.editor.prototype.setMode=
+function(a,b){var c=this,f=this._.modes;if(!(a==c.mode||!f||!f[a])){c.fire("beforeSetMode",a);if(c.mode){var i=c.checkDirty();c._.previousMode=c.mode;c.fire("beforeModeUnload");c.editable(0);c.ui.space("contents").setHtml("");c.mode=""}this._.modes[a](function(){c.mode=a;i!==void 0&&!i&&c.resetDirty();setTimeout(function(){c.fire("mode");b&&b.call(c)},0)})}};CKEDITOR.editor.prototype.resize=function(a,b,c,f){var i=this.container,k=this.ui.space("contents"),m=CKEDITOR.env.webkit&&this.document&&this.document.getWindow().$.frameElement,
+f=f?i.getChild(1):i;f.setSize("width",a,true);m&&(m.style.width="1%");k.setStyle("height",Math.max(b-(c?0:(f.$.offsetHeight||0)-(k.$.clientHeight||0)),0)+"px");m&&(m.style.width="100%");this.fire("resize")};CKEDITOR.editor.prototype.getResizable=function(a){return a?this.ui.space("contents"):this.container};var f;CKEDITOR.domReady(function(){CKEDITOR.replaceClass&&CKEDITOR.replaceAll(CKEDITOR.replaceClass)})})();CKEDITOR.config.startupMode="wysiwyg";
+(function(){function b(b){var c=b.editor,d=c.editable(),g=b.data.path,e=g.blockLimit,f=b.data.selection.getRanges()[0],h=c.config.enterMode;if(CKEDITOR.env.gecko){var o=g.block||g.blockLimit||g.root,i=o&&o.getLast(a);o&&(o.isBlockBoundary()&&(!i||!(i.type==CKEDITOR.NODE_ELEMENT&&i.isBlockBoundary()))&&!o.is("pre")&&!o.getBogus())&&o.appendBogus()}if(c.config.autoParagraph!==false&&h!=CKEDITOR.ENTER_BR&&f.collapsed&&d.equals(e)&&!g.block){d=f.clone();d.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);g=new CKEDITOR.dom.walker(d);
+g.guard=function(b){return!a(b)||b.type==CKEDITOR.NODE_COMMENT||b.isReadOnly()};if(!g.checkForward()||d.checkStartOfBlock()&&d.checkEndOfBlock()){c=f.fixBlock(true,c.config.enterMode==CKEDITOR.ENTER_DIV?"div":"p");if(CKEDITOR.env.ie)(c=c.getFirst(a))&&(c.type==CKEDITOR.NODE_TEXT&&CKEDITOR.tools.trim(c.getText()).match(/^(?:&nbsp;|\xa0)$/))&&c.remove();f.select();b.cancel()}}}function c(a){var b=a.data.getTarget();if(b.is("input")){b=b.getAttribute("type");(b=="submit"||b=="reset")&&a.data.preventDefault()}}
+function a(a){return i(a)&&k(a)}function f(a,b){return function(c){var d=CKEDITOR.dom.element.get(c.data.$.toElement||c.data.$.fromElement||c.data.$.relatedTarget);(!d||!b.equals(d)&&!b.contains(d))&&a.call(this,c)}}function d(b){var c,d=b.getRanges()[0],b=b.root,g=d.startPath(),e={table:1,ul:1,ol:1,dl:1},f=CKEDITOR.dom.walker.bogus();if(g.contains(e)){var g=function(b){return function(d,g){g&&(d.type==CKEDITOR.NODE_ELEMENT&&d.is(e))&&(c=d);if(!g&&a(d)&&(!b||!f(d)))return false}},h=d.clone();h.collapse(1);
+h.setStartAt(b,CKEDITOR.POSITION_AFTER_START);b=new CKEDITOR.dom.walker(h);b.guard=g();b.checkBackward();if(c){h=d.clone();h.collapse();h.setEndAt(c,CKEDITOR.POSITION_AFTER_END);b=new CKEDITOR.dom.walker(h);b.guard=g(true);c=false;b.checkForward();return c}}return null}function e(a){a.editor.focus();a.editor.fire("saveSnapshot")}function h(a,b){var c=a.editor;!b&&c.getSelection().scrollIntoView();setTimeout(function(){c.fire("saveSnapshot")},0)}CKEDITOR.editable=CKEDITOR.tools.createClass({base:CKEDITOR.dom.element,
+$:function(a,b){this.base(b.$||b);this.editor=a;this.hasFocus=false;this.setup()},proto:{focus:function(){this.$[CKEDITOR.env.ie&&this.getDocument().equals(CKEDITOR.document)?"setActive":"focus"]();CKEDITOR.env.safari&&!this.isInline()&&(CKEDITOR.document.getActive().equals(this.getWindow().getFrame())||this.getWindow().focus())},on:function(a,b){var c=Array.prototype.slice.call(arguments,0);if(CKEDITOR.env.ie&&/^focus|blur$/.exec(a)){a=a=="focus"?"focusin":"focusout";b=f(b,this);c[0]=a;c[1]=b}return CKEDITOR.dom.element.prototype.on.apply(this,
+c)},attachListener:function(a,b,c,d,e,f){!this._.listeners&&(this._.listeners=[]);var h=Array.prototype.slice.call(arguments,1);this._.listeners.push(a.on.apply(a,h))},clearListeners:function(){var a=this._.listeners;try{for(;a.length;)a.pop().removeListener()}catch(b){}},restoreAttrs:function(){var a=this._.attrChanges,b,c;for(c in a)if(a.hasOwnProperty(c)){b=a[c];b!==null?this.setAttribute(c,b):this.removeAttribute(c)}},attachClass:function(a){var b=this.getCustomData("classes");if(!this.hasClass(a)){!b&&
+(b=[]);b.push(a);this.setCustomData("classes",b);this.addClass(a)}},changeAttr:function(a,b){var c=this.getAttribute(a);if(b!==c){!this._.attrChanges&&(this._.attrChanges={});a in this._.attrChanges||(this._.attrChanges[a]=c);this.setAttribute(a,b)}},insertHtml:function(a,b){e(this);m(this,b||"html",a)},insertText:function(a){e(this);var b=this.editor,c=b.getSelection().getStartElement().hasAscendant("pre",true)?CKEDITOR.ENTER_BR:b.config.enterMode,b=c==CKEDITOR.ENTER_BR,d=CKEDITOR.tools,a=d.htmlEncode(a.replace(/\r\n/g,
+"\n")),a=a.replace(/\t/g,"&nbsp;&nbsp; &nbsp;"),c=c==CKEDITOR.ENTER_P?"p":"div";if(!b){var f=/\n{2}/g;if(f.test(a))var h="<"+c+">",i="</"+c+">",a=h+a.replace(f,function(){return i+h})+i}a=a.replace(/\n/g,"<br>");b||(a=a.replace(RegExp("<br>(?=</"+c+">)"),function(a){return d.repeat(a,2)}));a=a.replace(/^ | $/g,"&nbsp;");a=a.replace(/(>|\s) /g,function(a,b){return b+"&nbsp;"}).replace(/ (?=<)/g,"&nbsp;");m(this,"text",a)},insertElement:function(b){e(this);for(var c=this.editor,d=c.config.enterMode,
+g=c.getSelection(),f=g.getRanges(),i=b.getName(),j=CKEDITOR.dtd.$block[i],o,m,k,s=f.length-1;s>=0;s--){o=f[s];if(!o.checkReadOnly()){o.deleteContents(1);m=!s&&b||b.clone(1);var x,z;if(j)for(;(x=o.getCommonAncestor(0,1))&&(z=CKEDITOR.dtd[x.getName()])&&(!z||!z[i]);)if(x.getName()in CKEDITOR.dtd.span)o.splitElement(x);else if(o.checkStartOfBlock()&&o.checkEndOfBlock()){o.setStartBefore(x);o.collapse(true);x.remove()}else o.splitBlock(d==CKEDITOR.ENTER_DIV?"div":"p",c.editable());o.insertNode(m);k||
+(k=m)}}if(k){o.moveToPosition(k,CKEDITOR.POSITION_AFTER_END);if(j)if((b=k.getNext(a))&&b.type==CKEDITOR.NODE_ELEMENT&&b.is(CKEDITOR.dtd.$block))b.getDtd()["#"]?o.moveToElementEditStart(b):o.moveToElementEditEnd(k);else if(!b&&d!=CKEDITOR.ENTER_BR){b=o.fixBlock(true,d==CKEDITOR.ENTER_DIV?"div":"p");o.moveToElementEditStart(b)}}g.selectRanges([o]);h(this,CKEDITOR.env.opera)},setData:function(a,b){!b&&this.editor.dataProcessor&&(a=this.editor.dataProcessor.toHtml(a));this.setHtml(a);this.editor.fire("dataReady")},
+getData:function(a){var b=this.getHtml();!a&&this.editor.dataProcessor&&(b=this.editor.dataProcessor.toDataFormat(b));return b},setReadOnly:function(a){this.setAttribute("contenteditable",!a)},detach:function(){this.removeClass("cke_editable");var a=this.editor;this._.detach();delete a.document;delete a.window},isInline:function(){return this.getDocument().equals(CKEDITOR.document)},setup:function(){var a=this.editor;this.attachListener(a,"beforeGetData",function(){var b=this.getData();this.is("textarea")||
+a.config.ignoreEmptyParagraph!==false&&(b=b.replace(j,function(a,b){return b}));a.setData(b,null,1)},this);this.attachListener(a,"getSnapshot",function(a){a.data=this.getData(1)},this);this.attachListener(a,"afterSetData",function(){this.setData(a.getData(1))},this);this.attachListener(a,"loadSnapshot",function(a){this.setData(a.data,1)},this);this.attachListener(a,"beforeFocus",function(){var b=a.getSelection();(b=b&&b.getNative())&&b.type=="Control"||this.focus()},this);this.attachListener(a,"insertHtml",
+function(a){this.insertHtml(a.data.dataValue,a.data.mode)},this);this.attachListener(a,"insertElement",function(a){this.insertElement(a.data)},this);this.attachListener(a,"insertText",function(a){this.insertText(a.data)},this);this.setReadOnly(a.readOnly);this.attachClass("cke_editable");this.attachClass(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"cke_editable_inline":a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE||a.elementMode==CKEDITOR.ELEMENT_MODE_APPENDTO?"cke_editable_themed":"");this.attachClass("cke_contents_"+
+a.config.contentsLangDirection);a.keystrokeHandler.blockedKeystrokes[8]=+a.readOnly;a.keystrokeHandler.attach(this);this.on("blur",function(a){CKEDITOR.env.opera&&CKEDITOR.document.getActive().equals(this.isInline()?this:this.getWindow().getFrame())?a.cancel():this.hasFocus=false},null,null,-1);this.on("focus",function(){this.hasFocus=true},null,null,-1);a.focusManager.add(this);if(this.equals(CKEDITOR.document.getActive())){this.hasFocus=true;a.once("contentDom",function(){a.focusManager.focus()})}this.isInline()&&
+this.changeAttr("tabindex",a.tabIndex);if(!this.is("textarea")){a.document=this.getDocument();a.window=this.getWindow();var b=a.document;this.changeAttr("spellcheck",!a.config.disableNativeSpellChecker);var e=a.config.contentsLangDirection;this.getDirection(1)!=e&&this.changeAttr("dir",e);var g=CKEDITOR.getCss();if(g){e=b.getHead();if(!e.getCustomData("stylesheet")){g=b.appendStyleText(g);g=new CKEDITOR.dom.element(g.ownerNode||g.owningElement);e.setCustomData("stylesheet",g);g.data("cke-temp",1)}}e=
+b.getCustomData("stylesheet_ref")||0;b.setCustomData("stylesheet_ref",e+1);this.setCustomData("cke_includeReadonly",!a.config.disableReadonlyStyling);this.attachListener(this,"click",function(a){var a=a.data,b=a.getTarget();b.is("a")&&(a.$.button!=2&&b.isReadOnly())&&a.preventDefault()});this.attachListener(a,"key",function(b){if(a.readOnly)return true;var c=b.data.keyCode,g;if(c in{8:1,46:1}){var e=a.getSelection(),b=e.getRanges()[0],f=b.startPath(),l,h,j,c=c==8;if(e=d(e)){a.fire("saveSnapshot");
+b.moveToPosition(e,CKEDITOR.POSITION_BEFORE_START);e.remove();b.select();a.fire("saveSnapshot");g=1}else if(b.collapsed)if((l=f.block)&&b[c?"checkStartOfBlock":"checkEndOfBlock"]()&&(j=l[c?"getPrevious":"getNext"](i))&&j.is("table")){a.fire("saveSnapshot");b[c?"checkEndOfBlock":"checkStartOfBlock"]()&&l.remove();b["moveToElementEdit"+(c?"End":"Start")](j);b.select();a.fire("saveSnapshot");g=1}else if(f.blockLimit&&f.blockLimit.is("td")&&(h=f.blockLimit.getAscendant("table"))&&b.checkBoundaryOfElement(h,
+c?CKEDITOR.START:CKEDITOR.END)&&(j=h[c?"getPrevious":"getNext"](i))){a.fire("saveSnapshot");b["moveToElementEdit"+(c?"End":"Start")](j);b.checkStartOfBlock()&&b.checkEndOfBlock()?j.remove():b.select();a.fire("saveSnapshot");g=1}else if((h=f.contains(["td","th","caption"]))&&b.checkBoundaryOfElement(h,c?CKEDITOR.START:CKEDITOR.END))g=1}return!g});CKEDITOR.env.ie&&this.attachListener(this,"click",c);!CKEDITOR.env.ie&&!CKEDITOR.env.opera&&this.attachListener(this,"mousedown",function(b){var c=b.data.getTarget();
+if(c.is("img","hr","input","textarea","select")){a.getSelection().selectElement(c);c.is("input","textarea","select")&&b.data.preventDefault()}});CKEDITOR.env.gecko&&this.attachListener(this,"mouseup",function(b){if(b.data.$.button==2){b=b.data.getTarget();if(!b.getOuterHtml().replace(j,"")){var c=a.createRange();c.moveToElementEditStart(b);c.select(true)}}});if(CKEDITOR.env.webkit){this.attachListener(this,"click",function(a){a.data.getTarget().is("input","select")&&a.data.preventDefault()});this.attachListener(this,
+"mouseup",function(a){a.data.getTarget().is("input","textarea")&&a.data.preventDefault()})}}}},_:{detach:function(){this.editor.setData(this.editor.getData(),0,1);this.clearListeners();this.restoreAttrs();var a;if(a=this.removeCustomData("classes"))for(;a.length;)this.removeClass(a.pop());a=this.getDocument();var b=a.getHead();if(b.getCustomData("stylesheet")){var c=a.getCustomData("stylesheet_ref");if(--c)a.setCustomData("stylesheet_ref",c);else{a.removeCustomData("stylesheet_ref");b.removeCustomData("stylesheet").remove()}}delete this.editor}}});
+CKEDITOR.editor.prototype.editable=function(a){var b=this._.editable;if(b&&a)return 0;if(arguments.length)b=this._.editable=a?a instanceof CKEDITOR.editable?a:new CKEDITOR.editable(this,a):(b&&b.detach(),null);return b};var j=/(^|<body\b[^>]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:<br[^>]*>|&nbsp;|\u00A0|&#160;)?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi,i=CKEDITOR.dom.walker.whitespaces(true),k=CKEDITOR.dom.walker.bookmark(false,true);CKEDITOR.on("instanceLoaded",function(a){var c=a.editor;c.on("insertElement",
+function(a){a=a.data;if(a.type==CKEDITOR.NODE_ELEMENT&&(a.is("input")||a.is("textarea"))){a.getAttribute("contentEditable")!="false"&&a.data("cke-editable",a.hasAttribute("contenteditable")?"true":"1");a.setAttribute("contentEditable",false)}});c.on("selectionChange",function(a){if(!c.readOnly){var d=c.getSelection();if(d&&!d.isLocked){d=c.checkDirty();c.fire("lockSnapshot");b(a);c.fire("unlockSnapshot");!d&&c.resetDirty()}}})});CKEDITOR.on("instanceCreated",function(a){var b=a.editor;b.on("mode",
+function(){var a=b.editable();if(a&&a.isInline()){var c=b.title;a.changeAttr("role","textbox");a.changeAttr("aria-label",c);c&&a.changeAttr("title",c);if(c=this.ui.space(this.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"top":"contents")){var d=CKEDITOR.tools.getNextId(),e=CKEDITOR.dom.element.createFromHtml('<span id="'+d+'" class="cke_voice_label">'+this.lang.common.editorHelp+"</span>");c.append(e);a.changeAttr("aria-describedby",d)}}})});CKEDITOR.addCss(".cke_editable{cursor:text}.cke_editable img,.cke_editable input,.cke_editable textarea{cursor:default}");
+var m=function(){function b(a){return a.type==CKEDITOR.NODE_ELEMENT}function c(a,d){var g,e,f,h,n=[],l=d.range.startContainer;g=d.range.startPath();for(var l=i[l.getName()],o=0,p=a.getChildren(),j=p.count(),m=-1,k=-1,v=0,F=g.contains(i.$list);o<j;++o){g=p.getItem(o);if(b(g)){f=g.getName();if(F&&f in CKEDITOR.dtd.$list)n=n.concat(c(g,d));else{h=!!l[f];if(f=="br"&&g.data("cke-eol")&&(!o||o==j-1)){v=(e=o?n[o-1].node:p.getItem(o+1))&&(!b(e)||!e.is("br"));e=e&&b(e)&&i.$block[e.getName()]}m==-1&&!h&&(m=
+o);h||(k=o);n.push({isElement:1,isLineBreak:v,isBlock:g.isBlockBoundary(),hasBlockSibling:e,node:g,name:f,allowed:h});e=v=0}}else n.push({isElement:0,node:g,allowed:1})}if(m>-1)n[m].firstNotAllowed=1;if(k>-1)n[k].lastNotAllowed=1;return n}function d(a,c){var g=[],e=a.getChildren(),f=e.count(),h,n=0,o=i[c],p=!a.is(i.$inline)||a.is("br");for(p&&g.push(" ");n<f;n++){h=e.getItem(n);b(h)&&!h.is(o)?g=g.concat(d(h,c)):g.push(h)}p&&g.push(" ");return g}function g(a){return a&&b(a)&&(a.is(i.$removeEmpty)||
+a.is("a")&&!a.isBlockBoundary())}function e(a,c,d,g){var f=a.clone(),h,n;f.setEndAt(c,CKEDITOR.POSITION_BEFORE_END);if((h=(new CKEDITOR.dom.walker(f)).next())&&b(h)&&o[h.getName()]&&(n=h.getPrevious())&&b(n)&&!n.getParent().equals(a.startContainer)&&d.contains(n)&&g.contains(h)&&h.isIdentical(n)){h.moveChildren(n);h.remove();e(a,c,d,g)}}function f(a,c){function d(a,c){if(c.isBlock&&c.isElement&&!c.node.is("br")&&b(a)&&a.is("br")){a.remove();return 1}}var g=c.endContainer.getChild(c.endOffset),e=c.endContainer.getChild(c.endOffset-
+1);g&&d(g,a[a.length-1]);if(e&&d(e,a[0])){c.setEnd(c.endContainer,c.endOffset-1);c.collapse()}}var i=CKEDITOR.dtd,o={p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ul:1,ol:1,li:1,pre:1,dl:1,blockquote:1},j={p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1},m=CKEDITOR.tools.extend({},i.$inline);delete m.br;return function(o,k,z){var t=o.editor;o.getDocument();var C=t.getSelection().getRanges()[0],y=false;if(k=="unfiltered_html"){k="html";y=true}if(!C.checkReadOnly()){var n=(new CKEDITOR.dom.elementPath(C.startContainer,
+C.root)).blockLimit||C.root,k={type:k,dontFilter:y,editable:o,editor:t,range:C,blockLimit:n,mergeCandidates:[],zombies:[]},t=k.range,y=k.mergeCandidates,w,I,G,D;if(k.type=="text"&&t.shrink(CKEDITOR.SHRINK_ELEMENT,true,false)){w=CKEDITOR.dom.element.createFromHtml("<span>&nbsp;</span>",t.document);t.insertNode(w);t.setStartAfter(w)}I=new CKEDITOR.dom.elementPath(t.startContainer);k.endPath=G=new CKEDITOR.dom.elementPath(t.endContainer);if(!t.collapsed){var n=G.block||G.blockLimit,Q=t.getCommonAncestor();
+n&&(!n.equals(Q)&&!n.contains(Q)&&t.checkEndOfBlock())&&k.zombies.push(n);t.deleteContents()}for(;(D=b(t.startContainer)&&t.startContainer.getChild(t.startOffset-1))&&b(D)&&D.isBlockBoundary()&&I.contains(D);)t.moveToPosition(D,CKEDITOR.POSITION_BEFORE_END);e(t,k.blockLimit,I,G);if(w){t.setEndBefore(w);t.collapse();w.remove()}w=t.startPath();if(n=w.contains(g,false,1)){t.splitElement(n);k.inlineStylesRoot=n;k.inlineStylesPeak=w.lastElement}w=t.createBookmark();(n=w.startNode.getPrevious(a))&&b(n)&&
+g(n)&&y.push(n);(n=w.startNode.getNext(a))&&b(n)&&g(n)&&y.push(n);for(n=w.startNode;(n=n.getParent())&&g(n);)y.push(n);t.moveToBookmark(w);if(w=z){w=k.range;if(k.type=="text"&&k.inlineStylesRoot){D=k.inlineStylesPeak;t=D.getDocument().createText("{cke-peak}");for(y=k.inlineStylesRoot.getParent();!D.equals(y);){t=t.appendTo(D.clone());D=D.getParent()}z=t.getOuterHtml().split("{cke-peak}").join(z)}D=k.blockLimit.getName();if(/^\s+|\s+$/.test(z)&&"span"in CKEDITOR.dtd[D])var L='<span data-cke-marker="1">&nbsp;</span>',
+z=L+z+L;z=k.editor.dataProcessor.toHtml(z,null,false,k.dontFilter);D=w.document.createElement("body");D.setHtml(z);if(L){D.getFirst().remove();D.getLast().remove()}if((L=w.startPath().block)&&!(L.getChildCount()==1&&L.getBogus()))a:{var E;if(D.getChildCount()==1&&b(E=D.getFirst())&&E.is(j)){L=E.getElementsByTag("*");w=0;for(y=L.count();w<y;w++){t=L.getItem(w);if(!t.is(m))break a}E.moveChildren(E.getParent(1));E.remove()}}k.dataWrapper=D;w=z}if(w){E=k.range;var L=E.document,B,z=k.blockLimit;w=0;var J;
+D=[];var H,N,y=t=0,K,O;I=E.startContainer;var n=k.endPath.elements[0],P;G=n.getPosition(I);Q=!!n.getCommonAncestor(I)&&G!=CKEDITOR.POSITION_IDENTICAL&&!(G&CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_IS_CONTAINED);I=c(k.dataWrapper,k);for(f(I,E);w<I.length;w++){G=I[w];if(B=G.isLineBreak){B=E;K=z;var M=void 0,R=void 0;if(G.hasBlockSibling)B=1;else{M=B.startContainer.getAscendant(i.$block,1);if(!M||!M.is({div:1,p:1}))B=0;else{R=M.getPosition(K);if(R==CKEDITOR.POSITION_IDENTICAL||R==CKEDITOR.POSITION_CONTAINS)B=
+0;else{K=B.splitElement(M);B.moveToPosition(K,CKEDITOR.POSITION_AFTER_START);B=1}}}}if(B)y=w>0;else{B=E.startPath();if(!G.isBlock&&(N=k.editor.config.enterMode!=CKEDITOR.ENTER_BR&&k.editor.config.autoParagraph!==false?k.editor.config.enterMode==CKEDITOR.ENTER_DIV?"div":"p":false)&&!B.block&&B.blockLimit&&B.blockLimit.equals(E.root)){N=L.createElement(N);!CKEDITOR.env.ie&&N.appendBogus();E.insertNode(N);!CKEDITOR.env.ie&&(J=N.getBogus())&&J.remove();E.moveToPosition(N,CKEDITOR.POSITION_BEFORE_END)}if((B=
+E.startPath().block)&&!B.equals(H)){if(J=B.getBogus()){J.remove();D.push(B)}H=B}G.firstNotAllowed&&(t=1);if(t&&G.isElement){B=E.startContainer;for(K=null;B&&!i[B.getName()][G.name];){if(B.equals(z)){B=null;break}K=B;B=B.getParent()}if(B){if(K){O=E.splitElement(K);k.zombies.push(O);k.zombies.push(K)}}else{K=z.getName();P=!w;B=w==I.length-1;K=d(G.node,K);for(var M=[],R=K.length,T=0,U=void 0,V=0,W=-1;T<R;T++){U=K[T];if(U==" "){if(!V&&(!P||T)){M.push(new CKEDITOR.dom.text(" "));W=M.length}V=1}else{M.push(U);
+V=0}}B&&W==M.length&&M.pop();P=M}}if(P){for(;B=P.pop();)E.insertNode(B);P=0}else E.insertNode(G.node);if(G.lastNotAllowed&&w<I.length-1){(O=Q?n:O)&&E.setEndAt(O,CKEDITOR.POSITION_AFTER_START);t=0}E.collapse()}}k.dontMoveCaret=y;k.bogusNeededBlocks=D}J=k.range;var S;O=k.bogusNeededBlocks;for(P=J.createBookmark();H=k.zombies.pop();)if(H.getParent()){N=J.clone();N.moveToElementEditStart(H);N.removeEmptyBlocksAtEnd()}if(O)for(;H=O.pop();)H.append(CKEDITOR.env.ie?J.document.createText(" "):J.document.createElement("br"));
+for(;H=k.mergeCandidates.pop();)H.mergeSiblings();J.moveToBookmark(P);if(!k.dontMoveCaret){for(H=b(J.startContainer)&&J.startContainer.getChild(J.startOffset-1);H&&b(H)&&!H.is(i.$empty);){if(H.isBlockBoundary())J.moveToPosition(H,CKEDITOR.POSITION_BEFORE_END);else{if(g(H)&&H.getHtml().match(/(\s|&nbsp;)$/g)){S=null;break}S=J.clone();S.moveToPosition(H,CKEDITOR.POSITION_BEFORE_END)}H=H.getLast(a)}S&&J.moveToRange(S)}C.select();h(o)}}}()})();
+(function(){function b(){var a=this.getSelection(1);if(a.getType()!=CKEDITOR.SELECTION_NONE){this.fire("selectionCheck",a);var b=this.elementPath();if(!b.compare(this._.selectionPreviousPath)){this._.selectionPreviousPath=b;this.fire("selectionChange",{selection:a,path:b})}}}function c(){k=true;if(!i){a.call(this);i=CKEDITOR.tools.setTimeout(a,200,this)}}function a(){i=null;if(k){CKEDITOR.tools.setTimeout(b,0,this);k=false}}function f(a){function b(c,d){return!c||c.type==CKEDITOR.NODE_TEXT?false:
+a.clone()["moveToElementEdit"+(d?"End":"Start")](c)}if(!(a.root instanceof CKEDITOR.editable))return false;var c=a.startContainer,d=a.getPreviousNode(m,null,c),e=a.getNextNode(m,null,c);return b(d)||b(e,1)||!d&&!e&&!(c.type==CKEDITOR.NODE_ELEMENT&&c.isBlockBoundary()&&c.getBogus())?true:false}function d(a){return a.getCustomData("cke-fillingChar")}function e(a,b){var c=a&&a.removeCustomData("cke-fillingChar");if(c){if(b!==false){var d,e=a.getDocument().getSelection().getNative(),f=e&&e.type!="None"&&
+e.getRangeAt(0);if(c.getLength()>1&&f&&f.intersectsNode(c.$)){d=[e.anchorOffset,e.focusOffset];f=e.focusNode==c.$&&e.focusOffset>0;e.anchorNode==c.$&&e.anchorOffset>0&&d[0]--;f&&d[1]--;var i;f=e;if(!f.isCollapsed){i=f.getRangeAt(0);i.setStart(f.anchorNode,f.anchorOffset);i.setEnd(f.focusNode,f.focusOffset);i=i.collapsed}i&&d.unshift(d.pop())}}c.setText(h(c.getText()));if(d){c=e.getRangeAt(0);c.setStart(c.startContainer,d[0]);c.setEnd(c.startContainer,d[1]);e.removeAllRanges();e.addRange(c)}}}function h(a){return a.replace(/\u200B( )?/g,
+function(a){return a[1]?" ":""})}function j(a,b,c){var d=a.on("focus",function(a){a.cancel()},null,null,-100);if(CKEDITOR.env.ie)var e=a.getDocument().on("selectionchange",function(a){a.cancel()},null,null,-100);else{var f=new CKEDITOR.dom.range(a);f.moveToElementEditStart(a);var h=a.getDocument().$.createRange();h.setStart(f.startContainer.$,f.startOffset);h.collapse(1);b.removeAllRanges();b.addRange(h)}c&&a.focus();d.removeListener();e&&e.removeListener()}var i,k,m=CKEDITOR.dom.walker.invisible(1);
+CKEDITOR.on("instanceCreated",function(a){function d(){var a=f.getSelection();a&&a.removeAllRanges()}var f=a.editor;f.define("selectionChange",{errorProof:1});f.on("contentDom",function(){var a=f.document,d=CKEDITOR.document,g=f.editable(),h=a.getBody(),l=a.getDocumentElement(),i=g.isInline(),k;CKEDITOR.env.gecko&&g.attachListener(g,"focus",function(a){a.removeListener();if(k!==0){a=f.getSelection().getNative();if(a.isCollapsed&&a.anchorNode==g.$){a=f.createRange();a.moveToElementEditStart(g);a.select()}}},
+null,null,-2);g.attachListener(g,"focus",function(){f.unlockSelection(k);k=0},null,null,-1);g.attachListener(g,"mousedown",function(){k=0});if(CKEDITOR.env.ie||CKEDITOR.env.opera||i){var j,m=function(){j=f.getSelection(1);j.lock()};q?g.attachListener(g,"beforedeactivate",m,null,null,-1):g.attachListener(f,"selectionCheck",m,null,null,-1);g.attachListener(g,"blur",function(){f.lockSelection(j);k=1},null,null,-1)}if(CKEDITOR.env.ie&&!i){var r;g.attachListener(g,"mousedown",function(a){a.data.$.button==
+2&&f.document.$.selection.type=="None"&&(r=f.window.getScrollPosition())});g.attachListener(g,"mouseup",function(a){if(a.data.$.button==2&&r){f.document.$.documentElement.scrollLeft=r.x;f.document.$.documentElement.scrollTop=r.y}r=null});if(a.$.compatMode!="BackCompat"){if(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)l.on("mousedown",function(a){function b(a){a=a.data.$;if(g){var c=h.$.createTextRange();try{c.moveToPoint(a.x,a.y)}catch(d){}g.setEndPoint(f.compareEndPoints("StartToStart",c)<0?"EndToEnd":
+"StartToStart",c);g.select()}}function c(){l.removeListener("mousemove",b);d.removeListener("mouseup",c);l.removeListener("mouseup",c);g.select()}a=a.data;if(a.getTarget().is("html")&&a.$.y<l.$.clientHeight&&a.$.x<l.$.clientWidth){var g=h.$.createTextRange();try{g.moveToPoint(a.$.x,a.$.y)}catch(e){}var f=g.duplicate();l.on("mousemove",b);d.on("mouseup",c);l.on("mouseup",c)}});if(CKEDITOR.env.version>7){l.on("mousedown",function(a){if(a.data.getTarget().is("html")){d.on("mouseup",y);l.on("mouseup",
+y)}});var y=function(){d.removeListener("mouseup",y);l.removeListener("mouseup",y);var b=CKEDITOR.document.$.selection,c=b.createRange();b.type!="None"&&c.parentElement().ownerDocument==a.$&&c.select()}}}}g.attachListener(g,"selectionchange",b,f);g.attachListener(g,"keyup",c,f);g.attachListener(g,"focus",function(){f.forceNextSelectionCheck();f.selectionChange(1)});if(i?CKEDITOR.env.webkit||CKEDITOR.env.gecko:CKEDITOR.env.opera){var n;g.attachListener(g,"mousedown",function(){n=1});g.attachListener(a.getDocumentElement(),
+"mouseup",function(){n&&c.call(f);n=0})}else g.attachListener(CKEDITOR.env.ie?g:a.getDocumentElement(),"mouseup",c,f);CKEDITOR.env.webkit&&g.attachListener(a,"keydown",function(a){switch(a.data.getKey()){case 13:case 33:case 34:case 35:case 36:case 37:case 39:case 8:case 45:case 46:e(g)}},null,null,-1)});f.on("contentDomUnload",f.forceNextSelectionCheck,f);f.on("dataReady",function(){f.selectionChange(1)});CKEDITOR.env.ie9Compat&&f.on("beforeDestroy",d,null,null,9);CKEDITOR.env.webkit&&f.on("setData",
+d);f.on("contentDomUnload",function(){f.unlockSelection()})});CKEDITOR.on("instanceReady",function(a){var b=a.editor;if(CKEDITOR.env.webkit){b.on("selectionChange",function(){var a=b.editable(),c=d(a);c&&(c.getCustomData("ready")?e(a):c.setCustomData("ready",1))},null,null,-1);b.on("beforeSetMode",function(){e(b.editable())},null,null,-1);var c,f,a=function(){var a=b.editable();if(a)if(a=d(a)){var e=b.document.$.defaultView.getSelection();e.type=="Caret"&&e.anchorNode==a.$&&(f=1);c=a.getText();a.setText(h(c))}},
+i=function(){var a=b.editable();if(a)if(a=d(a)){a.setText(c);if(f){b.document.$.defaultView.getSelection().setPosition(a.$,a.getLength());f=0}}};b.on("beforeUndoImage",a);b.on("afterUndoImage",i);b.on("beforeGetData",a,null,null,0);b.on("getData",i)}});CKEDITOR.editor.prototype.selectionChange=function(a){(a?b:c).call(this)};CKEDITOR.editor.prototype.getSelection=function(a){if(this._.savedSelection&&!a)return this._.savedSelection;return(a=this.editable())?new CKEDITOR.dom.selection(a):null};CKEDITOR.editor.prototype.lockSelection=
+function(a){a=a||this.getSelection(1);if(a.getType()!=CKEDITOR.SELECTION_NONE){!a.isLocked&&a.lock();this._.savedSelection=a;return true}return false};CKEDITOR.editor.prototype.unlockSelection=function(a){var b=this._.savedSelection;if(b){b.unlock(a);delete this._.savedSelection;return true}return false};CKEDITOR.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath};CKEDITOR.dom.document.prototype.getSelection=function(){return new CKEDITOR.dom.selection(this)};
+CKEDITOR.dom.range.prototype.select=function(){var a=this.root instanceof CKEDITOR.editable?this.root.editor.getSelection():new CKEDITOR.dom.selection(this.root);a.selectRanges([this]);return a};CKEDITOR.SELECTION_NONE=1;CKEDITOR.SELECTION_TEXT=2;CKEDITOR.SELECTION_ELEMENT=3;var q=typeof window.getSelection!="function";CKEDITOR.dom.selection=function(a){var b=a instanceof CKEDITOR.dom.element;this.document=a instanceof CKEDITOR.dom.document?a:a.getDocument();this.root=a=b?a:this.document.getBody();
+this.isLocked=0;this._={cache:{}};b=q?this.document.$.selection:this.document.getWindow().$.getSelection();if(CKEDITOR.env.webkit)(b.type=="None"&&this.document.getActive().equals(a)||b.type=="Caret"&&b.anchorNode.nodeType==CKEDITOR.NODE_DOCUMENT)&&j(a,b);else if(CKEDITOR.env.gecko)b&&(this.document.getActive().equals(a)&&b.anchorNode&&b.anchorNode.nodeType==CKEDITOR.NODE_DOCUMENT)&&j(a,b,true);else if(CKEDITOR.env.ie){var c;try{c=this.document.getActive()}catch(d){}if(q)b.type=="None"&&(c&&c.equals(this.document.getDocumentElement()))&&
+j(a,null,true);else{(b=b&&b.anchorNode)&&(b=new CKEDITOR.dom.node(b));c&&(c.equals(this.document.getDocumentElement())&&b&&(a.equals(b)||a.contains(b)))&&j(a,null,true)}}c=this.getNative();var e,f;if(c)if(c.getRangeAt)e=(f=c.rangeCount&&c.getRangeAt(0))&&new CKEDITOR.dom.node(f.commonAncestorContainer);else{try{f=c.createRange()}catch(h){}e=f&&CKEDITOR.dom.element.get(f.item&&f.item(0)||f.parentElement())}if(!e||!a.equals(e)&&!a.contains(e)){this._.cache.type=CKEDITOR.SELECTION_NONE;this._.cache.startElement=
+null;this._.cache.selectedElement=null;this._.cache.selectedText="";this._.cache.ranges=new CKEDITOR.dom.rangeList}return this};var r={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1};CKEDITOR.dom.selection.prototype={getNative:function(){return this._.cache.nativeSel!==void 0?this._.cache.nativeSel:this._.cache.nativeSel=q?this.document.$.selection:this.document.getWindow().$.getSelection()},getType:q?function(){var a=
+this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_NONE;try{var c=this.getNative(),d=c.type;if(d=="Text")b=CKEDITOR.SELECTION_TEXT;if(d=="Control")b=CKEDITOR.SELECTION_ELEMENT;if(c.createRange().parentElement())b=CKEDITOR.SELECTION_TEXT}catch(e){}return a.type=b}:function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_TEXT,c=this.getNative();if(!c||!c.rangeCount)b=CKEDITOR.SELECTION_NONE;else if(c.rangeCount==1){var c=c.getRangeAt(0),d=c.startContainer;if(d==c.endContainer&&
+d.nodeType==1&&c.endOffset-c.startOffset==1&&r[d.childNodes[c.startOffset].nodeName.toLowerCase()])b=CKEDITOR.SELECTION_ELEMENT}return a.type=b},getRanges:function(){var a=q?function(){function a(b){return(new CKEDITOR.dom.node(b)).getIndex()}var b=function(b,c){b=b.duplicate();b.collapse(c);var d=b.parentElement(),e=d.ownerDocument;if(!d.hasChildNodes())return{container:d,offset:0};for(var f=d.children,h,i,l=b.duplicate(),k=0,j=f.length-1,m=-1,n,p;k<=j;){m=Math.floor((k+j)/2);h=f[m];l.moveToElementText(h);
+n=l.compareEndPoints("StartToStart",b);if(n>0)j=m-1;else if(n<0)k=m+1;else{if(CKEDITOR.env.ie9Compat&&h.tagName=="BR"){f=e.defaultView.getSelection();return{container:f[c?"anchorNode":"focusNode"],offset:f[c?"anchorOffset":"focusOffset"]}}return{container:d,offset:a(h)}}}if(m==-1||m==f.length-1&&n<0){l.moveToElementText(d);l.setEndPoint("StartToStart",b);e=l.text.replace(/(\r\n|\r)/g,"\n").length;f=d.childNodes;if(!e){h=f[f.length-1];return h.nodeType!=CKEDITOR.NODE_TEXT?{container:d,offset:f.length}:
+{container:h,offset:h.nodeValue.length}}for(d=f.length;e>0&&d>0;){i=f[--d];if(i.nodeType==CKEDITOR.NODE_TEXT){p=i;e=e-i.nodeValue.length}}return{container:p,offset:-e}}l.collapse(n>0?true:false);l.setEndPoint(n>0?"StartToStart":"EndToStart",b);e=l.text.replace(/(\r\n|\r)/g,"\n").length;if(!e)return{container:d,offset:a(h)+(n>0?0:1)};for(;e>0;)try{i=h[n>0?"previousSibling":"nextSibling"];if(i.nodeType==CKEDITOR.NODE_TEXT){e=e-i.nodeValue.length;p=i}h=i}catch(I){return{container:d,offset:a(h)}}return{container:p,
+offset:n>0?-e:p.nodeValue.length+e}};return function(){var a=this.getNative(),c=a&&a.createRange(),d=this.getType();if(!a)return[];if(d==CKEDITOR.SELECTION_TEXT){a=new CKEDITOR.dom.range(this.root);d=b(c,true);a.setStart(new CKEDITOR.dom.node(d.container),d.offset);d=b(c);a.setEnd(new CKEDITOR.dom.node(d.container),d.offset);a.endContainer.getPosition(a.startContainer)&CKEDITOR.POSITION_PRECEDING&&a.endOffset<=a.startContainer.getIndex()&&a.collapse();return[a]}if(d==CKEDITOR.SELECTION_ELEMENT){for(var d=
+[],e=0;e<c.length;e++){for(var f=c.item(e),g=f.parentNode,h=0,a=new CKEDITOR.dom.range(this.root);h<g.childNodes.length&&g.childNodes[h]!=f;h++);a.setStart(new CKEDITOR.dom.node(g),h);a.setEnd(new CKEDITOR.dom.node(g),h+1);d.push(a)}return d}return[]}}():function(){var a=[],b,c=this.getNative();if(!c)return a;for(var d=0;d<c.rangeCount;d++){var e=c.getRangeAt(d);b=new CKEDITOR.dom.range(this.root);b.setStart(new CKEDITOR.dom.node(e.startContainer),e.startOffset);b.setEnd(new CKEDITOR.dom.node(e.endContainer),
+e.endOffset);a.push(b)}return a};return function(b){var c=this._.cache;if(c.ranges&&!b)return c.ranges;if(!c.ranges)c.ranges=new CKEDITOR.dom.rangeList(a.call(this));if(b)for(var d=c.ranges,e=0;e<d.length;e++){var f=d[e];f.getCommonAncestor().isReadOnly()&&d.splice(e,1);if(!f.collapsed){if(f.startContainer.isReadOnly())for(var b=f.startContainer,h;b;){if((h=b.type==CKEDITOR.NODE_ELEMENT)&&b.is("body")||!b.isReadOnly())break;h&&b.getAttribute("contentEditable")=="false"&&f.setStartAfter(b);b=b.getParent()}b=
+f.startContainer;h=f.endContainer;var i=f.startOffset,k=f.endOffset,j=f.clone();b&&b.type==CKEDITOR.NODE_TEXT&&(i>=b.getLength()?j.setStartAfter(b):j.setStartBefore(b));h&&h.type==CKEDITOR.NODE_TEXT&&(k?j.setEndAfter(h):j.setEndBefore(h));b=new CKEDITOR.dom.walker(j);b.evaluator=function(a){if(a.type==CKEDITOR.NODE_ELEMENT&&a.isReadOnly()){var b=f.clone();f.setEndBefore(a);f.collapsed&&d.splice(e--,1);if(!(a.getPosition(j.endContainer)&CKEDITOR.POSITION_CONTAINS)){b.setStartAfter(a);b.collapsed||
+d.splice(e+1,0,b)}return true}return false};b.next()}}return c.ranges}}(),getStartElement:function(){var a=this._.cache;if(a.startElement!==void 0)return a.startElement;var b;switch(this.getType()){case CKEDITOR.SELECTION_ELEMENT:return this.getSelectedElement();case CKEDITOR.SELECTION_TEXT:var c=this.getRanges()[0];if(c){if(c.collapsed){b=c.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent())}else{for(c.optimize();;){b=c.startContainer;if(c.startOffset==(b.getChildCount?b.getChildCount():
+b.getLength())&&!b.isBlockBoundary())c.setStartAfter(b);else break}b=c.startContainer;if(b.type!=CKEDITOR.NODE_ELEMENT)return b.getParent();b=b.getChild(c.startOffset);if(!b||b.type!=CKEDITOR.NODE_ELEMENT)b=c.startContainer;else for(c=b.getFirst();c&&c.type==CKEDITOR.NODE_ELEMENT;){b=c;c=c.getFirst()}}b=b.$}}return a.startElement=b?new CKEDITOR.dom.element(b):null},getSelectedElement:function(){var a=this._.cache;if(a.selectedElement!==void 0)return a.selectedElement;var b=this,c=CKEDITOR.tools.tryThese(function(){return b.getNative().createRange().item(0)},
+function(){for(var a=b.getRanges()[0],c,d,e=2;e&&(!(c=a.getEnclosedNode())||!(c.type==CKEDITOR.NODE_ELEMENT&&r[c.getName()]&&(d=c)));e--)a.shrink(CKEDITOR.SHRINK_ELEMENT);return d.$});return a.selectedElement=c?new CKEDITOR.dom.element(c):null},getSelectedText:function(){var a=this._.cache;if(a.selectedText!==void 0)return a.selectedText;var b=this.getNative(),b=q?b.type=="Control"?"":b.createRange().text:b.toString();return a.selectedText=b},lock:function(){this.getRanges();this.getStartElement();
+this.getSelectedElement();this.getSelectedText();this._.cache.nativeSel=null;this.isLocked=1},unlock:function(a){if(this.isLocked){if(a)var b=this.getSelectedElement(),c=!b&&this.getRanges();this.isLocked=0;this.reset();if(a)(a=b||c[0]&&c[0].getCommonAncestor())&&a.getAscendant("body",1)&&(b?this.selectElement(b):this.selectRanges(c))}},reset:function(){this._.cache={}},selectElement:function(a){var b=new CKEDITOR.dom.range(this.root);b.setStartBefore(a);b.setEndAfter(a);this.selectRanges([b])},selectRanges:function(a){if(a.length)if(this.isLocked){var b=
+CKEDITOR.document.getActive();this.unlock();this.selectRanges(a);this.lock();!b.equals(this.root)&&b.focus()}else{if(q){var c=CKEDITOR.dom.walker.whitespaces(true),d=/\ufeff|\u00a0/,h={table:1,tbody:1,tr:1};if(a.length>1){b=a[a.length-1];a[0].setEnd(b.endContainer,b.endOffset)}var b=a[0],a=b.collapsed,i,k,j,m=b.getEnclosedNode();if(m&&m.type==CKEDITOR.NODE_ELEMENT&&m.getName()in r&&(!m.is("a")||!m.getText()))try{j=m.$.createControlRange();j.addElement(m.$);j.select();return}catch(x){}(b.startContainer.type==
+CKEDITOR.NODE_ELEMENT&&b.startContainer.getName()in h||b.endContainer.type==CKEDITOR.NODE_ELEMENT&&b.endContainer.getName()in h)&&b.shrink(CKEDITOR.NODE_ELEMENT,true);j=b.createBookmark();var h=j.startNode,z;if(!a)z=j.endNode;j=b.document.$.body.createTextRange();j.moveToElementText(h.$);j.moveStart("character",1);if(z){d=b.document.$.body.createTextRange();d.moveToElementText(z.$);j.setEndPoint("EndToEnd",d);j.moveEnd("character",-1)}else{i=h.getNext(c);k=h.hasAscendant("pre");i=!(i&&i.getText&&
+i.getText().match(d))&&(k||!h.hasPrevious()||h.getPrevious().is&&h.getPrevious().is("br"));k=b.document.createElement("span");k.setHtml("&#65279;");k.insertBefore(h);i&&b.document.createText("﻿").insertBefore(h)}b.setStartBefore(h);h.remove();if(a){if(i){j.moveStart("character",-1);j.select();b.document.$.selection.clear()}else j.select();b.moveToPosition(k,CKEDITOR.POSITION_BEFORE_START);k.remove()}else{b.setEndBefore(z);z.remove();j.select()}}else{z=this.getNative();if(!z)return;if(CKEDITOR.env.opera){b=
+this.document.$.createRange();b.selectNodeContents(this.root.$);z.addRange(b)}this.removeAllRanges();for(d=0;d<a.length;d++){if(d<a.length-1){b=a[d];j=a[d+1];k=b.clone();k.setStart(b.endContainer,b.endOffset);k.setEnd(j.startContainer,j.startOffset);if(!k.collapsed){k.shrink(CKEDITOR.NODE_ELEMENT,true);i=k.getCommonAncestor();k=k.getEnclosedNode();if(i.isReadOnly()||k&&k.isReadOnly()){j.setStart(b.startContainer,b.startOffset);a.splice(d--,1);continue}}}b=a[d];j=this.document.$.createRange();i=b.startContainer;
+if(CKEDITOR.env.opera&&b.collapsed&&i.type==CKEDITOR.NODE_ELEMENT){k=i.getChild(b.startOffset-1);c=i.getChild(b.startOffset);if(!k&&!c&&i.is(CKEDITOR.dtd.$removeEmpty)||k&&k.type==CKEDITOR.NODE_ELEMENT||c&&c.type==CKEDITOR.NODE_ELEMENT){b.insertNode(this.document.createText(""));b.collapse(1)}}if(b.collapsed&&CKEDITOR.env.webkit&&f(b)){i=this.root;e(i,false);k=i.getDocument().createText("​");i.setCustomData("cke-fillingChar",k);b.insertNode(k);if((i=k.getNext())&&!k.getPrevious()&&i.type==CKEDITOR.NODE_ELEMENT&&
+i.getName()=="br"){e(this.root);b.moveToPosition(i,CKEDITOR.POSITION_BEFORE_START)}else b.moveToPosition(k,CKEDITOR.POSITION_AFTER_END)}j.setStart(b.startContainer.$,b.startOffset);try{j.setEnd(b.endContainer.$,b.endOffset)}catch(t){if(t.toString().indexOf("NS_ERROR_ILLEGAL_VALUE")>=0){b.collapse(1);j.setEnd(b.endContainer.$,b.endOffset)}else throw t;}z.addRange(j)}}this.reset();this.root.fire("selectionchange")}},createBookmarks:function(a){return this.getRanges().createBookmarks(a)},createBookmarks2:function(a){return this.getRanges().createBookmarks2(a)},
+selectBookmarks:function(a){for(var b=[],c=0;c<a.length;c++){var d=new CKEDITOR.dom.range(this.root);d.moveToBookmark(a[c]);b.push(d)}this.selectRanges(b);return this},getCommonAncestor:function(){var a=this.getRanges();return a[0].startContainer.getCommonAncestor(a[a.length-1].endContainer)},scrollIntoView:function(){this.type!=CKEDITOR.SELECTION_NONE&&this.getRanges()[0].scrollIntoView()},removeAllRanges:function(){var a=this.getNative();try{a&&a[q?"empty":"removeAllRanges"]()}catch(b){}this.reset()}}})();
+CKEDITOR.editor.prototype.attachStyleStateChange=function(b,c){var a=this._.styleStateChangeCallbacks;if(!a){a=this._.styleStateChangeCallbacks=[];this.on("selectionChange",function(b){for(var c=0;c<a.length;c++){var e=a[c],h=e.style.checkActive(b.data.path)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF;e.fn.call(this,h)}})}a.push({style:b,fn:c})};CKEDITOR.STYLE_BLOCK=1;CKEDITOR.STYLE_INLINE=2;CKEDITOR.STYLE_OBJECT=3;
+(function(){function b(a,b){for(var c,d;a=a.getParent();){if(a.equals(b))break;if(a.getAttribute("data-nostyle"))c=a;else if(!d){var e=a.getAttribute("contentEditable");e=="false"?c=a:e=="true"&&(d=1)}}return c}function c(a){var c=a.document;if(a.collapsed){c=p(this,c);a.insertNode(c);a.moveToPosition(c,CKEDITOR.POSITION_BEFORE_END)}else{var d=this.element,e=this._.definition,f,g=e.ignoreReadonly,h=g||e.includeReadonly;h==void 0&&(h=a.root.getCustomData("cke_includeReadonly"));var i=CKEDITOR.dtd[d]||
+(f=true,CKEDITOR.dtd.span);a.enlarge(CKEDITOR.ENLARGE_INLINE,1);a.trim();var k=a.createBookmark(),j=k.startNode,l=k.endNode,m=j,q;if(!g){var o=a.getCommonAncestor(),g=b(j,o),o=b(l,o);g&&(m=g.getNextSourceNode(true));o&&(l=o)}for(m.getPosition(l)==CKEDITOR.POSITION_FOLLOWING&&(m=0);m;){g=false;if(m.equals(l)){m=null;g=true}else{var s=m.type,t=s==CKEDITOR.NODE_ELEMENT?m.getName():null,o=t&&m.getAttribute("contentEditable")=="false",u=t&&m.getAttribute("data-nostyle");if(t&&m.data("cke-bookmark")){m=
+m.getNextSourceNode(true);continue}if(!t||i[t]&&!u&&(!o||h)&&(m.getPosition(l)|CKEDITOR.POSITION_PRECEDING|CKEDITOR.POSITION_IDENTICAL|CKEDITOR.POSITION_IS_CONTAINED)==CKEDITOR.POSITION_PRECEDING+CKEDITOR.POSITION_IDENTICAL+CKEDITOR.POSITION_IS_CONTAINED&&(!e.childRule||e.childRule(m))){var v=m.getParent();if(v&&((v.getDtd()||CKEDITOR.dtd.span)[d]||f)&&(!e.parentRule||e.parentRule(v))){if(!q&&(!t||!CKEDITOR.dtd.$removeEmpty[t]||(m.getPosition(l)|CKEDITOR.POSITION_PRECEDING|CKEDITOR.POSITION_IDENTICAL|
+CKEDITOR.POSITION_IS_CONTAINED)==CKEDITOR.POSITION_PRECEDING+CKEDITOR.POSITION_IDENTICAL+CKEDITOR.POSITION_IS_CONTAINED)){q=a.clone();q.setStartBefore(m)}if(s==CKEDITOR.NODE_TEXT||o||s==CKEDITOR.NODE_ELEMENT&&!m.getChildCount()){for(var s=m,x;(g=!s.getNext(C))&&(x=s.getParent(),i[x.getName()])&&(x.getPosition(j)|CKEDITOR.POSITION_FOLLOWING|CKEDITOR.POSITION_IDENTICAL|CKEDITOR.POSITION_IS_CONTAINED)==CKEDITOR.POSITION_FOLLOWING+CKEDITOR.POSITION_IDENTICAL+CKEDITOR.POSITION_IS_CONTAINED&&(!e.childRule||
+e.childRule(x));)s=x;q.setEndAfter(s)}}else g=true}else g=true;m=m.getNextSourceNode(u||o&&!h)}if(g&&q&&!q.collapsed){for(var g=p(this,c),o=g.hasAttributes(),u=q.getCommonAncestor(),s={},t={},v={},z={},y,A,F;g&&u;){if(u.getName()==d){for(y in e.attributes)if(!z[y]&&(F=u.getAttribute(A)))g.getAttribute(y)==F?t[y]=1:z[y]=1;for(A in e.styles)if(!v[A]&&(F=u.getStyle(A)))g.getStyle(A)==F?s[A]=1:v[A]=1}u=u.getParent()}for(y in t)g.removeAttribute(y);for(A in s)g.removeStyle(A);o&&!g.hasAttributes()&&(g=
+null);if(g){q.extractContents().appendTo(g);r.call(this,g);q.insertNode(g);g.mergeSiblings();CKEDITOR.env.ie||g.$.normalize()}else{g=new CKEDITOR.dom.element("span");q.extractContents().appendTo(g);q.insertNode(g);r.call(this,g);g.remove(true)}q=null}}a.moveToBookmark(k);a.shrink(CKEDITOR.SHRINK_TEXT)}}function a(a){a.enlarge(CKEDITOR.ENLARGE_INLINE,1);var b=a.createBookmark(),c=b.startNode;if(a.collapsed){for(var d=new CKEDITOR.dom.elementPath(c.getParent(),a.root),e,f=0,g;f<d.elements.length&&(g=
+d.elements[f]);f++){if(g==d.block||g==d.blockLimit)break;if(this.checkElementRemovable(g)){var h;if(a.collapsed&&(a.checkBoundaryOfElement(g,CKEDITOR.END)||(h=a.checkBoundaryOfElement(g,CKEDITOR.START)))){e=g;e.match=h?"start":"end"}else{g.mergeSiblings();g.getName()==this.element?q.call(this,g):l(g,o(this)[g.getName()])}}}if(e){g=c;for(f=0;;f++){h=d.elements[f];if(h.equals(e))break;else if(h.match)continue;else h=h.clone();h.append(g);g=h}g[e.match=="start"?"insertBefore":"insertAfter"](e)}}else{var i=
+b.endNode,k=this,d=function(){for(var a=new CKEDITOR.dom.elementPath(c.getParent()),b=new CKEDITOR.dom.elementPath(i.getParent()),d=null,e=null,f=0;f<a.elements.length;f++){var g=a.elements[f];if(g==a.block||g==a.blockLimit)break;k.checkElementRemovable(g)&&(d=g)}for(f=0;f<b.elements.length;f++){g=b.elements[f];if(g==b.block||g==b.blockLimit)break;k.checkElementRemovable(g)&&(e=g)}e&&i.breakParent(e);d&&c.breakParent(d)};d();for(e=c;!e.equals(i);){f=e.getNextSourceNode();if(e.type==CKEDITOR.NODE_ELEMENT&&
+this.checkElementRemovable(e)){e.getName()==this.element?q.call(this,e):l(e,o(this)[e.getName()]);if(f.type==CKEDITOR.NODE_ELEMENT&&f.contains(c)){d();f=c.getNext()}}e=f}}a.moveToBookmark(b)}function f(a){var b=a.getEnclosedNode()||a.getCommonAncestor(false,true);(a=(new CKEDITOR.dom.elementPath(b,a.root)).contains(this.element,1))&&!a.isReadOnly()&&v(a,this)}function d(a){var b=a.getCommonAncestor(true,true);if(a=(new CKEDITOR.dom.elementPath(b,a.root)).contains(this.element,1)){var b=this._.definition,
+c=b.attributes;if(c)for(var d in c)a.removeAttribute(d,c[d]);if(b.styles)for(var e in b.styles)b.styles.hasOwnProperty(e)&&a.removeStyle(e)}}function e(a){var b=a.createBookmark(true),c=a.createIterator();c.enforceRealBlocks=true;if(this._.enterMode)c.enlargeBr=this._.enterMode!=CKEDITOR.ENTER_BR;for(var d,e=a.document;d=c.getNextParagraph();)if(!d.isReadOnly()){var f=p(this,e,d);j(d,f)}a.moveToBookmark(b)}function h(a){var b=a.createBookmark(1),c=a.createIterator();c.enforceRealBlocks=true;c.enlargeBr=
+this._.enterMode!=CKEDITOR.ENTER_BR;for(var d;d=c.getNextParagraph();)if(this.checkElementRemovable(d))if(d.is("pre")){var e=this._.enterMode==CKEDITOR.ENTER_BR?null:a.document.createElement(this._.enterMode==CKEDITOR.ENTER_P?"p":"div");e&&d.copyAttributes(e);j(d,e)}else q.call(this,d);a.moveToBookmark(b)}function j(a,b){var c=!b;if(c){b=a.getDocument().createElement("div");a.copyAttributes(b)}var d=b&&b.is("pre"),e=a.is("pre"),f=!d&&e;if(d&&!e){e=b;(f=a.getBogus())&&f.remove();f=a.getHtml();f=k(f,
+/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,"");f=f.replace(/[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi,"$1");f=f.replace(/([ \t\n\r]+|&nbsp;)/g," ");f=f.replace(/<br\b[^>]*>/gi,"\n");if(CKEDITOR.env.ie){var h=a.getDocument().createElement("div");h.append(e);e.$.outerHTML="<pre>"+f+"</pre>";e.copyAttributes(h.getFirst());e=h.getFirst().remove()}else e.setHtml(f);b=e}else f?b=m(c?[a.getHtml()]:i(a),b):a.moveChildren(b);b.replace(a);if(d){var c=b,j;if((j=c.getPrevious(y))&&j.is&&j.is("pre")){d=k(j.getHtml(),/\n$/,"")+
+"\n\n"+k(c.getHtml(),/^\n/,"");CKEDITOR.env.ie?c.$.outerHTML="<pre>"+d+"</pre>":c.setHtml(d);j.remove()}}else c&&g(b)}function i(a){a.getName();var b=[];k(a.getOuterHtml(),/(\S\s*)\n(?:\s|(<span[^>]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,function(a,b,c){return b+"</pre>"+c+"<pre>"}).replace(/<pre\b.*?>([\s\S]*?)<\/pre>/gi,function(a,c){b.push(c)});return b}function k(a,b,c){var d="",e="",a=a.replace(/(^<span[^>]+data-cke-bookmark.*?\/span>)|(<span[^>]+data-cke-bookmark.*?\/span>$)/gi,function(a,
+b,c){b&&(d=b);c&&(e=c);return""});return d+a.replace(b,c)+e}function m(a,b){var c;a.length>1&&(c=new CKEDITOR.dom.documentFragment(b.getDocument()));for(var d=0;d<a.length;d++){var e=a[d],e=e.replace(/(\r\n|\r)/g,"\n"),e=k(e,/^[ \t]*\n/,""),e=k(e,/\n$/,""),e=k(e,/^[ \t]+|[ \t]+$/g,function(a,b){return a.length==1?"&nbsp;":b?" "+CKEDITOR.tools.repeat("&nbsp;",a.length-1):CKEDITOR.tools.repeat("&nbsp;",a.length-1)+" "}),e=e.replace(/\n/g,"<br>"),e=e.replace(/[ \t]{2,}/g,function(a){return CKEDITOR.tools.repeat("&nbsp;",
+a.length-1)+" "});if(c){var f=b.clone();f.setHtml(e);c.append(f)}else b.setHtml(e)}return c||b}function q(a){var b=this._.definition,c=b.attributes,b=b.styles,d=o(this)[a.getName()],e=CKEDITOR.tools.isEmpty(c)&&CKEDITOR.tools.isEmpty(b),f;for(f in c)if(!((f=="class"||this._.definition.fullMatch)&&a.getAttribute(f)!=F(f,c[f]))){e=a.hasAttribute(f);a.removeAttribute(f)}for(var h in b)if(!(this._.definition.fullMatch&&a.getStyle(h)!=F(h,b[h],true))){e=e||!!a.getStyle(h);a.removeStyle(h)}l(a,d,s[a.getName()]);
+e&&(this._.definition.alwaysRemoveElement?g(a,1):!CKEDITOR.dtd.$block[a.getName()]||this._.enterMode==CKEDITOR.ENTER_BR&&!a.hasAttributes()?g(a):a.renameNode(this._.enterMode==CKEDITOR.ENTER_P?"p":"div"))}function r(a){for(var b=o(this),c=a.getElementsByTag(this.element),d=c.count();--d>=0;)q.call(this,c.getItem(d));for(var e in b)if(e!=this.element){c=a.getElementsByTag(e);for(d=c.count()-1;d>=0;d--){var f=c.getItem(d);l(f,b[e])}}}function l(a,b,c){if(b=b&&b.attributes)for(var d=0;d<b.length;d++){var e=
+b[d][0],f;if(f=a.getAttribute(e)){var h=b[d][1];(h===null||h.test&&h.test(f)||typeof h=="string"&&f==h)&&a.removeAttribute(e)}}c||g(a)}function g(a,b){if(!a.hasAttributes()||b)if(CKEDITOR.dtd.$block[a.getName()]){var c=a.getPrevious(y),d=a.getNext(y);c&&(c.type==CKEDITOR.NODE_TEXT||!c.isBlockBoundary({br:1}))&&a.append("br",1);d&&(d.type==CKEDITOR.NODE_TEXT||!d.isBlockBoundary({br:1}))&&a.append("br");a.remove(true)}else{c=a.getFirst();d=a.getLast();a.remove(true);if(c){c.type==CKEDITOR.NODE_ELEMENT&&
+c.mergeSiblings();d&&(!c.equals(d)&&d.type==CKEDITOR.NODE_ELEMENT)&&d.mergeSiblings()}}}function p(a,b,c){var d;d=a.element;d=="*"&&(d="span");d=new CKEDITOR.dom.element(d,b);c&&c.copyAttributes(d);d=v(d,a);b.getCustomData("doc_processing_style")&&d.hasAttribute("id")?d.removeAttribute("id"):b.setCustomData("doc_processing_style",1);return d}function v(a,b){var c=b._.definition,d=c.attributes,c=CKEDITOR.style.getStyleText(c);if(d)for(var e in d)a.setAttribute(e,d[e]);c&&a.setAttribute("style",c);
+return a}function u(a,b){for(var c in a)a[c]=a[c].replace(t,function(a,c){return b[c]})}function o(a){if(a._.overrides)return a._.overrides;var b=a._.overrides={},c=a._.definition.overrides;if(c){CKEDITOR.tools.isArray(c)||(c=[c]);for(var d=0;d<c.length;d++){var e=c[d],f,g;if(typeof e=="string")f=e.toLowerCase();else{f=e.element?e.element.toLowerCase():a.element;g=e.attributes}e=b[f]||(b[f]={});if(g){var e=e.attributes=e.attributes||[],h;for(h in g)e.push([h.toLowerCase(),g[h]])}}}return b}function F(a,
+b,c){var d=new CKEDITOR.dom.element("span");d[c?"setStyle":"setAttribute"](a,b);return d[c?"getStyle":"getAttribute"](a)}function A(a,b){for(var c=a.document,d=a.getRanges(),e=b?this.removeFromRange:this.applyToRange,f,g=d.createIterator();f=g.getNextRange();)e.call(this,f);a.selectRanges(d);c.removeCustomData("doc_processing_style")}var s={address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,time:1,meter:1,menu:1,command:1,
+keygen:1,output:1,progress:1,details:1,datagrid:1,datalist:1},x={a:1,embed:1,hr:1,img:1,li:1,object:1,ol:1,table:1,td:1,tr:1,th:1,ul:1,dl:1,dt:1,dd:1,form:1,audio:1,video:1},z=/\s*(?:;\s*|$)/,t=/#\((.+?)\)/g,C=CKEDITOR.dom.walker.bookmark(0,1),y=CKEDITOR.dom.walker.whitespaces(1);CKEDITOR.style=function(a,b){var c=a.attributes;if(c&&c.style){a.styles=CKEDITOR.tools.extend({},a.styles,CKEDITOR.tools.parseCssText(c.style));delete c.style}if(b){a=CKEDITOR.tools.clone(a);u(a.attributes,b);u(a.styles,
+b)}c=this.element=a.element?typeof a.element=="string"?a.element.toLowerCase():a.element:"*";this.type=a.type||(s[c]?CKEDITOR.STYLE_BLOCK:x[c]?CKEDITOR.STYLE_OBJECT:CKEDITOR.STYLE_INLINE);if(typeof this.element=="object")this.type=CKEDITOR.STYLE_OBJECT;this._={definition:a}};CKEDITOR.editor.prototype.applyStyle=function(a){A.call(a,this.getSelection())};CKEDITOR.editor.prototype.removeStyle=function(a){A.call(a,this.getSelection(),1)};CKEDITOR.style.prototype={apply:function(a){A.call(this,a.getSelection())},
+remove:function(a){A.call(this,a.getSelection(),1)},applyToRange:function(a){return(this.applyToRange=this.type==CKEDITOR.STYLE_INLINE?c:this.type==CKEDITOR.STYLE_BLOCK?e:this.type==CKEDITOR.STYLE_OBJECT?f:null).call(this,a)},removeFromRange:function(b){return(this.removeFromRange=this.type==CKEDITOR.STYLE_INLINE?a:this.type==CKEDITOR.STYLE_BLOCK?h:this.type==CKEDITOR.STYLE_OBJECT?d:null).call(this,b)},applyToObject:function(a){v(a,this)},checkActive:function(a){switch(this.type){case CKEDITOR.STYLE_BLOCK:return this.checkElementRemovable(a.block||
+a.blockLimit,true);case CKEDITOR.STYLE_OBJECT:case CKEDITOR.STYLE_INLINE:for(var b=a.elements,c=0,d;c<b.length;c++){d=b[c];if(!(this.type==CKEDITOR.STYLE_INLINE&&(d==a.block||d==a.blockLimit))){if(this.type==CKEDITOR.STYLE_OBJECT){var e=d.getName();if(!(typeof this.element=="string"?e==this.element:e in this.element))continue}if(this.checkElementRemovable(d,true))return true}}}return false},checkApplicable:function(a){switch(this.type){case CKEDITOR.STYLE_OBJECT:return a.contains(this.element)}return true},
+checkElementMatch:function(a,b){var c=this._.definition;if(!a||!c.ignoreReadonly&&a.isReadOnly())return false;var d=a.getName();if(typeof this.element=="string"?d==this.element:d in this.element){if(!b&&!a.hasAttributes())return true;if(d=c._AC)c=d;else{var d={},e=0,f=c.attributes;if(f)for(var g in f){e++;d[g]=f[g]}if(g=CKEDITOR.style.getStyleText(c)){d.style||e++;d.style=g}d._length=e;c=c._AC=d}if(c._length){for(var h in c)if(h!="_length"){e=a.getAttribute(h)||"";if(h=="style")a:{d=c[h];typeof d==
+"string"&&(d=CKEDITOR.tools.parseCssText(d));typeof e=="string"&&(e=CKEDITOR.tools.parseCssText(e,true));g=void 0;for(g in d)if(!(g in e&&(e[g]==d[g]||d[g]=="inherit"||e[g]=="inherit"))){d=false;break a}d=true}else d=c[h]==e;if(d){if(!b)return true}else if(b)return false}if(b)return true}else return true}return false},checkElementRemovable:function(a,b){if(this.checkElementMatch(a,b))return true;var c=o(this)[a.getName()];if(c){var d;if(!(c=c.attributes))return true;for(var e=0;e<c.length;e++){d=
+c[e][0];if(d=a.getAttribute(d)){var f=c[e][1];if(f===null||typeof f=="string"&&d==f||f.test(d))return true}}}return false},buildPreview:function(a){var b=this._.definition,c=[],d=b.element;d=="bdo"&&(d="span");var c=["<",d],e=b.attributes;if(e)for(var f in e)c.push(" ",f,'="',e[f],'"');(e=CKEDITOR.style.getStyleText(b))&&c.push(' style="',e,'"');c.push(">",a||b.name,"</",d,">");return c.join("")},getDefinition:function(){return this._.definition}};CKEDITOR.style.getStyleText=function(a){var b=a._ST;
+if(b)return b;var b=a.styles,c=a.attributes&&a.attributes.style||"",d="";c.length&&(c=c.replace(z,";"));for(var e in b){var f=b[e],g=(e+":"+f).replace(z,";");f=="inherit"?d=d+g:c=c+g}c.length&&(c=CKEDITOR.tools.normalizeCssText(c,true));return a._ST=c+d}})();CKEDITOR.styleCommand=function(b,c){this.requiredContent=this.allowedContent=this.style=b;CKEDITOR.tools.extend(this,c,true)};
+CKEDITOR.styleCommand.prototype.exec=function(b){b.focus();this.state==CKEDITOR.TRISTATE_OFF?b.applyStyle(this.style):this.state==CKEDITOR.TRISTATE_ON&&b.removeStyle(this.style)};CKEDITOR.stylesSet=new CKEDITOR.resourceManager("","stylesSet");CKEDITOR.addStylesSet=CKEDITOR.tools.bind(CKEDITOR.stylesSet.add,CKEDITOR.stylesSet);CKEDITOR.loadStylesSet=function(b,c,a){CKEDITOR.stylesSet.addExternal(b,c,"");CKEDITOR.stylesSet.load(b,a)};
+CKEDITOR.editor.prototype.getStylesSet=function(b){if(this._.stylesDefinitions)b(this._.stylesDefinitions);else{var c=this,a=c.config.stylesCombo_stylesSet||c.config.stylesSet;if(a===false)b(null);else if(a instanceof Array){c._.stylesDefinitions=a;b(a)}else{a||(a="default");var a=a.split(":"),f=a[0];CKEDITOR.stylesSet.addExternal(f,a[1]?a.slice(1).join(":"):CKEDITOR.getUrl("styles.js"),"");CKEDITOR.stylesSet.load(f,function(a){c._.stylesDefinitions=a[f];b(c._.stylesDefinitions)})}}};
+CKEDITOR.dom.comment=function(b,c){typeof b=="string"&&(b=(c?c.$:document).createComment(b));CKEDITOR.dom.domObject.call(this,b)};CKEDITOR.dom.comment.prototype=new CKEDITOR.dom.node;CKEDITOR.tools.extend(CKEDITOR.dom.comment.prototype,{type:CKEDITOR.NODE_COMMENT,getOuterHtml:function(){return"<\!--"+this.$.nodeValue+"--\>"}});
+(function(){var b={},c;for(c in CKEDITOR.dtd.$blockLimit)c in CKEDITOR.dtd.$list||(b[c]=1);var a={};for(c in CKEDITOR.dtd.$block)c in CKEDITOR.dtd.$blockLimit||c in CKEDITOR.dtd.$empty||(a[c]=1);CKEDITOR.dom.elementPath=function(c,d){var e=null,h=null,j=[],d=d||c.getDocument().getBody(),i=c;do if(i.type==CKEDITOR.NODE_ELEMENT){j.push(i);if(!this.lastElement){this.lastElement=i;if(i.is(CKEDITOR.dtd.$object))continue}var k=i.getName();if(!h){!e&&a[k]&&(e=i);if(b[k]){var m;if(m=!e){if(k=k=="div"){a:{k=
+i.getChildren();m=0;for(var q=k.count();m<q;m++){var r=k.getItem(m);if(r.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$block[r.getName()]){k=true;break a}}k=false}k=!k&&!i.equals(d)}m=k}m?e=i:h=i}}if(i.equals(d))break}while(i=i.getParent());this.block=e;this.blockLimit=h;this.root=d;this.elements=j}})();
+CKEDITOR.dom.elementPath.prototype={compare:function(b){var c=this.elements,b=b&&b.elements;if(!b||c.length!=b.length)return false;for(var a=0;a<c.length;a++)if(!c[a].equals(b[a]))return false;return true},contains:function(b,c,a){var f;typeof b=="string"&&(f=function(a){return a.getName()==b});b instanceof CKEDITOR.dom.element?f=function(a){return a.equals(b)}:CKEDITOR.tools.isArray(b)?f=function(a){return CKEDITOR.tools.indexOf(b,a.getName())>-1}:typeof b=="function"?f=b:typeof b=="object"&&(f=
+function(a){return a.getName()in b});var d=this.elements,e=d.length;c&&e--;if(a){d=Array.prototype.slice.call(d,0);d.reverse()}for(c=0;c<e;c++)if(f(d[c]))return d[c];return null},isContextFor:function(b){var c;if(b in CKEDITOR.dtd.$block){c=this.contains(CKEDITOR.dtd.$intermediate)||this.root.equals(this.block)&&this.block||this.blockLimit;return!!c.getDtd()[b]}return true},direction:function(){return(this.block||this.blockLimit||this.root).getDirection(1)}};
+CKEDITOR.dom.text=function(b,c){typeof b=="string"&&(b=(c?c.$:document).createTextNode(b));this.$=b};CKEDITOR.dom.text.prototype=new CKEDITOR.dom.node;
+CKEDITOR.tools.extend(CKEDITOR.dom.text.prototype,{type:CKEDITOR.NODE_TEXT,getLength:function(){return this.$.nodeValue.length},getText:function(){return this.$.nodeValue},setText:function(b){this.$.nodeValue=b},split:function(b){var c=this.$.parentNode,a=c.childNodes.length,f=this.getLength(),d=this.getDocument(),e=new CKEDITOR.dom.text(this.$.splitText(b),d);if(c.childNodes.length==a)if(b>=f){e=d.createText("");e.insertAfter(this)}else{b=d.createText("");b.insertAfter(e);b.remove()}return e},substring:function(b,
+c){return typeof c!="number"?this.$.nodeValue.substr(b):this.$.nodeValue.substring(b,c)}});
+(function(){function b(a,b,c){var e=a.serializable,h=b[c?"endContainer":"startContainer"],j=c?"endOffset":"startOffset",i=e?b.document.getById(a.startNode):a.startNode,a=e?b.document.getById(a.endNode):a.endNode;if(h.equals(i.getPrevious())){b.startOffset=b.startOffset-h.getLength()-a.getPrevious().getLength();h=a.getNext()}else if(h.equals(a.getPrevious())){b.startOffset=b.startOffset-h.getLength();h=a.getNext()}h.equals(i.getParent())&&b[j]++;h.equals(a.getParent())&&b[j]++;b[c?"endContainer":"startContainer"]=
+h;return b}CKEDITOR.dom.rangeList=function(a){if(a instanceof CKEDITOR.dom.rangeList)return a;a?a instanceof CKEDITOR.dom.range&&(a=[a]):a=[];return CKEDITOR.tools.extend(a,c)};var c={createIterator:function(){var a=this,b=CKEDITOR.dom.walker.bookmark(),c=[],e;return{getNextRange:function(h){e=e==void 0?0:e+1;var j=a[e];if(j&&a.length>1){if(!e)for(var i=a.length-1;i>=0;i--)c.unshift(a[i].createBookmark(true));if(h)for(var k=0;a[e+k+1];){for(var m=j.document,h=0,i=m.getById(c[k].endNode),m=m.getById(c[k+
+1].startNode);;){i=i.getNextSourceNode(false);if(m.equals(i))h=1;else if(b(i)||i.type==CKEDITOR.NODE_ELEMENT&&i.isBlockBoundary())continue;break}if(!h)break;k++}for(j.moveToBookmark(c.shift());k--;){i=a[++e];i.moveToBookmark(c.shift());j.setEnd(i.endContainer,i.endOffset)}}return j}}},createBookmarks:function(a){for(var c=[],d,e=0;e<this.length;e++){c.push(d=this[e].createBookmark(a,true));for(var h=e+1;h<this.length;h++){this[h]=b(d,this[h]);this[h]=b(d,this[h],true)}}return c},createBookmarks2:function(a){for(var b=
+[],c=0;c<this.length;c++)b.push(this[c].createBookmark2(a));return b},moveToBookmarks:function(a){for(var b=0;b<this.length;b++)this[b].moveToBookmark(a[b])}}})();
+(function(){function b(){return CKEDITOR.getUrl(CKEDITOR.skinName.split(",")[1]||"skins/"+CKEDITOR.skinName.split(",")[0]+"/")}function c(a){var c=CKEDITOR.skin["ua_"+a],d=CKEDITOR.env;if(c)for(var c=c.split(",").sort(function(a,b){return a>b?-1:1}),e=0,f;e<c.length;e++){f=c[e];if(d.ie&&(f.replace(/^ie/,"")==d.version||d.quirks&&f=="iequirks"))f="ie";if(d[f]){a=a+("_"+c[e]);break}}return CKEDITOR.getUrl(b()+a+".css")}function a(a,b){if(!e[a]){CKEDITOR.document.appendStyleSheet(c(a));e[a]=1}b&&b()}
+function f(a){var b=a.getById(h);if(!b){b=a.getHead().append("style");b.setAttribute("id",h);b.setAttribute("type","text/css")}return b}function d(a,b,c){var d,e,f;if(CKEDITOR.env.webkit){b=b.split("}").slice(0,-1);for(e=0;e<b.length;e++)b[e]=b[e].split("{")}for(var h=0;h<a.length;h++)if(CKEDITOR.env.webkit)for(e=0;e<b.length;e++){f=b[e][1];for(d=0;d<c.length;d++)f=f.replace(c[d][0],c[d][1]);a[h].$.sheet.addRule(b[e][0],f)}else{f=b;for(d=0;d<c.length;d++)f=f.replace(c[d][0],c[d][1]);CKEDITOR.env.ie?
+a[h].$.styleSheet.cssText=a[h].$.styleSheet.cssText+f:a[h].$.innerHTML=a[h].$.innerHTML+f}}var e={};CKEDITOR.skin={path:b,loadPart:function(c,d){CKEDITOR.skin.name!=CKEDITOR.skinName.split(",")[0]?CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(b()+"skin.js"),function(){a(c,d)}):a(c,d)},getPath:function(a){return CKEDITOR.getUrl(c(a))},icons:{},addIcon:function(a,b,c,d){a=a.toLowerCase();this.icons[a]||(this.icons[a]={path:b,offset:c||0,bgsize:d||"16px"})},getIconStyle:function(a,b,c,d,e){var f;if(a){a=
+a.toLowerCase();b&&(f=this.icons[a+"-rtl"]);f||(f=this.icons[a])}a=c||f&&f.path||"";d=d||f&&f.offset;e=e||f&&f.bgsize||"16px";return a&&"background-image:url("+CKEDITOR.getUrl(a)+");background-position:0 "+d+"px;background-size:"+e+";"}};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{getUiColor:function(){return this.uiColor},setUiColor:function(a){var b=f(CKEDITOR.document);return(this.setUiColor=function(a){var c=CKEDITOR.skin.chameleon,e=[[i,a]];this.uiColor=a;d([b],c(this,"editor"),e);d(j,c(this,
+"panel"),e)}).call(this,a)}});var h="cke_ui_color",j=[],i=/\$color/g;CKEDITOR.on("instanceLoaded",function(a){if(!CKEDITOR.env.ie||!CKEDITOR.env.quirks){var b=a.editor,a=function(a){a=(a.data[0]||a.data).element.getElementsByTag("iframe").getItem(0).getFrameDocument();if(!a.getById("cke_ui_color")){a=f(a);j.push(a);var c=b.getUiColor();c&&d([a],CKEDITOR.skin.chameleon(b,"panel"),[[i,c]])}};b.on("panelShow",a);b.on("menuShow",a);b.config.uiColor&&b.setUiColor(b.config.uiColor)}})})();
+(function(){if(CKEDITOR.env.webkit)CKEDITOR.env.hc=false;else{var b=CKEDITOR.dom.element.createFromHtml('<div style="width:0px;height:0px;position:absolute;left:-10000px;border: 1px solid;border-color: red blue;"></div>',CKEDITOR.document);b.appendTo(CKEDITOR.document.getHead());try{CKEDITOR.env.hc=b.getComputedStyle("border-top-color")==b.getComputedStyle("border-right-color")}catch(c){CKEDITOR.env.hc=false}b.remove()}if(CKEDITOR.env.hc)CKEDITOR.env.cssClass=CKEDITOR.env.cssClass+" cke_hc";CKEDITOR.document.appendStyleText(".cke{visibility:hidden;}");
+CKEDITOR.status="loaded";CKEDITOR.fireOnce("loaded");if(b=CKEDITOR._.pending){delete CKEDITOR._.pending;for(var a=0;a<b.length;a++){CKEDITOR.editor.prototype.constructor.apply(b[a][0],b[a][1]);CKEDITOR.add(b[a][0])}}})();/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.skin.name="moono";CKEDITOR.skin.ua_editor="ie,iequirks,ie7,ie8,gecko";CKEDITOR.skin.ua_dialog="ie,iequirks,ie7,ie8,opera";
+CKEDITOR.skin.chameleon=function(){var b=function(){return function(b,e){for(var a=b.match(/[^#]./g),c=0;3>c;c++){var f=a,h=c,d;d=parseInt(a[c],16);d=("0"+(0>e?0|d*(1+e):0|d+(255-d)*e).toString(16)).slice(-2);f[h]=d}return"#"+a.join("")}}(),c=function(){var b=new CKEDITOR.template("background:#{to};background-image:-webkit-gradient(linear,lefttop,leftbottom,from({from}),to({to}));background-image:-moz-linear-gradient(top,{from},{to});background-image:-webkit-linear-gradient(top,{from},{to});background-image:-o-linear-gradient(top,{from},{to});background-image:-ms-linear-gradient(top,{from},{to});background-image:linear-gradient(top,{from},{to});filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='{from}',endColorstr='{to}');");return function(c,
+a){return b.output({from:c,to:a})}}(),f={editor:new CKEDITOR.template("{id}.cke_chrome [border-color:{defaultBorder};] {id} .cke_top [ {defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_bottom [{defaultGradient}border-top-color:{defaultBorder};] {id} .cke_resizer [border-right-color:{ckeResizer}] {id} .cke_dialog_title [{defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_dialog_footer [{defaultGradient}outline-color:{defaultBorder};border-top-color:{defaultBorder};] {id} .cke_dialog_tab [{lightGradient}border-color:{defaultBorder};] {id} .cke_dialog_tab:hover [{mediumGradient}] {id} .cke_dialog_contents [border-top-color:{defaultBorder};] {id} .cke_dialog_tab_selected, {id} .cke_dialog_tab_selected:hover [background:{dialogTabSelected};border-bottom-color:{dialogTabSelectedBorder};] {id} .cke_dialog_body [background:{dialogBody};border-color:{defaultBorder};] {id} .cke_toolgroup [{lightGradient}border-color:{defaultBorder};] {id} a.cke_button_off:hover, {id} a.cke_button_off:focus, {id} a.cke_button_off:active [{mediumGradient}] {id} .cke_button_on [{ckeButtonOn}] {id} .cke_toolbar_separator [background-color: {ckeToolbarSeparator};] {id} .cke_combo_button [border-color:{defaultBorder};{lightGradient}] {id} a.cke_combo_button:hover, {id} a.cke_combo_button:focus, {id} .cke_combo_on a.cke_combo_button [border-color:{defaultBorder};{mediumGradient}] {id} .cke_path_item [color:{elementsPathColor};] {id} a.cke_path_item:hover, {id} a.cke_path_item:focus, {id} a.cke_path_item:active [background-color:{elementsPathBg};] {id}.cke_panel [border-color:{defaultBorder};] "),
+panel:new CKEDITOR.template(".cke_panel_grouptitle [{lightGradient}border-color:{defaultBorder};] .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menubutton:hover .cke_menubutton_icon, .cke_menubutton:focus .cke_menubutton_icon, .cke_menubutton:active .cke_menubutton_icon [background-color:{menubuttonIconHover};] .cke_menuseparator [background-color:{menubuttonIcon};] a:hover.cke_colorbox, a:focus.cke_colorbox, a:active.cke_colorbox [border-color:{defaultBorder};] a:hover.cke_colorauto, a:hover.cke_colormore, a:focus.cke_colorauto, a:focus.cke_colormore, a:active.cke_colorauto, a:active.cke_colormore [background-color:{ckeColorauto};border-color:{defaultBorder};] ")};
+return function(g,e){var a=g.uiColor,a={id:"."+g.id,defaultBorder:b(a,-0.1),defaultGradient:c(b(a,0.9),a),lightGradient:c(b(a,1),b(a,0.7)),mediumGradient:c(b(a,0.8),b(a,0.5)),ckeButtonOn:c(b(a,0.6),b(a,0.7)),ckeResizer:b(a,-0.4),ckeToolbarSeparator:b(a,0.5),ckeColorauto:b(a,0.8),dialogBody:b(a,0.7),dialogTabSelected:c("#FFFFFF","#FFFFFF"),dialogTabSelectedBorder:"#FFF",elementsPathColor:b(a,-0.6),elementsPathBg:a,menubuttonIcon:b(a,0.5),menubuttonIconHover:b(a,0.3)};return f[e].output(a).replace(/\[/g,
+"{").replace(/\]/g,"}")}}();CKEDITOR.plugins.add("dialogui",{onLoad:function(){var i=function(b){this._||(this._={});this._["default"]=this._.initValue=b["default"]||"";this._.required=b.required||!1;for(var a=[this._],d=1;d<arguments.length;d++)a.push(arguments[d]);a.push(!0);CKEDITOR.tools.extend.apply(CKEDITOR.tools,a);return this._},r={build:function(b,a,d){return new CKEDITOR.ui.dialog.textInput(b,a,d)}},l={build:function(b,a,d){return new CKEDITOR.ui.dialog[a.type](b,a,d)}},n={isChanged:function(){return this.getValue()!=
+this.getInitValue()},reset:function(b){this.setValue(this.getInitValue(),b)},setInitValue:function(){this._.initValue=this.getValue()},resetInitValue:function(){this._.initValue=this._["default"]},getInitValue:function(){return this._.initValue}},o=CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onChange:function(b,a){this._.domOnChangeRegistered||(b.on("load",function(){this.getInputElement().on("change",function(){b.parts.dialog.isVisible()&&this.fire("change",{value:this.getValue()})},
+this)},this),this._.domOnChangeRegistered=!0);this.on("change",a)}},!0),s=/^on([A-Z]\w+)/,p=function(b){for(var a in b)(s.test(a)||"title"==a||"type"==a)&&delete b[a];return b};CKEDITOR.tools.extend(CKEDITOR.ui.dialog,{labeledElement:function(b,a,d,e){if(!(4>arguments.length)){var c=i.call(this,a);c.labelId=CKEDITOR.tools.getNextId()+"_label";this._.children=[];CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"div",null,{role:"presentation"},function(){var f=[],d=a.required?" cke_required":"";"horizontal"!=
+a.labelLayout?f.push('<label class="cke_dialog_ui_labeled_label'+d+'" ',' id="'+c.labelId+'"',c.inputId?' for="'+c.inputId+'"':"",(a.labelStyle?' style="'+a.labelStyle+'"':"")+">",a.label,"</label>",'<div class="cke_dialog_ui_labeled_content"'+(a.controlStyle?' style="'+a.controlStyle+'"':"")+' role="presentation">',e.call(this,b,a),"</div>"):(d={type:"hbox",widths:a.widths,padding:0,children:[{type:"html",html:'<label class="cke_dialog_ui_labeled_label'+d+'" id="'+c.labelId+'" for="'+c.inputId+'"'+
+(a.labelStyle?' style="'+a.labelStyle+'"':"")+">"+CKEDITOR.tools.htmlEncode(a.label)+"</span>"},{type:"html",html:'<span class="cke_dialog_ui_labeled_content"'+(a.controlStyle?' style="'+a.controlStyle+'"':"")+">"+e.call(this,b,a)+"</span>"}]},CKEDITOR.dialog._.uiElementBuilders.hbox.build(b,d,f));return f.join("")})}},textInput:function(b,a,d){if(!(3>arguments.length)){i.call(this,a);var e=this._.inputId=CKEDITOR.tools.getNextId()+"_textInput",c={"class":"cke_dialog_ui_input_"+a.type,id:e,type:a.type};
+a.validate&&(this.validate=a.validate);a.maxLength&&(c.maxlength=a.maxLength);a.size&&(c.size=a.size);a.inputStyle&&(c.style=a.inputStyle);var f=this,h=!1;b.on("load",function(){f.getInputElement().on("keydown",function(a){a.data.getKeystroke()==13&&(h=true)});f.getInputElement().on("keyup",function(a){if(a.data.getKeystroke()==13&&h){b.getButton("ok")&&setTimeout(function(){b.getButton("ok").click()},0);h=false}},null,null,1E3)});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var b=
+['<div class="cke_dialog_ui_input_',a.type,'" role="presentation"'];a.width&&b.push('style="width:'+a.width+'" ');b.push("><input ");c["aria-labelledby"]=this._.labelId;this._.required&&(c["aria-required"]=this._.required);for(var d in c)b.push(d+'="'+c[d]+'" ');b.push(" /></div>");return b.join("")})}},textarea:function(b,a,d){if(!(3>arguments.length)){i.call(this,a);var e=this,c=this._.inputId=CKEDITOR.tools.getNextId()+"_textarea",f={};a.validate&&(this.validate=a.validate);f.rows=a.rows||5;f.cols=
+a.cols||20;f["class"]="cke_dialog_ui_input_textarea "+(a["class"]||"");"undefined"!=typeof a.inputStyle&&(f.style=a.inputStyle);a.dir&&(f.dir=a.dir);CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){f["aria-labelledby"]=this._.labelId;this._.required&&(f["aria-required"]=this._.required);var a=['<div class="cke_dialog_ui_input_textarea" role="presentation"><textarea id="',c,'" '],b;for(b in f)a.push(b+'="'+CKEDITOR.tools.htmlEncode(f[b])+'" ');a.push(">",CKEDITOR.tools.htmlEncode(e._["default"]),
+"</textarea></div>");return a.join("")})}},checkbox:function(b,a,d){if(!(3>arguments.length)){var e=i.call(this,a,{"default":!!a["default"]});a.validate&&(this.validate=a.validate);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"span",null,null,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_checkbox":CKEDITOR.tools.getNextId()+"_checkbox"},true),d=[],h=CKEDITOR.tools.getNextId()+"_label",g={"class":"cke_dialog_ui_checkbox_input",type:"checkbox","aria-labelledby":h};p(c);if(a["default"])g.checked=
+"checked";if(typeof c.inputStyle!="undefined")c.style=c.inputStyle;e.checkbox=new CKEDITOR.ui.dialog.uiElement(b,c,d,"input",null,g);d.push(' <label id="',h,'" for="',g.id,'"'+(a.labelStyle?' style="'+a.labelStyle+'"':"")+">",CKEDITOR.tools.htmlEncode(a.label),"</label>");return d.join("")})}},radio:function(b,a,d){if(!(3>arguments.length)){i.call(this,a);this._["default"]||(this._["default"]=this._.initValue=a.items[0][1]);a.validate&&(this.validate=a.valdiate);var e=[],c=this;CKEDITOR.ui.dialog.labeledElement.call(this,
+b,a,d,function(){for(var d=[],h=[],g=a.id?a.id+"_radio":CKEDITOR.tools.getNextId()+"_radio",k=0;k<a.items.length;k++){var j=a.items[k],i=j[2]!==void 0?j[2]:j[0],l=j[1]!==void 0?j[1]:j[0],m=CKEDITOR.tools.getNextId()+"_radio_input",n=m+"_label",m=CKEDITOR.tools.extend({},a,{id:m,title:null,type:null},true),i=CKEDITOR.tools.extend({},m,{title:i},true),o={type:"radio","class":"cke_dialog_ui_radio_input",name:g,value:l,"aria-labelledby":n},q=[];if(c._["default"]==l)o.checked="checked";p(m);p(i);if(typeof m.inputStyle!=
+"undefined")m.style=m.inputStyle;e.push(new CKEDITOR.ui.dialog.uiElement(b,m,q,"input",null,o));q.push(" ");new CKEDITOR.ui.dialog.uiElement(b,i,q,"label",null,{id:n,"for":o.id},j[0]);d.push(q.join(""))}new CKEDITOR.ui.dialog.hbox(b,e,d,h);return h.join("")});this._.children=e}},button:function(b,a,d){if(arguments.length){"function"==typeof a&&(a=a(b.getParentEditor()));i.call(this,a,{disabled:a.disabled||!1});CKEDITOR.event.implementOn(this);var e=this;b.on("load",function(){var a=this.getElement();
+(function(){a.on("click",function(a){e.click();a.data.preventDefault()});a.on("keydown",function(a){a.data.getKeystroke()in{32:1}&&(e.click(),a.data.preventDefault())})})();a.unselectable()},this);var c=CKEDITOR.tools.extend({},a);delete c.style;var f=CKEDITOR.tools.getNextId()+"_label";CKEDITOR.ui.dialog.uiElement.call(this,b,c,d,"a",null,{style:a.style,href:"javascript:void(0)",title:a.label,hidefocus:"true","class":a["class"],role:"button","aria-labelledby":f},'<span id="'+f+'" class="cke_dialog_ui_button">'+
+CKEDITOR.tools.htmlEncode(a.label)+"</span>")}},select:function(b,a,d){if(!(3>arguments.length)){var e=i.call(this,a);a.validate&&(this.validate=a.validate);e.inputId=CKEDITOR.tools.getNextId()+"_select";CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_select":CKEDITOR.tools.getNextId()+"_select"},true),d=[],h=[],g={id:e.inputId,"class":"cke_dialog_ui_input_select","aria-labelledby":this._.labelId};d.push('<div class="cke_dialog_ui_input_',
+a.type,'" role="presentation"');a.width&&d.push('style="width:'+a.width+'" ');d.push(">");if(a.size!=void 0)g.size=a.size;if(a.multiple!=void 0)g.multiple=a.multiple;p(c);for(var k=0,j;k<a.items.length&&(j=a.items[k]);k++)h.push('<option value="',CKEDITOR.tools.htmlEncode(j[1]!==void 0?j[1]:j[0]).replace(/"/g,"&quot;"),'" /> ',CKEDITOR.tools.htmlEncode(j[0]));if(typeof c.inputStyle!="undefined")c.style=c.inputStyle;e.select=new CKEDITOR.ui.dialog.uiElement(b,c,d,"select",null,g,h.join(""));d.push("</div>");
+return d.join("")})}},file:function(b,a,d){if(!(3>arguments.length)){void 0===a["default"]&&(a["default"]="");var e=CKEDITOR.tools.extend(i.call(this,a),{definition:a,buttons:[]});a.validate&&(this.validate=a.validate);b.on("load",function(){CKEDITOR.document.getById(e.frameId).getParent().addClass("cke_dialog_ui_input_file")});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){e.frameId=CKEDITOR.tools.getNextId()+"_fileInput";var b=['<iframe frameborder="0" allowtransparency="0" class="cke_dialog_ui_input_file" role="presentation" id="',
+e.frameId,'" title="',a.label,'" src="javascript:void('];b.push(CKEDITOR.env.ie?"(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"})()":"0");b.push(')"></iframe>');return b.join("")})}},fileButton:function(b,a,d){if(!(3>arguments.length)){i.call(this,a);var e=this;a.validate&&(this.validate=a.validate);var c=CKEDITOR.tools.extend({},a),f=c.onClick;c.className=(c.className?c.className+" ":"")+"cke_dialog_ui_button";c.onClick=function(c){var d=
+a["for"];if(!f||f.call(this,c)!==false){b.getContentElement(d[0],d[1]).submit();this.disable()}};b.on("load",function(){b.getContentElement(a["for"][0],a["for"][1])._.buttons.push(e)});CKEDITOR.ui.dialog.button.call(this,b,c,d)}},html:function(){var b=/^\s*<[\w:]+\s+([^>]*)?>/,a=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,d=/\/$/;return function(e,c,f){if(!(3>arguments.length)){var h=[],g=c.html;"<"!=g.charAt(0)&&(g="<span>"+g+"</span>");var k=c.focus;if(k){var j=this.focus;this.focus=function(){("function"==
+typeof k?k:j).call(this);this.fire("focus")};c.isFocusable&&(this.isFocusable=this.isFocusable);this.keyboardFocusable=!0}CKEDITOR.ui.dialog.uiElement.call(this,e,c,h,"span",null,null,"");h=h.join("").match(b);g=g.match(a)||["","",""];d.test(g[1])&&(g[1]=g[1].slice(0,-1),g[2]="/"+g[2]);f.push([g[1]," ",h[1]||"",g[2]].join(""))}}}(),fieldset:function(b,a,d,e,c){var f=c.label;this._={children:a};CKEDITOR.ui.dialog.uiElement.call(this,b,c,e,"fieldset",null,null,function(){var a=[];f&&a.push("<legend"+
+(c.labelStyle?' style="'+c.labelStyle+'"':"")+">"+f+"</legend>");for(var b=0;b<d.length;b++)a.push(d[b]);return a.join("")})}},!0);CKEDITOR.ui.dialog.html.prototype=new CKEDITOR.ui.dialog.uiElement;CKEDITOR.ui.dialog.labeledElement.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{setLabel:function(b){var a=CKEDITOR.document.getById(this._.labelId);1>a.getChildCount()?(new CKEDITOR.dom.text(b,CKEDITOR.document)).appendTo(a):a.getChild(0).$.nodeValue=b;return this},getLabel:function(){var b=
+CKEDITOR.document.getById(this._.labelId);return!b||1>b.getChildCount()?"":b.getChild(0).getText()},eventProcessors:o},!0);CKEDITOR.ui.dialog.button.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{click:function(){return!this._.disabled?this.fire("click",{dialog:this._.dialog}):!1},enable:function(){this._.disabled=!1;var b=this.getElement();b&&b.removeClass("cke_disabled")},disable:function(){this._.disabled=!0;this.getElement().addClass("cke_disabled")},isVisible:function(){return this.getElement().getFirst().isVisible()},
+isEnabled:function(){return!this._.disabled},eventProcessors:CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onClick:function(b,a){this.on("click",function(){a.apply(this,arguments)})}},!0),accessKeyUp:function(){this.click()},accessKeyDown:function(){this.focus()},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.textInput.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return CKEDITOR.document.getById(this._.inputId)},
+focus:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&a.$.focus()},0)},select:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&(a.$.focus(),a.$.select())},0)},accessKeyUp:function(){this.select()},setValue:function(b){!b&&(b="");return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply(this,arguments)},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.textarea.prototype=new CKEDITOR.ui.dialog.textInput;CKEDITOR.ui.dialog.select.prototype=
+CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return this._.select.getElement()},add:function(b,a,d){var e=new CKEDITOR.dom.element("option",this.getDialog().getParentEditor().document),c=this.getInputElement().$;e.$.text=b;e.$.value=void 0===a||null===a?b:a;void 0===d||null===d?CKEDITOR.env.ie?c.add(e.$):c.add(e.$,null):c.add(e.$,d);return this},remove:function(b){this.getInputElement().$.remove(b);return this},clear:function(){for(var b=this.getInputElement().$;0<
+b.length;)b.remove(0);return this},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.checkbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getInputElement:function(){return this._.checkbox.getElement()},setValue:function(b,a){this.getInputElement().$.checked=b;!a&&this.fire("change",{value:b})},getValue:function(){return this.getInputElement().$.checked},accessKeyUp:function(){this.setValue(!this.getValue())},eventProcessors:{onChange:function(b,a){if(!CKEDITOR.env.ie||8<CKEDITOR.env.version)return o.onChange.apply(this,
+arguments);b.on("load",function(){var a=this._.checkbox.getElement();a.on("propertychange",function(b){b=b.data.$;"checked"==b.propertyName&&this.fire("change",{value:a.$.checked})},this)},this);this.on("change",a);return null}},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.radio.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{setValue:function(b,a){for(var d=this._.children,e,c=0;c<d.length&&(e=d[c]);c++)e.getElement().$.checked=e.getValue()==b;!a&&this.fire("change",{value:b})},
+getValue:function(){for(var b=this._.children,a=0;a<b.length;a++)if(b[a].getElement().$.checked)return b[a].getValue();return null},accessKeyUp:function(){var b=this._.children,a;for(a=0;a<b.length;a++)if(b[a].getElement().$.checked){b[a].getElement().focus();return}b[0].getElement().focus()},eventProcessors:{onChange:function(b,a){if(CKEDITOR.env.ie)b.on("load",function(){for(var a=this._.children,b=this,c=0;c<a.length;c++)a[c].getElement().on("propertychange",function(a){a=a.data.$;"checked"==a.propertyName&&
+this.$.checked&&b.fire("change",{value:this.getAttribute("value")})})},this),this.on("change",a);else return o.onChange.apply(this,arguments);return null}},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.file.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,n,{getInputElement:function(){var b=CKEDITOR.document.getById(this._.frameId).getFrameDocument();return 0<b.$.forms.length?new CKEDITOR.dom.element(b.$.forms[0].elements[0]):this.getElement()},submit:function(){this.getInputElement().getParent().$.submit();
+return this},getAction:function(){return this.getInputElement().getParent().$.action},registerEvents:function(b){var a=/^on([A-Z]\w+)/,d,e=function(a,b,c,d){a.on("formLoaded",function(){a.getInputElement().on(c,d,a)})},c;for(c in b)if(d=c.match(a))this.eventProcessors[c]?this.eventProcessors[c].call(this,this._.dialog,b[c]):e(this,this._.dialog,d[1].toLowerCase(),b[c]);return this},reset:function(){function b(){d.$.open();var b="";e.size&&(b=e.size-(CKEDITOR.env.ie?7:0));var i=a.frameId+"_input";
+d.$.write(['<html dir="'+g+'" lang="'+k+'"><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">','<form enctype="multipart/form-data" method="POST" dir="'+g+'" lang="'+k+'" action="',CKEDITOR.tools.htmlEncode(e.action),'"><label id="',a.labelId,'" for="',i,'" style="display:none">',CKEDITOR.tools.htmlEncode(e.label),'</label><input id="',i,'" aria-labelledby="',a.labelId,'" type="file" name="',CKEDITOR.tools.htmlEncode(e.id||"cke_upload"),'" size="',CKEDITOR.tools.htmlEncode(0<
+b?b:""),'" /></form></body></html><script>',CKEDITOR.env.ie?"("+CKEDITOR.tools.fixDomain+")();":"","window.parent.CKEDITOR.tools.callFunction("+f+");","window.onbeforeunload = function() {window.parent.CKEDITOR.tools.callFunction("+h+")}","<\/script>"].join(""));d.$.close();for(b=0;b<c.length;b++)c[b].enable()}var a=this._,d=CKEDITOR.document.getById(a.frameId).getFrameDocument(),e=a.definition,c=a.buttons,f=this.formLoadedNumber,h=this.formUnloadNumber,g=a.dialog._.editor.lang.dir,k=a.dialog._.editor.langCode;
+f||(f=this.formLoadedNumber=CKEDITOR.tools.addFunction(function(){this.fire("formLoaded")},this),h=this.formUnloadNumber=CKEDITOR.tools.addFunction(function(){this.getInputElement().clearCustomData()},this),this.getDialog()._.editor.on("destroy",function(){CKEDITOR.tools.removeFunction(f);CKEDITOR.tools.removeFunction(h)}));CKEDITOR.env.gecko?setTimeout(b,500):b()},getValue:function(){return this.getInputElement().$.value||""},setInitValue:function(){this._.initValue=""},eventProcessors:{onChange:function(b,
+a){this._.domOnChangeRegistered||(this.on("formLoaded",function(){this.getInputElement().on("change",function(){this.fire("change",{value:this.getValue()})},this)},this),this._.domOnChangeRegistered=!0);this.on("change",a)}},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.fileButton.prototype=new CKEDITOR.ui.dialog.button;CKEDITOR.ui.dialog.fieldset.prototype=CKEDITOR.tools.clone(CKEDITOR.ui.dialog.hbox.prototype);CKEDITOR.dialog.addUIElement("text",r);CKEDITOR.dialog.addUIElement("password",r);CKEDITOR.dialog.addUIElement("textarea",
+l);CKEDITOR.dialog.addUIElement("checkbox",l);CKEDITOR.dialog.addUIElement("radio",l);CKEDITOR.dialog.addUIElement("button",l);CKEDITOR.dialog.addUIElement("select",l);CKEDITOR.dialog.addUIElement("file",l);CKEDITOR.dialog.addUIElement("fileButton",l);CKEDITOR.dialog.addUIElement("html",l);CKEDITOR.dialog.addUIElement("fieldset",{build:function(b,a,d){for(var e=a.children,c,f=[],h=[],g=0;g<e.length&&(c=e[g]);g++){var i=[];f.push(i);h.push(CKEDITOR.dialog._.uiElementBuilders[c.type].build(b,c,i))}return new CKEDITOR.ui.dialog[a.type](b,
+h,f,d,a)}})}});CKEDITOR.DIALOG_RESIZE_NONE=0;CKEDITOR.DIALOG_RESIZE_WIDTH=1;CKEDITOR.DIALOG_RESIZE_HEIGHT=2;CKEDITOR.DIALOG_RESIZE_BOTH=3;
+(function(){function p(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId)+a,c=b-1;c>b-a;c--)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function u(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId),c=b+1;c<b+a;c++)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function q(a,b){for(var c=a.$.getElementsByTagName("input"),
+d=0,e=c.length;d<e;d++){var g=new CKEDITOR.dom.element(c[d]);"text"==g.getAttribute("type").toLowerCase()&&(b?(g.setAttribute("value",g.getCustomData("fake_value")||""),g.removeCustomData("fake_value")):(g.setCustomData("fake_value",g.getAttribute("value")),g.setAttribute("value","")))}}function P(a,b){var c=this.getInputElement();c&&(a?c.removeAttribute("aria-invalid"):c.setAttribute("aria-invalid",!0));a||(this.select?this.select():this.focus());b&&alert(b);this.fire("validated",{valid:a,msg:b})}
+function Q(){var a=this.getInputElement();a&&a.removeAttribute("aria-invalid")}function R(a){var a=CKEDITOR.dom.element.createFromHtml(CKEDITOR.addTemplate("dialog",S).output({id:CKEDITOR.tools.getNextNumber(),editorId:a.id,langDir:a.lang.dir,langCode:a.langCode,editorDialogClass:"cke_editor_"+a.name.replace(/\./g,"\\.")+"_dialog",closeTitle:a.lang.common.close,hidpi:CKEDITOR.env.hidpi?"cke_hidpi":""})),b=a.getChild([0,0,0,0,0]),c=b.getChild(0),d=b.getChild(1);if(CKEDITOR.env.ie&&!CKEDITOR.env.ie6Compat){var e=
+"javascript:void(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"}())";CKEDITOR.dom.element.createFromHtml('<iframe frameBorder="0" class="cke_iframe_shim" src="'+e+'" tabIndex="-1"></iframe>').appendTo(b.getParent())}c.unselectable();d.unselectable();return{element:a,parts:{dialog:a.getChild(0),title:c,close:d,tabs:b.getChild(2),contents:b.getChild([3,0,0,0]),footer:b.getChild([3,0,1,0])}}}function H(a,b,c){this.element=b;this.focusIndex=c;this.tabIndex=
+0;this.isFocusable=function(){return!b.getAttribute("disabled")&&b.isVisible()};this.focus=function(){a._.currentFocusIndex=this.focusIndex;this.element.focus()};b.on("keydown",function(a){a.data.getKeystroke()in{32:1,13:1}&&this.fire("click")});b.on("focus",function(){this.fire("mouseover")});b.on("blur",function(){this.fire("mouseout")})}function T(a){function b(){a.layout()}var c=CKEDITOR.document.getWindow();c.on("resize",b);a.on("hide",function(){c.removeListener("resize",b)})}function I(a,b){this._=
+{dialog:a};CKEDITOR.tools.extend(this,b)}function U(a){function b(b){var c=a.getSize(),h=CKEDITOR.document.getWindow().getViewPaneSize(),o=b.data.$.screenX,i=b.data.$.screenY,n=o-d.x,l=i-d.y;d={x:o,y:i};e.x+=n;e.y+=l;a.move(e.x+k[3]<f?-k[3]:e.x-k[1]>h.width-c.width-f?h.width-c.width+("rtl"==g.lang.dir?0:k[1]):e.x,e.y+k[0]<f?-k[0]:e.y-k[2]>h.height-c.height-f?h.height-c.height+k[2]:e.y,1);b.data.preventDefault()}function c(){CKEDITOR.document.removeListener("mousemove",b);CKEDITOR.document.removeListener("mouseup",
+c);if(CKEDITOR.env.ie6Compat){var a=r.getChild(0).getFrameDocument();a.removeListener("mousemove",b);a.removeListener("mouseup",c)}}var d=null,e=null;a.getElement().getFirst();var g=a.getParentEditor(),f=g.config.dialog_magnetDistance,k=CKEDITOR.skin.margins||[0,0,0,0];"undefined"==typeof f&&(f=20);a.parts.title.on("mousedown",function(f){d={x:f.data.$.screenX,y:f.data.$.screenY};CKEDITOR.document.on("mousemove",b);CKEDITOR.document.on("mouseup",c);e=a.getPosition();if(CKEDITOR.env.ie6Compat){var j=
+r.getChild(0).getFrameDocument();j.on("mousemove",b);j.on("mouseup",c)}f.data.preventDefault()},a)}function V(a){var b,c;function d(e){var d="rtl"==k.lang.dir,i=o.width,D=o.height,E=i+(e.data.$.screenX-b)*(d?-1:1)*(a._.moved?1:2),n=D+(e.data.$.screenY-c)*(a._.moved?1:2),x=a._.element.getFirst(),x=d&&x.getComputedStyle("right"),y=a.getPosition();y.y+n>h.height&&(n=h.height-y.y);if((d?x:y.x)+E>h.width)E=h.width-(d?x:y.x);if(f==CKEDITOR.DIALOG_RESIZE_WIDTH||f==CKEDITOR.DIALOG_RESIZE_BOTH)i=Math.max(g.minWidth||
+0,E-m);if(f==CKEDITOR.DIALOG_RESIZE_HEIGHT||f==CKEDITOR.DIALOG_RESIZE_BOTH)D=Math.max(g.minHeight||0,n-j);a.resize(i,D);a._.moved||a.layout();e.data.preventDefault()}function e(){CKEDITOR.document.removeListener("mouseup",e);CKEDITOR.document.removeListener("mousemove",d);i&&(i.remove(),i=null);if(CKEDITOR.env.ie6Compat){var a=r.getChild(0).getFrameDocument();a.removeListener("mouseup",e);a.removeListener("mousemove",d)}}var g=a.definition,f=g.resizable;if(f!=CKEDITOR.DIALOG_RESIZE_NONE){var k=a.getParentEditor(),
+m,j,h,o,i,n=CKEDITOR.tools.addFunction(function(f){o=a.getSize();var g=a.parts.contents;g.$.getElementsByTagName("iframe").length&&(i=CKEDITOR.dom.element.createFromHtml('<div class="cke_dialog_resize_cover" style="height: 100%; position: absolute; width: 100%;"></div>'),g.append(i));j=o.height-a.parts.contents.getSize("height",!(CKEDITOR.env.gecko||CKEDITOR.env.opera||CKEDITOR.env.ie&&CKEDITOR.env.quirks));m=o.width-a.parts.contents.getSize("width",1);b=f.screenX;c=f.screenY;h=CKEDITOR.document.getWindow().getViewPaneSize();
+CKEDITOR.document.on("mousemove",d);CKEDITOR.document.on("mouseup",e);CKEDITOR.env.ie6Compat&&(g=r.getChild(0).getFrameDocument(),g.on("mousemove",d),g.on("mouseup",e));f.preventDefault&&f.preventDefault()});a.on("load",function(){var b="";f==CKEDITOR.DIALOG_RESIZE_WIDTH?b=" cke_resizer_horizontal":f==CKEDITOR.DIALOG_RESIZE_HEIGHT&&(b=" cke_resizer_vertical");b=CKEDITOR.dom.element.createFromHtml('<div class="cke_resizer'+b+" cke_resizer_"+k.lang.dir+'" title="'+CKEDITOR.tools.htmlEncode(k.lang.common.resize)+
+'" onmousedown="CKEDITOR.tools.callFunction('+n+', event )">'+("ltr"==k.lang.dir?"◢":"◣")+"</div>");a.parts.footer.append(b,1)});k.on("destroy",function(){CKEDITOR.tools.removeFunction(n)})}}function F(a){a.data.preventDefault(1)}function J(a){var b=CKEDITOR.document.getWindow(),c=a.config,d=c.dialog_backgroundCoverColor||"white",e=c.dialog_backgroundCoverOpacity,g=c.baseFloatZIndex,c=CKEDITOR.tools.genKey(d,e,g),f=w[c];f?f.show():(g=['<div tabIndex="-1" style="position: ',CKEDITOR.env.ie6Compat?
+"absolute":"fixed","; z-index: ",g,"; top: 0px; left: 0px; ",!CKEDITOR.env.ie6Compat?"background-color: "+d:"",'" class="cke_dialog_background_cover">'],CKEDITOR.env.ie6Compat&&(d="<html><body style=\\'background-color:"+d+";\\'></body></html>",g.push('<iframe hidefocus="true" frameborder="0" id="cke_dialog_background_iframe" src="javascript:'),g.push("void((function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.write( '"+d+"' );document.close();")+"})())"),g.push('" style="position:absolute;left:0;top:0;width:100%;height: 100%;filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0)"></iframe>')),
+g.push("</div>"),f=CKEDITOR.dom.element.createFromHtml(g.join("")),f.setOpacity(void 0!=e?e:0.5),f.on("keydown",F),f.on("keypress",F),f.on("keyup",F),f.appendTo(CKEDITOR.document.getBody()),w[c]=f);a.focusManager.add(f);r=f;var a=function(){var a=b.getViewPaneSize();f.setStyles({width:a.width+"px",height:a.height+"px"})},k=function(){var a=b.getScrollPosition(),c=CKEDITOR.dialog._.currentTop;f.setStyles({left:a.x+"px",top:a.y+"px"});if(c){do{a=c.getPosition();c.move(a.x,a.y)}while(c=c._.parentDialog)
+}};G=a;b.on("resize",a);a();(!CKEDITOR.env.mac||!CKEDITOR.env.webkit)&&f.focus();if(CKEDITOR.env.ie6Compat){var m=function(){k();arguments.callee.prevScrollHandler.apply(this,arguments)};b.$.setTimeout(function(){m.prevScrollHandler=window.onscroll||function(){};window.onscroll=m},0);k()}}function K(a){r&&(a.focusManager.remove(r),a=CKEDITOR.document.getWindow(),r.hide(),a.removeListener("resize",G),CKEDITOR.env.ie6Compat&&a.$.setTimeout(function(){window.onscroll=window.onscroll&&window.onscroll.prevScrollHandler||
+null},0),G=null)}var s=CKEDITOR.tools.cssLength,S='<div class="cke_reset_all {editorId} {editorDialogClass} {hidpi}" dir="{langDir}" lang="{langCode}" role="dialog" aria-labelledby="cke_dialog_title_{id}"><table class="cke_dialog '+CKEDITOR.env.cssClass+' cke_{langDir}" style="position:absolute" role="presentation"><tr><td role="presentation"><div class="cke_dialog_body" role="presentation"><div id="cke_dialog_title_{id}" class="cke_dialog_title" role="presentation"></div><a id="cke_dialog_close_button_{id}" class="cke_dialog_close_button" href="javascript:void(0)" title="{closeTitle}" role="button"><span class="cke_label">X</span></a><div id="cke_dialog_tabs_{id}" class="cke_dialog_tabs" role="tablist"></div><table class="cke_dialog_contents" role="presentation"><tr><td id="cke_dialog_contents_{id}" class="cke_dialog_contents_body" role="presentation"></td></tr><tr><td id="cke_dialog_footer_{id}" class="cke_dialog_footer" role="presentation"></td></tr></table></div></td></tr></table></div>';
+CKEDITOR.dialog=function(a,b){function c(){var a=l._.focusList;a.sort(function(a,b){return a.tabIndex!=b.tabIndex?b.tabIndex-a.tabIndex:a.focusIndex-b.focusIndex});for(var b=a.length,c=0;c<b;c++)a[c].focusIndex=c}function d(a){var b=l._.focusList,a=a||0;if(!(1>b.length)){var c=l._.currentFocusIndex;try{b[c].getInputElement().$.blur()}catch(f){}for(var d=c=(c+a+b.length)%b.length;a&&!b[d].isFocusable()&&!(d=(d+a+b.length)%b.length,d==c););b[d].focus();"text"==b[d].type&&b[d].select()}}function e(b){if(l==
+CKEDITOR.dialog._.currentTop){var c=b.data.getKeystroke(),f="rtl"==a.lang.dir;o=i=0;if(9==c||c==CKEDITOR.SHIFT+9)c=c==CKEDITOR.SHIFT+9,l._.tabBarMode?(c=c?p.call(l):u.call(l),l.selectPage(c),l._.tabs[c][0].focus()):d(c?-1:1),o=1;else if(c==CKEDITOR.ALT+121&&!l._.tabBarMode&&1<l.getPageCount())l._.tabBarMode=!0,l._.tabs[l._.currentTabId][0].focus(),o=1;else if((37==c||39==c)&&l._.tabBarMode)c=c==(f?39:37)?p.call(l):u.call(l),l.selectPage(c),l._.tabs[c][0].focus(),o=1;else if((13==c||32==c)&&l._.tabBarMode)this.selectPage(this._.currentTabId),
+this._.tabBarMode=!1,this._.currentFocusIndex=-1,d(1),o=1;else if(13==c){c=b.data.getTarget();if(!c.is("a","button","select","textarea")&&(!c.is("input")||"button"!=c.$.type))(c=this.getButton("ok"))&&CKEDITOR.tools.setTimeout(c.click,0,c),o=1;i=1}else if(27==c)(c=this.getButton("cancel"))?CKEDITOR.tools.setTimeout(c.click,0,c):!1!==this.fire("cancel",{hide:!0}).hide&&this.hide(),i=1;else return;g(b)}}function g(a){o?a.data.preventDefault(1):i&&a.data.stopPropagation()}var f=CKEDITOR.dialog._.dialogDefinitions[b],
+k=CKEDITOR.tools.clone(W),m=a.config.dialog_buttonsOrder||"OS",j=a.lang.dir,h={},o,i;("OS"==m&&CKEDITOR.env.mac||"rtl"==m&&"ltr"==j||"ltr"==m&&"rtl"==j)&&k.buttons.reverse();f=CKEDITOR.tools.extend(f(a),k);f=CKEDITOR.tools.clone(f);f=new L(this,f);k=R(a);this._={editor:a,element:k.element,name:b,contentSize:{width:0,height:0},size:{width:0,height:0},contents:{},buttons:{},accessKeyMap:{},tabs:{},tabIdList:[],currentTabId:null,currentTabIndex:null,pageCount:0,lastTab:null,tabBarMode:!1,focusList:[],
+currentFocusIndex:0,hasFocus:!1};this.parts=k.parts;CKEDITOR.tools.setTimeout(function(){a.fire("ariaWidget",this.parts.contents)},0,this);k={position:CKEDITOR.env.ie6Compat?"absolute":"fixed",top:0,visibility:"hidden"};k["rtl"==j?"right":"left"]=0;this.parts.dialog.setStyles(k);CKEDITOR.event.call(this);this.definition=f=CKEDITOR.fire("dialogDefinition",{name:b,definition:f},a).definition;if(!("removeDialogTabs"in a._)&&a.config.removeDialogTabs){k=a.config.removeDialogTabs.split(";");for(j=0;j<
+k.length;j++)if(m=k[j].split(":"),2==m.length){var n=m[0];h[n]||(h[n]=[]);h[n].push(m[1])}a._.removeDialogTabs=h}if(a._.removeDialogTabs&&(h=a._.removeDialogTabs[b]))for(j=0;j<h.length;j++)f.removeContents(h[j]);if(f.onLoad)this.on("load",f.onLoad);if(f.onShow)this.on("show",f.onShow);if(f.onHide)this.on("hide",f.onHide);if(f.onOk)this.on("ok",function(b){a.fire("saveSnapshot");setTimeout(function(){a.fire("saveSnapshot")},0);!1===f.onOk.call(this,b)&&(b.data.hide=!1)});if(f.onCancel)this.on("cancel",
+function(a){!1===f.onCancel.call(this,a)&&(a.data.hide=!1)});var l=this,C=function(a){var b=l._.contents,c=!1,d;for(d in b)for(var f in b[d])if(c=a.call(this,b[d][f]))return};this.on("ok",function(a){C(function(b){if(b.validate){var c=b.validate(this),d="string"==typeof c||!1===c;d&&(a.data.hide=!1,a.stop());P.call(b,!d,"string"==typeof c?c:void 0);return d}})},this,null,0);this.on("cancel",function(b){C(function(c){if(c.isChanged())return confirm(a.lang.common.confirmCancel)||(b.data.hide=!1),!0})},
+this,null,0);this.parts.close.on("click",function(a){!1!==this.fire("cancel",{hide:!0}).hide&&this.hide();a.data.preventDefault()},this);this.changeFocus=d;var v=this._.element;a.focusManager.add(v,1);this.on("show",function(){v.on("keydown",e,this);if(CKEDITOR.env.opera||CKEDITOR.env.gecko)v.on("keypress",g,this)});this.on("hide",function(){v.removeListener("keydown",e);(CKEDITOR.env.opera||CKEDITOR.env.gecko)&&v.removeListener("keypress",g);C(function(a){Q.apply(a)})});this.on("iframeAdded",function(a){(new CKEDITOR.dom.document(a.data.iframe.$.contentWindow.document)).on("keydown",
+e,this,null,0)});this.on("show",function(){c();if(a.config.dialog_startupFocusTab&&1<l._.pageCount)l._.tabBarMode=!0,l._.tabs[l._.currentTabId][0].focus();else if(!this._.hasFocus)if(this._.currentFocusIndex=-1,f.onFocus){var b=f.onFocus.call(this);b&&b.focus()}else d(1)},this,null,4294967295);if(CKEDITOR.env.ie6Compat)this.on("load",function(){var a=this.getElement(),b=a.getFirst();b.remove();b.appendTo(a)},this);U(this);V(this);(new CKEDITOR.dom.text(f.title,CKEDITOR.document)).appendTo(this.parts.title);
+for(j=0;j<f.contents.length;j++)(h=f.contents[j])&&this.addPage(h);this.parts.tabs.on("click",function(a){var b=a.data.getTarget();b.hasClass("cke_dialog_tab")&&(b=b.$.id,this.selectPage(b.substring(4,b.lastIndexOf("_"))),this._.tabBarMode&&(this._.tabBarMode=!1,this._.currentFocusIndex=-1,d(1)),a.data.preventDefault())},this);j=[];h=CKEDITOR.dialog._.uiElementBuilders.hbox.build(this,{type:"hbox",className:"cke_dialog_footer_buttons",widths:[],children:f.buttons},j).getChild();this.parts.footer.setHtml(j.join(""));
+for(j=0;j<h.length;j++)this._.buttons[h[j].id]=h[j]};CKEDITOR.dialog.prototype={destroy:function(){this.hide();this._.element.remove()},resize:function(){return function(a,b){if(!this._.contentSize||!(this._.contentSize.width==a&&this._.contentSize.height==b))CKEDITOR.dialog.fire("resize",{dialog:this,width:a,height:b},this._.editor),this.fire("resize",{width:a,height:b},this._.editor),this.parts.contents.setStyles({width:a+"px",height:b+"px"}),"rtl"==this._.editor.lang.dir&&this._.position&&(this._.position.x=
+CKEDITOR.document.getWindow().getViewPaneSize().width-this._.contentSize.width-parseInt(this._.element.getFirst().getStyle("right"),10)),this._.contentSize={width:a,height:b}}}(),getSize:function(){var a=this._.element.getFirst();return{width:a.$.offsetWidth||0,height:a.$.offsetHeight||0}},move:function(a,b,c){var d=this._.element.getFirst(),e="rtl"==this._.editor.lang.dir,g="fixed"==d.getComputedStyle("position");CKEDITOR.env.ie&&d.setStyle("zoom","100%");if(!g||!this._.position||!(this._.position.x==
+a&&this._.position.y==b))this._.position={x:a,y:b},g||(g=CKEDITOR.document.getWindow().getScrollPosition(),a+=g.x,b+=g.y),e&&(g=this.getSize(),a=CKEDITOR.document.getWindow().getViewPaneSize().width-g.width-a),b={top:(0<b?b:0)+"px"},b[e?"right":"left"]=(0<a?a:0)+"px",d.setStyles(b),c&&(this._.moved=1)},getPosition:function(){return CKEDITOR.tools.extend({},this._.position)},show:function(){var a=this._.element,b=this.definition;!a.getParent()||!a.getParent().equals(CKEDITOR.document.getBody())?a.appendTo(CKEDITOR.document.getBody()):
+a.setStyle("display","block");if(CKEDITOR.env.gecko&&10900>CKEDITOR.env.version){var c=this.parts.dialog;c.setStyle("position","absolute");setTimeout(function(){c.setStyle("position","fixed")},0)}this.resize(this._.contentSize&&this._.contentSize.width||b.width||b.minWidth,this._.contentSize&&this._.contentSize.height||b.height||b.minHeight);this.reset();this.selectPage(this.definition.contents[0].id);null===CKEDITOR.dialog._.currentZIndex&&(CKEDITOR.dialog._.currentZIndex=this._.editor.config.baseFloatZIndex);
+this._.element.getFirst().setStyle("z-index",CKEDITOR.dialog._.currentZIndex+=10);null===CKEDITOR.dialog._.currentTop?(CKEDITOR.dialog._.currentTop=this,this._.parentDialog=null,J(this._.editor)):(this._.parentDialog=CKEDITOR.dialog._.currentTop,this._.parentDialog.getElement().getFirst().$.style.zIndex-=Math.floor(this._.editor.config.baseFloatZIndex/2),CKEDITOR.dialog._.currentTop=this);a.on("keydown",M);a.on(CKEDITOR.env.opera?"keypress":"keyup",N);this._.hasFocus=!1;CKEDITOR.tools.setTimeout(function(){this.layout();
+T(this);this.parts.dialog.setStyle("visibility","");this.fireOnce("load",{});CKEDITOR.ui.fire("ready",this);this.fire("show",{});this._.editor.fire("dialogShow",this);this._.parentDialog||this._.editor.focusManager.lock();this.foreach(function(a){a.setInitValue&&a.setInitValue()})},100,this)},layout:function(){var a=this.parts.dialog,b=this.getSize(),c=CKEDITOR.document.getWindow().getViewPaneSize(),d=(c.width-b.width)/2,e=(c.height-b.height)/2;CKEDITOR.env.ie6Compat||(b.height+(0<e?e:0)>c.height||
+b.width+(0<d?d:0)>c.width?a.setStyle("position","absolute"):a.setStyle("position","fixed"));this.move(this._.moved?this._.position.x:d,this._.moved?this._.position.y:e)},foreach:function(a){for(var b in this._.contents)for(var c in this._.contents[b])a.call(this,this._.contents[b][c]);return this},reset:function(){var a=function(a){a.reset&&a.reset(1)};return function(){this.foreach(a);return this}}(),setupContent:function(){var a=arguments;this.foreach(function(b){b.setup&&b.setup.apply(b,a)})},
+commitContent:function(){var a=arguments;this.foreach(function(b){CKEDITOR.env.ie&&this._.currentFocusIndex==b.focusIndex&&b.getInputElement().$.blur();b.commit&&b.commit.apply(b,a)})},hide:function(){if(this.parts.dialog.isVisible()){this.fire("hide",{});this._.editor.fire("dialogHide",this);this.selectPage(this._.tabIdList[0]);var a=this._.element;a.setStyle("display","none");this.parts.dialog.setStyle("visibility","hidden");for(X(this);CKEDITOR.dialog._.currentTop!=this;)CKEDITOR.dialog._.currentTop.hide();
+if(this._.parentDialog){var b=this._.parentDialog.getElement().getFirst();b.setStyle("z-index",parseInt(b.$.style.zIndex,10)+Math.floor(this._.editor.config.baseFloatZIndex/2))}else K(this._.editor);if(CKEDITOR.dialog._.currentTop=this._.parentDialog)CKEDITOR.dialog._.currentZIndex-=10;else{CKEDITOR.dialog._.currentZIndex=null;a.removeListener("keydown",M);a.removeListener(CKEDITOR.env.opera?"keypress":"keyup",N);var c=this._.editor;c.focus();setTimeout(function(){c.focusManager.unlock()},0)}delete this._.parentDialog;
+this.foreach(function(a){a.resetInitValue&&a.resetInitValue()})}},addPage:function(a){if(!a.requiredContent||this._.editor.filter.check(a.requiredContent)){for(var b=[],c=a.label?' title="'+CKEDITOR.tools.htmlEncode(a.label)+'"':"",d=CKEDITOR.dialog._.uiElementBuilders.vbox.build(this,{type:"vbox",className:"cke_dialog_page_contents",children:a.elements,expand:!!a.expand,padding:a.padding,style:a.style||"width: 100%;"},b),e=this._.contents[a.id]={},g=d.getChild(),f=0;d=g.shift();)!d.notAllowed&&("hbox"!=
+d.type&&"vbox"!=d.type)&&f++,e[d.id]=d,"function"==typeof d.getChild&&g.push.apply(g,d.getChild());f||(a.hidden=!0);b=CKEDITOR.dom.element.createFromHtml(b.join(""));b.setAttribute("role","tabpanel");d=CKEDITOR.env;e="cke_"+a.id+"_"+CKEDITOR.tools.getNextNumber();c=CKEDITOR.dom.element.createFromHtml(['<a class="cke_dialog_tab"',0<this._.pageCount?" cke_last":"cke_first",c,a.hidden?' style="display:none"':"",' id="',e,'"',d.gecko&&10900<=d.version&&!d.hc?"":' href="javascript:void(0)"',' tabIndex="-1" hidefocus="true" role="tab">',
+a.label,"</a>"].join(""));b.setAttribute("aria-labelledby",e);this._.tabs[a.id]=[c,b];this._.tabIdList.push(a.id);!a.hidden&&this._.pageCount++;this._.lastTab=c;this.updateStyle();b.setAttribute("name",a.id);b.appendTo(this.parts.contents);c.unselectable();this.parts.tabs.append(c);a.accessKey&&(O(this,this,"CTRL+"+a.accessKey,Y,Z),this._.accessKeyMap["CTRL+"+a.accessKey]=a.id)}},selectPage:function(a){if(this._.currentTabId!=a&&!0!==this.fire("selectPage",{page:a,currentPage:this._.currentTabId})){for(var b in this._.tabs){var c=
+this._.tabs[b][0],d=this._.tabs[b][1];b!=a&&(c.removeClass("cke_dialog_tab_selected"),d.hide());d.setAttribute("aria-hidden",b!=a)}var e=this._.tabs[a];e[0].addClass("cke_dialog_tab_selected");CKEDITOR.env.ie6Compat||CKEDITOR.env.ie7Compat?(q(e[1]),e[1].show(),setTimeout(function(){q(e[1],1)},0)):e[1].show();this._.currentTabId=a;this._.currentTabIndex=CKEDITOR.tools.indexOf(this._.tabIdList,a)}},updateStyle:function(){this.parts.dialog[(1===this._.pageCount?"add":"remove")+"Class"]("cke_single_page")},
+hidePage:function(a){var b=this._.tabs[a]&&this._.tabs[a][0];b&&(1!=this._.pageCount&&b.isVisible())&&(a==this._.currentTabId&&this.selectPage(p.call(this)),b.hide(),this._.pageCount--,this.updateStyle())},showPage:function(a){if(a=this._.tabs[a]&&this._.tabs[a][0])a.show(),this._.pageCount++,this.updateStyle()},getElement:function(){return this._.element},getName:function(){return this._.name},getContentElement:function(a,b){var c=this._.contents[a];return c&&c[b]},getValueOf:function(a,b){return this.getContentElement(a,
+b).getValue()},setValueOf:function(a,b,c){return this.getContentElement(a,b).setValue(c)},getButton:function(a){return this._.buttons[a]},click:function(a){return this._.buttons[a].click()},disableButton:function(a){return this._.buttons[a].disable()},enableButton:function(a){return this._.buttons[a].enable()},getPageCount:function(){return this._.pageCount},getParentEditor:function(){return this._.editor},getSelectedElement:function(){return this.getParentEditor().getSelection().getSelectedElement()},
+addFocusable:function(a,b){if("undefined"==typeof b)b=this._.focusList.length,this._.focusList.push(new H(this,a,b));else{this._.focusList.splice(b,0,new H(this,a,b));for(var c=b+1;c<this._.focusList.length;c++)this._.focusList[c].focusIndex++}}};CKEDITOR.tools.extend(CKEDITOR.dialog,{add:function(a,b){if(!this._.dialogDefinitions[a]||"function"==typeof b)this._.dialogDefinitions[a]=b},exists:function(a){return!!this._.dialogDefinitions[a]},getCurrent:function(){return CKEDITOR.dialog._.currentTop},
+isTabEnabled:function(a,b,c){a=a.config.removeDialogTabs;return!(a&&a.match(RegExp("(?:^|;)"+b+":"+c+"(?:$|;)","i")))},okButton:function(){var a=function(a,c){c=c||{};return CKEDITOR.tools.extend({id:"ok",type:"button",label:a.lang.common.ok,"class":"cke_dialog_ui_button_ok",onClick:function(a){a=a.data.dialog;!1!==a.fire("ok",{hide:!0}).hide&&a.hide()}},c,!0)};a.type="button";a.override=function(b){return CKEDITOR.tools.extend(function(c){return a(c,b)},{type:"button"},!0)};return a}(),cancelButton:function(){var a=
+function(a,c){c=c||{};return CKEDITOR.tools.extend({id:"cancel",type:"button",label:a.lang.common.cancel,"class":"cke_dialog_ui_button_cancel",onClick:function(a){a=a.data.dialog;!1!==a.fire("cancel",{hide:!0}).hide&&a.hide()}},c,!0)};a.type="button";a.override=function(b){return CKEDITOR.tools.extend(function(c){return a(c,b)},{type:"button"},!0)};return a}(),addUIElement:function(a,b){this._.uiElementBuilders[a]=b}});CKEDITOR.dialog._={uiElementBuilders:{},dialogDefinitions:{},currentTop:null,currentZIndex:null};
+CKEDITOR.event.implementOn(CKEDITOR.dialog);CKEDITOR.event.implementOn(CKEDITOR.dialog.prototype);var W={resizable:CKEDITOR.DIALOG_RESIZE_BOTH,minWidth:600,minHeight:400,buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton]},z=function(a,b,c){for(var d=0,e;e=a[d];d++)if(e.id==b||c&&e[c]&&(e=z(e[c],b,c)))return e;return null},A=function(a,b,c,d,e){if(c){for(var g=0,f;f=a[g];g++){if(f.id==c)return a.splice(g,0,b),b;if(d&&f[d]&&(f=A(f[d],b,c,d,!0)))return f}if(e)return null}a.push(b);return b},
+B=function(a,b,c){for(var d=0,e;e=a[d];d++){if(e.id==b)return a.splice(d,1);if(c&&e[c]&&(e=B(e[c],b,c)))return e}return null},L=function(a,b){this.dialog=a;for(var c=b.contents,d=0,e;e=c[d];d++)c[d]=e&&new I(a,e);CKEDITOR.tools.extend(this,b)};L.prototype={getContents:function(a){return z(this.contents,a)},getButton:function(a){return z(this.buttons,a)},addContents:function(a,b){return A(this.contents,a,b)},addButton:function(a,b){return A(this.buttons,a,b)},removeContents:function(a){B(this.contents,
+a)},removeButton:function(a){B(this.buttons,a)}};I.prototype={get:function(a){return z(this.elements,a,"children")},add:function(a,b){return A(this.elements,a,b,"children")},remove:function(a){B(this.elements,a,"children")}};var G,w={},r,t={},M=function(a){var b=a.data.$.ctrlKey||a.data.$.metaKey,c=a.data.$.altKey,d=a.data.$.shiftKey,e=String.fromCharCode(a.data.$.keyCode);if((b=t[(b?"CTRL+":"")+(c?"ALT+":"")+(d?"SHIFT+":"")+e])&&b.length)b=b[b.length-1],b.keydown&&b.keydown.call(b.uiElement,b.dialog,
+b.key),a.data.preventDefault()},N=function(a){var b=a.data.$.ctrlKey||a.data.$.metaKey,c=a.data.$.altKey,d=a.data.$.shiftKey,e=String.fromCharCode(a.data.$.keyCode);if((b=t[(b?"CTRL+":"")+(c?"ALT+":"")+(d?"SHIFT+":"")+e])&&b.length)b=b[b.length-1],b.keyup&&(b.keyup.call(b.uiElement,b.dialog,b.key),a.data.preventDefault())},O=function(a,b,c,d,e){(t[c]||(t[c]=[])).push({uiElement:a,dialog:b,key:c,keyup:e||a.accessKeyUp,keydown:d||a.accessKeyDown})},X=function(a){for(var b in t){for(var c=t[b],d=c.length-
+1;0<=d;d--)(c[d].dialog==a||c[d].uiElement==a)&&c.splice(d,1);0===c.length&&delete t[b]}},Z=function(a,b){a._.accessKeyMap[b]&&a.selectPage(a._.accessKeyMap[b])},Y=function(){};(function(){CKEDITOR.ui.dialog={uiElement:function(a,b,c,d,e,g,f){if(!(4>arguments.length)){var k=(d.call?d(b):d)||"div",m=["<",k," "],j=(e&&e.call?e(b):e)||{},h=(g&&g.call?g(b):g)||{},o=(f&&f.call?f.call(this,a,b):f)||"",i=this.domId=h.id||CKEDITOR.tools.getNextId()+"_uiElement";this.id=b.id;b.requiredContent&&!a.getParentEditor().filter.check(b.requiredContent)&&
+(j.display="none",this.notAllowed=!0);h.id=i;var n={};b.type&&(n["cke_dialog_ui_"+b.type]=1);b.className&&(n[b.className]=1);b.disabled&&(n.cke_disabled=1);for(var l=h["class"]&&h["class"].split?h["class"].split(" "):[],i=0;i<l.length;i++)l[i]&&(n[l[i]]=1);l=[];for(i in n)l.push(i);h["class"]=l.join(" ");b.title&&(h.title=b.title);n=(b.style||"").split(";");b.align&&(l=b.align,j["margin-left"]="left"==l?0:"auto",j["margin-right"]="right"==l?0:"auto");for(i in j)n.push(i+":"+j[i]);b.hidden&&n.push("display:none");
+for(i=n.length-1;0<=i;i--)""===n[i]&&n.splice(i,1);0<n.length&&(h.style=(h.style?h.style+"; ":"")+n.join("; "));for(i in h)m.push(i+'="'+CKEDITOR.tools.htmlEncode(h[i])+'" ');m.push(">",o,"</",k,">");c.push(m.join(""));(this._||(this._={})).dialog=a;"boolean"==typeof b.isChanged&&(this.isChanged=function(){return b.isChanged});"function"==typeof b.isChanged&&(this.isChanged=b.isChanged);"function"==typeof b.setValue&&(this.setValue=CKEDITOR.tools.override(this.setValue,function(a){return function(c){a.call(this,
+b.setValue.call(this,c))}}));"function"==typeof b.getValue&&(this.getValue=CKEDITOR.tools.override(this.getValue,function(a){return function(){return b.getValue.call(this,a.call(this))}}));CKEDITOR.event.implementOn(this);this.registerEvents(b);this.accessKeyUp&&(this.accessKeyDown&&b.accessKey)&&O(this,a,"CTRL+"+b.accessKey);var p=this;a.on("load",function(){var b=p.getInputElement();if(b){var c=p.type in{checkbox:1,ratio:1}&&CKEDITOR.env.ie&&CKEDITOR.env.version<8?"cke_dialog_ui_focused":"";b.on("focus",
+function(){a._.tabBarMode=false;a._.hasFocus=true;p.fire("focus");c&&this.addClass(c)});b.on("blur",function(){p.fire("blur");c&&this.removeClass(c)})}});this.keyboardFocusable&&(this.tabIndex=b.tabIndex||0,this.focusIndex=a._.focusList.push(this)-1,this.on("focus",function(){a._.currentFocusIndex=p.focusIndex}));CKEDITOR.tools.extend(this,b)}},hbox:function(a,b,c,d,e){if(!(4>arguments.length)){this._||(this._={});var g=this._.children=b,f=e&&e.widths||null,k=e&&e.height||null,m,j={role:"presentation"};
+e&&e.align&&(j.align=e.align);CKEDITOR.ui.dialog.uiElement.call(this,a,e||{type:"hbox"},d,"table",{},j,function(){var a=['<tbody><tr class="cke_dialog_ui_hbox">'];for(m=0;m<c.length;m++){var b="cke_dialog_ui_hbox_child",d=[];0===m&&(b="cke_dialog_ui_hbox_first");m==c.length-1&&(b="cke_dialog_ui_hbox_last");a.push('<td class="',b,'" role="presentation" ');f?f[m]&&d.push("width:"+s(f[m])):d.push("width:"+Math.floor(100/c.length)+"%");k&&d.push("height:"+s(k));e&&void 0!=e.padding&&d.push("padding:"+
+s(e.padding));CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&g[m].align)&&d.push("text-align:"+g[m].align);0<d.length&&a.push('style="'+d.join("; ")+'" ');a.push(">",c[m],"</td>")}a.push("</tr></tbody>");return a.join("")})}},vbox:function(a,b,c,d,e){if(!(3>arguments.length)){this._||(this._={});var g=this._.children=b,f=e&&e.width||null,k=e&&e.heights||null;CKEDITOR.ui.dialog.uiElement.call(this,a,e||{type:"vbox"},d,"div",null,{role:"presentation"},function(){var b=['<table role="presentation" cellspacing="0" border="0" '];
+b.push('style="');e&&e.expand&&b.push("height:100%;");b.push("width:"+s(f||"100%"),";");CKEDITOR.env.webkit&&b.push("float:none;");b.push('"');b.push('align="',CKEDITOR.tools.htmlEncode(e&&e.align||("ltr"==a.getParentEditor().lang.dir?"left":"right")),'" ');b.push("><tbody>");for(var d=0;d<c.length;d++){var h=[];b.push('<tr><td role="presentation" ');f&&h.push("width:"+s(f||"100%"));k?h.push("height:"+s(k[d])):e&&e.expand&&h.push("height:"+Math.floor(100/c.length)+"%");e&&void 0!=e.padding&&h.push("padding:"+
+s(e.padding));CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&g[d].align)&&h.push("text-align:"+g[d].align);0<h.length&&b.push('style="',h.join("; "),'" ');b.push(' class="cke_dialog_ui_vbox_child">',c[d],"</td></tr>")}b.push("</tbody></table>");return b.join("")})}}}})();CKEDITOR.ui.dialog.uiElement.prototype={getElement:function(){return CKEDITOR.document.getById(this.domId)},getInputElement:function(){return this.getElement()},getDialog:function(){return this._.dialog},setValue:function(a,b){this.getInputElement().setValue(a);
+!b&&this.fire("change",{value:a});return this},getValue:function(){return this.getInputElement().getValue()},isChanged:function(){return!1},selectParentTab:function(){for(var a=this.getInputElement();(a=a.getParent())&&-1==a.$.className.search("cke_dialog_page_contents"););if(!a)return this;a=a.getAttribute("name");this._.dialog._.currentTabId!=a&&this._.dialog.selectPage(a);return this},focus:function(){this.selectParentTab().getInputElement().focus();return this},registerEvents:function(a){var b=
+/^on([A-Z]\w+)/,c,d=function(a,b,c,d){b.on("load",function(){a.getInputElement().on(c,d,a)})},e;for(e in a)if(c=e.match(b))this.eventProcessors[e]?this.eventProcessors[e].call(this,this._.dialog,a[e]):d(this,this._.dialog,c[1].toLowerCase(),a[e]);return this},eventProcessors:{onLoad:function(a,b){a.on("load",b,this)},onShow:function(a,b){a.on("show",b,this)},onHide:function(a,b){a.on("hide",b,this)}},accessKeyDown:function(){this.focus()},accessKeyUp:function(){},disable:function(){var a=this.getElement();
+this.getInputElement().setAttribute("disabled","true");a.addClass("cke_disabled")},enable:function(){var a=this.getElement();this.getInputElement().removeAttribute("disabled");a.removeClass("cke_disabled")},isEnabled:function(){return!this.getElement().hasClass("cke_disabled")},isVisible:function(){return this.getInputElement().isVisible()},isFocusable:function(){return!this.isEnabled()||!this.isVisible()?!1:!0}};CKEDITOR.ui.dialog.hbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,
+{getChild:function(a){if(1>arguments.length)return this._.children.concat();a.splice||(a=[a]);return 2>a.length?this._.children[a[0]]:this._.children[a[0]]&&this._.children[a[0]].getChild?this._.children[a[0]].getChild(a.slice(1,a.length)):null}},!0);CKEDITOR.ui.dialog.vbox.prototype=new CKEDITOR.ui.dialog.hbox;(function(){var a={build:function(a,c,d){for(var e=c.children,g,f=[],k=[],m=0;m<e.length&&(g=e[m]);m++){var j=[];f.push(j);k.push(CKEDITOR.dialog._.uiElementBuilders[g.type].build(a,g,j))}return new CKEDITOR.ui.dialog[c.type](a,
+k,f,d,c)}};CKEDITOR.dialog.addUIElement("hbox",a);CKEDITOR.dialog.addUIElement("vbox",a)})();CKEDITOR.dialogCommand=function(a,b){this.dialogName=a;CKEDITOR.tools.extend(this,b,!0)};CKEDITOR.dialogCommand.prototype={exec:function(a){CKEDITOR.env.opera?CKEDITOR.tools.setTimeout(function(){a.openDialog(this.dialogName)},0,this):a.openDialog(this.dialogName)},canUndo:!1,editorFocus:1};(function(){var a=/^([a]|[^a])+$/,b=/^\d*$/,c=/^\d*(?:\.\d+)?$/,d=/^(((\d*(\.\d+))|(\d*))(px|\%)?)?$/,e=/^(((\d*(\.\d+))|(\d*))(px|em|ex|in|cm|mm|pt|pc|\%)?)?$/i,
+g=/^(\s*[\w-]+\s*:\s*[^:;]+(?:;|$))*$/;CKEDITOR.VALIDATE_OR=1;CKEDITOR.VALIDATE_AND=2;CKEDITOR.dialog.validate={functions:function(){var a=arguments;return function(){var b=this&&this.getValue?this.getValue():a[0],c=void 0,d=CKEDITOR.VALIDATE_AND,e=[],g;for(g=0;g<a.length;g++)if("function"==typeof a[g])e.push(a[g]);else break;g<a.length&&"string"==typeof a[g]&&(c=a[g],g++);g<a.length&&"number"==typeof a[g]&&(d=a[g]);var i=d==CKEDITOR.VALIDATE_AND?!0:!1;for(g=0;g<e.length;g++)i=d==CKEDITOR.VALIDATE_AND?
+i&&e[g](b):i||e[g](b);return!i?c:!0}},regex:function(a,b){return function(c){c=this&&this.getValue?this.getValue():c;return!a.test(c)?b:!0}},notEmpty:function(b){return this.regex(a,b)},integer:function(a){return this.regex(b,a)},number:function(a){return this.regex(c,a)},cssLength:function(a){return this.functions(function(a){return e.test(CKEDITOR.tools.trim(a))},a)},htmlLength:function(a){return this.functions(function(a){return d.test(CKEDITOR.tools.trim(a))},a)},inlineStyle:function(a){return this.functions(function(a){return g.test(CKEDITOR.tools.trim(a))},
+a)},equals:function(a,b){return this.functions(function(b){return b==a},b)},notEqual:function(a,b){return this.functions(function(b){return b!=a},b)}};CKEDITOR.on("instanceDestroyed",function(a){if(CKEDITOR.tools.isEmpty(CKEDITOR.instances)){for(var b;b=CKEDITOR.dialog._.currentTop;)b.hide();for(var c in w)w[c].remove();w={}}var a=a.editor._.storedDialogs,d;for(d in a)a[d].destroy()})})();CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{openDialog:function(a,b){var c=null,d=CKEDITOR.dialog._.dialogDefinitions[a];
+null===CKEDITOR.dialog._.currentTop&&J(this);if("function"==typeof d)c=this._.storedDialogs||(this._.storedDialogs={}),c=c[a]||(c[a]=new CKEDITOR.dialog(this,a)),b&&b.call(c,c),c.show();else{if("failed"==d)throw K(this),Error('[CKEDITOR.dialog.openDialog] Dialog "'+a+'" failed when loading definition.');"string"==typeof d&&CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(d),function(){"function"!=typeof CKEDITOR.dialog._.dialogDefinitions[a]&&(CKEDITOR.dialog._.dialogDefinitions[a]="failed");this.openDialog(a,
+b)},this,0,1)}CKEDITOR.skin.loadPart("dialog");return c}})})();CKEDITOR.plugins.add("dialog",{requires:"dialogui",init:function(p){p.on("contentDom",function(){var u=p.editable();u.attachListener(u,"dblclick",function(q){if(p.readOnly)return!1;q={element:q.data.getTarget()};p.fire("doubleclick",q);q.dialog&&p.openDialog(q.dialog);return 1})})}});CKEDITOR.plugins.add("about",{requires:"dialog",init:function(a){var b=a.addCommand("about",new CKEDITOR.dialogCommand("about"));b.modes={wysiwyg:1,source:1};b.canUndo=!1;b.readOnly=1;a.ui.addButton&&a.ui.addButton("About",{label:a.lang.about.title,command:"about",toolbar:"about"});CKEDITOR.dialog.add("about",this.path+"dialogs/about.js")}});(function(){CKEDITOR.plugins.add("a11yhelp",{requires:"dialog",availableLangs:{ar:1,bg:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,en:1,eo:1,es:1,et:1,fa:1,fi:1,fr:1,"fr-ca":1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,id:1,it:1,ja:1,km:1,ku:1,lt:1,lv:1,mk:1,mn:1,nb:1,nl:1,no:1,pl:1,pt:1,"pt-br":1,ro:1,ru:1,si:1,sk:1,sl:1,sq:1,sr:1,"sr-latn":1,sv:1,th:1,tr:1,ug:1,uk:1,vi:1,"zh-cn":1},init:function(b){var c=this;b.addCommand("a11yHelp",{exec:function(){var a=b.langCode,a=c.availableLangs[a]?a:c.availableLangs[a.replace(/-.*/,
+"")]?a.replace(/-.*/,""):"en";CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(c.path+"dialogs/lang/"+a+".js"),function(){b.lang.a11yhelp=c.langEntries[a];b.openDialog("a11yHelp")})},modes:{wysiwyg:1,source:1},readOnly:1,canUndo:!1});b.setKeystroke(CKEDITOR.ALT+48,"a11yHelp");CKEDITOR.dialog.add("a11yHelp",this.path+"dialogs/a11yhelp.js")}})})();(function(){function f(c){var a=this.att,c=c&&c.hasAttribute(a)&&c.getAttribute(a)||"";void 0!==c&&this.setValue(c)}function g(){for(var c,a=0;a<arguments.length;a++)if(arguments[a]instanceof CKEDITOR.dom.element){c=arguments[a];break}if(c){var a=this.att,b=this.getValue();b?c.setAttribute(a,b):c.removeAttribute(a,b)}}var i={id:1,dir:1,classes:1,styles:1};CKEDITOR.plugins.add("dialogadvtab",{requires:"dialog",allowedContent:function(c){c||(c=i);var a=[];c.id&&a.push("id");c.dir&&a.push("dir");var b=
+"";a.length&&(b+="["+a.join(",")+"]");c.classes&&(b+="(*)");c.styles&&(b+="{*}");return b},createAdvancedTab:function(c,a,b){a||(a=i);var d=c.lang.common,h={id:"advanced",label:d.advancedTab,title:d.advancedTab,elements:[{type:"vbox",padding:1,children:[]}]},e=[];if(a.id||a.dir)a.id&&e.push({id:"advId",att:"id",type:"text",requiredContent:b?b+"[id]":null,label:d.id,setup:f,commit:g}),a.dir&&e.push({id:"advLangDir",att:"dir",type:"select",requiredContent:b?b+"[dir]":null,label:d.langDir,"default":"",
+style:"width:100%",items:[[d.notSet,""],[d.langDirLTR,"ltr"],[d.langDirRTL,"rtl"]],setup:f,commit:g}),h.elements[0].children.push({type:"hbox",widths:["50%","50%"],children:[].concat(e)});if(a.styles||a.classes)e=[],a.styles&&e.push({id:"advStyles",att:"style",type:"text",requiredContent:b?b+"{cke-xyz}":null,label:d.styles,"default":"",validate:CKEDITOR.dialog.validate.inlineStyle(d.invalidInlineStyle),onChange:function(){},getStyle:function(a,c){var b=this.getValue().match(RegExp("(?:^|;)\\s*"+a+
+"\\s*:\\s*([^;]*)","i"));return b?b[1]:c},updateStyle:function(a,b){var d=this.getValue(),e=c.document.createElement("span");e.setAttribute("style",d);e.setStyle(a,b);d=CKEDITOR.tools.normalizeCssText(e.getAttribute("style"));this.setValue(d,1)},setup:f,commit:g}),a.classes&&e.push({type:"hbox",widths:["45%","55%"],children:[{id:"advCSSClasses",att:"class",type:"text",requiredContent:b?b+"(cke-xyz)":null,label:d.cssClasses,"default":"",setup:f,commit:g}]}),h.elements[0].children.push({type:"hbox",
+widths:["50%","50%"],children:[].concat(e)});return h}})})();CKEDITOR.plugins.add("basicstyles",{init:function(c){var e=0,d=function(g,d,b,a){if(a){var a=new CKEDITOR.style(a),f=h[b];f.unshift(a);c.attachStyleStateChange(a,function(a){!c.readOnly&&c.getCommand(b).setState(a)});c.addCommand(b,new CKEDITOR.styleCommand(a,{contentForms:f}));c.ui.addButton&&c.ui.addButton(g,{label:d,command:b,toolbar:"basicstyles,"+(e+=10)})}},h={bold:["strong","b",["span",function(a){a=a.styles["font-weight"];return"bold"==a||700<=+a}]],italic:["em","i",["span",function(a){return"italic"==
+a.styles["font-style"]}]],underline:["u",["span",function(a){return"underline"==a.styles["text-decoration"]}]],strike:["s","strike",["span",function(a){return"line-through"==a.styles["text-decoration"]}]],subscript:["sub"],superscript:["sup"]},b=c.config,a=c.lang.basicstyles;d("Bold",a.bold,"bold",b.coreStyles_bold);d("Italic",a.italic,"italic",b.coreStyles_italic);d("Underline",a.underline,"underline",b.coreStyles_underline);d("Strike",a.strike,"strike",b.coreStyles_strike);d("Subscript",a.subscript,
+"subscript",b.coreStyles_subscript);d("Superscript",a.superscript,"superscript",b.coreStyles_superscript);c.setKeystroke([[CKEDITOR.CTRL+66,"bold"],[CKEDITOR.CTRL+73,"italic"],[CKEDITOR.CTRL+85,"underline"]])}});CKEDITOR.config.coreStyles_bold={element:"strong",overrides:"b"};CKEDITOR.config.coreStyles_italic={element:"em",overrides:"i"};CKEDITOR.config.coreStyles_underline={element:"u"};CKEDITOR.config.coreStyles_strike={element:"s",overrides:"strike"};CKEDITOR.config.coreStyles_subscript={element:"sub"};
+CKEDITOR.config.coreStyles_superscript={element:"sup"};(function(){function n(a,f,d,b){if(!a.isReadOnly()&&!a.equals(d.editable())){CKEDITOR.dom.element.setMarker(b,a,"bidi_processed",1);for(var b=a,c=d.editable();(b=b.getParent())&&!b.equals(c);)if(b.getCustomData("bidi_processed")){a.removeStyle("direction");a.removeAttribute("dir");return}b="useComputedState"in d.config?d.config.useComputedState:1;if((b?a.getComputedStyle("direction"):a.getStyle("direction")||a.hasAttribute("dir"))!=f)a.removeStyle("direction"),b?(a.removeAttribute("dir"),f!=a.getComputedStyle("direction")&&
+a.setAttribute("dir",f)):a.setAttribute("dir",f),d.forceNextSelectionCheck()}}function r(a,f,d){var b=a.getCommonAncestor(!1,!0),a=a.clone();a.enlarge(d==CKEDITOR.ENTER_BR?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:CKEDITOR.ENLARGE_BLOCK_CONTENTS);if(a.checkBoundaryOfElement(b,CKEDITOR.START)&&a.checkBoundaryOfElement(b,CKEDITOR.END)){for(var c;b&&b.type==CKEDITOR.NODE_ELEMENT&&(c=b.getParent())&&1==c.getChildCount()&&!(b.getName()in f);)b=c;return b.type==CKEDITOR.NODE_ELEMENT&&b.getName()in f&&b}}function m(a){return{context:"p",
+allowedContent:{"h1 h2 h3 h4 h5 h6 table ul ol blockquote div tr p div li td":{propertiesOnly:!0,attributes:"dir"}},requiredContent:"p[dir]",refresh:function(a,d){var b=a.config.useComputedState,c,b=void 0===b||b;if(!b){c=d.lastElement;for(var h=a.editable();c&&!(c.getName()in q||c.equals(h));){var e=c.getParent();if(!e)break;c=e}}c=c||d.block||d.blockLimit;c.equals(a.editable())&&(h=a.getSelection().getRanges()[0].getEnclosedNode())&&h.type==CKEDITOR.NODE_ELEMENT&&(c=h);c&&(b=b?c.getComputedStyle("direction"):
+c.getStyle("direction")||c.getAttribute("dir"),a.getCommand("bidirtl").setState("rtl"==b?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF),a.getCommand("bidiltr").setState("ltr"==b?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF));b=(d.block||d.blockLimit||a.editable()).getDirection(1);if(b!=(a._.selDir||a.lang.dir))a._.selDir=b,a.fire("contentDirChanged",b)},exec:function(f){var d=f.getSelection(),b=f.config.enterMode,c=d.getRanges();if(c&&c.length){for(var h={},e=d.createBookmarks(),c=c.createIterator(),g,
+j=0;g=c.getNextRange(1);){var i=g.getEnclosedNode();if(!i||i&&!(i.type==CKEDITOR.NODE_ELEMENT&&i.getName()in o))i=r(g,p,b);i&&n(i,a,f,h);var k=new CKEDITOR.dom.walker(g),l=e[j].startNode,m=e[j++].endNode;k.evaluator=function(a){return!!(a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in p&&!(a.getName()==(b==CKEDITOR.ENTER_P?"p":"div")&&a.getParent().type==CKEDITOR.NODE_ELEMENT&&"blockquote"==a.getParent().getName())&&a.getPosition(l)&CKEDITOR.POSITION_FOLLOWING&&(a.getPosition(m)&CKEDITOR.POSITION_PRECEDING+
+CKEDITOR.POSITION_CONTAINS)==CKEDITOR.POSITION_PRECEDING)};for(;i=k.next();)n(i,a,f,h);g=g.createIterator();for(g.enlargeBr=b!=CKEDITOR.ENTER_BR;i=g.getNextParagraph(b==CKEDITOR.ENTER_P?"p":"div");)n(i,a,f,h)}CKEDITOR.dom.element.clearAllMarkers(h);f.forceNextSelectionCheck();d.selectBookmarks(e);f.focus()}}}}function s(a){var f=a==j.setAttribute,d=a==j.removeAttribute,b=/\bdirection\s*:\s*(.*?)\s*(:?$|;)/;return function(c,h){if(!this.isReadOnly()){var e;if(e=c==(f||d?"dir":"direction")||"style"==
+c&&(d||b.test(h))){a:{e=this;for(var g=e.getDocument().getBody().getParent();e;){if(e.equals(g)){e=!1;break a}e=e.getParent()}e=!0}e=!e}if(e&&(e=this.getDirection(1),g=a.apply(this,arguments),e!=this.getDirection(1)))return this.getDocument().fire("dirChanged",this),g}return a.apply(this,arguments)}}var p={table:1,ul:1,ol:1,blockquote:1,div:1},o={},q={};CKEDITOR.tools.extend(o,p,{tr:1,p:1,div:1,li:1});CKEDITOR.tools.extend(q,o,{td:1});CKEDITOR.plugins.add("bidi",{init:function(a){function f(b,c,d,
+e,f){a.addCommand(d,new CKEDITOR.command(a,e));a.ui.addButton&&a.ui.addButton(b,{label:c,command:d,toolbar:"bidi,"+f})}if(!a.blockless){var d=a.lang.bidi;a.ui.addToolbarGroup&&a.ui.addToolbarGroup("bidi","align","paragraph");f("BidiLtr",d.ltr,"bidiltr",m("ltr"),10);f("BidiRtl",d.rtl,"bidirtl",m("rtl"),20);a.on("contentDom",function(){a.document.on("dirChanged",function(b){a.fire("dirChanged",{node:b.data,dir:b.data.getDirection(1)})})});a.on("contentDirChanged",function(b){var b=(a.lang.dir!=b.data?
+"add":"remove")+"Class",c=a.ui.space(a.config.toolbarLocation);if(c)c[b]("cke_mixed_dir_content")})}}});for(var j=CKEDITOR.dom.element.prototype,l=["setStyle","removeStyle","setAttribute","removeAttribute"],k=0;k<l.length;k++)j[l[k]]=CKEDITOR.tools.override(j[l[k]],s)})();(function(){var k={exec:function(g){var a=g.getCommand("blockquote").state,i=g.getSelection(),c=i&&i.getRanges(!0)[0];if(c){var h=i.createBookmarks();if(CKEDITOR.env.ie){var e=h[0].startNode,b=h[0].endNode,d;if(e&&"blockquote"==e.getParent().getName())for(d=e;d=d.getNext();)if(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()){e.move(d,!0);break}if(b&&"blockquote"==b.getParent().getName())for(d=b;d=d.getPrevious();)if(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()){b.move(d);break}}var f=c.createIterator();
+f.enlargeBr=g.config.enterMode!=CKEDITOR.ENTER_BR;if(a==CKEDITOR.TRISTATE_OFF){for(e=[];a=f.getNextParagraph();)e.push(a);1>e.length&&(a=g.document.createElement(g.config.enterMode==CKEDITOR.ENTER_P?"p":"div"),b=h.shift(),c.insertNode(a),a.append(new CKEDITOR.dom.text("﻿",g.document)),c.moveToBookmark(b),c.selectNodeContents(a),c.collapse(!0),b=c.createBookmark(),e.push(a),h.unshift(b));d=e[0].getParent();c=[];for(b=0;b<e.length;b++)a=e[b],d=d.getCommonAncestor(a.getParent());for(a={table:1,tbody:1,
+tr:1,ol:1,ul:1};a[d.getName()];)d=d.getParent();for(b=null;0<e.length;){for(a=e.shift();!a.getParent().equals(d);)a=a.getParent();a.equals(b)||c.push(a);b=a}for(;0<c.length;)if(a=c.shift(),"blockquote"==a.getName()){for(b=new CKEDITOR.dom.documentFragment(g.document);a.getFirst();)b.append(a.getFirst().remove()),e.push(b.getLast());b.replace(a)}else e.push(a);c=g.document.createElement("blockquote");for(c.insertBefore(e[0]);0<e.length;)a=e.shift(),c.append(a)}else if(a==CKEDITOR.TRISTATE_ON){b=[];
+for(d={};a=f.getNextParagraph();){for(e=c=null;a.getParent();){if("blockquote"==a.getParent().getName()){c=a.getParent();e=a;break}a=a.getParent()}c&&(e&&!e.getCustomData("blockquote_moveout"))&&(b.push(e),CKEDITOR.dom.element.setMarker(d,e,"blockquote_moveout",!0))}CKEDITOR.dom.element.clearAllMarkers(d);a=[];e=[];for(d={};0<b.length;)f=b.shift(),c=f.getParent(),f.getPrevious()?f.getNext()?(f.breakParent(f.getParent()),e.push(f.getNext())):f.remove().insertAfter(c):f.remove().insertBefore(c),c.getCustomData("blockquote_processed")||
+(e.push(c),CKEDITOR.dom.element.setMarker(d,c,"blockquote_processed",!0)),a.push(f);CKEDITOR.dom.element.clearAllMarkers(d);for(b=e.length-1;0<=b;b--){c=e[b];a:{d=c;for(var f=0,k=d.getChildCount(),j=void 0;f<k&&(j=d.getChild(f));f++)if(j.type==CKEDITOR.NODE_ELEMENT&&j.isBlockBoundary()){d=!1;break a}d=!0}d&&c.remove()}if(g.config.enterMode==CKEDITOR.ENTER_BR)for(c=!0;a.length;)if(f=a.shift(),"div"==f.getName()){b=new CKEDITOR.dom.documentFragment(g.document);c&&(f.getPrevious()&&!(f.getPrevious().type==
+CKEDITOR.NODE_ELEMENT&&f.getPrevious().isBlockBoundary()))&&b.append(g.document.createElement("br"));for(c=f.getNext()&&!(f.getNext().type==CKEDITOR.NODE_ELEMENT&&f.getNext().isBlockBoundary());f.getFirst();)f.getFirst().remove().appendTo(b);c&&b.append(g.document.createElement("br"));b.replace(f);c=!1}}i.selectBookmarks(h);g.focus()}},refresh:function(g,a){this.setState(g.elementPath(a.block||a.blockLimit).contains("blockquote",1)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)},context:"blockquote",
+allowedContent:"blockquote",requiredContent:"blockquote"};CKEDITOR.plugins.add("blockquote",{init:function(g){g.blockless||(g.addCommand("blockquote",k),g.ui.addButton&&g.ui.addButton("Blockquote",{label:g.lang.blockquote.toolbar,command:"blockquote",toolbar:"blocks,10"}))}})})();(function(){function w(a){function b(){var d=a.editable();d.on(q,function(a){(!CKEDITOR.env.ie||!m)&&u(a)});CKEDITOR.env.ie&&d.on("paste",function(d){r||(f(),d.data.preventDefault(),u(d),k("paste")||a.openDialog("paste"))});CKEDITOR.env.ie&&(d.on("contextmenu",h,null,null,0),d.on("beforepaste",function(a){a.data&&!a.data.$.ctrlKey&&h()},null,null,0));d.on("beforecut",function(){!m&&l(a)});var v;d.attachListener(CKEDITOR.env.ie?d:a.document.getDocumentElement(),"mouseup",function(){v=setTimeout(function(){s()},
+0)});a.on("destroy",function(){clearTimeout(v)});d.on("keyup",s)}function e(d){return{type:d,canUndo:"cut"==d,startDisabled:!0,exec:function(){"cut"==this.type&&l();var d;var b=this.type;if(CKEDITOR.env.ie)d=k(b);else try{d=a.document.$.execCommand(b,!1,null)}catch(c){d=!1}d||alert(a.lang.clipboard[this.type+"Error"]);return d}}}function c(){return{canUndo:!1,async:!0,exec:function(a,b){var c=function(b,c){b&&g(b.type,b.dataValue,!!c);a.fire("afterCommandExec",{name:"paste",command:e,returnValue:!!b})},
+e=this;"string"==typeof b?c({type:"auto",dataValue:b},1):a.getClipboardData(c)}}}function f(){r=1;setTimeout(function(){r=0},100)}function h(){m=1;setTimeout(function(){m=0},10)}function k(d){var b=a.document,c=b.getBody(),e=!1,l=function(){e=!0};c.on(d,l);(7<CKEDITOR.env.version?b.$:b.$.selection.createRange()).execCommand(d);c.removeListener(d,l);return e}function g(d,b,c){d={type:d};if(c&&!a.fire("beforePaste",d)||!b)return!1;d.dataValue=b;return a.fire("paste",d)}function l(){if(CKEDITOR.env.ie&&
+!CKEDITOR.env.quirks){var d=a.getSelection(),b,c,e;if(d.getType()==CKEDITOR.SELECTION_ELEMENT&&(b=d.getSelectedElement()))c=d.getRanges()[0],e=a.document.createText(""),e.insertBefore(b),c.setStartBefore(e),c.setEndAfter(b),d.selectRanges([c]),setTimeout(function(){b.getParent()&&(e.remove(),d.selectElement(b))},0)}}function i(d,b){var c=a.document,e=a.editable(),l=function(a){a.cancel()},i=CKEDITOR.env.gecko&&10902>=CKEDITOR.env.version,f;if(!c.getById("cke_pastebin")){var h=a.getSelection(),o=h.createBookmarks(),
+j=new CKEDITOR.dom.element((CKEDITOR.env.webkit||e.is("body"))&&!CKEDITOR.env.ie&&!CKEDITOR.env.opera?"body":"div",c);j.setAttribute("id","cke_pastebin");CKEDITOR.env.opera&&j.appendBogus();var g=0,c=c.getWindow();i?(j.insertAfter(o[0].startNode),j.setStyle("display","inline")):(CKEDITOR.env.webkit?(e.append(j),j.addClass("cke_editable"),e.is("body")||(i="static"!=e.getComputedStyle("position")?e:CKEDITOR.dom.element.get(e.$.offsetParent),g=i.getDocumentPosition().y)):e.getAscendant(CKEDITOR.env.ie||
+CKEDITOR.env.opera?"body":"html",1).append(j),j.setStyles({position:"absolute",top:c.getScrollPosition().y-g+10+"px",width:"1px",height:Math.max(1,c.getViewPaneSize().height-20)+"px",overflow:"hidden",margin:0,padding:0}));(i=j.getParent().isReadOnly())?(j.setOpacity(0),j.setAttribute("contenteditable",!0)):j.setStyle("ltr"==a.config.contentsLangDirection?"left":"right","-1000px");a.on("selectionChange",l,null,null,0);CKEDITOR.env.webkit&&(f=e.once("blur",l,null,null,-100));i&&j.focus();i=new CKEDITOR.dom.range(j);
+i.selectNodeContents(j);var k=i.select();CKEDITOR.env.ie&&(f=e.once("blur",function(){a.lockSelection(k)}));var m=CKEDITOR.document.getWindow().getScrollPosition().y;setTimeout(function(){if(CKEDITOR.env.webkit||CKEDITOR.env.opera)CKEDITOR.document[CKEDITOR.env.webkit?"getBody":"getDocumentElement"]().$.scrollTop=m;f&&f.removeListener();CKEDITOR.env.ie&&e.focus();h.selectBookmarks(o);j.remove();var d;if(CKEDITOR.env.webkit&&(d=j.getFirst())&&d.is&&d.hasClass("Apple-style-span"))j=d;a.removeListener("selectionChange",
+l);b(j.getHtml())},0)}}function o(){if(CKEDITOR.env.ie){a.focus();f();var d=a.focusManager;d.lock();if(a.editable().fire(q)&&!k("paste"))return d.unlock(),!1;d.unlock()}else try{if(a.editable().fire(q)&&!a.document.$.execCommand("Paste",!1,null))throw 0;}catch(b){return!1}return!0}function p(d){if("wysiwyg"==a.mode)switch(d.data.keyCode){case CKEDITOR.CTRL+86:case CKEDITOR.SHIFT+45:d=a.editable();f();!CKEDITOR.env.ie&&d.fire("beforepaste");(CKEDITOR.env.opera||CKEDITOR.env.gecko&&10900>CKEDITOR.env.version)&&
+d.fire("paste");break;case CKEDITOR.CTRL+88:case CKEDITOR.SHIFT+46:a.fire("saveSnapshot"),setTimeout(function(){a.fire("saveSnapshot")},0)}}function u(d){var b={type:"auto"},c=a.fire("beforePaste",b);i(d,function(a){a=a.replace(/<span[^>]+data-cke-bookmark[^<]*?<\/span>/ig,"");c&&g(b.type,a,0,1)})}function s(){if("wysiwyg"==a.mode){var b=n("Paste");a.getCommand("cut").setState(n("Cut"));a.getCommand("copy").setState(n("Copy"));a.getCommand("paste").setState(b);a.fire("pasteState",b)}}function n(b){var c;
+if(t&&b in{Paste:1,Cut:1})return CKEDITOR.TRISTATE_DISABLED;if("Paste"==b){CKEDITOR.env.ie&&(m=1);try{c=a.document.$.queryCommandEnabled(b)||CKEDITOR.env.webkit}catch(e){}m=0}else b=a.getSelection(),c=b.getRanges(),c=b.getType()!=CKEDITOR.SELECTION_NONE&&!(1==c.length&&c[0].collapsed);return c?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED}var m=0,r=0,t=0,q=CKEDITOR.env.ie?"beforepaste":"paste";(function(){a.on("key",p);a.on("contentDom",b);a.on("selectionChange",function(a){t=a.data.selection.getRanges()[0].checkReadOnly();
+s()});a.contextMenu&&a.contextMenu.addListener(function(a,b){t=b.getRanges()[0].checkReadOnly();return{cut:n("Cut"),copy:n("Copy"),paste:n("Paste")}})})();(function(){function b(c,e,d,l,i){var f=a.lang.clipboard[e];a.addCommand(e,d);a.ui.addButton&&a.ui.addButton(c,{label:f,command:e,toolbar:"clipboard,"+l});a.addMenuItems&&a.addMenuItem(e,{label:f,command:e,group:"clipboard",order:i})}b("Cut","cut",e("cut"),10,1);b("Copy","copy",e("copy"),20,4);b("Paste","paste",c(),30,8)})();a.getClipboardData=
+function(b,c){function e(a){a.removeListener();a.cancel();c(a.data)}function l(a){a.removeListener();a.cancel();g=!0;c({type:h,dataValue:a.data})}function i(){this.customTitle=b&&b.title}var f=!1,h="auto",g=!1;c||(c=b,b=null);a.on("paste",e,null,null,0);a.on("beforePaste",function(a){a.removeListener();f=true;h=a.data.type},null,null,1E3);!1===o()&&(a.removeListener("paste",e),f&&a.fire("pasteDialog",i)?(a.on("pasteDialogCommit",l),a.on("dialogHide",function(a){a.removeListener();a.data.removeListener("pasteDialogCommit",
+l);setTimeout(function(){g||c(null)},10)})):c(null))}}function x(a){if(CKEDITOR.env.webkit){if(!a.match(/^[^<]*$/g)&&!a.match(/^(<div><br( ?\/)?><\/div>|<div>[^<]*<\/div>)*$/gi))return"html"}else if(CKEDITOR.env.ie){if(!a.match(/^([^<]|<br( ?\/)?>)*$/gi)&&!a.match(/^(<p>([^<]|<br( ?\/)?>)*<\/p>|(\r\n))*$/gi))return"html"}else if(CKEDITOR.env.gecko||CKEDITOR.env.opera){if(!a.match(/^([^<]|<br( ?\/)?>)*$/gi))return"html"}else return"html";return"htmlifiedtext"}function y(a,b){function e(a){return CKEDITOR.tools.repeat("</p><p>",
+~~(a/2))+(1==a%2?"<br>":"")}b=b.replace(/\s+/g," ").replace(/> +</g,"><").replace(/<br ?\/>/gi,"<br>");b=b.replace(/<\/?[A-Z]+>/g,function(a){return a.toLowerCase()});if(b.match(/^[^<]$/))return b;CKEDITOR.env.webkit&&-1<b.indexOf("<div>")&&(b=b.replace(/^(<div>(<br>|)<\/div>)(?!$|(<div>(<br>|)<\/div>))/g,"<br>").replace(/^(<div>(<br>|)<\/div>){2}(?!$)/g,"<div></div>"),b.match(/<div>(<br>|)<\/div>/)&&(b="<p>"+b.replace(/(<div>(<br>|)<\/div>)+/g,function(a){return e(a.split("</div><div>").length+1)})+
+"</p>"),b=b.replace(/<\/div><div>/g,"<br>"),b=b.replace(/<\/?div>/g,""));if((CKEDITOR.env.gecko||CKEDITOR.env.opera)&&a.enterMode!=CKEDITOR.ENTER_BR)CKEDITOR.env.gecko&&(b=b.replace(/^<br><br>$/,"<br>")),-1<b.indexOf("<br><br>")&&(b="<p>"+b.replace(/(<br>){2,}/g,function(a){return e(a.length/4)})+"</p>");return p(a,b)}function z(){var a=new CKEDITOR.htmlParser.filter,b={blockquote:1,dl:1,fieldset:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ol:1,p:1,table:1,ul:1},e=CKEDITOR.tools.extend({br:0},CKEDITOR.dtd.$inline),
+c={p:1,br:1,"cke:br":1},f=CKEDITOR.dtd,h=CKEDITOR.tools.extend({area:1,basefont:1,embed:1,iframe:1,map:1,object:1,param:1},CKEDITOR.dtd.$nonBodyContent,CKEDITOR.dtd.$cdata),k=function(a){delete a.name;a.add(new CKEDITOR.htmlParser.text(" "))},g=function(a){for(var b=a,c;(b=b.next)&&b.name&&b.name.match(/^h\d$/);){c=new CKEDITOR.htmlParser.element("cke:br");c.isEmpty=!0;for(a.add(c);c=b.children.shift();)a.add(c)}};a.addRules({elements:{h1:g,h2:g,h3:g,h4:g,h5:g,h6:g,img:function(a){var a=CKEDITOR.tools.trim(a.attributes.alt||
+""),b=" ";a&&!a.match(/(^http|\.(jpe?g|gif|png))/i)&&(b=" ["+a+"] ");return new CKEDITOR.htmlParser.text(b)},td:k,th:k,$:function(a){var i=a.name,g;if(h[i])return!1;delete a.attributes;if("br"==i)return a;if(b[i])a.name="p";else if(e[i])delete a.name;else if(f[i]){g=new CKEDITOR.htmlParser.element("cke:br");g.isEmpty=!0;if(CKEDITOR.dtd.$empty[i])return g;a.add(g,0);g=g.clone();g.isEmpty=!0;a.add(g);delete a.name}c[a.name]||delete a.name;return a}}});return a}function A(a,b,e){var b=new CKEDITOR.htmlParser.fragment.fromHtml(b),
+c=new CKEDITOR.htmlParser.basicWriter;b.writeHtml(c,e);var b=c.getHtml(),b=b.replace(/\s*(<\/?[a-z:]+ ?\/?>)\s*/g,"$1").replace(/(<cke:br \/>){2,}/g,"<cke:br />").replace(/(<cke:br \/>)(<\/?p>|<br \/>)/g,"$2").replace(/(<\/?p>|<br \/>)(<cke:br \/>)/g,"$1").replace(/<(cke:)?br( \/)?>/g,"<br>").replace(/<p><\/p>/g,""),f=0,b=b.replace(/<\/?p>/g,function(a){if("<p>"==a){if(1<++f)return"</p><p>"}else if(0<--f)return"</p><p>";return a}).replace(/<p><\/p>/g,"");return p(a,b)}function p(a,b){a.enterMode==
+CKEDITOR.ENTER_BR?b=b.replace(/(<\/p><p>)+/g,function(a){return CKEDITOR.tools.repeat("<br>",2*(a.length/7))}).replace(/<\/?p>/g,""):a.enterMode==CKEDITOR.ENTER_DIV&&(b=b.replace(/<(\/)?p>/g,"<$1div>"));return b}CKEDITOR.plugins.add("clipboard",{requires:"dialog",init:function(a){var b;w(a);CKEDITOR.dialog.add("paste",CKEDITOR.getUrl(this.path+"dialogs/paste.js"));a.on("paste",function(a){var b=a.data.dataValue,f=CKEDITOR.dtd.$block;-1<b.indexOf("Apple-")&&(b=b.replace(/<span class="Apple-converted-space">&nbsp;<\/span>/gi,
+" "),"html"!=a.data.type&&(b=b.replace(/<span class="Apple-tab-span"[^>]*>([^<]*)<\/span>/gi,function(a,b){return b.replace(/\t/g,"&nbsp;&nbsp; &nbsp;")})),-1<b.indexOf('<br class="Apple-interchange-newline">')&&(a.data.startsWithEOL=1,a.data.preSniffing="html",b=b.replace(/<br class="Apple-interchange-newline">/,"")),b=b.replace(/(<[^>]+) class="Apple-[^"]*"/gi,"$1"));if(b.match(/^<[^<]+cke_(editable|contents)/i)){var h,k,g=new CKEDITOR.dom.element("div");for(g.setHtml(b);1==g.getChildCount()&&(h=
+g.getFirst())&&h.type==CKEDITOR.NODE_ELEMENT&&(h.hasClass("cke_editable")||h.hasClass("cke_contents"));)g=k=h;k&&(b=k.getHtml().replace(/<br>$/i,""))}CKEDITOR.env.ie?b=b.replace(/^&nbsp;(?: |\r\n)?<(\w+)/g,function(b,c){if(c.toLowerCase()in f){a.data.preSniffing="html";return"<"+c}return b}):CKEDITOR.env.webkit?b=b.replace(/<\/(\w+)><div><br><\/div>$/,function(b,c){if(c in f){a.data.endsWithEOL=1;return"</"+c+">"}return b}):CKEDITOR.env.gecko&&(b=b.replace(/(\s)<br>$/,"$1"));a.data.dataValue=b},null,
+null,3);a.on("paste",function(e){var e=e.data,c=e.type,f=e.dataValue,h,k=a.config.clipboard_defaultContentType||"html";h="html"==c||"html"==e.preSniffing?"html":x(f);"htmlifiedtext"==h?f=y(a.config,f):"text"==c&&"html"==h&&(f=A(a.config,f,b||(b=z(a))));e.startsWithEOL&&(f='<br data-cke-eol="1">'+f);e.endsWithEOL&&(f+='<br data-cke-eol="1">');"auto"==c&&(c="html"==h||"html"==k?"html":"text");e.type=c;e.dataValue=f;delete e.preSniffing;delete e.startsWithEOL;delete e.endsWithEOL},null,null,6);a.on("paste",
+function(b){b=b.data;a.insertHtml(b.dataValue,b.type);setTimeout(function(){a.fire("afterPaste")},0)},null,null,1E3);a.on("pasteDialog",function(b){setTimeout(function(){a.openDialog("paste",b.data)},0)})}})})();(function(){var c='<a id="{id}" class="cke_button cke_button__{name} cke_button_{state} {cls}"'+(CKEDITOR.env.gecko&&10900<=CKEDITOR.env.version&&!CKEDITOR.env.hc?"":'" href="javascript:void(\'{titleJs}\')"')+' title="{title}" tabindex="-1" hidefocus="true" role="button" aria-labelledby="{id}_label" aria-haspopup="{hasArrow}"';if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)c+=' onkeypress="return false;"';CKEDITOR.env.gecko&&(c+=' onblur="this.style.cssText = this.style.cssText;"');var c=
+c+(' onkeydown="return CKEDITOR.tools.callFunction({keydownFn},event);" onfocus="return CKEDITOR.tools.callFunction({focusFn},event);"  onmousedown="return CKEDITOR.tools.callFunction({mousedownFn},event);" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},this);return false;"><span class="cke_button_icon cke_button__{iconName}_icon" style="{style}"'),c=c+'>&nbsp;</span><span id="{id}_label" class="cke_button_label cke_button__{name}_label" aria-hidden="false">{label}</span>{arrowHtml}</a>',
+m=CKEDITOR.addTemplate("buttonArrow",'<span class="cke_button_arrow">'+(CKEDITOR.env.hc?"&#9660;":"")+"</span>"),n=CKEDITOR.addTemplate("button",c);CKEDITOR.plugins.add("button",{beforeInit:function(a){a.ui.addHandler(CKEDITOR.UI_BUTTON,CKEDITOR.ui.button.handler)}});CKEDITOR.UI_BUTTON="button";CKEDITOR.ui.button=function(a){CKEDITOR.tools.extend(this,a,{title:a.label,click:a.click||function(b){b.execCommand(a.command)}});this._={}};CKEDITOR.ui.button.handler={create:function(a){return new CKEDITOR.ui.button(a)}};
+CKEDITOR.ui.button.prototype={render:function(a,b){var c=CKEDITOR.env,i=this._.id=CKEDITOR.tools.getNextId(),f="",e=this.command,l;this._.editor=a;var d={id:i,button:this,editor:a,focus:function(){CKEDITOR.document.getById(i).focus()},execute:function(){this.button.click(a)},attach:function(a){this.button.attach(a)}},o=CKEDITOR.tools.addFunction(function(a){if(d.onkey)return a=new CKEDITOR.dom.event(a),!1!==d.onkey(d,a.getKeystroke())}),p=CKEDITOR.tools.addFunction(function(a){var b;d.onfocus&&(b=
+!1!==d.onfocus(d,new CKEDITOR.dom.event(a)));CKEDITOR.env.gecko&&10900>CKEDITOR.env.version&&a.preventBubble();return b}),j=0,q=CKEDITOR.tools.addFunction(function(){if(CKEDITOR.env.opera){var b=a.editable();b.isInline()&&b.hasFocus&&(a.lockSelection(),j=1)}});d.clickFn=l=CKEDITOR.tools.addFunction(function(){j&&(a.unlockSelection(1),j=0);d.execute()});if(this.modes){var k={},g=function(){var b=a.mode;b&&(b=this.modes[b]?void 0!=k[b]?k[b]:CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,this.setState(a.readOnly&&
+!this.readOnly?CKEDITOR.TRISTATE_DISABLED:b))};a.on("beforeModeUnload",function(){a.mode&&this._.state!=CKEDITOR.TRISTATE_DISABLED&&(k[a.mode]=this._.state)},this);a.on("mode",g,this);!this.readOnly&&a.on("readOnly",g,this)}else if(e&&(e=a.getCommand(e)))e.on("state",function(){this.setState(e.state)},this),f+=e.state==CKEDITOR.TRISTATE_ON?"on":e.state==CKEDITOR.TRISTATE_DISABLED?"disabled":"off";if(this.directional)a.on("contentDirChanged",function(b){var c=CKEDITOR.document.getById(this._.id),d=
+c.getFirst(),b=b.data;b!=a.lang.dir?c.addClass("cke_"+b):c.removeClass("cke_ltr").removeClass("cke_rtl");d.setAttribute("style",CKEDITOR.skin.getIconStyle(h,"rtl"==b,this.icon,this.iconOffset))},this);e||(f+="off");var h=g=this.name||this.command;this.icon&&!/\./.test(this.icon)&&(h=this.icon,this.icon=null);c={id:i,name:g,iconName:h,label:this.label,cls:this.className||"",state:f,title:this.title,titleJs:c.gecko&&10900<=c.version&&!c.hc?"":(this.title||"").replace("'",""),hasArrow:this.hasArrow?
+"true":"false",keydownFn:o,mousedownFn:q,focusFn:p,clickFn:l,style:CKEDITOR.skin.getIconStyle(h,"rtl"==a.lang.dir,this.icon,this.iconOffset),arrowHtml:this.hasArrow?m.output():""};n.output(c,b);if(this.onRender)this.onRender();return d},setState:function(a){if(this._.state==a)return!1;this._.state=a;var b=CKEDITOR.document.getById(this._.id);return b?(b.setState(a,"cke_button"),a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute("aria-disabled",!0):b.removeAttribute("aria-disabled"),a==CKEDITOR.TRISTATE_ON?
+b.setAttribute("aria-pressed",!0):b.removeAttribute("aria-pressed"),!0):!1},toFeature:function(a){if(this._.feature)return this._.feature;var b=this;!this.allowedContent&&(!this.requiredContent&&this.command)&&(b=a.getCommand(this.command)||b);return this._.feature=b}};CKEDITOR.ui.prototype.addButton=function(a,b){this.add(a,CKEDITOR.UI_BUTTON,b)}})();CKEDITOR.plugins.add("panelbutton",{requires:"button",onLoad:function(){function e(c){var a=this._;a.state!=CKEDITOR.TRISTATE_DISABLED&&(this.createPanel(c),a.on?a.panel.hide():a.panel.showBlock(this._.id,this.document.getById(this._.id),4))}CKEDITOR.ui.panelButton=CKEDITOR.tools.createClass({base:CKEDITOR.ui.button,$:function(c){var a=c.panel||{};delete c.panel;this.base(c);this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.block={attributes:a.attributes};this.hasArrow=a.toolbarRelated=
+!0;this.click=e;this._={panelDefinition:a}},statics:{handler:{create:function(c){return new CKEDITOR.ui.panelButton(c)}}},proto:{createPanel:function(c){var a=this._;if(!a.panel){var f=this._.panelDefinition,e=this._.panelDefinition.block,g=f.parent||CKEDITOR.document.getBody(),d=this._.panel=new CKEDITOR.ui.floatPanel(c,g,f),f=d.addBlock(a.id,e),b=this;d.onShow=function(){b.className&&this.element.addClass(b.className+"_panel");b.setState(CKEDITOR.TRISTATE_ON);a.on=1;b.editorFocus&&c.focus();if(b.onOpen)b.onOpen()};
+d.onHide=function(d){b.className&&this.element.getFirst().removeClass(b.className+"_panel");b.setState(b.modes&&b.modes[c.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);a.on=0;if(!d&&b.onClose)b.onClose()};d.onEscape=function(){d.hide(1);b.document.getById(a.id).focus()};if(this.onBlock)this.onBlock(d,f);f.onHide=function(){a.on=0;b.setState(CKEDITOR.TRISTATE_OFF)}}}}})},beforeInit:function(e){e.ui.addHandler(CKEDITOR.UI_PANELBUTTON,CKEDITOR.ui.panelButton.handler)}});
+CKEDITOR.UI_PANELBUTTON="panelbutton";(function(){CKEDITOR.plugins.add("panel",{beforeInit:function(a){a.ui.addHandler(CKEDITOR.UI_PANEL,CKEDITOR.ui.panel.handler)}});CKEDITOR.UI_PANEL="panel";CKEDITOR.ui.panel=function(a,b){b&&CKEDITOR.tools.extend(this,b);CKEDITOR.tools.extend(this,{className:"",css:[]});this.id=CKEDITOR.tools.getNextId();this.document=a;this.isFramed=this.forceIFrame||this.css.length;this._={blocks:{}}};CKEDITOR.ui.panel.handler={create:function(a){return new CKEDITOR.ui.panel(a)}};var e=CKEDITOR.addTemplate("panel",
+'<div lang="{langCode}" id="{id}" dir={dir} class="cke cke_reset_all {editorId} cke_panel cke_panel {cls} cke_{dir}" style="z-index:{z-index}" role="presentation">{frame}</div>'),f=CKEDITOR.addTemplate("panel-frame",'<iframe id="{id}" class="cke_panel_frame" role="presentation" frameborder="0" src="{src}"></iframe>'),g=CKEDITOR.addTemplate("panel-frame-inner",'<!DOCTYPE html><html class="cke_panel_container {env}" dir="{dir}" lang="{langCode}"><head>{css}</head><body class="cke_{dir}" style="margin:0;padding:0" onload="{onload}"></body></html>');
+CKEDITOR.ui.panel.prototype={render:function(a,b){this.getHolderElement=function(){var a=this._.holder;if(!a){if(this.isFramed){var a=this.document.getById(this.id+"_frame"),b=a.getParent(),a=a.getFrameDocument();CKEDITOR.env.iOS&&b.setStyles({overflow:"scroll","-webkit-overflow-scrolling":"touch"});b=CKEDITOR.tools.addFunction(CKEDITOR.tools.bind(function(){this.isLoaded=!0;if(this.onLoad)this.onLoad()},this));a.write(g.output(CKEDITOR.tools.extend({css:CKEDITOR.tools.buildStyleHtml(this.css),onload:"window.parent.CKEDITOR.tools.callFunction("+
+b+");"},c)));a.getWindow().$.CKEDITOR=CKEDITOR;a.on("key"+(CKEDITOR.env.opera?"press":"down"),function(a){var b=a.data.getKeystroke(),c=this.document.getById(this.id).getAttribute("dir");this._.onKeyDown&&!1===this._.onKeyDown(b)?a.data.preventDefault():(27==b||b==("rtl"==c?39:37))&&this.onEscape&&!1===this.onEscape(b)&&a.data.preventDefault()},this);a=a.getBody();a.unselectable();CKEDITOR.env.air&&CKEDITOR.tools.callFunction(b)}else a=this.document.getById(this.id);this._.holder=a}return a};var c=
+{editorId:a.id,id:this.id,langCode:a.langCode,dir:a.lang.dir,cls:this.className,frame:"",env:CKEDITOR.env.cssClass,"z-index":a.config.baseFloatZIndex+1};if(this.isFramed){var d=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?"javascript:void(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"}())":"";c.frame=f.output({id:this.id+"_frame",src:d})}d=e.output(c);b&&b.push(d);return d},addBlock:function(a,b){b=this._.blocks[a]=b instanceof CKEDITOR.ui.panel.block?
+b:new CKEDITOR.ui.panel.block(this.getHolderElement(),b);this._.currentBlock||this.showBlock(a);return b},getBlock:function(a){return this._.blocks[a]},showBlock:function(a){var a=this._.blocks[a],b=this._.currentBlock,c=!this.forceIFrame||CKEDITOR.env.ie?this._.holder:this.document.getById(this.id+"_frame");b&&(c.removeAttributes(b.attributes),b.hide());this._.currentBlock=a;c.setAttributes(a.attributes);CKEDITOR.fire("ariaWidget",c);a._.focusIndex=-1;this._.onKeyDown=a.onKeyDown&&CKEDITOR.tools.bind(a.onKeyDown,
+a);a.show();return a},destroy:function(){this.element&&this.element.remove()}};CKEDITOR.ui.panel.block=CKEDITOR.tools.createClass({$:function(a,b){this.element=a.append(a.getDocument().createElement("div",{attributes:{tabIndex:-1,"class":"cke_panel_block",role:"presentation",tabindex:0},styles:{display:"none"}}));b&&CKEDITOR.tools.extend(this,b);this.element.setAttributes({"aria-label":this.attributes["aria-label"],title:this.attributes.title||this.attributes["aria-label"]});delete this.attributes["aria-label"];
+delete this.attributes.title;this.keys={};this._.focusIndex=-1;this.element.disableContextMenu()},_:{markItem:function(a){-1!=a&&(a=this.element.getElementsByTag("a").getItem(this._.focusIndex=a),(CKEDITOR.env.webkit||CKEDITOR.env.opera)&&a.getDocument().getWindow().focus(),a.focus(),this.onMark&&this.onMark(a))}},proto:{show:function(){this.element.setStyle("display","")},hide:function(){(!this.onHide||!0!==this.onHide.call(this))&&this.element.setStyle("display","none")},onKeyDown:function(a){var b=
+this.keys[a];switch(b){case "next":for(var a=this._.focusIndex,b=this.element.getElementsByTag("a"),c;c=b.getItem(++a);)if(c.getAttribute("_cke_focus")&&c.$.offsetWidth){this._.focusIndex=a;c.focus();break}return!1;case "prev":a=this._.focusIndex;for(b=this.element.getElementsByTag("a");0<a&&(c=b.getItem(--a));)if(c.getAttribute("_cke_focus")&&c.$.offsetWidth){this._.focusIndex=a;c.focus();break}return!1;case "click":case "mouseup":return a=this._.focusIndex,(c=0<=a&&this.element.getElementsByTag("a").getItem(a))&&
+(c.$[b]?c.$[b]():c.$["on"+b]()),!1}return!0}}})})();CKEDITOR.plugins.add("floatpanel",{requires:"panel"});
+(function(){function o(a,b,c,h,g){var g=CKEDITOR.tools.genKey(b.getUniqueId(),c.getUniqueId(),a.lang.dir,a.uiColor||"",h.css||"",g||""),e=i[g];e||(e=i[g]=new CKEDITOR.ui.panel(b,h),e.element=c.append(CKEDITOR.dom.element.createFromHtml(e.render(a),b)),e.element.setStyles({display:"none",position:"absolute"}));return e}var i={};CKEDITOR.ui.floatPanel=CKEDITOR.tools.createClass({$:function(a,b,c,h){function g(){j.hide()}c.forceIFrame=1;c.toolbarRelated&&a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE&&
+(b=CKEDITOR.document.getById("cke_"+a.name));var e=b.getDocument(),h=o(a,e,b,c,h||0),k=h.element,d=k.getFirst(),j=this;k.disableContextMenu();this.element=k;this._={editor:a,panel:h,parentElement:b,definition:c,document:e,iframe:d,children:[],dir:a.lang.dir};a.on("mode",g);a.on("resize",g);e.getWindow().on("resize",g)},proto:{addBlock:function(a,b){return this._.panel.addBlock(a,b)},addListBlock:function(a,b){return this._.panel.addListBlock(a,b)},getBlock:function(a){return this._.panel.getBlock(a)},
+showBlock:function(a,b,c,h,g){var e=this._.panel,k=e.showBlock(a);this.allowBlur(!1);a=this._.editor.editable();this._.returnFocus=a.hasFocus?a:new CKEDITOR.dom.element(CKEDITOR.document.$.activeElement);var d=this.element,a=this._.iframe,a=CKEDITOR.env.ie?a:new CKEDITOR.dom.window(a.$.contentWindow),j=d.getDocument(),i=this._.parentElement.getPositionedAncestor(),n=b.getDocumentPosition(j),j=i?i.getDocumentPosition(j):{x:0,y:0},m="rtl"==this._.dir,f=n.x+(h||0)-j.x,l=n.y+(g||0)-j.y;if(m&&(1==c||4==
+c))f+=b.$.offsetWidth;else if(!m&&(2==c||3==c))f+=b.$.offsetWidth-1;if(3==c||4==c)l+=b.$.offsetHeight-1;this._.panel._.offsetParentId=b.getId();d.setStyles({top:l+"px",left:0,display:""});d.setOpacity(0);d.getFirst().removeStyle("width");this._.editor.focusManager.add(a);this._.blurSet||(CKEDITOR.event.useCapture=!0,a.on("blur",function(a){this.allowBlur()&&a.data.getPhase()==CKEDITOR.EVENT_PHASE_AT_TARGET&&(this.visible&&!this._.activeChild)&&(delete this._.returnFocus,this.hide())},this),a.on("focus",
+function(){this._.focused=!0;this.hideChild();this.allowBlur(!0)},this),CKEDITOR.event.useCapture=!1,this._.blurSet=1);e.onEscape=CKEDITOR.tools.bind(function(a){if(this.onEscape&&this.onEscape(a)===false)return false},this);CKEDITOR.tools.setTimeout(function(){var a=CKEDITOR.tools.bind(function(){d.removeStyle("width");if(k.autoSize){var a=k.element.getDocument(),a=(CKEDITOR.env.webkit?k.element:a.getBody()).$.scrollWidth;CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&a>0)&&(a=a+((d.$.offsetWidth||0)-(d.$.clientWidth||
+0)+3));d.setStyle("width",a+10+"px");a=k.element.$.scrollHeight;CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&a>0)&&(a=a+((d.$.offsetHeight||0)-(d.$.clientHeight||0)+3));d.setStyle("height",a+"px");e._.currentBlock.element.setStyle("display","none").removeStyle("display")}else d.removeStyle("height");m&&(f=f-d.$.offsetWidth);d.setStyle("left",f+"px");var b=e.element.getWindow(),a=d.$.getBoundingClientRect(),b=b.getViewPaneSize(),c=a.width||a.right-a.left,g=a.height||a.bottom-a.top,h=m?a.right:b.width-a.left,
+i=m?b.width-a.right:a.left;m?h<c&&(f=i>c?f+c:b.width>c?f-a.left:f-a.right+b.width):h<c&&(f=i>c?f-c:b.width>c?f-a.right+b.width:f-a.left);c=a.top;b.height-a.top<g&&(l=c>g?l-g:b.height>g?l-a.bottom+b.height:l-a.top);if(CKEDITOR.env.ie){b=a=new CKEDITOR.dom.element(d.$.offsetParent);b.getName()=="html"&&(b=b.getDocument().getBody());b.getComputedStyle("direction")=="rtl"&&(f=CKEDITOR.env.ie8Compat?f-d.getDocument().getDocumentElement().$.scrollLeft*2:f-(a.$.scrollWidth-a.$.clientWidth))}var a=d.getFirst(),
+j;(j=a.getCustomData("activePanel"))&&j.onHide&&j.onHide.call(this,1);a.setCustomData("activePanel",this);d.setStyles({top:l+"px",left:f+"px"});d.setOpacity(1)},this);e.isLoaded?a():e.onLoad=a;CKEDITOR.tools.setTimeout(function(){this.focus();this.allowBlur(true);this._.editor.fire("panelShow",this)},0,this)},CKEDITOR.env.air?200:0,this);this.visible=1;this.onShow&&this.onShow.call(this)},focus:function(){if(CKEDITOR.env.webkit){var a=CKEDITOR.document.getActive();!a.equals(this._.iframe)&&a.$.blur()}(this._.lastFocused||
+this._.iframe.getFrameDocument().getWindow()).focus()},blur:function(){var a=this._.iframe.getFrameDocument().getActive();a.is("a")&&(this._.lastFocused=a)},hide:function(a){if(this.visible&&(!this.onHide||!0!==this.onHide.call(this))){this.hideChild();CKEDITOR.env.gecko&&this._.iframe.getFrameDocument().$.activeElement.blur();this.element.setStyle("display","none");this.visible=0;this.element.getFirst().removeCustomData("activePanel");if(a=a&&this._.returnFocus)CKEDITOR.env.webkit&&a.type&&a.getWindow().$.focus(),
+a.focus();delete this._.lastFocused;this._.editor.fire("panelHide",this)}},allowBlur:function(a){var b=this._.panel;void 0!=a&&(b.allowBlur=a);return b.allowBlur},showAsChild:function(a,b,c,h,g,e){this._.activeChild==a&&a._.panel._.offsetParentId==c.getId()||(this.hideChild(),a.onHide=CKEDITOR.tools.bind(function(){CKEDITOR.tools.setTimeout(function(){this._.focused||this.hide()},0,this)},this),this._.activeChild=a,this._.focused=!1,a.showBlock(b,c,h,g,e),this.blur(),(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)&&
+setTimeout(function(){a.element.getChild(0).$.style.cssText+=""},100))},hideChild:function(a){var b=this._.activeChild;b&&(delete b.onHide,delete this._.activeChild,b.hide(),a&&this.focus())}}});CKEDITOR.on("instanceDestroyed",function(){var a=CKEDITOR.tools.isEmpty(CKEDITOR.instances),b;for(b in i){var c=i[b];a?c.destroy():c.element.hide()}a&&(i={})})})();CKEDITOR.plugins.add("colorbutton",{requires:"panelbutton,floatpanel",init:function(c){function m(l,g,e,h){var k=new CKEDITOR.style(i["colorButton_"+g+"Style"]),j=CKEDITOR.tools.getNextId()+"_colorBox";c.ui.add(l,CKEDITOR.UI_PANELBUTTON,{label:e,title:e,modes:{wysiwyg:1},editorFocus:1,toolbar:"colors,"+h,allowedContent:k,requiredContent:k,panel:{css:CKEDITOR.skin.getPath("editor"),attributes:{role:"listbox","aria-label":f.panelTitle}},onBlock:function(a,b){b.autoSize=!0;b.element.addClass("cke_colorblock");
+b.element.setHtml(o(a,g,j));b.element.getDocument().getBody().setStyle("overflow","hidden");CKEDITOR.ui.fire("ready",this);var d=b.keys,e="rtl"==c.lang.dir;d[e?37:39]="next";d[40]="next";d[9]="next";d[e?39:37]="prev";d[38]="prev";d[CKEDITOR.SHIFT+9]="prev";d[32]="click"},onOpen:function(){var a=c.getSelection(),a=a&&a.getStartElement(),a=c.elementPath(a),b,a=a.block||a.blockLimit||c.document.getBody();do b=a&&a.getComputedStyle("back"==g?"background-color":"color")||"transparent";while("back"==g&&
+"transparent"==b&&a&&(a=a.getParent()));if(!b||"transparent"==b)b="#ffffff";this._.panel._.iframe.getFrameDocument().getById(j).setStyle("background-color",b);return b}})}function o(l,g,e){var h=[],k=i.colorButton_colors.split(","),j=CKEDITOR.tools.addFunction(function(a,b){if("?"==a){var e=arguments.callee,d=function(a){this.removeListener("ok",d);this.removeListener("cancel",d);"ok"==a.name&&e(this.getContentElement("picker","selectedColor").getValue(),b)};c.openDialog("colordialog",function(){this.on("ok",
+d);this.on("cancel",d)})}else{c.focus();l.hide();c.fire("saveSnapshot");c.removeStyle(new CKEDITOR.style(i["colorButton_"+b+"Style"],{color:"inherit"}));if(a){var f=i["colorButton_"+b+"Style"];f.childRule="back"==b?function(a){return n(a)}:function(a){return!(a.is("a")||a.getElementsByTag("a").count())||n(a)};c.applyStyle(new CKEDITOR.style(f,{color:a}))}c.fire("saveSnapshot")}});h.push('<a class="cke_colorauto" _cke_focus=1 hidefocus=true title="',f.auto,'" onclick="CKEDITOR.tools.callFunction(',
+j,",null,'",g,"');return false;\" href=\"javascript:void('",f.auto,'\')" role="option"><table role="presentation" cellspacing=0 cellpadding=0 width="100%"><tr><td><span class="cke_colorbox" id="',e,'"></span></td><td colspan=7 align=center>',f.auto,'</td></tr></table></a><table role="presentation" cellspacing=0 cellpadding=0 width="100%">');for(e=0;e<k.length;e++){0===e%8&&h.push("</tr><tr>");var a=k[e].split("/"),b=a[0],d=a[1]||b;a[1]||(b="#"+b.replace(/^(.)(.)(.)$/,"$1$1$2$2$3$3"));a=c.lang.colorbutton.colors[d]||
+d;h.push('<td><a class="cke_colorbox" _cke_focus=1 hidefocus=true title="',a,'" onclick="CKEDITOR.tools.callFunction(',j,",'",b,"','",g,"'); return false;\" href=\"javascript:void('",a,'\')" role="option"><span class="cke_colorbox" style="background-color:#',d,'"></span></a></td>')}(c.plugins.colordialog&&void 0===i.colorButton_enableMore||i.colorButton_enableMore)&&h.push('</tr><tr><td colspan=8 align=center><a class="cke_colormore" _cke_focus=1 hidefocus=true title="',f.more,'" onclick="CKEDITOR.tools.callFunction(',
+j,",'?','",g,"');return false;\" href=\"javascript:void('",f.more,"')\"",' role="option">',f.more,"</a></td>");h.push("</tr></table>");return h.join("")}function n(c){return"false"==c.getAttribute("contentEditable")||c.getAttribute("data-nostyle")}var i=c.config,f=c.lang.colorbutton;CKEDITOR.env.hc||(m("TextColor","fore",f.textColorTitle,10),m("BGColor","back",f.bgColorTitle,20))}});CKEDITOR.config.colorButton_colors="000,800000,8B4513,2F4F4F,008080,000080,4B0082,696969,B22222,A52A2A,DAA520,006400,40E0D0,0000CD,800080,808080,F00,FF8C00,FFD700,008000,0FF,00F,EE82EE,A9A9A9,FFA07A,FFA500,FFFF00,00FF00,AFEEEE,ADD8E6,DDA0DD,D3D3D3,FFF0F5,FAEBD7,FFFFE0,F0FFF0,F0FFFF,F0F8FF,E6E6FA,FFF";
+CKEDITOR.config.colorButton_foreStyle={element:"span",styles:{color:"#(color)"},overrides:[{element:"font",attributes:{color:null}}]};CKEDITOR.config.colorButton_backStyle={element:"span",styles:{"background-color":"#(color)"}};CKEDITOR.plugins.colordialog={requires:"dialog",init:function(b){b.addCommand("colordialog",new CKEDITOR.dialogCommand("colordialog"));CKEDITOR.dialog.add("colordialog",this.path+"dialogs/colordialog.js");b.getColorFromDialog=function(e,f){var c=function(a){this.removeListener("ok",c);this.removeListener("cancel",c);a="ok"==a.name?this.getValueOf("picker","selectedColor"):null;e.call(f,a)},d=function(a){a.on("ok",c);a.on("cancel",c)};b.execCommand("colordialog");if(b._.storedDialogs&&b._.storedDialogs.colordialog)d(b._.storedDialogs.colordialog);
+else CKEDITOR.on("dialogDefinition",function(a){if("colordialog"==a.data.name){var b=a.data.definition;a.removeListener();b.onLoad=CKEDITOR.tools.override(b.onLoad,function(a){return function(){d(this);b.onLoad=a;"function"==typeof a&&a.call(this)}})}})}}};CKEDITOR.plugins.add("colordialog",CKEDITOR.plugins.colordialog);(function(){CKEDITOR.plugins.add("templates",{requires:"dialog",init:function(a){CKEDITOR.dialog.add("templates",CKEDITOR.getUrl(this.path+"dialogs/templates.js"));a.addCommand("templates",new CKEDITOR.dialogCommand("templates"));a.ui.addButton&&a.ui.addButton("Templates",{label:a.lang.templates.button,command:"templates",toolbar:"doctools,10"})}});var c={},f={};CKEDITOR.addTemplates=function(a,d){c[a]=d};CKEDITOR.getTemplates=function(a){return c[a]};CKEDITOR.loadTemplates=function(a,d){for(var e=
+[],b=0,c=a.length;b<c;b++)f[a[b]]||(e.push(a[b]),f[a[b]]=1);e.length?CKEDITOR.scriptLoader.load(e,d):setTimeout(d,0)}})();CKEDITOR.config.templates_files=[CKEDITOR.getUrl("plugins/templates/templates/default.js")];CKEDITOR.config.templates_replaceContent=!0;CKEDITOR.plugins.add("menu",{requires:"floatpanel",beforeInit:function(k){for(var g=k.config.menu_groups.split(","),m=k._.menuGroups={},l=k._.menuItems={},a=0;a<g.length;a++)m[g[a]]=a+1;k.addMenuGroup=function(b,a){m[b]=a||100};k.addMenuItem=function(a,c){m[c.group]&&(l[a]=new CKEDITOR.menuItem(this,a,c))};k.addMenuItems=function(a){for(var c in a)this.addMenuItem(c,a[c])};k.getMenuItem=function(a){return l[a]};k.removeMenuItem=function(a){delete l[a]}}});
+(function(){function k(a){a.sort(function(a,c){return a.group<c.group?-1:a.group>c.group?1:a.order<c.order?-1:a.order>c.order?1:0})}var g='<span class="cke_menuitem"><a id="{id}" class="cke_menubutton cke_menubutton__{name} cke_menubutton_{state} {cls}" href="{href}" title="{title}" tabindex="-1"_cke_focus=1 hidefocus="true" role="menuitem" aria-haspopup="{hasPopup}" aria-disabled="{disabled}"';if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)g+=' onkeypress="return false;"';CKEDITOR.env.gecko&&
+(g+=' onblur="this.style.cssText = this.style.cssText;"');var g=g+(' onmouseover="CKEDITOR.tools.callFunction({hoverFn},{index});" onmouseout="CKEDITOR.tools.callFunction({moveOutFn},{index});" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},{index}); return false;">'),m=CKEDITOR.addTemplate("menuItem",g+'<span class="cke_menubutton_inner"><span class="cke_menubutton_icon"><span class="cke_button_icon cke_button__{iconName}_icon" style="{iconStyle}"></span></span><span class="cke_menubutton_label">{label}</span>{arrowHtml}</span></a></span>'),
+l=CKEDITOR.addTemplate("menuArrow",'<span class="cke_menuarrow"><span>{label}</span></span>');CKEDITOR.menu=CKEDITOR.tools.createClass({$:function(a,b){b=this._.definition=b||{};this.id=CKEDITOR.tools.getNextId();this.editor=a;this.items=[];this._.listeners=[];this._.level=b.level||1;var c=CKEDITOR.tools.extend({},b.panel,{css:[CKEDITOR.skin.getPath("editor")],level:this._.level-1,block:{}}),j=c.block.attributes=c.attributes||{};!j.role&&(j.role="menu");this._.panelDefinition=c},_:{onShow:function(){var a=
+this.editor.getSelection(),b=a&&a.getStartElement(),c=this.editor.elementPath(),j=this._.listeners;this.removeAll();for(var e=0;e<j.length;e++){var i=j[e](b,a,c);if(i)for(var f in i){var h=this.editor.getMenuItem(f);if(h&&(!h.command||this.editor.getCommand(h.command).state))h.state=i[f],this.add(h)}}},onClick:function(a){this.hide();if(a.onClick)a.onClick();else a.command&&this.editor.execCommand(a.command)},onEscape:function(a){var b=this.parent;b?b._.panel.hideChild(1):27==a&&this.hide(1);return!1},
+onHide:function(){this.onHide&&this.onHide()},showSubMenu:function(a){var b=this._.subMenu,c=this.items[a];if(c=c.getItems&&c.getItems()){b?b.removeAll():(b=this._.subMenu=new CKEDITOR.menu(this.editor,CKEDITOR.tools.extend({},this._.definition,{level:this._.level+1},!0)),b.parent=this,b._.onClick=CKEDITOR.tools.bind(this._.onClick,this));for(var j in c){var e=this.editor.getMenuItem(j);e&&(e.state=c[j],b.add(e))}var i=this._.panel.getBlock(this.id).element.getDocument().getById(this.id+(""+a));setTimeout(function(){b.show(i,
+2)},0)}else this._.panel.hideChild(1)}},proto:{add:function(a){a.order||(a.order=this.items.length);this.items.push(a)},removeAll:function(){this.items=[]},show:function(a,b,c,j){if(!this.parent&&(this._.onShow(),!this.items.length))return;var b=b||("rtl"==this.editor.lang.dir?2:1),e=this.items,i=this.editor,f=this._.panel,h=this._.element;if(!f){f=this._.panel=new CKEDITOR.ui.floatPanel(this.editor,CKEDITOR.document.getBody(),this._.panelDefinition,this._.level);f.onEscape=CKEDITOR.tools.bind(function(a){if(!1===
+this._.onEscape(a))return!1},this);f.onShow=function(){f._.panel.getHolderElement().getParent().addClass("cke cke_reset_all")};f.onHide=CKEDITOR.tools.bind(function(){this._.onHide&&this._.onHide()},this);h=f.addBlock(this.id,this._.panelDefinition.block);h.autoSize=!0;var d=h.keys;d[40]="next";d[9]="next";d[38]="prev";d[CKEDITOR.SHIFT+9]="prev";d["rtl"==i.lang.dir?37:39]=CKEDITOR.env.ie?"mouseup":"click";d[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(d[13]="mouseup");h=this._.element=
+h.element;d=h.getDocument();d.getBody().setStyle("overflow","hidden");d.getElementsByTag("html").getItem(0).setStyle("overflow","hidden");this._.itemOverFn=CKEDITOR.tools.addFunction(function(a){clearTimeout(this._.showSubTimeout);this._.showSubTimeout=CKEDITOR.tools.setTimeout(this._.showSubMenu,i.config.menu_subMenuDelay||400,this,[a])},this);this._.itemOutFn=CKEDITOR.tools.addFunction(function(){clearTimeout(this._.showSubTimeout)},this);this._.itemClickFn=CKEDITOR.tools.addFunction(function(a){var b=
+this.items[a];if(b.state==CKEDITOR.TRISTATE_DISABLED)this.hide(1);else if(b.getItems)this._.showSubMenu(a);else this._.onClick(b)},this)}k(e);for(var d=i.elementPath(),d=['<div class="cke_menu'+(d&&d.direction()!=i.lang.dir?" cke_mixed_dir_content":"")+'" role="presentation">'],g=e.length,m=g&&e[0].group,l=0;l<g;l++){var n=e[l];m!=n.group&&(d.push('<div class="cke_menuseparator" role="separator"></div>'),m=n.group);n.render(this,l,d)}d.push("</div>");h.setHtml(d.join(""));CKEDITOR.ui.fire("ready",
+this);this.parent?this.parent._.panel.showAsChild(f,this.id,a,b,c,j):f.showBlock(this.id,a,b,c,j);i.fire("menuShow",[f])},addListener:function(a){this._.listeners.push(a)},hide:function(a){this._.onHide&&this._.onHide();this._.panel&&this._.panel.hide(a)}}});CKEDITOR.menuItem=CKEDITOR.tools.createClass({$:function(a,b,c){CKEDITOR.tools.extend(this,c,{order:0,className:"cke_menubutton__"+b});this.group=a._.menuGroups[this.group];this.editor=a;this.name=b},proto:{render:function(a,b,c){var g=a.id+(""+
+b),e="undefined"==typeof this.state?CKEDITOR.TRISTATE_OFF:this.state,i=e==CKEDITOR.TRISTATE_ON?"on":e==CKEDITOR.TRISTATE_DISABLED?"disabled":"off",f=this.getItems,h="&#"+("rtl"==this.editor.lang.dir?"9668":"9658")+";",d=this.name;this.icon&&!/\./.test(this.icon)&&(d=this.icon);a={id:g,name:this.name,iconName:d,label:this.label,cls:this.className||"",state:i,hasPopup:f?"true":"false",disabled:e==CKEDITOR.TRISTATE_DISABLED,title:this.label,href:"javascript:void('"+(this.label||"").replace("'")+"')",
+hoverFn:a._.itemOverFn,moveOutFn:a._.itemOutFn,clickFn:a._.itemClickFn,index:b,iconStyle:CKEDITOR.skin.getIconStyle(d,"rtl"==this.editor.lang.dir,d==this.icon?null:this.icon,this.iconOffset),arrowHtml:f?l.output({label:h}):""};m.output(a,c)}}})})();CKEDITOR.config.menu_groups="clipboard,form,tablecell,tablecellproperties,tablerow,tablecolumn,table,anchor,link,image,flash,checkbox,radio,textfield,hiddenfield,imagebutton,button,select,textarea,div";CKEDITOR.plugins.add("contextmenu",{requires:"menu",onLoad:function(){CKEDITOR.plugins.contextMenu=CKEDITOR.tools.createClass({base:CKEDITOR.menu,$:function(b){this.base.call(this,b,{panel:{className:"cke_menu_panel",attributes:{"aria-label":b.lang.contextmenu.options}}})},proto:{addTarget:function(b,d){if(CKEDITOR.env.opera&&!("oncontextmenu"in document.body)){var c;b.on("mousedown",function(a){a=a.data;if(2!=a.$.button)a.getKeystroke()==CKEDITOR.CTRL+1&&b.fire("contextmenu",a);else if(!d||!(CKEDITOR.env.mac?
+a.$.metaKey:a.$.ctrlKey)){var g=a.getTarget();c||(g=g.getDocument(),c=g.createElement("input"),c.$.type="button",g.getBody().append(c));c.setAttribute("style","position:absolute;top:"+(a.$.clientY-2)+"px;left:"+(a.$.clientX-2)+"px;width:5px;height:5px;opacity:0.01")}});b.on("mouseup",function(a){c&&(c.remove(),c=void 0,b.fire("contextmenu",a.data))})}b.on("contextmenu",function(a){a=a.data;if(!d||!(CKEDITOR.env.webkit?e:CKEDITOR.env.mac?a.$.metaKey:a.$.ctrlKey)){a.preventDefault();var b=a.getTarget().getDocument(),
+c=a.getTarget().getDocument().getDocumentElement(),f=!b.equals(CKEDITOR.document),b=b.getWindow().getScrollPosition(),h=f?a.$.clientX:a.$.pageX||b.x+a.$.clientX,i=f?a.$.clientY:a.$.pageY||b.y+a.$.clientY;CKEDITOR.tools.setTimeout(function(){this.open(c,null,h,i)},CKEDITOR.env.ie?200:0,this)}},this);if(CKEDITOR.env.opera)b.on("keypress",function(a){a=a.data;0===a.$.keyCode&&a.preventDefault()});if(CKEDITOR.env.webkit){var e,f=function(){e=0};b.on("keydown",function(a){e=CKEDITOR.env.mac?a.data.$.metaKey:
+a.data.$.ctrlKey});b.on("keyup",f);b.on("contextmenu",f)}},open:function(b,d,c,e){this.editor.focus();b=b||CKEDITOR.document.getDocumentElement();this.editor.selectionChange(1);this.show(b,d,c,e)}}})},beforeInit:function(b){var d=b.contextMenu=new CKEDITOR.plugins.contextMenu(b);b.on("contentDom",function(){d.addTarget(b.editable(),!1!==b.config.browserContextMenuOnCtrl)});b.addCommand("contextMenu",{exec:function(){b.contextMenu.open(b.document.getBody())}});b.setKeystroke(CKEDITOR.SHIFT+121,"contextMenu");
+b.setKeystroke(CKEDITOR.CTRL+CKEDITOR.SHIFT+121,"contextMenu")}});(function(){CKEDITOR.plugins.add("div",{requires:"dialog",init:function(a){if(!a.blockless){var c=a.lang.div,b="div(*)";CKEDITOR.dialog.isTabEnabled(a,"editdiv","advanced")&&(b+=";div[dir,id,lang,title]{*}");a.addCommand("creatediv",new CKEDITOR.dialogCommand("creatediv",{allowedContent:b,requiredContent:"div",contextSensitive:!0,refresh:function(a,c){this.setState("div"in(a.config.div_wrapTable?c.root:c.blockLimit).getDtd()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}}));a.addCommand("editdiv",
+new CKEDITOR.dialogCommand("editdiv",{requiredContent:"div"}));a.addCommand("removediv",{requiredContent:"div",exec:function(a){function c(b){if((b=CKEDITOR.plugins.div.getSurroundDiv(a,b))&&!b.data("cke-div-added"))f.push(b),b.data("cke-div-added")}for(var b=a.getSelection(),g=b&&b.getRanges(),e,h=b.createBookmarks(),f=[],d=0;d<g.length;d++)e=g[d],e.collapsed?c(b.getStartElement()):(e=new CKEDITOR.dom.walker(e),e.evaluator=c,e.lastForward());for(d=0;d<f.length;d++)f[d].remove(!0);b.selectBookmarks(h)}});
+a.ui.addButton&&a.ui.addButton("CreateDiv",{label:c.toolbar,command:"creatediv",toolbar:"blocks,50"});a.addMenuItems&&(a.addMenuItems({editdiv:{label:c.edit,command:"editdiv",group:"div",order:1},removediv:{label:c.remove,command:"removediv",group:"div",order:5}}),a.contextMenu&&a.contextMenu.addListener(function(b){return!b||b.isReadOnly()?null:CKEDITOR.plugins.div.getSurroundDiv(a)?{editdiv:CKEDITOR.TRISTATE_OFF,removediv:CKEDITOR.TRISTATE_OFF}:null}));CKEDITOR.dialog.add("creatediv",this.path+
+"dialogs/div.js");CKEDITOR.dialog.add("editdiv",this.path+"dialogs/div.js")}}});CKEDITOR.plugins.div={getSurroundDiv:function(a,c){var b=a.elementPath(c);return a.elementPath(b.blockLimit).contains("div",1)}}})();CKEDITOR.plugins.add("resize",{init:function(b){var f,g,n,o,a=b.config,q=b.ui.spaceId("resizer"),h=b.element?b.element.getDirection(1):"ltr";!a.resize_dir&&(a.resize_dir="vertical");void 0==a.resize_maxWidth&&(a.resize_maxWidth=3E3);void 0==a.resize_maxHeight&&(a.resize_maxHeight=3E3);void 0==a.resize_minWidth&&(a.resize_minWidth=750);void 0==a.resize_minHeight&&(a.resize_minHeight=250);if(!1!==a.resize_enabled){var c=null,i=("both"==a.resize_dir||"horizontal"==a.resize_dir)&&a.resize_minWidth!=a.resize_maxWidth,
+l=("both"==a.resize_dir||"vertical"==a.resize_dir)&&a.resize_minHeight!=a.resize_maxHeight,j=function(d){var e=f,m=g,c=e+(d.data.$.screenX-n)*("rtl"==h?-1:1),d=m+(d.data.$.screenY-o);i&&(e=Math.max(a.resize_minWidth,Math.min(c,a.resize_maxWidth)));l&&(m=Math.max(a.resize_minHeight,Math.min(d,a.resize_maxHeight)));b.resize(i?e:null,m)},k=function(){CKEDITOR.document.removeListener("mousemove",j);CKEDITOR.document.removeListener("mouseup",k);b.document&&(b.document.removeListener("mousemove",j),b.document.removeListener("mouseup",
+k))},p=CKEDITOR.tools.addFunction(function(d){c||(c=b.getResizable());f=c.$.offsetWidth||0;g=c.$.offsetHeight||0;n=d.screenX;o=d.screenY;a.resize_minWidth>f&&(a.resize_minWidth=f);a.resize_minHeight>g&&(a.resize_minHeight=g);CKEDITOR.document.on("mousemove",j);CKEDITOR.document.on("mouseup",k);b.document&&(b.document.on("mousemove",j),b.document.on("mouseup",k));d.preventDefault&&d.preventDefault()});b.on("destroy",function(){CKEDITOR.tools.removeFunction(p)});b.on("uiSpace",function(a){if("bottom"==
+a.data.space){var e="";i&&!l&&(e=" cke_resizer_horizontal");!i&&l&&(e=" cke_resizer_vertical");var c='<span id="'+q+'" class="cke_resizer'+e+" cke_resizer_"+h+'" title="'+CKEDITOR.tools.htmlEncode(b.lang.common.resize)+'" onmousedown="CKEDITOR.tools.callFunction('+p+', event)">'+("ltr"==h?"◢":"◣")+"</span>";"ltr"==h&&"ltr"==e?a.data.html+=c:a.data.html=c+a.data.html}},b,null,100);b.on("maximize",function(a){b.ui.space("resizer")[a.data==CKEDITOR.TRISTATE_ON?"hide":"show"]()})}}});(function(){function w(a){function d(){for(var b=i(),e=CKEDITOR.tools.clone(a.config.toolbarGroups)||n(a),f=0;f<e.length;f++){var k=e[f];if("/"!=k){"string"==typeof k&&(k=e[f]={name:k});var j,d=k.groups;if(d)for(var h=0;h<d.length;h++)j=d[h],(j=b[j])&&c(k,j);(j=b[k.name])&&c(k,j)}}return e}function i(){var b={},c,f,e;for(c in a.ui.items)f=a.ui.items[c],e=f.toolbar||"others",e=e.split(","),f=e[0],e=parseInt(e[1]||-1,10),b[f]||(b[f]=[]),b[f].push({name:c,order:e});for(f in b)b[f]=b[f].sort(function(b,
+a){return b.order==a.order?0:0>a.order?-1:0>b.order?1:b.order<a.order?-1:1});return b}function c(c,e){if(e.length){c.items?c.items.push(a.ui.create("-")):c.items=[];for(var f;f=e.shift();)if(f="string"==typeof f?f:f.name,!b||-1==CKEDITOR.tools.indexOf(b,f))(f=a.ui.create(f))&&a.addFeature(f)&&c.items.push(f)}}function h(b){var a=[],e,d,h;for(e=0;e<b.length;++e)d=b[e],h={},"/"==d?a.push(d):CKEDITOR.tools.isArray(d)?(c(h,CKEDITOR.tools.clone(d)),a.push(h)):d.items&&(c(h,CKEDITOR.tools.clone(d.items)),
+h.name=d.name,a.push(h));return a}var b=a.config.removeButtons,b=b&&b.split(","),e=a.config.toolbar;"string"==typeof e&&(e=a.config["toolbar_"+e]);return a.toolbar=e?h(e):d()}function n(a){return a._.toolbarGroups||(a._.toolbarGroups=[{name:"document",groups:["mode","document","doctools"]},{name:"clipboard",groups:["clipboard","undo"]},{name:"editing",groups:["find","selection","spellchecker"]},{name:"forms"},"/",{name:"basicstyles",groups:["basicstyles","cleanup"]},{name:"paragraph",groups:["list",
+"indent","blocks","align"]},{name:"links"},{name:"insert"},"/",{name:"styles"},{name:"colors"},{name:"tools"},{name:"others"},{name:"about"}])}var t=function(){this.toolbars=[];this.focusCommandExecuted=!1};t.prototype.focus=function(){for(var a=0,d;d=this.toolbars[a++];)for(var i=0,c;c=d.items[i++];)if(c.focus){c.focus();return}};var x={modes:{wysiwyg:1,source:1},readOnly:1,exec:function(a){a.toolbox&&(a.toolbox.focusCommandExecuted=!0,CKEDITOR.env.ie||CKEDITOR.env.air?setTimeout(function(){a.toolbox.focus()},
+100):a.toolbox.focus())}};CKEDITOR.plugins.add("toolbar",{requires:"button",init:function(a){var d,i=function(c,h){var b,e="rtl"==a.lang.dir,g=a.config.toolbarGroupCycling,g=void 0===g||g;switch(h){case 9:case CKEDITOR.SHIFT+9:for(;!b||!b.items.length;)if(b=9==h?(b?b.next:c.toolbar.next)||a.toolbox.toolbars[0]:(b?b.previous:c.toolbar.previous)||a.toolbox.toolbars[a.toolbox.toolbars.length-1],b.items.length)for(c=b.items[d?b.items.length-1:0];c&&!c.focus;)(c=d?c.previous:c.next)||(b=0);c&&c.focus();
+return!1;case e?37:39:case 40:b=c;do b=b.next,!b&&g&&(b=c.toolbar.items[0]);while(b&&!b.focus);b?b.focus():i(c,9);return!1;case e?39:37:case 38:b=c;do b=b.previous,!b&&g&&(b=c.toolbar.items[c.toolbar.items.length-1]);while(b&&!b.focus);b?b.focus():(d=1,i(c,CKEDITOR.SHIFT+9),d=0);return!1;case 27:return a.focus(),!1;case 13:case 32:return c.execute(),!1}return!0};a.on("uiSpace",function(c){if(c.data.space==a.config.toolbarLocation){c.removeListener();a.toolbox=new t;var d=CKEDITOR.tools.getNextId(),
+b=['<span id="',d,'" class="cke_voice_label">',a.lang.toolbar.toolbars,"</span>",'<span id="'+a.ui.spaceId("toolbox")+'" class="cke_toolbox" role="group" aria-labelledby="',d,'" onmousedown="return false;">'],d=!1!==a.config.toolbarStartupExpanded,e,g;a.config.toolbarCanCollapse&&a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&b.push('<span class="cke_toolbox_main"'+(d?">":' style="display:none">'));for(var n=a.toolbox.toolbars,f=w(a),k=0;k<f.length;k++){var j,l=0,q,m=f[k],r;if(m)if(e&&(b.push("</span>"),
+g=e=0),"/"===m)b.push('<span class="cke_toolbar_break"></span>');else{r=m.items||m;for(var s=0;s<r.length;s++){var o=r[s],u;if(o)if(o.type==CKEDITOR.UI_SEPARATOR)g=e&&o;else{u=!1!==o.canGroup;if(!l){j=CKEDITOR.tools.getNextId();l={id:j,items:[]};q=m.name&&(a.lang.toolbar.toolbarGroups[m.name]||m.name);b.push('<span id="',j,'" class="cke_toolbar"',q?' aria-labelledby="'+j+'_label"':"",' role="toolbar">');q&&b.push('<span id="',j,'_label" class="cke_voice_label">',q,"</span>");b.push('<span class="cke_toolbar_start"></span>');
+var p=n.push(l)-1;0<p&&(l.previous=n[p-1],l.previous.next=l)}u?e||(b.push('<span class="cke_toolgroup" role="presentation">'),e=1):e&&(b.push("</span>"),e=0);j=function(c){c=c.render(a,b);p=l.items.push(c)-1;if(p>0){c.previous=l.items[p-1];c.previous.next=c}c.toolbar=l;c.onkey=i;c.onfocus=function(){a.toolbox.focusCommandExecuted||a.focus()}};g&&(j(g),g=0);j(o)}}e&&(b.push("</span>"),g=e=0);l&&b.push('<span class="cke_toolbar_end"></span></span>')}}a.config.toolbarCanCollapse&&b.push("</span>");if(a.config.toolbarCanCollapse&&
+a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var v=CKEDITOR.tools.addFunction(function(){a.execCommand("toolbarCollapse")});a.on("destroy",function(){CKEDITOR.tools.removeFunction(v)});a.addCommand("toolbarCollapse",{readOnly:1,exec:function(b){var a=b.ui.space("toolbar_collapser"),c=a.getPrevious(),e=b.ui.space("contents"),d=c.getParent(),f=parseInt(e.$.style.height,10),h=d.$.offsetHeight,g=a.hasClass("cke_toolbox_collapser_min");g?(c.show(),a.removeClass("cke_toolbox_collapser_min"),a.setAttribute("title",
+b.lang.toolbar.toolbarCollapse)):(c.hide(),a.addClass("cke_toolbox_collapser_min"),a.setAttribute("title",b.lang.toolbar.toolbarExpand));a.getFirst().setText(g?"▲":"◀");e.setStyle("height",f-(d.$.offsetHeight-h)+"px");b.fire("resize")},modes:{wysiwyg:1,source:1}});a.setKeystroke(CKEDITOR.ALT+(CKEDITOR.env.ie||CKEDITOR.env.webkit?189:109),"toolbarCollapse");b.push('<a title="'+(d?a.lang.toolbar.toolbarCollapse:a.lang.toolbar.toolbarExpand)+'" id="'+a.ui.spaceId("toolbar_collapser")+'" tabIndex="-1" class="cke_toolbox_collapser');
+d||b.push(" cke_toolbox_collapser_min");b.push('" onclick="CKEDITOR.tools.callFunction('+v+')">','<span class="cke_arrow">&#9650;</span>',"</a>")}b.push("</span>");c.data.html+=b.join("")}});a.on("destroy",function(){if(this.toolbox){var a,d=0,b,e,g;for(a=this.toolbox.toolbars;d<a.length;d++){e=a[d].items;for(b=0;b<e.length;b++)g=e[b],g.clickFn&&CKEDITOR.tools.removeFunction(g.clickFn),g.keyDownFn&&CKEDITOR.tools.removeFunction(g.keyDownFn)}}});a.on("uiReady",function(){var c=a.ui.space("toolbox");
+c&&a.focusManager.add(c,1)});a.addCommand("toolbarFocus",x);a.setKeystroke(CKEDITOR.ALT+121,"toolbarFocus");a.ui.add("-",CKEDITOR.UI_SEPARATOR,{});a.ui.addHandler(CKEDITOR.UI_SEPARATOR,{create:function(){return{render:function(a,d){d.push('<span class="cke_toolbar_separator" role="separator"></span>');return{}}}}})}});CKEDITOR.ui.prototype.addToolbarGroup=function(a,d,i){var c=n(this.editor),h=0===d,b={name:a};if(i){if(i=CKEDITOR.tools.search(c,function(a){return a.name==i})){!i.groups&&(i.groups=
+[]);if(d&&(d=CKEDITOR.tools.indexOf(i.groups,d),0<=d)){i.groups.splice(d+1,0,a);return}h?i.groups.splice(0,0,a):i.groups.push(a);return}d=null}d&&(d=CKEDITOR.tools.indexOf(c,function(a){return a.name==d}));h?c.splice(0,0,a):"number"==typeof d?c.splice(d+1,0,b):c.push(a)}})();CKEDITOR.UI_SEPARATOR="separator";CKEDITOR.config.toolbarLocation="top";(function(){var h;function m(a,d){function o(b){b=a._.elementsPath.list[b];if(b.equals(a.editable())){var e=a.createRange();e.selectNodeContents(b);e.select()}else a.getSelection().selectElement(b);a.focus()}function p(){i&&i.setHtml(n);delete a._.elementsPath.list}var l=a.ui.spaceId("path"),i,q="cke_elementspath_"+CKEDITOR.tools.getNextNumber()+"_";a._.elementsPath={idBase:q,filters:[]};d.html+='<span id="'+l+'_label" class="cke_voice_label">'+a.lang.elementspath.eleLabel+'</span><span id="'+l+'" class="cke_path" role="group" aria-labelledby="'+
+l+'_label">'+n+"</span>";a.on("uiReady",function(){var b=a.ui.space("path");b&&a.focusManager.add(b,1)});var m=CKEDITOR.tools.addFunction(o),r=CKEDITOR.tools.addFunction(function(b,e){var c=a._.elementsPath.idBase,f,e=new CKEDITOR.dom.event(e);f="rtl"==a.lang.dir;switch(e.getKeystroke()){case f?39:37:case 9:return(f=CKEDITOR.document.getById(c+(b+1)))||(f=CKEDITOR.document.getById(c+"0")),f.focus(),!1;case f?37:39:case CKEDITOR.SHIFT+9:return(f=CKEDITOR.document.getById(c+(b-1)))||(f=CKEDITOR.document.getById(c+
+(a._.elementsPath.list.length-1))),f.focus(),!1;case 27:return a.focus(),!1;case 13:case 32:return o(b),!1}return!0});a.on("selectionChange",function(b){for(var e=a.editable(),c=b.data.selection.getStartElement(),b=[],f=a._.elementsPath.list=[],d=a._.elementsPath.filters;c;){var j=0,g;g=c.data("cke-display-name")?c.data("cke-display-name"):c.data("cke-real-element-type")?c.data("cke-real-element-type"):c.getName();for(var k=0;k<d.length;k++){var h=d[k](c,g);if(!1===h){j=1;break}g=h||g}j||(j=f.push(c)-
+1,k=a.lang.elementspath.eleTitle.replace(/%1/,g),g=s.output({id:q+j,label:k,text:g,jsTitle:"javascript:void('"+g+"')",index:j,keyDownFn:r,clickFn:m}),b.unshift(g));if(c.equals(e))break;c=c.getParent()}i||(i=CKEDITOR.document.getById(l));e=i;e.setHtml(b.join("")+n);a.fire("elementsPathUpdate",{space:e})});a.on("readOnly",p);a.on("contentDomUnload",p);a.addCommand("elementsPathFocus",h);a.setKeystroke(CKEDITOR.ALT+122,"elementsPathFocus")}h={editorFocus:!1,readOnly:1,exec:function(a){(a=CKEDITOR.document.getById(a._.elementsPath.idBase+
+"0"))&&a.focus(CKEDITOR.env.ie||CKEDITOR.env.air)}};var n='<span class="cke_path_empty">&nbsp;</span>',d="";if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)d+=' onkeypress="return false;"';CKEDITOR.env.gecko&&(d+=' onblur="this.style.cssText = this.style.cssText;"');var s=CKEDITOR.addTemplate("pathItem",'<a id="{id}" href="{jsTitle}" tabindex="-1" class="cke_path_item" title="{label}"'+(CKEDITOR.env.gecko&&10900>CKEDITOR.env.version?' onfocus="event.preventBubble();"':"")+d+' hidefocus="true"  onkeydown="return CKEDITOR.tools.callFunction({keyDownFn},{index}, event );" onclick="CKEDITOR.tools.callFunction({clickFn},{index}); return false;" role="button" aria-label="{label}">{text}</a>');
+CKEDITOR.plugins.add("elementspath",{init:function(a){a.on("uiSpace",function(d){"bottom"==d.data.space&&m(a,d.data)})}})})();(function(){function l(e,c,b){b=e.config.forceEnterMode||b;if("wysiwyg"!=e.mode)return!1;c||(c=e.config.enterMode);e.elementPath().isContextFor("p")||(c=CKEDITOR.ENTER_BR,b=1);e.fire("saveSnapshot");c==CKEDITOR.ENTER_BR?o(e,c,null,b):p(e,c,null,b);e.fire("saveSnapshot");return!0}function q(e){for(var e=e.getSelection().getRanges(!0),c=e.length-1;0<c;c--)e[c].deleteContents();return e[0]}CKEDITOR.plugins.add("enterkey",{init:function(e){e.addCommand("enter",{modes:{wysiwyg:1},editorFocus:!1,exec:function(c){l(c)}});
+e.addCommand("shiftEnter",{modes:{wysiwyg:1},editorFocus:!1,exec:function(c){"wysiwyg"==c.mode&&l(c,c.config.shiftEnterMode,1)}});e.setKeystroke([[13,"enter"],[CKEDITOR.SHIFT+13,"shiftEnter"]])}});var t=CKEDITOR.dom.walker.whitespaces(),u=CKEDITOR.dom.walker.bookmark();CKEDITOR.plugins.enterkey={enterBlock:function(e,c,b,i){if(b=b||q(e)){var f=b.document,j=b.checkStartOfBlock(),h=b.checkEndOfBlock(),a=e.elementPath(b.startContainer).block,k=c==CKEDITOR.ENTER_DIV?"div":"p",d;if(j&&h){if(a&&(a.is("li")||
+a.getParent().is("li"))){b=a.getParent();d=b.getParent();var i=!a.hasPrevious(),m=!a.hasNext(),k=e.getSelection(),g=k.createBookmarks(),j=a.getDirection(1),h=a.getAttribute("class"),n=a.getAttribute("style"),l=d.getDirection(1)!=j,e=e.config.enterMode!=CKEDITOR.ENTER_BR||l||n||h;if(d.is("li"))if(i||m)a[i?"insertBefore":"insertAfter"](d);else a.breakParent(d);else{if(e)if(d=f.createElement(c==CKEDITOR.ENTER_P?"p":"div"),l&&d.setAttribute("dir",j),n&&d.setAttribute("style",n),h&&d.setAttribute("class",
+h),a.moveChildren(d),i||m)d[i?"insertBefore":"insertAfter"](b);else a.breakParent(b),d.insertAfter(b);else if(a.appendBogus(),i||m)for(;f=a[i?"getFirst":"getLast"]();)f[i?"insertBefore":"insertAfter"](b);else for(a.breakParent(b);f=a.getLast();)f.insertAfter(b);a.remove()}k.selectBookmarks(g);return}if(a&&a.getParent().is("blockquote")){a.breakParent(a.getParent());a.getPrevious().getFirst(CKEDITOR.dom.walker.invisible(1))||a.getPrevious().remove();a.getNext().getFirst(CKEDITOR.dom.walker.invisible(1))||
+a.getNext().remove();b.moveToElementEditStart(a);b.select();return}}else if(a&&a.is("pre")&&!h){o(e,c,b,i);return}if(h=b.splitBlock(k)){c=h.previousBlock;a=h.nextBlock;e=h.wasStartOfBlock;j=h.wasEndOfBlock;if(a)g=a.getParent(),g.is("li")&&(a.breakParent(g),a.move(a.getNext(),1));else if(c&&(g=c.getParent())&&g.is("li"))c.breakParent(g),g=c.getNext(),b.moveToElementEditStart(g),c.move(c.getPrevious());if(!e&&!j)a.is("li")&&(d=b.clone(),d.selectNodeContents(a),d=new CKEDITOR.dom.walker(d),d.evaluator=
+function(a){return!(u(a)||t(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in CKEDITOR.dtd.$inline&&!(a.getName()in CKEDITOR.dtd.$empty))},(g=d.next())&&(g.type==CKEDITOR.NODE_ELEMENT&&g.is("ul","ol"))&&(CKEDITOR.env.ie?f.createText(" "):f.createElement("br")).insertBefore(g)),a&&b.moveToElementEditStart(a);else{if(c){if(c.is("li")||!r.test(c.getName())&&!c.is("pre"))d=c.clone()}else a&&(d=a.clone());d?i&&!d.is("li")&&d.renameNode(k):g&&g.is("li")?d=g:(d=f.createElement(k),c&&(m=c.getDirection())&&
+d.setAttribute("dir",m));if(f=h.elementPath){i=0;for(k=f.elements.length;i<k;i++){g=f.elements[i];if(g.equals(f.block)||g.equals(f.blockLimit))break;CKEDITOR.dtd.$removeEmpty[g.getName()]&&(g=g.clone(),d.moveChildren(g),d.append(g))}}CKEDITOR.env.ie||d.appendBogus();d.getParent()||b.insertNode(d);d.is("li")&&d.removeAttribute("value");if(CKEDITOR.env.ie&&e&&(!j||!c.getChildCount()))b.moveToElementEditStart(j?c:d),b.select();b.moveToElementEditStart(e&&!j?a:d)}b.select();b.scrollIntoView()}}},enterBr:function(e,
+c,b,i){if(b=b||q(e)){var f=b.document,j=b.checkEndOfBlock(),h=new CKEDITOR.dom.elementPath(e.getSelection().getStartElement()),a=h.block,h=a&&h.block.getName();!i&&"li"==h?p(e,c,b,i):(!i&&j&&r.test(h)?(j=a.getDirection())?(f=f.createElement("div"),f.setAttribute("dir",j),f.insertAfter(a),b.setStart(f,0)):(f.createElement("br").insertAfter(a),CKEDITOR.env.gecko&&f.createText("").insertAfter(a),b.setStartAt(a.getNext(),CKEDITOR.env.ie?CKEDITOR.POSITION_BEFORE_START:CKEDITOR.POSITION_AFTER_START)):(a=
+"pre"==h&&CKEDITOR.env.ie&&8>CKEDITOR.env.version?f.createText("\r"):f.createElement("br"),b.deleteContents(),b.insertNode(a),CKEDITOR.env.ie?b.setStartAt(a,CKEDITOR.POSITION_AFTER_END):(f.createText("﻿").insertAfter(a),j&&a.getParent().appendBogus(),a.getNext().$.nodeValue="",b.setStartAt(a.getNext(),CKEDITOR.POSITION_AFTER_START))),b.collapse(!0),b.select(),b.scrollIntoView())}}};var s=CKEDITOR.plugins.enterkey,o=s.enterBr,p=s.enterBlock,r=/^h[1-6]$/})();(function(){function j(a,b){var d={},e=[],f={nbsp:" ",shy:"­",gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},a=a.replace(/\b(nbsp|shy|gt|lt|amp|apos|quot)(?:,|$)/g,function(a,h){var c=b?"&"+h+";":f[h];d[c]=b?f[h]:"&"+h+";";e.push(c);return""});if(!b&&a){var a=a.split(","),c=document.createElement("div"),g;c.innerHTML="&"+a.join(";&")+";";g=c.innerHTML;c=null;for(c=0;c<g.length;c++){var i=g.charAt(c);d[i]="&"+a[c]+";";e.push(i)}}d.regex=e.join(b?"|":"");return d}CKEDITOR.plugins.add("entities",{afterInit:function(a){var b=
+a.config;if(a=(a=a.dataProcessor)&&a.htmlFilter){var d=[];!1!==b.basicEntities&&d.push("nbsp,gt,lt,amp");b.entities&&(d.length&&d.push("quot,iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,cedil,sup1,ordm,raquo,frac14,frac12,frac34,iquest,times,divide,fnof,bull,hellip,prime,Prime,oline,frasl,weierp,image,real,trade,alefsym,larr,uarr,rarr,darr,harr,crarr,lArr,uArr,rArr,dArr,hArr,forall,part,exist,empty,nabla,isin,notin,ni,prod,sum,minus,lowast,radic,prop,infin,ang,and,or,cap,cup,int,there4,sim,cong,asymp,ne,equiv,le,ge,sub,sup,nsub,sube,supe,oplus,otimes,perp,sdot,lceil,rceil,lfloor,rfloor,lang,rang,loz,spades,clubs,hearts,diams,circ,tilde,ensp,emsp,thinsp,zwnj,zwj,lrm,rlm,ndash,mdash,lsquo,rsquo,sbquo,ldquo,rdquo,bdquo,dagger,Dagger,permil,lsaquo,rsaquo,euro"),
+b.entities_latin&&d.push("Agrave,Aacute,Acirc,Atilde,Auml,Aring,AElig,Ccedil,Egrave,Eacute,Ecirc,Euml,Igrave,Iacute,Icirc,Iuml,ETH,Ntilde,Ograve,Oacute,Ocirc,Otilde,Ouml,Oslash,Ugrave,Uacute,Ucirc,Uuml,Yacute,THORN,szlig,agrave,aacute,acirc,atilde,auml,aring,aelig,ccedil,egrave,eacute,ecirc,euml,igrave,iacute,icirc,iuml,eth,ntilde,ograve,oacute,ocirc,otilde,ouml,oslash,ugrave,uacute,ucirc,uuml,yacute,thorn,yuml,OElig,oelig,Scaron,scaron,Yuml"),b.entities_greek&&d.push("Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi,omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,upsih,piv"),
+b.entities_additional&&d.push(b.entities_additional));var e=j(d.join(",")),f=e.regex?"["+e.regex+"]":"a^";delete e.regex;b.entities&&b.entities_processNumerical&&(f="[^ -~]|"+f);var f=RegExp(f,"g"),c=function(a){return b.entities_processNumerical=="force"||!e[a]?"&#"+a.charCodeAt(0)+";":e[a]},g=j("nbsp,gt,lt,amp,shy",!0),i=RegExp(g.regex,"g"),k=function(a){return g[a]};a.addRules({text:function(a){return a.replace(i,k).replace(f,c)}})}}})})();CKEDITOR.config.basicEntities=!0;
+CKEDITOR.config.entities=!0;CKEDITOR.config.entities_latin=!0;CKEDITOR.config.entities_greek=!0;CKEDITOR.config.entities_additional="#39";CKEDITOR.plugins.add("popup");
+CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{popup:function(e,a,b,d){a=a||"80%";b=b||"70%";"string"==typeof a&&(1<a.length&&"%"==a.substr(a.length-1,1))&&(a=parseInt(window.screen.width*parseInt(a,10)/100,10));"string"==typeof b&&(1<b.length&&"%"==b.substr(b.length-1,1))&&(b=parseInt(window.screen.height*parseInt(b,10)/100,10));640>a&&(a=640);420>b&&(b=420);var f=parseInt((window.screen.height-b)/2,10),g=parseInt((window.screen.width-a)/2,10),d=(d||"location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes")+",width="+
+a+",height="+b+",top="+f+",left="+g,c=window.open("",null,d,!0);if(!c)return!1;try{-1==navigator.userAgent.toLowerCase().indexOf(" chrome/")&&(c.moveTo(g,f),c.resizeTo(a,b)),c.focus(),c.location.href=e}catch(h){window.open(e,null,d,!0)}return!0}});(function(){function g(a,c){var d=[];if(c)for(var b in c)d.push(b+"="+encodeURIComponent(c[b]));else return a;return a+(-1!=a.indexOf("?")?"&":"?")+d.join("&")}function i(a){a+="";return a.charAt(0).toUpperCase()+a.substr(1)}function k(){var a=this.getDialog(),c=a.getParentEditor();c._.filebrowserSe=this;var d=c.config["filebrowser"+i(a.getName())+"WindowWidth"]||c.config.filebrowserWindowWidth||"80%",a=c.config["filebrowser"+i(a.getName())+"WindowHeight"]||c.config.filebrowserWindowHeight||"70%",
+b=this.filebrowser.params||{};b.CKEditor=c.name;b.CKEditorFuncNum=c._.filebrowserFn;b.langCode||(b.langCode=c.langCode);b=g(this.filebrowser.url,b);c.popup(b,d,a,c.config.filebrowserWindowFeatures||c.config.fileBrowserWindowFeatures)}function l(){var a=this.getDialog();a.getParentEditor()._.filebrowserSe=this;return!a.getContentElement(this["for"][0],this["for"][1]).getInputElement().$.value||!a.getContentElement(this["for"][0],this["for"][1]).getAction()?!1:!0}function m(a,c,d){var b=d.params||{};
+b.CKEditor=a.name;b.CKEditorFuncNum=a._.filebrowserFn;b.langCode||(b.langCode=a.langCode);c.action=g(d.url,b);c.filebrowser=d}function j(a,c,d,b){if(b&&b.length)for(var e,g=b.length;g--;)if(e=b[g],("hbox"==e.type||"vbox"==e.type||"fieldset"==e.type)&&j(a,c,d,e.children),e.filebrowser)if("string"==typeof e.filebrowser&&(e.filebrowser={action:"fileButton"==e.type?"QuickUpload":"Browse",target:e.filebrowser}),"Browse"==e.filebrowser.action){var f=e.filebrowser.url;void 0===f&&(f=a.config["filebrowser"+
+i(c)+"BrowseUrl"],void 0===f&&(f=a.config.filebrowserBrowseUrl));f&&(e.onClick=k,e.filebrowser.url=f,e.hidden=!1)}else if("QuickUpload"==e.filebrowser.action&&e["for"]&&(f=e.filebrowser.url,void 0===f&&(f=a.config["filebrowser"+i(c)+"UploadUrl"],void 0===f&&(f=a.config.filebrowserUploadUrl)),f)){var h=e.onClick;e.onClick=function(a){var b=a.sender;return h&&h.call(b,a)===false?false:l.call(b,a)};e.filebrowser.url=f;e.hidden=!1;m(a,d.getContents(e["for"][0]).get(e["for"][1]),e.filebrowser)}}function h(a,
+c,d){if(-1!==d.indexOf(";")){for(var d=d.split(";"),b=0;b<d.length;b++)if(h(a,c,d[b]))return!0;return!1}return(a=a.getContents(c).get(d).filebrowser)&&a.url}function n(a,c){var d=this._.filebrowserSe.getDialog(),b=this._.filebrowserSe["for"],e=this._.filebrowserSe.filebrowser.onSelect;b&&d.getContentElement(b[0],b[1]).reset();if(!("function"==typeof c&&!1===c.call(this._.filebrowserSe))&&!(e&&!1===e.call(this._.filebrowserSe,a,c))&&("string"==typeof c&&c&&alert(c),a&&(b=this._.filebrowserSe,d=b.getDialog(),
+b=b.filebrowser.target||null)))if(b=b.split(":"),e=d.getContentElement(b[0],b[1]))e.setValue(a),d.selectPage(b[0])}CKEDITOR.plugins.add("filebrowser",{requires:"popup",init:function(a){a._.filebrowserFn=CKEDITOR.tools.addFunction(n,a);a.on("destroy",function(){CKEDITOR.tools.removeFunction(this._.filebrowserFn)})}});CKEDITOR.on("dialogDefinition",function(a){for(var c=a.data.definition,d,b=0;b<c.contents.length;++b)if(d=c.contents[b])j(a.editor,a.data.name,c,d.elements),d.hidden&&d.filebrowser&&(d.hidden=
+!h(c,d.id,d.filebrowser))})})();CKEDITOR.plugins.add("find",{requires:"dialog",init:function(a){var b=a.addCommand("find",new CKEDITOR.dialogCommand("find"));b.canUndo=!1;b.readOnly=1;a.addCommand("replace",new CKEDITOR.dialogCommand("replace")).canUndo=!1;a.ui.addButton&&(a.ui.addButton("Find",{label:a.lang.find.find,command:"find",toolbar:"find,10"}),a.ui.addButton("Replace",{label:a.lang.find.replace,command:"replace",toolbar:"find,20"}));CKEDITOR.dialog.add("find",this.path+"dialogs/find.js");CKEDITOR.dialog.add("replace",this.path+
+"dialogs/find.js")}});CKEDITOR.config.find_highlight={element:"span",styles:{"background-color":"#004",color:"#fff"}};(function(){function g(a,b){var c=j.exec(a),d=j.exec(b);if(c){if(!c[2]&&"px"==d[2])return d[1];if("px"==c[2]&&!d[2])return d[1]+"px"}return b}var i=CKEDITOR.htmlParser.cssStyle,h=CKEDITOR.tools.cssLength,j=/^((?:\d*(?:\.\d+))|(?:\d+))(.*)?$/i,l={elements:{$:function(a){var b=a.attributes;if((b=(b=(b=b&&b["data-cke-realelement"])&&new CKEDITOR.htmlParser.fragment.fromHtml(decodeURIComponent(b)))&&b.children[0])&&a.attributes["data-cke-resizable"]){var c=(new i(a)).rules,a=b.attributes,d=c.width,c=
+c.height;d&&(a.width=g(a.width,d));c&&(a.height=g(a.height,c))}return b}}},k=CKEDITOR.plugins.add("fakeobjects",{afterInit:function(a){(a=(a=a.dataProcessor)&&a.htmlFilter)&&a.addRules(l)}});CKEDITOR.editor.prototype.createFakeElement=function(a,b,c,d){var e=this.lang.fakeobjects,e=e[c]||e.unknown,b={"class":b,"data-cke-realelement":encodeURIComponent(a.getOuterHtml()),"data-cke-real-node-type":a.type,alt:e,title:e,align:a.getAttribute("align")||""};CKEDITOR.env.hc||(b.src=CKEDITOR.getUrl(k.path+
+"images/spacer.gif"));c&&(b["data-cke-real-element-type"]=c);d&&(b["data-cke-resizable"]=d,c=new i,d=a.getAttribute("width"),a=a.getAttribute("height"),d&&(c.rules.width=h(d)),a&&(c.rules.height=h(a)),c.populate(b));return this.document.createElement("img",{attributes:b})};CKEDITOR.editor.prototype.createFakeParserElement=function(a,b,c,d){var e=this.lang.fakeobjects,e=e[c]||e.unknown,f;f=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(f);f=f.getHtml();b={"class":b,"data-cke-realelement":encodeURIComponent(f),
+"data-cke-real-node-type":a.type,alt:e,title:e,align:a.attributes.align||""};CKEDITOR.env.hc||(b.src=CKEDITOR.getUrl(k.path+"images/spacer.gif"));c&&(b["data-cke-real-element-type"]=c);d&&(b["data-cke-resizable"]=d,d=a.attributes,a=new i,c=d.width,d=d.height,void 0!=c&&(a.rules.width=h(c)),void 0!=d&&(a.rules.height=h(d)),a.populate(b));return new CKEDITOR.htmlParser.element("img",b)};CKEDITOR.editor.prototype.restoreRealElement=function(a){if(a.data("cke-real-node-type")!=CKEDITOR.NODE_ELEMENT)return null;
+var b=CKEDITOR.dom.element.createFromHtml(decodeURIComponent(a.data("cke-realelement")),this.document);if(a.data("cke-resizable")){var c=a.getStyle("width"),a=a.getStyle("height");c&&b.setAttribute("width",g(b.getAttribute("width"),c));a&&b.setAttribute("height",g(b.getAttribute("height"),a))}return b}})();(function(){function d(a){a=a.attributes;return"application/x-shockwave-flash"==a.type||f.test(a.src||"")}function e(a,b){return a.createFakeParserElement(b,"cke_flash","flash",!0)}var f=/\.swf(?:$|\?)/i;CKEDITOR.plugins.add("flash",{requires:"dialog,fakeobjects",onLoad:function(){CKEDITOR.addCss("img.cke_flash{background-image: url("+CKEDITOR.getUrl(this.path+"images/placeholder.png")+");background-position: center center;background-repeat: no-repeat;border: 1px solid #a9a9a9;width: 80px;height: 80px;}")},
+init:function(a){var b="object[classid,codebase,height,hspace,vspace,width];param[name,value];embed[height,hspace,pluginspage,src,type,vspace,width]";CKEDITOR.dialog.isTabEnabled(a,"flash","properties")&&(b+=";object[align]; embed[allowscriptaccess,quality,scale,wmode]");CKEDITOR.dialog.isTabEnabled(a,"flash","advanced")&&(b+=";object[id]{*}; embed[bgcolor]{*}(*)");a.addCommand("flash",new CKEDITOR.dialogCommand("flash",{allowedContent:b,requiredContent:"embed"}));a.ui.addButton&&a.ui.addButton("Flash",
+{label:a.lang.common.flash,command:"flash",toolbar:"insert,20"});CKEDITOR.dialog.add("flash",this.path+"dialogs/flash.js");a.addMenuItems&&a.addMenuItems({flash:{label:a.lang.flash.properties,command:"flash",group:"flash"}});a.on("doubleclick",function(a){var b=a.data.element;b.is("img")&&"flash"==b.data("cke-real-element-type")&&(a.data.dialog="flash")});a.contextMenu&&a.contextMenu.addListener(function(a){if(a&&a.is("img")&&!a.isReadOnly()&&"flash"==a.data("cke-real-element-type"))return{flash:CKEDITOR.TRISTATE_OFF}})},
+afterInit:function(a){var b=a.dataProcessor;(b=b&&b.dataFilter)&&b.addRules({elements:{"cke:object":function(b){var c=b.attributes;if((!c.classid||!(""+c.classid).toLowerCase())&&!d(b)){for(c=0;c<b.children.length;c++)if("cke:embed"==b.children[c].name){if(!d(b.children[c]))break;return e(a,b)}return null}return e(a,b)},"cke:embed":function(b){return!d(b)?null:e(a,b)}}},5)}})})();CKEDITOR.tools.extend(CKEDITOR.config,{flashEmbedTagOnly:!1,flashAddEmbedTag:!0,flashConvertOnEdit:!1});(function(){function q(a){var i=a.config,l=a.fire("uiSpace",{space:"top",html:""}).html,o=function(){function f(a,c,e){b.setStyle(c,t(e));b.setStyle("position",a)}function e(a){var b=r.getDocumentPosition();switch(a){case "top":f("absolute","top",b.y-m-n);break;case "pin":f("fixed","top",q);break;case "bottom":f("absolute","top",b.y+(c.height||c.bottom-c.top)+n)}j=a}var j,r,k,c,h,m,s,l=i.floatSpaceDockedOffsetX||0,n=i.floatSpaceDockedOffsetY||0,p=i.floatSpacePinnedOffsetX||0,q=i.floatSpacePinnedOffsetY||
+0;return function(d){if(r=a.editable())if(d&&"focus"==d.name&&b.show(),b.removeStyle("left"),b.removeStyle("right"),k=b.getClientRect(),c=r.getClientRect(),h=g.getViewPaneSize(),m=k.height,s="pageXOffset"in g.$?g.$.pageXOffset:CKEDITOR.document.$.documentElement.scrollLeft,j){m+n<=c.top?e("top"):m+n>h.height-c.bottom?e("pin"):e("bottom");var d=h.width/2,d=0<c.left&&c.right<h.width&&c.width>k.width?"rtl"==a.config.contentsLangDirection?"right":"left":d-c.left>c.right-d?"left":"right",f;k.width>h.width?
+(d="left",f=0):(f="left"==d?0<c.left?c.left:0:c.right<h.width?h.width-c.right:0,f+k.width>h.width&&(d="left"==d?"right":"left",f=0));b.setStyle(d,t(("pin"==j?p:l)+f+("pin"==j?0:"left"==d?s:-s)))}else j="pin",e("pin"),o(d)}}();if(l){var b=CKEDITOR.document.getBody().append(CKEDITOR.dom.element.createFromHtml(u.output({content:l,id:a.id,langDir:a.lang.dir,langCode:a.langCode,name:a.name,style:"display:none;z-index:"+(i.baseFloatZIndex-1),topId:a.ui.spaceId("top")}))),p=CKEDITOR.tools.eventsBuffer(500,
+o),e=CKEDITOR.tools.eventsBuffer(100,o);b.unselectable();b.on("mousedown",function(a){a=a.data;a.getTarget().hasAscendant("a",1)||a.preventDefault()});a.on("focus",function(b){o(b);a.on("change",p.input);g.on("scroll",e.input);g.on("resize",e.input)});a.on("blur",function(){b.hide();a.removeListener("change",p.input);g.removeListener("scroll",e.input);g.removeListener("resize",e.input)});a.on("destroy",function(){g.removeListener("scroll",e.input);g.removeListener("resize",e.input);b.clearCustomData();
+b.remove()});a.focusManager.hasFocus&&b.show();a.focusManager.add(b,1)}}var u=CKEDITOR.addTemplate("floatcontainer",'<div id="cke_{name}" class="cke {id} cke_reset_all cke_chrome cke_editor_{name} cke_float cke_{langDir} '+CKEDITOR.env.cssClass+'" dir="{langDir}" title="'+(CKEDITOR.env.gecko?" ":"")+'" lang="{langCode}" role="application" style="{style}"><div class="cke_inner"><div id="{topId}" class="cke_top" role="presentation">{content}</div></div></div>'),g=CKEDITOR.document.getWindow(),t=CKEDITOR.tools.cssLength;
+CKEDITOR.plugins.add("floatingspace",{init:function(a){a.on("loaded",function(){q(this)},null,null,20)}})})();CKEDITOR.plugins.add("listblock",{requires:"panel",onLoad:function(){var e=CKEDITOR.addTemplate("panel-list",'<ul role="presentation" class="cke_panel_list">{items}</ul>'),f=CKEDITOR.addTemplate("panel-list-item",'<li id="{id}" class="cke_panel_listItem" role=presentation><a id="{id}_option" _cke_focus=1 hidefocus=true title="{title}" href="javascript:void(\'{val}\')"  {onclick}="CKEDITOR.tools.callFunction({clickFn},\'{val}\'); return false;" role="option">{text}</a></li>'),g=CKEDITOR.addTemplate("panel-list-group",
+'<h1 id="{id}" class="cke_panel_grouptitle" role="presentation" >{label}</h1>');CKEDITOR.ui.panel.prototype.addListBlock=function(a,b){return this.addBlock(a,new CKEDITOR.ui.listBlock(this.getHolderElement(),b))};CKEDITOR.ui.listBlock=CKEDITOR.tools.createClass({base:CKEDITOR.ui.panel.block,$:function(a,b){var b=b||{},c=b.attributes||(b.attributes={});(this.multiSelect=!!b.multiSelect)&&(c["aria-multiselectable"]=!0);!c.role&&(c.role="listbox");this.base.apply(this,arguments);this.element.setAttribute("role",
+c.role);c=this.keys;c[40]="next";c[9]="next";c[38]="prev";c[CKEDITOR.SHIFT+9]="prev";c[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(c[13]="mouseup");this._.pendingHtml=[];this._.pendingList=[];this._.items={};this._.groups={}},_:{close:function(){if(this._.started){var a=e.output({items:this._.pendingList.join("")});this._.pendingList=[];this._.pendingHtml.push(a);delete this._.started}},getClick:function(){this._.click||(this._.click=CKEDITOR.tools.addFunction(function(a){var b=this.toggle(a);
+if(this.onClick)this.onClick(a,b)},this));return this._.click}},proto:{add:function(a,b,c){var d=CKEDITOR.tools.getNextId();this._.started||(this._.started=1,this._.size=this._.size||0);this._.items[a]=d;a={id:d,val:a,onclick:CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick",clickFn:this._.getClick(),title:c||a,text:b||a};this._.pendingList.push(f.output(a))},startGroup:function(a){this._.close();var b=CKEDITOR.tools.getNextId();this._.groups[a]=b;this._.pendingHtml.push(g.output({id:b,
+label:a}))},commit:function(){this._.close();this.element.appendHtml(this._.pendingHtml.join(""));delete this._.size;this._.pendingHtml=[]},toggle:function(a){var b=this.isMarked(a);b?this.unmark(a):this.mark(a);return!b},hideGroup:function(a){var b=(a=this.element.getDocument().getById(this._.groups[a]))&&a.getNext();a&&(a.setStyle("display","none"),b&&"ul"==b.getName()&&b.setStyle("display","none"))},hideItem:function(a){this.element.getDocument().getById(this._.items[a]).setStyle("display","none")},
+showAll:function(){var a=this._.items,b=this._.groups,c=this.element.getDocument(),d;for(d in a)c.getById(a[d]).setStyle("display","");for(var e in b)a=c.getById(b[e]),d=a.getNext(),a.setStyle("display",""),d&&"ul"==d.getName()&&d.setStyle("display","")},mark:function(a){this.multiSelect||this.unmarkAll();var a=this._.items[a],b=this.element.getDocument().getById(a);b.addClass("cke_selected");this.element.getDocument().getById(a+"_option").setAttribute("aria-selected",!0);this.onMark&&this.onMark(b)},
+unmark:function(a){var b=this.element.getDocument(),a=this._.items[a],c=b.getById(a);c.removeClass("cke_selected");b.getById(a+"_option").removeAttribute("aria-selected");this.onUnmark&&this.onUnmark(c)},unmarkAll:function(){var a=this._.items,b=this.element.getDocument(),c;for(c in a){var d=a[c];b.getById(d).removeClass("cke_selected");b.getById(d+"_option").removeAttribute("aria-selected")}this.onUnmark&&this.onUnmark()},isMarked:function(a){return this.element.getDocument().getById(this._.items[a]).hasClass("cke_selected")},
+focus:function(a){this._.focusIndex=-1;var b=this.element.getElementsByTag("a"),c,d=-1;if(a)for(c=this.element.getDocument().getById(this._.items[a]).getFirst();a=b.getItem(++d);){if(a.equals(c)){this._.focusIndex=d;break}}else b=CKEDITOR.document.getWindow().getScrollPosition().y,this.element.focus(),CKEDITOR.env.webkit&&(CKEDITOR.document[CKEDITOR.env.webkit?"getBody":"getDocumentElement"]().$.scrollTop=b);c&&setTimeout(function(){c.focus()},0)}}})}});CKEDITOR.plugins.add("richcombo",{requires:"floatpanel,listblock,button",beforeInit:function(c){c.ui.addHandler(CKEDITOR.UI_RICHCOMBO,CKEDITOR.ui.richCombo.handler)}});
+(function(){var c='<span id="{id}" class="cke_combo cke_combo__{name} {cls}" role="presentation"><span id="{id}_label" class="cke_combo_label">{label}</span><a class="cke_combo_button" hidefocus=true title="{title}" tabindex="-1"'+(CKEDITOR.env.gecko&&10900<=CKEDITOR.env.version&&!CKEDITOR.env.hc?"":'" href="javascript:void(\'{titleJs}\')"')+' hidefocus="true" role="button" aria-labelledby="{id}_label" aria-haspopup="true"';if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)c+=' onkeypress="return false;"';
+CKEDITOR.env.gecko&&(c+=' onblur="this.style.cssText = this.style.cssText;"');var c=c+(' onkeydown="return CKEDITOR.tools.callFunction({keydownFn},event,this);" onmousedown="return CKEDITOR.tools.callFunction({mousedownFn},event);"  onfocus="return CKEDITOR.tools.callFunction({focusFn},event);" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},this);return false;"><span id="{id}_text" class="cke_combo_text cke_combo_inlinelabel">{label}</span><span class="cke_combo_open"><span class="cke_combo_arrow">'+
+(CKEDITOR.env.hc?"&#9660;":CKEDITOR.env.air?"&nbsp;":"")+"</span></span></a></span>"),h=CKEDITOR.addTemplate("combo",c);CKEDITOR.UI_RICHCOMBO="richcombo";CKEDITOR.ui.richCombo=CKEDITOR.tools.createClass({$:function(a){CKEDITOR.tools.extend(this,a,{canGroup:!1,title:a.label,modes:{wysiwyg:1},editorFocus:1});a=this.panel||{};delete this.panel;this.id=CKEDITOR.tools.getNextNumber();this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.className="cke_combopanel";a.block={multiSelect:a.multiSelect,
+attributes:a.attributes};a.toolbarRelated=!0;this._={panelDefinition:a,items:{}}},proto:{renderHtml:function(a){var b=[];this.render(a,b);return b.join("")},render:function(a,b){function j(){var d=this.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED;this.setState(a.readOnly&&!this.readOnly?CKEDITOR.TRISTATE_DISABLED:d);this.setValue("")}var c=CKEDITOR.env,g="cke_"+this.id,e=CKEDITOR.tools.addFunction(function(b){i&&(a.unlockSelection(1),i=0);d.execute(b)},this),f=this,d={id:g,combo:this,
+focus:function(){CKEDITOR.document.getById(g).getChild(1).focus()},execute:function(d){var b=f._;if(b.state!=CKEDITOR.TRISTATE_DISABLED)if(f.createPanel(a),b.on)b.panel.hide();else{f.commit();var c=f.getValue();c?b.list.mark(c):b.list.unmarkAll();b.panel.showBlock(f.id,new CKEDITOR.dom.element(d),4)}},clickFn:e};a.on("mode",j,this);!this.readOnly&&a.on("readOnly",j,this);var k=CKEDITOR.tools.addFunction(function(a,b){var a=new CKEDITOR.dom.event(a),c=a.getKeystroke();switch(c){case 13:case 32:case 40:CKEDITOR.tools.callFunction(e,
+b);break;default:d.onkey(d,c)}a.preventDefault()}),l=CKEDITOR.tools.addFunction(function(){d.onfocus&&d.onfocus()}),i=0,m=CKEDITOR.tools.addFunction(function(){if(CKEDITOR.env.opera){var b=a.editable();b.isInline()&&b.hasFocus&&(a.lockSelection(),i=1)}});d.keyDownFn=k;c={id:g,name:this.name||this.command,label:this.label,title:this.title,cls:this.className||"",titleJs:c.gecko&&10900<=c.version&&!c.hc?"":(this.title||"").replace("'",""),keydownFn:k,mousedownFn:m,focusFn:l,clickFn:e};h.output(c,b);
+if(this.onRender)this.onRender();return d},createPanel:function(a){if(!this._.panel){var b=this._.panelDefinition,c=this._.panelDefinition.block,h=b.parent||CKEDITOR.document.getBody(),g="cke_combopanel__"+this.name,e=new CKEDITOR.ui.floatPanel(a,h,b),f=e.addListBlock(this.id,c),d=this;e.onShow=function(){this.element.addClass(g);d.setState(CKEDITOR.TRISTATE_ON);d._.on=1;d.editorFocus&&a.focus();if(d.onOpen)d.onOpen();f.focus(!f.multiSelect&&d.getValue())};e.onHide=function(b){this.element.removeClass(g);
+d.setState(d.modes&&d.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);d._.on=0;if(!b&&d.onClose)d.onClose()};e.onEscape=function(){e.hide(1)};f.onClick=function(a,b){d.onClick&&d.onClick.call(d,a,b);e.hide()};this._.panel=e;this._.list=f;e.getBlock(this.id).onHide=function(){d._.on=0;d.setState(CKEDITOR.TRISTATE_OFF)};this.init&&this.init()}},setValue:function(a,b){this._.value=a;var c=this.document.getById("cke_"+this.id+"_text");c&&(!a&&!b?(b=this.label,c.addClass("cke_combo_inlinelabel")):
+c.removeClass("cke_combo_inlinelabel"),c.setText("undefined"!=typeof b?b:a))},getValue:function(){return this._.value||""},unmarkAll:function(){this._.list.unmarkAll()},mark:function(a){this._.list.mark(a)},hideItem:function(a){this._.list.hideItem(a)},hideGroup:function(a){this._.list.hideGroup(a)},showAll:function(){this._.list.showAll()},add:function(a,b,c){this._.items[a]=c||a;this._.list.add(a,b,c)},startGroup:function(a){this._.list.startGroup(a)},commit:function(){this._.committed||(this._.list.commit(),
+this._.committed=1,CKEDITOR.ui.fire("ready",this));this._.committed=1},setState:function(a){if(this._.state!=a){var b=this.document.getById("cke_"+this.id);b.setState(a,"cke_combo");a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute("aria-disabled",!0):b.removeAttribute("aria-disabled");this._.state=a}},enable:function(){this._.state==CKEDITOR.TRISTATE_DISABLED&&this.setState(this._.lastState)},disable:function(){this._.state!=CKEDITOR.TRISTATE_DISABLED&&(this._.lastState=this._.state,this.setState(CKEDITOR.TRISTATE_DISABLED))}},
+statics:{handler:{create:function(a){return new CKEDITOR.ui.richCombo(a)}}}});CKEDITOR.ui.prototype.addRichCombo=function(a,b){this.add(a,CKEDITOR.UI_RICHCOMBO,b)}})();(function(){function g(a,b,g,h,j,n,k,o){for(var p=a.config,l=new CKEDITOR.style(k),c=j.split(";"),j=[],f={},d=0;d<c.length;d++){var e=c[d];if(e){var e=e.split("/"),m={},i=c[d]=e[0];m[g]=j[d]=e[1]||i;f[i]=new CKEDITOR.style(k,m);f[i]._.definition.name=i}else c.splice(d--,1)}a.ui.addRichCombo(b,{label:h.label,title:h.panelTitle,toolbar:"styles,"+o,allowedContent:l,requiredContent:l,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(p.contentsCss),multiSelect:!1,attributes:{"aria-label":h.panelTitle}},
+init:function(){this.startGroup(h.panelTitle);for(var a=0;a<c.length;a++){var b=c[a];this.add(b,f[b].buildPreview(),b)}},onClick:function(b){a.focus();a.fire("saveSnapshot");var c=f[b];a[this.getValue()==b?"removeStyle":"applyStyle"](c);a.fire("saveSnapshot")},onRender:function(){a.on("selectionChange",function(a){for(var b=this.getValue(),a=a.data.path.elements,c=0,d;c<a.length;c++){d=a[c];for(var e in f)if(f[e].checkElementMatch(d,!0)){e!=b&&this.setValue(e);return}}this.setValue("",n)},this)}})}
+CKEDITOR.plugins.add("font",{requires:"richcombo",init:function(a){var b=a.config;g(a,"Font","family",a.lang.font,b.font_names,b.font_defaultLabel,b.font_style,30);g(a,"FontSize","size",a.lang.font.fontSize,b.fontSize_sizes,b.fontSize_defaultLabel,b.fontSize_style,40)}})})();CKEDITOR.config.font_names="Arial/Arial, Helvetica, sans-serif;Comic Sans MS/Comic Sans MS, cursive;Courier New/Courier New, Courier, monospace;Georgia/Georgia, serif;Lucida Sans Unicode/Lucida Sans Unicode, Lucida Grande, sans-serif;Tahoma/Tahoma, Geneva, sans-serif;Times New Roman/Times New Roman, Times, serif;Trebuchet MS/Trebuchet MS, Helvetica, sans-serif;Verdana/Verdana, Geneva, sans-serif";
+CKEDITOR.config.font_defaultLabel="";CKEDITOR.config.font_style={element:"span",styles:{"font-family":"#(family)"},overrides:[{element:"font",attributes:{face:null}}]};CKEDITOR.config.fontSize_sizes="8/8px;9/9px;10/10px;11/11px;12/12px;14/14px;16/16px;18/18px;20/20px;22/22px;24/24px;26/26px;28/28px;36/36px;48/48px;72/72px";CKEDITOR.config.fontSize_defaultLabel="";CKEDITOR.config.fontSize_style={element:"span",styles:{"font-size":"#(size)"},overrides:[{element:"font",attributes:{size:null}}]};CKEDITOR.plugins.add("forms",{requires:"dialog,fakeobjects",onLoad:function(){CKEDITOR.addCss(".cke_editable form{border: 1px dotted #FF0000;padding: 2px;}\n");CKEDITOR.addCss("img.cke_hidden{background-image: url("+CKEDITOR.getUrl(this.path+"images/hiddenfield.gif")+");background-position: center center;background-repeat: no-repeat;border: 1px solid #a9a9a9;width: 16px !important;height: 16px !important;}")},init:function(b){var a=b.lang,e=0,h={email:1,password:1,search:1,tel:1,text:1,url:1},j={checkbox:"input[type,name,checked]",
+radio:"input[type,name,checked]",textfield:"input[type,name,value,size,maxlength]",textarea:"textarea[cols,rows,name]",select:"select[name,size,multiple]; option[value,selected]",button:"input[type,name,value]",form:"form[action,name,id,enctype,target,method]",hiddenfield:"input[type,name,value]",imagebutton:"input[type,alt,src]{width,height,border,border-width,border-style,margin,float}"},k={checkbox:"input",radio:"input",textfield:"input",textarea:"textarea",select:"select",button:"input",form:"form",
+hiddenfield:"input",imagebutton:"input"},d=function(g,c,h){var d={allowedContent:j[c],requiredContent:k[c]};"form"==c&&(d.context="form");b.addCommand(c,new CKEDITOR.dialogCommand(c,d));b.ui.addButton&&b.ui.addButton(g,{label:a.common[g.charAt(0).toLowerCase()+g.slice(1)],command:c,toolbar:"forms,"+(e+=10)});CKEDITOR.dialog.add(c,h)},f=this.path+"dialogs/";!b.blockless&&d("Form","form",f+"form.js");d("Checkbox","checkbox",f+"checkbox.js");d("Radio","radio",f+"radio.js");d("TextField","textfield",
+f+"textfield.js");d("Textarea","textarea",f+"textarea.js");d("Select","select",f+"select.js");d("Button","button",f+"button.js");var i=CKEDITOR.plugins.get("image");i&&d("ImageButton","imagebutton",CKEDITOR.plugins.getPath("image")+"dialogs/image.js");d("HiddenField","hiddenfield",f+"hiddenfield.js");b.addMenuItems&&(d={checkbox:{label:a.forms.checkboxAndRadio.checkboxTitle,command:"checkbox",group:"checkbox"},radio:{label:a.forms.checkboxAndRadio.radioTitle,command:"radio",group:"radio"},textfield:{label:a.forms.textfield.title,
+command:"textfield",group:"textfield"},hiddenfield:{label:a.forms.hidden.title,command:"hiddenfield",group:"hiddenfield"},imagebutton:{label:a.image.titleButton,command:"imagebutton",group:"imagebutton"},button:{label:a.forms.button.title,command:"button",group:"button"},select:{label:a.forms.select.title,command:"select",group:"select"},textarea:{label:a.forms.textarea.title,command:"textarea",group:"textarea"}},!b.blockless&&(d.form={label:a.forms.form.menu,command:"form",group:"form"}),b.addMenuItems(d));
+b.contextMenu&&(!b.blockless&&b.contextMenu.addListener(function(g,c,a){if((g=a.contains("form",1))&&!g.isReadOnly())return{form:CKEDITOR.TRISTATE_OFF}}),b.contextMenu.addListener(function(a){if(a&&!a.isReadOnly()){var c=a.getName();if(c=="select")return{select:CKEDITOR.TRISTATE_OFF};if(c=="textarea")return{textarea:CKEDITOR.TRISTATE_OFF};if(c=="input"){var b=a.getAttribute("type")||"text";switch(b){case "button":case "submit":case "reset":return{button:CKEDITOR.TRISTATE_OFF};case "checkbox":return{checkbox:CKEDITOR.TRISTATE_OFF};
+case "radio":return{radio:CKEDITOR.TRISTATE_OFF};case "image":return i?{imagebutton:CKEDITOR.TRISTATE_OFF}:null}if(h[b])return{textfield:CKEDITOR.TRISTATE_OFF}}if(c=="img"&&a.data("cke-real-element-type")=="hiddenfield")return{hiddenfield:CKEDITOR.TRISTATE_OFF}}}));b.on("doubleclick",function(a){var c=a.data.element;if(!b.blockless&&c.is("form"))a.data.dialog="form";else if(c.is("select"))a.data.dialog="select";else if(c.is("textarea"))a.data.dialog="textarea";else if(c.is("img")&&c.data("cke-real-element-type")==
+"hiddenfield")a.data.dialog="hiddenfield";else if(c.is("input")){c=c.getAttribute("type")||"text";switch(c){case "button":case "submit":case "reset":a.data.dialog="button";break;case "checkbox":a.data.dialog="checkbox";break;case "radio":a.data.dialog="radio";break;case "image":a.data.dialog="imagebutton"}if(h[c])a.data.dialog="textfield"}})},afterInit:function(b){var a=b.dataProcessor,e=a&&a.htmlFilter,a=a&&a.dataFilter;CKEDITOR.env.ie&&e&&e.addRules({elements:{input:function(a){var a=a.attributes,
+b=a.type;b||(a.type="text");("checkbox"==b||"radio"==b)&&"on"==a.value&&delete a.value}}});a&&a.addRules({elements:{input:function(a){if("hidden"==a.attributes.type)return b.createFakeParserElement(a,"cke_hidden","hiddenfield")}}})}});
+CKEDITOR.env.ie&&(CKEDITOR.dom.element.prototype.hasAttribute=CKEDITOR.tools.override(CKEDITOR.dom.element.prototype.hasAttribute,function(b){return function(a){this.$.attributes.getNamedItem(a);if("input"==this.getName())switch(a){case "class":return 0<this.$.className.length;case "checked":return!!this.$.checked;case "value":var e=this.getAttribute("type");return"checkbox"==e||"radio"==e?"on"!=this.$.value:this.$.value}return b.apply(this,arguments)}}));CKEDITOR.plugins.add("format",{requires:"richcombo",init:function(a){if(!a.blockless){for(var g=a.config,c=a.lang.format,k=g.format_tags.split(";"),d={},l=0,m=[],h=0;h<k.length;h++){var i=k[h],j=new CKEDITOR.style(g["format_"+i]);if(!a.filter.customConfig||a.filter.check(j))l++,d[i]=j,d[i]._.enterMode=a.config.enterMode,m.push(j)}0!==l&&a.ui.addRichCombo("Format",{label:c.label,title:c.panelTitle,toolbar:"styles,20",allowedContent:m,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(g.contentsCss),
+multiSelect:!1,attributes:{"aria-label":c.panelTitle}},init:function(){this.startGroup(c.panelTitle);for(var a in d){var e=c["tag_"+a];this.add(a,d[a].buildPreview(e),e)}},onClick:function(b){a.focus();a.fire("saveSnapshot");var b=d[b],e=a.elementPath();a[b.checkActive(e)?"removeStyle":"applyStyle"](b);setTimeout(function(){a.fire("saveSnapshot")},0)},onRender:function(){a.on("selectionChange",function(b){var e=this.getValue(),b=b.data.path,c=!a.readOnly&&b.isContextFor("p");this[c?"enable":"disable"]();
+if(c){for(var f in d)if(d[f].checkActive(b)){f!=e&&this.setValue(f,a.lang.format["tag_"+f]);return}this.setValue("")}},this)}})}}});CKEDITOR.config.format_tags="p;h1;h2;h3;h4;h5;h6;pre;address;div";CKEDITOR.config.format_p={element:"p"};CKEDITOR.config.format_div={element:"div"};CKEDITOR.config.format_pre={element:"pre"};CKEDITOR.config.format_address={element:"address"};CKEDITOR.config.format_h1={element:"h1"};CKEDITOR.config.format_h2={element:"h2"};CKEDITOR.config.format_h3={element:"h3"};
+CKEDITOR.config.format_h4={element:"h4"};CKEDITOR.config.format_h5={element:"h5"};CKEDITOR.config.format_h6={element:"h6"};(function(){var b={canUndo:!1,exec:function(a){var b=a.document.createElement("hr");a.insertElement(b)},allowedContent:"hr",requiredContent:"hr"};CKEDITOR.plugins.add("horizontalrule",{init:function(a){a.blockless||(a.addCommand("horizontalrule",b),a.ui.addButton&&a.ui.addButton("HorizontalRule",{label:a.lang.horizontalrule.toolbar,command:"horizontalrule",toolbar:"insert,40"}))}})})();CKEDITOR.plugins.add("htmlwriter",{init:function(b){var a=new CKEDITOR.htmlWriter;a.forceSimpleAmpersand=b.config.forceSimpleAmpersand;a.indentationChars=b.config.dataIndentationChars||"\t";b.dataProcessor.writer=a}});
+CKEDITOR.htmlWriter=CKEDITOR.tools.createClass({base:CKEDITOR.htmlParser.basicWriter,$:function(){this.base();this.indentationChars="\t";this.selfClosingEnd=" />";this.lineBreakChars="\n";this.sortAttributes=1;this._.indent=0;this._.indentation="";this._.inPre=0;this._.rules={};var b=CKEDITOR.dtd,a;for(a in CKEDITOR.tools.extend({},b.$nonBodyContent,b.$block,b.$listItem,b.$tableContent))this.setRules(a,{indent:!b[a]["#"],breakBeforeOpen:1,breakBeforeClose:!b[a]["#"],breakAfterClose:1,needsSpace:a in
+b.$block&&!(a in{li:1,dt:1,dd:1})});this.setRules("br",{breakAfterOpen:1});this.setRules("title",{indent:0,breakAfterOpen:0});this.setRules("style",{indent:0,breakBeforeClose:1});this.setRules("pre",{breakAfterOpen:1,indent:0})},proto:{openTag:function(b){var a=this._.rules[b];this._.afterCloser&&(a&&a.needsSpace&&this._.needsSpace)&&this._.output.push("\n");this._.indent?this.indentation():a&&a.breakBeforeOpen&&(this.lineBreak(),this.indentation());this._.output.push("<",b);this._.afterCloser=0},
+openTagClose:function(b,a){var c=this._.rules[b];a?(this._.output.push(this.selfClosingEnd),c&&c.breakAfterClose&&(this._.needsSpace=c.needsSpace)):(this._.output.push(">"),c&&c.indent&&(this._.indentation+=this.indentationChars));c&&c.breakAfterOpen&&this.lineBreak();"pre"==b&&(this._.inPre=1)},attribute:function(b,a){"string"==typeof a&&(this.forceSimpleAmpersand&&(a=a.replace(/&amp;/g,"&")),a=CKEDITOR.tools.htmlEncodeAttr(a));this._.output.push(" ",b,'="',a,'"')},closeTag:function(b){var a=this._.rules[b];
+a&&a.indent&&(this._.indentation=this._.indentation.substr(this.indentationChars.length));this._.indent?this.indentation():a&&a.breakBeforeClose&&(this.lineBreak(),this.indentation());this._.output.push("</",b,">");"pre"==b&&(this._.inPre=0);a&&a.breakAfterClose&&(this.lineBreak(),this._.needsSpace=a.needsSpace);this._.afterCloser=1},text:function(b){this._.indent&&(this.indentation(),!this._.inPre&&(b=CKEDITOR.tools.ltrim(b)));this._.output.push(b)},comment:function(b){this._.indent&&this.indentation();
+this._.output.push("<\!--",b,"--\>")},lineBreak:function(){!this._.inPre&&0<this._.output.length&&this._.output.push(this.lineBreakChars);this._.indent=1},indentation:function(){!this._.inPre&&this._.indentation&&this._.output.push(this._.indentation);this._.indent=0},reset:function(){this._.output=[];this._.indent=0;this._.indentation="";this._.afterCloser=0;this._.inPre=0},setRules:function(b,a){var c=this._.rules[b];c?CKEDITOR.tools.extend(c,a,!0):this._.rules[b]=a}}});(function(){CKEDITOR.plugins.add("iframe",{requires:"dialog,fakeobjects",onLoad:function(){CKEDITOR.addCss("img.cke_iframe{background-image: url("+CKEDITOR.getUrl(this.path+"images/placeholder.png")+");background-position: center center;background-repeat: no-repeat;border: 1px solid #a9a9a9;width: 80px;height: 80px;}")},init:function(a){var b=a.lang.iframe,c="iframe[align,longdesc,frameborder,height,name,scrolling,src,title,width]";a.plugins.dialogadvtab&&(c+=";iframe"+a.plugins.dialogadvtab.allowedContent({id:1,
+classes:1,styles:1}));CKEDITOR.dialog.add("iframe",this.path+"dialogs/iframe.js");a.addCommand("iframe",new CKEDITOR.dialogCommand("iframe",{allowedContent:c,requiredContent:"iframe"}));a.ui.addButton&&a.ui.addButton("Iframe",{label:b.toolbar,command:"iframe",toolbar:"insert,80"});a.on("doubleclick",function(a){var b=a.data.element;b.is("img")&&"iframe"==b.data("cke-real-element-type")&&(a.data.dialog="iframe")});a.addMenuItems&&a.addMenuItems({iframe:{label:b.title,command:"iframe",group:"image"}});
+a.contextMenu&&a.contextMenu.addListener(function(a){if(a&&a.is("img")&&"iframe"==a.data("cke-real-element-type"))return{iframe:CKEDITOR.TRISTATE_OFF}})},afterInit:function(a){var b=a.dataProcessor;(b=b&&b.dataFilter)&&b.addRules({elements:{iframe:function(b){return a.createFakeParserElement(b,"cke_iframe","iframe",!0)}}})}})})();(function(){function k(a){var d=this.editor,b=a.document,c=b.body;(a=b.getElementById("cke_actscrpt"))&&a.parentNode.removeChild(a);(a=b.getElementById("cke_shimscrpt"))&&a.parentNode.removeChild(a);CKEDITOR.env.gecko&&(c.contentEditable=!1,2E4>CKEDITOR.env.version&&(c.innerHTML=c.innerHTML.replace(/^.*<\!-- cke-content-start --\>/,""),setTimeout(function(){var a=new CKEDITOR.dom.range(new CKEDITOR.dom.document(b));a.setStart(new CKEDITOR.dom.node(c),0);d.getSelection().selectRanges([a])},0)));c.contentEditable=
+!0;CKEDITOR.env.ie&&(c.hideFocus=!0,c.disabled=!0,c.removeAttribute("disabled"));delete this._.isLoadingData;this.$=c;b=new CKEDITOR.dom.document(b);this.setup();CKEDITOR.env.ie&&(b.getDocumentElement().addClass(b.$.compatMode),d.config.enterMode!=CKEDITOR.ENTER_P&&b.on("selectionchange",function(){var a=b.getBody(),c=d.getSelection(),e=c&&c.getRanges()[0];e&&(a.getHtml().match(/^<p>&nbsp;<\/p>$/i)&&e.startContainer.equals(a))&&setTimeout(function(){e=d.getSelection().getRanges()[0];if(!e.startContainer.equals("body")){a.getFirst().remove(1);
+e.moveToElementEditEnd(a);e.select()}},0)}));try{d.document.$.execCommand("2D-position",!1,!0)}catch(e){}try{d.document.$.execCommand("enableInlineTableEditing",!1,!d.config.disableNativeTableHandles)}catch(g){}if(d.config.disableObjectResizing)try{this.getDocument().$.execCommand("enableObjectResizing",!1,!1)}catch(f){this.attachListener(this,CKEDITOR.env.ie?"resizestart":"resize",function(a){a.data.preventDefault()})}(CKEDITOR.env.gecko||CKEDITOR.env.ie&&"CSS1Compat"==d.document.$.compatMode)&&
+this.attachListener(this,"keydown",function(a){var b=a.data.getKeystroke();if(b==33||b==34)if(CKEDITOR.env.ie)setTimeout(function(){d.getSelection().scrollIntoView()},0);else if(d.window.$.innerHeight>this.$.offsetHeight){var c=d.createRange();c[b==33?"moveToElementEditStart":"moveToElementEditEnd"](this);c.select();a.data.preventDefault()}});CKEDITOR.env.ie&&this.attachListener(b,"blur",function(){try{b.$.selection.empty()}catch(a){}});d.document.getElementsByTag("title").getItem(0).data("cke-title",
+d.document.$.title);CKEDITOR.env.ie&&(d.document.$.title=this._.docTitle);CKEDITOR.tools.setTimeout(function(){d.fire("contentDom");if(this._.isPendingFocus){d.focus();this._.isPendingFocus=false}setTimeout(function(){d.fire("dataReady")},0);CKEDITOR.env.ie&&setTimeout(function(){if(d.document){var a=d.document.$.body;a.runtimeStyle.marginBottom="0px";a.runtimeStyle.marginBottom=""}},1E3)},0,this)}function l(){var a=[];if(8<=CKEDITOR.document.$.documentMode){a.push("html.CSS1Compat [contenteditable=false]{min-height:0 !important}");
+var d=[],b;for(b in CKEDITOR.dtd.$removeEmpty)d.push("html.CSS1Compat "+b+"[contenteditable=false]");a.push(d.join(",")+"{display:inline-block}")}else CKEDITOR.env.gecko&&(a.push("html{height:100% !important}"),a.push("img:-moz-broken{-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}"));a.push("html{cursor:text;*cursor:auto}");a.push("img,input,textarea{cursor:default}");return a.join("\n")}CKEDITOR.plugins.add("wysiwygarea",{init:function(a){a.config.fullPage&&a.addFeature({allowedContent:"html head title; style [media,type]; body (*)[id]; meta link [*]",
+requiredContent:"body"});a.addMode("wysiwyg",function(d){function b(b){b&&b.removeListener();a.editable(new j(a,e.$.contentWindow.document.body));a.setData(a.getData(1),d)}var c="document.open();"+(CKEDITOR.env.ie?"("+CKEDITOR.tools.fixDomain+")();":"")+"document.close();",c=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?"javascript:void(function(){"+encodeURIComponent(c)+"}())":"",e=CKEDITOR.dom.element.createFromHtml('<iframe src="'+c+'" frameBorder="0"></iframe>');e.setStyles({width:"100%",
+height:"100%"});e.addClass("cke_wysiwyg_frame cke_reset");var g=a.ui.space("contents");g.append(e);if(c=CKEDITOR.env.ie||CKEDITOR.env.gecko)e.on("load",b);var f=a.title,h=a.lang.common.editorHelp;f&&(CKEDITOR.env.ie&&(f+=", "+h),e.setAttribute("title",f));var f=CKEDITOR.tools.getNextId(),i=CKEDITOR.dom.element.createFromHtml('<span id="'+f+'" class="cke_voice_label">'+h+"</span>");g.append(i,1);a.on("beforeModeUnload",function(a){a.removeListener();i.remove()});e.setAttributes({"aria-describedby":f,
+tabIndex:a.tabIndex,allowTransparency:"true"});!c&&b();CKEDITOR.env.webkit&&(c=function(){g.setStyle("width","100%");e.hide();e.setSize("width",g.getSize("width"));g.removeStyle("width");e.show()},e.setCustomData("onResize",c),CKEDITOR.document.getWindow().on("resize",c));a.fire("ariaWidget",e)})}});var j=CKEDITOR.tools.createClass({$:function(a){this.base.apply(this,arguments);this._.frameLoadedHandler=CKEDITOR.tools.addFunction(function(a){CKEDITOR.tools.setTimeout(k,0,this,a)},this);this._.docTitle=
+this.getWindow().getFrame().getAttribute("title")},base:CKEDITOR.editable,proto:{setData:function(a,d){var b=this.editor;if(d)this.setHtml(a),b.fire("dataReady");else{this._.isLoadingData=!0;b._.dataStore={id:1};var c=b.config,e=c.fullPage,g=c.docType,f=CKEDITOR.tools.buildStyleHtml(l()).replace(/<style>/,'<style data-cke-temp="1">');e||(f+=CKEDITOR.tools.buildStyleHtml(b.config.contentsCss));var h=c.baseHref?'<base href="'+c.baseHref+'" data-cke-temp="1" />':"";e&&(a=a.replace(/<!DOCTYPE[^>]*>/i,
+function(a){b.docType=g=a;return""}).replace(/<\?xml\s[^\?]*\?>/i,function(a){b.xmlDeclaration=a;return""}));b.dataProcessor&&(a=b.dataProcessor.toHtml(a));e?(/<body[\s|>]/.test(a)||(a="<body>"+a),/<html[\s|>]/.test(a)||(a="<html>"+a+"</html>"),/<head[\s|>]/.test(a)?/<title[\s|>]/.test(a)||(a=a.replace(/<head[^>]*>/,"$&<title></title>")):a=a.replace(/<html[^>]*>/,"$&<head><title></title></head>"),h&&(a=a.replace(/<head>/,"$&"+h)),a=a.replace(/<\/head\s*>/,f+"$&"),a=g+a):a=c.docType+'<html dir="'+
+c.contentsLangDirection+'" lang="'+(c.contentsLanguage||b.langCode)+'"><head><title>'+this._.docTitle+"</title>"+h+f+"</head><body"+(c.bodyId?' id="'+c.bodyId+'"':"")+(c.bodyClass?' class="'+c.bodyClass+'"':"")+">"+a+"</body></html>";CKEDITOR.env.gecko&&(a=a.replace(/<body/,'<body contenteditable="true" '),2E4>CKEDITOR.env.version&&(a=a.replace(/<body[^>]*>/,"$&<\!-- cke-content-start --\>")));c='<script id="cke_actscrpt" type="text/javascript"'+(CKEDITOR.env.ie?' defer="defer" ':"")+">var wasLoaded=0;function onload(){if(!wasLoaded)window.parent.CKEDITOR.tools.callFunction("+
+this._.frameLoadedHandler+",window);wasLoaded=1;}"+(CKEDITOR.env.ie?"onload();":'document.addEventListener("DOMContentLoaded", onload, false );')+"<\/script>";CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(c+='<script id="cke_shimscrpt">(function(){var e="abbr,article,aside,audio,bdi,canvas,data,datalist,details,figcaption,figure,footer,header,hgroup,mark,meter,nav,output,progress,section,summary,time,video".split(","),i=e.length;while(i--){document.createElement(e[i])}})()<\/script>');a=a.replace(/(?=\s*<\/(:?head)>)/,
+c);this.clearCustomData();this.clearListeners();b.fire("contentDomUnload");var i=this.getDocument();try{i.write(a)}catch(j){setTimeout(function(){i.write(a)},0)}}},getData:function(a){if(a)return this.getHtml();var a=this.editor,d=a.config,b=d.fullPage,c=b&&a.docType,e=b&&a.xmlDeclaration,g=this.getDocument(),b=b?g.getDocumentElement().getOuterHtml():g.getBody().getHtml();CKEDITOR.env.gecko&&d.enterMode!=CKEDITOR.ENTER_BR&&(b=b.replace(/<br>(?=\s*(:?$|<\/body>))/,""));a.dataProcessor&&(b=a.dataProcessor.toDataFormat(b));
+e&&(b=e+"\n"+b);c&&(b=c+"\n"+b);return b},focus:function(){this._.isLoadingData?this._.isPendingFocus=!0:j.baseProto.focus.call(this)},detach:function(){var a=this.editor,d=a.document,b=a.window.getFrame();j.baseProto.detach.call(this);this.clearCustomData();d.getDocumentElement().clearCustomData();b.clearCustomData();CKEDITOR.tools.removeFunction(this._.frameLoadedHandler);(d=b.removeCustomData("onResize"))&&d.removeListener();a.fire("contentDomUnload");b.remove()}}})})();
+CKEDITOR.config.disableObjectResizing=!1;CKEDITOR.config.disableNativeTableHandles=!0;CKEDITOR.config.disableNativeSpellChecker=!0;CKEDITOR.config.contentsCss=CKEDITOR.basePath+"contents.css";(function(){function e(b,a){a||(a=b.getSelection().getSelectedElement());if(a&&a.is("img")&&!a.data("cke-realelement")&&!a.isReadOnly())return a}function f(b){var a=b.getStyle("float");if("inherit"==a||"none"==a)a=0;a||(a=b.getAttribute("align"));return a}CKEDITOR.plugins.add("image",{requires:"dialog",init:function(b){CKEDITOR.dialog.add("image",this.path+"dialogs/image.js");var a="img[alt,!src]{border-style,border-width,float,height,margin,margin-bottom,margin-left,margin-right,margin-top,width}";
+CKEDITOR.dialog.isTabEnabled(b,"image","advanced")&&(a="img[alt,dir,id,lang,longdesc,!src,title]{*}(*)");b.addCommand("image",new CKEDITOR.dialogCommand("image",{allowedContent:a,requiredContent:"img[alt,src]",contentTransformations:[["img{width}: sizeToStyle","img[width]: sizeToAttribute"],["img{float}: alignmentToStyle","img[align]: alignmentToAttribute"]]}));b.ui.addButton&&b.ui.addButton("Image",{label:b.lang.common.image,command:"image",toolbar:"insert,10"});b.on("doubleclick",function(a){var b=
+a.data.element;b.is("img")&&(!b.data("cke-realelement")&&!b.isReadOnly())&&(a.data.dialog="image")});b.addMenuItems&&b.addMenuItems({image:{label:b.lang.image.menu,command:"image",group:"image"}});b.contextMenu&&b.contextMenu.addListener(function(a){if(e(b,a))return{image:CKEDITOR.TRISTATE_OFF}})},afterInit:function(b){function a(a){var d=b.getCommand("justify"+a);if(d){if("left"==a||"right"==a)d.on("exec",function(d){var c=e(b),g;c&&(g=f(c),g==a?(c.removeStyle("float"),a==f(c)&&c.removeAttribute("align")):
+c.setStyle("float",a),d.cancel())});d.on("refresh",function(d){var c=e(b);c&&(c=f(c),this.setState(c==a?CKEDITOR.TRISTATE_ON:"right"==a||"left"==a?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED),d.cancel())})}}a("left");a("right");a("center");a("block")}})})();CKEDITOR.config.image_removeLinkByEmptyURL=!0;(function(){function k(a,b){var e,f;b.on("refresh",function(a){var b=[j],c;for(c in a.data.states)b.push(a.data.states[c]);this.setState(CKEDITOR.tools.search(b,m)?m:j)},b,null,100);b.on("exec",function(b){e=a.getSelection();f=e.createBookmarks(1);b.data||(b.data={});b.data.done=!1},b,null,0);b.on("exec",function(){a.forceNextSelectionCheck();e.selectBookmarks(f)},b,null,100)}var j=CKEDITOR.TRISTATE_DISABLED,m=CKEDITOR.TRISTATE_OFF;CKEDITOR.plugins.add("indent",{init:function(a){var b=CKEDITOR.plugins.indent.genericDefinition;
+k(a,a.addCommand("indent",new b(!0)));k(a,a.addCommand("outdent",new b));a.ui.addButton&&(a.ui.addButton("Indent",{label:a.lang.indent.indent,command:"indent",directional:!0,toolbar:"indent,20"}),a.ui.addButton("Outdent",{label:a.lang.indent.outdent,command:"outdent",directional:!0,toolbar:"indent,10"}));a.on("dirChanged",function(b){var f=a.createRange(),i=b.data.node;f.setStartBefore(i);f.setEndAfter(i);for(var l=new CKEDITOR.dom.walker(f),c;c=l.next();)if(c.type==CKEDITOR.NODE_ELEMENT)if(!c.equals(i)&&
+c.getDirection()){f.setStartAfter(c);l=new CKEDITOR.dom.walker(f)}else{var d=a.config.indentClasses;if(d)for(var g=b.data.dir=="ltr"?["_rtl",""]:["","_rtl"],h=0;h<d.length;h++)if(c.hasClass(d[h]+g[0])){c.removeClass(d[h]+g[0]);c.addClass(d[h]+g[1])}d=c.getStyle("margin-right");g=c.getStyle("margin-left");d?c.setStyle("margin-left",d):c.removeStyle("margin-left");g?c.setStyle("margin-right",g):c.removeStyle("margin-right")}})}});CKEDITOR.plugins.indent={genericDefinition:function(a){this.isIndent=
+!!a;this.startDisabled=!this.isIndent},specificDefinition:function(a,b,e){this.name=b;this.editor=a;this.jobs={};this.enterBr=a.config.enterMode==CKEDITOR.ENTER_BR;this.isIndent=!!e;this.relatedGlobal=e?"indent":"outdent";this.indentKey=e?9:CKEDITOR.SHIFT+9;this.database={}},registerCommands:function(a,b){a.on("pluginsLoaded",function(){for(var a in b)(function(a,b){var e=a.getCommand(b.relatedGlobal),c;for(c in b.jobs)e.on("exec",function(d){d.data.done||(a.fire("lockSnapshot"),b.execJob(a,c)&&(d.data.done=
+!0),a.fire("unlockSnapshot"),CKEDITOR.dom.element.clearAllMarkers(b.database))},this,null,c),e.on("refresh",function(d){d.data.states||(d.data.states={});d.data.states[b.name+"@"+c]=b.refreshJob(a,c,d.data.path)},this,null,c);a.addFeature(b)})(this,b[a])})}};CKEDITOR.plugins.indent.genericDefinition.prototype={context:"p",exec:function(){}};CKEDITOR.plugins.indent.specificDefinition.prototype={execJob:function(a,b){var e=this.jobs[b];if(e.state!=j)return e.exec.call(this,a)},refreshJob:function(a,
+b,e){b=this.jobs[b];b.state=b.refresh.call(this,a,e);return b.state},getContext:function(a){return a.contains(this.context)}}})();(function(){function h(b,c,a){if(!b.getCustomData("indent_processed")){var d=this.editor,f=this.isIndent;if(c){d=b.$.className.match(this.classNameRegex);a=0;d&&(d=d[1],a=CKEDITOR.tools.indexOf(c,d)+1);if(0>(a+=f?1:-1))return;a=Math.min(a,c.length);a=Math.max(a,0);b.$.className=CKEDITOR.tools.ltrim(b.$.className.replace(this.classNameRegex,""));0<a&&b.addClass(c[a-1])}else{var c=i(b,a),a=parseInt(b.getStyle(c),10),g=d.config.indentOffset||40;isNaN(a)&&(a=0);a+=(f?1:-1)*g;if(0>a)return;a=Math.max(a,
+0);a=Math.ceil(a/g)*g;b.setStyle(c,a?a+(d.config.indentUnit||"px"):"");""===b.getAttribute("style")&&b.removeAttribute("style")}CKEDITOR.dom.element.setMarker(this.database,b,"indent_processed",1)}}function i(b,c){return"ltr"==(c||b.getComputedStyle("direction"))?"margin-left":"margin-right"}var j=CKEDITOR.dtd.$listItem,l=CKEDITOR.dtd.$list,f=CKEDITOR.TRISTATE_DISABLED,k=CKEDITOR.TRISTATE_OFF;CKEDITOR.plugins.add("indentblock",{requires:"indent",init:function(b){function c(b,c){a.specificDefinition.apply(this,
+arguments);this.allowedContent={"div h1 h2 h3 h4 h5 h6 ol p pre ul":{propertiesOnly:!0,styles:!d?"margin-left,margin-right":null,classes:d||null}};this.enterBr&&(this.allowedContent.div=!0);this.requiredContent=(this.enterBr?"div":"p")+(d?"("+d.join(",")+")":"{margin-left}");this.jobs={20:{refresh:function(a,b){var e=b.block||b.blockLimit;if(e.is(j))e=e.getParent();else if(e.getAscendant(j))return f;if(!this.enterBr&&!this.getContext(b))return f;if(d){var c;c=d;var e=e.$.className.match(this.classNameRegex),
+g=this.isIndent;c=e?g?e[1]!=c.slice(-1):true:g;return c?k:f}return this.isIndent?k:e?CKEDITOR[(parseInt(e.getStyle(i(e)),10)||0)<=0?"TRISTATE_DISABLED":"TRISTATE_OFF"]:f},exec:function(a){var b=a.getSelection(),b=b&&b.getRanges(1)[0],c;if(c=a.elementPath().contains(l))h.call(this,c,d);else{b=b.createIterator();a=a.config.enterMode;b.enforceRealBlocks=true;for(b.enlargeBr=a!=CKEDITOR.ENTER_BR;c=b.getNextParagraph(a==CKEDITOR.ENTER_P?"p":"div");)h.call(this,c,d)}return true}}}}var a=CKEDITOR.plugins.indent,
+d=b.config.indentClasses;a.registerCommands(b,{indentblock:new c(b,"indentblock",!0),outdentblock:new c(b,"outdentblock")});CKEDITOR.tools.extend(c.prototype,a.specificDefinition.prototype,{context:{div:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ul:1,ol:1,p:1,pre:1,table:1},classNameRegex:d?RegExp("(?:^|\\s+)("+d.join("|")+")(?=$|\\s)"):null})}})})();(function(){function s(e){function g(b){for(var f=d.startContainer,a=d.endContainer;f&&!f.getParent().equals(b);)f=f.getParent();for(;a&&!a.getParent().equals(b);)a=a.getParent();if(!f||!a)return!1;for(var h=f,f=[],c=!1;!c;)h.equals(a)&&(c=!0),f.push(h),h=h.getNext();if(1>f.length)return!1;h=b.getParents(!0);for(a=0;a<h.length;a++)if(h[a].getName&&k[h[a].getName()]){b=h[a];break}for(var h=n.isIndent?1:-1,a=f[0],f=f[f.length-1],c=CKEDITOR.plugins.list.listToArray(b,o),g=c[f.getCustomData("listarray_index")].indent,
+a=a.getCustomData("listarray_index");a<=f.getCustomData("listarray_index");a++)if(c[a].indent+=h,0<h){var l=c[a].parent;c[a].parent=new CKEDITOR.dom.element(l.getName(),l.getDocument())}for(a=f.getCustomData("listarray_index")+1;a<c.length&&c[a].indent>g;a++)c[a].indent+=h;f=CKEDITOR.plugins.list.arrayToList(c,o,null,e.config.enterMode,b.getDirection());if(!n.isIndent){var i;if((i=b.getParent())&&i.is("li"))for(var h=f.listNode.getChildren(),m=[],j,a=h.count()-1;0<=a;a--)(j=h.getItem(a))&&(j.is&&
+j.is("li"))&&m.push(j)}f&&f.listNode.replace(b);if(m&&m.length)for(a=0;a<m.length;a++){for(j=b=m[a];(j=j.getNext())&&j.is&&j.getName()in k;)CKEDITOR.env.ie&&!b.getFirst(function(a){return t(a)&&u(a)})&&b.append(d.document.createText(" ")),b.append(j);b.insertAfter(i)}return!0}for(var n=this,o=this.database,k=this.context,l=e.getSelection(),l=(l&&l.getRanges(1)).createIterator(),d;d=l.getNextRange();){for(var b=d.getCommonAncestor();b&&!(b.type==CKEDITOR.NODE_ELEMENT&&k[b.getName()]);)b=b.getParent();
+b||(b=d.startPath().contains(k))&&d.setEndAt(b,CKEDITOR.POSITION_BEFORE_END);if(!b){var c=d.getEnclosedNode();c&&(c.type==CKEDITOR.NODE_ELEMENT&&c.getName()in k)&&(d.setStartAt(c,CKEDITOR.POSITION_AFTER_START),d.setEndAt(c,CKEDITOR.POSITION_BEFORE_END),b=c)}b&&(d.startContainer.type==CKEDITOR.NODE_ELEMENT&&d.startContainer.getName()in k)&&(c=new CKEDITOR.dom.walker(d),c.evaluator=i,d.startContainer=c.next());b&&(d.endContainer.type==CKEDITOR.NODE_ELEMENT&&d.endContainer.getName()in k)&&(c=new CKEDITOR.dom.walker(d),
+c.evaluator=i,d.endContainer=c.previous());if(b)return g(b)}return 0}function p(e,g){g||(g=e.contains(this.context));return g&&e.block&&e.block.equals(g.getFirst(i))}function i(e){return e.type==CKEDITOR.NODE_ELEMENT&&e.is("li")}var t=CKEDITOR.dom.walker.whitespaces(!0),u=CKEDITOR.dom.walker.bookmark(!1,!0),q=CKEDITOR.TRISTATE_DISABLED,r=CKEDITOR.TRISTATE_OFF;CKEDITOR.plugins.add("indentlist",{requires:"indent",init:function(e){function g(e,g){i.specificDefinition.apply(this,arguments);this.requiredContent=
+["ul","ol"];e.on("key",function(g){if("wysiwyg"==e.mode&&g.data.keyCode==this.indentKey){var d=this.getContext(e.elementPath());if(d&&(!this.isIndent||!p.call(this,e.elementPath(),d)))e.execCommand(this.relatedGlobal),g.cancel()}},this);this.jobs[this.isIndent?10:30]={refresh:this.isIndent?function(e,d){var b=this.getContext(d),c=p.call(this,d,b);return!b||!this.isIndent||c?q:r}:function(e,d){return!this.getContext(d)||this.isIndent?q:r},exec:CKEDITOR.tools.bind(s,this)}}var i=CKEDITOR.plugins.indent;
+i.registerCommands(e,{indentlist:new g(e,"indentlist",!0),outdentlist:new g(e,"outdentlist")});CKEDITOR.tools.extend(g.prototype,i.specificDefinition.prototype,{context:{ol:1,ul:1}})}})})();CKEDITOR.plugins.add("smiley",{requires:"dialog",init:function(a){a.config.smiley_path=a.config.smiley_path||this.path+"images/";a.addCommand("smiley",new CKEDITOR.dialogCommand("smiley",{allowedContent:"img[alt,height,!src,title,width]",requiredContent:"img"}));a.ui.addButton&&a.ui.addButton("Smiley",{label:a.lang.smiley.toolbar,command:"smiley",toolbar:"insert,50"});CKEDITOR.dialog.add("smiley",this.path+"dialogs/smiley.js")}});CKEDITOR.config.smiley_images="regular_smile.gif sad_smile.gif wink_smile.gif teeth_smile.gif confused_smile.gif tongue_smile.gif embarrassed_smile.gif omg_smile.gif whatchutalkingabout_smile.gif angry_smile.gif angel_smile.gif shades_smile.gif devil_smile.gif cry_smile.gif lightbulb.gif thumbs_down.gif thumbs_up.gif heart.gif broken_heart.gif kiss.gif envelope.gif".split(" ");
+CKEDITOR.config.smiley_descriptions="smiley;sad;wink;laugh;frown;cheeky;blush;surprise;indecision;angry;angel;cool;devil;crying;enlightened;no;yes;heart;broken heart;kiss;mail".split(";");(function(){function l(a,c){var c=void 0===c||c,b;if(c)b=a.getComputedStyle("text-align");else{for(;!a.hasAttribute||!a.hasAttribute("align")&&!a.getStyle("text-align");){b=a.getParent();if(!b)break;a=b}b=a.getStyle("text-align")||a.getAttribute("align")||""}b&&(b=b.replace(/(?:-(?:moz|webkit)-)?(?:start|auto)/i,""));!b&&c&&(b="rtl"==a.getComputedStyle("direction")?"right":"left");return b}function f(a,c,b){this.editor=a;this.name=c;this.value=b;this.context="p";var c=a.config.justifyClasses,g=a.config.enterMode==
+CKEDITOR.ENTER_P?"p":"div";if(c){switch(b){case "left":this.cssClassName=c[0];break;case "center":this.cssClassName=c[1];break;case "right":this.cssClassName=c[2];break;case "justify":this.cssClassName=c[3]}this.cssClassRegex=RegExp("(?:^|\\s+)(?:"+c.join("|")+")(?=$|\\s)");this.requiredContent=g+"("+this.cssClassName+")"}else this.requiredContent=g+"{text-align}";this.allowedContent={"caption div h1 h2 h3 h4 h5 h6 p pre td th li":{propertiesOnly:!0,styles:this.cssClassName?null:"text-align",classes:this.cssClassName||
+null}};a.config.enterMode==CKEDITOR.ENTER_BR&&(this.allowedContent.div=!0)}function j(a){var c=a.editor,b=c.createRange();b.setStartBefore(a.data.node);b.setEndAfter(a.data.node);for(var g=new CKEDITOR.dom.walker(b),d;d=g.next();)if(d.type==CKEDITOR.NODE_ELEMENT)if(!d.equals(a.data.node)&&d.getDirection())b.setStartAfter(d),g=new CKEDITOR.dom.walker(b);else{var e=c.config.justifyClasses;e&&(d.hasClass(e[0])?(d.removeClass(e[0]),d.addClass(e[2])):d.hasClass(e[2])&&(d.removeClass(e[2]),d.addClass(e[0])));
+e=d.getStyle("text-align");"left"==e?d.setStyle("text-align","right"):"right"==e&&d.setStyle("text-align","left")}}f.prototype={exec:function(a){var c=a.getSelection(),b=a.config.enterMode;if(c){for(var g=c.createBookmarks(),d=c.getRanges(!0),e=this.cssClassName,f,h,i=a.config.useComputedState,i=void 0===i||i,k=d.length-1;0<=k;k--){f=d[k].createIterator();for(f.enlargeBr=b!=CKEDITOR.ENTER_BR;h=f.getNextParagraph(b==CKEDITOR.ENTER_P?"p":"div");){h.removeAttribute("align");h.removeStyle("text-align");
+var j=e&&(h.$.className=CKEDITOR.tools.ltrim(h.$.className.replace(this.cssClassRegex,""))),m=this.state==CKEDITOR.TRISTATE_OFF&&(!i||l(h,!0)!=this.value);e?m?h.addClass(e):j||h.removeAttribute("class"):m&&h.setStyle("text-align",this.value)}}a.focus();a.forceNextSelectionCheck();c.selectBookmarks(g)}},refresh:function(a,c){var b=c.block||c.blockLimit;this.setState("body"!=b.getName()&&l(b,this.editor.config.useComputedState)==this.value?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)}};CKEDITOR.plugins.add("justify",
+{init:function(a){if(!a.blockless){var c=new f(a,"justifyleft","left"),b=new f(a,"justifycenter","center"),g=new f(a,"justifyright","right"),d=new f(a,"justifyblock","justify");a.addCommand("justifyleft",c);a.addCommand("justifycenter",b);a.addCommand("justifyright",g);a.addCommand("justifyblock",d);a.ui.addButton&&(a.ui.addButton("JustifyLeft",{label:a.lang.justify.left,command:"justifyleft",toolbar:"align,10"}),a.ui.addButton("JustifyCenter",{label:a.lang.justify.center,command:"justifycenter",
+toolbar:"align,20"}),a.ui.addButton("JustifyRight",{label:a.lang.justify.right,command:"justifyright",toolbar:"align,30"}),a.ui.addButton("JustifyBlock",{label:a.lang.justify.block,command:"justifyblock",toolbar:"align,40"}));a.on("dirChanged",j)}}})})();CKEDITOR.plugins.add("link",{requires:"dialog,fakeobjects",onLoad:function(){function b(b){return d.replace(/%1/g,"rtl"==b?"right":"left").replace(/%2/g,"cke_contents_"+b)}var a="background:url("+CKEDITOR.getUrl(this.path+"images"+(CKEDITOR.env.hidpi?"/hidpi":"")+"/anchor.png")+") no-repeat %1 center;border:1px dotted #00f;background-size:16px;",d=".%2 a.cke_anchor,.%2 a.cke_anchor_empty,.cke_editable.%2 a[name],.cke_editable.%2 a[data-cke-saved-name]{"+a+"padding-%1:18px;cursor:auto;}"+(CKEDITOR.env.ie?
+"a.cke_anchor_empty{display:inline-block;}":"")+".%2 img.cke_anchor{"+a+"width:16px;min-height:15px;height:1.15em;vertical-align:"+(CKEDITOR.env.opera?"middle":"text-bottom")+";}";CKEDITOR.addCss(b("ltr")+b("rtl"))},init:function(b){var a="a[!href]";CKEDITOR.dialog.isTabEnabled(b,"link","advanced")&&(a=a.replace("]",",accesskey,charset,dir,id,lang,name,rel,tabindex,title,type]{*}(*)"));CKEDITOR.dialog.isTabEnabled(b,"link","target")&&(a=a.replace("]",",target,onclick]"));b.addCommand("link",new CKEDITOR.dialogCommand("link",
+{allowedContent:a,requiredContent:"a[href]"}));b.addCommand("anchor",new CKEDITOR.dialogCommand("anchor",{allowedContent:"a[!name,id]",requiredContent:"a[name]"}));b.addCommand("unlink",new CKEDITOR.unlinkCommand);b.addCommand("removeAnchor",new CKEDITOR.removeAnchorCommand);b.setKeystroke(CKEDITOR.CTRL+76,"link");b.ui.addButton&&(b.ui.addButton("Link",{label:b.lang.link.toolbar,command:"link",toolbar:"links,10"}),b.ui.addButton("Unlink",{label:b.lang.link.unlink,command:"unlink",toolbar:"links,20"}),
+b.ui.addButton("Anchor",{label:b.lang.link.anchor.toolbar,command:"anchor",toolbar:"links,30"}));CKEDITOR.dialog.add("link",this.path+"dialogs/link.js");CKEDITOR.dialog.add("anchor",this.path+"dialogs/anchor.js");b.on("doubleclick",function(a){var c=CKEDITOR.plugins.link.getSelectedLink(b)||a.data.element;if(!c.isReadOnly())if(c.is("a")){a.data.dialog=c.getAttribute("name")&&(!c.getAttribute("href")||!c.getChildCount())?"anchor":"link";b.getSelection().selectElement(c)}else if(CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,
+c))a.data.dialog="anchor"});b.addMenuItems&&b.addMenuItems({anchor:{label:b.lang.link.anchor.menu,command:"anchor",group:"anchor",order:1},removeAnchor:{label:b.lang.link.anchor.remove,command:"removeAnchor",group:"anchor",order:5},link:{label:b.lang.link.menu,command:"link",group:"link",order:1},unlink:{label:b.lang.link.unlink,command:"unlink",group:"link",order:5}});b.contextMenu&&b.contextMenu.addListener(function(a){if(!a||a.isReadOnly())return null;a=CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,
+a);if(!a&&!(a=CKEDITOR.plugins.link.getSelectedLink(b)))return null;var c={};a.getAttribute("href")&&a.getChildCount()&&(c={link:CKEDITOR.TRISTATE_OFF,unlink:CKEDITOR.TRISTATE_OFF});if(a&&a.hasAttribute("name"))c.anchor=c.removeAnchor=CKEDITOR.TRISTATE_OFF;return c})},afterInit:function(b){var a=b.dataProcessor,d=a&&a.dataFilter,a=a&&a.htmlFilter,c=b._.elementsPath&&b._.elementsPath.filters;d&&d.addRules({elements:{a:function(a){var c=a.attributes;if(!c.name)return null;var d=!a.children.length;if(CKEDITOR.plugins.link.synAnchorSelector){var a=
+d?"cke_anchor_empty":"cke_anchor",e=c["class"];if(c.name&&(!e||0>e.indexOf(a)))c["class"]=(e||"")+" "+a;d&&CKEDITOR.plugins.link.emptyAnchorFix&&(c.contenteditable="false",c["data-cke-editable"]=1)}else if(CKEDITOR.plugins.link.fakeAnchor&&d)return b.createFakeParserElement(a,"cke_anchor","anchor");return null}}});CKEDITOR.plugins.link.emptyAnchorFix&&a&&a.addRules({elements:{a:function(a){delete a.attributes.contenteditable}}});c&&c.push(function(a,c){if("a"==c&&(CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,
+a)||a.getAttribute("name")&&(!a.getAttribute("href")||!a.getChildCount())))return"anchor"})}});
+CKEDITOR.plugins.link={getSelectedLink:function(b){var a=b.getSelection(),d=a.getSelectedElement();return d&&d.is("a")?d:(a=a.getRanges(!0)[0])?(a.shrink(CKEDITOR.SHRINK_TEXT),b.elementPath(a.getCommonAncestor()).contains("a",1)):null},fakeAnchor:CKEDITOR.env.opera||CKEDITOR.env.webkit,synAnchorSelector:CKEDITOR.env.ie,emptyAnchorFix:CKEDITOR.env.ie&&8>CKEDITOR.env.version,tryRestoreFakeAnchor:function(b,a){if(a&&a.data("cke-real-element-type")&&"anchor"==a.data("cke-real-element-type")){var d=b.restoreRealElement(a);
+if(d.data("cke-saved-name"))return d}}};CKEDITOR.unlinkCommand=function(){};CKEDITOR.unlinkCommand.prototype={exec:function(b){var a=new CKEDITOR.style({element:"a",type:CKEDITOR.STYLE_INLINE,alwaysRemoveElement:1});b.removeStyle(a)},refresh:function(b,a){var d=a.lastElement&&a.lastElement.getAscendant("a",!0);d&&"a"==d.getName()&&d.getAttribute("href")&&d.getChildCount()?this.setState(CKEDITOR.TRISTATE_OFF):this.setState(CKEDITOR.TRISTATE_DISABLED)},contextSensitive:1,startDisabled:1,requiredContent:"a[href]"};
+CKEDITOR.removeAnchorCommand=function(){};CKEDITOR.removeAnchorCommand.prototype={exec:function(b){var a=b.getSelection(),d=a.createBookmarks(),c;if(a&&(c=a.getSelectedElement())&&(CKEDITOR.plugins.link.fakeAnchor&&!c.getChildCount()?CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,c):c.is("a")))c.remove(1);else if(c=CKEDITOR.plugins.link.getSelectedLink(b))c.hasAttribute("href")?(c.removeAttributes({name:1,"data-cke-saved-name":1}),c.removeClass("cke_anchor")):c.remove(1);a.selectBookmarks(d)},requiredContent:"a[name]"};
+CKEDITOR.tools.extend(CKEDITOR.config,{linkShowAdvancedTab:!0,linkShowTargetTab:!0});(function(){function C(c,j,f){function b(b){if((d=a[b?"getFirst":"getLast"]())&&(!d.is||!d.isBlockBoundary())&&(m=j.root[b?"getPrevious":"getNext"](CKEDITOR.dom.walker.invisible(!0)))&&(!m.is||!m.isBlockBoundary({br:1})))c.document.createElement("br")[b?"insertBefore":"insertAfter"](d)}for(var i=CKEDITOR.plugins.list.listToArray(j.root,f),e=[],h=0;h<j.contents.length;h++){var g=j.contents[h];if((g=g.getAscendant("li",!0))&&!g.getCustomData("list_item_processed"))e.push(g),CKEDITOR.dom.element.setMarker(f,
+g,"list_item_processed",!0)}g=null;for(h=0;h<e.length;h++)g=e[h].getCustomData("listarray_index"),i[g].indent=-1;for(h=g+1;h<i.length;h++)if(i[h].indent>i[h-1].indent+1){e=i[h-1].indent+1-i[h].indent;for(g=i[h].indent;i[h]&&i[h].indent>=g;)i[h].indent+=e,h++;h--}var a=CKEDITOR.plugins.list.arrayToList(i,f,null,c.config.enterMode,j.root.getAttribute("dir")).listNode,d,m;b(!0);b();a.replace(j.root)}function x(c,j){this.name=c;this.context=this.type=j;this.allowedContent=j+" li";this.requiredContent=
+j}function y(c,j,f,b){for(var i,e;i=c[b?"getLast":"getFirst"](D);)(e=i.getDirection(1))!==j.getDirection(1)&&i.setAttribute("dir",e),i.remove(),f?i[b?"insertBefore":"insertAfter"](f):j.append(i,b)}function A(c){var j;(j=function(f){var b=c[f?"getPrevious":"getNext"](q);b&&(b.type==CKEDITOR.NODE_ELEMENT&&b.is(c.getName()))&&(y(c,b,null,!f),c.remove(),c=b)})();j(1)}function B(c){return c.type==CKEDITOR.NODE_ELEMENT&&(c.getName()in CKEDITOR.dtd.$block||c.getName()in CKEDITOR.dtd.$listItem)&&CKEDITOR.dtd[c.getName()]["#"]}
+function v(c,j,f){c.fire("saveSnapshot");f.enlarge(CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS);var b=f.extractContents();j.trim(!1,!0);var i=j.createBookmark(),e=new CKEDITOR.dom.elementPath(j.startContainer),h=e.block,e=e.lastElement.getAscendant("li",1)||h,g=new CKEDITOR.dom.elementPath(f.startContainer),a=g.contains(CKEDITOR.dtd.$listItem),g=g.contains(CKEDITOR.dtd.$list);h?(h=h.getBogus())&&h.remove():g&&(h=g.getPrevious(q))&&u(h)&&h.remove();(h=b.getLast())&&(h.type==CKEDITOR.NODE_ELEMENT&&h.is("br"))&&
+h.remove();(h=j.startContainer.getChild(j.startOffset))?b.insertBefore(h):j.startContainer.append(b);if(a&&(b=w(a)))e.contains(a)?(y(b,a.getParent(),a),b.remove()):e.append(b);for(;f.checkStartOfBlock()&&f.checkEndOfBlock();)g=f.startPath(),b=g.block,b.is("li")&&(e=b.getParent(),b.equals(e.getLast(q))&&b.equals(e.getFirst(q))&&(b=e)),f.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START),b.remove();f=f.clone();b=c.editable();f.setEndAt(b,CKEDITOR.POSITION_BEFORE_END);f=new CKEDITOR.dom.walker(f);f.evaluator=
+function(a){return q(a)&&!u(a)};(f=f.next())&&(f.type==CKEDITOR.NODE_ELEMENT&&f.getName()in CKEDITOR.dtd.$list)&&A(f);j.moveToBookmark(i);j.select();c.fire("saveSnapshot")}function w(c){return(c=c.getLast(q))&&c.type==CKEDITOR.NODE_ELEMENT&&c.getName()in r?c:null}var r={ol:1,ul:1},E=CKEDITOR.dom.walker.whitespaces(),F=CKEDITOR.dom.walker.bookmark(),q=function(c){return!(E(c)||F(c))},u=CKEDITOR.dom.walker.bogus();CKEDITOR.plugins.list={listToArray:function(c,j,f,b,i){if(!r[c.getName()])return[];b||
+(b=0);f||(f=[]);for(var e=0,h=c.getChildCount();e<h;e++){var g=c.getChild(e);g.type==CKEDITOR.NODE_ELEMENT&&g.getName()in CKEDITOR.dtd.$list&&CKEDITOR.plugins.list.listToArray(g,j,f,b+1);if("li"==g.$.nodeName.toLowerCase()){var a={parent:c,indent:b,element:g,contents:[]};i?a.grandparent=i:(a.grandparent=c.getParent(),a.grandparent&&"li"==a.grandparent.$.nodeName.toLowerCase()&&(a.grandparent=a.grandparent.getParent()));j&&CKEDITOR.dom.element.setMarker(j,g,"listarray_index",f.length);f.push(a);for(var d=
+0,m=g.getChildCount(),k;d<m;d++)k=g.getChild(d),k.type==CKEDITOR.NODE_ELEMENT&&r[k.getName()]?CKEDITOR.plugins.list.listToArray(k,j,f,b+1,a.grandparent):a.contents.push(k)}}return f},arrayToList:function(c,j,f,b,i){f||(f=0);if(!c||c.length<f+1)return null;for(var e,h=c[f].parent.getDocument(),g=new CKEDITOR.dom.documentFragment(h),a=null,d=f,m=Math.max(c[f].indent,0),k=null,n,l,p=b==CKEDITOR.ENTER_P?"p":"div";;){var o=c[d];e=o.grandparent;n=o.element.getDirection(1);if(o.indent==m){if(!a||c[d].parent.getName()!=
+a.getName())a=c[d].parent.clone(!1,1),i&&a.setAttribute("dir",i),g.append(a);k=a.append(o.element.clone(0,1));n!=a.getDirection(1)&&k.setAttribute("dir",n);for(e=0;e<o.contents.length;e++)k.append(o.contents[e].clone(1,1));d++}else if(o.indent==Math.max(m,0)+1)l=c[d-1].element.getDirection(1),d=CKEDITOR.plugins.list.arrayToList(c,null,d,b,l!=n?n:null),!k.getChildCount()&&(CKEDITOR.env.ie&&!(7<h.$.documentMode))&&k.append(h.createText(" ")),k.append(d.listNode),d=d.nextIndex;else if(-1==o.indent&&
+!f&&e){r[e.getName()]?(k=o.element.clone(!1,!0),n!=e.getDirection(1)&&k.setAttribute("dir",n)):k=new CKEDITOR.dom.documentFragment(h);var a=e.getDirection(1)!=n,s=o.element,z=s.getAttribute("class"),u=s.getAttribute("style"),w=k.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&(b!=CKEDITOR.ENTER_BR||a||u||z),t,x=o.contents.length;for(e=0;e<x;e++){t=o.contents[e];if(t.type==CKEDITOR.NODE_ELEMENT&&t.isBlockBoundary()){a&&!t.getDirection()&&t.setAttribute("dir",n);var v=t,y=s.getAttribute("style");y&&v.setAttribute("style",
+y.replace(/([^;])$/,"$1;")+(v.getAttribute("style")||""));z&&t.addClass(z)}else w&&(l||(l=h.createElement(p),a&&l.setAttribute("dir",n)),u&&l.setAttribute("style",u),z&&l.setAttribute("class",z),l.append(t.clone(1,1)));k.append(l||t.clone(1,1))}k.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&d!=c.length-1&&((n=k.getLast())&&(n.type==CKEDITOR.NODE_ELEMENT&&"_moz"==n.getAttribute("type"))&&n.remove(),(!k.getLast(q)||!(n.type==CKEDITOR.NODE_ELEMENT&&n.getName()in CKEDITOR.dtd.$block))&&k.append(h.createElement("br")));
+n=k.$.nodeName.toLowerCase();!CKEDITOR.env.ie&&("div"==n||"p"==n)&&k.appendBogus();g.append(k);a=null;d++}else return null;l=null;if(c.length<=d||Math.max(c[d].indent,0)<m)break}if(j)for(c=g.getFirst();c;){if(c.type==CKEDITOR.NODE_ELEMENT&&(CKEDITOR.dom.element.clearMarkers(j,c),c.getName()in CKEDITOR.dtd.$listItem&&(f=c,h=i=b=void 0,b=f.getDirection()))){for(i=f.getParent();i&&!(h=i.getDirection());)i=i.getParent();b==h&&f.removeAttribute("dir")}c=c.getNextSourceNode()}return{listNode:g,nextIndex:d}}};
+var G=/^h[1-6]$/,D=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT);x.prototype={exec:function(c){this.refresh(c,c.elementPath());var j=c.config,f=c.getSelection(),b=f&&f.getRanges(!0);if(this.state==CKEDITOR.TRISTATE_OFF){var i=c.editable();if(i.getFirst(q)){var e=1==b.length&&b[0];(j=e&&e.getEnclosedNode())&&(j.is&&this.type==j.getName())&&this.setState(CKEDITOR.TRISTATE_ON)}else j.enterMode==CKEDITOR.ENTER_BR?i.appendBogus():b[0].fixBlock(1,j.enterMode==CKEDITOR.ENTER_P?"p":"div"),f.selectRanges(b)}for(var j=
+f.createBookmarks(!0),i=[],h={},b=b.createIterator(),g=0;(e=b.getNextRange())&&++g;){var a=e.getBoundaryNodes(),d=a.startNode,m=a.endNode;d.type==CKEDITOR.NODE_ELEMENT&&"td"==d.getName()&&e.setStartAt(a.startNode,CKEDITOR.POSITION_AFTER_START);m.type==CKEDITOR.NODE_ELEMENT&&"td"==m.getName()&&e.setEndAt(a.endNode,CKEDITOR.POSITION_BEFORE_END);e=e.createIterator();for(e.forceBrBreak=this.state==CKEDITOR.TRISTATE_OFF;a=e.getNextParagraph();)if(!a.getCustomData("list_block")){CKEDITOR.dom.element.setMarker(h,
+a,"list_block",1);for(var k=c.elementPath(a),d=k.elements,m=0,k=k.blockLimit,n,l=d.length-1;0<=l&&(n=d[l]);l--)if(r[n.getName()]&&k.contains(n)){k.removeCustomData("list_group_object_"+g);(d=n.getCustomData("list_group_object"))?d.contents.push(a):(d={root:n,contents:[a]},i.push(d),CKEDITOR.dom.element.setMarker(h,n,"list_group_object",d));m=1;break}m||(m=k,m.getCustomData("list_group_object_"+g)?m.getCustomData("list_group_object_"+g).contents.push(a):(d={root:m,contents:[a]},CKEDITOR.dom.element.setMarker(h,
+m,"list_group_object_"+g,d),i.push(d)))}}for(n=[];0<i.length;)if(d=i.shift(),this.state==CKEDITOR.TRISTATE_OFF)if(r[d.root.getName()]){a=c;b=d;d=h;g=n;m=CKEDITOR.plugins.list.listToArray(b.root,d);k=[];for(e=0;e<b.contents.length;e++)if(l=b.contents[e],(l=l.getAscendant("li",!0))&&!l.getCustomData("list_item_processed"))k.push(l),CKEDITOR.dom.element.setMarker(d,l,"list_item_processed",!0);for(var l=b.root.getDocument(),p=void 0,o=void 0,e=0;e<k.length;e++){var s=k[e].getCustomData("listarray_index"),
+p=m[s].parent;p.is(this.type)||(o=l.createElement(this.type),p.copyAttributes(o,{start:1,type:1}),o.removeStyle("list-style-type"),m[s].parent=o)}a=CKEDITOR.plugins.list.arrayToList(m,d,null,a.config.enterMode);d=void 0;m=a.listNode.getChildCount();for(e=0;e<m&&(d=a.listNode.getChild(e));e++)d.getName()==this.type&&g.push(d);a.listNode.replace(b.root)}else{m=c;a=d;e=n;k=a.contents;b=a.root.getDocument();g=[];1==k.length&&k[0].equals(a.root)&&(d=b.createElement("div"),k[0].moveChildren&&k[0].moveChildren(d),
+k[0].append(d),k[0]=d);a=a.contents[0].getParent();for(l=0;l<k.length;l++)a=a.getCommonAncestor(k[l].getParent());p=m.config.useComputedState;m=d=void 0;p=void 0===p||p;for(l=0;l<k.length;l++)for(o=k[l];s=o.getParent();){if(s.equals(a)){g.push(o);!m&&o.getDirection()&&(m=1);o=o.getDirection(p);null!==d&&(d=d&&d!=o?null:o);break}o=s}if(!(1>g.length)){k=g[g.length-1].getNext();l=b.createElement(this.type);e.push(l);for(p=e=void 0;g.length;)e=g.shift(),p=b.createElement("li"),e.is("pre")||G.test(e.getName())?
+e.appendTo(p):(e.copyAttributes(p),d&&e.getDirection()&&(p.removeStyle("direction"),p.removeAttribute("dir")),e.moveChildren(p),e.remove()),p.appendTo(l);d&&m&&l.setAttribute("dir",d);k?l.insertBefore(k):l.appendTo(a)}}else this.state==CKEDITOR.TRISTATE_ON&&r[d.root.getName()]&&C.call(this,c,d,h);for(l=0;l<n.length;l++)A(n[l]);CKEDITOR.dom.element.clearAllMarkers(h);f.selectBookmarks(j);c.focus()},refresh:function(c,j){var f=j.contains(r,1),b=j.blockLimit||j.root;f&&b.contains(f)?this.setState(f.is(this.type)?
+CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF):this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.plugins.add("list",{requires:"indentlist",init:function(c){c.blockless||(c.addCommand("numberedlist",new x("numberedlist","ol")),c.addCommand("bulletedlist",new x("bulletedlist","ul")),c.ui.addButton&&(c.ui.addButton("NumberedList",{label:c.lang.list.numberedlist,command:"numberedlist",directional:!0,toolbar:"list,10"}),c.ui.addButton("BulletedList",{label:c.lang.list.bulletedlist,command:"bulletedlist",directional:!0,
+toolbar:"list,20"})),c.on("key",function(j){var f=j.data.keyCode;if(c.mode=="wysiwyg"&&f in{8:1,46:1}){var b=c.getSelection().getRanges()[0],i=b.startPath();if(b.collapsed){var i=new CKEDITOR.dom.elementPath(b.startContainer),e=f==8,h=c.editable(),g=new CKEDITOR.dom.walker(b.clone());g.evaluator=function(a){return q(a)&&!u(a)};g.guard=function(a,b){return!(b&&a.type==CKEDITOR.NODE_ELEMENT&&a.is("table"))};f=b.clone();if(e){var a,d;if((a=i.contains(r))&&b.checkBoundaryOfElement(a,CKEDITOR.START)&&
+(a=a.getParent())&&a.is("li")&&(a=w(a))){d=a;a=a.getPrevious(q);f.moveToPosition(a&&u(a)?a:d,CKEDITOR.POSITION_BEFORE_START)}else{g.range.setStartAt(h,CKEDITOR.POSITION_AFTER_START);g.range.setEnd(b.startContainer,b.startOffset);if((a=g.previous())&&a.type==CKEDITOR.NODE_ELEMENT&&(a.getName()in r||a.is("li"))){if(!a.is("li")){g.range.selectNodeContents(a);g.reset();g.evaluator=B;a=g.previous()}d=a;f.moveToElementEditEnd(d)}}if(d){v(c,f,b);j.cancel()}else if((f=i.contains(r))&&b.checkBoundaryOfElement(f,
+CKEDITOR.START)){d=f.getFirst(q);if(b.checkBoundaryOfElement(d,CKEDITOR.START)){a=f.getPrevious(q);if(w(d)){if(a){b.moveToElementEditEnd(a);b.select()}}else c.execCommand("outdent");j.cancel()}}}else if(d=i.contains("li")){g.range.setEndAt(h,CKEDITOR.POSITION_BEFORE_END);h=(i=d.getLast(q))&&B(i)?i:d;d=0;if((a=g.next())&&a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in r&&a.equals(i)){d=1;a=g.next()}else b.checkBoundaryOfElement(h,CKEDITOR.END)&&(d=1);if(d&&a){b=b.clone();b.moveToElementEditStart(a);v(c,
+f,b);j.cancel()}}else{g.range.setEndAt(h,CKEDITOR.POSITION_BEFORE_END);if((a=g.next())&&a.type==CKEDITOR.NODE_ELEMENT&&a.is(r)){a=a.getFirst(q);if(i.block&&b.checkStartOfBlock()&&b.checkEndOfBlock()){i.block.remove();b.moveToElementEditStart(a);b.select()}else if(w(a)){b.moveToElementEditStart(a);b.select()}else{b=b.clone();b.moveToElementEditStart(a);v(c,f,b)}j.cancel()}}setTimeout(function(){c.selectionChange(1)})}}}))}})})();(function(){CKEDITOR.plugins.liststyle={requires:"dialog,contextmenu",init:function(a){if(!a.blockless){var b;b=new CKEDITOR.dialogCommand("numberedListStyle",{requiredContent:"ol",allowedContent:"ol{list-style-type}[start]"});b=a.addCommand("numberedListStyle",b);a.addFeature(b);CKEDITOR.dialog.add("numberedListStyle",this.path+"dialogs/liststyle.js");b=new CKEDITOR.dialogCommand("bulletedListStyle",{requiredContent:"ul",allowedContent:"ul{list-style-type}"});b=a.addCommand("bulletedListStyle",b);
+a.addFeature(b);CKEDITOR.dialog.add("bulletedListStyle",this.path+"dialogs/liststyle.js");a.addMenuGroup("list",108);a.addMenuItems({numberedlist:{label:a.lang.liststyle.numberedTitle,group:"list",command:"numberedListStyle"},bulletedlist:{label:a.lang.liststyle.bulletedTitle,group:"list",command:"bulletedListStyle"}});a.contextMenu.addListener(function(a){if(!a||a.isReadOnly())return null;for(;a;){var b=a.getName();if("ol"==b)return{numberedlist:CKEDITOR.TRISTATE_OFF};if("ul"==b)return{bulletedlist:CKEDITOR.TRISTATE_OFF};
+a=a.getParent()}return null})}}};CKEDITOR.plugins.add("liststyle",CKEDITOR.plugins.liststyle)})();(function(){function O(a,b,d){return m(b)&&m(d)&&d.equals(b.getNext(function(a){return!(z(a)||A(a)||p(a))}))}function u(a){this.upper=a[0];this.lower=a[1];this.set.apply(this,a.slice(2))}function I(a){var b=a.element,d;return b&&m(b)?(d=b.getAscendant(a.triggers,!0))&&!d.contains(a.editable)&&!d.equals(a.editable)?d:null:null}function ca(a,b,d){o(a,b);o(a,d);a=b.size.bottom;d=d.size.top;return a&&d?0|(a+d)/2:a||d}function r(a,b,d){return b=b[d?"getPrevious":"getNext"](function(b){return b&&b.type==
+CKEDITOR.NODE_TEXT&&!z(b)||m(b)&&!p(b)&&!v(a,b)})}function da(a){var b=a.doc,d=B('<span contenteditable="false" style="'+J+"position:absolute;border-top:1px dashed "+a.boxColor+'"></span>',b),e=this.path+"images/"+(n.hidpi?"hidpi/":"")+"icon.png";q(d,{attach:function(){this.wrap.getParent()||this.wrap.appendTo(a.editable,!0);return this},lineChildren:[q(B('<span title="'+a.editor.lang.magicline.title+'" contenteditable="false">&#8629;</span>',b),{base:J+"height:17px;width:17px;"+(a.rtl?"left":"right")+
+":17px;background:url("+e+") center no-repeat "+a.boxColor+";cursor:pointer;"+(n.hc?"font-size: 15px;line-height:14px;border:1px solid #fff;text-align:center;":"")+(n.hidpi?"background-size: 9px 10px;":""),looks:["top:-8px;"+CKEDITOR.tools.cssVendorPrefix("border-radius","2px",1),"top:-17px;"+CKEDITOR.tools.cssVendorPrefix("border-radius","2px 2px 0px 0px",1),"top:-1px;"+CKEDITOR.tools.cssVendorPrefix("border-radius","0px 0px 2px 2px",1)]}),q(B(P,b),{base:Q+"left:0px;border-left-color:"+a.boxColor+
+";",looks:["border-width:8px 0 8px 8px;top:-8px","border-width:8px 0 0 8px;top:-8px","border-width:0 0 8px 8px;top:0px"]}),q(B(P,b),{base:Q+"right:0px;border-right-color:"+a.boxColor+";",looks:["border-width:8px 8px 8px 0;top:-8px","border-width:8px 8px 0 0;top:-8px","border-width:0 8px 8px 0;top:0px"]})],detach:function(){this.wrap.getParent()&&this.wrap.remove();return this},mouseNear:function(){o(a,this);var b=a.holdDistance,c=this.size;return c&&a.mouse.y>c.top-b&&a.mouse.y<c.bottom+b&&a.mouse.x>
+c.left-b&&a.mouse.x<c.right+b?!0:!1},place:function(){var b=a.view,c=a.editable,d=a.trigger,e=d.upper,g=d.lower,i=e||g,l=i.getParent(),k={};this.trigger=d;e&&o(a,e,!0);g&&o(a,g,!0);o(a,l,!0);a.inInlineMode&&C(a,!0);l.equals(c)?(k.left=b.scroll.x,k.right=-b.scroll.x,k.width=""):(k.left=i.size.left-i.size.margin.left+b.scroll.x-(a.inInlineMode?b.editable.left+b.editable.border.left:0),k.width=i.size.outerWidth+i.size.margin.left+i.size.margin.right+b.scroll.x,k.right="");e&&g?k.top=e.size.margin.bottom===
+g.size.margin.top?0|e.size.bottom+e.size.margin.bottom/2:e.size.margin.bottom<g.size.margin.top?e.size.bottom+e.size.margin.bottom:e.size.bottom+e.size.margin.bottom-g.size.margin.top:e?g||(k.top=e.size.bottom+e.size.margin.bottom):k.top=g.size.top-g.size.margin.top;d.is(x)||k.top>b.scroll.y-15&&k.top<b.scroll.y+5?(k.top=a.inInlineMode?0:b.scroll.y,this.look(x)):d.is(y)||k.top>b.pane.bottom-5&&k.top<b.pane.bottom+15?(k.top=a.inInlineMode?b.editable.height+b.editable.padding.top+b.editable.padding.bottom:
+b.pane.bottom-1,this.look(y)):(a.inInlineMode&&(k.top-=b.editable.top+b.editable.border.top),this.look(s));a.inInlineMode&&(k.top--,k.top+=b.editable.scroll.top,k.left+=b.editable.scroll.left);for(var R in k)k[R]=CKEDITOR.tools.cssLength(k[R]);this.setStyles(k)},look:function(a){if(this.oldLook!=a){for(var b=this.lineChildren.length,d;b--;)(d=this.lineChildren[b]).setAttribute("style",d.base+d.looks[0|a/2]);this.oldLook=a}},wrap:new K("span",a.doc)});for(b=d.lineChildren.length;b--;)d.lineChildren[b].appendTo(d);
+d.look(s);d.appendTo(d.wrap);d.unselectable();d.lineChildren[0].on("mouseup",function(b){d.detach();L(a,function(b){var d=a.line.trigger;b[d.is(D)?"insertBefore":"insertAfter"](d.is(D)?d.lower:d.upper)},!0);a.editor.focus();!n.ie&&a.enterMode!=CKEDITOR.ENTER_BR&&a.hotNode.scrollIntoView();b.data.preventDefault(!0)});d.on("mousedown",function(a){a.data.preventDefault(!0)});a.line=d}function L(a,b,d){var e=new CKEDITOR.dom.range(a.doc),f=a.editor,c;n.ie&&a.enterMode==CKEDITOR.ENTER_BR?c=a.doc.createText(E):
+(c=new K(a.enterBehavior,a.doc),a.enterMode!=CKEDITOR.ENTER_BR&&a.doc.createText(E).appendTo(c));d&&f.fire("saveSnapshot");b(c);e.moveToPosition(c,CKEDITOR.POSITION_AFTER_START);f.getSelection().selectRanges([e]);a.hotNode=c;d&&f.fire("saveSnapshot")}function S(a,b){return{canUndo:!0,modes:{wysiwyg:1},exec:function(){function d(d){var f=n.ie&&9>n.version?" ":E,c=a.hotNode&&a.hotNode.getText()==f&&a.element.equals(a.hotNode)&&a.lastCmdDirection===!!b;L(a,function(f){c&&a.hotNode&&a.hotNode.remove();
+f[b?"insertAfter":"insertBefore"](d);f.setAttributes({"data-cke-magicline-hot":1,"data-cke-magicline-dir":!!b});a.lastCmdDirection=!!b});!n.ie&&a.enterMode!=CKEDITOR.ENTER_BR&&a.hotNode.scrollIntoView();a.line.detach()}return function(e){e=e.getSelection().getStartElement();if((e=e.getAscendant(T,1))&&!e.equals(a.editable)&&!e.contains(a.editable)){a.element=e;var f=r(a,e,!b),c;m(f)&&f.is(a.triggers)&&f.is(ea)&&(!r(a,f,!b)||(c=r(a,f,!b))&&m(c)&&c.is(a.triggers))?d(f):(c=I(a,e),m(c)&&(r(a,c,!b)?(e=
+r(a,c,!b))&&(m(e)&&e.is(a.triggers))&&d(c):d(c)))}}}()}}function v(a,b){if(!b||!(b.type==CKEDITOR.NODE_ELEMENT&&b.$))return!1;var d=a.line;return d.wrap.equals(b)||d.wrap.contains(b)}function m(a){return a&&a.type==CKEDITOR.NODE_ELEMENT&&a.$}function p(a){if(!m(a))return!1;var b;if(!(b=U(a)))m(a)?(b={left:1,right:1,center:1},b=!(!b[a.getComputedStyle("float")]&&!b[a.getAttribute("align")])):b=!1;return b}function U(a){return!!{absolute:1,fixed:1,relative:1}[a.getComputedStyle("position")]}function F(a,
+b){return m(b)?b.is(a.triggers):null}function fa(a,b,d){b=b[d?"getLast":"getFirst"](function(b){return a.isRelevant(b)&&!b.is(ga)});if(!b)return!1;o(a,b);return d?b.size.top>a.mouse.y:b.size.bottom<a.mouse.y}function V(a){var b=a.editable,d=a.mouse,e=a.view,f=a.triggerOffset;C(a);var c=d.y>(a.inInlineMode?e.editable.top+e.editable.height/2:Math.min(e.editable.height,e.pane.height)/2),b=b[c?"getLast":"getFirst"](function(a){return!(z(a)||A(a))});if(!b)return null;v(a,b)&&(b=a.line.wrap[c?"getPrevious":
+"getNext"](function(a){return!(z(a)||A(a))}));if(!m(b)||p(b)||!F(a,b))return null;o(a,b);return!c&&0<=b.size.top&&0<d.y&&d.y<b.size.top+f?(a=a.inInlineMode||0===e.scroll.y?x:s,new u([null,b,D,G,a])):c&&b.size.bottom<=e.pane.height&&d.y>b.size.bottom-f&&d.y<e.pane.height?(a=a.inInlineMode||b.size.bottom>e.pane.height-f&&b.size.bottom<e.pane.height?y:s,new u([b,null,W,G,a])):null}function X(a){var b=a.mouse,d=a.view,e=a.triggerOffset,f=I(a);if(!f)return null;o(a,f);var e=Math.min(e,0|f.size.outerHeight/
+2),c=[],h,j;if(b.y>f.size.top-1&&b.y<f.size.top+e)j=!1;else if(b.y>f.size.bottom-e&&b.y<f.size.bottom+1)j=!0;else return null;if(p(f)||fa(a,f,j)||f.getParent().is(Y))return null;var g=r(a,f,!j);if(g){if(g&&g.type==CKEDITOR.NODE_TEXT)return null;if(m(g)){if(p(g)||!F(a,g)||g.getParent().is(Y))return null;c=[g,f][j?"reverse":"concat"]().concat([M,G])}}else f.equals(a.editable[j?"getLast":"getFirst"](a.isRelevant))?(C(a),j&&b.y>f.size.bottom-e&&b.y<d.pane.height&&f.size.bottom>d.pane.height-e&&f.size.bottom<
+d.pane.height?h=y:0<b.y&&b.y<f.size.top+e&&(h=x)):h=s,c=[null,f][j?"reverse":"concat"]().concat([j?W:D,G,h,f.equals(a.editable[j?"getLast":"getFirst"](a.isRelevant))?j?y:x:s]);return 0 in c?new u(c):null}function N(a,b,d,e){for(var f=function(){var d=n.ie?b.$.currentStyle:a.win.$.getComputedStyle(b.$,"");return n.ie?function(a){return d[CKEDITOR.tools.cssStyleToDomStyle(a)]}:function(a){return d.getPropertyValue(a)}}(),c=b.getDocumentPosition(),h={},j={},g={},i={},l=t.length;l--;)h[t[l]]=parseInt(f("border-"+
+t[l]+"-width"),10)||0,g[t[l]]=parseInt(f("padding-"+t[l]),10)||0,j[t[l]]=parseInt(f("margin-"+t[l]),10)||0;(!d||e)&&H(a,e);i.top=c.y-(d?0:a.view.scroll.y);i.left=c.x-(d?0:a.view.scroll.x);i.outerWidth=b.$.offsetWidth;i.outerHeight=b.$.offsetHeight;i.height=i.outerHeight-(g.top+g.bottom+h.top+h.bottom);i.width=i.outerWidth-(g.left+g.right+h.left+h.right);i.bottom=i.top+i.outerHeight;i.right=i.left+i.outerWidth;a.inInlineMode&&(i.scroll={top:b.$.scrollTop,left:b.$.scrollLeft});return q({border:h,padding:g,
+margin:j,ignoreScroll:d},i,!0)}function o(a,b,d){if(!m(b))return b.size=null;if(b.size){if(b.size.ignoreScroll==d&&b.size.date>new Date-Z)return null}else b.size={};return q(b.size,N(a,b,d),{date:+new Date},!0)}function C(a,b){a.view.editable=N(a,a.editable,b,!0)}function H(a,b){a.view||(a.view={});var d=a.view;if(b||!(d&&d.date>new Date-Z)){var e=a.win,d=e.getScrollPosition(),e=e.getViewPaneSize();q(a.view,{scroll:{x:d.x,y:d.y,width:a.doc.$.documentElement.scrollWidth-e.width,height:a.doc.$.documentElement.scrollHeight-
+e.height},pane:{width:e.width,height:e.height,bottom:e.height+d.y},date:+new Date},!0)}}function ha(a,b,d,e){for(var f=e,c=e,h=0,j=!1,g=!1,i=a.view.pane.height,l=a.mouse;l.y+h<i&&0<l.y-h;){j||(j=b(f,e));g||(g=b(c,e));!j&&0<l.y-h&&(f=d(a,{x:l.x,y:l.y-h}));!g&&l.y+h<i&&(c=d(a,{x:l.x,y:l.y+h}));if(j&&g)break;h+=2}return new u([f,c,null,null])}CKEDITOR.plugins.add("magicline",{init:function(a){var b={};b[CKEDITOR.ENTER_BR]="br";b[CKEDITOR.ENTER_P]="p";b[CKEDITOR.ENTER_DIV]="div";var d=a.config,e=d.magicline_triggerOffset||
+30,f=d.enterMode,c={editor:a,enterBehavior:b[f],enterMode:f,triggerOffset:e,holdDistance:0|e*(d.magicline_holdDistance||0.5),boxColor:d.magicline_color||"#ff0000",rtl:"rtl"==d.contentsLangDirection,triggers:d.magicline_everywhere?T:{table:1,hr:1,div:1,ul:1,ol:1,dl:1,form:1,blockquote:1}},h,j,g;c.isRelevant=function(a){return m(a)&&!v(c,a)&&!p(a)};a.on("contentDom",function(){var b=a.editable(),e=a.document,f=a.window;q(c,{editable:b,inInlineMode:b.isInline(),doc:e,win:f},!0);c.boundary=c.inInlineMode?
+c.editable:c.doc.getDocumentElement();b.is(w.$inline)||(c.inInlineMode&&!U(b)&&b.setStyles({position:"relative",top:null,left:null}),da.call(this,c),H(c),b.attachListener(a,"beforeUndoImage",function(){c.line.detach()}),b.attachListener(a,"beforeGetData",function(){c.line.wrap.getParent()&&(c.line.detach(),a.once("getData",function(){c.line.attach()},null,null,1E3))},null,null,0),b.attachListener(c.inInlineMode?e:e.getWindow().getFrame(),"mouseout",function(b){if("wysiwyg"==a.mode)if(c.inInlineMode){var d=
+b.data.$.clientX,b=b.data.$.clientY;H(c);C(c,!0);var e=c.view.editable,f=c.view.scroll;if(!(d>e.left-f.x&&d<e.right-f.x)||!(b>e.top-f.y&&b<e.bottom-f.y))clearTimeout(g),g=null,c.line.detach()}else clearTimeout(g),g=null,c.line.detach()}),b.attachListener(b,"keyup",function(){c.hiddenMode=0}),b.attachListener(b,"keydown",function(b){if("wysiwyg"==a.mode)switch(b=b.data.getKeystroke(),a.getSelection().getStartElement(),b){case 2228240:case 16:c.hiddenMode=1,c.line.detach()}}),b.attachListener(c.inInlineMode?
+b:e,"mousemove",function(b){j=!0;if(!("wysiwyg"!=a.mode||a.readOnly||g)){var d={x:b.data.$.clientX,y:b.data.$.clientY};g=setTimeout(function(){c.mouse=d;g=c.trigger=null;H(c);if(j&&!c.hiddenMode&&a.focusManager.hasFocus&&!c.line.mouseNear()&&(c.element=$(c,!0)))(c.trigger=V(c)||X(c)||aa(c))?c.line.attach().place():(c.trigger=null,c.line.detach()),j=!1},30)}}),b.attachListener(f,"scroll",function(){"wysiwyg"==a.mode&&(c.line.detach(),n.webkit&&(c.hiddenMode=1,clearTimeout(h),h=setTimeout(function(){c.hiddenMode=
+0},50)))}),b.attachListener(f,"mousedown",function(){"wysiwyg"==a.mode&&(c.line.detach(),c.hiddenMode=1)}),b.attachListener(f,"mouseup",function(){c.hiddenMode=0}),a.addCommand("accessPreviousSpace",S(c)),a.addCommand("accessNextSpace",S(c,!0)),a.setKeystroke([[d.magicline_keystrokePrevious,"accessPreviousSpace"],[d.magicline_keystrokeNext,"accessNextSpace"]]),a.on("loadSnapshot",function(){for(var b=a.document.getElementsByTag(c.enterBehavior),d,e=b.count();e--;)if((d=b.getItem(e)).hasAttribute("data-cke-magicline-hot")){c.hotNode=
+d;c.lastCmdDirection="true"===d.getAttribute("data-cke-magicline-dir")?!0:!1;break}}),this.backdoor={accessFocusSpace:L,boxTrigger:u,isLine:v,getAscendantTrigger:I,getNonEmptyNeighbour:r,getSize:N,that:c,triggerEdge:X,triggerEditable:V,triggerExpand:aa})},this)}});var q=CKEDITOR.tools.extend,K=CKEDITOR.dom.element,B=K.createFromHtml,n=CKEDITOR.env,w=CKEDITOR.dtd,D=128,W=64,M=32,G=16,ba=8,x=4,y=2,s=1,E=" ",Y=w.$listItem,ga=w.$tableContent,ea=q({},w.$nonEditable,w.$empty),T=w.$block,Z=100,J="width:0px;height:0px;padding:0px;margin:0px;display:block;z-index:9999;color:#fff;position:absolute;font-size: 0px;line-height:0px;",
+Q=J+"border-color:transparent;display:block;border-style:solid;",P="<span>"+E+"</span>";u.prototype={set:function(a,b,d){this.properties=a+b+(d||s);return this},is:function(a){return(this.properties&a)==a}};var $=function(){return function(a,b,d){if(!a.mouse)return null;var e=a.doc,f=a.line.wrap,d=d||a.mouse,c=new CKEDITOR.dom.element(e.$.elementFromPoint(d.x,d.y));b&&v(a,c)&&(f.hide(),c=new CKEDITOR.dom.element(e.$.elementFromPoint(d.x,d.y)),f.show());return!c||!(c.type==CKEDITOR.NODE_ELEMENT&&c.$)||
+n.ie&&9>n.version&&!a.boundary.equals(c)&&!a.boundary.contains(c)?null:c}}(),z=CKEDITOR.dom.walker.whitespaces(),A=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_COMMENT),aa=function(){function a(a){var e=a.element,f,c,h;if(!m(e)||e.contains(a.editable))return null;h=ha(a,function(a,b){return!b.equals(a)},function(a,b){return $(a,!0,b)},e);f=h.upper;c=h.lower;if(O(a,f,c))return h.set(M,ba);if(f&&e.contains(f))for(;!f.getParent().equals(e);)f=f.getParent();else f=e.getFirst(function(c){return b(a,c)});
+if(c&&e.contains(c))for(;!c.getParent().equals(e);)c=c.getParent();else c=e.getLast(function(c){return b(a,c)});if(!f||!c)return null;o(a,f);o(a,c);if(!(a.mouse.y>f.size.top&&a.mouse.y<c.size.bottom))return null;for(var e=Number.MAX_VALUE,j,g,i,l;c&&!c.equals(f)&&(g=f.getNext(a.isRelevant));)j=Math.abs(ca(a,f,g)-a.mouse.y),j<e&&(e=j,i=f,l=g),f=g,o(a,f);if(!i||!l||!(a.mouse.y>i.size.top&&a.mouse.y<l.size.bottom))return null;h.upper=i;h.lower=l;return h.set(M,ba)}function b(a,b){return!(b&&b.type==
+CKEDITOR.NODE_TEXT||A(b)||p(b)||v(a,b)||b.type==CKEDITOR.NODE_ELEMENT&&b.$&&b.is("br"))}return function(b){var e=a(b),f;if(f=e){f=e.upper;var c=e.lower;f=!f||!c||p(c)||p(f)||c.equals(f)||f.equals(c)||c.contains(f)||f.contains(c)?!1:F(b,f)&&F(b,c)&&O(b,f,c)?!0:!1}return f?e:null}}(),t=["top","left","right","bottom"]})();CKEDITOR.config.magicline_keystrokePrevious=CKEDITOR.CTRL+CKEDITOR.SHIFT+219;CKEDITOR.config.magicline_keystrokeNext=CKEDITOR.CTRL+CKEDITOR.SHIFT+221;(function(){function l(a){if(!a||a.type!=CKEDITOR.NODE_ELEMENT||"form"!=a.getName())return[];for(var e=[],f=["style","className"],b=0;b<f.length;b++){var d=a.$.elements.namedItem(f[b]);d&&(d=new CKEDITOR.dom.element(d),e.push([d,d.nextSibling]),d.remove())}return e}function o(a,e){if(a&&!(a.type!=CKEDITOR.NODE_ELEMENT||"form"!=a.getName())&&0<e.length)for(var f=e.length-1;0<=f;f--){var b=e[f][0],d=e[f][1];d?b.insertBefore(d):b.appendTo(a)}}function n(a,e){var f=l(a),b={},d=a.$;e||(b["class"]=d.className||
+"",d.className="");b.inline=d.style.cssText||"";e||(d.style.cssText="position: static; overflow: visible");o(f);return b}function p(a,e){var f=l(a),b=a.$;"class"in e&&(b.className=e["class"]);"inline"in e&&(b.style.cssText=e.inline);o(f)}function q(a){if(!a.editable().isInline()){var e=CKEDITOR.instances,f;for(f in e){var b=e[f];"wysiwyg"==b.mode&&!b.readOnly&&(b=b.document.getBody(),b.setAttribute("contentEditable",!1),b.setAttribute("contentEditable",!0))}a.editable().hasFocus&&(a.toolbox.focus(),
+a.focus())}}CKEDITOR.plugins.add("maximize",{init:function(a){function e(){var b=d.getViewPaneSize();a.resize(b.width,b.height,null,!0)}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var f=a.lang,b=CKEDITOR.document,d=b.getWindow(),j,k,m,l=CKEDITOR.TRISTATE_OFF;a.addCommand("maximize",{modes:{wysiwyg:!CKEDITOR.env.iOS,source:!CKEDITOR.env.iOS},readOnly:1,editorFocus:!1,exec:function(){var h=a.container.getChild(1),g=a.ui.space("contents");if("wysiwyg"==a.mode){var c=a.getSelection();j=c&&c.getRanges();
+k=d.getScrollPosition()}else{var i=a.editable().$;j=!CKEDITOR.env.ie&&[i.selectionStart,i.selectionEnd];k=[i.scrollLeft,i.scrollTop]}if(this.state==CKEDITOR.TRISTATE_OFF){d.on("resize",e);m=d.getScrollPosition();for(c=a.container;c=c.getParent();)c.setCustomData("maximize_saved_styles",n(c)),c.setStyle("z-index",a.config.baseFloatZIndex-5);g.setCustomData("maximize_saved_styles",n(g,!0));h.setCustomData("maximize_saved_styles",n(h,!0));g={overflow:CKEDITOR.env.webkit?"":"hidden",width:0,height:0};
+b.getDocumentElement().setStyles(g);!CKEDITOR.env.gecko&&b.getDocumentElement().setStyle("position","fixed");(!CKEDITOR.env.gecko||!CKEDITOR.env.quirks)&&b.getBody().setStyles(g);CKEDITOR.env.ie?setTimeout(function(){d.$.scrollTo(0,0)},0):d.$.scrollTo(0,0);h.setStyle("position",CKEDITOR.env.gecko&&CKEDITOR.env.quirks?"fixed":"absolute");h.$.offsetLeft;h.setStyles({"z-index":a.config.baseFloatZIndex-5,left:"0px",top:"0px"});h.addClass("cke_maximized");e();g=h.getDocumentPosition();h.setStyles({left:-1*
+g.x+"px",top:-1*g.y+"px"});CKEDITOR.env.gecko&&q(a)}else if(this.state==CKEDITOR.TRISTATE_ON){d.removeListener("resize",e);g=[g,h];for(c=0;c<g.length;c++)p(g[c],g[c].getCustomData("maximize_saved_styles")),g[c].removeCustomData("maximize_saved_styles");for(c=a.container;c=c.getParent();)p(c,c.getCustomData("maximize_saved_styles")),c.removeCustomData("maximize_saved_styles");CKEDITOR.env.ie?setTimeout(function(){d.$.scrollTo(m.x,m.y)},0):d.$.scrollTo(m.x,m.y);h.removeClass("cke_maximized");CKEDITOR.env.webkit&&
+(h.setStyle("display","inline"),setTimeout(function(){h.setStyle("display","block")},0));a.fire("resize")}this.toggleState();if(c=this.uiItems[0])g=this.state==CKEDITOR.TRISTATE_OFF?f.maximize.maximize:f.maximize.minimize,c=CKEDITOR.document.getById(c._.id),c.getChild(1).setHtml(g),c.setAttribute("title",g),c.setAttribute("href",'javascript:void("'+g+'");');"wysiwyg"==a.mode?j?(CKEDITOR.env.gecko&&q(a),a.getSelection().selectRanges(j),(i=a.getSelection().getStartElement())&&i.scrollIntoView(!0)):
+d.$.scrollTo(k.x,k.y):(j&&(i.selectionStart=j[0],i.selectionEnd=j[1]),i.scrollLeft=k[0],i.scrollTop=k[1]);j=k=null;l=this.state;a.fire("maximize",this.state)},canUndo:!1});a.ui.addButton&&a.ui.addButton("Maximize",{label:f.maximize.maximize,command:"maximize",toolbar:"tools,10"});a.on("mode",function(){var b=a.getCommand("maximize");b.setState(b.state==CKEDITOR.TRISTATE_DISABLED?CKEDITOR.TRISTATE_DISABLED:l)},null,null,100)}}})})();CKEDITOR.plugins.add("newpage",{init:function(a){a.addCommand("newpage",{modes:{wysiwyg:1,source:1},exec:function(b){var a=this;b.setData(b.config.newpage_html||"",function(){b.focus();setTimeout(function(){b.fire("afterCommandExec",{name:"newpage",command:a});b.selectionChange()},200)})},async:!0});a.ui.addButton&&a.ui.addButton("NewPage",{label:a.lang.newpage.toolbar,command:"newpage",toolbar:"document,20"})}});CKEDITOR.plugins.add("pagebreak",{requires:"fakeobjects",onLoad:function(){var a=["{","background: url("+CKEDITOR.getUrl(this.path+"images/pagebreak.gif")+") no-repeat center center;","clear: both;width:100%; _width:99.9%;border-top: #999999 1px dotted;border-bottom: #999999 1px dotted;padding:0;height: 5px;cursor: default;}"].join("").replace(/;/g," !important;");CKEDITOR.addCss("div.cke_pagebreak"+a)},init:function(a){a.blockless||(a.addCommand("pagebreak",CKEDITOR.plugins.pagebreakCmd),a.ui.addButton&&
+a.ui.addButton("PageBreak",{label:a.lang.pagebreak.toolbar,command:"pagebreak",toolbar:"insert,70"}),CKEDITOR.env.opera&&a.on("contentDom",function(){a.document.on("click",function(b){b=b.data.getTarget();b.is("div")&&b.hasClass("cke_pagebreak")&&a.getSelection().selectElement(b)})}))},afterInit:function(a){var b=a.lang.pagebreak.alt,c=a.dataProcessor,a=c&&c.dataFilter;(c=c&&c.htmlFilter)&&c.addRules({attributes:{"class":function(a,b){var c=a.replace("cke_pagebreak","");if(c!=a){var d=CKEDITOR.htmlParser.fragment.fromHtml('<span style="display: none;">&nbsp;</span>').children[0];
+b.children.length=0;b.add(d);d=b.attributes;delete d["aria-label"];delete d.contenteditable;delete d.title}return c}}},5);a&&a.addRules({elements:{div:function(a){var c=a.attributes,e=c&&c.style,d=e&&1==a.children.length&&a.children[0];if((d=d&&"span"==d.name&&d.attributes.style)&&/page-break-after\s*:\s*always/i.test(e)&&/display\s*:\s*none/i.test(d))c.contenteditable="false",c["class"]="cke_pagebreak",c["data-cke-display-name"]="pagebreak",c["aria-label"]=b,c.title=b,a.children.length=0}}})}});
+CKEDITOR.plugins.pagebreakCmd={exec:function(a){var b=a.lang.pagebreak.alt,b=CKEDITOR.dom.element.createFromHtml('<div style="page-break-after: always;"contenteditable="false" title="'+b+'" aria-label="'+b+'" data-cke-display-name="pagebreak" class="cke_pagebreak"></div>',a.document);a.insertElement(b)},context:"div",allowedContent:{div:{styles:"!page-break-after"},span:{match:function(a){return(a=a.parent)&&"div"==a.name&&a.styles["page-break-after"]},styles:"display"}},requiredContent:"div{page-break-after}"};(function(){var c={canUndo:!1,async:!0,exec:function(a){a.getClipboardData({title:a.lang.pastetext.title},function(b){b&&a.fire("paste",{type:"text",dataValue:b.dataValue});a.fire("afterCommandExec",{name:"pastetext",command:c,returnValue:!!b})})}};CKEDITOR.plugins.add("pastetext",{requires:"clipboard",init:function(a){a.addCommand("pastetext",c);a.ui.addButton&&a.ui.addButton("PasteText",{label:a.lang.pastetext.button,command:"pastetext",toolbar:"clipboard,40"});if(a.config.forcePasteAsPlainText)a.on("beforePaste",
+function(a){"html"!=a.data.type&&(a.data.type="text")});a.on("pasteState",function(b){a.getCommand("pastetext").setState(b.data)})}})})();(function(){function h(a,d,f){var b=CKEDITOR.cleanWord;b?f():(a=CKEDITOR.getUrl(a.config.pasteFromWordCleanupFile||d+"filter/default.js"),CKEDITOR.scriptLoader.load(a,f,null,!0));return!b}function i(a){a.data.type="html"}CKEDITOR.plugins.add("pastefromword",{requires:"clipboard",init:function(a){var d=0,f=this.path;a.addCommand("pastefromword",{canUndo:!1,async:!0,exec:function(a){var e=this;d=1;a.once("beforePaste",i);a.getClipboardData({title:a.lang.pastefromword.title},function(c){c&&a.fire("paste",
+{type:"html",dataValue:c.dataValue});a.fire("afterCommandExec",{name:"pastefromword",command:e,returnValue:!!c})})}});a.ui.addButton&&a.ui.addButton("PasteFromWord",{label:a.lang.pastefromword.toolbar,command:"pastefromword",toolbar:"clipboard,50"});a.on("pasteState",function(b){a.getCommand("pastefromword").setState(b.data)});a.on("paste",function(b){var e=b.data,c=e.dataValue;if(c&&(d||/(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test(c))){var g=h(a,f,function(){if(g)a.fire("paste",e);
+else if(!a.config.pasteFromWordPromptCleanup||d||confirm(a.lang.pastefromword.confirmCleanup))e.dataValue=CKEDITOR.cleanWord(c,a)});g&&b.cancel()}},null,null,3)}})})();(function(){var h,i={modes:{wysiwyg:1,source:1},canUndo:!1,readOnly:1,exec:function(a){var g,b=a.config,e=b.baseHref?'<base href="'+b.baseHref+'"/>':"";if(b.fullPage)g=a.getData().replace(/<head>/,"$&"+e).replace(/[^>]*(?=<\/title>)/,"$& &mdash; "+a.lang.preview.preview);else{var b="<body ",d=a.document&&a.document.getBody();d&&(d.getAttribute("id")&&(b+='id="'+d.getAttribute("id")+'" '),d.getAttribute("class")&&(b+='class="'+d.getAttribute("class")+'" '));g=a.config.docType+'<html dir="'+a.config.contentsLangDirection+
+'"><head>'+e+"<title>"+a.lang.preview.preview+"</title>"+CKEDITOR.tools.buildStyleHtml(a.config.contentsCss)+"</head>"+(b+">")+a.getData()+"</body></html>"}e=640;b=420;d=80;try{var c=window.screen,e=Math.round(0.8*c.width),b=Math.round(0.7*c.height),d=Math.round(0.1*c.width)}catch(i){}if(!a.fire("contentPreview",a={dataValue:g}))return!1;c="";CKEDITOR.env.ie&&(window._cke_htmlToLoad=a.dataValue,c="javascript:void( (function(){document.open();"+("("+CKEDITOR.tools.fixDomain+")();").replace(/\/\/.*?\n/g,
+"").replace(/parent\./g,"window.opener.")+"document.write( window.opener._cke_htmlToLoad );document.close();window.opener._cke_htmlToLoad = null;})() )");CKEDITOR.env.gecko&&(window._cke_htmlToLoad=a.dataValue,c=h+"preview.html");c=window.open(c,null,"toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width="+e+",height="+b+",left="+d);if(!CKEDITOR.env.ie&&!CKEDITOR.env.gecko){var f=c.document;f.open();f.write(a.dataValue);f.close();CKEDITOR.env.webkit&&setTimeout(function(){f.body.innerHTML=
+f.body.innerHTML+""},0)}return!0}};CKEDITOR.plugins.add("preview",{init:function(a){a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&(h=this.path,a.addCommand("preview",i),a.ui.addButton&&a.ui.addButton("Preview",{label:a.lang.preview.preview,command:"preview",toolbar:"document,40"}))}})})();CKEDITOR.plugins.add("print",{init:function(a){a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&(a.addCommand("print",CKEDITOR.plugins.print),a.ui.addButton&&a.ui.addButton("Print",{label:a.lang.print.toolbar,command:"print",toolbar:"document,50"}))}});CKEDITOR.plugins.print={exec:function(a){CKEDITOR.env.opera||(CKEDITOR.env.gecko?a.window.$.print():a.document.$.execCommand("Print"))},canUndo:!1,readOnly:1,modes:{wysiwyg:!CKEDITOR.env.opera}};CKEDITOR.plugins.add("removeformat",{init:function(a){a.addCommand("removeFormat",CKEDITOR.plugins.removeformat.commands.removeformat);a.ui.addButton&&a.ui.addButton("RemoveFormat",{label:a.lang.removeformat.toolbar,command:"removeFormat",toolbar:"cleanup,10"})}});
+CKEDITOR.plugins.removeformat={commands:{removeformat:{exec:function(a){for(var h=a._.removeFormatRegex||(a._.removeFormatRegex=RegExp("^(?:"+a.config.removeFormatTags.replace(/,/g,"|")+")$","i")),e=a._.removeAttributes||(a._.removeAttributes=a.config.removeFormatAttributes.split(",")),f=CKEDITOR.plugins.removeformat.filter,k=a.getSelection().getRanges(1),l=k.createIterator(),c;c=l.getNextRange();){c.collapsed||c.enlarge(CKEDITOR.ENLARGE_ELEMENT);var i=c.createBookmark(),b=i.startNode,j=i.endNode,
+d=function(b){for(var c=a.elementPath(b),e=c.elements,d=1,g;(g=e[d])&&!g.equals(c.block)&&!g.equals(c.blockLimit);d++)h.test(g.getName())&&f(a,g)&&b.breakParent(g)};d(b);if(j){d(j);for(b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT);b&&!b.equals(j);)d=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT),!("img"==b.getName()&&b.data("cke-realelement"))&&f(a,b)&&(h.test(b.getName())?b.remove(1):(b.removeAttributes(e),a.fire("removeFormatCleanup",b))),b=d}c.moveToBookmark(i)}a.forceNextSelectionCheck();a.getSelection().selectRanges(k)}}},
+filter:function(a,h){for(var e=a._.removeFormatFilters||[],f=0;f<e.length;f++)if(!1===e[f](h))return!1;return!0}};CKEDITOR.editor.prototype.addRemoveFormatFilter=function(a){this._.removeFormatFilters||(this._.removeFormatFilters=[]);this._.removeFormatFilters.push(a)};CKEDITOR.config.removeFormatTags="b,big,code,del,dfn,em,font,i,ins,kbd,q,s,samp,small,span,strike,strong,sub,sup,tt,u,var";CKEDITOR.config.removeFormatAttributes="class,style,lang,width,height,align,hspace,valign";(function(){var b={readOnly:1,exec:function(a){if(a.fire("save")&&(a=a.element.$.form))try{a.submit()}catch(b){a.submit.click&&a.submit.click()}}};CKEDITOR.plugins.add("save",{init:function(a){a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&(a.addCommand("save",b).modes={wysiwyg:!!a.element.$.form},a.ui.addButton&&a.ui.addButton("Save",{label:a.lang.save.toolbar,command:"save",toolbar:"document,10"}))}})})();(function(){CKEDITOR.plugins.add("selectall",{init:function(b){b.addCommand("selectAll",{modes:{wysiwyg:1,source:1},exec:function(a){var b=a.editable();if(b.is("textarea"))a=b.$,CKEDITOR.env.ie?a.createTextRange().execCommand("SelectAll"):(a.selectionStart=0,a.selectionEnd=a.value.length),a.focus();else{if(b.is("body"))a.document.$.execCommand("SelectAll",!1,null);else{var c=a.createRange();c.selectNodeContents(b);c.select()}a.forceNextSelectionCheck();a.selectionChange()}},canUndo:!1});b.ui.addButton&&
+b.ui.addButton("SelectAll",{label:b.lang.selectall.toolbar,command:"selectAll",toolbar:"selection,10"})}})})();(function(){var d={readOnly:1,preserveState:!0,editorFocus:!1,exec:function(a){this.toggleState();this.refresh(a)},refresh:function(a){if(a.document){var b=this.state==CKEDITOR.TRISTATE_ON&&(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE||a.focusManager.hasFocus)?"attachClass":"removeClass";a.editable()[b]("cke_show_blocks")}}};CKEDITOR.plugins.add("showblocks",{onLoad:function(){function a(a){return".%1.%2 p,.%1.%2 div,.%1.%2 pre,.%1.%2 address,.%1.%2 blockquote,.%1.%2 h1,.%1.%2 h2,.%1.%2 h3,.%1.%2 h4,.%1.%2 h5,.%1.%2 h6{background-position: top %3;padding-%3: 8px;}".replace(/%1/g,
+"cke_show_blocks").replace(/%2/g,"cke_contents_"+a).replace(/%3/g,"rtl"==a?"right":"left")}CKEDITOR.addCss(".%2 p,.%2 div,.%2 pre,.%2 address,.%2 blockquote,.%2 h1,.%2 h2,.%2 h3,.%2 h4,.%2 h5,.%2 h6{background-repeat: no-repeat;border: 1px dotted gray;padding-top: 8px;}.%2 p{%1p.png);}.%2 div{%1div.png);}.%2 pre{%1pre.png);}.%2 address{%1address.png);}.%2 blockquote{%1blockquote.png);}.%2 h1{%1h1.png);}.%2 h2{%1h2.png);}.%2 h3{%1h3.png);}.%2 h4{%1h4.png);}.%2 h5{%1h5.png);}.%2 h6{%1h6.png);}".replace(/%1/g,
+"background-image: url("+CKEDITOR.getUrl(this.path)+"images/block_").replace(/%2/g,"cke_show_blocks ")+a("ltr")+a("rtl"))},init:function(a){if(!a.blockless){var b=a.addCommand("showblocks",d);b.canUndo=!1;a.config.startupOutlineBlocks&&b.setState(CKEDITOR.TRISTATE_ON);a.ui.addButton&&a.ui.addButton("ShowBlocks",{label:a.lang.showblocks.toolbar,command:"showblocks",toolbar:"tools,20"});a.on("mode",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)});if(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE){var c=
+function(){b.refresh(a)};a.on("focus",c);a.on("blur",c)}a.on("contentDom",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)})}}})})();(function(){var f={preserveState:!0,editorFocus:!1,readOnly:1,exec:function(a){this.toggleState();this.refresh(a)},refresh:function(a){if(a.document){var b=this.state==CKEDITOR.TRISTATE_ON?"attachClass":"removeClass";a.editable()[b]("cke_show_borders")}}};CKEDITOR.plugins.add("showborders",{modes:{wysiwyg:1},onLoad:function(){var a;a=(CKEDITOR.env.ie6Compat?[".%1 table.%2,",".%1 table.%2 td, .%1 table.%2 th","{","border : #d3d3d3 1px dotted","}"]:".%1 table.%2,;.%1 table.%2 > tr > td, .%1 table.%2 > tr > th,;.%1 table.%2 > tbody > tr > td, .%1 table.%2 > tbody > tr > th,;.%1 table.%2 > thead > tr > td, .%1 table.%2 > thead > tr > th,;.%1 table.%2 > tfoot > tr > td, .%1 table.%2 > tfoot > tr > th;{;border : #d3d3d3 1px dotted;}".split(";")).join("").replace(/%2/g,
+"cke_show_border").replace(/%1/g,"cke_show_borders ");CKEDITOR.addCss(a)},init:function(a){var b=a.addCommand("showborders",f);b.canUndo=!1;!1!==a.config.startupShowBorders&&b.setState(CKEDITOR.TRISTATE_ON);a.on("mode",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)},null,null,100);a.on("contentDom",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)});a.on("removeFormatCleanup",function(d){d=d.data;a.getCommand("showborders").state==CKEDITOR.TRISTATE_ON&&(d.is("table")&&(!d.hasAttribute("border")||
+0>=parseInt(d.getAttribute("border"),10)))&&d.addClass("cke_show_border")})},afterInit:function(a){var b=a.dataProcessor,a=b&&b.dataFilter,b=b&&b.htmlFilter;a&&a.addRules({elements:{table:function(a){var a=a.attributes,b=a["class"],c=parseInt(a.border,10);if((!c||0>=c)&&(!b||-1==b.indexOf("cke_show_border")))a["class"]=(b||"")+" cke_show_border"}}});b&&b.addRules({elements:{table:function(a){var a=a.attributes,b=a["class"];b&&(a["class"]=b.replace("cke_show_border","").replace(/\s{2}/," ").replace(/^\s+|\s+$/,
+""))}}})}});CKEDITOR.on("dialogDefinition",function(a){var b=a.data.name;if("table"==b||"tableProperties"==b)if(a=a.data.definition,b=a.getContents("info").get("txtBorder"),b.commit=CKEDITOR.tools.override(b.commit,function(a){return function(b,c){a.apply(this,arguments);var e=parseInt(this.getValue(),10);c[!e||0>=e?"addClass":"removeClass"]("cke_show_border")}}),a=(a=a.getContents("advanced"))&&a.get("advCSSClasses"))a.setup=CKEDITOR.tools.override(a.setup,function(a){return function(){a.apply(this,
+arguments);this.setValue(this.getValue().replace(/cke_show_border/,""))}}),a.commit=CKEDITOR.tools.override(a.commit,function(a){return function(b,c){a.apply(this,arguments);parseInt(c.getAttribute("border"),10)||c.addClass("cke_show_border")}})})})();(function(){CKEDITOR.plugins.add("sourcearea",{init:function(a){function d(){this.hide();this.setStyle("height",this.getParent().$.clientHeight+"px");this.setStyle("width",this.getParent().$.clientWidth+"px");this.show()}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var e=CKEDITOR.plugins.sourcearea;a.addMode("source",function(e){var b=a.ui.space("contents").getDocument().createElement("textarea");b.setStyles(CKEDITOR.tools.extend({width:CKEDITOR.env.ie7Compat?"99%":"100%",height:"100%",resize:"none",
+outline:"none","text-align":"left"},CKEDITOR.tools.cssVendorPrefix("tab-size",a.config.sourceAreaTabSize||4)));b.setAttribute("dir","ltr");b.addClass("cke_source cke_reset cke_enable_context_menu");a.ui.space("contents").append(b);b=a.editable(new c(a,b));b.setData(a.getData(1));CKEDITOR.env.ie&&(b.attachListener(a,"resize",d,b),b.attachListener(CKEDITOR.document.getWindow(),"resize",d,b),CKEDITOR.tools.setTimeout(d,0,b));a.fire("ariaWidget",this);e()});a.addCommand("source",e.commands.source);a.ui.addButton&&
+a.ui.addButton("Source",{label:a.lang.sourcearea.toolbar,command:"source",toolbar:"mode,10"});a.on("mode",function(){a.getCommand("source").setState("source"==a.mode?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)})}}});var c=CKEDITOR.tools.createClass({base:CKEDITOR.editable,proto:{setData:function(a){this.setValue(a);this.editor.fire("dataReady")},getData:function(){return this.getValue()},insertHtml:function(){},insertElement:function(){},insertText:function(){},setReadOnly:function(a){this[(a?"set":
+"remove")+"Attribute"]("readOnly","readonly")},detach:function(){c.baseProto.detach.call(this);this.clearCustomData();this.remove()}}})})();CKEDITOR.plugins.sourcearea={commands:{source:{modes:{wysiwyg:1,source:1},editorFocus:!1,readOnly:1,exec:function(c){"wysiwyg"==c.mode&&c.fire("saveSnapshot");c.getCommand("source").setState(CKEDITOR.TRISTATE_DISABLED);c.setMode("source"==c.mode?"wysiwyg":"source")},canUndo:!1}}};CKEDITOR.plugins.add("specialchar",{availableLangs:{ar:1,bg:1,ca:1,cs:1,cy:1,de:1,el:1,en:1,eo:1,es:1,et:1,fa:1,fi:1,fr:1,"fr-ca":1,gl:1,he:1,hr:1,hu:1,id:1,it:1,ja:1,ku:1,lv:1,nb:1,nl:1,no:1,pl:1,pt:1,"pt-br":1,ru:1,si:1,sk:1,sl:1,sq:1,sv:1,th:1,tr:1,ug:1,uk:1,vi:1,"zh-cn":1},requires:"dialog",init:function(a){var c=this;CKEDITOR.dialog.add("specialchar",this.path+"dialogs/specialchar.js");a.addCommand("specialchar",{exec:function(){var b=a.langCode,b=c.availableLangs[b]?b:c.availableLangs[b.replace(/-.*/,
+"")]?b.replace(/-.*/,""):"en";CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(c.path+"dialogs/lang/"+b+".js"),function(){CKEDITOR.tools.extend(a.lang.specialchar,c.langEntries[b]);a.openDialog("specialchar")})},modes:{wysiwyg:1},canUndo:!1});a.ui.addButton&&a.ui.addButton("SpecialChar",{label:a.lang.specialchar.toolbar,command:"specialchar",toolbar:"insert,50"})}});CKEDITOR.config.specialChars="! &quot; # $ % &amp; ' ( ) * + - . / 0 1 2 3 4 5 6 7 8 9 : ; &lt; = &gt; ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ &euro; &lsquo; &rsquo; &ldquo; &rdquo; &ndash; &mdash; &iexcl; &cent; &pound; &curren; &yen; &brvbar; &sect; &uml; &copy; &ordf; &laquo; &not; &reg; &macr; &deg; &sup2; &sup3; &acute; &micro; &para; &middot; &cedil; &sup1; &ordm; &raquo; &frac14; &frac12; &frac34; &iquest; &Agrave; &Aacute; &Acirc; &Atilde; &Auml; &Aring; &AElig; &Ccedil; &Egrave; &Eacute; &Ecirc; &Euml; &Igrave; &Iacute; &Icirc; &Iuml; &ETH; &Ntilde; &Ograve; &Oacute; &Ocirc; &Otilde; &Ouml; &times; &Oslash; &Ugrave; &Uacute; &Ucirc; &Uuml; &Yacute; &THORN; &szlig; &agrave; &aacute; &acirc; &atilde; &auml; &aring; &aelig; &ccedil; &egrave; &eacute; &ecirc; &euml; &igrave; &iacute; &icirc; &iuml; &eth; &ntilde; &ograve; &oacute; &ocirc; &otilde; &ouml; &divide; &oslash; &ugrave; &uacute; &ucirc; &uuml; &yacute; &thorn; &yuml; &OElig; &oelig; &#372; &#374 &#373 &#375; &sbquo; &#8219; &bdquo; &hellip; &trade; &#9658; &bull; &rarr; &rArr; &hArr; &diams; &asymp;".split(" ");CKEDITOR.plugins.add("menubutton",{requires:"button,menu",onLoad:function(){var d=function(a){var b=this._;if(b.state!==CKEDITOR.TRISTATE_DISABLED){b.previousState=b.state;var c=b.menu;c||(c=b.menu=new CKEDITOR.menu(a,{panel:{className:"cke_menu_panel",attributes:{"aria-label":a.lang.common.options}}}),c.onHide=CKEDITOR.tools.bind(function(){this.setState(this.modes&&this.modes[a.mode]?b.previousState:CKEDITOR.TRISTATE_DISABLED)},this),this.onMenu&&c.addListener(this.onMenu));b.on?c.hide():(this.setState(CKEDITOR.TRISTATE_ON),
+setTimeout(function(){c.show(CKEDITOR.document.getById(b.id),4)},0))}};CKEDITOR.ui.menuButton=CKEDITOR.tools.createClass({base:CKEDITOR.ui.button,$:function(a){delete a.panel;this.base(a);this.hasArrow=!0;this.click=d},statics:{handler:{create:function(a){return new CKEDITOR.ui.menuButton(a)}}}})},beforeInit:function(d){d.ui.addHandler(CKEDITOR.UI_MENUBUTTON,CKEDITOR.ui.menuButton.handler)}});CKEDITOR.UI_MENUBUTTON="menubutton";(function(){function k(a,c){var b=0,d;for(d in c)if(c[d]==a){b=1;break}return b}var i="",r=function(){function a(){b.once("focus",f);b.once("blur",c)}function c(b){var b=b.editor,c=d.getScayt(b),f=b.elementMode==CKEDITOR.ELEMENT_MODE_INLINE;c&&(d.setPaused(b,!c.disabled),d.setControlId(b,c.id),c.destroy(!0),delete d.instances[b.name],f&&a())}var b=this,f=function(){if(!("undefined"!=typeof d.instances[b.name]||null!=d.instances[b.name])){var a=b.config,c={};c.srcNodeRef="BODY"==b.editable().$.nodeName?
+b.document.getWindow().$.frameElement:b.editable().$;c.assocApp="CKEDITOR."+CKEDITOR.version+"@"+CKEDITOR.revision;c.customerid=a.scayt_customerid||"1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2";c.customDictionaryIds=a.scayt_customDictionaryIds||"";c.userDictionaryName=a.scayt_userDictionaryName||"";c.sLang=a.scayt_sLang||"en_US";c.onLoad=function(){CKEDITOR.env.ie&&8>CKEDITOR.env.version||this.addStyle(this.selectorCss(),"padding-bottom: 2px !important;");b.editable().hasFocus&&
+!d.isControlRestored(b)&&this.focus()};c.onBeforeChange=function(){d.getScayt(b)&&!b.checkDirty()&&setTimeout(function(){b.resetDirty()},0)};a=window.scayt_custom_params;if("object"==typeof a)for(var f in a)c[f]=a[f];d.getControlId(b)&&(c.id=d.getControlId(b));var o=new window.scayt(c);o.afterMarkupRemove.push(function(a){(new CKEDITOR.dom.element(a,o.document)).mergeSiblings()});if(c=d.instances[b.name])o.sLang=c.sLang,o.option(c.option()),o.paused=c.paused;d.instances[b.name]=o;try{o.setDisabled(!1===
+d.isPaused(b))}catch(e){}b.fire("showScaytState")}};b.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a():b.on("contentDom",f);b.on("contentDomUnload",function(){for(var a=CKEDITOR.document.getElementsByTag("script"),b=/^dojoIoScript(\d+)$/i,c=/^https?:\/\/svc\.webspellchecker\.net\/spellcheck\/script\/ssrv\.cgi/i,d=0;d<a.count();d++){var f=a.getItem(d),e=f.getId(),h=f.getAttribute("src");e&&(h&&e.match(b)&&h.match(c))&&f.remove()}});b.on("beforeCommandExec",function(a){"source"==a.data.name&&"source"==
+b.mode&&d.markControlRestore(b)});b.on("afterCommandExec",function(a){d.isScaytEnabled(b)&&"wysiwyg"==b.mode&&("undo"==a.data.name||"redo"==a.data.name)&&window.setTimeout(function(){d.getScayt(b).refresh()},10)});b.on("destroy",c);b.on("setData",c);b.on("insertElement",function(){var a=d.getScayt(b);d.isScaytEnabled(b)&&(CKEDITOR.env.ie&&b.getSelection().unlock(!0),window.setTimeout(function(){a.focus();a.refresh()},10))},this,null,50);b.on("insertHtml",function(){var a=d.getScayt(b);d.isScaytEnabled(b)&&
+(CKEDITOR.env.ie&&b.getSelection().unlock(!0),window.setTimeout(function(){a.focus();a.refresh()},10))},this,null,50);b.on("scaytDialog",function(a){a.data.djConfig=window.djConfig;a.data.scayt_control=d.getScayt(b);a.data.tab=i;a.data.scayt=window.scayt});var e=b.dataProcessor;(e=e&&e.htmlFilter)&&e.addRules({elements:{span:function(a){if(a.attributes["data-scayt_word"]&&a.attributes["data-scaytid"])return delete a.name,a}}});e=CKEDITOR.plugins.undo.Image.prototype;e="function"==typeof e.equalsContent?
+e.equalsContent:e.equals;e=CKEDITOR.tools.override(e,function(a){return function(b){var c=this.contents,f=b.contents,e=d.getScayt(this.editor);e&&d.isScaytReady(this.editor)&&(this.contents=e.reset(c)||"",b.contents=e.reset(f)||"");e=a.apply(this,arguments);this.contents=c;b.contents=f;return e}});b.document&&(b.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE||b.focusManager.hasFocus)&&f()};CKEDITOR.plugins.scayt={engineLoaded:!1,instances:{},controlInfo:{},setControlInfo:function(a,c){a&&(a.name&&"object"!=
+typeof this.controlInfo[a.name])&&(this.controlInfo[a.name]={});for(var b in c)this.controlInfo[a.name][b]=c[b]},isControlRestored:function(a){return a&&a.name&&this.controlInfo[a.name]?this.controlInfo[a.name].restored:!1},markControlRestore:function(a){this.setControlInfo(a,{restored:!0})},setControlId:function(a,c){this.setControlInfo(a,{id:c})},getControlId:function(a){return a&&a.name&&this.controlInfo[a.name]&&this.controlInfo[a.name].id?this.controlInfo[a.name].id:null},setPaused:function(a,
+c){this.setControlInfo(a,{paused:c})},isPaused:function(a){if(a&&a.name&&this.controlInfo[a.name])return this.controlInfo[a.name].paused},getScayt:function(a){return this.instances[a.name]},isScaytReady:function(a){return!0===this.engineLoaded&&"undefined"!==typeof window.scayt&&this.getScayt(a)},isScaytEnabled:function(a){return(a=this.getScayt(a))?!1===a.disabled:!1},getUiTabs:function(a){var c=[],b=a.config.scayt_uiTabs||"1,1,1",b=b.split(",");b[3]="1";for(var d=0;4>d;d++)c[d]="undefined"!=typeof window.scayt&&
+"undefined"!=typeof window.scayt.uiTags?parseInt(b[d],10)&&window.scayt.uiTags[d]:parseInt(b[d],10);"object"==typeof a.plugins.wsc?c.push(1):c.push(0);return c},loadEngine:function(a){if(CKEDITOR.env.gecko&&10900>CKEDITOR.env.version||CKEDITOR.env.opera||CKEDITOR.env.air)return a.fire("showScaytState");if(!0===this.engineLoaded)return r.apply(a);if(-1==this.engineLoaded)return CKEDITOR.on("scaytReady",function(){r.apply(a)});CKEDITOR.on("scaytReady",r,a);CKEDITOR.on("scaytReady",function(){this.engineLoaded=
+!0},this,null,0);this.engineLoaded=-1;var c=document.location.protocol,c=-1!=c.search(/https?:/)?c:"http:",c=a.config.scayt_srcUrl||c+"//svc.webspellchecker.net/scayt26/loader__base.js",b=d.parseUrl(c).path+"/";void 0==window.scayt?(CKEDITOR._djScaytConfig={baseUrl:b,addOnLoad:[function(){CKEDITOR.fireOnce("scaytReady")}],isDebug:!1},CKEDITOR.document.getHead().append(CKEDITOR.document.createElement("script",{attributes:{type:"text/javascript",async:"true",src:c}}))):CKEDITOR.fireOnce("scaytReady");
+return null},parseUrl:function(a){var c;return a.match&&(c=a.match(/(.*)[\/\\](.*?\.\w+)$/))?{path:c[1],file:c[2]}:a}};var d=CKEDITOR.plugins.scayt,s=function(a,c,b,d,e,k,g){a.addCommand(d,e);a.addMenuItem(d,{label:b,command:d,group:k,order:g})},v={preserveState:!0,editorFocus:!1,canUndo:!1,exec:function(a){if(d.isScaytReady(a)){var c=d.isScaytEnabled(a);this.setState(c?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_ON);a=d.getScayt(a);a.focus();a.setDisabled(c)}else!a.config.scayt_autoStartup&&0<=d.engineLoaded&&
+(a.focus(),this.setState(CKEDITOR.TRISTATE_DISABLED),d.loadEngine(a))}};CKEDITOR.plugins.add("scayt",{requires:"menubutton,dialog",beforeInit:function(a){var c=a.config.scayt_contextMenuItemsOrder||"suggest|moresuggest|control",b="";if((c=c.split("|"))&&c.length)for(var d=0;d<c.length;d++)b+="scayt_"+c[d]+(c.length!=parseInt(d,10)+1?",":"");a.config.menu_groups=b+","+a.config.menu_groups},checkEnvironment:function(){return CKEDITOR.env.opera||CKEDITOR.env.air?0:1},init:function(a){var c=a.dataProcessor&&
+a.dataProcessor.dataFilter,b={elements:{span:function(a){var b=a.attributes;b&&b["data-scaytid"]&&delete a.name}}};c&&c.addRules(b);var f={},e={},p=a.addCommand("scaytcheck",v);CKEDITOR.dialog.add("scaytcheck",CKEDITOR.getUrl(this.path+"dialogs/options.js"));c=d.getUiTabs(a);a.addMenuGroup("scaytButton");a.addMenuGroup("scayt_suggest",-10);a.addMenuGroup("scayt_moresuggest",-9);a.addMenuGroup("scayt_control",-8);var b={},g=a.lang.scayt;b.scaytToggle={label:g.enable,command:"scaytcheck",group:"scaytButton"};
+1==c[0]&&(b.scaytOptions={label:g.options,group:"scaytButton",onClick:function(){i="options";a.openDialog("scaytcheck")}});1==c[1]&&(b.scaytLangs={label:g.langs,group:"scaytButton",onClick:function(){i="langs";a.openDialog("scaytcheck")}});1==c[2]&&(b.scaytDict={label:g.dictionariesTab,group:"scaytButton",onClick:function(){i="dictionaries";a.openDialog("scaytcheck")}});b.scaytAbout={label:a.lang.scayt.about,group:"scaytButton",onClick:function(){i="about";a.openDialog("scaytcheck")}};1==c[4]&&(b.scaytWSC=
+{label:a.lang.wsc.toolbar,group:"scaytButton",command:"checkspell"});a.addMenuItems(b);a.ui.add("Scayt",CKEDITOR.UI_MENUBUTTON,{label:g.title,title:CKEDITOR.env.opera?g.opera_title:g.title,modes:{wysiwyg:this.checkEnvironment()},toolbar:"spellchecker,20",onRender:function(){p.on("state",function(){this.setState(p.state)},this)},onMenu:function(){var b=d.isScaytEnabled(a);a.getMenuItem("scaytToggle").label=g[b?"disable":"enable"];var c=d.getUiTabs(a);return{scaytToggle:CKEDITOR.TRISTATE_OFF,scaytOptions:b&&
+c[0]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytLangs:b&&c[1]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytDict:b&&c[2]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytAbout:b&&c[3]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytWSC:c[4]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED}}});a.contextMenu&&a.addMenuItems&&a.contextMenu.addListener(function(b,c){if(!d.isScaytEnabled(a)||c.getRanges()[0].checkReadOnly())return null;var l=d.getScayt(a),q=l.getScaytNode();
+if(!q)return null;var h=l.getWord(q);if(!h)return null;var i=l.getLang(),m=a.config.scayt_contextCommands||"all",h=window.scayt.getSuggestion(h,i),m=m.split("|"),n;for(n in f){delete a._.menuItems[n];delete a.commands[n]}for(n in e){delete a._.menuItems[n];delete a.commands[n]}if(!h||!h.length){s(a,"no_sugg",g.noSuggestions,"scayt_no_sugg",{exec:function(){}},"scayt_control",1,true);e.scayt_no_sugg=CKEDITOR.TRISTATE_OFF}else{f={};e={};n=a.config.scayt_moreSuggestions||"on";var i=false,u=a.config.scayt_maxSuggestions;
+typeof u!="number"&&(u=5);!u&&(u=h.length);for(var j=0,p=h.length;j<p;j=j+1){var t="scayt_suggestion_"+h[j].replace(" ","_"),r=function(a,b){return{exec:function(){l.replace(a,b)}}}(q,h[j]);if(j<u){s(a,"button_"+t,h[j],t,r,"scayt_suggest",j+1);e[t]=CKEDITOR.TRISTATE_OFF}else if(n=="on"){s(a,"button_"+t,h[j],t,r,"scayt_moresuggest",j+1);f[t]=CKEDITOR.TRISTATE_OFF;i=true}}if(i){a.addMenuItem("scayt_moresuggest",{label:g.moreSuggestions,group:"scayt_moresuggest",order:10,getItems:function(){return f}});
+e.scayt_moresuggest=CKEDITOR.TRISTATE_OFF}}if(k("all",m)||k("ignore",m)){s(a,"ignore",g.ignore,"scayt_ignore",{exec:function(){l.ignore(q)}},"scayt_control",2);e.scayt_ignore=CKEDITOR.TRISTATE_OFF}if(k("all",m)||k("ignoreall",m)){s(a,"ignore_all",g.ignoreAll,"scayt_ignore_all",{exec:function(){l.ignoreAll(q)}},"scayt_control",3);e.scayt_ignore_all=CKEDITOR.TRISTATE_OFF}if(k("all",m)||k("add",m)){s(a,"add_word",g.addWord,"scayt_add_word",{exec:function(){window.scayt.addWordToUserDictionary(q)}},"scayt_control",
+4);e.scayt_add_word=CKEDITOR.TRISTATE_OFF}l.fireOnContextMenu&&l.fireOnContextMenu(a);return e});c=function(b){b.removeListener();CKEDITOR.env.opera||CKEDITOR.env.air?p.setState(CKEDITOR.TRISTATE_DISABLED):p.setState(d.isScaytEnabled(a)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)};a.on("showScaytState",c);a.on("instanceReady",c);if(a.config.scayt_autoStartup)a.on("instanceReady",function(){d.loadEngine(a)})},afterInit:function(a){var c,b=function(a){if(a.hasAttribute("data-scaytid"))return!1};a._.elementsPath&&
+(c=a._.elementsPath.filters)&&c.push(b);a.addRemoveFormatFilter&&a.addRemoveFormatFilter(b)}})})();(function(){CKEDITOR.plugins.add("stylescombo",{requires:"richcombo",init:function(c){var j=c.config,f=c.lang.stylescombo,g={},i=[],k=[];c.on("stylesSet",function(b){if(b=b.data.styles){for(var a,h,d=0,e=b.length;d<e;d++)if(a=b[d],!(c.blockless&&a.element in CKEDITOR.dtd.$block)&&(h=a.name,a=new CKEDITOR.style(a),!c.filter.customConfig||c.filter.check(a)))a._name=h,a._.enterMode=j.enterMode,a._.weight=d+1E3*(a.type==CKEDITOR.STYLE_OBJECT?1:a.type==CKEDITOR.STYLE_BLOCK?2:3),g[h]=a,i.push(a),k.push(a);
+i.sort(function(a,b){return a._.weight-b._.weight})}});c.ui.addRichCombo("Styles",{label:f.label,title:f.panelTitle,toolbar:"styles,10",allowedContent:k,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(j.contentsCss),multiSelect:!0,attributes:{"aria-label":f.panelTitle}},init:function(){var b,a,c,d,e,g;e=0;for(g=i.length;e<g;e++)b=i[e],a=b._name,d=b.type,d!=c&&(this.startGroup(f["panelTitle"+d]),c=d),this.add(a,b.type==CKEDITOR.STYLE_OBJECT?a:b.buildPreview(),a);this.commit()},onClick:function(b){c.focus();
+c.fire("saveSnapshot");var b=g[b],a=c.elementPath();c[b.checkActive(a)?"removeStyle":"applyStyle"](b);c.fire("saveSnapshot")},onRender:function(){c.on("selectionChange",function(b){for(var a=this.getValue(),b=b.data.path.elements,c=0,d=b.length,e;c<d;c++){e=b[c];for(var f in g)if(g[f].checkElementRemovable(e,!0)){f!=a&&this.setValue(f);return}}this.setValue("")},this)},onOpen:function(){var b=c.getSelection().getSelectedElement(),b=c.elementPath(b),a=[0,0,0,0];this.showAll();this.unmarkAll();for(var h in g){var d=
+g[h],e=d.type;e==CKEDITOR.STYLE_BLOCK&&!b.isContextFor(d.element)?this.hideItem(h):(d.checkActive(b)?this.mark(h):e==CKEDITOR.STYLE_OBJECT&&!d.checkApplicable(b)&&(this.hideItem(h),a[e]--),a[e]++)}a[CKEDITOR.STYLE_BLOCK]||this.hideGroup(f["panelTitle"+CKEDITOR.STYLE_BLOCK]);a[CKEDITOR.STYLE_INLINE]||this.hideGroup(f["panelTitle"+CKEDITOR.STYLE_INLINE]);a[CKEDITOR.STYLE_OBJECT]||this.hideGroup(f["panelTitle"+CKEDITOR.STYLE_OBJECT])},reset:function(){g={};i=[]}})}})})();(function(){function i(c){return{editorFocus:!1,canUndo:!1,modes:{wysiwyg:1},exec:function(d){if(d.editable().hasFocus){var e=d.getSelection(),b;if(b=(new CKEDITOR.dom.elementPath(e.getCommonAncestor(),e.root)).contains({td:1,th:1},1)){var e=d.createRange(),a=CKEDITOR.tools.tryThese(function(){var a=b.getParent().$.cells[b.$.cellIndex+(c?-1:1)];a.parentNode.parentNode;return a},function(){var a=b.getParent(),a=a.getAscendant("table").$.rows[a.$.rowIndex+(c?-1:1)];return a.cells[c?a.cells.length-1:
+0]});if(!a&&!c){for(var f=b.getAscendant("table").$,a=b.getParent().$.cells,f=new CKEDITOR.dom.element(f.insertRow(-1),d.document),g=0,h=a.length;g<h;g++){var i=f.append((new CKEDITOR.dom.element(a[g],d.document)).clone(!1,!1));!CKEDITOR.env.ie&&i.appendBogus()}e.moveToElementEditStart(f)}else if(a)a=new CKEDITOR.dom.element(a),e.moveToElementEditStart(a),(!e.checkStartOfBlock()||!e.checkEndOfBlock())&&e.selectNodeContents(a);else return!0;e.select(!0);return!0}}return!1}}}var h={editorFocus:!1,modes:{wysiwyg:1,
+source:1}},g={exec:function(c){c.container.focusNext(!0,c.tabIndex)}},f={exec:function(c){c.container.focusPrevious(!0,c.tabIndex)}};CKEDITOR.plugins.add("tab",{init:function(c){for(var d=!1!==c.config.enableTabKeyTools,e=c.config.tabSpaces||0,b="";e--;)b+=" ";if(b)c.on("key",function(a){9==a.data.keyCode&&(c.insertHtml(b),a.cancel())});if(d)c.on("key",function(a){(9==a.data.keyCode&&c.execCommand("selectNextCell")||a.data.keyCode==CKEDITOR.SHIFT+9&&c.execCommand("selectPreviousCell"))&&a.cancel()});
+c.addCommand("blur",CKEDITOR.tools.extend(g,h));c.addCommand("blurBack",CKEDITOR.tools.extend(f,h));c.addCommand("selectNextCell",i());c.addCommand("selectPreviousCell",i(!0))}})})();
+CKEDITOR.dom.element.prototype.focusNext=function(i,h){var g=void 0===h?this.getTabIndex():h,f,c,d,e,b,a;if(0>=g)for(b=this.getNextSourceNode(i,CKEDITOR.NODE_ELEMENT);b;){if(b.isVisible()&&0===b.getTabIndex()){d=b;break}b=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT)}else for(b=this.getDocument().getBody().getFirst();b=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT);){if(!f)if(!c&&b.equals(this)){if(c=!0,i){if(!(b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT)))break;f=1}}else c&&!this.contains(b)&&
+(f=1);if(b.isVisible()&&!(0>(a=b.getTabIndex()))){if(f&&a==g){d=b;break}a>g&&(!d||!e||a<e)?(d=b,e=a):!d&&0===a&&(d=b,e=a)}}d&&d.focus()};
+CKEDITOR.dom.element.prototype.focusPrevious=function(i,h){for(var g=void 0===h?this.getTabIndex():h,f,c,d,e=0,b,a=this.getDocument().getBody().getLast();a=a.getPreviousSourceNode(!1,CKEDITOR.NODE_ELEMENT);){if(!f)if(!c&&a.equals(this)){if(c=!0,i){if(!(a=a.getPreviousSourceNode(!0,CKEDITOR.NODE_ELEMENT)))break;f=1}}else c&&!this.contains(a)&&(f=1);if(a.isVisible()&&!(0>(b=a.getTabIndex())))if(0>=g){if(f&&0===b){d=a;break}b>e&&(d=a,e=b)}else{if(f&&b==g){d=a;break}if(b<g&&(!d||b>e))d=a,e=b}}d&&d.focus()};CKEDITOR.plugins.add("table",{requires:"dialog",init:function(a){function d(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,refresh:function(a,e){this.setState(e.contains("table",1)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}})}if(!a.blockless){var b=a.lang.table;a.addCommand("table",new CKEDITOR.dialogCommand("table",{context:"table",allowedContent:"table{width,height}[align,border,cellpadding,cellspacing,summary];caption tbody thead tfoot;th td tr[scope];"+(a.plugins.dialogadvtab?
+"table"+a.plugins.dialogadvtab.allowedContent():""),requiredContent:"table",contentTransformations:[["table{width}: sizeToStyle","table[width]: sizeToAttribute"]]}));a.addCommand("tableProperties",new CKEDITOR.dialogCommand("tableProperties",d()));a.addCommand("tableDelete",d({exec:function(a){var c=a.elementPath().contains("table",1);if(c){var b=c.getParent();1==b.getChildCount()&&!b.is("body","td","th")&&(c=b);a=a.createRange();a.moveToPosition(c,CKEDITOR.POSITION_BEFORE_START);c.remove();a.select()}}}));
+a.ui.addButton&&a.ui.addButton("Table",{label:b.toolbar,command:"table",toolbar:"insert,30"});CKEDITOR.dialog.add("table",this.path+"dialogs/table.js");CKEDITOR.dialog.add("tableProperties",this.path+"dialogs/table.js");a.addMenuItems&&a.addMenuItems({table:{label:b.menu,command:"tableProperties",group:"table",order:5},tabledelete:{label:b.deleteTable,command:"tableDelete",group:"table",order:1}});a.on("doubleclick",function(a){a.data.element.is("table")&&(a.data.dialog="tableProperties")});a.contextMenu&&
+a.contextMenu.addListener(function(){return{tabledelete:CKEDITOR.TRISTATE_OFF,table:CKEDITOR.TRISTATE_OFF}})}}});(function(){function p(e){function d(a){!(0<b.length)&&(a.type==CKEDITOR.NODE_ELEMENT&&y.test(a.getName())&&!a.getCustomData("selected_cell"))&&(CKEDITOR.dom.element.setMarker(c,a,"selected_cell",!0),b.push(a))}for(var e=e.getRanges(),b=[],c={},a=0;a<e.length;a++){var f=e[a];if(f.collapsed)f=f.getCommonAncestor(),(f=f.getAscendant("td",!0)||f.getAscendant("th",!0))&&b.push(f);else{var f=new CKEDITOR.dom.walker(f),g;for(f.guard=d;g=f.next();)if(g.type!=CKEDITOR.NODE_ELEMENT||!g.is(CKEDITOR.dtd.table))if((g=
+g.getAscendant("td",!0)||g.getAscendant("th",!0))&&!g.getCustomData("selected_cell"))CKEDITOR.dom.element.setMarker(c,g,"selected_cell",!0),b.push(g)}}CKEDITOR.dom.element.clearAllMarkers(c);return b}function o(e,d){for(var b=p(e),c=b[0],a=c.getAscendant("table"),c=c.getDocument(),f=b[0].getParent(),g=f.$.rowIndex,b=b[b.length-1],h=b.getParent().$.rowIndex+b.$.rowSpan-1,b=new CKEDITOR.dom.element(a.$.rows[h]),g=d?g:h,f=d?f:b,b=CKEDITOR.tools.buildTableMap(a),a=b[g],g=d?b[g-1]:b[g+1],b=b[0].length,
+c=c.createElement("tr"),h=0;a[h]&&h<b;h++){var i;1<a[h].rowSpan&&g&&a[h]==g[h]?(i=a[h],i.rowSpan+=1):(i=(new CKEDITOR.dom.element(a[h])).clone(),i.removeAttribute("rowSpan"),!CKEDITOR.env.ie&&i.appendBogus(),c.append(i),i=i.$);h+=i.colSpan-1}d?c.insertBefore(f):c.insertAfter(f)}function q(e){if(e instanceof CKEDITOR.dom.selection){for(var d=p(e),b=d[0].getAscendant("table"),c=CKEDITOR.tools.buildTableMap(b),e=d[0].getParent().$.rowIndex,d=d[d.length-1],a=d.getParent().$.rowIndex+d.$.rowSpan-1,d=[],
+f=e;f<=a;f++){for(var g=c[f],h=new CKEDITOR.dom.element(b.$.rows[f]),i=0;i<g.length;i++){var j=new CKEDITOR.dom.element(g[i]),l=j.getParent().$.rowIndex;1==j.$.rowSpan?j.remove():(j.$.rowSpan-=1,l==f&&(l=c[f+1],l[i-1]?j.insertAfter(new CKEDITOR.dom.element(l[i-1])):(new CKEDITOR.dom.element(b.$.rows[f+1])).append(j,1)));i+=j.$.colSpan-1}d.push(h)}c=b.$.rows;b=new CKEDITOR.dom.element(c[a+1]||(0<e?c[e-1]:null)||b.$.parentNode);for(f=d.length;0<=f;f--)q(d[f]);return b}e instanceof CKEDITOR.dom.element&&
+(b=e.getAscendant("table"),1==b.$.rows.length?b.remove():e.remove());return null}function r(e,d){for(var b=d?Infinity:0,c=0;c<e.length;c++){var a;a=e[c];for(var f=d,g=a.getParent().$.cells,h=0,i=0;i<g.length;i++){var j=g[i],h=h+(f?1:j.colSpan);if(j==a.$)break}a=h-1;if(d?a<b:a>b)b=a}return b}function k(e,d){for(var b=p(e),c=b[0].getAscendant("table"),a=r(b,1),b=r(b),a=d?a:b,f=CKEDITOR.tools.buildTableMap(c),c=[],b=[],g=f.length,h=0;h<g;h++)c.push(f[h][a]),b.push(d?f[h][a-1]:f[h][a+1]);for(h=0;h<g;h++)c[h]&&
+(1<c[h].colSpan&&b[h]==c[h]?(a=c[h],a.colSpan+=1):(a=(new CKEDITOR.dom.element(c[h])).clone(),a.removeAttribute("colSpan"),!CKEDITOR.env.ie&&a.appendBogus(),a[d?"insertBefore":"insertAfter"].call(a,new CKEDITOR.dom.element(c[h])),a=a.$),h+=a.rowSpan-1)}function u(e,d){var b=e.getStartElement();if(b=b.getAscendant("td",1)||b.getAscendant("th",1)){var c=b.clone();CKEDITOR.env.ie||c.appendBogus();d?c.insertBefore(b):c.insertAfter(b)}}function t(e){if(e instanceof CKEDITOR.dom.selection){var e=p(e),d=
+e[0]&&e[0].getAscendant("table"),b;a:{var c=0;b=e.length-1;for(var a={},f,g;f=e[c++];)CKEDITOR.dom.element.setMarker(a,f,"delete_cell",!0);for(c=0;f=e[c++];)if((g=f.getPrevious())&&!g.getCustomData("delete_cell")||(g=f.getNext())&&!g.getCustomData("delete_cell")){CKEDITOR.dom.element.clearAllMarkers(a);b=g;break a}CKEDITOR.dom.element.clearAllMarkers(a);g=e[0].getParent();(g=g.getPrevious())?b=g.getLast():(g=e[b].getParent(),b=(g=g.getNext())?g.getChild(0):null)}for(g=e.length-1;0<=g;g--)t(e[g]);
+b?m(b,!0):d&&d.remove()}else e instanceof CKEDITOR.dom.element&&(d=e.getParent(),1==d.getChildCount()?d.remove():e.remove())}function m(e,d){var b=new CKEDITOR.dom.range(e.getDocument());if(!b["moveToElementEdit"+(d?"End":"Start")](e))b.selectNodeContents(e),b.collapse(d?!1:!0);b.select(!0)}function v(e,d,b){e=e[d];if("undefined"==typeof b)return e;for(d=0;e&&d<e.length;d++){if(b.is&&e[d]==b.$)return d;if(d==b)return new CKEDITOR.dom.element(e[d])}return b.is?-1:null}function s(e,d,b){var c=p(e),
+a;if((d?1!=c.length:2>c.length)||(a=e.getCommonAncestor())&&a.type==CKEDITOR.NODE_ELEMENT&&a.is("table"))return!1;var f,e=c[0];a=e.getAscendant("table");var g=CKEDITOR.tools.buildTableMap(a),h=g.length,i=g[0].length,j=e.getParent().$.rowIndex,l=v(g,j,e);if(d){var n;try{var m=parseInt(e.getAttribute("rowspan"),10)||1;f=parseInt(e.getAttribute("colspan"),10)||1;n=g["up"==d?j-m:"down"==d?j+m:j]["left"==d?l-f:"right"==d?l+f:l]}catch(z){return!1}if(!n||e.$==n)return!1;c["up"==d||"left"==d?"unshift":"push"](new CKEDITOR.dom.element(n))}for(var d=
+e.getDocument(),o=j,m=n=0,q=!b&&new CKEDITOR.dom.documentFragment(d),s=0,d=0;d<c.length;d++){f=c[d];var k=f.getParent(),t=f.getFirst(),r=f.$.colSpan,u=f.$.rowSpan,k=k.$.rowIndex,w=v(g,k,f),s=s+r*u,m=Math.max(m,w-l+r);n=Math.max(n,k-j+u);if(!b){r=f;(u=r.getBogus())&&u.remove();r.trim();if(f.getChildren().count()){if(k!=o&&t&&(!t.isBlockBoundary||!t.isBlockBoundary({br:1})))(o=q.getLast(CKEDITOR.dom.walker.whitespaces(!0)))&&(!o.is||!o.is("br"))&&q.append("br");f.moveChildren(q)}d?f.remove():f.setHtml("")}o=
+k}if(b)return n*m==s;q.moveChildren(e);CKEDITOR.env.ie||e.appendBogus();m>=i?e.removeAttribute("rowSpan"):e.$.rowSpan=n;n>=h?e.removeAttribute("colSpan"):e.$.colSpan=m;b=new CKEDITOR.dom.nodeList(a.$.rows);c=b.count();for(d=c-1;0<=d;d--)a=b.getItem(d),a.$.cells.length||(a.remove(),c++);return e}function w(e,d){var b=p(e);if(1<b.length)return!1;if(d)return!0;var b=b[0],c=b.getParent(),a=c.getAscendant("table"),f=CKEDITOR.tools.buildTableMap(a),g=c.$.rowIndex,h=v(f,g,b),i=b.$.rowSpan,j;if(1<i){j=Math.ceil(i/
+2);for(var i=Math.floor(i/2),c=g+j,a=new CKEDITOR.dom.element(a.$.rows[c]),f=v(f,c),l,c=b.clone(),g=0;g<f.length;g++)if(l=f[g],l.parentNode==a.$&&g>h){c.insertBefore(new CKEDITOR.dom.element(l));break}else l=null;l||a.append(c,!0)}else{i=j=1;a=c.clone();a.insertAfter(c);a.append(c=b.clone());l=v(f,g);for(h=0;h<l.length;h++)l[h].rowSpan++}CKEDITOR.env.ie||c.appendBogus();b.$.rowSpan=j;c.$.rowSpan=i;1==j&&b.removeAttribute("rowSpan");1==i&&c.removeAttribute("rowSpan");return c}function x(e,d){var b=
+p(e);if(1<b.length)return!1;if(d)return!0;var b=b[0],c=b.getParent(),a=c.getAscendant("table"),a=CKEDITOR.tools.buildTableMap(a),f=v(a,c.$.rowIndex,b),g=b.$.colSpan;if(1<g)c=Math.ceil(g/2),g=Math.floor(g/2);else{for(var g=c=1,h=[],i=0;i<a.length;i++){var j=a[i];h.push(j[f]);1<j[f].rowSpan&&(i+=j[f].rowSpan-1)}for(a=0;a<h.length;a++)h[a].colSpan++}a=b.clone();a.insertAfter(b);CKEDITOR.env.ie||a.appendBogus();b.$.colSpan=c;a.$.colSpan=g;1==c&&b.removeAttribute("colSpan");1==g&&a.removeAttribute("colSpan");
+return a}var y=/^(?:td|th)$/;CKEDITOR.plugins.tabletools={requires:"table,dialog,contextmenu",init:function(e){function d(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,refresh:function(a,b){this.setState(b.contains({td:1,th:1},1)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}})}function b(a,b){var c=e.addCommand(a,b);e.addFeature(c)}var c=e.lang.table;b("cellProperties",new CKEDITOR.dialogCommand("cellProperties",d({allowedContent:"td th{width,height,border-color,background-color,white-space,vertical-align,text-align}[colspan,rowspan]",
+requiredContent:"table"})));CKEDITOR.dialog.add("cellProperties",this.path+"dialogs/tableCell.js");b("rowDelete",d({requiredContent:"table",exec:function(a){a=a.getSelection();m(q(a))}}));b("rowInsertBefore",d({requiredContent:"table",exec:function(a){a=a.getSelection();o(a,!0)}}));b("rowInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();o(a)}}));b("columnDelete",d({requiredContent:"table",exec:function(a){for(var a=a.getSelection(),a=p(a),b=a[0],c=a[a.length-1],a=b.getAscendant("table"),
+d=CKEDITOR.tools.buildTableMap(a),e,j,l=[],n=0,o=d.length;n<o;n++)for(var k=0,q=d[n].length;k<q;k++)d[n][k]==b.$&&(e=k),d[n][k]==c.$&&(j=k);for(n=e;n<=j;n++)for(k=0;k<d.length;k++)c=d[k],b=new CKEDITOR.dom.element(a.$.rows[k]),c=new CKEDITOR.dom.element(c[n]),c.$&&(1==c.$.colSpan?c.remove():c.$.colSpan-=1,k+=c.$.rowSpan-1,b.$.cells.length||l.push(b));j=a.$.rows[0]&&a.$.rows[0].cells;e=new CKEDITOR.dom.element(j[e]||(e?j[e-1]:a.$.parentNode));l.length==o&&a.remove();e&&m(e,!0)}}));b("columnInsertBefore",
+d({requiredContent:"table",exec:function(a){a=a.getSelection();k(a,!0)}}));b("columnInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();k(a)}}));b("cellDelete",d({requiredContent:"table",exec:function(a){a=a.getSelection();t(a)}}));b("cellMerge",d({allowedContent:"td[colspan,rowspan]",requiredContent:"td[colspan,rowspan]",exec:function(a){m(s(a.getSelection()),!0)}}));b("cellMergeRight",d({allowedContent:"td[colspan]",requiredContent:"td[colspan]",exec:function(a){m(s(a.getSelection(),
+"right"),!0)}}));b("cellMergeDown",d({allowedContent:"td[rowspan]",requiredContent:"td[rowspan]",exec:function(a){m(s(a.getSelection(),"down"),!0)}}));b("cellVerticalSplit",d({allowedContent:"td[rowspan]",requiredContent:"td[rowspan]",exec:function(a){m(w(a.getSelection()))}}));b("cellHorizontalSplit",d({allowedContent:"td[colspan]",requiredContent:"td[colspan]",exec:function(a){m(x(a.getSelection()))}}));b("cellInsertBefore",d({requiredContent:"table",exec:function(a){a=a.getSelection();u(a,!0)}}));
+b("cellInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();u(a)}}));e.addMenuItems&&e.addMenuItems({tablecell:{label:c.cell.menu,group:"tablecell",order:1,getItems:function(){var a=e.getSelection(),b=p(a);return{tablecell_insertBefore:CKEDITOR.TRISTATE_OFF,tablecell_insertAfter:CKEDITOR.TRISTATE_OFF,tablecell_delete:CKEDITOR.TRISTATE_OFF,tablecell_merge:s(a,null,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_merge_right:s(a,"right",!0)?CKEDITOR.TRISTATE_OFF:
+CKEDITOR.TRISTATE_DISABLED,tablecell_merge_down:s(a,"down",!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_split_vertical:w(a,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_split_horizontal:x(a,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_properties:0<b.length?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED}}},tablecell_insertBefore:{label:c.cell.insertBefore,group:"tablecell",command:"cellInsertBefore",order:5},tablecell_insertAfter:{label:c.cell.insertAfter,
+group:"tablecell",command:"cellInsertAfter",order:10},tablecell_delete:{label:c.cell.deleteCell,group:"tablecell",command:"cellDelete",order:15},tablecell_merge:{label:c.cell.merge,group:"tablecell",command:"cellMerge",order:16},tablecell_merge_right:{label:c.cell.mergeRight,group:"tablecell",command:"cellMergeRight",order:17},tablecell_merge_down:{label:c.cell.mergeDown,group:"tablecell",command:"cellMergeDown",order:18},tablecell_split_horizontal:{label:c.cell.splitHorizontal,group:"tablecell",
+command:"cellHorizontalSplit",order:19},tablecell_split_vertical:{label:c.cell.splitVertical,group:"tablecell",command:"cellVerticalSplit",order:20},tablecell_properties:{label:c.cell.title,group:"tablecellproperties",command:"cellProperties",order:21},tablerow:{label:c.row.menu,group:"tablerow",order:1,getItems:function(){return{tablerow_insertBefore:CKEDITOR.TRISTATE_OFF,tablerow_insertAfter:CKEDITOR.TRISTATE_OFF,tablerow_delete:CKEDITOR.TRISTATE_OFF}}},tablerow_insertBefore:{label:c.row.insertBefore,
+group:"tablerow",command:"rowInsertBefore",order:5},tablerow_insertAfter:{label:c.row.insertAfter,group:"tablerow",command:"rowInsertAfter",order:10},tablerow_delete:{label:c.row.deleteRow,group:"tablerow",command:"rowDelete",order:15},tablecolumn:{label:c.column.menu,group:"tablecolumn",order:1,getItems:function(){return{tablecolumn_insertBefore:CKEDITOR.TRISTATE_OFF,tablecolumn_insertAfter:CKEDITOR.TRISTATE_OFF,tablecolumn_delete:CKEDITOR.TRISTATE_OFF}}},tablecolumn_insertBefore:{label:c.column.insertBefore,
+group:"tablecolumn",command:"columnInsertBefore",order:5},tablecolumn_insertAfter:{label:c.column.insertAfter,group:"tablecolumn",command:"columnInsertAfter",order:10},tablecolumn_delete:{label:c.column.deleteColumn,group:"tablecolumn",command:"columnDelete",order:15}});e.contextMenu&&e.contextMenu.addListener(function(a,b,c){return(a=c.contains({td:1,th:1},1))&&!a.isReadOnly()?{tablecell:CKEDITOR.TRISTATE_OFF,tablerow:CKEDITOR.TRISTATE_OFF,tablecolumn:CKEDITOR.TRISTATE_OFF}:null})},getSelectedCells:p};
+CKEDITOR.plugins.add("tabletools",CKEDITOR.plugins.tabletools)})();CKEDITOR.tools.buildTableMap=function(p){for(var p=p.$.rows,o=-1,q=[],r=0;r<p.length;r++){o++;!q[o]&&(q[o]=[]);for(var k=-1,u=0;u<p[r].cells.length;u++){var t=p[r].cells[u];for(k++;q[o][k];)k++;for(var m=isNaN(t.colSpan)?1:t.colSpan,t=isNaN(t.rowSpan)?1:t.rowSpan,v=0;v<t;v++){q[o+v]||(q[o+v]=[]);for(var s=0;s<m;s++)q[o+v][k+s]=p[r].cells[u]}k+=m-1}}return q};(function(){function g(a){this.editor=a;this.reset()}CKEDITOR.plugins.add("undo",{init:function(a){function c(a){b.enabled&&!1!==a.data.command.canUndo&&b.save()}function d(){b.enabled=a.readOnly?!1:"wysiwyg"==a.mode;b.onChange()}var b=new g(a),e=a.addCommand("undo",{exec:function(){b.undo()&&(a.selectionChange(),this.fire("afterUndo"))},state:CKEDITOR.TRISTATE_DISABLED,canUndo:!1}),f=a.addCommand("redo",{exec:function(){b.redo()&&(a.selectionChange(),this.fire("afterRedo"))},state:CKEDITOR.TRISTATE_DISABLED,
+canUndo:!1});a.setKeystroke([[CKEDITOR.CTRL+90,"undo"],[CKEDITOR.CTRL+89,"redo"],[CKEDITOR.CTRL+CKEDITOR.SHIFT+90,"redo"]]);b.onChange=function(){e.setState(b.undoable()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);f.setState(b.redoable()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)};a.on("beforeCommandExec",c);a.on("afterCommandExec",c);a.on("saveSnapshot",function(a){b.save(a.data&&a.data.contentOnly)});a.on("contentDom",function(){a.editable().on("keydown",function(a){a=a.data.getKey();
+(8==a||46==a)&&b.type(a,0)});a.editable().on("keypress",function(a){b.type(a.data.getKey(),1)})});a.on("beforeModeUnload",function(){"wysiwyg"==a.mode&&b.save(!0)});a.on("mode",d);a.on("readOnly",d);a.ui.addButton&&(a.ui.addButton("Undo",{label:a.lang.undo.undo,command:"undo",toolbar:"undo,10"}),a.ui.addButton("Redo",{label:a.lang.undo.redo,command:"redo",toolbar:"undo,20"}));a.resetUndo=function(){b.reset();a.fire("saveSnapshot")};a.on("updateSnapshot",function(){b.currentImage&&b.update()});a.on("lockSnapshot",
+b.lock,b);a.on("unlockSnapshot",b.unlock,b)}});CKEDITOR.plugins.undo={};var f=CKEDITOR.plugins.undo.Image=function(a){this.editor=a;a.fire("beforeUndoImage");var c=a.getSnapshot(),d=c&&a.getSelection();CKEDITOR.env.ie&&c&&(c=c.replace(/\s+data-cke-expando=".*?"/g,""));this.contents=c;this.bookmarks=d&&d.createBookmarks2(!0);a.fire("afterUndoImage")},h=/\b(?:href|src|name)="[^"]*?"/gi;f.prototype={equalsContent:function(a){var c=this.contents,a=a.contents;if(CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||
+CKEDITOR.env.ie6Compat))c=c.replace(h,""),a=a.replace(h,"");return c!=a?!1:!0},equalsSelection:function(a){var c=this.bookmarks,a=a.bookmarks;if(c||a){if(!c||!a||c.length!=a.length)return!1;for(var d=0;d<c.length;d++){var b=c[d],e=a[d];if(b.startOffset!=e.startOffset||b.endOffset!=e.endOffset||!CKEDITOR.tools.arrayCompare(b.start,e.start)||!CKEDITOR.tools.arrayCompare(b.end,e.end))return!1}}return!0}};g.prototype={type:function(a,c){var d=!c&&a!=this.lastKeystroke,b=this.editor;if(!this.typing||c&&
+!this.wasCharacter||d){var e=new f(b),g=this.snapshots.length;CKEDITOR.tools.setTimeout(function(){var a=b.getSnapshot();CKEDITOR.env.ie&&(a=a.replace(/\s+data-cke-expando=".*?"/g,""));e.contents!=a&&g==this.snapshots.length&&(this.typing=!0,this.save(!1,e,!1)||this.snapshots.splice(this.index+1,this.snapshots.length-this.index-1),this.hasUndo=!0,this.hasRedo=!1,this.modifiersCount=this.typesCount=1,this.onChange())},0,this)}this.lastKeystroke=a;(this.wasCharacter=c)?(this.modifiersCount=0,this.typesCount++,
+25<this.typesCount?(this.save(!1,null,!1),this.typesCount=1):setTimeout(function(){b.fire("change")},0)):(this.typesCount=0,this.modifiersCount++,25<this.modifiersCount?(this.save(!1,null,!1),this.modifiersCount=1):setTimeout(function(){b.fire("change")},0))},reset:function(){this.lastKeystroke=0;this.snapshots=[];this.index=-1;this.limit=this.editor.config.undoStackSize||20;this.currentImage=null;this.hasRedo=this.hasUndo=!1;this.locked=null;this.resetType()},resetType:function(){this.typing=!1;
+delete this.lastKeystroke;this.modifiersCount=this.typesCount=0},fireChange:function(){this.hasUndo=!!this.getNextImage(!0);this.hasRedo=!!this.getNextImage(!1);this.resetType();this.onChange()},save:function(a,c,d){if(this.locked)return!1;var b=this.snapshots;c||(c=new f(this.editor));if(!1===c.contents)return!1;if(this.currentImage)if(c.equalsContent(this.currentImage)){if(a||c.equalsSelection(this.currentImage))return!1}else this.editor.fire("change");b.splice(this.index+1,b.length-this.index-
+1);b.length==this.limit&&b.shift();this.index=b.push(c)-1;this.currentImage=c;!1!==d&&this.fireChange();return!0},restoreImage:function(a){var c=this.editor,d;a.bookmarks&&(c.focus(),d=c.getSelection());this.locked=1;this.editor.loadSnapshot(a.contents);a.bookmarks?d.selectBookmarks(a.bookmarks):CKEDITOR.env.ie&&(d=this.editor.document.getBody().$.createTextRange(),d.collapse(!0),d.select());this.locked=0;this.index=a.index;this.update();this.fireChange();c.fire("change")},getNextImage:function(a){var c=
+this.snapshots,d=this.currentImage,b;if(d)if(a)for(b=this.index-1;0<=b;b--){if(a=c[b],!d.equalsContent(a))return a.index=b,a}else for(b=this.index+1;b<c.length;b++)if(a=c[b],!d.equalsContent(a))return a.index=b,a;return null},redoable:function(){return this.enabled&&this.hasRedo},undoable:function(){return this.enabled&&this.hasUndo},undo:function(){if(this.undoable()){this.save(!0);var a=this.getNextImage(!0);if(a)return this.restoreImage(a),!0}return!1},redo:function(){if(this.redoable()&&(this.save(!0),
+this.redoable())){var a=this.getNextImage(!1);if(a)return this.restoreImage(a),!0}return!1},update:function(){this.locked||this.snapshots.splice(this.index,1,this.currentImage=new f(this.editor))},lock:function(){if(this.locked)this.locked.level++;else{var a=new f(this.editor);this.locked={update:this.currentImage&&this.currentImage.equalsContent(a)?a:null,level:1}}},unlock:function(){if(this.locked&&!--this.locked.level){var a=this.locked.update;this.locked=null;a&&!a.equalsContent(new f(this.editor))&&
+this.update()}}}})();CKEDITOR.config.wsc_removeGlobalVariable=!0;
+CKEDITOR.plugins.add("wsc",{requires:"dialog",parseApi:function(a){a.config.wsc_onFinish="function"===typeof a.config.wsc_onFinish?a.config.wsc_onFinish:function(){};a.config.wsc_onClose="function"===typeof a.config.wsc_onClose?a.config.wsc_onClose:function(){}},parseConfig:function(a){a.config.wsc_customerId=a.config.wsc_customerId||CKEDITOR.config.wsc_customerId||"1:ua3xw1-2XyGJ3-GWruD3-6OFNT1-oXcuB1-nR6Bp4-hgQHc-EcYng3-sdRXG3-NOfFk";a.config.wsc_customDictionaryIds=a.config.wsc_customDictionaryIds||
+CKEDITOR.config.wsc_customDictionaryIds||"";a.config.wsc_userDictionaryName=a.config.wsc_userDictionaryName||CKEDITOR.config.wsc_userDictionaryName||"";a.config.wsc_customLoaderScript=a.config.wsc_customLoaderScript||CKEDITOR.config.wsc_customLoaderScript;CKEDITOR.config.wsc_cmd=a.config.wsc_cmd||CKEDITOR.config.wsc_cmd||"spell";CKEDITOR.config.wsc_version=CKEDITOR.version+" | %Rev%"},init:function(a){this.parseConfig(a);this.parseApi(a);a.addCommand("checkspell",new CKEDITOR.dialogCommand("checkspell")).modes=
+{wysiwyg:!CKEDITOR.env.opera&&!CKEDITOR.env.air&&document.domain==window.location.hostname};"undefined"==typeof a.plugins.scayt&&a.ui.addButton&&a.ui.addButton("SpellChecker",{label:a.lang.wsc.toolbar,command:"checkspell",toolbar:"spellchecker,10"});CKEDITOR.dialog.add("checkspell",this.path+(CKEDITOR.env.ie&&8>=CKEDITOR.env.version?"dialogs/wsc_ie.js":window.postMessage?"dialogs/wsc.js":"dialogs/wsc_ie.js"))}});CKEDITOR.config.plugins='dialogui,dialog,about,a11yhelp,dialogadvtab,basicstyles,bidi,blockquote,clipboard,button,panelbutton,panel,floatpanel,colorbutton,colordialog,templates,menu,contextmenu,div,resize,toolbar,elementspath,enterkey,entities,popup,filebrowser,find,fakeobjects,flash,floatingspace,listblock,richcombo,font,forms,format,horizontalrule,htmlwriter,iframe,wysiwygarea,image,indent,indentblock,indentlist,smiley,justify,link,list,liststyle,magicline,maximize,newpage,pagebreak,pastetext,pastefromword,preview,print,removeformat,save,selectall,showblocks,showborders,sourcearea,specialchar,menubutton,scayt,stylescombo,tab,table,tabletools,undo,wsc';CKEDITOR.config.skin='moono';(function() {var setIcons = function(icons, strip) {var path = CKEDITOR.getUrl( 'plugins/' + strip );icons = icons.split( ',' );for ( var i = 0; i < icons.length; i++ )CKEDITOR.skin.icons[ icons[ i ] ] = { path: path, offset: -icons[ ++i ], bgsize : icons[ ++i ] };};if (CKEDITOR.env.hidpi) setIcons('about,0,,bold,24,,italic,48,,strike,72,,subscript,96,,superscript,120,,underline,144,,bidiltr,168,,bidirtl,192,,blockquote,216,,copy-rtl,240,,copy,264,,cut-rtl,288,,cut,312,,paste-rtl,336,,paste,360,,bgcolor,384,,textcolor,408,,templates-rtl,432,,templates,456,,creatediv,480,,find-rtl,504,,find,528,,replace,552,,flash,576,,button,600,,checkbox,624,,form,648,,hiddenfield,672,,imagebutton,696,,radio,720,,select-rtl,744,,select,768,,textarea-rtl,792,,textarea,816,,textfield-rtl,840,,textfield,864,,horizontalrule,888,,iframe,912,,image,936,,indent-rtl,960,,indent,984,,outdent-rtl,1008,,outdent,1032,,smiley,1056,,justifyblock,1080,,justifycenter,1104,,justifyleft,1128,,justifyright,1152,,anchor-rtl,1176,,anchor,1200,,link,1224,,unlink,1248,,bulletedlist-rtl,1272,,bulletedlist,1296,,numberedlist-rtl,1320,,numberedlist,1344,,maximize,1368,,newpage-rtl,1392,,newpage,1416,,pagebreak-rtl,1440,,pagebreak,1464,,pastetext-rtl,1488,,pastetext,1512,,pastefromword-rtl,1536,,pastefromword,1560,,preview-rtl,1584,,preview,1608,,print,1632,,removeformat,1656,,save,1680,,selectall,1704,,showblocks-rtl,1728,,showblocks,1752,,source-rtl,1776,,source,1800,,specialchar,1824,,scayt,1848,,table,1872,,redo-rtl,1896,,redo,1920,,undo-rtl,1944,,undo,1968,,spellchecker,1992,','icons_hidpi.png');else setIcons('about,0,auto,bold,24,auto,italic,48,auto,strike,72,auto,subscript,96,auto,superscript,120,auto,underline,144,auto,bidiltr,168,auto,bidirtl,192,auto,blockquote,216,auto,copy-rtl,240,auto,copy,264,auto,cut-rtl,288,auto,cut,312,auto,paste-rtl,336,auto,paste,360,auto,bgcolor,384,auto,textcolor,408,auto,templates-rtl,432,auto,templates,456,auto,creatediv,480,auto,find-rtl,504,auto,find,528,auto,replace,552,auto,flash,576,auto,button,600,auto,checkbox,624,auto,form,648,auto,hiddenfield,672,auto,imagebutton,696,auto,radio,720,auto,select-rtl,744,auto,select,768,auto,textarea-rtl,792,auto,textarea,816,auto,textfield-rtl,840,auto,textfield,864,auto,horizontalrule,888,auto,iframe,912,auto,image,936,auto,indent-rtl,960,auto,indent,984,auto,outdent-rtl,1008,auto,outdent,1032,auto,smiley,1056,auto,justifyblock,1080,auto,justifycenter,1104,auto,justifyleft,1128,auto,justifyright,1152,auto,anchor-rtl,1176,auto,anchor,1200,auto,link,1224,auto,unlink,1248,auto,bulletedlist-rtl,1272,auto,bulletedlist,1296,auto,numberedlist-rtl,1320,auto,numberedlist,1344,auto,maximize,1368,auto,newpage-rtl,1392,auto,newpage,1416,auto,pagebreak-rtl,1440,auto,pagebreak,1464,auto,pastetext-rtl,1488,auto,pastetext,1512,auto,pastefromword-rtl,1536,auto,pastefromword,1560,auto,preview-rtl,1584,auto,preview,1608,auto,print,1632,auto,removeformat,1656,auto,save,1680,auto,selectall,1704,auto,showblocks-rtl,1728,auto,showblocks,1752,auto,source-rtl,1776,auto,source,1800,auto,specialchar,1824,auto,scayt,1848,auto,table,1872,auto,redo-rtl,1896,auto,redo,1920,auto,undo-rtl,1944,auto,undo,1968,auto,spellchecker,1992,auto','icons.png');})();CKEDITOR.lang.languages={"af":1,"sq":1,"ar":1,"eu":1,"bn":1,"bs":1,"bg":1,"ca":1,"zh-cn":1,"zh":1,"hr":1,"cs":1,"da":1,"nl":1,"en":1,"en-au":1,"en-ca":1,"en-gb":1,"eo":1,"et":1,"fo":1,"fi":1,"fr":1,"fr-ca":1,"gl":1,"ka":1,"de":1,"el":1,"gu":1,"he":1,"hi":1,"hu":1,"is":1,"id":1,"it":1,"ja":1,"km":1,"ko":1,"ku":1,"lv":1,"lt":1,"mk":1,"ms":1,"mn":1,"no":1,"nb":1,"fa":1,"pl":1,"pt-br":1,"pt":1,"ro":1,"ru":1,"sr":1,"sr-latn":1,"si":1,"sk":1,"sl":1,"es":1,"sv":1,"th":1,"tr":1,"ug":1,"uk":1,"vi":1,"cy":1};}());
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/config.js b/htmltest/sites/all/libraries/ckeditor-version/config.js
new file mode 100644
index 00000000..a6faf18d
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/config.js
@@ -0,0 +1,10 @@
+/**
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.html or http://ckeditor.com/license
+ */
+
+CKEDITOR.editorConfig = function( config ) {
+	// Define changes to default configuration here. For example:
+	// config.language = 'fr';
+	// config.uiColor = '#AADC6E';
+};
diff --git a/htmltest/sites/all/libraries/ckeditor-version/contents.css b/htmltest/sites/all/libraries/ckeditor-version/contents.css
new file mode 100644
index 00000000..8bbc51ce
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/contents.css
@@ -0,0 +1,103 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+
+body
+{
+	/* Font */
+	font-family: sans-serif, Arial, Verdana, "Trebuchet MS";
+	font-size: 12px;
+
+	/* Text color */
+	color: #333;
+
+	/* Remove the background color to make it transparent */
+	background-color: #fff;
+
+	margin: 20px;
+}
+
+.cke_editable
+{
+	font-size: 13px;
+	line-height: 1.6em;
+}
+
+blockquote
+{
+	font-style: italic;
+	font-family: Georgia, Times, "Times New Roman", serif;
+	padding: 2px 0;
+	border-style: solid;
+	border-color: #ccc;
+	border-width: 0;
+}
+
+.cke_contents_ltr blockquote
+{
+	padding-left: 20px;
+	padding-right: 8px;
+	border-left-width: 5px;
+}
+
+.cke_contents_rtl blockquote
+{
+	padding-left: 8px;
+	padding-right: 20px;
+	border-right-width: 5px;
+}
+
+a
+{
+	color: #0782C1;
+}
+
+ol,ul,dl
+{
+	/* IE7: reset rtl list margin. (#7334) */
+	*margin-right: 0px;
+	/* preserved spaces for list items with text direction other than the list. (#6249,#8049)*/
+	padding: 0 40px;
+}
+
+h1,h2,h3,h4,h5,h6
+{
+	font-weight: normal;
+	line-height: 1.2em;
+}
+
+hr
+{
+	border: 0px;
+	border-top: 1px solid #ccc;
+}
+
+img.right {
+    border: 1px solid #ccc;
+    float: right;
+    margin-left: 15px;
+    padding: 5px;
+}
+
+img.left {
+    border: 1px solid #ccc;
+    float: left;
+    margin-right: 15px;
+    padding: 5px;
+}
+
+img:hover {
+	opacity: .9;
+	filter: alpha(opacity = 90);
+}
+
+pre
+{
+	white-space: pre-wrap; /* CSS 2.1 */
+	word-wrap: break-word; /* IE7 */
+}
+
+.marker {
+    background-color: Yellow;
+}
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/af.js b/htmltest/sites/all/libraries/ckeditor-version/lang/af.js
new file mode 100644
index 00000000..56eba6c6
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/af.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['af']={"editor":"Teksverwerker","common":{"editorHelp":"Druk op ALT 0 vir hulp","browseServer":"Blaai op bediener","url":"URL","protocol":"Protokol","upload":"Oplaai","uploadSubmit":"Stuur na bediener","image":"Afbeelding","flash":"Flash","form":"Vorm","checkbox":"Merkhokkie","radio":"Radioknoppie","textField":"Teksveld","textarea":"Teks-area","hiddenField":"Blinde veld","button":"Knop","select":"Keuseveld","imageButton":"Afbeeldingsknop","notSet":"<geen instelling>","id":"Id","name":"Naam","langDir":"Skryfrigting","langDirLtr":"Links na regs (LTR)","langDirRtl":"Regs na links (RTL)","langCode":"Taalkode","longDescr":"Lang beskrywing URL","cssClass":"CSS klasse","advisoryTitle":"Aanbevole titel","cssStyle":"Styl","ok":"OK","cancel":"Kanselleer","close":"Sluit","preview":"Voorbeeld","resize":"Sleep om te herskaal","generalTab":"Algemeen","advancedTab":"Gevorderd","validateNumberFailed":"Hierdie waarde is nie 'n getal nie.","confirmNewPage":"Alle wysiginge sal verlore gaan. Is u seker dat u 'n nuwe bladsy wil laai?","confirmCancel":"Sommige opsies is gewysig. Is u seker dat u hierdie dialoogvenster wil sluit?","options":"Opsies","target":"Doel","targetNew":"Nuwe venster (_blank)","targetTop":"Boonste venster (_top)","targetSelf":"Selfde venster (_self)","targetParent":"Oorspronklike venster (_parent)","langDirLTR":"Links na Regs (LTR)","langDirRTL":"Regs na Links (RTL)","styles":"Styl","cssClasses":"CSS klasse","width":"Breedte","height":"Hoogte","align":"Oplyn","alignLeft":"Links","alignRight":"Regs","alignCenter":"Sentreer","alignTop":"Bo","alignMiddle":"Middel","alignBottom":"Onder","invalidValue":"Invalid value.","invalidHeight":"Hoogte moet 'n getal wees","invalidWidth":"Breedte moet 'n getal wees.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, nie beskikbaar nie</span>"},"about":{"copy":"Kopiereg &copy; $1. Alle regte voorbehou.","dlgTitle":"Info oor CKEditor","help":"Check $1 for help.","moreInfo":"Vir lisensie-informasie, besoek asb. ons webwerf:","title":"Info oor CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Vet","italic":"Skuins","strike":"Deurstreep","subscript":"Onderskrif","superscript":"Bo-skrif","underline":"Onderstreep"},"bidi":{"ltr":"Skryfrigting van links na regs","rtl":"Skryfrigting van regs na links"},"blockquote":{"toolbar":"Sitaatblok"},"clipboard":{"copy":"Kopiëer","copyError":"U blaaier se sekuriteitsinstelling belet die kopiëringsaksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+C).","cut":"Knip","cutError":"U blaaier se sekuriteitsinstelling belet die outomatiese knip-aksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+X).","paste":"Plak","pasteArea":"Plak-area","pasteMsg":"Plak die teks in die volgende teks-area met die sleutelbordkombinasie (<STRONG>Ctrl/Cmd+V</STRONG>) en druk <STRONG>OK</STRONG>.","securityMsg":"Weens u blaaier se sekuriteitsinstelling is data op die knipbord nie toeganklik nie. U kan dit eers weer in hierdie venster plak.","title":"Byvoeg"},"colorbutton":{"auto":"Outomaties","bgColorTitle":"Agtergrondkleur","colors":{"000":"Swart","800000":"Meroen","8B4513":"Sjokoladebruin","2F4F4F":"Donkerleisteengrys","008080":"Blougroen","000080":"Vlootblou","4B0082":"Indigo","696969":"Donkergrys","B22222":"Rooibaksteen","A52A2A":"Bruin","DAA520":"Donkergeel","006400":"Donkergroen","40E0D0":"Turkoois","0000CD":"Middelblou","800080":"Pers","808080":"Grys","F00":"Rooi","FF8C00":"Donkeroranje","FFD700":"Goud","008000":"Groen","0FF":"Siaan","00F":"Blou","EE82EE":"Viooltjieblou","A9A9A9":"Donkergrys","FFA07A":"Ligsalm","FFA500":"Oranje","FFFF00":"Geel","00FF00":"Lemmetjie","AFEEEE":"Ligturkoois","ADD8E6":"Ligblou","DDA0DD":"Pruim","D3D3D3":"Liggrys","FFF0F5":"Linne","FAEBD7":"Ivoor","FFFFE0":"Liggeel","F0FFF0":"Heuningdou","F0FFFF":"Asuur","F0F8FF":"Ligte hemelsblou","E6E6FA":"Laventel","FFF":"Wit"},"more":"Meer Kleure...","panelTitle":"Kleure","textColorTitle":"Tekskleur"},"colordialog":{"clear":"Herstel","highlight":"Aktief","options":"Kleuropsies","selected":"Geselekteer","title":"Kies kleur"},"templates":{"button":"Sjablone","emptyListMsg":"(Geen sjablone gedefineer nie)","insertOption":"Vervang huidige inhoud","options":"Sjabloon opsies","selectPromptMsg":"Kies die sjabloon om te gebruik in die redigeerder (huidige inhoud gaan verlore):","title":"Inhoud Sjablone"},"contextmenu":{"options":"Konteks Spyskaart-opsies"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Aanbevole Titel","cssClassInputLabel":"CSS klasse","edit":"Wysig Div","inlineStyleInputLabel":"Inlyn Styl","langDirLTRLabel":"Links na regs (LTR)","langDirLabel":"Skryfrigting","langDirRTLLabel":"Regs na links (RTL)","languageCodeInputLabel":" Taalkode","remove":"Verwyder Div","styleSelectLabel":"Styl","title":"Skep Div houer","toolbar":"Skep Div houer"},"toolbar":{"toolbarCollapse":"Verklein werkbalk","toolbarExpand":"Vergroot werkbalk","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elemente-pad","eleTitle":"%1 element"},"find":{"find":"Soek","findOptions":"Find Options","findWhat":"Soek na:","matchCase":"Hoof/kleinletter sensitief","matchCyclic":"Soek deurlopend","matchWord":"Hele woord moet voorkom","notFoundMsg":"Teks nie gevind nie.","replace":"Vervang","replaceAll":"Vervang alles","replaceSuccessMsg":"%1 voorkoms(te) vervang.","replaceWith":"Vervang met:","title":"Soek en vervang"},"fakeobjects":{"anchor":"Anker","flash":"Flash animasie","hiddenfield":"Verborge veld","iframe":"IFrame","unknown":"Onbekende objek"},"flash":{"access":"Skrip toegang","accessAlways":"Altyd","accessNever":"Nooit","accessSameDomain":"Selfde domeinnaam","alignAbsBottom":"Absoluut-onder","alignAbsMiddle":"Absoluut-middel","alignBaseline":"Basislyn","alignTextTop":"Teks bo","bgcolor":"Agtergrondkleur","chkFull":"Laat volledige skerm toe","chkLoop":"Herhaal","chkMenu":"Flash spyskaart aan","chkPlay":"Speel outomaties","flashvars":"Veranderlikes vir Flash","hSpace":"HSpasie","properties":"Flash eienskappe","propertiesTab":"Eienskappe","quality":"Kwaliteit","qualityAutoHigh":"Outomaties hoog","qualityAutoLow":"Outomaties laag","qualityBest":"Beste","qualityHigh":"Hoog","qualityLow":"Laag","qualityMedium":"Gemiddeld","scale":"Skaal","scaleAll":"Wys alles","scaleFit":"Presiese pas","scaleNoBorder":"Geen rand","title":"Flash eienskappe","vSpace":"VSpasie","validateHSpace":"HSpasie moet 'n heelgetal wees.","validateSrc":"Voeg die URL in","validateVSpace":"VSpasie moet 'n heelgetal wees.","windowMode":"Venster modus","windowModeOpaque":"Ondeursigtig","windowModeTransparent":"Deursigtig","windowModeWindow":"Venster"},"font":{"fontSize":{"label":"Grootte","voiceLabel":"Fontgrootte","panelTitle":"Fontgrootte"},"label":"Font","panelTitle":"Fontnaam","voiceLabel":"Font"},"forms":{"button":{"title":"Knop eienskappe","text":"Teks (Waarde)","type":"Soort","typeBtn":"Knop","typeSbm":"Stuur","typeRst":"Maak leeg"},"checkboxAndRadio":{"checkboxTitle":"Merkhokkie eienskappe","radioTitle":"Radioknoppie eienskappe","value":"Waarde","selected":"Geselekteer"},"form":{"title":"Vorm eienskappe","menu":"Vorm eienskappe","action":"Aksie","method":"Metode","encoding":"Kodering"},"hidden":{"title":"Verborge veld eienskappe","name":"Naam","value":"Waarde"},"select":{"title":"Keuseveld eienskappe","selectInfo":"Info","opAvail":"Beskikbare opsies","value":"Waarde","size":"Grootte","lines":"Lyne","chkMulti":"Laat meer as een keuse toe","opText":"Teks","opValue":"Waarde","btnAdd":"Byvoeg","btnModify":"Wysig","btnUp":"Op","btnDown":"Af","btnSetValue":"Stel as geselekteerde waarde","btnDelete":"Verwyder"},"textarea":{"title":"Teks-area eienskappe","cols":"Kolomme","rows":"Rye"},"textfield":{"title":"Teksveld eienskappe","name":"Naam","value":"Waarde","charWidth":"Breedte (karakters)","maxChars":"Maksimum karakters","type":"Soort","typeText":"Teks","typePass":"Wagwoord","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"Opmaak","panelTitle":"Opmaak","tag_address":"Adres","tag_div":"Normaal (DIV)","tag_h1":"Opskrif 1","tag_h2":"Opskrif 2","tag_h3":"Opskrif 3","tag_h4":"Opskrif 4","tag_h5":"Opskrif 5","tag_h6":"Opskrif 6","tag_p":"Normaal","tag_pre":"Opgemaak"},"horizontalrule":{"toolbar":"Horisontale lyn invoeg"},"iframe":{"border":"Wys rand van raam","noUrl":"Gee die iframe URL","scrolling":"Skuifbalke aan","title":"IFrame Eienskappe","toolbar":"IFrame"},"image":{"alertUrl":"Gee URL van afbeelding.","alt":"Alternatiewe teks","border":"Rand","btnUpload":"Stuur na bediener","button2Img":"Wil u die geselekteerde afbeeldingsknop vervang met 'n eenvoudige afbeelding?","hSpace":"HSpasie","img2Button":"Wil u die geselekteerde afbeelding vervang met 'n afbeeldingsknop?","infoTab":"Afbeelding informasie","linkTab":"Skakel","lockRatio":"Vaste proporsie","menu":"Afbeelding eienskappe","resetSize":"Herstel grootte","title":"Afbeelding eienskappe","titleButton":"Afbeeldingsknop eienskappe","upload":"Oplaai","urlMissing":"Die URL na die afbeelding ontbreek.","vSpace":"VSpasie","validateBorder":"Rand moet 'n heelgetal wees.","validateHSpace":"HSpasie moet 'n heelgetal wees.","validateVSpace":"VSpasie moet 'n heelgetal wees."},"indent":{"indent":"Vergroot inspring","outdent":"Verklein inspring"},"smiley":{"options":"Lagbekkie opsies","title":"Voeg lagbekkie by","toolbar":"Lagbekkie"},"justify":{"block":"Uitvul","center":"Sentreer","left":"Links oplyn","right":"Regs oplyn"},"link":{"acccessKey":"Toegangsleutel","advanced":"Gevorderd","advisoryContentType":"Aanbevole inhoudstipe","advisoryTitle":"Aanbevole titel","anchor":{"toolbar":"Anker byvoeg/verander","menu":"Anker-eienskappe","title":"Anker-eienskappe","name":"Ankernaam","errorName":"Voltooi die ankernaam asseblief","remove":"Remove Anchor"},"anchorId":"Op element Id","anchorName":"Op ankernaam","charset":"Karakterstel van geskakelde bron","cssClasses":"CSS klasse","emailAddress":"E-posadres","emailBody":"Berig-inhoud","emailSubject":"Berig-onderwerp","id":"Id","info":"Skakel informasie","langCode":"Taalkode","langDir":"Skryfrigting","langDirLTR":"Links na regs (LTR)","langDirRTL":"Regs na links (RTL)","menu":"Wysig skakel","name":"Naam","noAnchors":"(Geen ankers beskikbaar in dokument)","noEmail":"Gee die e-posadres","noUrl":"Gee die skakel se URL","other":"<ander>","popupDependent":"Afhanklik (Netscape)","popupFeatures":"Eienskappe van opspringvenster","popupFullScreen":"Volskerm (IE)","popupLeft":"Posisie links","popupLocationBar":"Adresbalk","popupMenuBar":"Spyskaartbalk","popupResizable":"Herskaalbaar","popupScrollBars":"Skuifbalke","popupStatusBar":"Statusbalk","popupToolbar":"Werkbalk","popupTop":"Posisie bo","rel":"Relationship","selectAnchor":"Kies 'n anker","styles":"Styl","tabIndex":"Tab indeks","target":"Doel","targetFrame":"<raam>","targetFrameName":"Naam van doelraam","targetPopup":"<opspringvenster>","targetPopupName":"Naam van opspringvenster","title":"Skakel","toAnchor":"Anker in bladsy","toEmail":"E-pos","toUrl":"URL","toolbar":"Skakel invoeg/wysig","type":"Skakelsoort","unlink":"Verwyder skakel","upload":"Oplaai"},"list":{"bulletedlist":"Ongenommerde lys","numberedlist":"Genommerde lys"},"liststyle":{"armenian":"Armeense nommering","bulletedTitle":"Eienskappe van ongenommerde lys","circle":"Sirkel","decimal":"Desimale syfers (1, 2, 3, ens.)","decimalLeadingZero":"Desimale syfers met voorloopnul (01, 02, 03, ens.)","disc":"Skyf","georgian":"Georgiese nommering (an, ban, gan, ens.)","lowerAlpha":"Kleinletters (a, b, c, d, e, ens.)","lowerGreek":"Griekse kleinletters (alpha, beta, gamma, ens.)","lowerRoman":"Romeinse kleinletters (i, ii, iii, iv, v, ens.)","none":"Geen","notset":"<nie ingestel nie>","numberedTitle":"Eienskappe van genommerde lys","square":"Vierkant","start":"Begin","type":"Tipe","upperAlpha":"Hoofletters (A, B, C, D, E, ens.)","upperRoman":"Romeinse hoofletters (I, II, III, IV, V, ens.)","validateStartNumber":"Beginnommer van lys moet 'n heelgetal wees."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maksimaliseer","minimize":"Minimaliseer"},"newpage":{"toolbar":"Nuwe bladsy"},"pagebreak":{"alt":"Bladsy-einde","toolbar":"Bladsy-einde invoeg"},"pastetext":{"button":"Plak as eenvoudige teks","title":"Plak as eenvoudige teks"},"pastefromword":{"confirmCleanup":"Die teks wat u wil plak lyk asof dit uit Word gekopiëer is. Wil u dit eers skoonmaak voordat dit geplak word?","error":"Die geplakte teks kon nie skoongemaak word nie, weens 'n interne fout","title":"Plak vanuit Word","toolbar":"Plak vanuit Word"},"preview":{"preview":"Voorbeeld"},"print":{"toolbar":"Druk"},"removeformat":{"toolbar":"Verwyder opmaak"},"save":{"toolbar":"Bewaar"},"selectall":{"toolbar":"Selekteer alles"},"showblocks":{"toolbar":"Toon blokke"},"sourcearea":{"toolbar":"Bron"},"specialchar":{"options":"Spesiale karakter-opsies","title":"Kies spesiale karakter","toolbar":"Voeg spesiaale karakter in"},"scayt":{"about":"SCAYT info","aboutTab":"Info","addWord":"Voeg woord by","allCaps":"Ignoreer woorde in hoofletters","dic_create":"Skep","dic_delete":"Verwijder","dic_field_name":"Naam van woordeboek","dic_info":"Aanvanklik word die gebruikerswoordeboek in 'n koekie gestoor. Koekies is egter beperk in grootte. Wanneer die gebruikerswoordeboek te groot vir 'n koekie geword het, kan dit op ons bediener gestoor word. Om u persoonlike woordeboek op ons bediener te stoor, gee asb. 'n naam vir u woordeboek. Indien u alreeds 'n gestoorde woordeboek het, tik die naam en kliek op die Herstel knop.","dic_rename":"Hernoem","dic_restore":"Herstel","dictionariesTab":"Woordeboeke","disable":"SCAYT af","emptyDic":"Woordeboeknaam mag nie leeg wees nie.","enable":"SCAYT aan","ignore":"Ignoreer","ignoreAll":"Ignoreer alles","ignoreDomainNames":"Ignoreer domeinname","langs":"Tale","languagesTab":"Tale","mixedCase":"Ignoreer woorde met hoof- en kleinletters","mixedWithDigits":"Ignoreer woorde met syfers","moreSuggestions":"Meer voorstelle","opera_title":"Nie ondersteun deur Opera nie","options":"Opsies","optionsTab":"Opsies","title":"Speltoets terwyl u tik","toggle":"SCAYT wissel aan/af","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styl","panelTitle":"Opmaak style","panelTitle1":"Blok style","panelTitle2":"Inlyn style","panelTitle3":"Objek style"},"table":{"border":"Randbreedte","caption":"Naam","cell":{"menu":"Sel","insertBefore":"Voeg sel in voor","insertAfter":"Voeg sel in na","deleteCell":"Verwyder sel","merge":"Voeg selle saam","mergeRight":"Voeg saam na regs","mergeDown":"Voeg saam ondertoe","splitHorizontal":"Splits sel horisontaal","splitVertical":"Splits sel vertikaal","title":"Sel eienskappe","cellType":"Sel tipe","rowSpan":"Omspan rye","colSpan":"Omspan kolomme","wordWrap":"Woord terugloop","hAlign":"Horisontale oplyning","vAlign":"Vertikale oplyning","alignBaseline":"Basislyn","bgColor":"Agtergrondkleur","borderColor":"Randkleur","data":"Inhoud","header":"Opskrif","yes":"Ja","no":"Nee","invalidWidth":"Selbreedte moet 'n getal wees.","invalidHeight":"Selhoogte moet 'n getal wees.","invalidRowSpan":"Omspan rye moet 'n heelgetal wees.","invalidColSpan":"Omspan kolomme moet 'n heelgetal wees.","chooseColor":"Kies"},"cellPad":"Sel-spasie","cellSpace":"Sel-afstand","column":{"menu":"Kolom","insertBefore":"Voeg kolom in voor","insertAfter":"Voeg kolom in na","deleteColumn":"Verwyder kolom"},"columns":"Kolomme","deleteTable":"Verwyder tabel","headers":"Opskrifte","headersBoth":"Beide    ","headersColumn":"Eerste kolom","headersNone":"Geen","headersRow":"Eerste ry","invalidBorder":"Randbreedte moet 'n getal wees.","invalidCellPadding":"Sel-spasie moet 'n getal wees.","invalidCellSpacing":"Sel-afstand moet 'n getal wees.","invalidCols":"Aantal kolomme moet 'n getal groter as 0 wees.","invalidHeight":"Tabelhoogte moet 'n getal wees.","invalidRows":"Aantal rye moet 'n getal groter as 0 wees.","invalidWidth":"Tabelbreedte moet 'n getal wees.","menu":"Tabel eienskappe","row":{"menu":"Ry","insertBefore":"Voeg ry in voor","insertAfter":"Voeg ry in na","deleteRow":"Verwyder ry"},"rows":"Rye","summary":"Opsomming","title":"Tabel eienskappe","toolbar":"Tabel","widthPc":"persent","widthPx":"piksels","widthUnit":"breedte-eenheid"},"undo":{"redo":"Oordoen","undo":"Ontdoen"},"wsc":{"btnIgnore":"Ignoreer","btnIgnoreAll":"Ignoreer alles","btnReplace":"Vervang","btnReplaceAll":"vervang alles","btnUndo":"Ontdoen","changeTo":"Verander na","errorLoading":"Fout by inlaai van diens: %s.","ieSpellDownload":"Speltoetser is nie geïnstalleer nie. Wil u dit nou aflaai?","manyChanges":"Klaar met speltoets: %1 woorde verander","noChanges":"Klaar met speltoets: Geen woorde verander nie","noMispell":"Klaar met speltoets: Geen foute nie","noSuggestions":"- Geen voorstel -","notAvailable":"Jammer, hierdie diens is nie nou beskikbaar nie.","notInDic":"Nie in woordeboek nie","oneChange":"Klaar met speltoets: Een woord verander","progress":"Spelling word getoets...","title":"Speltoetser","toolbar":"Speltoets"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/ar.js b/htmltest/sites/all/libraries/ckeditor-version/lang/ar.js
new file mode 100644
index 00000000..c686e4b9
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/ar.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ar']={"editor":"محرر النص الغني","common":{"editorHelp":"إضغط على ALT + 0 للحصول على المساعدة.","browseServer":"تصفح","url":"الرابط","protocol":"البروتوكول","upload":"رفع","uploadSubmit":"أرسل","image":"صورة","flash":"فلاش","form":"نموذج","checkbox":"خانة إختيار","radio":"زر اختيار","textField":"مربع نص","textarea":"مساحة نصية","hiddenField":"إدراج حقل خفي","button":"زر ضغط","select":"اختار","imageButton":"زر صورة","notSet":"<بدون تحديد>","id":"الرقم","name":"إسم","langDir":"إتجاه النص","langDirLtr":"اليسار لليمين (LTR)","langDirRtl":"اليمين لليسار (RTL)","langCode":"رمز اللغة","longDescr":"الوصف التفصيلى","cssClass":"فئات التنسيق","advisoryTitle":"عنوان التقرير","cssStyle":"نمط","ok":"موافق","cancel":"إلغاء الأمر","close":"أغلق","preview":"استعراض","resize":"تغيير الحجم","generalTab":"عام","advancedTab":"متقدم","validateNumberFailed":"لايوجد نتيجة","confirmNewPage":"ستفقد أي متغييرات اذا لم تقم بحفظها اولا. هل أنت متأكد أنك تريد صفحة جديدة؟","confirmCancel":"بعض الخيارات قد تغيرت. هل أنت متأكد من إغلاق مربع النص؟","options":"خيارات","target":"هدف الرابط","targetNew":"نافذة جديدة","targetTop":"النافذة الأعلى","targetSelf":"داخل النافذة","targetParent":"النافذة الأم","langDirLTR":"اليسار لليمين (LTR)","langDirRTL":"اليمين لليسار (RTL)","styles":"نمط","cssClasses":"فئات التنسيق","width":"العرض","height":"الإرتفاع","align":"محاذاة","alignLeft":"يسار","alignRight":"يمين","alignCenter":"وسط","alignTop":"أعلى","alignMiddle":"وسط","alignBottom":"أسفل","invalidValue":"قيمة غير مفبولة.","invalidHeight":"الارتفاع يجب أن يكون عدداً.","invalidWidth":"العرض يجب أن يكون عدداً.","invalidCssLength":"قيمة الخانة المخصصة لـ \"%1\" يجب أن تكون رقما موجبا، باستخدام أو من غير استخدام وحدة CSS قياس مقبولة (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"قيمة الخانة المخصصة لـ \"%1\" يجب أن تكون رقما موجبا، باستخدام أو من غير استخدام وحدة HTML قياس مقبولة (px or %).","invalidInlineStyle":"قيمة الخانة المخصصة لـ  Inline Style يجب أن تختوي على مجموع واحد أو أكثر بالشكل التالي: \"name : value\", مفصولة بفاصلة منقزطة.","cssLengthTooltip":"أدخل رقما للقيمة بالبكسل أو رقما بوحدة CSS مقبولة (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, غير متاح</span>"},"about":{"copy":"حقوق النشر &copy; $1. جميع الحقوق محفوظة.","dlgTitle":"عن CKEditor","help":"راجع $1 من أجل المساعدة","moreInfo":"للحصول على معلومات الترخيص ، يرجى زيارة موقعنا:","title":"عن CKEditor","userGuide":"دليل مستخدم CKEditor."},"basicstyles":{"bold":"عريض","italic":"مائل","strike":"يتوسطه خط","subscript":"منخفض","superscript":"مرتفع","underline":"تسطير"},"bidi":{"ltr":"إتجاه النص من اليسار إلى اليمين","rtl":"إتجاه النص من اليمين إلى اليسار"},"blockquote":{"toolbar":"اقتباس"},"clipboard":{"copy":"نسخ","copyError":"الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع عمليات النسخ التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+C).","cut":"قص","cutError":"الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع القص التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+X).","paste":"لصق","pasteArea":"منطقة اللصق","pasteMsg":"الصق داخل الصندوق بإستخدام زرائر (<STRONG>Ctrl/Cmd+V</STRONG>) في لوحة المفاتيح، ثم اضغط زر  <STRONG>موافق</STRONG>.","securityMsg":"نظراً لإعدادات الأمان الخاصة بمتصفحك، لن يتمكن هذا المحرر من الوصول لمحتوى حافظتك، لذلك يجب عليك لصق المحتوى مرة أخرى في هذه النافذة.","title":"لصق"},"colorbutton":{"auto":"تلقائي","bgColorTitle":"لون الخلفية","colors":{"000":"أسود","800000":"كستنائي","8B4513":"بني فاتح","2F4F4F":"رمادي أردوازي غامق","008080":"أزرق مخضر","000080":"أزرق داكن","4B0082":"كحلي","696969":"رمادي داكن","B22222":"طوبي","A52A2A":"بني","DAA520":"ذهبي داكن","006400":"أخضر داكن","40E0D0":"فيروزي","0000CD":"أزرق متوسط","800080":"بنفسجي غامق","808080":"رمادي","F00":"أحمر","FF8C00":"برتقالي داكن","FFD700":"ذهبي","008000":"أخضر","0FF":"تركواز","00F":"أزرق","EE82EE":"بنفسجي","A9A9A9":"رمادي شاحب","FFA07A":"برتقالي وردي","FFA500":"برتقالي","FFFF00":"أصفر","00FF00":"ليموني","AFEEEE":"فيروزي شاحب","ADD8E6":"أزرق فاتح","DDA0DD":"بنفسجي فاتح","D3D3D3":"رمادي فاتح","FFF0F5":"وردي فاتح","FAEBD7":"أبيض عتيق","FFFFE0":"أصفر فاتح","F0FFF0":"أبيض مائل للأخضر","F0FFFF":"سماوي","F0F8FF":"لبني","E6E6FA":"أرجواني","FFF":"أبيض"},"more":"ألوان إضافية...","panelTitle":"Colors","textColorTitle":"لون النص"},"colordialog":{"clear":"مسح","highlight":"تحديد","options":"اختيارات الألوان","selected":"اللون المختار","title":"اختر اللون"},"templates":{"button":"القوالب","emptyListMsg":"(لم يتم تعريف أي قالب)","insertOption":"استبدال المحتوى","options":"خصائص القوالب","selectPromptMsg":"اختر القالب الذي تود وضعه في المحرر","title":"قوالب المحتوى"},"contextmenu":{"options":"خصائص قائمة السياق"},"div":{"IdInputLabel":"هوية","advisoryTitleInputLabel":"عنوان التقرير","cssClassInputLabel":"فئات التنسيق","edit":"تحرير Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"اليسار لليمين (LTR)","langDirLabel":"إتجاه النص","langDirRTLLabel":"اليمين لليسار (RTL)","languageCodeInputLabel":"رمز اللغة","remove":"إزالة Div","styleSelectLabel":"نمط","title":"إحداث Div Container","toolbar":"إحداث Div Container"},"toolbar":{"toolbarCollapse":"تقليص شريط الأدوت","toolbarExpand":"تمديد شريط الأدوات","toolbarGroups":{"document":"مستند","clipboard":"الحافظة/الرجوع","editing":"تحرير","forms":"نماذج","basicstyles":"نمط بسيط","paragraph":"فقرة","links":"روابط","insert":"إدراج","styles":"أنماط","colors":"ألوان","tools":"أدوات"},"toolbars":"أشرطة أدوات المحرر"},"elementspath":{"eleLabel":"مسار العنصر","eleTitle":"عنصر 1%"},"find":{"find":"بحث","findOptions":"Find Options","findWhat":"البحث بـ:","matchCase":"مطابقة حالة الأحرف","matchCyclic":"مطابقة دورية","matchWord":"مطابقة بالكامل","notFoundMsg":"لم يتم العثور على النص المحدد.","replace":"إستبدال","replaceAll":"إستبدال الكل","replaceSuccessMsg":"تم استبدال 1% من الحالات ","replaceWith":"إستبدال بـ:","title":"بحث واستبدال"},"fakeobjects":{"anchor":"إرساء","flash":"رسم متحرك بالفلاش","hiddenfield":"إدراج حقل خفي","iframe":"iframe","unknown":"عنصر غير معروف"},"flash":{"access":"دخول النص البرمجي","accessAlways":"دائماً","accessNever":"مطلقاً","accessSameDomain":"نفس النطاق","alignAbsBottom":"أسفل النص","alignAbsMiddle":"وسط السطر","alignBaseline":"على السطر","alignTextTop":"أعلى النص","bgcolor":"لون الخلفية","chkFull":"ملء الشاشة","chkLoop":"تكرار","chkMenu":"تمكين قائمة فيلم الفلاش","chkPlay":"تشغيل تلقائي","flashvars":"متغيرات الفلاش","hSpace":"تباعد أفقي","properties":"خصائص الفلاش","propertiesTab":"الخصائص","quality":"جودة","qualityAutoHigh":"عالية تلقائياً","qualityAutoLow":"منخفضة تلقائياً","qualityBest":"أفضل","qualityHigh":"عالية","qualityLow":"منخفضة","qualityMedium":"متوسطة","scale":"الحجم","scaleAll":"إظهار الكل","scaleFit":"ضبط تام","scaleNoBorder":"بلا حدود","title":"خصائص فيلم الفلاش","vSpace":"تباعد عمودي","validateHSpace":"HSpace يجب أن يكون عدداً.","validateSrc":"فضلاً أدخل عنوان الموقع الذي يشير إليه الرابط","validateVSpace":"VSpace يجب أن يكون عدداً.","windowMode":"وضع النافذة","windowModeOpaque":"غير شفاف","windowModeTransparent":"شفاف","windowModeWindow":"نافذة"},"font":{"fontSize":{"label":"حجم الخط","voiceLabel":"حجم الخط","panelTitle":"حجم الخط"},"label":"خط","panelTitle":"حجم الخط","voiceLabel":"حجم الخط"},"forms":{"button":{"title":"خصائص زر الضغط","text":"القيمة/التسمية","type":"نوع الزر","typeBtn":"زر","typeSbm":"إرسال","typeRst":"إعادة تعيين"},"checkboxAndRadio":{"checkboxTitle":"خصائص خانة الإختيار","radioTitle":"خصائص زر الخيار","value":"القيمة","selected":"محدد"},"form":{"title":"خصائص النموذج","menu":"خصائص النموذج","action":"اسم الملف","method":"الأسلوب","encoding":"تشفير"},"hidden":{"title":"خصائص الحقل المخفي","name":"الاسم","value":"القيمة"},"select":{"title":"خصائص اختيار الحقل","selectInfo":"اختار معلومات","opAvail":"الخيارات المتاحة","value":"القيمة","size":"الحجم","lines":"الأسطر","chkMulti":"السماح بتحديدات متعددة","opText":"النص","opValue":"القيمة","btnAdd":"إضافة","btnModify":"تعديل","btnUp":"أعلى","btnDown":"أسفل","btnSetValue":"إجعلها محددة","btnDelete":"إزالة"},"textarea":{"title":"خصائص مساحة النص","cols":"الأعمدة","rows":"الصفوف"},"textfield":{"title":"خصائص مربع النص","name":"الاسم","value":"القيمة","charWidth":"عرض السمات","maxChars":"اقصى عدد للسمات","type":"نوع المحتوى","typeText":"نص","typePass":"كلمة مرور","typeEmail":"بريد إلكتروني","typeSearch":"بحث","typeTel":"رقم الهاتف","typeUrl":"الرابط"}},"format":{"label":"تنسيق","panelTitle":"تنسيق الفقرة","tag_address":"عنوان","tag_div":"عادي (DIV)","tag_h1":"العنوان 1","tag_h2":"العنوان  2","tag_h3":"العنوان  3","tag_h4":"العنوان  4","tag_h5":"العنوان  5","tag_h6":"العنوان  6","tag_p":"عادي","tag_pre":"منسّق"},"horizontalrule":{"toolbar":"خط فاصل"},"iframe":{"border":"إظهار حدود الإطار","noUrl":"فضلا أكتب رابط الـ iframe","scrolling":"تفعيل أشرطة الإنتقال","title":"خصائص iframe","toolbar":"iframe"},"image":{"alertUrl":"فضلاً أكتب الموقع الذي توجد عليه هذه الصورة.","alt":"عنوان الصورة","border":"سمك الحدود","btnUpload":"أرسلها للخادم","button2Img":"هل تريد تحويل زر الصورة المختار إلى صورة بسيطة؟","hSpace":"تباعد أفقي","img2Button":"هل تريد تحويل الصورة المختارة إلى زر صورة؟","infoTab":"معلومات الصورة","linkTab":"الرابط","lockRatio":"تناسق الحجم","menu":"خصائص الصورة","resetSize":"إستعادة الحجم الأصلي","title":"خصائص الصورة","titleButton":"خصائص زر الصورة","upload":"رفع","urlMissing":"عنوان مصدر الصورة مفقود","vSpace":"تباعد عمودي","validateBorder":"الإطار يجب أن يكون عددا","validateHSpace":"HSpace يجب أن يكون عدداً.","validateVSpace":"VSpace يجب أن يكون عدداً."},"indent":{"indent":"زيادة المسافة البادئة","outdent":"إنقاص المسافة البادئة"},"smiley":{"options":"خصائص الإبتسامات","title":"إدراج ابتسامات","toolbar":"ابتسامات"},"justify":{"block":"ضبط","center":"توسيط","left":"محاذاة إلى اليسار","right":"محاذاة إلى اليمين"},"link":{"acccessKey":"مفاتيح الإختصار","advanced":"متقدم","advisoryContentType":"نوع التقرير","advisoryTitle":"عنوان التقرير","anchor":{"toolbar":"إشارة مرجعية","menu":"تحرير الإشارة المرجعية","title":"خصائص الإشارة المرجعية","name":"اسم الإشارة المرجعية","errorName":"الرجاء كتابة اسم الإشارة المرجعية","remove":"إزالة الإشارة المرجعية"},"anchorId":"حسب رقم العنصر","anchorName":"حسب إسم الإشارة المرجعية","charset":"ترميز المادة المطلوبة","cssClasses":"فئات التنسيق","emailAddress":"البريد الإلكتروني","emailBody":"محتوى الرسالة","emailSubject":"موضوع الرسالة","id":"هوية","info":"معلومات الرابط","langCode":"رمز اللغة","langDir":"إتجاه نص اللغة","langDirLTR":"اليسار لليمين (LTR)","langDirRTL":"اليمين لليسار (RTL)","menu":"تحرير الرابط","name":"إسم","noAnchors":"(لا توجد علامات مرجعية في هذا المستند)","noEmail":"الرجاء كتابة الريد الإلكتروني","noUrl":"الرجاء كتابة رابط الموقع","other":"<أخرى>","popupDependent":"تابع (Netscape)","popupFeatures":"خصائص النافذة المنبثقة","popupFullScreen":"ملئ الشاشة (IE)","popupLeft":"التمركز لليسار","popupLocationBar":"شريط العنوان","popupMenuBar":"القوائم الرئيسية","popupResizable":"قابلة التشكيل","popupScrollBars":"أشرطة التمرير","popupStatusBar":"شريط الحالة","popupToolbar":"شريط الأدوات","popupTop":"التمركز للأعلى","rel":"العلاقة","selectAnchor":"اختر علامة مرجعية","styles":"نمط","tabIndex":"الترتيب","target":"هدف الرابط","targetFrame":"<إطار>","targetFrameName":"اسم الإطار المستهدف","targetPopup":"<نافذة منبثقة>","targetPopupName":"اسم النافذة المنبثقة","title":"رابط","toAnchor":"مكان في هذا المستند","toEmail":"بريد إلكتروني","toUrl":"الرابط","toolbar":"رابط","type":"نوع الربط","unlink":"إزالة رابط","upload":"رفع"},"list":{"bulletedlist":"ادخال/حذف تعداد نقطي","numberedlist":"ادخال/حذف تعداد رقمي"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"إدراج فقرة هنا"},"maximize":{"maximize":"تكبير","minimize":"تصغير"},"newpage":{"toolbar":"صفحة جديدة"},"pagebreak":{"alt":"فاصل الصفحة","toolbar":"إدخال صفحة جديدة"},"pastetext":{"button":"لصق كنص بسيط","title":"لصق كنص بسيط"},"pastefromword":{"confirmCleanup":"يبدو أن النص المراد لصقه منسوخ من برنامج وورد. هل تود تنظيفه قبل الشروع في عملية اللصق؟","error":"لم يتم مسح المعلومات الملصقة لخلل داخلي","title":"لصق من وورد","toolbar":"لصق من وورد"},"preview":{"preview":"معاينة الصفحة"},"print":{"toolbar":"طباعة"},"removeformat":{"toolbar":"إزالة التنسيقات"},"save":{"toolbar":"حفظ"},"selectall":{"toolbar":"تحديد الكل"},"showblocks":{"toolbar":"مخطط تفصيلي"},"sourcearea":{"toolbar":"المصدر"},"specialchar":{"options":"خيارات الأحرف الخاصة","title":"اختر حرف خاص","toolbar":"إدراج  حرف خاص"},"scayt":{"about":"عن SCAYT","aboutTab":"عن","addWord":"إضافة كلمة","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"قواميس","disable":"تعطيل SCAYT","emptyDic":"اسم القاموس يجب ألا يكون فارغاً.","enable":"تفعيل SCAYT","ignore":"تجاهل","ignoreAll":"تجاهل الكل","ignoreDomainNames":"Ignore Domain Names","langs":"لغات","languagesTab":"لغات","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"المزيد من المقترحات","opera_title":"Not supported by Opera","options":"خيارات","optionsTab":"خيارات","title":"تدقيق إملائي أثناء الكتابة","toggle":"تثبيت SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"أنماط","panelTitle":"أنماط التنسيق","panelTitle1":"أنماط الفقرة","panelTitle2":"أنماط مضمنة","panelTitle3":"أنماط الكائن"},"table":{"border":"الحدود","caption":"الوصف","cell":{"menu":"خلية","insertBefore":"إدراج خلية قبل","insertAfter":"إدراج خلية بعد","deleteCell":"حذف خلية","merge":"دمج خلايا","mergeRight":"دمج لليمين","mergeDown":"دمج للأسفل","splitHorizontal":"تقسيم الخلية أفقياً","splitVertical":"تقسيم الخلية عمودياً","title":"خصائص الخلية","cellType":"نوع الخلية","rowSpan":"امتداد الصفوف","colSpan":"امتداد الأعمدة","wordWrap":"التفاف النص","hAlign":"محاذاة أفقية","vAlign":"محاذاة رأسية","alignBaseline":"خط القاعدة","bgColor":"لون الخلفية","borderColor":"لون الحدود","data":"بيانات","header":"عنوان","yes":"نعم","no":"لا","invalidWidth":"عرض الخلية يجب أن يكون عدداً.","invalidHeight":"ارتفاع الخلية يجب أن يكون عدداً.","invalidRowSpan":"امتداد الصفوف يجب أن يكون عدداً صحيحاً.","invalidColSpan":"امتداد الأعمدة يجب أن يكون عدداً صحيحاً.","chooseColor":"اختر"},"cellPad":"المسافة البادئة","cellSpace":"تباعد الخلايا","column":{"menu":"عمود","insertBefore":"إدراج عمود قبل","insertAfter":"إدراج عمود بعد","deleteColumn":"حذف أعمدة"},"columns":"أعمدة","deleteTable":"حذف الجدول","headers":"العناوين","headersBoth":"كلاهما","headersColumn":"العمود الأول","headersNone":"بدون","headersRow":"الصف الأول","invalidBorder":"حجم الحد يجب أن يكون عدداً.","invalidCellPadding":"المسافة البادئة يجب أن تكون عدداً","invalidCellSpacing":"المسافة بين الخلايا يجب أن تكون عدداً.","invalidCols":"عدد الأعمدة يجب أن يكون عدداً أكبر من صفر.","invalidHeight":"ارتفاع الجدول يجب أن يكون عدداً.","invalidRows":"عدد الصفوف يجب أن يكون عدداً أكبر من صفر.","invalidWidth":"عرض الجدول يجب أن يكون عدداً.","menu":"خصائص الجدول","row":{"menu":"صف","insertBefore":"إدراج صف قبل","insertAfter":"إدراج صف بعد","deleteRow":"حذف صفوف"},"rows":"صفوف","summary":"الخلاصة","title":"خصائص الجدول","toolbar":"جدول","widthPc":"بالمئة","widthPx":"بكسل","widthUnit":"وحدة العرض"},"undo":{"redo":"إعادة","undo":"تراجع"},"wsc":{"btnIgnore":"تجاهل","btnIgnoreAll":"تجاهل الكل","btnReplace":"تغيير","btnReplaceAll":"تغيير الكل","btnUndo":"تراجع","changeTo":"التغيير إلى","errorLoading":"خطأ في تحميل تطبيق خدمة الاستضافة: %s.","ieSpellDownload":"المدقق الإملائي (الإنجليزي) غير مثبّت. هل تود تحميله الآن؟","manyChanges":"تم إكمال التدقيق الإملائي: تم تغيير %1 من كلمات","noChanges":"تم التدقيق الإملائي: لم يتم تغيير أي كلمة","noMispell":"تم التدقيق الإملائي: لم يتم العثور على أي أخطاء إملائية","noSuggestions":"- لا توجد إقتراحات -","notAvailable":"عفواً، ولكن هذه الخدمة غير متاحة الان","notInDic":"ليست في القاموس","oneChange":"تم التدقيق الإملائي: تم تغيير كلمة واحدة فقط","progress":"جاري التدقيق الاملائى","title":"التدقيق الإملائي","toolbar":"تدقيق إملائي"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/bg.js b/htmltest/sites/all/libraries/ckeditor-version/lang/bg.js
new file mode 100644
index 00000000..9b405233
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/bg.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['bg']={"editor":"Текстов редактор за форматиран текст","common":{"editorHelp":"натиснете ALT 0 за помощ","browseServer":"Избор от сървъра","url":"URL","protocol":"Протокол","upload":"Качване","uploadSubmit":"Изпращане към сървъра","image":"Снимка","flash":"Флаш","form":"Форма","checkbox":"Поле за избор","radio":"Радио бутон","textField":"Текстово поле","textarea":"Текстова зона","hiddenField":"Скрито поле","button":"Бутон","select":"Поле за избор","imageButton":"Бутон за снимка","notSet":"<не е избрано>","id":"ID","name":"Име","langDir":"Посока на езика","langDirLtr":"Ляво на дясно (ЛнД)","langDirRtl":"Дясно на ляво (ДнЛ)","langCode":"Код на езика","longDescr":"Уеб адрес за дълго описание","cssClass":"Класове за CSS","advisoryTitle":"Препоръчително заглавие","cssStyle":"Стил","ok":"ОК","cancel":"Отказ","close":"Затвори","preview":"Преглед","resize":"Влачете за да оразмерите","generalTab":"Общи","advancedTab":"Разширено","validateNumberFailed":"Тази стойност не е число","confirmNewPage":"Всички незапазени промени ще бъдат изгубени. Сигурни ли сте, че желаете да заредите нова страница?","confirmCancel":"Някои от опциите са променени. Сигурни ли сте, че желаете да затворите прозореца?","options":"Опции","target":"Цел","targetNew":"Нов прозорец (_blank)","targetTop":"Горна позиция (_top)","targetSelf":"Текущия прозорец (_self)","targetParent":"Основен прозорец (_parent)","langDirLTR":"Ляво на дясно (ЛнД)","langDirRTL":"Дясно на ляво (ДнЛ)","styles":"Стил","cssClasses":"Класове за CSS","width":"Ширина","height":"Височина","align":"Подравняване","alignLeft":"Ляво","alignRight":"Дясно","alignCenter":"Център","alignTop":"Горе","alignMiddle":"По средата","alignBottom":"Долу","invalidValue":"Невалидна стойност.","invalidHeight":"Височината трябва да е число.","invalidWidth":"Ширина требе да е число.","invalidCssLength":"Стойността на полето \"%1\" трябва да бъде положително число с или без валидна CSS измервателна единица (px, %, in, cm, mm, em, ex, pt, или pc).","invalidHtmlLength":"Стойността на полето \"%1\" трябва да бъде положително число с или без валидна HTML измервателна единица (px или %).","invalidInlineStyle":"Стойността на стилa трябва да съдържат една или повече двойки във формат \"name : value\", разделени с двоеточие.","cssLengthTooltip":"Въведете числена стойност в пиксели или друга валидна CSS единица (px, %, in, cm, mm, em, ex, pt, или pc).","unavailable":"%1<span class=\"cke_accessibility\">, недостъпно</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"Относно CKEditor","help":"Проверете $1 за помощ.","moreInfo":"За лицензионна информация моля посетете сайта ни:","title":"Относно CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Удебелен","italic":"Наклонен","strike":"Зачертан текст","subscript":"Индексиран текст","superscript":"Суперскрипт","underline":"Подчертан"},"bidi":{"ltr":"Посока на текста от ляво на дясно","rtl":"Посока на текста от дясно на ляво"},"blockquote":{"toolbar":"Блок за цитат"},"clipboard":{"copy":"Копирай","copyError":"Настройките за сигурност на вашия бразуър не разрешават на редактора да изпълни запаметяването. За целта използвайте клавиатурата (Ctrl/Cmd+C).","cut":"Отрежи","cutError":"Настройките за сигурност на Вашия браузър не позволяват на редактора автоматично да изъплни действията за отрязване. Моля ползвайте клавиатурните команди за целта (ctrl+x).","paste":"Вмъкни","pasteArea":"Зона за вмъкване","pasteMsg":"Вмъкнете тук съдъжанието с клавиатуарата (<STRONG>Ctrl/Cmd+V</STRONG>) и натиснете <STRONG>OK</STRONG>.","securityMsg":"Заради настройките за сигурност на Вашия браузър, редакторът не може да прочете данните от клипборда коректно.","title":"Вмъкни"},"colorbutton":{"auto":"Автоматично","bgColorTitle":"Фонов цвят","colors":{"000":"Черно","800000":"Кестеняво","8B4513":"Светлокафяво","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Индиго","696969":"Тъмно сиво","B22222":"Огнено червено","A52A2A":"Кафяво","DAA520":"Златисто","006400":"Тъмно зелено","40E0D0":"Тюркуазено","0000CD":"Средно синьо","800080":"Пурпурно","808080":"Сиво","F00":"Червено","FF8C00":"Тъмно оранжево","FFD700":"Златно","008000":"Зелено","0FF":"Светло синьо","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"Още цветове","panelTitle":"Цветове","textColorTitle":"Цвят на шрифт"},"colordialog":{"clear":"Изчистване","highlight":"Осветяване","options":"Цветови опции","selected":"Изберете цвят","title":"Изберете цвят"},"templates":{"button":"Шаблони","emptyListMsg":"(Няма дефинирани шаблони)","insertOption":"Препокрива актуалното съдържание","options":"Опции за шаблона","selectPromptMsg":"Изберете шаблон <br>(текущото съдържание на редактора ще бъде загубено):","title":"Шаблони"},"contextmenu":{"options":"Опции на контекстното меню"},"div":{"IdInputLabel":"ID","advisoryTitleInputLabel":"Препоръчително заглавие","cssClassInputLabel":"Класове за CSS","edit":"Промяна на Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Ляво на Дясно (ЛнД)","langDirLabel":"Посока на езика","langDirRTLLabel":"Дясно на Ляво (ДнЛ)","languageCodeInputLabel":" Код на езика","remove":"Премахване на Div","styleSelectLabel":"Стил","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Свиване на лентата с инструменти","toolbarExpand":"Разширяване на лентата с инструменти","toolbarGroups":{"document":"Документ","clipboard":"Clipboard/Undo","editing":"Промяна","forms":"Форми","basicstyles":"Базови стилове","paragraph":"Параграф","links":"Връзки","insert":"Вмъкване","styles":"Стилове","colors":"Цветове","tools":"Инструменти"},"toolbars":"Ленти с инструменти"},"elementspath":{"eleLabel":"Път за елементите","eleTitle":"%1 елемент"},"find":{"find":"Търсене","findOptions":"Find Options","findWhat":"Търси за:","matchCase":"Съвпадение","matchCyclic":"Циклично съвпадение","matchWord":"Съвпадение с дума","notFoundMsg":"Указаният текст не е намерен.","replace":"Препокриване","replaceAll":"Препокрий всички","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Препокрива с:","title":"Търсене и препокриване"},"fakeobjects":{"anchor":"Кука","flash":"Флаш анимация","hiddenfield":"Скрито поле","iframe":"IFrame","unknown":"Неизвестен обект"},"flash":{"access":"Достъп до скрипт","accessAlways":"Винаги","accessNever":"Никога","accessSameDomain":"Същият домейн","alignAbsBottom":"Най-долу","alignAbsMiddle":"Точно по средата","alignBaseline":"Базова линия","alignTextTop":"Върху текста","bgcolor":"Цвят на фона","chkFull":"Включи на цял екран","chkLoop":"Цикъл","chkMenu":"Разрешено Flash меню","chkPlay":"Авто. пускане","flashvars":"Променливи за Флаш","hSpace":"Хоризонтален отстъп","properties":"Настройки за флаш","propertiesTab":"Настройки","quality":"Качество","qualityAutoHigh":"Авто. високо","qualityAutoLow":"Авто. ниско","qualityBest":"Отлично","qualityHigh":"Високо","qualityLow":"Ниско","qualityMedium":"Средно","scale":"Оразмеряване","scaleAll":"Показва всичко","scaleFit":"Според мястото","scaleNoBorder":"Без рамка","title":"Настройки за флаш","vSpace":"Вертикален отстъп","validateHSpace":"HSpace трябва да е число.","validateSrc":"Уеб адреса не трябва да е празен.","validateVSpace":"VSpace трябва да е число.","windowMode":"Режим на прозореца","windowModeOpaque":"Плътност","windowModeTransparent":"Прозрачност","windowModeWindow":"Прозорец"},"font":{"fontSize":{"label":"Размер","voiceLabel":"Размер на шрифт","panelTitle":"Размер на шрифт"},"label":"Шрифт","panelTitle":"Име на шрифт","voiceLabel":"Шрифт"},"forms":{"button":{"title":"Настройки на бутона","text":"Текст (стойност)","type":"Тип","typeBtn":"Бутон","typeSbm":"Добави","typeRst":"Нулиране"},"checkboxAndRadio":{"checkboxTitle":"Checkbox Properties","radioTitle":"Настройки на радиобутон","value":"Стойност","selected":"Избрано"},"form":{"title":"Настройки на формата","menu":"Настройки на формата","action":"Действие","method":"Метод","encoding":"Кодиране"},"hidden":{"title":"Настройки за скрито поле","name":"Име","value":"Стойност"},"select":{"title":"Selection Field Properties","selectInfo":"Select Info","opAvail":"Налични опции","value":"Стойност","size":"Размер","lines":"линии","chkMulti":"Allow multiple selections","opText":"Текст","opValue":"Стойност","btnAdd":"Добави","btnModify":"Промени","btnUp":"На горе","btnDown":"На долу","btnSetValue":"Set as selected value","btnDelete":"Изтриване"},"textarea":{"title":"Опции за текстовата зона","cols":"Колони","rows":"Редове"},"textfield":{"title":"Настройки за текстово поле","name":"Име","value":"Стойност","charWidth":"Ширина на знаците","maxChars":"Макс. знаци","type":"Тип","typeText":"Текст","typePass":"Парола","typeEmail":"Email","typeSearch":"Търсене","typeTel":"Телефонен номер","typeUrl":"Уеб адрес"}},"format":{"label":"Формат","panelTitle":"Формат","tag_address":"Адрес","tag_div":"Параграф (DIV)","tag_h1":"Заглавие 1","tag_h2":"Заглавие 2","tag_h3":"Заглавие 3","tag_h4":"Заглавие 4","tag_h5":"Заглавие 5","tag_h6":"Заглавие 6","tag_p":"Нормален","tag_pre":"Форматиран"},"horizontalrule":{"toolbar":"Вмъкване на хоризонтална линия"},"iframe":{"border":"Показва рамка на карето","noUrl":"Моля въведете URL за iFrame","scrolling":"Вкл. скролбаровете","title":"IFrame настройки","toolbar":"IFrame"},"image":{"alertUrl":"Моля, въведете пълния път до изображението","alt":"Алтернативен текст","border":"Рамка","btnUpload":"Изпрати я на сървъра","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Хоризонтален отстъп","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Инфо за снимка","linkTab":"Връзка","lockRatio":"Заключване на съотношението","menu":"Настройки за снимка","resetSize":"Нулиране на размер","title":"Настройки за снимка","titleButton":"Настойки за бутон за снимка","upload":"Качване","urlMissing":"Image source URL is missing.","vSpace":"Вертикален отстъп","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Увеличаване на отстъпа","outdent":"Намаляване на отстъпа"},"smiley":{"options":"Опции за усмивката","title":"Вмъкване на усмивка","toolbar":"Усмивка"},"justify":{"block":"Двустранно подравняване","center":"Център","left":"Подравни в ляво","right":"Подравни в дясно"},"link":{"acccessKey":"Ключ за достъп","advanced":"Разширено","advisoryContentType":"Препоръчителен тип на съдържанието","advisoryTitle":"Препоръчително заглавие","anchor":{"toolbar":"Котва","menu":"Промяна на котва","title":"Настройки на котва","name":"Име на котва","errorName":"Моля въведете име на котвата","remove":"Премахване на котва"},"anchorId":"По ID на елемент","anchorName":"По име на котва","charset":"Тип на свързания ресурс","cssClasses":"Класове за CSS","emailAddress":"E-mail aдрес","emailBody":"Съдържание","emailSubject":"Тема","id":"ID","info":"Инфо за връзката","langCode":"Код за езика","langDir":"Посока на езика","langDirLTR":"Ляво на Дясно (ЛнД)","langDirRTL":"Дясно на Ляво (ДнЛ)","menu":"Промяна на връзка","name":"Име","noAnchors":"(Няма котви в текущия документ)","noEmail":"Моля въведете e-mail aдрес","noUrl":"Моля въведете URL адреса","other":"<друго>","popupDependent":"Зависимост (Netscape)","popupFeatures":"Функции на изкачащ прозорец","popupFullScreen":"Цял екран (IE)","popupLeft":"Лява позиция","popupLocationBar":"Лента с локацията","popupMenuBar":"Лента за меню","popupResizable":"Оразмеряем","popupScrollBars":"Скролери","popupStatusBar":"Статусна лента","popupToolbar":"Лента с инструменти","popupTop":"Горна позиция","rel":"Връзка","selectAnchor":"Изберете котва","styles":"Стил","tabIndex":"Ред на достъп","target":"Цел","targetFrame":"<frame>","targetFrameName":"Име на целевият прозорец","targetPopup":"<изкачащ прозорец>","targetPopupName":"Име на изкачащ прозорец","title":"Връзка","toAnchor":"Връзка към котва в текста","toEmail":"E-mail","toUrl":"Уеб адрес","toolbar":"Връзка","type":"Тип на връзката","unlink":"Премахни връзката","upload":"Качване"},"list":{"bulletedlist":"Вмъкване/Премахване на точков списък","numberedlist":"Вмъкване/Премахване на номериран списък"},"liststyle":{"armenian":"Арменско номериране","bulletedTitle":"Bulleted List Properties","circle":"Кръг","decimal":"Числа (1, 2, 3 и др.)","decimalLeadingZero":"Числа с водеща нула (01, 02, 03 и т.н.)","disc":"Диск","georgian":"Грузинско номериране (an, ban, gan, и т.н.)","lowerAlpha":"Малки букви (а, б, в, г, д и т.н.)","lowerGreek":"Малки гръцки букви (алфа, бета, гама и т.н.)","lowerRoman":"Малки римски числа (i, ii, iii, iv, v и т.н.)","none":"Няма","notset":"<не е указано>","numberedTitle":"Numbered List Properties","square":"Квадрат","start":"Старт","type":"Тип","upperAlpha":"Големи букви (А, Б, В, Г, Д и т.н.)","upperRoman":"Големи римски числа (I, II, III, IV, V и т.н.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Вмъкнете параграф тук"},"maximize":{"maximize":"Максимизиране","minimize":"Минимизиране"},"newpage":{"toolbar":"Нова страница"},"pagebreak":{"alt":"Разделяне на страници","toolbar":"Вмъкване на нова страница при печат"},"pastetext":{"button":"Вмъкни като чист текст","title":"Вмъкни като чист текст"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Вмъкни от MS Word","toolbar":"Вмъкни от MS Word"},"preview":{"preview":"Преглед"},"print":{"toolbar":"Печат"},"removeformat":{"toolbar":"Премахване на форматирането"},"save":{"toolbar":"Запис"},"selectall":{"toolbar":"Избери всичко"},"showblocks":{"toolbar":"Показва блокове"},"sourcearea":{"toolbar":"Източник"},"specialchar":{"options":"Опции за специален знак","title":"Избор на специален знак","toolbar":"Вмъкване на специален знак"},"scayt":{"about":"About SCAYT","aboutTab":"Относно","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Нов","dic_delete":"Изтриване","dic_field_name":"Име на речнк","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Преименуване","dic_restore":"Възтановяване","dictionariesTab":"Речници","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Езици","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Игнорирани думи и цифри","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Стилове","panelTitle":"Стилове за форматиране","panelTitle1":"Блокови стилове","panelTitle2":"Вътрешни стилове","panelTitle3":"Обектни стилове"},"table":{"border":"Размер на рамката","caption":"Заглавие","cell":{"menu":"Клетка","insertBefore":"Вмъкване на клетка преди","insertAfter":"Вмъкване на клетка след","deleteCell":"Изтриване на клетки","merge":"Сливане на клетки","mergeRight":"Сливане в дясно","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Настройки на клетката","cellType":"Тип на клетката","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Авто. пренос","hAlign":"Хоризонтално подравняване","vAlign":"Вертикално подравняване","alignBaseline":"Базова линия","bgColor":"Фон","borderColor":"Цвят на рамката","data":"Данни","header":"Хедър","yes":"Да","no":"Не","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Изберете"},"cellPad":"Отделяне на клетките","cellSpace":"Разтояние между клетките","column":{"menu":"Колона","insertBefore":"Вмъкване на колона преди","insertAfter":"Вмъкване на колона след","deleteColumn":"Изтриване на колони"},"columns":"Колони","deleteTable":"Изтриване на таблица","headers":"Хедъри","headersBoth":"Заедно","headersColumn":"Първа колона","headersNone":"Няма","headersRow":"Първи ред","invalidBorder":"Размерът на рамката трябва да е число.","invalidCellPadding":"Отстоянието на клетките трябва да е позитивно число.","invalidCellSpacing":"Интервала в клетките трябва да е позитивно число.","invalidCols":"Броят колони трябва да е по-голям от 0.","invalidHeight":"Височината на таблицата трябва да е число.","invalidRows":"Броят редове трябва да е по-голям от 0.","invalidWidth":"Ширината на таблицата трябва да е число.","menu":"Настройки на таблицата","row":{"menu":"Ред","insertBefore":"Вмъкване на ред преди","insertAfter":"Вмъкване на ред след","deleteRow":"Изтриване на редове"},"rows":"Редове","summary":"Обща информация","title":"Настройки на таблицата","toolbar":"Таблица","widthPc":"процент","widthPx":"пиксела","widthUnit":"единица за ширина"},"undo":{"redo":"Връщане на предишен статус","undo":"Възтанови"},"wsc":{"btnIgnore":"Игнорирай","btnIgnoreAll":"Игнорирай всичко","btnReplace":"Препокриване","btnReplaceAll":"Препокрий всичко","btnUndo":"Възтанови","changeTo":"Промени на","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- Няма препоръчани -","notAvailable":"Съжаляваме, но услугата не е достъпна за момента","notInDic":"Не е в речника","oneChange":"Spell check complete: One word changed","progress":"Проверява се правописа...","title":"Проверка на правопис","toolbar":"Проверка на правопис"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/bn.js b/htmltest/sites/all/libraries/ckeditor-version/lang/bn.js
new file mode 100644
index 00000000..f52e5227
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/bn.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['bn']={"editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"ব্রাউজ সার্ভার","url":"URL","protocol":"প্রোটোকল","upload":"আপলোড","uploadSubmit":"ইহাকে সার্ভারে প্রেরন কর","image":"ছবির লেবেল যুক্ত কর","flash":"ফ্লাশ লেবেল যুক্ত কর","form":"ফর্ম","checkbox":"চেক বাক্স","radio":"রেডিও বাটন","textField":"টেক্সট ফীল্ড","textarea":"টেক্সট এরিয়া","hiddenField":"গুপ্ত ফীল্ড","button":"বাটন","select":"বাছাই ফীল্ড","imageButton":"ছবির বাটন","notSet":"<সেট নেই>","id":"আইডি","name":"নাম","langDir":"ভাষা লেখার দিক","langDirLtr":"বাম থেকে ডান (LTR)","langDirRtl":"ডান থেকে বাম (RTL)","langCode":"ভাষা কোড","longDescr":"URL এর লম্বা বর্ণনা","cssClass":"স্টাইল-শীট ক্লাস","advisoryTitle":"পরামর্শ শীর্ষক","cssStyle":"স্টাইল","ok":"ওকে","cancel":"বাতিল","close":"Close","preview":"প্রিভিউ","resize":"Resize","generalTab":"General","advancedTab":"এডভান্সড","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"টার্গেট","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"বাম থেকে ডান (LTR)","langDirRTL":"ডান থেকে বাম (RTL)","styles":"স্টাইল","cssClasses":"স্টাইল-শীট ক্লাস","width":"প্রস্থ","height":"দৈর্ঘ্য","align":"এলাইন","alignLeft":"বামে","alignRight":"ডানে","alignCenter":"মাঝখানে","alignTop":"উপর","alignMiddle":"মধ্য","alignBottom":"নীচে","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"বোল্ড","italic":"ইটালিক","strike":"স্ট্রাইক থ্রু","subscript":"অধোলেখ","superscript":"অভিলেখ","underline":"আন্ডারলাইন"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"কপি","copyError":"আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কপি করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+C)।","cut":"কাট","cutError":"আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কাট করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+X)।","paste":"পেস্ট","pasteArea":"Paste Area","pasteMsg":"অনুগ্রহ করে নীচের বাক্সে কিবোর্ড ব্যবহার করে (<STRONG>Ctrl/Cmd+V</STRONG>) পেস্ট করুন এবং <STRONG>OK</STRONG> চাপ দিন","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"পেস্ট"},"colorbutton":{"auto":"অটোমেটিক","bgColorTitle":"বেকগ্রাউন্ড রং","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"আরও রং...","panelTitle":"Colors","textColorTitle":"টেক্স্ট রং"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"টেমপ্লেট","emptyListMsg":"(কোন টেমপ্লেট ডিফাইন করা নেই)","insertOption":"Replace actual contents","options":"Template Options","selectPromptMsg":"অনুগ্রহ করে এডিটরে ওপেন করার জন্য টেমপ্লেট বাছাই করুন<br>(আসল কনটেন্ট হারিয়ে যাবে):","title":"কনটেন্ট টেমপ্লেট"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Left to Right (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Right to Left (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"খোজো","findOptions":"Find Options","findWhat":"যা খুঁজতে হবে:","matchCase":"কেস মিলাও","matchCyclic":"Match cyclic","matchWord":"পুরা শব্দ মেলাও","notFoundMsg":"আপনার উল্লেখিত টেকস্ট পাওয়া যায়নি","replace":"রিপ্লেস","replaceAll":"সব বদলে দাও","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"যার সাথে বদলাতে হবে:","title":"Find and Replace"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"Abs নীচে","alignAbsMiddle":"Abs উপর","alignBaseline":"মূল রেখা","alignTextTop":"টেক্সট উপর","bgcolor":"বেকগ্রাউন্ড রং","chkFull":"Allow Fullscreen","chkLoop":"লূপ","chkMenu":"ফ্ল্যাশ মেনু এনাবল কর","chkPlay":"অটো প্লে","flashvars":"Variables for Flash","hSpace":"হরাইজন্টাল স্পেস","properties":"ফ্লাশ প্রোপার্টি","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"স্কেল","scaleAll":"সব দেখাও","scaleFit":"নিখুঁত ফিট","scaleNoBorder":"কোনো বর্ডার নেই","title":"ফ্ল্যাশ প্রোপার্টি","vSpace":"ভার্টিকেল স্পেস","validateHSpace":"HSpace must be a number.","validateSrc":"অনুগ্রহ করে URL লিংক টাইপ করুন","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"সাইজ","voiceLabel":"Font Size","panelTitle":"সাইজ"},"label":"ফন্ট","panelTitle":"ফন্ট","voiceLabel":"ফন্ট"},"forms":{"button":{"title":"বাটন প্রোপার্টি","text":"টেক্সট (ভ্যালু)","type":"প্রকার","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"চেক বক্স প্রোপার্টি","radioTitle":"রেডিও বাটন প্রোপার্টি","value":"ভ্যালু","selected":"সিলেক্টেড"},"form":{"title":"ফর্ম প্রোপার্টি","menu":"ফর্ম প্রোপার্টি","action":"একশ্যন","method":"পদ্ধতি","encoding":"Encoding"},"hidden":{"title":"গুপ্ত ফীল্ড প্রোপার্টি","name":"নাম","value":"ভ্যালু"},"select":{"title":"বাছাই ফীল্ড প্রোপার্টি","selectInfo":"তথ্য","opAvail":"অন্যান্য বিকল্প","value":"ভ্যালু","size":"সাইজ","lines":"লাইন সমূহ","chkMulti":"একাধিক সিলেকশন এলাউ কর","opText":"টেক্সট","opValue":"ভ্যালু","btnAdd":"যুক্ত","btnModify":"বদলে দাও","btnUp":"উপর","btnDown":"নীচে","btnSetValue":"বাছাই করা ভ্যালু হিসেবে সেট কর","btnDelete":"ডিলীট"},"textarea":{"title":"টেক্সট এরিয়া প্রোপার্টি","cols":"কলাম","rows":"রো"},"textfield":{"title":"টেক্সট ফীল্ড প্রোপার্টি","name":"নাম","value":"ভ্যালু","charWidth":"ক্যারেক্টার প্রশস্ততা","maxChars":"সর্বাধিক ক্যারেক্টার","type":"টাইপ","typeText":"টেক্সট","typePass":"পাসওয়ার্ড","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"ফন্ট ফরমেট","panelTitle":"ফন্ট ফরমেট","tag_address":"ঠিকানা","tag_div":"শীর্ষক (DIV)","tag_h1":"শীর্ষক ১","tag_h2":"শীর্ষক ২","tag_h3":"শীর্ষক ৩","tag_h4":"শীর্ষক ৪","tag_h5":"শীর্ষক ৫","tag_h6":"শীর্ষক ৬","tag_p":"সাধারণ","tag_pre":"ফর্মেটেড"},"horizontalrule":{"toolbar":"রেখা যুক্ত কর"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"অনুগ্রহক করে ছবির URL টাইপ করুন","alt":"বিকল্প টেক্সট","border":"বর্ডার","btnUpload":"ইহাকে সার্ভারে প্রেরন কর","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"হরাইজন্টাল স্পেস","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"ছবির তথ্য","linkTab":"লিংক","lockRatio":"অনুপাত লক কর","menu":"ছবির প্রোপার্টি","resetSize":"সাইজ পূর্বাবস্থায় ফিরিয়ে দাও","title":"ছবির প্রোপার্টি","titleButton":"ছবি বাটন প্রোপার্টি","upload":"আপলোড","urlMissing":"Image source URL is missing.","vSpace":"ভার্টিকেল স্পেস","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"ইনডেন্ট বাড়াও","outdent":"ইনডেন্ট কমাও"},"smiley":{"options":"Smiley Options","title":"স্মাইলী যুক্ত কর","toolbar":"স্মাইলী"},"justify":{"block":"ব্লক জাস্টিফাই","center":"মাঝ বরাবর ঘেষা","left":"বা দিকে ঘেঁষা","right":"ডান দিকে ঘেঁষা"},"link":{"acccessKey":"এক্সেস কী","advanced":"এডভান্সড","advisoryContentType":"পরামর্শ কন্টেন্টের প্রকার","advisoryTitle":"পরামর্শ শীর্ষক","anchor":{"toolbar":"নোঙ্গর","menu":"নোঙর প্রোপার্টি","title":"নোঙর প্রোপার্টি","name":"নোঙরের নাম","errorName":"নোঙরের নাম টাইপ করুন","remove":"Remove Anchor"},"anchorId":"নোঙরের আইডি দিয়ে","anchorName":"নোঙরের নাম দিয়ে","charset":"লিংক রিসোর্স ক্যারেক্টর সেট","cssClasses":"স্টাইল-শীট ক্লাস","emailAddress":"ইমেইল ঠিকানা","emailBody":"মেসেজের দেহ","emailSubject":"মেসেজের বিষয়","id":"আইডি","info":"লিংক তথ্য","langCode":"ভাষা লেখার দিক","langDir":"ভাষা লেখার দিক","langDirLTR":"বাম থেকে ডান (LTR)","langDirRTL":"ডান থেকে বাম (RTL)","menu":"লিংক সম্পাদন","name":"নাম","noAnchors":"(No anchors available in the document)","noEmail":"অনুগ্রহ করে ইমেইল এড্রেস টাইপ করুন","noUrl":"অনুগ্রহ করে URL লিংক টাইপ করুন","other":"<other>","popupDependent":"ডিপেন্ডেন্ট (Netscape)","popupFeatures":"পপআপ উইন্ডো ফীচার সমূহ","popupFullScreen":"পূর্ণ পর্দা জুড়ে (IE)","popupLeft":"বামের পজিশন","popupLocationBar":"লোকেশন বার","popupMenuBar":"মেন্যু বার","popupResizable":"Resizable","popupScrollBars":"স্ক্রল বার","popupStatusBar":"স্ট্যাটাস বার","popupToolbar":"টুল বার","popupTop":"ডানের পজিশন","rel":"Relationship","selectAnchor":"নোঙর বাছাই","styles":"স্টাইল","tabIndex":"ট্যাব ইন্ডেক্স","target":"টার্গেট","targetFrame":"<ফ্রেম>","targetFrameName":"টার্গেট ফ্রেমের নাম","targetPopup":"<পপআপ উইন্ডো>","targetPopupName":"পপআপ উইন্ডোর নাম","title":"লিংক","toAnchor":"এই পেজে নোঙর কর","toEmail":"ইমেইল","toUrl":"URL","toolbar":"লিংক যুক্ত কর","type":"লিংক প্রকার","unlink":"লিংক সরাও","upload":"আপলোড"},"list":{"bulletedlist":"বুলেট লিস্ট লেবেল","numberedlist":"সাংখ্যিক লিস্টের লেবেল"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"newpage":{"toolbar":"নতুন পেজ"},"pagebreak":{"alt":"Page Break","toolbar":"পেজ ব্রেক"},"pastetext":{"button":"সাদা টেক্সট হিসেবে পেস্ট কর","title":"সাদা টেক্সট হিসেবে পেস্ট কর"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"পেস্ট (শব্দ)","toolbar":"পেস্ট (শব্দ)"},"preview":{"preview":"প্রিভিউ"},"print":{"toolbar":"প্রিন্ট"},"removeformat":{"toolbar":"ফরমেট সরাও"},"save":{"toolbar":"সংরক্ষন কর"},"selectall":{"toolbar":"সব সিলেক্ট কর"},"showblocks":{"toolbar":"Show Blocks"},"sourcearea":{"toolbar":"সোর্স"},"specialchar":{"options":"Special Character Options","title":"বিশেষ ক্যারেক্টার বাছাই কর","toolbar":"বিশেষ অক্ষর যুক্ত কর"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"স্টাইল","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"বর্ডার সাইজ","caption":"শীর্ষক","cell":{"menu":"সেল","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"সেল মুছে দাও","merge":"সেল জোড়া দাও","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"সেল প্যাডিং","cellSpace":"সেল স্পেস","column":{"menu":"কলাম","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"কলাম মুছে দাও"},"columns":"কলাম","deleteTable":"টেবিল ডিলীট কর","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"টেবিল প্রোপার্টি","row":{"menu":"রো","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"রো মুছে দাও"},"rows":"রো","summary":"সারাংশ","title":"টেবিল প্রোপার্টি","toolbar":"টেবিলের লেবেল যুক্ত কর","widthPc":"শতকরা","widthPx":"পিক্সেল","widthUnit":"width unit"},"undo":{"redo":"রি-ডু","undo":"আনডু"},"wsc":{"btnIgnore":"ইগনোর কর","btnIgnoreAll":"সব ইগনোর কর","btnReplace":"বদলে দাও","btnReplaceAll":"সব বদলে দাও","btnUndo":"আন্ডু","changeTo":"এতে বদলাও","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"বানান পরীক্ষক ইনস্টল করা নেই। আপনি কি এখনই এটা ডাউনলোড করতে চান?","manyChanges":"বানান পরীক্ষা শেষ: %1 গুলো শব্দ বদলে গ্যাছে","noChanges":"বানান পরীক্ষা শেষ: কোন শব্দ পরিবর্তন করা হয়নি","noMispell":"বানান পরীক্ষা শেষ: কোন ভুল বানান পাওয়া যায়নি","noSuggestions":"- কোন সাজেশন নেই -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"শব্দকোষে নেই","oneChange":"বানান পরীক্ষা শেষ: একটি মাত্র শব্দ পরিবর্তন করা হয়েছে","progress":"বানান পরীক্ষা চলছে...","title":"Spell Check","toolbar":"বানান চেক"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/bs.js b/htmltest/sites/all/libraries/ckeditor-version/lang/bs.js
new file mode 100644
index 00000000..a63163af
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/bs.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['bs']={"editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protokol","upload":"Šalji","uploadSubmit":"Šalji na server","image":"Slika","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<nije podešeno>","id":"Id","name":"Naziv","langDir":"Smjer pisanja","langDirLtr":"S lijeva na desno (LTR)","langDirRtl":"S desna na lijevo (RTL)","langCode":"Jezièni kôd","longDescr":"Dugaèki opis URL-a","cssClass":"Klase CSS stilova","advisoryTitle":"Advisory title","cssStyle":"Stil","ok":"OK","cancel":"Odustani","close":"Close","preview":"Prikaži","resize":"Resize","generalTab":"General","advancedTab":"Naprednije","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Prozor","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","styles":"Stil","cssClasses":"Klase CSS stilova","width":"Širina","height":"Visina","align":"Poravnanje","alignLeft":"Lijevo","alignRight":"Desno","alignCenter":"Centar","alignTop":"Vrh","alignMiddle":"Sredina","alignBottom":"Dno","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Boldiraj","italic":"Ukosi","strike":"Precrtaj","subscript":"Subscript","superscript":"Superscript","underline":"Podvuci"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Kopiraj","copyError":"Sigurnosne postavke Vašeg pretraživaèa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+C).","cut":"Izreži","cutError":"Sigurnosne postavke vašeg pretraživaèa ne dozvoljavaju operacije automatskog rezanja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+X).","paste":"Zalijepi","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Zalijepi"},"colorbutton":{"auto":"Automatska","bgColorTitle":"Boja pozadine","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"Više boja...","panelTitle":"Colors","textColorTitle":"Boja teksta"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"Templates","emptyListMsg":"(No templates defined)","insertOption":"Replace actual contents","options":"Template Options","selectPromptMsg":"Please select the template to open in the editor","title":"Content Templates"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory title","cssClassInputLabel":"Klase CSS stilova","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"S lijeva na desno (LTR)","langDirLabel":"Smjer pisanja","langDirRTLLabel":"S desna na lijevo (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Stil","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"Naði","findOptions":"Find Options","findWhat":"Naði šta:","matchCase":"Uporeðuj velika/mala slova","matchCyclic":"Match cyclic","matchWord":"Uporeðuj samo cijelu rijeè","notFoundMsg":"Traženi tekst nije pronaðen.","replace":"Zamjeni","replaceAll":"Zamjeni sve","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Zamjeni sa:","title":"Find and Replace"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"Abs dole","alignAbsMiddle":"Abs sredina","alignBaseline":"Bazno","alignTextTop":"Vrh teksta","bgcolor":"Boja pozadine","chkFull":"Allow Fullscreen","chkLoop":"Loop","chkMenu":"Enable Flash Menu","chkPlay":"Auto Play","flashvars":"Variables for Flash","hSpace":"HSpace","properties":"Flash Properties","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"Scale","scaleAll":"Show all","scaleFit":"Exact Fit","scaleNoBorder":"No Border","title":"Flash Properties","vSpace":"VSpace","validateHSpace":"HSpace must be a number.","validateSrc":"Molimo ukucajte URL link","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Velièina","voiceLabel":"Font Size","panelTitle":"Velièina"},"label":"Font","panelTitle":"Font","voiceLabel":"Font"},"forms":{"button":{"title":"Button Properties","text":"Text (Value)","type":"Type","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"Checkbox Properties","radioTitle":"Radio Button Properties","value":"Value","selected":"Selected"},"form":{"title":"Form Properties","menu":"Form Properties","action":"Action","method":"Method","encoding":"Encoding"},"hidden":{"title":"Hidden Field Properties","name":"Name","value":"Value"},"select":{"title":"Selection Field Properties","selectInfo":"Select Info","opAvail":"Available Options","value":"Value","size":"Size","lines":"lines","chkMulti":"Allow multiple selections","opText":"Text","opValue":"Value","btnAdd":"Add","btnModify":"Modify","btnUp":"Up","btnDown":"Down","btnSetValue":"Set as selected value","btnDelete":"Delete"},"textarea":{"title":"Textarea Properties","cols":"Columns","rows":"Rows"},"textfield":{"title":"Text Field Properties","name":"Name","value":"Value","charWidth":"Character Width","maxChars":"Maximum Characters","type":"Type","typeText":"Text","typePass":"Password","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Ubaci horizontalnu liniju"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Molimo ukucajte URL od slike.","alt":"Tekst na slici","border":"Okvir","btnUpload":"Šalji na server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Info slike","linkTab":"Link","lockRatio":"Zakljuèaj odnos","menu":"Svojstva slike","resetSize":"Resetuj dimenzije","title":"Svojstva slike","titleButton":"Image Button Properties","upload":"Šalji","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Poveæaj uvod","outdent":"Smanji uvod"},"smiley":{"options":"Smiley Options","title":"Ubaci smješka","toolbar":"Smješko"},"justify":{"block":"Puno poravnanje","center":"Centralno poravnanje","left":"Lijevo poravnanje","right":"Desno poravnanje"},"link":{"acccessKey":"Pristupna tipka","advanced":"Naprednije","advisoryContentType":"Advisory vrsta sadržaja","advisoryTitle":"Advisory title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"Po Id-u elementa","anchorName":"Po nazivu sidra","charset":"Linked Resource Charset","cssClasses":"Klase CSS stilova","emailAddress":"E-Mail Adresa","emailBody":"Poruka","emailSubject":"Subjekt poruke","id":"Id","info":"Link info","langCode":"Smjer pisanja","langDir":"Smjer pisanja","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","menu":"Izmjeni link","name":"Naziv","noAnchors":"(Nema dostupnih sidra na stranici)","noEmail":"Molimo ukucajte e-mail adresu","noUrl":"Molimo ukucajte URL link","other":"<other>","popupDependent":"Ovisno (Netscape)","popupFeatures":"Moguænosti popup prozora","popupFullScreen":"Cijeli ekran (IE)","popupLeft":"Lijeva pozicija","popupLocationBar":"Traka za lokaciju","popupMenuBar":"Izborna traka","popupResizable":"Resizable","popupScrollBars":"Scroll traka","popupStatusBar":"Statusna traka","popupToolbar":"Traka sa alatima","popupTop":"Gornja pozicija","rel":"Relationship","selectAnchor":"Izaberi sidro","styles":"Stil","tabIndex":"Tab indeks","target":"Prozor","targetFrame":"<frejm>","targetFrameName":"Target Frame Name","targetPopup":"<popup prozor>","targetPopupName":"Naziv popup prozora","title":"Link","toAnchor":"Sidro na ovoj stranici","toEmail":"E-Mail","toUrl":"URL","toolbar":"Ubaci/Izmjeni link","type":"Tip linka","unlink":"Izbriši link","upload":"Šalji"},"list":{"bulletedlist":"Lista","numberedlist":"Numerisana lista"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"newpage":{"toolbar":"Novi dokument"},"pagebreak":{"alt":"Page Break","toolbar":"Insert Page Break for Printing"},"pastetext":{"button":"Zalijepi kao obièan tekst","title":"Zalijepi kao obièan tekst"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Zalijepi iz Word-a","toolbar":"Zalijepi iz Word-a"},"preview":{"preview":"Prikaži"},"print":{"toolbar":"Štampaj"},"removeformat":{"toolbar":"Poništi format"},"save":{"toolbar":"Snimi"},"selectall":{"toolbar":"Selektuj sve"},"showblocks":{"toolbar":"Show Blocks"},"sourcearea":{"toolbar":"HTML kôd"},"specialchar":{"options":"Special Character Options","title":"Izaberi specijalni karakter","toolbar":"Ubaci specijalni karater"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Okvir","caption":"Naslov","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Briši æelije","merge":"Spoji æelije","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Uvod æelija","cellSpace":"Razmak æelija","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Briši kolone"},"columns":"Kolona","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Svojstva tabele","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Briši redove"},"rows":"Redova","summary":"Summary","title":"Svojstva tabele","toolbar":"Tabela","widthPc":"posto","widthPx":"piksela","widthUnit":"width unit"},"undo":{"redo":"Ponovi","undo":"Vrati"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/ca.js b/htmltest/sites/all/libraries/ckeditor-version/lang/ca.js
new file mode 100644
index 00000000..23e323e9
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/ca.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ca']={"editor":"Editor de text enriquit","common":{"editorHelp":"Premeu ALT 0 per ajuda","browseServer":"Veure servidor","url":"URL","protocol":"Protocol","upload":"Puja","uploadSubmit":"Envia-la al servidor","image":"Imatge","flash":"Flash","form":"Formulari","checkbox":"Casella de verificació","radio":"Botó d'opció","textField":"Camp de text","textarea":"Àrea de text","hiddenField":"Camp ocult","button":"Botó","select":"Camp de selecció","imageButton":"Botó d'imatge","notSet":"<no definit>","id":"Id","name":"Nom","langDir":"Direcció de l'idioma","langDirLtr":"D'esquerra a dreta (LTR)","langDirRtl":"De dreta a esquerra (RTL)","langCode":"Codi d'idioma","longDescr":"Descripció llarga de la URL","cssClass":"Classes del full d'estil","advisoryTitle":"Títol consultiu","cssStyle":"Estil","ok":"D'acord","cancel":"Cancel·la","close":"Tanca","preview":"Previsualitza","resize":"Arrossegueu per redimensionar","generalTab":"General","advancedTab":"Avançat","validateNumberFailed":"Aquest valor no és un número.","confirmNewPage":"Els canvis en aquest contingut que no es desin es perdran. Esteu segur que voleu carregar una pàgina nova?","confirmCancel":"Algunes opcions s'han canviat. Esteu segur que voleu tancar el quadre de diàleg?","options":"Opcions","target":"Destí","targetNew":"Nova finestra (_blank)","targetTop":"Finestra superior (_top)","targetSelf":"Mateixa finestra (_self)","targetParent":"Finestra pare (_parent)","langDirLTR":"D'esquerra a dreta (LTR)","langDirRTL":"De dreta a esquerra (RTL)","styles":"Estil","cssClasses":"Classes del full d'estil","width":"Amplada","height":"Alçada","align":"Alineació","alignLeft":"Ajusta a l'esquerra","alignRight":"Ajusta a la dreta","alignCenter":"Centre","alignTop":"Superior","alignMiddle":"Centre","alignBottom":"Inferior","invalidValue":"Valor no vàlid.","invalidHeight":"L'alçada ha de ser un número.","invalidWidth":"L'amplada ha de ser un número.","invalidCssLength":"El valor especificat per als \"%1\" camps ha de ser un número positiu amb o sense unitat de mesura vàlida de CSS (px, %, in, cm, mm, em, ex, pt o pc).","invalidHtmlLength":"El valor especificat per als \"%1\" camps ha de ser un número positiu amb o sense unitat de mesura vàlida d'HTML (px o %).","invalidInlineStyle":"El valor especificat per l'estil en línia ha de constar d'una o més tuples amb el format \"name: value\", separats per punt i coma.","cssLengthTooltip":"Introduïu un número per un valor en píxels o un número amb una unitat vàlida de CSS (px, %, in, cm, mm, em, ex, pt o pc).","unavailable":"%1<span class=\"cke_accessibility\">, no disponible</span>"},"about":{"copy":"Copyright &copy; $1. Tots els drets reservats.","dlgTitle":"Quant al CKEditor","help":"Premi $1 per obtenir ajuda.","moreInfo":"Per informació sobre llicències visiteu el nostre lloc web:","title":"Quant al CKEditor","userGuide":"Manual d'usuari de CKEditor"},"basicstyles":{"bold":"Negreta","italic":"Cursiva","strike":"Ratllat","subscript":"Subíndex","superscript":"Superíndex","underline":"Subratllat"},"bidi":{"ltr":"Direcció del text d'esquerra a dreta","rtl":"Direcció del text de dreta a esquerra"},"blockquote":{"toolbar":"Bloc de cita"},"clipboard":{"copy":"Copiar","copyError":"La configuració de seguretat del vostre navegador no permet executar automàticament les operacions de copiar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+C).","cut":"Retallar","cutError":"La configuració de seguretat del vostre navegador no permet executar automàticament les operacions de retallar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+X).","paste":"Enganxar","pasteArea":"Àrea d'enganxat","pasteMsg":"Si us plau, enganxi dins del següent camp utilitzant el teclat (<strong>Ctrl/Cmd+V</strong>) i premi OK.","securityMsg":"A causa de la configuració de seguretat del vostre navegador, l'editor no pot accedir a les dades del porta-retalls directament. Enganxeu-ho un altre cop en aquesta finestra.","title":"Enganxar"},"colorbutton":{"auto":"Automàtic","bgColorTitle":"Color de Fons","colors":{"000":"Negre","800000":"Grana","8B4513":"Marró sella","2F4F4F":"Gris pissarra fosca","008080":"Blau xarxet","000080":"Blau marí","4B0082":"Indi","696969":"Gris Fosc","B22222":"Foc Maó","A52A2A":"Marró","DAA520":"Solidago","006400":"Verd Fosc","40E0D0":"Turquesa","0000CD":"Blau 1/2","800080":"Lila","808080":"Gris","F00":"Vermell","FF8C00":"Taronja Fosc","FFD700":"Or","008000":"Verd","0FF":"Cian","00F":"Blau","EE82EE":"Violat","A9A9A9":"Gris clar","FFA07A":"Salmó clar","FFA500":"Taronja","FFFF00":"Groc","00FF00":"Verd Llima","AFEEEE":"Turquesa Pàl·lid","ADD8E6":"Blau Clar","DDA0DD":"Pruna","D3D3D3":"Gris Clar","FFF0F5":"Lavanda rosat","FAEBD7":"Blanc Antic","FFFFE0":"Groc Clar","F0FFF0":"Verd Pàl·lid","F0FFFF":"Atzur","F0F8FF":"Cian pàlid","E6E6FA":"Lavanda","FFF":"Blanc"},"more":"Més Colors...","panelTitle":"Colors","textColorTitle":"Color del Text"},"colordialog":{"clear":"Neteja","highlight":"Destacat","options":"Opcions del color","selected":"Color Seleccionat","title":"Seleccioni el color"},"templates":{"button":"Plantilles","emptyListMsg":"(No hi ha plantilles definides)","insertOption":"Reemplaça el contingut actual","options":"Opcions de plantilla","selectPromptMsg":"Seleccioneu una plantilla per usar a l'editor<br>(per defecte s'elimina el contingut actual):","title":"Plantilles de contingut"},"contextmenu":{"options":"Opcions del menú contextual"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Títol de guia","cssClassInputLabel":"Classes de la fulla d'estils","edit":"Edita la Capa","inlineStyleInputLabel":"Estil en línia","langDirLTRLabel":"D'esquerra a dreta (LTR)","langDirLabel":"Direcció de l'idioma","langDirRTLLabel":"De dreta a esquerra (RTL)","languageCodeInputLabel":" Codi d'idioma","remove":"Elimina la Capa","styleSelectLabel":"Estil","title":"Crea una Capa Contenidora","toolbar":"Crea una Capa Contenidora"},"toolbar":{"toolbarCollapse":"Redueix la barra d'eines","toolbarExpand":"Amplia la barra d'eines","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor de barra d'eines"},"elementspath":{"eleLabel":"Ruta dels elements","eleTitle":"%1 element"},"find":{"find":"Cerca","findOptions":"Opcions de Cerca","findWhat":"Cerca el:","matchCase":"Distingeix majúscules/minúscules","matchCyclic":"Match cyclic","matchWord":"Només paraules completes","notFoundMsg":"El text especificat no s'ha trobat.","replace":"Reemplaça","replaceAll":"Reemplaça-ho tot","replaceSuccessMsg":"%1 ocurrència/es reemplaçada/es.","replaceWith":"Reemplaça amb:","title":"Cerca i reemplaça"},"fakeobjects":{"anchor":"Àncora","flash":"Animació Flash","hiddenfield":"Camp ocult","iframe":"IFrame","unknown":"Objecte desconegut"},"flash":{"access":"Accés a scripts","accessAlways":"Sempre","accessNever":"Mai","accessSameDomain":"El mateix domini","alignAbsBottom":"Abs Bottom","alignAbsMiddle":"Abs Middle","alignBaseline":"Baseline","alignTextTop":"Text Top","bgcolor":"Color de Fons","chkFull":"Permetre la pantalla completa","chkLoop":"Bucle","chkMenu":"Habilita menú Flash","chkPlay":"Reprodució automàtica","flashvars":"Variables de Flash","hSpace":"Espaiat horit.","properties":"Propietats del Flash","propertiesTab":"Propietats","quality":"Qualitat","qualityAutoHigh":"Alta automàtica","qualityAutoLow":"Baixa automàtica","qualityBest":"La millor","qualityHigh":"Alta","qualityLow":"Baixa","qualityMedium":"Mitjana","scale":"Escala","scaleAll":"Mostra-ho tot","scaleFit":"Mida exacta","scaleNoBorder":"Sense vores","title":"Propietats del Flash","vSpace":"Espaiat vert.","validateHSpace":"L'espaiat horitzonatal ha de ser un nombre.","validateSrc":"Si us plau, escrigui l'enllaç URL","validateVSpace":"L'espaiat vertical ha de ser un nombre.","windowMode":"Mode de la finestra","windowModeOpaque":"Opaca","windowModeTransparent":"Transparent","windowModeWindow":"Finestra"},"font":{"fontSize":{"label":"Mida","voiceLabel":"Mida de la lletra","panelTitle":"Mida"},"label":"Tipus de lletra","panelTitle":"Tipus de lletra","voiceLabel":"Tipus de lletra"},"forms":{"button":{"title":"Propietats del botó","text":"Text (Valor)","type":"Tipus","typeBtn":"Botó","typeSbm":"Transmet formulari","typeRst":"Reinicia formulari"},"checkboxAndRadio":{"checkboxTitle":"Propietats de la casella de verificació","radioTitle":"Propietats del botó d'opció","value":"Valor","selected":"Seleccionat"},"form":{"title":"Propietats del formulari","menu":"Propietats del formulari","action":"Acció","method":"Mètode","encoding":"Codificació"},"hidden":{"title":"Propietats del camp ocult","name":"Nom","value":"Valor"},"select":{"title":"Propietats del camp de selecció","selectInfo":"Info","opAvail":"Opcions disponibles","value":"Valor","size":"Mida","lines":"Línies","chkMulti":"Permet múltiples seleccions","opText":"Text","opValue":"Valor","btnAdd":"Afegeix","btnModify":"Modifica","btnUp":"Amunt","btnDown":"Avall","btnSetValue":"Selecciona per defecte","btnDelete":"Elimina"},"textarea":{"title":"Propietats de l'àrea de text","cols":"Columnes","rows":"Files"},"textfield":{"title":"Propietats del camp de text","name":"Nom","value":"Valor","charWidth":"Amplada","maxChars":"Nombre màxim de caràcters","type":"Tipus","typeText":"Text","typePass":"Contrasenya","typeEmail":"Correu electrònic","typeSearch":"Cercar","typeTel":"Número de telèfon","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adreça","tag_div":"Normal (DIV)","tag_h1":"Encapçalament 1","tag_h2":"Encapçalament 2","tag_h3":"Encapçalament 3","tag_h4":"Encapçalament 4","tag_h5":"Encapçalament 5","tag_h6":"Encapçalament 6","tag_p":"Normal","tag_pre":"Formatejat"},"horizontalrule":{"toolbar":"Insereix línia horitzontal"},"iframe":{"border":"Mostra la vora del marc","noUrl":"Si us plau, introdueixi la URL de l'iframe","scrolling":"Activa les barres de desplaçament","title":"Propietats de l'IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Si us plau, escriviu la URL de la imatge","alt":"Text alternatiu","border":"Vora","btnUpload":"Envia-la al servidor","button2Img":"Voleu transformar el botó d'imatge seleccionat en una simple imatge?","hSpace":"Espaiat horit.","img2Button":"Voleu transformar la imatge seleccionada en un botó d'imatge?","infoTab":"Informació de la imatge","linkTab":"Enllaç","lockRatio":"Bloqueja les proporcions","menu":"Propietats de la imatge","resetSize":"Restaura la mida","title":"Propietats de la imatge","titleButton":"Propietats del botó d'imatge","upload":"Puja","urlMissing":"Falta la URL de la imatge.","vSpace":"Espaiat vert.","validateBorder":"La vora ha de ser un nombre enter.","validateHSpace":"HSpace ha de ser un nombre enter.","validateVSpace":"VSpace ha de ser un nombre enter."},"indent":{"indent":"Augmenta el sagnat","outdent":"Redueix el sagnat"},"smiley":{"options":"Opcions d'emoticones","title":"Insereix una icona","toolbar":"Icona"},"justify":{"block":"Justificat","center":"Centrat","left":"Alinea a l'esquerra","right":"Alinea a la dreta"},"link":{"acccessKey":"Clau d'accés","advanced":"Avançat","advisoryContentType":"Tipus de contingut consultiu","advisoryTitle":"Títol consultiu","anchor":{"toolbar":"Insereix/Edita àncora","menu":"Propietats de l'àncora","title":"Propietats de l'àncora","name":"Nom de l'àncora","errorName":"Si us plau, escriviu el nom de l'ancora","remove":"Remove Anchor"},"anchorId":"Per Id d'element","anchorName":"Per nom d'àncora","charset":"Conjunt de caràcters font enllaçat","cssClasses":"Classes del full d'estil","emailAddress":"Adreça de correu electrònic","emailBody":"Cos del missatge","emailSubject":"Assumpte del missatge","id":"Id","info":"Informació de l'enllaç","langCode":"Direcció de l'idioma","langDir":"Direcció de l'idioma","langDirLTR":"D'esquerra a dreta (LTR)","langDirRTL":"De dreta a esquerra (RTL)","menu":"Edita l'enllaç","name":"Nom","noAnchors":"(No hi ha àncores disponibles en aquest document)","noEmail":"Si us plau, escrigui l'adreça correu electrònic","noUrl":"Si us plau, escrigui l'enllaç URL","other":"<altre>","popupDependent":"Depenent (Netscape)","popupFeatures":"Característiques finestra popup","popupFullScreen":"Pantalla completa (IE)","popupLeft":"Posició esquerra","popupLocationBar":"Barra d'adreça","popupMenuBar":"Barra de menú","popupResizable":"Redimensionable","popupScrollBars":"Barres d'scroll","popupStatusBar":"Barra d'estat","popupToolbar":"Barra d'eines","popupTop":"Posició dalt","rel":"Relació","selectAnchor":"Selecciona una àncora","styles":"Estil","tabIndex":"Index de Tab","target":"Destí","targetFrame":"<marc>","targetFrameName":"Nom del marc de destí","targetPopup":"<finestra emergent>","targetPopupName":"Nom finestra popup","title":"Enllaç","toAnchor":"Àncora en aquesta pàgina","toEmail":"Correu electrònic","toUrl":"URL","toolbar":"Insereix/Edita enllaç","type":"Tipus d'enllaç","unlink":"Elimina l'enllaç","upload":"Puja"},"list":{"bulletedlist":"Llista de pics","numberedlist":"Llista numerada"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insereix el paràgraf aquí"},"maximize":{"maximize":"Maximitza","minimize":"Minimitza"},"newpage":{"toolbar":"Nova pàgina"},"pagebreak":{"alt":"Salt de pàgina","toolbar":"Insereix salt de pàgina"},"pastetext":{"button":"Enganxa com a text no formatat","title":"Enganxa com a text no formatat"},"pastefromword":{"confirmCleanup":"El text que voleu enganxar sembla provenir de Word. Voleu netejar aquest text abans que sigui enganxat?","error":"No ha estat possible netejar les dades enganxades degut a un error intern","title":"Enganxa des del Word","toolbar":"Enganxa des del Word"},"preview":{"preview":"Visualització prèvia"},"print":{"toolbar":"Imprimeix"},"removeformat":{"toolbar":"Elimina Format"},"save":{"toolbar":"Desa"},"selectall":{"toolbar":"Selecciona-ho tot"},"showblocks":{"toolbar":"Mostra els blocs"},"sourcearea":{"toolbar":"Codi font"},"specialchar":{"options":"Opcions de caràcters especials","title":"Selecciona el caràcter especial","toolbar":"Insereix caràcter especial"},"scayt":{"about":"Quant a l'SCAYT","aboutTab":"Quant a","addWord":"Afegeix una paraula","allCaps":"Ignora paraules en majúscules","dic_create":"Crea","dic_delete":"Elimina","dic_field_name":"Nom del diccionari","dic_info":"Inicialment el diccionari d'usuari s'emmagatzema en una galeta. De totes maneres, les galetes tenen la mida limitada. Quan el diccionari creix massa, llavors el diccionari es pot emmagatzemar al nostre servidor. Per desar el vostre diccionari personal al nostre servidor heu d.'especificar un nom pel diccionari. Si ja heu desat un diccionari, teclegeu si us plau el seu nom i cliqueu el botó de restauració.","dic_rename":"Canvia el nom","dic_restore":"Restaura","dictionariesTab":"Diccionaris","disable":"Deshabilita SCAYT","emptyDic":"El nom del diccionari no hauria d'estar buit.","enable":"Habilitat l'SCAYT","ignore":"Ignora","ignoreAll":"Ignora'ls tots","ignoreDomainNames":"Ignora els noms de domini","langs":"Idiomes","languagesTab":"Idiomes","mixedCase":"Ignora paraules amb majúscules i minúscules","mixedWithDigits":"Ignora paraules amb números ","moreSuggestions":"Més suggerències","opera_title":"No és compatible amb l'Opera","options":"Opcions","optionsTab":"Opcions","title":"Spell Check As You Type","toggle":"Commuta l'SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estil","panelTitle":"Estils de format","panelTitle1":"Estils de bloc","panelTitle2":"Estils incrustats","panelTitle3":"Estils d'objecte"},"table":{"border":"Mida vora","caption":"Títol","cell":{"menu":"Cel·la","insertBefore":"Insereix abans","insertAfter":"Insereix després","deleteCell":"Suprimeix","merge":"Fusiona","mergeRight":"Fusiona a la dreta","mergeDown":"Fusiona avall","splitHorizontal":"Divideix horitzontalment","splitVertical":"Divideix verticalment","title":"Propietats de la cel·la","cellType":"Tipus de cel·la","rowSpan":"Expansió de files","colSpan":"Expansió de columnes","wordWrap":"Ajustar al contingut","hAlign":"Alineació Horizontal","vAlign":"Alineació Vertical","alignBaseline":"A la línia base","bgColor":"Color de fons","borderColor":"Color de la vora","data":"Dades","header":"Capçalera","yes":"Sí","no":"No","invalidWidth":"L'amplada de cel·la ha de ser un nombre.","invalidHeight":"L'alçada de cel·la ha de ser un nombre.","invalidRowSpan":"L'expansió de files ha de ser un nombre enter.","invalidColSpan":"L'expansió de columnes ha de ser un nombre enter.","chooseColor":"Trieu"},"cellPad":"Encoixinament de cel·les","cellSpace":"Espaiat de cel·les","column":{"menu":"Columna","insertBefore":"Insereix columna abans de","insertAfter":"Insereix columna darrera","deleteColumn":"Suprimeix una columna"},"columns":"Columnes","deleteTable":"Suprimeix la taula","headers":"Capçaleres","headersBoth":"Ambdues","headersColumn":"Primera columna","headersNone":"Cap","headersRow":"Primera fila","invalidBorder":"El gruix de la vora ha de ser un nombre.","invalidCellPadding":"L'encoixinament de cel·la  ha de ser un nombre.","invalidCellSpacing":"L'espaiat de cel·la  ha de ser un nombre.","invalidCols":"El nombre de columnes ha de ser un nombre major que 0.","invalidHeight":"L'alçada de la taula  ha de ser un nombre.","invalidRows":"El nombre de files ha de ser un nombre major que 0.","invalidWidth":"L'amplada de la taula  ha de ser un nombre.","menu":"Propietats de la taula","row":{"menu":"Fila","insertBefore":"Insereix fila abans de","insertAfter":"Insereix fila darrera","deleteRow":"Suprimeix una fila"},"rows":"Files","summary":"Resum","title":"Propietats de la taula","toolbar":"Taula","widthPc":"percentatge","widthPx":"píxels","widthUnit":"unitat d'amplada"},"undo":{"redo":"Refés","undo":"Desfés"},"wsc":{"btnIgnore":"Ignora","btnIgnoreAll":"Ignora-les totes","btnReplace":"Canvia","btnReplaceAll":"Canvia-les totes","btnUndo":"Desfés","changeTo":"Reemplaça amb","errorLoading":"Error carregant el servidor: %s.","ieSpellDownload":"Verificació ortogràfica no instal·lada. Voleu descarregar-ho ara?","manyChanges":"Verificació ortogràfica: s'han canviat %1 paraules","noChanges":"Verificació ortogràfica: no s'ha canviat cap paraula","noMispell":"Verificació ortogràfica acabada: no hi ha cap paraula mal escrita","noSuggestions":"Cap suggeriment","notAvailable":"El servei no es troba disponible ara.","notInDic":"No és al diccionari","oneChange":"Verificació ortogràfica: s'ha canviat una paraula","progress":"Verificació ortogràfica en curs...","title":"Comprova l'ortografia","toolbar":"Revisa l'ortografia"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/cs.js b/htmltest/sites/all/libraries/ckeditor-version/lang/cs.js
new file mode 100644
index 00000000..12bd6fb0
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/cs.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['cs']={"editor":"Textový editor","common":{"editorHelp":"Stiskněte ALT 0 pro nápovědu","browseServer":"Vybrat na serveru","url":"URL","protocol":"Protokol","upload":"Odeslat","uploadSubmit":"Odeslat na server","image":"Obrázek","flash":"Flash","form":"Formulář","checkbox":"Zaškrtávací políčko","radio":"Přepínač","textField":"Textové pole","textarea":"Textová oblast","hiddenField":"Skryté pole","button":"Tlačítko","select":"Seznam","imageButton":"Obrázkové tlačítko","notSet":"<nenastaveno>","id":"Id","name":"Jméno","langDir":"Směr jazyka","langDirLtr":"Zleva doprava (LTR)","langDirRtl":"Zprava doleva (RTL)","langCode":"Kód jazyka","longDescr":"Dlouhý popis URL","cssClass":"Třída stylu","advisoryTitle":"Pomocný titulek","cssStyle":"Styl","ok":"OK","cancel":"Zrušit","close":"Zavřít","preview":"Náhled","resize":"Uchopit pro změnu velikosti","generalTab":"Obecné","advancedTab":"Rozšířené","validateNumberFailed":"Zadaná hodnota není číselná.","confirmNewPage":"Jakékoliv neuložené změny obsahu budou ztraceny. Skutečně chcete otevřít novou stránku?","confirmCancel":"Některá z nastavení byla změněna. Skutečně chcete zavřít dialogové okno?","options":"Nastavení","target":"Cíl","targetNew":"Nové okno (_blank)","targetTop":"Okno nejvyšší úrovně (_top)","targetSelf":"Stejné okno (_self)","targetParent":"Rodičovské okno (_parent)","langDirLTR":"Zleva doprava (LTR)","langDirRTL":"Zprava doleva (RTL)","styles":"Styly","cssClasses":"Třídy stylů","width":"Šířka","height":"Výška","align":"Zarovnání","alignLeft":"Vlevo","alignRight":"Vpravo","alignCenter":"Na střed","alignTop":"Nahoru","alignMiddle":"Na střed","alignBottom":"Dolů","invalidValue":"Neplatná hodnota.","invalidHeight":"Zadaná výška musí být číslo.","invalidWidth":"Šířka musí být číslo.","invalidCssLength":"Hodnota určená pro pole \"%1\" musí být kladné číslo bez nebo s platnou jednotkou míry CSS (px, %, in, cm, mm, em, ex, pt, nebo pc).","invalidHtmlLength":"Hodnota určená pro pole \"%1\" musí být kladné číslo bez nebo s platnou jednotkou míry HTML (px nebo %).","invalidInlineStyle":"Hodnota určená pro řádkový styl se musí skládat z jedné nebo více n-tic ve formátu \"název : hodnota\", oddělené středníky","cssLengthTooltip":"Zadejte číslo jako hodnotu v pixelech nebo číslo s platnou jednotkou CSS (px, %, v cm, mm, em, ex, pt, nebo pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedostupné</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"O aplikaci CKEditor","help":"Prohlédněte si $1 pro nápovědu.","moreInfo":"Pro informace o lincenci navštivte naši webovou stránku:","title":"O aplikaci CKEditor","userGuide":"Uživatelská příručka CKEditor"},"basicstyles":{"bold":"Tučné","italic":"Kurzíva","strike":"Přeškrtnuté","subscript":"Dolní index","superscript":"Horní index","underline":"Podtržené"},"bidi":{"ltr":"Směr textu zleva doprava","rtl":"Směr textu zprava doleva"},"blockquote":{"toolbar":"Citace"},"clipboard":{"copy":"Kopírovat","copyError":"Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro kopírování zvoleného textu do schránky. Prosím zkopírujte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+C).","cut":"Vyjmout","cutError":"Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro vyjmutí zvoleného textu do schránky. Prosím vyjměte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+X).","paste":"Vložit","pasteArea":"Oblast vkládání","pasteMsg":"Do následujícího pole vložte požadovaný obsah pomocí klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stiskněte <STRONG>OK</STRONG>.","securityMsg":"Z důvodů nastavení bezpečnosti vašeho prohlížeče nemůže editor přistupovat přímo do schránky. Obsah schránky prosím vložte znovu do tohoto okna.","title":"Vložit"},"colorbutton":{"auto":"Automaticky","bgColorTitle":"Barva pozadí","colors":{"000":"Černá","800000":"Kaštanová","8B4513":"Sedlová hněď","2F4F4F":"Tmavě bledě šedá","008080":"Čírka","000080":"Námořnická modř","4B0082":"Inkoustová","696969":"Tmavě šedá","B22222":"Pálená cihla","A52A2A":"Hnědá","DAA520":"Zlatý prut","006400":"Tmavě zelená","40E0D0":"Tyrkisová","0000CD":"Středně modrá","800080":"Purpurová","808080":"Šedá","F00":"Červená","FF8C00":"Tmavě oranžová","FFD700":"Zlatá","008000":"Zelená","0FF":"Azurová","00F":"Modrá","EE82EE":"Fialová","A9A9A9":"Kalně šedá","FFA07A":"Světle lososová","FFA500":"Oranžová","FFFF00":"Žlutá","00FF00":"Limetková","AFEEEE":"Bledě tyrkisová","ADD8E6":"Světle modrá","DDA0DD":"Švestková","D3D3D3":"Světle šedá","FFF0F5":"Levandulově ruměnná","FAEBD7":"Antická bílá","FFFFE0":"Světle žlutá","F0FFF0":"Medová rosa","F0FFFF":"Azurová","F0F8FF":"Alenčina modrá","E6E6FA":"Levandulová","FFF":"Bílá"},"more":"Více barev...","panelTitle":"Barvy","textColorTitle":"Barva textu"},"colordialog":{"clear":"Vyčistit","highlight":"Zvýraznit","options":"Nastavení barvy","selected":"Vybráno","title":"Výběr barvy"},"templates":{"button":"Šablony","emptyListMsg":"(Není definována žádná šablona)","insertOption":"Nahradit aktuální obsah","options":"Nastavení šablon","selectPromptMsg":"Prosím zvolte šablonu pro otevření v editoru<br>(aktuální obsah editoru bude ztracen):","title":"Šablony obsahu"},"contextmenu":{"options":"Nastavení kontextové nabídky"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Nápovědní titulek","cssClassInputLabel":"Třídy stylů","edit":"Změnit Div","inlineStyleInputLabel":"Vnitřní styly","langDirLTRLabel":"Zleva doprava (LTR)","langDirLabel":"Směr jazyka","langDirRTLLabel":"Zprava doleva (RTL)","languageCodeInputLabel":" Kód jazyka","remove":"Odstranit Div","styleSelectLabel":"Styly","title":"Vytvořit Div kontejner","toolbar":"Vytvořit Div kontejner"},"toolbar":{"toolbarCollapse":"Skrýt panel nástrojů","toolbarExpand":"Zobrazit panel nástrojů","toolbarGroups":{"document":"Dokument","clipboard":"Schránka/Zpět","editing":"Úpravy","forms":"Formuláře","basicstyles":"Základní styly","paragraph":"Odstavec","links":"Odkazy","insert":"Vložit","styles":"Styly","colors":"Barvy","tools":"Nástroje"},"toolbars":"Panely nástrojů editoru"},"elementspath":{"eleLabel":"Cesta objektu","eleTitle":"%1 objekt"},"find":{"find":"Hledat","findOptions":"Možnosti hledání","findWhat":"Co hledat:","matchCase":"Rozlišovat velikost písma","matchCyclic":"Procházet opakovaně","matchWord":"Pouze celá slova","notFoundMsg":"Hledaný text nebyl nalezen.","replace":"Nahradit","replaceAll":"Nahradit vše","replaceSuccessMsg":"%1 nahrazení.","replaceWith":"Čím nahradit:","title":"Najít a nahradit"},"fakeobjects":{"anchor":"Záložka","flash":"Flash animace","hiddenfield":"Skryté pole","iframe":"IFrame","unknown":"Neznámý objekt"},"flash":{"access":"Přístup ke skriptu","accessAlways":"Vždy","accessNever":"Nikdy","accessSameDomain":"Ve stejné doméně","alignAbsBottom":"Zcela dolů","alignAbsMiddle":"Doprostřed","alignBaseline":"Na účaří","alignTextTop":"Na horní okraj textu","bgcolor":"Barva pozadí","chkFull":"Povolit celoobrazovkový režim","chkLoop":"Opakování","chkMenu":"Nabídka Flash","chkPlay":"Automatické spuštění","flashvars":"Proměnné pro Flash","hSpace":"Horizontální mezera","properties":"Vlastnosti Flashe","propertiesTab":"Vlastnosti","quality":"Kvalita","qualityAutoHigh":"Vysoká - auto","qualityAutoLow":"Nízká - auto","qualityBest":"Nejlepší","qualityHigh":"Vysoká","qualityLow":"Nejnižší","qualityMedium":"Střední","scale":"Zobrazit","scaleAll":"Zobrazit vše","scaleFit":"Přizpůsobit","scaleNoBorder":"Bez okraje","title":"Vlastnosti Flashe","vSpace":"Vertikální mezera","validateHSpace":"Zadaná horizontální mezera musí být číslo.","validateSrc":"Zadejte prosím URL odkazu","validateVSpace":"Zadaná vertikální mezera musí být číslo.","windowMode":"Režim okna","windowModeOpaque":"Neprůhledné","windowModeTransparent":"Průhledné","windowModeWindow":"Okno"},"font":{"fontSize":{"label":"Velikost","voiceLabel":"Velikost písma","panelTitle":"Velikost"},"label":"Písmo","panelTitle":"Písmo","voiceLabel":"Písmo"},"forms":{"button":{"title":"Vlastnosti tlačítka","text":"Popisek","type":"Typ","typeBtn":"Tlačítko","typeSbm":"Odeslat","typeRst":"Obnovit"},"checkboxAndRadio":{"checkboxTitle":"Vlastnosti zaškrtávacího políčka","radioTitle":"Vlastnosti přepínače","value":"Hodnota","selected":"Zaškrtnuto"},"form":{"title":"Vlastnosti formuláře","menu":"Vlastnosti formuláře","action":"Akce","method":"Metoda","encoding":"Kódování"},"hidden":{"title":"Vlastnosti skrytého pole","name":"Název","value":"Hodnota"},"select":{"title":"Vlastnosti seznamu","selectInfo":"Info","opAvail":"Dostupná nastavení","value":"Hodnota","size":"Velikost","lines":"Řádků","chkMulti":"Povolit mnohonásobné výběry","opText":"Text","opValue":"Hodnota","btnAdd":"Přidat","btnModify":"Změnit","btnUp":"Nahoru","btnDown":"Dolů","btnSetValue":"Nastavit jako vybranou hodnotu","btnDelete":"Smazat"},"textarea":{"title":"Vlastnosti textové oblasti","cols":"Sloupců","rows":"Řádků"},"textfield":{"title":"Vlastnosti textového pole","name":"Název","value":"Hodnota","charWidth":"Šířka ve znacích","maxChars":"Maximální počet znaků","type":"Typ","typeText":"Text","typePass":"Heslo","typeEmail":"Email","typeSearch":"Hledat","typeTel":"Telefonní číslo","typeUrl":"URL"}},"format":{"label":"Formát","panelTitle":"Formát","tag_address":"Adresa","tag_div":"Normální (DIV)","tag_h1":"Nadpis 1","tag_h2":"Nadpis 2","tag_h3":"Nadpis 3","tag_h4":"Nadpis 4","tag_h5":"Nadpis 5","tag_h6":"Nadpis 6","tag_p":"Normální","tag_pre":"Naformátováno"},"horizontalrule":{"toolbar":"Vložit vodorovnou linku"},"iframe":{"border":"Zobrazit okraj","noUrl":"Zadejte prosím URL obsahu pro IFrame","scrolling":"Zapnout posuvníky","title":"Vlastnosti IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Zadejte prosím URL obrázku","alt":"Alternativní text","border":"Okraje","btnUpload":"Odeslat na server","button2Img":"Skutečně chcete převést zvolené obrázkové tlačítko na obyčejný obrázek?","hSpace":"Horizontální mezera","img2Button":"Skutečně chcete převést zvolený obrázek na obrázkové tlačítko?","infoTab":"Informace o obrázku","linkTab":"Odkaz","lockRatio":"Zámek","menu":"Vlastnosti obrázku","resetSize":"Původní velikost","title":"Vlastnosti obrázku","titleButton":"Vlastností obrázkového tlačítka","upload":"Odeslat","urlMissing":"Zadané URL zdroje obrázku nebylo nalezeno.","vSpace":"Vertikální mezera","validateBorder":"Okraj musí být nastaven v celých číslech.","validateHSpace":"Horizontální mezera musí být nastavena v celých číslech.","validateVSpace":"Vertikální mezera musí být nastavena v celých číslech."},"indent":{"indent":"Zvětšit odsazení","outdent":"Zmenšit odsazení"},"smiley":{"options":"Nastavení smajlíků","title":"Vkládání smajlíků","toolbar":"Smajlíci"},"justify":{"block":"Zarovnat do bloku","center":"Zarovnat na střed","left":"Zarovnat vlevo","right":"Zarovnat vpravo"},"link":{"acccessKey":"Přístupový klíč","advanced":"Rozšířené","advisoryContentType":"Pomocný typ obsahu","advisoryTitle":"Pomocný titulek","anchor":{"toolbar":"Záložka","menu":"Vlastnosti záložky","title":"Vlastnosti záložky","name":"Název záložky","errorName":"Zadejte prosím název záložky","remove":"Odstranit záložku"},"anchorId":"Podle Id objektu","anchorName":"Podle jména kotvy","charset":"Přiřazená znaková sada","cssClasses":"Třída stylu","emailAddress":"E-mailová adresa","emailBody":"Tělo zprávy","emailSubject":"Předmět zprávy","id":"Id","info":"Informace o odkazu","langCode":"Kód jazyka","langDir":"Směr jazyka","langDirLTR":"Zleva doprava (LTR)","langDirRTL":"Zprava doleva (RTL)","menu":"Změnit odkaz","name":"Jméno","noAnchors":"(Ve stránce není definována žádná kotva!)","noEmail":"Zadejte prosím e-mailovou adresu","noUrl":"Zadejte prosím URL odkazu","other":"<jiný>","popupDependent":"Závislost (Netscape)","popupFeatures":"Vlastnosti vyskakovacího okna","popupFullScreen":"Celá obrazovka (IE)","popupLeft":"Levý okraj","popupLocationBar":"Panel umístění","popupMenuBar":"Panel nabídky","popupResizable":"Umožňující měnit velikost","popupScrollBars":"Posuvníky","popupStatusBar":"Stavový řádek","popupToolbar":"Panel nástrojů","popupTop":"Horní okraj","rel":"Vztah","selectAnchor":"Vybrat kotvu","styles":"Styl","tabIndex":"Pořadí prvku","target":"Cíl","targetFrame":"<rámec>","targetFrameName":"Název cílového rámu","targetPopup":"<vyskakovací okno>","targetPopupName":"Název vyskakovacího okna","title":"Odkaz","toAnchor":"Kotva v této stránce","toEmail":"E-mail","toUrl":"URL","toolbar":"Odkaz","type":"Typ odkazu","unlink":"Odstranit odkaz","upload":"Odeslat"},"list":{"bulletedlist":"Odrážky","numberedlist":"Číslování"},"liststyle":{"armenian":"Arménské","bulletedTitle":"Vlastnosti odrážek","circle":"Kroužky","decimal":"Arabská čísla (1, 2, 3, atd.)","decimalLeadingZero":"Arabská čísla uvozená nulou (01, 02, 03, atd.)","disc":"Kolečka","georgian":"Gruzínské (an, ban, gan, atd.)","lowerAlpha":"Malá latinka (a, b, c, d, e, atd.)","lowerGreek":"Malé řecké (alpha, beta, gamma, atd.)","lowerRoman":"Malé římské (i, ii, iii, iv, v, atd.)","none":"Nic","notset":"<nenastaveno>","numberedTitle":"Vlastnosti číslování","square":"Čtverce","start":"Počátek","type":"Typ","upperAlpha":"Velká latinka (A, B, C, D, E, atd.)","upperRoman":"Velké římské (I, II, III, IV, V, atd.)","validateStartNumber":"Číslování musí začínat celým číslem."},"magicline":{"title":"zde vložit odstavec"},"maximize":{"maximize":"Maximalizovat","minimize":"Minimalizovat"},"newpage":{"toolbar":"Nová stránka"},"pagebreak":{"alt":"Konec stránky","toolbar":"Vložit konec stránky"},"pastetext":{"button":"Vložit jako čistý text","title":"Vložit jako čistý text"},"pastefromword":{"confirmCleanup":"Jak je vidět, vkládaný text je kopírován z Wordu. Chcete jej před vložením vyčistit?","error":"Z důvodu vnitřní chyby nebylo možné provést vyčištění vkládaného textu.","title":"Vložit z Wordu","toolbar":"Vložit z Wordu"},"preview":{"preview":"Náhled"},"print":{"toolbar":"Tisk"},"removeformat":{"toolbar":"Odstranit formátování"},"save":{"toolbar":"Uložit"},"selectall":{"toolbar":"Vybrat vše"},"showblocks":{"toolbar":"Ukázat bloky"},"sourcearea":{"toolbar":"Zdroj"},"specialchar":{"options":"Nastavení speciálních znaků","title":"Výběr speciálního znaku","toolbar":"Vložit speciální znaky"},"scayt":{"about":"O aplikaci SCAYT","aboutTab":"O aplikaci","addWord":"Přidat slovo","allCaps":"Ignorovat slova tvořená velkými písmeny","dic_create":"Vytvořit","dic_delete":"Smazat","dic_field_name":"Název slovníku","dic_info":"Zpočátku se uživatelský slovník ukládá do cookies ve vašem prohlížeči. Ovšem cookies mají omezenou velikost, takže když slovník dosáhne velikosti, kdy se již do cookies nevejde, může být uložen na našem serveru. Chcete-li uložit váš osobní slovník na našem serveru, je třeba slovník nejdříve pojmenovat. Máte-li již slovník pojmenován a uložen, zadejte jeho název a klepněte na tlačítko Obnovit.","dic_rename":"Přejmenovat","dic_restore":"Obnovit","dictionariesTab":"Slovníky","disable":"Vypnout SCAYT","emptyDic":"Název slovníku nesmí být prázdný.","enable":"Zapnout SCAYT","ignore":"Přeskočit","ignoreAll":"Přeskočit vše","ignoreDomainNames":"Ignorovat doménová jména","langs":"Jazyky","languagesTab":"Jazyky","mixedCase":"Ignorovat slova obsahující různou velikost písma","mixedWithDigits":"Ignorovat slova obsahující čísla","moreSuggestions":"Více návrhů","opera_title":"Toto Opera nepodporuje","options":"Nastavení","optionsTab":"Nastavení","title":"Kontrola pravopisu během psaní (SCAYT)","toggle":"Vypínač SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styl","panelTitle":"Formátovací styly","panelTitle1":"Blokové styly","panelTitle2":"Řádkové styly","panelTitle3":"Objektové styly"},"table":{"border":"Ohraničení","caption":"Popis","cell":{"menu":"Buňka","insertBefore":"Vložit buňku před","insertAfter":"Vložit buňku za","deleteCell":"Smazat buňky","merge":"Sloučit buňky","mergeRight":"Sloučit doprava","mergeDown":"Sloučit dolů","splitHorizontal":"Rozdělit buňky vodorovně","splitVertical":"Rozdělit buňky svisle","title":"Vlastnosti buňky","cellType":"Typ buňky","rowSpan":"Spojit řádky","colSpan":"Spojit sloupce","wordWrap":"Zalamování","hAlign":"Vodorovné zarovnání","vAlign":"Svislé zarovnání","alignBaseline":"Na účaří","bgColor":"Barva pozadí","borderColor":"Barva okraje","data":"Data","header":"Hlavička","yes":"Ano","no":"Ne","invalidWidth":"Šířka buňky musí být číslo.","invalidHeight":"Zadaná výška buňky musí být číslená.","invalidRowSpan":"Zadaný počet sloučených řádků musí být celé číslo.","invalidColSpan":"Zadaný počet sloučených sloupců musí být celé číslo.","chooseColor":"Výběr"},"cellPad":"Odsazení obsahu v buňce","cellSpace":"Vzdálenost buněk","column":{"menu":"Sloupec","insertBefore":"Vložit sloupec před","insertAfter":"Vložit sloupec za","deleteColumn":"Smazat sloupec"},"columns":"Sloupce","deleteTable":"Smazat tabulku","headers":"Záhlaví","headersBoth":"Obojí","headersColumn":"První sloupec","headersNone":"Žádné","headersRow":"První řádek","invalidBorder":"Zdaná velikost okraje musí být číselná.","invalidCellPadding":"Zadané odsazení obsahu v buňce musí být číselné.","invalidCellSpacing":"Zadaná vzdálenost buněk musí být číselná.","invalidCols":"Počet sloupců musí být číslo větší než 0.","invalidHeight":"Zadaná výška tabulky musí být číselná.","invalidRows":"Počet řádků musí být číslo větší než 0.","invalidWidth":"Šířka tabulky musí být číslo.","menu":"Vlastnosti tabulky","row":{"menu":"Řádek","insertBefore":"Vložit řádek před","insertAfter":"Vložit řádek za","deleteRow":"Smazat řádky"},"rows":"Řádky","summary":"Souhrn","title":"Vlastnosti tabulky","toolbar":"Tabulka","widthPc":"procent","widthPx":"bodů","widthUnit":"jednotka šířky"},"undo":{"redo":"Znovu","undo":"Zpět"},"wsc":{"btnIgnore":"Přeskočit","btnIgnoreAll":"Přeskakovat vše","btnReplace":"Zaměnit","btnReplaceAll":"Zaměňovat vše","btnUndo":"Zpět","changeTo":"Změnit na","errorLoading":"Chyba nahrávání služby aplikace z: %s.","ieSpellDownload":"Kontrola pravopisu není nainstalována. Chcete ji nyní stáhnout?","manyChanges":"Kontrola pravopisu dokončena: %1 slov změněno","noChanges":"Kontrola pravopisu dokončena: Beze změn","noMispell":"Kontrola pravopisu dokončena: Žádné pravopisné chyby nenalezeny","noSuggestions":"- žádné návrhy -","notAvailable":"Omlouváme se, ale služba nyní není dostupná.","notInDic":"Není ve slovníku","oneChange":"Kontrola pravopisu dokončena: Jedno slovo změněno","progress":"Probíhá kontrola pravopisu...","title":"Kontrola pravopisu","toolbar":"Zkontrolovat pravopis"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/cy.js b/htmltest/sites/all/libraries/ckeditor-version/lang/cy.js
new file mode 100644
index 00000000..27cd86e2
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/cy.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['cy']={"editor":"Golygydd Testun Cyfoethog","common":{"editorHelp":"Gwasgwch ALT 0 am gymorth","browseServer":"Pori'r Gweinydd","url":"URL","protocol":"Protocol","upload":"Lanlwytho","uploadSubmit":"Anfon i'r Gweinydd","image":"Delwedd","flash":"Flash","form":"Ffurflen","checkbox":"Blwch ticio","radio":"Botwm Radio","textField":"Maes Testun","textarea":"Ardal Testun","hiddenField":"Maes Cudd","button":"Botwm","select":"Maes Dewis","imageButton":"Botwm Delwedd","notSet":"<heb osod>","id":"Id","name":"Name","langDir":"Cyfeiriad Iaith","langDirLtr":"Chwith i'r Dde (LTR)","langDirRtl":"Dde i'r Chwith (RTL)","langCode":"Cod Iaith","longDescr":"URL Disgrifiad Hir","cssClass":"Dosbarthiadau Dalen Arddull","advisoryTitle":"Teitl Cynghorol","cssStyle":"Arddull","ok":"Iawn","cancel":"Diddymu","close":"Cau","preview":"Rhagolwg","resize":"Ailfeintio","generalTab":"Cyffredinol","advancedTab":"Uwch","validateNumberFailed":"'Dyw'r gwerth hwn ddim yn rhif.","confirmNewPage":"Byddwch chi'n colli unrhyw newidiadau i'r cynnwys sydd heb eu cadw. Ydych am barhau i lwytho tudalen newydd?","confirmCancel":"Cafodd rhai o'r opsiynau eu newid. Ydych chi wir am gau'r deialog?","options":"Opsiynau","target":"Targed","targetNew":"Ffenest Newydd (_blank)","targetTop":"Ffenest ar y Brig (_top)","targetSelf":"Yr un Ffenest (_self)","targetParent":"Ffenest y Rhiant (_parent)","langDirLTR":"Chwith i'r Dde (LTR)","langDirRTL":"Dde i'r Chwith (RTL)","styles":"Arddull","cssClasses":"Dosbarthiadau Dalen Arddull","width":"Lled","height":"Uchder","align":"Alinio","alignLeft":"Chwith","alignRight":"Dde","alignCenter":"Canol","alignTop":"Brig","alignMiddle":"Canol","alignBottom":"Gwaelod","invalidValue":"Gwerth annilys.","invalidHeight":"Mae'n rhaid i'r uchder fod yn rhif.","invalidWidth":"Mae'n rhaid i'r lled fod yn rhif.","invalidCssLength":"Mae'n rhaid i'r gwerth ar gyfer maes \"%1\" fod yn rhif positif gyda neu heb uned fesuriad CSS dilys (px, %, in, cm, mm, em, ex, pt, neu pc).","invalidHtmlLength":"Mae'n rhaid i'r gwerth ar gyfer maes \"%1\" fod yn rhif positif gyda neu heb uned fesuriad HTML dilys (px neu %).","invalidInlineStyle":"Mae'n rhaid i'r gwerth ar gyfer arddull mewn-llinell gynnwys un set neu fwy ar y fformat \"enw : gwerth\", wedi'u gwahanu gyda hanner colon.","cssLengthTooltip":"Rhowch rif am werth mewn picsel neu rhif gydag uned CSS dilys (px, %, in, cm, mm, em, pt neu pc).","unavailable":"%1<span class=\"cke_accessibility\">, ddim ar gael</span>"},"about":{"copy":"Hawlfraint &copy; $1. Cedwir pob hawl.","dlgTitle":"Ynghylch CKEditor","help":"Gwirio $1 am gymorth.","moreInfo":"Am wybodaeth ynghylch trwyddedau, ewch i'n gwefan:","title":"Ynghylch CKEditor","userGuide":"Canllawiau Defnyddiwr CKEditor"},"basicstyles":{"bold":"Bras","italic":"Italig","strike":"Llinell Trwyddo","subscript":"Is-sgript","superscript":"Uwchsgript","underline":"Tanlinellu"},"bidi":{"ltr":"Cyfeiriad testun o'r chwith i'r dde","rtl":"Cyfeiriad testun o'r dde i'r chwith"},"blockquote":{"toolbar":"Dyfyniad bloc"},"clipboard":{"copy":"Copïo","copyError":"'Dyw gosodiadau diogelwch eich porwr ddim yn caniatàu'r golygydd i gynnal 'gweithredoedd copïo' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+C).","cut":"Torri","cutError":"Nid yw gosodiadau diogelwch eich porwr yn caniatàu'r golygydd i gynnal 'gweithredoedd torri' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+X).","paste":"Gludo","pasteArea":"Ardal Gludo","pasteMsg":"Gludwch i mewn i'r blwch canlynol gan ddefnyddio'r bysellfwrdd (<strong>Ctrl/Cmd+V</strong>) a phwyso <strong>Iawn</strong>.","securityMsg":"Oherwydd gosodiadau diogelwch eich porwr, 'dyw'r porwr ddim yn gallu ennill mynediad i'r data ar y clipfwrdd yn uniongyrchol. Mae angen i chi ei ludo eto i'r ffenestr hon.","title":"Gludo"},"colorbutton":{"auto":"Awtomatig","bgColorTitle":"Lliw Cefndir","colors":{"000":"Du","800000":"Marwn","8B4513":"Brown Cyfrwy","2F4F4F":"Llechen Tywyll","008080":"Corhwyad","000080":"Nefi","4B0082":"Indigo","696969":"Llwyd Tywyll","B22222":"Bric Tân","A52A2A":"Brown","DAA520":"Rhoden Aur","006400":"Gwyrdd Tywyll","40E0D0":"Gwyrddlas","0000CD":"Glas Canolig","800080":"Porffor","808080":"Llwyd","F00":"Coch","FF8C00":"Oren Tywyll","FFD700":"Aur","008000":"Gwyrdd","0FF":"Cyan","00F":"Glas","EE82EE":"Fioled","A9A9A9":"Llwyd Pwl","FFA07A":"Samwn Golau","FFA500":"Oren","FFFF00":"Melyn","00FF00":"Leim","AFEEEE":"Gwyrddlas Golau","ADD8E6":"Glas Golau","DDA0DD":"Eirinen","D3D3D3":"Llwyd Golau","FFF0F5":"Gwrid Lafant","FAEBD7":"Gwyn Hynafol","FFFFE0":"Melyn Golau","F0FFF0":"Melwn Gwyrdd Golau","F0FFFF":"Aswr","F0F8FF":"Glas Alys","E6E6FA":"Lafant","FFF":"Gwyn"},"more":"Mwy o Liwiau...","panelTitle":"Lliwiau","textColorTitle":"Lliw Testun"},"colordialog":{"clear":"Clirio","highlight":"Uwcholeuo","options":"Opsiynau Lliw","selected":"Lliw a Ddewiswyd","title":"Dewis lliw"},"templates":{"button":"Templedi","emptyListMsg":"(Dim templedi wedi'u diffinio)","insertOption":"Amnewid y cynnwys go iawn","options":"Opsiynau Templedi","selectPromptMsg":"Dewiswch dempled i'w agor yn y golygydd","title":"Templedi Cynnwys"},"contextmenu":{"options":"Opsiynau Dewislen Cyd-destun"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Teitl Cynghorol","cssClassInputLabel":"Dosbarthiadau Ffeil Ddiwyg","edit":"Golygu Div","inlineStyleInputLabel":"Arddull Mewn Llinell","langDirLTRLabel":"Chwith i'r Dde (LTR)","langDirLabel":"Cyfeiriad yr Iaith","langDirRTLLabel":"Dde i'r Chwith (RTL)","languageCodeInputLabel":" Cod Iaith","remove":"Tynnu Div","styleSelectLabel":"Arddull","title":"Creu Cynhwysydd Div","toolbar":"Creu Cynhwysydd Div"},"toolbar":{"toolbarCollapse":"Cyfangu'r Bar Offer","toolbarExpand":"Ehangu'r Bar Offer","toolbarGroups":{"document":"Dogfen","clipboard":"Clipfwrdd/Dadwneud","editing":"Golygu","forms":"Ffurflenni","basicstyles":"Arddulliau Sylfaenol","paragraph":"Paragraff","links":"Dolenni","insert":"Mewnosod","styles":"Arddulliau","colors":"Lliwiau","tools":"Offer"},"toolbars":"Bariau offer golygydd"},"elementspath":{"eleLabel":"Llwybr elfennau","eleTitle":"Elfen %1"},"find":{"find":"Chwilio","findOptions":"Chwilio Opsiynau","findWhat":"Chwilio'r term:","matchCase":"Cyfateb i'r cas","matchCyclic":"Cyfateb cylchol","matchWord":"Cyfateb gair cyfan","notFoundMsg":"Nid oedd y testun wedi'i ddarganfod.","replace":"Amnewid","replaceAll":"Amnewid pob un","replaceSuccessMsg":"Amnewidiwyd %1 achlysur.","replaceWith":"Amnewid gyda:","title":"Chwilio ac Amnewid"},"fakeobjects":{"anchor":"Angor","flash":"Animeiddiant Flash","hiddenfield":"Maes Cudd","iframe":"IFrame","unknown":"Gwrthrych Anhysbys"},"flash":{"access":"Mynediad Sgript","accessAlways":"Pob amser","accessNever":"Byth","accessSameDomain":"R'un parth","alignAbsBottom":"Gwaelod Abs","alignAbsMiddle":"Canol Abs","alignBaseline":"Baslinell","alignTextTop":"Testun Top","bgcolor":"Lliw cefndir","chkFull":"Caniatàu Sgrin Llawn","chkLoop":"Lwpio","chkMenu":"Galluogi Dewislen Flash","chkPlay":"AwtoChwarae","flashvars":"Newidynnau ar gyfer Flash","hSpace":"BwlchLl","properties":"Priodweddau Flash","propertiesTab":"Priodweddau","quality":"Ansawdd","qualityAutoHigh":"Uchel Awto","qualityAutoLow":"Isel Awto","qualityBest":"Gorau","qualityHigh":"Uchel","qualityLow":"Isel","qualityMedium":"Canolig","scale":"Graddfa","scaleAll":"Dangos pob","scaleFit":"Ffit Union","scaleNoBorder":"Dim Ymyl","title":"Priodweddau Flash","vSpace":"BwlchF","validateHSpace":"Rhaid i'r BwlchLl fod yn rhif.","validateSrc":"Ni all yr URL fod yn wag.","validateVSpace":"Rhaid i'r BwlchF fod yn rhif.","windowMode":"Modd ffenestr","windowModeOpaque":"Afloyw","windowModeTransparent":"Tryloyw","windowModeWindow":"Ffenestr"},"font":{"fontSize":{"label":"Maint","voiceLabel":"Maint y Ffont","panelTitle":"Maint y Ffont"},"label":"Ffont","panelTitle":"Enw'r Ffont","voiceLabel":"Ffont"},"forms":{"button":{"title":"Priodweddau Botymau","text":"Testun (Gwerth)","type":"Math","typeBtn":"Botwm","typeSbm":"Gyrru","typeRst":"Ailosod"},"checkboxAndRadio":{"checkboxTitle":"Priodweddau Blwch Ticio","radioTitle":"Priodweddau Botwm Radio","value":"Gwerth","selected":"Dewiswyd"},"form":{"title":"Priodweddau Ffurflen","menu":"Priodweddau Ffurflen","action":"Gweithred","method":"Dull","encoding":"Amgodio"},"hidden":{"title":"Priodweddau Maes Cudd","name":"Enw","value":"Gwerth"},"select":{"title":"Priodweddau Maes Dewis","selectInfo":"Gwyb Dewis","opAvail":"Opsiynau ar Gael","value":"Gwerth","size":"Maint","lines":"llinellau","chkMulti":"Caniatàu aml-ddewisiadau","opText":"Testun","opValue":"Gwerth","btnAdd":"Ychwanegu","btnModify":"Newid","btnUp":"Lan","btnDown":"Lawr","btnSetValue":"Gosod fel gwerth a ddewiswyd","btnDelete":"Dileu"},"textarea":{"title":"Priodweddau Ardal Testun","cols":"Colofnau","rows":"Rhesi"},"textfield":{"title":"Priodweddau Maes Testun","name":"Enw","value":"Gwerth","charWidth":"Lled Nod","maxChars":"Uchafswm y Nodau","type":"Math","typeText":"Testun","typePass":"Cyfrinair","typeEmail":"Ebost","typeSearch":"Chwilio","typeTel":"Rhif Ffôn","typeUrl":"URL"}},"format":{"label":"Fformat","panelTitle":"Fformat Paragraff","tag_address":"Cyfeiriad","tag_div":"Normal (DIV)","tag_h1":"Pennawd 1","tag_h2":"Pennawd 2","tag_h3":"Pennawd 3","tag_h4":"Pennawd 4","tag_h5":"Pennawd 5","tag_h6":"Pennawd 6","tag_p":"Normal","tag_pre":"Wedi'i Fformatio"},"horizontalrule":{"toolbar":"Mewnosod Llinell Lorweddol"},"iframe":{"border":"Dangos ymyl y ffrâm","noUrl":"Rhowch fath URL yr iframe","scrolling":"Galluogi bariau sgrolio","title":"Priodweddau IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Rhowch URL y ddelwedd","alt":"Testun Amgen","border":"Ymyl","btnUpload":"Anfon i'r Gweinydd","button2Img":"Ydych am drawsffurfio'r botwm ddelwedd hwn ar ddelwedd syml?","hSpace":"BwlchLl","img2Button":"Ydych am drawsffurfio'r ddelwedd hon ar fotwm delwedd?","infoTab":"Gwyb Delwedd","linkTab":"Dolen","lockRatio":"Cloi Cymhareb","menu":"Priodweddau Delwedd","resetSize":"Ailosod Maint","title":"Priodweddau Delwedd","titleButton":"Priodweddau Botwm Delwedd","upload":"lanlwytho","urlMissing":"URL gwreiddiol y ddelwedd ar goll.","vSpace":"BwlchF","validateBorder":"Rhaid i'r ymyl fod yn gyfanrif.","validateHSpace":"Rhaid i'r HSpace fod yn gyfanrif.","validateVSpace":"Rhaid i'r VSpace fod yn gyfanrif."},"indent":{"indent":"Cynyddu'r Mewnoliad","outdent":"Lleihau'r Mewnoliad"},"smiley":{"options":"Opsiynau Gwenogluniau","title":"Mewnosod Gwenoglun","toolbar":"Gwenoglun"},"justify":{"block":"Aliniad Bloc","center":"Alinio i'r Canol","left":"Alinio i'r Chwith","right":"Alinio i'r Dde"},"link":{"acccessKey":"Allwedd Mynediad","advanced":"Uwch","advisoryContentType":"Math y Cynnwys Cynghorol","advisoryTitle":"Teitl Cynghorol","anchor":{"toolbar":"Angor","menu":"Golygwch yr Angor","title":"Priodweddau'r Angor","name":"Enw'r Angor","errorName":"Teipiwch enw'r angor","remove":"Tynnwch yr Angor"},"anchorId":"Gan Id yr Elfen","anchorName":"Gan Enw'r Angor","charset":"Set nodau'r Adnodd Cysylltiedig","cssClasses":"Dosbarthiadau Dalen Arddull","emailAddress":"Cyfeiriad E-Bost","emailBody":"Pwnc y Neges","emailSubject":"Testun y Message Subject","id":"Id","info":"Gwyb ar y Ddolen","langCode":"Cod Iaith","langDir":"Cyfeiriad Iaith","langDirLTR":"Chwith i'r Dde (LTR)","langDirRTL":"Dde i'r Chwith (RTL)","menu":"Golygu Dolen","name":"Enw","noAnchors":"(Dim angorau ar gael yn y ddogfen)","noEmail":"Teipiwch gyfeiriad yr e-bost","noUrl":"Teipiwch URL y ddolen","other":"<eraill>","popupDependent":"Dibynnol (Netscape)","popupFeatures":"Nodweddion Ffenestr Bop","popupFullScreen":"Sgrin Llawn (IE)","popupLeft":"Safle Chwith","popupLocationBar":"Bar Safle","popupMenuBar":"Dewislen","popupResizable":"Ailfeintiol","popupScrollBars":"Barrau Sgrolio","popupStatusBar":"Bar Statws","popupToolbar":"Bar Offer","popupTop":"Safle Top","rel":"Perthynas","selectAnchor":"Dewiswch Angor","styles":"Arddull","tabIndex":"Indecs Tab","target":"Targed","targetFrame":"<ffrâm>","targetFrameName":"Enw Ffrâm y Targed","targetPopup":"<ffenestr bop>","targetPopupName":"Enw Ffenestr Bop","title":"Dolen","toAnchor":"Dolen at angor yn y testun","toEmail":"E-bost","toUrl":"URL","toolbar":"Dolen","type":"Math y Ddolen","unlink":"Datgysylltu","upload":"Lanlwytho"},"list":{"bulletedlist":"Mewnosod/Tynnu Rhestr Bwled","numberedlist":"Mewnosod/Tynnu Rhestr Rhifol"},"liststyle":{"armenian":"Rhifau Armeneg","bulletedTitle":"Priodweddau Rhestr Fwled","circle":"Cylch","decimal":"Degol (1, 2, 3, ayyb.)","decimalLeadingZero":"Degol â sero arweiniol (01, 02, 03, ayyb.)","disc":"Disg","georgian":"Rhifau Sioraidd (an, ban, gan, ayyb.)","lowerAlpha":"Alffa Is (a, b, c, d, e, ayyb.)","lowerGreek":"Groeg Is (alpha, beta, gamma, ayyb.)","lowerRoman":"Rhufeinig Is (i, ii, iii, iv, v, ayyb.)","none":"Dim","notset":"<heb osod>","numberedTitle":"Priodweddau Rhestr Rifol","square":"Sgwâr","start":"Dechrau","type":"Math","upperAlpha":"Alffa Uwch (A, B, C, D, E, ayyb.)","upperRoman":"Rhufeinig Uwch (I, II, III, IV, V, ayyb.)","validateStartNumber":"Rhaid bod y rhif cychwynnol yn gyfanrif."},"magicline":{"title":"Mewnosod paragraff yma"},"maximize":{"maximize":"Mwyhau","minimize":"Lleihau"},"newpage":{"toolbar":"Tudalen newydd"},"pagebreak":{"alt":"Toriad Tudalen","toolbar":"Mewnosod Toriad Tudalen i Argraffu"},"pastetext":{"button":"Gludo fel testun plaen","title":"Gludo fel Testun Plaen"},"pastefromword":{"confirmCleanup":"Mae'r testun rydych chi am ludo wedi'i gopïo o Word. Ydych chi am ei lanhau cyn ei ludo?","error":"Doedd dim modd glanhau y data a ludwyd oherwydd gwall mewnol","title":"Gludo o Word","toolbar":"Gludo o Word"},"preview":{"preview":"Rhagolwg"},"print":{"toolbar":"Argraffu"},"removeformat":{"toolbar":"Tynnu Fformat"},"save":{"toolbar":"Cadw"},"selectall":{"toolbar":"Dewis Popeth"},"showblocks":{"toolbar":"Dangos Blociau"},"sourcearea":{"toolbar":"HTML"},"specialchar":{"options":"Opsiynau Nodau Arbennig","title":"Dewis Nod Arbennig","toolbar":"Mewnosod Nod Arbennig"},"scayt":{"about":"Ynghylch SCAYT","aboutTab":"Ynghylch","addWord":"Ychwanegu Gair","allCaps":"Anwybyddu Geiriau Nodau Uwch i Gyd","dic_create":"Creu","dic_delete":"Dileu","dic_field_name":"Enw'r geiriadur","dic_info":"Ar y cychwyn, caiff y Geiriadur ei storio mewn Cwci. Er, mae terfyn ar faint cwcis. Pan fydd Gweiriadur Defnyddiwr yn tyfu tu hwnt i gyfyngiadau maint Cwci, caiff y geiriadur ei storio ar ein gweinydd ni. er mwyn storio eich geiriadur poersonol chi ar ein gweinydd, bydd angen i chi osod enw ar gyfer y geiriadur. Os oes geiriadur 'da chi ar ein gweinydd yn barod, teipiwch ei enw a chliciwch y botwm Adfer.","dic_rename":"Ailenwi","dic_restore":"Adfer","dictionariesTab":"Geiriaduron","disable":"Analluogi SCAYT","emptyDic":"Ni ddylai enw'r geiriadur fod yn wag.","enable":"Galluogi SCAYT","ignore":"Anwybyddu","ignoreAll":"Anwybyddu pob","ignoreDomainNames":"Anwybyddu Enwau Parth","langs":"Ieithoedd","languagesTab":"Ieithoedd","mixedCase":"Anwybyddu Geiriau â Chymysgedd Nodau Uwch ac Is","mixedWithDigits":"Anwybyddu Geiriau â Rhifau","moreSuggestions":"Awgrymiadau pellach","opera_title":"Heb ei gynnal gan Opera","options":"Opsiynau","optionsTab":"Opsiynau","title":"Gwirio'r Sillafu Wrth Deipio","toggle":"Togl SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Arddulliau","panelTitle":"Arddulliau Fformatio","panelTitle1":"Arddulliau Bloc","panelTitle2":"Arddulliau Mewnol","panelTitle3":"Arddulliau Gwrthrych"},"table":{"border":"Maint yr Ymyl","caption":"Pennawd","cell":{"menu":"Cell","insertBefore":"Mewnosod Cell Cyn","insertAfter":"Mewnosod Cell Ar Ôl","deleteCell":"Dileu Celloedd","merge":"Cyfuno Celloedd","mergeRight":"Cyfuno i'r Dde","mergeDown":"Cyfuno i Lawr","splitHorizontal":"Hollti'r Gell yn Lorweddol","splitVertical":"Hollti'r Gell yn Fertigol","title":"Priodweddau'r Gell","cellType":"Math y Gell","rowSpan":"Rhychwant Rhesi","colSpan":"Rhychwant Colofnau","wordWrap":"Lapio Geiriau","hAlign":"Aliniad Llorweddol","vAlign":"Aliniad Fertigol","alignBaseline":"Baslinell","bgColor":"Lliw Cefndir","borderColor":"Lliw Ymyl","data":"Data","header":"Pennyn","yes":"Ie","no":"Na","invalidWidth":"Mae'n rhaid i led y gell fod yn rhif.","invalidHeight":"Mae'n rhaid i uchder y gell fod yn rhif.","invalidRowSpan":"Mae'n rhaid i rychwant y rhesi fod yn gyfanrif.","invalidColSpan":"Mae'n rhaid i rychwant y colofnau fod yn gyfanrif.","chooseColor":"Choose"},"cellPad":"Padio'r gell","cellSpace":"Bylchu'r gell","column":{"menu":"Colofn","insertBefore":"Mewnosod Colofn Cyn","insertAfter":"Mewnosod Colofn Ar Ôl","deleteColumn":"Dileu Colofnau"},"columns":"Colofnau","deleteTable":"Dileu Tabl","headers":"Penynnau","headersBoth":"Y Ddau","headersColumn":"Colofn gyntaf","headersNone":"Dim","headersRow":"Rhes gyntaf","invalidBorder":"Mae'n rhaid i faint yr ymyl fod yn rhif.","invalidCellPadding":"Mae'n rhaid i badiad y gell fod yn rhif positif.","invalidCellSpacing":"Mae'n rhaid i fylchiad y gell fod yn rhif positif.","invalidCols":"Mae'n rhaid cael o leiaf un golofn.","invalidHeight":"Mae'n rhaid i uchder y tabl fod yn rhif.","invalidRows":"Mae'n rhaid cael o leiaf un rhes.","invalidWidth":"Mae'n rhaid i led y tabl fod yn rhif.","menu":"Nodweddion Tabl","row":{"menu":"Rhes","insertBefore":"Mewnosod Rhes Cyn","insertAfter":"Mewnosod Rhes Ar Ôl","deleteRow":"Dileu Rhesi"},"rows":"Rhesi","summary":"Crynodeb","title":"Nodweddion Tabl","toolbar":"Tabl","widthPc":"y cant","widthPx":"picsel","widthUnit":"uned lled"},"undo":{"redo":"Ailwneud","undo":"Dadwneud"},"wsc":{"btnIgnore":"Anwybyddu Un","btnIgnoreAll":"Anwybyddu Pob","btnReplace":"Amnewid Un","btnReplaceAll":"Amnewid Pob","btnUndo":"Dadwneud","changeTo":"Newid i","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Gwirydd sillafu heb ei arsefydlu. A ydych am ei lawrlwytho nawr?","manyChanges":"Gwirio sillafu wedi gorffen: Newidiwyd %1 gair","noChanges":"Gwirio sillafu wedi gorffen: Dim newidiadau","noMispell":"Gwirio sillafu wedi gorffen: Dim camsillaf.","noSuggestions":"- Dim awgrymiadau -","notAvailable":"Nid yw'r gwasanaeth hwn ar gael yn bresennol.","notInDic":"Nid i'w gael yn y geiriadur","oneChange":"Gwirio sillafu wedi gorffen: Newidiwyd 1 gair","progress":"Gwirio sillafu yn ar y gweill...","title":"Gwirio Sillafu","toolbar":"Gwirio Sillafu"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/da.js b/htmltest/sites/all/libraries/ckeditor-version/lang/da.js
new file mode 100644
index 00000000..0c26c441
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/da.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['da']={"editor":"Rich Text Editor","common":{"editorHelp":"Tryk ALT 0 for hjælp","browseServer":"Gennemse...","url":"URL","protocol":"Protokol","upload":"Upload","uploadSubmit":"Upload","image":"Indsæt billede","flash":"Indsæt Flash","form":"Indsæt formular","checkbox":"Indsæt afkrydsningsfelt","radio":"Indsæt alternativknap","textField":"Indsæt tekstfelt","textarea":"Indsæt tekstboks","hiddenField":"Indsæt skjult felt","button":"Indsæt knap","select":"Indsæt liste","imageButton":"Indsæt billedknap","notSet":"<intet valgt>","id":"Id","name":"Navn","langDir":"Tekstretning","langDirLtr":"Fra venstre mod højre (LTR)","langDirRtl":"Fra højre mod venstre (RTL)","langCode":"Sprogkode","longDescr":"Udvidet beskrivelse","cssClass":"Typografiark (CSS)","advisoryTitle":"Titel","cssStyle":"Typografi (CSS)","ok":"OK","cancel":"Annullér","close":"Luk","preview":"Forhåndsvisning","resize":"Træk for at skalere","generalTab":"Generelt","advancedTab":"Avanceret","validateNumberFailed":"Værdien er ikke et tal.","confirmNewPage":"Alt indhold, der ikke er blevet gemt, vil gå tabt. Er du sikker på, at du vil indlæse en ny side?","confirmCancel":"Nogle af indstillingerne er blevet ændret. Er du sikker på, at du vil lukke vinduet?","options":"Vis muligheder","target":"Mål","targetNew":"Nyt vindue (_blank)","targetTop":"Øverste vindue (_top)","targetSelf":"Samme vindue (_self)","targetParent":"Samme vindue (_parent)","langDirLTR":"Venstre til højre (LTR)","langDirRTL":"Højre til venstre (RTL)","styles":"Style","cssClasses":"Stylesheetklasser","width":"Bredde","height":"Højde","align":"Justering","alignLeft":"Venstre","alignRight":"Højre","alignCenter":"Centreret","alignTop":"Øverst","alignMiddle":"Centreret","alignBottom":"Nederst","invalidValue":"Invalid value.","invalidHeight":"Højde skal være et tal.","invalidWidth":"Bredde skal være et tal.","invalidCssLength":"Værdien specificeret for \"%1\" feltet skal være et positivt nummer med eller uden en CSS måleenhed  (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Værdien specificeret for \"%1\" feltet skal være et positivt nummer med eller uden en CSS måleenhed  (px eller %).","invalidInlineStyle":"Værdien specificeret for inline style skal indeholde en eller flere elementer med et format som \"name:value\", separeret af semikoloner","cssLengthTooltip":"Indsæt en numerisk værdi i pixel eller nummer med en gyldig CSS værdi (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, ikke tilgængelig</span>"},"about":{"copy":"Copyright &copy; $1. Alle rettigheder forbeholdes.","dlgTitle":"Om CKEditor","help":"Se $1 for at få hjælp.","moreInfo":"For informationer omkring licens, se venligst vores hjemmeside (på engelsk):","title":"Om CKEditor","userGuide":"CKEditor-brugermanual"},"basicstyles":{"bold":"Fed","italic":"Kursiv","strike":"Gennemstreget","subscript":"Sænket skrift","superscript":"Hævet skrift","underline":"Understreget"},"bidi":{"ltr":"Tekstretning fra venstre til højre","rtl":"Tekstretning fra højre til venstre"},"blockquote":{"toolbar":"Blokcitat"},"clipboard":{"copy":"Kopiér","copyError":"Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at kopiere teksten (Ctrl/Cmd+C).","cut":"Klip","cutError":"Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at klippe teksten (Ctrl/Cmd+X).","paste":"Indsæt","pasteArea":"Indsæt område","pasteMsg":"Indsæt i feltet herunder (<STRONG>Ctrl/Cmd+V</STRONG>) og klik på <STRONG>OK</STRONG>.","securityMsg":"Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Du skal indsætte udklipsholderens indhold i dette vindue igen.","title":"Indsæt"},"colorbutton":{"auto":"Automatisk","bgColorTitle":"Baggrundsfarve","colors":{"000":"Sort","800000":"Mørkerød","8B4513":"Mørk orange","2F4F4F":"Dark Slate Grå","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Mørkegrå","B22222":"Scarlet / Rød","A52A2A":"Brun","DAA520":"Guld","006400":"Mørkegrøn","40E0D0":"Tyrkis","0000CD":"Mellemblå","800080":"Lilla","808080":"Grå","F00":"Rød","FF8C00":"Mørk orange","FFD700":"Guld","008000":"Grøn","0FF":"Cyan","00F":"Blå","EE82EE":"Violet","A9A9A9":"Matgrå","FFA07A":"Laksefarve","FFA500":"Orange","FFFF00":"Gul","00FF00":"Lime","AFEEEE":"Mat tyrkis","ADD8E6":"Lyseblå","DDA0DD":"Plum","D3D3D3":"Lysegrå","FFF0F5":"Lavender Blush","FAEBD7":"Antikhvid","FFFFE0":"Lysegul","F0FFF0":"Gul / Beige","F0FFFF":"Himmeblå","F0F8FF":"Alice blue","E6E6FA":"Lavendel","FFF":"Hvid"},"more":"Flere farver...","panelTitle":"Farver","textColorTitle":"Tekstfarve"},"colordialog":{"clear":"Nulstil","highlight":"Markér","options":"Farvemuligheder","selected":"Valgt farve","title":"Vælg farve"},"templates":{"button":"Skabeloner","emptyListMsg":"(Der er ikke defineret nogen skabelon)","insertOption":"Erstat det faktiske indhold","options":"Skabelon muligheder","selectPromptMsg":"Vælg den skabelon, som skal åbnes i editoren (nuværende indhold vil blive overskrevet):","title":"Indholdsskabeloner"},"contextmenu":{"options":"Muligheder for hjælpemenu"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Vejledende titel","cssClassInputLabel":"Typografiark","edit":"Rediger Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Venstre til højre (LTR)","langDirLabel":"Sprogretning","langDirRTLLabel":"Højre til venstre (RTL)","languageCodeInputLabel":" Sprogkode","remove":"Slet Div","styleSelectLabel":"Style","title":"Opret Div Container","toolbar":"Opret Div Container"},"toolbar":{"toolbarCollapse":"Sammenklap værktøjslinje","toolbarExpand":"Udvid værktøjslinje","toolbarGroups":{"document":"Dokument","clipboard":"Udklipsholder/Fortryd","editing":"Redigering","forms":"Formularer","basicstyles":"Basis styles","paragraph":"Paragraf","links":"Links","insert":"Indsæt","styles":"Typografier","colors":"Farver","tools":"Værktøjer"},"toolbars":"Editors værktøjslinjer"},"elementspath":{"eleLabel":"Sti på element","eleTitle":"%1 element"},"find":{"find":"Søg","findOptions":"Find muligheder","findWhat":"Søg efter:","matchCase":"Forskel på store og små bogstaver","matchCyclic":"Match cyklisk","matchWord":"Kun hele ord","notFoundMsg":"Søgeteksten blev ikke fundet","replace":"Erstat","replaceAll":"Erstat alle","replaceSuccessMsg":"%1 forekomst(er) erstattet.","replaceWith":"Erstat med:","title":"Søg og erstat"},"fakeobjects":{"anchor":"Anker","flash":"Flashanimation","hiddenfield":"Skjult felt","iframe":"Iframe","unknown":"Ukendt objekt"},"flash":{"access":"Scriptadgang","accessAlways":"Altid","accessNever":"Aldrig","accessSameDomain":"Samme domæne","alignAbsBottom":"Absolut nederst","alignAbsMiddle":"Absolut centreret","alignBaseline":"Grundlinje","alignTextTop":"Toppen af teksten","bgcolor":"Baggrundsfarve","chkFull":"Tillad fuldskærm","chkLoop":"Gentagelse","chkMenu":"Vis Flash-menu","chkPlay":"Automatisk afspilning","flashvars":"Variabler for Flash","hSpace":"Vandret margen","properties":"Egenskaber for Flash","propertiesTab":"Egenskaber","quality":"Kvalitet","qualityAutoHigh":"Auto høj","qualityAutoLow":"Auto lav","qualityBest":"Bedste","qualityHigh":"Høj","qualityLow":"Lav","qualityMedium":"Medium","scale":"Skalér","scaleAll":"Vis alt","scaleFit":"Tilpas størrelse","scaleNoBorder":"Ingen ramme","title":"Egenskaber for Flash","vSpace":"Lodret margen","validateHSpace":"Vandret margen skal være et tal.","validateSrc":"Indtast hyperlink URL!","validateVSpace":"Lodret margen skal være et tal.","windowMode":"Vinduestilstand","windowModeOpaque":"Gennemsigtig (opaque)","windowModeTransparent":"Transparent","windowModeWindow":"Vindue"},"font":{"fontSize":{"label":"Skriftstørrelse","voiceLabel":"Skriftstørrelse","panelTitle":"Skriftstørrelse"},"label":"Skrifttype","panelTitle":"Skrifttype","voiceLabel":"Skrifttype"},"forms":{"button":{"title":"Egenskaber for knap","text":"Tekst","type":"Type","typeBtn":"Knap","typeSbm":"Send","typeRst":"Nulstil"},"checkboxAndRadio":{"checkboxTitle":"Egenskaber for afkrydsningsfelt","radioTitle":"Egenskaber for alternativknap","value":"Værdi","selected":"Valgt"},"form":{"title":"Egenskaber for formular","menu":"Egenskaber for formular","action":"Handling","method":"Metode","encoding":"Kodning (encoding)"},"hidden":{"title":"Egenskaber for skjult felt","name":"Navn","value":"Værdi"},"select":{"title":"Egenskaber for liste","selectInfo":"Generelt","opAvail":"Valgmuligheder","value":"Værdi","size":"Størrelse","lines":"Linjer","chkMulti":"Tillad flere valg","opText":"Tekst","opValue":"Værdi","btnAdd":"Tilføj","btnModify":"Redigér","btnUp":"Op","btnDown":"Ned","btnSetValue":"Sæt som valgt","btnDelete":"Slet"},"textarea":{"title":"Egenskaber for tekstboks","cols":"Kolonner","rows":"Rækker"},"textfield":{"title":"Egenskaber for tekstfelt","name":"Navn","value":"Værdi","charWidth":"Bredde (tegn)","maxChars":"Max. antal tegn","type":"Type","typeText":"Tekst","typePass":"Adgangskode","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"Formatering","panelTitle":"Formatering","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formateret"},"horizontalrule":{"toolbar":"Indsæt vandret streg"},"iframe":{"border":"Vis kant på rammen","noUrl":"Venligst indsæt URL på iframen","scrolling":"Aktiver scrollbars","title":"Iframe egenskaber","toolbar":"Iframe"},"image":{"alertUrl":"Indtast stien til billedet","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Upload fil til serveren","button2Img":"Vil du lave billedknappen om til et almindeligt billede?","hSpace":"Vandret margen","img2Button":"Vil du lave billedet om til en billedknap?","infoTab":"Generelt","linkTab":"Hyperlink","lockRatio":"Lås størrelsesforhold","menu":"Egenskaber for billede","resetSize":"Nulstil størrelse","title":"Egenskaber for billede","titleButton":"Egenskaber for billedknap","upload":"Upload","urlMissing":"Kilde på billed-URL mangler","vSpace":"Lodret margen","validateBorder":"Kant skal være et helt nummer.","validateHSpace":"HSpace skal være et helt nummer.","validateVSpace":"VSpace skal være et helt nummer."},"indent":{"indent":"Forøg indrykning","outdent":"Formindsk indrykning"},"smiley":{"options":"Smileymuligheder","title":"Vælg smiley","toolbar":"Smiley"},"justify":{"block":"Lige margener","center":"Centreret","left":"Venstrestillet","right":"Højrestillet"},"link":{"acccessKey":"Genvejstast","advanced":"Avanceret","advisoryContentType":"Indholdstype","advisoryTitle":"Titel","anchor":{"toolbar":"Indsæt/redigér bogmærke","menu":"Egenskaber for bogmærke","title":"Egenskaber for bogmærke","name":"Bogmærkenavn","errorName":"Indtast bogmærkenavn","remove":"Fjern bogmærke"},"anchorId":"Efter element-Id","anchorName":"Efter ankernavn","charset":"Tegnsæt","cssClasses":"Typografiark","emailAddress":"E-mailadresse","emailBody":"Besked","emailSubject":"Emne","id":"Id","info":"Generelt","langCode":"Tekstretning","langDir":"Tekstretning","langDirLTR":"Fra venstre mod højre (LTR)","langDirRTL":"Fra højre mod venstre (RTL)","menu":"Redigér hyperlink","name":"Navn","noAnchors":"(Ingen bogmærker i dokumentet)","noEmail":"Indtast e-mailadresse!","noUrl":"Indtast hyperlink-URL!","other":"<anden>","popupDependent":"Koblet/dependent (Netscape)","popupFeatures":"Egenskaber for popup","popupFullScreen":"Fuld skærm (IE)","popupLeft":"Position fra venstre","popupLocationBar":"Adresselinje","popupMenuBar":"Menulinje","popupResizable":"Justérbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Værktøjslinje","popupTop":"Position fra toppen","rel":"Relation","selectAnchor":"Vælg et anker","styles":"Typografi","tabIndex":"Tabulatorindeks","target":"Mål","targetFrame":"<ramme>","targetFrameName":"Destinationsvinduets navn","targetPopup":"<popup vindue>","targetPopupName":"Popupvinduets navn","title":"Egenskaber for hyperlink","toAnchor":"Bogmærke på denne side","toEmail":"E-mail","toUrl":"URL","toolbar":"Indsæt/redigér hyperlink","type":"Type","unlink":"Fjern hyperlink","upload":"Upload"},"list":{"bulletedlist":"Punktopstilling","numberedlist":"Talopstilling"},"liststyle":{"armenian":"Armensk nummering","bulletedTitle":"Værdier for cirkelpunktopstilling","circle":"Cirkel","decimal":"Decimal (1, 2, 3, osv.)","decimalLeadingZero":"Decimaler med 0 først (01, 02, 03, etc.)","disc":"Værdier for diskpunktopstilling","georgian":"Georgiansk nummering (an, ban, gan, etc.)","lowerAlpha":"Små alfabet (a, b, c, d, e, etc.)","lowerGreek":"Små græsk (alpha, beta, gamma, etc.)","lowerRoman":"Små romerske (i, ii, iii, iv, v, etc.)","none":"Ingen","notset":"<ikke defineret>","numberedTitle":"Egenskaber for nummereret liste","square":"Firkant","start":"Start","type":"Type","upperAlpha":"Store alfabet (A, B, C, D, E, etc.)","upperRoman":"Store romerske (I, II, III, IV, V, etc.)","validateStartNumber":"Den nummererede liste skal starte med et rundt nummer"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maksimér","minimize":"Minimér"},"newpage":{"toolbar":"Ny side"},"pagebreak":{"alt":"Sideskift","toolbar":"Indsæt sideskift"},"pastetext":{"button":"Indsæt som ikke-formateret tekst","title":"Indsæt som ikke-formateret tekst"},"pastefromword":{"confirmCleanup":"Den tekst du forsøger at indsætte ser ud til at komme fra Word. Vil du rense teksten før den indsættes?","error":"Det var ikke muligt at fjerne formatteringen på den indsatte tekst grundet en intern fejl","title":"Indsæt fra Word","toolbar":"Indsæt fra Word"},"preview":{"preview":"Vis eksempel"},"print":{"toolbar":"Udskriv"},"removeformat":{"toolbar":"Fjern formatering"},"save":{"toolbar":"Gem"},"selectall":{"toolbar":"Vælg alt"},"showblocks":{"toolbar":"Vis afsnitsmærker"},"sourcearea":{"toolbar":"Kilde"},"specialchar":{"options":"Muligheder for specialkarakterer","title":"Vælg symbol","toolbar":"Indsæt symbol"},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Tilføj ord","allCaps":"Ignorer alle store bogstaver","dic_create":"Opret","dic_delete":"Slet","dic_field_name":"Navn på ordbog","dic_info":"Til start er brugerordbogen gemt i en Cookie. Dog har Cookies en begrænsning på størrelse. Når ordbogen når en bestemt størrelse kan den blive gemt på vores server. For at gemme din personlige ordbog på vores server skal du angive et navn for denne. Såfremt du allerede har gemt en ordbog, skriv navnet på denne og klik på Gendan knappen.","dic_rename":"Omdøb","dic_restore":"Gendan","dictionariesTab":"Ordbøger","disable":"Deaktivér SCAYT","emptyDic":"Ordbogsnavn må ikke være tom.","enable":"Aktivér SCAYT","ignore":"Ignorér","ignoreAll":"Ignorér alle","ignoreDomainNames":"Ignorér domænenavne","langs":"Sprog","languagesTab":"Sprog","mixedCase":"Ignorer ord med store og små bogstaver","mixedWithDigits":"Ignorér ord med numre","moreSuggestions":"Flere forslag","opera_title":"Ikke supporteret af Opera","options":"Indstillinger","optionsTab":"Indstillinger","title":"Stavekontrol mens du skriver","toggle":"Skift/toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Typografi","panelTitle":"Formattering på stylesheet","panelTitle1":"Block typografi","panelTitle2":"Inline typografi","panelTitle3":"Object typografi"},"table":{"border":"Rammebredde","caption":"Titel","cell":{"menu":"Celle","insertBefore":"Indsæt celle før","insertAfter":"Indsæt celle efter","deleteCell":"Slet celle","merge":"Flet celler","mergeRight":"Flet til højre","mergeDown":"Flet nedad","splitHorizontal":"Del celle vandret","splitVertical":"Del celle lodret","title":"Celleegenskaber","cellType":"Celletype","rowSpan":"Række span (rows span)","colSpan":"Kolonne span (columns span)","wordWrap":"Tekstombrydning","hAlign":"Vandret justering","vAlign":"Lodret justering","alignBaseline":"Grundlinje","bgColor":"Baggrundsfarve","borderColor":"Rammefarve","data":"Data","header":"Hoved","yes":"Ja","no":"Nej","invalidWidth":"Cellebredde skal være et tal.","invalidHeight":"Cellehøjde skal være et tal.","invalidRowSpan":"Række span skal være et heltal.","invalidColSpan":"Kolonne span skal være et heltal.","chooseColor":"Vælg"},"cellPad":"Cellemargen","cellSpace":"Celleafstand","column":{"menu":"Kolonne","insertBefore":"Indsæt kolonne før","insertAfter":"Indsæt kolonne efter","deleteColumn":"Slet kolonne"},"columns":"Kolonner","deleteTable":"Slet tabel","headers":"Hoved","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første række","invalidBorder":"Rammetykkelse skal være et tal.","invalidCellPadding":"Cellemargen skal være et tal.","invalidCellSpacing":"Celleafstand skal være et tal.","invalidCols":"Antallet af kolonner skal være større end 0.","invalidHeight":"Tabelhøjde skal være et tal.","invalidRows":"Antallet af rækker skal være større end 0.","invalidWidth":"Tabelbredde skal være et tal.","menu":"Egenskaber for tabel","row":{"menu":"Række","insertBefore":"Indsæt række før","insertAfter":"Indsæt række efter","deleteRow":"Slet række"},"rows":"Rækker","summary":"Resumé","title":"Egenskaber for tabel","toolbar":"Tabel","widthPc":"procent","widthPx":"pixels","widthUnit":"Bredde på enhed"},"undo":{"redo":"Annullér fortryd","undo":"Fortryd"},"wsc":{"btnIgnore":"Ignorér","btnIgnoreAll":"Ignorér alle","btnReplace":"Erstat","btnReplaceAll":"Erstat alle","btnUndo":"Tilbage","changeTo":"Forslag","errorLoading":"Fejl ved indlæsning af host: %s.","ieSpellDownload":"Stavekontrol ikke installeret. Vil du installere den nu?","manyChanges":"Stavekontrol færdig: %1 ord ændret","noChanges":"Stavekontrol færdig: Ingen ord ændret","noMispell":"Stavekontrol færdig: Ingen fejl fundet","noSuggestions":"(ingen forslag)","notAvailable":"Stavekontrol er desværre ikke tilgængelig.","notInDic":"Ikke i ordbogen","oneChange":"Stavekontrol færdig: Et ord ændret","progress":"Stavekontrollen arbejder...","title":"Stavekontrol","toolbar":"Stavekontrol"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/de.js b/htmltest/sites/all/libraries/ckeditor-version/lang/de.js
new file mode 100644
index 00000000..5a69cd3b
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/de.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['de']={"editor":"WYSIWYG-Editor","common":{"editorHelp":"Drücken Sie ALT 0 für Hilfe","browseServer":"Server durchsuchen","url":"URL","protocol":"Protokoll","upload":"Hochladen","uploadSubmit":"Zum Server senden","image":"Bild","flash":"Flash","form":"Formular","checkbox":"Checkbox","radio":"Radiobutton","textField":"Textfeld einzeilig","textarea":"Textfeld mehrzeilig","hiddenField":"Verstecktes Feld","button":"Klickbutton","select":"Auswahlfeld","imageButton":"Bildbutton","notSet":"<nichts>","id":"ID","name":"Name","langDir":"Schreibrichtung","langDirLtr":"Links nach Rechts (LTR)","langDirRtl":"Rechts nach Links (RTL)","langCode":"Sprachenkürzel","longDescr":"Langform URL","cssClass":"Stylesheet Klasse","advisoryTitle":"Titel Beschreibung","cssStyle":"Style","ok":"OK","cancel":"Abbrechen","close":"Schließen","preview":"Vorschau","resize":"Zum Vergrößern ziehen","generalTab":"Allgemein","advancedTab":"Erweitert","validateNumberFailed":"Dieser Wert ist keine Nummer.","confirmNewPage":"Alle nicht gespeicherten Änderungen gehen verlohren. Sind Sie sicher die neue Seite zu laden?","confirmCancel":"Einige Optionen wurden geändert. Wollen Sie den Dialog dennoch schließen?","options":"Optionen","target":"Zielseite","targetNew":"Neues Fenster (_blank)","targetTop":"Oberstes Fenster (_top)","targetSelf":"Gleiches Fenster (_self)","targetParent":"Oberes Fenster (_parent)","langDirLTR":"Links nach Rechts (LNR)","langDirRTL":"Rechts nach Links (RNL)","styles":"Style","cssClasses":"Stylesheet Klasse","width":"Breite","height":"Höhe","align":"Ausrichtung","alignLeft":"Links","alignRight":"Rechts","alignCenter":"Zentriert","alignTop":"Oben","alignMiddle":"Mitte","alignBottom":"Unten","invalidValue":"Ungültiger Wert.","invalidHeight":"Höhe muss eine Zahl sein.","invalidWidth":"Breite muss eine Zahl sein.","invalidCssLength":"Wert spezifiziert für \"%1\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).","invalidHtmlLength":"Wert spezifiziert für \"%1\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte HTML Messeinheit (px oder %).","invalidInlineStyle":"Wert spezifiziert für inline Stilart muss enthalten ein oder mehr Tupels mit dem Format \"Name : Wert\" getrennt mit Semikolons.","cssLengthTooltip":"Gebe eine Zahl ein für ein Wert in pixels oder eine Zahl mit einer korrekten CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).","unavailable":"%1<span class=\"cke_accessibility\">, nicht verfügbar</span>"},"about":{"copy":"Copyright &copy; $1. Alle Rechte vorbehalten.","dlgTitle":"Über CKEditor","help":"Prüfe $1 für Hilfe.","moreInfo":"Für Informationen über unsere Lizenzbestimmungen besuchen sie bitte unsere Webseite:","title":"Über CKEditor","userGuide":"CKEditor Benutzerhandbuch"},"basicstyles":{"bold":"Fett","italic":"Kursiv","strike":"Durchgestrichen","subscript":"Tiefgestellt","superscript":"Hochgestellt","underline":"Unterstrichen"},"bidi":{"ltr":"Leserichtung von Links nach Rechts","rtl":"Leserichtung von Rechts nach Links"},"blockquote":{"toolbar":"Zitatblock"},"clipboard":{"copy":"Kopieren","copyError":"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).","cut":"Ausschneiden","cutError":"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).","paste":"Einfügen","pasteArea":"Einfügebereich","pasteMsg":"Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit <STRONG>Strg+V</STRONG>) ein und bestätigen Sie mit <STRONG>OK</STRONG>.","securityMsg":"Aufgrund von Sicherheitsbeschränkungen Ihres Browsers kann der Editor nicht direkt auf die Zwischenablage zugreifen. Bitte fügen Sie den Inhalt erneut in diesem Fenster ein.","title":"Einfügen"},"colorbutton":{"auto":"Automatisch","bgColorTitle":"Hintergrundfarbe","colors":{"000":"Schwarz","800000":"Kastanienbraun","8B4513":"Braun","2F4F4F":"Dunkles Schiefergrau","008080":"Blaugrün","000080":"Navy","4B0082":"Indigo","696969":"Dunkelgrau","B22222":"Ziegelrot","A52A2A":"Braun","DAA520":"Goldgelb","006400":"Dunkelgrün","40E0D0":"Türkis","0000CD":"Medium Blau","800080":"Lila","808080":"Grau","F00":"Rot","FF8C00":"Dunkelorange","FFD700":"Gold","008000":"Grün","0FF":"Cyan","00F":"Blau","EE82EE":"Hellviolett","A9A9A9":"Dunkelgrau","FFA07A":"Helles Lachsrosa","FFA500":"Orange","FFFF00":"Gelb","00FF00":"Lime","AFEEEE":"Blaß-Türkis","ADD8E6":"Hellblau","DDA0DD":"Pflaumenblau","D3D3D3":"Hellgrau","FFF0F5":"Lavendel","FAEBD7":"Antik Weiß","FFFFE0":"Hellgelb","F0FFF0":"Honigtau","F0FFFF":"Azurblau","F0F8FF":"Alice Blau","E6E6FA":"Lavendel","FFF":"Weiß"},"more":"Weitere Farben...","panelTitle":"Farben","textColorTitle":"Textfarbe"},"colordialog":{"clear":"Entfernen","highlight":"Hervorheben","options":"Farbeoptionen","selected":"Ausgewählte Farbe","title":"Farbe wählen"},"templates":{"button":"Vorlagen","emptyListMsg":"(keine Vorlagen definiert)","insertOption":"Aktuellen Inhalt ersetzen","options":"Vorlagen Optionen","selectPromptMsg":"Klicken Sie auf eine Vorlage, um sie im Editor zu öffnen (der aktuelle Inhalt wird dabei gelöscht!):","title":"Vorlagen"},"contextmenu":{"options":"Kontextmenü Optionen"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Tooltip","cssClassInputLabel":"Stylesheet Klasse","edit":"Div bearbeiten","inlineStyleInputLabel":"Inline Stil","langDirLTRLabel":"Links nach Rechs (LTR)","langDirLabel":"Sprache Richtung","langDirRTLLabel":"Rechs nach Links (RTL)","languageCodeInputLabel":"Sprachenkürzel","remove":"Div entfernen","styleSelectLabel":"Style","title":"Div Container erzeugen","toolbar":"Div Container erzeugen"},"toolbar":{"toolbarCollapse":"Symbolleiste einklappen","toolbarExpand":"Symbolleiste ausklappen","toolbarGroups":{"document":"Dokument","clipboard":"Zwischenablage/Rückgängig","editing":"Editieren","forms":"Formularen","basicstyles":"Grundstile","paragraph":"Absatz","links":"Links","insert":"Einfügen","styles":"Stile","colors":"Farben","tools":"Werkzeuge"},"toolbars":"Editor Symbolleisten"},"elementspath":{"eleLabel":"Elements Pfad","eleTitle":"%1 Element"},"find":{"find":"Suchen","findOptions":"Suchoptionen","findWhat":"Suche nach:","matchCase":"Groß-Kleinschreibung beachten","matchCyclic":"Zyklische Suche","matchWord":"Nur ganze Worte suchen","notFoundMsg":"Der gesuchte Text wurde nicht gefunden.","replace":"Ersetzen","replaceAll":"Alle ersetzen","replaceSuccessMsg":"%1 vorkommen ersetzt.","replaceWith":"Ersetze mit:","title":"Suchen und Ersetzen"},"fakeobjects":{"anchor":"Anker","flash":"Flash Animation","hiddenfield":"Verstecktes Feld","iframe":"IFrame","unknown":"Unbekanntes Objekt"},"flash":{"access":"Skript Zugang","accessAlways":"Immer","accessNever":"Nie","accessSameDomain":"Gleiche Domain","alignAbsBottom":"Abs Unten","alignAbsMiddle":"Abs Mitte","alignBaseline":"Baseline","alignTextTop":"Text Oben","bgcolor":"Hintergrundfarbe","chkFull":"Vollbildmodus erlauben","chkLoop":"Endlosschleife","chkMenu":"Flash-Menü aktivieren","chkPlay":"Automatisch Abspielen","flashvars":"Variablen für Flash","hSpace":"Horizontal-Abstand","properties":"Flash-Eigenschaften","propertiesTab":"Eigenschaften","quality":"Qualität","qualityAutoHigh":"Auto Hoch","qualityAutoLow":"Auto Niedrig","qualityBest":"Beste","qualityHigh":"Hoch","qualityLow":"Niedrig","qualityMedium":"Medium","scale":"Skalierung","scaleAll":"Alles anzeigen","scaleFit":"Passgenau","scaleNoBorder":"Ohne Rand","title":"Flash-Eigenschaften","vSpace":"Vertikal-Abstand","validateHSpace":"HSpace muss eine Zahl sein.","validateSrc":"Bitte geben Sie die Link-URL an","validateVSpace":"VSpace muss eine Zahl sein.","windowMode":"Fenster Modus","windowModeOpaque":"Deckend","windowModeTransparent":"Transparent","windowModeWindow":"Fenster"},"font":{"fontSize":{"label":"Größe","voiceLabel":"Schrifgröße","panelTitle":"Größe"},"label":"Schriftart","panelTitle":"Schriftart","voiceLabel":"Schriftart"},"forms":{"button":{"title":"Button-Eigenschaften","text":"Text (Wert)","type":"Typ","typeBtn":"Button","typeSbm":"Absenden","typeRst":"Zurücksetzen"},"checkboxAndRadio":{"checkboxTitle":"Checkbox-Eigenschaften","radioTitle":"Optionsfeld-Eigenschaften","value":"Wert","selected":"ausgewählt"},"form":{"title":"Formular-Eigenschaften","menu":"Formular-Eigenschaften","action":"Action","method":"Method","encoding":"Zeichenkodierung"},"hidden":{"title":"Verstecktes Feld-Eigenschaften","name":"Name","value":"Wert"},"select":{"title":"Auswahlfeld-Eigenschaften","selectInfo":"Info","opAvail":"Mögliche Optionen","value":"Wert","size":"Größe","lines":"Linien","chkMulti":"Erlaube Mehrfachauswahl","opText":"Text","opValue":"Wert","btnAdd":"Hinzufügen","btnModify":"Ändern","btnUp":"Hoch","btnDown":"Runter","btnSetValue":"Setze als Standardwert","btnDelete":"Entfernen"},"textarea":{"title":"Textfeld (mehrzeilig) Eigenschaften","cols":"Spalten","rows":"Reihen"},"textfield":{"title":"Textfeld (einzeilig) Eigenschaften","name":"Name","value":"Wert","charWidth":"Zeichenbreite","maxChars":"Max. Zeichen","type":"Typ","typeText":"Text","typePass":"Passwort","typeEmail":"E-mail","typeSearch":"Suche","typeTel":"Telefonnummer","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Format","tag_address":"Addresse","tag_div":"Normal (DIV)","tag_h1":"Überschrift 1","tag_h2":"Überschrift 2","tag_h3":"Überschrift 3","tag_h4":"Überschrift 4","tag_h5":"Überschrift 5","tag_h6":"Überschrift 6","tag_p":"Normal","tag_pre":"Formatiert"},"horizontalrule":{"toolbar":"Horizontale Linie einfügen"},"iframe":{"border":"Rahmen anzeigen","noUrl":"Bitte geben Sie die IFrame-URL an","scrolling":"Rollbalken anzeigen","title":"IFrame-Eigenschaften","toolbar":"IFrame"},"image":{"alertUrl":"Bitte geben Sie die Bild-URL an","alt":"Alternativer Text","border":"Rahmen","btnUpload":"Zum Server senden","button2Img":"Möchten Sie den gewählten Bild-Button in ein einfaches Bild umwandeln?","hSpace":"Horizontal-Abstand","img2Button":"Möchten Sie das gewählten Bild in einen Bild-Button umwandeln?","infoTab":"Bild-Info","linkTab":"Link","lockRatio":"Größenverhältnis beibehalten","menu":"Bild-Eigenschaften","resetSize":"Größe zurücksetzen","title":"Bild-Eigenschaften","titleButton":"Bildbutton-Eigenschaften","upload":"Hochladen","urlMissing":"Imagequelle URL fehlt.","vSpace":"Vertikal-Abstand","validateBorder":"Rahmen muß eine ganze Zahl sein.","validateHSpace":"Horizontal-Abstand muß eine ganze Zahl sein.","validateVSpace":"Vertikal-Abstand muß eine ganze Zahl sein."},"indent":{"indent":"Einzug erhöhen","outdent":"Einzug verringern"},"smiley":{"options":"Smiley Optionen","title":"Smiley auswählen","toolbar":"Smiley"},"justify":{"block":"Blocksatz","center":"Zentriert","left":"Linksbündig","right":"Rechtsbündig"},"link":{"acccessKey":"Zugriffstaste","advanced":"Erweitert","advisoryContentType":"Inhaltstyp","advisoryTitle":"Titel Beschreibung","anchor":{"toolbar":"Anker einfügen/editieren","menu":"Anker-Eigenschaften","title":"Anker-Eigenschaften","name":"Anker Name","errorName":"Bitte geben Sie den Namen des Ankers ein","remove":"Anker entfernen"},"anchorId":"nach Element Id","anchorName":"nach Anker Name","charset":"Ziel-Zeichensatz","cssClasses":"Stylesheet Klasse","emailAddress":"E-Mail Adresse","emailBody":"Nachrichtentext","emailSubject":"Betreffzeile","id":"Id","info":"Link-Info","langCode":"Sprachenkürzel","langDir":"Schreibrichtung","langDirLTR":"Links nach Rechts (LTR)","langDirRTL":"Rechts nach Links (RTL)","menu":"Link editieren","name":"Name","noAnchors":"(keine Anker im Dokument vorhanden)","noEmail":"Bitte geben Sie e-Mail Adresse an","noUrl":"Bitte geben Sie die Link-URL an","other":"<andere>","popupDependent":"Abhängig (Netscape)","popupFeatures":"Pop-up Fenster-Eigenschaften","popupFullScreen":"Vollbild (IE)","popupLeft":"Linke Position","popupLocationBar":"Adress-Leiste","popupMenuBar":"Menü-Leiste","popupResizable":"Größe änderbar","popupScrollBars":"Rollbalken","popupStatusBar":"Statusleiste","popupToolbar":"Symbolleiste","popupTop":"Obere Position","rel":"Beziehung","selectAnchor":"Anker auswählen","styles":"Style","tabIndex":"Tab-Index","target":"Zielseite","targetFrame":"<Frame>","targetFrameName":"Ziel-Fenster-Name","targetPopup":"<Pop-up Fenster>","targetPopupName":"Pop-up Fenster-Name","title":"Link","toAnchor":"Anker in dieser Seite","toEmail":"E-Mail","toUrl":"URL","toolbar":"Link einfügen/editieren","type":"Link-Typ","unlink":"Link entfernen","upload":"Hochladen"},"list":{"bulletedlist":"Liste","numberedlist":"Nummerierte Liste"},"liststyle":{"armenian":"Armenisch Nummerierung","bulletedTitle":"Listen-Eigenschaften","circle":"Ring","decimal":"Dezimal (1, 2, 3, etc.)","decimalLeadingZero":"Dezimal mit führende  Null (01, 02, 03, etc.)","disc":"Kreis","georgian":"Georgisch Nummerierung (an, ban, gan, etc.)","lowerAlpha":"Klein alpha (a, b, c, d, e, etc.)","lowerGreek":"Klein griechisch (alpha, beta, gamma, etc.)","lowerRoman":"Klein römisch (i, ii, iii, iv, v, etc.)","none":"Keine","notset":"<nicht gesetzt>","numberedTitle":"Nummerierte Listen-Eigenschaften","square":"Quadrat","start":"Start","type":"Typ","upperAlpha":"Groß alpha (A, B, C, D, E, etc.)","upperRoman":"Groß römisch (I, II, III, IV, V, etc.)","validateStartNumber":"List Startnummer muss eine ganze Zahl sein."},"magicline":{"title":"Absatz hier einfügen"},"maximize":{"maximize":"Maximieren","minimize":"Minimieren"},"newpage":{"toolbar":"Neue Seite"},"pagebreak":{"alt":"Seitenumbruch einfügen","toolbar":"Seitenumbruch einfügen"},"pastetext":{"button":"Als Text einfügen","title":"Als Text einfügen"},"pastefromword":{"confirmCleanup":"Der Text, den Sie einfügen möchten, scheint aus MS-Word kopiert zu sein. Möchten Sie ihn zuvor bereinigen lassen?","error":"Aufgrund eines internen Fehlers war es nicht möglich die eingefügten Daten zu bereinigen","title":"Aus MS-Word einfügen","toolbar":"Aus MS-Word einfügen"},"preview":{"preview":"Vorschau"},"print":{"toolbar":"Drucken"},"removeformat":{"toolbar":"Formatierungen entfernen"},"save":{"toolbar":"Speichern"},"selectall":{"toolbar":"Alles auswählen"},"showblocks":{"toolbar":"Blöcke anzeigen"},"sourcearea":{"toolbar":"Quellcode"},"specialchar":{"options":"Sonderzeichen Optionen","title":"Sonderzeichen auswählen","toolbar":"Sonderzeichen einfügen/editieren"},"scayt":{"about":"Über SCAYT","aboutTab":"Über","addWord":"Wort hinzufügen","allCaps":"Groß geschriebenen Wörter ignorieren","dic_create":"Erzeugen","dic_delete":"Löschen","dic_field_name":"Wörterbuchname","dic_info":"Anfangs wird das Benutzerwörterbuch in einem Cookie gespeichert. Allerdings sind Cookies in der Größe begrenzt. Wenn das Benutzerwörterbuch bis zu einem Punkt wächst, wo es nicht mehr in einem Cookie gespeichert werden kann, wird das Benutzerwörterbuch auf dem Server gespeichert. Um Ihr persönliches Wörterbuch auf dem Server zu speichern, müssen Sie einen Namen für das Wörterbuch angeben. Falls  Sie schon ein gespeicherte Wörterbuch haben, geben Sie bitte dessen Namen ein und klicken Sie auf die Schaltfläche Wiederherstellen.","dic_rename":"Umbenennen","dic_restore":"Wiederherstellen","dictionariesTab":"Wörterbücher","disable":"SCAYT ausschalten","emptyDic":"Wörterbuchname sollte leer sein.","enable":"SCAYT einschalten","ignore":"Ignorieren","ignoreAll":"Alle ignorieren","ignoreDomainNames":"Domain-Namen ignorieren","langs":"Sprachen","languagesTab":"Sprachen","mixedCase":"Wörter mit gemischte Setzkasten ignorieren","mixedWithDigits":"Wörter mit Zahlen ignorieren","moreSuggestions":"Mehr Vorschläge","opera_title":"Nicht von Opera unterstützt","options":"Optionen","optionsTab":"Optionen","title":"Rechtschreibprüfung während der Texteingabe (SCAYT)","toggle":"SCAYT umschalten","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Formatierungenstil","panelTitle1":"Block Stilart","panelTitle2":"Inline Stilart","panelTitle3":"Objekt Stilart"},"table":{"border":"Rahmen","caption":"Überschrift","cell":{"menu":"Zelle","insertBefore":"Zelle davor einfügen","insertAfter":"Zelle danach einfügen","deleteCell":"Zelle löschen","merge":"Zellen verbinden","mergeRight":"Nach rechts verbinden","mergeDown":"Nach unten verbinden","splitHorizontal":"Zelle horizontal teilen","splitVertical":"Zelle vertikal teilen","title":"Zellen-Eigenschaften","cellType":"Zellart","rowSpan":"Anzahl Zeilen verbinden","colSpan":"Anzahl Spalten verbinden","wordWrap":"Zeilenumbruch","hAlign":"Horizontale Ausrichtung","vAlign":"Vertikale Ausrichtung","alignBaseline":"Grundlinie","bgColor":"Hintergrundfarbe","borderColor":"Rahmenfarbe","data":"Daten","header":"Überschrift","yes":"Ja","no":"Nein","invalidWidth":"Zellenbreite muß eine Zahl sein.","invalidHeight":"Zellenhöhe muß eine Zahl sein.","invalidRowSpan":"\"Anzahl Zeilen verbinden\" muss eine Ganzzahl sein.","invalidColSpan":"\"Anzahl Spalten verbinden\" muss eine Ganzzahl sein.","chooseColor":"Wählen"},"cellPad":"Zellenabstand innen","cellSpace":"Zellenabstand außen","column":{"menu":"Spalte","insertBefore":"Spalte links davor einfügen","insertAfter":"Spalte rechts danach einfügen","deleteColumn":"Spalte löschen"},"columns":"Spalte","deleteTable":"Tabelle löschen","headers":"Kopfzeile","headersBoth":"Beide","headersColumn":"Erste Spalte","headersNone":"Keine","headersRow":"Erste Zeile","invalidBorder":"Die Rahmenbreite muß eine Zahl sein.","invalidCellPadding":"Der Zellenabstand innen muß eine positive Zahl sein.","invalidCellSpacing":"Der Zellenabstand außen muß eine positive Zahl sein.","invalidCols":"Die Anzahl der Spalten muß größer als 0 sein..","invalidHeight":"Die Tabellenbreite muß eine Zahl sein.","invalidRows":"Die Anzahl der Zeilen muß größer als 0 sein.","invalidWidth":"Die Tabellenbreite muss eine Zahl sein.","menu":"Tabellen-Eigenschaften","row":{"menu":"Zeile","insertBefore":"Zeile oberhalb einfügen","insertAfter":"Zeile unterhalb einfügen","deleteRow":"Zeile entfernen"},"rows":"Zeile","summary":"Inhaltsübersicht","title":"Tabellen-Eigenschaften","toolbar":"Tabelle","widthPc":"%","widthPx":"Pixel","widthUnit":"Breite Einheit"},"undo":{"redo":"Wiederherstellen","undo":"Rückgängig"},"wsc":{"btnIgnore":"Ignorieren","btnIgnoreAll":"Alle Ignorieren","btnReplace":"Ersetzen","btnReplaceAll":"Alle Ersetzen","btnUndo":"Rückgängig","changeTo":"Ändern in","errorLoading":"Fehler beim laden des Dienstanbieters: %s.","ieSpellDownload":"Rechtschreibprüfung nicht installiert. Möchten Sie sie jetzt herunterladen?","manyChanges":"Rechtschreibprüfung abgeschlossen - %1 Wörter geändert","noChanges":"Rechtschreibprüfung abgeschlossen - keine Worte geändert","noMispell":"Rechtschreibprüfung abgeschlossen - keine Fehler gefunden","noSuggestions":" - keine Vorschläge - ","notAvailable":"Entschuldigung, aber dieser Dienst steht im Moment nicht zur Verfügung.","notInDic":"Nicht im Wörterbuch","oneChange":"Rechtschreibprüfung abgeschlossen - ein Wort geändert","progress":"Rechtschreibprüfung läuft...","title":"Rechtschreibprüfung","toolbar":"Rechtschreibprüfung"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/el.js b/htmltest/sites/all/libraries/ckeditor-version/lang/el.js
new file mode 100644
index 00000000..bfe086b1
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/el.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['el']={"editor":"Επεξεργαστής Πλούσιου Κειμένου","common":{"editorHelp":"Πατήστε το ALT 0 για βοήθεια","browseServer":"Εξερεύνηση Διακομιστή","url":"URL","protocol":"Πρωτόκολλο","upload":"Αποστολή","uploadSubmit":"Αποστολή στον Διακομιστή","image":"Εικόνα","flash":"Flash","form":"Φόρμα","checkbox":"Κουτί Επιλογής","radio":"Κουμπί Επιλογής","textField":"Πεδίο Κειμένου","textarea":"Περιοχή Κειμένου","hiddenField":"Κρυφό Πεδίο","button":"Κουμπί","select":"Πεδίο Επιλογής","imageButton":"Κουμπί Εικόνας","notSet":"<δεν έχει ρυθμιστεί>","id":"Id","name":"Όνομα","langDir":"Κατεύθυνση Κειμένου","langDirLtr":"Αριστερά προς Δεξιά (LTR)","langDirRtl":"Δεξιά προς Αριστερά (RTL)","langCode":"Κωδικός Γλώσσας","longDescr":"Αναλυτική Περιγραφή URL","cssClass":"Stylesheet Classes","advisoryTitle":"Ενδεικτικός Τίτλος","cssStyle":"Μορφή Κειμένου","ok":"OK","cancel":"Ακύρωση","close":"Κλείσιμο","preview":"Προεπισκόπηση","resize":"Αλλαγή Μεγέθους","generalTab":"Γενικά","advancedTab":"Για Προχωρημένους","validateNumberFailed":"Αυτή η τιμή δεν είναι αριθμός.","confirmNewPage":"Οι όποιες αλλαγές στο περιεχόμενο θα χαθούν. Είσαστε σίγουροι ότι θέλετε να φορτώσετε μια νέα σελίδα;","confirmCancel":"Μερικές επιλογές έχουν αλλάξει. Είσαστε σίγουροι ότι θέλετε να κλείσετε το παράθυρο διαλόγου;","options":"Επιλογές","target":"Προορισμός","targetNew":"Νέο Παράθυρο (_blank)","targetTop":"Αρχική Περιοχή (_top)","targetSelf":"Ίδια Περιοχή (_self)","targetParent":"Γονεϊκό Παράθυρο (_parent)","langDirLTR":"Αριστερά προς Δεξιά (LTR)","langDirRTL":"Δεξιά προς Αριστερά (RTL)","styles":"Μορφή","cssClasses":"Stylesheet Classes","width":"Πλάτος","height":"Ύψος","align":"Στοίχιση","alignLeft":"Αριστερά","alignRight":"Δεξιά","alignCenter":"Κέντρο","alignTop":"Πάνω","alignMiddle":"Μέση","alignBottom":"Κάτω","invalidValue":"Μη έγκυρη τιμή.","invalidHeight":"Το ύψος πρέπει να είναι ένας αριθμός.","invalidWidth":"Το πλάτος πρέπει να είναι ένας αριθμός.","invalidCssLength":"Η τιμή που ορίζεται για το πεδίο \"%1\" πρέπει να είναι ένας θετικός αριθμός με ή χωρίς μια έγκυρη μονάδα μέτρησης CSS (px, %, in, cm, mm, em, ex, pt, ή pc).","invalidHtmlLength":"Η τιμή που ορίζεται για το πεδίο \"%1\" πρέπει να είναι ένας θετικός αριθμός με ή χωρίς μια έγκυρη μονάδα μέτρησης HTML (px ή %).","invalidInlineStyle":"Η τιμή για το εν σειρά στυλ πρέπει να περιέχει ένα ή περισσότερα ζεύγη με την μορφή \"όνομα: τιμή\" διαχωρισμένα με Ελληνικό ερωτηματικό.","cssLengthTooltip":"Εισάγεται μια τιμή σε pixel ή έναν αριθμό μαζί με μια έγκυρη μονάδα μέτρησης CSS (px, %, in, cm, mm, em, ex, pt, ή pc).","unavailable":"%1<span class=\"cke_accessibility\">, δεν είναι διαθέσιμο</span>"},"about":{"copy":"Πνευματικά δικαιώματα &copy; $1 Με επιφύλαξη παντός δικαιώματος.","dlgTitle":"Περί του CKEditor","help":"Ελέγξτε το $1 για βοήθεια.","moreInfo":"Για πληροφορίες αδειών παρακαλούμε επισκεφθείτε την ιστοσελίδα μας:","title":"Περί του CKEditor","userGuide":"Οδηγίες Χρήστη CKEditor"},"basicstyles":{"bold":"Έντονα","italic":"Πλάγια","strike":"Διαγράμμιση","subscript":"Δείκτης","superscript":"Εκθέτης","underline":"Υπογράμμιση"},"bidi":{"ltr":"Διεύθυνση κειμένου από αριστερά στα δεξιά","rtl":"Διεύθυνση κειμένου από δεξιά στα αριστερά"},"blockquote":{"toolbar":"Περιοχή Παράθεσης"},"clipboard":{"copy":"Αντιγραφή","copyError":"Οι ρυθμίσεις ασφαλείας του φυλλομετρητή σας δεν επιτρέπουν την επιλεγμένη εργασία αντιγραφής. Χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+C).","cut":"Αποκοπή","cutError":"Οι ρυθμίσεις ασφαλείας του φυλλομετρητή σας δεν επιτρέπουν την επιλεγμένη εργασία αποκοπής. Χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+X).","paste":"Επικόλληση","pasteArea":"Περιοχή Επικόλλησης","pasteMsg":"Παρακαλώ επικολήστε στο ακόλουθο κουτί χρησιμοποιόντας το πληκτρολόγιο (<strong>Ctrl/Cmd+V</strong>) και πατήστε OK.","securityMsg":"Λόγων των ρυθμίσεων ασφάλειας του περιηγητή σας, ο επεξεργαστής δεν μπορεί να έχει πρόσβαση στην μνήμη επικόλλησης. Χρειάζεται να επικολλήσετε ξανά σε αυτό το παράθυρο.","title":"Επικόλληση"},"colorbutton":{"auto":"Αυτόματα","bgColorTitle":"Χρώμα Φόντου","colors":{"000":"Μαύρο","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Μώβ","808080":"Γκρί","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"Περισσότερα χρώματα...","panelTitle":"Χρώματα","textColorTitle":"Χρώμα Κειμένου"},"colordialog":{"clear":"Καθαρισμός","highlight":"Σήμανση","options":"Επιλογές Χρωμάτων","selected":"Επιλεγμένο Χρώμα","title":"Επιλογή Χρώματος"},"templates":{"button":"Πρότυπα","emptyListMsg":"(Δεν έχουν καθοριστεί πρότυπα)","insertOption":"Αντικατάσταση υπάρχοντων περιεχομένων","options":"Επιλογές Προτύπου","selectPromptMsg":"Παρακαλώ επιλέξτε πρότυπο για εισαγωγή στο πρόγραμμα","title":"Πρότυπα Περιεχομένου"},"contextmenu":{"options":"Επιλογές Αναδυόμενου Μενού"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Ενδεικτικός Τίτλος","cssClassInputLabel":"Stylesheet Classes","edit":"Επεξεργασία Div","inlineStyleInputLabel":"Στυλ Εν Σειρά","langDirLTRLabel":"Αριστερά προς Δεξιά (LTR)","langDirLabel":"Κατεύθυνση Κειμένου","langDirRTLLabel":"Δεξιά προς Αριστερά (RTL)","languageCodeInputLabel":"Κωδικός Γλώσσας","remove":"Διαγραφή Div","styleSelectLabel":"Μορφή","title":"Δημιουργεία Div","toolbar":"Δημιουργεία Div"},"toolbar":{"toolbarCollapse":"Σύμπτηξη Εργαλειοθήκης","toolbarExpand":"Ανάπτυξη Εργαλειοθήκης","toolbarGroups":{"document":"Έγγραφο","clipboard":"Clipboard/Undo","editing":"Σε επεξεργασία","forms":"Φόρμες","basicstyles":"Βασικά στυλ","paragraph":"Παράγραφος","links":"Συνδέσμοι","insert":"Εισαγωγή","styles":"Στυλ","colors":"Χρώματα","tools":"Εργαλεία"},"toolbars":"Εργαλειοθήκες Επεξεργαστή"},"elementspath":{"eleLabel":"Διαδρομή στοιχείων","eleTitle":"%1 στοιχείο"},"find":{"find":"Αναζήτηση","findOptions":"Find Options","findWhat":"Αναζήτηση για:","matchCase":"Έλεγχος πεζών/κεφαλαίων","matchCyclic":"Match cyclic","matchWord":"Εύρεση πλήρους λέξης","notFoundMsg":"Το κείμενο δεν βρέθηκε.","replace":"Αντικατάσταση","replaceAll":"Αντικατάσταση Όλων","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Αντικατάσταση με:","title":"Αναζήτηση και Αντικατάσταση"},"fakeobjects":{"anchor":"Εισαγωγή/επεξεργασία Άγκυρας","flash":"Ταινία Flash","hiddenfield":"Κρυφό πεδίο","iframe":"IFrame","unknown":"Άγνωστο Αντικείμενο"},"flash":{"access":"Πρόσβαση Script","accessAlways":"Πάντα","accessNever":"Ποτέ","accessSameDomain":"Ίδιο όνομα τομέα","alignAbsBottom":"Απόλυτα Κάτω","alignAbsMiddle":"Απόλυτα στη Μέση","alignBaseline":"Γραμμή Βάσης","alignTextTop":"Κορυφή Κειμένου","bgcolor":"Χρώμα Υποβάθρου","chkFull":"Να Επιτρέπεται η Προβολή σε Πλήρη Οθόνη","chkLoop":"Επανάληψη","chkMenu":"Ενεργοποίηση Flash Menu","chkPlay":"Αυτόματη Εκτέλεση","flashvars":"Μεταβλητές για Flash","hSpace":"Οριζόντιο Διάστημα","properties":"Ιδιότητες Flash","propertiesTab":"Ιδιότητες","quality":"Ποιότητα","qualityAutoHigh":"Αυτόματη Υψηλή","qualityAutoLow":"Αυτόματη Χαμηλή","qualityBest":"Καλύτερη","qualityHigh":"Υψηλή","qualityLow":"Χαμηλή","qualityMedium":"Μεσαία","scale":"Μεγέθυνση","scaleAll":"Εμφάνιση όλων","scaleFit":"Ακριβές Μέγεθος","scaleNoBorder":"Χωρίς Περίγραμμα","title":"Ιδιότητες Flash","vSpace":"Κάθετο Διάστημα","validateHSpace":"Το HSpace πρέπει να είναι αριθμός.","validateSrc":"Εισάγετε την τοποθεσία (URL) του υπερσυνδέσμου (Link)","validateVSpace":"Το VSpace πρέπει να είναι αριθμός.","windowMode":"Τρόπος λειτουργίας παραθύρου.","windowModeOpaque":"Συμπαγές","windowModeTransparent":"Διάφανο","windowModeWindow":"Παράθυρο"},"font":{"fontSize":{"label":"Μέγεθος","voiceLabel":"Μέγεθος γραμματοσειράς","panelTitle":"Μέγεθος Γραμματοσειράς"},"label":"Γραμματοσειρά","panelTitle":"Όνομα Γραμματοσειράς","voiceLabel":"Γραμματοσειρά"},"forms":{"button":{"title":"Ιδιότητες Κουμπιού","text":"Κείμενο (Τιμή)","type":"Τύπος","typeBtn":"Κουμπί","typeSbm":"Υποβολή","typeRst":"Επαναφορά"},"checkboxAndRadio":{"checkboxTitle":"Ιδιότητες Κουτιού Επιλογής","radioTitle":"Ιδιότητες Κουμπιού Επιλογής","value":"Τιμή","selected":"Επιλεγμένο"},"form":{"title":"Ιδιότητες Φόρμας","menu":"Ιδιότητες Φόρμας","action":"Δράση","method":"Μέθοδος","encoding":"Κωδικοποίηση"},"hidden":{"title":"Ιδιότητες Κρυφού Πεδίου","name":"Όνομα","value":"Τιμή"},"select":{"title":"Ιδιότητες Πεδίου Επιλογής","selectInfo":"Πληροφορίες Πεδίου Επιλογής","opAvail":"Διαθέσιμες Επιλογές","value":"Τιμή","size":"Μέγεθος","lines":"γραμμές","chkMulti":"Να επιτρέπονται οι πολλαπλές επιλογές","opText":"Κείμενο","opValue":"Τιμή","btnAdd":"Προσθήκη","btnModify":"Τροποποίηση","btnUp":"Πάνω","btnDown":"Κάτω","btnSetValue":"Προεπιλογή","btnDelete":"Διαγραφή"},"textarea":{"title":"Ιδιότητες Περιοχής Κειμένου","cols":"Στήλες","rows":"Σειρές"},"textfield":{"title":"Ιδιότητες Πεδίου Κειμένου","name":"Όνομα","value":"Τιμή","charWidth":"Πλάτος Χαρακτήρων","maxChars":"Μέγιστοι χαρακτήρες","type":"Τύπος","typeText":"Κείμενο","typePass":"Κωδικός","typeEmail":"Email","typeSearch":"Αναζήτηση","typeTel":"Τηλέφωνο ","typeUrl":"URL"}},"format":{"label":"Μορφοποίηση","panelTitle":"Μορφοποίηση Παραγράφου","tag_address":"Διεύθυνση","tag_div":"Κανονικό (DIV)","tag_h1":"Επικεφαλίδα 1","tag_h2":"Επικεφαλίδα 2","tag_h3":"Επικεφαλίδα 3","tag_h4":"Επικεφαλίδα 4","tag_h5":"Επικεφαλίδα 5","tag_h6":"Επικεφαλίδα 6","tag_p":"Κανονικό","tag_pre":"Μορφοποιημένο"},"horizontalrule":{"toolbar":"Εισαγωγή Οριζόντιας Γραμμής"},"iframe":{"border":"Προβολή περιγράμματος πλαισίου","noUrl":"Παρακαλούμε εισάγεται το URL του iframe","scrolling":"Ενεργοποίηση μπαρών κύλισης","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Εισάγετε την τοποθεσία (URL) της εικόνας","alt":"Εναλλακτικό Κείμενο","border":"Περίγραμμα","btnUpload":"Αποστολή στον Διακομιστή","button2Img":"Θέλετε να μετατρέψετε το επιλεγμένο κουμπί εικόνας σε απλή εικόνα;","hSpace":"HSpace","img2Button":"Θέλετε να μεταμορφώσετε την επιλεγμένη εικόνα που είναι πάνω σε ένα κουμπί;","infoTab":"Πληροφορίες Εικόνας","linkTab":"Σύνδεσμος","lockRatio":"Κλείδωμα Αναλογίας","menu":"Ιδιότητες Εικόνας","resetSize":"Επαναφορά Αρχικού Μεγέθους","title":"Ιδιότητες Εικόνας","titleButton":"Ιδιότητες Κουμπιού Εικόνας","upload":"Αποστολή","urlMissing":"Το URL πηγής για την εικόνα λείπει.","vSpace":"VSpace","validateBorder":"Το περίγραμμα πρέπει να είναι ένας ακέραιος αριθμός.","validateHSpace":"Το HSpace πρέπει να είναι ένας ακέραιος αριθμός.","validateVSpace":"Το VSpace πρέπει να είναι ένας ακέραιος αριθμός."},"indent":{"indent":"Αύξηση Εσοχής","outdent":"Μείωση Εσοχής"},"smiley":{"options":"Επιλογές Smiley","title":"Επιλέξτε ένα Smiley","toolbar":"Smiley"},"justify":{"block":"Πλήρης Στοίχιση","center":"Στοίχιση στο Κέντρο","left":"Στοίχιση Αριστερά","right":"Στοίχιση Δεξιά"},"link":{"acccessKey":"Συντόμευση","advanced":"Για Προχωρημένους","advisoryContentType":"Ενδεικτικός Τύπος Περιεχομένου","advisoryTitle":"Ενδεικτικός Τίτλος","anchor":{"toolbar":"Εισαγωγή/επεξεργασία Άγκυρας","menu":"Ιδιότητες άγκυρας","title":"Ιδιότητες άγκυρας","name":"Όνομα άγκυρας","errorName":"Παρακαλούμε εισάγετε όνομα άγκυρας","remove":"Αφαίρεση Άγκυρας"},"anchorId":"Βάσει του Element Id","anchorName":"Βάσει του Ονόματος της άγκυρας","charset":"Κωδικοποίηση Χαρακτήρων Προσαρτημένης Πηγής","cssClasses":"Stylesheet Classes","emailAddress":"Διεύθυνση E-mail","emailBody":"Κείμενο Μηνύματος","emailSubject":"Θέμα Μηνύματος","id":"Id","info":"Πληροφορίες Συνδέσμου","langCode":"Κατεύθυνση Κειμένου","langDir":"Κατεύθυνση Κειμένου","langDirLTR":"Αριστερά προς Δεξιά (LTR)","langDirRTL":"Δεξιά προς Αριστερά (RTL)","menu":"Επεξεργασία Συνδέσμου","name":"Όνομα","noAnchors":"(Δεν υπάρχουν άγκυρες στο κείμενο)","noEmail":"Εισάγετε την διεύθυνση ηλεκτρονικού ταχυδρομείου","noUrl":"Εισάγετε την τοποθεσία (URL) του υπερσυνδέσμου (Link)","other":"<άλλο>","popupDependent":"Εξαρτημένο (Netscape)","popupFeatures":"Επιλογές Αναδυόμενου Παραθύρου","popupFullScreen":"Πλήρης Οθόνη (IE)","popupLeft":"Θέση Αριστερά","popupLocationBar":"Γραμμή Τοποθεσίας","popupMenuBar":"Γραμμή Επιλογών","popupResizable":"Προσαρμοζόμενο Μέγεθος","popupScrollBars":"Μπάρες Κύλισης","popupStatusBar":"Γραμμή Κατάστασης","popupToolbar":"Εργαλειοθήκη","popupTop":"Θέση Πάνω","rel":"Σχέση","selectAnchor":"Επιλέξτε μια Άγκυρα","styles":"Μορφή","tabIndex":"Σειρά Μεταπήδησης","target":"Παράθυρο Προορισμού","targetFrame":"<πλαίσιο>","targetFrameName":"Όνομα Παραθύρου Προορισμού","targetPopup":"<αναδυόμενο παράθυρο>","targetPopupName":"Όνομα Αναδυόμενου Παραθύρου","title":"Σύνδεσμος","toAnchor":"Άγκυρα σε αυτή τη σελίδα","toEmail":"E-Mail","toUrl":"URL","toolbar":"Σύνδεσμος","type":"Τύπος Συνδέσμου","unlink":"Αφαίρεση Συνδέσμου","upload":"Αποστολή"},"list":{"bulletedlist":"Εισαγωγή/Απομάκρυνση Λίστας Κουκκίδων","numberedlist":"Εισαγωγή/Απομάκρυνση Αριθμημένης Λίστας"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Ιδιότητες Λίστας Σημείων","circle":"Κύκλος","decimal":"Δεκαδικός (1, 2, 3, κτλ)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Δίσκος","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"Τίποτα","notset":"<δεν έχει οριστεί>","numberedTitle":"Ιδιότητες Αριθμημένης Λίστας ","square":"Τετράγωνο","start":"Εκκίνηση","type":"Τύπος","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"Ο αριθμός εκκίνησης της αρίθμησης πρέπει να είναι ακέραιος αριθμός."},"magicline":{"title":"Εισάγετε παράγραφο εδώ "},"maximize":{"maximize":"Μεγιστοποίηση","minimize":"Ελαχιστοποίηση"},"newpage":{"toolbar":"Νέα Σελίδα"},"pagebreak":{"alt":"Αλλαγή Σελίδας","toolbar":"Εισαγωγή τέλους σελίδας"},"pastetext":{"button":"Επικόλληση ως Απλό Κείμενο","title":"Επικόλληση ως Απλό Κείμενο"},"pastefromword":{"confirmCleanup":"Το κείμενο που επικολλάται φαίνεται να είναι αντιγραμμένο από το Word. Μήπως θα θέλατε να καθαριστεί προτού επικολληθεί;","error":"Δεν ήταν δυνατό να καθαριστούν τα δεδομένα λόγω ενός εσωτερικού σφάλματος","title":"Επικόλληση από το Word","toolbar":"Επικόλληση από το Word"},"preview":{"preview":"Προεπισκόπιση"},"print":{"toolbar":"Εκτύπωση"},"removeformat":{"toolbar":"Αφαίρεση Μορφοποίησης"},"save":{"toolbar":"Αποθήκευση"},"selectall":{"toolbar":"Επιλογή όλων"},"showblocks":{"toolbar":"Προβολή Περιοχών"},"sourcearea":{"toolbar":"HTML κώδικας"},"specialchar":{"options":"Επιλογές Ειδικών Χαρακτήρων","title":"Επιλέξτε έναν Ειδικό Χαρακτήρα","toolbar":"Εισαγωγή Ειδικού Χαρακτήρα"},"scayt":{"about":"About SCAYT","aboutTab":"Περί","addWord":"Προσθήκη στο λεξικό","allCaps":"Να αγνοούνται όλες οι λέξεις σε κεφαλαία","dic_create":"Δημιουργία","dic_delete":"Διαγραφή","dic_field_name":"Όνομα λεξικού","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Μετονομασία","dic_restore":"Ανάκτηση","dictionariesTab":"Λεξικά","disable":"Disable SCAYT","emptyDic":"Το όνομα του λεξικού δεν πρέπει να είναι κενό.","enable":"Enable SCAYT","ignore":"Αγνόησε το","ignoreAll":"Να αγνοηθούν όλα","ignoreDomainNames":"Ignore Domain Names","langs":"Γλώσσες","languagesTab":"Γλώσσες","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"Περισσότερες προτάσεις","opera_title":"Not supported by Opera","options":"Επιλογές","optionsTab":"Επιλογές","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Μορφές","panelTitle":"Στυλ Μορφοποίησης","panelTitle1":"Στυλ Κομματιών","panelTitle2":"Στυλ Εν Σειρά","panelTitle3":"Στυλ Αντικειμένων"},"table":{"border":"Πάχος Περιγράμματος","caption":"Λεζάντα","cell":{"menu":"Κελί","insertBefore":"Εισαγωγή Κελιού Πριν","insertAfter":"Εισαγωγή Κελιού Μετά","deleteCell":"Διαγραφή Κελιών","merge":"Ενοποίηση Κελιών","mergeRight":"Συγχώνευση Με Δεξιά","mergeDown":"Συγχώνευση Με Κάτω","splitHorizontal":"Οριζόντιο Μοίρασμα Κελιού","splitVertical":"Κατακόρυφο Μοίρασμα Κελιού","title":"Ιδιότητες Κελιού","cellType":"Τύπος Κελιού","rowSpan":"Εύρος Σειρών","colSpan":"Εύρος Στηλών","wordWrap":"Word Wrap","hAlign":"Οριζόντια Στοίχιση","vAlign":"Κάθετη Στοίχιση","alignBaseline":"Baseline","bgColor":"Χρώμα Φόντου","borderColor":"Χρώμα Περιγράμματος","data":"Δεδομένα","header":"Κεφαλίδα","yes":"Ναι","no":"Όχι","invalidWidth":"Το πλάτος του κελιού πρέπει να είναι ένας αριθμός.","invalidHeight":"Το ύψος του κελιού πρέπει να είναι ένας αριθμός.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Επιλέξτε"},"cellPad":"Γέμισμα κελιών","cellSpace":"Διάστημα κελιών","column":{"menu":"Στήλη","insertBefore":"Εισαγωγή Στήλης Πριν","insertAfter":"Εισαγωγή Σειράς Μετά","deleteColumn":"Διαγραφή Κολωνών"},"columns":"Κολώνες","deleteTable":"Διαγραφή πίνακα","headers":"Κεφαλίδες","headersBoth":"Και τα δύο","headersColumn":"Πρώτη Στήλη","headersNone":"Κανένα","headersRow":"Πρώτη Σειρά","invalidBorder":"Το πάχος του περιγράμματος πρέπει να είναι ένας αριθμός.","invalidCellPadding":"Το γέμισμα μέσα στα κελιά πρέπει να είναι ένας θετικός αριθμός.","invalidCellSpacing":"Η απόσταση μεταξύ των κελιών πρέπει να είναι ένας θετικός αριθμός.","invalidCols":"Ο αριθμός των στηλών πρέπει να είναι μεγαλύτερος από 0.","invalidHeight":"Το ύψος του πίνακα πρέπει να είναι ένας αριθμός.","invalidRows":"Ο αριθμός των σειρών πρέπει να είναι μεγαλύτερος από 0.","invalidWidth":"Το πλάτος του πίνακα πρέπει να είναι ένας αριθμός.","menu":"Ιδιότητες Πίνακα","row":{"menu":"Σειρά","insertBefore":"Εισαγωγή Σειράς Από Πάνω","insertAfter":"Εισαγωγή Σειράς Από Κάτω","deleteRow":"Διαγραφή Γραμμών"},"rows":"Γραμμές","summary":"Περίληψη","title":"Ιδιότητες Πίνακα","toolbar":"Πίνακας","widthPc":"τοις εκατό","widthPx":"pixels","widthUnit":"μονάδα πλάτους"},"undo":{"redo":"Επαναφορά","undo":"Αναίρεση"},"wsc":{"btnIgnore":"Αγνόηση","btnIgnoreAll":"Αγνόηση όλων","btnReplace":"Αντικατάσταση","btnReplaceAll":"Αντικατάσταση όλων","btnUndo":"Αναίρεση","changeTo":"Αλλαγή σε","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Δεν υπάρχει εγκατεστημένος ορθογράφος. Θέλετε να τον κατεβάσετε τώρα;","manyChanges":"Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Άλλαξαν %1 λέξεις","noChanges":"Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Δεν άλλαξαν λέξεις","noMispell":"Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Δεν βρέθηκαν λάθη","noSuggestions":"- Δεν υπάρχουν προτάσεις -","notAvailable":"Η υπηρεσία δεν είναι διαθέσιμη αυτήν την στιγμή.","notInDic":"Δεν υπάρχει στο λεξικό","oneChange":"Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Άλλαξε μια λέξη","progress":"Γίνεται ορθογραφικός έλεγχος...","title":"Ορθογραφικός Έλεγχος","toolbar":"Ορθογραφικός Έλεγχος"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/en-au.js b/htmltest/sites/all/libraries/ckeditor-version/lang/en-au.js
new file mode 100644
index 00000000..100f8ee8
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/en-au.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['en-au']={"editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Align","alignLeft":"Left","alignRight":"Right","alignCenter":"Centre","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"colorbutton":{"auto":"Automatic","bgColorTitle":"Background Colour","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"More Colours...","panelTitle":"Colors","textColorTitle":"Text Colour"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"Templates","emptyListMsg":"(No templates defined)","insertOption":"Replace actual contents","options":"Template Options","selectPromptMsg":"Please select the template to open in the editor","title":"Content Templates"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Left to Right (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Right to Left (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"Find","findOptions":"Find Options","findWhat":"Find what:","matchCase":"Match case","matchCyclic":"Match cyclic","matchWord":"Match whole word","notFoundMsg":"The specified text was not found.","replace":"Replace","replaceAll":"Replace All","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Replace with:","title":"Find and Replace"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"Abs Bottom","alignAbsMiddle":"Abs Middle","alignBaseline":"Baseline","alignTextTop":"Text Top","bgcolor":"Background colour","chkFull":"Allow Fullscreen","chkLoop":"Loop","chkMenu":"Enable Flash Menu","chkPlay":"Auto Play","flashvars":"Variables for Flash","hSpace":"HSpace","properties":"Flash Properties","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"Scale","scaleAll":"Show all","scaleFit":"Exact Fit","scaleNoBorder":"No Border","title":"Flash Properties","vSpace":"VSpace","validateHSpace":"HSpace must be a number.","validateSrc":"URL must not be empty.","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Size","voiceLabel":"Font Size","panelTitle":"Font Size"},"label":"Font","panelTitle":"Font Name","voiceLabel":"Font"},"forms":{"button":{"title":"Button Properties","text":"Text (Value)","type":"Type","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"Checkbox Properties","radioTitle":"Radio Button Properties","value":"Value","selected":"Selected"},"form":{"title":"Form Properties","menu":"Form Properties","action":"Action","method":"Method","encoding":"Encoding"},"hidden":{"title":"Hidden Field Properties","name":"Name","value":"Value"},"select":{"title":"Selection Field Properties","selectInfo":"Select Info","opAvail":"Available Options","value":"Value","size":"Size","lines":"lines","chkMulti":"Allow multiple selections","opText":"Text","opValue":"Value","btnAdd":"Add","btnModify":"Modify","btnUp":"Up","btnDown":"Down","btnSetValue":"Set as selected value","btnDelete":"Delete"},"textarea":{"title":"Textarea Properties","cols":"Columns","rows":"Rows"},"textfield":{"title":"Text Field Properties","name":"Name","value":"Value","charWidth":"Character Width","maxChars":"Maximum Characters","type":"Type","typeText":"Text","typePass":"Password","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"smiley":{"options":"Smiley Options","title":"Insert a Smiley","toolbar":"Smiley"},"justify":{"block":"Justify","center":"Centre","left":"Align Left","right":"Align Right"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"newpage":{"toolbar":"New Page"},"pagebreak":{"alt":"Page Break","toolbar":"Insert Page Break for Printing"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"preview":{"preview":"Preview"},"print":{"toolbar":"Print"},"removeformat":{"toolbar":"Remove Format"},"save":{"toolbar":"Save"},"selectall":{"toolbar":"Select All"},"showblocks":{"toolbar":"Show Blocks"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a number.","invalidCellSpacing":"Cell spacing must be a number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/en-ca.js b/htmltest/sites/all/libraries/ckeditor-version/lang/en-ca.js
new file mode 100644
index 00000000..c450d384
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/en-ca.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['en-ca']={"editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Align","alignLeft":"Left","alignRight":"Right","alignCenter":"Centre","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"colorbutton":{"auto":"Automatic","bgColorTitle":"Background Colour","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"More Colours...","panelTitle":"Colors","textColorTitle":"Text Colour"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"Templates","emptyListMsg":"(No templates defined)","insertOption":"Replace actual contents","options":"Template Options","selectPromptMsg":"Please select the template to open in the editor","title":"Content Templates"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Left to Right (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Right to Left (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"Find","findOptions":"Find Options","findWhat":"Find what:","matchCase":"Match case","matchCyclic":"Match cyclic","matchWord":"Match whole word","notFoundMsg":"The specified text was not found.","replace":"Replace","replaceAll":"Replace All","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Replace with:","title":"Find and Replace"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"Abs Bottom","alignAbsMiddle":"Abs Middle","alignBaseline":"Baseline","alignTextTop":"Text Top","bgcolor":"Background colour","chkFull":"Allow Fullscreen","chkLoop":"Loop","chkMenu":"Enable Flash Menu","chkPlay":"Auto Play","flashvars":"Variables for Flash","hSpace":"HSpace","properties":"Flash Properties","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"Scale","scaleAll":"Show all","scaleFit":"Exact Fit","scaleNoBorder":"No Border","title":"Flash Properties","vSpace":"VSpace","validateHSpace":"HSpace must be a number.","validateSrc":"URL must not be empty.","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Size","voiceLabel":"Font Size","panelTitle":"Font Size"},"label":"Font","panelTitle":"Font Name","voiceLabel":"Font"},"forms":{"button":{"title":"Button Properties","text":"Text (Value)","type":"Type","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"Checkbox Properties","radioTitle":"Radio Button Properties","value":"Value","selected":"Selected"},"form":{"title":"Form Properties","menu":"Form Properties","action":"Action","method":"Method","encoding":"Encoding"},"hidden":{"title":"Hidden Field Properties","name":"Name","value":"Value"},"select":{"title":"Selection Field Properties","selectInfo":"Select Info","opAvail":"Available Options","value":"Value","size":"Size","lines":"lines","chkMulti":"Allow multiple selections","opText":"Text","opValue":"Value","btnAdd":"Add","btnModify":"Modify","btnUp":"Up","btnDown":"Down","btnSetValue":"Set as selected value","btnDelete":"Delete"},"textarea":{"title":"Textarea Properties","cols":"Columns","rows":"Rows"},"textfield":{"title":"Text Field Properties","name":"Name","value":"Value","charWidth":"Character Width","maxChars":"Maximum Characters","type":"Type","typeText":"Text","typePass":"Password","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"smiley":{"options":"Smiley Options","title":"Insert a Smiley","toolbar":"Smiley"},"justify":{"block":"Justify","center":"Centre","left":"Align Left","right":"Align Right"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"newpage":{"toolbar":"New Page"},"pagebreak":{"alt":"Page Break","toolbar":"Insert Page Break for Printing"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"preview":{"preview":"Preview"},"print":{"toolbar":"Print"},"removeformat":{"toolbar":"Remove Format"},"save":{"toolbar":"Save"},"selectall":{"toolbar":"Select All"},"showblocks":{"toolbar":"Show Blocks"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a number.","invalidCellSpacing":"Cell spacing must be a number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/en-gb.js b/htmltest/sites/all/libraries/ckeditor-version/lang/en-gb.js
new file mode 100644
index 00000000..8b32f96e
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/en-gb.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['en-gb']={"editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Drag to resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Align","alignLeft":"Left","alignRight":"Right","alignCenter":"Centre","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"colorbutton":{"auto":"Automatic","bgColorTitle":"Background Colour","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Grey","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Grey","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Grey","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Grey","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"More Colours...","panelTitle":"Colours","textColorTitle":"Text Colour"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Colour Options","selected":"Selected Colour","title":"Select colour"},"templates":{"button":"Templates","emptyListMsg":"(No templates defined)","insertOption":"Replace actual contents","options":"Template Options","selectPromptMsg":"Please select the template to open in the editor","title":"Content Templates"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Left to Right (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Right to Left (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"Find","findOptions":"Find Options","findWhat":"Find what:","matchCase":"Match case","matchCyclic":"Match cyclic","matchWord":"Match whole word","notFoundMsg":"The specified text was not found.","replace":"Replace","replaceAll":"Replace All","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Replace with:","title":"Find and Replace"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"Abs Bottom","alignAbsMiddle":"Abs Middle","alignBaseline":"Baseline","alignTextTop":"Text Top","bgcolor":"Background colour","chkFull":"Allow Fullscreen","chkLoop":"Loop","chkMenu":"Enable Flash Menu","chkPlay":"Auto Play","flashvars":"Variables for Flash","hSpace":"HSpace","properties":"Flash Properties","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"Scale","scaleAll":"Show all","scaleFit":"Exact Fit","scaleNoBorder":"No Border","title":"Flash Properties","vSpace":"VSpace","validateHSpace":"HSpace must be a number.","validateSrc":"URL must not be empty.","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Size","voiceLabel":"Font Size","panelTitle":"Font Size"},"label":"Font","panelTitle":"Font Name","voiceLabel":"Font"},"forms":{"button":{"title":"Button Properties","text":"Text (Value)","type":"Type","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"Checkbox Properties","radioTitle":"Radio Button Properties","value":"Value","selected":"Selected"},"form":{"title":"Form Properties","menu":"Form Properties","action":"Action","method":"Method","encoding":"Encoding"},"hidden":{"title":"Hidden Field Properties","name":"Name","value":"Value"},"select":{"title":"Selection Field Properties","selectInfo":"Select Info","opAvail":"Available Options","value":"Value","size":"Size","lines":"lines","chkMulti":"Allow multiple selections","opText":"Text","opValue":"Value","btnAdd":"Add","btnModify":"Modify","btnUp":"Up","btnDown":"Down","btnSetValue":"Set as selected value","btnDelete":"Delete"},"textarea":{"title":"Textarea Properties","cols":"Columns","rows":"Rows"},"textfield":{"title":"Text Field Properties","name":"Name","value":"Value","charWidth":"Character Width","maxChars":"Maximum Characters","type":"Type","typeText":"Text","typePass":"Password","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"smiley":{"options":"Smiley Options","title":"Insert a Smiley","toolbar":"Smiley"},"justify":{"block":"Justify","center":"Centre","left":"Align Left","right":"Align Right"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximise","minimize":"Minimise"},"newpage":{"toolbar":"New Page"},"pagebreak":{"alt":"Page Break","toolbar":"Insert Page Break for Printing"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"preview":{"preview":"Preview"},"print":{"toolbar":"Print"},"removeformat":{"toolbar":"Remove Format"},"save":{"toolbar":"Save"},"selectall":{"toolbar":"Select All"},"showblocks":{"toolbar":"Show Blocks"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a number.","invalidCellSpacing":"Cell spacing must be a number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/en.js b/htmltest/sites/all/libraries/ckeditor-version/lang/en.js
new file mode 100644
index 00000000..66c3ee52
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/en.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['en']={"editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Alignment","alignLeft":"Left","alignRight":"Right","alignCenter":"Center","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"colorbutton":{"auto":"Automatic","bgColorTitle":"Background Color","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"More Colors...","panelTitle":"Colors","textColorTitle":"Text Color"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"Templates","emptyListMsg":"(No templates defined)","insertOption":"Replace actual contents","options":"Template Options","selectPromptMsg":"Please select the template to open in the editor","title":"Content Templates"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Left to Right (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Right to Left (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"Find","findOptions":"Find Options","findWhat":"Find what:","matchCase":"Match case","matchCyclic":"Match cyclic","matchWord":"Match whole word","notFoundMsg":"The specified text was not found.","replace":"Replace","replaceAll":"Replace All","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Replace with:","title":"Find and Replace"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"Abs Bottom","alignAbsMiddle":"Abs Middle","alignBaseline":"Baseline","alignTextTop":"Text Top","bgcolor":"Background color","chkFull":"Allow Fullscreen","chkLoop":"Loop","chkMenu":"Enable Flash Menu","chkPlay":"Auto Play","flashvars":"Variables for Flash","hSpace":"HSpace","properties":"Flash Properties","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"Scale","scaleAll":"Show all","scaleFit":"Exact Fit","scaleNoBorder":"No Border","title":"Flash Properties","vSpace":"VSpace","validateHSpace":"HSpace must be a number.","validateSrc":"URL must not be empty.","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Size","voiceLabel":"Font Size","panelTitle":"Font Size"},"label":"Font","panelTitle":"Font Name","voiceLabel":"Font"},"forms":{"button":{"title":"Button Properties","text":"Text (Value)","type":"Type","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"Checkbox Properties","radioTitle":"Radio Button Properties","value":"Value","selected":"Selected"},"form":{"title":"Form Properties","menu":"Form Properties","action":"Action","method":"Method","encoding":"Encoding"},"hidden":{"title":"Hidden Field Properties","name":"Name","value":"Value"},"select":{"title":"Selection Field Properties","selectInfo":"Select Info","opAvail":"Available Options","value":"Value","size":"Size","lines":"lines","chkMulti":"Allow multiple selections","opText":"Text","opValue":"Value","btnAdd":"Add","btnModify":"Modify","btnUp":"Up","btnDown":"Down","btnSetValue":"Set as selected value","btnDelete":"Delete"},"textarea":{"title":"Textarea Properties","cols":"Columns","rows":"Rows"},"textfield":{"title":"Text Field Properties","name":"Name","value":"Value","charWidth":"Character Width","maxChars":"Maximum Characters","type":"Type","typeText":"Text","typePass":"Password","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"smiley":{"options":"Smiley Options","title":"Insert a Smiley","toolbar":"Smiley"},"justify":{"block":"Justify","center":"Center","left":"Align Left","right":"Align Right"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"newpage":{"toolbar":"New Page"},"pagebreak":{"alt":"Page Break","toolbar":"Insert Page Break for Printing"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"preview":{"preview":"Preview"},"print":{"toolbar":"Print"},"removeformat":{"toolbar":"Remove Format"},"save":{"toolbar":"Save"},"selectall":{"toolbar":"Select All"},"showblocks":{"toolbar":"Show Blocks"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/eo.js b/htmltest/sites/all/libraries/ckeditor-version/lang/eo.js
new file mode 100644
index 00000000..6a795515
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/eo.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['eo']={"editor":"Redaktilo por Riĉiga Teksto","common":{"editorHelp":"Premu ALT 0 por helpilo","browseServer":"Foliumi en la Servilo","url":"URL","protocol":"Protokolo","upload":"Alŝuti","uploadSubmit":"Sendu al Servilo","image":"Bildo","flash":"Flaŝo","form":"Formularo","checkbox":"Markobutono","radio":"Radiobutono","textField":"Teksta kampo","textarea":"Teksta Areo","hiddenField":"Kaŝita Kampo","button":"Butono","select":"Elekta Kampo","imageButton":"Bildbutono","notSet":"<Defaŭlta>","id":"Id","name":"Nomo","langDir":"Skribdirekto","langDirLtr":"De maldekstro dekstren (LTR)","langDirRtl":"De dekstro maldekstren (RTL)","langCode":"Lingva Kodo","longDescr":"URL de Longa Priskribo","cssClass":"Klasoj de Stilfolioj","advisoryTitle":"Priskriba Titolo","cssStyle":"Stilo","ok":"Akcepti","cancel":"Rezigni","close":"Fermi","preview":"Vidigi Aspekton","resize":"Movigi por ŝanĝi la grandon","generalTab":"Ĝenerala","advancedTab":"Speciala","validateNumberFailed":"Tiu valoro ne estas nombro.","confirmNewPage":"La neregistritaj ŝanĝoj estas perdotaj. Ĉu vi certas, ke vi volas ŝargi novan paĝon?","confirmCancel":"Iuj opcioj esta ŝanĝitaj. Ĉu vi certas, ke vi volas fermi la dialogon?","options":"Opcioj","target":"Celo","targetNew":"Nova Fenestro (_blank)","targetTop":"Supra Fenestro (_top)","targetSelf":"Sama Fenestro (_self)","targetParent":"Patra Fenestro (_parent)","langDirLTR":"De maldekstro dekstren (LTR)","langDirRTL":"De dekstro maldekstren (RTL)","styles":"Stilo","cssClasses":"Stilfoliaj Klasoj","width":"Larĝo","height":"Alto","align":"Ĝisrandigo","alignLeft":"Maldekstre","alignRight":"Dekstre","alignCenter":"Centre","alignTop":"Supre","alignMiddle":"Centre","alignBottom":"Malsupre","invalidValue":"Nevalida Valoro","invalidHeight":"Alto devas esti nombro.","invalidWidth":"Larĝo devas esti nombro.","invalidCssLength":"La valoro indikita por la \"%1\" kampo devas esti pozitiva nombro kun aŭ sen valida CSSmezurunuo (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"La valoro indikita por la \"%1\" kampo devas esti pozitiva nombro kun aŭ sen valida HTMLmezurunuo (px or %).","invalidInlineStyle":"La valoro indikita por la enlinia stilo devas konsisti el unu aŭ pluraj elementoj kun la formato de \"nomo : valoro\", apartigitaj per punktokomoj.","cssLengthTooltip":"Entajpu nombron por rastrumera valoro aŭ nombron kun valida CSSunuo (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, nehavebla</span>"},"about":{"copy":"Copyright &copy; $1. Ĉiuj rajtoj rezervitaj.","dlgTitle":"Pri CKEditor","help":"Kontroli $1 por helpo.","moreInfo":"Por informoj pri licenco, bonvolu viziti nian retpaĝaron:","title":"Pri CKEditor","userGuide":"CKEditor Uzindikoj"},"basicstyles":{"bold":"Grasa","italic":"Kursiva","strike":"Trastreko","subscript":"Suba indico","superscript":"Supra indico","underline":"Substreko"},"bidi":{"ltr":"Tekstdirekto de maldekstre dekstren","rtl":"Tekstdirekto de dekstre maldekstren"},"blockquote":{"toolbar":"Citaĵo"},"clipboard":{"copy":"Kopii","copyError":"La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras kopiajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-C).","cut":"Eltondi","cutError":"La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras eltondajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-X).","paste":"Interglui","pasteArea":"Intergluoareo","pasteMsg":"Bonvolu glui la tekston en la jenan areon per uzado de la klavaro (<strong>Ctrl/Cmd+V</strong>) kaj premu OK","securityMsg":"Pro la sekurecagordo de via TTT-legilo, la redaktilo ne povas rekte atingi viajn datenojn en la poŝo. Bonvolu denove interglui la datenojn en tiun fenestron.","title":"Interglui"},"colorbutton":{"auto":"Aŭtomata","bgColorTitle":"Fona Koloro","colors":{"000":"Nigra","800000":"Kaŝtankolora","8B4513":"Mezbruna","2F4F4F":"Ardezgriza","008080":"Marĉanaskolora","000080":"Maristblua","4B0082":"Indigokolora","696969":"Malhelgriza","B22222":"Brikruĝa","A52A2A":"Bruna","DAA520":"Senbrilorkolora","006400":"Malhelverda","40E0D0":"Turkisblua","0000CD":"Reĝblua","800080":"Purpura","808080":"Griza","F00":"Ruĝa","FF8C00":"Malheloranĝkolora","FFD700":"Orkolora","008000":"Verda","0FF":"Verdblua","00F":"Blua","EE82EE":"Viola","A9A9A9":"Mezgriza","FFA07A":"Salmokolora","FFA500":"Oranĝkolora","FFFF00":"Flava","00FF00":"Limetkolora","AFEEEE":"Helturkiskolora","ADD8E6":"Helblua","DDA0DD":"Prunkolora","D3D3D3":"Helgriza","FFF0F5":"Lavendkolora vangoŝminko","FAEBD7":"Antikvablanka","FFFFE0":"Helflava","F0FFF0":"Vintromelonkolora","F0FFFF":"Lazura","F0F8FF":"Aliceblua","E6E6FA":"Lavendkolora","FFF":"Blanka"},"more":"Pli da Koloroj...","panelTitle":"Koloroj","textColorTitle":"Teksta Koloro"},"colordialog":{"clear":"Forigi","highlight":"Detaloj","options":"Opcioj pri koloroj","selected":"Selektita koloro","title":"Selekti koloron"},"templates":{"button":"Ŝablonoj","emptyListMsg":"(Neniu ŝablono difinita)","insertOption":"Anstataŭigi la nunan enhavon","options":"Opcioj pri ŝablonoj","selectPromptMsg":"Bonvolu selekti la ŝablonon por malfermi ĝin en la redaktilo","title":"Enhavo de ŝablonoj"},"contextmenu":{"options":"Opcioj de Kunteksta Menuo"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Priskriba Titolo","cssClassInputLabel":"Stilfolioklasoj","edit":"Redakti Div","inlineStyleInputLabel":"Enlinia stilo","langDirLTRLabel":"Maldekstre dekstren (angle LTR)","langDirLabel":"Skribdirekto","langDirRTLLabel":"Dekstre maldekstren (angle RTL)","languageCodeInputLabel":" Lingvokodo","remove":"Forigi Div","styleSelectLabel":"Stilo","title":"Krei DIV ujon","toolbar":"Krei DIV ujon"},"toolbar":{"toolbarCollapse":"Faldi la ilbreton","toolbarExpand":"Malfaldi la ilbreton","toolbarGroups":{"document":"Dokumento","clipboard":"Poŝo/Malfari","editing":"Redaktado","forms":"Formularoj","basicstyles":"Bazaj stiloj","paragraph":"Paragrafo","links":"Ligiloj","insert":"Enmeti","styles":"Stiloj","colors":"Koloroj","tools":"Iloj"},"toolbars":"Ilobretoj de la redaktilo"},"elementspath":{"eleLabel":"Vojo al Elementoj","eleTitle":"%1 elementoj"},"find":{"find":"Serĉi","findOptions":"Opcioj pri Serĉado","findWhat":"Serĉi:","matchCase":"Kongruigi Usklecon","matchCyclic":"Cikla Serĉado","matchWord":"Tuta Vorto","notFoundMsg":"La celteksto ne estas trovita.","replace":"Anstataŭigi","replaceAll":"Anstataŭigi Ĉion","replaceSuccessMsg":"%1 anstataŭigita(j) apero(j).","replaceWith":"Anstataŭigi per:","title":"Serĉi kaj Anstataŭigi"},"fakeobjects":{"anchor":"Ankro","flash":"FlaŝAnimacio","hiddenfield":"Kaŝita kampo","iframe":"Enlinia Kadro (IFrame)","unknown":"Nekonata objekto"},"flash":{"access":"Atingi skriptojn","accessAlways":"Ĉiam","accessNever":"Neniam","accessSameDomain":"Sama domajno","alignAbsBottom":"Absoluta Malsupro","alignAbsMiddle":"Absoluta Centro","alignBaseline":"TekstoMalsupro","alignTextTop":"TekstoSupro","bgcolor":"Fona Koloro","chkFull":"Permesi tutekranon","chkLoop":"Iteracio","chkMenu":"Ebligi flaŝmenuon","chkPlay":"Aŭtomata legado","flashvars":"Variabloj por Flaŝo","hSpace":"Horizontala Spaco","properties":"Flaŝatributoj","propertiesTab":"Atributoj","quality":"Kvalito","qualityAutoHigh":"Aŭtomate alta","qualityAutoLow":"Aŭtomate malalta","qualityBest":"Plej bona","qualityHigh":"Alta","qualityLow":"Malalta","qualityMedium":"Meza","scale":"Skalo","scaleAll":"Montri ĉion","scaleFit":"Origina grando","scaleNoBorder":"Neniu bordero","title":"Flaŝatributoj","vSpace":"Vertikala Spaco","validateHSpace":"Horizontala Spaco devas esti nombro.","validateSrc":"Bonvolu entajpi la retadreson (URL)","validateVSpace":"Vertikala Spaco devas esti nombro.","windowMode":"Fenestra reĝimo","windowModeOpaque":"Opaka","windowModeTransparent":"Travidebla","windowModeWindow":"Fenestro"},"font":{"fontSize":{"label":"Grado","voiceLabel":"Tipara grado","panelTitle":"Tipara grado"},"label":"Tiparo","panelTitle":"Tipara nomo","voiceLabel":"Tiparo"},"forms":{"button":{"title":"Butonaj atributoj","text":"Teksto (Valoro)","type":"Tipo","typeBtn":"Butono","typeSbm":"Validigi (submit)","typeRst":"Remeti en la originstaton (Reset)"},"checkboxAndRadio":{"checkboxTitle":"Markobutonaj Atributoj","radioTitle":"Radiobutonaj Atributoj","value":"Valoro","selected":"Selektita"},"form":{"title":"Formularaj Atributoj","menu":"Formularaj Atributoj","action":"Ago","method":"Metodo","encoding":"Kodoprezento"},"hidden":{"title":"Atributoj de Kaŝita Kampo","name":"Nomo","value":"Valoro"},"select":{"title":"Atributoj de Elekta Kampo","selectInfo":"Informoj pri la rulummenuo","opAvail":"Elektoj Disponeblaj","value":"Valoro","size":"Grando","lines":"Linioj","chkMulti":"Permesi Plurajn Elektojn","opText":"Teksto","opValue":"Valoro","btnAdd":"Aldoni","btnModify":"Modifi","btnUp":"Supren","btnDown":"Malsupren","btnSetValue":"Agordi kiel Elektitan Valoron","btnDelete":"Forigi"},"textarea":{"title":"Atributoj de Teksta Areo","cols":"Kolumnoj","rows":"Linioj"},"textfield":{"title":"Atributoj de Teksta Kampo","name":"Nomo","value":"Valoro","charWidth":"Signolarĝo","maxChars":"Maksimuma Nombro da Signoj","type":"Tipo","typeText":"Teksto","typePass":"Pasvorto","typeEmail":"retpoŝtadreso","typeSearch":"Serĉi","typeTel":"Telefonnumero","typeUrl":"URL"}},"format":{"label":"Formato","panelTitle":"ParagrafFormato","tag_address":"Adreso","tag_div":"Normala (DIV)","tag_h1":"Titolo 1","tag_h2":"Titolo 2","tag_h3":"Titolo 3","tag_h4":"Titolo 4","tag_h5":"Titolo 5","tag_h6":"Titolo 6","tag_p":"Normala","tag_pre":"Formatita"},"horizontalrule":{"toolbar":"Enmeti Horizontalan Linion"},"iframe":{"border":"Montri borderon de kadro (frame)","noUrl":"Bonvolu entajpi la retadreson de la ligilo al la enlinia kadro (IFrame)","scrolling":"Ebligi rulumskalon","title":"Atributoj de la enlinia kadro (IFrame)","toolbar":"Enlinia kadro (IFrame)"},"image":{"alertUrl":"Bonvolu tajpi la retadreson de la bildo","alt":"Anstataŭiga Teksto","border":"Bordero","btnUpload":"Sendu al Servilo","button2Img":"Ĉu vi volas transformi la selektitan bildbutonon en simplan bildon?","hSpace":"Horizontala Spaco","img2Button":"Ĉu vi volas transformi la selektitan bildon en bildbutonon?","infoTab":"Informoj pri Bildo","linkTab":"Ligilo","lockRatio":"Konservi Proporcion","menu":"Atributoj de Bildo","resetSize":"Origina Grando","title":"Atributoj de Bildo","titleButton":"Bildbutonaj Atributoj","upload":"Alŝuti","urlMissing":"La fontretadreso de la bildo mankas.","vSpace":"Vertikala Spaco","validateBorder":"La bordero devas esti entjera nombro.","validateHSpace":"La horizontala spaco devas esti entjera nombro.","validateVSpace":"La vertikala spaco devas esti entjera nombro."},"indent":{"indent":"Pligrandigi Krommarĝenon","outdent":"Malpligrandigi Krommarĝenon"},"smiley":{"options":"Opcioj pri mienvinjetoj","title":"Enmeti Mienvinjeton","toolbar":"Mienvinjeto"},"justify":{"block":"Ĝisrandigi Ambaŭflanke","center":"Centrigi","left":"Ĝisrandigi maldekstren","right":"Ĝisrandigi dekstren"},"link":{"acccessKey":"Fulmoklavo","advanced":"Speciala","advisoryContentType":"Enhavotipo","advisoryTitle":"Priskriba Titolo","anchor":{"toolbar":"Ankro","menu":"Enmeti/Ŝanĝi Ankron","title":"Ankraj Atributoj","name":"Ankra Nomo","errorName":"Bv entajpi la ankran nomon","remove":"Forigi Ankron"},"anchorId":"Per Elementidentigilo","anchorName":"Per Ankronomo","charset":"Signaro de la Ligita Rimedo","cssClasses":"Klasoj de Stilfolioj","emailAddress":"Retpoŝto","emailBody":"Mesaĝa korpo","emailSubject":"Mesaĝa Temo","id":"Id","info":"Informoj pri la Ligilo","langCode":"Lingva Kodo","langDir":"Skribdirekto","langDirLTR":"De maldekstro dekstren (LTR)","langDirRTL":"De dekstro maldekstren (RTL)","menu":"Ŝanĝi Ligilon","name":"Nomo","noAnchors":"<Ne disponeblas ankroj en la dokumento>","noEmail":"Bonvolu entajpi la retpoŝtadreson","noUrl":"Bonvolu entajpi la URL-on","other":"<alia>","popupDependent":"Dependa (Netscape)","popupFeatures":"Atributoj de la Ŝprucfenestro","popupFullScreen":"Tutekrane (IE)","popupLeft":"Maldekstra Pozicio","popupLocationBar":"Adresobreto","popupMenuBar":"Menubreto","popupResizable":"Dimensiŝanĝebla","popupScrollBars":"Rulumskaloj","popupStatusBar":"Statobreto","popupToolbar":"Ilobreto","popupTop":"Supra Pozicio","rel":"Rilato","selectAnchor":"Elekti Ankron","styles":"Stilo","tabIndex":"Taba Indekso","target":"Celo","targetFrame":"<kadro>","targetFrameName":"Nomo de CelKadro","targetPopup":"<ŝprucfenestro>","targetPopupName":"Nomo de Ŝprucfenestro","title":"Ligilo","toAnchor":"Ankri en tiu ĉi paĝo","toEmail":"Retpoŝto","toUrl":"URL","toolbar":"Enmeti/Ŝanĝi Ligilon","type":"Tipo de Ligilo","unlink":"Forigi Ligilon","upload":"Alŝuti"},"list":{"bulletedlist":"Bula Listo","numberedlist":"Numera Listo"},"liststyle":{"armenian":"Armena nombrado","bulletedTitle":"Atributoj de Bula Listo","circle":"Cirklo","decimal":"Dekumaj Nombroj (1, 2, 3, ktp.)","decimalLeadingZero":"Dekumaj Nombroj malantaŭ nulo (01, 02, 03, ktp.)","disc":"Disko","georgian":"Gruza nombrado (an, ban, gan, ktp.)","lowerAlpha":"Minusklaj Literoj (a, b, c, d, e, ktp.)","lowerGreek":"Grekaj Minusklaj Literoj (alpha, beta, gamma, ktp.)","lowerRoman":"Minusklaj Romanaj Nombroj (i, ii, iii, iv, v, ktp.)","none":"Neniu","notset":"<Defaŭlta>","numberedTitle":"Atributoj de Numera Listo","square":"kvadrato","start":"Komenco","type":"Tipo","upperAlpha":"Majusklaj Literoj (A, B, C, D, E, ktp.)","upperRoman":"Majusklaj Romanaj Nombroj (I, II, III, IV, V, ktp.)","validateStartNumber":"La unua listero devas esti entjera nombro."},"magicline":{"title":"Enmeti paragrafon ĉi-tien"},"maximize":{"maximize":"Pligrandigi","minimize":"Malgrandigi"},"newpage":{"toolbar":"Nova Paĝo"},"pagebreak":{"alt":"Paĝavanco","toolbar":"Enmeti Paĝavancon por Presado"},"pastetext":{"button":"Interglui kiel platan tekston","title":"Interglui kiel platan tekston"},"pastefromword":{"confirmCleanup":"La teksto, kiun vi volas interglui, ŝajnas esti kopiita el Word. Ĉu vi deziras purigi ĝin antaŭ intergluo?","error":"Ne eblis purigi la intergluitajn datenojn pro interna eraro","title":"Interglui el Word","toolbar":"Interglui el Word"},"preview":{"preview":"Vidigi Aspekton"},"print":{"toolbar":"Presi"},"removeformat":{"toolbar":"Forigi Formaton"},"save":{"toolbar":"Konservi"},"selectall":{"toolbar":"Elekti ĉion"},"showblocks":{"toolbar":"Montri la blokojn"},"sourcearea":{"toolbar":"Fonto"},"specialchar":{"options":"Opcioj pri Specialaj Signoj","title":"Selekti Specialan Signon","toolbar":"Enmeti Specialan Signon"},"scayt":{"about":"Pri OKDVT","aboutTab":"Pri","addWord":"Almeti la vorton","allCaps":"Ignori la vortojn skribitajn nur per ĉefliteroj","dic_create":"Krei","dic_delete":"Forigi","dic_field_name":"Vortaronomo","dic_info":"Komence la vortaro de la uzanto estas konservita en kuketo. Tamen la kuketgrando estas limigita. Kiam la vortaro de la uzanto atingas grandon, kiu ne plu ebligas konservi ĝin en kuketo, tiam la vortaro povas esti konservata en niaj serviloj. Por konservi vian personan vortaron en nian servilon, vi devas indiki nomon por tiu vortaro. Se vi jam havas konservitan vortaron, bonvolu entajpi ties nomon kaj alklaki la restaŭrbutonon.","dic_rename":"Renomi","dic_restore":"Restaŭri","dictionariesTab":"Vortaroj","disable":"Malebligi OKDVT","emptyDic":"La vortaronomo ne devus esti malplena.","enable":"Ebligi OKDVT","ignore":"Ignori","ignoreAll":"Ignori ĉion","ignoreDomainNames":"Ignori domajnajn nomojn","langs":"Lingvoj","languagesTab":"Lingvoj","mixedCase":"Ignori vortojn kun miksa uskleco","mixedWithDigits":"Ignori vortojn kun nombroj","moreSuggestions":"Pli da sugestoj","opera_title":"Ne subportata de Opera","options":"Opcioj","optionsTab":"Opcioj","title":"OrtografiKontrolado Dum Vi Tajpas (OKDVT)","toggle":"Baskuligi OKDVT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stiloj","panelTitle":"Stiloj pri enpaĝigo","panelTitle1":"Stiloj de blokoj","panelTitle2":"Enliniaj Stiloj","panelTitle3":"Stiloj de objektoj"},"table":{"border":"Bordero","caption":"Tabeltitolo","cell":{"menu":"Ĉelo","insertBefore":"Enmeti Ĉelon Antaŭ","insertAfter":"Enmeti Ĉelon Post","deleteCell":"Forigi la Ĉelojn","merge":"Kunfandi la Ĉelojn","mergeRight":"Kunfandi dekstren","mergeDown":"Kunfandi malsupren ","splitHorizontal":"Horizontale dividi","splitVertical":"Vertikale dividi","title":"Ĉelatributoj","cellType":"Ĉeltipo","rowSpan":"Kunfando de linioj","colSpan":"Kunfando de kolumnoj","wordWrap":"Cezuro","hAlign":"Horizontala ĝisrandigo","vAlign":"Vertikala ĝisrandigo","alignBaseline":"Malsupro de la teksto","bgColor":"Fonkoloro","borderColor":"Borderkoloro","data":"Datenoj","header":"Supra paĝotitolo","yes":"Jes","no":"No","invalidWidth":"Ĉellarĝo devas esti nombro.","invalidHeight":"Ĉelalto devas esti nombro.","invalidRowSpan":"Kunfando de linioj devas esti entjera nombro.","invalidColSpan":"Kunfando de kolumnoj devas esti entjera nombro.","chooseColor":"Elektu"},"cellPad":"Interna Marĝeno de la ĉeloj","cellSpace":"Spaco inter la Ĉeloj","column":{"menu":"Kolumno","insertBefore":"Enmeti kolumnon antaŭ","insertAfter":"Enmeti kolumnon post","deleteColumn":"Forigi Kolumnojn"},"columns":"Kolumnoj","deleteTable":"Forigi Tabelon","headers":"Supraj Paĝotitoloj","headersBoth":"Ambaŭ","headersColumn":"Unua kolumno","headersNone":"Neniu","headersRow":"Unua linio","invalidBorder":"La bordergrando devas esti nombro.","invalidCellPadding":"La interna marĝeno en la ĉeloj devas esti pozitiva nombro.","invalidCellSpacing":"La spaco inter la ĉeloj devas esti pozitiva nombro.","invalidCols":"La nombro de la kolumnoj devas superi 0.","invalidHeight":"La tabelalto devas esti nombro.","invalidRows":"La nombro de la linioj devas superi 0.","invalidWidth":"La tabellarĝo devas esti nombro.","menu":"Atributoj de Tabelo","row":{"menu":"Linio","insertBefore":"Enmeti linion antaŭ","insertAfter":"Enmeti linion post","deleteRow":"Forigi Liniojn"},"rows":"Linioj","summary":"Resumo","title":"Atributoj de Tabelo","toolbar":"Tabelo","widthPc":"elcentoj","widthPx":"Rastrumeroj","widthUnit":"unuo de larĝo"},"undo":{"redo":"Refari","undo":"Malfari"},"wsc":{"btnIgnore":"Ignori","btnIgnoreAll":"Ignori Ĉion","btnReplace":"Anstataŭigi","btnReplaceAll":"Anstataŭigi Ĉion","btnUndo":"Malfari","changeTo":"Ŝanĝi al","errorLoading":"Eraro en la servoelŝuto el la gastiga komputiko: %s.","ieSpellDownload":"Ortografikontrolilo ne instalita. Ĉu vi volas elŝuti ĝin nun?","manyChanges":"Ortografikontrolado finita: %1 vortoj korektitaj","noChanges":"Ortografikontrolado finita: neniu vorto korektita","noMispell":"Ortografikontrolado finita: neniu eraro trovita","noSuggestions":"- Neniu propono -","notAvailable":"Bedaŭrinde la servo ne funkcias nuntempe.","notInDic":"Ne trovita en la vortaro","oneChange":"Ortografikontrolado finita: unu vorto korektita","progress":"La ortografio estas kontrolata...","title":"Kontroli la ortografion","toolbar":"Kontroli la ortografion"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/es.js b/htmltest/sites/all/libraries/ckeditor-version/lang/es.js
new file mode 100644
index 00000000..aaab50c2
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/es.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['es']={"editor":"Editor de texto enriquecido","common":{"editorHelp":"Pulse ALT 0 para ayuda","browseServer":"Ver Servidor","url":"URL","protocol":"Protocolo","upload":"Cargar","uploadSubmit":"Enviar al Servidor","image":"Imagen","flash":"Flash","form":"Formulario","checkbox":"Casilla de Verificación","radio":"Botones de Radio","textField":"Campo de Texto","textarea":"Area de Texto","hiddenField":"Campo Oculto","button":"Botón","select":"Campo de Selección","imageButton":"Botón Imagen","notSet":"<No definido>","id":"Id","name":"Nombre","langDir":"Orientación","langDirLtr":"Izquierda a Derecha (LTR)","langDirRtl":"Derecha a Izquierda (RTL)","langCode":"Cód. de idioma","longDescr":"Descripción larga URL","cssClass":"Clases de hojas de estilo","advisoryTitle":"Título","cssStyle":"Estilo","ok":"Aceptar","cancel":"Cancelar","close":"Cerrar","preview":"Previsualización","resize":"Arrastre para redimensionar","generalTab":"General","advancedTab":"Avanzado","validateNumberFailed":"El valor no es un número.","confirmNewPage":"Cualquier cambio que no se haya guardado se perderá.\r\n¿Está seguro de querer crear una nueva página?","confirmCancel":"Algunas de las opciones se han cambiado.\r\n¿Está seguro de querer cerrar el diálogo?","options":"Opciones","target":"Destino","targetNew":"Nueva ventana (_blank)","targetTop":"Ventana principal (_top)","targetSelf":"Misma ventana (_self)","targetParent":"Ventana padre (_parent)","langDirLTR":"Izquierda a derecha (LTR)","langDirRTL":"Derecha a izquierda (RTL)","styles":"Estilos","cssClasses":"Clase de la hoja de estilos","width":"Anchura","height":"Altura","align":"Alineación","alignLeft":"Izquierda","alignRight":"Derecha","alignCenter":"Centrado","alignTop":"Tope","alignMiddle":"Centro","alignBottom":"Pie","invalidValue":"Valor no válido","invalidHeight":"Altura debe ser un número.","invalidWidth":"Anchura debe ser un número.","invalidCssLength":"El valor especificado para el campo \"%1\" debe ser un número positivo, incluyendo optionalmente una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).","invalidHtmlLength":"El valor especificado para el campo \"%1\" debe ser un número positivo, incluyendo optionalmente una unidad de medida HTML válida (px o %).","invalidInlineStyle":"El valor especificado para el estilo debe consistir en uno o más pares con el formato \"nombre: valor\", separados por punto y coma.","cssLengthTooltip":"Introduca un número para el valor en pixels o un número con una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).","unavailable":"%1<span class=\"cke_accessibility\">, no disponible</span>"},"about":{"copy":"Copyright &copy; $1. Todos los derechos reservados.","dlgTitle":"Acerca de CKEditor","help":"Lea la  $1 para resolver sus dudas.","moreInfo":"Para información de licencia, por favor visite nuestro sitio web:","title":"Acerca de CKEditor","userGuide":"Guía de usuario de CKEditor"},"basicstyles":{"bold":"Negrita","italic":"Cursiva","strike":"Tachado","subscript":"Subíndice","superscript":"Superíndice","underline":"Subrayado"},"bidi":{"ltr":"Dirección del texto de izquierda a derecha","rtl":"Dirección del texto de derecha a izquierda"},"blockquote":{"toolbar":"Cita"},"clipboard":{"copy":"Copiar","copyError":"La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de copiado.\r\nPor favor use el teclado (Ctrl/Cmd+C).","cut":"Cortar","cutError":"La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de cortado.\r\nPor favor use el teclado (Ctrl/Cmd+X).","paste":"Pegar","pasteArea":"Zona de pegado","pasteMsg":"Por favor pegue dentro del cuadro utilizando el teclado (<STRONG>Ctrl/Cmd+V</STRONG>);\r\nluego presione <STRONG>Aceptar</STRONG>.","securityMsg":"Debido a la configuración de seguridad de su navegador, el editor no tiene acceso al portapapeles.\r\nEs necesario que lo pegue de nuevo en esta ventana.","title":"Pegar"},"colorbutton":{"auto":"Automático","bgColorTitle":"Color de Fondo","colors":{"000":"Negro","800000":"Marrón oscuro","8B4513":"Marrón tierra","2F4F4F":"Pizarra Oscuro","008080":"Azul verdoso","000080":"Azul marino","4B0082":"Añil","696969":"Gris oscuro","B22222":"Ladrillo","A52A2A":"Marrón","DAA520":"Oro oscuro","006400":"Verde oscuro","40E0D0":"Turquesa","0000CD":"Azul medio-oscuro","800080":"Púrpura","808080":"Gris","F00":"Rojo","FF8C00":"Naranja oscuro","FFD700":"Oro","008000":"Verde","0FF":"Cian","00F":"Azul","EE82EE":"Violeta","A9A9A9":"Gris medio","FFA07A":"Salmón claro","FFA500":"Naranja","FFFF00":"Amarillo","00FF00":"Lima","AFEEEE":"Turquesa claro","ADD8E6":"Azul claro","DDA0DD":"Violeta claro","D3D3D3":"Gris claro","FFF0F5":"Lavanda rojizo","FAEBD7":"Blanco antiguo","FFFFE0":"Amarillo claro","F0FFF0":"Miel","F0FFFF":"Azul celeste","F0F8FF":"Azul pálido","E6E6FA":"Lavanda","FFF":"Blanco"},"more":"Más Colores...","panelTitle":"Colores","textColorTitle":"Color de Texto"},"colordialog":{"clear":"Borrar","highlight":"Muestra","options":"Opciones de colores","selected":"Elegido","title":"Elegir color"},"templates":{"button":"Plantillas","emptyListMsg":"(No hay plantillas definidas)","insertOption":"Reemplazar el contenido actual","options":"Opciones de plantillas","selectPromptMsg":"Por favor selecciona la plantilla a abrir en el editor<br>(el contenido actual se perderá):","title":"Contenido de Plantillas"},"contextmenu":{"options":"Opciones del menú contextual"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Título","cssClassInputLabel":"Clase de hoja de estilos","edit":"Editar Div","inlineStyleInputLabel":"Estilo","langDirLTRLabel":"Izquierda a Derecha (LTR)","langDirLabel":"Orientación","langDirRTLLabel":"Derecha a Izquierda (RTL)","languageCodeInputLabel":" Codigo de idioma","remove":"Quitar Div","styleSelectLabel":"Estilo","title":"Crear contenedor DIV","toolbar":"Crear contenedor DIV"},"toolbar":{"toolbarCollapse":"Contraer barra de herramientas","toolbarExpand":"Expandir barra de herramientas","toolbarGroups":{"document":"Documento","clipboard":"Portapapeles/Deshacer","editing":"Edición","forms":"Formularios","basicstyles":"Estilos básicos","paragraph":"Párrafo","links":"Enlaces","insert":"Insertar","styles":"Estilos","colors":"Colores","tools":"Herramientas"},"toolbars":"Barras de herramientas del editor"},"elementspath":{"eleLabel":"Ruta de los elementos","eleTitle":"%1 elemento"},"find":{"find":"Buscar","findOptions":"Opciones de búsqueda","findWhat":"Texto a buscar:","matchCase":"Coincidir may/min","matchCyclic":"Buscar en todo el contenido","matchWord":"Coincidir toda la palabra","notFoundMsg":"El texto especificado no ha sido encontrado.","replace":"Reemplazar","replaceAll":"Reemplazar Todo","replaceSuccessMsg":"La expresión buscada ha sido reemplazada %1 veces.","replaceWith":"Reemplazar con:","title":"Buscar y Reemplazar"},"fakeobjects":{"anchor":"Ancla","flash":"Animación flash","hiddenfield":"Campo oculto","iframe":"IFrame","unknown":"Objeto desconocido"},"flash":{"access":"Acceso de scripts","accessAlways":"Siempre","accessNever":"Nunca","accessSameDomain":"Mismo dominio","alignAbsBottom":"Abs inferior","alignAbsMiddle":"Abs centro","alignBaseline":"Línea de base","alignTextTop":"Tope del texto","bgcolor":"Color de Fondo","chkFull":"Permitir pantalla completa","chkLoop":"Repetir","chkMenu":"Activar Menú Flash","chkPlay":"Autoejecución","flashvars":"Opciones","hSpace":"Esp.Horiz","properties":"Propiedades de Flash","propertiesTab":"Propiedades","quality":"Calidad","qualityAutoHigh":"Auto Alta","qualityAutoLow":"Auto Baja","qualityBest":"La mejor","qualityHigh":"Alta","qualityLow":"Baja","qualityMedium":"Media","scale":"Escala","scaleAll":"Mostrar todo","scaleFit":"Ajustado","scaleNoBorder":"Sin Borde","title":"Propiedades de Flash","vSpace":"Esp.Vert","validateHSpace":"Esp.Horiz debe ser un número.","validateSrc":"Por favor escriba el vínculo URL","validateVSpace":"Esp.Vert debe ser un número.","windowMode":"WindowMode","windowModeOpaque":"Opaco","windowModeTransparent":"Transparente","windowModeWindow":"Ventana"},"font":{"fontSize":{"label":"Tamaño","voiceLabel":"Tamaño de fuente","panelTitle":"Tamaño"},"label":"Fuente","panelTitle":"Fuente","voiceLabel":"Fuente"},"forms":{"button":{"title":"Propiedades de Botón","text":"Texto (Valor)","type":"Tipo","typeBtn":"Boton","typeSbm":"Enviar","typeRst":"Reestablecer"},"checkboxAndRadio":{"checkboxTitle":"Propiedades de Casilla","radioTitle":"Propiedades de Botón de Radio","value":"Valor","selected":"Seleccionado"},"form":{"title":"Propiedades de Formulario","menu":"Propiedades de Formulario","action":"Acción","method":"Método","encoding":"Codificación"},"hidden":{"title":"Propiedades de Campo Oculto","name":"Nombre","value":"Valor"},"select":{"title":"Propiedades de Campo de Selección","selectInfo":"Información","opAvail":"Opciones disponibles","value":"Valor","size":"Tamaño","lines":"Lineas","chkMulti":"Permitir múltiple selección","opText":"Texto","opValue":"Valor","btnAdd":"Agregar","btnModify":"Modificar","btnUp":"Subir","btnDown":"Bajar","btnSetValue":"Establecer como predeterminado","btnDelete":"Eliminar"},"textarea":{"title":"Propiedades de Area de Texto","cols":"Columnas","rows":"Filas"},"textfield":{"title":"Propiedades de Campo de Texto","name":"Nombre","value":"Valor","charWidth":"Caracteres de ancho","maxChars":"Máximo caracteres","type":"Tipo","typeText":"Texto","typePass":"Contraseña","typeEmail":"Correo electrónico","typeSearch":"Buscar","typeTel":"Número de teléfono","typeUrl":"URL"}},"format":{"label":"Formato","panelTitle":"Formato","tag_address":"Dirección","tag_div":"Normal (DIV)","tag_h1":"Encabezado 1","tag_h2":"Encabezado 2","tag_h3":"Encabezado 3","tag_h4":"Encabezado 4","tag_h5":"Encabezado 5","tag_h6":"Encabezado 6","tag_p":"Normal","tag_pre":"Con formato"},"horizontalrule":{"toolbar":"Insertar Línea Horizontal"},"iframe":{"border":"Mostrar borde del marco","noUrl":"Por favor, escriba la dirección del iframe","scrolling":"Activar barras de desplazamiento","title":"Propiedades de iframe","toolbar":"IFrame"},"image":{"alertUrl":"Por favor escriba la URL de la imagen","alt":"Texto Alternativo","border":"Borde","btnUpload":"Enviar al Servidor","button2Img":"¿Desea convertir el botón de imagen en una simple imagen?","hSpace":"Esp.Horiz","img2Button":"¿Desea convertir la imagen en un botón de imagen?","infoTab":"Información de Imagen","linkTab":"Vínculo","lockRatio":"Proporcional","menu":"Propiedades de Imagen","resetSize":"Tamaño Original","title":"Propiedades de Imagen","titleButton":"Propiedades de Botón de Imagen","upload":"Cargar","urlMissing":"Debe indicar la URL de la imagen.","vSpace":"Esp.Vert","validateBorder":"El borde debe ser un número.","validateHSpace":"El espaciado horizontal debe ser un número.","validateVSpace":"El espaciado vertical debe ser un número."},"indent":{"indent":"Aumentar Sangría","outdent":"Disminuir Sangría"},"smiley":{"options":"Opciones de emoticonos","title":"Insertar un Emoticon","toolbar":"Emoticonos"},"justify":{"block":"Justificado","center":"Centrar","left":"Alinear a Izquierda","right":"Alinear a Derecha"},"link":{"acccessKey":"Tecla de Acceso","advanced":"Avanzado","advisoryContentType":"Tipo de Contenido","advisoryTitle":"Título","anchor":{"toolbar":"Referencia","menu":"Propiedades de Referencia","title":"Propiedades de Referencia","name":"Nombre de la Referencia","errorName":"Por favor, complete el nombre de la Referencia","remove":"Quitar Referencia"},"anchorId":"Por ID de elemento","anchorName":"Por Nombre de Referencia","charset":"Fuente de caracteres vinculado","cssClasses":"Clases de hojas de estilo","emailAddress":"Dirección de E-Mail","emailBody":"Cuerpo del Mensaje","emailSubject":"Título del Mensaje","id":"Id","info":"Información de Vínculo","langCode":"Código idioma","langDir":"Orientación","langDirLTR":"Izquierda a Derecha (LTR)","langDirRTL":"Derecha a Izquierda (RTL)","menu":"Editar Vínculo","name":"Nombre","noAnchors":"(No hay referencias disponibles en el documento)","noEmail":"Por favor escriba la dirección de e-mail","noUrl":"Por favor escriba el vínculo URL","other":"<otro>","popupDependent":"Dependiente (Netscape)","popupFeatures":"Características de Ventana Emergente","popupFullScreen":"Pantalla Completa (IE)","popupLeft":"Posición Izquierda","popupLocationBar":"Barra de ubicación","popupMenuBar":"Barra de Menú","popupResizable":"Redimensionable","popupScrollBars":"Barras de desplazamiento","popupStatusBar":"Barra de Estado","popupToolbar":"Barra de Herramientas","popupTop":"Posición Derecha","rel":"Relación","selectAnchor":"Seleccionar una referencia","styles":"Estilo","tabIndex":"Indice de tabulación","target":"Destino","targetFrame":"<marco>","targetFrameName":"Nombre del Marco Destino","targetPopup":"<ventana emergente>","targetPopupName":"Nombre de Ventana Emergente","title":"Vínculo","toAnchor":"Referencia en esta página","toEmail":"E-Mail","toUrl":"URL","toolbar":"Insertar/Editar Vínculo","type":"Tipo de vínculo","unlink":"Eliminar Vínculo","upload":"Cargar"},"list":{"bulletedlist":"Viñetas","numberedlist":"Numeración"},"liststyle":{"armenian":"Numeración armenia","bulletedTitle":"Propiedades de viñetas","circle":"Círculo","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal con cero inicial (01, 02, 03, etc.)","disc":"Disco","georgian":"Numeración georgiana (an, ban, gan, etc.)","lowerAlpha":"Alfabeto en minúsculas (a, b, c, d, e, etc.)","lowerGreek":"Letras griegas (alpha, beta, gamma, etc.)","lowerRoman":"Números romanos en minúsculas (i, ii, iii, iv, v, etc.)","none":"Ninguno","notset":"<sin establecer>","numberedTitle":"Propiedades de lista numerada","square":"Cuadrado","start":"Inicio","type":"Tipo","upperAlpha":"Alfabeto en mayúsculas  (A, B, C, D, E, etc.)","upperRoman":"Números romanos en mayúsculas (I, II, III, IV, V, etc.)","validateStartNumber":"El Inicio debe ser un número entero."},"magicline":{"title":"Insertar párrafo aquí"},"maximize":{"maximize":"Maximizar","minimize":"Minimizar"},"newpage":{"toolbar":"Nueva Página"},"pagebreak":{"alt":"Salto de página","toolbar":"Insertar Salto de Página"},"pastetext":{"button":"Pegar como Texto Plano","title":"Pegar como Texto Plano"},"pastefromword":{"confirmCleanup":"El texto que desea parece provenir de Word.\r\n¿Desea depurarlo antes de pegarlo?","error":"No ha sido posible limpiar los datos debido a un error interno","title":"Pegar desde Word","toolbar":"Pegar desde Word"},"preview":{"preview":"Vista Previa"},"print":{"toolbar":"Imprimir"},"removeformat":{"toolbar":"Eliminar Formato"},"save":{"toolbar":"Guardar"},"selectall":{"toolbar":"Seleccionar Todo"},"showblocks":{"toolbar":"Mostrar bloques"},"sourcearea":{"toolbar":"Fuente HTML"},"specialchar":{"options":"Opciones de caracteres especiales","title":"Seleccione un caracter especial","toolbar":"Insertar Caracter Especial"},"scayt":{"about":"Acerca de Corrector","aboutTab":"Acerca de","addWord":"Añadir palabra","allCaps":"Omitir palabras en MAYÚSCULAS","dic_create":"Crear","dic_delete":"Borrar","dic_field_name":"Nombre del diccionario","dic_info":"Inicialmente el Diccionario de usuario se guarda en una Cookie. Sin embargo, las cookies están limitadas en tamaño. Cuando el diccionario crece a un punto en el que no se puede guardar en una Cookie, el diccionario puede ser almacenado en nuestro servidor. Para almacenar su diccionario personalizado en nuestro servidor debe especificar un nombre para su diccionario. Si ya ha guardado un diccionaro, por favor, escriba su nombre y pulse el botón Recuperar","dic_rename":"Renombrar","dic_restore":"Recuperar","dictionariesTab":"Diccionarios","disable":"Desactivar Corrector","emptyDic":"El nombre del diccionario no puede estar en blanco.","enable":"Activar Corrector","ignore":"Ignorar","ignoreAll":"Ignorar Todas","ignoreDomainNames":"Omitir nombres de dominio","langs":"Idiomas","languagesTab":"Idiomas","mixedCase":"Ignorar palabras con combinación de mayúsculas y minúsculas","mixedWithDigits":"Omitir palabras con números","moreSuggestions":"Más sugerencias","opera_title":"No soportado en Opera","options":"Opciones","optionsTab":"Opciones","title":"Comprobar Ortografía Mientras Escribe","toggle":"Cambiar Corrector","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estilo","panelTitle":"Estilos para formatear","panelTitle1":"Estilos de párrafo","panelTitle2":"Estilos de carácter","panelTitle3":"Estilos de objeto"},"table":{"border":"Tamaño de Borde","caption":"Título","cell":{"menu":"Celda","insertBefore":"Insertar celda a la izquierda","insertAfter":"Insertar celda a la derecha","deleteCell":"Eliminar Celdas","merge":"Combinar Celdas","mergeRight":"Combinar a la derecha","mergeDown":"Combinar hacia abajo","splitHorizontal":"Dividir la celda horizontalmente","splitVertical":"Dividir la celda verticalmente","title":"Propiedades de celda","cellType":"Tipo de Celda","rowSpan":"Expandir filas","colSpan":"Expandir columnas","wordWrap":"Ajustar al contenido","hAlign":"Alineación Horizontal","vAlign":"Alineación Vertical","alignBaseline":"Linea de base","bgColor":"Color de fondo","borderColor":"Color de borde","data":"Datos","header":"Encabezado","yes":"Sí","no":"No","invalidWidth":"La anchura de celda debe ser un número.","invalidHeight":"La altura de celda debe ser un número.","invalidRowSpan":"La expansión de filas debe ser un número entero.","invalidColSpan":"La expansión de columnas debe ser un número entero.","chooseColor":"Elegir"},"cellPad":"Esp. interior","cellSpace":"Esp. e/celdas","column":{"menu":"Columna","insertBefore":"Insertar columna a la izquierda","insertAfter":"Insertar columna a la derecha","deleteColumn":"Eliminar Columnas"},"columns":"Columnas","deleteTable":"Eliminar Tabla","headers":"Encabezados","headersBoth":"Ambas","headersColumn":"Primera columna","headersNone":"Ninguno","headersRow":"Primera fila","invalidBorder":"El tamaño del borde debe ser un número.","invalidCellPadding":"El espaciado interior debe ser un número.","invalidCellSpacing":"El espaciado entre celdas debe ser un número.","invalidCols":"El número de columnas debe ser un número mayor que 0.","invalidHeight":"La altura de tabla debe ser un número.","invalidRows":"El número de filas debe ser un número mayor que 0.","invalidWidth":"La anchura de tabla debe ser un número.","menu":"Propiedades de Tabla","row":{"menu":"Fila","insertBefore":"Insertar fila en la parte superior","insertAfter":"Insertar fila en la parte inferior","deleteRow":"Eliminar Filas"},"rows":"Filas","summary":"Síntesis","title":"Propiedades de Tabla","toolbar":"Tabla","widthPc":"porcentaje","widthPx":"pixeles","widthUnit":"unidad de la anchura"},"undo":{"redo":"Rehacer","undo":"Deshacer"},"wsc":{"btnIgnore":"Ignorar","btnIgnoreAll":"Ignorar Todo","btnReplace":"Reemplazar","btnReplaceAll":"Reemplazar Todo","btnUndo":"Deshacer","changeTo":"Cambiar a","errorLoading":"Error cargando la aplicación del servidor: %s.","ieSpellDownload":"Módulo de Control de Ortografía no instalado.\r\n¿Desea descargarlo ahora?","manyChanges":"Control finalizado: se ha cambiado %1 palabras","noChanges":"Control finalizado: no se ha cambiado ninguna palabra","noMispell":"Control finalizado: no se encontraron errores","noSuggestions":"- No hay sugerencias -","notAvailable":"Lo sentimos pero el servicio no está disponible.","notInDic":"No se encuentra en el Diccionario","oneChange":"Control finalizado: se ha cambiado una palabra","progress":"Control de Ortografía en progreso...","title":"Comprobar ortografía","toolbar":"Ortografía"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/et.js b/htmltest/sites/all/libraries/ckeditor-version/lang/et.js
new file mode 100644
index 00000000..a5c8e95d
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/et.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['et']={"editor":"Rikkalik tekstiredaktor","common":{"editorHelp":"Abi saamiseks vajuta ALT 0","browseServer":"Serveri sirvimine","url":"URL","protocol":"Protokoll","upload":"Laadi üles","uploadSubmit":"Saada serverisse","image":"Pilt","flash":"Flash","form":"Vorm","checkbox":"Märkeruut","radio":"Raadionupp","textField":"Tekstilahter","textarea":"Tekstiala","hiddenField":"Varjatud lahter","button":"Nupp","select":"Valiklahter","imageButton":"Piltnupp","notSet":"<määramata>","id":"ID","name":"Nimi","langDir":"Keele suund","langDirLtr":"Vasakult paremale (LTR)","langDirRtl":"Paremalt vasakule (RTL)","langCode":"Keele kood","longDescr":"Pikk kirjeldus URL","cssClass":"Stiilistiku klassid","advisoryTitle":"Soovituslik pealkiri","cssStyle":"Laad","ok":"OK","cancel":"Loobu","close":"Sulge","preview":"Eelvaade","resize":"Suuruse muutmiseks lohista","generalTab":"Üldine","advancedTab":"Täpsemalt","validateNumberFailed":"See väärtus pole number.","confirmNewPage":"Kõik salvestamata muudatused lähevad kaotsi. Kas oled kindel, et tahad laadida uue lehe?","confirmCancel":"Mõned valikud on muudetud. Kas oled kindel, et tahad dialoogi sulgeda?","options":"Valikud","target":"Sihtkoht","targetNew":"Uus aken (_blank)","targetTop":"Kõige ülemine aken (_top)","targetSelf":"Sama aken (_self)","targetParent":"Vanemaken (_parent)","langDirLTR":"Vasakult paremale (LTR)","langDirRTL":"Paremalt vasakule (RTL)","styles":"Stiili","cssClasses":"Stiililehe klassid","width":"Laius","height":"Kõrgus","align":"Joondus","alignLeft":"Vasak","alignRight":"Paremale","alignCenter":"Kesk","alignTop":"Üles","alignMiddle":"Keskele","alignBottom":"Alla","invalidValue":"Vigane väärtus.","invalidHeight":"Kõrgus peab olema number.","invalidWidth":"Laius peab olema number.","invalidCssLength":"\"%1\" välja jaoks määratud väärtus peab olema positiivne täisarv CSS ühikuga (px, %, in, cm, mm, em, ex, pt või pc) või ilma.","invalidHtmlLength":"\"%1\" välja jaoks määratud väärtus peab olema positiivne täisarv HTML ühikuga (px või %) või ilma.","invalidInlineStyle":"Reasisese stiili määrangud peavad koosnema paarisväärtustest (tuples), mis on semikoolonitega eraldatult järgnevas vormingus: \"nimi : väärtus\".","cssLengthTooltip":"Sisesta väärtus pikslites või number koos sobiva CSS-i ühikuga (px, %, in, cm, mm, em, ex, pt või pc).","unavailable":"%1<span class=\"cke_accessibility\">, pole saadaval</span>"},"about":{"copy":"Copyright &copy; $1. Kõik õigused kaitstud.","dlgTitle":"CKEditorist","help":"Abi jaoks vaata $1.","moreInfo":"Litsentsi andmed leiab meie veebilehelt:","title":"CKEditorist","userGuide":"CKEditori kasutusjuhendit"},"basicstyles":{"bold":"Paks","italic":"Kursiiv","strike":"Läbijoonitud","subscript":"Allindeks","superscript":"Ülaindeks","underline":"Allajoonitud"},"bidi":{"ltr":"Teksti suund vasakult paremale","rtl":"Teksti suund paremalt vasakule"},"blockquote":{"toolbar":"Blokktsitaat"},"clipboard":{"copy":"Kopeeri","copyError":"Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt kopeerida. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+C).","cut":"Lõika","cutError":"Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt lõigata. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+X).","paste":"Aseta","pasteArea":"Asetamise ala","pasteMsg":"Palun aseta tekst järgnevasse kasti kasutades klaviatuuri klahvikombinatsiooni (<STRONG>Ctrl/Cmd+V</STRONG>) ja vajuta seejärel <STRONG>OK</STRONG>.","securityMsg":"Sinu veebisirvija turvaseadete tõttu ei oma redaktor otsest ligipääsu lõikelaua andmetele. Sa pead asetama need uuesti siia aknasse.","title":"Asetamine"},"colorbutton":{"auto":"Automaatne","bgColorTitle":"Tausta värv","colors":{"000":"Must","800000":"Kastanpruun","8B4513":"Sadulapruun","2F4F4F":"Tume paehall","008080":"Sinakasroheline","000080":"Meresinine","4B0082":"Indigosinine","696969":"Tumehall","B22222":"Šamottkivi","A52A2A":"Pruun","DAA520":"Kuldkollane","006400":"Tumeroheline","40E0D0":"Türkiissinine","0000CD":"Keskmine sinine","800080":"Lilla","808080":"Hall","F00":"Punanae","FF8C00":"Tumeoranž","FFD700":"Kuldne","008000":"Roheline","0FF":"Tsüaniidsinine","00F":"Sinine","EE82EE":"Violetne","A9A9A9":"Tuhm hall","FFA07A":"Hele lõhe","FFA500":"Oranž","FFFF00":"Kollane","00FF00":"Lubja hall","AFEEEE":"Kahvatu türkiis","ADD8E6":"Helesinine","DDA0DD":"Ploomililla","D3D3D3":"Helehall","FFF0F5":"Lavendlipunane","FAEBD7":"Antiikvalge","FFFFE0":"Helekollane","F0FFF0":"Meloniroheline","F0FFFF":"Taevasinine","F0F8FF":"Beebisinine","E6E6FA":"Lavendel","FFF":"Valge"},"more":"Rohkem värve...","panelTitle":"Värvid","textColorTitle":"Teksti värv"},"colordialog":{"clear":"Eemalda","highlight":"Näidis","options":"Värvi valikud","selected":"Valitud värv","title":"Värvi valimine"},"templates":{"button":"Mall","emptyListMsg":"(Ühtegi malli ei ole defineeritud)","insertOption":"Praegune sisu asendatakse","options":"Malli valikud","selectPromptMsg":"Palun vali mall, mis avada redaktoris<br />(praegune sisu läheb kaotsi):","title":"Sisumallid"},"contextmenu":{"options":"Kontekstimenüü valikud"},"div":{"IdInputLabel":"ID","advisoryTitleInputLabel":"Soovitatav pealkiri","cssClassInputLabel":"Stiililehe klassid","edit":"Muuda Div","inlineStyleInputLabel":"Reasisene stiil","langDirLTRLabel":"Vasakult paremale (LTR)","langDirLabel":"Keele suund","langDirRTLLabel":"Paremalt vasakule (RTL)","languageCodeInputLabel":" Keelekood","remove":"Eemalda Div","styleSelectLabel":"Stiil","title":"Div-konteineri loomine","toolbar":"Div-konteineri loomine"},"toolbar":{"toolbarCollapse":"Tööriistariba peitmine","toolbarExpand":"Tööriistariba näitamine","toolbarGroups":{"document":"Dokument","clipboard":"Lõikelaud/tagasivõtmine","editing":"Muutmine","forms":"Vormid","basicstyles":"Põhistiilid","paragraph":"Lõik","links":"Lingid","insert":"Sisesta","styles":"Stiilid","colors":"Värvid","tools":"Tööriistad"},"toolbars":"Redaktori tööriistaribad"},"elementspath":{"eleLabel":"Elementide asukoht","eleTitle":"%1 element"},"find":{"find":"Otsi","findOptions":"Otsingu valikud","findWhat":"Otsitav:","matchCase":"Suur- ja väiketähtede eristamine","matchCyclic":"Jätkatakse algusest","matchWord":"Ainult terved sõnad","notFoundMsg":"Otsitud teksti ei leitud.","replace":"Asenda","replaceAll":"Asenda kõik","replaceSuccessMsg":"%1 vastet asendati.","replaceWith":"Asendus:","title":"Otsimine ja asendamine"},"fakeobjects":{"anchor":"Ankur","flash":"Flashi animatsioon","hiddenfield":"Varjatud väli","iframe":"IFrame","unknown":"Tundmatu objekt"},"flash":{"access":"Skriptide ligipääs","accessAlways":"Kõigile","accessNever":"Mitte ühelegi","accessSameDomain":"Samalt domeenilt","alignAbsBottom":"Abs alla","alignAbsMiddle":"Abs keskele","alignBaseline":"Baasjoonele","alignTextTop":"Tekstist üles","bgcolor":"Tausta värv","chkFull":"Täisekraan lubatud","chkLoop":"Korduv","chkMenu":"Flashi menüü lubatud","chkPlay":"Automaatne start ","flashvars":"Flashi muutujad","hSpace":"H. vaheruum","properties":"Flashi omadused","propertiesTab":"Omadused","quality":"Kvaliteet","qualityAutoHigh":"Automaatne kõrge","qualityAutoLow":"Automaatne madal","qualityBest":"Parim","qualityHigh":"Kõrge","qualityLow":"Madal","qualityMedium":"Keskmine","scale":"Mastaap","scaleAll":"Näidatakse kõike","scaleFit":"Täpne sobivus","scaleNoBorder":"Äärist ei ole","title":"Flashi omadused","vSpace":"V. vaheruum","validateHSpace":"H. vaheruum peab olema number.","validateSrc":"Palun kirjuta lingi URL","validateVSpace":"V. vaheruum peab olema number.","windowMode":"Akna režiim","windowModeOpaque":"Läbipaistmatu","windowModeTransparent":"Läbipaistev","windowModeWindow":"Aken"},"font":{"fontSize":{"label":"Suurus","voiceLabel":"Kirja suurus","panelTitle":"Suurus"},"label":"Kiri","panelTitle":"Kiri","voiceLabel":"Kiri"},"forms":{"button":{"title":"Nupu omadused","text":"Tekst (väärtus)","type":"Liik","typeBtn":"Nupp","typeSbm":"Saada","typeRst":"Lähtesta"},"checkboxAndRadio":{"checkboxTitle":"Märkeruudu omadused","radioTitle":"Raadionupu omadused","value":"Väärtus","selected":"Märgitud"},"form":{"title":"Vormi omadused","menu":"Vormi omadused","action":"Toiming","method":"Meetod","encoding":"Kodeering"},"hidden":{"title":"Varjatud lahtri omadused","name":"Nimi","value":"Väärtus"},"select":{"title":"Valiklahtri omadused","selectInfo":"Info","opAvail":"Võimalikud valikud:","value":"Väärtus","size":"Suurus","lines":"ridu","chkMulti":"Võimalik mitu valikut","opText":"Tekst","opValue":"Väärtus","btnAdd":"Lisa","btnModify":"Muuda","btnUp":"Üles","btnDown":"Alla","btnSetValue":"Määra vaikimisi","btnDelete":"Kustuta"},"textarea":{"title":"Tekstiala omadused","cols":"Veerge","rows":"Ridu"},"textfield":{"title":"Tekstilahtri omadused","name":"Nimi","value":"Väärtus","charWidth":"Laius (tähemärkides)","maxChars":"Maksimaalselt tähemärke","type":"Liik","typeText":"Tekst","typePass":"Parool","typeEmail":"E-mail","typeSearch":"Otsi","typeTel":"Telefon","typeUrl":"URL"}},"format":{"label":"Vorming","panelTitle":"Vorming","tag_address":"Aadress","tag_div":"Tavaline (DIV)","tag_h1":"Pealkiri 1","tag_h2":"Pealkiri 2","tag_h3":"Pealkiri 3","tag_h4":"Pealkiri 4","tag_h5":"Pealkiri 5","tag_h6":"Pealkiri 6","tag_p":"Tavaline","tag_pre":"Vormindatud"},"horizontalrule":{"toolbar":"Horisontaaljoone sisestamine"},"iframe":{"border":"Raami äärise näitamine","noUrl":"Vali iframe URLi liik","scrolling":"Kerimisribade lubamine","title":"IFrame omadused","toolbar":"IFrame"},"image":{"alertUrl":"Palun kirjuta pildi URL","alt":"Alternatiivne tekst","border":"Joon","btnUpload":"Saada serverisse","button2Img":"Kas tahad teisendada valitud pildiga nupu tavaliseks pildiks?","hSpace":"H. vaheruum","img2Button":"Kas tahad teisendada valitud tavalise pildi pildiga nupuks?","infoTab":"Pildi info","linkTab":"Link","lockRatio":"Lukusta kuvasuhe","menu":"Pildi omadused","resetSize":"Lähtesta suurus","title":"Pildi omadused","titleButton":"Piltnupu omadused","upload":"Lae üles","urlMissing":"Pildi lähte-URL on puudu.","vSpace":"V. vaheruum","validateBorder":"Äärise laius peab olema täisarv.","validateHSpace":"Horisontaalne vaheruum peab olema täisarv.","validateVSpace":"Vertikaalne vaheruum peab olema täisarv."},"indent":{"indent":"Taande suurendamine","outdent":"Taande vähendamine"},"smiley":{"options":"Emotikonide valikud","title":"Sisesta emotikon","toolbar":"Emotikon"},"justify":{"block":"Rööpjoondus","center":"Keskjoondus","left":"Vasakjoondus","right":"Paremjoondus"},"link":{"acccessKey":"Juurdepääsu võti","advanced":"Täpsemalt","advisoryContentType":"Juhendava sisu tüüp","advisoryTitle":"Juhendav tiitel","anchor":{"toolbar":"Ankru sisestamine/muutmine","menu":"Ankru omadused","title":"Ankru omadused","name":"Ankru nimi","errorName":"Palun sisesta ankru nimi","remove":"Eemalda ankur"},"anchorId":"Elemendi id järgi","anchorName":"Ankru nime järgi","charset":"Lingitud ressursi märgistik","cssClasses":"Stiilistiku klassid","emailAddress":"E-posti aadress","emailBody":"Sõnumi tekst","emailSubject":"Sõnumi teema","id":"ID","info":"Lingi info","langCode":"Keele suund","langDir":"Keele suund","langDirLTR":"Vasakult paremale (LTR)","langDirRTL":"Paremalt vasakule (RTL)","menu":"Muuda linki","name":"Nimi","noAnchors":"(Selles dokumendis pole ankruid)","noEmail":"Palun kirjuta e-posti aadress","noUrl":"Palun kirjuta lingi URL","other":"<muu>","popupDependent":"Sõltuv (Netscape)","popupFeatures":"Hüpikakna omadused","popupFullScreen":"Täisekraan (IE)","popupLeft":"Vasak asukoht","popupLocationBar":"Aadressiriba","popupMenuBar":"Menüüriba","popupResizable":"Suurust saab muuta","popupScrollBars":"Kerimisribad","popupStatusBar":"Olekuriba","popupToolbar":"Tööriistariba","popupTop":"Ülemine asukoht","rel":"Suhe","selectAnchor":"Vali ankur","styles":"Laad","tabIndex":"Tab indeks","target":"Sihtkoht","targetFrame":"<raam>","targetFrameName":"Sihtmärk raami nimi","targetPopup":"<hüpikaken>","targetPopupName":"Hüpikakna nimi","title":"Link","toAnchor":"Ankur sellel lehel","toEmail":"E-post","toUrl":"URL","toolbar":"Lingi lisamine/muutmine","type":"Lingi liik","unlink":"Lingi eemaldamine","upload":"Lae üles"},"list":{"bulletedlist":"Punktloend","numberedlist":"Numberloend"},"liststyle":{"armenian":"Armeenia numbrid","bulletedTitle":"Punktloendi omadused","circle":"Ring","decimal":"Numbrid (1, 2, 3, jne)","decimalLeadingZero":"Numbrid algusnulliga (01, 02, 03, jne)","disc":"Täpp","georgian":"Gruusia numbrid (an, ban, gan, jne)","lowerAlpha":"Väiketähed (a, b, c, d, e, jne)","lowerGreek":"Kreeka väiketähed (alpha, beta, gamma, jne)","lowerRoman":"Väiksed rooma numbrid (i, ii, iii, iv, v, jne)","none":"Puudub","notset":"<pole määratud>","numberedTitle":"Numberloendi omadused","square":"Ruut","start":"Algus","type":"Liik","upperAlpha":"Suurtähed (A, B, C, D, E, jne)","upperRoman":"Suured rooma numbrid (I, II, III, IV, V, jne)","validateStartNumber":"Loendi algusnumber peab olema täisarv."},"magicline":{"title":"Sisesta siia lõigu tekst"},"maximize":{"maximize":"Maksimeerimine","minimize":"Minimeerimine"},"newpage":{"toolbar":"Uus leht"},"pagebreak":{"alt":"Lehevahetuskoht","toolbar":"Lehevahetuskoha sisestamine"},"pastetext":{"button":"Asetamine tavalise tekstina","title":"Asetamine tavalise tekstina"},"pastefromword":{"confirmCleanup":"Tekst, mida tahad asetada näib pärinevat Wordist. Kas tahad selle enne asetamist puhastada?","error":"Asetatud andmete puhastamine ei olnud sisemise vea tõttu võimalik","title":"Asetamine Wordist","toolbar":"Asetamine Wordist"},"preview":{"preview":"Eelvaade"},"print":{"toolbar":"Printimine"},"removeformat":{"toolbar":"Vormingu eemaldamine"},"save":{"toolbar":"Salvestamine"},"selectall":{"toolbar":"Kõige valimine"},"showblocks":{"toolbar":"Blokkide näitamine"},"sourcearea":{"toolbar":"Lähtekood"},"specialchar":{"options":"Erimärkide valikud","title":"Erimärgi valimine","toolbar":"Erimärgi sisestamine"},"scayt":{"about":"SCAYT-ist lähemalt","aboutTab":"Lähemalt","addWord":"Lisa sõna","allCaps":"Läbivate suurtähtedega sõnade eiramine","dic_create":"Loo","dic_delete":"Kustuta","dic_field_name":"Sõnaraamatu nimi","dic_info":"Alguses säilitatakse kasutaja sõnaraamatut küpsises. Küpsise suurus on piiratud. Pärast sõnaraamatu kasvamist nii suureks, et see küpsisesse ei mahu, võib sõnaraamatut hoida meie serveris. Oma isikliku sõnaraamatu hoidmiseks meie serveris pead andma sellele nime. Kui sa juba oled sõnaraamatu salvestanud, sisesta selle nimi ja klõpsa taastamise nupule.","dic_rename":"Nimeta ümber","dic_restore":"Taasta","dictionariesTab":"Sõnaraamatud","disable":"SCAYT keelatud","emptyDic":"Sõnaraamatu nimi ei tohi olla tühi.","enable":"SCAYT lubatud","ignore":"Eira","ignoreAll":"Eira kõiki","ignoreDomainNames":"Domeeninimede eiramine","langs":"Keeled","languagesTab":"Keeled","mixedCase":"Tavapäratu tõstuga sõnade eiramine","mixedWithDigits":"Numbreid sisaldavate sõnade eiramine","moreSuggestions":"Veel soovitusi","opera_title":"Operas pole toetatud","options":"Valikud","optionsTab":"Valikud","title":"Õigekirjakontroll kirjutamise ajal","toggle":"SCAYT sisse/välja lülitamine","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stiil","panelTitle":"Vormindusstiilid","panelTitle1":"Blokkstiilid","panelTitle2":"Reasisesed stiilid","panelTitle3":"Objektistiilid"},"table":{"border":"Joone suurus","caption":"Tabeli tiitel","cell":{"menu":"Lahter","insertBefore":"Sisesta lahter enne","insertAfter":"Sisesta lahter peale","deleteCell":"Eemalda lahtrid","merge":"Ühenda lahtrid","mergeRight":"Ühenda paremale","mergeDown":"Ühenda alla","splitHorizontal":"Poolita lahter horisontaalselt","splitVertical":"Poolita lahter vertikaalselt","title":"Lahtri omadused","cellType":"Lahtri liik","rowSpan":"Ridade vahe","colSpan":"Tulpade vahe","wordWrap":"Sõnade murdmine","hAlign":"Horisontaalne joondus","vAlign":"Vertikaalne joondus","alignBaseline":"Baasjoon","bgColor":"Tausta värv","borderColor":"Äärise värv","data":"Andmed","header":"Päis","yes":"Jah","no":"Ei","invalidWidth":"Lahtri laius peab olema number.","invalidHeight":"Lahtri kõrgus peab olema number.","invalidRowSpan":"Ridade vahe peab olema täisarv.","invalidColSpan":"Tulpade vahe peab olema täisarv.","chooseColor":"Vali"},"cellPad":"Lahtri täidis","cellSpace":"Lahtri vahe","column":{"menu":"Veerg","insertBefore":"Sisesta veerg enne","insertAfter":"Sisesta veerg peale","deleteColumn":"Eemalda veerud"},"columns":"Veerud","deleteTable":"Kustuta tabel","headers":"Päised","headersBoth":"Mõlemad","headersColumn":"Esimene tulp","headersNone":"Puudub","headersRow":"Esimene rida","invalidBorder":"Äärise suurus peab olema number.","invalidCellPadding":"Lahtrite polsterdus (padding) peab olema positiivne arv.","invalidCellSpacing":"Lahtrite vahe peab olema positiivne arv.","invalidCols":"Tulpade arv peab olema nullist suurem.","invalidHeight":"Tabeli kõrgus peab olema number.","invalidRows":"Ridade arv peab olema nullist suurem.","invalidWidth":"Tabeli laius peab olema number.","menu":"Tabeli omadused","row":{"menu":"Rida","insertBefore":"Sisesta rida enne","insertAfter":"Sisesta rida peale","deleteRow":"Eemalda read"},"rows":"Read","summary":"Kokkuvõte","title":"Tabeli omadused","toolbar":"Tabel","widthPc":"protsenti","widthPx":"pikslit","widthUnit":"laiuse ühik"},"undo":{"redo":"Toimingu kordamine","undo":"Tagasivõtmine"},"wsc":{"btnIgnore":"Ignoreeri","btnIgnoreAll":"Ignoreeri kõiki","btnReplace":"Asenda","btnReplaceAll":"Asenda kõik","btnUndo":"Võta tagasi","changeTo":"Muuda","errorLoading":"Viga rakenduse teenushosti laadimisel: %s.","ieSpellDownload":"Õigekirja kontrollija ei ole paigaldatud. Soovid sa selle alla laadida?","manyChanges":"Õigekirja kontroll sooritatud: %1 sõna muudetud","noChanges":"Õigekirja kontroll sooritatud: ühtegi sõna ei muudetud","noMispell":"Õigekirja kontroll sooritatud: õigekirjuvigu ei leitud","noSuggestions":"- Soovitused puuduvad -","notAvailable":"Kahjuks ei ole teenus praegu saadaval.","notInDic":"Puudub sõnastikust","oneChange":"Õigekirja kontroll sooritatud: üks sõna muudeti","progress":"Toimub õigekirja kontroll...","title":"Õigekirjakontroll","toolbar":"Õigekirjakontroll"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/eu.js b/htmltest/sites/all/libraries/ckeditor-version/lang/eu.js
new file mode 100644
index 00000000..3d791cef
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/eu.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['eu']={"editor":"Testu Aberastuko Editorea","common":{"editorHelp":"ALT 0 sakatu laguntza jasotzeko","browseServer":"Zerbitzaria arakatu","url":"URL","protocol":"Protokoloa","upload":"Gora kargatu","uploadSubmit":"Zerbitzarira bidali","image":"Irudia","flash":"Flasha","form":"Formularioa","checkbox":"Kontrol-laukia","radio":"Aukera-botoia","textField":"Testu Eremua","textarea":"Testu-area","hiddenField":"Ezkutuko Eremua","button":"Botoia","select":"Hautespen Eremua","imageButton":"Irudi Botoia","notSet":"<Ezarri gabe>","id":"Id","name":"Izena","langDir":"Hizkuntzaren Norabidea","langDirLtr":"Ezkerretik Eskumara(LTR)","langDirRtl":"Eskumatik Ezkerrera (RTL)","langCode":"Hizkuntza Kodea","longDescr":"URL Deskribapen Luzea","cssClass":"Estilo-orriko Klaseak","advisoryTitle":"Izenburua","cssStyle":"Estiloa","ok":"Ados","cancel":"Utzi","close":"Itxi","preview":"Aurrebista","resize":"Arrastatu tamaina aldatzeko","generalTab":"Orokorra","advancedTab":"Aurreratua","validateNumberFailed":"Balio hau ez da zenbaki bat.","confirmNewPage":"Eduki honetan gorde gabe dauden aldaketak galduko dira. Ziur zaude orri berri bat kargatu nahi duzula?","confirmCancel":"Aukera batzuk aldatu egin dira. Ziur zaude elkarrizketa-koadroa itxi nahi duzula?","options":"Aukerak","target":"Target (Helburua)","targetNew":"Leiho Berria (_blank)","targetTop":"Goieneko Leihoan (_top)","targetSelf":"Leiho Berdinean (_self)","targetParent":"Leiho Gurasoan (_parent)","langDirLTR":"Ezkerretik Eskumara(LTR)","langDirRTL":"Eskumatik Ezkerrera (RTL)","styles":"Estiloa","cssClasses":"Estilo-orriko Klaseak","width":"Zabalera","height":"Altuera","align":"Lerrokatu","alignLeft":"Ezkerrera","alignRight":"Eskuman","alignCenter":"Erdian","alignTop":"Goian","alignMiddle":"Erdian","alignBottom":"Behean","invalidValue":"Balio ezegokia.","invalidHeight":"Altuera zenbaki bat izan behar da.","invalidWidth":"Zabalera zenbaki bat izan behar da.","invalidCssLength":"\"%1\" eremurako zehaztutako balioa zenbaki positibo bat izan behar du, aukeran CSS neurri unitate batekin (px, %, in, cm, mm, em, ex, pt edo pc).","invalidHtmlLength":"\"%1\" eremurako zehaztutako balioa zenbaki positibo bat izan behar du, aukeran HTML neurri unitate batekin (px edo %).","invalidInlineStyle":"Lerroko estiloan zehazten dena tupla \"name : value\" formatuko eta puntu eta komaz bereiztutako tupla bat edo gehiago izan behar dira.","cssLengthTooltip":"Zenbakia bakarrik zehazten bada pixeletan egongo da. CSS neurri unitatea ere zehaztu ahal da (px, %, in, cm, mm, em, ex, pt, edo pc).","unavailable":"%1<span class=\"cke_accessibility\">, erabilezina</span>"},"about":{"copy":"Copyright &copy; $1. Eskubide guztiak erreserbaturik.","dlgTitle":"CKEditor(r)i buruz","help":"$1 aztertu laguntza jasotzeko.","moreInfo":"Lizentziari buruzko informazioa gure webgunean:","title":"CKEditor(r)i buruz","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Lodia","italic":"Etzana","strike":"Marratua","subscript":"Azpi-indize","superscript":"Goi-indize","underline":"Azpimarratu"},"bidi":{"ltr":"Testuaren norantza ezkerretik eskuinera","rtl":"Testuaren norantza eskuinetik ezkerrera"},"blockquote":{"toolbar":"Aipamen blokea"},"clipboard":{"copy":"Kopiatu","copyError":"Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki kopiatzea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl/Cmd+C).","cut":"Ebaki","cutError":"Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki moztea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl/Cmd+X).","paste":"Itsatsi","pasteArea":"Itsasteko Area","pasteMsg":"Mesedez teklatua erabilita (<STRONG>Ctrl/Cmd+V</STRONG>) ondorego eremuan testua itsatsi eta <STRONG>OK</STRONG> sakatu.","securityMsg":"Nabigatzailearen segurtasun ezarpenak direla eta, editoreak ezin du arbela zuzenean erabili. Leiho honetan berriro itsatsi behar duzu.","title":"Itsatsi"},"colorbutton":{"auto":"Automatikoa","bgColorTitle":"Atzeko kolorea","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"Kolore gehiago...","panelTitle":"Colors","textColorTitle":"Testu Kolorea"},"colordialog":{"clear":"Garbitu","highlight":"Nabarmendu","options":"Kolore Aukerak","selected":"Hautatutako Kolorea","title":"Kolorea Hautatu"},"templates":{"button":"Txantiloiak","emptyListMsg":"(Ez dago definitutako txantiloirik)","insertOption":"Ordeztu oraingo edukiak","options":"Txantiloi Aukerak","selectPromptMsg":"Mesedez txantiloia aukeratu editorean kargatzeko<br>(orain dauden edukiak galduko dira):","title":"Eduki Txantiloiak"},"contextmenu":{"options":"Testuingurko Menuaren Aukerak"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Izenburua","cssClassInputLabel":"Estilo-orriko Klaseak","edit":"Div-a editatu","inlineStyleInputLabel":"Inline Estiloa","langDirLTRLabel":"Ezkerretik Eskuinera (LTR)","langDirLabel":"Hizkuntzaren Norabidea","langDirRTLLabel":"Eskumatik Ezkerrera (RTL)","languageCodeInputLabel":"Hizkuntza Kodea","remove":"Div-a Kendu","styleSelectLabel":"Estiloa","title":"Div Edukiontzia Sortu","toolbar":"Div Edukiontzia Sortu"},"toolbar":{"toolbarCollapse":"Tresna-barra Txikitu","toolbarExpand":"Tresna-barra Luzatu","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editorearen Tresna-barra"},"elementspath":{"eleLabel":"Elementu bidea","eleTitle":"%1 elementua"},"find":{"find":"Bilatu","findOptions":"Find Options","findWhat":"Zer bilatu:","matchCase":"Maiuskula/minuskula","matchCyclic":"Bilaketa ziklikoa","matchWord":"Esaldi osoa bilatu","notFoundMsg":"Idatzitako testua ez da topatu.","replace":"Ordezkatu","replaceAll":"Ordeztu Guztiak","replaceSuccessMsg":"Zenbat aldiz ordeztua: %1","replaceWith":"Zerekin ordeztu:","title":"Bilatu eta Ordeztu"},"fakeobjects":{"anchor":"Aingura","flash":"Flash Animazioa","hiddenfield":"Ezkutuko Eremua","iframe":"IFrame","unknown":"Objektu ezezaguna"},"flash":{"access":"Scriptak baimendu","accessAlways":"Beti","accessNever":"Inoiz ere ez","accessSameDomain":"Domeinu berdinekoak","alignAbsBottom":"Abs Behean","alignAbsMiddle":"Abs Erdian","alignBaseline":"Oinan","alignTextTop":"Testua Goian","bgcolor":"Atzeko kolorea","chkFull":"Onartu Pantaila osoa","chkLoop":"Begizta","chkMenu":"Flasharen Menua Gaitu","chkPlay":"Automatikoki Erreproduzitu","flashvars":"Flash Aldagaiak","hSpace":"HSpace","properties":"Flasharen Ezaugarriak","propertiesTab":"Ezaugarriak","quality":"Kalitatea","qualityAutoHigh":"Auto Altua","qualityAutoLow":"Auto Baxua","qualityBest":"Hoberena","qualityHigh":"Altua","qualityLow":"Baxua","qualityMedium":"Ertaina","scale":"Eskalatu","scaleAll":"Dena erakutsi","scaleFit":"Doitu","scaleNoBorder":"Ertzik gabe","title":"Flasharen Ezaugarriak","vSpace":"VSpace","validateHSpace":"HSpace zenbaki bat izan behar da.","validateSrc":"Mesedez URL esteka idatzi","validateVSpace":"VSpace zenbaki bat izan behar da.","windowMode":"Leihoaren modua","windowModeOpaque":"Opakoa","windowModeTransparent":"Gardena","windowModeWindow":"Leihoa"},"font":{"fontSize":{"label":"Tamaina","voiceLabel":"Tamaina","panelTitle":"Tamaina"},"label":"Letra-tipoa","panelTitle":"Letra-tipoa","voiceLabel":"Letra-tipoa"},"forms":{"button":{"title":"Botoiaren Ezaugarriak","text":"Testua (Balorea)","type":"Mota","typeBtn":"Botoia","typeSbm":"Bidali","typeRst":"Garbitu"},"checkboxAndRadio":{"checkboxTitle":"Kontrol-laukiko Ezaugarriak","radioTitle":"Aukera-botoiaren Ezaugarriak","value":"Balorea","selected":"Hautatuta"},"form":{"title":"Formularioaren Ezaugarriak","menu":"Formularioaren Ezaugarriak","action":"Ekintza","method":"Metodoa","encoding":"Kodeketa"},"hidden":{"title":"Ezkutuko Eremuaren Ezaugarriak","name":"Izena","value":"Balorea"},"select":{"title":"Hautespen Eremuaren Ezaugarriak","selectInfo":"Informazioa","opAvail":"Aukera Eskuragarriak","value":"Balorea","size":"Tamaina","lines":"lerro kopurura","chkMulti":"Hautaketa anitzak baimendu","opText":"Testua","opValue":"Balorea","btnAdd":"Gehitu","btnModify":"Aldatu","btnUp":"Gora","btnDown":"Behera","btnSetValue":"Aukeratutako balorea ezarri","btnDelete":"Ezabatu"},"textarea":{"title":"Testu-arearen Ezaugarriak","cols":"Zutabeak","rows":"Lerroak"},"textfield":{"title":"Testu Eremuaren Ezaugarriak","name":"Izena","value":"Balorea","charWidth":"Zabalera","maxChars":"Zenbat karaktere gehienez","type":"Mota","typeText":"Testua","typePass":"Pasahitza","typeEmail":"E-posta","typeSearch":"Bilatu","typeTel":"Telefono Zenbakia","typeUrl":"URL"}},"format":{"label":"Formatua","panelTitle":"Formatua","tag_address":"Helbidea","tag_div":"Paragrafoa (DIV)","tag_h1":"Izenburua 1","tag_h2":"Izenburua 2","tag_h3":"Izenburua 3","tag_h4":"Izenburua 4","tag_h5":"Izenburua 5","tag_h6":"Izenburua 6","tag_p":"Arrunta","tag_pre":"Formateatua"},"horizontalrule":{"toolbar":"Txertatu Marra Horizontala"},"iframe":{"border":"Markoaren ertza ikusi","noUrl":"iframe-aren URLa idatzi, mesedez.","scrolling":"Korritze barrak gaitu","title":"IFrame-aren Propietateak","toolbar":"IFrame"},"image":{"alertUrl":"Mesedez Irudiaren URLa idatzi","alt":"Ordezko Testua","border":"Ertza","btnUpload":"Zerbitzarira bidalia","button2Img":"Aukeratutako irudi botoia, irudi normal batean eraldatu nahi duzu?","hSpace":"HSpace","img2Button":"Aukeratutako irudia, irudi botoi batean eraldatu nahi duzu?","infoTab":"Irudi informazioa","linkTab":"Esteka","lockRatio":"Erlazioa Blokeatu","menu":"Irudi Ezaugarriak","resetSize":"Tamaina Berrezarri","title":"Irudi Ezaugarriak","titleButton":"Irudi Botoiaren Ezaugarriak","upload":"Gora Kargatu","urlMissing":"Irudiaren iturburu URL-a falta da.","vSpace":"VSpace","validateBorder":"Ertza zenbaki oso bat izan behar da.","validateHSpace":"HSpace zenbaki oso bat izan behar da.","validateVSpace":"VSpace zenbaki oso bat izan behar da."},"indent":{"indent":"Handitu Koska","outdent":"Txikitu Koska"},"smiley":{"options":"Aurpegiera Aukerak","title":"Aurpegiera Sartu","toolbar":"Aurpegierak"},"justify":{"block":"Justifikatu","center":"Lerrokatu Erdian","left":"Lerrokatu Ezkerrean","right":"Lerrokatu Eskuman"},"link":{"acccessKey":"Sarbide-gakoa","advanced":"Aurreratua","advisoryContentType":"Eduki Mota (Content Type)","advisoryTitle":"Izenburua","anchor":{"toolbar":"Aingura","menu":"Ainguraren Ezaugarriak","title":"Ainguraren Ezaugarriak","name":"Ainguraren Izena","errorName":"Idatzi ainguraren izena","remove":"Remove Anchor"},"anchorId":"Elementuaren ID-gatik","anchorName":"Aingura izenagatik","charset":"Estekatutako Karaktere Multzoa","cssClasses":"Estilo-orriko Klaseak","emailAddress":"ePosta Helbidea","emailBody":"Mezuaren Gorputza","emailSubject":"Mezuaren Gaia","id":"Id","info":"Estekaren Informazioa","langCode":"Hizkuntzaren Norabidea","langDir":"Hizkuntzaren Norabidea","langDirLTR":"Ezkerretik Eskumara(LTR)","langDirRTL":"Eskumatik Ezkerrera (RTL)","menu":"Aldatu Esteka","name":"Izena","noAnchors":"(Ez daude aingurak eskuragarri dokumentuan)","noEmail":"Mesedez ePosta helbidea idatzi","noUrl":"Mesedez URL esteka idatzi","other":"<bestelakoa>","popupDependent":"Menpekoa (Netscape)","popupFeatures":"Popup Leihoaren Ezaugarriak","popupFullScreen":"Pantaila Osoa (IE)","popupLeft":"Ezkerreko  Posizioa","popupLocationBar":"Kokaleku Barra","popupMenuBar":"Menu Barra","popupResizable":"Tamaina Aldakorra","popupScrollBars":"Korritze Barrak","popupStatusBar":"Egoera Barra","popupToolbar":"Tresna Barra","popupTop":"Goiko Posizioa","rel":"Erlazioa","selectAnchor":"Aingura bat hautatu","styles":"Estiloa","tabIndex":"Tabulazio Indizea","target":"Target (Helburua)","targetFrame":"<marko>","targetFrameName":"Marko Helburuaren Izena","targetPopup":"<popup leihoa>","targetPopupName":"Popup Leihoaren Izena","title":"Esteka","toAnchor":"Aingura orrialde honetan","toEmail":"ePosta","toUrl":"URL","toolbar":"Txertatu/Editatu Esteka","type":"Esteka Mota","unlink":"Kendu Esteka","upload":"Gora kargatu"},"list":{"bulletedlist":"Buletdun Zerrenda","numberedlist":"Zenbakidun Zerrenda"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Txertatu paragrafoa hemen"},"maximize":{"maximize":"Maximizatu","minimize":"Minimizatu"},"newpage":{"toolbar":"Orrialde Berria"},"pagebreak":{"alt":"Orrialde-jauzia","toolbar":"Txertatu Orrialde-jauzia Inprimatzean"},"pastetext":{"button":"Testu Arrunta bezala Itsatsi","title":"Testu Arrunta bezala Itsatsi"},"pastefromword":{"confirmCleanup":"Itsatsi nahi duzun testua Wordetik hartua dela dirudi. Itsatsi baino lehen garbitu nahi duzu?","error":"Barneko errore bat dela eta ezin izan da testua garbitu","title":"Itsatsi Word-etik","toolbar":"Itsatsi Word-etik"},"preview":{"preview":"Aurrebista"},"print":{"toolbar":"Inprimatu"},"removeformat":{"toolbar":"Kendu Formatua"},"save":{"toolbar":"Gorde"},"selectall":{"toolbar":"Hautatu dena"},"showblocks":{"toolbar":"Blokeak erakutsi"},"sourcearea":{"toolbar":"HTML Iturburua"},"specialchar":{"options":"Karaktere Berezien Aukerak","title":"Karaktere Berezia Aukeratu","toolbar":"Txertatu Karaktere Berezia"},"scayt":{"about":"SCAYTi buruz","aboutTab":"Honi buruz","addWord":"Hitza Gehitu","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Hiztegiak","disable":"Desgaitu SCAYT","emptyDic":"Hiztegiaren izena ezin da hutsik egon.","enable":"Gaitu SCAYT","ignore":"Baztertu","ignoreAll":"Denak baztertu","ignoreDomainNames":"Ignore Domain Names","langs":"Hizkuntzak","languagesTab":"Hizkuntzak","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"Iradokizun gehiago","opera_title":"Not supported by Opera","options":"Aukerak","optionsTab":"Aukerak","title":"Ortografia Zuzenketa Idatzi Ahala (SCAYT)","toggle":"SCAYT aldatu","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estiloa","panelTitle":"Formatu Estiloak","panelTitle1":"Bloke Estiloak","panelTitle2":"Inline Estiloak","panelTitle3":"Objektu Estiloak"},"table":{"border":"Ertzaren Zabalera","caption":"Epigrafea","cell":{"menu":"Gelaxka","insertBefore":"Txertatu Gelaxka Aurretik","insertAfter":"Txertatu Gelaxka Ostean","deleteCell":"Kendu Gelaxkak","merge":"Batu Gelaxkak","mergeRight":"Elkartu Eskumara","mergeDown":"Elkartu Behera","splitHorizontal":"Banatu Gelaxkak Horizontalki","splitVertical":"Banatu Gelaxkak Bertikalki","title":"Gelaxken Ezaugarriak","cellType":"Gelaxka Mota","rowSpan":"Hedatutako Lerroak","colSpan":"Hedatutako Zutabeak","wordWrap":"Itzulbira","hAlign":"Lerrokatze Horizontala","vAlign":"Lerrokatze Bertikala","alignBaseline":"Oinarri-lerroan","bgColor":"Fondoaren Kolorea","borderColor":"Ertzaren Kolorea","data":"Data","header":"Goiburua","yes":"Bai","no":"Ez","invalidWidth":"Gelaxkaren zabalera zenbaki bat izan behar da.","invalidHeight":"Gelaxkaren altuera zenbaki bat izan behar da.","invalidRowSpan":"Lerroen hedapena zenbaki osoa izan behar da.","invalidColSpan":"Zutabeen hedapena zenbaki osoa izan behar da.","chooseColor":"Choose"},"cellPad":"Gelaxken betegarria","cellSpace":"Gelaxka arteko tartea","column":{"menu":"Zutabea","insertBefore":"Txertatu Zutabea Aurretik","insertAfter":"Txertatu Zutabea Ostean","deleteColumn":"Ezabatu Zutabeak"},"columns":"Zutabeak","deleteTable":"Ezabatu Taula","headers":"Goiburuak","headersBoth":"Biak","headersColumn":"Lehen zutabea","headersNone":"Bat ere ez","headersRow":"Lehen lerroa","invalidBorder":"Ertzaren tamaina zenbaki bat izan behar da.","invalidCellPadding":"Gelaxken betegarria zenbaki bat izan behar da.","invalidCellSpacing":"Gelaxka arteko tartea zenbaki bat izan behar da.","invalidCols":"Zutabe kopurua 0 baino handiagoa den zenbakia izan behar da.","invalidHeight":"Taularen altuera zenbaki bat izan behar da.","invalidRows":"Lerro kopurua 0 baino handiagoa den zenbakia izan behar da.","invalidWidth":"Taularen zabalera zenbaki bat izan behar da.","menu":"Taularen Ezaugarriak","row":{"menu":"Lerroa","insertBefore":"Txertatu Lerroa Aurretik","insertAfter":"Txertatu Lerroa Ostean","deleteRow":"Ezabatu Lerroak"},"rows":"Lerroak","summary":"Laburpena","title":"Taularen Ezaugarriak","toolbar":"Taula","widthPc":"ehuneko","widthPx":"pixel","widthUnit":"zabalera unitatea"},"undo":{"redo":"Berregin","undo":"Desegin"},"wsc":{"btnIgnore":"Ezikusi","btnIgnoreAll":"Denak Ezikusi","btnReplace":"Ordezkatu","btnReplaceAll":"Denak Ordezkatu","btnUndo":"Desegin","changeTo":"Honekin ordezkatu","errorLoading":"Errorea gertatu da aplikazioa zerbitzaritik kargatzean: %s.","ieSpellDownload":"Zuzentzaile ortografikoa ez dago instalatuta. Deskargatu nahi duzu?","manyChanges":"Zuzenketa ortografikoa bukatuta: %1 hitz aldatu dira","noChanges":"Zuzenketa ortografikoa bukatuta: Ez da ezer aldatu","noMispell":"Zuzenketa ortografikoa bukatuta: Akatsik ez","noSuggestions":"- Iradokizunik ez -","notAvailable":"Barkatu baina momentu honetan zerbitzua ez dago erabilgarri.","notInDic":"Ez dago hiztegian","oneChange":"Zuzenketa ortografikoa bukatuta: Hitz bat aldatu da","progress":"Zuzenketa ortografikoa martxan...","title":"Ortografia zuzenketa","toolbar":"Ortografia"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/fa.js b/htmltest/sites/all/libraries/ckeditor-version/lang/fa.js
new file mode 100644
index 00000000..bd5876a3
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/fa.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fa']={"editor":"ویرایشگر متن کامل","common":{"editorHelp":"کلید Alt+0 را برای راهنمایی بفشارید","browseServer":"فهرستنمایی سرور","url":"URL","protocol":"پروتکل","upload":"آپلود","uploadSubmit":"به سرور بفرست","image":"تصویر","flash":"فلش","form":"فرم","checkbox":"چکباکس","radio":"دکمهی رادیویی","textField":"فیلد متنی","textarea":"ناحیهٴ متنی","hiddenField":"فیلد پنهان","button":"دکمه","select":"فیلد انتخاب چند گزینهای","imageButton":"دکمهی تصویری","notSet":"<تعین نشده>","id":"شناسه","name":"نام","langDir":"جهتنمای زبان","langDirLtr":"چپ به راست","langDirRtl":"راست به چپ","langCode":"کد زبان","longDescr":"URL توصیف طولانی","cssClass":"کلاسهای شیوهنامه (Stylesheet)","advisoryTitle":"عنوان کمکی","cssStyle":"شیوه (style)","ok":"پذیرش","cancel":"انصراف","close":"بستن","preview":"پیشنمایش","resize":"تغییر اندازه","generalTab":"عمومی","advancedTab":"پیشرفته","validateNumberFailed":"این مقدار یک عدد نیست.","confirmNewPage":"هر تغییر ایجاد شدهی ذخیره نشده از بین خواهد رفت. آیا اطمینان دارید که قصد بارگیری صفحه جدیدی را دارید؟","confirmCancel":"برخی از گزینهها تغییر کردهاند. آیا واقعا قصد بستن این پنجره را دارید؟","options":"گزینهها","target":"نحوه باز کردن","targetNew":"پنجره جدید","targetTop":"بالاترین پنجره","targetSelf":"همان پنجره","targetParent":"پنجره والد","langDirLTR":"چپ به راست","langDirRTL":"راست به چپ","styles":"سبک","cssClasses":"کلاسهای شیوهنامه","width":"عرض","height":"طول","align":"چینش","alignLeft":"چپ","alignRight":"راست","alignCenter":"مرکز","alignTop":"بالا","alignMiddle":"وسط","alignBottom":"پائین","invalidValue":"مقدار نامعتبر.","invalidHeight":"ارتفاع باید یک عدد باشد.","invalidWidth":"عرض باید یک عدد باشد.","invalidCssLength":"عدد تعیین شده برای فیلد \"%1\" باید یک عدد مثبت با یا بدون یک واحد اندازه گیری CSS معتبر باشد (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"عدد تعیین شده برای فیلد \"%1\" باید یک عدد مثبت با یا بدون یک واحد اندازه گیری HTML معتبر باشد (px or %).","invalidInlineStyle":"عدد تعیین شده برای سبک درونخطی -Inline Style- باید دارای یک یا چند چندتایی با شکلی شبیه \"name : value\" که باید با یک \";\" از هم جدا شوند.","cssLengthTooltip":"یک عدد برای یک مقدار بر حسب پیکسل و یا یک عدد با یک واحد CSS معتبر وارد کنید (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">، غیر قابل دسترس</span>"},"about":{"copy":"حق نشر &copy; $1. کلیه حقوق محفوظ است.","dlgTitle":"درباره CKEditor","help":" برای راهنمایی $1 را بررسی کنید.","moreInfo":"برای کسب اطلاعات مجوز لطفا به وب سایت ما مراجعه کنید:","title":"درباره CKEditor","userGuide":"راهنمای کاربران CKEditor"},"basicstyles":{"bold":"درشت","italic":"خمیده","strike":"میانخط","subscript":"زیرنویس","superscript":"بالانویس","underline":"زیرخطدار"},"bidi":{"ltr":"نوشتار متن از چپ به راست","rtl":"نوشتار متن از راست به چپ"},"blockquote":{"toolbar":"بلوک نقل قول"},"clipboard":{"copy":"رونوشت","copyError":"تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای کپی کردن را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+C).","cut":"برش","cutError":"تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای برش را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+X).","paste":"چسباندن","pasteArea":"محل چسباندن","pasteMsg":"لطفا متن را با کلیدهای (<STRONG>Ctrl/Cmd+V</STRONG>) در این جعبهٴ متنی بچسبانید و <STRONG>پذیرش</STRONG> را بزنید.","securityMsg":"به خاطر تنظیمات امنیتی مرورگر شما، ویرایشگر نمیتواند دسترسی مستقیم به دادههای clipboard داشته باشد. شما باید دوباره آنرا در این پنجره بچسبانید.","title":"چسباندن"},"colorbutton":{"auto":"خودکار","bgColorTitle":"رنگ پسزمینه","colors":{"000":"سیاه","800000":"خرمایی","8B4513":"قهوهای شکلاتی","2F4F4F":"ارغوانی مایل به خاکستری","008080":"آبی مایل به خاکستری","000080":"آبی سیر","4B0082":"نیلی","696969":"خاکستری تیره","B22222":"آتش آجری","A52A2A":"قهوهای","DAA520":"میلهی طلایی","006400":"سبز تیره","40E0D0":"فیروزهای","0000CD":"آبی روشن","800080":"ارغوانی","808080":"خاکستری","F00":"قرمز","FF8C00":"نارنجی پررنگ","FFD700":"طلایی","008000":"سبز","0FF":"آبی مایل به سبز","00F":"آبی","EE82EE":"بنفش","A9A9A9":"خاکستری مات","FFA07A":"صورتی کدر روشن","FFA500":"نارنجی","FFFF00":"زرد","00FF00":"فسفری","AFEEEE":"فیروزهای رنگ پریده","ADD8E6":"آبی کمرنگ","DDA0DD":"آلویی","D3D3D3":"خاکستری روشن","FFF0F5":"بنفش کمرنگ","FAEBD7":"عتیقه سفید","FFFFE0":"زرد روشن","F0FFF0":"عسلی","F0FFFF":"لاجوردی","F0F8FF":"آبی براق","E6E6FA":"بنفش کمرنگ","FFF":"سفید"},"more":"رنگهای بیشتر...","panelTitle":"رنگها","textColorTitle":"رنگ متن"},"colordialog":{"clear":"پاک کردن","highlight":"متمایز","options":"گزینههای رنگ","selected":"رنگ انتخاب شده","title":"انتخاب رنگ"},"templates":{"button":"الگوها","emptyListMsg":"(الگوئی تعریف نشده است)","insertOption":"محتویات کنونی جایگزین شوند","options":"گزینههای الگو","selectPromptMsg":"لطفا الگوی موردنظر را برای بازکردن در ویرایشگر برگزینید<br>(محتویات کنونی از دست خواهند رفت):","title":"الگوهای محتویات"},"contextmenu":{"options":"گزینههای منوی زمینه"},"div":{"IdInputLabel":"شناسه","advisoryTitleInputLabel":"عنوان مشاوره","cssClassInputLabel":"کلاسهای شیوهنامه","edit":"ویرایش Div","inlineStyleInputLabel":"سبک درونخطی(Inline Style)","langDirLTRLabel":"چپ به راست (LTR)","langDirLabel":"جهت نوشتاری زبان","langDirRTLLabel":"راست به چپ (RTL)","languageCodeInputLabel":" کد زبان","remove":"حذف Div","styleSelectLabel":"سبک","title":"ایجاد یک محل DIV","toolbar":"ایجاد یک محل DIV"},"toolbar":{"toolbarCollapse":"بستن نوار ابزار","toolbarExpand":"بازکردن نوار ابزار","toolbarGroups":{"document":"سند","clipboard":"حافظه موقت/برگشت","editing":"در حال ویرایش","forms":"فرمها","basicstyles":"شیوههای پایه","paragraph":"بند","links":"پیوندها","insert":"ورود","styles":"شیوهها","colors":"رنگها","tools":"ابزارها"},"toolbars":"نوار ابزار"},"elementspath":{"eleLabel":"مسیر عناصر","eleTitle":"%1 عنصر"},"find":{"find":"جستجو","findOptions":"گزینههای جستجو","findWhat":"چه چیز را مییابید:","matchCase":"همسانی در بزرگی و کوچکی نویسهها","matchCyclic":"همسانی با چرخه","matchWord":"همسانی با واژهٴ کامل","notFoundMsg":"متن موردنظر یافت نشد.","replace":"جایگزینی","replaceAll":"جایگزینی همهٴ یافتهها","replaceSuccessMsg":"%1 رخداد جایگزین شد.","replaceWith":"جایگزینی با:","title":"جستجو و جایگزینی"},"fakeobjects":{"anchor":"لنگر","flash":"انیمشن فلش","hiddenfield":"فیلد پنهان","iframe":"IFrame","unknown":"شیء ناشناخته"},"flash":{"access":"دسترسی به اسکریپت","accessAlways":"همیشه","accessNever":"هرگز","accessSameDomain":"همان دامنه","alignAbsBottom":"پائین مطلق","alignAbsMiddle":"وسط مطلق","alignBaseline":"خط پایه","alignTextTop":"متن بالا","bgcolor":"رنگ پسزمینه","chkFull":"اجازه تمام صفحه","chkLoop":"اجرای پیاپی","chkMenu":"در دسترس بودن منوی فلش","chkPlay":"آغاز خودکار","flashvars":"مقادیر برای فلش","hSpace":"فاصلهٴ افقی","properties":"ویژگیهای فلش","propertiesTab":"ویژگیها","quality":"کیفیت","qualityAutoHigh":"بالا - خودکار","qualityAutoLow":"پایین - خودکار","qualityBest":"بهترین","qualityHigh":"بالا","qualityLow":"پایین","qualityMedium":"متوسط","scale":"مقیاس","scaleAll":"نمایش همه","scaleFit":"جایگیری کامل","scaleNoBorder":"بدون کران","title":"ویژگیهای فلش","vSpace":"فاصلهٴ عمودی","validateHSpace":"مقدار فاصله گذاری افقی باید یک عدد باشد.","validateSrc":"لطفا URL پیوند را بنویسید","validateVSpace":"مقدار فاصله گذاری عمودی باید یک عدد باشد.","windowMode":"حالت پنجره","windowModeOpaque":"مات","windowModeTransparent":"شفاف","windowModeWindow":"پنجره"},"font":{"fontSize":{"label":"اندازه","voiceLabel":"اندازه قلم","panelTitle":"اندازه قلم"},"label":"قلم","panelTitle":"نام قلم","voiceLabel":"قلم"},"forms":{"button":{"title":"ویژگیهای دکمه","text":"متن (مقدار)","type":"نوع","typeBtn":"دکمه","typeSbm":"ثبت","typeRst":"بازنشانی (Reset)"},"checkboxAndRadio":{"checkboxTitle":"ویژگیهای خانهٴ گزینهای","radioTitle":"ویژگیهای دکمهٴ رادیویی","value":"مقدار","selected":"برگزیده"},"form":{"title":"ویژگیهای فرم","menu":"ویژگیهای فرم","action":"رویداد","method":"متد","encoding":"رمزنگاری"},"hidden":{"title":"ویژگیهای فیلد پنهان","name":"نام","value":"مقدار"},"select":{"title":"ویژگیهای فیلد چندگزینهای","selectInfo":"اطلاعات","opAvail":"گزینههای دردسترس","value":"مقدار","size":"اندازه","lines":"خطوط","chkMulti":"گزینش چندگانه فراهم باشد","opText":"متن","opValue":"مقدار","btnAdd":"افزودن","btnModify":"ویرایش","btnUp":"بالا","btnDown":"پائین","btnSetValue":"تنظیم به عنوان مقدار برگزیده","btnDelete":"پاککردن"},"textarea":{"title":"ویژگیهای ناحیهٴ متنی","cols":"ستونها","rows":"سطرها"},"textfield":{"title":"ویژگیهای فیلد متنی","name":"نام","value":"مقدار","charWidth":"پهنای نویسه","maxChars":"بیشینهٴ نویسهها","type":"نوع","typeText":"متن","typePass":"گذرواژه","typeEmail":"ایمیل","typeSearch":"جستجو","typeTel":"شماره تلفن","typeUrl":"URL"}},"format":{"label":"فرمت","panelTitle":"فرمت","tag_address":"آدرس","tag_div":"بند","tag_h1":"سرنویس 1","tag_h2":"سرنویس 2","tag_h3":"سرنویس 3","tag_h4":"سرنویس 4","tag_h5":"سرنویس 5","tag_h6":"سرنویس 6","tag_p":"نرمال","tag_pre":"فرمت شده"},"horizontalrule":{"toolbar":"گنجاندن خط افقی"},"iframe":{"border":"نمایش خطوط frame","noUrl":"لطفا مسیر URL iframe را درج کنید","scrolling":"نمایش خطکشها","title":"ویژگیهای IFrame","toolbar":"IFrame"},"image":{"alertUrl":"لطفا URL تصویر را بنویسید","alt":"متن جایگزین","border":"لبه","btnUpload":"به سرور بفرست","button2Img":"آیا مایلید از یک تصویر ساده روی دکمه تصویری انتخاب شده استفاده کنید؟","hSpace":"فاصلهٴ افقی","img2Button":"آیا مایلید از یک دکمه تصویری روی تصویر انتخاب شده استفاده کنید؟","infoTab":"اطلاعات تصویر","linkTab":"پیوند","lockRatio":"قفل کردن نسبت","menu":"ویژگیهای تصویر","resetSize":"بازنشانی اندازه","title":"ویژگیهای تصویر","titleButton":"ویژگیهای دکمهٴ تصویری","upload":"انتقال به سرور","urlMissing":"آدرس URL اصلی تصویر یافت نشد.","vSpace":"فاصلهٴ عمودی","validateBorder":"مقدار خطوط باید یک عدد باشد.","validateHSpace":"مقدار فاصله گذاری افقی باید یک عدد باشد.","validateVSpace":"مقدار فاصله گذاری عمودی باید یک عدد باشد."},"indent":{"indent":"افزایش تورفتگی","outdent":"کاهش تورفتگی"},"smiley":{"options":"گزینههای خندانک","title":"گنجاندن خندانک","toolbar":"خندانک"},"justify":{"block":"بلوک چین","center":"میان چین","left":"چپ چین","right":"راست چین"},"link":{"acccessKey":"کلید دستیابی","advanced":"پیشرفته","advisoryContentType":"نوع محتوای کمکی","advisoryTitle":"عنوان کمکی","anchor":{"toolbar":"گنجاندن/ویرایش لنگر","menu":"ویژگیهای لنگر","title":"ویژگیهای لنگر","name":"نام لنگر","errorName":"لطفا نام لنگر را بنویسید","remove":"حذف لنگر"},"anchorId":"با شناسهٴ المان","anchorName":"با نام لنگر","charset":"نویسهگان منبع پیوند شده","cssClasses":"کلاسهای شیوهنامه(Stylesheet)","emailAddress":"نشانی پست الکترونیکی","emailBody":"متن پیام","emailSubject":"موضوع پیام","id":"شناسه","info":"اطلاعات پیوند","langCode":"جهتنمای زبان","langDir":"جهتنمای زبان","langDirLTR":"چپ به راست (LTR)","langDirRTL":"راست به چپ (RTL)","menu":"ویرایش پیوند","name":"نام","noAnchors":"(در این سند لنگری دردسترس نیست)","noEmail":"لطفا نشانی پست الکترونیکی را بنویسید","noUrl":"لطفا URL پیوند را بنویسید","other":"<سایر>","popupDependent":"وابسته (Netscape)","popupFeatures":"ویژگیهای پنجرهٴ پاپاپ","popupFullScreen":"تمام صفحه (IE)","popupLeft":"موقعیت چپ","popupLocationBar":"نوار موقعیت","popupMenuBar":"نوار منو","popupResizable":"قابل تغییر اندازه","popupScrollBars":"میلههای پیمایش","popupStatusBar":"نوار وضعیت","popupToolbar":"نوار ابزار","popupTop":"موقعیت بالا","rel":"وابستگی","selectAnchor":"یک لنگر برگزینید","styles":"شیوه (style)","tabIndex":"نمایهٴ دسترسی با برگه","target":"مقصد","targetFrame":"<فریم>","targetFrameName":"نام فریم مقصد","targetPopup":"<پنجرهٴ پاپاپ>","targetPopupName":"نام پنجرهٴ پاپاپ","title":"پیوند","toAnchor":"لنگر در همین صفحه","toEmail":"پست الکترونیکی","toUrl":"URL","toolbar":"گنجاندن/ویرایش پیوند","type":"نوع پیوند","unlink":"برداشتن پیوند","upload":"انتقال به سرور"},"list":{"bulletedlist":"فهرست نقطهای","numberedlist":"فهرست شمارهدار"},"liststyle":{"armenian":"شمارهگذاری ارمنی","bulletedTitle":"ویژگیهای فهرست گلولهدار","circle":"دایره","decimal":"دهدهی (1, 2, 3, etc.)","decimalLeadingZero":"دهدهی همراه با صفر (01, 02, 03, etc.)","disc":"صفحه گرد","georgian":"شمارهگذاری گریگورین (an, ban, gan, etc.)","lowerAlpha":"پانویس الفبایی (a, b, c, d, e, etc.)","lowerGreek":"پانویس یونانی (alpha, beta, gamma, etc.)","lowerRoman":"پانویس رومی (i, ii, iii, iv, v, etc.)","none":"هیچ","notset":"<تنظیم نشده>","numberedTitle":"ویژگیهای فهرست شمارهدار","square":"چهارگوش","start":"شروع","type":"نوع","upperAlpha":"بالانویس الفبایی (A, B, C, D, E, etc.)","upperRoman":"بالانویس رومی (I, II, III, IV, V, etc.)","validateStartNumber":"فهرست شماره شروع باید یک عدد صحیح باشد."},"magicline":{"title":"قرار دادن بند در اینجا"},"maximize":{"maximize":"بیشنه کردن","minimize":"کمینه کردن"},"newpage":{"toolbar":"برگهٴ تازه"},"pagebreak":{"alt":"شکستن صفحه","toolbar":"گنجاندن شکستگی پایان برگه"},"pastetext":{"button":"چسباندن به عنوان متن ساده","title":"چسباندن به عنوان متن ساده"},"pastefromword":{"confirmCleanup":"متنی که میخواهید بچسبانید به نظر میرسد که از Word کپی شده است. آیا میخواهید قبل از چسباندن آن را پاکسازی کنید؟","error":"به دلیل بروز خطای داخلی امکان پاکسازی اطلاعات بازنشانی شده وجود ندارد.","title":"چسباندن از Word","toolbar":"چسباندن از Word"},"preview":{"preview":"پیشنمایش"},"print":{"toolbar":"چاپ"},"removeformat":{"toolbar":"برداشتن فرمت"},"save":{"toolbar":"ذخیره"},"selectall":{"toolbar":"گزینش همه"},"showblocks":{"toolbar":"نمایش بلوکها"},"sourcearea":{"toolbar":"منبع"},"specialchar":{"options":"گزینههای نویسههای ویژه","title":"گزینش نویسهی ویژه","toolbar":"گنجاندن نویسهی ویژه"},"scayt":{"about":"درباره SCAYT","aboutTab":"درباره","addWord":"افزودن Word","allCaps":"نادیده گرفتن همه کلاه-واژهها","dic_create":"ایجاد","dic_delete":"حذف","dic_field_name":"نام دیکشنری","dic_info":"در ابتدا دیکشنری کاربر در کوکی ذخیره میشود. با این حال، کوکیها در اندازه محدود شدهاند. وقتی که دیکشنری کاربری بزرگ میشود و به نقطهای که نمیتواند در کوکی ذخیره شود، پس از آن دیکشنری ممکن است بر روی سرور ما ذخیره شود. برای ذخیره دیکشنری شخصی شما بر روی سرور ما، باید یک نام برای دیکشنری خود مشخص نمایید. اگر شما قبلا یک دیکشنری روی سرور ما ذخیره کردهاید، لطفا نام آنرا درج و روی دکمه بازیافت کلیک نمایید.","dic_rename":"تغییر نام","dic_restore":"بازیافت","dictionariesTab":"دیکشنریها","disable":"غیرفعالسازی SCAYT","emptyDic":"نام دیکشنری نباید خالی باشد.","enable":"فعالسازی SCAYT","ignore":"عبور کردن","ignoreAll":"عبور کردن از همه","ignoreDomainNames":"عبور از نامهای دامنه","langs":"زبانها","languagesTab":"زبانها","mixedCase":"عبور از کلماتی مرکب از حروف بزرگ و کوچک","mixedWithDigits":"عبور از کلمات به همراه عدد","moreSuggestions":"پیشنهادهای بیشتر","opera_title":"توسط اپرا پشتیبانی نمیشود","options":"گزینهها","optionsTab":"گزینهها","title":"بررسی املای تایپ شما","toggle":"ضامن SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"سبک","panelTitle":"سبکهای قالببندی","panelTitle1":"سبکهای بلوک","panelTitle2":"سبکهای درونخطی","panelTitle3":"سبکهای شیء"},"table":{"border":"اندازهٴ لبه","caption":"عنوان","cell":{"menu":"سلول","insertBefore":"افزودن سلول قبل از","insertAfter":"افزودن سلول بعد از","deleteCell":"حذف سلولها","merge":"ادغام سلولها","mergeRight":"ادغام به راست","mergeDown":"ادغام به پایین","splitHorizontal":"جدا کردن افقی سلول","splitVertical":"جدا کردن عمودی سلول","title":"ویژگیهای سلول","cellType":"نوع سلول","rowSpan":"محدوده ردیفها","colSpan":"محدوده ستونها","wordWrap":"شکستن کلمه","hAlign":"چینش افقی","vAlign":"چینش عمودی","alignBaseline":"خط مبنا","bgColor":"رنگ زمینه","borderColor":"رنگ خطوط","data":"اطلاعات","header":"سرنویس","yes":"بله","no":"خیر","invalidWidth":"عرض سلول باید یک عدد باشد.","invalidHeight":"ارتفاع سلول باید عدد باشد.","invalidRowSpan":"مقدار محدوده ردیفها باید یک عدد باشد.","invalidColSpan":"مقدار محدوده ستونها باید یک عدد باشد.","chooseColor":"انتخاب"},"cellPad":"فاصلهٴ پرشده در سلول","cellSpace":"فاصلهٴ میان سلولها","column":{"menu":"ستون","insertBefore":"افزودن ستون قبل از","insertAfter":"افزودن ستون بعد از","deleteColumn":"حذف ستونها"},"columns":"ستونها","deleteTable":"پاک کردن جدول","headers":"سرنویسها","headersBoth":"هردو","headersColumn":"اولین ستون","headersNone":"هیچ","headersRow":"اولین ردیف","invalidBorder":"مقدار اندازه خطوط باید یک عدد باشد.","invalidCellPadding":"بالشتک سلول باید یک عدد باشد.","invalidCellSpacing":"مقدار فاصلهگذاری سلول باید یک عدد باشد.","invalidCols":"تعداد ستونها باید یک عدد بزرگتر از 0 باشد.","invalidHeight":"مقدار ارتفاع  جدول باید یک عدد باشد.","invalidRows":"تعداد ردیفها باید یک عدد بزرگتر از 0 باشد.","invalidWidth":"مقدار پهنای جدول باید یک عدد باشد.","menu":"ویژگیهای جدول","row":{"menu":"سطر","insertBefore":"افزودن سطر قبل از","insertAfter":"افزودن سطر بعد از","deleteRow":"حذف سطرها"},"rows":"سطرها","summary":"خلاصه","title":"ویژگیهای جدول","toolbar":"جدول","widthPc":"درصد","widthPx":"پیکسل","widthUnit":"واحد پهنا"},"undo":{"redo":"بازچیدن","undo":"واچیدن"},"wsc":{"btnIgnore":"چشمپوشی","btnIgnoreAll":"چشمپوشی همه","btnReplace":"جایگزینی","btnReplaceAll":"جایگزینی همه","btnUndo":"واچینش","changeTo":"تغییر به","errorLoading":"خطا در بارگیری برنامه خدمات میزبان: %s.","ieSpellDownload":"بررسی کنندهٴ املا نصب نشده است. آیا میخواهید آن را هماکنون دریافت کنید؟","manyChanges":"بررسی املا انجام شد. %1 واژه تغییر یافت","noChanges":"بررسی املا انجام شد. هیچ واژهای تغییر نیافت","noMispell":"بررسی املا انجام شد. هیچ غلط املائی یافت نشد","noSuggestions":"- پیشنهادی نیست -","notAvailable":"با عرض پوزش خدمات الان در دسترس نیستند.","notInDic":"در واژه~نامه یافت نشد","oneChange":"بررسی املا انجام شد. یک واژه تغییر یافت","progress":"بررسی املا در حال انجام...","title":"بررسی املا","toolbar":"بررسی املا"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/fi.js b/htmltest/sites/all/libraries/ckeditor-version/lang/fi.js
new file mode 100644
index 00000000..70e2b033
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/fi.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fi']={"editor":"Rikastekstieditori","common":{"editorHelp":"Paina ALT 0 nähdäksesi ohjeen","browseServer":"Selaa palvelinta","url":"Osoite","protocol":"Protokolla","upload":"Lisää tiedosto","uploadSubmit":"Lähetä palvelimelle","image":"Kuva","flash":"Flash-animaatio","form":"Lomake","checkbox":"Valintaruutu","radio":"Radiopainike","textField":"Tekstikenttä","textarea":"Tekstilaatikko","hiddenField":"Piilokenttä","button":"Painike","select":"Valintakenttä","imageButton":"Kuvapainike","notSet":"<ei asetettu>","id":"Tunniste","name":"Nimi","langDir":"Kielen suunta","langDirLtr":"Vasemmalta oikealle (LTR)","langDirRtl":"Oikealta vasemmalle (RTL)","langCode":"Kielikoodi","longDescr":"Pitkän kuvauksen URL","cssClass":"Tyyliluokat","advisoryTitle":"Avustava otsikko","cssStyle":"Tyyli","ok":"OK","cancel":"Peruuta","close":"Sulje","preview":"Esikatselu","resize":"Raahaa muuttaaksesi kokoa","generalTab":"Yleinen","advancedTab":"Lisäominaisuudet","validateNumberFailed":"Arvon pitää olla numero.","confirmNewPage":"Kaikki tallentamattomat muutokset tähän sisältöön menetetään. Oletko varma, että haluat ladata uuden sivun?","confirmCancel":"Jotkut asetuksista on muuttuneet. Oletko varma, että haluat sulkea valintaikkunan?","options":"Asetukset","target":"Kohde","targetNew":"Uusi ikkuna (_blank)","targetTop":"Päällimmäinen ikkuna (_top)","targetSelf":"Sama ikkuna (_self)","targetParent":"Ylemmän tason ikkuna (_parent)","langDirLTR":"Vasemmalta oikealle (LTR)","langDirRTL":"Oikealta vasemmalle (RTL)","styles":"Tyyli","cssClasses":"Tyylitiedoston luokat","width":"Leveys","height":"Korkeus","align":"Kohdistus","alignLeft":"Vasemmalle","alignRight":"Oikealle","alignCenter":"Keskelle","alignTop":"Ylös","alignMiddle":"Keskelle","alignBottom":"Alas","invalidValue":"Virheellinen arvo.","invalidHeight":"Korkeuden täytyy olla numero.","invalidWidth":"Leveyden täytyy olla numero.","invalidCssLength":"Kentän \"%1\" arvon täytyy olla positiivinen luku CSS mittayksikön (px, %, in, cm, mm, em, ex, pt tai pc) kanssa tai ilman.","invalidHtmlLength":"Kentän \"%1\" arvon täytyy olla positiivinen luku HTML mittayksikön (px tai %) kanssa tai ilman.","invalidInlineStyle":"Tyylille annetun arvon täytyy koostua yhdestä tai useammasta \"nimi : arvo\" parista, jotka ovat eroteltuna toisistaan puolipisteillä.","cssLengthTooltip":"Anna numeroarvo pikseleinä tai numeroarvo CSS mittayksikön kanssa (px, %, in, cm, mm, em, ex, pt, tai pc).","unavailable":"%1<span class=\"cke_accessibility\">, ei saatavissa</span>"},"about":{"copy":"Copyright &copy; $1. Kaikki oikeuden pidätetään.","dlgTitle":"Tietoa CKEditorista","help":"Katso ohjeet: $1.","moreInfo":"Lisenssitiedot löytyvät kotisivuiltamme:","title":"Tietoa CKEditorista","userGuide":"CKEditorin käyttäjäopas"},"basicstyles":{"bold":"Lihavoitu","italic":"Kursivoitu","strike":"Yliviivattu","subscript":"Alaindeksi","superscript":"Yläindeksi","underline":"Alleviivattu"},"bidi":{"ltr":"Tekstin suunta vasemmalta oikealle","rtl":"Tekstin suunta oikealta vasemmalle"},"blockquote":{"toolbar":"Lainaus"},"clipboard":{"copy":"Kopioi","copyError":"Selaimesi turva-asetukset eivät salli editorin toteuttaa kopioimista. Käytä näppäimistöä kopioimiseen (Ctrl+C).","cut":"Leikkaa","cutError":"Selaimesi turva-asetukset eivät salli editorin toteuttaa leikkaamista. Käytä näppäimistöä leikkaamiseen (Ctrl+X).","paste":"Liitä","pasteArea":"Leikealue","pasteMsg":"Liitä painamalla (<STRONG>Ctrl+V</STRONG>) ja painamalla <STRONG>OK</STRONG>.","securityMsg":"Selaimesi turva-asetukset eivät salli editorin käyttää leikepöytää suoraan. Sinun pitää suorittaa liittäminen tässä ikkunassa.","title":"Liitä"},"colorbutton":{"auto":"Automaattinen","bgColorTitle":"Taustaväri","colors":{"000":"Musta","800000":"Kastanjanruskea","8B4513":"Satulanruskea","2F4F4F":"Tumma liuskekivenharmaa","008080":"Sinivihreä","000080":"Laivastonsininen","4B0082":"Indigonsininen","696969":"Tummanharmaa","B22222":"Tiili","A52A2A":"Ruskea","DAA520":"Kultapiisku","006400":"Tummanvihreä","40E0D0":"Turkoosi","0000CD":"Keskisininen","800080":"Purppura","808080":"Harmaa","F00":"Punainen","FF8C00":"Tumma oranssi","FFD700":"Kulta","008000":"Vihreä","0FF":"Syaani","00F":"Sininen","EE82EE":"Violetti","A9A9A9":"Tummanharmaa","FFA07A":"Vaaleanlohenpunainen","FFA500":"Oranssi","FFFF00":"Keltainen","00FF00":"Limetin vihreä","AFEEEE":"Haalea turkoosi","ADD8E6":"Vaaleansininen","DDA0DD":"Luumu","D3D3D3":"Vaaleanharmaa","FFF0F5":"Laventelinpunainen","FAEBD7":"Antiikinvalkoinen","FFFFE0":"Vaaleankeltainen","F0FFF0":"Hunajameloni","F0FFFF":"Asurinsininen","F0F8FF":"Alice Blue -sininen","E6E6FA":"Lavanteli","FFF":"Valkoinen"},"more":"Lisää värejä...","panelTitle":"Värit","textColorTitle":"Tekstiväri"},"colordialog":{"clear":"Poista","highlight":"Korostus","options":"Värin ominaisuudet","selected":"Valittu","title":"Valitse väri"},"templates":{"button":"Pohjat","emptyListMsg":"(Ei määriteltyjä pohjia)","insertOption":"Korvaa koko sisältö","options":"Sisältöpohjan ominaisuudet","selectPromptMsg":"Valitse editoriin avattava pohja","title":"Sisältöpohjat"},"contextmenu":{"options":"Pikavalikon ominaisuudet"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Ohjeistava otsikko","cssClassInputLabel":"Tyylitiedoston luokat","edit":"Muokkaa Diviä","inlineStyleInputLabel":"Sisätyyli","langDirLTRLabel":"Vasemmalta oikealle (LTR)","langDirLabel":"Kielen suunta","langDirRTLLabel":"Oikealta vasemmalle (RTL)","languageCodeInputLabel":" Kielen koodi","remove":"Poista Div","styleSelectLabel":"Tyyli","title":"Luo div-kehikko","toolbar":"Luo div-kehikko"},"toolbar":{"toolbarCollapse":"Kutista työkalupalkki","toolbarExpand":"Laajenna työkalupalkki","toolbarGroups":{"document":"Dokumentti","clipboard":"Leikepöytä/Kumoa","editing":"Muokkaus","forms":"Lomakkeet","basicstyles":"Perustyylit","paragraph":"Kappale","links":"Linkit","insert":"Lisää","styles":"Tyylit","colors":"Värit","tools":"Työkalut"},"toolbars":"Editorin työkalupalkit"},"elementspath":{"eleLabel":"Elementin polku","eleTitle":"%1 elementti"},"find":{"find":"Etsi","findOptions":"Hakuasetukset","findWhat":"Etsi mitä:","matchCase":"Sama kirjainkoko","matchCyclic":"Kierrä ympäri","matchWord":"Koko sana","notFoundMsg":"Etsittyä tekstiä ei löytynyt.","replace":"Korvaa","replaceAll":"Korvaa kaikki","replaceSuccessMsg":"%1 esiintymä(ä) korvattu.","replaceWith":"Korvaa tällä:","title":"Etsi ja korvaa"},"fakeobjects":{"anchor":"Ankkuri","flash":"Flash animaatio","hiddenfield":"Piilokenttä","iframe":"IFrame-kehys","unknown":"Tuntematon objekti"},"flash":{"access":"Skriptien pääsy","accessAlways":"Aina","accessNever":"Ei koskaan","accessSameDomain":"Sama verkkotunnus","alignAbsBottom":"Aivan alas","alignAbsMiddle":"Aivan keskelle","alignBaseline":"Alas (teksti)","alignTextTop":"Ylös (teksti)","bgcolor":"Taustaväri","chkFull":"Salli kokoruututila","chkLoop":"Toisto","chkMenu":"Näytä Flash-valikko","chkPlay":"Automaattinen käynnistys","flashvars":"Muuttujat Flash:lle","hSpace":"Vaakatila","properties":"Flash-ominaisuudet","propertiesTab":"Ominaisuudet","quality":"Laatu","qualityAutoHigh":"Automaattinen korkea","qualityAutoLow":"Automaattinen matala","qualityBest":"Paras","qualityHigh":"Korkea","qualityLow":"Matala","qualityMedium":"Keskitaso","scale":"Levitä","scaleAll":"Näytä kaikki","scaleFit":"Tarkka koko","scaleNoBorder":"Ei rajaa","title":"Flash ominaisuudet","vSpace":"Pystytila","validateHSpace":"Vaakatilan täytyy olla numero.","validateSrc":"Linkille on kirjoitettava URL","validateVSpace":"Pystytilan täytyy olla numero.","windowMode":"Ikkuna tila","windowModeOpaque":"Läpinäkyvyys","windowModeTransparent":"Läpinäkyvä","windowModeWindow":"Ikkuna"},"font":{"fontSize":{"label":"Koko","voiceLabel":"Kirjaisimen koko","panelTitle":"Koko"},"label":"Kirjaisinlaji","panelTitle":"Kirjaisinlaji","voiceLabel":"Kirjaisinlaji"},"forms":{"button":{"title":"Painikkeen ominaisuudet","text":"Teksti (arvo)","type":"Tyyppi","typeBtn":"Painike","typeSbm":"Lähetä","typeRst":"Tyhjennä"},"checkboxAndRadio":{"checkboxTitle":"Valintaruudun ominaisuudet","radioTitle":"Radiopainikkeen ominaisuudet","value":"Arvo","selected":"Valittu"},"form":{"title":"Lomakkeen ominaisuudet","menu":"Lomakkeen ominaisuudet","action":"Toiminto","method":"Tapa","encoding":"Enkoodaus"},"hidden":{"title":"Piilokentän ominaisuudet","name":"Nimi","value":"Arvo"},"select":{"title":"Valintakentän ominaisuudet","selectInfo":"Info","opAvail":"Ominaisuudet","value":"Arvo","size":"Koko","lines":"Rivit","chkMulti":"Salli usea valinta","opText":"Teksti","opValue":"Arvo","btnAdd":"Lisää","btnModify":"Muuta","btnUp":"Ylös","btnDown":"Alas","btnSetValue":"Aseta valituksi","btnDelete":"Poista"},"textarea":{"title":"Tekstilaatikon ominaisuudet","cols":"Sarakkeita","rows":"Rivejä"},"textfield":{"title":"Tekstikentän ominaisuudet","name":"Nimi","value":"Arvo","charWidth":"Leveys","maxChars":"Maksimi merkkimäärä","type":"Tyyppi","typeText":"Teksti","typePass":"Salasana","typeEmail":"Sähköposti","typeSearch":"Haku","typeTel":"Puhelinnumero","typeUrl":"Osoite"}},"format":{"label":"Muotoilu","panelTitle":"Muotoilu","tag_address":"Osoite","tag_div":"Normaali (DIV)","tag_h1":"Otsikko 1","tag_h2":"Otsikko 2","tag_h3":"Otsikko 3","tag_h4":"Otsikko 4","tag_h5":"Otsikko 5","tag_h6":"Otsikko 6","tag_p":"Normaali","tag_pre":"Muotoiltu"},"horizontalrule":{"toolbar":"Lisää murtoviiva"},"iframe":{"border":"Näytä kehyksen reunat","noUrl":"Anna IFrame-kehykselle lähdeosoite (src)","scrolling":"Näytä vierityspalkit","title":"IFrame-kehyksen ominaisuudet","toolbar":"IFrame-kehys"},"image":{"alertUrl":"Kirjoita kuvan osoite (URL)","alt":"Vaihtoehtoinen teksti","border":"Kehys","btnUpload":"Lähetä palvelimelle","button2Img":"Haluatko muuntaa valitun kuvanäppäimen kuvaksi?","hSpace":"Vaakatila","img2Button":"Haluatko muuntaa valitun kuvan kuvanäppäimeksi?","infoTab":"Kuvan tiedot","linkTab":"Linkki","lockRatio":"Lukitse suhteet","menu":"Kuvan ominaisuudet","resetSize":"Alkuperäinen koko","title":"Kuvan ominaisuudet","titleButton":"Kuvapainikkeen ominaisuudet","upload":"Lisää kuva","urlMissing":"Kuvan lähdeosoite puuttuu.","vSpace":"Pystytila","validateBorder":"Kehyksen täytyy olla kokonaisluku.","validateHSpace":"HSpace-määrityksen täytyy olla kokonaisluku.","validateVSpace":"VSpace-määrityksen täytyy olla kokonaisluku."},"indent":{"indent":"Suurenna sisennystä","outdent":"Pienennä sisennystä"},"smiley":{"options":"Hymiön ominaisuudet","title":"Lisää hymiö","toolbar":"Hymiö"},"justify":{"block":"Tasaa molemmat reunat","center":"Keskitä","left":"Tasaa vasemmat reunat","right":"Tasaa oikeat reunat"},"link":{"acccessKey":"Pikanäppäin","advanced":"Lisäominaisuudet","advisoryContentType":"Avustava sisällön tyyppi","advisoryTitle":"Avustava otsikko","anchor":{"toolbar":"Lisää ankkuri/muokkaa ankkuria","menu":"Ankkurin ominaisuudet","title":"Ankkurin ominaisuudet","name":"Nimi","errorName":"Ankkurille on kirjoitettava nimi","remove":"Poista ankkuri"},"anchorId":"Ankkurin ID:n mukaan","anchorName":"Ankkurin nimen mukaan","charset":"Linkitetty kirjaimisto","cssClasses":"Tyyliluokat","emailAddress":"Sähköpostiosoite","emailBody":"Viesti","emailSubject":"Aihe","id":"Tunniste","info":"Linkin tiedot","langCode":"Kielen suunta","langDir":"Kielen suunta","langDirLTR":"Vasemmalta oikealle (LTR)","langDirRTL":"Oikealta vasemmalle (RTL)","menu":"Muokkaa linkkiä","name":"Nimi","noAnchors":"(Ei ankkureita tässä dokumentissa)","noEmail":"Kirjoita sähköpostiosoite","noUrl":"Linkille on kirjoitettava URL","other":"<muu>","popupDependent":"Riippuva (Netscape)","popupFeatures":"Popup ikkunan ominaisuudet","popupFullScreen":"Täysi ikkuna (IE)","popupLeft":"Vasemmalta (px)","popupLocationBar":"Osoiterivi","popupMenuBar":"Valikkorivi","popupResizable":"Venytettävä","popupScrollBars":"Vierityspalkit","popupStatusBar":"Tilarivi","popupToolbar":"Vakiopainikkeet","popupTop":"Ylhäältä (px)","rel":"Suhde","selectAnchor":"Valitse ankkuri","styles":"Tyyli","tabIndex":"Tabulaattori indeksi","target":"Kohde","targetFrame":"<kehys>","targetFrameName":"Kohdekehyksen nimi","targetPopup":"<popup ikkuna>","targetPopupName":"Popup ikkunan nimi","title":"Linkki","toAnchor":"Ankkuri tässä sivussa","toEmail":"Sähköposti","toUrl":"Osoite","toolbar":"Lisää linkki/muokkaa linkkiä","type":"Linkkityyppi","unlink":"Poista linkki","upload":"Lisää tiedosto"},"list":{"bulletedlist":"Luettelomerkit","numberedlist":"Numerointi"},"liststyle":{"armenian":"Armeenialainen numerointi","bulletedTitle":"Numeroimattoman listan ominaisuudet","circle":"Ympyrä","decimal":"Desimaalit (1, 2, 3, jne.)","decimalLeadingZero":"Desimaalit, alussa nolla (01, 02, 03, jne.)","disc":"Levy","georgian":"Georgialainen numerointi (an, ban, gan, etc.)","lowerAlpha":"Pienet aakkoset (a, b, c, d, e, jne.)","lowerGreek":"Pienet kreikkalaiset (alpha, beta, gamma, jne.)","lowerRoman":"Pienet roomalaiset (i, ii, iii, iv, v, jne.)","none":"Ei mikään","notset":"<ei asetettu>","numberedTitle":"Numeroidun listan ominaisuudet","square":"Neliö","start":"Alku","type":"Tyyppi","upperAlpha":"Isot aakkoset (A, B, C, D, E, jne.)","upperRoman":"Isot roomalaiset (I, II, III, IV, V, jne.)","validateStartNumber":"Listan ensimmäisen numeron tulee olla kokonaisluku."},"magicline":{"title":"Lisää kappale tähän."},"maximize":{"maximize":"Suurenna","minimize":"Pienennä"},"newpage":{"toolbar":"Tyhjennä"},"pagebreak":{"alt":"Sivunvaihto","toolbar":"Lisää sivunvaihto"},"pastetext":{"button":"Liitä tekstinä","title":"Liitä tekstinä"},"pastefromword":{"confirmCleanup":"Liittämäsi teksti näyttäisi olevan Word-dokumentista. Haluatko siivota sen ennen liittämistä? (Suositus: Kyllä)","error":"Liitetyn tiedon siivoaminen ei onnistunut sisäisen virheen takia","title":"Liitä Word-dokumentista","toolbar":"Liitä Word-dokumentista"},"preview":{"preview":"Esikatsele"},"print":{"toolbar":"Tulosta"},"removeformat":{"toolbar":"Poista muotoilu"},"save":{"toolbar":"Tallenna"},"selectall":{"toolbar":"Valitse kaikki"},"showblocks":{"toolbar":"Näytä elementit"},"sourcearea":{"toolbar":"Koodi"},"specialchar":{"options":"Erikoismerkin ominaisuudet","title":"Valitse erikoismerkki","toolbar":"Lisää erikoismerkki"},"scayt":{"about":"Tietoja oikoluvusta kirjoitetaessa","aboutTab":"Tietoa","addWord":"Lisää sana","allCaps":"Ohita sanat, jotka on kirjoitettu kokonaan isoilla kirjaimilla","dic_create":"Luo","dic_delete":"Poista","dic_field_name":"Sanakirjan nimi","dic_info":"Oletuksena sanakirjat tallennetaan evästeeseen, mutta evästeiden koko on kuitenkin rajallinen. Sanakirjan kasvaessa niin suureksi, ettei se enää mahdu evästeeseen, sanakirja täytyy tallentaa palvelimellemme. Tallentaaksesi sanakirjasi palvelimellemme tulee sinun antaa sille nimi. Jos olet jo tallentanut sanakirjan, anna sen nimi ja klikkaa Palauta-painiketta","dic_rename":"Nimeä uudelleen","dic_restore":"Palauta","dictionariesTab":"Sanakirjat","disable":"Poista käytöstä oikoluku kirjoitetaessa","emptyDic":"Sanakirjan nimi on annettava.","enable":"Ota käyttöön oikoluku kirjoitettaessa","ignore":"Ohita","ignoreAll":"Ohita kaikki","ignoreDomainNames":"Ohita verkkotunnukset","langs":"Kielet","languagesTab":"Kielet","mixedCase":"Ohita sanat, joissa on sekoitettu isoja ja pieniä kirjaimia","mixedWithDigits":"Ohita sanat, joissa on numeroita","moreSuggestions":"Lisää ehdotuksia","opera_title":"Opera ei tue tätä ominaisuutta","options":"Asetukset","optionsTab":"Asetukset","title":"Oikolue kirjoitettaessa","toggle":"Vaihda oikoluku kirjoittaessa tilaa","noSuggestions":"No suggestion"},"stylescombo":{"label":"Tyyli","panelTitle":"Muotoilujen tyylit","panelTitle1":"Lohkojen tyylit","panelTitle2":"Rivinsisäiset tyylit","panelTitle3":"Objektien tyylit"},"table":{"border":"Rajan paksuus","caption":"Otsikko","cell":{"menu":"Solu","insertBefore":"Lisää solu eteen","insertAfter":"Lisää solu perään","deleteCell":"Poista solut","merge":"Yhdistä solut","mergeRight":"Yhdistä oikealla olevan kanssa","mergeDown":"Yhdistä alla olevan kanssa","splitHorizontal":"Jaa solu vaakasuunnassa","splitVertical":"Jaa solu pystysuunnassa","title":"Solun ominaisuudet","cellType":"Solun tyyppi","rowSpan":"Rivin jatkuvuus","colSpan":"Solun jatkuvuus","wordWrap":"Rivitys","hAlign":"Horisontaali kohdistus","vAlign":"Vertikaali kohdistus","alignBaseline":"Alas (teksti)","bgColor":"Taustan väri","borderColor":"Reunan väri","data":"Data","header":"Ylätunniste","yes":"Kyllä","no":"Ei","invalidWidth":"Solun leveyden täytyy olla numero.","invalidHeight":"Solun korkeuden täytyy olla numero.","invalidRowSpan":"Rivin jatkuvuuden täytyy olla kokonaisluku.","invalidColSpan":"Solun jatkuvuuden täytyy olla kokonaisluku.","chooseColor":"Valitse"},"cellPad":"Solujen sisennys","cellSpace":"Solujen väli","column":{"menu":"Sarake","insertBefore":"Lisää sarake vasemmalle","insertAfter":"Lisää sarake oikealle","deleteColumn":"Poista sarakkeet"},"columns":"Sarakkeet","deleteTable":"Poista taulu","headers":"Ylätunnisteet","headersBoth":"Molemmat","headersColumn":"Ensimmäinen sarake","headersNone":"Ei","headersRow":"Ensimmäinen rivi","invalidBorder":"Reunan koon täytyy olla numero.","invalidCellPadding":"Solujen sisennyksen täytyy olla numero.","invalidCellSpacing":"Solujen välin täytyy olla numero.","invalidCols":"Sarakkeiden määrän täytyy olla suurempi kuin 0.","invalidHeight":"Taulun korkeuden täytyy olla numero.","invalidRows":"Rivien määrän täytyy olla suurempi kuin 0.","invalidWidth":"Taulun leveyden täytyy olla numero.","menu":"Taulun ominaisuudet","row":{"menu":"Rivi","insertBefore":"Lisää rivi yläpuolelle","insertAfter":"Lisää rivi alapuolelle","deleteRow":"Poista rivit"},"rows":"Rivit","summary":"Yhteenveto","title":"Taulun ominaisuudet","toolbar":"Taulu","widthPc":"prosenttia","widthPx":"pikseliä","widthUnit":"leveysyksikkö"},"undo":{"redo":"Toista","undo":"Kumoa"},"wsc":{"btnIgnore":"Jätä huomioimatta","btnIgnoreAll":"Jätä kaikki huomioimatta","btnReplace":"Korvaa","btnReplaceAll":"Korvaa kaikki","btnUndo":"Kumoa","changeTo":"Vaihda","errorLoading":"Virhe ladattaessa oikolukupalvelua isännältä: %s.","ieSpellDownload":"Oikeinkirjoituksen tarkistusta ei ole asennettu. Haluatko ladata sen nyt?","manyChanges":"Tarkistus valmis: %1 sanaa muutettiin","noChanges":"Tarkistus valmis: Yhtään sanaa ei muutettu","noMispell":"Tarkistus valmis: Ei virheitä","noSuggestions":"Ei ehdotuksia","notAvailable":"Valitettavasti oikoluku ei ole käytössä tällä hetkellä.","notInDic":"Ei sanakirjassa","oneChange":"Tarkistus valmis: Yksi sana muutettiin","progress":"Tarkistus käynnissä...","title":"Oikoluku","toolbar":"Tarkista oikeinkirjoitus"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/fo.js b/htmltest/sites/all/libraries/ckeditor-version/lang/fo.js
new file mode 100644
index 00000000..85281dc2
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/fo.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fo']={"editor":"Rich Text Editor","common":{"editorHelp":"Trýst ALT og 0 fyri vegleiðing","browseServer":"Ambætarakagi","url":"URL","protocol":"Protokoll","upload":"Send til ambætaran","uploadSubmit":"Send til ambætaran","image":"Myndir","flash":"Flash","form":"Formur","checkbox":"Flugubein","radio":"Radioknøttur","textField":"Tekstteigur","textarea":"Tekstumráði","hiddenField":"Fjaldur teigur","button":"Knøttur","select":"Valskrá","imageButton":"Myndaknøttur","notSet":"<ikki sett>","id":"Id","name":"Navn","langDir":"Tekstkós","langDirLtr":"Frá vinstru til høgru (LTR)","langDirRtl":"Frá høgru til vinstru (RTL)","langCode":"Málkoda","longDescr":"Víðkað URL frágreiðing","cssClass":"Typografi klassar","advisoryTitle":"Vegleiðandi heiti","cssStyle":"Typografi","ok":"Góðkent","cancel":"Avlýst","close":"Lat aftur","preview":"Frumsýn","resize":"Drag fyri at broyta stødd","generalTab":"Generelt","advancedTab":"Fjølbroytt","validateNumberFailed":"Hetta er ikki eitt tal.","confirmNewPage":"Allar ikki goymdar broytingar í hesum innihaldið hvørva. Skal nýggj síða lesast kortini?","confirmCancel":"Nakrir valmøguleikar eru broyttir. Ert tú vísur í, at dialogurin skal latast aftur?","options":"Options","target":"Target","targetNew":"Nýtt vindeyga (_blank)","targetTop":"Vindeyga ovast (_top)","targetSelf":"Sama vindeyga (_self)","targetParent":"Upphavligt vindeyga (_parent)","langDirLTR":"Frá vinstru til høgru (LTR)","langDirRTL":"Frá høgru til vinstru (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Breidd","height":"Hædd","align":"Justering","alignLeft":"Vinstra","alignRight":"Høgra","alignCenter":"Miðsett","alignTop":"Ovast","alignMiddle":"Miðja","alignBottom":"Botnur","invalidValue":"Invalid value.","invalidHeight":"Hædd má vera eitt tal.","invalidWidth":"Breidd má vera eitt tal.","invalidCssLength":"Virðið sett í \"%1\" feltið má vera eitt positivt tal, við ella uttan gyldugum CSS mátieind (px, %, in, cm, mm, em, ex, pt, ella pc).","invalidHtmlLength":"Virðið sett í \"%1\" feltiðield má vera eitt positivt tal, við ella uttan gyldugum CSS mátieind (px ella %).","invalidInlineStyle":"Virði specifiserað fyri inline style má hava eitt ella fleiri pør (tuples) skrivað sum \"name : value\", hvørt parið sundurskilt við semi-colon.","cssLengthTooltip":"Skriva eitt tal fyri eitt virði í pixels ella eitt tal við gyldigum CSS eind (px, %, in, cm, mm, em, ex, pt, ella pc).","unavailable":"%1<span class=\"cke_accessibility\">, ikki tøkt</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"Um CKEditor","help":"Kekka $1 fyri hjálp.","moreInfo":"Licens upplýsingar finnast á heimasíðu okkara:","title":"Um CKEditor","userGuide":"CKEditor Brúkaravegleiðing"},"basicstyles":{"bold":"Feit skrift","italic":"Skráskrift","strike":"Yvirstrikað","subscript":"Lækkað skrift","superscript":"Hækkað skrift","underline":"Undirstrikað"},"bidi":{"ltr":"Tekstkós frá vinstru til høgru","rtl":"Tekstkós frá høgru til vinstru"},"blockquote":{"toolbar":"Blockquote"},"clipboard":{"copy":"Avrita","copyError":"Trygdaruppseting alnótskagans forðar tekstviðgeranum í at avrita tekstin. Vinarliga nýt knappaborðið til at avrita tekstin (Ctrl/Cmd+C).","cut":"Kvett","cutError":"Trygdaruppseting alnótskagans forðar tekstviðgeranum í at kvetta tekstin. Vinarliga nýt knappaborðið til at kvetta tekstin (Ctrl/Cmd+X).","paste":"Innrita","pasteArea":"Avritingarumráði","pasteMsg":"Vinarliga koyr tekstin í hendan rútin við knappaborðinum (<strong>Ctrl/Cmd+V</strong>) og klikk á <strong>Góðtak</strong>.","securityMsg":"Trygdaruppseting alnótskagans forðar tekstviðgeranum í beinleiðis atgongd til avritingarminnið. Tygum mugu royna aftur í hesum rútinum.","title":"Innrita"},"colorbutton":{"auto":"Automatiskt","bgColorTitle":"Bakgrundslitur","colors":{"000":"Svart","800000":"Maroon","8B4513":"Saðilsbrúnt","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Myrkagrátt","B22222":"Fire Brick","A52A2A":"Brúnt","DAA520":"Gullstavur","006400":"Myrkagrønt","40E0D0":"Turquoise","0000CD":"Meðal blátt","800080":"Purple","808080":"Grátt","F00":"Reytt","FF8C00":"Myrkt appelsingult","FFD700":"Gull","008000":"Grønt","0FF":"Cyan","00F":"Blátt","EE82EE":"Violet","A9A9A9":"Døkt grátt","FFA07A":"Ljósur laksur","FFA500":"Appelsingult","FFFF00":"Gult","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Ljósablátt","DDA0DD":"Plum","D3D3D3":"Ljósagrátt","FFF0F5":"Lavender Blush","FAEBD7":"Klassiskt hvítt","FFFFE0":"Ljósagult","F0FFF0":"Hunangsdøggur","F0FFFF":"Azure","F0F8FF":"Alice Blátt","E6E6FA":"Lavender","FFF":"Hvítt"},"more":"Fleiri litir...","panelTitle":"Litir","textColorTitle":"Tekstlitur"},"colordialog":{"clear":"Strika","highlight":"Framheva","options":"Litmøguleikar","selected":"Valdur litur","title":"Vel lit"},"templates":{"button":"Skabelónir","emptyListMsg":"(Ongar skabelónir tøkar)","insertOption":"Yvirskriva núverandi innihald","options":"Møguleikar fyri Template","selectPromptMsg":"Vinarliga vel ta skabelón, ið skal opnast í tekstviðgeranum<br>(Hetta yvirskrivar núverandi innihald):","title":"Innihaldsskabelónir"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Redigera Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Vinstru til høgru (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Høgru til vinstru (RTL)","languageCodeInputLabel":" Language Code","remove":"Strika Div","styleSelectLabel":"Style","title":"Ger Div Container","toolbar":"Ger Div Container"},"toolbar":{"toolbarCollapse":"Lat Toolbar aftur","toolbarExpand":"Vís Toolbar","toolbarGroups":{"document":"Dokument","clipboard":"Clipboard/Undo","editing":"Editering","forms":"Formar","basicstyles":"Grundleggjandi Styles","paragraph":"Reglubrot","links":"Leinkjur","insert":"Set inn","styles":"Styles","colors":"Litir","tools":"Tól"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Slóð til elementir","eleTitle":"%1 element"},"find":{"find":"Leita","findOptions":"Finn møguleikar","findWhat":"Finn:","matchCase":"Munur á stórum og smáum bókstavum","matchCyclic":"Match cyclic","matchWord":"Bert heil orð","notFoundMsg":"Leititeksturin varð ikki funnin","replace":"Yvirskriva","replaceAll":"Yvirskriva alt","replaceSuccessMsg":"%1 úrslit broytt.","replaceWith":"Yvirskriva við:","title":"Finn og broyt"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Fjaldur teigur","iframe":"IFrame","unknown":"Ókent Object"},"flash":{"access":"Script atgongd","accessAlways":"Altíð","accessNever":"Ongantíð","accessSameDomain":"Sama navnaøki","alignAbsBottom":"Abs botnur","alignAbsMiddle":"Abs miðja","alignBaseline":"Basislinja","alignTextTop":"Tekst toppur","bgcolor":"Bakgrundslitur","chkFull":"Loyv fullan skerm","chkLoop":"Endurspæl","chkMenu":"Ger Flash skrá virkna","chkPlay":"Avspælingin byrjar sjálv","flashvars":"Variablar fyri Flash","hSpace":"Høgri breddi","properties":"Flash eginleikar","propertiesTab":"Eginleikar","quality":"Góðska","qualityAutoHigh":"Auto høg","qualityAutoLow":"Auto Lág","qualityBest":"Besta","qualityHigh":"Høg","qualityLow":"Lág","qualityMedium":"Meðal","scale":"Skalering","scaleAll":"Vís alt","scaleFit":"Neyv skalering","scaleNoBorder":"Eingin bordi","title":"Flash eginleikar","vSpace":"Vinstri breddi","validateHSpace":"HSpace má vera eitt tal.","validateSrc":"Vinarliga skriva tilknýti (URL)","validateVSpace":"VSpace má vera eitt tal.","windowMode":"Slag av rúti","windowModeOpaque":"Ikki transparent","windowModeTransparent":"Transparent","windowModeWindow":"Rútur"},"font":{"fontSize":{"label":"Skriftstødd","voiceLabel":"Skriftstødd","panelTitle":"Skriftstødd"},"label":"Skrift","panelTitle":"Skrift","voiceLabel":"Skrift"},"forms":{"button":{"title":"Eginleikar fyri knøtt","text":"Tekstur","type":"Slag","typeBtn":"Knøttur","typeSbm":"Send","typeRst":"Nullstilla"},"checkboxAndRadio":{"checkboxTitle":"Eginleikar fyri flugubein","radioTitle":"Eginleikar fyri radioknøtt","value":"Virði","selected":"Valt"},"form":{"title":"Eginleikar fyri Form","menu":"Eginleikar fyri Form","action":"Hending","method":"Háttur","encoding":"Encoding"},"hidden":{"title":"Eginleikar fyri fjaldan teig","name":"Navn","value":"Virði"},"select":{"title":"Eginleikar fyri valskrá","selectInfo":"Upplýsingar","opAvail":"Tøkir møguleikar","value":"Virði","size":"Stødd","lines":"Linjur","chkMulti":"Loyv fleiri valmøguleikum samstundis","opText":"Tekstur","opValue":"Virði","btnAdd":"Legg afturat","btnModify":"Broyt","btnUp":"Upp","btnDown":"Niður","btnSetValue":"Set sum valt virði","btnDelete":"Strika"},"textarea":{"title":"Eginleikar fyri tekstumráði","cols":"kolonnur","rows":"røðir"},"textfield":{"title":"Eginleikar fyri tekstteig","name":"Navn","value":"Virði","charWidth":"Breidd (sjónlig tekn)","maxChars":"Mest loyvdu tekn","type":"Slag","typeText":"Tekstur","typePass":"Loyniorð","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"Skriftsnið","panelTitle":"Skriftsnið","tag_address":"Adressa","tag_div":"Vanligt (DIV)","tag_h1":"Yvirskrift 1","tag_h2":"Yvirskrift 2","tag_h3":"Yvirskrift 3","tag_h4":"Yvirskrift 4","tag_h5":"Yvirskrift 5","tag_h6":"Yvirskrift 6","tag_p":"Vanligt","tag_pre":"Sniðgivið"},"horizontalrule":{"toolbar":"Ger vatnrætta linju"},"iframe":{"border":"Vís frame kant","noUrl":"Vinarliga skriva URL til iframe","scrolling":"Loyv scrollbars","title":"Møguleikar fyri IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Rita slóðina til myndina","alt":"Alternativur tekstur","border":"Bordi","btnUpload":"Send til ambætaran","button2Img":"Skal valdi myndaknøttur gerast til vanliga mynd?","hSpace":"Høgri breddi","img2Button":"Skal valda mynd gerast til myndaknøtt?","infoTab":"Myndaupplýsingar","linkTab":"Tilknýti","lockRatio":"Læs lutfallið","menu":"Myndaeginleikar","resetSize":"Upprunastødd","title":"Myndaeginleikar","titleButton":"Eginleikar fyri myndaknøtt","upload":"Send","urlMissing":"URL til mynd manglar.","vSpace":"Vinstri breddi","validateBorder":"Bordi má vera eitt heiltal.","validateHSpace":"HSpace má vera eitt heiltal.","validateVSpace":"VSpace má vera eitt heiltal."},"indent":{"indent":"Økja reglubrotarinntriv","outdent":"Minka reglubrotarinntriv"},"smiley":{"options":"Møguleikar fyri Smiley","title":"Vel Smiley","toolbar":"Smiley"},"justify":{"block":"Javnir tekstkantar","center":"Miðsett","left":"Vinstrasett","right":"Høgrasett"},"link":{"acccessKey":"Snarvegisknöttur","advanced":"Fjølbroytt","advisoryContentType":"Vegleiðandi innihaldsslag","advisoryTitle":"Vegleiðandi heiti","anchor":{"toolbar":"Ger/broyt marknastein","menu":"Eginleikar fyri marknastein","title":"Eginleikar fyri marknastein","name":"Heiti marknasteinsins","errorName":"Vinarliga rita marknasteinsins heiti","remove":"Strika marknastein"},"anchorId":"Eftir element Id","anchorName":"Eftir navni á marknasteini","charset":"Atknýtt teknsett","cssClasses":"Typografi klassar","emailAddress":"Teldupost-adressa","emailBody":"Breyðtekstur","emailSubject":"Evni","id":"Id","info":"Tilknýtis upplýsingar","langCode":"Tekstkós","langDir":"Tekstkós","langDirLTR":"Frá vinstru til høgru (LTR)","langDirRTL":"Frá høgru til vinstru (RTL)","menu":"Broyt tilknýti","name":"Navn","noAnchors":"(Eingir marknasteinar eru í hesum dokumentið)","noEmail":"Vinarliga skriva teldupost-adressu","noUrl":"Vinarliga skriva tilknýti (URL)","other":"<annað>","popupDependent":"Bundið (Netscape)","popupFeatures":"Popup vindeygans víðkaðu eginleikar","popupFullScreen":"Fullur skermur (IE)","popupLeft":"Frástøða frá vinstru","popupLocationBar":"Adressulinja","popupMenuBar":"Skrábjálki","popupResizable":"Stødd kann broytast","popupScrollBars":"Rullibjálki","popupStatusBar":"Støðufrágreiðingarbjálki","popupToolbar":"Amboðsbjálki","popupTop":"Frástøða frá íerva","rel":"Relatión","selectAnchor":"Vel ein marknastein","styles":"Typografi","tabIndex":"Tabulator indeks","target":"Target","targetFrame":"<ramma>","targetFrameName":"Vís navn vindeygans","targetPopup":"<popup vindeyga>","targetPopupName":"Popup vindeygans navn","title":"Tilknýti","toAnchor":"Tilknýti til marknastein í tekstinum","toEmail":"Teldupostur","toUrl":"URL","toolbar":"Ger/broyt tilknýti","type":"Tilknýtisslag","unlink":"Strika tilknýti","upload":"Send til ambætaran"},"list":{"bulletedlist":"Punktmerktur listi","numberedlist":"Talmerktur listi"},"liststyle":{"armenian":"Armensk talskipan","bulletedTitle":"Eginleikar fyri lista við prikkum","circle":"Sirkul","decimal":"Vanlig tøl (1, 2, 3, etc.)","decimalLeadingZero":"Tøl við null frammanfyri (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgisk talskipan (an, ban, gan, osv.)","lowerAlpha":"Lítlir bókstavir (a, b, c, d, e, etc.)","lowerGreek":"Grikskt við lítlum (alpha, beta, gamma, etc.)","lowerRoman":"Lítil rómaratøl (i, ii, iii, iv, v, etc.)","none":"Einki","notset":"<ikki sett>","numberedTitle":"Eginleikar fyri lista við tølum","square":"Fýrkantur","start":"Byrjan","type":"Slag","upperAlpha":"Stórir bókstavir (A, B, C, D, E, etc.)","upperRoman":"Stór rómaratøl (I, II, III, IV, V, etc.)","validateStartNumber":"Byrjunartalið fyri lista má vera eitt heiltal."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maksimera","minimize":"Minimera"},"newpage":{"toolbar":"Nýggj síða"},"pagebreak":{"alt":"Síðuskift","toolbar":"Ger síðuskift"},"pastetext":{"button":"Innrita som reinan tekst","title":"Innrita som reinan tekst"},"pastefromword":{"confirmCleanup":"Teksturin, tú roynir at seta inn, sýnist at stava frá Word. Skal teksturin reinsast fyrst?","error":"Tað eydnaðist ikki at reinsa tekstin vegna ein internan feil","title":"Innrita frá Word","toolbar":"Innrita frá Word"},"preview":{"preview":"Frumsýning"},"print":{"toolbar":"Prenta"},"removeformat":{"toolbar":"Strika sniðgeving"},"save":{"toolbar":"Goym"},"selectall":{"toolbar":"Markera alt"},"showblocks":{"toolbar":"Vís blokkar"},"sourcearea":{"toolbar":"Kelda"},"specialchar":{"options":"Møguleikar við serteknum","title":"Vel sertekn","toolbar":"Set inn sertekn"},"scayt":{"about":"Um SCAYT","aboutTab":"Um","addWord":"Legg orð afturat","allCaps":"Loyp orð við bert stórum stavum um","dic_create":"Upprætta nýggja","dic_delete":"Strika","dic_field_name":"Orðabókanavn","dic_info":"Upprunaliga er brúkara-orðabókin goymd í eini cookie í tínum egna kaga. Men hesar cookies eru avmarkaðar í stødd. Tá brúkara-orðabókin veksur seg ov stóra til eina cookie, so er møguligt at goyma hana á ambætara okkara. Fyri at goyma persónligu orðabókina á ambætaranum eigur tú at velja eitt navn til tína skuffu. Hevur tú longu goymt eina orðabók, so vinarliga skriva navnið og klikk á knøttin Endurskapa.","dic_rename":"Broyt","dic_restore":"Endurskapa","dictionariesTab":"Orðabøkur","disable":"Nokta SCAYT","emptyDic":"Heiti á orðabók eigur ikki at vera tómt.","enable":"Loyv SCAYT","ignore":"Ignorera","ignoreAll":"Ignorera alt","ignoreDomainNames":"loyp økisnøvn um","langs":"Tungumál","languagesTab":"Tungumál","mixedCase":"Loyp orð við blandaðum smáum og stórum stavum um","mixedWithDigits":"Loyp orð við tølum um","moreSuggestions":"Fleiri tilráðingar","opera_title":"Ikki stuðlað í Opera","options":"Uppseting","optionsTab":"Uppseting","title":"Kanna stavseting, meðan tú skrivar","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Typografi","panelTitle":"Formatterings stílir","panelTitle1":"Blokk stílir","panelTitle2":"Inline stílir","panelTitle3":"Object stílir"},"table":{"border":"Bordabreidd","caption":"Tabellfrágreiðing","cell":{"menu":"Meski","insertBefore":"Set meska inn áðrenn","insertAfter":"Set meska inn aftaná","deleteCell":"Strika meskar","merge":"Flætta meskar","mergeRight":"Flætta meskar til høgru","mergeDown":"Flætta saman","splitHorizontal":"Kloyv meska vatnrætt","splitVertical":"Kloyv meska loddrætt","title":"Mesku eginleikar","cellType":"Mesku slag","rowSpan":"Ræð spenni","colSpan":"Kolonnu spenni","wordWrap":"Orðkloyving","hAlign":"Horisontal plasering","vAlign":"Loddrøtt plasering","alignBaseline":"Basislinja","bgColor":"Bakgrundslitur","borderColor":"Bordalitur","data":"Data","header":"Header","yes":"Ja","no":"Nei","invalidWidth":"Meskubreidd má vera eitt tal.","invalidHeight":"Meskuhædd má vera eitt tal.","invalidRowSpan":"Raðspennið má vera eitt heiltal.","invalidColSpan":"Kolonnuspennið má vera eitt heiltal.","chooseColor":"Vel"},"cellPad":"Meskubreddi","cellSpace":"Fjarstøða millum meskar","column":{"menu":"Kolonna","insertBefore":"Set kolonnu inn áðrenn","insertAfter":"Set kolonnu inn aftaná","deleteColumn":"Strika kolonnur"},"columns":"Kolonnur","deleteTable":"Strika tabell","headers":"Yvirskriftir","headersBoth":"Báðir","headersColumn":"Fyrsta kolonna","headersNone":"Eingin","headersRow":"Fyrsta rað","invalidBorder":"Borda-stødd má vera eitt tal.","invalidCellPadding":"Cell padding má vera eitt tal.","invalidCellSpacing":"Cell spacing má vera eitt tal.","invalidCols":"Talið av kolonnum má vera eitt tal størri enn 0.","invalidHeight":"Tabell-hædd má vera eitt tal.","invalidRows":"Talið av røðum má vera eitt tal størri enn 0.","invalidWidth":"Tabell-breidd má vera eitt tal.","menu":"Eginleikar fyri tabell","row":{"menu":"Rað","insertBefore":"Set rað inn áðrenn","insertAfter":"Set rað inn aftaná","deleteRow":"Strika røðir"},"rows":"Røðir","summary":"Samandráttur","title":"Eginleikar fyri tabell","toolbar":"Tabell","widthPc":"prosent","widthPx":"pixels","widthUnit":"breiddar unit"},"undo":{"redo":"Vend aftur","undo":"Angra"},"wsc":{"btnIgnore":"Forfjóna","btnIgnoreAll":"Forfjóna alt","btnReplace":"Yvirskriva","btnReplaceAll":"Yvirskriva alt","btnUndo":"Angra","changeTo":"Broyt til","errorLoading":"Feilur við innlesing av application service host: %s.","ieSpellDownload":"Rættstavarin er ikki tøkur í tekstviðgeranum. Vilt tú heinta hann nú?","manyChanges":"Rættstavarin liðugur: %1 orð broytt","noChanges":"Rættstavarin liðugur: Einki orð varð broytt","noMispell":"Rættstavarin liðugur: Eingin feilur funnin","noSuggestions":"- Einki uppskot -","notAvailable":"Tíverri, ikki tøkt í løtuni.","notInDic":"Finst ikki í orðabókini","oneChange":"Rættstavarin liðugur: Eitt orð er broytt","progress":"Rættstavarin arbeiðir...","title":"Kanna stavseting","toolbar":"Kanna stavseting"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/fr-ca.js b/htmltest/sites/all/libraries/ckeditor-version/lang/fr-ca.js
new file mode 100644
index 00000000..265b745d
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/fr-ca.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fr-ca']={"editor":"Éditeur de texte enrichi","common":{"editorHelp":"Appuyez sur 0 pour de l'aide","browseServer":"Parcourir le serveur","url":"URL","protocol":"Protocole","upload":"Envoyer","uploadSubmit":"Envoyer au serveur","image":"Image","flash":"Animation Flash","form":"Formulaire","checkbox":"Case à cocher","radio":"Bouton radio","textField":"Champ texte","textarea":"Zone de texte","hiddenField":"Champ caché","button":"Bouton","select":"Liste déroulante","imageButton":"Bouton image","notSet":"<Par défaut>","id":"Id","name":"Nom","langDir":"Sens d'écriture","langDirLtr":"De gauche à droite (LTR)","langDirRtl":"De droite à gauche (RTL)","langCode":"Code langue","longDescr":"URL de description longue","cssClass":"Classes CSS","advisoryTitle":"Titre","cssStyle":"Style","ok":"OK","cancel":"Annuler","close":"Fermer","preview":"Aperçu","resize":"Redimensionner","generalTab":"Général","advancedTab":"Avancé","validateNumberFailed":"Cette valeur n'est pas un nombre.","confirmNewPage":"Les changements non sauvegardés seront perdus. Êtes-vous certain de vouloir charger une nouvelle page?","confirmCancel":"Certaines options ont été modifiées.  Êtes-vous certain de vouloir fermer?","options":"Options","target":"Cible","targetNew":"Nouvelle fenêtre (_blank)","targetTop":"Fenêtre supérieur (_top)","targetSelf":"Cette fenêtre (_self)","targetParent":"Fenêtre parent (_parent)","langDirLTR":"De gauche à droite (LTR)","langDirRTL":"De droite à gauche (RTL)","styles":"Style","cssClasses":"Classe CSS","width":"Largeur","height":"Hauteur","align":"Alignement","alignLeft":"Gauche","alignRight":"Droite","alignCenter":"Centré","alignTop":"Haut","alignMiddle":"Milieu","alignBottom":"Bas","invalidValue":"Valeur invalide.","invalidHeight":"La hauteur doit être un nombre.","invalidWidth":"La largeur doit être un nombre.","invalidCssLength":"La valeur spécifiée pour le champ \"%1\" doit être un nombre positif avec ou sans unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","invalidHtmlLength":"La valeur spécifiée pour le champ \"%1\" doit être un nombre positif avec ou sans unité de mesure HTML valide (px ou %).","invalidInlineStyle":"La valeur spécifiée pour le style intégré doit être composée d'un ou plusieurs couples de valeur au format \"nom : valeur\", separés par des points-virgules.","cssLengthTooltip":"Entrer un nombre pour la valeur en pixel ou un nombre avec une unité CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, indisponible</span>"},"about":{"copy":"Copyright &copy; $1. Tous droits réservés.","dlgTitle":"À propos de CKEditor","help":"Consulter $1 pour l'aide.","moreInfo":"Pour les informations de licence, consulter notre site internet:","title":"À propos de CKEditor","userGuide":"Guide utilisateur de CKEditor"},"basicstyles":{"bold":"Gras","italic":"Italique","strike":"Barré","subscript":"Indice","superscript":"Exposant","underline":"Souligné"},"bidi":{"ltr":"Direction du texte de gauche à droite","rtl":"Direction du texte de droite à gauche"},"blockquote":{"toolbar":"Citation"},"clipboard":{"copy":"Copier","copyError":"Les paramètres de sécurité de votre navigateur empêchent l'éditeur de copier automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+C).","cut":"Couper","cutError":"Les paramètres de sécurité de votre navigateur empêchent l'éditeur de couper automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+X).","paste":"Coller","pasteArea":"Coller la zone","pasteMsg":"Veuillez coller dans la zone ci-dessous en utilisant le clavier (<STRONG>Ctrl/Cmd+V</STRONG>) et appuyer sur <STRONG>OK</STRONG>.","securityMsg":"A cause des paramètres de sécurité de votre navigateur, l'éditeur ne peut accéder au presse-papier directement. Vous devez coller à nouveau le contenu dans cette fenêtre.","title":"Coller"},"colorbutton":{"auto":"Automatique","bgColorTitle":"Couleur de fond","colors":{"000":"Noir","800000":"Marron","8B4513":"Brun foncé","2F4F4F":"Gris ardoise foncé","008080":"Sarcelle","000080":"Marine","4B0082":"Indigo","696969":"Gris foncé","B22222":"Rouge brique","A52A2A":"Brun","DAA520":"Doré","006400":"Vert foncé","40E0D0":"Turquoise","0000CD":"Bleu","800080":"Mauve","808080":"Gris","F00":"Rouge","FF8C00":"Orange foncé","FFD700":"Or","008000":"Vert","0FF":"Cyan","00F":"Bleu","EE82EE":"Violet","A9A9A9":"Gris pâle","FFA07A":"Saumon clair","FFA500":"Orange","FFFF00":"Jaune","00FF00":"Vert lime","AFEEEE":"Turquoise pâle","ADD8E6":"Bleu pâle","DDA0DD":"Prune","D3D3D3":"Gris pâle","FFF0F5":"Bleu lavande","FAEBD7":"Blanc antique","FFFFE0":"Jaune pâle","F0FFF0":"Miel doré","F0FFFF":"Azure","F0F8FF":"Bleu alice","E6E6FA":"Lavande","FFF":"Blanc"},"more":"Plus de couleurs...","panelTitle":"Couleurs","textColorTitle":"Couleur de texte"},"colordialog":{"clear":"Effacer","highlight":"Surligner","options":"Options de couleur","selected":"Couleur sélectionnée","title":"Choisir une couleur"},"templates":{"button":"Modèles","emptyListMsg":"(Aucun modèle disponible)","insertOption":"Remplacer tout le contenu actuel","options":"Options de modèles","selectPromptMsg":"Sélectionner le modèle à ouvrir dans l'éditeur","title":"Modèles de contenu"},"contextmenu":{"options":"Options du menu contextuel"},"div":{"IdInputLabel":"ID","advisoryTitleInputLabel":"Titre","cssClassInputLabel":"Classes CSS","edit":"Modifier le DIV","inlineStyleInputLabel":"Style en ligne","langDirLTRLabel":"De gauche à droite (LTR)","langDirLabel":"Sens d'écriture","langDirRTLLabel":"De droite à gauche (RTL)","languageCodeInputLabel":"Code de langue","remove":"Supprimer le DIV","styleSelectLabel":"Style","title":"Créer un DIV","toolbar":"Créer un DIV"},"toolbar":{"toolbarCollapse":"Enrouler la barre d'outils","toolbarExpand":"Dérouler la barre d'outils","toolbarGroups":{"document":"Document","clipboard":"Presse papier/Annuler","editing":"Édition","forms":"Formulaires","basicstyles":"Styles de base","paragraph":"Paragraphe","links":"Liens","insert":"Insérer","styles":"Styles","colors":"Couleurs","tools":"Outils"},"toolbars":"Barre d'outils de l'éditeur"},"elementspath":{"eleLabel":"Chemin d'éléments","eleTitle":"element %1"},"find":{"find":"Rechercher","findOptions":"Options de recherche","findWhat":"Rechercher:","matchCase":"Respecter la casse","matchCyclic":"Recherche cyclique","matchWord":"Mot entier","notFoundMsg":"Le texte indiqué est introuvable.","replace":"Remplacer","replaceAll":"Tout remplacer","replaceSuccessMsg":"%1 remplacements.","replaceWith":"Remplacer par:","title":"Rechercher et remplacer"},"fakeobjects":{"anchor":"Ancre","flash":"Animation Flash","hiddenfield":"Champ caché","iframe":"IFrame","unknown":"Objet inconnu"},"flash":{"access":"Accès au script","accessAlways":"Toujours","accessNever":"Jamais","accessSameDomain":"Même domaine","alignAbsBottom":"Bas absolu","alignAbsMiddle":"Milieu absolu","alignBaseline":"Bas du texte","alignTextTop":"Haut du texte","bgcolor":"Couleur de fond","chkFull":"Permettre le plein-écran","chkLoop":"Boucle","chkMenu":"Activer le menu Flash","chkPlay":"Lecture automatique","flashvars":"Variables pour Flash","hSpace":"Espacement horizontal","properties":"Propriétés de l'animation Flash","propertiesTab":"Propriétés","quality":"Qualité","qualityAutoHigh":"Haute auto","qualityAutoLow":"Basse auto","qualityBest":"Meilleur","qualityHigh":"Haute","qualityLow":"Basse","qualityMedium":"Moyenne","scale":"Échelle","scaleAll":"Afficher tout","scaleFit":"Ajuster aux dimensions","scaleNoBorder":"Sans bordure","title":"Propriétés de l'animation Flash","vSpace":"Espacement vertical","validateHSpace":"L'espacement horizontal doit être un entier.","validateSrc":"Veuillez saisir l'URL","validateVSpace":"L'espacement vertical doit être un entier.","windowMode":"Mode de fenêtre","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Fenêtre"},"font":{"fontSize":{"label":"Taille","voiceLabel":"Taille","panelTitle":"Taille"},"label":"Police","panelTitle":"Police","voiceLabel":"Police"},"forms":{"button":{"title":"Propriétés du bouton","text":"Texte (Valeur)","type":"Type","typeBtn":"Bouton","typeSbm":"Soumettre","typeRst":"Réinitialiser"},"checkboxAndRadio":{"checkboxTitle":"Propriétés de la case à cocher","radioTitle":"Propriétés du bouton radio","value":"Valeur","selected":"Sélectionné"},"form":{"title":"Propriétés du formulaire","menu":"Propriétés du formulaire","action":"Action","method":"Méthode","encoding":"Encodage"},"hidden":{"title":"Propriétés du champ caché","name":"Nom","value":"Valeur"},"select":{"title":"Propriétés du champ de sélection","selectInfo":"Info","opAvail":"Options disponibles","value":"Valeur","size":"Taille","lines":"lignes","chkMulti":"Permettre les sélections multiples","opText":"Texte","opValue":"Valeur","btnAdd":"Ajouter","btnModify":"Modifier","btnUp":"Monter","btnDown":"Descendre","btnSetValue":"Valeur sélectionnée","btnDelete":"Supprimer"},"textarea":{"title":"Propriétés de la zone de texte","cols":"Colonnes","rows":"Lignes"},"textfield":{"title":"Propriétés du champ texte","name":"Nom","value":"Valeur","charWidth":"Largeur de caractères","maxChars":"Nombre maximum de caractères","type":"Type","typeText":"Texte","typePass":"Mot de passe","typeEmail":"Courriel","typeSearch":"Recherche","typeTel":"Numéro de téléphone","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Format de paragraphe","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"En-tête 1","tag_h2":"En-tête 2","tag_h3":"En-tête 3","tag_h4":"En-tête 4","tag_h5":"En-tête 5","tag_h6":"En-tête 6","tag_p":"Normal","tag_pre":"Formaté"},"horizontalrule":{"toolbar":"Insérer un séparateur horizontale"},"iframe":{"border":"Afficher la bordure du cadre","noUrl":"Veuillez entre l'URL du IFrame","scrolling":"Activer les barres de défilement","title":"Propriétés du IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Veuillez saisir l'URL de l'image","alt":"Texte alternatif","border":"Bordure","btnUpload":"Envoyer sur le serveur","button2Img":"Désirez-vous transformer l'image sélectionnée en image simple?","hSpace":"Espacement horizontal","img2Button":"Désirez-vous transformer l'image sélectionnée en bouton image?","infoTab":"Informations sur l'image","linkTab":"Lien","lockRatio":"Verrouiller les proportions","menu":"Propriétés de l'image","resetSize":"Taille originale","title":"Propriétés de l'image","titleButton":"Propriétés du bouton image","upload":"Téléverser","urlMissing":"L'URL de la source de l'image est manquant.","vSpace":"Espacement vertical","validateBorder":"La bordure doit être un entier.","validateHSpace":"L'espacement horizontal doit être un entier.","validateVSpace":"L'espacement vertical doit être un entier."},"indent":{"indent":"Augmenter le retrait","outdent":"Diminuer le retrait"},"smiley":{"options":"Options d'émoticônes","title":"Insérer un émoticône","toolbar":"Émoticône"},"justify":{"block":"Justifié","center":"Centré","left":"Aligner à gauche","right":"Aligner à Droite"},"link":{"acccessKey":"Touche d'accessibilité","advanced":"Avancé","advisoryContentType":"Type de contenu","advisoryTitle":"Description","anchor":{"toolbar":"Ancre","menu":"Modifier l'ancre","title":"Propriétés de l'ancre","name":"Nom de l'ancre","errorName":"Veuillez saisir le nom de l'ancre","remove":"Supprimer l'ancre"},"anchorId":"Par ID","anchorName":"Par nom","charset":"Encodage de la cible","cssClasses":"Classes CSS","emailAddress":"Courriel","emailBody":"Corps du message","emailSubject":"Objet du message","id":"ID","info":"Informations sur le lien","langCode":"Code de langue","langDir":"Sens d'écriture","langDirLTR":"De gauche à droite (LTR)","langDirRTL":"De droite à gauche (RTL)","menu":"Modifier le lien","name":"Nom","noAnchors":"(Pas d'ancre disponible dans le document)","noEmail":"Veuillez saisir le courriel","noUrl":"Veuillez saisir l'URL","other":"<autre>","popupDependent":"Dépendante (Netscape)","popupFeatures":"Caractéristiques de la fenêtre popup","popupFullScreen":"Plein écran (IE)","popupLeft":"Position de la gauche","popupLocationBar":"Barre d'adresse","popupMenuBar":"Barre de menu","popupResizable":"Redimensionnable","popupScrollBars":"Barres de défilement","popupStatusBar":"Barre d'état","popupToolbar":"Barre d'outils","popupTop":"Position à partir du haut","rel":"Relation","selectAnchor":"Sélectionner une ancre","styles":"Style","tabIndex":"Ordre de tabulation","target":"Destination","targetFrame":"<Cadre>","targetFrameName":"Nom du cadre de destination","targetPopup":"<fenêtre popup>","targetPopupName":"Nom de la fenêtre popup","title":"Lien","toAnchor":"Ancre dans cette page","toEmail":"Courriel","toUrl":"URL","toolbar":"Lien","type":"Type de lien","unlink":"Supprimer le lien","upload":"Téléverser"},"list":{"bulletedlist":"Liste à puces","numberedlist":"Liste numérotée"},"liststyle":{"armenian":"Numération arménienne","bulletedTitle":"Propriété de liste à puce","circle":"Cercle","decimal":"Décimal (1, 2, 3, etc.)","decimalLeadingZero":"Décimal avec zéro (01, 02, 03, etc.)","disc":"Disque","georgian":"Numération géorgienne (an, ban, gan, etc.)","lowerAlpha":"Alphabétique minuscule (a, b, c, d, e, etc.)","lowerGreek":"Grecque minuscule (alpha, beta, gamma, etc.)","lowerRoman":"Romain minuscule (i, ii, iii, iv, v, etc.)","none":"Aucun","notset":"<non défini>","numberedTitle":"Propriété de la liste numérotée","square":"Carré","start":"Début","type":"Type","upperAlpha":"Alphabétique majuscule (A, B, C, D, E, etc.)","upperRoman":"Romain Majuscule (I, II, III, IV, V, etc.)","validateStartNumber":"Le numéro de début de liste doit être un entier."},"magicline":{"title":"Insérer le paragraphe ici"},"maximize":{"maximize":"Maximizer","minimize":"Minimizer"},"newpage":{"toolbar":"Nouvelle page"},"pagebreak":{"alt":"Saut de page","toolbar":"Insérer un saut de page à l'impression"},"pastetext":{"button":"Coller comme texte","title":"Coller comme texte"},"pastefromword":{"confirmCleanup":"Le texte que vous tentez de coller semble provenir de Word.  Désirez vous le nettoyer avant de coller?","error":"Il n'a pas été possible de nettoyer les données collées du à une erreur interne","title":"Coller de Word","toolbar":"Coller de Word"},"preview":{"preview":"Prévisualiser"},"print":{"toolbar":"Imprimer"},"removeformat":{"toolbar":"Supprimer le formatage"},"save":{"toolbar":"Sauvegarder"},"selectall":{"toolbar":"Sélectionner tout"},"showblocks":{"toolbar":"Afficher les blocs"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Option des caractères spéciaux","title":"Sélectionner un caractère spécial","toolbar":"Insérer un caractère spécial"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Styles de formattage","panelTitle1":"Styles de block","panelTitle2":"Styles en ligne","panelTitle3":"Styles d'objet"},"table":{"border":"Taille de la bordure","caption":"Titre","cell":{"menu":"Cellule","insertBefore":"Insérer une cellule avant","insertAfter":"Insérer une cellule après","deleteCell":"Supprimer des cellules","merge":"Fusionner les cellules","mergeRight":"Fusionner à droite","mergeDown":"Fusionner en bas","splitHorizontal":"Scinder la cellule horizontalement","splitVertical":"Scinder la cellule verticalement","title":"Propriétés de la cellule","cellType":"Type de cellule","rowSpan":"Fusion de lignes","colSpan":"Fusion de colonnes","wordWrap":"Retour à la ligne","hAlign":"Alignement horizontal","vAlign":"Alignement vertical","alignBaseline":"Bas du texte","bgColor":"Couleur d'arrière plan","borderColor":"Couleur de bordure","data":"Données","header":"En-tête","yes":"Oui","no":"Non","invalidWidth":"La largeur de cellule doit être un nombre.","invalidHeight":"La hauteur de cellule doit être un nombre.","invalidRowSpan":"La fusion de lignes doit être un nombre entier.","invalidColSpan":"La fusion de colonnes doit être un nombre entier.","chooseColor":"Sélectionner"},"cellPad":"Marge interne des cellules","cellSpace":"Espacement des cellules","column":{"menu":"Colonne","insertBefore":"Insérer une colonne avant","insertAfter":"Insérer une colonne après","deleteColumn":"Supprimer des colonnes"},"columns":"Colonnes","deleteTable":"Supprimer le tableau","headers":"En-têtes","headersBoth":"Les deux.","headersColumn":"Première colonne","headersNone":"Aucun","headersRow":"Première ligne","invalidBorder":"La taille de bordure doit être un nombre.","invalidCellPadding":"La marge interne des cellules doit être un nombre positif.","invalidCellSpacing":"L'espacement des cellules doit être un nombre positif.","invalidCols":"Le nombre de colonnes doit être supérieur à 0.","invalidHeight":"La hauteur du tableau doit être un nombre.","invalidRows":"Le nombre de lignes doit être supérieur à 0.","invalidWidth":"La largeur du tableau doit être un nombre.","menu":"Propriétés du tableau","row":{"menu":"Ligne","insertBefore":"Insérer une ligne avant","insertAfter":"Insérer une ligne après","deleteRow":"Supprimer des lignes"},"rows":"Lignes","summary":"Résumé","title":"Propriétés du tableau","toolbar":"Tableau","widthPc":"pourcentage","widthPx":"pixels","widthUnit":"unité de largeur"},"undo":{"redo":"Refaire","undo":"Annuler"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer tout","btnReplace":"Remplacer","btnReplaceAll":"Remplacer tout","btnUndo":"Annuler","changeTo":"Changer en","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Le Correcteur d'orthographe n'est pas installé. Souhaitez-vous le télécharger maintenant?","manyChanges":"Vérification d'orthographe terminée: %1 mots modifiés","noChanges":"Vérification d'orthographe terminée: Pas de modifications","noMispell":"Vérification d'orthographe terminée: pas d'erreur trouvée","noSuggestions":"- Pas de suggestion -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Pas dans le dictionnaire","oneChange":"Vérification d'orthographe terminée: Un mot modifié","progress":"Vérification d'orthographe en cours...","title":"Spell Check","toolbar":"Orthographe"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/fr.js b/htmltest/sites/all/libraries/ckeditor-version/lang/fr.js
new file mode 100644
index 00000000..adc7c08b
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/fr.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fr']={"editor":"Éditeur de Texte Enrichi","common":{"editorHelp":"Appuyez sur ALT-0 pour l'aide","browseServer":"Explorer le serveur","url":"URL","protocol":"Protocole","upload":"Envoyer","uploadSubmit":"Envoyer sur le serveur","image":"Image","flash":"Flash","form":"Formulaire","checkbox":"Case à cocher","radio":"Bouton Radio","textField":"Champ texte","textarea":"Zone de texte","hiddenField":"Champ caché","button":"Bouton","select":"Liste déroulante","imageButton":"Bouton image","notSet":"<non défini>","id":"Id","name":"Nom","langDir":"Sens d'écriture","langDirLtr":"Gauche à droite (LTR)","langDirRtl":"Droite à gauche (RTL)","langCode":"Code de langue","longDescr":"URL de description longue (longdesc => malvoyant)","cssClass":"Classe CSS","advisoryTitle":"Description (title)","cssStyle":"Style","ok":"OK","cancel":"Annuler","close":"Fermer","preview":"Aperçu","resize":"Déplacer pour modifier la taille","generalTab":"Général","advancedTab":"Avancé","validateNumberFailed":"Cette valeur n'est pas un nombre.","confirmNewPage":"Les changements non sauvegardés seront perdus. Êtes-vous sûr de vouloir charger une nouvelle page?","confirmCancel":"Certaines options ont été modifiées. Êtes-vous sûr de vouloir fermer?","options":"Options","target":"Cible (Target)","targetNew":"Nouvelle fenêtre (_blank)","targetTop":"Fenêtre supérieure (_top)","targetSelf":"Même fenêtre (_self)","targetParent":"Fenêtre parent (_parent)","langDirLTR":"Gauche à Droite (LTR)","langDirRTL":"Droite à Gauche (RTL)","styles":"Style","cssClasses":"Classes de style","width":"Largeur","height":"Hauteur","align":"Alignement","alignLeft":"Gauche","alignRight":"Droite","alignCenter":"Centré","alignTop":"Haut","alignMiddle":"Milieu","alignBottom":"Bas","invalidValue":"Valeur incorrecte.","invalidHeight":"La hauteur doit être un nombre.","invalidWidth":"La largeur doit être un nombre.","invalidCssLength":"La valeur spécifiée pour le champ \"%1\" doit être un nombre positif avec ou sans unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","invalidHtmlLength":"La valeur spécifiée pour le champ \"%1\" doit être un nombre positif avec ou sans unité de mesure HTML valide (px ou %).","invalidInlineStyle":"La valeur spécifiée pour le style inline doit être composée d'un ou plusieurs couples de valeur au format \"nom : valeur\", separés par des points-virgules.","cssLengthTooltip":"Entrer un nombre pour une valeur en pixels ou un nombre avec une unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, Indisponible</span>"},"about":{"copy":"Copyright &copy; $1. Tous droits réservés.","dlgTitle":"À propos de CKEditor","help":"Consulter $1 pour l'aide.","moreInfo":"Pour les informations de licence, veuillez visiter notre site web:","title":"À propos de CKEditor","userGuide":"Guide de l'utilisateur CKEditor en anglais"},"basicstyles":{"bold":"Gras","italic":"Italique","strike":"Barré","subscript":"Indice","superscript":"Exposant","underline":"Souligné"},"bidi":{"ltr":"Direction du texte de la gauche vers la droite","rtl":"Direction du texte de la droite vers la gauche"},"blockquote":{"toolbar":"Citation"},"clipboard":{"copy":"Copier","copyError":"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement des opérations de copie. Veuillez utiliser le raccourci clavier (Ctrl/Cmd+C).","cut":"Couper","cutError":"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement l'opération \"couper\". Veuillez utiliser le raccourci clavier (Ctrl/Cmd+X).","paste":"Coller","pasteArea":"Coller la zone","pasteMsg":"Veuillez coller le texte dans la zone suivante en utilisant le raccourci clavier (<strong>Ctrl/Cmd+V</strong>) et cliquez sur OK.","securityMsg":"A cause des paramètres de sécurité de votre navigateur, l'éditeur n'est pas en mesure d'accéder directement à vos données contenues dans le presse-papier. Vous devriez réessayer de coller les données dans la fenêtre.","title":"Coller"},"colorbutton":{"auto":"Automatique","bgColorTitle":"Couleur d'arrière plan","colors":{"000":"Noir","800000":"Marron","8B4513":"Brun moyen","2F4F4F":"Vert sombre","008080":"Canard","000080":"Bleu marine","4B0082":"Indigo","696969":"Gris foncé","B22222":"Rouge brique","A52A2A":"Brun","DAA520":"Or terni","006400":"Vert foncé","40E0D0":"Turquoise","0000CD":"Bleu royal","800080":"Pourpre","808080":"Gris","F00":"Rouge","FF8C00":"Orange foncé","FFD700":"Or","008000":"Vert","0FF":"Cyan","00F":"Bleu","EE82EE":"Violet","A9A9A9":"Gris moyen","FFA07A":"Saumon","FFA500":"Orange","FFFF00":"Jaune","00FF00":"Lime","AFEEEE":"Turquoise clair","ADD8E6":"Bleu clair","DDA0DD":"Prune","D3D3D3":"Gris clair","FFF0F5":"Fard Lavande","FAEBD7":"Blanc antique","FFFFE0":"Jaune clair","F0FFF0":"Honeydew","F0FFFF":"Azur","F0F8FF":"Bleu Alice","E6E6FA":"Lavande","FFF":"Blanc"},"more":"Plus de couleurs...","panelTitle":"Couleurs","textColorTitle":"Couleur de texte"},"colordialog":{"clear":"Effacer","highlight":"Détails","options":"Option des couleurs","selected":"Couleur choisie","title":"Choisir une couleur"},"templates":{"button":"Modèles","emptyListMsg":"(Aucun modèle disponible)","insertOption":"Remplacer le contenu actuel","options":"Options des modèles","selectPromptMsg":"Veuillez sélectionner le modèle pour l'ouvrir dans l'éditeur","title":"Contenu des modèles"},"contextmenu":{"options":"Options du menu contextuel"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Classe CSS","edit":"Éditer la DIV","inlineStyleInputLabel":"Style en ligne","langDirLTRLabel":"Gauche à droite (LTR)","langDirLabel":"Sens d'écriture","langDirRTLLabel":"Droite à gauche (RTL)","languageCodeInputLabel":"Code de langue","remove":"Enlever la DIV","styleSelectLabel":"Style","title":"Créer un container DIV","toolbar":"Créer un container DIV"},"toolbar":{"toolbarCollapse":"Enrouler la barre d'outils","toolbarExpand":"Dérouler la barre d'outils","toolbarGroups":{"document":"Document","clipboard":"Presse-papier/Défaire","editing":"Editer","forms":"Formulaires","basicstyles":"Styles de base","paragraph":"Paragraphe","links":"Liens","insert":"Insérer","styles":"Styles","colors":"Couleurs","tools":"Outils"},"toolbars":"Barre d'outils de l'éditeur"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 éléments"},"find":{"find":"Trouver","findOptions":"Options de recherche","findWhat":"Expression à trouver: ","matchCase":"Respecter la casse","matchCyclic":"Boucler","matchWord":"Mot entier uniquement","notFoundMsg":"Le texte spécifié ne peut être trouvé.","replace":"Remplacer","replaceAll":"Remplacer tout","replaceSuccessMsg":"%1 occurrence(s) replacée(s).","replaceWith":"Remplacer par: ","title":"Trouver et remplacer"},"fakeobjects":{"anchor":"Ancre","flash":"Animation Flash","hiddenfield":"Champ caché","iframe":"IFrame","unknown":"Objet inconnu"},"flash":{"access":"Accès aux scripts","accessAlways":"Toujours","accessNever":"Jamais","accessSameDomain":"Même domaine","alignAbsBottom":"Bas absolu","alignAbsMiddle":"Milieu absolu","alignBaseline":"Bas du texte","alignTextTop":"Haut du texte","bgcolor":"Couleur d'arrière-plan","chkFull":"Permettre le plein écran","chkLoop":"Boucle","chkMenu":"Activer le menu Flash","chkPlay":"Jouer automatiquement","flashvars":"Variables du Flash","hSpace":"Espacement horizontal","properties":"Propriétés du Flash","propertiesTab":"Propriétés","quality":"Qualité","qualityAutoHigh":"Haute Auto","qualityAutoLow":"Basse Auto","qualityBest":"Meilleure","qualityHigh":"Haute","qualityLow":"Basse","qualityMedium":"Moyenne","scale":"Echelle","scaleAll":"Afficher tout","scaleFit":"Taille d'origine","scaleNoBorder":"Pas de bordure","title":"Propriétés du Flash","vSpace":"Espacement vertical","validateHSpace":"L'espacement horizontal doit être un nombre.","validateSrc":"L'adresse ne doit pas être vide.","validateVSpace":"L'espacement vertical doit être un nombre.","windowMode":"Mode fenêtre","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Fenêtre"},"font":{"fontSize":{"label":"Taille","voiceLabel":"Taille de police","panelTitle":"Taille de police"},"label":"Police","panelTitle":"Style de police","voiceLabel":"Police"},"forms":{"button":{"title":"Propriétés du bouton","text":"Texte (Value)","type":"Type","typeBtn":"Bouton","typeSbm":"Validation (submit)","typeRst":"Remise à zéro"},"checkboxAndRadio":{"checkboxTitle":"Propriétés de la case à cocher","radioTitle":"Propriétés du bouton Radio","value":"Valeur","selected":"Sélectionné"},"form":{"title":"Propriétés du formulaire","menu":"Propriétés du formulaire","action":"Action","method":"Méthode","encoding":"Encodage"},"hidden":{"title":"Propriétés du champ caché","name":"Nom","value":"Valeur"},"select":{"title":"Propriétés du menu déroulant","selectInfo":"Informations sur le menu déroulant","opAvail":"Options disponibles","value":"Valeur","size":"Taille","lines":"Lignes","chkMulti":"Permettre les sélections multiples","opText":"Texte","opValue":"Valeur","btnAdd":"Ajouter","btnModify":"Modifier","btnUp":"Haut","btnDown":"Bas","btnSetValue":"Définir comme valeur sélectionnée","btnDelete":"Supprimer"},"textarea":{"title":"Propriétés de la zone de texte","cols":"Colonnes","rows":"Lignes"},"textfield":{"title":"Propriétés du champ texte","name":"Nom","value":"Valeur","charWidth":"Taille des caractères","maxChars":"Nombre maximum de caractères","type":"Type","typeText":"Texte","typePass":"Mot de passe","typeEmail":"E-mail","typeSearch":"Rechercher","typeTel":"Numéro de téléphone","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Format de paragraphe","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Titre 1","tag_h2":"Titre 2","tag_h3":"Titre 3","tag_h4":"Titre 4","tag_h5":"Titre 5","tag_h6":"Titre 6","tag_p":"Normal","tag_pre":"Formaté"},"horizontalrule":{"toolbar":"Ligne horizontale"},"iframe":{"border":"Afficher une bordure de la IFrame","noUrl":"Veuillez entrer l'adresse du lien de la IFrame","scrolling":"Permettre à la barre de défilement","title":"Propriétés de la IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Veuillez entrer l'adresse de l'image","alt":"Texte de remplacement","border":"Bordure","btnUpload":"Envoyer sur le serveur","button2Img":"Voulez-vous transformer le bouton image sélectionné en simple image?","hSpace":"Espacement horizontal","img2Button":"Voulez-vous transformer l'image en bouton image?","infoTab":"Informations sur l'image","linkTab":"Lien","lockRatio":"Conserver les proportions","menu":"Propriétés de l'image","resetSize":"Taille d'origine","title":"Propriétés de l'image","titleButton":"Propriétés du bouton image","upload":"Envoyer","urlMissing":"L'adresse source de l'image est manquante.","vSpace":"Espacement vertical","validateBorder":"Bordure doit être un entier.","validateHSpace":"HSpace doit être un entier.","validateVSpace":"VSpace doit être un entier."},"indent":{"indent":"Augmenter le retrait (tabulation)","outdent":"Diminuer le retrait (tabulation)"},"smiley":{"options":"Options des émoticones","title":"Insérer un émoticone","toolbar":"Émoticones"},"justify":{"block":"Justifier","center":"Centrer","left":"Aligner à gauche","right":"Aligner à droite"},"link":{"acccessKey":"Touche d'accessibilité","advanced":"Avancé","advisoryContentType":"Type de contenu (ex: text/html)","advisoryTitle":"Description (title)","anchor":{"toolbar":"Ancre","menu":"Editer l'ancre","title":"Propriétés de l'ancre","name":"Nom de l'ancre","errorName":"Veuillez entrer le nom de l'ancre.","remove":"Supprimer l'ancre"},"anchorId":"Par ID d'élément","anchorName":"Par nom d'ancre","charset":"Charset de la cible","cssClasses":"Classe CSS","emailAddress":"Adresse E-Mail","emailBody":"Corps du message","emailSubject":"Sujet du message","id":"Id","info":"Infos sur le lien","langCode":"Code de langue","langDir":"Sens d'écriture","langDirLTR":"Gauche à droite","langDirRTL":"Droite à gauche","menu":"Editer le lien","name":"Nom","noAnchors":"(Aucune ancre disponible dans ce document)","noEmail":"Veuillez entrer l'adresse e-mail","noUrl":"Veuillez entrer l'adresse du lien","other":"<autre>","popupDependent":"Dépendante (Netscape)","popupFeatures":"Options de la fenêtre popup","popupFullScreen":"Plein écran (IE)","popupLeft":"Position gauche","popupLocationBar":"Barre d'adresse","popupMenuBar":"Barre de menu","popupResizable":"Redimensionnable","popupScrollBars":"Barres de défilement","popupStatusBar":"Barre de status","popupToolbar":"Barre d'outils","popupTop":"Position haute","rel":"Relation","selectAnchor":"Sélectionner l'ancre","styles":"Style","tabIndex":"Index de tabulation","target":"Cible","targetFrame":"<cadre>","targetFrameName":"Nom du Cadre destination","targetPopup":"<fenêtre popup>","targetPopupName":"Nom de la fenêtre popup","title":"Lien","toAnchor":"Transformer le lien en ancre dans le texte","toEmail":"E-mail","toUrl":"URL","toolbar":"Lien","type":"Type de lien","unlink":"Supprimer le lien","upload":"Envoyer"},"list":{"bulletedlist":"Insérer/Supprimer la liste à puces","numberedlist":"Insérer/Supprimer la liste numérotée"},"liststyle":{"armenian":"Numération arménienne","bulletedTitle":"Propriétés de la liste à puces","circle":"Cercle","decimal":"Décimal (1, 2, 3, etc.)","decimalLeadingZero":"Décimal précédé par un 0 (01, 02, 03, etc.)","disc":"Disque","georgian":"Numération géorgienne (an, ban, gan, etc.)","lowerAlpha":"Alphabétique minuscules (a, b, c, d, e, etc.)","lowerGreek":"Grec minuscule (alpha, beta, gamma, etc.)","lowerRoman":"Nombres romains minuscules (i, ii, iii, iv, v, etc.)","none":"Aucun","notset":"<Non défini>","numberedTitle":"Propriétés de la liste numérotée","square":"Carré","start":"Début","type":"Type","upperAlpha":"Alphabétique majuscules (A, B, C, D, E, etc.)","upperRoman":"Nombres romains majuscules (I, II, III, IV, V, etc.)","validateStartNumber":"Le premier élément de la liste doit être un nombre entier."},"magicline":{"title":"Insérez un paragraphe ici"},"maximize":{"maximize":"Agrandir","minimize":"Minimiser"},"newpage":{"toolbar":"Nouvelle page"},"pagebreak":{"alt":"Saut de page","toolbar":"Saut de page"},"pastetext":{"button":"Coller comme texte sans mise en forme","title":"Coller comme texte sans mise en forme"},"pastefromword":{"confirmCleanup":"Le texte à coller semble provenir de Word. Désirez-vous le nettoyer avant de coller?","error":"Il n'a pas été possible de nettoyer les données collées à la suite d'une erreur interne.","title":"Coller depuis Word","toolbar":"Coller depuis Word"},"preview":{"preview":"Aperçu"},"print":{"toolbar":"Imprimer"},"removeformat":{"toolbar":"Supprimer la mise en forme"},"save":{"toolbar":"Enregistrer"},"selectall":{"toolbar":"Tout sélectionner"},"showblocks":{"toolbar":"Afficher les blocs"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Options des caractères spéciaux","title":"Sélectionnez un caractère","toolbar":"Insérer un caractère spécial"},"scayt":{"about":"A propos de SCAYT","aboutTab":"À propos de","addWord":"Ajouter le mot","allCaps":"Ignorer les mots entièrement en majuscules","dic_create":"Créer","dic_delete":"Effacer","dic_field_name":"Nom du dictionnaire","dic_info":"Initialement, le dictionnaire de l'utilisateur est stocké dans un cookie. Cependant, les cookies sont limités en taille. Quand le dictionnaire atteint une taille qu'il n'est plus possible de stocker dans un cookie, il peut alors être stocké sur nos serveurs. Afin de stocker votre dictionnaire personnel sur nos serveurs, vous devez spécifier un nom pour ce dictionnaire. Si vous avez déjà un dictionnaire stocké, merci de taper son nom puis cliquer sur Restaurer pour le récupérer.","dic_rename":"Renommer","dic_restore":"Restaurer","dictionariesTab":"Dictionnaires","disable":"Désactiver SCAYT","emptyDic":"Le nom du dictionnaire ne devrait pas être vide.","enable":"Activer SCAYT","ignore":"Ignorer","ignoreAll":"Ignorer Tout","ignoreDomainNames":"Ignorer les noms de domaines","langs":"Langues","languagesTab":"Langues","mixedCase":"Ignorer les mots à casse multiple","mixedWithDigits":"Ignorer les mots contenant des chiffres","moreSuggestions":"Plus de suggestions","opera_title":"Non supporté par Opera","options":"Options","optionsTab":"Options","title":"Vérification de l'Orthographe en Cours de Frappe (SCAYT)","toggle":"Activer/Désactiver SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Styles de mise en page","panelTitle1":"Styles de blocs","panelTitle2":"Styles en ligne","panelTitle3":"Styles d'objet"},"table":{"border":"Taille de la bordure","caption":"Titre du tableau","cell":{"menu":"Cellule","insertBefore":"Insérer une cellule avant","insertAfter":"Insérer une cellule après","deleteCell":"Supprimer les cellules","merge":"Fusionner les cellules","mergeRight":"Fusionner à droite","mergeDown":"Fusionner en bas","splitHorizontal":"Fractionner horizontalement","splitVertical":"Fractionner verticalement","title":"Propriétés de la cellule","cellType":"Type de cellule","rowSpan":"Fusion de lignes","colSpan":"Fusion de colonnes","wordWrap":"Césure","hAlign":"Alignement Horizontal","vAlign":"Alignement Vertical","alignBaseline":"Bas du texte","bgColor":"Couleur d'arrière-plan","borderColor":"Couleur de Bordure","data":"Données","header":"Entête","yes":"Oui","no":"Non","invalidWidth":"La Largeur de Cellule doit être un nombre.","invalidHeight":"La Hauteur de Cellule doit être un nombre.","invalidRowSpan":"La fusion de lignes doit être un nombre entier.","invalidColSpan":"La fusion de colonnes doit être un nombre entier.","chooseColor":"Choisissez"},"cellPad":"Marge interne des cellules","cellSpace":"Espacement des cellules","column":{"menu":"Colonnes","insertBefore":"Insérer une colonne avant","insertAfter":"Insérer une colonne après","deleteColumn":"Supprimer les colonnes"},"columns":"Colonnes","deleteTable":"Supprimer le tableau","headers":"En-Têtes","headersBoth":"Les deux","headersColumn":"Première colonne","headersNone":"Aucunes","headersRow":"Première ligne","invalidBorder":"La taille de la bordure doit être un nombre.","invalidCellPadding":"La marge intérieure des cellules doit être un nombre positif.","invalidCellSpacing":"L'espacement des cellules doit être un nombre positif.","invalidCols":"Le nombre de colonnes doit être supérieur à 0.","invalidHeight":"La hauteur du tableau doit être un nombre.","invalidRows":"Le nombre de lignes doit être supérieur à 0.","invalidWidth":"La largeur du tableau doit être un nombre.","menu":"Propriétés du tableau","row":{"menu":"Ligne","insertBefore":"Insérer une ligne avant","insertAfter":"Insérer une ligne après","deleteRow":"Supprimer les lignes"},"rows":"Lignes","summary":"Résumé (description)","title":"Propriétés du tableau","toolbar":"Tableau","widthPc":"% pourcents","widthPx":"pixels","widthUnit":"unité de largeur"},"undo":{"redo":"Rétablir","undo":"Annuler"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer tout","btnReplace":"Remplacer","btnReplaceAll":"Remplacer tout","btnUndo":"Annuler","changeTo":"Modifier pour","errorLoading":"Erreur du chargement du service depuis l'hôte : %s.","ieSpellDownload":"La vérification d'orthographe n'est pas installée. Voulez-vous la télécharger maintenant?","manyChanges":"Vérification de l'orthographe terminée : %1 mots corrigés.","noChanges":"Vérification de l'orthographe terminée : Aucun mot corrigé.","noMispell":"Vérification de l'orthographe terminée : aucune erreur trouvée.","noSuggestions":"- Aucune suggestion -","notAvailable":"Désolé, le service est indisponible actuellement.","notInDic":"N'existe pas dans le dictionnaire.","oneChange":"Vérification de l'orthographe terminée : Un seul mot corrigé.","progress":"Vérification de l'orthographe en cours...","title":"Vérifier l'orthographe","toolbar":"Vérifier l'orthographe"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/gl.js b/htmltest/sites/all/libraries/ckeditor-version/lang/gl.js
new file mode 100644
index 00000000..787ee1e1
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/gl.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['gl']={"editor":"Editor de texto mellorado","common":{"editorHelp":"Prema ALT 0 para obter axuda","browseServer":"Examinar o servidor","url":"URL","protocol":"Protocolo","upload":"Enviar","uploadSubmit":"Enviar ao servidor","image":"Imaxe","flash":"Flash","form":"Formulario","checkbox":"Caixa de selección","radio":"Botón de opción","textField":"Campo de texto","textarea":"Área de texto","hiddenField":"Campo agochado","button":"Botón","select":"Campo de selección","imageButton":"Botón de imaxe","notSet":"<sen estabelecer>","id":"ID","name":"Nome","langDir":"Dirección de escritura do idioma","langDirLtr":"Esquerda a dereita (LTR)","langDirRtl":"Dereita a esquerda (RTL)","langCode":"Código do idioma","longDescr":"Descrición completa do URL","cssClass":"Clases da folla de estilos","advisoryTitle":"Título","cssStyle":"Estilo","ok":"Aceptar","cancel":"Cancelar","close":"Pechar","preview":"Vista previa","resize":"Redimensionar","generalTab":"Xeral","advancedTab":"Avanzado","validateNumberFailed":"Este valor non é un número.","confirmNewPage":"Calquera cambio que non gardara neste contido perderase.\r\nConfirma que quere cargar unha páxina nova?","confirmCancel":"Algunhas das opcións foron cambiadas.\r\nConfirma que quere pechar o diálogo?","options":"Opcións","target":"Destino","targetNew":"Nova xanela (_blank)","targetTop":"Xanela principal (_top)","targetSelf":"Mesma xanela (_self)","targetParent":"Xanela superior (_parent)","langDirLTR":"Esquerda a dereita (LTR)","langDirRTL":"Dereita a esquerda (RTL)","styles":"Estilo","cssClasses":"Clases da folla de estilos","width":"Largo","height":"Alto","align":"Aliñamento","alignLeft":"Esquerda","alignRight":"Dereita","alignCenter":"Centro","alignTop":"Arriba","alignMiddle":"Centro","alignBottom":"Abaixo","invalidValue":"Valor incorrecto.","invalidHeight":"O alto debe ser un número.","invalidWidth":"O largo debe ser un número.","invalidCssLength":"O valor especificado para o campo «%1» debe ser un número positivo con ou sen unha unidade de medida CSS correcta (px, %, in, cm, mm, em, ex, pt, ou pc).","invalidHtmlLength":"O valor especificado para o campo «%1» debe ser un número positivo con ou sen unha unidade de medida HTML correcta (px ou %).","invalidInlineStyle":"O valor especificado no estilo en liña debe consistir nunha ou máis tuplas co formato «nome : valor», separadas por punto e coma.","cssLengthTooltip":"Escriba un número para o valor en píxeles ou un número cunha unidade CSS correcta (px, %, in, cm, mm, em, ex, pt, ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, non dispoñíbel</span>"},"about":{"copy":"Copyright &copy; $1. Todos os dereitos reservados.","dlgTitle":"Sobre o CKEditor","help":"Consulte $1 para obter axuda.","moreInfo":"Para obter  información sobre a licenza, visite o noso sitio web:","title":"Sobre o CKEditor","userGuide":"Guía do usuario do CKEditor"},"basicstyles":{"bold":"Negra","italic":"Cursiva","strike":"Riscado","subscript":"Subíndice","superscript":"Superíndice","underline":"Subliñado"},"bidi":{"ltr":"Dirección do texto de esquerda a dereita","rtl":"Dirección do texto de dereita a esquerda"},"blockquote":{"toolbar":"Cita"},"clipboard":{"copy":"Copiar","copyError":"Os axustes de seguranza do seu navegador non permiten que o editor realice automaticamente as tarefas de copia. Use o teclado para iso (Ctrl/Cmd+C).","cut":"Cortar","cutError":"Os axustes de seguranza do seu navegador non permiten que o editor realice automaticamente as tarefas de corte. Use o teclado para iso (Ctrl/Cmd+X).","paste":"Pegar","pasteArea":"Zona de pegado","pasteMsg":"Pegue dentro do seguinte cadro usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e prema en Aceptar","securityMsg":"Por mor da configuración de seguranza do seu navegador, o editor non ten acceso ao portapapeis. É necesario pegalo novamente nesta xanela.","title":"Pegar"},"colorbutton":{"auto":"Automático","bgColorTitle":"Cor do fondo","colors":{"000":"Negro","800000":"Marrón escuro","8B4513":"Ocre","2F4F4F":"Pizarra escuro","008080":"Verde azulado","000080":"Azul mariño","4B0082":"Índigo","696969":"Gris escuro","B22222":"Ladrillo","A52A2A":"Marrón","DAA520":"Dourado escuro","006400":"Verde escuro","40E0D0":"Turquesa","0000CD":"Azul medio","800080":"Púrpura","808080":"Gris","F00":"Vermello","FF8C00":"Laranxa escuro","FFD700":"Dourado","008000":"Verde","0FF":"Cian","00F":"Azul","EE82EE":"Violeta","A9A9A9":"Gris medio","FFA07A":"Salmón claro","FFA500":"Laranxa","FFFF00":"Amarelo","00FF00":"Lima","AFEEEE":"Turquesa pálido","ADD8E6":"Azul claro","DDA0DD":"Violeta pálido","D3D3D3":"Verde claro","FFF0F5":"Lavanda vermello","FAEBD7":"Branco antigo","FFFFE0":"Amarelo claro","F0FFF0":"Mel","F0FFFF":"Azul celeste","F0F8FF":"Azul pálido","E6E6FA":"Lavanda","FFF":"Branco"},"more":"Máis cores...","panelTitle":"Cores","textColorTitle":"Cor do texto"},"colordialog":{"clear":"Limpar","highlight":"Resaltar","options":"Opcións de cor","selected":"Cor seleccionado","title":"Seleccione unha cor"},"templates":{"button":"Modelos","emptyListMsg":"(Non hai modelos definidos)","insertOption":"Substituír o contido actual","options":"Opcións de modelos","selectPromptMsg":"Seleccione o modelo a abrir no editor","title":"Modelos de contido"},"contextmenu":{"options":"Opcións do menú contextual"},"div":{"IdInputLabel":"ID","advisoryTitleInputLabel":"Título","cssClassInputLabel":"Clases da folla de estilos","edit":"Editar Div","inlineStyleInputLabel":"Estilo de liña","langDirLTRLabel":"Esquerda a dereita (LTR)","langDirLabel":"Dirección de escritura do idioma","langDirRTLLabel":"Dereita a esquerda (RTL)","languageCodeInputLabel":"Código do idioma","remove":"Retirar Div","styleSelectLabel":"Estilo","title":"Crear un contedor Div","toolbar":"Crear un contedor Div"},"toolbar":{"toolbarCollapse":"Contraer a barra de ferramentas","toolbarExpand":"Expandir a barra de ferramentas","toolbarGroups":{"document":"Documento","clipboard":"Portapapeis/desfacer","editing":"Edición","forms":"Formularios","basicstyles":"Estilos básicos","paragraph":"Paragrafo","links":"Ligazóns","insert":"Inserir","styles":"Estilos","colors":"Cores","tools":"Ferramentas"},"toolbars":"Barras de ferramentas do editor"},"elementspath":{"eleLabel":"Ruta dos elementos","eleTitle":"Elemento %1"},"find":{"find":"Buscar","findOptions":"Buscar opcións","findWhat":"Texto a buscar:","matchCase":"Coincidir Mai./min.","matchCyclic":"Coincidencia cíclica","matchWord":"Coincidencia coa palabra completa","notFoundMsg":"Non se atopou o texto indicado.","replace":"Substituir","replaceAll":"Substituír todo","replaceSuccessMsg":"%1 concorrencia(s) substituída(s).","replaceWith":"Substituír con:","title":"Buscar e substituír"},"fakeobjects":{"anchor":"Ancoraxe","flash":"Animación «Flash»","hiddenfield":"Campo agochado","iframe":"IFrame","unknown":"Obxecto descoñecido"},"flash":{"access":"Acceso de scripts","accessAlways":"Sempre","accessNever":"Nunca","accessSameDomain":"Mesmo dominio","alignAbsBottom":"Abs Inferior","alignAbsMiddle":"Abs centro","alignBaseline":"Liña de base","alignTextTop":"Tope do texto","bgcolor":"Cor do fondo","chkFull":"Permitir pantalla completa","chkLoop":"Repetir","chkMenu":"Activar o menú do «Flash»","chkPlay":"Reprodución auomática","flashvars":"Opcións do «Flash»","hSpace":"Esp. Horiz.","properties":"Propiedades do «Flash»","propertiesTab":"Propiedades","quality":"Calidade","qualityAutoHigh":"Alta, automática","qualityAutoLow":"Baixa, automática","qualityBest":"A mellor","qualityHigh":"Alta","qualityLow":"Baixa","qualityMedium":"Media","scale":"Escalar","scaleAll":"Amosar todo","scaleFit":"Encaixar axustando","scaleNoBorder":"Sen bordo","title":"Propiedades do «Flash»","vSpace":"Esp.Vert.","validateHSpace":"O espazado horizontal debe ser un número.","validateSrc":"O URL non pode estar baleiro.","validateVSpace":"O espazado vertical debe ser un número.","windowMode":"Modo da xanela","windowModeOpaque":"Opaca","windowModeTransparent":"Transparente","windowModeWindow":"Xanela"},"font":{"fontSize":{"label":"Tamaño","voiceLabel":"Tamaño da letra","panelTitle":"Tamaño da letra"},"label":"Tipo de letra","panelTitle":"Nome do tipo de letra","voiceLabel":"Tipo de letra"},"forms":{"button":{"title":"Propiedades do botón","text":"Texto (Valor)","type":"Tipo","typeBtn":"Botón","typeSbm":"Enviar","typeRst":"Restabelever"},"checkboxAndRadio":{"checkboxTitle":"Propiedades da caixa de selección","radioTitle":"Propiedades do botón de opción","value":"Valor","selected":"Seleccionado"},"form":{"title":"Propiedades do formulario","menu":"Propiedades do formulario","action":"Acción","method":"Método","encoding":"Codificación"},"hidden":{"title":"Propiedades do campo agochado","name":"Nome","value":"Valor"},"select":{"title":"Propiedades do campo de selección","selectInfo":"Información","opAvail":"Opcións dispoñíbeis","value":"Valor","size":"Tamaño","lines":"liñas","chkMulti":"Permitir múltiplas seleccións","opText":"Texto","opValue":"Valor","btnAdd":"Engadir","btnModify":"Modificar","btnUp":"Subir","btnDown":"Baixar","btnSetValue":"Estabelecer como valor seleccionado","btnDelete":"Eliminar"},"textarea":{"title":"Propiedades da área de texto","cols":"Columnas","rows":"Filas"},"textfield":{"title":"Propiedades do campo de texto","name":"Nome","value":"Valor","charWidth":"Largo do carácter","maxChars":"Núm. máximo de caracteres","type":"Tipo","typeText":"Texto","typePass":"Contrasinal","typeEmail":"Correo","typeSearch":"Buscar","typeTel":"Número de teléfono","typeUrl":"URL"}},"format":{"label":"Formato","panelTitle":"Formato do parágrafo","tag_address":"Enderezo","tag_div":"Normal  (DIV)","tag_h1":"Enacabezado 1","tag_h2":"Encabezado 2","tag_h3":"Encabezado 3","tag_h4":"Encabezado 4","tag_h5":"Encabezado 5","tag_h6":"Encabezado 6","tag_p":"Normal","tag_pre":"Formatado"},"horizontalrule":{"toolbar":"Inserir unha liña horizontal"},"iframe":{"border":"Amosar o bordo do marco","noUrl":"Escriba o enderezo do iframe","scrolling":"Activar as barras de desprazamento","title":"Propiedades do iFrame","toolbar":"IFrame"},"image":{"alertUrl":"Escriba o URL da imaxe","alt":"Texto alternativo","border":"Bordo","btnUpload":"Enviar ao servidor","button2Img":"Quere converter o botón da imaxe seleccionada nunha imaxe sinxela?","hSpace":"Esp.Horiz.","img2Button":"Quere converter a imaxe seleccionada nun botón de imaxe?","infoTab":"Información da imaxe","linkTab":"Ligazón","lockRatio":"Proporcional","menu":"Propiedades da imaxe","resetSize":"Tamaño orixinal","title":"Propiedades da imaxe","titleButton":"Propiedades do botón de imaxe","upload":"Cargar","urlMissing":"Non se atopa o URL da imaxe.","vSpace":"Esp.Vert.","validateBorder":"O bordo debe ser un número.","validateHSpace":"O espazado horizontal debe ser un número.","validateVSpace":"O espazado vertical debe ser un número."},"indent":{"indent":"Aumentar a sangría","outdent":"Reducir a sangría"},"smiley":{"options":"Opcións de emoticonas","title":"Inserir unha emoticona","toolbar":"Emoticona"},"justify":{"block":"Xustificado","center":"Centrado","left":"Aliñar á esquerda","right":"Aliñar á dereita"},"link":{"acccessKey":"Chave de acceso","advanced":"Avanzado","advisoryContentType":"Tipo de contido informativo","advisoryTitle":"Título","anchor":{"toolbar":"Ancoraxe","menu":"Editar a ancoraxe","title":"Propiedades da ancoraxe","name":"Nome da ancoraxe","errorName":"Escriba o nome da ancoraxe","remove":"Retirar a ancoraxe"},"anchorId":"Polo ID do elemento","anchorName":"Polo nome da ancoraxe","charset":"Codificación do recurso ligado","cssClasses":"Clases da folla de estilos","emailAddress":"Enderezo de correo","emailBody":"Corpo da mensaxe","emailSubject":"Asunto da mensaxe","id":"ID","info":"Información da ligazón","langCode":"Código do idioma","langDir":"Dirección de escritura do idioma","langDirLTR":"Esquerda a dereita (LTR)","langDirRTL":"Dereita a esquerda (RTL)","menu":"Editar a ligazón","name":"Nome","noAnchors":"(Non hai ancoraxes dispoñíbeis no documento)","noEmail":"Escriba o enderezo de correo","noUrl":"Escriba a ligazón URL","other":"<outro>","popupDependent":"Dependente (Netscape)","popupFeatures":"Características da xanela emerxente","popupFullScreen":"Pantalla completa (IE)","popupLeft":"Posición esquerda","popupLocationBar":"Barra de localización","popupMenuBar":"Barra do menú","popupResizable":"Redimensionábel","popupScrollBars":"Barras de desprazamento","popupStatusBar":"Barra de estado","popupToolbar":"Barra de ferramentas","popupTop":"Posición superior","rel":"Relación","selectAnchor":"Seleccionar unha ancoraxe","styles":"Estilo","tabIndex":"Índice de tabulación","target":"Destino","targetFrame":"<marco>","targetFrameName":"Nome do marco de destino","targetPopup":"<xanela emerxente>","targetPopupName":"Nome da xanela emerxente","title":"Ligazón","toAnchor":"Ligar coa ancoraxe no testo","toEmail":"Correo","toUrl":"URL","toolbar":"Ligazón","type":"Tipo de ligazón","unlink":"Eliminar a ligazón","upload":"Enviar"},"list":{"bulletedlist":"Inserir/retirar lista viñeteada","numberedlist":"Inserir/retirar lista numerada"},"liststyle":{"armenian":"Numeración armenia","bulletedTitle":"Propiedades da lista viñeteada","circle":"Circulo","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal con cero á esquerda (01, 02, 03, etc.)","disc":"Disc","georgian":"Numeración xeorxiana (an, ban, gan, etc.)","lowerAlpha":"Alfabeto en minúsculas (a, b, c, d, e, etc.)","lowerGreek":"Grego en minúsculas (alpha, beta, gamma, etc.)","lowerRoman":"Números romanos en minúsculas (i, ii, iii, iv, v, etc.)","none":"Ningún","notset":"<sen estabelecer>","numberedTitle":"Propiedades da lista numerada","square":"Cadrado","start":"Inicio","type":"Tipo","upperAlpha":"Alfabeto en maiúsculas (A, B, C, D, E, etc.)","upperRoman":"Números romanos en maiúsculas (I, II, III, IV, V, etc.)","validateStartNumber":"O número de inicio da lista debe ser un número enteiro."},"magicline":{"title":"Inserir aquí o parágrafo"},"maximize":{"maximize":"Maximizar","minimize":"Minimizar"},"newpage":{"toolbar":"Páxina nova"},"pagebreak":{"alt":"Quebra de páxina","toolbar":"Inserir quebra de páxina"},"pastetext":{"button":"Pegar como texto simple","title":"Pegar como texto simple"},"pastefromword":{"confirmCleanup":"O texto que quere pegar semella ser copiado desde o Word. Quere depuralo antes de pegalo?","error":"Non foi posíbel depurar os datos pegados por mor dun erro interno","title":"Pegar desde Word","toolbar":"Pegar desde Word"},"preview":{"preview":"Vista previa"},"print":{"toolbar":"Imprimir"},"removeformat":{"toolbar":"Retirar o formato"},"save":{"toolbar":"Gardar"},"selectall":{"toolbar":"Seleccionar todo"},"showblocks":{"toolbar":"Amosar os bloques"},"sourcearea":{"toolbar":"Orixe"},"specialchar":{"options":"Opcións de caracteres especiais","title":"Seleccione un carácter especial","toolbar":"Inserir un carácter especial"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estilos","panelTitle":"Estilos de formatando","panelTitle1":"Estilos de bloque","panelTitle2":"Estilos de carácter","panelTitle3":"Estilos de obxecto"},"table":{"border":"Tamaño do bordo","caption":"Título","cell":{"menu":"Cela","insertBefore":"Inserir a cela á esquerda","insertAfter":"Inserir a cela á dereita","deleteCell":"Eliminar celas","merge":"Combinar celas","mergeRight":"Combinar á dereita","mergeDown":"Combinar cara abaixo","splitHorizontal":"Dividir a cela en horizontal","splitVertical":"Dividir a cela en vertical","title":"Propiedades da cela","cellType":"Tipo de cela","rowSpan":"Expandir filas","colSpan":"Expandir columnas","wordWrap":"Axustar ao contido","hAlign":"Aliñación horizontal","vAlign":"Aliñación vertical","alignBaseline":"Liña de base","bgColor":"Cor do fondo","borderColor":"Cor do bordo","data":"Datos","header":"Cabeceira","yes":"Si","no":"Non","invalidWidth":"O largo da cela debe ser un número.","invalidHeight":"O alto da cela debe ser un número.","invalidRowSpan":"A expansión de filas debe ser un número enteiro.","invalidColSpan":"A expansión de columnas debe ser un número enteiro.","chooseColor":"Escoller"},"cellPad":"Marxe interior da cela","cellSpace":"Marxe entre celas","column":{"menu":"Columna","insertBefore":"Inserir a columna á esquerda","insertAfter":"Inserir a columna á dereita","deleteColumn":"Borrar Columnas"},"columns":"Columnas","deleteTable":"Borrar Táboa","headers":"Cabeceiras","headersBoth":"Ambas","headersColumn":"Primeira columna","headersNone":"Ningún","headersRow":"Primeira fila","invalidBorder":"O tamaño do bordo debe ser un número.","invalidCellPadding":"A marxe interior debe ser un número positivo.","invalidCellSpacing":"A marxe entre celas debe ser un número positivo.","invalidCols":"O número de columnas debe ser un número maior que 0.","invalidHeight":"O alto da táboa debe ser un número.","invalidRows":"O número de filas debe ser un número maior que 0","invalidWidth":"O largo da táboa debe ser un número.","menu":"Propiedades da táboa","row":{"menu":"Fila","insertBefore":"Inserir a fila por riba","insertAfter":"Inserir a fila por baixo","deleteRow":"Eliminar filas"},"rows":"Filas","summary":"Resumo","title":"Propiedades da táboa","toolbar":"Taboa","widthPc":"porcentaxe","widthPx":"píxeles","widthUnit":"unidade do largo"},"undo":{"redo":"Refacer","undo":"Desfacer"},"wsc":{"btnIgnore":"Ignorar","btnIgnoreAll":"Ignorar Todas","btnReplace":"Substituir","btnReplaceAll":"Substituir Todas","btnUndo":"Desfacer","changeTo":"Cambiar a","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"O corrector ortográfico non está instalado. ¿Quere descargalo agora?","manyChanges":"Corrección ortográfica rematada: %1 verbas substituidas","noChanges":"Corrección ortográfica rematada: Non se substituiu nengunha verba","noMispell":"Corrección ortográfica rematada: Non se atoparon erros","noSuggestions":"- Sen candidatos -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Non está no diccionario","oneChange":"Corrección ortográfica rematada: Unha verba substituida","progress":"Corrección ortográfica en progreso...","title":"Spell Check","toolbar":"Corrección Ortográfica"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/gu.js b/htmltest/sites/all/libraries/ckeditor-version/lang/gu.js
new file mode 100644
index 00000000..ce8bd5cc
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/gu.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['gu']={"editor":"રીચ ટેક્ષ્ત્ એડીટર","common":{"editorHelp":"પ્રેસ ALT 0 મદદ માટ","browseServer":"સર્વર બ્રાઉઝ કરો","url":"URL","protocol":"પ્રોટોકૉલ","upload":"અપલોડ","uploadSubmit":"આ સર્વરને મોકલવું","image":"ચિત્ર","flash":"ફ્લૅશ","form":"ફૉર્મ/પત્રક","checkbox":"ચેક બોક્સ","radio":"રેડિઓ બટન","textField":"ટેક્સ્ટ ફીલ્ડ, શબ્દ ક્ષેત્ર","textarea":"ટેક્સ્ટ એરિઆ, શબ્દ વિસ્તાર","hiddenField":"ગુપ્ત ક્ષેત્ર","button":"બટન","select":"પસંદગી ક્ષેત્ર","imageButton":"ચિત્ર બટન","notSet":"<સેટ નથી>","id":"Id","name":"નામ","langDir":"ભાષા લેખવાની પદ્ધતિ","langDirLtr":"ડાબે થી જમણે (LTR)","langDirRtl":"જમણે થી ડાબે (RTL)","langCode":"ભાષા કોડ","longDescr":"વધારે માહિતી માટે URL","cssClass":"સ્ટાઇલ-શીટ ક્લાસ","advisoryTitle":"મુખ્ય મથાળું","cssStyle":"સ્ટાઇલ","ok":"ઠીક છે","cancel":"રદ કરવું","close":"બંધ કરવું","preview":"જોવું","resize":"ખેંચી ને યોગ્ય કરવું","generalTab":"જનરલ","advancedTab":"અડ્વાન્સડ","validateNumberFailed":"આ રકમ આકડો નથી.","confirmNewPage":"સવે કાર્ય વગરનું ફકરો ખોવાઈ જશે. તમને ખાતરી છે કે તમને નવું પાનું ખોલવું છે?","confirmCancel":"ઘણા વિકલ્પો બદલાયા છે. તમારે આ બોક્ષ્ બંધ કરવું છે?","options":"વિકલ્પો","target":"લક્ષ્ય","targetNew":"નવી વિન્ડો (_blank)","targetTop":"ઉપરની વિન્ડો (_top)","targetSelf":"એજ વિન્ડો (_self)","targetParent":"પેરનટ વિન્ડો (_parent)","langDirLTR":"ડાબે થી જમણે (LTR)","langDirRTL":"જમણે થી ડાબે (RTL)","styles":"શૈલી","cssClasses":"શૈલી કલાસીસ","width":"પહોળાઈ","height":"ઊંચાઈ","align":"લાઇનદોરીમાં ગોઠવવું","alignLeft":"ડાબી બાજુ ગોઠવવું","alignRight":"જમણી","alignCenter":"મધ્ય સેન્ટર","alignTop":"ઉપર","alignMiddle":"વચ્ચે","alignBottom":"નીચે","invalidValue":"Invalid value.","invalidHeight":"ઉંચાઈ એક આંકડો હોવો જોઈએ.","invalidWidth":"પોહળ ઈ એક આંકડો હોવો જોઈએ.","invalidCssLength":"\"%1\" ની વેલ્યુ એક પોસીટીવ આંકડો હોવો જોઈએ અથવા CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc) વગર.","invalidHtmlLength":"\"%1\" ની વેલ્યુ એક પોસીટીવ આંકડો હોવો જોઈએ અથવા HTML measurement unit (px or %) વગર.","invalidInlineStyle":"ઈનલાઈન  સ્ટાઈલ ની વેલ્યુ  \"name : value\" ના ફોર્મેટ માં હોવી જોઈએ, વચ્ચે સેમી-કોલોન જોઈએ.","cssLengthTooltip":"પિક્ષ્લ્ નો આંકડો CSS unit (px, %, in, cm, mm, em, ex, pt, or pc) માં નાખો.","unavailable":"%1<span class=\"cke_accessibility\">, નથી મળતું</span>"},"about":{"copy":"કોપીરાઈટ &copy; $1. ઓલ રાઈટ્સ ","dlgTitle":"CKEditor વિષે","help":"મદદ માટે $1 તપાસો","moreInfo":"લાયસનસની માહિતી માટે અમારી વેબ સાઈટ","title":"CKEditor વિષે","userGuide":"CKEditor યુઝર્સ ગાઈડ"},"basicstyles":{"bold":"બોલ્ડ/સ્પષ્ટ","italic":"ઇટેલિક, ત્રાંસા","strike":"છેકી નાખવું","subscript":"એક ચિહ્નની નીચે કરેલું બીજું ચિહ્ન","superscript":"એક ચિહ્ન ઉપર કરેલું બીજું ચિહ્ન.","underline":"અન્ડર્લાઇન, નીચે લીટી"},"bidi":{"ltr":"ટેક્ષ્ત્ ની દિશા ડાબે થી જમણે","rtl":"ટેક્ષ્ત્ ની દિશા જમણે થી ડાબે"},"blockquote":{"toolbar":"બ્લૉક-કોટ, અવતરણચિહ્નો"},"clipboard":{"copy":"નકલ","copyError":"તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કોપી કરવાની પરવાનગી નથી આપતી.  (Ctrl/Cmd+C) का प्रयोग करें।","cut":"કાપવું","cutError":"તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કટ કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+X) નો ઉપયોગ કરો.","paste":"પેસ્ટ","pasteArea":"પેસ્ટ કરવાની જગ્યા","pasteMsg":"Ctrl/Cmd+V નો પ્રયોગ કરી પેસ્ટ કરો","securityMsg":"તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસના કારણે,એડિટર તમારા કિલ્પબોર્ડ ડેટા ને કોપી નથી કરી શકતો. તમારે આ વિન્ડોમાં ફરીથી પેસ્ટ કરવું પડશે.","title":"પેસ્ટ"},"colorbutton":{"auto":"સ્વચાલિત","bgColorTitle":"બૅકગ્રાઉન્ડ રંગ,","colors":{"000":"કાળો","800000":"મરુન","8B4513":"છીક","2F4F4F":"ડાર્ક સ્લેટ ગ્રે ","008080":"ટીલ","000080":"નેવી","4B0082":"જામલી","696969":"ડાર્ક ગ્રે","B22222":"ઈટ","A52A2A":"બ્રાઉન","DAA520":"ગોલ્ડન રોડ","006400":"ડાર્ક લીલો","40E0D0":"ટ્રકોઈસ","0000CD":"મધ્યમ વાદળી","800080":"પર્પલ","808080":"ગ્રે","F00":"લાલ","FF8C00":"ડાર્ક ઓરંજ","FFD700":"ગોલ્ડ","008000":"ગ્રીન","0FF":"સાયન","00F":"વાદળી","EE82EE":"વાયોલેટ","A9A9A9":"ડીમ ","FFA07A":"લાઈટ સાલમન","FFA500":"ઓરંજ","FFFF00":"પીળો","00FF00":"લાઈમ","AFEEEE":"પેલ કોઈસ","ADD8E6":"લાઈટ બ્લુ","DDA0DD":"પલ્મ","D3D3D3":"લાઈટ ગ્રે","FFF0F5":"લવંડર ","FAEBD7":"એન્ટીક સફેદ","FFFFE0":"લાઈટ પીળો","F0FFF0":"હનીડઉય","F0FFFF":"અઝુરે","F0F8FF":"એલીસ બ્લુ","E6E6FA":"લવંડર","FFF":"સફેદ"},"more":"ઔર રંગ...","panelTitle":"રંગ","textColorTitle":"શબ્દનો રંગ"},"colordialog":{"clear":"સાફ કરવું","highlight":"હાઈઈટ","options":"રંગના વિકલ્પ","selected":"પસંદ કરેલો રંગ","title":"રંગ પસંદ કરો"},"templates":{"button":"ટેમ્પ્લેટ","emptyListMsg":"(કોઈ ટેમ્પ્લેટ ડિફાઇન નથી)","insertOption":"મૂળ શબ્દને બદલો","options":"ટેમ્પ્લેટના વિકલ્પો","selectPromptMsg":"એડિટરમાં ઓપન કરવા ટેમ્પ્લેટ પસંદ કરો (વર્તમાન કન્ટેન્ટ સેવ નહીં થાય):","title":"કન્ટેન્ટ ટેમ્પ્લેટ"},"contextmenu":{"options":"કોન્તેક્ષ્ત્ મેનુના વિકલ્પો"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"એડવાઈઝર શીર્ષક","cssClassInputLabel":"સ્ટાઈલશીટ કલાસીસ","edit":"ડીવીમાં ફેરફાર કરવો","inlineStyleInputLabel":"ઈનલાઈન પદ્ધતિ","langDirLTRLabel":"ડાબે થી જમણે (LTR)","langDirLabel":"ભાષાની દિશા","langDirRTLLabel":"જમણે થી ડાબે (RTL)","languageCodeInputLabel":"ભાષાનો કોડ","remove":"ડીવી કાઢી કાઢવું","styleSelectLabel":"સ્ટાઈલ","title":"Div કન્ટેનર બનાવુંવું","toolbar":"Div કન્ટેનર બનાવુંવું"},"toolbar":{"toolbarCollapse":"ટૂલબાર નાનું કરવું","toolbarExpand":"ટૂલબાર મોટું કરવું","toolbarGroups":{"document":"દસ્તાવેજ","clipboard":"ક્લિપબોર્ડ/અન","editing":"એડીટ કરવું","forms":"ફોર્મ","basicstyles":"બેસિક્ સ્ટાઇલ","paragraph":"ફકરો","links":"લીંક","insert":"ઉમેરવું","styles":"સ્ટાઇલ","colors":"રંગ","tools":"ટૂલ્સ"},"toolbars":"એડીટર ટૂલ બાર"},"elementspath":{"eleLabel":"એલીમેન્ટ્સ નો ","eleTitle":"એલીમેન્ટ %1"},"find":{"find":"શોધવું","findOptions":"વીકલ્પ શોધો","findWhat":"આ શોધો","matchCase":"કેસ સરખા રાખો","matchCyclic":"સરખાવવા બધા","matchWord":"બઘા શબ્દ સરખા રાખો","notFoundMsg":"તમે શોધેલી ટેક્સ્ટ નથી મળી","replace":"રિપ્લેસ/બદલવું","replaceAll":"બઘા બદલી ","replaceSuccessMsg":"%1 ફેરફારો બાદલાયા છે.","replaceWith":"આનાથી બદલો","title":"શોધવું અને બદલવું"},"fakeobjects":{"anchor":"અનકર","flash":"ફ્લેશ ","hiddenfield":"હિડન ","iframe":"IFrame","unknown":"અનનોન ઓબ્જેક્ટ"},"flash":{"access":"સ્ક્રીપ્ટ એક્સેસ","accessAlways":"હમેશાં","accessNever":"નહી","accessSameDomain":"એજ ડોમેન","alignAbsBottom":"Abs નીચે","alignAbsMiddle":"Abs ઉપર","alignBaseline":"આધાર લીટી","alignTextTop":"ટેક્સ્ટ ઉપર","bgcolor":"બૅકગ્રાઉન્ડ રંગ,","chkFull":"ફૂલ સ્ક્રીન કરવું","chkLoop":"લૂપ","chkMenu":"ફ્લૅશ મેન્યૂ નો પ્રયોગ કરો","chkPlay":"ઑટો/સ્વયં પ્લે","flashvars":"ફલેશ ના વિકલ્પો","hSpace":"સમસ્તરીય જગ્યા","properties":"ફ્લૅશના ગુણ","propertiesTab":"ગુણ","quality":"ગુણધર્મ","qualityAutoHigh":"ઓટો ઊંચું","qualityAutoLow":"ઓટો નીચું","qualityBest":"શ્રેષ્ઠ","qualityHigh":"ઊંચું","qualityLow":"નીચું","qualityMedium":"મધ્યમ","scale":"સ્કેલ","scaleAll":"સ્કેલ ઓલ/બધુ બતાવો","scaleFit":"સ્કેલ એકદમ ફીટ","scaleNoBorder":"સ્કેલ બોર્ડર વગર","title":"ફ્લૅશ ગુણ","vSpace":"લંબરૂપ જગ્યા","validateHSpace":"HSpace આંકડો હોવો જોઈએ.","validateSrc":"લિંક  URL ટાઇપ કરો","validateVSpace":"VSpace આંકડો હોવો જોઈએ.","windowMode":"વિન્ડો મોડ","windowModeOpaque":"અપારદર્શક","windowModeTransparent":"પારદર્શક","windowModeWindow":"વિન્ડો"},"font":{"fontSize":{"label":"ફૉન્ટ સાઇઝ/કદ","voiceLabel":"ફોન્ટ સાઈઝ","panelTitle":"ફૉન્ટ સાઇઝ/કદ"},"label":"ફૉન્ટ","panelTitle":"ફૉન્ટ","voiceLabel":"ફોન્ટ"},"forms":{"button":{"title":"બટનના ગુણ","text":"ટેક્સ્ટ (વૅલ્યૂ)","type":"પ્રકાર","typeBtn":"બટન","typeSbm":"સબ્મિટ","typeRst":"રિસેટ"},"checkboxAndRadio":{"checkboxTitle":"ચેક બોક્સ ગુણ","radioTitle":"રેડિઓ બટનના ગુણ","value":"વૅલ્યૂ","selected":"સિલેક્ટેડ"},"form":{"title":"ફૉર્મ/પત્રકના ગુણ","menu":"ફૉર્મ/પત્રકના ગુણ","action":"ક્રિયા","method":"પદ્ધતિ","encoding":"અન્કોડીન્ગ"},"hidden":{"title":"ગુપ્ત ક્ષેત્રના ગુણ","name":"નામ","value":"વૅલ્યૂ"},"select":{"title":"પસંદગી ક્ષેત્રના ગુણ","selectInfo":"સૂચના","opAvail":"ઉપલબ્ધ વિકલ્પ","value":"વૅલ્યૂ","size":"સાઇઝ","lines":"લીટીઓ","chkMulti":"એકથી વધારે પસંદ કરી શકો","opText":"ટેક્સ્ટ","opValue":"વૅલ્યૂ","btnAdd":"ઉમેરવું","btnModify":"બદલવું","btnUp":"ઉપર","btnDown":"નીચે","btnSetValue":"પસંદ કરલી વૅલ્યૂ સેટ કરો","btnDelete":"રદ કરવું"},"textarea":{"title":"ટેક્સ્ટ એઅરિઆ, શબ્દ વિસ્તારના ગુણ","cols":"કૉલમ/ઊભી કટાર","rows":"પંક્તિઓ"},"textfield":{"title":"ટેક્સ્ટ ફીલ્ડ, શબ્દ ક્ષેત્રના ગુણ","name":"નામ","value":"વૅલ્યૂ","charWidth":"કેરેક્ટરની પહોળાઈ","maxChars":"અધિકતમ કેરેક્ટર","type":"ટાઇપ","typeText":"ટેક્સ્ટ","typePass":"પાસવર્ડ","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"ફૉન્ટ ફૉર્મટ, રચનાની શૈલી","panelTitle":"ફૉન્ટ ફૉર્મટ, રચનાની શૈલી","tag_address":"સરનામું","tag_div":"શીર્ષક (DIV)","tag_h1":"શીર્ષક 1","tag_h2":"શીર્ષક 2","tag_h3":"શીર્ષક 3","tag_h4":"શીર્ષક 4","tag_h5":"શીર્ષક 5","tag_h6":"શીર્ષક 6","tag_p":"સામાન્ય","tag_pre":"ફૉર્મટેડ"},"horizontalrule":{"toolbar":"સમસ્તરીય રેખા ઇન્સર્ટ/દાખલ કરવી"},"iframe":{"border":"ફ્રેમ બોર્ડેર બતાવવી","noUrl":"iframe URL ટાઈપ્ કરો","scrolling":"સ્ક્રોલબાર ચાલુ કરવા","title":"IFrame વિકલ્પો","toolbar":"IFrame"},"image":{"alertUrl":"ચિત્રની URL ટાઇપ કરો","alt":"ઑલ્ટર્નટ ટેક્સ્ટ","border":"બોર્ડર","btnUpload":"આ સર્વરને મોકલવું","button2Img":"તમારે ઈમેજ બટનને સાદી ઈમેજમાં બદલવું છે.","hSpace":"સમસ્તરીય જગ્યા","img2Button":"તમારે સાદી ઈમેજને ઈમેજ બટનમાં બદલવું છે.","infoTab":"ચિત્ર ની જાણકારી","linkTab":"લિંક","lockRatio":"લૉક ગુણોત્તર","menu":"ચિત્રના ગુણ","resetSize":"રીસેટ સાઇઝ","title":"ચિત્રના ગુણ","titleButton":"ચિત્ર બટનના ગુણ","upload":"અપલોડ","urlMissing":"ઈમેજની મૂળ URL છે નહી.","vSpace":"લંબરૂપ જગ્યા","validateBorder":"બોર્ડેર આંકડો હોવો જોઈએ.","validateHSpace":"HSpaceઆંકડો હોવો જોઈએ.","validateVSpace":"VSpace આંકડો હોવો જોઈએ. "},"indent":{"indent":"ઇન્ડેન્ટ, લીટીના આરંભમાં જગ્યા વધારવી","outdent":"ઇન્ડેન્ટ લીટીના આરંભમાં જગ્યા ઘટાડવી"},"smiley":{"options":"સમ્ય્લી વિકલ્પો","title":"સ્માઇલી  પસંદ કરો","toolbar":"સ્માઇલી"},"justify":{"block":"બ્લૉક, અંતરાય જસ્ટિફાઇ","center":"સંકેંદ્રણ/સેંટરિંગ","left":"ડાબી બાજુએ/બાજુ તરફ","right":"જમણી બાજુએ/બાજુ તરફ"},"link":{"acccessKey":"ઍક્સેસ કી","advanced":"અડ્વાન્સડ","advisoryContentType":"મુખ્ય કન્ટેન્ટ પ્રકાર","advisoryTitle":"મુખ્ય મથાળું","anchor":{"toolbar":"ઍંકર ઇન્સર્ટ/દાખલ કરવી","menu":"ઍંકરના ગુણ","title":"ઍંકરના ગુણ","name":"ઍંકરનું નામ","errorName":"ઍંકરનું નામ ટાઈપ કરો","remove":"સ્થિર નકરવું"},"anchorId":"ઍંકર એલિમન્ટ Id થી પસંદ કરો","anchorName":"ઍંકર નામથી પસંદ કરો","charset":"લિંક રિસૉર્સ કૅરિક્ટર સેટ","cssClasses":"સ્ટાઇલ-શીટ ક્લાસ","emailAddress":"ઈ-મેલ સરનામું","emailBody":"સંદેશ","emailSubject":"ઈ-મેલ વિષય","id":"Id","info":"લિંક ઇન્ફૉ ટૅબ","langCode":"ભાષા લેખવાની પદ્ધતિ","langDir":"ભાષા લેખવાની પદ્ધતિ","langDirLTR":"ડાબે થી જમણે (LTR)","langDirRTL":"જમણે થી ડાબે (RTL)","menu":" લિંક એડિટ/માં ફેરફાર કરવો","name":"નામ","noAnchors":"(ડૉક્યુમન્ટમાં ઍંકરની સંખ્યા)","noEmail":"ઈ-મેલ સરનામું ટાઇપ કરો","noUrl":"લિંક  URL ટાઇપ કરો","other":"<other> <અન્ય>","popupDependent":"ડિપેન્ડન્ટ (Netscape)","popupFeatures":"પૉપ-અપ વિન્ડો ફીચરસૅ","popupFullScreen":"ફુલ સ્ક્રીન (IE)","popupLeft":"ડાબી બાજુ","popupLocationBar":"લોકેશન બાર","popupMenuBar":"મેન્યૂ બાર","popupResizable":"રીસાઈઝએબલ","popupScrollBars":"સ્ક્રોલ બાર","popupStatusBar":"સ્ટૅટસ બાર","popupToolbar":"ટૂલ બાર","popupTop":"જમણી બાજુ","rel":"સંબંધની સ્થિતિ","selectAnchor":"ઍંકર પસંદ કરો","styles":"સ્ટાઇલ","tabIndex":"ટૅબ ઇન્ડેક્સ","target":"ટાર્ગેટ/લક્ષ્ય","targetFrame":"<ફ્રેમ>","targetFrameName":"ટાર્ગેટ ફ્રેમ નું નામ","targetPopup":"<પૉપ-અપ વિન્ડો>","targetPopupName":"પૉપ-અપ વિન્ડો નું નામ","title":"લિંક","toAnchor":"આ પેજનો ઍંકર","toEmail":"ઈ-મેલ","toUrl":"URL","toolbar":"લિંક ઇન્સર્ટ/દાખલ કરવી","type":"લિંક પ્રકાર","unlink":"લિંક કાઢવી","upload":"અપલોડ"},"list":{"bulletedlist":"બુલેટ સૂચિ","numberedlist":"સંખ્યાંકન સૂચિ"},"liststyle":{"armenian":"અરમેનિયન આંકડા પદ્ધતિ","bulletedTitle":"બુલેટેડ લીસ્ટના ગુણ","circle":"વર્તુળ","decimal":"આંકડા (1, 2, 3, etc.)","decimalLeadingZero":"સુન્ય આગળ આંકડા (01, 02, 03, etc.)","disc":"ડિસ્ક","georgian":"ગેઓર્ગિયન આંકડા પદ્ધતિ (an, ban, gan, etc.)","lowerAlpha":"આલ્ફા નાના (a, b, c, d, e, etc.)","lowerGreek":"ગ્રીક નાના (alpha, beta, gamma, etc.)","lowerRoman":"રોમન નાના (i, ii, iii, iv, v, etc.)","none":"કસુ ","notset":"<સેટ નથી>","numberedTitle":"આંકડાના લીસ્ટના ગુણ","square":"ચોરસ","start":"શરુ કરવું","type":"પ્રકાર","upperAlpha":"આલ્ફા મોટા (A, B, C, D, E, etc.)","upperRoman":"રોમન મોટા (I, II, III, IV, V, etc.)","validateStartNumber":"લીસ્ટના સરુઆતનો આંકડો પુરો હોવો જોઈએ."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"મોટું કરવું","minimize":"નાનું કરવું"},"newpage":{"toolbar":"નવુ પાનું"},"pagebreak":{"alt":"નવું પાનું","toolbar":"ઇન્સર્ટ પેજબ્રેક/પાનાને અલગ કરવું/દાખલ કરવું"},"pastetext":{"button":"પેસ્ટ (ટેક્સ્ટ)","title":"પેસ્ટ (ટેક્સ્ટ)"},"pastefromword":{"confirmCleanup":"તમે જે ટેક્ષ્ત્ કોપી કરી રહ્યા છો ટે વર્ડ ની છે. કોપી કરતા પેહલા સાફ કરવી છે?","error":"પેસ્ટ કરેલો ડેટા ઇન્ટરનલ એરર ના લીથે સાફ કરી શકાયો નથી.","title":"પેસ્ટ (વડૅ ટેક્સ્ટ)","toolbar":"પેસ્ટ (વડૅ ટેક્સ્ટ)"},"preview":{"preview":"પૂર્વદર્શન"},"print":{"toolbar":"પ્રિન્ટ"},"removeformat":{"toolbar":"ફૉર્મટ કાઢવું"},"save":{"toolbar":"સેવ"},"selectall":{"toolbar":"બઘું પસંદ કરવું"},"showblocks":{"toolbar":"બ્લૉક બતાવવું"},"sourcearea":{"toolbar":"મૂળ કે પ્રાથમિક દસ્તાવેજ"},"specialchar":{"options":"સ્પેશિઅલ કરેક્ટરના વિકલ્પો","title":"સ્પેશિઅલ વિશિષ્ટ અક્ષર પસંદ કરો","toolbar":"વિશિષ્ટ અક્ષર ઇન્સર્ટ/દાખલ કરવું"},"scayt":{"about":"SCAYT વિષે","aboutTab":"વિષે","addWord":"શબ્દ ઉમેરવો","allCaps":"ઓલ-કેપ્સ વર્ડ છોડી દો.","dic_create":"બનાવવું","dic_delete":"કાઢી નાખવું","dic_field_name":"શબ્દકોશ નામ","dic_info":"પેહલા User Dictionary, Cookie તરીકે સ્ટોર થાય છે. પણ Cookie ની સમતા ઓછી છે. જયારે User Dictionary, Cookie તરીકે સ્ટોર ના કરી શકાય, ત્યારે તે અમારા સર્વર પર સ્ટોર થાય છે. તમારી વ્યતિગત ડીકસ્નરી ને સર્વર પર સ્ટોર કરવા માટે તમારે તેનું નામ આપવું પડશે. જો તમે તમારી ડીકસ્નરી નું નામ આપેલું હોય તો તમે રિસ્ટોર બટન ક્લીક કરી શકો.","dic_rename":"નવું નામ આપવું","dic_restore":"પાછું ","dictionariesTab":"શબ્દકોશ","disable":"SCAYT ડિસેબલ કરવું","emptyDic":"ડિક્સનરીનું નામ ખાલી ના હોય.","enable":"SCAYT એનેબલ કરવું","ignore":"ઇગ્નોર","ignoreAll":"બધા ઇગ્નોર ","ignoreDomainNames":"ડોમેન નામ છોડી દો.","langs":"ભાષાઓ","languagesTab":"ભાષા","mixedCase":"મિક્સ કેસ વર્ડ છોડી દો.","mixedWithDigits":"આંકડા વાળા શબ્દ છોડી દો.","moreSuggestions":"વધારે વિકલ્પો","opera_title":"ઓપેરામાં સપોર્ટ નથી","options":"વિકલ્પો","optionsTab":"વિકલ્પો","title":"ટાઈપ કરતા સ્પેલ તપાસો","toggle":"SCAYT ટોગલ","noSuggestions":"No suggestion"},"stylescombo":{"label":"શૈલી/રીત","panelTitle":"ફોર્મેટ ","panelTitle1":"બ્લોક ","panelTitle2":"ઈનલાઈન ","panelTitle3":"ઓબ્જેક્ટ પદ્ધતિ"},"table":{"border":"કોઠાની બાજુ(બોર્ડર) સાઇઝ","caption":"મથાળું/કૅપ્શન ","cell":{"menu":"કોષના ખાના","insertBefore":"પહેલાં કોષ ઉમેરવો","insertAfter":"પછી કોષ ઉમેરવો","deleteCell":"કોષ ડિલીટ/કાઢી નાખવો","merge":"કોષ ભેગા કરવા","mergeRight":"જમણી બાજુ ભેગા કરવા","mergeDown":"નીચે ભેગા કરવા","splitHorizontal":"કોષને સમસ્તરીય વિભાજન કરવું","splitVertical":"કોષને સીધું ને ઊભું વિભાજન કરવું","title":"સેલના ગુણ","cellType":"સેલનો પ્રકાર","rowSpan":"આડી કટારની જગ્યા","colSpan":"ઊભી કતારની જગ્યા","wordWrap":"વર્ડ રેપ","hAlign":"સપાટ લાઈનદોરી","vAlign":"ઊભી લાઈનદોરી","alignBaseline":"બસે લાઈન","bgColor":"પાછાળનો રંગ","borderColor":"બોર્ડેર રંગ","data":"સ્વીકૃત માહિતી","header":"મથાળું","yes":"હા","no":"ના","invalidWidth":"સેલની પોહલાઈ આંકડો હોવો જોઈએ.","invalidHeight":"સેલની ઊંચાઈ આંકડો હોવો જોઈએ.","invalidRowSpan":"રો સ્પાન આંકડો હોવો જોઈએ.","invalidColSpan":"કોલમ સ્પાન આંકડો હોવો જોઈએ.","chooseColor":"પસંદ કરવું"},"cellPad":"સેલ પૅડિંગ","cellSpace":"સેલ અંતર","column":{"menu":"કૉલમ/ઊભી કટાર","insertBefore":"પહેલાં કૉલમ/ઊભી કટાર ઉમેરવી","insertAfter":"પછી કૉલમ/ઊભી કટાર ઉમેરવી","deleteColumn":"કૉલમ/ઊભી કટાર ડિલીટ/કાઢી નાખવી"},"columns":"કૉલમ/ઊભી કટાર","deleteTable":"કોઠો ડિલીટ/કાઢી નાખવું","headers":"મથાળા","headersBoth":"બેવું","headersColumn":"પહેલી ઊભી કટાર","headersNone":"નથી ","headersRow":"પહેલી  કટાર","invalidBorder":"બોર્ડર એક આંકડો હોવો જોઈએ","invalidCellPadding":"સેલની અંદરની જગ્યા સુન્ય કરતા વધારે હોવી જોઈએ.","invalidCellSpacing":"સેલ વચ્ચેની જગ્યા સુન્ય કરતા વધારે હોવી જોઈએ.","invalidCols":"ઉભી કટાર, 0 કરતા વધારે હોવી જોઈએ.","invalidHeight":"ટેબલની ઊંચાઈ આંકડો હોવો જોઈએ.","invalidRows":"આડી કટાર, 0 કરતા વધારે હોવી જોઈએ.","invalidWidth":"ટેબલની પોહલાઈ આંકડો હોવો જોઈએ.","menu":"ટેબલ, કોઠાનું મથાળું","row":{"menu":"પંક્તિના ખાના","insertBefore":"પહેલાં પંક્તિ ઉમેરવી","insertAfter":"પછી પંક્તિ ઉમેરવી","deleteRow":"પંક્તિઓ ડિલીટ/કાઢી નાખવી"},"rows":"પંક્તિના ખાના","summary":"ટૂંકો એહેવાલ","title":"ટેબલ, કોઠાનું મથાળું","toolbar":"ટેબલ, કોઠો","widthPc":"પ્રતિશત","widthPx":"પિકસલ","widthUnit":"પોહાલાઈ એકમ"},"undo":{"redo":"રિડૂ; પછી હતી એવી સ્થિતિ પાછી લાવવી","undo":"રદ કરવું; પહેલાં હતી એવી સ્થિતિ પાછી લાવવી"},"wsc":{"btnIgnore":"ઇગ્નોર/અવગણના કરવી","btnIgnoreAll":"બધાની ઇગ્નોર/અવગણના કરવી","btnReplace":"બદલવું","btnReplaceAll":"બધા બદલી કરો","btnUndo":"અન્ડૂ","changeTo":"આનાથી બદલવું","errorLoading":"સર્વિસ એપ્લીકેશન લોડ નથી થ: %s.","ieSpellDownload":"સ્પેલ-ચેકર ઇન્સ્ટોલ નથી. શું તમે ડાઉનલોડ કરવા માંગો છો?","manyChanges":"શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: %1 શબ્દ બદલયા છે","noChanges":"શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: એકપણ શબ્દ બદલયો નથી","noMispell":"શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: ખોટી જોડણી મળી નથી","noSuggestions":"- કઇ સજેશન નથી -","notAvailable":"માફ કરશો, આ સુવિધા ઉપલબ્ધ નથી","notInDic":"શબ્દકોશમાં નથી","oneChange":"શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: એક શબ્દ બદલયો છે","progress":"શબ્દની જોડણી/સ્પેલ ચેક ચાલુ છે...","title":"સ્પેલ ","toolbar":"જોડણી (સ્પેલિંગ) તપાસવી"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/he.js b/htmltest/sites/all/libraries/ckeditor-version/lang/he.js
new file mode 100644
index 00000000..48d6739e
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/he.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['he']={"editor":"עורך טקסט עשיר","common":{"editorHelp":"לחץ אלט ALT + 0 לעזרה","browseServer":"סייר השרת","url":"כתובת (URL)","protocol":"פרוטוקול","upload":"העלאה","uploadSubmit":"שליחה לשרת","image":"תמונה","flash":"פלאש","form":"טופס","checkbox":"תיבת סימון","radio":"לחצן אפשרויות","textField":"שדה טקסט","textarea":"איזור טקסט","hiddenField":"שדה חבוי","button":"כפתור","select":"שדה בחירה","imageButton":"כפתור תמונה","notSet":"<לא נקבע>","id":"זיהוי (ID)","name":"שם","langDir":"כיוון שפה","langDirLtr":"שמאל לימין (LTR)","langDirRtl":"ימין לשמאל (RTL)","langCode":"קוד שפה","longDescr":"קישור לתיאור מפורט","cssClass":"מחלקת עיצוב (CSS Class)","advisoryTitle":"כותרת מוצעת","cssStyle":"סגנון","ok":"אישור","cancel":"ביטול","close":"סגירה","preview":"תצוגה מקדימה","resize":"יש לגרור בכדי לשנות את הגודל","generalTab":"כללי","advancedTab":"אפשרויות מתקדמות","validateNumberFailed":"הערך חייב להיות מספרי.","confirmNewPage":"כל השינויים שלא נשמרו יאבדו. האם להעלות דף חדש?","confirmCancel":"חלק מהאפשרויות שונו, האם לסגור את הדיאלוג?","options":"אפשרויות","target":"מטרה","targetNew":"חלון חדש (_blank)","targetTop":"החלון העליון ביותר (_top)","targetSelf":"אותו חלון (_self)","targetParent":"חלון האב (_parent)","langDirLTR":"שמאל לימין (LTR)","langDirRTL":"ימין לשמאל (RTL)","styles":"סגנון","cssClasses":"מחלקות גליונות סגנון","width":"רוחב","height":"גובה","align":"יישור","alignLeft":"לשמאל","alignRight":"לימין","alignCenter":"מרכז","alignTop":"למעלה","alignMiddle":"לאמצע","alignBottom":"לתחתית","invalidValue":"ערך לא חוקי.","invalidHeight":"הגובה חייב להיות מספר.","invalidWidth":"הרוחב חייב להיות מספר.","invalidCssLength":"הערך שצוין לשדה \"%1\" חייב להיות מספר חיובי עם או ללא יחידת מידה חוקית של CSS (px, %, in, cm, mm, em, ex, pt, או pc).","invalidHtmlLength":"הערך שצוין לשדה \"%1\" חייב להיות מספר חיובי עם או ללא יחידת מידה חוקית של HTML (px או %).","invalidInlineStyle":"הערך שצויין לשדה הסגנון חייב להכיל זוג ערכים אחד או יותר בפורמט \"שם : ערך\", מופרדים על ידי נקודה-פסיק.","cssLengthTooltip":"יש להכניס מספר המייצג פיקסלים או מספר עם יחידת גליונות סגנון תקינה (px, %, in, cm, mm, em, ex, pt, או pc).","unavailable":"%1<span class=\"cke_accessibility\">, לא זמין</span>"},"about":{"copy":"Copyright &copy; $1. כל הזכויות שמורות.","dlgTitle":"אודות CKEditor","help":"היכנסו ל$1 לעזרה.","moreInfo":"למידע נוסף בקרו באתרנו:","title":"אודות CKEditor","userGuide":"מדריך המשתמש של CKEditor"},"basicstyles":{"bold":"מודגש","italic":"נטוי","strike":"כתיב מחוק","subscript":"כתיב תחתון","superscript":"כתיב עליון","underline":"קו תחתון"},"bidi":{"ltr":"כיוון טקסט משמאל לימין (LTR)","rtl":"כיוון טקסט מימין לשמאל (RTL)"},"blockquote":{"toolbar":"בלוק ציטוט"},"clipboard":{"copy":"העתקה","copyError":"הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות העתקה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+C).","cut":"גזירה","cutError":"הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות גזירה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+X).","paste":"הדבקה","pasteArea":"איזור הדבקה","pasteMsg":"נא להדביק בתוך הקופסה באמצעות (<b>Ctrl/Cmd+V</b>) וללחוץ על <b>אישור</b>.","securityMsg":"עקב הגדרות אבטחה בדפדפן, לא ניתן לגשת אל לוח הגזירים (Clipboard) בצורה ישירה. נא להדביק שוב בחלון זה.","title":"הדבקה"},"colorbutton":{"auto":"אוטומטי","bgColorTitle":"צבע רקע","colors":{"000":"שחור","800000":"סגול כהה","8B4513":"חום בהיר","2F4F4F":"אפור צפחה","008080":"כחול-ירוק","000080":"כחול-סגול","4B0082":"אינדיגו","696969":"אפור מעומעם","B22222":"אדום-חום","A52A2A":"חום","DAA520":"כתום זהב","006400":"ירוק כהה","40E0D0":"טורקיז","0000CD":"כחול בינוני","800080":"סגול","808080":"אפור","F00":"אדום","FF8C00":"כתום כהה","FFD700":"זהב","008000":"ירוק","0FF":"ציאן","00F":"כחול","EE82EE":"סגלגל","A9A9A9":"אפור כהה","FFA07A":"כתום-וורוד","FFA500":"כתום","FFFF00":"צהוב","00FF00":"ליים","AFEEEE":"טורקיז בהיר","ADD8E6":"כחול בהיר","DDA0DD":"שזיף","D3D3D3":"אפור בהיר","FFF0F5":"לבנדר מסמיק","FAEBD7":"לבן עתיק","FFFFE0":"צהוב בהיר","F0FFF0":"טל דבש","F0FFFF":"תכלת","F0F8FF":"כחול טיפת מים","E6E6FA":"לבנדר","FFF":"לבן"},"more":"צבעים נוספים...","panelTitle":"צבעים","textColorTitle":"צבע טקסט"},"colordialog":{"clear":"ניקוי","highlight":"סימון","options":"אפשרויות צבע","selected":"בחירה","title":"בחירת צבע"},"templates":{"button":"תבניות","emptyListMsg":"(לא הוגדרו תבניות)","insertOption":"החלפת תוכן ממשי","options":"אפשרויות התבניות","selectPromptMsg":"יש לבחור תבנית לפתיחה בעורך.<br />התוכן המקורי ימחק:","title":"תביות תוכן"},"contextmenu":{"options":"אפשרויות תפריט ההקשר"},"div":{"IdInputLabel":"מזהה (ID)","advisoryTitleInputLabel":"כותרת מוצעת","cssClassInputLabel":"מחלקת עיצוב","edit":"עריכת מיכל (Div)","inlineStyleInputLabel":"סגנון פנימי","langDirLTRLabel":"שמאל לימין (LTR)","langDirLabel":"כיוון שפה","langDirRTLLabel":"ימין לשמאל (RTL)","languageCodeInputLabel":"קוד שפה","remove":"הסרת מיכל (Div)","styleSelectLabel":"סגנון","title":"יצירת מיכל (Div)","toolbar":"יצירת מיכל (Div)"},"toolbar":{"toolbarCollapse":"מזעור סרגל כלים","toolbarExpand":"הרחבת סרגל כלים","toolbarGroups":{"document":"מסמך","clipboard":"לוח הגזירים (Clipboard)/צעד אחרון","editing":"עריכה","forms":"טפסים","basicstyles":"עיצוב בסיסי","paragraph":"פסקה","links":"קישורים","insert":"הכנסה","styles":"עיצוב","colors":"צבעים","tools":"כלים"},"toolbars":"סרגלי כלים של העורך"},"elementspath":{"eleLabel":"עץ האלמנטים","eleTitle":"%1 אלמנט"},"find":{"find":"חיפוש","findOptions":"אפשרויות חיפוש","findWhat":"חיפוש מחרוזת:","matchCase":"הבחנה בין אותיות רשיות לקטנות (Case)","matchCyclic":"התאמה מחזורית","matchWord":"התאמה למילה המלאה","notFoundMsg":"הטקסט המבוקש לא נמצא.","replace":"החלפה","replaceAll":"החלפה בכל העמוד","replaceSuccessMsg":"%1 טקסטים הוחלפו.","replaceWith":"החלפה במחרוזת:","title":"חיפוש והחלפה"},"fakeobjects":{"anchor":"עוגן","flash":"סרטון פלאש","hiddenfield":"שדה חבוי","iframe":"חלון פנימי (iframe)","unknown":"אובייקט לא ידוע"},"flash":{"access":"גישת סקריפט","accessAlways":"תמיד","accessNever":"אף פעם","accessSameDomain":"דומיין זהה","alignAbsBottom":"לתחתית האבסולוטית","alignAbsMiddle":"מרכוז אבסולוטי","alignBaseline":"לקו התחתית","alignTextTop":"לראש הטקסט","bgcolor":"צבע רקע","chkFull":"אפשר חלון מלא","chkLoop":"לולאה","chkMenu":"אפשר תפריט פלאש","chkPlay":"ניגון אוטומטי","flashvars":"משתנים לפלאש","hSpace":"מרווח אופקי","properties":"מאפייני פלאש","propertiesTab":"מאפיינים","quality":"איכות","qualityAutoHigh":"גבוהה אוטומטית","qualityAutoLow":"נמוכה אוטומטית","qualityBest":"מעולה","qualityHigh":"גבוהה","qualityLow":"נמוכה","qualityMedium":"ממוצעת","scale":"גודל","scaleAll":"הצג הכל","scaleFit":"התאמה מושלמת","scaleNoBorder":"ללא גבולות","title":"מאפיני פלאש","vSpace":"מרווח אנכי","validateHSpace":"המרווח האופקי חייב להיות מספר.","validateSrc":"יש להקליד את כתובת סרטון הפלאש (URL)","validateVSpace":"המרווח האנכי חייב להיות מספר.","windowMode":"מצב חלון","windowModeOpaque":"אטום","windowModeTransparent":"שקוף","windowModeWindow":"חלון"},"font":{"fontSize":{"label":"גודל","voiceLabel":"גודל","panelTitle":"גודל"},"label":"גופן","panelTitle":"גופן","voiceLabel":"גופן"},"forms":{"button":{"title":"מאפייני כפתור","text":"טקסט (ערך)","type":"סוג","typeBtn":"כפתור","typeSbm":"שליחה","typeRst":"איפוס"},"checkboxAndRadio":{"checkboxTitle":"מאפייני תיבת סימון","radioTitle":"מאפייני לחצן אפשרויות","value":"ערך","selected":"מסומן"},"form":{"title":"מאפיני טופס","menu":"מאפיני טופס","action":"שלח אל","method":"סוג שליחה","encoding":"קידוד"},"hidden":{"title":"מאפיני שדה חבוי","name":"שם","value":"ערך"},"select":{"title":"מאפייני שדה בחירה","selectInfo":"מידע","opAvail":"אפשרויות זמינות","value":"ערך","size":"גודל","lines":"שורות","chkMulti":"איפשור בחירות מרובות","opText":"טקסט","opValue":"ערך","btnAdd":"הוספה","btnModify":"שינוי","btnUp":"למעלה","btnDown":"למטה","btnSetValue":"קביעה כברירת מחדל","btnDelete":"מחיקה"},"textarea":{"title":"מאפייני איזור טקסט","cols":"עמודות","rows":"שורות"},"textfield":{"title":"מאפייני שדה טקסט","name":"שם","value":"ערך","charWidth":"רוחב לפי תווים","maxChars":"מקסימום תווים","type":"סוג","typeText":"טקסט","typePass":"סיסמה","typeEmail":"דוא\"ל","typeSearch":"חיפוש","typeTel":"מספר טלפון","typeUrl":"כתובת (URL)"}},"format":{"label":"עיצוב","panelTitle":"עיצוב","tag_address":"כתובת","tag_div":"נורמלי (DIV)","tag_h1":"כותרת","tag_h2":"כותרת 2","tag_h3":"כותרת 3","tag_h4":"כותרת 4","tag_h5":"כותרת 5","tag_h6":"כותרת 6","tag_p":"נורמלי","tag_pre":"קוד"},"horizontalrule":{"toolbar":"הוספת קו אופקי"},"iframe":{"border":"הראה מסגרת לחלון","noUrl":"יש להכניס כתובת לחלון.","scrolling":"אפשר פסי גלילה","title":"מאפייני חלון פנימי (iframe)","toolbar":"חלון פנימי (iframe)"},"image":{"alertUrl":"יש להקליד את כתובת התמונה","alt":"טקסט חלופי","border":"מסגרת","btnUpload":"שליחה לשרת","button2Img":"האם להפוך את תמונת הכפתור לתמונה פשוטה?","hSpace":"מרווח אופקי","img2Button":"האם להפוך את התמונה לכפתור תמונה?","infoTab":"מידע על התמונה","linkTab":"קישור","lockRatio":"נעילת היחס","menu":"תכונות התמונה","resetSize":"איפוס הגודל","title":"מאפייני התמונה","titleButton":"מאפיני כפתור תמונה","upload":"העלאה","urlMissing":"כתובת התמונה חסרה.","vSpace":"מרווח אנכי","validateBorder":"שדה המסגרת חייב להיות מספר שלם.","validateHSpace":"שדה המרווח האופקי חייב להיות מספר שלם.","validateVSpace":"שדה המרווח האנכי חייב להיות מספר שלם."},"indent":{"indent":"הגדלת הזחה","outdent":"הקטנת הזחה"},"smiley":{"options":"אפשרויות סמיילים","title":"הוספת סמיילי","toolbar":"סמיילי"},"justify":{"block":"יישור לשוליים","center":"מרכוז","left":"יישור לשמאל","right":"יישור לימין"},"link":{"acccessKey":"מקש גישה","advanced":"אפשרויות מתקדמות","advisoryContentType":"Content Type מוצע","advisoryTitle":"כותרת מוצעת","anchor":{"toolbar":"הוספת/עריכת נקודת עיגון","menu":"מאפייני נקודת עיגון","title":"מאפייני נקודת עיגון","name":"שם לנקודת עיגון","errorName":"יש להקליד שם לנקודת עיגון","remove":"מחיקת נקודת עיגון"},"anchorId":"עפ\"י זיהוי (ID) האלמנט","anchorName":"עפ\"י שם העוגן","charset":"קידוד המשאב המקושר","cssClasses":"גיליונות עיצוב קבוצות","emailAddress":"כתובת הדוא\"ל","emailBody":"גוף ההודעה","emailSubject":"נושא ההודעה","id":"זיהוי (ID)","info":"מידע על הקישור","langCode":"קוד שפה","langDir":"כיוון שפה","langDirLTR":"שמאל לימין (LTR)","langDirRTL":"ימין לשמאל (RTL)","menu":"מאפייני קישור","name":"שם","noAnchors":"(אין עוגנים זמינים בדף)","noEmail":"יש להקליד את כתובת הדוא\"ל","noUrl":"יש להקליד את כתובת הקישור (URL)","other":"<אחר>","popupDependent":"תלוי (Netscape)","popupFeatures":"תכונות החלון הקופץ","popupFullScreen":"מסך מלא (IE)","popupLeft":"מיקום צד שמאל","popupLocationBar":"סרגל כתובת","popupMenuBar":"סרגל תפריט","popupResizable":"שינוי גודל","popupScrollBars":"ניתן לגלילה","popupStatusBar":"סרגל חיווי","popupToolbar":"סרגל הכלים","popupTop":"מיקום צד עליון","rel":"קשר גומלין","selectAnchor":"בחירת עוגן","styles":"סגנון","tabIndex":"מספר טאב","target":"מטרה","targetFrame":"<מסגרת>","targetFrameName":"שם מסגרת היעד","targetPopup":"<חלון קופץ>","targetPopupName":"שם החלון הקופץ","title":"קישור","toAnchor":"עוגן בעמוד זה","toEmail":"דוא\"ל","toUrl":"כתובת (URL)","toolbar":"הוספת/עריכת קישור","type":"סוג קישור","unlink":"הסרת הקישור","upload":"העלאה"},"list":{"bulletedlist":"רשימת נקודות","numberedlist":"רשימה ממוספרת"},"liststyle":{"armenian":"ספרות ארמניות","bulletedTitle":"תכונות רשימת תבליטים","circle":"עיגול ריק","decimal":"ספרות (1, 2, 3 וכו')","decimalLeadingZero":"ספרות עם 0 בהתחלה (01, 02, 03 וכו')","disc":"עיגול מלא","georgian":"ספרות גיאורגיות (an, ban, gan וכו')","lowerAlpha":"אותיות אנגליות קטנות (a, b, c, d, e וכו')","lowerGreek":"אותיות יווניות קטנות (alpha, beta, gamma וכו')","lowerRoman":"ספירה רומית באותיות קטנות (i, ii, iii, iv, v וכו')","none":"ללא","notset":"<לא נקבע>","numberedTitle":"תכונות רשימה ממוספרת","square":"ריבוע","start":"תחילת מספור","type":"סוג","upperAlpha":"אותיות אנגליות גדולות (A, B, C, D, E וכו')","upperRoman":"ספירה רומיות באותיות גדולות (I, II, III, IV, V וכו')","validateStartNumber":"שדה תחילת המספור חייב להכיל מספר שלם."},"magicline":{"title":"הכנס פסקה כאן"},"maximize":{"maximize":"הגדלה למקסימום","minimize":"הקטנה למינימום"},"newpage":{"toolbar":"דף חדש"},"pagebreak":{"alt":"שבירת דף","toolbar":"הוספת שבירת דף"},"pastetext":{"button":"הדבקה כטקסט פשוט","title":"הדבקה כטקסט פשוט"},"pastefromword":{"confirmCleanup":"נראה הטקסט שבכוונתך להדביק מקורו בקובץ וורד. האם ברצונך לנקות אותו טרם ההדבקה?","error":"לא ניתן היה לנקות את המידע בשל תקלה פנימית.","title":"הדבקה מ-Word","toolbar":"הדבקה מ-Word"},"preview":{"preview":"תצוגה מקדימה"},"print":{"toolbar":"הדפסה"},"removeformat":{"toolbar":"הסרת העיצוב"},"save":{"toolbar":"שמירה"},"selectall":{"toolbar":"בחירת הכל"},"showblocks":{"toolbar":"הצגת בלוקים"},"sourcearea":{"toolbar":"מקור"},"specialchar":{"options":"אפשרויות תווים מיוחדים","title":"בחירת תו מיוחד","toolbar":"הוספת תו מיוחד"},"scayt":{"about":"אודות SCAYT","aboutTab":"אודות","addWord":"הוספת מילה","allCaps":"התעלם ממילים שכל אותיותיהן גדולות","dic_create":"יצירה","dic_delete":"מחיקה","dic_field_name":"שם המילון","dic_info":"בהתחלה מילון המשתמש מאוחסן בעוגיה, אך עוגיות מוגבלות במקום. כאשר המילון מגיע לגודל בו הוא אינו יכול להתאכסן בעוגיה, המילון צריך להתאכסן בשרתנו. לשם כך עליך לתת שם למילון. אם כבר יש לך מילון מאוחסן, יש להכניס את שמו וללחוץ על כפתור השחזור.","dic_rename":"שינוי שם","dic_restore":"שחזור","dictionariesTab":"מילון","disable":"בטל SCAYT","emptyDic":"יש לבחור מילון.","enable":"אפשר SCAYT","ignore":"התעלמות","ignoreAll":"התעלמות מהכל","ignoreDomainNames":"התעלם משמות מתחם","langs":"שפות","languagesTab":"שפות","mixedCase":"התעלם ממילים עם אותיות גדולות וקטנות ביחד","mixedWithDigits":"התעלם ממילים עם מספרים","moreSuggestions":"הצעות נוספות","opera_title":"לא זמין בדפדפן אופרה","options":"אפשרויות","optionsTab":"אפשרויות","title":"בדיקת איות בזמן כתיבה (SCAYT)","toggle":"שינוי SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"סגנון","panelTitle":"סגנונות פורמט","panelTitle1":"סגנונות בלוק","panelTitle2":"סגנונות רצף","panelTitle3":"סגנונות אובייקט"},"table":{"border":"גודל מסגרת","caption":"כיתוב","cell":{"menu":"מאפייני תא","insertBefore":"הוספת תא לפני","insertAfter":"הוספת תא אחרי","deleteCell":"מחיקת תאים","merge":"מיזוג תאים","mergeRight":"מזג ימינה","mergeDown":"מזג למטה","splitHorizontal":"פיצול תא אופקית","splitVertical":"פיצול תא אנכית","title":"תכונות התא","cellType":"סוג התא","rowSpan":"מתיחת השורות","colSpan":"מתיחת התאים","wordWrap":"מניעת גלישת שורות","hAlign":"יישור אופקי","vAlign":"יישור אנכי","alignBaseline":"שורת בסיס","bgColor":"צבע רקע","borderColor":"צבע מסגרת","data":"מידע","header":"כותרת","yes":"כן","no":"לא","invalidWidth":"שדה רוחב התא חייב להיות מספר.","invalidHeight":"שדה גובה התא חייב להיות מספר.","invalidRowSpan":"שדה מתיחת השורות חייב להיות מספר שלם.","invalidColSpan":"שדה מתיחת העמודות חייב להיות מספר שלם.","chooseColor":"בחר"},"cellPad":"ריפוד תא","cellSpace":"מרווח תא","column":{"menu":"עמודה","insertBefore":"הוספת עמודה לפני","insertAfter":"הוספת עמודה אחרי","deleteColumn":"מחיקת עמודות"},"columns":"עמודות","deleteTable":"מחק טבלה","headers":"כותרות","headersBoth":"שניהם","headersColumn":"עמודה ראשונה","headersNone":"אין","headersRow":"שורה ראשונה","invalidBorder":"שדה גודל המסגרת חייב להיות מספר.","invalidCellPadding":"שדה ריפוד התאים חייב להיות מספר חיובי.","invalidCellSpacing":"שדה ריווח התאים חייב להיות מספר חיובי.","invalidCols":"שדה מספר העמודות חייב להיות מספר גדול מ 0.","invalidHeight":"שדה גובה הטבלה חייב להיות מספר.","invalidRows":"שדה מספר השורות חייב להיות מספר גדול מ 0.","invalidWidth":"שדה רוחב הטבלה חייב להיות מספר.","menu":"מאפייני טבלה","row":{"menu":"שורה","insertBefore":"הוספת שורה לפני","insertAfter":"הוספת שורה אחרי","deleteRow":"מחיקת שורות"},"rows":"שורות","summary":"תקציר","title":"מאפייני טבלה","toolbar":"טבלה","widthPc":"אחוז","widthPx":"פיקסלים","widthUnit":"יחידת רוחב"},"undo":{"redo":"חזרה על צעד אחרון","undo":"ביטול צעד אחרון"},"wsc":{"btnIgnore":"התעלמות","btnIgnoreAll":"התעלמות מהכל","btnReplace":"החלפה","btnReplaceAll":"החלפת הכל","btnUndo":"החזרה","changeTo":"שינוי ל","errorLoading":"שגיאה בהעלאת השירות: %s.","ieSpellDownload":"בודק האיות לא מותקן, האם להורידו?","manyChanges":"בדיקות איות הסתיימה: %1 מילים שונו","noChanges":"בדיקות איות הסתיימה: לא שונתה אף מילה","noMispell":"בדיקות איות הסתיימה: לא נמצאו שגיאות כתיב","noSuggestions":"- אין הצעות -","notAvailable":"לא נמצא שירות זמין.","notInDic":"לא נמצא במילון","oneChange":"בדיקות איות הסתיימה: שונתה מילה אחת","progress":"בודק האיות בתהליך בדיקה....","title":"בדיקת איות","toolbar":"בדיקת איות"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/hi.js b/htmltest/sites/all/libraries/ckeditor-version/lang/hi.js
new file mode 100644
index 00000000..5f9ed9c6
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/hi.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['hi']={"editor":"रिच टेक्स्ट एडिटर","common":{"editorHelp":"मदद के लिये ALT 0 दबाए","browseServer":"सर्वर ब्राउज़ करें","url":"URL","protocol":"प्रोटोकॉल","upload":"अपलोड","uploadSubmit":"इसे सर्वर को भेजें","image":"तस्वीर","flash":"फ़्लैश","form":"फ़ॉर्म","checkbox":"चॅक बॉक्स","radio":"रेडिओ बटन","textField":"टेक्स्ट फ़ील्ड","textarea":"टेक्स्ट एरिया","hiddenField":"गुप्त फ़ील्ड","button":"बटन","select":"चुनाव फ़ील्ड","imageButton":"तस्वीर बटन","notSet":"<सॅट नहीं>","id":"Id","name":"नाम","langDir":"भाषा लिखने की दिशा","langDirLtr":"बायें से दायें (LTR)","langDirRtl":"दायें से बायें (RTL)","langCode":"भाषा कोड","longDescr":"अधिक विवरण के लिए URL","cssClass":"स्टाइल-शीट क्लास","advisoryTitle":"परामर्श शीर्शक","cssStyle":"स्टाइल","ok":"ठीक है","cancel":"रद्द करें","close":"Close","preview":"प्रीव्यू","resize":"Resize","generalTab":"सामान्य","advancedTab":"ऍड्वान्स्ड","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"टार्गेट","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"बायें से दायें (LTR)","langDirRTL":"दायें से बायें (RTL)","styles":"स्टाइल","cssClasses":"स्टाइल-शीट क्लास","width":"चौड़ाई","height":"ऊँचाई","align":"ऍलाइन","alignLeft":"दायें","alignRight":"दायें","alignCenter":"बीच में","alignTop":"ऊपर","alignMiddle":"मध्य","alignBottom":"नीचे","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"बोल्ड","italic":"इटैलिक","strike":"स्ट्राइक थ्रू","subscript":"अधोलेख","superscript":"अभिलेख","underline":"रेखांकण"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"ब्लॉक-कोट"},"clipboard":{"copy":"कॉपी","copyError":"आपके ब्राआउज़र की सुरक्षा सॅटिन्ग्स ने कॉपी करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+C) का प्रयोग करें।","cut":"कट","cutError":"आपके ब्राउज़र की सुरक्षा सॅटिन्ग्स ने कट करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+X) का प्रयोग करें।","paste":"पेस्ट","pasteArea":"Paste Area","pasteMsg":"Ctrl/Cmd+V का प्रयोग करके पेस्ट करें और ठीक है करें.","securityMsg":"आपके ब्राउज़र की सुरक्षा आपके ब्राउज़र की सुरKश सैटिंग के कारण, एडिटर आपके क्लिपबोर्ड डेटा को नहीं पा सकता है. आपको उसे इस विन्डो में दोबारा पेस्ट करना होगा.","title":"पेस्ट"},"colorbutton":{"auto":"स्वचालित","bgColorTitle":"बैक्ग्राउन्ड रंग","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"और रंग...","panelTitle":"Colors","textColorTitle":"टेक्स्ट रंग"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"टॅम्प्लेट","emptyListMsg":"(कोई टॅम्प्लेट डिफ़ाइन नहीं किया गया है)","insertOption":"मूल शब्दों को बदलें","options":"Template Options","selectPromptMsg":"ऍडिटर में ओपन करने हेतु टॅम्प्लेट चुनें(वर्तमान कन्टॅन्ट सेव नहीं होंगे):","title":"कन्टेन्ट टॅम्प्लेट"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"परामर्श शीर्शक","cssClassInputLabel":"स्टाइल-शीट क्लास","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"बायें से दायें (LTR)","langDirLabel":"भाषा लिखने की दिशा","langDirRTLLabel":"दायें से बायें (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"स्टाइल","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"एडिटर टूलबार"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"खोजें","findOptions":"Find Options","findWhat":"यह खोजें:","matchCase":"केस मिलायें","matchCyclic":"Match cyclic","matchWord":"पूरा शब्द मिलायें","notFoundMsg":"आपके द्वारा दिया गया टेक्स्ट नहीं मिला","replace":"रीप्लेस","replaceAll":"सभी रिप्लेस करें","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"इससे रिप्लेस करें:","title":"खोजें और बदलें"},"fakeobjects":{"anchor":"ऐंकर इन्सर्ट/संपादन","flash":"Flash Animation","hiddenfield":"गुप्त फ़ील्ड","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"Abs नीचे","alignAbsMiddle":"Abs ऊपर","alignBaseline":"मूल रेखा","alignTextTop":"टेक्स्ट ऊपर","bgcolor":"बैक्ग्राउन्ड रंग","chkFull":"Allow Fullscreen","chkLoop":"लूप","chkMenu":"फ़्लैश मॅन्यू का प्रयोग करें","chkPlay":"ऑटो प्ले","flashvars":"Variables for Flash","hSpace":"हॉरिज़ॉन्टल स्पेस","properties":"फ़्लैश प्रॉपर्टीज़","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"स्केल","scaleAll":"सभी दिखायें","scaleFit":"बिल्कुल फ़िट","scaleNoBorder":"कोई बॉर्डर नहीं","title":"फ़्लैश प्रॉपर्टीज़","vSpace":"वर्टिकल स्पेस","validateHSpace":"HSpace must be a number.","validateSrc":"लिंक URL टाइप करें","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"साइज़","voiceLabel":"Font Size","panelTitle":"साइज़"},"label":"फ़ॉन्ट","panelTitle":"फ़ॉन्ट","voiceLabel":"फ़ॉन्ट"},"forms":{"button":{"title":"बटन प्रॉपर्टीज़","text":"टेक्स्ट (वैल्यू)","type":"प्रकार","typeBtn":"बटन","typeSbm":"सब्मिट","typeRst":"रिसेट"},"checkboxAndRadio":{"checkboxTitle":"चॅक बॉक्स प्रॉपर्टीज़","radioTitle":"रेडिओ बटन प्रॉपर्टीज़","value":"वैल्यू","selected":"सॅलॅक्टॅड"},"form":{"title":"फ़ॉर्म प्रॉपर्टीज़","menu":"फ़ॉर्म प्रॉपर्टीज़","action":"क्रिया","method":"तरीका","encoding":"Encoding"},"hidden":{"title":"गुप्त फ़ील्ड प्रॉपर्टीज़","name":"नाम","value":"वैल्यू"},"select":{"title":"चुनाव फ़ील्ड प्रॉपर्टीज़","selectInfo":"सूचना","opAvail":"उपलब्ध विकल्प","value":"वैल्यू","size":"साइज़","lines":"पंक्तियाँ","chkMulti":"एक से ज्यादा विकल्प चुनने दें","opText":"टेक्स्ट","opValue":"वैल्यू","btnAdd":"जोड़ें","btnModify":"बदलें","btnUp":"ऊपर","btnDown":"नीचे","btnSetValue":"चुनी गई वैल्यू सॅट करें","btnDelete":"डिलीट"},"textarea":{"title":"टेक्स्त एरिया प्रॉपर्टीज़","cols":"कालम","rows":"पंक्तियां"},"textfield":{"title":"टेक्स्ट फ़ील्ड प्रॉपर्टीज़","name":"नाम","value":"वैल्यू","charWidth":"करॅक्टर की चौढ़ाई","maxChars":"अधिकतम करॅक्टर","type":"टाइप","typeText":"टेक्स्ट","typePass":"पास्वर्ड","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"फ़ॉर्मैट","panelTitle":"फ़ॉर्मैट","tag_address":"पता","tag_div":"शीर्षक (DIV)","tag_h1":"शीर्षक 1","tag_h2":"शीर्षक 2","tag_h3":"शीर्षक 3","tag_h4":"शीर्षक 4","tag_h5":"शीर्षक 5","tag_h6":"शीर्षक 6","tag_p":"साधारण","tag_pre":"फ़ॉर्मैटॅड"},"horizontalrule":{"toolbar":"हॉरिज़ॉन्टल रेखा इन्सर्ट करें"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"तस्वीर का URL टाइप करें ","alt":"वैकल्पिक टेक्स्ट","border":"बॉर्डर","btnUpload":"इसे सर्वर को भेजें","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"हॉरिज़ॉन्टल स्पेस","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"तस्वीर की जानकारी","linkTab":"लिंक","lockRatio":"लॉक अनुपात","menu":"तस्वीर प्रॉपर्टीज़","resetSize":"रीसॅट साइज़","title":"तस्वीर प्रॉपर्टीज़","titleButton":"तस्वीर बटन प्रॉपर्टीज़","upload":"अपलोड","urlMissing":"Image source URL is missing.","vSpace":"वर्टिकल स्पेस","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"इन्डॅन्ट बढ़ायें","outdent":"इन्डॅन्ट कम करें"},"smiley":{"options":"Smiley Options","title":"स्माइली इन्सर्ट करें","toolbar":"स्माइली"},"justify":{"block":"ब्लॉक जस्टीफ़ाई","center":"बीच में","left":"बायीं तरफ","right":"दायीं तरफ"},"link":{"acccessKey":"ऍक्सॅस की","advanced":"ऍड्वान्स्ड","advisoryContentType":"परामर्श कन्टॅन्ट प्रकार","advisoryTitle":"परामर्श शीर्शक","anchor":{"toolbar":"ऐंकर इन्सर्ट/संपादन","menu":"ऐंकर प्रॉपर्टीज़","title":"ऐंकर प्रॉपर्टीज़","name":"ऐंकर का नाम","errorName":"ऐंकर का नाम टाइप करें","remove":"Remove Anchor"},"anchorId":"ऍलीमॅन्ट Id से","anchorName":"ऐंकर नाम से","charset":"लिंक रिसोर्स करॅक्टर सॅट","cssClasses":"स्टाइल-शीट क्लास","emailAddress":"ई-मेल पता","emailBody":"संदेश","emailSubject":"संदेश विषय","id":"Id","info":"लिंक  ","langCode":"भाषा लिखने की दिशा","langDir":"भाषा लिखने की दिशा","langDirLTR":"बायें से दायें (LTR)","langDirRTL":"दायें से बायें (RTL)","menu":"लिंक संपादन","name":"नाम","noAnchors":"(डॉक्यूमॅन्ट में ऐंकर्स की संख्या)","noEmail":"ई-मेल पता टाइप करें","noUrl":"लिंक URL टाइप करें","other":"<अन्य>","popupDependent":"डिपेन्डॅन्ट (Netscape)","popupFeatures":"पॉप-अप विन्डो फ़ीचर्स","popupFullScreen":"फ़ुल स्क्रीन (IE)","popupLeft":"बायीं तरफ","popupLocationBar":"लोकेशन बार","popupMenuBar":"मॅन्यू बार","popupResizable":"Resizable","popupScrollBars":"स्क्रॉल बार","popupStatusBar":"स्टेटस बार","popupToolbar":"टूल बार","popupTop":"दायीं तरफ","rel":"Relationship","selectAnchor":"ऐंकर चुनें","styles":"स्टाइल","tabIndex":"टैब इन्डॅक्स","target":"टार्गेट","targetFrame":"<फ़्रेम>","targetFrameName":"टार्गेट फ़्रेम का नाम","targetPopup":"<पॉप-अप विन्डो>","targetPopupName":"पॉप-अप विन्डो का नाम","title":"लिंक","toAnchor":"इस पेज का ऐंकर","toEmail":"ई-मेल","toUrl":"URL","toolbar":"लिंक इन्सर्ट/संपादन","type":"लिंक प्रकार","unlink":"लिंक हटायें","upload":"अपलोड"},"list":{"bulletedlist":"बुलॅट सूची","numberedlist":"अंकीय सूची"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"मेक्सिमाईज़","minimize":"मिनिमाईज़"},"newpage":{"toolbar":"नया पेज"},"pagebreak":{"alt":"पेज ब्रेक","toolbar":"पेज ब्रेक इन्सर्ट् करें"},"pastetext":{"button":"पेस्ट (सादा टॅक्स्ट)","title":"पेस्ट (सादा टॅक्स्ट)"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"पेस्ट (वर्ड से)","toolbar":"पेस्ट (वर्ड से)"},"preview":{"preview":"प्रीव्यू"},"print":{"toolbar":"प्रिन्ट"},"removeformat":{"toolbar":"फ़ॉर्मैट हटायें"},"save":{"toolbar":"सेव"},"selectall":{"toolbar":"सब सॅलॅक्ट करें"},"showblocks":{"toolbar":"ब्लॉक दिखायें"},"sourcearea":{"toolbar":"सोर्स"},"specialchar":{"options":"Special Character Options","title":"विशेष करॅक्टर चुनें","toolbar":"विशेष करॅक्टर इन्सर्ट करें"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"स्टाइल","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"बॉर्डर साइज़","caption":"शीर्षक","cell":{"menu":"खाना","insertBefore":"पहले सैल डालें","insertAfter":"बाद में सैल डालें","deleteCell":"सैल डिलीट करें","merge":"सैल मिलायें","mergeRight":"बाँया विलय","mergeDown":"नीचे विलय करें","splitHorizontal":"सैल को क्षैतिज स्थिति में विभाजित करें","splitVertical":"सैल को लम्बाकार में विभाजित करें","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"सैल पैडिंग","cellSpace":"सैल अंतर","column":{"menu":"कालम","insertBefore":"पहले कालम डालें","insertAfter":"बाद में कालम डालें","deleteColumn":"कालम डिलीट करें"},"columns":"कालम","deleteTable":"टेबल डिलीट करें","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"टेबल प्रॉपर्टीज़","row":{"menu":"पंक्ति","insertBefore":"पहले पंक्ति डालें","insertAfter":"बाद में पंक्ति डालें","deleteRow":"पंक्तियाँ डिलीट करें"},"rows":"पंक्तियाँ","summary":"सारांश","title":"टेबल प्रॉपर्टीज़","toolbar":"टेबल","widthPc":"प्रतिशत","widthPx":"पिक्सैल","widthUnit":"width unit"},"undo":{"redo":"रीडू","undo":"अन्डू"},"wsc":{"btnIgnore":"इग्नोर","btnIgnoreAll":"सभी इग्नोर करें","btnReplace":"रिप्लेस","btnReplaceAll":"सभी रिप्लेस करें","btnUndo":"अन्डू","changeTo":"इसमें बदलें","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"स्पॅल-चॅकर इन्स्टाल नहीं किया गया है। क्या आप इसे डाउनलोड करना चाहेंगे?","manyChanges":"वर्तनी की जाँच : %1 शब्द बदले गये","noChanges":"वर्तनी की जाँच :कोई शब्द नहीं बदला गया","noMispell":"वर्तनी की जाँच : कोई गलत वर्तनी (स्पॅलिंग) नहीं पाई गई","noSuggestions":"- कोई सुझाव नहीं -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"शब्दकोश में नहीं","oneChange":"वर्तनी की जाँच : एक शब्द बदला गया","progress":"वर्तनी की जाँच (स्पॅल-चॅक) जारी है...","title":"Spell Check","toolbar":"वर्तनी (स्पेलिंग) जाँच"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/hr.js b/htmltest/sites/all/libraries/ckeditor-version/lang/hr.js
new file mode 100644
index 00000000..0b9ca100
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/hr.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['hr']={"editor":"Bogati uređivač teksta","common":{"editorHelp":"Pritisni ALT 0 za pomoć","browseServer":"Pretraži server","url":"URL","protocol":"Protokol","upload":"Pošalji","uploadSubmit":"Pošalji na server","image":"Slika","flash":"Flash","form":"Forma","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<nije postavljeno>","id":"Id","name":"Naziv","langDir":"Smjer jezika","langDirLtr":"S lijeva na desno (LTR)","langDirRtl":"S desna na lijevo (RTL)","langCode":"Kôd jezika","longDescr":"Dugački opis URL","cssClass":"Klase stilova","advisoryTitle":"Advisory naslov","cssStyle":"Stil","ok":"OK","cancel":"Poništi","close":"Zatvori","preview":"Pregledaj","resize":"Povuci za promjenu veličine","generalTab":"Općenito","advancedTab":"Napredno","validateNumberFailed":"Ova vrijednost nije broj.","confirmNewPage":"Sve napravljene promjene će biti izgubljene ukoliko ih niste snimili. Sigurno želite učitati novu stranicu?","confirmCancel":"Neke od opcija su promjenjene. Sigurno želite zatvoriti ovaj prozor?","options":"Opcije","target":"Odredište","targetNew":"Novi prozor (_blank)","targetTop":"Vršni prozor (_top)","targetSelf":"Isti prozor (_self)","targetParent":"Roditeljski prozor (_parent)","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","styles":"Stil","cssClasses":"Klase stilova","width":"Širina","height":"Visina","align":"Poravnanje","alignLeft":"Lijevo","alignRight":"Desno","alignCenter":"Središnje","alignTop":"Vrh","alignMiddle":"Sredina","alignBottom":"Dolje","invalidValue":"Neispravna vrijednost.","invalidHeight":"Visina mora biti broj.","invalidWidth":"Širina mora biti broj.","invalidCssLength":"Vrijednost određena za \"%1\" polje mora biti pozitivni broj sa ili bez važećih CSS mjernih jedinica (px, %, in, cm, mm, em, ex, pt ili pc).","invalidHtmlLength":"Vrijednost određena za \"%1\" polje mora biti pozitivni broj sa ili bez važećih HTML mjernih jedinica (px ili %).","invalidInlineStyle":"Vrijednost za linijski stil mora sadržavati jednu ili više definicija s formatom \"naziv:vrijednost\", odvojenih točka-zarezom.","cssLengthTooltip":"Unesite broj za vrijednost u pikselima ili broj s važećim CSS mjernim jedinicama (px, %, in, cm, mm, em, ex, pt ili pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedostupno</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"O CKEditoru","help":"Provjeri $1 za pomoć.","moreInfo":"Za informacije o licencama posjetite našu web stranicu:","title":"O CKEditoru","userGuide":"Vodič za CKEditor korisnike"},"basicstyles":{"bold":"Podebljaj","italic":"Ukosi","strike":"Precrtano","subscript":"Subscript","superscript":"Superscript","underline":"Potcrtano"},"bidi":{"ltr":"Smjer teksta s lijeva na desno","rtl":"Smjer teksta s desna na lijevo"},"blockquote":{"toolbar":"Blockquote"},"clipboard":{"copy":"Kopiraj","copyError":"Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+C).","cut":"Izreži","cutError":"Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog izrezivanja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+X).","paste":"Zalijepi","pasteArea":"Prostor za ljepljenje","pasteMsg":"Molimo zaljepite unutar doljnjeg okvira koristeći tipkovnicu (<STRONG>Ctrl/Cmd+V</STRONG>) i kliknite <STRONG>OK</STRONG>.","securityMsg":"Zbog sigurnosnih postavki Vašeg pretraživača, editor nema direktan pristup Vašem međuspremniku. Potrebno je ponovno zalijepiti tekst u ovaj prozor.","title":"Zalijepi"},"colorbutton":{"auto":"Automatski","bgColorTitle":"Boja pozadine","colors":{"000":"Crna","800000":"Kesten","8B4513":"Smeđa","2F4F4F":"Tamno siva","008080":"Teal","000080":"Mornarska","4B0082":"Indigo","696969":"Tamno siva","B22222":"Vatrena cigla","A52A2A":"Smeđa","DAA520":"Zlatna","006400":"Tamno zelena","40E0D0":"Tirkizna","0000CD":"Srednje plava","800080":"Ljubičasta","808080":"Siva","F00":"Crvena","FF8C00":"Tamno naranđasta","FFD700":"Zlatna","008000":"Zelena","0FF":"Cijan","00F":"Plava","EE82EE":"Ljubičasta","A9A9A9":"Mutno siva","FFA07A":"Svijetli losos","FFA500":"Naranđasto","FFFF00":"Žuto","00FF00":"Limun","AFEEEE":"Blijedo tirkizna","ADD8E6":"Svijetlo plava","DDA0DD":"Šljiva","D3D3D3":"Svijetlo siva","FFF0F5":"Lavanda rumeno","FAEBD7":"Antikno bijela","FFFFE0":"Svijetlo žuta","F0FFF0":"Med","F0FFFF":"Azurna","F0F8FF":"Alice plava","E6E6FA":"Lavanda","FFF":"Bijela"},"more":"Više boja...","panelTitle":"Boje","textColorTitle":"Boja teksta"},"colordialog":{"clear":"Očisti","highlight":"Istaknuto","options":"Opcije boje","selected":"Odabrana boja","title":"Odaberi boju"},"templates":{"button":"Predlošci","emptyListMsg":"(Nema definiranih predložaka)","insertOption":"Zamijeni trenutne sadržaje","options":"Opcije predložaka","selectPromptMsg":"Molimo odaberite predložak koji želite otvoriti<br>(stvarni sadržaj će biti izgubljen):","title":"Predlošci sadržaja"},"contextmenu":{"options":"Opcije izbornika"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Savjetodavni naslov","cssClassInputLabel":"Klase stilova","edit":"Uredi DIV","inlineStyleInputLabel":"Stil u liniji","langDirLTRLabel":"S lijeva na desno (LTR)","langDirLabel":"Smjer jezika","langDirRTLLabel":"S desna na lijevo (RTL)","languageCodeInputLabel":"Jezični kod","remove":"Ukloni DIV","styleSelectLabel":"Stil","title":"Napravi DIV kontejner","toolbar":"Napravi DIV kontejner"},"toolbar":{"toolbarCollapse":"Smanji alatnu traku","toolbarExpand":"Proširi alatnu traku","toolbarGroups":{"document":"Dokument","clipboard":"Međuspremnik/Poništi","editing":"Uređivanje","forms":"Forme","basicstyles":"Osnovni stilovi","paragraph":"Paragraf","links":"Veze","insert":"Umetni","styles":"Stilovi","colors":"Boje","tools":"Alatke"},"toolbars":"Alatne trake uređivača teksta"},"elementspath":{"eleLabel":"Putanja elemenata","eleTitle":"%1 element"},"find":{"find":"Pronađi","findOptions":"Opcije traženja","findWhat":"Pronađi:","matchCase":"Usporedi mala/velika slova","matchCyclic":"Usporedi kružno","matchWord":"Usporedi cijele riječi","notFoundMsg":"Traženi tekst nije pronađen.","replace":"Zamijeni","replaceAll":"Zamijeni sve","replaceSuccessMsg":"Zamijenjeno %1 pojmova.","replaceWith":"Zamijeni s:","title":"Pronađi i zamijeni"},"fakeobjects":{"anchor":"Sidro","flash":"Flash animacija","hiddenfield":"Sakriveno polje","iframe":"IFrame","unknown":"Nepoznati objekt"},"flash":{"access":"Script Access","accessAlways":"Uvijek","accessNever":"Nikad","accessSameDomain":"Ista domena","alignAbsBottom":"Abs dolje","alignAbsMiddle":"Abs sredina","alignBaseline":"Bazno","alignTextTop":"Vrh teksta","bgcolor":"Boja pozadine","chkFull":"Omogući Fullscreen","chkLoop":"Ponavljaj","chkMenu":"Omogući Flash izbornik","chkPlay":"Auto Play","flashvars":"Varijable za Flash","hSpace":"HSpace","properties":"Flash svojstva","propertiesTab":"Svojstva","quality":"Kvaliteta","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"Omjer","scaleAll":"Prikaži sve","scaleFit":"Točna veličina","scaleNoBorder":"Bez okvira","title":"Flash svojstva","vSpace":"VSpace","validateHSpace":"HSpace mora biti broj.","validateSrc":"Molimo upišite URL link","validateVSpace":"VSpace mora biti broj.","windowMode":"Vrsta prozora","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Veličina","voiceLabel":"Veličina slova","panelTitle":"Veličina"},"label":"Font","panelTitle":"Font","voiceLabel":"Font"},"forms":{"button":{"title":"Button svojstva","text":"Tekst (vrijednost)","type":"Vrsta","typeBtn":"Gumb","typeSbm":"Pošalji","typeRst":"Poništi"},"checkboxAndRadio":{"checkboxTitle":"Checkbox svojstva","radioTitle":"Radio Button svojstva","value":"Vrijednost","selected":"Odabrano"},"form":{"title":"Form svojstva","menu":"Form svojstva","action":"Akcija","method":"Metoda","encoding":"Encoding"},"hidden":{"title":"Hidden Field svojstva","name":"Ime","value":"Vrijednost"},"select":{"title":"Selection svojstva","selectInfo":"Info","opAvail":"Dostupne opcije","value":"Vrijednost","size":"Veličina","lines":"linija","chkMulti":"Dozvoli višestruki odabir","opText":"Tekst","opValue":"Vrijednost","btnAdd":"Dodaj","btnModify":"Promijeni","btnUp":"Gore","btnDown":"Dolje","btnSetValue":"Postavi kao odabranu vrijednost","btnDelete":"Obriši"},"textarea":{"title":"Textarea svojstva","cols":"Kolona","rows":"Redova"},"textfield":{"title":"Text Field svojstva","name":"Ime","value":"Vrijednost","charWidth":"Širina","maxChars":"Najviše karaktera","type":"Vrsta","typeText":"Tekst","typePass":"Šifra","typeEmail":"Email","typeSearch":"Traži","typeTel":"Broj telefona","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatirano"},"horizontalrule":{"toolbar":"Ubaci vodoravnu liniju"},"iframe":{"border":"Prikaži okvir IFrame-a","noUrl":"Unesite URL iframe-a","scrolling":"Omogući trake za skrolanje","title":"IFrame svojstva","toolbar":"IFrame"},"image":{"alertUrl":"Unesite URL slike","alt":"Alternativni tekst","border":"Okvir","btnUpload":"Pošalji na server","button2Img":"Želite li promijeniti odabrani gumb u jednostavnu sliku?","hSpace":"HSpace","img2Button":"Želite li promijeniti odabranu sliku u gumb?","infoTab":"Info slike","linkTab":"Link","lockRatio":"Zaključaj odnos","menu":"Svojstva slika","resetSize":"Obriši veličinu","title":"Svojstva slika","titleButton":"Image Button svojstva","upload":"Pošalji","urlMissing":"Nedostaje URL slike.","vSpace":"VSpace","validateBorder":"Okvir mora biti cijeli broj.","validateHSpace":"HSpace mora biti cijeli broj","validateVSpace":"VSpace mora biti cijeli broj."},"indent":{"indent":"Pomakni udesno","outdent":"Pomakni ulijevo"},"smiley":{"options":"Opcije smješka","title":"Ubaci smješka","toolbar":"Smješko"},"justify":{"block":"Blok poravnanje","center":"Središnje poravnanje","left":"Lijevo poravnanje","right":"Desno poravnanje"},"link":{"acccessKey":"Pristupna tipka","advanced":"Napredno","advisoryContentType":"Advisory vrsta sadržaja","advisoryTitle":"Advisory naslov","anchor":{"toolbar":"Ubaci/promijeni sidro","menu":"Svojstva sidra","title":"Svojstva sidra","name":"Ime sidra","errorName":"Molimo unesite ime sidra","remove":"Ukloni sidro"},"anchorId":"Po Id elementa","anchorName":"Po nazivu sidra","charset":"Kodna stranica povezanih resursa","cssClasses":"Stylesheet klase","emailAddress":"E-Mail adresa","emailBody":"Sadržaj poruke","emailSubject":"Naslov","id":"Id","info":"Link Info","langCode":"Smjer jezika","langDir":"Smjer jezika","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","menu":"Promijeni link","name":"Naziv","noAnchors":"(Nema dostupnih sidra)","noEmail":"Molimo upišite e-mail adresu","noUrl":"Molimo upišite URL link","other":"<drugi>","popupDependent":"Ovisno (Netscape)","popupFeatures":"Mogućnosti popup prozora","popupFullScreen":"Cijeli ekran (IE)","popupLeft":"Lijeva pozicija","popupLocationBar":"Traka za lokaciju","popupMenuBar":"Izborna traka","popupResizable":"Promjenjiva veličina","popupScrollBars":"Scroll traka","popupStatusBar":"Statusna traka","popupToolbar":"Traka s alatima","popupTop":"Gornja pozicija","rel":"Veza","selectAnchor":"Odaberi sidro","styles":"Stil","tabIndex":"Tab Indeks","target":"Meta","targetFrame":"<okvir>","targetFrameName":"Ime ciljnog okvira","targetPopup":"<popup prozor>","targetPopupName":"Naziv popup prozora","title":"Link","toAnchor":"Sidro na ovoj stranici","toEmail":"E-Mail","toUrl":"URL","toolbar":"Ubaci/promijeni link","type":"Link vrsta","unlink":"Ukloni link","upload":"Pošalji"},"list":{"bulletedlist":"Obična lista","numberedlist":"Brojčana lista"},"liststyle":{"armenian":"Armenijska numeracija","bulletedTitle":"Svojstva liste","circle":"Krug","decimal":"Decimalna numeracija (1, 2, 3, itd.)","decimalLeadingZero":"Decimalna s vodećom nulom (01, 02, 03, itd)","disc":"Disk","georgian":"Gruzijska numeracija(an, ban, gan, etc.)","lowerAlpha":"Znakovi mala slova (a, b, c, d, e, itd.)","lowerGreek":"Grčka numeracija mala slova (alfa, beta, gama, itd).","lowerRoman":"Romanska numeracija mala slova (i, ii, iii, iv, v, itd.)","none":"Bez","notset":"<nije određen>","numberedTitle":"Svojstva brojčane liste","square":"Kvadrat","start":"Početak","type":"Vrsta","upperAlpha":"Znakovi velika slova (A, B, C, D, E, itd.)","upperRoman":"Romanska numeracija velika slova (I, II, III, IV, V, itd.)","validateStartNumber":"Početak brojčane liste mora biti cijeli broj."},"magicline":{"title":"Ubaci paragraf ovdje"},"maximize":{"maximize":"Povećaj","minimize":"Smanji"},"newpage":{"toolbar":"Nova stranica"},"pagebreak":{"alt":"Prijelom stranice","toolbar":"Ubaci prijelom stranice"},"pastetext":{"button":"Zalijepi kao čisti tekst","title":"Zalijepi kao čisti tekst"},"pastefromword":{"confirmCleanup":"Tekst koji želite zalijepiti čini se da je kopiran iz Worda. Želite li prije očistiti tekst?","error":"Nije moguće očistiti podatke za ljepljenje zbog interne greške","title":"Zalijepi iz Worda","toolbar":"Zalijepi iz Worda"},"preview":{"preview":"Pregledaj"},"print":{"toolbar":"Ispiši"},"removeformat":{"toolbar":"Ukloni formatiranje"},"save":{"toolbar":"Snimi"},"selectall":{"toolbar":"Odaberi sve"},"showblocks":{"toolbar":"Prikaži blokove"},"sourcearea":{"toolbar":"Kôd"},"specialchar":{"options":"Opcije specijalnih znakova","title":"Odaberite posebni karakter","toolbar":"Ubaci posebne znakove"},"scayt":{"about":"O SCAYT","aboutTab":"O SCAYT","addWord":"Dodaj riječ","allCaps":"Ignoriraj riječi s velikim slovima","dic_create":"Napravi","dic_delete":"Obriši","dic_field_name":"Naziv riječnika","dic_info":"Na početku se korisnički Riječnik sprema u Cookie. Nažalost, veličina im je ograničena. Kada korisnički Riječnik naraste preko te veličine, Riječnik će biti smješten na naš server. Kako bi se korisnički Riječnik spremio na naš server morate odabrati naziv Vašeg Riječnika. Ukoliko ste već prije spremali Riječnik na naše servere, unesite naziv Riječnika i pritisnite na Povrati.","dic_rename":"Promijeni naziv","dic_restore":"Povrati","dictionariesTab":"Rječnici","disable":"Onemogući SCAYT","emptyDic":"Naziv rječnika ne smije biti prazno.","enable":"Omogući SCAYT","ignore":"Zanemari","ignoreAll":"Zanemari sve","ignoreDomainNames":"Ignoriraj nazive domena","langs":"Jezici","languagesTab":"Jezici","mixedCase":"Ignoriraj riječi s miješanim slovima","mixedWithDigits":"Ignoriraj riječi s brojevima","moreSuggestions":"Više prijedloga","opera_title":"Nije podržano u Operi","options":"Opcije","optionsTab":"Opcije","title":"Provjeri pravopis tijekom tipkanja (SCAYT)","toggle":"Omoguću/Onemogući SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Stilovi formatiranja","panelTitle1":"Block stilovi","panelTitle2":"Inline stilovi","panelTitle3":"Object stilovi"},"table":{"border":"Veličina okvira","caption":"Naslov","cell":{"menu":"Ćelija","insertBefore":"Ubaci ćeliju prije","insertAfter":"Ubaci ćeliju poslije","deleteCell":"Izbriši ćelije","merge":"Spoji ćelije","mergeRight":"Spoji desno","mergeDown":"Spoji dolje","splitHorizontal":"Podijeli ćeliju vodoravno","splitVertical":"Podijeli ćeliju okomito","title":"Svojstva ćelije","cellType":"Vrsta ćelije","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Prelazak u novi red","hAlign":"Vodoravno poravnanje","vAlign":"Okomito poravnanje","alignBaseline":"Osnovna linija","bgColor":"Boja pozadine","borderColor":"Boja ruba","data":"Podatak","header":"Zaglavlje","yes":"Da","no":"ne","invalidWidth":"Širina ćelije mora biti broj.","invalidHeight":"Visina ćelije mora biti broj.","invalidRowSpan":"Rows span mora biti cijeli broj.","invalidColSpan":"Columns span mora biti cijeli broj.","chooseColor":"Odaberi"},"cellPad":"Razmak ćelija","cellSpace":"Prostornost ćelija","column":{"menu":"Kolona","insertBefore":"Ubaci kolonu prije","insertAfter":"Ubaci kolonu poslije","deleteColumn":"Izbriši kolone"},"columns":"Kolona","deleteTable":"Izbriši tablicu","headers":"Zaglavlje","headersBoth":"Oba","headersColumn":"Prva kolona","headersNone":"Ništa","headersRow":"Prvi red","invalidBorder":"Debljina ruba mora biti broj.","invalidCellPadding":"Razmak ćelija mora biti broj.","invalidCellSpacing":"Prostornost ćelija mora biti broj.","invalidCols":"Broj kolona mora biti broj veći od 0.","invalidHeight":"Visina tablice mora biti broj.","invalidRows":"Broj redova mora biti broj veći od 0.","invalidWidth":"Širina tablice mora biti broj.","menu":"Svojstva tablice","row":{"menu":"Red","insertBefore":"Ubaci red prije","insertAfter":"Ubaci red poslije","deleteRow":"Izbriši redove"},"rows":"Redova","summary":"Sažetak","title":"Svojstva tablice","toolbar":"Tablica","widthPc":"postotaka","widthPx":"piksela","widthUnit":"jedinica širine"},"undo":{"redo":"Ponovi","undo":"Poništi"},"wsc":{"btnIgnore":"Zanemari","btnIgnoreAll":"Zanemari sve","btnReplace":"Zamijeni","btnReplaceAll":"Zamijeni sve","btnUndo":"Vrati","changeTo":"Promijeni u","errorLoading":"Greška učitavanja aplikacije: %s.","ieSpellDownload":"Provjera pravopisa nije instalirana. Želite li skinuti provjeru pravopisa?","manyChanges":"Provjera završena: Promijenjeno %1 riječi","noChanges":"Provjera završena: Nije napravljena promjena","noMispell":"Provjera završena: Nema grešaka","noSuggestions":"-Nema preporuke-","notAvailable":"Žao nam je, ali usluga trenutno nije dostupna.","notInDic":"Nije u rječniku","oneChange":"Provjera završena: Jedna riječ promjenjena","progress":"Provjera u tijeku...","title":"Provjera pravopisa","toolbar":"Provjeri pravopis"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/hu.js b/htmltest/sites/all/libraries/ckeditor-version/lang/hu.js
new file mode 100644
index 00000000..78ccbbc4
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/hu.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['hu']={"editor":"HTML szerkesztő","common":{"editorHelp":"Segítségért nyomjon ALT 0","browseServer":"Böngészés a szerveren","url":"Hivatkozás","protocol":"Protokoll","upload":"Feltöltés","uploadSubmit":"Küldés a szerverre","image":"Kép","flash":"Flash","form":"Űrlap","checkbox":"Jelölőnégyzet","radio":"Választógomb","textField":"Szövegmező","textarea":"Szövegterület","hiddenField":"Rejtettmező","button":"Gomb","select":"Legördülő lista","imageButton":"Képgomb","notSet":"<nincs beállítva>","id":"Azonosító","name":"Név","langDir":"Írás iránya","langDirLtr":"Balról jobbra","langDirRtl":"Jobbról balra","langCode":"Nyelv kódja","longDescr":"Részletes leírás webcíme","cssClass":"Stíluskészlet","advisoryTitle":"Súgócimke","cssStyle":"Stílus","ok":"Rendben","cancel":"Mégsem","close":"Bezárás","preview":"Előnézet","resize":"Húzza az átméretezéshez","generalTab":"Általános","advancedTab":"További opciók","validateNumberFailed":"A mezőbe csak számokat írhat.","confirmNewPage":"Minden nem mentett változás el fog veszni! Biztosan be szeretné tölteni az oldalt?","confirmCancel":"Az űrlap tartalma megváltozott, ám a változásokat nem rögzítette. Biztosan be szeretné zárni az űrlapot?","options":"Beállítások","target":"Cél","targetNew":"Új ablak (_blank)","targetTop":"Legfelső ablak (_top)","targetSelf":"Aktuális ablakban (_self)","targetParent":"Szülő ablak (_parent)","langDirLTR":"Balról jobbra (LTR)","langDirRTL":"Jobbról balra (RTL)","styles":"Stílus","cssClasses":"Stíluslap osztály","width":"Szélesség","height":"Magasság","align":"Igazítás","alignLeft":"Bal","alignRight":"Jobbra","alignCenter":"Középre","alignTop":"Tetejére","alignMiddle":"Középre","alignBottom":"Aljára","invalidValue":"Érvénytelen érték.","invalidHeight":"A magasság mezőbe csak számokat írhat.","invalidWidth":"A szélesség mezőbe csak számokat írhat.","invalidCssLength":"\"%1\"-hez megadott érték csakis egy pozitív szám lehet, esetleg egy érvényes CSS egységgel megjelölve(px, %, in, cm, mm, em, ex, pt vagy pc).","invalidHtmlLength":"\"%1\"-hez megadott érték csakis egy pozitív szám lehet, esetleg egy érvényes HTML egységgel megjelölve(px vagy %).","invalidInlineStyle":"Az inline stílusnak megadott értéknek tartalmaznia kell egy vagy több rekordot a \"name : value\" formátumban, pontosvesszővel elválasztva.","cssLengthTooltip":"Adjon meg egy számot értéknek pixelekben vagy egy számot érvényes CSS mértékegységben (px, %, in, cm, mm, em, ex, pt, vagy pc).","unavailable":"%1<span class=\"cke_accessibility\">, nem elérhető</span>"},"about":{"copy":"Copyright &copy; $1. Minden jog fenntartva.","dlgTitle":"CKEditor névjegy","help":"Itt találsz segítséget: $1","moreInfo":"Licenszelési információkért kérjük látogassa meg weboldalunkat:","title":"CKEditor névjegy","userGuide":"CKEditor Felhasználói útmutató"},"basicstyles":{"bold":"Félkövér","italic":"Dőlt","strike":"Áthúzott","subscript":"Alsó index","superscript":"Felső index","underline":"Aláhúzott"},"bidi":{"ltr":"Szöveg iránya balról jobbra","rtl":"Szöveg iránya jobbról balra"},"blockquote":{"toolbar":"Idézet blokk"},"clipboard":{"copy":"Másolás","copyError":"A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a másolás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).","cut":"Kivágás","cutError":"A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a kivágás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).","paste":"Beillesztés","pasteArea":"Beszúrás mező","pasteMsg":"Másolja be az alábbi mezőbe a <STRONG>Ctrl/Cmd+V</STRONG> billentyűk lenyomásával, majd nyomjon <STRONG>Rendben</STRONG>-t.","securityMsg":"A böngésző biztonsági beállításai miatt a szerkesztő nem képes hozzáférni a vágólap adataihoz. Illeszd be újra ebben az ablakban.","title":"Beillesztés"},"colorbutton":{"auto":"Automatikus","bgColorTitle":"Háttérszín","colors":{"000":"Fekete","800000":"Bordó","8B4513":"Barna","2F4F4F":"Sötét türkiz","008080":"Türkiz","000080":"Király kék","4B0082":"Indigó kék","696969":"Szürke","B22222":"Tégla vörös","A52A2A":"Vörös","DAA520":"Arany sárga","006400":"Sötét zöld","40E0D0":"Türkiz","0000CD":"Kék","800080":"Lila","808080":"Szürke","F00":"Piros","FF8C00":"Sötét narancs","FFD700":"Arany","008000":"Zöld","0FF":"Türkiz","00F":"Kék","EE82EE":"Rózsaszín","A9A9A9":"Sötét szürke","FFA07A":"Lazac","FFA500":"Narancs","FFFF00":"Citromsárga","00FF00":"Neon zöld","AFEEEE":"Világos türkiz","ADD8E6":"Világos kék","DDA0DD":"Világos lila","D3D3D3":"Világos szürke","FFF0F5":"Lavender Blush","FAEBD7":"Törtfehér","FFFFE0":"Világos sárga","F0FFF0":"Menta","F0FFFF":"Azúr kék","F0F8FF":"Halvány kék","E6E6FA":"Lavender","FFF":"Fehér"},"more":"További színek...","panelTitle":"Színek","textColorTitle":"Betűszín"},"colordialog":{"clear":"Ürítés","highlight":"Nagyítás","options":"Szín opciók","selected":"Kiválasztott","title":"Válasszon színt"},"templates":{"button":"Sablonok","emptyListMsg":"(Nincs sablon megadva)","insertOption":"Kicseréli a jelenlegi tartalmat","options":"Sablon opciók","selectPromptMsg":"Válassza ki melyik sablon nyíljon meg a szerkesztőben<br>(a jelenlegi tartalom elveszik):","title":"Elérhető sablonok"},"contextmenu":{"options":"Helyi menü opciók"},"div":{"IdInputLabel":"Azonosító","advisoryTitleInputLabel":"Tipp szöveg","cssClassInputLabel":"Stíluslap osztály","edit":"DIV szerkesztése","inlineStyleInputLabel":"Inline stílus","langDirLTRLabel":"Balról jobbra (LTR)","langDirLabel":"Nyelvi irány","langDirRTLLabel":"Jobbról balra (RTL)","languageCodeInputLabel":" Nyelv kódja","remove":"DIV eltávolítása","styleSelectLabel":"Stílus","title":"DIV tároló létrehozása","toolbar":"DIV tároló létrehozása"},"toolbar":{"toolbarCollapse":"Eszköztár összecsukása","toolbarExpand":"Eszköztár szétnyitása","toolbarGroups":{"document":"Dokumentum","clipboard":"Vágólap/Visszavonás","editing":"Szerkesztés","forms":"Űrlapok","basicstyles":"Alapstílusok","paragraph":"Bekezdés","links":"Hivatkozások","insert":"Beszúrás","styles":"Stílusok","colors":"Színek","tools":"Eszközök"},"toolbars":"Szerkesztő Eszköztár"},"elementspath":{"eleLabel":"Elem utak","eleTitle":"%1 elem"},"find":{"find":"Keresés","findOptions":"Find Options","findWhat":"Keresett szöveg:","matchCase":"kis- és nagybetű megkülönböztetése","matchCyclic":"Ciklikus keresés","matchWord":"csak ha ez a teljes szó","notFoundMsg":"A keresett szöveg nem található.","replace":"Csere","replaceAll":"Az összes cseréje","replaceSuccessMsg":"%1 egyezőség cserélve.","replaceWith":"Csere erre:","title":"Keresés és csere"},"fakeobjects":{"anchor":"Horgony","flash":"Flash animáció","hiddenfield":"Rejtett mezõ","iframe":"IFrame","unknown":"Ismeretlen objektum"},"flash":{"access":"Szkript hozzáférés","accessAlways":"Mindig","accessNever":"Soha","accessSameDomain":"Azonos domainről","alignAbsBottom":"Legaljára","alignAbsMiddle":"Közepére","alignBaseline":"Alapvonalhoz","alignTextTop":"Szöveg tetejére","bgcolor":"Háttérszín","chkFull":"Teljes képernyő engedélyezése","chkLoop":"Folyamatosan","chkMenu":"Flash menü engedélyezése","chkPlay":"Automata lejátszás","flashvars":"Flash változók","hSpace":"Vízsz. táv","properties":"Flash tulajdonságai","propertiesTab":"Tulajdonságok","quality":"Minőség","qualityAutoHigh":"Automata jó","qualityAutoLow":"Automata gyenge","qualityBest":"Legjobb","qualityHigh":"Jó","qualityLow":"Gyenge","qualityMedium":"Közepes","scale":"Méretezés","scaleAll":"Mindent mutat","scaleFit":"Teljes kitöltés","scaleNoBorder":"Keret nélkül","title":"Flash tulajdonságai","vSpace":"Függ. táv","validateHSpace":"A vízszintes távolsűág mezőbe csak számokat írhat.","validateSrc":"Adja meg a hivatkozás webcímét","validateVSpace":"A függőleges távolsűág mezőbe csak számokat írhat.","windowMode":"Ablak mód","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Méret","voiceLabel":"Betűméret","panelTitle":"Méret"},"label":"Betűtípus","panelTitle":"Betűtípus","voiceLabel":"Betűtípus"},"forms":{"button":{"title":"Gomb tulajdonságai","text":"Szöveg (Érték)","type":"Típus","typeBtn":"Gomb","typeSbm":"Küldés","typeRst":"Alaphelyzet"},"checkboxAndRadio":{"checkboxTitle":"Jelölőnégyzet tulajdonságai","radioTitle":"Választógomb tulajdonságai","value":"Érték","selected":"Kiválasztott"},"form":{"title":"Űrlap tulajdonságai","menu":"Űrlap tulajdonságai","action":"Adatfeldolgozást végző hivatkozás","method":"Adatküldés módja","encoding":"Kódolás"},"hidden":{"title":"Rejtett mező tulajdonságai","name":"Név","value":"Érték"},"select":{"title":"Legördülő lista tulajdonságai","selectInfo":"Alaptulajdonságok","opAvail":"Elérhető opciók","value":"Érték","size":"Méret","lines":"sor","chkMulti":"több sor is kiválasztható","opText":"Szöveg","opValue":"Érték","btnAdd":"Hozzáad","btnModify":"Módosít","btnUp":"Fel","btnDown":"Le","btnSetValue":"Legyen az alapértelmezett érték","btnDelete":"Töröl"},"textarea":{"title":"Szövegterület tulajdonságai","cols":"Karakterek száma egy sorban","rows":"Sorok száma"},"textfield":{"title":"Szövegmező tulajdonságai","name":"Név","value":"Érték","charWidth":"Megjelenített karakterek száma","maxChars":"Maximális karakterszám","type":"Típus","typeText":"Szöveg","typePass":"Jelszó","typeEmail":"Ímél","typeSearch":"Keresés","typeTel":"Telefonszám","typeUrl":"URL"}},"format":{"label":"Formátum","panelTitle":"Formátum","tag_address":"Címsor","tag_div":"Bekezdés (DIV)","tag_h1":"Fejléc 1","tag_h2":"Fejléc 2","tag_h3":"Fejléc 3","tag_h4":"Fejléc 4","tag_h5":"Fejléc 5","tag_h6":"Fejléc 6","tag_p":"Normál","tag_pre":"Formázott"},"horizontalrule":{"toolbar":"Elválasztóvonal beillesztése"},"iframe":{"border":"Legyen keret","noUrl":"Kérem írja be a iframe URL-t","scrolling":"Gördítősáv bekapcsolása","title":"IFrame Tulajdonságok","toolbar":"IFrame"},"image":{"alertUrl":"Töltse ki a kép webcímét","alt":"Buborék szöveg","border":"Keret","btnUpload":"Küldés a szerverre","button2Img":"A kiválasztott képgombból sima képet szeretne csinálni?","hSpace":"Vízsz. táv","img2Button":"A kiválasztott képből képgombot szeretne csinálni?","infoTab":"Alaptulajdonságok","linkTab":"Hivatkozás","lockRatio":"Arány megtartása","menu":"Kép tulajdonságai","resetSize":"Eredeti méret","title":"Kép tulajdonságai","titleButton":"Képgomb tulajdonságai","upload":"Feltöltés","urlMissing":"Hiányzik a kép URL-je","vSpace":"Függ. táv","validateBorder":"A keret méretének egész számot kell beírni!","validateHSpace":"Vízszintes távolságnak egész számot kell beírni!","validateVSpace":"Függőleges távolságnak egész számot kell beírni!"},"indent":{"indent":"Behúzás növelése","outdent":"Behúzás csökkentése"},"smiley":{"options":"Hangulatjel opciók","title":"Hangulatjel beszúrása","toolbar":"Hangulatjelek"},"justify":{"block":"Sorkizárt","center":"Középre","left":"Balra","right":"Jobbra"},"link":{"acccessKey":"Billentyűkombináció","advanced":"További opciók","advisoryContentType":"Súgó tartalomtípusa","advisoryTitle":"Súgócimke","anchor":{"toolbar":"Horgony beillesztése/szerkesztése","menu":"Horgony tulajdonságai","title":"Horgony tulajdonságai","name":"Horgony neve","errorName":"Kérem adja meg a horgony nevét","remove":"Horgony eltávolítása"},"anchorId":"Azonosító szerint","anchorName":"Horgony név szerint","charset":"Hivatkozott tartalom kódlapja","cssClasses":"Stíluskészlet","emailAddress":"E-Mail cím","emailBody":"Üzenet","emailSubject":"Üzenet tárgya","id":"Id","info":"Alaptulajdonságok","langCode":"Írás iránya","langDir":"Írás iránya","langDirLTR":"Balról jobbra","langDirRTL":"Jobbról balra","menu":"Hivatkozás módosítása","name":"Név","noAnchors":"(Nincs horgony a dokumentumban)","noEmail":"Adja meg az E-Mail címet","noUrl":"Adja meg a hivatkozás webcímét","other":"<más>","popupDependent":"Szülőhöz kapcsolt (csak Netscape)","popupFeatures":"Felugró ablak jellemzői","popupFullScreen":"Teljes képernyő (csak IE)","popupLeft":"Bal pozíció","popupLocationBar":"Címsor","popupMenuBar":"Menü sor","popupResizable":"Átméretezés","popupScrollBars":"Gördítősáv","popupStatusBar":"Állapotsor","popupToolbar":"Eszköztár","popupTop":"Felső pozíció","rel":"Kapcsolat típusa","selectAnchor":"Horgony választása","styles":"Stílus","tabIndex":"Tabulátor index","target":"Tartalom megjelenítése","targetFrame":"<keretben>","targetFrameName":"Keret neve","targetPopup":"<felugró ablakban>","targetPopupName":"Felugró ablak neve","title":"Hivatkozás tulajdonságai","toAnchor":"Horgony az oldalon","toEmail":"E-Mail","toUrl":"URL","toolbar":"Hivatkozás beillesztése/módosítása","type":"Hivatkozás típusa","unlink":"Hivatkozás törlése","upload":"Feltöltés"},"list":{"bulletedlist":"Felsorolás","numberedlist":"Számozás"},"liststyle":{"armenian":"Örmény számozás","bulletedTitle":"Pontozott lista tulajdonságai","circle":"Kör","decimal":"Arab számozás (1, 2, 3, stb.)","decimalLeadingZero":"Számozás bevezető nullákkal (01, 02, 03, stb.)","disc":"Korong","georgian":"Grúz számozás (an, ban, gan, stb.)","lowerAlpha":"Kisbetűs (a, b, c, d, e, stb.)","lowerGreek":"Görög (alpha, beta, gamma, stb.)","lowerRoman":"Római kisbetűs (i, ii, iii, iv, v, stb.)","none":"Nincs","notset":"<Nincs beállítva>","numberedTitle":"Sorszámozott lista tulajdonságai","square":"Négyzet","start":"Kezdőszám","type":"Típus","upperAlpha":"Nagybetűs (A, B, C, D, E, stb.)","upperRoman":"Római nagybetűs (I, II, III, IV, V, stb.)","validateStartNumber":"A kezdőszám nem lehet tört érték."},"magicline":{"title":"Szúrja be a bekezdést ide"},"maximize":{"maximize":"Teljes méret","minimize":"Kis méret"},"newpage":{"toolbar":"Új oldal"},"pagebreak":{"alt":"Oldaltörés","toolbar":"Oldaltörés beillesztése"},"pastetext":{"button":"Beillesztés formázatlan szövegként","title":"Beillesztés formázatlan szövegként"},"pastefromword":{"confirmCleanup":"Úgy tűnik a beillesztett szöveget Word-ből másolt át. Meg szeretné tisztítani a szöveget? (ajánlott)","error":"Egy belső hiba miatt nem sikerült megtisztítani a szöveget","title":"Beillesztés Word-ből","toolbar":"Beillesztés Word-ből"},"preview":{"preview":"Előnézet"},"print":{"toolbar":"Nyomtatás"},"removeformat":{"toolbar":"Formázás eltávolítása"},"save":{"toolbar":"Mentés"},"selectall":{"toolbar":"Mindent kijelöl"},"showblocks":{"toolbar":"Blokkok megjelenítése"},"sourcearea":{"toolbar":"Forráskód"},"specialchar":{"options":"Speciális karakter opciók","title":"Speciális karakter választása","toolbar":"Speciális karakter beillesztése"},"scayt":{"about":"SCAYT névjegy","aboutTab":"Névjegy","addWord":"Szó hozzáadása","allCaps":"Nagybetűs szavak kihagyása","dic_create":"Létrehozás","dic_delete":"Törlés","dic_field_name":"Szótár neve","dic_info":"Kezdetben a felhasználói szótár böngésző sütiben tárolódik. Azonban a sütik maximális mérete korlátozott. Amikora a szótár akkora lesz, hogy már sütiben nem lehet tárolni, akkor a szótárat tárolhatja a szerveren is. Ehhez egy nevet kell megadni a szótárhoz. Amennyiben már van szerveren tárolt szótára, adja meg a nevét és kattintson a visszaállítás gombra.","dic_rename":"Átnevezés","dic_restore":"Visszaállítás","dictionariesTab":"Szótár","disable":"SCAYT letiltása","emptyDic":"A szótár nevét meg kell adni.","enable":"SCAYT engedélyezése","ignore":"Kihagy","ignoreAll":"Összes kihagyása","ignoreDomainNames":"Domain nevek kihagyása","langs":"Nyelvek","languagesTab":"Nyelvek","mixedCase":"Kis és nagybetűt is tartalmazó szavak kihagyása","mixedWithDigits":"Számokat tartalmazó szavak kihagyása","moreSuggestions":"További javaslatok","opera_title":"Az Opera nem támogatja","options":"Beállítások","optionsTab":"Beállítások","title":"Helyesírás ellenőrzés gépelés közben","toggle":"SCAYT kapcsolása","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stílus","panelTitle":"Formázási stílusok","panelTitle1":"Blokk stílusok","panelTitle2":"Inline stílusok","panelTitle3":"Objektum stílusok"},"table":{"border":"Szegélyméret","caption":"Felirat","cell":{"menu":"Cella","insertBefore":"Beszúrás balra","insertAfter":"Beszúrás jobbra","deleteCell":"Cellák törlése","merge":"Cellák egyesítése","mergeRight":"Cellák egyesítése jobbra","mergeDown":"Cellák egyesítése lefelé","splitHorizontal":"Cellák szétválasztása vízszintesen","splitVertical":"Cellák szétválasztása függőlegesen","title":"Cella tulajdonságai","cellType":"Cella típusa","rowSpan":"Függőleges egyesítés","colSpan":"Vízszintes egyesítés","wordWrap":"Hosszú sorok törése","hAlign":"Vízszintes igazítás","vAlign":"Függőleges igazítás","alignBaseline":"Alapvonalra","bgColor":"Háttér színe","borderColor":"Keret színe","data":"Adat","header":"Fejléc","yes":"Igen","no":"Nem","invalidWidth":"A szélesség mezőbe csak számokat írhat.","invalidHeight":"A magasság mezőbe csak számokat írhat.","invalidRowSpan":"A függőleges egyesítés mezőbe csak számokat írhat.","invalidColSpan":"A vízszintes egyesítés mezőbe csak számokat írhat.","chooseColor":"Válasszon"},"cellPad":"Cella belső margó","cellSpace":"Cella térköz","column":{"menu":"Oszlop","insertBefore":"Beszúrás balra","insertAfter":"Beszúrás jobbra","deleteColumn":"Oszlopok törlése"},"columns":"Oszlopok","deleteTable":"Táblázat törlése","headers":"Fejlécek","headersBoth":"Mindkettő","headersColumn":"Első oszlop","headersNone":"Nincsenek","headersRow":"Első sor","invalidBorder":"A szegélyméret mezőbe csak számokat írhat.","invalidCellPadding":"A cella belső margó mezőbe csak számokat írhat.","invalidCellSpacing":"A cella térköz mezőbe csak számokat írhat.","invalidCols":"Az oszlopok számának nagyobbnak kell lenni mint 0.","invalidHeight":"A magasság mezőbe csak számokat írhat.","invalidRows":"A sorok számának nagyobbnak kell lenni mint 0.","invalidWidth":"A szélesség mezőbe csak számokat írhat.","menu":"Táblázat tulajdonságai","row":{"menu":"Sor","insertBefore":"Beszúrás fölé","insertAfter":"Beszúrás alá","deleteRow":"Sorok törlése"},"rows":"Sorok","summary":"Leírás","title":"Táblázat tulajdonságai","toolbar":"Táblázat","widthPc":"százalék","widthPx":"képpont","widthUnit":"Szélesség egység"},"undo":{"redo":"Ismétlés","undo":"Visszavonás"},"wsc":{"btnIgnore":"Kihagyja","btnIgnoreAll":"Mindet kihagyja","btnReplace":"Csere","btnReplaceAll":"Összes cseréje","btnUndo":"Visszavonás","changeTo":"Módosítás","errorLoading":"Hiba a szolgáltatás host betöltése közben: %s.","ieSpellDownload":"A helyesírás-ellenőrző nincs telepítve. Szeretné letölteni most?","manyChanges":"Helyesírás-ellenőrzés kész: %1 szó cserélve","noChanges":"Helyesírás-ellenőrzés kész: Nincs változtatott szó","noMispell":"Helyesírás-ellenőrzés kész: Nem találtam hibát","noSuggestions":"Nincs javaslat","notAvailable":"Sajnálom, de a szolgáltatás jelenleg nem elérhető.","notInDic":"Nincs a szótárban","oneChange":"Helyesírás-ellenőrzés kész: Egy szó cserélve","progress":"Helyesírás-ellenőrzés folyamatban...","title":"Helyesírás ellenörző","toolbar":"Helyesírás-ellenőrzés"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/id.js b/htmltest/sites/all/libraries/ckeditor-version/lang/id.js
new file mode 100644
index 00000000..8d9fc6bb
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/id.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['id']={"editor":"Rich Text Editor","common":{"editorHelp":"Tekan ALT 0 untuk bantuan.","browseServer":"Jelajah Server","url":"URL","protocol":"Protokol","upload":"Unggah","uploadSubmit":"Kirim ke Server","image":"Gambar","flash":"Flash","form":"Formulir","checkbox":"Kotak Cek","radio":"Tombol Radio","textField":"Kolom Teks","textarea":"Area Teks","hiddenField":"Kolom Tersembunyi","button":"Tombol","select":"Kolom Seleksi","imageButton":"Tombol Gambar","notSet":"<tidak diatur>","id":"Id","name":"Nama","langDir":"Arah Bahasa","langDirLtr":"Kiri ke Kanan (LTR)","langDirRtl":"Kanan ke Kiri","langCode":"Kode Bahasa","longDescr":"Deskripsi URL Panjang","cssClass":"Kelas Stylesheet","advisoryTitle":"Penasehat Judul","cssStyle":"Gaya","ok":"OK","cancel":"Batal","close":"Tutup","preview":"Pratinjau","resize":"Ubah ukuran","generalTab":"Umum","advancedTab":"Advanced","validateNumberFailed":"Nilai ini tidak sebuah angka","confirmNewPage":"Semua perubahan yang tidak disimpan di konten ini akan hilang. Apakah anda yakin ingin memuat halaman baru?","confirmCancel":"Beberapa opsi telah berubah. Apakah anda yakin ingin menutup dialog?","options":"Opsi","target":"Sasaran","targetNew":"Jendela Baru (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Jendela yang Sama (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Kiri ke Kanan (LTR)","langDirRTL":"Kanan ke Kiri (RTL)","styles":"Gaya","cssClasses":"Kelas Stylesheet","width":"Lebar","height":"Tinggi","align":"Penjajaran","alignLeft":"Kiri","alignRight":"Kanan","alignCenter":"Tengah","alignTop":"Atas","alignMiddle":"Tengah","alignBottom":"Bawah","invalidValue":"Nilai tidak sah.","invalidHeight":"Tinggi harus sebuah angka.","invalidWidth":"Lebar harus sebuah angka.","invalidCssLength":"Nilai untuk \"%1\" harus sebuah angkat positif dengan atau tanpa pengukuran unit CSS yang sah (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Nilai yang dispesifikasian untuk kolom \"%1\" harus sebuah angka positif dengan atau tanpa sebuah unit pengukuran HTML (px atau %) yang valid.","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Masukkan sebuah angka untuk sebuah nilai dalam pixel atau sebuah angka dengan unit CSS yang sah (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, tidak tersedia</span>"},"about":{"copy":"Hak cipta &copy; $1. All rights reserved.","dlgTitle":"Tentang CKEditor","help":"Cel $1 untuk bantuan.","moreInfo":"Untuk informasi lisensi silahkan kunjungi web site kami:","title":"Tentang CKEditor","userGuide":"Petunjuk Pengguna CKEditor"},"basicstyles":{"bold":"Huruf Tebal","italic":"Huruf Miring","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Garis Bawah"},"bidi":{"ltr":"Arah penulisan dari kiri ke kanan.","rtl":"Arah penulisan dari kanan ke kiri."},"blockquote":{"toolbar":"Kutipan Blok"},"clipboard":{"copy":"Salin","copyError":"Pengaturan keamanan peramban anda tidak mengizinkan editor untuk mengeksekusi operasi menyalin secara otomatis. Mohon gunakan papan tuts (Ctrl/Cmd+C)","cut":"Potong","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Tempel","pasteArea":"Area Tempel","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Tempel"},"colorbutton":{"auto":"Automatic","bgColorTitle":"Warna Latar Belakang","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"More Colors...","panelTitle":"Warna","textColorTitle":"Text Color"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"Contoh","emptyListMsg":"(Tidak ada contoh didefinisikan)","insertOption":"Ganti konten sebenarnya","options":"Opsi Contoh","selectPromptMsg":"Mohon pilih contoh untuk dibuka di editor","title":"Contoh Konten"},"contextmenu":{"options":"Opsi Konteks Pilihan"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Penasehat Judul","cssClassInputLabel":"Kelas Stylesheet","edit":"Sunting Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Kiri ke Kanan (LTR)","langDirLabel":"Arah Bahasa","langDirRTLLabel":"Kanan ke Kiri (RTL)","languageCodeInputLabel":"Kode Bahasa","remove":"Hapus Div","styleSelectLabel":"Gaya","title":"Ciptakan Wadah Div","toolbar":"Cipatakan Wadah Div"},"toolbar":{"toolbarCollapse":"Ciutkan Toolbar","toolbarExpand":"Bentangkan Toolbar","toolbarGroups":{"document":"Dokumen","clipboard":"Papan klip / Kembalikan perlakuan","editing":"Sunting","forms":"Formulir","basicstyles":"Gaya Dasar","paragraph":"Paragraf","links":"Tautan","insert":"Sisip","styles":"Gaya","colors":"Warna","tools":"Alat"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"Temukan","findOptions":"Opsi menemukan","findWhat":"Temukan apa:","matchCase":"Match case","matchCyclic":"Match cyclic","matchWord":"Match whole word","notFoundMsg":"The specified text was not found.","replace":"Ganti","replaceAll":"Ganti Semua","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Ganti dengan:","title":"Temukan dan Ganti"},"fakeobjects":{"anchor":"Anchor","flash":"Animasi Flash","hiddenfield":"Kolom Tersembunyi","iframe":"IFrame","unknown":"Obyek Tak Dikenal"},"flash":{"access":"Script Access","accessAlways":"Selalu","accessNever":"Tidak Pernah","accessSameDomain":"Domain yang sama","alignAbsBottom":"Abs Bottom","alignAbsMiddle":"Abs Middle","alignBaseline":"Dasar","alignTextTop":"Text Top","bgcolor":"Warna Latar Belakang","chkFull":"Izinkan Layar Penuh","chkLoop":"Loop","chkMenu":"Enable Flash Menu","chkPlay":"Mainkan Otomatis","flashvars":"Variables for Flash","hSpace":"HSpace","properties":"Flash Properties","propertiesTab":"Properti","quality":"Kualitas","qualityAutoHigh":"Tinggi Otomatis","qualityAutoLow":"Rendah Otomatis","qualityBest":"Terbaik","qualityHigh":"Tinggi","qualityLow":"Rendah","qualityMedium":"Sedang","scale":"Scale","scaleAll":"Perlihatkan semua","scaleFit":"Exact Fit","scaleNoBorder":"Tanpa Batas","title":"Flash Properties","vSpace":"VSpace","validateHSpace":"HSpace harus sebuah angka","validateSrc":"URL tidak boleh kosong","validateVSpace":"VSpace harus sebuah angka","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparan","windowModeWindow":"Jendela"},"font":{"fontSize":{"label":"Ukuran","voiceLabel":"Font Size","panelTitle":"Font Size"},"label":"Font","panelTitle":"Font Name","voiceLabel":"Font"},"forms":{"button":{"title":"Button Properties","text":"Teks (Nilai)","type":"Tipe","typeBtn":"Tombol","typeSbm":"Menyerahkan","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"Checkbox Properties","radioTitle":"Radio Button Properties","value":"Nilai","selected":"Terpilih"},"form":{"title":"Form Properties","menu":"Form Properties","action":"Aksi","method":"Metode","encoding":"Encoding"},"hidden":{"title":"Hidden Field Properties","name":"Nama","value":"Nilai"},"select":{"title":"Selection Field Properties","selectInfo":"Select Info","opAvail":"Available Options","value":"Nilai","size":"Ukuran","lines":"garis","chkMulti":"Izinkan pemilihan ganda","opText":"Teks","opValue":"Nilai","btnAdd":"Tambah","btnModify":"Modifikasi","btnUp":"Atas","btnDown":"Bawah","btnSetValue":"Set as selected value","btnDelete":"Hapus"},"textarea":{"title":"Textarea Properties","cols":"Kolom","rows":"Baris"},"textfield":{"title":"Text Field Properties","name":"Name","value":"Nilai","charWidth":"Character Width","maxChars":"Maximum Characters","type":"Tipe","typeText":"Teks","typePass":"Kata kunci","typeEmail":"Surel","typeSearch":"Cari","typeTel":"Nomor Telepon","typeUrl":"URL"}},"format":{"label":"Bentuk","panelTitle":"Bentuk Paragraf","tag_address":"Alamat","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Membentuk"},"horizontalrule":{"toolbar":"Sisip Garis Horisontal"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Mohon tulis URL gambar","alt":"Teks alternatif","border":"Batas","btnUpload":"Kirim ke Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Info Gambar","linkTab":"Tautan","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Unggah","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Tingkatkan Lekuk","outdent":"Kurangi Lekuk"},"smiley":{"options":"Opsi Smiley","title":"Sisip sebuah Smiley","toolbar":"Smiley"},"justify":{"block":"Rata kiri-kanan","center":"Pusat","left":"Align Left","right":"Align Right"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Penasehat Judul","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Kelas Stylesheet","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Kode Bahasa","langDir":"Arah Bahasa","langDirLTR":"Kiri ke Kanan (LTR)","langDirRTL":"Kanan ke Kiri (RTL)","menu":"Edit Link","name":"Nama","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Gaya","tabIndex":"Tab Index","target":"Sasaran","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Tautan","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Tautan","type":"Link Type","unlink":"Unlink","upload":"Unggah"},"list":{"bulletedlist":"Sisip/Hapus Daftar Bullet","numberedlist":"Sisip/Hapus Daftar Bernomor"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Lingkaran","decimal":"Desimal (1, 2, 3, dst.)","decimalLeadingZero":"Desimal diawali angka nol (01, 02, 03, dst.)","disc":"Cakram","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Huruf Kecil (a, b, c, d, e, dst.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Angka Romawi (i, ii, iii, iv, v, dst.)","none":"Tidak ada","notset":"<tidak diatur>","numberedTitle":"Numbered List Properties","square":"Persegi","start":"Mulai","type":"Tipe","upperAlpha":"Huruf Besar (A, B, C, D, E, dst.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Masukkan paragraf disini"},"maximize":{"maximize":"Memperbesar","minimize":"Memperkecil"},"newpage":{"toolbar":"Halaman Baru"},"pagebreak":{"alt":"Halaman Istirahat","toolbar":"Sisip Halaman Istirahat untuk Pencetakan "},"pastetext":{"button":"Tempel sebagai teks polos","title":"Tempel sebagai Teks Polos"},"pastefromword":{"confirmCleanup":"Teks yang ingin anda tempel sepertinya di salin dari Word. Apakah anda mau membersihkannya sebelum menempel?","error":"Tidak mungkin membersihkan data yang ditempel dikerenakan kesalahan internal","title":"Tempel dari Word","toolbar":"Tempel dari Word"},"preview":{"preview":"Pratinjau"},"print":{"toolbar":"Cetak"},"removeformat":{"toolbar":"Hapus Format"},"save":{"toolbar":"Simpan"},"selectall":{"toolbar":"Pilih Semua"},"showblocks":{"toolbar":"Perlihatkan Blok"},"sourcearea":{"toolbar":"Sumber"},"specialchar":{"options":"Opsi spesial karakter","title":"Pilih spesial karakter","toolbar":"Sisipkan spesial karakter"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Gaya","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Ukuran batas","caption":"Judul halaman","cell":{"menu":"Sel","insertBefore":"Sisip Sel Sebelum","insertAfter":"Sisip Sel Setelah","deleteCell":"Hapus Sel","merge":"Gabungkan Sel","mergeRight":"Gabungkan ke Kanan","mergeDown":"Gabungkan ke Bawah","splitHorizontal":"Pisahkan Sel Secara Horisontal","splitVertical":"Pisahkan Sel Secara Vertikal","title":"Properti Sel","cellType":"Tipe Sel","rowSpan":"Rentang antar baris","colSpan":"Rentang antar kolom","wordWrap":"Word Wrap","hAlign":"Jajaran Horisontal","vAlign":"Jajaran Vertikal","alignBaseline":"Dasar","bgColor":"Warna Latar Belakang","borderColor":"Warna Batasan","data":"Data","header":"Header","yes":"Ya","no":"Tidak","invalidWidth":"Lebar sel harus sebuah angka.","invalidHeight":"Tinggi sel harus sebuah angka","invalidRowSpan":"Rentang antar baris harus angka seluruhnya.","invalidColSpan":"Rentang antar kolom harus angka seluruhnya","chooseColor":"Pilih"},"cellPad":"Sel spasi dalam","cellSpace":"Spasi antar sel","column":{"menu":"Kolom","insertBefore":"Sisip Kolom Sebelum","insertAfter":"Sisip Kolom Sesudah","deleteColumn":"Hapus Kolom"},"columns":"Kolom","deleteTable":"Hapus Tabel","headers":"Headers","headersBoth":"Keduanya","headersColumn":"Kolom pertama","headersNone":"Tidak ada","headersRow":"Baris Pertama","invalidBorder":"Ukuran batasan harus sebuah angka","invalidCellPadding":"'Spasi dalam' sel harus angka positif.","invalidCellSpacing":"Spasi antar sel harus angka positif.","invalidCols":"Jumlah kolom harus sebuah angka lebih besar dari 0","invalidHeight":"Tinggi tabel harus sebuah angka.","invalidRows":"Jumlah barus harus sebuah angka dan lebih besar dari 0.","invalidWidth":"Lebar tabel harus sebuah angka.","menu":"Properti Tabel","row":{"menu":"Baris","insertBefore":"Sisip Baris Sebelum","insertAfter":"Sisip Baris Sesudah","deleteRow":"Hapus Baris"},"rows":"Baris","summary":"Intisari","title":"Properti Tabel","toolbar":"Tabe","widthPc":"persen","widthPx":"piksel","widthUnit":"lebar satuan"},"undo":{"redo":"Kembali lakukan","undo":"Batalkan perlakuan"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/is.js b/htmltest/sites/all/libraries/ckeditor-version/lang/is.js
new file mode 100644
index 00000000..9dc31635
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/is.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['is']={"editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Fletta í skjalasafni","url":"Vefslóð","protocol":"Samskiptastaðall","upload":"Senda upp","uploadSubmit":"Hlaða upp","image":"Setja inn mynd","flash":"Flash","form":"Setja inn innsláttarform","checkbox":"Setja inn hökunarreit","radio":"Setja inn valhnapp","textField":"Setja inn textareit","textarea":"Setja inn textasvæði","hiddenField":"Setja inn falið svæði","button":"Setja inn hnapp","select":"Setja inn lista","imageButton":"Setja inn myndahnapp","notSet":"<ekkert valið>","id":"Auðkenni","name":"Nafn","langDir":"Lesstefna","langDirLtr":"Frá vinstri til hægri (LTR)","langDirRtl":"Frá hægri til vinstri (RTL)","langCode":"Tungumálakóði","longDescr":"Nánari lýsing","cssClass":"Stílsniðsflokkur","advisoryTitle":"Titill","cssStyle":"Stíll","ok":"Í lagi","cancel":"Hætta við","close":"Close","preview":"Forskoða","resize":"Resize","generalTab":"Almennt","advancedTab":"Tæknilegt","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Mark","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Frá vinstri til hægri (LTR)","langDirRTL":"Frá hægri til vinstri (RTL)","styles":"Stíll","cssClasses":"Stílsniðsflokkur","width":"Breidd","height":"Hæð","align":"Jöfnun","alignLeft":"Vinstri","alignRight":"Hægri","alignCenter":"Miðjað","alignTop":"Efst","alignMiddle":"Miðjuð","alignBottom":"Neðst","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Feitletrað","italic":"Skáletrað","strike":"Yfirstrikað","subscript":"Niðurskrifað","superscript":"Uppskrifað","underline":"Undirstrikað"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Inndráttur"},"clipboard":{"copy":"Afrita","copyError":"Öryggisstillingar vafrans þíns leyfa ekki afritun texta með músaraðgerð. Notaðu lyklaborðið í afrita (Ctrl/Cmd+C).","cut":"Klippa","cutError":"Öryggisstillingar vafrans þíns leyfa ekki klippingu texta með músaraðgerð. Notaðu lyklaborðið í klippa (Ctrl/Cmd+X).","paste":"Líma","pasteArea":"Paste Area","pasteMsg":"Límdu í svæðið hér að neðan og (<STRONG>Ctrl/Cmd+V</STRONG>) og smelltu á <STRONG>OK</STRONG>.","securityMsg":"Vegna öryggisstillinga í vafranum þínum fær ritillinn ekki beinan aðgang að klippuborðinu. Þú verður að líma innihaldið aftur inn í þennan glugga.","title":"Líma"},"colorbutton":{"auto":"Sjálfval","bgColorTitle":"Bakgrunnslitur","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"Fleiri liti...","panelTitle":"Colors","textColorTitle":"Litur texta"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"Sniðmát","emptyListMsg":"(Ekkert sniðmát er skilgreint!)","insertOption":"Skipta út raunverulegu innihaldi","options":"Template Options","selectPromptMsg":"Veldu sniðmát til að opna í ritlinum.<br>(Núverandi innihald víkur fyrir því!):","title":"Innihaldssniðmát"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Left to Right (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Right to Left (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"Leita","findOptions":"Find Options","findWhat":"Leita að:","matchCase":"Gera greinarmun á¡ há¡- og lágstöfum","matchCyclic":"Match cyclic","matchWord":"Aðeins heil orð","notFoundMsg":"Leitartexti fannst ekki!","replace":"Skipta út","replaceAll":"Skipta út allsstaðar","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Skipta út fyrir:","title":"Finna og skipta"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"Abs neðst","alignAbsMiddle":"Abs miðjuð","alignBaseline":"Grunnlína","alignTextTop":"Efri brún texta","bgcolor":"Bakgrunnslitur","chkFull":"Allow Fullscreen","chkLoop":"Endurtekning","chkMenu":"Sýna Flash-valmynd","chkPlay":"Sjálfvirk spilun","flashvars":"Variables for Flash","hSpace":"Vinstri bil","properties":"Eigindi Flash","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"Skali","scaleAll":"Sýna allt","scaleFit":"Fella skala að stærð","scaleNoBorder":"Án ramma","title":"Eigindi Flash","vSpace":"Hægri bil","validateHSpace":"HSpace must be a number.","validateSrc":"Sláðu inn veffang stiklunnar!","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Leturstærð ","voiceLabel":"Font Size","panelTitle":"Leturstærð "},"label":"Leturgerð ","panelTitle":"Leturgerð ","voiceLabel":"Leturgerð "},"forms":{"button":{"title":"Eigindi hnapps","text":"Texti","type":"Gerð","typeBtn":"Hnappur","typeSbm":"Staðfesta","typeRst":"Hreinsa"},"checkboxAndRadio":{"checkboxTitle":"Eigindi markreits","radioTitle":"Eigindi valhnapps","value":"Gildi","selected":"Valið"},"form":{"title":"Eigindi innsláttarforms","menu":"Eigindi innsláttarforms","action":"Aðgerð","method":"Aðferð","encoding":"Encoding"},"hidden":{"title":"Eigindi falins svæðis","name":"Nafn","value":"Gildi"},"select":{"title":"Eigindi lista","selectInfo":"Upplýsingar","opAvail":"Kostir","value":"Gildi","size":"Stærð","lines":"línur","chkMulti":"Leyfa fleiri kosti","opText":"Texti","opValue":"Gildi","btnAdd":"Bæta við","btnModify":"Breyta","btnUp":"Upp","btnDown":"Niður","btnSetValue":"Merkja sem valið","btnDelete":"Eyða"},"textarea":{"title":"Eigindi textasvæðis","cols":"Dálkar","rows":"Línur"},"textfield":{"title":"Eigindi textareits","name":"Nafn","value":"Gildi","charWidth":"Breidd (leturtákn)","maxChars":"Hámarksfjöldi leturtákna","type":"Gerð","typeText":"Texti","typePass":"Lykilorð","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"Vefslóð"}},"format":{"label":"Stílsnið","panelTitle":"Stílsnið","tag_address":"Vistfang","tag_div":"Venjulegt (DIV)","tag_h1":"Fyrirsögn 1","tag_h2":"Fyrirsögn 2","tag_h3":"Fyrirsögn 3","tag_h4":"Fyrirsögn 4","tag_h5":"Fyrirsögn 5","tag_h6":"Fyrirsögn 6","tag_p":"Venjulegt letur","tag_pre":"Forsniðið"},"horizontalrule":{"toolbar":"Lóðrétt lína"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Sláðu inn slóðina að myndinni","alt":"Baklægur texti","border":"Rammi","btnUpload":"Hlaða upp","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Vinstri bil","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Almennt","linkTab":"Stikla","lockRatio":"Festa stærðarhlutfall","menu":"Eigindi myndar","resetSize":"Reikna stærð","title":"Eigindi myndar","titleButton":"Eigindi myndahnapps","upload":"Hlaða upp","urlMissing":"Image source URL is missing.","vSpace":"Hægri bil","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Minnka inndrátt","outdent":"Auka inndrátt"},"smiley":{"options":"Smiley Options","title":"Velja svip","toolbar":"Svipur"},"justify":{"block":"Jafna báðum megin","center":"Miðja texta","left":"Vinstrijöfnun","right":"Hægrijöfnun"},"link":{"acccessKey":"Skammvalshnappur","advanced":"Tæknilegt","advisoryContentType":"Tegund innihalds","advisoryTitle":"Titill","anchor":{"toolbar":"Stofna/breyta kaflamerki","menu":"Eigindi kaflamerkis","title":"Eigindi kaflamerkis","name":"Nafn bókamerkis","errorName":"Sláðu inn nafn bókamerkis!","remove":"Remove Anchor"},"anchorId":"Eftir auðkenni einingar","anchorName":"Eftir akkerisnafni","charset":"Táknróf","cssClasses":"Stílsniðsflokkur","emailAddress":"Netfang","emailBody":"Meginmál","emailSubject":"Efni","id":"Auðkenni","info":"Almennt","langCode":"Lesstefna","langDir":"Lesstefna","langDirLTR":"Frá vinstri til hægri (LTR)","langDirRTL":"Frá hægri til vinstri (RTL)","menu":"Breyta stiklu","name":"Nafn","noAnchors":"<Engin bókamerki á skrá>","noEmail":"Sláðu inn netfang!","noUrl":"Sláðu inn veffang stiklunnar!","other":"<annar>","popupDependent":"Háð venslum (Netscape)","popupFeatures":"Eigindi sprettiglugga","popupFullScreen":"Heilskjár (IE)","popupLeft":"Fjarlægð frá vinstri","popupLocationBar":"Fanglína","popupMenuBar":"Vallína","popupResizable":"Resizable","popupScrollBars":"Skrunstikur","popupStatusBar":"Stöðustika","popupToolbar":"Verkfærastika","popupTop":"Fjarlægð frá efri brún","rel":"Relationship","selectAnchor":"Veldu akkeri","styles":"Stíll","tabIndex":"Raðnúmer innsláttarreits","target":"Mark","targetFrame":"<rammi>","targetFrameName":"Nafn markglugga","targetPopup":"<sprettigluggi>","targetPopupName":"Nafn sprettiglugga","title":"Stikla","toAnchor":"Bókamerki á þessari síðu","toEmail":"Netfang","toUrl":"Vefslóð","toolbar":"Stofna/breyta stiklu","type":"Stikluflokkur","unlink":"Fjarlægja stiklu","upload":"Senda upp"},"list":{"bulletedlist":"Punktalisti","numberedlist":"Númeraður listi"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"newpage":{"toolbar":"Ný síða"},"pagebreak":{"alt":"Page Break","toolbar":"Setja inn síðuskil"},"pastetext":{"button":"Líma sem ósniðinn texta","title":"Líma sem ósniðinn texta"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Líma úr Word","toolbar":"Líma úr Word"},"preview":{"preview":"Forskoða"},"print":{"toolbar":"Prenta"},"removeformat":{"toolbar":"Fjarlægja snið"},"save":{"toolbar":"Vista"},"selectall":{"toolbar":"Velja allt"},"showblocks":{"toolbar":"Sýna blokkir"},"sourcearea":{"toolbar":"Kóði"},"specialchar":{"options":"Special Character Options","title":"Velja tákn","toolbar":"Setja inn merki"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stílflokkur","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Breidd ramma","caption":"Titill","cell":{"menu":"Reitur","insertBefore":"Skjóta inn reiti fyrir aftan","insertAfter":"Skjóta inn reiti fyrir framan","deleteCell":"Fella reit","merge":"Sameina reiti","mergeRight":"Sameina til hægri","mergeDown":"Sameina niður á við","splitHorizontal":"Kljúfa reit lárétt","splitVertical":"Kljúfa reit lóðrétt","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Reitaspássía","cellSpace":"Bil milli reita","column":{"menu":"Dálkur","insertBefore":"Skjóta inn dálki vinstra megin","insertAfter":"Skjóta inn dálki hægra megin","deleteColumn":"Fella dálk"},"columns":"Dálkar","deleteTable":"Fella töflu","headers":"Fyrirsagnir","headersBoth":"Hvort tveggja","headersColumn":"Fyrsti dálkur","headersNone":"Engar","headersRow":"Fyrsta röð","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Eigindi töflu","row":{"menu":"Röð","insertBefore":"Skjóta inn röð fyrir ofan","insertAfter":"Skjóta inn röð fyrir neðan","deleteRow":"Eyða röð"},"rows":"Raðir","summary":"Áfram","title":"Eigindi töflu","toolbar":"Tafla","widthPc":"prósent","widthPx":"myndeindir","widthUnit":"width unit"},"undo":{"redo":"Hætta við afturköllun","undo":"Afturkalla"},"wsc":{"btnIgnore":"Hunsa","btnIgnoreAll":"Hunsa allt","btnReplace":"Skipta","btnReplaceAll":"Skipta öllu","btnUndo":"Til baka","changeTo":"Tillaga","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Villuleit ekki sett upp.<br>Viltu setja hana upp?","manyChanges":"Villuleit lokið: %1 orðum breytt","noChanges":"Villuleit lokið: Engu orði breytt","noMispell":"Villuleit lokið: Engin villa fannst","noSuggestions":"- engar tillögur -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Ekki í orðabókinni","oneChange":"Villuleit lokið: Einu orði breytt","progress":"Villuleit í gangi...","title":"Spell Check","toolbar":"Villuleit"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/it.js b/htmltest/sites/all/libraries/ckeditor-version/lang/it.js
new file mode 100644
index 00000000..b3c05e24
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/it.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['it']={"editor":"Rich Text Editor","common":{"editorHelp":"Premi ALT 0 per aiuto","browseServer":"Cerca sul server","url":"URL","protocol":"Protocollo","upload":"Carica","uploadSubmit":"Invia al server","image":"Immagine","flash":"Oggetto Flash","form":"Modulo","checkbox":"Checkbox","radio":"Radio Button","textField":"Campo di testo","textarea":"Area di testo","hiddenField":"Campo nascosto","button":"Bottone","select":"Menu di selezione","imageButton":"Bottone immagine","notSet":"<non impostato>","id":"Id","name":"Nome","langDir":"Direzione scrittura","langDirLtr":"Da Sinistra a Destra (LTR)","langDirRtl":"Da Destra a Sinistra (RTL)","langCode":"Codice Lingua","longDescr":"URL descrizione estesa","cssClass":"Nome classe CSS","advisoryTitle":"Titolo","cssStyle":"Stile","ok":"OK","cancel":"Annulla","close":"Chiudi","preview":"Anteprima","resize":"Trascina per ridimensionare","generalTab":"Generale","advancedTab":"Avanzate","validateNumberFailed":"Il valore inserito non è un numero.","confirmNewPage":"Ogni modifica non salvata sarà persa. Sei sicuro di voler caricare una nuova pagina?","confirmCancel":"Alcune delle opzioni sono state cambiate. Sei sicuro di voler chiudere la finestra di dialogo?","options":"Opzioni","target":"Destinazione","targetNew":"Nuova finestra (_blank)","targetTop":"Finestra in primo piano (_top)","targetSelf":"Stessa finestra (_self)","targetParent":"Finestra Padre (_parent)","langDirLTR":"Da sinistra a destra (LTR)","langDirRTL":"Da destra a sinistra (RTL)","styles":"Stile","cssClasses":"Classi di stile","width":"Larghezza","height":"Altezza","align":"Allineamento","alignLeft":"Sinistra","alignRight":"Destra","alignCenter":"Centrato","alignTop":"In Alto","alignMiddle":"Centrato","alignBottom":"In Basso","invalidValue":"Valore non valido.","invalidHeight":"L'altezza dev'essere un numero","invalidWidth":"La Larghezza dev'essere un numero","invalidCssLength":"Il valore indicato per il campo \"%1\" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le classi CSS (px, %, in, cm, mm, em, ex, pt, o pc).","invalidHtmlLength":"Il valore indicato per il campo \"%1\" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le pagine HTML (px o %).","invalidInlineStyle":"Il valore specificato per lo stile inline deve consistere in una o più tuple con il formato di \"name : value\", separati da semicolonne.","cssLengthTooltip":"Inserisci un numero per il valore in pixel oppure un numero con una valida unità CSS (px, %, in, cm, mm, ex, pt, o pc).","unavailable":"%1<span class=\"cke_accessibility\">, non disponibile</span>"},"about":{"copy":"Copyright &copy; $1. Tutti i diritti riservati.","dlgTitle":"Riguardo CKEditor","help":"Vedi $1 per l'aiuto.","moreInfo":"Per le informazioni sulla licenza si prega di visitare il nostro sito:","title":"Riguardo CKEditor","userGuide":"Guida Utente CKEditor"},"basicstyles":{"bold":"Grassetto","italic":"Corsivo","strike":"Barrato","subscript":"Pedice","superscript":"Apice","underline":"Sottolineato"},"bidi":{"ltr":"Direzione del testo da sinistra verso destra","rtl":"Direzione del testo da destra verso sinistra"},"blockquote":{"toolbar":"Citazione"},"clipboard":{"copy":"Copia","copyError":"Le impostazioni di sicurezza del browser non permettono di copiare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+C).","cut":"Taglia","cutError":"Le impostazioni di sicurezza del browser non permettono di tagliare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+X).","paste":"Incolla","pasteArea":"Incolla","pasteMsg":"Incolla il testo all'interno dell'area sottostante usando la scorciatoia di tastiere (<STRONG>Ctrl/Cmd+V</STRONG>) e premi <STRONG>OK</STRONG>.","securityMsg":"A causa delle impostazioni di sicurezza del browser,l'editor non è in grado di accedere direttamente agli appunti. E' pertanto necessario incollarli di nuovo in questa finestra.","title":"Incolla"},"colorbutton":{"auto":"Automatico","bgColorTitle":"Colore sfondo","colors":{"000":"Nero","800000":"Marrone Castagna","8B4513":"Marrone Cuoio","2F4F4F":"Grigio Fumo di Londra","008080":"Acquamarina","000080":"Blu Oceano","4B0082":"Indigo","696969":"Grigio Scuro","B22222":"Giallo Fiamma","A52A2A":"Marrone","DAA520":"Giallo Mimosa","006400":"Verde Scuro","40E0D0":"Turchese","0000CD":"Blue Scuro","800080":"Viola","808080":"Grigio","F00":"Rosso","FF8C00":"Arancio Scuro","FFD700":"Oro","008000":"Verde","0FF":"Ciano","00F":"Blu","EE82EE":"Violetto","A9A9A9":"Grigio Scuro","FFA07A":"Salmone","FFA500":"Arancio","FFFF00":"Giallo","00FF00":"Lime","AFEEEE":"Turchese Chiaro","ADD8E6":"Blu Chiaro","DDA0DD":"Rosso Ciliegia","D3D3D3":"Grigio Chiaro","FFF0F5":"Lavanda Chiara","FAEBD7":"Bianco Antico","FFFFE0":"Giallo Chiaro","F0FFF0":"Verde Mela","F0FFFF":"Azzurro","F0F8FF":"Celeste","E6E6FA":"Lavanda","FFF":"Bianco"},"more":"Altri colori...","panelTitle":"Colori","textColorTitle":"Colore testo"},"colordialog":{"clear":"cancella","highlight":"Evidenzia","options":"Opzioni colore","selected":"Seleziona il colore","title":"Selezionare il colore"},"templates":{"button":"Modelli","emptyListMsg":"(Nessun modello definito)","insertOption":"Cancella il contenuto corrente","options":"Opzioni del Modello","selectPromptMsg":"Seleziona il modello da aprire nell'editor","title":"Contenuto dei modelli"},"contextmenu":{"options":"Opzioni del menù contestuale"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Titolo Avviso","cssClassInputLabel":"Classi di stile","edit":"Modifica DIV","inlineStyleInputLabel":"Stile Inline","langDirLTRLabel":"Da sinistra a destra (LTR)","langDirLabel":"Direzione di scrittura","langDirRTLLabel":"Da destra a sinistra (RTL)","languageCodeInputLabel":"Codice lingua","remove":"Rimuovi DIV","styleSelectLabel":"Stile","title":"Crea DIV contenitore","toolbar":"Crea DIV contenitore"},"toolbar":{"toolbarCollapse":"Minimizza Toolbar","toolbarExpand":"Espandi Toolbar","toolbarGroups":{"document":"Documento","clipboard":"Copia negli appunti/Annulla","editing":"Modifica","forms":"Form","basicstyles":"Stili di base","paragraph":"Paragrafo","links":"Link","insert":"Inserisci","styles":"Stili","colors":"Colori","tools":"Strumenti"},"toolbars":"Editor toolbar"},"elementspath":{"eleLabel":"Percorso degli elementi","eleTitle":"%1 elemento"},"find":{"find":"Trova","findOptions":"Opzioni di ricerca","findWhat":"Trova:","matchCase":"Maiuscole/minuscole","matchCyclic":"Ricerca ciclica","matchWord":"Solo parole intere","notFoundMsg":"L'elemento cercato non è stato trovato.","replace":"Sostituisci","replaceAll":"Sostituisci tutto","replaceSuccessMsg":"%1 occorrenza(e) sostituite.","replaceWith":"Sostituisci con:","title":"Cerca e Sostituisci"},"fakeobjects":{"anchor":"Ancora","flash":"Animazione Flash","hiddenfield":"Campo Nascosto","iframe":"IFrame","unknown":"Oggetto sconosciuto"},"flash":{"access":"Accesso Script","accessAlways":"Sempre","accessNever":"Mai","accessSameDomain":"Solo stesso dominio","alignAbsBottom":"In basso assoluto","alignAbsMiddle":"Centrato assoluto","alignBaseline":"Linea base","alignTextTop":"In alto al testo","bgcolor":"Colore sfondo","chkFull":"Permetti la modalità tutto schermo","chkLoop":"Riavvio automatico","chkMenu":"Abilita Menu di Flash","chkPlay":"Avvio Automatico","flashvars":"Variabili per Flash","hSpace":"HSpace","properties":"Proprietà Oggetto Flash","propertiesTab":"Proprietà","quality":"Qualità","qualityAutoHigh":"Alta Automatica","qualityAutoLow":"Bassa Automatica","qualityBest":"Massima","qualityHigh":"Alta","qualityLow":"Bassa","qualityMedium":"Intermedia","scale":"Ridimensiona","scaleAll":"Mostra Tutto","scaleFit":"Dimensione Esatta","scaleNoBorder":"Senza Bordo","title":"Proprietà Oggetto Flash","vSpace":"VSpace","validateHSpace":"L'HSpace dev'essere un numero.","validateSrc":"Devi inserire l'URL del collegamento","validateVSpace":"Il VSpace dev'essere un numero.","windowMode":"Modalità finestra","windowModeOpaque":"Opaca","windowModeTransparent":"Trasparente","windowModeWindow":"Finestra"},"font":{"fontSize":{"label":"Dimensione","voiceLabel":"Dimensione Carattere","panelTitle":"Dimensione"},"label":"Carattere","panelTitle":"Carattere","voiceLabel":"Carattere"},"forms":{"button":{"title":"Proprietà bottone","text":"Testo (Valore)","type":"Tipo","typeBtn":"Bottone","typeSbm":"Invio","typeRst":"Annulla"},"checkboxAndRadio":{"checkboxTitle":"Proprietà checkbox","radioTitle":"Proprietà radio button","value":"Valore","selected":"Selezionato"},"form":{"title":"Proprietà modulo","menu":"Proprietà modulo","action":"Azione","method":"Metodo","encoding":"Codifica"},"hidden":{"title":"Proprietà campo nascosto","name":"Nome","value":"Valore"},"select":{"title":"Proprietà menu di selezione","selectInfo":"Info","opAvail":"Opzioni disponibili","value":"Valore","size":"Dimensione","lines":"righe","chkMulti":"Permetti selezione multipla","opText":"Testo","opValue":"Valore","btnAdd":"Aggiungi","btnModify":"Modifica","btnUp":"Su","btnDown":"Gi","btnSetValue":"Imposta come predefinito","btnDelete":"Rimuovi"},"textarea":{"title":"Proprietà area di testo","cols":"Colonne","rows":"Righe"},"textfield":{"title":"Proprietà campo di testo","name":"Nome","value":"Valore","charWidth":"Larghezza","maxChars":"Numero massimo di caratteri","type":"Tipo","typeText":"Testo","typePass":"Password","typeEmail":"Email","typeSearch":"Cerca","typeTel":"Numero di telefono","typeUrl":"URL"}},"format":{"label":"Formato","panelTitle":"Formato","tag_address":"Indirizzo","tag_div":"Paragrafo (DIV)","tag_h1":"Titolo 1","tag_h2":"Titolo 2","tag_h3":"Titolo 3","tag_h4":"Titolo 4","tag_h5":"Titolo 5","tag_h6":"Titolo 6","tag_p":"Normale","tag_pre":"Formattato"},"horizontalrule":{"toolbar":"Inserisci riga orizzontale"},"iframe":{"border":"Mostra il bordo","noUrl":"Inserire l'URL del campo IFrame","scrolling":"Abilita scrollbar","title":"Proprietà IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Devi inserire l'URL per l'immagine","alt":"Testo alternativo","border":"Bordo","btnUpload":"Invia al server","button2Img":"Vuoi trasformare il bottone immagine selezionato in un'immagine semplice?","hSpace":"HSpace","img2Button":"Vuoi trasferomare l'immagine selezionata in un bottone immagine?","infoTab":"Informazioni immagine","linkTab":"Collegamento","lockRatio":"Blocca rapporto","menu":"Proprietà immagine","resetSize":"Reimposta dimensione","title":"Proprietà immagine","titleButton":"Proprietà bottone immagine","upload":"Carica","urlMissing":"Manca l'URL dell'immagine.","vSpace":"VSpace","validateBorder":"Il campo Bordo deve essere un numero intero.","validateHSpace":"Il campo HSpace deve essere un numero intero.","validateVSpace":"Il campo VSpace deve essere un numero intero."},"indent":{"indent":"Aumenta rientro","outdent":"Riduci rientro"},"smiley":{"options":"Opzioni Smiley","title":"Inserisci emoticon","toolbar":"Emoticon"},"justify":{"block":"Giustifica","center":"Centra","left":"Allinea a sinistra","right":"Allinea a destra"},"link":{"acccessKey":"Scorciatoia da tastiera","advanced":"Avanzate","advisoryContentType":"Tipo della risorsa collegata","advisoryTitle":"Titolo","anchor":{"toolbar":"Inserisci/Modifica Ancora","menu":"Proprietà ancora","title":"Proprietà ancora","name":"Nome ancora","errorName":"Inserici il nome dell'ancora","remove":"Rimuovi l'ancora"},"anchorId":"Per id elemento","anchorName":"Per Nome","charset":"Set di caretteri della risorsa collegata","cssClasses":"Nome classe CSS","emailAddress":"Indirizzo E-Mail","emailBody":"Corpo del messaggio","emailSubject":"Oggetto del messaggio","id":"Id","info":"Informazioni collegamento","langCode":"Direzione scrittura","langDir":"Direzione scrittura","langDirLTR":"Da Sinistra a Destra (LTR)","langDirRTL":"Da Destra a Sinistra (RTL)","menu":"Modifica collegamento","name":"Nome","noAnchors":"(Nessuna ancora disponibile nel documento)","noEmail":"Devi inserire un'indirizzo e-mail","noUrl":"Devi inserire l'URL del collegamento","other":"<altro>","popupDependent":"Dipendente (Netscape)","popupFeatures":"Caratteristiche finestra popup","popupFullScreen":"A tutto schermo (IE)","popupLeft":"Posizione da sinistra","popupLocationBar":"Barra degli indirizzi","popupMenuBar":"Barra del menu","popupResizable":"Ridimensionabile","popupScrollBars":"Barre di scorrimento","popupStatusBar":"Barra di stato","popupToolbar":"Barra degli strumenti","popupTop":"Posizione dall'alto","rel":"Relazioni","selectAnchor":"Scegli Ancora","styles":"Stile","tabIndex":"Ordine di tabulazione","target":"Destinazione","targetFrame":"<riquadro>","targetFrameName":"Nome del riquadro di destinazione","targetPopup":"<finestra popup>","targetPopupName":"Nome finestra popup","title":"Collegamento","toAnchor":"Ancora nel testo","toEmail":"E-Mail","toUrl":"URL","toolbar":"Collegamento","type":"Tipo di Collegamento","unlink":"Elimina collegamento","upload":"Carica"},"list":{"bulletedlist":"Inserisci/Rimuovi Elenco Puntato","numberedlist":"Inserisci/Rimuovi Elenco Numerato"},"liststyle":{"armenian":"Numerazione Armena","bulletedTitle":"Proprietà liste puntate","circle":"Cerchio","decimal":"Decimale (1, 2, 3, ecc.)","decimalLeadingZero":"Decimale preceduto da 0 (01, 02, 03, ecc.)","disc":"Disco","georgian":"Numerazione Georgiana (an, ban, gan, ecc.)","lowerAlpha":"Alfabetico minuscolo (a, b, c, d, e, ecc.)","lowerGreek":"Greco minuscolo (alpha, beta, gamma, ecc.)","lowerRoman":"Numerazione Romana minuscola (i, ii, iii, iv, v, ecc.)","none":"Nessuno","notset":"<non impostato>","numberedTitle":"Proprietà liste numerate","square":"Quadrato","start":"Inizio","type":"Tipo","upperAlpha":"Alfabetico maiuscolo (A, B, C, D, E, ecc.)","upperRoman":"Numerazione Romana maiuscola (I, II, III, IV, V, ecc.)","validateStartNumber":"Il numero di inizio di una lista numerata deve essere un numero intero."},"magicline":{"title":"Inserisci paragrafo qui"},"maximize":{"maximize":"Massimizza","minimize":"Minimizza"},"newpage":{"toolbar":"Nuova pagina"},"pagebreak":{"alt":"Interruzione di pagina","toolbar":"Inserisci interruzione di pagina per la stampa"},"pastetext":{"button":"Incolla come testo semplice","title":"Incolla come testo semplice"},"pastefromword":{"confirmCleanup":"Il testo da incollare sembra provenire da Word. Desideri pulirlo prima di incollare?","error":"Non è stato possibile eliminare il testo incollato a causa di un errore interno.","title":"Incolla da Word","toolbar":"Incolla da Word"},"preview":{"preview":"Anteprima"},"print":{"toolbar":"Stampa"},"removeformat":{"toolbar":"Elimina formattazione"},"save":{"toolbar":"Salva"},"selectall":{"toolbar":"Seleziona tutto"},"showblocks":{"toolbar":"Visualizza Blocchi"},"sourcearea":{"toolbar":"Sorgente"},"specialchar":{"options":"Opzioni carattere speciale","title":"Seleziona carattere speciale","toolbar":"Inserisci carattere speciale"},"scayt":{"about":"About COMS","aboutTab":"Info","addWord":"Aggiungi Parola","allCaps":"Ignora Parole in maiuscolo","dic_create":"Crea","dic_delete":"Cancella","dic_field_name":"Nome del dizionario","dic_info":"Inizialmente il dizionario utente è memorizzato in un Cookie. I Cookie però hanno una dimensioni massima limitata. Quando il dizionario utente creasce a tal punto da non poter più essere memorizzato in un Cookie, allora il dizionario può essere memorizzato sul nostro server. Per memorizzare il proprio dizionario personale sul nostro server, è necessario specificare un nome per il proprio dizionario. Se avete già memorizzato un dizionario, inserite il nome che gli avete dato e premete il pulsante Ripristina.","dic_rename":"Rinomina","dic_restore":"Ripristina","dictionariesTab":"Dizionari","disable":"Disabilita COMS","emptyDic":"Il nome del dizionario non può essere vuoto.","enable":"Abilita COMS","ignore":"Ignora","ignoreAll":"Ignora tutti","ignoreDomainNames":"Ignora nomi di dominio","langs":"Lingue","languagesTab":"Lingue","mixedCase":"Ignora parole con maiuscole e minuscole","mixedWithDigits":"Ignora parole con numeri","moreSuggestions":"Altri suggerimenti","opera_title":"Non supportato da Opera","options":"Opzioni","optionsTab":"Opzioni","title":"Controllo Ortografico Mentre Scrivi","toggle":"Inverti abilitazione SCOMS","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stili","panelTitle":"Stili di formattazione","panelTitle1":"Stili per blocchi","panelTitle2":"Stili in linea","panelTitle3":"Stili per oggetti"},"table":{"border":"Dimensione bordo","caption":"Intestazione","cell":{"menu":"Cella","insertBefore":"Inserisci Cella Prima","insertAfter":"Inserisci Cella Dopo","deleteCell":"Elimina celle","merge":"Unisce celle","mergeRight":"Unisci a Destra","mergeDown":"Unisci in Basso","splitHorizontal":"Dividi Cella Orizzontalmente","splitVertical":"Dividi Cella Verticalmente","title":"Proprietà della cella","cellType":"Tipo di cella","rowSpan":"Su più righe","colSpan":"Su più colonne","wordWrap":"Ritorno a capo","hAlign":"Allineamento orizzontale","vAlign":"Allineamento verticale","alignBaseline":"Linea Base","bgColor":"Colore di Sfondo","borderColor":"Colore del Bordo","data":"Dati","header":"Intestazione","yes":"Si","no":"No","invalidWidth":"La larghezza della cella dev'essere un numero.","invalidHeight":"L'altezza della cella dev'essere un numero.","invalidRowSpan":"Il numero di righe dev'essere un numero intero.","invalidColSpan":"Il numero di colonne dev'essere un numero intero.","chooseColor":"Scegli"},"cellPad":"Padding celle","cellSpace":"Spaziatura celle","column":{"menu":"Colonna","insertBefore":"Inserisci Colonna Prima","insertAfter":"Inserisci Colonna Dopo","deleteColumn":"Elimina colonne"},"columns":"Colonne","deleteTable":"Cancella Tabella","headers":"Intestazione","headersBoth":"Entrambe","headersColumn":"Prima Colonna","headersNone":"Nessuna","headersRow":"Prima Riga","invalidBorder":"La dimensione del bordo dev'essere un numero.","invalidCellPadding":"Il paging delle celle dev'essere un numero","invalidCellSpacing":"La spaziatura tra le celle dev'essere un numero.","invalidCols":"Il numero di colonne dev'essere un numero maggiore di 0.","invalidHeight":"L'altezza della tabella dev'essere un numero.","invalidRows":"Il numero di righe dev'essere un numero maggiore di 0.","invalidWidth":"La larghezza della tabella dev'essere un numero.","menu":"Proprietà tabella","row":{"menu":"Riga","insertBefore":"Inserisci Riga Prima","insertAfter":"Inserisci Riga Dopo","deleteRow":"Elimina righe"},"rows":"Righe","summary":"Indice","title":"Proprietà tabella","toolbar":"Tabella","widthPc":"percento","widthPx":"pixel","widthUnit":"unità larghezza"},"undo":{"redo":"Ripristina","undo":"Annulla"},"wsc":{"btnIgnore":"Ignora","btnIgnoreAll":"Ignora tutto","btnReplace":"Cambia","btnReplaceAll":"Cambia tutto","btnUndo":"Annulla","changeTo":"Cambia in","errorLoading":"Errore nel caricamento dell'host col servizio applicativo: %s.","ieSpellDownload":"Contollo ortografico non installato. Lo vuoi scaricare ora?","manyChanges":"Controllo ortografico completato: %1 parole cambiate","noChanges":"Controllo ortografico completato: nessuna parola cambiata","noMispell":"Controllo ortografico completato: nessun errore trovato","noSuggestions":"- Nessun suggerimento -","notAvailable":"Il servizio non è momentaneamente disponibile.","notInDic":"Non nel dizionario","oneChange":"Controllo ortografico completato: 1 parola cambiata","progress":"Controllo ortografico in corso","title":"Controllo ortografico","toolbar":"Correttore ortografico"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/ja.js b/htmltest/sites/all/libraries/ckeditor-version/lang/ja.js
new file mode 100644
index 00000000..0b0d638e
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/ja.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ja']={"editor":"リッチテキストエディタ","common":{"editorHelp":"ヘルプは ALT 0 を押してください","browseServer":"サーバブラウザ","url":"URL","protocol":"プロトコル","upload":"アップロード","uploadSubmit":"サーバーに送信","image":"イメージ","flash":"Flash","form":"フォーム","checkbox":"チェックボックス","radio":"ラジオボタン","textField":"１行テキスト","textarea":"テキストエリア","hiddenField":"不可視フィールド","button":"ボタン","select":"選択フィールド","imageButton":"画像ボタン","notSet":"<なし>","id":"Id","name":"Name属性","langDir":"文字表記の方向","langDirLtr":"左から右 (LTR)","langDirRtl":"右から左 (RTL)","langCode":"言語コード","longDescr":"longdesc属性(長文説明)","cssClass":"スタイルシートクラス","advisoryTitle":"Title属性","cssStyle":"スタイルシート","ok":"OK","cancel":"キャンセル","close":"閉じる","preview":"プレビュー","resize":"ドラッグしてリサイズ","generalTab":"全般","advancedTab":"高度な設定","validateNumberFailed":"値が数ではありません","confirmNewPage":"変更内容を保存せず、 新しいページを開いてもよろしいでしょうか？","confirmCancel":"オプション設定を変更しました。ダイアログを閉じてもよろしいでしょうか？","options":"オプション","target":"ターゲット","targetNew":"新しいウインドウ (_blank)","targetTop":"最上部ウィンドウ (_top)","targetSelf":"同じウィンドウ (_self)","targetParent":"親ウィンドウ (_parent)","langDirLTR":"左から右 (LTR)","langDirRTL":"右から左 (RTL)","styles":"スタイル","cssClasses":"スタイルシートクラス","width":"幅","height":"高さ","align":"行揃え","alignLeft":"左","alignRight":"右","alignCenter":"中央","alignTop":"上","alignMiddle":"中央","alignBottom":"下","invalidValue":"不正な値です。","invalidHeight":"高さは数値で入力してください。","invalidWidth":"幅は数値で入力してください。","invalidCssLength":"入力された \"%1\" 項目の値は、CSSの大きさ(px, %, in, cm, mm, em, ex, pt, または pc)が正しいものである/ないに関わらず、正の値である必要があります。","invalidHtmlLength":"入力された \"%1\" 項目の値は、HTMLの大きさ(px または %)が正しいものである/ないに関わらず、正の値である必要があります。","invalidInlineStyle":"入力されたインラインスタイルの値は、\"名前 : 値\" のフォーマットのセットで、複数の場合はセミコロンで区切られている形式である必要があります。","cssLengthTooltip":"ピクセル数もしくはCSSにセットできる数値を入力してください。(px,%,in,cm,mm,em,ex,pt,or pc)","unavailable":"%1<span class=\"cke_accessibility\">, 利用不可能</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"CKEditorについて","help":"$1 のヘルプを見てください。","moreInfo":"ライセンス情報の詳細はウェブサイトにて確認してください:","title":"CKEditorについて","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"太字","italic":"斜体","strike":"打ち消し線","subscript":"下付き","superscript":"上付き","underline":"下線"},"bidi":{"ltr":"テキストの向き : 左から右へ","rtl":"テキストの向き : 右から左へ"},"blockquote":{"toolbar":"ブロック引用"},"clipboard":{"copy":"コピー","copyError":"ブラウザーのセキュリティ設定によりエディタのコピー操作を自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+C)を使用してください。","cut":"切り取り","cutError":"ブラウザーのセキュリティ設定によりエディタの切り取り操作を自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+X)を使用してください。","paste":"貼り付け","pasteArea":"貼り付け場所","pasteMsg":"キーボード(<STRONG>Ctrl/Cmd+V</STRONG>)を使用して、次の入力エリア内で貼り付けて、<STRONG>OK</STRONG>を押してください。","securityMsg":"ブラウザのセキュリティ設定により、エディタはクリップボードデータに直接アクセスすることができません。このウィンドウは貼り付け操作を行う度に表示されます。","title":"貼り付け"},"colorbutton":{"auto":"自動","bgColorTitle":"背景色","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"その他の色...","panelTitle":"色","textColorTitle":"文字色"},"colordialog":{"clear":"クリア","highlight":"ハイライト","options":"カラーオプション","selected":"選択された色","title":"色選択"},"templates":{"button":"テンプレート","emptyListMsg":"(テンプレートが定義されていません)","insertOption":"現在のエディタの内容と置き換えます","options":"テンプレートオプション","selectPromptMsg":"エディターで使用するテンプレートを選択してください。<br>(現在のエディタの内容は失われます):","title":"内容テンプレート"},"contextmenu":{"options":"コンテキストメニューオプション"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Title属性","cssClassInputLabel":"スタイルシートクラス","edit":"Divコンテナ 編集","inlineStyleInputLabel":"インラインスタイル","langDirLTRLabel":"左から右 (LTR)","langDirLabel":"文字表記の方向","langDirRTLLabel":"右から左 (RTL)","languageCodeInputLabel":" 言語コード","remove":"Divコンテナ 削除","styleSelectLabel":"スタイル","title":"Divコンテナ","toolbar":"Divコンテナ"},"toolbar":{"toolbarCollapse":"ツールバーを閉じる","toolbarExpand":"ツールバーを開く","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"編集ツールバー"},"elementspath":{"eleLabel":"要素パス","eleTitle":"%1 要素"},"find":{"find":"検索","findOptions":"検索オプション","findWhat":"検索する文字列:","matchCase":"大文字と小文字を区別する","matchCyclic":"末尾に逹したら先頭に戻る","matchWord":"単語単位で探す","notFoundMsg":"指定された文字列は見つかりませんでした。","replace":"置換","replaceAll":"すべて置換","replaceSuccessMsg":"%1 個置換しました。","replaceWith":"置換後の文字列:","title":"検索と置換"},"fakeobjects":{"anchor":"アンカー","flash":"Flash Animation","hiddenfield":"不可視フィールド","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"スプリクトアクセス(AllowScriptAccess)","accessAlways":"すべての場合に通信可能(Always)","accessNever":"すべての場合に通信不可能(Never)","accessSameDomain":"同一ドメインのみに通信可能(Same domain)","alignAbsBottom":"下部(絶対的)","alignAbsMiddle":"中央(絶対的)","alignBaseline":"ベースライン","alignTextTop":"テキスト上部","bgcolor":"背景色","chkFull":"フルスクリーン許可","chkLoop":"ループ再生","chkMenu":"Flashメニュー可能","chkPlay":"再生","flashvars":"フラッシュに渡す変数(FlashVars)","hSpace":"横間隔","properties":"Flash プロパティ","propertiesTab":"プロパティ","quality":"画質","qualityAutoHigh":"自動/高","qualityAutoLow":"自動/低","qualityBest":"品質優先","qualityHigh":"高","qualityLow":"低","qualityMedium":"中","scale":"拡大縮小設定","scaleAll":"すべて表示","scaleFit":"上下左右にフィット","scaleNoBorder":"外が見えない様に拡大","title":"Flash プロパティ","vSpace":"縦間隔","validateHSpace":"横間隔は数値で入力してください。","validateSrc":"リンクURLを入力してください。","validateVSpace":"縦間隔は数値で入力してください。","windowMode":"ウィンドウモード","windowModeOpaque":"背景を不透明設定","windowModeTransparent":"背景を透過設定","windowModeWindow":"標準"},"font":{"fontSize":{"label":"サイズ","voiceLabel":"フォントサイズ","panelTitle":"フォントサイズ"},"label":"フォント","panelTitle":"フォント","voiceLabel":"フォント"},"forms":{"button":{"title":"ボタン プロパティ","text":"テキスト (値)","type":"タイプ","typeBtn":"ボタン","typeSbm":"送信","typeRst":"リセット"},"checkboxAndRadio":{"checkboxTitle":"チェックボックス プロパティ","radioTitle":"ラジオボタン プロパティ","value":"値","selected":"選択済み"},"form":{"title":"フォーム プロパティ","menu":"フォーム プロパティ","action":"アクション","method":"メソッド","encoding":"エンコーディング"},"hidden":{"title":"不可視フィールド プロパティ","name":"名前","value":"値"},"select":{"title":"選択フィールド プロパティ","selectInfo":"情報","opAvail":"利用可能なオプション","value":"選択項目値","size":"サイズ","lines":"行","chkMulti":"複数項目選択を許可","opText":"選択項目名","opValue":"値","btnAdd":"追加","btnModify":"編集","btnUp":"上へ","btnDown":"下へ","btnSetValue":"選択した値を設定","btnDelete":"削除"},"textarea":{"title":"テキストエリア プロパティ","cols":"列","rows":"行"},"textfield":{"title":"１行テキスト プロパティ","name":"名前","value":"値","charWidth":"サイズ","maxChars":"最大長","type":"タイプ","typeText":"テキスト","typePass":"パスワード入力","typeEmail":"メール","typeSearch":"検索","typeTel":"電話番号","typeUrl":"URL"}},"format":{"label":"書式","panelTitle":"段落の書式","tag_address":"アドレス","tag_div":"標準 (DIV)","tag_h1":"見出し 1","tag_h2":"見出し 2","tag_h3":"見出し 3","tag_h4":"見出し 4","tag_h5":"見出し 5","tag_h6":"見出し 6","tag_p":"標準","tag_pre":"書式付き"},"horizontalrule":{"toolbar":"水平線"},"iframe":{"border":"フレームの枠を表示","noUrl":"iframeのURLを入力してください。","scrolling":"スクロールバーの表示を許可","title":"iFrameのプロパティ","toolbar":"IFrame"},"image":{"alertUrl":"画像のURLを入力してください","alt":"代替テキスト","border":"枠線の幅","btnUpload":"サーバーに送信","button2Img":"選択した画像ボタンを画像に変換しますか？","hSpace":"水平間隔","img2Button":"選択した画像を画像ボタンに変換しますか？","infoTab":"画像情報","linkTab":"リンク","lockRatio":"比率を固定","menu":"画像のプロパティ","resetSize":"サイズをリセット","title":"画像のプロパティ","titleButton":"画像ボタンのプロパティ","upload":"アップロード","urlMissing":"画像のURLを入力してください。","vSpace":"垂直間隔","validateBorder":"枠線の幅は数値で入力してください。","validateHSpace":"水平間隔は数値で入力してください。","validateVSpace":"垂直間隔は数値で入力してください。"},"indent":{"indent":"インデント","outdent":"インデント解除"},"smiley":{"options":"絵文字オプション","title":"顔文字挿入","toolbar":"絵文字"},"justify":{"block":"両端揃え","center":"中央揃え","left":"左揃え","right":"右揃え"},"link":{"acccessKey":"アクセスキー","advanced":"高度な設定","advisoryContentType":"Content Type属性","advisoryTitle":"Title属性","anchor":{"toolbar":"アンカー挿入/編集","menu":"アンカーの編集","title":"アンカーのプロパティ","name":"アンカー名","errorName":"アンカー名を入力してください。","remove":"アンカーを削除"},"anchorId":"エレメントID","anchorName":"アンカー名","charset":"リンク先のcharset","cssClasses":"スタイルシートクラス","emailAddress":"E-Mail アドレス","emailBody":"本文","emailSubject":"件名","id":"Id","info":"ハイパーリンク情報","langCode":"言語コード","langDir":"文字表記の方向","langDirLTR":"左から右 (LTR)","langDirRTL":"右から左 (RTL)","menu":"リンクを編集","name":"Name属性","noAnchors":"(このドキュメント内にアンカーはありません)","noEmail":"メールアドレスを入力してください。","noUrl":"リンクURLを入力してください。","other":"<その他の>","popupDependent":"開いたウィンドウに連動して閉じる (Netscape)","popupFeatures":"ポップアップウィンドウ特徴","popupFullScreen":"全画面モード(IE)","popupLeft":"左端からの座標で指定","popupLocationBar":"ロケーションバー","popupMenuBar":"メニューバー","popupResizable":"サイズ可変","popupScrollBars":"スクロールバー","popupStatusBar":"ステータスバー","popupToolbar":"ツールバー","popupTop":"上端からの座標で指定","rel":"関連リンク","selectAnchor":"アンカーを選択","styles":"スタイルシート","tabIndex":"タブインデックス","target":"ターゲット","targetFrame":"<フレーム>","targetFrameName":"ターゲットのフレーム名","targetPopup":"<ポップアップウィンドウ>","targetPopupName":"ポップアップウィンドウ名","title":"ハイパーリンク","toAnchor":"ページ内のアンカー","toEmail":"E-Mail","toUrl":"URL","toolbar":"リンク挿入/編集","type":"リンクタイプ","unlink":"リンクを削除","upload":"アップロード"},"list":{"bulletedlist":"番号無しリスト","numberedlist":"番号付きリスト"},"liststyle":{"armenian":"アルメニア数字","bulletedTitle":"番号無しリストのプロパティ","circle":"白丸","decimal":"数字 (1, 2, 3, etc.)","decimalLeadingZero":"0付きの数字 (01, 02, 03, etc.)","disc":"黒丸","georgian":"グルジア数字 (an, ban, gan, etc.)","lowerAlpha":"小文字アルファベット (a, b, c, d, e, etc.)","lowerGreek":"小文字ギリシャ文字 (alpha, beta, gamma, etc.)","lowerRoman":"小文字ローマ数字 (i, ii, iii, iv, v, etc.)","none":"なし","notset":"<なし>","numberedTitle":"番号付きリストのプロパティ","square":"四角","start":"開始","type":"種類","upperAlpha":"大文字アルファベット (A, B, C, D, E, etc.)","upperRoman":"大文字ローマ数字 (I, II, III, IV, V, etc.)","validateStartNumber":"リストの開始番号は数値で入力してください。"},"magicline":{"title":"ここに段落を挿入"},"maximize":{"maximize":"最大化","minimize":"最小化"},"newpage":{"toolbar":"新しいページ"},"pagebreak":{"alt":"改ページ","toolbar":"印刷の為に改ページ挿入"},"pastetext":{"button":"プレーンテキストとして貼り付け","title":"プレーンテキストとして貼り付け"},"pastefromword":{"confirmCleanup":"貼り付けを行うテキストはワード文章からコピーされようとしています。貼り付ける前にクリーニングを行いますか？","error":"内部エラーにより貼り付けたデータをクリアできませんでした","title":"ワード文章から貼り付け","toolbar":"ワード文章から貼り付け"},"preview":{"preview":"プレビュー"},"print":{"toolbar":"印刷"},"removeformat":{"toolbar":"書式を解除"},"save":{"toolbar":"保存"},"selectall":{"toolbar":"すべて選択"},"showblocks":{"toolbar":"ブロック表示"},"sourcearea":{"toolbar":"ソース"},"specialchar":{"options":"特殊文字オプション","title":"特殊文字の選択","toolbar":"特殊文字を挿入"},"scayt":{"about":"SCAYTﾊﾞｰｼﾞｮﾝ","aboutTab":"バージョン情報","addWord":"語句追加","allCaps":"全て大文字の単語を無視","dic_create":"登録","dic_delete":"削除","dic_field_name":"辞書名","dic_info":"始めユーザーディレクトリは、Cookieに保存されます。但し Cookie はサイズに制限があります。ユーザーディレクトリがCookieに保存できないサイズに到達するとディレクトリはサーバー上に保存されます。個人のディレクトリをサーバー上に保存するには、ディレクトリ名を明示する必要があります。もし既に保存されたディレクトリがある場合、その名前を入力し、元に戻すボタンを押してください。","dic_rename":"名前変更","dic_restore":"元に戻す","dictionariesTab":"辞書","disable":"SCAYT無効","emptyDic":"辞書名は必ず入力してください","enable":"SCAYT有効","ignore":"無視","ignoreAll":"すべて無視","ignoreDomainNames":"ドメイン名を無視","langs":"言語","languagesTab":"言語","mixedCase":"大文字小文字混在の単語を無視","mixedWithDigits":"数字付き単語を無視","moreSuggestions":"他の候補","opera_title":"Operaではサポートされません","options":"オプション","optionsTab":"オプション","title":"スペルチェック設定(SCAYT)","toggle":"SCAYT切替","noSuggestions":"No suggestion"},"stylescombo":{"label":"スタイル","panelTitle":"スタイル","panelTitle1":"ブロックスタイル","panelTitle2":"インラインスタイル","panelTitle3":"オブジェクトスタイル"},"table":{"border":"枠線の幅","caption":"キャプション","cell":{"menu":"セル","insertBefore":"セルを前に挿入","insertAfter":"セルを後に挿入","deleteCell":"セルを削除","merge":"セルを結合","mergeRight":"右に結合","mergeDown":"下に結合","splitHorizontal":"セルを水平方向に分割","splitVertical":"セルを垂直方向に分割","title":"セルのプロパティ","cellType":"セルの種類","rowSpan":"行の結合数","colSpan":"列の結合数","wordWrap":"単語の折り返し","hAlign":"水平方向の配置","vAlign":"垂直方向の配置","alignBaseline":"ベースライン","bgColor":"背景色","borderColor":"ボーダーカラー","data":"テーブルデータ (td)","header":"ヘッダ","yes":"はい","no":"いいえ","invalidWidth":"セル幅は数値で入力してください。","invalidHeight":"セル高さは数値で入力してください。","invalidRowSpan":"縦幅(行数)は数値で入力してください。","invalidColSpan":"横幅(列数)は数値で入力してください。","chooseColor":"色の選択"},"cellPad":"セル内間隔","cellSpace":"セル内余白","column":{"menu":"列","insertBefore":"列を左に挿入","insertAfter":"列を右に挿入","deleteColumn":"列を削除"},"columns":"列数","deleteTable":"表を削除","headers":"ヘッダ (th)","headersBoth":"両方","headersColumn":"最初の列のみ","headersNone":"なし","headersRow":"最初の行のみ","invalidBorder":"枠線の幅は数値で入力してください。","invalidCellPadding":"セル内余白は数値で入力してください。","invalidCellSpacing":"セル間余白は数値で入力してください。","invalidCols":"列数は0より大きな数値を入力してください。","invalidHeight":"高さは数値で入力してください。","invalidRows":"行数は0より大きな数値を入力してください。","invalidWidth":"幅は数値で入力してください。","menu":"表のプロパティ","row":{"menu":"行","insertBefore":"行を上に挿入","insertAfter":"行を下に挿入","deleteRow":"行を削除"},"rows":"行数","summary":"表の概要","title":"表のプロパティ","toolbar":"表","widthPc":"パーセント","widthPx":"ピクセル","widthUnit":"ユニット"},"undo":{"redo":"やり直す","undo":"元に戻す"},"wsc":{"btnIgnore":"無視","btnIgnoreAll":"すべて無視","btnReplace":"置換","btnReplaceAll":"すべて置換","btnUndo":"やり直し","changeTo":"変更","errorLoading":"アプリケーションサービスホスト読込みエラー: %s.","ieSpellDownload":"スペルチェッカーがインストールされていません。今すぐダウンロードしますか?","manyChanges":"スペルチェック完了: %1 語句変更されました","noChanges":"スペルチェック完了: 語句は変更されませんでした","noMispell":"スペルチェック完了: スペルの誤りはありませんでした","noSuggestions":"- 該当なし -","notAvailable":"申し訳ありません、現在サービスを利用することができません","notInDic":"辞書にありません","oneChange":"スペルチェック完了: １語句変更されました","progress":"スペルチェック処理中...","title":"スペルチェック","toolbar":"スペルチェック"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/ka.js b/htmltest/sites/all/libraries/ckeditor-version/lang/ka.js
new file mode 100644
index 00000000..57a49470
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/ka.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ka']={"editor":"ტექსტის რედაქტორი","common":{"editorHelp":"დააჭირეთ ALT 0-ს დახმარების მისაღებად","browseServer":"სერვერზე დათვალიერება","url":"URL","protocol":"პროტოკოლი","upload":"ატვირთვა","uploadSubmit":"სერვერზე გაგზავნა","image":"სურათი","flash":"Flash","form":"ფორმა","checkbox":"მონიშვნის ღილაკი","radio":"ამორჩევის ღილაკი","textField":"ტექსტური ველი","textarea":"ტექსტური არე","hiddenField":"მალული ველი","button":"ღილაკი","select":"არჩევის ველი","imageButton":"სურათიანი ღილაკი","notSet":"<არაფერი>","id":"Id","name":"სახელი","langDir":"ენის მიმართულება","langDirLtr":"მარცხნიდან მარჯვნივ (LTR)","langDirRtl":"მარჯვნიდან მარცხნივ (RTL)","langCode":"ენის კოდი","longDescr":"დიდი აღწერის URL","cssClass":"CSS კლასი","advisoryTitle":"სათაური","cssStyle":"CSS სტილი","ok":"დიახ","cancel":"გაუქმება","close":"დახურვა","preview":"გადახედვა","resize":"გაწიე ზომის შესაცვლელად","generalTab":"ინფორმაცია","advancedTab":"გაფართოებული","validateNumberFailed":"ეს მნიშვნელობა არაა რიცხვი.","confirmNewPage":"ამ დოკუმენტში ყველა ჩაუწერელი ცვლილება დაიკარგება. დარწმუნებული ხართ რომ ახალი გვერდის ჩატვირთვა გინდათ?","confirmCancel":"ზოგიერთი პარამეტრი შეცვლილია, დარწმუნებულილ ხართ რომ ფანჯრის დახურვა გსურთ?","options":"პარამეტრები","target":"გახსნის ადგილი","targetNew":"ახალი ფანჯარა (_blank)","targetTop":"ზედა ფანჯარა (_top)","targetSelf":"იგივე ფანჯარა (_self)","targetParent":"მშობელი ფანჯარა (_parent)","langDirLTR":"მარცხნიდან მარჯვნივ (LTR)","langDirRTL":"მარჯვნიდან მარცხნივ (RTL)","styles":"სტილი","cssClasses":"CSS კლასი","width":"სიგანე","height":"სიმაღლე","align":"სწორება","alignLeft":"მარცხენა","alignRight":"მარჯვენა","alignCenter":"შუა","alignTop":"ზემოთა","alignMiddle":"შუა","alignBottom":"ქვემოთა","invalidValue":"Invalid value.","invalidHeight":"სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.","invalidWidth":"სიგანე რიცხვით უნდა იყოს წარმოდგენილი.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, მიუწვდომელია</span>"},"about":{"copy":"Copyright &copy; $1. ყველა უფლება დაცულია.","dlgTitle":"CKEditor-ის შესახებ","help":"დახმარებისთვის იხილეთ $1.","moreInfo":"ლიცენზიის ინფორმაციისთვის ეწვიეთ ჩვენს საიტს:","title":"CKEditor-ის შესახებ","userGuide":"CKEditor-ის მომხმარებლის სახელმძღვანელო"},"basicstyles":{"bold":"მსხვილი","italic":"დახრილი","strike":"გადახაზული","subscript":"ინდექსი","superscript":"ხარისხი","underline":"გახაზული"},"bidi":{"ltr":"ტექსტის მიმართულება მარცხნიდან მარჯვნივ","rtl":"ტექსტის მიმართულება მარჯვნიდან მარცხნივ"},"blockquote":{"toolbar":"ციტატა"},"clipboard":{"copy":"ასლი","copyError":"თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ასლის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+C).","cut":"ამოჭრა","cutError":"თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ამოჭრის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+X).","paste":"ჩასმა","pasteArea":"ჩასმის არე","pasteMsg":"ჩასვით ამ არის შიგნით კლავიატურის გამოყენებით (<strong>Ctrl/Cmd+V</strong>) და დააჭირეთ OK-ს","securityMsg":"თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა clipboard-ის მონაცემების წვდომის უფლებას. კიდევ უნდა ჩასვათ ტექსტი ამ ფანჯარაში.","title":"ჩასმა"},"colorbutton":{"auto":"ავტომატური","bgColorTitle":"ფონის ფერი","colors":{"000":"შავი","800000":"მუქი შინდისფერი","8B4513":"ყავისფერი","2F4F4F":"მოლურჯო ნაცრისფერი","008080":"ჩამქრალი ლურჯი","000080":"მუქი ლურჯი","4B0082":"იასამნისფერი","696969":"მუქი ნაცრისფერი","B22222":"აგურისფერი","A52A2A":"მუქი ყავისფერი","DAA520":"მოყვითალო","006400":"მუქი მწვანე","40E0D0":"ცისფერი","0000CD":"ზომიერად ლურჯი","800080":"იისფერი","808080":"ნაცრისფერი","F00":"წითელი","FF8C00":"მუქი სტაფილოსფერი","FFD700":"ოქროსფერი","008000":"მწვანე","0FF":"ღია ცისფერი","00F":"ლურჯი","EE82EE":"იისფერი","A9A9A9":"ბაცი ნაცრისფერი","FFA07A":"ჩამქრალი ვარდისფერი","FFA500":"სტაფილოსფერი","FFFF00":"ყვითელი","00FF00":"ლურჯი","AFEEEE":"ცისფერი","ADD8E6":"ღია ლურჯი","DDA0DD":"ღია იისფერი","D3D3D3":"ღია ნაცრისფერი","FFF0F5":"ღია ვარდისფერი","FAEBD7":"ღია ყავისფერი","FFFFE0":"ნათელი ყვითელი","F0FFF0":"ღია მწვანე","F0FFFF":"ღია ცისფერი 2","F0F8FF":"ღია ცისფერი 3","E6E6FA":"ღია იისფერი 2","FFF":"თეთრი"},"more":"მეტი ფერი...","panelTitle":"ფერები","textColorTitle":"ტექსტის ფერი"},"colordialog":{"clear":"გასუფთავება","highlight":"ჩვენება","options":"ფერის პარამეტრები","selected":"არჩეული ფერი","title":"ფერის შეცვლა"},"templates":{"button":"თარგები","emptyListMsg":"(თარგი არაა განსაზღვრული)","insertOption":"მიმდინარე შეგთავსის შეცვლა","options":"თარგების პარამეტრები","selectPromptMsg":"აირჩიეთ თარგი რედაქტორისთვის","title":"თარგები"},"contextmenu":{"options":"კონტექსტური მენიუს პარამეტრები"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"სათაური","cssClassInputLabel":"CSS კლასები","edit":"Div-ის რედაქტირება","inlineStyleInputLabel":"თანდართული სტილი","langDirLTRLabel":"მარცხნიდან მარჯვნიც (LTR)","langDirLabel":"ენის მინართულება","langDirRTLLabel":"მარჯვნიდან მარცხნივ (RTL)","languageCodeInputLabel":"ენის კოდი","remove":"Div-ის წაშლა","styleSelectLabel":"სტილი","title":"Div კონტეინერის შექმნა","toolbar":"Div კონტეინერის შექმნა"},"toolbar":{"toolbarCollapse":"ხელსაწყოთა ზოლის შეწევა","toolbarExpand":"ხელსაწყოთა ზოლის გამოწევა","toolbarGroups":{"document":"დოკუმენტი","clipboard":"Clipboard/გაუქმება","editing":"რედაქტირება","forms":"ფორმები","basicstyles":"ძირითადი სტილები","paragraph":"აბზაცი","links":"ბმულები","insert":"ჩასმა","styles":"სტილები","colors":"ფერები","tools":"ხელსაწყოები"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"ელემეტის გზა","eleTitle":"%1 ელემენტი"},"find":{"find":"ძებნა","findOptions":"Find Options","findWhat":"საძიებელი ტექსტი:","matchCase":"დიდი და პატარა ასოების დამთხვევა","matchCyclic":"დოკუმენტის ბოლოში გასვლის მერე თავიდან დაწყება","matchWord":"მთელი სიტყვის დამთხვევა","notFoundMsg":"მითითებული ტექსტი არ მოიძებნა.","replace":"შეცვლა","replaceAll":"ყველას შეცვლა","replaceSuccessMsg":"%1 მოძებნილი შეიცვალა.","replaceWith":"შეცვლის ტექსტი:","title":"ძებნა და შეცვლა"},"fakeobjects":{"anchor":"ღუზა","flash":"Flash ანიმაცია","hiddenfield":"მალული ველი","iframe":"IFrame","unknown":"უცნობი ობიექტი"},"flash":{"access":"სკრიპტის წვდომა","accessAlways":"ყოველთვის","accessNever":"არასდროს","accessSameDomain":"იგივე დომენი","alignAbsBottom":"ჩარჩოს ქვემოთა ნაწილის სწორება ტექსტისთვის","alignAbsMiddle":"ჩარჩოს შუა ნაწილის სწორება ტექსტისთვის","alignBaseline":"საბაზისო ხაზის სწორება","alignTextTop":"ტექსტი ზემოდან","bgcolor":"ფონის ფერი","chkFull":"მთელი ეკრანის დაშვება","chkLoop":"ჩაციკლვა","chkMenu":"Flash-ის მენიუს დაშვება","chkPlay":"ავტო გაშვება","flashvars":"ცვლადები Flash-ისთვის","hSpace":"ჰორიზ. სივრცე","properties":"Flash-ის პარამეტრები","propertiesTab":"პარამეტრები","quality":"ხარისხი","qualityAutoHigh":"მაღალი (ავტომატური)","qualityAutoLow":"ძალიან დაბალი","qualityBest":"საუკეთესო","qualityHigh":"მაღალი","qualityLow":"დაბალი","qualityMedium":"საშუალო","scale":"მასშტაბირება","scaleAll":"ყველაფრის ჩვენება","scaleFit":"ზუსტი ჩასმა","scaleNoBorder":"ჩარჩოს გარეშე","title":"Flash-ის პარამეტრები","vSpace":"ვერტ. სივრცე","validateHSpace":"ჰორიზონტალური სივრცე არ უნდა იყოს ცარიელი.","validateSrc":"URL არ უნდა იყოს ცარიელი.","validateVSpace":"ვერტიკალური სივრცე არ უნდა იყოს ცარიელი.","windowMode":"ფანჯრის რეჟიმი","windowModeOpaque":"გაუმჭვირვალე","windowModeTransparent":"გამჭვირვალე","windowModeWindow":"ფანჯარა"},"font":{"fontSize":{"label":"ზომა","voiceLabel":"ტექსტის ზომა","panelTitle":"ტექსტის ზომა"},"label":"ფონტი","panelTitle":"ფონტის სახელი","voiceLabel":"ფონტი"},"forms":{"button":{"title":"ღილაკის პარამეტრები","text":"ტექსტი","type":"ტიპი","typeBtn":"ღილაკი","typeSbm":"გაგზავნა","typeRst":"გასუფთავება"},"checkboxAndRadio":{"checkboxTitle":"მონიშვნის ღილაკის (Checkbox) პარამეტრები","radioTitle":"ასარჩევი ღილაკის (Radio) პარამეტრები","value":"ტექსტი","selected":"არჩეული"},"form":{"title":"ფორმის პარამეტრები","menu":"ფორმის პარამეტრები","action":"ქმედება","method":"მეთოდი","encoding":"კოდირება"},"hidden":{"title":"მალული ველის პარამეტრები","name":"სახელი","value":"მნიშვნელობა"},"select":{"title":"არჩევის ველის პარამეტრები","selectInfo":"ინფორმაცია","opAvail":"შესაძლებელი ვარიანტები","value":"მნიშვნელობა","size":"ზომა","lines":"ხაზები","chkMulti":"მრავლობითი არჩევანის საშუალება","opText":"ტექსტი","opValue":"მნიშვნელობა","btnAdd":"დამატება","btnModify":"შეცვლა","btnUp":"ზემოთ","btnDown":"ქვემოთ","btnSetValue":"ამორჩეულ მნიშვნელოვნად დაყენება","btnDelete":"წაშლა"},"textarea":{"title":"ტექსტური არის პარამეტრები","cols":"სვეტები","rows":"სტრიქონები"},"textfield":{"title":"ტექსტური ველის პარამეტრები","name":"სახელი","value":"მნიშვნელობა","charWidth":"სიმბოლოს ზომა","maxChars":"ასოების მაქსიმალური ოდენობა","type":"ტიპი","typeText":"ტექსტი","typePass":"პაროლი","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"ფიორმატირება","panelTitle":"ფორმატირება","tag_address":"მისამართი","tag_div":"ჩვეულებრივი (DIV)","tag_h1":"სათაური 1","tag_h2":"სათაური 2","tag_h3":"სათაური 3","tag_h4":"სათაური 4","tag_h5":"სათაური 5","tag_h6":"სათაური 6","tag_p":"ჩვეულებრივი","tag_pre":"ფორმატირებული"},"horizontalrule":{"toolbar":"ჰორიზონტალური ხაზის ჩასმა"},"iframe":{"border":"ჩარჩოს გამოჩენა","noUrl":"აკრიფეთ iframe-ის URL","scrolling":"გადახვევის ზოლების დაშვება","title":"IFrame-ის პარამეტრები","toolbar":"IFrame"},"image":{"alertUrl":"აკრიფეთ სურათის URL","alt":"სანაცვლო ტექსტი","border":"ჩარჩო","btnUpload":"სერვერისთვის გაგზავნა","button2Img":"გსურთ არჩეული სურათიანი ღილაკის გადაქცევა ჩვეულებრივ ღილაკად?","hSpace":"ჰორიზონტალური სივრცე","img2Button":"გსურთ არჩეული ჩვეულებრივი ღილაკის გადაქცევა სურათიან ღილაკად?","infoTab":"სურათის ინფორმცია","linkTab":"ბმული","lockRatio":"პროპორციის შენარჩუნება","menu":"სურათის პარამეტრები","resetSize":"ზომის დაბრუნება","title":"სურათის პარამეტრები","titleButton":"სურათიანი ღილაკის პარამეტრები","upload":"ატვირთვა","urlMissing":"სურათის URL არაა შევსებული.","vSpace":"ვერტიკალური სივრცე","validateBorder":"ჩარჩო მთელი რიცხვი უნდა იყოს.","validateHSpace":"ჰორიზონტალური სივრცე მთელი რიცხვი უნდა იყოს.","validateVSpace":"ვერტიკალური სივრცე მთელი რიცხვი უნდა იყოს."},"indent":{"indent":"მეტად შეწევა","outdent":"ნაკლებად შეწევა"},"smiley":{"options":"სიცილაკის პარამეტრები","title":"სიცილაკის ჩასმა","toolbar":"სიცილაკები"},"justify":{"block":"გადასწორება","center":"შუაში სწორება","left":"მარცხნივ სწორება","right":"მარჯვნივ სწორება"},"link":{"acccessKey":"წვდომის ღილაკი","advanced":"დაწვრილებით","advisoryContentType":"შიგთავსის ტიპი","advisoryTitle":"სათაური","anchor":{"toolbar":"ღუზა","menu":"ღუზის რედაქტირება","title":"ღუზის პარამეტრები","name":"ღუზუს სახელი","errorName":"აკრიფეთ ღუზის სახელი","remove":"Remove Anchor"},"anchorId":"ელემენტის Id-თ","anchorName":"ღუზის სახელით","charset":"კოდირება","cssClasses":"CSS კლასი","emailAddress":"ელფოსტის მისამართები","emailBody":"წერილის ტექსტი","emailSubject":"წერილის სათაური","id":"Id","info":"ბმულის ინფორმაცია","langCode":"ენის კოდი","langDir":"ენის მიმართულება","langDirLTR":"მარცხნიდან მარჯვნივ (LTR)","langDirRTL":"მარჯვნიდან მარცხნივ (RTL)","menu":"ბმულის რედაქტირება","name":"სახელი","noAnchors":"(ამ დოკუმენტში ღუზა არაა)","noEmail":"აკრიფეთ ელფოსტის მისამართი","noUrl":"აკრიფეთ ბმულის URL","other":"<სხვა>","popupDependent":"დამოკიდებული (Netscape)","popupFeatures":"Popup ფანჯრის პარამეტრები","popupFullScreen":"მთელი ეკრანი (IE)","popupLeft":"მარცხენა პოზიცია","popupLocationBar":"ნავიგაციის ზოლი","popupMenuBar":"მენიუს ზოლი","popupResizable":"ცვალებადი ზომით","popupScrollBars":"გადახვევის ზოლები","popupStatusBar":"სტატუსის ზოლი","popupToolbar":"ხელსაწყოთა ზოლი","popupTop":"ზედა პოზიცია","rel":"კავშირი","selectAnchor":"აირჩიეთ ღუზა","styles":"CSS სტილი","tabIndex":"Tab-ის ინდექსი","target":"გახსნის ადგილი","targetFrame":"<frame>","targetFrameName":"Frame-ის სახელი","targetPopup":"<popup ფანჯარა>","targetPopupName":"Popup ფანჯრის სახელი","title":"ბმული","toAnchor":"ბმული ტექსტში ღუზაზე","toEmail":"ელფოსტა","toUrl":"URL","toolbar":"ბმული","type":"ბმულის ტიპი","unlink":"ბმულის მოხსნა","upload":"აქაჩვა"},"list":{"bulletedlist":"ღილიანი სია","numberedlist":"გადანომრილი სია"},"liststyle":{"armenian":"სომხური გადანომრვა","bulletedTitle":"ღილებიანი სიის პარამეტრები","circle":"წრეწირი","decimal":"რიცხვებით (1, 2, 3, ..)","decimalLeadingZero":"ნულით დაწყებული რიცხვებით (01, 02, 03, ..)","disc":"წრე","georgian":"ქართული გადანომრვა (ან, ბან, გან, ..)","lowerAlpha":"პატარა ლათინური ასოებით (a, b, c, d, e, ..)","lowerGreek":"პატარა ბერძნული ასოებით (ალფა, ბეტა, გამა, ..)","lowerRoman":"რომაული გადანომრვცა პატარა ციფრებით (i, ii, iii, iv, v, ..)","none":"არაფერი","notset":"<არაფერი>","numberedTitle":"გადანომრილი სიის პარამეტრები","square":"კვადრატი","start":"საწყისი","type":"ტიპი","upperAlpha":"დიდი ლათინური ასოებით (A, B, C, D, E, ..)","upperRoman":"რომაული გადანომრვა დიდი ციფრებით (I, II, III, IV, V, etc.)","validateStartNumber":"სიის საწყისი მთელი რიცხვი უნდა იყოს."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"გადიდება","minimize":"დაპატარავება"},"newpage":{"toolbar":"ახალი გვერდი"},"pagebreak":{"alt":"გვერდის წყვეტა","toolbar":"გვერდის წყვეტა ბეჭდვისთვის"},"pastetext":{"button":"მხოლოდ ტექსტის ჩასმა","title":"მხოლოდ ტექსტის ჩასმა"},"pastefromword":{"confirmCleanup":"ჩასასმელი ტექსტი ვორდიდან გადმოტანილს გავს - გინდათ მისი წინასწარ გაწმენდა?","error":"შიდა შეცდომის გამო ვერ მოხერხდა ტექსტის გაწმენდა","title":"ვორდიდან ჩასმა","toolbar":"ვორდიდან ჩასმა"},"preview":{"preview":"გადახედვა"},"print":{"toolbar":"ბეჭდვა"},"removeformat":{"toolbar":"ფორმატირების მოხსნა"},"save":{"toolbar":"ჩაწერა"},"selectall":{"toolbar":"ყველაფრის მონიშნვა"},"showblocks":{"toolbar":"არეების ჩვენება"},"sourcearea":{"toolbar":"კოდები"},"specialchar":{"options":"სპეციალური სიმბოლოს პარამეტრები","title":"სპეციალური სიმბოლოს არჩევა","toolbar":"სპეციალური სიმბოლოს ჩასმა"},"scayt":{"about":"SCAYT-ის შესახებ","aboutTab":"ინფორმაცია","addWord":"სიტყვის დამატება","allCaps":"დიდი ასოებით დაწერილი სიტყვების უგულებელყოფა","dic_create":"შექმნა","dic_delete":"წაშლა","dic_field_name":"ლექსიკონის სახელი","dic_info":"თავდაპირველად მომხმარებლის ლექსიკონი ინახება Cookie-ში. თუმცა Cookie შეზღუდულია ზომაში. როცა ლექსიკონის ზომა გაიზრდება საკმაოდ ის შეიძლება შევინახოთ ჩვენს სერვერზე. ჩვენს სერვერზე ლექსიკონს შესანახად უნდა მიუთითოთ მისი სახელი. თუ უკე გაქვთ ლექსიკონი, აკრიფეთ მისი სახელი და დააჭირეთ \"დაბრუნების\" ღილაკს.","dic_rename":"გადარქმევა","dic_restore":"დაბრუნება","dictionariesTab":"ლექსიკონები","disable":"SCAYT-ის გამორთვა","emptyDic":"ლექსიკონის სიტყვა არ უნდა იყოს ცარიელი.","enable":"SCAYT-ის ჩართვა","ignore":"უგულებელყოფა","ignoreAll":"ყველას უგულებელყოფა","ignoreDomainNames":"დომენური სახელების უგულებელყოფა","langs":"ენები","languagesTab":"ენები","mixedCase":"შერეული ასოებანი სიტყვების უგულებელყოფა","mixedWithDigits":"ციფრებიანი სიტყვების უგულებელყოფა","moreSuggestions":"მეტი შემოთავაზება","opera_title":"არაა მხარდაჭერილი Opera-ს მიერ","options":"პარამეტრები","optionsTab":"პარამეტრები","title":"მართლწერის შემოწმება კრეფისას","toggle":"SCAYT-ის გადართვა","noSuggestions":"No suggestion"},"stylescombo":{"label":"სტილები","panelTitle":"ფორმატირების სტილები","panelTitle1":"არის სტილები","panelTitle2":"თანდართული სტილები","panelTitle3":"ობიექტის სტილები"},"table":{"border":"ჩარჩოს ზომა","caption":"სათაური","cell":{"menu":"უჯრა","insertBefore":"უჯრის ჩასმა მანამდე","insertAfter":"უჯრის ჩასმა მერე","deleteCell":"უჯრების წაშლა","merge":"უჯრების შეერთება","mergeRight":"შეერთება მარჯვენასთან","mergeDown":"შეერთება ქვემოთასთან","splitHorizontal":"გაყოფა ჰორიზონტალურად","splitVertical":"გაყოფა ვერტიკალურად","title":"უჯრის პარამეტრები","cellType":"უჯრის ტიპი","rowSpan":"სტრიქონების ოდენობა","colSpan":"სვეტების ოდენობა","wordWrap":"სტრიქონის გადატანა (Word Wrap)","hAlign":"ჰორიზონტალური სწორება","vAlign":"ვერტიკალური სწორება","alignBaseline":"ძირითადი ხაზის გასწვრივ","bgColor":"ფონის ფერი","borderColor":"ჩარჩოს ფერი","data":"მონაცემები","header":"სათაური","yes":"დიახ","no":"არა","invalidWidth":"უჯრის სიგანე რიცხვით უნდა იყოს წარმოდგენილი.","invalidHeight":"უჯრის სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.","invalidRowSpan":"სტრიქონების რაოდენობა მთელი რიცხვი უნდა იყოს.","invalidColSpan":"სვეტების რაოდენობა მთელი რიცხვი უნდა იყოს.","chooseColor":"არჩევა"},"cellPad":"უჯრის კიდე (padding)","cellSpace":"უჯრის სივრცე (spacing)","column":{"menu":"სვეტი","insertBefore":"სვეტის ჩამატება წინ","insertAfter":"სვეტის ჩამატება მერე","deleteColumn":"სვეტების წაშლა"},"columns":"სვეტი","deleteTable":"ცხრილის წაშლა","headers":"სათაურები","headersBoth":"ორივე","headersColumn":"პირველი სვეტი","headersNone":"არაფერი","headersRow":"პირველი სტრიქონი","invalidBorder":"ჩარჩოს ზომა რიცხვით უდნა იყოს წარმოდგენილი.","invalidCellPadding":"უჯრის კიდე (padding) რიცხვით უნდა იყოს წარმოდგენილი.","invalidCellSpacing":"უჯრის სივრცე (spacing) რიცხვით უნდა იყოს წარმოდგენილი.","invalidCols":"სვეტების რაოდენობა დადებითი რიცხვი უნდა იყოს.","invalidHeight":"ცხრილის სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.","invalidRows":"სტრიქონების რაოდენობა დადებითი რიცხვი უნდა იყოს.","invalidWidth":"ცხრილის სიგანე რიცხვით უნდა იყოს წარმოდგენილი.","menu":"ცხრილის პარამეტრები","row":{"menu":"სტრიქონი","insertBefore":"სტრიქონის ჩამატება წინ","insertAfter":"სტრიქონის ჩამატება მერე","deleteRow":"სტრიქონების წაშლა"},"rows":"სტრიქონი","summary":"შეჯამება","title":"ცხრილის პარამეტრები","toolbar":"ცხრილი","widthPc":"პროცენტი","widthPx":"წერტილი","widthUnit":"საზომი ერთეული"},"undo":{"redo":"გამეორება","undo":"გაუქმება"},"wsc":{"btnIgnore":"უგულებელყოფა","btnIgnoreAll":"ყველას უგულებელყოფა","btnReplace":"შეცვლა","btnReplaceAll":"ყველას შეცვლა","btnUndo":"გაუქმება","changeTo":"შეცვლელი","errorLoading":"სერვისის გამოძახების შეცდომა: %s.","ieSpellDownload":"მართლწერის შემოწმება არაა დაინსტალირებული. ჩამოვქაჩოთ ინტერნეტიდან?","manyChanges":"მართლწერის შემოწმება: %1 სიტყვა შეიცვალა","noChanges":"მართლწერის შემოწმება: არაფერი შეცვლილა","noMispell":"მართლწერის შემოწმება: შეცდომა არ მოიძებნა","noSuggestions":"- არაა შემოთავაზება -","notAvailable":"უკაცრავად, ეს სერვისი ამჟამად მიუწვდომელია.","notInDic":"არაა ლექსიკონში","oneChange":"მართლწერის შემოწმება: ერთი სიტყვა შეიცვალა","progress":"მიმდინარეობს მართლწერის შემოწმება...","title":"მართლწერა","toolbar":"მართლწერა"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/km.js b/htmltest/sites/all/libraries/ckeditor-version/lang/km.js
new file mode 100644
index 00000000..bfa958e6
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/km.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['km']={"editor":"ឧបករណ៍សរសេរអត្ថបទសម្បូរបែប","common":{"editorHelp":"ចុច ALT 0 សម្រាប់ជំនួយ","browseServer":"រកមើលក្នុងម៉ាស៊ីនបម្រើ","url":"URL","protocol":"ពិធីការ","upload":"ផ្ទុកឡើង","uploadSubmit":"បញ្ជូនទៅកាន់ម៉ាស៊ីនបម្រើ","image":"រូបភាព","flash":"Flash","form":"បែបបទ","checkbox":"ប្រអប់ធីក","radio":"ប៊ូតុងមូល","textField":"វាលអត្ថបទ","textarea":"Textarea","hiddenField":"វាលកំបាំង","button":"ប៊ូតុង","select":"វាលជម្រើស","imageButton":"ប៊ូតុងរូបភាព","notSet":"<មិនកំណត់>","id":"Id","name":"ឈ្មោះ","langDir":"ទិសដៅភាសា","langDirLtr":"ពីឆ្វេងទៅស្តាំ (LTR)","langDirRtl":"ពីស្តាំទៅឆ្វេង (RTL)","langCode":"លេខកូដភាសា","longDescr":"URL អធិប្បាយវែង","cssClass":"Stylesheet Classes","advisoryTitle":"ចំណងជើងណែនាំ","cssStyle":"រចនាបថ","ok":"ព្រម","cancel":"បោះបង់","close":"បិទ","preview":"មើលជាមុន","resize":"ប្ដូរទំហំ","generalTab":"ទូទៅ","advancedTab":"កម្រិតខ្ពស់","validateNumberFailed":"តម្លៃនេះពុំមែនជាលេខទេ។","confirmNewPage":"រាល់បន្លាស់ប្ដូរនានាដែលមិនទាន់រក្សាទុកក្នុងមាតិកានេះ នឹងត្រូវបាត់បង់។ តើអ្នកពិតជាចង់ផ្ទុកទំព័រថ្មីមែនទេ?","confirmCancel":"ការកំណត់មួយចំនួនត្រូវបានផ្លាស់ប្ដូរ។ តើអ្នកពិតជាចង់បិទប្រអប់នេះមែនទេ?","options":"ការកំណត់","target":"គោលដៅ","targetNew":"វីនដូថ្មី (_blank)","targetTop":"វីនដូលើគេ (_top)","targetSelf":"វីនដូដូចគ្នា (_self)","targetParent":"វីនដូមេ (_parent)","langDirLTR":"ពីឆ្វេងទៅស្តាំ(LTR)","langDirRTL":"ពីស្តាំទៅឆ្វេង(RTL)","styles":"រចនាបថ","cssClasses":"Stylesheet Classes","width":"ទទឹង","height":"កំពស់","align":"កំណត់ទីតាំង","alignLeft":"ខាងឆ្វង","alignRight":"ខាងស្តាំ","alignCenter":"កណ្តាល","alignTop":"ខាងលើ","alignMiddle":"កណ្តាល","alignBottom":"ខាងក្រោម","invalidValue":"តម្លៃមិនត្រឹមត្រូវ។","invalidHeight":"តម្លៃកំពស់ត្រូវតែជាលេខ។","invalidWidth":"តម្លៃទទឹងត្រូវតែជាលេខ។","invalidCssLength":"តម្លៃកំណត់សម្រាប់វាល \"%1\" ត្រូវតែជាលេខវិជ្ជមាន ដោយភ្ជាប់ឬមិនភ្ជាប់ជាមួយនឹងឯកតារង្វាស់របស់ CSS (px, %, in, cm, mm, em, ex, pt ឬ pc) ។","invalidHtmlLength":"តម្លៃកំណត់សម្រាប់វាល \"%1\" ត្រូវតែជាលេខវិជ្ជមាន ដោយភ្ជាប់ឬមិនភ្ជាប់ជាមួយនឹងឯកតារង្វាស់របស់ HTML (px ឬ %) ។","invalidInlineStyle":"តម្លៃកំណត់សម្រាប់រចនាបថក្នុងតួ ត្រូវតែមានមួយឬធាតុច្រើនដោយមានទ្រង់ទ្រាយជា \"ឈ្មោះ : តម្លៃ\" ហើយញែកចេញពីគ្នាដោយចុចក្បៀស។","cssLengthTooltip":"បញ្ចូលលេខសម្រាប់តម្លៃជាភិចសែល ឬលេខដែលមានឯកតាត្រឹមត្រូវរបស់ CSS (px, %, in, cm, mm, em, ex, pt ឬ pc) ។","unavailable":"%1<span class=\"cke_accessibility\">, មិនមាន</span>"},"about":{"copy":"រក្សាសិទ្ធិ &copy; $1។ រក្សាសិទ្ធិគ្រប់បែបយ៉ាង។","dlgTitle":"អំពី CKEditor","help":"ពិនិត្យ $1 សម្រាប់ជំនួយ។","moreInfo":"សម្រាប់ព័ត៌មានអំពីអាជ្ញាបណញណ សូមមើលក្នុងគេហទំព័ររបស់យើង៖","title":"អំពី CKEditor","userGuide":"វិធីប្រើប្រាស់ CKEditor"},"basicstyles":{"bold":"ក្រាស់","italic":"ទ្រេត","strike":"គូសបន្ទាត់ចំកណ្ដាល","subscript":"អក្សរតូចក្រោម","superscript":"អក្សរតូចលើ","underline":"គូសបន្ទាត់ក្រោម"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"ចំលងយក","copyError":"ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះមិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ ចំលងអត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+C)។","cut":"កាត់យក","cutError":"ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះមិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ កាត់អត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ  (Ctrl/Cmd+X) ។","paste":"ចំលងដាក់","pasteArea":"Paste Area","pasteMsg":"សូមចំលងអត្ថបទទៅដាក់ក្នុងប្រអប់ដូចខាងក្រោមដោយប្រើប្រាស់ ឃី (<STRONG>Ctrl/Cmd+V</STRONG>) ហើយចុច <STRONG>OK</STRONG> ។","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"ចំលងដាក់"},"colorbutton":{"auto":"ស្វ័យប្រវត្តិ","bgColorTitle":"ពណ៌ផ្ទៃខាងក្រោយ","colors":{"000":"ខ្មៅ","800000":"ត្នោតចាស់","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"ខៀវចាស់","4B0082":"ធ្លះ","696969":"ប្រផេះក្រាស់","B22222":"Fire Brick","A52A2A":"ត្នោត","DAA520":"Golden Rod","006400":"បៃតងចាស់","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"ប្រផេះ","F00":"ក្រហម","FF8C00":"ទឹកក្រូចចាស់","FFD700":"មាស","008000":"បៃតង","0FF":"Cyan","00F":"ខៀវ","EE82EE":"ស្វាយ","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"ទឹកក្រូច","FFFF00":"លឿង","00FF00":"ក្រូចឆ្មារ","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"លឿងស្ដើង","F0FFF0":"Honeydew","F0FFFF":"ផ្ទៃមេឃ","F0F8FF":"Alice Blue","E6E6FA":"ឡាវិនដឺ","FFF":"ស"},"more":"ពណ៌ផ្សេងទៀត..","panelTitle":"ពណ៌","textColorTitle":"ពណ៌អក្សរ"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"ពុម្ពគំរូ","emptyListMsg":"(មិនមានពុម្ពគំរូត្រូវបានកំណត់)","insertOption":"ជំនួសក្នុងមាតិកាបច្ចុប្បន្ន","options":"ជម្រើសពុម្ពគំរូ","selectPromptMsg":"សូមរើសពុម្ពគំរូដើម្បីបើកក្នុងកម្មវិធីសរសេរអត្ថបទ","title":"ពុម្ពគំរូមាតិកា"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"ចំណងជើង ប្រឹក្សា","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"ពីឆ្វេងទៅស្តាំ(LTR)","langDirLabel":"ទិសដៅភាសា","langDirRTLLabel":"ពីស្តាំទៅឆ្វេង(RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"ម៉ូត","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"បង្រួមរបារឧបករណ៍","toolbarExpand":"ពង្រីករបារឧបករណ៍","toolbarGroups":{"document":"ឯកសារ","clipboard":"Clipboard/មិនធ្វើវិញ","editing":"ការកែសម្រួល","forms":"បែបបទ","basicstyles":"រចនាបថមូលដ្ឋាន","paragraph":"កថាខណ្ឌ","links":"តំណ","insert":"បញ្ចូល","styles":"រចនាបថ","colors":"ពណ៌","tools":"ឧបករណ៍"},"toolbars":"របារឧបករណ៍កែសម្រួល"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"ស្វែងរក","findOptions":"Find Options","findWhat":"ស្វែងរកអ្វី:","matchCase":"ករណ៉ត្រូវរក","matchCyclic":"Match cyclic","matchWord":"ត្រូវពាក្យទាំងអស់","notFoundMsg":"ពាក្យនេះ រកមិនឃើញទេ ។","replace":"ជំនួស","replaceAll":"ជំនួសទាំងអស់","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"ជំនួសជាមួយ:","title":"Find and Replace"},"fakeobjects":{"anchor":"បន្ថែម/កែប្រែ យុថ្កា","flash":"Flash Animation","hiddenfield":"ជួរលាក់","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"Abs Bottom","alignAbsMiddle":"Abs Middle","alignBaseline":"បន្ទាត់ជាមូលដ្ឋាន","alignTextTop":"លើអត្ថបទ","bgcolor":"ពណ៌ផ្ទៃខាងក្រោយ","chkFull":"Allow Fullscreen","chkLoop":"ចំនួនដង","chkMenu":"បង្ហាញ មឺនុយរបស់ Flash","chkPlay":"លេងដោយស្វ័យប្រវត្ត","flashvars":"Variables for Flash","hSpace":"គំលាតទទឹង","properties":"ការកំណត់ Flash","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"ទំហំ","scaleAll":"បង្ហាញទាំងអស់","scaleFit":"ត្រូវល្មម","scaleNoBorder":"មិនបង្ហាញស៊ុម","title":"ការកំណត់ Flash","vSpace":"គំលាតបណ្តោយ","validateHSpace":"HSpace must be a number.","validateSrc":"សូមសរសេរ អាស័យដ្ឋាន URL","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"ទំហំ","voiceLabel":"Font Size","panelTitle":"ទំហំ"},"label":"ហ្វុង","panelTitle":"ហ្វុង","voiceLabel":"ហ្វុង"},"forms":{"button":{"title":"ការកំណត់ ប៉ូតុន","text":"អត្ថបទ(តំលៃ)","type":"ប្រភេទ","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"ការកំណត់ប្រអប់ជ្រើសរើស","radioTitle":"ការកំណត់ប៉ូតុនរង្វង់","value":"តំលៃ","selected":"បានជ្រើសរើស"},"form":{"title":"ការកំណត់បែបបទ","menu":"ការកំណត់បែបបទ","action":"សកម្មភាព","method":"វិធី","encoding":"Encoding"},"hidden":{"title":"ការកំណត់ជួរលាក់","name":"ឈ្មោះ","value":"តំលៃ"},"select":{"title":"ការកំណត់ជួរជ្រើសរើស","selectInfo":"ពត៌មាន","opAvail":"ការកំណត់ជ្រើសរើស ដែលអាចកំណត់បាន","value":"តំលៃ","size":"ទំហំ","lines":"បន្ទាត់","chkMulti":"អនុញ្ញាតអោយជ្រើសរើសច្រើន","opText":"ពាក្យ","opValue":"តំលៃ","btnAdd":"បន្ថែម","btnModify":"ផ្លាស់ប្តូរ","btnUp":"លើ","btnDown":"ក្រោម","btnSetValue":"Set as selected value","btnDelete":"លប់"},"textarea":{"title":"ការកំណត់កន្លែងសរសេរអត្ថបទ","cols":"ជូរឈរ","rows":"ជូរផ្តេក"},"textfield":{"title":"ការកំណត់ជួរអត្ថបទ","name":"ឈ្មោះ","value":"តំលៃ","charWidth":"ទទឹង អក្សរ","maxChars":"អក្សរអតិបរិមា","type":"ប្រភេទ","typeText":"ពាក្យ","typePass":"ពាក្យសំងាត់","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"រចនា","panelTitle":"រចនា","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"បន្ថែមបន្ទាត់ផ្តេក"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"សូមសរសេរងាស័យដ្ឋានរបស់រូបភាព","alt":"អត្ថបទជំនួស","border":"ស៊ុម","btnUpload":"បញ្ជូនទៅកាន់ម៉ាស៊ីនផ្តល់សេវា","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"គំលាតទទឹង","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"ពត៌មានអំពីរូបភាព","linkTab":"ឈ្នាប់","lockRatio":"អត្រាឡុក","menu":"ការកំណត់រូបភាព","resetSize":"កំណត់ទំហំឡើងវិញ","title":"ការកំណត់រូបភាព","titleButton":"ការកំណត់ប៉ូតុនរូបភាព","upload":"ទាញយក","urlMissing":"Image source URL is missing.","vSpace":"គំលាតបណ្តោយ","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"បន្ថែមការចូលបន្ទាត់","outdent":"បន្ថយការចូលបន្ទាត់"},"smiley":{"options":"ជម្រើសរូបសញ្ញាអារម្មណ៍","title":"បញ្ចូលរូបសញ្ញាអារម្មណ៍","toolbar":"រូបសញ្ញអារម្មណ៍"},"justify":{"block":"តំរឹមសងខាង","center":"តំរឹមកណ្តាល","left":"តំរឹមឆ្វេង","right":"តំរឹមស្តាំ"},"link":{"acccessKey":"ឃី សំរាប់ចូល","advanced":"កំរិតខ្ពស់","advisoryContentType":"ប្រភេទអត្ថបទ ប្រឹក្សា","advisoryTitle":"ចំណងជើង ប្រឹក្សា","anchor":{"toolbar":"បន្ថែម/កែប្រែ យុថ្កា","menu":"ការកំណត់យុថ្កា","title":"ការកំណត់យុថ្កា","name":"ឈ្មោះយុទ្ធថ្កា","errorName":"សូមសរសេរ ឈ្មោះយុទ្ធថ្កា","remove":"Remove Anchor"},"anchorId":"តាម Id","anchorName":"តាមឈ្មោះរបស់យុថ្កា","charset":"លេខកូតអក្សររបស់ឈ្នាប់","cssClasses":"Stylesheet Classes","emailAddress":"អ៊ីមែល","emailBody":"អត្ថបទ","emailSubject":"ចំណងជើងអត្ថបទ","id":"Id","info":"ពត៌មានអំពីឈ្នាប់","langCode":"ទិសដៅភាសា","langDir":"ទិសដៅភាសា","langDirLTR":"ពីឆ្វេងទៅស្តាំ(LTR)","langDirRTL":"ពីស្តាំទៅឆ្វេង(RTL)","menu":"កែប្រែឈ្នាប់","name":"ឈ្មោះ","noAnchors":"(No anchors available in the document)","noEmail":"សូមសរសេរ អាស័យដ្ឋាន អ៊ីមែល","noUrl":"សូមសរសេរ អាស័យដ្ឋាន URL","other":"<other>","popupDependent":"អាស្រ័យលើ (Netscape)","popupFeatures":"លក្ខណះរបស់វីនដូលលោត","popupFullScreen":"អេក្រុងពេញ(IE)","popupLeft":"ទីតាំងខាងឆ្វេង","popupLocationBar":"របា ទីតាំង","popupMenuBar":"របា មឺនុយ","popupResizable":"Resizable","popupScrollBars":"របា ទាញ","popupStatusBar":"របា ពត៌មាន","popupToolbar":"របា ឩបករណ៍","popupTop":"ទីតាំងខាងលើ","rel":"Relationship","selectAnchor":"ជ្រើសរើសយុថ្កា","styles":"ម៉ូត","tabIndex":"លេខ Tab","target":"គោលដៅ","targetFrame":"<ហ្វ្រេម>","targetFrameName":"ឈ្មោះហ្រ្វេមដែលជាគោលដៅ","targetPopup":"<វីនដូវ លោត>","targetPopupName":"ឈ្មោះវីនដូវលោត","title":"ឈ្នាប់","toAnchor":"យុថ្កានៅក្នុងទំព័រនេះ","toEmail":"អ៊ីមែល","toUrl":"URL","toolbar":"បន្ថែម/កែប្រែ ឈ្នាប់","type":"ប្រភេទឈ្នាប់","unlink":"លប់ឈ្នាប់","upload":"ទាញយក"},"list":{"bulletedlist":"បញ្ជីជារង្វង់មូល","numberedlist":"បញ្ជីជាអក្សរ"},"liststyle":{"armenian":"លេខអារមេនី","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"ចាប់ផ្ដើម","type":"ប្រភេទ","upperAlpha":"អក្សរធំ (A, B, C, D, E, ...)","upperRoman":"លេខរ៉ូម៉ាំងធំ (I, II, III, IV, V, ...)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"ពង្រីកអតិបរមា","minimize":"បង្រួមអប្បបរមា"},"newpage":{"toolbar":"ទំព័រថ្មី"},"pagebreak":{"alt":"បំបែកទំព័រ","toolbar":"បន្ថែមការបំបែកទំព័រមុនបោះពុម្ព"},"pastetext":{"button":"បិទភ្ជាប់ជាអត្ថបទធម្មតា","title":"បិទភ្ជាប់ជាអត្ថបទធម្មតា"},"pastefromword":{"confirmCleanup":"អត្ថបទដែលអ្នកចង់បិទភ្ជាប់នេះ ទំនងដូចជាចម្លងមកពី Word។ តើអ្នកចង់សម្អាតវាមុនបិទភ្ជាប់ទេ?","error":"ដោយសារមានបញ្ហាផ្នែកក្នុងធ្វើឲ្យមិនអាចសម្អាតទិន្នន័យដែលបានបិទភ្ជាប់","title":"បិទភ្ជាប់ពី Word","toolbar":"បិទភ្ជាប់ពី Word"},"preview":{"preview":"មើលសាកល្បង"},"print":{"toolbar":"បោះពុម្ព"},"removeformat":{"toolbar":"ជម្រះទ្រង់ទ្រាយ"},"save":{"toolbar":"រក្សាទុក"},"selectall":{"toolbar":"រើសទាំងអស់"},"showblocks":{"toolbar":"បង្ហាញប្លក់"},"sourcearea":{"toolbar":"អក្សរកូដ"},"specialchar":{"options":"ជម្រើសតួអក្សរពិសេស","title":"រើសតួអក្សរពិសេស","toolbar":"បន្ថែមអក្សរពិសេស"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"រចនាបថ","panelTitle":"ទ្រង់ទ្រាយរចនាបថ","panelTitle1":"រចនាបថប្លក់","panelTitle2":"រចនាបថក្នុងជួរ","panelTitle3":"រចនាបថវត្ថុ"},"table":{"border":"ទំហំបន្ទាត់ស៊ុម","caption":"ចំណងជើង","cell":{"menu":"ក្រឡា","insertBefore":"បញ្ចូលក្រឡាពីមុខ","insertAfter":"បញ្ចូលក្រឡាពីក្រោយ","deleteCell":"លុបក្រឡា","merge":"បញ្ចូលក្រឡាចូលគ្នា","mergeRight":"បញ្ចូលគ្នាខាងស្ដាំ","mergeDown":"បញ្ចូលគ្នាចុះក្រោម","splitHorizontal":"ពុះក្រឡាផ្ដេក","splitVertical":"ពុះក្រឡាបញ្ឈរ","title":"លក្ខណៈក្រឡា","cellType":"ប្រភេទក្រឡា","rowSpan":"ចំនួនជួរដេកលាយចូលគ្នា","colSpan":"ចំនួនជួរឈរលាយចូលគ្នា","wordWrap":"រុំពាក្យ","hAlign":"ការតម្រឹមផ្ដេក","vAlign":"ការតម្រឹមបញ្ឈរ","alignBaseline":"ខ្សែបន្ទាត់គោល","bgColor":"ពណ៌ផ្ទៃក្រោយ","borderColor":"ពណ៌បន្ទាត់ស៊ុម","data":"ទិន្នន័យ","header":"ក្បាល","yes":"ព្រម","no":"ទេ","invalidWidth":"ទទឹងក្រឡាត្រូវតែជាលេខ។","invalidHeight":"កម្ពស់ក្រឡាត្រូវតែជាលេខ។","invalidRowSpan":"ចំនួនជួរដេកលាយចូលគ្នាត្រូវតែជាលេខទាំងអស់។","invalidColSpan":"ចំនួនជួរឈរលាយចូលគ្នាត្រូវតែជាលេខទាំងអស់។","chooseColor":"រើស"},"cellPad":"ចន្លោះក្រឡា","cellSpace":"គម្លាតក្រឡា","column":{"menu":"ជួរឈរ","insertBefore":"បញ្ចូលជួរឈរពីមុខ","insertAfter":"បញ្ចូលជួរឈរពីក្រោយ","deleteColumn":"លុបជួរឈរ"},"columns":"ជួរឈរ","deleteTable":"លុបតារាង","headers":"ក្បាល","headersBoth":"ទាំងពីរ","headersColumn":"ជួរឈរដំបូង","headersNone":"មិនមាន","headersRow":"ជួរដេកដំបូង","invalidBorder":"ទំហំបន្ទាត់ស៊ុមត្រូវតែជាលេខ។","invalidCellPadding":"ចន្លោះក្រឡាត្រូវតែជាលេខវិជ្ជមាន។","invalidCellSpacing":"គម្លាតក្រឡាត្រូវតែជាលេខវិជ្ជមាន។","invalidCols":"ចំនួនជួរឈរត្រូវតែជាលេខធំជាង 0។","invalidHeight":"កម្ពស់តារាងត្រូវតែជាលេខ","invalidRows":"ចំនួនជួរដេកត្រូវតែជាលេខធំជាង 0។","invalidWidth":"ទទឹងតារាងត្រូវតែជាលេខ។","menu":"លក្ខណៈតារាង","row":{"menu":"ជួរដេក","insertBefore":"បញ្ចូលជួរដេកពីមុខ","insertAfter":"បញ្ចូលជួរដេកពីក្រោយ","deleteRow":"លុបជួរដេក"},"rows":"ជួរដេក","summary":"សេចក្តីសង្ខេប","title":"លក្ខណៈតារាង","toolbar":"តារាង","widthPc":"ភាគរយ","widthPx":"ភីកសែល","widthUnit":"ឯកតាទទឹង"},"undo":{"redo":"ធ្វើឡើងវិញ","undo":"មិនធ្វើវិញ"},"wsc":{"btnIgnore":"មិនផ្លាស់ប្តូរ","btnIgnoreAll":"មិនផ្លាស់ប្តូរ ទាំងអស់","btnReplace":"ជំនួស","btnReplaceAll":"ជំនួសទាំងអស់","btnUndo":"សារឡើងវិញ","changeTo":"ផ្លាស់ប្តូរទៅ","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"ពុំមានកម្មវិធីពិនិត្យអក្ខរាវិរុទ្ធ ។ តើចង់ទាញយកពីណា?","manyChanges":"ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: %1 ពាក្យបានផ្លាស់ប្តូរ","noChanges":"ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: ពុំមានផ្លាស់ប្តូរ","noMispell":"ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: គ្មានកំហុស","noSuggestions":"- គ្មានសំណើរ -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"គ្មានក្នុងវចនានុក្រម","oneChange":"ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: ពាក្យមួយត្រូចបានផ្លាស់ប្តូរ","progress":"កំពុងពិនិត្យអក្ខរាវិរុទ្ធ...","title":"Spell Check","toolbar":"ពិនិត្យអក្ខរាវិរុទ្ធ"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/ko.js b/htmltest/sites/all/libraries/ckeditor-version/lang/ko.js
new file mode 100644
index 00000000..d3924beb
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/ko.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ko']={"editor":"Rich Text Editor","common":{"editorHelp":"도움이 필요하시면 ALT 0 을 누르세요","browseServer":"서버 보기","url":"URL","protocol":"프로토콜","upload":"업로드","uploadSubmit":"서버로 전송","image":"이미지","flash":"플래쉬","form":"폼","checkbox":"체크박스","radio":"라디오버튼","textField":"입력필드","textarea":"입력영역","hiddenField":"숨김필드","button":"버튼","select":"펼침목록","imageButton":"이미지버튼","notSet":"<설정되지 않음>","id":"ID","name":"Name","langDir":"쓰기 방향","langDirLtr":"왼쪽에서 오른쪽 (LTR)","langDirRtl":"오른쪽에서 왼쪽 (RTL)","langCode":"언어 코드","longDescr":"URL 설명","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"예","cancel":"아니오","close":"닫기","preview":"미리보기","resize":"크기 조절","generalTab":"General","advancedTab":"자세히","validateNumberFailed":"이 값은 숫자가 아닙니다.","confirmNewPage":"저장하지 않은 모든 변경사항은 유실됩니다. 정말로 새로운 페이지를 부르겠습니까?","confirmCancel":"몇몇개의 옵션이 바꼈습니다. 정말로 창을 닫으시겠습니까?","options":"옵션","target":"타겟","targetNew":"새로운 창 (_blank)","targetTop":"최상위 창 (_top)","targetSelf":"같은 창 (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"왼쪽에서 오른쪽 (LTR)","langDirRTL":"오른쪽에서 왼쪽 (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"너비","height":"높이","align":"정렬","alignLeft":"왼쪽","alignRight":"오른쪽","alignCenter":"가운데","alignTop":"위","alignMiddle":"중간","alignBottom":"아래","invalidValue":"잘못된 값.","invalidHeight":"높이는 숫자여야 합니다.","invalidWidth":"넓이는 숫자여야 합니다.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"CKEditor 에 대하여","help":"도움이 필요하시면 $1 를 확인하세요","moreInfo":"라이센스에 대한  정보를 보고싶다면 우리의 웹 사이트를 방문하세요:","title":"CKEditor에 대하여","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"진하게","italic":"이텔릭","strike":"취소선","subscript":"아래 첨자","superscript":"위 첨자","underline":"밑줄"},"bidi":{"ltr":"택스트 방향이 왼쪽에서 오른쪽으로 ","rtl":"택스트 방향이 오른쪽에서 왼쪽으로"},"blockquote":{"toolbar":"인용 블록"},"clipboard":{"copy":"복사하기","copyError":"브라우저의 보안설정때문에 복사하기 기능을 실행할 수 없습니다. 키보드 명령을 사용하십시요.  (Ctrl/Cmd+C).","cut":"잘라내기","cutError":"브라우저의 보안설정때문에 잘라내기 기능을 실행할 수 없습니다. 키보드 명령을 사용하십시요. (Ctrl/Cmd+X).","paste":"붙여넣기","pasteArea":"범위 붙여넣기","pasteMsg":"키보드의 (<STRONG>Ctrl/Cmd+V</STRONG>) 를 이용해서 상자안에 붙여넣고 <STRONG>OK</STRONG> 를 누르세요.","securityMsg":"브러우저 보안 설정으로 인해, 클립보드의 자료를 직접 접근할 수 없습니다. 이 창에 다시 붙여넣기 하십시오.","title":"붙여넣기"},"colorbutton":{"auto":"기본색상","bgColorTitle":"배경 색상","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"색상선택...","panelTitle":"Colors","textColorTitle":"글자 색상"},"colordialog":{"clear":"제거","highlight":"하이라이트","options":"색상 옵션","selected":"색상 선택됨","title":"색상 선택"},"templates":{"button":"템플릿","emptyListMsg":"(템플릿이 없습니다.)","insertOption":"현재 내용 바꾸기","options":"템플릿 옵션","selectPromptMsg":"에디터에서 사용할 템플릿을 선택하십시요.<br>(지금까지 작성된 내용은 사라집니다.):","title":"내용 템플릿"},"contextmenu":{"options":"컨텍스트 메뉴 옵션"},"div":{"IdInputLabel":"ID","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"왼쪽에서 오른쪽 (LTR)","langDirLabel":"쓰기 방향","langDirRTLLabel":"오른쪽에서 왼쪽 (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"툴바 삭제","toolbarExpand":"확장 툴바","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"편집자용 툴바들"},"elementspath":{"eleLabel":"요소 위치","eleTitle":"%1 요소"},"find":{"find":"찾기","findOptions":"Find Options","findWhat":"찾을 문자열:","matchCase":"대소문자 구분","matchCyclic":"Match cyclic","matchWord":"온전한 단어","notFoundMsg":"문자열을 찾을 수 없습니다.","replace":"바꾸기","replaceAll":"모두 바꾸기","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"바꿀 문자열:","title":"찾기 & 바꾸기"},"fakeobjects":{"anchor":"책갈피 삽입/변경","flash":"Flash Animation","hiddenfield":"숨김필드","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"줄아래(Abs Bottom)","alignAbsMiddle":"줄중간(Abs Middle)","alignBaseline":"기준선","alignTextTop":"글자상단","bgcolor":"배경 색상","chkFull":"Allow Fullscreen","chkLoop":"반복","chkMenu":"플래쉬메뉴 가능","chkPlay":"자동재생","flashvars":"Variables for Flash","hSpace":"수평여백","properties":"플래쉬 속성","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"영역","scaleAll":"모두보기","scaleFit":"영역자동조절","scaleNoBorder":"경계선없음","title":"플래쉬 등록정보","vSpace":"수직여백","validateHSpace":"HSpace must be a number.","validateSrc":"링크 URL을 입력하십시요.","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"글자 크기","voiceLabel":"Font Size","panelTitle":"글자 크기"},"label":"폰트","panelTitle":"폰트","voiceLabel":"폰트"},"forms":{"button":{"title":"버튼 속성","text":"버튼글자(값)","type":"버튼종류","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"체크박스 속성","radioTitle":"라디오버튼 속성","value":"값","selected":"선택됨"},"form":{"title":"폼 속성","menu":"폼 속성","action":"실행경로(Action)","method":"방법(Method)","encoding":"Encoding"},"hidden":{"title":"숨김필드 속성","name":"이름","value":"값"},"select":{"title":"펼침목록 속성","selectInfo":"정보","opAvail":"선택옵션","value":"값","size":"세로크기","lines":"줄","chkMulti":"여러항목 선택 허용","opText":"이름","opValue":"값","btnAdd":"추가","btnModify":"변경","btnUp":"위로","btnDown":"아래로","btnSetValue":"선택된것으로 설정","btnDelete":"삭제"},"textarea":{"title":"입력영역 속성","cols":"칸수","rows":"줄수"},"textfield":{"title":"입력필드 속성","name":"이름","value":"값","charWidth":"글자 너비","maxChars":"최대 글자수","type":"종류","typeText":"문자열","typePass":"비밀번호","typeEmail":"이메일","typeSearch":"검색","typeTel":"전화번호","typeUrl":"URL"}},"format":{"label":"포맷","panelTitle":"포맷","tag_address":"Address","tag_div":"기본 (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"수평선 삽입"},"iframe":{"border":"프레임 테두리 표시","noUrl":"iframe 대응 URL을 입력해주세요.","scrolling":"스크롤바 사용","title":"IFrame 속성","toolbar":"IFrame"},"image":{"alertUrl":"이미지 URL을 입력하십시요","alt":"이미지 설명","border":"테두리","btnUpload":"서버로 전송","button2Img":"단순 이미지에서 선택한 이미지 버튼을 변환하시겠습니까?","hSpace":"수평여백","img2Button":"이미지 버튼에 선택한 이미지를 변환하시겠습니까?","infoTab":"이미지 정보","linkTab":"링크","lockRatio":"비율 유지","menu":"이미지 설정","resetSize":"원래 크기로","title":"이미지 설정","titleButton":"이미지버튼 속성","upload":"업로드","urlMissing":"이미지 소스 URL이 없습니다.","vSpace":"수직여백","validateBorder":"테두리는 정수여야 합니다.","validateHSpace":"가로 길이는 정수여야 합니다.","validateVSpace":"세로 길이는 정수여야 합니다."},"indent":{"indent":"들여쓰기","outdent":"내어쓰기"},"smiley":{"options":"이모티콘 옵션","title":"아이콘 삽입","toolbar":"아이콘"},"justify":{"block":"양쪽 맞춤","center":"가운데 정렬","left":"왼쪽 정렬","right":"오른쪽 정렬"},"link":{"acccessKey":"엑세스 키","advanced":"자세히","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"책갈피 삽입/변경","menu":"책갈피 속성","title":"책갈피 속성","name":"책갈피 이름","errorName":"책갈피 이름을 입력하십시요.","remove":"Remove Anchor"},"anchorId":"책갈피 ID","anchorName":"책갈피 이름","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"이메일 주소","emailBody":"내용","emailSubject":"제목","id":"ID","info":"링크 정보","langCode":"쓰기 방향","langDir":"쓰기 방향","langDirLTR":"왼쪽에서 오른쪽 (LTR)","langDirRTL":"오른쪽에서 왼쪽 (RTL)","menu":"링크 수정","name":"Name","noAnchors":"(문서에 책갈피가 없습니다.)","noEmail":"이메일주소를 입력하십시요.","noUrl":"링크 URL을 입력하십시요.","other":"<기타>","popupDependent":"Dependent (Netscape)","popupFeatures":"팝업창 설정","popupFullScreen":"전체화면 (IE)","popupLeft":"왼쪽 위치","popupLocationBar":"주소표시줄","popupMenuBar":"메뉴바","popupResizable":"크기 조절 가능","popupScrollBars":"스크롤바","popupStatusBar":"상태바","popupToolbar":"툴바","popupTop":"윗쪽 위치","rel":"Relationship","selectAnchor":"책갈피 선택","styles":"Style","tabIndex":"탭 순서","target":"타겟","targetFrame":"<프레임>","targetFrameName":"타겟 프레임 이름","targetPopup":"<팝업창>","targetPopupName":"팝업창 이름","title":"링크","toAnchor":"책갈피","toEmail":"이메일","toUrl":"URL","toolbar":"링크 삽입/변경","type":"링크 종류","unlink":"링크 삭제","upload":"업로드"},"list":{"bulletedlist":"순서없는 목록","numberedlist":"순서있는 목록"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"여기에 그래프 삽입"},"maximize":{"maximize":"최대","minimize":"최소"},"newpage":{"toolbar":"새 문서"},"pagebreak":{"alt":"패이지 나누기","toolbar":"인쇄시 페이지 나누기 삽입"},"pastetext":{"button":"텍스트로 붙여넣기","title":"텍스트로 붙여넣기"},"pastefromword":{"confirmCleanup":"붙여 넣기 할 텍스트는 MS Word에서 복사 한 것입니다. 붙여 넣기 전에 MS Word 포멧을 삭제 하시겠습니까?","error":"내부 오류로 붙여 넣은 데이터를 정리 할 수 없습니다.","title":"MS Word 형식에서 붙여넣기","toolbar":"MS Word 형식에서 붙여넣기"},"preview":{"preview":"미리보기"},"print":{"toolbar":"인쇄하기"},"removeformat":{"toolbar":"포맷 지우기"},"save":{"toolbar":"저장하기"},"selectall":{"toolbar":"전체선택"},"showblocks":{"toolbar":"블록 보기"},"sourcearea":{"toolbar":"소스"},"specialchar":{"options":"특수문자 옵션","title":"특수문자 선택","toolbar":"특수문자 삽입"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"스타일","panelTitle":"전체 구성 스타일","panelTitle1":"블록 스타일","panelTitle2":"인라인 스타일","panelTitle3":"오브젝트 스타일"},"table":{"border":"테두리 크기","caption":"캡션","cell":{"menu":"셀/칸(Cell)","insertBefore":"앞에 셀/칸 삽입","insertAfter":"뒤에 셀/칸 삽입","deleteCell":"셀 삭제","merge":"셀 합치기","mergeRight":"오른쪽 뭉치기","mergeDown":"왼쪽 뭉치기","splitHorizontal":"수평 나누기","splitVertical":"수직 나누기","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"셀 여백","cellSpace":"셀 간격","column":{"menu":"열(Column)","insertBefore":"앞에 열 삽입","insertAfter":"뒤에 열 삽입","deleteColumn":"세로줄 삭제"},"columns":"세로줄","deleteTable":"표 삭제","headers":"해더","headersBoth":"모두","headersColumn":"첫 열","headersNone":"None","headersRow":"첫 행","invalidBorder":"테두리 크기는 숫자여야 합니다.","invalidCellPadding":"셀 안쪽의 여백은 0 이상이어야 합니다.","invalidCellSpacing":"셀 간격은 0 이상이어야 합니다.","invalidCols":"행 번호는 0보다 큰 숫자여야 합니다.","invalidHeight":"표 높이는 숫자여야 합니다.","invalidRows":"행 번호는 0보다 큰 숫자여야 합니다.","invalidWidth":"표의 폭은 숫자여야 합니다.","menu":"표 설정","row":{"menu":"행(Row)","insertBefore":"앞에 행 삽입","insertAfter":"뒤에 행 삽입","deleteRow":"가로줄 삭제"},"rows":"가로줄","summary":"요약","title":"표 설정","toolbar":"표","widthPc":"퍼센트","widthPx":"픽셀","widthUnit":"폭 단위"},"undo":{"redo":"재실행","undo":"취소"},"wsc":{"btnIgnore":"건너뜀","btnIgnoreAll":"모두 건너뜀","btnReplace":"변경","btnReplaceAll":"모두 변경","btnUndo":"취소","changeTo":"변경할 단어","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"철자 검사기가 철치되지 않았습니다. 지금 다운로드하시겠습니까?","manyChanges":"철자검사 완료: %1 단어가 변경되었습니다.","noChanges":"철자검사 완료: 변경된 단어가 없습니다.","noMispell":"철자검사 완료: 잘못된 철자가 없습니다.","noSuggestions":"- 추천단어 없음 -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"사전에 없는 단어","oneChange":"철자검사 완료: 단어가 변경되었습니다.","progress":"철자검사를 진행중입니다...","title":"Spell Check","toolbar":"철자검사"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/ku.js b/htmltest/sites/all/libraries/ckeditor-version/lang/ku.js
new file mode 100644
index 00000000..50e7427c
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/ku.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ku']={"editor":"سەرنووسەی دەقی بە پیت","common":{"editorHelp":"کلیکی ALT لەگەڵ 0 بکه بۆ یارمەتی","browseServer":"هێنانی ڕاژە","url":"ناونیشانی بەستەر","protocol":"پڕۆتۆکۆڵ","upload":"بارکردن","uploadSubmit":"ناردنی بۆ ڕاژە","image":"وێنە","flash":"فلاش","form":"داڕشتە","checkbox":"خانەی نیشانکردن","radio":"جێگرەوەی دوگمە","textField":"خانەی دەق","textarea":"ڕووبەری دەق","hiddenField":"شاردنەوی خانە","button":"دوگمە","select":"هەڵبژاردەی خانە","imageButton":"دوگمەی وێنە","notSet":"<هیچ دانەدراوە>","id":"ناسنامە","name":"ناو","langDir":"ئاراستەی زمان","langDirLtr":"چەپ بۆ ڕاست (LTR)","langDirRtl":"ڕاست بۆ چەپ (RTL)","langCode":"هێمای زمان","longDescr":"پێناسەی درێژی بەستەر","cssClass":"شێوازی چینی پهڕە","advisoryTitle":"ڕاوێژکاری سەردێڕ","cssStyle":"شێواز","ok":"باشە","cancel":"هەڵوەشاندن","close":"داخستن","preview":"پێشبینین","resize":"گۆڕینی ئەندازە","generalTab":"گشتی","advancedTab":"پەرەسەندوو","validateNumberFailed":"ئەم نرخە ژمارە نیە، تکایە نرخێکی ژمارە بنووسە.","confirmNewPage":"سەرجەم گۆڕانکاریەکان و پێکهاتەکانی ناووەوە لەدەست دەدەی گەر بێتوو پاشکەوتی نەکەی یەکەم جار، تۆ هەر دڵنیایی لەکردنەوەی پەنجەرەکی نوێ؟","confirmCancel":"هەندێك هەڵبژاردە گۆڕدراوە. تۆ دڵنیایی لە داخستنی ئەم دیالۆگە؟","options":"هەڵبژاردەکان","target":"ئامانج","targetNew":"پەنجەرەیەکی نوێ (_blank)","targetTop":"لووتکەی پەنجەرە (_top)","targetSelf":"لەهەمان پەنجەرە (_self)","targetParent":"پەنجەرەی باوان (_parent)","langDirLTR":"چەپ بۆ ڕاست (LTR)","langDirRTL":"ڕاست بۆ چەپ (RTL)","styles":"شێواز","cssClasses":"شێوازی چینی پەڕە","width":"پانی","height":"درێژی","align":"ڕێککەرەوە","alignLeft":"چەپ","alignRight":"ڕاست","alignCenter":"ناوەڕاست","alignTop":"سەرەوە","alignMiddle":"ناوەند","alignBottom":"ژێرەوە","invalidValue":"نرخێکی نادرووست.","invalidHeight":"درێژی دەبێت ژمارە بێت.","invalidWidth":"پانی دەبێت ژمارە بێت.","invalidCssLength":"ئەم نرخەی دراوە بۆ خانەی \"%1\" دەبێت ژمارەکی درووست بێت یان بێ ناونیشانی ئامرازی (px, %, in, cm, mm, em, ex, pt, یان pc).","invalidHtmlLength":"ئەم نرخەی دراوە بۆ خانەی \"%1\" دەبێت ژمارەکی درووست بێت یان بێ ناونیشانی ئامرازی HTML (px یان %).","invalidInlineStyle":"دانەی نرخی شێوازی ناوهێڵ دەبێت پێکهاتبێت لەیەك یان زیاتری داڕشتە \"ناو : نرخ\", جیاکردنەوەی بە فاریزە و خاڵ","cssLengthTooltip":"ژمارەیەك بنووسه بۆ نرخی piksel یان ئامرازێکی درووستی CSS (px, %, in, cm, mm, em, ex, pt, یان pc).","unavailable":"%1<span class=\"cke_accessibility\">, ئامادە نیە</span>"},"about":{"copy":"مافی لەبەرگەرتنەوەی &copy; $1. گشتی پارێزراوه. ورگێڕانی بۆ کوردی لەلایەن هۆژە کۆیی.","dlgTitle":"دەربارەی CKEditor","help":"سەیری $1 بکه بۆ یارمەتی.","moreInfo":"بۆ زانیاری زیاتر دەربارەی مۆڵەتی بەکارهێنان، تکایه سەردانی ماڵپەڕەکەمان بکه:","title":"دەربارەی CKEditor","userGuide":"ڕێپیشاندەری CKEditors"},"basicstyles":{"bold":"قەڵەو","italic":"لار","strike":"لێدان","subscript":"ژێرنووس","superscript":"سەرنووس","underline":"ژێرهێڵ"},"bidi":{"ltr":"ئاراستەی نووسە لە چەپ بۆ ڕاست","rtl":"ئاراستەی نووسە لە ڕاست بۆ چەپ"},"blockquote":{"toolbar":"بەربەستکردنی ووتەی وەرگیراو"},"clipboard":{"copy":"لەبەرگرتنەوە","copyError":"پارێزی وێبگەڕەکەت ڕێگەنادات بەسەرنووسەکە لە لکاندنی دەقی خۆکارارنە. تکایە لەبری ئەمە ئەم فەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+C).","cut":"بڕین","cutError":"پارێزی وێبگەڕەکەت ڕێگەنادات بە سەرنووسەکە لەبڕینی خۆکارانە. تکایە لەبری ئەمە ئەم فەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+X).","paste":"لکاندن","pasteArea":"ناوچەی لکاندن","pasteMsg":"تکایە بیلکێنە لەناوەوەی ئەم سنوقە لەڕێی تەختەکلیلەکەت بە بەکارهێنانی کلیلی (<STRONG>Ctrl/Cmd+V</STRONG>) دووای کلیکی باشە بکە.","securityMsg":"بەهۆی شێوەپێدانی پارێزی وێبگەڕەکەت، سەرنووسەکه ناتوانێت دەستبگەیەنێت بەهەڵگیراوەکە ڕاستەوخۆ. بۆیه پێویسته دووباره بیلکێنیت لەم پەنجەرەیه.","title":"لکاندن"},"colorbutton":{"auto":"خۆکار","bgColorTitle":"ڕەنگی پاشبنەما","colors":{"000":"ڕەش","800000":"سۆرو ماڕوونی","8B4513":"ماڕوونی","2F4F4F":"سەوزی تاریك","008080":"سەوز و شین","000080":"شینی تۆخ","4B0082":"مۆری تۆخ","696969":"ڕەساسی تۆخ","B22222":"سۆری تۆخ","A52A2A":"قاوەیی","DAA520":"قاوەیی بریسکەدار","006400":"سەوزی تۆخ","40E0D0":"شینی ناتۆخی بریسکەدار","0000CD":"شینی مامناوەند","800080":"پەمبەیی","808080":"ڕەساسی","F00":"سۆر","FF8C00":"نارەنجی تۆخ","FFD700":"زەرد","008000":"سەوز","0FF":"شینی ئاسمانی","00F":"شین","EE82EE":"پەمەیی","A9A9A9":"ڕەساسی ناتۆخ","FFA07A":"نارەنجی ناتۆخ","FFA500":"نارەنجی","FFFF00":"زەرد","00FF00":"سەوز","AFEEEE":"شینی ناتۆخ","ADD8E6":"شینی زۆر ناتۆخ","DDA0DD":"پەمەیی ناتۆخ","D3D3D3":"ڕەساسی بریسکەدار","FFF0F5":"جەرگی زۆر ناتۆخ","FAEBD7":"جەرگی ناتۆخ","FFFFE0":"سپی ناتۆخ","F0FFF0":"هەنگوینی ناتۆخ","F0FFFF":"شینێکی زۆر ناتۆخ","F0F8FF":"شینێکی ئاسمانی زۆر ناتۆخ","E6E6FA":"شیری","FFF":"سپی"},"more":"ڕەنگی زیاتر...","panelTitle":"ڕەنگەکان","textColorTitle":"ڕەنگی دەق"},"colordialog":{"clear":"پاکیکەوە","highlight":"نیشانکردن","options":"هەڵبژاردەی ڕەنگەکان","selected":"ڕەنگی هەڵبژێردراو","title":"هەڵبژاردنی ڕەنگ"},"templates":{"button":"ڕووکار","emptyListMsg":"(هیچ ڕووکارێك دیارینەکراوە)","insertOption":"لە شوێن دانانی ئەم پێکهاتانەی ئێستا","options":"هەڵبژاردەکانی ڕووکار","selectPromptMsg":"ڕووکارێك هەڵبژێره بۆ کردنەوەی له سەرنووسەر:","title":"پێکهاتەی ڕووکار"},"contextmenu":{"options":"هەڵبژاردەی لیستەی کلیکی دەستی ڕاست"},"div":{"IdInputLabel":"ناسنامە","advisoryTitleInputLabel":"سەردێڕ","cssClassInputLabel":"شێوازی چینی پەڕه","edit":"چاکسازی Div","inlineStyleInputLabel":"شێوازی ناوهێڵ","langDirLTRLabel":"چەپ بۆ ڕاست (LTR)","langDirLabel":"ئاراستەی زمان","langDirRTLLabel":"ڕاست بۆ چەپ (RTL)","languageCodeInputLabel":"هێمای زمان","remove":"لابردنی Div","styleSelectLabel":"شێواز","title":"دروستکردنی لەخۆگری Div","toolbar":"دروستکردنی لەخۆگری Div"},"toolbar":{"toolbarCollapse":"شاردنەوی هێڵی تووڵامراز","toolbarExpand":"نیشاندانی هێڵی تووڵامراز","toolbarGroups":{"document":"پەڕه","clipboard":"بڕین/پووچکردنەوە","editing":"چاکسازی","forms":"داڕشتە","basicstyles":"شێوازی بنچینەیی","paragraph":"بڕگە","links":"بەستەر","insert":"خستنە ناو","styles":"شێواز","colors":"ڕەنگەکان","tools":"ئامرازەکان"},"toolbars":"تووڵامرازی دەسکاریکەر"},"elementspath":{"eleLabel":"ڕێڕەوی توخمەکان","eleTitle":"%1 توخم"},"find":{"find":"گەڕان","findOptions":"هەڵبژاردەکانی گەڕان","findWhat":"گەڕان بەدووای:","matchCase":"جیاکردنەوه لەنێوان پیتی گەورەو بچووك","matchCyclic":"گەڕان لەهەموو پەڕەکه","matchWord":"تەنەا هەموو وشەکه","notFoundMsg":"هیچ دەقه گەڕانێك نەدۆزراوه.","replace":"لەبریدانان","replaceAll":"لەبریدانانی هەمووی","replaceSuccessMsg":" پێشهاتە(ی) لەبری دانرا. %1","replaceWith":"لەبریدانان به:","title":"گەڕان و لەبریدانان"},"fakeobjects":{"anchor":"لەنگەر","flash":"فلاش","hiddenfield":"شاردنەوەی خانه","iframe":"لەچوارچێوە","unknown":"بەرکارێکی نەناسراو"},"flash":{"access":"دەستپێگەیشتنی نووسراو","accessAlways":"هەمیشه","accessNever":"هەرگیز","accessSameDomain":"هەمان دۆمەین","alignAbsBottom":"له ژێرەوه","alignAbsMiddle":"لەناوەند","alignBaseline":"هێڵەبنەڕەت","alignTextTop":"دەق لەسەرەوه","bgcolor":"ڕەنگی پاشبنەما","chkFull":"ڕێپێدان بە پڕی شاشه","chkLoop":"گرێ","chkMenu":"چالاککردنی لیستەی فلاش","chkPlay":"پێکردنی یان لێدانی خۆکار","flashvars":"گۆڕاوەکان بۆ فلاش","hSpace":"بۆشایی ئاسۆیی","properties":"خاسیەتی فلاش","propertiesTab":"خاسیەت","quality":"جۆرایەتی","qualityAutoHigh":"بەرزی خۆکار","qualityAutoLow":"نزمی خۆکار","qualityBest":"باشترین","qualityHigh":"بەرزی","qualityLow":"نزم","qualityMedium":"مامناوەند","scale":"پێوانه","scaleAll":"نیشاندانی هەموو","scaleFit":"بەوردی بگونجێت","scaleNoBorder":"بێ پەراوێز","title":"خاسیەتی فلاش","vSpace":"بۆشایی ئەستونی","validateHSpace":"بۆشایی ئاسۆیی دەبێت ژمارە بێت.","validateSrc":"ناونیشانی بەستەر نابێت خاڵی بێت","validateVSpace":"بۆشایی ئەستونی دەبێت ژماره بێت.","windowMode":"شێوازی پەنجەره","windowModeOpaque":"ناڕوون","windowModeTransparent":"ڕۆشن","windowModeWindow":"پەنجەره"},"font":{"fontSize":{"label":"گەورەیی","voiceLabel":"گەورەیی فۆنت","panelTitle":"گەورەیی فۆنت"},"label":"فۆنت","panelTitle":"ناوی فۆنت","voiceLabel":"فۆنت"},"forms":{"button":{"title":"خاسیەتی دوگمە","text":"(نرخی) دەق","type":"جۆر","typeBtn":"دوگمە","typeSbm":"بنێرە","typeRst":"ڕێکخستنەوە"},"checkboxAndRadio":{"checkboxTitle":"خاسیەتی چووارگۆشی پشکنین","radioTitle":"خاسیەتی جێگرەوەی دوگمە","value":"نرخ","selected":"هەڵبژاردرا"},"form":{"title":"خاسیەتی داڕشتە","menu":"خاسیەتی داڕشتە","action":"کردار","method":"ڕێگە","encoding":"بەکۆدکەر"},"hidden":{"title":"خاسیەتی خانەی شاردراوە","name":"ناو","value":"نرخ"},"select":{"title":"هەڵبژاردەی خاسیەتی خانە","selectInfo":"زانیاری","opAvail":"هەڵبژاردەی لەبەردەستدابوون","value":"نرخ","size":"گەورەیی","lines":"هێڵەکان","chkMulti":"ڕێدان بەفره هەڵبژارده","opText":"دەق","opValue":"نرخ","btnAdd":"زیادکردن","btnModify":"گۆڕانکاری","btnUp":"سەرەوه","btnDown":"خوارەوە","btnSetValue":"دابنێ وەك نرخێکی هەڵبژێردراو","btnDelete":"سڕینەوه"},"textarea":{"title":"خاسیەتی ڕووبەری دەق","cols":"ستوونەکان","rows":"ڕیزەکان"},"textfield":{"title":"خاسیەتی خانەی دەق","name":"ناو","value":"نرخ","charWidth":"پانی نووسە","maxChars":"ئەوپەڕی نووسە","type":"جۆر","typeText":"دەق","typePass":"پێپەڕەوشە","typeEmail":"ئیمەیل","typeSearch":"گەڕان","typeTel":"ژمارەی تەلەفۆن","typeUrl":"ناونیشانی بەستەر"}},"format":{"label":"ڕازاندنەوە","panelTitle":"بەشی ڕازاندنەوه","tag_address":"ناونیشان","tag_div":"(DIV)-ی ئاسایی","tag_h1":"سەرنووسەی ١","tag_h2":"سەرنووسەی ٢","tag_h3":"سەرنووسەی ٣","tag_h4":"سەرنووسەی ٤","tag_h5":"سەرنووسەی ٥","tag_h6":"سەرنووسەی ٦","tag_p":"ئاسایی","tag_pre":"شێوازکراو"},"horizontalrule":{"toolbar":"دانانی هێلی ئاسۆیی"},"iframe":{"border":"نیشاندانی لاکێشه بە چوواردەوری چووارچێوە","noUrl":"تکایه ناونیشانی بەستەر بنووسه بۆ چووارچێوه","scrolling":"چالاککردنی هاتووچۆپێکردن","title":"دیالۆگی چووارچێوه","toolbar":"چووارچێوه"},"image":{"alertUrl":"تکایه ناونیشانی بەستەری وێنه بنووسه","alt":"جێگرەوەی دەق","border":"پەراوێز","btnUpload":"ناردنی بۆ ڕاژه","button2Img":"تۆ دەتەوێت دوگمەی وێنەی دیاریکراو بگۆڕیت بۆ وێنەیەکی ئاسایی؟","hSpace":"بۆشایی ئاسۆیی","img2Button":"تۆ دەتەوێت وێنەی دیاریکراو بگۆڕیت بۆ دوگمەی وێنه؟","infoTab":"زانیاری وێنه","linkTab":"بەستەر","lockRatio":"داخستنی ڕێژه","menu":"خاسیەتی وێنه","resetSize":"ڕێکخستنەوەی قەباره","title":"خاسیەتی وێنه","titleButton":"خاسیەتی دوگمەی وێنه","upload":"بارکردن","urlMissing":"سەرچاوەی بەستەری وێنه بزره","vSpace":"بۆشایی ئەستونی","validateBorder":"پەراوێز دەبێت بەتەواوی تەنها ژماره بێت.","validateHSpace":"بۆشایی ئاسۆیی دەبێت بەتەواوی تەنها ژمارە بێت.","validateVSpace":"بۆشایی ئەستونی دەبێت بەتەواوی تەنها ژماره بێت."},"indent":{"indent":"زیادکردنی بۆشایی","outdent":"کەمکردنەوەی بۆشایی"},"smiley":{"options":"هەڵبژاردەی زەردەخەنه","title":"دانانی زەردەخەنەیەك","toolbar":"زەردەخەنه"},"justify":{"block":"هاوستوونی","center":"ناوەڕاست","left":"بەهێڵ کردنی چەپ","right":"بەهێڵ کردنی ڕاست"},"link":{"acccessKey":"کلیلی دەستپێگەیشتن","advanced":"پێشکەوتوو","advisoryContentType":"جۆری ناوەڕۆکی ڕاویژکار","advisoryTitle":"ڕاوێژکاری سەردێڕ","anchor":{"toolbar":"دانان/چاکسازی لەنگەر","menu":"چاکسازی لەنگەر","title":"خاسیەتی لەنگەر","name":"ناوی لەنگەر","errorName":"تکایه ناوی لەنگەر بنووسه","remove":"لابردنی لەنگەر"},"anchorId":"بەپێی ناسنامەی توخم","anchorName":"بەپێی ناوی لەنگەر","charset":"بەستەری سەرچاوەی نووسە","cssClasses":"شێوازی چینی پەڕه","emailAddress":"ناونیشانی ئیمەیل","emailBody":"ناوەڕۆکی نامە","emailSubject":"بابەتی نامە","id":"ناسنامە","info":"زانیاری بەستەر","langCode":"هێمای زمان","langDir":"ئاراستەی زمان","langDirLTR":"چەپ بۆ ڕاست (LTR)","langDirRTL":"ڕاست بۆ چەپ (RTL)","menu":"چاکسازی بەستەر","name":"ناو","noAnchors":"(هیچ جۆرێکی لەنگەر ئامادە نیە لەم پەڕەیه)","noEmail":"تکایە ناونیشانی ئیمەیل بنووسە","noUrl":"تکایە ناونیشانی بەستەر بنووسە","other":"<هیتر>","popupDependent":"پێوەبەستراو (Netscape)","popupFeatures":"خاسیەتی پەنجەرەی سەرهەڵدەر","popupFullScreen":"پڕ بەپڕی شاشە (IE)","popupLeft":"جێگای چەپ","popupLocationBar":"هێڵی ناونیشانی بەستەر","popupMenuBar":"هێڵی لیسته","popupResizable":"توانای گۆڕینی قەباره","popupScrollBars":"هێڵی هاتووچۆپێکردن","popupStatusBar":"هێڵی دۆخ","popupToolbar":"هێڵی تووڵامراز","popupTop":"جێگای سەرەوە","rel":"پەیوەندی","selectAnchor":"هەڵبژاردنی لەنگەرێك","styles":"شێواز","tabIndex":"بازدەری تابی  ئیندێکس","target":"ئامانج","targetFrame":"<چووارچێوە>","targetFrameName":"ناوی ئامانجی چووارچێوە","targetPopup":"<پەنجەرەی سەرهەڵدەر>","targetPopupName":"ناوی پەنجەرەی سەرهەڵدەر","title":"بەستەر","toAnchor":"بەستەر بۆ لەنگەر له دەق","toEmail":"ئیمەیل","toUrl":"ناونیشانی بەستەر","toolbar":"دانان/ڕێکخستنی بەستەر","type":"جۆری بەستەر","unlink":"لابردنی بەستەر","upload":"بارکردن"},"list":{"bulletedlist":"دانان/لابردنی خاڵی لیست","numberedlist":"دانان/لابردنی ژمارەی لیست"},"liststyle":{"armenian":"ئاراستەی ژمارەی ئەرمەنی","bulletedTitle":"خاسیەتی لیستی خاڵی","circle":"بازنه","decimal":"ژمارە (1, 2, 3, وە هیتر.)","decimalLeadingZero":"ژمارە سفڕی لەپێشەوه (01, 02, 03, وە هیتر.)","disc":"پەپکە","georgian":"ئاراستەی ژمارەی جۆڕجی (an, ban, gan, وە هیتر.)","lowerAlpha":"ئەلفابێی بچووك (a, b, c, d, e, وە هیتر.)","lowerGreek":"یۆنانی بچووك (alpha, beta, gamma, وە هیتر.)","lowerRoman":"ژمارەی ڕۆمی بچووك (i, ii, iii, iv, v, وە هیتر.)","none":"هیچ","notset":"<دانەندراوه>","numberedTitle":"خاسیەتی لیستی ژمارەیی","square":"چووراگۆشە","start":"دەستپێکردن","type":"جۆر","upperAlpha":"ئەلفابێی گەوره (A, B, C, D, E, وە هیتر.)","upperRoman":"ژمارەی ڕۆمی گەوره (I, II, III, IV, V, وە هیتر.)","validateStartNumber":"دەستپێکەری لیستی ژمارەیی دەبێت تەنها ژمارە بێت."},"magicline":{"title":"بڕگە لێرە دابنێ"},"maximize":{"maximize":"ئەوپەڕی گەورەیی","minimize":"ئەوپەڕی بچووکی"},"newpage":{"toolbar":"پەڕەیەکی نوێ"},"pagebreak":{"alt":"پشووی پەڕە","toolbar":"دانانی پشووی پەڕە بۆ چاپکردن"},"pastetext":{"button":"لکاندنی وەك دەقی ڕوون","title":"لکاندنی وەك دەقی ڕوون"},"pastefromword":{"confirmCleanup":"ئەم دەقەی بەتەمای بیلکێنی پێدەچێت له word هێنرابێت. دەتەوێت پاکی بکەیوه پێش ئەوەی بیلکێنی؟","error":"هیچ ڕێگەیەك نەبوو لەلکاندنی دەقەکه بەهۆی هەڵەیەکی ناوەخۆیی","title":"لکاندنی لەلایەن Word","toolbar":"لکاندنی لەڕێی Word"},"preview":{"preview":"پێشبینین"},"print":{"toolbar":"چاپکردن"},"removeformat":{"toolbar":"لابردنی داڕشتەکە"},"save":{"toolbar":"پاشکەوتکردن"},"selectall":{"toolbar":"دیاریکردنی هەمووی"},"showblocks":{"toolbar":"نیشاندانی بەربەستەکان"},"sourcearea":{"toolbar":"سەرچاوە"},"specialchar":{"options":"هەڵبژاردەی نووسەی تایبەتی","title":"هەڵبژاردنی نووسەی تایبەتی","toolbar":"دانانی نووسەی تایبەتی"},"scayt":{"about":"دهربارهی SCAYT","aboutTab":"دهربارهی","addWord":"زیادکردنی ووشه","allCaps":"پشتگوێخستنی وشانهی پێکهاتووه لهپیتی گهوره","dic_create":"درووستکردن","dic_delete":"سڕینهوه","dic_field_name":"ناوی فهرههنگ","dic_info":"لهبنچینهدا فهرههنگی بهکارهێنهر کۆگاکردن کراوه له شهکرۆکه Cookie, ههرچۆنێك بێت شهکۆرکه سنووردار کراوه له قهباره کۆگاکردن.کاتێك فهرههنگی بهکارهێنهر گهیشته ئهم خاڵهی کهناتوانرێت زیاتر کۆگاکردن بکرێت له شهکرۆکه، ئهوسا فهرههنگهکه پێویسته کۆگابکرێت له ڕاژهکهی ئێمه. بۆ کۆگاکردنی زانیاری تایبهتی فهرههنگهکه له ڕاژهکهی ئێمه, پێویسته ناوێك ههڵبژێریت بۆ فهرههنگهکه. گهر تۆ فهرههنگێکی کۆگاکراوت ههیه, تکایه ناوی فهرههنگهکه بنووسه وه کلیکی دوگمهی گهڕاندنهوه بکه.","dic_rename":"گۆڕینی ناو","dic_restore":"گهڕاندنهوه","dictionariesTab":"فهرههنگهکان","disable":"ناچالاککردنی SCAYT","emptyDic":"ناوی فهرههنگ نابێت خاڵی بێت.","enable":"چالاککردنی SCAYT","ignore":"پشتگوێخستن","ignoreAll":"پشتگوێخستنی ههمووی","ignoreDomainNames":"پشتگوێخستنی دۆمهین","langs":"زمانهکان","languagesTab":"زمانهکان","mixedCase":"پشتگوێخستنی وشانهی پێکهاتووه لهپیتی گهورهو بچووك","mixedWithDigits":"پشتگوێخستنی وشانهی پێکهاتووه لهژماره","moreSuggestions":"پێشنیاری زیاتر","opera_title":"پشتیوانی نهکراوه لهلایهن Opera","options":"ههڵبژارده","optionsTab":"ههڵبژارده","title":"پشکنینی نووسه لهکاتی نووسین","toggle":"گۆڕینی SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"شێواز","panelTitle":"شێوازی ڕازاندنەوە","panelTitle1":"شێوازی خشت","panelTitle2":"شێوازی ناوهێڵ","panelTitle3":"شێوازی بەرکار"},"table":{"border":"گەورەیی پەراوێز","caption":"سەردێڕ","cell":{"menu":"خانه","insertBefore":"دانانی خانه لەپێش","insertAfter":"دانانی خانه لەپاش","deleteCell":"سڕینەوەی خانه","merge":"تێکەڵکردنی خانە","mergeRight":"تێکەڵکردنی لەگەڵ ڕاست","mergeDown":"تێکەڵکردنی لەگەڵ خوارەوە","splitHorizontal":"دابەشکردنی خانەی ئاسۆیی","splitVertical":"دابەشکردنی خانەی ئەستونی","title":"خاسیەتی خانه","cellType":"جۆری خانه","rowSpan":"ماوەی نێوان ڕیز","colSpan":"بستی ئەستونی","wordWrap":"پێچانەوەی وشە","hAlign":"ڕیزکردنی ئاسۆیی","vAlign":"ڕیزکردنی ئەستونی","alignBaseline":"هێڵەبنەڕەت","bgColor":"ڕەنگی پاشبنەما","borderColor":"ڕەنگی پەراوێز","data":"داتا","header":"سەرپەڕه","yes":"بەڵێ","no":"نەخێر","invalidWidth":"پانی خانه دەبێت بەتەواوی ژماره بێت.","invalidHeight":"درێژی خانه بەتەواوی دەبێت ژمارە بێت.","invalidRowSpan":"ماوەی نێوان ڕیز بەتەواوی دەبێت ژمارە بێت.","invalidColSpan":"ماوەی نێوان ئەستونی بەتەواوی دەبێت ژمارە بێت.","chooseColor":"هەڵبژێرە"},"cellPad":"بۆشایی ناوپۆش","cellSpace":"بۆشایی خانه","column":{"menu":"ئەستون","insertBefore":"دانانی ئەستون لەپێش","insertAfter":"دانانی ئەستوون لەپاش","deleteColumn":"سڕینەوەی ئەستوون"},"columns":"ستوونەکان","deleteTable":"سڕینەوەی خشتە","headers":"سەرپەڕه","headersBoth":"هەردووك","headersColumn":"یەکەم ئەستوون","headersNone":"هیچ","headersRow":"یەکەم ڕیز","invalidBorder":"ژمارەی پەراوێز دەبێت تەنها ژماره بێت.","invalidCellPadding":"ناوپۆشی خانه دەبێت ژمارەکی درووست بێت.","invalidCellSpacing":"بۆشایی خانه دەبێت ژمارەکی درووست بێت.","invalidCols":"ژمارەی ئەستوونی دەبێت گەورەتر بێت لەژمارەی 0.","invalidHeight":"درێژی خشته دهبێت تهنها ژماره بێت.","invalidRows":"ژمارەی ڕیز دەبێت گەورەتر بێت لەژمارەی 0.","invalidWidth":"پانی خشته دەبێت تەنها ژماره بێت.","menu":"خاسیەتی خشتە","row":{"menu":"ڕیز","insertBefore":"دانانی ڕیز لەپێش","insertAfter":"دانانی ڕیز لەپاش","deleteRow":"سڕینەوەی ڕیز"},"rows":"ڕیز","summary":"کورتە","title":"خاسیەتی خشتە","toolbar":"خشتە","widthPc":"لەسەدا","widthPx":"وێنەخاڵ - پیکسل","widthUnit":"پانی یەکە"},"undo":{"redo":"هەڵگەڕاندنەوە","undo":"پووچکردنەوە"},"wsc":{"btnIgnore":"پشتگوێ کردن","btnIgnoreAll":"پشتگوێکردنی ههمووی","btnReplace":"لهبریدانن","btnReplaceAll":"لهبریدانانی ههمووی","btnUndo":"پووچکردنهوه","changeTo":"گۆڕینی بۆ","errorLoading":"ههڵه لههێنانی داخوازینامهی خانهخۆێی ڕاژه: %s.","ieSpellDownload":"پشکنینی ڕێنووس دانهمزراوه. دهتهوێت ئێستا دایبگریت?","manyChanges":"پشکنینی ڕێنووس کۆتای هات: لهسهدا %1 ی وشهکان گۆڕدرا","noChanges":"پشکنینی ڕێنووس کۆتای هات: هیچ وشهیهك نۆگۆڕدرا","noMispell":"پشکنینی ڕێنووس کۆتای هات: هیچ ههڵهیهکی ڕێنووس نهدۆزراوه","noSuggestions":"- هیچ پێشنیارێك -","notAvailable":"ببووره، لهمکاتهدا ڕاژهکه لهبهردهستا نیه.","notInDic":"لهفهرههنگ دانیه","oneChange":"پشکنینی ڕێنووس کۆتای هات: یهك وشه گۆڕدرا","progress":"پشکنینی ڕێنووس لهبهردهوامبوون دایه...","title":"پشکنینی ڕێنووس","toolbar":"پشکنینی ڕێنووس"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/lt.js b/htmltest/sites/all/libraries/ckeditor-version/lang/lt.js
new file mode 100644
index 00000000..cdcab092
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/lt.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['lt']={"editor":"Pilnas redaktorius","common":{"editorHelp":"Spauskite ALT 0 dėl pagalbos","browseServer":"Naršyti po serverį","url":"URL","protocol":"Protokolas","upload":"Siųsti","uploadSubmit":"Siųsti į serverį","image":"Vaizdas","flash":"Flash","form":"Forma","checkbox":"Žymimasis langelis","radio":"Žymimoji akutė","textField":"Teksto laukas","textarea":"Teksto sritis","hiddenField":"Nerodomas laukas","button":"Mygtukas","select":"Atrankos laukas","imageButton":"Vaizdinis mygtukas","notSet":"<nėra nustatyta>","id":"Id","name":"Vardas","langDir":"Teksto kryptis","langDirLtr":"Iš kairės į dešinę (LTR)","langDirRtl":"Iš dešinės į kairę (RTL)","langCode":"Kalbos kodas","longDescr":"Ilgas aprašymas URL","cssClass":"Stilių lentelės klasės","advisoryTitle":"Konsultacinė antraštė","cssStyle":"Stilius","ok":"OK","cancel":"Nutraukti","close":"Uždaryti","preview":"Peržiūrėti","resize":"Pavilkite, kad pakeistumėte dydį","generalTab":"Bendros savybės","advancedTab":"Papildomas","validateNumberFailed":"Ši reikšmė nėra skaičius.","confirmNewPage":"Visas neišsaugotas turinys bus prarastas. Ar tikrai norite įkrauti naują puslapį?","confirmCancel":"Kai kurie parametrai pasikeitė. Ar tikrai norite užverti langą?","options":"Parametrai","target":"Tikslinė nuoroda","targetNew":"Naujas langas (_blank)","targetTop":"Viršutinis langas (_top)","targetSelf":"Esamas langas (_self)","targetParent":"Paskutinis langas (_parent)","langDirLTR":"Iš kairės į dešinę (LTR)","langDirRTL":"Iš dešinės į kairę (RTL)","styles":"Stilius","cssClasses":"Stilių klasės","width":"Plotis","height":"Aukštis","align":"Lygiuoti","alignLeft":"Kairę","alignRight":"Dešinę","alignCenter":"Centrą","alignTop":"Viršūnę","alignMiddle":"Vidurį","alignBottom":"Apačią","invalidValue":"Invalid value.","invalidHeight":"Aukštis turi būti nurodytas skaičiais.","invalidWidth":"Plotis turi būti nurodytas skaičiais.","invalidCssLength":"Reikšmė nurodyta \"%1\" laukui, turi būti teigiamas skaičius su arba be tinkamo CSS matavimo vieneto (px, %, in, cm, mm, em, ex, pt arba pc).","invalidHtmlLength":"Reikšmė nurodyta \"%1\" laukui, turi būti teigiamas skaičius su arba be tinkamo HTML matavimo vieneto (px arba %).","invalidInlineStyle":"Reikšmė nurodyta vidiniame stiliuje turi būti sudaryta iš vieno šių reikšmių \"vardas : reikšmė\", atskirta kabliataškiais.","cssLengthTooltip":"Įveskite reikšmę pikseliais arba skaičiais su tinkamu CSS vienetu (px, %, in, cm, mm, em, ex, pt arba pc).","unavailable":"%1<span class=\"cke_accessibility\">, netinkamas</span>"},"about":{"copy":"Copyright &copy; $1. Visos teiss saugomos.","dlgTitle":"Apie CKEditor","help":"Patikrinkite $1 dėl pagalbos.","moreInfo":"Dėl licencijavimo apsilankykite mūsų svetainėje:","title":"Apie CKEditor","userGuide":"CKEditor Vartotojo Gidas"},"basicstyles":{"bold":"Pusjuodis","italic":"Kursyvas","strike":"Perbrauktas","subscript":"Apatinis indeksas","superscript":"Viršutinis indeksas","underline":"Pabrauktas"},"bidi":{"ltr":"Tekstas iš kairės į dešinę","rtl":"Tekstas iš dešinės į kairę"},"blockquote":{"toolbar":"Citata"},"clipboard":{"copy":"Kopijuoti","copyError":"Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti kopijavimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+C).","cut":"Iškirpti","cutError":"Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti iškirpimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+X).","paste":"Įdėti","pasteArea":"Įkelti dalį","pasteMsg":"Žemiau esančiame įvedimo lauke įdėkite tekstą, naudodami klaviatūrą (<STRONG>Ctrl/Cmd+V</STRONG>) ir paspauskite mygtuką <STRONG>OK</STRONG>.","securityMsg":"Dėl jūsų naršyklės saugumo nustatymų, redaktorius negali tiesiogiai pasiekti laikinosios atminties. Jums reikia nukopijuoti dar kartą į šį langą.","title":"Įdėti"},"colorbutton":{"auto":"Automatinis","bgColorTitle":"Fono spalva","colors":{"000":"Juoda","800000":"Kaštoninė","8B4513":"Tamsiai ruda","2F4F4F":"Pilka tamsaus šiferio","008080":"Teal","000080":"Karinis","4B0082":"Indigo","696969":"Tamsiai pilka","B22222":"Ugnies","A52A2A":"Ruda","DAA520":"Aukso","006400":"Tamsiai žalia","40E0D0":"Turquoise","0000CD":"Vidutinė mėlyna","800080":"Violetinė","808080":"Pilka","F00":"Raudona","FF8C00":"Tamsiai oranžinė","FFD700":"Auksinė","008000":"Žalia","0FF":"Žydra","00F":"Mėlyna","EE82EE":"Violetinė","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Oranžinė","FFFF00":"Geltona","00FF00":"Citrinų","AFEEEE":"Pale Turquoise","ADD8E6":"Šviesiai mėlyna","DDA0DD":"Plum","D3D3D3":"Šviesiai pilka","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Šviesiai geltona","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"Balta"},"more":"Daugiau spalvų...","panelTitle":"Spalva","textColorTitle":"Teksto spalva"},"colordialog":{"clear":"Išvalyti","highlight":"Paryškinti","options":"Spalvos nustatymai","selected":"Pasirinkta spalva","title":"Pasirinkite spalvą"},"templates":{"button":"Šablonai","emptyListMsg":"(Šablonų sąrašas tuščias)","insertOption":"Pakeisti dabartinį turinį pasirinktu šablonu","options":"Template Options","selectPromptMsg":"Pasirinkite norimą šabloną<br>(<b>Dėmesio!</b> esamas turinys bus prarastas):","title":"Turinio šablonai"},"contextmenu":{"options":"Kontekstinio meniu parametrai"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Patariamas pavadinimas","cssClassInputLabel":"Stilių klasės","edit":"Redaguoti Div","inlineStyleInputLabel":"Vidiniai stiliai","langDirLTRLabel":"Iš kairės į dešinę (LTR)","langDirLabel":"Kalbos nurodymai","langDirRTLLabel":"Iš dešinės į kairę (RTL)","languageCodeInputLabel":" Kalbos kodas","remove":"Pašalinti Div","styleSelectLabel":"Stilius","title":"Sukurti Div elementą","toolbar":"Sukurti Div elementą"},"toolbar":{"toolbarCollapse":"Apjungti įrankių juostą","toolbarExpand":"Išplėsti įrankių juostą","toolbarGroups":{"document":"Dokumentas","clipboard":"Atmintinė/Atgal","editing":"Redagavimas","forms":"Formos","basicstyles":"Pagrindiniai stiliai","paragraph":"Paragrafas","links":"Nuorodos","insert":"Įterpti","styles":"Stiliai","colors":"Spalvos","tools":"Įrankiai"},"toolbars":"Redaktoriaus įrankiai"},"elementspath":{"eleLabel":"Elemento kelias","eleTitle":"%1 elementas"},"find":{"find":"Rasti","findOptions":"Paieškos nustatymai","findWhat":"Surasti tekstą:","matchCase":"Skirti didžiąsias ir mažąsias raides","matchCyclic":"Sutampantis cikliškumas","matchWord":"Atitikti pilną žodį","notFoundMsg":"Nurodytas tekstas nerastas.","replace":"Pakeisti","replaceAll":"Pakeisti viską","replaceSuccessMsg":"%1 sutapimas(ų) buvo pakeisti.","replaceWith":"Pakeisti tekstu:","title":"Surasti ir pakeisti"},"fakeobjects":{"anchor":"Žymė","flash":"Flash animacija","hiddenfield":"Paslėptas laukas","iframe":"IFrame","unknown":"Nežinomas objektas"},"flash":{"access":"Skripto priėjimas","accessAlways":"Visada","accessNever":"Niekada","accessSameDomain":"Tas pats domenas","alignAbsBottom":"Absoliučią apačią","alignAbsMiddle":"Absoliutų vidurį","alignBaseline":"Apatinę liniją","alignTextTop":"Teksto viršūnę","bgcolor":"Fono spalva","chkFull":"Leisti per visą ekraną","chkLoop":"Ciklas","chkMenu":"Leisti Flash meniu","chkPlay":"Automatinis paleidimas","flashvars":"Flash kintamieji","hSpace":"Hor.Erdvė","properties":"Flash savybės","propertiesTab":"Nustatymai","quality":"Kokybė","qualityAutoHigh":"Automatiškai Gera","qualityAutoLow":"Automatiškai Žema","qualityBest":"Geriausia","qualityHigh":"Gera","qualityLow":"Žema","qualityMedium":"Vidutinė","scale":"Mastelis","scaleAll":"Rodyti visą","scaleFit":"Tikslus atitikimas","scaleNoBorder":"Be rėmelio","title":"Flash savybės","vSpace":"Vert.Erdvė","validateHSpace":"HSpace turi būti skaičius.","validateSrc":"Prašome įvesti nuorodos URL","validateVSpace":"VSpace turi būti skaičius.","windowMode":"Lango režimas","windowModeOpaque":"Nepermatomas","windowModeTransparent":"Permatomas","windowModeWindow":"Langas"},"font":{"fontSize":{"label":"Šrifto dydis","voiceLabel":"Šrifto dydis","panelTitle":"Šrifto dydis"},"label":"Šriftas","panelTitle":"Šriftas","voiceLabel":"Šriftas"},"forms":{"button":{"title":"Mygtuko savybės","text":"Tekstas (Reikšmė)","type":"Tipas","typeBtn":"Mygtukas","typeSbm":"Siųsti","typeRst":"Išvalyti"},"checkboxAndRadio":{"checkboxTitle":"Žymimojo langelio savybės","radioTitle":"Žymimosios akutės savybės","value":"Reikšmė","selected":"Pažymėtas"},"form":{"title":"Formos savybės","menu":"Formos savybės","action":"Veiksmas","method":"Metodas","encoding":"Kodavimas"},"hidden":{"title":"Nerodomo lauko savybės","name":"Vardas","value":"Reikšmė"},"select":{"title":"Atrankos lauko savybės","selectInfo":"Informacija","opAvail":"Galimos parinktys","value":"Reikšmė","size":"Dydis","lines":"eilučių","chkMulti":"Leisti daugeriopą atranką","opText":"Tekstas","opValue":"Reikšmė","btnAdd":"Įtraukti","btnModify":"Modifikuoti","btnUp":"Aukštyn","btnDown":"Žemyn","btnSetValue":"Laikyti pažymėta reikšme","btnDelete":"Trinti"},"textarea":{"title":"Teksto srities savybės","cols":"Ilgis","rows":"Plotis"},"textfield":{"title":"Teksto lauko savybės","name":"Vardas","value":"Reikšmė","charWidth":"Ilgis simboliais","maxChars":"Maksimalus simbolių skaičius","type":"Tipas","typeText":"Tekstas","typePass":"Slaptažodis","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"Nuoroda"}},"format":{"label":"Šrifto formatas","panelTitle":"Šrifto formatas","tag_address":"Kreipinio","tag_div":"Normalus (DIV)","tag_h1":"Antraštinis 1","tag_h2":"Antraštinis 2","tag_h3":"Antraštinis 3","tag_h4":"Antraštinis 4","tag_h5":"Antraštinis 5","tag_h6":"Antraštinis 6","tag_p":"Normalus","tag_pre":"Formuotas"},"horizontalrule":{"toolbar":"Įterpti horizontalią liniją"},"iframe":{"border":"Rodyti rėmelį","noUrl":"Nurodykite iframe nuorodą","scrolling":"Įjungti slankiklius","title":"IFrame nustatymai","toolbar":"IFrame"},"image":{"alertUrl":"Prašome įvesti vaizdo URL","alt":"Alternatyvus Tekstas","border":"Rėmelis","btnUpload":"Siųsti į serverį","button2Img":"Ar norite mygtuką paversti paprastu paveiksliuku?","hSpace":"Hor.Erdvė","img2Button":"Ar norite paveiksliuką paversti mygtuku?","infoTab":"Vaizdo informacija","linkTab":"Nuoroda","lockRatio":"Išlaikyti proporciją","menu":"Vaizdo savybės","resetSize":"Atstatyti dydį","title":"Vaizdo savybės","titleButton":"Vaizdinio mygtuko savybės","upload":"Nusiųsti","urlMissing":"Paveiksliuko nuorodos nėra.","vSpace":"Vert.Erdvė","validateBorder":"Reikšmė turi būti sveikas skaičius.","validateHSpace":"Reikšmė turi būti sveikas skaičius.","validateVSpace":"Reikšmė turi būti sveikas skaičius."},"indent":{"indent":"Padidinti įtrauką","outdent":"Sumažinti įtrauką"},"smiley":{"options":"Šypsenėlių nustatymai","title":"Įterpti veidelį","toolbar":"Veideliai"},"justify":{"block":"Lygiuoti abi puses","center":"Centruoti","left":"Lygiuoti kairę","right":"Lygiuoti dešinę"},"link":{"acccessKey":"Prieigos raktas","advanced":"Papildomas","advisoryContentType":"Konsultacinio turinio tipas","advisoryTitle":"Konsultacinė antraštė","anchor":{"toolbar":"Įterpti/modifikuoti žymę","menu":"Žymės savybės","title":"Žymės savybės","name":"Žymės vardas","errorName":"Prašome įvesti žymės vardą","remove":"Pašalinti žymę"},"anchorId":"Pagal žymės Id","anchorName":"Pagal žymės vardą","charset":"Susietų išteklių simbolių lentelė","cssClasses":"Stilių lentelės klasės","emailAddress":"El.pašto adresas","emailBody":"Žinutės turinys","emailSubject":"Žinutės tema","id":"Id","info":"Nuorodos informacija","langCode":"Teksto kryptis","langDir":"Teksto kryptis","langDirLTR":"Iš kairės į dešinę (LTR)","langDirRTL":"Iš dešinės į kairę (RTL)","menu":"Taisyti nuorodą","name":"Vardas","noAnchors":"(Šiame dokumente žymių nėra)","noEmail":"Prašome įvesti el.pašto adresą","noUrl":"Prašome įvesti nuorodos URL","other":"<kitas>","popupDependent":"Priklausomas (Netscape)","popupFeatures":"Išskleidžiamo lango savybės","popupFullScreen":"Visas ekranas (IE)","popupLeft":"Kairė pozicija","popupLocationBar":"Adreso juosta","popupMenuBar":"Meniu juosta","popupResizable":"Kintamas dydis","popupScrollBars":"Slinkties juostos","popupStatusBar":"Būsenos juosta","popupToolbar":"Mygtukų juosta","popupTop":"Viršutinė pozicija","rel":"Sąsajos","selectAnchor":"Pasirinkite žymę","styles":"Stilius","tabIndex":"Tabuliavimo indeksas","target":"Paskirties vieta","targetFrame":"<kadras>","targetFrameName":"Paskirties kadro vardas","targetPopup":"<išskleidžiamas langas>","targetPopupName":"Paskirties lango vardas","title":"Nuoroda","toAnchor":"Žymė šiame puslapyje","toEmail":"El.paštas","toUrl":"Nuoroda","toolbar":"Įterpti/taisyti nuorodą","type":"Nuorodos tipas","unlink":"Panaikinti nuorodą","upload":"Siųsti"},"list":{"bulletedlist":"Suženklintas sąrašas","numberedlist":"Numeruotas sąrašas"},"liststyle":{"armenian":"Armėniški skaitmenys","bulletedTitle":"Ženklelinio sąrašo nustatymai","circle":"Apskritimas","decimal":"Dešimtainis (1, 2, 3, t.t)","decimalLeadingZero":"Dešimtainis su nuliu priekyje (01, 02, 03, t.t)","disc":"Diskas","georgian":"Gruziniški skaitmenys (an, ban, gan, t.t)","lowerAlpha":"Mažosios Alpha (a, b, c, d, e, t.t)","lowerGreek":"Mažosios Graikų (alpha, beta, gamma, t.t)","lowerRoman":"Mažosios Romėnų (i, ii, iii, iv, v, t.t)","none":"Niekas","notset":"<nenurodytas>","numberedTitle":"Skaitmeninio sąrašo nustatymai","square":"Kvadratas","start":"Pradžia","type":"Rūšis","upperAlpha":"Didžiosios Alpha (A, B, C, D, E, t.t)","upperRoman":"Didžiosios Romėnų (I, II, III, IV, V, t.t)","validateStartNumber":"Sąrašo pradžios skaitmuo turi būti sveikas skaičius."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Išdidinti","minimize":"Sumažinti"},"newpage":{"toolbar":"Naujas puslapis"},"pagebreak":{"alt":"Puslapio skirtukas","toolbar":"Įterpti puslapių skirtuką"},"pastetext":{"button":"Įdėti kaip gryną tekstą","title":"Įdėti kaip gryną tekstą"},"pastefromword":{"confirmCleanup":"Tekstas, kurį įkeliate yra kopijuojamas iš Word. Ar norite jį išvalyti prieš įkeliant?","error":"Dėl vidinių sutrikimų, nepavyko išvalyti įkeliamo teksto","title":"Įdėti iš Word","toolbar":"Įdėti iš Word"},"preview":{"preview":"Peržiūra"},"print":{"toolbar":"Spausdinti"},"removeformat":{"toolbar":"Panaikinti formatą"},"save":{"toolbar":"Išsaugoti"},"selectall":{"toolbar":"Pažymėti viską"},"showblocks":{"toolbar":"Rodyti blokus"},"sourcearea":{"toolbar":"Šaltinis"},"specialchar":{"options":"Specialaus simbolio nustatymai","title":"Pasirinkite specialų simbolį","toolbar":"Įterpti specialų simbolį"},"scayt":{"about":"Apie SCAYT","aboutTab":"Apie","addWord":"Pridėti žodį","allCaps":"Ignoruoti visas didžiąsias raides","dic_create":"Sukurti","dic_delete":"Ištrinti","dic_field_name":"Žodyno pavadinimas","dic_info":"Paprastai žodynas yra saugojamas sausainėliuose (cookies), kurių dydis, bet kokiu atveju, yra apribotas. Esant sausainėlių apimties pervišiui, viskas bus saugoma serveryje. Jei norite iš kart viską saugoti serveryje, turite sugalvoti žodynui pavadinimą. Jei jau turite žodyną, įrašykite pavadinimą ir nuspauskite Atstatyti mygtuką.","dic_rename":"Pervadinti","dic_restore":"Atstatyti","dictionariesTab":"Žodynai","disable":"Išjungti SCAYT","emptyDic":"Žodyno vardas neturėtų būti tuščias.","enable":"Įjungti SCAYT","ignore":"Ignoruoti","ignoreAll":"Ignoruoti viską","ignoreDomainNames":"Ignoruoti domenų vardus","langs":"Kalbos","languagesTab":"Kalbos","mixedCase":"Ignoruoti maišyto dydžio raides","mixedWithDigits":"Ignoruoti raides su skaičiais","moreSuggestions":"Daugiau patarimų","opera_title":"Nepalaikoma naršyklėje Opera","options":"Parametrai","optionsTab":"Parametrai","title":"Tikrinti klaidas kai rašoma","toggle":"Perjungti SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stilius","panelTitle":"Stilių formatavimas","panelTitle1":"Blokų stiliai","panelTitle2":"Vidiniai stiliai","panelTitle3":"Objektų stiliai"},"table":{"border":"Rėmelio dydis","caption":"Antraštė","cell":{"menu":"Langelis","insertBefore":"Įterpti langelį prieš","insertAfter":"Įterpti langelį po","deleteCell":"Šalinti langelius","merge":"Sujungti langelius","mergeRight":"Sujungti su dešine","mergeDown":"Sujungti su apačia","splitHorizontal":"Skaidyti langelį horizontaliai","splitVertical":"Skaidyti langelį vertikaliai","title":"Cell nustatymai","cellType":"Cell rūšis","rowSpan":"Eilučių Span","colSpan":"Stulpelių Span","wordWrap":"Sutraukti raides","hAlign":"Horizontalus lygiavimas","vAlign":"Vertikalus lygiavimas","alignBaseline":"Apatinė linija","bgColor":"Fono spalva","borderColor":"Rėmelio spalva","data":"Data","header":"Antraštė","yes":"Taip","no":"Ne","invalidWidth":"Reikšmė turi būti skaičius.","invalidHeight":"Reikšmė turi būti skaičius.","invalidRowSpan":"Reikšmė turi būti skaičius.","invalidColSpan":"Reikšmė turi būti skaičius.","chooseColor":"Pasirinkite"},"cellPad":"Tarpas nuo langelio rėmo iki teksto","cellSpace":"Tarpas tarp langelių","column":{"menu":"Stulpelis","insertBefore":"Įterpti stulpelį prieš","insertAfter":"Įterpti stulpelį po","deleteColumn":"Šalinti stulpelius"},"columns":"Stulpeliai","deleteTable":"Šalinti lentelę","headers":"Antraštės","headersBoth":"Abu","headersColumn":"Pirmas stulpelis","headersNone":"Nėra","headersRow":"Pirma eilutė","invalidBorder":"Reikšmė turi būti nurodyta skaičiumi.","invalidCellPadding":"Reikšmė turi būti nurodyta skaičiumi.","invalidCellSpacing":"Reikšmė turi būti nurodyta skaičiumi.","invalidCols":"Skaičius turi būti didesnis nei 0.","invalidHeight":"Reikšmė turi būti nurodyta skaičiumi.","invalidRows":"Skaičius turi būti didesnis nei 0.","invalidWidth":"Reikšmė turi būti nurodyta skaičiumi.","menu":"Lentelės savybės","row":{"menu":"Eilutė","insertBefore":"Įterpti eilutę prieš","insertAfter":"Įterpti eilutę po","deleteRow":"Šalinti eilutes"},"rows":"Eilutės","summary":"Santrauka","title":"Lentelės savybės","toolbar":"Lentelė","widthPc":"procentais","widthPx":"taškais","widthUnit":"pločio vienetas"},"undo":{"redo":"Atstatyti","undo":"Atšaukti"},"wsc":{"btnIgnore":"Ignoruoti","btnIgnoreAll":"Ignoruoti visus","btnReplace":"Pakeisti","btnReplaceAll":"Pakeisti visus","btnUndo":"Atšaukti","changeTo":"Pakeisti į","errorLoading":"Klaida įkraunant servisą: %s.","ieSpellDownload":"Rašybos tikrinimas neinstaliuotas. Ar Jūs norite jį dabar atsisiųsti?","manyChanges":"Rašybos tikrinimas baigtas: Pakeista %1 žodžių","noChanges":"Rašybos tikrinimas baigtas: Nėra pakeistų žodžių","noMispell":"Rašybos tikrinimas baigtas: Nerasta rašybos klaidų","noSuggestions":"- Nėra pasiūlymų -","notAvailable":"Atleiskite, šiuo metu servisas neprieinamas.","notInDic":"Žodyne nerastas","oneChange":"Rašybos tikrinimas baigtas: Vienas žodis pakeistas","progress":"Vyksta rašybos tikrinimas...","title":"Tikrinti klaidas","toolbar":"Rašybos tikrinimas"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/lv.js b/htmltest/sites/all/libraries/ckeditor-version/lang/lv.js
new file mode 100644
index 00000000..40aaec2e
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/lv.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['lv']={"editor":"Bagātinātā teksta redaktors","common":{"editorHelp":"Palīdzībai, nospiediet ALT 0 ","browseServer":"Skatīt servera saturu","url":"URL","protocol":"Protokols","upload":"Augšupielādēt","uploadSubmit":"Nosūtīt serverim","image":"Attēls","flash":"Flash","form":"Forma","checkbox":"Atzīmēšanas kastīte","radio":"Izvēles poga","textField":"Teksta rinda","textarea":"Teksta laukums","hiddenField":"Paslēpta teksta rinda","button":"Poga","select":"Iezīmēšanas lauks","imageButton":"Attēlpoga","notSet":"<nav iestatīts>","id":"Id","name":"Nosaukums","langDir":"Valodas lasīšanas virziens","langDirLtr":"No kreisās uz labo (LTR)","langDirRtl":"No labās uz kreiso (RTL)","langCode":"Valodas kods","longDescr":"Gara apraksta Hipersaite","cssClass":"Stilu saraksta klases","advisoryTitle":"Konsultatīvs virsraksts","cssStyle":"Stils","ok":"Darīts!","cancel":"Atcelt","close":"Aizvērt","preview":"Priekšskatījums","resize":"Mērogot","generalTab":"Vispārīgi","advancedTab":"Izvērstais","validateNumberFailed":"Šī vērtība nav skaitlis","confirmNewPage":"Jebkuras nesaglabātās izmaiņas tiks zaudētas. Vai tiešām vēlaties atvērt jaunu lapu?","confirmCancel":"Daži no uzstādījumiem ir mainīti. Vai tiešām vēlaties aizvērt šo dialogu?","options":"Uzstādījumi","target":"Mērķis","targetNew":"Jauns logs (_blank)","targetTop":"Virsējais logs (_top)","targetSelf":"Tas pats logs (_self)","targetParent":"Avota logs (_parent)","langDirLTR":"Kreisais uz Labo (LTR)","langDirRTL":"Labais uz Kreiso (RTL)","styles":"Stils","cssClasses":"Stilu klases","width":"Platums","height":"Augstums","align":"Nolīdzināt","alignLeft":"Pa kreisi","alignRight":"Pa labi","alignCenter":"Centrēti","alignTop":"Augšā","alignMiddle":"Vertikāli centrēts","alignBottom":"Apakšā","invalidValue":"Nekorekta vērtība","invalidHeight":"Augstumam jābūt skaitlim.","invalidWidth":"Platumam jābūt skaitlim","invalidCssLength":"Laukam \"%1\" norādītajai vērtībai jābūt pozitīvam skaitlim ar vai bez korektām CSS mērvienībām (px, %, in, cm, mm, em, ex, pt, vai pc).","invalidHtmlLength":"Laukam \"%1\" norādītajai vērtībai jābūt pozitīvam skaitlim ar vai bez korektām HTML mērvienībām (px vai %).","invalidInlineStyle":"Iekļautajā stilā norādītajai vērtībai jāsastāv no viena vai vairākiem pāriem pēc forma'ta \"nosaukums: vērtība\", atdalītiem ar semikolu.","cssLengthTooltip":"Ievadiet vērtību pikseļos vai skaitli ar derīgu CSS mērvienību (px, %, in, cm, mm, em, ex, pt, vai pc).","unavailable":"%1<span class=\"cke_accessibility\">, nav pieejams</span>"},"about":{"copy":"Kopēšanas tiesības &copy; $1. Visas tiesības rezervētas.","dlgTitle":"Par CKEditor","help":"Pārbaudiet $1 palīdzībai.","moreInfo":"Informācijai par licenzēšanu apmeklējiet mūsu mājas lapu:","title":"Par CKEditor","userGuide":"CKEditor Lietotāja pamācība"},"basicstyles":{"bold":"Treknināts","italic":"Kursīvs","strike":"Pārsvītrots","subscript":"Apakšrakstā","superscript":"Augšrakstā","underline":"Pasvītrots"},"bidi":{"ltr":"Teksta virziens no kreisās uz labo","rtl":"Teksta virziens no labās uz kreiso"},"blockquote":{"toolbar":"Bloka citāts"},"clipboard":{"copy":"Kopēt","copyError":"Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj redaktoram automātiski veikt kopēšanas darbību.  Lūdzu, izmantojiet (Ctrl/Cmd+C), lai veiktu šo darbību.","cut":"Izgriezt","cutError":"Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj redaktoram automātiski veikt izgriezšanas darbību.  Lūdzu, izmantojiet (Ctrl/Cmd+X), lai veiktu šo darbību.","paste":"Ielīmēt","pasteArea":"Ielīmēšanas zona","pasteMsg":"Lūdzu, ievietojiet tekstu šajā laukumā, izmantojot klaviatūru (<STRONG>Ctrl/Cmd+V</STRONG>) un apstipriniet ar <STRONG>Darīts!</STRONG>.","securityMsg":"Jūsu pārlūka drošības uzstādījumu dēļ, nav iespējams tieši piekļūt jūsu starpliktuvei. Jums jāielīmē atkārtoti šajā logā.","title":"Ievietot"},"colorbutton":{"auto":"Automātiska","bgColorTitle":"Fona krāsa","colors":{"000":"Melns","800000":"Sarkanbrūns","8B4513":"Sedlu brūns","2F4F4F":"Tumšas tāfeles pelēks","008080":"Zili-zaļš","000080":"Jūras","4B0082":"Indigo","696969":"Tumši pelēks","B22222":"Ķieģeļsarkans","A52A2A":"Brūns","DAA520":"Zelta","006400":"Tumši zaļš","40E0D0":"Tirkīzs","0000CD":"Vidēji zils","800080":"Purpurs","808080":"Pelēks","F00":"Sarkans","FF8C00":"Tumši oranžs","FFD700":"Zelta","008000":"Zaļš","0FF":"Tumšzils","00F":"Zils","EE82EE":"Violets","A9A9A9":"Pelēks","FFA07A":"Gaiši laškrāsas","FFA500":"Oranžs","FFFF00":"Dzeltens","00FF00":"Laima","AFEEEE":"Gaiši tirkīza","ADD8E6":"Gaiši zils","DDA0DD":"Plūmju","D3D3D3":"Gaiši pelēks","FFF0F5":"Lavandas sārts","FAEBD7":"Antīki balts","FFFFE0":"Gaiši dzeltens","F0FFF0":"Meduspile","F0FFFF":"Debesszils","F0F8FF":"Alises zils","E6E6FA":"Lavanda","FFF":"Balts"},"more":"Plašāka palete...","panelTitle":"Krāsa","textColorTitle":"Teksta krāsa"},"colordialog":{"clear":"Notīrīt","highlight":"Paraugs","options":"Krāsas uzstādījumi","selected":"Izvēlētā krāsa","title":"Izvēlies krāsu"},"templates":{"button":"Sagataves","emptyListMsg":"(Nav norādītas sagataves)","insertOption":"Aizvietot pašreizējo saturu","options":"Sagataves uzstādījumi","selectPromptMsg":"Lūdzu, norādiet sagatavi, ko atvērt editorā<br>(patreizējie dati tiks zaudēti):","title":"Satura sagataves"},"contextmenu":{"options":"Uznirstošās izvēlnes uzstādījumi"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Konsultatīvs virsraksts","cssClassInputLabel":"Stilu klases","edit":"Labot Div","inlineStyleInputLabel":"Iekļautais stils","langDirLTRLabel":"Kreisais uz Labo (LTR)","langDirLabel":"Valodas virziens","langDirRTLLabel":"Labais uz kreiso (RTL)","languageCodeInputLabel":"Valodas kods","remove":"Noņemt Div","styleSelectLabel":"Stils","title":"Izveidot div konteineri","toolbar":"Izveidot div konteineri"},"toolbar":{"toolbarCollapse":"Aizvērt rīkjoslu","toolbarExpand":"Atvērt rīkjoslu","toolbarGroups":{"document":"Dokuments","clipboard":"Starpliktuve/Atcelt","editing":"Labošana","forms":"Formas","basicstyles":"Pamata stili","paragraph":"Paragrāfs","links":"Saites","insert":"Ievietot","styles":"Stili","colors":"Krāsas","tools":"Rīki"},"toolbars":"Redaktora rīkjoslas"},"elementspath":{"eleLabel":"Elementa ceļš","eleTitle":"%1 elements"},"find":{"find":"Meklēt","findOptions":"Meklēt uzstādījumi","findWhat":"Meklēt:","matchCase":"Reģistrjūtīgs","matchCyclic":"Sakrist cikliski","matchWord":"Jāsakrīt pilnībā","notFoundMsg":"Norādītā frāze netika atrasta.","replace":"Nomainīt","replaceAll":"Aizvietot visu","replaceSuccessMsg":"%1 gadījums(i) aizvietoti","replaceWith":"Nomainīt uz:","title":"Meklēt un aizvietot"},"fakeobjects":{"anchor":"Iezīme","flash":"Flash animācija","hiddenfield":"Slēpts lauks","iframe":"Iframe","unknown":"Nezināms objekts"},"flash":{"access":"Skripta pieeja","accessAlways":"Vienmēr","accessNever":"Nekad","accessSameDomain":"Tas pats domēns","alignAbsBottom":"Absolūti apakšā","alignAbsMiddle":"Absolūti vertikāli centrēts","alignBaseline":"Pamatrindā","alignTextTop":"Teksta augšā","bgcolor":"Fona krāsa","chkFull":"Pilnekrāns","chkLoop":"Nepārtraukti","chkMenu":"Atļaut Flash izvēlni","chkPlay":"Automātiska atskaņošana","flashvars":"Flash mainīgie","hSpace":"Horizontālā telpa","properties":"Flash īpašības","propertiesTab":"Uzstādījumi","quality":"Kvalitāte","qualityAutoHigh":"Automātiski Augsta","qualityAutoLow":"Automātiski Zema","qualityBest":"Labākā","qualityHigh":"Augsta","qualityLow":"Zema","qualityMedium":"Vidēja","scale":"Mainīt izmēru","scaleAll":"Rādīt visu","scaleFit":"Precīzs izmērs","scaleNoBorder":"Bez rāmja","title":"Flash īpašības","vSpace":"Vertikālā telpa","validateHSpace":"Hspace jābūt skaitlim","validateSrc":"Lūdzu norādi hipersaiti","validateVSpace":"Vspace jābūt skaitlim","windowMode":"Loga režīms","windowModeOpaque":"Necaurspīdīgs","windowModeTransparent":"Caurspīdīgs","windowModeWindow":"Logs"},"font":{"fontSize":{"label":"Izmērs","voiceLabel":"Fonta izmeŗs","panelTitle":"Izmērs"},"label":"Šrifts","panelTitle":"Šrifts","voiceLabel":"Fonts"},"forms":{"button":{"title":"Pogas īpašības","text":"Teksts (vērtība)","type":"Tips","typeBtn":"Poga","typeSbm":"Nosūtīt","typeRst":"Atcelt"},"checkboxAndRadio":{"checkboxTitle":"Atzīmēšanas kastītes īpašības","radioTitle":"Izvēles poga īpašības","value":"Vērtība","selected":"Iezīmēts"},"form":{"title":"Formas īpašības","menu":"Formas īpašības","action":"Darbība","method":"Metode","encoding":"Kodējums"},"hidden":{"title":"Paslēptās teksta rindas īpašības","name":"Nosaukums","value":"Vērtība"},"select":{"title":"Iezīmēšanas lauka īpašības","selectInfo":"Informācija","opAvail":"Pieejamās iespējas","value":"Vērtība","size":"Izmērs","lines":"rindas","chkMulti":"Atļaut vairākus iezīmējumus","opText":"Teksts","opValue":"Vērtība","btnAdd":"Pievienot","btnModify":"Veikt izmaiņas","btnUp":"Augšup","btnDown":"Lejup","btnSetValue":"Noteikt kā iezīmēto vērtību","btnDelete":"Dzēst"},"textarea":{"title":"Teksta laukuma īpašības","cols":"Kolonnas","rows":"Rindas"},"textfield":{"title":"Teksta rindas  īpašības","name":"Nosaukums","value":"Vērtība","charWidth":"Simbolu platums","maxChars":"Simbolu maksimālais daudzums","type":"Tips","typeText":"Teksts","typePass":"Parole","typeEmail":"Epasts","typeSearch":"Meklēt","typeTel":"Tālruņa numurs","typeUrl":"Adrese"}},"format":{"label":"Formāts","panelTitle":"Formāts","tag_address":"Adrese","tag_div":"Rindkopa (DIV)","tag_h1":"Virsraksts 1","tag_h2":"Virsraksts 2","tag_h3":"Virsraksts 3","tag_h4":"Virsraksts 4","tag_h5":"Virsraksts 5","tag_h6":"Virsraksts 6","tag_p":"Normāls teksts","tag_pre":"Formatēts teksts"},"horizontalrule":{"toolbar":"Ievietot horizontālu Atdalītājsvītru"},"iframe":{"border":"Rādīt rāmi","noUrl":"Norādiet iframe adresi","scrolling":"Atļaut ritjoslas","title":"IFrame uzstādījumi","toolbar":"IFrame"},"image":{"alertUrl":"Lūdzu norādīt attēla hipersaiti","alt":"Alternatīvais teksts","border":"Rāmis","btnUpload":"Nosūtīt serverim","button2Img":"Vai vēlaties pārveidot izvēlēto attēla pogu uz attēla?","hSpace":"Horizontālā telpa","img2Button":"Vai vēlaties pārveidot izvēlēto attēlu uz attēla pogas?","infoTab":"Informācija par attēlu","linkTab":"Hipersaite","lockRatio":"Nemainīga Augstuma/Platuma attiecība","menu":"Attēla īpašības","resetSize":"Atjaunot sākotnējo izmēru","title":"Attēla īpašības","titleButton":"Attēlpogas īpašības","upload":"Augšupielādēt","urlMissing":"Trūkst attēla atrašanās adrese.","vSpace":"Vertikālā telpa","validateBorder":"Apmalei jābūt veselam skaitlim","validateHSpace":"HSpace jābūt veselam skaitlim","validateVSpace":"VSpace jābūt veselam skaitlim"},"indent":{"indent":"Palielināt atkāpi","outdent":"Samazināt atkāpi"},"smiley":{"options":"Smaidiņu uzstādījumi","title":"Ievietot smaidiņu","toolbar":"Smaidiņi"},"justify":{"block":"Izlīdzināt malas","center":"Izlīdzināt pret centru","left":"Izlīdzināt pa kreisi","right":"Izlīdzināt pa labi"},"link":{"acccessKey":"Pieejas taustiņš","advanced":"Izvērstais","advisoryContentType":"Konsultatīvs satura tips","advisoryTitle":"Konsultatīvs virsraksts","anchor":{"toolbar":"Ievietot/Labot iezīmi","menu":"Labot iezīmi","title":"Iezīmes uzstādījumi","name":"Iezīmes nosaukums","errorName":"Lūdzu norādiet iezīmes nosaukumu","remove":"Noņemt iezīmi"},"anchorId":"Pēc elementa ID","anchorName":"Pēc iezīmes nosaukuma","charset":"Pievienotā resursa kodējums","cssClasses":"Stilu saraksta klases","emailAddress":"E-pasta adrese","emailBody":"Ziņas saturs","emailSubject":"Ziņas tēma","id":"ID","info":"Hipersaites informācija","langCode":"Valodas kods","langDir":"Valodas lasīšanas virziens","langDirLTR":"No kreisās uz labo (LTR)","langDirRTL":"No labās uz kreiso (RTL)","menu":"Labot hipersaiti","name":"Nosaukums","noAnchors":"(Šajā dokumentā nav iezīmju)","noEmail":"Lūdzu norādi e-pasta adresi","noUrl":"Lūdzu norādi hipersaiti","other":"<cits>","popupDependent":"Atkarīgs (Netscape)","popupFeatures":"Uznirstošā loga nosaukums īpašības","popupFullScreen":"Pilnā ekrānā (IE)","popupLeft":"Kreisā koordināte","popupLocationBar":"Atrašanās vietas josla","popupMenuBar":"Izvēlnes josla","popupResizable":"Mērogojams","popupScrollBars":"Ritjoslas","popupStatusBar":"Statusa josla","popupToolbar":"Rīku josla","popupTop":"Augšējā koordināte","rel":"Relācija","selectAnchor":"Izvēlēties iezīmi","styles":"Stils","tabIndex":"Ciļņu indekss","target":"Mērķis","targetFrame":"<ietvars>","targetFrameName":"Mērķa ietvara nosaukums","targetPopup":"<uznirstošā logā>","targetPopupName":"Uznirstošā loga nosaukums","title":"Hipersaite","toAnchor":"Iezīme šajā lapā","toEmail":"E-pasts","toUrl":"Adrese","toolbar":"Ievietot/Labot hipersaiti","type":"Hipersaites tips","unlink":"Noņemt hipersaiti","upload":"Augšupielādēt"},"list":{"bulletedlist":"Pievienot/Noņemt vienkāršu sarakstu","numberedlist":"Numurēts saraksts"},"liststyle":{"armenian":"Armēņu skaitļi","bulletedTitle":"Vienkārša saraksta uzstādījumi","circle":"Aplis","decimal":"Decimālie (1, 2, 3, utt)","decimalLeadingZero":"Decimālie ar nulli (01, 02, 03, utt)","disc":"Disks","georgian":"Gruzīņu skaitļi (an, ban, gan, utt)","lowerAlpha":"Mazie alfabēta (a, b, c, d, e, utt)","lowerGreek":"Mazie grieķu (alfa, beta, gamma, utt)","lowerRoman":"Mazie romāņu (i, ii, iii, iv, v, utt)","none":"Nekas","notset":"<nav norādīts>","numberedTitle":"Numurēta saraksta uzstādījumi","square":"Kvadrāts","start":"Sākt","type":"Tips","upperAlpha":"Lielie alfabēta (A, B, C, D, E, utt)","upperRoman":"Lielie romāņu (I, II, III, IV, V, utt)","validateStartNumber":"Saraksta sākuma numuram jābūt veselam skaitlim"},"magicline":{"title":"Ievietot šeit rindkopu"},"maximize":{"maximize":"Maksimizēt","minimize":"Minimizēt"},"newpage":{"toolbar":"Jauna lapa"},"pagebreak":{"alt":"Lapas pārnesums","toolbar":"Ievietot lapas pārtraukumu drukai"},"pastetext":{"button":"Ievietot kā vienkāršu tekstu","title":"Ievietot kā vienkāršu tekstu"},"pastefromword":{"confirmCleanup":"Teksts, kuru vēlaties ielīmēt, izskatās ir nokopēts no Word. Vai vēlaties to iztīrīt pirms ielīmēšanas?","error":"Iekšējas kļūdas dēļ, neizdevās iztīrīt ielīmētos datus.","title":"Ievietot no Worda","toolbar":"Ievietot no Worda"},"preview":{"preview":"Priekšskatīt"},"print":{"toolbar":"Drukāt"},"removeformat":{"toolbar":"Noņemt stilus"},"save":{"toolbar":"Saglabāt"},"selectall":{"toolbar":"Iezīmēt visu"},"showblocks":{"toolbar":"Parādīt blokus"},"sourcearea":{"toolbar":"HTML kods"},"specialchar":{"options":"Speciālo simbolu uzstādījumi","title":"Ievietot īpašu simbolu","toolbar":"Ievietot speciālo simbolu"},"scayt":{"about":"Par SCAYT","aboutTab":"Par","addWord":"Pievienot vārdu","allCaps":"Ignorēt vārdus ar lielajiem burtiem","dic_create":"Izveidot","dic_delete":"Dzēst","dic_field_name":"Vārdnīcas nosaukums","dic_info":"Sākumā lietotāja vārdnīca tiek glabāta Cookie. Diemžēl, Cookie ir ierobežots izmērs. Kad vārdnīca sasniegs izmēru, ka to vairs nevar glabāt Cookie, tā tiks noglabāta uz servera. Lai saglabātu personīgo vārdnīcu uz jūsu servera, jums jānorāda tās nosaukums. Ja jūs jau esiet noglabājuši vārdnīcu, lūdzu ierakstiet tās nosaukum un nospiediet Atjaunot pogu.","dic_rename":"Pārsaukt","dic_restore":"Atjaunot","dictionariesTab":"Vārdnīcas","disable":"Atslēgt SCAYT","emptyDic":"Vārdnīcas nosaukums nevar būt tukšs.","enable":"Ieslēgt SCAYT","ignore":"Ignorēt","ignoreAll":"Ignorēt visu","ignoreDomainNames":"Ignorēt domēnu nosaukumus","langs":"Valodas","languagesTab":"Valodas","mixedCase":"Ignorēt vārdus ar jauktu reģistru burtiem","mixedWithDigits":"Ignorēt vārdus ar skaitļiem","moreSuggestions":"Vairāk ieteikumi","opera_title":"Opera neatbalsta","options":"Uzstādījumi","optionsTab":"Uzstādījumi","title":"Pārbaudīt gramatiku rakstot","toggle":"Pārslēgt SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stils","panelTitle":"Formatēšanas stili","panelTitle1":"Bloka stili","panelTitle2":"iekļautie stili","panelTitle3":"Objekta stili"},"table":{"border":"Rāmja izmērs","caption":"Leģenda","cell":{"menu":"Šūna","insertBefore":"Pievienot šūnu pirms","insertAfter":"Pievienot šūnu pēc","deleteCell":"Dzēst rūtiņas","merge":"Apvienot rūtiņas","mergeRight":"Apvieno pa labi","mergeDown":"Apvienot uz leju","splitHorizontal":"Sadalīt šūnu horizontāli","splitVertical":"Sadalīt šūnu vertikāli","title":"Šūnas uzstādījumi","cellType":"Šūnas tips","rowSpan":"Apvienotas rindas","colSpan":"Apvienotas kolonas","wordWrap":"Vārdu pārnese","hAlign":"Horizontālais novietojums","vAlign":"Vertikālais novietojums","alignBaseline":"Pamatrinda","bgColor":"Fona krāsa","borderColor":"Rāmja krāsa","data":"Dati","header":"Virsraksts","yes":"Jā","no":"Nē","invalidWidth":"Šūnas platumam jābūt skaitlim","invalidHeight":"Šūnas augstumam jābūt skaitlim","invalidRowSpan":"Apvienojamo rindu skaitam jābūt veselam skaitlim","invalidColSpan":"Apvienojamo kolonu skaitam jābūt veselam skaitlim","chooseColor":"Izvēlēties"},"cellPad":"Rūtiņu nobīde","cellSpace":"Rūtiņu atstatums","column":{"menu":"Kolonna","insertBefore":"Ievietot kolonu pirms","insertAfter":"Ievieto kolonu pēc","deleteColumn":"Dzēst kolonnas"},"columns":"Kolonnas","deleteTable":"Dzēst tabulu","headers":"Virsraksti","headersBoth":"Abi","headersColumn":"Pirmā kolona","headersNone":"Nekas","headersRow":"Pirmā rinda","invalidBorder":"Rāmju izmēram jābūt skaitlim","invalidCellPadding":"Šūnu atkāpēm jābūt pozitīvam skaitlim","invalidCellSpacing":"Šūnu atstarpēm jābūt pozitīvam skaitlim","invalidCols":"Kolonu skaitam jābūt lielākam par 0","invalidHeight":"Tabulas augstumam jābūt skaitlim","invalidRows":"Rindu skaitam jābūt lielākam par 0","invalidWidth":"Tabulas platumam jābūt skaitlim","menu":"Tabulas īpašības","row":{"menu":"Rinda","insertBefore":"Ievietot rindu pirms","insertAfter":"Ievietot rindu pēc","deleteRow":"Dzēst rindas"},"rows":"Rindas","summary":"Anotācija","title":"Tabulas īpašības","toolbar":"Tabula","widthPc":"procentuāli","widthPx":"pikseļos","widthUnit":"platuma mērvienība"},"undo":{"redo":"Atkārtot","undo":"Atcelt"},"wsc":{"btnIgnore":"Ignorēt","btnIgnoreAll":"Ignorēt visu","btnReplace":"Aizvietot","btnReplaceAll":"Aizvietot visu","btnUndo":"Atcelt","changeTo":"Nomainīt uz","errorLoading":"Kļūda ielādējot aplikācijas servisa adresi: %s.","ieSpellDownload":"Pareizrakstības pārbaudītājs nav pievienots. Vai vēlaties to lejupielādēt tagad?","manyChanges":"Pareizrakstības pārbaude pabeigta: %1 vārdi tika mainīti","noChanges":"Pareizrakstības pārbaude pabeigta: nekas netika labots","noMispell":"Pareizrakstības pārbaude pabeigta: kļūdas netika atrastas","noSuggestions":"- Nav ieteikumu -","notAvailable":"Atvainojiet, bet serviss šobrīd nav pieejams.","notInDic":"Netika atrasts vārdnīcā","oneChange":"Pareizrakstības pārbaude pabeigta: 1 vārds izmainīts","progress":"Notiek pareizrakstības pārbaude...","title":"Pārbaudīt gramatiku","toolbar":"Pareizrakstības pārbaude"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/mk.js b/htmltest/sites/all/libraries/ckeditor-version/lang/mk.js
new file mode 100644
index 00000000..790b9049
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/mk.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['mk']={"editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"Општо","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Alignment","alignLeft":"Left","alignRight":"Right","alignCenter":"Center","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"colorbutton":{"auto":"Automatic","bgColorTitle":"Background Color","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"More Colors...","panelTitle":"Colors","textColorTitle":"Text Color"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"Templates","emptyListMsg":"(No templates defined)","insertOption":"Replace actual contents","options":"Template Options","selectPromptMsg":"Please select the template to open in the editor","title":"Content Templates"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Left to Right (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Right to Left (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"Find","findOptions":"Find Options","findWhat":"Find what:","matchCase":"Match case","matchCyclic":"Match cyclic","matchWord":"Match whole word","notFoundMsg":"The specified text was not found.","replace":"Replace","replaceAll":"Replace All","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Replace with:","title":"Find and Replace"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"Abs Bottom","alignAbsMiddle":"Abs Middle","alignBaseline":"Baseline","alignTextTop":"Text Top","bgcolor":"Background color","chkFull":"Allow Fullscreen","chkLoop":"Loop","chkMenu":"Enable Flash Menu","chkPlay":"Auto Play","flashvars":"Variables for Flash","hSpace":"HSpace","properties":"Flash Properties","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"Scale","scaleAll":"Show all","scaleFit":"Exact Fit","scaleNoBorder":"No Border","title":"Flash Properties","vSpace":"VSpace","validateHSpace":"HSpace must be a number.","validateSrc":"URL must not be empty.","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Size","voiceLabel":"Font Size","panelTitle":"Font Size"},"label":"Font","panelTitle":"Font Name","voiceLabel":"Font"},"forms":{"button":{"title":"Button Properties","text":"Text (Value)","type":"Type","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"Checkbox Properties","radioTitle":"Radio Button Properties","value":"Value","selected":"Selected"},"form":{"title":"Form Properties","menu":"Form Properties","action":"Action","method":"Method","encoding":"Encoding"},"hidden":{"title":"Hidden Field Properties","name":"Name","value":"Value"},"select":{"title":"Selection Field Properties","selectInfo":"Select Info","opAvail":"Available Options","value":"Value","size":"Size","lines":"lines","chkMulti":"Allow multiple selections","opText":"Text","opValue":"Value","btnAdd":"Add","btnModify":"Modify","btnUp":"Up","btnDown":"Down","btnSetValue":"Set as selected value","btnDelete":"Delete"},"textarea":{"title":"Textarea Properties","cols":"Columns","rows":"Rows"},"textfield":{"title":"Text Field Properties","name":"Name","value":"Value","charWidth":"Character Width","maxChars":"Maximum Characters","type":"Type","typeText":"Text","typePass":"Password","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"smiley":{"options":"Smiley Options","title":"Insert a Smiley","toolbar":"Smiley"},"justify":{"block":"Justify","center":"Center","left":"Align Left","right":"Align Right"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"newpage":{"toolbar":"New Page"},"pagebreak":{"alt":"Page Break","toolbar":"Insert Page Break for Printing"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"preview":{"preview":"Preview"},"print":{"toolbar":"Print"},"removeformat":{"toolbar":"Remove Format"},"save":{"toolbar":"Save"},"selectall":{"toolbar":"Select All"},"showblocks":{"toolbar":"Show Blocks"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/mn.js b/htmltest/sites/all/libraries/ckeditor-version/lang/mn.js
new file mode 100644
index 00000000..84219600
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/mn.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['mn']={"editor":"Хэлбэрт бичвэр боловсруулагч","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Үйлчлэгч тооцоолуур (сервэр)-ийг үзэх","url":"цахим хуудасны хаяг (URL)","protocol":"Протокол","upload":"Илгээж ачаалах","uploadSubmit":"Үүнийг үйлчлэгч тооцоолуур (сервер) лүү илгээх","image":"Зураг","flash":"Флаш хөдөлгөөнтэй зураг","form":"Маягт","checkbox":"Тэмдэглээний нүд","radio":"Радио товчлуур","textField":"Бичвэрийн талбар","textarea":"Бичвэрийн зай","hiddenField":"Далд талбар","button":"Товчлуур","select":"Сонголтын талбар","imageButton":"Зургий товчуур","notSet":"<тохируулаагүй>","id":"Id (техникийн нэр)","name":"Нэр","langDir":"Хэлний чиглэл","langDirLtr":"Зүүнээс баруун (LTR)","langDirRtl":"Баруунаас зүүн (RTL)","langCode":"Хэлний код","longDescr":"Урт тайлбарын вэб хаяг","cssClass":"Хэлбэрийн хуудасны ангиуд","advisoryTitle":"Зөвлөх гарчиг","cssStyle":"Загвар","ok":"За","cancel":"Болих","close":"Хаах","preview":"Урьдчилан харах","resize":"Resize","generalTab":"Ерөнхий","advancedTab":"Гүнзгий","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Сонголт","target":"Бай","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Зүүн талаас баруун тийшээ (LTR)","langDirRTL":"Баруун талаас зүүн тийшээ (RTL)","styles":"Загвар","cssClasses":"Хэлбэрийн хуудасны ангиуд","width":"Өргөн","height":"Өндөр","align":"Эгнээ","alignLeft":"Зүүн","alignRight":"Баруун","alignCenter":"Төвд","alignTop":"Дээд талд","alignMiddle":"Дунд","alignBottom":"Доод талд","invalidValue":"Invalid value.","invalidHeight":"Өндөр нь тоо байх ёстой.","invalidWidth":"Өргөн нь тоо байх ёстой.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Тод бүдүүн","italic":"Налуу","strike":"Дундуур нь зураастай болгох","subscript":"Суурь болгох","superscript":"Зэрэг болгох","underline":"Доогуур нь зураастай болгох"},"bidi":{"ltr":"Зүүнээс баруун тийш бичлэг","rtl":"Баруунаас зүүн тийш бичлэг"},"blockquote":{"toolbar":"Ишлэл хэсэг"},"clipboard":{"copy":"Хуулах","copyError":"Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хуулах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+C) товчны хослолыг ашиглана уу.","cut":"Хайчлах","cutError":"Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хайчлах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+X) товчны хослолыг ашиглана уу.","paste":"Буулгах","pasteArea":"Paste Area","pasteMsg":"(<strong>Ctrl/Cmd+V</strong>) товчийг ашиглан paste хийнэ үү. Мөн <strong>OK</strong> дар.","securityMsg":"Таны үзүүлэгч/browser/-н хамгаалалтын тохиргооноос болоод editor clipboard өгөгдөлрүү шууд хандах боломжгүй. Энэ цонход дахин paste хийхийг оролд.","title":"Буулгах"},"colorbutton":{"auto":"Автоматаар","bgColorTitle":"Дэвсгэр өнгө","colors":{"000":"Хар","800000":"Хүрэн","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Саарал","F00":"Улаан","FF8C00":"Dark Orange","FFD700":"Алт","008000":"Ногоон","0FF":"Цэнхэр","00F":"Хөх","EE82EE":"Ягаан","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Улбар шар","FFFF00":"Шар","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Цайвар саарал","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"Цагаан"},"more":"Нэмэлт өнгөнүүд...","panelTitle":"Өнгөнүүд","textColorTitle":"Бичвэрийн өнгө"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"Загварууд","emptyListMsg":"(Загвар тодорхойлогдоогүй байна)","insertOption":"Одоогийн агууллагыг дарж бичих","options":"Template Options","selectPromptMsg":"Загварыг нээж editor-рүү сонгож оруулна уу<br />(Одоогийн агууллагыг устаж магадгүй):","title":"Загварын агуулга"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Зөвлөлдөх гарчиг","cssClassInputLabel":"Stylesheet классууд","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Зүүн талаас баруун тишээ (LTR)","langDirLabel":"Хэлний чиглэл","langDirRTLLabel":"Баруун талаас зүүн тишээ (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Загвар","title":"Div гэдэг хэсэг бий болгох","toolbar":"Div гэдэг хэсэг бий болгох"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Холбоосууд","insert":"Оруулах","styles":"Загварууд","colors":"Онгөнүүд","tools":"Хэрэгслүүд"},"toolbars":"Болосруулагчийн хэрэгслийн самбар"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"Хайх","findOptions":"Хайх сонголтууд","findWhat":"Хайх үг/үсэг:","matchCase":"Тэнцэх төлөв","matchCyclic":"Match cyclic","matchWord":"Тэнцэх бүтэн үг","notFoundMsg":"Хайсан бичвэрийг олсонгүй.","replace":"Орлуулах","replaceAll":"Бүгдийг нь солих","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Солих үг:","title":"Хайж орлуулах"},"fakeobjects":{"anchor":"Зангуу","flash":"Flash Animation","hiddenfield":"Нууц талбар","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Онцлогууд","accessNever":"Хэзээ ч үгүй","accessSameDomain":"Байнга","alignAbsBottom":"Abs доод талд","alignAbsMiddle":"Abs Дунд талд","alignBaseline":"Baseline","alignTextTop":"Текст дээр","bgcolor":"Дэвсгэр өнгө","chkFull":"Allow Fullscreen","chkLoop":"Давтах","chkMenu":"Флаш цэс идвэхжүүлэх","chkPlay":"Автоматаар тоглох","flashvars":"Variables for Flash","hSpace":"Хөндлөн зай","properties":"Флаш шинж чанар","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"Өргөгтгөх","scaleAll":"Бүгдийг харуулах","scaleFit":"Яг тааруулах","scaleNoBorder":"Хүрээгүй","title":"Флаш  шинж чанар","vSpace":"Босоо зай","validateHSpace":"HSpace must be a number.","validateSrc":"Линк URL-ээ төрөлжүүлнэ үү","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Хэмжээ","voiceLabel":"Үсгийн хэмжээ","panelTitle":"Үсгийн хэмжээ"},"label":"Үсгийн хэлбэр","panelTitle":"Үгсийн хэлбэрийн нэр","voiceLabel":"Үгсийн хэлбэр"},"forms":{"button":{"title":"Товчны шинж чанар","text":"Тэкст (Утга)","type":"Төрөл","typeBtn":"Товч","typeSbm":"Submit","typeRst":"Болих"},"checkboxAndRadio":{"checkboxTitle":"Чекбоксны шинж чанар","radioTitle":"Радио товчны шинж чанар","value":"Утга","selected":"Сонгогдсон"},"form":{"title":"Форм шинж чанар","menu":"Форм шинж чанар","action":"Үйлдэл","method":"Арга","encoding":"Encoding"},"hidden":{"title":"Нууц талбарын шинж чанар","name":"Нэр","value":"Утга"},"select":{"title":"Согогч талбарын шинж чанар","selectInfo":"Мэдээлэл","opAvail":"Идвэхтэй сонголт","value":"Утга","size":"Хэмжээ","lines":"Мөр","chkMulti":"Олон зүйл зэрэг сонгохыг зөвшөөрөх","opText":"Тэкст","opValue":"Утга","btnAdd":"Нэмэх","btnModify":"Өөрчлөх","btnUp":"Дээш","btnDown":"Доош","btnSetValue":"Сонгогдсан утга оноох","btnDelete":"Устгах"},"textarea":{"title":"Текст орчны шинж чанар","cols":"Багана","rows":"Мөр"},"textfield":{"title":"Текст талбарын шинж чанар","name":"Нэр","value":"Утга","charWidth":"Тэмдэгтын өргөн","maxChars":"Хамгийн их тэмдэгт","type":"Төрөл","typeText":"Текст","typePass":"Нууц үг","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"цахим хуудасны хаяг (URL)"}},"format":{"label":"Параргафын загвар","panelTitle":"Параргафын загвар","tag_address":"Хаяг","tag_div":"Paragraph (DIV)","tag_h1":"Гарчиг 1","tag_h2":"Гарчиг 2","tag_h3":"Гарчиг 3","tag_h4":"Гарчиг 4","tag_h5":"Гарчиг 5","tag_h6":"Гарчиг 6","tag_p":"Хэвийн","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Хөндлөн зураас оруулах"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Зурагны URL-ын төрлийн сонгоно уу","alt":"Зургийг орлох бичвэр","border":"Хүрээ","btnUpload":"Үүнийг сервэррүү илгээ","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Хөндлөн зай","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Зурагны мэдээлэл","linkTab":"Холбоос","lockRatio":"Радио түгжих","menu":"Зураг","resetSize":"хэмжээ дахин оноох","title":"Зураг","titleButton":"Зурган товчны шинж чанар","upload":"Хуулах","urlMissing":"Зургийн эх сурвалжийн хаяг (URL) байхгүй байна.","vSpace":"Босоо зай","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Догол мөр хасах","outdent":"Догол мөр нэмэх"},"smiley":{"options":"Smiley Options","title":"Тодорхойлолт оруулах","toolbar":"Тодорхойлолт"},"justify":{"block":"Тэгшлэх","center":"Голлуулах","left":"Зүүн талд тулгах","right":"Баруун талд тулгах"},"link":{"acccessKey":"Холбох түлхүүр","advanced":"Нэмэлт","advisoryContentType":"Зөвлөлдөх төрлийн агуулга","advisoryTitle":"Зөвлөлдөх гарчиг","anchor":{"toolbar":"Зангуу","menu":"Зангууг болосруулах","title":"Зангуугийн шинж чанар","name":"Зангуугийн нэр","errorName":"Зангуугийн нэрийг оруулна уу","remove":"Зангууг устгах"},"anchorId":"Элемэнтйн Id нэрээр","anchorName":"Зангуугийн нэрээр","charset":"Тэмдэгт оноох нөөцөд холбогдсон","cssClasses":"Stylesheet классууд","emailAddress":"Э-шуудангийн хаяг","emailBody":"Зурвасны их бие","emailSubject":"Зурвасны гарчиг","id":"Id","info":"Холбоосын тухай мэдээлэл","langCode":"Хэлний код","langDir":"Хэлний чиглэл","langDirLTR":"Зүүнээс баруун (LTR)","langDirRTL":"Баруунаас зүүн (RTL)","menu":"Холбоос засварлах","name":"Нэр","noAnchors":"(Баримт бичиг зангуугүй байна)","noEmail":"Э-шуудангий хаягаа шивнэ үү","noUrl":"Холбоосны URL хаягийг шивнэ үү","other":"<other>","popupDependent":"Хамаатай (Netscape)","popupFeatures":"Popup цонхны онцлог","popupFullScreen":"Цонх дүүргэх (Internet Explorer)","popupLeft":"Зүүн байрлал","popupLocationBar":"Location хэсэг","popupMenuBar":"Цэсний самбар","popupResizable":"Resizable","popupScrollBars":"Скрол хэсэгүүд","popupStatusBar":"Статус хэсэг","popupToolbar":"Багажны самбар","popupTop":"Дээд байрлал","rel":"Relationship","selectAnchor":"Нэг зангууг сонгоно уу","styles":"Загвар","tabIndex":"Tab индекс","target":"Байрлал","targetFrame":"<Агуулах хүрээ>","targetFrameName":"Очих фремын нэр","targetPopup":"<popup цонх>","targetPopupName":"Popup цонхны нэр","title":"Холбоос","toAnchor":"Энэ бичвэр дэх зангуу руу очих холбоос","toEmail":"Э-захиа","toUrl":"цахим хуудасны хаяг (URL)","toolbar":"Холбоос","type":"Линкийн төрөл","unlink":"Холбоос авч хаях","upload":"Хуулах"},"list":{"bulletedlist":"Цэгтэй жагсаалт","numberedlist":"Дугаарлагдсан жагсаалт"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Төрөл","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Дэлгэц дүүргэх","minimize":"Цонхыг багсгаж харуулах"},"newpage":{"toolbar":"Шинэ хуудас"},"pagebreak":{"alt":"Page Break","toolbar":"Хуудас тусгаарлагч оруулах"},"pastetext":{"button":"Энгийн бичвэрээр буулгах","title":"Энгийн бичвэрээр буулгах"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Word-оос буулгах","toolbar":"Word-оос буулгах"},"preview":{"preview":"Уридчлан харах"},"print":{"toolbar":"Хэвлэх"},"removeformat":{"toolbar":"Параргафын загварыг авч хаях"},"save":{"toolbar":"Хадгалах"},"selectall":{"toolbar":"Бүгдийг нь сонгох"},"showblocks":{"toolbar":"Хавтангуудыг харуулах"},"sourcearea":{"toolbar":"Код"},"specialchar":{"options":"Special Character Options","title":"Онцгой тэмдэгт сонгох","toolbar":"Онцгой тэмдэгт оруулах"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Бий болгох","dic_delete":"Устгах","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Нэрийг солих","dic_restore":"Restore","dictionariesTab":"Толь бичгүүд","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Хэлүүд","languagesTab":"Хэлүүд","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Сонголт","optionsTab":"Сонголт","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Загвар","panelTitle":"Загвар хэлбэржүүлэх","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Хүрээний хэмжээ","caption":"Тайлбар","cell":{"menu":"Нүх/зай","insertBefore":"Нүх/зай өмнө нь оруулах","insertAfter":"Нүх/зай дараа нь оруулах","deleteCell":"Нүх устгах","merge":"Нүх нэгтэх","mergeRight":"Баруун тийш нэгтгэх","mergeDown":"Доош нэгтгэх","splitHorizontal":"Нүх/зайг босоогоор нь тусгаарлах","splitVertical":"Нүх/зайг хөндлөнгөөр нь тусгаарлах","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Хэвтээд тэгшлэх арга","vAlign":"Босоод тэгшлэх арга","alignBaseline":"Baseline","bgColor":"Дэвсгэр өнгө","borderColor":"Хүрээний өнгө","data":"Data","header":"Header","yes":"Тийм","no":"Үгүй","invalidWidth":"Нүдний өргөн нь тоо байх ёстой.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Сонгох"},"cellPad":"Нүх доторлох(padding)","cellSpace":"Нүх хоорондын зай (spacing)","column":{"menu":"Багана","insertBefore":"Багана өмнө нь оруулах","insertAfter":"Багана дараа нь оруулах","deleteColumn":"Багана устгах"},"columns":"Багана","deleteTable":"Хүснэгт устгах","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Хүснэгтийн өргөн нь тоо байх ёстой.","menu":"Хүснэгт","row":{"menu":"Мөр","insertBefore":"Мөр өмнө нь оруулах","insertAfter":"Мөр дараа нь оруулах","deleteRow":"Мөр устгах"},"rows":"Мөр","summary":"Тайлбар","title":"Хүснэгт","toolbar":"Хүснэгт","widthPc":"хувь","widthPx":"цэг","widthUnit":"өргөний нэгж"},"undo":{"redo":"Өмнөх үйлдлээ сэргээх","undo":"Хүчингүй болгох"},"wsc":{"btnIgnore":"Зөвшөөрөх","btnIgnoreAll":"Бүгдийг зөвшөөрөх","btnReplace":"Солих","btnReplaceAll":"Бүгдийг Дарж бичих","btnUndo":"Буцаах","changeTo":"Өөрчлөх","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Дүрэм шалгагч суугаагүй байна. Татаж авахыг хүсч байна уу?","manyChanges":"Дүрэм шалгаад дууссан: %1 үг өөрчлөгдсөн","noChanges":"Дүрэм шалгаад дууссан: үг өөрчлөгдөөгүй","noMispell":"Дүрэм шалгаад дууссан: Алдаа олдсонгүй","noSuggestions":"- Тайлбаргүй -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Толь бичиггүй","oneChange":"Дүрэм шалгаад дууссан: 1 үг өөрчлөгдсөн","progress":"Дүрэм шалгаж байгаа үйл явц...","title":"Spell Check","toolbar":"Үгийн дүрэх шалгах"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/ms.js b/htmltest/sites/all/libraries/ckeditor-version/lang/ms.js
new file mode 100644
index 00000000..a58fa746
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/ms.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ms']={"editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protokol","upload":"Muat Naik","uploadSubmit":"Hantar ke Server","image":"Gambar","flash":"Flash","form":"Borang","checkbox":"Checkbox","radio":"Butang Radio","textField":"Text Field","textarea":"Textarea","hiddenField":"Field Tersembunyi","button":"Butang","select":"Field Pilihan","imageButton":"Butang Bergambar","notSet":"<tidak di set>","id":"Id","name":"Nama","langDir":"Arah Tulisan","langDirLtr":"Kiri ke Kanan (LTR)","langDirRtl":"Kanan ke Kiri (RTL)","langCode":"Kod Bahasa","longDescr":"Butiran Panjang URL","cssClass":"Kelas-kelas Stylesheet","advisoryTitle":"Tajuk Makluman","cssStyle":"Stail","ok":"OK","cancel":"Batal","close":"Close","preview":"Prebiu","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Options","target":"Sasaran","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Kiri ke Kanan (LTR)","langDirRTL":"Kanan ke Kiri (RTL)","styles":"Stail","cssClasses":"Kelas-kelas Stylesheet","width":"Lebar","height":"Tinggi","align":"Jajaran","alignLeft":"Kiri","alignRight":"Kanan","alignCenter":"Tengah","alignTop":"Atas","alignMiddle":"Pertengahan","alignBottom":"Bawah","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Salin","copyError":"Keselamatan perisian browser anda tidak membenarkan operasi salinan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+C).","cut":"Potong","cutError":"Keselamatan perisian browser anda tidak membenarkan operasi suntingan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+X).","paste":"Tampal","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Tampal"},"colorbutton":{"auto":"Otomatik","bgColorTitle":"Warna Latarbelakang","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"Warna lain-lain...","panelTitle":"Colors","textColorTitle":"Warna Text"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"Templat","emptyListMsg":"(Tiada Templat Disimpan)","insertOption":"Replace actual contents","options":"Template Options","selectPromptMsg":"Sila pilih templat untuk dibuka oleh editor<br>(kandungan sebenar akan hilang):","title":"Templat Kandungan"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Left to Right (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Right to Left (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"Cari","findOptions":"Find Options","findWhat":"Perkataan yang dicari:","matchCase":"Padanan case huruf","matchCyclic":"Match cyclic","matchWord":"Padana Keseluruhan perkataan","notFoundMsg":"Text yang dicari tidak dijumpai.","replace":"Ganti","replaceAll":"Ganti semua","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Diganti dengan:","title":"Find and Replace"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"Bawah Mutlak","alignAbsMiddle":"Pertengahan Mutlak","alignBaseline":"Garis Dasar","alignTextTop":"Atas Text","bgcolor":"Warna Latarbelakang","chkFull":"Allow Fullscreen","chkLoop":"Loop","chkMenu":"Enable Flash Menu","chkPlay":"Auto Play","flashvars":"Variables for Flash","hSpace":"Ruang Melintang","properties":"Flash Properties","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"Scale","scaleAll":"Show all","scaleFit":"Exact Fit","scaleNoBorder":"No Border","title":"Flash Properties","vSpace":"Ruang Menegak","validateHSpace":"HSpace must be a number.","validateSrc":"Sila taip sambungan URL","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Saiz","voiceLabel":"Font Size","panelTitle":"Saiz"},"label":"Font","panelTitle":"Font","voiceLabel":"Font"},"forms":{"button":{"title":"Ciri-ciri Butang","text":"Teks (Nilai)","type":"Jenis","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"Ciri-ciri Checkbox","radioTitle":"Ciri-ciri Butang Radio","value":"Nilai","selected":"Dipilih"},"form":{"title":"Ciri-ciri Borang","menu":"Ciri-ciri Borang","action":"Tindakan borang","method":"Cara borang dihantar","encoding":"Encoding"},"hidden":{"title":"Ciri-ciri Field Tersembunyi","name":"Nama","value":"Nilai"},"select":{"title":"Ciri-ciri Selection Field","selectInfo":"Select Info","opAvail":"Pilihan sediada","value":"Nilai","size":"Saiz","lines":"garisan","chkMulti":"Benarkan pilihan pelbagai","opText":"Teks","opValue":"Nilai","btnAdd":"Tambah Pilihan","btnModify":"Ubah Pilihan","btnUp":"Naik ke atas","btnDown":"Turun ke bawah","btnSetValue":"Set sebagai nilai terpilih","btnDelete":"Padam"},"textarea":{"title":"Ciri-ciri Textarea","cols":"Lajur","rows":"Baris"},"textfield":{"title":"Ciri-ciri Text Field","name":"Nama","value":"Nilai","charWidth":"Lebar isian","maxChars":"Isian Maksimum","type":"Jenis","typeText":"Teks","typePass":"Kata Laluan","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Format","tag_address":"Alamat","tag_div":"Perenggan (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Telah Diformat"},"horizontalrule":{"toolbar":"Masukkan Garisan Membujur"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Sila taip URL untuk fail gambar","alt":"Text Alternatif","border":"Border","btnUpload":"Hantar ke Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Ruang Melintang","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Info Imej","linkTab":"Sambungan","lockRatio":"Tetapkan Nisbah","menu":"Ciri-ciri Imej","resetSize":"Saiz Set Semula","title":"Ciri-ciri Imej","titleButton":"Ciri-ciri Butang Bergambar","upload":"Muat Naik","urlMissing":"Image source URL is missing.","vSpace":"Ruang Menegak","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Tambahkan Inden","outdent":"Kurangkan Inden"},"smiley":{"options":"Smiley Options","title":"Masukkan Smiley","toolbar":"Smiley"},"justify":{"block":"Jajaran Blok","center":"Jajaran Tengah","left":"Jajaran Kiri","right":"Jajaran Kanan"},"link":{"acccessKey":"Kunci Akses","advanced":"Advanced","advisoryContentType":"Jenis Kandungan Makluman","advisoryTitle":"Tajuk Makluman","anchor":{"toolbar":"Masukkan/Sunting Pautan","menu":"Ciri-ciri Pautan","title":"Ciri-ciri Pautan","name":"Nama Pautan","errorName":"Sila taip nama pautan","remove":"Remove Anchor"},"anchorId":"dengan menggunakan ID elemen","anchorName":"dengan menggunakan nama pautan","charset":"Linked Resource Charset","cssClasses":"Kelas-kelas Stylesheet","emailAddress":"Alamat E-Mail","emailBody":"Isi Kandungan Mesej","emailSubject":"Subjek Mesej","id":"Id","info":"Butiran Sambungan","langCode":"Arah Tulisan","langDir":"Arah Tulisan","langDirLTR":"Kiri ke Kanan (LTR)","langDirRTL":"Kanan ke Kiri (RTL)","menu":"Sunting Sambungan","name":"Nama","noAnchors":"(Tiada pautan terdapat dalam dokumen ini)","noEmail":"Sila taip alamat e-mail","noUrl":"Sila taip sambungan URL","other":"<lain>","popupDependent":"Bergantungan (Netscape)","popupFeatures":"Ciri Tetingkap Popup","popupFullScreen":"Skrin Penuh (IE)","popupLeft":"Posisi Kiri","popupLocationBar":"Bar Lokasi","popupMenuBar":"Bar Menu","popupResizable":"Resizable","popupScrollBars":"Bar-bar skrol","popupStatusBar":"Bar Status","popupToolbar":"Toolbar","popupTop":"Posisi Atas","rel":"Relationship","selectAnchor":"Sila pilih pautan","styles":"Stail","tabIndex":"Indeks Tab ","target":"Sasaran","targetFrame":"<bingkai>","targetFrameName":"Nama Bingkai Sasaran","targetPopup":"<tetingkap popup>","targetPopupName":"Nama Tetingkap Popup","title":"Sambungan","toAnchor":"Pautan dalam muka surat ini","toEmail":"E-Mail","toUrl":"URL","toolbar":"Masukkan/Sunting Sambungan","type":"Jenis Sambungan","unlink":"Buang Sambungan","upload":"Muat Naik"},"list":{"bulletedlist":"Senarai tidak bernombor","numberedlist":"Senarai bernombor"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"newpage":{"toolbar":"Helaian Baru"},"pagebreak":{"alt":"Page Break","toolbar":"Insert Page Break for Printing"},"pastetext":{"button":"Tampal sebagai text biasa","title":"Tampal sebagai text biasa"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Tampal dari Word","toolbar":"Tampal dari Word"},"preview":{"preview":"Prebiu"},"print":{"toolbar":"Cetak"},"removeformat":{"toolbar":"Buang Format"},"save":{"toolbar":"Simpan"},"selectall":{"toolbar":"Pilih Semua"},"showblocks":{"toolbar":"Show Blocks"},"sourcearea":{"toolbar":"Sumber"},"specialchar":{"options":"Special Character Options","title":"Sila pilih huruf istimewa","toolbar":"Masukkan Huruf Istimewa"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stail","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Saiz Border","caption":"Keterangan","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Buangkan Sel-sel","merge":"Cantumkan Sel-sel","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Tambahan Ruang Sel","cellSpace":"Ruangan Antara Sel","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Buangkan Lajur"},"columns":"Jaluran","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Ciri-ciri Jadual","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Buangkan Baris"},"rows":"Barisan","summary":"Summary","title":"Ciri-ciri Jadual","toolbar":"Jadual","widthPc":"peratus","widthPx":"piksel-piksel","widthUnit":"width unit"},"undo":{"redo":"Ulangkan","undo":"Batalkan"},"wsc":{"btnIgnore":"Biar","btnIgnoreAll":"Biarkan semua","btnReplace":"Ganti","btnReplaceAll":"Gantikan Semua","btnUndo":"Batalkan","changeTo":"Tukarkan kepada","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Pemeriksa ejaan tidak dipasang. Adakah anda mahu muat turun sekarang?","manyChanges":"Pemeriksaan ejaan siap: %1 perkataan diubah","noChanges":"Pemeriksaan ejaan siap: Tiada perkataan diubah","noMispell":"Pemeriksaan ejaan siap: Tiada salah ejaan","noSuggestions":"- Tiada cadangan -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Tidak terdapat didalam kamus","oneChange":"Pemeriksaan ejaan siap: Satu perkataan telah diubah","progress":"Pemeriksaan ejaan sedang diproses...","title":"Spell Check","toolbar":"Semak Ejaan"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/nb.js b/htmltest/sites/all/libraries/ckeditor-version/lang/nb.js
new file mode 100644
index 00000000..7a7e73c6
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/nb.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['nb']={"editor":"Rikteksteditor","common":{"editorHelp":"Trykk ALT 0 for hjelp","browseServer":"Bla igjennom server","url":"URL","protocol":"Protokoll","upload":"Last opp","uploadSubmit":"Send det til serveren","image":"Bilde","flash":"Flash","form":"Skjema","checkbox":"Avmerkingsboks","radio":"Alternativknapp","textField":"Tekstboks","textarea":"Tekstområde","hiddenField":"Skjult felt","button":"Knapp","select":"Rullegardinliste","imageButton":"Bildeknapp","notSet":"<ikke satt>","id":"Id","name":"Navn","langDir":"Språkretning","langDirLtr":"Venstre til høyre (VTH)","langDirRtl":"Høyre til venstre (HTV)","langCode":"Språkkode","longDescr":"Utvidet beskrivelse","cssClass":"Stilarkklasser","advisoryTitle":"Tittel","cssStyle":"Stil","ok":"OK","cancel":"Avbryt","close":"Lukk","preview":"Forhåndsvis","resize":"Dra for å skalere","generalTab":"Generelt","advancedTab":"Avansert","validateNumberFailed":"Denne verdien er ikke et tall.","confirmNewPage":"Alle ulagrede endringer som er gjort i dette innholdet vil bli tapt. Er du sikker på at du vil laste en ny side?","confirmCancel":"Noen av valgene har blitt endret. Er du sikker på at du vil lukke dialogen?","options":"Valg","target":"Mål","targetNew":"Nytt vindu (_blank)","targetTop":"Hele vindu (_top)","targetSelf":"Samme vindu (_self)","targetParent":"Foreldrevindu (_parent)","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","styles":"Stil","cssClasses":"Stilarkklasser","width":"Bredde","height":"Høyde","align":"Juster","alignLeft":"Venstre","alignRight":"Høyre","alignCenter":"Midtjuster","alignTop":"Topp","alignMiddle":"Midten","alignBottom":"Bunn","invalidValue":"Ugyldig verdi.","invalidHeight":"Høyde må være et tall.","invalidWidth":"Bredde må være et tall.","invalidCssLength":"Den angitte verdien for feltet \"%1\" må være et positivt tall med eller uten en gyldig CSS-målingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Den angitte verdien for feltet \"%1\" må være et positivt tall med eller uten en gyldig HTML-målingsenhet (px eller %).","invalidInlineStyle":"Verdi angitt for inline stil må bestå av en eller flere sett med formatet \"navn : verdi\", separert med semikolon","cssLengthTooltip":"Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, utilgjenglig</span>"},"about":{"copy":"Copyright &copy; $1. Alle rettigheter reservert.","dlgTitle":"Om CKEditor","help":"Se $1 for hjelp.","moreInfo":"For lisensieringsinformasjon, vennligst besøk vårt nettsted:","title":"Om CKEditor","userGuide":"CKEditors brukerveiledning"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Gjennomstreking","subscript":"Senket skrift","superscript":"Hevet skrift","underline":"Understreking"},"bidi":{"ltr":"Tekstretning fra venstre til høyre","rtl":"Tekstretning fra høyre til venstre"},"blockquote":{"toolbar":"Blokksitat"},"clipboard":{"copy":"Kopier","copyError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).","cut":"Klipp ut","cutError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).","paste":"Lim inn","pasteArea":"Innlimingsområde","pasteMsg":"Vennligst lim inn i følgende boks med tastaturet (<STRONG>Ctrl/Cmd+V</STRONG>) og trykk <STRONG>OK</STRONG>.","securityMsg":"Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.","title":"Lim inn"},"colorbutton":{"auto":"Automatisk","bgColorTitle":"Bakgrunnsfarge","colors":{"000":"Svart","800000":"Rødbrun","8B4513":"Salbrun","2F4F4F":"Grønnsvart","008080":"Blågrønn","000080":"Marineblått","4B0082":"Indigo","696969":"Mørk grå","B22222":"Mørkerød","A52A2A":"Brun","DAA520":"Lys brun","006400":"Mørk grønn","40E0D0":"Turkis","0000CD":"Medium blå","800080":"Purpur","808080":"Grå","F00":"Rød","FF8C00":"Mørk oransje","FFD700":"Gull","008000":"Grønn","0FF":"Cyan","00F":"Blå","EE82EE":"Fiolett","A9A9A9":"Svak grå","FFA07A":"Rosa-oransje","FFA500":"Oransje","FFFF00":"Gul","00FF00":"Lime","AFEEEE":"Svak turkis","ADD8E6":"Lys Blå","DDA0DD":"Plomme","D3D3D3":"Lys grå","FFF0F5":"Svak lavendelrosa","FAEBD7":"Antikk-hvit","FFFFE0":"Lys gul","F0FFF0":"Honningmelon","F0FFFF":"Svakt asurblått","F0F8FF":"Svak cyan","E6E6FA":"Lavendel","FFF":"Hvit"},"more":"Flere farger...","panelTitle":"Farger","textColorTitle":"Tekstfarge"},"colordialog":{"clear":"Tøm","highlight":"Merk","options":"Alternativer for farge","selected":"Valgt","title":"Velg farge"},"templates":{"button":"Maler","emptyListMsg":"(Ingen maler definert)","insertOption":"Erstatt gjeldende innhold","options":"Alternativer for mal","selectPromptMsg":"Velg malen du vil åpne i redigeringsverktøyet:","title":"Innholdsmaler"},"contextmenu":{"options":"Alternativer for høyreklikkmeny"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Tittel","cssClassInputLabel":"Stilark-klasser","edit":"Rediger Div","inlineStyleInputLabel":"Inlinestiler","langDirLTRLabel":"Venstre til høyre (VTH)","langDirLabel":"Språkretning","langDirRTLLabel":"Høyre til venstre (HTV)","languageCodeInputLabel":" Språkkode","remove":"Fjern Div","styleSelectLabel":"Stil","title":"Sett inn Div Container","toolbar":"Sett inn Div Container"},"toolbar":{"toolbarCollapse":"Skjul verktøylinje","toolbarExpand":"Vis verktøylinje","toolbarGroups":{"document":"Dokument","clipboard":"Utklippstavle/Angre","editing":"Redigering","forms":"Skjema","basicstyles":"Basisstiler","paragraph":"Avsnitt","links":"Lenker","insert":"Innsetting","styles":"Stiler","colors":"Farger","tools":"Verktøy"},"toolbars":"Verktøylinjer for editor"},"elementspath":{"eleLabel":"Element-sti","eleTitle":"%1 element"},"find":{"find":"Søk","findOptions":"Søkealternativer","findWhat":"Søk etter:","matchCase":"Skill mellom store og små bokstaver","matchCyclic":"Søk i hele dokumentet","matchWord":"Bare hele ord","notFoundMsg":"Fant ikke søketeksten.","replace":"Erstatt","replaceAll":"Erstatt alle","replaceSuccessMsg":"%1 tilfelle(r) erstattet.","replaceWith":"Erstatt med:","title":"Søk og erstatt"},"fakeobjects":{"anchor":"Anker","flash":"Flash-animasjon","hiddenfield":"Skjult felt","iframe":"IFrame","unknown":"Ukjent objekt"},"flash":{"access":"Scripttilgang","accessAlways":"Alltid","accessNever":"Aldri","accessSameDomain":"Samme domene","alignAbsBottom":"Abs bunn","alignAbsMiddle":"Abs midten","alignBaseline":"Bunnlinje","alignTextTop":"Tekst topp","bgcolor":"Bakgrunnsfarge","chkFull":"Tillat fullskjerm","chkLoop":"Loop","chkMenu":"Slå på Flash-meny","chkPlay":"Autospill","flashvars":"Variabler for flash","hSpace":"HMarg","properties":"Egenskaper for Flash-objekt","propertiesTab":"Egenskaper","quality":"Kvalitet","qualityAutoHigh":"Auto høy","qualityAutoLow":"Auto lav","qualityBest":"Best","qualityHigh":"Høy","qualityLow":"Lav","qualityMedium":"Medium","scale":"Skaler","scaleAll":"Vis alt","scaleFit":"Skaler til å passe","scaleNoBorder":"Ingen ramme","title":"Flash-egenskaper","vSpace":"VMarg","validateHSpace":"HMarg må være et tall.","validateSrc":"Vennligst skriv inn lenkens url.","validateVSpace":"VMarg må være et tall.","windowMode":"Vindumodus","windowModeOpaque":"Opaque","windowModeTransparent":"Gjennomsiktig","windowModeWindow":"Vindu"},"font":{"fontSize":{"label":"Størrelse","voiceLabel":"Font Størrelse","panelTitle":"Størrelse"},"label":"Skrift","panelTitle":"Skrift","voiceLabel":"Font"},"forms":{"button":{"title":"Egenskaper for knapp","text":"Tekst (verdi)","type":"Type","typeBtn":"Knapp","typeSbm":"Send","typeRst":"Nullstill"},"checkboxAndRadio":{"checkboxTitle":"Egenskaper for avmerkingsboks","radioTitle":"Egenskaper for alternativknapp","value":"Verdi","selected":"Valgt"},"form":{"title":"Egenskaper for skjema","menu":"Egenskaper for skjema","action":"Handling","method":"Metode","encoding":"Encoding"},"hidden":{"title":"Egenskaper for skjult felt","name":"Navn","value":"Verdi"},"select":{"title":"Egenskaper for rullegardinliste","selectInfo":"Info","opAvail":"Tilgjenglige alternativer","value":"Verdi","size":"Størrelse","lines":"Linjer","chkMulti":"Tillat flervalg","opText":"Tekst","opValue":"Verdi","btnAdd":"Legg til","btnModify":"Endre","btnUp":"Opp","btnDown":"Ned","btnSetValue":"Sett som valgt","btnDelete":"Slett"},"textarea":{"title":"Egenskaper for tekstområde","cols":"Kolonner","rows":"Rader"},"textfield":{"title":"Egenskaper for tekstfelt","name":"Navn","value":"Verdi","charWidth":"Tegnbredde","maxChars":"Maks antall tegn","type":"Type","typeText":"Tekst","typePass":"Passord","typeEmail":"Epost","typeSearch":"Søk","typeTel":"Telefonnummer","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Avsnittsformat","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formatert"},"horizontalrule":{"toolbar":"Sett inn horisontal linje"},"iframe":{"border":"Viss ramme rundt iframe","noUrl":"Vennligst skriv inn URL for iframe","scrolling":"Aktiver scrollefelt","title":"Egenskaper for IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Vennligst skriv bilde-urlen","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Send det til serveren","button2Img":"Vil du endre den valgte bildeknappen til et vanlig bilde?","hSpace":"HMarg","img2Button":"Vil du endre det valgte bildet til en bildeknapp?","infoTab":"Bildeinformasjon","linkTab":"Lenke","lockRatio":"Lås forhold","menu":"Bildeegenskaper","resetSize":"Tilbakestill størrelse","title":"Bildeegenskaper","titleButton":"Egenskaper for bildeknapp","upload":"Last opp","urlMissing":"Bildets adresse mangler.","vSpace":"VMarg","validateBorder":"Ramme må være et heltall.","validateHSpace":"HMarg må være et heltall.","validateVSpace":"VMarg må være et heltall."},"indent":{"indent":"Øk innrykk","outdent":"Reduser innrykk"},"smiley":{"options":"Alternativer for smil","title":"Sett inn smil","toolbar":"Smil"},"justify":{"block":"Blokkjuster","center":"Midtstill","left":"Venstrejuster","right":"Høyrejuster"},"link":{"acccessKey":"Aksessknapp","advanced":"Avansert","advisoryContentType":"Type","advisoryTitle":"Tittel","anchor":{"toolbar":"Sett inn/Rediger anker","menu":"Egenskaper for anker","title":"Egenskaper for anker","name":"Ankernavn","errorName":"Vennligst skriv inn ankernavnet","remove":"Fjern anker"},"anchorId":"Element etter ID","anchorName":"Anker etter navn","charset":"Lenket tegnsett","cssClasses":"Stilarkklasser","emailAddress":"E-postadresse","emailBody":"Melding","emailSubject":"Meldingsemne","id":"Id","info":"Lenkeinfo","langCode":"Språkkode","langDir":"Språkretning","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","menu":"Rediger lenke","name":"Navn","noAnchors":"(Ingen anker i dokumentet)","noEmail":"Vennligst skriv inn e-postadressen","noUrl":"Vennligst skriv inn lenkens URL","other":"<annen>","popupDependent":"Avhenging (Netscape)","popupFeatures":"Egenskaper for popup-vindu","popupFullScreen":"Fullskjerm (IE)","popupLeft":"Venstre posisjon","popupLocationBar":"Adresselinje","popupMenuBar":"Menylinje","popupResizable":"Skalerbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Verktøylinje","popupTop":"Topp-posisjon","rel":"Relasjon (rel)","selectAnchor":"Velg et anker","styles":"Stil","tabIndex":"Tabindeks","target":"Mål","targetFrame":"<ramme>","targetFrameName":"Målramme","targetPopup":"<popup-vindu>","targetPopupName":"Navn på popup-vindu","title":"Lenke","toAnchor":"Lenke til anker i teksten","toEmail":"E-post","toUrl":"URL","toolbar":"Sett inn/Rediger lenke","type":"Lenketype","unlink":"Fjern lenke","upload":"Last opp"},"list":{"bulletedlist":"Legg til/Fjern punktmerket liste","numberedlist":"Legg til/Fjern nummerert liste"},"liststyle":{"armenian":"Armensk nummerering","bulletedTitle":"Egenskaper for punktmerket liste","circle":"Sirkel","decimal":"Tall (1, 2, 3, osv.)","decimalLeadingZero":"Tall, med førstesiffer null (01, 02, 03, osv.)","disc":"Disk","georgian":"Georgisk nummerering (an, ban, gan, osv.)","lowerAlpha":"Alfabetisk, små (a, b, c, d, e, osv.)","lowerGreek":"Gresk, små (alpha, beta, gamma, osv.)","lowerRoman":"Romertall, små (i, ii, iii, iv, v, osv.)","none":"Ingen","notset":"<ikke satt>","numberedTitle":"Egenskaper for nummerert liste","square":"Firkant","start":"Start","type":"Type","upperAlpha":"Alfabetisk, store (A, B, C, D, E, osv.)","upperRoman":"Romertall, store (I, II, III, IV, V, osv.)","validateStartNumber":"Starten på listen må være et heltall."},"magicline":{"title":"Sett inn nytt avsnitt her"},"maximize":{"maximize":"Maksimer","minimize":"Minimer"},"newpage":{"toolbar":"Ny side"},"pagebreak":{"alt":"Sideskift","toolbar":"Sett inn sideskift for utskrift"},"pastetext":{"button":"Lim inn som ren tekst","title":"Lim inn som ren tekst"},"pastefromword":{"confirmCleanup":"Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?","error":"Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil","title":"Lim inn fra Word","toolbar":"Lim inn fra Word"},"preview":{"preview":"Forhåndsvis"},"print":{"toolbar":"Skriv ut"},"removeformat":{"toolbar":"Fjern formatering"},"save":{"toolbar":"Lagre"},"selectall":{"toolbar":"Merk alt"},"showblocks":{"toolbar":"Vis blokker"},"sourcearea":{"toolbar":"Kilde"},"specialchar":{"options":"Alternativer for spesialtegn","title":"Velg spesialtegn","toolbar":"Sett inn spesialtegn"},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Legg til ord","allCaps":"Ikke kontroller ord med kun store bokstaver","dic_create":"Opprett","dic_delete":"Slett","dic_field_name":"Ordboknavn","dic_info":"Brukerordboken lagres først i en informasjonskapsel på din maskin, men det er en begrensning på hvor mye som kan lagres her. Når ordboken blir for stor til å lagres i en informasjonskapsel, vil vi i stedet lagre ordboken på vår server. For å lagre din personlige ordbok på vår server, burde du velge et navn for ordboken din. Hvis du allerede har lagret en ordbok, vennligst skriv inn ordbokens navn og klikk på Gjenopprett-knappen.","dic_rename":"Gi nytt navn","dic_restore":"Gjenopprett","dictionariesTab":"Ordbøker","disable":"Slå av SCAYT","emptyDic":"Ordboknavn bør ikke være tom.","enable":"Slå på SCAYT","ignore":"Ignorer","ignoreAll":"Ignorer Alle","ignoreDomainNames":"Ikke kontroller domenenavn","langs":"Språk","languagesTab":"Språk","mixedCase":"Ikke kontroller ord med blandet små og store bokstaver","mixedWithDigits":"Ikke kontroller ord som inneholder tall","moreSuggestions":"Flere forslag","opera_title":"Ikke støttet av Opera","options":"Valg","optionsTab":"Valg","title":"Stavekontroll mens du skriver","toggle":"Veksle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Stilformater","panelTitle1":"Blokkstiler","panelTitle2":"Inlinestiler","panelTitle3":"Objektstiler"},"table":{"border":"Rammestørrelse","caption":"Tittel","cell":{"menu":"Celle","insertBefore":"Sett inn celle før","insertAfter":"Sett inn celle etter","deleteCell":"Slett celler","merge":"Slå sammen celler","mergeRight":"Slå sammen høyre","mergeDown":"Slå sammen ned","splitHorizontal":"Del celle horisontalt","splitVertical":"Del celle vertikalt","title":"Celleegenskaper","cellType":"Celletype","rowSpan":"Radspenn","colSpan":"Kolonnespenn","wordWrap":"Tekstbrytning","hAlign":"Horisontal justering","vAlign":"Vertikal justering","alignBaseline":"Grunnlinje","bgColor":"Bakgrunnsfarge","borderColor":"Rammefarge","data":"Data","header":"Overskrift","yes":"Ja","no":"Nei","invalidWidth":"Cellebredde må være et tall.","invalidHeight":"Cellehøyde må være et tall.","invalidRowSpan":"Radspenn må være et heltall.","invalidColSpan":"Kolonnespenn må være et heltall.","chooseColor":"Velg"},"cellPad":"Cellepolstring","cellSpace":"Cellemarg","column":{"menu":"Kolonne","insertBefore":"Sett inn kolonne før","insertAfter":"Sett inn kolonne etter","deleteColumn":"Slett kolonner"},"columns":"Kolonner","deleteTable":"Slett tabell","headers":"Overskrifter","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første rad","invalidBorder":"Rammestørrelse må være et tall.","invalidCellPadding":"Cellepolstring må være et positivt tall.","invalidCellSpacing":"Cellemarg må være et positivt tall.","invalidCols":"Antall kolonner må være et tall større enn 0.","invalidHeight":"Tabellhøyde må være et tall.","invalidRows":"Antall rader må være et tall større enn 0.","invalidWidth":"Tabellbredde må være et tall.","menu":"Egenskaper for tabell","row":{"menu":"Rader","insertBefore":"Sett inn rad før","insertAfter":"Sett inn rad etter","deleteRow":"Slett rader"},"rows":"Rader","summary":"Sammendrag","title":"Egenskaper for tabell","toolbar":"Tabell","widthPc":"prosent","widthPx":"piksler","widthUnit":"Bredde-enhet"},"undo":{"redo":"Gjør om","undo":"Angre"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer alle","btnReplace":"Erstatt","btnReplaceAll":"Erstatt alle","btnUndo":"Angre","changeTo":"Endre til","errorLoading":"Feil under lasting av applikasjonstjenestetjener: %s.","ieSpellDownload":"Stavekontroll er ikke installert. Vil du laste den ned nå?","manyChanges":"Stavekontroll fullført: %1 ord endret","noChanges":"Stavekontroll fullført: ingen ord endret","noMispell":"Stavekontroll fullført: ingen feilstavinger funnet","noSuggestions":"- Ingen forslag -","notAvailable":"Beklager, tjenesten er utilgjenglig nå.","notInDic":"Ikke i ordboken","oneChange":"Stavekontroll fullført: Ett ord endret","progress":"Stavekontroll pågår...","title":"Stavekontroll","toolbar":"Stavekontroll"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/nl.js b/htmltest/sites/all/libraries/ckeditor-version/lang/nl.js
new file mode 100644
index 00000000..72f5d3bc
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/nl.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['nl']={"editor":"Tekstverwerker","common":{"editorHelp":"Druk ALT 0 voor hulp","browseServer":"Bladeren op server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Naar server verzenden","image":"Afbeelding","flash":"Flash","form":"Formulier","checkbox":"Aanvinkvakje","radio":"Selectievakje","textField":"Tekstveld","textarea":"Tekstvak","hiddenField":"Verborgen veld","button":"Knop","select":"Selectieveld","imageButton":"Afbeeldingsknop","notSet":"<niet ingevuld>","id":"Id","name":"Naam","langDir":"Schrijfrichting","langDirLtr":"Links naar rechts (LTR)","langDirRtl":"Rechts naar links (RTL)","langCode":"Taalcode","longDescr":"Lange URL-omschrijving","cssClass":"Stylesheet-klassen","advisoryTitle":"Adviserende titel","cssStyle":"Stijl","ok":"OK","cancel":"Annuleren","close":"Sluiten","preview":"Voorbeeld","resize":"Sleep om te herschalen","generalTab":"Algemeen","advancedTab":"Geavanceerd","validateNumberFailed":"Deze waarde is geen geldig getal.","confirmNewPage":"Alle aangebrachte wijzigingen gaan verloren. Weet u zeker dat u een nieuwe pagina wilt openen?","confirmCancel":"Enkele opties zijn gewijzigd. Weet u zeker dat u dit dialoogvenster wilt sluiten?","options":"Opties","target":"Doelvenster","targetNew":"Nieuw venster (_blank)","targetTop":"Hele venster (_top)","targetSelf":"Zelfde venster (_self)","targetParent":"Origineel venster (_parent)","langDirLTR":"Links naar rechts (LTR)","langDirRTL":"Rechts naar links (RTL)","styles":"Stijl","cssClasses":"Stylesheet klassen","width":"Breedte","height":"Hoogte","align":"Uitlijning","alignLeft":"Links","alignRight":"Rechts","alignCenter":"Centreren","alignTop":"Boven","alignMiddle":"Midden","alignBottom":"Onder","invalidValue":"Ongeldige waarde.","invalidHeight":"De hoogte moet een getal zijn.","invalidWidth":"De breedte moet een getal zijn.","invalidCssLength":"Waarde in veld \"%1\" moet een positief nummer zijn, met of zonder een geldige CSS meeteenheid (px, %, in, cm, mm, em, ex, pt of pc).","invalidHtmlLength":"Waarde in veld \"%1\" moet een positief nummer zijn, met of zonder een geldige HTML meeteenheid (px of %).","invalidInlineStyle":"Waarde voor de online stijl moet bestaan uit een of meerdere tupels met het formaat \"naam : waarde\", gescheiden door puntkomma's.","cssLengthTooltip":"Geef een nummer in voor een waarde in pixels of geef een nummer in met een geldige CSS eenheid (px, %, in, cm, mm, em, ex, pt, of pc).","unavailable":"%1<span class=\"cke_accessibility\">, niet beschikbaar</span>"},"about":{"copy":"Copyright &copy; $1. Alle rechten voorbehouden.","dlgTitle":"Over CKEditor","help":"Bekijk de $1 voor hulp.","moreInfo":"Voor licentie informatie, bezoek onze website:","title":"Over CKEditor","userGuide":"CKEditor gebruiksaanwijzing"},"basicstyles":{"bold":"Vet","italic":"Cursief","strike":"Doorhalen","subscript":"Subscript","superscript":"Superscript","underline":"Onderstreept"},"bidi":{"ltr":"Schrijfrichting van links naar rechts","rtl":"Schrijfrichting van rechts naar links"},"blockquote":{"toolbar":"Citaatblok"},"clipboard":{"copy":"Kopiëren","copyError":"De beveiligingsinstelling van de browser verhinderen het automatisch kopiëren. Gebruik de sneltoets Ctrl/Cmd+C van het toetsenbord.","cut":"Knippen","cutError":"De beveiligingsinstelling van de browser verhinderen het automatisch knippen. Gebruik de sneltoets Ctrl/Cmd+X van het toetsenbord.","paste":"Plakken","pasteArea":"Plakgebied","pasteMsg":"Plak de tekst in het volgende vak gebruikmakend van uw toetsenbord (<strong>Ctrl/Cmd+V</strong>) en klik op OK.","securityMsg":"Door de beveiligingsinstellingen van uw browser is het niet mogelijk om direct vanuit het klembord in de editor te plakken. Middels opnieuw plakken in dit venster kunt u de tekst alsnog plakken in de editor.","title":"Plakken"},"colorbutton":{"auto":"Automatisch","bgColorTitle":"Achtergrondkleur","colors":{"000":"Zwart","800000":"Kastanjebruin","8B4513":"Chocoladebruin","2F4F4F":"Donkerleigrijs","008080":"Blauwgroen","000080":"Marine","4B0082":"Indigo","696969":"Donkergrijs","B22222":"Baksteen","A52A2A":"Bruin","DAA520":"Donkergeel","006400":"Donkergroen","40E0D0":"Turquoise","0000CD":"Middenblauw","800080":"Paars","808080":"Grijs","F00":"Rood","FF8C00":"Donkeroranje","FFD700":"Goud","008000":"Groen","0FF":"Cyaan","00F":"Blauw","EE82EE":"Violet","A9A9A9":"Donkergrijs","FFA07A":"Lichtzalm","FFA500":"Oranje","FFFF00":"Geel","00FF00":"Felgroen","AFEEEE":"Lichtturquoise","ADD8E6":"Lichtblauw","DDA0DD":"Pruim","D3D3D3":"Lichtgrijs","FFF0F5":"Linnen","FAEBD7":"Ivoor","FFFFE0":"Lichtgeel","F0FFF0":"Honingdauw","F0FFFF":"Azuur","F0F8FF":"Licht hemelsblauw","E6E6FA":"Lavendel","FFF":"Wit"},"more":"Meer kleuren...","panelTitle":"Kleuren","textColorTitle":"Tekstkleur"},"colordialog":{"clear":"Wissen","highlight":"Actief","options":"Kleuropties","selected":"Geselecteerde kleur","title":"Selecteer kleur"},"templates":{"button":"Sjablonen","emptyListMsg":"(Geen sjablonen gedefinieerd)","insertOption":"Vervang de huidige inhoud","options":"Template opties","selectPromptMsg":"Selecteer het sjabloon dat in de editor geopend moet worden (de actuele inhoud gaat verloren):","title":"Inhoud sjablonen"},"contextmenu":{"options":"Contextmenu opties"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Adviserende titel","cssClassInputLabel":"Stylesheet klassen","edit":"Div wijzigen","inlineStyleInputLabel":"Inline stijl","langDirLTRLabel":"Links naar rechts (LTR)","langDirLabel":"Schrijfrichting","langDirRTLLabel":"Rechts naar links (RTL)","languageCodeInputLabel":" Taalcode","remove":"Div verwijderen","styleSelectLabel":"Stijl","title":"Div aanmaken","toolbar":"Div aanmaken"},"toolbar":{"toolbarCollapse":"Werkbalk inklappen","toolbarExpand":"Werkbalk uitklappen","toolbarGroups":{"document":"Document","clipboard":"Klembord/Ongedaan maken","editing":"Bewerken","forms":"Formulieren","basicstyles":"Basisstijlen","paragraph":"Paragraaf","links":"Links","insert":"Invoegen","styles":"Stijlen","colors":"Kleuren","tools":"Toepassingen"},"toolbars":"Werkbalken"},"elementspath":{"eleLabel":"Elementenpad","eleTitle":"%1 element"},"find":{"find":"Zoeken","findOptions":"Zoekopties","findWhat":"Zoeken naar:","matchCase":"Hoofdlettergevoelig","matchCyclic":"Doorlopend zoeken","matchWord":"Hele woord moet voorkomen","notFoundMsg":"De opgegeven tekst is niet gevonden.","replace":"Vervangen","replaceAll":"Alles vervangen","replaceSuccessMsg":"%1 resultaten vervangen.","replaceWith":"Vervangen met:","title":"Zoeken en vervangen"},"fakeobjects":{"anchor":"Interne link","flash":"Flash animatie","hiddenfield":"Verborgen veld","iframe":"IFrame","unknown":"Onbekend object"},"flash":{"access":"Script toegang","accessAlways":"Altijd","accessNever":"Nooit","accessSameDomain":"Zelfde domeinnaam","alignAbsBottom":"Absoluut-onder","alignAbsMiddle":"Absoluut-midden","alignBaseline":"Basislijn","alignTextTop":"Boven tekst","bgcolor":"Achtergrondkleur","chkFull":"Schermvullend toestaan","chkLoop":"Herhalen","chkMenu":"Flashmenu's inschakelen","chkPlay":"Automatisch afspelen","flashvars":"Variabelen voor Flash","hSpace":"HSpace","properties":"Eigenschappen Flash","propertiesTab":"Eigenschappen","quality":"Kwaliteit","qualityAutoHigh":"Automatisch hoog","qualityAutoLow":"Automatisch laag","qualityBest":"Beste","qualityHigh":"Hoog","qualityLow":"Laag","qualityMedium":"Gemiddeld","scale":"Schaal","scaleAll":"Alles tonen","scaleFit":"Precies passend","scaleNoBorder":"Geen rand","title":"Eigenschappen Flash","vSpace":"VSpace","validateHSpace":"De HSpace moet een getal zijn.","validateSrc":"De URL mag niet leeg zijn.","validateVSpace":"De VSpace moet een getal zijn.","windowMode":"Venster modus","windowModeOpaque":"Ondoorzichtig","windowModeTransparent":"Doorzichtig","windowModeWindow":"Venster"},"font":{"fontSize":{"label":"Lettergrootte","voiceLabel":"Lettergrootte","panelTitle":"Lettergrootte"},"label":"Lettertype","panelTitle":"Lettertype","voiceLabel":"Lettertype"},"forms":{"button":{"title":"Eigenschappen knop","text":"Tekst (waarde)","type":"Soort","typeBtn":"Knop","typeSbm":"Versturen","typeRst":"Leegmaken"},"checkboxAndRadio":{"checkboxTitle":"Eigenschappen aanvinkvakje","radioTitle":"Eigenschappen selectievakje","value":"Waarde","selected":"Geselecteerd"},"form":{"title":"Eigenschappen formulier","menu":"Eigenschappen formulier","action":"Actie","method":"Methode","encoding":"Codering"},"hidden":{"title":"Eigenschappen verborgen veld","name":"Naam","value":"Waarde"},"select":{"title":"Eigenschappen selectieveld","selectInfo":"Informatie","opAvail":"Beschikbare opties","value":"Waarde","size":"Grootte","lines":"Regels","chkMulti":"Gecombineerde selecties toestaan","opText":"Tekst","opValue":"Waarde","btnAdd":"Toevoegen","btnModify":"Wijzigen","btnUp":"Omhoog","btnDown":"Omlaag","btnSetValue":"Als geselecteerde waarde instellen","btnDelete":"Verwijderen"},"textarea":{"title":"Eigenschappen tekstvak","cols":"Kolommen","rows":"Rijen"},"textfield":{"title":"Eigenschappen tekstveld","name":"Naam","value":"Waarde","charWidth":"Breedte (tekens)","maxChars":"Maximum aantal tekens","type":"Soort","typeText":"Tekst","typePass":"Wachtwoord","typeEmail":"E-mail","typeSearch":"Zoeken","typeTel":"Telefoonnummer","typeUrl":"URL"}},"format":{"label":"Opmaak","panelTitle":"Opmaak","tag_address":"Adres","tag_div":"Normaal (DIV)","tag_h1":"Kop 1","tag_h2":"Kop 2","tag_h3":"Kop 3","tag_h4":"Kop 4","tag_h5":"Kop 5","tag_h6":"Kop 6","tag_p":"Normaal","tag_pre":"Met opmaak"},"horizontalrule":{"toolbar":"Horizontale lijn invoegen"},"iframe":{"border":"Framerand tonen","noUrl":"Geef de IFrame URL in","scrolling":"Scrollbalken inschakelen","title":"IFrame eigenschappen","toolbar":"IFrame"},"image":{"alertUrl":"Geef de URL van de afbeelding","alt":"Alternatieve tekst","border":"Rand","btnUpload":"Naar server verzenden","button2Img":"Wilt u de geselecteerde afbeeldingsknop vervangen door een eenvoudige afbeelding?","hSpace":"HSpace","img2Button":"Wilt u de geselecteerde afbeelding vervangen door een afbeeldingsknop?","infoTab":"Informatie afbeelding","linkTab":"Link","lockRatio":"Afmetingen vergrendelen","menu":"Eigenschappen afbeelding","resetSize":"Afmetingen resetten","title":"Eigenschappen afbeelding","titleButton":"Eigenschappen afbeeldingsknop","upload":"Upload","urlMissing":"De URL naar de afbeelding ontbreekt.","vSpace":"VSpace","validateBorder":"Rand moet een heel nummer zijn.","validateHSpace":"HSpace moet een heel nummer zijn.","validateVSpace":"VSpace moet een heel nummer zijn."},"indent":{"indent":"Inspringing vergroten","outdent":"Inspringing verkleinen"},"smiley":{"options":"Smiley opties","title":"Smiley invoegen","toolbar":"Smiley"},"justify":{"block":"Uitvullen","center":"Centreren","left":"Links uitlijnen","right":"Rechts uitlijnen"},"link":{"acccessKey":"Toegangstoets","advanced":"Geavanceerd","advisoryContentType":"Aanbevolen content-type","advisoryTitle":"Adviserende titel","anchor":{"toolbar":"Interne link","menu":"Eigenschappen interne link","title":"Eigenschappen interne link","name":"Naam interne link","errorName":"Geef de naam van de interne link op","remove":"Interne link verwijderen"},"anchorId":"Op kenmerk interne link","anchorName":"Op naam interne link","charset":"Karakterset van gelinkte bron","cssClasses":"Stylesheet-klassen","emailAddress":"E-mailadres","emailBody":"Inhoud bericht","emailSubject":"Onderwerp bericht","id":"Id","info":"Linkomschrijving","langCode":"Taalcode","langDir":"Schrijfrichting","langDirLTR":"Links naar rechts (LTR)","langDirRTL":"Rechts naar links (RTL)","menu":"Link wijzigen","name":"Naam","noAnchors":"(Geen interne links in document gevonden)","noEmail":"Geef een e-mailadres","noUrl":"Geef de link van de URL","other":"<ander>","popupDependent":"Afhankelijk (Netscape)","popupFeatures":"Instellingen popupvenster","popupFullScreen":"Volledig scherm (IE)","popupLeft":"Positie links","popupLocationBar":"Locatiemenu","popupMenuBar":"Menubalk","popupResizable":"Herschaalbaar","popupScrollBars":"Schuifbalken","popupStatusBar":"Statusbalk","popupToolbar":"Werkbalk","popupTop":"Positie boven","rel":"Relatie","selectAnchor":"Kies een interne link","styles":"Stijl","tabIndex":"Tabvolgorde","target":"Doelvenster","targetFrame":"<frame>","targetFrameName":"Naam doelframe","targetPopup":"<popupvenster>","targetPopupName":"Naam popupvenster","title":"Link","toAnchor":"Interne link in pagina","toEmail":"E-mail","toUrl":"URL","toolbar":"Link invoegen/wijzigen","type":"Linktype","unlink":"Link verwijderen","upload":"Upload"},"list":{"bulletedlist":"Opsomming","numberedlist":"Genummerde lijst"},"liststyle":{"armenian":"Armeense nummering","bulletedTitle":"Eigenschappen lijst met opsommingstekens","circle":"Cirkel","decimal":"Cijfers (1, 2, 3, etc.)","decimalLeadingZero":"Cijfers beginnen met nul (01, 02, 03, etc.)","disc":"Schijf","georgian":"Georgische nummering (an, ban, gan, etc.)","lowerAlpha":"Kleine letters (a, b, c, d, e, etc.)","lowerGreek":"Grieks kleine letters (alpha, beta, gamma, etc.)","lowerRoman":"Romeins kleine letters (i, ii, iii, iv, v, etc.)","none":"Geen","notset":"<niet gezet>","numberedTitle":"Eigenschappen genummerde lijst","square":"Vierkant","start":"Start","type":"Type","upperAlpha":"Hoofdletters (A, B, C, D, E, etc.)","upperRoman":"Romeinse hoofdletters (I, II, III, IV, V, etc.)","validateStartNumber":"Startnummer van de lijst moet een heel nummer zijn."},"magicline":{"title":"Hier paragraaf invoeren"},"maximize":{"maximize":"Maximaliseren","minimize":"Minimaliseren"},"newpage":{"toolbar":"Nieuwe pagina"},"pagebreak":{"alt":"Pagina-einde","toolbar":"Pagina-einde invoegen"},"pastetext":{"button":"Plakken als platte tekst","title":"Plakken als platte tekst"},"pastefromword":{"confirmCleanup":"De tekst die u plakte lijkt gekopieerd te zijn vanuit Word. Wilt u de tekst opschonen voordat deze geplakt wordt?","error":"Het was niet mogelijk om de geplakte tekst op te schonen door een interne fout","title":"Plakken als Word-gegevens","toolbar":"Plakken als Word-gegevens"},"preview":{"preview":"Voorbeeld"},"print":{"toolbar":"Printen"},"removeformat":{"toolbar":"Opmaak verwijderen"},"save":{"toolbar":"Opslaan"},"selectall":{"toolbar":"Alles selecteren"},"showblocks":{"toolbar":"Toon blokken"},"sourcearea":{"toolbar":"Code"},"specialchar":{"options":"Speciale tekens opties","title":"Selecteer speciaal teken","toolbar":"Speciaal teken invoegen"},"scayt":{"about":"Over SCAYT","aboutTab":"Over","addWord":"Woord toevoegen","allCaps":"Negeer woorden helemaal in hoofdletters","dic_create":"Aanmaken","dic_delete":"Verwijderen","dic_field_name":"Naam woordenboek","dic_info":"Initieel wordt het gebruikerswoordenboek opgeslagen in een cookie. Cookies zijn echter beperkt in grootte. Zodra het gebruikerswoordenboek het punt bereikt waarop het niet meer in een cookie opgeslagen kan worden, dan wordt het woordenboek op de server opgeslagen. Om je persoonlijke woordenboek op je eigen server op te slaan, moet je een mapnaam opgeven. Indien je al een woordenboek hebt opgeslagen, typ dan de naam en klik op de Terugzetten knop.","dic_rename":"Hernoemen","dic_restore":"Terugzetten","dictionariesTab":"Woordenboeken","disable":"SCAYT uitschakelen","emptyDic":"De naam van het woordenboek mag niet leeg zijn.","enable":"SCAYT inschakelen","ignore":"Negeren","ignoreAll":"Alles negeren","ignoreDomainNames":"Negeer domeinnamen","langs":"Talen","languagesTab":"Talen","mixedCase":"Negeer woorden met hoofd- en kleine letters","mixedWithDigits":"Negeer woorden met cijfers","moreSuggestions":"Meer suggesties","opera_title":"Niet ondersteund door Opera","options":"Opties","optionsTab":"Opties","title":"Controleer de spelling tijdens het typen","toggle":"SCAYT in/uitschakelen","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stijl","panelTitle":"Opmaakstijlen","panelTitle1":"Blok stijlen","panelTitle2":"Inline stijlen","panelTitle3":"Object stijlen"},"table":{"border":"Breedte rand","caption":"Naam","cell":{"menu":"Cel","insertBefore":"Voeg cel in voor","insertAfter":"Voeg cel in achter","deleteCell":"Cellen verwijderen","merge":"Cellen samenvoegen","mergeRight":"Voeg samen naar rechts","mergeDown":"Voeg samen naar beneden","splitHorizontal":"Splits cellen horizontaal","splitVertical":"Splits cellen verticaal","title":"Cel eigenschappen","cellType":"Cel type","rowSpan":"Rijen samenvoegen","colSpan":"Kolommen samenvoegen","wordWrap":"Automatische terugloop","hAlign":"Horizontale uitlijning","vAlign":"Verticale uitlijning","alignBaseline":"Basislijn","bgColor":"Achtergrondkleur","borderColor":"Kleur rand","data":"Inhoud","header":"Kop","yes":"Ja","no":"Nee","invalidWidth":"De celbreedte moet een getal zijn.","invalidHeight":"De celhoogte moet een getal zijn.","invalidRowSpan":"Rijen samenvoegen moet een heel getal zijn.","invalidColSpan":"Kolommen samenvoegen moet een heel getal zijn.","chooseColor":"Kies"},"cellPad":"Ruimte in de cel","cellSpace":"Afstand tussen cellen","column":{"menu":"Kolom","insertBefore":"Voeg kolom in voor","insertAfter":"Voeg kolom in achter","deleteColumn":"Kolommen verwijderen"},"columns":"Kolommen","deleteTable":"Tabel verwijderen","headers":"Koppen","headersBoth":"Beide","headersColumn":"Eerste kolom","headersNone":"Geen","headersRow":"Eerste rij","invalidBorder":"De rand breedte moet een getal zijn.","invalidCellPadding":"Ruimte in de cel moet een getal zijn.","invalidCellSpacing":"Afstand tussen cellen moet een getal zijn.","invalidCols":"Het aantal kolommen moet een getal zijn groter dan 0.","invalidHeight":"De tabelhoogte moet een getal zijn.","invalidRows":"Het aantal rijen moet een getal zijn groter dan 0.","invalidWidth":"De tabelbreedte moet een getal zijn.","menu":"Eigenschappen tabel","row":{"menu":"Rij","insertBefore":"Voeg rij in voor","insertAfter":"Voeg rij in achter","deleteRow":"Rijen verwijderen"},"rows":"Rijen","summary":"Samenvatting","title":"Eigenschappen tabel","toolbar":"Tabel","widthPc":"procent","widthPx":"pixels","widthUnit":"eenheid breedte"},"undo":{"redo":"Opnieuw uitvoeren","undo":"Ongedaan maken"},"wsc":{"btnIgnore":"Negeren","btnIgnoreAll":"Alles negeren","btnReplace":"Vervangen","btnReplaceAll":"Alles vervangen","btnUndo":"Ongedaan maken","changeTo":"Wijzig in","errorLoading":"Er is een fout opgetreden bij het laden van de dienst: %s.","ieSpellDownload":"De spellingscontrole is niet geïnstalleerd. Wilt u deze nu downloaden?","manyChanges":"Klaar met spellingscontrole: %1 woorden aangepast","noChanges":"Klaar met spellingscontrole: geen woorden aangepast","noMispell":"Klaar met spellingscontrole: geen fouten gevonden","noSuggestions":"- Geen suggesties -","notAvailable":"Excuses, deze dienst is momenteel niet beschikbaar.","notInDic":"Niet in het woordenboek","oneChange":"Klaar met spellingscontrole: één woord aangepast","progress":"Bezig met spellingscontrole...","title":"Spellingscontrole","toolbar":"Spellingscontrole"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/no.js b/htmltest/sites/all/libraries/ckeditor-version/lang/no.js
new file mode 100644
index 00000000..fe98509f
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/no.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['no']={"editor":"Rikteksteditor","common":{"editorHelp":"Trykk ALT 0 for hjelp","browseServer":"Bla igjennom server","url":"URL","protocol":"Protokoll","upload":"Last opp","uploadSubmit":"Send det til serveren","image":"Bilde","flash":"Flash","form":"Skjema","checkbox":"Avmerkingsboks","radio":"Alternativknapp","textField":"Tekstboks","textarea":"Tekstområde","hiddenField":"Skjult felt","button":"Knapp","select":"Rullegardinliste","imageButton":"Bildeknapp","notSet":"<ikke satt>","id":"Id","name":"Navn","langDir":"Språkretning","langDirLtr":"Venstre til høyre (VTH)","langDirRtl":"Høyre til venstre (HTV)","langCode":"Språkkode","longDescr":"Utvidet beskrivelse","cssClass":"Stilarkklasser","advisoryTitle":"Tittel","cssStyle":"Stil","ok":"OK","cancel":"Avbryt","close":"Lukk","preview":"Forhåndsvis","resize":"Dra for å skalere","generalTab":"Generelt","advancedTab":"Avansert","validateNumberFailed":"Denne verdien er ikke et tall.","confirmNewPage":"Alle ulagrede endringer som er gjort i dette innholdet vil bli tapt. Er du sikker på at du vil laste en ny side?","confirmCancel":"Noen av valgene har blitt endret. Er du sikker på at du vil lukke dialogen?","options":"Valg","target":"Mål","targetNew":"Nytt vindu (_blank)","targetTop":"Hele vindu (_top)","targetSelf":"Samme vindu (_self)","targetParent":"Foreldrevindu (_parent)","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","styles":"Stil","cssClasses":"Stilarkklasser","width":"Bredde","height":"Høyde","align":"Juster","alignLeft":"Venstre","alignRight":"Høyre","alignCenter":"Midtjuster","alignTop":"Topp","alignMiddle":"Midten","alignBottom":"Bunn","invalidValue":"Ugyldig verdi.","invalidHeight":"Høyde må være et tall.","invalidWidth":"Bredde må være et tall.","invalidCssLength":"Den angitte verdien for feltet \"%1\" må være et positivt tall med eller uten en gyldig CSS-målingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Den angitte verdien for feltet \"%1\" må være et positivt tall med eller uten en gyldig HTML-målingsenhet (px eller %).","invalidInlineStyle":"Verdi angitt for inline stil må bestå av en eller flere sett med formatet \"navn : verdi\", separert med semikolon","cssLengthTooltip":"Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, utilgjenglig</span>"},"about":{"copy":"Copyright &copy; $1. Alle rettigheter reservert.","dlgTitle":"Om CKEditor","help":"Se $1 for hjelp.","moreInfo":"For lisensieringsinformasjon, vennligst besøk vårt nettsted:","title":"Om CKEditor","userGuide":"CKEditors brukerveiledning"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Gjennomstreking","subscript":"Senket skrift","superscript":"Hevet skrift","underline":"Understreking"},"bidi":{"ltr":"Tekstretning fra venstre til høyre","rtl":"Tekstretning fra høyre til venstre"},"blockquote":{"toolbar":"Blokksitat"},"clipboard":{"copy":"Kopier","copyError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).","cut":"Klipp ut","cutError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).","paste":"Lim inn","pasteArea":"Innlimingsområde","pasteMsg":"Vennligst lim inn i følgende boks med tastaturet (<STRONG>Ctrl/Cmd+V</STRONG>) og trykk <STRONG>OK</STRONG>.","securityMsg":"Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.","title":"Lim inn"},"colorbutton":{"auto":"Automatisk","bgColorTitle":"Bakgrunnsfarge","colors":{"000":"Svart","800000":"Rødbrun","8B4513":"Salbrun","2F4F4F":"Grønnsvart","008080":"Blågrønn","000080":"Marineblått","4B0082":"Indigo","696969":"Mørk grå","B22222":"Mørkerød","A52A2A":"Brun","DAA520":"Lys brun","006400":"Mørk grønn","40E0D0":"Turkis","0000CD":"Medium blå","800080":"Purpur","808080":"Grå","F00":"Rød","FF8C00":"Mørk oransje","FFD700":"Gull","008000":"Grønn","0FF":"Cyan","00F":"Blå","EE82EE":"Fiolett","A9A9A9":"Svak grå","FFA07A":"Rosa-oransje","FFA500":"Oransje","FFFF00":"Gul","00FF00":"Lime","AFEEEE":"Svak turkis","ADD8E6":"Lys Blå","DDA0DD":"Plomme","D3D3D3":"Lys grå","FFF0F5":"Svak lavendelrosa","FAEBD7":"Antikk-hvit","FFFFE0":"Lys gul","F0FFF0":"Honningmelon","F0FFFF":"Svakt asurblått","F0F8FF":"Svak cyan","E6E6FA":"Lavendel","FFF":"Hvit"},"more":"Flere farger...","panelTitle":"Farger","textColorTitle":"Tekstfarge"},"colordialog":{"clear":"Tøm","highlight":"Merk","options":"Alternativer for farge","selected":"Valgt","title":"Velg farge"},"templates":{"button":"Maler","emptyListMsg":"(Ingen maler definert)","insertOption":"Erstatt gjeldende innhold","options":"Alternativer for mal","selectPromptMsg":"Velg malen du vil åpne i redigeringsverktøyet:","title":"Innholdsmaler"},"contextmenu":{"options":"Alternativer for høyreklikkmeny"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Tittel","cssClassInputLabel":"Stilark-klasser","edit":"Rediger Div","inlineStyleInputLabel":"Inlinestiler","langDirLTRLabel":"Venstre til høyre (VTH)","langDirLabel":"Språkretning","langDirRTLLabel":"Høyre til venstre (HTV)","languageCodeInputLabel":" Språkkode","remove":"Fjern Div","styleSelectLabel":"Stil","title":"Sett inn Div Container","toolbar":"Sett inn Div Container"},"toolbar":{"toolbarCollapse":"Skjul verktøylinje","toolbarExpand":"Vis verktøylinje","toolbarGroups":{"document":"Dokument","clipboard":"Utklippstavle/Angre","editing":"Redigering","forms":"Skjema","basicstyles":"Basisstiler","paragraph":"Avsnitt","links":"Lenker","insert":"Innsetting","styles":"Stiler","colors":"Farger","tools":"Verktøy"},"toolbars":"Verktøylinjer for editor"},"elementspath":{"eleLabel":"Element-sti","eleTitle":"%1 element"},"find":{"find":"Søk","findOptions":"Søkealternativer","findWhat":"Søk etter:","matchCase":"Skill mellom store og små bokstaver","matchCyclic":"Søk i hele dokumentet","matchWord":"Bare hele ord","notFoundMsg":"Fant ikke søketeksten.","replace":"Erstatt","replaceAll":"Erstatt alle","replaceSuccessMsg":"%1 tilfelle(r) erstattet.","replaceWith":"Erstatt med:","title":"Søk og erstatt"},"fakeobjects":{"anchor":"Anker","flash":"Flash-animasjon","hiddenfield":"Skjult felt","iframe":"IFrame","unknown":"Ukjent objekt"},"flash":{"access":"Scripttilgang","accessAlways":"Alltid","accessNever":"Aldri","accessSameDomain":"Samme domene","alignAbsBottom":"Abs bunn","alignAbsMiddle":"Abs midten","alignBaseline":"Bunnlinje","alignTextTop":"Tekst topp","bgcolor":"Bakgrunnsfarge","chkFull":"Tillat fullskjerm","chkLoop":"Loop","chkMenu":"Slå på Flash-meny","chkPlay":"Autospill","flashvars":"Variabler for flash","hSpace":"HMarg","properties":"Egenskaper for Flash-objekt","propertiesTab":"Egenskaper","quality":"Kvalitet","qualityAutoHigh":"Auto høy","qualityAutoLow":"Auto lav","qualityBest":"Best","qualityHigh":"Høy","qualityLow":"Lav","qualityMedium":"Medium","scale":"Skaler","scaleAll":"Vis alt","scaleFit":"Skaler til å passe","scaleNoBorder":"Ingen ramme","title":"Flash-egenskaper","vSpace":"VMarg","validateHSpace":"HMarg må være et tall.","validateSrc":"Vennligst skriv inn lenkens url.","validateVSpace":"VMarg må være et tall.","windowMode":"Vindumodus","windowModeOpaque":"Opaque","windowModeTransparent":"Gjennomsiktig","windowModeWindow":"Vindu"},"font":{"fontSize":{"label":"Størrelse","voiceLabel":"Font Størrelse","panelTitle":"Størrelse"},"label":"Skrift","panelTitle":"Skrift","voiceLabel":"Font"},"forms":{"button":{"title":"Egenskaper for knapp","text":"Tekst (verdi)","type":"Type","typeBtn":"Knapp","typeSbm":"Send","typeRst":"Nullstill"},"checkboxAndRadio":{"checkboxTitle":"Egenskaper for avmerkingsboks","radioTitle":"Egenskaper for alternativknapp","value":"Verdi","selected":"Valgt"},"form":{"title":"Egenskaper for skjema","menu":"Egenskaper for skjema","action":"Handling","method":"Metode","encoding":"Encoding"},"hidden":{"title":"Egenskaper for skjult felt","name":"Navn","value":"Verdi"},"select":{"title":"Egenskaper for rullegardinliste","selectInfo":"Info","opAvail":"Tilgjenglige alternativer","value":"Verdi","size":"Størrelse","lines":"Linjer","chkMulti":"Tillat flervalg","opText":"Tekst","opValue":"Verdi","btnAdd":"Legg til","btnModify":"Endre","btnUp":"Opp","btnDown":"Ned","btnSetValue":"Sett som valgt","btnDelete":"Slett"},"textarea":{"title":"Egenskaper for tekstområde","cols":"Kolonner","rows":"Rader"},"textfield":{"title":"Egenskaper for tekstfelt","name":"Navn","value":"Verdi","charWidth":"Tegnbredde","maxChars":"Maks antall tegn","type":"Type","typeText":"Tekst","typePass":"Passord","typeEmail":"Epost","typeSearch":"Søk","typeTel":"Telefonnummer","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Avsnittsformat","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formatert"},"horizontalrule":{"toolbar":"Sett inn horisontal linje"},"iframe":{"border":"Viss ramme rundt iframe","noUrl":"Vennligst skriv inn URL for iframe","scrolling":"Aktiver scrollefelt","title":"Egenskaper for IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Vennligst skriv bilde-urlen","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Send det til serveren","button2Img":"Vil du endre den valgte bildeknappen til et vanlig bilde?","hSpace":"HMarg","img2Button":"Vil du endre det valgte bildet til en bildeknapp?","infoTab":"Bildeinformasjon","linkTab":"Lenke","lockRatio":"Lås forhold","menu":"Bildeegenskaper","resetSize":"Tilbakestill størrelse","title":"Bildeegenskaper","titleButton":"Egenskaper for bildeknapp","upload":"Last opp","urlMissing":"Bildets adresse mangler.","vSpace":"VMarg","validateBorder":"Ramme må være et heltall.","validateHSpace":"HMarg må være et heltall.","validateVSpace":"VMarg må være et heltall."},"indent":{"indent":"Øk innrykk","outdent":"Reduser innrykk"},"smiley":{"options":"Alternativer for smil","title":"Sett inn smil","toolbar":"Smil"},"justify":{"block":"Blokkjuster","center":"Midtstill","left":"Venstrejuster","right":"Høyrejuster"},"link":{"acccessKey":"Aksessknapp","advanced":"Avansert","advisoryContentType":"Type","advisoryTitle":"Tittel","anchor":{"toolbar":"Sett inn/Rediger anker","menu":"Egenskaper for anker","title":"Egenskaper for anker","name":"Ankernavn","errorName":"Vennligst skriv inn ankernavnet","remove":"Fjern anker"},"anchorId":"Element etter ID","anchorName":"Anker etter navn","charset":"Lenket tegnsett","cssClasses":"Stilarkklasser","emailAddress":"E-postadresse","emailBody":"Melding","emailSubject":"Meldingsemne","id":"Id","info":"Lenkeinfo","langCode":"Språkkode","langDir":"Språkretning","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","menu":"Rediger lenke","name":"Navn","noAnchors":"(Ingen anker i dokumentet)","noEmail":"Vennligst skriv inn e-postadressen","noUrl":"Vennligst skriv inn lenkens URL","other":"<annen>","popupDependent":"Avhenging (Netscape)","popupFeatures":"Egenskaper for popup-vindu","popupFullScreen":"Fullskjerm (IE)","popupLeft":"Venstre posisjon","popupLocationBar":"Adresselinje","popupMenuBar":"Menylinje","popupResizable":"Skalerbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Verktøylinje","popupTop":"Topp-posisjon","rel":"Relasjon (rel)","selectAnchor":"Velg et anker","styles":"Stil","tabIndex":"Tabindeks","target":"Mål","targetFrame":"<ramme>","targetFrameName":"Målramme","targetPopup":"<popup-vindu>","targetPopupName":"Navn på popup-vindu","title":"Lenke","toAnchor":"Lenke til anker i teksten","toEmail":"E-post","toUrl":"URL","toolbar":"Sett inn/Rediger lenke","type":"Lenketype","unlink":"Fjern lenke","upload":"Last opp"},"list":{"bulletedlist":"Legg til/Fjern punktmerket liste","numberedlist":"Legg til/Fjern nummerert liste"},"liststyle":{"armenian":"Armensk nummerering","bulletedTitle":"Egenskaper for punktmerket liste","circle":"Sirkel","decimal":"Tall (1, 2, 3, osv.)","decimalLeadingZero":"Tall, med førstesiffer null (01, 02, 03, osv.)","disc":"Disk","georgian":"Georgisk nummerering (an, ban, gan, osv.)","lowerAlpha":"Alfabetisk, små (a, b, c, d, e, osv.)","lowerGreek":"Gresk, små (alpha, beta, gamma, osv.)","lowerRoman":"Romertall, små (i, ii, iii, iv, v, osv.)","none":"Ingen","notset":"<ikke satt>","numberedTitle":"Egenskaper for nummerert liste","square":"Firkant","start":"Start","type":"Type","upperAlpha":"Alfabetisk, store (A, B, C, D, E, osv.)","upperRoman":"Romertall, store (I, II, III, IV, V, osv.)","validateStartNumber":"Starten på listen må være et heltall."},"magicline":{"title":"Sett inn nytt avsnitt her"},"maximize":{"maximize":"Maksimer","minimize":"Minimer"},"newpage":{"toolbar":"Ny side"},"pagebreak":{"alt":"Sideskift","toolbar":"Sett inn sideskift for utskrift"},"pastetext":{"button":"Lim inn som ren tekst","title":"Lim inn som ren tekst"},"pastefromword":{"confirmCleanup":"Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?","error":"Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil","title":"Lim inn fra Word","toolbar":"Lim inn fra Word"},"preview":{"preview":"Forhåndsvis"},"print":{"toolbar":"Skriv ut"},"removeformat":{"toolbar":"Fjern formatering"},"save":{"toolbar":"Lagre"},"selectall":{"toolbar":"Merk alt"},"showblocks":{"toolbar":"Vis blokker"},"sourcearea":{"toolbar":"Kilde"},"specialchar":{"options":"Alternativer for spesialtegn","title":"Velg spesialtegn","toolbar":"Sett inn spesialtegn"},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Legg til ord","allCaps":"Ikke kontroller ord med kun store bokstaver","dic_create":"Opprett","dic_delete":"Slett","dic_field_name":"Ordboknavn","dic_info":"Brukerordboken lagres først i en informasjonskapsel på din maskin, men det er en begrensning på hvor mye som kan lagres her. Når ordboken blir for stor til å lagres i en informasjonskapsel, vil vi i stedet lagre ordboken på vår server. For å lagre din personlige ordbok på vår server, burde du velge et navn for ordboken din. Hvis du allerede har lagret en ordbok, vennligst skriv inn ordbokens navn og klikk på Gjenopprett-knappen.","dic_rename":"Gi nytt navn","dic_restore":"Gjenopprett","dictionariesTab":"Ordbøker","disable":"Slå av SCAYT","emptyDic":"Ordboknavn bør ikke være tom.","enable":"Slå på SCAYT","ignore":"Ignorer","ignoreAll":"Ignorer Alle","ignoreDomainNames":"Ikke kontroller domenenavn","langs":"Språk","languagesTab":"Språk","mixedCase":"Ikke kontroller ord med blandet små og store bokstaver","mixedWithDigits":"Ikke kontroller ord som inneholder tall","moreSuggestions":"Flere forslag","opera_title":"Ikke støttet av Opera","options":"Valg","optionsTab":"Valg","title":"Stavekontroll mens du skriver","toggle":"Veksle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Stilformater","panelTitle1":"Blokkstiler","panelTitle2":"Inlinestiler","panelTitle3":"Objektstiler"},"table":{"border":"Rammestørrelse","caption":"Tittel","cell":{"menu":"Celle","insertBefore":"Sett inn celle før","insertAfter":"Sett inn celle etter","deleteCell":"Slett celler","merge":"Slå sammen celler","mergeRight":"Slå sammen høyre","mergeDown":"Slå sammen ned","splitHorizontal":"Del celle horisontalt","splitVertical":"Del celle vertikalt","title":"Celleegenskaper","cellType":"Celletype","rowSpan":"Radspenn","colSpan":"Kolonnespenn","wordWrap":"Tekstbrytning","hAlign":"Horisontal justering","vAlign":"Vertikal justering","alignBaseline":"Grunnlinje","bgColor":"Bakgrunnsfarge","borderColor":"Rammefarge","data":"Data","header":"Overskrift","yes":"Ja","no":"Nei","invalidWidth":"Cellebredde må være et tall.","invalidHeight":"Cellehøyde må være et tall.","invalidRowSpan":"Radspenn må være et heltall.","invalidColSpan":"Kolonnespenn må være et heltall.","chooseColor":"Velg"},"cellPad":"Cellepolstring","cellSpace":"Cellemarg","column":{"menu":"Kolonne","insertBefore":"Sett inn kolonne før","insertAfter":"Sett inn kolonne etter","deleteColumn":"Slett kolonner"},"columns":"Kolonner","deleteTable":"Slett tabell","headers":"Overskrifter","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første rad","invalidBorder":"Rammestørrelse må være et tall.","invalidCellPadding":"Cellepolstring må være et positivt tall.","invalidCellSpacing":"Cellemarg må være et positivt tall.","invalidCols":"Antall kolonner må være et tall større enn 0.","invalidHeight":"Tabellhøyde må være et tall.","invalidRows":"Antall rader må være et tall større enn 0.","invalidWidth":"Tabellbredde må være et tall.","menu":"Egenskaper for tabell","row":{"menu":"Rader","insertBefore":"Sett inn rad før","insertAfter":"Sett inn rad etter","deleteRow":"Slett rader"},"rows":"Rader","summary":"Sammendrag","title":"Egenskaper for tabell","toolbar":"Tabell","widthPc":"prosent","widthPx":"piksler","widthUnit":"Bredde-enhet"},"undo":{"redo":"Gjør om","undo":"Angre"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer alle","btnReplace":"Erstatt","btnReplaceAll":"Erstatt alle","btnUndo":"Angre","changeTo":"Endre til","errorLoading":"Feil under lasting av applikasjonstjenestetjener: %s.","ieSpellDownload":"Stavekontroll er ikke installert. Vil du laste den ned nå?","manyChanges":"Stavekontroll fullført: %1 ord endret","noChanges":"Stavekontroll fullført: ingen ord endret","noMispell":"Stavekontroll fullført: ingen feilstavinger funnet","noSuggestions":"- Ingen forslag -","notAvailable":"Beklager, tjenesten er utilgjenglig nå.","notInDic":"Ikke i ordboken","oneChange":"Stavekontroll fullført: Ett ord endret","progress":"Stavekontroll pågår...","title":"Stavekontroll","toolbar":"Stavekontroll"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/pl.js b/htmltest/sites/all/libraries/ckeditor-version/lang/pl.js
new file mode 100644
index 00000000..c9fc632d
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/pl.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['pl']={"editor":"Edytor tekstu sformatowanego","common":{"editorHelp":"W celu uzyskania pomocy naciśnij ALT 0","browseServer":"Przeglądaj","url":"Adres URL","protocol":"Protokół","upload":"Wyślij","uploadSubmit":"Wyślij","image":"Obrazek","flash":"Flash","form":"Formularz","checkbox":"Pole wyboru (checkbox)","radio":"Przycisk opcji (radio)","textField":"Pole tekstowe","textarea":"Obszar tekstowy","hiddenField":"Pole ukryte","button":"Przycisk","select":"Lista wyboru","imageButton":"Przycisk graficzny","notSet":"<nie ustawiono>","id":"Id","name":"Nazwa","langDir":"Kierunek tekstu","langDirLtr":"Od lewej do prawej (LTR)","langDirRtl":"Od prawej do lewej (RTL)","langCode":"Kod języka","longDescr":"Adres URL długiego opisu","cssClass":"Nazwa klasy CSS","advisoryTitle":"Opis obiektu docelowego","cssStyle":"Styl","ok":"OK","cancel":"Anuluj","close":"Zamknij","preview":"Podgląd","resize":"Przeciągnij, aby zmienić rozmiar","generalTab":"Ogólne","advancedTab":"Zaawansowane","validateNumberFailed":"Ta wartość nie jest liczbą.","confirmNewPage":"Wszystkie niezapisane zmiany zostaną utracone. Czy na pewno wczytać nową stronę?","confirmCancel":"Pewne opcje zostały zmienione. Czy na pewno zamknąć okno dialogowe?","options":"Opcje","target":"Obiekt docelowy","targetNew":"Nowe okno (_blank)","targetTop":"Okno najwyżej w hierarchii (_top)","targetSelf":"To samo okno (_self)","targetParent":"Okno nadrzędne (_parent)","langDirLTR":"Od lewej do prawej (LTR)","langDirRTL":"Od prawej do lewej (RTL)","styles":"Style","cssClasses":"Klasy arkusza stylów","width":"Szerokość","height":"Wysokość","align":"Wyrównaj","alignLeft":"Do lewej","alignRight":"Do prawej","alignCenter":"Do środka","alignTop":"Do góry","alignMiddle":"Do środka","alignBottom":"Do dołu","invalidValue":"Nieprawidłowa wartość.","invalidHeight":"Wysokość musi być liczbą.","invalidWidth":"Szerokość musi być liczbą.","invalidCssLength":"Wartość podana dla pola \"%1\" musi być liczbą dodatnią bez jednostki lub z poprawną jednostką długości zgodną z CSS (px, %, in, cm, mm, em, ex, pt lub pc).","invalidHtmlLength":"Wartość podana dla pola \"%1\" musi być liczbą dodatnią bez jednostki lub z poprawną jednostką długości zgodną z HTML (px lub %).","invalidInlineStyle":"Wartość podana dla stylu musi składać się z jednej lub większej liczby krotek w formacie \"nazwa : wartość\", rozdzielonych średnikami.","cssLengthTooltip":"Wpisz liczbę dla wartości w pikselach lub liczbę wraz z jednostką długości zgodną z CSS (px, %, in, cm, mm, em, ex, pt lub pc).","unavailable":"%1<span class=\"cke_accessibility\">, niedostępne</span>"},"about":{"copy":"Copyright &copy; $1. Wszelkie prawa zastrzeżone.","dlgTitle":"Informacje o programie CKEditor","help":"Pomoc znajdziesz w $1.","moreInfo":"Informacje na temat licencji można znaleźć na naszej stronie:","title":"Informacje o programie CKEditor","userGuide":"podręczniku użytkownika programu CKEditor"},"basicstyles":{"bold":"Pogrubienie","italic":"Kursywa","strike":"Przekreślenie","subscript":"Indeks dolny","superscript":"Indeks górny","underline":"Podkreślenie"},"bidi":{"ltr":"Kierunek tekstu od lewej strony do prawej","rtl":"Kierunek tekstu od prawej strony do lewej"},"blockquote":{"toolbar":"Cytat"},"clipboard":{"copy":"Kopiuj","copyError":"Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne kopiowanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+C.","cut":"Wytnij","cutError":"Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne wycinanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+X.","paste":"Wklej","pasteArea":"Obszar wklejania","pasteMsg":"Wklej tekst w poniższym polu, używając skrótu klawiaturowego (<STRONG>Ctrl/Cmd+V</STRONG>), i kliknij <STRONG>OK</STRONG>.","securityMsg":"Zabezpieczenia przeglądarki uniemożliwiają wklejenie danych bezpośrednio do edytora. Proszę ponownie wkleić dane w tym oknie.","title":"Wklej"},"colorbutton":{"auto":"Automatycznie","bgColorTitle":"Kolor tła","colors":{"000":"Czarny","800000":"Kasztanowy","8B4513":"Czekoladowy","2F4F4F":"Ciemnografitowy","008080":"Morski","000080":"Granatowy","4B0082":"Indygo","696969":"Ciemnoszary","B22222":"Czerwień żelazowa","A52A2A":"Brązowy","DAA520":"Ciemnozłoty","006400":"Ciemnozielony","40E0D0":"Turkusowy","0000CD":"Ciemnoniebieski","800080":"Purpurowy","808080":"Szary","F00":"Czerwony","FF8C00":"Ciemnopomarańczowy","FFD700":"Złoty","008000":"Zielony","0FF":"Cyjan","00F":"Niebieski","EE82EE":"Fioletowy","A9A9A9":"Przygaszony szary","FFA07A":"Łososiowy","FFA500":"Pomarańczowy","FFFF00":"Żółty","00FF00":"Limonkowy","AFEEEE":"Bladoturkusowy","ADD8E6":"Jasnoniebieski","DDA0DD":"Śliwkowy","D3D3D3":"Jasnoszary","FFF0F5":"Jasnolawendowy","FAEBD7":"Kremowobiały","FFFFE0":"Jasnożółty","F0FFF0":"Bladozielony","F0FFFF":"Jasnolazurowy","F0F8FF":"Jasnobłękitny","E6E6FA":"Lawendowy","FFF":"Biały"},"more":"Więcej kolorów...","panelTitle":"Kolory","textColorTitle":"Kolor tekstu"},"colordialog":{"clear":"Wyczyść","highlight":"Zaznacz","options":"Opcje koloru","selected":"Wybrany","title":"Wybierz kolor"},"templates":{"button":"Szablony","emptyListMsg":"(Brak zdefiniowanych szablonów)","insertOption":"Zastąp obecną zawartość","options":"Opcje szablonów","selectPromptMsg":"Wybierz szablon do otwarcia w edytorze<br>(obecna zawartość okna edytora zostanie utracona):","title":"Szablony zawartości"},"contextmenu":{"options":"Opcje menu kontekstowego"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Opis obiektu docelowego","cssClassInputLabel":"Klasy arkusza stylów","edit":"Edytuj pojemnik Div","inlineStyleInputLabel":"Style liniowe","langDirLTRLabel":"Od lewej do prawej (LTR)","langDirLabel":"Kierunek tekstu","langDirRTLLabel":"Od prawej do lewej (RTL)","languageCodeInputLabel":"Kod języka","remove":"Usuń pojemnik Div","styleSelectLabel":"Styl","title":"Utwórz pojemnik Div","toolbar":"Utwórz pojemnik Div"},"toolbar":{"toolbarCollapse":"Zwiń pasek narzędzi","toolbarExpand":"Rozwiń pasek narzędzi","toolbarGroups":{"document":"Dokument","clipboard":"Schowek/Wstecz","editing":"Edycja","forms":"Formularze","basicstyles":"Style podstawowe","paragraph":"Akapit","links":"Hiperłącza","insert":"Wstawianie","styles":"Style","colors":"Kolory","tools":"Narzędzia"},"toolbars":"Paski narzędzi edytora"},"elementspath":{"eleLabel":"Ścieżka elementów","eleTitle":"element %1"},"find":{"find":"Znajdź","findOptions":"Opcje wyszukiwania","findWhat":"Znajdź:","matchCase":"Uwzględnij wielkość liter","matchCyclic":"Cykliczne dopasowanie","matchWord":"Całe słowa","notFoundMsg":"Nie znaleziono szukanego hasła.","replace":"Zamień","replaceAll":"Zamień wszystko","replaceSuccessMsg":"%1 wystąpień zastąpionych.","replaceWith":"Zastąp przez:","title":"Znajdź i zamień"},"fakeobjects":{"anchor":"Kotwica","flash":"Animacja Flash","hiddenfield":"Pole ukryte","iframe":"IFrame","unknown":"Nieznany obiekt"},"flash":{"access":"Dostęp skryptów","accessAlways":"Zawsze","accessNever":"Nigdy","accessSameDomain":"Ta sama domena","alignAbsBottom":"Do dołu","alignAbsMiddle":"Do środka w pionie","alignBaseline":"Do linii bazowej","alignTextTop":"Do góry tekstu","bgcolor":"Kolor tła","chkFull":"Zezwól na pełny ekran","chkLoop":"Pętla","chkMenu":"Włącz menu","chkPlay":"Autoodtwarzanie","flashvars":"Zmienne obiektu Flash","hSpace":"Odstęp poziomy","properties":"Właściwości obiektu Flash","propertiesTab":"Właściwości","quality":"Jakość","qualityAutoHigh":"Auto wysoka","qualityAutoLow":"Auto niska","qualityBest":"Najlepsza","qualityHigh":"Wysoka","qualityLow":"Niska","qualityMedium":"Średnia","scale":"Skaluj","scaleAll":"Pokaż wszystko","scaleFit":"Dokładne dopasowanie","scaleNoBorder":"Bez obramowania","title":"Właściwości obiektu Flash","vSpace":"Odstęp pionowy","validateHSpace":"Odstęp poziomy musi być liczbą.","validateSrc":"Podaj adres URL","validateVSpace":"Odstęp pionowy musi być liczbą.","windowMode":"Tryb okna","windowModeOpaque":"Nieprzezroczyste","windowModeTransparent":"Przezroczyste","windowModeWindow":"Okno"},"font":{"fontSize":{"label":"Rozmiar","voiceLabel":"Rozmiar czcionki","panelTitle":"Rozmiar"},"label":"Czcionka","panelTitle":"Czcionka","voiceLabel":"Czcionka"},"forms":{"button":{"title":"Właściwości przycisku","text":"Tekst (Wartość)","type":"Typ","typeBtn":"Przycisk","typeSbm":"Wyślij","typeRst":"Wyczyść"},"checkboxAndRadio":{"checkboxTitle":"Właściwości pola wyboru (checkbox)","radioTitle":"Właściwości przycisku opcji (radio)","value":"Wartość","selected":"Zaznaczone"},"form":{"title":"Właściwości formularza","menu":"Właściwości formularza","action":"Akcja","method":"Metoda","encoding":"Kodowanie"},"hidden":{"title":"Właściwości pola ukrytego","name":"Nazwa","value":"Wartość"},"select":{"title":"Właściwości listy wyboru","selectInfo":"Informacje","opAvail":"Dostępne opcje","value":"Wartość","size":"Rozmiar","lines":"wierszy","chkMulti":"Wielokrotny wybór","opText":"Tekst","opValue":"Wartość","btnAdd":"Dodaj","btnModify":"Zmień","btnUp":"Do góry","btnDown":"Do dołu","btnSetValue":"Ustaw jako zaznaczoną","btnDelete":"Usuń"},"textarea":{"title":"Właściwości obszaru tekstowego","cols":"Liczba kolumn","rows":"Liczba wierszy"},"textfield":{"title":"Właściwości pola tekstowego","name":"Nazwa","value":"Wartość","charWidth":"Szerokość w znakach","maxChars":"Szerokość maksymalna","type":"Typ","typeText":"Tekst","typePass":"Hasło","typeEmail":"Email","typeSearch":"Szukaj","typeTel":"Numer telefonu","typeUrl":"Adres URL"}},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adres","tag_div":"Normalny (DIV)","tag_h1":"Nagłówek 1","tag_h2":"Nagłówek 2","tag_h3":"Nagłówek 3","tag_h4":"Nagłówek 4","tag_h5":"Nagłówek 5","tag_h6":"Nagłówek 6","tag_p":"Normalny","tag_pre":"Tekst sformatowany"},"horizontalrule":{"toolbar":"Wstaw poziomą linię"},"iframe":{"border":"Pokaż obramowanie obiektu IFrame","noUrl":"Podaj adres URL elementu IFrame","scrolling":"Włącz paski przewijania","title":"Właściwości elementu IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Podaj adres obrazka.","alt":"Tekst zastępczy","border":"Obramowanie","btnUpload":"Wyślij","button2Img":"Czy chcesz przekonwertować zaznaczony przycisk graficzny do zwykłego obrazka?","hSpace":"Odstęp poziomy","img2Button":"Czy chcesz przekonwertować zaznaczony obrazek do przycisku graficznego?","infoTab":"Informacje o obrazku","linkTab":"Hiperłącze","lockRatio":"Zablokuj proporcje","menu":"Właściwości obrazka","resetSize":"Przywróć rozmiar","title":"Właściwości obrazka","titleButton":"Właściwości przycisku graficznego","upload":"Wyślij","urlMissing":"Podaj adres URL obrazka.","vSpace":"Odstęp pionowy","validateBorder":"Wartość obramowania musi być liczbą całkowitą.","validateHSpace":"Wartość odstępu poziomego musi być liczbą całkowitą.","validateVSpace":"Wartość odstępu pionowego musi być liczbą całkowitą."},"indent":{"indent":"Zwiększ wcięcie","outdent":"Zmniejsz wcięcie"},"smiley":{"options":"Opcje emotikonów","title":"Wstaw emotikona","toolbar":"Emotikony"},"justify":{"block":"Wyjustuj","center":"Wyśrodkuj","left":"Wyrównaj do lewej","right":"Wyrównaj do prawej"},"link":{"acccessKey":"Klawisz dostępu","advanced":"Zaawansowane","advisoryContentType":"Typ MIME obiektu docelowego","advisoryTitle":"Opis obiektu docelowego","anchor":{"toolbar":"Wstaw/edytuj kotwicę","menu":"Właściwości kotwicy","title":"Właściwości kotwicy","name":"Nazwa kotwicy","errorName":"Wpisz nazwę kotwicy","remove":"Usuń kotwicę"},"anchorId":"Wg identyfikatora","anchorName":"Wg nazwy","charset":"Kodowanie znaków obiektu docelowego","cssClasses":"Nazwa klasy CSS","emailAddress":"Adres e-mail","emailBody":"Treść","emailSubject":"Temat","id":"Id","info":"Informacje ","langCode":"Kod języka","langDir":"Kierunek tekstu","langDirLTR":"Od lewej do prawej (LTR)","langDirRTL":"Od prawej do lewej (RTL)","menu":"Edytuj odnośnik","name":"Nazwa","noAnchors":"(W dokumencie nie zdefiniowano żadnych kotwic)","noEmail":"Podaj adres e-mail","noUrl":"Podaj adres URL","other":"<inny>","popupDependent":"Okno zależne (Netscape)","popupFeatures":"Właściwości wyskakującego okna","popupFullScreen":"Pełny ekran (IE)","popupLeft":"Pozycja w poziomie","popupLocationBar":"Pasek adresu","popupMenuBar":"Pasek menu","popupResizable":"Skalowalny","popupScrollBars":"Paski przewijania","popupStatusBar":"Pasek statusu","popupToolbar":"Pasek narzędzi","popupTop":"Pozycja w pionie","rel":"Relacja","selectAnchor":"Wybierz kotwicę","styles":"Styl","tabIndex":"Indeks kolejności","target":"Obiekt docelowy","targetFrame":"<ramka>","targetFrameName":"Nazwa ramki docelowej","targetPopup":"<wyskakujące okno>","targetPopupName":"Nazwa wyskakującego okna","title":"Odnośnik","toAnchor":"Odnośnik wewnątrz strony (kotwica)","toEmail":"Adres e-mail","toUrl":"Adres URL","toolbar":"Wstaw/edytuj odnośnik","type":"Typ odnośnika","unlink":"Usuń odnośnik","upload":"Wyślij"},"list":{"bulletedlist":"Lista wypunktowana","numberedlist":"Lista numerowana"},"liststyle":{"armenian":"Numerowanie armeńskie","bulletedTitle":"Właściwości list wypunktowanych","circle":"Koło","decimal":"Liczby (1, 2, 3 itd.)","decimalLeadingZero":"Liczby z początkowym zerem (01, 02, 03 itd.)","disc":"Okrąg","georgian":"Numerowanie gruzińskie (an, ban, gan itd.)","lowerAlpha":"Małe litery (a, b, c, d, e itd.)","lowerGreek":"Małe litery greckie (alpha, beta, gamma itd.)","lowerRoman":"Małe cyfry rzymskie (i, ii, iii, iv, v itd.)","none":"Brak","notset":"<nie ustawiono>","numberedTitle":"Właściwości list numerowanych","square":"Kwadrat","start":"Początek","type":"Typ punktora","upperAlpha":"Duże litery (A, B, C, D, E itd.)","upperRoman":"Duże cyfry rzymskie (I, II, III, IV, V itd.)","validateStartNumber":"Listę musi rozpoczynać liczba całkowita."},"magicline":{"title":"Wstaw nowy akapit"},"maximize":{"maximize":"Maksymalizuj","minimize":"Minimalizuj"},"newpage":{"toolbar":"Nowa strona"},"pagebreak":{"alt":"Wstaw podział strony","toolbar":"Wstaw podział strony"},"pastetext":{"button":"Wklej jako czysty tekst","title":"Wklej jako czysty tekst"},"pastefromword":{"confirmCleanup":"Tekst, który chcesz wkleić, prawdopodobnie pochodzi z programu Microsoft Word. Czy chcesz go wyczyścić przed wklejeniem?","error":"Wyczyszczenie wklejonych danych nie było możliwe z powodu wystąpienia błędu.","title":"Wklej z programu MS Word","toolbar":"Wklej z programu MS Word"},"preview":{"preview":"Podgląd"},"print":{"toolbar":"Drukuj"},"removeformat":{"toolbar":"Usuń formatowanie"},"save":{"toolbar":"Zapisz"},"selectall":{"toolbar":"Zaznacz wszystko"},"showblocks":{"toolbar":"Pokaż bloki"},"sourcearea":{"toolbar":"Źródło dokumentu"},"specialchar":{"options":"Opcje znaków specjalnych","title":"Wybierz znak specjalny","toolbar":"Wstaw znak specjalny"},"scayt":{"about":"Informacje o SCAYT","aboutTab":"Informacje o SCAYT","addWord":"Dodaj słowo","allCaps":"Ignoruj wyrazy pisane dużymi literami","dic_create":"Utwórz","dic_delete":"Usuń","dic_field_name":"Nazwa słownika","dic_info":"Początkowo słownik użytkownika przechowywany jest w cookie. Pliki cookie mają jednak ograniczoną pojemność. Jeśli słownik użytkownika przekroczy wielkość dopuszczalną dla pliku cookie, możliwe jest przechowanie go na naszym serwerze. W celu zapisania słownika na serwerze niezbędne jest nadanie mu nazwy. Jeśli słownik został już zapisany na serwerze, wystarczy podać jego nazwę i nacisnąć przycisk Przywróć.","dic_rename":"Zmień nazwę","dic_restore":"Przywróć","dictionariesTab":"Słowniki","disable":"Wyłącz SCAYT","emptyDic":"Nazwa słownika nie może być pusta.","enable":"Włącz SCAYT","ignore":"Ignoruj","ignoreAll":"Ignoruj wszystkie","ignoreDomainNames":"Ignoruj nazwy domen","langs":"Języki","languagesTab":"Języki","mixedCase":"Ignoruj wyrazy pisane dużymi i małymi literami","mixedWithDigits":"Ignoruj wyrazy zawierające cyfry","moreSuggestions":"Więcej sugestii","opera_title":"Funkcja nie jest obsługiwana przez przeglądarkę Opera","options":"Opcje","optionsTab":"Opcje","title":"Sprawdź pisownię podczas pisania (SCAYT)","toggle":"Przełącz SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styl","panelTitle":"Style formatujące","panelTitle1":"Style blokowe","panelTitle2":"Style liniowe","panelTitle3":"Style obiektowe"},"table":{"border":"Grubość obramowania","caption":"Tytuł","cell":{"menu":"Komórka","insertBefore":"Wstaw komórkę z lewej","insertAfter":"Wstaw komórkę z prawej","deleteCell":"Usuń komórki","merge":"Połącz komórki","mergeRight":"Połącz z komórką z prawej","mergeDown":"Połącz z komórką poniżej","splitHorizontal":"Podziel komórkę poziomo","splitVertical":"Podziel komórkę pionowo","title":"Właściwości komórki","cellType":"Typ komórki","rowSpan":"Scalenie wierszy","colSpan":"Scalenie komórek","wordWrap":"Zawijanie słów","hAlign":"Wyrównanie poziome","vAlign":"Wyrównanie pionowe","alignBaseline":"Linia bazowa","bgColor":"Kolor tła","borderColor":"Kolor obramowania","data":"Dane","header":"Nagłówek","yes":"Tak","no":"Nie","invalidWidth":"Szerokość komórki musi być liczbą.","invalidHeight":"Wysokość komórki musi być liczbą.","invalidRowSpan":"Scalenie wierszy musi być liczbą całkowitą.","invalidColSpan":"Scalenie komórek musi być liczbą całkowitą.","chooseColor":"Wybierz"},"cellPad":"Dopełnienie komórek","cellSpace":"Odstęp pomiędzy komórkami","column":{"menu":"Kolumna","insertBefore":"Wstaw kolumnę z lewej","insertAfter":"Wstaw kolumnę z prawej","deleteColumn":"Usuń kolumny"},"columns":"Liczba kolumn","deleteTable":"Usuń tabelę","headers":"Nagłówki","headersBoth":"Oba","headersColumn":"Pierwsza kolumna","headersNone":"Brak","headersRow":"Pierwszy wiersz","invalidBorder":"Wartość obramowania musi być liczbą.","invalidCellPadding":"Dopełnienie komórek musi być liczbą dodatnią.","invalidCellSpacing":"Odstęp pomiędzy komórkami musi być liczbą dodatnią.","invalidCols":"Liczba kolumn musi być większa niż 0.","invalidHeight":"Wysokość tabeli musi być liczbą.","invalidRows":"Liczba wierszy musi być większa niż 0.","invalidWidth":"Szerokość tabeli musi być liczbą.","menu":"Właściwości tabeli","row":{"menu":"Wiersz","insertBefore":"Wstaw wiersz powyżej","insertAfter":"Wstaw wiersz poniżej","deleteRow":"Usuń wiersze"},"rows":"Liczba wierszy","summary":"Podsumowanie","title":"Właściwości tabeli","toolbar":"Tabela","widthPc":"%","widthPx":"piksele","widthUnit":"jednostka szerokości"},"undo":{"redo":"Ponów","undo":"Cofnij"},"wsc":{"btnIgnore":"Ignoruj","btnIgnoreAll":"Ignoruj wszystkie","btnReplace":"Zmień","btnReplaceAll":"Zmień wszystkie","btnUndo":"Cofnij","changeTo":"Zmień na","errorLoading":"Błąd wczytywania hosta aplikacji usługi: %s.","ieSpellDownload":"Słownik nie jest zainstalowany. Czy chcesz go pobrać?","manyChanges":"Sprawdzanie zakończone: zmieniono %l słów","noChanges":"Sprawdzanie zakończone: nie zmieniono żadnego słowa","noMispell":"Sprawdzanie zakończone: nie znaleziono błędów","noSuggestions":"- Brak sugestii -","notAvailable":"Przepraszamy, ale usługa jest obecnie niedostępna.","notInDic":"Słowa nie ma w słowniku","oneChange":"Sprawdzanie zakończone: zmieniono jedno słowo","progress":"Trwa sprawdzanie...","title":"Sprawdź pisownię","toolbar":"Sprawdź pisownię"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/pt-br.js b/htmltest/sites/all/libraries/ckeditor-version/lang/pt-br.js
new file mode 100644
index 00000000..3b0bca8c
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/pt-br.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['pt-br']={"editor":"Editor de Texto","common":{"editorHelp":"Pressione ALT+0 para ajuda","browseServer":"Localizar no Servidor","url":"URL","protocol":"Protocolo","upload":"Enviar ao Servidor","uploadSubmit":"Enviar para o Servidor","image":"Imagem","flash":"Flash","form":"Formulário","checkbox":"Caixa de Seleção","radio":"Botão de Opção","textField":"Caixa de Texto","textarea":"Área de Texto","hiddenField":"Campo Oculto","button":"Botão","select":"Caixa de Listagem","imageButton":"Botão de Imagem","notSet":"<não ajustado>","id":"Id","name":"Nome","langDir":"Direção do idioma","langDirLtr":"Esquerda para Direita (LTR)","langDirRtl":"Direita para Esquerda (RTL)","langCode":"Idioma","longDescr":"Descrição da URL","cssClass":"Classe de CSS","advisoryTitle":"Título","cssStyle":"Estilos","ok":"OK","cancel":"Cancelar","close":"Fechar","preview":"Visualizar","resize":"Arraste para redimensionar","generalTab":"Geral","advancedTab":"Avançado","validateNumberFailed":"Este valor não é um número.","confirmNewPage":"Todas as mudanças não salvas serão perdidas. Tem certeza de que quer abrir uma nova página?","confirmCancel":"Algumas opções foram alteradas. Tem certeza de que quer fechar a caixa de diálogo?","options":"Opções","target":"Destino","targetNew":"Nova Janela (_blank)","targetTop":"Janela de Cima (_top)","targetSelf":"Mesma Janela (_self)","targetParent":"Janela Pai (_parent)","langDirLTR":"Esquerda para Direita (LTR)","langDirRTL":"Direita para Esquerda (RTL)","styles":"Estilo","cssClasses":"Classes","width":"Largura","height":"Altura","align":"Alinhamento","alignLeft":"Esquerda","alignRight":"Direita","alignCenter":"Centralizado","alignTop":"Superior","alignMiddle":"Centralizado","alignBottom":"Inferior","invalidValue":"Valor inválido.","invalidHeight":"A altura tem que ser um número","invalidWidth":"A largura tem que ser um número.","invalidCssLength":"O valor do campo \"%1\" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt ou pc).","invalidHtmlLength":"O valor do campo \"%1\" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de HTML (px ou %).","invalidInlineStyle":"O valor válido para estilo deve conter uma ou mais tuplas no formato \"nome : valor\", separados por ponto e vírgula.","cssLengthTooltip":"Insira um número para valor em pixels ou um número seguido de uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, indisponível</span>"},"about":{"copy":"Copyright &copy; $1. Todos os direitos reservados.","dlgTitle":"Sobre o CKEditor","help":"Verifique o $1 para obter ajuda.","moreInfo":"Para informações sobre a licença por favor visite o nosso site:","title":"Sobre o CKEditor","userGuide":"Guia do Usuário do CKEditor"},"basicstyles":{"bold":"Negrito","italic":"Itálico","strike":"Tachado","subscript":"Subscrito","superscript":"Sobrescrito","underline":"Sublinhado"},"bidi":{"ltr":"Direção do texto da esquerda para a direita","rtl":"Direção do texto da direita para a esquerda"},"blockquote":{"toolbar":"Citação"},"clipboard":{"copy":"Copiar","copyError":"As configurações de segurança do seu navegador não permitem que o editor execute operações de copiar automaticamente. Por favor, utilize o teclado para copiar (Ctrl/Cmd+C).","cut":"Recortar","cutError":"As configurações de segurança do seu navegador não permitem que o editor execute operações de recortar automaticamente. Por favor, utilize o teclado para recortar (Ctrl/Cmd+X).","paste":"Colar","pasteArea":"Área para Colar","pasteMsg":"Transfira o link usado na caixa usando o teclado com (<STRONG>Ctrl/Cmd+V</STRONG>) e <STRONG>OK</STRONG>.","securityMsg":"As configurações de segurança do seu navegador não permitem que o editor acesse os dados da área de transferência diretamente. Por favor cole o conteúdo manualmente nesta janela.","title":"Colar"},"colorbutton":{"auto":"Automático","bgColorTitle":"Cor do Plano de Fundo","colors":{"000":"Preto","800000":"Foquete","8B4513":"Marrom 1","2F4F4F":"Cinza 1","008080":"Cerceta","000080":"Azul Marinho","4B0082":"Índigo","696969":"Cinza 2","B22222":"Tijolo de Fogo","A52A2A":"Marrom 2","DAA520":"Vara Dourada","006400":"Verde Escuro","40E0D0":"Turquesa","0000CD":"Azul Médio","800080":"Roxo","808080":"Cinza 3","F00":"Vermelho","FF8C00":"Laranja Escuro","FFD700":"Dourado","008000":"Verde","0FF":"Ciano","00F":"Azul","EE82EE":"Violeta","A9A9A9":"Cinza Escuro","FFA07A":"Salmão Claro","FFA500":"Laranja","FFFF00":"Amarelo","00FF00":"Lima","AFEEEE":"Turquesa Pálido","ADD8E6":"Azul Claro","DDA0DD":"Ameixa","D3D3D3":"Cinza Claro","FFF0F5":"Lavanda 1","FAEBD7":"Branco Antiguidade","FFFFE0":"Amarelo Claro","F0FFF0":"Orvalho","F0FFFF":"Azure","F0F8FF":"Azul Alice","E6E6FA":"Lavanda 2","FFF":"Branco"},"more":"Mais Cores...","panelTitle":"Cores","textColorTitle":"Cor do Texto"},"colordialog":{"clear":"Limpar","highlight":"Grifar","options":"Opções de Cor","selected":"Cor Selecionada","title":"Selecione uma Cor"},"templates":{"button":"Modelos de layout","emptyListMsg":"(Não foram definidos modelos de layout)","insertOption":"Substituir o conteúdo atual","options":"Opções de Template","selectPromptMsg":"Selecione um modelo de layout para ser aberto no editor<br>(o conteúdo atual será perdido):","title":"Modelo de layout de conteúdo"},"contextmenu":{"options":"Opções Menu de Contexto"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Título Consulta","cssClassInputLabel":"Classes de CSS","edit":"Editar Div","inlineStyleInputLabel":"Estilo Inline","langDirLTRLabel":"Esquerda para Direita (LTR)","langDirLabel":"Direção da Escrita","langDirRTLLabel":"Direita para Esquerda (RTL)","languageCodeInputLabel":"Código de Idioma","remove":"Remover Div","styleSelectLabel":"Estilo","title":"Criar Container de DIV","toolbar":"Criar Container de DIV"},"toolbar":{"toolbarCollapse":"Diminuir Barra de Ferramentas","toolbarExpand":"Aumentar Barra de Ferramentas","toolbarGroups":{"document":"Documento","clipboard":"Clipboard/Desfazer","editing":"Edição","forms":"Formulários","basicstyles":"Estilos Básicos","paragraph":"Paragrafo","links":"Links","insert":"Inserir","styles":"Estilos","colors":"Cores","tools":"Ferramentas"},"toolbars":"Barra de Ferramentas do Editor"},"elementspath":{"eleLabel":"Caminho dos Elementos","eleTitle":"Elemento %1"},"find":{"find":"Localizar","findOptions":"Opções","findWhat":"Procurar por:","matchCase":"Coincidir Maiúsculas/Minúsculas","matchCyclic":"Coincidir cíclico","matchWord":"Coincidir a palavra inteira","notFoundMsg":"O texto especificado não foi encontrado.","replace":"Substituir","replaceAll":"Substituir Tudo","replaceSuccessMsg":"%1 ocorrência(s) substituída(s).","replaceWith":"Substituir por:","title":"Localizar e Substituir"},"fakeobjects":{"anchor":"Âncora","flash":"Animação em Flash","hiddenfield":"Campo Oculto","iframe":"IFrame","unknown":"Objeto desconhecido"},"flash":{"access":"Acesso ao script","accessAlways":"Sempre","accessNever":"Nunca","accessSameDomain":"Acessar Mesmo Domínio","alignAbsBottom":"Inferior Absoluto","alignAbsMiddle":"Centralizado Absoluto","alignBaseline":"Baseline","alignTextTop":"Superior Absoluto","bgcolor":"Cor do Plano de Fundo","chkFull":"Permitir tela cheia","chkLoop":"Tocar Infinitamente","chkMenu":"Habilita Menu Flash","chkPlay":"Tocar Automaticamente","flashvars":"Variáveis do Flash","hSpace":"HSpace","properties":"Propriedades do Flash","propertiesTab":"Propriedades","quality":"Qualidade","qualityAutoHigh":"Qualidade Alta Automática","qualityAutoLow":"Qualidade Baixa Automática","qualityBest":"Qualidade Melhor","qualityHigh":"Qualidade Alta","qualityLow":"Qualidade Baixa","qualityMedium":"Qualidade Média","scale":"Escala","scaleAll":"Mostrar tudo","scaleFit":"Escala Exata","scaleNoBorder":"Sem Borda","title":"Propriedades do Flash","vSpace":"VSpace","validateHSpace":"O HSpace tem que ser um número","validateSrc":"Por favor, digite o endereço do link","validateVSpace":"O VSpace tem que ser um número.","windowMode":"Modo da janela","windowModeOpaque":"Opaca","windowModeTransparent":"Transparente","windowModeWindow":"Janela"},"font":{"fontSize":{"label":"Tamanho","voiceLabel":"Tamanho da fonte","panelTitle":"Tamanho"},"label":"Fonte","panelTitle":"Fonte","voiceLabel":"Fonte"},"forms":{"button":{"title":"Formatar Botão","text":"Texto (Valor)","type":"Tipo","typeBtn":"Botão","typeSbm":"Enviar","typeRst":"Limpar"},"checkboxAndRadio":{"checkboxTitle":"Formatar Caixa de Seleção","radioTitle":"Formatar Botão de Opção","value":"Valor","selected":"Selecionado"},"form":{"title":"Formatar Formulário","menu":"Formatar Formulário","action":"Ação","method":"Método","encoding":"Codificação"},"hidden":{"title":"Formatar Campo Oculto","name":"Nome","value":"Valor"},"select":{"title":"Formatar Caixa de Listagem","selectInfo":"Informações","opAvail":"Opções disponíveis","value":"Valor","size":"Tamanho","lines":"linhas","chkMulti":"Permitir múltiplas seleções","opText":"Texto","opValue":"Valor","btnAdd":"Adicionar","btnModify":"Modificar","btnUp":"Para cima","btnDown":"Para baixo","btnSetValue":"Definir como selecionado","btnDelete":"Remover"},"textarea":{"title":"Formatar Área de Texto","cols":"Colunas","rows":"Linhas"},"textfield":{"title":"Formatar Caixa de Texto","name":"Nome","value":"Valor","charWidth":"Comprimento (em caracteres)","maxChars":"Número Máximo de Caracteres","type":"Tipo","typeText":"Texto","typePass":"Senha","typeEmail":"Email","typeSearch":"Busca","typeTel":"Número de Telefone","typeUrl":"URL"}},"format":{"label":"Formatação","panelTitle":"Formatação","tag_address":"Endereço","tag_div":"Normal (DIV)","tag_h1":"Título 1","tag_h2":"Título 2","tag_h3":"Título 3","tag_h4":"Título 4","tag_h5":"Título 5","tag_h6":"Título 6","tag_p":"Normal","tag_pre":"Formatado"},"horizontalrule":{"toolbar":"Inserir Linha Horizontal"},"iframe":{"border":"Mostra borda do iframe","noUrl":"Insira a URL do iframe","scrolling":"Abilita scrollbars","title":"Propriedade do IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Por favor, digite a URL da imagem.","alt":"Texto Alternativo","border":"Borda","btnUpload":"Enviar para o Servidor","button2Img":"Deseja transformar o botão de imagem em uma imagem comum?","hSpace":"HSpace","img2Button":"Deseja transformar a imagem em um botão de imagem?","infoTab":"Informações da Imagem","linkTab":"Link","lockRatio":"Travar Proporções","menu":"Formatar Imagem","resetSize":"Redefinir para o Tamanho Original","title":"Formatar Imagem","titleButton":"Formatar Botão de Imagem","upload":"Enviar","urlMissing":"URL da imagem está faltando.","vSpace":"VSpace","validateBorder":"A borda deve ser um número inteiro.","validateHSpace":"O HSpace deve ser um número inteiro.","validateVSpace":"O VSpace deve ser um número inteiro."},"indent":{"indent":"Aumentar Recuo","outdent":"Diminuir Recuo"},"smiley":{"options":"Opções de Emoticons","title":"Inserir Emoticon","toolbar":"Emoticon"},"justify":{"block":"Justificado","center":"Centralizar","left":"Alinhar Esquerda","right":"Alinhar Direita"},"link":{"acccessKey":"Chave de Acesso","advanced":"Avançado","advisoryContentType":"Tipo de Conteúdo","advisoryTitle":"Título","anchor":{"toolbar":"Inserir/Editar Âncora","menu":"Formatar Âncora","title":"Formatar Âncora","name":"Nome da Âncora","errorName":"Por favor, digite o nome da âncora","remove":"Remover Âncora"},"anchorId":"Id da âncora","anchorName":"Nome da âncora","charset":"Charset do Link","cssClasses":"Classe de CSS","emailAddress":"Endereço E-Mail","emailBody":"Corpo da Mensagem","emailSubject":"Assunto da Mensagem","id":"Id","info":"Informações","langCode":"Direção do idioma","langDir":"Direção do idioma","langDirLTR":"Esquerda para Direita (LTR)","langDirRTL":"Direita para Esquerda (RTL)","menu":"Editar Link","name":"Nome","noAnchors":"(Não há âncoras no documento)","noEmail":"Por favor, digite o endereço de e-mail","noUrl":"Por favor, digite o endereço do Link","other":"<outro>","popupDependent":"Dependente (Netscape)","popupFeatures":"Propriedades da Janela Pop-up","popupFullScreen":"Modo Tela Cheia (IE)","popupLeft":"Esquerda","popupLocationBar":"Barra de Endereços","popupMenuBar":"Barra de Menus","popupResizable":"Redimensionável","popupScrollBars":"Barras de Rolagem","popupStatusBar":"Barra de Status","popupToolbar":"Barra de Ferramentas","popupTop":"Topo","rel":"Tipo de Relação","selectAnchor":"Selecione uma âncora","styles":"Estilos","tabIndex":"Índice de Tabulação","target":"Destino","targetFrame":"<frame>","targetFrameName":"Nome do Frame de Destino","targetPopup":"<janela popup>","targetPopupName":"Nome da Janela Pop-up","title":"Editar Link","toAnchor":"Âncora nesta página","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserir/Editar Link","type":"Tipo de hiperlink","unlink":"Remover Link","upload":"Enviar ao Servidor"},"list":{"bulletedlist":"Lista sem números","numberedlist":"Lista numerada"},"liststyle":{"armenian":"Numeração Armêna","bulletedTitle":"Propriedades da Lista sem Numeros","circle":"Círculo","decimal":"Numeração Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Numeração Decimal com zeros (01, 02, 03, etc.)","disc":"Disco","georgian":"Numeração da Geórgia (an, ban, gan, etc.)","lowerAlpha":"Numeração Alfabética minúscula (a, b, c, d, e, etc.)","lowerGreek":"Numeração Grega minúscula (alpha, beta, gamma, etc.)","lowerRoman":"Numeração Romana minúscula (i, ii, iii, iv, v, etc.)","none":"Nenhum","notset":"<não definido>","numberedTitle":"Propriedades da Lista Numerada","square":"Quadrado","start":"Início","type":"Tipo","upperAlpha":"Numeração Alfabética Maiúscula (A, B, C, D, E, etc.)","upperRoman":"Numeração Romana maiúscula (I, II, III, IV, V, etc.)","validateStartNumber":"O número inicial da lista deve ser um número inteiro."},"magicline":{"title":"Insera um parágrafo aqui"},"maximize":{"maximize":"Maximizar","minimize":"Minimize"},"newpage":{"toolbar":"Novo"},"pagebreak":{"alt":"Quebra de Página","toolbar":"Inserir Quebra de Página"},"pastetext":{"button":"Colar como Texto sem Formatação","title":"Colar como Texto sem Formatação"},"pastefromword":{"confirmCleanup":"O texto que você deseja colar parece ter sido copiado do Word. Você gostaria de remover a formatação antes de colar?","error":"Não foi possível limpar os dados colados devido a um erro interno","title":"Colar do Word","toolbar":"Colar do Word"},"preview":{"preview":"Visualizar"},"print":{"toolbar":"Imprimir"},"removeformat":{"toolbar":"Remover Formatação"},"save":{"toolbar":"Salvar"},"selectall":{"toolbar":"Selecionar Tudo"},"showblocks":{"toolbar":"Mostrar blocos de código"},"sourcearea":{"toolbar":"Código-Fonte"},"specialchar":{"options":"Opções de Caractere Especial","title":"Selecione um Caractere Especial","toolbar":"Inserir Caractere Especial"},"scayt":{"about":"Sobre a correção ortográfica durante a digitação","aboutTab":"Sobre","addWord":"Adicionar palavra","allCaps":"Ignorar palavras maiúsculas","dic_create":"Criar","dic_delete":"Excluir","dic_field_name":"Nome do Dicionário","dic_info":"Inicialmente, o dicionário do usuário fica armazenado em um Cookie. Porém, Cookies tem tamanho limitado, portanto quand o dicionário do usuário atingir o tamanho limite poderá ser armazenado no nosso servidor. Para armazenar seu dicionário pessoal no nosso servidor deverá especificar um nome para ele. Se já tiver um dicionário armazenado por favor especifique o seu nome e clique em Restaurar.","dic_rename":"Renomear","dic_restore":"Restaurar","dictionariesTab":"Dicionários","disable":"Desabilitar correção ortográfica durante a digitação","emptyDic":"O nome do dicionário não deveria estar vazio.","enable":"Habilitar correção ortográfica durante a digitação","ignore":"Ignorar","ignoreAll":"Ignorar todas","ignoreDomainNames":"Ignorar nomes de domínio","langs":"Idiomas","languagesTab":"Idiomas","mixedCase":"Ignorar palavras com maiúsculas e minúsculas misturadas","mixedWithDigits":"Ignorar palavras com números","moreSuggestions":"Mais sugestões","opera_title":"Não suportado no Opera","options":"Opções","optionsTab":"Opções","title":"Correção ortográfica durante a digitação","toggle":"Ativar/desativar correção ortográfica durante a digitação","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estilo","panelTitle":"Estilos de Formatação","panelTitle1":"Estilos de bloco","panelTitle2":"Estilos de texto corrido","panelTitle3":"Estilos de objeto"},"table":{"border":"Borda","caption":"Legenda","cell":{"menu":"Célula","insertBefore":"Inserir célula a esquerda","insertAfter":"Inserir célula a direita","deleteCell":"Remover Células","merge":"Mesclar Células","mergeRight":"Mesclar com célula a direita","mergeDown":"Mesclar com célula abaixo","splitHorizontal":"Dividir célula horizontalmente","splitVertical":"Dividir célula verticalmente","title":"Propriedades da célula","cellType":"Tipo de célula","rowSpan":"Linhas cobertas","colSpan":"Colunas cobertas","wordWrap":"Quebra de palavra","hAlign":"Alinhamento horizontal","vAlign":"Alinhamento vertical","alignBaseline":"Patamar de alinhamento","bgColor":"Cor de fundo","borderColor":"Cor das bordas","data":"Dados","header":"Cabeçalho","yes":"Sim","no":"Não","invalidWidth":"A largura da célula tem que ser um número.","invalidHeight":"A altura da célula tem que ser um número.","invalidRowSpan":"Linhas cobertas tem que ser um número inteiro.","invalidColSpan":"Colunas cobertas tem que ser um número inteiro.","chooseColor":"Escolher"},"cellPad":"Margem interna","cellSpace":"Espaçamento","column":{"menu":"Coluna","insertBefore":"Inserir coluna a esquerda","insertAfter":"Inserir coluna a direita","deleteColumn":"Remover Colunas"},"columns":"Colunas","deleteTable":"Apagar Tabela","headers":"Cabeçalho","headersBoth":"Ambos","headersColumn":"Primeira coluna","headersNone":"Nenhum","headersRow":"Primeira linha","invalidBorder":"O tamanho da borda tem que ser um número.","invalidCellPadding":"A margem interna das células tem que ser um número.","invalidCellSpacing":"O espaçamento das células tem que ser um número.","invalidCols":"O número de colunas tem que ser um número maior que 0.","invalidHeight":"A altura da tabela tem que ser um número.","invalidRows":"O número de linhas tem que ser um número maior que 0.","invalidWidth":"A largura da tabela tem que ser um número.","menu":"Formatar Tabela","row":{"menu":"Linha","insertBefore":"Inserir linha acima","insertAfter":"Inserir linha abaixo","deleteRow":"Remover Linhas"},"rows":"Linhas","summary":"Resumo","title":"Formatar Tabela","toolbar":"Tabela","widthPc":"%","widthPx":"pixels","widthUnit":"unidade largura"},"undo":{"redo":"Refazer","undo":"Desfazer"},"wsc":{"btnIgnore":"Ignorar uma vez","btnIgnoreAll":"Ignorar Todas","btnReplace":"Alterar","btnReplaceAll":"Alterar Todas","btnUndo":"Desfazer","changeTo":"Alterar para","errorLoading":"Erro carregando servidor de aplicação: %s.","ieSpellDownload":"A verificação ortográfica não foi instalada. Você gostaria de realizar o download agora?","manyChanges":"Verificação ortográfica encerrada: %1 palavras foram alteradas","noChanges":"Verificação ortográfica encerrada: Não houve alterações","noMispell":"Verificação encerrada: Não foram encontrados erros de ortografia","noSuggestions":"-sem sugestões de ortografia-","notAvailable":"Desculpe, o serviço não está disponível no momento.","notInDic":"Não encontrada","oneChange":"Verificação ortográfica encerrada: Uma palavra foi alterada","progress":"Verificação ortográfica em andamento...","title":"Corretor Ortográfico","toolbar":"Verificar Ortografia"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/pt.js b/htmltest/sites/all/libraries/ckeditor-version/lang/pt.js
new file mode 100644
index 00000000..18e0f53d
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/pt.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['pt']={"editor":"Rich Text Editor","common":{"editorHelp":"Pressione ALT+0 para ajuda","browseServer":"Explorar Servidor","url":"URL","protocol":"Protocolo","upload":"Enviar","uploadSubmit":"Enviar para o Servidor","image":"Imagem","flash":"Flash","form":"Formulário","checkbox":"Caixa de Seleção","radio":"Botão de Opção","textField":"Campo de Texto","textarea":"Área de Texto","hiddenField":"Campo Ocultado","button":"Botão","select":"Campo de Seleção","imageButton":"Botão de Imagem","notSet":"<Não definido>","id":"Id.","name":"Nome","langDir":"Orientação do Idioma","langDirLtr":"Esquerda para a Direita (EPD)","langDirRtl":"Direita para a Esquerda (DPE)","langCode":"Código de Idioma","longDescr":"Descrição Completa do URL","cssClass":"Classes de Estilo de Folhas","advisoryTitle":"Título Consultivo","cssStyle":"Estilo","ok":"OK","cancel":"Cancelar","close":"Fechar","preview":"Pré-visualização","resize":"Redimensionar","generalTab":"Geral","advancedTab":"Avançado","validateNumberFailed":"Este valor não é um numero.","confirmNewPage":"Irão ser perdidas quaisquer alterações não guardadas. Tem certeza que deseja carregar a página nova?","confirmCancel":"Foram alteradas algumas das opções. Tem a certeza que deseja fechar a janela?","options":"Opções","target":"Destino","targetNew":"Nova Janela (_blank)","targetTop":"Janela Superior (_top)","targetSelf":"Mesma Janela (_self)","targetParent":"Janela Parente (_parent)","langDirLTR":"Esquerda para a Direita (EPD)","langDirRTL":"Direita para a Esquerda (DPE)","styles":"Estilo","cssClasses":"Classes de Estilo de Folhas","width":"Largura","height":"Altura","align":"Alinhamento","alignLeft":"Esquerda","alignRight":"Direita","alignCenter":"Centrado","alignTop":"Topo","alignMiddle":"Centro","alignBottom":"Fundo","invalidValue":"Valor inválido.","invalidHeight":"A altura tem de ser um número.","invalidWidth":"A largura tem de ser um número. ","invalidCssLength":"Valor especificado para o campo \"1%\" deve ser um número positivo, com ou sem uma unidade de medida CSS válida (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Valor especificado para o campo \"1%\" deve ser um número positivo, com ou sem uma unidade de medida HTML válida (px ou %).","invalidInlineStyle":"Valor especificado para o estilo em embutido deve ser constituído por uma ou mais tuplas com o formato de \"nome : valor\", separados por ponto e vírgula.","cssLengthTooltip":"Digite um número para um valor em pixels ou um número com uma unidade CSS válida (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, indisponível</span>"},"about":{"copy":"Direitos de Autor &copy; $1. Todos os direitos reservados.","dlgTitle":"Sobre o CKEditor","help":"Doar $1 para ajudar.","moreInfo":"Para informação sobre o licenciamento, visite o nosso site da web:","title":"Sobre o CKEditor","userGuide":"CKEditor - Guia do Utilizador"},"basicstyles":{"bold":"Negrito","italic":"Itálico","strike":"Rasurado","subscript":"Superior à Linha","superscript":"Inferior à Linha","underline":"Sublinhado"},"bidi":{"ltr":"Direção do texto da esquerda para a direita","rtl":"Direção do texto da direita para a esquerda"},"blockquote":{"toolbar":"Bloco de citação"},"clipboard":{"copy":"Copiar","copyError":"A configuração de segurança do navegador não permite a execução automática de operações de copiar. Por favor use o teclado (Ctrl/Cmd+C).","cut":"Cortar","cutError":"A configuração de segurança do navegador não permite a execução automática de operações de cortar. Por favor use o teclado (Ctrl/Cmd+X).","paste":"Colar","pasteArea":"Colar Área","pasteMsg":"Por favor, cole dentro da seguinte caixa usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e prima <STRONG>OK</STRONG>.","securityMsg":"Devido ás definições de segurança do teu browser, o editor não pode aceder ao clipboard diretamente. É necessário que voltes a colar as informações nesta janela.","title":"Colar"},"colorbutton":{"auto":"Automático","bgColorTitle":"Cor de Fundo","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"Mais Cores...","panelTitle":"Colors","textColorTitle":"Cor do Texto"},"colordialog":{"clear":"Limpar","highlight":"Realçar","options":"Opções da Cor","selected":"Cor Selecionada","title":"Selecionar Cor"},"templates":{"button":"Modelos","emptyListMsg":"(Sem modelos definidos)","insertOption":"Substituir conteúdos actuais","options":"Opções do Modelo","selectPromptMsg":"Por favor, seleccione o modelo a abrir no editor<br>(o conteúdo actual será perdido):","title":"Modelo de Conteúdo"},"contextmenu":{"options":"Menu de opções de contexto"},"div":{"IdInputLabel":"ID","advisoryTitleInputLabel":"Título","cssClassInputLabel":"Classes de Estilo de Folhas Classes","edit":"Editar Div","inlineStyleInputLabel":"Estilho em Linha","langDirLTRLabel":"Esquerda à Direita (LTR)","langDirLabel":"Orientação de idioma","langDirRTLLabel":"Direita a Esquerda (RTL)","languageCodeInputLabel":"Codigo do Idioma","remove":"Remover Div","styleSelectLabel":"Estilo","title":"Criar Div","toolbar":"Criar Div"},"toolbar":{"toolbarCollapse":"Colapsar Barra","toolbarExpand":"Expandir Barra","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor de barras de ferramentas"},"elementspath":{"eleLabel":"Camninho dos Elementos","eleTitle":"Elemento %1"},"find":{"find":"Procurar","findOptions":"Find Options","findWhat":"Texto a Procurar:","matchCase":"Maiúsculas/Minúsculas","matchCyclic":"Match cyclic","matchWord":"Coincidir com toda a palavra","notFoundMsg":"O texto especificado não foi encontrado.","replace":"Substituir","replaceAll":"Substituir Tudo","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Substituir por:","title":"Find and Replace"},"fakeobjects":{"anchor":" Inserir/Editar Âncora","flash":"Animação Flash","hiddenfield":"Campo Ocultado","iframe":"IFrame","unknown":"Objeto Desconhecido"},"flash":{"access":"Acesso ao Script","accessAlways":"Sempre","accessNever":"Nunca","accessSameDomain":"Mesmo dominio","alignAbsBottom":"Abs inferior","alignAbsMiddle":"Abs centro","alignBaseline":"Linha de base","alignTextTop":"Topo do texto","bgcolor":"Cor de Fundo","chkFull":"Permitir Ecrã inteiro","chkLoop":"Loop","chkMenu":"Permitir Menu do Flash","chkPlay":"Reproduzir automaticamente","flashvars":"Variaveis para o Flash","hSpace":"Esp.Horiz","properties":"Propriedades do Flash","propertiesTab":"Propriedades","quality":"Qualidade","qualityAutoHigh":"Alta Automaticamente","qualityAutoLow":"Baixa Automaticamente","qualityBest":"Melhor","qualityHigh":"Alta","qualityLow":"Baixa","qualityMedium":"Média","scale":"Escala","scaleAll":"Mostrar tudo","scaleFit":"Tamanho Exacto","scaleNoBorder":"Sem Limites","title":"Propriedades do Flash","vSpace":"Esp.Vert","validateHSpace":"HSpace tem de ser um numero.","validateSrc":"Por favor introduza a hiperligação URL","validateVSpace":"VSpace tem de ser um numero.","windowMode":"Modo de janela","windowModeOpaque":"Opaco","windowModeTransparent":"Transparente","windowModeWindow":"Janela"},"font":{"fontSize":{"label":"Tamanho","voiceLabel":"Tamanho da Letra","panelTitle":"Tamanho da Letra"},"label":"Tipo de Letra","panelTitle":"Nome do Tipo de Letra","voiceLabel":"Tipo de Letra"},"forms":{"button":{"title":"Propriedades do Botão","text":"Texto (Valor)","type":"Tipo","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"Propriedades da Caixa de Verificação","radioTitle":"Propriedades do Botão de Opção","value":"Valor","selected":"Seleccionado"},"form":{"title":"Propriedades do Formulário","menu":"Propriedades do Formulário","action":"Acção","method":"Método","encoding":"Encoding"},"hidden":{"title":"Propriedades do Campo Escondido","name":"Nome","value":"Valor"},"select":{"title":"Propriedades da Caixa de Combinação","selectInfo":"Informação","opAvail":"Opções Possíveis","value":"Valor","size":"Tamanho","lines":"linhas","chkMulti":"Permitir selecções múltiplas","opText":"Texto","opValue":"Valor","btnAdd":"Adicionar","btnModify":"Modificar","btnUp":"Para cima","btnDown":"Para baixo","btnSetValue":"Definir um valor por defeito","btnDelete":"Apagar"},"textarea":{"title":"Propriedades da Área de Texto","cols":"Colunas","rows":"Linhas"},"textfield":{"title":"Propriedades do Campo de Texto","name":"Nome","value":"Valor","charWidth":"Tamanho do caracter","maxChars":"Nr. Máximo de Caracteres","type":"Tipo","typeText":"Texto","typePass":"Palavra-chave","typeEmail":"Email","typeSearch":"Pesquisar","typeTel":"Numero de telefone","typeUrl":"URL"}},"format":{"label":"Formatar","panelTitle":"Formatar Parágrafo","tag_address":"Endereço","tag_div":"Normal (DIV)","tag_h1":"Título 1","tag_h2":"Título 2","tag_h3":"Título 3","tag_h4":"Título 4","tag_h5":"Título 5","tag_h6":"Título 6","tag_p":"Normal","tag_pre":"Formatado"},"horizontalrule":{"toolbar":"Inserir Linha Horizontal"},"iframe":{"border":"Mostrar a borda da Frame","noUrl":"Por favor escreva o URL da iframe","scrolling":"Activar barras de deslocamento","title":"Propriadades da IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Por favor introduza o URL da imagem","alt":"Texto Alternativo","border":"Limite","btnUpload":"Enviar para o Servidor","button2Img":"Deseja transformar o botão com imagem selecionado em uma imagem?","hSpace":"Esp.Horiz","img2Button":"Deseja transformar a imagem selecionada em um botão com imagem?","infoTab":"Informação da Imagem","linkTab":"Hiperligação","lockRatio":"Proporcional","menu":"Propriedades da Imagem","resetSize":"Tamanho Original","title":"Propriedades da Imagem","titleButton":"Propriedades do Botão de imagens","upload":"Carregar","urlMissing":"O URL da fonte da imagem está em falta.","vSpace":"Esp.Vert","validateBorder":"A borda tem de ser um numero.","validateHSpace":"HSpace tem de ser um numero.","validateVSpace":"VSpace tem de ser um numero."},"indent":{"indent":"Aumentar Avanço","outdent":"Diminuir Avanço"},"smiley":{"options":"Opções de Emoticons","title":"Inserir um Emoticon","toolbar":"Emoticons"},"justify":{"block":"Justificado","center":"Alinhar ao Centro","left":"Alinhar à Esquerda","right":"Alinhar à Direita"},"link":{"acccessKey":"Chave de Acesso","advanced":"Avançado","advisoryContentType":"Tipo de Conteúdo","advisoryTitle":"Título","anchor":{"toolbar":" Inserir/Editar Âncora","menu":"Propriedades da Âncora","title":"Propriedades da Âncora","name":"Nome da Âncora","errorName":"Por favor, introduza o nome da âncora","remove":"Remove Anchor"},"anchorId":"Por ID de elemento","anchorName":"Por Nome de Referência","charset":"Fonte de caracteres vinculado","cssClasses":"Classes de Estilo de Folhas Classes","emailAddress":"Endereço de E-Mail","emailBody":"Corpo da Mensagem","emailSubject":"Título de Mensagem","id":"ID","info":"Informação de Hiperligação","langCode":"Orientação de idioma","langDir":"Orientação de idioma","langDirLTR":"Esquerda à Direita (LTR)","langDirRTL":"Direita a Esquerda (RTL)","menu":"Editar Hiperligação","name":"Nome","noAnchors":"(Não há referências disponíveis no documento)","noEmail":"Por favor introduza o endereço de e-mail","noUrl":"Por favor introduza a hiperligação URL","other":"<outro>","popupDependent":"Dependente (Netscape)","popupFeatures":"Características de Janela de Popup","popupFullScreen":"Janela Completa (IE)","popupLeft":"Posição Esquerda","popupLocationBar":"Barra de localização","popupMenuBar":"Barra de Menu","popupResizable":"Redimensionável","popupScrollBars":"Barras de deslocamento","popupStatusBar":"Barra de Estado","popupToolbar":"Barra de Ferramentas","popupTop":"Posição Direita","rel":"Relação","selectAnchor":"Seleccionar una referência","styles":"Estilo","tabIndex":"Índice de Tubulação","target":"Destino","targetFrame":"<Frame>","targetFrameName":"Nome do Frame Destino","targetPopup":"<Janela de popup>","targetPopupName":"Nome da Janela de Popup","title":"Hiperligação","toAnchor":"Referência a esta página","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserir/Editar Hiperligação","type":"Tipo de Hiperligação","unlink":"Eliminar Hiperligação","upload":"Carregar"},"list":{"bulletedlist":"Marcas","numberedlist":"Numeração"},"liststyle":{"armenian":"Numeração armênia","bulletedTitle":"Bulleted List Properties","circle":"Círculo","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disco","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"Nenhum","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Quadrado","start":"Iniciar","type":"Tipo","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insira aqui o parágrafo"},"maximize":{"maximize":"Maximizar","minimize":"Minimizar"},"newpage":{"toolbar":"Nova Página"},"pagebreak":{"alt":"Quebra de página","toolbar":"Inserir Quebra de Página"},"pastetext":{"button":"Colar como Texto Simples","title":"Colar como Texto Simples"},"pastefromword":{"confirmCleanup":"O texto que pretende colar parece ter sido copiado do Word. Deseja limpá-lo antes de colar?","error":"Não foi possivel limpar a informação colada decido a um erro interno.","title":"Colar do Word","toolbar":"Colar do Word"},"preview":{"preview":"Pré-visualizar"},"print":{"toolbar":"Imprimir"},"removeformat":{"toolbar":"Eliminar Formato"},"save":{"toolbar":"Guardar"},"selectall":{"toolbar":"Selecionar Tudo"},"showblocks":{"toolbar":"Exibir blocos"},"sourcearea":{"toolbar":"Fonte"},"specialchar":{"options":"Opções de caracteres especiais","title":"Selecione um caracter especial","toolbar":"Inserir Caracter Especial"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estilo","panelTitle":"Estilos de Formatação","panelTitle1":"Estilos de Bloco","panelTitle2":"Estilos de Linha","panelTitle3":"Estilos de Objeto"},"table":{"border":"Tamanho da Margem","caption":"Título","cell":{"menu":"Célula","insertBefore":"Inserir Célula Antes","insertAfter":"Inserir Célula Depois","deleteCell":"Eliminar Célula","merge":"Unir Células","mergeRight":"Unir à Direita","mergeDown":"Unir abaixo","splitHorizontal":"Dividir Célula Horizontalmente","splitVertical":"Dividir Célula Verticalmente","title":"Propriedades da Célula","cellType":"Tipo de Célula","rowSpan":"Filas na Célula","colSpan":"Colunas na Célula","wordWrap":"Continuar","hAlign":"Alinhamento Horizontal","vAlign":"Alinhamento Vertical","alignBaseline":"Base","bgColor":"Cor de Fundo","borderColor":"Cor da Margem","data":"Dados","header":"Cabeçalho","yes":"Sim","no":"Não","invalidWidth":"A largura da célula deve ser um número.","invalidHeight":"A altura da célula deve ser um número.","invalidRowSpan":"As filas da célula deve ter um número inteiro.","invalidColSpan":"As colunas da célula deve ter um número inteiro.","chooseColor":"Escolher"},"cellPad":"Criação de Espaço","cellSpace":"Espaçamento Célula","column":{"menu":"Coluna","insertBefore":"Inserir Coluna Antes","insertAfter":"Inserir Coluna Depois","deleteColumn":"Apagar Colunas"},"columns":"Colunas","deleteTable":"Apagar Tabela","headers":"Cabeçalhos","headersBoth":"Ambos","headersColumn":"Primeira coluna","headersNone":"Nenhum","headersRow":"Primeira Linha","invalidBorder":"O tamanho da borda tem de ser um número.","invalidCellPadding":"A criação do espaço na célula deve ser um número positivo.","invalidCellSpacing":"O espaçamento da célula deve ser um número positivo.","invalidCols":"O número de colunas tem de ser um número maior que 0.","invalidHeight":"A altura da tabela tem de ser um número.","invalidRows":"O número das linhas tem de ser um número maior que 0.","invalidWidth":"A largura da tabela tem de ser um número.","menu":"Propriedades da Tabela","row":{"menu":"Linha","insertBefore":"Inserir Linha Antes","insertAfter":"Inserir Linha Depois","deleteRow":"Apagar Linhas"},"rows":"Linhas","summary":"Sumário","title":"Propriedades da Tabela","toolbar":"Tabela","widthPc":"percentagem","widthPx":"pixels","widthUnit":"unidade da largura"},"undo":{"redo":"Repetir","undo":"Anular"},"wsc":{"btnIgnore":"Ignorar","btnIgnoreAll":"Ignorar Tudo","btnReplace":"Substituir","btnReplaceAll":"Substituir Tudo","btnUndo":"Anular","changeTo":"Mudar para","errorLoading":"Error loading application service host: %s.","ieSpellDownload":" Verificação ortográfica não instalada. Quer descarregar agora?","manyChanges":"Verificação ortográfica completa: %1 palavras alteradas","noChanges":"Verificação ortográfica completa: não houve alteração de palavras","noMispell":"Verificação ortográfica completa: não foram encontrados erros","noSuggestions":"- Sem sugestões -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Não está num directório","oneChange":"Verificação ortográfica completa: uma palavra alterada","progress":"Verificação ortográfica em progresso…","title":"Spell Check","toolbar":"Verificação Ortográfica"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/ro.js b/htmltest/sites/all/libraries/ckeditor-version/lang/ro.js
new file mode 100644
index 00000000..c8a03004
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/ro.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ro']={"editor":"Rich Text Editor","common":{"editorHelp":"Apasă ALT 0 pentru ajutor","browseServer":"Răsfoieşte server","url":"URL","protocol":"Protocol","upload":"Încarcă","uploadSubmit":"Trimite la server","image":"Imagine","flash":"Flash","form":"Formular (Form)","checkbox":"Bifă (Checkbox)","radio":"Buton radio (RadioButton)","textField":"Câmp text (TextField)","textarea":"Suprafaţă text (Textarea)","hiddenField":"Câmp ascuns (HiddenField)","button":"Buton","select":"Câmp selecţie (SelectionField)","imageButton":"Buton imagine (ImageButton)","notSet":"<nesetat>","id":"Id","name":"Nume","langDir":"Direcţia cuvintelor","langDirLtr":"stânga-dreapta (LTR)","langDirRtl":"dreapta-stânga (RTL)","langCode":"Codul limbii","longDescr":"Descrierea lungă URL","cssClass":"Clasele cu stilul paginii (CSS)","advisoryTitle":"Titlul consultativ","cssStyle":"Stil","ok":"OK","cancel":"Anulare","close":"Închide","preview":"Previzualizare","resize":"Trage pentru a redimensiona","generalTab":"General","advancedTab":"Avansat","validateNumberFailed":"Această valoare nu este un număr.","confirmNewPage":"Orice modificări nesalvate ale acestui conținut, vor fi pierdute. Sigur doriți încărcarea unei noi pagini?","confirmCancel":"Câteva opțiuni au fost schimbate. Sigur doriți să închideți dialogul?","options":"Opțiuni","target":"Țintă","targetNew":"Fereastră nouă (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"În aceeași fereastră (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Stânga spre Dreapta (LTR)","langDirRTL":"Dreapta spre Stânga (RTL)","styles":"Stil","cssClasses":"Stylesheet Classes","width":"Lăţime","height":"Înălţime","align":"Aliniere","alignLeft":"Mărește Bara","alignRight":"Dreapta","alignCenter":"Centru","alignTop":"Sus","alignMiddle":"Mijloc","alignBottom":"Jos","invalidValue":"Varloare invalida","invalidHeight":"Înălțimea trebuie să fie un număr.","invalidWidth":"Lățimea trebuie să fie un număr.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, nu este disponibil</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Îngroşat (bold)","italic":"Înclinat (italic)","strike":"Tăiat (strike through)","subscript":"Indice (subscript)","superscript":"Putere (superscript)","underline":"Subliniat (underline)"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Citat"},"clipboard":{"copy":"Copiază","copyError":"Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de copiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+C).","cut":"Taie","cutError":"Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de tăiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+X).","paste":"Adaugă","pasteArea":"Suprafața de adăugare","pasteMsg":"Vă rugăm adăugaţi în căsuţa următoare folosind tastatura (<strong>Ctrl/Cmd+V</strong>) şi apăsaţi OK","securityMsg":"Din cauza setărilor de securitate ale programului dvs. cu care navigaţi pe internet (browser), editorul nu poate accesa direct datele din clipboard. Va trebui să adăugaţi din nou datele în această fereastră.","title":"Adaugă"},"colorbutton":{"auto":"Automatic","bgColorTitle":"Coloarea fundalului","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"Mai multe culori...","panelTitle":"Colors","textColorTitle":"Culoarea textului"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"Template-uri (şabloane)","emptyListMsg":"(Niciun template (şablon) definit)","insertOption":"Înlocuieşte cuprinsul actual","options":"Opțiuni șabloane","selectPromptMsg":"Vă rugăm selectaţi template-ul (şablonul) ce se va deschide în editor<br>(conţinutul actual va fi pierdut):","title":"Template-uri (şabloane) de conţinut"},"contextmenu":{"options":"Opțiuni Meniu Contextual"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Titlul consultativ","cssClassInputLabel":"Clasele cu stilul paginii (CSS)","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"stânga-dreapta (LTR)","langDirLabel":"Direcţia cuvintelor","langDirRTLLabel":"dreapta-stânga (RTL)","languageCodeInputLabel":"Codul limbii","remove":"Remove Div","styleSelectLabel":"Stil","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Micșorează Bara","toolbarExpand":"Mărește Bara","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editează bara de unelte"},"elementspath":{"eleLabel":"Calea elementelor","eleTitle":"%1 element"},"find":{"find":"Găseşte","findOptions":"Find Options","findWhat":"Găseşte:","matchCase":"Deosebeşte majuscule de minuscule (Match case)","matchCyclic":"Potrivește ciclic","matchWord":"Doar cuvintele întregi","notFoundMsg":"Textul specificat nu a fost găsit.","replace":"Înlocuieşte","replaceAll":"Înlocuieşte tot","replaceSuccessMsg":"%1 căutări înlocuite.","replaceWith":"Înlocuieşte cu:","title":"Găseşte şi înlocuieşte"},"fakeobjects":{"anchor":"Inserează/Editează ancoră","flash":"Flash Animation","hiddenfield":"Câmp ascuns (HiddenField)","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Acces script","accessAlways":"Întotdeauna","accessNever":"Niciodată","accessSameDomain":"Același domeniu","alignAbsBottom":"Jos absolut (Abs Bottom)","alignAbsMiddle":"Mijloc absolut (Abs Middle)","alignBaseline":"Linia de jos (Baseline)","alignTextTop":"Text sus","bgcolor":"Coloarea fundalului","chkFull":"Permite pe tot ecranul","chkLoop":"Repetă (Loop)","chkMenu":"Activează meniul flash","chkPlay":"Rulează automat","flashvars":"Variabile pentru flash","hSpace":"HSpace","properties":"Proprietăţile flashului","propertiesTab":"Proprietăți","quality":"Calitate","qualityAutoHigh":"Auto înaltă","qualityAutoLow":"Auto Joasă","qualityBest":"Cea mai bună","qualityHigh":"Înaltă","qualityLow":"Joasă","qualityMedium":"Medie","scale":"Scală","scaleAll":"Arată tot","scaleFit":"Potriveşte","scaleNoBorder":"Fără bordură (No border)","title":"Proprietăţile flashului","vSpace":"VSpace","validateHSpace":"Hspace trebuie să fie un număr.","validateSrc":"Vă rugăm să scrieţi URL-ul","validateVSpace":"VSpace trebuie să fie un număr","windowMode":"Mod fereastră","windowModeOpaque":"Opacă","windowModeTransparent":"Transparentă","windowModeWindow":"Fereastră"},"font":{"fontSize":{"label":"Mărime","voiceLabel":"Font Size","panelTitle":"Mărime"},"label":"Font","panelTitle":"Font","voiceLabel":"Font"},"forms":{"button":{"title":"Proprietăţi buton","text":"Text (Valoare)","type":"Tip","typeBtn":"Buton","typeSbm":"Trimite","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"Proprietăţi bifă (Checkbox)","radioTitle":"Proprietăţi buton radio (Radio Button)","value":"Valoare","selected":"Selectat"},"form":{"title":"Proprietăţi formular (Form)","menu":"Proprietăţi formular (Form)","action":"Acţiune","method":"Metodă","encoding":"Encodare"},"hidden":{"title":"Proprietăţi câmp ascuns (Hidden Field)","name":"Nume","value":"Valoare"},"select":{"title":"Proprietăţi câmp selecţie (Selection Field)","selectInfo":"Informaţii","opAvail":"Opţiuni disponibile","value":"Valoare","size":"Mărime","lines":"linii","chkMulti":"Permite selecţii multiple","opText":"Text","opValue":"Valoare","btnAdd":"Adaugă","btnModify":"Modifică","btnUp":"Sus","btnDown":"Jos","btnSetValue":"Setează ca valoare selectată","btnDelete":"Şterge"},"textarea":{"title":"Proprietăţi suprafaţă text (Textarea)","cols":"Coloane","rows":"Linii"},"textfield":{"title":"Proprietăţi câmp text (Text Field)","name":"Nume","value":"Valoare","charWidth":"Lărgimea caracterului","maxChars":"Caractere maxime","type":"Tip","typeText":"Text","typePass":"Parolă","typeEmail":"Email","typeSearch":"Cauta","typeTel":"Numar de telefon","typeUrl":"URL"}},"format":{"label":"Formatare","panelTitle":"Formatare","tag_address":"Adresă","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatat"},"horizontalrule":{"toolbar":"Inserează linie orizontală"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Vă rugăm să scrieţi URL-ul imaginii","alt":"Text alternativ","border":"Margine","btnUpload":"Trimite la server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Informaţii despre imagine","linkTab":"Link (Legătură web)","lockRatio":"Păstrează proporţiile","menu":"Proprietăţile imaginii","resetSize":"Resetează mărimea","title":"Proprietăţile imaginii","titleButton":"Proprietăţi buton imagine (Image Button)","upload":"Încarcă","urlMissing":"Sursa URL a imaginii lipsește.","vSpace":"VSpace","validateBorder":"Bordura trebuie să fie un număr întreg.","validateHSpace":"Hspace trebuie să fie un număr întreg.","validateVSpace":"Vspace trebuie să fie un număr întreg."},"indent":{"indent":"Creşte indentarea","outdent":"Scade indentarea"},"smiley":{"options":"Opțiuni figuri expresive","title":"Inserează o figură expresivă (Emoticon)","toolbar":"Figură expresivă (Emoticon)"},"justify":{"block":"Aliniere în bloc (Block Justify)","center":"Aliniere centrală","left":"Aliniere la stânga","right":"Aliniere la dreapta"},"link":{"acccessKey":"Tasta de acces","advanced":"Avansat","advisoryContentType":"Tipul consultativ al titlului","advisoryTitle":"Titlul consultativ","anchor":{"toolbar":"Inserează/Editează ancoră","menu":"Proprietăţi ancoră","title":"Proprietăţi ancoră","name":"Numele ancorei","errorName":"Vă rugăm scrieţi numele ancorei","remove":"Elimină ancora"},"anchorId":"după Id-ul elementului","anchorName":"după numele ancorei","charset":"Setul de caractere al resursei legate","cssClasses":"Clasele cu stilul paginii (CSS)","emailAddress":"Adresă de e-mail","emailBody":"Opțiuni Meniu Contextual","emailSubject":"Subiectul mesajului","id":"Id","info":"Informaţii despre link (Legătură web)","langCode":"Direcţia cuvintelor","langDir":"Direcţia cuvintelor","langDirLTR":"stânga-dreapta (LTR)","langDirRTL":"dreapta-stânga (RTL)","menu":"Editează Link","name":"Nume","noAnchors":"(Nicio ancoră disponibilă în document)","noEmail":"Vă rugăm să scrieţi adresa de e-mail","noUrl":"Vă rugăm să scrieţi URL-ul","other":"<alt>","popupDependent":"Dependent (Netscape)","popupFeatures":"Proprietăţile ferestrei popup","popupFullScreen":"Tot ecranul (Full Screen)(IE)","popupLeft":"Poziţia la stânga","popupLocationBar":"Bara de locaţie","popupMenuBar":"Bara de meniu","popupResizable":"Redimensionabil","popupScrollBars":"Bare de derulare","popupStatusBar":"Bara de status","popupToolbar":"Bara de opţiuni","popupTop":"Poziţia la dreapta","rel":"Relație","selectAnchor":"Selectaţi o ancoră","styles":"Stil","tabIndex":"Indexul tabului","target":"Ţintă (Target)","targetFrame":"<frame>","targetFrameName":"Numele frameului ţintă","targetPopup":"<fereastra popup>","targetPopupName":"Numele ferestrei popup","title":"Link (Legătură web)","toAnchor":"Ancoră în această pagină","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserează/Editează link (legătură web)","type":"Tipul link-ului (al legăturii web)","unlink":"Înlătură link (legătură web)","upload":"Încarcă"},"list":{"bulletedlist":"Inserează / Elimină Listă cu puncte","numberedlist":"Inserează / Elimină Listă numerotată"},"liststyle":{"armenian":"Numerotare armeniană","bulletedTitle":"Proprietățile listei cu simboluri","circle":"Cerc","decimal":"Decimale (1, 2, 3, etc.)","decimalLeadingZero":"Decimale cu zero în față (01, 02, 03, etc.)","disc":"Disc","georgian":"Numerotare georgiană (an, ban, gan, etc.)","lowerAlpha":"Litere mici (a, b, c, d, e, etc.)","lowerGreek":"Litere grecești mici (alpha, beta, gamma, etc.)","lowerRoman":"Cifre romane mici (i, ii, iii, iv, v, etc.)","none":"Nimic","notset":"<nesetat>","numberedTitle":"Proprietățile listei numerotate","square":"Pătrat","start":"Start","type":"Tip","upperAlpha":"Litere mari (A, B, C, D, E, etc.)","upperRoman":"Cifre romane mari (I, II, III, IV, V, etc.)","validateStartNumber":"Începutul listei trebuie să fie un număr întreg."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Mărește","minimize":"Micșorează"},"newpage":{"toolbar":"Pagină nouă"},"pagebreak":{"alt":"Page Break","toolbar":"Inserează separator de pagină (Page Break)"},"pastetext":{"button":"Adaugă ca text simplu (Plain Text)","title":"Adaugă ca text simplu (Plain Text)"},"pastefromword":{"confirmCleanup":"Textul pe care doriți să-l lipiți este din Word. Doriți curățarea textului înante de a-l adăuga?","error":"Nu a fost posibilă curățarea datelor adăugate datorită unei erori interne","title":"Adaugă din Word","toolbar":"Adaugă din Word"},"preview":{"preview":"Previzualizare"},"print":{"toolbar":"Printează"},"removeformat":{"toolbar":"Înlătură formatarea"},"save":{"toolbar":"Salvează"},"selectall":{"toolbar":"Selectează tot"},"showblocks":{"toolbar":"Arată blocurile"},"sourcearea":{"toolbar":"Sursa"},"specialchar":{"options":"Opțiuni caractere speciale","title":"Selectează caracter special","toolbar":"Inserează caracter special"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Formatarea stilurilor","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Mărimea marginii","caption":"Titlu (Caption)","cell":{"menu":"Celulă","insertBefore":"Inserează celulă înainte","insertAfter":"Inserează celulă după","deleteCell":"Şterge celule","merge":"Uneşte celule","mergeRight":"Uneşte la dreapta","mergeDown":"Uneşte jos","splitHorizontal":"Împarte celula pe orizontală","splitVertical":"Împarte celula pe verticală","title":"Proprietăți celulă","cellType":"Tipul celulei","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Aliniament orizontal","vAlign":"Aliniament vertical","alignBaseline":"Baseline","bgColor":"Culoare fundal","borderColor":"Culoare bordură","data":"Data","header":"Antet","yes":"Da","no":"Nu","invalidWidth":"Lățimea celulei trebuie să fie un număr.","invalidHeight":"Înălțimea celulei trebuie să fie un număr.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Alege"},"cellPad":"Spaţiu în cadrul celulei","cellSpace":"Spaţiu între celule","column":{"menu":"Coloană","insertBefore":"Inserează coloană înainte","insertAfter":"Inserează coloană după","deleteColumn":"Şterge celule"},"columns":"Coloane","deleteTable":"Şterge tabel","headers":"Antente","headersBoth":"Ambele","headersColumn":"Prima coloană","headersNone":"Nimic","headersRow":"Primul rând","invalidBorder":"Dimensiunea bordurii trebuie să aibe un număr.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Spațierea celului trebuie să fie un număr pozitiv.","invalidCols":"Numărul coloanelor trebuie să fie mai mare decât 0.","invalidHeight":"Inaltimea celulei trebuie sa fie un numar.","invalidRows":"Numărul rândurilor trebuie să fie mai mare decât 0.","invalidWidth":"Lățimea tabelului trebuie să fie un număr.","menu":"Proprietăţile tabelului","row":{"menu":"Rând","insertBefore":"Inserează rând înainte","insertAfter":"Inserează rând după","deleteRow":"Şterge rânduri"},"rows":"Rânduri","summary":"Rezumat","title":"Proprietăţile tabelului","toolbar":"Tabel","widthPc":"procente","widthPx":"pixeli","widthUnit":"unitate lățime"},"undo":{"redo":"Starea ulterioară (redo)","undo":"Starea anterioară (undo)"},"wsc":{"btnIgnore":"Ignoră","btnIgnoreAll":"Ignoră toate","btnReplace":"Înlocuieşte","btnReplaceAll":"Înlocuieşte tot","btnUndo":"Starea anterioară (undo)","changeTo":"Schimbă în","errorLoading":"Eroare în lansarea aplicației service host %s.","ieSpellDownload":"Unealta pentru verificat textul (Spell checker) neinstalată. Doriţi să o descărcaţi acum?","manyChanges":"Verificarea textului terminată: 1% cuvinte modificate","noChanges":"Verificarea textului terminată: Niciun cuvânt modificat","noMispell":"Verificarea textului terminată: Nicio greşeală găsită","noSuggestions":"- Fără sugestii -","notAvailable":"Scuzați, dar serviciul nu este disponibil momentan.","notInDic":"Nu e în dicţionar","oneChange":"Verificarea textului terminată: Un cuvânt modificat","progress":"Verificarea textului în desfăşurare...","title":"Spell Check","toolbar":"Verifică scrierea textului"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/ru.js b/htmltest/sites/all/libraries/ckeditor-version/lang/ru.js
new file mode 100644
index 00000000..6dd4434b
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/ru.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ru']={"editor":"Визуальный текстовый редактор","common":{"editorHelp":"Нажмите ALT-0 для открытия справки","browseServer":"Выбор на сервере","url":"Ссылка","protocol":"Протокол","upload":"Загрузка файла","uploadSubmit":"Загрузить на сервер","image":"Изображение","flash":"Flash","form":"Форма","checkbox":"Чекбокс","radio":"Радиокнопка","textField":"Текстовое поле","textarea":"Многострочное текстовое поле","hiddenField":"Скрытое поле","button":"Кнопка","select":"Выпадающий список","imageButton":"Кнопка-изображение","notSet":"<не указано>","id":"Идентификатор","name":"Имя","langDir":"Направление текста","langDirLtr":"Слева направо (LTR)","langDirRtl":"Справа налево (RTL)","langCode":"Код языка","longDescr":"Длинное описание ссылки","cssClass":"Класс CSS","advisoryTitle":"Заголовок","cssStyle":"Стиль","ok":"ОК","cancel":"Отмена","close":"Закрыть","preview":"Предпросмотр","resize":"Перетащите для изменения размера","generalTab":"Основное","advancedTab":"Дополнительно","validateNumberFailed":"Это значение не является числом.","confirmNewPage":"Несохранённые изменения будут потеряны! Вы действительно желаете перейти на другую страницу?","confirmCancel":"Некоторые параметры были изменены. Вы уверены, что желаете закрыть без сохранения?","options":"Параметры","target":"Цель","targetNew":"Новое окно (_blank)","targetTop":"Главное окно (_top)","targetSelf":"Текущее окно (_self)","targetParent":"Родительское окно (_parent)","langDirLTR":"Слева направо (LTR)","langDirRTL":"Справа налево (RTL)","styles":"Стиль","cssClasses":"CSS классы","width":"Ширина","height":"Высота","align":"Выравнивание","alignLeft":"По левому краю","alignRight":"По правому краю","alignCenter":"По центру","alignTop":"Поверху","alignMiddle":"Посередине","alignBottom":"Понизу","invalidValue":"Недопустимое значение.","invalidHeight":"Высота задается числом.","invalidWidth":"Ширина задается числом.","invalidCssLength":"Значение, указанное в поле \"%1\", должно быть положительным целым числом. Допускается указание единиц меры CSS (px, %, in, cm, mm, em, ex, pt или pc).","invalidHtmlLength":"Значение, указанное в поле \"%1\", должно быть положительным целым числом. Допускается указание единиц меры HTML (px или %).","invalidInlineStyle":"Значение, указанное для стиля элемента, должно состоять из одной или нескольких пар данных в формате \"параметр : значение\", разделённых точкой с запятой.","cssLengthTooltip":"Введите значение в пикселях, либо число с корректной единицей меры CSS (px, %, in, cm, mm, em, ex, pt или pc).","unavailable":"%1<span class=\"cke_accessibility\">, недоступно</span>"},"about":{"copy":"Copyright &copy; $1. Все права защищены.","dlgTitle":"О CKEditor","help":"$1 содержит подробную справку по использованию.","moreInfo":"Для получения информации о лицензии, пожалуйста, перейдите на наш сайт:","title":"О CKEditor","userGuide":"Руководство пользователя CKEditor"},"basicstyles":{"bold":"Полужирный","italic":"Курсив","strike":"Зачеркнутый","subscript":"Подстрочный индекс","superscript":"Надстрочный индекс","underline":"Подчеркнутый"},"bidi":{"ltr":"Направление текста слева направо","rtl":"Направление текста справа налево"},"blockquote":{"toolbar":"Цитата"},"clipboard":{"copy":"Копировать","copyError":"Настройки безопасности вашего браузера не разрешают редактору выполнять операции по копированию текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+C).","cut":"Вырезать","cutError":"Настройки безопасности вашего браузера не разрешают редактору выполнять операции по вырезке текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+X).","paste":"Вставить","pasteArea":"Зона для вставки","pasteMsg":"Пожалуйста, вставьте текст в зону ниже, используя клавиатуру (<strong>Ctrl/Cmd+V</strong>) и нажмите кнопку \"OK\".","securityMsg":"Настройки безопасности вашего браузера не разрешают редактору напрямую обращаться к буферу обмена. Вы должны вставить текст снова в это окно.","title":"Вставить"},"colorbutton":{"auto":"Автоматически","bgColorTitle":"Цвет фона","colors":{"000":"Чёрный","800000":"Бордовый","8B4513":"Кожано-коричневый","2F4F4F":"Темный синевато-серый","008080":"Сине-зелёный","000080":"Тёмно-синий","4B0082":"Индиго","696969":"Тёмно-серый","B22222":"Кирпичный","A52A2A":"Коричневый","DAA520":"Золотисто-берёзовый","006400":"Темно-зелёный","40E0D0":"Бирюзовый","0000CD":"Умеренно синий","800080":"Пурпурный","808080":"Серый","F00":"Красный","FF8C00":"Темно-оранжевый","FFD700":"Золотистый","008000":"Зелёный","0FF":"Васильковый","00F":"Синий","EE82EE":"Фиолетовый","A9A9A9":"Тускло-серый","FFA07A":"Светло-лососевый","FFA500":"Оранжевый","FFFF00":"Жёлтый","00FF00":"Лайма","AFEEEE":"Бледно-синий","ADD8E6":"Свелто-голубой","DDA0DD":"Сливовый","D3D3D3":"Светло-серый","FFF0F5":"Розово-лавандовый","FAEBD7":"Античный белый","FFFFE0":"Светло-жёлтый","F0FFF0":"Медвяной росы","F0FFFF":"Лазурный","F0F8FF":"Бледно-голубой","E6E6FA":"Лавандовый","FFF":"Белый"},"more":"Ещё цвета...","panelTitle":"Цвета","textColorTitle":"Цвет текста"},"colordialog":{"clear":"Очистить","highlight":"Под курсором","options":"Настройки цвета","selected":"Выбранный цвет","title":"Выберите цвет"},"templates":{"button":"Шаблоны","emptyListMsg":"(не определено ни одного шаблона)","insertOption":"Заменить текущее содержимое","options":"Параметры шаблона","selectPromptMsg":"Пожалуйста, выберите, какой шаблон следует открыть в редакторе","title":"Шаблоны содержимого"},"contextmenu":{"options":"Параметры контекстного меню"},"div":{"IdInputLabel":"Идентификатор","advisoryTitleInputLabel":"Заголовок","cssClassInputLabel":"Классы CSS","edit":"Редактировать контейнер","inlineStyleInputLabel":"Стиль элемента","langDirLTRLabel":"Слева направо (LTR)","langDirLabel":"Направление текста","langDirRTLLabel":"Справа налево (RTL)","languageCodeInputLabel":"Код языка","remove":"Удалить контейнер","styleSelectLabel":"Стиль","title":"Создать Div-контейнер","toolbar":"Создать Div-контейнер"},"toolbar":{"toolbarCollapse":"Свернуть панель инструментов","toolbarExpand":"Развернуть панель инструментов","toolbarGroups":{"document":"Документ","clipboard":"Буфер обмена / Отмена действий","editing":"Корректировка","forms":"Формы","basicstyles":"Простые стили","paragraph":"Абзац","links":"Ссылки","insert":"Вставка","styles":"Стили","colors":"Цвета","tools":"Инструменты"},"toolbars":"Панели инструментов редактора"},"elementspath":{"eleLabel":"Путь элементов","eleTitle":"Элемент %1"},"find":{"find":"Найти","findOptions":"Опции поиска","findWhat":"Найти:","matchCase":"Учитывать регистр","matchCyclic":"По всему тексту","matchWord":"Только слово целиком","notFoundMsg":"Искомый текст не найден.","replace":"Заменить","replaceAll":"Заменить всё","replaceSuccessMsg":"Успешно заменено %1 раз(а).","replaceWith":"Заменить на:","title":"Поиск и замена"},"fakeobjects":{"anchor":"Якорь","flash":"Flash анимация","hiddenfield":"Скрытое поле","iframe":"iFrame","unknown":"Неизвестный объект"},"flash":{"access":"Доступ к скриптам","accessAlways":"Всегда","accessNever":"Никогда","accessSameDomain":"В том же домене","alignAbsBottom":"По низу текста","alignAbsMiddle":"По середине текста","alignBaseline":"По базовой линии","alignTextTop":"По верху текста","bgcolor":"Цвет фона","chkFull":"Разрешить полноэкранный режим","chkLoop":"Повторять","chkMenu":"Включить меню Flash","chkPlay":"Автоматическое воспроизведение","flashvars":"Переменные для Flash","hSpace":"Гориз. отступ","properties":"Свойства Flash","propertiesTab":"Свойства","quality":"Качество","qualityAutoHigh":"Запуск на высоком","qualityAutoLow":"Запуск на низком","qualityBest":"Лучшее","qualityHigh":"Высокое","qualityLow":"Низкое","qualityMedium":"Среднее","scale":"Масштабировать","scaleAll":"Пропорционально","scaleFit":"Заполнять","scaleNoBorder":"Заходить за границы","title":"Свойства Flash","vSpace":"Вертик. отступ","validateHSpace":"Горизонтальный отступ задается числом.","validateSrc":"Вы должны ввести ссылку","validateVSpace":"Вертикальный отступ задается числом.","windowMode":"Взаимодействие с окном","windowModeOpaque":"Непрозрачный","windowModeTransparent":"Прозрачный","windowModeWindow":"Обычный"},"font":{"fontSize":{"label":"Размер","voiceLabel":"Размер шрифта","panelTitle":"Размер шрифта"},"label":"Шрифт","panelTitle":"Шрифт","voiceLabel":"Шрифт"},"forms":{"button":{"title":"Свойства кнопки","text":"Текст (Значение)","type":"Тип","typeBtn":"Кнопка","typeSbm":"Отправка","typeRst":"Сброс"},"checkboxAndRadio":{"checkboxTitle":"Свойства флаговой кнопки","radioTitle":"Свойства кнопки выбора","value":"Значение","selected":"Выбрано"},"form":{"title":"Свойства формы","menu":"Свойства формы","action":"Действие","method":"Метод","encoding":"Кодировка"},"hidden":{"title":"Свойства скрытого поля","name":"Имя","value":"Значение"},"select":{"title":"Свойства списка выбора","selectInfo":"Информация о списке выбора","opAvail":"Доступные варианты","value":"Значение","size":"Размер","lines":"строк(и)","chkMulti":"Разрешить выбор нескольких вариантов","opText":"Текст","opValue":"Значение","btnAdd":"Добавить","btnModify":"Изменить","btnUp":"Поднять","btnDown":"Опустить","btnSetValue":"Пометить как выбранное","btnDelete":"Удалить"},"textarea":{"title":"Свойства многострочного текстового поля","cols":"Колонок","rows":"Строк"},"textfield":{"title":"Свойства текстового поля","name":"Имя","value":"Значение","charWidth":"Ширина поля (в символах)","maxChars":"Макс. количество символов","type":"Тип содержимого","typeText":"Текст","typePass":"Пароль","typeEmail":"Email","typeSearch":"Поиск","typeTel":"Номер телефона","typeUrl":"Ссылка"}},"format":{"label":"Форматирование","panelTitle":"Форматирование","tag_address":"Адрес","tag_div":"Обычное (div)","tag_h1":"Заголовок 1","tag_h2":"Заголовок 2","tag_h3":"Заголовок 3","tag_h4":"Заголовок 4","tag_h5":"Заголовок 5","tag_h6":"Заголовок 6","tag_p":"Обычное","tag_pre":"Моноширинное"},"horizontalrule":{"toolbar":"Вставить горизонтальную линию"},"iframe":{"border":"Показать границы фрейма","noUrl":"Пожалуйста, введите ссылку фрейма","scrolling":"Отображать полосы прокрутки","title":"Свойства iFrame","toolbar":"iFrame"},"image":{"alertUrl":"Пожалуйста, введите ссылку на изображение","alt":"Альтернативный текст","border":"Граница","btnUpload":"Загрузить на сервер","button2Img":"Вы желаете преобразовать это изображение-кнопку в обычное изображение?","hSpace":"Гориз. отступ","img2Button":"Вы желаете преобразовать это обычное изображение в изображение-кнопку?","infoTab":"Данные об изображении","linkTab":"Ссылка","lockRatio":"Сохранять пропорции","menu":"Свойства изображения","resetSize":"Вернуть обычные размеры","title":"Свойства изображения","titleButton":"Свойства изображения-кнопки","upload":"Загрузить","urlMissing":"Не указана ссылка на изображение.","vSpace":"Вертик. отступ","validateBorder":"Размер границ должен быть задан числом.","validateHSpace":"Горизонтальный отступ должен быть задан числом.","validateVSpace":"Вертикальный отступ должен быть задан числом."},"indent":{"indent":"Увеличить отступ","outdent":"Уменьшить отступ"},"smiley":{"options":"Выбор смайла","title":"Вставить смайл","toolbar":"Смайлы"},"justify":{"block":"По ширине","center":"По центру","left":"По левому краю","right":"По правому краю"},"link":{"acccessKey":"Клавиша доступа","advanced":"Дополнительно","advisoryContentType":"Тип содержимого","advisoryTitle":"Заголовок","anchor":{"toolbar":"Вставить / редактировать якорь","menu":"Изменить якорь","title":"Свойства якоря","name":"Имя якоря","errorName":"Пожалуйста, введите имя якоря","remove":"Удалить якорь"},"anchorId":"По идентификатору","anchorName":"По имени","charset":"Кодировка ресурса","cssClasses":"Классы CSS","emailAddress":"Email адрес","emailBody":"Текст сообщения","emailSubject":"Тема сообщения","id":"Идентификатор","info":"Информация о ссылке","langCode":"Код языка","langDir":"Направление текста","langDirLTR":"Слева направо (LTR)","langDirRTL":"Справа налево (RTL)","menu":"Редактировать ссылку","name":"Имя","noAnchors":"(В документе нет ни одного якоря)","noEmail":"Пожалуйста, введите email адрес","noUrl":"Пожалуйста, введите ссылку","other":"<другой>","popupDependent":"Зависимое (Netscape)","popupFeatures":"Параметры всплывающего окна","popupFullScreen":"Полноэкранное (IE)","popupLeft":"Отступ слева","popupLocationBar":"Панель адреса","popupMenuBar":"Панель меню","popupResizable":"Изменяемый размер","popupScrollBars":"Полосы прокрутки","popupStatusBar":"Строка состояния","popupToolbar":"Панель инструментов","popupTop":"Отступ сверху","rel":"Отношение","selectAnchor":"Выберите якорь","styles":"Стиль","tabIndex":"Последовательность перехода","target":"Цель","targetFrame":"<фрейм>","targetFrameName":"Имя целевого фрейма","targetPopup":"<всплывающее окно>","targetPopupName":"Имя всплывающего окна","title":"Ссылка","toAnchor":"Ссылка на якорь в тексте","toEmail":"Email","toUrl":"Ссылка","toolbar":"Вставить/Редактировать ссылку","type":"Тип ссылки","unlink":"Убрать ссылку","upload":"Загрузка"},"list":{"bulletedlist":"Вставить / удалить маркированный список","numberedlist":"Вставить / удалить нумерованный список"},"liststyle":{"armenian":"Армянская нумерация","bulletedTitle":"Свойства маркированного списка","circle":"Круг","decimal":"Десятичные (1, 2, 3, и т.д.)","decimalLeadingZero":"Десятичные с ведущим нулём (01, 02, 03, и т.д.)","disc":"Окружность","georgian":"Грузинская нумерация (ани, бани, гани, и т.д.)","lowerAlpha":"Строчные латинские (a, b, c, d, e, и т.д.)","lowerGreek":"Строчные греческие (альфа, бета, гамма, и т.д.)","lowerRoman":"Строчные римские (i, ii, iii, iv, v, и т.д.)","none":"Нет","notset":"<не указано>","numberedTitle":"Свойства нумерованного списка","square":"Квадрат","start":"Начиная с","type":"Тип","upperAlpha":"Заглавные латинские (A, B, C, D, E, и т.д.)","upperRoman":"Заглавные римские (I, II, III, IV, V, и т.д.)","validateStartNumber":"Первый номер списка должен быть задан обычным целым числом."},"magicline":{"title":"Вставить здесь параграф"},"maximize":{"maximize":"Развернуть","minimize":"Свернуть"},"newpage":{"toolbar":"Новая страница"},"pagebreak":{"alt":"Разрыв страницы","toolbar":"Вставить разрыв страницы для печати"},"pastetext":{"button":"Вставить только текст","title":"Вставить только текст"},"pastefromword":{"confirmCleanup":"Текст, который вы желаете вставить, по всей видимости, был скопирован из Word. Следует ли очистить его перед вставкой?","error":"Невозможно очистить вставленные данные из-за внутренней ошибки","title":"Вставить из Word","toolbar":"Вставить из Word"},"preview":{"preview":"Предварительный просмотр"},"print":{"toolbar":"Печать"},"removeformat":{"toolbar":"Убрать форматирование"},"save":{"toolbar":"Сохранить"},"selectall":{"toolbar":"Выделить все"},"showblocks":{"toolbar":"Отображать блоки"},"sourcearea":{"toolbar":"Источник"},"specialchar":{"options":"Выбор специального символа","title":"Выберите специальный символ","toolbar":"Вставить специальный символ"},"scayt":{"about":"О SCAYT","aboutTab":"О SCAYT","addWord":"Добавить слово","allCaps":"Игнорировать слова из заглавных букв","dic_create":"Создать","dic_delete":"Удалить","dic_field_name":"Название словаря","dic_info":"Изначально, пользовательский словарь хранится в cookie, которые ограничены в размере. Когда словарь пользователя вырастает до размеров, что его невозможно хранить в cookie, он переносится на хранение на наш сервер. Чтобы сохранить ваш словарь на нашем сервере, вам следует указать название вашего словаря. Если у вас уже был словарь, который вы сохраняли на нашем сервере, то укажите здесь его название и нажмите кнопку Восстановить.","dic_rename":"Переименовать","dic_restore":"Восстановить","dictionariesTab":"Словари","disable":"Отключить SCAYT","emptyDic":"Вы должны указать название словаря.","enable":"Включить SCAYT","ignore":"Пропустить","ignoreAll":"Пропустить всё","ignoreDomainNames":"Игнорировать доменные имена","langs":"Языки","languagesTab":"Языки","mixedCase":"Игнорировать слова из букв в разном регистре","mixedWithDigits":"Игнорировать слова, содержащие цифры","moreSuggestions":"Ещё варианты","opera_title":"Не поддерживается Opera","options":"Настройки","optionsTab":"Параметры","title":"Проверка орфографии по мере ввода (SCAYT)","toggle":"Переключить SCAYT","noSuggestions":"Нет вариантов"},"stylescombo":{"label":"Стили","panelTitle":"Стили форматирования","panelTitle1":"Стили блока","panelTitle2":"Стили элемента","panelTitle3":"Стили объекта"},"table":{"border":"Размер границ","caption":"Заголовок","cell":{"menu":"Ячейка","insertBefore":"Вставить ячейку слева","insertAfter":"Вставить ячейку справа","deleteCell":"Удалить ячейки","merge":"Объединить ячейки","mergeRight":"Объединить с правой","mergeDown":"Объединить с нижней","splitHorizontal":"Разделить ячейку по горизонтали","splitVertical":"Разделить ячейку по вертикали","title":"Свойства ячейки","cellType":"Тип ячейки","rowSpan":"Объединяет строк","colSpan":"Объединяет колонок","wordWrap":"Перенос по словам","hAlign":"Горизонтальное выравнивание","vAlign":"Вертикальное выравнивание","alignBaseline":"По базовой линии","bgColor":"Цвет фона","borderColor":"Цвет границ","data":"Данные","header":"Заголовок","yes":"Да","no":"Нет","invalidWidth":"Ширина ячейки должна быть числом.","invalidHeight":"Высота ячейки должна быть числом.","invalidRowSpan":"Количество объединяемых строк должно быть задано числом.","invalidColSpan":"Количество объединяемых колонок должно быть задано числом.","chooseColor":"Выберите"},"cellPad":"Внутренний отступ ячеек","cellSpace":"Внешний отступ ячеек","column":{"menu":"Колонка","insertBefore":"Вставить колонку слева","insertAfter":"Вставить колонку справа","deleteColumn":"Удалить колонки"},"columns":"Колонки","deleteTable":"Удалить таблицу","headers":"Заголовки","headersBoth":"Сверху и слева","headersColumn":"Левая колонка","headersNone":"Без заголовков","headersRow":"Верхняя строка","invalidBorder":"Размер границ должен быть числом.","invalidCellPadding":"Внутренний отступ ячеек (cellpadding) должен быть числом.","invalidCellSpacing":"Внешний отступ ячеек (cellspacing) должен быть числом.","invalidCols":"Количество столбцов должно быть больше 0.","invalidHeight":"Высота таблицы должна быть числом.","invalidRows":"Количество строк должно быть больше 0.","invalidWidth":"Ширина таблицы должна быть числом.","menu":"Свойства таблицы","row":{"menu":"Строка","insertBefore":"Вставить строку сверху","insertAfter":"Вставить строку снизу","deleteRow":"Удалить строки"},"rows":"Строки","summary":"Итоги","title":"Свойства таблицы","toolbar":"Таблица","widthPc":"процентов","widthPx":"пикселей","widthUnit":"единица измерения"},"undo":{"redo":"Повторить","undo":"Отменить"},"wsc":{"btnIgnore":"Пропустить","btnIgnoreAll":"Пропустить всё","btnReplace":"Заменить","btnReplaceAll":"Заменить всё","btnUndo":"Отменить","changeTo":"Изменить на","errorLoading":"Произошла ошибка при подключении к серверу проверки орфографии: %s.","ieSpellDownload":"Модуль проверки орфографии не установлен. Хотите скачать его?","manyChanges":"Проверка орфографии завершена. Изменено слов: %1","noChanges":"Проверка орфографии завершена. Не изменено ни одного слова","noMispell":"Проверка орфографии завершена. Ошибок не найдено","noSuggestions":"- Варианты отсутствуют -","notAvailable":"Извините, но в данный момент сервис недоступен.","notInDic":"Отсутствует в словаре","oneChange":"Проверка орфографии завершена. Изменено одно слово","progress":"Орфография проверяется...","title":"Проверка орфографии","toolbar":"Проверить орфографию"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/si.js b/htmltest/sites/all/libraries/ckeditor-version/lang/si.js
new file mode 100644
index 00000000..0d81efbd
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/si.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['si']={"editor":"පොහොසත් වචන සංස්කරණ","common":{"editorHelp":"උදව් ලබා ගැනීමට  ALT බොත්තම ඔබන්න","browseServer":"සෙවුම් සේවාදායකය","url":"URL","protocol":"මුලාපත්රය","upload":"උඩුගතකිරීම","uploadSubmit":"සේවාදායකය වෙත යොමුකිරිම","image":"රුපය","flash":"දීප්තිය","form":"පෝරමය","checkbox":"ලකුණුකිරීමේ කොටුව","radio":"තේරීම් ","textField":"ලියන ප්රදේශය","textarea":"අකුරු ","hiddenField":"සැඟවුණු ප්රදේශය","button":"බොත්තම","select":"තෝරන්න ","imageButton":"රුප ","notSet":"<යොදා >","id":"අංකය","name":"නම","langDir":"භාෂා දිශාව","langDirLtr":"වමේසිට දකුණුට","langDirRtl":"දකුණේ සිට වමට","langCode":"භාෂා කේතය","longDescr":"සම්පුර්න පැහැදිලි කිරීම","cssClass":"විලාශ පත්ර පන්තිය","advisoryTitle":"උපදෙස් ","cssStyle":"විලාසය","ok":"නිරදි","cancel":"අවලංගු කිරීම","close":"වැසීම","preview":"නැවත ","resize":"විශාලත්වය නැවත වෙනස් කිරීම","generalTab":"පොදු කරුණු.","advancedTab":"දීය","validateNumberFailed":"මෙම වටිනාකම අංකයක් නොවේ","confirmNewPage":"ආරක්ෂා නොකළ සියලුම දත්තයන් මැකියනුලැබේ. ඔබට නව පිටුවක් ලබා ගැනීමට අවශ්යද?","confirmCancel":"ඇතම් විකල්පයන් වෙනස් කර ඇත. ඔබට මින් නික්මීමට අවශ්යද?","options":" විකල්ප","target":"අරමුණ","targetNew":"නව කව්ළුව","targetTop":"වැදගත් කව්ළුව","targetSelf":"එම කව්ළුව(_තම\\\\)","targetParent":"මව් කව්ළුව(_)","langDirLTR":"වමේසිට දකුණුට","langDirRTL":"දකුණේ සිට වමට","styles":"විලාසය","cssClasses":"විලාසපත්ර පන්තිය","width":"පළල","height":"උස","align":"ගැලපුම","alignLeft":"වම","alignRight":"දකුණ","alignCenter":"මධ්ය","alignTop":"ඉ","alignMiddle":"මැද","alignBottom":"පහල","invalidValue":"වැරදී වටිනාකමකි","invalidHeight":"උස අංකයක් විය යුතුය","invalidWidth":"පළල අංකයක් විය යුතුය","invalidCssLength":"වටිනාකමක් නිරූපණය කිරීම \"%1\" ප්රදේශය ධන සංක්යාත්මක වටිනාකමක් හෝ  නිවරදි නොවන  CSS මිනුම් එකක(px, %, in, cm, mm, em, ex, pt, pc)","invalidHtmlLength":"වටිනාකමක් නිරූපණය කිරීම \"%1\" ප්රදේශය ධන සංක්යාත්මක වටිනාකමක් හෝ  නිවරදි නොවන  HTML මිනුම් එකක (px හෝ %).","invalidInlineStyle":"වටිනාකමක් නිරූපණය කිරීම  පේළි විලාසයයට ආකෘතිය  අනතර්ග විය යුතය  \"නම : වටිනාකම\", තිත් කොමාවකින් වෙන් වෙන ලද.","cssLengthTooltip":"සංක්යා ඇතුලත් කිරීමේදී වටිනාකම තිත් ප්රමාණය නිවරදි CSS  ඒකක(තිත්, %, අඟල්,සෙමි, mm, em, ex, pt, pc)","unavailable":"%1<span පන්තිය=\"ළඟා වියහැකි ද බලන්න\">, නොමැතිනම්</span>"},"about":{"copy":"පිටපත් අයිතිය සහ පිටපත් කිරීම;$1 .සියලුම හිමිකම් ඇවිරිණි.","dlgTitle":"CKEditor ගැන විස්තර","help":"උදව් සඳහා $1 ","moreInfo":"බලපත්ර තොරතුරු සදහා කරුණාකර අපගේ විද්යුත් ලිපිනයට පිවිසෙන්න:","title":"CKEditor ගැන විස්තර","userGuide":"CKEditor භාවිතා කිරීම පිළිබඳ "},"basicstyles":{"bold":"තද අකුරින් ලියනලද","italic":"බැධීඅකුරින් ලියන ලද","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"යටින් ඉරි අදින ලද"},"bidi":{"ltr":"වගන්ති දිශාව වමේ සිට දකුණට","rtl":"වගන්ති දිශාව  දකුණේ සිට වමට"},"blockquote":{"toolbar":"උද්ධෘත කොටස"},"clipboard":{"copy":"පිටපත් කරන්න","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"කපාගන්න","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"අලවන්න","pasteArea":"අලවන ප්රදේශ","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"අලවන්න"},"colorbutton":{"auto":"Automatic","bgColorTitle":"පසුබිම් වර්ණය","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"More Colors...","panelTitle":"වර්ණය","textColorTitle":"අක්ෂර වර්ණ"},"colordialog":{"clear":"පැහැදිලි","highlight":"මතුකර පෙන්වන්න","options":"වර්ණ විකල්ප","selected":"තෙරු වර්ණ","title":"වර්ණ තෝරන්න"},"templates":{"button":"අච්චුව","emptyListMsg":"කිසිම අච්චුවක් කලින් තීරණය කර ","insertOption":"සත්ය අන්තර්ගතයන් ප්රතිස්ථාපනය කරන්න","options":"අච්චු ","selectPromptMsg":"කරුණාකර සංස්කරණය සදහා අච්චුවක් ","title":"අන්තර්ගත් අච්චුන්"},"contextmenu":{"options":"අනතර්ග ලේඛණ  විකල්ප"},"div":{"IdInputLabel":"අංකය","advisoryTitleInputLabel":"උපදේශාත්මක නාමය","cssClassInputLabel":"විලාසපත්ර පන්තිය","edit":"වෙනස්කිරීම","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"වමේසිට දකුණුට","langDirLabel":"භාෂා දිශාව","langDirRTLLabel":"දකුණේ සිට වමට","languageCodeInputLabel":"භාෂා ","remove":"ඉවත් කිරීම","styleSelectLabel":"විලාසය","title":"නිර්මාණය ","toolbar":"නිර්මාණය "},"toolbar":{"toolbarCollapse":"මෙවලම් තීරුව හැකුලුම.","toolbarExpand":"මෙවලම් තීරුව දීගහැරුම","toolbarGroups":{"document":"ලිපිය","clipboard":"ඇමිණුම වෙනස් කිරීම","editing":"සංස්කරණය","forms":"පෝරමය","basicstyles":"මුලික විලාසය","paragraph":"චේදය","links":"සබැඳිය","insert":"ඇතුලත් කිරීම","styles":"විලාසය","colors":"වර්ණය","tools":"මෙවලම්"},"toolbars":"සංස්කරණ මෙවලම් තීරුව"},"elementspath":{"eleLabel":"මුලද්රව්ය මාර්ගය","eleTitle":"%1 මුල"},"find":{"find":"Find","findOptions":"Find Options","findWhat":"Find what:","matchCase":"Match case","matchCyclic":"Match cyclic","matchWord":"Match whole word","notFoundMsg":"The specified text was not found.","replace":"හිලව් කිරීම","replaceAll":"සියල්ලම හිලව් කරන්න","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Replace with:","title":"Find and Replace"},"fakeobjects":{"anchor":"ආධාරය","flash":"Flash Animation","hiddenfield":"සැඟවුණු ප්රදේශය","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"පිටපත් ප්රවේශය","accessAlways":"හැමවිටම","accessNever":"කිසිදා නොවේ","accessSameDomain":"එකම වසමේ","alignAbsBottom":"පතුල","alignAbsMiddle":"Abs ","alignBaseline":"පාද රේඛාව","alignTextTop":"වගන්තිය ඉහල","bgcolor":"පසුබිම් වර්ණය","chkFull":"පුර්ණ තිරය සදහා අවසර","chkLoop":"පුඩුව","chkMenu":"සක්රිය බබලන මෙනුව","chkPlay":"ස්වයංක්රිය ක්රියාත්මක වීම","flashvars":"වෙනස්වන දත්ත","hSpace":"HSpace","properties":"බබලන ගුණ","propertiesTab":"ගුණ","quality":"තත්වය","qualityAutoHigh":"ස්වයංක්රිය  ","qualityAutoLow":" ස්වයංක්රිය   ","qualityBest":"වඩාත් ගැලපෙන","qualityHigh":"ඉහළ","qualityLow":"පහළ","qualityMedium":"මධ්ය","scale":"පරිමාණ","scaleAll":"සියල්ල ","scaleFit":"හරියටම ගැලපෙන","scaleNoBorder":"මාඉම් නොමැති","title":"බබලන ","vSpace":"VSpace","validateHSpace":"HSpace සංක්යාවක් විය යුතුය.","validateSrc":"URL හිස් නොවිය ","validateVSpace":"VSpace සංක්යාවක් විය යුතුය","windowMode":"ජනෙල ක්රමය","windowModeOpaque":"විනිවිද පෙනෙන","windowModeTransparent":"විනිවිද පෙනෙන","windowModeWindow":"ජනෙල"},"font":{"fontSize":{"label":"විශාලත්වය","voiceLabel":"අක්ෂර විශාලත්වය","panelTitle":"අක්ෂර විශාලත්වය"},"label":"අක්ෂරය","panelTitle":"අක්ෂර නාමය","voiceLabel":"අක්ෂර"},"forms":{"button":{"title":"බොත්තම් ගුණ","text":"වගන්තිය(වටිනාකම)","type":"වර්ගය","typeBtn":"බොත්තම","typeSbm":"යොමුකරනවා","typeRst":"නැවත ආරම්භකතත්වයට පත් කරනවා"},"checkboxAndRadio":{"checkboxTitle":"ලකුණු කිරීමේ කොටුවේ ලක්ෂණ","radioTitle":"Radio Button Properties","value":"Value","selected":"Selected"},"form":{"title":"පෝරමයේ ","menu":"පෝරමයේ ගුණ/","action":"ගන්නා පියවර","method":"ක්රමය","encoding":"කේතීකරණය"},"hidden":{"title":"සැඟවුණු ප්රදේශයේ ","name":"නම","value":"Value"},"select":{"title":"තේරීම් ප්රදේශයේ ","selectInfo":"විස්තර තෝරන්න","opAvail":"ඉතුරුවී ඇති වීකල්ප","value":"Value","size":"විශාලත්වය","lines":"lines","chkMulti":"Allow multiple selections","opText":"Text","opValue":"Value","btnAdd":"Add","btnModify":"Modify","btnUp":"Up","btnDown":"Down","btnSetValue":"Set as selected value","btnDelete":"මකා දැම්ම"},"textarea":{"title":"Textarea Properties","cols":"සිරස් ","rows":"Rows"},"textfield":{"title":"Text Field Properties","name":"නම","value":"Value","charWidth":"Character Width","maxChars":"Maximum Characters","type":"වර්ගය","typeText":"Text","typePass":"Password","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"ආකෘතිය","panelTitle":"චේදයේ ","tag_address":"ලිපිනය","tag_div":"සාමාන්ය(DIV)","tag_h1":"ශීර්ෂය 1","tag_h2":"ශීර්ෂය 2","tag_h3":"ශීර්ෂය 3","tag_h4":"ශීර්ෂය 4","tag_h5":"ශීර්ෂය 5","tag_h6":"ශීර්ෂය 6","tag_p":"සාමාන්ය","tag_pre":"ආකෘතියන්"},"horizontalrule":{"toolbar":"තිරස් රේඛාවක් ඇතුලත් කරන්න"},"iframe":{"border":"සැකිල්ලේ කඩයිම් ","noUrl":"කරුණාකර රුපයේ URL ලියන්න","scrolling":"සක්ක්රිය කරන්න","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"කරුණාකර රුපයේ URL ලියන්න","alt":"විකල්ප ","border":"සීමාවවල ","btnUpload":"සේවාදායකය වෙත යොමුකිරිම","button2Img":"ඔබට තෝරන ලද රුපය පරිවර්තනය කිරීමට අවශ්යද?","hSpace":"HSpace","img2Button":"ඔබට තෝරන ලද රුපය පරිවර්තනය කිරීමට අවශ්යද?","infoTab":"රුපයේ තොරතුරු","linkTab":"සබැඳිය","lockRatio":"නවතන අනුපාතය ","menu":"රුපයේ ගුණ","resetSize":"නැවතත් විශාලත්වය වෙනස් කිරීම","title":"රුපයේ ","titleButton":"රුප බොත්තමේ ගුණ","upload":"උඩුගතකිරීම","urlMissing":"රුප මුලාශ්ර URL නැත.","vSpace":"VSpace","validateBorder":"මාඉම් සම්පුර්ණ සංක්යාවක් විය යුතුය.","validateHSpace":"HSpace  සම්පුර්ණ සංක්යාවක් විය යුතුය","validateVSpace":"VSpace සම්පුර්ණ සංක්යාවක් විය යුතුය."},"indent":{"indent":"අතර පරතරය වැඩිකරන්න","outdent":"අතර පරතරය අඩුකරන්න"},"smiley":{"options":"හාස්ය විකල්ප","title":"හාස්යන් ඇතුලත් කිරීම","toolbar":"හාස්යන්"},"justify":{"block":"Justify","center":"මධ්ය","left":"Align Left","right":"Align Right"},"link":{"acccessKey":"ප්රවේශ  යතුර","advanced":"දීය","advisoryContentType":"උපදේශාත්මක අන්තර්ගත ආකාරය","advisoryTitle":"උපදේශාත්මක නාමය","anchor":{"toolbar":"ආධාරය","menu":"ආධාරය වෙනස් කිරීම","title":"ආධාරක ","name":"ආධාරකයේ නාමය","errorName":"කරුණාකර ආධාරකයේ නාමය ඇතුල් කරන්න","remove":"ආධාරකය ඉවත් කිරීම"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"විලාසපත්ර පන්තිය","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"අංකය","info":"Link Info","langCode":"භාෂා කේතය","langDir":"භාෂා දිශාව","langDirLTR":"වමේසිට දකුණුට","langDirRTL":"දකුණේ සිට වමට","menu":"Edit Link","name":"නම","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"විලාසය","tabIndex":"Tab Index","target":"අරමුණ","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"සබැඳිය","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"සබැඳිය","type":"Link Type","unlink":"Unlink","upload":"උඩුගතකිරීම"},"list":{"bulletedlist":"ඇතුලත් / ඉවත් කිරීම ලඉස්තුව","numberedlist":"ඇතුලත් / ඉවත් කිරීම අන්න්කිත ලඉස්තුව"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"කිසිවක්ම නොවේ","notset":"<යොදා >","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"වර්ගය","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"චේදය ඇතුලත් කරන්න"},"maximize":{"maximize":"විශාල කිරීම","minimize":"කුඩා කිරීම"},"newpage":{"toolbar":"නව පිටුවක්"},"pagebreak":{"alt":"පිටු බිදුම","toolbar":"මුද්රණය සඳහා පිටු බිදුමක් ඇතුලත් කරන්න"},"pastetext":{"button":"සාමාන්ය අක්ෂර ලෙස අලවන්න","title":"සාමාන්ය අක්ෂර ලෙස අලවන්න"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"වචන වලින් අලවන්න","toolbar":"වචන වලින් අලවන්න"},"preview":{"preview":"නැවත "},"print":{"toolbar":"මුද්රණය කරන්න"},"removeformat":{"toolbar":"සැකසීම වෙනස් කරන්න"},"save":{"toolbar":"ආරක්ෂා කරන්න"},"selectall":{"toolbar":"සියල්ලම "},"showblocks":{"toolbar":"කොටස පෙන්නන්න"},"sourcearea":{"toolbar":"මුලාශ්රය"},"specialchar":{"options":"විශේෂ  ගුණාංග වීකල්ප","title":"විශේෂ  ගුණාංග ","toolbar":"විශේෂ ගුණාංග ඇතුලත් "},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"විලාසය","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"සීමාවවල විශාලත්වය","caption":"Caption","cell":{"menu":"කොටුව","insertBefore":"පෙර කොටුවක් ඇතුල්කිරිම","insertAfter":"පසුව කොටුවක් ඇතුලත් ","deleteCell":"කොටුව මැකීම","merge":"කොටු එකට යාකිරිම","mergeRight":"දකුණට ","mergeDown":"පහලට ","splitHorizontal":"තිරස්ව කොටු පැතිරීම","splitVertical":"සිරස්ව කොටු පැතිරීම","title":"කොටු ","cellType":"කොටු වර්ගය","rowSpan":"පේළි පළල","colSpan":"සිරස් පළල","wordWrap":"වචන ගැලපුම","hAlign":"තිරස්ව ","vAlign":"සිරස්ව ","alignBaseline":"පාද රේඛාව","bgColor":"පසුබිම් වර්ණය","borderColor":"මායිම් ","data":"Data","header":"ශීර්ෂක","yes":"ඔව්","no":"නැත","invalidWidth":"කොටු පළල සංඛ්ය්ත්මක වටිනාකමක් විය යුතුය","invalidHeight":"කොටු උස සංඛ්ය්ත්මක වටිනාකමක් විය යුතුය","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"තෝරන්න"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"සිරස් ","deleteTable":"වගුව මකන්න","headers":"ශීර්ෂක","headersBoth":"දෙකම","headersColumn":"පළමූ සිරස් තීරුව","headersNone":"කිසිවක්ම නොවේ","headersRow":"පළමූ පේළිය","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"නැවත කිරීම","undo":"වෙනස් කිරීම"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/sk.js b/htmltest/sites/all/libraries/ckeditor-version/lang/sk.js
new file mode 100644
index 00000000..28c9fb68
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/sk.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sk']={"editor":"Editor formátovaného textu","common":{"editorHelp":"Stlačte ALT 0 pre nápovedu","browseServer":"Prechádzať server","url":"URL","protocol":"Protokol","upload":"Odoslať","uploadSubmit":"Odoslať na server","image":"Obrázok","flash":"Flash","form":"Formulár","checkbox":"Zaškrtávacie políčko","radio":"Prepínač","textField":"Textové pole","textarea":"Textová oblasť","hiddenField":"Skryté pole","button":"Tlačidlo","select":"Rozbaľovací zoznam","imageButton":"Obrázkové tlačidlo","notSet":"<nenastavené>","id":"Id","name":"Meno","langDir":"Orientácia jazyka","langDirLtr":"Zľava doprava (LTR)","langDirRtl":"Sprava doľava (RTL)","langCode":"Kód jazyka","longDescr":"Dlhý popis URL","cssClass":"Trieda štýlu","advisoryTitle":"Pomocný titulok","cssStyle":"Štýl","ok":"OK","cancel":"Zrušiť","close":"Zatvorit","preview":"Náhľad","resize":"Zmeniť veľkosť","generalTab":"Hlavné","advancedTab":"Rozšírené","validateNumberFailed":"Hodnota nieje číslo.","confirmNewPage":"Prajete si načítat novú stránku? Všetky neuložené zmeny budú stratené. ","confirmCancel":"Niektore možnosti boli zmenené. Naozaj chcete zavrieť okno?","options":"Možnosti","target":"Cieľ","targetNew":"Nové okno (_blank)","targetTop":"Najvrchnejšie okno (_top)","targetSelf":"To isté okno (_self)","targetParent":"Rodičovské okno (_parent)","langDirLTR":"Zľava doprava (LTR)","langDirRTL":"Sprava doľava (RTL)","styles":"Štýl","cssClasses":"Triedy štýlu","width":"Šírka","height":"Výška","align":"Zarovnanie","alignLeft":"Vľavo","alignRight":"Vpravo","alignCenter":"Na stred","alignTop":"Nahor","alignMiddle":"Na stred","alignBottom":"Dole","invalidValue":"Neplatná hodnota.","invalidHeight":"Výška musí byť číslo.","invalidWidth":"Šírka musí byť číslo.","invalidCssLength":"Špecifikovaná hodnota pre pole \"%1\" musí byť kladné číslo s alebo bez platnej CSS mernej jednotky (px, %, in, cm, mm, em, ex, pt alebo pc).","invalidHtmlLength":"Špecifikovaná hodnota pre pole \"%1\" musí byť kladné číslo s alebo bez platnej HTML mernej jednotky (px alebo %).","invalidInlineStyle":"Zadaná hodnota pre inline štýl musí pozostávať s jedného, alebo viac dvojíc formátu \"názov: hodnota\", oddelených bodkočiarkou.","cssLengthTooltip":"Vložte číslo pre hodnotu v pixeloch alebo číslo so správnou CSS jednotou (px, %, in, cm, mm, em, ex, pt alebo pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedostupný</span>"},"about":{"copy":"Copyright &copy; $1. Všetky práva vyhradené.","dlgTitle":"O CKEditor-e","help":"Zaškrtnite $1 pre pomoc.","moreInfo":"Pre informácie o licenciách, prosíme, navštívte našu web stránku:","title":"O CKEditor-e","userGuide":"Používateľská príručka KCEditor-a"},"basicstyles":{"bold":"Tučné","italic":"Kurzíva","strike":"Prečiarknuté","subscript":"Dolný index","superscript":"Horný index","underline":"Podčiarknuté"},"bidi":{"ltr":"Smer textu zľava doprava","rtl":"Smer textu sprava doľava"},"blockquote":{"toolbar":"Citácia"},"clipboard":{"copy":"Kopírovať","copyError":"Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru automaticky spustiť operáciu kopírovania. Prosím, použite na to klávesnicu (Ctrl/Cmd+C).","cut":"Vystrihnúť","cutError":"Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru automaticky spustiť operáciu vystrihnutia. Prosím, použite na to klávesnicu (Ctrl/Cmd+X).","paste":"Vložiť","pasteArea":"Miesto pre vloženie","pasteMsg":"Prosím, vložte nasledovný rámček použitím klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stlačte OK.","securityMsg":"Kvôli vašim bezpečnostným nastaveniam prehliadača editor nie je schopný pristupovať k vašej schránke na kopírovanie priamo. Vložte to preto do tohto okna.","title":"Vložiť"},"colorbutton":{"auto":"Automaticky","bgColorTitle":"Farba pozadia","colors":{"000":"Čierna","800000":"Maroon","8B4513":"Sedlová hnedá","2F4F4F":"Tmavo bridlicovo sivá","008080":"Modrozelená","000080":"Tmavomodrá","4B0082":"Indigo","696969":"Tmavá sivá","B22222":"Ohňová tehlová","A52A2A":"Hnedá","DAA520":"Zlatobyľ","006400":"Tmavá zelená","40E0D0":"Tyrkysová","0000CD":"Stredná modrá","800080":"Purpurová","808080":"Sivá","F00":"Červená","FF8C00":"Tmavá oranžová","FFD700":"Zlatá","008000":"Zelená","0FF":"Azúrová","00F":"Modrá","EE82EE":"Fialová","A9A9A9":"Tmavá sivá","FFA07A":"Svetlo lososová","FFA500":"Oranžová","FFFF00":"Žltá","00FF00":"Vápenná","AFEEEE":"Svetlo tyrkysová","ADD8E6":"Svetlo modrá","DDA0DD":"Slivková","D3D3D3":"Svetlo sivá","FFF0F5":"Levanduľovo červená","FAEBD7":"Antická biela","FFFFE0":"Svetlo žltá","F0FFF0":"Medová","F0FFFF":"Azúrová","F0F8FF":"Alicovo modrá","E6E6FA":"Levanduľová","FFF":"Biela"},"more":"Viac farieb...","panelTitle":"Farby","textColorTitle":"Farba textu"},"colordialog":{"clear":"Vyčistiť","highlight":"Zvýrazniť","options":"Možnosti farby","selected":"Vybraná farba","title":"Vyberte farbu"},"templates":{"button":"Šablóny","emptyListMsg":"(Žiadne šablóny nedefinované)","insertOption":"Nahradiť aktuálny obsah","options":"Možnosti šablóny","selectPromptMsg":"Prosím vyberte šablónu na otvorenie v editore","title":"Šablóny obsahu"},"contextmenu":{"options":"Možnosti kontextového menu"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Pomocný titulok","cssClassInputLabel":"Triedy štýlu","edit":"Upraviť Div","inlineStyleInputLabel":"Inline štýl","langDirLTRLabel":"Zľava doprava (LTR)","langDirLabel":"Smer jazyka","langDirRTLLabel":"Zprava doľava (RTL)","languageCodeInputLabel":"Kód jazyka","remove":"Odstrániť Div","styleSelectLabel":"Štýl","title":"Vytvoriť Div kontajner","toolbar":"Vytvoriť Div kontajner"},"toolbar":{"toolbarCollapse":"Zbaliť lištu nástrojov","toolbarExpand":"Rozbaliť lištu nástrojov","toolbarGroups":{"document":"Dokument","clipboard":"Schránka pre kopírovanie/Späť","editing":"Upravovanie","forms":"Formuláre","basicstyles":"Základné štýly","paragraph":"Odstavec","links":"Odkazy","insert":"Vložiť","styles":"Štýly","colors":"Farby","tools":"Nástroje"},"toolbars":"Lišty nástrojov editora"},"elementspath":{"eleLabel":"Cesta prvkov","eleTitle":"%1 prvok"},"find":{"find":"Hľadať","findOptions":"Nájsť možnosti","findWhat":"Čo hľadať:","matchCase":"Rozlišovať malé a veľké písmená","matchCyclic":"Cykliť zhodu","matchWord":"Len celé slová","notFoundMsg":"Hľadaný text nebol nájdený.","replace":"Nahradiť","replaceAll":"Nahradiť všetko","replaceSuccessMsg":"%1 výskyt(ov) nahradených.","replaceWith":"Čím nahradiť:","title":"Nájsť a nahradiť"},"fakeobjects":{"anchor":"Kotva","flash":"Flash animácia","hiddenfield":"Skryté pole","iframe":"IFrame","unknown":"Neznámy objekt"},"flash":{"access":"Prístup skriptu","accessAlways":"Vždy","accessNever":"Nikdy","accessSameDomain":"Rovnaká doména","alignAbsBottom":"Úplne dole","alignAbsMiddle":"Do stredu","alignBaseline":"Na základnú čiaru","alignTextTop":"Na horný okraj textu","bgcolor":"Farba pozadia","chkFull":"Povoliť zobrazenie na celú obrazovku (fullscreen)","chkLoop":"Opakovanie","chkMenu":"Povoliť Flash Menu","chkPlay":"Automatické prehrávanie","flashvars":"Premenné pre Flash","hSpace":"H-medzera","properties":"Vlastnosti Flashu","propertiesTab":"Vlastnosti","quality":"Kvalita","qualityAutoHigh":"Automaticky vysoká","qualityAutoLow":"Automaticky nízka","qualityBest":"Najlepšia","qualityHigh":"Vysoká","qualityLow":"Nízka","qualityMedium":"Stredná","scale":"Mierka","scaleAll":"Zobraziť všetko","scaleFit":"Roztiahnuť, aby sedelo presne","scaleNoBorder":"Bez okrajov","title":"Vlastnosti Flashu","vSpace":"V-medzera","validateHSpace":"H-medzera musí byť číslo.","validateSrc":"URL nesmie byť prázdne.","validateVSpace":"V-medzera musí byť číslo","windowMode":"Mód okna","windowModeOpaque":"Nepriehľadný","windowModeTransparent":"Priehľadný","windowModeWindow":"Okno"},"font":{"fontSize":{"label":"Veľkosť","voiceLabel":"Veľkosť písma","panelTitle":"Veľkosť písma"},"label":"Font","panelTitle":"Názov fontu","voiceLabel":"Font"},"forms":{"button":{"title":"Vlastnosti tlačidla","text":"Text (Hodnota)","type":"Typ","typeBtn":"Tlačidlo","typeSbm":"Odoslať","typeRst":"Resetovať"},"checkboxAndRadio":{"checkboxTitle":"Vlastnosti zaškrtávacieho políčka","radioTitle":"Vlastnosti prepínača (radio button)","value":"Hodnota","selected":"Vybrané (selected)"},"form":{"title":"Vlastnosti formulára","menu":"Vlastnosti formulára","action":"Akcia (action)","method":"Metóda (method)","encoding":"Kódovanie (encoding)"},"hidden":{"title":"Vlastnosti skrytého poľa","name":"Názov (name)","value":"Hodnota"},"select":{"title":"Vlastnosti rozbaľovacieho zoznamu","selectInfo":"Informácie o výbere","opAvail":"Dostupné možnosti","value":"Hodnota","size":"Veľkosť","lines":"riadkov","chkMulti":"Povoliť viacnásobný výber","opText":"Text","opValue":"Hodnota","btnAdd":"Pridať","btnModify":"Upraviť","btnUp":"Hore","btnDown":"Dole","btnSetValue":"Nastaviť ako vybranú hodnotu","btnDelete":"Vymazať"},"textarea":{"title":"Vlastnosti textovej oblasti (textarea)","cols":"Stĺpcov","rows":"Riadkov"},"textfield":{"title":"Vlastnosti textového poľa","name":"Názov (name)","value":"Hodnota","charWidth":"Šírka poľa (podľa znakov)","maxChars":"Maximálny počet znakov","type":"Typ","typeText":"Text","typePass":"Heslo","typeEmail":"Email","typeSearch":"Hľadať","typeTel":"Telefónne číslo","typeUrl":"URL"}},"format":{"label":"Formát","panelTitle":"Formát","tag_address":"Adresa","tag_div":"Normálny (DIV)","tag_h1":"Nadpis 1","tag_h2":"Nadpis 2","tag_h3":"Nadpis 3","tag_h4":"Nadpis 4","tag_h5":"Nadpis 5","tag_h6":"Nadpis 6","tag_p":"Normálny","tag_pre":"Formátovaný"},"horizontalrule":{"toolbar":"Vložiť vodorovnú čiaru"},"iframe":{"border":"Zobraziť rám frame-u","noUrl":"Prosím, vložte URL iframe","scrolling":"Povoliť skrolovanie","title":"Vlastnosti IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Zadajte prosím URL obrázka","alt":"Alternatívny text","border":"Rám (border)","btnUpload":"Odoslať to na server","button2Img":"Chcete zmeniť vybrané obrázkové tlačidlo na jednoduchý obrázok?","hSpace":"H-medzera","img2Button":"Chcete zmeniť vybraný obrázok na obrázkové tlačidlo?","infoTab":"Informácie o obrázku","linkTab":"Odkaz","lockRatio":"Pomer zámky","menu":"Vlastnosti obrázka","resetSize":"Pôvodná veľkosť","title":"Vlastnosti obrázka","titleButton":"Vlastnosti obrázkového tlačidla","upload":"Nahrať","urlMissing":"Chýba URL zdroja obrázka.","vSpace":"V-medzera","validateBorder":"Rám (border) musí byť celé číslo.","validateHSpace":"H-medzera musí byť celé číslo.","validateVSpace":"V-medzera musí byť celé číslo."},"indent":{"indent":"Zväčšiť odsadenie","outdent":"Zmenšiť odsadenie"},"smiley":{"options":"Možnosti smajlíkov","title":"Vložiť smajlíka","toolbar":"Smajlíky"},"justify":{"block":"Zarovnať do bloku","center":"Zarovnať na stred","left":"Zarovnať vľavo","right":"Zarovnať vpravo"},"link":{"acccessKey":"Prístupový kľúč","advanced":"Rozšírené","advisoryContentType":"Pomocný typ obsahu","advisoryTitle":"Pomocný titulok","anchor":{"toolbar":"Kotva","menu":"Upraviť kotvu","title":"Vlastnosti kotvy","name":"Názov kotvy","errorName":"Zadajte prosím názov kotvy","remove":"Odstrániť kotvu"},"anchorId":"Podľa Id objektu","anchorName":"Podľa mena kotvy","charset":"Priradená znaková sada","cssClasses":"Triedy štýlu","emailAddress":"E-Mailová adresa","emailBody":"Telo správy","emailSubject":"Predmet správy","id":"Id","info":"Informácie o odkaze","langCode":"Orientácia jazyka","langDir":"Orientácia jazyka","langDirLTR":"Zľava doprava (LTR)","langDirRTL":"Sprava doľava (RTL)","menu":"Upraviť odkaz","name":"Názov","noAnchors":"(V dokumente nie sú dostupné žiadne kotvy)","noEmail":"Zadajte prosím e-mailovú adresu","noUrl":"Zadajte prosím URL odkazu","other":"<iný>","popupDependent":"Závislosť (Netscape)","popupFeatures":"Vlastnosti vyskakovacieho okna","popupFullScreen":"Celá obrazovka (IE)","popupLeft":"Ľavý okraj","popupLocationBar":"Panel umiestnenia (location bar)","popupMenuBar":"Panel ponuky (menu bar)","popupResizable":"Meniteľná veľkosť (resizable)","popupScrollBars":"Posuvníky (scroll bars)","popupStatusBar":"Stavový riadok (status bar)","popupToolbar":"Panel nástrojov (toolbar)","popupTop":"Horný okraj","rel":"Vzťah (rel)","selectAnchor":"Vybrať kotvu","styles":"Štýl","tabIndex":"Poradie prvku (tab index)","target":"Cieľ","targetFrame":"<rámec>","targetFrameName":"Názov rámu cieľa","targetPopup":"<vyskakovacie okno>","targetPopupName":"Názov vyskakovacieho okna","title":"Odkaz","toAnchor":"Odkaz na kotvu v texte","toEmail":"E-mail","toUrl":"URL","toolbar":"Odkaz","type":"Typ odkazu","unlink":"Odstrániť odkaz","upload":"Nahrať"},"list":{"bulletedlist":"Vložiť/Odstrániť zoznam s odrážkami","numberedlist":"Vložiť/Odstrániť číslovaný zoznam"},"liststyle":{"armenian":"Arménske číslovanie","bulletedTitle":"Vlastnosti odrážkového zoznamu","circle":"Kruh","decimal":"Číselné (1, 2, 3, atď.)","decimalLeadingZero":"Číselné s nulou (01, 02, 03, atď.)","disc":"Disk","georgian":"Gregoriánske číslovanie (an, ban, gan, atď.)","lowerAlpha":"Malé latinské (a, b, c, d, e, atď.)","lowerGreek":"Malé grécke (alfa, beta, gama, atď.)","lowerRoman":"Malé rímske (i, ii, iii, iv, v, atď.)","none":"Nič","notset":"<nenastavené>","numberedTitle":"Vlastnosti číselného zoznamu","square":"Štvorec","start":"Začiatok","type":"Typ","upperAlpha":"Veľké latinské (A, B, C, D, E, atď.)","upperRoman":"Veľké rímske (I, II, III, IV, V, atď.)","validateStartNumber":"Začiatočné číslo číselného zoznamu musí byť celé číslo."},"magicline":{"title":"Sem vložte paragraf"},"maximize":{"maximize":"Maximalizovať","minimize":"Minimalizovať"},"newpage":{"toolbar":"Nová stránka"},"pagebreak":{"alt":"Zalomenie strany","toolbar":"Vložiť oddeľovač stránky pre tlač"},"pastetext":{"button":"Vložiť ako čistý text","title":"Vložiť ako čistý text"},"pastefromword":{"confirmCleanup":"Vkladaný text vyzerá byť skopírovaný z Wordu. Chcete ho automaticky vyčistiť pred vkladaním?","error":"Nebolo možné vyčistiť vložené dáta kvôli internej chybe","title":"Vložiť z Wordu","toolbar":"Vložiť z Wordu"},"preview":{"preview":"Náhľad"},"print":{"toolbar":"Tlač"},"removeformat":{"toolbar":"Odstrániť formátovanie"},"save":{"toolbar":"Uložiť"},"selectall":{"toolbar":"Vybrať všetko"},"showblocks":{"toolbar":"Ukázať bloky"},"sourcearea":{"toolbar":"Zdroj"},"specialchar":{"options":"Možnosti špeciálneho znaku","title":"Výber špeciálneho znaku","toolbar":"Vložiť špeciálny znak"},"scayt":{"about":"O KPPP (Kontrola pravopisu počas písania)","aboutTab":"O","addWord":"Pridať slovo","allCaps":"Ignorovať slová písané veľkými písmenami","dic_create":"Vytvoriť","dic_delete":"Vymazať","dic_field_name":"Názov slovníka","dic_info":"Spočiatku je užívateľský slovník uložený v cookie. Cookie však majú obmedzenú veľkosť. Keď užívateľský slovník narastie do bodu, kedy nemôže byť uložený v cookie, potom musí byť slovník uložený na našom serveri. Pre uloženie vášho osobného slovníka na náš server by ste mali zadať názov pre váš slovník. Ak už máte uložený slovník, prosíme, napíšte jeho názov a kliknite tlačidlo Obnoviť.","dic_rename":"Premenovať","dic_restore":"Obnoviť","dictionariesTab":"Slovníky","disable":"Zakázať  KPPP (Kontrola pravopisu počas písania)","emptyDic":"Názov slovníka by nemal byť prázdny.","enable":"Povoliť KPPP (Kontrola pravopisu počas písania)","ignore":"Ignorovať","ignoreAll":"Ignorovať všetko","ignoreDomainNames":"Iznorovať názvy domén","langs":"Jazyky","languagesTab":"Jazyky","mixedCase":"Ignorovať slová so smiešanými veľkými a malými písmenami","mixedWithDigits":"Ignorovať slová s číslami","moreSuggestions":"Viac návrhov","opera_title":"Nepodporované Operou","options":"Možnosti","optionsTab":"Možnosti","title":"Kontrola pravopisu počas písania","toggle":"Prepnúť KPPP (Kontrola pravopisu počas písania)","noSuggestions":"No suggestion"},"stylescombo":{"label":"Štýly","panelTitle":"Formátovanie štýlov","panelTitle1":"Štýly bloku","panelTitle2":"Vnútroriadkové (inline) štýly","panelTitle3":"Štýly objeku"},"table":{"border":"Šírka rámu (border)","caption":"Popis","cell":{"menu":"Bunka","insertBefore":"Vložiť bunku pred","insertAfter":"Vložiť bunku za","deleteCell":"Vymazať bunky","merge":"Zlúčiť bunky","mergeRight":"Zlúčiť doprava","mergeDown":"Zlúčiť dole","splitHorizontal":"Rozdeliť bunky horizontálne","splitVertical":"Rozdeliť bunky vertikálne","title":"Vlastnosti bunky","cellType":"Typ bunky","rowSpan":"Rozsah riadkov","colSpan":"Rozsah stĺpcov","wordWrap":"Zalomovanie riadkov","hAlign":"Horizontálne zarovnanie","vAlign":"Vertikálne zarovnanie","alignBaseline":"Základná čiara (baseline)","bgColor":"Farba pozadia","borderColor":"Farba rámu","data":"Dáta","header":"Hlavička","yes":"Áno","no":"Nie","invalidWidth":"Šírka bunky musí byť číslo.","invalidHeight":"Výška bunky musí byť číslo.","invalidRowSpan":"Rozsah riadkov musí byť celé číslo.","invalidColSpan":"Rozsah stĺpcov musí byť celé číslo.","chooseColor":"Vybrať"},"cellPad":"Odsadenie obsahu (cell padding)","cellSpace":"Vzdialenosť buniek (cell spacing)","column":{"menu":"Stĺpec","insertBefore":"Vložiť stĺpec pred","insertAfter":"Vložiť stĺpec po","deleteColumn":"Zmazať stĺpce"},"columns":"Stĺpce","deleteTable":"Vymazať tabuľku","headers":"Hlavička","headersBoth":"Obe","headersColumn":"Prvý stĺpec","headersNone":"Žiadne","headersRow":"Prvý riadok","invalidBorder":"Širka rámu musí byť číslo.","invalidCellPadding":"Odsadenie v bunkách (cell padding) musí byť kladné číslo.","invalidCellSpacing":"Medzera mädzi bunkami (cell spacing) musí byť kladné číslo.","invalidCols":"Počet stĺpcov musí byť číslo väčšie ako 0.","invalidHeight":"Výška tabuľky musí byť číslo.","invalidRows":"Počet riadkov musí byť číslo väčšie ako 0.","invalidWidth":"Širka tabuľky musí byť číslo.","menu":"Vlastnosti tabuľky","row":{"menu":"Riadok","insertBefore":"Vložiť riadok pred","insertAfter":"Vložiť riadok po","deleteRow":"Vymazať riadky"},"rows":"Riadky","summary":"Prehľad","title":"Vlastnosti tabuľky","toolbar":"Tabuľka","widthPc":"percent","widthPx":"pixelov","widthUnit":"jednotka šírky"},"undo":{"redo":"Znovu","undo":"Späť"},"wsc":{"btnIgnore":"Ignorovať","btnIgnoreAll":"Ignorovať všetko","btnReplace":"Prepísat","btnReplaceAll":"Prepísat všetko","btnUndo":"Späť","changeTo":"Zmeniť na","errorLoading":"Chyba pri načítaní slovníka z adresy: %s.","ieSpellDownload":"Kontrola pravopisu nie je naištalovaná. Chcete ju teraz stiahnuť?","manyChanges":"Kontrola pravopisu dokončená: Bolo zmenených %1 slov","noChanges":"Kontrola pravopisu dokončená: Neboli zmenené žiadne slová","noMispell":"Kontrola pravopisu dokončená: Neboli nájdené žiadne chyby pravopisu","noSuggestions":"- Žiadny návrh -","notAvailable":"Prepáčte, ale služba je momentálne nedostupná.","notInDic":"Nie je v slovníku","oneChange":"Kontrola pravopisu dokončená: Bolo zmenené jedno slovo","progress":"Prebieha kontrola pravopisu...","title":"Skontrolovať pravopis","toolbar":"Kontrola pravopisu"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/sl.js b/htmltest/sites/all/libraries/ckeditor-version/lang/sl.js
new file mode 100644
index 00000000..1710cc27
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/sl.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sl']={"editor":"Bogat Urejevalnik Besedila","common":{"editorHelp":"Pritisnite ALT 0 za pomoč","browseServer":"Prebrskaj na strežniku","url":"URL","protocol":"Protokol","upload":"Naloži","uploadSubmit":"Pošlji na strežnik","image":"Slika","flash":"Flash","form":"Obrazec","checkbox":"Potrditveno polje","radio":"Izbirno polje","textField":"Vnosno polje","textarea":"Vnosno območje","hiddenField":"Skrito polje","button":"Gumb","select":"Spustno Polje","imageButton":"Slikovni Gumb","notSet":"<ni določen>","id":"Id","name":"Ime","langDir":"Smer jezika","langDirLtr":"Od leve proti desni (LTR)","langDirRtl":"Od desne proti levi (RTL)","langCode":"Koda Jezika","longDescr":"Dolg opis URL-ja","cssClass":"Razred stilne predloge","advisoryTitle":"Predlagani naslov","cssStyle":"Slog","ok":"V redu","cancel":"Prekliči","close":"Zapri","preview":"Predogled","resize":"Potegni za spremembo velikosti","generalTab":"Splošno","advancedTab":"Napredno","validateNumberFailed":"Ta vrednost ni število.","confirmNewPage":"Vse neshranjene spremembe te vsebine bodo izgubljene. Ali res želite naložiti novo stran?","confirmCancel":"Nekaj možnosti je bilo spremenjenih. Ali res želite zapreti okno?","options":"Možnosti","target":"Cilj","targetNew":"Novo Okno (_blank)","targetTop":"Vrhovno Okno (_top)","targetSelf":"Enako Okno (_self)","targetParent":"Matično Okno (_parent)","langDirLTR":"Od leve proti desni (LTR)","langDirRTL":"Od desne proti levi (RTL)","styles":"Slog","cssClasses":"Razred stilne predloge","width":"Širina","height":"Višina","align":"Poravnava","alignLeft":"Levo","alignRight":"Desno","alignCenter":"Sredinsko","alignTop":"Na vrh","alignMiddle":"V sredino","alignBottom":"Na dno","invalidValue":"Neveljavna vrednost.","invalidHeight":"Višina mora biti število.","invalidWidth":"Širina mora biti število.","invalidCssLength":"Vrednost določena za \"%1\" polje mora biti pozitivna številka z ali brez veljavne CSS enote za merjenje (px, %, in, cm, mm, em, ex, pt, ali pc).","invalidHtmlLength":"Vrednost določena za \"%1\" polje mora biti pozitivna številka z ali brez veljavne HTML enote za merjenje (px ali %).","invalidInlineStyle":"Vrednost določena za inline slog mora biti sestavljena iz ene ali več tork (tuples) z obliko \"ime : vrednost\", ločenih z podpičji.","cssLengthTooltip":"Vnesite številko za vrednost v slikovnih pikah (pixels) ali številko z veljavno CSS enoto (px, %, in, cm, mm, em, ex, pt, ali pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedosegljiv</span>"},"about":{"copy":"Copyright &copy; $1. Vse pravice pridržane.","dlgTitle":"O programu CKEditor","help":"Preverite $1 za pomoč.","moreInfo":"Za informacijo o licenci prosim obiščite našo spletno stran:","title":"O programu CKEditor","userGuide":"CKEditor Navodila za Uporabo"},"basicstyles":{"bold":"Krepko","italic":"Ležeče","strike":"Prečrtano","subscript":"Podpisano","superscript":"Nadpisano","underline":"Podčrtano"},"bidi":{"ltr":"Smer besedila od leve proti desni","rtl":"Smer besedila od desne proti levi"},"blockquote":{"toolbar":"Citat"},"clipboard":{"copy":"Kopiraj","copyError":"Varnostne nastavitve brskalnika ne dopuščajo samodejnega kopiranja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+C).","cut":"Izreži","cutError":"Varnostne nastavitve brskalnika ne dopuščajo samodejnega izrezovanja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+X).","paste":"Prilepi","pasteArea":"Prilepi Prostor","pasteMsg":"Prosim prilepite v sleči okvir s pomočjo tipkovnice (<STRONG>Ctrl/Cmd+V</STRONG>) in pritisnite <STRONG>V redu</STRONG>.","securityMsg":"Zaradi varnostnih nastavitev vašega brskalnika urejevalnik ne more neposredno dostopati do odložišča. Vsebino odložišča ponovno prilepite v to okno.","title":"Prilepi"},"colorbutton":{"auto":"Samodejno","bgColorTitle":"Barva ozadja","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"Več barv...","panelTitle":"Colors","textColorTitle":"Barva besedila"},"colordialog":{"clear":"Počisti","highlight":"Poudarjeno","options":"Barvne Možnosti","selected":"Izbrano","title":"Izberi barvo"},"templates":{"button":"Predloge","emptyListMsg":"(Ni pripravljenih predlog)","insertOption":"Zamenjaj trenutno vsebino","options":"Možnosti Predloge","selectPromptMsg":"Izberite predlogo, ki jo želite odpreti v urejevalniku<br>(trenutna vsebina bo izgubljena):","title":"Vsebinske predloge"},"contextmenu":{"options":"Možnosti Kontekstnega Menija"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Predlagani naslov","cssClassInputLabel":"Razred stilne predloge","edit":"Uredi Div","inlineStyleInputLabel":"Inline Slog","langDirLTRLabel":"Od leve proti desni (LTR)","langDirLabel":"Smer jezika","langDirRTLLabel":"Od desne proti levi (RTL)","languageCodeInputLabel":"Koda Jezika","remove":"Odstrani Div","styleSelectLabel":"Slog","title":"Ustvari Div Posodo","toolbar":"Ustvari Div Posodo"},"toolbar":{"toolbarCollapse":"Skrči Orodno Vrstico","toolbarExpand":"Razširi Orodno Vrstico","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Urejevalnik orodne vrstice"},"elementspath":{"eleLabel":"Pot elementov","eleTitle":"%1 element"},"find":{"find":"Najdi","findOptions":"Find Options","findWhat":"Najdi:","matchCase":"Razlikuj velike in male črke","matchCyclic":"Primerjaj znake v cirilici","matchWord":"Samo cele besede","notFoundMsg":"Navedeno besedilo ni bilo najdeno.","replace":"Zamenjaj","replaceAll":"Zamenjaj vse","replaceSuccessMsg":"%1 pojavitev je bilo zamenjano.","replaceWith":"Zamenjaj z:","title":"Najdi in zamenjaj"},"fakeobjects":{"anchor":"Sidro","flash":"Flash animacija","hiddenfield":"Skrito polje","iframe":"IFrame","unknown":"Neznan objekt"},"flash":{"access":"Dostop skript","accessAlways":"Vedno","accessNever":"Nikoli","accessSameDomain":"Samo ista domena","alignAbsBottom":"Popolnoma na dno","alignAbsMiddle":"Popolnoma v sredino","alignBaseline":"Na osnovno črto","alignTextTop":"Besedilo na vrh","bgcolor":"Barva ozadja","chkFull":"Dovoli celozaslonski način","chkLoop":"Ponavljanje","chkMenu":"Omogoči Flash Meni","chkPlay":"Samodejno predvajaj","flashvars":"Spremenljivke za Flash","hSpace":"Vodoravni razmik","properties":"Lastnosti Flash","propertiesTab":"Lastnosti","quality":"Kakovost","qualityAutoHigh":"Samodejno visoka","qualityAutoLow":"Samodejno nizka","qualityBest":"Najvišja","qualityHigh":"Visoka","qualityLow":"Nizka","qualityMedium":"Srednja","scale":"Povečava","scaleAll":"Pokaži vse","scaleFit":"Natančno prileganje","scaleNoBorder":"Brez obrobe","title":"Lastnosti Flash","vSpace":"Navpični razmik","validateHSpace":"Vodoravni razmik mora biti število.","validateSrc":"Vnesite URL povezave","validateVSpace":"Navpični razmik mora biti število.","windowMode":"Vrsta okna","windowModeOpaque":"Motno","windowModeTransparent":"Prosojno","windowModeWindow":"Okno"},"font":{"fontSize":{"label":"Velikost","voiceLabel":"Velikost","panelTitle":"Velikost"},"label":"Pisava","panelTitle":"Pisava","voiceLabel":"Pisava"},"forms":{"button":{"title":"Lastnosti gumba","text":"Besedilo (Vrednost)","type":"Tip","typeBtn":"Gumb","typeSbm":"Potrdi","typeRst":"Ponastavi"},"checkboxAndRadio":{"checkboxTitle":"Lastnosti potrditvenega polja","radioTitle":"Lastnosti izbirnega polja","value":"Vrednost","selected":"Izbrano"},"form":{"title":"Lastnosti obrazca","menu":"Lastnosti obrazca","action":"Akcija","method":"Metoda","encoding":"Kodiranje znakov"},"hidden":{"title":"Lastnosti skritega polja","name":"Ime","value":"Vrednost"},"select":{"title":"Lastnosti spustnega seznama","selectInfo":"Podatki","opAvail":"Razpoložljive izbire","value":"Vrednost","size":"Velikost","lines":"vrstic","chkMulti":"Dovoli izbor večih vrstic","opText":"Besedilo","opValue":"Vrednost","btnAdd":"Dodaj","btnModify":"Spremeni","btnUp":"Gor","btnDown":"Dol","btnSetValue":"Postavi kot privzeto izbiro","btnDelete":"Izbriši"},"textarea":{"title":"Lastnosti vnosnega območja","cols":"Stolpcev","rows":"Vrstic"},"textfield":{"title":"Lastnosti vnosnega polja","name":"Ime","value":"Vrednost","charWidth":"Dolžina","maxChars":"Največje število znakov","type":"Tip","typeText":"Besedilo","typePass":"Geslo","typeEmail":"E-pošta","typeSearch":"Iskanje","typeTel":"Telefonska Številka","typeUrl":"URL"}},"format":{"label":"Oblika","panelTitle":"Oblika","tag_address":"Napis","tag_div":"Navaden (DIV)","tag_h1":"Naslov 1","tag_h2":"Naslov 2","tag_h3":"Naslov 3","tag_h4":"Naslov 4","tag_h5":"Naslov 5","tag_h6":"Naslov 6","tag_p":"Navaden","tag_pre":"Oblikovan"},"horizontalrule":{"toolbar":"Vstavi vodoravno črto"},"iframe":{"border":"Pokaži mejo okvira","noUrl":"Prosimo, vnesite iframe URL","scrolling":"Omogoči scrollbars","title":"IFrame Lastnosti","toolbar":"IFrame"},"image":{"alertUrl":"Vnesite URL slike","alt":"Nadomestno besedilo","border":"Obroba","btnUpload":"Pošlji na strežnik","button2Img":"Želiš pretvoriti izbrani gumb s sliko v preprosto sliko?","hSpace":"Vodoravni razmik","img2Button":"Želiš pretvoriti izbrano sliko v gumb s sliko?","infoTab":"Podatki o sliki","linkTab":"Povezava","lockRatio":"Zakleni razmerje","menu":"Lastnosti slike","resetSize":"Ponastavi velikost","title":"Lastnosti slike","titleButton":"Lastnosti gumba s sliko","upload":"Pošlji","urlMissing":"Manjka vir (URL) slike.","vSpace":"Navpični razmik","validateBorder":"Meja mora biti celo število.","validateHSpace":"HSpace mora biti celo število.","validateVSpace":"VSpace mora biti celo število."},"indent":{"indent":"Povečaj zamik","outdent":"Zmanjšaj zamik"},"smiley":{"options":"Možnosti Smeška","title":"Vstavi smeška","toolbar":"Smeško"},"justify":{"block":"Obojestranska poravnava","center":"Sredinska poravnava","left":"Leva poravnava","right":"Desna poravnava"},"link":{"acccessKey":"Dostopno Geslo","advanced":"Napredno","advisoryContentType":"Predlagani tip vsebine (content-type)","advisoryTitle":"Predlagani naslov","anchor":{"toolbar":"Vstavi/uredi zaznamek","menu":"Lastnosti zaznamka","title":"Lastnosti zaznamka","name":"Ime zaznamka","errorName":"Prosim vnesite ime zaznamka","remove":"Remove Anchor"},"anchorId":"Po ID-ju elementa","anchorName":"Po imenu zaznamka","charset":"Kodna tabela povezanega vira","cssClasses":"Razred stilne predloge","emailAddress":"Elektronski naslov","emailBody":"Vsebina sporočila","emailSubject":"Predmet sporočila","id":"Id","info":"Podatki o povezavi","langCode":"Smer jezika","langDir":"Smer jezika","langDirLTR":"Od leve proti desni (LTR)","langDirRTL":"Od desne proti levi (RTL)","menu":"Uredi povezavo","name":"Ime","noAnchors":"(V tem dokumentu ni zaznamkov)","noEmail":"Vnesite elektronski naslov","noUrl":"Vnesite URL povezave","other":"<drug>","popupDependent":"Podokno (Netscape)","popupFeatures":"Značilnosti pojavnega okna","popupFullScreen":"Celozaslonska slika (IE)","popupLeft":"Lega levo","popupLocationBar":"Naslovna vrstica","popupMenuBar":"Menijska vrstica","popupResizable":"Spremenljive velikosti","popupScrollBars":"Drsniki","popupStatusBar":"Vrstica stanja","popupToolbar":"Orodna vrstica","popupTop":"Lega na vrhu","rel":"Odnos","selectAnchor":"Izberi zaznamek","styles":"Slog","tabIndex":"Številka tabulatorja","target":"Cilj","targetFrame":"<okvir>","targetFrameName":"Ime ciljnega okvirja","targetPopup":"<pojavno okno>","targetPopupName":"Ime pojavnega okna","title":"Povezava","toAnchor":"Zaznamek na tej strani","toEmail":"Elektronski naslov","toUrl":"URL","toolbar":"Vstavi/uredi povezavo","type":"Vrsta povezave","unlink":"Odstrani povezavo","upload":"Prenesi"},"list":{"bulletedlist":"Označen seznam","numberedlist":"Oštevilčen seznam"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Vstavite odstavek tukaj"},"maximize":{"maximize":"Maksimiraj","minimize":"Minimiraj"},"newpage":{"toolbar":"Nova stran"},"pagebreak":{"alt":"Prelom Strani","toolbar":"Vstavi prelom strani"},"pastetext":{"button":"Prilepi kot golo besedilo","title":"Prilepi kot golo besedilo"},"pastefromword":{"confirmCleanup":"Besedilo, ki ga želite prilepiti je kopirano iz Word-a. Ali ga želite očistiti, preden ga prilepite?","error":"Ni bilo mogoče očistiti prilepljenih podatkov zaradi notranje napake","title":"Prilepi iz Worda","toolbar":"Prilepi iz Worda"},"preview":{"preview":"Predogled"},"print":{"toolbar":"Natisni"},"removeformat":{"toolbar":"Odstrani oblikovanje"},"save":{"toolbar":"Shrani"},"selectall":{"toolbar":"Izberi vse"},"showblocks":{"toolbar":"Prikaži ograde"},"sourcearea":{"toolbar":"Izvorna koda"},"specialchar":{"options":"Možnosti Posebnega Znaka","title":"Izberi Posebni Znak","toolbar":"Vstavi posebni znak"},"scayt":{"about":"O storitvi SCAYT","aboutTab":"O storitvi","addWord":"Dodaj besedo","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Slovarji","disable":"Onemogoči SCAYT","emptyDic":"Ime slovarja ne more biti prazno.","enable":"Omogoči SCAYT","ignore":"Prezri","ignoreAll":"Prezri vse","ignoreDomainNames":"Ignore Domain Names","langs":"Jeziki","languagesTab":"Jeziki","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"Več predlogov","opera_title":"Not supported by Opera","options":"Možnosti","optionsTab":"Možnosti","title":"Črkovanje med tipkanjem","toggle":"Preklopi SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Slog","panelTitle":"Oblikovalni Stili","panelTitle1":"Slogi odstavkov","panelTitle2":"Slogi besedila","panelTitle3":"Slogi objektov"},"table":{"border":"Velikost obrobe","caption":"Naslov","cell":{"menu":"Celica","insertBefore":"Vstavi celico pred","insertAfter":"Vstavi celico za","deleteCell":"Izbriši celice","merge":"Združi celice","mergeRight":"Združi desno","mergeDown":"Druži navzdol","splitHorizontal":"Razdeli celico vodoravno","splitVertical":"Razdeli celico navpično","title":"Lastnosti celice","cellType":"Vrsta celice","rowSpan":"Razpon vrstic","colSpan":"Razpon stolpcev","wordWrap":"Prelom besedila","hAlign":"Vodoravna poravnava","vAlign":"Navpična poravnava","alignBaseline":"Osnovnica","bgColor":"Barva ozadja","borderColor":"Barva obrobe","data":"Podatki","header":"Glava","yes":"Da","no":"Ne","invalidWidth":"Širina celice mora biti število.","invalidHeight":"Višina celice mora biti število.","invalidRowSpan":"Razpon vrstic mora biti celo število.","invalidColSpan":"Razpon stolpcev mora biti celo število.","chooseColor":"Izberi"},"cellPad":"Polnilo med celicami","cellSpace":"Razmik med celicami","column":{"menu":"Stolpec","insertBefore":"Vstavi stolpec pred","insertAfter":"Vstavi stolpec za","deleteColumn":"Izbriši stolpce"},"columns":"Stolpci","deleteTable":"Izbriši tabelo","headers":"Glave","headersBoth":"Oboje","headersColumn":"Prvi stolpec","headersNone":"Brez","headersRow":"Prva vrstica","invalidBorder":"Širina obrobe mora biti število.","invalidCellPadding":"Zamik celic mora biti število","invalidCellSpacing":"Razmik med celicami mora biti število.","invalidCols":"Število stolpcev mora biti večje od 0.","invalidHeight":"Višina tabele mora biti število.","invalidRows":"Število vrstic mora biti večje od 0.","invalidWidth":"Širina tabele mora biti število.","menu":"Lastnosti tabele","row":{"menu":"Vrstica","insertBefore":"Vstavi vrstico pred","insertAfter":"Vstavi vrstico za","deleteRow":"Izbriši vrstice"},"rows":"Vrstice","summary":"Povzetek","title":"Lastnosti tabele","toolbar":"Tabela","widthPc":"procentov","widthPx":"pik","widthUnit":"enota širine"},"undo":{"redo":"Ponovi","undo":"Razveljavi"},"wsc":{"btnIgnore":"Prezri","btnIgnoreAll":"Prezri vse","btnReplace":"Zamenjaj","btnReplaceAll":"Zamenjaj vse","btnUndo":"Razveljavi","changeTo":"Spremeni v","errorLoading":"Napaka pri nalaganju storitve programa na naslovu %s.","ieSpellDownload":"Črkovalnik ni nameščen. Ali ga želite prenesti sedaj?","manyChanges":"Črkovanje je končano: Spremenjenih je bilo %1 besed","noChanges":"Črkovanje je končano: Nobena beseda ni bila spremenjena","noMispell":"Črkovanje je končano: Brez napak","noSuggestions":"- Ni predlogov -","notAvailable":"Oprostite, storitev trenutno ni dosegljiva.","notInDic":"Ni v slovarju","oneChange":"Črkovanje je končano: Spremenjena je bila ena beseda","progress":"Preverjanje črkovanja se izvaja...","title":"Črkovalnik","toolbar":"Preveri črkovanje"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/sq.js b/htmltest/sites/all/libraries/ckeditor-version/lang/sq.js
new file mode 100644
index 00000000..bf43f667
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/sq.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sq']={"editor":"Redaktues i Pasur Teksti","common":{"editorHelp":"Shtyp ALT 0 për ndihmë","browseServer":"Shfleto në Server","url":"URL","protocol":"Protokolli","upload":"Ngarko","uploadSubmit":"Dërgo në server","image":"Imazh","flash":"Objekt flash","form":"Formular","checkbox":"Checkbox","radio":"Buton radio","textField":"Fushë tekst","textarea":"Hapësirë tekst","hiddenField":"Fushë e fshehur","button":"Buton","select":"Menu zgjedhjeje","imageButton":"Buton imazhi","notSet":"<e pazgjedhur>","id":"Id","name":"Emër","langDir":"Kod gjuhe","langDirLtr":"Nga e majta në të djathtë (LTR)","langDirRtl":"Nga e djathta në të majtë (RTL)","langCode":"Kod gjuhe","longDescr":"Përshkrim i hollësishëm","cssClass":"Klasa stili CSS","advisoryTitle":"Titull","cssStyle":"Stil","ok":"OK","cancel":"Anulo","close":"Mbyll","preview":"Parashiko","resize":"Ripërmaso","generalTab":"Të përgjithshme","advancedTab":"Të përparuara","validateNumberFailed":"Vlera e futur nuk është një numër","confirmNewPage":"Çdo ndryshim që nuk është ruajtur do humbasë. Je i sigurtë që dëshiron të krijosh një faqe të re?","confirmCancel":"Disa opsione kanë ndryshuar. Je i sigurtë që dëshiron ta mbyllësh dritaren?","options":"Opsione","target":"Objektivi","targetNew":"Dritare e re (_blank)","targetTop":"Dritare në plan të parë (_top)","targetSelf":"E njëjta dritare (_self)","targetParent":"Dritarja prind (_parent)","langDirLTR":"Nga e majta në të djathë (LTR)","langDirRTL":"Nga e djathta në të majtë (RTL)","styles":"Stil","cssClasses":"Klasa Stili CSS","width":"Gjerësi","height":"Lartësi","align":"Rreshtim","alignLeft":"Majtas","alignRight":"Djathtas","alignCenter":"Qendër","alignTop":"Lart","alignMiddle":"Në mes","alignBottom":"Poshtë","invalidValue":"Vlerë e pavlefshme","invalidHeight":"Lartësia duhet të jetë një numër","invalidWidth":"Gjerësia duhet të jetë një numër","invalidCssLength":"Vlera e fushës \"%1\" duhet të jetë një numër pozitiv me apo pa njësi matëse të vlefshme CSS (px, %, in, cm, mm, em, ex, pt ose pc).","invalidHtmlLength":"Vlera e fushës \"%1\" duhet të jetë një numër pozitiv me apo pa njësi matëse të vlefshme HTML (px ose %)","invalidInlineStyle":"Stili inline duhet të jetë një apo disa vlera të formatit \"emër: vlerë\", ndarë nga pikëpresje.","cssLengthTooltip":"Fut një numër për vlerën në pixel apo një numër me një njësi të vlefshme CSS (px, %, in, cm, mm, ex, pt, ose pc).","unavailable":"%1<span class=\"cke_accessibility\">, i padisponueshëm</span>"},"about":{"copy":"Të drejtat  e kopjimit &copy; $1. Të gjitha të drejtat e rezervuara.","dlgTitle":"Rreth CKEditor","help":"Kontrollo $1 për ndihmë.","moreInfo":"Për informacione rreth licencave shih faqen tonë:","title":"Rreth CKEditor","userGuide":"Udhëzuesi i Shfrytëzuesit të CKEditor"},"basicstyles":{"bold":"Trash","italic":"Pjerrët","strike":"Nëpërmes","subscript":"Nën-skriptë","superscript":"Super-skriptë","underline":"Nënvijëzuar"},"bidi":{"ltr":"Drejtimi i tekstit nga e majta në të djathtë","rtl":"Drejtimi i tekstit nga e djathta në të majtë"},"blockquote":{"toolbar":"Citatet"},"clipboard":{"copy":"Kopjo","copyError":"Të dhënat e sigurisë së shfletuesit tuaj nuk lejojnë që redaktuesi automatikisht të kryej veprimin e kopjimit. Ju lutemi shfrytëzoni tastierën për këtë veprim (Ctrl/Cmd+C).","cut":"Preje","cutError":"Të dhënat e sigurisë së shfletuesit tuaj nuk lejojnë që redaktuesi automatikisht të kryej veprimin e prerjes. Ju lutemi shfrytëzoni tastierën për këtë veprim (Ctrl/Cmd+X).","paste":"Hidhe","pasteArea":"Hapësira Hedhëse","pasteMsg":"Ju lutemi hidhni brenda kutizës në vijim duke shfrytëzuar tastierën (<strong>Ctrl/Cmd+V</strong>) dhe shtypni Mirë.","securityMsg":"Për shkak të dhënave të sigurisë së shfletuesit tuaj, redaktuesi nuk është në gjendje të i qaset drejtpërdrejtë të dhanve të tabelës suaj të punës. Ju duhet të hidhni atë përsëri në këtë dritare.","title":"Hidhe"},"colorbutton":{"auto":"Automatik","bgColorTitle":"Ngjyra e Prapavijës","colors":{"000":"E zezë","800000":"Ngjyrë gështenjë","8B4513":"Ngjyrë Shale Kafe","2F4F4F":"Ngjyrë Gri të errët ardëz","008080":"Ngjyrë bajukë","000080":"Ngjyrë Marine","4B0082":"Indigo","696969":"Gri e Errët","B22222":"Tullë në Flakë","A52A2A":"Ngjytë Kafe","DAA520":"Shkop i Artë","006400":"E Gjelbër e Errët","40E0D0":"Ngjyrë e Bruztë","0000CD":"E Kaltër e Mesme","800080":"Vjollcë","808080":"Gri","F00":"E Kuqe","FF8C00":"E Portokalltë e Errët","FFD700":"Ngjyrë Ari","008000":"E Gjelbërt","0FF":"Cyan","00F":"E Kaltër","EE82EE":"Vjollcë","A9A9A9":"Gri e Zbehtë","FFA07A":"Salmon i Ndritur","FFA500":"E Portokalltë","FFFF00":"E Verdhë","00FF00":"Ngjyrë Gëlqere","AFEEEE":"Ngjyrë e Bruztë e Zbehtë","ADD8E6":"E Kaltër e Ndritur","DDA0DD":"Ngjyrë Llokumi","D3D3D3":"Gri e Ndritur","FFF0F5":"Ngjyrë Purpur e Skuqur","FAEBD7":"E Bardhë Antike","FFFFE0":"E verdhë e Ndritur","F0FFF0":"Ngjyrë Nektari","F0FFFF":"Ngjyrë Qielli","F0F8FF":"E Kaltër Alice","E6E6FA":"Ngjyrë Purpur e Zbetë","FFF":"E bardhë"},"more":"Më Shumë Ngjyra...","panelTitle":"Ngjyrat","textColorTitle":"Ngjyra e Tekstit"},"colordialog":{"clear":"Pastro","highlight":"Thekso","options":"Përzgjedhjet e Ngjyrave","selected":"Ngjyra e Përzgjedhur","title":"Përzgjidh një ngjyrë"},"templates":{"button":"Shabllonet","emptyListMsg":"(Asnjë shabllon nuk është paradefinuar)","insertOption":"Zëvendëso përmbajtjen aktuale","options":"Opsionet e Shabllonit","selectPromptMsg":"Përzgjidhni shabllonin për të hapur tek redaktuesi","title":"Përmbajtja e Shabllonit"},"contextmenu":{"options":"Mundësitë e Menysë së Kontekstit"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Titull","cssClassInputLabel":"Klasa stili CSS","edit":"Redakto Div","inlineStyleInputLabel":"Stili i brendshëm","langDirLTRLabel":"Nga e majta në të djathë (LTR)","langDirLabel":"Drejtim teksti","langDirRTLLabel":"Nga e djathta në të majtë (RTL)","languageCodeInputLabel":"Kodi i Gjuhës","remove":"Largo Div","styleSelectLabel":"Stil","title":"Krijo Div Përmbajtës","toolbar":"Krijo Div Përmbajtës"},"toolbar":{"toolbarCollapse":"Zvogëlo Shiritin","toolbarExpand":"Zgjero Shiritin","toolbarGroups":{"document":"Dokument","clipboard":"Tabela Punës/Ribëje","editing":"Duke Redaktuar","forms":"Formular","basicstyles":"Stili Bazë","paragraph":"Paragraf","links":"Nyjet","insert":"Shto","styles":"Stil","colors":"Ngjyrat","tools":"Mjetet"},"toolbars":"Shiritet e Redaktuesit"},"elementspath":{"eleLabel":"Rruga e elementeve","eleTitle":"%1 element"},"find":{"find":"Gjej","findOptions":"Gjejë Alternativat","findWhat":"Gjej çka:","matchCase":"Rasti i përputhjes","matchCyclic":"Përputh ciklikun","matchWord":"Përputh fjalën e tërë","notFoundMsg":"Teksti i caktuar nuk mundej të gjendet.","replace":"Zëvendëso","replaceAll":"Zëvendëso të gjitha","replaceSuccessMsg":"%1 rast(e) u zëvendësua(n).","replaceWith":"Zëvendëso me:","title":"Gjej dhe Zëvendëso"},"fakeobjects":{"anchor":"Spirancë","flash":"Objekt flash","hiddenfield":"Fushë e fshehur","iframe":"IFrame","unknown":"Objekt i Panjohur"},"flash":{"access":"Qasja në Skriptë","accessAlways":"Gjithnjë","accessNever":"Asnjëherë","accessSameDomain":"Fusha e Njëjtë","alignAbsBottom":"Abs në Fund","alignAbsMiddle":"Abs në Mes","alignBaseline":"Baza","alignTextTop":"Koka e Tekstit","bgcolor":"Ngjyra e Prapavijës","chkFull":"Lejo Ekran të Plotë","chkLoop":"Përsëritje","chkMenu":"Lejo Menynë për Flash","chkPlay":"Auto Play","flashvars":"Variablat për Flash","hSpace":"Hapësira Horizontale","properties":"Karakteristikat për Flash","propertiesTab":"Karakteristikat","quality":"Kualiteti","qualityAutoHigh":"Automatikisht i Lartë","qualityAutoLow":"Automatikisht i Ulët","qualityBest":"Më i Miri","qualityHigh":"I Lartë","qualityLow":"Më i Ulti","qualityMedium":"I Mesëm","scale":"Shkalla","scaleAll":"Shfaq të Gjitha","scaleFit":"Përputhje të Plotë","scaleNoBorder":"Pa Kornizë","title":"Rekuizitat për Flash","vSpace":"Hapësira Vertikale","validateHSpace":"Hapësira Horizontale duhet të është numër.","validateSrc":"URL nuk duhet mbetur zbrazur.","validateVSpace":"Hapësira Vertikale duhet të është numër.","windowMode":"Window mode","windowModeOpaque":"Errët","windowModeTransparent":"Tejdukshëm","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Madhësia","voiceLabel":"Madhësia e Shkronjës","panelTitle":"Madhësia e Shkronjës"},"label":"Shkronja","panelTitle":"Emri i Shkronjës","voiceLabel":"Shkronja"},"forms":{"button":{"title":"Rekuizitat e Pullës","text":"Teskti (Vlera)","type":"LLoji","typeBtn":"Buton","typeSbm":"Dërgo","typeRst":"Rikthe"},"checkboxAndRadio":{"checkboxTitle":"Rekuizitat e Kutizë Përzgjedhëse","radioTitle":"Rekuizitat e Pullës","value":"Vlera","selected":"Përzgjedhur"},"form":{"title":"Rekuizitat e Formës","menu":"Rekuizitat e Formës","action":"Veprim","method":"Metoda","encoding":"Kodimi"},"hidden":{"title":"Rekuizitat e Fushës së Fshehur","name":"Emër","value":"Vlera"},"select":{"title":"Rekuizitat e Fushës së Përzgjedhur","selectInfo":"Përzgjidh Informacionin","opAvail":"Opsionet e Mundshme","value":"Vlera","size":"Madhësia","lines":"rreshtat","chkMulti":"Lejo përzgjidhje të shumëfishta","opText":"Teksti","opValue":"Vlera","btnAdd":"Vendos","btnModify":"Ndrysho","btnUp":"Sipër","btnDown":"Poshtë","btnSetValue":"Bëje si vlerë të përzgjedhur","btnDelete":"Grise"},"textarea":{"title":"Rekuzitat e Fushës së Tekstit","cols":"Kolonat","rows":"Rreshtat"},"textfield":{"title":"Rekuizitat e Fushës së Tekstit","name":"Emër","value":"Vlera","charWidth":"Gjerësia e Karakterit","maxChars":"Numri maksimal i karaktereve","type":"LLoji","typeText":"Teksti","typePass":"Fjalëkalimi","typeEmail":"Posta Elektronike","typeSearch":"Kërko","typeTel":"Numri i Telefonit","typeUrl":"URL"}},"format":{"label":"Formati","panelTitle":"Formati i Paragrafit","tag_address":"Adresa","tag_div":"Normal (DIV)","tag_h1":"Titulli 1","tag_h2":"Titulli 2","tag_h3":"Titulli 3","tag_h4":"Titulli 4","tag_h5":"Titulli 5","tag_h6":"Titulli 6","tag_p":"Normal","tag_pre":"Formatuar"},"horizontalrule":{"toolbar":"Vendos Vijë Horizontale"},"iframe":{"border":"Shfaq kufirin e kornizës","noUrl":"Ju lutemi shkruani URL-në e iframe-it","scrolling":"Lejo shiritët zvarritës","title":"Karakteristikat e IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Ju lutemi shkruani URL-në e fotos","alt":"Tekst Alternativ","border":"Korniza","btnUpload":"Dërgo në server","button2Img":"Dëshironi të e ndërroni pullën e fotos së selektuar në një foto të thjeshtë?","hSpace":"HSpace","img2Button":"Dëshironi të ndryshoni foton e përzgjedhur në pullë?","infoTab":"Informacione mbi Fotografinë","linkTab":"Nyja","lockRatio":"Mbyll Racionin","menu":"Karakteristikat e Fotografisë","resetSize":"Rikthe Madhësinë","title":"Karakteristikat e Fotografisë","titleButton":"Karakteristikat e Pullës së Fotografisë","upload":"Ngarko","urlMissing":"Mungon URL e burimit të fotografisë.","vSpace":"Hapësira Vertikale","validateBorder":"Korniza duhet të jetë numër i plotë.","validateHSpace":"Hapësira horizontale duhet të jetë numër i plotë.","validateVSpace":"Hapësira vertikale duhet të jetë numër i plotë."},"indent":{"indent":"Rrite Identin","outdent":"Zvogëlo Identin"},"smiley":{"options":"Opsionet e Ikonave","title":"Vendos Ikonë","toolbar":"Ikona"},"justify":{"block":"Zgjero","center":"Qendër","left":"Rreshto majtas","right":"Rreshto Djathtas"},"link":{"acccessKey":"Sipas ID-së së Elementit","advanced":"Të përparuara","advisoryContentType":"Lloji i Përmbajtjes Këshillimore","advisoryTitle":"Titull","anchor":{"toolbar":"Spirancë","menu":"Redakto Spirancën","title":"Anchor Properties","name":"Emri i Spirancës","errorName":"Ju lutemi shkruani emrin e spirancës","remove":"Largo Spirancën"},"anchorId":"Sipas ID-së së Elementit","anchorName":"Sipas Emrit të Spirancës","charset":"Seti i Karaktereve të Burimeve të Nëdlidhura","cssClasses":"Klasa stili CSS","emailAddress":"Posta Elektronike","emailBody":"Trupi i Porosisë","emailSubject":"Titulli i Porosisë","id":"Id","info":"Informacione të Nyjes","langCode":"Kod gjuhe","langDir":"Drejtim teksti","langDirLTR":"Nga e majta në të djathë (LTR)","langDirRTL":"Nga e djathta në të majtë (RTL)","menu":"Redakto Nyjen","name":"Emër","noAnchors":"(Nuk ka asnjë spirancë në dokument)","noEmail":"Ju lutemi shkruani postën elektronike","noUrl":"Ju lutemi shkruani URL-në e nyjes","other":"<tjetër>","popupDependent":"E Varur (Netscape)","popupFeatures":"Karakteristikat e Dritares së Dialogut","popupFullScreen":"Ekran i Plotë  (IE)","popupLeft":"Pozita Majtas","popupLocationBar":"Shiriti i Lokacionit","popupMenuBar":"Shiriti i Menysë","popupResizable":"I ndryshueshëm","popupScrollBars":"Scroll Bars","popupStatusBar":"Shiriti i Statutit","popupToolbar":"Shiriti i Mejteve","popupTop":"Top Pozita","rel":"Marrëdhëniet","selectAnchor":"Përzgjidh një Spirancë","styles":"Stil","tabIndex":"Tab Index","target":"Objektivi","targetFrame":"<frame>","targetFrameName":"Emri i Kornizës së Synuar","targetPopup":"<popup window>","targetPopupName":"Emri i Dritares së Dialogut","title":"Nyja","toAnchor":"Lidhu me spirancën në tekst","toEmail":"Posta Elektronike","toUrl":"URL","toolbar":"Nyja","type":"Lloji i Nyjes","unlink":"Largo Nyjen","upload":"Ngarko"},"list":{"bulletedlist":"Vendos/Largo Listën me Pika","numberedlist":"Vendos/Largo Listën me Numra"},"liststyle":{"armenian":"Numërim armenian","bulletedTitle":"Karakteristikat e Listës me Pulla","circle":"Rreth","decimal":"Decimal (1, 2, 3, etj.)","decimalLeadingZero":"Decimal me zerro udhëheqëse (01, 02, 03, etj.)","disc":"Disk","georgian":"Numërim gjeorgjian (an, ban, gan, etj.)","lowerAlpha":"Të vogla alfa (a, b, c, d, e, etj.)","lowerGreek":"Të vogla greke (alpha, beta, gamma, etj.)","lowerRoman":"Të vogla romake (i, ii, iii, iv, v, etj.)","none":"Asnjë","notset":"<e pazgjedhur>","numberedTitle":"Karakteristikat e Listës me Numra","square":"Katror","start":"Fillimi","type":"LLoji","upperAlpha":"Të mëdha alfa (A, B, C, D, E, etj.)","upperRoman":"Të mëdha romake (I, II, III, IV, V, etj.)","validateStartNumber":"Numri i fillimit të listës duhet të është numër i plotë."},"magicline":{"title":"Vendos paragraf këtu"},"maximize":{"maximize":"Zmadho","minimize":"Zvogëlo"},"newpage":{"toolbar":"Faqe e Re"},"pagebreak":{"alt":"Thyerja e Faqes","toolbar":"Vendos Thyerje Faqeje për Shtyp"},"pastetext":{"button":"Hidhe si tekst të thjeshtë","title":"Hidhe si Tekst të Thjeshtë"},"pastefromword":{"confirmCleanup":"Teksti që dëshironi të e hidhni siç duket është kopjuar nga Word-i. Dëshironi të e pastroni para se të e hidhni?","error":"Nuk ishte e mundur të fshiheshin të dhënat e hedhura për shkak të një gabimi të brendshëm","title":"Hidhe nga Word-i","toolbar":"Hidhe nga Word-i"},"preview":{"preview":"Parashiko"},"print":{"toolbar":"Shtype"},"removeformat":{"toolbar":"Largo Formatin"},"save":{"toolbar":"Ruaje"},"selectall":{"toolbar":"Përzgjidh të Gjitha"},"showblocks":{"toolbar":"Shfaq Blloqet"},"sourcearea":{"toolbar":"Burimi"},"specialchar":{"options":"Mundësitë për Karaktere Speciale","title":"Përzgjidh Karakter Special","toolbar":"Vendos Karakter Special"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Stilet e Formatimit","panelTitle1":"Stilet e Bllokut","panelTitle2":"Stili i Brendshëm","panelTitle3":"Stilet e Objektit"},"table":{"border":"Madhësia e kornizave","caption":"Titull","cell":{"menu":"Qeli","insertBefore":"Shto Qeli Para","insertAfter":"Shto Qeli Prapa","deleteCell":"Gris Qelitë","merge":"Bashko Qelitë","mergeRight":"Bashko Djathtas","mergeDown":"Bashko Poshtë","splitHorizontal":"Ndaj Qelinë Horizontalisht","splitVertical":"Ndaj Qelinë Vertikalisht","title":"Rekuizitat e Qelisë","cellType":"Lloji i Qelisë","rowSpan":"Bashko Rreshtat","colSpan":"Bashko Kolonat","wordWrap":"Fund i Fjalës","hAlign":"Bashkimi Horizontal","vAlign":"Bashkimi Vertikal","alignBaseline":"Baza","bgColor":"Ngjyra e Prapavijës","borderColor":"Ngjyra e Kornizave","data":"Të dhënat","header":"Koka","yes":"Po","no":"Jo","invalidWidth":"Gjerësia e qelisë duhet të jetë numër.","invalidHeight":"Lartësia e qelisë duhet të jetë numër.","invalidRowSpan":"Hapësira e rreshtave duhet të jetë numër i plotë.","invalidColSpan":"Hapësira e kolonave duhet të jetë numër i plotë.","chooseColor":"Përzgjidh"},"cellPad":"Mbushja e qelisë","cellSpace":"Hapësira e qelisë","column":{"menu":"Kolona","insertBefore":"Vendos Kolonë Para","insertAfter":"Vendos Kolonë Pas","deleteColumn":"Gris Kolonat"},"columns":"Kolonat","deleteTable":"Gris Tabelën","headers":"Kokat","headersBoth":"Së bashku","headersColumn":"Kolona e parë","headersNone":"Asnjë","headersRow":"Rreshti i Parë","invalidBorder":"Madhësia e kufinjve duhet të jetë numër.","invalidCellPadding":"Mbushja e qelisë duhet të jetë numër pozitiv.","invalidCellSpacing":"Hapësira e qelisë duhet të jetë numër pozitiv.","invalidCols":"Numri i kolonave duhet të jetë numër më i madh se 0.","invalidHeight":"Lartësia e tabelës duhet të jetë numër.","invalidRows":"Numri i rreshtave duhet të jetë numër më i madh se 0.","invalidWidth":"Gjerësia e tabelës duhet të jetë numër.","menu":"Karakteristikat e Tabelës","row":{"menu":"Rreshti","insertBefore":"Shto Rresht Para","insertAfter":"Shto Rresht Prapa","deleteRow":"Gris Rreshtat"},"rows":"Rreshtat","summary":"Përmbledhje","title":"Karakteristikat e Tabelës","toolbar":"Tabela","widthPc":"përqind","widthPx":"piksell","widthUnit":"njësia e gjerësisë"},"undo":{"redo":"Ribëje","undo":"Rizhbëje"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/sr-latn.js b/htmltest/sites/all/libraries/ckeditor-version/lang/sr-latn.js
new file mode 100644
index 00000000..c10ab0db
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/sr-latn.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sr-latn']={"editor":"Bogati uređivač teksta","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Pretraži server","url":"URL","protocol":"Protokol","upload":"Pošalji","uploadSubmit":"Pošalji na server","image":"Slika","flash":"Fleš","form":"Forma","checkbox":"Polje za potvrdu","radio":"Radio-dugme","textField":"Tekstualno polje","textarea":"Zona teksta","hiddenField":"Skriveno polje","button":"Dugme","select":"Izborno polje","imageButton":"Dugme sa slikom","notSet":"<nije postavljeno>","id":"Id","name":"Naziv","langDir":"Smer jezika","langDirLtr":"S leva na desno (LTR)","langDirRtl":"S desna na levo (RTL)","langCode":"Kôd jezika","longDescr":"Pun opis URL","cssClass":"Stylesheet klase","advisoryTitle":"Advisory naslov","cssStyle":"Stil","ok":"OK","cancel":"Otkaži","close":"Zatvori","preview":"Izgled stranice","resize":"Resize","generalTab":"Opšte","advancedTab":"Napredni tagovi","validateNumberFailed":"Ova vrednost nije broj.","confirmNewPage":"Nesačuvane promene ovog sadržaja će biti izgubljene. Jeste li sigurni da želita da učitate novu stranu?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Opcije","target":"Meta","targetNew":"Novi prozor (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Isti prozor (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"S leva na desno (LTR)","langDirRTL":"S desna na levo (RTL)","styles":"Stil","cssClasses":"Stylesheet klase","width":"Širina","height":"Visina","align":"Ravnanje","alignLeft":"Levo","alignRight":"Desno","alignCenter":"Sredina","alignTop":"Vrh","alignMiddle":"Sredina","alignBottom":"Dole","invalidValue":"Invalid value.","invalidHeight":"Visina mora biti broj.","invalidWidth":"Širina mora biti broj.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Podebljano","italic":"Kurziv","strike":"Precrtano","subscript":"Indeks","superscript":"Stepen","underline":"Podvučeno"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Kopiraj","copyError":"Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+C).","cut":"Iseci","cutError":"Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog isecanja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+X).","paste":"Zalepi","pasteArea":"Prostor za lepljenje","pasteMsg":"Molimo Vas da zalepite unutar donje povrine koristeći tastaturnu prečicu (<STRONG>Ctrl/Cmd+V</STRONG>) i da pritisnete <STRONG>OK</STRONG>.","securityMsg":"Zbog sigurnosnih postavki vašeg pregledača, editor nije u mogućnosti da direktno pristupi podacima u klipbordu. Potrebno je da zalepite još jednom u ovom prozoru.","title":"Zalepi"},"colorbutton":{"auto":"Automatski","bgColorTitle":"Boja pozadine","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"Više boja...","panelTitle":"Colors","textColorTitle":"Boja teksta"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"Obrasci","emptyListMsg":"(Nema definisanih obrazaca)","insertOption":"Replace actual contents","options":"Template Options","selectPromptMsg":"Molimo Vas da odaberete obrazac koji ce biti primenjen na stranicu (trenutni sadržaj ce biti obrisan):","title":"Obrasci za sadržaj"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory naslov","cssClassInputLabel":"Stylesheet klase","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"S leva na desno (LTR)","langDirLabel":"Smer jezika","langDirRTLLabel":"S desna na levo (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Stil","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Suzi alatnu traku","toolbarExpand":"Proširi alatnu traku","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Alatne trake"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"Pretraga","findOptions":"Find Options","findWhat":"Pronadi:","matchCase":"Razlikuj mala i velika slova","matchCyclic":"Match cyclic","matchWord":"Uporedi cele reci","notFoundMsg":"Traženi tekst nije pronađen.","replace":"Zamena","replaceAll":"Zameni sve","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Zameni sa:","title":"Find and Replace"},"fakeobjects":{"anchor":"Unesi/izmeni sidro","flash":"Flash Animation","hiddenfield":"Skriveno polje","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"Abs dole","alignAbsMiddle":"Abs sredina","alignBaseline":"Bazno","alignTextTop":"Vrh teksta","bgcolor":"Boja pozadine","chkFull":"Allow Fullscreen","chkLoop":"Ponavljaj","chkMenu":"Uključi fleš meni","chkPlay":"Automatski start","flashvars":"Variables for Flash","hSpace":"HSpace","properties":"Osobine fleša","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"Skaliraj","scaleAll":"Prikaži sve","scaleFit":"Popuni površinu","scaleNoBorder":"Bez ivice","title":"Osobine fleša","vSpace":"VSpace","validateHSpace":"HSpace must be a number.","validateSrc":"Unesite URL linka","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Veličina fonta","voiceLabel":"Font Size","panelTitle":"Veličina fonta"},"label":"Font","panelTitle":"Font","voiceLabel":"Font"},"forms":{"button":{"title":"Osobine dugmeta","text":"Tekst (vrednost)","type":"Tip","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"Osobine polja za potvrdu","radioTitle":"Osobine radio-dugmeta","value":"Vrednost","selected":"Označeno"},"form":{"title":"Osobine forme","menu":"Osobine forme","action":"Akcija","method":"Metoda","encoding":"Encoding"},"hidden":{"title":"Osobine skrivenog polja","name":"Naziv","value":"Vrednost"},"select":{"title":"Osobine izbornog polja","selectInfo":"Info","opAvail":"Dostupne opcije","value":"Vrednost","size":"Veličina","lines":"linija","chkMulti":"Dozvoli višestruku selekciju","opText":"Tekst","opValue":"Vrednost","btnAdd":"Dodaj","btnModify":"Izmeni","btnUp":"Gore","btnDown":"Dole","btnSetValue":"Podesi kao označenu vrednost","btnDelete":"Obriši"},"textarea":{"title":"Osobine zone teksta","cols":"Broj kolona","rows":"Broj redova"},"textfield":{"title":"Osobine tekstualnog polja","name":"Naziv","value":"Vrednost","charWidth":"Širina (karaktera)","maxChars":"Maksimalno karaktera","type":"Tip","typeText":"Tekst","typePass":"Lozinka","typeEmail":"Email","typeSearch":"Pretraži","typeTel":"Broj telefona","typeUrl":"URL"}},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adresa","tag_div":"Normalno (DIV)","tag_h1":"Naslov 1","tag_h2":"Naslov 2","tag_h3":"Naslov 3","tag_h4":"Naslov 4","tag_h5":"Naslov 5","tag_h6":"Naslov 6","tag_p":"Normal","tag_pre":"Formatirano"},"horizontalrule":{"toolbar":"Unesi horizontalnu liniju"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Unesite URL slike","alt":"Alternativni tekst","border":"Okvir","btnUpload":"Pošalji na server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Info slike","linkTab":"Link","lockRatio":"Zaključaj odnos","menu":"Osobine slika","resetSize":"Resetuj veličinu","title":"Osobine slika","titleButton":"Osobine dugmeta sa slikom","upload":"Pošalji","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Uvećaj levu marginu","outdent":"Smanji levu marginu"},"smiley":{"options":"Smiley Options","title":"Unesi smajlija","toolbar":"Smajli"},"justify":{"block":"Obostrano ravnanje","center":"Centriran tekst","left":"Levo ravnanje","right":"Desno ravnanje"},"link":{"acccessKey":"Pristupni taster","advanced":"Napredni tagovi","advisoryContentType":"Advisory vrsta sadržaja","advisoryTitle":"Advisory naslov","anchor":{"toolbar":"Unesi/izmeni sidro","menu":"Osobine sidra","title":"Osobine sidra","name":"Naziv sidra","errorName":"Unesite naziv sidra","remove":"Ukloni sidro"},"anchorId":"Po Id-u elementa","anchorName":"Po nazivu sidra","charset":"Linked Resource Charset","cssClasses":"Stylesheet klase","emailAddress":"E-Mail adresa","emailBody":"Sadržaj poruke","emailSubject":"Naslov","id":"Id","info":"Link Info","langCode":"Smer jezika","langDir":"Smer jezika","langDirLTR":"S leva na desno (LTR)","langDirRTL":"S desna na levo (RTL)","menu":"Izmeni link","name":"Naziv","noAnchors":"(Nema dostupnih sidra)","noEmail":"Otkucajte adresu elektronske pote","noUrl":"Unesite URL linka","other":"<остало>","popupDependent":"Zavisno (Netscape)","popupFeatures":"Mogućnosti popup prozora","popupFullScreen":"Prikaz preko celog ekrana (IE)","popupLeft":"Od leve ivice ekrana (px)","popupLocationBar":"Lokacija","popupMenuBar":"Kontekstni meni","popupResizable":"Promenljive veličine","popupScrollBars":"Scroll bar","popupStatusBar":"Statusna linija","popupToolbar":"Toolbar","popupTop":"Od vrha ekrana (px)","rel":"Odnos","selectAnchor":"Odaberi sidro","styles":"Stil","tabIndex":"Tab indeks","target":"Meta","targetFrame":"<okvir>","targetFrameName":"Naziv odredišnog frejma","targetPopup":"<popup prozor>","targetPopupName":"Naziv popup prozora","title":"Link","toAnchor":"Sidro na ovoj stranici","toEmail":"E-Mail","toUrl":"URL","toolbar":"Unesi/izmeni link","type":"Vrsta linka","unlink":"Ukloni link","upload":"Pošalji"},"list":{"bulletedlist":"Nenabrojiva lista","numberedlist":"Nabrojiva lista"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"newpage":{"toolbar":"Nova stranica"},"pagebreak":{"alt":"Page Break","toolbar":"Insert Page Break for Printing"},"pastetext":{"button":"Zalepi kao čist tekst","title":"Zalepi kao čist tekst"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Zalepi iz Worda","toolbar":"Zalepi iz Worda"},"preview":{"preview":"Izgled stranice"},"print":{"toolbar":"Štampa"},"removeformat":{"toolbar":"Ukloni formatiranje"},"save":{"toolbar":"Sačuvaj"},"selectall":{"toolbar":"Označi sve"},"showblocks":{"toolbar":"Show Blocks"},"sourcearea":{"toolbar":"Kôd"},"specialchar":{"options":"Special Character Options","title":"Odaberite specijalni karakter","toolbar":"Unesi specijalni karakter"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Veličina okvira","caption":"Naslov tabele","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Obriši ćelije","merge":"Spoj celije","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Razmak ćelija","cellSpace":"Ćelijski prostor","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Obriši kolone"},"columns":"Kolona","deleteTable":"Izbriši tabelu","headers":"Zaglavlja","headersBoth":"Oba","headersColumn":"Prva kolona","headersNone":"None","headersRow":"Prvi red","invalidBorder":"Veličina okvira mora biti broj.","invalidCellPadding":"Padding polja mora biti pozitivan broj.","invalidCellSpacing":"Razmak između ćelija mora biti pozitivan broj.","invalidCols":"Broj kolona mora biti broj veći od 0.","invalidHeight":"Visina tabele mora biti broj.","invalidRows":"Broj redova mora biti veći od 0.","invalidWidth":"Širina tabele mora biti broj.","menu":"Osobine tabele","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Obriši redove"},"rows":"Redova","summary":"Sažetak","title":"Osobine tabele","toolbar":"Tabela","widthPc":"procenata","widthPx":"piksela","widthUnit":"jedinica za širinu"},"undo":{"redo":"Ponovi akciju","undo":"Poni�ti akciju"},"wsc":{"btnIgnore":"Ignoriši","btnIgnoreAll":"Ignoriši sve","btnReplace":"Zameni","btnReplaceAll":"Zameni sve","btnUndo":"Vrati akciju","changeTo":"Izmeni","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Provera spelovanja nije instalirana. Da li želite da je skinete sa Interneta?","manyChanges":"Provera spelovanja završena: %1 reč(i) je izmenjeno","noChanges":"Provera spelovanja završena: Nije izmenjena nijedna rec","noMispell":"Provera spelovanja završena: greške nisu pronadene","noSuggestions":"- Bez sugestija -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Nije u rečniku","oneChange":"Provera spelovanja završena: Izmenjena je jedna reč","progress":"Provera spelovanja u toku...","title":"Spell Check","toolbar":"Proveri spelovanje"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/sr.js b/htmltest/sites/all/libraries/ckeditor-version/lang/sr.js
new file mode 100644
index 00000000..f84a655a
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/sr.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sr']={"editor":"Rich Text Editor","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Претражи сервер","url":"УРЛ","protocol":"Протокол","upload":"Пошаљи","uploadSubmit":"Пошаљи на сервер","image":"Слика","flash":"Флеш елемент","form":"Форма","checkbox":"Поље за потврду","radio":"Радио-дугме","textField":"Текстуално поље","textarea":"Зона текста","hiddenField":"Скривено поље","button":"Дугме","select":"Изборно поље","imageButton":"Дугме са сликом","notSet":"<није постављено>","id":"Ид","name":"Назив","langDir":"Смер језика","langDirLtr":"С лева на десно (LTR)","langDirRtl":"С десна на лево (RTL)","langCode":"Kôд језика","longDescr":"Пун опис УРЛ","cssClass":"Stylesheet класе","advisoryTitle":"Advisory наслов","cssStyle":"Стил","ok":"OK","cancel":"Oткажи","close":"Затвори","preview":"Изглед странице","resize":"Resize","generalTab":"Опште","advancedTab":"Напредни тагови","validateNumberFailed":"Ова вредност није цигра.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"Some of the options have been changed. Are you sure to close the dialog?","options":"Опције","target":"Meтa","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"С лева на десно (LTR)","langDirRTL":"С десна на лево (RTL)","styles":"Стил","cssClasses":"Stylesheet класе","width":"Ширина","height":"Висина","align":"Равнање","alignLeft":"Лево","alignRight":"Десно","alignCenter":"Средина","alignTop":"Врх","alignMiddle":"Средина","alignBottom":"Доле","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Подебљано","italic":"Курзив","strike":"Прецртано","subscript":"Индекс","superscript":"Степен","underline":"Подвучено"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Копирај","copyError":"Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског копирања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+C).","cut":"Исеци","cutError":"Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског исецања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+X).","paste":"Залепи","pasteArea":"Залепи зону","pasteMsg":"Молимо Вас да залепите унутар доње површине користећи тастатурну пречицу (<STRONG>Ctrl/Cmd+V</STRONG>) и да притиснете <STRONG>OK</STRONG>.","securityMsg":"Због сигурносних подешавања претраживача, едитор не може да приступи оставу. Требате да га поново залепите у овом прозору.","title":"Залепи"},"colorbutton":{"auto":"Аутоматски","bgColorTitle":"Боја позадине","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"Више боја...","panelTitle":"Colors","textColorTitle":"Боја текста"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"Обрасци","emptyListMsg":"(Нема дефинисаних образаца)","insertOption":"Replace actual contents","options":"Template Options","selectPromptMsg":"Молимо Вас да одаберете образац који ће бити примењен на страницу (тренутни садржај ће бити обрисан):","title":"Обрасци за садржај"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Left to Right (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Right to Left (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"Склопи алатну траку","toolbarExpand":"Прошири алатну траку","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Едитор алатне траке"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"Претрага","findOptions":"Find Options","findWhat":"Пронађи:","matchCase":"Разликуј велика и мала слова","matchCyclic":"Match cyclic","matchWord":"Упореди целе речи","notFoundMsg":"Тражени текст није пронађен.","replace":"Замена","replaceAll":"Замени све","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"Замени са:","title":"Find and Replace"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"flash":{"access":"Script Access","accessAlways":"Always","accessNever":"Never","accessSameDomain":"Same domain","alignAbsBottom":"Abs доле","alignAbsMiddle":"Abs средина","alignBaseline":"Базно","alignTextTop":"Врх текста","bgcolor":"Боја позадине","chkFull":"Allow Fullscreen","chkLoop":"Понављај","chkMenu":"Укључи флеш мени","chkPlay":"Аутоматски старт","flashvars":"Variables for Flash","hSpace":"HSpace","properties":"Особине Флеша","propertiesTab":"Properties","quality":"Quality","qualityAutoHigh":"Auto High","qualityAutoLow":"Auto Low","qualityBest":"Best","qualityHigh":"High","qualityLow":"Low","qualityMedium":"Medium","scale":"Скалирај","scaleAll":"Прикажи све","scaleFit":"Попуни површину","scaleNoBorder":"Без ивице","title":"Особине флеша","vSpace":"VSpace","validateHSpace":"HSpace must be a number.","validateSrc":"Унесите УРЛ линка","validateVSpace":"VSpace must be a number.","windowMode":"Window mode","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Window"},"font":{"fontSize":{"label":"Величина фонта","voiceLabel":"Font Size","panelTitle":"Величина фонта"},"label":"Фонт","panelTitle":"Фонт","voiceLabel":"Фонт"},"forms":{"button":{"title":"Особине дугмета","text":"Текст (вредност)","type":"Tип","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"Особине поља за потврду","radioTitle":"Особине радио-дугмета","value":"Вредност","selected":"Означено"},"form":{"title":"Особине форме","menu":"Особине форме","action":"Aкција","method":"Mетода","encoding":"Encoding"},"hidden":{"title":"Особине скривеног поља","name":"Назив","value":"Вредност"},"select":{"title":"Особине изборног поља","selectInfo":"Инфо","opAvail":"Доступне опције","value":"Вредност","size":"Величина","lines":"линија","chkMulti":"Дозволи вишеструку селекцију","opText":"Текст","opValue":"Вредност","btnAdd":"Додај","btnModify":"Измени","btnUp":"Горе","btnDown":"Доле","btnSetValue":"Подеси као означену вредност","btnDelete":"Обриши"},"textarea":{"title":"Особине зоне текста","cols":"Број колона","rows":"Број редова"},"textfield":{"title":"Особине текстуалног поља","name":"Назив","value":"Вредност","charWidth":"Ширина (карактера)","maxChars":"Максимално карактера","type":"Тип","typeText":"Текст","typePass":"Лозинка","typeEmail":"Е-пошта","typeSearch":"Претрага","typeTel":"Број телефона","typeUrl":"УРЛ"}},"format":{"label":"Формат","panelTitle":"Формат","tag_address":"Adresa","tag_div":"Нормално (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatirano"},"horizontalrule":{"toolbar":"Унеси хоризонталну линију"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"Унесите УРЛ слике","alt":"Алтернативни текст","border":"Оквир","btnUpload":"Пошаљи на сервер","button2Img":"Да ли желите да промените одабрану слику дугмета као једноставну слику?","hSpace":"HSpace","img2Button":"Да ли желите да промените одабрану слику у слику дугмета?","infoTab":"Инфо слике","linkTab":"Линк","lockRatio":"Закључај однос","menu":"Особине слика","resetSize":"Ресетуј величину","title":"Особине слика","titleButton":"Особине дугмета са сликом","upload":"Пошаљи","urlMissing":"Недостаје УРЛ слике.","vSpace":"VSpace","validateBorder":"Ивица треба да буде цифра.","validateHSpace":"HSpace треба да буде цифра.","validateVSpace":"VSpace треба да буде цифра."},"indent":{"indent":"Увећај леву маргину","outdent":"Смањи леву маргину"},"smiley":{"options":"Smiley Options","title":"Унеси смајлија","toolbar":"Смајли"},"justify":{"block":"Обострано равнање","center":"Центриран текст","left":"Лево равнање","right":"Десно равнање"},"link":{"acccessKey":"Приступни тастер","advanced":"Напредни тагови","advisoryContentType":"Advisory врста садржаја","advisoryTitle":"Advisory наслов","anchor":{"toolbar":"Унеси/измени сидро","menu":"Особине сидра","title":"Особине сидра","name":"Име сидра","errorName":"Молимо Вас да унесете име сидра","remove":"Remove Anchor"},"anchorId":"Пo Ид-jу елемента","anchorName":"По називу сидра","charset":"Linked Resource Charset","cssClasses":"Stylesheet класе","emailAddress":"Адреса електронске поште","emailBody":"Садржај поруке","emailSubject":"Наслов","id":"Ид","info":"Линк инфо","langCode":"Смер језика","langDir":"Смер језика","langDirLTR":"С лева на десно (LTR)","langDirRTL":"С десна на лево (RTL)","menu":"Промени линк","name":"Назив","noAnchors":"(Нема доступних сидра)","noEmail":"Откуцајте адресу електронске поште","noUrl":"Унесите УРЛ линка","other":"<друго>","popupDependent":"Зависно (Netscape)","popupFeatures":"Могућности искачућег прозора","popupFullScreen":"Приказ преко целог екрана (ИE)","popupLeft":"Од леве ивице екрана (пиксела)","popupLocationBar":"Локација","popupMenuBar":"Контекстни мени","popupResizable":"Величина се мења","popupScrollBars":"Скрол бар","popupStatusBar":"Статусна линија","popupToolbar":"Toolbar","popupTop":"Од врха екрана (пиксела)","rel":"Однос","selectAnchor":"Одабери сидро","styles":"Стил","tabIndex":"Таб индекс","target":"Meтa","targetFrame":"<оквир>","targetFrameName":"Назив одредишног фрејма","targetPopup":"<искачући прозор>","targetPopupName":"Назив искачућег прозора","title":"Линк","toAnchor":"Сидро на овој страници","toEmail":"Eлектронска пошта","toUrl":"УРЛ","toolbar":"Унеси/измени линк","type":"Врста линка","unlink":"Уклони линк","upload":"Пошаљи"},"list":{"bulletedlist":"Ненабројива листа","numberedlist":"Набројиву листу"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"newpage":{"toolbar":"Нова страница"},"pagebreak":{"alt":"Page Break","toolbar":"Insert Page Break for Printing"},"pastetext":{"button":"Залепи као чист текст","title":"Залепи као чист текст"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Залепи из Worda","toolbar":"Залепи из Worda"},"preview":{"preview":"Изглед странице"},"print":{"toolbar":"Штампа"},"removeformat":{"toolbar":"Уклони форматирање"},"save":{"toolbar":"Сачувај"},"selectall":{"toolbar":"Означи све"},"showblocks":{"toolbar":"Show Blocks"},"sourcearea":{"toolbar":"Kôд"},"specialchar":{"options":"Опције специјалног карактера","title":"Одаберите специјални карактер","toolbar":"Унеси специјални карактер"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Стил","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Величина оквира","caption":"Наслов табеле","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Обриши ћелије","merge":"Спој ћелије","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Размак ћелија","cellSpace":"Ћелијски простор","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Обриши колоне"},"columns":"Kолона","deleteTable":"Обриши таблу","headers":"Поглавља","headersBoth":"Оба","headersColumn":"Прва колона","headersNone":"None","headersRow":"Први ред","invalidBorder":"Величина ивице треба да буде цифра.","invalidCellPadding":"Пуњење ћелије треба да буде позитивна цифра.","invalidCellSpacing":"Размак ћелије треба да буде позитивна цифра.","invalidCols":"Број колона треба да буде цифра већа од 0.","invalidHeight":"Висина табеле треба да буде цифра.","invalidRows":"Број реда треба да буде цифра већа од 0.","invalidWidth":"Ширина табеле треба да буде цифра.","menu":"Особине табеле","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Обриши редове"},"rows":"Редова","summary":"Резиме","title":"Особине табеле","toolbar":"Табела","widthPc":"процената","widthPx":"пиксела","widthUnit":"јединица ширине"},"undo":{"redo":"Понови акцију","undo":"Поништи акцију"},"wsc":{"btnIgnore":"Игнориши","btnIgnoreAll":"Игнориши све","btnReplace":"Замени","btnReplaceAll":"Замени све","btnUndo":"Врати акцију","changeTo":"Измени","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Провера спеловања није инсталирана. Да ли желите да је скинете са Интернета?","manyChanges":"Провера спеловања завршена:  %1 реч(и) је измењено","noChanges":"Провера спеловања завршена: Није измењена ниједна реч","noMispell":"Провера спеловања завршена: грешке нису пронађене","noSuggestions":"- Без сугестија -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Није у речнику","oneChange":"Провера спеловања завршена: Измењена је једна реч","progress":"Провера спеловања у току...","title":"Spell Check","toolbar":"Провери спеловање"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/sv.js b/htmltest/sites/all/libraries/ckeditor-version/lang/sv.js
new file mode 100644
index 00000000..d8cd3e01
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/sv.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sv']={"editor":"Rich Text Editor","common":{"editorHelp":"Tryck ALT 0 för hjälp","browseServer":"Bläddra på server","url":"URL","protocol":"Protokoll","upload":"Ladda upp","uploadSubmit":"Skicka till server","image":"Bild","flash":"Flash","form":"Formulär","checkbox":"Kryssruta","radio":"Alternativknapp","textField":"Textfält","textarea":"Textruta","hiddenField":"Dolt fält","button":"Knapp","select":"Flervalslista","imageButton":"Bildknapp","notSet":"<ej angivet>","id":"Id","name":"Namn","langDir":"Språkriktning","langDirLtr":"Vänster till Höger (VTH)","langDirRtl":"Höger till Vänster (HTV)","langCode":"Språkkod","longDescr":"URL-beskrivning","cssClass":"Stilmall","advisoryTitle":"Titel","cssStyle":"Stilmall","ok":"OK","cancel":"Avbryt","close":"Stäng","preview":"Förhandsgranska","resize":"Dra för att ändra storlek","generalTab":"Allmänt","advancedTab":"Avancerad","validateNumberFailed":"Värdet är inte ett nummer.","confirmNewPage":"Alla ändringar i innehållet kommer att förloras. Är du säker på att du vill ladda en ny sida?","confirmCancel":"Några av alternativen har ändrats. Är du säker på att du vill stänga dialogrutan?","options":"Alternativ","target":"Mål","targetNew":"Nytt fönster (_blank)","targetTop":"Översta fönstret (_top)","targetSelf":"Samma fönster (_self)","targetParent":"Föregående fönster (_parent)","langDirLTR":"Vänster till höger (LTR)","langDirRTL":"Höger till vänster (RTL)","styles":"Stil","cssClasses":"Stilmallar","width":"Bredd","height":"Höjd","align":"Justering","alignLeft":"Vänster","alignRight":"Höger","alignCenter":"Centrerad","alignTop":"Överkant","alignMiddle":"Mitten","alignBottom":"Nederkant","invalidValue":"Felaktigt värde.","invalidHeight":"Höjd måste vara ett nummer.","invalidWidth":"Bredd måste vara ett nummer.","invalidCssLength":"Värdet för fältet \"%1\" måste vara ett positivt nummer med eller utan CSS-mätenheter (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Värdet för fältet \"%1\" måste vara ett positivt nummer med eller utan godkända HTML-mätenheter (px eller %).","invalidInlineStyle":"Det angivna värdet för style måste innehålla en eller flera tupler separerade med semikolon i följande format: \"name : value\"","cssLengthTooltip":"Ange ett nummer i pixlar eller ett nummer men godkänd CSS-mätenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, Ej tillgänglig</span>"},"about":{"copy":"Copyright &copy; $1. Alla rättigheter reserverade.","dlgTitle":"Om CKEditor","help":"Se $1 för hjälp.","moreInfo":"För information av licensiering besök vår hemsida:","title":"Om CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Genomstruken","subscript":"Nedsänkta tecken","superscript":"Upphöjda tecken","underline":"Understruken"},"bidi":{"ltr":"Text riktning från vänster till höger","rtl":"Text riktning från höger till vänster"},"blockquote":{"toolbar":"Blockcitat"},"clipboard":{"copy":"Kopiera","copyError":"Säkerhetsinställningar i Er webbläsare tillåter inte åtgärden kopiera. Använd (Ctrl/Cmd+C) istället.","cut":"Klipp ut","cutError":"Säkerhetsinställningar i Er webbläsare tillåter inte åtgärden klipp ut. Använd (Ctrl/Cmd+X) istället.","paste":"Klistra in","pasteArea":"Paste Area","pasteMsg":"Var god och klistra in Er text i rutan nedan genom att använda (<strong>Ctrl/Cmd+V</strong>) klicka sen på OK.","securityMsg":"På grund av din webbläsares säkerhetsinställningar kan verktyget inte få åtkomst till urklippsdatan. Var god och använd detta fönster istället.","title":"Klistra in"},"colorbutton":{"auto":"Automatisk","bgColorTitle":"Bakgrundsfärg","colors":{"000":"Svart","800000":"Rödbrun","8B4513":"Mörkbrun","2F4F4F":"Skiffergrå","008080":"Kricka","000080":"Marinblå","4B0082":"Indigo","696969":"Mörkgrå","B22222":"Tegelsten","A52A2A":"Brun","DAA520":"Mörk guld","006400":"Mörkgrön","40E0D0":"Turkos","0000CD":"Medium blå","800080":"Lila","808080":"Grå","F00":"Röd","FF8C00":"Mörkorange","FFD700":"Guld","008000":"Grön","0FF":"Turkos","00F":"Blå","EE82EE":"Violett","A9A9A9":"Matt grå","FFA07A":"Laxrosa","FFA500":"Orange","FFFF00":"Gul","00FF00":"Lime","AFEEEE":"Ljusturkos","ADD8E6":"Ljusblå","DDA0DD":"Plommon","D3D3D3":"Ljusgrå","FFF0F5":"Ljus lavendel","FAEBD7":"Antikvit","FFFFE0":"Ljusgul","F0FFF0":"Honungsdagg","F0FFFF":"Azurblå","F0F8FF":"Aliceblå","E6E6FA":"Lavendel","FFF":"Vit"},"more":"Fler färger...","panelTitle":"Färger","textColorTitle":"Textfärg"},"colordialog":{"clear":"Rensa","highlight":"Markera","options":"Färgalternativ","selected":"Vald färg","title":"Välj färg"},"templates":{"button":"Sidmallar","emptyListMsg":"(Ingen mall är vald)","insertOption":"Ersätt aktuellt innehåll","options":"Inställningar för mall","selectPromptMsg":"Var god välj en mall att använda med editorn<br>(allt nuvarande innehåll raderas):","title":"Sidmallar"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Rådgivande titel","cssClassInputLabel":"Stilmallar","edit":"Redigera Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Vänster till Höger (LTR)","langDirLabel":"Språkriktning","langDirRTLLabel":"Höger till vänster (RTL)","languageCodeInputLabel":" Språkkod","remove":"Ta bort Div","styleSelectLabel":"Stil","title":"Skapa Div container","toolbar":"Skapa Div container"},"toolbar":{"toolbarCollapse":"Dölj verktygsfält","toolbarExpand":"Visa verktygsfält","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Redigera verktygsfält"},"elementspath":{"eleLabel":"Elementets sökväg","eleTitle":"%1 element"},"find":{"find":"Sök","findOptions":"Sökalternativ","findWhat":"Sök efter:","matchCase":"Skiftläge","matchCyclic":"Matcha cykliska","matchWord":"Inkludera hela ord","notFoundMsg":"Angiven text kunde ej hittas.","replace":"Ersätt","replaceAll":"Ersätt alla","replaceSuccessMsg":"%1 förekomst(er) ersatta.","replaceWith":"Ersätt med:","title":"Sök och ersätt"},"fakeobjects":{"anchor":"Ankare","flash":"Flashanimation","hiddenfield":"Gömt fält","iframe":"iFrame","unknown":"Okänt objekt"},"flash":{"access":"Script-tillgång","accessAlways":"Alltid","accessNever":"Aldrig","accessSameDomain":"Samma domän","alignAbsBottom":"Absolut nederkant","alignAbsMiddle":"Absolut centrering","alignBaseline":"Baslinje","alignTextTop":"Text överkant","bgcolor":"Bakgrundsfärg","chkFull":"Tillåt helskärm","chkLoop":"Upprepa/Loopa","chkMenu":"Aktivera Flashmeny","chkPlay":"Automatisk uppspelning","flashvars":"Variabler för Flash","hSpace":"Horis. marginal","properties":"Flashegenskaper","propertiesTab":"Egenskaper","quality":"Kvalitet","qualityAutoHigh":"Auto Hög","qualityAutoLow":"Auto Låg","qualityBest":"Bäst","qualityHigh":"Hög","qualityLow":"Låg","qualityMedium":"Medium","scale":"Skala","scaleAll":"Visa allt","scaleFit":"Exakt passning","scaleNoBorder":"Ingen ram","title":"Flashegenskaper","vSpace":"Vert. marginal","validateHSpace":"HSpace måste vara ett nummer.","validateSrc":"Var god ange länkens URL","validateVSpace":"VSpace måste vara ett nummer.","windowMode":"Fönsterläge","windowModeOpaque":"Opaque","windowModeTransparent":"Transparent","windowModeWindow":"Fönster"},"font":{"fontSize":{"label":"Storlek","voiceLabel":"Teckenstorlek","panelTitle":"Storlek"},"label":"Typsnitt","panelTitle":"Typsnitt","voiceLabel":"Typsnitt"},"forms":{"button":{"title":"Egenskaper för knapp","text":"Text (värde)","type":"Typ","typeBtn":"Knapp","typeSbm":"Skicka","typeRst":"Återställ"},"checkboxAndRadio":{"checkboxTitle":"Egenskaper för kryssruta","radioTitle":"Egenskaper för alternativknapp","value":"Värde","selected":"Vald"},"form":{"title":"Egenskaper för formulär","menu":"Egenskaper för formulär","action":"Funktion","method":"Metod","encoding":"Kodning"},"hidden":{"title":"Egenskaper för dolt fält","name":"Namn","value":"Värde"},"select":{"title":"Egenskaper för flervalslista","selectInfo":"Information","opAvail":"Befintliga val","value":"Värde","size":"Storlek","lines":"Linjer","chkMulti":"Tillåt flerval","opText":"Text","opValue":"Värde","btnAdd":"Lägg till","btnModify":"Redigera","btnUp":"Upp","btnDown":"Ner","btnSetValue":"Markera som valt värde","btnDelete":"Radera"},"textarea":{"title":"Egenskaper för textruta","cols":"Kolumner","rows":"Rader"},"textfield":{"title":"Egenskaper för textfält","name":"Namn","value":"Värde","charWidth":"Teckenbredd","maxChars":"Max antal tecken","type":"Typ","typeText":"Text","typePass":"Lösenord","typeEmail":"E-post","typeSearch":"Sök","typeTel":"Telefonnummer","typeUrl":"URL"}},"format":{"label":"Teckenformat","panelTitle":"Teckenformat","tag_address":"Adress","tag_div":"Normal (DIV)","tag_h1":"Rubrik 1","tag_h2":"Rubrik 2","tag_h3":"Rubrik 3","tag_h4":"Rubrik 4","tag_h5":"Rubrik 5","tag_h6":"Rubrik 6","tag_p":"Normal","tag_pre":"Formaterad"},"horizontalrule":{"toolbar":"Infoga horisontal linje"},"iframe":{"border":"Visa ramkant","noUrl":"Skriv in URL för iFrame","scrolling":"Aktivera rullningslister","title":"iFrame Egenskaper","toolbar":"iFrame"},"image":{"alertUrl":"Var god och ange bildens URL","alt":"Alternativ text","border":"Kant","btnUpload":"Skicka till server","button2Img":"Vill du omvandla den valda bildknappen på en enkel bild?","hSpace":"Horis. marginal","img2Button":"Vill du omvandla den valda bildknappen på en enkel bild?","infoTab":"Bildinformation","linkTab":"Länk","lockRatio":"Lås höjd/bredd förhållanden","menu":"Bildegenskaper","resetSize":"Återställ storlek","title":"Bildegenskaper","titleButton":"Egenskaper för bildknapp","upload":"Ladda upp","urlMissing":"Bildkällans URL saknas.","vSpace":"Vert. marginal","validateBorder":"Kantlinje måste vara ett heltal.","validateHSpace":"HSpace måste vara ett heltal.","validateVSpace":"VSpace måste vara ett heltal."},"indent":{"indent":"Öka indrag","outdent":"Minska indrag"},"smiley":{"options":"Smileyinställningar","title":"Infoga smiley","toolbar":"Smiley"},"justify":{"block":"Justera till marginaler","center":"Centrera","left":"Vänsterjustera","right":"Högerjustera"},"link":{"acccessKey":"Behörighetsnyckel","advanced":"Avancerad","advisoryContentType":"Innehållstyp","advisoryTitle":"Titel","anchor":{"toolbar":"Infoga/Redigera ankarlänk","menu":"Egenskaper för ankarlänk","title":"Egenskaper för ankarlänk","name":"Ankarnamn","errorName":"Var god ange ett ankarnamn","remove":"Radera ankare"},"anchorId":"efter objektid","anchorName":"efter ankarnamn","charset":"Teckenuppställning","cssClasses":"Stilmall","emailAddress":"E-postadress","emailBody":"Innehåll","emailSubject":"Ämne","id":"Id","info":"Länkinformation","langCode":"Språkriktning","langDir":"Språkriktning","langDirLTR":"Vänster till höger (VTH)","langDirRTL":"Höger till vänster (HTV)","menu":"Redigera länk","name":"Namn","noAnchors":"(Inga ankare kunde hittas)","noEmail":"Var god ange E-postadress","noUrl":"Var god ange länkens URL","other":"<annan>","popupDependent":"Beroende (endast Netscape)","popupFeatures":"Popup-fönstrets egenskaper","popupFullScreen":"Helskärm (endast IE)","popupLeft":"Position från vänster","popupLocationBar":"Adressfält","popupMenuBar":"Menyfält","popupResizable":"Resizable","popupScrollBars":"Scrolllista","popupStatusBar":"Statusfält","popupToolbar":"Verktygsfält","popupTop":"Position från sidans topp","rel":"Förhållande","selectAnchor":"Välj ett ankare","styles":"Stilmall","tabIndex":"Tabindex","target":"Mål","targetFrame":"<ram>","targetFrameName":"Målets ramnamn","targetPopup":"<popup-fönster>","targetPopupName":"Popup-fönstrets namn","title":"Länk","toAnchor":"Länk till ankare i texten","toEmail":"E-post","toUrl":"URL","toolbar":"Infoga/Redigera länk","type":"Länktyp","unlink":"Radera länk","upload":"Ladda upp"},"list":{"bulletedlist":"Punktlista","numberedlist":"Numrerad lista"},"liststyle":{"armenian":"Armenisk numrering","bulletedTitle":"Egenskaper för punktlista","circle":"Cirkel","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal nolla (01, 02, 03, etc.)","disc":"Disk","georgian":"Georgisk numrering (an, ban, gan, etc.)","lowerAlpha":"Alpha gemener (a, b, c, d, e, etc.)","lowerGreek":"Grekiska gemener (alpha, beta, gamma, etc.)","lowerRoman":"Romerska gemener (i, ii, iii, iv, v, etc.)","none":"Ingen","notset":"<ej angiven>","numberedTitle":"Egenskaper för punktlista","square":"Fyrkant","start":"Start","type":"Typ","upperAlpha":"Alpha versaler (A, B, C, D, E, etc.)","upperRoman":"Romerska versaler (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Infoga paragraf här"},"maximize":{"maximize":"Maximera","minimize":"Minimera"},"newpage":{"toolbar":"Ny sida"},"pagebreak":{"alt":"Sidbrytning","toolbar":"Infoga sidbrytning för utskrift"},"pastetext":{"button":"Klistra in som vanlig text","title":"Klistra in som vanlig text"},"pastefromword":{"confirmCleanup":"Texten du vill klistra in verkar vara kopierad från Word. Vill du rensa den innan du klistrar in den?","error":"Det var inte möjligt att städa upp den inklistrade data på grund av ett internt fel","title":"Klistra in från Word","toolbar":"Klistra in från Word"},"preview":{"preview":"Förhandsgranska"},"print":{"toolbar":"Skriv ut"},"removeformat":{"toolbar":"Radera formatering"},"save":{"toolbar":"Spara"},"selectall":{"toolbar":"Markera allt"},"showblocks":{"toolbar":"Visa block"},"sourcearea":{"toolbar":"Källa"},"specialchar":{"options":"Alternativ för utökade tecken","title":"Välj utökat tecken","toolbar":"Klistra in utökat tecken"},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Lägg till ord","allCaps":"Ignorera alla ord med enbart versaler","dic_create":"Skapa","dic_delete":"Ta bort","dic_field_name":"Ordlistans namn","dic_info":"Inledningsvis lagras ordlistan i en cookie. När ordlista växer till en punkt där det inte kan lagras i en cookie, lagras den på vår server. För att lagra din personliga ordlista på vår server du ska ange ett namn för din ordbok. Om du redan har en lagrad ordbok, skriv namnet och klicka på knappen Återställ.","dic_rename":"Byt namn","dic_restore":"Återställ","dictionariesTab":"Ordlistor","disable":"Inaktivera SCAYT","emptyDic":"Ordlistans namn får ej vara tomt.","enable":"Aktivera SCAYT","ignore":"Ignorera","ignoreAll":"Ignorera alla","ignoreDomainNames":"Ignorera domännamn","langs":"Språk","languagesTab":"Språk","mixedCase":"Ignorera ord med blandat shiftläge","mixedWithDigits":"Ignorera ord med nummer","moreSuggestions":"Fler förslag","opera_title":"Stöds ej av Opera","options":"Inställningar","optionsTab":"Inställningar","title":"Stavningskontroll medan du skriver","toggle":"Växla SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Anpassad stil","panelTitle":"Formatmallar","panelTitle1":"Blockstil","panelTitle2":"Inbäddad stil","panelTitle3":"Objektets stil"},"table":{"border":"Kantstorlek","caption":"Rubrik","cell":{"menu":"Cell","insertBefore":"Lägg till cell före","insertAfter":"Lägg till cell efter","deleteCell":"Radera celler","merge":"Sammanfoga celler","mergeRight":"Sammanfoga höger","mergeDown":"Sammanfoga ner","splitHorizontal":"Dela cell horisontellt","splitVertical":"Dela cell vertikalt","title":"Egenskaper för cell","cellType":"Celltyp","rowSpan":"Rad spann","colSpan":"Kolumnen spann","wordWrap":"Radbrytning","hAlign":"Horisontell justering","vAlign":"Vertikal justering","alignBaseline":"Baslinje","bgColor":"Bakgrundsfärg","borderColor":"Ramfärg","data":"Data","header":"Rubrik","yes":"Ja","no":"Nej","invalidWidth":"Cellens bredd måste vara ett nummer.","invalidHeight":"Cellens höjd måste vara ett nummer.","invalidRowSpan":"Radutvidgning måste vara ett heltal.","invalidColSpan":"Kolumn måste vara ett heltal.","chooseColor":"Välj"},"cellPad":"Cellutfyllnad","cellSpace":"Cellavstånd","column":{"menu":"Kolumn","insertBefore":"Lägg till kolumn före","insertAfter":"Lägg till kolumn efter","deleteColumn":"Radera kolumn"},"columns":"Kolumner","deleteTable":"Radera tabell","headers":"Rubriker","headersBoth":"Båda","headersColumn":"Första kolumnen","headersNone":"Ingen","headersRow":"Första raden","invalidBorder":"Ram måste vara ett nummer.","invalidCellPadding":"Luft i cell måste vara ett nummer.","invalidCellSpacing":"Luft i cell måste vara ett nummer.","invalidCols":"Antal kolumner måste vara ett nummer större än 0.","invalidHeight":"Tabellens höjd måste vara ett nummer.","invalidRows":"Antal rader måste vara större än 0.","invalidWidth":"Tabell måste vara ett nummer.","menu":"Tabellegenskaper","row":{"menu":"Rad","insertBefore":"Lägg till rad före","insertAfter":"Lägg till rad efter","deleteRow":"Radera rad"},"rows":"Rader","summary":"Sammanfattning","title":"Tabellegenskaper","toolbar":"Tabell","widthPc":"procent","widthPx":"pixlar","widthUnit":"enhet bredd"},"undo":{"redo":"Gör om","undo":"Ångra"},"wsc":{"btnIgnore":"Ignorera","btnIgnoreAll":"Ignorera alla","btnReplace":"Ersätt","btnReplaceAll":"Ersätt alla","btnUndo":"Ångra","changeTo":"Ändra till","errorLoading":"Tjänsten är ej tillgänglig: %s.","ieSpellDownload":"Stavningskontrollen är ej installerad. Vill du göra det nu?","manyChanges":"Stavningskontroll slutförd: %1 ord rättades.","noChanges":"Stavningskontroll slutförd: Inga ord rättades.","noMispell":"Stavningskontroll slutförd: Inga stavfel påträffades.","noSuggestions":"- Förslag saknas -","notAvailable":"Tyvärr är tjänsten ej tillgänglig nu","notInDic":"Saknas i ordlistan","oneChange":"Stavningskontroll slutförd: Ett ord rättades.","progress":"Stavningskontroll pågår...","title":"Kontrollera stavning","toolbar":"Stavningskontroll"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/th.js b/htmltest/sites/all/libraries/ckeditor-version/lang/th.js
new file mode 100644
index 00000000..9357cf09
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/th.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['th']={"editor":"Rich Text Editor","common":{"editorHelp":"กด ALT 0 หากต้องการความช่วยเหลือ","browseServer":"เปิดหน้าต่างจัดการไฟล์อัพโหลด","url":"ที่อยู่อ้างอิง URL","protocol":"โปรโตคอล","upload":"อัพโหลดไฟล์","uploadSubmit":"อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)","image":"รูปภาพ","flash":"ไฟล์ Flash","form":"แบบฟอร์ม","checkbox":"เช็คบ๊อก","radio":"เรดิโอบัตตอน","textField":"เท็กซ์ฟิลด์","textarea":"เท็กซ์แอเรีย","hiddenField":"ฮิดเดนฟิลด์","button":"ปุ่ม","select":"แถบตัวเลือก","imageButton":"ปุ่มแบบรูปภาพ","notSet":"<ไม่ระบุ>","id":"ไอดี","name":"ชื่อ","langDir":"การเขียน-อ่านภาษา","langDirLtr":"จากซ้ายไปขวา (LTR)","langDirRtl":"จากขวามาซ้าย (RTL)","langCode":"รหัสภาษา","longDescr":"คำอธิบายประกอบ URL","cssClass":"คลาสของไฟล์กำหนดลักษณะการแสดงผล","advisoryTitle":"คำเกริ่นนำ","cssStyle":"ลักษณะการแสดงผล","ok":"ตกลง","cancel":"ยกเลิก","close":"ปิด","preview":"ดูหน้าเอกสารตัวอย่าง","resize":"ปรับขนาด","generalTab":"ทั่วไป","advancedTab":"ขั้นสูง","validateNumberFailed":"ค่านี้ไม่ใช่ตัวเลข","confirmNewPage":"การเปลี่ยนแปลงใดๆ ในเนื้อหานี้ ที่ไม่ได้ถูกบันทึกไว้ จะสูญหายทั้งหมด คุณแน่ใจว่าจะเรียกหน้าใหม่?","confirmCancel":"ตัวเลือกบางตัวมีการเปลี่ยนแปลง คุณแน่ใจว่าจะปิดกล่องโต้ตอบนี้?","options":"ตัวเลือก","target":"การเปิดหน้าลิงค์","targetNew":"หน้าต่างใหม่ (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"หน้าต่างเดียวกัน (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"จากซ้ายไปขวา (LTR)","langDirRTL":"จากขวามาซ้าย (RTL)","styles":"ลักษณะการแสดงผล","cssClasses":"คลาสของไฟล์กำหนดลักษณะการแสดงผล","width":"ความกว้าง","height":"ความสูง","align":"การจัดวาง","alignLeft":"ชิดซ้าย","alignRight":"ชิดขวา","alignCenter":"กึ่งกลาง","alignTop":"บนสุด","alignMiddle":"กึ่งกลางแนวตั้ง","alignBottom":"ชิดด้านล่าง","invalidValue":"ค่าไม่ถูกต้อง","invalidHeight":"ความสูงต้องเป็นตัวเลข","invalidWidth":"ความกว้างต้องเป็นตัวเลข","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"ตัวหนา","italic":"ตัวเอียง","strike":"ตัวขีดเส้นทับ","subscript":"ตัวห้อย","superscript":"ตัวยก","underline":"ตัวขีดเส้นใต้"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"สำเนา","copyError":"ไม่สามารถสำเนาข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว C พร้อมกัน).","cut":"ตัด","cutError":"ไม่สามารถตัดข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว X พร้อมกัน).","paste":"วาง","pasteArea":"Paste Area","pasteMsg":"กรุณาใช้คีย์บอร์ดเท่านั้น โดยกดปุ๋ม (<strong>Ctrl/Cmd และ V</strong>)พร้อมๆกัน และกด <strong>OK</strong>.","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"วาง"},"colorbutton":{"auto":"สีอัตโนมัติ","bgColorTitle":"สีพื้นหลัง","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"เลือกสีอื่นๆ...","panelTitle":"Colors","textColorTitle":"สีตัวอักษร"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"เทมเพลต","emptyListMsg":"(ยังไม่มีการกำหนดเทมเพลต)","insertOption":"แทนที่เนื้อหาเว็บไซต์ที่เลือก","options":"ตัวเลือกเกี่ยวกับเทมเพลท","selectPromptMsg":"กรุณาเลือก เทมเพลต เพื่อนำไปแก้ไขในอีดิตเตอร์<br />(เนื้อหาส่วนนี้จะหายไป):","title":"เทมเพลตของส่วนเนื้อหาเว็บไซต์"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"ไอดี","advisoryTitleInputLabel":"คำเกริ่นนำ","cssClassInputLabel":"คลาสของไฟล์กำหนดลักษณะการแสดงผล","edit":"แก้ไข Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"จากซ้ายไปขวา (LTR)","langDirLabel":"การเขียน-อ่านภาษา","langDirRTLLabel":"จากขวามาซ้าย (RTL)","languageCodeInputLabel":"รหัสภาษา","remove":"ลบ Div","styleSelectLabel":"ลักษณะการแสดงผล","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"ซ่อนแถบเครื่องมือ","toolbarExpand":"เปิดแถบเครื่องมือ","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"แถบเครื่องมือช่วยพิมพ์ข้อความ"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"find":{"find":"ค้นหา","findOptions":"Find Options","findWhat":"ค้นหาคำว่า:","matchCase":"ตัวโหญ่-เล็ก ต้องตรงกัน","matchCyclic":"Match cyclic","matchWord":"ต้องตรงกันทุกคำ","notFoundMsg":"ไม่พบคำที่ค้นหา.","replace":"ค้นหาและแทนที่","replaceAll":"แทนที่ทั้งหมดที่พบ","replaceSuccessMsg":"%1 occurrence(s) replaced.","replaceWith":"แทนที่ด้วย:","title":"Find and Replace"},"fakeobjects":{"anchor":"แทรก/แก้ไข Anchor","flash":"ภาพอนิเมชั่นแฟลช","hiddenfield":"ฮิดเดนฟิลด์","iframe":"IFrame","unknown":"วัตถุไม่ทราบชนิด"},"flash":{"access":"การเข้าถึงสคริปต์","accessAlways":"ตลอดไป","accessNever":"ไม่เลย","accessSameDomain":"โดเมนเดียวกัน","alignAbsBottom":"ชิดด้านล่างสุด","alignAbsMiddle":"กึ่งกลาง","alignBaseline":"ชิดบรรทัด","alignTextTop":"ใต้ตัวอักษร","bgcolor":"สีพื้นหลัง","chkFull":"อนุญาตให้แสดงเต็มหน้าจอได้","chkLoop":"เล่นวนรอบ Loop","chkMenu":"ให้ใช้งานเมนูของ Flash","chkPlay":"เล่นอัตโนมัติ Auto Play","flashvars":"ตัวแปรสำหรับ Flas","hSpace":"ระยะแนวนอน","properties":"คุณสมบัติของไฟล์ Flash","propertiesTab":"คุณสมบัติ","quality":"คุณภาพ","qualityAutoHigh":"ปรับคุณภาพสูงอัตโนมัติ","qualityAutoLow":"ปรับคุณภาพต่ำอัตโนมัติ","qualityBest":"ดีที่สุด","qualityHigh":"สูง","qualityLow":"ต่ำ","qualityMedium":"ปานกลาง","scale":"อัตราส่วน Scale","scaleAll":"แสดงให้เห็นทั้งหมด Show all","scaleFit":"แสดงให้พอดีกับพื้นที่ Exact Fit","scaleNoBorder":"ไม่แสดงเส้นขอบ No Border","title":"คุณสมบัติของไฟล์ Flash","vSpace":"ระยะแนวตั้ง","validateHSpace":"HSpace ต้องเป็นจำนวนตัวเลข","validateSrc":"กรุณาระบุที่อยู่อ้างอิงออนไลน์ (URL)","validateVSpace":"VSpace ต้องเป็นจำนวนตัวเลข","windowMode":"โหมดหน้าต่าง","windowModeOpaque":"ความทึบแสง","windowModeTransparent":"ความโปรงแสง","windowModeWindow":"หน้าต่าง"},"font":{"fontSize":{"label":"ขนาด","voiceLabel":"Font Size","panelTitle":"ขนาด"},"label":"แบบอักษร","panelTitle":"แบบอักษร","voiceLabel":"แบบอักษร"},"forms":{"button":{"title":"รายละเอียดของ ปุ่ม","text":"ข้อความ (ค่าตัวแปร)","type":"ข้อความ","typeBtn":"Button","typeSbm":"Submit","typeRst":"Reset"},"checkboxAndRadio":{"checkboxTitle":"คุณสมบัติของ เช็คบ๊อก","radioTitle":"คุณสมบัติของ เรดิโอบัตตอน","value":"ค่าตัวแปร","selected":"เลือกเป็นค่าเริ่มต้น"},"form":{"title":"คุณสมบัติของ แบบฟอร์ม","menu":"คุณสมบัติของ แบบฟอร์ม","action":"แอคชั่น","method":"เมธอด","encoding":"Encoding"},"hidden":{"title":"คุณสมบัติของ ฮิดเดนฟิลด์","name":"ชื่อ","value":"ค่าตัวแปร"},"select":{"title":"คุณสมบัติของ แถบตัวเลือก","selectInfo":"อินโฟ","opAvail":"รายการตัวเลือก","value":"ค่าตัวแปร","size":"ขนาด","lines":"บรรทัด","chkMulti":"เลือกหลายค่าได้","opText":"ข้อความ","opValue":"ค่าตัวแปร","btnAdd":"เพิ่ม","btnModify":"แก้ไข","btnUp":"บน","btnDown":"ล่าง","btnSetValue":"เลือกเป็นค่าเริ่มต้น","btnDelete":"ลบ"},"textarea":{"title":"คุณสมบัติของ เท็กแอเรีย","cols":"สดมภ์","rows":"แถว"},"textfield":{"title":"คุณสมบัติของ เท็กซ์ฟิลด์","name":"ชื่อ","value":"ค่าตัวแปร","charWidth":"ความกว้าง","maxChars":"จำนวนตัวอักษรสูงสุด","type":"ชนิด","typeText":"ข้อความ","typePass":"รหัสผ่าน","typeEmail":"อีเมล","typeSearch":"ค้นหาก","typeTel":"หมายเลขโทรศัพท์","typeUrl":"ที่อยู่อ้างอิง URL"}},"format":{"label":"รูปแบบ","panelTitle":"รูปแบบ","tag_address":"Address","tag_div":"Paragraph (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"แทรกเส้นคั่นบรรทัด"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"กรุณาระบุที่อยู่อ้างอิงออนไลน์ของไฟล์รูปภาพ (URL)","alt":"คำประกอบรูปภาพ","border":"ขนาดขอบรูป","btnUpload":"อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"ระยะแนวนอน","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"ข้อมูลของรูปภาพ","linkTab":"ลิ้งค์","lockRatio":"กำหนดอัตราส่วน กว้าง-สูง แบบคงที่","menu":"คุณสมบัติของ รูปภาพ","resetSize":"กำหนดรูปเท่าขนาดจริง","title":"คุณสมบัติของ รูปภาพ","titleButton":"คุณสมบัติของ ปุ่มแบบรูปภาพ","upload":"อัพโหลดไฟล์","urlMissing":"Image source URL is missing.","vSpace":"ระยะแนวตั้ง","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"เพิ่มระยะย่อหน้า","outdent":"ลดระยะย่อหน้า"},"smiley":{"options":"ตัวเลือกไอคอนแสดงอารมณ์","title":"แทรกสัญลักษณ์สื่ออารมณ์","toolbar":"รูปสื่ออารมณ์"},"justify":{"block":"จัดพอดีหน้ากระดาษ","center":"จัดกึ่งกลาง","left":"จัดชิดซ้าย","right":"จัดชิดขวา"},"link":{"acccessKey":"แอคเซส คีย์","advanced":"ขั้นสูง","advisoryContentType":"ชนิดของคำเกริ่นนำ","advisoryTitle":"คำเกริ่นนำ","anchor":{"toolbar":"แทรก/แก้ไข Anchor","menu":"รายละเอียด Anchor","title":"รายละเอียด Anchor","name":"ชื่อ Anchor","errorName":"กรุณาระบุชื่อของ Anchor","remove":"Remove Anchor"},"anchorId":"ไอดี","anchorName":"ชื่อ","charset":"ลิงค์เชื่อมโยงไปยังชุดตัวอักษร","cssClasses":"คลาสของไฟล์กำหนดลักษณะการแสดงผล","emailAddress":"อีเมล์ (E-Mail)","emailBody":"ข้อความ","emailSubject":"หัวเรื่อง","id":"ไอดี","info":"รายละเอียด","langCode":"การเขียน-อ่านภาษา","langDir":"การเขียน-อ่านภาษา","langDirLTR":"จากซ้ายไปขวา (LTR)","langDirRTL":"จากขวามาซ้าย (RTL)","menu":"แก้ไข ลิงค์","name":"ชื่อ","noAnchors":"(ยังไม่มีจุดเชื่อมโยงภายในหน้าเอกสารนี้)","noEmail":"กรุณาระบุอีเมล์ (E-mail)","noUrl":"กรุณาระบุที่อยู่อ้างอิงออนไลน์ (URL)","other":"<อื่น ๆ>","popupDependent":"แสดงเต็มหน้าจอ (Netscape)","popupFeatures":"คุณสมบัติของหน้าจอเล็ก (Pop-up)","popupFullScreen":"แสดงเต็มหน้าจอ (IE5.5++ เท่านั้น)","popupLeft":"พิกัดซ้าย (Left Position)","popupLocationBar":"แสดงที่อยู่ของไฟล์","popupMenuBar":"แสดงแถบเมนู","popupResizable":"สามารถปรับขนาดได้","popupScrollBars":"แสดงแถบเลื่อน","popupStatusBar":"แสดงแถบสถานะ","popupToolbar":"แสดงแถบเครื่องมือ","popupTop":"พิกัดบน (Top Position)","rel":"ความสัมพันธ์","selectAnchor":"ระบุข้อมูลของจุดเชื่อมโยง (Anchor)","styles":"ลักษณะการแสดงผล","tabIndex":"ลำดับของ แท็บ","target":"การเปิดหน้าลิงค์","targetFrame":"<เปิดในเฟรม>","targetFrameName":"ชื่อทาร์เก็ตเฟรม","targetPopup":"<เปิดหน้าจอเล็ก (Pop-up)>","targetPopupName":"ระบุชื่อหน้าจอเล็ก (Pop-up)","title":"ลิงค์เชื่อมโยงเว็บ อีเมล์ รูปภาพ หรือไฟล์อื่นๆ","toAnchor":"จุดเชื่อมโยง (Anchor)","toEmail":"ส่งอีเมล์ (E-Mail)","toUrl":"ที่อยู่อ้างอิง URL","toolbar":"แทรก/แก้ไข ลิงค์","type":"ประเภทของลิงค์","unlink":"ลบ ลิงค์","upload":"อัพโหลดไฟล์"},"list":{"bulletedlist":"ลำดับรายการแบบสัญลักษณ์","numberedlist":"ลำดับรายการแบบตัวเลข"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"ขยายใหญ่","minimize":"ย่อขนาด"},"newpage":{"toolbar":"สร้างหน้าเอกสารใหม่"},"pagebreak":{"alt":"ตัวแบ่งหน้า","toolbar":"แทรกตัวแบ่งหน้า Page Break"},"pastetext":{"button":"วางแบบตัวอักษรธรรมดา","title":"วางแบบตัวอักษรธรรมดา"},"pastefromword":{"confirmCleanup":"ข้อความที่คุณต้องการวางลงไปเป็นข้อความที่คัดลอกมาจากโปรแกรมไมโครซอฟท์เวิร์ด คุณต้องการล้างค่าข้อความดังกล่าวก่อนวางลงไปหรือไม่?","error":"ไม่สามารถล้างข้อมูลที่ต้องการวางได้เนื่องจากเกิดข้อผิดพลาดภายในระบบ","title":"วางสำเนาจากตัวอักษรเวิร์ด","toolbar":"วางสำเนาจากตัวอักษรเวิร์ด"},"preview":{"preview":"ดูหน้าเอกสารตัวอย่าง"},"print":{"toolbar":"สั่งพิมพ์"},"removeformat":{"toolbar":"ล้างรูปแบบ"},"save":{"toolbar":"บันทึก"},"selectall":{"toolbar":"เลือกทั้งหมด"},"showblocks":{"toolbar":"แสดงบล็อคข้อมูล"},"sourcearea":{"toolbar":"ดูรหัส HTML"},"specialchar":{"options":"Special Character Options","title":"แทรกตัวอักษรพิเศษ","toolbar":"แทรกตัวอักษรพิเศษ"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"ลักษณะ","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"ขนาดเส้นขอบ","caption":"หัวเรื่องของตาราง","cell":{"menu":"ช่องตาราง","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"ลบช่อง","merge":"ผสานช่อง","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"ระยะแนวตั้ง","cellSpace":"ระยะแนวนอนน","column":{"menu":"คอลัมน์","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"ลบสดมน์"},"columns":"สดมน์","deleteTable":"ลบตาราง","headers":"ส่วนหัว","headersBoth":"ทั้งสองอย่าง","headersColumn":"คอลัมน์แรก","headersNone":"None","headersRow":"แถวแรก","invalidBorder":"ขนาดเส้นกรอบต้องเป็นจำนวนตัวเลข","invalidCellPadding":"ช่องว่างภายในเซลล์ต้องเลขจำนวนบวก","invalidCellSpacing":"ช่องว่างภายในเซลล์ต้องเป็นเลขจำนวนบวก","invalidCols":"จำนวนคอลัมน์ต้องเป็นจำนวนมากกว่า 0","invalidHeight":"ส่วนสูงของตารางต้องเป็นตัวเลข","invalidRows":"จำนวนของแถวต้องเป็นจำนวนมากกว่า 0","invalidWidth":"ความกว้างตารางต้องเป็นตัวเลข","menu":"คุณสมบัติของ ตาราง","row":{"menu":"แถว","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"ลบแถว"},"rows":"แถว","summary":"สรุปความ","title":"คุณสมบัติของ ตาราง","toolbar":"ตาราง","widthPc":"เปอร์เซ็น","widthPx":"จุดสี","widthUnit":"หน่วยความกว้าง"},"undo":{"redo":"ทำซ้ำคำสั่ง","undo":"ยกเลิกคำสั่ง"},"wsc":{"btnIgnore":"ยกเว้น","btnIgnoreAll":"ยกเว้นทั้งหมด","btnReplace":"แทนที่","btnReplaceAll":"แทนที่ทั้งหมด","btnUndo":"ยกเลิก","changeTo":"แก้ไขเป็น","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"ไม่ได้ติดตั้งระบบตรวจสอบคำสะกด. ต้องการติดตั้งไหมครับ?","manyChanges":"ตรวจสอบคำสะกดเสร็จสิ้น:: แก้ไข %1 คำ","noChanges":"ตรวจสอบคำสะกดเสร็จสิ้น: ไม่มีการแก้คำใดๆ","noMispell":"ตรวจสอบคำสะกดเสร็จสิ้น: ไม่พบคำสะกดผิด","noSuggestions":"- ไม่มีคำแนะนำใดๆ -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"ไม่พบในดิกชันนารี","oneChange":"ตรวจสอบคำสะกดเสร็จสิ้น: แก้ไข1คำ","progress":"กำลังตรวจสอบคำสะกด...","title":"Spell Check","toolbar":"ตรวจการสะกดคำ"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/tr.js b/htmltest/sites/all/libraries/ckeditor-version/lang/tr.js
new file mode 100644
index 00000000..535649f2
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/tr.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['tr']={"editor":"Zengin Metin Editörü","common":{"editorHelp":"Yardım için ALT 0 tuşuna basın","browseServer":"Sunucuyu Gez","url":"URL","protocol":"Protokol","upload":"Karşıya Yükle","uploadSubmit":"Sunucuya Yolla","image":"Resim","flash":"Flash","form":"Form","checkbox":"Onay Kutusu","radio":"Seçenek Düğmesi","textField":"Metin Girişi","textarea":"Çok Satırlı Metin","hiddenField":"Gizli Veri","button":"Düğme","select":"Seçim Menüsü","imageButton":"Resimli Düğme","notSet":"<tanımlanmamış>","id":"Kimlik","name":"Ad","langDir":"Dil Yönü","langDirLtr":"Soldan Sağa (LTR)","langDirRtl":"Sağdan Sola (RTL)","langCode":"Dil Kodlaması","longDescr":"Uzun Tanımlı URL","cssClass":"Biçem Sayfası Sınıfları","advisoryTitle":"Danışma Başlığı","cssStyle":"Biçem","ok":"Tamam","cancel":"İptal","close":"Kapat","preview":"Ön gösterim","resize":"Boyutlandırmak için sürükle","generalTab":"Genel","advancedTab":"Gelişmiş","validateNumberFailed":"Bu değer sayı değildir.","confirmNewPage":"İceriğiniz kayıt edilmediğinden dolayı kaybolacaktır. Yeni bir sayfa yüklemek istediğinize eminsiniz?","confirmCancel":"Bazı seçenekler değişmiştir. Dialog penceresini kapatmak istediğinize eminmisiniz?","options":"Seçenekler","target":"Hedef","targetNew":"Yeni Pencere (_blank)","targetTop":"Enüst Pencere (_top)","targetSelf":"Aynı Pencere (_self)","targetParent":"Ana Pencere (_parent)","langDirLTR":"Soldan Sağa (LTR)","langDirRTL":"Sağdan Sola (RTL)","styles":"Stil","cssClasses":"Stil sayfası Sınıfı","width":"Genişlik","height":"Yükseklik","align":"Hizalama","alignLeft":"Sol","alignRight":"Sağ","alignCenter":"Merkez","alignTop":"Tepe","alignMiddle":"Orta","alignBottom":"Alt","invalidValue":"Geçersiz değer.","invalidHeight":"Yükseklik sayı olmalıdır.","invalidWidth":"Genişlik bir sayı olmalıdır.","invalidCssLength":"Belirttiğiniz sayı \"%1\" alanı için pozitif bir sayı CSS birim değeri olmalıdır (px, %, in, cm, mm, em, ex, pt, veya pc).","invalidHtmlLength":"Belirttiğiniz sayı \"%1\" alanı için pozitif bir sayı HTML birim değeri olmalıdır (px veya %).","invalidInlineStyle":"Noktalı virgülle ayrılmış: \"değer adı,\" inline stil için belirtilen değer biçiminde bir veya daha fazla dizilerden oluşmalıdır.","cssLengthTooltip":"Pikseller için bir numara girin veya geçerli bir CSS numarası (px, %, in, cm, mm, em, ex, pt, veya pc).","unavailable":"%1<span class=\"cke_accessibility\">, hazır değildir</span>"},"about":{"copy":"Copyright &copy; $1. Tüm hakları saklıdır.","dlgTitle":"CKEditor Hakkında","help":"Yardım için $1 kontrol edin.","moreInfo":"Lisanslama hakkında daha fazla bilgi almak için lütfen sitemizi ziyaret edin:","title":"CKEditor Hakkında","userGuide":"CKEditor Kullanıcı Kılavuzu"},"basicstyles":{"bold":"Kalın","italic":"İtalik","strike":"Üstü Çizgili","subscript":"Alt Simge","superscript":"Üst Simge","underline":"Altı Çizgili"},"bidi":{"ltr":"Metin yönü soldan sağa","rtl":"Metin yönü sağdan sola"},"blockquote":{"toolbar":"Blok Oluştur"},"clipboard":{"copy":"Kopyala","copyError":"Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kopyalama işlemine izin vermiyor. İşlem için (Ctrl/Cmd+C) tuşlarını kullanın.","cut":"Kes","cutError":"Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kesme işlemine izin vermiyor. İşlem için (Ctrl/Cmd+X) tuşlarını kullanın.","paste":"Yapıştır","pasteArea":"Yapıştırma Alanı","pasteMsg":"Lütfen aşağıdaki kutunun içine yapıştırın. (<STRONG>Ctrl/Cmd+V</STRONG>) ve <STRONG>Tamam</STRONG> butonunu tıklayın.","securityMsg":"Gezgin yazılımınızın güvenlik ayarları düzenleyicinin direkt olarak panoya erişimine izin vermiyor. Bu pencere içine tekrar yapıştırmalısınız..","title":"Yapıştır"},"colorbutton":{"auto":"Otomatik","bgColorTitle":"Arka Renk","colors":{"000":"Siyah","800000":"Kestane","8B4513":"Koyu Kahverengi","2F4F4F":"Koyu Kurşuni Gri","008080":"Teal","000080":"Mavi","4B0082":"Çivit Mavisi","696969":"Silik Gri","B22222":"Ateş Tuğlası","A52A2A":"Kahverengi","DAA520":"Altun Sırık","006400":"Koyu Yeşil","40E0D0":"Turkuaz","0000CD":"Orta Mavi","800080":"Pembe","808080":"Gri","F00":"Kırmızı","FF8C00":"Koyu Portakal","FFD700":"Altın","008000":"Yeşil","0FF":"Ciyan","00F":"Mavi","EE82EE":"Menekşe","A9A9A9":"Koyu Gri","FFA07A":"Açık Sarımsı","FFA500":"Portakal","FFFF00":"Sarı","00FF00":"Açık Yeşil","AFEEEE":"Sönük Turkuaz","ADD8E6":"Açık Mavi","DDA0DD":"Mor","D3D3D3":"Açık Gri","FFF0F5":"Eflatun Pembe","FAEBD7":"Antik Beyaz","FFFFE0":"Açık Sarı","F0FFF0":"Balsarısı","F0FFFF":"Gök Mavisi","F0F8FF":"Reha Mavi","E6E6FA":"Eflatun","FFF":"Beyaz"},"more":"Diğer renkler...","panelTitle":"Renkler","textColorTitle":"Yazı Rengi"},"colordialog":{"clear":"Temizle","highlight":"İşaretle","options":"Renk Seçenekleri","selected":"Seçilmiş","title":"Renk seç"},"templates":{"button":"Şablonlar","emptyListMsg":"(Belirli bir şablon seçilmedi)","insertOption":"Mevcut içerik ile değiştir","options":"Şablon Seçenekleri","selectPromptMsg":"Düzenleyicide açmak için lütfen bir şablon seçin.<br>(hali hazırdaki içerik kaybolacaktır.):","title":"İçerik Şablonları"},"contextmenu":{"options":"İçerik Menüsü Seçenekleri"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Tavsiye Başlığı","cssClassInputLabel":"Stilltipi Sınıfı","edit":"Div Düzenle","inlineStyleInputLabel":"Inline Stili","langDirLTRLabel":"Soldan sağa (LTR)","langDirLabel":"Dil Yönü","langDirRTLLabel":"Sağdan sola (RTL)","languageCodeInputLabel":" Dil Kodu","remove":"Div Kaldır","styleSelectLabel":"Stil","title":"Div İçeriği Oluştur","toolbar":"Div İçeriği Oluştur"},"toolbar":{"toolbarCollapse":"Araç çubuklarını topla","toolbarExpand":"Araç çubuklarını aç","toolbarGroups":{"document":"Belge","clipboard":"Pano/Geri al","editing":"Düzenleme","forms":"Formlar","basicstyles":"Temel Stiller","paragraph":"Paragraf","links":"Bağlantılar","insert":"Ekle","styles":"Stiller","colors":"Renkler","tools":"Araçlar"},"toolbars":"Araç çubukları Editörü"},"elementspath":{"eleLabel":"Elementlerin yolu","eleTitle":"%1 elementi"},"find":{"find":"Bul","findOptions":"Seçenekleri Bul","findWhat":"Aranan:","matchCase":"Büyük/küçük harf duyarlı","matchCyclic":"Eşleşen döngü","matchWord":"Kelimenin tamamı uysun","notFoundMsg":"Belirtilen yazı bulunamadı.","replace":"Değiştir","replaceAll":"Tümünü Değiştir","replaceSuccessMsg":"%1 bulunanlardan değiştirildi.","replaceWith":"Bununla değiştir:","title":"Bul ve Değiştir"},"fakeobjects":{"anchor":"Bağlantı","flash":"Flash Animasyonu","hiddenfield":"Gizli Alan","iframe":"IFrame","unknown":"Bilinmeyen Nesne"},"flash":{"access":"Kod İzni","accessAlways":"Herzaman","accessNever":"Asla","accessSameDomain":"Aynı domain","alignAbsBottom":"Tam Altı","alignAbsMiddle":"Tam Ortası","alignBaseline":"Taban Çizgisi","alignTextTop":"Yazı Tepeye","bgcolor":"Arka Renk","chkFull":"Tam ekrana İzinver","chkLoop":"Döngü","chkMenu":"Flash Menüsünü Kullan","chkPlay":"Otomatik Oynat","flashvars":"Flash Değerleri","hSpace":"Yatay Boşluk","properties":"Flash Özellikleri","propertiesTab":"Özellikler","quality":"Kalite","qualityAutoHigh":"Otomatik Yükseklik","qualityAutoLow":"Otomatik Düşüklük","qualityBest":"En iyi","qualityHigh":"Yüksek","qualityLow":"Düşük","qualityMedium":"Orta","scale":"Boyutlandır","scaleAll":"Hepsini Göster","scaleFit":"Tam Sığdır","scaleNoBorder":"Kenar Yok","title":"Flash Özellikleri","vSpace":"Dikey Boşluk","validateHSpace":"HSpace sayı olmalıdır.","validateSrc":"Lütfen köprü URL'sini yazın","validateVSpace":"VSpace sayı olmalıdır.","windowMode":"Pencere modu","windowModeOpaque":"Opak","windowModeTransparent":"Şeffaf","windowModeWindow":"Pencere"},"font":{"fontSize":{"label":"Boyut","voiceLabel":"Font Size","panelTitle":"Boyut"},"label":"Yazı Türü","panelTitle":"Yazı Türü","voiceLabel":"Font"},"forms":{"button":{"title":"Düğme Özellikleri","text":"Metin (Değer)","type":"Tip","typeBtn":"Düğme","typeSbm":"Gönder","typeRst":"Sıfırla"},"checkboxAndRadio":{"checkboxTitle":"Onay Kutusu Özellikleri","radioTitle":"Seçenek Düğmesi Özellikleri","value":"Değer","selected":"Seçili"},"form":{"title":"Form Özellikleri","menu":"Form Özellikleri","action":"İşlem","method":"Yöntem","encoding":"Kodlama"},"hidden":{"title":"Gizli Veri Özellikleri","name":"Ad","value":"Değer"},"select":{"title":"Seçim Menüsü Özellikleri","selectInfo":"Bilgi","opAvail":"Mevcut Seçenekler","value":"Değer","size":"Boyut","lines":"satır","chkMulti":"Çoklu seçime izin ver","opText":"Metin","opValue":"Değer","btnAdd":"Ekle","btnModify":"Düzenle","btnUp":"Yukarı","btnDown":"Aşağı","btnSetValue":"Seçili değer olarak ata","btnDelete":"Sil"},"textarea":{"title":"Çok Satırlı Metin Özellikleri","cols":"Sütunlar","rows":"Satırlar"},"textfield":{"title":"Metin Girişi Özellikleri","name":"Ad","value":"Değer","charWidth":"Karakter Genişliği","maxChars":"En Fazla Karakter","type":"Tür","typeText":"Metin","typePass":"Şifre","typeEmail":"E-posta","typeSearch":"Ara","typeTel":"Telefon Numarası","typeUrl":"URL"}},"format":{"label":"Biçim","panelTitle":"Biçim","tag_address":"Adres","tag_div":"Paragraf (DIV)","tag_h1":"Başlık 1","tag_h2":"Başlık 2","tag_h3":"Başlık 3","tag_h4":"Başlık 4","tag_h5":"Başlık 5","tag_h6":"Başlık 6","tag_p":"Normal","tag_pre":"Biçimli"},"horizontalrule":{"toolbar":"Yatay Satır Ekle"},"iframe":{"border":"Çerceve sınırlarını göster","noUrl":"Lütfen IFrame köprü (URL) bağlantısını yazın","scrolling":"Kaydırma çubuklarını aktif et","title":"IFrame Özellikleri","toolbar":"IFrame"},"image":{"alertUrl":"Lütfen resmin URL'sini yazınız","alt":"Alternatif Yazı","border":"Kenar","btnUpload":"Sunucuya Yolla","button2Img":"Seçili resim butonunu basit resime çevirmek istermisiniz?","hSpace":"Yatay Boşluk","img2Button":"Seçili olan resimi, resimli butona çevirmek istermisiniz?","infoTab":"Resim Bilgisi","linkTab":"Köprü","lockRatio":"Oranı Kilitle","menu":"Resim Özellikleri","resetSize":"Boyutu Başa Döndür","title":"Resim Özellikleri","titleButton":"Resimli Düğme Özellikleri","upload":"Karşıya Yükle","urlMissing":"Resmin URL kaynağı eksiktir.","vSpace":"Dikey Boşluk","validateBorder":"Çerçeve tam sayı olmalıdır.","validateHSpace":"HSpace tam sayı olmalıdır.","validateVSpace":"VSpace tam sayı olmalıdır."},"indent":{"indent":"Sekme Arttır","outdent":"Sekme Azalt"},"smiley":{"options":"İfade Seçenekleri","title":"İfade Ekle","toolbar":"İfade"},"justify":{"block":"İki Kenara Yaslanmış","center":"Ortalanmış","left":"Sola Dayalı","right":"Sağa Dayalı"},"link":{"acccessKey":"Erişim Tuşu","advanced":"Gelişmiş","advisoryContentType":"Danışma İçerik Türü","advisoryTitle":"Danışma Başlığı","anchor":{"toolbar":"Bağlantı Ekle/Düzenle","menu":"Bağlantı Özellikleri","title":"Bağlantı Özellikleri","name":"Bağlantı Adı","errorName":"Lütfen bağlantı için ad giriniz","remove":"Bağlantıyı Kaldır"},"anchorId":"Eleman Kimlik Numarası ile","anchorName":"Bağlantı Adı ile","charset":"Bağlı Kaynak Karakter Gurubu","cssClasses":"Biçem Sayfası Sınıfları","emailAddress":"E-Posta Adresi","emailBody":"İleti Gövdesi","emailSubject":"İleti Konusu","id":"Id","info":"Link Bilgisi","langCode":"Dil Yönü","langDir":"Dil Yönü","langDirLTR":"Soldan Sağa (LTR)","langDirRTL":"Sağdan Sola (RTL)","menu":"Link Düzenle","name":"Ad","noAnchors":"(Bu belgede hiç çapa yok)","noEmail":"Lütfen E-posta adresini yazın","noUrl":"Lütfen Link URL'sini yazın","other":"<diğer>","popupDependent":"Bağımlı (Netscape)","popupFeatures":"Yeni Açılan Pencere Özellikleri","popupFullScreen":"Tam Ekran (IE)","popupLeft":"Sola Göre Konum","popupLocationBar":"Yer Çubuğu","popupMenuBar":"Menü Çubuğu","popupResizable":"Resizable","popupScrollBars":"Kaydırma Çubukları","popupStatusBar":"Durum Çubuğu","popupToolbar":"Araç Çubuğu","popupTop":"Yukarıya Göre Konum","rel":"İlişki","selectAnchor":"Bağlantı Seç","styles":"Biçem","tabIndex":"Sekme İndeksi","target":"Hedef","targetFrame":"<çerçeve>","targetFrameName":"Hedef Çerçeve Adı","targetPopup":"<yeni açılan pencere>","targetPopupName":"Yeni Açılan Pencere Adı","title":"Link","toAnchor":"Bu sayfada çapa","toEmail":"E-Posta","toUrl":"URL","toolbar":"Link Ekle/Düzenle","type":"Link Türü","unlink":"Köprü Kaldır","upload":"Karşıya Yükle"},"list":{"bulletedlist":"Simgeli Liste","numberedlist":"Numaralı Liste"},"liststyle":{"armenian":"Ermenice sayılandırma","bulletedTitle":"Simgeli Liste Özellikleri","circle":"Daire","decimal":"Ondalık (1, 2, 3, vs.)","decimalLeadingZero":"Başı sıfırlı ondalık (01, 02, 03, vs.)","disc":"Disk","georgian":"Gürcüce numaralandırma (an, ban, gan, vs.)","lowerAlpha":"Küçük Alpha (a, b, c, d, e, vs.)","lowerGreek":"Küçük Greek (alpha, beta, gamma, vs.)","lowerRoman":"Küçük Roman (i, ii, iii, iv, v, vs.)","none":"Yok","notset":"<ayarlanmamış>","numberedTitle":"Sayılandırılmış Liste Özellikleri","square":"Kare","start":"Başla","type":"Tipi","upperAlpha":"Büyük Alpha (A, B, C, D, E, vs.)","upperRoman":"Büyük Roman (I, II, III, IV, V, vs.)","validateStartNumber":"Liste başlangıcı tam sayı olmalıdır."},"magicline":{"title":"Parağrafı buraya ekle"},"maximize":{"maximize":"Büyült","minimize":"Küçült"},"newpage":{"toolbar":"Yeni Sayfa"},"pagebreak":{"alt":"Sayfa Sonu","toolbar":"Sayfa Sonu Ekle"},"pastetext":{"button":"Düz Metin Olarak Yapıştır","title":"Düz Metin Olarak Yapıştır"},"pastefromword":{"confirmCleanup":"Yapıştırmaya çalıştığınız metin Word'den kopyalanmıştır. Yapıştırmadan önce silmek istermisiniz?","error":"Yapıştırmadaki veri bilgisi hata düzelene kadar silinmeyecektir","title":"Word'den Yapıştır","toolbar":"Word'den Yapıştır"},"preview":{"preview":"Ön İzleme"},"print":{"toolbar":"Yazdır"},"removeformat":{"toolbar":"Biçimi Kaldır"},"save":{"toolbar":"Kaydet"},"selectall":{"toolbar":"Tümünü Seç"},"showblocks":{"toolbar":"Blokları Göster"},"sourcearea":{"toolbar":"Kaynak"},"specialchar":{"options":"Özel Karakter Seçenekleri","title":"Özel Karakter Seç","toolbar":"Özel Karakter Ekle"},"scayt":{"about":"SCAYT'ı hakkında","aboutTab":"Hakkında","addWord":"Kelime Ekle","allCaps":"Tüm büyük küçük kelimeleri yoksay","dic_create":"Oluştur","dic_delete":"Sil","dic_field_name":"Sözlük adı","dic_info":"Başlangıçta Kullanıcı Sözlüğü bir çerezde saklanır. Ancak, Çerezler boyutu sınırlıdır. Kullanıcı Sözlüğü, çerezin içinde saklanamayacağı bir noktada, bizim sunucularımızın içindeki sözlükte saklanabilir. Bizim sunucu üzerinde kişisel Sözlük saklamanız için, Sözlüğe bir ad belirtmelisiniz. Eğer zaten bir saklı Sözlük varsa, lütfen adını yazın ve Geri Yükle düğmesini tıklayın.","dic_rename":"Yeniden adlandır","dic_restore":"Geri al","dictionariesTab":"Sözlükler","disable":"SCAYT'ı pasifleştir","emptyDic":"Sözlük adı boş olamaz.","enable":"SCAYT'ı etkinleştir","ignore":"Yoksay","ignoreAll":"Tümünü Yoksay","ignoreDomainNames":"Domain adlarını yoksay","langs":"Diller","languagesTab":"Diller","mixedCase":"Karışık büyüklük ile Sözcükler yoksay","mixedWithDigits":"Sayılarla Kelimeler yoksay","moreSuggestions":"Daha fazla öneri","opera_title":"Opera tarafından desteklenmemektedir","options":"Seçenekler","optionsTab":"Seçenekler","title":"Girmiş olduğunuz kelime denetimi","toggle":"SCAYT'ı değiştir","noSuggestions":"No suggestion"},"stylescombo":{"label":"Biçem","panelTitle":"Stilleri Düzenliyor","panelTitle1":"Blok Stilleri","panelTitle2":"Inline Stilleri","panelTitle3":"Nesne Stilleri"},"table":{"border":"Kenar Kalınlığı","caption":"Başlık","cell":{"menu":"Hücre","insertBefore":"Hücre Ekle - Önce","insertAfter":"Hücre Ekle - Sonra","deleteCell":"Hücre Sil","merge":"Hücreleri Birleştir","mergeRight":"Birleştir - Sağdaki İle ","mergeDown":"Birleştir - Aşağıdaki İle ","splitHorizontal":"Hücreyi Yatay Böl","splitVertical":"Hücreyi Dikey Böl","title":"Hücre Özellikleri","cellType":"Hücre Tipi","rowSpan":"Satırlar Mesafesi (Span)","colSpan":"Sütünlar Mesafesi (Span)","wordWrap":"Kelime Kaydırma","hAlign":"Düşey Hizalama","vAlign":"Yataş Hizalama","alignBaseline":"Tabana","bgColor":"Arkaplan Rengi","borderColor":"Çerçeve Rengi","data":"Veri","header":"Başlık","yes":"Evet","no":"Hayır","invalidWidth":"Hücre genişliği sayı olmalıdır.","invalidHeight":"Hücre yüksekliği sayı olmalıdır.","invalidRowSpan":"Satırların mesafesi tam sayı olmalıdır.","invalidColSpan":"Sütünların mesafesi tam sayı olmalıdır.","chooseColor":"Seçiniz"},"cellPad":"Izgara yazı arası","cellSpace":"Izgara kalınlığı","column":{"menu":"Sütun","insertBefore":"Kolon Ekle - Önce","insertAfter":"Kolon Ekle - Sonra","deleteColumn":"Sütun Sil"},"columns":"Sütunlar","deleteTable":"Tabloyu Sil","headers":"Başlıklar","headersBoth":"Her İkisi","headersColumn":"İlk Sütun","headersNone":"Yok","headersRow":"İlk Satır","invalidBorder":"Çerceve büyüklüklüğü sayı olmalıdır.","invalidCellPadding":"Hücre aralığı (padding) sayı olmalıdır.","invalidCellSpacing":"Hücre boşluğu (spacing) sayı olmalıdır.","invalidCols":"Sütün sayısı 0 sayısından büyük olmalıdır.","invalidHeight":"Tablo yüksekliği sayı olmalıdır.","invalidRows":"Satır sayısı 0 sayısından büyük olmalıdır.","invalidWidth":"Tablo genişliği sayı olmalıdır.","menu":"Tablo Özellikleri","row":{"menu":"Satır","insertBefore":"Satır Ekle - Önce","insertAfter":"Satır Ekle - Sonra","deleteRow":"Satır Sil"},"rows":"Satırlar","summary":"Özet","title":"Tablo Özellikleri","toolbar":"Tablo","widthPc":"yüzde","widthPx":"piksel","widthUnit":"genişlik birimi"},"undo":{"redo":"Tekrarla","undo":"Geri Al"},"wsc":{"btnIgnore":"Yoksay","btnIgnoreAll":"Tümünü Yoksay","btnReplace":"Değiştir","btnReplaceAll":"Tümünü Değiştir","btnUndo":"Geri Al","changeTo":"Şuna değiştir:","errorLoading":"Uygulamada yüklerken hata oluştu: %s.","ieSpellDownload":"Yazım denetimi yüklenmemiş. Şimdi yüklemek ister misiniz?","manyChanges":"Yazım denetimi tamamlandı: %1 kelime değiştirildi","noChanges":"Yazım denetimi tamamlandı: Hiçbir kelime değiştirilmedi","noMispell":"Yazım denetimi tamamlandı: Yanlış yazıma rastlanmadı","noSuggestions":"- Öneri Yok -","notAvailable":"Üzügünüz, bu servis şuanda hizmet dışıdır.","notInDic":"Sözlükte Yok","oneChange":"Yazım denetimi tamamlandı: Bir kelime değiştirildi","progress":"Yazım denetimi işlemde...","title":"Yazımı Denetle","toolbar":"Yazım Denetimi"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/ug.js b/htmltest/sites/all/libraries/ckeditor-version/lang/ug.js
new file mode 100644
index 00000000..2e98e727
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/ug.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ug']={"editor":"تەھرىرلىگۈچ","common":{"editorHelp":"ALT+0 نى بېسىپ ياردەمنى كۆرۈڭ","browseServer":"كۆرسىتىش مۇلازىمېتىر","url":"ئەسلى ھۆججەت","protocol":"كېلىشىم","upload":"يۈكلە","uploadSubmit":"مۇلازىمېتىرغا يۈكلە","image":"سۈرەت","flash":"Flash","form":"جەدۋەل","checkbox":"كۆپ تاللاش رامكىسى","radio":"يەككە تاللاش توپچىسى","textField":"يەككە قۇر تېكىست","textarea":"كۆپ قۇر تېكىست","hiddenField":"يوشۇرۇن دائىرە","button":"توپچا","select":"تىزىم/تىزىملىك","imageButton":"سۈرەت دائىرە","notSet":"‹تەڭشەلمىگەن›","id":"ID","name":"ئات","langDir":"تىل يۆنىلىشى","langDirLtr":"سولدىن ئوڭغا (LTR)","langDirRtl":"ئوڭدىن سولغا (RTL)","langCode":"تىل كودى","longDescr":"تەپسىلىي چۈشەندۈرۈش ئادرېسى","cssClass":"ئۇسلۇب خىلىنىڭ ئاتى","advisoryTitle":"ماۋزۇ","cssStyle":"قۇر ئىچىدىكى ئۇسلۇبى","ok":"جەزملە","cancel":"ۋاز كەچ","close":"تاقا","preview":"ئالدىن كۆزەت","resize":"چوڭلۇقىنى ئۆزگەرت","generalTab":"ئادەتتىكى","advancedTab":"ئالىي","validateNumberFailed":"سان پىچىمىدا كىرگۈزۈش زۆرۈر","confirmNewPage":"نۆۋەتتىكى پۈتۈك مەزمۇنى ساقلانمىدى، يېڭى پۈتۈك قۇرامسىز؟","confirmCancel":"قىسمەن ئۆزگەرتىش ساقلانمىدى، بۇ سۆزلەشكۈنى تاقامسىز؟","options":"تاللانما","target":"نىشان كۆزنەك","targetNew":"يېڭى كۆزنەك (_blank)","targetTop":"پۈتۈن بەت (_top)","targetSelf":"مەزكۇر كۆزنەك (_self)","targetParent":"ئاتا كۆزنەك (_parent)","langDirLTR":"سولدىن ئوڭغا (LTR)","langDirRTL":"ئوڭدىن سولغا (RTL)","styles":"ئۇسلۇبلار","cssClasses":"ئۇسلۇب خىللىرى","width":"كەڭلىك","height":"ئېگىزلىك","align":"توغرىلىنىشى","alignLeft":"سول","alignRight":"ئوڭ","alignCenter":"ئوتتۇرا","alignTop":"ئۈستى","alignMiddle":"ئوتتۇرا","alignBottom":"ئاستى","invalidValue":"ئىناۋەتسىز قىممەت.","invalidHeight":"ئېگىزلىك چوقۇم رەقەم پىچىمىدا بولۇشى زۆرۈر","invalidWidth":"كەڭلىك چوقۇم رەقەم پىچىمىدا بولۇشى زۆرۈر","invalidCssLength":"بۇ سۆز بۆلىكى چوقۇم مۇۋاپىق بولغان CSS ئۇزۇنلۇق قىممىتى بولۇشى زۆرۈر، بىرلىكى (px, %, in, cm, mm, em, ex, pt ياكى pc)","invalidHtmlLength":"بۇ سۆز بۆلىكى چوقۇم بىرىكمە HTML ئۇزۇنلۇق قىممىتى بولۇشى كېرەك. ئۆز ئىچىگە ئالىدىغان بىرلىك (px ياكى %)","invalidInlineStyle":"ئىچكى باغلانما ئۇسلۇبى چوقۇم چېكىتلىك پەش بىلەن ئايرىلغان بىر ياكى كۆپ «خاسلىق ئاتى:خاسلىق قىممىتى» پىچىمىدا بولۇشى لازىم","cssLengthTooltip":"بۇ سۆز بۆلىكى بىرىكمە CSS ئۇزۇنلۇق قىممىتى بولۇشى كېرەك. ئۆز ئىچىگە ئالىدىغان بىرلىك (px, %, in, cm, mm, em, ex, pt ياكى pc)","unavailable":"%1<span class=\\\\\"cke_accessibility\\\\\">، ئىشلەتكىلى بولمايدۇ</span>"},"about":{"copy":"Copyright &copy; $1. نەشر ھوقۇقىغا ئىگە","dlgTitle":"CKEditor ھەققىدە","help":"$1 نى زىيارەت قىلىپ ياردەمگە ئېرىشىڭ","moreInfo":"تور تۇرايىمىزنى زىيارەت قىلىپ كېلىشىمگە ئائىت تېخىمۇ كۆپ ئۇچۇرغا ئېرىشىڭ","title":"CKEditor ھەققىدە","userGuide":"CKEditor ئىشلەتكۈچى قوللانمىسى"},"basicstyles":{"bold":"توم","italic":"يانتۇ","strike":"ئۆچۈرۈش سىزىقى","subscript":"تۆۋەن ئىندېكس","superscript":"يۇقىرى ئىندېكس","underline":"ئاستى سىزىق"},"bidi":{"ltr":"تېكىست يۆنىلىشى سولدىن ئوڭغا","rtl":"تېكىست يۆنىلىشى ئوڭدىن سولغا"},"blockquote":{"toolbar":"بۆلەك نەقىل"},"clipboard":{"copy":"نەشر ھوقۇقىغا ئىگە بەلگىسى","copyError":"تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كۆچۈر مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+C) ئارقىلىق تاماملاڭ","cut":"كەس","cutError":"تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كەس مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+X) ئارقىلىق تاماملاڭ","paste":"چاپلا","pasteArea":"چاپلاش دائىرىسى","pasteMsg":"ھەرپتاختا تېز كۇنۇپكا (<STRONG>Ctrl/Cmd+V</STRONG>) نى ئىشلىتىپ مەزمۇننى تۆۋەندىكى رامكىغا كۆچۈرۈڭ، ئاندىن <STRONG>جەزملە</STRONG>نى بېسىڭ","securityMsg":"توركۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى سەۋەبىدىن بۇ تەھرىرلىگۈچ چاپلاش تاختىسىدىكى مەزمۇننى بىۋاستە زىيارەت قىلالمايدۇ، بۇ كۆزنەكتە قايتا بىر قېتىم چاپلىشىڭىز كېرەك.","title":"چاپلا"},"colorbutton":{"auto":"ئۆزلۈكىدىن","bgColorTitle":"تەگلىك رەڭگى","colors":{"000":"قارا","800000":"قىزغۇچ سېرىق","8B4513":"توق قوڭۇر","2F4F4F":"قارامتۇل يېشىل","008080":"كۆكۈش يېشىل","000080":"قارامتۇل كۆك","4B0082":"كۆكۈش كۈلرەڭ","696969":"قارامتۇل كۈلرەڭ","B22222":"خىش قىزىل","A52A2A":"قوڭۇر","DAA520":"ئالتۇن سېرىق","006400":"توق يېشىل","40E0D0":"كۆكۈچ يېشىل","0000CD":"ئوتتۇراھال كۆك","800080":"بىنەپشە","808080":"كۈلرەڭ","F00":"قىزىل","FF8C00":"توق قىزغۇچ سېرىق","FFD700":"ئالتۇن","008000":"يېشىل","0FF":"يېشىل كۆك","00F":"كۆك","EE82EE":"قىزغۇچ بىنەپشە","A9A9A9":"توق كۈلرەڭ","FFA07A":"كاۋا چېچىكى سېرىق","FFA500":"قىزغۇچ سېرىق","FFFF00":"سېرىق","00FF00":"Lime","AFEEEE":"سۇس ھاۋا رەڭ","ADD8E6":"ئوچۇق كۆك","DDA0DD":"قىزغۇچ بىنەپشە","D3D3D3":"سۇس كۆكۈچ كۈلرەڭ","FFF0F5":"سۇس قىزغۇچ بىنەپشە","FAEBD7":"Antique White","FFFFE0":"سۇس سېرىق","F0FFF0":"Honeydew","F0FFFF":"ئاسمان كۆكى","F0F8FF":"سۇس كۆك","E6E6FA":"سۇس بىنەپشە","FFF":"ئاق"},"more":"باشقا رەڭ","panelTitle":"رەڭ","textColorTitle":"تېكىست رەڭگى"},"colordialog":{"clear":"تازىلا","highlight":"يورۇت","options":"رەڭ تاللانمىسى","selected":"رەڭ تاللاڭ","title":"رەڭ تاللاڭ"},"templates":{"button":"قېلىپ","emptyListMsg":"(قېلىپ يوق)","insertOption":"نۆۋەتتىكى مەزمۇننى ئالماشتۇر","options":"قېلىپ تاللانمىسى","selectPromptMsg":"تەھرىرلىگۈچنىڭ مەزمۇن قېلىپىنى تاللاڭ:","title":"مەزمۇن قېلىپى"},"contextmenu":{"options":"قىسقا يول تىزىملىك تاللانمىسى"},"div":{"IdInputLabel":"ID","advisoryTitleInputLabel":"ماۋزۇ","cssClassInputLabel":"ئۇسلۇب تىپىنىڭ ئاتى","edit":"DIV تەھرىر","inlineStyleInputLabel":"قۇر ئىچىدىكى ئۇسلۇبى","langDirLTRLabel":"سولدىن ئوڭغا (LTR)","langDirLabel":"تىل يۆنىلىشى","langDirRTLLabel":"ئوڭدىن سولغا (RTL)","languageCodeInputLabel":"تىل كودى","remove":"DIV چىقىرىۋەت","styleSelectLabel":"ئۇسلۇب","title":"DIV قاچا قۇر","toolbar":"DIV قاچا قۇر"},"toolbar":{"toolbarCollapse":"قورال بالداقنى قاتلا","toolbarExpand":"قورال بالداقنى ياي","toolbarGroups":{"document":"پۈتۈك","clipboard":"چاپلاش تاختىسى/يېنىۋال","editing":"تەھرىر","forms":"جەدۋەل","basicstyles":"ئاساسىي ئۇسلۇب","paragraph":"ئابزاس","links":"ئۇلانما","insert":"قىستۇر","styles":"ئۇسلۇب","colors":"رەڭ","tools":"قورال"},"toolbars":"قورال بالداق"},"elementspath":{"eleLabel":"ئېلېمېنت يولى","eleTitle":"%1 ئېلېمېنت"},"find":{"find":"ئىزدە","findOptions":"ئىزدەش تاللانمىسى","findWhat":"ئىزدە:","matchCase":"چوڭ كىچىك ھەرپنى پەرقلەندۈر","matchCyclic":"ئايلانما ماسلىشىش","matchWord":"پۈتۈن سۆز ماسلىشىش","notFoundMsg":"بەلگىلەنگەن تېكىستنى تاپالمىدى","replace":"ئالماشتۇر","replaceAll":"ھەممىنى ئالماشتۇر","replaceSuccessMsg":"جەمئى %1 جايدىكى ئالماشتۇرۇش تاماملاندى","replaceWith":"ئالماشتۇر:","title":"ئىزدەپ ئالماشتۇر"},"fakeobjects":{"anchor":"لەڭگەرلىك نۇقتا","flash":"Flash جانلاندۇرۇم","hiddenfield":"يوشۇرۇن دائىرە","iframe":"IFrame","unknown":"يوچۇن نەڭ"},"flash":{"access":"قوليازما زىيارەتكە يول قوي","accessAlways":"ھەمىشە","accessNever":"ھەرگىز","accessSameDomain":"ئوخشاش دائىرىدە","alignAbsBottom":"مۇتلەق ئاستى","alignAbsMiddle":"مۇتلەق ئوتتۇرا","alignBaseline":"ئاساسىي سىزىق","alignTextTop":"تېكىست ئۈستىدە","bgcolor":"تەگلىك رەڭگى","chkFull":"پۈتۈن ئېكراننى قوزغات","chkLoop":"دەۋرىي","chkMenu":"Flash تىزىملىكنى قوزغات","chkPlay":"ئۆزلۈكىدىن چال","flashvars":"Flash  ئۆزگەرگۈچى","hSpace":"توغرىسىغا ئارىلىق","properties":"Flash خاسلىق","propertiesTab":"خاسلىق","quality":"سۈپەت","qualityAutoHigh":"يۇقىرى (ئاپتوماتىك)","qualityAutoLow":"تۆۋەن (ئاپتوماتىك)","qualityBest":"ئەڭ ياخشى","qualityHigh":"يۇقىرى","qualityLow":"تۆۋەن","qualityMedium":"ئوتتۇرا (ئاپتوماتىك)","scale":"نىسبىتى","scaleAll":"ھەممىنى كۆرسەت","scaleFit":"قەتئىي ماسلىشىش","scaleNoBorder":"گىرۋەك يوق","title":"ماۋزۇ","vSpace":"بويىغا ئارىلىق","validateHSpace":"توغرىسىغا ئارىلىق چوقۇم سان بولىدۇ","validateSrc":"ئەسلى ھۆججەت ئادرېسىنى كىرگۈزۈڭ","validateVSpace":"بويىغا ئارىلىق چوقۇم سان بولىدۇ","windowMode":"كۆزنەك ھالىتى","windowModeOpaque":"خىرە","windowModeTransparent":"سۈزۈك","windowModeWindow":"كۆزنەك گەۋدىسى"},"font":{"fontSize":{"label":"چوڭلۇقى","voiceLabel":"خەت چوڭلۇقى","panelTitle":"چوڭلۇقى"},"label":"خەت نۇسخا","panelTitle":"خەت نۇسخا","voiceLabel":"خەت نۇسخا"},"forms":{"button":{"title":"توپچا خاسلىقى","text":"بەلگە (قىممەت)","type":"تىپى","typeBtn":"توپچا","typeSbm":"تاپشۇر","typeRst":"ئەسلىگە قايتۇر"},"checkboxAndRadio":{"checkboxTitle":"كۆپ تاللاش خاسلىقى","radioTitle":"تاق تاللاش توپچا خاسلىقى","value":"تاللىغان قىممەت","selected":"تاللانغان"},"form":{"title":"جەدۋەل خاسلىقى","menu":"جەدۋەل خاسلىقى","action":"مەشغۇلات","method":"ئۇسۇل","encoding":"جەدۋەل كودلىنىشى"},"hidden":{"title":"يوشۇرۇن دائىرە خاسلىقى","name":"ئات","value":"دەسلەپكى قىممىتى"},"select":{"title":"جەدۋەل/تىزىم خاسلىقى","selectInfo":"ئۇچۇر تاللاڭ","opAvail":"تاللاش تۈرلىرى","value":"قىممەت","size":"ئېگىزلىكى","lines":"قۇر","chkMulti":"كۆپ تاللاشچان","opText":"تاللانما تېكىستى","opValue":"تاللانما قىممىتى","btnAdd":"قوش","btnModify":"ئۆزگەرت","btnUp":"ئۈستىگە","btnDown":"ئاستىغا","btnSetValue":"دەسلەپكى تاللانما قىممىتىگە تەڭشە","btnDelete":"ئۆچۈر"},"textarea":{"title":" كۆپ قۇرلۇق تېكىست خاسلىقى","cols":"ھەرپ كەڭلىكى","rows":"قۇر سانى"},"textfield":{"title":"تاق قۇرلۇق تېكىست خاسلىقى","name":"ئات","value":"دەسلەپكى قىممىتى","charWidth":"ھەرپ كەڭلىكى","maxChars":"ئەڭ كۆپ ھەرپ سانى","type":"تىپى","typeText":"تېكىست","typePass":"ئىم","typeEmail":"تورخەت","typeSearch":"ئىزدە","typeTel":"تېلېفون نومۇر","typeUrl":"ئادرېس"}},"format":{"label":"پىچىم","panelTitle":"پىچىم","tag_address":"ئادرېس","tag_div":"ئابزاس (DIV)","tag_h1":"ماۋزۇ 1","tag_h2":"ماۋزۇ 2","tag_h3":"ماۋزۇ 3","tag_h4":"ماۋزۇ 4","tag_h5":"ماۋزۇ 5","tag_h6":"ماۋزۇ 6","tag_p":"ئادەتتىكى","tag_pre":"تىزىلغان پىچىم"},"horizontalrule":{"toolbar":"توغرا سىزىق قىستۇر"},"iframe":{"border":"كاندۇك گىرۋەكلىرىنى كۆرسەت","noUrl":"كاندۇكنىڭ ئادرېسى(Url)نى كىرگۈزۈڭ","scrolling":"دومىلىما سۈرگۈچكە يول قوي","title":"IFrame خاسلىق","toolbar":"IFrame "},"image":{"alertUrl":"سۈرەت ئادرېسىنى كىرگۈزۈڭ","alt":"تېكىست ئالماشتۇر","border":"گىرۋەك چوڭلۇقى","btnUpload":"مۇلازىمېتىرغا يۈكلە","button2Img":"نۆۋەتتىكى توپچىنى سۈرەتكە ئۆزگەرتەمسىز؟","hSpace":"توغرىسىغا ئارىلىقى","img2Button":"نۆۋەتتىكى سۈرەتنى توپچىغا ئۆزگەرتەمسىز؟","infoTab":"سۈرەت","linkTab":"ئۇلانما","lockRatio":"نىسبەتنى قۇلۇپلا","menu":"سۈرەت خاسلىقى","resetSize":"ئەسلى چوڭلۇق","title":"سۈرەت خاسلىقى","titleButton":"سۈرەت دائىرە خاسلىقى","upload":"يۈكلە","urlMissing":"سۈرەتنىڭ ئەسلى ھۆججەت ئادرېسى كەم","vSpace":"بويىغا ئارىلىقى","validateBorder":"گىرۋەك چوڭلۇقى چوقۇم سان بولىدۇ","validateHSpace":"توغرىسىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ","validateVSpace":"بويىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ"},"indent":{"indent":"تارايت","outdent":"كەڭەيت"},"smiley":{"options":"چىراي ئىپادە سىنبەلگە تاللانمىسى","title":"چىراي ئىپادە سىنبەلگە قىستۇر","toolbar":"چىراي ئىپادە"},"justify":{"block":"ئىككى تەرەپتىن توغرىلا","center":"ئوتتۇرىغا توغرىلا","left":"سولغا توغرىلا","right":"ئوڭغا توغرىلا"},"link":{"acccessKey":"زىيارەت كۇنۇپكا","advanced":"ئالىي","advisoryContentType":"مەزمۇن تىپى","advisoryTitle":"ماۋزۇ","anchor":{"toolbar":"لەڭگەرلىك نۇقتا ئۇلانمىسى قىستۇر/تەھرىرلە","menu":"لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى","title":"لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى","name":"لەڭگەرلىك نۇقتا ئاتى","errorName":"لەڭگەرلىك نۇقتا ئاتىنى كىرگۈزۈڭ","remove":"لەڭگەرلىك نۇقتا ئۆچۈر"},"anchorId":"لەڭگەرلىك نۇقتا ID سى بويىچە","anchorName":"لەڭگەرلىك نۇقتا ئاتى بويىچە","charset":"ھەرپ كودلىنىشى","cssClasses":"ئۇسلۇب خىلى ئاتى","emailAddress":"ئادرېس","emailBody":"مەزمۇن","emailSubject":"ماۋزۇ","id":"ID","info":"ئۇلانما ئۇچۇرى","langCode":"تىل كودى","langDir":"تىل يۆنىلىشى","langDirLTR":"سولدىن ئوڭغا (LTR)","langDirRTL":"ئوڭدىن سولغا (RTL)","menu":"ئۇلانما تەھرىر","name":"ئات","noAnchors":"(بۇ پۈتۈكتە ئىشلەتكىلى بولىدىغان لەڭگەرلىك نۇقتا يوق)","noEmail":"ئېلخەت ئادرېسىنى كىرگۈزۈڭ","noUrl":"ئۇلانما ئادرېسىنى كىرگۈزۈڭ","other":"‹باشقا›","popupDependent":"تەۋە (NS)","popupFeatures":"قاڭقىش كۆزنەك خاسلىقى","popupFullScreen":"پۈتۈن ئېكران (IE)","popupLeft":"سول","popupLocationBar":"ئادرېس بالداق","popupMenuBar":"تىزىملىك بالداق","popupResizable":"چوڭلۇقى ئۆزگەرتىشچان","popupScrollBars":"دومىلىما سۈرگۈچ","popupStatusBar":"ھالەت بالداق","popupToolbar":"قورال بالداق","popupTop":"ئوڭ","rel":"باغلىنىش","selectAnchor":"بىر لەڭگەرلىك نۇقتا تاللاڭ","styles":"قۇر ئىچىدىكى ئۇسلۇبى","tabIndex":"Tab تەرتىپى","target":"نىشان","targetFrame":"‹كاندۇك›","targetFrameName":"نىشان كاندۇك ئاتى","targetPopup":"‹قاڭقىش كۆزنەك›","targetPopupName":"قاڭقىش كۆزنەك ئاتى","title":"ئۇلانما","toAnchor":"بەت ئىچىدىكى لەڭگەرلىك نۇقتا ئۇلانمىسى","toEmail":"ئېلخەت","toUrl":"ئادرېس","toolbar":"ئۇلانما قىستۇر/تەھرىرلە","type":"ئۇلانما تىپى","unlink":"ئۇلانما بىكار قىل","upload":"يۈكلە"},"list":{"bulletedlist":"تۈر بەلگە تىزىمى","numberedlist":"تەرتىپ نومۇر تىزىمى"},"liststyle":{"armenian":"قەدىمكى ئەرمىنىيە تەرتىپ نومۇرى شەكلى","bulletedTitle":"تۈر بەلگە تىزىم خاسلىقى","circle":"بوش چەمبەر","decimal":"سان (1, 2, 3 قاتارلىق)","decimalLeadingZero":"نۆلدىن باشلانغان سان بەلگە (01, 02, 03 قاتارلىق)","disc":"تولدۇرۇلغان چەمبەر","georgian":"قەدىمكى جورجىيە تەرتىپ نومۇرى شەكلى (an, ban, gan قاتارلىق)","lowerAlpha":"ئىنگلىزچە كىچىك ھەرپ (a, b, c, d, e قاتارلىق)","lowerGreek":"گرېكچە كىچىك ھەرپ (alpha, beta, gamma قاتارلىق)","lowerRoman":"كىچىك ھەرپلىك رىم رەقىمى (i, ii, iii, iv, v قاتارلىق)","none":"بەلگە يوق","notset":"‹تەڭشەلمىگەن›","numberedTitle":"تەرتىپ نومۇر تىزىم خاسلىقى","square":"تولدۇرۇلغان تۆت چاسا","start":"باشلىنىش نومۇرى","type":"بەلگە تىپى","upperAlpha":"ئىنگلىزچە چوڭ ھەرپ (A, B, C, D, E قاتارلىق)","upperRoman":"چوڭ ھەرپلىك رىم رەقىمى (I, II, III, IV, V قاتارلىق)","validateStartNumber":"تىزىم باشلىنىش تەرتىپ نومۇرى چوقۇم پۈتۈن سان پىچىمىدا بولۇشى لازىم"},"magicline":{"title":"بۇ جايغا ئابزاس قىستۇر"},"maximize":{"maximize":"چوڭايت","minimize":"كىچىكلەت"},"newpage":{"toolbar":"يېڭى بەت"},"pagebreak":{"alt":"بەت ئايرىغۇچ","toolbar":"بەت ئايرىغۇچ قىستۇر"},"pastetext":{"button":"پىچىمى يوق تېكىست سۈپىتىدە چاپلا","title":"پىچىمى يوق تېكىست سۈپىتىدە چاپلا"},"pastefromword":{"confirmCleanup":"سىز چاپلىماقچى بولغان مەزمۇن MS Word تىن كەلگەندەك قىلىدۇ، MS Word پىچىمىنى تازىلىۋەتكەندىن كېيىن ئاندىن چاپلامدۇ؟","error":"ئىچكى خاتالىق سەۋەبىدىن چاپلايدىغان سانلىق مەلۇماتنى تازىلىيالمايدۇ","title":"MS Word تىن چاپلا","toolbar":"MS Word تىن چاپلا"},"preview":{"preview":"ئالدىن كۆزەت"},"print":{"toolbar":"باس "},"removeformat":{"toolbar":"پىچىمنى چىقىرىۋەت"},"save":{"toolbar":"ساقلا"},"selectall":{"toolbar":"ھەممىنى تاللا"},"showblocks":{"toolbar":"بۆلەكنى كۆرسەت"},"sourcearea":{"toolbar":"مەنبە"},"specialchar":{"options":"ئالاھىدە ھەرپ تاللانمىسى","title":"ئالاھىدە ھەرپ تاللاڭ","toolbar":"ئالاھىدە ھەرپ قىستۇر"},"scayt":{"about":"شۇئان ئىملا تەكشۈرۈش ھەققىدە","aboutTab":"ھەققىدە","addWord":"سۆز قوش","allCaps":"چوڭ ھەرپتە يېزىلغان ھەممە سۆزگە پەرۋا قىلما","dic_create":"قۇر","dic_delete":"ئۆچۈر","dic_field_name":"لۇغەت ئاتى","dic_info":"باشلىنىشتا ئىشلەتكۈچى لۇغىتى Cookie  غا ساقلىنىدۇ ئەمما Cookie نىڭ سىغىمى چەكلىك بولغاچقا، ئىشلەتكۈچى لۇغىتى كۆپىيىپ Cookie  چەكلىمىسىدىن ئېشىپ كەتكەندە ساقلىغىلى بولمايدۇ، بۇ چاغدا لۇغىتىڭىزنى مۇلازىمېتىرىمىزغا ساقلىسىڭىز بولىدۇ. شەخسىي لۇغىتىڭىزنى مۇلازىمېتىرىمىزغا ساقلىماقچى بولسىڭىز لۇغىتىڭىزگە ئاتتىن بىرنى قويۇڭ، ئەگەر مۇلازىمتېرىمىزدا سىزنىڭ لۇغىتىڭىزدىن بىرسى بولسا لۇغەت ئاتىنى كىرگۈزۈپ ئەسلىگە قايتۇر توپچىسىنى بېسىڭ.","dic_rename":"ئات ئۆزگەرت","dic_restore":"ئەسلىگە كەلتۈر","dictionariesTab":"لۇغەت","disable":"شۇئان ئىملا تەكشۈرۈشنى چەكلە","emptyDic":"لۇغەت ئاتى بوش قالمايدۇ","enable":"شۇئان ئىملا تەكشۈرۈشنى قوزغات","ignore":"پەرۋا قىلما","ignoreAll":"ھەممىسىگە پەرۋا قىلما","ignoreDomainNames":"دائىرە ئاتىغا پەرۋا قىلما","langs":"تىل","languagesTab":"تىل","mixedCase":"چوڭ كىچىك ھەرپ بىلەن ئارىلاش يېزىلغان سۆزگە پەرۋا قىلما","mixedWithDigits":"سان بار سۆزگە پەرۋا قىلما","moreSuggestions":"تېخىمۇ كۆپ ئىملا تەۋسىيەسى","opera_title":"Opera توركۆرگۈنى قوللىمايدۇ","options":"تاللانما","optionsTab":"تاللانما","title":"شۇئان ئىملا تەكشۈر","toggle":"شۇئان ئىملا تەكشۈرۈشنى ۋاقىتلىق توختات/قوزغات","noSuggestions":"No suggestion"},"stylescombo":{"label":"ئۇسلۇب","panelTitle":"ئۇسلۇب","panelTitle1":"بۆلەك دەرىجىسىدىكى ئېلېمېنت ئۇسلۇبى","panelTitle2":"ئىچكى باغلانما ئېلېمېنت ئۇسلۇبى","panelTitle3":"نەڭ (Object) ئېلېمېنت ئۇسلۇبى"},"table":{"border":"گىرۋەك","caption":"ماۋزۇ","cell":{"menu":"كاتەكچە","insertBefore":"سولغا كاتەكچە قىستۇر","insertAfter":"ئوڭغا كاتەكچە قىستۇر","deleteCell":"كەتەكچە ئۆچۈر","merge":"كاتەكچە بىرلەشتۈر","mergeRight":"كاتەكچىنى ئوڭغا بىرلەشتۈر","mergeDown":"كاتەكچىنى ئاستىغا بىرلەشتۈر","splitHorizontal":"كاتەكچىنى توغرىسىغا بىرلەشتۈر","splitVertical":"كاتەكچىنى بويىغا بىرلەشتۈر","title":"كاتەكچە خاسلىقى","cellType":"كاتەكچە تىپى","rowSpan":"بويىغا چات ئارىسى قۇر سانى","colSpan":"توغرىسىغا چات ئارىسى ئىستون سانى","wordWrap":"ئۆزلۈكىدىن قۇر قاتلا","hAlign":"توغرىسىغا توغرىلا","vAlign":"بويىغا توغرىلا","alignBaseline":"ئاساسىي سىزىق","bgColor":"تەگلىك رەڭگى","borderColor":"گىرۋەك رەڭگى","data":"سانلىق مەلۇمات","header":"جەدۋەل باشى","yes":"ھەئە","no":"ياق","invalidWidth":"كاتەكچە كەڭلىكى چوقۇم سان بولىدۇ","invalidHeight":"كاتەكچە ئېگىزلىكى چوقۇم سان بولىدۇ","invalidRowSpan":"قۇر چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ ","invalidColSpan":"ئىستون چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ","chooseColor":"تاللاڭ"},"cellPad":"يان ئارىلىق","cellSpace":"ئارىلىق","column":{"menu":"ئىستون","insertBefore":"سولغا ئىستون قىستۇر","insertAfter":"ئوڭغا ئىستون قىستۇر","deleteColumn":"ئىستون ئۆچۈر"},"columns":"ئىستون سانى","deleteTable":"جەدۋەل ئۆچۈر","headers":"ماۋزۇ كاتەكچە","headersBoth":"بىرىنچى ئىستون ۋە بىرىنچى قۇر","headersColumn":"بىرىنچى ئىستون","headersNone":"يوق","headersRow":"بىرىنچى قۇر","invalidBorder":"گىرۋەك توملۇقى چوقۇم سان بولىدۇ","invalidCellPadding":"كاتەكچىگە چوقۇم سان تولدۇرۇلىدۇ","invalidCellSpacing":"كاتەكچە ئارىلىقى چوقۇم سان بولىدۇ","invalidCols":"بەلگىلەنگەن قۇر سانى چوقۇم نۆلدىن چوڭ بولىدۇ","invalidHeight":"جەدۋەل ئېگىزلىكى چوقۇم سان بولىدۇ","invalidRows":"بەلگىلەنگەن ئىستون سانى چوقۇم نۆلدىن چوڭ بولىدۇ","invalidWidth":"جەدۋەل كەڭلىكى چوقۇم سان بولىدۇ","menu":"جەدۋەل خاسلىقى","row":{"menu":"قۇر","insertBefore":"ئۈستىگە قۇر قىستۇر","insertAfter":"ئاستىغا قۇر قىستۇر","deleteRow":"قۇر ئۆچۈر"},"rows":"قۇر سانى","summary":"ئۈزۈندە","title":"جەدۋەل خاسلىقى","toolbar":"جەدۋەل","widthPc":"پىرسەنت","widthPx":"پىكسېل","widthUnit":"كەڭلىك بىرلىكى"},"undo":{"redo":"قايتىلا ","undo":"يېنىۋال"},"wsc":{"btnIgnore":"پەرۋا قىلما","btnIgnoreAll":"ھەممىگە پەرۋا قىلما","btnReplace":"ئالماشتۇر","btnReplaceAll":"ھەممىنى ئالماشتۇر","btnUndo":"يېنىۋال","changeTo":"ئۆزگەرت","errorLoading":"لازىملىق مۇلازىمېتىرنى يۈكلىگەندە خاتالىق كۆرۈلدى: %s.","ieSpellDownload":"ئىملا تەكشۈرۈش قىستۇرمىسى تېخى ئورنىتىلمىغان، ھازىرلا چۈشۈرەمسىز؟","manyChanges":"ئىملا تەكشۈرۈش تامام: %1  سۆزنى ئۆزگەرتتى","noChanges":"ئىملا تەكشۈرۈش تامام: ھېچقانداق سۆزنى ئۆزگەرتمىدى","noMispell":"ئىملا تەكشۈرۈش تامام: ئىملا خاتالىقى بايقالمىدى","noSuggestions":"-تەكلىپ يوق-","notAvailable":"كەچۈرۈڭ، مۇلازىمېتىرنى ۋاقتىنچە ئىشلەتكىلى بولمايدۇ","notInDic":"لۇغەتتە يوق","oneChange":"ئىملا تەكشۈرۈش تامام: بىر سۆزنى ئۆزگەرتتى","progress":"ئىملا تەكشۈرۈۋاتىدۇ…","title":"ئىملا تەكشۈر","toolbar":"ئىملا تەكشۈر"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/uk.js b/htmltest/sites/all/libraries/ckeditor-version/lang/uk.js
new file mode 100644
index 00000000..c711e29a
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/uk.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['uk']={"editor":"Текстовий редактор","common":{"editorHelp":"натисніть ALT 0 для довідки","browseServer":"Огляд Сервера","url":"URL","protocol":"Протокол","upload":"Надіслати","uploadSubmit":"Надіслати на сервер","image":"Зображення","flash":"Flash","form":"Форма","checkbox":"Галочка","radio":"Кнопка вибору","textField":"Текстове поле","textarea":"Текстова область","hiddenField":"Приховане поле","button":"Кнопка","select":"Список","imageButton":"Кнопка із зображенням","notSet":"<не визначено>","id":"Ідентифікатор","name":"Ім'я","langDir":"Напрямок мови","langDirLtr":"Зліва направо (LTR)","langDirRtl":"Справа наліво (RTL)","langCode":"Код мови","longDescr":"Довгий опис URL","cssClass":"Клас CSS","advisoryTitle":"Заголовок","cssStyle":"Стиль CSS","ok":"ОК","cancel":"Скасувати","close":"Закрити","preview":"Попередній перегляд","resize":"Потягніть для зміни розмірів","generalTab":"Основне","advancedTab":"Додаткове","validateNumberFailed":"Значення не є цілим числом.","confirmNewPage":"Всі незбережені зміни будуть втрачені. Ви впевнені, що хочете завантажити нову сторінку?","confirmCancel":"Деякі опції змінено. Закрити вікно без збереження змін?","options":"Опції","target":"Ціль","targetNew":"Нове вікно (_blank)","targetTop":"Поточне вікно (_top)","targetSelf":"Поточний фрейм/вікно (_self)","targetParent":"Батьківський фрейм/вікно (_parent)","langDirLTR":"Зліва направо (LTR)","langDirRTL":"Справа наліво (RTL)","styles":"Стиль CSS","cssClasses":"Клас CSS","width":"Ширина","height":"Висота","align":"Вирівнювання","alignLeft":"По лівому краю","alignRight":"По правому краю","alignCenter":"По центру","alignTop":"По верхньому краю","alignMiddle":"По середині","alignBottom":"По нижньому краю","invalidValue":"Невірне значення.","invalidHeight":"Висота повинна бути цілим числом.","invalidWidth":"Ширина повинна бути цілим числом.","invalidCssLength":"Значення, вказане для \"%1\" в полі повинно бути позитивним числом або без дійсного виміру CSS блоку (px, %, in, cm, mm, em, ex, pt або pc).","invalidHtmlLength":"Значення, вказане для \"%1\" в полі повинно бути позитивним числом або без дійсного виміру HTML блоку (px або %).","invalidInlineStyle":"Значення, вказане для вбудованого стилю повинне складатися з одного чи кількох кортежів у форматі \"ім'я : значення\", розділених крапкою з комою.","cssLengthTooltip":"Введіть номер значення в пікселях або число з дійсною одиниці CSS (px, %, in, cm, mm, em, ex, pt або pc).","unavailable":"%1<span class=\"cke_accessibility\">, не доступне</span>"},"about":{"copy":"Copyright &copy; $1. Всі права застережено.","dlgTitle":"Про CKEditor","help":"Перевірте $1 для допомоги.","moreInfo":"Щодо інформації з ліцензування завітайте на наш сайт:","title":"Про CKEditor","userGuide":"Інструкція Користувача для CKEditor"},"basicstyles":{"bold":"Жирний","italic":"Курсив","strike":"Закреслений","subscript":"Нижній індекс","superscript":"Верхній індекс","underline":"Підкреслений"},"bidi":{"ltr":"Напрямок тексту зліва направо","rtl":"Напрямок тексту справа наліво"},"blockquote":{"toolbar":"Цитата"},"clipboard":{"copy":"Копіювати","copyError":"Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції копіювання. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+C).","cut":"Вирізати","cutError":"Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції вирізування. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+X)","paste":"Вставити","pasteArea":"Область вставки","pasteMsg":"Будь ласка, вставте інформацію з буфера обміну в цю область, користуючись комбінацією клавіш (<STRONG>Ctrl/Cmd+V</STRONG>), та натисніть <STRONG>OK</STRONG>.","securityMsg":"Редактор не може отримати прямий доступ до буферу обміну у зв'язку з налаштуваннями Вашого браузера. Вам потрібно вставити інформацію в це вікно.","title":"Вставити"},"colorbutton":{"auto":"Авто","bgColorTitle":"Колір фону","colors":{"000":"Чорний","800000":"Бордовий","8B4513":"Коричневий","2F4F4F":"Темний сіро-зелений","008080":"Морської хвилі","000080":"Сливовий","4B0082":"Індиго","696969":"Темносірий","B22222":"Темночервоний","A52A2A":"Каштановий","DAA520":"Бежевий","006400":"Темнозелений","40E0D0":"Бірюзовий","0000CD":"Темносиній","800080":"Пурпурний","808080":"Сірий","F00":"Червоний","FF8C00":"Темнооранжевий","FFD700":"Жовтий","008000":"Зелений","0FF":"Синьо-зелений","00F":"Синій","EE82EE":"Фіолетовий","A9A9A9":"Світлосірий","FFA07A":"Рожевий","FFA500":"Оранжевий","FFFF00":"Яскравожовтий","00FF00":"Салатовий","AFEEEE":"Світлобірюзовий","ADD8E6":"Блакитний","DDA0DD":"Світлофіолетовий","D3D3D3":"Сріблястий","FFF0F5":"Світлорожевий","FAEBD7":"Світлооранжевий","FFFFE0":"Світложовтий","F0FFF0":"Світлозелений","F0FFFF":"Світлий синьо-зелений","F0F8FF":"Світлоблакитний","E6E6FA":"Лавандовий","FFF":"Білий"},"more":"Кольори...","panelTitle":"Кольори","textColorTitle":"Колір тексту"},"colordialog":{"clear":"Очистити","highlight":"Колір, на який вказує курсор","options":"Опції кольорів","selected":"Обраний колір","title":"Обрати колір"},"templates":{"button":"Шаблони","emptyListMsg":"(Не знайдено жодного шаблону)","insertOption":"Замінити поточний вміст","options":"Опції шаблону","selectPromptMsg":"Оберіть, будь ласка, шаблон для відкриття в редакторі<br>(поточний зміст буде втрачено):","title":"Шаблони змісту"},"contextmenu":{"options":"Опції контекстного меню"},"div":{"IdInputLabel":"Ідентифікатор","advisoryTitleInputLabel":"Зміст випливаючої підказки","cssClassInputLabel":"Клас CSS","edit":"Редагувати блок","inlineStyleInputLabel":"Вписаний стиль","langDirLTRLabel":"Зліва направо (LTR)","langDirLabel":"Напрямок мови","langDirRTLLabel":"Справа наліво (RTL)","languageCodeInputLabel":"Код мови","remove":"Видалити блок","styleSelectLabel":"Стиль CSS","title":"Створити блок-контейнер","toolbar":"Створити блок-контейнер"},"toolbar":{"toolbarCollapse":"Згорнути панель інструментів","toolbarExpand":"Розгорнути панель інструментів","toolbarGroups":{"document":"Документ","clipboard":"Буфер обміну / Скасувати","editing":"Редагування","forms":"Форми","basicstyles":"Основний Стиль","paragraph":"Параграф","links":"Посилання","insert":"Вставити","styles":"Стилі","colors":"Кольори","tools":"Інструменти"},"toolbars":"Панель інструментів редактора"},"elementspath":{"eleLabel":"Шлях","eleTitle":"%1 елемент"},"find":{"find":"Пошук","findOptions":"Параметри Пошуку","findWhat":"Шукати:","matchCase":"Враховувати регістр","matchCyclic":"Циклічна заміна","matchWord":"Збіг цілих слів","notFoundMsg":"Вказаний текст не знайдено.","replace":"Заміна","replaceAll":"Замінити все","replaceSuccessMsg":"%1 співпадінь(ня) замінено.","replaceWith":"Замінити на:","title":"Знайти і замінити"},"fakeobjects":{"anchor":"Якір","flash":"Flash-анімація","hiddenfield":"Приховані Поля","iframe":"IFrame","unknown":"Невідомий об'єкт"},"flash":{"access":"Доступ до скрипта","accessAlways":"Завжди","accessNever":"Ніколи","accessSameDomain":"З того ж домена","alignAbsBottom":"По нижньому краю (abs)","alignAbsMiddle":"По середині (abs)","alignBaseline":"По базовій лінії","alignTextTop":"Текст по верхньому краю","bgcolor":"Колір фону","chkFull":"Дозволити повноекранний перегляд","chkLoop":"Циклічно","chkMenu":"Дозволити меню Flash","chkPlay":"Автопрогравання","flashvars":"Змінні Flash","hSpace":"Гориз. відступ","properties":"Властивості Flash","propertiesTab":"Властивості","quality":"Якість","qualityAutoHigh":"Автом. відмінна","qualityAutoLow":"Автом. низька","qualityBest":"Відмінна","qualityHigh":"Висока","qualityLow":"Низька","qualityMedium":"Середня","scale":"Масштаб","scaleAll":"Показати все","scaleFit":"Поч. розмір","scaleNoBorder":"Без рамки","title":"Властивості Flash","vSpace":"Верт. відступ","validateHSpace":"Гориз. відступ повинен бути цілим числом.","validateSrc":"Будь ласка, вкажіть URL посилання","validateVSpace":"Верт. відступ повинен бути цілим числом.","windowMode":"Віконний режим","windowModeOpaque":"Непрозорість","windowModeTransparent":"Прозорість","windowModeWindow":"Вікно"},"font":{"fontSize":{"label":"Розмір","voiceLabel":"Розмір шрифту","panelTitle":"Розмір"},"label":"Шрифт","panelTitle":"Шрифт","voiceLabel":"Шрифт"},"forms":{"button":{"title":"Властивості кнопки","text":"Значення","type":"Тип","typeBtn":"Кнопка (button)","typeSbm":"Надіслати (submit)","typeRst":"Очистити (reset)"},"checkboxAndRadio":{"checkboxTitle":"Властивості галочки","radioTitle":"Властивості кнопки вибору","value":"Значення","selected":"Обрана"},"form":{"title":"Властивості форми","menu":"Властивості форми","action":"Дія","method":"Метод","encoding":"Кодування"},"hidden":{"title":"Властивості прихованого поля","name":"Ім'я","value":"Значення"},"select":{"title":"Властивості списку","selectInfo":"Інфо","opAvail":"Доступні варіанти","value":"Значення","size":"Кількість","lines":"видимих позицій у списку","chkMulti":"Список з мультивибором","opText":"Текст","opValue":"Значення","btnAdd":"Добавити","btnModify":"Змінити","btnUp":"Вгору","btnDown":"Вниз","btnSetValue":"Встановити як обране значення","btnDelete":"Видалити"},"textarea":{"title":"Властивості текстової області","cols":"Стовбці","rows":"Рядки"},"textfield":{"title":"Властивості текстового поля","name":"Ім'я","value":"Значення","charWidth":"Ширина","maxChars":"Макс. к-ть символів","type":"Тип","typeText":"Текст","typePass":"Пароль","typeEmail":"Пошта","typeSearch":"Пошук","typeTel":"Мобільний","typeUrl":"URL"}},"format":{"label":"Форматування","panelTitle":"Форматування параграфа","tag_address":"Адреса","tag_div":"Нормальний (div)","tag_h1":"Заголовок 1","tag_h2":"Заголовок 2","tag_h3":"Заголовок 3","tag_h4":"Заголовок 4","tag_h5":"Заголовок 5","tag_h6":"Заголовок 6","tag_p":"Нормальний","tag_pre":"Форматований"},"horizontalrule":{"toolbar":"Горизонтальна лінія"},"iframe":{"border":"Показати рамки фрейму","noUrl":"Будь ласка введіть посилання для IFrame","scrolling":"Увімкнути прокрутку","title":"Налаштування для IFrame","toolbar":"IFrame"},"image":{"alertUrl":"Будь ласка, вкажіть URL зображення","alt":"Альтернативний текст","border":"Рамка","btnUpload":"Надіслати на сервер","button2Img":"Бажаєте перетворити обрану кнопку-зображення на просте зображення?","hSpace":"Гориз. відступ","img2Button":"Бажаєте перетворити обране зображення на кнопку-зображення?","infoTab":"Інформація про зображення","linkTab":"Посилання","lockRatio":"Зберегти пропорції","menu":"Властивості зображення","resetSize":"Очистити поля розмірів","title":"Властивості зображення","titleButton":"Властивості кнопки із зображенням","upload":"Надіслати","urlMissing":"Вкажіть URL зображення.","vSpace":"Верт. відступ","validateBorder":"Ширина рамки повинна бути цілим числом.","validateHSpace":"Гориз. відступ повинен бути цілим числом.","validateVSpace":"Верт. відступ повинен бути цілим числом."},"indent":{"indent":"Збільшити відступ","outdent":"Зменшити відступ"},"smiley":{"options":"Опції смайликів","title":"Вставити смайлик","toolbar":"Смайлик"},"justify":{"block":"По ширині","center":"По центру","left":"По лівому краю","right":"По правому краю"},"link":{"acccessKey":"Гаряча клавіша","advanced":"Додаткове","advisoryContentType":"Тип вмісту","advisoryTitle":"Заголовок","anchor":{"toolbar":"Вставити/Редагувати якір","menu":"Властивості якоря","title":"Властивості якоря","name":"Ім'я якоря","errorName":"Будь ласка, вкажіть ім'я якоря","remove":"Прибрати якір"},"anchorId":"За ідентифікатором елементу","anchorName":"За ім'ям елементу","charset":"Кодування","cssClasses":"Клас CSS","emailAddress":"Адреса ел. пошти","emailBody":"Тіло повідомлення","emailSubject":"Тема листа","id":"Ідентифікатор","info":"Інформація посилання","langCode":"Код мови","langDir":"Напрямок мови","langDirLTR":"Зліва направо (LTR)","langDirRTL":"Справа наліво (RTL)","menu":"Вставити посилання","name":"Ім'я","noAnchors":"(В цьому документі немає якорів)","noEmail":"Будь ласка, вкажіть адрес ел. пошти","noUrl":"Будь ласка, вкажіть URL посилання","other":"<інший>","popupDependent":"Залежний (Netscape)","popupFeatures":"Властивості випливаючого вікна","popupFullScreen":"Повний екран (IE)","popupLeft":"Позиція зліва","popupLocationBar":"Панель локації","popupMenuBar":"Панель меню","popupResizable":"Масштабоване","popupScrollBars":"Стрічки прокрутки","popupStatusBar":"Рядок статусу","popupToolbar":"Панель інструментів","popupTop":"Позиція зверху","rel":"Зв'язок","selectAnchor":"Оберіть якір","styles":"Стиль CSS","tabIndex":"Послідовність переходу","target":"Ціль","targetFrame":"<фрейм>","targetFrameName":"Ім'я цільового фрейму","targetPopup":"<випливаюче вікно>","targetPopupName":"Ім'я випливаючого вікна","title":"Посилання","toAnchor":"Якір на цю сторінку","toEmail":"Ел. пошта","toUrl":"URL","toolbar":"Вставити/Редагувати посилання","type":"Тип посилання","unlink":"Видалити посилання","upload":"Надіслати"},"list":{"bulletedlist":"Маркірований список","numberedlist":"Нумерований список"},"liststyle":{"armenian":"Вірменська нумерація","bulletedTitle":"Опції маркованого списку","circle":"Кільце","decimal":"Десяткові (1, 2, 3 і т.д.)","decimalLeadingZero":"Десяткові з нулем (01, 02, 03 і т.д.)","disc":"Кружечок","georgian":"Грузинська нумерація (an, ban, gan і т.д.)","lowerAlpha":"Малі лат. букви (a, b, c, d, e і т.д.)","lowerGreek":"Малі гр. букви (альфа, бета, гамма і т.д.)","lowerRoman":"Малі римські (i, ii, iii, iv, v і т.д.)","none":"Нема","notset":"<не вказано>","numberedTitle":"Опції нумерованого списку","square":"Квадратик","start":"Почати з...","type":"Тип","upperAlpha":"Великі лат. букви (A, B, C, D, E і т.д.)","upperRoman":"Великі римські (I, II, III, IV, V і т.д.)","validateStartNumber":"Початковий номер списку повинен бути цілим числом."},"magicline":{"title":"Вставити абзац"},"maximize":{"maximize":"Максимізувати","minimize":"Мінімізувати"},"newpage":{"toolbar":"Нова сторінка"},"pagebreak":{"alt":"Розрив Сторінки","toolbar":"Вставити розрив сторінки"},"pastetext":{"button":"Вставити тільки текст","title":"Вставити тільки текст"},"pastefromword":{"confirmCleanup":"Текст, що Ви намагаєтесь вставити, схожий на скопійований з Word. Бажаєте очистити його форматування перед вставлянням?","error":"Неможливо очистити форматування через внутрішню помилку.","title":"Вставити з Word","toolbar":"Вставити з Word"},"preview":{"preview":"Попередній перегляд"},"print":{"toolbar":"Друк"},"removeformat":{"toolbar":"Очистити форматування"},"save":{"toolbar":"Зберегти"},"selectall":{"toolbar":"Виділити все"},"showblocks":{"toolbar":"Показувати блоки"},"sourcearea":{"toolbar":"Джерело"},"specialchar":{"options":"Опції","title":"Оберіть спеціальний символ","toolbar":"Спеціальний символ"},"scayt":{"about":"Про SCAYT","aboutTab":"Про SCAYT","addWord":"Додати слово","allCaps":"Пропустити прописні слова","dic_create":"Створити","dic_delete":"Видалити","dic_field_name":"Назва словника","dic_info":"Як правило, користувацькі словники зберігаються у cookie-файлах. Однак, cookie-файли мають обмеження на розмір. Якщо користувацький словник зростає в обсязі настільки, що вже не може бути збережений у cookie-файлі, тоді його можна зберегти на нашому сервері. Щоб зберегти Ваш персональний словник на нашому сервері необхідно вказати назву словника. Якщо Ви вже зберігали словник на сервері, будь ласка, вкажіть назву збереженого словника і натисніть кнопку Відновити.","dic_rename":"Перейменувати","dic_restore":"Відновити","dictionariesTab":"Словники","disable":"Вимкнути SCAYT","emptyDic":"Назва словника повинна бути вказана.","enable":"Ввімкнути SCAYT","ignore":"Пропустити","ignoreAll":"Пропустити всі","ignoreDomainNames":"Пропустити доменні назви","langs":"Мови","languagesTab":"Мови","mixedCase":"Пропустити слова зі змішаним регістром","mixedWithDigits":"Пропустити слова, що містять цифри","moreSuggestions":"Більше варіантів","opera_title":"Не підтримується в Opera","options":"Опції","optionsTab":"Опції","title":"Перефірка орфографії по мірі набору","toggle":"Перемкнути SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Стиль","panelTitle":"Стилі форматування","panelTitle1":"Блочні стилі","panelTitle2":"Рядкові стилі","panelTitle3":"Об'єктні стилі"},"table":{"border":"Розмір рамки","caption":"Заголовок таблиці","cell":{"menu":"Комірки","insertBefore":"Вставити комірку перед","insertAfter":"Вставити комірку після","deleteCell":"Видалити комірки","merge":"Об'єднати комірки","mergeRight":"Об'єднати справа","mergeDown":"Об'єднати донизу","splitHorizontal":"Розділити комірку по горизонталі","splitVertical":"Розділити комірку по вертикалі","title":"Властивості комірки","cellType":"Тип комірки","rowSpan":"Об'єднання рядків","colSpan":"Об'єднання стовпців","wordWrap":"Автоперенесення тексту","hAlign":"Гориз. вирівнювання","vAlign":"Верт. вирівнювання","alignBaseline":"По базовій лінії","bgColor":"Колір фону","borderColor":"Колір рамки","data":"Дані","header":"Заголовок","yes":"Так","no":"Ні","invalidWidth":"Ширина комірки повинна бути цілим числом.","invalidHeight":"Висота комірки повинна бути цілим числом.","invalidRowSpan":"Кількість об'єднуваних рядків повинна бути цілим числом.","invalidColSpan":"Кількість об'єднуваних стовбців повинна бути цілим числом.","chooseColor":"Обрати"},"cellPad":"Внутр. відступ","cellSpace":"Проміжок","column":{"menu":"Стовбці","insertBefore":"Вставити стовбець перед","insertAfter":"Вставити стовбець після","deleteColumn":"Видалити стовбці"},"columns":"Стовбці","deleteTable":"Видалити таблицю","headers":"Заголовки стовбців/рядків","headersBoth":"Стовбці і рядки","headersColumn":"Стовбці","headersNone":"Без заголовків","headersRow":"Рядки","invalidBorder":"Розмір рамки повинен бути цілим числом.","invalidCellPadding":"Внутр. відступ комірки повинен бути цілим числом.","invalidCellSpacing":"Проміжок між комірками повинен бути цілим числом.","invalidCols":"Кількість стовбців повинна бути більшою 0.","invalidHeight":"Висота таблиці повинна бути цілим числом.","invalidRows":"Кількість рядків повинна бути більшою 0.","invalidWidth":"Ширина таблиці повинна бути цілим числом.","menu":"Властивості таблиці","row":{"menu":"Рядки","insertBefore":"Вставити рядок перед","insertAfter":"Вставити рядок після","deleteRow":"Видалити рядки"},"rows":"Рядки","summary":"Детальний опис заголовку таблиці","title":"Властивості таблиці","toolbar":"Таблиця","widthPc":"відсотків","widthPx":"пікселів","widthUnit":"Одиниці вимір."},"undo":{"redo":"Повторити","undo":"Повернути"},"wsc":{"btnIgnore":"Пропустити","btnIgnoreAll":"Пропустити все","btnReplace":"Замінити","btnReplaceAll":"Замінити все","btnUndo":"Назад","changeTo":"Замінити на","errorLoading":"Помилка завантаження : %s.","ieSpellDownload":"Модуль перевірки орфографії не встановлено. Бажаєте завантажити його зараз?","manyChanges":"Перевірку орфографії завершено: 1% слів(ова) змінено","noChanges":"Перевірку орфографії завершено: жодне слово не змінено","noMispell":"Перевірку орфографії завершено: помилок не знайдено","noSuggestions":"- немає варіантів -","notAvailable":"Вибачте, але сервіс наразі недоступний.","notInDic":"Немає в словнику","oneChange":"Перевірку орфографії завершено: змінено одне слово","progress":"Виконується перевірка орфографії...","title":"Перевірка орфографії","toolbar":"Перевірити орфографію"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/vi.js b/htmltest/sites/all/libraries/ckeditor-version/lang/vi.js
new file mode 100644
index 00000000..4796be1e
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/vi.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['vi']={"editor":"Bộ soạn thảo văn bản có định dạng","common":{"editorHelp":"Nhấn ALT + 0 để được giúp đỡ","browseServer":"Duyệt máy chủ","url":"URL","protocol":"Giao thức","upload":"Tải lên","uploadSubmit":"Tải lên máy chủ","image":"Hình ảnh","flash":"Flash","form":"Biểu mẫu","checkbox":"Nút kiểm","radio":"Nút chọn","textField":"Trường văn bản","textarea":"Vùng văn bản","hiddenField":"Trường ẩn","button":"Nút","select":"Ô chọn","imageButton":"Nút hình ảnh","notSet":"<không thiết lập>","id":"Định danh","name":"Tên","langDir":"Hướng ngôn ngữ","langDirLtr":"Trái sang phải (LTR)","langDirRtl":"Phải sang trái (RTL)","langCode":"Mã ngôn ngữ","longDescr":"Mô tả URL","cssClass":"Lớp Stylesheet","advisoryTitle":"Nhan đề hướng dẫn","cssStyle":"Kiểu (style)","ok":"Đồng ý","cancel":"Bỏ qua","close":"Đóng","preview":"Xem trước","resize":"Kéo rê để thay đổi kích cỡ","generalTab":"Tab chung","advancedTab":"Tab mở rộng","validateNumberFailed":"Giá trị này không phải là số.","confirmNewPage":"Mọi thay đổi không được lưu lại, nội dung này sẽ bị mất. Bạn có chắc chắn muốn tải một trang mới?","confirmCancel":"Một vài tùy chọn đã bị thay đổi. Bạn có chắc chắn muốn đóng hộp thoại?","options":"Tùy chọn","target":"Đích đến","targetNew":"Cửa sổ mới (_blank)","targetTop":"Cửa sổ trên cùng (_top)","targetSelf":"Tại trang (_self)","targetParent":"Cửa sổ cha (_parent)","langDirLTR":"Trái sang phải (LTR)","langDirRTL":"Phải sang trái (RTL)","styles":"Kiểu","cssClasses":"Lớp CSS","width":"Chiều rộng","height":"chiều cao","align":"Vị trí","alignLeft":"Trái","alignRight":"Phải","alignCenter":"Giữa","alignTop":"Trên","alignMiddle":"Giữa","alignBottom":"Dưới","invalidValue":"Giá trị không hợp lệ.","invalidHeight":"Chiều cao phải là số nguyên.","invalidWidth":"Chiều rộng phải là số nguyên.","invalidCssLength":"Giá trị quy định cho trường \"%1\" phải là một số dương có hoặc không có một đơn vị đo CSS hợp lệ (px, %, in, cm, mm, em, ex, pt, hoặc pc).","invalidHtmlLength":"Giá trị quy định cho trường \"%1\" phải là một số dương có hoặc không có một đơn vị đo HTML hợp lệ (px hoặc %).","invalidInlineStyle":"Giá trị quy định cho kiểu nội tuyến phải bao gồm một hoặc nhiều dữ liệu với định dạng \"tên:giá trị\", cách nhau bằng dấu chấm phẩy.","cssLengthTooltip":"Nhập một giá trị theo pixel hoặc một số với một đơn vị CSS hợp lệ (px, %, in, cm, mm, em, ex, pt, hoặc pc).","unavailable":"%1<span class=\"cke_accessibility\">, không có</span>"},"about":{"copy":"Bản quyền &copy; $1. Giữ toàn quyền.","dlgTitle":"Thông tin về CKEditor","help":"Kiểm tra $1 để được giúp đỡ.","moreInfo":"Vui lòng ghé thăm trang web của chúng tôi để có thông tin về giấy phép:","title":"Thông tin về CKEditor","userGuide":"Hướng dẫn sử dụng CKEditor"},"basicstyles":{"bold":"Đậm","italic":"Nghiêng","strike":"Gạch xuyên ngang","subscript":"Chỉ số dưới","superscript":"Chỉ số trên","underline":"Gạch chân"},"bidi":{"ltr":"Văn bản hướng từ trái sang phải","rtl":"Văn bản hướng từ phải sang trái"},"blockquote":{"toolbar":"Khối trích dẫn"},"clipboard":{"copy":"Sao chép","copyError":"Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh sao chép. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+C).","cut":"Cắt","cutError":"Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh cắt. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+X).","paste":"Dán","pasteArea":"Khu vực dán","pasteMsg":"Hãy dán nội dung vào trong khung bên dưới, sử dụng tổ hợp phím (<STRONG>Ctrl/Cmd+V</STRONG>) và nhấn vào nút <STRONG>Đồng ý</STRONG>.","securityMsg":"Do thiết lập bảo mật của trình duyệt nên trình biên tập không thể truy cập trực tiếp vào nội dung đã sao chép. Bạn cần phải dán lại nội dung vào cửa sổ này.","title":"Dán"},"colorbutton":{"auto":"Tự động","bgColorTitle":"Màu nền","colors":{"000":"Đen","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Nâu","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Xám","F00":"Đỏ","FF8C00":"Dark Orange","FFD700":"Vàng","008000":"Xanh lá cây","0FF":"Cyan","00F":"Xanh da trời","EE82EE":"Tím","A9A9A9":"Xám tối","FFA07A":"Light Salmon","FFA500":"Màu cam","FFFF00":"Vàng","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"Trắng"},"more":"Màu khác...","panelTitle":"Màu sắc","textColorTitle":"Màu chữ"},"colordialog":{"clear":"Xóa bỏ","highlight":"Màu chọn","options":"Tùy chọn màu","selected":"Màu đã chọn","title":"Chọn màu"},"templates":{"button":"Mẫu dựng sẵn","emptyListMsg":"(Không có mẫu dựng sẵn nào được định nghĩa)","insertOption":"Thay thế nội dung hiện tại","options":"Tùy chọn mẫu dựng sẵn","selectPromptMsg":"Hãy chọn mẫu dựng sẵn để mở trong trình biên tập<br>(nội dung hiện tại sẽ bị mất):","title":"Nội dung Mẫu dựng sẵn"},"contextmenu":{"options":"Tùy chọn menu bổ xung"},"div":{"IdInputLabel":"Định danh (id)","advisoryTitleInputLabel":"Nhan đề hướng dẫn","cssClassInputLabel":"Các lớp CSS","edit":"Chỉnh sửa","inlineStyleInputLabel":"Kiểu nội dòng","langDirLTRLabel":"Trái sang phải (LTR)","langDirLabel":"Hướng ngôn ngữ","langDirRTLLabel":"Phải qua trái (RTL)","languageCodeInputLabel":"Mã ngôn ngữ","remove":"Xóa bỏ","styleSelectLabel":"Kiểu (style)","title":"Tạo khối các thành phần","toolbar":"Tạo khối các thành phần"},"toolbar":{"toolbarCollapse":"Thu gọn thanh công cụ","toolbarExpand":"Mở rộng thnah công cụ","toolbarGroups":{"document":"Tài liệu","clipboard":"Clipboard/Undo","editing":"Chỉnh sửa","forms":"Bảng biểu","basicstyles":"Kiểu cơ bản","paragraph":"Đoạn","links":"Liên kết","insert":"Chèn","styles":"Kiểu","colors":"Màu sắc","tools":"Công cụ"},"toolbars":"Thanh công cụ"},"elementspath":{"eleLabel":"Nhãn thành phần","eleTitle":"%1 thành phần"},"find":{"find":"Tìm kiếm","findOptions":"Tìm tùy chọn","findWhat":"Tìm chuỗi:","matchCase":"Phân biệt chữ hoa/thường","matchCyclic":"Giống một phần","matchWord":"Giống toàn bộ từ","notFoundMsg":"Không tìm thấy chuỗi cần tìm.","replace":"Thay thế","replaceAll":"Thay thế tất cả","replaceSuccessMsg":"%1 vị trí đã được thay thế.","replaceWith":"Thay bằng:","title":"Tìm kiếm và thay thế"},"fakeobjects":{"anchor":"Điểm neo","flash":"Flash","hiddenfield":"Trường ẩn","iframe":"IFrame","unknown":"Đối tượng không rõ ràng"},"flash":{"access":"Truy cập mã","accessAlways":"Luôn luôn","accessNever":"Không bao giờ","accessSameDomain":"Cùng tên miền","alignAbsBottom":"Dưới tuyệt đối","alignAbsMiddle":"Giữa tuyệt đối","alignBaseline":"Đường cơ sở","alignTextTop":"Phía trên chữ","bgcolor":"Màu nền","chkFull":"Cho phép toàn màn hình","chkLoop":"Lặp","chkMenu":"Cho phép bật menu của Flash","chkPlay":"Tự động chạy","flashvars":"Các biến số dành cho Flash","hSpace":"Khoảng đệm ngang","properties":"Thuộc tính Flash","propertiesTab":"Thuộc tính","quality":"Chất lượng","qualityAutoHigh":"Cao tự động","qualityAutoLow":"Thấp tự động","qualityBest":"Tốt nhất","qualityHigh":"Cao","qualityLow":"Thấp","qualityMedium":"Trung bình","scale":"Tỷ lệ","scaleAll":"Hiển thị tất cả","scaleFit":"Vừa vặn","scaleNoBorder":"Không đường viền","title":"Thuộc tính Flash","vSpace":"Khoảng đệm dọc","validateHSpace":"Khoảng đệm ngang phải là số nguyên.","validateSrc":"Hãy đưa vào đường dẫn liên kết","validateVSpace":"Khoảng đệm dọc phải là số nguyên.","windowMode":"Chế độ cửa sổ","windowModeOpaque":"Mờ đục","windowModeTransparent":"Trong suốt","windowModeWindow":"Cửa sổ"},"font":{"fontSize":{"label":"Cỡ chữ","voiceLabel":"Kích cỡ phông","panelTitle":"Cỡ chữ"},"label":"Phông","panelTitle":"Phông","voiceLabel":"Phông"},"forms":{"button":{"title":"Thuộc tính của nút","text":"Chuỗi hiển thị (giá trị)","type":"Kiểu","typeBtn":"Nút bấm","typeSbm":"Nút gửi","typeRst":"Nút nhập lại"},"checkboxAndRadio":{"checkboxTitle":"Thuộc tính nút kiểm","radioTitle":"Thuộc tính nút chọn","value":"Giá trị","selected":"Được chọn"},"form":{"title":"Thuộc tính biểu mẫu","menu":"Thuộc tính biểu mẫu","action":"Hành động","method":"Phương thức","encoding":"Bảng mã"},"hidden":{"title":"Thuộc tính trường ẩn","name":"Tên","value":"Giá trị"},"select":{"title":"Thuộc tính ô chọn","selectInfo":"Thông tin","opAvail":"Các tùy chọn có thể sử dụng","value":"Giá trị","size":"Kích cỡ","lines":"dòng","chkMulti":"Cho phép chọn nhiều","opText":"Văn bản","opValue":"Giá trị","btnAdd":"Thêm","btnModify":"Thay đổi","btnUp":"Lên","btnDown":"Xuống","btnSetValue":"Giá trị được chọn","btnDelete":"Nút xoá"},"textarea":{"title":"Thuộc tính vùng văn bản","cols":"Số cột","rows":"Số hàng"},"textfield":{"title":"Thuộc tính trường văn bản","name":"Tên","value":"Giá trị","charWidth":"Độ rộng của ký tự","maxChars":"Số ký tự tối đa","type":"Kiểu","typeText":"Ký tự","typePass":"Mật khẩu","typeEmail":"Email","typeSearch":"Tìm kiếm","typeTel":"Số điện thoại","typeUrl":"URL"}},"format":{"label":"Định dạng","panelTitle":"Định dạng","tag_address":"Address","tag_div":"Bình thường (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Bình thường (P)","tag_pre":"Đã thiết lập"},"horizontalrule":{"toolbar":"Chèn đường phân cách ngang"},"iframe":{"border":"Hiển thị viền khung","noUrl":"Vui lòng nhập địa chỉ iframe","scrolling":"Kích hoạt thanh cuộn","title":"Thuộc tính iframe","toolbar":"Iframe"},"image":{"alertUrl":"Hãy đưa vào đường dẫn của ảnh","alt":"Chú thích ảnh","border":"Đường viền","btnUpload":"Tải lên máy chủ","button2Img":"Bạn có muốn chuyển nút bấm bằng ảnh được chọn thành ảnh?","hSpace":"Khoảng đệm ngang","img2Button":"Bạn có muốn chuyển đổi ảnh được chọn thành nút bấm bằng ảnh?","infoTab":"Thông tin của ảnh","linkTab":"Tab liên kết","lockRatio":"Giữ nguyên tỷ lệ","menu":"Thuộc tính của ảnh","resetSize":"Kích thước gốc","title":"Thuộc tính của ảnh","titleButton":"Thuộc tính nút của ảnh","upload":"Tải lên","urlMissing":"Thiếu đường dẫn hình ảnh","vSpace":"Khoảng đệm dọc","validateBorder":"Chiều rộng của đường viền phải là một số nguyên dương","validateHSpace":"Khoảng đệm ngang phải là một số nguyên dương","validateVSpace":"Khoảng đệm dọc phải là một số nguyên dương"},"indent":{"indent":"Dịch vào trong","outdent":"Dịch ra ngoài"},"smiley":{"options":"Tùy chọn hình  biểu lộ cảm xúc","title":"Chèn hình biểu lộ cảm xúc (mặt cười)","toolbar":"Hình biểu lộ cảm xúc (mặt cười)"},"justify":{"block":"Canh đều","center":"Canh giữa","left":"Canh trái","right":"Canh phải"},"link":{"acccessKey":"Phím hỗ trợ truy cập","advanced":"Mở rộng","advisoryContentType":"Nội dung hướng dẫn","advisoryTitle":"Nhan đề hướng dẫn","anchor":{"toolbar":"Chèn/Sửa điểm neo","menu":"Thuộc tính điểm neo","title":"Thuộc tính điểm neo","name":"Tên của điểm neo","errorName":"Hãy nhập vào tên của điểm neo","remove":"Xóa neo"},"anchorId":"Theo định danh thành phần","anchorName":"Theo tên điểm neo","charset":"Bảng mã của tài nguyên được liên kết đến","cssClasses":"Lớp Stylesheet","emailAddress":"Thư điện tử","emailBody":"Nội dung thông điệp","emailSubject":"Tiêu đề thông điệp","id":"Định danh","info":"Thông tin liên kết","langCode":"Mã ngôn ngữ","langDir":"Hướng ngôn ngữ","langDirLTR":"Trái sang phải (LTR)","langDirRTL":"Phải sang trái (RTL)","menu":"Sửa liên kết","name":"Tên","noAnchors":"(Không có điểm neo nào trong tài liệu)","noEmail":"Hãy đưa vào địa chỉ thư điện tử","noUrl":"Hãy đưa vào đường dẫn liên kết (URL)","other":"<khác>","popupDependent":"Phụ thuộc (Netscape)","popupFeatures":"Đặc điểm của cửa sổ Popup","popupFullScreen":"Toàn màn hình (IE)","popupLeft":"Vị trí bên trái","popupLocationBar":"Thanh vị trí","popupMenuBar":"Thanh Menu","popupResizable":"Có thể thay đổi kích cỡ","popupScrollBars":"Thanh cuộn","popupStatusBar":"Thanh trạng thái","popupToolbar":"Thanh công cụ","popupTop":"Vị trí phía trên","rel":"Quan hệ","selectAnchor":"Chọn một điểm neo","styles":"Kiểu (style)","tabIndex":"Chỉ số của Tab","target":"Đích","targetFrame":"<khung>","targetFrameName":"Tên khung đích","targetPopup":"<cửa sổ popup>","targetPopupName":"Tên cửa sổ Popup","title":"Liên kết","toAnchor":"Neo trong trang này","toEmail":"Thư điện tử","toUrl":"URL","toolbar":"Chèn/Sửa liên kết","type":"Kiểu liên kết","unlink":"Xoá liên kết","upload":"Tải lên"},"list":{"bulletedlist":"Chèn/Xoá Danh sách không thứ tự","numberedlist":"Chèn/Xoá Danh sách có thứ tự"},"liststyle":{"armenian":"Số theo kiểu Armenian","bulletedTitle":"Thuộc tính danh sách không thứ tự","circle":"Khuyên tròn","decimal":"Kiểu số (1, 2, 3 ...)","decimalLeadingZero":"Kiểu số (01, 02, 03...)","disc":"Hình đĩa","georgian":"Số theo kiểu Georgian (an, ban, gan...)","lowerAlpha":"Kiểu abc thường (a, b, c, d, e...)","lowerGreek":"Kiểu Hy Lạp (alpha, beta, gamma...)","lowerRoman":"Số La Mã kiểu thường (i, ii, iii, iv, v...)","none":"Không gì cả","notset":"<không thiết lập>","numberedTitle":"Thuộc tính danh sách có thứ tự","square":"Hình vuông","start":"Bắt đầu","type":"Kiểu loại","upperAlpha":"Kiểu ABC HOA (A, B, C, D, E...)","upperRoman":"Số La Mã kiểu HOA (I, II, III, IV, V...)","validateStartNumber":"Số bắt đầu danh sách phải là một số nguyên."},"magicline":{"title":"Chèn đoạn vào đây"},"maximize":{"maximize":"Phóng to tối đa","minimize":"Thu nhỏ"},"newpage":{"toolbar":"Trang mới"},"pagebreak":{"alt":"Ngắt trang","toolbar":"Chèn ngắt trang"},"pastetext":{"button":"Dán theo định dạng văn bản thuần","title":"Dán theo định dạng văn bản thuần"},"pastefromword":{"confirmCleanup":"Văn bản bạn muốn dán có kèm định dạng của Word. Bạn có muốn loại bỏ định dạng Word trước khi dán?","error":"Không thể để làm sạch các dữ liệu dán do một lỗi nội bộ","title":"Dán với định dạng Word","toolbar":"Dán với định dạng Word"},"preview":{"preview":"Xem trước"},"print":{"toolbar":"In"},"removeformat":{"toolbar":"Xoá định dạng"},"save":{"toolbar":"Lưu"},"selectall":{"toolbar":"Chọn tất cả"},"showblocks":{"toolbar":"Hiển thị các khối"},"sourcearea":{"toolbar":"Mã HTML"},"specialchar":{"options":"Tùy chọn các ký tự đặc biệt","title":"Hãy chọn ký tự đặc biệt","toolbar":"Chèn ký tự đặc biệt"},"scayt":{"about":"Thông tin về SCAYT","aboutTab":"Thông tin","addWord":"Thêm từ","allCaps":"Không phân biệt chữ HOA chữ thường","dic_create":"Tạo","dic_delete":"Xóa","dic_field_name":"Tên từ điển","dic_info":"Ban đầu, từ điển người dùng được lưu trữ trong một cookie. Tuy nhiên, kích thước cookie bị giới hạn. Khi người sử dụng từ điển phát triển đến điểm không thể được lưu trữ trong cookie, từ điển sẽ được lưu trữ trên máy chủ của chúng tôi. Để lưu trữ từ điển cá nhân của bạn trên máy chủ của chúng tôi, bạn nên xác định một tên cho từ điển của bạn. Nếu bạn đã có một cuốn từ điển được lưu trữ, xin vui lòng gõ tên của nó và nhấn vào nút Khôi phục.","dic_rename":"Thay tên","dic_restore":"Phục hồi","dictionariesTab":"Từ điển","disable":"Tắt SCAYT","emptyDic":"Tên của từ điển không được để trống.","enable":"Bật SCAYT","ignore":"Bỏ qua","ignoreAll":"Bỏ qua tất cả","ignoreDomainNames":"Bỏ qua tên miền","langs":"Ngôn ngữ","languagesTab":"Tab ngôn ngữ","mixedCase":"Không phân biệt loại chữ","mixedWithDigits":"Không phân biệt chữ và số","moreSuggestions":"Đề xuất thêm","opera_title":"Không hỗ trợ trên trình duyệt Opera","options":"Tùy chọn","optionsTab":"Tùy chọn","title":"Kiểm tra chính tả ngay khi gõ chữ (SCAYT)","toggle":"Bật tắt SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Kiểu","panelTitle":"Phong cách định dạng","panelTitle1":"Kiểu khối","panelTitle2":"Kiểu trực tiếp","panelTitle3":"Kiểu đối tượng"},"table":{"border":"Kích thước đường viền","caption":"Đầu đề","cell":{"menu":"Ô","insertBefore":"Chèn ô Phía trước","insertAfter":"Chèn ô Phía sau","deleteCell":"Xoá ô","merge":"Kết hợp ô","mergeRight":"Kết hợp sang phải","mergeDown":"Kết hợp xuống dưới","splitHorizontal":"Phân tách ô theo chiều ngang","splitVertical":"Phân tách ô theo chiều dọc","title":"Thuộc tính của ô","cellType":"Kiểu của ô","rowSpan":"Kết hợp hàng","colSpan":"Kết hợp cột","wordWrap":"Chữ liền hàng","hAlign":"Canh lề ngang","vAlign":"Canh lề dọc","alignBaseline":"Đường cơ sở","bgColor":"Màu nền","borderColor":"Màu viền","data":"Dữ liệu","header":"Đầu đề","yes":"Có","no":"Không","invalidWidth":"Chiều rộng của ô phải là một số nguyên.","invalidHeight":"Chiều cao của ô phải là một số nguyên.","invalidRowSpan":"Số hàng kết hợp phải là một số nguyên.","invalidColSpan":"Số cột kết hợp phải là một số nguyên.","chooseColor":"Chọn màu"},"cellPad":"Khoảng đệm giữ ô và nội dung","cellSpace":"Khoảng cách giữa các ô","column":{"menu":"Cột","insertBefore":"Chèn cột phía trước","insertAfter":"Chèn cột phía sau","deleteColumn":"Xoá cột"},"columns":"Số cột","deleteTable":"Xóa bảng","headers":"Đầu đề","headersBoth":"Cả hai","headersColumn":"Cột đầu tiên","headersNone":"Không có","headersRow":"Hàng đầu tiên","invalidBorder":"Kích cỡ của đường biên phải là một số nguyên.","invalidCellPadding":"Khoảng đệm giữa ô và nội dung phải là một số nguyên.","invalidCellSpacing":"Khoảng cách giữa các ô phải là một số nguyên.","invalidCols":"Số lượng cột phải là một số lớn hơn 0.","invalidHeight":"Chiều cao của bảng phải là một số nguyên.","invalidRows":"Số lượng hàng phải là một số lớn hơn 0.","invalidWidth":"Chiều rộng của bảng phải là một số nguyên.","menu":"Thuộc tính bảng","row":{"menu":"Hàng","insertBefore":"Chèn hàng phía trước","insertAfter":"Chèn hàng phía sau","deleteRow":"Xoá hàng"},"rows":"Số hàng","summary":"Tóm lược","title":"Thuộc tính bảng","toolbar":"Bảng","widthPc":"Phần trăm (%)","widthPx":"Điểm ảnh (px)","widthUnit":"Đơn vị"},"undo":{"redo":"Làm lại thao tác","undo":"Khôi phục thao tác"},"wsc":{"btnIgnore":"Bỏ qua","btnIgnoreAll":"Bỏ qua tất cả","btnReplace":"Thay thế","btnReplaceAll":"Thay thế tất cả","btnUndo":"Phục hồi lại","changeTo":"Chuyển thành","errorLoading":"Lỗi khi đang nạp dịch vụ ứng dụng: %s.","ieSpellDownload":"Chức năng kiểm tra chính tả chưa được cài đặt. Bạn có muốn tải về ngay bây giờ?","manyChanges":"Hoàn tất kiểm tra chính tả: %1 từ đã được thay đổi","noChanges":"Hoàn tất kiểm tra chính tả: Không có từ nào được thay đổi","noMispell":"Hoàn tất kiểm tra chính tả: Không có lỗi chính tả","noSuggestions":"- Không đưa ra gợi ý về từ -","notAvailable":"Xin lỗi, dịch vụ này hiện tại không có.","notInDic":"Không có trong từ điển","oneChange":"Hoàn tất kiểm tra chính tả: Một từ đã được thay đổi","progress":"Đang tiến hành kiểm tra chính tả...","title":"Kiểm tra chính tả","toolbar":"Kiểm tra chính tả"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/zh-cn.js b/htmltest/sites/all/libraries/ckeditor-version/lang/zh-cn.js
new file mode 100644
index 00000000..401e4698
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/zh-cn.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['zh-cn']={"editor":"所见即所得编辑器","common":{"editorHelp":"按 ALT+0 获得帮助","browseServer":"浏览服务器","url":"URL","protocol":"协议","upload":"上传","uploadSubmit":"上传到服务器","image":"图象","flash":"Flash","form":"表单","checkbox":"复选框","radio":"单选按钮","textField":"单行文本","textarea":"多行文本","hiddenField":"隐藏域","button":"按钮","select":"列表/菜单","imageButton":"图像按钮","notSet":"<没有设置>","id":"ID","name":"名称","langDir":"语言方向","langDirLtr":"从左到右 (LTR)","langDirRtl":"从右到左 (RTL)","langCode":"语言代码","longDescr":"详细说明 URL","cssClass":"样式类名称","advisoryTitle":"标题","cssStyle":"行内样式","ok":"确定","cancel":"取消","close":"关闭","preview":"预览","resize":"拖拽以改变大小","generalTab":"常规","advancedTab":"高级","validateNumberFailed":"需要输入数字格式","confirmNewPage":"当前文档内容未保存，是否确认新建文档？","confirmCancel":"部分修改尚未保存，是否确认关闭对话框？","options":"选项","target":"目标窗口","targetNew":"新窗口 (_blank)","targetTop":"整页 (_top)","targetSelf":"本窗口 (_self)","targetParent":"父窗口 (_parent)","langDirLTR":"从左到右 (LTR)","langDirRTL":"从右到左 (RTL)","styles":"样式","cssClasses":"样式类","width":"宽度","height":"高度","align":"对齐方式","alignLeft":"左对齐","alignRight":"右对齐","alignCenter":"居中","alignTop":"顶端","alignMiddle":"居中","alignBottom":"底部","invalidValue":"无效的值。","invalidHeight":"高度必须为数字格式","invalidWidth":"宽度必须为数字格式","invalidCssLength":"此“%1”字段的值必须为正数，可以包含或不包含一个有效的 CSS 长度单位(px, %, in, cm, mm, em, ex, pt 或 pc)","invalidHtmlLength":"此“%1”字段的值必须为正数，可以包含或不包含一个有效的 HTML 长度单位(px 或 %)","invalidInlineStyle":"内联样式必须为格式是以分号分隔的一个或多个“属性名 : 属性值”。","cssLengthTooltip":"输入一个表示像素值的数字，或加上一个有效的 CSS 长度单位(px, %, in, cm, mm, em, ex, pt 或 pc)。","unavailable":"%1<span class=\"cke_accessibility\">，不可用</span>"},"about":{"copy":"版权所有 &copy; $1。<br />保留所有权利。","dlgTitle":"关于 CKEditor","help":"访问 $1 以获取帮助。","moreInfo":"相关授权许可信息请访问我们的网站：","title":"关于 CKEditor","userGuide":"CKEditor 用户向导"},"basicstyles":{"bold":"加粗","italic":"倾斜","strike":"删除线","subscript":"下标","superscript":"上标","underline":"下划线"},"bidi":{"ltr":"文字方向为从左至右","rtl":"文字方向为从右至左"},"blockquote":{"toolbar":"块引用"},"clipboard":{"copy":"复制","copyError":"您的浏览器安全设置不允许编辑器自动执行复制操作，请使用键盘快捷键(Ctrl/Cmd+C)来完成。","cut":"剪切","cutError":"您的浏览器安全设置不允许编辑器自动执行剪切操作，请使用键盘快捷键(Ctrl/Cmd+X)来完成。","paste":"粘贴","pasteArea":"粘贴区域","pasteMsg":"请使用键盘快捷键(<STRONG>Ctrl/Cmd+V</STRONG>)把内容粘贴到下面的方框里，再按 <STRONG>确定</STRONG>","securityMsg":"因为您的浏览器的安全设置原因，本编辑器不能直接访问您的剪贴板内容，你需要在本窗口重新粘贴一次。","title":"粘贴"},"colorbutton":{"auto":"自动","bgColorTitle":"背景颜色","colors":{"000":"黑","800000":"褐红","8B4513":"深褐","2F4F4F":"墨绿","008080":"绿松石","000080":"海军蓝","4B0082":"靛蓝","696969":"暗灰","B22222":"砖红","A52A2A":"褐","DAA520":"金黄","006400":"深绿","40E0D0":"蓝绿","0000CD":"中蓝","800080":"紫","808080":"灰","F00":"红","FF8C00":"深橙","FFD700":"金","008000":"绿","0FF":"青","00F":"蓝","EE82EE":"紫罗兰","A9A9A9":"深灰","FFA07A":"亮橙","FFA500":"橙","FFFF00":"黄","00FF00":"水绿","AFEEEE":"粉蓝","ADD8E6":"亮蓝","DDA0DD":"梅红","D3D3D3":"淡灰","FFF0F5":"淡紫红","FAEBD7":"古董白","FFFFE0":"淡黄","F0FFF0":"蜜白","F0FFFF":"天蓝","F0F8FF":"淡蓝","E6E6FA":"淡紫","FFF":"白"},"more":"其它颜色...","panelTitle":"颜色","textColorTitle":"文本颜色"},"colordialog":{"clear":"清除","highlight":"高亮","options":"颜色选项","selected":"选择颜色","title":"选择颜色"},"templates":{"button":"模板","emptyListMsg":"(没有模板)","insertOption":"替换当前内容","options":"模板选项","selectPromptMsg":"请选择要在编辑器中使用的模板：","title":"内容模板"},"contextmenu":{"options":"快捷菜单选项"},"div":{"IdInputLabel":"ID","advisoryTitleInputLabel":"标题","cssClassInputLabel":"样式类名称","edit":"编辑 DIV","inlineStyleInputLabel":"行内样式","langDirLTRLabel":"从左到右 (LTR)","langDirLabel":"语言方向","langDirRTLLabel":"从右到左 (RTL)","languageCodeInputLabel":"语言代码","remove":"移除 DIV","styleSelectLabel":"样式","title":"创建 DIV 容器","toolbar":"创建 DIV 容器"},"toolbar":{"toolbarCollapse":"折叠工具栏","toolbarExpand":"展开工具栏","toolbarGroups":{"document":"文档","clipboard":"剪贴板/撤销","editing":"编辑","forms":"表单","basicstyles":"基本格式","paragraph":"段落","links":"链接","insert":"插入","styles":"样式","colors":"颜色","tools":"工具"},"toolbars":"工具栏"},"elementspath":{"eleLabel":"元素路径","eleTitle":"%1 元素"},"find":{"find":"查找","findOptions":"查找选项","findWhat":"查找:","matchCase":"区分大小写","matchCyclic":"循环匹配","matchWord":"全字匹配","notFoundMsg":"指定的文本没有找到。","replace":"替换","replaceAll":"全部替换","replaceSuccessMsg":"共完成 %1 处替换。","replaceWith":"替换:","title":"查找和替换"},"fakeobjects":{"anchor":"锚点","flash":"Flash 动画","hiddenfield":"隐藏域","iframe":"IFrame","unknown":"未知对象"},"flash":{"access":"允许脚本访问","accessAlways":"总是","accessNever":"从不","accessSameDomain":"同域","alignAbsBottom":"绝对底部","alignAbsMiddle":"绝对居中","alignBaseline":"基线","alignTextTop":"文本上方","bgcolor":"背景颜色","chkFull":"启用全屏","chkLoop":"循环","chkMenu":"启用 Flash 菜单","chkPlay":"自动播放","flashvars":"Flash 变量","hSpace":"水平间距","properties":"Flash 属性","propertiesTab":"属性","quality":"质量","qualityAutoHigh":"高(自动)","qualityAutoLow":"低(自动)","qualityBest":"最好","qualityHigh":"高","qualityLow":"低","qualityMedium":"中(自动)","scale":"缩放","scaleAll":"全部显示","scaleFit":"严格匹配","scaleNoBorder":"无边框","title":"标题","vSpace":"垂直间距","validateHSpace":"水平间距必须为数字格式","validateSrc":"请输入源文件地址","validateVSpace":"垂直间距必须为数字格式","windowMode":"窗体模式","windowModeOpaque":"不透明","windowModeTransparent":"透明","windowModeWindow":"窗体"},"font":{"fontSize":{"label":"大小","voiceLabel":"文字大小","panelTitle":"大小"},"label":"字体","panelTitle":"字体","voiceLabel":"字体"},"forms":{"button":{"title":"按钮属性","text":"标签(值)","type":"类型","typeBtn":"按钮","typeSbm":"提交","typeRst":"重设"},"checkboxAndRadio":{"checkboxTitle":"复选框属性","radioTitle":"单选按钮属性","value":"选定值","selected":"已勾选"},"form":{"title":"表单属性","menu":"表单属性","action":"动作","method":"方法","encoding":"表单编码"},"hidden":{"title":"隐藏域属性","name":"名称","value":"初始值"},"select":{"title":"菜单/列表属性","selectInfo":"选择信息","opAvail":"可选项","value":"值","size":"高度","lines":"行","chkMulti":"允许多选","opText":"选项文本","opValue":"选项值","btnAdd":"添加","btnModify":"修改","btnUp":"上移","btnDown":"下移","btnSetValue":"设为初始选定","btnDelete":"删除"},"textarea":{"title":"多行文本属性","cols":"字符宽度","rows":"行数"},"textfield":{"title":"单行文本属性","name":"名称","value":"初始值","charWidth":"字符宽度","maxChars":"最多字符数","type":"类型","typeText":"文本","typePass":"密码","typeEmail":"Email","typeSearch":"搜索","typeTel":"电话号码","typeUrl":"地址"}},"format":{"label":"格式","panelTitle":"格式","tag_address":"地址","tag_div":"段落(DIV)","tag_h1":"标题 1","tag_h2":"标题 2","tag_h3":"标题 3","tag_h4":"标题 4","tag_h5":"标题 5","tag_h6":"标题 6","tag_p":"普通","tag_pre":"已编排格式"},"horizontalrule":{"toolbar":"插入水平线"},"iframe":{"border":"显示框架边框","noUrl":"请输入框架的 URL","scrolling":"允许滚动条","title":"IFrame 属性","toolbar":"IFrame"},"image":{"alertUrl":"请输入图象地址","alt":"替换文本","border":"边框大小","btnUpload":"上传到服务器","button2Img":"确定要把当前图像按钮转换为普通图像吗？","hSpace":"水平间距","img2Button":"确定要把当前图像改变为图像按钮吗？","infoTab":"图象","linkTab":"链接","lockRatio":"锁定比例","menu":"图象属性","resetSize":"原始尺寸","title":"图象属性","titleButton":"图像域属性","upload":"上传","urlMissing":"缺少图像源文件地址","vSpace":"垂直间距","validateBorder":"边框大小必须为整数格式","validateHSpace":"水平间距必须为整数格式","validateVSpace":"垂直间距必须为整数格式"},"indent":{"indent":"增加缩进量","outdent":"减少缩进量"},"smiley":{"options":"表情图标选项","title":"插入表情图标","toolbar":"表情符"},"justify":{"block":"两端对齐","center":"居中","left":"左对齐","right":"右对齐"},"link":{"acccessKey":"访问键","advanced":"高级","advisoryContentType":"内容类型","advisoryTitle":"标题","anchor":{"toolbar":"插入/编辑锚点链接","menu":"锚点链接属性","title":"锚点链接属性","name":"锚点名称","errorName":"请输入锚点名称","remove":"删除锚点"},"anchorId":"按锚点 ID","anchorName":"按锚点名称","charset":"字符编码","cssClasses":"样式类名称","emailAddress":"地址","emailBody":"内容","emailSubject":"主题","id":"ID","info":"超链接信息","langCode":"语言代码","langDir":"语言方向","langDirLTR":"从左到右 (LTR)","langDirRTL":"从右到左 (RTL)","menu":"编辑超链接","name":"名称","noAnchors":"(此文档没有可用的锚点)","noEmail":"请输入电子邮件地址","noUrl":"请输入超链接地址","other":"<其他>","popupDependent":"依附 (NS)","popupFeatures":"弹出窗口属性","popupFullScreen":"全屏 (IE)","popupLeft":"左","popupLocationBar":"地址栏","popupMenuBar":"菜单栏","popupResizable":"可缩放","popupScrollBars":"滚动条","popupStatusBar":"状态栏","popupToolbar":"工具栏","popupTop":"右","rel":"关联","selectAnchor":"选择一个锚点","styles":"行内样式","tabIndex":"Tab 键次序","target":"目标","targetFrame":"<框架>","targetFrameName":"目标框架名称","targetPopup":"<弹出窗口>","targetPopupName":"弹出窗口名称","title":"超链接","toAnchor":"页内锚点链接","toEmail":"电子邮件","toUrl":"地址","toolbar":"插入/编辑超链接","type":"超链接类型","unlink":"取消超链接","upload":"上传"},"list":{"bulletedlist":"项目列表","numberedlist":"编号列表"},"liststyle":{"armenian":"传统的亚美尼亚编号方式","bulletedTitle":"项目列表属性","circle":"空心圆","decimal":"数字 (1, 2, 3, 等)","decimalLeadingZero":"0开头的数字标记(01, 02, 03, 等)","disc":"实心圆","georgian":"传统的乔治亚编号方式(an, ban, gan, 等)","lowerAlpha":"小写英文字母(a, b, c, d, e, 等)","lowerGreek":"小写希腊字母(alpha, beta, gamma, 等)","lowerRoman":"小写罗马数字(i, ii, iii, iv, v, 等)","none":"无标记","notset":"<没有设置>","numberedTitle":"编号列表属性","square":"实心方块","start":"开始序号","type":"标记类型","upperAlpha":"大写英文字母(A, B, C, D, E, 等)","upperRoman":"大写罗马数字(I, II, III, IV, V, 等)","validateStartNumber":"列表开始序号必须为整数格式"},"magicline":{"title":"在这插入段落"},"maximize":{"maximize":"全屏","minimize":"最小化"},"newpage":{"toolbar":"新建"},"pagebreak":{"alt":"分页符","toolbar":"插入打印分页符"},"pastetext":{"button":"粘贴为无格式文本","title":"粘贴为无格式文本"},"pastefromword":{"confirmCleanup":"您要粘贴的内容好像是来自 MS Word，是否要清除 MS Word 格式后再粘贴？","error":"由于内部错误无法清理要粘贴的数据","title":"从 MS Word 粘贴","toolbar":"从 MS Word 粘贴"},"preview":{"preview":"预览"},"print":{"toolbar":"打印"},"removeformat":{"toolbar":"清除格式"},"save":{"toolbar":"保存"},"selectall":{"toolbar":"全选"},"showblocks":{"toolbar":"显示区块"},"sourcearea":{"toolbar":"源码"},"specialchar":{"options":"特殊符号选项","title":"选择特殊符号","toolbar":"插入特殊符号"},"scayt":{"about":"关于即时拼写检查","aboutTab":"关于","addWord":"添加单词","allCaps":"忽略所有大写单词","dic_create":"创建","dic_delete":"删除","dic_field_name":"字典名称","dic_info":"一开始用户词典储存在 Cookie 中, 但是 Cookies 的容量是有限的, 当用户词典增长到超出 Cookie 限制时就无法再储存了, 这时您可以将词典储存到我们的服务器上. 要把您的个人词典到储存到我们的服务器上的话, 需要为您的词典指定一个名称, 如果您在我们的服务器上已经有储存有一个词典, 请输入词典名称并按还原按钮.","dic_rename":"重命名","dic_restore":"还原","dictionariesTab":"字典","disable":"禁用即时拼写检查","emptyDic":"字典名不应为空.","enable":"启用即时拼写检查","ignore":"忽略","ignoreAll":"全部忽略","ignoreDomainNames":"忽略域名","langs":"语言","languagesTab":"语言","mixedCase":"忽略大小写混合的单词","mixedWithDigits":"忽略带数字的单词","moreSuggestions":"更多拼写建议","opera_title":"不支持 Opera 浏览器","options":"选项","optionsTab":"选项","title":"即时拼写检查","toggle":"暂停/启用即时拼写检查","noSuggestions":"No suggestion"},"stylescombo":{"label":"样式","panelTitle":"样式","panelTitle1":"块级元素样式","panelTitle2":"内联元素样式","panelTitle3":"对象元素样式"},"table":{"border":"边框","caption":"标题","cell":{"menu":"单元格","insertBefore":"在左侧插入单元格","insertAfter":"在右侧插入单元格","deleteCell":"删除单元格","merge":"合并单元格","mergeRight":"向右合并单元格","mergeDown":"向下合并单元格","splitHorizontal":"水平拆分单元格","splitVertical":"垂直拆分单元格","title":"单元格属性","cellType":"单元格类型","rowSpan":"纵跨行数","colSpan":"横跨列数","wordWrap":"自动换行","hAlign":"水平对齐","vAlign":"垂直对齐","alignBaseline":"基线","bgColor":"背景颜色","borderColor":"边框颜色","data":"数据","header":"表头","yes":"是","no":"否","invalidWidth":"单元格宽度必须为数字格式","invalidHeight":"单元格高度必须为数字格式","invalidRowSpan":"行跨度必须为整数格式","invalidColSpan":"列跨度必须为整数格式","chooseColor":"选择"},"cellPad":"边距","cellSpace":"间距","column":{"menu":"列","insertBefore":"在左侧插入列","insertAfter":"在右侧插入列","deleteColumn":"删除列"},"columns":"列数","deleteTable":"删除表格","headers":"标题单元格","headersBoth":"第一列和第一行","headersColumn":"第一列","headersNone":"无","headersRow":"第一行","invalidBorder":"边框粗细必须为数字格式","invalidCellPadding":"单元格填充必须为数字格式","invalidCellSpacing":"单元格间距必须为数字格式","invalidCols":"指定的行数必须大于零","invalidHeight":"表格高度必须为数字格式","invalidRows":"指定的列数必须大于零","invalidWidth":"表格宽度必须为数字格式","menu":"表格属性","row":{"menu":"行","insertBefore":"在上方插入行","insertAfter":"在下方插入行","deleteRow":"删除行"},"rows":"行数","summary":"摘要","title":"表格属性","toolbar":"表格","widthPc":"百分比","widthPx":"像素","widthUnit":"宽度单位"},"undo":{"redo":"重做","undo":"撤消"},"wsc":{"btnIgnore":"忽略","btnIgnoreAll":"全部忽略","btnReplace":"替换","btnReplaceAll":"全部替换","btnUndo":"撤消","changeTo":"更改为","errorLoading":"加载应该服务主机时出错: %s.","ieSpellDownload":"拼写检查插件还没安装, 您是否想现在就下载?","manyChanges":"拼写检查完成: 更改了 %1 个单词","noChanges":"拼写检查完成: 没有更改任何单词","noMispell":"拼写检查完成: 没有发现拼写错误","noSuggestions":"- 没有建议 -","notAvailable":"抱歉, 服务目前暂不可用","notInDic":"没有在字典里","oneChange":"拼写检查完成: 更改了一个单词","progress":"正在进行拼写检查...","title":"拼写检查","toolbar":"拼写检查"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/lang/zh.js b/htmltest/sites/all/libraries/ckeditor-version/lang/zh.js
new file mode 100644
index 00000000..61763ed9
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/lang/zh.js
@@ -0,0 +1,5 @@
+﻿/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['zh']={"editor":"富文本編輯器","common":{"editorHelp":"按 ALT+0 以獲得幫助","browseServer":"瀏覽伺服器端","url":"URL","protocol":"通訊協定","upload":"上傳","uploadSubmit":"上傳至伺服器","image":"影像","flash":"Flash","form":"表單","checkbox":"核取方塊","radio":"選項按鈕","textField":"文字方塊","textarea":"文字區域","hiddenField":"隱藏欄位","button":"按鈕","select":"清單/選單","imageButton":"影像按鈕","notSet":"<尚未設定>","id":"ID","name":"名稱","langDir":"語言方向","langDirLtr":"由左而右 (LTR)","langDirRtl":"由右而左 (RTL)","langCode":"語言代碼","longDescr":"詳細 URL","cssClass":"樣式表類別","advisoryTitle":"標題","cssStyle":"樣式","ok":"確定","cancel":"取消","close":"关闭","preview":"预览","resize":"拖拽改變大小","generalTab":"一般","advancedTab":"進階","validateNumberFailed":"需要輸入數字格式","confirmNewPage":"現存的修改尚未儲存，要開新檔案？","confirmCancel":"部份選項尚未儲存，要關閉對話盒？","options":"选项","target":"目标","targetNew":"新窗口(_blank)","targetTop":"整页(_top)","targetSelf":"本窗口(_self)","targetParent":"父窗口(_parent)","langDirLTR":"由左而右 (LTR)","langDirRTL":"由右而左 (RTL)","styles":"樣式","cssClasses":"樣式表類別","width":"寬度","height":"高度","align":"對齊","alignLeft":"靠左對齊","alignRight":"靠右對齊","alignCenter":"置中","alignTop":"靠上對齊","alignMiddle":"置中對齊","alignBottom":"靠下對齊","invalidValue":"Invalid value.","invalidHeight":"高度必須為數字格式","invalidWidth":"寬度必須為數字格式","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, 已關閉</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"關於 CKEditor","help":"Check $1 for help.","moreInfo":"訪問我們的網站以獲取更多關於協議的信息","title":"關於 CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"粗體","italic":"斜體","strike":"刪除線","subscript":"下標","superscript":"上標","underline":"底線"},"bidi":{"ltr":"Text direction from left to right","rtl":"Text direction from right to left"},"blockquote":{"toolbar":"引用文字"},"clipboard":{"copy":"複製","copyError":"瀏覽器的安全性設定不允許編輯器自動執行複製動作。請使用快捷鍵 (Ctrl/Cmd+C) 複製。","cut":"剪下","cutError":"瀏覽器的安全性設定不允許編輯器自動執行剪下動作。請使用快捷鍵 (Ctrl/Cmd+X) 剪下。","paste":"貼上","pasteArea":"Paste Area","pasteMsg":"請使用快捷鍵 (<strong>Ctrl/Cmd+V</strong>) 貼到下方區域中並按下 <strong>確定</strong>","securityMsg":"因為瀏覽器的安全性設定，本編輯器無法直接存取您的剪貼簿資料，請您自行在本視窗進行貼上動作。","title":"貼上"},"colorbutton":{"auto":"自動","bgColorTitle":"背景顏色","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"更多顏色…","panelTitle":"Colors","textColorTitle":"文字顏色"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"templates":{"button":"樣版","emptyListMsg":"(無樣版)","insertOption":"取代原有內容","options":"Template Options","selectPromptMsg":"請選擇欲開啟的樣版<br> (原有的內容將會被清除):","title":"內容樣版"},"contextmenu":{"options":"Context Menu Options"},"div":{"IdInputLabel":"Id","advisoryTitleInputLabel":"Advisory Title","cssClassInputLabel":"Stylesheet Classes","edit":"Edit Div","inlineStyleInputLabel":"Inline Style","langDirLTRLabel":"Left to Right (LTR)","langDirLabel":"Language Direction","langDirRTLLabel":"Right to Left (RTL)","languageCodeInputLabel":" Language Code","remove":"Remove Div","styleSelectLabel":"Style","title":"Create Div Container","toolbar":"Create Div Container"},"toolbar":{"toolbarCollapse":"折叠工具栏","toolbarExpand":"展开工具栏","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"編輯器工具欄"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 元素"},"find":{"find":"尋找","findOptions":"Find Options","findWhat":"尋找:","matchCase":"大小寫須相符","matchCyclic":"循環搜索","matchWord":"全字相符","notFoundMsg":"未找到指定的文字。","replace":"取代","replaceAll":"全部取代","replaceSuccessMsg":"共完成 %1 次取代","replaceWith":"取代:","title":"尋找與取代"},"fakeobjects":{"anchor":"錨點","flash":"Flash 動畫","hiddenfield":"隱藏欄位","iframe":"IFrame","unknown":"不明物件"},"flash":{"access":"允許腳本訪問","accessAlways":"永遠","accessNever":"永不","accessSameDomain":"相同域名","alignAbsBottom":"絕對下方","alignAbsMiddle":"絕對中間","alignBaseline":"基準線","alignTextTop":"文字上方","bgcolor":"背景顏色","chkFull":"啟動全螢幕顯示","chkLoop":"重複","chkMenu":"開啟選單","chkPlay":"自動播放","flashvars":"Flash 變數","hSpace":"水平距離","properties":"Flash 屬性","propertiesTab":"屬性","quality":"質素","qualityAutoHigh":"高（自動）","qualityAutoLow":"低（自動）","qualityBest":"最好","qualityHigh":"高","qualityLow":"低","qualityMedium":"中（自動）","scale":"縮放","scaleAll":"全部顯示","scaleFit":"精確符合","scaleNoBorder":"無邊框","title":"Flash 屬性","vSpace":"垂直距離","validateHSpace":"水平間距必須為數字格式","validateSrc":"請輸入欲連結的 URL","validateVSpace":"垂直間距必須為數字格式","windowMode":"視窗模式","windowModeOpaque":"不透明","windowModeTransparent":"透明","windowModeWindow":"視窗"},"font":{"fontSize":{"label":"大小","voiceLabel":"文字大小","panelTitle":"大小"},"label":"字體","panelTitle":"字體","voiceLabel":"字體"},"forms":{"button":{"title":"按鈕屬性","text":"顯示文字 (值)","type":"類型","typeBtn":"按鈕 (Button)","typeSbm":"送出 (Submit)","typeRst":"重設 (Reset)"},"checkboxAndRadio":{"checkboxTitle":"核取方塊屬性","radioTitle":"選項按鈕屬性","value":"選取值","selected":"已選取"},"form":{"title":"表單屬性","menu":"表單屬性","action":"動作","method":"方法","encoding":"表單編碼"},"hidden":{"title":"隱藏欄位屬性","name":"名稱","value":"值"},"select":{"title":"清單/選單屬性","selectInfo":"資訊","opAvail":"可用選項","value":"值","size":"大小","lines":"行","chkMulti":"可多選","opText":"顯示文字","opValue":"選取值","btnAdd":"新增","btnModify":"修改","btnUp":"上移","btnDown":"下移","btnSetValue":"設為預設值","btnDelete":"刪除"},"textarea":{"title":"文字區域屬性","cols":"字元寬度","rows":"列數"},"textfield":{"title":"文字方塊屬性","name":"名稱","value":"值","charWidth":"字元寬度","maxChars":"最多字元數","type":"類型","typeText":"文字","typePass":"密碼","typeEmail":"Email","typeSearch":"Search","typeTel":"Telephone Number","typeUrl":"URL"}},"format":{"label":"格式","panelTitle":"格式","tag_address":"位址","tag_div":"一般 (DIV)","tag_h1":"標題 1","tag_h2":"標題 2","tag_h3":"標題 3","tag_h4":"標題 4","tag_h5":"標題 5","tag_h6":"標題 6","tag_p":"一般","tag_pre":"已格式化"},"horizontalrule":{"toolbar":"插入水平線"},"iframe":{"border":"Show frame border","noUrl":"Please type the iframe URL","scrolling":"Enable scrollbars","title":"IFrame Properties","toolbar":"IFrame"},"image":{"alertUrl":"請輸入影像 URL","alt":"替代文字","border":"邊框","btnUpload":"上傳至伺服器","button2Img":"要把影像按鈕改成影像嗎？","hSpace":"水平距離","img2Button":"要把影像改成影像按鈕嗎？","infoTab":"影像資訊","linkTab":"超連結","lockRatio":"等比例","menu":"影像屬性","resetSize":"重設為原大小","title":"影像屬性","titleButton":"影像按鈕屬性","upload":"上傳","urlMissing":"Image source URL is missing.","vSpace":"垂直距離","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"增加縮排","outdent":"減少縮排"},"smiley":{"options":"Smiley Options","title":"插入表情符號","toolbar":"表情符號"},"justify":{"block":"左右對齊","center":"置中","left":"靠左對齊","right":"靠右對齊"},"link":{"acccessKey":"存取鍵","advanced":"進階","advisoryContentType":"內容類型","advisoryTitle":"標題","anchor":{"toolbar":"插入/編輯錨點","menu":"錨點屬性","title":"錨點屬性","name":"錨點名稱","errorName":"請輸入錨點名稱","remove":"Remove Anchor"},"anchorId":"依元件 ID","anchorName":"依錨點名稱","charset":"連結資源之編碼","cssClasses":"樣式表類別","emailAddress":"電子郵件","emailBody":"郵件內容","emailSubject":"郵件主旨","id":"ID","info":"超連結資訊","langCode":"語言方向","langDir":"語言方向","langDirLTR":"由左而右 (LTR)","langDirRTL":"由右而左 (RTL)","menu":"編輯超連結","name":"名稱","noAnchors":"(本文件尚無可用之錨點)","noEmail":"請輸入電子郵件位址","noUrl":"請輸入欲連結的 URL","other":"<其他>","popupDependent":"從屬 (NS)","popupFeatures":"快顯視窗屬性","popupFullScreen":"全螢幕 (IE)","popupLeft":"左","popupLocationBar":"網址列","popupMenuBar":"選單列","popupResizable":"可縮放","popupScrollBars":"捲軸","popupStatusBar":"狀態列","popupToolbar":"工具列","popupTop":"右","rel":"Relationship","selectAnchor":"請選擇錨點","styles":"樣式","tabIndex":"定位順序","target":"目標","targetFrame":"<框架>","targetFrameName":"目標框架名稱","targetPopup":"<快顯視窗>","targetPopupName":"快顯視窗名稱","title":"超連結","toAnchor":"本頁錨點","toEmail":"電子郵件","toUrl":"URL","toolbar":"插入/編輯超連結","type":"超連接類型","unlink":"移除超連結","upload":"上傳"},"list":{"bulletedlist":"項目清單","numberedlist":"編號清單"},"liststyle":{"armenian":"Armenian numbering","bulletedTitle":"Bulleted List Properties","circle":"Circle","decimal":"Decimal (1, 2, 3, etc.)","decimalLeadingZero":"Decimal leading zero (01, 02, 03, etc.)","disc":"Disc","georgian":"Georgian numbering (an, ban, gan, etc.)","lowerAlpha":"Lower Alpha (a, b, c, d, e, etc.)","lowerGreek":"Lower Greek (alpha, beta, gamma, etc.)","lowerRoman":"Lower Roman (i, ii, iii, iv, v, etc.)","none":"None","notset":"<not set>","numberedTitle":"Numbered List Properties","square":"Square","start":"Start","type":"Type","upperAlpha":"Upper Alpha (A, B, C, D, E, etc.)","upperRoman":"Upper Roman (I, II, III, IV, V, etc.)","validateStartNumber":"List start number must be a whole number."},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"最大化","minimize":"最小化"},"newpage":{"toolbar":"開新檔案"},"pagebreak":{"alt":"分頁符號","toolbar":"插入分頁符號"},"pastetext":{"button":"貼為純文字格式","title":"貼為純文字格式"},"pastefromword":{"confirmCleanup":"您想貼上的文字似乎是自 Word 複製而來，請問您是否要先清除 Word 的格式後再行貼上？","error":"It was not possible to clean up the pasted data due to an internal error","title":"自 Word 貼上","toolbar":"自 Word 貼上"},"preview":{"preview":"預覽"},"print":{"toolbar":"列印"},"removeformat":{"toolbar":"清除格式"},"save":{"toolbar":"儲存"},"selectall":{"toolbar":"全選"},"showblocks":{"toolbar":"顯示區塊"},"sourcearea":{"toolbar":"原始碼"},"specialchar":{"options":"Special Character Options","title":"請選擇特殊符號","toolbar":"插入特殊符號"},"scayt":{"about":"關於即時拼寫檢查","aboutTab":"關於","addWord":"添加單詞","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"字典","disable":"關閉即時拼寫檢查","emptyDic":"字典名不應為空.","enable":"啟用即時拼寫檢查","ignore":"忽略","ignoreAll":"全部忽略","ignoreDomainNames":"Ignore Domain Names","langs":"語言","languagesTab":"語言","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"更多拼寫建議","opera_title":"Not supported by Opera","options":"選項","optionsTab":"選項","title":"即時拼寫檢查","toggle":"啟用／關閉即時拼寫檢查","noSuggestions":"No suggestion"},"stylescombo":{"label":"樣式","panelTitle":"Formatting Styles","panelTitle1":"塊級元素樣式","panelTitle2":"內聯元素樣式","panelTitle3":"物件元素樣式"},"table":{"border":"邊框","caption":"標題","cell":{"menu":"儲存格","insertBefore":"向左插入儲存格","insertAfter":"向右插入儲存格","deleteCell":"刪除儲存格","merge":"合併儲存格","mergeRight":"向右合併儲存格","mergeDown":"向下合併儲存格","splitHorizontal":"橫向分割儲存格","splitVertical":"縱向分割儲存格","title":"儲存格屬性","cellType":"儲存格類別","rowSpan":"儲存格列數","colSpan":"儲存格欄數","wordWrap":"自動換行","hAlign":"水平對齊","vAlign":"垂直對齊","alignBaseline":"基線對齊","bgColor":"背景顏色","borderColor":"邊框顏色","data":"數據","header":"標題","yes":"是","no":"否","invalidWidth":"儲存格寬度必須為數字格式","invalidHeight":"儲存格高度必須為數字格式","invalidRowSpan":"儲存格列數必須為整數格式","invalidColSpan":"儲存格欄數度必須為整數格式","chooseColor":"Choose"},"cellPad":"內距","cellSpace":"間距","column":{"menu":"欄","insertBefore":"向左插入欄","insertAfter":"向右插入欄","deleteColumn":"刪除欄"},"columns":"欄數","deleteTable":"刪除表格","headers":"標題","headersBoth":"第一欄和第一列","headersColumn":"第一欄","headersNone":"無標題","headersRow":"第一列","invalidBorder":"邊框大小必須為數字格式","invalidCellPadding":"儲存格內距必須為數字格式","invalidCellSpacing":"儲存格間距必須為數字格式","invalidCols":"必須有一或更多的欄","invalidHeight":"表格高度必須為數字格式","invalidRows":"必須有一或更多的列","invalidWidth":"表格寬度必須為數字格式","menu":"表格屬性","row":{"menu":"列","insertBefore":"向上插入列","insertAfter":"向下插入列","deleteRow":"刪除列"},"rows":"列數","summary":"摘要","title":"表格屬性","toolbar":"表格","widthPc":"百分比","widthPx":"像素","widthUnit":"width unit"},"undo":{"redo":"重複","undo":"復原"},"wsc":{"btnIgnore":"忽略","btnIgnoreAll":"全部忽略","btnReplace":"取代","btnReplaceAll":"全部取代","btnUndo":"復原","changeTo":"更改為","errorLoading":"無法聯系侍服器: %s.","ieSpellDownload":"尚未安裝拼字檢查元件。您是否想要現在下載？","manyChanges":"拼字檢查完成：更改了 %1 個單字","noChanges":"拼字檢查完成：未更改任何單字","noMispell":"拼字檢查完成：未發現拼字錯誤","noSuggestions":"- 無建議值 -","notAvailable":"抱歉，服務目前暫不可用","notInDic":"不在字典中","oneChange":"拼字檢查完成：更改了 1 個單字","progress":"進行拼字檢查中…","title":"拼字檢查","toolbar":"拼字檢查"}};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/a11yhelp.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/a11yhelp.js
new file mode 100644
index 00000000..b77792a0
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/a11yhelp.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("a11yHelp",function(j){var l=j.lang.a11yhelp,m=CKEDITOR.tools.getNextId(),d={8:"BACKSPACE",9:"TAB",13:"ENTER",16:"SHIFT",17:"CTRL",18:"ALT",19:"PAUSE",20:"CAPSLOCK",27:"ESCAPE",33:"PAGE UP",34:"PAGE DOWN",35:"END",36:"HOME",37:"LEFT ARROW",38:"UP ARROW",39:"RIGHT ARROW",40:"DOWN ARROW",45:"INSERT",46:"DELETE",91:"LEFT WINDOW KEY",92:"RIGHT WINDOW KEY",93:"SELECT KEY",96:"NUMPAD  0",97:"NUMPAD  1",98:"NUMPAD  2",99:"NUMPAD  3",100:"NUMPAD  4",101:"NUMPAD  5",102:"NUMPAD  6",103:"NUMPAD  7",
+104:"NUMPAD  8",105:"NUMPAD  9",106:"MULTIPLY",107:"ADD",109:"SUBTRACT",110:"DECIMAL POINT",111:"DIVIDE",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NUM LOCK",145:"SCROLL LOCK",186:"SEMI-COLON",187:"EQUAL SIGN",188:"COMMA",189:"DASH",190:"PERIOD",191:"FORWARD SLASH",192:"GRAVE ACCENT",219:"OPEN BRACKET",220:"BACK SLASH",221:"CLOSE BRAKET",222:"SINGLE QUOTE"};d[CKEDITOR.ALT]="ALT";d[CKEDITOR.SHIFT]="SHIFT";d[CKEDITOR.CTRL]="CTRL";
+var e=[CKEDITOR.ALT,CKEDITOR.SHIFT,CKEDITOR.CTRL],n=/\$\{(.*?)\}/g,q=function(){var o=j.keystrokeHandler.keystrokes,f={},b;for(b in o)f[o[b]]=b;return function(b,g){var a;if(f[g]){a=f[g];for(var h,i,k=[],c=0;c<e.length;c++)i=e[c],h=a/e[c],1<h&&2>=h&&(a-=i,k.push(d[i]));k.push(d[a]||String.fromCharCode(a));a=k.join("+")}else a=b;return a}}();return{title:l.title,minWidth:600,minHeight:400,contents:[{id:"info",label:j.lang.common.generalTab,expand:!0,elements:[{type:"html",id:"legends",style:"white-space:normal;",
+focus:function(){this.getElement().focus()},html:function(){for(var d='<div class="cke_accessibility_legend" role="document" aria-labelledby="'+m+'_arialbl" tabIndex="-1">%1</div><span id="'+m+'_arialbl" class="cke_voice_label">'+l.contents+" </span>",f=[],b=l.legend,j=b.length,g=0;g<j;g++){for(var a=b[g],h=[],i=a.items,k=i.length,c=0;c<k;c++){var e=i[c],p=e.legend.replace(n,q);p.match(n)||h.push("<dt>%1</dt><dd>%2</dd>".replace("%1",e.name).replace("%2",p))}f.push("<h1>%1</h1><dl>%2</dl>".replace("%1",
+a.name).replace("%2",h.join("")))}return d.replace("%1",f.join(""))}()+'<style type="text/css">.cke_accessibility_legend{width:600px;height:400px;padding-right:5px;overflow-y:auto;overflow-x:hidden;}.cke_browser_quirks .cke_accessibility_legend,.cke_browser_ie6 .cke_accessibility_legend{height:390px}.cke_accessibility_legend *{white-space:normal;}.cke_accessibility_legend h1{font-size: 20px;border-bottom: 1px solid #AAA;margin: 5px 0px 15px;}.cke_accessibility_legend dl{margin-left: 5px;}.cke_accessibility_legend dt{font-size: 13px;font-weight: bold;}.cke_accessibility_legend dd{margin:10px}</style>'}]}],
+buttons:[CKEDITOR.dialog.cancelButton]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/_translationstatus.txt b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/_translationstatus.txt
new file mode 100644
index 00000000..0db2f1ec
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/_translationstatus.txt
@@ -0,0 +1,25 @@
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+
+cs.js      Found: 30 Missing: 0
+cy.js      Found: 30 Missing: 0
+da.js      Found: 12 Missing: 18
+de.js      Found: 30 Missing: 0
+el.js      Found: 25 Missing: 5
+eo.js      Found: 30 Missing: 0
+fa.js      Found: 30 Missing: 0
+fi.js      Found: 30 Missing: 0
+fr.js      Found: 30 Missing: 0
+gu.js      Found: 12 Missing: 18
+he.js      Found: 30 Missing: 0
+it.js      Found: 30 Missing: 0
+mk.js      Found: 5 Missing: 25
+nb.js      Found: 30 Missing: 0
+nl.js      Found: 30 Missing: 0
+no.js      Found: 30 Missing: 0
+pt-br.js   Found: 30 Missing: 0
+ro.js      Found: 6 Missing: 24
+tr.js      Found: 30 Missing: 0
+ug.js      Found: 27 Missing: 3
+vi.js      Found: 6 Missing: 24
+zh-cn.js   Found: 30 Missing: 0
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ar.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ar.js
new file mode 100644
index 00000000..8aa03284
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ar.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ar",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"عام",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/bg.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/bg.js
new file mode 100644
index 00000000..486e22ef
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/bg.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","bg",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Общо",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ca.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ca.js
new file mode 100644
index 00000000..53b670ae
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ca.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ca",{title:"Instruccions d'Accessibilitat",contents:"Continguts de l'Ajuda. Per tancar aquest quadre de diàleg premi ESC.",legend:[{name:"General",items:[{name:"Editor de barra d'eines",legend:"Premi ${toolbarFocus} per desplaçar-se per la barra d'eines. Vagi en el següent i anterior grup de barra d'eines amb TAB i SHIFT-TAB. Vagi en el següent i anterior botó de la barra d'eines amb RIGHT ARROW i LEFT ARROW. Premi SPACE o ENTER per activar el botó de la barra d'eines."},
+{name:"Editor de quadre de diàleg",legend:"Dins d'un quadre de diàleg, premi la tecla TAB per desplaçar-se al següent camp del quadre de diàleg, premi SHIFT + TAB per desplaçar-se a l'anterior camp, premi ENTER per acceptar el quadre de diàleg, premi ESC per cancel·lar el quadre de diàleg. Per els quadres de diàleg que tenen diverses pestanyes, premi ALT + F10 per anar a la llista de pestanyes. Després podrà desplaçar-se a la següent pestanya amb TAB o RIGHT ARROW. Anar a la pestanya anterior amb SHIFT + TAB o LEFT ARROW. Premi SPACE o ENTER per seleccionar la pestanya."},
+{name:"Editor de menú contextual",legend:"Premi ${contextMenu} o APPLICATION KEY per obrir el menú contextual. Després desplacis a la següent opció del menú amb TAB o DOWN ARROW. Desplacis a l'anterior opció amb SHIFT+TAB o UP ARROW. Premi SPACE o ENTER per seleccionar l'opció del menú. Obri el submenú de l'actual opció utilitzant SPACE o ENTER o RIGHT ARROW. Pot tornar a l'opció del menú pare amb ESC o LEFT ARROW. Tanqui el menú contextual amb ESC."},{name:"Editor de caixa de llista",legend:"Dins d'un quadre de llista, desplacis al següent element de la llista amb TAB o DOWN ARROW. Desplacis a l'anterior element de la llista amb SHIFT + TAB o UP ARROW. Premi SPACE o ENTER per seleccionar l'opció de la llista. Premi ESC per tancar el quadre de llista."},
+{name:"Editor de barra de ruta de l'element",legend:"Premi ${elementsPathFocus} per anar als elements de la barra de ruta. Desplacis al botó de l'element següent amb TAB o RIGHT ARROW. Desplacis a l'anterior botó amb  SHIFT+TAB o LEFT ARROW. Premi SPACE o ENTER per seleccionar l'element a l'editor."}]},{name:"Ordres",items:[{name:"Desfer ordre",legend:"Premi ${undo}"},{name:"Refer ordre",legend:"Premi ${redo}"},{name:"Ordre negreta",legend:"Premi ${bold}"},{name:"Ordre cursiva",legend:"Premi ${italic}"},
+{name:"Ordre subratllat",legend:"Premi ${underline}"},{name:"Ordre enllaç",legend:"Premi ${link}"},{name:"Ordre amagar barra d'eines",legend:"Premi ${toolbarCollapse}"},{name:"Ordre per accedir a l'anterior espai enfocat",legend:"Premi ${accessPreviousSpace} per accedir a l'enfocament d'espai més proper inabastable abans del símbol d'intercalació, per exemple: dos elements HR adjacents. Repetiu la combinació de tecles per arribar a enfocaments d'espais distants."},{name:"Ordre per accedir al següent espai enfocat",
+legend:"Premi ${accessNextSpace} per accedir a l'enfocament d'espai més proper inabastable després del símbol d'intercalació, per exemple: dos elements HR adjacents. Repetiu la combinació de tecles per arribar a enfocaments d'espais distants."},{name:"Ajuda d'accessibilitat",legend:"Premi ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/cs.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/cs.js
new file mode 100644
index 00000000..cb41d4df
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/cs.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","cs",{title:"Instrukce pro přístupnost",contents:"Obsah nápovědy. Pro uzavření tohoto dialogu stiskněte klávesu ESC.",legend:[{name:"Obecné",items:[{name:"Panel nástrojů editoru",legend:"Stiskněte${toolbarFocus} k procházení panelu nástrojů. Přejděte na další a předchozí skupiny pomocí TAB a SHIFT-TAB. Přechod na další a předchozí tlačítko panelu nástrojů je pomocí ŠIPKA VPRAVO nebo ŠIPKA VLEVO. Stisknutím mezerníku nebo klávesy ENTER tlačítko aktivujete."},{name:"Dialogové okno editoru",
+legend:"Uvnitř dialogového okna stiskněte TAB pro přesunutí na další pole, stiskněte SHIFT + TAB pro přesun na předchozí pole, stiskněte ENTER pro odeslání dialogu, stiskněte ESC pro jeho zrušení. Pro dialogová okna, která mají mnoho karet stiskněte ALT + F10 pr oprocházení seznamu karet. Pak se přesuňte na další kartu pomocí TAB nebo ŠIPKA VPRAVO. Pro přesun na předchozí stiskněte SHIFT + TAB nebo ŠIPKA VLEVO. Stiskněte MEZERNÍK nebo ENTER pro vybrání stránky karet."},{name:"Kontextové menu editoru",
+legend:"Stiskněte ${contextMenu} nebo klávesu APPLICATION k otevření kontextového menu. Pak se přesuňte na další možnost menu pomocí TAB nebo ŠIPKY DOLŮ. Přesuňte se na předchozí možnost pomocí  SHIFT+TAB nebo ŠIPKY NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti menu. Podmenu současné možnosti otevřete pomocí MEZERNÍKU nebo ENTER či ŠIPKY DOLEVA. Kontextové menu uzavřete stiskem ESC."},{name:"Rámeček seznamu editoru",legend:"Uvnitř rámečku seznamu se přesunete na další položku menu pomocí TAB nebo ŠIPKA DOLŮ. Na předchozí položku se přesunete SHIFT + TAB nebo ŠIPKA NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti seznamu. Stiskněte ESC pro uzavření seznamu."},
+{name:"Lišta cesty prvku v editoru",legend:"Stiskněte ${elementsPathFocus} pro procházení lišty cesty prvku. Na další tlačítko prvku se přesunete pomocí TAB nebo ŠIPKA VPRAVO. Na předchozí položku se přesunete pomocí SHIFT + TAB nebo ŠIPKA VLEVO. Stiskněte MEZERNÍK nebo ENTER pro vybrání prvku v editoru."}]},{name:"Příkazy",items:[{name:" Příkaz Zpět",legend:"Stiskněte ${undo}"},{name:" Příkaz Znovu",legend:"Stiskněte ${redo}"},{name:" Příkaz Tučné",legend:"Stiskněte ${bold}"},{name:" Příkaz Kurzíva",
+legend:"Stiskněte ${italic}"},{name:" Příkaz Podtržení",legend:"Stiskněte ${underline}"},{name:" Příkaz Odkaz",legend:"Stiskněte ${link}"},{name:" Příkaz Skrýt panel nástrojů",legend:"Stiskněte ${toolbarCollapse}"},{name:"Příkaz pro přístup k předchozímu prostoru zaměření",legend:"Stiskněte ${accessPreviousSpace} pro přístup k nejbližšímu nedosažitelnému prostoru zaměření před stříškou, například: dva přilehlé prvky HR. Pro dosažení vzdálených prostorů zaměření tuto kombinaci kláves opakujte."},{name:"Příkaz pro přístup k dalšímu prostoru zaměření",
+legend:"Stiskněte ${accessNextSpace} pro přístup k nejbližšímu nedosažitelnému prostoru zaměření po stříšce, například: dva přilehlé prvky HR. Pro dosažení vzdálených prostorů zaměření tuto kombinaci kláves opakujte."},{name:" Nápověda přístupnosti",legend:"Stiskněte ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/cy.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/cy.js
new file mode 100644
index 00000000..bc5d18c8
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/cy.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","cy",{title:"Canllawiau Hygyrchedd",contents:"Cynnwys Cymorth. I gau y deialog hwn, pwyswch ESC.",legend:[{name:"Cyffredinol",items:[{name:"Bar Offer y Golygydd",legend:"Pwyswch $ {toolbarFocus} i fynd at y bar offer. Symudwch i'r grŵp bar offer nesaf a blaenorol gyda TAB a SHIFT-TAB. Symudwch i'r botwm bar offer nesaf a blaenorol gyda SAETH DDE neu SAETH CHWITH. Pwyswch SPACE neu ENTER i wneud botwm y bar offer yn weithredol."},{name:"Deialog y Golygydd",legend:"Tu mewn i'r deialog, pwyswch TAB i fynd i'r maes nesaf ar y deialog, pwyswch SHIFT + TAB i symud i faes blaenorol, pwyswch ENTER i gyflwyno'r deialog, pwyswch ESC i ddiddymu'r deialog. Ar gyfer deialogau sydd â thudalennau aml-tab, pwyswch ALT + F10 i lywio'r tab-restr. Yna symudwch i'r tab nesaf gyda TAB neu SAETH DDE. Symudwch i dab blaenorol gyda SHIFT + TAB neu'r SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis y dudalen tab."},
+{name:"Dewislen Cyd-destun y Golygydd",legend:"Pwyswch $ {contextMenu} neu'r ALLWEDD 'APPLICATION' i agor y ddewislen cyd-destun. Yna symudwch i'r opsiwn ddewislen nesaf gyda'r TAB neu'r SAETH I LAWR. Symudwch i'r opsiwn blaenorol gyda SHIFT + TAB neu'r SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn ddewislen. Agorwch is-dewislen yr opsiwn cyfredol gyda SPACE neu ENTER neu SAETH DDE. Ewch yn ôl i'r eitem ar y ddewislen uwch gydag ESC neu SAETH CHWITH. Ceuwch y ddewislen cyd-destun gydag ESC."},
+{name:"Blwch Rhestr y Golygydd",legend:"Tu mewn y blwch rhestr, ewch i'r eitem rhestr nesaf gyda TAB neu'r SAETH I LAWR. Symudwch i restr eitem flaenorol gyda SHIFT + TAB neu SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn o'r rhestr. Pwyswch ESC i gau'r rhestr."},{name:"Bar Llwybr Elfen y Golygydd",legend:"Pwyswch $ {elementsPathFocus} i fynd i'r elfennau llwybr bar. Symudwch i fotwm yr elfen nesaf gyda TAB neu SAETH DDE. Symudwch i fotwm blaenorol gyda SHIFT + TAB neu SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis yr elfen yn y golygydd."}]},
+{name:"Gorchmynion",items:[{name:"Gorchymyn dadwneud",legend:"Pwyswch ${undo}"},{name:"Gorchymyn ailadrodd",legend:"Pwyswch ${redo}"},{name:"Gorchymyn Bras",legend:"Pwyswch ${bold}"},{name:"Gorchymyn italig",legend:"Pwyswch ${italig}"},{name:"Gorchymyn tanlinellu",legend:"Pwyso ${underline}"},{name:"Gorchymyn dolen",legend:"Pwyswch ${link}"},{name:"Gorchymyn Cwympo'r Dewislen",legend:"Pwyswch ${toolbarCollapse}"},{name:"Myned i orchymyn bwlch ffocws blaenorol",legend:"Pwyswch ${accessPreviousSpace} i myned i'r \"blwch ffocws sydd methu ei gyrraedd\" cyn y caret, er enghraifft: dwy elfen HR drws nesaf i'w gilydd. AIladroddwch y cyfuniad allwedd i gyrraedd bylchau ffocws pell."},
+{name:"Ewch i'r gorchymyn blwch ffocws nesaf",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces.ôl y lleolnod, er enghraifft: dwy elfen HR drws nesaf i'w gilydd. Ailadroddwch y cyfuniad allwedd i gyrraedd blychau ffocws pell."},{name:"Cymorth Hygyrchedd",legend:"Pwyswch ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/da.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/da.js
new file mode 100644
index 00000000..0cdd9523
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/da.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","da",{title:"Tilgængelighedsinstrukser",contents:"Onlinehjælp. For at lukke dette vindue klik ESC",legend:[{name:"Generelt",items:[{name:"Editor værktøjslinje",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Kommandoer",items:[{name:"Fortryd kommando",legend:"Klik på ${undo}"},{name:"Gentag kommando",legend:"Klik ${redo}"},{name:" Bold command",legend:"Klik ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Klik ${underline}"},{name:" Link command",legend:"Klik ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Kilk ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/de.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/de.js
new file mode 100644
index 00000000..969901bb
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/de.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","de",{title:"Barrierefreiheitinformationen",contents:"Hilfeinhalt. Um den Dialog zu schliessen die Taste 'ESC' drücken.",legend:[{name:"Allgemein",items:[{name:"Editor Symbolleiste",legend:"Drücken Sie ${toolbarFocus} auf der Symbolleiste. Gehen Sie zur nächsten oder vorherigen Symbolleistengruppe mit TAB und SHIFT-TAB. Gehen Sie zur nächsten oder vorherigen Symbolleiste auf die Schaltfläche mit dem RECHTS- oder LINKS-Pfeil. Drücken Sie die Leertaste oder Eingabetaste, um die Schaltfläche in der Symbolleiste aktivieren."},
+{name:"Editor Dialog",legend:"Innerhalb des Dialogs drücken Sie TAB um zum nächsten Dialogfeld zu gelangen, drücken Sie SHIFT-TAG um zum vorherigen Feld zu wechseln, drücken Sie ENTER um den Dialog abzusenden und ESC um den Dialog zu abzubrechen. Um zwischen den Reitern innerhalb eines Dialogs zu wechseln drücken sie ALT-F10. Um zum nächsten Reiter zu gelangen können Sie TAB oder die rechte Pfeiltaste. Zurück gelangt man mit SHIFT-TAB oder der linken Pfeiltaste. Mit der Leertaste oder Enter kann man den Reiter auswählen."},
+{name:"Editor Kontextmenü",legend:"Dürcken Sie ${contextMenu} oder die Anwendungstaste um das Kontextmenü zu öffnen. Man kann die Pfeiltasten zum Wechsel benutzen. Mit der Leertaste oder der Enter-Taste kann man den Menüpunkt aufrufen. Schliessen Sie das Kontextmenü mit der ESC-Taste."},{name:"Editor Listen",legend:"Innerhalb einer Listenbox kann man mit der TAB-Taste oder den Pfeilrunter-Taste den nächsten Menüeintrag wählen. Mit der Shift-TAB Tastenkombination oder der Pfeilhoch-Taste gelangt man zum vorherigen Menüpunkt. Mit der Leertaste oder Enter kann man den Menüpunkt auswählen. Drücken Sie ESC zum Verlassen des Menüs."},
+{name:"Editor Elementpfadleiste",legend:"Drücken Sie ${elementsPathFocus} um sich durch die Pfadleiste zu bewegen. Um zum nächsten Element zu gelangen drücken Sie TAB oder die Pfeilrechts-Taste. Zum vorherigen Element gelangen Sie mit der SHIFT-TAB oder der Pfeillinks-Taste. Drücken Sie die Leertaste oder Enter um das Element auszuwählen."}]},{name:"Befehle",items:[{name:"Wiederholen Befehl",legend:"Drücken Sie ${undo}"},{name:"Rückgängig Befehl",legend:"Drücken Sie ${redo}"},{name:"Fettschrift Befehl",
+legend:"Drücken Sie ${bold}"},{name:"Italic Befehl",legend:"Drücken Sie ${italic}"},{name:"Unterstreichung Befehl",legend:"Drücken Sie ${underline}"},{name:"Link Befehl",legend:"Drücken Sie ${link}"},{name:"Symbolleiste zuammenklappen Befehl",legend:"Drücken Sie ${toolbarCollapse}"},{name:"Zugang bisheriger Fokussierung Raumbefehl ",legend:"Drücken Sie ${accessPreviousSpace}  auf den am nächsten nicht erreichbar Fokus-Abstand vor die Einfügemarke zugreifen: zwei benachbarte HR-Elemente. Wiederholen Sie die Tastenkombination um entfernte Fokusräume zu erreichen. "},
+{name:"Zugang nächster Schwerpunkt Raumbefehl ",legend:"Drücken Sie $ { accessNextSpace }, um den nächsten unerreichbar Fokus Leerzeichen nach dem Cursor zum Beispiel auf: zwei benachbarten HR Elemente. Wiederholen Sie die Tastenkombination zum fernen Fokus Bereiche zu erreichen. "},{name:"Eingabehilfen",legend:"Drücken Sie ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/el.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/el.js
new file mode 100644
index 00000000..b03b67cc
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/el.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","el",{title:"Οδηγίες Προσβασιμότητας",contents:"Περιεχόμενα Βοήθειας. Πατήστε ESC για κλείσιμο.",legend:[{name:"Γενικά",items:[{name:"Εργαλειοθήκη Επεξεργαστή",legend:"Πατήστε ${toolbarFocus} για να περιηγηθείτε στην γραμμή εργαλείων. Μετακινηθείτε ανάμεσα στις ομάδες της γραμμής εργαλείων με TAB και Shift-TAB. Μετακινηθείτε ανάμεσα στα κουμπία εργαλείων με ΔΕΞΙ και ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΚΕΝΟ ή ENTER για να ενεργοποιήσετε το ενεργό κουμπί εργαλείου."},{name:"Παράθυρο Διαλόγου Επεξεργαστή",
+legend:"Μέσα σε ένα παράθυρο διαλόγου, πατήστε TAB για να μεταβείτε στο επόμενο πεδίο ή SHIFT + TAB για να μεταβείτε στο προηγούμενο. Πατήστε ENTER για να υποβάλετε την φόρμα. Πατήστε ESC για να ακυρώσετε την διαδικασία της φόρμας. Για παράθυρα διαλόγων που έχουν πολλές σελίδες σε καρτέλες πατήστε ALT + F10 για να μεταβείτε στην λίστα των καρτέλων. Στην συνέχεια μπορείτε να μεταβείτε στην επόμενη καρτέλα πατώντας TAB ή RIGHT ARROW. Μπορείτε να μεταβείτε στην προηγούμενη καρτέλα πατώντας SHIFT + TAB ή LEFT ARROW. Πατήστε SPACE ή ENTER για να επιλέξετε την καρτέλα για προβολή."},
+{name:"Αναδυόμενο Μενού Επεξεργαστή",legend:"Πατήστε ${contextMenu} ή APPLICATION KEY για να ανοίξετε το αναδυόμενο μενού. Μετά μετακινηθείτε στην επόμενη επιλογή του μενού με  TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στην προηγούμενη επιλογή με SHIFT+TAB ή ΠΑΝΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε το τρέχων στοιχείο. Ανοίξτε το αναδυόμενο μενού της τρέχουσας επιλογής με ΔΙΑΣΤΗΜΑ ή ENTER ή ΔΕΞΙ ΒΕΛΑΚΙ. Μεταβείτε πίσω στο αρχικό στοιχείο μενού με ESC ή ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Κλείστε το αναδυόμενο μενού με ESC."},
+{name:"Κουτί Λίστας Επεξεργαστών",legend:"Μέσα σε ένα κουτί λίστας, μετακινηθείτε στο επόμενο στοιχείο με TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στο προηγούμενο στοιχείο με SHIFT + TAB ή ΠΑΝΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε ένα στοιχείο. Πατήστε ESC για να κλείσετε το κουτί της λίστας."},{name:"Μπάρα Διαδρομών Στοιχείων Επεξεργαστή",legend:"Πατήστε ${elementsPathFocus} για να περιηγηθείτε στην μπάρα διαδρομών στοιχείων του επεξεργαστή. Μετακινηθείτε στο κουμπί του επόμενου στοιχείου με το TAB ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μετακινηθείτε στο κουμπί του προηγούμενου στοιχείου με το SHIFT+TAB ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε το στοιχείο στον επεξεργαστή."}]},
+{name:"Εντολές",items:[{name:" Εντολή αναίρεσης",legend:"Πατήστε ${undo}"},{name:" Εντολή επανάληψης",legend:"Πατήστε ${redo}"},{name:" Εντολή έντονης γραφής",legend:"Πατήστε ${bold}"},{name:" Εντολή πλάγιας γραφής",legend:"Πατήστε ${italic}"},{name:" Εντολή υπογράμμισης",legend:"Πατήστε ${underline}"},{name:" Εντολή συνδέσμου",legend:"Πατήστε ${link}"},{name:" Εντολή Σύμπτηξης Εργαλειοθήκης",legend:"Πατήστε ${toolbarCollapse}"},{name:"Πρόσβαση προηγούμενης εντολής χώρου εστίασης ",legend:"Πατήστε ${accessPreviousSpace} για να έχετε πρόσβαση στον πιο κοντινό χώρο εστίασης πριν το δρομέα, για παράδειγμα: δύο παρακείμενα στοιχεία ΥΕ. Επαναλάβετε το συνδυασμό πλήκτρων για να φθάσετε στους χώρους μακρινής εστίασης. "},
+{name:"Πρόσβαση επόμενηw εντολήw χώροz εστίασης",legend:"Πατήστε ${accessNextSpace} για να έχete πρόσβαση στον πιο κοντινό χώρο εστίασης μετά το δρομέα, για παράδειγμα: δύο παρακείμενα στοιχεία ΥΕ. Επαναλάβετε το συνδυασμό πλήκτρων για τους χώρους μακρινής εστίασης. "},{name:" Βοήθεια Προσβασιμότητας",legend:"Πατήστε ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/en.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/en.js
new file mode 100644
index 00000000..5deb84e7
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/en.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","en",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"General",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/eo.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/eo.js
new file mode 100644
index 00000000..73bdd3a7
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/eo.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","eo",{title:"Uzindikoj pri atingeblo",contents:"Helpilenhavo. Por fermi tiun dialogon, premu la ESKAPAN klavon.",legend:[{name:"Ĝeneralaĵoj",items:[{name:"Ilbreto de la redaktilo",legend:"Premu ${toolbarFocus} por atingi la ilbreton. Moviĝu al la sekva aŭ antaŭa grupoj de la ilbreto per la klavoj TABA kaj MAJUSKLIGA-TABA. Moviĝu al la sekva aŭ antaŭa butonoj de la ilbreto per la klavoj SAGO DEKSTREN kaj SAGO MALDEKSTREN. Premu la SPACETklavon aŭ la ENENklavon por aktivigi la ilbretbutonon."},
+{name:"Redaktildialogo",legend:"En dialogo, premu la TABAN klavon por navigi al la sekva dialogkampo, premu la MAJUSKLIGAN + TABAN klavojn por reveni al la antaŭa kampo, premu la ENENklavon por sendi la dialogon, premu la ESKAPAN klavon por nuligi la dialogon. Por dialogoj kun pluraj retpaĝoj sub langetoj, premu ALT + F10 por navigi al la langetlisto. Poste moviĝu al la sekva langeto per la klavo TABA aŭ SAGO DEKSTREN. Moviĝu al la antaŭa langeto per la klavoj MAJUSKLIGA + TABA aŭ  SAGO MALDEKSTREN. Premu la SPACETklavon aŭ la ENENklavon por selekti la langetretpaĝon."},
+{name:"Kunteksta menuo de la redaktilo",legend:"Premu ${contextMenu} aŭ entajpu la KLAVKOMBINAĴON por malfermi la kuntekstan menuon. Poste moviĝu al la sekva opcio de la menuo per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa opcio per la klavoj MAJUSKLGA + TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la menuopcion. Malfermu la submenuon de la kuranta opcio per la SPACETklavo aŭ la ENENklavo aŭ la SAGO DEKSTREN. Revenu al la elemento de la patra menuo per la klavoj ESKAPA aŭ SAGO MALDEKSTREN. Fermu la kuntekstan menuon per la ESKAPA klavo."},
+{name:"Fallisto de la redaktilo",legend:"En fallisto, moviĝu al la sekva listelemento per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa listelemento per la klavoj MAJUSKLIGA + TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la opcion en la listo. Premu la ESKAPAN klavon por fermi la falmenuon."},{name:"Breto indikanta la vojon al la redaktilelementoj",legend:"Premu ${elementsPathFocus} por navigi al la breto indikanta la vojon al la redaktilelementoj. Moviĝu al la butono de la sekva elemento per la klavoj TABA aŭ SAGO DEKSTREN. Moviĝu al la butono de la antaŭa elemento per la klavoj MAJUSKLIGA + TABA aŭ SAGO MALDEKSTREN. Premu la SPACETklavon aŭ ENENklavon por selekti la elementon en la redaktilo."}]},
+{name:"Komandoj",items:[{name:"Komando malfari",legend:"Premu ${undo}"},{name:"Komando refari",legend:"Premu ${redo}"},{name:"Komando grasa",legend:"Premu ${bold}"},{name:"Komando kursiva",legend:"Premu ${italic}"},{name:"Komando substreki",legend:"Premu ${underline}"},{name:"Komando ligilo",legend:"Premu ${link}"},{name:"Komando faldi la ilbreton",legend:"Premu ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Helpilo pri atingeblo",legend:"Premu ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/es.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/es.js
new file mode 100644
index 00000000..5e6bdb5a
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/es.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","es",{title:"Instrucciones de accesibilidad",contents:"Ayuda. Para cerrar presione ESC.",legend:[{name:"General",items:[{name:"Barra de herramientas del editor",legend:'Presiona ${toolbarFocus} para navegar por la barra de herramientas. Para moverse por los distintos grupos de herramientas usa las teclas TAB y MAY-TAB. Para moverse por las distintas herramientas usa FLECHA DERECHA o FECHA IZQUIERDA. Presiona "espacio" o "intro" para activar la herramienta.'},{name:"Editor de diálogo",
+legend:"Dentro de un cuadro de diálogo, presione la tecla TAB para desplazarse al campo siguiente del cuadro de diálogo, pulse SHIFT + TAB para desplazarse al campo anterior, pulse ENTER para presentar cuadro de diálogo, pulse la tecla ESC para cancelar el diálogo. Para los diálogos que tienen varias páginas, presione ALT + F10 para navegar a la pestaña de la lista. Luego pasar a la siguiente pestaña con TAB o FLECHA DERECHA. Para ir a la ficha anterior con SHIFT + TAB o FLECHA IZQUIERDA. Presione ESPACIO o ENTRAR para seleccionar la página de ficha."},
+{name:"Editor del menú contextual",legend:"Presiona ${contextMenu} o TECLA MENÚ para abrir el menú contextual. Entonces muévete a la siguiente opción del menú con TAB o FLECHA ABAJO. Muévete a la opción previa con SHIFT + TAB o FLECHA ARRIBA. Presiona ESPACIO o ENTER para seleccionar la opción del menú. Abre el submenú de la opción actual con ESPACIO o ENTER o FLECHA DERECHA. Regresa al elemento padre del menú con ESC o FLECHA IZQUIERDA. Cierra el menú contextual con ESC."},{name:"Lista del Editor",
+legend:"Dentro de una lista, te mueves al siguiente elemento de la lista con TAB o FLECHA ABAJO. Te mueves al elemento previo de la lista con SHIFT + TAB o FLECHA ARRIBA. Presiona ESPACIO o ENTER para elegir la opción de la lista. Presiona ESC para cerrar la lista."},{name:"Barra de Ruta del Elemento en el Editor",legend:"Presiona ${elementsPathFocus} para navegar a los elementos de la barra de ruta. Te mueves al siguiente elemento botón con TAB o FLECHA DERECHA. Te mueves al botón previo con SHIFT + TAB o FLECHA IZQUIERDA. Presiona ESPACIO o ENTER para seleccionar el elemento en el editor."}]},
+{name:"Comandos",items:[{name:"Comando deshacer",legend:"Presiona ${undo}"},{name:"Comando rehacer",legend:"Presiona ${redo}"},{name:"Comando negrita",legend:"Presiona ${bold}"},{name:"Comando itálica",legend:"Presiona ${italic}"},{name:"Comando subrayar",legend:"Presiona ${underline}"},{name:"Comando liga",legend:"Presiona ${liga}"},{name:"Comando colapsar barra de herramientas",legend:"Presiona ${toolbarCollapse}"},{name:"Comando accesar el anterior espacio de foco",legend:"Presiona ${accessPreviousSpace} para accesar el espacio de foco no disponible más cercano anterior al cursor, por ejemplo: dos elementos HR adyacentes. Repite la combinación de teclas para alcanzar espacios de foco distantes."},
+{name:"Comando accesar el siguiente spacio de foco",legend:"Presiona ${accessNextSpace} para accesar el espacio de foco no disponible más cercano después del cursor, por ejemplo: dos elementos HR adyacentes. Repite la combinación de teclas para alcanzar espacios de foco distantes."},{name:"Ayuda de Accesibilidad",legend:"Presiona ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/et.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/et.js
new file mode 100644
index 00000000..5cfdb736
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/et.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","et",{title:"Accessibility Instructions",contents:"Abi sisu. Selle dialoogi sulgemiseks vajuta ESC klahvi.",legend:[{name:"Üldine",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/fa.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/fa.js
new file mode 100644
index 00000000..aa88911a
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/fa.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","fa",{title:"دستورالعمل‌های دسترسی",contents:"راهنمای فهرست مطالب. برای بستن این کادر محاوره‌ای ESC را فشار دهید.",legend:[{name:"عمومی",items:[{name:"نوار ابزار ویرایشگر",legend:"${toolbarFocus} را برای باز کردن نوار ابزار بفشارید. با کلید Tab و Shif-Tab در مجموعه نوار ابزار بعدی و قبلی حرکت کنید. برای حرکت در کلید نوار ابزار قبلی و بعدی با کلید جهت‌نمای راست و چپ جابجا شوید. کلید Space یا Enter را برای فعال کردن کلید نوار ابزار بفشارید."},{name:"پنجره محاورهای ویرایشگر",
+legend:"در داخل یک پنجره محاورهای، کلید Tab را بفشارید تا به پنجرهی بعدی بروید، Shift+Tab برای حرکت به فیلد قبلی، فشردن Enter برای ثبت اطلاعات پنجره، فشردن Esc برای لغو پنجره محاورهای و برای پنجرههایی که چندین برگه دارند، فشردن Alt+F10 جهت رفتن به Tab-List. در نهایت حرکت به برگه بعدی با Tab یا کلید جهتنمای راست. حرکت به برگه قبلی با Shift+Tab یا کلید جهتنمای چپ. فشردن Space یا Enter برای انتخاب یک برگه."},{name:"منوی متنی ویرایشگر",legend:"${contextMenu} یا کلید برنامههای کاربردی را برای باز کردن منوی متن را بفشارید. سپس میتوانید برای حرکت به گزینه بعدی منو با کلید Tab و یا کلید جهتنمای پایین جابجا شوید. حرکت به گزینه قبلی با Shift+Tab یا کلید جهتنمای بالا. فشردن Space یا Enter برای انتخاب یک گزینه از منو. باز کردن زیر شاخه گزینه منو جاری با کلید Space یا Enter و یا کلید جهتنمای راست و چپ. بازگشت به منوی والد با کلید Esc یا کلید جهتنمای چپ. بستن منوی متن با Esc."},
+{name:"جعبه فهرست ویرایشگر",legend:"در داخل جعبه لیست، قلم دوم از اقلام لیست بعدی را با TAB و یا Arrow Down حرکت دهید. انتقال به قلم دوم از اقلام لیست قبلی را با SHIFT + TAB یا UP ARROW. کلید Space یا ENTER را برای انتخاب گزینه لیست بفشارید. کلید ESC را برای بستن جعبه لیست بفشارید."},{name:"ویرایشگر عنصر نوار راه",legend:"برای رفتن به مسیر عناصر ${elementsPathFocus} را بفشارید. حرکت به کلید عنصر بعدی با کلید Tab یا  کلید جهت‌نمای راست. برگشت به کلید قبلی با Shift+Tab یا کلید جهت‌نمای چپ. فشردن Space یا Enter برای انتخاب یک عنصر در ویرایشگر."}]},
+{name:"فرمان‌ها",items:[{name:"بازگشت به آخرین فرمان",legend:"فشردن ${undo}"},{name:"انجام مجدد فرمان",legend:"فشردن ${redo}"},{name:"فرمان درشت کردن متن",legend:"فشردن ${bold}"},{name:"فرمان کج کردن متن",legend:"فشردن ${italic}"},{name:"فرمان زیرخطدار کردن متن",legend:"فشردن ${underline}"},{name:"فرمان پیوند دادن",legend:"فشردن ${link}"},{name:"بستن نوار ابزار فرمان",legend:"فشردن ${toolbarCollapse}"},{name:"دسترسی به فرمان محل تمرکز قبلی",legend:"فشردن ${accessPreviousSpace} برای دسترسی به نزدیک‌ترین فضای قابل دسترسی تمرکز قبل از هشتک، برای مثال: دو عنصر مجاور HR -خط افقی-. تکرار کلید ترکیبی برای رسیدن به فضاهای تمرکز از راه دور."},
+{name:"دسترسی به فضای دستور بعدی",legend:"برای دسترسی به نزدیک‌ترین فضای تمرکز غیر قابل دسترس، ${accessNextSpace} را پس از علامت هشتک بفشارید، برای مثال:  دو عنصر مجاور HR -خط افقی-. کلید ترکیبی را برای رسیدن به فضای تمرکز تکرار کنید."},{name:"راهنمای دسترسی",legend:"فشردن ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/fi.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/fi.js
new file mode 100644
index 00000000..c29bef08
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/fi.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","fi",{title:"Saavutettavuus ohjeet",contents:"Ohjeen sisällöt. Sulkeaksesi tämän dialogin paina ESC.",legend:[{name:"Yleinen",items:[{name:"Editorin työkalupalkki",legend:"Paina ${toolbarFocus} siirtyäksesi työkalupalkkiin. Siirry seuraavaan ja edelliseen työkalupalkin ryhmään TAB ja SHIFT-TAB näppäimillä. Siirry seuraavaan ja edelliseen työkalupainikkeeseen käyttämällä NUOLI OIKEALLE tai NUOLI VASEMMALLE näppäimillä. Paina VÄLILYÖNTI tai ENTER näppäintä aktivoidaksesi työkalupainikkeen."},
+{name:"Editorin dialogi",legend:"Dialogin sisällä, painamalla TAB siirryt seuraavaan dialogin kenttään, painamalla SHIFT+TAB siirryt aiempaan kenttään, painamalla ENTER lähetät dialogin, painamalla ESC peruutat dialogin. Dialogeille joissa on useita välilehtiä, paina ALT+F10 siirtyäksesi välillehtilistaan. Siirtyäksesi seuraavaan välilehteen paina TAB tai NUOLI OIKEALLE. Siirry edelliseen välilehteen painamalla SHIFT+TAB tai nuoli vasemmalle. Paina VÄLILYÖNTI tai ENTER valitaksesi välilehden."},{name:"Editorin oheisvalikko",
+legend:"Paina ${contextMenu} tai SOVELLUSPAINIKETTA avataksesi oheisvalikon. Liiku seuraavaan valikon vaihtoehtoon TAB tai NUOLI ALAS näppäimillä. Siirry edelliseen vaihtoehtoon SHIFT+TAB tai NUOLI YLÖS näppäimillä. Paina VÄLILYÖNTI tai ENTER valitaksesi valikon kohdan. Avataksesi nykyisen kohdan alivalikon paina VÄLILYÖNTI tai ENTER tai NUOLI OIKEALLE painiketta. Siirtyäksesi takaisin valikon ylemmälle tasolle paina ESC tai NUOLI vasemmalle. Oheisvalikko suljetaan ESC painikkeella."},{name:"Editorin listalaatikko",
+legend:"Listalaatikon sisällä siirry seuraavaan listan kohtaan TAB tai NUOLI ALAS painikkeilla. Siirry edelliseen listan kohtaan SHIFT+TAB tai NUOLI YLÖS painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi listan vaihtoehdon. Paina ESC sulkeaksesi listalaatikon."},{name:"Editorin elementtipolun palkki",legend:"Paina ${elementsPathFocus} siirtyäksesi elementtipolun palkkiin. Siirry seuraavaan elementtipainikkeeseen TAB tai NUOLI OIKEALLE painikkeilla. Siirry aiempaan painikkeeseen SHIFT+TAB tai NUOLI VASEMMALLE painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi elementin editorissa."}]},
+{name:"Komennot",items:[{name:"Peruuta komento",legend:"Paina ${undo}"},{name:"Tee uudelleen komento",legend:"Paina ${redo}"},{name:"Lihavoi komento",legend:"Paina ${bold}"},{name:"Kursivoi komento",legend:"Paina ${italic}"},{name:"Alleviivaa komento",legend:"Paina ${underline}"},{name:"Linkki komento",legend:"Paina ${link}"},{name:"Pienennä työkalupalkki komento",legend:"Paina ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Saavutettavuus ohjeet",legend:"Paina ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/fr-ca.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/fr-ca.js
new file mode 100644
index 00000000..1c210f04
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/fr-ca.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","fr-ca",{title:"Instructions d'accessibilité",contents:"Contenu de l'aide.  Pour fermer cette fenêtre, appuyez sur ESC.",legend:[{name:"Général",items:[{name:"Barre d'outil de l'éditeur",legend:"Appuyer sur ${toolbarFocus} pour accéder à la barre d'outils. Se déplacer vers les groupes suivant ou précédent de la barre d'outil avec les touches TAB et SHIFT-TAB. Se déplacer vers les boutons suivant ou précédent de la barre d'outils avec les touches FLECHE DROITE et FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour activer le bouton de barre d'outils."},
+{name:"Dialogue de l'éditeur",legend:"A l'intérieur d'un dialogue, appuyer sur la touche TAB pour naviguer jusqu'au champ de dalogue suivant, appuyez sur les touches SHIFT + TAB pour revenir au champ précédent, appuyez sur la touche ENTRER pour soumettre le dialogue, appuyer sur la touche ESC pour annuler le dialogue. Pour les dialogues avec plusieurs pages d'onglets, appuyer sur ALT + F10 pour naviguer jusqu'à la liste des onglets. Puis se déplacer vers l'onglet suivant avec la touche TAB ou FLECHE DROITE. Se déplacer vers l'onglet précédent avec les touches SHIFT + TAB ou FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour sélectionner la page de l'onglet."},
+{name:"Menu contextuel de l'éditeur",legend:"Appuyer sur ${contextMenu} ou entrer le RACCOURCI CLAVIER pour ouvrir le menu contextuel. Puis se déplacer vers l'option suivante du menu avec les touches TAB ou FLECHE BAS. Se déplacer vers l'option précédente avec les touches SHIFT+TAB ou FLECHE HAUT. appuyer sur la BARRE D'ESPACE ou la touche ENTREE pour sélectionner l'option du menu. Oovrir le sous-menu de l'option courante avec la BARRE D'ESPACE ou les touches ENTREE ou FLECHE DROITE. Revenir à l'élément de menu parent avec les touches ESC ou FLECHE GAUCHE. Fermer le menu contextuel avec ESC."},
+{name:"Menu déroulant de l'éditeur",legend:"A l'intérieur d'une liste en menu déroulant, se déplacer vers l'élément suivant de la liste avec les touches TAB ou FLECHE BAS. Se déplacer vers l'élément précédent de la liste avec les touches SHIFT + TAB ou FLECHE HAUT. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'option dans la liste. Appuyer sur ESC pour fermer le menu déroulant."},{name:"Barre d'emplacement des éléments de l'éditeur",legend:"Appuyer sur ${elementsPathFocus} pour naviguer vers la barre d'emplacement des éléments de léditeur. Se déplacer vers le bouton d'élément suivant avec les touches TAB ou FLECHE DROITE. Se déplacer vers le bouton d'élément précédent avec les touches SHIFT+TAB ou FLECHE GAUCHE. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'élément dans l'éditeur."}]},
+{name:"Commandes",items:[{name:"Annuler",legend:"Appuyer sur ${undo}"},{name:"Refaire",legend:"Appuyer sur ${redo}"},{name:"Gras",legend:"Appuyer sur ${bold}"},{name:"Italique",legend:"Appuyer sur ${italic}"},{name:"Souligné",legend:"Appuyer sur ${underline}"},{name:"Lien",legend:"Appuyer sur ${link}"},{name:"Enrouler la barre d'outils",legend:"Appuyer sur ${toolbarCollapse}"},{name:"Accéder à l'objet de focus précédent",legend:"Appuyer ${accessPreviousSpace} pour accéder au prochain espace disponible avant le curseur, par exemple: deux éléments HR adjacents.  Répéter la combinaison pour joindre les éléments d'espaces distantes."},
+{name:"Accéder au prochain objet de focus",legend:"Appuyer ${accessNextSpace} pour accéder au prochain espace disponible après le curseur, par exemple: deux éléments HR adjacents.  Répéter la combinaison pour joindre les éléments d'espaces distantes."},{name:"Aide d'accessibilité",legend:"Appuyer sur ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/fr.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/fr.js
new file mode 100644
index 00000000..b133415d
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/fr.js
@@ -0,0 +1,11 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","fr",{title:"Instructions d'accessibilité",contents:"Contenu de l'aide. Pour fermer ce dialogue, appuyez sur la touche Ech (Echappement).",legend:[{name:"Général",items:[{name:"Barre d'outils de l'éditeur",legend:"Appuyer sur ${toolbarFocus} pour accéder à la barre d'outils. Se déplacer vers les groupes suivant ou précédent de la barre d'outil avec les touches TAB et SHIFT-TAB. Se déplacer vers les boutons suivant ou précédent de la barre d'outils avec les touches FLECHE DROITE et FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour activer le bouton de barre d'outils."},
+{name:"Dialogue de l'éditeur",legend:"A l'intérieur d'un dialogue, appuyer sur la touche TAB pour naviguer jusqu'au champ de dalogue suivant, appuyez sur les touches SHIFT + TAB pour revenir au champ précédent, appuyez sur la touche ENTRER pour soumettre le dialogue, appuyer sur la touche ESC pour annuler le dialogue. Pour les dialogues avec plusieurs pages d'onglets, appuyer sur ALT + F10 pour naviguer jusqu'à la liste des onglets. Puis se déplacer vers l'onglet suivant avec la touche TAB ou FLECHE DROITE. Se déplacer vers l'onglet précédent avec les touches SHIFT + TAB ou FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour sélectionner la page de l'onglet."},
+{name:"Menu contextuel de l'éditeur",legend:"Appuyer sur ${contextMenu} ou entrer le RACCOURCI CLAVIER pour ouvrir le menu contextuel. Puis se déplacer vers l'option suivante du menu avec les touches TAB ou FLECHE BAS. Se déplacer vers l'option précédente avec les touches  SHIFT+TAB ou FLECHE HAUT. appuyer sur la BARRE D'ESPACE ou la touche ENTREE pour sélectionner l'option du menu. Oovrir le sous-menu de l'option courante avec la BARRE D'ESPACE ou les touches ENTREE ou FLECHE DROITE. Revenir à l'élément de menu parent avec les touches Ech ou FLECHE GAUCHE. Fermer le menu contextuel avec Ech."},
+{name:"Zone de liste de l'éditeur",legend:"Dans la liste en menu déroulant, se déplacer vers l'élément suivant de la liste avec les touches TAB ou FLECHE BAS. Se déplacer vers l'élément précédent de la liste avec les touches MAJ + TAB ou FLECHE HAUT. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'option dans la liste. Appuyer sur ESC pour fermer le menu déroulant."},{name:"Barre d'emplacement des éléments de l'éditeur",legend:"Appuyer sur ${elementsPathFocus} pour naviguer vers la barre d'emplacement des éléments de l'éditeur. Se déplacer vers le bouton d'élément suivant avec les touches TAB ou FLECHE DROITE. Se déplacer vers le bouton d'élément précédent avec les touches MAJ+TAB ou FLECHE GAUCHE. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'élément dans l'éditeur."}]},
+{name:"Commandes",items:[{name:" Annuler la commande",legend:"Appuyer sur ${undo}"},{name:"Refaire la commande",legend:"Appuyer sur ${redo}"},{name:" Commande gras",legend:"Appuyer sur ${bold}"},{name:" Commande italique",legend:"Appuyer sur ${italic}"},{name:" Commande souligné",legend:"Appuyer sur ${underline}"},{name:" Commande lien",legend:"Appuyer sur ${link}"},{name:" Commande enrouler la barre d'outils",legend:"Appuyer sur ${toolbarCollapse}"},{name:"Accéder à la précédente commande d'espace de mise au point",
+legend:"Appuyez sur ${accessPreviousSpace} pour accéder à l'espace hors d'atteinte le plus proche avant le caret, par exemple: deux éléments HR adjacents. Répétez la combinaison de touches pour atteindre les espaces de mise au point distants."},{name:"Accès à la prochaine commande de l'espace de mise au point",legend:"Appuyez sur ${accessNextSpace} pour accéder au plus proche espace de mise au point hors d'atteinte après le caret, par exemple: deux éléments HR adjacents. répétez la combinaison de touches pour atteindre les espace de mise au point distants."},
+{name:" Aide Accessibilité",legend:"Appuyer sur ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/gl.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/gl.js
new file mode 100644
index 00000000..f6f0c7ca
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/gl.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","gl",{title:"Instrucións de accesibilidade",contents:"Axuda. Para pechar este diálogo prema ESC.",legend:[{name:"Xeral",items:[{name:"Barra de ferramentas do editor",legend:"Prema ${toolbarFocus} para navegar pola barra de ferramentas. Para moverse polos distintos grupos de ferramentas use as teclas TAB e MAIÚS+TAB. Para moverse polas distintas ferramentas use FRECHA DEREITA ou FRECHA ESQUERDA. Prema ESPAZO ou INTRO para activar o botón da barra de ferramentas."},
+{name:"Editor de diálogo",legend:"Dentro dun cadro de diálogo, prema a tecla TAB para desprazarse ao campo seguinte do cadro de diálogo, prema MAIÚS + TAB para desprazarse ao campo anterior, prema INTRO para presentar o cadro de diálogo, prema a tecla ESC para cancelar o diálogo. Para os diálogos que teñen varias páxinas, prema ALT + F10 para navegar á lapela da lista. Despois pasar á seguinte lapela con TAB ou FRECHA DEREITA. Para ir á lapela anterior con SHIFT + TAB ou FRECHA ESQUERDA. Prema ESPAZO ou INTRO para seleccionar a lapela da páxina."},
+{name:"Editor do menú contextual",legend:"Prema ${contextMenu} ou a TECLA MENÚ para abrir o menú contextual. A seguir móvase á seguinte opción do menú con TAB ou FRECHA ABAIXO. Móvase á opción anterior con MAIÚS + TAB ou FRECHA ARRIBA. Prema ESPAZO ou INTRO para seleccionar a opción do menú. Abra o submenú da opción actual con ESPAZO ou INTRO ou FRECHA DEREITA. Regrese ao elemento principal do menú con ESC ou FRECHA ESQUERDA. Peche o menú contextual con ESC."},{name:"Lista do editor",legend:"Dentro dunha lista, móvase ao seguinte elemento da lista con TAB ou FRECHA ABAIXO. Móvase ao elemento anterior da lista con MAIÚS + TAB ou FRECHA ARRIBA. Prema ESPAZO ou INTRO para escoller a opción da lista. Prema ESC para pechar a lista."},
+{name:"Barra da ruta ao elemento no editor",legend:"Prema ${elementsPathFocus} para navegar ata os elementos da barra de ruta. Móvase ao seguinte elemento botón con TAB ou FRECHA DEREITA. Móvase ao botón anterior con MAIÚS + TAB ou FRECHA ESQUERDA. Prema ESPAZO ou INTRO para seleccionar o elemento no editor."}]},{name:"Ordes",items:[{name:"Orde «desfacer»",legend:"Prema ${undo}"},{name:"Orde «refacer»",legend:"Prema ${redo}"},{name:"Orde «negra»",legend:"Prema ${bold}"},{name:"Orde «cursiva»",legend:"Prema ${italic}"},
+{name:"Orde «subliñar»",legend:"Prema ${underline}"},{name:"Orde «ligazón»",legend:"Prema ${link}"},{name:"Orde «contraer a barra de ferramentas»",legend:"Prema ${toolbarCollapse}"},{name:"Orde «acceder ao anterior espazo en foco»",legend:"Prema ${accessPreviousSpace} para acceder ao espazo máis próximo de foco inalcanzábel anterior ao cursor, por exemplo: dous elementos HR adxacentes. Repita a combinación de teclas para chegar a espazos de foco distantes."},{name:"Orde «acceder ao seguinte espazo en foco»",
+legend:"Prema ${accessNextSpace} para acceder ao espazo máis próximo de foco inalcanzábel posterior ao cursor, por exemplo: dous elementos HR adxacentes. Repita a combinación de teclas para chegar a espazos de foco distantes."},{name:"Axuda da accesibilidade",legend:"Prema ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/gu.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/gu.js
new file mode 100644
index 00000000..fb58c120
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/gu.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","gu",{title:"એક્ક્ષેબિલિટી ની વિગતો",contents:"હેલ્પ. આ બંધ કરવા ESC દબાવો.",legend:[{name:"જનરલ",items:[{name:"એડિટર ટૂલબાર",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"એડિટર ડાયલોગ",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"કમાંડસ",items:[{name:"અન્ડું કમાંડ",legend:"$ દબાવો {undo}"},{name:"ફરી કરો કમાંડ",legend:"$ દબાવો {redo}"},{name:"બોલ્દનો કમાંડ",legend:"$ દબાવો {bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/he.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/he.js
new file mode 100644
index 00000000..c22978e5
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/he.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","he",{title:"הוראות נגישות",contents:"הוראות נגישות. לסגירה לחץ אסקייפ (ESC).",legend:[{name:"כללי",items:[{name:"סרגל הכלים",legend:"לחץ על ${toolbarFocus} כדי לנווט לסרגל הכלים. עבור לכפתור הבא עם מקש הטאב (TAB) או חץ שמאלי. עבור לכפתור הקודם עם מקש השיפט (SHIFT) + טאב (TAB) או חץ ימני. לחץ רווח או אנטר (ENTER) כדי להפעיל את הכפתור הנבחר."},{name:"דיאלוגים (חלונות תשאול)",legend:"בתוך דיאלוג, לחץ טאב (TAB) כדי לנווט לשדה הבא, לחץ שיפט (SHIFT) + טאב (TAB) כדי לנווט לשדה הקודם, לחץ אנטר (ENTER) כדי לשלוח את הדיאלוג, לחץ אסקייפ (ESC) כדי לבטל. בתוך דיאלוגים בעלי מספר טאבים (לשוניות), לחץ אלט (ALT) + F10 כדי לנווט לשורת הטאבים. נווט לטאב הבא עם טאב (TAB) או חץ שמאלי. עבור לטאב הקודם עם שיפט (SHIFT) + טאב (TAB) או חץ שמאלי. לחץ רווח או אנטר (ENTER) כדי להיכנס לטאב."},
+{name:"תפריט ההקשר (Context Menu)",legend:"לחץ ${contextMenu} או APPLICATION KEYכדי לפתוח את תפריט ההקשר. עבור לאפשרות הבאה עם טאב (TAB) או חץ למטה. עבור לאפשרות הקודמת עם שיפט (SHIFT) + טאב (TAB) או חץ למעלה. לחץ רווח או אנטר (ENTER) כדי לבחור את האפשרות. פתח את תת התפריט (Sub-menu) של האפשרות הנוכחית עם רווח או אנטר (ENTER) או חץ שמאלי. חזור לתפריט האב עם אסקייפ (ESC) או חץ שמאלי. סגור את תפריט ההקשר עם אסקייפ (ESC)."},{name:"תפריטים צפים (List boxes)",legend:"בתוך תפריט צף, עבור לפריט הבא עם טאב (TAB) או חץ למטה. עבור לתפריט הקודם עם שיפט (SHIFT) + טאב (TAB) or חץ עליון. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"עץ אלמנטים (Elements Path)",legend:"לחץ ${elementsPathFocus} כדי לנווט לעץ האלמנטים. עבור לפריט הבא עם טאב (TAB) או חץ ימני. עבור לפריט הקודם עם שיפט (SHIFT) + טאב (TAB) או חץ שמאלי. לחץ רווח או אנטר (ENTER) כדי לבחור את האלמנט בעורך."}]},{name:"פקודות",items:[{name:" ביטול צעד אחרון",legend:"לחץ ${undo}"},{name:" חזרה על צעד אחרון",legend:"לחץ ${redo}"},{name:" הדגשה",legend:"לחץ ${bold}"},{name:" הטייה",legend:"לחץ ${italic}"},{name:" הוספת קו תחתון",legend:"לחץ ${underline}"},{name:" הוספת לינק",
+legend:"לחץ ${link}"},{name:" כיווץ סרגל הכלים",legend:"לחץ ${toolbarCollapse}"},{name:"גישה למיקום המיקוד הקודם",legend:"לחץ ${accessPreviousSpace} כדי לגשת למיקום המיקוד הלא-נגיש הקרוב לפני הסמן, למשל בין שני אלמנטים סמוכים מסוג HR. חזור על צירוף מקשים זה כדי להגיע למקומות מיקוד רחוקים יותר."},{name:"גישה למיקום המיקוד הבא",legend:"לחץ ${accessNextSpace} כדי לגשת למיקום המיקוד הלא-נגיש הקרוב אחרי הסמן, למשל בין שני אלמנטים סמוכים מסוג HR. חזור על צירוף מקשים זה כדי להגיע למקומות מיקוד רחוקים יותר."},
+{name:" הוראות נגישות",legend:"לחץ ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/hi.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/hi.js
new file mode 100644
index 00000000..0f9bbc9b
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/hi.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","hi",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"सामान्य",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/hr.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/hr.js
new file mode 100644
index 00000000..f3c3394f
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/hr.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","hr",{title:"Upute dostupnosti",contents:"Sadržaj pomoći. Za zatvaranje pritisnite ESC.",legend:[{name:"Općenito",items:[{name:"Alatna traka",legend:"Pritisni ${toolbarFocus} za navigaciju do alatne trake. Pomicanje do prethodne ili sljedeće alatne grupe vrši se pomoću SHIFT-TAB i TAB. Pomicanje do prethodnog ili sljedećeg gumba u alatnoj traci vrši se pomoću lijeve i desne strelice kursora. Pritisnite SPACE ili ENTER za aktivaciju alatne trake."},{name:"Dijalog",
+legend:"Unutar dijaloga, pritisnite TAB za navigaciju do sljedećeg polja, pritisnite SHIFT + TAB za vraćanje na prethodno polje, pritisnite ENTER za slanje dijaloga ili ESC za zatvaranje dijaloga. Za dijaloge koji imaju višestruke kartice, pritisnite ALT + F10 za na navigaciju i zatim TAB ili lijeva strelica kursora ili SHIFT + TAB i desna strelica kursora. SPACE ili ENTER odabiru karticu."},{name:"Kontekstni izbornik",legend:"Pritisnite ${contextMenu} ili APPLICATION tipku za otvaranje kontekstnog izbornika. Pomicanje se vrši TAB ili strelicom kursora prema dolje ili SHIFT+TAB ili strelica kursora prema gore. SPACE ili ENTER odabiru opciju izbornika. Otvorite podizbornik trenutne opcije sa  SPACE, ENTER ili desna strelica kursora. Povratak na prethodni izbornik vrši se sa ESC ili lijevom strelicom kursora. Zatvaranje se vrši pritiskom na tipku ESC."},
+{name:"Lista",legend:"Unutar list-boxa, pomicanje na sljedeću stavku vrši se sa TAB ili strelica kursora prema dolje. Na prethodnu sa SHIFT + TAB ili strelica prema gore. Pritiskom na SPACE ili ENTER odabire se stavka ili ESC za zatvaranje."},{name:"Traka putanje elemenata",legend:"Pritisnite ${elementsPathFocus} za navigaciju po putanji elemenata. Pritisnite TAB ili desnu strelicu kursora za pomicanje na sljedeći element ili SHIFT + TAB ili lijeva strelica kursora za pomicanje na prethodni element. Pritiskom na SPACE ili ENTER vrši se odabir elementa."}]},
+{name:"Naredbe",items:[{name:"Vrati naredbu",legend:"Pritisni ${undo}"},{name:"Ponovi naredbu",legend:"Pritisni ${redo}"},{name:"Bold naredba",legend:"Pritisni ${bold}"},{name:"Italic naredba",legend:"Pritisni ${italic}"},{name:"Underline naredba",legend:"Pritisni ${underline}"},{name:"Link naredba",legend:"Pritisni ${link}"},{name:"Smanji alatnu traku naredba",legend:"Pritisni ${toolbarCollapse}"},{name:"Access previous focus space naredba",legend:"Pritisni ${accessPreviousSpace} za pristup najbližem nedostupnom razmaku prije kursora, npr.: dva spojena HR elementa. Ponovnim pritiskom dohvatiti će se sljedeći nedostupni razmak."},
+{name:"Access next focus space naredba",legend:"Pritisni ${accessNextSpace} za pristup najbližem nedostupnom razmaku nakon kursora, npr.: dva spojena HR elementa. Ponovnim pritiskom dohvatiti će se sljedeći nedostupni razmak."},{name:"Pomoć za dostupnost",legend:"Pritisni ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/hu.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/hu.js
new file mode 100644
index 00000000..3de0bc06
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/hu.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","hu",{title:"Kisegítő utasítások",contents:"Súgó tartalmak. A párbeszédablak bezárásához nyomjon ESC-et.",legend:[{name:"Általános",items:[{name:"Szerkesztő Eszköztár",legend:"Nyomjon ${toolbarFocus} hogy kijelölje az eszköztárat. A következő és előző eszköztár csoporthoz a TAB és SHIFT TAB-al juthat el. A következő és előző eszköztár gombhoz a BAL NYÍL vagy JOBB NYÍL gombbal juthat el. Nyomjon SPACE-t vagy ENTER-t hogy aktiválja az eszköztár gombot."},{name:"Szerkesző párbeszéd ablak",
+legend:"Párbeszédablakban nyomjon TAB-ot a következő párbeszédmezőhöz ugráshoz, nyomjon SHIFT + TAB-ot az előző mezőhöz ugráshoz, nyomjon ENTER-t a párbeszédablak elfogadásához, nyomjon ESC-et a párbeszédablak elvetéséhez. Azokhoz a párbeszédablakokhoz, amik több fület tartalmaznak, nyomjon ALT + F10-et hogy a fülekre ugorjon. Ezután a TAB-al vagy a JOBB NYÍLLAL a következő fülre ugorhat. Az előző fülre ugráshoz használja a SHIFT + TAB-ot vagy a BAL NYILAT. Nyomjon SPACE-t vagy ENTER-t hogy kijelölje a fület."},
+{name:"Szerkesztő helyi menü",legend:"Nyomjon ${contextMenu}-t vagy ALKALMAZÁS BILLENTYŰT a helyi menü megnyitásához. Ezután a következő menüpontra léphet a TAB vagy LEFELÉ NYÍLLAL. Az előző opciót a SHIFT+TAB vagy FELFELÉ NYÍLLAL érheti el. Nyomjon SPACE-t vagy ENTER-t a menüpont kiválasztásához. A jelenlegi menüpont almenüjének megnyitásához nyomjon SPACE-t vagy ENTER-t, vagy JOBB NYILAT. A főmenühöz való visszatéréshez nyomjon ESC-et vagy BAL NYILAT. A helyi menü bezárása az ESC billentyűvel lehetséges."},
+{name:"Szerkesztő lista",legend:"A listán belül a következő elemre a TAB vagy LEFELÉ NYÍLLAL mozoghat. Az előző elem kiválasztásához nyomjon SHIFT+TAB-ot vagy FELFELÉ NYILAT. Nyomjon SPACE-t vagy ENTER-t az elem kiválasztásához. Az ESC billentyű megnyomásával bezárhatja a listát."},{name:"Szerkesztő elem utak sáv",legend:"Nyomj ${elementsPathFocus} hogy kijelöld a elemek út sávját. A következő elem gombhoz a TAB-al vagy a JOBB NYÍLLAL juthatsz el. Az előző gombhoz a SHIFT+TAB vagy BAL NYÍLLAL mehetsz. A SPACE vagy ENTER billentyűvel kiválaszthatod az elemet a szerkesztőben."}]},
+{name:"Parancsok",items:[{name:"Parancs visszavonása",legend:"Nyomj ${undo}"},{name:"Parancs megismétlése",legend:"Nyomjon ${redo}"},{name:"Félkövér parancs",legend:"Nyomjon ${bold}"},{name:"Dőlt parancs",legend:"Nyomjon ${italic}"},{name:"Aláhúzott parancs",legend:"Nyomjon ${underline}"},{name:"Link parancs",legend:"Nyomjon ${link}"},{name:"Szerkesztősáv összecsukása parancs",legend:"Nyomjon ${toolbarCollapse}"},{name:"Hozzáférés az előző fókusz helyhez parancs",legend:"Nyomj ${accessNextSpace} hogy hozzáférj a legközelebbi elérhetetlen fókusz helyhez a hiányjel előtt, például: két szomszédos HR elemhez. Ismételd meg a billentyűkombinációt hogy megtaláld a távolabbi fókusz helyeket."},
+{name:"Hozzáférés a következő fókusz helyhez parancs",legend:"Nyomj ${accessNextSpace} hogy hozzáférj a legközelebbi elérhetetlen fókusz helyhez a hiányjel után, például: két szomszédos HR elemhez. Ismételd meg a billentyűkombinációt hogy megtaláld a távolabbi fókusz helyeket."},{name:"Kisegítő súgó",legend:"Nyomjon ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/id.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/id.js
new file mode 100644
index 00000000..fe063491
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/id.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","id",{title:"Accessibility Instructions",contents:"Bantuan. Tekan ESC untuk menutup dialog ini.",legend:[{name:"Umum",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/it.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/it.js
new file mode 100644
index 00000000..1f4d5a5f
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/it.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","it",{title:"Istruzioni di Accessibilità",contents:"Contenuti di Aiuto. Per chiudere questa finestra premi ESC.",legend:[{name:"Generale",items:[{name:"Barra degli strumenti Editor",legend:"Premi ${toolbarFocus} per navigare fino alla barra degli strumenti. Muoviti tra i gruppi della barra degli strumenti con i tasti Tab e Maiusc-Tab. Spostati tra il successivo ed il precedente pulsante della barra degli strumenti usando le frecce direzionali Destra e Sinistra. Premi Spazio o Invio per attivare il pulsante della barra degli strumenti."},
+{name:"Finestra Editor",legend:"All'interno di una finestra di dialogo, premi Tab per navigare fino al campo successivo della finestra di dialogo, premi Maiusc-Tab per tornare al campo precedente, premi Invio per inviare la finestra di dialogo, premi Esc per uscire. Per le finestre che hanno schede multiple, premi Alt+F10 per navigare nella lista delle schede. Quindi spostati alla scheda successiva con il tasto Tab oppure con la Freccia Destra. Torna alla scheda precedente con Maiusc+Tab oppure con la Freccia Sinistra. Premi Spazio o Invio per scegliere la scheda."},
+{name:"Menù contestuale Editor",legend:"Premi ${contextMenu} o TASTO APPLICAZIONE per aprire il menu contestuale. Dunque muoviti all'opzione successiva del menu con il tasto TAB o con la Freccia Sotto. Muoviti all'opzione precedente con  MAIUSC+TAB o con Freccia Sopra. Premi SPAZIO o INVIO per scegliere l'opzione di menu. Apri il sottomenu dell'opzione corrente con SPAZIO o INVIO oppure con la Freccia Destra. Torna indietro al menu superiore con ESC oppure Freccia Sinistra. Chiudi il menu contestuale con ESC."},
+{name:"Box Lista Editor",legend:"Dentro un box-lista, muoviti al prossimo elemento della lista con TAB o con la Freccia direzionale giù. Spostati all'elemento precedente con MAIUSC+TAB oppure con Freccia direzionale sopra. Premi SPAZIO o INVIO per scegliere l'opzione della lista. Premi ESC per chiudere il box-lista."},{name:"Barra percorso elementi editor",legend:"Premi ${elementsPathFocus} per navigare tra gli elementi della barra percorso. Muoviti al prossimo pulsante di elemento con TAB o la Freccia direzionale destra. Muoviti al pulsante precedente con MAIUSC+TAB o la Freccia Direzionale Sinistra. Premi SPAZIO o INVIO per scegliere l'elemento nell'editor."}]},
+{name:"Comandi",items:[{name:" Annulla comando",legend:"Premi ${undo}"},{name:" Ripeti comando",legend:"Premi ${redo}"},{name:" Comando Grassetto",legend:"Premi ${bold}"},{name:" Comando Corsivo",legend:"Premi ${italic}"},{name:" Comando Sottolineato",legend:"Premi ${underline}"},{name:" Comando Link",legend:"Premi ${link}"},{name:" Comando riduci barra degli strumenti",legend:"Premi ${toolbarCollapse}"},{name:"Comando di accesso al precedente spazio di focus",legend:"Premi ${accessPreviousSpace} per accedere il più vicino spazio di focus non raggiungibile prima del simbolo caret, per esempio due elementi HR adiacenti. Ripeti la combinazione di tasti per raggiungere spazi di focus distanti."},
+{name:"Comando di accesso al prossimo spazio di focus",legend:"Premi ${accessNextSpace} per accedere il più vicino spazio di focus non raggiungibile dopo il simbolo caret, per esempio due elementi HR adiacenti. Ripeti la combinazione di tasti per raggiungere spazi di focus distanti."},{name:" Aiuto Accessibilità",legend:"Premi ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ja.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ja.js
new file mode 100644
index 00000000..0536a945
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ja.js
@@ -0,0 +1,8 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ja",{title:"ユーザー補助の説明",contents:"ヘルプ　このダイアログを閉じるには ESCを押してください。",legend:[{name:"全般",items:[{name:"エディターツールバー",legend:"${toolbarFocus} を押すとツールバーのオン/オフ操作ができます。カーソルをツールバーのグループで移動させるにはTabかSHIFT+Tabを押します。グループ内でカーソルを移動させるには、右カーソルか左カーソルを押します。スペースキーやエンターを押すとボタンを有効/無効にすることができます。"},{name:"編集ダイアログ",legend:"ダイヤログ内では、ダイアログの次の選択肢に移動するにはTabを押します。前の選択肢に移動するには、SHIFT+Tabを押します。ダイアログを決定するには、ENTERを押します。ESCでダイアログをキャンセルできます。複数のタブがあるダイアログではタブリストを操作するにはALT+F10を押します。次のタブに移動するにはTabか右カーソル、前のタブに戻るにはSHIFT+Tabか左カーソルです。タブページを決定するにはスペースもしくは、ENTERキーを押してください。"},
+{name:"エディターのメニュー",legend:"${contextMenu} キーかAPPLICATION KEYを押すとコンテキストメニューが開きます。Tabか下カーソルでメニューのオプション選択が下に移動します。戻るには、SHIFT+Tabか上カーソルです。スペースもしくはENTERキーでメニューオプションを決定できます。現在選んでいるオプションのサブメニューを開くには、スペース、もしくは右カーソルを押します。サブメニューから親メニューに戻るには、ESCか左カーソルを押してください。ESCでコンテキストメニュー自体をキャンセルできます。"},{name:"エディターリストボックス",legend:"リストボックス内で移動するには、Tabか下カーソルで次のアイテムへ移動します。SHIFT+Tabで前のアイテムに戻ります。リストのオプションを選択するには、スペースもしくは、ENTERを押してください。リストボックスを閉じるには、ESCを押してください。"},{name:"エディター要素パスバー",legend:"${elementsPathFocus} を押すとエレメントパスバーを操作出来ます。Tabか右カーソルで次のエレメントを選択できます。前のエレメントを選択するには、SHIFT+Tabか左カーソルです。スペースもしくは、ENTERでエディタ内の対象エレメントを選択出来ます。"}]},
+{name:"コマンド",items:[{name:"元に戻す",legend:"${undo} をクリック"},{name:"やり直し",legend:"${redo} をクリック"},{name:"太字",legend:"${bold} をクリック"},{name:"斜体 ",legend:"${italic} をクリック"},{name:"下線",legend:"${underline} をクリック"},{name:"リンク",legend:"${link} をクリック"},{name:"ツールバーを縮める",legend:"${toolbarCollapse} をクリック"},{name:"前のカーソル移動のできないポイントへ",legend:"${accessPreviousSpace} を押すとカーソルより前にあるカーソルキーで入り込めないスペースへ移動できます。例えば、HRエレメントが2つ接している場合などです。離れた場所へは、複数回キーを押します。"},{name:"次のカーソル移動のできないポイントへ",legend:"${accessNextSpace} を押すとカーソルより後ろにあるカーソルキーで入り込めないスペースへ移動できます。例えば、HRエレメントが2つ接している場合などです。離れた場所へは、複数回キーを押します。"},
+{name:"ユーザー補助ヘルプ",legend:"${a11yHelp} をクリック"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/km.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/km.js
new file mode 100644
index 00000000..3dfd4a09
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/km.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","km",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"ទូទៅ",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ku.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ku.js
new file mode 100644
index 00000000..6ceb4f72
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ku.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ku",{title:"ڕێنمای لەبەردەستدابوون",contents:"پێکهاتەی یارمەتی. کلیك ESC بۆ داخستنی ئەم دیالۆگه.",legend:[{name:"گشتی",items:[{name:"تووڵامرازی دەستكاریكەر",legend:"کلیك ${toolbarFocus} بۆ ڕابەری تووڵامراز. بۆ گواستنەوەی پێشوو داهاتووی گرووپی تووڵامرازی داگرتنی کلیلی TAB لەگەڵ‌ SHIFT-TAB. بۆ گواستنەوەی پێشوو داهاتووی دووگمەی تووڵامرازی لەڕێی کلیلی تیری دەستی ڕاست یان کلیلی تیری دەستی چەپ. کلیکی کلیلی SPACE یان ENTER بۆ چالاککردنی دووگمەی تووڵامراز."},{name:"دیالۆگی دەستكاریكەر",
+legend:"لەهەمانکاتدا کە تۆ لەدیالۆگی, کلیکی کلیلی TAB بۆ ڕابەری خانەی دیالۆگێکی تر, داگرتنی کلیلی SHIFT + TAB بۆ گواستنەوەی بۆ خانەی پێشووتر, کلیكی کلیلی ENTER بۆ ڕازیکردنی دیالۆگەکە, کلیكی کلیلی ESC بۆ هەڵوەشاندنەوەی دیالۆگەکە. بۆ دیالۆگی لەبازدەری (تابی) زیاتر, کلیكی کلیلی ALT + F10 بۆ ڕابەری لیستی بازدەرەکان. بۆ چوونە بازدەری تابی داهاتوو کلیكی کلیلی TAB یان کلیلی تیری دەستی ڕاست. بۆچوونە بازدەری تابی پێشوو داگرتنی کلیلی SHIFT + TAB یان کلیلی تیری دەستی چەپ. کلیی کلیلی SPACE یان ENTER بۆ هه‌ڵبژاردنی بازدەر (تاب)."},
+{name:"پێڕستی سەرنووسەر",legend:"کلیك ${contextMenu} یان دوگمەی لیسته‌(Menu) بۆ کردنەوەی لیستەی دەق. بۆ چوونە هەڵبژاردەیەکی تر له‌ لیسته‌ کلیکی کلیلی TAB یان کلیلی تیری ڕوو لەخوارەوه‌ بۆ چوون بۆ هەڵبژاردەی پێشوو کلیکی کلیلی SHIFT+TAB یان کلیلی تیری ڕوو له‌ سەرەوە. داگرتنی کلیلی SPACE یان ENTER بۆ هەڵبژاردنی هەڵبژاردەی لیسته‌. بۆ کردنەوەی لقی ژێر لیسته‌ لەهەڵبژاردەی لیستە کلیکی کلیلی SPACE یان ENTER یان کلیلی تیری دەستی ڕاست. بۆ گەڕانەوه بۆ سەرەوەی لیسته‌ کلیکی کلیلی ESC یان کلیلی تیری دەستی چەپ. بۆ داخستنی لیستە کلیكی کلیلی ESC بکە."},
+{name:"لیستی سنووقی سەرنووسەر",legend:"لەناو سنوقی لیست, چۆن بۆ هەڵنبژاردەی لیستێکی تر کلیکی کلیلی TAB یان کلیلی تیری ڕوو لەخوار. چوون بۆ هەڵبژاردەی لیستی پێشوو کلیکی کلیلی SHIFT + TAB یان کلیلی تیری ڕوو لەسەرەوه‌. کلیکی کلیلی SPACE یان ENTER بۆ دیاریکردنی ‌هەڵبژاردەی لیست. کلیکی کلیلی ESC بۆ داخستنی سنوقی لیست."},{name:"تووڵامرازی توخم",legend:"کلیك ${elementsPathFocus} بۆ ڕابەری تووڵامرازی توخمەکان. چوون بۆ دوگمەی توخمێکی تر کلیکی کلیلی TAB یان کلیلی تیری دەستی ڕاست. چوون بۆ دوگمەی توخمی پێشوو کلیلی SHIFT+TAB یان کلیکی کلیلی تیری دەستی چەپ. داگرتنی کلیلی SPACE یان ENTER بۆ دیاریکردنی توخمەکه‌ لەسەرنووسه."}]},
+{name:"فەرمانەکان",items:[{name:"پووچکردنەوەی فەرمان",legend:"کلیك ${undo}"},{name:"هەڵگەڕانەوەی فەرمان",legend:"کلیك ${redo}"},{name:"فەرمانی دەقی قەڵەو",legend:"کلیك ${bold}"},{name:"فەرمانی دەقی لار",legend:"کلیك ${italic}"},{name:"فەرمانی ژێرهێڵ",legend:"کلیك ${underline}"},{name:"فەرمانی به‌ستەر",legend:"کلیك ${link}"},{name:"شاردەنەوەی تووڵامراز",legend:"کلیك ${toolbarCollapse}"},{name:"چوونەناو سەرنجدانی پێشوی فەرمانی بۆشایی",legend:"کلیک ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:"چوونەناو سەرنجدانی داهاتووی فەرمانی بۆشایی",legend:"کلیک ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"دەستپێگەیشتنی یارمەتی",legend:"کلیك ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/lt.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/lt.js
new file mode 100644
index 00000000..550e595e
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/lt.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","lt",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Bendros savybės",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/lv.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/lv.js
new file mode 100644
index 00000000..0b974bff
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/lv.js
@@ -0,0 +1,11 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","lv",{title:"Pieejamības instrukcija",contents:"Palīdzības saturs. Lai aizvērtu ciet šo dialogu nospiediet ESC.",legend:[{name:"Galvenais",items:[{name:"Redaktora rīkjosla",legend:"Nospiediet ${toolbarFocus} lai pārvietotos uz rīkjoslu. Lai pārvietotos uz nākošo vai iepriekšējo rīkjoslas grupu izmantojiet pogu TAB un SHIFT+TAB.  Lai pārvietotos uz nākošo vai iepriekšējo rīkjoslas pogu izmantojiet Kreiso vai Labo bultiņu. Nospiediet Atstarpi vai ENTER lai aktivizētu rīkjosla pogu."},
+{name:"Redaktora dialoga  logs",legend:"Dialoga logā nospiediet pogu TAB lai pārvietotos uz nākošo dialoga loga lauku, nospiediet SHIFT+TAB lai atgrieztos iepriekšējā laukā, nospiediet ENTER lai apstiprinātu dialoga datus, nospiediet ESC lai aizvērtu šo dialogu. Dialogam kuram ir vairākas cilnes, nospiediet ALT+F10 lai pārvietotos uz nepieciešamo cilni.  Lai pārvietotos uz nākošo cilni izmantojiet pogu TAB vai Labo bultiņu. Lai pārvietotos uz iepriekšējo cilni nospiediet SHIFT+TAB vai kreiso bultiņu. Nospiediet SPACE vai ENTER lai izvēlētos lapas cilni."},
+{name:"Redaktora satura izvēle",legend:"Nospiediet ${contextMenu} vai APPLICATION KEY lai atvērtu satura izvēlni. Lai pārvietotos uz nākošo izvēlnes opciju izmantojiet pogu TAB vai pogu Bultiņu uz leju. Lai pārvietotos uz iepriekšējo opciju izmantojiet  SHIFT+TAB vai pogu Bultiņa uz augšu. Nospiediet SPACE vai ENTER lai izvelētos izvēlnes opciju. Atveriet tekošajā opcija apakšizvēlni ar SAPCE vai ENTER ka ari to var izdarīt ar Labo bultiņu. Lai atgrieztos atpakaļ uz sakuma izvēlni nospiediet ESC vai Kreiso bultiņu. Lai aizvērtu ciet izvēlnes saturu nospiediet ESC."},
+{name:"Redaktora saraksta lauks",legend:"Saraksta laukā, lai pārvietotos uz nākošo saraksta elementu nospiediet TAB vai pogu Bultiņa uz leju. Lai pārvietotos uz iepriekšējo saraksta elementu nospiediet SHIFT+TAB vai pogu Bultiņa uz augšu. Nospiediet SPACE vai ENTER lai izvēlētos saraksta opcijas. Nospiediet ESC lai aizvērtu saraksta lauku. "},{name:"Redaktora elementa ceļa josla",legend:"Nospiediet ${elementsPathFocus} lai pārvietotos uz  elementa ceļa joslu. Lai pārvietotos uz nākošo elementa pogu izmantojiet TAB vai Labo bultiņu. Lai pārvietotos uz iepriekšējo elementa pogu  izmantojiet SHIFT + TAB vai Kreiso bultiņu. Nospiediet SPACE vai ENTER lai izvēlētos elementu redaktorā."}]},
+{name:"Komandas",items:[{name:"Komanda atcelt darbību",legend:"Nospiediet ${undo}"},{name:"Komanda atkārtot darbību",legend:"Nospiediet ${redo}"},{name:"Treknraksta komanda",legend:"Nospiediet ${bold}"},{name:"Kursīva komanda",legend:"Nospiediet ${italic}"},{name:"Apakšsvītras komanda ",legend:"Nospiediet ${underline}"},{name:"Hipersaites komanda",legend:"Nospiediet ${link}"},{name:"Rīkjoslas aizvēršanas komanda",legend:"Nospiediet ${toolbarCollapse}"},{name:"Piekļūt iepriekšējai fokusa vietas komandai",
+legend:"Nospiediet ${accessPreviousSpace} lai piekļūtu tuvākajai nepieejamajai fokusa vietai pirms kursora. Piemēram: diviem blakus esošiem līnijas HR elementiem. Atkārtojiet taustiņu kombināciju lai piekļūtu pie tālākām vietām."},{name:"Piekļūt nākošā fokusa apgabala komandai",legend:"Nospiediet ${accessNextSpace} lai piekļūtu tuvākajai nepieejamajai fokusa vietai pēc kursora. Piemēram: diviem blakus esošiem līnijas HR elementiem. Atkārtojiet taustiņu kombināciju lai piekļūtu pie tālākām vietām."},
+{name:"Pieejamības palīdzība",legend:"Nospiediet ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/mk.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/mk.js
new file mode 100644
index 00000000..b23b8c2f
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/mk.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","mk",{title:"Инструкции за пристапност",contents:"Содржина на делот за помош. За да го затворите овој дијалот притиснете ESC.",legend:[{name:"Општо",items:[{name:"Мени за едиторот",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Дијалот за едиторот",
+legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},
+{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},
+{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/mn.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/mn.js
new file mode 100644
index 00000000..28af84ab
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/mn.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","mn",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Ерөнхий",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/nb.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/nb.js
new file mode 100644
index 00000000..a0b430c5
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/nb.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","nb",{title:"Instruksjoner for tilgjengelighet",contents:"Innhold for hjelp. Trykk ESC for å lukke denne dialogen.",legend:[{name:"Generelt",items:[{name:"Verktøylinje for editor",legend:"Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT-TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen."},{name:"Dialog for editor",
+legend:"Mens du er i en dialog, trykk TAB for å navigere til neste dialogfelt, press SHIFT + TAB for å flytte til forrige felt, trykk ENTER for å akseptere dialogen, trykk ESC for å avbryte dialogen. For dialoger med flere faner, trykk ALT + F10 for å navigere til listen over faner. Gå til neste fane med TAB eller HØYRE PILTAST. Gå til forrige fane med SHIFT + TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge fanen."},{name:"Kontekstmeny for editor",legend:"Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC."},
+{name:"Listeboks for editor",legend:"I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT + TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen."},{name:"Verktøylinje for elementsti",legend:"Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren."}]},
+{name:"Hurtigtaster",items:[{name:"Angre",legend:"Trykk ${undo}"},{name:"Gjør om",legend:"Trykk ${redo}"},{name:"Fet tekst",legend:"Trykk ${bold}"},{name:"Kursiv tekst",legend:"Trykk ${italic}"},{name:"Understreking",legend:"Trykk ${underline}"},{name:"Lenke",legend:"Trykk ${link}"},{name:"Skjul verktøylinje",legend:"Trykk ${toolbarCollapse}"},{name:"Gå til forrige fokusområde",legend:"Trykk ${accessPreviousSpace} for å komme til nærmeste fokusområde før skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet."},
+{name:"Gå til neste fokusområde",legend:"Trykk ${accessNextSpace} for å komme til nærmeste fokusområde etter skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet."},{name:"Hjelp for tilgjengelighet",legend:"Trykk ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/nl.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/nl.js
new file mode 100644
index 00000000..a4bc8835
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/nl.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","nl",{title:"Toegankelijkheidsinstructies",contents:"Help inhoud. Druk op ESC om dit dialoog te sluiten.",legend:[{name:"Algemeen",items:[{name:"Werkbalk tekstverwerker",legend:"Druk op ${toolbarFocus} om naar de werkbalk te navigeren. Om te schakelen naar de volgende en vorige werkbalkgroep, gebruik TAB en SHIFT+TAB. Om te schakelen naar de volgende en vorige werkbalkknop, gebruik de PIJL RECHTS en PIJL LINKS. Druk op SPATIE of ENTER om een werkbalkknop te activeren."},
+{name:"Dialoog tekstverwerker",legend:"In een dialoogvenster, druk op TAB om te navigeren naar het volgende veld. Druk op SHIFT+TAB om naar het vorige veld te navigeren. Druk op ENTER om het dialoogvenster te verzenden. Druk op ESC om het dialoogvenster te sluiten. Voor dialoogvensters met meerdere tabbladen, druk op ALT+F10 om naar de tabset te navigeren. Schakel naar het volgende tabblad met TAB of PIJL RECHTS. Schakel naar het vorige tabblad met SHIFT+TAB of PIJL LINKS. Druk op SPATIE of ENTER om het tabblad te selecteren."},
+{name:"Contextmenu tekstverwerker",legend:"Druk op ${contextMenu} of APPLICATION KEY om het contextmenu te openen. Schakel naar de volgende menuoptie met TAB of PIJL OMLAAG. Schakel naar de vorige menuoptie met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om een menuoptie te selecteren. Op een submenu van de huidige optie met SPATIE, ENTER of PIJL RECHTS. Ga terug naar de bovenliggende menuoptie met ESC of PIJL LINKS. Sluit het contextmenu met ESC."},{name:"Keuzelijst tekstverwerker",legend:"In een keuzelijst, schakel naar het volgende item met TAB of PIJL OMLAAG. Schakel naar het vorige item met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om het item te selecteren. Druk op ESC om de keuzelijst te sluiten."},
+{name:"Elementenpad werkbalk tekstverwerker",legend:"Druk op ${elementsPathFocus} om naar het elementenpad te navigeren. Om te schakelen naar het volgende element, gebruik TAB of PIJL RECHTS. Om te schakelen naar het vorige element, gebruik SHIFT+TAB or PIJL LINKS. Druk op SPATIE of ENTER om een element te selecteren in de tekstverwerker."}]},{name:"Opdrachten",items:[{name:"Ongedaan maken opdracht",legend:"Druk op ${undo}"},{name:"Opnieuw uitvoeren opdracht",legend:"Druk op ${redo}"},{name:"Vetgedrukt opdracht",
+legend:"Druk up ${bold}"},{name:"Cursief opdracht",legend:"Druk op ${italic}"},{name:"Onderstrepen opdracht",legend:"Druk op ${underline}"},{name:"Link opdracht",legend:"Druk op ${link}"},{name:"Werkbalk inklappen opdracht",legend:"Druk op ${toolbarCollapse}"},{name:"Ga naar vorige focus spatie commando",legend:"Druk ${accessPreviousSpace} om toegang te verkrijgen tot de dichtsbijzijnde onbereikbare focus spatie voor de caret, bijvoorbeeld: twee aangrenzende HR elementen. Herhaal de toetscombinatie om de verste focus spatie te bereiken."},
+{name:"Ga naar volgende focus spatie commando",legend:"Druk ${accessNextSpace} om toegang te verkrijgen tot de meest dichtbijzijnde onbereikbare focus spatie na de caret, bijvoorbeeld: twee aangrenzende HR elementen. Herhaal de toetscombinatie om de verste focus spatie te bereiken."},{name:"Toegankelijkheidshulp",legend:"Druk op ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/no.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/no.js
new file mode 100644
index 00000000..28a54e85
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/no.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","no",{title:"Instruksjoner for tilgjengelighet",contents:"Innhold for hjelp. Trykk ESC for å lukke denne dialogen.",legend:[{name:"Generelt",items:[{name:"Verktøylinje for editor",legend:"Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT-TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen."},{name:"Dialog for editor",
+legend:"Mens du er i en dialog, trykk TAB for å navigere til neste dialogfelt, press SHIFT + TAB for å flytte til forrige felt, trykk ENTER for å akseptere dialogen, trykk ESC for å avbryte dialogen. For dialoger med flere faner, trykk ALT + F10 for å navigere til listen over faner. Gå til neste fane med TAB eller HØYRE PILTAST. Gå til forrige fane med SHIFT + TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge fanen."},{name:"Kontekstmeny for editor",legend:"Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC."},
+{name:"Listeboks for editor",legend:"I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT + TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen."},{name:"Verktøylinje for elementsti",legend:"Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren."}]},
+{name:"Kommandoer",items:[{name:"Angre",legend:"Trykk ${undo}"},{name:"Gjør om",legend:"Trykk ${redo}"},{name:"Fet tekst",legend:"Trykk ${bold}"},{name:"Kursiv tekst",legend:"Trykk ${italic}"},{name:"Understreking",legend:"Trykk ${underline}"},{name:"Link",legend:"Trykk ${link}"},{name:"Skjul verktøylinje",legend:"Trykk ${toolbarCollapse}"},{name:"Gå til forrige fokusområde",legend:"Trykk ${accessPreviousSpace} for å komme til nærmeste fokusområde før skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet."},
+{name:"Gå til neste fokusområde",legend:"Trykk ${accessNextSpace} for å komme til nærmeste fokusområde etter skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet."},{name:"Hjelp for tilgjengelighet",legend:"Trykk ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/pl.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/pl.js
new file mode 100644
index 00000000..5031e74c
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/pl.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","pl",{title:"Instrukcje dotyczące dostępności",contents:"Zawartość pomocy. Wciśnij ESC, aby zamknąć to okno.",legend:[{name:"Informacje ogólne",items:[{name:"Pasek narzędzi edytora",legend:"Wciśnij ${toolbarFocus} aby przejść do paska narzędzi. Przejdź do następnej i poprzedniej grupy narzędzi używając TAB oraz SHIFT-TAB. Przejdź do następnego i poprzedniego narzędzia używając STRZAŁKI W PRAWO lub STRZAŁKI W LEWO. Wciśnij SPACJĘ lub ENTER, aby aktywować zaznaczone narzędzie."},
+{name:"Okno dialogowe edytora",legend:"Będąc w oknie dialogowym wciśnij TAB aby przejść do następnego pola dialogowego, wciśnij SHIFT + TAB aby przejść do poprzedniego pola, wciśnij ENTER aby wysłać dialog, wciśnij ESC aby anulować dialog. Dla okien dialogowych z wieloma zakładkami, wciśnij ALT + F10 aby przejść do listy zakładek. Gdy to zrobisz przejdź do następnej zakładki wciskając TAB lub STRZAŁKĘ W PRAWO. Przejdź do poprzedniej zakładki wciskając SHIFT + TAB lub STRZAŁKĘ W LEWO. Wciśnij SPACJĘ lub ENTER aby wybrać zakładkę."},
+{name:"Menu kontekstowe edytora",legend:"Wciśnij ${contextMenu} lub PRZYCISK APLIKACJI aby otworzyć menu kontekstowe. Przejdź do następnej pozycji menu wciskając TAB lub STRZAŁKĘ W DÓŁ. Przejdź do poprzedniej pozycji menu wciskając SHIFT + TAB lub STRZAŁKĘ W GÓRĘ. Wciśnij SPACJĘ lub ENTER aby wygrać pozycję menu. Otwórz pod-menu obecnej pozycji wciskając SPACJĘ lub ENTER lub STRZAŁKĘ W PRAWO. Wróć do pozycji nadrzędnego menu wciskając ESC lub STRZAŁKĘ W LEWO. Zamknij menu wciskając ESC."},{name:"Lista w edytorze",
+legend:"W polu listy możesz przechodzić do następnego elementu za pomocą klawisza TAB lub STRZAŁKI W DÓŁ. Poprzedni element osiągniesz za pomocą SHIFT+TAB lub STRZAŁKI W GÓRĘ. Za pomocą SPACJI lub ENTERA wybierzesz daną opcję z listy, a za pomocą klawisza ESC opuścisz listę."},{name:"Pasek ścieżki elementów edytora",legend:"Naciśnij ${elementsPathFocus} w celu przejścia do paska ścieżki elementów edytora. W celu przejścia do kolejnego elementu naciśnij klawisz Tab lub Strzałki w prawo. W celu przejścia do poprzedniego elementu naciśnij klawisze Shift+Tab lub Strzałki w lewo. By wybrać element w edytorze, użyj klawisza Spacji lub Enter."}]},
+{name:"Polecenia",items:[{name:"Polecenie Cofnij",legend:"Naciśnij ${undo}"},{name:"Polecenie Ponów",legend:"Naciśnij ${redo}"},{name:"Polecenie Pogrubienie",legend:"Naciśnij ${bold}"},{name:"Polecenie Kursywa",legend:"Naciśnij ${italic}"},{name:"Polecenie Podkreślenie",legend:"Naciśnij ${underline}"},{name:"Polecenie Wstaw/ edytuj odnośnik",legend:"Naciśnij ${link}"},{name:"Polecenie schowaj pasek narzędzi",legend:"Naciśnij ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Pomoc dotycząca dostępności",legend:"Naciśnij ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/pt-br.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/pt-br.js
new file mode 100644
index 00000000..f5ab7c6a
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/pt-br.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","pt-br",{title:"Instruções de Acessibilidade",contents:"Conteúdo da Ajuda. Para fechar este diálogo pressione ESC.",legend:[{name:"Geral",items:[{name:"Barra de Ferramentas do Editor",legend:"Pressione ${toolbarFocus} para navegar para a barra de ferramentas. Mova para o anterior ou próximo grupo de ferramentas com TAB e SHIFT-TAB. Mova para o anterior ou próximo botão com SETA PARA DIREITA or SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para ativar o botão da barra de ferramentas."},
+{name:"Diálogo do Editor",legend:"Dentro de um diálogo, pressione TAB para navegar para o próximo campo, pressione SHIFT + TAB para mover para o campo anterior, pressione ENTER para enviar o diálogo, pressione ESC para cancelar o diálogo. Para diálogos que tem múltiplas abas, pressione ALT + F10 para navegar para a lista de abas, então mova para a próxima aba com SHIFT + TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar a aba."},{name:"Menu de Contexto do Editor",legend:"Pressione ${contextMenu} ou TECLA DE MENU para abrir o menu de contexto, então mova para a próxima opção com TAB ou SETA PARA BAIXO. Mova para a anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu. Abra o submenu da opção atual com ESPAÇO ou ENTER ou SETA PARA DIREITA. Volte para o menu pai com ESC ou SETA PARA ESQUERDA. Feche o menu de contexto com ESC."},
+{name:"Caixa de Lista do Editor",legend:"Dentro de uma caixa de lista, mova para o próximo item com TAB ou SETA PARA BAIXO. Mova para o item anterior com SHIFT + TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar uma opção na lista. Pressione ESC para fechar a caixa de lista."},{name:"Barra de Caminho do Elementos do Editor",legend:"Pressione ${elementsPathFocus} para a barra de caminho dos elementos. Mova para o próximo botão de elemento com TAB ou SETA PARA DIREITA. Mova para o botão anterior com  SHIFT+TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o elemento no editor."}]},
+{name:"Comandos",items:[{name:" Comando Desfazer",legend:"Pressione ${undo}"},{name:" Comando Refazer",legend:"Pressione ${redo}"},{name:" Comando Negrito",legend:"Pressione ${bold}"},{name:" Comando Itálico",legend:"Pressione ${italic}"},{name:" Comando Sublinhado",legend:"Pressione ${underline}"},{name:" Comando Link",legend:"Pressione ${link}"},{name:" Comando Fechar Barra de Ferramentas",legend:"Pressione ${toolbarCollapse}"},{name:"Acessar o comando anterior de spaço de foco",legend:"Pressione ${accessNextSpace} para acessar o espaço de foco não alcançável mais próximo antes do cursor, por exemplo: dois elementos HR adjacentes. Repita a combinação de teclas para alcançar espaços de foco distantes."},
+{name:"Acessar próximo fomando de spaço de foco",legend:"Pressione ${accessNextSpace} para acessar o espaço de foco não alcançável mais próximo após o cursor, por exemplo: dois elementos HR adjacentes. Repita a combinação de teclas para alcançar espaços de foco distantes."},{name:" Ajuda de Acessibilidade",legend:"Pressione ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/pt.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/pt.js
new file mode 100644
index 00000000..79d72b1b
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/pt.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","pt",{title:"Instruções de Acessibilidade",contents:"Conteúdos da Ajuda. Pressione em 'ESC' para fechar esta janela.",legend:[{name:"Geral",items:[{name:"Barra de Ferramentas do Editor",legend:"Clique em ${toolbarFocus} para navegar para a barra de ferramentas. Vá para o grupo da barra de ferramentas anterior e seguinte com TAB e SHIFT+TAB. Vá para o botão da barra de ferramentas anterior com a SETA DIREITA ou ESQUERDA. Pressione ESPAÇO ou ENTER para ativar o botão da barra de ferramentas."},
+{name:"Janela do Editor",legend:"Dentro de uma janela, pressione TAB para navigar para o campo da janela seguinte, pressione SHIFT + TAB para mover para o campo anterior, pressione ENTER para submeter a janela, pressione ESC para cancelar a janela. Para as janelas que têm múltiplos páginas com separadores, pressione ALT + F10 para navegar para a lista do separador. Depois mova para o seguinte separador com TAB ou SETA DIREITA. Mover para o separador anterior com SHIFT + TAB ou SETA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o separador da página."},
+{name:"Menu de Contexto do Editor",legend:"Clique em ${contextMenu} ou TECLA APLICAÇÃO para abrir o menu de contexto. Depois vá para a opção do menu seguinte com TAB ou SETA PARA BAIXO. Vá para a opção anterior com  SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu.  Abra o submenu da opção atual com ESPAÇO, ENTER ou SETA DIREITA. GVá para o item do menu parente  com ESC ou SETA ESQUERDA. Feche o menu de contexto com ESC."},{name:"Caixa Lista Editor",legend:"Dentro da caixa da lista, vá para o itemda lista seguinte com TAB ou SETA PARA BAIXO. Move Vá parao item da lista anterior com SHIFT+TAB ou SETA PARA BAIXO. Pressione ESPAÇO ou ENTER para selecionar a opção da lista. Pressione ESC para fechar a caisa da lista."},
+{name:"Caminho Barra Elemento Editor",legend:"Clique em ${elementsPathFocus} para navegar para a barra do caminho dos elementos. Vá para o botão do elemento seguinte com TAB ou SETA DIREITA. Vá para o botão anterior com   SHIFT+TAB ou SETA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o elemento no editor."}]},{name:"Comandos",items:[{name:"Comando de Anular",legend:"Pressione ${undo}"},{name:"Comando de Refazer",legend:"Pressione ${redo}"},{name:"Comando de Negrito",legend:"Pressione ${bold}"},
+{name:"Comando de Itálico",legend:"Pressione ${italic}"},{name:"Comando de Sublinhado",legend:"Pressione ${underline}"},{name:"Comando de Hiperligação",legend:"Pressione ${link}"},{name:"Comando de Ocultar Barra de Ferramentas",legend:"Pressione ${toolbarCollapse}"},{name:"Acesso comando do espaço focus anterior",legend:"Clique em ${accessPreviousSpace} para aceder ao espaço do focos inalcançável mais perto antes do sinal de omissão, por exemplo: dois elementos HR adjacentes. Repetir a combinação da chave para alcançar os espaços dos focos distantes."},
+{name:"Acesso comando do espaço focus seguinte",legend:"Pressione ${accessNextSpace} para aceder ao espaço do focos inalcançável mais perto depois do sinal de omissão, por exemplo: dois elementos HR adjacentes. Repetir a combinação da chave para alcançar os espaços dos focos distantes."},{name:"Ajuda de Acessibilidade",legend:"Pressione ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ro.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ro.js
new file mode 100644
index 00000000..b6cda728
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ro.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ro",{title:"Instrucțiuni de accesibilitate",contents:"Cuprins. Pentru a închide acest dialog, apăsați tasta ESC.",legend:[{name:"General",items:[{name:"Editează bara.",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Dialog editor",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor meniu contextual",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ru.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ru.js
new file mode 100644
index 00000000..8ea8f9a0
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ru.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ru",{title:"Горячие клавиши",contents:"Помощь. Для закрытия этого окна нажмите ESC.",legend:[{name:"Основное",items:[{name:"Панель инструментов",legend:"Нажмите ${toolbarFocus} для перехода к панели инструментов. Для перемещения между группами панели инструментов используйте TAB и SHIFT-TAB. Для перемещения между кнопками панели иструментов используйте кнопки ВПРАВО или ВЛЕВО. Нажмите ПРОБЕЛ или ENTER для запуска кнопки панели инструментов."},{name:"Диалоги",legend:"В диалоговом окне, нажмите клавишу TAB для перехода к следующему диалоговому полю, нажмите клавиши SHIFT + TAB, чтобы перейти к предыдущему полю, нажмите ENTER, чтобы отправить данные, нажмите клавишу ESC, для отмены. Для окон, которые имеют несколько вкладок, нажмите ALT + F10 для перехода к списку вкладок. Переход к следующей вкладке TAB ИЛИ ПРАВУЮ СТРЕЛКУ. Переход к предыдущей вкладке с помощью SHIFT + TAB или ЛЕВАЯ СТРЕЛКА. Нажмите ПРОБЕЛ или ENTER, чтобы выбрать вкладку."},
+{name:"Контекстное меню",legend:'Нажмите ${contextMenu} или клавишу APPLICATION, чтобы открыть контекстное меню. Затем перейдите к следующему пункту меню с помощью TAB или стрелкой "ВНИЗ". Переход к предыдущей опции - SHIFT+TAB или стрелкой "ВВЕРХ". Нажмите SPACE, или ENTER, чтобы задействовать опцию меню. Открыть подменю текущей опции - SPACE или ENTER или стрелкой "ВПРАВО". Возврат к родительскому пункту меню - ESC или стрелкой "ВЛЕВО". Закрытие контекстного меню - ESC.'},{name:"Редактор списка",
+legend:'Внутри окна списка, переход к следующему пункту списка - TAB или стрелкой "ВНИЗ". Переход к предыдущему пункту списка - SHIFT + TAB или стрелкой "ВВЕРХ". Нажмите SPACE, или ENTER, чтобы задействовать опцию списка. Нажмите ESC, чтобы закрыть окно списка.'},{name:"Путь к элементу",legend:'Нажмите ${elementsPathFocus}, чтобы перейти к панели пути элементов. Переход к следующей кнопке элемента - TAB или стрелкой "ВПРАВО". Переход к предыдущей кнопку - SHIFT+TAB или стрелкой "ВЛЕВО". Нажмите SPACE, или ENTER, чтобы выбрать элемент в редакторе.'}]},
+{name:"Команды",items:[{name:"Отменить",legend:"Нажмите ${undo}"},{name:"Повторить",legend:"Нажмите ${redo}"},{name:"Полужирный",legend:"Нажмите ${bold}"},{name:"Курсив",legend:"Нажмите ${italic}"},{name:"Подчеркнутый",legend:"Нажмите ${underline}"},{name:"Гиперссылка",legend:"Нажмите ${link}"},{name:"Свернуть панель инструментов",legend:"Нажмите ${toolbarCollapse}"},{name:"Команды доступа к предыдущему фокусному пространству",legend:'Нажмите ${accessPreviousSpace}, чтобы обратиться к ближайшему недостижимому фокусному пространству перед символом "^", например: два смежных HR элемента. Повторите комбинацию клавиш, чтобы достичь отдаленных фокусных пространств.'},
+{name:"Команды доступа к следующему фокусному пространству",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Справка по горячим клавишам",legend:"Нажмите ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/si.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/si.js
new file mode 100644
index 00000000..816dc754
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/si.js
@@ -0,0 +1,8 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","si",{title:"ළඟා වියහැකි ",contents:"උදව් සඳහා අන්තර්ගතය.නික්මයෙමට ESC බොත්තම ඔබන්න",legend:[{name:"පොදු කරුණු",items:[{name:"සංස්කරණ මෙවලම් ",legend:"ඔබන්න ${මෙවලම් තීරු අවධානය} මෙවලම් තීරුවේ එහා මෙහා යෑමට.ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරුකාණ්ඩය හා TAB හා SHIFT-TAB .ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරු බොත්තම සමග RIGHT ARROW හෝ LEFT ARROW.මෙවලම් තීරු බොත්තම සක්‍රිය කර ගැනීමට  SPACE හෝ  ENTER බොත්තම ඔබන්න."},{name:"සංස්කරණ ",legend:"දෙබසක් තුළ, ඊළඟ දෙබස් පෙදෙසට යෑමට TAB බොත්තම ඔබන්න, කලින් පෙදෙසට යෑමට SHIFT + TAB බොත්තම ද, දෙබස් ඉදිරිපත් කිරීමට ENTER බොත්තම ද, දෙබස් නැවතීමට  ESCබොත්තම ද, දෙබස් සහිත ගොනු, පිටු වැඩි සංක්‍යයාවක් ලබා ගෙනිමට,ගොනු තුළ එහාමෙහා යෑමට ALT + F10 බොත්තම් ද, ඊළඟ ගොනුවට යෑමට TAB හෝ RIGTH ARROW බොත්තම ඔබන්න. පෙර ගොනුවට යෑමට SHIFT + TAB හෝ LEFT ARROW බොත්තම් ද ,ගොනු පිටු තේරීමට  SPACE හෝ ENTER බොත්තම් ද ඔබන්න."},
+{name:"සංස්කරණ අඩංගුවට ",legend:"ඔබන්න ${අන්තර්ගත මෙනුව} හෝ  APPLICATION KEY  අන්තර්ගත-මෙනුව විවුරතකිරීමට. ඊළඟ මෙනුව-ව්කල්පයන්ට යෑමට TAB හෝ DOWN ARROW බොත්තම ද, පෙර විකල්පයන්ටයෑමට SHIFT+TAB හෝ  UP ARROW බොත්තම ද, මෙනුව-ව්කල්පයන් තේරීමට SPACE හෝ ENTER බොත්තම ද,  දැනට විවුර්තව ඇති උප-මෙනුවක වීකල්ප තේරීමට SPACE හෝ ENTER හෝ RIGHT ARROW ද, නැවත පෙර ප්‍රධාන මෙනුවට යෑමට  ESC හෝ LEFT ARROW බොත්තම ද.  අන්තර්ගත-මෙනුව වැසීමට  ESC බොත්තම ද ඔබන්න."},{name:"සංස්කරණ තේරුම් ",legend:"තේරුම් කොටුව තුළ , ඊළඟ අයිතමයට යෑමට TAB හෝ DOWN ARROW , පෙර අයිතමයට යෑමට  SHIFT + TAB හෝ UP ARROW . අයිතම විකල්පයන් තේරීමට  SPACE හෝ  ENTER ,තේරුම් කොටුව වැසීමට ESC බොත්තම් ද ඔබන්න."},
+{name:"සංස්කරණ අංග සහිත ",legend:"ඔබන්න ${මෙවලම් තීරු අවධානය} මෙවලම් තීරුවේ එහා මෙහා යෑමට.ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරුකාණ්ඩය හා TAB හා SHIFT-TAB .ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරු බොත්තම සමග RIGHT ARROW හෝ LEFT ARROW.මෙවලම් තීරු බොත්තම සක්‍රිය කර ගැනීමට  SPACE හෝ  ENTER බොත්තම ඔබන්න."}]},{name:"විධාන",items:[{name:"විධානය වෙනස් ",legend:"ඔබන්න ${වෙනස් කිරීම}"},{name:"විධාන නැවත් පෙර පරිදිම වෙනස්කර ගැනීම.",legend:"ඔබන්න ${නැවත් පෙර පරිදිම වෙනස්කර ගැනීම}"},{name:"තද අකුරින් විධාන",legend:"ඔබන්න ${තද }"},
+{name:"බැධී අකුරු විධාන",legend:"ඔබන්න ${බැධී අකුරු }"},{name:"යටින් ඉරි ඇද ඇති විධාන.",legend:"ඔබන්න ${යටින් ඉරි ඇද ඇති}"},{name:"සම්බන්ධිත විධාන",legend:"ඔබන්න ${සම්බන්ධ }"},{name:"මෙවලම් තීරු හැකුලුම් විධාන",legend:"ඔබන්න ${මෙවලම් තීරු හැකුලුම් }"},{name:"යොමුවීමට පෙර  වැදගත්  විධාන",legend:"ඔබන්න ${යොමුවීමට ඊළඟ }"},{name:"යොමුවීමට ඊළග වැදගත්  විධාන",legend:"ඔබන්න ${යොමුවීමට ඊළඟ }"},{name:"ප්‍රවේශ ",legend:"ඔබන්න  ${a11y }"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sk.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sk.js
new file mode 100644
index 00000000..9d40e790
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sk.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","sk",{title:"Inštrukcie prístupnosti",contents:"Pomocný obsah. Pre zatvorenie tohto okna, stlačte ESC.",legend:[{name:"Všeobecne",items:[{name:"Lišta nástrojov editora",legend:"Stlačte ${toolbarFocus} pre navigáciu na lištu nástrojov. Medzi ďalšou a predchádzajúcou lištou nástrojov sa pohybujete s TAB a SHIFT-TAB. Medzi ďalším a predchádzajúcim tlačidlom na lište nástrojov sa pohybujete s pravou šípkou a ľavou šípkou. Stlačte medzerník alebo ENTER pre aktiváciu tlačidla lišty nástrojov."},
+{name:"Editorový dialóg",legend:"V dialogu, stlačte TAB pre navigáciu na ďalšie dialógové pole, stlačte STIFT + TAB pre presun na predchádzajúce pole, stlačte ENTER pre odoslanie dialógu, stlačte ESC pre zrušenie dialógu. Pre dialógy, ktoré majú viac záložiek, stlačte ALT + F10 pre navigácou do zoznamu záložiek. Potom sa posúvajte k ďalšej žáložke pomocou TAB alebo pravou šípkou. Pre presun k predchádzajúcej záložke, stlačte SHIFT + TAB alebo ľavú šípku. Stlačte medzerník alebo ENTER pre vybranie záložky."},
+{name:"Editorové kontextové menu",legend:"Stlačte ${contextMenu} alebo APPLICATION KEY pre otvorenie kontextového menu. Potom sa presúvajte na ďalšie možnosti menu s TAB alebo dolnou šípkou. Presunte sa k predchádzajúcej možnosti s SHIFT + TAB alebo hornou šípkou. Stlačte medzerník alebo ENTER pre výber možnosti menu. Otvorte pod-menu danej možnosti s medzerníkom, alebo ENTER, alebo pravou šípkou. Vráťte sa späť do položky rodičovského menu s ESC alebo ľavou šípkou. Zatvorte kontextové menu s ESC."},
+{name:"Editorov box zoznamu",legend:"V boxe zoznamu, presuňte sa na ďalšiu položku v zozname s TAB alebo dolnou šípkou. Presuňte sa k predchádzajúcej položke v zozname so SHIFT + TAB alebo hornou šípkou. Stlačte medzerník alebo ENTER pre výber možnosti zoznamu. Stlačte ESC pre zatvorenie boxu zoznamu."},{name:"Editorove pásmo cesty prvku",legend:"Stlačte ${elementsPathFocus} pre navigovanie na pásmo cesty elementu. Presuňte sa na tlačidlo ďalšieho prvku s TAB alebo pravou šípkou. Presuňte sa k predchádzajúcemu tlačidlu s SHIFT + TAB alebo ľavou šípkou. Stlačte medzerník alebo ENTER pre výber prvku v editore."}]},
+{name:"Príkazy",items:[{name:"Vrátiť príkazy",legend:"Stlačte ${undo}"},{name:"Nanovo vrátiť príkaz",legend:"Stlačte ${redo}"},{name:"Príkaz na stučnenie",legend:"Stlačte ${bold}"},{name:"Príkaz na kurzívu",legend:"Stlačte ${italic}"},{name:"Príkaz na podčiarknutie",legend:"Stlačte ${underline}"},{name:"Príkaz na odkaz",legend:"Stlačte ${link}"},{name:"Príkaz na zbalenie lišty nástrojov",legend:"Stlačte ${toolbarCollapse}"},{name:"Prejsť na predchádzajúcu zamerateľnú medzeru príkazu",legend:"Stlačte ${accessPreviousSpace} pre prístup na najbližšie nedosiahnuteľné zamerateľné medzery pred vsuvkuo. Napríklad: dve za sebou idúce horizontálne čiary. Opakujte kombináciu klávesov pre dosiahnutie vzdialených zamerateľných medzier."},
+{name:"Prejsť na ďalší ",legend:"Stlačte ${accessNextSpace} pre prístup na najbližšie nedosiahnuteľné zamerateľné medzery po vsuvke. Napríklad: dve za sebou idúce horizontálne čiary. Opakujte kombináciu klávesov pre dosiahnutie vzdialených zamerateľných medzier."},{name:"Pomoc prístupnosti",legend:"Stlačte ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sl.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sl.js
new file mode 100644
index 00000000..f5dd3100
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sl.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","sl",{title:"Navodila Dostopnosti",contents:"Vsebina Pomoči. Če želite zapreti to pogovorno okno pritisnite ESC.",legend:[{name:"Splošno",items:[{name:"Urejevalna Orodna Vrstica",legend:"Pritisnite ${toolbarFocus} za pomik v orodno vrstico. Z TAB in SHIFT-TAB se pomikate na naslednjo in prejšnjo skupino orodne vrstice. Z DESNO PUŠČICO ali LEVO PUŠČICO se pomikate na naslednji in prejšnji gumb orodne vrstice. Pritisnite SPACE ali ENTER, da aktivirate gumb orodne vrstice."},
+{name:"Urejevalno Pogovorno Okno",legend:"Znotraj pogovornega okna, pritisnite tipko TAB za pomik na naslednjo pogovorno polje, pritisnite SHIFT + TAB za pomik v prejšnje polje, pritisnite tipko ENTER za predložitev pogovornega okna, pritisnite tipko ESC, da prekličete okno. Za okna, ki imajo več zavihkov, pritisnite ALT + F10, da pojdete na seznam zavihkov. Na naslednji zavihek se premaknete s tipko TAB ali DESNO PUŠČICO. Z SHIFT + TAB ali LEVO PUŠČICO pa se premaknete na prejšnji zavihek. Pritisnite tipko SPACE ali ENTER za izbiro zavihka."},
+{name:"Urejevalni Kontekstni Meni",legend:"Pritisnite ${contextMenu} ali APPLICATION KEY, da odprete kontekstni meni. Nato se premaknite na naslednjo možnost menija s tipko TAB ali PUŠČICA DOL. Premakniti se na prejšnjo možnost z SHIFT + TAB ali PUŠČICA GOR. Pritisnite SPACE ali ENTER za izbiro možnosti menija. Odprite podmeni trenutne možnosti menija s tipko SPACE ali ENTER ali DESNA PUŠČICA. Vrnite se na matični element menija s tipko ESC ali LEVA PUŠČICA. Zaprite kontekstni meni z ESC."},{name:"Urejevalno Seznamsko Polje",
+legend:"Znotraj seznama, se premaknete na naslednji element seznama s tipko TAB ali PUŠČICO DOL. Z SHIFT + TAB ali PUŠČICO GOR se premaknete na prejšnji element seznama. Pritisnite tipko SPACE ali ENTER za izbiro elementa. Pritisnite tipko ESC, da zaprete seznam."},{name:"Urejevalna vrstica poti elementa",legend:"Pritisnite ${elementsPathFocus} za pomikanje po vrstici elementnih poti. S TAB ali DESNA PUŠČICA se premaknete na naslednji gumb elementa. Z SHIFT + TAB ali LEVO PUŠČICO se premaknete na prejšnji gumb elementa. Pritisnite SPACE ali ENTER za izbiro elementa v urejevalniku."}]},
+{name:"Ukazi",items:[{name:"Razveljavi ukaz",legend:"Pritisnite ${undo}"},{name:"Ponovi ukaz",legend:"Pritisnite ${redo}"},{name:"Krepki ukaz",legend:"Pritisnite ${bold}"},{name:"Ležeči ukaz",legend:"Pritisnite ${italic}"},{name:"Poudarni ukaz",legend:"Pritisnite ${underline}"},{name:"Ukaz povezave",legend:"Pritisnite ${link}"},{name:"Skrči Orodno Vrstico Ukaz",legend:"Pritisnite ${toolbarCollapse}"},{name:"Dostop do prejšnjega ukaza ostrenja",legend:"Pritisnite ${accessPreviousSpace} za dostop do najbližjega nedosegljivega osredotočenega prostora pred strešico, npr.: dva sosednja HR elementa. Ponovite kombinacijo tipk, da dosežete oddaljene osredotočene prostore."},
+{name:"Dostop do naslednjega ukaza ostrenja",legend:"Pritisnite ${accessNextSpace} za dostop do najbližjega nedosegljivega osredotočenega prostora po strešici, npr.: dva sosednja HR elementa. Ponovite kombinacijo tipk, da dosežete oddaljene osredotočene prostore."},{name:"Pomoč Dostopnosti",legend:"Pritisnite ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sq.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sq.js
new file mode 100644
index 00000000..9e4d6967
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sq.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","sq",{title:"Udhëzimet e Qasjes",contents:"Përmbajtja ndihmëse. Për ta mbyllur dialogun shtyp ESC.",legend:[{name:"Të përgjithshme",items:[{name:"Shiriti i Redaktuesit",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Dialogu i Redaktuesit",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Komandat",items:[{name:"Rikthe komandën",legend:"Shtyp ${undo}"},{name:"Ribëj komandën",legend:"Shtyp ${redo}"},{name:"Komanda e trashjes së tekstit",legend:"Shtyp ${bold}"},{name:"Komanda kursive",legend:"Shtyp ${italic}"},
+{name:"Komanda e nënvijëzimit",legend:"Shtyp ${underline}"},{name:"Komanda e Nyjes",legend:"Shtyp ${link}"},{name:" Toolbar Collapse command",legend:"Shtyp ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:"Ndihmë Qasjeje",legend:"Shtyp ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sr-latn.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sr-latn.js
new file mode 100644
index 00000000..56a40830
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sr-latn.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","sr-latn",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Opšte",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sr.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sr.js
new file mode 100644
index 00000000..e2dc7af8
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sr.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","sr",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Опште",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",
+legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sv.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sv.js
new file mode 100644
index 00000000..1fd8cf12
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/sv.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","sv",{title:"Hjälpmedelsinstruktioner",contents:"Hjälpinnehåll. För att stänga denna dialogruta trycker du på ESC.",legend:[{name:"Allmänt",items:[{name:"Editor verktygsfält",legend:"Tryck på ${toolbarFocus} för att navigera till verktygsfältet. Flytta till nästa och föregående verktygsfältsgrupp med TAB och SHIFT-TAB. Flytta till nästa och föregående knapp i verktygsfältet med HÖGERPIL eller VÄNSTERPIL. Tryck Space eller ENTER för att aktivera knappen i verktygsfältet."},
+{name:"Dialogeditor",legend:"Inuti en dialogruta, tryck TAB för att navigera till nästa fält i dialogrutan. Du trycker SKIFT + TAB för att flytta till föregående fält. Tryck ENTER för att skicka. Du avbryter och stänger dialogen med ESC. För dialogrutor som har flera flikar, tryck ALT + F10 navigera till fliklistan. Flytta sedan till nästa flik med HÖGERPIL. Flytta till föregående flik med SHIFT + TAB eller VÄNSTERPIL. Tryck Space eller ENTER för att välja fliken."},{name:"Editor för innehållsmeny",
+legend:"Tryck på $ {contextMenu} eller PROGRAMTANGENTEN för att öppna snabbmenyn. Flytta sedan till nästa menyalternativ med TAB eller NEDPIL. Flytta till föregående alternativ med SHIFT + TABB eller UPPIL. Tryck Space eller ENTER för att välja menyalternativ. Öppna undermeny av nuvarande alternativ med SPACE eller ENTER eller HÖGERPIL. Gå tillbaka till överordnade menyalternativ med ESC eller VÄNSTERPIL. Stäng snabbmenyn med ESC."},{name:"Editor för List Box",legend:"Inuti en list-box, gå till nästa listobjekt med TAB eller NEDPIL. Flytta till föregående listobjekt med SHIFT + TAB eller UPPIL. Tryck Space eller ENTER för att välja listan alternativet. Tryck ESC för att stänga listan-boxen."},
+{name:"Editor för elementens sökväg",legend:"Tryck på $ {elementsPathFocus} för att navigera till verktygsfältet för elementens sökvägar. Flytta till nästa elementknapp med TAB eller HÖGERPIL. Flytta till föregående knapp med SKIFT + TAB eller VÄNSTERPIL. Tryck Space eller ENTER för att välja element i redigeraren."}]},{name:"Kommandon",items:[{name:"Kommandot ångra",legend:"Tryck på ${undo}"},{name:"Kommandot gör om",legend:"Tryck på ${redo}"},{name:"Kommandot fet stil",legend:"Tryck på ${bold}"},
+{name:"Kommandot kursiv",legend:"Tryck på ${italic}"},{name:"Kommandot understruken",legend:"Tryck på ${underline}"},{name:"kommandot länk",legend:"Tryck på ${link}"},{name:"Verktygsfält Dölj kommandot",legend:"Tryck på ${toolbarCollapse}"},{name:"Gå till föregående fokus plats",legend:"Tryck på ${accessPreviousSpace} för att gå till närmast onåbara utrymme före markören, exempel: två intilliggande HR element. Repetera tangentkombinationen för att gå till nästa."},{name:"Tillgå nästa fokuskommandots utrymme",
+legend:"Tryck ${accessNextSpace} på för att komma åt den närmaste onåbar fokus utrymme efter cirkumflex, till exempel: två intilliggande HR element. Upprepa tangentkombinationen för att nå avlägsna fokus utrymmen."},{name:"Hjälp om tillgänglighet",legend:"Tryck ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/th.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/th.js
new file mode 100644
index 00000000..25cf28cb
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/th.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","th",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"ทั่วไป",items:[{name:"แถบเครื่องมือสำหรับเครื่องมือช่วยพิมพ์",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},
+{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with  SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"คำสั่ง",items:[{name:"เลิกทำคำสั่ง",legend:"วาง ${undo}"},{name:"คำสั่งสำหรับทำซ้ำ",legend:"วาง ${redo}"},{name:"คำสั่งสำหรับตัวหนา",legend:"วาง ${bold}"},{name:"คำสั่งสำหรับตัวเอียง",legend:"วาง ${italic}"},{name:"คำสั่งสำหรับขีดเส้นใต้",
+legend:"วาง ${underline}"},{name:"คำสั่งสำหรับลิงก์",legend:"วาง ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},
+{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/tr.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/tr.js
new file mode 100644
index 00000000..768e522f
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/tr.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","tr",{title:"Erişilebilirlik Talimatları",contents:"Yardım içeriği. Bu pencereyi kapatmak için ESC tuşuna basın.",legend:[{name:"Genel",items:[{name:"Düzenleyici Araç Çubuğu",legend:"Araç çubuğunda gezinmek için ${toolbarFocus} basın. TAB ve SHIFT-TAB ile önceki ve sonraki araç çubuğu grubuna taşıyın. SAĞ OK veya SOL OK ile önceki ve sonraki bir araç çubuğu düğmesini hareket ettirin. SPACE tuşuna basın veya araç çubuğu düğmesini etkinleştirmek için ENTER tuşna basın."},
+{name:"Diyalog Düzenleyici",legend:"Dialog penceresi içinde, sonraki iletişim alanına gitmek için SEKME tuşuna basın, önceki alana geçmek için SHIFT + TAB tuşuna basın, pencereyi göndermek için ENTER tuşuna basın, dialog penceresini iptal etmek için ESC tuşuna basın. Birden çok sekme sayfaları olan diyalogların, sekme listesine gitmek için ALT + F10 tuşlarına basın. Sonra TAB veya SAĞ OK sonraki sekmeye taşıyın. SHIFT + TAB veya SOL OK ile önceki sekmeye geçin. Sekme sayfayı seçmek için SPACE veya ENTER tuşuna basın."},
+{name:"İçerik Menü Editörü",legend:"İçerik menüsünü açmak için ${contextMenu} veya UYGULAMA TUŞU'na basın. Daha sonra SEKME veya AŞAĞI OK ile bir sonraki menü seçeneği taşıyın. SHIFT + TAB veya YUKARI OK ile önceki seçeneğe gider. Menü seçeneğini seçmek için SPACE veya ENTER tuşuna basın. Seçili seçeneğin alt menüsünü SPACE ya da ENTER veya SAĞ OK açın. Üst menü öğesini geçmek için ESC veya SOL OK ile geri dönün. ESC ile bağlam menüsünü kapatın."},{name:"Liste Kutusu Editörü",legend:"Liste kutusu içinde, bir sonraki liste öğesine SEKME VEYA AŞAĞI OK ile taşıyın. SHIFT + TAB veya YUKARI önceki liste öğesi taşıyın. Liste seçeneği seçmek için SPACE veya ENTER tuşuna basın. Liste kutusunu kapatmak için ESC tuşuna basın."},
+{name:"Element Yol Çubuğu Editörü",legend:"Elementlerin yol çubuğunda gezinmek için ${ElementsPathFocus} basın. SEKME veya SAĞ OK ile sonraki element düğmesine taşıyın. SHIFT + TAB veya SOL OK önceki düğmeye hareket ettirin. Editör içindeki elementi seçmek için ENTER veya SPACE tuşuna basın."}]},{name:"Komutlar",items:[{name:"Komutu geri al",legend:"$(undo)'ya basın"},{name:"Komutu geri al",legend:"${redo} basın"},{name:" Kalın komut",legend:"${bold} basın"},{name:" İtalik komutu",legend:"${italic} basın"},
+{name:" Alttan çizgi komutu",legend:"${underline} basın"},{name:" Bağlantı komutu",legend:"${link} basın"},{name:" Araç çubuğu Toplama komutu",legend:"${toolbarCollapse} basın"},{name:"Önceki komut alanına odaklan",legend:"Düzeltme imleçinden önce, en yakın uzaktaki alana erişmek için ${accessPreviousSpace} basın, örneğin: iki birleşik HR elementleri. Aynı tuş kombinasyonu tekrarıyla diğer alanlarada ulaşın."},{name:"Sonraki komut alanına odaklan",legend:"Düzeltme imleçinden sonra, en yakın uzaktaki alana erişmek için ${accessNextSpace} basın, örneğin: iki birleşik HR elementleri. Aynı tuş kombinasyonu tekrarıyla diğer alanlarada ulaşın."},
+{name:"Erişilebilirlik Yardımı",legend:"${a11yHelp}'e basın"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ug.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ug.js
new file mode 100644
index 00000000..0b4441a9
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/ug.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ug",{title:"قوشۇمچە چۈشەندۈرۈش",contents:"ياردەم مەزمۇنى. بۇ سۆزلەشكۈنى ياپماقچى بولسىڭىز ESC نى بېسىڭ.",legend:[{name:"ئادەتتىكى",items:[{name:"قورال بالداق تەھرىر",legend:"${toolbarFocus} بېسىلسا قورال بالداققا يېتەكلەيدۇ، TAB ياكى SHIFT+TAB ئارقىلىق قورال بالداق گۇرۇپپىسى تاللىنىدۇ، ئوڭ سول يا ئوقتا توپچا تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تاللانغان توپچىنى قوللىنىدۇ."},{name:"تەھرىرلىگۈچ سۆزلەشكۈسى",legend:"سۆزلەشكۈدە TAB كۇنۇپكىسىدا كېيىنكى سۆز بۆلىكىگە يۆتكىلىدۇ، SHIFT + TAB بىرىكمە كۇنۇپكىسىدا ئالدىنقى سۆز بۆلىكىگە يۆتكىلىدۇ، ENTER كۇنۇپكىسىدا سۆزلەشكۈنى تاپشۇرىدۇ، ESC كۇنۇپكىسى سۆزلەشكۈدىن ۋاز كېچىدۇ. كۆپ بەتكۈچلۈك سۆزلەشكۈگە نىسبەتەن، ALT + F10 دا بەتكۈچ تىزىمىغا يۆتكەيدۇ. ئاندىن TAB كۇنۇپكىسى ياكى ئوڭ يا ئوق كۇنۇپكىسى كېيىنكى بەتكۈچكە يۆتكەيدۇ؛ SHIFT + TAB كۇنۇپكىسى ياكى سول يا ئوق كۇنۇپكىسى ئالدىنقى بەتكۈچكە يۆتكەيدۇ. بوشلۇق كۇنۇپكىسى ياكى ENTER كۇنۇپكىسى بەتكۈچنى تاللايدۇ."},
+{name:"تەھرىرلىگۈچ تىل مۇھىت تىزىملىكى",legend:"${contextMenu} ياكى ئەپ كۇنۇپكىسىدا تىل مۇھىت تىزىملىكىنى ئاچىدۇ. ئاندىن TAB ياكى ئاستى يا ئوق كۇنۇپكىسىدا كېيىنكى تىزىملىك تۈرىگە يۆتكەيدۇ؛ SHIFT+TAB ياكى ئۈستى يا ئوق كۇنۇپكىسىدا ئالدىنقى تىزىملىك تۈرىگە يۆتكەيدۇ. بوشلۇق ياكى ENTER كۇنۇپكىسىدا تىزىملىك تۈرىنى تاللايدۇ. بوشلۇق، ENTER ياكى ئوڭ يا ئوق كۇنۇپكىسىدا تارماق تىزىملىكنى ئاچىدۇ. قايتىش تىزىملىكىگە ESC ياكى سول يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. ESC كۇنۇپكىسىدا تىل مۇھىت تىزىملىكى تاقىلىدۇ."},{name:"تەھرىرلىگۈچ تىزىمى",
+legend:"تىزىم قۇتىسىدا، كېيىنكى تىزىم تۈرىگە يۆتكەشتە  TAB ياكى ئاستى يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. ئالدىنقى تىزىم تۈرىگە يۆتكەشتە  SHIFT + TAB ياكى ئۈستى يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. بوشلۇق ياكى ENTER كۇنۇپكىسىدا تىزىم تۈرىنى تاللايدۇ.ESC كۇنۇپكىسىدا تىزىم قۇتىسىنى يىغىدۇ."},{name:"تەھرىرلىگۈچ ئېلېمېنت يول بالداق",legend:"${elementsPathFocus} بېسىلسا ئېلېمېنت يول بالداققا يېتەكلەيدۇ، TAB ياكى ئوڭ يا ئوقتا كېيىنكى ئېلېمېنت تاللىنىدۇ،  SHIFT+TAB ياكى سول يا ئوقتا ئالدىنقى ئېلېمېنت تاللىنىدۇ،  بوشلۇق ياكى Enter كۇنۇپكىسىدا تەھرىرلىگۈچتىكى ئېلېمېنت تاللىنىدۇ."}]},
+{name:"بۇيرۇق",items:[{name:"بۇيرۇقتىن يېنىۋال",legend:"${undo} نى بېسىڭ"},{name:"قايتىلاش بۇيرۇقى",legend:"${redo} نى بېسىڭ"},{name:"توملىتىش بۇيرۇقى",legend:"${bold} نى بېسىڭ"},{name:"يانتۇ بۇيرۇقى",legend:"${italic} نى بېسىڭ"},{name:"ئاستى سىزىق بۇيرۇقى",legend:"${underline} نى بېسىڭ"},{name:"ئۇلانما بۇيرۇقى",legend:"${link} نى بېسىڭ"},{name:"قورال بالداق قاتلاش بۇيرۇقى",legend:"${toolbarCollapse} نى بېسىڭ"},{name:"ئالدىنقى فوكۇس نۇقتىسىنى زىيارەت قىلىدىغان بۇيرۇق",legend:"${accessPreviousSpace} بېسىپ ^ بەلگىسىگە ئەڭ يېقىن زىيارەت قىلغىلى بولمايدىغان فوكۇس نۇقتا رايونىنىڭ ئالدىنى زىيارەت قىلىدۇ، مەسىلەن: ئۆز ئارا قوشنا ئىككى HR ئېلېمېنت. بۇ بىرىكمە كۇنۇپكا تەكرارلانسا يىراقتىكى فوكۇس نۇقتا رايونىغا يەتكىلى بولىدۇ."},
+{name:"كېيىنكى فوكۇس نۇقتىسىنى زىيارەت قىلىدىغان بۇيرۇق",legend:"${accessNextSpace} بېسىپ ^ بەلگىسىگە ئەڭ يېقىن زىيارەت قىلغىلى بولمايدىغان فوكۇس نۇقتا رايونىنىڭ كەينىنى زىيارەت قىلىدۇ، مەسىلەن: ئۆز ئارا قوشنا ئىككى HR ئېلېمېنت. بۇ بىرىكمە كۇنۇپكا تەكرارلانسا يىراقتىكى فوكۇس نۇقتا رايونىغا يەتكىلى بولىدۇ."},{name:"توسالغۇسىز لايىھە چۈشەندۈرۈشى",legend:"${a11yHelp} نى بېسىڭ"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/uk.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/uk.js
new file mode 100644
index 00000000..cf1eebf5
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/uk.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","uk",{title:"Спеціальні Інструкції",contents:"Довідка. Натисніть ESC і вона зникне.",legend:[{name:"Основне",items:[{name:"Панель Редактора",legend:"Натисніть ${toolbarFocus} для переходу до панелі інструментів. Для переміщення між групами панелі інструментів використовуйте TAB і SHIFT-TAB. Для переміщення між кнопками панелі іструментів використовуйте кнопки СТРІЛКА ВПРАВО або ВЛІВО. Натисніть ПРОПУСК або ENTER для запуску кнопки панелі інструментів"},{name:"Діалог Редактора",
+legend:"У діалозі натисніть клавішу TAB для переходу до наступного поля, натисніть SHIFT + TAB, щоб перейти до попереднього поля, натисніть ENTER, щоб відправити дані, натисніть ESC, щоб скасувати. Для вікон, які мають кілька вкладок, натисніть ALT + F10 для переходу до списку вкладок. Перехід до наступної вкладки TAB АБО СТРІЛКА ВПРАВО. Перехід до попередньої вкладки за допомогою SHIFT + TAB або СТРІЛКА ВЛІВО. Натисніть ПРОПУСК або ENTER, щоб вибрати вкладку."},{name:"Контекстне Меню Редактора",
+legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Потім перейдіть до наступного пункту меню за допомогою TAB або СТРІЛКИ ВНИЗ. Натисніть ПРОПУСК або ENTER для вибору параметру меню. Відкрийте підменю поточного параметру, натиснувши ПРОПУСК або ENTER або СТРІЛКУ ВПРАВО. Перейдіть до батьківського елемента меню, натиснувши ESC або СТРІЛКУ ВЛІВО. Закрийте контекстне меню, натиснувши ESC."},{name:"Скринька Списків Редактора",legend:"Всередині списку переходимо до наступного пункту списку  клавішею TAB або СТРІЛКА ВНИЗ. Перейти до попереднього елемента списку можна SHIFT + TAB або СТРІЛКА ВГОРУ. Натисніть ПРОПУСК або ENTER, щоб вибрати параметр списку. Натисніть клавішу ESC, щоб закрити список."},
+{name:"Шлях до елемента редактора",legend:"Натисніть ${elementsPathFocus} для навігації між елементами панелі. Перейдіть до наступного елемента кнопкою TAB або СТРІЛКА ВПРАВО. Перейдіть до попереднього елемента кнопкою SHIFT+TAB або СТРІЛКА ВЛІВО. Натисніть ПРОПУСК або ENTER для вибору елемента в редакторі."}]},{name:"Команди",items:[{name:"Відмінити команду",legend:"Натисніть ${undo}"},{name:"Повторити",legend:"Натисніть ${redo}"},{name:"Жирний",legend:"Натисніть ${bold}"},{name:"Курсив",legend:"Натисніть ${italic}"},
+{name:"Підкреслений",legend:"Натисніть ${underline}"},{name:"Посилання",legend:"Натисніть ${link}"},{name:"Згорнути панель інструментів",legend:"Натисніть ${toolbarCollapse}"},{name:"Доступ до попереднього місця фокусування",legend:"Натисніть ${accessNextSpace} для доступу до найближчої недосяжної області фокусування перед кареткою, наприклад: два сусідні елементи HR. Повторіть комбінацію клавіш для досягнення віддалених областей фокусування."},{name:"Доступ до наступного місця фокусування",legend:"Натисніть ${accessNextSpace} для доступу до найближчої недосяжної області фокусування після каретки, наприклад: два сусідні елементи HR. Повторіть комбінацію клавіш для досягнення віддалених областей фокусування."},
+{name:"Допомога з доступності",legend:"Натисніть ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/vi.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/vi.js
new file mode 100644
index 00000000..52ada57b
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/vi.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","vi",{title:"Hướng dẫn trợ năng",contents:"Nội dung Hỗ trợ. Nhấn ESC để đóng hộp thoại.",legend:[{name:"Chung",items:[{name:"Thanh công cụ soạn thảo",legend:"Nhấn ${toolbarFocus} để điều hướng đến thanh công cụ. Nhấn TAB và SHIFT-TAB để chuyển đến nhóm thanh công cụ khác. Nhấn MŨI TÊN PHẢI hoặc MŨI TÊN TRÁI để chuyển sang nút khác trên thanh công cụ. Nhấn PHÍM CÁCH hoặc ENTER để kích hoạt nút trên thanh công cụ."},{name:"Hộp thoại Biên t",legend:"Bên trong một hộp thoại, nhấn TAB để chuyển sang trường tiếp theo, nhấn SHIFT + TAB để quay lại trường phía trước, nhấn ENTER để chấp nhận, nhấn ESC để đóng hộp thoại. Đối với các hộp thoại có nhiều tab, nhấn ALT + F10 để chuyển đến danh sách các tab. Sau đó nhấn TAB hoặc MŨI TÊN SANG PHẢI để chuyển sang tab tiếp theo. Nhấn SHIFT + TAB hoặc MŨI TÊN SANG TRÁI để chuyển sang tab trước đó. Nhấn DẤU CÁCH hoặc ENTER để chọn tab."},
+{name:"Trình đơn Ngữ cảnh cBộ soạn thảo",legend:"Nhấn ${contextMenu} hoặc PHÍM ỨNG DỤNG để mở thực đơn ngữ cảnh. Sau đó nhấn TAB hoặc MŨI TÊN XUỐNG để di chuyển đến tuỳ chọn tiếp theo của thực đơn. Nhấn SHIFT+TAB hoặc MŨI TÊN LÊN để quay lại tuỳ chọn trước. Nhấn DẤU CÁCH hoặc ENTER để chọn tuỳ chọn của thực đơn. Nhấn DẤU CÁCH hoặc ENTER hoặc MŨI TÊN SANG PHẢI để mở thực đơn con của tuỳ chọn hiện tại. Nhấn ESC hoặc MŨI TÊN SANG TRÁI để quay trở lại thực đơn gốc. Nhấn ESC để đóng thực đơn ngữ cảnh."},
+{name:"Hộp danh sách trình biên tập",legend:"Trong một danh sách chọn, di chuyển đối tượng tiếp theo với phím Tab hoặc phím mũi tên hướng xuống. Di chuyển đến đối tượng trước đó bằng cách nhấn tổ hợp phím Shift+Tab hoặc mũi tên hướng lên. Phím khoảng cách hoặc phím Enter để chọn các tùy chọn trong danh sách. Nhấn phím Esc để đóng lại danh sách chọn."},{name:"Thanh đường dẫn các đối tượng",legend:"Nhấn ${elementsPathFocus} để điều hướng các đối tượng trong thanh đường dẫn. Di chuyển đến đối tượng tiếp theo bằng phím Tab hoặc phím mũi tên bên phải. Di chuyển đến đối tượng trước đó bằng tổ hợp phím Shift+Tab hoặc phím mũi tên bên trái. Nhấn phím khoảng cách hoặc Enter để chọn đối tượng trong trình soạn thảo."}]},
+{name:"Lệnh",items:[{name:"Làm lại lện",legend:"Ấn ${undo}"},{name:"Làm lại lệnh",legend:"Ấn ${redo}"},{name:"Lệnh in đậm",legend:"Ấn ${bold}"},{name:"Lệnh in nghiêng",legend:"Ấn ${italic}"},{name:"Lệnh gạch dưới",legend:"Ấn ${underline}"},{name:"Lệnh liên kết",legend:"Nhấn ${link}"},{name:"Lệnh hiển thị thanh công cụ",legend:"Nhấn${toolbarCollapse}"},{name:"Truy cập đến lệnh tập trung vào khoảng cách trước đó",legend:"Ấn ${accessPreviousSpace} để truy cập đến phần tập trung khoảng cách sau phần còn sót lại của khoảng cách gần nhất vốn không tác động đến được , thí dụ: hai yếu tố điều chỉnh HR. Lặp lại các phím kết họep này để vươn đến phần khoảng cách."},
+{name:"Truy cập phần đối tượng lệnh khoảng trống",legend:"Ấn ${accessNextSpace} để truy cập đến phần tập trung khoảng cách sau phần còn sót lại của khoảng cách gần nhất vốn không tác động đến được , thí dụ: hai yếu tố điều chỉnh HR. Lặp lại các phím kết họep này để vươn đến phần khoảng cách."},{name:"Trợ giúp liên quan",legend:"Nhấn ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/zh-cn.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/zh-cn.js
new file mode 100644
index 00000000..d6948d2a
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/a11yhelp/dialogs/lang/zh-cn.js
@@ -0,0 +1,7 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","zh-cn",{title:"辅助功能说明",contents:"帮助内容。要关闭此对话框请按 ESC 键。",legend:[{name:"常规",items:[{name:"编辑器工具栏",legend:"按 ${toolbarFocus} 导航到工具栏，使用 TAB 键和 SHIFT+TAB 组合键移动到上一个和下一个工具栏组。使用左右箭头键移动到上一个和下一个工具栏按钮。按空格键或回车键以选中工具栏按钮。"},{name:"编辑器对话框",legend:"在对话框内，TAB 键移动到下一个字段，SHIFT + TAB 组合键移动到上一个字段，ENTER 键提交对话框，ESC 键取消对话框。对于有多选项卡的对话框，用ALT + F10来移到选项卡列表。然后用 TAB 键或者向右箭头来移动到下一个选项卡；SHIFT + TAB 组合键或者向左箭头移动到上一个选项卡。用 SPACE 键或者 ENTER 键选择选项卡。"},{name:"编辑器上下文菜单",legend:"用 ${contextMenu} 或者“应用程序键”打开上下文菜单。然后用 TAB 键或者下箭头键来移动到下一个菜单项；SHIFT + TAB 组合键或者上箭头键移动到上一个菜单项。用 SPACE 键或者 ENTER 键选择菜单项。用 SPACE 键，ENTER 键或者右箭头键打开子菜单。返回菜单用 ESC 键或者左箭头键。用 ESC 键关闭上下文菜单。"},
+{name:"编辑器列表框",legend:"在列表框中，移到下一列表项用 TAB 键或者下箭头键。移到上一列表项用SHIFT + TAB 组合键或者上箭头键，用 SPACE 键或者 ENTER 键选择列表项。用 ESC 键收起列表框。"},{name:"编辑器元素路径栏",legend:"按 ${elementsPathFocus} 以导航到元素路径栏，使用 TAB 键或右箭头键选择下一个元素，使用 SHIFT+TAB 组合键或左箭头键选择上一个元素，按空格键或回车键以选定编辑器里的元素。"}]},{name:"命令",items:[{name:" 撤消命令",legend:"按 ${undo}"},{name:" 重做命令",legend:"按 ${redo}"},{name:" 加粗命令",legend:"按 ${bold}"},{name:" 倾斜命令",legend:"按 ${italic}"},{name:" 下划线命令",legend:"按 ${underline}"},{name:" 链接命令",legend:"按 ${link}"},{name:" 工具栏折叠命令",legend:"按 ${toolbarCollapse}"},
+{name:"访问前一个焦点区域的命令",legend:"按 ${accessPreviousSpace} 访问^符号前最近的不可访问的焦点区域，例如：两个相邻的 HR元素。重复此组合按键可以到达远处的焦点区域。"},{name:"访问下一个焦点区域命令",legend:"按 ${accessNextSpace} 以访问^符号后最近的不可访问的焦点区域。例如：两个相邻的 HR 元素。重复此组合按键可以到达远处的焦点区域。"},{name:"辅助功能帮助",legend:"按 ${a11yHelp}"}]}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/about/dialogs/about.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/about/dialogs/about.js
new file mode 100644
index 00000000..d9b8194c
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/about/dialogs/about.js
@@ -0,0 +1,7 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("about",function(a){var a=a.lang.about,b=CKEDITOR.plugins.get("about").path+"dialogs/"+(CKEDITOR.env.hidpi?"hidpi/":"")+"logo_ckeditor.png";return{title:CKEDITOR.env.ie?a.dlgTitle:a.title,minWidth:390,minHeight:230,contents:[{id:"tab1",label:"",title:"",expand:!0,padding:0,elements:[{type:"html",html:'<style type="text/css">.cke_about_container{color:#000 !important;padding:10px 10px 0;margin-top:5px}.cke_about_container p{margin: 0 0 10px;}.cke_about_container .cke_about_logo{height:81px;background-color:#fff;background-image:url('+
+b+");"+(CKEDITOR.env.hidpi?"background-size:163px 58px;":"")+'background-position:center; background-repeat:no-repeat;margin-bottom:10px;}.cke_about_container a{cursor:pointer !important;color:#00B2CE !important;text-decoration:underline !important;}</style><div class="cke_about_container"><div class="cke_about_logo"></div><p>CKEditor '+CKEDITOR.version+" (revision "+CKEDITOR.revision+')<br><a href="http://ckeditor.com/">http://ckeditor.com</a></p><p>'+a.help.replace("$1",'<a href="http://docs.ckeditor.com/user">'+
+a.userGuide+"</a>")+"</p><p>"+a.moreInfo+'<br><a href="http://ckeditor.com/about/license">http://ckeditor.com/about/license</a></p><p>'+a.copy.replace("$1",'<a href="http://cksource.com/">CKSource</a> - Frederico Knabben')+"</p></div>"}]}],buttons:[CKEDITOR.dialog.cancelButton]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/about/dialogs/hidpi/logo_ckeditor.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/about/dialogs/hidpi/logo_ckeditor.png
new file mode 100644
index 00000000..10cc7368
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/about/dialogs/hidpi/logo_ckeditor.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/about/dialogs/logo_ckeditor.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/about/dialogs/logo_ckeditor.png
new file mode 100644
index 00000000..f186eb87
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/about/dialogs/logo_ckeditor.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/clipboard/dialogs/paste.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/clipboard/dialogs/paste.js
new file mode 100644
index 00000000..0c7e2563
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/clipboard/dialogs/paste.js
@@ -0,0 +1,11 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("paste",function(c){function h(a){var b=new CKEDITOR.dom.document(a.document),f=b.getBody(),d=b.getById("cke_actscrpt");d&&d.remove();f.setAttribute("contenteditable",!0);if(CKEDITOR.env.ie&&8>CKEDITOR.env.version)b.getWindow().on("blur",function(){b.$.selection.empty()});b.on("keydown",function(a){var a=a.data,b;switch(a.getKeystroke()){case 27:this.hide();b=1;break;case 9:case CKEDITOR.SHIFT+9:this.changeFocus(1),b=1}b&&a.preventDefault()},this);c.fire("ariaWidget",new CKEDITOR.dom.element(a.frameElement));
+b.getWindow().getFrame().removeCustomData("pendingFocus")&&f.focus()}var e=c.lang.clipboard;c.on("pasteDialogCommit",function(a){a.data&&c.fire("paste",{type:"auto",dataValue:a.data})},null,null,1E3);return{title:e.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?370:350,minHeight:CKEDITOR.env.quirks?250:245,onShow:function(){this.parts.dialog.$.offsetHeight;this.setupContent();this.parts.title.setHtml(this.customTitle||e.title);this.customTitle=null},onLoad:function(){(CKEDITOR.env.ie7Compat||
+CKEDITOR.env.ie6Compat)&&"rtl"==c.lang.dir&&this.parts.contents.setStyle("overflow","hidden")},onOk:function(){this.commitContent()},contents:[{id:"general",label:c.lang.common.generalTab,elements:[{type:"html",id:"securityMsg",html:'<div style="white-space:normal;width:340px">'+e.securityMsg+"</div>"},{type:"html",id:"pasteMsg",html:'<div style="white-space:normal;width:340px">'+e.pasteMsg+"</div>"},{type:"html",id:"editing_area",style:"width:100%;height:100%",html:"",focus:function(){var a=this.getInputElement(),
+b=a.getFrameDocument().getBody();!b||b.isReadOnly()?a.setCustomData("pendingFocus",1):b.focus()},setup:function(){var a=this.getDialog(),b='<html dir="'+c.config.contentsLangDirection+'" lang="'+(c.config.contentsLanguage||c.langCode)+'"><head><style>body{margin:3px;height:95%}</style></head><body><script id="cke_actscrpt" type="text/javascript">window.parent.CKEDITOR.tools.callFunction('+CKEDITOR.tools.addFunction(h,a)+",this);<\/script></body></html>",f=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?
+"javascript:void((function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+'})())"':"",d=CKEDITOR.dom.element.createFromHtml('<iframe class="cke_pasteframe" frameborder="0"  allowTransparency="true" src="'+f+'" role="region" aria-label="'+e.pasteArea+'" aria-describedby="'+a.getContentElement("general","pasteMsg").domId+'" aria-multiple="true"></iframe>');d.on("load",function(a){a.removeListener();a=d.getFrameDocument();a.write(b);c.focusManager.add(a.getBody());
+CKEDITOR.env.air&&h.call(this,a.getWindow().$)},a);d.setCustomData("dialog",a);a=this.getElement();a.setHtml("");a.append(d);if(CKEDITOR.env.ie){var g=CKEDITOR.dom.element.createFromHtml('<span tabindex="-1" style="position:absolute" role="presentation"></span>');g.on("focus",function(){setTimeout(function(){d.$.contentWindow.focus()})});a.append(g);this.focus=function(){g.focus();this.fire("focus")}}this.getInputElement=function(){return d};CKEDITOR.env.ie&&(a.setStyle("display","block"),a.setStyle("height",
+d.$.offsetHeight+2+"px"))},commit:function(){var a=this.getDialog().getParentEditor(),b=this.getInputElement().getFrameDocument().getBody(),c=b.getBogus(),d;c&&c.remove();d=b.getHtml();setTimeout(function(){a.fire("pasteDialogCommit",d)},0)}}]}]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/colordialog/dialogs/colordialog.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/colordialog/dialogs/colordialog.js
new file mode 100644
index 00000000..f3137d1e
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/colordialog/dialogs/colordialog.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("colordialog",function(t){function n(){f.getById(o).removeStyle("background-color");p.getContentElement("picker","selectedColor").setValue("");j&&j.removeAttribute("aria-selected");j=null}function u(a){var a=a.data.getTarget(),b;if("td"==a.getName()&&(b=a.getChild(0).getHtml()))j=a,j.setAttribute("aria-selected",!0),p.getContentElement("picker","selectedColor").setValue(b)}function y(a){for(var a=a.replace(/^#/,""),b=0,c=[];2>=b;b++)c[b]=parseInt(a.substr(2*b,2),16);return"#"+
+(165<=0.2126*c[0]+0.7152*c[1]+0.0722*c[2]?"000":"fff")}function v(a){!a.name&&(a=new CKEDITOR.event(a));var b=!/mouse/.test(a.name),c=a.data.getTarget(),e;if("td"==c.getName()&&(e=c.getChild(0).getHtml()))q(a),b?g=c:w=c,b&&(c.setStyle("border-color",y(e)),c.setStyle("border-style","dotted")),f.getById(k).setStyle("background-color",e),f.getById(l).setHtml(e)}function q(a){if(a=!/mouse/.test(a.name)&&g){var b=a.getChild(0).getHtml();a.setStyle("border-color",b);a.setStyle("border-style","solid")}!g&&
+!w&&(f.getById(k).removeStyle("background-color"),f.getById(l).setHtml("&nbsp;"))}function z(a){var b=a.data,c=b.getTarget(),e=b.getKeystroke(),d="rtl"==t.lang.dir;switch(e){case 38:if(a=c.getParent().getPrevious())a=a.getChild([c.getIndex()]),a.focus();b.preventDefault();break;case 40:if(a=c.getParent().getNext())(a=a.getChild([c.getIndex()]))&&1==a.type&&a.focus();b.preventDefault();break;case 32:case 13:u(a);b.preventDefault();break;case d?37:39:if(a=c.getNext())1==a.type&&(a.focus(),b.preventDefault(!0));
+else if(a=c.getParent().getNext())if((a=a.getChild([0]))&&1==a.type)a.focus(),b.preventDefault(!0);break;case d?39:37:if(a=c.getPrevious())a.focus(),b.preventDefault(!0);else if(a=c.getParent().getPrevious())a=a.getLast(),a.focus(),b.preventDefault(!0)}}var r=CKEDITOR.dom.element,f=CKEDITOR.document,h=t.lang.colordialog,p,x={type:"html",html:"&nbsp;"},j,g,w,m=function(a){return CKEDITOR.tools.getNextId()+"_"+a},k=m("hicolor"),l=m("hicolortext"),o=m("selhicolor"),i;(function(){function a(a,d){for(var s=
+a;s<a+3;s++){var e=new r(i.$.insertRow(-1));e.setAttribute("role","row");for(var f=d;f<d+3;f++)for(var g=0;6>g;g++)b(e.$,"#"+c[f]+c[g]+c[s])}}function b(a,c){var b=new r(a.insertCell(-1));b.setAttribute("class","ColorCell");b.setAttribute("tabIndex",-1);b.setAttribute("role","gridcell");b.on("keydown",z);b.on("click",u);b.on("focus",v);b.on("blur",q);b.setStyle("background-color",c);b.setStyle("border","1px solid "+c);b.setStyle("width","14px");b.setStyle("height","14px");var d=m("color_table_cell");
+b.setAttribute("aria-labelledby",d);b.append(CKEDITOR.dom.element.createFromHtml('<span id="'+d+'" class="cke_voice_label">'+c+"</span>",CKEDITOR.document))}i=CKEDITOR.dom.element.createFromHtml('<table tabIndex="-1" aria-label="'+h.options+'" role="grid" style="border-collapse:separate;" cellspacing="0"><caption class="cke_voice_label">'+h.options+'</caption><tbody role="presentation"></tbody></table>');i.on("mouseover",v);i.on("mouseout",q);var c="00 33 66 99 cc ff".split(" ");a(0,0);a(3,0);a(0,
+3);a(3,3);var e=new r(i.$.insertRow(-1));e.setAttribute("role","row");for(var d=0;6>d;d++)b(e.$,"#"+c[d]+c[d]+c[d]);for(d=0;12>d;d++)b(e.$,"#000000")})();return{title:h.title,minWidth:360,minHeight:220,onLoad:function(){p=this},onHide:function(){n();var a=g.getChild(0).getHtml();g.setStyle("border-color",a);g.setStyle("border-style","solid");f.getById(k).removeStyle("background-color");f.getById(l).setHtml("&nbsp;");g=null},contents:[{id:"picker",label:h.title,accessKey:"I",elements:[{type:"hbox",
+padding:0,widths:["70%","10%","30%"],children:[{type:"html",html:"<div></div>",onLoad:function(){CKEDITOR.document.getById(this.domId).append(i)},focus:function(){(g||this.getElement().getElementsByTag("td").getItem(0)).focus()}},x,{type:"vbox",padding:0,widths:["70%","5%","25%"],children:[{type:"html",html:"<span>"+h.highlight+'</span>\t\t\t\t\t\t\t\t\t\t\t\t<div id="'+k+'" style="border: 1px solid; height: 74px; width: 74px;"></div>\t\t\t\t\t\t\t\t\t\t\t\t<div id="'+l+'">&nbsp;</div><span>'+h.selected+
+'</span>\t\t\t\t\t\t\t\t\t\t\t\t<div id="'+o+'" style="border: 1px solid; height: 20px; width: 74px;"></div>'},{type:"text",label:h.selected,labelStyle:"display:none",id:"selectedColor",style:"width: 74px",onChange:function(){try{f.getById(o).setStyle("background-color",this.getValue())}catch(a){n()}}},x,{type:"button",id:"clear",style:"margin-top: 5px",label:h.clear,onClick:n}]}]}]}]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/dialog/dialogDefinition.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/dialog/dialogDefinition.js
new file mode 100644
index 00000000..2186b29d
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/dialog/dialogDefinition.js
@@ -0,0 +1,4 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/div/dialogs/div.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/div/dialogs/div.js
new file mode 100644
index 00000000..963e5d86
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/div/dialogs/div.js
@@ -0,0 +1,9 @@
+﻿(function(){function p(a,k,o){if(!k.is||!k.getCustomData("block_processed"))k.is&&CKEDITOR.dom.element.setMarker(o,k,"block_processed",!0),a.push(k)}function n(a,k){function o(){this.foreach(function(d){if(/^(?!vbox|hbox)/.test(d.type)&&(d.setup||(d.setup=function(c){d.setValue(c.getAttribute(d.id)||"",1)}),!d.commit))d.commit=function(c){var a=this.getValue();"dir"==d.id&&c.getComputedStyle("direction")==a||(a?c.setAttribute(d.id,a):c.removeAttribute(d.id))}})}var n=function(){var d=CKEDITOR.tools.extend({},
+CKEDITOR.dtd.$blockLimit);a.config.div_wrapTable&&(delete d.td,delete d.th);return d}(),q=CKEDITOR.dtd.div,l={},m=[];return{title:a.lang.div.title,minWidth:400,minHeight:165,contents:[{id:"info",label:a.lang.common.generalTab,title:a.lang.common.generalTab,elements:[{type:"hbox",widths:["50%","50%"],children:[{id:"elementStyle",type:"select",style:"width: 100%;",label:a.lang.div.styleSelectLabel,"default":"",items:[[a.lang.common.notSet,""]],onChange:function(){var d=["info:elementStyle","info:class",
+"advanced:dir","advanced:style"],c=this.getDialog(),h=c._element&&c._element.clone()||new CKEDITOR.dom.element("div",a.document);this.commit(h,!0);for(var d=[].concat(d),b=d.length,i,e=0;e<b;e++)(i=c.getContentElement.apply(c,d[e].split(":")))&&i.setup&&i.setup(h,!0)},setup:function(a){for(var c in l)l[c].checkElementRemovable(a,!0)&&this.setValue(c,1)},commit:function(a){var c;(c=this.getValue())?l[c].applyToObject(a):a.removeAttribute("style")}},{id:"class",type:"text",requiredContent:"div(cke-xyz)",
+label:a.lang.common.cssClass,"default":""}]}]},{id:"advanced",label:a.lang.common.advancedTab,title:a.lang.common.advancedTab,elements:[{type:"vbox",padding:1,children:[{type:"hbox",widths:["50%","50%"],children:[{type:"text",id:"id",requiredContent:"div[id]",label:a.lang.common.id,"default":""},{type:"text",id:"lang",requiredContent:"div[lang]",label:a.lang.common.langCode,"default":""}]},{type:"hbox",children:[{type:"text",id:"style",requiredContent:"div{cke-xyz}",style:"width: 100%;",label:a.lang.common.cssStyle,
+"default":"",commit:function(a){a.setAttribute("style",this.getValue())}}]},{type:"hbox",children:[{type:"text",id:"title",requiredContent:"div[title]",style:"width: 100%;",label:a.lang.common.advisoryTitle,"default":""}]},{type:"select",id:"dir",requiredContent:"div[dir]",style:"width: 100%;",label:a.lang.common.langDir,"default":"",items:[[a.lang.common.notSet,""],[a.lang.common.langDirLtr,"ltr"],[a.lang.common.langDirRtl,"rtl"]]}]}]}],onLoad:function(){o.call(this);var d=this,c=this.getContentElement("info",
+"elementStyle");a.getStylesSet(function(h){var b,i;if(h)for(var e=0;e<h.length;e++)i=h[e],i.element&&"div"==i.element&&(b=i.name,l[b]=i=new CKEDITOR.style(i),a.filter.check(i)&&(c.items.push([b,b]),c.add(b,b)));c[1<c.items.length?"enable":"disable"]();setTimeout(function(){d._element&&c.setup(d._element)},0)})},onShow:function(){"editdiv"==k&&this.setupContent(this._element=CKEDITOR.plugins.div.getSurroundDiv(a))},onOk:function(){if("editdiv"==k)m=[this._element];else{var d=[],c={},h=[],b,i=a.getSelection(),
+e=i.getRanges(),l=i.createBookmarks(),g,j;for(g=0;g<e.length;g++)for(j=e[g].createIterator();b=j.getNextParagraph();)if(b.getName()in n){var f=b.getChildren();for(b=0;b<f.count();b++)p(h,f.getItem(b),c)}else{for(;!q[b.getName()]&&!b.equals(e[g].root);)b=b.getParent();p(h,b,c)}CKEDITOR.dom.element.clearAllMarkers(c);e=[];g=null;for(j=0;j<h.length;j++)b=h[j],f=a.elementPath(b).blockLimit,a.config.div_wrapTable&&f.is(["td","th"])&&(f=a.elementPath(f.getParent()).blockLimit),f.equals(g)||(g=f,e.push([])),
+e[e.length-1].push(b);for(g=0;g<e.length;g++){f=e[g][0];h=f.getParent();for(b=1;b<e[g].length;b++)h=h.getCommonAncestor(e[g][b]);j=new CKEDITOR.dom.element("div",a.document);for(b=0;b<e[g].length;b++){for(f=e[g][b];!f.getParent().equals(h);)f=f.getParent();e[g][b]=f}for(b=0;b<e[g].length;b++)if(f=e[g][b],!f.getCustomData||!f.getCustomData("block_processed"))f.is&&CKEDITOR.dom.element.setMarker(c,f,"block_processed",!0),b||j.insertBefore(f),j.append(f);CKEDITOR.dom.element.clearAllMarkers(c);d.push(j)}i.selectBookmarks(l);
+m=d}d=m.length;for(c=0;c<d;c++)this.commitContent(m[c]),!m[c].getAttribute("style")&&m[c].removeAttribute("style");this.hide()},onHide:function(){"editdiv"==k&&this._element.removeCustomData("elementStyle");delete this._element}}}CKEDITOR.dialog.add("creatediv",function(a){return n(a,"creatediv")});CKEDITOR.dialog.add("editdiv",function(a){return n(a,"editdiv")})})();
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/fakeobjects/images/spacer.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/fakeobjects/images/spacer.gif
new file mode 100644
index 00000000..5bfd67a2
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/fakeobjects/images/spacer.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/find/dialogs/find.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/find/dialogs/find.js
new file mode 100644
index 00000000..0d64b3c1
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/find/dialogs/find.js
@@ -0,0 +1,24 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(){function y(c){return c.type==CKEDITOR.NODE_TEXT&&0<c.getLength()&&(!o||!c.isReadOnly())}function s(c){return!(c.type==CKEDITOR.NODE_ELEMENT&&c.isBlockBoundary(CKEDITOR.tools.extend({},CKEDITOR.dtd.$empty,CKEDITOR.dtd.$nonEditable)))}var o,t=function(){return{textNode:this.textNode,offset:this.offset,character:this.textNode?this.textNode.getText().charAt(this.offset):null,hitMatchBoundary:this._.matchBoundary}},u=["find","replace"],p=[["txtFindFind","txtFindReplace"],["txtFindCaseChk",
+"txtReplaceCaseChk"],["txtFindWordChk","txtReplaceWordChk"],["txtFindCyclic","txtReplaceCyclic"]],n=function(c,g){function n(a,b){var d=c.createRange();d.setStart(a.textNode,b?a.offset:a.offset+1);d.setEndAt(c.editable(),CKEDITOR.POSITION_BEFORE_END);return d}function q(a){var b=c.getSelection(),d=c.editable();b&&!a?(a=b.getRanges()[0].clone(),a.collapse(!0)):(a=c.createRange(),a.setStartAt(d,CKEDITOR.POSITION_AFTER_START));a.setEndAt(d,CKEDITOR.POSITION_BEFORE_END);return a}var v=new CKEDITOR.style(CKEDITOR.tools.extend({attributes:{"data-cke-highlight":1},
+fullMatch:1,ignoreReadonly:1,childRule:function(){return 0}},c.config.find_highlight,!0)),l=function(a,b){var d=this,c=new CKEDITOR.dom.walker(a);c.guard=b?s:function(a){!s(a)&&(d._.matchBoundary=!0)};c.evaluator=y;c.breakOnFalse=1;a.startContainer.type==CKEDITOR.NODE_TEXT&&(this.textNode=a.startContainer,this.offset=a.startOffset-1);this._={matchWord:b,walker:c,matchBoundary:!1}};l.prototype={next:function(){return this.move()},back:function(){return this.move(!0)},move:function(a){var b=this.textNode;
+if(null===b)return t.call(this);this._.matchBoundary=!1;if(b&&a&&0<this.offset)this.offset--;else if(b&&this.offset<b.getLength()-1)this.offset++;else{for(b=null;!b&&!(b=this._.walker[a?"previous":"next"].call(this._.walker),this._.matchWord&&!b||this._.walker._.end););this.offset=(this.textNode=b)?a?b.getLength()-1:0:0}return t.call(this)}};var r=function(a,b){this._={walker:a,cursors:[],rangeLength:b,highlightRange:null,isMatched:0}};r.prototype={toDomRange:function(){var a=c.createRange(),b=this._.cursors;
+if(1>b.length){var d=this._.walker.textNode;if(d)a.setStartAfter(d);else return null}else d=b[0],b=b[b.length-1],a.setStart(d.textNode,d.offset),a.setEnd(b.textNode,b.offset+1);return a},updateFromDomRange:function(a){var b=new l(a);this._.cursors=[];do a=b.next(),a.character&&this._.cursors.push(a);while(a.character);this._.rangeLength=this._.cursors.length},setMatched:function(){this._.isMatched=!0},clearMatched:function(){this._.isMatched=!1},isMatched:function(){return this._.isMatched},highlight:function(){if(!(1>
+this._.cursors.length)){this._.highlightRange&&this.removeHighlight();var a=this.toDomRange(),b=a.createBookmark();v.applyToRange(a);a.moveToBookmark(b);this._.highlightRange=a;b=a.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent());b.scrollIntoView();this.updateFromDomRange(a)}},removeHighlight:function(){if(this._.highlightRange){var a=this._.highlightRange.createBookmark();v.removeFromRange(this._.highlightRange);this._.highlightRange.moveToBookmark(a);this.updateFromDomRange(this._.highlightRange);
+this._.highlightRange=null}},isReadOnly:function(){return!this._.highlightRange?0:this._.highlightRange.startContainer.isReadOnly()},moveBack:function(){var a=this._.walker.back(),b=this._.cursors;a.hitMatchBoundary&&(this._.cursors=b=[]);b.unshift(a);b.length>this._.rangeLength&&b.pop();return a},moveNext:function(){var a=this._.walker.next(),b=this._.cursors;a.hitMatchBoundary&&(this._.cursors=b=[]);b.push(a);b.length>this._.rangeLength&&b.shift();return a},getEndCharacter:function(){var a=this._.cursors;
+return 1>a.length?null:a[a.length-1].character},getNextCharacterRange:function(a){var b,d;d=this._.cursors;d=(b=d[d.length-1])&&b.textNode?new l(n(b)):this._.walker;return new r(d,a)},getCursors:function(){return this._.cursors}};var w=function(a,b){var d=[-1];b&&(a=a.toLowerCase());for(var c=0;c<a.length;c++)for(d.push(d[c]+1);0<d[c+1]&&a.charAt(c)!=a.charAt(d[c+1]-1);)d[c+1]=d[d[c+1]-1]+1;this._={overlap:d,state:0,ignoreCase:!!b,pattern:a}};w.prototype={feedCharacter:function(a){for(this._.ignoreCase&&
+(a=a.toLowerCase());;){if(a==this._.pattern.charAt(this._.state))return this._.state++,this._.state==this._.pattern.length?(this._.state=0,2):1;if(this._.state)this._.state=this._.overlap[this._.state];else return 0}return null},reset:function(){this._.state=0}};var z=/[.,"'?!;: \u0085\u00a0\u1680\u280e\u2028\u2029\u202f\u205f\u3000]/,x=function(a){if(!a)return!0;var b=a.charCodeAt(0);return 9<=b&&13>=b||8192<=b&&8202>=b||z.test(a)},e={searchRange:null,matchRange:null,find:function(a,b,d,f,e,A){this.matchRange?
+(this.matchRange.removeHighlight(),this.matchRange=this.matchRange.getNextCharacterRange(a.length)):this.matchRange=new r(new l(this.searchRange),a.length);for(var i=new w(a,!b),j=0,k="%";null!==k;){for(this.matchRange.moveNext();k=this.matchRange.getEndCharacter();){j=i.feedCharacter(k);if(2==j)break;this.matchRange.moveNext().hitMatchBoundary&&i.reset()}if(2==j){if(d){var h=this.matchRange.getCursors(),m=h[h.length-1],h=h[0],g=c.createRange();g.setStartAt(c.editable(),CKEDITOR.POSITION_AFTER_START);
+g.setEnd(h.textNode,h.offset);h=g;m=n(m);h.trim();m.trim();h=new l(h,!0);m=new l(m,!0);if(!x(h.back().character)||!x(m.next().character))continue}this.matchRange.setMatched();!1!==e&&this.matchRange.highlight();return!0}}this.matchRange.clearMatched();this.matchRange.removeHighlight();return f&&!A?(this.searchRange=q(1),this.matchRange=null,arguments.callee.apply(this,Array.prototype.slice.call(arguments).concat([!0]))):!1},replaceCounter:0,replace:function(a,b,d,f,e,g,i){o=1;a=0;if(this.matchRange&&
+this.matchRange.isMatched()&&!this.matchRange._.isReplaced&&!this.matchRange.isReadOnly()){this.matchRange.removeHighlight();b=this.matchRange.toDomRange();d=c.document.createText(d);if(!i){var j=c.getSelection();j.selectRanges([b]);c.fire("saveSnapshot")}b.deleteContents();b.insertNode(d);i||(j.selectRanges([b]),c.fire("saveSnapshot"));this.matchRange.updateFromDomRange(b);i||this.matchRange.highlight();this.matchRange._.isReplaced=!0;this.replaceCounter++;a=1}else a=this.find(b,f,e,g,!i);o=0;return a}},
+f=c.lang.find;return{title:f.title,resizable:CKEDITOR.DIALOG_RESIZE_NONE,minWidth:350,minHeight:170,buttons:[CKEDITOR.dialog.cancelButton(c,{label:c.lang.common.close})],contents:[{id:"find",label:f.find,title:f.find,accessKey:"",elements:[{type:"hbox",widths:["230px","90px"],children:[{type:"text",id:"txtFindFind",label:f.findWhat,isChanged:!1,labelLayout:"horizontal",accessKey:"F"},{type:"button",id:"btnFind",align:"left",style:"width:100%",label:f.find,onClick:function(){var a=this.getDialog();
+e.find(a.getValueOf("find","txtFindFind"),a.getValueOf("find","txtFindCaseChk"),a.getValueOf("find","txtFindWordChk"),a.getValueOf("find","txtFindCyclic"))||alert(f.notFoundMsg)}}]},{type:"fieldset",label:CKEDITOR.tools.htmlEncode(f.findOptions),style:"margin-top:29px",children:[{type:"vbox",padding:0,children:[{type:"checkbox",id:"txtFindCaseChk",isChanged:!1,label:f.matchCase},{type:"checkbox",id:"txtFindWordChk",isChanged:!1,label:f.matchWord},{type:"checkbox",id:"txtFindCyclic",isChanged:!1,"default":!0,
+label:f.matchCyclic}]}]}]},{id:"replace",label:f.replace,accessKey:"M",elements:[{type:"hbox",widths:["230px","90px"],children:[{type:"text",id:"txtFindReplace",label:f.findWhat,isChanged:!1,labelLayout:"horizontal",accessKey:"F"},{type:"button",id:"btnFindReplace",align:"left",style:"width:100%",label:f.replace,onClick:function(){var a=this.getDialog();e.replace(a,a.getValueOf("replace","txtFindReplace"),a.getValueOf("replace","txtReplace"),a.getValueOf("replace","txtReplaceCaseChk"),a.getValueOf("replace",
+"txtReplaceWordChk"),a.getValueOf("replace","txtReplaceCyclic"))||alert(f.notFoundMsg)}}]},{type:"hbox",widths:["230px","90px"],children:[{type:"text",id:"txtReplace",label:f.replaceWith,isChanged:!1,labelLayout:"horizontal",accessKey:"R"},{type:"button",id:"btnReplaceAll",align:"left",style:"width:100%",label:f.replaceAll,isChanged:!1,onClick:function(){var a=this.getDialog();e.replaceCounter=0;e.searchRange=q(1);e.matchRange&&(e.matchRange.removeHighlight(),e.matchRange=null);for(c.fire("saveSnapshot");e.replace(a,
+a.getValueOf("replace","txtFindReplace"),a.getValueOf("replace","txtReplace"),a.getValueOf("replace","txtReplaceCaseChk"),a.getValueOf("replace","txtReplaceWordChk"),!1,!0););e.replaceCounter?(alert(f.replaceSuccessMsg.replace(/%1/,e.replaceCounter)),c.fire("saveSnapshot")):alert(f.notFoundMsg)}}]},{type:"fieldset",label:CKEDITOR.tools.htmlEncode(f.findOptions),children:[{type:"vbox",padding:0,children:[{type:"checkbox",id:"txtReplaceCaseChk",isChanged:!1,label:f.matchCase},{type:"checkbox",id:"txtReplaceWordChk",
+isChanged:!1,label:f.matchWord},{type:"checkbox",id:"txtReplaceCyclic",isChanged:!1,"default":!0,label:f.matchCyclic}]}]}]}],onLoad:function(){var a=this,b,c=0;this.on("hide",function(){c=0});this.on("show",function(){c=1});this.selectPage=CKEDITOR.tools.override(this.selectPage,function(f){return function(e){f.call(a,e);var g=a._.tabs[e],i;i="find"===e?"txtFindWordChk":"txtReplaceWordChk";b=a.getContentElement(e,"find"===e?"txtFindFind":"txtFindReplace");a.getContentElement(e,i);g.initialized||(CKEDITOR.document.getById(b._.inputId),
+g.initialized=!0);if(c){var j,e="find"===e?1:0,g=1-e,k,h=p.length;for(k=0;k<h;k++)i=this.getContentElement(u[e],p[k][e]),j=this.getContentElement(u[g],p[k][g]),j.setValue(i.getValue())}}})},onShow:function(){e.searchRange=q();var a=this.getParentEditor().getSelection().getSelectedText(),b=this.getContentElement(g,"find"==g?"txtFindFind":"txtFindReplace");b.setValue(a);b.select();this.selectPage(g);this[("find"==g&&this._.editor.readOnly?"hide":"show")+"Page"]("replace")},onHide:function(){var a;e.matchRange&&
+e.matchRange.isMatched()&&(e.matchRange.removeHighlight(),c.focus(),(a=e.matchRange.toDomRange())&&c.getSelection().selectRanges([a]));delete e.matchRange},onFocus:function(){return"replace"==g?this.getContentElement("replace","txtFindReplace"):this.getContentElement("find","txtFindFind")}}};CKEDITOR.dialog.add("find",function(c){return n(c,"find")});CKEDITOR.dialog.add("replace",function(c){return n(c,"replace")})})();
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/flash/dialogs/flash.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/flash/dialogs/flash.js
new file mode 100644
index 00000000..5de7a825
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/flash/dialogs/flash.js
@@ -0,0 +1,24 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(){function b(a,b,c){var k=n[this.id];if(k)for(var f=this instanceof CKEDITOR.ui.dialog.checkbox,e=0;e<k.length;e++){var d=k[e];switch(d.type){case g:if(!a)continue;if(null!==a.getAttribute(d.name)){a=a.getAttribute(d.name);f?this.setValue("true"==a.toLowerCase()):this.setValue(a);return}f&&this.setValue(!!d["default"]);break;case o:if(!a)continue;if(d.name in c){a=c[d.name];f?this.setValue("true"==a.toLowerCase()):this.setValue(a);return}f&&this.setValue(!!d["default"]);break;case i:if(!b)continue;
+if(b.getAttribute(d.name)){a=b.getAttribute(d.name);f?this.setValue("true"==a.toLowerCase()):this.setValue(a);return}f&&this.setValue(!!d["default"])}}}function c(a,b,c){var k=n[this.id];if(k)for(var f=""===this.getValue(),e=this instanceof CKEDITOR.ui.dialog.checkbox,d=0;d<k.length;d++){var h=k[d];switch(h.type){case g:if(!a||"data"==h.name&&b&&!a.hasAttribute("data"))continue;var l=this.getValue();f||e&&l===h["default"]?a.removeAttribute(h.name):a.setAttribute(h.name,l);break;case o:if(!a)continue;
+l=this.getValue();if(f||e&&l===h["default"])h.name in c&&c[h.name].remove();else if(h.name in c)c[h.name].setAttribute("value",l);else{var p=CKEDITOR.dom.element.createFromHtml("<cke:param></cke:param>",a.getDocument());p.setAttributes({name:h.name,value:l});1>a.getChildCount()?p.appendTo(a):p.insertBefore(a.getFirst())}break;case i:if(!b)continue;l=this.getValue();f||e&&l===h["default"]?b.removeAttribute(h.name):b.setAttribute(h.name,l)}}}for(var g=1,o=2,i=4,n={id:[{type:g,name:"id"}],classid:[{type:g,
+name:"classid"}],codebase:[{type:g,name:"codebase"}],pluginspage:[{type:i,name:"pluginspage"}],src:[{type:o,name:"movie"},{type:i,name:"src"},{type:g,name:"data"}],name:[{type:i,name:"name"}],align:[{type:g,name:"align"}],"class":[{type:g,name:"class"},{type:i,name:"class"}],width:[{type:g,name:"width"},{type:i,name:"width"}],height:[{type:g,name:"height"},{type:i,name:"height"}],hSpace:[{type:g,name:"hSpace"},{type:i,name:"hSpace"}],vSpace:[{type:g,name:"vSpace"},{type:i,name:"vSpace"}],style:[{type:g,
+name:"style"},{type:i,name:"style"}],type:[{type:i,name:"type"}]},m="play loop menu quality scale salign wmode bgcolor base flashvars allowScriptAccess allowFullScreen".split(" "),j=0;j<m.length;j++)n[m[j]]=[{type:i,name:m[j]},{type:o,name:m[j]}];m=["allowFullScreen","play","loop","menu"];for(j=0;j<m.length;j++)n[m[j]][0]["default"]=n[m[j]][1]["default"]=!0;CKEDITOR.dialog.add("flash",function(a){var g=!a.config.flashEmbedTagOnly,i=a.config.flashAddEmbedTag||a.config.flashEmbedTagOnly,k,f="<div>"+
+CKEDITOR.tools.htmlEncode(a.lang.common.preview)+'<br><div id="cke_FlashPreviewLoader'+CKEDITOR.tools.getNextNumber()+'" style="display:none"><div class="loading">&nbsp;</div></div><div id="cke_FlashPreviewBox'+CKEDITOR.tools.getNextNumber()+'" class="FlashPreviewBox"></div></div>';return{title:a.lang.flash.title,minWidth:420,minHeight:310,onShow:function(){this.fakeImage=this.objectNode=this.embedNode=null;k=new CKEDITOR.dom.element("embed",a.document);var e=this.getSelectedElement();if(e&&e.data("cke-real-element-type")&&
+"flash"==e.data("cke-real-element-type")){this.fakeImage=e;var d=a.restoreRealElement(e),h=null,b=null,c={};if("cke:object"==d.getName()){h=d;d=h.getElementsByTag("embed","cke");0<d.count()&&(b=d.getItem(0));for(var d=h.getElementsByTag("param","cke"),g=0,i=d.count();g<i;g++){var f=d.getItem(g),j=f.getAttribute("name"),f=f.getAttribute("value");c[j]=f}}else"cke:embed"==d.getName()&&(b=d);this.objectNode=h;this.embedNode=b;this.setupContent(h,b,c,e)}},onOk:function(){var e=null,d=null,b=null;if(this.fakeImage)e=
+this.objectNode,d=this.embedNode;else if(g&&(e=CKEDITOR.dom.element.createFromHtml("<cke:object></cke:object>",a.document),e.setAttributes({classid:"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000",codebase:"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"})),i)d=CKEDITOR.dom.element.createFromHtml("<cke:embed></cke:embed>",a.document),d.setAttributes({type:"application/x-shockwave-flash",pluginspage:"http://www.macromedia.com/go/getflashplayer"}),e&&d.appendTo(e);
+if(e)for(var b={},c=e.getElementsByTag("param","cke"),f=0,j=c.count();f<j;f++)b[c.getItem(f).getAttribute("name")]=c.getItem(f);c={};f={};this.commitContent(e,d,b,c,f);e=a.createFakeElement(e||d,"cke_flash","flash",!0);e.setAttributes(f);e.setStyles(c);this.fakeImage?(e.replace(this.fakeImage),a.getSelection().selectElement(e)):a.insertElement(e)},onHide:function(){this.preview&&this.preview.setHtml("")},contents:[{id:"info",label:a.lang.common.generalTab,accessKey:"I",elements:[{type:"vbox",padding:0,
+children:[{type:"hbox",widths:["280px","110px"],align:"right",children:[{id:"src",type:"text",label:a.lang.common.url,required:!0,validate:CKEDITOR.dialog.validate.notEmpty(a.lang.flash.validateSrc),setup:b,commit:c,onLoad:function(){var a=this.getDialog(),b=function(b){k.setAttribute("src",b);a.preview.setHtml('<embed height="100%" width="100%" src="'+CKEDITOR.tools.htmlEncode(k.getAttribute("src"))+'" type="application/x-shockwave-flash"></embed>')};a.preview=a.getContentElement("info","preview").getElement().getChild(3);
+this.on("change",function(a){a.data&&a.data.value&&b(a.data.value)});this.getInputElement().on("change",function(){b(this.getValue())},this)}},{type:"button",id:"browse",filebrowser:"info:src",hidden:!0,style:"display:inline-block;margin-top:10px;",label:a.lang.common.browseServer}]}]},{type:"hbox",widths:["25%","25%","25%","25%","25%"],children:[{type:"text",id:"width",requiredContent:"embed[width]",style:"width:95px",label:a.lang.common.width,validate:CKEDITOR.dialog.validate.htmlLength(a.lang.common.invalidHtmlLength.replace("%1",
+a.lang.common.width)),setup:b,commit:c},{type:"text",id:"height",requiredContent:"embed[height]",style:"width:95px",label:a.lang.common.height,validate:CKEDITOR.dialog.validate.htmlLength(a.lang.common.invalidHtmlLength.replace("%1",a.lang.common.height)),setup:b,commit:c},{type:"text",id:"hSpace",requiredContent:"embed[hspace]",style:"width:95px",label:a.lang.flash.hSpace,validate:CKEDITOR.dialog.validate.integer(a.lang.flash.validateHSpace),setup:b,commit:c},{type:"text",id:"vSpace",requiredContent:"embed[vspace]",
+style:"width:95px",label:a.lang.flash.vSpace,validate:CKEDITOR.dialog.validate.integer(a.lang.flash.validateVSpace),setup:b,commit:c}]},{type:"vbox",children:[{type:"html",id:"preview",style:"width:95%;",html:f}]}]},{id:"Upload",hidden:!0,filebrowser:"uploadButton",label:a.lang.common.upload,elements:[{type:"file",id:"upload",label:a.lang.common.upload,size:38},{type:"fileButton",id:"uploadButton",label:a.lang.common.uploadSubmit,filebrowser:"info:src","for":["Upload","upload"]}]},{id:"properties",
+label:a.lang.flash.propertiesTab,elements:[{type:"hbox",widths:["50%","50%"],children:[{id:"scale",type:"select",requiredContent:"embed[scale]",label:a.lang.flash.scale,"default":"",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.flash.scaleAll,"showall"],[a.lang.flash.scaleNoBorder,"noborder"],[a.lang.flash.scaleFit,"exactfit"]],setup:b,commit:c},{id:"allowScriptAccess",type:"select",requiredContent:"embed[allowscriptaccess]",label:a.lang.flash.access,"default":"",style:"width : 100%;",
+items:[[a.lang.common.notSet,""],[a.lang.flash.accessAlways,"always"],[a.lang.flash.accessSameDomain,"samedomain"],[a.lang.flash.accessNever,"never"]],setup:b,commit:c}]},{type:"hbox",widths:["50%","50%"],children:[{id:"wmode",type:"select",requiredContent:"embed[wmode]",label:a.lang.flash.windowMode,"default":"",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.flash.windowModeWindow,"window"],[a.lang.flash.windowModeOpaque,"opaque"],[a.lang.flash.windowModeTransparent,"transparent"]],
+setup:b,commit:c},{id:"quality",type:"select",requiredContent:"embed[quality]",label:a.lang.flash.quality,"default":"high",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.flash.qualityBest,"best"],[a.lang.flash.qualityHigh,"high"],[a.lang.flash.qualityAutoHigh,"autohigh"],[a.lang.flash.qualityMedium,"medium"],[a.lang.flash.qualityAutoLow,"autolow"],[a.lang.flash.qualityLow,"low"]],setup:b,commit:c}]},{type:"hbox",widths:["50%","50%"],children:[{id:"align",type:"select",requiredContent:"object[align]",
+label:a.lang.common.align,"default":"",style:"width : 100%;",items:[[a.lang.common.notSet,""],[a.lang.common.alignLeft,"left"],[a.lang.flash.alignAbsBottom,"absBottom"],[a.lang.flash.alignAbsMiddle,"absMiddle"],[a.lang.flash.alignBaseline,"baseline"],[a.lang.common.alignBottom,"bottom"],[a.lang.common.alignMiddle,"middle"],[a.lang.common.alignRight,"right"],[a.lang.flash.alignTextTop,"textTop"],[a.lang.common.alignTop,"top"]],setup:b,commit:function(a,b,f,g,i){var j=this.getValue();c.apply(this,arguments);
+j&&(i.align=j)}},{type:"html",html:"<div></div>"}]},{type:"fieldset",label:CKEDITOR.tools.htmlEncode(a.lang.flash.flashvars),children:[{type:"vbox",padding:0,children:[{type:"checkbox",id:"menu",label:a.lang.flash.chkMenu,"default":!0,setup:b,commit:c},{type:"checkbox",id:"play",label:a.lang.flash.chkPlay,"default":!0,setup:b,commit:c},{type:"checkbox",id:"loop",label:a.lang.flash.chkLoop,"default":!0,setup:b,commit:c},{type:"checkbox",id:"allowFullScreen",label:a.lang.flash.chkFull,"default":!0,
+setup:b,commit:c}]}]}]},{id:"advanced",label:a.lang.common.advancedTab,elements:[{type:"hbox",children:[{type:"text",id:"id",requiredContent:"object[id]",label:a.lang.common.id,setup:b,commit:c}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",id:"bgcolor",requiredContent:"embed[bgcolor]",label:a.lang.flash.bgcolor,setup:b,commit:c},{type:"text",id:"class",requiredContent:"embed(cke-xyz)",label:a.lang.common.cssClass,setup:b,commit:c}]},{type:"text",id:"style",requiredContent:"embed{cke-xyz}",
+validate:CKEDITOR.dialog.validate.inlineStyle(a.lang.common.invalidInlineStyle),label:a.lang.common.cssStyle,setup:b,commit:c}]}]}})})();
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/flash/images/placeholder.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/flash/images/placeholder.png
new file mode 100644
index 00000000..0bc6caa7
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/flash/images/placeholder.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/button.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/button.js
new file mode 100644
index 00000000..16ea8465
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/button.js
@@ -0,0 +1,8 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("button",function(b){function d(a){var b=this.getValue();b?(a.attributes[this.id]=b,"name"==this.id&&(a.attributes["data-cke-saved-name"]=b)):(delete a.attributes[this.id],"name"==this.id&&delete a.attributes["data-cke-saved-name"])}return{title:b.lang.forms.button.title,minWidth:350,minHeight:150,onShow:function(){delete this.button;var a=this.getParentEditor().getSelection().getSelectedElement();a&&a.is("input")&&a.getAttribute("type")in{button:1,reset:1,submit:1}&&(this.button=
+a,this.setupContent(a))},onOk:function(){var a=this.getParentEditor(),b=this.button,d=!b,c=b?CKEDITOR.htmlParser.fragment.fromHtml(b.getOuterHtml()).children[0]:new CKEDITOR.htmlParser.element("input");this.commitContent(c);var e=new CKEDITOR.htmlParser.basicWriter;c.writeHtml(e);c=CKEDITOR.dom.element.createFromHtml(e.getHtml(),a.document);d?a.insertElement(c):(c.replace(b),a.getSelection().selectElement(c))},contents:[{id:"info",label:b.lang.forms.button.title,title:b.lang.forms.button.title,elements:[{id:"name",
+type:"text",label:b.lang.common.name,"default":"",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:d},{id:"value",type:"text",label:b.lang.forms.button.text,accessKey:"V","default":"",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:d},{id:"type",type:"select",label:b.lang.forms.button.type,"default":"button",accessKey:"T",items:[[b.lang.forms.button.typeBtn,"button"],[b.lang.forms.button.typeSbm,"submit"],[b.lang.forms.button.typeRst,
+"reset"]],setup:function(a){this.setValue(a.getAttribute("type")||"")},commit:d}]}]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/checkbox.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/checkbox.js
new file mode 100644
index 00000000..1a0d4631
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/checkbox.js
@@ -0,0 +1,8 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("checkbox",function(d){return{title:d.lang.forms.checkboxAndRadio.checkboxTitle,minWidth:350,minHeight:140,onShow:function(){delete this.checkbox;var a=this.getParentEditor().getSelection().getSelectedElement();a&&"checkbox"==a.getAttribute("type")&&(this.checkbox=a,this.setupContent(a))},onOk:function(){var a,b=this.checkbox;b||(a=this.getParentEditor(),b=a.document.createElement("input"),b.setAttribute("type","checkbox"),a.insertElement(b));this.commitContent({element:b})},contents:[{id:"info",
+label:d.lang.forms.checkboxAndRadio.checkboxTitle,title:d.lang.forms.checkboxAndRadio.checkboxTitle,startupFocus:"txtName",elements:[{id:"txtName",type:"text",label:d.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){a=a.element;this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{id:"txtValue",type:"text",label:d.lang.forms.checkboxAndRadio.value,
+"default":"",accessKey:"V",setup:function(a){a=a.getAttribute("value");this.setValue(CKEDITOR.env.ie&&"on"==a?"":a)},commit:function(a){var b=a.element,c=this.getValue();c&&!(CKEDITOR.env.ie&&"on"==c)?b.setAttribute("value",c):CKEDITOR.env.ie?(c=new CKEDITOR.dom.element("input",b.getDocument()),b.copyAttributes(c,{value:1}),c.replace(b),d.getSelection().selectElement(c),a.element=c):b.removeAttribute("value")}},{id:"cmbSelected",type:"checkbox",label:d.lang.forms.checkboxAndRadio.selected,"default":"",
+accessKey:"S",value:"checked",setup:function(a){this.setValue(a.getAttribute("checked"))},commit:function(a){var b=a.element;if(CKEDITOR.env.ie){var c=!!b.getAttribute("checked"),e=!!this.getValue();c!=e&&(c=CKEDITOR.dom.element.createFromHtml('<input type="checkbox"'+(e?' checked="checked"':"")+"/>",d.document),b.copyAttributes(c,{type:1,checked:1}),c.replace(b),d.getSelection().selectElement(c),a.element=c)}else this.getValue()?b.setAttribute("checked","checked"):b.removeAttribute("checked")}}]}]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/form.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/form.js
new file mode 100644
index 00000000..3794c2ba
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/form.js
@@ -0,0 +1,8 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("form",function(a){var d={action:1,id:1,method:1,enctype:1,target:1};return{title:a.lang.forms.form.title,minWidth:350,minHeight:200,onShow:function(){delete this.form;var b=this.getParentEditor().elementPath().contains("form",1);b&&(this.form=b,this.setupContent(b))},onOk:function(){var b,a=this.form,c=!a;c&&(b=this.getParentEditor(),a=b.document.createElement("form"),!CKEDITOR.env.ie&&a.append(b.document.createElement("br")));c&&b.insertElement(a);this.commitContent(a)},onLoad:function(){function a(b){this.setValue(b.getAttribute(this.id)||
+"")}function e(a){this.getValue()?a.setAttribute(this.id,this.getValue()):a.removeAttribute(this.id)}this.foreach(function(c){d[c.id]&&(c.setup=a,c.commit=e)})},contents:[{id:"info",label:a.lang.forms.form.title,title:a.lang.forms.form.title,elements:[{id:"txtName",type:"text",label:a.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",
+!1),a.removeAttribute("name"))}},{id:"action",type:"text",label:a.lang.forms.form.action,"default":"",accessKey:"T"},{type:"hbox",widths:["45%","55%"],children:[{id:"id",type:"text",label:a.lang.common.id,"default":"",accessKey:"I"},{id:"enctype",type:"select",label:a.lang.forms.form.encoding,style:"width:100%",accessKey:"E","default":"",items:[[""],["text/plain"],["multipart/form-data"],["application/x-www-form-urlencoded"]]}]},{type:"hbox",widths:["45%","55%"],children:[{id:"target",type:"select",
+label:a.lang.common.target,style:"width:100%",accessKey:"M","default":"",items:[[a.lang.common.notSet,""],[a.lang.common.targetNew,"_blank"],[a.lang.common.targetTop,"_top"],[a.lang.common.targetSelf,"_self"],[a.lang.common.targetParent,"_parent"]]},{id:"method",type:"select",label:a.lang.forms.form.method,accessKey:"M","default":"GET",items:[["GET","get"],["POST","post"]]}]}]}]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/hiddenfield.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/hiddenfield.js
new file mode 100644
index 00000000..540ed423
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/hiddenfield.js
@@ -0,0 +1,8 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("hiddenfield",function(d){return{title:d.lang.forms.hidden.title,hiddenField:null,minWidth:350,minHeight:110,onShow:function(){delete this.hiddenField;var a=this.getParentEditor(),b=a.getSelection(),c=b.getSelectedElement();c&&(c.data("cke-real-element-type")&&"hiddenfield"==c.data("cke-real-element-type"))&&(this.hiddenField=c,c=a.restoreRealElement(this.hiddenField),this.setupContent(c),b.selectElement(this.hiddenField))},onOk:function(){var a=this.getValueOf("info","_cke_saved_name");
+this.getValueOf("info","value");var b=this.getParentEditor(),a=CKEDITOR.env.ie&&!(8<=CKEDITOR.document.$.documentMode)?b.document.createElement('<input name="'+CKEDITOR.tools.htmlEncode(a)+'">'):b.document.createElement("input");a.setAttribute("type","hidden");this.commitContent(a);a=b.createFakeElement(a,"cke_hidden","hiddenfield");this.hiddenField?(a.replace(this.hiddenField),b.getSelection().selectElement(a)):b.insertElement(a);return!0},contents:[{id:"info",label:d.lang.forms.hidden.title,title:d.lang.forms.hidden.title,
+elements:[{id:"_cke_saved_name",type:"text",label:d.lang.forms.hidden.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){this.getValue()?a.setAttribute("name",this.getValue()):a.removeAttribute("name")}},{id:"value",type:"text",label:d.lang.forms.hidden.value,"default":"",accessKey:"V",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:function(a){this.getValue()?a.setAttribute("value",this.getValue()):
+a.removeAttribute("value")}}]}]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/radio.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/radio.js
new file mode 100644
index 00000000..d9e28323
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/radio.js
@@ -0,0 +1,8 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("radio",function(d){return{title:d.lang.forms.checkboxAndRadio.radioTitle,minWidth:350,minHeight:140,onShow:function(){delete this.radioButton;var a=this.getParentEditor().getSelection().getSelectedElement();a&&("input"==a.getName()&&"radio"==a.getAttribute("type"))&&(this.radioButton=a,this.setupContent(a))},onOk:function(){var a,b=this.radioButton,c=!b;c&&(a=this.getParentEditor(),b=a.document.createElement("input"),b.setAttribute("type","radio"));c&&a.insertElement(b);this.commitContent({element:b})},
+contents:[{id:"info",label:d.lang.forms.checkboxAndRadio.radioTitle,title:d.lang.forms.checkboxAndRadio.radioTitle,elements:[{id:"name",type:"text",label:d.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){a=a.element;this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{id:"value",type:"text",label:d.lang.forms.checkboxAndRadio.value,"default":"",
+accessKey:"V",setup:function(a){this.setValue(a.getAttribute("value")||"")},commit:function(a){a=a.element;this.getValue()?a.setAttribute("value",this.getValue()):a.removeAttribute("value")}},{id:"checked",type:"checkbox",label:d.lang.forms.checkboxAndRadio.selected,"default":"",accessKey:"S",value:"checked",setup:function(a){this.setValue(a.getAttribute("checked"))},commit:function(a){var b=a.element;if(!CKEDITOR.env.ie&&!CKEDITOR.env.opera)this.getValue()?b.setAttribute("checked","checked"):b.removeAttribute("checked");
+else{var c=b.getAttribute("checked"),e=!!this.getValue();c!=e&&(c=CKEDITOR.dom.element.createFromHtml('<input type="radio"'+(e?' checked="checked"':"")+"></input>",d.document),b.copyAttributes(c,{type:1,checked:1}),c.replace(b),d.getSelection().selectElement(c),a.element=c)}}}]}]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/select.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/select.js
new file mode 100644
index 00000000..734d0330
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/select.js
@@ -0,0 +1,20 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("select",function(c){function h(a,b,e,d,c){a=f(a);d=d?d.createElement("OPTION"):document.createElement("OPTION");if(a&&d&&"option"==d.getName())CKEDITOR.env.ie?(isNaN(parseInt(c,10))?a.$.options.add(d.$):a.$.options.add(d.$,c),d.$.innerHTML=0<b.length?b:"",d.$.value=e):(null!==c&&c<a.getChildCount()?a.getChild(0>c?0:c).insertBeforeMe(d):a.append(d),d.setText(0<b.length?b:""),d.setValue(e));else return!1;return d}function m(a){for(var a=f(a),b=g(a),e=a.getChildren().count()-1;0<=
+e;e--)a.getChild(e).$.selected&&a.getChild(e).remove();i(a,b)}function n(a,b,e,d){a=f(a);if(0>b)return!1;a=a.getChild(b);a.setText(e);a.setValue(d);return a}function k(a){for(a=f(a);a.getChild(0)&&a.getChild(0).remove(););}function j(a,b,e){var a=f(a),d=g(a);if(0>d)return!1;b=d+b;b=0>b?0:b;b=b>=a.getChildCount()?a.getChildCount()-1:b;if(d==b)return!1;var d=a.getChild(d),c=d.getText(),o=d.getValue();d.remove();d=h(a,c,o,!e?null:e,b);i(a,b);return d}function g(a){return(a=f(a))?a.$.selectedIndex:-1}
+function i(a,b){a=f(a);if(0>b)return null;var e=a.getChildren().count();a.$.selectedIndex=b>=e?e-1:b;return a}function l(a){return(a=f(a))?a.getChildren():!1}function f(a){return a&&a.domId&&a.getInputElement().$?a.getInputElement():a&&a.$?a:!1}return{title:c.lang.forms.select.title,minWidth:CKEDITOR.env.ie?460:395,minHeight:CKEDITOR.env.ie?320:300,onShow:function(){delete this.selectBox;this.setupContent("clear");var a=this.getParentEditor().getSelection().getSelectedElement();if(a&&"select"==a.getName()){this.selectBox=
+a;this.setupContent(a.getName(),a);for(var a=l(a),b=0;b<a.count();b++)this.setupContent("option",a.getItem(b))}},onOk:function(){var a=this.getParentEditor(),b=this.selectBox,e=!b;e&&(b=a.document.createElement("select"));this.commitContent(b);if(e&&(a.insertElement(b),CKEDITOR.env.ie)){var d=a.getSelection(),c=d.createBookmarks();setTimeout(function(){d.selectBookmarks(c)},0)}},contents:[{id:"info",label:c.lang.forms.select.selectInfo,title:c.lang.forms.select.selectInfo,accessKey:"",elements:[{id:"txtName",
+type:"text",widths:["25%","75%"],labelLayout:"horizontal",label:c.lang.common.name,"default":"",accessKey:"N",style:"width:350px",setup:function(a,b){"clear"==a?this.setValue(this["default"]||""):"select"==a&&this.setValue(b.data("cke-saved-name")||b.getAttribute("name")||"")},commit:function(a){this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{id:"txtValue",type:"text",widths:["25%","75%"],labelLayout:"horizontal",label:c.lang.forms.select.value,
+style:"width:350px","default":"",className:"cke_disabled",onLoad:function(){this.getInputElement().setAttribute("readOnly",!0)},setup:function(a,b){"clear"==a?this.setValue(""):"option"==a&&b.getAttribute("selected")&&this.setValue(b.$.value)}},{type:"hbox",widths:["175px","170px"],children:[{id:"txtSize",type:"text",labelLayout:"horizontal",label:c.lang.forms.select.size,"default":"",accessKey:"S",style:"width:175px",validate:function(){var a=CKEDITOR.dialog.validate.integer(c.lang.common.validateNumberFailed);
+return""===this.getValue()||a.apply(this)},setup:function(a,b){"select"==a&&this.setValue(b.getAttribute("size")||"");CKEDITOR.env.webkit&&this.getInputElement().setStyle("width","86px")},commit:function(a){this.getValue()?a.setAttribute("size",this.getValue()):a.removeAttribute("size")}},{type:"html",html:"<span>"+CKEDITOR.tools.htmlEncode(c.lang.forms.select.lines)+"</span>"}]},{type:"html",html:"<span>"+CKEDITOR.tools.htmlEncode(c.lang.forms.select.opAvail)+"</span>"},{type:"hbox",widths:["115px",
+"115px","100px"],children:[{type:"vbox",children:[{id:"txtOptName",type:"text",label:c.lang.forms.select.opText,style:"width:115px",setup:function(a){"clear"==a&&this.setValue("")}},{type:"select",id:"cmbName",label:"",title:"",size:5,style:"width:115px;height:75px",items:[],onChange:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbValue"),e=a.getContentElement("info","txtOptName"),a=a.getContentElement("info","txtOptValue"),d=g(this);i(b,d);e.setValue(this.getValue());a.setValue(b.getValue())},
+setup:function(a,b){"clear"==a?k(this):"option"==a&&h(this,b.getText(),b.getText(),this.getDialog().getParentEditor().document)},commit:function(a){var b=this.getDialog(),e=l(this),d=l(b.getContentElement("info","cmbValue")),c=b.getContentElement("info","txtValue").getValue();k(a);for(var f=0;f<e.count();f++){var g=h(a,e.getItem(f).getValue(),d.getItem(f).getValue(),b.getParentEditor().document);d.getItem(f).getValue()==c&&(g.setAttribute("selected","selected"),g.selected=!0)}}}]},{type:"vbox",children:[{id:"txtOptValue",
+type:"text",label:c.lang.forms.select.opValue,style:"width:115px",setup:function(a){"clear"==a&&this.setValue("")}},{type:"select",id:"cmbValue",label:"",size:5,style:"width:115px;height:75px",items:[],onChange:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbName"),e=a.getContentElement("info","txtOptName"),a=a.getContentElement("info","txtOptValue"),d=g(this);i(b,d);e.setValue(b.getValue());a.setValue(this.getValue())},setup:function(a,b){if("clear"==a)k(this);else if("option"==
+a){var e=b.getValue();h(this,e,e,this.getDialog().getParentEditor().document);"selected"==b.getAttribute("selected")&&this.getDialog().getContentElement("info","txtValue").setValue(e)}}}]},{type:"vbox",padding:5,children:[{type:"button",id:"btnAdd",style:"",label:c.lang.forms.select.btnAdd,title:c.lang.forms.select.btnAdd,style:"width:100%;",onClick:function(){var a=this.getDialog();a.getParentEditor();var b=a.getContentElement("info","txtOptName"),e=a.getContentElement("info","txtOptValue"),d=a.getContentElement("info",
+"cmbName"),c=a.getContentElement("info","cmbValue");h(d,b.getValue(),b.getValue(),a.getParentEditor().document);h(c,e.getValue(),e.getValue(),a.getParentEditor().document);b.setValue("");e.setValue("")}},{type:"button",id:"btnModify",label:c.lang.forms.select.btnModify,title:c.lang.forms.select.btnModify,style:"width:100%;",onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","txtOptName"),e=a.getContentElement("info","txtOptValue"),d=a.getContentElement("info","cmbName"),a=a.getContentElement("info",
+"cmbValue"),c=g(d);0<=c&&(n(d,c,b.getValue(),b.getValue()),n(a,c,e.getValue(),e.getValue()))}},{type:"button",id:"btnUp",style:"width:100%;",label:c.lang.forms.select.btnUp,title:c.lang.forms.select.btnUp,onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbName"),c=a.getContentElement("info","cmbValue");j(b,-1,a.getParentEditor().document);j(c,-1,a.getParentEditor().document)}},{type:"button",id:"btnDown",style:"width:100%;",label:c.lang.forms.select.btnDown,title:c.lang.forms.select.btnDown,
+onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbName"),c=a.getContentElement("info","cmbValue");j(b,1,a.getParentEditor().document);j(c,1,a.getParentEditor().document)}}]}]},{type:"hbox",widths:["40%","20%","40%"],children:[{type:"button",id:"btnSetValue",label:c.lang.forms.select.btnSetValue,title:c.lang.forms.select.btnSetValue,onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbValue");a.getContentElement("info","txtValue").setValue(b.getValue())}},
+{type:"button",id:"btnDelete",label:c.lang.forms.select.btnDelete,title:c.lang.forms.select.btnDelete,onClick:function(){var a=this.getDialog(),b=a.getContentElement("info","cmbName"),c=a.getContentElement("info","cmbValue"),d=a.getContentElement("info","txtOptName"),a=a.getContentElement("info","txtOptValue");m(b);m(c);d.setValue("");a.setValue("")}},{id:"chkMulti",type:"checkbox",label:c.lang.forms.select.chkMulti,"default":"",accessKey:"M",value:"checked",setup:function(a,b){"select"==a&&this.setValue(b.getAttribute("multiple"));
+CKEDITOR.env.webkit&&this.getElement().getParent().setStyle("vertical-align","middle")},commit:function(a){this.getValue()?a.setAttribute("multiple",this.getValue()):a.removeAttribute("multiple")}}]}]}]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/textarea.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/textarea.js
new file mode 100644
index 00000000..46f670b9
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/textarea.js
@@ -0,0 +1,8 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("textarea",function(b){return{title:b.lang.forms.textarea.title,minWidth:350,minHeight:220,onShow:function(){delete this.textarea;var a=this.getParentEditor().getSelection().getSelectedElement();a&&"textarea"==a.getName()&&(this.textarea=a,this.setupContent(a))},onOk:function(){var a,b=this.textarea,c=!b;c&&(a=this.getParentEditor(),b=a.document.createElement("textarea"));this.commitContent(b);c&&a.insertElement(b)},contents:[{id:"info",label:b.lang.forms.textarea.title,title:b.lang.forms.textarea.title,
+elements:[{id:"_cke_saved_name",type:"text",label:b.lang.common.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{type:"hbox",widths:["50%","50%"],children:[{id:"cols",type:"text",label:b.lang.forms.textarea.cols,"default":"",accessKey:"C",style:"width:50px",validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed),
+setup:function(a){this.setValue(a.hasAttribute("cols")&&a.getAttribute("cols")||"")},commit:function(a){this.getValue()?a.setAttribute("cols",this.getValue()):a.removeAttribute("cols")}},{id:"rows",type:"text",label:b.lang.forms.textarea.rows,"default":"",accessKey:"R",style:"width:50px",validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed),setup:function(a){this.setValue(a.hasAttribute("rows")&&a.getAttribute("rows")||"")},commit:function(a){this.getValue()?a.setAttribute("rows",
+this.getValue()):a.removeAttribute("rows")}}]},{id:"value",type:"textarea",label:b.lang.forms.textfield.value,"default":"",setup:function(a){this.setValue(a.$.defaultValue)},commit:function(a){a.$.value=a.$.defaultValue=this.getValue()}}]}]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/textfield.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/textfield.js
new file mode 100644
index 00000000..f855d243
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/dialogs/textfield.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("textfield",function(b){function e(a){var a=a.element,c=this.getValue();c?a.setAttribute(this.id,c):a.removeAttribute(this.id)}function f(a){this.setValue(a.hasAttribute(this.id)&&a.getAttribute(this.id)||"")}var g={email:1,password:1,search:1,tel:1,text:1,url:1};return{title:b.lang.forms.textfield.title,minWidth:350,minHeight:150,onShow:function(){delete this.textField;var a=this.getParentEditor().getSelection().getSelectedElement();if(a&&"input"==a.getName()&&(g[a.getAttribute("type")]||
+!a.getAttribute("type")))this.textField=a,this.setupContent(a)},onOk:function(){var a=this.getParentEditor(),c=this.textField,b=!c;b&&(c=a.document.createElement("input"),c.setAttribute("type","text"));c={element:c};b&&a.insertElement(c.element);this.commitContent(c);b||a.getSelection().selectElement(c.element)},onLoad:function(){this.foreach(function(a){if(a.getValue&&(a.setup||(a.setup=f),!a.commit))a.commit=e})},contents:[{id:"info",label:b.lang.forms.textfield.title,title:b.lang.forms.textfield.title,
+elements:[{type:"hbox",widths:["50%","50%"],children:[{id:"_cke_saved_name",type:"text",label:b.lang.forms.textfield.name,"default":"",accessKey:"N",setup:function(a){this.setValue(a.data("cke-saved-name")||a.getAttribute("name")||"")},commit:function(a){a=a.element;this.getValue()?a.data("cke-saved-name",this.getValue()):(a.data("cke-saved-name",!1),a.removeAttribute("name"))}},{id:"value",type:"text",label:b.lang.forms.textfield.value,"default":"",accessKey:"V",commit:function(a){if(CKEDITOR.env.ie&&
+!this.getValue()){var c=a.element,d=new CKEDITOR.dom.element("input",b.document);c.copyAttributes(d,{value:1});d.replace(c);a.element=d}else e.call(this,a)}}]},{type:"hbox",widths:["50%","50%"],children:[{id:"size",type:"text",label:b.lang.forms.textfield.charWidth,"default":"",accessKey:"C",style:"width:50px",validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed)},{id:"maxLength",type:"text",label:b.lang.forms.textfield.maxChars,"default":"",accessKey:"M",style:"width:50px",
+validate:CKEDITOR.dialog.validate.integer(b.lang.common.validateNumberFailed)}],onLoad:function(){CKEDITOR.env.ie7Compat&&this.getElement().setStyle("zoom","100%")}},{id:"type",type:"select",label:b.lang.forms.textfield.type,"default":"text",accessKey:"M",items:[[b.lang.forms.textfield.typeEmail,"email"],[b.lang.forms.textfield.typePass,"password"],[b.lang.forms.textfield.typeSearch,"search"],[b.lang.forms.textfield.typeTel,"tel"],[b.lang.forms.textfield.typeText,"text"],[b.lang.forms.textfield.typeUrl,
+"url"]],setup:function(a){this.setValue(a.getAttribute("type"))},commit:function(a){var c=a.element;if(CKEDITOR.env.ie){var d=c.getAttribute("type"),e=this.getValue();d!=e&&(d=CKEDITOR.dom.element.createFromHtml('<input type="'+e+'"></input>',b.document),c.copyAttributes(d,{type:1}),d.replace(c),a.element=d)}else c.setAttribute("type",this.getValue())}}]}]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/images/hiddenfield.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/images/hiddenfield.gif
new file mode 100644
index 00000000..953f643b
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/forms/images/hiddenfield.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/icons.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/icons.png
new file mode 100644
index 00000000..7e5f9bd0
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/icons.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/icons_hidpi.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/icons_hidpi.png
new file mode 100644
index 00000000..034ba6f2
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/icons_hidpi.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/iframe/dialogs/iframe.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/iframe/dialogs/iframe.js
new file mode 100644
index 00000000..b33ee5ee
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/iframe/dialogs/iframe.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(){function c(b){var c=this instanceof CKEDITOR.ui.dialog.checkbox;b.hasAttribute(this.id)&&(b=b.getAttribute(this.id),c?this.setValue(e[this.id]["true"]==b.toLowerCase()):this.setValue(b))}function d(b){var c=""===this.getValue(),a=this instanceof CKEDITOR.ui.dialog.checkbox,d=this.getValue();c?b.removeAttribute(this.att||this.id):a?b.setAttribute(this.id,e[this.id][d]):b.setAttribute(this.att||this.id,d)}var e={scrolling:{"true":"yes","false":"no"},frameborder:{"true":"1","false":"0"}};
+CKEDITOR.dialog.add("iframe",function(b){var f=b.lang.iframe,a=b.lang.common,e=b.plugins.dialogadvtab;return{title:f.title,minWidth:350,minHeight:260,onShow:function(){this.fakeImage=this.iframeNode=null;var a=this.getSelectedElement();a&&(a.data("cke-real-element-type")&&"iframe"==a.data("cke-real-element-type"))&&(this.fakeImage=a,this.iframeNode=a=b.restoreRealElement(a),this.setupContent(a))},onOk:function(){var a;a=this.fakeImage?this.iframeNode:new CKEDITOR.dom.element("iframe");var c={},d=
+{};this.commitContent(a,c,d);a=b.createFakeElement(a,"cke_iframe","iframe",!0);a.setAttributes(d);a.setStyles(c);this.fakeImage?(a.replace(this.fakeImage),b.getSelection().selectElement(a)):b.insertElement(a)},contents:[{id:"info",label:a.generalTab,accessKey:"I",elements:[{type:"vbox",padding:0,children:[{id:"src",type:"text",label:a.url,required:!0,validate:CKEDITOR.dialog.validate.notEmpty(f.noUrl),setup:c,commit:d}]},{type:"hbox",children:[{id:"width",type:"text",requiredContent:"iframe[width]",
+style:"width:100%",labelLayout:"vertical",label:a.width,validate:CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace("%1",a.width)),setup:c,commit:d},{id:"height",type:"text",requiredContent:"iframe[height]",style:"width:100%",labelLayout:"vertical",label:a.height,validate:CKEDITOR.dialog.validate.htmlLength(a.invalidHtmlLength.replace("%1",a.height)),setup:c,commit:d},{id:"align",type:"select",requiredContent:"iframe[align]","default":"",items:[[a.notSet,""],[a.alignLeft,"left"],[a.alignRight,
+"right"],[a.alignTop,"top"],[a.alignMiddle,"middle"],[a.alignBottom,"bottom"]],style:"width:100%",labelLayout:"vertical",label:a.align,setup:function(a,b){c.apply(this,arguments);if(b){var d=b.getAttribute("align");this.setValue(d&&d.toLowerCase()||"")}},commit:function(a,b,c){d.apply(this,arguments);this.getValue()&&(c.align=this.getValue())}}]},{type:"hbox",widths:["50%","50%"],children:[{id:"scrolling",type:"checkbox",requiredContent:"iframe[scrolling]",label:f.scrolling,setup:c,commit:d},{id:"frameborder",
+type:"checkbox",requiredContent:"iframe[frameborder]",label:f.border,setup:c,commit:d}]},{type:"hbox",widths:["50%","50%"],children:[{id:"name",type:"text",requiredContent:"iframe[name]",label:a.name,setup:c,commit:d},{id:"title",type:"text",requiredContent:"iframe[title]",label:a.advisoryTitle,setup:c,commit:d}]},{id:"longdesc",type:"text",requiredContent:"iframe[longdesc]",label:a.longDescr,setup:c,commit:d}]},e&&e.createAdvancedTab(b,{id:1,classes:1,styles:1},"iframe")]}})})();
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/iframe/images/placeholder.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/iframe/images/placeholder.png
new file mode 100644
index 00000000..b40c7b20
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/iframe/images/placeholder.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/image/dialogs/image.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/image/dialogs/image.js
new file mode 100644
index 00000000..c37923e7
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/image/dialogs/image.js
@@ -0,0 +1,43 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(){var r=function(c,j){function r(){var a=arguments,b=this.getContentElement("advanced","txtdlgGenStyle");b&&b.commit.apply(b,a);this.foreach(function(b){b.commit&&"txtdlgGenStyle"!=b.id&&b.commit.apply(b,a)})}function i(a){if(!s){s=1;var b=this.getDialog(),d=b.imageElement;if(d){this.commit(f,d);for(var a=[].concat(a),e=a.length,c,g=0;g<e;g++)(c=b.getContentElement.apply(b,a[g].split(":")))&&c.setup(f,d)}s=0}}var f=1,k=/^\s*(\d+)((px)|\%)?\s*$/i,v=/(^\s*(\d+)((px)|\%)?\s*$)|^$/i,o=/^\d+px$/,
+w=function(){var a=this.getValue(),b=this.getDialog(),d=a.match(k);d&&("%"==d[2]&&l(b,!1),a=d[1]);b.lockRatio&&(d=b.originalElement,"true"==d.getCustomData("isReady")&&("txtHeight"==this.id?(a&&"0"!=a&&(a=Math.round(d.$.width*(a/d.$.height))),isNaN(a)||b.setValueOf("info","txtWidth",a)):(a&&"0"!=a&&(a=Math.round(d.$.height*(a/d.$.width))),isNaN(a)||b.setValueOf("info","txtHeight",a))));g(b)},g=function(a){if(!a.originalElement||!a.preview)return 1;a.commitContent(4,a.preview);return 0},s,l=function(a,
+b){if(!a.getContentElement("info","ratioLock"))return null;var d=a.originalElement;if(!d)return null;if("check"==b){if(!a.userlockRatio&&"true"==d.getCustomData("isReady")){var e=a.getValueOf("info","txtWidth"),c=a.getValueOf("info","txtHeight"),d=1E3*d.$.width/d.$.height,f=1E3*e/c;a.lockRatio=!1;!e&&!c?a.lockRatio=!0:!isNaN(d)&&!isNaN(f)&&Math.round(d)==Math.round(f)&&(a.lockRatio=!0)}}else void 0!=b?a.lockRatio=b:(a.userlockRatio=1,a.lockRatio=!a.lockRatio);e=CKEDITOR.document.getById(p);a.lockRatio?
+e.removeClass("cke_btn_unlocked"):e.addClass("cke_btn_unlocked");e.setAttribute("aria-checked",a.lockRatio);CKEDITOR.env.hc&&e.getChild(0).setHtml(a.lockRatio?CKEDITOR.env.ie?"■":"▣":CKEDITOR.env.ie?"□":"▢");return a.lockRatio},x=function(a){var b=a.originalElement;if("true"==b.getCustomData("isReady")){var d=a.getContentElement("info","txtWidth"),e=a.getContentElement("info","txtHeight");d&&d.setValue(b.$.width);e&&e.setValue(b.$.height)}g(a)},y=function(a,b){function d(a,b){var d=a.match(k);return d?
+("%"==d[2]&&(d[1]+="%",l(e,!1)),d[1]):b}if(a==f){var e=this.getDialog(),c="",g="txtWidth"==this.id?"width":"height",h=b.getAttribute(g);h&&(c=d(h,c));c=d(b.getStyle(g),c);this.setValue(c)}},t,q=function(){var a=this.originalElement;a.setCustomData("isReady","true");a.removeListener("load",q);a.removeListener("error",h);a.removeListener("abort",h);CKEDITOR.document.getById(m).setStyle("display","none");this.dontResetSize||x(this);this.firstLoad&&CKEDITOR.tools.setTimeout(function(){l(this,"check")},
+0,this);this.dontResetSize=this.firstLoad=!1},h=function(){var a=this.originalElement;a.removeListener("load",q);a.removeListener("error",h);a.removeListener("abort",h);a=CKEDITOR.getUrl(CKEDITOR.plugins.get("image").path+"images/noimage.png");this.preview&&this.preview.setAttribute("src",a);CKEDITOR.document.getById(m).setStyle("display","none");l(this,!1)},n=function(a){return CKEDITOR.tools.getNextId()+"_"+a},p=n("btnLockSizes"),u=n("btnResetSize"),m=n("ImagePreviewLoader"),A=n("previewLink"),
+z=n("previewImage");return{title:c.lang.image["image"==j?"title":"titleButton"],minWidth:420,minHeight:360,onShow:function(){this.linkEditMode=this.imageEditMode=this.linkElement=this.imageElement=!1;this.lockRatio=!0;this.userlockRatio=0;this.dontResetSize=!1;this.firstLoad=!0;this.addLink=!1;var a=this.getParentEditor(),b=a.getSelection(),d=(b=b&&b.getSelectedElement())&&a.elementPath(b).contains("a",1);CKEDITOR.document.getById(m).setStyle("display","none");t=new CKEDITOR.dom.element("img",a.document);
+this.preview=CKEDITOR.document.getById(z);this.originalElement=a.document.createElement("img");this.originalElement.setAttribute("alt","");this.originalElement.setCustomData("isReady","false");if(d){this.linkElement=d;this.linkEditMode=!0;var c=d.getChildren();if(1==c.count()){var g=c.getItem(0).getName();if("img"==g||"input"==g)this.imageElement=c.getItem(0),"img"==this.imageElement.getName()?this.imageEditMode="img":"input"==this.imageElement.getName()&&(this.imageEditMode="input")}"image"==j&&
+this.setupContent(2,d)}if(b&&"img"==b.getName()&&!b.data("cke-realelement")||b&&"input"==b.getName()&&"image"==b.getAttribute("type"))this.imageEditMode=b.getName(),this.imageElement=b;this.imageEditMode?(this.cleanImageElement=this.imageElement,this.imageElement=this.cleanImageElement.clone(!0,!0),this.setupContent(f,this.imageElement)):this.imageElement=a.document.createElement("img");l(this,!0);CKEDITOR.tools.trim(this.getValueOf("info","txtUrl"))||(this.preview.removeAttribute("src"),this.preview.setStyle("display",
+"none"))},onOk:function(){if(this.imageEditMode){var a=this.imageEditMode;"image"==j&&"input"==a&&confirm(c.lang.image.button2Img)?(this.imageElement=c.document.createElement("img"),this.imageElement.setAttribute("alt",""),c.insertElement(this.imageElement)):"image"!=j&&"img"==a&&confirm(c.lang.image.img2Button)?(this.imageElement=c.document.createElement("input"),this.imageElement.setAttributes({type:"image",alt:""}),c.insertElement(this.imageElement)):(this.imageElement=this.cleanImageElement,delete this.cleanImageElement)}else"image"==
+j?this.imageElement=c.document.createElement("img"):(this.imageElement=c.document.createElement("input"),this.imageElement.setAttribute("type","image")),this.imageElement.setAttribute("alt","");this.linkEditMode||(this.linkElement=c.document.createElement("a"));this.commitContent(f,this.imageElement);this.commitContent(2,this.linkElement);this.imageElement.getAttribute("style")||this.imageElement.removeAttribute("style");this.imageEditMode?!this.linkEditMode&&this.addLink?(c.insertElement(this.linkElement),
+this.imageElement.appendTo(this.linkElement)):this.linkEditMode&&!this.addLink&&(c.getSelection().selectElement(this.linkElement),c.insertElement(this.imageElement)):this.addLink?this.linkEditMode?c.insertElement(this.imageElement):(c.insertElement(this.linkElement),this.linkElement.append(this.imageElement,!1)):c.insertElement(this.imageElement)},onLoad:function(){"image"!=j&&this.hidePage("Link");var a=this._.element.getDocument();this.getContentElement("info","ratioLock")&&(this.addFocusable(a.getById(u),
+5),this.addFocusable(a.getById(p),5));this.commitContent=r},onHide:function(){this.preview&&this.commitContent(8,this.preview);this.originalElement&&(this.originalElement.removeListener("load",q),this.originalElement.removeListener("error",h),this.originalElement.removeListener("abort",h),this.originalElement.remove(),this.originalElement=!1);delete this.imageElement},contents:[{id:"info",label:c.lang.image.infoTab,accessKey:"I",elements:[{type:"vbox",padding:0,children:[{type:"hbox",widths:["280px",
+"110px"],align:"right",children:[{id:"txtUrl",type:"text",label:c.lang.common.url,required:!0,onChange:function(){var a=this.getDialog(),b=this.getValue();if(0<b.length){var a=this.getDialog(),d=a.originalElement;a.preview.removeStyle("display");d.setCustomData("isReady","false");var c=CKEDITOR.document.getById(m);c&&c.setStyle("display","");d.on("load",q,a);d.on("error",h,a);d.on("abort",h,a);d.setAttribute("src",b);t.setAttribute("src",b);a.preview.setAttribute("src",t.$.src);g(a)}else a.preview&&
+(a.preview.removeAttribute("src"),a.preview.setStyle("display","none"))},setup:function(a,b){if(a==f){var d=b.data("cke-saved-src")||b.getAttribute("src");this.getDialog().dontResetSize=!0;this.setValue(d);this.setInitValue()}},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())?(b.data("cke-saved-src",this.getValue()),b.setAttribute("src",this.getValue())):8==a&&(b.setAttribute("src",""),b.removeAttribute("src"))},validate:CKEDITOR.dialog.validate.notEmpty(c.lang.image.urlMissing)},{type:"button",
+id:"browse",style:"display:inline-block;margin-top:10px;",align:"center",label:c.lang.common.browseServer,hidden:!0,filebrowser:"info:txtUrl"}]}]},{id:"txtAlt",type:"text",label:c.lang.image.alt,accessKey:"T","default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("alt"))},commit:function(a,b){a==f?(this.getValue()||this.isChanged())&&b.setAttribute("alt",this.getValue()):4==a?b.setAttribute("alt",this.getValue()):8==a&&b.removeAttribute("alt")}},
+{type:"hbox",children:[{id:"basic",type:"vbox",children:[{type:"hbox",requiredContent:"img{width,height}",widths:["50%","50%"],children:[{type:"vbox",padding:1,children:[{type:"text",width:"45px",id:"txtWidth",label:c.lang.common.width,onKeyUp:w,onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:function(){var a=this.getValue().match(v);(a=!!(a&&0!==parseInt(a[1],10)))||alert(c.lang.common.invalidWidth);return a},setup:y,commit:function(a,b,d){var c=this.getValue();a==f?(c?b.setStyle("width",
+CKEDITOR.tools.cssLength(c)):b.removeStyle("width"),!d&&b.removeAttribute("width")):4==a?c.match(k)?b.setStyle("width",CKEDITOR.tools.cssLength(c)):(a=this.getDialog().originalElement,"true"==a.getCustomData("isReady")&&b.setStyle("width",a.$.width+"px")):8==a&&(b.removeAttribute("width"),b.removeStyle("width"))}},{type:"text",id:"txtHeight",width:"45px",label:c.lang.common.height,onKeyUp:w,onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:function(){var a=this.getValue().match(v);
+(a=!!(a&&0!==parseInt(a[1],10)))||alert(c.lang.common.invalidHeight);return a},setup:y,commit:function(a,b,d){var c=this.getValue();a==f?(c?b.setStyle("height",CKEDITOR.tools.cssLength(c)):b.removeStyle("height"),!d&&b.removeAttribute("height")):4==a?c.match(k)?b.setStyle("height",CKEDITOR.tools.cssLength(c)):(a=this.getDialog().originalElement,"true"==a.getCustomData("isReady")&&b.setStyle("height",a.$.height+"px")):8==a&&(b.removeAttribute("height"),b.removeStyle("height"))}}]},{id:"ratioLock",
+type:"html",style:"margin-top:30px;width:40px;height:40px;",onLoad:function(){var a=CKEDITOR.document.getById(u),b=CKEDITOR.document.getById(p);a&&(a.on("click",function(a){x(this);a.data&&a.data.preventDefault()},this.getDialog()),a.on("mouseover",function(){this.addClass("cke_btn_over")},a),a.on("mouseout",function(){this.removeClass("cke_btn_over")},a));b&&(b.on("click",function(a){l(this);var b=this.originalElement,c=this.getValueOf("info","txtWidth");if(b.getCustomData("isReady")=="true"&&c){b=
+b.$.height/b.$.width*c;if(!isNaN(b)){this.setValueOf("info","txtHeight",Math.round(b));g(this)}}a.data&&a.data.preventDefault()},this.getDialog()),b.on("mouseover",function(){this.addClass("cke_btn_over")},b),b.on("mouseout",function(){this.removeClass("cke_btn_over")},b))},html:'<div><a href="javascript:void(0)" tabindex="-1" title="'+c.lang.image.lockRatio+'" class="cke_btn_locked" id="'+p+'" role="checkbox"><span class="cke_icon"></span><span class="cke_label">'+c.lang.image.lockRatio+'</span></a><a href="javascript:void(0)" tabindex="-1" title="'+
+c.lang.image.resetSize+'" class="cke_btn_reset" id="'+u+'" role="button"><span class="cke_label">'+c.lang.image.resetSize+"</span></a></div>"}]},{type:"vbox",padding:1,children:[{type:"text",id:"txtBorder",requiredContent:"img{border-width}",width:"60px",label:c.lang.image.border,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateBorder),setup:function(a,b){if(a==f){var d;d=
+(d=(d=b.getStyle("border-width"))&&d.match(/^(\d+px)(?: \1 \1 \1)?$/))&&parseInt(d[1],10);isNaN(parseInt(d,10))&&(d=b.getAttribute("border"));this.setValue(d)}},commit:function(a,b,d){var c=parseInt(this.getValue(),10);a==f||4==a?(isNaN(c)?!c&&this.isChanged()&&b.removeStyle("border"):(b.setStyle("border-width",CKEDITOR.tools.cssLength(c)),b.setStyle("border-style","solid")),!d&&a==f&&b.removeAttribute("border")):8==a&&(b.removeAttribute("border"),b.removeStyle("border-width"),b.removeStyle("border-style"),
+b.removeStyle("border-color"))}},{type:"text",id:"txtHSpace",requiredContent:"img{margin-left,margin-right}",width:"60px",label:c.lang.image.hSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateHSpace),setup:function(a,b){if(a==f){var d,c;d=b.getStyle("margin-left");c=b.getStyle("margin-right");d=d&&d.match(o);c=c&&c.match(o);d=parseInt(d,10);c=parseInt(c,10);d=d==c&&d;
+isNaN(parseInt(d,10))&&(d=b.getAttribute("hspace"));this.setValue(d)}},commit:function(a,b,c){var e=parseInt(this.getValue(),10);a==f||4==a?(isNaN(e)?!e&&this.isChanged()&&(b.removeStyle("margin-left"),b.removeStyle("margin-right")):(b.setStyle("margin-left",CKEDITOR.tools.cssLength(e)),b.setStyle("margin-right",CKEDITOR.tools.cssLength(e))),!c&&a==f&&b.removeAttribute("hspace")):8==a&&(b.removeAttribute("hspace"),b.removeStyle("margin-left"),b.removeStyle("margin-right"))}},{type:"text",id:"txtVSpace",
+requiredContent:"img{margin-top,margin-bottom}",width:"60px",label:c.lang.image.vSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateVSpace),setup:function(a,b){if(a==f){var c,e;c=b.getStyle("margin-top");e=b.getStyle("margin-bottom");c=c&&c.match(o);e=e&&e.match(o);c=parseInt(c,10);e=parseInt(e,10);c=c==e&&c;isNaN(parseInt(c,10))&&(c=b.getAttribute("vspace"));this.setValue(c)}},
+commit:function(a,b,c){var e=parseInt(this.getValue(),10);a==f||4==a?(isNaN(e)?!e&&this.isChanged()&&(b.removeStyle("margin-top"),b.removeStyle("margin-bottom")):(b.setStyle("margin-top",CKEDITOR.tools.cssLength(e)),b.setStyle("margin-bottom",CKEDITOR.tools.cssLength(e))),!c&&a==f&&b.removeAttribute("vspace")):8==a&&(b.removeAttribute("vspace"),b.removeStyle("margin-top"),b.removeStyle("margin-bottom"))}},{id:"cmbAlign",requiredContent:"img{float}",type:"select",widths:["35%","65%"],style:"width:90px",
+label:c.lang.common.align,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.alignLeft,"left"],[c.lang.common.alignRight,"right"]],onChange:function(){g(this.getDialog());i.call(this,"advanced:txtdlgGenStyle")},setup:function(a,b){if(a==f){var c=b.getStyle("float");switch(c){case "inherit":case "none":c=""}!c&&(c=(b.getAttribute("align")||"").toLowerCase());this.setValue(c)}},commit:function(a,b,c){var e=this.getValue();if(a==f||4==a){if(e?b.setStyle("float",e):b.removeStyle("float"),!c&&
+a==f)switch(e=(b.getAttribute("align")||"").toLowerCase(),e){case "left":case "right":b.removeAttribute("align")}}else 8==a&&b.removeStyle("float")}}]}]},{type:"vbox",height:"250px",children:[{type:"html",id:"htmlPreview",style:"width:95%;",html:"<div>"+CKEDITOR.tools.htmlEncode(c.lang.common.preview)+'<br><div id="'+m+'" class="ImagePreviewLoader" style="display:none"><div class="loading">&nbsp;</div></div><div class="ImagePreviewBox"><table><tr><td><a href="javascript:void(0)" target="_blank" onclick="return false;" id="'+
+A+'"><img id="'+z+'" alt="" /></a>'+(c.config.image_previewText||"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas feugiat consequat diam. Maecenas metus. Vivamus diam purus, cursus a, commodo non, facilisis vitae, nulla. Aenean dictum lacinia tortor. Nunc iaculis, nibh non iaculis aliquam, orci felis euismod neque, sed ornare massa mauris sed velit. Nulla pretium mi et risus. Fusce mi pede, tempor id, cursus ac, ullamcorper nec, enim. Sed tortor. Curabitur molestie. Duis velit augue, condimentum at, ultrices a, luctus ut, orci. Donec pellentesque egestas eros. Integer cursus, augue in cursus faucibus, eros pede bibendum sem, in tempus tellus justo quis ligula. Etiam eget tortor. Vestibulum rutrum, est ut placerat elementum, lectus nisl aliquam velit, tempor aliquam eros nunc nonummy metus. In eros metus, gravida a, gravida sed, lobortis id, turpis. Ut ultrices, ipsum at venenatis fringilla, sem nulla lacinia tellus, eget aliquet turpis mauris non enim. Nam turpis. Suspendisse lacinia. Curabitur ac tortor ut ipsum egestas elementum. Nunc imperdiet gravida mauris.")+
+"</td></tr></table></div></div>"}]}]}]},{id:"Link",requiredContent:"a[href]",label:c.lang.image.linkTab,padding:0,elements:[{id:"txtUrl",type:"text",label:c.lang.common.url,style:"width: 100%","default":"",setup:function(a,b){if(2==a){var c=b.data("cke-saved-href");c||(c=b.getAttribute("href"));this.setValue(c)}},commit:function(a,b){if(2==a&&(this.getValue()||this.isChanged())){var d=decodeURI(this.getValue());b.data("cke-saved-href",d);b.setAttribute("href",d);if(this.getValue()||!c.config.image_removeLinkByEmptyURL)this.getDialog().addLink=
+!0}}},{type:"button",id:"browse",filebrowser:{action:"Browse",target:"Link:txtUrl",url:c.config.filebrowserImageBrowseLinkUrl},style:"float:right",hidden:!0,label:c.lang.common.browseServer},{id:"cmbTarget",type:"select",requiredContent:"a[target]",label:c.lang.common.target,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.targetNew,"_blank"],[c.lang.common.targetTop,"_top"],[c.lang.common.targetSelf,"_self"],[c.lang.common.targetParent,"_parent"]],setup:function(a,b){2==a&&this.setValue(b.getAttribute("target")||
+"")},commit:function(a,b){2==a&&(this.getValue()||this.isChanged())&&b.setAttribute("target",this.getValue())}}]},{id:"Upload",hidden:!0,filebrowser:"uploadButton",label:c.lang.image.upload,elements:[{type:"file",id:"upload",label:c.lang.image.btnUpload,style:"height:40px",size:38},{type:"fileButton",id:"uploadButton",filebrowser:"info:txtUrl",label:c.lang.image.btnUpload,"for":["Upload","upload"]}]},{id:"advanced",label:c.lang.common.advancedTab,elements:[{type:"hbox",widths:["50%","25%","25%"],
+children:[{type:"text",id:"linkId",requiredContent:"img[id]",label:c.lang.common.id,setup:function(a,b){a==f&&this.setValue(b.getAttribute("id"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("id",this.getValue())}},{id:"cmbLangDir",type:"select",requiredContent:"img[dir]",style:"width : 100px;",label:c.lang.common.langDir,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.langDirLtr,"ltr"],[c.lang.common.langDirRtl,"rtl"]],setup:function(a,b){a==f&&this.setValue(b.getAttribute("dir"))},
+commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("dir",this.getValue())}},{type:"text",id:"txtLangCode",requiredContent:"img[lang]",label:c.lang.common.langCode,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("lang"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("lang",this.getValue())}}]},{type:"text",id:"txtGenLongDescr",requiredContent:"img[longdesc]",label:c.lang.common.longDescr,setup:function(a,b){a==f&&this.setValue(b.getAttribute("longDesc"))},
+commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("longDesc",this.getValue())}},{type:"hbox",widths:["50%","50%"],children:[{type:"text",id:"txtGenClass",requiredContent:"img(cke-xyz)",label:c.lang.common.cssClass,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("class"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("class",this.getValue())}},{type:"text",id:"txtGenTitle",requiredContent:"img[title]",label:c.lang.common.advisoryTitle,
+"default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("title"))},commit:function(a,b){a==f?(this.getValue()||this.isChanged())&&b.setAttribute("title",this.getValue()):4==a?b.setAttribute("title",this.getValue()):8==a&&b.removeAttribute("title")}}]},{type:"text",id:"txtdlgGenStyle",requiredContent:"img{cke-xyz}",label:c.lang.common.cssStyle,validate:CKEDITOR.dialog.validate.inlineStyle(c.lang.common.invalidInlineStyle),"default":"",setup:function(a,
+b){if(a==f){var c=b.getAttribute("style");!c&&b.$.style.cssText&&(c=b.$.style.cssText);this.setValue(c);var e=b.$.style.height,c=b.$.style.width,e=(e?e:"").match(k),c=(c?c:"").match(k);this.attributesInStyle={height:!!e,width:!!c}}},onChange:function(){i.call(this,"info:cmbFloat info:cmbAlign info:txtVSpace info:txtHSpace info:txtBorder info:txtWidth info:txtHeight".split(" "));g(this)},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("style",this.getValue())}}]}]}};
+CKEDITOR.dialog.add("image",function(c){return r(c,"image")});CKEDITOR.dialog.add("imagebutton",function(c){return r(c,"imagebutton")})})();
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/image/images/noimage.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/image/images/noimage.png
new file mode 100644
index 00000000..15981130
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/image/images/noimage.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/link/dialogs/anchor.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/link/dialogs/anchor.js
new file mode 100644
index 00000000..562417a6
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/link/dialogs/anchor.js
@@ -0,0 +1,8 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("anchor",function(c){var d=function(a){this._.selectedElement=a;this.setValueOf("info","txtName",a.data("cke-saved-name")||"")};return{title:c.lang.link.anchor.title,minWidth:300,minHeight:60,onOk:function(){var a=CKEDITOR.tools.trim(this.getValueOf("info","txtName")),a={id:a,name:a,"data-cke-saved-name":a};if(this._.selectedElement)this._.selectedElement.data("cke-realelement")?(a=c.document.createElement("a",{attributes:a}),c.createFakeElement(a,"cke_anchor","anchor").replace(this._.selectedElement)):
+this._.selectedElement.setAttributes(a);else{var b=c.getSelection(),b=b&&b.getRanges()[0];b.collapsed?(CKEDITOR.plugins.link.synAnchorSelector&&(a["class"]="cke_anchor_empty"),CKEDITOR.plugins.link.emptyAnchorFix&&(a.contenteditable="false",a["data-cke-editable"]=1),a=c.document.createElement("a",{attributes:a}),CKEDITOR.plugins.link.fakeAnchor&&(a=c.createFakeElement(a,"cke_anchor","anchor")),b.insertNode(a)):(CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(a["class"]="cke_anchor"),a=new CKEDITOR.style({element:"a",
+attributes:a}),a.type=CKEDITOR.STYLE_INLINE,c.applyStyle(a))}},onHide:function(){delete this._.selectedElement},onShow:function(){var a=c.getSelection(),b=a.getSelectedElement();if(b)CKEDITOR.plugins.link.fakeAnchor?((a=CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,b))&&d.call(this,a),this._.selectedElement=b):b.is("a")&&b.hasAttribute("name")&&d.call(this,b);else if(b=CKEDITOR.plugins.link.getSelectedLink(c))d.call(this,b),a.selectElement(b);this.getContentElement("info","txtName").focus()},contents:[{id:"info",
+label:c.lang.link.anchor.title,accessKey:"I",elements:[{type:"text",id:"txtName",label:c.lang.link.anchor.name,required:!0,validate:function(){return!this.getValue()?(alert(c.lang.link.anchor.errorName),!1):!0}}]}]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/link/dialogs/link.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/link/dialogs/link.js
new file mode 100644
index 00000000..f3c9387d
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/link/dialogs/link.js
@@ -0,0 +1,36 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("link",function(n){var p,q;function r(a){return a.replace(/'/g,"\\$&")}function t(a){var g,c=p,d,e;g=[q,"("];for(var b=0;b<c.length;b++)d=c[b].toLowerCase(),e=a[d],0<b&&g.push(","),g.push("'",e?r(encodeURIComponent(a[d])):"","'");g.push(")");return g.join("")}function u(a){for(var g,c=a.length,d=[],e=0;e<c;e++)g=a.charCodeAt(e),d.push(g);return"String.fromCharCode("+d.join(",")+")"}function v(a){return(a=a.getAttribute("class"))?a.replace(/\s*(?:cke_anchor_empty|cke_anchor)(?:\s*$)?/g,
+""):""}var w=CKEDITOR.plugins.link,s=function(){var a=this.getDialog(),g=a.getContentElement("target","popupFeatures"),a=a.getContentElement("target","linkTargetName"),c=this.getValue();if(g&&a)switch(g=g.getElement(),g.hide(),a.setValue(""),c){case "frame":a.setLabel(n.lang.link.targetFrameName);a.getElement().show();break;case "popup":g.show();a.setLabel(n.lang.link.targetPopupName);a.getElement().show();break;default:a.setValue(c),a.getElement().hide()}},x=/^javascript:/,y=/^mailto:([^?]+)(?:\?(.+))?$/,
+z=/subject=([^;?:@&=$,\/]*)/,A=/body=([^;?:@&=$,\/]*)/,B=/^#(.*)$/,C=/^((?:http|https|ftp|news):\/\/)?(.*)$/,D=/^(_(?:self|top|parent|blank))$/,E=/^javascript:void\(location\.href='mailto:'\+String\.fromCharCode\(([^)]+)\)(?:\+'(.*)')?\)$/,F=/^javascript:([^(]+)\(([^)]+)\)$/,G=/\s*window.open\(\s*this\.href\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*;\s*return\s*false;*\s*/,H=/(?:^|,)([^=]+)=(\d+|yes|no)/gi,I=function(a,g){var c=g&&(g.data("cke-saved-href")||g.getAttribute("href"))||"",d,e,b=
+{};c.match(x)&&("encode"==o?c=c.replace(E,function(a,c,b){return"mailto:"+String.fromCharCode.apply(String,c.split(","))+(b&&b.replace(/\\'/g,"'"))}):o&&c.replace(F,function(a,c,d){if(c==q){b.type="email";for(var a=b.email={},c=/(^')|('$)/g,d=d.match(/[^,\s]+/g),e=d.length,g,f,h=0;h<e;h++)g=decodeURIComponent,f=d[h].replace(c,"").replace(/\\'/g,"'"),f=g(f),g=p[h].toLowerCase(),a[g]=f;a.address=[a.name,a.domain].join("@")}}));if(!b.type)if(d=c.match(B))b.type="anchor",b.anchor={},b.anchor.name=b.anchor.id=
+d[1];else if(d=c.match(y)){e=c.match(z);c=c.match(A);b.type="email";var f=b.email={};f.address=d[1];e&&(f.subject=decodeURIComponent(e[1]));c&&(f.body=decodeURIComponent(c[1]))}else c&&(e=c.match(C))?(b.type="url",b.url={},b.url.protocol=e[1],b.url.url=e[2]):b.type="url";if(g){d=g.getAttribute("target");b.target={};b.adv={};if(d)d.match(D)?b.target.type=b.target.name=d:(b.target.type="frame",b.target.name=d);else if(d=(d=g.data("cke-pa-onclick")||g.getAttribute("onclick"))&&d.match(G)){b.target.type=
+"popup";for(b.target.name=d[1];c=H.exec(d[2]);)("yes"==c[2]||"1"==c[2])&&!(c[1]in{height:1,width:1,top:1,left:1})?b.target[c[1]]=!0:isFinite(c[2])&&(b.target[c[1]]=c[2])}d=function(a,c){var d=g.getAttribute(c);null!==d&&(b.adv[a]=d||"")};d("advId","id");d("advLangDir","dir");d("advAccessKey","accessKey");b.adv.advName=g.data("cke-saved-name")||g.getAttribute("name")||"";d("advLangCode","lang");d("advTabIndex","tabindex");d("advTitle","title");d("advContentType","type");CKEDITOR.plugins.link.synAnchorSelector?
+b.adv.advCSSClasses=v(g):d("advCSSClasses","class");d("advCharset","charset");d("advStyles","style");d("advRel","rel")}d=b.anchors=[];var h;if(CKEDITOR.plugins.link.emptyAnchorFix){f=a.document.getElementsByTag("a");c=0;for(e=f.count();c<e;c++)if(h=f.getItem(c),h.data("cke-saved-name")||h.hasAttribute("name"))d.push({name:h.data("cke-saved-name")||h.getAttribute("name"),id:h.getAttribute("id")})}else{f=new CKEDITOR.dom.nodeList(a.document.$.anchors);c=0;for(e=f.count();c<e;c++)h=f.getItem(c),d[c]=
+{name:h.getAttribute("name"),id:h.getAttribute("id")}}if(CKEDITOR.plugins.link.fakeAnchor){f=a.document.getElementsByTag("img");c=0;for(e=f.count();c<e;c++)(h=CKEDITOR.plugins.link.tryRestoreFakeAnchor(a,f.getItem(c)))&&d.push({name:h.getAttribute("name"),id:h.getAttribute("id")})}this._.selectedElement=g;return b},j=function(a){a.target&&this.setValue(a.target[this.id]||"")},k=function(a){a.adv&&this.setValue(a.adv[this.id]||"")},l=function(a){a.target||(a.target={});a.target[this.id]=this.getValue()||
+""},m=function(a){a.adv||(a.adv={});a.adv[this.id]=this.getValue()||""},o=n.config.emailProtection||"";o&&"encode"!=o&&(q=p=void 0,o.replace(/^([^(]+)\(([^)]+)\)$/,function(a,b,c){q=b;p=[];c.replace(/[^,\s]+/g,function(a){p.push(a)})}));var i=n.lang.common,b=n.lang.link;return{title:b.title,minWidth:350,minHeight:230,contents:[{id:"info",label:b.info,title:b.info,elements:[{id:"linkType",type:"select",label:b.type,"default":"url",items:[[b.toUrl,"url"],[b.toAnchor,"anchor"],[b.toEmail,"email"]],onChange:function(){var a=
+this.getDialog(),b=["urlOptions","anchorOptions","emailOptions"],c=this.getValue(),d=a.definition.getContents("upload"),d=d&&d.hidden;if(c=="url"){n.config.linkShowTargetTab&&a.showPage("target");d||a.showPage("upload")}else{a.hidePage("target");d||a.hidePage("upload")}for(d=0;d<b.length;d++){var e=a.getContentElement("info",b[d]);if(e){e=e.getElement().getParent().getParent();b[d]==c+"Options"?e.show():e.hide()}}a.layout()},setup:function(a){a.type&&this.setValue(a.type)},commit:function(a){a.type=
+this.getValue()}},{type:"vbox",id:"urlOptions",children:[{type:"hbox",widths:["25%","75%"],children:[{id:"protocol",type:"select",label:i.protocol,"default":"http://",items:[["http://‎","http://"],["https://‎","https://"],["ftp://‎","ftp://"],["news://‎","news://"],[b.other,""]],setup:function(a){a.url&&this.setValue(a.url.protocol||"")},commit:function(a){if(!a.url)a.url={};a.url.protocol=this.getValue()}},{type:"text",id:"url",label:i.url,required:!0,onLoad:function(){this.allowOnChange=true},onKeyUp:function(){this.allowOnChange=
+false;var a=this.getDialog().getContentElement("info","protocol"),b=this.getValue(),c=/^((javascript:)|[#\/\.\?])/i,d=/^(http|https|ftp|news):\/\/(?=.)/i.exec(b);if(d){this.setValue(b.substr(d[0].length));a.setValue(d[0].toLowerCase())}else c.test(b)&&a.setValue("");this.allowOnChange=true},onChange:function(){if(this.allowOnChange)this.onKeyUp()},validate:function(){var a=this.getDialog();if(a.getContentElement("info","linkType")&&a.getValueOf("info","linkType")!="url")return true;if(/javascript\:/.test(this.getValue())){alert(i.invalidValue);
+return false}return this.getDialog().fakeObj?true:CKEDITOR.dialog.validate.notEmpty(b.noUrl).apply(this)},setup:function(a){this.allowOnChange=false;a.url&&this.setValue(a.url.url);this.allowOnChange=true},commit:function(a){this.onChange();if(!a.url)a.url={};a.url.url=this.getValue();this.allowOnChange=false}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().show()}},{type:"button",id:"browse",hidden:"true",filebrowser:"info:url",label:i.browseServer}]},
+{type:"vbox",id:"anchorOptions",width:260,align:"center",padding:0,children:[{type:"fieldset",id:"selectAnchorText",label:b.selectAnchor,setup:function(a){a.anchors.length>0?this.getElement().show():this.getElement().hide()},children:[{type:"hbox",id:"selectAnchor",children:[{type:"select",id:"anchorName","default":"",label:b.anchorName,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");for(var b=0;b<a.anchors.length;b++)a.anchors[b].name&&this.add(a.anchors[b].name);a.anchor&&
+this.setValue(a.anchor.name);(a=this.getDialog().getContentElement("info","linkType"))&&a.getValue()=="email"&&this.focus()},commit:function(a){if(!a.anchor)a.anchor={};a.anchor.name=this.getValue()}},{type:"select",id:"anchorId","default":"",label:b.anchorId,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");for(var b=0;b<a.anchors.length;b++)a.anchors[b].id&&this.add(a.anchors[b].id);a.anchor&&this.setValue(a.anchor.id)},commit:function(a){if(!a.anchor)a.anchor={};a.anchor.id=
+this.getValue()}}],setup:function(a){a.anchors.length>0?this.getElement().show():this.getElement().hide()}}]},{type:"html",id:"noAnchors",style:"text-align: center;",html:'<div role="note" tabIndex="-1">'+CKEDITOR.tools.htmlEncode(b.noAnchors)+"</div>",focus:!0,setup:function(a){a.anchors.length<1?this.getElement().show():this.getElement().hide()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}},{type:"vbox",id:"emailOptions",padding:1,children:[{type:"text",
+id:"emailAddress",label:b.emailAddress,required:!0,validate:function(){var a=this.getDialog();return!a.getContentElement("info","linkType")||a.getValueOf("info","linkType")!="email"?true:CKEDITOR.dialog.validate.notEmpty(b.noEmail).apply(this)},setup:function(a){a.email&&this.setValue(a.email.address);(a=this.getDialog().getContentElement("info","linkType"))&&a.getValue()=="email"&&this.select()},commit:function(a){if(!a.email)a.email={};a.email.address=this.getValue()}},{type:"text",id:"emailSubject",
+label:b.emailSubject,setup:function(a){a.email&&this.setValue(a.email.subject)},commit:function(a){if(!a.email)a.email={};a.email.subject=this.getValue()}},{type:"textarea",id:"emailBody",label:b.emailBody,rows:3,"default":"",setup:function(a){a.email&&this.setValue(a.email.body)},commit:function(a){if(!a.email)a.email={};a.email.body=this.getValue()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}}]},{id:"target",requiredContent:"a[target]",label:b.target,
+title:b.target,elements:[{type:"hbox",widths:["50%","50%"],children:[{type:"select",id:"linkTargetType",label:i.target,"default":"notSet",style:"width : 100%;",items:[[i.notSet,"notSet"],[b.targetFrame,"frame"],[b.targetPopup,"popup"],[i.targetNew,"_blank"],[i.targetTop,"_top"],[i.targetSelf,"_self"],[i.targetParent,"_parent"]],onChange:s,setup:function(a){a.target&&this.setValue(a.target.type||"notSet");s.call(this)},commit:function(a){if(!a.target)a.target={};a.target.type=this.getValue()}},{type:"text",
+id:"linkTargetName",label:b.targetFrameName,"default":"",setup:function(a){a.target&&this.setValue(a.target.name)},commit:function(a){if(!a.target)a.target={};a.target.name=this.getValue().replace(/\W/gi,"")}}]},{type:"vbox",width:"100%",align:"center",padding:2,id:"popupFeatures",children:[{type:"fieldset",label:b.popupFeatures,children:[{type:"hbox",children:[{type:"checkbox",id:"resizable",label:b.popupResizable,setup:j,commit:l},{type:"checkbox",id:"status",label:b.popupStatusBar,setup:j,commit:l}]},
+{type:"hbox",children:[{type:"checkbox",id:"location",label:b.popupLocationBar,setup:j,commit:l},{type:"checkbox",id:"toolbar",label:b.popupToolbar,setup:j,commit:l}]},{type:"hbox",children:[{type:"checkbox",id:"menubar",label:b.popupMenuBar,setup:j,commit:l},{type:"checkbox",id:"fullscreen",label:b.popupFullScreen,setup:j,commit:l}]},{type:"hbox",children:[{type:"checkbox",id:"scrollbars",label:b.popupScrollBars,setup:j,commit:l},{type:"checkbox",id:"dependent",label:b.popupDependent,setup:j,commit:l}]},
+{type:"hbox",children:[{type:"text",widths:["50%","50%"],labelLayout:"horizontal",label:i.width,id:"width",setup:j,commit:l},{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:b.popupLeft,id:"left",setup:j,commit:l}]},{type:"hbox",children:[{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:i.height,id:"height",setup:j,commit:l},{type:"text",labelLayout:"horizontal",label:b.popupTop,widths:["50%","50%"],id:"top",setup:j,commit:l}]}]}]}]},{id:"upload",label:b.upload,title:b.upload,
+hidden:!0,filebrowser:"uploadButton",elements:[{type:"file",id:"upload",label:i.upload,style:"height:40px",size:29},{type:"fileButton",id:"uploadButton",label:i.uploadSubmit,filebrowser:"info:url","for":["upload","upload"]}]},{id:"advanced",label:b.advanced,title:b.advanced,elements:[{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",id:"advId",requiredContent:"a[id]",label:b.id,setup:k,commit:m},{type:"select",id:"advLangDir",requiredContent:"a[dir]",
+label:b.langDir,"default":"",style:"width:110px",items:[[i.notSet,""],[b.langDirLTR,"ltr"],[b.langDirRTL,"rtl"]],setup:k,commit:m},{type:"text",id:"advAccessKey",requiredContent:"a[accesskey]",width:"80px",label:b.acccessKey,maxLength:1,setup:k,commit:m}]},{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",label:b.name,id:"advName",requiredContent:"a[name]",setup:k,commit:m},{type:"text",label:b.langCode,id:"advLangCode",requiredContent:"a[lang]",width:"110px","default":"",setup:k,commit:m},
+{type:"text",label:b.tabIndex,id:"advTabIndex",requiredContent:"a[tabindex]",width:"80px",maxLength:5,setup:k,commit:m}]}]},{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.advisoryTitle,requiredContent:"a[title]","default":"",id:"advTitle",setup:k,commit:m},{type:"text",label:b.advisoryContentType,requiredContent:"a[type]","default":"",id:"advContentType",setup:k,commit:m}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.cssClasses,
+requiredContent:"a(cke-xyz)","default":"",id:"advCSSClasses",setup:k,commit:m},{type:"text",label:b.charset,requiredContent:"a[charset]","default":"",id:"advCharset",setup:k,commit:m}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.rel,requiredContent:"a[rel]","default":"",id:"advRel",setup:k,commit:m},{type:"text",label:b.styles,requiredContent:"a{cke-xyz}","default":"",id:"advStyles",validate:CKEDITOR.dialog.validate.inlineStyle(n.lang.common.invalidInlineStyle),setup:k,commit:m}]}]}]}],
+onShow:function(){var a=this.getParentEditor(),b=a.getSelection(),c=null;(c=w.getSelectedLink(a))&&c.hasAttribute("href")?b.selectElement(c):c=null;this.setupContent(I.apply(this,[a,c]))},onOk:function(){var a={},b=[],c={},d=this.getParentEditor();this.commitContent(c);switch(c.type||"url"){case "url":var e=c.url&&c.url.protocol!=void 0?c.url.protocol:"http://",i=c.url&&CKEDITOR.tools.trim(c.url.url)||"";a["data-cke-saved-href"]=i.indexOf("/")===0?i:e+i;break;case "anchor":e=c.anchor&&c.anchor.id;
+a["data-cke-saved-href"]="#"+(c.anchor&&c.anchor.name||e||"");break;case "email":var f=c.email,e=f.address;switch(o){case "":case "encode":var i=encodeURIComponent(f.subject||""),h=encodeURIComponent(f.body||""),f=[];i&&f.push("subject="+i);h&&f.push("body="+h);f=f.length?"?"+f.join("&"):"";if(o=="encode"){e=["javascript:void(location.href='mailto:'+",u(e)];f&&e.push("+'",r(f),"'");e.push(")")}else e=["mailto:",e,f];break;default:e=e.split("@",2);f.name=e[0];f.domain=e[1];e=["javascript:",t(f)]}a["data-cke-saved-href"]=
+e.join("")}if(c.target)if(c.target.type=="popup"){for(var e=["window.open(this.href, '",c.target.name||"","', '"],j=["resizable","status","location","toolbar","menubar","fullscreen","scrollbars","dependent"],i=j.length,f=function(a){c.target[a]&&j.push(a+"="+c.target[a])},h=0;h<i;h++)j[h]=j[h]+(c.target[j[h]]?"=yes":"=no");f("width");f("left");f("height");f("top");e.push(j.join(","),"'); return false;");a["data-cke-pa-onclick"]=e.join("");b.push("target")}else{c.target.type!="notSet"&&c.target.name?
+a.target=c.target.name:b.push("target");b.push("data-cke-pa-onclick","onclick")}if(c.adv){e=function(d,e){var f=c.adv[d];f?a[e]=f:b.push(e)};e("advId","id");e("advLangDir","dir");e("advAccessKey","accessKey");c.adv.advName?a.name=a["data-cke-saved-name"]=c.adv.advName:b=b.concat(["data-cke-saved-name","name"]);e("advLangCode","lang");e("advTabIndex","tabindex");e("advTitle","title");e("advContentType","type");e("advCSSClasses","class");e("advCharset","charset");e("advStyles","style");e("advRel","rel")}e=
+d.getSelection();a.href=a["data-cke-saved-href"];if(this._.selectedElement){d=this._.selectedElement;i=d.data("cke-saved-href");f=d.getHtml();d.setAttributes(a);d.removeAttributes(b);c.adv&&(c.adv.advName&&CKEDITOR.plugins.link.synAnchorSelector)&&d.addClass(d.getChildCount()?"cke_anchor":"cke_anchor_empty");if(i==f||c.type=="email"&&f.indexOf("@")!=-1)d.setHtml(c.type=="email"?c.email.address:a["data-cke-saved-href"]);e.selectElement(d);delete this._.selectedElement}else{e=e.getRanges(1)[0];if(e.collapsed){d=
+new CKEDITOR.dom.text(c.type=="email"?c.email.address:a["data-cke-saved-href"],d.document);e.insertNode(d);e.selectNodeContents(d)}d=new CKEDITOR.style({element:"a",attributes:a});d.type=CKEDITOR.STYLE_INLINE;d.applyToRange(e);e.select()}},onLoad:function(){n.config.linkShowAdvancedTab||this.hidePage("advanced");n.config.linkShowTargetTab||this.hidePage("target")},onFocus:function(){var a=this.getContentElement("info","linkType");if(a&&a.getValue()=="url"){a=this.getContentElement("info","url");a.select()}}}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/link/images/anchor.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/link/images/anchor.png
new file mode 100644
index 00000000..c946ba54
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/link/images/anchor.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/link/images/hidpi/anchor.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/link/images/hidpi/anchor.png
new file mode 100644
index 00000000..908b9fa3
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/link/images/hidpi/anchor.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/liststyle/dialogs/liststyle.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/liststyle/dialogs/liststyle.js
new file mode 100644
index 00000000..6dba713d
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/liststyle/dialogs/liststyle.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(){function d(c,d){var b;try{b=c.getSelection().getRanges()[0]}catch(f){return null}b.shrink(CKEDITOR.SHRINK_TEXT);return c.elementPath(b.getCommonAncestor()).contains(d,1)}function e(c,e){var b=c.lang.liststyle;if("bulletedListStyle"==e)return{title:b.bulletedTitle,minWidth:300,minHeight:50,contents:[{id:"info",accessKey:"I",elements:[{type:"select",label:b.type,id:"type",align:"center",style:"width:150px",items:[[b.notset,""],[b.circle,"circle"],[b.disc,"disc"],[b.square,"square"]],setup:function(a){this.setValue(a.getStyle("list-style-type")||
+h[a.getAttribute("type")]||a.getAttribute("type")||"")},commit:function(a){var b=this.getValue();b?a.setStyle("list-style-type",b):a.removeStyle("list-style-type")}}]}],onShow:function(){var a=this.getParentEditor();(a=d(a,"ul"))&&this.setupContent(a)},onOk:function(){var a=this.getParentEditor();(a=d(a,"ul"))&&this.commitContent(a)}};if("numberedListStyle"==e){var g=[[b.notset,""],[b.lowerRoman,"lower-roman"],[b.upperRoman,"upper-roman"],[b.lowerAlpha,"lower-alpha"],[b.upperAlpha,"upper-alpha"],
+[b.decimal,"decimal"]];(!CKEDITOR.env.ie||7<CKEDITOR.env.version)&&g.concat([[b.armenian,"armenian"],[b.decimalLeadingZero,"decimal-leading-zero"],[b.georgian,"georgian"],[b.lowerGreek,"lower-greek"]]);return{title:b.numberedTitle,minWidth:300,minHeight:50,contents:[{id:"info",accessKey:"I",elements:[{type:"hbox",widths:["25%","75%"],children:[{label:b.start,type:"text",id:"start",validate:CKEDITOR.dialog.validate.integer(b.validateStartNumber),setup:function(a){this.setValue(a.getFirst(f).getAttribute("value")||
+a.getAttribute("start")||1)},commit:function(a){var b=a.getFirst(f),c=b.getAttribute("value")||a.getAttribute("start")||1;a.getFirst(f).removeAttribute("value");var d=parseInt(this.getValue(),10);isNaN(d)?a.removeAttribute("start"):a.setAttribute("start",d);a=b;b=c;for(d=isNaN(d)?1:d;(a=a.getNext(f))&&b++;)a.getAttribute("value")==b&&a.setAttribute("value",d+b-c)}},{type:"select",label:b.type,id:"type",style:"width: 100%;",items:g,setup:function(a){this.setValue(a.getStyle("list-style-type")||h[a.getAttribute("type")]||
+a.getAttribute("type")||"")},commit:function(a){var b=this.getValue();b?a.setStyle("list-style-type",b):a.removeStyle("list-style-type")}}]}]}],onShow:function(){var a=this.getParentEditor();(a=d(a,"ol"))&&this.setupContent(a)},onOk:function(){var a=this.getParentEditor();(a=d(a,"ol"))&&this.commitContent(a)}}}}var f=function(c){return c.type==CKEDITOR.NODE_ELEMENT&&c.is("li")},h={a:"lower-alpha",A:"upper-alpha",i:"lower-roman",I:"upper-roman",1:"decimal",disc:"disc",circle:"circle",square:"square"};
+CKEDITOR.dialog.add("numberedListStyle",function(c){return e(c,"numberedListStyle")});CKEDITOR.dialog.add("bulletedListStyle",function(c){return e(c,"bulletedListStyle")})})();
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/magicline/images/hidpi/icon.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/magicline/images/hidpi/icon.png
new file mode 100644
index 00000000..73a5f437
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/magicline/images/hidpi/icon.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/magicline/images/icon.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/magicline/images/icon.png
new file mode 100644
index 00000000..b5de5ba9
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/magicline/images/icon.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/pagebreak/images/pagebreak.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/pagebreak/images/pagebreak.gif
new file mode 100644
index 00000000..8d1cffd6
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/pagebreak/images/pagebreak.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/pastefromword/filter/default.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/pastefromword/filter/default.js
new file mode 100644
index 00000000..cc7a2e93
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/pastefromword/filter/default.js
@@ -0,0 +1,31 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(){function y(a){for(var a=a.toUpperCase(),c=z.length,b=0,f=0;f<c;++f)for(var d=z[f],e=d[1].length;a.substr(0,e)==d[1];a=a.substr(e))b+=d[0];return b}function A(a){for(var a=a.toUpperCase(),c=B.length,b=1,f=1;0<a.length;f*=c)b+=B.indexOf(a.charAt(a.length-1))*f,a=a.substr(0,a.length-1);return b}var C=CKEDITOR.htmlParser.fragment.prototype,o=CKEDITOR.htmlParser.element.prototype;C.onlyChild=o.onlyChild=function(){var a=this.children;return 1==a.length&&a[0]||null};o.removeAnyChildWithName=
+function(a){for(var c=this.children,b=[],f,d=0;d<c.length;d++)f=c[d],f.name&&(f.name==a&&(b.push(f),c.splice(d--,1)),b=b.concat(f.removeAnyChildWithName(a)));return b};o.getAncestor=function(a){for(var c=this.parent;c&&(!c.name||!c.name.match(a));)c=c.parent;return c};C.firstChild=o.firstChild=function(a){for(var c,b=0;b<this.children.length;b++)if(c=this.children[b],a(c)||c.name&&(c=c.firstChild(a)))return c;return null};o.addStyle=function(a,c,b){var f="";if("string"==typeof c)f+=a+":"+c+";";else{if("object"==
+typeof a)for(var d in a)a.hasOwnProperty(d)&&(f+=d+":"+a[d]+";");else f+=a;b=c}this.attributes||(this.attributes={});a=this.attributes.style||"";a=(b?[f,a]:[a,f]).join(";");this.attributes.style=a.replace(/^;|;(?=;)/,"")};o.getStyle=function(a){var c=this.attributes.style;if(c)return c=CKEDITOR.tools.parseCssText(c,1),c[a]};CKEDITOR.dtd.parentOf=function(a){var c={},b;for(b in this)-1==b.indexOf("$")&&this[b][a]&&(c[b]=1);return c};var H=/^([.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz){1}?/i,
+D=/^(?:\b0[^\s]*\s*){1,4}$/,x={ol:{decimal:/\d+/,"lower-roman":/^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$/,"upper-roman":/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/,"lower-alpha":/^[a-z]+$/,"upper-alpha":/^[A-Z]+$/},ul:{disc:/[l\u00B7\u2002]/,circle:/[\u006F\u00D8]/,square:/[\u006E\u25C6]/}},z=[[1E3,"M"],[900,"CM"],[500,"D"],[400,"CD"],[100,"C"],[90,"XC"],[50,"L"],[40,"XL"],[10,"X"],[9,"IX"],[5,"V"],[4,"IV"],[1,"I"]],B="ABCDEFGHIJKLMNOPQRSTUVWXYZ",s=0,t=null,w,E=CKEDITOR.plugins.pastefromword=
+{utils:{createListBulletMarker:function(a,c){var b=new CKEDITOR.htmlParser.element("cke:listbullet");b.attributes={"cke:listsymbol":a[0]};b.add(new CKEDITOR.htmlParser.text(c));return b},isListBulletIndicator:function(a){if(/mso-list\s*:\s*Ignore/i.test(a.attributes&&a.attributes.style))return!0},isContainingOnlySpaces:function(a){var c;return(c=a.onlyChild())&&/^(:?\s|&nbsp;)+$/.test(c.value)},resolveList:function(a){var c=a.attributes,b;if((b=a.removeAnyChildWithName("cke:listbullet"))&&b.length&&
+(b=b[0]))return a.name="cke:li",c.style&&(c.style=E.filters.stylesFilter([["text-indent"],["line-height"],[/^margin(:?-left)?$/,null,function(a){a=a.split(" ");a=CKEDITOR.tools.convertToPx(a[3]||a[1]||a[0]);!s&&(null!==t&&a>t)&&(s=a-t);t=a;c["cke:indent"]=s&&Math.ceil(a/s)+1||1}],[/^mso-list$/,null,function(a){var a=a.split(" "),b=Number(a[0].match(/\d+/)),a=Number(a[1].match(/\d+/));1==a&&(b!==w&&(c["cke:reset"]=1),w=b);c["cke:indent"]=a}]])(c.style,a)||""),c["cke:indent"]||(t=0,c["cke:indent"]=
+1),CKEDITOR.tools.extend(c,b.attributes),!0;w=t=s=null;return!1},getStyleComponents:function(){var a=CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;"></div>',CKEDITOR.document);CKEDITOR.document.getBody().append(a);return function(c,b,f){a.setStyle(c,b);for(var c={},b=f.length,d=0;d<b;d++)c[f[d]]=a.getStyle(f[d]);return c}}(),listDtdParents:CKEDITOR.dtd.parentOf("ol")},filters:{flattenList:function(a,c){var c="number"==typeof c?c:1,b=a.attributes,f;switch(b.type){case "a":f=
+"lower-alpha";break;case "1":f="decimal"}for(var d=a.children,e,h=0;h<d.length;h++)if(e=d[h],e.name in CKEDITOR.dtd.$listItem){var j=e.attributes,g=e.children,m=g[g.length-1];m.name in CKEDITOR.dtd.$list&&(a.add(m,h+1),--g.length||d.splice(h--,1));e.name="cke:li";b.start&&!h&&(j.value=b.start);E.filters.stylesFilter([["tab-stops",null,function(a){(a=a.split(" ")[1].match(H))&&(t=CKEDITOR.tools.convertToPx(a[0]))}],1==c?["mso-list",null,function(a){a=a.split(" ");a=Number(a[0].match(/\d+/));a!==w&&
+(j["cke:reset"]=1);w=a}]:null])(j.style);j["cke:indent"]=c;j["cke:listtype"]=a.name;j["cke:list-style-type"]=f}else if(e.name in CKEDITOR.dtd.$list){arguments.callee.apply(this,[e,c+1]);d=d.slice(0,h).concat(e.children).concat(d.slice(h+1));a.children=[];e=0;for(g=d.length;e<g;e++)a.add(d[e]);d=a.children}delete a.name;b["cke:list"]=1},assembleList:function(a){for(var c=a.children,b,f,d,e,h,j,a=[],g,m,i,l,k,p,n=0;n<c.length;n++)if(b=c[n],"cke:li"==b.name)if(b.name="li",f=b.attributes,i=(i=f["cke:listsymbol"])&&
+i.match(/^(?:[(]?)([^\s]+?)([.)]?)$/),l=k=p=null,f["cke:ignored"])c.splice(n--,1);else{f["cke:reset"]&&(j=e=h=null);d=Number(f["cke:indent"]);d!=e&&(m=g=null);if(i){if(m&&x[m][g].test(i[1]))l=m,k=g;else for(var q in x)for(var u in x[q])if(x[q][u].test(i[1]))if("ol"==q&&/alpha|roman/.test(u)){if(g=/roman/.test(u)?y(i[1]):A(i[1]),!p||g<p)p=g,l=q,k=u}else{l=q;k=u;break}!l&&(l=i[2]?"ol":"ul")}else l=f["cke:listtype"]||"ol",k=f["cke:list-style-type"];m=l;g=k||("ol"==l?"decimal":"disc");k&&k!=("ol"==l?
+"decimal":"disc")&&b.addStyle("list-style-type",k);if("ol"==l&&i){switch(k){case "decimal":p=Number(i[1]);break;case "lower-roman":case "upper-roman":p=y(i[1]);break;case "lower-alpha":case "upper-alpha":p=A(i[1])}b.attributes.value=p}if(j){if(d>e)a.push(j=new CKEDITOR.htmlParser.element(l)),j.add(b),h.add(j);else{if(d<e){e-=d;for(var r;e--&&(r=j.parent);)j=r.parent}j.add(b)}c.splice(n--,1)}else a.push(j=new CKEDITOR.htmlParser.element(l)),j.add(b),c[n]=j;h=b;e=d}else j&&(j=e=h=null);for(n=0;n<a.length;n++)if(j=
+a[n],q=j.children,g=g=void 0,u=j.children.length,r=g=void 0,c=/list-style-type:(.*?)(?:;|$)/,e=CKEDITOR.plugins.pastefromword.filters.stylesFilter,g=j.attributes,!c.exec(g.style)){for(h=0;h<u;h++)if(g=q[h],g.attributes.value&&Number(g.attributes.value)==h+1&&delete g.attributes.value,g=c.exec(g.attributes.style))if(g[1]==r||!r)r=g[1];else{r=null;break}if(r){for(h=0;h<u;h++)g=q[h].attributes,g.style&&(g.style=e([["list-style-type"]])(g.style)||"");j.addStyle("list-style-type",r)}}w=t=s=null},falsyFilter:function(){return!1},
+stylesFilter:function(a,c){return function(b,f){var d=[];(b||"").replace(/&quot;/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(b,e,g){e=e.toLowerCase();"font-family"==e&&(g=g.replace(/["']/g,""));for(var m,i,l,k=0;k<a.length;k++)if(a[k]&&(b=a[k][0],m=a[k][1],i=a[k][2],l=a[k][3],e.match(b)&&(!m||g.match(m)))){e=l||e;c&&(i=i||g);"function"==typeof i&&(i=i(g,f,e));i&&i.push&&(e=i[0],i=i[1]);"string"==typeof i&&d.push([e,i]);return}!c&&d.push([e,g])});for(var e=0;e<d.length;e++)d[e]=
+d[e].join(":");return d.length?d.join(";")+";":!1}},elementMigrateFilter:function(a,c){return a?function(b){var f=c?(new CKEDITOR.style(a,c))._.definition:a;b.name=f.element;CKEDITOR.tools.extend(b.attributes,CKEDITOR.tools.clone(f.attributes));b.addStyle(CKEDITOR.style.getStyleText(f))}:function(){}},styleMigrateFilter:function(a,c){var b=this.elementMigrateFilter;return a?function(f,d){var e=new CKEDITOR.htmlParser.element(null),h={};h[c]=f;b(a,h)(e);e.children=d.children;d.children=[e];e.filter=
+function(){};e.parent=d}:function(){}},bogusAttrFilter:function(a,c){if(-1==c.name.indexOf("cke:"))return!1},applyStyleFilter:null},getRules:function(a,c){var b=CKEDITOR.dtd,f=CKEDITOR.tools.extend({},b.$block,b.$listItem,b.$tableContent),d=a.config,e=this.filters,h=e.falsyFilter,j=e.stylesFilter,g=e.elementMigrateFilter,m=CKEDITOR.tools.bind(this.filters.styleMigrateFilter,this.filters),i=this.utils.createListBulletMarker,l=e.flattenList,k=e.assembleList,p=this.utils.isListBulletIndicator,n=this.utils.isContainingOnlySpaces,
+q=this.utils.resolveList,u=function(a){a=CKEDITOR.tools.convertToPx(a);return isNaN(a)?a:a+"px"},r=this.utils.getStyleComponents,t=this.utils.listDtdParents,o=!1!==d.pasteFromWordRemoveFontStyles,s=!1!==d.pasteFromWordRemoveStyles;return{elementNames:[[/meta|link|script/,""]],root:function(a){a.filterChildren(c);k(a)},elements:{"^":function(a){var c;CKEDITOR.env.gecko&&(c=e.applyStyleFilter)&&c(a)},$:function(a){var v=a.name||"",e=a.attributes;v in f&&e.style&&(e.style=j([[/^(:?width|height)$/,null,
+u]])(e.style)||"");if(v.match(/h\d/)){a.filterChildren(c);if(q(a))return;g(d["format_"+v])(a)}else if(v in b.$inline)a.filterChildren(c),n(a)&&delete a.name;else if(-1!=v.indexOf(":")&&-1==v.indexOf("cke")){a.filterChildren(c);if("v:imagedata"==v){if(v=a.attributes["o:href"])a.attributes.src=v;a.name="img";return}delete a.name}v in t&&(a.filterChildren(c),k(a))},style:function(a){if(CKEDITOR.env.gecko){var a=(a=a.onlyChild().value.match(/\/\* Style Definitions \*\/([\s\S]*?)\/\*/))&&a[1],c={};a&&
+(a.replace(/[\n\r]/g,"").replace(/(.+?)\{(.+?)\}/g,function(a,b,F){for(var b=b.split(","),a=b.length,d=0;d<a;d++)CKEDITOR.tools.trim(b[d]).replace(/^(\w+)(\.[\w-]+)?$/g,function(a,b,d){b=b||"*";d=d.substring(1,d.length);d.match(/MsoNormal/)||(c[b]||(c[b]={}),d?c[b][d]=F:c[b]=F)})}),e.applyStyleFilter=function(a){var b=c["*"]?"*":a.name,d=a.attributes&&a.attributes["class"];b in c&&(b=c[b],"object"==typeof b&&(b=b[d]),b&&a.addStyle(b,!0))})}return!1},p:function(a){if(/MsoListParagraph/i.exec(a.attributes["class"])||
+a.getStyle("mso-list")){var b=a.firstChild(function(a){return a.type==CKEDITOR.NODE_TEXT&&!n(a.parent)});(b=b&&b.parent)&&b.addStyle("mso-list","Ignore")}a.filterChildren(c);q(a)||(d.enterMode==CKEDITOR.ENTER_BR?(delete a.name,a.add(new CKEDITOR.htmlParser.element("br"))):g(d["format_"+(d.enterMode==CKEDITOR.ENTER_P?"p":"div")])(a))},div:function(a){var c=a.onlyChild();if(c&&"table"==c.name){var b=a.attributes;c.attributes=CKEDITOR.tools.extend(c.attributes,b);b.style&&c.addStyle(b.style);c=new CKEDITOR.htmlParser.element("div");
+c.addStyle("clear","both");a.add(c);delete a.name}},td:function(a){a.getAncestor("thead")&&(a.name="th")},ol:l,ul:l,dl:l,font:function(a){if(p(a.parent))delete a.name;else{a.filterChildren(c);var b=a.attributes,d=b.style,e=a.parent;"font"==e.name?(CKEDITOR.tools.extend(e.attributes,a.attributes),d&&e.addStyle(d),delete a.name):(d=d||"",b.color&&("#000000"!=b.color&&(d+="color:"+b.color+";"),delete b.color),b.face&&(d+="font-family:"+b.face+";",delete b.face),b.size&&(d+="font-size:"+(3<b.size?"large":
+3>b.size?"small":"medium")+";",delete b.size),a.name="span",a.addStyle(d))}},span:function(a){if(p(a.parent))return!1;a.filterChildren(c);if(n(a))return delete a.name,null;if(p(a)){var b=a.firstChild(function(a){return a.value||"img"==a.name}),e=(b=b&&(b.value||"l."))&&b.match(/^(?:[(]?)([^\s]+?)([.)]?)$/);if(e)return b=i(e,b),(a=a.getAncestor("span"))&&/ mso-hide:\s*all|display:\s*none /.test(a.attributes.style)&&(b.attributes["cke:ignored"]=1),b}if(e=(b=a.attributes)&&b.style)b.style=j([["line-height"],
+[/^font-family$/,null,!o?m(d.font_style,"family"):null],[/^font-size$/,null,!o?m(d.fontSize_style,"size"):null],[/^color$/,null,!o?m(d.colorButton_foreStyle,"color"):null],[/^background-color$/,null,!o?m(d.colorButton_backStyle,"color"):null]])(e,a)||"";b.style||delete b.style;CKEDITOR.tools.isEmpty(b)&&delete a.name;return null},b:g(d.coreStyles_bold),i:g(d.coreStyles_italic),u:g(d.coreStyles_underline),s:g(d.coreStyles_strike),sup:g(d.coreStyles_superscript),sub:g(d.coreStyles_subscript),a:function(a){a=
+a.attributes;a.href&&a.href.match(/^file:\/\/\/[\S]+#/i)&&(a.href=a.href.replace(/^file:\/\/\/[^#]+/i,""))},"cke:listbullet":function(a){a.getAncestor(/h\d/)&&!d.pasteFromWordNumberedHeadingToList&&delete a.name}},attributeNames:[[/^onmouse(:?out|over)/,""],[/^onload$/,""],[/(?:v|o):\w+/,""],[/^lang/,""]],attributes:{style:j(s?[[/^list-style-type$/,null],[/^margin$|^margin-(?!bottom|top)/,null,function(a,b,c){if(b.name in{p:1,div:1}){b="ltr"==d.contentsLangDirection?"margin-left":"margin-right";if("margin"==
+c)a=r(c,a,[b])[b];else if(c!=b)return null;if(a&&!D.test(a))return[b,a]}return null}],[/^clear$/],[/^border.*|margin.*|vertical-align|float$/,null,function(a,b){if("img"==b.name)return a}],[/^width|height$/,null,function(a,b){if(b.name in{table:1,td:1,th:1,img:1})return a}]]:[[/^mso-/],[/-color$/,null,function(a){if("transparent"==a)return!1;if(CKEDITOR.env.gecko)return a.replace(/-moz-use-text-color/g,"transparent")}],[/^margin$/,D],["text-indent","0cm"],["page-break-before"],["tab-stops"],["display",
+"none"],o?[/font-?/]:null],s),width:function(a,c){if(c.name in b.$tableContent)return!1},border:function(a,c){if(c.name in b.$tableContent)return!1},"class":h,bgcolor:h,valign:s?h:function(a,b){b.addStyle("vertical-align",a);return!1}},comment:!CKEDITOR.env.ie?function(a,b){var c=a.match(/<img.*?>/),d=a.match(/^\[if !supportLists\]([\s\S]*?)\[endif\]$/);return d?(d=(c=d[1]||c&&"l.")&&c.match(/>(?:[(]?)([^\s]+?)([.)]?)</),i(d,c)):CKEDITOR.env.gecko&&c?(c=CKEDITOR.htmlParser.fragment.fromHtml(c[0]).children[0],
+(d=(d=(d=b.previous)&&d.value.match(/<v:imagedata[^>]*o:href=['"](.*?)['"]/))&&d[1])&&(c.attributes.src=d),c):!1}:h}}},G=function(){this.dataFilter=new CKEDITOR.htmlParser.filter};G.prototype={toHtml:function(a){var a=CKEDITOR.htmlParser.fragment.fromHtml(a),c=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(c,this.dataFilter);return c.getHtml(!0)}};CKEDITOR.cleanWord=function(a,c){CKEDITOR.env.gecko&&(a=a.replace(/(<\!--\[if[^<]*?\])--\>([\S\s]*?)<\!--(\[endif\]--\>)/gi,"$1$2$3"));CKEDITOR.env.webkit&&
+(a=a.replace(/(class="MsoListParagraph[^>]+><\!--\[if !supportLists\]--\>)([^<]+<span[^<]+<\/span>)(<\!--\[endif\]--\>)/gi,"$1<span>$2</span>$3"));var b=new G,f=b.dataFilter;f.addRules(CKEDITOR.plugins.pastefromword.getRules(c,f));c.fire("beforeCleanWord",{filter:f});try{a=b.toHtml(a)}catch(d){alert(c.lang.pastefromword.error)}a=a.replace(/cke:.*?".*?"/g,"");a=a.replace(/style=""/g,"");return a=a.replace(/<span>/g,"")}})();
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/preview/preview.html b/htmltest/sites/all/libraries/ckeditor-version/plugins/preview/preview.html
new file mode 100644
index 00000000..d6c4937c
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/preview/preview.html
@@ -0,0 +1,10 @@
+<script>
+
+var doc = document;
+doc.open();
+doc.write( window.opener._cke_htmlToLoad );
+doc.close();
+
+delete window.opener._cke_htmlToLoad;
+
+</script>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/scayt/LICENSE.md b/htmltest/sites/all/libraries/ckeditor-version/plugins/scayt/LICENSE.md
new file mode 100644
index 00000000..844ab4de
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/scayt/LICENSE.md
@@ -0,0 +1,28 @@
+Software License Agreement
+==========================
+
+**CKEditor SCAYT Plugin**
+Copyright &copy; 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved.
+
+Licensed under the terms of any of the following licenses at your choice:
+
+*   GNU General Public License Version 2 or later (the "GPL"):
+    http://www.gnu.org/licenses/gpl.html
+
+*   GNU Lesser General Public License Version 2.1 or later (the "LGPL"):
+    http://www.gnu.org/licenses/lgpl.html
+
+*   Mozilla Public License Version 1.1 or later (the "MPL"):
+    http://www.mozilla.org/MPL/MPL-1.1.html
+
+You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice.
+
+Sources of Intellectual Property Included in this plugin
+--------------------------------------------------------
+
+Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission.
+
+Trademarks
+----------
+
+CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders.
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/scayt/README.md b/htmltest/sites/all/libraries/ckeditor-version/plugins/scayt/README.md
new file mode 100644
index 00000000..0f519589
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/scayt/README.md
@@ -0,0 +1,25 @@
+CKEditor SCAYT Plugin
+=====================
+
+This plugin brings Spell Check As You Type (SCAYT) into CKEditor.
+
+SCAYT is a "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution.
+
+Installation
+------------
+
+1. Clone/copy this repository contents in a new "plugins/scayt" folder in your CKEditor installation.
+2. Enable the "scayt" plugin in the CKEditor configuration file (config.js):
+
+        config.extraPlugins = 'scayt';
+
+That's all. SCAYT will appear on the editor toolbar and will be ready to use.
+
+License
+-------
+
+Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
+
+See LICENSE.md for more information.
+
+Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/).
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/scayt/dialogs/options.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/scayt/dialogs/options.js
new file mode 100644
index 00000000..82bf80b0
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/scayt/dialogs/options.js
@@ -0,0 +1,20 @@
+﻿/*
+ Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("scaytcheck",function(j){function w(){return"undefined"!=typeof document.forms["optionsbar_"+a]?document.forms["optionsbar_"+a].options:[]}function x(b,a){if(b){var e=b.length;if(void 0==e)b.checked=b.value==a.toString();else for(var d=0;d<e;d++)b[d].checked=!1,b[d].value==a.toString()&&(b[d].checked=!0)}}function n(b){f.getById("dic_message_"+a).setHtml('<span style="color:red;">'+b+"</span>")}function o(b){f.getById("dic_message_"+a).setHtml('<span style="color:blue;">'+b+"</span>")}
+function p(b){for(var b=(""+b).split(","),a=0,e=b.length;a<e;a+=1)f.getById(b[a]).$.style.display="inline"}function q(b){for(var b=(""+b).split(","),a=0,e=b.length;a<e;a+=1)f.getById(b[a]).$.style.display="none"}function r(b){f.getById("dic_name_"+a).$.value=b}var s=!0,h,f=CKEDITOR.document,a=j.name,l=CKEDITOR.plugins.scayt.getUiTabs(j),g,t=[],u=0,m=["dic_create_"+a+",dic_restore_"+a,"dic_rename_"+a+",dic_delete_"+a],v=["mixedCase","mixedWithDigits","allCaps","ignoreDomainNames"];g=j.lang.scayt;var z=
+[{id:"options",label:g.optionsTab,elements:[{type:"html",id:"options",html:'<form name="optionsbar_'+a+'"><div class="inner_options">\t<div class="messagebox"></div>\t<div style="display:none;">\t\t<input type="checkbox" name="options"  id="allCaps_'+a+'" />\t\t<label style = "display: inline" for="allCaps" id="label_allCaps_'+a+'"></label>\t</div>\t<div style="display:none;">\t\t<input name="options" type="checkbox"  id="ignoreDomainNames_'+a+'" />\t\t<label style = "display: inline" for="ignoreDomainNames" id="label_ignoreDomainNames_'+
+a+'"></label>\t</div>\t<div style="display:none;">\t<input name="options" type="checkbox"  id="mixedCase_'+a+'" />\t\t<label style = "display: inline" for="mixedCase" id="label_mixedCase_'+a+'"></label>\t</div>\t<div style="display:none;">\t\t<input name="options" type="checkbox"  id="mixedWithDigits_'+a+'" />\t\t<label style = "display: inline" for="mixedWithDigits" id="label_mixedWithDigits_'+a+'"></label>\t</div></div></form>'}]},{id:"langs",label:g.languagesTab,elements:[{type:"html",id:"langs",
+html:'<form name="languagesbar_'+a+'"><div class="inner_langs">\t<div class="messagebox"></div>\t   <div style="float:left;width:45%;margin-left:5px;" id="scayt_lcol_'+a+'" ></div>   <div style="float:left;width:45%;margin-left:15px;" id="scayt_rcol_'+a+'"></div></div></form>'}]},{id:"dictionaries",label:g.dictionariesTab,elements:[{type:"html",style:"",id:"dictionaries",html:'<form name="dictionarybar_'+a+'"><div class="inner_dictionary" style="text-align:left; white-space:normal; width:320px; overflow: hidden;">\t<div style="margin:5px auto; width:95%;white-space:normal; overflow:hidden;" id="dic_message_'+
+a+'"> </div>\t<div style="margin:5px auto; width:95%;white-space:normal;">        <span class="cke_dialog_ui_labeled_label" >Dictionary name</span><br>\t\t<span class="cke_dialog_ui_labeled_content" >\t\t\t<div class="cke_dialog_ui_input_text">\t\t\t\t<input id="dic_name_'+a+'" type="text" class="cke_dialog_ui_input_text" style = "height: 25px; background: none; padding: 0;"/>\t\t</div></span></div>\t\t<div style="margin:5px auto; width:95%;white-space:normal;">\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_create_'+
+a+'">\t\t\t\t</a>\t\t\t<a  style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_delete_'+a+'">\t\t\t\t</a>\t\t\t<a  style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_rename_'+a+'">\t\t\t\t</a>\t\t\t<a  style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_restore_'+a+'">\t\t\t\t</a>\t\t</div>\t<div style="margin:5px auto; width:95%;white-space:normal;" id="dic_info_'+a+'"></div></div></form>'}]},{id:"about",
+label:g.aboutTab,elements:[{type:"html",id:"about",style:"margin: 5px 5px;",html:'<div id="scayt_about_'+a+'"></div>'}]}],B={title:g.title,minWidth:360,minHeight:220,onShow:function(){var b=this;b.data=j.fire("scaytDialog",{});b.options=b.data.scayt_control.option();b.chosed_lang=b.sLang=b.data.scayt_control.sLang;if(!b.data||!b.data.scayt||!b.data.scayt_control)alert("Error loading application service"),b.hide();else{var a=0;s?b.data.scayt.getCaption(j.langCode||"en",function(e){0<a++||(h=e,A.apply(b),
+y.apply(b),s=!1)}):y.apply(b);b.selectPage(b.data.tab)}},onOk:function(){var a=this.data.scayt_control;a.option(this.options);a.setLang(this.chosed_lang);a.refresh()},onCancel:function(){var b=w(),f;for(f in b)b[f].checked=!1;b="undefined"!=typeof document.forms["languagesbar_"+a]?document.forms["languagesbar_"+a].scayt_lang:[];x(b,"")},contents:t};CKEDITOR.plugins.scayt.getScayt(j);for(g=0;g<l.length;g++)1==l[g]&&(t[t.length]=z[g]);1==l[2]&&(u=1);var A=function(){function b(b){var c=f.getById("dic_name_"+
+a).getValue();if(!c)return n(" Dictionary name should not be empty. "),!1;try{var d=b.data.getTarget().getParent(),e=/(dic_\w+)_[\w\d]+/.exec(d.getId())[1];j[e].apply(null,[d,c,m])}catch(C){n(" Dictionary error. ")}return!0}var k=this,e=k.data.scayt.getLangList(),d=["dic_create","dic_delete","dic_rename","dic_restore"],g=[],i=[],c;if(u){for(c=0;c<d.length;c++)g[c]=d[c]+"_"+a,f.getById(g[c]).setHtml('<span class="cke_dialog_ui_button">'+h["button_"+d[c]]+"</span>");f.getById("dic_info_"+a).setHtml(h.dic_info)}if(1==
+l[0])for(c in v)d="label_"+v[c],g=f.getById(d+"_"+a),"undefined"!=typeof g&&("undefined"!=typeof h[d]&&"undefined"!=typeof k.options[v[c]])&&(g.setHtml(h[d]),g.getParent().$.style.display="block");d='<p><img src="'+window.scayt.getAboutInfo().logoURL+'" /></p><p>'+h.version+window.scayt.getAboutInfo().version.toString()+"</p><p>"+h.about_throwt_copy+"</p>";f.getById("scayt_about_"+a).setHtml(d);d=function(a,b){var c=f.createElement("label");c.setAttribute("for","cke_option"+a);c.setStyle("display",
+"inline");c.setHtml(b[a]);k.sLang==a&&(k.chosed_lang=a);var d=f.createElement("div"),e=CKEDITOR.dom.element.createFromHtml('<input class = "cke_dialog_ui_radio_input" id="cke_option'+a+'" type="radio" '+(k.sLang==a?'checked="checked"':"")+' value="'+a+'" name="scayt_lang" />');e.on("click",function(){this.$.checked=true;k.chosed_lang=a});d.append(e);d.append(c);return{lang:b[a],code:a,radio:d}};if(1==l[1]){for(c in e.rtl)i[i.length]=d(c,e.ltr);for(c in e.ltr)i[i.length]=d(c,e.ltr);i.sort(function(a,
+b){return b.lang>a.lang?-1:1});e=f.getById("scayt_lcol_"+a);d=f.getById("scayt_rcol_"+a);for(c=0;c<i.length;c++)(c<i.length/2?e:d).append(i[c].radio)}var j={dic_create:function(a,b,c){var d=c[0]+","+c[1],e=h.err_dic_create,f=h.succ_dic_create;window.scayt.createUserDictionary(b,function(a){q(d);p(c[1]);f=f.replace("%s",a.dname);o(f)},function(a){e=e.replace("%s",a.dname);n(e+"( "+(a.message||"")+")")})},dic_rename:function(a,b){var c=h.err_dic_rename||"",d=h.succ_dic_rename||"";window.scayt.renameUserDictionary(b,
+function(a){d=d.replace("%s",a.dname);r(b);o(d)},function(a){c=c.replace("%s",a.dname);r(b);n(c+"( "+(a.message||"")+" )")})},dic_delete:function(a,b,c){var d=c[0]+","+c[1],e=h.err_dic_delete,f=h.succ_dic_delete;window.scayt.deleteUserDictionary(function(a){f=f.replace("%s",a.dname);q(d);p(c[0]);r("");o(f)},function(a){e=e.replace("%s",a.dname);n(e)})}};j.dic_restore=k.dic_restore||function(a,b,c){var d=c[0]+","+c[1],e=h.err_dic_restore,f=h.succ_dic_restore;window.scayt.restoreUserDictionary(b,function(a){f=
+f.replace("%s",a.dname);q(d);p(c[1]);o(f)},function(a){e=e.replace("%s",a.dname);n(e)})};i=(m[0]+","+m[1]).split(",");c=0;for(e=i.length;c<e;c+=1)if(d=f.getById(i[c]))d.on("click",b,this)},y=function(){var b=this;if(1==l[0])for(var g=w(),e=0,d=g.length;e<d;e++){var h=g[e].id,i=f.getById(h);if(i&&(g[e].checked=!1,1==b.options[h.split("_")[0]]&&(g[e].checked=!0),s))i.on("click",function(){b.options[this.getId().split("_")[0]]=this.$.checked?1:0})}1==l[1]&&(g=f.getById("cke_option"+b.sLang),x(g.$,b.sLang));
+u&&(window.scayt.getNameUserDictionary(function(b){b=b.dname;q(m[0]+","+m[1]);if(b){f.getById("dic_name_"+a).setValue(b);p(m[1])}else p(m[0])},function(){f.getById("dic_name_"+a).setValue("")}),o(""))};return B});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/scayt/dialogs/toolbar.css b/htmltest/sites/all/libraries/ckeditor-version/plugins/scayt/dialogs/toolbar.css
new file mode 100644
index 00000000..ecabdac9
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/scayt/dialogs/toolbar.css
@@ -0,0 +1,71 @@
+a
+{
+	text-decoration:none;
+	padding: 2px 4px 4px 6px;
+	display : block;
+	border-width: 1px;
+	border-style: solid;
+	margin : 0px;
+}
+
+a.cke_scayt_toogle:hover,
+a.cke_scayt_toogle:focus,
+a.cke_scayt_toogle:active
+{
+	border-color: #316ac5;
+	background-color: #dff1ff;
+	color : #000;
+	cursor: pointer;
+	margin : 0px;
+}
+a.cke_scayt_toogle {
+	color : #316ac5;
+	border-color: #fff;
+}
+.scayt_enabled a.cke_scayt_item {
+	color : #316ac5;
+	border-color: #fff;
+	margin : 0px;
+}
+.scayt_disabled a.cke_scayt_item {
+	color : gray;
+	border-color : #fff;
+}
+.scayt_enabled a.cke_scayt_item:hover,
+.scayt_enabled a.cke_scayt_item:focus,
+.scayt_enabled a.cke_scayt_item:active
+{
+	border-color: #316ac5;
+	background-color: #dff1ff;
+	color : #000;
+	cursor: pointer;
+}
+.scayt_disabled a.cke_scayt_item:hover,
+.scayt_disabled a.cke_scayt_item:focus,
+.scayt_disabled a.cke_scayt_item:active
+{
+	border-color: gray;
+	background-color: #dff1ff;
+	color : gray;
+	cursor: no-drop;
+}
+.cke_scayt_set_on, .cke_scayt_set_off
+{
+	display: none;
+}
+.scayt_enabled .cke_scayt_set_on
+{
+	display: none;
+}
+.scayt_disabled .cke_scayt_set_on
+{
+	display: inline;
+}
+.scayt_disabled .cke_scayt_set_off
+{
+	display: none;
+}
+.scayt_enabled  .cke_scayt_set_off
+{
+	display: inline;
+}
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_address.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_address.png
new file mode 100644
index 00000000..1ee67aa2
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_address.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_blockquote.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_blockquote.png
new file mode 100644
index 00000000..cae3aec6
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_blockquote.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_div.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_div.png
new file mode 100644
index 00000000..c71f3978
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_div.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h1.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h1.png
new file mode 100644
index 00000000..3a643473
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h1.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h2.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h2.png
new file mode 100644
index 00000000..8062ebe8
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h2.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h3.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h3.png
new file mode 100644
index 00000000..5b6a4030
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h3.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h4.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h4.png
new file mode 100644
index 00000000..6c7f7951
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h4.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h5.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h5.png
new file mode 100644
index 00000000..e153de09
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h5.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h6.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h6.png
new file mode 100644
index 00000000..c8d993a9
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_h6.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_p.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_p.png
new file mode 100644
index 00000000..4e6035d2
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_p.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_pre.png b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_pre.png
new file mode 100644
index 00000000..d11a0fff
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/showblocks/images/block_pre.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/dialogs/smiley.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/dialogs/smiley.js
new file mode 100644
index 00000000..4f84a620
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/dialogs/smiley.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("smiley",function(f){for(var e=f.config,a=f.lang.smiley,h=e.smiley_images,g=e.smiley_columns||8,i,k=function(j){var c=j.data.getTarget(),b=c.getName();if("a"==b)c=c.getChild(0);else if("img"!=b)return;var b=c.getAttribute("cke_src"),a=c.getAttribute("title"),c=f.document.createElement("img",{attributes:{src:b,"data-cke-saved-src":b,title:a,alt:a,width:c.$.width,height:c.$.height}});f.insertElement(c);i.hide();j.data.preventDefault()},n=CKEDITOR.tools.addFunction(function(a,c){var a=
+new CKEDITOR.dom.event(a),c=new CKEDITOR.dom.element(c),b;b=a.getKeystroke();var d="rtl"==f.lang.dir;switch(b){case 38:if(b=c.getParent().getParent().getPrevious())b=b.getChild([c.getParent().getIndex(),0]),b.focus();a.preventDefault();break;case 40:if(b=c.getParent().getParent().getNext())(b=b.getChild([c.getParent().getIndex(),0]))&&b.focus();a.preventDefault();break;case 32:k({data:a});a.preventDefault();break;case d?37:39:if(b=c.getParent().getNext())b=b.getChild(0),b.focus(),a.preventDefault(!0);
+else if(b=c.getParent().getParent().getNext())(b=b.getChild([0,0]))&&b.focus(),a.preventDefault(!0);break;case d?39:37:if(b=c.getParent().getPrevious())b=b.getChild(0),b.focus(),a.preventDefault(!0);else if(b=c.getParent().getParent().getPrevious())b=b.getLast().getChild(0),b.focus(),a.preventDefault(!0)}}),d=CKEDITOR.tools.getNextId()+"_smiley_emtions_label",d=['<div><span id="'+d+'" class="cke_voice_label">'+a.options+"</span>",'<table role="listbox" aria-labelledby="'+d+'" style="width:100%;height:100%;border-collapse:separate;" cellspacing="2" cellpadding="2"',
+CKEDITOR.env.ie&&CKEDITOR.env.quirks?' style="position:absolute;"':"","><tbody>"],l=h.length,a=0;a<l;a++){0===a%g&&d.push('<tr role="presentation">');var m="cke_smile_label_"+a+"_"+CKEDITOR.tools.getNextNumber();d.push('<td class="cke_dark_background cke_centered" style="vertical-align: middle;" role="presentation"><a href="javascript:void(0)" role="option"',' aria-posinset="'+(a+1)+'"',' aria-setsize="'+l+'"',' aria-labelledby="'+m+'"',' class="cke_smile cke_hand" tabindex="-1" onkeydown="CKEDITOR.tools.callFunction( ',
+n,', event, this );">','<img class="cke_hand" title="',e.smiley_descriptions[a],'" cke_src="',CKEDITOR.tools.htmlEncode(e.smiley_path+h[a]),'" alt="',e.smiley_descriptions[a],'"',' src="',CKEDITOR.tools.htmlEncode(e.smiley_path+h[a]),'"',CKEDITOR.env.ie?" onload=\"this.setAttribute('width', 2); this.removeAttribute('width');\" ":"",'><span id="'+m+'" class="cke_voice_label">'+e.smiley_descriptions[a]+"</span></a>","</td>");a%g==g-1&&d.push("</tr>")}if(a<g-1){for(;a<g-1;a++)d.push("<td></td>");d.push("</tr>")}d.push("</tbody></table></div>");
+e={type:"html",id:"smileySelector",html:d.join(""),onLoad:function(a){i=a.sender},focus:function(){var a=this;setTimeout(function(){a.getElement().getElementsByTag("a").getItem(0).focus()},0)},onClick:k,style:"width: 100%; border-collapse: separate;"};return{title:f.lang.smiley.title,minWidth:270,minHeight:120,contents:[{id:"tab1",label:"",title:"",expand:!0,padding:0,elements:[e]}],buttons:[CKEDITOR.dialog.cancelButton]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/angel_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/angel_smile.gif
new file mode 100644
index 00000000..2cf48947
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/angel_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/angry_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/angry_smile.gif
new file mode 100644
index 00000000..40b52d3a
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/angry_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/broken_heart.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/broken_heart.gif
new file mode 100644
index 00000000..b6d0166a
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/broken_heart.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/confused_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/confused_smile.gif
new file mode 100644
index 00000000..a52db7a4
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/confused_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/cry_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/cry_smile.gif
new file mode 100644
index 00000000..1ef6ba4f
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/cry_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/devil_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/devil_smile.gif
new file mode 100644
index 00000000..bfb25077
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/devil_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/embaressed_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/embaressed_smile.gif
new file mode 100644
index 00000000..d9cedc56
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/embaressed_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/embarrassed_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/embarrassed_smile.gif
new file mode 100644
index 00000000..d9cedc56
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/embarrassed_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/envelope.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/envelope.gif
new file mode 100644
index 00000000..94e0b1fa
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/envelope.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/heart.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/heart.gif
new file mode 100644
index 00000000..680ae2fc
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/heart.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/kiss.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/kiss.gif
new file mode 100644
index 00000000..70e52551
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/kiss.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/lightbulb.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/lightbulb.gif
new file mode 100644
index 00000000..d44c2ffe
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/lightbulb.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/omg_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/omg_smile.gif
new file mode 100644
index 00000000..ab7ea699
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/omg_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/regular_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/regular_smile.gif
new file mode 100644
index 00000000..e5bc34be
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/regular_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/sad_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/sad_smile.gif
new file mode 100644
index 00000000..ae4cf1e3
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/sad_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/shades_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/shades_smile.gif
new file mode 100644
index 00000000..b4540175
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/shades_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/teeth_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/teeth_smile.gif
new file mode 100644
index 00000000..7d734d15
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/teeth_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/thumbs_down.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/thumbs_down.gif
new file mode 100644
index 00000000..90b9978c
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/thumbs_down.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/thumbs_up.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/thumbs_up.gif
new file mode 100644
index 00000000..b6332848
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/thumbs_up.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/tongue_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/tongue_smile.gif
new file mode 100644
index 00000000..b2e657fa
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/tongue_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/tounge_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/tounge_smile.gif
new file mode 100644
index 00000000..b2e657fa
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/tounge_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/whatchutalkingabout_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/whatchutalkingabout_smile.gif
new file mode 100644
index 00000000..77098821
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/whatchutalkingabout_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/wink_smile.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/wink_smile.gif
new file mode 100644
index 00000000..b2102954
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/smiley/images/wink_smile.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/_translationstatus.txt b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/_translationstatus.txt
new file mode 100644
index 00000000..51661690
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/_translationstatus.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+
+cs.js      Found: 118 Missing: 0
+cy.js      Found: 118 Missing: 0
+de.js      Found: 118 Missing: 0
+el.js      Found: 16 Missing: 102
+eo.js      Found: 118 Missing: 0
+et.js      Found: 31 Missing: 87
+fa.js      Found: 24 Missing: 94
+fi.js      Found: 23 Missing: 95
+fr.js      Found: 118 Missing: 0
+hr.js      Found: 23 Missing: 95
+it.js      Found: 118 Missing: 0
+nb.js      Found: 118 Missing: 0
+nl.js      Found: 118 Missing: 0
+no.js      Found: 118 Missing: 0
+tr.js      Found: 118 Missing: 0
+ug.js      Found: 39 Missing: 79
+zh-cn.js   Found: 118 Missing: 0
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ar.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ar.js
new file mode 100644
index 00000000..389f3c20
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ar.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","ar",{euro:"رمز اليورو",lsquo:"علامة تنصيص علي اليسار",rsquo:"علامة تنصيص علي اليمين",ldquo:"علامة تنصيص مزدوجة علي اليسار",rdquo:"علامة تنصيص مزدوجة علي اليمين",ndash:"En dash –",mdash:"Em dash —",iexcl:"علامة تعجب مقلوبة",cent:"رمز سنتيم",pound:"رمز الاسترليني",curren:"رمز العملة",yen:"رمز الين الياباني",brvbar:"خط عمودي مكسور",sect:"رمز الفصيلة",uml:"Diaeresis",copy:"علامة حقوق الطبع",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"ليست علامة",reg:"علامة مسجّلة",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"علامة الإستفهام غير صحيحة",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/bg.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/bg.js
new file mode 100644
index 00000000..c68b9791
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/bg.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","bg",{euro:"Евро знак",lsquo:"Лява маркировка за цитат",rsquo:"Дясна маркировка за цитат",ldquo:"Лява двойна кавичка за цитат",rdquo:"Дясна двойна кавичка за цитат",ndash:"\\\\",mdash:"/",iexcl:"Обърната питанка",cent:"Знак за цент",pound:"Знак за паунд",curren:"Валутен знак",yen:"Знак за йена",brvbar:"Прекъсната линия",sect:"Знак за секция",uml:"Diaeresis",copy:"Знак за Copyright",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ca.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ca.js
new file mode 100644
index 00000000..907bb043
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ca.js
@@ -0,0 +1,14 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","ca",{euro:"Símbol d'euro",lsquo:"Signe de cometa simple esquerra",rsquo:"Signe de cometa simple dreta",ldquo:"Signe de cometa doble esquerra",rdquo:"Signe de cometa doble dreta",ndash:"Guió",mdash:"Guió baix",iexcl:"Signe d'exclamació inversa",cent:"Símbol de percentatge",pound:"Símbol de lliura",curren:"Símbol de moneda",yen:"Símbol de Yen",brvbar:"Barra trencada",sect:"Símbol de secció",uml:"Dièresi",copy:"Símbol de Copyright",ordf:"Indicador ordinal femení",
+laquo:"Signe de cometes angulars esquerra",not:"Símbol de negació",reg:"Símbol registrat",macr:"Macron",deg:"Símbol de grau",sup2:"Superíndex dos",sup3:"Superíndex tres",acute:"Accent agut",micro:"Símbol de micro",para:"Símbol de calderó",middot:"Punt volat",cedil:"Ce trencada",sup1:"Superíndex u",ordm:"Indicador ordinal masculí",raquo:"Signe de cometes angulars dreta",frac14:"Fracció vulgar un quart",frac12:"Fracció vulgar una meitat",frac34:"Fracció vulgar tres quarts",iquest:"Símbol d'interrogació invertit",
+Agrave:"Lletra majúscula llatina A amb accent greu",Aacute:"Lletra majúscula llatina A amb accent agut",Acirc:"Lletra majúscula llatina A amb circumflex",Atilde:"Lletra majúscula llatina A amb titlla",Auml:"Lletra majúscula llatina A amb dièresi",Aring:"Lletra majúscula llatina A amb anell superior",AElig:"Lletra majúscula llatina Æ",Ccedil:"Lletra majúscula llatina C amb ce trencada",Egrave:"Lletra majúscula llatina E amb accent greu",Eacute:"Lletra majúscula llatina E amb accent agut",Ecirc:"Lletra majúscula llatina E amb circumflex",
+Euml:"Lletra majúscula llatina E amb dièresi",Igrave:"Lletra majúscula llatina I amb accent greu",Iacute:"Lletra majúscula llatina I amb accent agut",Icirc:"Lletra majúscula llatina I amb circumflex",Iuml:"Lletra majúscula llatina I amb dièresi",ETH:"Lletra majúscula llatina Eth",Ntilde:"Lletra majúscula llatina N amb titlla",Ograve:"Lletra majúscula llatina O amb accent greu",Oacute:"Lletra majúscula llatina O amb accent agut",Ocirc:"Lletra majúscula llatina O amb circumflex",Otilde:"Lletra majúscula llatina O amb titlla",
+Ouml:"Lletra majúscula llatina O amb dièresi",times:"Símbol de multiplicació",Oslash:"Lletra majúscula llatina O amb barra",Ugrave:"Lletra majúscula llatina U amb accent greu",Uacute:"Lletra majúscula llatina U amb accent agut",Ucirc:"Lletra majúscula llatina U amb circumflex",Uuml:"Lletra majúscula llatina U amb dièresi",Yacute:"Lletra majúscula llatina Y amb accent agut",THORN:"Lletra majúscula llatina Thorn",szlig:"Lletra minúscula llatina sharp s",agrave:"Lletra minúscula llatina a amb accent greu",
+aacute:"Lletra minúscula llatina a amb accent agut",acirc:"Lletra minúscula llatina a amb circumflex",atilde:"Lletra minúscula llatina a amb titlla",auml:"Lletra minúscula llatina a amb dièresi",aring:"Lletra minúscula llatina a amb anell superior",aelig:"Lletra minúscula llatina æ",ccedil:"Lletra minúscula llatina c amb ce trencada",egrave:"Lletra minúscula llatina e amb accent greu",eacute:"Lletra minúscula llatina e amb accent agut",ecirc:"Lletra minúscula llatina e amb circumflex",euml:"Lletra minúscula llatina e amb dièresi",
+igrave:"Lletra minúscula llatina i amb accent greu",iacute:"Lletra minúscula llatina i amb accent agut",icirc:"Lletra minúscula llatina i amb circumflex",iuml:"Lletra minúscula llatina i amb dièresi",eth:"Lletra minúscula llatina eth",ntilde:"Lletra minúscula llatina n amb titlla",ograve:"Lletra minúscula llatina o amb accent greu",oacute:"Lletra minúscula llatina o amb accent agut",ocirc:"Lletra minúscula llatina o amb circumflex",otilde:"Lletra minúscula llatina o amb titlla",ouml:"Lletra minúscula llatina o amb dièresi",
+divide:"Símbol de divisió",oslash:"Lletra minúscula llatina o amb barra",ugrave:"Lletra minúscula llatina u amb accent greu",uacute:"Lletra minúscula llatina u amb accent agut",ucirc:"Lletra minúscula llatina u amb circumflex",uuml:"Lletra minúscula llatina u amb dièresi",yacute:"Lletra minúscula llatina y amb accent agut",thorn:"Lletra minúscula llatina thorn",yuml:"Lletra minúscula llatina y amb dièresi",OElig:"Lligadura majúscula llatina OE",oelig:"Lligadura minúscula llatina oe",372:"Lletra majúscula llatina W amb circumflex",
+374:"Lletra majúscula llatina Y amb circumflex",373:"Lletra minúscula llatina w amb circumflex",375:"Lletra minúscula llatina y amb circumflex",sbquo:"Signe de cita simple baixa-9",8219:"Signe de cita simple alta-invertida-9",bdquo:"Signe de cita doble baixa-9",hellip:"Punts suspensius",trade:"Símbol de marca registrada",9658:"Punter negre apuntant cap a la dreta",bull:"Vinyeta",rarr:"Fletxa cap a la dreta",rArr:"Doble fletxa cap a la dreta",hArr:"Doble fletxa esquerra dreta",diams:"Vestit negre diamant",
+asymp:"Gairebé igual a"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/cs.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/cs.js
new file mode 100644
index 00000000..c9500d6c
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/cs.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","cs",{euro:"Znak eura",lsquo:"Počáteční uvozovka jednoduchá",rsquo:"Koncová uvozovka jednoduchá",ldquo:"Počáteční uvozovka dvojitá",rdquo:"Koncová uvozovka dvojitá",ndash:"En pomlčka",mdash:"Em pomlčka",iexcl:"Obrácený vykřičník",cent:"Znak centu",pound:"Znak libry",curren:"Znak měny",yen:"Znak jenu",brvbar:"Přerušená svislá čára",sect:"Znak oddílu",uml:"Přehláska",copy:"Znak copyrightu",ordf:"Ženský indikátor rodu",laquo:"Znak dvojitých lomených uvozovek vlevo",
+not:"Logistický zápor",reg:"Znak registrace",macr:"Pomlčka nad",deg:"Znak stupně",sup2:"Dvojka jako horní index",sup3:"Trojka jako horní index",acute:"Čárka nad vpravo",micro:"Znak mikro",para:"Znak odstavce",middot:"Tečka uprostřed",cedil:"Ocásek vlevo",sup1:"Jednička jako horní index",ordm:"Mužský indikátor rodu",raquo:"Znak dvojitých lomených uvozovek vpravo",frac14:"Obyčejný zlomek jedna čtvrtina",frac12:"Obyčejný zlomek jedna polovina",frac34:"Obyčejný zlomek tři čtvrtiny",iquest:"Znak obráceného otazníku",
+Agrave:"Velké písmeno latinky A s čárkou nad vlevo",Aacute:"Velké písmeno latinky A s čárkou nad vpravo",Acirc:"Velké písmeno latinky A s vokáněm",Atilde:"Velké písmeno latinky A s tildou",Auml:"Velké písmeno latinky A s dvěma tečkami",Aring:"Velké písmeno latinky A s kroužkem nad",AElig:"Velké písmeno latinky Ae",Ccedil:"Velké písmeno latinky C s ocáskem vlevo",Egrave:"Velké písmeno latinky E s čárkou nad vlevo",Eacute:"Velké písmeno latinky E s čárkou nad vpravo",Ecirc:"Velké písmeno latinky E s vokáněm",
+Euml:"Velké písmeno latinky E s dvěma tečkami",Igrave:"Velké písmeno latinky I s čárkou nad vlevo",Iacute:"Velké písmeno latinky I s čárkou nad vpravo",Icirc:"Velké písmeno latinky I s vokáněm",Iuml:"Velké písmeno latinky I s dvěma tečkami",ETH:"Velké písmeno latinky Eth",Ntilde:"Velké písmeno latinky N s tildou",Ograve:"Velké písmeno latinky O s čárkou nad vlevo",Oacute:"Velké písmeno latinky O s čárkou nad vpravo",Ocirc:"Velké písmeno latinky O s vokáněm",Otilde:"Velké písmeno latinky O s tildou",
+Ouml:"Velké písmeno latinky O s dvěma tečkami",times:"Znak násobení",Oslash:"Velké písmeno latinky O přeškrtnuté",Ugrave:"Velké písmeno latinky U s čárkou nad vlevo",Uacute:"Velké písmeno latinky U s čárkou nad vpravo",Ucirc:"Velké písmeno latinky U s vokáněm",Uuml:"Velké písmeno latinky U s dvěma tečkami",Yacute:"Velké písmeno latinky Y s čárkou nad vpravo",THORN:"Velké písmeno latinky Thorn",szlig:"Malé písmeno latinky ostré s",agrave:"Malé písmeno latinky a s čárkou nad vlevo",aacute:"Malé písmeno latinky a s čárkou nad vpravo",
+acirc:"Malé písmeno latinky a s vokáněm",atilde:"Malé písmeno latinky a s tildou",auml:"Malé písmeno latinky a s dvěma tečkami",aring:"Malé písmeno latinky a s kroužkem nad",aelig:"Malé písmeno latinky ae",ccedil:"Malé písmeno latinky c s ocáskem vlevo",egrave:"Malé písmeno latinky e s čárkou nad vlevo",eacute:"Malé písmeno latinky e s čárkou nad vpravo",ecirc:"Malé písmeno latinky e s vokáněm",euml:"Malé písmeno latinky e s dvěma tečkami",igrave:"Malé písmeno latinky i s čárkou nad vlevo",iacute:"Malé písmeno latinky i s čárkou nad vpravo",
+icirc:"Malé písmeno latinky i s vokáněm",iuml:"Malé písmeno latinky i s dvěma tečkami",eth:"Malé písmeno latinky eth",ntilde:"Malé písmeno latinky n s tildou",ograve:"Malé písmeno latinky o s čárkou nad vlevo",oacute:"Malé písmeno latinky o s čárkou nad vpravo",ocirc:"Malé písmeno latinky o s vokáněm",otilde:"Malé písmeno latinky o s tildou",ouml:"Malé písmeno latinky o s dvěma tečkami",divide:"Znak dělení",oslash:"Malé písmeno latinky o přeškrtnuté",ugrave:"Malé písmeno latinky u s čárkou nad vlevo",
+uacute:"Malé písmeno latinky u s čárkou nad vpravo",ucirc:"Malé písmeno latinky u s vokáněm",uuml:"Malé písmeno latinky u s dvěma tečkami",yacute:"Malé písmeno latinky y s čárkou nad vpravo",thorn:"Malé písmeno latinky thorn",yuml:"Malé písmeno latinky y s dvěma tečkami",OElig:"Velká ligatura latinky OE",oelig:"Malá ligatura latinky OE",372:"Velké písmeno latinky W s vokáněm",374:"Velké písmeno latinky Y s vokáněm",373:"Malé písmeno latinky w s vokáněm",375:"Malé písmeno latinky y s vokáněm",sbquo:"Dolní 9 uvozovka jednoduchá",
+8219:"Horní obrácená 9 uvozovka jednoduchá",bdquo:"Dolní 9 uvozovka dvojitá",hellip:"Trojtečkový úvod",trade:"Obchodní značka",9658:"Černý ukazatel směřující vpravo",bull:"Kolečko",rarr:"Šipka vpravo",rArr:"Dvojitá šipka vpravo",hArr:"Dvojitá šipka vlevo a vpravo",diams:"Černé piky",asymp:"Téměř se rovná"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/cy.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/cy.js
new file mode 100644
index 00000000..36a074f1
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/cy.js
@@ -0,0 +1,14 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","cy",{euro:"Arwydd yr Ewro",lsquo:"Dyfynnod chwith unigol",rsquo:"Dyfynnod dde unigol",ldquo:"Dyfynnod chwith dwbl",rdquo:"Dyfynnod dde dwbl",ndash:"Cysylltnod en",mdash:"Cysylltnod em",iexcl:"Ebychnod gwrthdro",cent:"Arwydd sent",pound:"Arwydd punt",curren:"Arwydd arian cyfred",yen:"Arwydd yen",brvbar:"Bar toriedig",sect:"Arwydd adran",uml:"Didolnod",copy:"Arwydd hawlfraint",ordf:"Dangosydd benywaidd",laquo:"Dyfynnod dwbl ar ongl i'r chwith",not:"Arwydd Nid",
+reg:"Arwydd cofrestredig",macr:"Macron",deg:"Arwydd gradd",sup2:"Dau uwchsgript",sup3:"Tri uwchsgript",acute:"Acen ddyrchafedig",micro:"Arwydd micro",para:"Arwydd pilcrow",middot:"Dot canol",cedil:"Sedila",sup1:"Un uwchsgript",ordm:"Dangosydd gwrywaidd",raquo:"Dyfynnod dwbl ar ongl i'r dde",frac14:"Ffracsiwn cyffredin un cwarter",frac12:"Ffracsiwn cyffredin un hanner",frac34:"Ffracsiwn cyffredin tri chwarter",iquest:"Marc cwestiwn gwrthdroëdig",Agrave:"Priflythyren A Lladinaidd gydag acen ddisgynedig",
+Aacute:"Priflythyren A Lladinaidd gydag acen ddyrchafedig",Acirc:"Priflythyren A Lladinaidd gydag acen grom",Atilde:"Priflythyren A Lladinaidd gyda thild",Auml:"Priflythyren A Lladinaidd gyda didolnod",Aring:"Priflythyren A Lladinaidd gyda chylch uwchben",AElig:"Priflythyren Æ Lladinaidd",Ccedil:"Priflythyren C Lladinaidd gyda sedila",Egrave:"Priflythyren E Lladinaidd gydag acen ddisgynedig",Eacute:"Priflythyren E Lladinaidd gydag acen ddyrchafedig",Ecirc:"Priflythyren E Lladinaidd gydag acen grom",
+Euml:"Priflythyren E Lladinaidd gyda didolnod",Igrave:"Priflythyren I Lladinaidd gydag acen ddisgynedig",Iacute:"Priflythyren I Lladinaidd gydag acen ddyrchafedig",Icirc:"Priflythyren I Lladinaidd gydag acen grom",Iuml:"Priflythyren I Lladinaidd gyda didolnod",ETH:"Priflythyren Eth",Ntilde:"Priflythyren N Lladinaidd gyda thild",Ograve:"Priflythyren O Lladinaidd gydag acen ddisgynedig",Oacute:"Priflythyren O Lladinaidd gydag acen ddyrchafedig",Ocirc:"Priflythyren O Lladinaidd gydag acen grom",Otilde:"Priflythyren O Lladinaidd gyda thild",
+Ouml:"Priflythyren O Lladinaidd gyda didolnod",times:"Arwydd lluosi",Oslash:"Priflythyren O Lladinaidd gyda strôc",Ugrave:"Priflythyren U Lladinaidd gydag acen ddisgynedig",Uacute:"Priflythyren U Lladinaidd gydag acen ddyrchafedig",Ucirc:"Priflythyren U Lladinaidd gydag acen grom",Uuml:"Priflythyren U Lladinaidd gyda didolnod",Yacute:"Priflythyren Y Lladinaidd gydag acen ddyrchafedig",THORN:"Priflythyren Thorn",szlig:"Llythyren s fach Lladinaidd siarp ",agrave:"Llythyren a fach Lladinaidd gydag acen ddisgynedig",
+aacute:"Llythyren a fach Lladinaidd gydag acen ddyrchafedig",acirc:"Llythyren a fach Lladinaidd gydag acen grom",atilde:"Llythyren a fach Lladinaidd gyda thild",auml:"Llythyren a fach Lladinaidd gyda didolnod",aring:"Llythyren a fach Lladinaidd gyda chylch uwchben",aelig:"Llythyren æ fach Lladinaidd",ccedil:"Llythyren c fach Lladinaidd gyda sedila",egrave:"Llythyren e fach Lladinaidd gydag acen ddisgynedig",eacute:"Llythyren e fach Lladinaidd gydag acen ddyrchafedig",ecirc:"Llythyren e fach Lladinaidd gydag acen grom",
+euml:"Llythyren e fach Lladinaidd gyda didolnod",igrave:"Llythyren i fach Lladinaidd gydag acen ddisgynedig",iacute:"Llythyren i fach Lladinaidd gydag acen ddyrchafedig",icirc:"Llythyren i fach Lladinaidd gydag acen grom",iuml:"Llythyren i fach Lladinaidd gyda didolnod",eth:"Llythyren eth fach",ntilde:"Llythyren n fach Lladinaidd gyda thild",ograve:"Llythyren o fach Lladinaidd gydag acen ddisgynedig",oacute:"Llythyren o fach Lladinaidd gydag acen ddyrchafedig",ocirc:"Llythyren o fach Lladinaidd gydag acen grom",
+otilde:"Llythyren o fach Lladinaidd gyda thild",ouml:"Llythyren o fach Lladinaidd gyda didolnod",divide:"Arwydd rhannu",oslash:"Llythyren o fach Lladinaidd gyda strôc",ugrave:"Llythyren u fach Lladinaidd gydag acen ddisgynedig",uacute:"Llythyren u fach Lladinaidd gydag acen ddyrchafedig",ucirc:"Llythyren u fach Lladinaidd gydag acen grom",uuml:"Llythyren u fach Lladinaidd gyda didolnod",yacute:"Llythyren y fach Lladinaidd gydag acen ddisgynedig",thorn:"Llythyren o fach Lladinaidd gyda strôc",yuml:"Llythyren y fach Lladinaidd gyda didolnod",
+OElig:"Priflythyren cwlwm OE Lladinaidd ",oelig:"Priflythyren cwlwm oe Lladinaidd ",372:"Priflythyren W gydag acen grom",374:"Priflythyren Y gydag acen grom",373:"Llythyren w fach gydag acen grom",375:"Llythyren y fach gydag acen grom",sbquo:"Dyfynnod sengl 9-isel",8219:"Dyfynnod sengl 9-uchel cildro",bdquo:"Dyfynnod dwbl 9-isel",hellip:"Coll geiriau llorweddol",trade:"Arwydd marc masnachol",9658:"Pwyntydd du i'r dde",bull:"Bwled",rarr:"Saeth i'r dde",rArr:"Saeth ddwbl i'r dde",hArr:"Saeth ddwbl i'r chwith",
+diams:"Siwt diemwnt du",asymp:"Bron yn hafal iddo"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/de.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/de.js
new file mode 100644
index 00000000..73325db6
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/de.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","de",{euro:"Euro Zeichen",lsquo:"Hochkomma links",rsquo:"Hochkomma rechts",ldquo:"Anführungszeichen links",rdquo:"Anführungszeichen rechts",ndash:"kleiner Strich",mdash:"mittlerer Strich",iexcl:"invertiertes Ausrufezeichen",cent:"Cent",pound:"Pfund",curren:"Währung",yen:"Yen",brvbar:"gestrichelte Linie",sect:"§ Zeichen",uml:"Diäresis",copy:"Copyright",ordf:"Feminine ordinal Anzeige",laquo:"Nach links zeigenden Doppel-Winkel Anführungszeichen",not:"Not-Zeichen",
+reg:"Registriert",macr:"Längezeichen",deg:"Grad",sup2:"Hoch 2",sup3:"Hoch 3",acute:"Akzentzeichen ",micro:"Micro",para:"Pilcrow-Zeichen",middot:"Mittelpunkt",cedil:"Cedilla",sup1:"Hoch 1",ordm:"Männliche Ordnungszahl Anzeige",raquo:"Nach rechts zeigenden Doppel-Winkel Anführungszeichen",frac14:"ein Viertel",frac12:"Hälfte",frac34:"Dreiviertel",iquest:"Umgekehrtes Fragezeichen",Agrave:"Lateinischer Buchstabe A mit AkzentGrave",Aacute:"Lateinischer Buchstabe A mit Akutakzent",Acirc:"Lateinischer Buchstabe A mit Zirkumflex",
+Atilde:"Lateinischer Buchstabe A mit Tilde",Auml:"Lateinischer Buchstabe A mit Trema",Aring:"Lateinischer Buchstabe A mit Ring oben",AElig:"Lateinischer Buchstabe Æ",Ccedil:"Lateinischer Buchstabe C mit Cedille",Egrave:"Lateinischer Buchstabe E mit AkzentGrave",Eacute:"Lateinischer Buchstabe E mit Akutakzent",Ecirc:"Lateinischer Buchstabe E mit Zirkumflex",Euml:"Lateinischer Buchstabe E Trema",Igrave:"Lateinischer Buchstabe I mit AkzentGrave",Iacute:"Lateinischer Buchstabe I mit Akutakzent",Icirc:"Lateinischer Buchstabe I mit Zirkumflex",
+Iuml:"Lateinischer Buchstabe I mit Trema",ETH:"Lateinischer Buchstabe Eth",Ntilde:"Lateinischer Buchstabe N mit Tilde",Ograve:"Lateinischer Buchstabe O mit AkzentGrave",Oacute:"Lateinischer Buchstabe O mit Akutakzent",Ocirc:"Lateinischer Buchstabe O mit Zirkumflex",Otilde:"Lateinischer Buchstabe O mit Tilde",Ouml:"Lateinischer Buchstabe O mit Trema",times:"Multiplikation",Oslash:"Lateinischer Buchstabe O durchgestrichen",Ugrave:"Lateinischer Buchstabe U mit Akzentgrave",Uacute:"Lateinischer Buchstabe U mit Akutakzent",
+Ucirc:"Lateinischer Buchstabe U mit Zirkumflex",Uuml:"Lateinischer Buchstabe a mit Trema",Yacute:"Lateinischer Buchstabe a mit Akzent",THORN:"Lateinischer Buchstabe mit Dorn",szlig:"Kleiner lateinischer Buchstabe scharfe s",agrave:"Kleiner lateinischer Buchstabe a mit Accent grave",aacute:"Kleiner lateinischer Buchstabe a mit Akut",acirc:"Lateinischer Buchstabe a mit Zirkumflex",atilde:"Lateinischer Buchstabe a mit Tilde",auml:"Kleiner lateinischer Buchstabe a mit Trema",aring:"Kleiner lateinischer Buchstabe a mit Ring oben",
+aelig:"Lateinischer Buchstabe æ",ccedil:"Kleiner lateinischer Buchstabe c mit Cedille",egrave:"Kleiner lateinischer Buchstabe e mit Accent grave",eacute:"Kleiner lateinischer Buchstabe e mit Akut",ecirc:"Kleiner lateinischer Buchstabe e mit Zirkumflex",euml:"Kleiner lateinischer Buchstabe e mit Trema",igrave:"Kleiner lateinischer Buchstabe i mit AkzentGrave",iacute:"Kleiner lateinischer Buchstabe i mit Akzent",icirc:"Kleiner lateinischer Buchstabe i mit Zirkumflex",iuml:"Kleiner lateinischer Buchstabe i mit Trema",
+eth:"Kleiner lateinischer Buchstabe eth",ntilde:"Kleiner lateinischer Buchstabe n mit Tilde",ograve:"Kleiner lateinischer Buchstabe o mit Accent grave",oacute:"Kleiner lateinischer Buchstabe o mit Akzent",ocirc:"Kleiner lateinischer Buchstabe o mit Zirkumflex",otilde:"Lateinischer Buchstabe i mit Tilde",ouml:"Kleiner lateinischer Buchstabe o mit Trema",divide:"Divisionszeichen",oslash:"Kleiner lateinischer Buchstabe o durchgestrichen",ugrave:"Kleiner lateinischer Buchstabe u mit Accent grave",uacute:"Kleiner lateinischer Buchstabe u mit Akut",
+ucirc:"Kleiner lateinischer Buchstabe u mit Zirkumflex",uuml:"Kleiner lateinischer Buchstabe u mit Trema",yacute:"Kleiner lateinischer Buchstabe y mit Akut",thorn:"Kleiner lateinischer Buchstabe Dorn",yuml:"Kleiner lateinischer Buchstabe y mit Trema",OElig:"Lateinischer Buchstabe Ligatur OE",oelig:"Kleiner lateinischer Buchstabe Ligatur OE",372:"Lateinischer Buchstabe W mit Zirkumflex",374:"Lateinischer Buchstabe Y mit Zirkumflex",373:"Kleiner lateinischer Buchstabe w mit Zirkumflex",375:"Kleiner lateinischer Buchstabe y mit Zirkumflex",
+sbquo:"Tiefergestelltes Komma",8219:"Rumgedrehtes Komma",bdquo:"Doppeltes Anführungszeichen unten",hellip:"horizontale Auslassungspunkte",trade:"Handelszeichen",9658:"Dreickspfeil rechts",bull:"Bullet",rarr:"Pfeil rechts",rArr:"Doppelpfeil rechts",hArr:"Doppelpfeil links",diams:"Karo",asymp:"Ungefähr"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/el.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/el.js
new file mode 100644
index 00000000..b11c949a
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/el.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","el",{euro:"Σύμβολο Ευρώ",lsquo:"Αριστερός χαρακτήρας μονού εισαγωγικού",rsquo:"Δεξιός χαρακτήρας μονού εισαγωγικού",ldquo:"Αριστερός χαρακτήρας διπλού εισαγωγικού",rdquo:"Δεξιός χαρακτήρας διπλού εισαγωγικού",ndash:"Παύλα en",mdash:"Παύλα em",iexcl:"Ανάποδο θαυμαστικό",cent:"Σύμβολο Σεντ",pound:"Σύμβολο λίρας",curren:"Σύμβολο συναλλαγματικής μονάδας",yen:"Σύμβολο Γιέν",brvbar:"Σπασμένη μπάρα",sect:"Σύμβολο τμήματος",uml:"Διαίρεση",copy:"Σύμβολο πνευματικών δικαιωμάτων",
+ordf:"Feminine ordinal indicator",laquo:"Αριστερός χαρακτήρας διπλού εισαγωγικού",not:"Δεν έχει υπογράψει ",reg:"Εγγεγραμμένο σημάδι ",macr:"Macron",deg:"Εγγεγραμμένο σημάδι ",sup2:"Superscript two",sup3:"Superscript three",acute:"Οξεία προφορά ",micro:"Micro σημάδι ",para:"Micro σημάδι ",middot:"Μέση τελεια",cedil:"Υποστιγμή ",sup1:"Superscript one",ordm:"Αρσενικος τακτικός δείκτης ",raquo:"Δεξιος χαρακτήρας διπλού εισαγωγικού",frac14:"Χυδαίο κλάσμα του ενός τετάρτου ",frac12:"Χυδαίο κλάσμα το ήμισυ ",
+frac34:"Χυδαίο κλάσμα τρία τέταρτα ",iquest:"Ανάποδο θαυμαστικό",Agrave:"Λατινικο κεφαλαίο γράμμα Α με βαρεία ",Aacute:"Λατινικο κεφαλαίο γράμμα Α με οξεία ",Acirc:"Λατινικο Α κεφαλαίο γράμμα με περισπωμένη ",Atilde:"Λατινικο κεφαλαίο γράμμα Α με περισπωμένη ",Auml:"Λατινικο κεφαλαίο γράμμα Α με διαλυτικά ",Aring:"Λατινικο κεφαλαίο γράμμα Α με δακτύλιο επάνω ",AElig:"Λατινικό γράμμα CAPITAL Æ",Ccedil:"Λατινικο κεφαλαίο γράμμα C με υπογεγραμμένη",Egrave:"Λατινικο Ε κεφαλαίο γράμμα με βαρεία ",Eacute:"Λατινική Ε κεφαλαίο γράμμα με οξεία ",
+Ecirc:"Λατινικο Ε κεφαλαίο γράμμα με περισπωμένη ",Euml:"Λατινικο Ε κεφαλαίο γράμμα με διαλυτικά ",Igrave:"Λατινικο κεφαλαίο γράμμα I με βαρεία ",Iacute:"Λατινικο κεφαλαίο γράμμα I με οξεία ",Icirc:"Λατινικο I κεφαλαίο γράμμα με περισπωμένη ",Iuml:"Λατινικο κεφαλαίο γράμμα I με διαλυτικά ",ETH:"Λατινικο κεφαλαίο γράμμα Eth",Ntilde:"Λατινικο κεφαλαίο γράμμα Ν με περισπωμένη ",Ograve:"Λατινικο κεφαλαίο γράμμα Ο με βαρεία ",Oacute:"Λατινικο κεφαλαίο γράμμα Ο με οξεία ",Ocirc:"Λατινικο Ο κεφαλαίο γράμμα με περισπωμένη ",
+Otilde:"Λατινικο κεφαλαίο γράμμα Ο με περισπωμένη ",Ouml:"Λατινικο κεφαλαίο γράμμα Ο με διαλυτικά ",times:"Σύμβολο πολλαπλασιασμού ",Oslash:"Λατινικο κεφαλαίο γράμμα O με διαδρομη",Ugrave:"Λατινικο κεφαλαίο γράμμα U με βαρεία ",Uacute:"Λατινικο κεφαλαίο γράμμα U με οξεία ",Ucirc:"Λατινικο U κεφαλαίο γράμμα με περισπωμένη ",Uuml:"Λατινικο κεφαλαίο γράμμα U με διαλυτικά ",Yacute:"Λατινικο κεφαλαίο γράμμα Y με οξεία ",THORN:"Λατινικο Thorn κεφαλαίο γράμμα ",szlig:"Λατινική μικρό γράμμα απότομο s ",agrave:"Λατινικο μικρό γράμμα Α με βαρεία ",
+aacute:"Λατινικο μικρό γράμμα α με οξεία ",acirc:"Λατινικο μικρό γράμμα α με περισπωμένη ",atilde:"Λατινικο μικρό γράμμα α με περισπωμένη ",auml:"Λατινικο μικρό γράμμα α με διαλυτικά ",aring:"Λατινικο μικρό γράμμα α με δακτύλιο πάνω ",aelig:"Λατινικο μικρό γράμμα æ",ccedil:"Λατινικο μικρό γράμμα c με υπογεγραμμένη ",egrave:"Λατινικο μικρό γράμμα ε με βαρεία ",eacute:"Λατινικο μικρό γράμμα ε με οξεία ",ecirc:"Λατινική μικρό γράμμα ε με περισπωμένη ",euml:"Λατινικο μικρό γράμμα ε με διαλυτικά ",igrave:"Λατινικο μικρό γράμμα i με βαρεία ",
+iacute:"Λατινική μικρό γράμμα i με οξεία ",icirc:"Λατινικο μικρό γράμμα i με περισπωμένη",iuml:"Λατινικο μικρό γράμμα i με διαλυτικά ",eth:"Λατινικο μικρό γράμμα eth ",ntilde:"Λατινικο μικρό γράμμα n με περισπωμένη ",ograve:"Λατινικο μικρό γράμμα ο με βαρεία ",oacute:"Λατινικο μικρό γράμμα ο με οξεία ",ocirc:"Λατινικό πεζό γράμμα o με περισπωμένη ",otilde:"Λατινική μικρό γράμμα ο με περισπωμένη ",ouml:"Λατινική μικρό γράμμα ο με διαλυτικά ",divide:"Σύμβολο διαίρεσης",oslash:"Λατινική μικρό γράμμα ο με περισπωμένη ",
+ugrave:"Λατινικο μικρό γράμμα u  με βαρεία ",uacute:"Λατινικο μικρό γράμμα u  με οξεία ",ucirc:"Λατινικο μικρό γράμμα u  με περισπωμένη ",uuml:"Λατινικο μικρό γράμμα u  με διαλυτικά ",yacute:"Λατινικο μικρό γράμμα y με οξεία ",thorn:"Λατινικο μικρό γράμμα thorn",yuml:"Λατινικο μικρό γράμμα y με διαλυτικά ",OElig:"Λατινική κεφαλαίο λογόγραμμα ΟΕ ",oelig:"Λατινική μικρό λογόγραμμα oe ",372:"Λατινικο W κεφαλαίο γράμμα με περισπωμένη ",374:"Λατινικο Y κεφαλαίο γράμμα με περισπωμένη ",373:"Λατινικο μικρό γράμμα w με περισπωμένη ",
+375:"Λατινικο μικρό γράμμα y με περισπωμένη ",sbquo:"Ενιαίο χαμηλο -9 εισαγωγικό ",8219:"Ενιαίο υψηλο ανεστραμμένηο -9 εισαγωγικό ",bdquo:"Διπλό χαμηλό -9 εισαγωγικό ",hellip:"Οριζόντια αποσιωπητικά ",trade:"Σύμβολο Εμπορικόυ Κατατεθέν",9658:"Μαύρο δείχνει προς τα δεξιά ",bull:"Κουκκίδα ",rarr:"Προς τα δεξιά ",rArr:"Προς τα δεξιά ",hArr:"Αριστερά Δεξιά διπλό βέλος ",diams:"Μαύρο διαμάντι",asymp:"Σχεδόν ίση με "});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/en.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/en.js
new file mode 100644
index 00000000..c973e03f
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/en.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","en",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Yen sign",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/eo.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/eo.js
new file mode 100644
index 00000000..f937dc0a
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/eo.js
@@ -0,0 +1,12 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","eo",{euro:"Eŭrosigno",lsquo:"Supra 6-citilo",rsquo:"Supra 9-citilo",ldquo:"Supra 66-citilo",rdquo:"Supra 99-citilo",ndash:"Streketo",mdash:"Substreko",iexcl:"Renversita krisigno",cent:"Cendosigno",pound:"Pundosigno",curren:"Monersigno",yen:"Enosigno",brvbar:"Rompita vertikala streko",sect:"Kurba paragrafo",uml:"Tremao",copy:"Kopirajtosigno",ordf:"Adjektiva numerfinaĵo",laquo:"Duobla malplio-citilo",not:"Negohoko",reg:"Registrita marko",macr:"Superstreko",deg:"Gradosigno",
+sup2:"Supra indico 2",sup3:"Supra indico 3",acute:"Dekstra korno",micro:"Mikrosigno",para:"Rekta paragrafo",middot:"Meza punkto",cedil:"Zoeto",sup1:"Supra indico 1",ordm:"Substantiva numerfinaĵo",raquo:"Duobla plio-citilo",frac14:"Kvaronosigno",frac12:"Duonosigno",frac34:"Trikvaronosigno",iquest:"renversita demandosigno",Agrave:"Latina ĉeflitero A kun liva korno",Aacute:"Latina ĉeflitero A kun dekstra korno",Acirc:"Latina ĉeflitero A kun ĉapelo",Atilde:"Latina ĉeflitero A kun tildo",Auml:"Latina ĉeflitero A kun tremao",
+Aring:"Latina ĉeflitero A kun superringo",AElig:"Latina ĉeflitera ligaturo Æ",Ccedil:"Latina ĉeflitero C kun zoeto",Egrave:"Latina ĉeflitero E kun liva korno",Eacute:"Latina ĉeflitero E kun dekstra korno",Ecirc:"Latina ĉeflitero E kun ĉapelo",Euml:"Latina ĉeflitero E kun tremao",Igrave:"Latina ĉeflitero I kun liva korno",Iacute:"Latina ĉeflitero I kun dekstra korno",Icirc:"Latina ĉeflitero I kun ĉapelo",Iuml:"Latina ĉeflitero I kun tremao",ETH:"Latina ĉeflitero islanda edo",Ntilde:"Latina ĉeflitero N kun tildo",
+Ograve:"Latina ĉeflitero O kun liva korno",Oacute:"Latina ĉeflitero O kun dekstra korno",Ocirc:"Latina ĉeflitero O kun ĉapelo",Otilde:"Latina ĉeflitero O kun tildo",Ouml:"Latina ĉeflitero O kun tremao",times:"Multipliko",Oslash:"Latina ĉeflitero O trastrekita",Ugrave:"Latina ĉeflitero U kun liva korno",Uacute:"Latina ĉeflitero U kun dekstra korno",Ucirc:"Latina ĉeflitero U kun ĉapelo",Uuml:"Latina ĉeflitero U kun tremao",Yacute:"Latina ĉeflitero Y kun dekstra korno",THORN:"Latina ĉeflitero islanda dorno",
+szlig:"Latina etlitero germana sozo (akra s)",agrave:"Latina etlitero a kun liva korno",aacute:"Latina etlitero a kun dekstra korno",acirc:"Latina etlitero a kun ĉapelo",atilde:"Latina etlitero a kun tildo",auml:"Latina etlitero a kun tremao",aring:"Latina etlitero a kun superringo",aelig:"Latina etlitera ligaturo æ",ccedil:"Latina etlitero c kun zoeto",egrave:"Latina etlitero e kun liva korno",eacute:"Latina etlitero e kun dekstra korno",ecirc:"Latina etlitero e kun ĉapelo",euml:"Latina etlitero e kun tremao",
+igrave:"Latina etlitero i kun liva korno",iacute:"Latina etlitero i kun dekstra korno",icirc:"Latina etlitero i kun ĉapelo",iuml:"Latina etlitero i kun tremao",eth:"Latina etlitero islanda edo",ntilde:"Latina etlitero n kun tildo",ograve:"Latina etlitero o kun liva korno",oacute:"Latina etlitero o kun dekstra korno",ocirc:"Latina etlitero o kun ĉapelo",otilde:"Latina etlitero o kun tildo",ouml:"Latina etlitero o kun tremao",divide:"Dividosigno",oslash:"Latina etlitero o trastrekita",ugrave:"Latina etlitero u kun liva korno",
+uacute:"Latina etlitero u kun dekstra korno",ucirc:"Latina etlitero u kun ĉapelo",uuml:"Latina etlitero u kun tremao",yacute:"Latina etlitero y kun dekstra korno",thorn:"Latina etlitero islanda dorno",yuml:"Latina etlitero y kun tremao",OElig:"Latina ĉeflitera ligaturo Œ",oelig:"Latina etlitera ligaturo œ",372:"Latina ĉeflitero W kun ĉapelo",374:"Latina ĉeflitero Y kun ĉapelo",373:"Latina etlitero w kun ĉapelo",375:"Latina etlitero y kun ĉapelo",sbquo:"Suba 9-citilo",8219:"Supra renversita 9-citilo",
+bdquo:"Suba 99-citilo",hellip:"Tripunkto",trade:"Varmarka signo",9658:"Nigra sago dekstren",bull:"Bulmarko",rarr:"Sago dekstren",rArr:"Duobla sago dekstren",hArr:"Duobla sago maldekstren",diams:"Nigra kvadrato",asymp:"Preskaŭ egala"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/es.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/es.js
new file mode 100644
index 00000000..b1254c9d
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/es.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","es",{euro:"Símbolo de euro",lsquo:"Comilla simple izquierda",rsquo:"Comilla simple derecha",ldquo:"Comilla doble izquierda",rdquo:"Comilla doble derecha",ndash:"Guión corto",mdash:"Guión medio largo",iexcl:"Signo de admiración invertido",cent:"Símbolo centavo",pound:"Símbolo libra",curren:"Símbolo moneda",yen:"Símbolo yen",brvbar:"Barra vertical rota",sect:"Símbolo sección",uml:"Diéresis",copy:"Signo de derechos de autor",ordf:"Indicador ordinal femenino",laquo:"Abre comillas angulares",
+not:"Signo negación",reg:"Signo de marca registrada",macr:"Guión alto",deg:"Signo de grado",sup2:"Superíndice dos",sup3:"Superíndice tres",acute:"Acento agudo",micro:"Signo micro",para:"Signo de pi",middot:"Punto medio",cedil:"Cedilla",sup1:"Superíndice uno",ordm:"Indicador orginal masculino",raquo:"Cierra comillas angulares",frac14:"Fracción ordinaria de un quarto",frac12:"Fracción ordinaria de una mitad",frac34:"Fracción ordinaria de tres cuartos",iquest:"Signo de interrogación invertido",Agrave:"Letra A latina mayúscula con acento grave",
+Aacute:"Letra A latina  mayúscula con acento agudo",Acirc:"Letra A latina mayúscula con acento circunflejo",Atilde:"Letra A latina mayúscula con tilde",Auml:"Letra A latina mayúscula con diéresis",Aring:"Letra A latina mayúscula con aro arriba",AElig:"Letra Æ latina mayúscula",Ccedil:"Letra C latina mayúscula con cedilla",Egrave:"Letra E latina mayúscula con acento grave",Eacute:"Letra E latina mayúscula con acento agudo",Ecirc:"Letra E latina mayúscula con acento circunflejo",Euml:"Letra E latina mayúscula con diéresis",
+Igrave:"Letra I latina mayúscula con acento grave",Iacute:"Letra I latina mayúscula con acento agudo",Icirc:"Letra I latina mayúscula con acento circunflejo",Iuml:"Letra I latina mayúscula con diéresis",ETH:"Letra Eth latina mayúscula",Ntilde:"Letra N latina mayúscula con tilde",Ograve:"Letra O latina mayúscula con acento grave",Oacute:"Letra O latina mayúscula con acento agudo",Ocirc:"Letra O latina mayúscula con acento circunflejo",Otilde:"Letra O latina mayúscula con tilde",Ouml:"Letra O latina mayúscula con diéresis",
+times:"Signo de multiplicación",Oslash:"Letra O latina mayúscula con barra inclinada",Ugrave:"Letra U latina mayúscula con acento grave",Uacute:"Letra U latina mayúscula con acento agudo",Ucirc:"Letra U latina mayúscula con acento circunflejo",Uuml:"Letra U latina mayúscula con diéresis",Yacute:"Letra Y latina mayúscula con acento agudo",THORN:"Letra Thorn latina mayúscula",szlig:"Letra s latina fuerte pequeña",agrave:"Letra a latina pequeña con acento grave",aacute:"Letra a latina pequeña con acento agudo",
+acirc:"Letra a latina pequeña con acento circunflejo",atilde:"Letra a latina pequeña con tilde",auml:"Letra a latina pequeña con diéresis",aring:"Letra a latina pequeña con aro arriba",aelig:"Letra æ latina pequeña",ccedil:"Letra c latina pequeña con cedilla",egrave:"Letra e latina pequeña con acento grave",eacute:"Letra e latina pequeña con acento agudo",ecirc:"Letra e latina pequeña con acento circunflejo",euml:"Letra e latina pequeña con diéresis",igrave:"Letra i latina pequeña con acento grave",
+iacute:"Letra i latina pequeña con acento agudo",icirc:"Letra i latina pequeña con acento circunflejo",iuml:"Letra i latina pequeña con diéresis",eth:"Letra eth latina pequeña",ntilde:"Letra n latina pequeña con tilde",ograve:"Letra o latina pequeña con acento grave",oacute:"Letra o latina pequeña con acento agudo",ocirc:"Letra o latina pequeña con acento circunflejo",otilde:"Letra o latina pequeña con tilde",ouml:"Letra o latina pequeña con diéresis",divide:"Signo de división",oslash:"Letra o latina minúscula con barra inclinada",
+ugrave:"Letra u latina pequeña con acento grave",uacute:"Letra u latina pequeña con acento agudo",ucirc:"Letra u latina pequeña con acento circunflejo",uuml:"Letra u latina pequeña con diéresis",yacute:"Letra u latina pequeña con acento agudo",thorn:"Letra thorn latina minúscula",yuml:"Letra y latina pequeña con diéresis",OElig:"Diptongo OE latino en mayúscula",oelig:"Diptongo oe latino en minúscula",372:"Letra W latina mayúscula con acento circunflejo",374:"Letra Y latina mayúscula con acento circunflejo",
+373:"Letra w latina pequeña con acento circunflejo",375:"Letra y latina pequeña con acento circunflejo",sbquo:"Comilla simple baja-9",8219:"Comilla simple alta invertida-9",bdquo:"Comillas dobles bajas-9",hellip:"Puntos suspensivos horizontales",trade:"Signo de marca registrada",9658:"Apuntador negro apuntando a la derecha",bull:"Viñeta",rarr:"Flecha a la derecha",rArr:"Flecha doble a la derecha",hArr:"Flecha izquierda derecha doble",diams:"Diamante negro",asymp:"Casi igual a"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/et.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/et.js
new file mode 100644
index 00000000..d6e875e6
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/et.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","et",{euro:"Euromärk",lsquo:"Alustav ühekordne jutumärk",rsquo:"Lõpetav ühekordne jutumärk",ldquo:"Alustav kahekordne jutumärk",rdquo:"Lõpetav kahekordne jutumärk",ndash:"Enn-kriips",mdash:"Emm-kriips",iexcl:"Pööratud hüüumärk",cent:"Sendimärk",pound:"Naela märk",curren:"Valuutamärk",yen:"Jeeni märk",brvbar:"Katkestatud kriips",sect:"Lõigu märk",uml:"Täpid",copy:"Autoriõiguse märk",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Ei-märk",reg:"Registered sign",macr:"Macron",deg:"Kraadimärk",sup2:"Ülaindeks kaks",sup3:"Ülaindeks kolm",acute:"Acute accent",micro:"Mikro-märk",para:"Pilcrow sign",middot:"Keskpunkt",cedil:"Cedilla",sup1:"Ülaindeks üks",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Ladina suur A tildega",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Täppidega ladina suur O",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Kandilise katusega suur ladina U",Uuml:"Täppidega ladina suur U",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Ladina väike terav s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Kandilise katusega ladina väike a",atilde:"Tildega ladina väike a",auml:"Täppidega ladina väike a",aring:"Latin small letter a with ring above",
+aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde",
+ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Jagamismärk",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",
+thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Kaubamärgi märk",9658:"Black right-pointing pointer",
+bull:"Kuul",rarr:"Nool paremale",rArr:"Topeltnool paremale",hArr:"Topeltnool vasakule",diams:"Black diamond suit",asymp:"Ligikaudu võrdne"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/fa.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/fa.js
new file mode 100644
index 00000000..b32ff771
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/fa.js
@@ -0,0 +1,12 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","fa",{euro:"نشان یورو",lsquo:"علامت نقل قول تکی چپ",rsquo:"علامت نقل قول تکی راست",ldquo:"علامت نقل قول دوتایی چپ",rdquo:"علامت نقل قول دوتایی راست",ndash:"خط تیره En",mdash:"خط تیره Em",iexcl:"علامت تعجب وارونه",cent:"نشان سنت",pound:"نشان پوند",curren:"نشان ارز",yen:"نشان ین",brvbar:"نوار شکسته",sect:"نشان بخش",uml:"نشان سواگیری",copy:"نشان کپی رایت",ordf:"شاخص ترتیبی مونث",laquo:"اشاره چپ مکرر برای زاویه علامت نقل قول",not:"نشان ثبت نشده",reg:"نشان ثبت شده",
+macr:"نشان خط بالای حرف",deg:"نشان درجه",sup2:"بالانویس دو",sup3:"بالانویس سه",acute:"لهجه غلیظ",micro:"نشان مایکرو",para:"نشان محل بند",middot:"نقطه میانی",cedil:"سدیل",sup1:"بالانویس 1",ordm:"شاخص ترتیبی مذکر",raquo:"نشان زاویه‌دار دوتایی نقل قول راست چین",frac14:"واحد عامیانه 1/4",frac12:"واحد عامینه نصف",frac34:"واحد عامیانه 3/4",iquest:"علامت سوال معکوس",Agrave:"حرف A بزرگ لاتین با تلفظ غلیظ",Aacute:"حرف A بزرگ لاتین با تلفظ شدید",Acirc:"حرف A بزرگ لاتین با دور",Atilde:"حرف A بزرگ لاتین با صدای کامی",
+Auml:"حرف A بزرگ لاتین با نشان سواگیری",Aring:"حرف A بزرگ لاتین با حلقه بالا",AElig:"حرف Æ بزرگ لاتین",Ccedil:"حرف C بزرگ لاتین با نشان سواگیری",Egrave:"حرف E بزرگ لاتین با تلفظ درشت",Eacute:"حرف E بزرگ لاتین با تلفظ زیر",Ecirc:"حرف E بزرگ لاتین با خمان",Euml:"حرف E بزرگ لاتین با نشان سواگیری",Igrave:"حرف I بزرگ لاتین با تلفظ درشت",Iacute:"حرف I بزرگ لاتین با تلفظ ریز",Icirc:"حرف I بزرگ لاتین با خمان",Iuml:"حرف I بزرگ لاتین با نشان سواگیری",ETH:"حرف لاتین بزرگ واکه ترتیبی",Ntilde:"حرف N بزرگ لاتین با مد",
+Ograve:"حرف O بزرگ لاتین با تلفظ درشت",Oacute:"حرف O بزرگ لاتین با تلفظ ریز",Ocirc:"حرف O بزرگ لاتین با خمان",Otilde:"حرف O بزرگ لاتین با مد",Ouml:"حرف O بزرگ لاتین با نشان سواگیری",times:"نشان ضربدر",Oslash:"حرف O بزرگ لاتین با میان خط",Ugrave:"حرف U بزرگ لاتین با تلفظ درشت",Uacute:"حرف U بزرگ لاتین با تلفظ ریز",Ucirc:"حرف U بزرگ لاتین با خمان",Uuml:"حرف U بزرگ لاتین با نشان سواگیری",Yacute:"حرف Y بزرگ لاتین با تلفظ ریز",THORN:"حرف بزرگ لاتین خاردار",szlig:"حرف کوچک لاتین شارپ s",agrave:"حرف a کوچک لاتین با تلفظ درشت",
+aacute:"حرف a کوچک لاتین با تلفظ ریز",acirc:"حرف a کوچک لاتین با خمان",atilde:"حرف a کوچک لاتین با صدای کامی",auml:"حرف a کوچک لاتین با نشان سواگیری",aring:"حرف a کوچک لاتین گوشواره دار",aelig:"حرف کوچک لاتین æ",ccedil:"حرف c کوچک لاتین با نشان سدیل",egrave:"حرف e کوچک لاتین با تلفظ درشت",eacute:"حرف e کوچک لاتین با تلفظ ریز",ecirc:"حرف e کوچک لاتین با خمان",euml:"حرف e کوچک لاتین با نشان سواگیری",igrave:"حرف i کوچک لاتین با تلفظ درشت",iacute:"حرف i کوچک لاتین با تلفظ ریز",icirc:"حرف i کوچک لاتین با خمان",
+iuml:"حرف i کوچک لاتین با نشان سواگیری",eth:"حرف کوچک لاتین eth",ntilde:"حرف n کوچک لاتین با صدای کامی",ograve:"حرف o کوچک لاتین با تلفظ درشت",oacute:"حرف o کوچک لاتین با تلفظ زیر",ocirc:"حرف o کوچک لاتین با خمان",otilde:"حرف o کوچک لاتین با صدای کامی",ouml:"حرف o کوچک لاتین با نشان سواگیری",divide:"نشان بخش",oslash:"حرف o کوچک لاتین با میان خط",ugrave:"حرف u کوچک لاتین با تلفظ درشت",uacute:"حرف u کوچک لاتین با تلفظ ریز",ucirc:"حرف u کوچک لاتین با خمان",uuml:"حرف u کوچک لاتین با نشان سواگیری",yacute:"حرف y کوچک لاتین با تلفظ ریز",
+thorn:"حرف کوچک لاتین خاردار",yuml:"حرف y کوچک لاتین با نشان سواگیری",OElig:"بند بزرگ لاتین OE",oelig:"بند کوچک لاتین oe",372:"حرف W بزرگ لاتین با خمان",374:"حرف Y بزرگ لاتین با خمان",373:"حرف w کوچک لاتین با خمان",375:"حرف y کوچک لاتین با خمان",sbquo:"نشان نقل قول تکی زیر-9",8219:"نشان نقل قول تکی high-reversed-9",bdquo:"نقل قول دوتایی پایین-9",hellip:"حذف افقی",trade:"نشان تجاری",9658:"نشانگر سیاه جهت راست",bull:"گلوله",rarr:"فلش راست",rArr:"فلش دوتایی راست",hArr:"فلش دوتایی چپ راست",diams:"نشان الماس سیاه",
+asymp:"تقریبا برابر با"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/fi.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/fi.js
new file mode 100644
index 00000000..33f76c2d
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/fi.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","fi",{euro:"Euron merkki",lsquo:"Vasen yksittäinen lainausmerkki",rsquo:"Oikea yksittäinen lainausmerkki",ldquo:"Vasen kaksoislainausmerkki",rdquo:"Oikea kaksoislainausmerkki",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Sentin merkki",pound:"Punnan merkki",curren:"Valuuttamerkki",yen:"Yenin merkki",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Not sign",reg:"Rekisteröity merkki",macr:"Macron",deg:"Asteen merkki",sup2:"Yläindeksi kaksi",sup3:"Yläindeksi kolme",acute:"Acute accent",micro:"Mikron merkki",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Yläindeksi yksi",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Ylösalaisin oleva kysymysmerkki",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Kertomerkki",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Jakomerkki",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Tavaramerkki merkki",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Nuoli oikealle",rArr:"Kaksoisnuoli oikealle",hArr:"Kaksoisnuoli oikealle ja vasemmalle",diams:"Black diamond suit",asymp:"Noin"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/fr-ca.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/fr-ca.js
new file mode 100644
index 00000000..92c5afc7
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/fr-ca.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","fr-ca",{euro:"Symbole Euro",lsquo:"Guillemet simple ouvrant",rsquo:"Guillemet simple fermant",ldquo:"Guillemet double ouvrant",rdquo:"Guillemet double fermant",ndash:"Tiret haut",mdash:"Tiret",iexcl:"Point d'exclamation inversé",cent:"Symbole de cent",pound:"Symbole de Livre Sterling",curren:"Symbole monétaire",yen:"Symbole du Yen",brvbar:"Barre scindée",sect:"Symbole de section",uml:"Tréma",copy:"Symbole de copyright",ordf:"Indicateur ordinal féminin",laquo:"Guillemet français ouvrant",
+not:"Indicateur de négation",reg:"Symbole de marque déposée",macr:"Macron",deg:"Degré",sup2:"Exposant 2",sup3:"Exposant 3",acute:"Accent aigüe",micro:"Symbole micro",para:"Paragraphe",middot:"Point médian",cedil:"Cédille",sup1:"Exposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet français fermant",frac14:"Un quart",frac12:"Une demi",frac34:"Trois quart",iquest:"Point d'interrogation inversé",Agrave:"A accent grave",Aacute:"A accent aigüe",Acirc:"A circonflexe",Atilde:"A tilde",Auml:"A tréma",
+Aring:"A avec un rond au dessus",AElig:"Æ majuscule",Ccedil:"C cédille",Egrave:"E accent grave",Eacute:"E accent aigüe",Ecirc:"E accent circonflexe",Euml:"E tréma",Igrave:"I accent grave",Iacute:"I accent aigüe",Icirc:"I accent circonflexe",Iuml:"I tréma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N tilde",Ograve:"O accent grave",Oacute:"O accent aigüe",Ocirc:"O accent circonflexe",Otilde:"O tilde",Ouml:"O tréma",times:"Symbole de multiplication",Oslash:"O barré",Ugrave:"U accent grave",Uacute:"U accent aigüe",
+Ucirc:"U accent circonflexe",Uuml:"U tréma",Yacute:"Y accent aigüe",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a accent grave",aacute:"a accent aigüe",acirc:"a accent circonflexe",atilde:"a tilde",auml:"a tréma",aring:"a avec un cercle au dessus",aelig:"æ",ccedil:"c cédille",egrave:"e accent grave",eacute:"e accent aigüe",ecirc:"e accent circonflexe",euml:"e tréma",igrave:"i accent grave",iacute:"i accent aigüe",icirc:"i accent circonflexe",iuml:"i tréma",
+eth:"Lettre minuscule islandaise ED",ntilde:"n tilde",ograve:"o accent grave",oacute:"o accent aigüe",ocirc:"O accent circonflexe",otilde:"O tilde",ouml:"O tréma",divide:"Symbole de division",oslash:"o barré",ugrave:"u accent grave",uacute:"u accent aigüe",ucirc:"u accent circonflexe",uuml:"u tréma",yacute:"y accent aigüe",thorn:"Lettre islandaise thorn minuscule",yuml:"y tréma",OElig:"ligature majuscule latine Œ",oelig:"ligature minuscule latine œ",372:"W accent circonflexe",374:"Y accent circonflexe",
+373:"w accent circonflexe",375:"y accent circonflexe",sbquo:"Guillemet simple fermant",8219:"Guillemet-virgule supérieur culbuté",bdquo:"Guillemet-virgule double inférieur",hellip:"Points de suspension",trade:"Symbole de marque déposée",9658:"Flèche noire pointant vers la droite",bull:"Puce",rarr:"Flèche vers la droite",rArr:"Flèche double vers la droite",hArr:"Flèche double vers la gauche",diams:"Carreau",asymp:"Presque égal"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/fr.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/fr.js
new file mode 100644
index 00000000..7a275e47
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/fr.js
@@ -0,0 +1,11 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","fr",{euro:"Symbole Euro",lsquo:"Guillemet simple ouvrant",rsquo:"Guillemet simple fermant",ldquo:"Guillemet double ouvrant",rdquo:"Guillemet double fermant",ndash:"Tiret haut",mdash:"Tiret cadratin",iexcl:"Point d'exclamation inversé",cent:"Symbole Cent",pound:"Symbole Livre Sterling",curren:"Symbole monétaire",yen:"Symbole Yen",brvbar:"Barre verticale scindée",sect:"Section",uml:"Tréma",copy:"Symbole Copyright",ordf:"Indicateur ordinal féminin",laquo:"Guillemet français ouvrant",
+not:"Crochet de négation",reg:"Marque déposée",macr:"Macron",deg:"Degré",sup2:"Exposant 2",sup3:"\\tExposant 3",acute:"Accent aigu",micro:"Omicron",para:"Paragraphe",middot:"Point médian",cedil:"Cédille",sup1:"\\tExposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet français fermant",frac14:"Un quart",frac12:"Un demi",frac34:"Trois quarts",iquest:"Point d'interrogation inversé",Agrave:"A majuscule accent grave",Aacute:"A majuscule accent aigu",Acirc:"A majuscule accent circonflexe",Atilde:"A majuscule avec caron",
+Auml:"A majuscule tréma",Aring:"A majuscule avec un rond au-dessus",AElig:"Æ majuscule ligaturés",Ccedil:"C majuscule cédille",Egrave:"E majuscule accent grave",Eacute:"E majuscule accent aigu",Ecirc:"E majuscule accent circonflexe",Euml:"E majuscule tréma",Igrave:"I majuscule accent grave",Iacute:"I majuscule accent aigu",Icirc:"I majuscule accent circonflexe",Iuml:"I majuscule tréma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N majuscule avec caron",Ograve:"O majuscule accent grave",Oacute:"O majuscule accent aigu",
+Ocirc:"O majuscule accent circonflexe",Otilde:"O majuscule avec caron",Ouml:"O majuscule tréma",times:"Multiplication",Oslash:"O majuscule barré",Ugrave:"U majuscule accent grave",Uacute:"U majuscule accent aigu",Ucirc:"U majuscule accent circonflexe",Uuml:"U majuscule tréma",Yacute:"Y majuscule accent aigu",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a minuscule accent grave",aacute:"a minuscule accent aigu",acirc:"a minuscule accent circonflexe",atilde:"a minuscule avec caron",
+auml:"a minuscule tréma",aring:"a minuscule avec un rond au-dessus",aelig:"æ minuscule ligaturés",ccedil:"c minuscule cédille",egrave:"e minuscule accent grave",eacute:"e minuscule accent aigu",ecirc:"e minuscule accent circonflexe",euml:"e minuscule tréma",igrave:"i minuscule accent grave",iacute:"i minuscule accent aigu",icirc:"i minuscule accent circonflexe",iuml:"i minuscule tréma",eth:"Lettre minuscule islandaise ED",ntilde:"n minuscule avec caron",ograve:"o minuscule accent grave",oacute:"o minuscule accent aigu",
+ocirc:"o minuscule accent circonflexe",otilde:"o minuscule avec caron",ouml:"o minuscule tréma",divide:"Division",oslash:"o minuscule barré",ugrave:"u minuscule accent grave",uacute:"u minuscule accent aigu",ucirc:"u minuscule accent circonflexe",uuml:"u minuscule tréma",yacute:"y minuscule accent aigu",thorn:"Lettre islandaise thorn minuscule",yuml:"y minuscule tréma",OElig:"ligature majuscule latine Œ",oelig:"ligature minuscule latine œ",372:"W majuscule accent circonflexe",374:"Y majuscule accent circonflexe",
+373:"w minuscule accent circonflexe",375:"y minuscule accent circonflexe",sbquo:"Guillemet simple fermant (anglais)",8219:"Guillemet-virgule supérieur culbuté",bdquo:"Guillemet-virgule double inférieur",hellip:"Points de suspension",trade:"Marque commerciale (trade mark)",9658:"Flèche noire pointant vers la droite",bull:"Gros point médian",rarr:"Flèche vers la droite",rArr:"Double flèche vers la droite",hArr:"Double flèche vers la gauche",diams:"Carreau noir",asymp:"Presque égal"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/gl.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/gl.js
new file mode 100644
index 00000000..c6592492
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/gl.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","gl",{euro:"Símbolo do euro",lsquo:"Comiña simple esquerda",rsquo:"Comiña simple dereita",ldquo:"Comiñas dobres esquerda",rdquo:"Comiñas dobres dereita",ndash:"Guión",mdash:"Raia",iexcl:"Signo de admiración invertido",cent:"Símbolo do centavo",pound:"Símbolo da libra",curren:"Símbolo de moeda",yen:"Símbolo do yen",brvbar:"Barra vertical rota",sect:"Símbolo de sección",uml:"Diérese",copy:"Símbolo de dereitos de autoría",ordf:"Indicador ordinal feminino",laquo:"Comiñas latinas, apertura",
+not:"Signo negación",reg:"Símbolo de marca rexistrada",macr:"Guión alto",deg:"Signo de grao",sup2:"Superíndice dous",sup3:"Superíndice tres",acute:"Acento agudo",micro:"Signo de micro",para:"Signo de pi",middot:"Punto medio",cedil:"Cedilla",sup1:"Superíndice un",ordm:"Indicador ordinal masculino",raquo:"Comiñas latinas, peche",frac14:"Fracción ordinaria de un cuarto",frac12:"Fracción ordinaria de un medio",frac34:"Fracción ordinaria de tres cuartos",iquest:"Signo de interrogación invertido",Agrave:"Letra A latina maiúscula con acento grave",
+Aacute:"Letra A latina maiúscula con acento agudo",Acirc:"Letra A latina maiúscula con acento circunflexo",Atilde:"Letra A latina maiúscula con til",Auml:"Letra A latina maiúscula con diérese",Aring:"Letra A latina maiúscula con aro enriba",AElig:"Letra Æ latina maiúscula",Ccedil:"Letra C latina maiúscula con cedilla",Egrave:"Letra E latina maiúscula con acento grave",Eacute:"Letra E latina maiúscula con acento agudo",Ecirc:"Letra E latina maiúscula con acento circunflexo",Euml:"Letra E latina maiúscula con diérese",
+Igrave:"Letra I latina maiúscula con acento grave",Iacute:"Letra I latina maiúscula con acento agudo",Icirc:"Letra I latina maiúscula con acento circunflexo",Iuml:"Letra I latina maiúscula con diérese",ETH:"Letra Ed latina maiúscula",Ntilde:"Letra N latina maiúscula con til",Ograve:"Letra O latina maiúscula con acento grave",Oacute:"Letra O latina maiúscula con acento agudo",Ocirc:"Letra O latina maiúscula con acento circunflexo",Otilde:"Letra O latina maiúscula con til",Ouml:"Letra O latina maiúscula con diérese",
+times:"Signo de multiplicación",Oslash:"Letra O latina maiúscula con barra transversal",Ugrave:"Letra U latina maiúscula con acento grave",Uacute:"Letra U latina maiúscula con acento agudo",Ucirc:"Letra U latina maiúscula con acento circunflexo",Uuml:"Letra U latina maiúscula con diérese",Yacute:"Letra Y latina maiúscula con acento agudo",THORN:"Letra Thorn latina maiúscula",szlig:"Letra s latina forte minúscula",agrave:"Letra a latina minúscula con acento grave",aacute:"Letra a latina minúscula con acento agudo",
+acirc:"Letra a latina minúscula con acento circunflexo",atilde:"Letra a latina minúscula con til",auml:"Letra a latina minúscula con diérese",aring:"Letra a latina minúscula con aro enriba",aelig:"Letra æ latina minúscula",ccedil:"Letra c latina minúscula con cedilla",egrave:"Letra e latina minúscula con acento grave",eacute:"Letra e latina minúscula con acento agudo",ecirc:"Letra e latina minúscula con acento circunflexo",euml:"Letra e latina minúscula con diérese",igrave:"Letra i latina minúscula con acento grave",
+iacute:"Letra i latina minúscula con acento agudo",icirc:"Letra i latina minúscula con acento circunflexo",iuml:"Letra i latina minúscula con diérese",eth:"Letra ed latina minúscula",ntilde:"Letra n latina minúscula con til",ograve:"Letra o latina minúscula con acento grave",oacute:"Letra o latina minúscula con acento agudo",ocirc:"Letra o latina minúscula con acento circunflexo",otilde:"Letra o latina minúscula con til",ouml:"Letra o latina minúscula con diérese",divide:"Signo de división",oslash:"Letra o latina minúscula con barra transversal",
+ugrave:"Letra u latina minúscula con acento grave",uacute:"Letra u latina minúscula con acento agudo",ucirc:"Letra u latina minúscula con acento circunflexo",uuml:"Letra u latina minúscula con diérese",yacute:"Letra y latina minúscula con acento agudo",thorn:"Letra Thorn latina minúscula",yuml:"Letra y latina minúscula con diérese",OElig:"Ligadura OE latina maiúscula",oelig:"Ligadura oe latina minúscula",372:"Letra W latina maiúscula con acento circunflexo",374:"Letra Y latina maiúscula con acento circunflexo",
+373:"Letra w latina minúscula con acento circunflexo",375:"Letra y latina minúscula con acento circunflexo",sbquo:"Comiña simple baixa, de apertura",8219:"Comiña simple alta, de peche",bdquo:"Comiñas dobres baixas, de apertura",hellip:"Elipse, puntos suspensivos",trade:"Signo de marca rexistrada",9658:"Apuntador negro apuntando á dereita",bull:"Viñeta",rarr:"Frecha á dereita",rArr:"Frecha dobre á dereita",hArr:"Frecha dobre da esquerda á dereita",diams:"Diamante negro",asymp:"Case igual a"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/he.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/he.js
new file mode 100644
index 00000000..29c73983
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/he.js
@@ -0,0 +1,12 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","he",{euro:"יורו",lsquo:"סימן ציטוט יחיד שמאלי",rsquo:"סימן ציטוט יחיד ימני",ldquo:"סימן ציטוט כפול שמאלי",rdquo:"סימן ציטוט כפול ימני",ndash:"קו מפריד קצר",mdash:"קו מפריד ארוך",iexcl:"סימן קריאה הפוך",cent:"סנט",pound:"פאונד",curren:"מטבע",yen:"ין",brvbar:"קו שבור",sect:"סימן מקטע",uml:"שתי נקודות אופקיות (Diaeresis)",copy:"סימן זכויות יוצרים (Copyright)",ordf:"סימן אורדינאלי נקבי",laquo:"סימן ציטוט זווית כפולה לשמאל",not:"סימן שלילה מתמטי",reg:"סימן רשום",
+macr:"מקרון (הגיה ארוכה)",deg:"מעלות",sup2:"2 בכתיב עילי",sup3:"3 בכתיב עילי",acute:"סימן דגוש (Acute)",micro:"מיקרו",para:"סימון פסקה",middot:"נקודה אמצעית",cedil:"סדיליה",sup1:"1 בכתיב עילי",ordm:"סימן אורדינאלי זכרי",raquo:"סימן ציטוט זווית כפולה לימין",frac14:"רבע בשבר פשוט",frac12:"חצי בשבר פשוט",frac34:"שלושה רבעים בשבר פשוט",iquest:"סימן שאלה הפוך",Agrave:"אות לטינית A עם גרש (Grave)",Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",
+Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"אות לטינית Æ גדולה",Ccedil:"Latin capital letter C with cedilla",Egrave:"אות לטינית E עם גרש (Grave)",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"אות לטינית I עם גרש (Grave)",Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",
+ETH:"אות לטינית Eth גדולה",Ntilde:"Latin capital letter N with tilde",Ograve:"אות לטינית O עם גרש (Grave)",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"סימן כפל",Oslash:"Latin capital letter O with stroke",Ugrave:"אות לטינית U עם גרש (Grave)",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",
+Yacute:"Latin capital letter Y with acute accent",THORN:"אות לטינית Thorn גדולה",szlig:"אות לטינית s חדה קטנה",agrave:"אות לטינית a עם גרש (Grave)",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"אות לטינית æ קטנה",ccedil:"Latin small letter c with cedilla",egrave:"אות לטינית e עם גרש (Grave)",eacute:"Latin small letter e with acute accent",
+ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"אות לטינית i עם גרש (Grave)",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"אות לטינית eth קטנה",ntilde:"Latin small letter n with tilde",ograve:"אות לטינית o עם גרש (Grave)",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",
+divide:"סימן חלוקה",oslash:"Latin small letter o with stroke",ugrave:"אות לטינית u עם גרש (Grave)",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"אות לטינית thorn קטנה",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",
+373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"סימן ציטוט נמוך יחיד",8219:"סימן ציטוט",bdquo:"סימן ציטוט נמוך כפול",hellip:"שלוש נקודות",trade:"סימן טריידמארק",9658:"סמן שחור לצד ימין",bull:"תבליט (רשימה)",rarr:"חץ לימין",rArr:"חץ כפול לימין",hArr:"חץ כפול לימין ושמאל",diams:"יהלום מלא",asymp:"כמעט שווה"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/hr.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/hr.js
new file mode 100644
index 00000000..f55749e4
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/hr.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","hr",{euro:"Euro znak",lsquo:"Lijevi jednostruki navodnik",rsquo:"Desni jednostruki navodnik",ldquo:"Lijevi dvostruki navodnik",rdquo:"Desni dvostruki navodnik",ndash:"En crtica",mdash:"Em crtica",iexcl:"Naopaki uskličnik",cent:"Cent znak",pound:"Funta znak",curren:"Znak valute",yen:"Yen znak",brvbar:"Potrgana prečka",sect:"Znak odjeljka",uml:"Prijeglasi",copy:"Copyright znak",ordf:"Feminine ordinal indicator",laquo:"Lijevi dvostruki uglati navodnik",not:"Not znak",
+reg:"Registered znak",macr:"Macron",deg:"Stupanj znak",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Mikro znak",para:"Pilcrow sign",middot:"Srednja točka",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Desni dvostruku uglati navodnik",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Naopaki upitnik",Agrave:"Veliko latinsko slovo A s akcentom",Aacute:"Latin capital letter A with acute accent",
+Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent",
+Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",
+Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",
+aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde",
+ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",
+thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",
+bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/hu.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/hu.js
new file mode 100644
index 00000000..52327ec2
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/hu.js
@@ -0,0 +1,12 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","hu",{euro:"Euró jel",lsquo:"Bal szimpla idézőjel",rsquo:"Jobb szimpla idézőjel",ldquo:"Bal dupla idézőjel",rdquo:"Jobb dupla idézőjel",ndash:"Rövid gondolatjel",mdash:"Hosszú gondolatjel",iexcl:"Fordított felkiáltójel",cent:"Cent jel",pound:"Font jel",curren:"Valuta jel",yen:"Yen jel",brvbar:"Hosszú kettőspont",sect:"Paragrafus jel",uml:"Kettős hangzó jel",copy:"Szerzői jog jel",ordf:"Női sorrend mutatója",laquo:"Balra mutató duplanyíl",not:"Feltételes kötőjel",
+reg:"Bejegyzett védjegy jele",macr:"Hosszúsági jel",deg:"Fok jel",sup2:"Négyzeten jel",sup3:"Köbön jel",acute:"Éles ékezet",micro:"Mikro-jel",para:"Bekezdés jel",middot:"Közép pont",cedil:"Cédille",sup1:"Elsőn jel",ordm:"Férfi sorrend mutatója",raquo:"Jobbra mutató duplanyíl",frac14:"Egy negyed jel",frac12:"Egy ketted jel",frac34:"Három negyed jel",iquest:"Fordított kérdőjel",Agrave:"Latin nagy A fordított ékezettel",Aacute:"Latin nagy A normál ékezettel",Acirc:"Latin nagy A hajtott ékezettel",Atilde:"Latin nagy A hullámjellel",
+Auml:"Latin nagy A kettőspont ékezettel",Aring:"Latin nagy A gyűrű ékezettel",AElig:"Latin nagy Æ betű",Ccedil:"Latin nagy C cedillával",Egrave:"Latin nagy E fordított ékezettel",Eacute:"Latin nagy E normál ékezettel",Ecirc:"Latin nagy E hajtott ékezettel",Euml:"Latin nagy E dupla kettőspont ékezettel",Igrave:"Latin nagy I fordított ékezettel",Iacute:"Latin nagy I normál ékezettel",Icirc:"Latin nagy I hajtott ékezettel",Iuml:"Latin nagy I kettőspont ékezettel",ETH:"Latin nagy Eth betű",Ntilde:"Latin nagy N hullámjellel",
+Ograve:"Latin nagy O fordított ékezettel",Oacute:"Latin nagy O normál ékezettel",Ocirc:"Latin nagy O hajtott ékezettel",Otilde:"Latin nagy O hullámjellel",Ouml:"Latin nagy O kettőspont ékezettel",times:"Szorzás jel",Oslash:"Latin O betű áthúzással",Ugrave:"Latin nagy U fordított ékezettel",Uacute:"Latin nagy U normál ékezettel",Ucirc:"Latin nagy U hajtott ékezettel",Uuml:"Latin nagy U kettőspont ékezettel",Yacute:"Latin nagy Y normál ékezettel",THORN:"Latin nagy Thorn betű",szlig:"Latin kis s betű",
+agrave:"Latin kis a fordított ékezettel",aacute:"Latin kis a normál ékezettel",acirc:"Latin kis a hajtott ékezettel",atilde:"Latin kis a hullámjellel",auml:"Latin kis a kettőspont ékezettel",aring:"Latin kis a gyűrű ékezettel",aelig:"Latin kis æ betű",ccedil:"Latin kis c cedillával",egrave:"Latin kis e fordított ékezettel",eacute:"Latin kis e normál ékezettel",ecirc:"Latin kis e hajtott ékezettel",euml:"Latin kis e dupla kettőspont ékezettel",igrave:"Latin kis i fordított ékezettel",iacute:"Latin kis i normál ékezettel",
+icirc:"Latin kis i hajtott ékezettel",iuml:"Latin kis i kettőspont ékezettel",eth:"Latin kis eth betű",ntilde:"Latin kis n hullámjellel",ograve:"Latin kis o fordított ékezettel",oacute:"Latin kis o normál ékezettel",ocirc:"Latin kis o hajtott ékezettel",otilde:"Latin kis o hullámjellel",ouml:"Latin kis o kettőspont ékezettel",divide:"Osztásjel",oslash:"Latin kis o betű áthúzással",ugrave:"Latin kis u fordított ékezettel",uacute:"Latin kis u normál ékezettel",ucirc:"Latin kis u hajtott ékezettel",
+uuml:"Latin kis u kettőspont ékezettel",yacute:"Latin kis y normál ékezettel",thorn:"Latin kis thorn jel",yuml:"Latin kis y kettőspont ékezettel",OElig:"Latin nagy OE-jel",oelig:"Latin kis oe-jel",372:"Latin nagy W hajtott ékezettel",374:"Latin nagy Y hajtott ékezettel",373:"Latin kis w hajtott ékezettel",375:"Latin kis y hajtott ékezettel",sbquo:"Nyitó nyomdai szimpla idézőjel",8219:"Záró nyomdai záró idézőjel",bdquo:"Nyitó nyomdai dupla idézőjel",hellip:"Három pont",trade:"Kereskedelmi védjegy jele",
+9658:"Jobbra mutató fekete mutató",bull:"Golyó",rarr:"Jobbra mutató nyíl",rArr:"Jobbra mutató duplanyíl",hArr:"Bal-jobb duplanyíl",diams:"Fekete gyémánt jel",asymp:"Majdnem egyenlő jel"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/id.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/id.js
new file mode 100644
index 00000000..7c7885ad
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/id.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","id",{euro:"Tanda Euro",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Tanda Yen",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Tanda Hak Cipta",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Not sign",reg:"Tanda Telah Terdaftar",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/it.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/it.js
new file mode 100644
index 00000000..5bc136f4
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/it.js
@@ -0,0 +1,14 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","it",{euro:"Simbolo Euro",lsquo:"Virgoletta singola sinistra",rsquo:"Virgoletta singola destra",ldquo:"Virgolette aperte",rdquo:"Virgolette chiuse",ndash:"Trattino",mdash:"Trattino lungo",iexcl:"Punto esclavamativo invertito",cent:"Simbolo Cent",pound:"Simbolo Sterlina",curren:"Simbolo Moneta",yen:"Simbolo Yen",brvbar:"Barra interrotta",sect:"Simbolo di sezione",uml:"Dieresi",copy:"Simbolo Copyright",ordf:"Indicatore ordinale femminile",laquo:"Virgolette basse aperte",
+not:"Nessun segno",reg:"Simbolo Registrato",macr:"Macron",deg:"Simbolo Grado",sup2:"Apice Due",sup3:"Apice Tre",acute:"Accento acuto",micro:"Simbolo Micro",para:"Simbolo Paragrafo",middot:"Punto centrale",cedil:"Cediglia",sup1:"Apice Uno",ordm:"Indicatore ordinale maschile",raquo:"Virgolette basse chiuse",frac14:"Frazione volgare un quarto",frac12:"Frazione volgare un mezzo",frac34:"Frazione volgare tre quarti",iquest:"Punto interrogativo invertito",Agrave:"Lettera maiuscola latina A con accento grave",
+Aacute:"Lettera maiuscola latina A con accento acuto",Acirc:"Lettera maiuscola latina A con accento circonflesso",Atilde:"Lettera maiuscola latina A con tilde",Auml:"Lettera maiuscola latina A con dieresi",Aring:"Lettera maiuscola latina A con anello sopra",AElig:"Lettera maiuscola latina AE",Ccedil:"Lettera maiuscola latina C con cediglia",Egrave:"Lettera maiuscola latina E con accento grave",Eacute:"Lettera maiuscola latina E con accento acuto",Ecirc:"Lettera maiuscola latina E con accento circonflesso",
+Euml:"Lettera maiuscola latina E con dieresi",Igrave:"Lettera maiuscola latina I con accento grave",Iacute:"Lettera maiuscola latina I con accento acuto",Icirc:"Lettera maiuscola latina I con accento circonflesso",Iuml:"Lettera maiuscola latina I con dieresi",ETH:"Lettera maiuscola latina Eth",Ntilde:"Lettera maiuscola latina N con tilde",Ograve:"Lettera maiuscola latina O con accento grave",Oacute:"Lettera maiuscola latina O con accento acuto",Ocirc:"Lettera maiuscola latina O con accento circonflesso",
+Otilde:"Lettera maiuscola latina O con tilde",Ouml:"Lettera maiuscola latina O con dieresi",times:"Simbolo di moltiplicazione",Oslash:"Lettera maiuscola latina O barrata",Ugrave:"Lettera maiuscola latina U con accento grave",Uacute:"Lettera maiuscola latina U con accento acuto",Ucirc:"Lettera maiuscola latina U con accento circonflesso",Uuml:"Lettera maiuscola latina U con accento circonflesso",Yacute:"Lettera maiuscola latina Y con accento acuto",THORN:"Lettera maiuscola latina Thorn",szlig:"Lettera latina minuscola doppia S",
+agrave:"Lettera minuscola latina a con accento grave",aacute:"Lettera minuscola latina a con accento acuto",acirc:"Lettera minuscola latina a con accento circonflesso",atilde:"Lettera minuscola latina a con tilde",auml:"Lettera minuscola latina a con dieresi",aring:"Lettera minuscola latina a con anello superiore",aelig:"Lettera minuscola latina ae",ccedil:"Lettera minuscola latina c con cediglia",egrave:"Lettera minuscola latina e con accento grave",eacute:"Lettera minuscola latina e con accento acuto",
+ecirc:"Lettera minuscola latina e con accento circonflesso",euml:"Lettera minuscola latina e con dieresi",igrave:"Lettera minuscola latina i con accento grave",iacute:"Lettera minuscola latina i con accento acuto",icirc:"Lettera minuscola latina i con accento circonflesso",iuml:"Lettera minuscola latina i con dieresi",eth:"Lettera minuscola latina eth",ntilde:"Lettera minuscola latina n con tilde",ograve:"Lettera minuscola latina o con accento grave",oacute:"Lettera minuscola latina o con accento acuto",
+ocirc:"Lettera minuscola latina o con accento circonflesso",otilde:"Lettera minuscola latina o con tilde",ouml:"Lettera minuscola latina o con dieresi",divide:"Simbolo di divisione",oslash:"Lettera minuscola latina o barrata",ugrave:"Lettera minuscola latina u con accento grave",uacute:"Lettera minuscola latina u con accento acuto",ucirc:"Lettera minuscola latina u con accento circonflesso",uuml:"Lettera minuscola latina u con dieresi",yacute:"Lettera minuscola latina y con accento acuto",thorn:"Lettera minuscola latina thorn",
+yuml:"Lettera minuscola latina y con dieresi",OElig:"Legatura maiuscola latina OE",oelig:"Legatura minuscola latina oe",372:"Lettera maiuscola latina W con accento circonflesso",374:"Lettera maiuscola latina Y con accento circonflesso",373:"Lettera minuscola latina w con accento circonflesso",375:"Lettera minuscola latina y con accento circonflesso",sbquo:"Singola virgoletta bassa low-9",8219:"Singola virgoletta bassa low-9 inversa",bdquo:"Doppia virgoletta bassa low-9",hellip:"Ellissi orizzontale",
+trade:"Simbolo TM",9658:"Puntatore nero rivolto verso destra",bull:"Punto",rarr:"Freccia verso destra",rArr:"Doppia freccia verso destra",hArr:"Doppia freccia sinistra destra",diams:"Simbolo nero diamante",asymp:"Quasi uguale a"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ja.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ja.js
new file mode 100644
index 00000000..0bbee621
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ja.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","ja",{euro:"ユーロ記号",lsquo:"左シングル引用符",rsquo:"右シングル引用符",ldquo:"左ダブル引用符",rdquo:"右ダブル引用符",ndash:"半角ダッシュ",mdash:"全角ダッシュ",iexcl:"逆さ感嘆符",cent:"セント記号",pound:"ポンド記号",curren:"通貨記号",yen:"円記号",brvbar:"上下に分かれた縦棒",sect:"節記号",uml:"分音記号(ウムラウト)",copy:"著作権表示記号",ordf:"女性序数標識",laquo:" 始め二重山括弧引用記号",not:"論理否定記号",reg:"登録商標記号",macr:"長音符",deg:"度記号",sup2:"上つき2, 2乗",sup3:"上つき3, 3乗",acute:"揚音符",micro:"ミクロン記号",para:"段落記号",middot:"中黒",cedil:"セディラ",sup1:"上つき1",ordm:"男性序数標識",raquo:"終わり二重山括弧引用記号",
+frac14:"四分の一",frac12:"二分の一",frac34:"四分の三",iquest:"逆疑問符",Agrave:"抑音符つき大文字A",Aacute:"揚音符つき大文字A",Acirc:"曲折アクセントつき大文字A",Atilde:"チルダつき大文字A",Auml:"分音記号つき大文字A",Aring:"リングつき大文字A",AElig:"AとEの合字",Ccedil:"セディラつき大文字C",Egrave:"抑音符つき大文字E",Eacute:"揚音符つき大文字E",Ecirc:"曲折アクセントつき大文字E",Euml:"分音記号つき大文字E",Igrave:"抑音符つき大文字I",Iacute:"揚音符つき大文字I",Icirc:"曲折アクセントつき大文字I",Iuml:"分音記号つき大文字I",ETH:"[アイスランド語]大文字ETH",Ntilde:"チルダつき大文字N",Ograve:"抑音符つき大文字O",Oacute:"揚音符つき大文字O",Ocirc:"曲折アクセントつき大文字O",Otilde:"チルダつき大文字O",Ouml:" 分音記号つき大文字O",
+times:"乗算記号",Oslash:"打ち消し線つき大文字O",Ugrave:"抑音符つき大文字U",Uacute:"揚音符つき大文字U",Ucirc:"曲折アクセントつき大文字U",Uuml:"分音記号つき大文字U",Yacute:"揚音符つき大文字Y",THORN:"[アイスランド語]大文字THORN",szlig:"ドイツ語エスツェット",agrave:"抑音符つき小文字a",aacute:"揚音符つき小文字a",acirc:"曲折アクセントつき小文字a",atilde:"チルダつき小文字a",auml:"分音記号つき小文字a",aring:"リングつき小文字a",aelig:"aとeの合字",ccedil:"セディラつき小文字c",egrave:"抑音符つき小文字e",eacute:"揚音符つき小文字e",ecirc:"曲折アクセントつき小文字e",euml:"分音記号つき小文字e",igrave:"抑音符つき小文字i",iacute:"揚音符つき小文字i",icirc:"曲折アクセントつき小文字i",iuml:"分音記号つき小文字i",eth:"アイスランド語小文字eth",
+ntilde:"チルダつき小文字n",ograve:"抑音符つき小文字o",oacute:"揚音符つき小文字o",ocirc:"曲折アクセントつき小文字o",otilde:"チルダつき小文字o",ouml:"分音記号つき小文字o",divide:"除算記号",oslash:"打ち消し線つき小文字o",ugrave:"抑音符つき小文字u",uacute:"揚音符つき小文字u",ucirc:"曲折アクセントつき小文字u",uuml:"分音記号つき小文字u",yacute:"揚音符つき小文字y",thorn:"アイスランド語小文字thorn",yuml:"分音記号つき小文字y",OElig:"OとEの合字",oelig:"oとeの合字",372:"曲折アクセントつき大文字W",374:"曲折アクセントつき大文字Y",373:"曲折アクセントつき小文字w",375:"曲折アクセントつき小文字y",sbquo:"シングル下引用符",8219:"左右逆の左引用符",bdquo:"ダブル下引用符",hellip:"三点リーダ",trade:"商標記号",9658:"右黒三角ポインタ",bull:"黒丸",
+rarr:"右矢印",rArr:"右二重矢印",hArr:"左右二重矢印",diams:"ダイヤ",asymp:"漸近"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ku.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ku.js
new file mode 100644
index 00000000..af275c96
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ku.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","ku",{euro:"نیشانەی یۆرۆ",lsquo:"نیشانەی فاریزەی سەرووژێری تاکی چەپ",rsquo:"نیشانەی فاریزەی سەرووژێری تاکی ڕاست",ldquo:"نیشانەی فاریزەی سەرووژێری دووهێندەی چه‌پ",rdquo:"نیشانەی فاریزەی سەرووژێری دووهێندەی ڕاست",ndash:"تەقەڵی کورت",mdash:"تەقەڵی درێژ",iexcl:"نیشانەی هەڵەوگێڕی سەرسوڕهێنەر",cent:"نیشانەی سەنت",pound:"نیشانەی پاوەند",curren:"نیشانەی دراو",yen:"نیشانەی یەنی ژاپۆنی",brvbar:"شریتی ئەستوونی پچڕاو",sect:"نیشانەی دوو s لەسەریەک",uml:"خاڵ",copy:"نیشانەی مافی چاپ",
+ordf:"هێڵ لەسەر پیتی a",laquo:"دوو تیری بەدووایەکی چەپ",not:"نیشانەی نەخێر",reg:"نیشانەی R لەناو بازنەدا",macr:"ماکڕۆن",deg:"نیشانەی پلە",sup2:"سەرنووسی دوو",sup3:"سەرنووسی سێ",acute:"لاری تیژ",micro:"نیشانەی u لق درێژی چەپی خواروو",para:"نیشانەی پەڕەگراف",middot:"ناوەڕاستی خاڵ",cedil:"نیشانەی c ژێر چووکرە",sup1:"سەرنووسی یەک",ordm:"هێڵ لەژێر پیتی o",raquo:"دوو تیری بەدووایەکی ڕاست",frac14:"یەک لەسەر چووار",frac12:"یەک لەسەر دوو",frac34:"سێ لەسەر چووار",iquest:"هێمای هەڵەوگێری پرسیار",Agrave:"پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری لار",
+Aacute:"پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری تیژ",Acirc:"پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری",Atilde:"پیتی لاتینی A-ی گەورە لەگەڵ زەڕە",Auml:"پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری",Aring:"پیتی لاتینی گەورەی Å",AElig:"پیتی لاتینی گەورەی Æ",Ccedil:"پیتی لاتینی C-ی گەورە لەگەڵ ژێر چووکرە",Egrave:"پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری لار",Eacute:"پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ecirc:"پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری",Euml:"پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری",
+Igrave:"پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری لار",Iacute:"پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری تیژ",Icirc:"پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری",Iuml:"پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری",ETH:"پیتی لاتینی E-ی گەورەی",Ntilde:"پیتی لاتینی N-ی گەورە لەگەڵ زەڕە",Ograve:"پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری لار",Oacute:"پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ocirc:"پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری",Otilde:"پیتی لاتینی O-ی گەورە لەگەڵ زەڕە",Ouml:"پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری",
+times:"نیشانەی لێکدان",Oslash:"پیتی لاتینی گەورەی Ø لەگەڵ هێمای دڵ وەستان",Ugrave:"پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری لار",Uacute:"پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ucirc:"پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری",Uuml:"پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری",Yacute:"پیتی لاتینی Y-ی گەورە لەگەڵ ڕوومەتداری تیژ",THORN:"پیتی لاتینی دڕکی گەورە",szlig:"پیتی لاتنی نووک تیژی s",agrave:"پیتی لاتینی a-ی بچووک لەگەڵ ڕوومەتداری لار",aacute:"پیتی لاتینی a-ی بچووك لەگەڵ ڕوومەتداری تیژ",acirc:"پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری",
+atilde:"پیتی لاتینی a-ی بچووك لەگەڵ زەڕە",auml:"پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری",aring:"پیتی لاتینی å-ی بچووك",aelig:"پیتی لاتینی æ-ی بچووك",ccedil:"پیتی لاتینی c-ی بچووك لەگەڵ ژێر چووکرە",egrave:"پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری لار",eacute:"پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری تیژ",ecirc:"پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری",euml:"پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری",igrave:"پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری لار",iacute:"پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری تیژ",
+icirc:"پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری",iuml:"پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری",eth:"پیتی لاتینی e-ی بچووك",ntilde:"پیتی لاتینی n-ی بچووك لەگەڵ زەڕە",ograve:"پیتی لاتینی o-ی بچووك لەگەڵ ڕوومەتداری لار",oacute:"پیتی لاتینی o-ی بچووك له‌گەڵ ڕوومەتداری تیژ",ocirc:"پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری",otilde:"پیتی لاتینی o-ی بچووك لەگەڵ زەڕە",ouml:"پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری",divide:"نیشانەی دابەش",oslash:"پیتی لاتینی گەورەی ø لەگەڵ هێمای دڵ وەستان",ugrave:"پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری لار",
+uacute:"پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری تیژ",ucirc:"پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری",uuml:"پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری",yacute:"پیتی لاتینی y-ی بچووك لەگەڵ ڕوومەتداری تیژ",thorn:"پیتی لاتینی دڕکی بچووك",yuml:"پیتی لاتینی y-ی بچووك لەگەڵ نیشانە لەسەری",OElig:"پیتی لاتینی گەورەی پێکەوەنووسراوی OE",oelig:"پیتی لاتینی بچووکی پێکەوەنووسراوی oe",372:"پیتی لاتینی W-ی گەورە لەگەڵ نیشانە لەسەری",374:"پیتی لاتینی Y-ی گەورە لەگەڵ نیشانە لەسەری",373:"پیتی لاتینی w-ی بچووکی لەگەڵ نیشانە لەسەری",
+375:"پیتی لاتینی y-ی بچووکی لەگەڵ نیشانە لەسەری",sbquo:"نیشانەی فاریزەی نزم",8219:"نیشانەی فاریزەی بەرزی پێچەوانە",bdquo:"دوو فاریزەی تەنیش یەك",hellip:"ئاسۆیی بازنە",trade:"نیشانەی بازرگانی",9658:"ئاراستەی ڕەشی دەستی ڕاست",bull:"فیشەك",rarr:"تیری دەستی ڕاست",rArr:"دووتیری دەستی ڕاست",hArr:"دوو تیری ڕاست و چەپ",diams:"ڕەشی پاقڵاوەیی",asymp:"نیشانەی یەکسانە"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/lv.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/lv.js
new file mode 100644
index 00000000..3f76e269
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/lv.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","lv",{euro:"Euro zīme",lsquo:"Kreisā  vienkārtīga pēdiņa",rsquo:"Labā  vienkārtīga pēdiņa",ldquo:"Kreisā  dubult pēdiņa",rdquo:"Labā dubult pēdiņa",ndash:"En svītra",mdash:"Em svītra",iexcl:"Apgriezta izsaukuma zīme",cent:"Centu naudas zīme",pound:"Sterliņu mārciņu naudas zīme",curren:"Valūtas zīme",yen:"Jenu naudas zīme",brvbar:"Vertikāla pārrauta līnija",sect:"Paragrāfa zīme",uml:"Diakritiska zīme",copy:"Autortiesību zīme",ordf:"Sievišķas kārtas rādītājs",
+laquo:"Kreisā dubult stūra pēdiņu zīme",not:"Neparakstīts",reg:"Reģistrēta zīme",macr:"Garumzīme",deg:"Grādu zīme",sup2:"Augšraksts divi",sup3:"Augšraksts trīs",acute:"Akūta uzsvara zīme",micro:"Mikro zīme",para:"Rindkopas zīme ",middot:"Vidējs punkts",cedil:"Āķītis zem burta",sup1:"Augšraksts viens",ordm:"Vīrišķīgas kārtas rādītājs",raquo:"Labā dubult stūra pēdiņu zīme",frac14:"Vulgāra frakcija 1/4",frac12:"Vulgāra frakcija 1/2",frac34:"Vulgāra frakcija 3/4",iquest:"Apgriezta jautājuma zīme",Agrave:"Lielais latīņu burts A ar uzsvara zīmi",
+Aacute:"Lielais  latīņu burts A ar akūtu uzsvara zīmi",Acirc:"Lielais latīņu burts A ar diakritisku zīmi",Atilde:"Lielais latīņu burts A ar tildi ",Auml:"Lielais latīņu burts A ar diakritisko zīmi",Aring:"Lielais latīņu burts A ar aplīti augšā",AElig:"Lielais latīņu burts Æ",Ccedil:"Lielais latīņu burts C ar āķīti zem burta",Egrave:"Lielais latīņu burts E ar apostrofu",Eacute:"Lielais latīņu burts E ar akūtu uzsvara zīmi",Ecirc:"Lielais latīņu burts E ar diakritisko zīmi",Euml:"Lielais latīņu burts E ar diakritisko zīmi",
+Igrave:"Lielais latīņu burts I ar uzsvaras  zīmi",Iacute:"Lielais latīņu burts I ar akūtu uzsvara zīmi",Icirc:"Lielais latīņu burts I ar diakritisko zīmi",Iuml:"Lielais latīņu burts I ar diakritisko zīmi",ETH:"Lielais latīņu burts Eth",Ntilde:"Lielais latīņu burts N ar tildi",Ograve:"Lielais latīņu burts O ar uzsvara zīmi",Oacute:"Lielais latīņu burts O ar akūto uzsvara zīmi",Ocirc:"Lielais latīņu burts O ar diakritisko zīmi",Otilde:"Lielais latīņu burts O ar tildi",Ouml:"Lielais latīņu burts O ar diakritisko zīmi",
+times:"Reizināšanas zīme ",Oslash:"Lielais latīņu burts O ar iesvītrojumu",Ugrave:"Lielais latīņu burts U ar uzsvaras zīmi",Uacute:"Lielais latīņu burts U ar akūto uzsvars zīmi",Ucirc:"Lielais latīņu burts U ar diakritisko zīmi",Uuml:"Lielais latīņu burts U ar diakritisko zīmi",Yacute:"Lielais latīņu burts Y ar akūto uzsvaras zīmi",THORN:"Lielais latīņu burts torn",szlig:"Mazs latīņu burts ar ligatūru",agrave:"Mazs latīņu burts a ar uzsvara zīmi",aacute:"Mazs latīņu burts a ar akūto uzsvara zīmi",
+acirc:"Mazs latīņu burts a ar diakritisko zīmi",atilde:"Mazs latīņu burts a ar tildi",auml:"Mazs latīņu burts a ar diakritisko zīmi",aring:"Mazs latīņu burts a ar aplīti augšā",aelig:"Mazs latīņu burts æ",ccedil:"Mazs latīņu burts c ar āķīti zem burta",egrave:"Mazs latīņu burts e ar uzsvara zīmi ",eacute:"Mazs latīņu burts e ar akūtu uzsvara zīmi",ecirc:"Mazs latīņu burts e ar diakritisko zīmi",euml:"Mazs latīņu burts e ar diakritisko zīmi",igrave:"Mazs latīņu burts i ar uzsvara zīmi ",iacute:"Mazs latīņu burts i ar akūtu uzsvara zīmi",
+icirc:"Mazs latīņu burts i ar diakritisko zīmi",iuml:"Mazs latīņu burts i ar diakritisko zīmi",eth:"Mazs latīņu burts eth",ntilde:"Mazs latīņu burts n ar tildi",ograve:"Mazs latīņu burts o ar uzsvara zīmi ",oacute:"Mazs latīņu burts o ar akūtu uzsvara zīmi",ocirc:"Mazs latīņu burts o ar diakritisko zīmi",otilde:"Mazs latīņu burts o ar tildi",ouml:"Mazs latīņu burts o ar diakritisko zīmi",divide:"Dalīšanas zīme",oslash:"Mazs latīņu burts o ar iesvītrojumu",ugrave:"Mazs latīņu burts u ar uzsvara zīmi ",
+uacute:"Mazs latīņu burts u ar  akūtu uzsvara zīmi",ucirc:"Mazs latīņu burts u ar diakritisko zīmi",uuml:"Mazs latīņu burts u ar diakritisko zīmi",yacute:"Mazs latīņu burts y ar  akūtu uzsvaras zīmi",thorn:"Mazs latīņu burts torns",yuml:"Mazs latīņu burts y ar diakritisko zīmi",OElig:"Liela latīņu ligatūra OE",oelig:"Maza latīņu ligatūra oe",372:"Liels latīņu burts W ar diakritisko zīmi ",374:"Liels latīņu burts Y ar diakritisko zīmi ",373:"Mazs latīņu burts w ar diakritisko zīmi ",375:"Mazs latīņu burts y ar diakritisko zīmi ",
+sbquo:"Mazas-9 vienkārtīgas pēdiņas",8219:"Lielas-9 vienkārtīgas apgrieztas pēdiņas",bdquo:"Mazas-9 dubultas pēdiņas",hellip:"Horizontāli daudzpunkti",trade:"Preču zīmes zīme",9658:"Melns pa labi pagriezts radītājs",bull:"Lode",rarr:"Bulta pa labi",rArr:"Dubulta Bulta pa labi",hArr:"Bulta pa kreisi",diams:"Dubulta Bulta pa kreisi",asymp:"Gandrīz vienāds ar"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/nb.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/nb.js
new file mode 100644
index 00000000..1e8a8599
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/nb.js
@@ -0,0 +1,11 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","nb",{euro:"Eurosymbol",lsquo:"Venstre enkelt anførselstegn",rsquo:"Høyre enkelt anførselstegn",ldquo:"Venstre dobbelt anførselstegn",rdquo:"Høyre anførsesltegn",ndash:"Kort tankestrek",mdash:"Lang tankestrek",iexcl:"Omvendt utropstegn",cent:"Centsymbol",pound:"Pundsymbol",curren:"Valutategn",yen:"Yensymbol",brvbar:"Brutt loddrett strek",sect:"Paragraftegn",uml:"Tøddel",copy:"Copyrighttegn",ordf:"Feminin ordensindikator",laquo:"Venstre anførselstegn",not:"Negasjonstegn",
+reg:"Registrert varemerke-tegn",macr:"Makron",deg:"Gradsymbol",sup2:"Hevet totall",sup3:"Hevet tretall",acute:"Akutt aksent",micro:"Mikrosymbol",para:"Avsnittstegn",middot:"Midtstilt prikk",cedil:"Cedille",sup1:"Hevet ettall",ordm:"Maskulin ordensindikator",raquo:"Høyre anførselstegn",frac14:"Fjerdedelsbrøk",frac12:"Halvbrøk",frac34:"Tre fjerdedelers brøk",iquest:"Omvendt spørsmålstegn",Agrave:"Stor A med grav aksent",Aacute:"Stor A med akutt aksent",Acirc:"Stor A med cirkumfleks",Atilde:"Stor A med tilde",
+Auml:"Stor A med tøddel",Aring:"Stor Å",AElig:"Stor Æ",Ccedil:"Stor C med cedille",Egrave:"Stor E med grav aksent",Eacute:"Stor E med akutt aksent",Ecirc:"Stor E med cirkumfleks",Euml:"Stor E med tøddel",Igrave:"Stor I med grav aksent",Iacute:"Stor I med akutt aksent",Icirc:"Stor I med cirkumfleks",Iuml:"Stor I med tøddel",ETH:"Stor Edd/stungen D",Ntilde:"Stor N med tilde",Ograve:"Stor O med grav aksent",Oacute:"Stor O med akutt aksent",Ocirc:"Stor O med cirkumfleks",Otilde:"Stor O med tilde",Ouml:"Stor O med tøddel",
+times:"Multiplikasjonstegn",Oslash:"Stor Ø",Ugrave:"Stor U med grav aksent",Uacute:"Stor U med akutt aksent",Ucirc:"Stor U med cirkumfleks",Uuml:"Stor U med tøddel",Yacute:"Stor Y med akutt aksent",THORN:"Stor Thorn",szlig:"Liten dobbelt-s/Eszett",agrave:"Liten a med grav aksent",aacute:"Liten a med akutt aksent",acirc:"Liten a med cirkumfleks",atilde:"Liten a med tilde",auml:"Liten a med tøddel",aring:"Liten å",aelig:"Liten æ",ccedil:"Liten c med cedille",egrave:"Liten e med grav aksent",eacute:"Liten e med akutt aksent",
+ecirc:"Liten e med cirkumfleks",euml:"Liten e med tøddel",igrave:"Liten i med grav aksent",iacute:"Liten i med akutt aksent",icirc:"Liten i med cirkumfleks",iuml:"Liten i med tøddel",eth:"Liten edd/stungen d",ntilde:"Liten n med tilde",ograve:"Liten o med grav aksent",oacute:"Liten o med akutt aksent",ocirc:"Liten o med cirkumfleks",otilde:"Liten o med tilde",ouml:"Liten o med tøddel",divide:"Divisjonstegn",oslash:"Liten ø",ugrave:"Liten u med grav aksent",uacute:"Liten u med akutt aksent",ucirc:"Liten u med cirkumfleks",
+uuml:"Liten u med tøddel",yacute:"Liten y med akutt aksent",thorn:"Liten thorn",yuml:"Liten y med tøddel",OElig:"Stor ligatur av O og E",oelig:"Liten ligatur av o og e",372:"Stor W med cirkumfleks",374:"Stor Y med cirkumfleks",373:"Liten w med cirkumfleks",375:"Liten y med cirkumfleks",sbquo:"Enkelt lavt 9-anførselstegn",8219:"Enkelt høyt reversert 9-anførselstegn",bdquo:"Dobbelt lavt 9-anførselstegn",hellip:"Ellipse",trade:"Varemerkesymbol",9658:"Svart høyrevendt peker",bull:"Tykk interpunkt",rarr:"Høyrevendt pil",
+rArr:"Dobbel høyrevendt pil",hArr:"Dobbel venstrevendt pil",diams:"Svart ruter",asymp:"Omtrent likhetstegn"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/nl.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/nl.js
new file mode 100644
index 00000000..58c7c752
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/nl.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","nl",{euro:"Euro-teken",lsquo:"Linker enkel aanhalingsteken",rsquo:"Rechter enkel aanhalingsteken",ldquo:"Linker dubbel aanhalingsteken",rdquo:"Rechter dubbel aanhalingsteken",ndash:"En dash",mdash:"Em dash",iexcl:"Omgekeerd uitroepteken",cent:"Cent-teken",pound:"Pond-teken",curren:"Valuta-teken",yen:"Yen-teken",brvbar:"Gebroken streep",sect:"Paragraaf-teken",uml:"Trema",copy:"Copyright-teken",ordf:"Vrouwelijk ordinaal",laquo:"Linker guillemet",not:"Ongelijk-teken",
+reg:"Geregistreerd handelsmerk-teken",macr:"Macron",deg:"Graden-teken",sup2:"Superscript twee",sup3:"Superscript drie",acute:"Accent aigu",micro:"Mico-teken",para:"Alinea-teken",middot:"Halfhoge punt",cedil:"Cedille",sup1:"Superscript een",ordm:"Mannelijk ordinaal",raquo:"Rechter guillemet",frac14:"Breuk kwart",frac12:"Breuk half",frac34:"Breuk driekwart",iquest:"Omgekeerd vraagteken",Agrave:"Latijnse hoofdletter A met een accent grave",Aacute:"Latijnse hoofdletter A met een accent aigu",Acirc:"Latijnse hoofdletter A met een circonflexe",
+Atilde:"Latijnse hoofdletter A met een tilde",Auml:"Latijnse hoofdletter A met een trema",Aring:"Latijnse hoofdletter A met een corona",AElig:"Latijnse hoofdletter Æ",Ccedil:"Latijnse hoofdletter C met een cedille",Egrave:"Latijnse hoofdletter E met een accent grave",Eacute:"Latijnse hoofdletter E met een accent aigu",Ecirc:"Latijnse hoofdletter E met een circonflexe",Euml:"Latijnse hoofdletter E met een trema",Igrave:"Latijnse hoofdletter I met een accent grave",Iacute:"Latijnse hoofdletter I met een accent aigu",
+Icirc:"Latijnse hoofdletter I met een circonflexe",Iuml:"Latijnse hoofdletter I met een trema",ETH:"Latijnse hoofdletter Eth",Ntilde:"Latijnse hoofdletter N met een tilde",Ograve:"Latijnse hoofdletter O met een accent grave",Oacute:"Latijnse hoofdletter O met een accent aigu",Ocirc:"Latijnse hoofdletter O met een circonflexe",Otilde:"Latijnse hoofdletter O met een tilde",Ouml:"Latijnse hoofdletter O met een trema",times:"Maal-teken",Oslash:"Latijnse hoofdletter O met een schuine streep",Ugrave:"Latijnse hoofdletter U met een accent grave",
+Uacute:"Latijnse hoofdletter U met een accent aigu",Ucirc:"Latijnse hoofdletter U met een circonflexe",Uuml:"Latijnse hoofdletter U met een trema",Yacute:"Latijnse hoofdletter Y met een accent aigu",THORN:"Latijnse hoofdletter Thorn",szlig:"Latijnse kleine ringel-s",agrave:"Latijnse kleine letter a met een accent grave",aacute:"Latijnse kleine letter a met een accent aigu",acirc:"Latijnse kleine letter a met een circonflexe",atilde:"Latijnse kleine letter a met een tilde",auml:"Latijnse kleine letter a met een trema",
+aring:"Latijnse kleine letter a met een corona",aelig:"Latijnse kleine letter æ",ccedil:"Latijnse kleine letter c met een cedille",egrave:"Latijnse kleine letter e met een accent grave",eacute:"Latijnse kleine letter e met een accent aigu",ecirc:"Latijnse kleine letter e met een circonflexe",euml:"Latijnse kleine letter e met een trema",igrave:"Latijnse kleine letter i met een accent grave",iacute:"Latijnse kleine letter i met een accent aigu",icirc:"Latijnse kleine letter i met een circonflexe",
+iuml:"Latijnse kleine letter i met een trema",eth:"Latijnse kleine letter eth",ntilde:"Latijnse kleine letter n met een tilde",ograve:"Latijnse kleine letter o met een accent grave",oacute:"Latijnse kleine letter o met een accent aigu",ocirc:"Latijnse kleine letter o met een circonflexe",otilde:"Latijnse kleine letter o met een tilde",ouml:"Latijnse kleine letter o met een trema",divide:"Deel-teken",oslash:"Latijnse kleine letter o met een schuine streep",ugrave:"Latijnse kleine letter u met een accent grave",
+uacute:"Latijnse kleine letter u met een accent aigu",ucirc:"Latijnse kleine letter u met een circonflexe",uuml:"Latijnse kleine letter u met een trema",yacute:"Latijnse kleine letter y met een accent aigu",thorn:"Latijnse kleine letter thorn",yuml:"Latijnse kleine letter y met een trema",OElig:"Latijnse hoofdletter Œ",oelig:"Latijnse kleine letter œ",372:"Latijnse hoofdletter W met een circonflexe",374:"Latijnse hoofdletter Y met een circonflexe",373:"Latijnse kleine letter w met een circonflexe",
+375:"Latijnse kleine letter y met een circonflexe",sbquo:"Lage enkele aanhalingsteken",8219:"Hoge omgekeerde enkele aanhalingsteken",bdquo:"Lage dubbele aanhalingsteken",hellip:"Beletselteken",trade:"Trademark-teken",9658:"Zwarte driehoek naar rechts",bull:"Bullet",rarr:"Pijl naar rechts",rArr:"Dubbele pijl naar rechts",hArr:"Dubbele pijl naar links",diams:"Zwart ruitje",asymp:"Benaderingsteken"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/no.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/no.js
new file mode 100644
index 00000000..07870776
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/no.js
@@ -0,0 +1,11 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","no",{euro:"Eurosymbol",lsquo:"Venstre enkelt anførselstegn",rsquo:"Høyre enkelt anførselstegn",ldquo:"Venstre dobbelt anførselstegn",rdquo:"Høyre anførsesltegn",ndash:"Kort tankestrek",mdash:"Lang tankestrek",iexcl:"Omvendt utropstegn",cent:"Centsymbol",pound:"Pundsymbol",curren:"Valutategn",yen:"Yensymbol",brvbar:"Brutt loddrett strek",sect:"Paragraftegn",uml:"Tøddel",copy:"Copyrighttegn",ordf:"Feminin ordensindikator",laquo:"Venstre anførselstegn",not:"Negasjonstegn",
+reg:"Registrert varemerke-tegn",macr:"Makron",deg:"Gradsymbol",sup2:"Hevet totall",sup3:"Hevet tretall",acute:"Akutt aksent",micro:"Mikrosymbol",para:"Avsnittstegn",middot:"Midtstilt prikk",cedil:"Cedille",sup1:"Hevet ettall",ordm:"Maskulin ordensindikator",raquo:"Høyre anførselstegn",frac14:"Fjerdedelsbrøk",frac12:"Halvbrøk",frac34:"Tre fjerdedelers brøk",iquest:"Omvendt spørsmålstegn",Agrave:"Stor A med grav aksent",Aacute:"Stor A med akutt aksent",Acirc:"Stor A med cirkumfleks",Atilde:"Stor A med tilde",
+Auml:"Stor A med tøddel",Aring:"Stor Å",AElig:"Stor Æ",Ccedil:"Stor C med cedille",Egrave:"Stor E med grav aksent",Eacute:"Stor E med akutt aksent",Ecirc:"Stor E med cirkumfleks",Euml:"Stor E med tøddel",Igrave:"Stor I med grav aksent",Iacute:"Stor I med akutt aksent",Icirc:"Stor I med cirkumfleks",Iuml:"Stor I med tøddel",ETH:"Stor Edd/stungen D",Ntilde:"Stor N med tilde",Ograve:"Stor O med grav aksent",Oacute:"Stor O med akutt aksent",Ocirc:"Stor O med cirkumfleks",Otilde:"Stor O med tilde",Ouml:"Stor O med tøddel",
+times:"Multiplikasjonstegn",Oslash:"Stor Ø",Ugrave:"Stor U med grav aksent",Uacute:"Stor U med akutt aksent",Ucirc:"Stor U med cirkumfleks",Uuml:"Stor U med tøddel",Yacute:"Stor Y med akutt aksent",THORN:"Stor Thorn",szlig:"Liten dobbelt-s/Eszett",agrave:"Liten a med grav aksent",aacute:"Liten a med akutt aksent",acirc:"Liten a med cirkumfleks",atilde:"Liten a med tilde",auml:"Liten a med tøddel",aring:"Liten å",aelig:"Liten æ",ccedil:"Liten c med cedille",egrave:"Liten e med grav aksent",eacute:"Liten e med akutt aksent",
+ecirc:"Liten e med cirkumfleks",euml:"Liten e med tøddel",igrave:"Liten i med grav aksent",iacute:"Liten i med akutt aksent",icirc:"Liten i med cirkumfleks",iuml:"Liten i med tøddel",eth:"Liten edd/stungen d",ntilde:"Liten n med tilde",ograve:"Liten o med grav aksent",oacute:"Liten o med akutt aksent",ocirc:"Liten o med cirkumfleks",otilde:"Liten o med tilde",ouml:"Liten o med tøddel",divide:"Divisjonstegn",oslash:"Liten ø",ugrave:"Liten u med grav aksent",uacute:"Liten u med akutt aksent",ucirc:"Liten u med cirkumfleks",
+uuml:"Liten u med tøddel",yacute:"Liten y med akutt aksent",thorn:"Liten thorn",yuml:"Liten y med tøddel",OElig:"Stor ligatur av O og E",oelig:"Liten ligatur av o og e",372:"Stor W med cirkumfleks",374:"Stor Y med cirkumfleks",373:"Liten w med cirkumfleks",375:"Liten y med cirkumfleks",sbquo:"Enkelt lavt 9-anførselstegn",8219:"Enkelt høyt reversert 9-anførselstegn",bdquo:"Dobbelt lavt 9-anførselstegn",hellip:"Ellipse",trade:"Varemerkesymbol",9658:"Svart høyrevendt peker",bull:"Tykk interpunkt",rarr:"Høyrevendt pil",
+rArr:"Dobbel høyrevendt pil",hArr:"Dobbel venstrevendt pil",diams:"Svart ruter",asymp:"Omtrent likhetstegn"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/pl.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/pl.js
new file mode 100644
index 00000000..6b0f8026
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/pl.js
@@ -0,0 +1,12 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","pl",{euro:"Znak euro",lsquo:"Cudzysłów pojedynczy otwierający",rsquo:"Cudzysłów pojedynczy zamykający",ldquo:"Cudzysłów apostrofowy otwierający",rdquo:"Cudzysłów apostrofowy zamykający",ndash:"Półpauza",mdash:"Pauza",iexcl:"Odwrócony wykrzyknik",cent:"Znak centa",pound:"Znak funta",curren:"Znak waluty",yen:"Znak jena",brvbar:"Przerwana pionowa kreska",sect:"Paragraf",uml:"Diereza",copy:"Znak praw autorskich",ordf:"Wskaźnik rodzaju żeńskiego liczebnika porządkowego",
+laquo:"Lewy cudzysłów ostrokątny",not:"Znak negacji",reg:"Zastrzeżony znak towarowy",macr:"Makron",deg:"Znak stopnia",sup2:"Druga potęga",sup3:"Trzecia potęga",acute:"Akcent ostry",micro:"Znak mikro",para:"Znak akapitu",middot:"Kropka środkowa",cedil:"Cedylla",sup1:"Pierwsza potęga",ordm:"Wskaźnik rodzaju męskiego liczebnika porządkowego",raquo:"Prawy cudzysłów ostrokątny",frac14:"Ułamek zwykły jedna czwarta",frac12:"Ułamek zwykły jedna druga",frac34:"Ułamek zwykły trzy czwarte",iquest:"Odwrócony znak zapytania",
+Agrave:"Wielka litera A z akcentem ciężkim",Aacute:"Wielka litera A z akcentem ostrym",Acirc:"Wielka litera A z akcentem przeciągłym",Atilde:"Wielka litera A z tyldą",Auml:"Wielka litera A z dierezą",Aring:"Wielka litera A z kółkiem",AElig:"Wielka ligatura Æ",Ccedil:"Wielka litera C z cedyllą",Egrave:"Wielka litera E z akcentem ciężkim",Eacute:"Wielka litera E z akcentem ostrym",Ecirc:"Wielka litera E z akcentem przeciągłym",Euml:"Wielka litera E z dierezą",Igrave:"Wielka litera I z akcentem ciężkim",
+Iacute:"Wielka litera I z akcentem ostrym",Icirc:"Wielka litera I z akcentem przeciągłym",Iuml:"Wielka litera I z dierezą",ETH:"Wielka litera Eth",Ntilde:"Wielka litera N z tyldą",Ograve:"Wielka litera O z akcentem ciężkim",Oacute:"Wielka litera O z akcentem ostrym",Ocirc:"Wielka litera O z akcentem przeciągłym",Otilde:"Wielka litera O z tyldą",Ouml:"Wielka litera O z dierezą",times:"Znak mnożenia wektorowego",Oslash:"Wielka litera O z przekreśleniem",Ugrave:"Wielka litera U z akcentem ciężkim",Uacute:"Wielka litera U z akcentem ostrym",
+Ucirc:"Wielka litera U z akcentem przeciągłym",Uuml:"Wielka litera U z dierezą",Yacute:"Wielka litera Y z akcentem ostrym",THORN:"Wielka litera Thorn",szlig:"Mała litera ostre s (eszet)",agrave:"Mała litera a z akcentem ciężkim",aacute:"Mała litera a z akcentem ostrym",acirc:"Mała litera a z akcentem przeciągłym",atilde:"Mała litera a z tyldą",auml:"Mała litera a z dierezą",aring:"Mała litera a z kółkiem",aelig:"Mała ligatura æ",ccedil:"Mała litera c z cedyllą",egrave:"Mała litera e z akcentem ciężkim",
+eacute:"Mała litera e z akcentem ostrym",ecirc:"Mała litera e z akcentem przeciągłym",euml:"Mała litera e z dierezą",igrave:"Mała litera i z akcentem ciężkim",iacute:"Mała litera i z akcentem ostrym",icirc:"Mała litera i z akcentem przeciągłym",iuml:"Mała litera i z dierezą",eth:"Mała litera eth",ntilde:"Mała litera n z tyldą",ograve:"Mała litera o z akcentem ciężkim",oacute:"Mała litera o z akcentem ostrym",ocirc:"Mała litera o z akcentem przeciągłym",otilde:"Mała litera o z tyldą",ouml:"Mała litera o z dierezą",
+divide:"Anglosaski znak dzielenia",oslash:"Mała litera o z przekreśleniem",ugrave:"Mała litera u z akcentem ciężkim",uacute:"Mała litera u z akcentem ostrym",ucirc:"Mała litera u z akcentem przeciągłym",uuml:"Mała litera u z dierezą",yacute:"Mała litera y z akcentem ostrym",thorn:"Mała litera thorn",yuml:"Mała litera y z dierezą",OElig:"Wielka ligatura OE",oelig:"Mała ligatura oe",372:"Wielka litera W z akcentem przeciągłym",374:"Wielka litera Y z akcentem przeciągłym",373:"Mała litera w z akcentem przeciągłym",
+375:"Mała litera y z akcentem przeciągłym",sbquo:"Pojedynczy apostrof dolny",8219:"Pojedynczy apostrof górny",bdquo:"Podwójny apostrof dolny",hellip:"Wielokropek",trade:"Znak towarowy",9658:"Czarny wskaźnik wskazujący w prawo",bull:"Punktor",rarr:"Strzałka w prawo",rArr:"Podwójna strzałka w prawo",hArr:"Podwójna strzałka w lewo",diams:"Czarny znak karo",asymp:"Znak prawie równe"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/pt-br.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/pt-br.js
new file mode 100644
index 00000000..cb4ea1a1
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/pt-br.js
@@ -0,0 +1,11 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","pt-br",{euro:"Euro",lsquo:"Aspas simples esquerda",rsquo:"Aspas simples direita",ldquo:"Aspas duplas esquerda",rdquo:"Aspas duplas direita",ndash:"Traço",mdash:"Travessão",iexcl:"Ponto de exclamação invertido",cent:"Cent",pound:"Cerquilha",curren:"Dinheiro",yen:"Yen",brvbar:"Bara interrompida",sect:"Símbolo de Parágrafo",uml:"Trema",copy:"Direito de Cópia",ordf:"Indicador ordinal feminino",laquo:"Aspas duplas angulares esquerda",not:"Negação",reg:"Marca Registrada",
+macr:"Mácron",deg:"Grau",sup2:"2 Superscrito",sup3:"3 Superscrito",acute:"Acento agudo",micro:"Micro",para:"Pé de mosca",middot:"Ponto mediano",cedil:"Cedilha",sup1:"1 Superscrito",ordm:"Indicador ordinal masculino",raquo:"Aspas duplas angulares direita",frac14:"Um quarto",frac12:"Um meio",frac34:"Três quartos",iquest:"Interrogação invertida",Agrave:"A maiúsculo com acento grave",Aacute:"A maiúsculo com acento agudo",Acirc:"A maiúsculo com acento circunflexo",Atilde:"A maiúsculo com til",Auml:"A maiúsculo com trema",
+Aring:"A maiúsculo com anel acima",AElig:"Æ maiúsculo",Ccedil:"Ç maiúlculo",Egrave:"E maiúsculo com acento grave",Eacute:"E maiúsculo com acento agudo",Ecirc:"E maiúsculo com acento circumflexo",Euml:"E maiúsculo com trema",Igrave:"I maiúsculo com acento grave",Iacute:"I maiúsculo com acento agudo",Icirc:"I maiúsculo com acento circunflexo",Iuml:"I maiúsculo com crase",ETH:"Eth maiúsculo",Ntilde:"N maiúsculo com til",Ograve:"O maiúsculo com acento grave",Oacute:"O maiúsculo com acento agudo",Ocirc:"O maiúsculo com acento circunflexo",
+Otilde:"O maiúsculo com til",Ouml:"O maiúsculo com trema",times:"Multiplicação",Oslash:"Diâmetro",Ugrave:"U maiúsculo com acento grave",Uacute:"U maiúsculo com acento agudo",Ucirc:"U maiúsculo com acento circunflexo",Uuml:"U maiúsculo com trema",Yacute:"Y maiúsculo com acento agudo",THORN:"Thorn maiúsculo",szlig:"Eszett minúsculo",agrave:"a minúsculo com acento grave",aacute:"a minúsculo com acento agudo",acirc:"a minúsculo com acento circunflexo",atilde:"a minúsculo com til",auml:"a minúsculo com trema",
+aring:"a minúsculo com anel acima",aelig:"æ minúsculo",ccedil:"ç minúsculo",egrave:"e minúsculo com acento grave",eacute:"e minúsculo com acento agudo",ecirc:"e minúsculo com acento circunflexo",euml:"e minúsculo com trema",igrave:"i minúsculo com acento grave",iacute:"i minúsculo com acento agudo",icirc:"i minúsculo com acento circunflexo",iuml:"i minúsculo com trema",eth:"eth minúsculo",ntilde:"n minúsculo com til",ograve:"o minúsculo com acento grave",oacute:"o minúsculo com acento agudo",ocirc:"o minúsculo com acento circunflexo",
+otilde:"o minúsculo com til",ouml:"o minúsculo com trema",divide:"Divisão",oslash:"o minúsculo com cortado ou diâmetro",ugrave:"u minúsculo com acento grave",uacute:"u minúsculo com acento agudo",ucirc:"u minúsculo com acento circunflexo",uuml:"u minúsculo com trema",yacute:"y minúsculo com acento agudo",thorn:"thorn minúsculo",yuml:"y minúsculo com trema",OElig:"Ligação tipográfica OE maiúscula",oelig:"Ligação tipográfica oe minúscula",372:"W maiúsculo com acento circunflexo",374:"Y maiúsculo com acento circunflexo",
+373:"w minúsculo com acento circunflexo",375:"y minúsculo com acento circunflexo",sbquo:"Aspas simples inferior direita",8219:"Aspas simples superior esquerda",bdquo:"Aspas duplas inferior direita",hellip:"Reticências",trade:"Trade mark",9658:"Ponta de seta preta para direita",bull:"Ponto lista",rarr:"Seta para direita",rArr:"Seta dupla para direita",hArr:"Seta dupla direita e esquerda",diams:"Ouros",asymp:"Aproximadamente"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/pt.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/pt.js
new file mode 100644
index 00000000..3517162a
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/pt.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","pt",{euro:"Símbolo do Euro",lsquo:"Aspa esquerda simples",rsquo:"Aspa direita simples",ldquo:"Aspa esquerda dupla",rdquo:"Aspa direita dupla",ndash:"Travessão Simples",mdash:"Travessão Longo",iexcl:"Ponto de exclamação invertido",cent:"Símbolo do Cêntimo",pound:"Símbolo da Libra",curren:"Símbolo de Moeda",yen:"Símbolo do Iene",brvbar:"Barra quebrada",sect:"Símbolo de Secção",uml:"Trema",copy:"Símbolo dos Direitos de Autor",ordf:"Indicador ordinal feminino",
+laquo:"Aspa esquerda ângulo duplo",not:"Não Símbolo",reg:"Símbolo de Registado",macr:"Mácron",deg:"Símbolo de Grau",sup2:"Expoente 2",sup3:"Expoente 3",acute:"Acento agudo",micro:"Símbolo de Micro",para:"Símbolo de Parágrafo",middot:"Ponto do Meio",cedil:"Cedilha",sup1:"Expoente 1",ordm:"Indicador ordinal masculino",raquo:"Aspas ângulo duplo pra Direita",frac14:"Fração vulgar 1/4",frac12:"Fração vulgar 1/2",frac34:"Fração vulgar 3/4",iquest:"Ponto de interrugação invertido",Agrave:"Letra maiúscula latina A com acento grave",
+Aacute:"Letra maiúscula latina A com acento agudo",Acirc:"Letra maiúscula latina A com circunflexo",Atilde:"Letra maiúscula latina A com til",Auml:"Letra maiúscula latina A com trema",Aring:"Letra maiúscula latina A com sinal diacrítico",AElig:"Letra Maiúscula Latina Æ",Ccedil:"Letra maiúscula latina C com cedilha",Egrave:"Letra maiúscula latina E com acento grave",Eacute:"Letra maiúscula latina E com acento agudo",Ecirc:"Letra maiúscula latina E com circunflexo",Euml:"Letra maiúscula latina E com trema",
+Igrave:"Letra maiúscula latina I com acento grave",Iacute:"Letra maiúscula latina I com acento agudo",Icirc:"Letra maiúscula latina I com cincunflexo",Iuml:"Letra maiúscula latina I com trema",ETH:"Letra maiúscula latina Eth (Ðð)",Ntilde:"Letra maiúscula latina N com til",Ograve:"Letra maiúscula latina O com acento grave",Oacute:"Letra maiúscula latina O com acento agudo",Ocirc:"Letra maiúscula latina I com circunflexo",Otilde:"Letra maiúscula latina O com til",Ouml:"Letra maiúscula latina O com trema",
+times:"Símbolo de Multiplicação",Oslash:"Letra maiúscula O com barra",Ugrave:"Letra maiúscula latina U com acento grave",Uacute:"Letra maiúscula latina U com acento agudo",Ucirc:"Letra maiúscula latina U com circunflexo",Uuml:"Letra maiúscula latina E com trema",Yacute:"Letra maiúscula latina Y com acento agudo",THORN:"Letra maiúscula latina Rúnico",szlig:"Letra minúscula latina s forte",agrave:"Letra minúscula latina a com acento grave",aacute:"Letra minúscula latina a com acento agudo",acirc:"Letra minúscula latina a com circunflexo",
+atilde:"Letra minúscula latina a com til",auml:"Letra minúscula latina a com trema",aring:"Letra minúscula latina a com sinal diacrítico",aelig:"Letra minúscula latina æ",ccedil:"Letra minúscula latina c com cedilha",egrave:"Letra minúscula latina e com acento grave",eacute:"Letra minúscula latina e com acento agudo",ecirc:"Letra minúscula latina e com circunflexo",euml:"Letra minúscula latina e com trema",igrave:"Letra minúscula latina i com acento grave",iacute:"Letra minúscula latina i com acento agudo",
+icirc:"Letra minúscula latina i com circunflexo",iuml:"Letra pequena latina i com trema",eth:"Letra minúscula latina eth",ntilde:"Letra minúscula latina n com til",ograve:"Letra minúscula latina o com acento grave",oacute:"Letra minúscula latina o com acento agudo",ocirc:"Letra minúscula latina o com circunflexo",otilde:"Letra minúscula latina o com til",ouml:"Letra minúscula latina o com trema",divide:"Símbolo de Divisão",oslash:"Letra minúscula latina o com barra",ugrave:"Letra minúscula latina u com acento grave",
+uacute:"Letra minúscula latina u com acento agudo",ucirc:"Letra minúscula latina u com circunflexo",uuml:"Letra minúscula latina u com trema",yacute:"Letra minúscula latina y com acento agudo",thorn:"Letra minúscula latina Rúnico",yuml:"Letra minúscula latina y com trema",OElig:"Ligadura maiúscula latina OE",oelig:"Ligadura minúscula latina oe",372:"Letra maiúscula latina W com circunflexo",374:"Letra maiúscula latina Y com circunflexo",373:"Letra minúscula latina w com circunflexo",375:"Letra minúscula latina y com circunflexo",
+sbquo:"Aspa Simples inferior-9",8219:"Aspa Simples superior invertida-9",bdquo:"Aspa Duplas inferior-9",hellip:"Elipse Horizontal ",trade:"Símbolo de Marca Registada",9658:"Ponteiro preto direito",bull:"Marca",rarr:"Seta para a direita",rArr:"Seta dupla para a direita",hArr:"Seta dupla direita esquerda",diams:"Naipe diamante preto",asymp:"Quase igual a "});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ru.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ru.js
new file mode 100644
index 00000000..622078d7
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ru.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","ru",{euro:"Знак евро",lsquo:"Левая одинарная кавычка",rsquo:"Правая одинарная кавычка",ldquo:"Левая двойная кавычка",rdquo:"Левая двойная кавычка",ndash:"Среднее тире",mdash:"Длинное тире",iexcl:"перевёрнутый восклицательный знак",cent:"Цент",pound:"Фунт",curren:"Знак валюты",yen:"Йена",brvbar:"Вертикальная черта с разрывом",sect:"Знак параграфа",uml:"Умлаут",copy:"Знак охраны авторского права",ordf:"Указатель окончания женского рода ...ая",laquo:"Левая кавычка-«ёлочка»",
+not:"Отрицание",reg:"Знак охраны смежных прав\\t",macr:"Макрон",deg:"Градус",sup2:"Надстрочное два",sup3:"Надстрочное три",acute:"Акут",micro:"Микро",para:"Абзац",middot:"Интерпункт",cedil:"Седиль",sup1:"Надстрочная единица",ordm:"Порядковое числительное",raquo:"Правая кавычка-«ёлочка»",frac14:"Одна четвертая",frac12:"Одна вторая",frac34:"Три четвёртых",iquest:"Перевёрнутый вопросительный знак",Agrave:"Латинская заглавная буква А с апострофом",Aacute:"Латинская заглавная буква A с ударением",Acirc:"Латинская заглавная буква А с циркумфлексом",
+Atilde:"Латинская заглавная буква А с тильдой",Auml:"Латинская заглавная буква А с тремой",Aring:"Латинская заглавная буква А с кольцом над ней",AElig:"Латинская большая буква Æ",Ccedil:"Латинская заглавная буква C с седилью",Egrave:"Латинская заглавная буква Е с апострофом",Eacute:"Латинская заглавная буква Е с ударением",Ecirc:"Латинская заглавная буква Е с циркумфлексом",Euml:"Латинская заглавная буква Е с тремой",Igrave:"Латинская заглавная буква I с апострофом",Iacute:"Латинская заглавная буква I с ударением",
+Icirc:"Латинская заглавная буква I с циркумфлексом",Iuml:"Латинская заглавная буква I с тремой",ETH:"Латинская большая буква Eth",Ntilde:"Латинская заглавная буква N с тильдой",Ograve:"Латинская заглавная буква O с апострофом",Oacute:"Латинская заглавная буква O с ударением",Ocirc:"Латинская заглавная буква O с циркумфлексом",Otilde:"Латинская заглавная буква O с тильдой",Ouml:"Латинская заглавная буква O с тремой",times:"Знак умножения",Oslash:"Латинская большая перечеркнутая O",Ugrave:"Латинская заглавная буква U с апострофом",
+Uacute:"Латинская заглавная буква U с ударением",Ucirc:"Латинская заглавная буква U с циркумфлексом",Uuml:"Латинская заглавная буква U с тремой",Yacute:"Латинская заглавная буква Y с ударением",THORN:"Латинская заглавная буква Thorn",szlig:"Знак диеза",agrave:"Латинская маленькая буква a с апострофом",aacute:"Латинская маленькая буква a с ударением",acirc:"Латинская маленькая буква a с циркумфлексом",atilde:"Латинская маленькая буква a с тильдой",auml:"Латинская маленькая буква a с тремой",aring:"Латинская маленькая буква a с кольцом",
+aelig:"Латинская маленькая буква æ",ccedil:"Латинская маленькая буква с с седилью",egrave:"Латинская маленькая буква е с апострофом",eacute:"Латинская маленькая буква е с ударением",ecirc:"Латинская маленькая буква е с циркумфлексом",euml:"Латинская маленькая буква е с тремой",igrave:"Латинская маленькая буква i с апострофом",iacute:"Латинская маленькая буква i с ударением",icirc:"Латинская маленькая буква i с циркумфлексом",iuml:"Латинская маленькая буква i с тремой",eth:"Латинская маленькая буква eth",
+ntilde:"Латинская маленькая буква n с тильдой",ograve:"Латинская маленькая буква o с апострофом",oacute:"Латинская маленькая буква o с ударением",ocirc:"Латинская маленькая буква o с циркумфлексом",otilde:"Латинская маленькая буква o с тильдой",ouml:"Латинская маленькая буква o с тремой",divide:"Знак деления",oslash:"Латинская строчная перечеркнутая o",ugrave:"Латинская маленькая буква u с апострофом",uacute:"Латинская маленькая буква u с ударением",ucirc:"Латинская маленькая буква u с циркумфлексом",
+uuml:"Латинская маленькая буква u с тремой",yacute:"Латинская маленькая буква y с ударением",thorn:"Латинская маленькая буква thorn",yuml:"Латинская маленькая буква y с тремой",OElig:"Латинская прописная лигатура OE",oelig:"Латинская строчная лигатура oe",372:"Латинская заглавная буква W с циркумфлексом",374:"Латинская заглавная буква Y с циркумфлексом",373:"Латинская маленькая буква w с циркумфлексом",375:"Латинская маленькая буква y с циркумфлексом",sbquo:"Нижняя одинарная кавычка",8219:"Правая одинарная кавычка",
+bdquo:"Левая двойная кавычка",hellip:"Горизонтальное многоточие",trade:"Товарный знак",9658:"Черный указатель вправо",bull:"Маркер списка",rarr:"Стрелка вправо",rArr:"Двойная стрелка вправо",hArr:"Двойная стрелка влево-вправо",diams:"Черный ромб",asymp:"Примерно равно"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/si.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/si.js
new file mode 100644
index 00000000..eac6894b
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/si.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","si",{euro:"යුරෝ සලකුණ",lsquo:"වමේ තනි උපුටා දක්වීම ",rsquo:"දකුණේ තනි උපුටා දක්වීම ",ldquo:"වමේ දිත්ව  උපුටා දක්වීම ",rdquo:"දකුණේ දිත්ව  උපුටා දක්වීම ",ndash:"En dash",mdash:"Em dash",iexcl:"යටිකුරු හර්ෂදී ",cent:"Cent sign",pound:"Pound sign",curren:"මුල්‍යමය ",yen:"යෙන් ",brvbar:"Broken bar",sect:"තෙරේම් ",uml:"Diaeresis",copy:"පිටපත් අයිතිය ",ordf:"දර්ශකය",laquo:"Left-pointing double angle quotation mark",not:"සලකුණක් නොවේ",reg:"සලකුණක් ලියාපදිංචි කිරීම",
+macr:"මුද්‍රිත ",deg:"සලකුණේ ",sup2:"උඩු ලකුණු දෙක",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent",
+Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent",
+Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",
+Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",
+aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde",
+ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",
+thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",
+bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/sk.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/sk.js
new file mode 100644
index 00000000..7a79fb25
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/sk.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","sk",{euro:"Znak eura",lsquo:"Ľavá jednoduchá úvodzovka",rsquo:"Pravá jednoduchá úvodzovka",ldquo:"Pravá dvojitá úvodzovka",rdquo:"Pravá dvojitá úvodzovka",ndash:"En pomlčka",mdash:"Em pomlčka",iexcl:"Obrátený výkričník",cent:"Znak centu",pound:"Znak libry",curren:"Znak meny",yen:"Znak jenu",brvbar:"Prerušená zvislá čiara",sect:"Znak odseku",uml:"Prehláska",copy:"Znak copyrightu",ordf:"Ženský indikátor rodu",laquo:"Znak dvojitých lomených úvodzoviek vľavo",not:"Logistický zápor",
+reg:"Znak registrácie",macr:"Pomlčka nad",deg:"Znak stupňa",sup2:"Dvojka ako horný index",sup3:"Trojka ako horný index",acute:"Dĺžeň",micro:"Znak mikro",para:"Znak odstavca",middot:"Bodka uprostred",cedil:"Chvost vľavo",sup1:"Jednotka ako horný index",ordm:"Mužský indikátor rodu",raquo:"Znak dvojitých lomených úvodzoviek vpravo",frac14:"Obyčajný zlomok jedna štvrtina",frac12:"Obyčajný zlomok jedna polovica",frac34:"Obyčajný zlomok tri štvrtiny",iquest:"Otočený otáznik",Agrave:"Veľké písmeno latinky A s accentom",
+Aacute:"Veľké písmeno latinky A s dĺžňom",Acirc:"Veľké písmeno latinky A s mäkčeňom",Atilde:"Veľké písmeno latinky A s tildou",Auml:"Veľké písmeno latinky A s dvoma bodkami",Aring:"Veľké písmeno latinky A s krúžkom nad",AElig:"Veľké písmeno latinky Æ",Ccedil:"Veľké písmeno latinky C s chvostom vľavo",Egrave:"Veľké písmeno latinky E s accentom",Eacute:"Veľké písmeno latinky E s dĺžňom",Ecirc:"Veľké písmeno latinky E s mäkčeňom",Euml:"Veľké písmeno latinky E s dvoma bodkami",Igrave:"Veľké písmeno latinky I s accentom",
+Iacute:"Veľké písmeno latinky I s dĺžňom",Icirc:"Veľké písmeno latinky I s mäkčeňom",Iuml:"Veľké písmeno latinky I s dvoma bodkami",ETH:"Veľké písmeno latinky Eth",Ntilde:"Veľké písmeno latinky N s tildou",Ograve:"Veľké písmeno latinky O s accentom",Oacute:"Veľké písmeno latinky O s dĺžňom",Ocirc:"Veľké písmeno latinky O s mäkčeňom",Otilde:"Veľké písmeno latinky O s tildou",Ouml:"Veľké písmeno latinky O s dvoma bodkami",times:"Znak násobenia",Oslash:"Veľké písmeno latinky O preškrtnuté",Ugrave:"Veľké písmeno latinky U s accentom",
+Uacute:"Veľké písmeno latinky U s dĺžňom",Ucirc:"Veľké písmeno latinky U s mäkčeňom",Uuml:"Veľké písmeno latinky U s dvoma bodkami",Yacute:"Veľké písmeno latinky Y s dĺžňom",THORN:"Veľké písmeno latinky Thorn",szlig:"Malé písmeno latinky ostré s",agrave:"Malé písmeno latinky a s accentom",aacute:"Malé písmeno latinky a s dĺžňom",acirc:"Malé písmeno latinky a s mäkčeňom",atilde:"Malé písmeno latinky a s tildou",auml:"Malé písmeno latinky a s dvoma bodkami",aring:"Malé písmeno latinky a s krúžkom nad",
+aelig:"Malé písmeno latinky æ",ccedil:"Malé písmeno latinky c s chvostom vľavo",egrave:"Malé písmeno latinky e s accentom",eacute:"Malé písmeno latinky e s dĺžňom",ecirc:"Malé písmeno latinky e s mäkčeňom",euml:"Malé písmeno latinky e s dvoma bodkami",igrave:"Malé písmeno latinky i s accentom",iacute:"Malé písmeno latinky i s dĺžňom",icirc:"Malé písmeno latinky i s mäkčeňom",iuml:"Malé písmeno latinky i s dvoma bodkami",eth:"Malé písmeno latinky eth",ntilde:"Malé písmeno latinky n s tildou",ograve:"Malé písmeno latinky o s accentom",
+oacute:"Malé písmeno latinky o s dĺžňom",ocirc:"Malé písmeno latinky o s mäkčeňom",otilde:"Malé písmeno latinky o s tildou",ouml:"Malé písmeno latinky o s dvoma bodkami",divide:"Znak delenia",oslash:"Malé písmeno latinky o preškrtnuté",ugrave:"Malé písmeno latinky u s accentom",uacute:"Malé písmeno latinky u s dĺžňom",ucirc:"Malé písmeno latinky u s mäkčeňom",uuml:"Malé písmeno latinky u s dvoma bodkami",yacute:"Malé písmeno latinky y s dĺžňom",thorn:"Malé písmeno latinky thorn",yuml:"Malé písmeno latinky y s dvoma bodkami",
+OElig:"Veľká ligatúra latinky OE",oelig:"Malá ligatúra latinky OE",372:"Veľké písmeno latinky W s mäkčeňom",374:"Veľké písmeno latinky Y s mäkčeňom",373:"Malé písmeno latinky w s mäkčeňom",375:"Malé písmeno latinky y s mäkčeňom",sbquo:"Dolná jednoduchá 9-úvodzovka",8219:"Horná jednoduchá otočená 9-úvodzovka",bdquo:"Dolná dvojitá 9-úvodzovka",hellip:"Trojbodkový úvod",trade:"Znak ibchodnej značky",9658:"Čierny ukazovateľ smerujúci vpravo",bull:"Kruh",rarr:"Šípka vpravo",rArr:"Dvojitá šipka vpravo",
+hArr:"Dvojitá šipka vľavo a vpravo",diams:"Čierne piky",asymp:"Skoro sa rovná"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/sl.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/sl.js
new file mode 100644
index 00000000..514e98ad
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/sl.js
@@ -0,0 +1,12 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","sl",{euro:"Evro znak",lsquo:"Levi enojni narekovaj",rsquo:"Desni enojni narekovaj",ldquo:"Levi dvojni narekovaj",rdquo:"Desni dvojni narekovaj",ndash:"En pomišljaj",mdash:"Em pomišljaj",iexcl:"Obrnjen klicaj",cent:"Cent znak",pound:"Funt znak",curren:"Znak valute",yen:"Jen znak",brvbar:"Zlomljena črta",sect:"Znak oddelka",uml:"Diaeresis",copy:"Znak avtorskih pravic",ordf:"Ženski zaporedni kazalnik",laquo:"Levi obrnjen dvojni kotni narekovaj",not:"Ne znak",reg:"Registrirani znak",
+macr:"Macron",deg:"Znak stopinj",sup2:"Nadpisano dva",sup3:"Nadpisano tri",acute:"Ostrivec",micro:"Mikro znak",para:"Pilcrow znak",middot:"Sredinska pika",cedil:"Cedilla",sup1:"Nadpisano ena",ordm:"Moški zaporedni kazalnik",raquo:"Desno obrnjen dvojni kotni narekovaj",frac14:"Ena četrtina",frac12:"Ena polovica",frac34:"Tri četrtine",iquest:"Obrnjen vprašaj",Agrave:"Velika latinska črka A s krativcem",Aacute:"Velika latinska črka A z ostrivcem",Acirc:"Velika latinska črka A s strešico",Atilde:"Velika latinska črka A z tildo",
+Auml:"Velika latinska črka A z diaeresis-om",Aring:"Velika latinska črka A z obročem",AElig:"Velika latinska črka Æ",Ccedil:"Velika latinska črka C s cedillo",Egrave:"Velika latinska črka E s krativcem",Eacute:"Velika latinska črka E z ostrivcem",Ecirc:"Velika latinska črka E s strešico",Euml:"Velika latinska črka E z diaeresis-om",Igrave:"Velika latinska črka I s krativcem",Iacute:"Velika latinska črka I z ostrivcem",Icirc:"Velika latinska črka I s strešico",Iuml:"Velika latinska črka I z diaeresis-om",
+ETH:"Velika latinska črka Eth",Ntilde:"Velika latinska črka N s tildo",Ograve:"Velika latinska črka O s krativcem",Oacute:"Velika latinska črka O z ostrivcem",Ocirc:"Velika latinska črka O s strešico",Otilde:"Velika latinska črka O s tildo",Ouml:"Velika latinska črka O z diaeresis-om",times:"Znak za množenje",Oslash:"Velika prečrtana latinska črka O",Ugrave:"Velika latinska črka U s krativcem",Uacute:"Velika latinska črka U z ostrivcem",Ucirc:"Velika latinska črka U s strešico",Uuml:"Velika latinska črka U z diaeresis-om",
+Yacute:"Velika latinska črka Y z ostrivcem",THORN:"Velika latinska črka Thorn",szlig:"Mala ostra latinska črka s",agrave:"Mala latinska črka a s krativcem",aacute:"Mala latinska črka a z ostrivcem",acirc:"Mala latinska črka a s strešico",atilde:"Mala latinska črka a s tildo",auml:"Mala latinska črka a z diaeresis-om",aring:"Mala latinska črka a z obročem",aelig:"Mala latinska črka æ",ccedil:"Mala latinska črka c s cedillo",egrave:"Mala latinska črka e s krativcem",eacute:"Mala latinska črka e z ostrivcem",
+ecirc:"Mala latinska črka e s strešico",euml:"Mala latinska črka e z diaeresis-om",igrave:"Mala latinska črka i s krativcem",iacute:"Mala latinska črka i z ostrivcem",icirc:"Mala latinska črka i s strešico",iuml:"Mala latinska črka i z diaeresis-om",eth:"Mala latinska črka eth",ntilde:"Mala latinska črka n s tildo",ograve:"Mala latinska črka o s krativcem",oacute:"Mala latinska črka o z ostrivcem",ocirc:"Mala latinska črka o s strešico",otilde:"Mala latinska črka o s tildo",ouml:"Mala latinska črka o z diaeresis-om",
+divide:"Znak za deljenje",oslash:"Mala prečrtana latinska črka o",ugrave:"Mala latinska črka u s krativcem",uacute:"Mala latinska črka u z ostrivcem",ucirc:"Mala latinska črka u s strešico",uuml:"Mala latinska črka u z diaeresis-om",yacute:"Mala latinska črka y z ostrivcem",thorn:"Mala latinska črka thorn",yuml:"Mala latinska črka y z diaeresis-om",OElig:"Velika latinska ligatura OE",oelig:"Mala latinska ligatura oe",372:"Velika latinska črka W s strešico",374:"Velika latinska črka Y s strešico",
+373:"Mala latinska črka w s strešico",375:"Mala latinska črka y s strešico",sbquo:"Enojni nizki-9 narekovaj",8219:"Enojni visoki-obrnjen-9 narekovaj",bdquo:"Dvojni nizki-9 narekovaj",hellip:"Horizontalni izpust",trade:"Znak blagovne znamke",9658:"Črni desno-usmerjen kazalec",bull:"Krogla",rarr:"Desno-usmerjena puščica",rArr:"Desno-usmerjena dvojna puščica",hArr:"Leva in desna dvojna puščica",diams:"Črna kara",asymp:"Skoraj enako"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/sq.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/sq.js
new file mode 100644
index 00000000..bab1b7e5
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/sq.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","sq",{euro:"Shenja e Euros",lsquo:"Thonjëza majtas me një vi",rsquo:"Thonjëza djathtas me një vi",ldquo:"Thonjëza majtas",rdquo:"Thonjëza djathtas",ndash:"En viza lidhëse",mdash:"Em viza lidhëse",iexcl:"Pikëçuditëse e përmbysur",cent:"Shenja e Centit",pound:"Shejna e Funtit",curren:"Shenja e valutës",yen:"Shenja e Jenit",brvbar:"Viza e këputur",sect:"Shenja e pjesës",uml:"Diaeresis",copy:"Shenja e të drejtave të kopjimit",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Nuk ka shenjë",reg:"Shenja e të regjistruarit",macr:"Macron",deg:"Shenja e shkallës",sup2:"Super-skripta dy",sup3:"Super-skripta tre",acute:"Theks i mprehtë",micro:"Shjenja e Mikros",para:"Pilcrow sign",middot:"Pika e Mesme",cedil:"Hark nën shkronja",sup1:"Super-skripta një",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Thyesa një të katrat",frac12:"Thyesa një të dytat",frac34:"Thyesa tre të katrat",iquest:"Pikëpyetje e përmbysur",Agrave:"Shkronja e madhe latine A me theks të rëndë",
+Aacute:"Shkronja e madhe latine A me theks akute",Acirc:"Shkronja e madhe latine A me theks lakor",Atilde:"Shkronja e madhe latine A me tildë",Auml:"Shkronja e madhe latine A me dy pika",Aring:"Shkronja e madhe latine A me unazë mbi",AElig:"Shkronja e madhe latine Æ",Ccedil:"Shkronja e madhe latine C me hark poshtë",Egrave:"Shkronja e madhe latine E me theks të rëndë",Eacute:"Shkronja e madhe latine E me theks akute",Ecirc:"Shkronja e madhe latine E me theks lakor",Euml:"Shkronja e madhe latine E me dy pika",
+Igrave:"Shkronja e madhe latine I me theks të rëndë",Iacute:"Shkronja e madhe latine I me theks akute",Icirc:"Shkronja e madhe latine I me theks lakor",Iuml:"Shkronja e madhe latine I me dy pika",ETH:"Shkronja e madhe latine Eth",Ntilde:"Shkronja e madhe latine N me tildë",Ograve:"Shkronja e madhe latine O me theks të rëndë",Oacute:"Shkronja e madhe latine O me theks akute",Ocirc:"Shkronja e madhe latine O me theks lakor",Otilde:"Shkronja e madhe latine O me tildë",Ouml:"Shkronja e madhe latine O me dy pika",
+times:"Shenja e shumëzimit",Oslash:"Shkronja e madhe latine O me vizë në mes",Ugrave:"Shkronja e madhe latine U me theks të rëndë",Uacute:"Shkronja e madhe latine U me theks akute",Ucirc:"Shkronja e madhe latine U me theks lakor",Uuml:"Shkronja e madhe latine U me dy pika",Yacute:"Shkronja e madhe latine Y me theks akute",THORN:"Shkronja e madhe latine Thorn",szlig:"Shkronja e vogë latine s e mprehtë",agrave:"Shkronja e vogë latine a me theks të rëndë",aacute:"Shkronja e vogë latine a me theks të mprehtë",
+acirc:"Shkronja e vogël latine a me theks lakor",atilde:"Shkronja e vogël latine a me tildë",auml:"Shkronja e vogël latine a me dy pika",aring:"Shkronja e vogë latine a me unazë mbi",aelig:"Shkronja e vogë latine æ",ccedil:"Shkronja e vogël latine c me hark poshtë",egrave:"Shkronja e vogë latine e me theks të rëndë",eacute:"Shkronja e vogë latine e me theks të mprehtë",ecirc:"Shkronja e vogël latine e me theks lakor",euml:"Shkronja e vogël latine e me dy pika",igrave:"Shkronja e vogë latine i me theks të rëndë",
+iacute:"Shkronja e vogë latine i me theks të mprehtë",icirc:"Shkronja e vogël latine i me theks lakor",iuml:"Shkronja e vogël latine i me dy pika",eth:"Shkronja e vogë latine eth",ntilde:"Shkronja e vogël latine n me tildë",ograve:"Shkronja e vogë latine o me theks të rëndë",oacute:"Shkronja e vogë latine o me theks të mprehtë",ocirc:"Shkronja e vogël latine o me theks lakor",otilde:"Shkronja e vogël latine o me tildë",ouml:"Shkronja e vogël latine o me dy pika",divide:"Shenja ndarëse",oslash:"Shkronja e vogël latine o me vizë në mes",
+ugrave:"Shkronja e vogë latine u me theks të rëndë",uacute:"Shkronja e vogë latine u me theks të mprehtë",ucirc:"Shkronja e vogël latine u me theks lakor",uuml:"Shkronja e vogël latine u me dy pika",yacute:"Shkronja e vogë latine y me theks të mprehtë",thorn:"Shkronja e vogël latine thorn",yuml:"Shkronja e vogël latine y me dy pika",OElig:"Shkronja e madhe e bashkuar latine OE",oelig:"Shkronja e vogël e bashkuar latine oe",372:"Shkronja e madhe latine W me theks lakor",374:"Shkronja e madhe latine Y me theks lakor",
+373:"Shkronja e vogël latine w me theks lakor",375:"Shkronja e vogël latine y me theks lakor",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Shenja e Simbolit Tregtarë",9658:"Black right-pointing pointer",bull:"Pulla",rarr:"Shigjeta djathtas",rArr:"Shenja të dyfishta djathtas",hArr:"Shigjeta e dyfishë majtas-djathtas",diams:"Black diamond suit",asymp:"Gati e barabar me"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/sv.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/sv.js
new file mode 100644
index 00000000..562aba47
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/sv.js
@@ -0,0 +1,11 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","sv",{euro:"Eurotecken",lsquo:"Enkelt vänster citattecken",rsquo:"Enkelt höger citattecken",ldquo:"Dubbelt vänster citattecken",rdquo:"Dubbelt höger citattecken",ndash:"Snedstreck",mdash:"Långt tankstreck",iexcl:"Inverterad utropstecken",cent:"Centtecken",pound:"Pundtecken",curren:"Valutatecken",yen:"Yentecken",brvbar:"Brutet lodrätt streck",sect:"Paragraftecken",uml:"Diaeresis",copy:"Upphovsrättstecken",ordf:"Feminit ordningstalsindikator",laquo:"Vänsterställt dubbelt vinkelcitationstecken",
+not:"Icke-tecken",reg:"Registrerad",macr:"Macron",deg:"Grader",sup2:"Upphöjt två",sup3:"Upphöjt tre",acute:"Akut accent",micro:"Mikrotecken",para:"Alinea",middot:"Centrerad prick",cedil:"Cedilj",sup1:"Upphöjt en",ordm:"Maskulina ordningsändelsen",raquo:"Högerställt dubbelt vinkelcitationstecken",frac14:"Bråktal - en kvart",frac12:"Bråktal - en halv",frac34:"Bråktal - tre fjärdedelar",iquest:"Inverterat frågetecken",Agrave:"Stort A med grav accent",Aacute:"Stort A med akutaccent",Acirc:"Stort A med circumflex",
+Atilde:"Stort A med tilde",Auml:"Stort A med diaresis",Aring:"Stort A med ring ovan",AElig:"Stort Æ",Ccedil:"Stort C med cedilj",Egrave:"Stort E med grav accent",Eacute:"Stort E med aktuaccent",Ecirc:"Stort E med circumflex",Euml:"Stort E med diaeresis",Igrave:"Stort I med grav accent",Iacute:"Stort I med akutaccent",Icirc:"Stort I med circumflex",Iuml:"Stort I med diaeresis",ETH:"Stort Eth",Ntilde:"Stort N med tilde",Ograve:"Stort O med grav accent",Oacute:"Stort O med aktuaccent",Ocirc:"Stort O med circumflex",
+Otilde:"Stort O med tilde",Ouml:"Stort O med diaeresis",times:"Multiplicera",Oslash:"Stor Ø",Ugrave:"Stort U med grav accent",Uacute:"Stort U med akutaccent",Ucirc:"Stort U med circumflex",Uuml:"Stort U med diaeresis",Yacute:"Stort Y med akutaccent",THORN:"Stort Thorn",szlig:"Litet dubbel-s/Eszett",agrave:"Litet a med grav accent",aacute:"Litet a med akutaccent",acirc:"Litet a med circumflex",atilde:"Litet a med tilde",auml:"Litet a med diaeresis",aring:"Litet a med ring ovan",aelig:"Bokstaven æ",
+ccedil:"Litet c med cedilj",egrave:"Litet e med grav accent",eacute:"Litet e med akutaccent",ecirc:"Litet e med circumflex",euml:"Litet e med diaeresis",igrave:"Litet i med grav accent",iacute:"Litet i med akutaccent",icirc:"LItet i med circumflex",iuml:"Litet i med didaeresis",eth:"Litet eth",ntilde:"Litet n med tilde",ograve:"LItet o med grav accent",oacute:"LItet o med akutaccent",ocirc:"Litet o med circumflex",otilde:"LItet o med tilde",ouml:"Litet o med diaeresis",divide:"Division",oslash:"ø",
+ugrave:"Litet u med grav accent",uacute:"Litet u med akutaccent",ucirc:"LItet u med circumflex",uuml:"Litet u med diaeresis",yacute:"Litet y med akutaccent",thorn:"Litet thorn",yuml:"Litet y med diaeresis",OElig:"Stor ligatur av OE",oelig:"Liten ligatur av oe",372:"Stort W med circumflex",374:"Stort Y med circumflex",373:"Litet w med circumflex",375:"Litet y med circumflex",sbquo:"Enkelt lågt 9-citationstecken",8219:"Enkelt högt bakvänt 9-citationstecken",bdquo:"Dubbelt lågt 9-citationstecken",hellip:"Horisontellt uteslutningstecken",
+trade:"Varumärke",9658:"Svart högervänd pekare",bull:"Listpunkt",rarr:"Högerpil",rArr:"Dubbel högerpil",hArr:"Dubbel vänsterpil",diams:"Svart ruter",asymp:"Ungefär lika med"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/th.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/th.js
new file mode 100644
index 00000000..77afffc3
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/th.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","th",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"สัญลักษณ์สกุลเงิน",yen:"สัญลักษณ์เงินเยน",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",
+Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",
+Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",
+Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",
+aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",
+ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",
+yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",
+trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"สัญลักษณ์หัวข้อย่อย",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/tr.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/tr.js
new file mode 100644
index 00000000..68836ab9
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/tr.js
@@ -0,0 +1,12 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","tr",{euro:"Euro işareti",lsquo:"Sol tek tırnak işareti",rsquo:"Sağ tek tırnak işareti",ldquo:"Sol çift tırnak işareti",rdquo:"Sağ çift tırnak işareti",ndash:"En tire",mdash:"Em tire",iexcl:"Ters ünlem işareti",cent:"Cent işareti",pound:"Pound işareti",curren:"Para birimi işareti",yen:"Yen işareti",brvbar:"Kırık bar",sect:"Bölüm işareti",uml:"İki sesli harfin ayrılması",copy:"Telif hakkı işareti",ordf:"Dişil sıralı gösterge",laquo:"Sol-işaret çift açı tırnak işareti",
+not:"Not işareti",reg:"Kayıtlı işareti",macr:"Makron",deg:"Derece işareti",sup2:"İkili üstsimge",sup3:"Üçlü üstsimge",acute:"Aksan işareti",micro:"Mikro işareti",para:"Pilcrow işareti",middot:"Orta nokta",cedil:"Kedilla",sup1:"Üstsimge",ordm:"Eril sıralı gösterge",raquo:"Sağ işaret çift açı tırnak işareti",frac14:"Bayağı kesrin dörtte biri",frac12:"Bayağı kesrin bir yarım",frac34:"Bayağı kesrin dörtte üç",iquest:"Ters soru işareti",Agrave:"Aksanlı latin harfi",Aacute:"Aşırı aksanıyla Latin harfi",
+Acirc:"Çarpık Latin harfi",Atilde:"Tilde latin harfi",Auml:"Sesli harf ayrılımlıı latin harfi",Aring:"Halkalı latin büyük A harfi",AElig:"Latin büyük Æ harfi",Ccedil:"Latin büyük C harfi ile kedilla",Egrave:"Aksanlı latin büyük E harfi",Eacute:"Aşırı vurgulu latin büyük E harfi",Ecirc:"Çarpık latin büyük E harfi",Euml:"Sesli harf ayrılımlıı latin büyük E harfi",Igrave:"Aksanlı latin büyük I harfi",Iacute:"Aşırı aksanlı latin büyük I harfi",Icirc:"Çarpık latin büyük I harfi",Iuml:"Sesli harf ayrılımlıı latin büyük I harfi",
+ETH:"Latin büyük Eth harfi",Ntilde:"Tildeli latin büyük N harfi",Ograve:"Aksanlı latin büyük O harfi",Oacute:"Aşırı aksanlı latin büyük O harfi",Ocirc:"Çarpık latin büyük O harfi",Otilde:"Tildeli latin büyük O harfi",Ouml:"Sesli harf ayrılımlı latin büyük O harfi",times:"Çarpma işareti",Oslash:"Vurgulu latin büyük O harfi",Ugrave:"Aksanlı latin büyük U harfi",Uacute:"Aşırı aksanlı latin büyük U harfi",Ucirc:"Çarpık latin büyük U harfi",Uuml:"Sesli harf ayrılımlı latin büyük U harfi",Yacute:"Aşırı aksanlı latin büyük Y harfi",
+THORN:"Latin büyük Thorn harfi",szlig:"Latin küçük keskin s harfi",agrave:"Aksanlı latin küçük a harfi",aacute:"Aşırı aksanlı latin küçük a harfi",acirc:"Çarpık latin küçük a harfi",atilde:"Tildeli latin küçük a harfi",auml:"Sesli harf ayrılımlı latin küçük a harfi",aring:"Halkalı latin küçük a harfi",aelig:"Latin büyük æ harfi",ccedil:"Kedillalı latin küçük c harfi",egrave:"Aksanlı latin küçük e harfi",eacute:"Aşırı aksanlı latin küçük e harfi",ecirc:"Çarpık latin küçük e harfi",euml:"Sesli harf ayrılımlı latin küçük e harfi",
+igrave:"Aksanlı latin küçük i harfi",iacute:"Aşırı aksanlı latin küçük i harfi",icirc:"Çarpık latin küçük i harfi",iuml:"Sesli harf ayrılımlı latin küçük i harfi",eth:"Latin küçük eth harfi",ntilde:"Tildeli latin küçük n harfi",ograve:"Aksanlı latin küçük o harfi",oacute:"Aşırı aksanlı latin küçük o harfi",ocirc:"Çarpık latin küçük o harfi",otilde:"Tildeli latin küçük o harfi",ouml:"Sesli harf ayrılımlı latin küçük o harfi",divide:"Bölme işareti",oslash:"Vurgulu latin küçük o harfi",ugrave:"Aksanlı latin küçük u harfi",
+uacute:"Aşırı aksanlı latin küçük u harfi",ucirc:"Çarpık latin küçük u harfi",uuml:"Sesli harf ayrılımlı latin küçük u harfi",yacute:"Aşırı aksanlı latin küçük y harfi",thorn:"Latin küçük thorn harfi",yuml:"Sesli harf ayrılımlı latin küçük y harfi",OElig:"Latin büyük bağlı OE harfi",oelig:"Latin küçük bağlı oe harfi",372:"Çarpık latin büyük W harfi",374:"Çarpık latin büyük Y harfi",373:"Çarpık latin küçük w harfi",375:"Çarpık latin küçük y harfi",sbquo:"Tek düşük-9 tırnak işareti",8219:"Tek yüksek-ters-9 tırnak işareti",
+bdquo:"Çift düşük-9 tırnak işareti",hellip:"Yatay elips",trade:"Marka tescili işareti",9658:"Siyah sağ işaret işaretçisi",bull:"Koyu nokta",rarr:"Sağa doğru ok",rArr:"Sağa doğru çift ok",hArr:"Sol, sağ çift ok",diams:"Siyah elmas takımı",asymp:"Hemen hemen eşit"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ug.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ug.js
new file mode 100644
index 00000000..783aa370
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/ug.js
@@ -0,0 +1,13 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","ug",{euro:"ياۋرو بەلگىسى",lsquo:"يالاڭ پەش سول",rsquo:"يالاڭ پەش ئوڭ",ldquo:"قوش پەش سول",rdquo:"قوش پەش ئوڭ",ndash:"سىزىقچە",mdash:"سىزىق",iexcl:"ئۈندەش",cent:"تىيىن بەلگىسى",pound:"فوند ستېرلىڭ",curren:"پۇل بەلگىسى",yen:"ياپونىيە يىنى",brvbar:"ئۈزۈك بالداق",sect:"پاراگراف بەلگىسى",uml:"تاۋۇش ئايرىش بەلگىسى",copy:"نەشر ھوقۇقى بەلگىسى",ordf:"Feminine ordinal indicator",laquo:"قوش تىرناق سول",not:"غەيرى بەلگە",reg:"خەتلەتكەن تاۋار ماركىسى",macr:"سوزۇش بەلگىسى",
+deg:"گىرادۇس بەلگىسى",sup2:"يۇقىرى ئىندېكىس 2",sup3:"يۇقىرى ئىندېكىس 3",acute:"ئۇرغۇ بەلگىسى",micro:"Micro sign",para:"ئابزاس بەلگىسى",middot:"ئوتتۇرا چېكىت",cedil:"ئاستىغا قوشۇلىدىغان بەلگە",sup1:"يۇقىرى ئىندېكىس 1",ordm:"Masculine ordinal indicator",raquo:"قوش تىرناق ئوڭ",frac14:"ئاددىي كەسىر تۆتتىن بىر",frac12:"ئاددىي كەسىر ئىككىدىن بىر",frac34:"ئاددىي كەسىر ئۈچتىن تۆرت",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent",
+Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent",
+Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"قوش پەش ئوڭ",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",
+Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",
+ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"تىك موللاق سوئال بەلگىسى",ograve:"Latin small letter o with grave accent",
+oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"بۆلۈش بەلگىسى",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",
+yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"خەتلەتكەن تاۋار ماركىسى بەلگىسى",9658:"Black right-pointing pointer",
+bull:"Bullet",rarr:"ئوڭ يا ئوق",rArr:"ئوڭ قوش سىزىق يا ئوق",hArr:"ئوڭ سول قوش سىزىق يا ئوق",diams:"ئۇيۇل غىچ",asymp:"تەخمىنەن تەڭ"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/uk.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/uk.js
new file mode 100644
index 00000000..7cb16800
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/uk.js
@@ -0,0 +1,12 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","uk",{euro:"Знак євро",lsquo:"Ліві одинарні лапки",rsquo:"Праві одинарні лапки",ldquo:"Ліві подвійні лапки",rdquo:"Праві подвійні лапки",ndash:"Середнє тире",mdash:"Довге тире",iexcl:"Перевернутий знак оклику",cent:"Знак цента",pound:"Знак фунта",curren:"Знак валюти",yen:"Знак єни",brvbar:"Переривчаста вертикальна лінія",sect:"Знак параграфу",uml:"Умлаут",copy:"Знак авторських прав",ordf:"Жіночий порядковий вказівник",laquo:"ліві вказівні подвійні кутові дужки",
+not:"Заперечення",reg:"Знак охорони суміжних прав",macr:"Макрон",deg:"Знак градуса",sup2:"два у верхньому індексі",sup3:"три у верхньому індексі",acute:"Знак акута",micro:"Знак мікро",para:"Знак абзацу",middot:"Інтерпункт",cedil:"Седиль",sup1:"Один у верхньому індексі",ordm:"Чоловічий порядковий вказівник",raquo:"праві вказівні подвійні кутові дужки",frac14:"Одна четвертина",frac12:"Одна друга",frac34:"три четвертих",iquest:"Перевернутий знак питання",Agrave:"Велика латинська A з гравісом",Aacute:"Велика латинська А з акутом",
+Acirc:"Велика латинська А з циркумфлексом",Atilde:"Велика латинська А з тильдою",Auml:"Велике латинське А з умлаутом",Aring:"Велика латинська A з кільцем згори",AElig:"Велика латинська Æ",Ccedil:"Велика латинська C з седиллю",Egrave:"Велика латинська E з гравісом",Eacute:"Велика латинська E з акутом",Ecirc:"Велика латинська E з циркумфлексом",Euml:"Велика латинська А з умлаутом",Igrave:"Велика латинська I з гравісом",Iacute:"Велика латинська I з акутом",Icirc:"Велика латинська I з циркумфлексом",
+Iuml:"Велика латинська І з умлаутом",ETH:"Велика латинська Eth",Ntilde:"Велика латинська N з тильдою",Ograve:"Велика латинська O з гравісом",Oacute:"Велика латинська O з акутом",Ocirc:"Велика латинська O з циркумфлексом",Otilde:"Велика латинська O з тильдою",Ouml:"Велика латинська О з умлаутом",times:"Знак множення",Oslash:"Велика латинська перекреслена O ",Ugrave:"Велика латинська U з гравісом",Uacute:"Велика латинська U з акутом",Ucirc:"Велика латинська U з циркумфлексом",Uuml:"Велика латинська U з умлаутом",
+Yacute:"Велика латинська Y з акутом",THORN:"Велика латинська Торн",szlig:"Мала латинська есцет",agrave:"Мала латинська a з гравісом",aacute:"Мала латинська a з акутом",acirc:"Мала латинська a з циркумфлексом",atilde:"Мала латинська a з тильдою",auml:"Мала латинська a з умлаутом",aring:"Мала латинська a з кільцем згори",aelig:"Мала латинська æ",ccedil:"Мала латинська C з седиллю",egrave:"Мала латинська e з гравісом",eacute:"Мала латинська e з акутом",ecirc:"Мала латинська e з циркумфлексом",euml:"Мала латинська e з умлаутом",
+igrave:"Мала латинська i з гравісом",iacute:"Мала латинська i з акутом",icirc:"Мала латинська i з циркумфлексом",iuml:"Мала латинська i з умлаутом",eth:"Мала латинська Eth",ntilde:"Мала латинська n з тильдою",ograve:"Мала латинська o з гравісом",oacute:"Мала латинська o з акутом",ocirc:"Мала латинська o з циркумфлексом",otilde:"Мала латинська o з тильдою",ouml:"Мала латинська o з умлаутом",divide:"Знак ділення",oslash:"Мала латинська перекреслена o",ugrave:"Мала латинська u з гравісом",uacute:"Мала латинська u з акутом",
+ucirc:"Мала латинська u з циркумфлексом",uuml:"Мала латинська u з умлаутом",yacute:"Мала латинська y з акутом",thorn:"Мала латинська торн",yuml:"Мала латинська y з умлаутом",OElig:"Велика латинська лігатура OE",oelig:"Мала латинська лігатура oe",372:"Велика латинська W з циркумфлексом",374:"Велика латинська Y з циркумфлексом",373:"Мала латинська w з циркумфлексом",375:"Мала латинська y з циркумфлексом",sbquo:"Одиничні нижні лабки",8219:"Верхні одиничні обернені лабки",bdquo:"Подвійні нижні лабки",
+hellip:"Три крапки",trade:"Знак торгової марки",9658:"Чорний правий вказівник",bull:"Маркер списку",rarr:"Стрілка вправо",rArr:"Подвійна стрілка вправо",hArr:"Подвійна стрілка вліво-вправо",diams:"Чорний діамонт",asymp:"Наближено дорівнює"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/vi.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/vi.js
new file mode 100644
index 00000000..03a5b753
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/vi.js
@@ -0,0 +1,14 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","vi",{euro:"Ký hiệu Euro",lsquo:"Dấu ngoặc đơn trái",rsquo:"Dấu ngoặc đơn phải",ldquo:"Dấu ngoặc đôi trái",rdquo:"Dấu ngoặc đôi phải",ndash:"Gạch ngang tiếng anh",mdash:"Gạch ngang Em",iexcl:"Chuyển đổi dấu chấm than",cent:"Ký tự tiền Mỹ",pound:"Ký tự tiền Anh",curren:"Ký tự tiền tệ",yen:"Ký tự tiền Yên Nhật",brvbar:"Thanh hỏng",sect:"Ký tự khu vực",uml:"Dấu tách đôi",copy:"Ký tự bản quyền",ordf:"Phần chỉ thị giống cái",laquo:"Chọn dấu ngoặc đôi trái",not:"Không có ký tự",
+reg:"Ký tự đăng ký",macr:"Dấu nguyên âm dài",deg:"Ký tự độ",sup2:"Chữ trồi lên trên dạng 2",sup3:"Chữ trồi lên trên dạng 3",acute:"Dấu trọng âm",micro:"Ký tự micro",para:"Ký tự đoạn văn",middot:"Dấu chấm tròn",cedil:"Dấu móc lưới",sup1:"Ký tự trồi lên cấp 1",ordm:"Ký tự biểu hiện giống đực",raquo:"Chọn dấu ngoặc đôi phải",frac14:"Tỉ lệ một phần tư",frac12:"Tỉ lệ một nửa",frac34:"Tỉ lệ ba phần tư",iquest:"Chuyển đổi dấu chấm hỏi",Agrave:"Ký tự la-tinh viết hoa A với dấu huyền",Aacute:"Ký tự la-tinh viết hoa A với dấu sắc",
+Acirc:"Ký tự la-tinh viết hoa A với dấu mũ",Atilde:"Ký tự la-tinh viết hoa A với dấu ngã",Auml:"Ký tự la-tinh viết hoa A với dấu hai chấm trên đầu",Aring:"Ký tự la-tinh viết hoa A với biểu tượng vòng tròn trên đầu",AElig:"Ký tự la-tinh viết hoa của Æ",Ccedil:"Ký tự la-tinh viết hoa C với dấu móc bên dưới",Egrave:"Ký tự la-tinh viết hoa E với dấu huyền",Eacute:"Ký tự la-tinh viết hoa E với dấu sắc",Ecirc:"Ký tự la-tinh viết hoa E với dấu mũ",Euml:"Ký tự la-tinh viết hoa E với dấu hai chấm trên đầu",
+Igrave:"Ký tự la-tinh viết hoa I với dấu huyền",Iacute:"Ký tự la-tinh viết hoa I với dấu sắc",Icirc:"Ký tự la-tinh viết hoa I với dấu mũ",Iuml:"Ký tự la-tinh viết hoa I với dấu hai chấm trên đầu",ETH:"Viết hoa của ký tự Eth",Ntilde:"Ký tự la-tinh viết hoa N với dấu ngã",Ograve:"Ký tự la-tinh viết hoa O với dấu huyền",Oacute:"Ký tự la-tinh viết hoa O với dấu sắc",Ocirc:"Ký tự la-tinh viết hoa O với dấu mũ",Otilde:"Ký tự la-tinh viết hoa O với dấu ngã",Ouml:"Ký tự la-tinh viết hoa O với dấu hai chấm trên đầu",
+times:"Ký tự phép toán nhân",Oslash:"Ký tự la-tinh viết hoa A với dấu ngã xuống",Ugrave:"Ký tự la-tinh viết hoa U với dấu huyền",Uacute:"Ký tự la-tinh viết hoa U với dấu sắc",Ucirc:"Ký tự la-tinh viết hoa U với dấu mũ",Uuml:"Ký tự la-tinh viết hoa U với dấu hai chấm trên đầu",Yacute:"Ký tự la-tinh viết hoa Y với dấu sắc",THORN:"Phần viết hoa của ký tự Thorn",szlig:"Ký tự viết nhỏ la-tinh của chữ s",agrave:"Ký tự la-tinh thường với dấu huyền",aacute:"Ký tự la-tinh thường với dấu sắc",acirc:"Ký tự la-tinh thường với dấu mũ",
+atilde:"Ký tự la-tinh thường với dấu ngã",auml:"Ký tự la-tinh thường với dấu hai chấm trên đầu",aring:"Ký tự la-tinh viết thường với biểu tượng vòng tròn trên đầu",aelig:"Ký tự la-tinh viết thường của æ",ccedil:"Ký tự la-tinh viết thường của c với dấu móc bên dưới",egrave:"Ký tự la-tinh viết thường e với dấu huyền",eacute:"Ký tự la-tinh viết thường e với dấu sắc",ecirc:"Ký tự la-tinh viết thường e với dấu mũ",euml:"Ký tự la-tinh viết thường e với dấu hai chấm trên đầu",igrave:"Ký tự la-tinh viết thường i với dấu huyền",
+iacute:"Ký tự la-tinh viết thường i với dấu sắc",icirc:"Ký tự la-tinh viết thường i với dấu mũ",iuml:"Ký tự la-tinh viết thường i với dấu hai chấm trên đầu",eth:"Ký tự la-tinh viết thường của eth",ntilde:"Ký tự la-tinh viết thường n với dấu ngã",ograve:"Ký tự la-tinh viết thường o với dấu huyền",oacute:"Ký tự la-tinh viết thường o với dấu sắc",ocirc:"Ký tự la-tinh viết thường o với dấu mũ",otilde:"Ký tự la-tinh viết thường o với dấu ngã",ouml:"Ký tự la-tinh viết thường o với dấu hai chấm trên đầu",
+divide:"Ký hiệu phép tính chia",oslash:"Ký tự la-tinh viết thường o với dấu ngã",ugrave:"Ký tự la-tinh viết thường u với dấu huyền",uacute:"Ký tự la-tinh viết thường u với dấu sắc",ucirc:"Ký tự la-tinh viết thường u với dấu mũ",uuml:"Ký tự la-tinh viết thường u với dấu hai chấm trên đầu",yacute:"Ký tự la-tinh viết thường y với dấu sắc",thorn:"Ký tự la-tinh viết thường của chữ thorn",yuml:"Ký tự la-tinh viết thường y với dấu hai chấm trên đầu",OElig:"Ký tự la-tinh viết hoa gạch nối OE",oelig:"Ký tự la-tinh viết thường gạch nối OE",
+372:"Ký tự la-tinh viết hoa W với dấu mũ",374:"Ký tự la-tinh viết hoa Y với dấu mũ",373:"Ký tự la-tinh viết thường w với dấu mũ",375:"Ký tự la-tinh viết thường y với dấu mũ",sbquo:"Dấu ngoặc đơn thấp số-9",8219:"Dấu ngoặc đơn đảo ngược số-9",bdquo:"Gấp đôi dấu ngoặc đơn số-9",hellip:"Tĩnh dược chiều ngang",trade:"Ký tự thương hiệu",9658:"Ký tự trỏ về hướng bên phải màu đen",bull:"Ký hiệu",rarr:"Mũi tên hướng bên phải",rArr:"Mũi tên hướng bên phải dạng đôi",hArr:"Mũi tên hướng bên trái dạng đôi",diams:"Ký hiệu hình thoi",
+asymp:"Gần bằng với"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/zh-cn.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/zh-cn.js
new file mode 100644
index 00000000..aa42b83c
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/lang/zh-cn.js
@@ -0,0 +1,9 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","zh-cn",{euro:"欧元符号",lsquo:"左单引号",rsquo:"右单引号",ldquo:"左双引号",rdquo:"右双引号",ndash:"短划线",mdash:"长划线",iexcl:"竖翻叹号",cent:"分币符号",pound:"英镑符号",curren:"货币符号",yen:"日元符号",brvbar:"间断条",sect:"节标记",uml:"分音符",copy:"版权所有标记",ordf:"阴性顺序指示符",laquo:"左指双尖引号",not:"非标记",reg:"注册标记",macr:"长音符",deg:"度标记",sup2:"上标二",sup3:"上标三",acute:"锐音符",micro:"微符",para:"段落标记",middot:"中间点",cedil:"下加符",sup1:"上标一",ordm:"阳性顺序指示符",raquo:"右指双尖引号",frac14:"普通分数四分之一",frac12:"普通分数二分之一",frac34:"普通分数四分之三",iquest:"竖翻问号",
+Agrave:"带抑音符的拉丁文大写字母 A",Aacute:"带锐音符的拉丁文大写字母 A",Acirc:"带扬抑符的拉丁文大写字母 A",Atilde:"带颚化符的拉丁文大写字母 A",Auml:"带分音符的拉丁文大写字母 A",Aring:"带上圆圈的拉丁文大写字母 A",AElig:"拉丁文大写字母 Ae",Ccedil:"带下加符的拉丁文大写字母 C",Egrave:"带抑音符的拉丁文大写字母 E",Eacute:"带锐音符的拉丁文大写字母 E",Ecirc:"带扬抑符的拉丁文大写字母 E",Euml:"带分音符的拉丁文大写字母 E",Igrave:"带抑音符的拉丁文大写字母 I",Iacute:"带锐音符的拉丁文大写字母 I",Icirc:"带扬抑符的拉丁文大写字母 I",Iuml:"带分音符的拉丁文大写字母 I",ETH:"拉丁文大写字母 Eth",Ntilde:"带颚化符的拉丁文大写字母 N",Ograve:"带抑音符的拉丁文大写字母 O",Oacute:"带锐音符的拉丁文大写字母 O",Ocirc:"带扬抑符的拉丁文大写字母 O",Otilde:"带颚化符的拉丁文大写字母 O",
+Ouml:"带分音符的拉丁文大写字母 O",times:"乘号",Oslash:"带粗线的拉丁文大写字母 O",Ugrave:"带抑音符的拉丁文大写字母 U",Uacute:"带锐音符的拉丁文大写字母 U",Ucirc:"带扬抑符的拉丁文大写字母 U",Uuml:"带分音符的拉丁文大写字母 U",Yacute:"带抑音符的拉丁文大写字母 Y",THORN:"拉丁文大写字母 Thorn",szlig:"拉丁文小写字母清音 S",agrave:"带抑音符的拉丁文小写字母 A",aacute:"带锐音符的拉丁文小写字母 A",acirc:"带扬抑符的拉丁文小写字母 A",atilde:"带颚化符的拉丁文小写字母 A",auml:"带分音符的拉丁文小写字母 A",aring:"带上圆圈的拉丁文小写字母 A",aelig:"拉丁文小写字母 Ae",ccedil:"带下加符的拉丁文小写字母 C",egrave:"带抑音符的拉丁文小写字母 E",eacute:"带锐音符的拉丁文小写字母 E",ecirc:"带扬抑符的拉丁文小写字母 E",euml:"带分音符的拉丁文小写字母 E",igrave:"带抑音符的拉丁文小写字母 I",
+iacute:"带锐音符的拉丁文小写字母 I",icirc:"带扬抑符的拉丁文小写字母 I",iuml:"带分音符的拉丁文小写字母 I",eth:"拉丁文小写字母 Eth",ntilde:"带颚化符的拉丁文小写字母 N",ograve:"带抑音符的拉丁文小写字母 O",oacute:"带锐音符的拉丁文小写字母 O",ocirc:"带扬抑符的拉丁文小写字母 O",otilde:"带颚化符的拉丁文小写字母 O",ouml:"带分音符的拉丁文小写字母 O",divide:"除号",oslash:"带粗线的拉丁文小写字母 O",ugrave:"带抑音符的拉丁文小写字母 U",uacute:"带锐音符的拉丁文小写字母 U",ucirc:"带扬抑符的拉丁文小写字母 U",uuml:"带分音符的拉丁文小写字母 U",yacute:"带抑音符的拉丁文小写字母 Y",thorn:"拉丁文小写字母 Thorn",yuml:"带分音符的拉丁文小写字母 Y",OElig:"拉丁文大写连字 Oe",oelig:"拉丁文小写连字 Oe",372:"带扬抑符的拉丁文大写字母 W",374:"带扬抑符的拉丁文大写字母 Y",
+373:"带扬抑符的拉丁文小写字母 W",375:"带扬抑符的拉丁文小写字母 Y",sbquo:"单下 9 形引号",8219:"单高横翻 9 形引号",bdquo:"双下 9 形引号",hellip:"水平省略号",trade:"商标标志",9658:"实心右指指针",bull:"加重号",rarr:"向右箭头",rArr:"向右双线箭头",hArr:"左右双线箭头",diams:"实心方块纸牌",asymp:"约等于"});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/specialchar.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/specialchar.js
new file mode 100644
index 00000000..7f4348c1
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/specialchar/dialogs/specialchar.js
@@ -0,0 +1,14 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("specialchar",function(i){var e,l=i.lang.specialchar,k=function(c){var b,c=c.data?c.data.getTarget():new CKEDITOR.dom.element(c);if("a"==c.getName()&&(b=c.getChild(0).getHtml()))c.removeClass("cke_light_background"),e.hide(),c=i.document.createElement("span"),c.setHtml(b),i.insertText(c.getText())},m=CKEDITOR.tools.addFunction(k),j,g=function(c,b){var a,b=b||c.data.getTarget();"span"==b.getName()&&(b=b.getParent());if("a"==b.getName()&&(a=b.getChild(0).getHtml())){j&&d(null,j);
+var f=e.getContentElement("info","htmlPreview").getElement();e.getContentElement("info","charPreview").getElement().setHtml(a);f.setHtml(CKEDITOR.tools.htmlEncode(a));b.getParent().addClass("cke_light_background");j=b}},d=function(c,b){b=b||c.data.getTarget();"span"==b.getName()&&(b=b.getParent());"a"==b.getName()&&(e.getContentElement("info","charPreview").getElement().setHtml("&nbsp;"),e.getContentElement("info","htmlPreview").getElement().setHtml("&nbsp;"),b.getParent().removeClass("cke_light_background"),
+j=void 0)},n=CKEDITOR.tools.addFunction(function(c){var c=new CKEDITOR.dom.event(c),b=c.getTarget(),a;a=c.getKeystroke();var f="rtl"==i.lang.dir;switch(a){case 38:if(a=b.getParent().getParent().getPrevious())a=a.getChild([b.getParent().getIndex(),0]),a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 40:if(a=b.getParent().getParent().getNext())if((a=a.getChild([b.getParent().getIndex(),0]))&&1==a.type)a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 32:k({data:c});c.preventDefault();
+break;case f?37:39:if(a=b.getParent().getNext())a=a.getChild(0),1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);else if(a=b.getParent().getParent().getNext())(a=a.getChild([0,0]))&&1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);break;case f?39:37:(a=b.getParent().getPrevious())?(a=a.getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):(a=b.getParent().getParent().getPrevious())?(a=a.getLast().getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):
+d(null,b)}});return{title:l.title,minWidth:430,minHeight:280,buttons:[CKEDITOR.dialog.cancelButton],charColumns:17,onLoad:function(){for(var c=this.definition.charColumns,b=i.config.specialChars,a=CKEDITOR.tools.getNextId()+"_specialchar_table_label",f=['<table role="listbox" aria-labelledby="'+a+'" style="width: 320px; height: 100%; border-collapse: separate;" align="center" cellspacing="2" cellpadding="2" border="0">'],d=0,g=b.length,h,e;d<g;){f.push('<tr role="presentation">');for(var j=0;j<c;j++,
+d++){if(h=b[d]){h instanceof Array?(e=h[1],h=h[0]):(e=h.replace("&","").replace(";","").replace("#",""),e=l[e]||h);var k="cke_specialchar_label_"+d+"_"+CKEDITOR.tools.getNextNumber();f.push('<td class="cke_dark_background" style="cursor: default" role="presentation"><a href="javascript: void(0);" role="option" aria-posinset="'+(d+1)+'"',' aria-setsize="'+g+'"',' aria-labelledby="'+k+'"',' class="cke_specialchar" title="',CKEDITOR.tools.htmlEncode(e),'" onkeydown="CKEDITOR.tools.callFunction( '+n+
+', event, this )" onclick="CKEDITOR.tools.callFunction('+m+', this); return false;" tabindex="-1"><span style="margin: 0 auto;cursor: inherit">'+h+'</span><span class="cke_voice_label" id="'+k+'">'+e+"</span></a>")}else f.push('<td class="cke_dark_background">&nbsp;');f.push("</td>")}f.push("</tr>")}f.push("</tbody></table>",'<span id="'+a+'" class="cke_voice_label">'+l.options+"</span>");this.getContentElement("info","charContainer").getElement().setHtml(f.join(""))},contents:[{id:"info",label:i.lang.common.generalTab,
+title:i.lang.common.generalTab,padding:0,align:"top",elements:[{type:"hbox",align:"top",widths:["320px","90px"],children:[{type:"html",id:"charContainer",html:"",onMouseover:g,onMouseout:d,focus:function(){var c=this.getElement().getElementsByTag("a").getItem(0);setTimeout(function(){c.focus();g(null,c)},0)},onShow:function(){var c=this.getElement().getChild([0,0,0,0,0]);setTimeout(function(){c.focus();g(null,c)},0)},onLoad:function(c){e=c.sender}},{type:"hbox",align:"top",widths:["100%"],children:[{type:"vbox",
+align:"top",children:[{type:"html",html:"<div></div>"},{type:"html",id:"charPreview",className:"cke_dark_background",style:"border:1px solid #eeeeee;font-size:28px;height:40px;width:70px;padding-top:9px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;",html:"<div>&nbsp;</div>"},{type:"html",id:"htmlPreview",className:"cke_dark_background",style:"border:1px solid #eeeeee;font-size:14px;height:20px;width:70px;padding-top:2px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;",
+html:"<div>&nbsp;</div>"}]}]}]}]}]}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/table/dialogs/table.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/table/dialogs/table.js
new file mode 100644
index 00000000..3d9a69ba
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/table/dialogs/table.js
@@ -0,0 +1,21 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(){function r(a){for(var e=0,l=0,k=0,m,g=a.$.rows.length;k<g;k++){m=a.$.rows[k];for(var d=e=0,c,b=m.cells.length;d<b;d++)c=m.cells[d],e+=c.colSpan;e>l&&(l=e)}return l}function o(a){return function(){var e=this.getValue(),e=!!(CKEDITOR.dialog.validate.integer()(e)&&0<e);e||(alert(a),this.select());return e}}function n(a,e){var l=function(g){return new CKEDITOR.dom.element(g,a.document)},n=a.editable(),m=a.plugins.dialogadvtab;return{title:a.lang.table.title,minWidth:310,minHeight:CKEDITOR.env.ie?
+310:280,onLoad:function(){var g=this,a=g.getContentElement("advanced","advStyles");if(a)a.on("change",function(){var a=this.getStyle("width",""),b=g.getContentElement("info","txtWidth");b&&b.setValue(a,!0);a=this.getStyle("height","");(b=g.getContentElement("info","txtHeight"))&&b.setValue(a,!0)})},onShow:function(){var g=a.getSelection(),d=g.getRanges(),c,b=this.getContentElement("info","txtRows"),h=this.getContentElement("info","txtCols"),p=this.getContentElement("info","txtWidth"),f=this.getContentElement("info",
+"txtHeight");"tableProperties"==e&&((g=g.getSelectedElement())&&g.is("table")?c=g:0<d.length&&(CKEDITOR.env.webkit&&d[0].shrink(CKEDITOR.NODE_ELEMENT),c=a.elementPath(d[0].getCommonAncestor(!0)).contains("table",1)),this._.selectedElement=c);c?(this.setupContent(c),b&&b.disable(),h&&h.disable()):(b&&b.enable(),h&&h.enable());p&&p.onChange();f&&f.onChange()},onOk:function(){var g=a.getSelection(),d=this._.selectedElement&&g.createBookmarks(),c=this._.selectedElement||l("table"),b={};this.commitContent(b,
+c);if(b.info){b=b.info;if(!this._.selectedElement)for(var h=c.append(l("tbody")),e=parseInt(b.txtRows,10)||0,f=parseInt(b.txtCols,10)||0,i=0;i<e;i++)for(var j=h.append(l("tr")),k=0;k<f;k++){var m=j.append(l("td"));CKEDITOR.env.ie||m.append(l("br"))}e=b.selHeaders;if(!c.$.tHead&&("row"==e||"both"==e)){j=new CKEDITOR.dom.element(c.$.createTHead());h=c.getElementsByTag("tbody").getItem(0);h=h.getElementsByTag("tr").getItem(0);for(i=0;i<h.getChildCount();i++)f=h.getChild(i),f.type==CKEDITOR.NODE_ELEMENT&&
+!f.data("cke-bookmark")&&(f.renameNode("th"),f.setAttribute("scope","col"));j.append(h.remove())}if(null!==c.$.tHead&&!("row"==e||"both"==e)){j=new CKEDITOR.dom.element(c.$.tHead);h=c.getElementsByTag("tbody").getItem(0);for(k=h.getFirst();0<j.getChildCount();){h=j.getFirst();for(i=0;i<h.getChildCount();i++)f=h.getChild(i),f.type==CKEDITOR.NODE_ELEMENT&&(f.renameNode("td"),f.removeAttribute("scope"));h.insertBefore(k)}j.remove()}if(!this.hasColumnHeaders&&("col"==e||"both"==e))for(j=0;j<c.$.rows.length;j++)f=
+new CKEDITOR.dom.element(c.$.rows[j].cells[0]),f.renameNode("th"),f.setAttribute("scope","row");if(this.hasColumnHeaders&&!("col"==e||"both"==e))for(i=0;i<c.$.rows.length;i++)j=new CKEDITOR.dom.element(c.$.rows[i]),"tbody"==j.getParent().getName()&&(f=new CKEDITOR.dom.element(j.$.cells[0]),f.renameNode("td"),f.removeAttribute("scope"));b.txtHeight?c.setStyle("height",b.txtHeight):c.removeStyle("height");b.txtWidth?c.setStyle("width",b.txtWidth):c.removeStyle("width");c.getAttribute("style")||c.removeAttribute("style")}if(this._.selectedElement)try{g.selectBookmarks(d)}catch(n){}else a.insertElement(c),
+setTimeout(function(){var g=new CKEDITOR.dom.element(c.$.rows[0].cells[0]),b=a.createRange();b.moveToPosition(g,CKEDITOR.POSITION_AFTER_START);b.select()},0)},contents:[{id:"info",label:a.lang.table.title,elements:[{type:"hbox",widths:[null,null],styles:["vertical-align:top"],children:[{type:"vbox",padding:0,children:[{type:"text",id:"txtRows","default":3,label:a.lang.table.rows,required:!0,controlStyle:"width:5em",validate:o(a.lang.table.invalidRows),setup:function(a){this.setValue(a.$.rows.length)},
+commit:k},{type:"text",id:"txtCols","default":2,label:a.lang.table.columns,required:!0,controlStyle:"width:5em",validate:o(a.lang.table.invalidCols),setup:function(a){this.setValue(r(a))},commit:k},{type:"html",html:"&nbsp;"},{type:"select",id:"selHeaders",requiredContent:"th","default":"",label:a.lang.table.headers,items:[[a.lang.table.headersNone,""],[a.lang.table.headersRow,"row"],[a.lang.table.headersColumn,"col"],[a.lang.table.headersBoth,"both"]],setup:function(a){var d=this.getDialog();d.hasColumnHeaders=
+!0;for(var c=0;c<a.$.rows.length;c++){var b=a.$.rows[c].cells[0];if(b&&"th"!=b.nodeName.toLowerCase()){d.hasColumnHeaders=!1;break}}null!==a.$.tHead?this.setValue(d.hasColumnHeaders?"both":"row"):this.setValue(d.hasColumnHeaders?"col":"")},commit:k},{type:"text",id:"txtBorder",requiredContent:"table[border]","default":a.filter.check("table[border]")?1:0,label:a.lang.table.border,controlStyle:"width:3em",validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidBorder),setup:function(a){this.setValue(a.getAttribute("border")||
+"")},commit:function(a,d){this.getValue()?d.setAttribute("border",this.getValue()):d.removeAttribute("border")}},{id:"cmbAlign",type:"select",requiredContent:"table[align]","default":"",label:a.lang.common.align,items:[[a.lang.common.notSet,""],[a.lang.common.alignLeft,"left"],[a.lang.common.alignCenter,"center"],[a.lang.common.alignRight,"right"]],setup:function(a){this.setValue(a.getAttribute("align")||"")},commit:function(a,d){this.getValue()?d.setAttribute("align",this.getValue()):d.removeAttribute("align")}}]},
+{type:"vbox",padding:0,children:[{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtWidth",requiredContent:"table{width}",controlStyle:"width:5em",label:a.lang.common.width,title:a.lang.common.cssLengthTooltip,"default":a.filter.check("table{width}")?500>n.getSize("width")?"100%":500:0,getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.width)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&&
+a.updateStyle("width",this.getValue())},setup:function(a){this.setValue(a.getStyle("width"))},commit:k}]},{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtHeight",requiredContent:"table{height}",controlStyle:"width:5em",label:a.lang.common.height,title:a.lang.common.cssLengthTooltip,"default":"",getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.height)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");
+a&&a.updateStyle("height",this.getValue())},setup:function(a){(a=a.getStyle("height"))&&this.setValue(a)},commit:k}]},{type:"html",html:"&nbsp;"},{type:"text",id:"txtCellSpace",requiredContent:"table[cellspacing]",controlStyle:"width:3em",label:a.lang.table.cellSpace,"default":a.filter.check("table[cellspacing]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing),setup:function(a){this.setValue(a.getAttribute("cellSpacing")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellSpacing",
+this.getValue()):d.removeAttribute("cellSpacing")}},{type:"text",id:"txtCellPad",requiredContent:"table[cellpadding]",controlStyle:"width:3em",label:a.lang.table.cellPad,"default":a.filter.check("table[cellpadding]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding),setup:function(a){this.setValue(a.getAttribute("cellPadding")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellPadding",this.getValue()):d.removeAttribute("cellPadding")}}]}]},{type:"html",align:"right",
+html:""},{type:"vbox",padding:0,children:[{type:"text",id:"txtCaption",requiredContent:"caption",label:a.lang.table.caption,setup:function(a){this.enable();a=a.getElementsByTag("caption");if(0<a.count()){var a=a.getItem(0),d=a.getFirst(CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT));d&&!d.equals(a.getBogus())?(this.disable(),this.setValue(a.getText())):(a=CKEDITOR.tools.trim(a.getText()),this.setValue(a))}},commit:function(e,d){if(this.isEnabled()){var c=this.getValue(),b=d.getElementsByTag("caption");
+if(c)0<b.count()?(b=b.getItem(0),b.setHtml("")):(b=new CKEDITOR.dom.element("caption",a.document),d.getChildCount()?b.insertBefore(d.getFirst()):b.appendTo(d)),b.append(new CKEDITOR.dom.text(c,a.document));else if(0<b.count())for(c=b.count()-1;0<=c;c--)b.getItem(c).remove()}}},{type:"text",id:"txtSummary",requiredContent:"table[summary]",label:a.lang.table.summary,setup:function(a){this.setValue(a.getAttribute("summary")||"")},commit:function(a,d){this.getValue()?d.setAttribute("summary",this.getValue()):
+d.removeAttribute("summary")}}]}]},m&&m.createAdvancedTab(a,null,"table")]}}var q=CKEDITOR.tools.cssLength,k=function(a){var e=this.id;a.info||(a.info={});a.info[e]=this.getValue()};CKEDITOR.dialog.add("table",function(a){return n(a,"table")});CKEDITOR.dialog.add("tableProperties",function(a){return n(a,"tableProperties")})})();
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/tabletools/dialogs/tableCell.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/tabletools/dialogs/tableCell.js
new file mode 100644
index 00000000..a328cc9e
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/tabletools/dialogs/tableCell.js
@@ -0,0 +1,16 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("cellProperties",function(f){var g=f.lang.table,c=g.cell,d=f.lang.common,h=CKEDITOR.dialog.validate,j=/^(\d+(?:\.\d+)?)(px|%)$/,e={type:"html",html:"&nbsp;"},k="rtl"==f.lang.dir,i=f.plugins.colordialog;return{title:c.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?450:410,minHeight:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?230:220,contents:[{id:"info",label:c.title,accessKey:"I",elements:[{type:"hbox",widths:["40%","5%","40%"],children:[{type:"vbox",padding:0,
+children:[{type:"hbox",widths:["70%","30%"],children:[{type:"text",id:"width",width:"100px",label:d.width,validate:h.number(c.invalidWidth),onLoad:function(){var a=this.getDialog().getContentElement("info","widthType").getElement(),b=this.getInputElement(),c=b.getAttribute("aria-labelledby");b.setAttribute("aria-labelledby",[c,a.$.id].join(" "))},setup:function(a){var b=parseInt(a.getAttribute("width"),10),a=parseInt(a.getStyle("width"),10);!isNaN(b)&&this.setValue(b);!isNaN(a)&&this.setValue(a)},
+commit:function(a){var b=parseInt(this.getValue(),10),c=this.getDialog().getValueOf("info","widthType");isNaN(b)?a.removeStyle("width"):a.setStyle("width",b+c);a.removeAttribute("width")},"default":""},{type:"select",id:"widthType",label:f.lang.table.widthUnit,labelStyle:"visibility:hidden","default":"px",items:[[g.widthPx,"px"],[g.widthPc,"%"]],setup:function(a){(a=j.exec(a.getStyle("width")||a.getAttribute("width")))&&this.setValue(a[2])}}]},{type:"hbox",widths:["70%","30%"],children:[{type:"text",
+id:"height",label:d.height,width:"100px","default":"",validate:h.number(c.invalidHeight),onLoad:function(){var a=this.getDialog().getContentElement("info","htmlHeightType").getElement(),b=this.getInputElement(),c=b.getAttribute("aria-labelledby");b.setAttribute("aria-labelledby",[c,a.$.id].join(" "))},setup:function(a){var b=parseInt(a.getAttribute("height"),10),a=parseInt(a.getStyle("height"),10);!isNaN(b)&&this.setValue(b);!isNaN(a)&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),
+10);isNaN(b)?a.removeStyle("height"):a.setStyle("height",CKEDITOR.tools.cssLength(b));a.removeAttribute("height")}},{id:"htmlHeightType",type:"html",html:"<br />"+g.widthPx}]},e,{type:"select",id:"wordWrap",label:c.wordWrap,"default":"yes",items:[[c.yes,"yes"],[c.no,"no"]],setup:function(a){var b=a.getAttribute("noWrap");("nowrap"==a.getStyle("white-space")||b)&&this.setValue("no")},commit:function(a){"no"==this.getValue()?a.setStyle("white-space","nowrap"):a.removeStyle("white-space");a.removeAttribute("noWrap")}},
+e,{type:"select",id:"hAlign",label:c.hAlign,"default":"",items:[[d.notSet,""],[d.alignLeft,"left"],[d.alignCenter,"center"],[d.alignRight,"right"]],setup:function(a){var b=a.getAttribute("align");this.setValue(a.getStyle("text-align")||b||"")},commit:function(a){var b=this.getValue();b?a.setStyle("text-align",b):a.removeStyle("text-align");a.removeAttribute("align")}},{type:"select",id:"vAlign",label:c.vAlign,"default":"",items:[[d.notSet,""],[d.alignTop,"top"],[d.alignMiddle,"middle"],[d.alignBottom,
+"bottom"],[c.alignBaseline,"baseline"]],setup:function(a){var b=a.getAttribute("vAlign"),a=a.getStyle("vertical-align");switch(a){case "top":case "middle":case "bottom":case "baseline":break;default:a=""}this.setValue(a||b||"")},commit:function(a){var b=this.getValue();b?a.setStyle("vertical-align",b):a.removeStyle("vertical-align");a.removeAttribute("vAlign")}}]},e,{type:"vbox",padding:0,children:[{type:"select",id:"cellType",label:c.cellType,"default":"td",items:[[c.data,"td"],[c.header,"th"]],
+setup:function(a){this.setValue(a.getName())},commit:function(a){a.renameNode(this.getValue())}},e,{type:"text",id:"rowSpan",label:c.rowSpan,"default":"",validate:h.integer(c.invalidRowSpan),setup:function(a){(a=parseInt(a.getAttribute("rowSpan"),10))&&1!=a&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("rowSpan",this.getValue()):a.removeAttribute("rowSpan")}},{type:"text",id:"colSpan",label:c.colSpan,"default":"",validate:h.integer(c.invalidColSpan),
+setup:function(a){(a=parseInt(a.getAttribute("colSpan"),10))&&1!=a&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("colSpan",this.getValue()):a.removeAttribute("colSpan")}},e,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"bgColor",label:c.bgColor,"default":"",setup:function(a){var b=a.getAttribute("bgColor");this.setValue(a.getStyle("background-color")||b)},commit:function(a){this.getValue()?a.setStyle("background-color",this.getValue()):
+a.removeStyle("background-color");a.removeAttribute("bgColor")}},i?{type:"button",id:"bgColorChoose","class":"colorChooser",label:c.chooseColor,onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){f.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info","bgColor").setValue(a);this.focus()},this)}}:e]},e,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"borderColor",label:c.borderColor,"default":"",setup:function(a){var b=
+a.getAttribute("borderColor");this.setValue(a.getStyle("border-color")||b)},commit:function(a){this.getValue()?a.setStyle("border-color",this.getValue()):a.removeStyle("border-color");a.removeAttribute("borderColor")}},i?{type:"button",id:"borderColorChoose","class":"colorChooser",label:c.chooseColor,style:(k?"margin-right":"margin-left")+": 10px",onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){f.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info",
+"borderColor").setValue(a);this.focus()},this)}}:e]}]}]}]}],onShow:function(){this.cells=CKEDITOR.plugins.tabletools.getSelectedCells(this._.editor.getSelection());this.setupContent(this.cells[0])},onOk:function(){for(var a=this._.editor.getSelection(),b=a.createBookmarks(),c=this.cells,d=0;d<c.length;d++)this.commitContent(c[d]);this._.editor.forceNextSelectionCheck();a.selectBookmarks(b);this._.editor.selectionChange()}}});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/dialogs/templates.css b/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/dialogs/templates.css
new file mode 100644
index 00000000..dcb79e50
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/dialogs/templates.css
@@ -0,0 +1,84 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+
+.cke_tpl_list
+{
+	border: #dcdcdc 2px solid;
+	background-color: #ffffff;
+	overflow-y: auto;
+	overflow-x: hidden;
+	width: 100%;
+	height: 220px;
+}
+
+.cke_tpl_item
+{
+	margin: 5px;
+	padding: 7px;
+	border: #eeeeee 1px solid;
+	*width: 88%;
+}
+
+.cke_tpl_preview
+{
+	border-collapse: separate;
+	text-indent:0;
+	width: 100%;
+}
+.cke_tpl_preview td
+{
+	padding: 2px;
+	vertical-align: middle;
+}
+.cke_tpl_preview .cke_tpl_preview_img
+{
+	width: 100px;
+}
+.cke_tpl_preview span
+{
+	white-space: normal;
+}
+
+.cke_tpl_title
+{
+	font-weight: bold;
+}
+
+.cke_tpl_list a:hover .cke_tpl_item,
+.cke_tpl_list a:focus .cke_tpl_item,
+.cke_tpl_list a:active .cke_tpl_item
+{
+	border: #ff9933 1px solid;
+	background-color: #fffacd;
+}
+
+.cke_tpl_list a:hover *,
+.cke_tpl_list a:focus *,
+.cke_tpl_list a:active *
+{
+	cursor: pointer;
+}
+
+/* IE6 contextual selectors childs won't get :hover transition until,
+	the hover style of the link itself contains certain CSS declarations.*/
+.cke_browser_ie6 .cke_tpl_list a:active,
+.cke_browser_ie6 .cke_tpl_list a:hover,
+.cke_browser_ie6 .cke_tpl_list a:focus
+{
+	background-position: 0 0;
+}
+
+.cke_hc .cke_tpl_list a:hover .cke_tpl_item,
+.cke_hc .cke_tpl_list a:focus .cke_tpl_item,
+.cke_hc .cke_tpl_list a:active .cke_tpl_item
+{
+	border-width: 3px;
+}
+
+.cke_tpl_empty, .cke_tpl_loading
+{
+	text-align: center;
+	padding: 5px;
+}
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/dialogs/templates.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/dialogs/templates.js
new file mode 100644
index 00000000..4867aca3
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/dialogs/templates.js
@@ -0,0 +1,10 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(){CKEDITOR.dialog.add("templates",function(c){function o(a,b){var k=CKEDITOR.dom.element.createFromHtml('<a href="javascript:void(0)" tabIndex="-1" role="option" ><div class="cke_tpl_item"></div></a>'),d='<table style="width:350px;" class="cke_tpl_preview" role="presentation"><tr>';a.image&&b&&(d+='<td class="cke_tpl_preview_img"><img src="'+CKEDITOR.getUrl(b+a.image)+'"'+(CKEDITOR.env.ie6Compat?' onload="this.width=this.width"':"")+' alt="" title=""></td>');d+='<td style="white-space:normal;"><span class="cke_tpl_title">'+
+a.title+"</span><br/>";a.description&&(d+="<span>"+a.description+"</span>");k.getFirst().setHtml(d+"</td></tr></table>");k.on("click",function(){p(a.html)});return k}function p(a){var b=CKEDITOR.dialog.getCurrent();b.getValueOf("selectTpl","chkInsertOpt")?(c.fire("saveSnapshot"),c.setData(a,function(){b.hide();var a=c.createRange();a.moveToElementEditStart(c.editable());a.select();setTimeout(function(){c.fire("saveSnapshot")},0)})):(c.insertHtml(a),b.hide())}function i(a){var b=a.data.getTarget(),
+c=g.equals(b);if(c||g.contains(b)){var d=a.data.getKeystroke(),f=g.getElementsByTag("a"),e;if(f){if(c)e=f.getItem(0);else switch(d){case 40:e=b.getNext();break;case 38:e=b.getPrevious();break;case 13:case 32:b.fire("click")}e&&(e.focus(),a.data.preventDefault())}}}var h=CKEDITOR.plugins.get("templates");CKEDITOR.document.appendStyleSheet(CKEDITOR.getUrl(h.path+"dialogs/templates.css"));var g,h="cke_tpl_list_label_"+CKEDITOR.tools.getNextNumber(),f=c.lang.templates,l=c.config;return{title:c.lang.templates.title,
+minWidth:CKEDITOR.env.ie?440:400,minHeight:340,contents:[{id:"selectTpl",label:f.title,elements:[{type:"vbox",padding:5,children:[{id:"selectTplText",type:"html",html:"<span>"+f.selectPromptMsg+"</span>"},{id:"templatesList",type:"html",focus:!0,html:'<div class="cke_tpl_list" tabIndex="-1" role="listbox" aria-labelledby="'+h+'"><div class="cke_tpl_loading"><span></span></div></div><span class="cke_voice_label" id="'+h+'">'+f.options+"</span>"},{id:"chkInsertOpt",type:"checkbox",label:f.insertOption,
+"default":l.templates_replaceContent}]}]}],buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var a=this.getContentElement("selectTpl","templatesList");g=a.getElement();CKEDITOR.loadTemplates(l.templates_files,function(){var b=(l.templates||"default").split(",");if(b.length){var c=g;c.setHtml("");for(var d=0,h=b.length;d<h;d++)for(var e=CKEDITOR.getTemplates(b[d]),i=e.imagesPath,e=e.templates,n=e.length,j=0;j<n;j++){var m=o(e[j],i);m.setAttribute("aria-posinset",j+1);m.setAttribute("aria-setsize",
+n);c.append(m)}a.focus()}else g.setHtml('<div class="cke_tpl_empty"><span>'+f.emptyListMsg+"</span></div>")});this._.element.on("keydown",i)},onHide:function(){this._.element.removeListener("keydown",i)}}})})();
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/templates/default.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/templates/default.js
new file mode 100644
index 00000000..337f9fcf
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/templates/default.js
@@ -0,0 +1,6 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.addTemplates("default",{imagesPath:CKEDITOR.getUrl(CKEDITOR.plugins.getPath("templates")+"templates/images/"),templates:[{title:"Image and Title",image:"template1.gif",description:"One main image with a title and text that surround the image.",html:'<h3><img style="margin-right: 10px" height="100" width="100" align="left"/>Type the title here</h3><p>Type the text here</p>'},{title:"Strange Template",image:"template2.gif",description:"A template that defines two colums, each one with a title, and some text.",
+html:'<table cellspacing="0" cellpadding="0" style="width:100%" border="0"><tr><td style="width:50%"><h3>Title 1</h3></td><td></td><td style="width:50%"><h3>Title 2</h3></td></tr><tr><td>Text 1</td><td></td><td>Text 2</td></tr></table><p>More text goes here.</p>'},{title:"Text and Table",image:"template3.gif",description:"A title with some text and a table.",html:'<div style="width: 80%"><h3>Title goes here</h3><table style="width:150px;float: right" cellspacing="0" cellpadding="0" border="1"><caption style="border:solid 1px black"><strong>Table title</strong></caption><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr></table><p>Type the text here</p></div>'}]});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/templates/images/template1.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/templates/images/template1.gif
new file mode 100644
index 00000000..efdabbeb
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/templates/images/template1.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/templates/images/template2.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/templates/images/template2.gif
new file mode 100644
index 00000000..d1cebb3a
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/templates/images/template2.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/templates/images/template3.gif b/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/templates/images/template3.gif
new file mode 100644
index 00000000..db41cb4f
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/plugins/templates/templates/images/template3.gif differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/LICENSE.md b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/LICENSE.md
new file mode 100644
index 00000000..6096de23
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/LICENSE.md
@@ -0,0 +1,28 @@
+Software License Agreement
+==========================
+
+**CKEditor WSC Plugin**
+Copyright &copy; 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved.
+
+Licensed under the terms of any of the following licenses at your choice:
+
+*   GNU General Public License Version 2 or later (the "GPL"):
+    http://www.gnu.org/licenses/gpl.html
+
+*   GNU Lesser General Public License Version 2.1 or later (the "LGPL"):
+    http://www.gnu.org/licenses/lgpl.html
+
+*   Mozilla Public License Version 1.1 or later (the "MPL"):
+    http://www.mozilla.org/MPL/MPL-1.1.html
+
+You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice.
+
+Sources of Intellectual Property Included in this plugin
+--------------------------------------------------------
+
+Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission.
+
+Trademarks
+----------
+
+CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders.
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/README.md b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/README.md
new file mode 100644
index 00000000..346e2ab1
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/README.md
@@ -0,0 +1,25 @@
+CKEditor WebSpellChecker Plugin
+===============================
+
+This plugin brings Web Spell Checker (WSC) into CKEditor.
+
+WSC is "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution.
+
+Installation
+------------
+
+1. Clone/copy this repository contents in a new "plugins/wsc" folder in your CKEditor installation.
+2. Enable the "wsc" plugin in the CKEditor configuration file (config.js):
+
+        config.extraPlugins = 'wsc';
+
+That's all. WSC will appear on the editor toolbar and will be ready to use.
+
+License
+-------
+
+Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
+
+See LICENSE.md for more information.
+
+Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/).
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/ciframe.html b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/ciframe.html
new file mode 100644
index 00000000..1d6ba5a2
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/ciframe.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!--
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title></title>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<script type="text/javascript">
+
+function gup( name )
+{
+	name = name.replace( /[\[]/, '\\\[' ).replace( /[\]]/, '\\\]' ) ;
+	var regexS = '[\\?&]' + name + '=([^&#]*)' ;
+	var regex = new RegExp( regexS ) ;
+	var results = regex.exec( window.location.href ) ;
+
+	if ( results )
+		return results[ 1 ] ;
+	else
+		return '' ;
+}
+
+var interval;
+
+function sendData2Master()
+{
+	var destination = window.parent.parent ;
+	try
+	{
+		if ( destination.XDTMaster )
+		{
+			var t = destination.XDTMaster.read( [ gup( 'cmd' ), gup( 'data' ) ] ) ;
+			window.clearInterval( interval ) ;
+		}
+	}
+	catch (e) {}
+}
+
+function OnMessage (event) {
+	        var message = event.data;
+	        var destination = window.parent.parent;
+	        destination.XDTMaster.read( [ 'end', message, 'fpm' ] ) ;
+}
+
+function listenPostMessage() {
+    if (window.addEventListener) { // all browsers except IE before version 9
+            window.addEventListener ("message", OnMessage, false);
+    }else {
+            if (window.attachEvent) { // IE before version 9
+                        window.attachEvent("onmessage", OnMessage);
+                }
+        }
+}
+
+function onLoad()
+{
+	interval = window.setInterval( sendData2Master, 100 );
+	listenPostMessage();
+}
+
+</script>
+</head>
+<body onload="onLoad()"><p></p></body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/tmp.html b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/tmp.html
new file mode 100644
index 00000000..c00d8c2e
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/tmp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset="UTF-8">
+		<title>iframe</title>
+
+		<style>
+			html,body{
+				margin: 0;
+				height: 100%;
+				font: 13px/1.555 "Trebuchet MS", sans-serif;
+			}
+			a{
+			    color: #888;
+			    font-weight: bold;
+			    text-decoration: none;
+			    border-bottom: 1px solid #888;
+			}
+			.main-box {
+				color:#252525;
+				padding: 3px 5px;
+				text-align: justify;
+			}
+			.main-box p{margin: 0 0 14px;}
+			.main-box .cerr{
+			    color: #f00000;
+			    border-bottom-color: #f00000;
+			}
+		</style>
+	</head>
+	<body>
+		<div id="content" class="main-box"></div>
+		<iframe src="" frameborder="0" id="spelltext" name="spelltext" style="display:none; width: 100%" ></iframe>
+		<iframe src="" frameborder="0" id="loadsuggestfirst" name="loadsuggestfirst" style="display:none; width: 100%" ></iframe>
+		<iframe src="" frameborder="0" id="loadspellsuggestall" name="loadspellsuggestall" style="display:none; width: 100%" ></iframe>
+		<iframe src="" frameborder="0" id="loadOptionsForm" name="loadOptionsForm" style="display:none; width: 100%" ></iframe>
+		<script>
+		(function(window) {
+			// Constructor Manager PostMessage
+
+			var ManagerPostMessage = function() {
+				var _init = function(handler) {
+					if (document.addEventListener) {
+						window.addEventListener('message', handler, false);
+					} else {
+						window.attachEvent("onmessage", handler);
+					};
+				};
+				var _sendCmd = function(o) {
+					var str,
+						type = Object.prototype.toString,
+						fn = o.fn || null,
+						id = o.id || '',
+						target = o.target || window,
+						message = o.message || { 'id': id };
+
+					if (type.call(o.message) == "[object Object]") {
+						(o.message['id']) ? o.message['id'] : o.message['id'] = id;
+						message = o.message;
+					};
+
+					str = JSON.stringify(message, fn);
+					target.postMessage(str, '*');
+				};
+
+				return {
+					init: _init,
+					send: _sendCmd
+				};
+			};
+
+			var manageMessageTmp = new ManagerPostMessage;
+
+
+				var appString = (function(){
+					var spell = parent.CKEDITOR.config.wsc.DefaultParams.scriptPath;
+					var serverUrl = parent.CKEDITOR.config.wsc.DefaultParams.serviceHost;
+					return serverUrl + spell;
+				})();
+
+				function loadScript(src, callback) {
+				    var scriptTag = document.createElement("script");
+				   		scriptTag.type = "text/javascript";
+				   	callback ? callback : callback = function() {};
+				    if(scriptTag.readyState) {
+				        //IE
+				        scriptTag.onreadystatechange = function() {
+				            if (scriptTag.readyState == "loaded" ||
+				            scriptTag.readyState == "complete") {
+				                scriptTag.onreadystatechange = null;
+				                setTimeout(function(){scriptTag.parentNode.removeChild(scriptTag)},1)
+				                callback();
+				            }
+				        };
+				    }else{
+				        //Others
+				        scriptTag.onload = function() {
+				           setTimeout(function(){scriptTag.parentNode.removeChild(scriptTag)},1);
+				           callback();
+				        };
+				    };
+				    scriptTag.src = src;
+				    document.getElementsByTagName("head")[0].appendChild(scriptTag);
+				};
+
+
+				window.onload = function(){
+					 loadScript(appString, function(){
+						manageMessageTmp.send({
+							'id': 'iframeOnload',
+							'target': window.parent
+						});
+					});
+				}
+			})(this);
+		</script>
+	</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/tmpFrameset.html b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/tmpFrameset.html
new file mode 100644
index 00000000..88e1afe8
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/tmpFrameset.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
+<!--
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title></title>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<script type="text/javascript">
+
+function doLoadScript( url )
+{
+	if ( !url )
+		return false ;
+
+	var s = document.createElement( "script" ) ;
+	s.type = "text/javascript" ;
+	s.src = url ;
+	document.getElementsByTagName( "head" )[ 0 ].appendChild( s ) ;
+
+	return true ;
+}
+
+var opener;
+function tryLoad()
+{
+	opener = window.parent;
+
+	// get access to global parameters
+	var oParams = window.opener.oldFramesetPageParams;
+
+	// make frameset rows string prepare
+	var sFramesetRows = ( parseInt( oParams.firstframeh, 10 ) || '30') + ",*," + ( parseInt( oParams.thirdframeh, 10 ) || '150' ) + ',0' ;
+	document.getElementById( 'itFrameset' ).rows = sFramesetRows ;
+
+	// dynamic including init frames and crossdomain transport code
+	// from config sproxy_js_frameset url
+	var addScriptUrl = oParams.sproxy_js_frameset ;
+	doLoadScript( addScriptUrl ) ;
+}
+
+	</script>
+</head>
+
+<frameset id="itFrameset" onload="tryLoad();" border="0" rows="30,*,*,0">
+    <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="2" src="" name="navbar"></frame>
+    <frame scrolling="auto" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="0" src="" name="mid"></frame>
+    <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="bot"></frame>
+    <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="spellsuggestall"></frame>
+</frameset>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/wsc.css b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/wsc.css
new file mode 100644
index 00000000..e1639484
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/wsc.css
@@ -0,0 +1,82 @@
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+html, body
+{
+	background-color: transparent;
+	margin: 0px;
+	padding: 0px;
+}
+
+body
+{
+	padding: 10px;
+}
+
+body, td, input, select, textarea
+{
+	font-size: 11px;
+	font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana;
+}
+
+.midtext
+{
+	padding:0px;
+	margin:10px;
+}
+
+.midtext p
+{
+	padding:0px;
+	margin:10px;
+}
+
+.Button
+{
+	border: #737357 1px solid;
+	color: #3b3b1f;
+	background-color: #c7c78f;
+}
+
+.PopupTabArea
+{
+	color: #737357;
+	background-color: #e3e3c7;
+}
+
+.PopupTitleBorder
+{
+	border-bottom: #d5d59d 1px solid;
+}
+.PopupTabEmptyArea
+{
+	padding-left: 10px;
+	border-bottom: #d5d59d 1px solid;
+}
+
+.PopupTab, .PopupTabSelected
+{
+	border-right: #d5d59d 1px solid;
+	border-top: #d5d59d 1px solid;
+	border-left: #d5d59d 1px solid;
+	padding: 3px 5px 3px 5px;
+	color: #737357;
+}
+
+.PopupTab
+{
+	margin-top: 1px;
+	border-bottom: #d5d59d 1px solid;
+	cursor: pointer;
+}
+
+.PopupTabSelected
+{
+	font-weight: bold;
+	cursor: default;
+	padding-top: 4px;
+	border-bottom: #f1f1e3 1px solid;
+	background-color: #f1f1e3;
+}
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/wsc.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/wsc.js
new file mode 100644
index 00000000..9792b87c
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/wsc.js
@@ -0,0 +1,67 @@
+﻿/*
+ Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+(function(){function t(a){if(!a)throw"Languages-by-groups list are required for construct selectbox";var c=[],d="",f;for(f in a)for(var g in a[f]){var h=a[f][g];"en_US"==h?d=h:c.push(h)}c.sort();d&&c.unshift(d);return{getCurrentLangGroup:function(c){a:{for(var d in a)for(var f in a[d])if(f.toUpperCase()===c.toUpperCase()){c=d;break a}c=""}return c},setLangList:function(){var c={},d;for(d in a)for(var f in a[d])c[a[d][f]]=f;return c}()}}var e=function(){var a=function(a,b,f){var f=f||{},g=f.expires;
+if("number"==typeof g&&g){var h=new Date;h.setTime(h.getTime()+1E3*g);g=f.expires=h}g&&g.toUTCString&&(f.expires=g.toUTCString());var b=encodeURIComponent(b),a=a+"="+b,e;for(e in f)b=f[e],a+="; "+e,!0!==b&&(a+="="+b);document.cookie=a};return{postMessage:{init:function(a){document.addEventListener?window.addEventListener("message",a,!1):window.attachEvent("onmessage",a)},send:function(a){var b=a.fn||null,f=a.id||"",g=a.target||window,e=a.message||{id:f};"[object Object]"==Object.prototype.toString.call(a.message)&&
+(a.message.id||(a.message.id=f),e=a.message);a=window.JSON.stringify(e,b);g.postMessage(a,"*")}},hash:{create:function(){},parse:function(){}},cookie:{set:a,get:function(a){return(a=document.cookie.match(RegExp("(?:^|; )"+a.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)")))?decodeURIComponent(a[1]):void 0},remove:function(c){a(c,"",{expires:-1})}}}}(),a=a||{};a.TextAreaNumber=null;a.load=!0;a.cmd={SpellTab:"spell",Thesaurus:"thes",GrammTab:"grammar"};a.dialog=null;a.optionNode=null;a.selectNode=
+null;a.grammerSuggest=null;a.textNode={};a.iframeMain=null;a.dataTemp="";a.div_overlay=null;a.textNodeInfo={};a.selectNode={};a.selectNodeResponce={};a.langList=null;a.langSelectbox=null;a.banner="";a.show_grammar=null;a.div_overlay_no_check=null;a.targetFromFrame={};a.onLoadOverlay=null;a.LocalizationComing={};a.OverlayPlace=null;a.LocalizationButton={ChangeTo:{instance:null,text:"Change to"},ChangeAll:{instance:null,text:"Change All"},IgnoreWord:{instance:null,text:"Ignore word"},IgnoreAllWords:{instance:null,
+text:"Ignore all words"},Options:{instance:null,text:"Options",optionsDialog:{instance:null}},AddWord:{instance:null,text:"Add word"},FinishChecking:{instance:null,text:"Finish Checking"}};a.LocalizationLabel={ChangeTo:{instance:null,text:"Change to"},Suggestions:{instance:null,text:"Suggestions"}};var u=function(b){for(var c in b)b[c].instance.getElement().setText(a.LocalizationComing[c])},v=function(b){for(var c in b){if(!b[c].instance.setLabel)break;b[c].instance.setLabel(a.LocalizationComing[c])}},
+j,n;a.framesetHtml=function(b){return'<iframe src="'+a.templatePath+'" id='+a.iframeNumber+"_"+b+' frameborder="0" allowtransparency="1" style="width:100%;border: 1px solid #AEB3B9;overflow: auto;background:#fff; border-radius: 3px;"></iframe>'};a.setIframe=function(b,c){var d=a.framesetHtml(c);return b.getElement().setHtml(d)};a.setCurrentIframe=function(b){a.setIframe(a.dialog._.contents[b].Content,b)};a.setHeightBannerFrame=function(){var b=a.dialog.getContentElement("SpellTab","banner").getElement(),
+c=a.dialog.getContentElement("GrammTab","banner").getElement(),d=a.dialog.getContentElement("Thesaurus","banner").getElement();b.setStyle("height","90px");c.setStyle("height","90px");d.setStyle("height","90px")};a.setHeightFrame=function(){document.getElementById(a.iframeNumber+"_"+a.dialog._.currentTabId).style.height="240px"};a.sendData=function(b){var c=b._.currentTabId,d=b._.contents[c].Content,f,g;a.setIframe(d,c);b.parts.tabs.removeAllListeners();b.parts.tabs.on("click",function(e){e=e||window.event;
+e.data.getTarget().is("a")&&c!=b._.currentTabId&&(c=b._.currentTabId,d=b._.contents[c].Content,f=a.iframeNumber+"_"+c,a.div_overlay.setEnable(),d.getElement().getChildCount()?q(a.targetFromFrame[f],a.cmd[c]):(a.setIframe(d,c),g=document.getElementById(f),a.targetFromFrame[f]=g.contentWindow))})};a.buildSelectLang=function(a){var c=new CKEDITOR.dom.element("div"),d=new CKEDITOR.dom.element("select"),a="wscLang"+a;c.addClass("cke_dialog_ui_input_select");c.setAttribute("role","presentation");c.setStyles({height:"auto",
+position:"absolute",right:"0",top:"-1px",width:"160px","white-space":"normal"});d.setAttribute("id",a);d.addClass("cke_dialog_ui_input_select");d.setStyles({width:"160px"});c.append(d);return c};a.buildOptionLang=function(b,c){var d=document.getElementById("wscLang"+c),f=document.createDocumentFragment(),g,e,i=[];if(0===d.options.length){for(g in b)i.push([g,b[g]]);i.sort();for(var k=0;k<i.length;k++)g=document.createElement("option"),g.setAttribute("value",i[k][1]),e=document.createTextNode(i[k][0]),
+g.appendChild(e),i[k][1]==a.selectingLang&&g.setAttribute("selected","selected"),f.appendChild(g);d.appendChild(f)}};a.buildOptionSynonyms=function(b){b=a.selectNodeResponce[b];a.selectNode.synonyms.clear();for(var c=0;c<b.length;c++)a.selectNode.synonyms.add(b[c],b[c]);a.selectNode.synonyms.getInputElement().$.firstChild.selected=!0;a.textNode.Thesaurus.setValue(a.selectNode.synonyms.getInputElement().getValue())};var o=function(a){var c=document,d=a.target||c.body,f=a.id||"overlayBlock",g=a.opacity||
+"0.9",a=a.background||"#f1f1f1",e=c.getElementById(f),i=e||c.createElement("div");i.style.cssText="position: absolute;top:30px;bottom:41px;left:1px;right:1px;z-index: 10020;padding:0;margin:0;background:"+a+";opacity: "+g+";filter: alpha(opacity="+100*g+");display: none;";i.id=f;e||d.appendChild(i);return{setDisable:function(){i.style.display="none"},setEnable:function(){i.style.display="block"}}},w=function(b,c,d){var f=new CKEDITOR.dom.element("div"),e=new CKEDITOR.dom.element("input"),h=new CKEDITOR.dom.element("label"),
+i="wscGrammerSuggest"+b+"_"+c;f.addClass("cke_dialog_ui_input_radio");f.setAttribute("role","presentation");f.setStyles({width:"97%",padding:"5px","white-space":"normal"});e.setAttributes({type:"radio",value:c,name:"wscGrammerSuggest",id:i});e.setStyles({"float":"left"});e.on("click",function(b){a.textNode.GrammTab.setValue(b.sender.getValue())});d&&e.setAttribute("checked",!0);e.addClass("cke_dialog_ui_radio_input");h.appendText(b);h.setAttribute("for",i);h.setStyles({display:"block","line-height":"16px",
+"margin-left":"18px","white-space":"normal"});f.append(e);f.append(h);return f},r=function(b){b=b||"true";null!==b&&"false"==b&&a.dialog.hidePage("GrammTab")},m=function(b){var c=new t(b),b="wscLang"+a.dialog.getParentEditor().name,b=document.getElementById(b),d=a.iframeNumber+"_"+a.dialog._.currentTabId;a.buildOptionLang(c.setLangList,a.dialog.getParentEditor().name);s[c.getCurrentLangGroup(a.selectingLang)]();r(a.show_grammar);b.onchange=function(){s[c.getCurrentLangGroup(this.value)]();r(a.show_grammar);
+a.div_overlay.setEnable();a.selectingLang=this.value;e.postMessage.send({message:{changeLang:a.selectingLang,text:a.dataTemp},target:a.targetFromFrame[d],id:"selectionLang_outer__page"})}},x=function(b){if("no_any_suggestions"==b){b="No suggestions";a.LocalizationButton.ChangeTo.instance.disable();a.LocalizationButton.ChangeAll.instance.disable();var c=function(b){b=a.LocalizationButton[b].instance;b.getElement().hasClass("cke_disabled")?b.getElement().setStyle("color","#a0a0a0"):b.disable()};c("ChangeTo");
+c("ChangeAll")}else a.LocalizationButton.ChangeTo.instance.enable(),a.LocalizationButton.ChangeAll.instance.enable(),a.LocalizationButton.ChangeTo.instance.getElement().setStyle("color","#333"),a.LocalizationButton.ChangeAll.instance.getElement().setStyle("color","#333");return b},y={iframeOnload:function(){a.div_overlay.setEnable();var b=a.dialog._.currentTabId;q(a.targetFromFrame[a.iframeNumber+"_"+b],a.cmd[b])},suggestlist:function(b){delete b.id;a.div_overlay_no_check.setDisable();p();m(a.langList);
+var c=x(b.word),d="";c instanceof Array&&(c=b.word[0]);d=c=c.split(",");n.clear();a.textNode.SpellTab.setValue(d[0]);for(b=0;b<d.length;b++)n.add(d[b],d[b]);l();a.div_overlay.setDisable()},grammerSuggest:function(b){delete b.id;delete b.mocklangs;p();m(a.langList);var c=b.grammSuggest[0];a.grammerSuggest.getElement().setHtml("");a.textNode.GrammTab.reset();a.textNode.GrammTab.setValue(c);a.textNodeInfo.GrammTab.getElement().setHtml("");a.textNodeInfo.GrammTab.getElement().setText(b.info);for(var b=
+b.grammSuggest,c=b.length,d=!0,f=0;f<c;f++)a.grammerSuggest.getElement().append(w(b[f],b[f],d)),d=!1;l();a.div_overlay.setDisable()},thesaurusSuggest:function(b){delete b.id;delete b.mocklangs;p();m(a.langList);a.selectNodeResponce=b;a.textNode.Thesaurus.reset();a.selectNode.categories.clear();for(var c in b)a.selectNode.categories.add(c,c);b=a.selectNode.categories.getInputElement().getChildren().$[0].value;a.selectNode.categories.getInputElement().getChildren().$[0].selected=!0;a.buildOptionSynonyms(b);
+l();a.div_overlay.setDisable()},finish:function(b){delete b.id;a.dialog.getContentElement(a.dialog._.currentTabId,"bottomGroup").getElement().hide();a.dialog.getContentElement(a.dialog._.currentTabId,"BlockFinishChecking").getElement().show();a.div_overlay.setDisable()},settext:function(b){delete b.id;a.dialog.getParentEditor().focus();a.dialog.getParentEditor().setData(b.text,a.dataTemp="");a.dialog.hide()},ReplaceText:function(b){delete b.id;a.div_overlay.setEnable();a.dataTemp=b.text;a.selectingLang=
+b.currentLang;window.setTimeout(function(){a.div_overlay.setDisable()},500);u(a.LocalizationButton);v(a.LocalizationLabel)},options_checkbox_send:function(b){delete b.id;b={osp:e.cookie.get("osp"),udn:e.cookie.get("udn"),cust_dic_ids:a.cust_dic_ids};e.postMessage.send({message:b,target:a.targetFromFrame[a.iframeNumber+"_"+a.dialog._.currentTabId],id:"options_outer__page"})},getOptions:function(b){var c=b.DefOptions.udn;a.LocalizationComing=b.DefOptions.localizationButtonsAndText;a.show_grammar=b.show_grammar;
+a.langList=b.lang;if(a.bnr=b.bannerId){a.setHeightBannerFrame();var d=b.banner;a.dialog.getContentElement(a.dialog._.currentTabId,"banner").getElement().setHtml(d)}else a.setHeightFrame();"undefined"==c&&(a.userDictionaryName?(c=a.userDictionaryName,d={osp:e.cookie.get("osp"),udn:a.userDictionaryName,cust_dic_ids:a.cust_dic_ids,id:"options_dic_send",udnCmd:"create"},e.postMessage.send({message:d,target:a.targetFromFrame[void 0]})):c="");e.cookie.set("osp",b.DefOptions.osp);e.cookie.set("udn",c);e.cookie.set("cust_dic_ids",
+b.DefOptions.cust_dic_ids);e.postMessage.send({id:"giveOptions"})},options_dic_send:function(){var b={osp:e.cookie.get("osp"),udn:e.cookie.get("udn"),cust_dic_ids:a.cust_dic_ids,id:"options_dic_send",udnCmd:e.cookie.get("udnCmd")};e.postMessage.send({message:b,target:a.targetFromFrame[a.iframeNumber+"_"+a.dialog._.currentTabId]})},data:function(a){delete a.id},giveOptions:function(){},setOptionsConfirmF:function(){},setOptionsConfirmT:function(){j.setValue("")},clickBusy:function(){a.div_overlay.setEnable()},
+suggestAllCame:function(){a.div_overlay.setDisable();a.div_overlay_no_check.setDisable()},TextCorrect:function(){m(a.langList)}},z=function(a){a=a||window.event;a=window.JSON.parse(a.data);y[a.id](a)},q=function(b,c,d,f){c=c||CKEDITOR.config.wsc_cmd;d=d||a.dataTemp;e.postMessage.send({message:{customerId:a.wsc_customerId,text:d,txt_ctrl:a.TextAreaNumber,cmd:c,cust_dic_ids:a.cust_dic_ids,udn:a.userDictionaryName,slang:a.selectingLang,reset_suggest:f||!1},target:b,id:"data_outer__page"});a.div_overlay.setEnable()},
+s={superset:function(){a.dialog.showPage("Thesaurus");a.dialog.showPage("GrammTab");a.dialog.showPage("SpellTab")},usual:function(){a.dialog.hidePage("Thesaurus");a.dialog.hidePage("GrammTab");a.dialog.showPage("SpellTab")}},A=function(b){var c=new function(a){var b={};return{getCmdByTab:function(c){for(var e in a)b[a[e]]=e;return b[c]}}}(a.cmd);b.selectPage(c.getCmdByTab(CKEDITOR.config.wsc_cmd));a.sendData(b)},l=function(){a.dialog.getContentElement(a.dialog._.currentTabId,"bottomGroup").getElement().show()},
+p=function(){a.dialog.getContentElement(a.dialog._.currentTabId,"BlockFinishChecking").getElement().hide()};CKEDITOR.dialog.add("checkspell",function(b){var c=function(){a.div_overlay.setEnable();var c=a.dialog._.currentTabId,f=a.iframeNumber+"_"+c,g=a.textNode[c].getValue();e.postMessage.send({message:{cmd:this.getElement().getAttribute("title-cmd"),tabId:c,new_word:g},target:a.targetFromFrame[f],id:"cmd_outer__page"});"FinishChecking"==this.getElement().getAttribute("title-cmd")&&b.config.wsc_onFinish.call(CKEDITOR.document.getWindow().getFrame())};
+return{title:b.config.wsc_dialogTitle||b.lang.wsc.title,minWidth:560,minHeight:444,buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){a.dialog=this;a.TextAreaNumber="cke_textarea_"+CKEDITOR.currentInstance.name;e.postMessage.init(z);a.dataTemp=CKEDITOR.currentInstance.getData();a.OverlayPlace=a.dialog.parts.tabs.getParent().$;if(CKEDITOR&&CKEDITOR.config){a.wsc_customerId=b.config.wsc_customerId;a.cust_dic_ids=b.config.wsc_customDictionaryIds;a.userDictionaryName=b.config.wsc_userDictionaryName;
+a.defaultLanguage=CKEDITOR.config.defaultLanguage;var c="file:"==document.location.protocol?"http:":document.location.protocol;CKEDITOR.scriptLoader.load(b.config.wsc_customLoaderScript||c+"//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin=fck2&customerid="+a.wsc_customerId+"&cmd=script&doc=wsc&schema=22",function(c){CKEDITOR.config&&CKEDITOR.config.wsc&&CKEDITOR.config.wsc.DefaultParams?(a.serverLocationHash=CKEDITOR.config.wsc.DefaultParams.serviceHost,a.logotype=CKEDITOR.config.wsc.DefaultParams.logoPath,
+a.loadIcon=CKEDITOR.config.wsc.DefaultParams.iconPath,a.loadIconEmptyEditor=CKEDITOR.config.wsc.DefaultParams.iconPathEmptyEditor,a.LangComparer=new CKEDITOR.config.wsc.DefaultParams._SP_FCK_LangCompare):(a.serverLocationHash=DefaultParams.serviceHost,a.logotype=DefaultParams.logoPath,a.loadIcon=DefaultParams.iconPath,a.loadIconEmptyEditor=DefaultParams.iconPathEmptyEditor,a.LangComparer=new _SP_FCK_LangCompare);a.pluginPath=CKEDITOR.getUrl(b.plugins.wsc.path);a.iframeNumber=a.TextAreaNumber;a.templatePath=
+a.pluginPath+"dialogs/tmp.html";a.LangComparer.setDefaulLangCode(a.defaultLanguage);a.currentLang=b.config.wsc_lang||a.LangComparer.getSPLangCode(b.langCode);a.selectingLang=a.currentLang;a.div_overlay=new o({opacity:"1",background:"#fff url("+a.loadIcon+") no-repeat 50% 50%",target:a.OverlayPlace});var d=a.dialog.parts.tabs.getId(),d=CKEDITOR.document.getById(d);d.setStyle("width","97%");d.getElementsByTag("DIV").count()||d.append(a.buildSelectLang(a.dialog.getParentEditor().name));a.div_overlay_no_check=
+new o({opacity:"1",id:"no_check_over",background:"#fff url("+a.loadIconEmptyEditor+") no-repeat 50% 50%",target:a.OverlayPlace});c&&(A(a.dialog),a.dialog.setupContent(a.dialog))})}else a.dialog.hide()},onHide:function(){a.dataTemp=""},contents:[{id:"SpellTab",label:"SpellChecker",accessKey:"S",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"<div></div>"},{type:"html",id:"Content",label:"spellContent",html:"",setup:function(b){var b=a.iframeNumber+"_"+b._.currentTabId,c=document.getElementById(b);
+a.targetFromFrame[b]=c.contentWindow}},{type:"hbox",id:"bottomGroup",style:"width:560px; margin: 0 auto;",widths:["50%","50%"],children:[{type:"hbox",id:"leftCol",align:"left",width:"50%",children:[{type:"vbox",id:"rightCol1",widths:["50%","50%"],children:[{type:"text",id:"text",label:a.LocalizationLabel.ChangeTo.text+":",labelLayout:"horizontal",labelStyle:"font: 12px/25px arial, sans-serif;",width:"140px","default":"",onShow:function(){a.textNode.SpellTab=this;a.LocalizationLabel.ChangeTo.instance=
+this},onHide:function(){this.reset()}},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"text",id:"labelSuggestions",label:a.LocalizationLabel.Suggestions.text+":",onShow:function(){a.LocalizationLabel.Suggestions.instance=this;this.getInputElement().hide()}},{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',setup:function(){this.getElement().$.src=
+a.logotype;this.getElement().getParent().setStyles({"text-align":"left"})}}]},{type:"select",id:"list_of_suggestions",labelStyle:"font: 12px/25px arial, sans-serif;",size:"6",inputStyle:"width: 140px; height: auto;",items:[["loading..."]],onShow:function(){n=this},onHide:function(){this.clear()},onChange:function(){a.textNode.SpellTab.setValue(this.getValue())}}]}]}]},{type:"hbox",id:"rightCol",align:"right",width:"50%",children:[{type:"vbox",id:"rightCol_col__left",widths:["50%","50%","50%","50%"],
+children:[{type:"button",id:"ChangeTo",label:a.LocalizationButton.ChangeTo.text,title:"Change to",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.ChangeTo.instance=this},onClick:c},{type:"button",id:"ChangeAll",label:a.LocalizationButton.ChangeAll.text,title:"Change All",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.ChangeAll.instance=this},onClick:c},{type:"button",id:"AddWord",
+label:a.LocalizationButton.AddWord.text,title:"Add word",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.AddWord.instance=this},onClick:c},{type:"button",id:"FinishChecking",label:a.LocalizationButton.FinishChecking.text,title:"Finish Checking",style:"width: 100%;margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.FinishChecking.instance=this},onClick:c}]},{type:"vbox",id:"rightCol_col__right",
+widths:["50%","50%","50%"],children:[{type:"button",id:"IgnoreWord",label:a.LocalizationButton.IgnoreWord.text,title:"Ignore word",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.IgnoreWord.instance=this},onClick:c},{type:"button",id:"IgnoreAllWords",label:a.LocalizationButton.IgnoreAllWords.text,title:"Ignore all words",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.IgnoreAllWords.instance=
+this},onClick:c},{type:"button",id:"option",label:a.LocalizationButton.Options.text,title:"Option",style:"width: 100%;",onLoad:function(){a.LocalizationButton.Options.instance=this;"file:"==document.location.protocol&&this.disable()},onClick:function(){"file:"==document.location.protocol?alert("WSC: Options functionality is disabled when runing from file system"):b.openDialog("options")}}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",widths:["70%","30%"],onShow:function(){this.getElement().hide()},
+onHide:l,children:[{type:"hbox",id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",setup:function(){this.getChild()[0].getElement().$.src=a.logotype;this.getChild()[0].getElement().getParent().setStyles({"text-align":"center"})},children:[{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">'}]}]},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",
+id:"rightCol_col__left",children:[{type:"button",id:"Option_button",label:a.LocalizationButton.Options.text,title:"Option",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);"file:"==document.location.protocol&&this.disable()},onClick:function(){"file:"==document.location.protocol?alert("WSC: Options functionality is disabled when runing from file system"):b.openDialog("options")}},{type:"button",id:"FinishChecking",label:a.LocalizationButton.FinishChecking.text,
+title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]},{id:"GrammTab",label:"Grammar",accessKey:"G",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"<div></div>"},{type:"html",id:"Content",label:"GrammarContent",html:"",setup:function(){var b=a.iframeNumber+"_"+a.dialog._.currentTabId,c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"vbox",id:"bottomGroup",style:"width:560px; margin: 0 auto;",
+children:[{type:"hbox",id:"leftCol",widths:["66%","34%"],children:[{type:"vbox",children:[{type:"text",id:"text",label:"Change to:",labelLayout:"horizontal",labelStyle:"font: 12px/25px arial, sans-serif;",inputStyle:"float: right; width: 200px;","default":"",onShow:function(){a.textNode.GrammTab=this},onHide:function(){this.reset()}},{type:"html",id:"html_text",html:"<div style='min-height: 17px; line-height: 17px; padding: 5px; text-align: left;background: #F1F1F1;color: #595959; white-space: normal!important;'></div>",
+onShow:function(){a.textNodeInfo.GrammTab=this}},{type:"html",id:"radio",html:"",onShow:function(){a.grammerSuggest=this}}]},{type:"vbox",children:[{type:"button",id:"ChangeTo",label:"Change to",title:"Change to",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"IgnoreWord",label:"Ignore word",title:"Ignore word",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},
+onClick:c},{type:"button",id:"IgnoreAllWords",label:"Ignore Problem",title:"Ignore Problem",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 133px; float: right; margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",
+widths:["70%","30%"],onShow:function(){this.getElement().hide()},onHide:l,children:[{type:"hbox",id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",children:[{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}}]}]},{type:"hbox",id:"rightCol",align:"right",
+width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]},{id:"Thesaurus",label:"Thesaurus",accessKey:"T",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"<div></div>"},{type:"html",id:"Content",label:"spellContent",html:"",setup:function(){var b=a.iframeNumber+"_"+a.dialog._.currentTabId,
+c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"vbox",id:"bottomGroup",style:"width:560px; margin: -10px auto; overflow: hidden;",children:[{type:"hbox",widths:["75%","25%"],children:[{type:"vbox",children:[{type:"hbox",widths:["65%","35%"],children:[{type:"text",id:"ChangeTo",label:"Change to:",labelLayout:"horizontal",inputStyle:"width: 160px;",labelStyle:"font: 12px/25px arial, sans-serif;","default":"",onShow:function(){a.textNode.Thesaurus=this},onHide:function(){this.reset()}},
+{type:"button",id:"ChangeTo",label:"Change to",title:"Change to",style:"width: 121px; margin-top: 1px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]},{type:"hbox",children:[{type:"select",id:"categories",label:"Categories:",labelStyle:"font: 12px/25px arial, sans-serif;",size:"5",inputStyle:"width: 180px; height: auto;",items:[],onShow:function(){a.selectNode.categories=this},onHide:function(){this.clear()},onChange:function(){a.buildOptionSynonyms(this.getValue())}},
+{type:"select",id:"synonyms",label:"Synonyms:",labelStyle:"font: 12px/25px arial, sans-serif;",size:"5",inputStyle:"width: 180px; height: auto;",items:[],onShow:function(){a.selectNode.synonyms=this;a.textNode.Thesaurus.setValue(this.getValue())},onHide:function(){this.clear()},onChange:function(){a.textNode.Thesaurus.setValue(this.getValue())}}]}]},{type:"vbox",width:"120px",style:"margin-top:46px;",children:[{type:"html",id:"logotype",label:"WebSpellChecker.net",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',
+setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}},{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 121px; float: right; margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",widths:["70%","30%"],onShow:function(){this.getElement().hide()},children:[{type:"hbox",
+id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",children:[{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}}]}]},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"FinishChecking",
+label:"Finish Checking",title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]}]}});CKEDITOR.dialog.add("options",function(){var b=null,c={},d={},f=null,g=null;e.cookie.get("udn");e.cookie.get("osp");var h=function(){g=this.getElement().getAttribute("title-cmd");var a=[];a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,"");e.cookie.set("osp",
+a);e.cookie.set("udnCmd",g?g:"ignore");"delete"!=g&&(a="",""!==j.getValue()&&(a=j.getValue()),e.cookie.set("udn",a));e.postMessage.send({id:"options_dic_send"})},i=function(){f.getElement().setHtml(a.LocalizationComing.error);f.getElement().show()};return{title:a.LocalizationComing.Options,minWidth:430,minHeight:130,resizable:CKEDITOR.DIALOG_RESIZE_NONE,contents:[{id:"OptionsTab",label:"Options",accessKey:"O",elements:[{type:"hbox",id:"options_error",children:[{type:"html",style:"display: block;text-align: center;white-space: normal!important; font-size: 12px;color:red",
+html:"<div></div>",onShow:function(){f=this}}]},{type:"vbox",id:"Options_content",children:[{type:"hbox",id:"Options_manager",widths:["52%","48%"],children:[{type:"fieldset",label:"Spell Checking Options",style:"border: none;margin-top: 13px;padding: 10px 0 10px 10px",onShow:function(){this.getInputElement().$.children[0].innerHTML=a.LocalizationComing.SpellCheckingOptions},children:[{type:"vbox",id:"Options_checkbox",children:[{type:"checkbox",id:"IgnoreAllCapsWords",label:"Ignore All-Caps Words",
+labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreWordsNumbers",label:"Ignore Words with Numbers",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",
+id:"IgnoreMixedCaseWords",label:"Ignore Mixed-Case Words",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreDomainNames",label:"Ignore Domain Names",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=
+!this.getValue()?0:1}}]}]},{type:"vbox",id:"Options_DictionaryName",children:[{type:"text",id:"DictionaryName",style:"margin-bottom: 10px",label:"Dictionary Name:",labelLayout:"vertical",labelStyle:"font: 12px/25px arial, sans-serif;","default":"",onLoad:function(){j=this;this.setValue(a.userDictionaryName?a.userDictionaryName:(e.cookie.get("udn"),this.getValue()))},onShow:function(){j=this;this.setValue(!e.cookie.get("udn")?this.getValue():e.cookie.get("udn"));this.setLabel(a.LocalizationComing.DictionaryName)},
+onHide:function(){this.reset()}},{type:"hbox",id:"Options_buttons",children:[{type:"vbox",id:"Options_leftCol_col",widths:["50%","50%"],children:[{type:"button",id:"create",label:"Create",title:"Create",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Create)},onClick:h},{type:"button",id:"restore",label:"Restore",title:"Restore",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",
+this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Restore)},onClick:h}]},{type:"vbox",id:"Options_rightCol_col",widths:["50%","50%"],children:[{type:"button",id:"rename",label:"Rename",title:"Rename",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Rename)},onClick:h},{type:"button",id:"delete",label:"Remove",title:"Remove",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",
+this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Remove)},onClick:h}]}]}]}]},{type:"hbox",id:"Options_text",children:[{type:"html",style:"text-align: justify;margin-top: 15px;white-space: normal!important; font-size: 12px;color:#777;",html:"<div>"+a.LocalizationComing.OptionsTextIntro+"</div>",onShow:function(){this.getElement().setText(a.LocalizationComing.OptionsTextIntro)}}]}]}]}],buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton],onOk:function(){var a=[];
+a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,"");e.cookie.set("osp",a);e.cookie.set("udn",j.getValue());e.postMessage.send({id:"options_checkbox_send"});f.getElement().hide();f.getElement().setHtml(" ")},onLoad:function(){b=this;e.postMessage.init(i);c.IgnoreAllCapsWords=b.getContentElement("OptionsTab","IgnoreAllCapsWords");c.IgnoreWordsNumbers=b.getContentElement("OptionsTab","IgnoreWordsNumbers");c.IgnoreMixedCaseWords=
+b.getContentElement("OptionsTab","IgnoreMixedCaseWords");c.IgnoreDomainNames=b.getContentElement("OptionsTab","IgnoreDomainNames")},onShow:function(){var b=e.cookie.get("osp").split("");d.IgnoreAllCapsWords=b[0];d.IgnoreWordsNumbers=b[1];d.IgnoreMixedCaseWords=b[2];d.IgnoreDomainNames=b[3];!parseInt(d.IgnoreAllCapsWords,10)?c.IgnoreAllCapsWords.setValue("",!1):c.IgnoreAllCapsWords.setValue("checked",!1);!parseInt(d.IgnoreWordsNumbers,10)?c.IgnoreWordsNumbers.setValue("",!1):c.IgnoreWordsNumbers.setValue("checked",
+!1);!parseInt(d.IgnoreMixedCaseWords,10)?c.IgnoreMixedCaseWords.setValue("",!1):c.IgnoreMixedCaseWords.setValue("checked",!1);!parseInt(d.IgnoreDomainNames,10)?c.IgnoreDomainNames.setValue("",!1):c.IgnoreDomainNames.setValue("checked",!1);d.IgnoreAllCapsWords=!c.IgnoreAllCapsWords.getValue()?0:1;d.IgnoreWordsNumbers=!c.IgnoreWordsNumbers.getValue()?0:1;d.IgnoreMixedCaseWords=!c.IgnoreMixedCaseWords.getValue()?0:1;d.IgnoreDomainNames=!c.IgnoreDomainNames.getValue()?0:1;c.IgnoreAllCapsWords.getElement().$.lastChild.innerHTML=
+a.LocalizationComing.IgnoreAllCapsWords;c.IgnoreWordsNumbers.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreWordsWithNumbers;c.IgnoreMixedCaseWords.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreMixedCaseWords;c.IgnoreDomainNames.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreDomainNames}}});CKEDITOR.dialog.on("resize",function(b){var b=b.data,c=b.dialog,d=CKEDITOR.document.getById(a.iframeNumber+"_"+c._.currentTabId);"checkspell"==c._.name&&(a.bnr?d&&
+d.setSize("height",b.height-310):d&&d.setSize("height",b.height-220))});CKEDITOR.on("dialogDefinition",function(b){var c=b.data.definition;a.onLoadOverlay=new o({opacity:"1",background:"#fff",target:c.dialog.parts.tabs.getParent().$});a.onLoadOverlay.setEnable();c.dialog.on("show",function(){});c.dialog.on("cancel",function(){c.dialog.getParentEditor().config.wsc_onClose.call(this.document.getWindow().getFrame());a.div_overlay.setDisable();return!1},this,null,-1)})})();
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/wsc_ie.js b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/wsc_ie.js
new file mode 100644
index 00000000..6b39b006
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/plugins/wsc/dialogs/wsc_ie.js
@@ -0,0 +1,11 @@
+﻿/*
+ Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("checkspell",function(a){function c(a,c){var d=0;return function(){"function"==typeof window.doSpell?("undefined"!=typeof e&&window.clearInterval(e),j(a)):180==d++&&window._cancelOnError(c)}}function j(c){var f=new window._SP_FCK_LangCompare,b=CKEDITOR.getUrl(a.plugins.wsc.path+"dialogs/"),e=b+"tmpFrameset.html";window.gFCKPluginName="wsc";f.setDefaulLangCode(a.config.defaultLanguage);window.doSpell({ctrl:g,lang:a.config.wsc_lang||f.getSPLangCode(a.langCode),intLang:a.config.wsc_uiLang||
+f.getSPLangCode(a.langCode),winType:d,onCancel:function(){c.hide()},onFinish:function(b){a.focus();c.getParentEditor().setData(b.value);c.hide()},staticFrame:e,framesetPath:e,iframePath:b+"ciframe.html",schemaURI:b+"wsc.css",userDictionaryName:a.config.wsc_userDictionaryName,customDictionaryName:a.config.wsc_customDictionaryIds&&a.config.wsc_customDictionaryIds.split(","),domainName:a.config.wsc_domainName});CKEDITOR.document.getById(h).setStyle("display","none");CKEDITOR.document.getById(d).setStyle("display",
+"block")}var b=CKEDITOR.tools.getNextNumber(),d="cke_frame_"+b,g="cke_data_"+b,h="cke_error_"+b,e,b=document.location.protocol||"http:",i=a.lang.wsc.notAvailable,k='<textarea style="display: none" id="'+g+'" rows="10" cols="40"> </textarea><div id="'+h+'" style="display:none;color:red;font-size:16px;font-weight:bold;padding-top:160px;text-align:center;z-index:11;"></div><iframe src="" style="width:100%;background-color:#f1f1e3;" frameborder="0" name="'+d+'" id="'+d+'" allowtransparency="1"></iframe>',
+l=a.config.wsc_customLoaderScript||b+"//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin=fck2&customerid="+a.config.wsc_customerId+"&cmd=script&doc=wsc&schema=22";a.config.wsc_customLoaderScript&&(i+='<p style="color:#000;font-size:11px;font-weight: normal;text-align:center;padding-top:10px">'+a.lang.wsc.errorLoading.replace(/%s/g,a.config.wsc_customLoaderScript)+"</p>");window._cancelOnError=function(c){if("undefined"==typeof window.WSC_Error){CKEDITOR.document.getById(d).setStyle("display",
+"none");var b=CKEDITOR.document.getById(h);b.setStyle("display","block");b.setHtml(c||a.lang.wsc.notAvailable)}};return{title:a.config.wsc_dialogTitle||a.lang.wsc.title,minWidth:485,minHeight:380,buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var b=this.getContentElement("general","content").getElement();b.setHtml(k);b.getChild(2).setStyle("height",this._.contentSize.height+"px");"function"!=typeof window.doSpell&&CKEDITOR.document.getHead().append(CKEDITOR.document.createElement("script",
+{attributes:{type:"text/javascript",src:l}}));b=a.getData();CKEDITOR.document.getById(g).setValue(b);e=window.setInterval(c(this,i),250)},onHide:function(){window.ooo=void 0;window.int_framsetLoaded=void 0;window.framesetLoaded=void 0;window.is_window_opened=!1},contents:[{id:"general",label:a.config.wsc_dialogTitle||a.lang.wsc.title,padding:0,elements:[{type:"html",id:"content",html:""}]}]}});
+CKEDITOR.dialog.on("resize",function(a){var a=a.data,c=a.dialog;"checkspell"==c._.name&&((c=(c=c.getContentElement("general","content").getElement())&&c.getChild(2))&&c.setSize("height",a.height),c&&c.setSize("width",a.width))});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/ajax.html b/htmltest/sites/all/libraries/ckeditor-version/samples/ajax.html
new file mode 100644
index 00000000..e3b5780a
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/ajax.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>Ajax &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../ckeditor.js"></script>
+	<link rel="stylesheet" href="sample.css">
+	<script>
+
+		var editor, html = '';
+
+		function createEditor() {
+			if ( editor )
+				return;
+
+			// Create a new editor inside the <div id="editor">, setting its value to html
+			var config = {};
+			editor = CKEDITOR.appendTo( 'editor', config, html );
+		}
+
+		function removeEditor() {
+			if ( !editor )
+				return;
+
+			// Retrieve the editor contents. In an Ajax application, this data would be
+			// sent to the server or used in any other way.
+			document.getElementById( 'editorcontents' ).innerHTML = html = editor.getData();
+			document.getElementById( 'contents' ).style.display = '';
+
+			// Destroy the editor.
+			editor.destroy();
+			editor = null;
+		}
+
+	</script>
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html">CKEditor Samples</a> &raquo; Create and Destroy Editor Instances for Ajax Applications
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows how to create and destroy CKEditor instances on the fly. After the removal of CKEditor the content created inside the editing
+			area will be displayed in a <code>&lt;div&gt;</code> element.
+		</p>
+		<p>
+			For details of how to create this setup check the source code of this sample page
+			for JavaScript code responsible for the creation and destruction of a CKEditor instance.
+		</p>
+	</div>
+	<p>Click the buttons to create and remove a CKEditor instance.</p>
+	<p>
+		<input onclick="createEditor();" type="button" value="Create Editor">
+		<input onclick="removeEditor();" type="button" value="Remove Editor">
+	</p>
+	<!-- This div will hold the editor. -->
+	<div id="editor">
+	</div>
+	<div id="contents" style="display: none">
+		<p>
+			Edited Contents:
+		</p>
+		<!-- This div will be used to display the editor contents. -->
+		<div id="editorcontents">
+		</div>
+	</div>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/api.html b/htmltest/sites/all/libraries/ckeditor-version/samples/api.html
new file mode 100644
index 00000000..baf6e541
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/api.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<meta charset="utf-8">
+	<title>API Usage &mdash; CKEditor Sample</title>
+	<script src="../ckeditor.js"></script>
+	<link href="sample.css" rel="stylesheet">
+	<script>
+
+// The instanceReady event is fired, when an instance of CKEditor has finished
+// its initialization.
+CKEDITOR.on( 'instanceReady', function( ev ) {
+	// Show the editor name and description in the browser status bar.
+	document.getElementById( 'eMessage' ).innerHTML = 'Instance <code>' + ev.editor.name + '<\/code> loaded.';
+
+	// Show this sample buttons.
+	document.getElementById( 'eButtons' ).style.display = 'block';
+});
+
+function InsertHTML() {
+	// Get the editor instance that we want to interact with.
+	var editor = CKEDITOR.instances.editor1;
+	var value = document.getElementById( 'htmlArea' ).value;
+
+	// Check the active editing mode.
+	if ( editor.mode == 'wysiwyg' )
+	{
+		// Insert HTML code.
+		// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertHtml
+		editor.insertHtml( value );
+	}
+	else
+		alert( 'You must be in WYSIWYG mode!' );
+}
+
+function InsertText() {
+	// Get the editor instance that we want to interact with.
+	var editor = CKEDITOR.instances.editor1;
+	var value = document.getElementById( 'txtArea' ).value;
+
+	// Check the active editing mode.
+	if ( editor.mode == 'wysiwyg' )
+	{
+		// Insert as plain text.
+		// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertText
+		editor.insertText( value );
+	}
+	else
+		alert( 'You must be in WYSIWYG mode!' );
+}
+
+function SetContents() {
+	// Get the editor instance that we want to interact with.
+	var editor = CKEDITOR.instances.editor1;
+	var value = document.getElementById( 'htmlArea' ).value;
+
+	// Set editor contents (replace current contents).
+	// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setData
+	editor.setData( value );
+}
+
+function GetContents() {
+	// Get the editor instance that you want to interact with.
+	var editor = CKEDITOR.instances.editor1;
+
+	// Get editor contents
+	// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getData
+	alert( editor.getData() );
+}
+
+function ExecuteCommand( commandName ) {
+	// Get the editor instance that we want to interact with.
+	var editor = CKEDITOR.instances.editor1;
+
+	// Check the active editing mode.
+	if ( editor.mode == 'wysiwyg' )
+	{
+		// Execute the command.
+		// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-execCommand
+		editor.execCommand( commandName );
+	}
+	else
+		alert( 'You must be in WYSIWYG mode!' );
+}
+
+function CheckDirty() {
+	// Get the editor instance that we want to interact with.
+	var editor = CKEDITOR.instances.editor1;
+	// Checks whether the current editor contents present changes when compared
+	// to the contents loaded into the editor at startup
+	// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-checkDirty
+	alert( editor.checkDirty() );
+}
+
+function ResetDirty() {
+	// Get the editor instance that we want to interact with.
+	var editor = CKEDITOR.instances.editor1;
+	// Resets the "dirty state" of the editor (see CheckDirty())
+	// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-resetDirty
+	editor.resetDirty();
+	alert( 'The "IsDirty" status has been reset' );
+}
+
+function Focus() {
+	CKEDITOR.instances.editor1.focus();
+}
+
+function onFocus() {
+	document.getElementById( 'eMessage' ).innerHTML = '<b>' + this.name + ' is focused </b>';
+}
+
+function onBlur() {
+	document.getElementById( 'eMessage' ).innerHTML = this.name + ' lost focus';
+}
+
+	</script>
+
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html">CKEditor Samples</a> &raquo; Using CKEditor JavaScript API
+	</h1>
+	<div class="description">
+	<p>
+		This sample shows how to use the
+		<a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.editor">CKEditor JavaScript API</a>
+		to interact with the editor at runtime.
+	</p>
+	<p>
+		For details on how to create this setup check the source code of this sample page.
+	</p>
+	</div>
+
+	<!-- This <div> holds alert messages to be display in the sample page. -->
+	<div id="alerts">
+		<noscript>
+			<p>
+				<strong>CKEditor requires JavaScript to run</strong>. In a browser with no JavaScript
+				support, like yours, you should still see the contents (HTML data) and you should
+				be able to edit it normally, without a rich editor interface.
+			</p>
+		</noscript>
+	</div>
+	<form action="../../../samples/sample_posteddata.php" method="post">
+		<textarea cols="100" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+
+		<script>
+			// Replace the <textarea id="editor1"> with an CKEditor instance.
+			CKEDITOR.replace( 'editor1', {
+				on: {
+					focus: onFocus,
+					blur: onBlur,
+
+					// Check for availability of corresponding plugins.
+					pluginsLoaded: function( evt ) {
+						var doc = CKEDITOR.document, ed = evt.editor;
+						if ( !ed.getCommand( 'bold' ) )
+							doc.getById( 'exec-bold' ).hide();
+						if ( !ed.getCommand( 'link' ) )
+							doc.getById( 'exec-link' ).hide();
+					}
+				}
+			});
+		</script>
+
+		<p id="eMessage">
+		</p>
+
+		<div id="eButtons" style="display: none">
+			<input id="exec-bold" onclick="ExecuteCommand('bold');" type="button" value="Execute &quot;bold&quot; Command">
+			<input id="exec-link" onclick="ExecuteCommand('link');" type="button" value="Execute &quot;link&quot; Command">
+			<input onclick="Focus();" type="button" value="Focus">
+			<br><br>
+			<input onclick="InsertHTML();" type="button" value="Insert HTML">
+			<input onclick="SetContents();" type="button" value="Set Editor Contents">
+			<input onclick="GetContents();" type="button" value="Get Editor Contents (XHTML)">
+			<br>
+			<textarea cols="100" id="htmlArea" rows="3">&lt;h2&gt;Test&lt;/h2&gt;&lt;p&gt;This is some &lt;a href="/Test1.html"&gt;sample&lt;/a&gt; HTML code.&lt;/p&gt;</textarea>
+			<br>
+			<br>
+			<input onclick="InsertText();" type="button" value="Insert Text">
+			<br>
+			<textarea cols="100" id="txtArea" rows="3">   First line with some leading whitespaces.
+
+Second line of text preceded by two line breaks.</textarea>
+			<br>
+			<br>
+			<input onclick="CheckDirty();" type="button" value="checkDirty()">
+			<input onclick="ResetDirty();" type="button" value="resetDirty()">
+		</div>
+	</form>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/appendto.html b/htmltest/sites/all/libraries/ckeditor-version/samples/appendto.html
new file mode 100644
index 00000000..04c5599c
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/appendto.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>CKEDITOR.appendTo &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../ckeditor.js"></script>
+	<link rel="stylesheet" href="sample.css">
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html">CKEditor Samples</a> &raquo; Append To Page Element Using JavaScript Code
+	</h1>
+	<div id="section1">
+		<div class="description">
+			<p>
+				<code>CKEDITOR.appendTo</code> is basically to place editors
+				inside existing DOM elements. Unlike <code>CKEDITOR.replace</code>,
+				a target container to be replaced is no longer necessary. A new editor
+				instance is inserted directly wherever it is desired.
+			</p>
+<pre class="samples">CKEDITOR.appendTo( '<em>container_id</em>',
+	{ /* Configuration options to be used. */ }
+	'Editor content to be used.'
+);</pre>
+		</div>
+		<script>
+
+			// This call can be placed at any point after the
+			// <textarea>, or inside a <head><script> in a
+			// window.onload event handler.
+
+			// Replace the <textarea id="editor"> with an CKEditor
+			// instance, using default configurations.
+			CKEDITOR.appendTo( 'section1',
+				null,
+				'<p>This is some <strong>sample text</strong>. You are using <a href="http://ckeditor.com/">CKEditor</a>.</p>'
+			);
+
+		</script>
+	</div>
+	<br>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/assets/inlineall/logo.png b/htmltest/sites/all/libraries/ckeditor-version/samples/assets/inlineall/logo.png
new file mode 100644
index 00000000..334e7ac9
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/samples/assets/inlineall/logo.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/assets/outputxhtml/outputxhtml.css b/htmltest/sites/all/libraries/ckeditor-version/samples/assets/outputxhtml/outputxhtml.css
new file mode 100644
index 00000000..9c90a2ae
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/assets/outputxhtml/outputxhtml.css
@@ -0,0 +1,204 @@
+/*
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or http://ckeditor.com/license
+ *
+ * Styles used by the XHTML 1.1 sample page (xhtml.html).
+ */
+
+/**
+ * Basic definitions for the editing area.
+ */
+body
+{
+	font-family: Arial, Verdana, sans-serif;
+	font-size: 80%;
+	color: #000000;
+	background-color: #ffffff;
+	padding: 5px;
+	margin: 0px;
+}
+
+/**
+ * Core styles.
+ */
+
+.Bold
+{
+	font-weight: bold;
+}
+
+.Italic
+{
+	font-style: italic;
+}
+
+.Underline
+{
+	text-decoration: underline;
+}
+
+.StrikeThrough
+{
+	text-decoration: line-through;
+}
+
+.Subscript
+{
+	vertical-align: sub;
+	font-size: smaller;
+}
+
+.Superscript
+{
+	vertical-align: super;
+	font-size: smaller;
+}
+
+/**
+ * Font faces.
+ */
+
+.FontComic
+{
+	font-family: 'Comic Sans MS';
+}
+
+.FontCourier
+{
+	font-family: 'Courier New';
+}
+
+.FontTimes
+{
+	font-family: 'Times New Roman';
+}
+
+/**
+ * Font sizes.
+ */
+
+.FontSmaller
+{
+	font-size: smaller;
+}
+
+.FontLarger
+{
+	font-size: larger;
+}
+
+.FontSmall
+{
+	font-size: 8pt;
+}
+
+.FontBig
+{
+	font-size: 14pt;
+}
+
+.FontDouble
+{
+	font-size: 200%;
+}
+
+/**
+ * Font colors.
+ */
+.FontColor1
+{
+	color: #ff9900;
+}
+
+.FontColor2
+{
+	color: #0066cc;
+}
+
+.FontColor3
+{
+	color: #ff0000;
+}
+
+.FontColor1BG
+{
+	background-color: #ff9900;
+}
+
+.FontColor2BG
+{
+	background-color: #0066cc;
+}
+
+.FontColor3BG
+{
+	background-color: #ff0000;
+}
+
+/**
+ * Indentation.
+ */
+
+.Indent1
+{
+	margin-left: 40px;
+}
+
+.Indent2
+{
+	margin-left: 80px;
+}
+
+.Indent3
+{
+	margin-left: 120px;
+}
+
+/**
+ * Alignment.
+ */
+
+.JustifyLeft
+{
+	text-align: left;
+}
+
+.JustifyRight
+{
+	text-align: right;
+}
+
+.JustifyCenter
+{
+	text-align: center;
+}
+
+.JustifyFull
+{
+	text-align: justify;
+}
+
+/**
+ * Other.
+ */
+
+code
+{
+	font-family: courier, monospace;
+	background-color: #eeeeee;
+	padding-left: 1px;
+	padding-right: 1px;
+	border: #c0c0c0 1px solid;
+}
+
+kbd
+{
+	padding: 0px 1px 0px 1px;
+	border-width: 1px 2px 2px 1px;
+	border-style: solid;
+}
+
+blockquote
+{
+	color: #808080;
+}
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/assets/posteddata.php b/htmltest/sites/all/libraries/ckeditor-version/samples/assets/posteddata.php
new file mode 100644
index 00000000..32c3a441
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/assets/posteddata.php
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<?php
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+?>
+<html>
+<head>
+	<meta charset="utf-8">
+	<title>Sample &mdash; CKEditor</title>
+	<link rel="stylesheet" href="sample.css">
+</head>
+<body>
+	<h1 class="samples">
+		CKEditor &mdash; Posted Data
+	</h1>
+	<table border="1" cellspacing="0" id="outputSample">
+		<colgroup><col width="120"></colgroup>
+		<thead>
+			<tr>
+				<th>Field&nbsp;Name</th>
+				<th>Value</th>
+			</tr>
+		</thead>
+<?php
+
+if (!empty($_POST))
+{
+	foreach ( $_POST as $key => $value )
+	{
+		if ( ( !is_string($value) && !is_numeric($value) ) || !is_string($key) )
+			continue;
+
+		if ( get_magic_quotes_gpc() )
+			$value = htmlspecialchars( stripslashes((string)$value) );
+		else
+			$value = htmlspecialchars( (string)$value );
+?>
+		<tr>
+			<th style="vertical-align: top"><?php echo htmlspecialchars( (string)$key ); ?></th>
+			<td><pre class="samples"><?php echo $value; ?></pre></td>
+		</tr>
+	<?php
+	}
+}
+?>
+	</table>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/assets/sample.css b/htmltest/sites/all/libraries/ckeditor-version/samples/assets/sample.css
new file mode 100644
index 00000000..64167c25
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/assets/sample.css
@@ -0,0 +1,3 @@
+/**
+ * Required by tests (dom/document.html).
+ */
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/assets/sample.jpg b/htmltest/sites/all/libraries/ckeditor-version/samples/assets/sample.jpg
new file mode 100644
index 00000000..a4a77fae
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/samples/assets/sample.jpg differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/assets/uilanguages/languages.js b/htmltest/sites/all/libraries/ckeditor-version/samples/assets/uilanguages/languages.js
new file mode 100644
index 00000000..6255d91a
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/assets/uilanguages/languages.js
@@ -0,0 +1,7 @@
+﻿/*
+ Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+var CKEDITOR_LANGS=function(){var c={af:"Afrikaans",ar:"Arabic",bg:"Bulgarian",bn:"Bengali/Bangla",bs:"Bosnian",ca:"Catalan",cs:"Czech",cy:"Welsh",da:"Danish",de:"German",el:"Greek",en:"English","en-au":"English (Australia)","en-ca":"English (Canadian)","en-gb":"English (United Kingdom)",eo:"Esperanto",es:"Spanish",et:"Estonian",eu:"Basque",fa:"Persian",fi:"Finnish",fo:"Faroese",fr:"French","fr-ca":"French (Canada)",gl:"Galician",gu:"Gujarati",he:"Hebrew",hi:"Hindi",hr:"Croatian",hu:"Hungarian",id:"Indonesian",
+is:"Icelandic",it:"Italian",ja:"Japanese",ka:"Georgian",km:"Khmer",ko:"Korean",ku:"Kurdish",lt:"Lithuanian",lv:"Latvian",mk:"Macedonian",mn:"Mongolian",ms:"Malay",nb:"Norwegian Bokmal",nl:"Dutch",no:"Norwegian",pl:"Polish",pt:"Portuguese (Portugal)","pt-br":"Portuguese (Brazil)",ro:"Romanian",ru:"Russian",si:"Sinhala",sk:"Slovak",sq:"Albanian",sl:"Slovenian",sr:"Serbian (Cyrillic)","sr-latn":"Serbian (Latin)",sv:"Swedish",th:"Thai",tr:"Turkish",ug:"Uighur",uk:"Ukrainian",vi:"Vietnamese",zh:"Chinese Traditional",
+"zh-cn":"Chinese Simplified"},b=[],a;for(a in CKEDITOR.lang.languages)b.push({code:a,name:c[a]||a});b.sort(function(a,b){return a.name<b.name?-1:1});return b}();
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/datafiltering.html b/htmltest/sites/all/libraries/ckeditor-version/samples/datafiltering.html
new file mode 100644
index 00000000..15cb671d
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/datafiltering.html
@@ -0,0 +1,401 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>Data Filtering &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../ckeditor.js"></script>
+	<link rel="stylesheet" href="sample.css">
+	<script>
+		// Remove advanced tabs for all editors.
+		CKEDITOR.config.removeDialogTabs = 'image:advanced;link:advanced;flash:advanced;creatediv:advanced;editdiv:advanced';
+	</script>
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html">CKEditor Samples</a> &raquo; Data Filtering and Features Activation
+	</h1>
+	<div class="description">
+		<p>
+			This sample page demonstrates the idea of Advanced Content Filter
+			(<abbr title="Advanced Content Filter">ACF</abbr>), a sophisticated
+			tool that takes control over what kind of data is accepted by the editor and what
+			kind of output is produced.
+		</p>
+		<h2>When and what is being filtered?</h2>
+		<p>
+			<abbr title="Advanced Content Filter">ACF</abbr> controls
+			<strong>every single source of data</strong> that comes to the editor.
+			It process both HTML that is inserted manually (i.e. pasted by the user)
+			and programmatically like:
+		</p>
+<pre class="samples">
+editor.setData( '&lt;p&gt;Hello world!&lt;/p&gt;' );
+</pre>
+		<p>
+			<abbr title="Advanced Content Filter">ACF</abbr> discards invalid,
+			useless HTML tags and attributes so the editor remains "clean" during
+			runtime. <abbr title="Advanced Content Filter">ACF</abbr> behaviour
+			can be configured and adjusted for a particular case to prevent the
+			output HTML (i.e. in CMS systems) from being polluted.
+
+			This kind of filtering is a first, client-side line of defense
+			against "<a href="http://en.wikipedia.org/wiki/Tag_soup">tag soups</a>",
+			the tool that precisely restricts which tags, attributes and styles
+			are allowed (desired). When properly configured, <abbr title="Advanced Content Filter">ACF</abbr>
+			is an easy and fast way to produce a high-quality, intentionally filtered HTML.
+		</p>
+
+		<h3>How to configure or disable ACF?</h3>
+		<p>
+			Advanced Content Filter is enabled by default, working in "automatic mode", yet
+			it provides a set of easy rules that allow adjusting filtering rules
+			and disabling the entire feature when necessary. The config property
+			responsible for this feature is <code><a class="samples"
+			href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent">config.allowedContent</a></code>.
+		</p>
+		<p>
+			By "automatic mode" is meant that loaded plugins decide which kind
+			of content is enabled and which is not. For example, if the link
+			plugin is loaded it implies that <code>&lt;a&gt;</code> tag is
+			automatically allowed. Each plugin is given a set
+			of predefined <abbr title="Advanced Content Filter">ACF</abbr> rules
+			that control the editor until <code><a class="samples"
+			href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent">
+			config.allowedContent</a></code>
+			is defined manually.
+		</p>
+		<p>
+			Let's assume our intention is to restrict the editor to accept (produce) <strong>paragraphs
+			only: no attributes, no styles, no other tags</strong>.
+			With <abbr title="Advanced Content Filter">ACF</abbr>
+			this is very simple. Basically set <code><a class="samples"
+			href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent">
+			config.allowedContent</a></code> to <code>'p'</code>:
+		</p>
+<pre class="samples">
+var editor = CKEDITOR.replace( <em>textarea_id</em>, {
+	<strong>allowedContent: 'p'</strong>
+} );
+</pre>
+		<p>
+			Now try to play with allowed content:
+		</p>
+<pre class="samples">
+// Trying to insert disallowed tag and attribute.
+editor.setData( '&lt;p <strong>style="color: red"</strong>&gt;Hello <strong>&lt;em&gt;world&lt;/em&gt;</strong>!&lt;/p&gt;' );
+alert( editor.getData() );
+
+// Filtered data is returned.
+"&lt;p&gt;Hello world!&lt;/p&gt;"
+</pre>
+		<p>
+			What happened? Since <code>config.allowedContent: 'p'</code> is set the editor assumes
+			that only plain <code>&lt;p&gt;</code> are accepted. Nothing more. This is why
+			<code>style</code> attribute and <code>&lt;em&gt;</code> tag are gone. The same
+			filtering would happen if we pasted disallowed HTML into this editor.
+		</p>
+		<p>
+			This is just a small sample of what <abbr title="Advanced Content Filter">ACF</abbr>
+			can do. To know more, please refer to the sample section below and
+			<a href="http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter">the official Advanced Content Filter guide</a>.
+		</p>
+		<p>
+			You may, of course, want CKEditor to avoid filtering of any kind.
+			To get rid of <abbr title="Advanced Content Filter">ACF</abbr>,
+			basically set <code><a class="samples"
+			href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent">
+			config.allowedContent</a></code> to <code>true</code> like this:
+		</p>
+<pre class="samples">
+CKEDITOR.replace( <em>textarea_id</em>, {
+	<strong>allowedContent: true</strong>
+} );
+</pre>
+
+		<h2>Beyond data flow: Features activation</h2>
+		<p>
+			<abbr title="Advanced Content Filter">ACF</abbr> is far more than
+			<abbr title="Input/Output">I/O</abbr> control: the entire
+			<abbr title="User Interface">UI</abbr> of the editor is adjusted to what
+			filters restrict. For example: if <code>&lt;a&gt;</code> tag is
+			<strong>disallowed</strong>
+			by <abbr title="Advanced Content Filter">ACF</abbr>,
+			then accordingly <code>link</code> command, toolbar button and link dialog
+			are also disabled. Editor is smart: it knows which features must be
+			removed from the interface to match filtering rules.
+		</p>
+		<p>
+			CKEditor can be far more specific. If <code>&lt;a&gt;</code> tag is
+			<strong>allowed</strong> by filtering rules to be used but it is restricted
+			to have only one attribute (<code>href</code>)
+			<code>config.allowedContent = 'a[!href]'</code>, then
+			"Target" tab of the link dialog is automatically disabled as <code>target</code>
+			attribute isn't included in <abbr title="Advanced Content Filter">ACF</abbr> rules
+			for <code>&lt;a&gt;</code>. This behaviour applies to dialog fields, context
+			menus and toolbar buttons.
+		</p>
+
+		<h2>Sample configurations</h2>
+		<p>
+			There are several editor instances below that present different
+			<abbr title="Advanced Content Filter">ACF</abbr> setups. <strong>All of them,
+			except the last inline instance, share the same HTML content</strong> to visualize
+			how different filtering rules affect the same input data.
+		</p>
+	</div>
+
+	<div>
+		<label for="editor1">
+			Editor 1:
+		</label>
+		<div class="description">
+			<p>
+				This editor is using default configuration ("automatic mode"). It means that
+				<code><a class="samples"
+				href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent">
+				config.allowedContent</a></code> is defined by loaded plugins.
+				Each plugin extends filtering rules to make it's own associated content
+				available for the user.
+			</p>
+		</div>
+		<textarea cols="80" id="editor1" name="editor1" rows="10">
+			&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+		</textarea>
+
+		<script>
+
+			CKEDITOR.replace( 'editor1' );
+
+		</script>
+	</div>
+
+	<br>
+
+	<div>
+		<label for="editor2">
+			Editor 2:
+		</label>
+		<div class="description">
+			<p>
+				This editor is using a custom configuration for
+				<abbr title="Advanced Content Filter">ACF</abbr>:
+			</p>
+<pre class="samples">
+CKEDITOR.replace( 'editor2', {
+	allowedContent:
+		'h1 h2 h3 p blockquote strong em;' +
+		'a[!href];' +
+		'img(left,right)[!src,alt,width,height];' +
+		'table tr th td caption;' +
+		'span{!font-family};' +'
+		'span{!color};' +
+		'span(!marker);' +
+		'del ins'
+} );
+</pre>
+			<p>
+				The following rules may require additional explanation:
+			</p>
+			<ul>
+				<li>
+					<code>h1 h2 h3 p blockquote strong em</code> - These tags
+					are accepted by the editor. Any tag attributes will be discarded.
+				</li>
+				<li>
+					<code>a[!href]</code> - <code>href</code> attribute is obligatory
+					for <code>&lt;a&gt;</code> tag. Tags without this attribute
+					are disarded. No other attribute will be accepted.
+				</li>
+				<li>
+					<code>img(left,right)[!src,alt,width,height]</code> - <code>src</code>
+					attribute is obligatory for <code>&lt;img&gt;</code> tag.
+					<code>alt</code>, <code>width</code>, <code>height</code>
+					and <code>class</code> attributes are accepted but
+					<code>class</code> must be either <code>class="left"</code>
+					or <code>class="right"</code>
+				</li>
+				<li>
+					<code>table tr th td caption</code> - These tags
+					are accepted by the editor. Any tag attributes will be discarded.
+				</li>
+				<li>
+					<code>span{!font-family}</code>, <code>span{!color}</code>,
+					<code>span(!marker)</code> - <code>&lt;span&gt;</code> tags
+					will be accepted if either <code>font-family</code> or
+					<code>color</code> style is set or <code>class="marker"</code>
+					is present.
+				</li>
+				<li>
+					<code>del ins</code> - These tags
+					are accepted by the editor. Any tag attributes will be discarded.
+				</li>
+			</ul>
+			<p>
+				Please note that <strong><abbr title="User Interface">UI</abbr> of the
+				editor is different</strong>. It's a response to what happened to the filters.
+				Since <code>text-align</code> isn't allowed, the align toolbar is gone.
+				The same thing happened to subscript/superscript, strike, underline
+				(<code>&lt;u&gt;</code>, <code>&lt;sub&gt;</code>, <code>&lt;sup&gt;</code>
+				are disallowed by <code><a class="samples"
+				href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent">
+				config.allowedContent</a></code>) and many other buttons.
+			</p>
+		</div>
+		<textarea cols="80" id="editor2" name="editor2" rows="10">
+			&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+		</textarea>
+		<script>
+
+			CKEDITOR.replace( 'editor2', {
+				allowedContent:
+					'h1 h2 h3 p blockquote strong em;' +
+					'a[!href];' +
+					'img(left,right)[!src,alt,width,height];' +
+					'table tr th td caption;' +
+					'span{!font-family};' +
+					'span{!color};' +
+					'span(!marker);' +
+					'del ins'
+			} );
+
+		</script>
+	</div>
+
+	<br>
+
+	<div>
+		<label for="editor3">
+			Editor 3:
+		</label>
+		<div class="description">
+			<p>
+				This editor is using a custom configuration for
+				<abbr title="Advanced Content Filter">ACF</abbr>.
+				Note that filters can be configured as an object literal
+				as an alternative to a string-based definition.
+			</p>
+<pre class="samples">
+CKEDITOR.replace( 'editor3', {
+	allowedContent: {
+		'b i ul ol big small': true,
+		'h1 h2 h3 p blockquote li': {
+			styles: 'text-align'
+		},
+		a: { attributes: '!href,target' },
+		img: {
+			attributes: '!src,alt',
+			styles: 'width,height',
+			classes: 'left,right'
+		}
+	}
+} );
+</pre>
+		</div>
+		<textarea cols="80" id="editor3" name="editor3" rows="10">
+			&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+		</textarea>
+		<script>
+
+			CKEDITOR.replace( 'editor3', {
+				allowedContent: {
+					'b i ul ol big small': true,
+					'h1 h2 h3 p blockquote li': {
+						styles: 'text-align'
+					},
+					a: { attributes: '!href,target' },
+					img: {
+						attributes: '!src,alt',
+						styles: 'width,height',
+						classes: 'left,right'
+					}
+				}
+			} );
+
+		</script>
+	</div>
+
+	<br>
+
+	<div>
+		<label for="editor4">
+			Editor 4:
+		</label>
+		<div class="description">
+			<p>
+				This editor is using a custom set of plugins and buttons.
+			</p>
+<pre class="samples">
+CKEDITOR.replace( 'editor4', {
+	removePlugins: 'bidi,font,forms,flash,horizontalrule,iframe,justify,table,tabletools,smiley',
+	removeButtons: 'Anchor,Underline,Strike,Subscript,Superscript,Image',
+	format_tags: 'p;h1;h2;h3;pre;address'
+} );
+</pre>
+			<p>
+				As you can see, removing plugins and buttons implies filtering.
+				Several tags are not allowed in the editor because there's no
+				plugin/button that is responsible for creating and editing this
+				kind of content (for example: the image is missing because
+				of <code>removeButtons: 'Image'</code>). The conclusion is that
+				<abbr title="Advanced Content Filter">ACF</abbr> works "backwards"
+				as well: <strong>modifying <abbr title="User Interface">UI</abbr>
+				elements is changing allowed content rules</strong>.
+			</p>
+		</div>
+		<textarea cols="80" id="editor4" name="editor4" rows="10">
+			&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+		</textarea>
+		<script>
+
+			CKEDITOR.replace( 'editor4', {
+				removePlugins: 'bidi,div,font,forms,flash,horizontalrule,iframe,justify,table,tabletools,smiley',
+				removeButtons: 'Anchor,Underline,Strike,Subscript,Superscript,Image',
+				format_tags: 'p;h1;h2;h3;pre;address'
+			} );
+
+		</script>
+	</div>
+
+	<br>
+
+	<div>
+		<label for="editor5">
+			Editor 5:
+		</label>
+		<div class="description">
+			<p>
+				This editor is built on editable <code>&lt;h1&gt;</code> element.
+				<abbr title="Advanced Content Filter">ACF</abbr> takes care of
+				what can be included in <code>&lt;h1&gt;</code>. Note that there
+				are no block styles in Styles combo. Also why lists, indentation,
+				blockquote, div, form and other buttons are missing.
+			</p>
+			<p>
+				<abbr title="Advanced Content Filter">ACF</abbr> makes sure that
+				no disallowed tags will come to <code>&lt;h1&gt;</code> so the final
+				markup is valid. If the user tried to paste some invalid HTML
+				into this editor (let's say a list), it would be automatically
+				converted into plain text.
+			</p>
+		</div>
+		<h1 id="editor5" contenteditable="true">
+			<em>Apollo 11</em> was the spaceflight that landed the first humans, Americans <a href="http://en.wikipedia.org/wiki/Neil_Armstrong" title="Neil Armstrong">Neil Armstrong</a> and <a href="http://en.wikipedia.org/wiki/Buzz_Aldrin" title="Buzz Aldrin">Buzz Aldrin</a>, on the Moon on July 20, 1969, at 20:18 UTC.
+		</h1>
+	</div>
+
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/divreplace.html b/htmltest/sites/all/libraries/ckeditor-version/samples/divreplace.html
new file mode 100644
index 00000000..844a34c2
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/divreplace.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>Replace DIV &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../ckeditor.js"></script>
+	<link href="sample.css" rel="stylesheet">
+	<style>
+
+		div.editable
+		{
+			border: solid 2px Transparent;
+			padding-left: 15px;
+			padding-right: 15px;
+		}
+
+		div.editable:hover
+		{
+			border-color: black;
+		}
+
+	</style>
+	<script>
+
+		// Uncomment the following code to test the "Timeout Loading Method".
+		// CKEDITOR.loadFullCoreTimeout = 5;
+
+		window.onload = function() {
+			// Listen to the double click event.
+			if ( window.addEventListener )
+				document.body.addEventListener( 'dblclick', onDoubleClick, false );
+			else if ( window.attachEvent )
+				document.body.attachEvent( 'ondblclick', onDoubleClick );
+
+		};
+
+		function onDoubleClick( ev ) {
+			// Get the element which fired the event. This is not necessarily the
+			// element to which the event has been attached.
+			var element = ev.target || ev.srcElement;
+
+			// Find out the div that holds this element.
+			var name;
+
+			do {
+				element = element.parentNode;
+			}
+			while ( element && ( name = element.nodeName.toLowerCase() ) &&
+				( name != 'div' || element.className.indexOf( 'editable' ) == -1 ) && name != 'body' );
+
+			if ( name == 'div' && element.className.indexOf( 'editable' ) != -1 )
+				replaceDiv( element );
+		}
+
+		var editor;
+
+		function replaceDiv( div ) {
+			if ( editor )
+				editor.destroy();
+
+			editor = CKEDITOR.replace( div );
+		}
+
+	</script>
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html">CKEditor Samples</a> &raquo; Replace DIV with CKEditor on the Fly
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows how to automatically replace <code>&lt;div&gt;</code> elements
+			with a CKEditor instance on the fly, following user's doubleclick. The content
+			that was previously placed inside the <code>&lt;div&gt;</code> element will now
+			be moved into CKEditor editing area.
+		</p>
+		<p>
+			For details on how to create this setup check the source code of this sample page.
+		</p>
+	</div>
+	<p>
+		Double-click any of the following <code>&lt;div&gt;</code> elements to transform them into
+		editor instances.
+	</p>
+	<div class="editable">
+		<h3>
+			Part 1
+		</h3>
+		<p>
+			Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi
+			semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna
+			rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla
+			nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce
+			eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.
+		</p>
+	</div>
+	<div class="editable">
+		<h3>
+			Part 2
+		</h3>
+		<p>
+			Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi
+			semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna
+			rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla
+			nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce
+			eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.
+		</p>
+		<p>
+			Donec velit. Mauris massa. Vestibulum non nulla. Nam suscipit arcu nec elit. Phasellus
+			sollicitudin iaculis ante. Ut non mauris et sapien tincidunt adipiscing. Vestibulum
+			vitae leo. Suspendisse nec mi tristique nulla laoreet vulputate.
+		</p>
+	</div>
+	<div class="editable">
+		<h3>
+			Part 3
+		</h3>
+		<p>
+			Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi
+			semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna
+			rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla
+			nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce
+			eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.
+		</p>
+	</div>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/index.html b/htmltest/sites/all/libraries/ckeditor-version/samples/index.html
new file mode 100644
index 00000000..cd02f3cf
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/index.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>CKEditor Samples</title>
+	<meta charset="utf-8">
+	<link rel="stylesheet" href="sample.css">
+</head>
+<body>
+	<h1 class="samples">
+		CKEditor Samples
+	</h1>
+	<div class="twoColumns">
+		<div class="twoColumnsLeft">
+			<h2 class="samples">
+				Basic Samples
+			</h2>
+			<dl class="samples">
+				<dt><a class="samples" href="replacebyclass.html">Replace textarea elements by class name</a></dt>
+				<dd>Automatic replacement of all textarea elements of a given class with a CKEditor instance.</dd>
+
+				<dt><a class="samples" href="replacebycode.html">Replace textarea elements by code</a></dt>
+				<dd>Replacement of textarea elements with CKEditor instances by using a JavaScript call.</dd>
+
+				<dt><a class="samples" href="jquery.html">Create editors with jQuery</a> <span class="new">New!</span></dt>
+				<dd>Creating standard and inline CKEditor instances with jQuery adapter.</dd>
+			</dl>
+
+			<h2 class="samples">
+				Basic Customization
+			</h2>
+			<dl class="samples">
+				<dt><a class="samples" href="uicolor.html">User Interface color</a></dt>
+				<dd>Changing CKEditor User Interface color and adding a toolbar button that lets the user set the UI color.</dd>
+
+				<dt><a class="samples" href="uilanguages.html">User Interface languages</a></dt>
+				<dd>Changing CKEditor User Interface language and adding a drop-down list that lets the user choose the UI language.</dd>
+			</dl>
+
+
+			<h2 class="samples">Plugins</h2>
+<dl class="samples">
+<dt><a class="samples" href="plugins/magicline/magicline.html">Magicline plugin</a><span class="new">New!</span></dt>
+<dd>Using the Magicline plugin to access difficult focus spaces.</dd>
+
+<dt><a class="samples" href="plugins/wysiwygarea/fullpage.html">Full page support</a></dt>
+<dd>CKEditor inserted with a JavaScript call and used to edit the whole page from &lt;html&gt; to &lt;/html&gt;.</dd>
+</dl>
+		</div>
+		<div class="twoColumnsRight">
+			<h2 class="samples">
+				Inline Editing <span class="new">New!</span>
+			</h2>
+			<dl class="samples">
+				<dt><a class="samples" href="inlineall.html">Massive inline editor creation</a> <span class="new">New!</span></dt>
+				<dd>Turn all elements with <code>contentEditable = true</code> attribute into inline editors.</dd>
+
+				<dt><a class="samples" href="inlinebycode.html">Convert element into an inline editor by code</a> <span class="new">New!</span></dt>
+				<dd>Conversion of DOM elements into inline CKEditor instances by using a JavaScript call.</dd>
+
+				<dt><a class="samples" href="inlinetextarea.html">Replace textarea with inline editor</a> <span class="new">New!</span></dt>
+				<dd>A form with a textarea that is replaced by an inline editor at runtime.</dd>
+
+				
+			</dl>
+
+			<h2 class="samples">
+				Advanced Samples
+			</h2>
+			<dl class="samples">
+				<dt><a class="samples" href="datafiltering.html">Data filtering and features activation</a> <span class="new">New!</span></dt>
+				<dd>Data filtering and automatic features activation basing on configuration.</dd>
+
+				<dt><a class="samples" href="divreplace.html">Replace DIV elements on the fly</a></dt>
+				<dd>Transforming a <code>div</code> element into an instance of CKEditor with a mouse click.</dd>
+
+				<dt><a class="samples" href="appendto.html">Append editor instances</a></dt>
+				<dd>Appending editor instances to existing DOM elements.</dd>
+
+				<dt><a class="samples" href="ajax.html">Create and destroy editor instances for Ajax applications</a></dt>
+				<dd>Creating and destroying CKEditor instances on the fly and saving the contents entered into the editor window.</dd>
+
+				<dt><a class="samples" href="api.html">Basic usage of the API</a></dt>
+				<dd>Using the CKEditor JavaScript API to interact with the editor at runtime.</dd>
+
+				<dt><a class="samples" href="xhtmlstyle.html">XHTML-compliant style</a></dt>
+				<dd>Configuring CKEditor to produce XHTML 1.1 compliant attributes and styles.</dd>
+
+				<dt><a class="samples" href="readonly.html">Read-only mode</a></dt>
+				<dd>Using the readOnly API to block introducing changes to the editor contents.</dd>
+
+				<dt><a class="samples" href="tabindex.html">"Tab" key-based navigation</a> <span class="new">New!</span></dt>
+				<dd>Navigating among editor instances with tab key.</dd>
+
+
+				
+<dt><a class="samples" href="plugins/dialog/dialog.html">Using the JavaScript API to customize dialog windows</a></dt>
+<dd>Using the dialog windows API to customize dialog windows without changing the original editor code.</dd>
+
+<dt><a class="samples" href="plugins/enterkey/enterkey.html">Using the &quot;Enter&quot; key in CKEditor</a></dt>
+<dd>Configuring the behavior of <em>Enter</em> and <em>Shift+Enter</em> keys.</dd>
+
+<dt><a class="samples" href="plugins/htmlwriter/outputforflash.html">Output for Flash</a></dt>
+<dd>Configuring CKEditor to produce HTML code that can be used with Adobe Flash.</dd>
+
+<dt><a class="samples" href="plugins/htmlwriter/outputhtml.html">Output HTML</a></dt>
+<dd>Configuring CKEditor to produce legacy HTML 4 code.</dd>
+
+<dt><a class="samples" href="plugins/toolbar/toolbar.html">Toolbar Configurations</a><span class="new">New!</span></dt>
+<dd>Configuring CKEditor to display full or custom toolbar layout.</dd>
+
+			</dl>
+		</div>
+	</div>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/inlineall.html b/htmltest/sites/all/libraries/ckeditor-version/samples/inlineall.html
new file mode 100644
index 00000000..31c4af81
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/inlineall.html
@@ -0,0 +1,311 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>Massive inline editing &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../ckeditor.js"></script>
+	<script>
+
+		// This code is generally not necessary, but it is here to demonstrate
+		// how to customize specific editor instances on the fly. This fits well
+		// this demo because we have editable elements (like headers) that
+		// require less features.
+
+		// The "instanceCreated" event is fired for every editor instance created.
+		CKEDITOR.on( 'instanceCreated', function( event ) {
+			var editor = event.editor,
+				element = editor.element;
+
+			// Customize editors for headers and tag list.
+			// These editors don't need features like smileys, templates, iframes etc.
+			if ( element.is( 'h1', 'h2', 'h3' ) || element.getAttribute( 'id' ) == 'taglist' ) {
+				// Customize the editor configurations on "configLoaded" event,
+				// which is fired after the configuration file loading and
+				// execution. This makes it possible to change the
+				// configurations before the editor initialization takes place.
+				editor.on( 'configLoaded', function() {
+
+					// Remove unnecessary plugins to make the editor simpler.
+					editor.config.removePlugins = 'colorbutton,find,flash,font,' +
+						'forms,iframe,image,newpage,removeformat,' +
+						'smiley,specialchar,stylescombo,templates';
+
+					// Rearrange the layout of the toolbar.
+					editor.config.toolbarGroups = [
+						{ name: 'editing',		groups: [ 'basicstyles', 'links' ] },
+						{ name: 'undo' },
+						{ name: 'clipboard',	groups: [ 'selection', 'clipboard' ] },
+						{ name: 'about' }
+					];
+				});
+			}
+		});
+
+	</script>
+	<link href="sample.css" rel="stylesheet">
+	<style>
+
+		/* The following styles are just to make the page look nice. */
+
+		/* Workaround to show Arial Black in Firefox. */
+		@font-face
+		{
+			font-family: 'arial-black';
+			src: local('Arial Black');
+		}
+
+		*[contenteditable="true"]
+		{
+			padding: 10px;
+		}
+
+		#container
+		{
+			width: 960px;
+			margin: 30px auto 0;
+		}
+
+		#header
+		{
+			overflow: hidden;
+			padding: 0 0 30px;
+			border-bottom: 5px solid #05B2D2;
+			position: relative;
+		}
+
+		#headerLeft,
+		#headerRight
+		{
+			width: 49%;
+			overflow: hidden;
+		}
+
+		#headerLeft
+		{
+			float: left;
+			padding: 10px 1px 1px;
+		}
+
+		#headerLeft h2,
+		#headerLeft h3
+		{
+			text-align: right;
+			margin: 0;
+			overflow: hidden;
+			font-weight: normal;
+		}
+
+		#headerLeft h2
+		{
+			font-family: "Arial Black",arial-black;
+			font-size: 4.6em;
+			line-height: 1.1em;
+			text-transform: uppercase;
+		}
+
+		#headerLeft h3
+		{
+			font-size: 2.3em;
+			line-height: 1.1em;
+			margin: .2em 0 0;
+			color: #666;
+		}
+
+		#headerRight
+		{
+			float: right;
+			padding: 1px;
+		}
+
+		#headerRight p
+		{
+			line-height: 1.8em;
+			text-align: justify;
+			margin: 0;
+		}
+
+		#headerRight p + p
+		{
+			margin-top: 20px;
+		}
+
+		#headerRight > div
+		{
+			padding: 20px;
+			margin: 0 0 0 30px;
+			font-size: 1.4em;
+			color: #666;
+		}
+
+		#columns
+		{
+			color: #333;
+			overflow: hidden;
+			padding: 20px 0;
+		}
+
+		#columns > div
+		{
+			float: left;
+			width: 33.3%;
+		}
+
+		#columns #column1 > div
+		{
+			margin-left: 1px;
+		}
+
+		#columns #column3 > div
+		{
+			margin-right: 1px;
+		}
+
+		#columns > div > div
+		{
+			margin: 0px 10px;
+			padding: 10px 20px;
+		}
+
+		#columns blockquote
+		{
+			margin-left: 15px;
+		}
+
+		#tagLine
+		{
+			border-top: 5px solid #05B2D2;
+			padding-top: 20px;
+		}
+
+		#taglist {
+			display: inline-block;
+			margin-left: 20px;
+			font-weight: bold;
+			margin: 0 0 0 20px;
+		}
+
+	</style>
+</head>
+<body>
+<div>
+	<h1 class="samples"><a href="index.html">CKEditor Samples</a> &raquo; Massive inline editing</h1>
+	<div class="description">
+		<p>This sample page demonstrates the inline editing feature - CKEditor instances will be created automatically from page elements with <strong>contentEditable</strong> attribute set to value <strong>true</strong>:</p>
+		<pre class="samples">&lt;div <strong>contenteditable="true</strong>" &gt; ... &lt;/div&gt;</pre>
+		<p>Click inside of any element below to start editing.</p>
+	</div>
+</div>
+<div id="container">
+	<div id="header">
+		<div id="headerLeft">
+			<h2 id="sampleTitle" contenteditable="true">
+				CKEditor<br> Goes Inline!
+			</h2>
+			<h3 contenteditable="true">
+				Lorem ipsum dolor sit amet dolor duis blandit vestibulum faucibus a, tortor.
+			</h3>
+		</div>
+		<div id="headerRight">
+			<div contenteditable="true">
+				<p>
+					Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies.
+				</p>
+				<p>
+					Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim. Phasellus fermentum in, dolor. Pellentesque facilisis. Nulla imperdiet sit amet magna. Vestibulum dapibus, mauris nec malesuada fames ac.
+				</p>
+			</div>
+		</div>
+	</div>
+	<div id="columns">
+		<div id="column1">
+			<div contenteditable="true">
+				<h3>
+					Fusce vitae porttitor
+				</h3>
+				<p>
+					<strong>
+						Lorem ipsum dolor sit amet dolor. Duis blandit vestibulum faucibus a, tortor.
+					</strong>
+				</p>
+				<p>
+					Proin nunc justo felis mollis tincidunt, risus risus pede, posuere cubilia Curae, Nullam euismod, enim. Etiam nibh ultricies dolor ac dignissim erat volutpat. Vivamus fermentum <a href="http://ckeditor.com/">nisl nulla sem in</a> metus. Maecenas wisi. Donec nec erat volutpat.
+				</p>
+				<blockquote>
+					<p>
+						Fusce vitae porttitor a, euismod convallis nisl, blandit risus tortor, pretium.
+						Vehicula vitae, imperdiet vel, ornare enim vel sodales rutrum
+					</p>
+				</blockquote>
+				<blockquote>
+					<p>
+						Libero nunc, rhoncus ante ipsum non ipsum. Nunc eleifend pede turpis id sollicitudin fringilla. Phasellus ultrices, velit ac arcu.
+					</p>
+				</blockquote>
+				<p>Pellentesque nunc. Donec suscipit erat. Pellentesque habitant morbi tristique ullamcorper.</p>
+				<p><s>Mauris mattis feugiat lectus nec mauris. Nullam vitae ante.</s></p>
+			</div>
+		</div>
+		<div id="column2">
+			<div contenteditable="true">
+				<h3>
+					Integer condimentum sit amet
+				</h3>
+				<p>
+					<strong>Aenean nonummy a, mattis varius. Cras aliquet.</strong>
+					Praesent <a href="http://ckeditor.com/">magna non mattis ac, rhoncus nunc</a>, rhoncus eget, cursus pulvinar mollis.</p>
+				<p>Proin id nibh. Sed eu libero posuere sed, lectus. Phasellus dui gravida gravida feugiat mattis ac, felis.</p>
+				<p>Integer condimentum sit amet, tempor elit odio, a dolor non ante at sapien. Sed ac lectus. Nulla ligula quis eleifend mi, id leo velit pede cursus arcu id nulla ac lectus. Phasellus vestibulum. Nunc viverra enim quis diam.</p>
+			</div>
+			<div contenteditable="true">
+				<h3>
+					Praesent wisi accumsan sit amet nibh
+				</h3>
+				<p>Donec ullamcorper, risus tortor, pretium porttitor. Morbi quam quis lectus non leo.</p>
+				<p style="margin-left: 40px; ">Integer faucibus scelerisque. Proin faucibus at, aliquet vulputate, odio at eros. Fusce <a href="http://ckeditor.com/">gravida, erat vitae augue</a>. Fusce urna fringilla gravida.</p>
+				<p>In hac habitasse platea dictumst. Praesent wisi accumsan sit amet nibh. Maecenas orci luctus a, lacinia quam sem, posuere commodo, odio condimentum tempor, pede semper risus. Suspendisse pede. In hac habitasse platea dictumst. Nam sed laoreet sit amet erat. Integer.</p>
+			</div>
+		</div>
+		<div id="column3">
+			<div contenteditable="true">
+				<p>
+					<img src="assets/inlineall/logo.png" alt="CKEditor logo" style="float:left">
+				</p>
+				<p>Quisque justo neque, mattis sed, fermentum ultrices <strong>posuere cubilia Curae</strong>, Vestibulum elit metus, quis placerat ut, lectus. Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis. Fusce porttitor, nulla quis turpis. Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi. Donec odio nec velit ac nunc sit amet, accumsan cursus aliquet. Vestibulum ante sit amet sagittis mi.</p>
+				<h3>
+					Nullam laoreet vel consectetuer tellus suscipit
+				</h3>
+				<ul>
+					<li>Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis.</li>
+					<li>Fusce porttitor, nulla quis turpis. Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi.</li>
+					<li>Mauris eget tellus. Donec non felis. Nam eget dolor. Vestibulum enim. Donec.</li>
+				</ul>
+				<p>Quisque justo neque, mattis sed, <a href="http://ckeditor.com/">fermentum ultrices posuere cubilia</a> Curae, Vestibulum elit metus, quis placerat ut, lectus.</p>
+				<p>Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi. Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis. Fusce porttitor, nulla quis turpis.</p>
+				<p>Donec odio nec velit ac nunc sit amet, accumsan cursus aliquet. Vestibulum ante sit amet sagittis mi. Sed in nonummy faucibus turpis. Mauris eget tellus. Donec non felis. Nam eget dolor. Vestibulum enim. Donec.</p>
+			</div>
+		</div>
+	</div>
+	<div id="tagLine">
+		Tags of this article:
+		<p id="taglist" contenteditable="true">
+			inline, editing, floating, CKEditor
+		</p>
+	</div>
+</div>
+<div id="footer">
+	<hr>
+	<p>
+		CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">
+			http://ckeditor.com</a>
+	</p>
+	<p id="copy">
+		Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a>
+		- Frederico Knabben. All rights reserved.
+	</p>
+</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/inlinebycode.html b/htmltest/sites/all/libraries/ckeditor-version/samples/inlinebycode.html
new file mode 100644
index 00000000..6a99d118
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/inlinebycode.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>Inline Editing by Code &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../ckeditor.js"></script>
+	<link href="sample.css" rel="stylesheet">
+	<style>
+
+		#editable
+		{
+			padding: 10px;
+			float: left;
+		}
+
+	</style>
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html">CKEditor Samples</a> &raquo; Inline Editing by Code
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows how to create an inline editor instance of CKEditor. It is created
+			with a JavaScript call using the following code:
+		</p>
+<pre class="samples">
+// This property tells CKEditor to not activate every element with contenteditable=true element.
+CKEDITOR.disableAutoInline = true;
+
+var editor = CKEDITOR.inline( document.getElementById( 'editable' ) );
+</pre>
+		<p>
+			Note that <code>editable</code> in the code above is the <code>id</code>
+			attribute of the <code>&lt;div&gt;</code> element to be converted into an inline instance.
+		</p>
+	</div>
+	<div id="editable" contenteditable="true">
+		<h1><img alt="Saturn V carrying Apollo 11" class="right" src="assets/sample.jpg" /> Apollo 11</h1>
+
+		<p><b>Apollo 11</b> was the spaceflight that landed the first humans, Americans <a href="http://en.wikipedia.org/wiki/Neil_Armstrong" title="Neil Armstrong">Neil Armstrong</a> and <a href="http://en.wikipedia.org/wiki/Buzz_Aldrin" title="Buzz Aldrin">Buzz Aldrin</a>, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.</p>
+
+		<p>Armstrong spent about <s>three and a half</s> two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&nbsp;kg) of lunar material for return to Earth. A third member of the mission, <a href="http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)" title="Michael Collins (astronaut)">Michael Collins</a>, piloted the <a href="http://en.wikipedia.org/wiki/Apollo_Command/Service_Module" title="Apollo Command/Service Module">command</a> spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.</p>
+
+		<h2>Broadcasting and <em>quotes</em> <a id="quotes" name="quotes"></a></h2>
+
+		<p>Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:</p>
+
+		<blockquote>
+			<p>One small step for [a] man, one giant leap for mankind.</p>
+		</blockquote>
+
+		<p>Apollo 11 effectively ended the <a href="http://en.wikipedia.org/wiki/Space_Race" title="Space Race">Space Race</a> and fulfilled a national goal proposed in 1961 by the late U.S. President <a href="http://en.wikipedia.org/wiki/John_F._Kennedy" title="John F. Kennedy">John F. Kennedy</a> in a speech before the United States Congress:</p>
+
+		<blockquote>
+			<p>[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.</p>
+		</blockquote>
+
+		<h2>Technical details <a id="tech-details" name="tech-details"></a></h2>
+
+		<table align="right" border="1" bordercolor="#ccc" cellpadding="5" cellspacing="0" style="border-collapse:collapse;margin:10px 0 10px 15px;">
+			<caption><strong>Mission crew</strong></caption>
+			<thead>
+			<tr>
+				<th scope="col">Position</th>
+				<th scope="col">Astronaut</th>
+			</tr>
+			</thead>
+			<tbody>
+			<tr>
+				<td>Commander</td>
+				<td>Neil A. Armstrong</td>
+			</tr>
+			<tr>
+				<td>Command Module Pilot</td>
+				<td>Michael Collins</td>
+			</tr>
+			<tr>
+				<td>Lunar Module Pilot</td>
+				<td>Edwin &quot;Buzz&quot; E. Aldrin, Jr.</td>
+			</tr>
+			</tbody>
+		</table>
+
+		<p>Launched by a <strong>Saturn V</strong> rocket from <a href="http://en.wikipedia.org/wiki/Kennedy_Space_Center" title="Kennedy Space Center">Kennedy Space Center</a> in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of <a href="http://en.wikipedia.org/wiki/NASA" title="NASA">NASA</a>&#39;s Apollo program. The Apollo spacecraft had three parts:</p>
+
+		<ol>
+			<li><strong>Command Module</strong> with a cabin for the three astronauts which was the only part which landed back on Earth</li>
+			<li><strong>Service Module</strong> which supported the Command Module with propulsion, electrical power, oxygen and water</li>
+			<li><strong>Lunar Module</strong> for landing on the Moon.</li>
+		</ol>
+
+		<p>After being sent to the Moon by the Saturn V&#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the <a href="http://en.wikipedia.org/wiki/Mare_Tranquillitatis" title="Mare Tranquillitatis">Sea of Tranquility</a>. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the <a href="http://en.wikipedia.org/wiki/Pacific_Ocean" title="Pacific Ocean">Pacific Ocean</a> on July 24.</p>
+
+		<hr />
+		<p style="text-align: right;"><small>Source: <a href="http://en.wikipedia.org/wiki/Apollo_11">Wikipedia.org</a></small></p>
+	</div>
+
+	<script>
+		// We need to turn off the automatic editor creation first.
+		CKEDITOR.disableAutoInline = true;
+
+		var editor = CKEDITOR.inline( 'editable' );
+	</script>
+	<div id="footer">
+		<hr>
+		<p contenteditable="true">
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">
+				http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a>
+			- Frederico Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/inlinetextarea.html b/htmltest/sites/all/libraries/ckeditor-version/samples/inlinetextarea.html
new file mode 100644
index 00000000..e61b1d45
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/inlinetextarea.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>Replace Textarea with Inline Editor &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../ckeditor.js"></script>
+	<link href="sample.css" rel="stylesheet">
+	<style>
+
+		/* Style the CKEditor element to look like a textfield */
+		.cke_textarea_inline
+		{
+			padding: 10px;
+			height: 200px;
+			overflow: auto;
+
+			border: 1px solid gray;
+			-webkit-appearance: textfield;
+		}
+
+	</style>
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html">CKEditor Samples</a> &raquo; Replace Textarea with Inline Editor
+	</h1>
+	<div class="description">
+		<p>
+			You can also create an inline editor from a <code>textarea</code>
+			element. In this case the <code>textarea</code> will be replaced
+			by a <code>div</code> element with inline editing enabled.
+		</p>
+<pre class="samples">
+// "article-body" is the name of a textarea element.
+var editor = CKEDITOR.inline( 'article-body' );
+</pre>
+	</div>
+	<form action="sample_posteddata.php" method="post">
+		<h2>This is a sample form with some fields</h2>
+		<p>
+			Title:<br>
+			<input type="text" name="title" value="Sample Form"></p>
+		<p>
+			Article Body (Textarea converted to CKEditor):<br>
+			<textarea name="article-body" style="height: 200px">
+				&lt;h2&gt;Technical details &lt;a id="tech-details" name="tech-details"&gt;&lt;/a&gt;&lt;/h2&gt;
+
+				&lt;table align="right" border="1" bordercolor="#ccc" cellpadding="5" cellspacing="0" style="border-collapse:collapse;margin:10px 0 10px 15px;"&gt;
+					&lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt;
+					&lt;thead&gt;
+					&lt;tr&gt;
+						&lt;th scope="col"&gt;Position&lt;/th&gt;
+						&lt;th scope="col"&gt;Astronaut&lt;/th&gt;
+					&lt;/tr&gt;
+					&lt;/thead&gt;
+					&lt;tbody&gt;
+					&lt;tr&gt;
+						&lt;td&gt;Commander&lt;/td&gt;
+						&lt;td&gt;Neil A. Armstrong&lt;/td&gt;
+					&lt;/tr&gt;
+					&lt;tr&gt;
+						&lt;td&gt;Command Module Pilot&lt;/td&gt;
+						&lt;td&gt;Michael Collins&lt;/td&gt;
+					&lt;/tr&gt;
+					&lt;tr&gt;
+						&lt;td&gt;Lunar Module Pilot&lt;/td&gt;
+						&lt;td&gt;Edwin &quot;Buzz&quot; E. Aldrin, Jr.&lt;/td&gt;
+					&lt;/tr&gt;
+					&lt;/tbody&gt;
+				&lt;/table&gt;
+
+				&lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href="http://en.wikipedia.org/wiki/Kennedy_Space_Center" title="Kennedy Space Center"&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href="http://en.wikipedia.org/wiki/NASA" title="NASA"&gt;NASA&lt;/a&gt;&#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt;
+
+				&lt;ol&gt;
+					&lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt;
+					&lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt;
+					&lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt;
+				&lt;/ol&gt;
+
+				&lt;p&gt;After being sent to the Moon by the Saturn V&#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href="http://en.wikipedia.org/wiki/Mare_Tranquillitatis" title="Mare Tranquillitatis"&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href="http://en.wikipedia.org/wiki/Pacific_Ocean" title="Pacific Ocean"&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt;
+
+				&lt;hr /&gt;
+				&lt;p style="text-align: right;"&gt;&lt;small&gt;Source: &lt;a href="http://en.wikipedia.org/wiki/Apollo_11"&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+			</textarea>
+		</p>
+		<p>
+			<input type="submit" value="Submit">
+		</p>
+	</form>
+
+	<script>
+		CKEDITOR.inline( 'article-body' );
+	</script>
+	<div id="footer">
+		<hr>
+		<p contenteditable="true">
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">
+				http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a>
+			- Frederico Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/jquery.html b/htmltest/sites/all/libraries/ckeditor-version/samples/jquery.html
new file mode 100644
index 00000000..7108865b
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/jquery.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<meta charset="utf-8">
+	<title>jQuery Adapter &mdash; CKEditor Sample</title>
+	<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" ></script>
+	<script src="../ckeditor.js"></script>
+	<script src="../adapters/jquery.js"></script>
+	<link href="sample.css" rel="stylesheet">
+	<style>
+
+		#editable
+		{
+			padding: 10px;
+			float: left;
+		}
+
+	</style>
+	<script>
+
+		CKEDITOR.disableAutoInline = true;
+
+		$( document ).ready( function() {
+			$( '#editor1' ).ckeditor(); // Use CKEDITOR.replace() if element is <textarea>.
+			$( '#editable' ).ckeditor(); // Use CKEDITOR.inline().
+		} );
+
+		function setValue() {
+			$( '#editor1' ).val( $( 'input#val' ).val() );
+		}
+
+	</script>
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html" id="a-test">CKEditor Samples</a> &raquo; Create Editors with jQuery
+	</h1>
+	<form action="sample_posteddata.php" method="post">
+		<div class="description">
+			<p>
+				This sample shows how to use the <a href="http://docs.ckeditor.com/#!/api/adapters.jQuery">jQuery adapter</a>.
+				Note that you have to include both CKEditor and jQuery scripts before including the adapter.
+			</p>
+<pre class="samples">
+&lt;script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"&gt;&lt;/script&gt;
+&lt;script src="/ckeditor/ckeditor.js"&gt;&lt;/script&gt;
+&lt;script src="/ckeditor/adapters/jquery.js"&gt;&lt;/script&gt;
+</pre>
+			<p>Then you can replace html elements with a CKEditor instance using the <code>ckeditor()</code> method.</p>
+<pre class="samples">
+$( document ).ready( function() {
+	$( 'textarea#editor1' ).ckeditor();
+} );
+</pre>
+		</div>
+
+		<h2 class="samples">Inline Example</h2>
+
+		<div id="editable" contenteditable="true">
+			<p><img alt="Saturn V carrying Apollo 11" class="right" src="assets/sample.jpg"/><b>Apollo 11</b> was the spaceflight that landed the first humans, Americans <a href="http://en.wikipedia.org/wiki/Neil_Armstrong" title="Neil Armstrong">Neil Armstrong</a> and <a href="http://en.wikipedia.org/wiki/Buzz_Aldrin" title="Buzz Aldrin">Buzz Aldrin</a>, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.</p>
+			<p>Armstrong spent about <s>three and a half</s> two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&nbsp;kg) of lunar material for return to Earth. A third member of the mission, <a href="http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)" title="Michael Collins (astronaut)">Michael Collins</a>, piloted the <a href="http://en.wikipedia.org/wiki/Apollo_Command/Service_Module" title="Apollo Command/Service Module">command</a> spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.
+			<p>Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:</p>
+			<blockquote><p>One small step for [a] man, one giant leap for mankind.</p></blockquote> <p>Apollo 11 effectively ended the <a href="http://en.wikipedia.org/wiki/Space_Race" title="Space Race">Space Race</a> and fulfilled a national goal proposed in 1961 by the late U.S. President <a href="http://en.wikipedia.org/wiki/John_F._Kennedy" title="John F. Kennedy">John F. Kennedy</a> in a speech before the United States Congress:</p> <blockquote><p>[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.</p></blockquote>
+		</div>
+
+		<br style="clear: both">
+
+		<h2 class="samples">Framed Example</h2>
+
+		<textarea cols="80" id="editor1" name="editor1" rows="10">
+			&lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+		</textarea>
+
+		<p style="overflow: hidden">
+			<input style="float: left" type="submit" value="Submit">
+			<span style="float: right">
+				<input type="text" id="val" value="I'm using jQuery val()!" size="30">
+				<input onclick="setValue();" type="button" value="Set value">
+			</span>
+		</p>
+	</form>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/dialog/assets/my_dialog.js b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/dialog/assets/my_dialog.js
new file mode 100644
index 00000000..bbf6244b
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/dialog/assets/my_dialog.js
@@ -0,0 +1,48 @@
+﻿/**
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or http://ckeditor.com/license
+ */
+
+CKEDITOR.dialog.add( 'myDialog', function( editor ) {
+	return {
+		title: 'My Dialog',
+		minWidth: 400,
+		minHeight: 200,
+		contents: [
+			{
+				id: 'tab1',
+				label: 'First Tab',
+				title: 'First Tab',
+				elements: [
+					{
+						id: 'input1',
+						type: 'text',
+						label: 'Text Field'
+					},
+					{
+						id: 'select1',
+						type: 'select',
+						label: 'Select Field',
+						items: [
+							[ 'option1', 'value1' ],
+							[ 'option2', 'value2' ]
+						]
+					}
+				]
+			},
+			{
+				id: 'tab2',
+				label: 'Second Tab',
+				title: 'Second Tab',
+				elements: [
+					{
+						id: 'button1',
+						type: 'button',
+						label: 'Button Field'
+					}
+				]
+			}
+		]
+	};
+});
+
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/dialog/dialog.html b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/dialog/dialog.html
new file mode 100644
index 00000000..f3c1376d
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/dialog/dialog.html
@@ -0,0 +1,187 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>Using API to Customize Dialog Windows &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../../../ckeditor.js"></script>
+	<link rel="stylesheet" href="../../../samples/sample.css">
+	<meta name="ckeditor-sample-name" content="Using the JavaScript API to customize dialog windows">
+	<meta name="ckeditor-sample-group" content="Advanced Samples">
+	<meta name="ckeditor-sample-description" content="Using the dialog windows API to customize dialog windows without changing the original editor code.">
+	<style>
+
+		.cke_button__mybutton_icon
+		{
+			display: none !important;
+		}
+
+		.cke_button__mybutton_label
+		{
+			display: inline !important;
+		}
+
+	</style>
+	<script>
+
+		CKEDITOR.on( 'instanceCreated', function( ev ){
+			var editor = ev.editor;
+
+			// Listen for the "pluginsLoaded" event, so we are sure that the
+			// "dialog" plugin has been loaded and we are able to do our
+			// customizations.
+			editor.on( 'pluginsLoaded', function() {
+
+				// If our custom dialog has not been registered, do that now.
+				if ( !CKEDITOR.dialog.exists( 'myDialog' ) ) {
+					// We need to do the following trick to find out the dialog
+					// definition file URL path. In the real world, you would simply
+					// point to an absolute path directly, like "/mydir/mydialog.js".
+					var href = document.location.href.split( '/' );
+					href.pop();
+					href.push( 'assets/my_dialog.js' );
+					href = href.join( '/' );
+
+					// Finally, register the dialog.
+					CKEDITOR.dialog.add( 'myDialog', href );
+				}
+
+				// Register the command used to open the dialog.
+				editor.addCommand( 'myDialogCmd', new CKEDITOR.dialogCommand( 'myDialog' ) );
+
+				// Add the a custom toolbar buttons, which fires the above
+				// command..
+				editor.ui.add( 'MyButton', CKEDITOR.UI_BUTTON, {
+					label: 'My Dialog',
+					command: 'myDialogCmd'
+				});
+			});
+		});
+
+		// When opening a dialog, its "definition" is created for it, for
+		// each editor instance. The "dialogDefinition" event is then
+		// fired. We should use this event to make customizations to the
+		// definition of existing dialogs.
+		CKEDITOR.on( 'dialogDefinition', function( ev ) {
+			// Take the dialog name and its definition from the event data.
+			var dialogName = ev.data.name;
+			var dialogDefinition = ev.data.definition;
+
+			// Check if the definition is from the dialog we're
+			// interested on (the "Link" dialog).
+			if ( dialogName == 'myDialog' && ev.editor.name == 'editor2' ) {
+				// Get a reference to the "Link Info" tab.
+				var infoTab = dialogDefinition.getContents( 'tab1' );
+
+				// Add a new text field to the "tab1" tab page.
+				infoTab.add( {
+					type: 'text',
+					label: 'My Custom Field',
+					id: 'customField',
+					'default': 'Sample!',
+					validate: function() {
+						if ( ( /\d/ ).test( this.getValue() ) )
+							return 'My Custom Field must not contain digits';
+					}
+				});
+
+				// Remove the "select1" field from the "tab1" tab.
+				infoTab.remove( 'select1' );
+
+				// Set the default value for "input1" field.
+				var input1 = infoTab.get( 'input1' );
+				input1[ 'default' ] = 'www.example.com';
+
+				// Remove the "tab2" tab page.
+				dialogDefinition.removeContents( 'tab2' );
+
+				// Add a new tab to the "Link" dialog.
+				dialogDefinition.addContents( {
+					id: 'customTab',
+					label: 'My Tab',
+					accessKey: 'M',
+					elements: [
+						{
+							id: 'myField1',
+							type: 'text',
+							label: 'My Text Field'
+						},
+						{
+							id: 'myField2',
+							type: 'text',
+							label: 'Another Text Field'
+						}
+					]
+				});
+
+				// Provide the focus handler to start initial focus in "customField" field.
+				dialogDefinition.onFocus = function() {
+					var urlField = this.getContentElement( 'tab1', 'customField' );
+					urlField.select();
+				};
+			}
+		});
+
+		var config = {
+			extraPlugins: 'dialog',
+			toolbar: [ [ 'MyButton' ] ]
+		};
+
+	</script>
+</head>
+<body>
+	<h1 class="samples">
+		<a href="../../../samples/index.html">CKEditor Samples</a> &raquo; Using CKEditor Dialog API
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows how to use the
+			<a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.dialog">CKEditor Dialog API</a>
+			to customize CKEditor dialog windows without changing the original editor code.
+			The following customizations are being done in the example below:
+		</p>
+		<p>
+			For details on how to create this setup check the source code of this sample page.
+		</p>
+	</div>
+	<p>A custom dialog is added to the editors using the <code>pluginsLoaded</code> event, from an external <a target="_blank" href="assets/my_dialog.js">dialog definition file</a>:</p>
+	<ol>
+		<li><strong>Creating a custom dialog window</strong> &ndash; "My Dialog" dialog window opened with the "My Dialog" toolbar button.</li>
+		<li><strong>Creating a custom button</strong> &ndash; Add button to open the dialog with "My Dialog" toolbar button.</li>
+	</ol>
+	<textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+	<script>
+		// Replace the <textarea id="editor1"> with an CKEditor instance.
+		CKEDITOR.replace( 'editor1', config );
+	</script>
+	<p>The below editor modify the dialog definition of the above added dialog using the <code>dialogDefinition</code> event:</p>
+	<ol>
+		<li><strong>Adding dialog tab</strong> &ndash; Add new tab "My Tab" to dialog window.</li>
+		<li><strong>Removing a dialog window tab</strong> &ndash; Remove "Second Tab" page from the dialog window.</li>
+		<li><strong>Adding dialog window fields</strong> &ndash; Add "My Custom Field" to the dialog window.</li>
+		<li><strong>Removing dialog window field</strong> &ndash; Remove "Select Field" selection field from the dialog window.</li>
+		<li><strong>Setting default values for dialog window fields</strong> &ndash; Set default value of "Text Field" text field. </li>
+		<li><strong>Setup initial focus for dialog window</strong> &ndash; Put initial focus on "My Custom Field" text field. </li>
+	</ol>
+	<textarea cols="80" id="editor2" name="editor2" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+	<script>
+
+		// Replace the <textarea id="editor1"> with an CKEditor instance.
+		CKEDITOR.replace( 'editor2', config );
+
+	</script>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/enterkey/enterkey.html b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/enterkey/enterkey.html
new file mode 100644
index 00000000..b1d1a51f
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/enterkey/enterkey.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>ENTER Key Configuration &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../../../ckeditor.js"></script>
+	<link href="../../../samples/sample.css" rel="stylesheet">
+	<meta name="ckeditor-sample-name" content="Using the &quot;Enter&quot; key in CKEditor">
+	<meta name="ckeditor-sample-group" content="Advanced Samples">
+	<meta name="ckeditor-sample-description" content="Configuring the behavior of &lt;em&gt;Enter&lt;/em&gt; and &lt;em&gt;Shift+Enter&lt;/em&gt; keys.">
+	<script>
+
+		var editor;
+
+		function changeEnter() {
+			// If we already have an editor, let's destroy it first.
+			if ( editor )
+				editor.destroy( true );
+
+			// Create the editor again, with the appropriate settings.
+			editor = CKEDITOR.replace( 'editor1', {
+				extraPlugins: 'enterkey',
+				enterMode: Number( document.getElementById( 'xEnter' ).value ),
+				shiftEnterMode: Number( document.getElementById( 'xShiftEnter' ).value )
+			});
+		}
+
+		window.onload = changeEnter;
+
+	</script>
+</head>
+<body>
+	<h1 class="samples">
+		<a href="../../../samples/index.html">CKEditor Samples</a> &raquo; ENTER Key Configuration
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows how to configure the <em>Enter</em> and <em>Shift+Enter</em> keys
+			to perform actions specified in the
+			<a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode"><code>enterMode</code></a>
+			and <a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-shiftEnterMode"><code>shiftEnterMode</code></a>
+			parameters, respectively.
+	 		You can choose from the following options:
+		</p>
+		<ul class="samples">
+			<li><strong><code>ENTER_P</code></strong> &ndash; new <code>&lt;p&gt;</code> paragraphs are created;</li>
+			<li><strong><code>ENTER_BR</code></strong> &ndash; lines are broken with <code>&lt;br&gt;</code> elements;</li>
+			<li><strong><code>ENTER_DIV</code></strong> &ndash; new <code>&lt;div&gt;</code> blocks are created.</li>
+		</ul>
+		<p>
+			The sample code below shows how to configure CKEditor to create a <code>&lt;div&gt;</code> block when <em>Enter</em> key is pressed.
+		</p>
+<pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+	<strong>enterMode: CKEDITOR.ENTER_DIV</strong>
+});</pre>
+		<p>
+			Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
+			the <code>&lt;textarea&gt;</code> element to be replaced.
+		</p>
+	</div>
+	<div style="float: left; margin-right: 20px">
+		When <em>Enter</em> is pressed:<br>
+		<select id="xEnter" onchange="changeEnter();">
+			<option selected="selected" value="1">Create a new &lt;P&gt; (recommended)</option>
+			<option value="3">Create a new &lt;DIV&gt;</option>
+			<option value="2">Break the line with a &lt;BR&gt;</option>
+		</select>
+	</div>
+	<div style="float: left">
+		When <em>Shift+Enter</em> is pressed:<br>
+		<select id="xShiftEnter" onchange="changeEnter();">
+			<option value="1">Create a new &lt;P&gt;</option>
+			<option value="3">Create a new &lt;DIV&gt;</option>
+			<option selected="selected" value="2">Break the line with a &lt;BR&gt; (recommended)</option>
+		</select>
+	</div>
+	<br style="clear: both">
+	<form action="../../../samples/sample_posteddata.php" method="post">
+		<p>
+			<br>
+			<textarea cols="80" id="editor1" name="editor1" rows="10">This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.</textarea>
+		</p>
+		<p>
+			<input type="submit" value="Submit">
+		</p>
+	</form>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.fla b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.fla
new file mode 100644
index 00000000..27e68ccd
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.fla differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swf b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swf
new file mode 100644
index 00000000..dbe17b6b
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swf differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js
new file mode 100644
index 00000000..95fdf0a7
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js
@@ -0,0 +1,18 @@
+﻿var swfobject=function(){function u(){if(!s){try{var a=d.getElementsByTagName("body")[0].appendChild(d.createElement("span"));a.parentNode.removeChild(a)}catch(b){return}s=!0;for(var a=x.length,c=0;c<a;c++)x[c]()}}function L(a){s?a():x[x.length]=a}function M(a){if(typeof m.addEventListener!=i)m.addEventListener("load",a,!1);else if(typeof d.addEventListener!=i)d.addEventListener("load",a,!1);else if(typeof m.attachEvent!=i)U(m,"onload",a);else if("function"==typeof m.onload){var b=m.onload;m.onload=
+function(){b();a()}}else m.onload=a}function V(){var a=d.getElementsByTagName("body")[0],b=d.createElement(r);b.setAttribute("type",y);var c=a.appendChild(b);if(c){var f=0;(function(){if(typeof c.GetVariable!=i){var g=c.GetVariable("$version");g&&(g=g.split(" ")[1].split(","),e.pv=[parseInt(g[0],10),parseInt(g[1],10),parseInt(g[2],10)])}else if(10>f){f++;setTimeout(arguments.callee,10);return}a.removeChild(b);c=null;D()})()}else D()}function D(){var a=p.length;if(0<a)for(var b=0;b<a;b++){var c=p[b].id,
+f=p[b].callbackFn,g={success:!1,id:c};if(0<e.pv[0]){var d=n(c);if(d)if(z(p[b].swfVersion)&&!(e.wk&&312>e.wk))t(c,!0),f&&(g.success=!0,g.ref=E(c),f(g));else if(p[b].expressInstall&&F()){g={};g.data=p[b].expressInstall;g.width=d.getAttribute("width")||"0";g.height=d.getAttribute("height")||"0";d.getAttribute("class")&&(g.styleclass=d.getAttribute("class"));d.getAttribute("align")&&(g.align=d.getAttribute("align"));for(var h={},d=d.getElementsByTagName("param"),j=d.length,k=0;k<j;k++)"movie"!=d[k].getAttribute("name").toLowerCase()&&
+(h[d[k].getAttribute("name")]=d[k].getAttribute("value"));G(g,h,c,f)}else W(d),f&&f(g)}else if(t(c,!0),f){if((c=E(c))&&typeof c.SetVariable!=i)g.success=!0,g.ref=c;f(g)}}}function E(a){var b=null;if((a=n(a))&&"OBJECT"==a.nodeName)typeof a.SetVariable!=i?b=a:(a=a.getElementsByTagName(r)[0])&&(b=a);return b}function F(){return!A&&z("6.0.65")&&(e.win||e.mac)&&!(e.wk&&312>e.wk)}function G(a,b,c,f){A=!0;H=f||null;N={success:!1,id:c};var g=n(c);if(g){"OBJECT"==g.nodeName?(w=I(g),B=null):(w=g,B=c);a.id=
+O;if(typeof a.width==i||!/%$/.test(a.width)&&310>parseInt(a.width,10))a.width="310";if(typeof a.height==i||!/%$/.test(a.height)&&137>parseInt(a.height,10))a.height="137";d.title=d.title.slice(0,47)+" - Flash Player Installation";f=e.ie&&e.win?"ActiveX":"PlugIn";f="MMredirectURL="+m.location.toString().replace(/&/g,"%26")+"&MMplayerType="+f+"&MMdoctitle="+d.title;b.flashvars=typeof b.flashvars!=i?b.flashvars+("&"+f):f;e.ie&&(e.win&&4!=g.readyState)&&(f=d.createElement("div"),c+="SWFObjectNew",f.setAttribute("id",
+c),g.parentNode.insertBefore(f,g),g.style.display="none",function(){g.readyState==4?g.parentNode.removeChild(g):setTimeout(arguments.callee,10)}());J(a,b,c)}}function W(a){if(e.ie&&e.win&&4!=a.readyState){var b=d.createElement("div");a.parentNode.insertBefore(b,a);b.parentNode.replaceChild(I(a),b);a.style.display="none";(function(){4==a.readyState?a.parentNode.removeChild(a):setTimeout(arguments.callee,10)})()}else a.parentNode.replaceChild(I(a),a)}function I(a){var b=d.createElement("div");if(e.win&&
+e.ie)b.innerHTML=a.innerHTML;else if(a=a.getElementsByTagName(r)[0])if(a=a.childNodes)for(var c=a.length,f=0;f<c;f++)!(1==a[f].nodeType&&"PARAM"==a[f].nodeName)&&8!=a[f].nodeType&&b.appendChild(a[f].cloneNode(!0));return b}function J(a,b,c){var f,g=n(c);if(e.wk&&312>e.wk)return f;if(g)if(typeof a.id==i&&(a.id=c),e.ie&&e.win){var o="",h;for(h in a)a[h]!=Object.prototype[h]&&("data"==h.toLowerCase()?b.movie=a[h]:"styleclass"==h.toLowerCase()?o+=' class="'+a[h]+'"':"classid"!=h.toLowerCase()&&(o+=" "+
+h+'="'+a[h]+'"'));h="";for(var j in b)b[j]!=Object.prototype[j]&&(h+='<param name="'+j+'" value="'+b[j]+'" />');g.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+o+">"+h+"</object>";C[C.length]=a.id;f=n(a.id)}else{j=d.createElement(r);j.setAttribute("type",y);for(var k in a)a[k]!=Object.prototype[k]&&("styleclass"==k.toLowerCase()?j.setAttribute("class",a[k]):"classid"!=k.toLowerCase()&&j.setAttribute(k,a[k]));for(o in b)b[o]!=Object.prototype[o]&&"movie"!=o.toLowerCase()&&
+(a=j,h=o,k=b[o],c=d.createElement("param"),c.setAttribute("name",h),c.setAttribute("value",k),a.appendChild(c));g.parentNode.replaceChild(j,g);f=j}return f}function P(a){var b=n(a);b&&"OBJECT"==b.nodeName&&(e.ie&&e.win?(b.style.display="none",function(){if(4==b.readyState){var c=n(a);if(c){for(var f in c)"function"==typeof c[f]&&(c[f]=null);c.parentNode.removeChild(c)}}else setTimeout(arguments.callee,10)}()):b.parentNode.removeChild(b))}function n(a){var b=null;try{b=d.getElementById(a)}catch(c){}return b}
+function U(a,b,c){a.attachEvent(b,c);v[v.length]=[a,b,c]}function z(a){var b=e.pv,a=a.split(".");a[0]=parseInt(a[0],10);a[1]=parseInt(a[1],10)||0;a[2]=parseInt(a[2],10)||0;return b[0]>a[0]||b[0]==a[0]&&b[1]>a[1]||b[0]==a[0]&&b[1]==a[1]&&b[2]>=a[2]?!0:!1}function Q(a,b,c,f){if(!e.ie||!e.mac){var g=d.getElementsByTagName("head")[0];if(g){c=c&&"string"==typeof c?c:"screen";f&&(K=l=null);if(!l||K!=c)f=d.createElement("style"),f.setAttribute("type","text/css"),f.setAttribute("media",c),l=g.appendChild(f),
+e.ie&&(e.win&&typeof d.styleSheets!=i&&0<d.styleSheets.length)&&(l=d.styleSheets[d.styleSheets.length-1]),K=c;e.ie&&e.win?l&&typeof l.addRule==r&&l.addRule(a,b):l&&typeof d.createTextNode!=i&&l.appendChild(d.createTextNode(a+" {"+b+"}"))}}}function t(a,b){if(R){var c=b?"visible":"hidden";s&&n(a)?n(a).style.visibility=c:Q("#"+a,"visibility:"+c)}}function S(a){return null!=/[\\\"<>\.;]/.exec(a)&&typeof encodeURIComponent!=i?encodeURIComponent(a):a}var i="undefined",r="object",y="application/x-shockwave-flash",
+O="SWFObjectExprInst",m=window,d=document,q=navigator,T=!1,x=[function(){T?V():D()}],p=[],C=[],v=[],w,B,H,N,s=!1,A=!1,l,K,R=!0,e=function(){var a=typeof d.getElementById!=i&&typeof d.getElementsByTagName!=i&&typeof d.createElement!=i,b=q.userAgent.toLowerCase(),c=q.platform.toLowerCase(),f=c?/win/.test(c):/win/.test(b),c=c?/mac/.test(c):/mac/.test(b),b=/webkit/.test(b)?parseFloat(b.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):!1,g=!+"\v1",e=[0,0,0],h=null;if(typeof q.plugins!=i&&typeof q.plugins["Shockwave Flash"]==
+r){if((h=q.plugins["Shockwave Flash"].description)&&!(typeof q.mimeTypes!=i&&q.mimeTypes[y]&&!q.mimeTypes[y].enabledPlugin))T=!0,g=!1,h=h.replace(/^.*\s+(\S+\s+\S+$)/,"$1"),e[0]=parseInt(h.replace(/^(.*)\..*$/,"$1"),10),e[1]=parseInt(h.replace(/^.*\.(.*)\s.*$/,"$1"),10),e[2]=/[a-zA-Z]/.test(h)?parseInt(h.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}else if(typeof m.ActiveXObject!=i)try{var j=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(j&&(h=j.GetVariable("$version")))g=!0,h=h.split(" ")[1].split(","),
+e=[parseInt(h[0],10),parseInt(h[1],10),parseInt(h[2],10)]}catch(k){}return{w3:a,pv:e,wk:b,ie:g,win:f,mac:c}}();(function(){e.w3&&((typeof d.readyState!=i&&"complete"==d.readyState||typeof d.readyState==i&&(d.getElementsByTagName("body")[0]||d.body))&&u(),s||(typeof d.addEventListener!=i&&d.addEventListener("DOMContentLoaded",u,!1),e.ie&&e.win&&(d.attachEvent("onreadystatechange",function(){"complete"==d.readyState&&(d.detachEvent("onreadystatechange",arguments.callee),u())}),m==top&&function(){if(!s){try{d.documentElement.doScroll("left")}catch(a){setTimeout(arguments.callee,
+0);return}u()}}()),e.wk&&function(){s||(/loaded|complete/.test(d.readyState)?u():setTimeout(arguments.callee,0))}(),M(u)))})();(function(){e.ie&&e.win&&window.attachEvent("onunload",function(){for(var a=v.length,b=0;b<a;b++)v[b][0].detachEvent(v[b][1],v[b][2]);a=C.length;for(b=0;b<a;b++)P(C[b]);for(var c in e)e[c]=null;e=null;for(var f in swfobject)swfobject[f]=null;swfobject=null})})();return{registerObject:function(a,b,c,f){if(e.w3&&a&&b){var d={};d.id=a;d.swfVersion=b;d.expressInstall=c;d.callbackFn=
+f;p[p.length]=d;t(a,!1)}else f&&f({success:!1,id:a})},getObjectById:function(a){if(e.w3)return E(a)},embedSWF:function(a,b,c,d,g,o,h,j,k,m){var n={success:!1,id:b};e.w3&&!(e.wk&&312>e.wk)&&a&&b&&c&&d&&g?(t(b,!1),L(function(){c+="";d+="";var e={};if(k&&typeof k===r)for(var l in k)e[l]=k[l];e.data=a;e.width=c;e.height=d;l={};if(j&&typeof j===r)for(var p in j)l[p]=j[p];if(h&&typeof h===r)for(var q in h)l.flashvars=typeof l.flashvars!=i?l.flashvars+("&"+q+"="+h[q]):q+"="+h[q];if(z(g))p=J(e,l,b),e.id==
+b&&t(b,!0),n.success=!0,n.ref=p;else{if(o&&F()){e.data=o;G(e,l,b,m);return}t(b,!0)}m&&m(n)})):m&&m(n)},switchOffAutoHideShow:function(){R=!1},ua:e,getFlashPlayerVersion:function(){return{major:e.pv[0],minor:e.pv[1],release:e.pv[2]}},hasFlashPlayerVersion:z,createSWF:function(a,b,c){if(e.w3)return J(a,b,c)},showExpressInstall:function(a,b,c,d){e.w3&&F()&&G(a,b,c,d)},removeSWF:function(a){e.w3&&P(a)},createCSS:function(a,b,c,d){e.w3&&Q(a,b,c,d)},addDomLoadEvent:L,addLoadEvent:M,getQueryParamValue:function(a){var b=
+d.location.search||d.location.hash;if(b){/\?/.test(b)&&(b=b.split("?")[1]);if(null==a)return S(b);for(var b=b.split("&"),c=0;c<b.length;c++)if(b[c].substring(0,b[c].indexOf("="))==a)return S(b[c].substring(b[c].indexOf("=")+1))}return""},expressInstallCallback:function(){if(A){var a=n(O);a&&w&&(a.parentNode.replaceChild(w,a),B&&(t(B,!0),e.ie&&e.win&&(w.style.display="block")),H&&H(N));A=!1}}}}();
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/outputforflash.html b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/outputforflash.html
new file mode 100644
index 00000000..0e2d879c
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/outputforflash.html
@@ -0,0 +1,280 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>Output for Flash &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../../../ckeditor.js"></script>
+	<script src="../../../samples/sample.js"></script>
+	<script src="assets/outputforflash/swfobject.js"></script>
+	<link href="../../../samples/sample.css" rel="stylesheet">
+	<meta name="ckeditor-sample-required-plugins" content="sourcearea">
+	<meta name="ckeditor-sample-name" content="Output for Flash">
+	<meta name="ckeditor-sample-group" content="Advanced Samples">
+	<meta name="ckeditor-sample-description" content="Configuring CKEditor to produce HTML code that can be used with Adobe Flash.">
+	<style>
+
+		.alert
+		{
+			background: #ffa84c;
+			padding: 10px 15px;
+			font-weight: bold;
+			display: block;
+			margin-bottom: 20px;
+		}
+
+	</style>
+</head>
+<body>
+	<h1 class="samples">
+		<a href="../../../samples/index.html">CKEditor Samples</a> &raquo; Producing Flash Compliant HTML Output
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows how to configure CKEditor to output
+			HTML code that can be used with
+			<a class="samples" href="http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00000922.html">
+			Adobe Flash</a>.
+			The code will contain a subset of standard HTML elements like <code>&lt;b&gt;</code>,
+			<code>&lt;i&gt;</code>, and <code>&lt;p&gt;</code> as well as HTML attributes.
+		</p>
+		<p>
+			To add a CKEditor instance outputting Flash compliant HTML code, load the editor using a standard
+			JavaScript call, and define CKEditor features to use HTML elements and attributes.
+		</p>
+		<p>
+			For details on how to create this setup check the source code of this sample page.
+		</p>
+	</div>
+	<p>
+		To see how it works, create some content in the editing area of CKEditor on the left
+		and send it to the Flash object on the right side of the page by using the
+		<strong>Send to Flash</strong> button.
+	</p>
+	<table style="width: 100%; border-spacing: 0; border-collapse:collapse;">
+		<tr>
+			<td style="width: 100%">
+				<textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;&lt;b&gt;&lt;font size=&quot;18&quot; style=&quot;font-size:18px;&quot;&gt;Flash and HTML&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;It is possible to have &lt;a href=&quot;http://ckeditor.com&quot;&gt;CKEditor&lt;/a&gt; creating content that will be later loaded inside &lt;b&gt;Flash&lt;/b&gt; objects and animations.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Flash has a few limitations when dealing with HTML:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It has limited support on tags.&lt;/li&gt;&lt;li&gt;There is no margin between block elements, like paragraphs.&lt;/li&gt;&lt;/ul&gt;</textarea>
+				<script>
+
+					if ( document.location.protocol == 'file:' )
+						alert( 'Warning: This samples does not work when loaded from local filesystem' +
+							'due to security restrictions implemented in Flash.' +
+							'\n\nPlease load the sample from a web server instead.' );
+
+					var editor = CKEDITOR.replace( 'editor1', {
+						/*
+						 * Ensure that htmlwriter plugin, which is required for this sample, is loaded.
+						 */
+						extraPlugins: 'htmlwriter',
+
+						height: 290,
+						width: '100%',
+						toolbar: [
+							[ 'Source', '-', 'Bold', 'Italic', 'Underline', '-', 'BulletedList', '-', 'Link', 'Unlink' ],
+							[ 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock' ],
+							'/',
+							[ 'Font', 'FontSize' ],
+							[ 'TextColor', '-', 'About' ]
+						],
+
+						/*
+						 * Style sheet for the contents
+						 */
+						contentsCss: 'body {color:#000; background-color#FFF; font-family: Arial; font-size:80%;} p, ol, ul {margin-top: 0px; margin-bottom: 0px;}',
+
+						/*
+						 * Quirks doctype
+						 */
+						docType: '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',
+
+						/*
+						 * Core styles.
+						 */
+						coreStyles_bold: { element: 'b' },
+						coreStyles_italic: { element: 'i' },
+						coreStyles_underline: { element: 'u' },
+
+						/*
+						 * Font face.
+						 */
+
+						// Define the way font elements will be applied to the document. The "font"
+						// element will be used.
+						font_style: {
+							element: 'font',
+							attributes: { 'face': '#(family)' }
+						},
+
+						/*
+						 * Font sizes.
+						 */
+
+						// The CSS part of the font sizes isn't used by Flash, it is there to get the
+						// font rendered correctly in CKEditor.
+						fontSize_sizes: '8px/8;9px/9;10px/10;11px/11;12px/12;14px/14;16px/16;18px/18;20px/20;22px/22;24px/24;26px/26;28px/28;36px/36;48px/48;72px/72',
+						fontSize_style: {
+							element: 'font',
+							attributes: { 'size': '#(size)' },
+							styles: { 'font-size': '#(size)px' }
+						} ,
+
+						/*
+						 * Font colors.
+						 */
+						colorButton_enableMore: true,
+
+						colorButton_foreStyle: {
+							element: 'font',
+							attributes: { 'color': '#(color)' }
+						},
+
+						colorButton_backStyle: {
+							element: 'font',
+							styles: { 'background-color': '#(color)' }
+						},
+
+						on: { 'instanceReady': configureFlashOutput }
+					});
+
+					/*
+					 * Adjust the behavior of the dataProcessor to match the
+					 * requirements of Flash
+					 */
+					function configureFlashOutput( ev ) {
+						var editor = ev.editor,
+							dataProcessor = editor.dataProcessor,
+							htmlFilter = dataProcessor && dataProcessor.htmlFilter;
+
+						// Out self closing tags the HTML4 way, like <br>.
+						dataProcessor.writer.selfClosingEnd = '>';
+
+						// Make output formatting match Flash expectations
+						var dtd = CKEDITOR.dtd;
+						for ( var e in CKEDITOR.tools.extend( {}, dtd.$nonBodyContent, dtd.$block, dtd.$listItem, dtd.$tableContent ) ) {
+							dataProcessor.writer.setRules( e, {
+								indent: false,
+								breakBeforeOpen: false,
+								breakAfterOpen: false,
+								breakBeforeClose: false,
+								breakAfterClose: false
+							});
+						}
+						dataProcessor.writer.setRules( 'br', {
+							indent: false,
+							breakBeforeOpen: false,
+							breakAfterOpen: false,
+							breakBeforeClose: false,
+							breakAfterClose: false
+						});
+
+						// Output properties as attributes, not styles.
+						htmlFilter.addRules( {
+							elements: {
+								$: function( element ) {
+									var style, match, width, height, align;
+
+									// Output dimensions of images as width and height
+									if ( element.name == 'img' ) {
+										style = element.attributes.style;
+
+										if ( style ) {
+											// Get the width from the style.
+											match = ( /(?:^|\s)width\s*:\s*(\d+)px/i ).exec( style );
+											width = match && match[1];
+
+											// Get the height from the style.
+											match = ( /(?:^|\s)height\s*:\s*(\d+)px/i ).exec( style );
+											height = match && match[1];
+
+											if ( width ) {
+												element.attributes.style = element.attributes.style.replace( /(?:^|\s)width\s*:\s*(\d+)px;?/i , '' );
+												element.attributes.width = width;
+											}
+
+											if ( height ) {
+												element.attributes.style = element.attributes.style.replace( /(?:^|\s)height\s*:\s*(\d+)px;?/i , '' );
+												element.attributes.height = height;
+											}
+										}
+									}
+
+									// Output alignment of paragraphs using align
+									if ( element.name == 'p' ) {
+										style = element.attributes.style;
+
+										if ( style ) {
+											// Get the align from the style.
+											match = ( /(?:^|\s)text-align\s*:\s*(\w*);?/i ).exec( style );
+											align = match && match[1];
+
+											if ( align ) {
+												element.attributes.style = element.attributes.style.replace( /(?:^|\s)text-align\s*:\s*(\w*);?/i , '' );
+												element.attributes.align = align;
+											}
+										}
+									}
+
+									if ( element.attributes.style === '' )
+										delete element.attributes.style;
+
+									return element;
+								}
+							}
+						});
+					}
+
+					function sendToFlash() {
+						var html = CKEDITOR.instances.editor1.getData() ;
+
+						// Quick fix for link color.
+						html = html.replace( /<a /g, '<font color="#0000FF"><u><a ' )
+						html = html.replace( /<\/a>/g, '</a></u></font>' )
+
+						var flash = document.getElementById( 'ckFlashContainer' ) ;
+						flash.setData( html ) ;
+					}
+
+					CKEDITOR.domReady( function() {
+						if ( !swfobject.hasFlashPlayerVersion( '8' ) ) {
+							CKEDITOR.dom.element.createFromHtml( '<span class="alert">' +
+									'At least Adobe Flash Player 8 is required to run this sample. ' +
+									'You can download it from <a href="http://get.adobe.com/flashplayer">Adobe\'s website</a>.' +
+								'</span>' ).insertBefore( editor.element );
+						}
+
+						swfobject.embedSWF(
+							'assets/outputforflash/outputforflash.swf',
+							'ckFlashContainer',
+							'550',
+							'400',
+							'8',
+							{ wmode: 'transparent' }
+						);
+					});
+
+				</script>
+				<p>
+					<input type="button" value="Send to Flash" onclick="sendToFlash();">
+				</p>
+			</td>
+			<td style="vertical-align: top; padding-left: 20px">
+				<div id="ckFlashContainer"></div>
+			</td>
+		</tr>
+	</table>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/outputhtml.html b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/outputhtml.html
new file mode 100644
index 00000000..86b51b13
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/htmlwriter/outputhtml.html
@@ -0,0 +1,221 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>HTML Compliant Output &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../../../ckeditor.js"></script>
+	<script src="../../../samples/sample.js"></script>
+	<link href="../../../samples/sample.css" rel="stylesheet">
+	<meta name="ckeditor-sample-required-plugins" content="sourcearea">
+	<meta name="ckeditor-sample-name" content="Output HTML">
+	<meta name="ckeditor-sample-group" content="Advanced Samples">
+	<meta name="ckeditor-sample-description" content="Configuring CKEditor to produce legacy HTML 4 code.">
+</head>
+<body>
+	<h1 class="samples">
+		<a href="../../../samples/index.html">CKEditor Samples</a> &raquo; Producing HTML Compliant Output
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows how to configure CKEditor to output valid
+			<a class="samples" href="http://www.w3.org/TR/html401/">HTML 4.01</a> code.
+			Traditional HTML elements like <code>&lt;b&gt;</code>,
+			<code>&lt;i&gt;</code>, and <code>&lt;font&gt;</code> are used in place of
+			<code>&lt;strong&gt;</code>, <code>&lt;em&gt;</code>, and CSS styles.
+		</p>
+		<p>
+			To add a CKEditor instance outputting legacy HTML 4.01 code, load the editor using a standard
+			JavaScript call, and define CKEditor features to use the HTML compliant elements and attributes.
+		</p>
+		<p>
+			A snippet of the configuration code can be seen below; check the source of this page for
+			full definition:
+		</p>
+<pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+	coreStyles_bold: { element: 'b' },
+	coreStyles_italic: { element: 'i' },
+
+	fontSize_style: {
+		element: 'font',
+		attributes: { 'size': '#(size)' }
+	}
+
+	...
+});</pre>
+	</div>
+	<form action="../../../samples/sample_posteddata.php" method="post">
+		<p>
+			<label for="editor1">
+				Editor 1:
+			</label>
+			<textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;b&gt;sample text&lt;/b&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+			<script>
+
+				CKEDITOR.replace( 'editor1', {
+					/*
+					 * Ensure that htmlwriter plugin, which is required for this sample, is loaded.
+					 */
+					extraPlugins: 'htmlwriter',
+
+					/*
+					 * Style sheet for the contents
+					 */
+					contentsCss: 'body {color:#000; background-color#:FFF;}',
+
+					/*
+					 * Simple HTML5 doctype
+					 */
+					docType: '<!DOCTYPE HTML>',
+
+					/*
+					 * Allowed content rules which beside limiting allowed HTML
+					 * will also take care of transforming styles to attributes
+					 * (currently only for img - see transformation rules defined below).
+					 *
+					 * Read more: http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter
+					 */
+					allowedContent:
+						'h1 h2 h3 p pre[align]; ' +
+						'blockquote code kbd samp var del ins cite q b i u strike ul ol li hr table tbody tr td th caption; ' +
+						'img[!src,alt,align,width,height]; font[!face]; font[!family]; font[!color]; font[!size]; font{!background-color}; a[!href]; a[!name]',
+
+					/*
+					 * Core styles.
+					 */
+					coreStyles_bold: { element: 'b' },
+					coreStyles_italic: { element: 'i' },
+					coreStyles_underline: { element: 'u' },
+					coreStyles_strike: { element: 'strike' },
+
+					/*
+					 * Font face.
+					 */
+
+					// Define the way font elements will be applied to the document.
+					// The "font" element will be used.
+					font_style: {
+						element: 'font',
+						attributes: { 'face': '#(family)' }
+					},
+
+					/*
+					 * Font sizes.
+					 */
+					fontSize_sizes: 'xx-small/1;x-small/2;small/3;medium/4;large/5;x-large/6;xx-large/7',
+					fontSize_style: {
+						element: 'font',
+						attributes: { 'size': '#(size)' }
+					},
+
+					/*
+					 * Font colors.
+					 */
+
+					colorButton_foreStyle: {
+						element: 'font',
+						attributes: { 'color': '#(color)' }
+					},
+
+					colorButton_backStyle: {
+						element: 'font',
+						styles: { 'background-color': '#(color)' }
+					},
+
+					/*
+					 * Styles combo.
+					 */
+					stylesSet: [
+						{ name: 'Computer Code', element: 'code' },
+						{ name: 'Keyboard Phrase', element: 'kbd' },
+						{ name: 'Sample Text', element: 'samp' },
+						{ name: 'Variable', element: 'var' },
+						{ name: 'Deleted Text', element: 'del' },
+						{ name: 'Inserted Text', element: 'ins' },
+						{ name: 'Cited Work', element: 'cite' },
+						{ name: 'Inline Quotation', element: 'q' }
+					],
+
+					on: {
+						pluginsLoaded: configureTransformations,
+						loaded: configureHtmlWriter
+					}
+				});
+
+				/*
+				 * Add missing content transformations.
+				 */
+				function configureTransformations( evt ) {
+					var editor = evt.editor;
+
+					editor.dataProcessor.htmlFilter.addRules( {
+						attributes: {
+							style: function( value, element ) {
+								// Return #RGB for background and border colors
+								return CKEDITOR.tools.convertRgbToHex( value );
+							}
+						}
+					} );
+
+					// Default automatic content transformations do not yet take care of
+					// align attributes on blocks, so we need to add our own transformation rules.
+					function alignToAttribute( element ) {
+						if ( element.styles[ 'text-align' ] ) {
+							element.attributes.align = element.styles[ 'text-align' ];
+							delete element.styles[ 'text-align' ];
+						}
+					}
+					editor.filter.addTransformations( [
+						[ { element: 'p',	right: alignToAttribute } ],
+						[ { element: 'h1',	right: alignToAttribute } ],
+						[ { element: 'h2',	right: alignToAttribute } ],
+						[ { element: 'h3',	right: alignToAttribute } ],
+						[ { element: 'pre',	right: alignToAttribute } ]
+					] );
+				}
+
+				/*
+				 * Adjust the behavior of htmlWriter to make it output HTML like FCKeditor.
+				 */
+				function configureHtmlWriter( evt ) {
+					var editor = evt.editor,
+						dataProcessor = editor.dataProcessor;
+
+					// Out self closing tags the HTML4 way, like <br>.
+					dataProcessor.writer.selfClosingEnd = '>';
+
+					// Make output formatting behave similar to FCKeditor.
+					var dtd = CKEDITOR.dtd;
+					for ( var e in CKEDITOR.tools.extend( {}, dtd.$nonBodyContent, dtd.$block, dtd.$listItem, dtd.$tableContent ) ) {
+						dataProcessor.writer.setRules( e, {
+							indent: true,
+							breakBeforeOpen: true,
+							breakAfterOpen: false,
+							breakBeforeClose: !dtd[ e ][ '#' ],
+							breakAfterClose: true
+						});
+					}
+				}
+
+			</script>
+		</p>
+		<p>
+			<input type="submit" value="Submit">
+		</p>
+	</form>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/magicline/magicline.html b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/magicline/magicline.html
new file mode 100644
index 00000000..0417235c
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/magicline/magicline.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>Using Magicline plugin &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../../../ckeditor.js"></script>
+	<link rel="stylesheet" href="../../../samples/sample.css">
+	<meta name="ckeditor-sample-name" content="Magicline plugin">
+	<meta name="ckeditor-sample-group" content="Plugins">
+	<meta name="ckeditor-sample-description" content="Using the Magicline plugin to access difficult focus spaces.">
+	<meta name="ckeditor-sample-isnew" content="1">
+</head>
+<body>
+	<h1 class="samples">
+		<a href="../../../samples/index.html">CKEditor Samples</a> &raquo; Using Magicline plugin
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows the advantages of <strong>Magicline</strong> plugin
+			which is to enhance the editing process. Thanks to this plugin,
+			a number of difficult focus spaces which are inaccessible due to
+			browser issues can now be focused.
+		</p>
+		<p>
+			<strong>Magicline</strong> plugin shows a red line with a handler
+			which, when clicked, inserts a paragraph and allows typing. To see this,
+			focus an editor and move your mouse above the focus space you want
+			to access. The plugin is enabled by default so no additional
+			configuration is necessary.
+		</p>
+	</div>
+	<div>
+		<label for="editor1">
+			Editor 1:
+		</label>
+		<div class="description">
+			<p>
+				This editor uses a default <strong>Magicline</strong> setup.
+			</p>
+		</div>
+		<textarea cols="80" id="editor1" name="editor1" rows="10">
+			&lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
+				&lt;tbody&gt;
+					&lt;tr&gt;
+						&lt;td&gt;This table&lt;/td&gt;
+						&lt;td&gt;is the&lt;/td&gt;
+						&lt;td&gt;very first&lt;/td&gt;
+						&lt;td&gt;element of the document.&lt;/td&gt;
+					&lt;/tr&gt;
+					&lt;tr&gt;
+						&lt;td&gt;We are still&lt;/td&gt;
+						&lt;td&gt;able to acces&lt;/td&gt;
+						&lt;td&gt;the space before it.&lt;/td&gt;
+						&lt;td&gt;
+						&lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
+							&lt;tbody&gt;
+								&lt;tr&gt;
+									&lt;td&gt;This table is inside of a cell of another table.&lt;/td&gt;
+								&lt;/tr&gt;
+								&lt;tr&gt;
+									&lt;td&gt;We can type&amp;nbsp;either before or after it though.&lt;/td&gt;
+								&lt;/tr&gt;
+							&lt;/tbody&gt;
+						&lt;/table&gt;
+						&lt;/td&gt;
+					&lt;/tr&gt;
+				&lt;/tbody&gt;
+			&lt;/table&gt;
+
+			&lt;p&gt;Two succesive horizontal lines (&lt;tt&gt;HR&lt;/tt&gt; tags). We can access the space in between:&lt;/p&gt;
+
+			&lt;hr /&gt;
+			&lt;hr /&gt;
+			&lt;ol&gt;
+				&lt;li&gt;This numbered list...&lt;/li&gt;
+				&lt;li&gt;...is a neighbour of a horizontal line...&lt;/li&gt;
+				&lt;li&gt;...and another list.&lt;/li&gt;
+			&lt;/ol&gt;
+
+			&lt;ul&gt;
+				&lt;li&gt;We can type between the lists...&lt;/li&gt;
+				&lt;li&gt;...thanks to &lt;strong&gt;Magicline&lt;/strong&gt;.&lt;/li&gt;
+			&lt;/ul&gt;
+
+			&lt;p&gt;Lorem ipsum dolor sit amet dui. Morbi vel turpis. Nullam et leo. Etiam rutrum, urna tellus dui vel tincidunt mattis egestas, justo fringilla vel, massa. Phasellus.&lt;/p&gt;
+
+			&lt;p&gt;Quisque iaculis, dui lectus varius vitae, tortor. Proin lacus. Pellentesque ac lacus. Aenean nonummy commodo nec, pede. Etiam blandit risus elit.&lt;/p&gt;
+
+			&lt;p&gt;Ut pretium. Vestibulum rutrum in, adipiscing elit. Sed in quam in purus sem vitae pede. Pellentesque bibendum, urna sem vel risus. Vivamus posuere metus. Aliquam gravida iaculis nisl. Nam enim. Aliquam erat ac lacus tellus ac felis.&lt;/p&gt;
+
+			&lt;div style=&quot;border: 2px dashed green; background: #ddd; text-align: center;&quot;&gt;
+			&lt;p&gt;This text is wrapped in a&amp;nbsp;&lt;tt&gt;DIV&lt;/tt&gt;&amp;nbsp;element. We can type after this element though.&lt;/p&gt;
+			&lt;/div&gt;
+		</textarea>
+		<script>
+
+			// This call can be placed at any point after the
+			// <textarea>, or inside a <head><script> in a
+			// window.onload event handler.
+
+			CKEDITOR.replace( 'editor1', {
+				extraPlugins: 'magicline',	// Ensure that magicline plugin, which is required for this sample, is loaded.
+				allowedContent: true		// Switch off the ACF, so very complex content created to
+											// show magicline's power isn't filtered.
+			} );
+
+		</script>
+	</div>
+	<br>
+	<div>
+		<label for="editor2">
+			Editor 2:
+		</label>
+		<div class="description">
+			<p>
+				This editor is using a blue line.
+			</p>
+<pre class="samples">
+CKEDITOR.replace( 'editor2', {
+	magicline_color: 'blue'
+});</pre>
+		</div>
+		<textarea cols="80" id="editor2" name="editor2" rows="10">
+			&lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
+				&lt;tbody&gt;
+					&lt;tr&gt;
+						&lt;td&gt;This table&lt;/td&gt;
+						&lt;td&gt;is the&lt;/td&gt;
+						&lt;td&gt;very first&lt;/td&gt;
+						&lt;td&gt;element of the document.&lt;/td&gt;
+					&lt;/tr&gt;
+					&lt;tr&gt;
+						&lt;td&gt;We are still&lt;/td&gt;
+						&lt;td&gt;able to acces&lt;/td&gt;
+						&lt;td&gt;the space before it.&lt;/td&gt;
+						&lt;td&gt;
+						&lt;table border=&quot;1&quot; cellpadding=&quot;1&quot; cellspacing=&quot;1&quot; style=&quot;width: 100%; &quot;&gt;
+							&lt;tbody&gt;
+								&lt;tr&gt;
+									&lt;td&gt;This table is inside of a cell of another table.&lt;/td&gt;
+								&lt;/tr&gt;
+								&lt;tr&gt;
+									&lt;td&gt;We can type&amp;nbsp;either before or after it though.&lt;/td&gt;
+								&lt;/tr&gt;
+							&lt;/tbody&gt;
+						&lt;/table&gt;
+						&lt;/td&gt;
+					&lt;/tr&gt;
+				&lt;/tbody&gt;
+			&lt;/table&gt;
+
+			&lt;p&gt;Two succesive horizontal lines (&lt;tt&gt;HR&lt;/tt&gt; tags). We can access the space in between:&lt;/p&gt;
+
+			&lt;hr /&gt;
+			&lt;hr /&gt;
+			&lt;ol&gt;
+				&lt;li&gt;This numbered list...&lt;/li&gt;
+				&lt;li&gt;...is a neighbour of a horizontal line...&lt;/li&gt;
+				&lt;li&gt;...and another list.&lt;/li&gt;
+			&lt;/ol&gt;
+
+			&lt;ul&gt;
+				&lt;li&gt;We can type between the lists...&lt;/li&gt;
+				&lt;li&gt;...thanks to &lt;strong&gt;Magicline&lt;/strong&gt;.&lt;/li&gt;
+			&lt;/ul&gt;
+
+			&lt;p&gt;Lorem ipsum dolor sit amet dui. Morbi vel turpis. Nullam et leo. Etiam rutrum, urna tellus dui vel tincidunt mattis egestas, justo fringilla vel, massa. Phasellus.&lt;/p&gt;
+
+			&lt;p&gt;Quisque iaculis, dui lectus varius vitae, tortor. Proin lacus. Pellentesque ac lacus. Aenean nonummy commodo nec, pede. Etiam blandit risus elit.&lt;/p&gt;
+
+			&lt;p&gt;Ut pretium. Vestibulum rutrum in, adipiscing elit. Sed in quam in purus sem vitae pede. Pellentesque bibendum, urna sem vel risus. Vivamus posuere metus. Aliquam gravida iaculis nisl. Nam enim. Aliquam erat ac lacus tellus ac felis.&lt;/p&gt;
+
+			&lt;div style=&quot;border: 2px dashed green; background: #ddd; text-align: center;&quot;&gt;
+			&lt;p&gt;This text is wrapped in a&amp;nbsp;&lt;tt&gt;DIV&lt;/tt&gt;&amp;nbsp;element. We can type after this element though.&lt;/p&gt;
+			&lt;/div&gt;
+		</textarea>
+		<script>
+
+			// This call can be placed at any point after the
+			// <textarea>, or inside a <head><script> in a
+			// window.onload event handler.
+
+			CKEDITOR.replace( 'editor2', {
+				extraPlugins: 'magicline',	// Ensure that magicline plugin, which is required for this sample, is loaded.
+				magicline_color: 'blue',	// Blue line
+				allowedContent: true		// Switch off the ACF, so very complex content created to
+											// show magicline's power isn't filtered.
+			});
+
+		</script>
+	</div>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/toolbar/toolbar.html b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/toolbar/toolbar.html
new file mode 100644
index 00000000..b762429b
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/toolbar/toolbar.html
@@ -0,0 +1,232 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>Toolbar Configuration &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<meta name="ckeditor-sample-name" content="Toolbar Configurations">
+	<meta name="ckeditor-sample-group" content="Advanced Samples">
+	<meta name="ckeditor-sample-description" content="Configuring CKEditor to display full or custom toolbar layout.">
+	<meta name="ckeditor-sample-isnew" content="1">
+	<script src="../../../ckeditor.js"></script>
+	<link href="../../../samples/sample.css" rel="stylesheet">
+</head>
+<body>
+	<h1 class="samples">
+		<a href="../../../samples/index.html">CKEditor Samples</a> &raquo; Toolbar Configuration
+	</h1>
+	<div class="description">
+		<p>
+			This sample page demonstrates editor with loaded <a href="#fullToolbar">full toolbar</a> (all registered buttons) and, if
+			current editor's configuration modifies default settings, also editor with <a href="#currentToolbar">modified toolbar</a>.
+		</p>
+
+		<p>Since CKEditor 4 there are two ways to configure toolbar buttons.</p>
+
+		<h2 class="samples">By <a href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-toolbar">config.toolbar</a></h2>
+
+		<p>
+			You can explicitly define which buttons are displayed in which groups and in which order.
+			This is the more precise setting, but less flexible. If newly added plugin adds its
+			own button you'll have to add it manually to your <code>config.toolbar</code> setting as well.
+		</p>
+
+		<p>To add a CKEditor instance with custom toolbar setting, insert the following JavaScript call to your code:</p>
+
+		<pre class="samples">
+CKEDITOR.replace( <em>'textarea_id'</em>, {
+	<strong>toolbar:</strong> [
+		{ name: 'document', items: [ 'Source', '-', 'NewPage', 'Preview', '-', 'Templates' ] },	// Defines toolbar group with name (used to create voice label) and items in 3 subgroups.
+		[ 'Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo' ],			// Defines toolbar group without name.
+		'/',																					// Line break - next group will be placed in new line.
+		{ name: 'basicstyles', items: [ 'Bold', 'Italic' ] }
+	]
+});</pre>
+
+		<h2 class="samples">By <a href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-toolbarGroups">config.toolbarGroups</a></h2>
+
+		<p>
+			You can define which groups of buttons (like e.g. <code>basicstyles</code>, <code>clipboard</code>
+			and <code>forms</code>) are displayed and in which order. Registered buttons are associated
+			with toolbar groups by <code>toolbar</code> property in their definition.
+			This setting's advantage is that you don't have to modify toolbar configuration
+			when adding/removing plugins which register their own buttons.
+		</p>
+
+		<p>To add a CKEditor instance with custom toolbar groups setting, insert the following JavaScript call to your code:</p>
+
+		<pre class="samples">
+CKEDITOR.replace( <em>'textarea_id'</em>, {
+	<strong>toolbarGroups:</strong> [
+		{ name: 'document',	   groups: [ 'mode', 'document' ] },			// Displays document group with its two subgroups.
+ 		{ name: 'clipboard',   groups: [ 'clipboard', 'undo' ] },			// Group's name will be used to create voice label.
+ 		'/',																// Line break - next group will be placed in new line.
+ 		{ name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
+ 		{ name: 'links' }
+	]
+
+	// NOTE: Remember to leave 'toolbar' property with the default value (null).
+});</pre>
+	</div>
+
+	<div id="currentToolbar" style="display: none">
+		<h2 class="samples">Current toolbar configuration</h2>
+		<p>Below you can see editor with current toolbar definition.</p>
+		<textarea cols="80" id="editorCurrent" name="editorCurrent" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+		<pre id="editorCurrentCfg" class="samples"></pre>
+	</div>
+
+	<div id="fullToolbar">
+		<h2 class="samples">Full toolbar configuration</h2>
+		<p>Below you can see editor with full toolbar, generated automatically by the editor.</p>
+		<p>
+			<strong>Note</strong>: To create editor instance with full toolbar you don't have to set anything.
+			Just leave <code>toolbar</code> and <code>toolbarGroups</code> with the default, <code>null</code> values.
+		</p>
+		<textarea cols="80" id="editorFull" name="editorFull" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+		<pre id="editorFullCfg" class="samples"></pre>
+	</div>
+
+	<script>
+
+(function() {
+	'use strict';
+
+	var buttonsNames;
+
+	CKEDITOR.config.extraPlugins = 'toolbar';
+
+	CKEDITOR.on( 'instanceReady', function( evt ) {
+		var editor = evt.editor,
+			editorCurrent = editor.name == 'editorCurrent',
+			defaultToolbar = !( editor.config.toolbar || editor.config.toolbarGroups ),
+			pre = CKEDITOR.document.getById( editor.name + 'Cfg' ),
+			output = '';
+
+		if ( editorCurrent ) {
+			// If default toolbar configuration has been modified, show "current toolbar" section.
+			if ( !defaultToolbar )
+				CKEDITOR.document.getById( 'currentToolbar' ).show();
+			else
+				return;
+		}
+
+		if ( !buttonsNames )
+			buttonsNames = createButtonsNamesHash( editor.ui.items );
+
+		// Toolbar isn't set explicitly, so it was created automatically from toolbarGroups.
+		if ( !editor.config.toolbar ) {
+			output +=
+				'// Toolbar configuration generated automatically by the editor based on config.toolbarGroups.\n' +
+				dumpToolbarConfiguration( editor ) +
+				'\n\n' +
+				'// Toolbar groups configuration.\n' +
+				dumpToolbarConfiguration( editor, true )
+		}
+		// Toolbar groups doesn't count in this case - print only toolbar.
+		else {
+			output += '// Toolbar configuration.\n' +
+				dumpToolbarConfiguration( editor );
+		}
+
+		// Recreate to avoid old IE from loosing whitespaces on filling <pre> content.
+		var preOutput = pre.getOuterHtml().replace( /(?=<\/)/, output );
+		CKEDITOR.dom.element.createFromHtml( preOutput ).replace( pre );
+	} );
+
+	CKEDITOR.replace( 'editorCurrent', { height: 100 } );
+	CKEDITOR.replace( 'editorFull', {
+		// Reset toolbar settings, so full toolbar will be generated automatically.
+		toolbar: null,
+		toolbarGroups: null,
+		height: 100
+	} );
+
+	function dumpToolbarConfiguration( editor, printGroups ) {
+		var output = [],
+			toolbar = editor.toolbar;
+
+		for ( var i = 0; i < toolbar.length; ++i ) {
+			var group = dumpToolbarGroup( toolbar[ i ], printGroups );
+			if ( group )
+				output.push( group );
+		}
+
+		return 'config.toolbar' + ( printGroups ? 'Groups' : '' ) + ' = [\n\t' + output.join( ',\n\t' ) + '\n];';
+	}
+
+	function dumpToolbarGroup( group, printGroups ) {
+		var output = [];
+
+		if ( typeof group == 'string' )
+			return '\'' + group + '\'';
+		if ( CKEDITOR.tools.isArray( group ) )
+			return dumpToolbarItems( group );
+		// Skip group when printing entire toolbar configuration and there are no items in this group.
+		if ( !printGroups && !group.items )
+			return;
+
+		if ( group.name )
+			output.push( 'name: \'' + group.name + '\'' );
+
+		if ( group.groups )
+			output.push( 'groups: ' + dumpToolbarItems( group.groups ) );
+
+		if ( !printGroups )
+			output.push( 'items: ' + dumpToolbarItems( group.items ) );
+
+		return '{ ' + output.join( ', ' ) + ' }';
+	}
+
+	function dumpToolbarItems( items ) {
+		if ( typeof items == 'string' )
+			return '\'' + items + '\'';
+
+		var names = [],
+			i, item;
+
+		for ( var i = 0; i < items.length; ++i ) {
+			item = items[ i ];
+			if ( typeof item == 'string' )
+				names.push( item );
+			else {
+				if ( item.type == CKEDITOR.UI_SEPARATOR )
+					names.push( '-' );
+				else
+					names.push( buttonsNames[ item.name ] );
+			}
+		}
+
+		return '[ \'' + names.join( '\', \'' ) + '\' ]';
+	}
+
+	// Creates { 'lowercased': 'LowerCased' } buttons names hash.
+	function createButtonsNamesHash( items ) {
+		var hash = {},
+			name;
+
+		for ( name in items ) {
+			hash[ items[ name ].name ] = name;
+		}
+
+		return hash;
+	}
+
+})();
+	</script>
+
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/wysiwygarea/fullpage.html b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/wysiwygarea/fullpage.html
new file mode 100644
index 00000000..0f1703a0
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/plugins/wysiwygarea/fullpage.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>Full Page Editing &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../../../ckeditor.js"></script>
+	<script src="../../../samples/sample.js"></script>
+	<link rel="stylesheet" href="../../../samples/sample.css">
+	<meta name="ckeditor-sample-required-plugins" content="sourcearea">
+	<meta name="ckeditor-sample-name" content="Full page support">
+	<meta name="ckeditor-sample-group" content="Plugins">
+	<meta name="ckeditor-sample-description" content="CKEditor inserted with a JavaScript call and used to edit the whole page from &lt;html&gt; to &lt;/html&gt;.">
+</head>
+<body>
+	<h1 class="samples">
+		<a href="../../../samples/index.html">CKEditor Samples</a> &raquo; Full Page Editing
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows how to configure CKEditor to edit entire HTML pages, from the
+			<code>&lt;html&gt;</code> tag to the <code>&lt;/html&gt;</code> tag.
+		</p>
+		<p>
+			The CKEditor instance below is inserted with a JavaScript call using the following code:
+		</p>
+<pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+	<strong>fullPage: true</strong>,
+	<strong>allowedContent: true</strong>
+});
+</pre>
+		<p>
+			Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
+			the <code>&lt;textarea&gt;</code> element to be replaced.
+		</p>
+		<p>
+			The <code><em>allowedContent</em></code> in the code above is set to <code>true</code> to disable content filtering.
+			Setting this option is not obligatory, but in full page mode there is a strong chance that one may want be able to freely enter any HTML content in source mode without any limitations.
+		</p>
+	</div>
+	<form action="../../../samples/sample_posteddata.php" method="post">
+		<label for="editor1">
+			CKEditor output the entire page including content outside of
+			<code>&lt;body&gt;</code> element, so content like meta and title can be changed:
+		</label>
+		<textarea cols="80" id="editor1" name="editor1" rows="10">
+			&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; align=&quot;right&quot; src=&quot;../../../samples/assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+		</textarea>
+		<script>
+
+			CKEDITOR.replace( 'editor1', {
+				fullPage: true,
+				allowedContent: true,
+				extraPlugins: 'wysiwygarea'
+			});
+
+		</script>
+		<p>
+			<input type="submit" value="Submit">
+		</p>
+	</form>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/readonly.html b/htmltest/sites/all/libraries/ckeditor-version/samples/readonly.html
new file mode 100644
index 00000000..abe8367d
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/readonly.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>Using the CKEditor Read-Only API &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../ckeditor.js"></script>
+	<link rel="stylesheet" href="sample.css">
+	<script>
+
+		var editor;
+
+		// The instanceReady event is fired, when an instance of CKEditor has finished
+		// its initialization.
+		CKEDITOR.on( 'instanceReady', function( ev ) {
+			editor = ev.editor;
+
+			// Show this "on" button.
+			document.getElementById( 'readOnlyOn' ).style.display = '';
+
+			// Event fired when the readOnly property changes.
+			editor.on( 'readOnly', function() {
+				document.getElementById( 'readOnlyOn' ).style.display = this.readOnly ? 'none' : '';
+				document.getElementById( 'readOnlyOff' ).style.display = this.readOnly ? '' : 'none';
+			});
+		});
+
+		function toggleReadOnly( isReadOnly ) {
+			// Change the read-only state of the editor.
+			// http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setReadOnly
+			editor.setReadOnly( isReadOnly );
+		}
+
+	</script>
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html">CKEditor Samples</a> &raquo; Using the CKEditor Read-Only API
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows how to use the
+			<code><a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setReadOnly">setReadOnly</a></code>
+			API to put editor into the read-only state that makes it impossible for users to change the editor contents.
+		</p>
+		<p>
+			For details on how to create this setup check the source code of this sample page.
+		</p>
+	</div>
+	<form action="sample_posteddata.php" method="post">
+		<p>
+			<textarea class="ckeditor" id="editor1" name="editor1" cols="100" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+		</p>
+		<p>
+			<input id="readOnlyOn" onclick="toggleReadOnly();" type="button" value="Make it read-only" style="display:none">
+			<input id="readOnlyOff" onclick="toggleReadOnly( false );" type="button" value="Make it editable again" style="display:none">
+		</p>
+	</form>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/replacebyclass.html b/htmltest/sites/all/libraries/ckeditor-version/samples/replacebyclass.html
new file mode 100644
index 00000000..b793edb2
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/replacebyclass.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>Replace Textareas by Class Name &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../ckeditor.js"></script>
+	<link rel="stylesheet" href="sample.css">
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html">CKEditor Samples</a> &raquo; Replace Textarea Elements by Class Name
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows how to automatically replace all <code>&lt;textarea&gt;</code> elements
+			of a given class with a CKEditor instance.
+		</p>
+		<p>
+			To replace a <code>&lt;textarea&gt;</code> element, simply assign it the <code>ckeditor</code>
+			class, as in the code below:
+		</p>
+<pre class="samples">
+&lt;textarea <strong>class="ckeditor</strong>" name="editor1"&gt;&lt;/textarea&gt;
+</pre>
+		<p>
+			Note that other <code>&lt;textarea&gt;</code> attributes (like <code>id</code> or <code>name</code>) need to be adjusted to your document.
+		</p>
+	</div>
+	<form action="sample_posteddata.php" method="post">
+		<p>
+			<label for="editor1">
+				Editor 1:
+			</label>
+			<textarea class="ckeditor" cols="80" id="editor1" name="editor1" rows="10">
+				&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+			</textarea>
+		</p>
+		<p>
+			<input type="submit" value="Submit">
+		</p>
+	</form>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/replacebycode.html b/htmltest/sites/all/libraries/ckeditor-version/samples/replacebycode.html
new file mode 100644
index 00000000..046cb635
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/replacebycode.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>Replace Textarea by Code &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../ckeditor.js"></script>
+	<link href="sample.css" rel="stylesheet">
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html">CKEditor Samples</a> &raquo; Replace Textarea Elements Using JavaScript Code
+	</h1>
+	<form action="sample_posteddata.php" method="post">
+		<div class="description">
+			<p>
+				This editor is using an <code>&lt;iframe&gt;</code> element-based editing area, provided by the <strong>Wysiwygarea</strong> plugin.
+			</p>
+<pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>' )
+</pre>
+		</div>
+		<textarea cols="80" id="editor1" name="editor1" rows="10">
+			&lt;h1&gt;&lt;img alt=&quot;Saturn V carrying Apollo 11&quot; class=&quot;right&quot; src=&quot;assets/sample.jpg&quot;/&gt; Apollo 11&lt;/h1&gt; &lt;p&gt;&lt;b&gt;Apollo 11&lt;/b&gt; was the spaceflight that landed the first humans, Americans &lt;a href=&quot;http://en.wikipedia.org/wiki/Neil_Armstrong&quot; title=&quot;Neil Armstrong&quot;&gt;Neil Armstrong&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Buzz_Aldrin&quot; title=&quot;Buzz Aldrin&quot;&gt;Buzz Aldrin&lt;/a&gt;, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.&lt;/p&gt; &lt;p&gt;Armstrong spent about &lt;s&gt;three and a half&lt;/s&gt; two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5&amp;nbsp;kg) of lunar material for return to Earth. A third member of the mission, &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Collins_(astronaut)&quot; title=&quot;Michael Collins (astronaut)&quot;&gt;Michael Collins&lt;/a&gt;, piloted the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Command/Service_Module&quot; title=&quot;Apollo Command/Service Module&quot;&gt;command&lt;/a&gt; spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.&lt;/p&gt; &lt;h2&gt;Broadcasting and &lt;em&gt;quotes&lt;/em&gt; &lt;a id=&quot;quotes&quot; name=&quot;quotes&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;One small step for [a] man, one giant leap for mankind.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Apollo 11 effectively ended the &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Race&quot; title=&quot;Space Race&quot;&gt;Space Race&lt;/a&gt; and fulfilled a national goal proposed in 1961 by the late U.S. President &lt;a href=&quot;http://en.wikipedia.org/wiki/John_F._Kennedy&quot; title=&quot;John F. Kennedy&quot;&gt;John F. Kennedy&lt;/a&gt; in a speech before the United States Congress:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.&lt;/p&gt;&lt;/blockquote&gt; &lt;h2&gt;Technical details &lt;a id=&quot;tech-details&quot; name=&quot;tech-details&quot;&gt;&lt;/a&gt;&lt;/h2&gt; &lt;table align=&quot;right&quot; border=&quot;1&quot; bordercolor=&quot;#ccc&quot; cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; style=&quot;border-collapse:collapse;margin:10px 0 10px 15px;&quot;&gt; &lt;caption&gt;&lt;strong&gt;Mission crew&lt;/strong&gt;&lt;/caption&gt; &lt;thead&gt; &lt;tr&gt; &lt;th scope=&quot;col&quot;&gt;Position&lt;/th&gt; &lt;th scope=&quot;col&quot;&gt;Astronaut&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Commander&lt;/td&gt; &lt;td&gt;Neil A. Armstrong&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Command Module Pilot&lt;/td&gt; &lt;td&gt;Michael Collins&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Lunar Module Pilot&lt;/td&gt; &lt;td&gt;Edwin &amp;quot;Buzz&amp;quot; E. Aldrin, Jr.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Launched by a &lt;strong&gt;Saturn V&lt;/strong&gt; rocket from &lt;a href=&quot;http://en.wikipedia.org/wiki/Kennedy_Space_Center&quot; title=&quot;Kennedy Space Center&quot;&gt;Kennedy Space Center&lt;/a&gt; in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of &lt;a href=&quot;http://en.wikipedia.org/wiki/NASA&quot; title=&quot;NASA&quot;&gt;NASA&lt;/a&gt;&amp;#39;s Apollo program. The Apollo spacecraft had three parts:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Command Module&lt;/strong&gt; with a cabin for the three astronauts which was the only part which landed back on Earth&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Service Module&lt;/strong&gt; which supported the Command Module with propulsion, electrical power, oxygen and water&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Lunar Module&lt;/strong&gt; for landing on the Moon.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;After being sent to the Moon by the Saturn V&amp;#39;s upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mare_Tranquillitatis&quot; title=&quot;Mare Tranquillitatis&quot;&gt;Sea of Tranquility&lt;/a&gt;. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pacific_Ocean&quot; title=&quot;Pacific Ocean&quot;&gt;Pacific Ocean&lt;/a&gt; on July 24.&lt;/p&gt; &lt;hr/&gt; &lt;p style=&quot;text-align: right;&quot;&gt;&lt;small&gt;Source: &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_11&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
+		</textarea>
+		<script>
+
+			// This call can be placed at any point after the
+			// <textarea>, or inside a <head><script> in a
+			// window.onload event handler.
+
+			// Replace the <textarea id="editor"> with an CKEditor
+			// instance, using default configurations.
+
+			CKEDITOR.replace( 'editor1' );
+
+		</script>
+		<p>
+			<input type="submit" value="Submit">
+		</p>
+	</form>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/sample.css b/htmltest/sites/all/libraries/ckeditor-version/samples/sample.css
new file mode 100644
index 00000000..7ffae783
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/sample.css
@@ -0,0 +1,339 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+
+html, body, h1, h2, h3, h4, h5, h6, div, span, blockquote, p, address, form, fieldset, img, ul, ol, dl, dt, dd, li, hr, table, td, th, strong, em, sup, sub, dfn, ins, del, q, cite, var, samp, code, kbd, tt, pre
+{
+	line-height: 1.5em;
+}
+
+body
+{
+	padding: 10px 30px;
+}
+
+input, textarea, select, option, optgroup, button, td, th
+{
+	font-size: 100%;
+}
+
+pre, code, kbd, samp, tt
+{
+	font-family: monospace,monospace;
+	font-size: 1em;
+}
+
+body {
+    width: 960px;
+    margin: 0 auto;
+}
+
+code
+{
+	background: #f3f3f3;
+	border: 1px solid #ddd;
+	padding: 1px 4px;
+
+	-moz-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+}
+
+abbr
+{
+	border-bottom: 1px dotted #555;
+	cursor: pointer;
+}
+
+.new
+{
+	background: #FF7E00;
+	border: 1px solid #DA8028;
+	color: #fff;
+	font-size: 10px;
+	font-weight: bold;
+	padding: 1px 4px;
+	text-shadow: 0 1px 0 #C97626;
+	text-transform: uppercase;
+	margin: 0 0 0 3px;
+
+	-moz-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+
+	-moz-box-shadow: 0 2px 3px 0 #FFA54E inset;
+	-webkit-box-shadow: 0 2px 3px 0 #FFA54E inset;
+	box-shadow: 0 2px 3px 0 #FFA54E inset;
+}
+
+h1.samples
+{
+	color: #0782C1;
+	font-size: 200%;
+	font-weight: normal;
+	margin: 0;
+	padding: 0;
+}
+
+h1.samples a
+{
+	color: #0782C1;
+	text-decoration: none;
+	border-bottom: 1px dotted #0782C1;
+}
+
+.samples a:hover
+{
+	border-bottom: 1px dotted #0782C1;
+}
+
+h2.samples
+{
+	color: #000000;
+	font-size: 130%;
+	margin: 15px 0 0 0;
+	padding: 0;
+}
+
+p, blockquote, address, form, pre, dl, h1.samples, h2.samples
+{
+	margin-bottom: 15px;
+}
+
+ul.samples
+{
+	margin-bottom: 15px;
+}
+
+.clear
+{
+	clear: both;
+}
+
+fieldset
+{
+	margin: 0;
+	padding: 10px;
+}
+
+body, input, textarea
+{
+	color: #333333;
+	font-family: Arial, Helvetica, sans-serif;
+}
+
+body
+{
+	font-size: 75%;
+}
+
+a.samples
+{
+	color: #189DE1;
+	text-decoration: none;
+}
+
+form
+{
+	margin: 0;
+	padding: 0;
+}
+
+pre.samples
+{
+	background-color: #F7F7F7;
+	border: 1px solid #D7D7D7;
+	overflow: auto;
+	padding: 0.25em;
+	white-space: pre-wrap; /* CSS 2.1 */
+	word-wrap: break-word; /* IE7 */
+	-moz-tab-size: 4;
+	-o-tab-size: 4;
+	-webkit-tab-size: 4;
+	tab-size: 4;
+}
+
+#footer
+{
+	clear: both;
+	padding-top: 10px;
+}
+
+#footer hr
+{
+	margin: 10px 0 15px 0;
+	height: 1px;
+	border: solid 1px gray;
+	border-bottom: none;
+}
+
+#footer p
+{
+	margin: 0 10px 10px 10px;
+	float: left;
+}
+
+#footer #copy
+{
+	float: right;
+}
+
+#outputSample
+{
+	width: 100%;
+	table-layout: fixed;
+}
+
+#outputSample thead th
+{
+	color: #dddddd;
+	background-color: #999999;
+	padding: 4px;
+	white-space: nowrap;
+}
+
+#outputSample tbody th
+{
+	vertical-align: top;
+	text-align: left;
+}
+
+#outputSample pre
+{
+	margin: 0;
+	padding: 0;
+}
+
+.description
+{
+	border: 1px dotted #B7B7B7;
+	margin-bottom: 10px;
+	padding: 10px 10px 0;
+	overflow: hidden;
+}
+
+label
+{
+	display: block;
+	margin-bottom: 6px;
+}
+
+/**
+ *	CKEditor editables are automatically set with the "cke_editable" class
+ *	plus cke_editable_(inline|themed) depending on the editor type.
+ */
+
+/* Style a bit the inline editables. */
+.cke_editable.cke_editable_inline
+{
+	cursor: pointer;
+}
+
+/* Once an editable element gets focused, the "cke_focus" class is
+   added to it, so we can style it differently. */
+.cke_editable.cke_editable_inline.cke_focus
+{
+	box-shadow: inset 0px 0px 20px 3px #ddd, inset 0 0 1px #000;
+	outline: none;
+	background: #eee;
+	cursor: text;
+}
+
+/* Avoid pre-formatted overflows inline editable. */
+.cke_editable_inline pre
+{
+	white-space: pre-wrap;
+	word-wrap: break-word;
+}
+
+/**
+ *	Samples index styles.
+ */
+
+.twoColumns,
+.twoColumnsLeft,
+.twoColumnsRight
+{
+	overflow: hidden;
+}
+
+.twoColumnsLeft,
+.twoColumnsRight
+{
+	width: 45%;
+}
+
+.twoColumnsLeft
+{
+	float: left;
+}
+
+.twoColumnsRight
+{
+	float: right;
+}
+
+dl.samples
+{
+	padding: 0 0 0 40px;
+}
+dl.samples > dt
+{
+	display: list-item;
+	list-style-type: disc;
+	list-style-position: outside;
+	margin: 0 0 3px;
+}
+dl.samples > dd
+{
+	margin: 0 0 3px;
+}
+.warning
+{
+    color: #ff0000;
+	background-color: #FFCCBA;
+    border: 2px dotted #ff0000;
+	padding: 15px 10px;
+	margin: 10px 0;
+}
+
+/* Used on inline samples */
+
+blockquote
+{
+	font-style: italic;
+	font-family: Georgia, Times, "Times New Roman", serif;
+	padding: 2px 0;
+	border-style: solid;
+	border-color: #ccc;
+	border-width: 0;
+}
+
+.cke_contents_ltr blockquote
+{
+	padding-left: 20px;
+	padding-right: 8px;
+	border-left-width: 5px;
+}
+
+.cke_contents_rtl blockquote
+{
+	padding-left: 8px;
+	padding-right: 20px;
+	border-right-width: 5px;
+}
+
+img.right {
+    border: 1px solid #ccc;
+    float: right;
+    margin-left: 15px;
+    padding: 5px;
+}
+
+img.left {
+    border: 1px solid #ccc;
+    float: left;
+    margin-right: 15px;
+    padding: 5px;
+}
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/sample.js b/htmltest/sites/all/libraries/ckeditor-version/samples/sample.js
new file mode 100644
index 00000000..267998c1
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/sample.js
@@ -0,0 +1,33 @@
+﻿/**
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or http://ckeditor.com/license
+ */
+
+// Tool scripts for the sample pages.
+// This file can be ignored and is not required to make use of CKEditor.
+
+(function() {
+	// Check for sample compliance.
+	CKEDITOR.on( 'instanceReady', function( ev ) {
+		var editor = ev.editor,
+			meta = CKEDITOR.document.$.getElementsByName( 'ckeditor-sample-required-plugins' ),
+			requires = meta.length ? CKEDITOR.dom.element.get( meta[ 0 ] ).getAttribute( 'content' ).split( ',' ) : [],
+			missing = [];
+
+		if ( requires.length ) {
+			for ( var i = 0; i < requires.length; i++ ) {
+				if ( !editor.plugins[ requires[ i ] ] )
+					missing.push( '<code>' + requires[ i ] + '</code>' );
+			}
+
+			if ( missing.length ) {
+				var warn = CKEDITOR.dom.element.createFromHtml(
+					'<div class="warning">' +
+						'<span>To fully experience this demo, the ' + missing.join( ', ' ) + ' plugin' + ( missing.length > 1 ? 's are' : ' is' ) + ' required.</span>' +
+					'</div>'
+				);
+				warn.insertBefore( editor.container );
+			}
+		}
+	});
+})();
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/sample_posteddata.php b/htmltest/sites/all/libraries/ckeditor-version/samples/sample_posteddata.php
new file mode 100644
index 00000000..bf6ac224
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/sample_posteddata.php
@@ -0,0 +1,16 @@
+<?php /* <body><pre>
+
+-------------------------------------------------------------------------------------------
+  CKEditor - Posted Data
+
+  We are sorry, but your Web server does not support the PHP language used in this script.
+
+  Please note that CKEditor can be used with any other server-side language than just PHP.
+  To save the content created with CKEditor you need to read the POST data on the server
+  side and write it to a file or the database.
+
+  Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+  For licensing, see LICENSE.md or <a href="http://ckeditor.com/license">http://ckeditor.com/license</a>
+-------------------------------------------------------------------------------------------
+
+</pre><div style="display:none"></body> */ include "assets/posteddata.php"; ?>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/tabindex.html b/htmltest/sites/all/libraries/ckeditor-version/samples/tabindex.html
new file mode 100644
index 00000000..11c14522
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/tabindex.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>TAB Key-Based Navigation &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../ckeditor.js"></script>
+	<link href="sample.css" rel="stylesheet">
+	<style>
+
+		.cke_focused,
+		.cke_editable.cke_focused
+		{
+			outline: 3px dotted blue !important;
+			*border: 3px dotted blue !important;	/* For IE7 */
+		}
+
+	</style>
+	<script>
+
+		CKEDITOR.on( 'instanceReady', function( evt ) {
+			var editor = evt.editor;
+			editor.setData( 'This editor has it\'s tabIndex set to <strong>' + editor.tabIndex + '</strong>' );
+
+			// Apply focus class name.
+			editor.on( 'focus', function() {
+				editor.container.addClass( 'cke_focused' );
+			});
+			editor.on( 'blur', function() {
+				editor.container.removeClass( 'cke_focused' );
+			});
+
+			// Put startup focus on the first editor in tab order.
+			if ( editor.tabIndex == 1 )
+				editor.focus();
+		});
+
+	</script>
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html">CKEditor Samples</a> &raquo; TAB Key-Based Navigation
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows how tab key navigation among editor instances is
+			affected by the <code>tabIndex</code> attribute from
+			the original page element. Use TAB key to move between the editors.
+		</p>
+	</div>
+	<p>
+		<textarea class="ckeditor" cols="80" id="editor4" rows="10" tabindex="1"></textarea>
+	</p>
+	<div class="ckeditor" contenteditable="true" id="editor1" tabindex="4"></div>
+	<p>
+		<textarea class="ckeditor" cols="80" id="editor2" rows="10" tabindex="2"></textarea>
+	</p>
+	<p>
+		<textarea class="ckeditor" cols="80" id="editor3" rows="10" tabindex="3"></textarea>
+	</p>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/uicolor.html b/htmltest/sites/all/libraries/ckeditor-version/samples/uicolor.html
new file mode 100644
index 00000000..cb613111
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/uicolor.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>UI Color Picker &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../ckeditor.js"></script>
+	<link rel="stylesheet" href="sample.css">
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html">CKEditor Samples</a> &raquo; UI Color
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows how to automatically replace <code>&lt;textarea&gt;</code> elements
+			with a CKEditor instance with an option to change the color of its user interface.<br>
+			<strong>Note:</strong>The UI skin color feature depends on the CKEditor skin
+			compatibility. The Moono and Kama skins are examples of skins that work with it.
+		</p>
+	</div>
+	<form action="sample_posteddata.php" method="post">
+	<p>
+		This editor instance has a UI color value defined in configuration to change the skin color,
+		To specify the color of the user interface, set the <code>uiColor</code> property:
+	</p>
+	<pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+	<strong>uiColor: '#14B8C4'</strong>
+});</pre>
+	<p>
+		Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
+		the <code>&lt;textarea&gt;</code> element to be replaced.
+	</p>
+	<p>
+		<textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+		<script>
+
+			// Replace the <textarea id="editor"> with an CKEditor
+			// instance, using default configurations.
+			CKEDITOR.replace( 'editor1', {
+				uiColor: '#14B8C4',
+				toolbar: [
+					[ 'Bold', 'Italic', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink' ],
+					[ 'FontSize', 'TextColor', 'BGColor' ]
+				]
+			});
+
+		</script>
+	</p>
+	<p>
+		<input type="submit" value="Submit">
+	</p>
+	</form>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/uilanguages.html b/htmltest/sites/all/libraries/ckeditor-version/samples/uilanguages.html
new file mode 100644
index 00000000..888242ef
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/uilanguages.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>User Interface Globalization &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<script src="../ckeditor.js"></script>
+	<script src="assets/uilanguages/languages.js"></script>
+	<link rel="stylesheet" href="sample.css">
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html">CKEditor Samples</a> &raquo; User Interface Languages
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows how to automatically replace <code>&lt;textarea&gt;</code> elements
+			with a CKEditor instance with an option to change the language of its user interface.
+		</p>
+		<p>
+			It pulls the language list from CKEditor <code>_languages.js</code> file that contains the list of supported languages and creates
+			a drop-down list that lets the user change the UI language.
+		</p>
+		<p>
+			By default, CKEditor automatically localizes the editor to the language of the user.
+			The UI language can be controlled with two configuration options:
+			<code><a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-language">language</a></code> and
+			<code><a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-defaultLanguage">
+			defaultLanguage</a></code>. The <code>defaultLanguage</code> setting specifies the
+			default CKEditor language to be used when a localization suitable for user's settings is not available.
+		</p>
+		<p>
+			To specify the user interface language that will be used no matter what language is
+			specified in user's browser or operating system, set the <code>language</code> property:
+		</p>
+<pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+	// Load the German interface.
+	<strong>language: 'de'</strong>
+});</pre>
+		<p>
+			Note that <code><em>textarea_id</em></code> in the code above is the <code>id</code> attribute of
+			the <code>&lt;textarea&gt;</code> element to be replaced.
+		</p>
+	</div>
+	<form action="sample_posteddata.php" method="post">
+		<p>
+			Available languages (<span id="count"> </span> languages!):<br>
+			<script>
+
+				document.write( '<select disabled="disabled" id="languages" onchange="createEditor( this.value );">' );
+
+				// Get the language list from the _languages.js file.
+				for ( var i = 0 ; i < window.CKEDITOR_LANGS.length ; i++ ) {
+					document.write(
+						'<option value="' + window.CKEDITOR_LANGS[i].code + '">' +
+							window.CKEDITOR_LANGS[i].name +
+						'</option>' );
+				}
+
+				document.write( '</select>' );
+
+			</script>
+			<br>
+			<span style="color: #888888">
+				(You may see strange characters if your system does not support the selected language)
+			</span>
+		</p>
+		<p>
+			<textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+			<script>
+
+				// Set the number of languages.
+				document.getElementById( 'count' ).innerHTML = window.CKEDITOR_LANGS.length;
+
+				var editor;
+
+				function createEditor( languageCode ) {
+					if ( editor )
+						editor.destroy();
+
+					// Replace the <textarea id="editor"> with an CKEditor
+					// instance, using default configurations.
+					editor = CKEDITOR.replace( 'editor1', {
+						language: languageCode,
+
+						on: {
+							instanceReady: function() {
+								// Wait for the editor to be ready to set
+								// the language combo.
+								var languages = document.getElementById( 'languages' );
+								languages.value = this.langCode;
+								languages.disabled = false;
+							}
+						}
+					});
+				}
+
+				// At page startup, load the default language:
+				createEditor( '' );
+
+			</script>
+		</p>
+	</form>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/samples/xhtmlstyle.html b/htmltest/sites/all/libraries/ckeditor-version/samples/xhtmlstyle.html
new file mode 100644
index 00000000..cde2878f
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/samples/xhtmlstyle.html
@@ -0,0 +1,231 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+	<title>XHTML Compliant Output &mdash; CKEditor Sample</title>
+	<meta charset="utf-8">
+	<meta name="ckeditor-sample-required-plugins" content="sourcearea">
+	<script src="../ckeditor.js"></script>
+	<script src="../samples/sample.js"></script>
+	<link href="sample.css" rel="stylesheet">
+</head>
+<body>
+	<h1 class="samples">
+		<a href="index.html">CKEditor Samples</a> &raquo; Producing XHTML Compliant Output
+	</h1>
+	<div class="description">
+		<p>
+			This sample shows how to configure CKEditor to output valid
+			<a class="samples" href="http://www.w3.org/TR/xhtml11/">XHTML 1.1</a> code.
+			Deprecated elements (<code>&lt;font&gt;</code>, <code>&lt;u&gt;</code>) or attributes
+			(<code>size</code>, <code>face</code>) will be replaced with XHTML compliant code.
+		</p>
+		<p>
+			To add a CKEditor instance outputting valid XHTML code, load the editor using a standard
+			JavaScript call and define CKEditor features to use the XHTML compliant elements and styles.
+		</p>
+		<p>
+			A snippet of the configuration code can be seen below; check the source of this page for
+			full definition:
+		</p>
+<pre class="samples">
+CKEDITOR.replace( '<em>textarea_id</em>', {
+	contentsCss: 'assets/outputxhtml.css',
+
+	coreStyles_bold: {
+		element: 'span',
+		attributes: { 'class': 'Bold' }
+	},
+	coreStyles_italic: {
+		element: 'span',
+		attributes: { 'class': 'Italic' }
+	},
+
+	...
+});</pre>
+	</div>
+	<form action="sample_posteddata.php" method="post">
+		<p>
+			<label for="editor1">
+				Editor 1:
+			</label>
+			<textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;span class="Bold"&gt;sample text&lt;/span&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+			<script>
+
+				CKEDITOR.replace( 'editor1', {
+					/*
+					 * Style sheet for the contents
+					 */
+					contentsCss: 'assets/outputxhtml/outputxhtml.css',
+
+					/*
+					 * Special allowed content rules for spans used by
+					 * font face, size, and color buttons.
+					 *
+					 * Note: all rules have been written separately so
+					 * it was possible to specify required classes.
+					 */
+					extraAllowedContent: 'span(!FontColor1);span(!FontColor2);span(!FontColor3);' +
+						'span(!FontColor1BG);span(!FontColor2BG);span(!FontColor3BG);' +
+						'span(!FontComic);span(!FontCourier);span(!FontTimes);' +
+						'span(!FontSmaller);span(!FontLarger);span(!FontSmall);span(!FontBig);span(!FontDouble)',
+
+					/*
+					 * Core styles.
+					 */
+					coreStyles_bold: {
+						element: 'span',
+						attributes: { 'class': 'Bold' }
+					},
+					coreStyles_italic: {
+						element: 'span',
+						attributes: { 'class': 'Italic' }
+					},
+					coreStyles_underline: {
+						element: 'span',
+						attributes: { 'class': 'Underline' }
+					},
+					coreStyles_strike: {
+						element: 'span',
+						attributes: { 'class': 'StrikeThrough' },
+						overrides: 'strike'
+					},
+					coreStyles_subscript: {
+						element: 'span',
+						attributes: { 'class': 'Subscript' },
+						overrides: 'sub'
+					},
+					coreStyles_superscript: {
+						element: 'span',
+						attributes: { 'class': 'Superscript' },
+						overrides: 'sup'
+					},
+
+					/*
+					 * Font face.
+					 */
+
+					// List of fonts available in the toolbar combo. Each font definition is
+					// separated by a semi-colon (;). We are using class names here, so each font
+					// is defined by {Combo Label}/{Class Name}.
+					font_names: 'Comic Sans MS/FontComic;Courier New/FontCourier;Times New Roman/FontTimes',
+
+					// Define the way font elements will be applied to the document. The "span"
+					// element will be used. When a font is selected, the font name defined in the
+					// above list is passed to this definition with the name "Font", being it
+					// injected in the "class" attribute.
+					// We must also instruct the editor to replace span elements that are used to
+					// set the font (Overrides).
+					font_style: {
+						element: 'span',
+						attributes: { 'class': '#(family)' },
+						overrides: [
+							{
+								element: 'span',
+								attributes: {
+									'class': /^Font(?:Comic|Courier|Times)$/
+								}
+							}
+						]
+					},
+
+					/*
+					 * Font sizes.
+					 */
+					fontSize_sizes: 'Smaller/FontSmaller;Larger/FontLarger;8pt/FontSmall;14pt/FontBig;Double Size/FontDouble',
+					fontSize_style: {
+						element: 'span',
+						attributes: { 'class': '#(size)' },
+						overrides: [
+							{
+								element: 'span',
+								attributes: {
+									'class': /^Font(?:Smaller|Larger|Small|Big|Double)$/
+								}
+							}
+						]
+					} ,
+
+					/*
+					 * Font colors.
+					 */
+					colorButton_enableMore: false,
+
+					colorButton_colors: 'FontColor1/FF9900,FontColor2/0066CC,FontColor3/F00',
+					colorButton_foreStyle: {
+						element: 'span',
+						attributes: { 'class': '#(color)' },
+						overrides: [
+							{
+								element: 'span',
+								attributes: {
+									'class': /^FontColor(?:1|2|3)$/
+								}
+							}
+						]
+					},
+
+					colorButton_backStyle: {
+						element: 'span',
+						attributes: { 'class': '#(color)BG' },
+						overrides: [
+							{
+								element: 'span',
+								attributes: {
+									'class': /^FontColor(?:1|2|3)BG$/
+								}
+							}
+						]
+					},
+
+					/*
+					 * Indentation.
+					 */
+					indentClasses: [ 'Indent1', 'Indent2', 'Indent3' ],
+
+					/*
+					 * Paragraph justification.
+					 */
+					justifyClasses: [ 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyFull' ],
+
+					/*
+					 * Styles combo.
+					 */
+					stylesSet: [
+						{ name: 'Strong Emphasis', element: 'strong' },
+						{ name: 'Emphasis', element: 'em' },
+
+						{ name: 'Computer Code', element: 'code' },
+						{ name: 'Keyboard Phrase', element: 'kbd' },
+						{ name: 'Sample Text', element: 'samp' },
+						{ name: 'Variable', element: 'var' },
+
+						{ name: 'Deleted Text', element: 'del' },
+						{ name: 'Inserted Text', element: 'ins' },
+
+						{ name: 'Cited Work', element: 'cite' },
+						{ name: 'Inline Quotation', element: 'q' }
+					]
+				});
+
+			</script>
+		</p>
+		<p>
+			<input type="submit" value="Submit">
+		</p>
+	</form>
+	<div id="footer">
+		<hr>
+		<p>
+			CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2013, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog.css b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog.css
new file mode 100644
index 00000000..959d4387
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_ie.css b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_ie.css
new file mode 100644
index 00000000..5aec3564
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_ie.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_ie7.css b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_ie7.css
new file mode 100644
index 00000000..e2ec66ee
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_ie7.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_title{zoom:1}.cke_dialog_footer{border-top:1px solid #bfbfbf}.cke_dialog_footer_buttons{position:static}.cke_dialog_footer_buttons a.cke_dialog_ui_button{vertical-align:top}.cke_dialog .cke_resizer_ltr{padding-left:4px}.cke_dialog .cke_resizer_rtl{padding-right:4px}.cke_dialog_ui_input_text,.cke_dialog_ui_input_password,.cke_dialog_ui_input_textarea,.cke_dialog_ui_input_select{padding:0!important}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid transparent!important}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_ie8.css b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_ie8.css
new file mode 100644
index 00000000..9d4e4225
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_ie8.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{display:block}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_iequirks.css b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_iequirks.css
new file mode 100644
index 00000000..c6ec3ca1
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_iequirks.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:""}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_opera.css b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_opera.css
new file mode 100644
index 00000000..8e76ec1f
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/dialog_opera.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_footer{display:block;height:38px}.cke_ltr .cke_dialog_footer>*{float:right}.cke_rtl .cke_dialog_footer>*{float:left}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor.css b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor.css
new file mode 100644
index 00000000..d4cde55b
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_gecko.css b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_gecko.css
new file mode 100644
index 00000000..00c2d044
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_gecko.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_ie.css b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_ie.css
new file mode 100644
index 00000000..aa33d5f5
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_ie.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_ie7.css b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_ie7.css
new file mode 100644
index 00000000..d3ffd1f4
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_ie7.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_toolbox{display:inline-block;padding-bottom:5px;height:100%}.cke_rtl .cke_toolbox{padding-bottom:0}.cke_toolbar{margin-bottom:5px}.cke_rtl .cke_toolbar{margin-bottom:0}.cke_toolgroup{height:26px}.cke_toolgroup,.cke_combo{position:relative}a.cke_button{float:none;vertical-align:top}.cke_toolbar_separator{display:inline-block;float:none;vertical-align:top;background-color:#c0c0c0}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_rtl .cke_button_arrow{padding-top:8px;margin-right:2px}.cke_rtl .cke_combo_inlinelabel{display:table-cell;vertical-align:middle}.cke_menubutton{display:block;height:24px}.cke_menubutton_inner{display:block;position:relative}.cke_menubutton_icon{height:16px;width:16px}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:inline-block}.cke_menubutton_label{width:auto;vertical-align:top;line-height:24px;height:24px;margin:0 10px 0 0}.cke_menuarrow{width:5px;height:6px;padding:0;position:absolute;right:8px;top:10px;background-position:0 0}.cke_rtl .cke_menubutton_icon{position:absolute;right:0;top:0}.cke_rtl .cke_menubutton_label{float:right;clear:both;margin:0 24px 0 10px}.cke_hc .cke_rtl .cke_menubutton_label{margin-right:0}.cke_rtl .cke_menuarrow{left:8px;right:auto;background-position:0 -24px}.cke_hc .cke_menuarrow{top:5px;padding:0 5px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{position:relative}.cke_wysiwyg_div{padding-top:0!important;padding-bottom:0!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_ie8.css b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_ie8.css
new file mode 100644
index 00000000..33ec221b
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_ie8.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_iequirks.css b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_iequirks.css
new file mode 100644
index 00000000..2f3f2933
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/editor_iequirks.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/icons.png b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/icons.png
new file mode 100644
index 00000000..7e5f9bd0
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/icons.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/icons_hidpi.png b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/icons_hidpi.png
new file mode 100644
index 00000000..034ba6f2
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/icons_hidpi.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/arrow.png b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/arrow.png
new file mode 100644
index 00000000..0d1eb39c
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/arrow.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/close.png b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/close.png
new file mode 100644
index 00000000..04b9c97d
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/close.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/hidpi/close.png b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/hidpi/close.png
new file mode 100644
index 00000000..8abca8e9
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/hidpi/close.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/hidpi/lock-open.png b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/hidpi/lock-open.png
new file mode 100644
index 00000000..aa5e740e
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/hidpi/lock-open.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/hidpi/lock.png b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/hidpi/lock.png
new file mode 100644
index 00000000..5404b063
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/hidpi/lock.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/hidpi/refresh.png b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/hidpi/refresh.png
new file mode 100644
index 00000000..1ebef344
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/hidpi/refresh.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/lock-open.png b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/lock-open.png
new file mode 100644
index 00000000..3b256c06
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/lock-open.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/lock.png b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/lock.png
new file mode 100644
index 00000000..c127f9eb
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/lock.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/refresh.png b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/refresh.png
new file mode 100644
index 00000000..a1a061c5
Binary files /dev/null and b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/images/refresh.png differ
diff --git a/htmltest/sites/all/libraries/ckeditor-version/skins/moono/readme.md b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/readme.md
new file mode 100644
index 00000000..0fa4c1ac
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/skins/moono/readme.md
@@ -0,0 +1,51 @@
+"Moono" Skin
+====================
+
+This skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor
+[skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by
+the CKEditor team. "Moono" is maintained by the core developers.
+
+For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK)
+documentation.
+
+Features
+-------------------
+"Moono" is a monochromatic skin, which offers a modern look coupled with gradients and transparency.
+It comes with the following features:
+
+- Chameleon feature with brightness,
+- high-contrast compatibility,
+- graphics source provided in SVG.
+
+Directory Structure
+-------------------
+
+CSS parts:
+- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance,
+- **mainui.css**: the file contains styles of entire editor outline structures,
+- **toolbar.css**: the file contains styles of the editor toolbar space (top),
+- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar,
+- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded
+until the first panel open up,
+- **elementspath.css**: the file contains styles of the editor elements path bar (bottom),
+- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down,
+it's not loaded until the first menu open up,
+- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open,
+- **reset.css**: the file defines the basis of style resets among all editor UI spaces,
+- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference,
+- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks.
+
+Other parts:
+- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature,
+- **icons/**: contains all skin defined icons,
+- **images/**: contains a fill general used images,
+- **dev/**: contains SVG source of the skin icons.
+
+License
+-------
+
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+
+Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
+
+See LICENSE.md for more information.
diff --git a/htmltest/sites/all/libraries/ckeditor-version/styles.js b/htmltest/sites/all/libraries/ckeditor-version/styles.js
new file mode 100644
index 00000000..6ffdb022
--- /dev/null
+++ b/htmltest/sites/all/libraries/ckeditor-version/styles.js
@@ -0,0 +1,111 @@
+﻿/**
+ * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or http://ckeditor.com/license
+ */
+
+// This file contains style definitions that can be used by CKEditor plugins.
+//
+// The most common use for it is the "stylescombo" plugin, which shows a combo
+// in the editor toolbar, containing all styles. Other plugins instead, like
+// the div plugin, use a subset of the styles on their feature.
+//
+// If you don't have plugins that depend on this file, you can simply ignore it.
+// Otherwise it is strongly recommended to customize this file to match your
+// website requirements and design properly.
+
+CKEDITOR.stylesSet.add( 'default', [
+	/* Block Styles */
+
+	// These styles are already available in the "Format" combo ("format" plugin),
+	// so they are not needed here by default. You may enable them to avoid
+	// placing the "Format" combo in the toolbar, maintaining the same features.
+	/*
+	{ name: 'Paragraph',		element: 'p' },
+	{ name: 'Heading 1',		element: 'h1' },
+	{ name: 'Heading 2',		element: 'h2' },
+	{ name: 'Heading 3',		element: 'h3' },
+	{ name: 'Heading 4',		element: 'h4' },
+	{ name: 'Heading 5',		element: 'h5' },
+	{ name: 'Heading 6',		element: 'h6' },
+	{ name: 'Preformatted Text',element: 'pre' },
+	{ name: 'Address',			element: 'address' },
+	*/
+
+	{ name: 'Italic Title',		element: 'h2', styles: { 'font-style': 'italic' } },
+	{ name: 'Subtitle',			element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } },
+	{
+		name: 'Special Container',
+		element: 'div',
+		styles: {
+			padding: '5px 10px',
+			background: '#eee',
+			border: '1px solid #ccc'
+		}
+	},
+
+	/* Inline Styles */
+
+	// These are core styles available as toolbar buttons. You may opt enabling
+	// some of them in the Styles combo, removing them from the toolbar.
+	// (This requires the "stylescombo" plugin)
+	/*
+	{ name: 'Strong',			element: 'strong', overrides: 'b' },
+	{ name: 'Emphasis',			element: 'em'	, overrides: 'i' },
+	{ name: 'Underline',		element: 'u' },
+	{ name: 'Strikethrough',	element: 'strike' },
+	{ name: 'Subscript',		element: 'sub' },
+	{ name: 'Superscript',		element: 'sup' },
+	*/
+
+	{ name: 'Marker',			element: 'span', attributes: { 'class': 'marker' } },
+
+	{ name: 'Big',				element: 'big' },
+	{ name: 'Small',			element: 'small' },
+	{ name: 'Typewriter',		element: 'tt' },
+
+	{ name: 'Computer Code',	element: 'code' },
+	{ name: 'Keyboard Phrase',	element: 'kbd' },
+	{ name: 'Sample Text',		element: 'samp' },
+	{ name: 'Variable',			element: 'var' },
+
+	{ name: 'Deleted Text',		element: 'del' },
+	{ name: 'Inserted Text',	element: 'ins' },
+
+	{ name: 'Cited Work',		element: 'cite' },
+	{ name: 'Inline Quotation',	element: 'q' },
+
+	{ name: 'Language: RTL',	element: 'span', attributes: { 'dir': 'rtl' } },
+	{ name: 'Language: LTR',	element: 'span', attributes: { 'dir': 'ltr' } },
+
+	/* Object Styles */
+
+	{
+		name: 'Styled image (left)',
+		element: 'img',
+		attributes: { 'class': 'left' }
+	},
+
+	{
+		name: 'Styled image (right)',
+		element: 'img',
+		attributes: { 'class': 'right' }
+	},
+
+	{
+		name: 'Compact table',
+		element: 'table',
+		attributes: {
+			cellpadding: '5',
+			cellspacing: '0',
+			border: '1',
+			bordercolor: '#ccc'
+		},
+		styles: {
+			'border-collapse': 'collapse'
+		}
+	},
+
+	{ name: 'Borderless Table',		element: 'table',	styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } },
+	{ name: 'Square Bulleted List',	element: 'ul',		styles: { 'list-style-type': 'square' } }
+]);
+
diff --git a/htmltest/sites/all/libraries/colorbox b/htmltest/sites/all/libraries/colorbox
new file mode 120000
index 00000000..83abd06b
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox
@@ -0,0 +1 @@
+colorbox-version
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/README.md b/htmltest/sites/all/libraries/colorbox-version/README.md
new file mode 100644
index 00000000..e8064adf
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/README.md
@@ -0,0 +1,522 @@
+## About Colorbox:
+A customizable lightbox plugin for jQuery.  See the [project page](http://jacklmoore.com/colorbox/) for documentation and a demonstration, and the [FAQ](http://jacklmoore.com/colorbox/faq/) for solutions and examples to common issues.  Released under the [MIT license](http://www.opensource.org/licenses/mit-license.php).
+
+## Translations Welcome
+Send me your language configuration files.  See /i18n/jquery.colorbox-de.js as an example.
+
+## Changelog:
+
+### Version 1.4.31 - 2013/9/25
+
+* Used setAttribute to set londesc, so that the value is accessible via DOM Node longDesc property #508
+
+### Version 1.4.30 - 2013/9/24
+
+* Added longdesc and aria-describedby attributes to photos.  Fixes #508
+
+### Version 1.4.29 - 2013/9/10
+
+* Fixed a slideshow regression from 1.4.27
+* Fixed a potential issue with the starting size of #cboxLoadedContent
+
+### Version 1.4.28 - 2013/9/4
+
+* Fixed a potential issue with using the open property with mixed slideshow and non-slideshow groups
+
+### Version 1.4.27 - 2013/7/16
+
+* Fixed a width calculation issue relating to using margin:auto on #cboxLoadedContent.
+
+### Version 1.4.26 - 2013/6/30
+
+* Fixed a regression in IE7 and IE8 that was causing an error.
+
+### Version 1.4.25 - 2013/6/28
+
+* Use an animation speed of zero between same-sized content (fixed).
+* Removed temporary fix for jQuery UI 1.8
+
+### Version 1.4.24 - 2013/6/24
+
+* Added closeButton option.  Set to false to remove the close button.
+
+### Version 1.4.23 - 2013/6/23
+
+* Bugfix loading overlay/graphic append order
+
+### Version 1.4.22 - 2013/6/19
+
+* Updated manifest files for the jQuery plugin repository and Bower (no changes to plugin)
+
+### Version 1.4.21 - 2013/6/6
+
+* Replaced new Image() with document.createElement('img') to avoid a potential bug in Chrome 27.
+
+### Version 1.4.20 - 2013/6/5
+
+* Fixing bug/typo from last update.
+
+### Version 1.4.19 - 2013/6/3
+
+* Fixed bug where Colorbox was capturing ctrl+click on assigned links on windows browsers with jQuery 1.7+, rather than ignoring.
+
+### Version 1.4.18 - 2013/5/30
+
+* Fixed a scroll position issue when using $.colorbox.resize()
+
+### Version 1.4.17 - 2013/5/23
+
+* Possible fix for a Chrome 27 issue (https://github.com/jackmoore/colorbox/pull/438#issuecomment-18334804)
+
+### Version 1.4.16 - 2013/5/20
+
+* Added trapFocus setting to allow disabling of focus trapping
+
+### Version 1.4.15 - 2013/4/22
+
+* Added .webp to list of recognized image extensions
+
+### Version 1.4.14 - 2013/4/16
+
+* Added fadeOut property to control the closing fadeOut speed.
+* Removed longdesc attribute for now.
+
+### Version 1.4.13 - 2013/4/11
+
+* Fixed an error involving IE7/IE8 and legacy versions of jQuery
+
+### Version 1.4.12 - 2013/4/9
+
+* Fixed a potential conflict with Twitter Bootstrap default img styles.
+
+### Version 1.4.11 - 2013/4/9
+
+* Added `type='button'` to buttons to prevent accidental form submission
+* Added alt and longdesc attributes to photo content if they are present on the calling element.
+
+### Version 1.4.10 - 2013/4/2
+
+* Better 'old IE' feature detection that fixes an error with jQuery 2.0.0pre.
+
+### Version 1.4.9 - 2013/4/2
+
+* Fixes bug introduced in previous version.
+
+### Version 1.4.8 - 2013/4/2
+
+* Dropped IE6 support.
+* Fixed other issues with $.colorbox.remove.
+
+### Version 1.4.7 - 2013/4/1
+
+* Prevented an error if $.colorbox.remove is called during the transition.
+
+### Version 1.4.6 - 2013/3/19
+
+* Minor change to work around a jQuery 1.4.2 bug for legacy users.
+
+### Version 1.4.5 - 2013/3/10
+
+* Minor change to apply the close and className properties sooner.
+
+### Version 1.4.4 - 2013/3/10
+
+* Fixed an issue with percent-based heights in iOS
+* Fixed an issue with ajax requests being applied at the wrong time.
+
+### Version 1.4.3 - 2013/2/18
+
+* Made image preloading aware of retina settings.
+
+### Version 1.4.2 - 2013/2/18
+
+* Removed $.contains for compatibility with jQuery 1.3.x
+
+### Version 1.4.1 - 2013/2/14
+
+* Ignored left and right arrow keypresses if combined with the alt key.
+
+### Version 1.4.0 - 2013/2/12
+
+* Better accessibility:
+	* Replaced div controls with buttons
+	* Tabbed navigation confined to modal window
+	* Added aria role
+
+### Version 1.3.34 - 2013/2/4
+
+* Updated manifest for plugins.jquery.com
+
+### Version 1.3.33 - 2013/2/4
+
+* Added retina display properties: retinaImage, retinaUrl, retinaSuffix
+* Fixed iframe scrolling on iOS devices.
+
+### Version 1.3.32 - 2013/1/31
+
+* Improved internal event subscribing & fixed event bug introduced in v1.3.21
+
+### Version 1.3.31 - 2013/1/28
+
+* Fixed a size-calculation bug introduced in the previous commit.
+
+### Version 1.3.30 - 2013/1/25
+
+* Delayed border-width calculations until after opening, to avoid a bug in FF when using Colorbox in a hidden iframe.
+
+### Version 1.3.29 - 2013/1/24
+
+* Fixes bug with bubbling delegated events, introduced in the previous commit.
+
+### Version 1.3.28 - 2013/1/24
+
+* Fixed compatibility issue with old versions of jQuery (1.3.2-1.4.2)
+
+### Version 1.3.27 - 2013/1/23
+
+* Added className property.
+
+### Version 1.3.26 - 2013/1/23
+
+* Minor bugfix: clear the onload event handler after photo has loaded.
+
+### Version 1.3.25 - 2013/1/23
+
+* Removed grunt file & added Bower component.json.
+
+### Version 1.3.24 - 2013/1/22
+
+* Added generated files (jquery.colorbox.js / jquery.colorbox-min.js) back to the repository.
+
+### Version 1.3.23 - 2013/1/18
+
+* Minor bugfix for calling Colorbox on empty jQuery collections without a selector.
+
+### Version 1.3.22 - 2013/1/17
+
+* Recommit for plugins.jquery.com
+
+### Version 1.3.21 - 2013/1/15
+Files Changed: *.js
+
+* Fixed compatability issues with jQuery 1.9
+
+### Version 1.3.20 - August 15 2012
+Files Changed:jquery.colorbox.js
+
+* Added temporary workaround for jQuery-UI 1.8 bug (http://bugs.jquery.com/ticket/12273)
+* Added *.jpe extension to the list of image types.
+
+### Version 1.3.19 - December 08 2011
+Files Changed:jquery.colorbox.js, colorbox.css (all)
+
+* Fixed bug related to using the 'fixed' property.
+* Optimized the setup procedure to be more efficient.
+* Removed $.colorbox.init() as it will no longer be needed (will self-init when called).
+* Removed use of $.browser.
+
+### Version 1.3.18 - October 07 2011
+Files Changed:jquery.colorbox.js/jquery.colorbox-min.js, colorbox.css (all) and example 1's controls.png
+
+* Fixed a regression where Flash content displayed in Colorbox would be reloaded if the browser window was resized.
+* Added safety check to make sure that Colorbox's markup is only added to the DOM a single time, even if $.colorbox.init() is called multiple times.  This will allow site owners to manually initialize Colorbox if they need it before the DOM has finished loading.
+* Updated the example index.html files to be HTML5 compliant.
+* Changed the slideshow behavior so that it immediately moves to the next slide when the slideshow is started.
+* Minor regex bugfix to allow automatic detection of image URLs that include fragments.
+
+### Version 1.3.17 - May 11 2011
+Files Changed:jquery.colorbox.js/jquery.colorbox-min.js
+
+* Added properties "top", "bottom", "left" and "right" to specify a position relative to the viewport, rather than using the default centering.
+* Added property "data" to specify GET or POST data when using Ajax.  Colorbox's ajax functionality is handled by jQuery's .load() method, so the data property works the same way as it does with .load().
+* Added property "fixed" which can provide fixed positioning for Colorbox, rather than absolute positioning.  This will allow Colorbox to remain in a fixed position within the visitors viewport, despite scrolling.  IE6 support for this was not added, it will continue to use the default absolute positioning.
+* Fixed ClearType problem with IE7.
+* Minor fixes.
+
+### Version 1.3.16 - March 01 2011
+Files Changed:jquery.colorbox.js/jquery.colorbox-min.js, colorbox.css (all) and example 4 background png files
+
+* Better IE related transparency workarounds.  IE7 and up now uses the same background image sprite as other browsers.
+* Added error handling for broken image links. A message will be displayed telling the user that the image could not be loaded.
+* Added new property: 'fastIframe' and set it to true by default.  Setting to fastIframe:false will delay the loading graphic removal and onComplete event until iframe has completely loaded.
+* Ability to redefine $.colorbox.close (or prev, or next) at any time.
+
+### Version 1.3.15 - October 27 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Minor fixes for specific cases.
+
+### Version 1.3.14 - October 27 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* In IE6, closing an iframe when using HTTPS no longer generates a security warning.
+
+### Version 1.3.13 - October 22 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Changed the index.html example files to use YouTube's new embedded link format.
+* By default, Colorbox returns focus to the element it was launched from once it closes.  This can now be disabled by setting the 'returnFocus' property to false.  Focus was causing problems for some users who had their anchor elements inside animated containers.
+* Minor bug fix involved in using a combination of slideshow and non-slideshow content.
+
+### Version 1.3.12 - October 20 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Minor bug fix involved in preloading images when using a function as a value for the href property.
+
+### Version 1.3.11 - October 19 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed the slideshow functionality that broke with 1.3.10
+* The slideshow now respects the loop property.
+
+### Version 1.3.10 - October 16 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed compatibility with jQuery 1.4.3
+* The 'open' property now accepts a function as a value, like all of the other properties.
+* Preloading now loads the correct href for images when using a dynamic (function) value for the href property.
+* Fixed bug in Safari 3 for Win where Colorbox centered on the document, rather than the visitor's viewport.
+* May have fixed an issue in Opera 10.6+ where Colorbox would rarely/randomly freeze up while switching between photos in a group.
+* Some functionality better encapsulated & minor performance improvements.
+
+### Version 1.3.9 - July 7 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/ all colorbox.css (the core styles)
+
+* Fixed a problem where iframed youtube videos would cause a security alert in IE.
+* More code is event driven now, making the source easier to grasp.
+* Removed some unnecessary style from the core CSS.
+
+### Version 1.3.8 - June 21 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug in Chrome where it would sometimes render photos at 0 by 0 width and height (behavior introduced in recent update to Chrome).
+* Fixed a bug where the onClosed callback would fire twice (only affected 1.3.7).
+* Fixed a bug in IE7 that existed with some iframed websites that use JS to reposition the viewport caused Colorbox to move out of position.
+* Abstracted the identifiers (HTML ids & classes, and JS plugin name, method, and events) so that the plugin can be easily rebranded.
+* Small changes to improve either code readability or compression.
+
+### Version 1.3.7 - June 13 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/index.html
+
+* $.colorbox can now be used for direct calls and accessing public methods. Example: $.colorbox.close();
+* Resize now accepts 'width', 'innerWidth', 'height' and 'innerHeight'. Example: $.colorbox.resize({width:"100%"})
+* Added option (loop:false) to disable looping in a group.
+* Added options (escKey:false, arrowKey:false) to disable esc-key and arrow-key bindings.
+* Added method for removing Colorbox from a document: $.colorbox.remove();
+* Fixed a bug where iframed URLs would be truncated if they contained an unencoded apostrophe.
+* Now uses the exact href specified on an anchor, rather than the version returned by 'this.href'. This was causing "#example" to be normalized to "http://domain/#example" which interfered with how some users were setting up links to inline content.
+* Changed example documents over to HTML5.
+
+### Version 1.3.6 - Jan 13 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Small change to make Colorbox compatible with jQuery 1.4
+
+### Version 1.3.5 - December 15 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug introduced in 1.3.4 with IE7's display of example 2 and 3, and auto-width in Opera.
+* Fixed a bug introduced in 1.3.4 where colorbox could not be launched by triggering an element's click event through JavaScript.
+* Minor refinements.
+
+### Version 1.3.4 - December 5 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Event delegation is now used for elements that Colorbox is assigned to, rather than individual click events.
+* Additional callbacks have been added to represent other stages of Colorbox's lifecycle. Available callbacks, in order of their execution: onOpen, onLoad, onComplete, onCleanup, onClosed These take place at the same time as the event hooks, but will be better suited than the hooks for targeting specific instances of Colorbox.
+* Ajax content is now immediately added to the DOM to be more compatible if that content contains script tags.
+* Focus is now returned to the calling element on closing.
+* Fixed a bug where maxHeight and maxWidth did not work for non-photo content.
+* Direct calls no longer need 'open:true', it is assumed.  Example: `$.colorbox({html:'<p>Hi</p>'});`
+
+### Version 1.3.3 - November 7 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Changed $.colorbox.element() to return a jQuery object rather the DOM element.
+* jQuery.colorbox-min.js is compressed with Google's Closure Compiler rather than YUI Compressor.
+
+### Version 1.3.2 - October 27 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Added 'innerWidth' and 'innerHeight' options to allow people to easily set the size dimensions for Colorbox, without having to anticipate the size of the borders and buttons.
+* Renamed 'scrollbars' option to 'scrolling' to be in keeping with the existing HTML attribute. The option now also applies to iframes.
+* Bug fix: In Safari, positioning occassionally incorrect when using '100%' dimensions.
+* Bug fix: In IE6, the background overlay is briefly not full size when first viewing.
+* Bug fix: In Firefox, opening Colorbox causes a split second shift with a small minority of webpage layouts.
+* Simplified code in a few areas.
+
+### Version 1.3.1 - September 16 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/colorbox.css/colorbox-ie.css(removed)
+
+* Removed the IE-only stylesheets and conditional comments for example styles 1 & 4.  All CSS is handled by a single CSS file for all examples.
+* Removed user-agent sniffing from the js and replaced it with feature detection.  This will allow correct rendering for visitors masking their agent type.
+
+### Version 1.3.0 - September 15 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/colorbox.css
+
+* Added $.colorbox.resize() method to allow Colorbox to resize it's height if it's contents change.
+* Added 'scrollbars' option to allow users to turn off scrollbars when using the resize() method.
+* Renamed the 'resize' option to be less ambiguous.  It's now 'scalePhotos'.
+* Renamed the 'cbox_close' event to be less ambiguous.  It's now 'cbox_cleanup'.  It is the first thing to happen in the close method while the 'cbox_closed' event is the last to happen.
+* Fixed a bug with the slideshow mouseover graphics that appeared after Colorbox is opened a 2nd time.
+* Fixed a bug where ClearType may not work in IE6&7 if using the fade transition.
+* Minor code optimizations to increase compression.
+
+### Version 1.2.9 - August 7 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Minor change to enable use with $.getScript();
+* Minor change to the timing of the 'cbox_load' event so that it is more useful.
+* Added a direct link to a YouTube video to the examples.
+
+### Version 1.2.8 - August 5 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug with the overlay in IE6
+* Fixed a bug where left & right keypress events might be prematurely unbound.
+
+### Version 1.2.7 - July 31 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js, example stylesheets and background images (core styles have not changed and the updates will not affect existing user themes / old example themes)
+
+* Code cleanup and reduction, better organization and documentation in the full source.
+* Added ability to use functions in place of static values for Colorbox's options (thanks Ken!).
+* Added an option for straight HTML.  Example: `$.colorbox({html:'<p>Howdy</p>', open:true})`
+* Added an event for the beginning of the closing process.  This is in addition to the event that already existed for when Colorbox had completely closed.  'cbox_close' and 'cbox_closed' respectively.
+* Fixed a minor bug in IE6 that would cause a brief content shift in the parent document when opening Colorbox.
+* Fixed a minor bug in IE6 that would reveal select elements that had a hidden visibility after closing Colorbox.
+* The 'esc' key is unbound now when Colorbox is not open, to avoid any potential conflicts.
+* Used background sprites for examples 1 & 4.  Put IE-only (non-sprite) background images in a separate folder.
+* Example themes 1, 3, & 4 received slight visual tweaks.
+* Optimized pngs for smaller file size.
+* Added slices, grid, and correct sizing to the Adobe Illustrator file, all theme files are now export ready!
+
+### Version 1.2.6 - July 15 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug with fixed width/height images in Opera 9.64.
+* Fixed a bug with trying to set a value for rel during a direct call to Colorbox. Example: `$.colorbox({rel:'foo', open:true});`
+* Changed how href/rel/title settings are determined to avoid users having to manually update Colorbox settings if they use JavaScript to update any of those attributes, after Colorbox has been defined.
+* Fixed a FF3 bug where the back button was disabled after closing an iframe.
+
+### Version 1.2.5 - June 23 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Changed the point at which iframe srcs are set (to eliminate the need to refresh the iframe once it has been added to the DOM).
+* Removed unnecessary return values for a very slight code reduction.
+
+### Version 1.2.4 - June 9 2009
+Files Changed: jquery.colorbox.js, jquery.colorbox-min.js
+
+* Fixed an issue where Colorbox may not close completely if it is closed during a transition animation.
+* Minor code reduction.
+
+### Version 1.2.3 - June 4 2009
+* Fixed a png transparency stacking issue in IE.
+* More accurate Ajax auto-sizing if the user was depending on the #cboxLoadedContent ID for CSS styling.
+* Added a public function for returning the current html element that Colorbox is associated with. Example use: var that = $.colorbox.element();
+* Added bicubic scaling for resized images in the original IE7.
+* Removed the IE6 stylesheet and png files from Example 3.  It now uses the same png file for the controls that the rest of the browsers use (an alpha transparency PNG8).  This example now only has 2 graphics files and 1 stylesheet.
+
+### Version 1.2.2 - May 28 2009
+* Fixed an issue with the 'resize' option.
+
+### Version 1.2.1 - May 28 2009
+* Note: If you are upgrading, update your jquery.colorbox.js and colorbox.css files.
+* Added photo resizing.
+* Added a maximum width and maximum height. Example: {height:800, maxHeight:'100%'}, would allow the box to be a maximum potential height of 800px, instead of a fixed height of 800px.  With maxHeight of 100% the height of Colorbox cannot exceed the height of the browser window.
+* Added 'rel' setting to add the ability to set an alternative rel for any Colorbox call.  This allows the user to group any combination of elements together for a gallery, or to override an existing rel. attribute so those element are not grouped together, without having to alter their rel in the HTML.
+* Added a 'photo' setting to force Colorbox to display a link as a photo.  Use this when automatic photo detection fails (such as using a url like 'photo.php' instead of 'photo.jpg', 'photo.jpg#1', or 'photo.jpg?pic=1')
+* Removed the need to ever create disposable elements to call colorbox on.  Colorbox can now be called directly, without being associated with any existing element, by using the following format:
+  `$.colorbox({open:true, href:'yourLink.xxx'});`
+* Colorbox settings are now persistent and unique for each element.  This allows for extremely flexible options for individual elements.  You could use this to create a gallery in which each page in the gallery has different settings.  One could be a photo with a fade transition, next could be an inline element with an elastic transition with a set width and height, etc.
+* For user callbacks, 'this' now refers to the element colorbox was opened from.
+* Fixed a minor grouping issue with IE6, when transition type is set to 'none'.
+* Added an Adobe Illustrator file that contains the borders and buttons used in the various examples.
+
+### Version 1.2 - May 13 2009
+* Added a slideshow feature.
+* Added re-positioning on browser resize.  If the browser is resized, Colorbox will recenter itself onscreen.
+* Added hooks for key events: cbox_open, cbox_load, cbox_complete, cbox_closed.
+* Fixed an IE transparency-stacking problem, where transparent PNGs would show through to the background overlay.
+* Fixed an IE iframe issue where the ifame might shift up and to the left under certain circumstances.
+* Fixed an IE6 bug where the loading overlay was not at full height.
+* Removed the delay in switching between same-sized gallery content when using transitions.
+* Changed how iframes are loaded to make it more compatible with iframed pages that use DOM dependent JavaScript.
+* Changed how the JS is structured to be better organized and increase compression.  Increased documentation.
+* Changed CSS :hover states to a .hover class.  This sidesteps a minor IE8 bug with css hover states and allows easier access to hover state user styles from the JavaScript.
+* Changed: elements added to the DOM have new ID's.  The naming is more consistent and less likely to cause conflicts with existing website stylesheets.  All stylesheets have been updated.
+* Changed the behavior for prev/next links so that Colorbox does not get hung up on broken links.  A visitor can now skip through broken or long-loading links by clicking prev/next buttons.
+* Changed the naming of variables in the parameter map to be more concise and intuitive.
+* Removed colorbox.css.  Combined the colorbox.css styles with jquery.colorbox.js: the css file was not large enough to warrant being a separate file.
+
+### Version 1.1.6 - April 28 2009
+* Prevented the default action of the next & previous anchors and the left and right keys for gallery mode.
+* Fixed a bug where the title element was being added back to the DOM when closing Colorbox while using inline content.
+* Fixed a bug where IE7 would crash for example 2.
+* Smaller filesize: removed a small amount of unused code and rewrote the HTML injection with less syntax.
+* Added a public method for closing Colorbox: $.colorbox.close().  This will allow iframe users to add an event to close Colorbox without having to create an additional function.
+
+### Version 1.1.5 - April 11 2009
+* Fixed minor issues with exiting Colorbox.
+ 
+### Version 1.1.4 - April 08 2009
+* Fixed a bug in the fade transition where Colorbox not close completely if instructed to close during the fade-in portion of the transition.
+
+### Version 1.1.3 - April 06 2009
+* Fixed an IE6&7 issue with using Colorbox to display animated GIFs.
+
+### Version 1.1.2 - April 05 2009
+* Added ability to change content when Colorbox is already open.
+* Added vertical photo centering now works for all browsers (this feature previously excluded IE6&7).
+* Added namespacing to the esc-key keydown event for people who want to disable it: "keydown.colorClose"
+* Added 'title' setting to add the ability to set an alternative title for any Colorbox call.
+* Fixed rollover navigation issue with IE8. (Added JS-based rollover state due to a browser-bug.)
+* Fixed an overflow issue for when the fixed width/height is smaller than the size of a photo.
+* Fixed a bug in the fade transition where the border would still come up if Colorbox was closed mid-transition.
+* Switch from JSMin to Yui Compressor for minification.  Minified code now under 7KB.
+
+### Version 1.1.1 - March 31 2009
+* More robust image detection regex.  Now detects image file types with url fragments and/or query strings.
+* Added 'nofollow' exception to rel grouping.
+* Changed how images are loaded into the DOM to prevent premature size calculation by Colorbox.
+* Added timestamp to iframe name to prevent caching - this was a problem in some browsers if the user had multiple iframes and the visitor left the page and came back, or if they refreshed the page.
+
+### Version 1.1.0 - March 21 2009
+* Animation is now much smoother and less resource intensive.
+* Added support for % sizing.
+* Callback option added.
+* Inline content now preserves JavaScript events, and changes made while Colorbox is open are also preserved.
+* Added 'href' setting to add the ability to set an alternative href for any anchor, or to assign the Colorbox event to non-anchors. 
+  Example: $('button').colorbox({'href':'process.php'})
+  Example: $('a[href='http://msn.com']).colorbox({'href':'http://google.com', iframe:true});
+* Photos are now horizontally centered if they are smaller than the lightbox size.  Also vertically centered for browsers newer than IE7.
+* Buttons in the examples are now included in the 'protected zone'.  The lightbox will never expand it's borders or buttons beyond an accessible area of the screen.
+* Keypress events don't queue up by holding down the arrow keys.
+* Added option to close Colorbox by clicking on the background overlay.
+* Added 'none' transition setting.
+* Changed 'contentIframe' and 'contentInline' to 'inline' and 'iframe'.  Removed 'contentAjax' because it  is automatically assumed for non-image file types.
+* Changed 'contentWidth' and 'contentHeight' to 'fixedWidth' and 'fixedHeight'.  These sizes now reflect  the total size of the lightbox, not just the inner content.  This is so users can accurately anticipate  % sizes without fear of creating scrollbars.
+* Clicking on a photo will now switch to the next photo in a set.
+* Loading.gif is more stable in it's position.
+* Added a minified version.
+* Code passes JSLint.
+
+### Version 1.0.5 - March 11 2009
+* Redo: Fixed a bug where IE would cut off the bottom portion of a photo, if the photo was larger than the document dimensions.
+
+### Version 1.0.4 - March 10 2009
+* Added an option to allow users to automatically open the lightbox. Example usage: $(".colorbox").colorbox({open:true});
+* Fixed a bug where IE would cut off the bottom portion of a photo, if the photo was larger than the document dimensions.
+
+### Version 1.0.3 - March 09 2009
+* Fixed vertical centering for Safari 3.0.x.
+
+### Version 1.0.2 - March 06 2009
+* Corrected a typo.
+* Changed the content-type check so that it does not assume all links to photos should actually display photos. This allows for Ajax/inline/and iframe calls on anchors linking to picture file types.
+
+### Version 1.0.1 - March 05 2009
+* Fixed keydown events (esc, left arrow, right arrow) for Webkit browsers.
+
+### Version 1.0 - March 03 2009
+* First release
diff --git a/htmltest/sites/all/libraries/colorbox-version/bower.json b/htmltest/sites/all/libraries/colorbox-version/bower.json
new file mode 100644
index 00000000..668366dd
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/bower.json
@@ -0,0 +1,31 @@
+{
+	"name": "jquery-colorbox",
+	"description": "jQuery lightbox and modal window plugin",
+	"version": "1.4.31",
+	"dependencies": {
+		"jquery": ">=1.3.2"
+	},
+	"keywords": [
+		"modal",
+		"lightbox",
+		"window",
+		"popup",
+		"ui",
+		"jQuery"
+	],
+	"authors": [
+		{
+			"name": "Jack Moore",
+			"url": "http://www.jacklmoore.com",
+			"email": "hello@jacklmoore.com"
+		}
+	],
+	"licenses": [
+		{
+			"type": "MIT",
+			"url": "http://www.opensource.org/licenses/mit-license.php"
+		}
+	],
+	"homepage": "http://www.jacklmoore.com/colorbox",
+	"main": "jquery.colorbox.js"
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/colorbox.ai b/htmltest/sites/all/libraries/colorbox-version/colorbox.ai
new file mode 100644
index 00000000..1b51881a
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/colorbox.ai
@@ -0,0 +1,1811 @@
+%PDF-1.4
%����
+1 0 obj
<</Metadata 2 0 R/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<</Length 48282/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="﻿" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.351735, 2008/07/22-18:11:12        ">
+   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <rdf:Description rdf:about=""
+            xmlns:dc="http://purl.org/dc/elements/1.1/">
+         <dc:format>application/vnd.adobe.illustrator</dc:format>
+         <dc:title>
+            <rdf:Alt>
+               <rdf:li xml:lang="x-default">colorbox</rdf:li>
+            </rdf:Alt>
+         </dc:title>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+            xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/">
+         <xmp:CreatorTool>Adobe Illustrator CS4</xmp:CreatorTool>
+         <xmp:CreateDate>2009-05-27T04:22:39-04:00</xmp:CreateDate>
+         <xmp:ModifyDate>2009-07-30T21:43:35-05:00</xmp:ModifyDate>
+         <xmp:MetadataDate>2009-07-30T21:43:35-05:00</xmp:MetadataDate>
+         <xmp:Thumbnails>
+            <rdf:Alt>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpGImg:width>208</xmpGImg:width>
+                  <xmpGImg:height>256</xmpGImg:height>
+                  <xmpGImg:format>JPEG</xmpGImg:format>
+                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEBLAEsAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABABLAAAAAEA&#xA;AQEsAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADQAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXnn5b+fNd85T6us6W9jHpkiRL6KOzOzl9zzagACdMVZt9U1D/lt/5Jr/AFxV&#xA;gf5ZfmZrHmfzJrei39vBGNIaSNbiEODIYpjFUqzNStK4q9JxV2KuxV2KuxV2KuxV2KuxV2KvG/Pf&#xA;5jfmBY/mDL5Z8twpdMyRNb2/pKzktEHf4jTYbmpxVQ/xJ/zkV/1Y1/4G3/6qYqh9G/ND8zYvPml+&#xA;WvMdtHZSXcsXqwtEgYwyEjkjKSCDQioPXFXueKvBB+aX5r6n5k1HSdAtI717OSX4EiT4Y0fiCzOV&#xA;H44qmH+JP+civ+rGv/A2/wD1UxVd5F/Nbzde6/qVh5lMVnHpcEj3aNGIzG0TANyPgBiqbeU/z18v&#xA;eZdcl0izkZZ2kZLEPEw9aONOTS1pRQTUKCa+OKqdh+fvlm882Dy+kzAycYoLkxsFN16jRtbsCOuy&#xA;lWFVNaVr1VRfnv8AN5/Jt9AmpWLvp1zbyPBexFWrcx7iEx1BFV/aO340VR+r/mFqWj+Sl8x6lYGG&#xA;aOOGS808MrPH6jKHVW2VivLbpX2xVMtC8622vaLFq+lzLPaTKxRuJHxLUMpBoQQRirDfIf5y6x5n&#xA;1DSrWaxhtl1HT7i/dkZmKmC7a2CCoHXjyriqH/5x3/vvNf8AzFQ/rmxV7Lirwb8hv/JkedP+M9z/&#xA;ANRhxV7zirsVdirsVdirsVdirsVdirsVeNSf+tKx/wDMKf8AqDOKvZcVeHfmF/60T5T/AOYO0/6i&#xA;7nFXuOKvDvyS/wDJleb/AJN/1EHFXuOKvCPKoB/O/wA3AioLSgg/OPFWbeXvLflPTby/m0e1gjnl&#xA;n5XRjCnhLxHJVP7O1KqPn1OKtQ+W/KaebH1VLaAa4LZVQhVBWIu9XVRtyZmYM3XtiqC8x+VvI2q6&#xA;79Y19I7m7WzkRbe5c+mkBPxyIhPFH/yx8W3XbFVeXQvK8/km20meQyeX1jgQPJI3xRqylQ7k1AOw&#xA;O+2Kp/bWdpb2iWtpEkNsiCOKKIBVVQOICgbAAbDFWE+SPKfkrTL7TZ9Eu7i4ltrCeCzEtaNbPdM8&#xA;jtVE3EzFR0+XfFVH/nHf++81/wDMVD+ubFXsuKvBvyG/8mR50/4z3P8A1GHFXvOKuxV2KuxV2Kux&#xA;V2KuxV2KuxV4tfgH/nISYHcfUl/6h1xV6LwT+Ufdil5J5sAH/OQPlWgp/o1r0/5ibjFD3/FXg/5T&#xA;gHzt5xqK/vk6/wDGWbFXqnBP5R92KXlnlqJJPzo80xNUI8AU8SVNDFCNitCD7jFDLfL3kW10fUZL&#xA;xLiWQh2MKsduDClHH7RB74qttvIVnD5iGrfWZSqfvEj5GplZmJJbrwoR8Pfvttiqt5q8pyeYJ4Vl&#xA;uBDawRuU4oDJ6zbAlj+xtuBT5+CqM1DRrrUPLf6LnlRJ5I40mljWiAggsVTbw2GKo3SNNg0uwgso&#xA;Gd4oBRWkYsx+k/qG2KpD5W8sajpU1k9y0TC3spraT02J+OS5MwIqo24/jiqS/wDOO/8Afea/+YqH&#xA;9c2KvZcVeDfkN/5Mjzp/xnuf+ow4q95xV2KuxV2KuxV2KuxV2KuxV2KvA/OPmPTvL356y6jqJZbM&#xA;W0cUsiKXKc4AAxUbkA9ab4qyL/ldX5a/9XZv+kW7/wCqWKsFm8z6R5m/PLy5qGkO81lALa19Z0aM&#xA;O6yySEqrgNQeqBuBvXtvir6UxV81eTfOmheWPPHmY6zI8EF5MwjnVHkUNFK54ssYZvi57bYqzv8A&#xA;5XV+Wv8A1dm/6Rbv/qlirFfy41m11v8ANXXtVtAwtbqImHmKMVT04wxHblwrir2LFLsVdirsVdir&#xA;sVeef847/wB95r/5iof1zYoey4q8G/Ib/wAmR50/4z3P/UYcVe84q7FXYq7FXYq7FXYq7FXYq7FU&#xA;p1Dyj5X1G6a7v9Ktbq6cAPNNEjuQooKkiuwGKob/AJV95G/6sNh/0jx/0xVVtfJPlC0uY7m10azg&#xA;uIWDxSxworKw6EEDY4qnWKpHN5F8mTSvLLollJLISzu0EZJYmpJNMVWf8q+8jf8AVhsP+keP+mKo&#xA;rT/KfljTpjNYaXa2sxHEyQxIjFT2qoGKph9Utv8AfS/dirvqlt/vpfuxV31S2/30v3Yq76pbf76X&#xA;7sVd9Utv99L92Ku+qW3++l+7FXj/APzjwQLjzUhNGNzCwU9aVl3pir2XFXg35DD/AJCN5zb9lprk&#xA;q3Yj62emKvecVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVSyfy1oU2&#xA;5soUbpySNUNPCoGKqH+D9B/5ZhiqN03RdK0xOFhaRWwIofSRUJHvxAxVG4q7FXYq7FXYq7FXYq7F&#xA;XYqg9H1jTdZ0u11XTLhLqwvI1mt54yCrI4qP7R2xVL/OHm6x8qaNca1qNrdTabaL6l3NaRiYxJWh&#xA;ZkDB+I7kKaDc7Yq84/6Gu/Kj0DcV1P0AokMv1GTgELcA3KtKc/hr47Yq9J8pea7PzTo1vrNha3UG&#xA;nXiCW0lu41iMsbfZdU5F+LdQSBUbjbFUdrOs6ZoulXWq6pcJa2FlG01zPIaKqIKn5nwHfFUZirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir8t7NtVW2nltHmS3gCvcNGzKq8mCK&#xA;TQjck0xV9Tf84pyar5v/AC088eUtS1CZ7GaM2dq8hMpgXULeaOXhyPTYNx6Vr44qxf8A6Fe/OhtP&#xA;Hllv0WNHEwYXv1iSgYOT6/GnPdTTjx+iu+Kss/5y2utV8sfl/wCTPLWnX80diA1vcshMbTixgiSI&#xA;vxPT4i3HpX5DFXyrdvqzW0El28z209XgaRmZGKEoSKkioNRir9SMVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVfnX5S85aNpmjNFND6bwAGSJAC0xJA5DkRU+IJxV71/wA4TyrN&#xA;a+dJUHFZLq0dR4BhOR0xV9NYq+ZP+c25FjsvJsjCqpdXbMPYLCcVeC+YvOOiXnl4WyQCea4B9KNw&#xA;AYCCRzPGtG8ADv32xV+iuKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvhDQ&#xA;P+cTvzc1nSbbU1gsrGO6jWWKC7uCk3BxyUskaScag9CajuMVfSX/ADjl+TmsflroGpx61cwz6nqs&#xA;8ckkVsWeKOOFWVBzZULMeZJ28MVeu4q8h/5yN/JzWfzK0HS49EuoYNS0qeR0iuSyRSRzqqv8aq5D&#xA;LwUjanXFXzb5h/5xQ/NzRdJudTaCzv4rSNpZobOcvNwQcmKo6R8qDsu57DFX3hirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdir4I0T/nKf8AOHSNKttMi1CC5htIxFFLc26SS8FF&#xA;FDPsWoNqnfxxV9Mf843fnBrf5j+XtSbXIYk1TSZ445Li3UokscysyEoSeLDgwNNumKvX8VePf85J&#xA;fnDrv5ceX9LbQoIX1LVp5I1uLhS6RRwKrOQgK1di60rt12xV80a7/wA5S/m/rGkXWlzahb28F5G0&#xA;M0ltbpHL6bijBX+LjUbVG/hir74xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K&#xA;uxV8lfkx+Uv5Sa1+Wlxd6peLeXGprGupX/NIZbF0kST6vGZAwiPNQGcirg7fCcVZD/zhpbW1sfPd&#xA;tauZLaC/t44HJDFo09dVNRQGoHbFX0pir5q/5zNt7e5/wLb3LcLea+uI5nqFojegGNTsNjiqTfnD&#xA;+T/5PaP+U8OoWF/Hp+oaajrpV7zWaTUHaR5DbycKeqxZyA4HwAb/AAjFX1dirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdir8vLF9eSxu7exFx9Sv1WO8jiDmOUROJEDgCh4uoI8M&#xA;VfRv/OPmm+ffKv5QeePN1gq6dLEgvbFb+BnjuYtPhlkn+Csb7g8UcNTlXFV7f85FfnGvkL/GBuNH&#xA;+r8liFl9RufW9RpjHUn1eAi4rX1a0LfB9rFW/wDnI7SPPnmL8qfJPmbUE/SVwVa61L6hAVhthfQx&#xA;yRfADJJxAXizs1OVOlaYq+br+XX3sbS2vvrP1HT1eOyilDiOISyGVwgIoOTsSfHFX6h4q7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqhNI0nT9I0y10vToEtrGzjWG3gjAVVRBQA&#xA;AUGKq91bW91bS2tzGs1vOjRTROKq6OOLKw7gg0xV45H/AM4lflEmofWfT1BrblU6cbtvq5Tlz9I/&#xA;D6vDlvTnir2SCCG3gjggRYoYlCRRoAqqqiiqoHQAYqhtY0jTtZ0q70rUoFubC9iaC5gcAqyOKEb/&#xA;AIYqjMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirqitO/hirsVcSBudsVdirSujEhWBI60NaYq3irsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdiq2WP1Inj5MnNSvNDRlqKVB33GKpL5U8sy6DbzwyahPf8ArSM49diQlXZv&#xA;hBrQtyq57nfFVlj5WmtvM9zrbalczJPHwWzd6otWZuO/7CcvgHY1xVT82eU5tdmtJI7sWwtg/JeD&#xA;MJQzI3pycXSsZ4bjFU21vTm1LSLuwWT0muomiEtK8eQpWm3TFVawtTaWUFqZpLgwoqGeU8pH4inJ&#xA;j3JxVJvKflmfQ2vDJOswuW5LxBFP3ssm9f8AjLirIMVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVU7o3ItpTaqj3QRjAkrFIzJT4Q7KHIWvUhT8sVYV+VN9+a93pt8fzEsbOyu0uHFj9&#xA;UapaMyyVDgM6hUHERnqVoWq1TiqjomofnBJ+Z+p2urafYxeREgrYXUTn1i3qSek37RaRlH71DRVH&#xA;EjeoZVT/ADT1L807S90lPI9s1xayrINZcQwStDF6sIEsHrSwhp1Vn4Rn4WFSegxVlPnWbzFD5S1e&#xA;Xy2nq6+lrI2lx0VuVwF/dij/AA7t44qi9Bk1qTRbF9cihg1hoUOoRWrM8KzcfjEbMAeNf9s9cVYT&#xA;+UepfmTevrI86JOoikA0717eO3BT61dL8PppHy/crD1r2Pc4q9FxV2KuxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVQmmkDiOIcpCK09vE4qome+hHO&#xA;ZF9MHcqa0riqMRgyhh3xVvFXYq7FXYq7FXYq7FVOW5ghkhjkfi9w5ihG/wAThGkI/wCAjY4q3PPF&#xA;bwSTzNwiiUvI57KoqTt7YqlekebvLusXLWum3q3M6IZGRVcUQEKT8SgdWGKppJNDEAZHVAenIgV+&#xA;/FWzJGE9QsAlK86ilPGuKujlikFY3VwNiVIIr9GKtLPA7lFkVnFaqCCduu2KpTqnnLyxpdwba/1G&#xA;KG4H2ovidl7/ABBA1PpxVB/8rJ8kf9XWP/gJf+aMVTzTtSsNStVurC4S5t2NBJGaio6g+B9sVS1f&#xA;OnlhtT/Ra36m/wDVNv6HF6+qG4la8adffFU7xV2KuxV2KuxVBqf9ytP+KW/4kuKrtV/4583yH6xi&#xA;qpZ/7zp8hiqtirsVdirsVdirsVdiqFvbH6zc2E3Ph9SnafjSvPlBLDxrUU/vq19sVUfMP/HA1P8A&#xA;5hJ/+TbYq8l/JT/lKrr/AJgZP+T0WKvSPM/6aEMg0uWK3vXdfSmncRp6QQ1XkUk35e21a+2Kooi4&#xA;FoZEAjFWMRk+JFkMYCu1APh9Tlv71xVC6IuuNYn9IzQ3V6FkEklqCE4FgY4+RJ5OFrvXb8SqttDr&#xA;bapcrNc2sun8h+joIUYTxkFd5KmihRy5Cn9MVeIaDpF75m8wpZ+uFuLx3kmuJKt0Bd2I7nFWXa/+&#xA;TtzpmkXWoQamt0bWNpXhaH0qogqxDc33A36Yqj/yMkflrMfI8ALdgvap9QVxVjdt/wCTYP8A22ZP&#xA;+ohsVe9Yq7FVK5mEMTOe2KqKQ3MirJ63HkAeIWvXfrXFVS3lYu8TmrxkAn5iuKqKf8dX/ni3/Elx&#xA;Vdqv/HPm+Q/WMVVbP/eZPkMVVsVdirsVdirsVdirsVQ9zexW81pC4YteSmCIrSgYRSTVapG3GI/T&#xA;iqH8w/8AHA1P/mEn/wCTbYq8l/JT/lKrr/mBk/5PRYq9G83+ZH0Wyku/q0t2ElWJbWBpFkasZcuP&#xA;TSRiB37AVPtlmLHxmrphOXCLR0uozLZSSAPP6aPIFg+KSULEsojj2WrNyoNq5ADemV7IHy55jn1P&#xA;ShffU7mxEglCw3gIb92VHqry+P0zy/a8NttzPJDhNXaISsWssfMc82vX2miwvofqFC19Op+rzfEg&#xA;4KT8PJ/UqnHw+jDLHUQbG6BOzVPGPJ2uxeX/ADJb6hcxNJFDzSaNaBwHUoaVpuK9MqZvQPM35t6B&#xA;eaDfWVjDcPcXcLwL6iKiKJFKsxIZjsDttiqF/Iz+91n/AFbf9cmKsdtv/JsH/tsyf9RDYq96xV2K&#xA;oe+hMtuyDqRiqHi1KKONIpI5A6gKaCo2264qq2il5pZypUSEEA9aAU/hiq1P+Or/AM8W/wCJLiq7&#xA;Vf8AjnzfIfrGKqtn/vMnyGKq2KuxV2KuxV2KuxV2Koe5soria0mcsGs5TPEFpQsYpIaNUHbjKfpx&#xA;VdeWsd3Zz2khIjuI3icrQMFdSppWu++Ksd8r/l5ovlvUJL6xmuZJZIjAyztGy8WZWqOKIa1Qd8VZ&#xA;HJbRSPzNVelOSMVJHgeJFcVd9Vg9IRcfgB5ChIIbx5V5V964q2ltChY0LFxRi5Lkjw+Inb2xVYll&#xA;AjKRyITdFZ2ZR8gSRirFta/Kvytqt9JeuJ7WaYl5hbOqqzHqxV1cAn2xVL/+VKeVf+Wq+/5GQ/8A&#xA;VLFWV+XvLOkeX7RrbTYiiueUsjHlI5HQs3t2HTFUmT8s9Bj8wnXhcXX1v6y15wLx+n6jOXIp6fLj&#xA;U/zYqyWXUbWI0dwDiqn+l7L/AH4MVd+l7L/fgxVb+k9PrXmMVXDVrEdHGKoe0vbe41grGwYiBj9H&#xA;NcVROsMF02dj0AH6xiqrYsGtYyOlBiqvirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqnc&#xA;kiFyOtDiqG0tFayR3UF3LFiRufiIxVF+lF/Iv3DFXelF/Iv3DFXelF/Iv3DFXelF/Iv3DFUPLA0c&#xA;3rwopfiVI6VBNeo+WKqMxuruMwPCscbbOeXKo8OgxVU0tStvw7KSo+QNMVRmKuxV2KuxV2KuxV2K&#xA;uxV2KuxV2KuxV2KuxV2KuxV2KtMoZSD0OKoJrGdaiCZo1JrxFCPxxVr6nf8A/LW/3D+mKu+p3/8A&#xA;y1v9w/pirvqd/wD8tb/cP6Yq76nf/wDLW/3D+mKu+p3/APy1v9w/piraWl6D8VyxHyAxVFwxLEgU&#xA;dsVf/9k=</xmpGImg:image>
+               </rdf:li>
+            </rdf:Alt>
+         </xmp:Thumbnails>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+            xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
+            xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#">
+         <xmpMM:RenditionClass>default</xmpMM:RenditionClass>
+         <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID>
+         <xmpMM:DocumentID>xmp.did:8BC7D877974ADE11BCECCFF09938C3CC</xmpMM:DocumentID>
+         <xmpMM:InstanceID>uuid:30267148-672c-4d34-8534-e8cce420f815</xmpMM:InstanceID>
+         <xmpMM:History>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:D47F11740720681191099C3B601C4548</stEvt:instanceID>
+                  <stEvt:when>2008-04-17T14:19:21+05:30</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FD7F11740720681197C1BF14D1759E83</stEvt:instanceID>
+                  <stEvt:when>2008-05-16T17:01:20-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F77F117407206811BC18AC99CBA78E83</stEvt:instanceID>
+                  <stEvt:when>2008-05-19T18:10:15-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:FB7F117407206811B628E3BF27C8C41B</stEvt:instanceID>
+                  <stEvt:when>2008-05-22T14:26:44-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:08C3BD25102DDD1181B594070CEB88D9</stEvt:instanceID>
+                  <stEvt:when>2008-05-28T16:51:46-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F77F11740720681192B0DFFC927805D7</stEvt:instanceID>
+                  <stEvt:when>2008-05-30T21:26:38-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F87F11740720681192B0DFFC927805D7</stEvt:instanceID>
+                  <stEvt:when>2008-05-30T21:27-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>converted</stEvt:action>
+                  <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:F97F1174072068119098B097FDA39BEF</stEvt:instanceID>
+                  <stEvt:when>2008-06-02T13:26:10-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>
+                     <rdf:Bag>
+                        <rdf:li>/</rdf:li>
+                     </rdf:Bag>
+                  </stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:8BC7D877974ADE11BCECCFF09938C3CC</stEvt:instanceID>
+                  <stEvt:when>2009-05-27T04:22:07-04:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpMM:History>
+         <xmpMM:DerivedFrom rdf:parseType="Resource">
+            <stRef:instanceID>uuid:32300939-b1c4-8440-b812-b255b7b0d326</stRef:instanceID>
+            <stRef:documentID>xmp.did:F97F1174072068119098B097FDA39BEF</stRef:documentID>
+            <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID>
+            <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+         </xmpMM:DerivedFrom>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+         <illustrator:StartupProfile>Web</illustrator:StartupProfile>
+         <illustrator:Type>Document</illustrator:Type>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+            xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+            xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
+         <xmpTPg:NPages>1</xmpTPg:NPages>
+         <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency>
+         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+         <xmpTPg:MaxPageSize rdf:parseType="Resource">
+            <stDim:w>1024.000000</stDim:w>
+            <stDim:h>768.000000</stDim:h>
+            <stDim:unit>Pixels</stDim:unit>
+         </xmpTPg:MaxPageSize>
+         <xmpTPg:PlateNames>
+            <rdf:Seq>
+               <rdf:li>Cyan</rdf:li>
+               <rdf:li>Magenta</rdf:li>
+               <rdf:li>Yellow</rdf:li>
+               <rdf:li>Black</rdf:li>
+            </rdf:Seq>
+         </xmpTPg:PlateNames>
+         <xmpTPg:SwatchGroups>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+                  <xmpG:groupType>0</xmpG:groupType>
+                  <xmpG:Colorants>
+                     <rdf:Seq>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>White</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>255</xmpG:green>
+                           <xmpG:blue>255</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>Black</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Red</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Yellow</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>255</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Green</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>255</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Cyan</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>255</xmpG:green>
+                           <xmpG:blue>255</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Blue</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>255</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>RGB Magenta</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>255</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>193</xmpG:red>
+                           <xmpG:green>39</xmpG:green>
+                           <xmpG:blue>45</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>237</xmpG:red>
+                           <xmpG:green>28</xmpG:green>
+                           <xmpG:blue>36</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>241</xmpG:red>
+                           <xmpG:green>90</xmpG:green>
+                           <xmpG:blue>36</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>247</xmpG:red>
+                           <xmpG:green>147</xmpG:green>
+                           <xmpG:blue>30</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>251</xmpG:red>
+                           <xmpG:green>176</xmpG:green>
+                           <xmpG:blue>59</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>252</xmpG:red>
+                           <xmpG:green>238</xmpG:green>
+                           <xmpG:blue>33</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>217</xmpG:red>
+                           <xmpG:green>224</xmpG:green>
+                           <xmpG:blue>33</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>140</xmpG:red>
+                           <xmpG:green>198</xmpG:green>
+                           <xmpG:blue>63</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>57</xmpG:red>
+                           <xmpG:green>181</xmpG:green>
+                           <xmpG:blue>74</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>146</xmpG:green>
+                           <xmpG:blue>69</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>104</xmpG:green>
+                           <xmpG:blue>55</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>34</xmpG:red>
+                           <xmpG:green>181</xmpG:green>
+                           <xmpG:blue>115</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>169</xmpG:green>
+                           <xmpG:blue>157</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>41</xmpG:red>
+                           <xmpG:green>171</xmpG:green>
+                           <xmpG:blue>226</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>113</xmpG:green>
+                           <xmpG:blue>188</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>46</xmpG:red>
+                           <xmpG:green>49</xmpG:green>
+                           <xmpG:blue>146</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>27</xmpG:red>
+                           <xmpG:green>20</xmpG:green>
+                           <xmpG:blue>100</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>102</xmpG:red>
+                           <xmpG:green>45</xmpG:green>
+                           <xmpG:blue>145</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>147</xmpG:red>
+                           <xmpG:green>39</xmpG:green>
+                           <xmpG:blue>143</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>158</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>93</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>212</xmpG:red>
+                           <xmpG:green>20</xmpG:green>
+                           <xmpG:blue>90</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>237</xmpG:red>
+                           <xmpG:green>30</xmpG:green>
+                           <xmpG:blue>121</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>199</xmpG:red>
+                           <xmpG:green>178</xmpG:green>
+                           <xmpG:blue>153</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>153</xmpG:red>
+                           <xmpG:green>134</xmpG:green>
+                           <xmpG:blue>117</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>115</xmpG:red>
+                           <xmpG:green>99</xmpG:green>
+                           <xmpG:blue>87</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>83</xmpG:red>
+                           <xmpG:green>71</xmpG:green>
+                           <xmpG:blue>65</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>198</xmpG:red>
+                           <xmpG:green>156</xmpG:green>
+                           <xmpG:blue>109</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>166</xmpG:red>
+                           <xmpG:green>124</xmpG:green>
+                           <xmpG:blue>82</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>140</xmpG:red>
+                           <xmpG:green>98</xmpG:green>
+                           <xmpG:blue>57</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>117</xmpG:red>
+                           <xmpG:green>76</xmpG:green>
+                           <xmpG:blue>36</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>96</xmpG:red>
+                           <xmpG:green>56</xmpG:green>
+                           <xmpG:blue>19</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>66</xmpG:red>
+                           <xmpG:green>33</xmpG:green>
+                           <xmpG:blue>11</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>0</xmpG:red>
+                           <xmpG:green>0</xmpG:green>
+                           <xmpG:blue>0</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>26</xmpG:red>
+                           <xmpG:green>26</xmpG:green>
+                           <xmpG:blue>26</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>51</xmpG:red>
+                           <xmpG:green>51</xmpG:green>
+                           <xmpG:blue>51</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>77</xmpG:red>
+                           <xmpG:green>77</xmpG:green>
+                           <xmpG:blue>77</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>102</xmpG:red>
+                           <xmpG:green>102</xmpG:green>
+                           <xmpG:blue>102</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>128</xmpG:red>
+                           <xmpG:green>128</xmpG:green>
+                           <xmpG:blue>128</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>153</xmpG:red>
+                           <xmpG:green>153</xmpG:green>
+                           <xmpG:blue>153</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>179</xmpG:red>
+                           <xmpG:green>179</xmpG:green>
+                           <xmpG:blue>179</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>204</xmpG:red>
+                           <xmpG:green>204</xmpG:green>
+                           <xmpG:blue>204</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>230</xmpG:red>
+                           <xmpG:green>230</xmpG:green>
+                           <xmpG:blue>230</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>242</xmpG:red>
+                           <xmpG:green>242</xmpG:green>
+                           <xmpG:blue>242</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>63</xmpG:red>
+                           <xmpG:green>169</xmpG:green>
+                           <xmpG:blue>245</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>122</xmpG:red>
+                           <xmpG:green>201</xmpG:green>
+                           <xmpG:blue>67</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>147</xmpG:green>
+                           <xmpG:blue>30</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>29</xmpG:green>
+                           <xmpG:blue>37</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>255</xmpG:red>
+                           <xmpG:green>123</xmpG:green>
+                           <xmpG:blue>172</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>189</xmpG:red>
+                           <xmpG:green>204</xmpG:green>
+                           <xmpG:blue>212</xmpG:blue>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>R=138 G=138 B=138 1</xmpG:swatchName>
+                           <xmpG:mode>RGB</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:red>138</xmpG:red>
+                           <xmpG:green>138</xmpG:green>
+                           <xmpG:blue>138</xmpG:blue>
+                        </rdf:li>
+                     </rdf:Seq>
+                  </xmpG:Colorants>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpTPg:SwatchGroups>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+         <pdf:Producer>Adobe PDF library 9.00</pdf:Producer>
+      </rdf:Description>
+   </rdf:RDF>
+</x:xmpmeta>
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                           
+<?xpacket end="w"?>
+endstream
endobj
3 0 obj
<</Count 1/Kids[155 0 R]/Type/Pages>>
endobj
155 0 obj
<</ArtBox[0.0 73.0 508.0 701.0]/BleedBox[0.0 0.0 1024.0 768.0]/Contents 156 0 R/Group 157 0 R/LastModified(D:20090730214335-05'00')/MediaBox[0.0 0.0 1024.0 768.0]/Parent 3 0 R/PieceInfo<</Illustrator 158 0 R>>/Resources<</ColorSpace<</DefaultRGB 159 0 R>>/XObject<</Fm0 160 0 R>>>>/Thumb 161 0 R/TrimBox[0.0 0.0 1024.0 768.0]/Type/Page>>
endobj
156 0 obj
<</Filter/FlateDecode/Length 130>>stream
+H���-�0�a�S����'	�Ƌv��������,$���<�=��FC�b����8A��-��F�{�(V(�\E���3>�����IGIykF���S><H�朗7)d��5�?�L��3������`5�S�
+endstream
endobj
157 0 obj
<</CS 162 0 R/I false/K false/S/Transparency>>
endobj
161 0 obj
<</BitsPerComponent 8/ColorSpace 163 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 79/Length 284/Width 106>>stream
+8;Z\ui<k5l%"j!.(Yn<rGVB89DS9W38A;imV+n")c,d,Cr$jiKcnTe_@#q%%4(.C8
+HN;BSQ0K3*YFS=EP`>nRqnec:hag&4%a](-!f93L:A4D\h\gZ/n@lX;HcTPGfEHCj
+Q%6lr1C^ia9#<W0(GV,aU!d`IC%Y0XNP6><b7'6om5]6K!.0N/D61*)F/P7m\Pl,G
+gpGL0adN#/Z594=1XIk%(grE!EB@RojEgmQOd52KE0$6o\NS1_@3+<#Mt:Yj;B;Fb
+IK^@:(iq@&!<@UeLT(~>
+endstream
endobj
163 0 obj
[/Indexed/DeviceRGB 255 164 0 R]
endobj
164 0 obj
<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
+VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
+PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
+endstream
endobj
160 0 obj
<</BBox[-103.108 71.3223 103.108 -71.3213]/Length 854/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 165 0 R>>/ExtGState<</GS0 166 0 R>>/Font<</T1_0 154 0 R>>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream
+BT
+/CS0 cs 0 0 0  scn
+/GS0 gs
+/T1_0 1 Tf
+0 Tc 0 Tw 0  Ts 100  Tz 0 Tr 12 0 0 -12 -103.0967 -61.2773 Tm
+[(T)7(his is an A)12(dobe\256 I)-10(llustr)5(a)4(t)6(or\256 F)26(ile tha)4(t w)4(as)]TJ
+0 -1.2 TD
+[(sa)8(v)10(ed without PDF C)11(on)4(t)6(en)4(t)3(.)]TJ
+0 -1.2 TD
+[(T)71(o P)5(lac)6(e or open this \037le in other)]TJ
+0 -1.2 TD
+[(applica)4(tions)11(, it should be r)10(e)-28(-sa)8(v)10(ed fr)10(om)]TJ
+0 -1.2 TD
+[(A)12(dobe I)-10(llustr)5(a)4(t)6(or with the ")3(C)3(r)10(ea)4(t)6(e PDF)]TJ
+0 -1.2 TD
+[(C)11(ompa)4(tible F)26(ile" option tur)-4(ned on. )41(T)7(his)]TJ
+T*
+[(option is in the I)-10(llustr)5(a)4(t)6(or Na)4(tiv)10(e F)31(or)-4(ma)4(t)]TJ
+0 -1.2 TD
+[(Options dialog bo)14(x, which appears when)]TJ
+0 -1.2 TD
+[(sa)8(ving an A)12(dobe I)-10(llustr)5(a)4(t)6(or \037le using the)]TJ
+0 -1.2 TD
+[(S)-3(a)8(v)10(e A)6(s c)6(ommand)10(.)]TJ
+ET
+
+endstream
endobj
154 0 obj
<</BaseFont/OUPLQW+MyriadPro-Regular/Encoding 167 0 R/FirstChar 31/FontDescriptor 168 0 R/LastChar 174/Subtype/Type1/Type/Font/Widths[523 212 0 337 0 0 0 0 0 0 0 0 0 207 307 207 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 612 0 580 666 0 487 0 0 239 0 0 0 0 658 689 532 0 0 493 497 0 0 0 0 0 0 0 0 0 0 0 0 482 569 448 564 501 292 559 555 234 0 0 236 834 555 549 569 0 327 396 331 551 481 736 463 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 419]>>
endobj
167 0 obj
<</BaseEncoding/WinAnsiEncoding/Differences[31/f_i]/Type/Encoding>>
endobj
168 0 obj
<</Ascent 952/CapHeight 674/CharSet(/f_i/space/quotedbl/comma/hyphen/period/A/C/D/F/I/N/O/P/S/T/a/b/c/d/e/f/g/h/i/l/m/n/o/p/r/s/t/u/v/w/x/registered)/Descent -250/Flags 32/FontBBox[-157 -250 1126 952]/FontFamily(Myriad Pro)/FontFile3 169 0 R/FontName/OUPLQW+MyriadPro-Regular/FontStretch/Normal/FontWeight 400/ItalicAngle 0/StemV 88/Type/FontDescriptor/XHeight 484>>
endobj
169 0 obj
<</Filter/FlateDecode/Length 3130/Subtype/Type1C>>stream
+H�|TyPw�ffz �$��D���#hD�[-�o!b(/�a��@e0��E
+D%"�g�C	�Ed=��
+1�M�}�?�l[[��������{�}�����q|�����W��<�U�
+ou�������@�1�r���l!��
+٣����{������g�|6c����O��߫Z�c�he�˗;��Ӵt��9,]�tZ:��(���2�C�2B#�)�RGG��J��lMx�lB#S+5Ju�����U���,���·��ّ|�:'g'[�ev��v/SidJ�6D����*����N�T(#�a�(c�o���ӎL)�d~�*���Y`�b	�5]E�U���%||E+e�d
+�~�g�0��4��0����/1l�	�c��!�R?�a6F=1o,��ʰ���
���d�I�Ʉ`�@!���!� :A��N"�8+�����z�^0�0s6�2����VsQjz��	��M�t!�:�=�J@j��*�V�$C�(0S9�)bϴ�o\3eԐђ�:	Z�����at�H����&���p\tײ��oM�E�x8"3ꇆ:��.L��s���x�J�N8։_�t�%�Mm��N�Dx3��DGU�|_Y�)
	QG�D����c!�����,.p��0�B�"�G8<�"�ǿ>���}"*��|u�ZnM�D�"W~fo7�1[2���]����|I�r�/��!~:?�ھ����[phmH��U�����SZ��e4R�y�
+� 5X���qWA�e�1��>��0Ι�<ȤR�n�v������ݻ��D
+x��m��o�Kh��#��v܃:y�<������1�E[l�!/UXFV#���m� >dY�
rPh�A�!A�ű�.q��Iꃋa�E,�%�@��r���Yz�&�������p�=Je�2���W5���hB��Ud�U��o�Դ�^y����}p!$�M��5��/�u/�vҝB��l��	E����FX
s������"O6u���-vC$b��l@
+�Y�E~��>�h�
��,��<�r�$������-�(��.��m��T�=�9��}��Y�>s1�����g�t��U�&��AV���n��Y� �@הQ����.�����ۈ�c�*�.wH�W�~�^�h1C֗��.��Y��F�:�Y-��
+L��U�~O�F�]^>g/(Irq,��>��gi�^C���k ����Bc!�fvYT p�l�졉�5�-Z����ZΜ��/oȿN���sWH���+c�Vd&]ߴ������,�L��&!R���j�.
��MZRjt$H��ޫ,m���_��䞮O˹�Bx���8T>#aE&���C�!�l<9"�$<�Z��h��dր���h����/���ON���;u:�TVs����gz�iٗH��n�M{<�����'��������g��	�S�&~M/Z����<���D]1{�[��ٝ�O#��Gт�`�u�0�<+i��+��l�3�8��c3@���:&�b5�̬"�ټXf#m�ZJ���v=$�e��Z)�X�4�MIKLMd��-�~rozq�������n���g�t	:�D�녕`ՁW?��Q�TfnF~��Y0��uF�F������ӗ��ё0�΃vX��z6��jϩ~��~S���JP0�}�nXя?��%�f�ȬT<t�k��0%9�9�#�9| '��{4,��+�=7J��6uO9�%�H�V�0ٓ4M�����w��-�jV9�F��S�Ez�j̞ZW	eK�2$�3�nU֗��;���]�^_�11E~�<�F������^�=�
B�#�T��pJ�s(@���32�;�O�j��l]������e� �
|�:�`��-�DAF��|�����O���[�Xt��_
X1����c	�����Z����r0[�|��|Ζ�Aǩ�b�mݤ+���(�\�(.�t9�$�'���U�%'xxʣ��9��C>��:�Lf��SL��ku-tw��*ՎA�� �Lv>SSP]u���]̢�1��Jۚ-��c"������(S=�&�5��3�#�+2�d����,������ 7�*^°�����]�T�=���z�(B[h�eE��2�V@6�L�Q�Nǂb�@$f���1�v�����>O���ޱ��l�=iQ���s����}�2�l�	^��(�߉H��Zo�N�oU��d��G*-��kg�`��"8��)v���!|ϱ��[��RQ�_	�M
_�˅��I"�6|D<��oA<I��Ԝ����9���9��WnT�Zy)�
+��i{~)�$!x63���'(&}�����hg�1̅��H	����_�r�
L��i	��?� ٻbd[��!��������eh1���Ԕ��௤��hh�g���ZS5��_�]�O���"5��8�1�x��ø�Q�o���eb����Ci�hIW��+�x���;��6�cs-r��ve��}���,�*�LT��aɡB�SN	�X�U����s�|��Ilg�F.>ޗ�\�S�:.�|do���uAL�V��e�
[`l��h��'M�8���7°2���RVA��P��IJ���G��Ӱ=]䣌GE�͍�I��hH�F�_wiX$(7��V���;8(YV`��cX2HB�c�*�F�U^���'B�PU�{��"�������ܑ��\����!�i��sǈ=��+�b�3�án;���S�)��M@5|b\�­ �}�>M�zH=�͆uB�lŀ�SlN�3�&
U!12bK���k�q�v�ę��S�V2�x�'e@��XȊWeJ��8`�+=��O����Y/������7p��7:%��p�����n8nQ5|�z��Iۥ��q0
�f~����.r�ګ�SU�aR^�7T�(��o�4a�o45�[U�RY[A���F"Q�-9�v��������
��K"4���-?w����d<4�󕛴�����/�795�*P������}��N�+��K��HI��8
��e�jl�ߵ#�
&���c��Ͷ"�u����X�TGю�׮	Ƅ_
ׯ}
��`���YDH
+endstream
endobj
166 0 obj
<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>
endobj
165 0 obj
[/ICCBased 170 0 R]
endobj
170 0 obj
<</Filter/FlateDecode/Length 2574/N 3>>stream
+H���yTSw�oɞ����c
[���5la�QIBH�ADED���2�mtFOE�.�c��}���0��8�׎�8G�Ng�����9�w���߽����'����0�֠�J��b�	
+ 2y�.-;!���K�Z�	���^�i�"L��0���-��
@8(��r�;q��7�L��y��&�Q��q�4�j���|�9��
+�V��)g�B�0�i�W��8#�8wթ��8_�٥ʨQ����Q�j@�&�A)/��g�>'K���t�;\��
ӥ$պF�ZUn����(4T�%)뫔�0C&�����Z��i���8��bx��E���B�;�����P���ӓ̹�A�om?�W=
+�x������-�����[���0����}��y)7ta�����>j���T�7���@���tܛ�`q�2��ʀ��&���6�Z�L�Ą?�_��yxg)˔z���çL�U���*�u�Sk�Se�O4?׸�c����.����R�
߁��-��2�5������	��S�>ӣV����d�`r��n~��Y�&�+`��;�A4�� ���A9�=�-�t��l�`;��~p����	�Gp|	��[`L��`<� "A�YA�+��Cb(��R�,�*�T�2B-�
+�ꇆ��n���Q�t�}MA�0�al������S�x	��k�&�^���>�0|>_�'��,�G!"F$H:R��!z��F�Qd?r9�\A&�G���rQ��h������E��]�a�4z�Bg�����E#H	�*B=��0H�I��p�p�0MxJ$�D1��D, V���ĭ����KĻ�Y�dE�"E��I2���E�B�G��t�4MzN�����r!YK� ���?%_&�#���(��0J:EAi��Q�(�()ӔWT6U@���P+���!�~��m���D�e�Դ�!��h�Ӧh/��']B/����ҏӿ�?a0n�hF!��X���8����܌k�c&5S�����6�l��Ia�2c�K�M�A�!�E�#��ƒ�d�V��(�k��e���l
����}�}�C�q�9
+N'��)�].�u�J�r�
+��w�G�	xR^���[�oƜch�g�`>b���$���*~� �:����E���b��~���,m,�-��ݖ,�Y��¬�*�6X�[ݱF�=�3�뭷Y��~dó	���t���i�z�f�6�~`{�v���.�Ng����#{�}�}��������j������c1X6���fm���;'_9	�r�:�8�q�:��˜�O:ϸ8������u��Jq���nv=���M����m����R 4	�
+n�3ܣ�k�Gݯz=��[=��=�<�=G</z�^�^j��^��	ޡ�Z�Q�B�0FX'�+������t���<�u�-���{���_�_�ߘ�-G�,�}���/���Hh8�m�W�2p[����AiA��N�#8$X�?�A�KHI�{!7�<q��W�y(!46�-���a�a���a�W��	��@�@�`l���YĎ��H,�$����(�(Y�h�7��ъ���b<b*b��<�����~�L&Y&9��%�u�M�s�s��NpJP%�M�IJlN<�DHJIڐtCj'�KwKg�C��%�N��d��|�ꙪO=��%�mL���u�v�x:H��oL��!Ȩ��C&13#s$�/Y����������=�Osbs�rn��sO�1��v�=ˏ��ϟ\�h٢���#��¼����oZ<]T�Ut}�`IÒsK��V-���Y,+>TB(�/�S�,]6*�-���W:#��7�*���e��^YDY�}U�j��AyT�`�#�D=���"�b{ų���+�ʯ:�!kJ4G�m��t�}uC�%���K7YV��fF���Y�.�=b��?S��ƕƩ�Ⱥ����y���
چ���k�5%4��m�7�lqlio�Z�lG+�Z�z�͹��mzy��]�����?u�u�w|�"űN���wW&���e֥ﺱ*|����j��5k��yݭ���ǯg��^y�kEk�����l�D_p߶������7Dm����o꿻1m��l�{��Mś�
n�L�l�<9��O�[����$�����h�՛B��������d�Ҟ@��������i�ءG���&����v��V�ǥ8��������n��R�ĩ7�������u��\�ЭD���-�������u��`�ֲK�³8���%�������y��h��Y�ѹJ�º;���.���!������
+�����z���p���g���_���X���Q���K���F���Aǿ�=ȼ�:ɹ�8ʷ�6˶�5̵�5͵�6ζ�7ϸ�9к�<Ѿ�?���D���I���N���U���\���d���l���v��ۀ�܊�ݖ�ޢ�)߯�6��D���S���c���s����
����2��F���[���p������(��@���X���r������4���P���m��������8���W���w����)���K���m������
+endstream
endobj
159 0 obj
[/ICCBased 171 0 R]
endobj
171 0 obj
<</Length 3144/N 3>>stream
+HLinomntrRGB XYZ �	1acspMSFTIEC sRGB���-HP  cprtP3desc�lwtpt�bkptrXYZgXYZ,bXYZ@dmndTpdmdd��vuedL�view�$lumi�meas$tech0rTRC<gTRC<bTRC<textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ �Q�XYZ XYZ o�8��XYZ b����XYZ $����descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view��_.���\�XYZ L	VPW�meas�sig CRT curv
+#(-27;@EJOTY^chmrw|�������������������������
%+28>ELRY`gnu|����������������&/8AKT]gqz������������!-8COZfr~���������� -;HUcq~���������
+:IXgw��������'7HYj{�������+=Oat�������2FZn�������		%	:	O	d	y	�	�	�	�	�	�
+
+'
+=
+T
+j
+�
+�
+�
+�
+�
+�"9Qi������*C\u�����


&
@
Z
t
�
�
�
�
�.Id����	%A^z����	&Ca~����1Om����&Ed����#Cc����'Ij����4Vx���&Il����Ae����@e���� Ek���*Qw���;c���*R{���Gp���@j���>i���  A l � � �!!H!u!�!�!�"'"U"�"�"�#
+#8#f#�#�#�$$M$|$�$�%	%8%h%�%�%�&'&W&�&�&�''I'z'�'�(
(?(q(�(�))8)k)�)�**5*h*�*�++6+i+�+�,,9,n,�,�--A-v-�-�..L.�.�.�/$/Z/�/�/�050l0�0�11J1�1�1�2*2c2�2�3
3F33�3�4+4e4�4�55M5�5�5�676r6�6�7$7`7�7�88P8�8�99B99�9�:6:t:�:�;-;k;�;�<'<e<�<�="=a=�=�> >`>�>�?!?a?�?�@#@d@�@�A)AjA�A�B0BrB�B�C:C}C�DDGD�D�EEUE�E�F"FgF�F�G5G{G�HHKH�H�IIcI�I�J7J}J�KKSK�K�L*LrL�MMJM�M�N%NnN�OOIO�O�P'PqP�QQPQ�Q�R1R|R�SS_S�S�TBT�T�U(UuU�VV\V�V�WDW�W�X/X}X�YYiY�ZZVZ�Z�[E[�[�\5\�\�]']x]�^^l^�__a_�``W`�`�aOa�a�bIb�b�cCc�c�d@d�d�e=e�e�f=f�f�g=g�g�h?h�h�iCi�i�jHj�j�kOk�k�lWl�mm`m�nnkn�ooxo�p+p�p�q:q�q�rKr�ss]s�ttpt�u(u�u�v>v�v�wVw�xxnx�y*y�y�zFz�{{c{�|!|�|�}A}�~~b~�#��G���
+�k�͂0����W�������G����r�ׇ;����i�Ή3�����d�ʋ0�����c�ʍ1�����f�Ώ6����n�֑?����z��M��� �����_�ɖ4���
+�u���L���$�����h�՛B��������d�Ҟ@��������i�ءG���&����v��V�ǥ8��������n��R�ĩ7�������u��\�ЭD���-�������u��`�ֲK�³8���%�������y��h��Y�ѹJ�º;���.���!������
+�����z���p���g���_���X���Q���K���F���Aǿ�=ȼ�:ɹ�8ʷ�6˶�5̵�5͵�6ζ�7ϸ�9к�<Ѿ�?���D���I���N���U���\���d���l���v��ۀ�܊�ݖ�ޢ�)߯�6��D���S���c���s����
����2��F���[���p������(��@���X���r������4���P���m��������8���W���w����)���K���m��
+endstream
endobj
158 0 obj
<</LastModified(D:20090730214335-05'00')/Private 172 0 R>>
endobj
172 0 obj
<</AIMetaData 173 0 R/AIPrivateData1 174 0 R/AIPrivateData10 175 0 R/AIPrivateData11 176 0 R/AIPrivateData12 177 0 R/AIPrivateData13 178 0 R/AIPrivateData14 179 0 R/AIPrivateData15 180 0 R/AIPrivateData16 181 0 R/AIPrivateData2 182 0 R/AIPrivateData3 183 0 R/AIPrivateData4 184 0 R/AIPrivateData5 185 0 R/AIPrivateData6 186 0 R/AIPrivateData7 187 0 R/AIPrivateData8 188 0 R/AIPrivateData9 189 0 R/ContainerVersion 9/CreatorVersion 14/NumBlock 16/RoundtripVersion 11>>
endobj
173 0 obj
<</Length 894>>stream
+%!PS-Adobe-3.0 
+%%Creator: Adobe Illustrator(R) 11.0
+%%AI8_CreatorVersion: 14.0.0
+%%For: (Administrator) ()
+%%Title: (colorbox.ai)
+%%CreationDate: 7/30/2009 9:43 PM
+%%Canvassize: 16383
+%%BoundingBox: 0 73 508 701
+%%HiResBoundingBox: 0 73 508 701
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%AI5_FileFormat 7.0
+%AI3_ColorUsage: Color
+%AI7_ImageSettings: 0
+%%RGBProcessColor: 0 0 0 ([Registration])
+%AI3_TemplateBox: 512.5 383.5 512.5 383.5
+%AI3_TileBox: 116 78 908 690
+%AI3_DocumentPreview: None
+%AI5_ArtSize: 14400 14400
+%AI5_RulerUnits: 6
+%AI9_ColorModel: 1
+%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
+%AI5_TargetResolution: 800
+%AI5_NumLayers: 1
+%AI9_OpenToView: 93.25 700 8 1780 1006 18 0 0 45 111 1 0 1 1 1 0 1
+%AI5_OpenViewLayers: 7
+%%PageOrigin:0 0
+%AI7_GridSettings: 100 4 100 4 1 0 0.8 0.8 0.8 0.9 0.9 0.9
+%AI9_Flatten: 1
+%AI12_CMSettings: 00.MS
+%%EndComments
+
+endstream
endobj
174 0 obj
<</Length 6746>>stream
+%%BoundingBox: 0 73 508 701
+%%HiResBoundingBox: 0 73 508 701
+%AI7_Thumbnail: 104 128 8
+%%BeginData: 6616 Hex Bytes
+%0000330000660000990000CC0033000033330033660033990033CC0033FF
+%0066000066330066660066990066CC0066FF009900009933009966009999
+%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
+%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
+%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
+%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
+%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
+%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
+%6666006666336666666666996666CC6666FF669900669933669966669999
+%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
+%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
+%9933009933339933669933999933CC9933FF996600996633996666996699
+%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
+%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
+%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
+%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
+%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
+%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
+%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
+%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
+%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
+%000011111111220000002200000022222222440000004400000044444444
+%550000005500000055555555770000007700000077777777880000008800
+%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
+%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
+%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
+%524C45FDA0FFA8A8A8FFA8FFA8A87DA8A8FD5DFF5227FD06FF7D27A8FD5D
+%FF5252FD06FF52277DFD5DFF5252FD06FF7D27A8FD2AFF7D527D527D527D
+%527D52A8FD04FF7D7D527D527D527D527D7DFFFFFFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFFFFFA8FFA8A8A8FF5252FD06FF5227A8FD2AFF522727522752
+%27522752A8FD04FF7D2752275227522752277DFFA852A8A8FF527DA8FF7D
+%52527DFFA852A8CAFFA8525252A85252FD06FF7D27A8FD2AFF5227A8A8FF
+%A8A8A85227A8FD04FF52277DFFA8FFA8FF7D277DA8F82727A85227F87DA8
+%A827F87DFFA82727A8A8A8275252FF5252FD06FF5227A8FD2AFF5252FD06
+%FF7D27A8FD04FF7D27A8FD06FF277DA87D52A8A8A85252A8FF7D52527DFF
+%FF277DA8FFA8525252FF7D52FD06FF7D27A8FD2AFF5252FD06FF7D27A8FD
+%04FF5227A8FD05FF7D277DFFA8A8A8FFA8A8A8FFA8A8A8FF7DFFA8A8A8FF
+%A8A87DA87DFF5252FD06FF5227A8FD2AFF5252FD06FF7D27A8FD04FF7D27
+%A8FD05FFA8277DFFFFA8FFA8FFA8FFA8FFA8FFFFFFA8FFFFFFA8FFA8FFA8
+%FFA85252FD06FF7D27A8FD2AFF5227FFFFFFA8FFFF7DF8A8FD04FF7D277D
+%FFFFFFA8FF7D277DFFA8A8A8FFA8A87DFFA8A87DA87DFFA8A8A8FFA8FF7D
+%7D7DFF5252A8FD05FF52277DFD2AFF527DA8FFA8FFA8FF7D27A8FD04FF7D
+%27A8FFFFA8FFFFA827A8A87D52A8CAA8527DA8FFA87D52A8A8FF527DA8FF
+%A87D7DA8FF5252FD06FF7D27A8FD2AFF5252FFA8FFA8FFFF7DF8A8FD04FF
+%7D27A8FFA8FFA8FFA8277DFF7D7D7DFFA87D7DFFA8A8527D7DFFA87D7DFF
+%A8FF527D7DFF5252FD06FF5227A8FD2AFF5252A8FFA8FFA8FF7D27A8FD04
+%FF7D27A8A8FFA8FFA8A8277DFFFFA8FFA8FFA8FFA8FFFD04A8CAFFA8FFA8
+%FFFD05A85252FD06FF7D27A8FD2AFF5252FFA8FFA8FFA87D27A8FD04FF52
+%27A8FFA8FFA8FF7D277DFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FF5252FD06FF5227A8FD2AFF5252A8FFA8FFA8FF7D27A8FD04FF
+%7D27A8A8FFA8FFA8A8277DFFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFA87D52FD06FF7D27A8FD2AFF5252FFA8FFA8FFFF7D27A8FD04
+%FF5252A8FFA8FFA8FFA8527DFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFA8FF5252FD06FF5227A8FD2AFF5252A8FFA8FFA8FF5227A8FD
+%04FF7D277DA8FFA8FFA87D277DFFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFA8FFA85252FD06FF7D27A8FD2AFF52FD0927A8FD04FF52FD09
+%2752FFA8CAA8FFA8CAA8FFA8CAA8FFA8CAA8FFA8CAA8FFA8CAA8FF5252A8
+%FD05FF52277DFD2AFF7DA87D7D7DA87D7D7DA8A8FD04FFA87DA87D7D7DA8
+%7D7D7DA8FD19FF5252FD06FF7D27A8FD5DFF5252FD06FF5227A8FD5DFF52
+%52FD06FF7D27A8FD5DFF5252A8FFA8FFFFFF5227A8FD5EFFFD09A8FD62FF
+%A8FFA8FDFCFFFDD3FFA87DA87DA87DA8A8FD5AFF52FD05FFA827F827F8F8
+%27FFFFFFA8FFFF7DA8FD53FFF8F82727277DFF52F85252F87DFFA8FD0427
+%F8FD54FFFD05F827FF7DF827F8F87DFF27FD05F8A8FD53FFFD05F827FFFF
+%7D272752FFFF27FD05F8FD54FFF8F827F8F827A8FD07FFF8F8F827F8F8A8
+%FD53FFF8277D522727FD08FF27F8525252F8FD54FFF852277DF827FD08FF
+%F8F852525227A8FD53FFF8275227F827FD08FF27F8275227F8FD54FFFD05
+%F827FD08FFF8F8F827F8F8A8FD53FFFD05F827FD08FF27FD05F8FD54FFFD
+%05F827FD08FF27FD05F8A8FD53FFF827525252A8FD09FFFD0452F8FD54FF
+%7DFD05FFA8FD0CFFA8A8FD53FFA8FD12FF7DFD54FFF827275227A8FD08FF
+%A852272727F8A8FD53FFFD05F827FD08FF27FD05F8FD54FFFD05F827FD08
+%FFFD06F8A8FD53FFF8F852F8F827FD08FF27F82752F8F8FD54FFF87DFF7D
+%F827FD08FFF8277DFF52F8A8FD53FF52FFFFFF52F8FD08FF2727FFFFFF52
+%FD54FFF87DA8A8F827A8FD07FFF8277DFF5227A8FD53FFF8F852F8F827FD
+%08FF27F82752F8F8FD54FFFD05F8277D525252275252A8FD05F827A8FD53
+%FFFD05F827FF27F85252F852FF27FD05F8FD54FFF8272727F8A8FF76F87D
+%52F87DFF7D27F827F8F8A8FD53FF7DFD06FFA827F8F8F8FD07FF52FD5CFF
+%A87D7DA8FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFC
+%FFFDFCFFFDFCFFFDFCFFFD80FFA8FD07FFA8FD53FF7DA8FFFFFF7DA8FFFF
+%FF7D7DFFFFFF7DA8FFFFFFA87DFD52FF52A8FFFFA87D7DFFFFFF7D7DFFFF
+%FF7D7DFFFFFF7D7DFD67FFA8FDFCFFFD26FF277DFFFFA82752FFFFFF2752
+%FFFFFF7D7DFFFFFF2752A8FD50FFA8F827FFFFA8F852FFFFFF2727FFFFFF
+%277DFFFFFF5227FD52FFA8FD09FFA8A8A8FD07FF7DA8FDFCFFFDFCFFFDA2
+%FFA8FFA8FD64FFA8FFA8FFA8FD62FFA8FD05FFA8FD66FFA8FD62FFA8FD04
+%FFA8A8FD60FFA8FD05FFA8FD22FFA8FD04FFA8527D7DFFFFFFA8FFA8FFFF
+%FFA8FFFFFFA8FFA8FFFFA8527D7D7D527D7DFFFFFFA87D52A8FD16FFA8FD
+%05FFA8FD21FFA8FD04FFA87D52A8FFFFA9FD0EFFA8527D527D527D527D7D
+%FFFFA8527DA8FD15FFA8FD05FFA8FD22FFA8FD04FFA852527DFFFFFFA87D
+%A8FFA8FF52A8A8FFA87DA8FF527D527D527D527D527DA8FF7D5252A8FD0C
+%FFA8FFA8FFA8FD05FFA8FD05FFA8FD26FFA87D52A8FFFFFFA97DFFFFFFA8
+%A8A8FFA8FF7DFFA87D527DA8FFFFFF7D7D52FFFFA8527DA8FD0BFFA8FD09
+%FFA8FD05FFA8FD27FFA852527DFFFFFFA8FFA8FFCFFFA8FFFFFFA8FFA8FF
+%52527DFD04FFA8527DA8FF7D5252A8FD0BFFA8A8FFFFFFA8FD05FFA8FD04
+%FFA8A8FD26FFA87D52A8FD04FFA8FD09FFA8FFFF7D527DFD04FFA87D7DFF
+%FFA8527DA8FD0BFFA8FD05FFA8FD09FFA8FD27FFA852527DFFFFFFA8FFA8
+%FFA8FD05FFA8FFCFFF527D7DFD04FFA8527DA8FF7D5252A8FD0BFFA8A8FD
+%09FFA8FD04FFA8A8FD26FFA87D52A8FFFFCFAF53FFA8FFA85AA8FFFFAF53
+%A9FF7D527D7DA8A8A8527D52FFFFA8527DA8FD0DFFA8FFFFFFA8FFFFFFA8
+%FD05FFA8FD22FF7DFD04FFA852527DFFFFFF847EA8FFA8A953A9A8FFA85A
+%A8FFFD07527D527DA8FF7D5252A8FD0CFFA8A8A8FFA8FD05FFA8FD05FFA8
+%FD21FFA8FD04FFA85252A8FD0AFFA8FD06FFA8527D527D527D527D7DFFFF
+%A8527DA8FD15FFA8FD05FFA8FD22FFA8FD05FF7DA8A8FD13FF7DA87DA87D
+%A8A8FFFFFFA8A87DFD17FFA8FD05FFA8FD60FFA8FD05FFA8FD4CFFA8FFA8
+%A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFFD05A8FD04FFA8A8FD60FFA8FD05FF
+%A8FD4CFFA8FD15FFA8FFFFFFA8FFA8FD62FFA8FFA8FFFFFFA8FD4AFFA8FD
+%19FFA8FFA8FD4CFFA8FD68FFA8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF
+%A8A8A8FFA8A8A8FDD4FFFF
+%%EndData
+
+endstream
endobj
175 0 obj
<</Filter[/FlateDecode]/Length 15093>>stream
+H��Wiw�����y��o�xY��$�my�ı;/{ZvC��Q���S�
�VV��|�����VUW�2�ci��Y�x$e4�1;�L�&������zN5,z�W�U�S���`ukۈs�����i�1��S�:�6'����4����~gMݒ#>�q��3_p�3��|��n�0A>�6��
+����!�=NV�(��!�6[�K�ϯTJ�RrO�t�~�T��a�
+Q�����$\���.�,B��T���"T��Z��f�N��lyM�n����^�4
�$�~�7���9�[�u����AA�Ʌ\��
+�Y�L�F�^I�`��	���w�YJ�������D�N�<�(�D
G�m��� SA+cc���Q�@pdXs<��lQf�`�,�%��0k#��Z��,!�g�@x#��7mbd���Фm�{�M�c� ,3+
���5�ck����jd�C#HŚ�v�?�*q4\E�� ˠI*�f�qj:��B�G���"'�
� ��Tl�	ȐE*�&���{����TP�������"һ�NZ������f�o�*V"3�R!�w^��y���n��RL?������
��;�C��e�k2u�X�܏���hP�+�p��w`o�w����C�Y������\�4kB�i�(����I6wou��u��k1�����8�8C�m!8Q�+��A*�#y6C~a[ܬ���Τmߺ+�oR�2�����<nc9�Fڸ
+hI*� U�b���(���G|=����R�fs�oz`���#�j��Ý��U6���9X&�t>4�xG���}�pa�:¬�l���U�t���N/ܴ�����?B��
+�_�0�/$��1��I2?:YN"��t�n���M1��H�D�_p�3��|�6��
+����iB�d-�l~'�)����-R�Jd�M�b�����zDHG����vV��7X�����-���M�bqr?ҫ�����`�9�tD�Z\7��[P�r��I��HC}g�ٙ���!:�}���6�tǐ.�M�����rSQ���D�bp,�A\1ob&�3lc.=���#@����}~��u�K��xi����3�}�Ͷ(���>mm���,}g�[n��#6D�)�a͔.�
�]�ga�����,�i�C��� ��Q�4I�m7Jaoo�Ư���;�
+��^>�,I�z������L�(ݘ0<�å��u?V�#��Tlj�ީ��Y�\'��΢�����$��e���Jl�%B�^Þp��-���L�w:gȴ-�K���u
�7w�+�p'���v"x%�������KuЦ���߅��3l!s��Ω5�|F���;��ߔ�
����%f�����Z�9b�!�v��a�ѾN���.��j����f[����y�r��M����K�Q�Zx���i�#��Rք�W�#�r�ud��q\OG:NW��ܾp�*���-�Ĉnb���̔TZ%��7,�o!� lG�ͨ8TB����p�nJ%�kZbt��5�}��zu�rN�{�uH7v09E
+�EUD�!`{�h�9CC1k�X�wO޻WG�y�����ܥ��c~��P��l9���i�:�+��f�K����.f�E�o-ʸ��v:��
+����)��vK� ���ۦ&5
�)#>���b��U�EeU�Ϝd������iy�l<�l���S3��H�F�ךc]u'S��''�
+��>#��]����0����ܧD�jJ?�9�:��l.�^���>j���BMz'��i�\�0���{S��%
��j9X�PYIv��(fcK>mt���_6xTL���1IH0+~�Y����J,�,������,�ufJdK��CT�ULu����+45fV�K�L�6���Qm�F ?�J75�����a��?�i��Ѱ��}3�uwO��2	N��g�1�md���'�e��|�e3x�v�k|x�]! p|�B��h-~WńD�E���Gxf��C�1�88 ��]�w�
�� ���0��#������q�8�b��8�ѿ� �T�4�E�%i�9�������9+Y����kx�~����MwQ��s'���8Xw���u.$B%���y'�	&|L����Zc���kڣcjUb�4�}�r��l��k<x���ܳ�o7���l��[g{�/�+%vb棳ƣ��FUG;�j��i��rXzu�{v�z��.1G-6������˭Ȳ]��
����ч��J�[�]�����5���#6E�����e�t�Ý���Z���,����k����^�~_ɽ��*�eC�����Ө�V�*�d�
+����^�i�Ń~����w�nu�2�V?��}����th����5��9��p��Ƨ�/�Z��U�BJ��a�2��a��ȧ����>���m\�����
+��5������j���b��x�4�9��l�u5�2S�>����7+Ϸ>m���U�����lex�����K߬�[��Պ���L_�t�8�*d���6�|�[���.�ǥ���\S8�|_*�ꆱ��}�[4�=ы�]�_֫t=Y��^�Z���� *aRQ�Dk�:�\m����$ ����>����I����^��qV��-O9�3E?�@ͱ���"��FNN���z>�-�����ЫE�"�j�˜�m*&P`���^��6C�[��+�h�e�t��'RUA�F����/�I
u%9B���
�Fo�4�鯤�Q��M�Uk�S'ݣ+Ѓ_I�PPc�R\�m�n^��ߟFؚ���!e�4p��;"]�p��v-��_�')c�neq*��>�>��N(�d��N��c>���2.c=;��ì:�\��^����I��h�r�om]��.q,_���+ˎ:�*���Q亖�2�Q��"�_uM<��i��-b+e3�#-�Ҟ�k���^�_UeAA����5eGI����Dn,�c�Ŝq�C?_�k�Κ�_��z���i��ܫ���Z8���L����U�c�\4�9GK#�:j%0�)�sB|����&��;;���e�l��Q��T�䥞%��9���Gg��P�vL��3�Z�/��@�NH�X4��6��\-%����������ع��79�ȥ��t����Kys�08u�M:���{�|��t;���N���~e]�������Z�t�?@g�+�MگZ��2��~%����f[������!s-5mMG|k�89!U�Plp�b�b	�#�	����S���4cŁ%"JӐgj���.��W`���Q�yQ?��6���Z��hHY���S�U��u�������ؐ�&���4���G^;�`IO�ڛ�B�{X�V
�K�����A*zV�mx���?Z�c"j<�L+R=v�'���m��eQ�YEd���hU.���?MB��{��꜔e�$~k�C�qg��<d
=��\���E��7\x��(�1\��y�*�%��Qlɹi��s�g��M�-�?�
+X;���\�9.�
y�/�bg��(�u�K�O
+���k�����Ƹ��M����Kv�U�jĺ��)9�i����f�g�7���i�������{����s-�?��ҹt�ϭ;��mxʚǡ���z�zs0���nu�nY1�h��Ո�ݴ��dGJ��9d,գcy'6,��<.`��Zݿt���M�t9���\O�gĮ
�. ;�
��\��d�'���b�s����`t.A�m���6�f��jaw�'�� C��AF�?��d�v����M�3}P�>���H�ө����@�g�N����(o��{��3�j�4-�`�7W"��c%e��
5%ӧ�h�\�����|V�����:�7��7��*wD!���dn�B8���뮹���W7��RQ�vsWOB�y�8�f%�pP�`��MCK64qeN�m��:�_�Q|��mnv������;]�ց=IC>��ypEO��bu��&������8ͻ��rv�K�ߔ�g��ޭ�RpX�0MR�ɮ���:m����� ��Vc$MP�N?������A���}.�ʲu�$7́d�x���>S�j�쾧 ����m鬼�'�+7���j��ѧ##��	zU��③�%��a���F�!��c���I�l�e��y۶Vi7w��.�2N6�9�M�N�j����1f5�"�]�1���S�T��N��w��������9P��وԷ�2=�E�h���;�NJ�I�o�e�b���Ùg�s\�Gc�.Xl�Ni�=-��ggJ�!9ȇ/�`�����|v�8��XX�n'CM<��i��-b�Y�M0��L.9�b9}�A�K*K�DR����L���rո�`\��e�����Tx�ș���Ԑ�'��75.k���6����Fh`3��y���Bi<�OT�m�x 
+ͥ�<2�H��y��i2>I�
��𵞤�B��o���Rȇ5Pg�C[�{?r�6Z��hU`�/��9���s��.�)����@�)<Ⓔ���u�{��_�q9�h�U�_"��i��o��+	��6�lC�%H;q��Jruw�,�^���6�z Èg����D�7�^mC҅�L+�x(�W[>^@��Z%��K9��c�S�	_�Ri^?��ʠ$8K������i�y"!�A��oi9�ێ��G`ȍ��h��"��ݸ%��>d�G-Tn�v8��}���.�BY^J��E
7>
���O`�2�!��v빽U�C/�&J���ɓ���=�P*3������1y���m����W_5��
+�f���V��j��m{�� k�:�8jk�&8kA�5�Br~�6e��f��"P�v��>1BX<ƹhE���_w�<��=i�^��*j�,Ԉ8���T�$�WH4�hl��A�{��(V������;�ES����2L�{���"#����i���Ý�!��9�|�̻�������jX���?�#�2�]l�
�,�[D�%��~��"��ƾ���n���lM����I0��]7�z�r�^}ݞ�.`󵗊�{7i�c�'�C�A":�eV��,�4.��ImU�6�i�F��rM_��64�~p�>jg��l2�c�zK�!'�J��RJ}�˕���*��M��{����0�Luz��I�m���k_(��-R��q����!�K���#��C#�8r9N�-Sȓq[/�������W��R��KH�=8!�(Ru��x�T2�{g������eG�
+��k9v�M�(2�����rDgd��,��"���#43ӪǾ�Ѓ��ax�����1V���h�0��L�M4 ݅����е^q�0ZLx~�[c�q*�aatt�1@.��>B��A
܆qq�@�67ӭ�x�Cr�Aؓ�t[l��H#���d�,=e9�вC胈��>Z�o�w�h����+���p
 |Hc���笪@�������O`ҟC�Bu3Y��j�?`-���'%���I���M��F�%x^2�u��L5���ŔY�����\����P��*+$ھ�!qA�����Ө�
+�t#1�BY��P������z(�;�o�3��
+\;7�(u�],g�òԳ/݄�i�J�[D��q'���[�=W��"���2���l����fQ�e���j����ed��?��m�@o�V��Rq�I�O�'(�V@=f�Ms�;�V�!�R��(Lˌ����`�j�@��s
����m_U��1�.K���t$��hG�f'-q>��u͏�B��8��`�4�*������J������ŗi��%��}�f�ky!P�����t��^/������ U�n@����6��"�~fd� b��*�_�F���R@Eϯr=<�QޢR��t1�����0>�
͝	����eoc���`�s����ǂ>N�1
�)P�'�������o\�\�����fr�*G�Tr�bQ��t(�
q�jhP���zV�x���:~�i �։{�kmfsCn_m����P_5�]���^�����v�q;�<F�]n>�r��d贞h�l.
�	-s�y�ėN�Hړ:�0���Q7H�X�+3�"��y?C���=S��ɛ��J�"��;Q$�� �|)�q[��x�Z.CCOC��iH�������J�z�Q�M����#��c�;#(Z?h�Q�`&/�x��S4�A��%7��\�m>��P�Wz���H�	bg�:�V�����(��Bo9Bow���1�Q�r���'{s֗���pdY���;��-Rs��Xvm ��C��3��ỵ�wʆ�$��H�����Y�÷7�0Ŧ-�*a��S�V�OyAF[��H�����8��/�ؾJ_�F�`%Ϭ���7�4C���>6�8E�h�;_#X�h���J��'䣒��a���`z����s�,.R ����&M��P�2av���������Z)����2:1an�1 +�#���hI:b8	�\��sCP��[!o�
+�"��=�[nV@����K�K�����'kx�z�m�~u�[z�������%�ꪙ���(�j�ݛU~�(4�r/����J���Y^�H�<A���N�
��s��P��Hy������#���&�N9��rűL"I��X�b:��K+�Êo:k�i���lma+'7-3
S�Y7����)����F�t5������=S|>+�����6��[F��>'K�߲��p�<�r�������1����$��Z��]1�^ֹ�?��;����
+kx*y�����:�c�F�Νo:w��S�Y��J4FT��<U�	�7x?ď��F��ڿ�n�FGTM�D�y�W���y��6Ӑ��V]<	�,�dk�� u�6��˲-F���XY}#ȯ$�WVR��6���+;���iҿ$M�p �_��k�B�5Q�����N��4G�ֆ�]Q�*��{1O����҄�*8x2MlBP�Uߜ���%qc����4�_:UJ`H���YI���說�,ᢼ9E0$K����[6��s�)��uC��I0T��yȸpV���w$ޡ����F�"uI_;��눢���R<����F��Y�{�?�W��DX6~��W�i��x���2f��}�,����u��k��3҇��$�����,$JKޔ�Kz�v%�l��o��ʩQ&�V�LQ��(����P@ڐ�U�����I�t��Юv�>���u�0�0��*�ԍ�Q$l���Խn�������OԦ����.�'�ea�n��VD�|F���F������o��M�͈o9Ur�Nr��An�
+�0&�^ܖ��3�F��S'H�YlHd��Z��1�����Ņ�I�JH�Ĉ�{��9E�g'�,i��A�i���8{XNRy��ct<Mh�x�Lt��	 �ȷ�h���MEؚ�3Cac��:f+��m�$�$�0�c�1d��`q���n&�4(��˱��F��N�dX�(�g�)�s���K��@�)���`t���A��������R8�ak;��T�|�HpKT��N��:�k�.fj�r�e�B�����s�';1XC����VJ�N����ݡ�@��P���bPŬXJ=�+f�:`���Y�d<�8��P��`�Nt�#Qm��%b�
+�I���(rG�3I5gb܌�XD��*j����b2��,�P��x���K�k�b$�KC1�@�arN	�3��
a�_��"ة�F
+�1Ɖ{�b]���J�r�{ɓ�,$�T�e�s�Jh�s,�3�%n,���pK�Qx40Ѓ		r�"��HYl�/4tT�𡗳"���n�7/����H�X��hϔK{-O�Y���9j1�&r���eG"t�+g��%,�D@oa3��lm�`��l���a�I�1Ƶ�3�LxK&����3)yK�C��Ր�l�M��=B��Pb�����[�H\"�9]h��i\���G0j�x�V���qP
+�&0`�2е�O,
�G��lMB4~b ~�.H��p��颊��R��
1�X&T�酪�ī�[��zp���k�=^ӓ(�B
+��zm�G�O���Y^�=���o;n��ܢ��,QS�4'ϩ�y0�'�-���@��C-��"��"|g���Z�a��b/�KR���E�D��%�/�[[ÿ_D��\���h�K]֬�8��ǈD�1~��r7=�T���2om�Kg"�ᒫD>�Dq �2�BE� `q#�e��e�@����oͤ��O��������護����T�wv�=KȞ�ag��c5�ە���u�?��}�5uc^��;�˱q���F��ZI�K�@+O�Mn���p�(�FВs鰇2������@�Ȫ�b6M���Zt���p����1�櫵!S"�����v��R���E1L�6����hb
�;�S%i�=>��IK4DI���A\��"/N��6pH�^���
+.�����E"�TR�h �Un2C��XGL���uĽ������B"�?6"��hH����g���9�|�v�d��\:U��sy���xq��#���d�T� i�s&
��S�̒���K���:ї�9�s>5(mD�K�T�,�M���E/={���2U��w�/}ށ��gB�A�v� �vR+'��H&r�3��WwDUw��;P���u�����F���}��ͧ�}9>6��1�����?A#�`R�����_iЎ>RQg4��HF�)�������)�4ro`�����kKNX����b����r��Qa�z� ���ƣ6��Ke`I|���>H�\E�&N������&����d
?
��
x�]A&oM�;M��e�R�M��:>��8%ݙ�r��E*�)x�._���i-�z�".����شd�:�w��Zk�����{�-���m���	HB�����D�W������a�
w+ؾ9{Z��<c�o����屐�+5�ޛ��뷯�_G����t�c풑��zmmk��B�l�A�J�Yi�����x9�>UgO@s��*�6 ������i�҄����W�����~�=����ݻFc��Ψ��-�x�j\T�-aX/;˛'�z9�d�s����<��Z+sWf%օ�F;so�P>�;�:E������ݍ6�M���^��W�k�þ��
+�J}�1l���D�6��ryV��hR��$T.x�/*�[�zv��|�)
�^���ࣼ�hnNy����<���Q�<#CX�/N���g'իIc8�q�ac�U��>o��4	��}��m���x�v���_����N��ٸ#��2wZ�i+{���=7�������.>���R��|�и�z8O�K��3����=O�+9��ƾїL�[(��<�=tJ��oa8�}*���w�wx7��]�
}����������b}�/��}kK������:/1e��b�E�h���z���mo#��{c��6w����0w�'��(_�O7�p���SAhVomV^wׅ����A��Z��E$�R���ʽb�p~NÃ,�ߗZCiX���~ٞ�Y{�ہ�Ї��f��nC��S�L_�=�Z[Mm��l����Y����X��&��j6q�L�9,~g���n�W�n+�0���j��w/�%���Z�<fk��M+T�_�ݳѮ`�4Nj�:�A�nlh-��� �\�C}]Xm�-�0�0w�{�M$�6��݆����)3z���d�
+4� �	���gk<ȅ� ������q��Wgc�@�-6�F��
+X0�أ�h4�4�(��owAAX�򅻸��M{3�5��ڵMOA����֗<Uq���[�I�â>��,Q�i�1�Bx�ک��GBca��X��4�h�Z���I���9H�Qk�C�s�H`Q{5zk@U`T�n)\��B���[��|����E���~X�V�N��ܷ@�S�FǇG�7>�6��Pa[Ӏ'�]��� V�<5m��x�Fj�~�HE���:�@M��:USPgN�t^<���?�����d�W�����z���X؈��v������aEPOj牐Yo��Z#}V]8g֊ڝc��5I���x�TPs^.h����:�SU�����
<�3U�ʘu�K��5b
Ps#��OΧ��Zw��9�[�i�uk�3s]#�a>B��`�I�9�[�eMZ�g�?݀'�F��&���[W��f�4Ud�S2KϤ��pz�N'�����/`$n���n�f̧+1�CƢ�?{oL�/�r�ξ��o���ũ�(T�.	��&������s!6����T�h�⽐�T�7���͍&���Y�(�)��įň�l�e-N�^�+��y�
+��{��`qZN�������/�C�8�՟Wki������X�~ﶡ�2a8�2m8i�Fk��������wTF��l��3��/,u^v6���j�"�'���o-z^G=g��>3mE�-���7�F
+�F��
OMz�g�ߒcB��iV���#T((NP�}ý�$O�>�/h厊����j��у��*�dZ��V��~�>��T�&�����O��{�X�����v�/:B���\�;�q�A��}���.�ܐ���5���e��$�nBN~*��
�?�`��N�HQ�wF:�e��
+7����܇V\�9О�I�Y�ܸ�����if!�G�����<�8��l�Ww ����w1�(������	�|xe?:l4���!)�~��9\�Bg�Ӓ ��>[8�g�����F���J,q6�]���˒���m���"H����5��MOǎ�"_L��1��Y �N�Ef�����pLl�&�qb��J�:5n��������k���nu������	a�m�s����ۨR��b�i`r�sW��G3h�i��q%C��s���B�S���?6|�Η�"u; �S�~#��e ��9E�a�R�C~U\�O>�OgE�{ovb�}���r`��[�_��"���⏭F�i����3�_���56|1�j���U)�
rAݣ�L�mWM@��{)�n�������2�W��g2�U�,���+d�e��6c�di�Rr�Qt�a���_`�"�j��P����������їꎤ����6�m���
�ކ,��=�
��f
+c�lPޯ���m���������L��^-Y|�"d����*'b��'T[陛��es��j���VT��ҳ��uf��������9�%����?��Y�$��j9�v
��K����6+z�aȫr;����^�'<��h��R�~�:w)�9V-��v	l�6����Ӄ�>�5�[��H��ʾ�x���$h`�͊�Qn 8�nw��"g�8����W�,g.�a�Wm�`��.H���%�Pɞ�&Rh��ܸ!�� ��M�3��rO�S�,�畋LA3S�𖢇Z<M��7:����)P~�Ty6`�i4��UH��ELJ	b,0J,�
+q���Ʊ!'u�MK��A�7q�ښ�V��]�rJy_���
+^5�2O�c��-b#��dWF�Wx�
d���$��O�5+�Ң*ğ�/��ʴ�E��i9�<�x�Q�]�?I��G�7�o�3S� p����Pr�x͜S;5�>@�@v���#��f3h�(T-
���Q��ߕ�Am�:�������06g�k	:��6h��6	�8�Z��<�҃����ZC#�%���ל�Iؘ�\v06�/
���5,˫�5r�z�6�q�֤IΡ�z�1vf�#;h�U��ۃa`�Zs�������v�^���z�C�_)�=�/���s�]a����N��l��>Tf�F�V��

N鞦a��1
�{���Y�п�A}�-��c�6����d��Zr�M6g]� nK��`綻ߘ[.�̨�Q�ݲ�X^��u�n��E�4�"̄k�����f*�2�a��Pn�{^Z���2��Ԇ��|[;O�ۖ]+_S�shn��K��eQR��Jj5%�S�%Ѧ9s��p��$:�T���.�?ٻ�n�wF�.@�ӸFZ�Y�=��Xr^�q��K����mJ�<�g�&^�T�6�}`������+�2ZZ"�k�$"vL}h�i7�W���HaB�R0J��%;�I�H�6yPg�K���ء��6��
�K7*����ڊ8��L��qu'7��*^YA��ɲ{},��*� g�1\�����PŬQE��%���2Qw��68�A'�6�C����w529f�����h&�����#P�ᓜ�Fš�ע�8z�!���AK�Pċ���P:u�%w�˴ls� w�Bۦu���.'�i�h�VN�.ϣ>1s���Mk�U=��������e�:RW��o�@)�� �R(���^(W,��ow ْl_r�gO�33��|��{�m�C�Qlo�	�n�:�Ų�� �����8�iJ]h�+��b�r���k� fX�$h�8��^ԑ��;��X���e�����'~Z�P\��s��`q���`�O��.[EtzNfq��07R����{un�i[�>��Do���Y)r�3�0nĻ�^�ʆ��ePs�^.Fϐ���-�ϗ	��~XT�@;,��b4�集!�CR�Zs��a֊pcU.�.k����4!�*�p�p�s�/�
c�!Ҽ��L;���k�ěF�gf���t(�Y�~L���)\����xƹT�ұ�;LC�(���o~�����
�jj!��'��L�m���<�l78
+�;g�p#��g��t�� 1e�!������xl,��֤?[��U�.��=��~`5��yZ�Ϙ�<�t�و�sN��`���py�~!,k7��/�دp)�/Y�6f�����%l��C�N'`�S6��ay�q:I83
+,���᝾<���,�W����0k�8��U�C�Vx��s�p�e�����'|��1U(E��v�:�q`�ӭ�~��,����ѵ�8�jih��#C���44�V�f�tnh07c��e�Q�����s3��mh���$/�gx

�u��u�hL��Ѐ�n��2wϸ����`�6�f��

6H$n�YF�ch`���Z�j�����WA��vc��ѱ��L��F�7�*$g���_V4,Cx:��@�O�dzߌ���0��g�Oֽ!Gސ�x:I�C�=Ǔ�}���N;��_VL�'�-�~�B�m��I|٘B�7��Ȍ�%�ȭ���ΰ����4$K/+,��)<�
�����k�Ƶ�dș�⻀g�?���VX�����q��x���.����x^
m�2L,��α����0^�#b	��$����W@L4����sa*U��}h
+3��,y`�J��(����`���47���O�����BzTz�B�t#�F��\G��˥X�A�Mkm)��#a~�B܀�(+��2��ŻbG�w�&�zL�T�H�p������.�ח�_9M\'���oZ�6�[9�|+��	��ԁ?#�#%c����4q�^�?Ⱦu�.��_�T�c\�Ǒ�[B���Z����4vݗ����4n���T>U�+י��uG��W�G�Ϯ}���)���gr�:��ɛ�+Z���V��L�:;�LPT��[�S>�E+��3���<CKp�UI�����ˑx&PG߷	����[-����+�
�z����	6����&K��@�в��g
+�>���%L�-��-S��M�^�]�M5���Nz���>�&�Lg��yU1�1����m�	�4-]�'�/�Ѫ}#��u��)~+[�nڪ̈́�'���M�?��
�'��9��W�����`_��x:{o��Aʷ��U�I��Wŧ���*e� �b�4|���nX�=��_5[6r�=�n��Y��t�������u�:Ɂc��.���F���& M��hMB�S��fʕ�lk��$�V@�����P,�]4���,�fS��3Huv���h�P�i
a�
��`���9R�ٸ�z����V���ރ;�V@�ÏX�ۗL"Tb"�[p��U��|���Ǵ���
u��w�'~Z�P��C7�3�����_�b�p�i�T�Vj�MƩ.���� ���@tq���7�u.Qz��1;W�f���5��L9^en��[�r��.�iQ[+�����l�HN<oJu߆>���#�nT��	"��Z�3D|����	���2�53PF2��ݷj���4޴�9��5䄈�?��˜�M���-Z.wJa��v�1����N�~�f?g9W�8�ת{ZtA�O>�]_�
���b�ӳR�t+��8A�;���3Nl�PH��8	Y�2uw+`CȠV
�\���
+PB��?�O�Wm���������f�P�]TR��,]_V��훨�$�W�co ��G_�#�We+n2�[���٫^6&j\~^�(;(��%h�n���[�i��%H�Q�Z��fI��2�j�A�q�a$���
-;���a|[fGЪ~l�	RH���0��Lq;O�������5v�ƽ��F,����[�;p���Bc�
��#|=��6&uk�}�tGܪ���T����R��
�g�ٓh^�?�<l�R��hW�4�h����W gW8̈�o3�p
�я�s@��m}K�]�49
+?�<�U�0���"i�+K��߼�����$��%�(+�S��$r����&P���3 P�(
b��]R�d���ښ[)L]��
���Ҋeg�;k
OdgO�c��*��R�1C��6D�;\��/��P�3.xW���#�J���j�$���o\֪Ӛ)Z�y{�Ω�/GD�.o#�B�y=�A��43d&���^}sB���U>e�۹����uֹ?.���sfW�9/3��W
S����UI~��Q����i#*�DE
�3���`��]q1*cp��r
ò~l��G՞�Lҟ9b��g�l�"%$ 

t
+(��FS1�ݷn=Z��Û�uN̍0�5��@Nå��ʔ�5�2\���_���xM^zn��D
��ί��V�'ۢN�B��]Ա)1�����t��/��4
+endstream
endobj
176 0 obj
<</Filter[/FlateDecode]/Length 17828>>stream
+H��WYW��}�k���!B2� �ai@ڡ���UUB�P_j�m<��{��,�$�_�h�(�EZ������ՋH57��d/}�p;�M���~�g-���$�b%������n�zQ�k��W>�?�h1-��He&DK��$4z���;��F��6��+�]��r]����p z�	]wԘ��T�nZ�M���d�_ס�k���&�/���u�J���ԗ�ڔ�'L2��!o����a�.����� (d2���9ss*�B���Mq�^��3$W�_��N�	�a�����SL�mL0/a%�Sǈ)��0�W����#�I��m�Ū�d�F��7D�Hb�qn*�g_�Y�L�L�}'W��~��սV��Ч�W�H�P7�X�.B�9���"���R��m-r9
�����U}�������.�[����ӎk8����MMW�(����2'�
+�1��u6����
n��8�F��
VC���<���{�,Y��w�eZc����lW�~��;���X����6���@�D�����N�}�GƘ���ҫ�7{�K�Y>�(fN�x�D�d��_$�4v ����@�o\������ᣦ�I�Z���P��;΁�Zq
���@�~��@m��rXi�Ɏ�����IvM�GK!���i�h�j��+ |%�F��\�
+�����1P��1�S�l��M����[C�g3��l@/���z-s��X e��ͅ�!3l��b1���M�V��{��"HQ@Kj�U@�0�Z�BX"��}����2�A��
L"��`�h�!���5i��I�o�I�ך���hOg�����c̟��j7m�i�pp����{����[ơh��hl`�[͋o��ܘYT�U.��Ux�A��lV~�wΰ�>+�㲲����K�V>�u�|�,�}�ʦ4uɁ��p6pYٔ�Z��$�	:�������e��&
+U����I<V6�;�4KV΅h[V�����d4��1��*3��~<�����Q�͒adO#�C�G�Ť���Jk.��{���l�!1.�a��6�X�z���s�i�5��	���`Q�?���9{�ȅb&�P�#���4����C�1�%@�l�S����K�Q_��>Q��pT��2�5�hl��U-����'8Ku�ez���Tqù#�ݵ��$�T[�L�|�&��#40��z����2)�Xg[[�n���7�^���϶��kZv'

�1���'	����ڸP�'&���Sy��?K�rn�T����n'*�M���|���ŷ����q���A�����saR���l�������˗��^�kM��$|GU��X�_�W��J����Rv0��n֮��E�|�n�@��8��1�(&�B&}�,k�-�~��si:�Wၺ|�=>oe�Qˌ^+�{��foKmo7��Y]�]�EX�0�-tҫ-1�z��J�~�{�7r�_D� �:[+檏#me������$���T2���TxK6���~�9v����1"i���n�L�L'�d��h�p����$N���w-���,��EG|���M�9��5x��R-���fnjFj�j�M֎L�˦��v�
+�J���@�
+	����)�I��.���W�5�4L��S����m
+��\��n�IL�h�Z��o��5�&�S�l-�/���Z���	�a���J��O��q�v�q���w��ӟ��TB�+��;��Mރ�.����`��)V �����H������T��B$�K��u}��TKꍟ�ˍ_�X�O���#cks��x}�u�g���H�}�|}^`#��v7o����u�&S���v W��9g-drc�p60�M���xd
+��f��lk�������y7�H�aTi�'S�srݏ�j��{��Rn>(B�M����Q��ϐ>�u���3�����rzь�s�t��F�^G.��Э���%�7�k��t��k�-7�Y��l������sk��Ս��iD`]�fj�]9GD#0����`u�z�Z4�\�:c�	�ڱl�0�����"�~S>��װ:M�z�I�B�l�^����I��V����p����C§c������[���1Y��N�^�C���R-s���h.d�:t��0���`����+Zv�O�d�[=]Ek)h����Bb����[�����,q$�ˡ ��%v֜if��h��6�Ǡu����&��-2x\�M:6
�7&��U��:T�<�b�(WW�ښo46\�xӦo.1s�E�{U0͂.�"G�:-�����k�u�Ż��@�`�\b����Ff6��7Z��;w��D�>A��m�97=S�f��f�r��s)�7�'6��2�0Tv3,H���2m�M�z)߳ߦ��MX�kG�Z�TZۋQ o���7k�d�#�~
�Xi�!ps���j�dc���n�GR-�7�\0,7~�c�>-�����+7|v�>����X�c��f
+��� m�N�憞�֬ݘ�\��qi7�ܒS�(DE��(���m�X��A����)�s�k,K����<^k��p��ʊ���+y�&+��N1��΁�<4���X�����|�H�L}c;�̲�[-�龱ڽ��A����
+�S�;�o�ɕ����K^��&�К�F�F*3a�Fk�	24�t����L�{��_��y��b
tP:.���F#W���Pʵ[�T�HpF�O|FA�-S���=mW(�'�m�l�%0�?^-�~���୎$ʉ�;P�r��X�ֵđ �,L@@D�{ @t�뀺�#��vw�t��N�O��ݡ���S�~�׹��Ƈj�t.����n}�N�t�l^����m���P̧Y�ԢL�휹��E��Ϭ���Ǳ��Q�I�al����Z0QhD�FZ裨<uq�#�L���"y�qڦ�<z��=-�lo4S����+C��w��WY��aڳ����̚�l�����*�����
+��W˕`�4rmPSH����R-Sx�P�kh���ۅJ��M���䭮�N���x�"��P�oK�B�
+F���#�n( okM5��oAM&"�
+�����(�,kg�Z
��Qw?�g/OHC��52��6GV�|���$¦�tG��5��U`tC%/~߰�]�N�V��!}�{-�V�����=�s�f<���b$��[ 6b��^h5P΁*���z	!��A�E��s�xo`Դc�8�Z�mk�2��6�*��<��(U'�r�7�7BG���!�3���9��@���=z�8��2�!S��f��@����}ҥ���>�jRC{=�A�i��^�t�~du�@@��
+ih�m4��0���F��ŷvL�
m�����4��oO�M	������;�6��rއ��q)��Bؐ���=ܞp���{٨d~����~��w�~�&,�k��jT��6ǂ��%�!I�4�y��7ayHu@R}R��K��� ��U��y�%m�0�C��x�|
�	�p@�i�[!|�s����x���O�ci�p����Ã����.Ȱ�f��&����e�M�M�"S�j�ض�dIr@H�C�0�V2n��[�Hӂ��%<�xY�Ji�������d��s����[g��m0n�Vƞ�f㺕!6�oe셺��G��Un�31l�4A�底�
+_㵕aH�[���qn�|4N�� ���T��d�V�GE�y���z�L�����o��t�g�M>*�'�6^ʌ��'A�X/8���y�X�8ZGG%I�d��)�#gC~s��F�5a�NS��7�Å࡫E>���H�#��sT0������/�I ,�n��.���~�Up�N�:Wj�ͅ���j��ܶ�%T�
5��e��'�U���u�]w���^k4�B~���$�3��{^����޷cl�B@�^�6a}]1�[HOFו��ü�[dڤ��@�嫣�b�$�D/m�J����R^�Cȅ�P�Ob�;�*����.����Cщ��h#�MU@����sv����&�\�4}y.ժ������7r��_�y>ʂ?)�rr-��Icz6��*}��S4��]��y��Y5Fŝ6��:��q�*��G�C᜜�6���?�j6�
+�R �<�o}9����DI�W��:���)�L)�>_[���r�$��z��f�
ǝm���M|1���#��<;����|�~l4����ȏ��"�={�w������F����VH���y�K�
��ʳ�,9���=
+OH��7iju�f�
+w7`(Ph�&ލ��F���s�zc���8sU����b�Ȍ>.Ͻ�u�V�C�@Ģ��/�h`^��g�,�-��	)�4k�E�h�?��3ÍU��iY���}L��)b޳�\�9����ų�K�!Z�_����i-�J v��J}U���_���L�Ґy��$_B��Ap����i~`�b��/��-�,��(`ѥ���˔/����"Y�>/\)���(U'�r�7�7BG��ŘM���q���7D���&�m��ʭi�M����72��Ɏ�j3d�@Q<��^�pk�ɓ�	��~��W)2��;�v��P��P���m�P���k\n$�ul�s�:HO�@!���	a,R��s���;��䣘�p��4[��(��^g���.�۞����@��ބ�U
#�\��L��Fd��j�4�p6�Z[N��q�t
+J���d@���:�\�zw��W�.3�7���MӢY�J��.����P��X�\��uش��Rw���*�K���B
+ҘѴϬ��i'���Y�������GP;Ґ�7>v����A�>�~z+�uRu�7�z�t�)*������d�Q7Hc��c<�����8Ij��4[����%�Y��x��)�Y�CH5!�,K�2�Uɏ���������c��
+X�(K��*��� �<�E�^�k��,Ll���/�7�~~��6=���%<�xG�&�&/��æ�b6��~�;�@$�K���Æ�%��2�>4g<�[�������ʀ+��s�p��+�ۨ�zI+��9�l�/빕I�VR
�<��U�Wu��Y��:	6��@��3{��ewӣ����}&��T��,�0��E�?i�4�R�{E�!��0r�L��� �F	�$R��
�AL�й�0��Cئ��k��ܯ���=44�*D.=tc
Ms�Xy]���Pl���C��"(�����,W+��.n|�D뗪�>B�-5�7x0y6M�U&��/i0�K�ƳU�V�I�ɲ9�H��{3]��X�+�p�$X��
+�b?��%$�tX�l��C�o` ���(E�;r:l��Y�6u��[-q�	rCvs�XҀ2�l�ƽ���xoJ�[ӂ���{z޽�4��� 3���jA�����¥���D�3�`�ƢB��H4pQ{T�R���E�4ͣsJ�}�r(�V�C�k�]������׾���I��gK|��c�s�B���/k�@�v�d��m-�\�aSU��ӛ�4	{s���Z+Imܓ�/Yv{Xb���i���x�{�q��;�H��an�}m:�O�ظOɳ�u������[�Fh���#��{��gց��X8lcz�_5��GQy�'LGΖ�� ��æ�v_���v��	��e�Y���)5�t2���VJM�i0��Y��cP�e1\�1o��ҩ;"]&:����.��T ���1����V�d��48x�F�.V�.��鉨�Vyޖ�҅�	�}_�կ5jY�� ��F]߭�Rk���Q��/߼E��Pw�[J��q�\Ȫ��Ϛ�O#�����(����'��^���Q��Ė�`��4�%�vAծ�Z����Įh��O;ƽs�]ι�
+��Зgn��H�� 7W\�&����Nk;{����ȄG��.��c�H��
�"V�s��}||[
+ѳH�/�Ũ��6����	���f��~�=�K�ױ��?�^���hݕYА��b�=An��n����>D�Ϳ���L���Q속������kk�#��$nRB˫jV�w{��-�R��a���-��g�\�4;5�����ܫ	y
nk8"?�9�����
����^Ы���ڲ[e��[���S?!B���c�H:t���������l���z�b��Ǻ�LL��ot*�g����k�
����e3Q[�V��gpe�k������∗w4w���v}Ӹ�����e�=h��r%����$�UL� �
+~����h��g�) �}���3�����[���່�B����4��&�̎�ݰ�ـ���M�F40H"Ȍ�V�k
+h?��\�����
+
�{"�rAG�&-�R@(�V���u��;���+_P����>��O�tՠ�mA�
+�-��|1���`ek�X
Z��/X��Mn�����;���f�;
�@Bͱ��P8V�Y.��G���7�l�<��}��'+�=$�]ce��v�d��׬}5�����r��>���ؚ�X։&�7�M^����1���f��)�b������6V͘#铴�	xf7+no1�����*�
+�(ճiq�l��*��?�w����Z����_�\{4Tr��D魅�{�����ȡ�װ�#��Š�w䟄d�K�*uk��g&��@;��]���M�PC�"y'i�t�IH���-���K���I���-��P�0&)�j&�+�{�=�����/z�f�ih�Zo'�
}:+oƺ6G�ow���&T�У����pht�6�Sx��<�2�`�8�%�&��;���t��[����Z��kn��߷��E�U���AC��8���9��A�+����b��S+���Db�Z̔���m}�V���l @��A�W	���<�|�{9�������N^g��
+m�Ҥ?g��{�C.H_J�7�3�f{�j��2��<����ӫ��4L׋�/����%*[h]��B�ܬ�}`x(�s^�ct��u�ӈ#�9MY�@~Y���9�4�I��6�	
+
�i�{ �\y@�ş@��,��g�*�l*�Ti�>w%�|�����h��r�@�Y��v���nt�ō�+��諹#�o"��ʺ�&�:�\�+0#��1��˖;$:� g��Kq�L�*:�z���H�RJ�ܮ������A�b�
_�v�u=@�\1����9��>������\	���G�
+����6����zָȢ�~o�l*��s�
ǖ��w��d�V���;ON�E:}�זs�95W4�\��B��,�?B�@������
�J����u��W�j���@['C��.z�M�P��K�.4��ΆMp����EI�1}�D�ig��;��EJ��YW������
+G��)~�J-a:�c{!{P�zo$0�ў�A$��/��睡_*�Ò}�މ+Ʒ���3vq#Օ�&Y�Yl&
+�/b��y��4�]�Y%l���*�����ӊ��'���K.��P�U��4�8Tb�(�k)|�Ɵ�R�B���q?Mđ�n5J ���c�±�6tI�}��T����pή�p
+�]�Lg�
��E4b���@|g��/�d��&rlz�Sյ��?]C}�HOO3q��Q�%?�R�*f������)ˤ8j�6�4�B4�cCXx�-�,"��j=h�N�x����9l�='V���!�i�(�1wy����*�K�ϥ�?��R�����i���e�&��Iȶ+�t��%!S)?9��%�lC3-5�Z
+1o�����
+M���k4�5~�t.��I�SW�YG�%W�$�V�sa��|���R*U�ù�;���JH�(��Ϡ5�<E6c�{�l\14ǟ�ڨn��tR\l�T�g�3����h*��>/'%�B�!j1��-zVg�(�$��yfjN�p�)D�+N����.
 �U�s�����a�'���J؏Ey��{~�Sk0V�T��o�� ���4,��j����@��~��:̈������Z�����o5�i����u�w�1
d宷�����JU�t�Pi�P�걏�6�6�h�1+_ܔ���$�e�"+���ع�ŗ��zLP��dQHat��g�'�a߄�z�r�#F��6S˔��
,��4��qH͎��w��g_q�mH���WQi��)���X�ז���6�5.��3B���\QTpd�)ԇ<�ǉ�o6����R;W�F�^�i��)m2"��_w�닱�$)�0!
+3C������a6���4����[��Wg[�J�-R$�0HO�#��*`���g��E�_x�]vfvϜsƇr�B�N7�ɳ1��fS*�?V�k`���g� �>���U�~�|.&�2%6�`u���[`�j1��C�9L�kT$��O즲s5Ug�xX�uh�%��@b�Nf�9�4͢�*d����8
I��8��zи#a�B����y��?�O������YyY�MT�m.ߏJ�k�<�GUE�,��Ӽ#�󚕨���[��0���R�
+a�o��x$���>�Jz�q�'�SS�����υ$/-�!������f���^N���K/���,���}�"!��>�@nlO��pxi������c�JL�d��CO�޸`!�ve�:�B�G]�.��Oki^*VIt}��j�k.ծn��5A���q��	��U�����9l�?{_�+;\L+f57�LB#�>�F��)Y�y0����_5��y�q��B��b�8�U���-<�O<[W��[3F��]=[i7*�䊺A�U��%���3S��g��̤+v�.���zq�K|n���zC7�d�8����)1�U01��JM3I����O
+w2�י\���vE�Kd��q��>){��
�~X�͎�E�i��_�V$f`
��wh��Y{W�=q赲���TjK�QZ�z���� -ok��wn7�mEdWގ~f1<�+�����U�K�72���f13C]6�ѝ���w˘��\D&����Ƿ�G���Sө��P�T��c
+�
�0(\����-Z�B;
��i��z���&����)]�oT���)�&�	�ɟ(z�T�a�^f�<+�j*�d��ɸ?�藱X�����B�o	m=��g���4�)�=�&�U͉�Cb�[����a��}���s*\0���a΢���#��&OpF��;y�3Yʄ��(���j�CƉ�pe��I���K�~�u���֞.�ya��h]���~Tɨ��b�\�����2���G��� u�>�)���lv�e�����Z[�6tiG�c�&�%����Cg<��dKƄ�$�;�9�p�n�wN��
+��w&�F^]0��}L诼OT�����E2n�cu�Qg�@��.�
+�73dxK&~8�Y���ifՖ6�zݸ�Yr6�D�ʉ�ΐ)YyLs��Ԗ��K�2tG�d�V8��7��F�h�?�;�:Iu��tnC�*�\[
אj����Q���`58����mɍ#=���Y���wF}s���qA]ŰUd�n�Dmi3�\g�5���l|&0��N��-���z�b�q�������^Z�F��J��^5��'�o@!�����Hݼ�AN�f�#`g���4�w�h��9��u�g�5�C�ȕM��Eb��'M���nG(v�?�ϲ�O����ݾ&W��y��w��Zn�K`��_+��Zݹ�jmis��C��f��Z�g�Z/!��hi�B��JN��e(8[�>���i\��s�Ф+fũY�Â���������!%�r@�B��w���d��/�5ĉ�	�{��j&x9�N߉g�ޔ�W2��H>���%��
+�n@�����&�~R���>!��}"���xi��L�s�������؜¥�3��v�8]Q>*߫�e�y��>X��@l�(y����L`�2oh�7{��%��Ѫ��Æ�@�#g�P��7���^4�ڱD{uD�EN�{9�-'4x<��i��PN(�1-�8�c�ܹ*B��ͩa~vU�C9!�y$������i����.�:wsj�sB��FZ��R^�H��aN桴ɉ;���OQ���I�cZ����z#-�פa�U­������a�����������
+�[��_�ȆT���չ������o���ܴ{t��0/��M�f��U-�y�l@��t�f�Q��Om[�v�aT��B6٢ަ��Ź�Ⱥ�ɂʉ�����)0�Ë���CC��	�>��O�
+o����Ȳ3.v����I�D%f%�P�C��
AB���z�'��\��]	�d��(��o����_K��M�`͌��W��0AE�~ZW��0���A+�x���!��J���Q�B����U�l�@�S*�~�Չ��l���.�W�:�j0�Ea~��_@�
+W�B�Za�ӷ�E�Ow)+	a��{�Z~��a��J�[��|�
��qu���8kݧ�Bkg2���*�[��ULb��E}}n�#�+T�ҝs�5q+Y����7X�7{��ò'��=N����c��m��*���@��?To�7�dY|ڣ�R,��.�>J�og\A���o(�zĽɲ�_�@w<��
�74��+\]V��
��lk�3�X�F��zA��1�F�ߥ�[��)���!e�j����S
+������u��k@�����3�v(R��w��p�X�-��qC��F/lDY��v����oB�9W������ʚe���D��]@EqDv�Ql�m7�]#����oho�̝��̋�teV��sN�^q�j��`������ƕc9��ߛ9�A�_A�3�]ʲ��;��$k��q���<�_�9l\���6ku.?7��VC�fc������K��V������=�z�|�j�w�%��ѣ��W7�IhMf��\�;��-�O�k?�,�#��݇�d~�$�>��.�?	-��)e���g�Q��@����q��,���>;����т0�g�hq{l�D�v��p��@�T�DT�D
+��QqU!�<S��r3ֆq�ũJ��T]�'$p1�\*���_Ek���c�H`E��HI�������7�b�8��ː�=�#lv���Z��a� ���H.b8��C
+@v0�dp���:����-]ce���%+3�I��P�M�
a�	�l�V��G��t�C�TTƣ�3��<K���X�5{p��A=�lp:U%����(����1���xH�4���3@˝&duVy�؀�u��>�%<��5!���[���/�J�
+z�X>�I��r�f5�[��5ױk��Bm�L���G@�f����GA�n��n4�ݼ꿥�x�xb�+��!B%	k����(��9�-S\��GuT��9� !��ե�c��e9�y���F�'��R�g���{��+c-�*�>��F�*���q1��h����ޮm0���ϔ]G�R�Z7,isE�9ȅM�]dp�z�e
kS���^�[ꢤ+�����^��҈�ɲ�����*��Ш@�b$vI��˅B��:��������(�(���-_2/���G2���= ���𙃍j�҄�5;�ѫ��&��w�]�Y �2�dՋkb���Q�5߳��A	�[��v��@h��O�<�e�ͧU�8�A������:@���.M빆�H]�i�U���E&���y��1O^q�՚�u�I���r���*��C���7O�sLY�jE�q�C}h�Q�<�{d�Kt�c���Ǩ��Xt�ԣTގ~ۼOMπ���ߟ
+[t��m�9�\R���f6�
��Aȍ��3#�j�Y�)�FK͞r5u��=�j.
+O��"U2[�4k!Po�|5����e`SLr;�ǔ�֮8(��,��IJ=~��[g-M[��li�!b���D�n98>�,�����l�k@b	L6Oٸ��1W<�(�BƢ�:6��K��$�����e�-�^�=�$��d������6����Js���z��9�Su>�NQ�LZ.aF�'�.l[�?�v{zt]��N��t��#�n�˹wM���g3V�\/��^�^K�1��b���E�vė�Ů�������J�u7�T{�oڕF�}��6{y��h��r%/��!
�
�`��q�]�⊊��g�vmܘ��n��)�q"ť
+ѝS�J��⏹�Z.�MՍ��6�8�C�\�U?R��}8��{���:����Ta=��V0��
H+��3��*�b�\���h��q�{'�)�C�������fIՏC�6 �[ĭ��XRa`���-��"�MDz�K7��<��N��9�,�2�"}��@�b�֒in�r(D�� �A���t�x�8�cc.�B�Y�
+a���f�6��R].L�#"������%u��b���i�h�N�,*��l��c�|X�侂]�Y겉MZ0A�eM��<Ӗ�a��ث�a���s
+��K�va���BO� �V߮����Gԉ|UΧń�7��Ň!���������?�l����nv�u��f#��#y�IG*
+;{D�Q���a@�:�P_������Z�*m�����5�Q_�VLt_K�m*�<:�i�h6 ~)U󲖠K���>�Qm���v���c;Ri)^�M��wc!�{��~�����}D�a;�����tV*9��f�M�V�Ѵ"�=�0�x��@Aw�[?�0���38����^�D85��eq{^א��2K&&�,�7�˜�Ru�֪�g�������F�� ο?�X� �*�EvG��sP�inc1�B�&��ͳ��Cp݄����;8��
+�^)�)�u|nÓ:��u�]c���B j"������/Ru�\)�FȪb�j%���ԭ�2�:��p�MM�>�������Էd�N|�/k�X=.f�����/��/a��4�ӝz4M���,���ܞ�����'�PH������B���~��°T\�
+�A`�lu�ѭ9e���^���*A���*b�b�K좉=�]1v������r��x����ٙ�ж�����?8$��M�<��S�Ȳ�	�2�
�5$��QS��Rj����.�_e���+TX�X��t�=*XFQ��N��0p�Ak���� �_d��Ħ�er1-�u��n����:-RhI͚�d��{�6��c2R�s���k�*$���L��A��TH�s�wƿw�Xh��DJf�Y!�L�jEV��X8��bVe�w�9��.�ߐ�&$�P�B-Vf$P����!�#�M���zгh��չO{tf�C�j��N����4��>��4�wZ�	��&�\.�v�y��%4(���I%t_Ϝc�{�iW��ILo��}
+2y�cR�����Ȫ��1�P̍�MR�����	���Oc��Ii+���pyF�~��\�'��������������%Mx�{���7[��5Ay�K��F��e�#+�
+[D��ώ6�cغx�3�-�-_��q���Z~;o�9]���Jc�,�c+�:���J4����9����Y>�V�0t�ϱ��x8���J47���9�C���|��Ĳ��Y>�V�0�����ӌ��sl%Cg�[�����|��D
m�,�c+1�9����G��|�m屵B���K$��n��z��VD]]�>
+��]ˁ��Y0.
+j��Ł�ǵ��Mo�!k&Wm�}�k���]� �J��nG��&W�2y��Ӡ+>�U�&з,�H�����nJh~����(4d�{k�
+��Xx�½V�w*�/�-:1�&��q���"3��)��J�Zn0��?�vcZ�P��cz`��.��8zjՄhͱ�W �@�$��]����E��D�l�E5�mZ����R7���JߚN~|�c��-K�0���F3/|�1���TپDRF;��;Rbn���8��Ö��!���NO٫��I5�>T��lQ2>ܑHreA���N���䩿b�M�	�&3`Wi�ZxmG,~59p%]u�z�YK���gr����2$E�L�h@?��)F���!:@��/���rE�g��N�+ԣ<���C��>�j8ttCPN�LO����d�[�qaW�9O֚	�6��遤,Ӷ0(P�8˶%(�u��5�Ss���e5k����t�;����ּ<çyy���'�
G�������
+Ne;=��d/OY�=�w�0����HTlM��:���!�س�l�1�~�An�FΤ�fTf���U�>`jJ�*	�Q��m�'�c2��*NJ,��s'|���YC�ַ�'�A�	,����a��dE(�c/����/��CuT��7�MA1FH&�Y�Hn{��
�����S\�PQ�o��8
+��0|��F;�)��[�'�K�����!��G�@j��Ut~�5�٥(�f�ى"��b�\��8ޛ���WD�[DY���I�"�BNM̖�0G|~-,{�Uq�Ѝ*�D��u7v��i_0?IUA|f�׋!�.~ƸRy��1i�'�Df&3Ϛ/�C���M@�|m��אX���b����D��UL?[�1��%��k���
h'T�����y�	��ۃ��_Hf�������㳚��%���R�X3���jfI�=<+O���t��r��Ab䅳�7�:���Jl�l�-`�X�a���
+[��rx
/�N�*\�&��o��VL��J��2c]��ہ��d���f��Y�Z,�`V�*A���L�b3�?,1S��ԛx���y�Z�U����}-9�	���6P$g66� �1
+PlĊ"a����Ķ�c�C��i���0�#�Qr� H�0D���w���$�igy
֪ߐ>&�����	�-�C/I!]E�ս��(��C��:�i�S�f���N�=����}_s���x���UoҺ���r
+�.9��qZ��ÜH����a��$n@S����$}t� 9�Ċ.�������}؛��0P���in�l)/��E�%��)"��w�Y�)��@ߜy=�uM�����~�i�x5�y�G
�ܶ�i}cA����)��MU[U^/m�N�΃�.�{u=���^7�[״S�=��~��+����$��cZ��˘��/��a�p�)��m���x�i���ڻ���u�x���
����:�D�����6?M�9�2�kc�ND�ߡ@�w���#aγ�B�9|�8����qs.g���3��˸C��g4�L���-p/�s`U:zT�����@�|�
+��I�`
+���2���h7}u���B077|l���5�ck�M��MqѾ�_[��{}l������ÛM�$���o�o��h߉q��i��}���a��.L���L�\�mĂ�y{X�`�G��A�b�^H
+x���j˴�^a���?���?t�Loij�W�x��/[|�.��:q@�u?���Tr���A��3�º���;�
+�ݎ`���[�|g23s��0���յ�:�C�o������'B�3�OCC�ih��M��f��|�h��gέ�/�\��-ioIKK�
+��iT��N~�BڱSz�W��� LM�j<^�'�E��>B �c�Pe�SrN�֢pJ�>�����P�K.D��=�4�Z\�Bϊ%Vrk��lБm��g�K-�0ZL��K6�)���7��W
H4�[�h����H�{E�Sd���pr��M�+$�zK��c8��N�[�U6�\Di�aNɺ�����f��W��4+�ㅋ�����W�*�b�z8�r/)f�/��b��W
��#�G�u>��4x��܉3�}��r�ꥤ|=p�ɐV��y�6Dܵ ���k�n��*Yv�������W(K�{��Y��Q)-�x�R��P�!�rRԗ!3H�_���R~��i���6���܀��o�ꨙ��f����~�����L�S\(�k��t�o�i4V��݃r�Rټ�e FGu�� 2�d4S�
+��hH�~���D��8��d#1J���H�x�UQ�����%����q(�������3b�����F��5?���5�_�F��V���FA/�ﰇȭ?�Qv]��ʯ޺h�4�A>/QfK��0N��J�_"��7!�o��1*ח���Z%й�@�9�[�U�΋q<
���.�p_�lS?��Og\f򭨲4;y�k�(�G�M��>��hʆ& T��1��"|R^]����y�7傓�O�F���5��������^�����O�����.�NK"h��w*��I�E���6�փ��[�|�}��PU�]��4�B�*@IYͷCen'$�l@ie�=�|�9D<
u1��*X�Zu,�H�j���b�Cʓ��_{��O9N��cx�§i.!y]�nOz���ID��'&�<[�����Ū_7�_�F]��þH��Fʷ�@��n#�,��
+-���	_О��޺R��H���A��P[Z6ڍ�Z�E�����v$���,�"�ї>k��C��}O�;���V�Me+��2Q֥��I=����5�ʖ�T����,�k��gp�((���L0�S�z%A�x��v�*/]�a�k%�����Ë:>H�"3pT���:�Z�2�Thz�8�/z+f󻶲�z{?G(�ascds�[R��䗹������7r���h,xBM$o�4P*�����ey�g6�g)G&��P���f_]C5k�V<��Q�
��df~����"~�B�.<xG��H�~��G0�S�o�cV���������7
+@o�j����',�څ>�]�*�<F`SY��)��N5�U�����Y)�c#ȭ�&�@t�����L.�Ͼ@BGV~D����@@$��sdhK9cQ��!4lNʡ�b��'v�X"�%u�[���2�cF��.���H�9
+	��1�ֱSBm�D�IƎ���V�~#�CMr
+Mr�Pv�h�����`���*_�2���P)W^��
cU�S'=��GLZ&�<�g[���tP��S,B�����6�ϢIhSp��9-��z.��0��ҹԓ_�r�N�SΙKs�O)�IAK"�����`�5褿��/@t�������B�E3��	e��<�Vz}
Z��$��V��&]*vMU�Ǩ����+��i���ҍ^�!f�c�,�.Ƿxɀ)J�������e�M�Z�I�����2⦀����z3�q�w���|$r����k �Ҕmpo��.7A�B�����f��1ړ�ys{8�dO=�]��D��:�*��塩���M��	,�U�j�>1Cu�SE�-ҋ5����EP��qdh�v̇NSn5ZZ������J��a��Iy�f+5�����/W���n�wAQk�z����(˕���\;���?��"F�F�,<�HZ��񟸿�X}J&��j�ܵ����'��e���{E�r�y�V�8�DN`9�J`i���2�moѫ�������bg�dͶK�mcj��?|�m!:`5$&�K�O�=�A��p!H!�S7�ҢË�n����	bˡAHF���>���A���
+w_ ��b/�pLb�?�tU�g	�8�EB��gXd�������7����
+?7�[8.g��ǁ΀�Y�F;�=s�ߐ4M�7�e�;�}
+)��ei��x�G��$Aga�M�<���2w-)�e��(2�[<T�&��R}M7�#���y��`�����@}��*MY�b��\� A z������:۹�y�uJ�f�Z��N�(>lPG&��`����c���slI�1��L1Ҟ�-���*���ۥ�ex�IA*���bqM���nJ�ʮ�-��H�u��MB'Y_��=�[}fe2���#���?�R8Ɐ�2�
+endstream
endobj
177 0 obj
<</Filter[/FlateDecode]/Length 8499>>stream
+H��W]o\�}���2P���h�$(l��QE!(��:XI� #�����{���n�"Q��{�3Ι�k�T�;aev*�L�:�(�T9�0o��>�?>zq�����/�/>��^�&�;�8>�������/x�2�wY���)�NP��d��LQ|��z+V*c�wl��>�m�I��,C0Zx�e�6��V+M~�2���7#��ɋ��e���m��S�c�D	v��gvX�������"yiB(1M���Fy���$�7!��@I��Ѣ��b�	P2��g��'cL�qb��9ۉ��	}�!5z�
#N�[>�	�q�*�5�d�ȵ�J�r��������f%�6{��o�#(�\��-
+�!+�P�����?-~��_�C�.��S�0cV�	CLL�:��R�$�bg�?�����_֯�6J�i
���6
�	�*	�!�L�^88�n�⠔��\�7�D�&~|��=aAI��<O@ݝ�a-�͈i
�,�B�8��C��V�lV�z�:%��=k���Ѝ�� ����
+r'�=�ka�!�B:�tq�
+�70� +���� �T�P��YdCJ3o�H��r_Gt��A7sg��ڦ��lu��ei�HP5}���r5�{*�f���T,X�|�R���\�+g�&)����������/�>_�>m^�_��B�R�%T1h�?�-D�H��=�9	�r4h]��� �>ajd�����"��,�
+ڀ�<�)	���ˁ�# ^���������"��^�B�+�~{}��������D��9������xwÿ�d�߉�ӫ����O����������F[��	zć�]��!sn�'��Ą��Z������
+ԣ��j�A����^��M}��/Z|��P+Yivo�*���.+��t���6�2��*#^P��|�v����s)3�)L):.�ZF�mk
+rI�4��aٖ�H�x��2�e�;?"�è�*��b1l�U(�� =-¨H������z�n�ώn��5"�ø�Q�i*��m]��ؖ���CFzeAlԺx�	u
+�i��"�bة��! (rl݅�U��� ��O�Ġ+لeˠъA�ŀ@��'1Ri��0�Ũ[h5JÁ�`�G%w8���5����5R���1I1t����h�A�4�K�ɻ�vs<q2j�Y�x�����89;;���r�����.+�*�����Ck]<?��8�2�(����竊\��h�LWT��A�d�e.�}�I�+�d� }������(L�T��A:%��2|�V9��2|�^���2|�f��x,-��S.	����<L���� �A	��$xI����#0޲(7�2^_hq������C�s�].��x���g���]n8F��pp�z���U^|�F	����ݭ�^���a(���$��kx]N�(��/%����[�LЇґ��0��@R�Z�h�
L��e�Ķ� �N�+������j��M�}$�w���[Q:���[qU�P��-¨H������z�n�ϮQ�������ؔ�]�,` 6�A�|
+y*��퐧\8l��E��X��Ho7N)W������sO����,�5�$0���Z��V8 ��`G�/�5��.���B�=	�VH
�*��b8S-��5>}iJ7�
+G�yL��3"�]���S�q�b��eM�3x?E��&>H�l�����2�tE��Α�A�x���F>H�0]�)�)�c��*������+Ç(v-��3����N.�����!���I���ux>_�破��Hh�q�u*����Y=tFn��h�8O�.���ǚ]�5��RUZƨ~��!:&DA�ϑbx9c�zAHR��`k����
+��^g��\���S�0�V=B�vzV,��R�W
+��7y�R��d6����T$�0j�B�%��(�J����=�����0^��i�a�B����o�菸~e%h��?��~��o����*���4F�Y;=Xd�"����CdB�+Ba� ���X�ă�v�{��g���t�:y%�f��xT&�E'��p&�E'V��pF��	w#y^'܃�e'�}$�����ߵ�{`��F�TFz}C7�T���2.oT��v��MR{�R�:��e$0$e
+h���F����0������P�t�6	P�\�S�F�Q��`W�a莦�iWC�܍S��PQ:��TC�0pcb��񏑨@�5Α蝛Ǧ<
+����Z��i�
+��W�����e� �P�oB�
Ov5恁�l�<0���#`���L���@?9u��md����L�j$�s��u�[����86]^X�Ib���yP
���1cl-�z =�F�3t�rH���H�q4,l_�����U����M��Vϱm�EQQڀ$嚋�g[D�����`�M�*�w�Qp���:��t�\`r
+d�{��g�HL��0Z�Y��X�P]M��w���>��ǥ��k|��ý_`7��r<8υ��2BT[S�|ڢ
+t�JUl���e��#�hM�0 ��^ ��uIm�����ӲF[S�K>��-�|�ɶ�}�ߑ��oO�)������W$�����E��^ax��
���G����	�����E*�!�y.� �"	�7�"����\D��!�y.R���q=vm���\, ��c.N`˕��~ΧF]�s�<�b?�d��>��Ȑ�;��_rq�u�ő���_�1VUW����`T$�W#140��y�i}�Rc&�)��ΐIcb�/	�i�Ӥ�4�
+��ƘVZ�?Ƥi���Ѵ8�(����>g�}�3�^�3����|����^{�������sO��e,����%>��!C���0��#&4��:
+ְ[���g�B>���B��D*D�{Dx�F!c�}5��e5
�������YI𴃄����AA�	���IT�}@$.�4DYK'`M��\V79; !>��ic��\���<P=>	|�������8TY�����#�
[+�;8�"m8�ܠ�+�H,}�?�R[��3�^�<
+CmM�LM4-�XF*㊣Y+Sjz�+�S�����a��&�qD%��3q�1AD�6}z#_�gf�$��u]H��G`��\B���C?.n�z�����ӌ�8=��P)�4���Gr�67������n)y�j]�f�fUsRX�-%��0'�3p3��y��ᖒUs�Yí$��R��n)�����Z�-%v^�+�;�G���O'��g@�����t�ž��,P1[�^X�S62Sކ��+.���4\:�W$�yf1��؈����ݟ�]�;��yj��.4��^�i(IF R��o/�o��k`�������/��o��o����f��:�	��q�<�	�Fɐ�q"a�F!ؽ"x=�{J��Ӫ`t��N@X���E�c��:a�
��Ŵb����2K#A���p�4��eu���1=���R��x-�Ra!�N�@�;Жe,�*'#]����,4�R���q	B�B�yU��!b�*���B��E�$SG9�H�K���EY�	5�^����Z��B.4MV�*+�L�i��5}����)�mȆ_Ҫ\D����НmT������փ�K[T�I\
���Z�.y=���E՜�pK)�:�I��D�fN"k��T՜d�hK鬹�%��[Ji�����p+i��E�f������y�IH'5\����L�5��q.# ���'�
�nf3��B�]��0��������2*5��;pTb�������1�Sה"�d�G�☧hk��ʃHDhdK~*�Wz�r 8�
+~GRJ[vI¨-;�
+�;
+Kk�*+�Ŷ�8Hl_mZ�k�)7�FRl,դؘ^��g�Wj���JcݘTI*M�� �[ �^Ǉ�M2fEm77�܂���,�ٓ���O���-���d��[�#T��$
��K���Mn)�P5'��[ʩ��n�{άvvo/���t/��(�4^�(��i�v��x=���[ϤX�m�m��۞bQ��7o7����-���0Ro�*E���ԥ@�p���P�=HWbZ�j�q�P�f`�@F$䬋H�E�Siik0�E*Q���HweI�T��BA��0p��1x-�̼�p��i0�S臜��p�>BUW�"Z#�R���O
@xLH�e:��Pb)q�	��8��i����h7j5n��lE��R�{�i*Z�\�E�
[=���5�G�k���+��F�@������TӠvv�(�C%Nt��D�\��|9Df�K/�(bQ�^���8H��$b\nI\�D��s�5�� ��O��2�I.���**o����,[�9J-�7�&,YR�aۈ��b��)�p���$�C�Pb`2,)�/�1`�b�#�8�o�5
��'-��j8�Y�8۰8���!
,K9�(L8�v뜡���/1�^������Q�\��난�w�B��!q"$Y���X��A����2c�AHj
� ����["�c�P���|���d�L�QJ8k�粺�٭�����m���:���m���"��U��B�񞂫)칡�i{FFa�jO�о�P��:�|�0� A�&
؀�A���0�}]
+u�,3��8�D��P'`-���o��:EìI6%�lz.�����O'`��6'�����='`]W9��0�ˀ�1���?��Q� !���<��ˡ�q��2%�B`�
+�C�B5A�B�p**��D��g����g�Z:L9� <o`L�@'����RP9�1lI4Äq
+qʃ�&��<�>��~H��Q�
I�: ]�3��z�~���|3��<�8Uըz���F9���ڎ���;^�=�����v���ò_��=o^S��cx�k���$����]3,BP/�?�
+�E�Z/�?��V;?=����
+�������n�ɲ�}r��h�9�S�ۼP���<RjDl��ܞ���曋��Uq)Y5%�!�%�f�dU\JVťdU\JVťdU\JVťdU\JVťdU\JVťdU\JVťdU\JVťdU\JVťdU\JVťdU\JVťdU\JVťdU\n&2�D<�
Y�td��X)Y����7#�!��y2ߤ�Y�/�F���̔�X>sɭY>?�vq�G��[�h$
wvv.��CgV
Vwuu��6�����NGgWϢ���������%�{�A'UXؽh��=��|pphhh�'
>�⾻���*�݋�޻�G�>�8��Y������z�ήEK��Z�jCu˖�Yٲy�3Ok^�lq�ޤ��gɽ�֮߰md��}�L���5���yxy�ޤ�k���5�7��{��G����#_�?��'�޽��h����0r���o����S9y❷�8��X5x�%ݝ��w�������é�?��칌�=s����xd��'׬���=�+�>5������g_L^�����?=����>�=x��ށ۰�7����W��.�2u���O?x��Mdp�Wi,�d�=���賯��<=}Փ����~���w���̆�)g�Ʋ!�e��q��׮g���/�?s����kL;yvrj�ڏ72���ɳ'�Ol�5�N?u�����ٔ�q}�҅s����4V���P���<��FC�*5J�R��(5J�Rc�4�~>�F���h��p�~f���ę��\ɛ2�|3y�ı	w.��g��w����~w5g������_~_�����6�x�O��˩��������/}�������_Q3_����i#��x0�1������,ۻ�����H�4�T�ZA:�{>0�^_�i���U�BE�\�����Z����P[)�B��xi%z%�҉s򂜈���z��nL2״!W���f�����;��e���G������ǟ�TK�\������s�f�։]�/^�����_?���]�}����~��WN�׉`-��>��Ώ~�?�ym}]���˟~���w�_�+kQ��m8�򗾚|g��?[\��j���������{��3N�����?��]��;S���f�<7;�w3�.��|������v��E��/Ǿ�H����p�elt䍋��p/Y>G��vio@��v�ԙW��G�����Ӽ�E�u���?�v�~餓Q�'�^�q������PW��lY�/4?�,V�~�xs#U_k,3H�"CMmi��-�{"�d�W��VMW
�^�^��ʷw�w��vj���Sa���{�8I�I�������I��D�$&H��Co���pp�C?�Q�ơ��g�
+��q;}��O{�x:��NpwY��N����^��Ѝ�|r��2��d�@I��������; wS��TM�l�ZI��T����ES�EXL���U�^,_�R�G�(6B1��]vz�Զ	��x�79�I����:�S����$�-lB�l�J�$Y�rQ���b����!���xXJ����vW��Md�t�9L���Ӯ��x�vHS��B��7B�/ �y91��İp>qE(��l���΀�bZ�y6P�����-?��#
��������Gj�},��r,l��
Th����N��{i��:����y���y^��<F,�#*F��~Fwz�,H#>�7����qx��=��Vh��p@w!����2��s`�r
+��b�T��s���|�$�'�#e"��<�⮤��+�����ȓҫ<9>���H�7�
z.9���3�KI��>�A�WI�u�����R�>7C���W6C|�r�]�$��9���I�=���ڤ!�K=H3���w{�]\}�x�s2�I��V�g��Se{����"=&��F*�Hu�qJ�T��T�<��
+�T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T�<,r�AJ<,㨳����y�S='�>�Q'�<��ȃU�t��騂=1�3Ά���)c-O9��C8��N���8�
���
ƚC0�z�R�FQORTC(��'LF}����`��[,�mV��]�Z--�T��P]��`�57Y::.��8�
+ �.Gg���\k(��ӛ���v��'�F4D��pO7goo6��:yc]S�#�	#�)QL�����Mu�� Uze���������U
s�3S�i�?h�P&�� ;��01=�����հ���0?=!���F����[:�c��kٕյ�

�k�+�k��XwgK�A���HZ=��|������M
;�[�׳�B��Bu��k�VWxdjae���^.wKE.��{cseaj$�j�j�ԫ�k�662:����{{?���"�߿����83aۨ�ꂣ��ES�Kk�{�w�i8������4��rֆr�8���������A>���<'j�����\���O���|��F��8P�h����֝J�;��#=�i�������������������w���#�����C�厨8���������A>���<'F5��������݃{���m�-ͦ�T�Y\�ڽ����Q������Z]���mT����Z]ᑩ����{��-����͕���������1���8z�����ͭ흛v��6�g�'���4�A�����;����]Y][�а�����6��uw��$G��h����������rV��������:	}U�a�,�`���������anvfj2-���$;tƺ�vG0FFS��V!���!:ڛ����D�&ss����	G��
�h$����ۛ�&�4
8����d��t�X��<*�����&s�A�D���jl���Y��v@hk��4Ru&Cu�G�MD=IQ
�(��0���Ztz��XsF�^�S��
+�t�'��c��:���ѱ�Ίý�L�$�$a��P^�_�$�I"J$�С�H�M���88����(|��d�3x�$8�w�<~�����;:��8����qr�(�ԋc�b��0D����X�W�Ơ�;�>�O�X���I�]��R����^��k����<K+ս��Mɠ(Cp>rXE��<%ET���/)�C�(6B1��]vz�Զ	��x�79�I����:�S�o���$�-lBYU�xlBٵ)���D��J"�j��E�x\nw����D&M����	;����7'e��0��W�QAJ�vms�Q<���!��@Q��M��tRz������"��+��n��չ���g�T��UM]���7�j�^'�&8X!��=��G�6A��E��r�X�k�Jz�A8Ң��'��حD%�/�J������K��c�8�����W�tT���1Y�
+�E�{u���>&�6�B�*�C*'I��߲��LQ�3�%�3�m��`�SH�
+endstream
endobj
178 0 obj
<</Filter[/FlateDecode]/Length 15049>>stream
+H��}l�U����6�%,_�4-l�;�-�]�v]:0ۊe)w]e]����bd��3��2��1,3G�� ��@��p��5? K`��@�����wY����������y���1����1��F�����7#�����?R��cMYaXgN
��T4\Q�����0Z��S+Qӄ�BIQ�T�b���P[B$LZ�#�9B��pMh�%�)JD��I�x1�!A��U��
+�Tx�����~\�hQ�b)��} 1#�	�$(�@^�$?0m�-�51�z�U	
+�d�XK��dM�\�H-XNh�xc���5%e#�B7T��U~vc��Dp.MjBkZB�^�X����6�*s"k����5"���Hj�,�lL�$1"	��G�閕����`�U¹�U�IT;�sEi`i��-��gՌ���6�������yj�VXp�$1�r^R��s���b,�"���s�F[a4��Z
+if)	RÔ+(Snwu��R���=�u6��VE�.I�Vx3[��V�E6=�Ѫ�DR1��Bò�شt�C����VH3[!�V�>N�=�晊�LEJ��	���:s2<��>�9	L�pgk�[���x�#��.�z­�1tZj}�fb�B[�Ԧ�ͥ(���XPuz���Z�٢$�q5Ȫ@|�Ѣ\�E����sؐ�#��s�f����=��d�_q^q�*��f��w�<aR A]�:�
+)&�
��,R�Hδ[�eQ/�A�W��I��8D�_��$`���!��$RL,%	���v�@"ʦ�4B��Zx�q�j,,ʆ愩.����H��q��v\������H�N;��'�W�m����Ӫ���I$X	1�c�t7ʜ���tU����lRB
+�`���X6�+$�$�XC��@>�|����@���D���0�*�� �x���`�v�w	c�䴡�mViP�mmoSE�/���x�~<܆�Lâ0a)�pwAs)���b�WI\���U�}�
+�X�]��[�]��k�w��U޵ʻ�gy�1��wf�r|nr�t}f������v9r����}xچ���!96095ѝ�VNl��^W����Ao��6���p����H(
z�ƨ�usˆ?���?������IO�B��8i:�(���zw!9ooj[pş��n6�z�b�|�9�~��v����
t�{�y�������c�����?|��A���H����Ͻ���/���}�7�k���M~����z��?�|�ءݷu:\�8��W޺�����'�����Ë��>�ԫ���ι~|��(q����z�����~��?����ͬ_��x]���ϟ=w��'��㳋�(+�:~��3�utuY�0	N6�����C��o�}Ǘ�M����{�5��kp��8��	^��k����v�jz+Z����ɐ��f<��*������繱X�״X�r�Ω�kxrz���F:4�ŉ���I�}S��vMNok�����-S��xՐC����V���l������=p��am1��[�����' �N�w�0u��=��Be��&Pq��pbTB}�UT��C��^M�����@3FE��Ʋ�>/I�J�e��Q6��/�Z�ٌ�����6�HD��4���$�<�$�z�0}�n�N-	�wjqIidZuls���U������L�:Դoy#PpN������N[���0�7Q
+	�p� F��*¨��i���W�FB�S!T2��%F�L+��@,����B\!�E���KgcP�P�����`W�Yg�
�53�Jc�5u��, ��"�?��;�NCE�U�s�����H%ʢۉ�-���9(ɯ�[�hV�[���P�[�y(r�Te;��QԬ�te��}��P���B�{�b���3�WĦf�C/��}pw���=�Kr����V;��h��f
Y�`�ؒ��� ��yc����oKR
N�YpJ�P*��PP���t�@��Y(V�|(Ó4"��$�E'���h���*��QUV�����t�Eši�`@p��$P�Y�21@���[��~�C�V��1kQB)XVdV���%	�8	Y)vZo�K��2�w
+�Tq�&T�N��Q
{6\�����N����$q�&���^�0�bIG�]+=�W<���ǌ�"k��]',��R�`�cՎ<�[m}k���4�]
+�'V��AYhw!�{��.C=�lT���cjF|�����`����H���CeHf(��{�?��EB���r�f�I�0��V�b0Y�6;�Oc�����Ksm��f�~ٞ�V˻����(u`����vAnIE�[e]�����u�v������V�*�ZE\��kq��"�clE��\�����������۱�����r�<���+��
O�Crl`rj�;ݭ��69��>;71��l/G�
+_V�%,E��Pa�7`�] �ݗ����IO�B��8i:�(���zw!)����W���G��k�:ͧ��֮\2����F��+G������%��k�:~�ԉo��t��3<�ԯ~��K���C���G�~���|��[��yt߭78����y��{��ޟ~y���=�@J��~���>�x��O~c�3N������˻���g�������7��kG��7_{��K�ۮZLo��Џ����G�]^Y��~��{;�k����HWܵ�s}��p��Z����l�z�|�_|� VMoEsp&�o��&Dϫ
+w)�`A\X޶�LH3�?�{R�|i�	+�m!��d��Ng�tҴ]�QQWJպЅ�`]��h��bAWR7���<��s�9��)�
+.$���������繯e,������D�6��~P%�;��G���7�����G�/Σ�[O�_�i�a|��q���֥y����6�����|���afp�A�cU=��|�=߮AޟΞ3���PE��K�/F�l��GN�\������֮>zj{g���8CV̝tu/A�P��~8;�A�z!���B�\tǝR�@b����8RD�B��	�H�I��Y��J� 8f��eѺ,��r�Ǎ�L�m-q,4�ID�w�p4@GCEߨmHߨ�D���
���Y��
���ј��N���C�d`�~`��G���?%�y��>:E����5Ƀ@p��5��a�g;у��۰�q>b=�L�h�������Apt(Y�tH=�E=r�=b	���D��IT�\^�q�q#��=B&9�CD�Vt�B�j�{U[�j##��:�}��W��*�?/�sYN)^!B�T�W�De��Q�sT0&�˲�&���c:&��_�aL�w�c?N$o��«�֛���R�����Xd6I�/"�;a�`C��&5cD~�>D~k�ɹ#�հ���+�ܷ޵�#��+�q��1��8�J��^9��7�#Kϫ�{T�q��R�,y��U�����;>Կ7Ӎ�tc0�L�����R;���>��~^�:����R��76׏�oK�6�D��)����ǳ$�0��ƣ�XT�s��}иϾ�Z�M]_?S[m@�¸,��QL9���zt�,`g�����y���B?�p�-����\�}�W�|pq=�����~���7��>~��W~����}���;��sW�����ϯ����<����>��7�������³O~�ւ����{�����[o��W�}u��!j���_}����|�7?���'�݇�;�韯���W^���N��[gg��~������/~���C���f?��������ɳ�?{��ŧ�?�̗��@��k;[��/���فy�[?�ۓ�>x�n���	q��EL������T��8~��ht
��a���p'>������氰������yty��+;
7��67._�غ4��x|��f[���c2�8�
�~�����O�����5�����sf�����{)���ȗ������+`ᰰ�t����GOm����CgȊ����ErCRڀ�~8;�	��!����+�-G�@�c3рvv�}��:i��d�͙2�`v�T��a$�҄���ir�a���)�V_�S��2h��N��(�(��YLC+LX��"`�N�;&um4�L0L���M0U`���&��w�q8�R��#`��kFp;�Q��J�ԋ@�&bhl�2��;�Rǂyk�B�4na��!8���=!Ӡwi��8��F�YGW�A�Q�/�P�7)��b�B����
+�qh�d`H`��+�a?��ԮT�F�C��"��, Gj�e��P㯗���8��@��rHCb�/y��A7����3���ZzY-�U�):���ŧ=�j����]������k�q��"n��V\�
+gPwx	�JC*j�c	Hr&I�P)���9�g�H)8�n���s�|�2ۖшx���Յ�J��Mj��Jv^��%/�i�u-׾�E@6G����!�c�[t��g{�w�85��ȿ��M�j��x�yD?��(�0mht�dCCk��C���"�z�N4�rd�ֲ!*hb�N$$�H���E�9x��\�D��+�-IM`8W2�^�"H9�V�ʤ��
�aL�*$J<���4r`�!)�́��2����@®��	�D�̗��;ى�T9����$�h#w/�p�_��
1Ԍvs��~��2�CoU=&+�4]�{W`?NyTć�%��n��~�]rzL�&��$�j���|9�F���d�QB)G[^���+e_z��J%"���1��4�)Y;�8�;�Z���!/R�����hnV��l~l���fA�5*zY��l��%�R۹s�^���S��U����I%_�Q�����D���Q�Ԣоh�#=*�����ɾ8�b�X�
+}�
+k��sba�dC=�_cэ*$�-���(+	��%�aarA�)1�*���&��2�V�	*�3+`� ���!
�L8lL�!
���ډ�7&i�F����@oB}����ȵ�ꉀ�=ZZGs���mۄ�c�l��Q�5Y?($.c�:b�4�=��׬N�<�ƿ8���U����*������L�mh������eVۯe_;S��hC�	HwI��؛#.Ƙ���d�x7*�
+���(JLSR}<�J�<~U��7�$�H�59%e+N�v"gw��o��9I*�)�>�f{u
+"d����`�3�������C��|��3�p�p?��E�b�[rG�i��q0�oO֘R���@�Ȫ!�h����id���tA0Q+���?�#!TŒ^V��މx8��W䙦�,����k��,� k4�j�e�,e+ҟ�M�2�����5���z@^$�@�b�\����cT2�d��*�zF�U����*��v�n�"����J��wí��5�4Q' I?އ��Fr�}6��E�I��&[5_i��_/+)";q"iq�R�J��%/K�A7����E
�P��B��j��jM�y�cj�iO�m��:nW�l�y�iFYƺR�b��]ф*��sH��r,I�bK�P)���9�g�H)H��{���+̱�U��W)/�[](��ޤ�>��a�.X�B�F]ׂp�ˋ�"f<A�-����!�c�[t�ɻ�� ���x���P����y.
�"J�
�n���VS~����E��� �I�AX�ȋ$��r�D���&�P�D����\gU�y�����^�0�kk)ۼ��';�IT����Tj[VY�ީ
+�dY���{U�C��>աZ �f��b����<�΃I�%��/�����k�0S�i�6(:��̙8�03��؛@iPR[��[}��IK|m���'S�X_����}��q�}]���1a�3�|��Zk{�o�]��GBݳ���z�d*�raC�v����"��1��?� �{�$s�FӴб&S"�+�^�<���@k�t�	���yR�������7]NYG�Q��0-�d�xH]q-r?!�~�����5v�1G�^�<ƻK_���S����%S���T��]�"p�1�β
+ҙ>���s��,��%�����8�R�\Ļ�j�L)���){z�(�k����L�W�B�Z�J/��ai��%����"6��`���Io��4-4��R�k�k������a�cS�=D1�Z���N���!K�B�w���`Q�W7v�qf��o�i+Zϴ�5�v�}�d��ڬ4�1��t�(FJ�?�4+\��7lXax_���9�P�"���Ⱦ�gzH�g�M�BÚL����O�RJǤٗ�3/9ImBB��:JA�h)��g���[@�8! ,�DG"�D�%0P2�
+��;v[�B����$���n{wQ诫^~�]�,���.�ٶ�١�[lssg���@�5י��Y�vYl����~�Ə<;�~�_���DsOg��+~��>ڙzltv�=��bn/G`���#�{�)�@m{2���ߎ�t*����>u��g��֗�֑�ѹ�]�(;4�����ܰ�>7�w㆕\���ބ�M�����\|�=}��������t�+|�k�ܜ��¥�������}k]a�O���_���/߼�=��e���߿��o�����՟��[��1�ʻ�����;/�?�fο}���?������ԯ�����^�:K@u���0WEp����~������?��ñ<�����>����]}����ʇZ�~�ƕ�^{��+o����C�ک�Ǟ��ҥ�V���^z���D�
�y�����#��g�<�و�����m8�����0��5|_��Z�6^��Wy'>�zEpr�����A�$��S�HK���W@[����&��|?~f���lϾ��"۹{zz2�6ܙ�h�w�CSg�3s��?�9y�3u��̎�M��_���L�_@��@�(��%ީ�̏�����	���l�p����%z��\to=F|:��Qy��7��P��7�
+��=���ʰ؀c��n�������
+�ZBT/V:熴��ib�j�P(�����=�+KХ2K汪�r��5f@3�:�hL�
f� k%JKI�'�H�"���!�h>E�H]�\%��ف����!)��?x �8����
+���Pt�s'�5�"�@��A��6�~l�h��.P��ZF�ʒ�OH�좇C\�~�����#<�Q���$�<�I0��YE6��Q�M�ai
+N���L'��Ԁ�����RR�K�g)�pJ����ג�O�ti���S��y�K�M�K�UƊ���-U��T?���鲛�~�EZ�%'ӕ^��uDo�}r1��,���ϱH+��p2�t�(k
+D�.k��0A�
+fr��X�y�EK����0���@��}K��m<�O'��*�o���&@`����(���q��ng�ϛK�R�J�޵��n^s����j-�>�l7���p��3S_k��Yxv�[%e���n	��;��z�\�h���_�x��7_|�M��/\>����^zv\�P����Q����'O�8|������V�oٻ��������޳z㖍kzoQ�U�/۷Z7n������QB�����̎�3�%}����S��jd	�bdj���733�ǐ����t����v{{���8�t,��c�&΁���̙�x���B�͚�nQ��MMOe�	�
+���l0k�F�>�����O��Ѐ��TfG�j�V4K���S��̓T
�8��1�Sҵ�iN�G�j�V4ucT�|�<xA��EY���ƙ��(�o�X��)�6��!"�@��c���g�*�M��5򒮄�4�S���Á]��`��YOqn�:n,j���!�!��ΥdD<��V&T`G�f9��,G0
+�`?���P�8����A7T.
+��4��9���V��W��b��[]2�ơ��'�<����,����
N�Mz�F,��:���h>���e��W���D�����Rš�)���ݾ���yܾ��_62�Y�g�m�6��)P�q���4�h����:�l.�_��\w7���6�,���ܞzH��5�X�f`I �˙� 1P��� �p�D��Y�ĝ�96�@zQ�(�
+�6L9?�@�1]0�!P��dP���UD�[nY��Mq�!p
+���@� �����Er���i'�T��,���Be)A/��D��N�u�
+ms�09��~�Ѓ �d�RAA^۵R+X!�������RE�<_eIAD@�A>x2�q��
��w�d#�p��P`�E��3�4��s8�>PV\#D�
+0�t5i��T5i%���Y:J�*�����k�ʹ�{R�\�� t����Z�]�6�����F�YGW@Gk�T���q%�dخ�E)���.�x�J;�Wd-/dᅤ@�+��+,pEh�M�< eW<R�}�.��6��А�*Bْױ%lQ&�g_�"�HBx-��4��w��~���Nm�3�^�1Beb��arf,&Y	K�/�	|/r[�t�h��d�v�¸�iT�B�\[A���(�[F`5s��[ �r��-z�6��zg9�X�"@Jr�BG3�BA�� әO�K`�~�
[{��\]�>U�o�TA@[��tH`DXC1�������@\�(��Je�3�aBi�sY@��W+G�aJ��Z@޴�6�0H�{� �9^�����߭�����X�W�2�j��D�SאM�a�zc�8�8#RWQ�u��l0>�����CZ�ǖ�D8�S�r�d����U5$iMP��!��!DU��
+���T5(%�%�R�(�ВmE�DH	R�*��������
+U���N�����}����=�EP�I��X$aG��`�"D9#y���h�*�1��Pź�1 �$�N�3D���"�l��8�29)o�l���w�Ă}X���Kj
���K��S,S��S ͉�s�>3@�A�ZM	5'`
+ԥ;
b;+FW^r6�7v$�͉�^"�3RP�&�����n8P�*}U�J_U���W�����U7��6S�,���S��̼�"����N5ڀ�9<HJ�����z����d��\�&��M��ra1x[�a��� %���l��z#�*��m�o:�P�Տ����K�-uҐ�|9�ⅾ�b�P��e�����J7�C�W-E�{{�`]���ܘȠ���#?~r0�6�.���g~v���~e�6>��W����7N�艝[�]�r��}?}�����_�Z<vp����w���W������Ʃ#�3'�5}��~�}t��_�7L$|׽��?���^���������F�ƻ[��|��勯�th����X��Ҽ���3��}�;�[Im�1��<�ßyrsv��������%���o�[�ԃ˾�ӻ+��j���J�-0N�J�%2�7�0�q7d�����5@����z��SS�^C���0�E{K�f�'	�1Y��.�&�xgq6�m��o�W��Q���
�I��6�9�W;�j�À7<B���[�>O���]D?:s�\�so�xl0�ID�!!`�&a����
+��9TiJ]���ƹ�"��$0��qi(�4��`0y+c\^ǒ! L8���?~l1IqI��	��R�>��� .�$`�[Hs��<8�WԢmH�Fel�5�%�;͢	@Z��(b4�0��,ʂk��
A���d�-A��f�O�ӢP˼X���+5�eBH3x��L�")`D� ��$�}�\ye���`L�h@�5M?
+��e�7�c������e���
+c�v�6:�A�Q)�5=��Nя	�� ��I������f

ҽ#���)CC�hl@�(�:\�	�ɍD���+@AQ+����D�G�D�0�lw �1mh)�,�FЊ�n7�R����sсn^��8�
+T�`+�v[cM���{���d7�ʓ�?	א�-�iጟ�N@P�n���T�X8י��+�&r�^�_�^�V'���S�H_p�*έ1�.O!���H�<���S����>�.O�
+_[���fQ�V�p�ذ0����W�O<�O��j�Ԗ�����w�:�#ڈ�`U7g�=J�[D�#md�p�b�r[,G��m"�c�^D����e6�?��&y�m},���1�]�uĦ@ӛ���fOe�
+������1���0�X� �E1c,݂B��"�YU��Sr8v���4�`ώ�Lp��mzb��rL����n�"�F
B1�$��GA�TU��R.Ψ*��6���G�d!B�֙�٘I��J2���*�C)U��L�\�؆k6�;*��M�D�V|�2����
�[�*OUy��SU�����Su��m3���X�8U���{-���Tá
x�Ã�.<M੮�7�.NZ�U{a�Xڔ�-f�����pF�z�R(NA�6bA
�B�=ض��S�5]��L��D�R'
�̗�-^H�]��>��^	]�P�j)Z�5�^��ݓ[rYt�Ç�1s]S���=p|q��3��u]�52����o�w�������4��Љs>�v�ꅳG�޿Z�,�p��;W>���O�����k�
+��3o_���gׯ�����.�nں����}��?.��·k]�1���G~�����=���p�z�k载���˿=u����*Zx�٧w�ԧ��2V.m��7l|��>.[��ݳԓ��Y
+����8���&^��ڍ�F���F<z
�#k��8�^s��Ԥ��_,�,�g���c����I�wL�����,�Y��o�4�[�U�b�/A��TF �1�1��1���j\큸��G�7��h��I�&?G
+��<X���������]���y��6��#ڊ̛撟�vC���P�DT��^C�G,+PCلB��'�	8f�ʤo1@j)�%wG�YБ���Ӹ8�RkD��)�$;��Ŕ	��Bp�&b��m�q�?���x��B�!�I�A���$+���${�����DM���((h�u��U��|���+`���n�%ZGg����i�
��@�����(5H:09{��/�T��3G*K}f{ D"��$M�s4b��})U�PV�6]��B˼�B��P˄�B��.(��.ȹ�vA�Nd-I� kl��%9m�]��Y�>Ⱥ1�p���FAG̝�[��M�:��$���l"I6����ݽLo���?��oA���HM� V�[���L��}~"tG�"B��4ᇡ��/��ø�1'~J���nx�f��>)=,S>&"��3TXn�0"�Ϭ���kS�i1�<G�aUa�H�ae*dG����Z*V#GK������]����6/���J!rS-,�$�.�b�N�p��ՂU-XՂU-X_|���雱{Pá
x�S��4aڟ��d��\�&�%��[����pXK~�=Ӆ$
+0�Bo��Z�m�o:�P�Ց��Z��#Җ:ivk-^H�]~+m�m�WBW6ԭZ��w
��.AE~��\|���m�\�Բ��F_\<��tw�F�t�������]:�����z�6
�=t�܅�]�z��ѽ���(�/;�_��.ƪ�
+�3	�BJZ�တ ���2w�J�j�	�;za��a(C�V�D��IM
���b��RҧR+�L4����>�!1�JM+���93M%Է�39��7����׷{����{�/W~�����倾��k���;�~u����N�u	�����7���|����!��=t�ԓ/���?���O���}l�4���O~~酧�6��f��O�;�̓��]�mCgz⋼iq����w7�����'g{r���f������:1���z{�W@s�nÇ��4�a�Z|�P#�ˋ�}���E�`w���h�xhlj:�,������݉M��{td�xڿ�����"��f?��	,��� |;y���ˊхPD�o��{�I��������OO��Eo_ߖN��WvON���",TZ4N:)��ª
+�iJI��B�L���ti�F�z���Bz���Gf��*�"�t�עDF�u�2�'����m����a��Y"�빀��3�T0��Zx�Q�&�(�MF:�E�mU�]�.	fb��CL,VUY1T���Պ���؍W��:0
���4:�RQF��;�C�ں�똢S���R�Ӂ*�GZ�_z��@eKSz���h�;In���X�g�bF�7�;���.�$c!x��Jml�"d��A^	��
c`��iϬUQ��@�ฎ-�`d)���p͑���T�,�g�����r�A��pX
+��2GӐ1��F$��'��r$K��)�Sα�'!�]b"ƕ�T����z�)����6_-T���x��"V�E*�dA*�dd�w��B۠�@�1���E�Wr�`x�9L�4�1�M@�`��;#$-(�'���Oi��J"��	�!��1��$���X�%D��2�ga-���6��Ҋ�vFb��E�P&O���pm��^ޞ��抓�%`!4������AR�
+"��[x�¼	�.!CEC����Hc=�yţY�D�2�P1�1f}B@�oPV~
J�	ˣ��w���q��)] 3�3]����)�u��������KDFD��{�
+o_��1��l��������{/�|�0��jH\5���6�ʇJ�:�*w�{�/&h�S�^�\���tLi|F�ƈHl�RU�m�kNE1,T�
+U�]�-�V��4�!F�)�|-�V�m0��KD���3V�1La�i��fFb��!1�Q��nSh��͊�E|*�C��t��]�-�FB���|y�c����}��2�1�.�	v���m>rYT0-�
+�=V�����p?}VR��6<���(���8K
+���㋂�"�N�Q&�L������_k���
+}�#�=��J�^¤Bf�?�
+�xt"V�D�����r.,��؜!G�ZBh~�Wt�+�$I�ّD� ��tTM��������#���Z	\LE��o�(����]�J%�t�@.�v�{��&�w�	+�
��%/"Z���!!�|7Z�sbK�;IXpI���	H�CYҡBT��,)�7XKP�
��̧U-eV��/�	Q
���nCR��[g���3����nsÑc@�nFb�!P��Xc�!M;c���9Er���#��t�`��,*fn>��S-ZO+/9)Wrtd��fSh��)!�����
+V�]�����=8���c��Q7l:���H\dj��?�m���S�y�6O��)�<e��l���G�V
��25���Lw''F�N�s��!���|Ç�q���Y�e@o뎏mH���t'v���BN2w.�`��c.��v������P"�܃������M�Y���9mV9U�G�G6��g`A�G�Y�b�~uǧV,	��r�ξ��Z�7���
����&~Y��/��O-F���Ϝy���Ng�̣gf��܅��j��'�}��g|��=<����Y~��W^{�+�7�sy8n��w.�����z����&ժ�/_}�ƍw���h|�ū��q�_W/%`y
+��矰�L���O\~�����?^���u\����_^�ݕ�O���uX��s��.<��3�/<��S�7��n��>~v�3v���Fw`����M?2�zz�Б��}[g��whh���;����N�bS�����Ė%>���Q�EK�O�"L����.����4��6|��Hؼ�E/T���Ӹ�������w�;qhl��L<465�p��x����ā&��=:�<��G
T�X��r��������v����Y�e��B���7S�Az��ָ�ihd��47�Biws�����5��g/�:�B�2���Ǉ���2
}��*��h���J3 �����yP��
M��0��,;�k�I��8i@ᕰDi�Oe4y� �4T~FL����� �YI|�<j��\^��b���b�.&��?����T�"��fb��)���Ћ)R�Ӄ
;=��"ü�^~�LQC�\��(
�WY+�Q�0"?!���`#?�J��4?�\�Glb�����g1y(�iJָ�
+��	6U))B<�@���'$������N%-��fOC�L)(�4�n�����PO'�z:�Ѯ$?���[{.g~(��k4����	#[�2U���2������Ф�#P�^k�K`�3Q|�EQ����n�1B���
/���B�;����`2+�ϖG-h��[�c���ǀ7���e�S����>����l����Ǣ�ԋ��f.Csu��M�g���Fvx��LVy��n�r�ܘ���?I�bH�ӕ1�R�^B��ZO�rk^�`�1Q~�Cɡ��e��f[%���.��LQ���9�5?'0��gۛ~k���[�a7��x��p�ߕ�!���[t�`nQ�U1nT$hPU:�C��X�UJ�����J�h���	����e�lv�(ܵ����m���˦i��0i�ƅiM�n����̌?�Na ���{���1G����=�P��lR��nvsSfx>�W���4���iW��?!�'83���~͟�j׭�}rvyZ�`�N�뀆����Q�Pۅ1mE
����⫈�LJ�έ�����B�v��?�R꥚+�΋LL�Ą%�I���e���Yr�P&1玥�Q���J��;悻�s��	�fs���8�Rn���sK�h��,��J�+c�Z�&�r�S�.((
+�_�Χ}�[��a��/��' C��t��U��P�[���T�����s?�h��E�1<����q��]E�J�t�y���ꮱ�I�3�;Xw�]��#g�x������'�
��㵂���/kԄ��N
+��8+�kt��q�������5.�BK�Mt�@�2� +�a+�F8�?�FA���/dC���Qϓ
+endstream
endobj
179 0 obj
<</Filter[/FlateDecode]/Length 5613>>stream
+H��}LSWǧP�����-���-خ��7JyQ�*�DEHS+/JZP|��e��6<�F��M��%�12�q$0�$�24�D����9�����T)�{>M�{�{�s����%�=��r�����Ӥ���c�-�-��w��[]&co�֝� y�}�v�������9��	����hpM�x9�P1!|�h�J����N�R����-.��%4:����l��f�LP��b2��JG�,��|��尘���Q�h���}��1���s�(B�,�"*�����m�B%Ұ�H@D�T�m�������"&�/I��JM�.���(�aQ���a.��s�"L��&$�e�3
�L}FZR�V.��}�����R��� �Fi7m��ޕ�o�����ܲI%�p4��b�?���ɔq���|sqY����R^Vl��1��)e">!<Ϊ�?�+Ĥʄ�켂�֚cu'��O���,��NOPJ1!gT��yxR�O�8*.}���v��tә斖�3M���J�;��ā>l���ᴈ�1�~�pmj�����Ƴ�]�==�]�gO.3f�j�E~\&m�"a��� Ql2��oj�<�{���վ+��;ۚ���6)$��9�����ba�-9�M_�\�v}pxddx���K=_6���lцa�թ�ם
+��2�ml�<0tstl||l����垶ƣ�3��"չ�`1(4� Q&e���g;/
��ޙ�|�`r������γ�Vsv�R�C��fU`Z�RMڮ����
�޽?����GS��];�~��xW�F&6�Z��Eg��b3rˎ5u�^�y���'O���>yx����M��r3bÂl��cq�`:}~yݙ�+��SO��=�l��������3u��z]&`#�*O/��+���4ZN6w�
�M>z���/�|�����p_w�I�13>R��A�K?�2+�[z���?x<���_�x>�����՞��J��ݪ��е�pi�]K�����u�Jq��t����Ƶ;��wQ��خ=\|���s�	�����7�R\|#zϵ������+��XN��-�i�*3��nEq�^c=;Ͷ�"+�d�H5�(��J�ƶ�/y4@��^s`��q	�&>�GPD���k0�Z��g�
+y�&Z��U*�J
��XЯV���`�2z��h*b�1j��9X��w*GS��ڛ�Sko��Uj]6{�Q�(Duu3M\;c�>�>��S9�j�v�|��Ev���ʰ�=ı��l�J+-�*�T��G�8�/����Z!��8b��Ĕˉ�T�Üa�dAǬ��U>@���8�&���*f���*�aQ9U�ҊXa�&Z����:����"롢BSf��}�M�g����T`�:e�}v����m�o$5�gĮ!�dz�Eq�㔢��
+��@�|�VS`*�S(��L;����-Y|Ѷr��b*|�j��`'aѠ��(�_%q�2&V.=�|��B ���J?��L�����	̚����	�����I�����IL�l��IL�l��IL�l���������L�l���������L�l���L�l���L�l���L�l���L�l���L�l���Jہ,//�Ҏ �L�l������a�k�Eㆉ�a`�d�U����$��&�&y}�0�5���
C_K�a�0����↡�v\���zq9n�j�-ㆹ�"�U�0�8�4L��;S�@ ����?�u֭(Kp�~�x#�8�n�(���7q{�Ս�+R(�����{��4:A��%�t�K�|�O�Ga0Q��v#x=6e2:��s1��G��b{��>_!��m��|>|�7��D�>ش��ҙ,o�@��D!!�n$$D$��7�I�.b�0	���C����#��(�"�G������(X�6�K`���
+���H�Z��OHL��F�uZ�"R�pY`s�K�$��`�A��(M���t}�!+k���2d��S7�i�d�AB�A�̷	�P�/X��Oٚ��'�h�g6�wf�>�1oON�֔xu�$؏�B������(W,��&�w�
+K�+������Cn��Y+�KM�;�I�(I�����e�/%����)�v�+�<�a�ɏ>n8�F>��d퇇*K��ޖ+
+8 �9�I,%���M��[d9R�����Z����6��Z�5�iC�K�ެmD�?�E,�L��T�7X��l�[l;~��֯:�����.\t����}���U�秎ۊ�6�d�����98������.��~r�㛋������e�^e�������8�I��p��8y�?��F���}����l��xck��~��ƭ[�Ź��Enݺ���O?\�jm<n1e'��A>ld6r�.E�2��ih������د�ݽwo�Mܻw��_�~�1�����Ps`O�.B$�#w��!
+�������h�����C��'&�cj�ۘ����ɉ��C�����bܖ�џˤQ�"p�Ph(o�D����{P���yl�IHBB !"IH@D@�+>�`1<� D
�gŢ�N��Q�^���@}L�vt��s��Su��ڇکS�[��p-���=�y�ꑍ��/3a��|����g7g��w>u�[��w{~���O����������S�wm���%-!B.B���%��P�3gW��p�g����s�����Q��@�o�{�t޸z�ӽ�����W+x�a�JMb�yQ�ֶ��cwO_��?�M��<��������O�mm\d�J�(=-����DmʞW����]���_z�>��%�>����o/}v`�;u�M�J	�ɝ�"�%��Sl]����/���7$=�/eӇ�}w��������9I1�Ȗ%���-˒�X�+^lmj9x��w�޻��]>u���Z��pK6�.�ӊj�nk?y����{}��=}��o_�p�}��ڢiFb]�ݖ�{<$�0un��-�����f�����N������~���c�����;�2�I����)����o�����?t���S�N��/�����啅St�
+1:��������K�mo;v����������}�����ڶ�[Z�?W��!v�����좚U�[�8{��77nQ�� ��n|s����Z7��)�N�
�����q�="�(�Sf�-mj�s���s�\�F��͵u�v���sg���ܴ�l�C�R"@�;7�B��K�1W��7��9�qƵ�M���]��G�[��۫�9)q*9�J����1��Tۛ6�������(�>�w��&{uI~�A���x=#&ج�UZSfAI�m��M�-;w��C��ٞݻv�4oZ��VUR�iҪ�`���x�uN�T�'g����V�i���o��mhZ��VSV����G*�C�����D2L���s�-XXc]b�o����(j��-��,\0�07݄�1���x�B��L&�/
+UO0�d��2�/]`��Q�Ų�t~�yVANF�a�:4H��S�$'���
+�AJU4nHN���Ν���O!yy3r��2R�
x�J$p�ϩtL&���C#4�x�1)yb�$JI���d��k5��@����J�5g�9<a�L��G�51�Z�J�jcc4�pL.�8l��0I�&A�B�T�Pb�aaa�ʅbJE�L*�Q�5����1��'���4 ���T*��a3��_nOM���pQ�/�SQ���\��d<E����(0e#¡P�
	E�8�$�IxQ_??	�B�����8������,�u�����u�zg�g*5��cH��T�֊K�E��PD���/�����J�䡈Ep,m	��a��KH��g8>f���ǼEt�x-nH�LzmBBV���:c��M�8<ǌF��Ψ'��<-G��Nk��H-�Ӛ��&W(A�H�p��>׻�pF�8��wȨō���+��n��]���+TK��p�\#tw�8�s�3t^@7Qd6��0uf�K�J'��2���[-��XK&��i\�"W���էsRꈘk���tϘ�w�g�A�l���@�fq�Ӳ�4{�ḇ��WUFa
+l��*,��N�X\VY��m*�/���-��(ͭ\Y�hU�l�-�[[1�)>�1\;1�%��\o8����<���2�y�^YUmu-n0Y�Y�;�)��tF,O��cz���&�����F�?F,�X��dc���8PUE�$�$,>N������I�m����zZy�Fl�U_��+�==xO
+�`$��{	I��^H�[z�/��zW���6���cƨ����C�3���32�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<�!<c��5���	�m4��'
_+��Ƅ�k"��1a�u���7&�(��zޒ|!=�%_B�JO�і�w=�W��
+UGU�m���̢z%����3�3�h���
q��DG������__2��yDH�c0�,���b2D���BD
+��F8\�G�r��E$���F�e0����������_��r�DQ��$P���|�X"�+B�ʐy�L � �Qn�$�����0U�:J��DE��1E�D$@�4���`!��L����Fc�A�k�#�B�$BǑ6�����J�1�!yrz�Ԭ���)��c�a
+���a��y~@$)�5�qRFN~�sQ�yNaA��TS|�*$P�C�~�ňR6*���b�)�3f�[P�VMm���JK�켩�ڈ�@!�fx#J�8�b|�!5����ֶ|u�ڵ�o���[����4�V���,�bd)�'
+
+�6��α���lشe�m[�7�۸���<#=1&<X�C<�9J�K��I�s+��~w�G{��}�q����l޸fie��ɺ(L��Yd�Q���k��f�/iܴc�Nvt�<~�ྏ6��U̙�<a|���#�%!j]Z��uoo�k�ю��p�҅����{�����B$|R�=,&�?04Ɣ�?����O[�a���.^�|���û7.��Q��a��$!���##�[<�R*v�q�
��}��՛w�ݻ{���c{�/�ؘ�gg�*-�B'�����SPri��ۏ��~����ϟ=�w���+gv��;��ˊ�r�u��OTN��5,��w��}���{��ͻwo_=����
���3���5�D����ymK����IK��p�ɫw?���Փ��l]2�>'��R[(��t��b򛦮�y�����>}����w/�_=�sŴ��XokEq$]��WԵ�+l��j���^}������_?�zt����3Z��|l�%�A��- ��g�_�6k��37�����_?�}z���}kg�'���)Ip��ҷ�K(阽n��[O�~�����_�?�}z���u�;J�l��t�"YY��?��cP�md]��X?��4��N_�]�]�s�8�ٻ/?~����Ǘw�n�?�~ngiH�$V]I��s��� �C��������@@WY��
Xu��F����.�5�kTר�� ����
+endstream
endobj
180 0 obj
<</Filter[/FlateDecode]/Length 9111>>stream
+H��W{PT��^����d/��{��q�R��vUZ`Ԛh��>Қ�L�I�1m��G:�m��:�N3h��X�1>ZGi�3��;���.`Bf2��pav����}�s���n]�����p����?~����kN?�cC{]ya����Ȱ�C�|�!C��Eƥ�)(,�D
�Q��A� ��:vʊ:u�A�mر�OT�WD�<~ܣ��?�n۰P]fTדP�*j��}G;��޺��ѣ�wn]��<���67A�ZP����YS��׿��f��Σ�^_�w�M)�J��
B�Sf׶��߽�ѹ�n޾�������7���载��k]X6�F�bS2�Kk��������|��>|p���Ϟ<��mk[jJ'ә���jX�-&�ʟ���_����t�����������3��g�|�)�����afT��	���k��:�q��ʍ��ܹs��7�t}�qpז5���	Tr����+̘�d�������O/^�����[7�^����olZ�0w����a����'��]�m���CG�ً��^�~���?���_����S�����!Æ��c���5�~�s��?w�9w����?s�đ�on��������@�˜�/�]�|��]���_:?�䓿�����o�~e��%ճ&:��EVPj�c�3r����鹍���{���':��{h߮W��W���f�bh���aO9��XTU�t�Ɨ�˽o<t�����j��״x�̚T0vd��(��
+	��K�����,]�v���;�ڽ{כ;^yi��˼�J�¹TJI�@)!F'�Ț L-��nl{��7m޲e�K/�]��T_=�%�����4g���c�����Ɩ�V�Y����M�j�J����kv�9��ǧdd��Sf�~v�Bϒ�66~���^PU6�P��e��CV&W��0[t|J��<V*��ty��y��T>S2s���3R�mafW�3�`�2��¤�\3f͘6u��9Y�)	1��!W��n��%��g��s�/J�(`��0>+cDr|tdx�p�+�ٰ�dTL|Rڨ�Y��sr���r�g���G$'��m*Ȃ�a��������3F���52-%)>����a�����OLLJJNJJL����L(��D`��а�[d�=Z��QQ��p�!�z�tw���
+#��R�)��!����pH��B��1��ח@�@~5�7xeg�h�Lw��v[�,�-�Y�ׂ�������mev[���RΥvC����ű�nԿj7��X��^i�aI�A�)��iY��&�L�Y,c
+Kͳ��haQ�UTA=�D�*k� �+�P��m$�aʐ�$V5e�8Z��
+�EE+�&P���2b�HG��0\+0��n���d*'�����g�8[����
�fw�Jj"�M"��Pv��&��Z�U��HUQ��V�x��B�R����Y�[��qS�6��R�\����TA����y1��dC�8=�:o��X�-�k���{=�%ޕ��Vk���f͂z����dĨi�)���vB"
�
+��9�"��fxX+ı�,�E5�)
+�#��� �t���xQ ���ʱ�H,�V/�	bDb� ��eQe�q�4�D9P���Y_��T�󻉲��yJ��bx	C��"���-q�h�N.������萛�28 �d�A�E�?���<K4��J�X�Ӱ�
+i��
+!IL:X2�P̫#��X#6k��zeT��������\�(�!D���D,�=�s��%F2�����ʛsE��I�I�&Xމ&�V��*��U��W��P/��ϋ�Z�!$�
+Z:N��4{�,%Y$NZ�@ڣ�%P�Y��q&3����&�rȜ�y�ӈa���S�1t��
3�y�U�p�L��K��]��Fs0�[1��T�Eh,K��H�Mh��hY���jg�:X�+eʁș���@EIL���n�QƔC��J��~�<%10kr�꿎K�@]����-"�����0��2���[�k�x=*K�W��
+��q�nQ�r�9��Zܞo���E��&���>��ҿ��[p��
�=Ih�/Ȗ@��l�@Fo�t,�b
�"Dő��<!h�'T	ߌ��Ǎ:�U(�'�W�J�g$�r��:����]���;��wpF��r;i%�Z2���<��Gc���R�����bUh�����+�3*M8�T��̐����B�&�]ɱA�`��9!H��oY�0˒Lp-��yZ`�6��%��Y�Q��
L�26)A�,�	�ae �'k��Q4dE��ނ>Eʤ��0�������)S�
�+S�CpWUs��	zl��2�x���AU���ae��L_�
+Ewp05�b"�Ւ�#��Q�&�P�~�2!1�%	�"�8�ɞ�+\�9��?$3�����If�#��:+�)V��f���҇rM������I��V��Eu�6&LjX�#[a�T@�yT���N"샀)2W!җ�G]�
j`���a�W�\b�A�}S���me�3�L��ڗ�:ߝ�,��[�J�<��&!4
{�@m�I):��M�U���J/�b�./���M)�i:�	d��S_.�ϹuOC��H�uu��e�����$i�H1
%%>m
Җ,4E,<�E(k���J̧�A�>�CURZ*C��:������"����vSqK�z@��
+��Ӓ���p��mSme����:J��+mCGY�B����|�B�����s�Zj񥶡��Tp!�C��涵�v��-��ZG�s3�Ƽo�tT(�r���ڶ�U�P�4%>$�TGI3�j�騭P��8�
+���:��3%>c�f_�o���Q�]�"Qx
+)���52����AH�s>�kN�R7��Ï�Z�vZ
+oD��b�~Е'��?����@������F��ߐ�]"�A�B
+�R�n�.M ћ�z����1����K4�yVK�g��$�A��2-�Z��Ç�b�RuCM��fr*oD_(�LN����TSNU��81:=�d�_��S	�*~fn�(�¶]��eU�N�D,�T+;�kd2	*|������O��O'A�jL_aG{`���e����Q�,FD��Ѱ
A�DB��Ҫ�R��
+���?TPI�iь|��T��M��x19��âԠ�j���-ԡ�o@P!��ʹ��ة xAE>HCPѐ6/zA�>��%M�B�yF(k��/��'�A�>�CT��m�TZ����5����
+{zE��Pw'4��Pr! �N'���K*6:|v��K�h�j��Jj!�B�߾TUT)��^Q���,�+*�]���8sG/��N*mK��T�	�'�ZL\�	�-Ĺ
+j�&�����0���U-p1�$Jyn��伦�b������9U9!P�i�V�!�X ��6`z
+����)Au��O�S��ԯ�>������!�TH���[����9 5�U�x�%�i����Da��*zbī��z��#���nzD�:߽��[O\�(��ɋs�PX����E"a��O�mg�#"f�xqވ�Z�h0��%��W1��ތݫ�U���0�|��S��[�*�SS�"?W}ܜ��n��L��Q��5cG��iV��5	���/��q����B`3l�����O��O'V
־K�{K���Iі�k!ߥ)�
+D~�#�Ɣ`�N�I(��2��r�1�Hd��|jPȘ��0�N��a�}��VjHMMhP,k�w8Em>Y}����i�rR�d>y
��,<E,Q��E�5�)��5�<T����j��5��F�����tංƸePx��\�Ӿ�Pw'$
+�|�-�4XNgs�m��m]��CE^}�Z|��*[�+-�(��V���:��Z+�ZA5����B��]r���Z�ּ�z[��>��?�?�P���Y��p��!mў�:§na�Y��'��̇~��0ð�Ͱ��,�C�`%��ߧZ�����1����u�긧���0�����~ �/�j�EFl�N<y�Rx"�4�v���0��:
�,u�i�5'|J����X�X�f�OٰSF�Τ���#FO�0a���j�{v���֘9"Mmq�h����� )Pb�k�O.+���K��qxXX1�హ���G&�ܕ�Ђ<��Fq���O׼*�%�9<�a�+һn�����.����<���Y�8��K�D�-��R�k8����.��;��|mS��i��4L��"u9:�o�]{�J��F��t:,���a͍~p��Pfy�A0�"�Zt-���˪�ӬF���h�_[,ύYd���I����xH[W�I���� m�BSԂ
�❜`�n���|���<T�����6�N޴6��t��F��z��sq����6wBF��Ӓ���t�Knsmm���*�4�k�I�Z�PY��e��*4޼9�Z���&
k��B4��.���k��Pk^j�L4\�Q㼟jC��'FÍ��X�uO����E��f��	F���Ƌ��P��^��
���1����:hK��gS����VB�4����#�U!�9�����M�a�"�%ƻ�M-��x��ձ<�.J��w��Ɠ,��b0��&��t�0~@r���B�Z�cav�]�,7�^-O:i6�6V�����u�_a����b�|q\����V'���-4\�J{9K�2�h�s�x����C�wN,8��w�'#�0&�bo��ߜ�6o���u5&�6p�avjѱ0�1�f�'
+��3�]JK7,�č��m3B���p8��߽��"]@p8�>l��.:X�������l븳���nJp8,>a
�Y*���6��p�ڸ�m�Bq�>�9w��'��	�$��t�K��c��P���8�q��pXkUα�`�Uq��
��3��:�RaF��.ut0���ҼT��`8Lh��s�0���yK&���P�d�0����&Ͻq0ܑ"g������JNw�0��f_ׯ{S?����LLU�<��p)[�s�A-�i��o�	&�>Ʊ1�����
+�u:2b]6�b��)�\B�̏'/F�]B�%kZe���O��j�c=��oN�|��� U��9tV
+�{��A�s4Y>J����=G'��	��S��]�q4M�]����{DpXV�Ύ���MlzR�4K��ct"���i��!Flc�0�����9�`t
+�~���bt�i�	��S��6M��j�v<A�,��'I�x��P�Q�2���,��<���;?���ɢo�div��9ԡƇ���c�z�k�o����$��_H��h;����E͑�H��������1{���z��ԥRߣ��5r�1�� �xr�Η��O�z��-��n[�)���2�\]�f�f6���qx[�K����1l>�/ۧq$Z�=�[66C��
̆#���N�����>y�zطn�)����JS	���c�����t^�׃�%��ӭ?�{|v�Z`��<�-k�oi���E�6�>���6s���7?��^]�����������_�u4�g��i<�O���˿>���~�9=��/o^_]�?���z���@2��O��}�^��~1�Ă�`�p��9>��~�06�������Hq�?�2~�y�/t���{���x�ӈ��w�^��^�~����8����g������z�t���o>��?_;z�G<1!���E=�z�����mc��� �������ν�u�4@���͐%Vv�H%�i�=Cr�K[��~$2�	 ���Ù�ٳsV�z��<� �6�	&߾t�#Қ.��ŨĂ�sIm;��v\Sv��%��f3]���h{�sǴ�
�~�Q����qD��� r��w�rTb��A$��
�kUoO�7�ը��Ho�Z�;O�4���_��V�Qy�����x�������A�����h~�j���>n�6�^�9���G��O*SE��ª�Lj������զ����ӕ�_�{!����B
+;w�4����,CG7�֣T��Ru��vj��LR��Q�x��08�m?���ޭ�v��^tE��xu��R�㳐:ҝ\��yUg�eT�Q�%�cØqR�]�v�QYFe�eT�QYF=֫YF�Q����V��G��O������)t��B���5��niU�s��"���[ӟ�{�ĺ�Xٳ�yb�'��&˼�����.˻ϑ�1no@�&뻬�Hd}��]�wY�=W}�����_?i)����@H7맬��~��5�I{+���)�Ù��~��)맬���~�<��O�hb���T�|T?�����'���Ojo����Le�t �;�Z��s}f�u�����u�cJ�����:��;먬����:���(V����l��I�"J*�'uT���PRb/%��WR�iγ�:ڝ�֫m�^n���Z*k�ϒܱr�;a]�RYJ���T�RYJe)�L����V��bb���Z�R�H[��7V�v�R:��K���	�RX�`K`���'ϩRj�:�ި��	�8��+���QĴ�dJ�0�\6����J�U�*o�e�6
flaKg�k��R9�L��ƐQ��5�k�99����c��<o���-�����o��o�59�S��"��y�l4Y૖\6��RepmE(O[
fJ'e_V|G�)�(�2�:÷0R��v.l ��N�"nr�Oh��-�j;&`��h�S@��)�T�~3���uj���o+&?����Ţ��o*��zY��i�-^1T^t��I��wc��'|a��Bh4����j�ʝ.�^��EG9ia���B	�?h3x�&�|�s�Ezz�1��>�(�8�~������92i�-���#������|���듳�ve��i]h��d���.O��%"z��}Y]�a)��x?Xq��*��'U�-�)&/���;z��ce���-��x�{�=
+/i�,3pVJh)��P�HL�+> 4��v�͡Y��=�p�zF끞�z�g�k
�N�hN�S�R��Yq~Hj�iד�g0�'5�
(�k��2�%���ŇzJ�<'�_	-�	-�PZ�5�X���b���@�iK8-ň��n���Zl���b�,�U ��I�AC�$5���%Å!q��и���- &ۇҔ,Ѯ���������L��UD�(�W�iO�1Z����_f�Mi�>ǡ.��(��HF���#Z�\7(�K��0�F0=zF�tt �I�AJ���0��w#��g4r-�OG4��k�F�4N���KF4��
Χ#aR��D�q|��vo�	M)��ܥ�R�>z6Nh4\��L�v?�)%ZbJ&4�8���
+@ė�J5�3��ʌ�7�6P5ѫ8�E �"��h�=�y\$=��}:��f�f\�Ġ�Q��� S��@D��#42<&h_�kZ�q�\d�𶻘C��2>S�Ni�,\z)g�X�Y�>��.ݔ���rV��#��HZ)H+b	i�Xsz��I+�&��F����1'�V�"o��R�Z�@��V�"k�@�Z񙞵:�	g�wG�
+�E�
+$�3Mh+�#�V,X����c��z������~�F'�"��5�}x�z�zА{񖐨��C�s(Cs�@�\��Ӗ��0�Z(�*�����Y�l9]%�:m9���o����j&hK�mD-�ʹ
Qa.;�v���o�t��xN!�̀z$M;?z�)��y;4%�'��vҔ����oGҶL!1�*߼&@���<�p>~8�C���;C|��֎���a��1�A�B\�3�����sto���� �SL���-F'���8��zGU)7�Y����$���%zݜ���Ǉ�ш�5��]N,J�S��~x9���M�$m��1f"EAo����ؚ��Ms[�
$'/�ъr�P[�L�3^ =�n����8�'�#F�|�dZ���4�%AN���~=���X�%�E��S�pC�|��I��C����2�)(���n&j�G\���Q?Q�'�a���=�֌��_���_V�՗K�֧�\W7��m�|u�o7��u�F�P,�"@�0��ߜ�x�o����|}�ny3����她|YPy�8��ª{�ǧ�5�L�j�p���
+�[��|�
y���{�_ϫ}2�g����r�W�-v��n[m�瓺�>��]�,�u��DU��>���V}J~�u���OZ��wx�j1����1q�����֫m�^n	|�`�ň�o_:�iM�ۋ�bTb������֋j;�);��ڇj��.��c�=�䎭�W8�	FY��[��9Fۃ�q����Q�5v�ԓ7��U�=Y�,V�K�"��j�z�<
Ҽ��~�v[�G噚D�O�����c�>&���ף�ͪ����=�|{��|T����>��M����2�}3�O��W��	mLe��^H�zu����D0��?��:����{��(���Tݰ��p���-��#��Sa%�:O ����]Q=R���jz7�8�xT���[��z\б݂N�]�N����+:�����Z�݁���j]ϫ�gA�]t�%���_.�mA�ya��^m����>rK)C!%DPJ	�i!��9�׷��l����bfd��h����o?�w1Xj'B'B'B'B'B'B�n���
	]+L�hT�N�R��
+7���F��F���{T�ޣR���Qy�veţģģ^�������c�QDJDj:�E�D�D�D�ިH�9�]�م�',N���+	p8�$����V衊���*:N��res�}�V���Rz"]�C����<��7	D�8q��%�H!$��V�*��P��E\բok�����-����ڵV
+r�e��s����\5�JB1������B�*w��O��aCm�w>0�N���c>F�c~5�}\��5ʹwC�߾C�r�ε:f�S_i̻���x��C9/^0�FyCS����)};��]t���������_�{�x`n�Q�/��vⓍ������;d��۔Zۮ�'�
Ʀ��
x�f�c~��o�ת>U�r�^.&��"���3�m'H��v��l�D%�I5�l�,}����b�H3��&�j|�����+�e���
+endstream
endobj
181 0 obj
<</Filter[/FlateDecode]/Length 2284>>stream
+H��W}l�o��I.$$9>R�6���_G�!�p�i�܋}8�.;_�T�P'1P�	���6UZ�:�H�J���j+$�TU�B���P+�R����;ߝ�.�p�-1��"����y����s���#����{���q����de&+�0Y���8LV�a�2��q����de&+�0Y���8LV�a�2��q����de��*߈�!��
+�7�,LV�qW���#"Y���|��g5��rQ�Gb�Sz�Č�y�������}q�G|�](ȅ���P��E�����%9`�Z�1�"k�md�W��^����9����ܾhi��ں��z����fْ�P�U)��U,�^��Ʌ�8�V0��qMmU��Z(FX�J+���6�;;���������iղʲ��C
+,����M��zB;v&h�Q�N��'{��UUPI�!E����u!�����G�h1|���d���j���E+�����o?96����c�
+�k��[�2�,]�Ts���S��`�ܙ����p����e�5a���6�^<:��?�l���S�?:��k����
++_z��ľ�նc��>���J*uM�ԕ/�?:}�@�f��^"D��k���C�����/���7UH�����3'����*���uxgb���Ϯ\���m
n}s��Թ��D'���G�&�S�[�����[������K�E���J߾�}���N_�89~�QEԻ�>��M���b��ތ0#�30#̈!����33�R'g�`.=7u��ޔq�����Z9��ϮC'޿p���:������_z5��}���=z��w?����z\J�o|}�������T���WQ�������e��/_M�F�T���K�~��_?묩#���X�=9��S�_���}�������g_.Ή`]���~������3g'&4����������=�gQ0�V�<��;���o�?9��_��N�����r�w��N�w-�KV"�m៽���W5#���_���[�k�J35?�ۗ�v����S*��s8�߹������U/��s��
�K�F�ɍ?��ѩ��mZ�iZ]�h��
x���	��ǝ�ZO�Zu=�v努��"�d�x�jy
/Y�zey�"��2�"@�E�%e�P��,�5���ZT�ग़�H/]�5Sw)坎���v�8C�qNhhh�#-$GB��6��h���e+��(�uB�AȆȆ�-�G�p"8
+�r���%�`�z� �����>?�EQ'A�Q8��!N���u;q��{�ɋ��!�p�#|D�6���V�p��$���l&�#g�mn��
˙�Lf��$�iJ6�H�E��Պ��߱l"�*�D; [d#`G#ܻ]�n�,�s1�&�!xo{����,x��BrViu�U�T�UV�vP�Aߪ�@�"l,)^;�p`�c�L��^�a�6���Q�I�v"L
+����$��"�-�P(�l�2U���fh؃���=�w�P?ߡ�=F>Ǖ�K (��/�����E��1m#�Q�{F#g�M��Q����W��8���m���41?��$Q��k֎"t:IQ�ª(_i������x_��hg�2���q�=�YD<��-���˷�A�O���O�b~�_o ����pp�Po�`�݋!�?Px#P�_؟���_S��b�6)8��s.����Rdv�S�h?'��&���"\�h�%�^��͚�D���#���������жx,L���P�5��9ю"!�xI�a�F�IH�"�<`K����iv$�Lr��N&B�gՌ�k�ۀ��D��$��A���(幧�������EYI��nh�ʖ4��n2>(�wd|�3T�G�	�
<_�t��r��c�x2qU��*��6�(��s�d�Pa���RG�Q�3֔���RZ�J&ɨ�~�}�8�"��0����(����"e߼(���qC�	~yQ�=vS,�Ǣ����yQ��V�^(U�}dx�nt�P�J��(����ϰ/�G�w^��H�W���T<�M��ړm�ACEjC��R���"?����s;�V�#$G6')�����.���^�΍��syAF�
5��)u��\���R��Օ�V�^n��H��⯀BɃ(��ݠ�w2
+�Q �w�P@:�YD��`��ʓ���ǰ�5%�)�L	�@�s�����{�gJ(SB���mJ(SB�ʔP��
+n��=�V:$�(������,�S,d�&��L�4Ñ5n�Q�JrK��~fo�䀆�֮g!��Ok
+endstream
endobj
182 0 obj
<</Filter[/FlateDecode]/Length 16119>>stream
+H��Wko���.@�a�!@�!�r��E>S�İ�]�B`,�a+�%e7��=w�/��#ޤM��@5Cޙ{:�x.���+w��t��E���n���f'��f�nh���b���$��O�T4������3nW3z�e��)��}���<���r�,�xU/��}��,/��m!&��XV?���s���t�٩y$�>�U�/< |7pi2�7բ�����cƙr�����ſ�����'��jsST볦�*V��N�:f��b��5Vr��b��e�2��'�	O�yV.(y���2*�'�ܼ�n�� ��ͼ���`�X�q�6����[��h��弸������/���%�1*xy��:�����cB�LLCW_wG�->�ů��M]�Na����rG2����fY4�r���fN[UO�E������27�!�k��e�\k��^nֆ2���ln~�?�h7y{[T��O�ڝ9��Y��
+ �s����!=h+�V����X�A:ي�?�=�6�uYw�S��M���LvW�d�����'���uQuG�<>��N/hߴZ��
�2ԅ�+�`Y_������V31��Κ�"�����ϖ,�n���I���N^Z߽l�+<�޾�Gq�����Ŧ\p�ۣGD�-�*o�Y8b���'��8��ae�{�ؤ�/޶�i��Xַ�0���Ղ��7�O�4#�/~?��t����E�X�G�wԵ�Oy���}�,W7���L��ӭ��z[�c6��GvY��^r�@�4@ܬ�;��&���6���+<Η���o?�W���Y�7���'��ʠ�o���~��o|���j�WL(��on)o����-Mӓ���A�7G�G�W���E�8r�n�E����#�[��珴!�=�`�h1��2����+��CZ��w���֎������d/�Q�%�u�X'd|cElߐ(�3��RF�-y��+�My�+��H�sE�`�Ό���]U�7ł]�SL8d�}��꽙����w�����1B�'<u�#\!�'|�D �E$b�Tdw���4u��9�����N�DN�N�Bo�u��>�B��Ѝ��M�Lr)�#�,=�K%�e(#��<Je��	��\��|�^�E^�%^�e���K,����~�G~���)F����6�(��/c�-�� [,����`���x�Ad:1�$ft�8���J�K�"C����}��t�R�_��4(Y��HƄ����$��4Xy�Jyxi F��^�����0�����?1�h���{�c��1`��,�(�A�2��� `QȈ-��.�a��
��w��J���D�g8w��Ğ�Y��Y��Y���΂Le~�@7s`>�fi�&i�Fi��4H��Ke�N*R�dI�$I�Da\� Q��x������8��8��8�u`(8��؍�eQ
+x ��0�Q��Ue��Fn�D"�a�aBH�a�� T>h-C7�Br�iT':֑�CZ�Ci_�4�2�����c�B@�E�àC�����1�#d-mPP���{T��p�����.�.#-��e���!,b�#6@���?*P���g�y�̷gm�@��N52�����ݛ��g%����=$(�g$n��'���l8N۴ݥ#���.�a���-��M�A��q�6ew	�Kה�3���I֮��ھR*Pp.�����D�*8��I�c�>��U���|(� 
�k��I9�"P(���LxРFdQ%1�IɍB�i�D��|d&)��n4�Hf���k:��>Q;b3´ p��!�����I��K�ښ��x����$�q*��w�V1ҕ"d��/�ܑ����Ѩl#�<�N�����
C�6pb`��aEˉ�/��a��g�1�CvX~$#�p�g�'&t�[�a̘3Ě�eN�3�cϗٶ+8�rk��[^�v~Lv[v_�)v�̮�4l�߲���
+��,����
�m}c��lk�;�7�cߌlkll�+[߷ޯ�����]Hwl,FvvMQ0X�ڻ�t�e�i7����}ţ��g��=��p�Ʊh_ޱ�Q�� �g"P�(:�m�R�h�fp�D��6ט���3�i
+C�Bj	�!��3¤�������(�0����2yLL1q�ߠP�@B�ԕH�����C�ܗ��ڝ�+�|�������a�Ǫ-�%4v�~��g[���@%:>0�@�1���)<2�!B� �S�Z�������V�D����4�q`'�e�9bD��4�B5���֡v��bPbZ=���M�!ZQ��! ��!�Q����CddE[��&��o�l{�����	�>�y���늀~�'�n3/p}A�׹��=����ʽ��<���v����C;xh���C;xh�Xe����l��g�?H;�����*=��Ss�"���i'�M���yo1k��3z����=��|�~��{��%����c4i�fe��a�2��/>�d�7uu֔պ����7�ӉU��0Zn
+v����u��Ľ�8���E�sq��z\*��ͽ�"568��
븱�nmt߰�������~���m������b�N�W�{wuz��iH$d,:�jq�^;��j=���/��K��
+���W�yw%D��Ɏ>��K��t�T��٧��'˧��Q�y:�DZ%F3����Mn�H��|�9�@�,֒ş9Io{1�_LDdV>RO�m���0�$>�22���o�^�(���ߗo�w�[�x�AO���u
+<��S�����Lf�O�g��a
qF<%\8�]�E�ؔ+WUѹ���7z����s�o?���j�;��t{����̀
��E�`�"�4ծPw�PѢE��F&��*�����/
��O�C3�@ï[?D ��$�q�G���d>�jL��W�����,��Rd*qc�e������mg{%��	�9� 4/���vb��_a��WRq�'����l��d?]�_W|������
�w��]^{�g/�w���I��������Ⴏ�ܸʑ��M�LW>ax
+�l�<	�s8�?s"��
�Nl�{
|_�k�k�k��2�s�
�S`��
�;
+��(�u
+�A������_,��N�Y
+.z��jR����[�.��j�Mt���:�]��H�)�n���{���5ȅ/91���ӑya���U����"��Ogy�D)4	��G#ʷy7ݛ�M��n_��U�p���ן��U�_�|�����-�>J���F���F�\�V������Œ h�Ί�.�Q���ە���ӿ������~�}=�YKc~yǔ�0��*�w*�iͼ���˟�ݯ��OF����~@����A�
�}�^v��`���I�$�X�+춹��,3��z��Ӯ���=�Q0x��h�i��,.	�
�ө�ie��K�(JH�0a�g����_`�߾��#����?YO|��:RW�w���Y`��ƨ/�����;? ���?�>/����=���������?��'�a�
`�@�e<�m�����P����	*���ja4,����z�j&,��X��b(�d�
uY�n6ڛ�
+�ż���)�5E��c�K���󞲌��2��g�;�[��f��ݮ�ur����&�>4]�E�Rt}��ꑵ�GX���D�L�{>�#����K�'I�?�(�8e!T�S�TFi�����9��Z���i��e<#�"��VX[VF�i,2�ٛi[l��K~nE�ti�gh��(.�M8��������u����
�B�9�p�#���k��6|�䁦�l��>x:;�J#ׇ��-1r��e��2H���r�R���2�*�e����ó	؎�҇���e�*~6p�#��6���D��4���Q��d��H/����;��ut�M>1��L�*[�������:��?�.>m��"�bN��/�ͧ�i"���;���B��Ӝ�9L��Y�����颖�r������'3Zǘk��IӰ���/����}��z׻-��q�
+���TME7�)�*ix�vM�MZ��X�Ԧ�ӡ-�1�gk�̷u�Ł���T�R_)�VJV����¯�q�~v���5)[-ě7��8l5����*���p���-]�B��N��q0����G�G���wn��e�����l�P���ʚ���HY����jP#��B�䲙����ܡ]P����(�mӦW.�Ø���憎�����<��������vA�f��o{��<i��s�p���:@D|��W�n⎂��Ƹ�h94L�3zM�/�,"��J���r3r9.$���R�*���ռ��*�K@%���s�O:��l*#g�����Gp�	���	�3�昣���
>dC��zX�/]���cR�kp����(���B�4�f�ROq-�:�Q6⅚�+
+��e]�.�=�ߺ٥����U\yVZP'Uh5�"h� j5�R,�u>J�%��w�S̉M�b�q�d��l}*F��O܊�?����>�)�z�n:�Ʊ���1�}��k׳tl]��+�TZ����\�����7�9G��Ŧ��+V�>��N�KR��C�h�C)�eFğe^��?�
+K��G&v��ɩ7ys��>�N��S�9����O�H�}�uV��z�4��~^�4�u^J28����~R�S��M�4��R�Py�������'�"� ��,�'��b�`�@Ʉ�k$��4S�ba`@�p{����}3Y��+�h�(��3U9�,���u�6�o��4�eN��>5xk��M���7��ŧ�f�;��8�
΅���-`��.���[v�zJ��s��M4�{��7t�:����ʶnY�Zt�����?��iJ�4%M�b�R����6����(�P�
+�i�T#=5�U����e��Ժ�4�\y5��!ǻ���Qn9�Eg�Xq�5�m�Q-��>��)����3i�
pwt��_�wI��@KP�-e���}�r�W�{�uĽu��d�Y�7�[2����oOП�?��[��q�]�������+y��e��ˡ��{Ѧg��߿9�[���/zƇ����40�ӋTU<W�HVCd���UU�R��/�W�'�b{��yh'R֠�5)i-�����:���o��3,u'W��6UR�办j��d�0�x�,5�������G&<�M"��nk(l��Q�K�=�i��fϻ�h�h�ᡦ_i@���DW��.p�U������(Oz3o��i2pp.ZC��7y=�{j+�g�ve�Ϊ�xܪ���a�����]�N'�XV���U��P-�~��{t��O�l�4��/�"Y��I]'�����6I�����Z��*��?6A��.)����[%����;�=�AwQsR���(����=��{�ݵ�����^N�E�!���Pط=K�͠O �u�����o�gӗu�Ug�3�����9�N׶K�,6o}�h��&ɚ����is�f�'�jۢo��OXl��t�|=7�s+`�����gx5=Z�~�i��v���*W�SvO
ٸw��;�5���9J�'�Y���3�f��r0�Q�)�9U�^��.��2�+oY�ڝ�z�*NO�穞���OGOM�-�Rq��#���"�Z�M�E��"�bBi��&��nPZ����#R�l��"�R-�Z��b&�$��4�4���Ù}�dڤV���g�&|v����=��N�������h��k�j�ڬDl[ߠ|�~+SH�E�:J^���*��]��d:�껽�z?������:?t������׫���x�*�^W��Y@��>5j�z�5�*GM��ӭ�[
�2��:u<^�~������ٯ���+�7�����F��5;�H��H6YF�c4�t��9��C��nO��,��vӴT,�=�<.�x��w9�ˬs�i'��cj�Y�gY��2� ��|��}RM?^��Lh��Y&s�3�y�$r
+�R���g/�̕�3e�d��|�:W�N��ST&S5d��1�>GQ�a����
+/ð��&�XS��g?K���2&h���Y*�5R����V���2��E�B˥���r
+��Ǝ�z�����PKDtt�N/�(+.��<��I�؀
+C\$lK��1�Q.`9����n0�1��A+�E?����-�̿s�A�,�cLpz��<�1���S)�¡)���eI385${0@�fs7X��
+V���FSc,)���u��Z�}Qï��B�,����
+��q6q{�f"w����IV�,eӁ�5����n�vk�=��?8�=�����pw�n٫��ZYv��$��"7&^( �6�!j��[��}f(Ň�7�iy����织��o�N�������2�������_�v����.n
+��w��契�,�ʃ���	^�U[{tkl�3}��Ub#�a	�%,KL܄/�"�p�H��/�>`0�a;0\5`xk���x��WㅓHW��Q�Z㛑��$�E	j�h���
+������X�V�@��9��a�Q젯�#I��T^2�XKZL	"F�'9��P"I1�Y�	�z>א�P>�B�q�bxKh15�آb�K�����T�zM�r5��S4�Լ�Z��6� .��Q�Ѱ1ul��g��	!���7()���j�#�T���2���3�`F��6�Ċ��	�z��SDEAP�PE��h������X�؏Z��%���
+�N�����q� [b�[@YC�� �`�2_S@<�ڴA\-ģs_9��E��Kg�-g�X�8����ӈ(x���ш	:GDÃ�x�#�(&�!��!�{�h�h�����b��0⨰L�P�EƲC���8��W|��1W���Gu|\"�mpr��1��	7{�L
5g�������ޔ�ek�]	���a�K�;�D ��1M�+x&���䢂�]��D.�l�׈��+0jE�9�t@_���c!"S�d���ӂ� ���s���-(1F�J�hg�C<"_
d������5�!T�@`	��!gD�uQ��<B�o�X�uYg$�K�t��8���U�jY�e��#dgd��B*�|S�	�O�M<����6��h����PZ"i�%�"��C
�%�"��:��{��<�:�8%l֘�=ֈy�p�$Vz	�V���9Kp�$.	��XRv3�`Ȍ�O{sz�n�P��
+<�@e:0������6J���h�@u�P�v�k��B;1
8r����p1A�8��
o�x��&�&��ç�Ub�:����D�����")�GdX%9֩��'?���Ӌ?���h,?��E)���i/� ������ܧ���ׯ�����;����c���������ې����������۷��߿�zϰC�۞/�)�+��p���s�����]>`h�!�������P�G?m�!ze�����?_�eϿ\_��>>~������0�D����
+!𳄇�������&	��RMa�1�Yc+9�$�}+)t���/��޿��U�W�^5y�r�뉫䭒�Z�25a1]��$[I��L�J�*)j��)�tT��
+��HK�P5W���/�J�hy�d��#�CO!Q�s�i�Ա�,Ʉ?�0��S�&6�V0���
+?;�.L/^X;H���ⓤ�&f��Y���|Ä�N@���!I�I�Y0tYGD��V�4Z�9�vj�ߺ��ߧs�r�턥��ٝ�)ߝr^9}�����ث^c��w�+�����=��~ˊ�w_^���t?��]�f6������:��x��������:���<
yp���t���t���t���t���t���t��#JJJJ'J/�=�<f)=)])})�)�)ݩ氢[�;ƞ�k�;�ޱ{�f=d�Gv���y��eO�U���eo�]��f��e���F'8�$t�=g�ga�,n�~7	�A���������T+���B-���k�VX��ҽT+�R����X+����ޖn����;ۺ�{�]�t��=�}Ǌ������!a�x�;*2�˅����,��5�6\��`�F-� � �K/z�Ŋ����w����[�iמ~�]`ƣ�y�۬�j�c�u��g�G�6��
+����r]j+��4ov"t.?v#Wf'n���P�.FVp��$��H�����r��"�M��LG��$��R;D��X�I��\�r�q4qb�y�Z7�m4mmw �	D6Wi΀�H}�@R!)�Ԙ�72��y�0a�t��㈁�Tm�0s����eY�C�8�*�Z���Q�&�+gs�����<S�%,��OT~��}uj�B�J�nb����P�(���|�
+O��"5VD�#f}y��R�]�&�Md��6�mR+bK݂�L
	8��G���@K�X�(�0f	 I%�����4�
+�@��m*��%�*kt
+[�	�>�t���#�[��.��U�JŻ�"�٨�-�6�]3E�#zF�/�u�Qo�ܫ	�^�SK:�[:u��߭�d�R���Su9��J΋��W^Kw��IrS�
+l�1�
+�ᠣJ����0HtdV��Àѵ��{�ƗV�Y��j3�7�/��O�p��Ɔ_3�y|S�7U}S�?��"Dĝ�w>���#�r܋����Y������g�Q��؟X��'�~���F�FPi#�d��N����:	��,Dj���{	�f@x��7�u�bƀ$��j�Y'D1H�P-8M9�Q�;�͍n!m� v�7A��`�,H�Ҙ�t��L���BJW蛆�,��And�#N0G��׸� �F�EGBO���K�L@|�N�Oġ�Isn�S�T�U�V��
��е��\���:�r�q�Y�2R���Q������v�wZM��U=�jN^jU�*��K��6 
+26f[�A�9F��~����+Qt߀��7f6
Q%q�6�>���[4t#�bz����wXEJ�ew�N0+�H`8�,U�{��\P�#��n�1�'�N�l�{^��
fL���L��	:�������6�sz���D�p��(s�H��L��l"	�$�e�����kLu+W^IlAVb�2]� L�(SΔ���� .�Ӄ�W�i������W�(=c�0��FID��6��"|�
+��:�'"��<d"��D�"�K���Ų�B� '.}�ߑ1��0+m�cO�$Σ|l�S�|	q'+10�q�gg��\0�^��Mq.��f��m�dW��Gǻ���a�P�e��#�:頝����i�X��x�ӊ����i�!r�D��<���fa��	�05C���^F��
+����Ą1L����$+�p��30$��2����rz@(ݺ��yU!�[YQ�5�/�*��=HwH�����0�/�����}q�w��;�⨎�Ff��ь�F6P���T2��eV(uF�#�P1�H�[j�Ё�W��F�`�;==j�TC�j�V�#3��@7{z��ن��t�{t�4��@�=t�����e&-�z��k�.�r�¡��(�.�h�5C�]1t���B�]-X,���r�ꍉڢ�����
ʂRZT��yTw&�Lܙ�3�ML4�Oዬ��c�֜�x��>��l�Gj�������������9�6������7O�_��9Wr�{�=V�)�_��H�?��������ϟ_^�I���O�_�g������ǿ^�ϟ�Gg��_O�?��R��4�l���������W<^������p�tś�X�:�H��5^5k��KV�"�/�E�V��*���Jׁ>-s���c��E0/�uZ�:	���"q>F�V"� K�,1�J,�$pE�Ν�������jTZ	�\Q��������&Ea���'��m��NB�.���=Q��TYzj�a=������������i�����1�S哻�H?>����@Z�ѻ�,���a��J��`�:�u�(N�X�>>�V@k�U�:H%��VC�њhU�.Z��VG�
+���*�:i��VR�T/���p�vm��.��#>��uF��+����<��]��>~R�z5�j7z~�j:�����6N���*�]���J�1]�?Lu'���y����~��~x\9{}\�9n�q�G��K6�'[	���Z�;Cʠ�$���ѓ@�H�f"�,��!����YxL9.xpr��NF���bdt����"��h��vc�apt�Fǔ�Gu �����-I�,�u��6���C%z ��cE7��K��L D=���ࢌ�8px|,#��8x&�b%q�O|��D8hYd4Go��8J���X9�'���������Wәҙ�I3��:�t �+��Ƅ/-23!����%��:��8鯐R'V6Z�=/xK�31jl��8�"�l����Ӄ�%�R))�%��(�d�$�H�%��F��u��n�� ������e�LA�2�Q��)i%kCA\:�^�ř�绘��yu��3v��o�DDn�<\!��'��y�{""�C&�kLd*��d�\,;.�a�s�2�g���ұ��&>�tL�<���>��ǑWp��R7{v�L�?���^�ں�z�N��������.g"d'��Lo�S^��8K�f�.M�8Y^�ڸ.	��Z�v"'H�R\�|\����+���Ir:xe	�!���]/ز�;0
+q����#�q��
q���P:�c	�49C"iM<m�mfbY�y�H�AV�^'�?��j^�;J��)�sM��E��8���=|���ˀO�ߌ���%~a�
���%���g\tx����t�{d�����K
@�Ѵ�W5dTlT3�����x��`����h�(�q�!���{�9[�k���mk�aG�0�N[hmp�v+v��G� �4��-���ĝ������:Yg�zUݙ�3qg���71ќ?<�/�F�G��$�+y��c��Gw ݇t7�0\ѥ�I7(ݦ�n%�5n]i����c�� ����^R��
'$4��j�A�X$�M���JFf#ӑ�X	��A��~eD)�&N��Bz-HJ����=%{6 �rŕ�#%7���IҔ2�QQp�	N��r/9�-���H�[���rۋ6)#k͡�e/����n�S��t��j?�:����{�u7���.� �X�|�b�7G8x~a��UOH�p�N�]a�����;Px�P�#I��FD��e��bk��Sn8�޳�B+\Ѧ�)QPp�$L������x�ӕ�yGC/4��7�g6�g�g��e�����Tl�W*���+^L�o���5)`B=!rQRq�Jo��'F�>&��p�$�1�� &��TPɬ	4�C<�\�y�na��Vf����銮�t�����陧S�:3�O/]0t V��=��57�;�0V;�Z]7VY7VWj+�U��J���+�<=�r�]%�u��Jn���Ԛ�m��I/���__�bf����<��;j�E�*�YxLC�,usԯ���z���BQ��T��3s�.xz��Dg�g�E��u�Σ��Z&��Pf��,jrt��ߞ�z?�8(�
Z�p����G�b&���0��-�vh�C��t?�M5x������{�� s�+ܥ��Z[��!w��F�i�&�A�s�Y��y\.���Q	�X�
���=�PǈF�aA��\e�Y���av�$�	e-c��k�wCoG�T�Q`@��\��nQ�#�wh֣݀�'���ٿF�
*o�=�<Gv�y���A��&(��v�8�Ƽ,w&�Lܙ�3�ML�����9�{�[�^o�ME�y�+�6�JN}v��W���>~���Ç�w}9�5�1�y��j[=6ַ�������q������_
+_�pO����_>>~y�'}^>}~͟�v�忯��zy>J�M��zz���<Ux���G֔(���K���(�B�� U���� GYHR�}��*ʀ(��܄�Isg!O���
+�n2E���Yv�$��s_-���Hp��>�l�\R�t�#Md�#J���v�a0J�,W��d222��jmVi�ְ��WC4���4���4��p`�FFJU$ՅRRQ��_z��aH��ն�V��g)c���$��B7��姿f��W�b�XMF!їfF7R�F�|H����a�hTGA}��"�=�x�p��"�3���1!�$�]k�x��"9
+{/�D-
UE���"~%,1��0U�׼
+x5�砧39��f��,��
;��|&���n3��+�{��ݾo��~�	�?Êsf�/��w����7+A��	�s-�v�mF�S֟�X�H��0�F���͂���5���M��1�܎�+h&`=ѝ}j1X5 ���vC?�hل��-:_���V(h�����`�(ไ̲a���B	�2��K<�Oxj9���^,f�f@_`iw�ڕ�6��8���j0����� �
4���4��n�dZ�@�k����_���/�1��}b�;褎z��
�`̯�(F���E��@B�Ir��0�e��^�X )V	�M�s#!Ctx!�MF�aH�J�W9x����(��IxD&q!�l:"Q���V-#�Y;�;��� O9��ah�I����j�[b2�L���#�&H��7��`��SB����;�iD��#��V��e=�j�r�~�8�m
+�#Qё�#�H#�a��j`Ŏ#;��Ĕ�R'�&�k-���*#�)x`���"G=����N�8+=���;��(Ţ��zooX��G���P+�Գ�u>�B�_���M��+�ZgU���~,7���x�����c@t?y:��)�����K�պ8�+�!q��[����2��z𼷕���8�8oe�G6�c#K�J�nl��&l%�fQl	�� ���:�����Z��]�zY���P������v�Lo3���/7�A��	�oY�nq��O�y#i��Gx��F��@:��ܝL�22j&?#��z��j����`���n���8��Q��TSNw9~��ȩ���k�ʈ��/Cg=zt�r�tw�����.W.��:��.��Ie�k3Wgԧ�V)5U묗ks?�U��LM#�#�clg�V7��l���{�]}��le��2��J�5���ؘ+�����{V;<�pV�F�G�H��w=���t2�\8UA�Z�������P�8Z����Z�C5'�lsT�� kt{�c����g�aB�6�̢J	l����=����{2�9�Jޡ�4�QDA���4P�EM8��t+&����дx
+��%��3����	�Q?�7'�7>��?�;g�̀G�@�Wc�*�L�ji�m��w���Y�����v>�#p�|g�����>�%v�EG���C��=���� kdz�����齂���Dozl]�B�:�x����?߲^��P���&�,aqQ�AY�S�wL���K���&�N�w���q��y�%�M�Uq׮M�R����.���0���F�k%_}�~� ��(x#	/�aӈ8¹��}��g��Ꭓ�jy%�Ys����~��Tg�P��7�0v'����zQ�9�����T��]3Y�OhyJ�,{��L$�kͷg���~�#|���%`,�OiC�c\9-�ᥰ���fC-c��0�\�x�/];F`�P�PZ�C�Y��^��1�yΙι�����SS֒wĈ����/�����s�,{5�y�2��zu9��@5�V���2�9�j_����_����%�o��F0��Ʉ^'�����*%d
1�k�/����e��R�я��o�i�ۚ�b
+$��`��>S�o}'�Z҃6O:�	SHhot�&v�-	�l����������fx}~%�����D2�g�;�����t���nT�.�m��I��/g��?��k���u�v�K&���].̈́�O�>d���W��K���	�]����c22�dd�z�"�� �1�N1?l�Rw���T��)�@�ʓ��\ɒ��޴�՜ן-��+^(�]�
0>�4
+�6������
��&5��a�"��2�S�B��g�?���H�����C�qե�F�F����M������5�рW�����l<����$��ۄ3f�`[ӝǷW�M���m���f��X�\�����z�4T��,l�j���5�����
Sf$۴6CR�>@Yi��aP�6�%��z�p���RStS_=��o�&��3���kUg�K�b���;꾽��3�������9߬��$N�w*�n;����պu��程�K��x��Q(���z�k�]m�vP(�q�9\t��.�����7���{/#2#
+����B1Mp��b�a
���Mt��S�q����YPb�l�)��rZ�'v:��t�)��y���60|�/�fX�����k���ny��%��(6h�@V8��>TH�H�	S��'�4uv��4p��_����nխ����:;�άy*ݥ��.zƵ�ۑQ>��h=p��"R��`%Z����%��1;��)v#v�	=^�C@�Z1Dib�C	Z�����0TbW�h���d;��!50����d�m�Ys��(��5��F�/@O�݉�JV�\8 "	;P ����O���_��M��Պ�!�C��)wN�>��e���-O�p�!���2��I�?�d��j���+�[��1
+cm��[�o���]�mLu �t���~��BV#3#���g�$|0_�:��n%�����U$ =����E`x�ka�E�u��h��R�V�S��Z[dFb����(	}m���&9$��Բ�����+��Lg��|W�h�����³�x����e}+���+k��a�+#�X���;��c�,w����<Wf�i�f�o�r�#���H
+R���&�/�嶣6E����_����hr��O��۱	`�}i�X�*����>{��Dm�
۶b.k�"}3�=����b�l���Pĉ.Imu܁���'�p�Iѕ)�D�G:u �{�vK�n8&[z���=�����߷�����3��6�D.D�!�ʋ��h8raa�LpI$aIӓ8-��p4+���6�ȦHF�N���:�d�8��<��"�̀����R�;�}��oU�Z��j\o���o����Ssj�U���T���R�7�����zW��uY��
�K�'9m�N:4(��ph��z����?�ُU���x,��S��݋5c�ǰ�G������wб/￺�ь��9���'�U��e/�9�mw=՘��$�I8
+��˜��|�1u���[��k��&���V������r#��6�!8���?��f0[u��o;�j�<��'Xx�<���=�[΢�c.T+J��%	�I��B�IGl�Z�*=�~B_OZ��Q�I���E�$2�g�%���ѩ����-Mj�b:����$�X��Q)��dJ:ݼEf��JZu[�z�g[�T��!���p�
+j(V�T��p6
!�	gp6մh��d�tVK�쩬�V�K����r�Y(Y����W(	�)ee�lY���pNRɻ7�g�RI�E�gk�ʎ��e$6g�eŋH-;�2��˙�]��l���Q����͙�^ټ�͖b���|$�'B�VKg�&k7�I�3а�+Ǆ�h۲�:�<�G`�<V���j��xx�?������ky{�5�8�5�W�o?;�=�~0c��>��Z�~>�������ûq��y���g̳d��Z�)�N'-�충Hd�,�Y�,Q,���0k�Ao(:�E0+`ѿ"~Y���e�ˊP&�+bW���\�,q��Y�<�mvh!��)a�Fe�Ng��l��X-�Z���l!� �1h׊9-���o�
��n���[�-�����p�x�_2�EɼW�r���5f�?�O��Ǿ���,u=�ّs����.	��C	�c���R��J�v�t�]��#H�Q��P8H+G
+���Ɲs���#y;���c,��9�#GܨC�4��0g�A�7̩
+�tn�u�+��w�3%�!x��+��:ؙiz���v�%��o����Kt�p ���o��2�%�K������/��=�
+endstream
endobj
183 0 obj
<</Filter[/FlateDecode]/Length 17413>>stream
+H��mk$���/�w�7��~~0!���cl��0� R�Bn��΄|����{wVZ݃�$�Ҏz5=]տ�WUTQG���O�>Ƙ�c���K"�I&�T2�%�|�)�'��JZҚjYe�u60�}v9��Zr͵�"a��b�]�%�bɅ���e]Ģ`f�0�XZ�B�Z%LW[Mu5�R-���U��[���0�~?�~7��g���f1@<�f�1��ǆ۝z��&�۴��3�ܵ<c�f�-���6�\EEX��rH!�|p�tPA�W_���>����y��^y�b�����]r��s���r�	���b�M6Xo���Xm��V ��,���$�`��3�Xc�6�H#�]t�IG��N[m��JK-�cRTVIE�WNYe�VJI%�:�pXy�{����/^�/͛����Լj~5�طi��F�ؼl~O�������>���s�Z!���{���"�b0��q�h�h��@D�b��p�|q���/8!�tB��ť��1J9|�Ap諨����^�f5[1��崻��<��7m]!��1*-"�x#T䉤䛨��O)b�n��޵y�8]ק�F����������o�o�o�o�H���ߏ�o�~��_���w}h�/�ݹQ���|��q�j)��s`3�K"�"�J,[*��H�2�$3��^��״��x"��@c$+����"����lp+Г�IlM���jV,x�=�@��>�W'p(����&��d�Gj��C�����s8��� ,�#���5H���й��"IB�8e���ZÊ@H�WKՖӴ��D�9Q�S���H��5��!�lC'�N7�G��MFWf+�ƗT�ִfHR�@Jo���\r��$O��<[`�K�3�nK��mm�$}��a���F:����|	y�޼��8QDJ�$�!EuV���S^�*��Hz��L��d�&ȱ+�s��?H-�%8�3E��)E��N8$I&Iw��Ҵ���x:u�)�*2 �-���e�.�!�1v��q�H۲�6�uCqY�rj�D�Lԃbl5�D5��Q7�D��x8C���DT����HD�a�>&C]��.�.� Pf�!�	'd�2䁎#��qJ�����8��8������ʆ0q�攝4��?(���T7��2!�}�x���=Ή ��1M�x&��Dr˂�A]{$v�\R��Ù׀
#RW0�9�E��D	-�`��6
�|����
+�4ȡ��Ċ����F���,R�[��Q�=$'qc��
+y����{S!	���P�����C۳�X�Of���=7?��"�\PÐ��"������ԘKV���y�2�Ј�:��`
+�hV+�V�Ƅ���Q[��VAX2Y�G~%xࣃ��*x
&�a+bP��x��p&Ή¹8Gg���%D/���A�?��y_��g���ie��Ȁ��neZ#�� ܁t�ȧ����i@�q6�ipju8�_����&>�	3_\�nKť�H���t�h�|#�6�D!�A+���b�����iwq���7�6*4=��M3~l���|�ޖ��/�w���o�}����ݿ�#���~?ƾ���y��~}{3���9����0��o8zT���f1ۿo��Eθ3ӧ�5o�i�4J�q�6�-��_�l+�{�{Q���ʪVTQI�����T@����$n
+�%h
"5��T���1����T���A(?+?b�F��"d�
+�Q
+�^����",��
+#��.O�=d,A�PkA�j]!sX>��ʝ���24"�Iyu��!��W}�-�4z
+��y��;,��A����q�p��o�S	��8�qH��!�C �D��L�H���hRy�!�C0�d��9����b���h]� �#C�Qv�31d:���x�8~��dj%��>�彭�a6���!8#��2�'�i8/��K�QNY�Z_�v�,D� E��-,G��;���/���A��ˆ{=��^>�{�;�&N��)�<A P���ߢ�"*���`!�vPw�̠zp�sOQU���|�T~?��_�������
�1��*4�2{�����JȀ�N�BH�%�UH����X�����F@h
R�A�Z�x�3
QjI`���H�+˾��a�!q��>��J�k풯��7�'�_���'I智~=�����i���w�����D������f�?���=yR4�ʶ��0T���O�Ȼx_�����S��i'E�k��p�0#�9f�ȑLŏ���p����>kT�S���v�ܹvo�{�ߩ�o5|�⩎o�<�y�U��᠊�j�Vշ��*�V۷��{Ne��?&3��CBۦ�V�K���3�&F+�V�!Q:����)򧴎nLPк3��铵T}���𜶌�a;D�������xa�f��3�{�F�~������������_o����i��?�;ݾ�����ۇ=����z�p�fN�����P�z42Kyi��S��]F��}jr�W�y���y����p�W��k6��/��D��D�?���v�O>O���x:8��ܜ<�o��cۘh3�0	�@A�T!��EK�XD�!��k��W���:;�����c���������ߟ����B��X���Ko�/���d��mɶ�l��P(���&
t�΢%
��=�$���J����y���8���� H���i<�r������m~�U�Bk���F�W�[0>�q��¸����'���c#�q�]xg�w�O[��+�36��t��m_3�9��8����+��%Y����i�(��q��ոR܂�ty�|��{���%8n�K`�9�m�)5ӬP(;uJt J&��t�UF5�6�W����������q�^s�������2��������D���?~�t$�F���-��*c����>*���2Г��C�ؗ�i-�j۔��=�>~3.��^q��nq��ܠ�\������� �x�|���ی
+�݂�y�<
�R%Y}\z�Q3�
+�k�����j&�}�g�ߊ0��Z;vV�]����Uû�_R�#��Y
+|^j��3|�T�g��H��8�If`����l_*�:ȥ�\�}��w�~ד�PLҍ�e�ED:]�@Q�J8W�	{5��'hu�7��^^�ιM~S.�˅�'�;�B{;�̻�����-bm��	Y�w��O�������ϟ�����%}�)=�0����w?�?���~����Y��M5�c��:
+^<Ɓ��x��b2�In���Z�']o��4͒^��@���\g���Wg	���W�w�S�B3���m�6�6?S�We<�~��B�X�Ϟ�Ҷ}?L��Ϟ��֓m��1Γ��I<��'K~?��y2
p>�o�	��j��^�� 7�/��q�N���	+?\�U�6T���u������a��|�v�a��a�{��4X(������w�?τG�\����������b�
"B�@*�nfV�JWa�z�g*��'�o��Vż����
E�����c�B;ǒ���������"}��*��̚\��[��WL��~Ŝ9|;���i	=K��:��&j�OA�82
+e��e��C�%�ab���򰃙����A@�Ī<s`}�܊s[E:c��!�`@������	����@�q7�/9H9����`V��m:XJrZN-���NΛ�����6p�����UJqVw�'Pb�R*��J���=�Cm����I2�\�g&���	��㺖�����~�`\d���m=N	�*��K�����<� �<AdI�,�������� �Y]��	<�`V�M@��H��N��J�u��]r0���3t��a .`�[w�Ki��������{�o��$U�Z�;ȩ���d1Wm!^�I���$�%<Rq�A�TҺ�
+F(d0g�f�,���nsA�9	kl��Rw�E����z��n���<ii�tK�n�ˠ�hnr��܊�"Թzu<n��ף�=W@��pFp���✡���-�q�tӅ��^S8^��A�Qs�d�#d&@��Y�Z7�k��!���`�%@x�~Š��9��0��R���
+bLʑ��L&D��Π�X#n�a&�Qˢ[�:�6t��f Z��n�����(�����:���K�g9���,y�Sf�{��N�|N�4�
	�k�Z��aO��Ջ���b�l�]j�"�$Khb��0�m<��j���۪�Z��4Z�6���x\����������m�Q�D�$���q�c0�6�̨��+y�1(uT���߆n
+��EP�#gkRp�X��f�BPJ�0��R����AL�~���R
+J��0[���ǁ�
+��㉝ �G{��s취���t�n���WաW������m�ˎcy1�5��]*`Α�1����5G)��I1G-G"F�ш�=�Rs0v�̑|e�;�ȿ������C����Dc�y�<-�W���[
����-4rp���yl��ً�j��,��[�g�C��H��[�ÊK��mv�T�[�wJ���e���=�����K؅T��t�h�cTb�p�?R�E�[�;���=�'����f��L�+
l%b���qM��E�{��7;�hM1ve�-�tT@�B��0FǊ6��w��8L�,��a�o&��h����y�|.VP(F���Oh�� :�:�j~�ū*>�	T2�P�J�E���J��Pn{E;�H�+�С�V,0��hDX%�HkrT0GUH^3?�9�ؓG~J��U��A�u����j�O���1��5�`��	8I������|T���x����g��QP����{0B�Xz$k�
6	���Bj������8�����g
+-�M��α�J`-zYĔ����t�P2q-H�Ȥ��*�YbN�Ia 6@Aj���	������ް_m�-|vXjLނn��� l�U�`�&�J�=Ao9b��j�Tp�Г�_�Yx1H	��:��NV*xH������&�>�V�U~vYX�y��bz&p˛��@<e��������W4�ޢ2����]�C�_W�k��^����({�b�b'j�FzN9CY˔f���E���
 ��}
sD�:��t��*��6����<��m���&?/A�r$��B��n�T,�14iD�,�W�j����^�uG�Gp[uH�.ƈ����`�&y��8�E�7��u������j�h�G��i�p�%
+����k4�(�~U�P�XP|��%@in����j�bhc��
+�+p,��Y�����6�6���c�������]5i�� �J*���m��<��U�̦��ŋ$!�� 1�W��`_=JV��aa���NkY[4z��'5�ˣ���0S�p�Aq첚&�Å��9����2朙��S�9Ԝiq��IE�\WX�-d�s�Yؿ���ܒ�D�Ť��#���E��'��B֝u������)쌀�b����ׅuP������C\C���r��-�B��h��>̚�5�I�x<�k>�sy�/"��\�m�/s#��I��۳�؄j�4UF�9�I<[[���ͭڥ3r/��f�S��Ơ9��RR���Є%ڦ�"�$�����OJ�BW��Q�S*�������2����7P4�/�꣞Ltp��nn��h_yX�(О�9�;�vw�!�����^�j�?�jVr������Ifj4�[<���7�
p���f�2�H��s1��,}�3>%��W���_���'ᔄg�\��r&��<�\��oG��N�_�U�����:��lJ�{e�@i,�j�����;TW�k��FO	k����7/׭��OWZ�<����v�R�o�f�tO��a����ʹ�T!�:�K�dD��b	Ct��Y�~��4)W;���$���%��u	������?�S\Tb���]8�d2<tJ�6N|m���\�8ȊE7�`�v�@,;	p�J2+�����v����XLVq{Ab�/V��9�$ŹT6pUf�-����fp�.�7�ڽ\?w���{fjW��V4?J~��k
+�/[�>��d2��dn-���L
+���-�$�~`�59e3���gw�� ��!���)�����*��e7p��}$��9w��x� �{�:��������f� ]�\/Ha7� Oy���l��N�§k�Ƣ�R�hm��2��^�=t�N���`�G�E��M%�|P8%��Zg�ύmn"��C�n���<>t]��qx�����Nb"�6�?aН�����0�[ʆ#"Ƞ�,�Б3`��v�,�����*��lGK������Do��Xsi~��`�}��6�\,����k�`x�>�w��}�c{��-.�{�l�A�tk����]H�'�q�SF�.>Wiw�!r
ȶv�~����e<��=�J6k,$7�'�i6�o��\7�\�P�{S��*`'������6��×ZJQ4��`��ATeC�0-E��C�'�^RáE��X}��z�N7KE|�����:��8W+'U.[���!b��6��,<��k���PFo�>�:�*���p���::sX+WKu�d�:�'B���)>l�,�Z��)�^��!�P�q��z��|
+���+Aܕ�%~h��ڵ����*����Ṽ!�b@z!(�$��~cm��Q&���c;R��+�n��O|�=��6e[���O�My2�����f�ء���h_�ᷰ&�A�����;{>bTO���!|����q3�~m��`���m��KFP�&��Y�~���X�g]6��G䲶ËD��xc�J��VF��OrN*,�/�Q[�s�}.ۛiĒF�=[�3
+��A����ܺ�=��1�g+�c��bl.qj�=}C��r��i��ɏ$Ǵ%�35}4]�qؖ/��<J���
+��6��8�Bޡ+����jz��O�.�Z۔�v=��{�mw;��9k����՘��a�M�Ɠ�ڤ�e����-�5��u�b�γ�x��D�X5�&���Bm������,5U�NކGd��0#�J�U��;�����` _�p��x�P7� ֲ�m���R�kG�:�έ֋(}P�<f��t:]���:�~)܅�w.io��_%��y�s��ˈ!:~$#,����W�\u�5S���m<9���1k���b;l�����#�@�р�,>M�����հxK����%��TV}ˠz�E�҅_�
w�[w���17�Y���2z��Є�E�q&��q�N��
0*�x�89m0$�+|���۬il�얧��^�G����6n�KD�#��BSf17�l�5GE�ؖ���I�Gm?�&��ȏP��ɪQ<��&��zI
+}e�$=��Ͻ�&%�B��͘�a��9)�p�q#��.��_Nh������/�M����q$��c��änF��R?����#�u
>c{�5${]���iP�kU�C�2��n���5[��w�2�K��k��>���Y3���4�v|7R[#H�m�*Z��$���ݼe#�C�f���؅�9�?�i{���g[�f��L<�UZ�tj>{��H�����a��3_�*k�'ֺ��rupW.]����:��Ǐyrp�0��4�R)���k��/���4����*#���.�?;96��:��^\���2t"�߸%^�g��զ����`G�}�M���&X%*�{��fæHR�u�p�f�ʱ�9��
ّN���
!KX�ב�~&l��b8�_�븲�~��;i�'�p"����	�dZ��͂��~�:�jH�ce8:r��|���Y�=�?�Kj,�n}|��lw�c�M����9�h�zӡ�MwF��,_�'�!3��
<g���W�2�f'�4�N�|O����D�"HD.�� !+G�$�!ꏷ��	��8��=)0Ք�wG�\-�c>MY��.�]�\�q?� ޙ����@�ʝQ�ȵ;6�dW�{[r՚X���q���v�
+�ׯYehF(���%�{�)?�l."Y����y;.�/�����qCߑ���H �d�3�?��>�ݪU�THU!���э"�}���sovAHh9��z<��9��ȡ9���5C�<'�j*���%r�y?(�J&��jy�� GJ�h�5�-Ԥ+���h �5.;3>g��w�v标�2\?}Nrc�o1�3ū�s�Ԏ����
+�E#�°f�TN��S��&sɬ�1i#K�n96��Fs�``�A���8�ˉ+q#~.v4�*��5�E��
+qz���5^zs�ܝ��(;��b�o(F_��v���42��d#���$��%o��V��x�r%o*I��$ө�n]�ٙ�A�QaI�dt�r��[7-yG����mD�c�_�ΠEixݫ���t���ǟ)�6����1��#���+<|�;
+X�FjA4,�{#�0]�ٽ.G1��&�5#@_2&�F�U3����:=$nw��Y*vl��J2�m�����X�טz�}
��A�Kr0�I��3a렳�F�B�^nq��B^4��6O���9.��L�Q2�I��s��>�@�Ū-J��XN���p��]�{}K�S�֧�P��V���
4�^x�I�G��{�1p�fWi�S�}�JHG�Z�%�g�rV���?!���ru쵮��ϩ��6P���JWK��j'�.�2f��p�B37}5����26��6W�����K��X�`��yFZ�u.���tI+B��1j�d�kV�f��K�f+Zb�v�����R���F������D
+�%!�Z�%RO刐SD�r�͵;M'�0k��ڶ5�i��ة#���l�_�l�1��aq��cf���P]���"x,�h�j*>�������CD��R��\�P�4f���ͺ�����kN��.�
+^-}�Q�`��)^Lu��LPL}�8;��ףx��,m�o�MN���/�=DO-��6�>cRr� �$mMW���s�wu�g/]uU�����6����֝C�cb!cVab�4Tj\�#$��݌���H���(/A��}u�Z1_96�2�j=Z�) �D?�C�����H�׎���nV�9�c��8��ζ9X�I
���E7AY�#�2&�z\�bZ���`
�����N��8̵�b�R���/��kG(ڂ�F��V�Z�K�鸚cc۱9n��,܅��s���y�v�~�%���6�9�s����:�m�����1*��J�x�9HNK�C��I$[���s��s|z�dN����Kcw��(�#��0b���������T�_� i��Î��$� �Cj[��=��|XD�&a���G�;%�r��,A�8�0r�/>�	H�Pv�A�y?8flFj-�06�{
8:.r;�����&r3a�qI�����I#�n���<+��O����i����v��څ�m�P@��x9���jEa��@���#��7:Mt�8+uvxL��,�*��6D��x��6���0&��pC9�����Ml���M�K���$���>��D�X�'K'^؞�>�i�M��2�3f�a/wzf]�כ�ӭ���ҲN�8�7u;H��];�˖=�ߘ`sr����)�PN60go�ø|��������f��D�Ē���Bk qV���Y�a��h����'?
+��0~���-_A���"-��[�D����
+^���Rxy�.|n��:��Sø�� V:�,���]�1��i�.����A}�?��H�g̸�=���s$׽�Iͼ��`ncF�#5�Ĕ�)�����x���[�K
ߋĬ��50m�z�0������_�5����%3lҎ��vBW�X�oC�&Q�6N3�ϛ��B��	��=����n�%�Pٍ�%}d����gt�h���j	R�uhQ[�u\>��~���R�bi���ϸh0ZW�`r�\?]}!���Ǐ�z�����o_|�����������-��?���5������7�o/���������G����Ǐ~��%�?�>ٿ������K�������[�ƫ�qpa`��a�f�_����֑x��3��o��_�F�N�RX������ �{1Df�Ӑ��j����z�Em�7-E��Ø�����ˤZ���!M��Z��ԑśP*�&�#$�'���B����Z��N������.0�t������)���jI�:ΐm:c��RZ4�l%k�Ĕ��`ҕ���h����J���u�a�\lC5�%h��/[����0���aOd>��x<ϧ����Z��Ss.1�ۛ�k*�g]�ē/c�	���g7H�<��Sx��+�{�����`�����æ�JY]~�=��aKB��q?�3��5[��f�f�u?5��Ka��_=����h���s2X����L|����a�M�E�����b8��!��]�0U3�\�34~�ݥ#�P52x��i��~pe�F� K����L��ܿ�
���P��]Dڒ�q���
+(W-կ����4U�>�L���1g��Ǵ������t��Ң�n�N#�<l��M� iY?�9��%����������C����x�T:[r�Λ�x5��h�&9���b���vYB<v�{�3x{.�t
+{�d�x�..��������dǄχ���a��k��_?�x���7w��w�����{򧧗��������˓�޽�p��׷o�K���Ӈ맗߬S/�x��ox�����4{�-��OϬjb���-vY��o�;l$�[l���,يj�9"\���ċ߷�`�_���jG�趁��|�
�d�$�
�8RYp����
���*�J�@Ҩ�4A�qd,]��
�QV�-�3�D��0��NR��2�`�\H���,�l�Eڗ
+�$!.C�`�ϴ?�f�]]���6��	��`X@�:I��Eȷ=��qX�AU4��_�s>>B@�8�=%c0\��A�A�+'�B݈�|䠠�,	�`+-Ҿt0�)��A��')sbqѹe�e�-�?�Ad�(2<��o��s��6h��e�u�?)���{GL�߽�<�M)��tP0�G5�g>X!Z��by
+�m���KS�E��l�8��m�dc���el+\Ә�8���b0��I5��\�Vvr���t>ƕ�S�h���
+曾w�H��I!̚sǴ��`�l��ƒ��������@{��w��{������s��^�s��k�u�Ƨ���ƺ&��Xq8�ES$�};taïK}���U@��#�q�zX�uPr�CR�O���➗L뙃���$���@���DƤ�#$N��0��^�F�8OW�E?#��CϮ`�p}�]K2��l41�8�fU�M�:(_�����E����@p�|=h!YK6�$M_I8{i�����w�h`�V�b̹��ܳ��,�U7��O�xv�X���w'� �,�4ǐ
+��n�AS9M݅,{]׭�h#�s0��DC�XX��-YRP�D�|c�W�/Lcvy;l��w�.�S�"b`����'�kLM3��Ɗg��YR5˳��I���-��Ѯ`H4Ҽh����}��UZ^mڕ��LbM�Cc����H���U����[K�[_�����
+}a&
+�iqwS�W�����0N6[�)r���r��]Q֗Z�8]��߷�;�LO!�6��?�i��Ǝ�R���+��~��o98��ϯ�������?�����������c�����Ҫ��͂�,�Ӕ�+���ŷ�3b��J�c(�`���'�ҟ�@y�Ql���[Aٖ���F�	/�f�/�J��8�cC�F5�g
+O8�Ҝ���L�O���H�c}��GCJu�fMlZ?K%���f�:|1?�����g@���뎳������5����#�lc��o>���$�6�˫8���4[��ӅCS.�VM�>[~C7Z:�6�����8}/DN�y��'�sPPD��c���o>��[bM��,�q���"�1D7<��\)�&2z�
+�n����
��`"+�ld�qZ^la�9(h"K�1�Ksڷ�\A���U|�Z���9& l�S+ME�(4��r�g0@8���
�I�ƭ��`�w�����������2�}����4���>�K�8�|�vI7�5���(�R�ܔ��P��i8�
��`+��%��B�Ƀg9((9X�1�K�/>��r�O{M�T_�a_x; e_�S��t���25=��n�O�J���x�G��'-?g=_9h�j�!�K�/>����].)�R]e�!�lU�Y�=�]�1U{Me�����/Z%���*SUi;�;�A�^Z�}���%���
+�V8����ci1�M]d�B��@����a�ʋ�������s��䴬QW�&��������P~J֒����D�պ���$�k$�؉�c^���:J)/NwF�8�I�YYB3��d������-���߹���7/�����ZHi�FW�Ѿ���=�u�"����ƫ�
��{뼍�c��{7_�-�{��:�XH��E�0-���3=sPP,�Jsڷ�3�*�;�C[����
+�&��7r���v��e�=ʛ9�g0>��Z%ap�G��z�B0���x
+
+���o��[�O��p�2Wy���qx��Ea��G��~�GmFP�㯍zWx岞��IvD��ՕV5V��/�g
+
+�o�9�[�.�H#բ�`�5)��V�{�V��e��ѪI\��(4�k��
+�
�*��:xR�!SU�٨}=Xy��rH����`��`�,��*|r���S��T�Xq�f0�h���5��q���4�y�+��X���:(9��܏M�v�~� ���	�`/-оt��2Z����jw�/�s�,"���BGaJP
+,�~�L��͋�A���BR��J�����R�4�|C�W�/>���/����UO+�Q�ps��\�c����V����Tu��A��O��kPZ���r��ՄCp,�h_:|r�4GS����8&][Z�46���<��4��v�l
O]U6Z%cp<W;�EQ��+MeM��%�K�O���z_Vo�5ճAI�������8ع���yz�:�fP��I��I��@j��������Zh�O쟜2,�!����}�QJ�������B�,)�`*T^�^W��.����c�}O�C���y�`��oY��������U��Ʊ%�/q	
O����(�b���6{�G�־)�uw���h|��wc��ٷ>rPP,��ڗY	A;�oY�rPWaح\w��¯�<��ie�N
+���J]WpG
+�\��L\��Ny~=H�'��e��X�1�s�[��8����vTv�!sc����)��:(����un����؝��?{X����Pm�Ax䠠I,	�`/-оt��Fr�
+b0~n��i�H\j�G5ʽJyT3�$VK�q��C����|�CV��z���RiW���n�����'�A��-����B++�r���Ύ4uc��Ĺ�;���u�:(9��豴����o��s�A@Y�^Z�}���}���i��~����⚇�֒JG�Iu��A�
���⌠��Cv�O�9M =9O6{Y����3��~	�,�2p^ڒa�(S#��CNr���e��5]�J���n�'-_`�W���p�%�K�O�|����X���WM�n��+�&���g�$�+nB6�u�D!���u�O͙��C!�H,�����LOW7�����P0�ںX���n�z]a+N��:ڴ����露�L���i����̂�bkYi�̂CG)���L��86B�R�JjKj=er�v���o��XK�S��eÉ��5Z\_:4ܠj0���Zs��OB��_��fsg�ppȃ�[�S@������6y�)l�5��`���g�2{(����u�ږQn�?���.��]z�q�����Ud��^Ƕ����K�c���������A�c/�$~-�X�[��j�T�/�����#q�������m�6��ӏ�7��	�'0�o����ZA�J{q��W�h
d
����0�c������+z/o�tf��&�AI򘥄'�m���7�p�@���.�jT���^\qw%	�a�@
V4��z�,6	���(����ypl	�K*f���b�s�y���cؗg�����C�kiŞwN�Ww���q�����TwE�+���f��Yp$��xsUs�ñ�"#̙�b��JT������ �����Ap���ba��n��b�늭3c=\x0	�NI���ĉGh�H�˧�΢ø��ն����Rz��O�øy2��t��R7��,�[W�����(8�i	�Fch�V�X&�_��w���Bv��[��V\0�B�h
d
��W���b�J}����+�]�oYi���cRe9)
��\|��.R��
+��]-���R�K�H���+��^:m��R�0�S�J}�Jz�d�95IO���^�S)�+�D�q�˽K6�Auêl�y��m�]��A��+m-=n�<V���ZS�Ç'3 �[������e�E9�F�SЯ�;P;�/�Q\;���A�I�0Z����1lb�Кr���C�w~� HxJ��(�P��U�}�{ R���E�i
+�8#e)l+U[�B�
+Z��NG2
+��M��ԄY��w�[�|§��.쁺6�7�!������a�m���Dk�'ro�j�d��P��Fk kЯ!8��T�+�h�Fү)4Y�+����Ãq���/�*E3Y�4v��&הط�[�C%����o�+&$�����d��F�ۮ���������"�J�/�y��`�9*9�����	#��bp��ʘCw�!nH��<:])�w����7S>vz��������ՕZW�tw�ɼ!�
+C�gp�{�d�R��Q;��]�;P���⪯����AlU�'*��s�]��d슭5G{��`�y;�MpC�d�U�L�b���`���:��Qz>�?m�q�#���W�_qn��w4[Y�+�f���3A�9V	�U�ނ�ǭ�}�C���$� �������ϰp��5���۪�h.��M��v�֚�=|x2�G���\<��-�[��r~�Y��8f���r�P�z)���A�A�1���s�40h.ףط���O�{Ha�Z4�����z �(�9
+�E�G��Q\z�����}'�k�UX����I`PM���w,���c�d��#������ ���f�$���Bp��z����l���`�Wy���	�Ѭw9�֙��.h����?���/���������~�a`������_}���������������ۿ|����������U��c՟��?���t��_N�?�vq�-(ZpA�mǳ�ZE������ .-��*;��,�:N�|��#�D+�}���ؽ����a���&�[kF{��\ -ԐɪĄ��d�c�rw-�
���:���RܑP�ct��7��7��r�O�u�B�����J]�k�H�����.�j�
+>"\��wl�t�񙂸�.
+Tw�|f}��.)l��f0A&Qy-�uL��W
2�
+vŮ5�=}x.��o]b�OO�
}�b2F��)�)���&G�J3V���@-G�z9R�A̸���j0�uŮ-#==x0�X�e�r�<nK�lpow��k�tm,�wbP
YN�g��^6Z�uX`�:��z��T�Y�/�����sItp��d���b�1ܣ�v�I�Ss�Z|ŭ�N���@V`�T��GH�ڋ��������b}���Hɤ��+pjC\H��8#�M�j��co~Ё�[Ԭ�1B�d�5�5�g;]�����6
��"�[k�����Lz?��������N�Ò�b����e��t�����
+�
��c�OJ��2�����XWlm9�Ã�譯�&���2�q i��(��:,�gj�5�7rŵ�~�xk0�[��h�GmT�[k�v���Dz��vq��A��KΝ� �#L�W��Ĭ˸&<������Fv����_gP�^���F{R�Àg��O�џ4��Vᓒ��.|:<cc��/S{��0vݹ�]zR���6L�\��J�]4��:p	��DNu2(-�BZ5�	I��䆵О>�n��b'�k�\�����8���0�4M�rU{��\��8m-�cX{�J�@֠�
+>�q-�0���TwY�/�Δ�t�����"&��#?��8v��a,�4M��5ۣ��d��b��c��Ww�>c�i���JPf���3�Ӆ'�'�d�j3�N�9�ň\q���↽ցj1�e]��
OWZN	6d4���:W�O�T�Y�/�Ό�p���	T�lQ��|Ds& ���q�j�q/�:P=Ƣ��b�xh�u kP������KH�40�&�`Wl���Ã�x�9����,8R	��&�<��W�I�-�Bs 7xi��qIά�:�5�U 9ɽ����\nT�E�+�Ό�p�:��6�B���xZ�,s�
+��$�֊�]H[1��y��M{�I��T&�GP��w��۟��ޯ�Q�ے�5PzP�COp
���ZG��h������������:�sg8�ް+���C��Ρ&�Fsĳ��O��5PzP��%��qeԽUe4���J{��f�O�E`�U��	EMY�M��bY1L��q��4e���4��{8Ŋ�i��s|a�{��Km&ǹ�q�ȝ�p
+ȶ�����b*������6���ٯb~�/Z�c�x������>[`Lo�Z���84{�&�Sd.�b��/t?���N�2Iϰ�
+K���"Kgq#���@��-:�L�ѲCfϺ�P�Xm��ќ��tx%�YF+ѩ8ӱ,ꆵ��މ��j�݁�� �T�Qܨ�1wZ�T\�z3)[� �����]W�S�K�� ߠ-�	��||O�����b�{J]�#3���2�Q��3ZJz���g��O6[Ebm��ь����4�ǜ�����=aʢ=��#W�8�Vd<z��Ub�1WL绦��:l5`7�������NJ{��p��]+vs���߲����R
+endstream
endobj
184 0 obj
<</Filter[/FlateDecode]/Length 5796>>stream
+H��WK�]G�[�8$[��y?`e�
"HI�w�J��g,�,�艹��3'�\���v�V���#�Г?޼}��75���r	�w9O;��r�ΚZ�`w-���R��a0�v������^��d
�Ap���J���|�408�`
6�)��0���3w��j�;Swe|����9$|�-EORM����siŘR*�ܹ�+ܢ��1��t(;����c�����������9sBÈ�J!u �%W.E�����f��7yܰ����P!��T����Sv�����f�s)��j�%�V�pB\fks-|�\ϕA��7�27���]��Li
���!�7����.�M��^l�m�B{�A�ͽ�Hv�R�pڇT[;�����Q�WA".��d�=wq��H�q2x)��]�A�}7�������Q��J{�=������zSț�ɢ���1�݅�q�n<{�Jt��q�ǁKCu��@5#V�qR�JI=�*�8��&Z���W�ޕ~
��J���5,�����	-���h`PMf��`M��n>�˩��(�)?�������S��b�NW;��vk�&+q9�*��{�͂+���=8q���*84�GG�:vֶ_��Z
մ�r�`�=<>���������Y9^�<������':
+Ԇ�N�˸�1�਄���?�M��N�b��^���ǿDW\�s��h�|0�Q�H!����f��0rM
wh�/�����g�Q�F� k`�QfQ��-U�^�U��̰�`����}��_����Σ���P�V�<���Y)㫂���ʵ!UO;�Cb{kv�|&u��Z�݂�Z=}){p9��e�U�5��!�FkX�Z�\�^g����݅e.�s}���!��C%��T�۸��U���n,.NZY�V�v<���.m>�D�^.0��\'�\��U1V�V4~��h4��âW�MbJ{waY�Θ�b��-N#�#kqo��eʋ|���R-N�9�ɲ,hĔ�8�k�����
+��b��R\�����Z7N��/w�y�p��ַ�gP�e�l�2��f��֕��J��!�po�Yb:
+�!\W*�F;�?_6�L�M��֗���p�R"2՞��i_���г��X��\q�\�hd
�Ap���bay�M��bѫ�&��zw�{ �]2�Q�z��Kh_i<�j/ͷ�'��cc��V��z������{zyR����b.���"V�MVJ{��1� uX�����`p���8$_d�N���U.w�s}��k�m�
+���Ox�Ǖ-?�]�ꯗv��mʋ���#A�T1�U�uYq*�/f��l�Yh�¤�r�)߂c�m���а�͂��J��a4���&XS3�7�
+�i'�T1�4uYpHiR�e�G��Q4�֒�E���,�(�qm�̪+X�gLhǕe�U�I`py�ۇ	ք�ͅG.������w]=V<� �*�����H�2���{��=��*84(��[�R������nj��]���!���@����#�u�v{�qLy�j�fV/ȸұ�vhN+���[�6>�.[����qs
'��_����SC5�yK�/����-� �{��G��Y�#�����#�����j0�7���LpF�̉�VAְC����"���\�`��ڛ\#=��'K
j���P���T�7�fF��ɀ�d�By�������a�,�'��q�Eky�01���j��e8o&<p�����v8�Ҹ���y���촒p\�����Q*�V�`���(�����J駴I`p9,zM�ffhw�BFOM�]�C^�aT�U>J�e�`py�jO[p1�̢��Р�fM8�|\iQ��50�&�`��ڛ�Aޜ�B�W�&+�tD��f�T�ה.7s��^5�m<X��g
+��_�y%d���]�qS���rM��eho<f%o�A۲V�nZ]ȍE`���p�ـ��P{ۂq��]i-84�`\�AC��܁���"�kj����#WBkh���fӁB�@E\z]�����4��J0�r95������a1(^�τ�*��i`P]f�&ئ�ho><r%��+�uY��@;=
��Q�{�=(pyT����r�hd
�/Eګ�R%
u���2Y��`����\��6���r�-�F?��๹�e�(�S�Up����k��>��ւ$a(\q*Ǖ�r�E�j4�\\�l��.���W��է�_�����~x����[�^����շ�?�����ŷ?������x���?����w_>�{y�zD���Q��c~G���+��?�9����p�I;�G��p�ҧ�����7��:N cT�T�Q6���n�q,(P��58`�ok��d
�pm3�fǓ8�����Z��8�9��E�Z�c��Z�j�߾w��4Z���1��=-C�w�g���b=��4F�y7��f:�Ӹ� A�`�
o%Ӡ![^�XJ2�":��gGȔc��dJ���LM�o7�k)�;M�~���ft�N�5����i���cAsh�QL��D�U�V�^ ��	���ZJ)��RC�lO�c%�3�n������Ց�mV�Lˆ���DɾO'����`��l~��ɾqa��z�)�Q8p��y��#8�Kv�~���^P�a�<8g���	"�:�C`�|s�f�lz�֕0�?���8����IoVq���iqw-�"�4�C���_�'rrM��\!hc�#�g�y˓|�
+sf.�+��p�!�]������n0���y�ơHivC}��v�g�qxP;SmއA�Qã��3���xV���a�R3�7�j.cx��3�_)n�� �ޠ�J�o��{�a���;���2��k����3�;�K:0.��˚z��M�����6W{��&���QQ����<�;v��oy9��$��ff|�����OG��<I��F�H��;�ޝ]~e�2#bo�|7�W?����$������&g����������d�����B�z{h=��q�Ղq��9��s� �瓙}�<�	b�B	<����?qu�a��ڌ�|�{S��ՠ%a�����Ī&��EfN�	|�4�-
U��)�l�`PV���k���ɧ�	Kb2�Qh�`ɂl���w�Hh�3�D]�T��\��r�R�V�[�k����k�h����k��rk@�(R�0"�	�&*�a3Μ�p&�_m����ธ*����TL�k�Ә[Ѷ���T\/.E�(�j0Rl��?u�f���&Ѩ���뷒���2��$ILĠ�A�]�<��*r��o���+"I����P��r*�H�µ�+�"_V��?��w�Y9q:+�B[�ܠ�r���$1�!�4������o���˵��!4��r���\��:/��J����P8-�r{�ps8������1	���H>�յ���?7�;0��L�)z�bcNU8�%%�yPF�ny�����Q}��ޛ�	1�Z�Df4�g��W/E)�'��5�f�_�l��r�����{�`B��6��-[¼f{���Z�0��K]W_m��CD�i���U�V�5g�!�L65#��*8&]����;<U�Y|����p�
=Q����Ʊ�{(��gq����0~"0~Z�1���s6�Q{�kcZ���roh�҃�ίS�e',�	�����w���#�-�
+�H@%�v�*�}�e=:�D��n�m@��D:� �w����a��1y���b���������H��4؁���	��LdT]Zk��8��*^����=1��VE)��u){���L�9��n���^Av3�z
+�'�LB����M^��&g�3.�?��4Wh�&�̸M��������P��2�����Bp�,2��k��Xۃ8�4;��$��:��y�������@���9�H���#��ʩJp[�ȩ�2��3)�埄Tcndh�k��$&;�41�7!��5�2��������s!�X0q�Rڐݒ�]������N�~�=4�%Ę�Т{������h! ^�Z6�2�R@����$	a���-�kL���;[a��:bat��1[o[6���I
+g����H|o�����*���<�2�8��h[p�f*��F�(�j���s��\3S;Uvp� �- 3rʸn����uA�}���rt" Z3:O�Y֧1��JH��Gl�}i�[=���#��͘�	#,��s��r�,���Վ8����=z�o�l�_b֟M�������B@�dF�ԸS��<J$��7Ta9���~w  Z��!�M��1,)�΃1l[�Ȯw��"	�nO��
+eq'E��9��X`8�0[��S��	�u�X"��G�� 얬(F��H!,"����9ܠflg����?~�4�=���(R�(����ܼ� ���GLz�Q�tU�maIH	0daH]���B�:������u�&D�)%|�0��As�w���k�P\[�;`�Į�A�@�Ġ��.�(�yl�H�@v!h���s�;��띭0�{�����xI�۱ �<�ǝ��$������ ��j;UTq3`��]Su����m�����^\!\�����Gϵ�s�L���\��b�L����2��:�=ux]�6E�"��.ODk��I3��4&���@	��z��-�/�|���=~���4a$�puN�V��1_�����6?�/��e3p���l]VF�G�`f�%3ʦƝ
+&��S"ᶾ�
+����Bw  Z��!�M��1,)�΃1l[ᖻ~Bt�R�GL#6�_O�s��i�g���\�����[���.�d����x�S�<e
+�?��wl�2�69˟qQ�O>�Ɣ3�zƲ�����IB�1�vhk՚
+-�H��4؁e>̫�D$ �����V!��8ƛu�k�]��w����N�:]�t���Q�w�u�[�\�5Ȋ�S�N՞�jݲ�-k��u��+�6!:M)�#��lЉ�
+R�aIIv�el�[n�j��6z�6:��q]um�����
+�#��{{�
+���
�f�"�_�/WbmQ��w�Hh����
+K��S�g,�[�b�X�
+�]	��q߫K[�$�(ae���[�F�HH�
+c_7���0���
ʷ�q֪�����?4�{=��ؼ6����f��%F^6��8)!�F�� !�ƨ֪��Bk�d���|�#4�=��E�&�rD�s���>�$z���ۭtU�ma��`$���!U�v\oq݅Zu ��*O߽��L����$&�3�lN�y�l�U�a�uG3�^���9lfIU8�%%�yD��V�?�	�iJ	�g�m
@v���_H�D�$������#
+�"��M/u]��Qj+�#�D	̪}jYN7�j�
+x�I�1@�#��Z���a��1y���b������-�ے�^�[5�֚�H$U�f����$µ�̢}�����9��.��W=��P�ы�c�z�&/�o���K���슮�]1���M�j���Z
�	���
�U��/�mĩ�ڢ�����<4G���+�
+�XF#uƵZ���:iؾ���?�� a��W��ۮ���cu`��� ���jI�ؿf�Ń�2���lmje�L\BB�L�y�P�Y��n���:����S�mcv�i��9"-�j�qp�ʡ�A��7x��9e��������?�f�M�/^�P8x�U#ӳ$�E�Ւ
+}�"Y��$��N��5=!��9Ǒ�#��ZQե�wP!~��JY�}���p���K�U�;�
+endstream
endobj
185 0 obj
<</Filter[/FlateDecode]/Length 4444>>stream
+H��_oܶ���;��@Ա׎� �d{k#�cش��\�Z1�
+E�O>�����d_Z�Nݡ�z	����?�p�g��;Q����?�Z�n�����x���҆��$��[�k����{��~Y��nrQ����������R�ۢK��J%y@��b))��U'���Wՙv&2q�hf��9��cXQx����
+�n��񉸔�:@Ԗ��}�=v�Γ�����L���8��E���$R��ڌ�4��؀���f��YV��F�i���-0M�
+��a�Vj*�����FSr��R��e�	��*����MY"к��/�fV,�%0|R��N�2��yP�1���+v����1Z�RI������+��ϭz\�)1��˹_J��[���2=�U��Ыi2��T�%�H��
+*�`nݳ��
+
����ן�����t�Z0����C�@v'���F
ɒ�/�b��m��!��*o�*�@ƹt2h�-�[)UBG=v��k��
+�����ow��|��2�"k%U��p�*�N5��=�����ĳj�C��r��ֳ�����ˌ��(s[������Z����u-��
+�ME�&���6�n��۴4�i�Flˣ[5���ys4ҍ!�e}�c��q���G@��m�Z�0��ִ��^�2�n��
-��rd��(��ŵ��TR!�831��{��B��˹ϭz|#�2W�2���4J�qi�cc��ת�o��4��BBh�J-�+S�-s���g
-�J������k�������Ԃxe I>�dwR*(]��bI��]��U���.M����ɠ���n�`Ty�]�i��
+�:z�I�M.�ː�������H�V�&L%��x�E���4KCKzWR1��zq�H��W�2]-<g+����]om�z�S(s��x��C�g�كp��x�T�r��
+�|j!]p�1����g�NJ<���"7Ex�{���5P�JD�Yr����ҴFq�aaا��S��L&��\��/�������I�I�Ȭt�B8��s�q��n����n�Hb7G���#>����'�X=�F��s�4sD b��'4�S�	e=?;Ջ������<�TN�pg"ҭqY��_�'�31����Oӌqs�	iT�4*���f�Y$��x��3��n�e9���\K
^��J>5�&�P�ۀ�3S>t��	BA��R8>��U���rb9e�($�G�����>����o��T"�CB���p���~z�4-��n��ϙe�w��f�7�ϩ�f.�Uf��N-�3��[�2lh}��F��?uwh&�<CLa-�r��k�Jr�4+����A�a�� �PK�i��f���O�%92�9a,�}�;2^��G&�A�ޟZ��k�Aӊm0.=�bU��s�?	Λn��񉸔�:@Ԗ�S�B2}�Z��mw}82�9��G���]���s6���2�;Q3~�m��>��OiYʪ��j�F{9Ɨ�Բ<�ɿ�(/z
+��!��;�n�˺L�:=���q�T�+�Ҧ�~��YjY�:7�ݢ��Y>��bn�<	R2ڀ���m�
D �0I`v_t��X!N���N��잞�M���.ɺ�Z�Q*�LȖ�
+n�ۍ��⢜��US�ӱo��\��8�9���f��,�ZFG�`��`CGq�D
�̼TQa0u�n�Ҙ���-�THRs��2�Wߊ\07����R�!�۠������𞞊RI-X�"
����C�@v'�K�G�$~��n�\
1Vy)K2Υ�A;nq�J��:�豣w�X�T�__�����̫�cǈ-�A^�[��x��C�g�	!�q�(�����2g[�����T�En����#7V*'���3�ָ|+ӿNO�gb\�F��?u�J&�<C��ZH��Ε�.hV:�-
+@�0��F��&�
���Ow�i����#2��"qG�k^��Ȅz�����ܸB�d��-#���bY��,��|-���Ŋ�+dү�d����A7Ό�Ċ��,$2g���6ɩ�.	yT��u���l����vSi��H����b�|��]�67ls�67ls���\L���9ls��ͥ��Q�Y�������^�\�9�l�:�ֹa�ֹ8׹��Z� ���sۣ
X�0��W����!�u��6a�[f�S��L&�qfʇ\�O��a�f'V��񉸔�:��5�ā����L����ԇ#��	�a@R'���}�4-Dh.�i/A�km?Ty�^f(S��Ǌ��JUW���}7S,�2�Z~dr�Hw�n��<7J@�S�z��܀;r���T���[�6V?\�i�Z�=�j���7W�r��)G%�^��Ʌe.X�&Ν�x��En
+���p�mH��2M}*A�fLқ�?v�%��хc�z�D�t�L%閚��*����̕���bR��T|���m����-=)67�/�}��2���*��\�[(�����vCU�T�`ih���D������^� ����&Ԑ���\$^1{�C-��4x�w{*�)�wݱ�_�F(�>|$��>���G�PO(2ѐ��2]��^��'�����x��C�g�	-?m��!���T�6j��\X栈w'%�L�f��"�c��a|y
��Qu\�/�w�_B��(�:�#��^rjY��d���4�Eh6���t0ܴ�h��J�-�Czm0�Z��K���!vsD��9�8z_|Ҏ5x���{#���4-�;R�Z�U���w�P���sQ��^������ǋ����Z�8�΍D��s�}q��I����D���!�����+��<���W��43V�+�������b�f�K�n���}����N���l��5��L����bb+�iqO���ն��
D�
���}0���>%Mc�@.H��@Q�%�jmɐ����˽Xu�.j�$�h8;3�sf��>
W�����S�|=��qH#�}���Z�8�>�\>�����r�z�o\�m�8���~/�{��!������$�3h{蚏̡���z=�,���%�N���!;�t�E�d@�M�\2��y={uq��m^��d�q/y��� [m�Ѓ�������:&����l�N2���j�Y�������z��J��zp�f�yI�s���<J����������b�z>_
H硶�]����Ð���Z���(��J�$&�.~_I�k=��<�Y���K9�&\���������n3u�b�tP�=�+�b�����,�X���������vy�:�a���}~>$��އ�	�q�Μ��-��$vg/u�Y^�V��r�:�#+S҅�|3`F����>Ξ\^>���W�G#���tӱ��N�Ř�/7CF�w�f���G�<�I��?.�oߝ>Og�"���r�^6ptrR�Og��/�G/�������W�����d�qV��z=_������������M�'�W�?�v���s��3>��Se�կ��j��go��N�؋����AhW]%�K!�j�)!����֒��`8�9%HW���Zxe�m��d5E�֊h�3���
+�}2�B���CX9��l
j��k$�'w˘����Ǒ�����B5!��Ch����p�(��t2�P|���
�p۔l(�ɺ�w[�Ŧ8Ђ����Rgu2u��N ~WBҖ�5�*��zojS2�#��XJ�m"
�t��J�Ia��g�pJs��|��М��l�)�c-KSs�T�NGH㉪>q��\kǱ��V�85th.���˺Xb40��b㒱F��A*�b@�ĺこgF
�&`���*�Y�0!��u�Y�䌇@�qV�M�c4��0WζENV}MN݇3Hi�-a�׭���9�L�^@2ڷ�XWt'�����wrj.��LC}c +i��݂�h�o�>�ds	uπ��^o�o�߇��2���JT��F��>�s�!�L�I|>���"&v����N.D�I3�)��P9x��w��,0��� �d٨I���qE9J�C�Q����jM[��P��ƨ�/j�j'p#E۪,�Jmד����7JAR�?�,�Zq�(ʸ�hi�hW*�M66hǃo�B�c:�@#��P�w���f���X��|62�y�3$&t�E�R�g�k���h�ܲ���	�Ho�\Q��bEUqI�;e�Z��@��R�.�V�L�j!���z�����4PW��amwjc��nD����)�Js��8�n3
+��hmb��>�0 8.�r�@!qT�ۘ2�0<�	��TP[j�a��5���������Ų�#L^
+^��OÌF����:Fq�EKki�hg�m����r(N)]b��F���3��K��Ҕe�Q�h�[c!z�Nқ!9^e{ӆ��i45�����4X�9Fq�q�}`bj<�
+endstream
endobj
186 0 obj
<</Filter[/FlateDecode]/Length 17759>>stream
+H�lWɎ7�?��Cm.p'��=�ɀO��iy;H����'r#��lKr+�E&s��<F��%?�V�j��z|<;�O�$f�,�e��I���z������y@;��x<�hU���SL�3�^���Fgn=�	�L-�qgN��Z����
+�ZˊJ[>��x93n>L&������`L1�	89��xD@u�Y��|��K�(�N�9,�P�p֑�4��(�[U0��o�~
+���
+�k�١Xj�q��vb����I@8ࡘxMzW=S!v��4*
ߥ$�I�g'4�)4�+�WA�`����0��*���9��6F�g.�W
1�P(n��&�EI����+�0L\\��	HsM�f�ψ��G40#?z�u���+.w0X��-bQ�m�#�"z%'��&��
+~l\Ȋ��т����������#��۟�G<���۷�_�r����_������X��# ���J���,=# Q��?��x>J����G���+���9*���|�����=??�w8�'t\D�ڂ[��P�C�?��1@
+p&��٦F4f;>}�_�������Q�j�b��Qc��'� .��^=3IN��h4� ]u4�}�BM�+��Ƙ��X��u)V�m�6�/�h'��~7�Q��yA_�h9f+�����Nf<�uQG�ա�JJ�܄�]�wob0L����O@TH+`�nF�T�̰��bނGj�Ȥ��'w96�G���Nd#��_<����I��N�lĵ�����Р��7l�*0v�Tސ��S��
+Ph'���J>Pr���4�����]\F,
+���mI8v �-���dȌ�$?]A�ldL�N6Q*g`���/�(z�~H�6��#�F��Zm0w�� sp�.`y0�uS5�8)E����@�]iSO$�
+��<�'җ3�#�^�ڗ��H�lJH���hͶB"�Q�\�*jC�P^I�jFU�\.. c�dAnC˭�V�+�J�
Ox�//��
+V�\�2|X-�ywePy�
+)�c�x3�g?HA��Z�����6�
���$�������z0����\�#��Mq��'�D|\��9��:X
%Fi7E	��Ձ�Mf,C�B��Q7��
+�vS=9j�	;��z?)����(�4'D0}���	�%,���9q8,9��	ʠ�~X��@�:�x�
+�y3i�.3p�(=�i$��UL���W薠��ݔ^���Z����nX0$�*(���D *9��1�+��J*���_*����\09rc�+1�ƽ���B�V�ıK�0�jJ��؋oo-�Ԓ��Շ�����7-���/�ME��0�1>�N�t�n��.S��G�Q2¯����JsPPʿ̉�N`�F��E�b��B�Տ��-�r�"�z����V�N�E��f��t��#�BDG����v]zY���D�B�ld��,��{B��X������u"���o�_g��W�����_�����EJ��.�qI�(�vq�2&r�x-�"|�:f!�Hʴ�`U#�*�c����ZŸ�U�U�j\�_({C�bݓI�;Q���g��Y��L���>��t�K|W���Ǧ�-�yq��k�[�,!�xi���p��K��wbܗ�Ţ�
c��eY�/.�ɯƓ�/���n�^�'�&�i�ع�c<����}w�y�!�,z<����>�������#����6J\��� u��l��>� k9o&0�z{������J#����9�l�������Ci�r)-�����`x_�r�^(
<�c$��4�!@h������U�^^rIڌ�p�&)��J��1�
BX,�V�JJ��jF�}��q$L�ȋeP�I����T�*SW���a�kY]O��f.�c���"Zs6��|�h��?#T���Ŋ7��c�*@��V
+0�xq%Qf��ZII��75O�,(�2B]u�8)�l�Uy2�J��I/-�e�j��۫�3pL��f<۫r�ފ�1-O�c�� 9qs��W����YC[&pPS9
+ �8^.eeG��-"�~�/��#��g��Lp�Ox�)�m�ܶ�w���n������a�Ǘ�C����z�Ͳ�
+���^���y��W*��Y�^Ӑ�o�7@��3�L��,8�L��Λ��po@�I){uk�sB�{__A��<q=q2�^/T�����IU�'�9�����N�4��u��f@'���+]B��sh���T���m
+H�T�G��V��l�2����!���wS)�T��&}��Ԧ�7��]k��N�'�j��؞�m�}�﯊�������_��
+G8>}y>����ǧ�3���
+,/���D�$$��\Hxɒ�,1(��r-Z���l`֙�:��J���$l�x�vSc�����"���*�;Ƈ��B4����Y�A�
+�<dU�cV��,�j�(-�����4Ӝ�S4U�1̃�t"Ԅ�W�U݊.:��f�O'��� E_�(e�a`վ
+����?����-���DO�q�C���s3��A�����!>T�J��m��qe�誄��B�0������0w9Ζ�+\�2�l�HSr�ݬ�;͔(9p
+�E"��ow��tU4��8dO������CV�ʱ�'���d��� �ҿd���\9#�^	E��yd|9u[�|�C�E�9m���u�]p�q����9�q�^'�S����;Hx�ƨ���)Gԝ������?�նZבD�
���b�����%y�g�@B@���4�B$����gե�w�-��EH�>}��V�Z�'���CP�	֪�F�z�^W�!W�x��!��a�&~����E�`͝�ij�M�a��֠AЌ�7��c�@:l�ph6�5�/+T&�ve ��B�kF�M��e�®45�����Du8:�WIp�0'��$_$�Kr�E1�@��V��������δúE���,�f�B��� �}h$v�~�o`��
\������T�K'�L��w�ַ������0�H�dZI��[d.ɵDv��*N��=�E$��,��&Ȏ���V\:6�nN�#����o;�dE�˼=��,�E�h��@q�=ĭ���r
+��&� t\Z�~p��L��|!�����=�/?||��.�������Zn/�n��?-�d9�=�s��$j1_�d+��.$-���w�1᧞�)r;
	�k�Z4�\�2�%��,|N������&���	B�}���j�������~��/kф��}�H:��^}x{��������������%����=j���5������?��r���r�pu}����}E?^�pZF(���U���[���o{�]�������>>������z}����^@=�w���7�'/�rF���<��w�c~�7��W�>/a�v��g�\��5��x��h�E�c�ȴA��p.󇿠pv��p����@�O�ũ��զ's.����88l@���PE�`��+��������;Z�	��Y����
�T
+y�Xv��yyEn_
+�DP>�	��7u'C�Z���}@����<m{
+�K�W�vub�[&�����L�s���E8r~)̝�V�3�����O��z�WG��Y]=��SIu��U�ܸ}��QFcOgT���
<�CA�����8?B6:*�_�'g��ɂ�RCI`g(�L�,��iޱ��i�������*x��cK5v~��~A��7�E1�h��7N7�/%`*���R�U��\\N`3��:ȴ�T��p1�Q�'��b���:=�z@[hX�0�i��0��p��¬�ih��5�NU<�Oi"��c,�Ǎ܌���3�֋�#k2��N����jD��bV�.�4�Yr��H��a�Q���<J�q��<f���mf��҃��Vz�K�H���(=X=5(�rV��N�܄U)�%��FS���"�n�*d�Mضqn�	�������V�W��_�P#i�F\��v�u.�κ����U�;�7�us�%SZa�&)���$"ֶ%	/�p��9�h����@׺�]��m��8)�]_��|�a�Z��z��
I�R�8�d�����=��Ǵ��g�܎Nӱ�z��U*��ԙ��iO��{�ff�Qʙ=F�g��bv��e6�{$0��p�+{�h3�20m�q����4�пhu�[���8xI�^ �~1�)VI�F�z$|��@���?�\�Mr��Z��}�l
���nN��͉����k���j#��Re��R��$�?z�sƴ�ӫo�$6z/GM0�&�UӴ�`_	�6�T�T �ӕ�*���"K����Aɞ��l�TAn�/�T�5�p�ʌ�7T;����ֹ�D���U�3:�M]����(��hm�����ŏ첞sr���wj�P$�Xs�"w
4�Y�7�w 2
+Ϲ-�TW�3lTYy)�1%�q�����q�㛌U+�.��qA�a0H�reI���-&-(�K
� �,Ǯ5J�x�e���'h;�<^��s/��|D)L�x�_��K�BШC�)N��äaa@�����&Sc�*��u��?��U�`��حe@�z~�^�E�7F��k�`��"D�ks��'d�DF�Y!�-�8>]��eFȊ���!V8t:�D���( {�m*(|�:�|�T�|[��-%@ԅN���锶ʯ�Fa3��A�
+�!`����Ae?a����1�@bc�yr���=g���r�o)���`��f��v��`
�̾����i��4c��-��.Y�-�e�y���b��'p����G<��`�8�����p����8kw�`J�%_>=ϥ�>�={�����������i��b_я�/j;���5���������o-p����o�ׇ˫���.�~���?yi�3�ҋ���(?�MN��_�����姟�r�O^|/cZ��<�(M�i�[�2��*�A�y��4>�֥:���mf�Vw�0�'=��eV.��y/
+�ئ�D��j%�OdUJ��,A���[P/�x%�=k�S��!��� ��v��&�I�D��r�Jx�5vl��h�Nc�*�ANP�UJm��)dM��*�*�`�hѴ��^��B���Y�:"� A ^]U�I.�<$�F,��њc�:[<�'!at�H,%	;���+v���k"��Dr*S��Jf��X3��
�T`
+:In�8���8�~�þUo��ܮ�P��<��5����2�Hɱ��alFVjr�Ӌ,�z�
+˴L�Ƞ�|�IE� qyz��:���j7�Q����.�9]b�Z�&ؿ}��[C�5]�7��r(x�ܨ`˴�{��D,�7�/��8����NUeV7-���])h�0�:���Ҿ���0(��z3�VEk����փ٘4>�-U���B:�ͣP	޹�aʑ7*�Ֆ��6a9�����>�r�S�����h�]�R�'T���H���1�����I9��Ǝ��)u����s�&B���(�٬�ĳ�(�s�r�
��ׇ;�S��y-�L"rl�2[���˶刂��j�^d&��@{���!o��M0H4N�����c�0Du>�H�m�$�Ą�V�-̉+,W�ʾ�����T�S��XB�Y�,�ٙ�kة��=l���]�.S�2-;(�5sa��
�3�&��!	2Nk,"����7���&#s�
8����v��ZZ�����K@y.{�/�
+)+�ޒfH����ϩ���-D�|�ٮ:����!L���c�@c\�a���V"PGx՟3�5 ]t5�Y�R���؄U����B��s9y)@�s�As:�3���Ȩx�! U3�����j��m�*�G�30�O��Y���W�8�Yx�$l��jo�������:A��LJ6��[��b|}���M�P�(�V?.�%��DNJ�q�S��o���K<����h�؈�|�*�-�C}����;9�84��Q(jg�ez�1��13�N�t��x�x��=���������O� ��=�P�-�LM�6���Q��=L�F�v�����)u���V�L+��f:��/.�.�%9�X����n��u��<��
B�Â�G��LG�v_O��齨)h�����j���A�2Ij�q��1�xU�zwd������4���ۧq�>���-?����?���_����_����{����{���/��X���?�a2�[���~���� ��߿����a�4�L��'�����>���������S9`��S�y�{�	���<ˉ����YF����%Y�1��+X8vT�5W�j
+\Έ����`��S0��@o���ڇ�t!%Gn�&�p~�w��A���<T���\�=�+~�+ȹ?-�u�2��3�((��@�WЦ�"����b�Ί�`�]�p�<�y)���%;�`�Hß��pWPⴴT�P����NŽ�5��5ND8�9�V�>�FD1�?�Gfߠ�c3�N�@(�<��q�%�L�K-m�3&������6@�'%��aSPz��Բ��B.SeH�`�}���f��'X�UF�H�w�/31f�P����ʈ�&3�n�<�����}��[=�&���f���]���8����7���e���$���2��r�F��I^�@_[<��1�k7���l�rA��-Hm7A�����c�m�v�[�T�=(��M�������ْ9D	�>b��Z��=��	��'�aK++�!�H��)�����) �☟l�`*�9���7�
�l	�ه�779��i�_��d�>n�1����lO����\�})৳���ر�sz���L����T�u��^�Nux.�P��x���
+����Xg�Ղ
��;���.߾DH^2�[�`�aT�`�r����W����� ��$�ʆ�\(�J���g{��J��*�\���������s�S�3�E��^�3G<ױ��-?5�]���	a��{���=w�|Q�+���Ԝ�1�(b������(׬�tRm�RTE�.@�(�w"�8��Pd/�R�ݢ�'�@��ES�V��'�[0��>J�וg��:��I�D��8�|s�M����rp�4���R�cQ�mCxeʪ
+�Z�$;oi�K��"D	�Ds�(�O"%d�^�7J͝[��Y���]rU=��;���6�'
a?��x��/�����x�y�)� �������Wo�
+Q�Al�\�	63l���-�b��sxٶ=�j��l�l��m4"�b2���%/.n��1�Ǯz������6C�����$��<o��ݝ9��a�7]�}�^��H��������e�T�)��0������G2ڲp�(�q�G��)O�L��I����X����'zw�ç�����-?��2�%Ll�YI�D��#NeN���˧�bG˓d"�:���|yX+��y�= ��b�5\��j)�,5w��7lb��3����Oۆ���
+� 0��@G�0���M��c��5�ZD�*�=��`R���#��.L7�`߸+
�)�c	u��Ek�:=��/e[���VQkOŃ���i�9��v����wJUlm\	>�L����Oa�8��g��q�*��(�v���ն���#b�n��ӈ����6S�s�r�5���B��W�ĵp\6�{�m`��g��0$�x.x��\��"�Z�0n��ѢC���
�i�~{j��%8���؇�~r�{|��A�t�����ɑD�k�Zk^�0�<�<a�c^aj�;ʠ×����2��֢��x8�L~Z���'rk<���a���I��z���4<n��0z�~��`��?�%���M�,�@ԋR�F��uR�7�Ϣ?�Q
+�8wF�χ��f5���a���+��=�Ө�x�M����f��.���=���.S�rs���L_�d�l
���ǰQ}�!��J�R��ni$z�AM}Z��꺑x+��!ہm��K�?^���o���}�����Gz|���m<������_��%ۋ���JN2O
+��F㬳�ld:+�
�YKM�&�4I��K���.���C$���9l�ra��u�����:�즔B0����4eVI�fa$u����\���:'��
+ܡ�;����K����ѓ��1�A+b�Q���_b���*�e7]iY޲���1B8���W����b虿%&`���,䵊�Zm
+2����d�R]A��!r���<�-����>�%�iq�R��ܕ�܋9O�� -�i�џ��KX�\�����y�j�}BD���/�~р���Z\DV̔,W@���wM�"d����qzr%I��ŇL�p����:N�^40�Q�I8(J��E݁������z�x�����@͕�8.؏�����ݯ��g��E��qQD��K'��dy^�\���1
����?�W�ȩ,M���@G�Kh�X�eq���b�n[��7V���
+#���D��9{��a�@�Q��f�C�(ణ*	��)^�fg�7m�^,�of�j�{R[p-��M�I9[�+>���`L&fdm,#U��lmg1�h�x^l.V��˲b��@*��ܖ�0��й�K��2 �/��R�h�=��a��Xh,|˓���lL,�gkt�&��T͟.�i��H�_������dS�^.����X�J���J��������I��޸��n@����Z���ɻN��
+P�5`�(���U�Hr��p��{8$�̽�rU�6d��Y�C��f*"�w}Wjiyn����}�^Z�7^ĕ4<��J����x��7�&))--���Njw�h��"��E/��O��51�{�skmZ�	����e�$�M�I�n>�����ݾ�_���̏p]H��^rs{��&k�D�'#�{�n1��X���J�̲�,d�i1��C\��hZ������>��'�If"d�&@�,�z��w�db�UjQ��A�^��V~M�a	�:+�`RO,A��Q��fR'+j`���A�:.�����j��l���U&���fc���ձ$��6�O����������b���]\�o��l2���_��~n.O�x��P�~����.�fyAN�
��`+��������n��[V��O�6��
+'h<L̨�	7}�mL����ϹP��2�zV-�0�"�εn��h�A&j
����K}!gb�؊W�F�j���ŵ��A��*Jކ�eri2��eA
+�D`�U��9(�M���ͣ.�<��C��zs����^��F7_0�C<X~l~$ze�1�$!Ѫ�T:��B��)��J���Ĳ�3ni������
+Ro��3�!����Đ��9�	�Z��PV��r�#���$!�&��L]0<윢��v���pC�@lP�v�e�\C=hI�2}�ͥ$��@�����v�U�Tiv�H�����ń<}̯#BT��r�Qh�<+{H�n����v�\%)'ov��=[Fۏ�w�ִ�T��I��4�VDP�PA�sMn��i�����o��Q�P���R���P�C�4�I{M�'!��j��a��j�X'`{�E��M�-�p͓k5���҃z�<�
:%
àhZ�'��?��8�-�$���rZ��7�	�XL+Yu5k�7Z]�L-B�e-@��j��>��e;N�D-Ѭ�1�m
+C߰�L�ى����ͮ蜧�)+mz��&I�`Gӏ%x��TF%��"/�&��Ѱ1*w{R�\K�aP
�>��X�-�+M�c�����!g���g�>�4�HD럯K��[�:����@Ks�V-�bds�����������ق��I�FiYc�2J�r�7�,B����z�X;��ty���ö�X����/�p�i�[��||�7?�xyw������������G��D?N�T��������ۋ7�o��V`����U��f��/��g'fzIg��Ԓ�ۏ��${
^�@7��V���(@��X�
��`�����
��������L8��k��Z�Dm@��$5A8��HO'�K�
+% ����~)��%��2��f��}XI��3G ��
��e{�YQ#�x�3��;�d_�w<�$xŪ�G֜���f
�h�V�b|V��E�ld�\u��M�
[�1�vu�V���ϡ���q�6��8wl��)؅_b���
k��C��'�md�Xs���1�i�s�0�&�83#A�z�;fӭ����^s����aC|�c�`�K���1�q���x��`��l�:��/�r��*4'��1��CŰ>�[�1�nu>;��e0�ߺ6ħ;�f�ĸ93�>l��lfM�ѹ�2�~�JV�[D���c0k@sOe����W���A�e0�ߺ6ħ;�f�ĸ93��>l������[M#PISc�آ�y��F�Y��TP��@,�t�F�]�`rt��x��<�u����\���HJԲ���l� �{��Q K�ڌ[	�l2������������ 5U6X��m��]�u�K���,6�z�J����
+�0p�Z
a��4<�_���"b����f�ێ��[#VL�y�k<��]N��~�\�2�ְ
�1|��Kyx���_j�ܟs��,�8[�G��B�h�Ӝ����0h�Hx�Maw���Y�L8u��Uudbk�4�@�j�B$8�l�GS���B2x�d4�i2������Ɖ&���Y���
+�h��g�U�p��!Δ�U��F:H�B�}4�ۅBC\����C)�;e>�9�&���ԥ��p�s+
+���Uf���Z����<�,!��f���kv0�����f�KF�|���7��#�S��������w������o��?��@{��b����r��������W��d�=4�S�o�w;:r0��+���ͣ
�xZ�G^������]�N�������������wW��_7T}����Oϧ����O����|��x�����HT���"���ܝR�x��������6��ܝ�U��߸E�Q�Q�s���7��ʪ 8W(!�_g�{>X���m�]�66�)~�w�/�ѧooow7����nwq�G
+YW��$9x�Wжs��+������i-�����.Z�ґP��{s#L�ٴ%��x�>��"��Q��-�~�(2d�4�X����b�ӻ�Z��ط����IY���\��=�iPZ�D�V�Vt=�nJ�%5�A��F�����Z&���n�� ɴL%��{�c�j�{^�i�˧t��,��B��+��Z�uL��D�?����cLı�x���8�&��󽶋[��lڨ���IR�9�}���$r)!�8���h~�`�e�B��YK�W6�%�:C=�3��%냋���n�]9,�}$�2Z�y�ڏ�`���1C���-
+��-@�N"�V0i�}R&���
+��B����:����c��VE_Z��|��7�Pulta��i��c�%
�|�B��`��;˔9�r��l�Bi��g5�����g�������y��ѿkM�6鏓��ϊ
+�P9�����O��/_NW5�}������#�#����מ��`�����yA�V��pv^��n3h�Vm� 1�[�`*��%�����/��6�$����/4��åi{
+�׀� d�k9IA(~����O53$%Ò��7���]}�����I���9g
+N=j۬��1}�d���K��[��ޜd�N"�d6����	��	B����1
�iH��6
C&�Nf���CO�$��������`$��5:�u�����f��\�_���v��"�}����mS4�K�nȣ�����CA��ϭ�ڍp�t�bO�2�dy)2^@��)n��.=��BȮ��4�e�2��Itqo�ف[�ԓ*�ȵ�1���6�|Tf�0u�{f1�H��;�
���X�y��̉P��b��Q�r�j�>Eؼ���J��d����8��
�*��J�� �Kmcs��P#z��c{v��~�d_��0,�޼�����ܽX,^}�t�>��F�/e��/���OQ_u&ܷ]m�o���*?i���v{Im�?^�~���\ݤa|���{s{w�8��PS�x�Y������̆fo������ru۝to������W��>����(\���vߩ����Y���g#,\gbH@�@2Co��li��o�V�n��z����a�^W�H@�g$�m�&KU[�ow��;o���e�)�����)Kw�������UM7�'4S�נir.��TX��'���'�cP �����1:V�R�2Ġ�1�6d"�8LQ��X�
+��I3�\(W�;&}�I�!����
���]�א�5�s_�q���^E[�s�Xd�5|7�E����ΐ2��ըlf�l�`i��B�e����Q%�$t'�M.4�jF��Ѽfy�u�B�фd����.��s�&�$u{����\L��~V
m����#	�CAOtv�L:�ɝ�EB+˥�'�%
+�`V�Z w���;�H_ܩ���3VT{�	�fm�p�UF��F
�czaM��NPY��#;rI�"�l��v���^j3�[\�w:)J/]��}�У�S�
�KŦ��E`����NZ�s�ȫ����
+"���
+������V]<~U�C
+�t���s܅E��
�P���YcW���#O@Wn:�͓ؿ*ǡ8Lƃn�����Q����=�w|����E9_T$�꾲}f���Iļ��k{�4��^���!�=k����F����)汾���������r�b� ��@F��a@�P���c�0Y���ڍ���Y�iH8���]���#�宦�PD>'�Y�5�Ҙv�*���X/����#����F��m8�Os�cYG<h[�֥������)wPج�������]٨ݰ��~�%W[a"�L���T}W��+��ɔ����(��%F��x��r�j*'�&������#[�w�yE���	��VW2`�^�A	�b��^�-�O���UXQ�e(����jE�~�`�&��2�FZ��K/�a���v��w?�ܓ�2����ҒR����/��}G1������d|$��X,�Йκ�-�4}1�)�ZpN�A��xԶY9?c���Ƈ��̏��۽9�НDJIt~iԴ�7��Ph�94�a5p�D���y"@uaO3SB�'z�|\e��U�8aZ��l^V���Y�i����m�����ժ[o�#!����Yƶ):�����!���`��9�5!�%�S{
+��1��-K��*�;��>��lڳ��u����^�z�`v��;0�0H �'��k����Õj����Du�$��b���(�h����M��VC�j�l���d���1�Jg1�W�0��ؓ�[�.���:���z��ڍ���{��[z�b��
+�]T̰�z�P�����˷?�SL1��_W���p����%�9�x�����ru���30���u�Y�p���Ba���f������2��ɦ�����mwҝ��w���*�݇�Zd��K;�/��O��;�����;떘��lĆ�
�jM�D��8�����[�����52Eś¨	pz]�"Qm���xM�*�t����]w�xM�� S�Q�#�S��rq1_[9j+*�:o�Oh�B�A��\7��
+/Rj�O�� C���Qct�j�.e�A�c
+�.hE�q���8w�9 ��fڹP��wL�\�2H�3A$��S
+��ޯ!�k�6���7+Ƚ����Ʊ��k�n�f�c�5�!eͫQ��H٪����e�2��Qu�$�'�M.4�jF��Ѽfy�u�B��g����.��s�&�$u{��Ψ�\L��~V!m���#�CFOTtv�L*:�ɝ�EG+˥ݧ�%
+�`V�Zpw���;��_ܩ+��3VT{�	�f�V�_K���������u�"O��I��v���h0��g�I�n��H5Y5��aa
�{dݠ˹Tl�5j,�G�8�!�^xA�mH�aa�\n�X��ߑ���J�I���&ܺ�oX�S
+Z���x���9�,&�Gv�{�J.4vę�՜݄l�95o�j1u32��f��32�#>5�4�d���iS��q����ȇ�M]����晛i7��v����v�c��=����r�p�ٗ�GP9��T��r�#��Aš�ژz	R2"PbPT-M4f�$��v�<����lu(���VD>�XA��v�\�\=V&�.�a�'�D���VL�"
Z�����������75��!9Wg̈́u/c;;`'Zz|��:V���?�
+�첏�H�_]2S�AP2���P
++��#��`Xyu$�#�I�H*GR9��?�TP4�Ӄ�TV�������򚗐�JM�PW8F��LȪ��2���/���~Nw���();y�U��?�� B��G�:0W�we���e'��e��D�B�$�a�`oj�tu|k�	�՜	aE�(V�D��S?�ެ�$pa��Cbi1���h�$�[+�J]q1=Y֎�z�z���ԏ�.fnu��=���"{�8����c]�����v�A;��s}����a�o��с��C/�#X
%&���v��PQbڡB�M��1��&��G��f0��q����=f&D��:�$H�d���ޫm7��~A�a^HA��{w%O"�8Nd ��`�zE8xh:6�>���o3�+S��왞�꺞�f
P7��/:����o��K:��fL$��lFyj0�0����[�ԓ��>esu�+�o�z6��L��/�?����W�����>J;�O�q�Ɣ1�)O�`M�E��Tٓ��=�񼊼��������!}�u�&75}��q�KZ��>Χ��u��Y&yA�2'��������0��$�KȶR+��5@��A^��Xhn
+M�y�M��=9�o�ʓ�}�)��VZ��[��6
¼�H~�$"i�{�B�>�����#�I�g�$m��G�A��Ab��ohg�[O\-tzH��_a�\�*�PH�����G�Β?���M��lh�Bz�i�i�C��]
��>�0�����X�2�Hڑ�w4��6�a9�q�8��¹�<Y��Ǩ�<�9����r����뼷��)��2��qy���ƥ�[Xm\��g��'�p�m8�Qt��"b�h�[�'.l7+<p�R��=�I+'���z��D9��d�t����_���4��a4Y�aC�uN��TڭA����v:� ���mc���Ơ���a�
+����~ŭU�t�ة[�����|�A~�o��+���ם�٨\8J�9����w"x����(1��(`���:���=w����u�}�n�m���2��sMq�i&�
+,�-O<V�Guly�o,�8\Ư3e�����,&ۿ�j0�jD��dƴ��qr��nT5e�%ʪ�l*����l� �Qn���3؍o��R��$��6>#k�3�	�/��$�������u�qr��W���r�tͽ���ч�$��
+iGQ���&�p���>�eǰ�dQ1��4�]AN�hHu�V����YU�ۡ(��L��2ɹ騕���s�[j�^�u��.�&a]�6�_�K7=��7�;2���+w�&�}&�EAM���| R�9/�L|�	x%�
+�|�KJ|ej��7�
_8��6e�V'Pһ�b>�%��S���+X$����'~Ti;�=-4��%�����Wd�*a.g�:2�MzΕe5q���""�x��T"�����t����()�u�D�B*�����8����ֹ/.���6j=���5�&�2ITg�z�k�9���-��V���$����<������Kz�K�w�dm��n���Bp�$�v�;f�\���鰧08]�`N�X���mo����pM�,W��~�85-��C
+��~&G��
3g+�%66d@��B�Վ�s`��Z�k�������[e+�,5���h�LG&�c������3}�γ���.���!�Э`
j�&g�SM�懈"ʜ��n���P�/X��M��c1QQ�9֮�amGa����	#�n�{��גl8�`�d�F�F�	���g߽|u������������Gƞ��*v��o�nX�������ys�p���/��?���o%������}��K�������Ǜ��+pv���m�����?w�W����W|�o~�%��댞��f�����"�đ)ʹS�������o`?/n�j���jyu߼�q;B�G���X%0*,�p�!-7�rP�;���������g����F,�)�L%1��u���f�HpXi���b!ƚB�"�<���WJ�Yԟ�Y
+\$8��uA8!�X5��i�8���8���փ����:��Z�$G�Ġ7�"���ZuU��A�*��	��N��à���,���9?{�"h[G!�Rj}e�@��D�d�<��{�ǘU�|p֠*��9&7Y�3o�j'R�ٛ%86��z��$A��ʣ�IMhؠ0����J@ 7�)>FN��t�
+H:�`�6���3-��ߜ�+�2o���(��!閡��]� �%��v��F;g4I�D�3�q �i����	�-����TS>���s�d�6	�K/� E�R�澮8�|-��&�&pɏkoO�dv-Ƭ"�M��#Iw�Jm�fy�%x�34l���������yw�����K�jyyvww=�����򋟮�]�(��V�L�����ScgM����C?3il�����|syq��f�/��$��^_�/��/�1ؾ��z����#��WM��^^�_O���H��F���=	����E�xiI�ܱ�"�����D�-R��D���4���l_�C��2M<�T�
���ԝx4�hEw��]�W��f�w�Zˏ�vy��;H讙�9[k�6��
+[��Z��@IY�/O�v���}��b�R�-����������%!2f�-ms�W<�s���Ba�@�C�LY���Y������6a��L1��|����~�AD�Ь�Q��q��8��}�P��H(
���ɛj�8�fu	��+���ĘdX7P"�1 C��K�BT11���2NoAͩ�͗DseӋ�-�SI1�IF�}�a��
>�L/n�;��^W�
+��ū��$b?N����U�_���
+�����%�y�Áy����4*(ᏸ���a<��KΝ �ң����q�N��ӆ+�R"�(�5��
+DL���p\I#ڂIu�2���(�:����*��0��`EK�$!.�0 ō���{c]s�)L8|n|	��pb�V��T��������EH�/u�ww�0x��!����Ʉ�9	�a7�`�A��L^S���!ъ�L��wQX�X�{a��9�qd�򩜣rg�L�x�g�or��+�Mƛ�bMQ�T:�ܣJܸ�(q����'I�a~�dR����a��&���AWu��a�X��j���?�{�2C,��MM�_���a��	��j��5������
6I��ZU�#:Yc8���-��超�`�*�qI�-G]�ܢ�	o됭����J�J:�3�F3j�L<�;����V��ϴ�\pa|���0ܷ�;aH��~���m�H�\0fȥ��Ewm=��R3��T���8�\(nn���*����4�4{��(�TW0��<��uMm�(+Ӝq����
+�`OYu�
+endstream
endobj
187 0 obj
<</Filter[/FlateDecode]/Length 14501>>stream
+H��W�n�}'���a�^���r&��2L ���ـ��,�}N�e�g��h�b��ٞ꺞�"�LgIj�Nj�ĻÃ�6vd�c�t��
+�N��p��Q�0���@�7�w�8�g	���1}V�w�S�<c�t�S�4����h�@1|�||~Ϣl��?���nN϶�7��n�y�o�ķ�iqz�Gg��}�ۭ����e��}x�eu,��3R��6�����������r�k9��E]��ֿ�s����3�Y�t'�W�RGNz�\��B����j~�~�ۮ?�'#���~�X]-���ǻ����o��"�;��� ��cq�3^���qy��p�����=V�����8��O��C)�8G�;<�tx���/��#?��~{b�x�7�߄��?�)�__��cK��w�S���u�-�Ź%;��q6��)��E��4��WRp2b$��}��w�7b$1�Tp���=�<�՜,h$�	�[vS�3�;������j)���z�d1渜�{;euȯ�vR����,���ymfw���,���b/H��Iz��g��g��+���?lv���f���9[_��^�]�-v~���>��j�"�������E��RW����͠�8��=��}��/������U7�Z�����x��5!XI^��E�(�m�s��.��b��3	T���������X��q}6��>C4�=�+����5���|�r��3��|��^��ʇcq";)���c`���Ϊ@a/8�v
+�央/�v��չAj�Ԉ���.X2
+y
+�Z�AR�Н���&8���L�\�ʁk�罉�ZW۠��U0{����/���>��.8��M,��d_=vwz�#��<:Ǚ�BM�"�G�7x�k/�7i0������q��^��q*$*�3'��ҋV�ÐF�(��[?>�� q'q��A�A��	��GƏ���ˆ:��j�|S:�F��)�tZkN�JW�m����	�̓���![j�O�G�E�j��}�D�����!�Gb�ꐹ���sd��
�
+,5ҡ�Y�A��pc� v�/l���zG�S��Xu��N#���q��Ep����3�R����]v�Mi��Ϩ3h:�k�"�iir���b$�Ǫ�J�1���Ȝ�X�
+	������F�^#B��f��ԗ�oo��q��:�R���
��a��鴭Q�:���`q�U��IΫ`��`��h�*L�`ѡH�qB�[��H,�����:T�KQ�=ܛ֊���k��b���N}����9������w��a��0&g�R�QA�dI2�D��Ӝ��Wx��at>�����¢2j�c?��R�D��&�T��"���n,��y�5b���ʸ��R�Ւ��&|6c]�t�Ä�u������#��h$�|�����0L����UB��Q��T��بP�"aз9�܋�z�U�
����S^��Z���^���$�GK$��O�o��<�D&qC��o�ҁ����a�gf"v�E�ȠS�7b*(ĉ,��Ãi��=?�N��h�մ���2ַ���I�R�� 1;�Z<N�9�x��Pf�����P�������0�dά��:	�e#FR#绳c*��6��{��^x��q���n�y�,ߥ���4a?�q��d�Tڐ�2Rč������?a���d�DU����V6�qg�H	�c}Y*��c��P܌�l��<S[V̅���X�
�([a�������+��<p����alWynD��!�R�0%T�ۘt�eV����и�*P9i<�+��N�p�N��ZJ�����X�ly6CgH<���	���w��y��w����EYx��C�X��s���(���@n�vk��)�6���tL�3�9[�j��'O�,�+��CӍ�bf��*f�c�;ö�1��b�m>�؄��H��������d��w�Piڏ�78�<���}U}usz�ݽY/v���|�$�MX��6���b�]"~���,<�������n�����󳋷%
>|�l�o�Y�w��l��]ݜ]��v�{�_�
+�cG������
+�?މ���l���p����t����J\/sB�?��S
+�����X\�����̻4»�YbB�\�^�q�3H]L۝�蠊r9a �D��4s^%��ಌ�h�1�Æ*&Ut�yvQ�1D_n#�� ESL�d��)�b�����Ôf*�v�Db��:�.���ҒɊ��׵Gv���x��A:�d��.�U0���:1Y2>�2L�P�tWՏ�H�YZBΡɦ����ߴ�ACv9⦡�CI\�_��N��H8�5��YЦC��%�.��$���x�O����h04�T�=#@i�8���;���2E�����Ox���nO<��I+�X�����K݇�ʺ�Q/�<ɗ��#�W��?��[)$+�\�����*p���Mi��*b�C�b��K\C��$r�/�N�"�2�01o�L�\�=���5�@e��U�T�28����)ߦcb6��^��.�H�$�U��T�YՁGB`<3�2�]b�4��AN%�<71WɊ�>�c�b2* k�@���6�i���U�b�mDA�C����H*I%=�HpXH0,�`l�q<�`0&�>�>ԭ�{ٽ�c&��Zu�T��q2��j5\��w���V��Ƌ�xZ���ĺ�uqAʴ��9
+0�F�ٔn�:�x�rsः��#��ba�uޛp_dO�*v�k��)�d�Ep�N���]@�9�����e�	/&�n?�
��^�Y�&bkr.t�Ź_��~�������ە!�djl�F�o�O�.����c@)��@�x�MX�L�gRP1�8����梤�
�:ȧ��̯� �4�d�䇳�A12��X�{��؂�`!�Ė��%n�
+S4v��w�\8)��eC�h�;Z۰P��*Je톚I�Z��������yu��1�̄T-�
+����7�v5��R1*�d��%#���b-~��k����
��_���q;1���}J��T��,̆p�S�j���
+����$u��UF�D
+8�@G�
++�g���{�h)�"N�"wU`ɺ�b�y�*	!!���o��5dC��~]3j�rZsawf0�ۨ��V�ٸ����v�1[�������t�b`�IY��G�&��>#(�Uz�$���Uu���	c�Ō C��W�2NSj��s�|�U�@(QHz�	���u]���Y�eB�a��]F�`��7GI9ل�8��FS;0��p/�S5���M�[�
+���
+��z��g�ʢ(EF���M�\,��RN�:
^��9��)���|�!Q���]���W��oIܡ�8ąD�=Dh3p
#JwXB1��l�D���hy+X(���lc}���aU�qͽD���Є��D*k�ݶ����k"�J�j��%�6<�q�y&�H���"X�-��tkc::��*�*����.�E��O2?ո�UO���J.��^�d�ޣ��^W�"��
+��q����Y��FpqMNtrwlA�t��
��Ċ\\{�����Q��dF�a�h7{��`�U����O3�j�44Ȅ��5�ޭ�E~P5���
+�N�^�c���.LX���	?5욊zJg`��}���3NFg����!,)3[pO.�@g
+�]'j�Q/~.4؋!dPL�6^���@!�T]�\w��
+l �B�"�T�y�[!��%��p	���������>�}���݄=�VσJ�%�)��JI޿o��u/E��a`��v]P��uE����p�!��D�{��x��p"��0�O	�t	���p�S�f�Lp����B�R��q.`�
z"5���7���K�j����$i�"��?��Cl���gٖ���4Ro~�W� lOW#��9�QI�%AN��������쎴�xY�%U9j����eP
+Ȓ$�� U�؛p��|J����~{��\�!���'60+���b!�:L�XX@e_�45���S�q�RtUǴ�ˤ�DԈp���{c0�	-�m�
~/}YQ\�,%�B7��6`Ջ��"�f�]z|}��dW����gi����Kv��'��H����.�ً�*�t��({��2�v���p8 |��M&�z�QfW�M��Ne��J4._��k���1�����&��a�*���<�$XȀ��DE�eQ}���hA��.!!	�p������'Mp)�S誗������)�sd����_��ї�Jى�nB3�I�L�3y��į��<�����}��r�<����_�)������o�{��??Û��ׇa��۟�]?}���_�.,���w�(:G����������
�/K^����ay�����v0�F$��h:0�Aq&;�%��G�ۂ���
+'�(�/�WF}fs�b6�}��dǢ�
��]���K�oǌ5��������s3����?/��+?��b@����S��
+����8_����!4��d,Y�;Y�M/#�n���q�2��j��^��]J?��~����D�1(��h�j���\�8?j��f#�b��W�p���2���a����Z��u��W(���f�]<ٷ(7��{��?Oŗ��tL�բ"�,��x��`a�
R�Xʧ��Y;�&RA�
 �?����L�w��\MKT֣�.�`�y�?O�c��,y���DIm�R�(ꑇ��M7�Xk&�6�H��H�ۑ���SrIi�n�}?�W��նs�9��6s��qw�d�b]ݮO����(u�|JFܺ�)�i�����x�d��nv�Xr͟��7�U8���w�uX�[����2=�~��/��>�J��E|f$�sߕ�e�*�����h��^�RSo��!z]y�j��b������a��9՝��8b0l��|*�Ӳs۠ c���ѹ��txz���<W�ʘ?�h{��� �ǈ7�q��!�ԩ��/ZQ5AB����\�{�"��S�Ɍt�����e*xx���j�b�u����0�ȱ���k��q�0��5�������YnQ%i
JdU?���m��U�x�&�Py�p��Re	 xb�Scu�8�ɸf��P�6e����1���팩Ϲ,;����z��0�k]<�������YnQ�|"����1�Վ��J>�K�[J8�`�A�&3�s*M'(f�rࠥ�D��u���QS9�������h!|7pu����W�5`Ovj�V�{�·��mnϲp��`�k�bE?����v$��AV��18��D��l2(��y�nD�d\+�6�|	�����B�J��{b^�^�H�O!��=l�N���n�Y���Acr�
+�#\[r�M
� �z}�DG;�Zr#F<R�/�Xa�t2xT-u2��ղ?���?�݌�{��B�v��`�Z?��F��<ޞ6�=��m�LJ���2�c�[�tۧ�@�
"R���Y��Z�8�7g\�2�J��-T5G�a�"{{��q��6{C�i�y�����l�N���^ϳp��)��1;��.X�+���	ʳ/a7}7���/��8�#
+?A���!-��!��<!8�$`g� 㑝�����0�����j�;��-�}�nU�C�:�Z�8���f�j�s5���<��c0�`-+��$AU��^��#��ܥ�4�4�R3ו��	��c�>��c6���׳��D\�VBm6��B�*�{4�H�+�G5�Sh���2��-��si�����2���e�v�.I�h0�}0^-+�J��#	�x���S���~�1�F��HS�b�l������(_� �h�<8L>���A'O�q!�R�T��:����(q'a��s]�%�)�fy�|)a��.�ږ�s����x�Z�l�!��d�cבN7`�ߒUaE�Fqz�U߼x|���o.?��z��ç�wj�5,��|����˫���o�������/�~���7����ɓ���2��?�>����ٿ_N�^]�������ߞ�����k�|�	��^s*����������������wϮ>�����<8.�� �]�6�Y��r�h���
�r���V��W�VL��&g�]Z]��t��k�	����S��Ra3O֓�����-�}N_��jqV�	��\�q��Q8�q���Z0԰��>�?��k���^�&�=D��x6��k�as^T���@
�_uO8M]Yv=ٌ�(T���jQ!W���<YS饙=��$�R�q��L|.,QsY�x���L)�&!'o	�$1p���N�H�����6+3�`)���&�������d���(�$�;#s��Ȱ!��r
�K�Q�A/�7Y�ϡ͇nW�a�I�.�^��aXu�Z��u��d�O��1���g���*R��y�ZЪ�D���<P����j"�١"U���I�ۜ�F��NSڦj���Au��fK��#���s7㵦�`�5�-ME6hk���H(eEȫD�b����]��3�
ل��0
�(ݹ���&C��`%��Ik
�FnLJ�0f
+h5�Ĩ��$c?�f�d�oՐ��3�h�k��s������
+�.QР�i��ZP�	/��C��6j��M�4-�t�v�p�+XQ�da�5�dieI����f*F!c	\�7J�g^�����T�L��n����.�O�Kn��V�BV1���ю�x]�7��㞀�Ιz�BE����{ 5�r�Y��8�B�Ġԥ_1�B`���۰Q(�j?_��!����X^f�}n�R�jd֮ CUta��!?��w)��&�h4��O- V�V���1�o;j�X�b#V��gʪ��/�HI��z@�Na7La��E7"��k�����u��"ع*�	3�����|�7���e1��ӭ�>���9NQ��@j��Lm�BnN#3@��
+���&�)�[�Fʨ�ٲI����vߥP|�Kc$�S�3I�4�G�qW��#�
+MYxq:t�2i-N�����5�"�V`�"��^$�]��`D*���fx��X��j+&UX˴^���, �t�T��8!ZSa��
�P
+=VQNp�(�5	�1W8c)Ռ�U��W2�&���>���ik�B��P+^!ܟQ�:���U�f��l�@d�.+G0>5��t�6��M�z�g��87�S�m
+�W*.Zf�׵ �ϐ�����gb/s�ԩ$�E�q���*k#P����X@�
��~��"/��R\�E���$�umM������|��L�Xӆq!L��������n*@�
+���qb����$/3��}ԽFxZ��@��$����Y3����&z��mօ���t��<�3��Up%�*�h���
+�u��	�Y�����>��U^y���]���J��>��U��6��6���y]ض̆¬s��E��E�;e:���R����ˍLk�{DSJ�0rzU��-�1���S�I�%���(7��nԯf���a���=4p}7��T`�`h/_����K�l�a;e��&D��zVq?��O�za�'�^X��N�,���һ�@Gژ~��Tpu3s$V���v�"@/M�!�Fh��q�
+M��5�q��`��
+�� ���^��}J̑r��U���O!5�I�ٽ�;��aP�Z�Ȉ�5�R��ߔp
�)MɎ��݊1�)e
+B۶h5QPB(�B�P,��J�	7�˄s[�Ҳ����z@Iэ��	�1L(t���b�sB6
f�j��L/ 9f�[��
+��b+8��]�F��h^2n�ub��L��3�9|1S}_<]�@_�ьI��'��a�
�e��R�F�#�~"��+M����A-��2�����$�)��8�p�؛VIM���Ke�CH"91�>�"o4Wļ5G)r��!C�U�i0F�6��rS�	�)7���A�#�����kaha�fau@���Fb����N*��XoU/��4ς���U�{n�d����L?K����.��O��^��j��m���C�R%��Y�-;;�R��B�
����ꭂ2���:˲{����r^/��m��N��>f�����
+ �G������d���<͙�0����o@7\Y��$I���D@JrS�C���!C	Y�q]��.�@��<����v"2�9@����_~~��G1�e&��8&�ҽG��~Y��F�A��mA�|us���~8r��v�7gOcx����z�����p���7�W�ɳ���&,gr��/
+
+�A�/JdkHQ��i�CJ�if�Pw��m	˟��/l�,e�~��?��.�Y;�C�9�[�U�]��.��=�%��t*3���:�9�ˍŝ��;v��>�	�vaY}.7�e�����B��]��=�������o鋓�7.�����"�+�e?ެU�CF���M�d�V�ԫ��� �.��e�!OWx��F��hF16Ӽ��tJTT����r�m�8��{�|�H�����c��FQ
��[�P�mTC�����?3���CZ�%b$��9�=�s��o�u_!�B�:�*����1�$#��/ƋR? ��=�������h��my��#�x������K?a�,���Op�R&�*����/y8��o	�6^���4�t�ZQU�3�J�V�u��FF�Es*�Xxu�̧G�b�<�P�@�$���������������߿�۵�r�7���EWg�^�}x{�{ߖ�r�����7�7�
	1�Ԁ�	�oAڨi'R���ɮ��������������?w{J�0)|�;�پ�W����*���I��K���{!�1LY��1��(�sbv���Y��Ձ�U#J�M�0��_�*E)hB�.)�T\#tc\�ѓ��C��Oz%`�2ɀX��cl`e8����`Zԩ��,g;0�hF�q�&�4�i��s;3<��X'������`+մSb�q��Bs�7_�¸��.��ˇ�&�����sɑ��'�	��q8���q��=�ߞ<.��S��<*	��]7�����i����I�?9�h
+�W�%�di�o�N�n~�]�������)�'r�,�[1�����{�x���p�W:��tu}���0&���/!�$���:Ez��B����&3z�1b�s�4�-��
+�̬;�) I�/:�bF���(X�F��gd��Ls5��i�:/ҕs�Kz�[p�u�u����@PcNv0�9n�K��(�N��Z�4x>#E���jC����Ƨ@�m����n�C/ ����Q�BeVc��.���y�d'��eǖ@�}�ny�����ƪU��J�~�y
l�Dz��<jS$sh�X��*��K�:�I��K
�����œF���8�E
+���3kf!z�*#��P�i���Dq\Sw��
�u#N�=�8⾒�ƳR��������j��@�!�C�b�!Md�N�%,ը��sn�����,�b�qbőX�B���1p�֔&q_&���12���G����<��߯~|	�z��n��i��p���V�rN~����D��1t����f���4������fu�zvs���uR����t�-�v�5���m}H�O˫Q�P�
+*�;V���L�a�]ъ�
+	ԳS_XQ5q7Q/��R����m�L��i�R�`~��
a��j�'�m�h3}uuuv�;_��9;�Cvx�U�"�0��M�A
��Ԋ&������7�pY	���1���u
+5Ym.����ص1abJ���Y��tl&r�n��k%�W��p8�a�DS�9 
��~���4h���C�kL݃���.e�����]M=�ߵ��!
&�HR *���!��
vh\^��	t&2�j�	�hj��"H���xZ������|)::����HdGv��AJ�<;7����5�wx����-� �_�=�n�=R��0M#�|���P����5E�*��ܚr@������S<��g�Uk�_��c�uy�-5J�����ȱ8��x�����t�q,l��h���%�$Wt��x�K
�CB��M3I/H]R0%Aw�P!�Pe�^��UF��ځ�V�Q�غ�����4�uLzdF��6�����[��5�����12ي��t��K��z��j��5
+s[]E`���gG���ӣc0%��}����t7���p��)~�ƌ
+ar2��뮰"�fu ��{ �
+?b
+���u�ϥ�4pg�������f�#��6�O~��oE�*Y9�V3V�[��q��܈6n���|w���|���ٻ����|7���	�e����~�l��������A{2��OA_�����+>	}i3|<}}�JmCP({�J�+��BZ�\SQTF_�͏W3\�QtF_�^�D��lF��l:0�[��]
+��y�z�"D�q�ʇ��@W���5�]���}�+~6�
+d.�;��!W=�\u�tA.��򣐋�\�Q��O�\���=^��W��Bj��<���1�?�X�s2�n�'=����vP��`,�0��ߺ��[�\�����v�ߝϋ����N� �� �ṛ�IN¤j���̍Ѐ���h�����u�0�$�W����քSQ�g�B��m7��NLުԌ�k���Of4���j��3�qi�N<�
+Z{ѝ��A$3hG<4���³��,"U_�@>�5Т�R
+�r��'��8=��'�;�AC`g�������e�R䃃S�>8�\�	�IxK��$�C���,��HV�����{]*SS��!nkX�B"��֒Z�+c�|� �7�l=v/.��0S3�8�O�֥2Y#�{�
'�~��0���萉�NL�Ќ�ZL�j���vVc�>���l�����
���a�b�ս�'�Ql����ތ�S7�����8�;'�h	8����p+[g�����H�h�>f��+����n^|z:���Y�_���v~Aڙ�AW!{��Bީ0bf=ؗ��ؚt�/6рً!���N
+�����D:��$
(�I>�\���U5���Z5%�.蠖FL��M�8%ӡ1�Y�}���Qv۶υ�I�Ke�J��0��0�r0IEʋ�5Ő�K��:bʮ���ڋ���e�3�Ev�er����:�lf��~3%����W�h /�
+�|�ԤI�`��d;`q�lqt��fޔm�N4�����4 ם��I�H]�\{�~ɡ�At�$���8M�x�������n�R�,˘u&�c��@%���XV�&���:~�[7�|kµ9)�Rײ��Hz�8yx&�g-�SOS�t��j���I�u�j��~�MĎ���5�ڔ�C��Z��S���b��UvJA����`�K&׼N��^0�碚�w���a8^.�C��g�J{�Ƶ����2@L�Z^?�]�t^�M0(03[M�:�!+ɴ����K^�l��q��W$/yy���|���CT�9�g�]�����+����N��x:���@}�}W��v�_pje��gB�Ee�4m*���T�*��4)�7|�*h�'�bEae�*����UV�畝1)\�嵊�B��Q*���~v$d�aA%����s	���bZH"Ԣ����Ӝ����A$��	P����
+�/�
+����RJ�&�1��2s�끤BO� N-q�[�oe���zF�@C�x�Mu-􂵒�]�/J�r����پ2��wA�*�6�����iCuY!�4�TAe|MҶ/�!ŭhA7�3�
+���.ʬG5���=���>$-n4�*,t1'}�`>��]f(��C"�3=�s�+fj����������>A��W��AEh']7��d��@������c�jz7�Q<��n��Qj�.]�l�~8~0��k*��>�.�,-z�����Z[�t>.M�{���T��H ����j鶋�^�T�9*��I
�����VS`���?�.�����~��
�Q�D�w�m{��l���_��1z�&}�8M��Џ�F�3mG���.9Ȣ�,�٢d_��|=�������]I>�?��d�i�?0��Z�)��,t������Dv��B���h���^#�XM�������fe��I��lU��G�W�*���jF�/�.jr^�}���<� g!��$��H���6=b����a,H	�|R�1ZR��E��
+�,'CsZ6ᕊ[�Z�sϐ��R}i�o�]7���������Rڞ����qd�����h	���^\1� �V��{w�-�Ս����L�A2;O&3���H<�;�H	*$_�PB,ǥ�:�f��s���I�9��W�kw�K����f/��a�%�6]��J��!�jA��.�m\�\�.�L6V��p8*]Սz[���D��ۇZ*� �
+jIl��uy�P����.R�uQ�D������L?¡3�M�8����5����UѓZT5PּDfn�b�Y2����n���
�@gC���k&���]P,�����:��j��z���������{�_>
+

f��zd��eॐ�z����{-��G�G�(�%0�k	tK`�����z�Q���V��jCk���U��ЙB���гn	�.�q�,j�6�W�(ί��ؑTJhl��)f����Qq>S�we�dK�+j[�fٿ���Z޵���Ϻ�p�FY���ꂩ��r�Ԑ����d�Q�m-�}ߑqC��q�n�&t�HK���yek�Q4�8�<^_�Jx�ƅ����W	F���9j��l�:��q.2�x.ea9C���*P~�U߳�/4.\v0��/BѢa�S��e�5r���[y���ռ�@`z Z4�Ԡ-��͟��Xw��i���v/�j��z�Vk�D}p��]힥�v���v/�n�:�O�
+���~�=��9y��.j���]��[�xQ�7w���ޭ���O>��a6J�Qr��[؍���z�qb�����N�ƃBi��Ƥ�]N�ɇ(����ig;�^��U4�����hP=N����$�����e�F}�Z8�c�]��8ʗNf§�26��5:f��f��ga�=�{�F�yc�W�Q6H�sb�]�c�q�ON^��F��U���$ΐ�Gy�~���^q�@L���Gs"��R������Qj�7�0t���AH��G��9���|���|��k�{qn#����VD9��sr����c�Ɯݓs6�>>7��]�HW���9N�[�#���Q�@�q�=bb�z�,����m7�dvs�v��^wT#Ĺ���,!^�9 
-�'}]�)�4�\��3u{b�NW��:��;�(�>��[/����׉�����~�&;d�#�C~��}����|��*��hD��qF3�%��f����1�vO;ʣ���O[�[?��
W<�'q�e|���:ui�����x�B�[;�
i�#������]I>�?��d��w�*)��:�B^��d��Ԏ^�%1�	��;����X�q���b��
+��NP�y����/>ū4^��y'hN�#@蛾M�0�:@c2��\���ph�o T�Sw�= �����xh�P�B�M!e�g${h�_>|�f���b��*7��q�d��9o���z/��Y���	~p|=?[��!��,��鎉Am�v�u/M�1[�0(v[ܞYe�x��W�[��8B�e�pt9]��5��3�7��G"�[e�{�X�0�M(>σ)Ć)�
SX��t���y5�8*6;^g��G�������3��ªy�\H'�(�L_Q�#���<PιU��t��m(����N�.���`�
v�m��=O�M�U���B��
��];u�t��J.8_fn1��t�[�eA��QhOm
+���;�C�/��&<O�@�Ǚb
+*�/�߇()s��]�����."�nPCfV.gXg8˿O�R�@���E����!FA�)n�3W��i���V6��6EmSԞd����c�1O�7�
olx�I򆯨VQ=��@�ʹV\!e�tq{A�\�E�
�l�婑�-��sr�	�-�3!Cφ*���Z��}���W"6;^g��G�������3��ªy�\H'�({lQ7��p�wIN��l�6}���G�rg��0ZچQ�͎�IgK'�]�T
��K��N�����d%$�۔�MYؔ�M�z/��0����E/$�~>r�=��K�E��oi6��&9��m��I���=��&c��{���Q�w�E��K�]�+S������KSm�U�R���=�r�M�;��x;L/F?�f�u�^����ٮk:���o'�q6�ۓɢ�����tT+�q<�?�&���'o�A��_E��R>�y�ŨN*�/I,I�ֲ�P_��
+�8`����W,���+�u�/�L���0��%��\RӋRS���#����<����,�$�t��-�A�ΐz�h�;%�JK�M�AZu-
�-{x`8��srB�b��~	^Ox�ۀ
+�9��
+���e�b�X�W,��
+endstream
endobj
188 0 obj
<</Filter[/FlateDecode]/Length 6788>>stream
+H��WkO�����/�@��~?���/���F��#˺v��x��v�OU����.�#ɍ̊e��>]}��T5�����gb�����4{�޾�l�
����ooM����1��b;�Uu�^W�.����c6y����1��MK��&�b�����l�O�[;��I�~�k��E���;s6�f���������ǽbq�`��٢�)��}I����,ڊ�ɚŲ.�k���Z�G�l���9��{ΰ�QYTlgyY����Iu�Јd����9
�nଽ���I����k����(�?�ϛy�3�wz@�{�lV5������*�9����]�y���Y��p���>2y@�l���g�*gWhK|I0��z���L�3.�6-?�8?�����gM�,�_.�����'�Ţ������ؓea�ڌ����Q��r���c�)拫�g�Ù��bvqǙ�)U�OOWe���|�����i��K��S�t�f��[�Ƽ�i��j��9���5)S��%���U��CY�����k�S�CI��XG���R���6�@T�!��[Y�wT�Ϝ�m���!��u�M��dq��E�;�z�s�,��բ��Dw�Ɨ��0M��t��/��,�o@!-k�	�*)-zHL0�Ğt�u���M�_�2Q �_}�t�^��M}�w�NO�Y{�>>/A���j��I��� �����G��?���y�)I%u�_��(��4�w�Xߡ���.�Gi�(���͇���4�Qџ6�K��]�G/oW���e8�xY,�[��F�Jz�
�ב9���+	[ͪ���
+�l��h���6��e�)֛�����E���ļh.h������,"��KJ<���O�z�C�o��0^\U���4/�_V�4Q�EWqI�K��WHh�%<.�N�?xH��k� Mmv�?�~}V����_ѐ��__-��,�G���i	�vXTeۖQtO�o���#X�j�Y~�K}�	I�_lo�J����m�/�'�E)T��=CP�{�m֯9z1eG�|XeE�rl`�F@�e�����*P���JgIX��z�|ዦ,�~�.(7�WH�Bȗ�a���bX�����\g��7}�VO���biC�xf�ru�w��/�3h�@��!W��A:�� n��gl�Zad�t@`�%�}{����k3r"���D���-�T6�4�B<4_��9�ZxB���}�Y���p�HQ<Y��D�0mTos�c/��@o�dù�d�7��<�<D
+Ή$2�1 �������@D�����P�d�X�p��	8G*��+	ڠ�x��	�6B�6*�Ρ�T�^�)q�CKdZ�j��HG@Req�;���*�� Bd����c��	1L��YA���v�h���Ї���F@���&ˣOd���S��Hx�lȃ^��C�Z�M��7p֨
+����/#A�:,�Q����18%�R�
+W�(ܤ����	�1����qd��� ��Xp�H��O"9�?tL�W���B���֤��{�TgL�&颩���n�jQ�q��Gi�y{0���c�@"Q#-n���h��C�zgqh��yB��5f���_&3U(4���M24��1��:�
+�G AT"����ZКH���X[��y���Hx^b;咊�)�(�P�磀7�L�]���Rz�
+=H6��+%Ǽ�}��u0�,
+�ں�2�Kk����t�,=�'�"���7�{A*ql�'O�3�cI`x�0R'���AF)�NRȨNV*���,��e�74+	����jV�}��a�e%K���
+���� ZR��Ag͊K�d�����oyO�4�
+��LtcNI��s�26��2i��?˶P�Rލ�96/(��<sd3P�k�**+�  X\��~��L��,ׂp�C�ࠃ�>M��9M���z4�ߚ��E1�*�?,��}mT@,ZI;ʱϰ��Rf
2��	FQt	���J�|�䤎
+5
+�@C�����ʟ���*��Ӝ����L�ɢh�O���+[Y���7RWM$y�j�T�䈣0�FX��@k���&c���-�H3�Hl�c���u�Ɛ}#�RI8��EEuPmL]'(�-�Q*��"��2�Ǌ�;e��$ލ�3=�ޒl�xy�2�h��-�j�?�v3ҽ"~O�p�t
+�7�6��żd�ś�]p���E]
\-��:�;���g`tA�?���[ī;�YEu��-v��yU4��g��2��y;B}�.7�|�e3�{T�Q�&*������AD]�kY���ↇ����{ԕؠ��AG�@H?\�(����|b{cP��P>�Q�ʙ�;�t(�$&�T�j���u��x+q#Ma���|�����O�T��Yπ�(���A���N�^3~��t�G2n�!aK�b���� T�Ϋ��:��Ě���J���f�pF��M�ڒhK��R5���5م�%����5��7��2K�
+l=��V���)t��n�|��׆�|L��g�^�o��oH8��0���B
+�[.Ml���+A����K-��0��!Vc�C
�2����=ntqY�hUs�����x��<fS?�S��Rg"�}xŶ�z������j���Z����%��;�������!`@�.�X�m,bJd@�`&�<�N��$479�ƓG���JI��oIPC��o�˷�q	��Q=8@
K�eG�Wk�b �.6>���X�W"�E�˧�D�ZJu�1�T�7�J~��o�3|f8-}��N���5-���Ж�Z'���qr�?��L�X�������QqƎ���ӿ����#5
+Fj���i�%�U~�8�����_HZ���3%��gξ��Ʉ�����/?�(�<��>�d�7~�D��M*���.�;.�g�d���=�$����$��jF�4-����N��ʻZ+�G!�����{y������c(y��@4�z�o�r�����j�������;�*�E��3�=�"7A|�|�6�OY����G%ۤy*��W_�(��7����^���u�ֵ�Y�vD�����B��U,��
+�"£̝��b�����4�x9��\�eCV��k�?W��2aD�w�R�xS�N�n��S碌2	�h�W�;t��99���U������3���U~�>�����
��cȄ3"��}���sy��_�z�U�rA�H)��F����g%.����3o�W]'i(򊔪��`������G���q�,��%"���j��յ[R���� {A��J��d�ǋO�B���
BP���g�˄�y�.2?3�T~V4PS�����IqۓKEB�)u�ҝ��-|,Z��6��+��]�臌��)-�м�'���< l��o�r�}��|�*Ϲ|��V�r�c�6H��Ÿt���m��2��8�N|\�*�*�G����I�ӗ:�ȠF�x�r��q��hh':��H����cgx;9%��ei��'^�E	�/���@lZz)h����*饠�h��6+-
+��{�x��J{�E�o�����(܈�t(��VdK���&�jx=��K�T�\��8n,q�r��:�\<��h�Q��[Ό�6��4]н�gw��{d�+���'v��v�D�~FUh��6���Y=/$]9�(s��R�md�b�D1̀i)��Z�vI(c�Q���}��Z�_6]�����
+��]2�����\ϱ��=j��hl':��H����cןL|[��+��TZ���"�\�Ħ���&��(�*��KA[�,#l0VZp���LnGC�u�1��v�#�������Ոl����P���1�^��O�qc!�Ӕ���1��^GC�/�)3��|�^/�������Js�lEy���{bO
���uI�U�A2�Ld#�Sg���t�P��!8K��n��g�b�D1̀i)��Z�vI(c�Q���}��Z�_6~�U��2���r=�z
+� �=����": !���G��tb�,5���L�E	�/���@lZz)h���®0-���2�c�E7:�?����g�A���w�$�������Ձl�����P���1�^j��O�qc!�Ӕ���1��^GC�/7*3�ی��+�������Js�lEy���{bO
���uI�U�A2�Ld#�Sg���t�P��!8K��n��g]	b�D1́i)��Z�vI(c�Q���}��Z�a6~�U��2���r=�z
+� �=����": !��珽��vd�,5���L�E	�/���@lZz)h���®0-���2�c�E7:���ӡ7��]�z��}WiQ@*�)L�P@YȖ
+	_>
5
+��쥆�a.I�T7�8M9
+Pkc.��u4�(�r�2�ͨ�r��-�A�ͯ4��V�7�Ȼ'v��v�D�~FUh��6���Y=/$]9�(w��R�
���4�b��R3ĵ��P� ��W��/��l8��/�%!���d�O]㹀>ۃ��X�����": !���{�hꜺC�z��J��_$��ش�R�$�]eZz)h+�e$�
�J�n0t߻u�Ōl�b[��Ң�Tp#R�ҡ��:�-��jx=��K
U�\��8n,q�r��:�\<��h�Q��ce�y�Q���<�[<܃ �_i���(o��wO�)#t�P�B"I?�*4Hf��l�t꬞���`�;Gb)x׍Xrb�D1́i)�YwvI(c�Q���6�K-�2���;�L
+�f�뻤O]��^ۃ��H���;��H�������\k��k��TZ���"�\�Ħ���&��(�:��KA[�,#l0VZp���������-l
l�J��P��HA`J��:&�TH�j�Q��g/�S
sI��⸱�i�Q�Z�s����F�����m>E����n�p�l~��y���QF�=��W�� $��3�B�d���FH���y!�ʡF�Cp$��w�h�Ⱦ��4�b��RCĿ���P� ���u��Z�c6,]�Ww��<� �wI4���7���G�3ډ ����y��������%\k*-
+H@w�T.Hb��KA�DDv�i饠�h��6+-
+��t2�'#�slmW�`k`�UZ��nD
+S:PV#��B·PC���8{��j�K<Ǎ� NS��Zǘ�gx
5
+�|��8o�)z��gw��{d�+ͽ��2���z�]!���Q$��D6B:uV�IWE0��#���Fs�J�$�aLKQώ�KB�ȎJ`��_j!�ٰt]_�K.B*\��]B�����ƀNۃ��H����: ���O��tz���%\k*-
+H@{�T.Hb��KA�DDv�i饠�h��6+-
+���7M'C甮�X�`k`�UZ��nD
+S:PV#��B·PC���8{��j�K<Ǎ� NS��Zǘ�gx
5
+��x�8o�)z��gw��{d�+ͽ��2��=��j�AH$�gT��l3���N���BҕC�2��H,���օ �I�����!�}y�%��AdG%
+0��/��l��/�%!C��]B���?�/��T�(���x�VD/wwNO�Ԝ�]��#�"cf���h!��ay�3yG׳�W�|c 3*#Bd���h�
mǙM�Sgj,�r�WM�%	����[%�4�d��aVIom͕b�k-	����dlO\�Tw�
��֒�"��+u$��}r˥ƯІ�� ɱ�ja.��^�[�C�M9	PcC!?�86�$����Q�S�Ju`�������>�ޝ'Q.䑫;v��M���f����!��:�cҡ\=Ϥ*r$�)�C�C��.4�1�!����*)�2��>"_�ڷ����i������=�=�h)b���/
+��o@۲���AP�	@���vD���]3s-�a:5�X9�æ֒���z�����
+�f2��8������J�k����pd[�c��ѡ��Y�a��j-	H ���!�RGʸ�l���!�P��$"9VP-�%�ދtK|��)'j�c(�'ǆ�^��<
+qjQ�n�����B��'���$ʅ<ru�j��5�;�g��+^��x��ȎI�r�<��ȑ0��aK��\�x�<
+Bl��$z�m$��|B`�J*\�[��Y�]߃{)��%2���Ʒ���3c2fSFhbYF�D�#B4�g�>�,�p�7M�%	����[%�4�d��IVIom͕b�k-	��=;�ԙٮ��l�]�%	D0�1V�H@�-��Ajx�D$�
+���d�{�n�q6�$@�q�����P����G!N-*�y����W���{u�D��G����_7�;�g��+^��x��ȎI�r�<��ȑ0���X�`S��w�OFS�y�(�m����g�ef��|Bh�Jd�2��2"<�h���Q�Z��+_��dD�ư��qz���&R���be�X��А�;#,��~�Z�>S����D��}yzr͎M��*��Iu��)��6ٷ��=CK��
����a���0�A,��辕$�����=���%����q d��5|�	z��(E�-�s�4��X��,h�?��F�Y���"llS~#������XH�������� ��>�vM���(�-f�!¦�f�8��O�),)�OH����i�&��>ho�Iږq_��9���	�@v^�5b~��[��9�{oH���_�Ru�����=i����L���'c�"��,7�>m<p��?�����:�G����_
+endstream
endobj
189 0 obj
<</Filter[/FlateDecode]/Length 3958>>stream
+H��Qo�8����0@q@�E�4I�ۧ�6)\���vPd:
*K�$���?��m�ĉh4m��0���6"E��;�_�X����?����/�v:��[�)R��{��}^����NgV/��5X3��e��?@|����j{�ҿ�������������_�Kn�J2���?�x�g_8�,��7�~ךm����D��ebGm���Q�L�c�Sf���2�;k��`�������:�=ؓk
+x��������d)�^��f1��	�B����W"�I�b�F�L+�!�����P���^,�����\��5�Y�w�Pzi�Sp�[�]o�j%�Z��2cA�`[֮�ڀ��l7ˬ���F�-�7�P�)~
+�Fbt��윌��rw�z�ih���.%^4�8�$²yc��b�b�<2"��io0�S���5�l`���� ��$M@nx��|�y�7���	�?I2���U���N��9�5�����qZ����:���W����		�y��csARL�S���?@L��M�*�U4��D[��}dT7��Xi�^ADc�^���ނv��W�����`O�I�h�)���(�<Y
+�ןc~L�*�N*��4+�o�ϴ�p�(
�r�݋eX��]c�a�gE���Z�[�~���j
zʌ�e�	lY$Ų˳!�,��6O
�l�B���i(���u��s2.��M�Ѧ��"�M01m'*�7���,�+��##R�.A��C�8�YJ_���AF]�^�q�\�A��G�^�G�{c�-� P���$3�/^Ez��-�cZ�͌���ȫm�#�|�?xB�y���\���T������;qS��lMf$��p��d<V�W�X�`g��������}��7�\��5�m;�1�|�'K��s̏iRE�Ie5�f�����V�C��UnBC�{��c@~s�k;����P�r��/��B�AO���L0�-��Xvy6��eV��i����B(�?
�V#1�APvN��C��i=�44V�B$�	�!��D%��r��p�VydDJ�%��`��2K�kT�:����1�A��9H����ԋ��bo���*��df�ūHo=���sLk�����y��uD����OH8�����b���~?�P�bz'n
+W���Ɍ$��#�����J��
+"�����;X����}�Ş\��ѶS3�WQy�@�?���&U�TV3iV�ȟi��8Q^�&�14�� �:�7׻ưè!Ί�	�*� ��"K+!�����زH�e�gC�Yf�m�6lټ!�RM��Ph5��e�d\<���֣MCc%,D/�`b�NT2o!YWl�GF�t]� �
��q*���F�����^��Ĺ���	�
� @���0/��:�[>A���'Ifv_�����I[>Ǵ&��=1N+�W�ZG�;�h�����ܱ� )�ϩ��S	� �w�p�*��H�-��>2���x�4J� ��L/��poA��e����it�\���7�\��5�1m;�1�~�y���-.�=Y
+���c~LC+�-��4+�o�ϴq�(�h���D\�ތB'մ��R�
�!��ɸx(�;�G���J��+P0N�زy0��߱[9p9п��.z��M����E�Z5PU�7׻Y��|V�],�^����]���h%�Z��2�S�x�w�t�gC�Yf�m�6lټ!��lu�����7�d���"'$EV�0�zuW���%h��?6<��b>�|v�Ll�-� P���$3�MJ���z�a��T&�����y�
f��y��csA��S���?@L��M�*�U4��D[��}dT���sñL/��PΣ����Ս�t��/�z��ov���kRg�v
+czam��{��aO����Ԋ�S�j&͊��3�@� ��?�1��C��7�й/e�p��윌��r��z�ih�-)�V^��,��(�����ó��Yw�]e[9�ʁV�r�����r��������׭�k�@+Z9�ʁV�r�������`؏���h�@�Z=��V�z�������bp�rz࢕���
�k�����X(���)���-z�p�J�=e��&�r�:�
�jφp�̪�<m4زyC[!�
+AW~5ao0����ENH��l`���c��-As�4�������eb�n����$��oR���d�S[>Ǥ2	]͌���ȫm0�-���������~?�P�bz'n
+W���Ɍ$��#�򮯟�ezv�r����nD��� ����K��r`rMjM�Na�/,�^ou9��R��c[�wlYͤY1|#���Dq��3�����f�:w�,�C���q�P.wZ�6
�� &���Kѓ%�`$��c�z�Pz`x>�������[5Ъ����e���2����5P*�KV�],�^���\��dj%�Z��2���زv�t�gC�Yf�m�6lټ!���m�+o�@�E�[�)]� H{���YZTIR�����^��Ĺ���	�
� @���0��/[t�'T<�$���W��z:i���Bw3�'�i%�j[�v���p���;6$��9�~*����N��"[E�I�:�GFu3��F�D4����-hw��u:�.Q���;��.�&פδ����ՖC�,�+�1?��yg��L��7�gZy8A��W�	e���2��������0j��"�z���-z���J�=e��Z��,�v���n�Yu���[6o�TS�4����:A�9���h��X	��ċ&�����C�E�[�)]� H{��o��,�/Te� ��W/�8q.�� ir�#P/�#̋
��O�x�I����2Xj����p鍺�=�@��;���v;8v�N
+��*��iS+C�4g)�g��/���v���N��9�5������Z��ٶ�������		U�y�sIRL_S���Z<BF��]�r�rMf���p��d��ڠ�"���%���������}蜍����.��7�δ���
+ՖG�XI�W�g~L3�gVa��k�/����(��;��ZݫeX=��M�@�
d���d��}Xn-�ހ�q[�Z�%�,�vi��7/}W��[7���3<�j#1�QP��R�Q�nގ6����)|h��h�Qͼ3�B�\�u��w��t�\�Ʃ*s�BU�����z!�9�s�E��<�
b>��m�m@�|�@��_,J���v���N��9�5������Z��ٶ�������		U�y�sIRL_S���Z<BF��]�r�rMf���p��d��ڠ�"���%���������}蜍����b�]�LoH�i�)���-�|��@�D���fά�pe��(^h��9DQA
'��4�W�(�z$������1�J`;ɶ�-
+���2ZJ�3����KlY$����n^��J
�n�B�gx48�Fb���읥ݼm+a5R��$�Ѷ��yg�,3���*2"��� �
+�SU��n ��B�s��& �yD�|��� ۀn�D����X�����Ho;���sLk����3�y�muE�����.����璤����?N%�x��މ�����X�-��>3��4M�A�E47K(�qoA��e�������%���Ipv�0�!u�m�8�����rouy싕z-z��4�Xpj�+���G�B+�!���f�/nK���qG蔞��]ʾ�9DA�;K�Gy�y;�<6V��TX��b��ͣQ��}����� �(=Қ'5�����w ��4�W�(�z$���T<ʗ��[.�Ys�.�(��#�h)�̌[��\b�j��wл=;���B�Ui����;Bx��'y���.
+Yfp��UdDJ�%
+�Ar���]��$u�:
+@��� �0T���'��,M
+endstream
endobj
162 0 obj
[/ICCBased 170 0 R]
endobj
190 0 obj
<</CreationDate(D:20090527042239-04'00')/Creator(Adobe Illustrator CS4)/ModDate(D:20090730214335-05'00')/Producer(Adobe PDF library 9.00)/Title(colorbox)>>
endobj
xref
+0 191
+0000000004 65535 f
+0000000016 00000 n
+0000000076 00000 n
+0000048436 00000 n
+0000000005 00000 f
+0000000006 00000 f
+0000000007 00000 f
+0000000008 00000 f
+0000000009 00000 f
+0000000010 00000 f
+0000000011 00000 f
+0000000012 00000 f
+0000000013 00000 f
+0000000014 00000 f
+0000000015 00000 f
+0000000016 00000 f
+0000000017 00000 f
+0000000018 00000 f
+0000000019 00000 f
+0000000020 00000 f
+0000000021 00000 f
+0000000022 00000 f
+0000000023 00000 f
+0000000024 00000 f
+0000000025 00000 f
+0000000026 00000 f
+0000000027 00000 f
+0000000028 00000 f
+0000000029 00000 f
+0000000030 00000 f
+0000000031 00000 f
+0000000032 00000 f
+0000000033 00000 f
+0000000034 00000 f
+0000000035 00000 f
+0000000036 00000 f
+0000000037 00000 f
+0000000038 00000 f
+0000000039 00000 f
+0000000040 00000 f
+0000000041 00000 f
+0000000042 00000 f
+0000000043 00000 f
+0000000044 00000 f
+0000000045 00000 f
+0000000046 00000 f
+0000000047 00000 f
+0000000048 00000 f
+0000000049 00000 f
+0000000050 00000 f
+0000000051 00000 f
+0000000052 00000 f
+0000000053 00000 f
+0000000054 00000 f
+0000000055 00000 f
+0000000056 00000 f
+0000000057 00000 f
+0000000058 00000 f
+0000000059 00000 f
+0000000060 00000 f
+0000000061 00000 f
+0000000062 00000 f
+0000000063 00000 f
+0000000064 00000 f
+0000000065 00000 f
+0000000066 00000 f
+0000000067 00000 f
+0000000068 00000 f
+0000000069 00000 f
+0000000070 00000 f
+0000000071 00000 f
+0000000072 00000 f
+0000000073 00000 f
+0000000074 00000 f
+0000000075 00000 f
+0000000076 00000 f
+0000000077 00000 f
+0000000078 00000 f
+0000000079 00000 f
+0000000080 00000 f
+0000000081 00000 f
+0000000082 00000 f
+0000000083 00000 f
+0000000084 00000 f
+0000000085 00000 f
+0000000086 00000 f
+0000000087 00000 f
+0000000088 00000 f
+0000000089 00000 f
+0000000090 00000 f
+0000000091 00000 f
+0000000092 00000 f
+0000000093 00000 f
+0000000094 00000 f
+0000000095 00000 f
+0000000096 00000 f
+0000000097 00000 f
+0000000098 00000 f
+0000000099 00000 f
+0000000100 00000 f
+0000000101 00000 f
+0000000102 00000 f
+0000000103 00000 f
+0000000104 00000 f
+0000000105 00000 f
+0000000106 00000 f
+0000000107 00000 f
+0000000108 00000 f
+0000000109 00000 f
+0000000110 00000 f
+0000000111 00000 f
+0000000112 00000 f
+0000000113 00000 f
+0000000114 00000 f
+0000000115 00000 f
+0000000117 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000051202 00000 n
+0000048489 00000 n
+0000048844 00000 n
+0000049045 00000 n
+0000061445 00000 n
+0000058207 00000 n
+0000050103 00000 n
+0000049109 00000 n
+0000231123 00000 n
+0000049538 00000 n
+0000049588 00000 n
+0000055520 00000 n
+0000055406 00000 n
+0000051720 00000 n
+0000051805 00000 n
+0000052189 00000 n
+0000055557 00000 n
+0000058244 00000 n
+0000061521 00000 n
+0000062006 00000 n
+0000062952 00000 n
+0000069751 00000 n
+0000084919 00000 n
+0000102822 00000 n
+0000111395 00000 n
+0000126519 00000 n
+0000132206 00000 n
+0000141391 00000 n
+0000143749 00000 n
+0000159943 00000 n
+0000177431 00000 n
+0000183301 00000 n
+0000187819 00000 n
+0000205653 00000 n
+0000220229 00000 n
+0000227091 00000 n
+0000231160 00000 n
+trailer
+<</Size 191/Root 1 0 R/Info 190 0 R/ID[<7EB5FF43BD08164184F35B8300F050C9><E617EB833E197F43BC059F7255614CEE>]>>
+startxref
+231333
+%%EOF
diff --git a/htmltest/sites/all/libraries/colorbox-version/colorbox.jquery.json b/htmltest/sites/all/libraries/colorbox-version/colorbox.jquery.json
new file mode 100644
index 00000000..3278be84
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/colorbox.jquery.json
@@ -0,0 +1,30 @@
+{
+	"name": "colorbox",
+	"title": "Colorbox",
+	"description": "jQuery lightbox and modal window plugin",
+	"version": "1.4.31",
+	"dependencies": {
+		"jquery": ">=1.3.2"
+	},
+	"keywords": [
+		"modal",
+		"lightbox",
+		"window",
+		"popup",
+		"ui",
+		"jQuery"
+	],
+	"author": {
+		"name": "Jack Moore",
+		"url": "http://www.jacklmoore.com",
+		"email": "hello@jacklmoore.com"
+	},
+	"licenses": [
+		{
+			"type": "MIT",
+			"url": "http://www.opensource.org/licenses/mit-license.php"
+		}
+	],
+	"homepage": "http://www.jacklmoore.com/colorbox",
+	"demo": "http://www.jacklmoore.com/colorbox"
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/content/ajax.html b/htmltest/sites/all/libraries/colorbox-version/content/ajax.html
new file mode 100644
index 00000000..e772638a
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/content/ajax.html
@@ -0,0 +1,11 @@
+<div id='homer' style="background:url(../content/homer.jpg) right center no-repeat #ececec; height:135px; width:280px; padding:30px 10px;">
+    <strong>Homer</strong><br/>
+    <em>\noun\</em><br/>
+    <strong>1.</strong> American bonehead<br/>
+    <strong>2. Pull a Homer-</strong><br/>
+    to succeed despite<br/>
+    idiocy
+</div>
+<script>
+    $('#homer strong').css({color:'red'});
+</script>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/content/daisy.jpg b/htmltest/sites/all/libraries/colorbox-version/content/daisy.jpg
new file mode 100644
index 00000000..2928b193
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/content/daisy.jpg differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/content/daisy@2x.jpg b/htmltest/sites/all/libraries/colorbox-version/content/daisy@2x.jpg
new file mode 100644
index 00000000..44f0e605
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/content/daisy@2x.jpg differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/content/homer.jpg b/htmltest/sites/all/libraries/colorbox-version/content/homer.jpg
new file mode 100644
index 00000000..87ec76c9
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/content/homer.jpg differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/content/marylou.jpg b/htmltest/sites/all/libraries/colorbox-version/content/marylou.jpg
new file mode 100644
index 00000000..4c717d27
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/content/marylou.jpg differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/content/ohoopee1.jpg b/htmltest/sites/all/libraries/colorbox-version/content/ohoopee1.jpg
new file mode 100644
index 00000000..aae19a3e
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/content/ohoopee1.jpg differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/content/ohoopee2.jpg b/htmltest/sites/all/libraries/colorbox-version/content/ohoopee2.jpg
new file mode 100644
index 00000000..20689448
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/content/ohoopee2.jpg differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/content/ohoopee3.jpg b/htmltest/sites/all/libraries/colorbox-version/content/ohoopee3.jpg
new file mode 100644
index 00000000..4d64d240
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/content/ohoopee3.jpg differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example1/colorbox.css b/htmltest/sites/all/libraries/colorbox-version/example1/colorbox.css
new file mode 100644
index 00000000..1dedd90f
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/example1/colorbox.css
@@ -0,0 +1,69 @@
+/*
+    Colorbox Core Style:
+    The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/* 
+    User Style:
+    Change the following styles to modify the appearance of Colorbox.  They are
+    ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:url(images/overlay.png) repeat 0 0;}
+#colorbox{outline:0;}
+    #cboxTopLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px 0;}
+    #cboxTopRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px 0;}
+    #cboxBottomLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px -29px;}
+    #cboxBottomRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px -29px;}
+    #cboxMiddleLeft{width:21px; background:url(images/controls.png) left top repeat-y;}
+    #cboxMiddleRight{width:21px; background:url(images/controls.png) right top repeat-y;}
+    #cboxTopCenter{height:21px; background:url(images/border.png) 0 0 repeat-x;}
+    #cboxBottomCenter{height:21px; background:url(images/border.png) 0 -29px repeat-x;}
+    #cboxContent{background:#fff; overflow:hidden;}
+        .cboxIframe{background:#fff;}
+        #cboxError{padding:50px; border:1px solid #ccc;}
+        #cboxLoadedContent{margin-bottom:28px;}
+        #cboxTitle{position:absolute; bottom:4px; left:0; text-align:center; width:100%; color:#949494;}
+        #cboxCurrent{position:absolute; bottom:4px; left:58px; color:#949494;}
+        #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
+        #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+
+        /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */
+        #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; width:auto; background:none; }
+        
+        /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */
+        #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;}
+
+        #cboxSlideshow{position:absolute; bottom:4px; right:30px; color:#0092ef;}
+        #cboxPrevious{position:absolute; bottom:0; left:0; background:url(images/controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;}
+        #cboxPrevious:hover{background-position:-75px -25px;}
+        #cboxNext{position:absolute; bottom:0; left:27px; background:url(images/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;}
+        #cboxNext:hover{background-position:-50px -25px;}
+        #cboxClose{position:absolute; bottom:0; right:0; background:url(images/controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;}
+        #cboxClose:hover{background-position:-25px -25px;}
+
+/*
+  The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
+  when an alpha filter (opacity change) is set on the element or ancestor element.  This style is not applied to or needed in IE9.
+  See: http://jacklmoore.com/notes/ie-transparency-problems/
+*/
+.cboxIE #cboxTopLeft,
+.cboxIE #cboxTopCenter,
+.cboxIE #cboxTopRight,
+.cboxIE #cboxBottomLeft,
+.cboxIE #cboxBottomCenter,
+.cboxIE #cboxBottomRight,
+.cboxIE #cboxMiddleLeft,
+.cboxIE #cboxMiddleRight {
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/example1/images/border.png b/htmltest/sites/all/libraries/colorbox-version/example1/images/border.png
new file mode 100644
index 00000000..f463a10d
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example1/images/border.png differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example1/images/controls.png b/htmltest/sites/all/libraries/colorbox-version/example1/images/controls.png
new file mode 100644
index 00000000..dcfd6fb9
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example1/images/controls.png differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example1/images/loading.gif b/htmltest/sites/all/libraries/colorbox-version/example1/images/loading.gif
new file mode 100644
index 00000000..b4695d81
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example1/images/loading.gif differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example1/images/loading_background.png b/htmltest/sites/all/libraries/colorbox-version/example1/images/loading_background.png
new file mode 100644
index 00000000..6ae83e69
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example1/images/loading_background.png differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example1/images/overlay.png b/htmltest/sites/all/libraries/colorbox-version/example1/images/overlay.png
new file mode 100644
index 00000000..53ea98f7
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example1/images/overlay.png differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example1/index.html b/htmltest/sites/all/libraries/colorbox-version/example1/index.html
new file mode 100644
index 00000000..8f10b930
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/example1/index.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset='utf-8'/>
+		<title>Colorbox Examples</title>
+		<style>
+			body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+			a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+			h2{font-size:13px; margin:15px 0 0 0;}
+		</style>
+		<link rel="stylesheet" href="colorbox.css" />
+		<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+		<script src="../jquery.colorbox.js"></script>
+		<script>
+			$(document).ready(function(){
+				//Examples of how to assign the Colorbox event to elements
+				$(".group1").colorbox({rel:'group1'});
+				$(".group2").colorbox({rel:'group2', transition:"fade"});
+				$(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+				$(".group4").colorbox({rel:'group4', slideshow:true});
+				$(".ajax").colorbox();
+				$(".youtube").colorbox({iframe:true, innerWidth:640, innerHeight:390});
+				$(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+				$(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+				$(".inline").colorbox({inline:true, width:"50%"});
+				$(".callbacks").colorbox({
+					onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+					onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+					onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+					onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+					onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+				});
+
+				$('.non-retina').colorbox({rel:'group5', transition:'none'})
+				$('.retina').colorbox({rel:'group5', transition:'none', retinaImage:true, retinaUrl:true});
+				
+				//Example of preserving a JavaScript event for inline calls.
+				$("#click").click(function(){ 
+					$('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+					return false;
+				});
+			});
+		</script>
+	</head>
+	<body>
+		<h1>Colorbox Demonstration</h1>
+		<h2>Elastic Transition</h2>
+		<p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Fade Transition</h2>
+		<p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+		<p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>No Transition + fixed width and height (75% of screen size)</h2>
+		<p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Slideshow</h2>
+		<p><a class="group4"  href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group4"  href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group4"  href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Other Content Types</h2>
+		<p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+		<p><a class='youtube' href="http://www.youtube.com/embed/VOJyrQa_WR4?rel=0&amp;wmode=transparent">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+		<p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+		<p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+		<p><a class='inline' href="#inline_content">Inline HTML</a></p>
+		
+		<h2>Demonstration of using callbacks</h2>
+		<p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+		
+
+		<h2>Retina Images</h2>
+		<p><a class="retina" href="../content/daisy.jpg" title="Retina">Retina</a></p>
+		<p><a class="non-retina" href="../content/daisy.jpg" title="Non-Retina">Non-Retina</a></p>
+
+		<!-- This contains the hidden content for inline calls -->
+		<div style='display:none'>
+			<div id='inline_content' style='padding:10px; background:#fff;'>
+			<p><strong>This content comes from a hidden element on this page.</strong></p>
+			<p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+			<p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+			
+			<p><strong>If you try to open a new Colorbox while it is already open, it will update itself with the new content.</strong></p>
+			<p>Updating Content Example:<br />
+			<a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/example2/colorbox.css b/htmltest/sites/all/libraries/colorbox-version/example2/colorbox.css
new file mode 100644
index 00000000..b463110f
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/example2/colorbox.css
@@ -0,0 +1,49 @@
+/*
+    Colorbox Core Style:
+    The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/* 
+    User Style:
+    Change the following styles to modify the appearance of Colorbox.  They are
+    ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#fff;}
+#colorbox{outline:0;}
+    #cboxContent{margin-top:32px; overflow:visible; background:#000;}
+        .cboxIframe{background:#fff;}
+        #cboxError{padding:50px; border:1px solid #ccc;}
+        #cboxLoadedContent{background:#000; padding:1px;}
+        #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+        #cboxLoadingOverlay{background:#000;}
+        #cboxTitle{position:absolute; top:-22px; left:0; color:#000;}
+        #cboxCurrent{position:absolute; top:-22px; right:205px; text-indent:-9999px;}
+
+        /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */
+        #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; text-indent:-9999px; width:20px; height:20px; position:absolute; top:-20px; background:url(images/controls.png) no-repeat 0 0;}
+        
+        /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */
+        #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;}
+
+        #cboxPrevious{background-position:0px 0px; right:44px;}
+        #cboxPrevious:hover{background-position:0px -25px;}
+        #cboxNext{background-position:-25px 0px; right:22px;}
+        #cboxNext:hover{background-position:-25px -25px;}
+        #cboxClose{background-position:-50px 0px; right:0;}
+        #cboxClose:hover{background-position:-50px -25px;}
+        .cboxSlideshow_on #cboxPrevious, .cboxSlideshow_off #cboxPrevious{right:66px;}
+        .cboxSlideshow_on #cboxSlideshow{background-position:-75px -25px; right:44px;}
+        .cboxSlideshow_on #cboxSlideshow:hover{background-position:-100px -25px;}
+        .cboxSlideshow_off #cboxSlideshow{background-position:-100px 0px; right:44px;}
+        .cboxSlideshow_off #cboxSlideshow:hover{background-position:-75px -25px;}
diff --git a/htmltest/sites/all/libraries/colorbox-version/example2/images/controls.png b/htmltest/sites/all/libraries/colorbox-version/example2/images/controls.png
new file mode 100644
index 00000000..8569b57f
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example2/images/controls.png differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example2/images/loading.gif b/htmltest/sites/all/libraries/colorbox-version/example2/images/loading.gif
new file mode 100644
index 00000000..19c67bbd
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example2/images/loading.gif differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example2/index.html b/htmltest/sites/all/libraries/colorbox-version/example2/index.html
new file mode 100644
index 00000000..8f10b930
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/example2/index.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset='utf-8'/>
+		<title>Colorbox Examples</title>
+		<style>
+			body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+			a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+			h2{font-size:13px; margin:15px 0 0 0;}
+		</style>
+		<link rel="stylesheet" href="colorbox.css" />
+		<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+		<script src="../jquery.colorbox.js"></script>
+		<script>
+			$(document).ready(function(){
+				//Examples of how to assign the Colorbox event to elements
+				$(".group1").colorbox({rel:'group1'});
+				$(".group2").colorbox({rel:'group2', transition:"fade"});
+				$(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+				$(".group4").colorbox({rel:'group4', slideshow:true});
+				$(".ajax").colorbox();
+				$(".youtube").colorbox({iframe:true, innerWidth:640, innerHeight:390});
+				$(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+				$(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+				$(".inline").colorbox({inline:true, width:"50%"});
+				$(".callbacks").colorbox({
+					onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+					onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+					onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+					onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+					onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+				});
+
+				$('.non-retina').colorbox({rel:'group5', transition:'none'})
+				$('.retina').colorbox({rel:'group5', transition:'none', retinaImage:true, retinaUrl:true});
+				
+				//Example of preserving a JavaScript event for inline calls.
+				$("#click").click(function(){ 
+					$('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+					return false;
+				});
+			});
+		</script>
+	</head>
+	<body>
+		<h1>Colorbox Demonstration</h1>
+		<h2>Elastic Transition</h2>
+		<p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Fade Transition</h2>
+		<p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+		<p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>No Transition + fixed width and height (75% of screen size)</h2>
+		<p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Slideshow</h2>
+		<p><a class="group4"  href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group4"  href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group4"  href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Other Content Types</h2>
+		<p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+		<p><a class='youtube' href="http://www.youtube.com/embed/VOJyrQa_WR4?rel=0&amp;wmode=transparent">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+		<p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+		<p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+		<p><a class='inline' href="#inline_content">Inline HTML</a></p>
+		
+		<h2>Demonstration of using callbacks</h2>
+		<p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+		
+
+		<h2>Retina Images</h2>
+		<p><a class="retina" href="../content/daisy.jpg" title="Retina">Retina</a></p>
+		<p><a class="non-retina" href="../content/daisy.jpg" title="Non-Retina">Non-Retina</a></p>
+
+		<!-- This contains the hidden content for inline calls -->
+		<div style='display:none'>
+			<div id='inline_content' style='padding:10px; background:#fff;'>
+			<p><strong>This content comes from a hidden element on this page.</strong></p>
+			<p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+			<p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+			
+			<p><strong>If you try to open a new Colorbox while it is already open, it will update itself with the new content.</strong></p>
+			<p>Updating Content Example:<br />
+			<a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/example3/colorbox.css b/htmltest/sites/all/libraries/colorbox-version/example3/colorbox.css
new file mode 100644
index 00000000..f12844e1
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/example3/colorbox.css
@@ -0,0 +1,44 @@
+/*
+    Colorbox Core Style:
+    The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/* 
+    User Style:
+    Change the following styles to modify the appearance of Colorbox.  They are
+    ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#000;}
+#colorbox{outline:0;}
+    #cboxContent{margin-top:20px;background:#000;}
+        .cboxIframe{background:#fff;}
+        #cboxError{padding:50px; border:1px solid #ccc;}
+        #cboxLoadedContent{border:5px solid #000; background:#fff;}
+        #cboxTitle{position:absolute; top:-20px; left:0; color:#ccc;}
+        #cboxCurrent{position:absolute; top:-20px; right:0px; color:#ccc;}
+        #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+
+        /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */
+        #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; width:auto; background:none; }
+        
+        /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */
+        #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;}
+        
+        #cboxSlideshow{position:absolute; top:-20px; right:90px; color:#fff;}
+        #cboxPrevious{position:absolute; top:50%; left:5px; margin-top:-32px; background:url(images/controls.png) no-repeat top left; width:28px; height:65px; text-indent:-9999px;}
+        #cboxPrevious:hover{background-position:bottom left;}
+        #cboxNext{position:absolute; top:50%; right:5px; margin-top:-32px; background:url(images/controls.png) no-repeat top right; width:28px; height:65px; text-indent:-9999px;}
+        #cboxNext:hover{background-position:bottom right;}
+        #cboxClose{position:absolute; top:5px; right:5px; display:block; background:url(images/controls.png) no-repeat top center; width:38px; height:19px; text-indent:-9999px;}
+        #cboxClose:hover{background-position:bottom center;}
diff --git a/htmltest/sites/all/libraries/colorbox-version/example3/images/controls.png b/htmltest/sites/all/libraries/colorbox-version/example3/images/controls.png
new file mode 100644
index 00000000..e1e97982
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example3/images/controls.png differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example3/images/loading.gif b/htmltest/sites/all/libraries/colorbox-version/example3/images/loading.gif
new file mode 100644
index 00000000..19c67bbd
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example3/images/loading.gif differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example3/index.html b/htmltest/sites/all/libraries/colorbox-version/example3/index.html
new file mode 100644
index 00000000..8f10b930
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/example3/index.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset='utf-8'/>
+		<title>Colorbox Examples</title>
+		<style>
+			body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+			a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+			h2{font-size:13px; margin:15px 0 0 0;}
+		</style>
+		<link rel="stylesheet" href="colorbox.css" />
+		<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+		<script src="../jquery.colorbox.js"></script>
+		<script>
+			$(document).ready(function(){
+				//Examples of how to assign the Colorbox event to elements
+				$(".group1").colorbox({rel:'group1'});
+				$(".group2").colorbox({rel:'group2', transition:"fade"});
+				$(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+				$(".group4").colorbox({rel:'group4', slideshow:true});
+				$(".ajax").colorbox();
+				$(".youtube").colorbox({iframe:true, innerWidth:640, innerHeight:390});
+				$(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+				$(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+				$(".inline").colorbox({inline:true, width:"50%"});
+				$(".callbacks").colorbox({
+					onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+					onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+					onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+					onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+					onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+				});
+
+				$('.non-retina').colorbox({rel:'group5', transition:'none'})
+				$('.retina').colorbox({rel:'group5', transition:'none', retinaImage:true, retinaUrl:true});
+				
+				//Example of preserving a JavaScript event for inline calls.
+				$("#click").click(function(){ 
+					$('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+					return false;
+				});
+			});
+		</script>
+	</head>
+	<body>
+		<h1>Colorbox Demonstration</h1>
+		<h2>Elastic Transition</h2>
+		<p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Fade Transition</h2>
+		<p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+		<p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>No Transition + fixed width and height (75% of screen size)</h2>
+		<p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Slideshow</h2>
+		<p><a class="group4"  href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group4"  href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group4"  href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Other Content Types</h2>
+		<p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+		<p><a class='youtube' href="http://www.youtube.com/embed/VOJyrQa_WR4?rel=0&amp;wmode=transparent">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+		<p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+		<p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+		<p><a class='inline' href="#inline_content">Inline HTML</a></p>
+		
+		<h2>Demonstration of using callbacks</h2>
+		<p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+		
+
+		<h2>Retina Images</h2>
+		<p><a class="retina" href="../content/daisy.jpg" title="Retina">Retina</a></p>
+		<p><a class="non-retina" href="../content/daisy.jpg" title="Non-Retina">Non-Retina</a></p>
+
+		<!-- This contains the hidden content for inline calls -->
+		<div style='display:none'>
+			<div id='inline_content' style='padding:10px; background:#fff;'>
+			<p><strong>This content comes from a hidden element on this page.</strong></p>
+			<p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+			<p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+			
+			<p><strong>If you try to open a new Colorbox while it is already open, it will update itself with the new content.</strong></p>
+			<p>Updating Content Example:<br />
+			<a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/example4/colorbox.css b/htmltest/sites/all/libraries/colorbox-version/example4/colorbox.css
new file mode 100644
index 00000000..1a3b899a
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/example4/colorbox.css
@@ -0,0 +1,65 @@
+/*
+    Colorbox Core Style:
+    The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/* 
+    User Style:
+    Change the following styles to modify the appearance of Colorbox.  They are
+    ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#fff;}
+#colorbox{outline:0;}
+    #cboxTopLeft{width:25px; height:25px; background:url(images/border1.png) no-repeat 0 0;}
+    #cboxTopCenter{height:25px; background:url(images/border1.png) repeat-x 0 -50px;}
+    #cboxTopRight{width:25px; height:25px; background:url(images/border1.png) no-repeat -25px 0;}
+    #cboxBottomLeft{width:25px; height:25px; background:url(images/border1.png) no-repeat 0 -25px;}
+    #cboxBottomCenter{height:25px; background:url(images/border1.png) repeat-x 0 -75px;}
+    #cboxBottomRight{width:25px; height:25px; background:url(images/border1.png) no-repeat -25px -25px;}
+    #cboxMiddleLeft{width:25px; background:url(images/border2.png) repeat-y 0 0;}
+    #cboxMiddleRight{width:25px; background:url(images/border2.png) repeat-y -25px 0;}
+    #cboxContent{background:#fff; overflow:hidden;}
+        .cboxIframe{background:#fff;}
+        #cboxError{padding:50px; border:1px solid #ccc;}
+        #cboxLoadedContent{margin-bottom:20px;}
+        #cboxTitle{position:absolute; bottom:0px; left:0; text-align:center; width:100%; color:#999;}
+        #cboxCurrent{position:absolute; bottom:0px; left:100px; color:#999;}
+        #cboxLoadingOverlay{background:#fff url(images/loading.gif) no-repeat 5px 5px;}
+
+        /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */
+        #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; width:auto; background:none; }
+        
+        /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */
+        #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;}
+
+        #cboxSlideshow{position:absolute; bottom:0px; right:42px; color:#444;}
+        #cboxPrevious{position:absolute; bottom:0px; left:0; color:#444;}
+        #cboxNext{position:absolute; bottom:0px; left:63px; color:#444;}
+        #cboxClose{position:absolute; bottom:0; right:0; display:block; color:#444;}
+
+/*
+  The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
+  when an alpha filter (opacity change) is set on the element or ancestor element.  This style is not applied to or needed in IE9.
+  See: http://jacklmoore.com/notes/ie-transparency-problems/
+*/
+.cboxIE #cboxTopLeft,
+.cboxIE #cboxTopCenter,
+.cboxIE #cboxTopRight,
+.cboxIE #cboxBottomLeft,
+.cboxIE #cboxBottomCenter,
+.cboxIE #cboxBottomRight,
+.cboxIE #cboxMiddleLeft,
+.cboxIE #cboxMiddleRight {
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/example4/images/border1.png b/htmltest/sites/all/libraries/colorbox-version/example4/images/border1.png
new file mode 100644
index 00000000..0ddc7040
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example4/images/border1.png differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example4/images/border2.png b/htmltest/sites/all/libraries/colorbox-version/example4/images/border2.png
new file mode 100644
index 00000000..aa62a0b7
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example4/images/border2.png differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example4/images/loading.gif b/htmltest/sites/all/libraries/colorbox-version/example4/images/loading.gif
new file mode 100644
index 00000000..602ce3c3
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example4/images/loading.gif differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example4/index.html b/htmltest/sites/all/libraries/colorbox-version/example4/index.html
new file mode 100644
index 00000000..8f10b930
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/example4/index.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset='utf-8'/>
+		<title>Colorbox Examples</title>
+		<style>
+			body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+			a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+			h2{font-size:13px; margin:15px 0 0 0;}
+		</style>
+		<link rel="stylesheet" href="colorbox.css" />
+		<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+		<script src="../jquery.colorbox.js"></script>
+		<script>
+			$(document).ready(function(){
+				//Examples of how to assign the Colorbox event to elements
+				$(".group1").colorbox({rel:'group1'});
+				$(".group2").colorbox({rel:'group2', transition:"fade"});
+				$(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+				$(".group4").colorbox({rel:'group4', slideshow:true});
+				$(".ajax").colorbox();
+				$(".youtube").colorbox({iframe:true, innerWidth:640, innerHeight:390});
+				$(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+				$(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+				$(".inline").colorbox({inline:true, width:"50%"});
+				$(".callbacks").colorbox({
+					onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+					onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+					onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+					onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+					onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+				});
+
+				$('.non-retina').colorbox({rel:'group5', transition:'none'})
+				$('.retina').colorbox({rel:'group5', transition:'none', retinaImage:true, retinaUrl:true});
+				
+				//Example of preserving a JavaScript event for inline calls.
+				$("#click").click(function(){ 
+					$('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+					return false;
+				});
+			});
+		</script>
+	</head>
+	<body>
+		<h1>Colorbox Demonstration</h1>
+		<h2>Elastic Transition</h2>
+		<p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Fade Transition</h2>
+		<p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+		<p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>No Transition + fixed width and height (75% of screen size)</h2>
+		<p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Slideshow</h2>
+		<p><a class="group4"  href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group4"  href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group4"  href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Other Content Types</h2>
+		<p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+		<p><a class='youtube' href="http://www.youtube.com/embed/VOJyrQa_WR4?rel=0&amp;wmode=transparent">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+		<p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+		<p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+		<p><a class='inline' href="#inline_content">Inline HTML</a></p>
+		
+		<h2>Demonstration of using callbacks</h2>
+		<p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+		
+
+		<h2>Retina Images</h2>
+		<p><a class="retina" href="../content/daisy.jpg" title="Retina">Retina</a></p>
+		<p><a class="non-retina" href="../content/daisy.jpg" title="Non-Retina">Non-Retina</a></p>
+
+		<!-- This contains the hidden content for inline calls -->
+		<div style='display:none'>
+			<div id='inline_content' style='padding:10px; background:#fff;'>
+			<p><strong>This content comes from a hidden element on this page.</strong></p>
+			<p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+			<p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+			
+			<p><strong>If you try to open a new Colorbox while it is already open, it will update itself with the new content.</strong></p>
+			<p>Updating Content Example:<br />
+			<a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/example5/colorbox.css b/htmltest/sites/all/libraries/colorbox-version/example5/colorbox.css
new file mode 100644
index 00000000..fae0adef
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/example5/colorbox.css
@@ -0,0 +1,57 @@
+/*
+    Colorbox Core Style:
+    The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/* 
+    User Style:
+    Change the following styles to modify the appearance of Colorbox.  They are
+    ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#000;}
+#colorbox{outline:0;}
+    #cboxTopLeft{width:14px; height:14px; background:url(images/controls.png) no-repeat 0 0;}
+    #cboxTopCenter{height:14px; background:url(images/border.png) repeat-x top left;}
+    #cboxTopRight{width:14px; height:14px; background:url(images/controls.png) no-repeat -36px 0;}
+    #cboxBottomLeft{width:14px; height:43px; background:url(images/controls.png) no-repeat 0 -32px;}
+    #cboxBottomCenter{height:43px; background:url(images/border.png) repeat-x bottom left;}
+    #cboxBottomRight{width:14px; height:43px; background:url(images/controls.png) no-repeat -36px -32px;}
+    #cboxMiddleLeft{width:14px; background:url(images/controls.png) repeat-y -175px 0;}
+    #cboxMiddleRight{width:14px; background:url(images/controls.png) repeat-y -211px 0;}
+    #cboxContent{background:#fff; overflow:visible;}
+        .cboxIframe{background:#fff;}
+        #cboxError{padding:50px; border:1px solid #ccc;}
+        #cboxLoadedContent{margin-bottom:5px;}
+        #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
+        #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+        #cboxTitle{position:absolute; bottom:-25px; left:0; text-align:center; width:100%; font-weight:bold; color:#7C7C7C;}
+        #cboxCurrent{position:absolute; bottom:-25px; left:58px; font-weight:bold; color:#7C7C7C;}
+
+        /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */
+        #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible;  position:absolute; bottom:-29px; background:url(images/controls.png) no-repeat 0px 0px; width:23px; height:23px; text-indent:-9999px;}
+        
+        /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */
+        #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;}
+
+        #cboxPrevious{left:0px; background-position: -51px -25px;}
+        #cboxPrevious:hover{background-position:-51px 0px;}
+        #cboxNext{left:27px; background-position:-75px -25px;}
+        #cboxNext:hover{background-position:-75px 0px;}
+        #cboxClose{right:0; background-position:-100px -25px;}
+        #cboxClose:hover{background-position:-100px 0px;}
+
+        .cboxSlideshow_on #cboxSlideshow{background-position:-125px 0px; right:27px;}
+        .cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0px;}
+        .cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px; right:27px;}
+        .cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0px;}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/example5/images/border.png b/htmltest/sites/all/libraries/colorbox-version/example5/images/border.png
new file mode 100644
index 00000000..df13bb6d
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example5/images/border.png differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example5/images/controls.png b/htmltest/sites/all/libraries/colorbox-version/example5/images/controls.png
new file mode 100644
index 00000000..65cfd1dc
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example5/images/controls.png differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example5/images/loading.gif b/htmltest/sites/all/libraries/colorbox-version/example5/images/loading.gif
new file mode 100644
index 00000000..b4695d81
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example5/images/loading.gif differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example5/images/loading_background.png b/htmltest/sites/all/libraries/colorbox-version/example5/images/loading_background.png
new file mode 100644
index 00000000..9de11f46
Binary files /dev/null and b/htmltest/sites/all/libraries/colorbox-version/example5/images/loading_background.png differ
diff --git a/htmltest/sites/all/libraries/colorbox-version/example5/index.html b/htmltest/sites/all/libraries/colorbox-version/example5/index.html
new file mode 100644
index 00000000..8f10b930
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/example5/index.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset='utf-8'/>
+		<title>Colorbox Examples</title>
+		<style>
+			body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+			a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+			h2{font-size:13px; margin:15px 0 0 0;}
+		</style>
+		<link rel="stylesheet" href="colorbox.css" />
+		<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+		<script src="../jquery.colorbox.js"></script>
+		<script>
+			$(document).ready(function(){
+				//Examples of how to assign the Colorbox event to elements
+				$(".group1").colorbox({rel:'group1'});
+				$(".group2").colorbox({rel:'group2', transition:"fade"});
+				$(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+				$(".group4").colorbox({rel:'group4', slideshow:true});
+				$(".ajax").colorbox();
+				$(".youtube").colorbox({iframe:true, innerWidth:640, innerHeight:390});
+				$(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+				$(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+				$(".inline").colorbox({inline:true, width:"50%"});
+				$(".callbacks").colorbox({
+					onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+					onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+					onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+					onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+					onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+				});
+
+				$('.non-retina').colorbox({rel:'group5', transition:'none'})
+				$('.retina').colorbox({rel:'group5', transition:'none', retinaImage:true, retinaUrl:true});
+				
+				//Example of preserving a JavaScript event for inline calls.
+				$("#click").click(function(){ 
+					$('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+					return false;
+				});
+			});
+		</script>
+	</head>
+	<body>
+		<h1>Colorbox Demonstration</h1>
+		<h2>Elastic Transition</h2>
+		<p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Fade Transition</h2>
+		<p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+		<p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>No Transition + fixed width and height (75% of screen size)</h2>
+		<p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Slideshow</h2>
+		<p><a class="group4"  href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+		<p><a class="group4"  href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+		<p><a class="group4"  href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+		
+		<h2>Other Content Types</h2>
+		<p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+		<p><a class='youtube' href="http://www.youtube.com/embed/VOJyrQa_WR4?rel=0&amp;wmode=transparent">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+		<p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+		<p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+		<p><a class='inline' href="#inline_content">Inline HTML</a></p>
+		
+		<h2>Demonstration of using callbacks</h2>
+		<p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+		
+
+		<h2>Retina Images</h2>
+		<p><a class="retina" href="../content/daisy.jpg" title="Retina">Retina</a></p>
+		<p><a class="non-retina" href="../content/daisy.jpg" title="Non-Retina">Non-Retina</a></p>
+
+		<!-- This contains the hidden content for inline calls -->
+		<div style='display:none'>
+			<div id='inline_content' style='padding:10px; background:#fff;'>
+			<p><strong>This content comes from a hidden element on this page.</strong></p>
+			<p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+			<p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+			
+			<p><strong>If you try to open a new Colorbox while it is already open, it will update itself with the new content.</strong></p>
+			<p>Updating Content Example:<br />
+			<a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+			</div>
+		</div>
+	</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-ar.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-ar.js
new file mode 100644
index 00000000..6c4228cd
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-ar.js
@@ -0,0 +1,15 @@
+/*
+  jQuery Colorbox language configuration
+  language: Arabic (ar)
+  translated by: A.Rhman Sayes
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+  current: "الصورة {current} من {total}",
+	previous: "السابق",
+	next: "التالي",
+	close: "إغلاق",
+	xhrError: "حدث خطأ أثناء تحميل المحتوى.",
+	imgError: "حدث خطأ أثناء تحميل الصورة.",
+	slideshowStart: "تشغيل العرض",
+	slideshowStop: "إيقاف العرض"
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-bg.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-bg.js
new file mode 100644
index 00000000..de7e4a1d
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-bg.js
@@ -0,0 +1,16 @@
+/*
+  jQuery Colorbox language configuration
+	language: Bulgarian (bg)
+	translated by: Marian M.Bida
+	site: webmax.bg
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "изображение {current} от {total}",
+	previous: "предишна",
+	next: "следваща",
+	close: "затвори",
+	xhrError: "Неуспешно зареждане на съдържанието.",
+	imgError: "Неуспешно зареждане на изображението.",
+	slideshowStart: "пусни слайд-шоу",
+	slideshowStop: "спри слайд-шоу"
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-cs.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-cs.js
new file mode 100644
index 00000000..9649fd45
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-cs.js
@@ -0,0 +1,16 @@
+/*
+	jQuery Colorbox language configuration
+	language: Czech (cs)
+	translated by: Filip Novak
+	site: mame.napilno.cz/filip-novak
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "{current}. obrázek z {total}",
+	previous: "Předchozí",
+	next: "Následující",
+	close: "Zavřít",
+	xhrError: "Obsah se nepodařilo načíst.",
+	imgError: "Obrázek se nepodařilo načíst.",
+	slideshowStart: "Spustit slideshow",
+	slideshowStop: "Zastavit slideshow"
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-da.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-da.js
new file mode 100644
index 00000000..676fffed
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-da.js
@@ -0,0 +1,16 @@
+/*
+	jQuery Colorbox language configuration
+	language: Danish (da)
+	translated by: danieljuhl
+	site: danieljuhl.dk
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "Billede {current} af {total}",
+	previous: "Forrige",
+	next: "Næste",
+	close: "Luk",
+	xhrError: "Indholdet fejlede i indlæsningen.",
+	imgError: "Billedet fejlede i indlæsningen.",
+	slideshowStart: "Start slideshow",
+	slideshowStop: "Stop slideshow"
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-de.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-de.js
new file mode 100644
index 00000000..d489379b
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-de.js
@@ -0,0 +1,15 @@
+/*
+	jQuery Colorbox language configuration
+	language: German (de)
+	translated by: wallenium
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "Bild {current} von {total}",
+	previous: "Zurück",
+	next: "Vor",
+	close: "Schließen",
+	xhrError: "Dieser Inhalt konnte nicht geladen werden.",
+	imgError: "Dieses Bild konnte nicht geladen werden.",
+	slideshowStart: "Slideshow starten",
+	slideshowStop: "Slideshow anhalten"
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-es.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-es.js
new file mode 100644
index 00000000..11296fc9
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-es.js
@@ -0,0 +1,13 @@
+/*
+  jQuery Colorbox language configuration
+	language: Spanish (es)
+	translated by: migolo
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "Imagen {current} de {total}",
+	previous: "Anterior",
+	next: "Siguiente",
+	close: "Cerrar",
+	xhrError: "Error en la carga del contenido.",
+	imgError: "Error en la carga de la imagen."
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-et.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-et.js
new file mode 100644
index 00000000..60a4e888
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-et.js
@@ -0,0 +1,15 @@
+/*
+	jQuery Colorbox language configuration
+	language: Estonian (et)
+	translated by: keevitaja
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "{current}/{total}",
+	previous: "eelmine",
+	next: "järgmine",
+	close: "sulge",
+	xhrError: "Sisu ei õnnestunud laadida.",
+	imgError: "Pilti ei õnnestunud laadida.",
+	slideshowStart: "Käivita slaidid",
+	slideshowStop: "Peata slaidid"
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-fa.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-fa.js
new file mode 100644
index 00000000..32869a4c
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-fa.js
@@ -0,0 +1,18 @@
+/*
+	jQuery Colorbox language configuration
+	language: Persian (Farsi)
+	translated by: Mahdi Jaberzadeh Ansari (MJZSoft)
+	site: www.mjzsoft.ir
+	email: mahdijaberzadehansari (at) yahoo.co.uk
+	Please note : Persian language is right to left like arabic.
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "تصویر {current} از {total}",
+	previous: "قبلی",
+	next: "بعدی",
+	close: "بستن",
+	xhrError: "متاسفانه محتویات مورد نظر قابل نمایش نیست.",
+	imgError: "متاسفانه بارگذاری این عکس با مشکل مواجه شده است.",
+	slideshowStart: "آغاز نمایش خودکار",
+	slideshowStop: "توقف نمایش خودکار"
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-fi.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-fi.js
new file mode 100644
index 00000000..ac03fe02
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-fi.js
@@ -0,0 +1,15 @@
+/*
+	jQuery Colorbox language configuration
+	language: Finnish (fi)
+	translated by: Mikko
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "Kuva {current} / {total}",
+	previous: "Edellinen",
+	next: "Seuraava",
+	close: "Sulje",
+	xhrError: "Sisällön lataaminen epäonnistui.",
+	imgError: "Kuvan lataaminen epäonnistui.",
+	slideshowStart: "Aloita kuvaesitys.",
+	slideshowStop: "Lopeta kuvaesitys."	
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-fr.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-fr.js
new file mode 100644
index 00000000..f76352bd
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-fr.js
@@ -0,0 +1,15 @@
+/*
+  jQuery Colorbox language configuration
+  language: French (fr)
+  translated by: oaubert
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "image {current} sur {total}",
+	previous: "pr&eacute;c&eacute;dente",
+	next: "suivante",
+	close: "fermer",
+	xhrError: "Impossible de charger ce contenu.",
+	imgError: "Impossible de charger cette image.",
+	slideshowStart: "d&eacute;marrer la pr&eacute;sentation",
+	slideshowStop: "arr&ecirc;ter la pr&eacute;sentation"
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-he.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-he.js
new file mode 100644
index 00000000..78908e39
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-he.js
@@ -0,0 +1,16 @@
+/*
+	jQuery Colorbox language configuration
+	language: Hebrew (he)
+	translated by: DavidCo
+	site: DavidCo.me
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "תמונה {current} מתוך {total}",
+	previous: "הקודם",
+	next: "הבא",
+	close: "סגור",
+	xhrError: "שגיאה בטעינת התוכן.",
+	imgError: "שגיאה בטעינת התמונה.",
+	slideshowStart: "התחל מצגת",
+	slideshowStop: "עצור מצגת"
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-hr.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-hr.js
new file mode 100644
index 00000000..7eb62bec
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-hr.js
@@ -0,0 +1,15 @@
+/*
+	jQuery Colorbox language configuration
+	language: Croatian (hr)
+	translated by: Mladen Bicanic (base.hr)
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "Slika {current} od {total}",
+	previous: "Prethodna",
+	next: "Sljedeća",
+	close: "Zatvori",
+	xhrError: "Neuspješno učitavanje sadržaja.",
+	imgError: "Neuspješno učitavanje slike.",
+	slideshowStart: "Pokreni slideshow",
+	slideshowStop: "Zaustavi slideshow"
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-hu.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-hu.js
new file mode 100644
index 00000000..72e9d36b
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-hu.js
@@ -0,0 +1,15 @@
+/*
+	jQuery Colorbox language configuration
+	language: Hungarian (hu)
+	translated by: kovadani
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "{current}/{total} kép",
+	previous: "Előző",
+	next: "Következő",
+	close: "Bezár",
+	xhrError: "A tartalmat nem sikerült betölteni.",
+	imgError: "A képet nem sikerült betölteni.",
+	slideshowStart: "Diavetítés indítása",
+	slideshowStop: "Diavetítés leállítása"
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-id.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-id.js
new file mode 100644
index 00000000..81a62df3
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-id.js
@@ -0,0 +1,15 @@
+/*
+	jQuery Colorbox language configuration
+	language: Indonesian (id)
+	translated by: sarwasunda
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "ke {current} dari {total}",
+	previous: "Sebelumnya",
+	next: "Berikutnya",
+	close: "Tutup",
+	xhrError: "Konten ini tidak dapat dimuat.",
+	imgError: "Gambar ini tidak dapat dimuat.",
+	slideshowStart: "Putar",
+	slideshowStop: "Berhenti"
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-it.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-it.js
new file mode 100644
index 00000000..2a4af645
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-it.js
@@ -0,0 +1,15 @@
+/*
+	jQuery Colorbox language configuration
+	language: Italian (it)
+	translated by: maur8ino
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "Immagine {current} di {total}",
+	previous: "Precedente",
+	next: "Successiva",
+	close: "Chiudi",
+	xhrError: "Errore nel caricamento del contenuto.",
+	imgError: "Errore nel caricamento dell'immagine.",
+	slideshowStart: "Inizia la presentazione",
+	slideshowStop: "Termina la presentazione"
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-ja.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-ja.js
new file mode 100644
index 00000000..5480de33
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-ja.js
@@ -0,0 +1,15 @@
+/*
+  jQuery Colorbox language configuration
+  language: Japanaese (ja)
+  translated by: Hajime Fujimoto
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "{total}枚中{current}枚目",
+	previous: "前",
+	next: "次",
+	close: "閉じる",
+	xhrError: "コンテンツの読み込みに失敗しました",
+	imgError: "画像の読み込みに失敗しました",
+	slideshowStart: "スライドショー開始",
+	slideshowStop: "スライドショー終了"
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-kr.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-kr.js
new file mode 100644
index 00000000..b95702bc
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-kr.js
@@ -0,0 +1,15 @@
+/*
+	jQuery Colorbox language configuration
+	language: Korean (kr)
+	translated by: lunareffect
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "총 {total} 중 {current}",
+	previous: "이전",
+	next: "다음",
+	close: "닫기",
+	xhrError: "컨텐츠를 불러오는 데 실패했습니다.",
+	imgError: "이미지를 불러오는 데 실패했습니다.",
+	slideshowStart: "슬라이드쇼 시작",
+	slideshowStop: "슬라이드쇼 중지"
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-lv.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-lv.js
new file mode 100644
index 00000000..e376366b
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-lv.js
@@ -0,0 +1,16 @@
+/*
+	jQuery Colorbox language configuration
+	language: Latvian (lv)
+	translated by: Matiss Roberts Treinis
+    site: x0.lv
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "attēls {current} no {total}",
+	previous: "iepriekšējais",
+	next: "nākamais",
+	close: "aizvērt",
+	xhrError: "Neizdevās ielādēt saturu.",
+	imgError: "Neizdevās ielādēt attēlu.",
+        slideshowStart: "sākt slaidrādi",
+        slideshowStop: "apturēt slaidrādi"
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-nl.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-nl.js
new file mode 100644
index 00000000..dfc658ec
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-nl.js
@@ -0,0 +1,15 @@
+/*
+	jQuery Colorbox language configuration
+	language: Dutch (nl)
+	translated by: barryvdh
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "Afbeelding {current} van {total}",
+	previous: "Vorige",
+	next: "Volgende",
+	close: "Sluiten",
+	xhrError: "Deze inhoud kan niet geladen worden.",
+	imgError: "Deze afbeelding kan niet geladen worden.",
+	slideshowStart: "Diashow starten",
+	slideshowStop: "Diashow stoppen"
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-no.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-no.js
new file mode 100644
index 00000000..277c5d3f
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-no.js
@@ -0,0 +1,16 @@
+/*
+	jQuery Colorbox language configuration
+	language: Norwegian (no)
+	translated by: lars-erik
+	site: markedspartner.no
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "Bilde {current} av {total}",
+	previous: "Forrige",
+	next: "Neste",
+	close: "Lukk",
+	xhrError: "Feil ved lasting av innhold.",
+	imgError: "Feil ved lasting av bilde.",
+	slideshowStart: "Start lysbildefremvisning",
+	slideshowStop: "Stopp lysbildefremvisning"
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-pl.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-pl.js
new file mode 100644
index 00000000..1c04dae1
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-pl.js
@@ -0,0 +1,16 @@
+/*
+	jQuery Colorbox language configuration
+	language: Polski (pl)
+	translated by: Tomasz Wasiński
+	site: 2bevisible.pl
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "{current}. obrazek z {total}",
+	previous: "Poprzedni",
+	next: "Następny",
+	close: "Zamknij",
+	xhrError: "Nie udało się załadować treści.",
+	imgError: "Nie udało się załadować obrazka.",
+	slideshowStart: "rozpocznij pokaz slajdów",
+	slideshowStop: "zatrzymaj pokaz slajdów"
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-pt-br.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-pt-br.js
new file mode 100644
index 00000000..73e948b7
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-pt-br.js
@@ -0,0 +1,15 @@
+/*
+	jQuery Colorbox language configuration
+	language: Brazilian Portuguese (pt-br)
+	translated by: ReinaldoMT
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "Imagem {current} de {total}",
+	previous: "Anterior",
+	next: "Próxima",
+	close: "Fechar",
+	slideshowStart: "iniciar apresentação de slides",
+	slideshowStop: "parar apresentação de slides",
+	xhrError: "Erro ao carregar o conteúdo.",
+	imgError: "Erro ao carregar a imagem."
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-ro.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-ro.js
new file mode 100644
index 00000000..0a461e28
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-ro.js
@@ -0,0 +1,15 @@
+/*
+  jQuery Colorbox language configuration
+  language: Romanian (ro)
+  translated by: shurub3l
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "imagine {current} din {total}",
+	previous: "precedenta",
+	next: "următoarea",
+	close: "închideți",
+	xhrError: "Acest conținut nu poate fi încărcat.",
+	imgError: "Această imagine nu poate fi încărcată",
+	slideshowStart: "începeți prezentarea (slideshow)",
+	slideshowStop: "opriți prezentarea (slideshow)"
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-ru.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-ru.js
new file mode 100644
index 00000000..1d88b8cd
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-ru.js
@@ -0,0 +1,16 @@
+/*
+	jQuery Colorbox language configuration
+	language: Russian (ru)
+	translated by: Marfa
+	site: themarfa.name
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "изображение {current} из {total}",
+	previous: "назад",
+	next: "вперёд",
+	close: "закрыть",
+	xhrError: "Не удалось загрузить содержимое.",
+	imgError: "Не удалось загрузить изображение.",
+	slideshowStart: "начать слайд-шоу",
+	slideshowStop: "остановить слайд-шоу"
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-si.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-si.js
new file mode 100644
index 00000000..034b5b3c
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-si.js
@@ -0,0 +1,15 @@
+/*
+	jQuery Colorbox language configuration
+	language: Slovenian (si)
+	translated by: Boštjan Pišler (pisler.si)
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "Slika {current} od {total}",
+	previous: "Prejšnja",
+	next: "Naslednja",
+	close: "Zapri",
+	xhrError: "Vsebine ni bilo mogoče naložiti.",
+	imgError: "Slike ni bilo mogoče naložiti.",
+	slideshowStart: "Zaženi prezentacijo",
+	slideshowStop: "Zaustavi prezentacijo"
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-sk.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-sk.js
new file mode 100644
index 00000000..faa9291c
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-sk.js
@@ -0,0 +1,15 @@
+/*
+	jQuery Colorbox language configuration
+	language: Slovak (sk)
+	translated by: Jaroslav Kostal
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "{current}. obrázok z {total}",
+	previous: "Predchádzajúci",
+	next: "Následujúci",
+	close: "Zatvoriť",
+	xhrError: "Obsah sa nepodarilo načítať.",
+	imgError: "Obrázok sa nepodarilo načítať.",
+	slideshowStart: "Spustiť slideshow",
+	slideshowStop: "zastaviť slideshow"
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-sv.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-sv.js
new file mode 100644
index 00000000..01bb1d8c
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-sv.js
@@ -0,0 +1,15 @@
+/*
+	jQuery Colorbox language configuration
+	language: Swedish (sv)
+	translated by: Mattias Reichel
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "Bild {current} av {total}",
+	previous: "Föregående",
+	next: "Nästa",
+	close: "Stäng",
+	xhrError: "Innehållet kunde inte laddas.",
+	imgError: "Den här bilden kunde inte laddas.",
+	slideshowStart: "Starta bildspel",
+	slideshowStop: "Stoppa bildspel"
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-tr.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-tr.js
new file mode 100644
index 00000000..d467c2ef
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-tr.js
@@ -0,0 +1,19 @@
+/*
+	jQuery Colorbox language configuration
+	language: Turkish (tr)
+	translated by: Caner ÖNCEL
+	site: egonomik.com
+	
+	edited by: Sinan Eldem
+	www.sinaneldem.com.tr
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+  current: "Görsel {current} / {total}",
+  previous: "Önceki",
+  next: "Sonraki",
+  close: "Kapat",
+  xhrError: "İçerik yüklenirken hata meydana geldi.",
+  imgError: "Resim yüklenirken hata meydana geldi.",
+  slideshowStart: "Slaytı Başlat",
+  slideshowStop: "Slaytı Durdur"
+});
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-uk.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-uk.js
new file mode 100644
index 00000000..3f786d3f
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-uk.js
@@ -0,0 +1,16 @@
+/*
+    jQuery ColorBox language configuration
+    language: Ukrainian (uk)
+    translated by: Andrew
+    http://acisoftware.com.ua
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+    current: "зображення {current} з {total}",
+    previous: "попереднє",
+    next: "наступне",
+    close: "закрити",
+    xhrError: "Не вдалося завантажити вміст.",
+    imgError: "Не вдалося завантажити зображення.",
+    slideshowStart: "почати слайд-шоу",
+    slideshowStop: "зупинити слайд-шоу"
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-zh-CN.js b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-zh-CN.js
new file mode 100644
index 00000000..770d8eac
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/i18n/jquery.colorbox-zh-CN.js
@@ -0,0 +1,15 @@
+/*
+	jQuery Colorbox language configuration
+	language: Chinese Simplified (zh-CN)
+	translated by: zhao weiming
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+	current: "当前图像 {current} 总共 {total}",
+	previous: "前一页",
+	next: "后一页",
+	close: "关闭",
+	xhrError: "此内容无法加载",
+	imgError: "此图片无法加载",
+	slideshowStart: "开始播放幻灯片",
+	slideshowStop: "停止播放幻灯片"
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/jquery.colorbox-min.js b/htmltest/sites/all/libraries/colorbox-version/jquery.colorbox-min.js
new file mode 100644
index 00000000..3f27d3d4
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/jquery.colorbox-min.js
@@ -0,0 +1,7 @@
+/*!
+	Colorbox v1.4.31 - 2013-09-25
+	jQuery lightbox and modal window plugin
+	(c) 2013 Jack Moore - http://www.jacklmoore.com/colorbox
+	license: http://www.opensource.org/licenses/mit-license.php
+*/
+(function(e,t,i){function o(i,o,n){var r=t.createElement(i);return o&&(r.id=Z+o),n&&(r.style.cssText=n),e(r)}function n(){return i.innerHeight?i.innerHeight:e(i).height()}function r(e){var t=k.length,i=(z+e)%t;return 0>i?t+i:i}function h(e,t){return Math.round((/%/.test(e)?("x"===t?E.width():n())/100:1)*parseInt(e,10))}function s(e,t){return e.photo||e.photoRegex.test(t)}function l(e,t){return e.retinaUrl&&i.devicePixelRatio>1?t.replace(e.photoRegex,e.retinaSuffix):t}function a(e){"contains"in g[0]&&!g[0].contains(e.target)&&(e.stopPropagation(),g.focus())}function d(){var t,i=e.data(N,Y);null==i?(B=e.extend({},X),console&&console.log&&console.log("Error: cboxElement missing settings object")):B=e.extend({},i);for(t in B)e.isFunction(B[t])&&"on"!==t.slice(0,2)&&(B[t]=B[t].call(N));B.rel=B.rel||N.rel||e(N).data("rel")||"nofollow",B.href=B.href||e(N).attr("href"),B.title=B.title||N.title,"string"==typeof B.href&&(B.href=e.trim(B.href))}function c(i,o){e(t).trigger(i),st.trigger(i),e.isFunction(o)&&o.call(N)}function u(i){q||(N=i,d(),k=e(N),z=0,"nofollow"!==B.rel&&(k=e("."+et).filter(function(){var t,i=e.data(this,Y);return i&&(t=e(this).data("rel")||i.rel||this.rel),t===B.rel}),z=k.index(N),-1===z&&(k=k.add(N),z=k.length-1)),w.css({opacity:parseFloat(B.opacity),cursor:B.overlayClose?"pointer":"auto",visibility:"visible"}).show(),J&&g.add(w).removeClass(J),B.className&&g.add(w).addClass(B.className),J=B.className,B.closeButton?K.html(B.close).appendTo(y):K.appendTo("<div/>"),U||(U=$=!0,g.css({visibility:"hidden",display:"block"}),H=o(lt,"LoadedContent","width:0; height:0; overflow:hidden"),y.css({width:"",height:""}).append(H),O=x.height()+C.height()+y.outerHeight(!0)-y.height(),_=b.width()+T.width()+y.outerWidth(!0)-y.width(),D=H.outerHeight(!0),A=H.outerWidth(!0),B.w=h(B.initialWidth,"x"),B.h=h(B.initialHeight,"y"),H.css({width:"",height:B.h}),Q.position(),c(tt,B.onOpen),P.add(L).hide(),g.focus(),B.trapFocus&&t.addEventListener&&(t.addEventListener("focus",a,!0),st.one(rt,function(){t.removeEventListener("focus",a,!0)})),B.returnFocus&&st.one(rt,function(){e(N).focus()})),m())}function f(){!g&&t.body&&(V=!1,E=e(i),g=o(lt).attr({id:Y,"class":e.support.opacity===!1?Z+"IE":"",role:"dialog",tabindex:"-1"}).hide(),w=o(lt,"Overlay").hide(),F=e([o(lt,"LoadingOverlay")[0],o(lt,"LoadingGraphic")[0]]),v=o(lt,"Wrapper"),y=o(lt,"Content").append(L=o(lt,"Title"),S=o(lt,"Current"),I=e('<button type="button"/>').attr({id:Z+"Previous"}),R=e('<button type="button"/>').attr({id:Z+"Next"}),M=o("button","Slideshow"),F),K=e('<button type="button"/>').attr({id:Z+"Close"}),v.append(o(lt).append(o(lt,"TopLeft"),x=o(lt,"TopCenter"),o(lt,"TopRight")),o(lt,!1,"clear:left").append(b=o(lt,"MiddleLeft"),y,T=o(lt,"MiddleRight")),o(lt,!1,"clear:left").append(o(lt,"BottomLeft"),C=o(lt,"BottomCenter"),o(lt,"BottomRight"))).find("div div").css({"float":"left"}),W=o(lt,!1,"position:absolute; width:9999px; visibility:hidden; display:none"),P=R.add(I).add(S).add(M),e(t.body).append(w,g.append(v,W)))}function p(){function i(e){e.which>1||e.shiftKey||e.altKey||e.metaKey||e.ctrlKey||(e.preventDefault(),u(this))}return g?(V||(V=!0,R.click(function(){Q.next()}),I.click(function(){Q.prev()}),K.click(function(){Q.close()}),w.click(function(){B.overlayClose&&Q.close()}),e(t).bind("keydown."+Z,function(e){var t=e.keyCode;U&&B.escKey&&27===t&&(e.preventDefault(),Q.close()),U&&B.arrowKey&&k[1]&&!e.altKey&&(37===t?(e.preventDefault(),I.click()):39===t&&(e.preventDefault(),R.click()))}),e.isFunction(e.fn.on)?e(t).on("click."+Z,"."+et,i):e("."+et).live("click."+Z,i)),!0):!1}function m(){var n,r,a,u=Q.prep,f=++at;$=!0,j=!1,N=k[z],d(),c(ht),c(it,B.onLoad),B.h=B.height?h(B.height,"y")-D-O:B.innerHeight&&h(B.innerHeight,"y"),B.w=B.width?h(B.width,"x")-A-_:B.innerWidth&&h(B.innerWidth,"x"),B.mw=B.w,B.mh=B.h,B.maxWidth&&(B.mw=h(B.maxWidth,"x")-A-_,B.mw=B.w&&B.w<B.mw?B.w:B.mw),B.maxHeight&&(B.mh=h(B.maxHeight,"y")-D-O,B.mh=B.h&&B.h<B.mh?B.h:B.mh),n=B.href,G=setTimeout(function(){F.show()},100),B.inline?(a=o(lt).hide().insertBefore(e(n)[0]),st.one(ht,function(){a.replaceWith(H.children())}),u(e(n))):B.iframe?u(" "):B.html?u(B.html):s(B,n)?(n=l(B,n),j=t.createElement("img"),e(j).addClass(Z+"Photo").bind("error",function(){B.title=!1,u(o(lt,"Error").html(B.imgError))}).one("load",function(){var t;f===at&&(e.each(["alt","longdesc","aria-describedby"],function(t,i){var o=e(N).attr(i)||e(N).attr("data-"+i);o&&j.setAttribute(i,o)}),B.retinaImage&&i.devicePixelRatio>1&&(j.height=j.height/i.devicePixelRatio,j.width=j.width/i.devicePixelRatio),B.scalePhotos&&(r=function(){j.height-=j.height*t,j.width-=j.width*t},B.mw&&j.width>B.mw&&(t=(j.width-B.mw)/j.width,r()),B.mh&&j.height>B.mh&&(t=(j.height-B.mh)/j.height,r())),B.h&&(j.style.marginTop=Math.max(B.mh-j.height,0)/2+"px"),k[1]&&(B.loop||k[z+1])&&(j.style.cursor="pointer",j.onclick=function(){Q.next()}),j.style.width=j.width+"px",j.style.height=j.height+"px",setTimeout(function(){u(j)},1))}),setTimeout(function(){j.src=n},1)):n&&W.load(n,B.data,function(t,i){f===at&&u("error"===i?o(lt,"Error").html(B.xhrError):e(this).contents())})}var w,g,v,y,x,b,T,C,k,E,H,W,F,L,S,M,R,I,K,P,B,O,_,D,A,N,z,j,U,$,q,G,Q,J,V,X={html:!1,photo:!1,iframe:!1,inline:!1,transition:"elastic",speed:300,fadeOut:300,width:!1,initialWidth:"600",innerWidth:!1,maxWidth:!1,height:!1,initialHeight:"450",innerHeight:!1,maxHeight:!1,scalePhotos:!0,scrolling:!0,href:!1,title:!1,rel:!1,opacity:.9,preloading:!0,className:!1,overlayClose:!0,escKey:!0,arrowKey:!0,top:!1,bottom:!1,left:!1,right:!1,fixed:!1,data:void 0,closeButton:!0,fastIframe:!0,open:!1,reposition:!0,loop:!0,slideshow:!1,slideshowAuto:!0,slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",photoRegex:/\.(gif|png|jp(e|g|eg)|bmp|ico|webp)((#|\?).*)?$/i,retinaImage:!1,retinaUrl:!1,retinaSuffix:"@2x.$1",current:"image {current} of {total}",previous:"previous",next:"next",close:"close",xhrError:"This content failed to load.",imgError:"This image failed to load.",returnFocus:!0,trapFocus:!0,onOpen:!1,onLoad:!1,onComplete:!1,onCleanup:!1,onClosed:!1},Y="colorbox",Z="cbox",et=Z+"Element",tt=Z+"_open",it=Z+"_load",ot=Z+"_complete",nt=Z+"_cleanup",rt=Z+"_closed",ht=Z+"_purge",st=e("<a/>"),lt="div",at=0,dt={},ct=function(){function e(){clearTimeout(h)}function t(){(B.loop||k[z+1])&&(e(),h=setTimeout(Q.next,B.slideshowSpeed))}function i(){M.html(B.slideshowStop).unbind(l).one(l,o),st.bind(ot,t).bind(it,e),g.removeClass(s+"off").addClass(s+"on")}function o(){e(),st.unbind(ot,t).unbind(it,e),M.html(B.slideshowStart).unbind(l).one(l,function(){Q.next(),i()}),g.removeClass(s+"on").addClass(s+"off")}function n(){r=!1,M.hide(),e(),st.unbind(ot,t).unbind(it,e),g.removeClass(s+"off "+s+"on")}var r,h,s=Z+"Slideshow_",l="click."+Z;return function(){r?B.slideshow||(st.unbind(nt,n),n()):B.slideshow&&k[1]&&(r=!0,st.one(nt,n),B.slideshowAuto?i():o(),M.show())}}();e.colorbox||(e(f),Q=e.fn[Y]=e[Y]=function(t,i){var o=this;if(t=t||{},f(),p()){if(e.isFunction(o))o=e("<a/>"),t.open=!0;else if(!o[0])return o;i&&(t.onComplete=i),o.each(function(){e.data(this,Y,e.extend({},e.data(this,Y)||X,t))}).addClass(et),(e.isFunction(t.open)&&t.open.call(o)||t.open)&&u(o[0])}return o},Q.position=function(t,i){function o(){x[0].style.width=C[0].style.width=y[0].style.width=parseInt(g[0].style.width,10)-_+"px",y[0].style.height=b[0].style.height=T[0].style.height=parseInt(g[0].style.height,10)-O+"px"}var r,s,l,a=0,d=0,c=g.offset();if(E.unbind("resize."+Z),g.css({top:-9e4,left:-9e4}),s=E.scrollTop(),l=E.scrollLeft(),B.fixed?(c.top-=s,c.left-=l,g.css({position:"fixed"})):(a=s,d=l,g.css({position:"absolute"})),d+=B.right!==!1?Math.max(E.width()-B.w-A-_-h(B.right,"x"),0):B.left!==!1?h(B.left,"x"):Math.round(Math.max(E.width()-B.w-A-_,0)/2),a+=B.bottom!==!1?Math.max(n()-B.h-D-O-h(B.bottom,"y"),0):B.top!==!1?h(B.top,"y"):Math.round(Math.max(n()-B.h-D-O,0)/2),g.css({top:c.top,left:c.left,visibility:"visible"}),v[0].style.width=v[0].style.height="9999px",r={width:B.w+A+_,height:B.h+D+O,top:a,left:d},t){var u=0;e.each(r,function(e){return r[e]!==dt[e]?(u=t,void 0):void 0}),t=u}dt=r,t||g.css(r),g.dequeue().animate(r,{duration:t||0,complete:function(){o(),$=!1,v[0].style.width=B.w+A+_+"px",v[0].style.height=B.h+D+O+"px",B.reposition&&setTimeout(function(){E.bind("resize."+Z,Q.position)},1),i&&i()},step:o})},Q.resize=function(e){var t;U&&(e=e||{},e.width&&(B.w=h(e.width,"x")-A-_),e.innerWidth&&(B.w=h(e.innerWidth,"x")),H.css({width:B.w}),e.height&&(B.h=h(e.height,"y")-D-O),e.innerHeight&&(B.h=h(e.innerHeight,"y")),e.innerHeight||e.height||(t=H.scrollTop(),H.css({height:"auto"}),B.h=H.height()),H.css({height:B.h}),t&&H.scrollTop(t),Q.position("none"===B.transition?0:B.speed))},Q.prep=function(i){function n(){return B.w=B.w||H.width(),B.w=B.mw&&B.mw<B.w?B.mw:B.w,B.w}function h(){return B.h=B.h||H.height(),B.h=B.mh&&B.mh<B.h?B.mh:B.h,B.h}if(U){var a,d="none"===B.transition?0:B.speed;H.empty().remove(),H=o(lt,"LoadedContent").append(i),H.hide().appendTo(W.show()).css({width:n(),overflow:B.scrolling?"auto":"hidden"}).css({height:h()}).prependTo(y),W.hide(),e(j).css({"float":"none"}),a=function(){function i(){e.support.opacity===!1&&g[0].style.removeAttribute("filter")}var n,h,a=k.length,u="frameBorder",f="allowTransparency";U&&(h=function(){clearTimeout(G),F.hide(),c(ot,B.onComplete)},L.html(B.title).add(H).show(),a>1?("string"==typeof B.current&&S.html(B.current.replace("{current}",z+1).replace("{total}",a)).show(),R[B.loop||a-1>z?"show":"hide"]().html(B.next),I[B.loop||z?"show":"hide"]().html(B.previous),ct(),B.preloading&&e.each([r(-1),r(1)],function(){var i,o,n=k[this],r=e.data(n,Y);r&&r.href?(i=r.href,e.isFunction(i)&&(i=i.call(n))):i=e(n).attr("href"),i&&s(r,i)&&(i=l(r,i),o=t.createElement("img"),o.src=i)})):P.hide(),B.iframe?(n=o("iframe")[0],u in n&&(n[u]=0),f in n&&(n[f]="true"),B.scrolling||(n.scrolling="no"),e(n).attr({src:B.href,name:(new Date).getTime(),"class":Z+"Iframe",allowFullScreen:!0,webkitAllowFullScreen:!0,mozallowfullscreen:!0}).one("load",h).appendTo(H),st.one(ht,function(){n.src="//about:blank"}),B.fastIframe&&e(n).trigger("load")):h(),"fade"===B.transition?g.fadeTo(d,1,i):i())},"fade"===B.transition?g.fadeTo(d,0,function(){Q.position(0,a)}):Q.position(d,a)}},Q.next=function(){!$&&k[1]&&(B.loop||k[z+1])&&(z=r(1),u(k[z]))},Q.prev=function(){!$&&k[1]&&(B.loop||z)&&(z=r(-1),u(k[z]))},Q.close=function(){U&&!q&&(q=!0,U=!1,c(nt,B.onCleanup),E.unbind("."+Z),w.fadeTo(B.fadeOut||0,0),g.stop().fadeTo(B.fadeOut||0,0,function(){g.add(w).css({opacity:1,cursor:"auto"}).hide(),c(ht),H.empty().remove(),setTimeout(function(){q=!1,c(rt,B.onClosed)},1)}))},Q.remove=function(){g&&(g.stop(),e.colorbox.close(),g.stop().remove(),w.remove(),q=!1,g=null,e("."+et).removeData(Y).removeClass(et),e(t).unbind("click."+Z))},Q.element=function(){return e(N)},Q.settings=X)})(jQuery,document,window);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/colorbox-version/jquery.colorbox.js b/htmltest/sites/all/libraries/colorbox-version/jquery.colorbox.js
new file mode 100644
index 00000000..ec6b9d7a
--- /dev/null
+++ b/htmltest/sites/all/libraries/colorbox-version/jquery.colorbox.js
@@ -0,0 +1,1084 @@
+/*!
+	Colorbox v1.4.31 - 2013-09-25
+	jQuery lightbox and modal window plugin
+	(c) 2013 Jack Moore - http://www.jacklmoore.com/colorbox
+	license: http://www.opensource.org/licenses/mit-license.php
+*/
+(function ($, document, window) {
+	var
+	// Default settings object.
+	// See http://jacklmoore.com/colorbox for details.
+	defaults = {
+		// data sources
+		html: false,
+		photo: false,
+		iframe: false,
+		inline: false,
+
+		// behavior and appearance
+		transition: "elastic",
+		speed: 300,
+		fadeOut: 300,
+		width: false,
+		initialWidth: "600",
+		innerWidth: false,
+		maxWidth: false,
+		height: false,
+		initialHeight: "450",
+		innerHeight: false,
+		maxHeight: false,
+		scalePhotos: true,
+		scrolling: true,
+		href: false,
+		title: false,
+		rel: false,
+		opacity: 0.9,
+		preloading: true,
+		className: false,
+		overlayClose: true,
+		escKey: true,
+		arrowKey: true,
+		top: false,
+		bottom: false,
+		left: false,
+		right: false,
+		fixed: false,
+		data: undefined,
+		closeButton: true,
+		fastIframe: true,
+		open: false,
+		reposition: true,
+		loop: true,
+		slideshow: false,
+		slideshowAuto: true,
+		slideshowSpeed: 2500,
+		slideshowStart: "start slideshow",
+		slideshowStop: "stop slideshow",
+		photoRegex: /\.(gif|png|jp(e|g|eg)|bmp|ico|webp)((#|\?).*)?$/i,
+
+		// alternate image paths for high-res displays
+		retinaImage: false,
+		retinaUrl: false,
+		retinaSuffix: '@2x.$1',
+
+		// internationalization
+		current: "image {current} of {total}",
+		previous: "previous",
+		next: "next",
+		close: "close",
+		xhrError: "This content failed to load.",
+		imgError: "This image failed to load.",
+
+		// accessbility
+		returnFocus: true,
+		trapFocus: true,
+
+		// callbacks
+		onOpen: false,
+		onLoad: false,
+		onComplete: false,
+		onCleanup: false,
+		onClosed: false
+	},
+	
+	// Abstracting the HTML and event identifiers for easy rebranding
+	colorbox = 'colorbox',
+	prefix = 'cbox',
+	boxElement = prefix + 'Element',
+	
+	// Events
+	event_open = prefix + '_open',
+	event_load = prefix + '_load',
+	event_complete = prefix + '_complete',
+	event_cleanup = prefix + '_cleanup',
+	event_closed = prefix + '_closed',
+	event_purge = prefix + '_purge',
+
+	// Cached jQuery Object Variables
+	$overlay,
+	$box,
+	$wrap,
+	$content,
+	$topBorder,
+	$leftBorder,
+	$rightBorder,
+	$bottomBorder,
+	$related,
+	$window,
+	$loaded,
+	$loadingBay,
+	$loadingOverlay,
+	$title,
+	$current,
+	$slideshow,
+	$next,
+	$prev,
+	$close,
+	$groupControls,
+	$events = $('<a/>'),
+	
+	// Variables for cached values or use across multiple functions
+	settings,
+	interfaceHeight,
+	interfaceWidth,
+	loadedHeight,
+	loadedWidth,
+	element,
+	index,
+	photo,
+	open,
+	active,
+	closing,
+	loadingTimer,
+	publicMethod,
+	div = "div",
+	className,
+	requests = 0,
+	previousCSS = {},
+	init;
+
+	// ****************
+	// HELPER FUNCTIONS
+	// ****************
+	
+	// Convenience function for creating new jQuery objects
+	function $tag(tag, id, css) {
+		var element = document.createElement(tag);
+
+		if (id) {
+			element.id = prefix + id;
+		}
+
+		if (css) {
+			element.style.cssText = css;
+		}
+
+		return $(element);
+	}
+	
+	// Get the window height using innerHeight when available to avoid an issue with iOS
+	// http://bugs.jquery.com/ticket/6724
+	function winheight() {
+		return window.innerHeight ? window.innerHeight : $(window).height();
+	}
+
+	// Determine the next and previous members in a group.
+	function getIndex(increment) {
+		var
+		max = $related.length,
+		newIndex = (index + increment) % max;
+		
+		return (newIndex < 0) ? max + newIndex : newIndex;
+	}
+
+	// Convert '%' and 'px' values to integers
+	function setSize(size, dimension) {
+		return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : winheight()) / 100) : 1) * parseInt(size, 10));
+	}
+	
+	// Checks an href to see if it is a photo.
+	// There is a force photo option (photo: true) for hrefs that cannot be matched by the regex.
+	function isImage(settings, url) {
+		return settings.photo || settings.photoRegex.test(url);
+	}
+
+	function retinaUrl(settings, url) {
+		return settings.retinaUrl && window.devicePixelRatio > 1 ? url.replace(settings.photoRegex, settings.retinaSuffix) : url;
+	}
+
+	function trapFocus(e) {
+		if ('contains' in $box[0] && !$box[0].contains(e.target)) {
+			e.stopPropagation();
+			$box.focus();
+		}
+	}
+
+	// Assigns function results to their respective properties
+	function makeSettings() {
+		var i,
+			data = $.data(element, colorbox);
+		
+		if (data == null) {
+			settings = $.extend({}, defaults);
+			if (console && console.log) {
+				console.log('Error: cboxElement missing settings object');
+			}
+		} else {
+			settings = $.extend({}, data);
+		}
+		
+		for (i in settings) {
+			if ($.isFunction(settings[i]) && i.slice(0, 2) !== 'on') { // checks to make sure the function isn't one of the callbacks, they will be handled at the appropriate time.
+				settings[i] = settings[i].call(element);
+			}
+		}
+		
+		settings.rel = settings.rel || element.rel || $(element).data('rel') || 'nofollow';
+		settings.href = settings.href || $(element).attr('href');
+		settings.title = settings.title || element.title;
+		
+		if (typeof settings.href === "string") {
+			settings.href = $.trim(settings.href);
+		}
+	}
+
+	function trigger(event, callback) {
+		// for external use
+		$(document).trigger(event);
+
+		// for internal use
+		$events.trigger(event);
+
+		if ($.isFunction(callback)) {
+			callback.call(element);
+		}
+	}
+
+
+	var slideshow = (function(){
+		var active,
+			className = prefix + "Slideshow_",
+			click = "click." + prefix,
+			timeOut;
+
+		function clear () {
+			clearTimeout(timeOut);
+		}
+
+		function set() {
+			if (settings.loop || $related[index + 1]) {
+				clear();
+				timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed);
+			}
+		}
+
+		function start() {
+			$slideshow
+				.html(settings.slideshowStop)
+				.unbind(click)
+				.one(click, stop);
+
+			$events
+				.bind(event_complete, set)
+				.bind(event_load, clear);
+
+			$box.removeClass(className + "off").addClass(className + "on");
+		}
+
+		function stop() {
+			clear();
+			
+			$events
+				.unbind(event_complete, set)
+				.unbind(event_load, clear);
+
+			$slideshow
+				.html(settings.slideshowStart)
+				.unbind(click)
+				.one(click, function () {
+					publicMethod.next();
+					start();
+				});
+
+			$box.removeClass(className + "on").addClass(className + "off");
+		}
+
+		function reset() {
+			active = false;
+			$slideshow.hide();
+			clear();
+			$events
+				.unbind(event_complete, set)
+				.unbind(event_load, clear);
+			$box.removeClass(className + "off " + className + "on");
+		}
+
+		return function(){
+			if (active) {
+				if (!settings.slideshow) {
+					$events.unbind(event_cleanup, reset);
+					reset();
+				}
+			} else {
+				if (settings.slideshow && $related[1]) {
+					active = true;
+					$events.one(event_cleanup, reset);
+					if (settings.slideshowAuto) {
+						start();
+					} else {
+						stop();
+					}
+					$slideshow.show();
+				}
+			}
+		};
+
+	}());
+
+
+	function launch(target) {
+		if (!closing) {
+			
+			element = target;
+			
+			makeSettings();
+			
+			$related = $(element);
+			
+			index = 0;
+			
+			if (settings.rel !== 'nofollow') {
+				$related = $('.' + boxElement).filter(function () {
+					var data = $.data(this, colorbox),
+						relRelated;
+
+					if (data) {
+						relRelated =  $(this).data('rel') || data.rel || this.rel;
+					}
+					
+					return (relRelated === settings.rel);
+				});
+				index = $related.index(element);
+				
+				// Check direct calls to Colorbox.
+				if (index === -1) {
+					$related = $related.add(element);
+					index = $related.length - 1;
+				}
+			}
+			
+			$overlay.css({
+				opacity: parseFloat(settings.opacity),
+				cursor: settings.overlayClose ? "pointer" : "auto",
+				visibility: 'visible'
+			}).show();
+			
+
+			if (className) {
+				$box.add($overlay).removeClass(className);
+			}
+			if (settings.className) {
+				$box.add($overlay).addClass(settings.className);
+			}
+			className = settings.className;
+
+			if (settings.closeButton) {
+				$close.html(settings.close).appendTo($content);
+			} else {
+				$close.appendTo('<div/>');
+			}
+
+			if (!open) {
+				open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys.
+				
+				// Show colorbox so the sizes can be calculated in older versions of jQuery
+				$box.css({visibility:'hidden', display:'block'});
+				
+				$loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden');
+				$content.css({width:'', height:''}).append($loaded);
+
+				// Cache values needed for size calculations
+				interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();
+				interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width();
+				loadedHeight = $loaded.outerHeight(true);
+				loadedWidth = $loaded.outerWidth(true);
+
+				// Opens inital empty Colorbox prior to content being loaded.
+				settings.w = setSize(settings.initialWidth, 'x');
+				settings.h = setSize(settings.initialHeight, 'y');
+				$loaded.css({width:'', height:settings.h});
+				publicMethod.position();
+
+				trigger(event_open, settings.onOpen);
+				
+				$groupControls.add($title).hide();
+
+				$box.focus();
+				
+				if (settings.trapFocus) {
+					// Confine focus to the modal
+					// Uses event capturing that is not supported in IE8-
+					if (document.addEventListener) {
+
+						document.addEventListener('focus', trapFocus, true);
+						
+						$events.one(event_closed, function () {
+							document.removeEventListener('focus', trapFocus, true);
+						});
+					}
+				}
+
+				// Return focus on closing
+				if (settings.returnFocus) {
+					$events.one(event_closed, function () {
+						$(element).focus();
+					});
+				}
+			}
+			load();
+		}
+	}
+
+	// Colorbox's markup needs to be added to the DOM prior to being called
+	// so that the browser will go ahead and load the CSS background images.
+	function appendHTML() {
+		if (!$box && document.body) {
+			init = false;
+			$window = $(window);
+			$box = $tag(div).attr({
+				id: colorbox,
+				'class': $.support.opacity === false ? prefix + 'IE' : '', // class for optional IE8 & lower targeted CSS.
+				role: 'dialog',
+				tabindex: '-1'
+			}).hide();
+			$overlay = $tag(div, "Overlay").hide();
+			$loadingOverlay = $([$tag(div, "LoadingOverlay")[0],$tag(div, "LoadingGraphic")[0]]);
+			$wrap = $tag(div, "Wrapper");
+			$content = $tag(div, "Content").append(
+				$title = $tag(div, "Title"),
+				$current = $tag(div, "Current"),
+				$prev = $('<button type="button"/>').attr({id:prefix+'Previous'}),
+				$next = $('<button type="button"/>').attr({id:prefix+'Next'}),
+				$slideshow = $tag('button', "Slideshow"),
+				$loadingOverlay
+			);
+
+			$close = $('<button type="button"/>').attr({id:prefix+'Close'});
+			
+			$wrap.append( // The 3x3 Grid that makes up Colorbox
+				$tag(div).append(
+					$tag(div, "TopLeft"),
+					$topBorder = $tag(div, "TopCenter"),
+					$tag(div, "TopRight")
+				),
+				$tag(div, false, 'clear:left').append(
+					$leftBorder = $tag(div, "MiddleLeft"),
+					$content,
+					$rightBorder = $tag(div, "MiddleRight")
+				),
+				$tag(div, false, 'clear:left').append(
+					$tag(div, "BottomLeft"),
+					$bottomBorder = $tag(div, "BottomCenter"),
+					$tag(div, "BottomRight")
+				)
+			).find('div div').css({'float': 'left'});
+			
+			$loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none');
+			
+			$groupControls = $next.add($prev).add($current).add($slideshow);
+
+			$(document.body).append($overlay, $box.append($wrap, $loadingBay));
+		}
+	}
+
+	// Add Colorbox's event bindings
+	function addBindings() {
+		function clickHandler(e) {
+			// ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt.
+			// See: http://jacklmoore.com/notes/click-events/
+			if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey || e.ctrlKey)) {
+				e.preventDefault();
+				launch(this);
+			}
+		}
+
+		if ($box) {
+			if (!init) {
+				init = true;
+
+				// Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly.
+				$next.click(function () {
+					publicMethod.next();
+				});
+				$prev.click(function () {
+					publicMethod.prev();
+				});
+				$close.click(function () {
+					publicMethod.close();
+				});
+				$overlay.click(function () {
+					if (settings.overlayClose) {
+						publicMethod.close();
+					}
+				});
+				
+				// Key Bindings
+				$(document).bind('keydown.' + prefix, function (e) {
+					var key = e.keyCode;
+					if (open && settings.escKey && key === 27) {
+						e.preventDefault();
+						publicMethod.close();
+					}
+					if (open && settings.arrowKey && $related[1] && !e.altKey) {
+						if (key === 37) {
+							e.preventDefault();
+							$prev.click();
+						} else if (key === 39) {
+							e.preventDefault();
+							$next.click();
+						}
+					}
+				});
+
+				if ($.isFunction($.fn.on)) {
+					// For jQuery 1.7+
+					$(document).on('click.'+prefix, '.'+boxElement, clickHandler);
+				} else {
+					// For jQuery 1.3.x -> 1.6.x
+					// This code is never reached in jQuery 1.9, so do not contact me about 'live' being removed.
+					// This is not here for jQuery 1.9, it's here for legacy users.
+					$('.'+boxElement).live('click.'+prefix, clickHandler);
+				}
+			}
+			return true;
+		}
+		return false;
+	}
+
+	// Don't do anything if Colorbox already exists.
+	if ($.colorbox) {
+		return;
+	}
+
+	// Append the HTML when the DOM loads
+	$(appendHTML);
+
+
+	// ****************
+	// PUBLIC FUNCTIONS
+	// Usage format: $.colorbox.close();
+	// Usage from within an iframe: parent.jQuery.colorbox.close();
+	// ****************
+	
+	publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) {
+		var $this = this;
+		
+		options = options || {};
+		
+		appendHTML();
+
+		if (addBindings()) {
+			if ($.isFunction($this)) { // assume a call to $.colorbox
+				$this = $('<a/>');
+				options.open = true;
+			} else if (!$this[0]) { // colorbox being applied to empty collection
+				return $this;
+			}
+			
+			if (callback) {
+				options.onComplete = callback;
+			}
+			
+			$this.each(function () {
+				$.data(this, colorbox, $.extend({}, $.data(this, colorbox) || defaults, options));
+			}).addClass(boxElement);
+			
+			if (($.isFunction(options.open) && options.open.call($this)) || options.open) {
+				launch($this[0]);
+			}
+		}
+		
+		return $this;
+	};
+
+	publicMethod.position = function (speed, loadedCallback) {
+		var
+		css,
+		top = 0,
+		left = 0,
+		offset = $box.offset(),
+		scrollTop,
+		scrollLeft;
+		
+		$window.unbind('resize.' + prefix);
+
+		// remove the modal so that it doesn't influence the document width/height
+		$box.css({top: -9e4, left: -9e4});
+
+		scrollTop = $window.scrollTop();
+		scrollLeft = $window.scrollLeft();
+
+		if (settings.fixed) {
+			offset.top -= scrollTop;
+			offset.left -= scrollLeft;
+			$box.css({position: 'fixed'});
+		} else {
+			top = scrollTop;
+			left = scrollLeft;
+			$box.css({position: 'absolute'});
+		}
+
+		// keeps the top and left positions within the browser's viewport.
+		if (settings.right !== false) {
+			left += Math.max($window.width() - settings.w - loadedWidth - interfaceWidth - setSize(settings.right, 'x'), 0);
+		} else if (settings.left !== false) {
+			left += setSize(settings.left, 'x');
+		} else {
+			left += Math.round(Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2);
+		}
+		
+		if (settings.bottom !== false) {
+			top += Math.max(winheight() - settings.h - loadedHeight - interfaceHeight - setSize(settings.bottom, 'y'), 0);
+		} else if (settings.top !== false) {
+			top += setSize(settings.top, 'y');
+		} else {
+			top += Math.round(Math.max(winheight() - settings.h - loadedHeight - interfaceHeight, 0) / 2);
+		}
+
+		$box.css({top: offset.top, left: offset.left, visibility:'visible'});
+		
+		// this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly,
+		// but it has to be shrank down around the size of div#colorbox when it's done.  If not,
+		// it can invoke an obscure IE bug when using iframes.
+		$wrap[0].style.width = $wrap[0].style.height = "9999px";
+		
+		function modalDimensions() {
+			$topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = (parseInt($box[0].style.width,10) - interfaceWidth)+'px';
+			$content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = (parseInt($box[0].style.height,10) - interfaceHeight)+'px';
+		}
+
+		css = {width: settings.w + loadedWidth + interfaceWidth, height: settings.h + loadedHeight + interfaceHeight, top: top, left: left};
+
+		// setting the speed to 0 if the content hasn't changed size or position
+		if (speed) {
+			var tempSpeed = 0;
+			$.each(css, function(i){
+				if (css[i] !== previousCSS[i]) {
+					tempSpeed = speed;
+					return;
+				}
+			});
+			speed = tempSpeed;
+		}
+
+		previousCSS = css;
+
+		if (!speed) {
+			$box.css(css);
+		}
+
+		$box.dequeue().animate(css, {
+			duration: speed || 0,
+			complete: function () {
+				modalDimensions();
+				
+				active = false;
+				
+				// shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation.
+				$wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px";
+				$wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px";
+				
+				if (settings.reposition) {
+					setTimeout(function () {  // small delay before binding onresize due to an IE8 bug.
+						$window.bind('resize.' + prefix, publicMethod.position);
+					}, 1);
+				}
+
+				if (loadedCallback) {
+					loadedCallback();
+				}
+			},
+			step: modalDimensions
+		});
+	};
+
+	publicMethod.resize = function (options) {
+		var scrolltop;
+		
+		if (open) {
+			options = options || {};
+			
+			if (options.width) {
+				settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth;
+			}
+
+			if (options.innerWidth) {
+				settings.w = setSize(options.innerWidth, 'x');
+			}
+
+			$loaded.css({width: settings.w});
+			
+			if (options.height) {
+				settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight;
+			}
+
+			if (options.innerHeight) {
+				settings.h = setSize(options.innerHeight, 'y');
+			}
+
+			if (!options.innerHeight && !options.height) {
+				scrolltop = $loaded.scrollTop();
+				$loaded.css({height: "auto"});
+				settings.h = $loaded.height();
+			}
+
+			$loaded.css({height: settings.h});
+
+			if(scrolltop) {
+				$loaded.scrollTop(scrolltop);
+			}
+			
+			publicMethod.position(settings.transition === "none" ? 0 : settings.speed);
+		}
+	};
+
+	publicMethod.prep = function (object) {
+		if (!open) {
+			return;
+		}
+		
+		var callback, speed = settings.transition === "none" ? 0 : settings.speed;
+
+		$loaded.empty().remove(); // Using empty first may prevent some IE7 issues.
+
+		$loaded = $tag(div, 'LoadedContent').append(object);
+		
+		function getWidth() {
+			settings.w = settings.w || $loaded.width();
+			settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w;
+			return settings.w;
+		}
+		function getHeight() {
+			settings.h = settings.h || $loaded.height();
+			settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h;
+			return settings.h;
+		}
+		
+		$loaded.hide()
+		.appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations.
+		.css({width: getWidth(), overflow: settings.scrolling ? 'auto' : 'hidden'})
+		.css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height.
+		.prependTo($content);
+		
+		$loadingBay.hide();
+		
+		// floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width.
+		
+		$(photo).css({'float': 'none'});
+
+		callback = function () {
+			var total = $related.length,
+				iframe,
+				frameBorder = 'frameBorder',
+				allowTransparency = 'allowTransparency',
+				complete;
+			
+			if (!open) {
+				return;
+			}
+			
+			function removeFilter() { // Needed for IE7 & IE8 in versions of jQuery prior to 1.7.2
+				if ($.support.opacity === false) {
+					$box[0].style.removeAttribute('filter');
+				}
+			}
+			
+			complete = function () {
+				clearTimeout(loadingTimer);
+				$loadingOverlay.hide();
+				trigger(event_complete, settings.onComplete);
+			};
+
+			
+			$title.html(settings.title).add($loaded).show();
+			
+			if (total > 1) { // handle grouping
+				if (typeof settings.current === "string") {
+					$current.html(settings.current.replace('{current}', index + 1).replace('{total}', total)).show();
+				}
+				
+				$next[(settings.loop || index < total - 1) ? "show" : "hide"]().html(settings.next);
+				$prev[(settings.loop || index) ? "show" : "hide"]().html(settings.previous);
+				
+				slideshow();
+				
+				// Preloads images within a rel group
+				if (settings.preloading) {
+					$.each([getIndex(-1), getIndex(1)], function(){
+						var src,
+							img,
+							i = $related[this],
+							data = $.data(i, colorbox);
+
+						if (data && data.href) {
+							src = data.href;
+							if ($.isFunction(src)) {
+								src = src.call(i);
+							}
+						} else {
+							src = $(i).attr('href');
+						}
+
+						if (src && isImage(data, src)) {
+							src = retinaUrl(data, src);
+							img = document.createElement('img');
+							img.src = src;
+						}
+					});
+				}
+			} else {
+				$groupControls.hide();
+			}
+			
+			if (settings.iframe) {
+				iframe = $tag('iframe')[0];
+				
+				if (frameBorder in iframe) {
+					iframe[frameBorder] = 0;
+				}
+				
+				if (allowTransparency in iframe) {
+					iframe[allowTransparency] = "true";
+				}
+
+				if (!settings.scrolling) {
+					iframe.scrolling = "no";
+				}
+				
+				$(iframe)
+					.attr({
+						src: settings.href,
+						name: (new Date()).getTime(), // give the iframe a unique name to prevent caching
+						'class': prefix + 'Iframe',
+						allowFullScreen : true, // allow HTML5 video to go fullscreen
+						webkitAllowFullScreen : true,
+						mozallowfullscreen : true
+					})
+					.one('load', complete)
+					.appendTo($loaded);
+				
+				$events.one(event_purge, function () {
+					iframe.src = "//about:blank";
+				});
+
+				if (settings.fastIframe) {
+					$(iframe).trigger('load');
+				}
+			} else {
+				complete();
+			}
+			
+			if (settings.transition === 'fade') {
+				$box.fadeTo(speed, 1, removeFilter);
+			} else {
+				removeFilter();
+			}
+		};
+		
+		if (settings.transition === 'fade') {
+			$box.fadeTo(speed, 0, function () {
+				publicMethod.position(0, callback);
+			});
+		} else {
+			publicMethod.position(speed, callback);
+		}
+	};
+
+	function load () {
+		var href, setResize, prep = publicMethod.prep, $inline, request = ++requests;
+		
+		active = true;
+		
+		photo = false;
+		
+		element = $related[index];
+		
+		makeSettings();
+		
+		trigger(event_purge);
+		
+		trigger(event_load, settings.onLoad);
+		
+		settings.h = settings.height ?
+				setSize(settings.height, 'y') - loadedHeight - interfaceHeight :
+				settings.innerHeight && setSize(settings.innerHeight, 'y');
+		
+		settings.w = settings.width ?
+				setSize(settings.width, 'x') - loadedWidth - interfaceWidth :
+				settings.innerWidth && setSize(settings.innerWidth, 'x');
+		
+		// Sets the minimum dimensions for use in image scaling
+		settings.mw = settings.w;
+		settings.mh = settings.h;
+		
+		// Re-evaluate the minimum width and height based on maxWidth and maxHeight values.
+		// If the width or height exceed the maxWidth or maxHeight, use the maximum values instead.
+		if (settings.maxWidth) {
+			settings.mw = setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth;
+			settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw;
+		}
+		if (settings.maxHeight) {
+			settings.mh = setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight;
+			settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh;
+		}
+		
+		href = settings.href;
+		
+		loadingTimer = setTimeout(function () {
+			$loadingOverlay.show();
+		}, 100);
+		
+		if (settings.inline) {
+			// Inserts an empty placeholder where inline content is being pulled from.
+			// An event is bound to put inline content back when Colorbox closes or loads new content.
+			$inline = $tag(div).hide().insertBefore($(href)[0]);
+
+			$events.one(event_purge, function () {
+				$inline.replaceWith($loaded.children());
+			});
+
+			prep($(href));
+		} else if (settings.iframe) {
+			// IFrame element won't be added to the DOM until it is ready to be displayed,
+			// to avoid problems with DOM-ready JS that might be trying to run in that iframe.
+			prep(" ");
+		} else if (settings.html) {
+			prep(settings.html);
+		} else if (isImage(settings, href)) {
+
+			href = retinaUrl(settings, href);
+
+			photo = document.createElement('img');
+
+			$(photo)
+			.addClass(prefix + 'Photo')
+			.bind('error',function () {
+				settings.title = false;
+				prep($tag(div, 'Error').html(settings.imgError));
+			})
+			.one('load', function () {
+				var percent;
+
+				if (request !== requests) {
+					return;
+				}
+
+				$.each(['alt', 'longdesc', 'aria-describedby'], function(i,val){
+					var attr = $(element).attr(val) || $(element).attr('data-'+val);
+					if (attr) {
+						photo.setAttribute(val, attr);
+					}
+				});
+
+				if (settings.retinaImage && window.devicePixelRatio > 1) {
+					photo.height = photo.height / window.devicePixelRatio;
+					photo.width = photo.width / window.devicePixelRatio;
+				}
+
+				if (settings.scalePhotos) {
+					setResize = function () {
+						photo.height -= photo.height * percent;
+						photo.width -= photo.width * percent;
+					};
+					if (settings.mw && photo.width > settings.mw) {
+						percent = (photo.width - settings.mw) / photo.width;
+						setResize();
+					}
+					if (settings.mh && photo.height > settings.mh) {
+						percent = (photo.height - settings.mh) / photo.height;
+						setResize();
+					}
+				}
+				
+				if (settings.h) {
+					photo.style.marginTop = Math.max(settings.mh - photo.height, 0) / 2 + 'px';
+				}
+				
+				if ($related[1] && (settings.loop || $related[index + 1])) {
+					photo.style.cursor = 'pointer';
+					photo.onclick = function () {
+						publicMethod.next();
+					};
+				}
+
+				photo.style.width = photo.width + 'px';
+				photo.style.height = photo.height + 'px';
+
+				setTimeout(function () { // A pause because Chrome will sometimes report a 0 by 0 size otherwise.
+					prep(photo);
+				}, 1);
+			});
+			
+			setTimeout(function () { // A pause because Opera 10.6+ will sometimes not run the onload function otherwise.
+				photo.src = href;
+			}, 1);
+		} else if (href) {
+			$loadingBay.load(href, settings.data, function (data, status) {
+				if (request === requests) {
+					prep(status === 'error' ? $tag(div, 'Error').html(settings.xhrError) : $(this).contents());
+				}
+			});
+		}
+	}
+		
+	// Navigates to the next page/image in a set.
+	publicMethod.next = function () {
+		if (!active && $related[1] && (settings.loop || $related[index + 1])) {
+			index = getIndex(1);
+			launch($related[index]);
+		}
+	};
+	
+	publicMethod.prev = function () {
+		if (!active && $related[1] && (settings.loop || index)) {
+			index = getIndex(-1);
+			launch($related[index]);
+		}
+	};
+
+	// Note: to use this within an iframe use the following format: parent.jQuery.colorbox.close();
+	publicMethod.close = function () {
+		if (open && !closing) {
+			
+			closing = true;
+			
+			open = false;
+			
+			trigger(event_cleanup, settings.onCleanup);
+			
+			$window.unbind('.' + prefix);
+			
+			$overlay.fadeTo(settings.fadeOut || 0, 0);
+			
+			$box.stop().fadeTo(settings.fadeOut || 0, 0, function () {
+			
+				$box.add($overlay).css({'opacity': 1, cursor: 'auto'}).hide();
+				
+				trigger(event_purge);
+				
+				$loaded.empty().remove(); // Using empty first may prevent some IE7 issues.
+				
+				setTimeout(function () {
+					closing = false;
+					trigger(event_closed, settings.onClosed);
+				}, 1);
+			});
+		}
+	};
+
+	// Removes changes Colorbox made to the document, but does not remove the plugin.
+	publicMethod.remove = function () {
+		if (!$box) { return; }
+
+		$box.stop();
+		$.colorbox.close();
+		$box.stop().remove();
+		$overlay.remove();
+		closing = false;
+		$box = null;
+		$('.' + boxElement)
+			.removeData(colorbox)
+			.removeClass(boxElement);
+
+		$(document).unbind('click.'+prefix);
+	};
+
+	// A method for fetching the current element Colorbox is referencing.
+	// returns a jQuery object.
+	publicMethod.element = function () {
+		return $(element);
+	};
+
+	publicMethod.settings = defaults;
+
+}(jQuery, document, window));
diff --git a/htmltest/sites/all/libraries/flexslider b/htmltest/sites/all/libraries/flexslider
new file mode 120000
index 00000000..dcc2e1fd
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider
@@ -0,0 +1 @@
+flexslider-version
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/README.mdown b/htmltest/sites/all/libraries/flexslider-version/README.mdown
new file mode 100644
index 00000000..0b28164d
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/README.mdown
@@ -0,0 +1,144 @@
+# FlexSlider 2
+http://www.woothemes.com/flexslider/ - Copyright (c) 2012 WooThemes
+
+## Updates
+
+** Version 2.2.0**
+
+- Fixed event handler conflicts with devices that are both click and touch enabled. e.g., Windows 8.
+- Made all slider variables public, stored in `slider.vars`. This allows manipulation of `slider.vars.minItems` and `slider.vars.maxItems` on the fly to create different fluid grids at certain breakpoints. [Check out this example demonstrating a basic technique](http://flexslider.woothemes.com/dynamic-carousel-min-max.html)
+- Fixed calculations that were causing strange issues with paging and certain FlexSliders to move out of alignment.
+
+*Be sure to test v2.2.0 with your current slider, before pushing live, to ensure everything is playing nicely.*
+
+-----
+
+## General Notes
+FlexSlider is no longer licensed under the MIT license. FlexSlider now shares the common licensed used for all WooThemes themes, GPLv2.
+
+In an effort to move the plugin forward, support for jQuery 1.3.2 has been dropped. The plugin now requires jQuery 1.4.2+. If you don't have access to the later versions of jQuery, [FlexSlider 1.8](https://github.com/woothemes/FlexSlider/tree/flexslider1) should be a perfectly suitable substitute for your needs!
+
+Your old styles and properties *might not work out of the box*. Some property names have been changed, noted below, as well as namespacing prefixes being applied to all elements. This means that `.flex-direction-nav .next` is now `.flex-direction-nav .flex-next` by default. The namespacing property is exposed, free for you to change.
+
+No more overflow hidden woes! The plugin now generates a viewport element to handle the tedious task of working around overflow hidden. Yay!
+
+The slider element is now accessible outside of the callback API via the jQuery .data() method. Example use: `$('#slider').data('flexslider')`
+
+Helper strings have been added for performing actions quickly on FlexSlider elements. Example uses:
+
+- `$('#slider').flexslider("play")  //Play slideshow`
+- `$('#slider').flexslider("pause") //Pause slideshow`
+- `$('#slider').flexslider("stop") //Stop slideshow`
+- `$('#slider').flexslider("next")  //Go to next slide`
+- `$('#slider').flexslider("prev")  //Go to previous slide`
+- `$('#slider').flexslider(3)       //Go fourth slide`
+
+Two new methods are available for adding/removing slides, `slider.addSlide()` and `slider.removeSlide()`. More details about this coming soon.
+
+- `slider.addSlide(obj, pos)` accepts two parameters, a string/jQuery object and an index.
+- `slider.removeSlide(obj)` accepts one parameter, either an object to be removed, or an index.
+
+## Examples
+
+- [Basic Slider](http://flexslider.woothemes.com/)
+- [Slider w/thumbnail controlNav pattern](http://flexslider.woothemes.com/thumbnail-controlnav.html)
+- [Slider w/thumbnail slider](http://flexslider.woothemes.com/thumbnail-slider.html)
+- [Basic Carousel](http://flexslider.woothemes.com/basic-carousel.html)
+- [Carousel with min and max ranges](http://flexslider.woothemes.com/carousel-min-max.html)
+- [Video with Vimeo API](http://flexslider.woothemes.com/video.html)
+- [Video with Wistia API](http://flexslider.woothemes.com/video-wistia.html)
+
+
+## Properties
+
+### namespace: *{new}*
+`namespace` controls the prefixes attached to elements created by the plugin. In previous releases, only certain elements were tagged with a prefix class, which was causing class generalization issues for some users. FlexSlider now prefixes all generated elements with the appropriate namespace.
+
+*Hint: `namespace` can be an empty string.*
+
+### selector: *{new}*
+The markup structure for FlexSlider has been limited to a "ul.slide li" pattern in previous versions of FlexSlider; no longer. You can now take full control of the markup structure used for your FlexSlider. The `selector` pattern "{container} > {slide}" is mandatory, allowing the plugin to predictably interpret the selector property. Omitting the ">" from the selector is not suggested, but is possible if your markup doesn't follow the immediate descendant pattern.
+
+*Examples: "section > article", ".slides > .slide", "#hero .slide"*
+
+### easing: *{new}*
+`easing` allows support for jQuery easing! Default options provided by jQuery are "swing" and "linear," but more can be used by included the jQuery Easing plugin. *If you chose a non-existent easing method, the slider will break.*
+
+*Note: You need to set `useCSS: false` to force transitions in browsers that support translate3d.*
+*Optional: [jQuery Easing Plugin](http://gsgd.co.uk/sandbox/jquery/easing/)*
+
+### direction: *{changed}*
+Previously called "slideDirection" in v1.8 and below.
+
+### reverse: *{new}*
+`reverse` will reverse the animation direction of the slider. Meaning, horizontal sliders can move from right to left, and vertical sliders can move bottom to top.
+
+### smoothHeight: *{new}*
+`smoothHeight` allows for smooth height transitions between slides. This property currently works for the fade and horizontal slide animation. The property has no effect on horizontal sliding carousels, however.
+
+### startAt: *{changed}*
+Previously called "slideToStart" in v1.8 and below.
+
+### animationSpeed: *{changed}*
+Previously called "animationDuration" in v1.8 and below.
+
+### initDelay: *{new}*
+`initDelay` will delay the initial slideshow of a slider, given in milliseconds. The slider will still initialize, generating controls and displaying the first image, but the slideshow will wait until the `initDelay` time has completed before starting the slideshow.
+
+### useCSS: *{new}*
+`useCSS` allow users to override using CSS3 for animation. Translate3d still has numerous bugs that can crop up and wreak havoc, so this is a great property to play with if you are experiencing unexplainable issues in Webkit browsers.
+
+*Hint: Use conditionals to enable/disable the use of CSS3 on desktops and mobile devices. Mobile devices, in my experience, do not share many of the translate3d bugs seen on desktop browsers.*
+
+### touch: *{new}*
+`touch` allows users to exclude touch swipe functionality from their sliders.
+
+### keyboard: *{changed}*
+Previously called "keyboardNav" in v1.8 and below.
+
+### multipleKeyboard *{new}*
+`multipleKeyboard` allows users to override the default plugin keyboard behavior, enabling keyboard control of more than one slider on the page. This means that all visible sliders will animate, at the same time, via keyboard input.
+
+*Hint: You can use `multipleKeyboard` to allow keyboard navigation on pages where multiple sliders are present, but only one is visible.*
+
+### mousewheel: *{updated}*
+`mousewheel` now requires the jQuery Mousewheel plugin. There are a few reasons for this, but primarily because there is no need for FlexSlider itself to reinvent the awkward complexity of mousewheel interactivity that is handled perfectly by the Mousewheel plugin.
+
+*Required: [jQuery Mousewheel Plugin](https://github.com/brandonaaron/jquery-mousewheel)*
+
+### controlsContainer: *{updated}*
+`controlsContainer` is one of the more painstaking, potentially confusing properties within FlexSlider. First, the property is no longer required to workaround `overflow: hidden` on slide animation. Second, the property now accepts a **jQuery object**, giving you precise control over the object you want. The plugin no longer attempts to guess what element you are selecting.
+
+### sync: *{new}*
+`sync` is a new property that will allow other slider(s) to hook into the current slider via a given selector. The selector should describe an object that has already been initialized as a FlexSlider. Right now, `sync` will synchronize animation, play, and pause behaviors. More behaviors can be added in the future as the property matures.
+
+*[Example of sync being used](http://flex.madebymufffin.com/examples/basic-carousel.html)*
+
+### asNavFor: *{new}*
+Description to be added.
+
+### itemWidth: *{new}*
+`itemWidth` is the primary property for the new carousel options. Without this property, your slider is not considered a carousel. To use `itemWidth`, give an integer value of the width of your individual slides. This should include borders and paddings applied to your slides; a total width measurement.
+
+### itemMargin: *{new}*
+`itemMargin` describes the gutter between the slide elements. If each slide has a margin-left of 10px, your itemMargin value would be 10. If elements have margin: 0 10px, your itemMargin would be 20.
+
+### minItems: *{new}*
+`minItems` describes the minimum number of slide elements that should be visible in the carousel. When the slider reaches the minimum item count, the slides will resize fluidly with the slider.
+
+### maxItems: *{new}*
+`maxItems` describes the maximum number of slide elements that should be visible in the carousel. When the slider reaches the maximum item count, the slides will resize fluidly with the sider.
+
+### move: *{new}*
+`move` determines how many slides should be animated within the carousel. When left at 0, the slider will animate the number of visible slides. If any value greater than 0 is given, the slider will animate that number of slides in the carousel on each animation interval.
+
+*Hint: The move property will be ignored if the value is higher than the number of visible slides, which can be utilized in responsive design.*
+
+### added: *{new}*
+`added()` is a new callback event fired in the new slider.addSlide() function.
+
+### removed: *{new}*
+`removed()` is a new callback event fired in the new slider.removeSlide() function.
+
+### allowOneSlide: *{new}*
+Boolean. Whether or not you'd like FlexSlider to initialize as usual if only one slide is present.
diff --git a/htmltest/sites/all/libraries/flexslider-version/changelog.txt b/htmltest/sites/all/libraries/flexslider-version/changelog.txt
new file mode 100644
index 00000000..c5dd8c94
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/changelog.txt
@@ -0,0 +1,4 @@
+FLEXSLIDER CHANGELOG
+
+2013.02.15 - Version 2.0
+ * Added changelog.txt
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/basic-carousel.html b/htmltest/sites/all/libraries/flexslider-version/demo/basic-carousel.html
new file mode 100644
index 00000000..0ec5c14c
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/basic-carousel.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+<head>
+	<meta content="charset=utf-8">
+	<title>FlexSlider 2</title>
+	<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
+
+  <!-- Demo CSS -->
+	<link rel="stylesheet" href="css/demo.css" type="text/css" media="screen" />
+	<link rel="stylesheet" href="../flexslider.css" type="text/css" media="screen" />
+
+	<!-- Modernizr -->
+  <script src="js/modernizr.js"></script>
+
+</head>
+<body class="loading">
+
+  <div id="container" class="cf">
+    <header role="navigation">
+      <a class="logo" href="http://www.woothemes.com" title="WooThemes">
+        <img src="images/logo.png" alt="WooThemes" />
+	  </a>
+      <h1>FlexSlider 2</h1>
+      <h2>The best responsive slider. Period.</h2>
+      <a class="button green" href="https://github.com/woothemes/FlexSlider/zipball/master">Download Flexslider</a>
+      <h3 class="header-nav">Other Examples</h3>
+      <nav>
+        <ul>
+          <li><a href="index.html">Basic Slider</a></li>
+          <li><a href="thumbnail-controlnav.html">Slider w/thumbnail controlNav pattern</a></li>
+          <li><a href="thumbnail-slider.html">Slider w/thumbnail slider</a></li>
+          <li class="active"><a href="basic-carousel.html">Basic Carousel</a></li>
+          <li><a href="carousel-min-max.html">Carousel with min and max ranges</a></li>
+          <li><a href="dynamic-carousel-min-max.html">Carousel with dynamic min/max ranges</a></li>
+          <li><a href="video.html">Video & the api (vimeo)</a></li>
+          <li><a href="video-wistia.html">Video & the api (wistia)</a></li>
+        </ul>
+      </nav>
+    </header>
+
+	<div id="main" role="main">
+      <section class="slider">
+        <div class="flexslider carousel">
+          <ul class="slides">
+            <li>
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+            <li>
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+            <li>
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+          </ul>
+        </div>
+      </section>
+      <aside>
+        <div class="cf">
+          <h3>Basic Carousel</h3>
+          <ul class="toggle cf">
+            <li class="js"><a href="#view-js">JS</a></li>
+            <li class="html"><a href="#view-html">HTML</a></li>
+          </ul>
+        </div>
+        <div id="view-js" class="code">
+          <pre class="brush: js; toolbar: false; gutter: false;">
+            $(window).load(function() {
+              $('.flexslider').flexslider({
+                animation: "slide",
+                animationLoop: false,
+                itemWidth: 210,
+                itemMargin: 5
+              });
+            });
+          </pre>
+        </div>
+        <div id="view-html" class="code">
+          <pre class="brush: xml; toolbar: false; gutter: false;">
+            &lt;!-- Place somewhere in the &lt;body&gt; of your page -->
+            &lt;div class="flexslider">
+              &lt;ul class="slides">
+                &lt;li>
+                  &lt;img src="slide1.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide2.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide3.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide4.jpg" />
+                &lt;/li>
+                &lt;!-- items mirrored twice, total of 12 -->
+              &lt;/ul>
+            &lt;/div>
+          </pre>
+        </div>
+      </aside>
+    </div>
+
+  </div>
+
+  <!-- jQuery -->
+  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
+  <script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.min.js">\x3C/script>')</script>
+
+  <!-- FlexSlider -->
+  <script defer src="../jquery.flexslider.js"></script>
+
+  <script type="text/javascript">
+    $(function(){
+      SyntaxHighlighter.all();
+    });
+    $(window).load(function(){
+      $('.flexslider').flexslider({
+        animation: "slide",
+        animationLoop: false,
+        itemWidth: 210,
+        itemMargin: 5,
+        pausePlay: true,
+        start: function(slider){
+          $('body').removeClass('loading');
+        }
+      });
+    });
+  </script>
+
+
+  <!-- Syntax Highlighter -->
+  <script type="text/javascript" src="js/shCore.js"></script>
+  <script type="text/javascript" src="js/shBrushXml.js"></script>
+  <script type="text/javascript" src="js/shBrushJScript.js"></script>
+
+  <!-- Optional FlexSlider Additions -->
+  <script src="js/jquery.easing.js"></script>
+  <script src="js/jquery.mousewheel.js"></script>
+  <script defer src="js/demo.js"></script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/carousel-min-max.html b/htmltest/sites/all/libraries/flexslider-version/demo/carousel-min-max.html
new file mode 100644
index 00000000..e0e423e4
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/carousel-min-max.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+<head>
+	<meta content="charset=utf-8">
+	<title>FlexSlider 2</title>
+	<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
+
+  <!-- Syntax Highlighter -->
+	<link href="css/shCore.css" rel="stylesheet" type="text/css" />
+  <link href="css/shThemeDefault.css" rel="stylesheet" type="text/css" />
+  <!-- Demo CSS -->
+	<link rel="stylesheet" href="css/demo.css" type="text/css" media="screen" />
+	<link rel="stylesheet" href="../flexslider.css" type="text/css" media="screen" />
+
+	<!-- Modernizr -->
+  <script src="js/modernizr.js"></script>
+
+</head>
+<body class="loading">
+
+  <div id="container" class="cf">
+    <header role="navigation">
+      <a class="logo" href="http://www.woothemes.com" title="WooThemes">
+        <img src="images/logo.png" alt="WooThemes" />
+	  </a>
+      <h1>FlexSlider 2</h1>
+      <h2>The best responsive slider. Period.</h2>
+      <a class="button green" href="https://github.com/woothemes/FlexSlider/zipball/master">Download Flexslider</a>
+	  <h3 class="nav-header">Other Examples</h3>
+      <nav>
+        <ul>
+          <li><a href="index.html">Basic Slider</a></li>
+          <li><a href="thumbnail-controlnav.html">Slider w/thumbnail controlNav pattern</a></li>
+          <li><a href="thumbnail-slider.html">Slider w/thumbnail slider</a></li>
+          <li><a href="basic-carousel.html">Basic Carousel</a></li>
+          <li class="active"><a href="carousel-min-max.html">Carousel with min and max ranges</a></li>
+          <li><a href="dynamic-carousel-min-max.html">Carousel with dynamic min/max ranges</a></li>
+          <li><a href="video.html">Video & the api (vimeo)</a></li>
+          <li><a href="video-wistia.html">Video & the api (wistia)</a></li>
+        </ul>
+      </nav>
+    </header>
+
+	<div id="main" role="main">
+      <section class="slider">
+        <div class="flexslider carousel">
+          <ul class="slides">
+            <li>
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+          </ul>
+        </div>
+      </section>
+      <aside>
+        <div class="cf">
+          <h3>Carousel With Min &amp; Max Ranges</h3>
+          <ul class="toggle cf">
+            <li class="js"><a href="#view-js">JS</a></li>
+            <li class="html"><a href="#view-html">HTML</a></li>
+          </ul>
+        </div>
+        <div id="view-js" class="code">
+          <pre class="brush: js; toolbar: false; gutter: false;">
+            // Can also be used with $(document).ready()
+            $(window).load(function() {
+              $('.flexslider').flexslider({
+                animation: "slide",
+                animationLoop: false,
+                itemWidth: 210,
+                itemMargin: 5,
+                minItems: 2,
+                maxItems: 4
+              });
+            });
+          </pre>
+        </div>
+        <div id="view-html" class="code">
+          <pre class="brush: xml; toolbar: false; gutter: false;">
+            &lt;!-- Place somewhere in the &lt;body&gt; of your page -->
+            &lt;div class="flexslider">
+              &lt;ul class="slides">
+                &lt;li>
+                  &lt;img src="slide1.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide2.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide3.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide4.jpg" />
+                &lt;/li>
+                &lt;!-- items mirrored twice, total of 12 -->
+              &lt;/ul>
+            &lt;/div>
+          </pre>
+        </div>
+      </aside>
+    </div>
+
+  </div>
+
+  <!-- jQuery -->
+  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
+  <script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.min.js">\x3C/script>')</script>
+
+  <!-- FlexSlider -->
+  <script defer src="../jquery.flexslider.js"></script>
+
+   <script type="text/javascript">
+    $(function(){
+      SyntaxHighlighter.all();
+    });
+    $(window).load(function(){
+      $('.flexslider').flexslider({
+        animation: "slide",
+        animationLoop: false,
+        itemWidth: 210,
+        itemMargin: 5,
+        minItems: 2,
+        maxItems: 4,
+        start: function(slider){
+          $('body').removeClass('loading');
+        }
+      });
+    });
+  </script>
+
+
+  <!-- Syntax Highlighter -->
+  <script type="text/javascript" src="js/shCore.js"></script>
+  <script type="text/javascript" src="js/shBrushXml.js"></script>
+  <script type="text/javascript" src="js/shBrushJScript.js"></script>
+
+  <!-- Optional FlexSlider Additions -->
+  <script src="js/jquery.easing.js"></script>
+  <script src="js/jquery.mousewheel.js"></script>
+  <script defer src="js/demo.js"></script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/css/demo.css b/htmltest/sites/all/libraries/flexslider-version/demo/css/demo.css
new file mode 100644
index 00000000..c5332de8
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/css/demo.css
@@ -0,0 +1,365 @@
+/* Reset Styles
+***********************/
+html, body, div, span, applet, object, iframe,h1, h2, h3, h4, h5, h6, p, blockquote, pre,a, abbr, acronym, address, big, cite, code,del, dfn, em, img, ins, kbd, q, s, samp,small, strike, strong, sub, sup, tt, var,b, u, i, center,dl, dt, dd, ol, ul, li,fieldset, form, label, legend,table, caption, tbody, tfoot, thead, tr, th, td,article, aside, canvas, details, embed,figure, figcaption, footer, header, hgroup,menu, nav, output, ruby, section, summary,time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; }
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,footer, header, hgroup, menu, nav, section {display: block;}
+body {line-height: 1;}
+ol, ul {list-style: none;}
+blockquote, q demo
+blockquote:before, blockquote:after,q:before, q:after {content: ''; content: none;}
+table {border-collapse: collapse; border-spacing: 0;}
+strong {font-weight: bold;}
+em {font-style: italic;}
+
+
+/*
+ * MyFonts Webfont Build ID 1114443, 2011-09-02T06:08:04-0400 - REGULAR
+ * MyFonts Webfont Build ID 1118460, 2011-09-05T07:13:16-0400 - MEDIUM
+ * MyFonts Webfont Build ID 825795, 2011-05-26T03:42:08-0400 - SEMIBOLD
+ *
+ * The fonts listed in this notice are subject to the End User License
+ * Agreement(s) entered into by the website owner. All other parties are 
+ * explicitly restricted from using the Licensed Webfonts(s).
+ * 
+ * You may obtain a valid license at the URLs below
+ *
+ * License: http://www.myfonts.com/viewlicense?type=web&buildid=1114443 - REGULAR
+ * License: http://www.myfonts.com/viewlicense?type=web&buildid=1118460 - MEDIUM
+ * License: http://www.myfonts.com/viewlicense?1056 - SEMIBOLD
+ * 
+ * Webfont: Geogrotesque SemiBold
+ * URL: http://new.myfonts.com/fonts/emtype/geogrotesque/semibold/
+ * Foundry: Emtype Foundry
+ * Copyright: Copyright © 2009 by Eduardo Manso. All rights reserved.
+ * Licensed pageviews: 10,000,000/month
+ * 
+ * © 2011 Bitstream Inc
+*/
+
+/* GEO - Semibold */
+@font-face {font-family: 'Geogrotesque-SemiBold';src: url('../fonts/webfonts/geo-semibold/eot/style_169898.eot');src: url('../fonts/webfonts/geo-semibold/eot/style_169898.eot?#iefix') format('embedded-opentype'),url('../fonts/webfonts/geo-semibold/woff/style_169898.woff') format('woff'),url('../fonts/webfonts/geo-semibold/ttf/style_169898.ttf') format('truetype'),url('../fonts/webfonts/geo-semibold/svg/style_169898.svg#Geogrotesque-SemiBold') format('svg');}
+
+/* GEO - Medium */
+@font-face {font-family: 'Geogrotesque-Medium';src: url('../fonts/webfonts/geo-medium/eot/1110FC_0.eot');src: url('../fonts/webfonts/geo-medium/eot/1110FC_0.eot?#iefix') format('embedded-opentype'),url('../fonts/webfonts/geo-medium/woff/1110FC_0.woff') format('woff'),url('../fonts/webfonts/geo-medium/ttf/1110FC_0.ttf') format('truetype'),url('webfonts/1110FC_0.svg#wf') format('svg');}
+
+/* GEO - Regular */
+ @font-face {font-family: 'Geogrotesque-Regular';src: url('../fonts/webfonts/geo-regular/eot/11014B_0.eot');src: url('../fonts/webfonts/geo-regular/eot/11014B_0.eot?#iefix') format('embedded-opentype'),url('../fonts/webfonts/geo-regular/woff/11014B_0.woff') format('woff'),url('../fonts/webfonts/geo-regular/ttf/11014B_0.ttf') format('truetype'),url('../fonts/webfonts/geo-regular/svg/11014B_0.svg#wf') format('svg');}
+
+/* General
+***********************/
+body {
+	background: #42a2ce;
+	font-size: 14px;
+	font-family: Helvetica, 'Arial', sans-serif;
+	-webkit-font-smoothing: antialiased;
+	text-rendering: optimizeLegibility;
+	height: auto;
+}
+a {
+	color: #fff;
+	text-decoration: none;
+}
+
+h3 {
+	margin: 0 0 8px;
+	color: #fff;
+	font: normal 24px Geogrotesque-semibold, Helvetica, Arial, sans-serif;
+	text-shadow: 0 1px 0 #2F4C63;
+}
+p {
+	font-size: 14px;
+	line-height: 18px;
+}
+
+/* --Clearfix */
+.cf:before,
+.cf:after {content:""; display:table;}
+.cf:after {clear:both;}
+.cf {zoom:1;}
+
+.toggle { margin: 2px 0 0 14px; float: left; border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px; }
+.toggle li { float: left; }
+.toggle li a {width: 50px; padding: 6px 0; text-align: center; display: block; text-shadow: 1px 1px 0 #fff; font-size: 12px; font-weight: 600; color: #666; -webkit-border-radius: 0 4px 4px 0; -moz-border-radius: 0 4px 4px 0; -o-border-radius: 0 4px 4px 0; border-radius: 0 4px 4px 0; 
+
+background: #ffffff; /* Old browsers */
+background: -moz-linear-gradient(top, #ffffff 0%, #ededed 100%); /* FF3.6+ */
+background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(100%,#ededed)); /* Chrome,Safari4+ */
+background: -webkit-linear-gradient(top, #ffffff 0%,#ededed 100%); /* Chrome10+,Safari5.1+ */
+background: -o-linear-gradient(top, #ffffff 0%,#ededed 100%); /* Opera 11.10+ */
+background: -ms-linear-gradient(top, #ffffff 0%,#ededed 100%); /* IE10+ */
+background: linear-gradient(top, #ffffff 0%,#ededed 100%); /* W3C */
+
+box-shadow: inset 1px 1px 0 #fff, inset -1px -1px 0 #fff;
+-moz-box-shadow: inset 1px 1px 0 #fff, inset -1px -1px 0 #fff;
+-webkit-box-shadow: inset 1px 1px 0 #fff, inset -1px -1px 0 #fff;
+
+}
+.toggle li:first-child a {-webkit-border-radius: 4px 0 0 4px; -moz-border-radius: 4px 0 0 4px; -o-border-radius: 4px 0 0 4px; border-radius: 4px 0 0 4px;}
+.toggle li a:hover { background: #ededed; color: #222; }
+.toggle li a.active { background: #c8e0f3; color: #325874; cursor: default; box-shadow: inset 0 0 3px rgba(0,0,0,0.4); -moz-box-shadow: inset 0 0 3px rgba(0,0,0,0.4); -webkit-box-shadow: inset 0 0 3px rgba(0,0,0,0.4); }
+
+.slider { margin: 50px 0 10px!important;}
+#carousel li {margin-right: 5px;}
+#carousel img {display: block; opacity: .5; cursor: pointer;}
+#carousel img:hover {opacity: 1;}
+#carousel .flex-active-slide img {opacity: 1; cursor: default;}
+
+.button {
+  display: inline-block;
+  margin: 0;
+  padding: .461em 1.563em .41em;
+  color: #fff!important;
+  text-align: center;
+  text-decoration: none;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.7);
+  text-transform: uppercase;
+  line-height: 1;
+  font-size: .9em;
+  cursor: pointer;
+  font-family: "proxima-nova", sans-serif;
+  border: 1px solid #1a4064;
+  background: #255a8c;
+  -webkit-border-radius: 100px;
+  -moz-border-radius: 100px;
+  border-radius: 100px;
+  -webkit-box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1), inset 0 0 1px 1px rgba(255, 255, 255, 0.15);
+  -moz-box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1), inset 0 0 1px 1px rgba(255, 255, 255, 0.15);
+  box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1), inset 0 0 1px 1px rgba(255, 255, 255, 0.15);
+}
+.button:active  {
+  -webkit-box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1), inset 0 0 1px 1px rgba(0, 0, 0, 0.1);
+  -moz-box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1), inset 0 0 1px 1px rgba(0, 0, 0, 0.1);
+  box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1), inset 0 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+.button.green  {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4);
+  border: 1px solid #578824;
+  background: #71b02f;
+}
+.button.green:hover  {
+  background: #79bc32;
+}
+
+/* Loading
+***********************/
+.loading #container {opacity: 0;}
+.loading:before  { content: 'LOADING'; display: block; margin: 100px 0 0; text-align: center; color: #fff; font-weight: bold; font-size: 60px; opacity: 0.3; }
+body {width: 100%; float: left; opacity: 1; -webkit-transition: opacity 1s ease;}
+
+/* Layout
+***********************/
+#container {padding: 60px 40px 100px;}
+header {width: 420px; float: left;}
+#main {margin-left: 420px; margin-top: -25px;overflow: hidden;}
+aside h3 {float: left;}
+
+/* Header
+***********************/
+header .logo  { display: block; margin: 10px 0 30px; }
+header h1 { font-family: Geogrotesque-Semibold, Helvetica, Arial, sans-serif; margin: 0 0 10px; text-shadow: 0 1px 0 #2F4C63; color: #fff; font-size: 42px; }
+header h2 { margin: 0 0 30px; font: normal 20px Geogrotesque-regular, Helvetica, Arial, sans-serif; text-shadow: 0 1px 1px #555; color: #fff; }
+header .button { margin: 0 0 50px; padding: 10px 15px 10px 15px; position: relative; }
+h3.nav-header { width: 200px; margin: 0 0 10px; padding: 0 0 3px; font-size: 18px; text-shadow: 0 1px 1px #555; color: #fff; font-family: Geogrotesque-Regular, Helvetica, Arial, sans-serif; border-bottom: 1px solid #fff; border-bottom: 1px solid rgba(255,255,255,0.5); }
+nav li {margin: 0 0 7px; font-size: 15px; }
+nav li a:hover,
+nav li.active a  {border-bottom: 1px dotted #fff; border-bottom: 1px dotted rgba(255,255,255,0.3); background: none;}
+nav li.active a  { cursor: default; }
+
+/* Media Queries
+***********************/
+@media screen and (max-width: 960px) {
+  #container {padding: 35px;}
+  header {width: 380px;}
+  #main {margin-left: 380px;}
+  aside h3  {
+  	float: none;
+  	font-size: 20px;
+  }
+  .toggle  {
+  	margin-left: 0;
+  	float: none;
+  }
+}
+@media screen and (max-width: 768px) {
+  #container {padding: 20px 30px;}
+  header {width: 100%; float: none; text-align: center;}
+  header img  {width:120px;}
+  header h1  { margin: 0 auto 10px; font-size: 32px; }
+  header h2  { font-size: 16px; }
+  header .button  { margin-bottom: 28px; }
+
+  #main {margin-left: 0;}
+  h3.nav-header { margin: 0 auto 10px; font-size: 16px; }
+  nav {
+		position: relative;
+		min-height: 46px;
+		margin-bottom: 20px;
+		width: 100%;
+	}	
+	nav ul {
+		width: 260px;
+		padding: 0;
+		position: absolute;
+		left: 50%;
+		margin-left: -130px;
+		top: 0;
+		z-index: 9999;
+		border: 1px solid #1e5486;
+		background: #255a8c;
+		-webkit-border-radius: 3px;
+		   -moz-border-radius: 3px;
+		        border-radius: 3px;
+		-webkit-box-shadow: 0 0 5px 0 rgba(0,0,0,.2), inset 0 0 2px 0 rgba(255,255,255,0.2);
+		   -moz-box-shadow: 0 0 5px 0 rgba(0,0,0,.2), inset 0 0 2px 0 rgba(255,255,255,0.2);
+	        	box-shadow: 0 0 5px 0 rgba(0,0,0,.2), inset 0 0 2px 0 rgba(255,255,255,0.2);
+	}
+	nav li {
+		display: none; /* hide all <li> items */
+		margin: 0;
+	}
+	nav li a  { border: none!important; text-shadow: 1px 1px 0 rgba(0,0,0,0.3); }
+	nav li a:hover  { text-decoration: underline; }
+	nav .active {
+		display: block; /* show only current <li> item */
+	}
+	nav a {
+		display: block;
+		padding: 10px 20px;
+		text-align: center;
+		font-size: 12px;
+	}
+	nav .active a {
+		background: none;
+		color: #fff;
+		position: relative;
+	}
+	nav .active a:after  {
+		font-family: flexslider-icon;
+		content: '\f005';
+		font-size: 13px;
+		position: absolute;
+		right: 10px;
+		top: 10px;
+	}
+
+	/* on nav hover */
+	nav ul:hover {
+		background: #32679a;
+	}
+	nav ul:hover li {
+		display: block;
+		margin: 0 0 5px;
+	}
+	nav ul:hover .active {
+		border: 1px solid #1e5486!important;
+		background: #255a8c;
+		-webkit-border-radius: 1px;
+		-moz-border-radius: 1px;
+		border-radius: 1px;
+	}
+	nav ul:hover .active a:after  {
+		display: none;
+	}
+  
+}
+
+/*
+ SyntaxHighlighter - http://alexgorbatchev.com/SyntaxHighlighter
+ 
+ SyntaxHighlighter is donationware. If you are using it, please donate. - http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ 
+ @version - 3.0.83 (July 02 2010)
+ @copyright - Copyright (C) 2004-2010 Alex Gorbatchev.
+ @license - Dual licensed under the MIT and GPL licenses.
+*/
+.syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0 !important;-webkit-border-radius:0 0 0 0 !important;background:none !important;border:0 !important;bottom:auto !important;float:none !important;height:auto !important;left:auto !important;line-height:1.1em !important;margin:0 !important;outline:0 !important;overflow:visible !important;padding:0 !important;position:static !important;right:auto !important;text-align:left !important;top:auto !important;vertical-align:baseline !important;width:auto !important;box-sizing:content-box !important;font-family:"Consolas","Bitstream Vera Sans Mono","Courier New",Courier,monospace !important;font-weight:normal !important;font-style:normal !important;font-size:1em !important;min-height:inherit !important;min-height:auto !important;}
+.syntaxhighlighter{width:100% !important;margin:1em 0 1em 0 !important;position:relative !important;overflow:auto !important;font-size:1em !important;}
+.syntaxhighlighter.source{overflow:hidden !important;}
+.syntaxhighlighter .bold{font-weight:bold !important;}
+.syntaxhighlighter .italic{font-style:italic !important;}
+.syntaxhighlighter .line{white-space:pre !important;}
+.syntaxhighlighter table{width:100% !important;}
+.syntaxhighlighter table caption{text-align:left !important;padding:.5em 0 0.5em 1em !important;}
+.syntaxhighlighter table td.code{width:100% !important;}
+.syntaxhighlighter table td.code .container{position:relative !important;}
+.syntaxhighlighter table td.code .container textarea{box-sizing:border-box !important;position:absolute !important;left:0 !important;top:0 !important;width:100% !important;height:100% !important;border:none !important;background:white !important;padding-left:1em !important;overflow:hidden !important;white-space:pre !important;}
+.syntaxhighlighter table td.gutter .line{text-align:right !important;padding:0 0.5em 0 1em !important;}
+.syntaxhighlighter table td.code .line{padding:0 1em !important;}
+.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0em !important;}
+.syntaxhighlighter.show{display:block !important;}
+.syntaxhighlighter.collapsed table{display:none !important;}
+.syntaxhighlighter.collapsed .toolbar{padding:0.1em 0.8em 0em 0.8em !important;font-size:1em !important;position:static !important;width:auto !important;height:auto !important;}
+.syntaxhighlighter.collapsed .toolbar span{display:inline !important;margin-right:1em !important;}
+.syntaxhighlighter.collapsed .toolbar span a{padding:0 !important;display:none !important;}
+.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline !important;}
+.syntaxhighlighter .toolbar{position:absolute !important;right:1px !important;top:1px !important;width:11px !important;height:11px !important;font-size:10px !important;z-index:10 !important;}
+.syntaxhighlighter .toolbar span.title{display:inline !important;}
+.syntaxhighlighter .toolbar a{display:block !important;text-align:center !important;text-decoration:none !important;padding-top:1px !important;}
+.syntaxhighlighter .toolbar a.expandSource{display:none !important;}
+.syntaxhighlighter.ie{font-size:.9em !important;padding:1px 0 1px 0 !important;}
+.syntaxhighlighter.ie .toolbar{line-height:8px !important;}
+.syntaxhighlighter.ie .toolbar a{padding-top:0px !important;}
+.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none !important;}
+.syntaxhighlighter.printing .line .number{color:#bbbbbb !important;}
+.syntaxhighlighter.printing .line .content{color:black !important;}
+.syntaxhighlighter.printing .toolbar{display:none !important;}
+.syntaxhighlighter.printing a{text-decoration:none !important;}
+.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black !important;}
+.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200 !important;}
+.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue !important;}
+.syntaxhighlighter.printing .keyword{color:#006699 !important;font-weight:bold !important;}
+.syntaxhighlighter.printing .preprocessor{color:gray !important;}
+.syntaxhighlighter.printing .variable{color:#aa7700 !important;}
+.syntaxhighlighter.printing .value{color:#009900 !important;}
+.syntaxhighlighter.printing .functions{color:#ff1493 !important;}
+.syntaxhighlighter.printing .constants{color:#0066cc !important;}
+.syntaxhighlighter.printing .script{font-weight:bold !important;}
+.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray !important;}
+.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493 !important;}
+.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red !important;}
+.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black !important;}
+/* Theming */
+.syntaxhighlighter { clear: both; width: auto!important; font-size: 13px !important; line-height: 21px !important; font-family: Courier, "Courier New", monospace; -webkit-border-radius: 4px; -moz-border-radius: 4px; -o-border-radius: 4px; border-radius: 4px; background-color: #fff !important; box-shadow: inset 0 0 3px rgba(0,0,0,0.3); -moz-box-shadow: inset 0 0 3px rgba(0,0,0,0.3); -webkit-box-shadow: inset 0 0 3px rgba(0,0,0,0.3);}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {color: #ff5454 !important;}
+.syntaxhighlighter .line.alt1,
+.syntaxhighlighter .line.alt2 {width: 100% !important; padding: 0 !important; background-color: #fff !important;}
+.syntaxhighlighter .line.highlighted.alt1,
+.syntaxhighlighter .line.highlighted.alt2 {background-color: #fff !important;}
+.syntaxhighlighter table td.code {width: auto !important; padding: 10px 12px!important;}
+.syntaxhighlighter table td.code .line {width: auto !important; padding: 0 !important;}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {color: #cc7ac6!important;}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {color: #888!important;}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {color: #999!important;}
+.syntaxhighlighter .keyword {color: #2a93b9!important;}
+/**/
+.syntaxhighlighter{background-color:white !important;}
+.syntaxhighlighter .line.alt1{background-color:white !important;}
+.syntaxhighlighter .line.alt2{background-color:white !important;}
+.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#e0e0e0 !important;}
+.syntaxhighlighter .line.highlighted.number{color:black !important;}
+.syntaxhighlighter table caption{color:black !important;}
+.syntaxhighlighter .gutter{color:#afafaf !important;}
+.syntaxhighlighter .gutter .line{border-right:3px solid #6ce26c !important;}
+.syntaxhighlighter .gutter .line.highlighted{background-color:#6ce26c !important;color:white !important;}
+.syntaxhighlighter.printing .line .content{border:none !important;}
+.syntaxhighlighter.collapsed{overflow:visible !important;}
+.syntaxhighlighter.collapsed .toolbar{color:blue !important;background:white !important;border:1px solid #6ce26c !important;}
+.syntaxhighlighter.collapsed .toolbar a{color:blue !important;}
+.syntaxhighlighter.collapsed .toolbar a:hover{color:red !important;}
+.syntaxhighlighter .toolbar{color:white !important;background:#6ce26c !important;border:none !important;}
+.syntaxhighlighter .toolbar a{color:white !important;}
+.syntaxhighlighter .toolbar a:hover{color:black !important;}
+.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black !important;}
+.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#008200 !important;}
+.syntaxhighlighter .string,.syntaxhighlighter .string a{color:blue !important;}
+.syntaxhighlighter .keyword{color:#006699 !important;}
+.syntaxhighlighter .preprocessor{color:gray !important;}
+.syntaxhighlighter .variable{color:#aa7700 !important;}
+.syntaxhighlighter .value{color:#009900 !important;}
+.syntaxhighlighter .functions{color:#ff1493 !important;}
+.syntaxhighlighter .constants{color:#0066cc !important;}
+.syntaxhighlighter .script{font-weight:bold !important;color:#006699 !important;background-color:none !important;}
+.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray !important;}
+.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493 !important;}
+.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red !important;}
+.syntaxhighlighter .keyword{font-weight:bold !important;}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/dynamic-carousel-min-max.html b/htmltest/sites/all/libraries/flexslider-version/demo/dynamic-carousel-min-max.html
new file mode 100644
index 00000000..f44c4c21
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/dynamic-carousel-min-max.html
@@ -0,0 +1,222 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+<head>
+	<meta content="charset=utf-8">
+	<title>FlexSlider 2</title>
+	<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
+
+  <!-- Demo CSS -->
+	<link rel="stylesheet" href="css/demo.css" type="text/css" media="screen" />
+	<link rel="stylesheet" href="../flexslider.css" type="text/css" media="screen" />
+
+	<!-- Modernizr -->
+  <script src="js/modernizr.js"></script>
+
+</head>
+<body class="loading">
+
+  <div id="container" class="cf">
+    <header role="navigation">
+      <a class="logo" href="http://www.woothemes.com" title="WooThemes">
+        <img src="images/logo.png" alt="WooThemes" />
+	  </a>
+      <h1>FlexSlider 2</h1>
+      <h2>The best responsive slider. Period.</h2>
+      <a class="button green" href="https://github.com/woothemes/FlexSlider/zipball/master">Download Flexslider</a>
+      <h3 class="header-nav">Other Examples</h3>
+      <nav>
+        <ul>
+          <li><a href="demo">Basic Slider</a></li>
+          <li><a href="thumbnail-controlnav.html">Slider w/thumbnail controlNav pattern</a></li>
+          <li><a href="thumbnail-slider.html">Slider w/thumbnail slider</a></li>
+          <li><a href="basic-carousel.html">Basic Carousel</a></li>
+          <li><a href="carousel-min-max.html">Carousel with min and max ranges</a></li>
+          <li class="active"><a href="dynamic-carousel-min-max.html">Carousel with dynamic min/max ranges</a></li>
+          <li><a href="video.html">Video & the api (vimeo)</a></li>
+          <li><a href="video-wistia.html">Video & the api (wistia)</a></li>
+        </ul>
+      </nav>
+    </header>
+
+	<div id="main" role="main">
+      <section class="slider">
+        <div class="flexslider carousel">
+          <ul class="slides">
+            <li>
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+            <li>
+              <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+            </li>
+            <li>
+              <img src="images/kitchen_adventurer_lemon.jpg" />
+            </li>
+            <li>
+              <img src="images/kitchen_adventurer_donut.jpg" />
+            </li>
+            <li>
+              <img src="images/kitchen_adventurer_caramel.jpg" />
+            </li>
+            <li>
+              <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+            </li>
+            <li>
+              <img src="images/kitchen_adventurer_lemon.jpg" />
+            </li>
+            <li>
+              <img src="images/kitchen_adventurer_donut.jpg" />
+            </li>
+            <li>
+              <img src="images/kitchen_adventurer_caramel.jpg" />
+            </li>
+          </ul>
+        </div>
+      </section>
+      <aside>
+        <div class="cf">
+          <h3>Carousel With Min &amp; Max Ranges</h3>
+          <ul class="toggle cf">
+            <li class="js"><a href="#view-js">JS</a></li>
+            <li class="html"><a href="#view-html">HTML</a></li>
+          </ul>
+        </div>
+        <div id="view-js" class="code">
+          <pre class="brush: js; toolbar: false; gutter: false;">
+            (function() {
+
+              // store the slider in a local variable
+              var $window = $(window),
+                  flexslider;
+
+              // tiny helper function to add breakpoints
+              function getGridSize() {
+                return (window.innerWidth < 600) ? 2 :
+                       (window.innerWidth < 900) ? 3 : 4;
+              }
+
+              $(function() {
+                SyntaxHighlighter.all();
+              });
+
+              $window.load(function() {
+                $('.flexslider').flexslider({
+                  animation: "slide",
+                  animationLoop: false,
+                  itemWidth: 210,
+                  itemMargin: 5,
+                  minItems: getGridSize(), // use function to pull in initial value
+                  maxItems: getGridSize() // use function to pull in initial value
+                });
+              });
+
+              // check grid size on resize event
+              $window.resize(function() {
+                var gridSize = getGridSize();
+
+                flexslider.vars.minItems = gridSize;
+                flexslider.vars.maxItems = gridSize;
+              });
+            }());
+          </pre>
+        </div>
+        <div id="view-html" class="code">
+          <pre class="brush: xml; toolbar: false; gutter: false;">
+            &lt;!-- Place somewhere in the &lt;body&gt; of your page -->
+            &lt;div class="flexslider">
+              &lt;ul class="slides">
+                &lt;li>
+                  &lt;img src="slide1.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide2.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide3.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide4.jpg" />
+                &lt;/li>
+                &lt;!-- items mirrored twice, total of 12 -->
+              &lt;/ul>
+            &lt;/div>
+          </pre>
+        </div>
+      </aside>
+    </div>
+
+  </div>
+
+  <!-- jQuery -->
+  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
+  <script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.min.js">\x3C/script>')</script>
+
+  <!-- FlexSlider -->
+  <script defer src="../jquery.flexslider.js"></script>
+
+  <script type="text/javascript">
+
+    (function() {
+
+      // store the slider in a local variable
+      var $window = $(window),
+          flexslider;
+
+      // tiny helper function to add breakpoints
+      function getGridSize() {
+        return (window.innerWidth < 600) ? 2 :
+               (window.innerWidth < 900) ? 3 : 4;
+      }
+
+      $(function() {
+        SyntaxHighlighter.all();
+      });
+
+      $window.load(function() {
+        $('.flexslider').flexslider({
+          animation: "slide",
+          animationSpeed: 400,
+          animationLoop: false,
+          itemWidth: 210,
+          itemMargin: 5,
+          minItems: getGridSize(), // use function to pull in initial value
+          maxItems: getGridSize(), // use function to pull in initial value
+          start: function(slider){
+            $('body').removeClass('loading');
+            flexslider = slider;
+          }
+        });
+      });
+
+      // check grid size on resize event
+      $window.resize(function() {
+        var gridSize = getGridSize();
+
+        flexslider.vars.minItems = gridSize;
+        flexslider.vars.maxItems = gridSize;
+      });
+    }());
+
+  </script>
+
+
+  <!-- Syntax Highlighter -->
+  <script type="text/javascript" src="js/shCore.js"></script>
+  <script type="text/javascript" src="js/shBrushXml.js"></script>
+  <script type="text/javascript" src="js/shBrushJScript.js"></script>
+
+  <!-- Optional FlexSlider Additions -->
+  <script src="js/jquery.easing.js"></script>
+  <script src="js/jquery.mousewheel.js"></script>
+  <script defer src="js/demo.js"></script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/eot/1110FC_0.eot b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/eot/1110FC_0.eot
new file mode 100644
index 00000000..01bb181f
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/eot/1110FC_0.eot differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/svg/1110FC_0.svg b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/svg/1110FC_0.svg
new file mode 100644
index 00000000..5cc54838
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/svg/1110FC_0.svg
@@ -0,0 +1,411 @@
+<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" > 
+<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
+<metadata version="1.0"><uniqueid id="com.myfonts.emtype.geogrotesque.medium.wfkit2.6JtN"/><vendor name="MyFonts" url="http://www.myfonts.com/"/><credits><credit name="Eduardo Manso" url="http://www.myfonts.com/person/manso/eduardo/"/></credits><description><text lang="en">This is a Webfont from MyFonts. Full information about this font:
+http://www.myfonts.com/fonts/emtype/geogrotesque/
+</text></description><license url="http://www.myfonts.com/viewlicense?lid=1146"/><copyright><text lang="en">Copyright (c) 2009 by Eduardo Manso. All rights reserved.</text></copyright><trademark><text lang="en">Geogrotesque is a trademark of Eduardo Manso.</text></trademark></metadata>
+<defs >
+<font id="wf" horiz-adv-x="418" ><font-face
+    font-family="Geogrotesque Md"
+    units-per-em="1000"
+    panose-1="2 0 0 0 0 0 0 0 0 0"
+    ascent="776"
+    descent="-224"
+    alphabetic="0" />
+<missing-glyph horiz-adv-x="854" d="M674 94Q570 -8 425 -8Q281 -8 179 94Q76 195 76 341Q76 485 179 588Q281 690 425 690Q572 690 674 588Q777 485 777 341T674 94ZM662 106Q761 205 761 341T662 576Q564 674 425 674Q289 674 191 576Q92 477 92 341Q92 204
+191 106Q289 8 425 8Q564 8 662 106ZM537 177L427 287L317 177Q304 164 290 178L261 207Q248 220 261 233L371 343L261 453Q247 467 260 480L289 509Q303 523 317 509L427 398L538 509Q552 522 564 510L593 481Q607 467 593 453L482 343L593 232Q606 219 592 205L563
+176Q550 164 537 177Z" />
+<glyph unicode=" " glyph-name="space" horiz-adv-x="211" />
+<glyph unicode="!" glyph-name="exclam" horiz-adv-x="264" d="M181 390L172 190Q171 171 154 171H110Q93 171 92 190L82 390V660Q82 680 101 680H163Q181 680 181 660V390ZM180 99V19Q180 0 162 0H101Q82 0 82 19V99Q82 118 101 118H162Q180 118 180 99Z" />
+<glyph unicode="&quot;" glyph-name="quotedbl" horiz-adv-x="392" d="M158 493Q158 473 140 473H99Q81 473 80 493L72 660Q71 680 91 680H148Q167 680 166 660L158 493ZM314 493Q314 473 295 473H254Q237 473 236 493L228 660Q227 680 246 680H303Q323 680 322
+660L314 493Z" />
+<glyph unicode="#" glyph-name="numbersign" horiz-adv-x="663" d="M95 271H171L198 365H139Q120 365 120 384V416Q120 434 139 434H217L242 522Q247 542 266 542H308Q327 542 322 522L297 434H437L462 522Q467 542 485 542H527Q546 542 541 522L516 434H568Q587
+434 587 416V384Q587 365 568 365H496L470 271H524Q543 271 543 253V221Q543 202 524 202H450L426 115Q420 95 403 95H360Q340 95 346 115L371 202H231L206 115Q200 95 183 95H141Q121 95 127 115L152 202H95Q76 202 76 221V253Q76 271 95 271ZM277 365L250 271H390L417
+365H277Z" />
+<glyph unicode="$" glyph-name="dollar" horiz-adv-x="532" d="M361 449V473Q361 526 266 526Q173 526 173 473V456Q173 424 215 410L365 358Q455 327 455 260V204Q455 161 421 129T317 87V20Q317 0 299 0H240Q221 0 221 20V86Q147 94 112 126T76 204V229Q76 247
+93 247H146Q163 247 163 229V208Q163 155 265 155T367 208V235Q367 265 314 283L164 335Q133 346 110 373T86 436V473Q86 518 118 551T221 593V660Q221 680 240 680H299Q317 680 317 660V593Q384 583 416 550T448 473V449Q448 431 430 431H378Q361 431 361 449Z"
+/>
+<glyph unicode="%" glyph-name="percent" horiz-adv-x="815" d="M76 481V585Q76 687 220 687T364 585V481Q364 378 220 378T76 481ZM285 484V582Q285 623 220 623T155 582V484Q155 443 220 443T285 484ZM660 97V195Q660 235 595 235T530 195V97Q530 55 595 55T660
+97ZM451 93V197Q451 300 595 300T739 197V93Q739 -9 595 -9T451 93ZM607 660L297 20Q287 0 270 0H220Q212 0 210 7T211 20L522 660Q531 680 549 680H598Q607 680 609 674T607 660Z" />
+<glyph unicode="&amp;" glyph-name="ampersand" horiz-adv-x="682" d="M297 396H625Q644 396 644 377V334Q644 315 625 315H557V145Q557 76 501 34T316 -8Q76 -8 76 142V243Q76 333 165 358Q120 371 102 397T84 466V538Q84 688 292 688Q502 688 502 535V509Q502
+490 484 490H425Q407 490 407 509V522Q407 565 381 586T293 607T206 586T180 522V480Q180 437 206 417T297 396ZM172 73T317 73T462 158V315H289Q225 315 199 295T172 231V158Q172 73 317 73Z" />
+<glyph unicode="&apos;" glyph-name="quotesingle" horiz-adv-x="236" d="M166 660L158 493Q157 473 140 473H99Q81 473 80 493L72 660Q71 680 91 680H148Q167 680 166 660Z" />
+<glyph unicode="(" glyph-name="parenleft" horiz-adv-x="355" d="M76 -81V571Q76 708 274 708H282Q301 708 301 689V647Q301 627 282 627H274Q220 627 197 611T174 561V-71Q174 -104 197 -120T274 -137H282Q301 -137 301 -157V-199Q301 -218 282 -218H274Q76
+-218 76 -81Z" />
+<glyph unicode=")" glyph-name="parenright" horiz-adv-x="355" d="M278 571V-81Q278 -218 80 -218H73Q54 -218 54 -199V-157Q54 -137 73 -137H80Q134 -137 157 -121T180 -71V561Q180 594 157 610T80 627H73Q54 627 54 647V689Q54 708 73 708H80Q278 708 278 571Z" />
+<glyph unicode="*" glyph-name="asterisk" horiz-adv-x="523" d="M256 322Q237 322 238 342L244 467L135 396Q119 386 109 404L95 431Q86 449 103 457L212 512L103 569Q87 578 95 594L109 622Q118 640 135 629L245 558L238 690Q237 709 257 709H287Q306 709 305
+690L298 559L406 629Q423 640 432 622L446 594Q455 578 438 569L329 512L438 457Q455 448 446 431L432 403Q423 385 406 396L299 465L305 342Q306 322 287 322H256Z" />
+<glyph unicode="+" glyph-name="plus" horiz-adv-x="571" d="M245 143V298H90Q71 298 71 317V360Q71 379 90 379H245V534Q245 554 263 554H305Q324 554 324 534V379H481Q500 379 500 360V317Q500 298 481 298H324V143Q324 124 305 124H263Q245 124 245 143Z" />
+<glyph unicode="," glyph-name="comma" horiz-adv-x="232" d="M75 35V99Q75 118 93 118H154Q172 118 172 99V30Q172 -70 53 -103Q35 -107 29 -91L15 -50Q8 -32 27 -26Q75 -7 75 35Z" />
+<glyph unicode="-" glyph-name="hyphen" horiz-adv-x="448" d="M90 328H358Q377 328 377 310V268Q377 250 358 250H90Q71 250 71 268V310Q71 328 90 328Z" />
+<glyph unicode="." glyph-name="period" horiz-adv-x="233" d="M165 99V19Q165 0 147 0H87Q68 0 68 19V99Q68 118 87 118H147Q165 118 165 99Z" />
+<glyph unicode="/" glyph-name="slash" horiz-adv-x="368" d="M344 679L136 -128Q130 -148 113 -148H49Q29 -148 34 -128L243 679Q248 699 265 699H330Q349 699 344 679Z" />
+<glyph unicode="0" glyph-name="zero" horiz-adv-x="550" d="M58 146V534Q58 603 108 645T275 688Q392 688 442 646T493 534V146Q493 77 443 35T275 -8Q159 -8 109 34T58 146ZM395 162V518Q395 605 275 605Q211 605 184 583T156 518V162Q156 119 183 97T275 75Q395
+75 395 162Z" />
+<glyph unicode="1" glyph-name="one" horiz-adv-x="550" d="M90 636L319 685Q326 687 331 683T337 667V83H484Q503 83 503 65V19Q503 0 484 0H89Q70 0 70 19V65Q70 83 89 83H239V578L90 549Q71 546 71 565V614Q71 631 90 636Z" />
+<glyph unicode="2" glyph-name="two" horiz-adv-x="550" d="M173 83H477Q496 83 496 65V19Q496 0 477 0H94Q75 0 75 19V209Q75 230 82 246T102 272T126 288T151 299L345 371Q396 390 396 436V519Q396 562 369 584T277 606T186 584T159 519V476Q159 456 141 456H83Q64
+456 64 476V534Q64 688 277 688Q493 688 493 534V438Q493 336 401 302L231 241Q214 235 204 230T183 211T173 179V83Z" />
+<glyph unicode="3" glyph-name="three" horiz-adv-x="550" d="M189 396H266Q330 396 356 416T382 480V522Q382 565 357 586T270 607Q207 607 182 586T156 522V509Q156 490 137 490H79Q61 490 61 509V535Q61 688 271 688Q479 688 479 538V466Q479 423 461 397T397
+358Q486 333 486 243V142Q486 -8 272 -8Q56 -8 56 145V171Q56 190 74 190H133Q151 190 151 171V158Q151 73 271 73Q390 73 390 158V231Q390 274 364 294T273 315H189Q170 315 170 334V377Q170 396 189 396Z" />
+<glyph unicode="4" glyph-name="four" horiz-adv-x="550" d="M271 660L142 285H377V660Q377 680 396 680H457Q475 680 475 660V20Q475 0 457 0H396Q377 0 377 20V202H60Q41 202 41 221V261Q41 270 46 287L173 660Q179 680 196 680H257Q278 680 271 660Z" />
+<glyph unicode="5" glyph-name="five" horiz-adv-x="550" d="M103 680H450Q470 680 470 661V616Q470 597 450 597H183V425H274Q382 425 435 386T488 280V144Q488 -9 276 -9T64 144V170Q64 190 83 190H141Q160 190 160 170V158Q160 115 186 94T275 72Q339 72 364
+93T390 158V266Q390 344 273 344H103Q85 344 85 364V660Q85 680 103 680Z" />
+<glyph unicode="6" glyph-name="six" horiz-adv-x="550" d="M64 146V538Q64 603 112 645T275 688Q483 688 483 538V516Q483 497 464 497H406Q388 497 388 516V524Q388 607 275 607Q161 607 161 524V368Q200 410 289 410Q396 410 443 368T490 256V146Q490 -8 277
+-8T64 146ZM393 159V242Q393 286 367 307T277 329Q161 329 161 250V159Q161 116 187 95T277 73T367 94T393 159Z" />
+<glyph unicode="7" glyph-name="seven" horiz-adv-x="550" d="M68 680H488Q507 680 507 661V621Q507 610 503 601L253 20Q244 0 229 0H159Q137 0 146 20L396 597H68Q48 597 48 616V661Q48 680 68 680Z" />
+<glyph unicode="8" glyph-name="eight" horiz-adv-x="550" d="M72 469V534Q72 605 116 646T275 688T434 647T478 534V469Q478 383 394 358Q487 332 487 246V146Q487 -8 275 -8T63 146V246Q63 332 156 358Q72 383 72 469ZM391 159V231Q391 274 365 295T275 317T186
+296T160 231V159Q160 116 185 95T275 73T365 94T391 159ZM383 484V521Q383 565 360 586T275 607T191 586T168 521V484Q168 439 190 418T275 397T360 418T383 484Z" />
+<glyph unicode="9" glyph-name="nine" horiz-adv-x="550" d="M486 534V142Q486 77 439 35T276 -8Q68 -8 68 142V164Q68 183 87 183H145Q163 183 163 164V156Q163 116 188 95T276 73Q338 73 363 94T389 156V311Q351 270 261 270Q155 270 108 313T60 424V534Q60
+688 274 688Q486 688 486 534ZM389 434V521Q389 564 363 585T274 607Q210 607 184 586T157 521V438Q157 394 183 373T274 351Q336 351 362 372T389 434Z" />
+<glyph unicode=":" glyph-name="colon" horiz-adv-x="233" d="M165 99V19Q165 0 147 0H87Q68 0 68 19V99Q68 118 87 118H147Q165 118 165 99ZM165 476V396Q165 377 147 377H87Q68 377 68 396V476Q68 496 87 496H147Q165 496 165 476Z" />
+<glyph unicode=";" glyph-name="semicolon" horiz-adv-x="278" d="M218 476V396Q218 377 200 377H140Q121 377 121 396V476Q121 496 140 496H200Q218 496 218 476ZM121 35V99Q121 118 140 118H200Q218 118 218 99V30Q218 -70 99 -103Q81 -107 75 -91L61 -50Q54
+-32 73 -26Q100 -15 110 -1T121 35Z" />
+<glyph unicode="&lt;" glyph-name="less" horiz-adv-x="532" d="M442 455L164 339L442 225Q461 217 461 203V147Q461 136 456 131T442 130L88 286Q71 294 71 307V372Q71 386 88 393L442 550Q451 554 456 549T461 532V476Q461 467 457 463T442 455Z" />
+<glyph unicode="=" glyph-name="equal" horiz-adv-x="585" d="M90 462H495Q514 462 514 444V401Q514 382 495 382H90Q71 382 71 401V444Q71 462 90 462ZM90 272H495Q514 272 514 254V211Q514 192 495 192H90Q71 192 71 211V254Q71 272 90 272Z" />
+<glyph unicode="&gt;" glyph-name="greater" horiz-adv-x="532" d="M368 339L90 453Q71 461 71 475V533Q71 544 76 549T90 551L444 394Q461 387 461 373V306Q461 292 444 285L90 128Q81 124 76 129T71 146V204Q71 214 75 218T90 226L368 339Z" />
+<glyph unicode="?" glyph-name="question" horiz-adv-x="566" d="M215 190V264Q215 325 279 357L359 398Q404 423 404 468V519Q404 606 282 606T160 519V476Q160 456 142 456H84Q65 456 65 476V534Q65 603 115 645T282 688Q499 688 501 534V471Q501 372 414 330L359
+304Q313 282 313 240V190Q313 171 295 171H233Q215 171 215 190ZM313 99V19Q313 0 295 0H233Q215 0 215 19V99Q215 118 233 118H295Q313 118 313 99Z" />
+<glyph unicode="@" glyph-name="at" horiz-adv-x="895" d="M628 -134H448Q358 -134 291 -123T185 -94T122 -49T90 4T82 64V439Q82 472 90 498T122 551T185 596T291 625T448 636T604 625T710 596T774 552T806 499T814 439V177Q814 33 660 33Q562 33 533 96Q459
+33 373 33Q253 33 253 146Q253 161 254 169L269 322Q282 458 407 458Q476 458 546 405L550 431Q553 450 571 450H622Q639 450 638 431L614 195Q605 104 666 104Q721 104 721 190V435Q721 475 700 500T617 542T448 558Q292 558 233 527T174 435V68Q174 7 233 -24T448
+-55H628Q647 -55 647 -74V-115Q647 -134 628 -134ZM360 304L349 193Q348 184 348 173Q348 122 412 122Q457 122 519 159V170L536 330Q482 373 435 373Q366 373 360 304Z" />
+<glyph unicode="A" glyph-name="A" horiz-adv-x="538" d="M244 680H306Q324 680 330 661L524 19Q530 0 509 0H446Q429 0 424 19L377 174H166L120 19Q115 0 98 0H40Q20 0 26 19L220 661Q226 680 244 680ZM356 252L300 434Q292 458 283 511T273 580Q273 579 269
+551T258 489T245 436L188 252H356Z" />
+<glyph unicode="B" glyph-name="B" horiz-adv-x="587" d="M306 0H100Q82 0 82 20V660Q82 680 100 680H277Q504 680 504 535V472Q504 389 420 357Q533 326 533 235V150Q533 0 306 0ZM306 311H179V81H306Q436 81 436 167V228Q436 311 306 311ZM277 599H179V387H284Q407
+387 407 474V520Q407 561 376 580T277 599Z" />
+<glyph unicode="C" glyph-name="C" horiz-adv-x="559" d="M513 209V146Q513 -8 292 -8T71 146V534Q71 688 292 688T513 534V485Q513 465 495 465H437Q418 465 418 485V518Q418 605 293 605Q169 605 169 518V162Q169 75 293 75Q418 75 418 162V209Q418 228 437
+228H495Q513 228 513 209Z" />
+<glyph unicode="D" glyph-name="D" horiz-adv-x="608" d="M309 0H98Q82 0 82 20V660Q82 680 100 680H309Q429 680 483 637T537 526V154Q537 86 483 43T309 0ZM309 597H179V83H309Q439 83 439 170V510Q439 597 309 597Z" />
+<glyph unicode="E" glyph-name="E" horiz-adv-x="519" d="M453 0H100Q82 0 82 20V660Q82 680 100 680H442Q461 680 461 661V616Q461 597 442 597H179V395H424Q444 395 444 376V333Q444 314 424 314H179V83H453Q472 83 472 65V19Q472 0 453 0Z" />
+<glyph unicode="F" glyph-name="F" horiz-adv-x="524" d="M100 680H467Q486 680 486 661V616Q486 597 467 597H179V394H449Q468 394 468 375V329Q468 310 449 310H179V20Q179 0 161 0H100Q82 0 82 20V660Q82 680 100 680Z" />
+<glyph unicode="G" glyph-name="G" horiz-adv-x="573" d="M299 340H494Q513 340 513 322V146Q513 -8 292 -8T71 146V534Q71 688 292 688T513 534V490Q513 471 495 471H437Q418 471 418 490V518Q418 605 293 605Q169 605 169 518V162Q169 75 293 75Q418 75 418
+161V257H299Q280 257 280 276V322Q280 340 299 340Z" />
+<glyph unicode="H" glyph-name="H" horiz-adv-x="619" d="M179 660V397H439V660Q439 680 457 680H519Q537 680 537 660V20Q537 0 519 0H457Q439 0 439 20V314H179V20Q179 0 161 0H100Q82 0 82 20V660Q82 680 100 680H161Q179 680 179 660Z" />
+<glyph unicode="I" glyph-name="I" horiz-adv-x="261" d="M179 660V20Q179 0 161 0H100Q82 0 82 20V660Q82 680 100 680H161Q179 680 179 660Z" />
+<glyph unicode="J" glyph-name="J" horiz-adv-x="504" d="M120 197V162Q120 119 144 97T227 75Q284 75 307 97T330 162V660Q330 680 348 680H409Q428 680 428 660V146Q428 -8 227 -8Q24 -8 24 146V197Q24 217 43 217H102Q120 217 120 197Z" />
+<glyph unicode="K" glyph-name="K" horiz-adv-x="564" d="M287 345L546 19Q552 12 549 6T537 0H458Q442 0 429 19L205 302H180V19Q180 0 161 0H100Q82 0 82 19V661Q82 680 100 680H161Q180 680 180 661V375H204L413 661Q428 680 444 680H510Q520 680 522 674T519
+661L287 345Z" />
+<glyph unicode="L" glyph-name="L" horiz-adv-x="485" d="M180 660V83H436Q455 83 455 65V19Q455 0 436 0H98Q82 0 82 20V660Q82 680 101 680H162Q180 680 180 660Z" />
+<glyph unicode="M" glyph-name="M" horiz-adv-x="734" d="M653 661V19Q653 0 635 0H576Q558 0 558 19V478Q558 477 549 448T534 404L418 123Q410 103 393 103H341Q325 103 317 123L193 416Q190 424 186 434T180 453T176 468L174 476V19Q174 0 156 0H100Q82 0 82
+19V661Q82 680 100 680H156Q168 680 173 669L346 267Q361 230 367 207Q371 221 389 266L559 671Q563 680 576 680H635Q653 680 653 661Z" />
+<glyph unicode="N" glyph-name="N" horiz-adv-x="618" d="M536 661V19Q536 0 518 0H463Q451 0 445 9L210 421Q202 434 195 447T185 469T178 486L174 493V19Q174 0 156 0H100Q82 0 82 19V661Q82 680 100 680H156Q167 680 172 672L413 251L444 187V661Q444 680 463
+680H518Q536 680 536 661Z" />
+<glyph unicode="O" glyph-name="O" horiz-adv-x="597" d="M71 146V534Q71 602 124 645T298 688T472 645T526 534V146Q526 78 472 35T298 -8T125 35T71 146ZM428 162V518Q428 605 298 605Q169 605 169 518V162Q169 75 298 75Q428 75 428 162Z" />
+<glyph unicode="P" glyph-name="P" horiz-adv-x="572" d="M303 253H179V20Q179 0 161 0H100Q82 0 82 20V660Q82 680 100 680H303Q423 680 476 637T530 526V407Q530 339 477 296T303 253ZM303 597H179V336H303Q433 336 433 423V510Q433 597 303 597Z" />
+<glyph unicode="Q" glyph-name="Q" horiz-adv-x="596" d="M526 534V146Q526 26 381 -1L504 -111Q519 -125 506 -138L475 -172Q463 -186 449 -173L270 -7Q165 -2 118 39T71 146V534Q71 602 124 645T298 688T472 645T526 534ZM169 520V160Q169 73 298 73Q428 73
+428 160V520Q428 607 298 607Q169 607 169 520Z" />
+<glyph unicode="R" glyph-name="R" horiz-adv-x="594" d="M303 269H179V20Q179 0 161 0H100Q82 0 82 20V660Q82 680 100 680H303Q423 680 476 637T530 526V422Q530 315 413 282L533 20Q537 11 532 6T515 0H455Q443 0 435 16Q434 17 434 18T433 20L320 269H303ZM303
+597H179V352H303Q433 352 433 439V510Q433 597 303 597Z" />
+<glyph unicode="S" glyph-name="S" horiz-adv-x="568" d="M410 490V521Q410 606 289 606T168 521V501Q168 453 219 434L401 365Q511 323 511 229V146Q511 78 458 35T287 -8T116 35T62 146V204Q62 224 81 224H140Q158 224 158 204V159Q158 74 286 74Q415 74 415
+159V206Q415 229 401 246T372 271T331 288L162 353Q126 367 100 400T73 477V534Q73 602 123 645T288 688T453 645T505 534V490Q505 471 487 471H428Q410 471 410 490Z" />
+<glyph unicode="T" glyph-name="T" horiz-adv-x="487" d="M34 680H452Q471 680 471 661V616Q471 597 452 597H292V20Q292 0 274 0H212Q194 0 194 20V597H34Q15 597 15 616V661Q15 680 34 680Z" />
+<glyph unicode="U" glyph-name="U" horiz-adv-x="607" d="M174 660V162Q174 75 303 75Q434 75 434 162V660Q434 680 452 680H513Q531 680 531 660V146Q531 78 477 35T303 -8T130 35T76 146V660Q76 680 95 680H156Q174 680 174 660Z" />
+<glyph unicode="V" glyph-name="V" horiz-adv-x="538" d="M306 0H244Q226 0 220 19L26 661Q20 680 40 680H107Q123 680 129 661L253 246Q259 227 264 197T273 145L276 124Q290 208 301 244L426 661Q432 680 448 680H509Q530 680 524 661L330 19Q324 0 306 0Z" />
+<glyph unicode="W" glyph-name="W" horiz-adv-x="817" d="M468 661L572 245Q576 227 580 207T586 172L588 158Q588 159 590 169T594 192T599 220T605 245L711 661Q716 680 733 680H787Q805 680 801 661L639 19Q635 0 615 0H555Q538 0 533 19L426 443Q422 457 413
+521Q406 470 399 442L291 19Q287 0 268 0H208Q191 0 186 19L23 661Q19 680 38 680H100Q118 680 123 661L227 245L243 167Q248 199 260 245L366 661Q371 680 388 680H445Q463 680 468 661Z" />
+<glyph unicode="X" glyph-name="X" horiz-adv-x="561" d="M337 347L529 19Q533 12 531 6T519 0H448Q431 0 420 19L277 261L142 19Q131 0 115 0H49Q40 0 38 7T40 22L227 349L46 659Q33 680 54 680H125Q141 680 153 661L289 430L418 661Q428 680 445 680H511Q530
+680 520 661L337 347Z" />
+<glyph unicode="Y" glyph-name="Y" horiz-adv-x="529" d="M134 661L259 397Q270 370 275 352Q275 354 280 371T291 397L424 661Q434 680 446 680H507Q530 680 520 661L324 270V19Q324 0 306 0H245Q226 0 226 19V259L28 661Q18 680 42 680H111Q124 680 134 661Z" />
+<glyph unicode="Z" glyph-name="Z" horiz-adv-x="500" d="M79 680H431Q451 680 451 661V618Q451 609 447 601L160 83H448Q467 83 467 65V19Q467 0 448 0H62Q43 0 43 19V65Q43 72 48 82L332 597H79Q60 597 60 616V661Q60 680 79 680Z" />
+<glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="378" d="M76 -191V679Q76 699 95 699H299Q318 699 318 680V635Q318 616 299 616H174V-128H299Q318 -128 318 -147V-192Q318 -211 299 -211H95Q76 -211 76 -191Z" />
+<glyph unicode="\" glyph-name="backslash" horiz-adv-x="368" d="M243 -128L34 679Q29 699 49 699H113Q131 699 136 679L344 -128Q349 -148 330 -148H265Q249 -148 243 -128Z" />
+<glyph unicode="]" glyph-name="bracketright" horiz-adv-x="378" d="M301 679V-191Q301 -211 283 -211H79Q60 -211 60 -192V-147Q60 -128 79 -128H203V616H79Q60 616 60 635V680Q60 699 79 699H283Q301 699 301 679Z" />
+<glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="565" d="M401 308L285 584L171 308Q163 288 150 288H93Q83 288 78 293T76 308L232 662Q241 680 253 680H318Q332 680 339 662L496 308Q500 299 495 294T479 288H422Q409 288 401 308Z" />
+<glyph unicode="_" glyph-name="underscore" horiz-adv-x="443" d="M41 -80H402Q421 -80 421 -98V-141Q421 -160 402 -160H41Q22 -160 22 -141V-98Q22 -80 41 -80Z" />
+<glyph unicode="`" glyph-name="grave" horiz-adv-x="324" d="M170 577L94 689Q80 708 103 708H165Q181 708 191 690L250 583Q260 565 241 565H194Q180 565 170 577Z" />
+<glyph unicode="a" glyph-name="a" horiz-adv-x="510" d="M67 354V369Q67 504 256 504T445 369V20Q445 0 427 0H375Q357 0 356 20L354 49Q282 -8 196 -8Q129 -8 92 26T55 113V161Q55 213 91 247T194 282H352V359Q352 392 331 409T255 427Q200 427 178 411T156
+362V354Q156 334 137 334H85Q67 334 67 354ZM220 71Q287 71 352 122V208H214Q178 208 163 193T148 147V127Q148 71 220 71Z" />
+<glyph unicode="b" glyph-name="b" horiz-adv-x="531" d="M143 0H90Q71 0 71 20V679Q71 699 90 699H148Q166 699 166 679V447Q241 504 330 504Q401 504 436 468T471 368V128Q471 64 436 28T330 -8Q238 -8 164 50L162 20Q161 0 143 0ZM376 143V353Q376 418 302
+418Q233 418 166 366V129Q236 78 302 78Q376 78 376 143Z" />
+<glyph unicode="c" glyph-name="c" horiz-adv-x="484" d="M252 504Q443 504 443 367V349Q443 330 425 330H371Q352 330 352 349V360Q352 393 330 409T253 426Q199 426 177 410T155 360V136Q155 103 177 87T253 70Q308 70 330 86T352 136V156Q352 175 371 175H425Q443
+175 443 156V129Q443 -8 251 -8Q60 -8 60 129V367Q60 504 252 504Z" />
+<glyph unicode="d" glyph-name="d" horiz-adv-x="531" d="M369 20L367 50Q291 -8 201 -8Q130 -8 95 28T60 128V368Q60 432 95 468T201 504Q287 504 365 447V679Q365 699 383 699H441Q460 699 460 679V20Q460 0 441 0H388Q370 0 369 20ZM155 353V143Q155 78 229
+78Q295 78 365 129V366Q298 418 229 418Q155 418 155 353Z" />
+<glyph unicode="e" glyph-name="e" horiz-adv-x="495" d="M442 367V245Q442 227 425 227H153V135Q153 102 174 85T253 68T331 85T353 135V146Q353 165 372 165H423Q442 165 442 146V129Q442 -8 251 -8T60 129V367Q60 504 253 504Q442 504 442 367ZM153 361V298H353V361Q353
+428 253 428T153 361Z" />
+<glyph unicode="f" glyph-name="f" horiz-adv-x="333" d="M95 494H101V571Q101 708 300 708H307Q326 708 326 689V647Q326 627 307 627H300Q197 627 197 561V494H295Q314 494 314 476V436Q314 416 295 416H197V20Q197 0 178 0H120Q101 0 101 20V416H42Q24 416
+24 436V471Q24 489 42 490L95 494Z" />
+<glyph unicode="g" glyph-name="g" horiz-adv-x="531" d="M201 -8Q130 -8 95 28T60 128V368Q60 432 95 468T201 504Q294 504 367 444L369 476Q370 496 388 496H441Q460 496 460 476V-67Q460 -204 262 -204H124Q104 -204 104 -185V-143Q104 -124 124 -124H262Q365
+-124 365 -57V48Q289 -8 201 -8ZM155 353V143Q155 78 229 78Q295 78 365 129V366Q298 418 229 418Q155 418 155 353Z" />
+<glyph unicode="h" glyph-name="h" horiz-adv-x="536" d="M166 679V448Q237 504 330 504Q398 504 434 469T471 376V20Q471 0 453 0H395Q376 0 376 20V353Q376 419 302 419Q232 419 166 368V20Q166 0 148 0H90Q71 0 71 20V679Q71 699 90 699H148Q166 699 166 679Z" />
+<glyph unicode="i" glyph-name="i" horiz-adv-x="237" d="M166 476V20Q166 0 148 0H90Q71 0 71 20V476Q71 496 90 496H148Q166 496 166 476ZM166 679V589Q166 570 148 570H90Q71 570 71 589V679Q71 699 90 699H148Q166 699 166 679Z" />
+<glyph unicode="j" glyph-name="j" horiz-adv-x="236" d="M166 679V589Q166 570 148 570H89Q71 570 71 589V679Q71 699 89 699H148Q166 699 166 679ZM166 476V-67Q166 -204 -32 -204H-40Q-59 -204 -59 -185V-143Q-59 -124 -40 -124H-32Q71 -124 71 -57V476Q71
+496 89 496H147Q166 496 166 476Z" />
+<glyph unicode="k" glyph-name="k" horiz-adv-x="474" d="M271 281L467 19Q473 12 470 6T458 0H394Q380 0 365 19L195 242H166V19Q166 0 148 0H89Q71 0 71 19V680Q71 699 89 699H148Q166 699 166 680V314H194L345 477Q362 496 376 496H439Q449 496 452 490T448
+476L271 281Z" />
+<glyph unicode="l" glyph-name="l" horiz-adv-x="237" d="M166 679V20Q166 0 148 0H90Q71 0 71 20V679Q71 699 90 699H148Q166 699 166 679Z" />
+<glyph unicode="m" glyph-name="m" horiz-adv-x="830" d="M90 496H143Q161 496 162 477L164 445Q233 504 324 504Q419 504 452 436Q530 504 623 504Q691 504 728 469T765 376V20Q765 0 746 0H689Q669 0 669 20V353Q669 419 595 419Q522 419 464 367Q465 363 465
+354V20Q465 0 447 0H389Q370 0 370 20V353Q370 419 296 419Q226 419 166 368V20Q166 0 148 0H90Q71 0 71 20V477Q71 496 90 496Z" />
+<glyph unicode="n" glyph-name="n" horiz-adv-x="536" d="M90 496H143Q161 496 162 477L164 445Q233 504 330 504Q398 504 434 469T471 376V20Q471 0 453 0H395Q376 0 376 20V353Q376 419 302 419Q232 419 166 368V20Q166 0 148 0H90Q71 0 71 20V477Q71 496 90 496Z" />
+<glyph unicode="o" glyph-name="o" horiz-adv-x="520" d="M60 129V367Q60 431 109 467T260 504T411 468T460 367V129Q460 65 411 29T260 -8T109 28T60 129ZM365 137V359Q365 426 260 426T155 359V137Q155 70 260 70T365 137Z" />
+<glyph unicode="p" glyph-name="p" horiz-adv-x="531" d="M90 496H143Q161 496 162 476L164 445Q239 504 330 504Q401 504 436 468T471 368V128Q471 64 436 28T330 -8Q240 -8 166 48V-185Q166 -204 148 -204H90Q71 -204 71 -185V476Q71 496 90 496ZM376 143V353Q376
+418 302 418Q233 418 166 366V129Q236 78 302 78Q376 78 376 143Z" />
+<glyph unicode="q" glyph-name="q" horiz-adv-x="531" d="M367 445L369 476Q370 496 388 496H441Q460 496 460 476V-185Q460 -204 441 -204H383Q365 -204 365 -185V48Q289 -8 201 -8Q130 -8 95 28T60 128V368Q60 432 95 468T201 504Q289 504 367 445ZM155 353V143Q155
+78 229 78Q295 78 365 129V366Q298 418 229 418Q155 418 155 353Z" />
+<glyph unicode="r" glyph-name="r" horiz-adv-x="356" d="M321 504Q341 504 341 485V439Q341 421 321 419Q233 413 166 355V20Q166 0 148 0H90Q71 0 71 20V477Q71 496 90 496H143Q161 496 162 477L165 434Q235 504 321 504Z" />
+<glyph unicode="s" glyph-name="s" horiz-adv-x="468" d="M333 357V381Q333 434 238 434Q145 434 145 381V364Q145 332 187 318L337 266Q427 235 427 168V112Q427 61 380 27T237 -8Q141 -8 95 26T48 112V137Q48 155 65 155H118Q135 155 135 137V116Q135 63 237
+63T339 116V143Q339 173 286 191L136 243Q105 254 82 281T58 344V381Q58 433 101 468T239 504Q332 504 376 469T420 381V357Q420 339 402 339H350Q333 339 333 357Z" />
+<glyph unicode="t" glyph-name="t" horiz-adv-x="354" d="M191 494H294Q313 494 313 476V436Q313 416 294 416H191V147Q191 81 292 81H311Q330 81 330 61V19Q330 0 311 0H278Q177 0 136 33T95 137V416H40Q21 416 21 436V471Q21 489 40 490L89 494H95V595Q95 615
+114 615H173Q191 615 191 595V494Z" />
+<glyph unicode="u" glyph-name="u" horiz-adv-x="530" d="M368 19L366 49Q299 -8 206 -8Q139 -8 102 27T65 119V476Q65 496 83 496H141Q160 496 160 476V143Q160 77 234 77Q302 77 364 127V476Q364 496 382 496H441Q459 496 459 476V19Q459 0 441 0H387Q369 0 368 19Z" />
+<glyph unicode="v" glyph-name="v" horiz-adv-x="450" d="M262 0H195Q186 0 182 4T175 18L21 476Q15 496 38 496H99Q114 496 121 476L216 189Q224 164 231 115Q237 160 248 188L348 476Q355 496 369 496H424Q447 496 441 476L281 18Q278 8 275 4T262 0Z" />
+<glyph unicode="w" glyph-name="w" horiz-adv-x="681" d="M672 476L543 18Q540 8 536 4T523 0H454Q438 0 434 18L359 313Q349 345 349 363L337 313L252 18Q248 0 233 0H165Q149 0 145 18L21 476Q15 496 39 496H95Q112 496 117 476L200 165Q202 158 203 147T206
+129T208 120L219 165L305 476Q310 496 327 496H385Q401 496 406 476L484 165Q487 154 489 144T492 129T493 122Q493 130 503 165L586 476Q591 496 607 496H655Q678 496 672 476Z" />
+<glyph unicode="x" glyph-name="x" horiz-adv-x="468" d="M286 249L442 19Q447 12 445 6T432 0H368Q354 0 341 19L228 184L118 19Q105 0 91 0H35Q25 0 23 6T25 19L182 252L30 476Q24 484 27 490T40 496H104Q119 496 132 476L241 318L344 476Q357 496 372 496H429Q439
+496 441 490T438 476L286 249Z" />
+<glyph unicode="y" glyph-name="y" horiz-adv-x="450" d="M119 476L216 187Q220 175 223 159T229 130L231 118Q238 151 249 185L348 476Q354 496 370 496H424Q447 496 441 476L215 -185Q209 -204 194 -204H151Q127 -204 133 -185L189 -8L21 476Q15 496 38 496H97Q112
+496 119 476Z" />
+<glyph unicode="z" glyph-name="z" horiz-adv-x="451" d="M74 496H376Q395 496 395 477V437Q395 427 391 422L157 78H392Q411 78 411 60V19Q411 0 392 0H60Q41 0 41 19V60Q41 68 45 74L277 417H74Q55 417 55 436V477Q55 496 74 496Z" />
+<glyph unicode="{" glyph-name="braceleft" horiz-adv-x="449" d="M169 356V571Q169 708 367 708H375Q394 708 394 689V647Q394 627 375 627H367Q313 627 290 611T267 561V346Q267 270 194 249Q267 227 267 151V-71Q267 -104 290 -120T367 -137H375Q394 -137 394
+-157V-199Q394 -218 375 -218H367Q169 -218 169 -81V142Q169 209 74 209H73Q54 209 54 228V269Q54 289 73 289H74Q169 289 169 356Z" />
+<glyph unicode="|" glyph-name="bar" horiz-adv-x="261" d="M180 679V-191Q180 -211 162 -211H101Q82 -211 82 -191V679Q82 699 101 699H162Q180 699 180 679Z" />
+<glyph unicode="}" glyph-name="braceright" horiz-adv-x="449" d="M279 571V356Q279 289 374 289H375Q394 289 394 269V228Q394 209 375 209H374Q279 209 279 142V-81Q279 -218 81 -218H73Q54 -218 54 -199V-157Q54 -137 73 -137H81Q135 -137 158 -121T181 -71V151Q181
+227 254 249Q181 270 181 346V561Q181 594 158 610T81 627H73Q54 627 54 647V689Q54 708 73 708H81Q279 708 279 571Z" />
+<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="494" d="M163 270Q150 270 147 264T141 235L140 226Q139 209 119 209H89Q71 209 73 231L76 267Q79 311 102 332T154 354Q178 354 202 343L292 301Q322 287 335 287Q339 287 342 287T347 290T350 293T352
+299T353 305T354 314T356 325L357 332Q359 349 377 349H408Q425 349 424 327L421 291Q417 245 396 224T346 203Q319 203 290 216L198 259Q173 270 163 270Z" />
+<glyph unicode="&#xa0;" glyph-name="uni00A0" horiz-adv-x="211" />
+<glyph unicode="&#xa1;" glyph-name="exclamdown" horiz-adv-x="264" d="M82 106L91 306Q92 325 109 325H153Q170 325 171 306L181 106V-164Q181 -184 162 -184H100Q82 -184 82 -164V106ZM83 397V477Q83 496 101 496H162Q181 496 181 477V397Q181 378 162 378H101Q83
+378 83 397Z" />
+<glyph unicode="&#xa2;" glyph-name="cent" horiz-adv-x="536" d="M312 660V594Q459 579 459 459V441Q459 422 441 422H387Q368 422 368 441V452Q368 485 346 501T269 518Q215 518 193 502T171 452V228Q171 195 193 179T269 162Q324 162 346 178T368 228V248Q368
+267 387 267H441Q459 267 459 248V221Q459 101 312 86V20Q312 0 294 0H236Q217 0 217 20V86Q76 102 76 221V459Q76 577 217 593V660Q217 680 236 680H294Q312 680 312 660Z" />
+<glyph unicode="&#xa3;" glyph-name="sterling" horiz-adv-x="672" d="M250 378H385Q404 378 404 360V317Q404 298 385 298H250V81H431Q503 81 503 178V185Q503 205 522 205H577Q596 205 596 185V178Q596 78 560 39T455 0H95Q76 0 76 19V62Q76 81 95 81H152V298H95Q76
+298 76 317V360Q76 378 95 378H152V539Q152 688 360 688Q569 688 569 539V508Q569 488 551 488H494Q475 488 475 508V522Q475 565 450 585T361 605Q299 605 275 585T250 522V378Z" />
+<glyph unicode="&#xa4;" glyph-name="currency" horiz-adv-x="653" d="M95 306H135V373H95Q76 373 76 392V417Q76 435 95 435H135V534Q135 688 356 688T577 534V485Q577 465 559 465H501Q482 465 482 485V518Q482 605 357 605Q233 605 233 518V435H365Q384 435
+384 417V392Q384 373 365 373H233V306H365Q384 306 384 288V263Q384 244 365 244H233V162Q233 75 357 75Q482 75 482 162V209Q482 228 501 228H559Q577 228 577 209V146Q577 -8 356 -8T135 146V244H95Q76 244 76 263V288Q76 306 95 306Z" />
+<glyph unicode="&#xa5;" glyph-name="yen" horiz-adv-x="651" d="M530 250H384V19Q384 0 366 0H305Q286 0 286 19V250H140Q121 250 121 268V293Q121 312 140 312H260L227 379H140Q121 379 121 398V423Q121 441 140 441H196L88 661Q79 680 102 680H171Q185 680
+194 661L319 397L335 353Q342 380 351 397L484 661Q493 680 506 680H567Q590 680 580 661L469 441H530Q549 441 549 423V398Q549 379 530 379H438L405 312H530Q549 312 549 293V268Q549 250 530 250Z" />
+<glyph unicode="&#xa6;" glyph-name="brokenbar" horiz-adv-x="237" d="M166 660V334Q166 314 148 314H90Q71 314 71 334V660Q71 680 90 680H148Q166 680 166 660ZM166 135V-191Q166 -211 148 -211H90Q71 -211 71 -191V135Q71 155 90 155H148Q166 155 166 135Z" />
+<glyph unicode="&#xa7;" glyph-name="section" horiz-adv-x="550" d="M457 277V186Q457 167 439 167H387Q369 167 369 186V268Q369 308 320 322L179 365Q140 377 111 404T82 479V550Q82 613 128 650T276 688Q469 688 469 554V543Q469 524 450 524H399Q380 524
+380 543V558Q380 591 357 607T279 623T200 607T176 558V484Q176 452 235 433L366 394Q402 384 429 353T457 277ZM94 204V294Q94 313 112 313H164Q182 313 182 294V213Q182 191 197 177T231 158L372 116Q411 104 440 77T469 2V-69Q469 -132 423 -169T275 -207Q82
+-207 82 -73V-62Q82 -43 101 -43H152Q171 -43 171 -62V-78Q171 -111 194 -127T273 -143Q375 -143 375 -77V-3Q375 29 316 48L185 87Q149 97 122 128T94 204Z" />
+<glyph unicode="&#xa8;" glyph-name="dieresis" horiz-adv-x="348" d="M149 685V590Q149 571 131 571H96Q77 571 77 590V685Q77 704 96 704H131Q149 704 149 685ZM270 685V590Q270 571 252 571H217Q198 571 198 590V685Q198 704 217 704H252Q270 704 270 685Z" />
+<glyph unicode="&#xa9;" glyph-name="copyright" horiz-adv-x="749" d="M667 486V195Q667 152 657 120T617 57T527 9T374 -8T222 8T132 56T93 120T82 195V486Q82 529 92 561T132 624T222 671T374 688Q448 688 502 676T587 646T637 600T661 546T667 486ZM597 182V499Q597
+627 374 627Q152 627 152 498V182Q152 54 374 54Q597 54 597 182ZM375 548Q462 548 496 516T530 417V405Q530 386 511 386H464Q445 386 445 405V415Q445 449 430 465T375 482T321 466T306 415V265Q306 230 320 214T375 198T430 214T445 265V282Q445 302 464 302H511Q530
+302 530 282V262Q530 196 496 164T375 131Q289 131 255 163T220 262V417Q220 483 254 515T375 548Z" />
+<glyph unicode="&#xaa;" glyph-name="ordfeminine" horiz-adv-x="355" d="M63 598V607Q63 645 93 666T182 688Q300 688 300 604V398Q300 385 287 385H247Q234 385 233 398L231 413Q191 380 141 380Q98 380 77 401T55 454V481Q55 513 78 534T144 555H229V603Q229
+636 180 636T131 604V598Q131 585 118 585H77Q63 585 63 598ZM161 433Q198 433 229 461V507H158Q126 507 126 476V464Q126 433 161 433Z" />
+<glyph unicode="&#xab;" glyph-name="guillemotleft" horiz-adv-x="580" d="M491 337L365 245L491 154Q510 141 510 125V65Q510 55 504 52T491 54L307 190Q290 203 290 216V275Q290 287 307 300L491 437Q498 443 504 440T510 426V366Q510 352 491 337ZM271 337L145
+245L271 154Q290 141 290 125V65Q290 55 284 52T271 54L87 190Q70 203 70 216V275Q70 287 87 300L271 437Q278 443 284 440T290 426V366Q290 352 271 337Z" />
+<glyph unicode="&#xac;" glyph-name="logicalnot" horiz-adv-x="388" d="M75 268T75 317T109 400T193 435T276 401T311 317T277 234T193 199T110 233Z" />
+<glyph unicode="&#xad;" glyph-name="uni00AD" horiz-adv-x="448" d="M90 328H358Q377 328 377 310V268Q377 250 358 250H90Q71 250 71 268V310Q71 328 90 328Z" />
+<glyph unicode="&#xae;" glyph-name="registered" horiz-adv-x="632" d="M551 538V357Q551 207 317 207Q82 207 82 357V538Q82 688 317 688Q551 688 551 538ZM487 350V544Q487 630 317 630Q146 630 146 544V351Q146 264 317 264Q487 264 487 350ZM433 482Q433
+432 390 414L426 325Q431 311 413 311H374Q367 311 361 325L328 404H277V325Q277 311 264 311H225Q212 311 212 325V566Q212 580 225 580H330Q433 580 433 502V482ZM323 531H277V453H323Q342 453 354 461T367 484V499Q367 531 323 531Z" />
+<glyph unicode="&#xaf;" glyph-name="overscore" horiz-adv-x="412" d="M85 659H327Q346 659 346 641V605Q346 587 327 587H85Q65 587 65 605V641Q65 659 85 659Z" />
+<glyph unicode="&#xb0;" glyph-name="degree" d="M60 489V585Q60 635 94 661T209 687T324 661T358 585V489Q358 439 324 413T209 387T94 413T60 489ZM277 493V582Q277 623 209 623T141 582V493Q141 451 209 451T277 493Z" />
+<glyph unicode="&#xb1;" glyph-name="plusminus" horiz-adv-x="571" d="M245 231V341H90Q71 341 71 360V403Q71 421 90 421H245V531Q245 550 263 550H305Q324 550 324 531V421H481Q500 421 500 403V360Q500 341 481 341H324V231Q324 211 305 211H263Q245 211 245
+231ZM90 153H481Q500 153 500 134V92Q500 72 481 72H90Q71 72 71 92V134Q71 153 90 153Z" />
+<glyph unicode="&#xb2;" glyph-name="twosuperior" horiz-adv-x="380" d="M136 336H313Q327 336 327 322V289Q327 275 313 275H75Q62 275 62 289V399Q62 415 69 426T83 443T104 453L224 501Q251 512 251 537V581Q251 628 188 628Q126 628 126 581V557Q126 542
+113 542H67Q54 542 54 557V592Q54 634 85 661T188 688Q260 688 292 661T324 592V541Q324 475 268 453L161 410Q136 402 136 387V336Z" />
+<glyph unicode="&#xb3;" glyph-name="threesuperior" horiz-adv-x="379" d="M143 517H184Q246 517 246 563V583Q246 607 233 618T188 630Q129 630 129 583V577Q129 564 115 564H70Q56 564 56 577V594Q56 689 189 689Q320 689 320 595V552Q320 503 274 490Q325
+472 325 420V364Q325 271 190 271Q117 271 86 297T54 366V383Q54 396 67 396H112Q127 396 127 383V377Q127 330 189 330Q252 330 252 377V412Q252 458 190 458H143Q128 458 128 471V503Q128 517 143 517Z" />
+<glyph unicode="&#xb4;" glyph-name="acute" horiz-adv-x="324" d="M253 689L177 577Q170 565 153 565H107Q87 565 97 583L156 690Q166 708 182 708H244Q267 708 253 689Z" />
+<glyph unicode="&#xb5;" glyph-name="uni00B5" horiz-adv-x="530" d="M368 19L366 49Q299 -8 206 -8Q181 -8 155 -1L160 -184Q160 -204 142 -204H83Q65 -204 65 -184V476Q65 496 83 496H141Q160 496 160 476V143Q160 77 234 77Q302 77 364 127V476Q364 496 382
+496H441Q459 496 459 476V19Q459 0 441 0H387Q369 0 368 19Z" />
+<glyph unicode="&#xb6;" glyph-name="paragraph" horiz-adv-x="665" d="M409 661V-184Q409 -204 391 -204H330Q311 -204 311 -184V282H275Q168 282 125 316T82 413V549Q82 612 125 646T275 680H391Q409 680 409 661ZM584 660V-184Q584 -204 566 -204H505Q486 -204
+486 -184V660Q486 680 505 680H566Q584 680 584 660Z" />
+<glyph unicode="&#xb7;" glyph-name="middot" horiz-adv-x="233" d="M165 310V230Q165 211 147 211H87Q68 211 68 230V310Q68 329 87 329H147Q165 329 165 310Z" />
+<glyph unicode="&#xb8;" glyph-name="cedilla" horiz-adv-x="217" d="M103 -52H137Q174 -52 198 -72T222 -131Q222 -171 198 -191T137 -211H24Q5 -211 5 -192V-172Q5 -154 24 -154H123Q155 -154 155 -131Q155 -109 123 -109H57Q40 -109 34 -103T31 -85L55 7Q60
+25 77 24L104 21Q124 19 117 -2L103 -52Z" />
+<glyph unicode="&#xb9;" glyph-name="onesuperior" horiz-adv-x="375" d="M68 659L213 687Q219 688 222 686T226 674V336H308Q316 336 318 334T321 323V290Q321 276 308 276H68Q54 276 54 290V323Q54 336 68 336H151V614L68 600Q54 597 54 611V645Q54 656 68 659Z" />
+<glyph unicode="&#xba;" glyph-name="ordmasculine" horiz-adv-x="364" d="M54 465V602Q54 642 86 665T182 688Q245 688 277 665T309 602V465Q309 380 182 380Q54 380 54 465ZM236 473V595Q236 631 182 631Q127 631 127 595V473Q127 437 182 437Q236 437 236 473Z" />
+<glyph unicode="&#xbb;" glyph-name="guillemotright" horiz-adv-x="580" d="M309 161L435 253L309 344Q290 357 290 373V433Q290 443 296 446T309 444L493 308Q510 295 510 282V223Q510 211 493 198L309 61Q302 55 296 58T290 72V132Q290 146 309 161ZM89 161L215
+253L89 344Q70 357 70 373V433Q70 443 76 446T89 444L273 308Q290 295 290 282V223Q290 211 273 198L89 61Q82 55 76 58T70 72V132Q70 146 89 161Z" />
+<glyph unicode="&#xbc;" glyph-name="onequarter" horiz-adv-x="860" d="M681 394L611 175H732V394Q732 408 746 408H793Q807 408 807 394V14Q807 0 793 0H746Q732 0 732 14V115H547Q532 115 532 129V159Q532 164 534 170L606 394Q611 408 623 408H671Q686 408
+681 394ZM68 659L213 687Q219 688 222 686T226 674V336H308Q316 336 318 334T321 323V290Q321 276 308 276H68Q54 276 54 290V323Q54 336 68 336H151V616L68 600Q54 597 54 611V645Q54 656 68 659ZM579 715L389 -35Q385 -49 374 -49H324Q310 -49 313 -35L502 715Q505
+729 519 729H568Q582 729 579 715Z" />
+<glyph unicode="&#xbd;" glyph-name="onehalf" horiz-adv-x="871" d="M68 659L213 687Q219 688 222 686T226 674V336H308Q316 336 318 334T321 323V290Q321 276 308 276H68Q54 276 54 290V323Q54 336 68 336H151V616L68 600Q54 597 54 611V645Q54 656 68 659ZM571
+715L381 -35Q378 -49 366 -49H316Q302 -49 305 -35L495 715Q499 729 511 729H561Q574 729 571 715ZM627 61H804Q818 61 818 47V14Q818 0 804 0H566Q553 0 553 14V124Q553 140 560 151T574 168T595 178L715 226Q742 236 742 262V306Q742 353 679 353Q617 353 617
+306V282Q617 267 604 267H558Q544 267 544 282V317Q544 359 575 386T679 413T783 386T815 317V266Q815 200 759 178L652 135Q627 127 627 112V61Z" />
+<glyph unicode="&#xbe;" glyph-name="threequarters" horiz-adv-x="866" d="M143 516H184Q246 516 246 562V582Q246 606 233 617T188 629Q129 629 129 582V576Q129 563 115 563H70Q56 563 56 576V593Q56 688 189 688Q320 688 320 594V551Q320 502 274 489Q325
+471 325 419V363Q325 270 190 270Q117 270 86 296T54 365V382Q54 395 67 395H112Q127 395 127 382V376Q127 329 189 329Q252 329 252 376V411Q252 457 190 457H143Q128 457 128 470V502Q128 516 143 516ZM686 394L616 175H737V394Q737 408 751 408H798Q812 408
+812 394V14Q812 0 798 0H751Q737 0 737 14V115H552Q537 115 537 129V159Q537 164 539 170L611 394Q616 408 628 408H676Q691 408 686 394ZM585 715L395 -35Q392 -49 380 -49H330Q316 -49 319 -35L509 715Q513 729 525 729H575Q588 729 585 715Z" />
+<glyph unicode="&#xbf;" glyph-name="questiondown" horiz-adv-x="566" d="M351 306V232Q351 171 287 139L207 98Q162 73 162 28V-23Q162 -110 284 -110T406 -23V20Q406 40 424 40H482Q501 40 501 20V-38Q501 -107 451 -149T284 -192Q67 -192 65 -38V25Q65 124
+152 166L207 192Q253 214 253 256V306Q253 325 271 325H333Q351 325 351 306ZM253 397V477Q253 496 271 496H333Q351 496 351 477V397Q351 378 333 378H271Q253 378 253 397Z" />
+<glyph unicode="&#xc0;" glyph-name="Agrave" horiz-adv-x="538" d="M223 747L147 858Q141 866 143 872T156 878H218Q234 878 244 859L303 753Q313 734 294 734H247Q232 734 223 747ZM244 680H306Q324 680 330 661L524 19Q530 0 509 0H446Q429 0 424 19L377 174H166L120
+19Q115 0 98 0H40Q20 0 26 19L220 661Q226 680 244 680ZM356 252L300 434Q292 458 283 511T273 580Q273 579 269 551T258 489T245 436L188 252H356Z" />
+<glyph unicode="&#xc1;" glyph-name="Aacute" horiz-adv-x="538" d="M399 859L322 747Q315 735 298 735H252Q232 735 242 753L301 860Q311 878 327 878H389Q411 878 399 859ZM244 680H306Q324 680 330 661L524 19Q530 0 509 0H446Q429 0 424 19L377 174H166L120
+19Q115 0 98 0H40Q20 0 26 19L220 661Q226 680 244 680ZM356 252L300 434Q292 458 283 511T273 580Q273 579 269 551T258 489T245 436L188 252H356Z" />
+<glyph unicode="&#xc2;" glyph-name="Acircumflex" horiz-adv-x="538" d="M244 680H306Q324 680 330 661L524 19Q530 0 509 0H446Q429 0 424 19L377 174H166L120 19Q115 0 98 0H40Q20 0 26 19L220 661Q226 680 244 680ZM356 252L300 434Q292 458 283 511T273 580Q273
+579 269 551T258 489T245 436L188 252H356ZM275 820L234 753Q224 735 207 735H162Q152 735 150 740T152 753L227 859Q241 878 257 878H292Q308 878 322 859L397 753Q402 746 400 741T387 735H342Q327 735 316 753L275 820Z" />
+<glyph unicode="&#xc3;" glyph-name="Atilde" horiz-adv-x="538" d="M206 805Q193 805 190 798T187 767V760Q187 743 167 743H135Q117 743 119 765L121 797Q123 837 145 857T200 877Q233 877 259 861L302 835Q335 816 342 816Q354 816 357 824T361 854V861Q361
+878 382 878H413Q431 878 429 856L427 824Q425 784 403 764T347 744Q315 744 289 760L246 786Q213 805 206 805ZM244 680H306Q324 680 330 661L524 19Q530 0 509 0H446Q429 0 424 19L377 174H166L120 19Q115 0 98 0H40Q20 0 26 19L220 661Q226 680 244 680ZM356
+252L300 434Q292 458 283 511T273 580Q273 579 269 551T258 489T245 436L188 252H356Z" />
+<glyph unicode="&#xc4;" glyph-name="Adieresis" horiz-adv-x="538" d="M244 680H306Q324 680 330 661L524 19Q530 0 509 0H446Q429 0 424 19L377 174H166L120 19Q115 0 98 0H40Q20 0 26 19L220 661Q226 680 244 680ZM356 252L300 434Q292 458 283 511T273 580Q273
+579 269 551T258 489T245 436L188 252H356ZM250 853V758Q250 739 232 739H197Q179 739 179 758V853Q179 873 197 873H232Q250 873 250 853ZM371 853V758Q371 739 353 739H318Q300 739 300 758V853Q300 873 318 873H353Q371 873 371 853Z" />
+<glyph unicode="&#xc5;" glyph-name="Aring" horiz-adv-x="538" d="M244 680H306Q324 680 330 661L524 19Q530 0 509 0H446Q429 0 424 19L377 174H166L120 19Q115 0 98 0H40Q20 0 26 19L220 661Q226 680 244 680ZM356 252L300 434Q292 458 283 511T273 580Q273
+579 269 551T258 489T245 436L188 252H356ZM375 815V792Q375 759 350 738T275 716T201 737T175 792V815Q175 848 200 869T275 891T349 870T375 815ZM318 800V807Q318 841 275 841T232 807V800Q232 766 275 766T318 800Z" />
+<glyph unicode="&#xc6;" glyph-name="AE" horiz-adv-x="837" d="M430 680H764Q783 680 783 662V619Q783 600 764 600H502V393H747Q766 393 766 375V335Q766 316 747 316H502V80H776Q795 80 795 62V19Q795 0 776 0H430Q409 0 409 19V174H209L120 19Q109 0 97 0H40Q30
+0 26 5T26 19L403 661Q414 680 430 680ZM375 459L255 252H409V522Q400 504 375 459Z" />
+<glyph unicode="&#xc7;" glyph-name="Ccedilla" horiz-adv-x="559" d="M278 -52H312Q349 -52 373 -72T397 -131Q397 -171 373 -191T312 -211H199Q180 -211 180 -192V-172Q180 -154 199 -154H298Q330 -154 330 -131Q330 -109 298 -109H232Q214 -109 209 -103T206
+-85L227 -4Q71 17 71 146V534Q71 688 292 688T513 534V485Q513 465 495 465H437Q418 465 418 485V518Q418 605 293 605Q169 605 169 518V162Q169 75 293 75Q418 75 418 162V209Q418 228 437 228H495Q513 228 513 209V146Q513 -8 292 -8H290L278 -52Z" />
+<glyph unicode="&#xc8;" glyph-name="Egrave" horiz-adv-x="519" d="M236 747L160 858Q154 866 156 872T169 878H231Q247 878 257 859L316 753Q326 734 307 734H260Q245 734 236 747ZM453 0H100Q82 0 82 20V660Q82 680 100 680H442Q461 680 461 661V616Q461 597
+442 597H179V395H424Q444 395 444 376V333Q444 314 424 314H179V83H453Q472 83 472 65V19Q472 0 453 0Z" />
+<glyph unicode="&#xc9;" glyph-name="Eacute" horiz-adv-x="519" d="M453 0H100Q82 0 82 20V660Q82 680 100 680H442Q461 680 461 661V616Q461 597 442 597H179V395H424Q444 395 444 376V333Q444 314 424 314H179V83H453Q472 83 472 65V19Q472 0 453 0ZM383 859L306
+747Q299 735 282 735H236Q216 735 226 753L285 860Q295 878 311 878H373Q395 878 383 859Z" />
+<glyph unicode="&#xca;" glyph-name="Ecircumflex" horiz-adv-x="519" d="M260 820L219 753Q209 735 192 735H147Q137 735 135 740T137 753L212 859Q226 878 242 878H277Q293 878 307 859L382 753Q388 746 385 741T372 735H327Q312 735 301 753L260 820ZM453 0H100Q82
+0 82 20V660Q82 680 100 680H442Q461 680 461 661V616Q461 597 442 597H179V395H424Q444 395 444 376V333Q444 314 424 314H179V83H453Q472 83 472 65V19Q472 0 453 0Z" />
+<glyph unicode="&#xcb;" glyph-name="Edieresis" horiz-adv-x="519" d="M453 0H100Q82 0 82 20V660Q82 680 100 680H442Q461 680 461 661V616Q461 597 442 597H179V395H424Q444 395 444 376V333Q444 314 424 314H179V83H453Q472 83 472 65V19Q472 0 453 0ZM246
+853V758Q246 739 228 739H193Q175 739 175 758V853Q175 873 193 873H228Q246 873 246 853ZM367 853V758Q367 739 349 739H314Q296 739 296 758V853Q296 873 314 873H349Q367 873 367 853Z" />
+<glyph unicode="&#xcc;" glyph-name="Igrave" horiz-adv-x="261" d="M181 660V20Q181 0 163 0H102Q84 0 84 20V660Q84 680 102 680H163Q181 680 181 660ZM85 747L9 858Q3 866 5 872T18 878H80Q96 878 106 859L165 753Q175 734 156 734H109Q94 734 85 747Z" />
+<glyph unicode="&#xcd;" glyph-name="Iacute" horiz-adv-x="261" d="M179 660V20Q179 0 161 0H100Q82 0 82 20V660Q82 680 100 680H161Q179 680 179 660ZM251 859L174 747Q167 735 150 735H104Q84 735 94 753L153 860Q163 878 179 878H241Q263 878 251 859Z" />
+<glyph unicode="&#xce;" glyph-name="Icircumflex" horiz-adv-x="261" d="M181 660V20Q181 0 163 0H102Q84 0 84 20V660Q84 680 102 680H163Q181 680 181 660ZM133 820L92 753Q82 735 65 735H20Q10 735 8 740T10 753L85 859Q99 878 115 878H150Q166 878 180 859L255
+753Q260 746 258 741T245 735H200Q185 735 174 753L133 820Z" />
+<glyph unicode="&#xcf;" glyph-name="Idieresis" horiz-adv-x="261" d="M179 660V20Q179 0 161 0H100Q82 0 82 20V660Q82 680 100 680H161Q179 680 179 660ZM106 853V758Q106 739 88 739H53Q35 739 35 758V853Q35 873 53 873H88Q106 873 106 853ZM227 853V758Q227
+739 209 739H174Q156 739 156 758V853Q156 873 174 873H209Q227 873 227 853Z" />
+<glyph unicode="&#xd0;" glyph-name="Eth" horiz-adv-x="608" d="M309 0H98Q82 0 82 20V307H26Q7 307 7 325V361Q7 379 26 379H82V660Q82 680 100 680H309Q429 680 483 637T537 526V154Q537 86 483 43T309 0ZM309 597H179V379H294Q313 379 313 361V325Q313 307
+294 307H179V83H309Q439 83 439 170V510Q439 597 309 597Z" />
+<glyph unicode="&#xd1;" glyph-name="Ntilde" horiz-adv-x="618" d="M536 661V19Q536 0 518 0H463Q451 0 445 9L210 421Q202 434 195 447T185 469T178 486L174 493V19Q174 0 156 0H100Q82 0 82 19V661Q82 680 100 680H156Q167 680 172 672L413 251Q419 241 426
+226T438 199L444 187V661Q444 680 463 680H518Q536 680 536 661ZM241 805Q228 805 225 798T222 767V760Q222 743 202 743H170Q152 743 154 765L156 797Q158 837 180 857T235 877Q268 877 294 861L337 835Q370 816 377 816Q389 816 392 824T396 854V861Q396 878
+417 878H448Q466 878 464 856L462 824Q460 784 437 764T382 744T324 760L281 786Q248 805 241 805Z" />
+<glyph unicode="&#xd2;" glyph-name="Ograve" horiz-adv-x="597" d="M250 747L174 858Q168 866 170 872T183 878H245Q261 878 271 859L330 753Q340 734 321 734H274Q259 734 250 747ZM71 146V534Q71 602 124 645T298 688T472 645T526 534V146Q526 78 472 35T298
+-8T125 35T71 146ZM428 162V518Q428 605 298 605Q169 605 169 518V162Q169 75 298 75Q428 75 428 162Z" />
+<glyph unicode="&#xd3;" glyph-name="Oacute" horiz-adv-x="597" d="M410 859L333 747Q326 735 309 735H263Q243 735 253 753L312 860Q322 878 338 878H400Q422 878 410 859ZM71 146V534Q71 602 124 645T298 688T472 645T526 534V146Q526 78 472 35T298 -8T125
+35T71 146ZM428 162V518Q428 605 298 605Q169 605 169 518V162Q169 75 298 75Q428 75 428 162Z" />
+<glyph unicode="&#xd4;" glyph-name="Ocircumflex" horiz-adv-x="597" d="M298 820L257 753Q247 735 230 735H185Q175 735 173 740T175 753L250 859Q264 878 280 878H315Q331 878 345 859L420 753Q426 746 423 741T410 735H365Q350 735 339 753L298 820ZM71 146V534Q71
+602 124 645T298 688T472 645T526 534V146Q526 78 472 35T298 -8T125 35T71 146ZM428 162V518Q428 605 298 605Q169 605 169 518V162Q169 75 298 75Q428 75 428 162Z" />
+<glyph unicode="&#xd5;" glyph-name="Otilde" horiz-adv-x="597" d="M230 805Q217 805 214 798T211 767V760Q211 743 191 743H159Q141 743 143 765L145 797Q147 837 169 857T224 877Q257 877 283 861L326 835Q359 816 366 816Q378 816 381 824T385 854V861Q385
+878 406 878H437Q455 878 453 856L451 824Q449 784 427 764T371 744Q339 744 313 760L270 786Q237 805 230 805ZM71 146V534Q71 602 124 645T298 688T472 645T526 534V146Q526 78 472 35T298 -8T125 35T71 146ZM428 162V518Q428 605 298 605Q169 605 169 518V162Q169
+75 298 75Q428 75 428 162Z" />
+<glyph unicode="&#xd6;" glyph-name="Odieresis" horiz-adv-x="597" d="M71 146V534Q71 602 124 645T298 688T472 645T526 534V146Q526 78 472 35T298 -8T125 35T71 146ZM428 162V518Q428 605 298 605Q169 605 169 518V162Q169 75 298 75Q428 75 428 162ZM273
+853V758Q273 739 255 739H220Q202 739 202 758V853Q202 873 220 873H255Q273 873 273 853ZM394 853V758Q394 739 376 739H341Q323 739 323 758V853Q323 873 341 873H376Q394 873 394 853Z" />
+<glyph unicode="&#xd7;" glyph-name="multiply" horiz-adv-x="543" d="M344 149L266 283L131 206Q114 196 105 213L85 250Q75 266 92 276L227 353L149 488Q140 504 155 514L191 536Q207 546 217 528L295 393L431 471Q447 480 456 465L477 428Q487 411 470 401L334
+323L412 189Q422 173 405 163L369 142Q354 132 344 149Z" />
+<glyph unicode="&#xd8;" glyph-name="Oslash" horiz-adv-x="597" d="M71 145V533Q71 601 124 644T298 687Q385 687 440 662L450 681Q450 682 453 688T458 696T463 703T471 709T482 711H500Q519 711 504 681L481 637Q526 598 526 533V145Q526 77 472 34T298 -9Q209
+-9 152 17L143 -1Q127 -31 110 -31H94Q74 -31 89 -1L112 44Q71 82 71 145ZM428 161V517Q428 524 426 534L196 100Q228 74 298 74Q428 74 428 161ZM169 161V151L397 581Q363 604 298 604Q169 604 169 517V161Z" />
+<glyph unicode="&#xd9;" glyph-name="Ugrave" horiz-adv-x="608" d="M262 747L186 858Q180 866 182 872T195 878H257Q273 878 283 859L342 753Q352 734 333 734H286Q271 734 262 747ZM174 660V162Q174 75 303 75Q434 75 434 162V660Q434 680 452 680H513Q531 680
+531 660V146Q531 78 477 35T303 -8T130 35T76 146V660Q76 680 95 680H156Q174 680 174 660Z" />
+<glyph unicode="&#xda;" glyph-name="Uacute" horiz-adv-x="608" d="M174 660V162Q174 75 303 75Q434 75 434 162V660Q434 680 452 680H513Q531 680 531 660V146Q531 78 477 35T303 -8T130 35T76 146V660Q76 680 95 680H156Q174 680 174 660ZM423 859L346 747Q339
+735 322 735H276Q256 735 266 753L325 860Q335 878 351 878H413Q435 878 423 859Z" />
+<glyph unicode="&#xdb;" glyph-name="Ucircumflex" horiz-adv-x="608" d="M304 820L263 753Q253 735 236 735H191Q181 735 179 740T181 753L256 859Q270 878 286 878H321Q337 878 351 859L426 753Q432 746 429 741T416 735H371Q356 735 345 753L304 820ZM174 660V162Q174
+75 303 75Q434 75 434 162V660Q434 680 452 680H513Q531 680 531 660V146Q531 78 477 35T303 -8T130 35T76 146V660Q76 680 95 680H156Q174 680 174 660Z" />
+<glyph unicode="&#xdc;" glyph-name="Udieresis" horiz-adv-x="608" d="M174 660V162Q174 75 303 75Q434 75 434 162V660Q434 680 452 680H513Q531 680 531 660V146Q531 78 477 35T303 -8T130 35T76 146V660Q76 680 95 680H156Q174 680 174 660ZM279 853V758Q279
+739 261 739H226Q208 739 208 758V853Q208 873 226 873H261Q279 873 279 853ZM400 853V758Q400 739 382 739H347Q329 739 329 758V853Q329 873 347 873H382Q400 873 400 853Z" />
+<glyph unicode="&#xdd;" glyph-name="Yacute" horiz-adv-x="529" d="M134 661L259 397L275 353Q282 380 291 397L424 661Q434 680 446 680H507Q530 680 520 661L324 270V19Q324 0 306 0H245Q226 0 226 19V259L28 661Q18 680 42 680H111Q124 680 134 661ZM402 859L325
+747Q318 735 301 735H255Q235 735 245 753L304 860Q314 878 330 878H392Q414 878 402 859Z" />
+<glyph unicode="&#xde;" glyph-name="Thorn" horiz-adv-x="572" d="M180 661V496H303Q423 496 476 454T530 343V248Q530 180 477 138T303 95H180V19Q180 0 161 0H100Q82 0 82 19V661Q82 680 100 680H161Q180 680 180 661ZM303 415H180V176H303Q433 176 433 264V327Q433
+415 303 415Z" />
+<glyph unicode="&#xdf;" glyph-name="germandbls" horiz-adv-x="619" d="M197 564V20Q197 0 178 0H120Q101 0 101 20V416H42Q24 416 24 436V471Q24 488 42 490L95 494H101V571Q101 634 151 671T308 708Q515 708 515 571V534Q515 472 442 445L377 421Q336 406 336
+385V380Q336 355 381 336L498 287Q589 248 589 182V127Q589 63 550 28T416 -8Q323 -8 288 24T253 123V131Q253 151 272 151H312Q331 151 331 131V120Q331 88 349 72T416 56T483 72T502 120V164Q502 194 450 215L339 262Q315 272 300 282T270 315T255 368V388Q255
+421 276 443T326 475L378 494Q427 511 427 548V564Q427 634 312 634T197 564Z" />
+<glyph unicode="&#xe0;" glyph-name="agrave" horiz-adv-x="510" d="M229 577L153 689Q139 708 162 708H224Q240 708 250 690L309 583Q319 565 300 565H253Q239 565 229 577ZM67 354V369Q67 504 256 504T445 369V20Q445 0 427 0H375Q357 0 356 20L354 49Q282 -8
+196 -8Q129 -8 92 26T55 113V161Q55 213 91 247T194 282H352V359Q352 392 331 409T255 427Q200 427 178 411T156 362V354Q156 334 137 334H85Q67 334 67 354ZM220 71Q287 71 352 122V208H214Q178 208 163 193T148 147V127Q148 71 220 71Z" />
+<glyph unicode="&#xe1;" glyph-name="aacute" horiz-adv-x="510" d="M357 689L281 577Q274 565 257 565H211Q191 565 201 583L260 690Q270 708 286 708H348Q371 708 357 689ZM67 354V369Q67 504 256 504T445 369V20Q445 0 427 0H375Q357 0 356 20L354 49Q282 -8
+196 -8Q129 -8 92 26T55 113V161Q55 213 91 247T194 282H352V359Q352 392 331 409T255 427Q200 427 178 411T156 362V354Q156 334 137 334H85Q67 334 67 354ZM220 71Q287 71 352 122V208H214Q178 208 163 193T148 147V127Q148 71 220 71Z" />
+<glyph unicode="&#xe2;" glyph-name="acircumflex" horiz-adv-x="510" d="M257 650L215 583Q204 565 189 565H144Q134 565 132 570T134 583L209 689Q223 708 239 708H274Q290 708 304 689L379 583Q384 576 382 571T369 565H324Q309 565 298 583L257 650ZM67 354V369Q67
+504 256 504T445 369V20Q445 0 427 0H375Q357 0 356 20L354 49Q282 -8 196 -8Q129 -8 92 26T55 113V161Q55 213 91 247T194 282H352V359Q352 392 331 409T255 427Q200 427 178 411T156 362V354Q156 334 137 334H85Q67 334 67 354ZM220 71Q287 71 352 122V208H214Q178
+208 163 193T148 147V127Q148 71 220 71Z" />
+<glyph unicode="&#xe3;" glyph-name="atilde" horiz-adv-x="510" d="M190 628Q177 628 174 621T171 590V583Q171 566 151 566H119Q101 566 103 588L105 620Q107 660 129 680T184 700Q217 700 243 684L286 658Q319 639 326 639Q338 639 341 647T345 677V684Q345
+701 366 701H397Q415 701 413 679L411 647Q409 607 387 587T331 567Q299 567 273 583L230 609Q197 628 190 628ZM67 354V369Q67 504 256 504T445 369V20Q445 0 427 0H375Q357 0 356 20L354 49Q282 -8 196 -8Q129 -8 92 26T55 113V161Q55 213 91 247T194 282H352V359Q352
+392 331 409T255 427Q200 427 178 411T156 362V354Q156 334 137 334H85Q67 334 67 354ZM220 71Q287 71 352 122V208H214Q178 208 163 193T148 147V127Q148 71 220 71Z" />
+<glyph unicode="&#xe4;" glyph-name="adieresis" horiz-adv-x="510" d="M67 354V369Q67 504 256 504T445 369V20Q445 0 427 0H375Q357 0 356 20L354 49Q282 -8 196 -8Q129 -8 92 26T55 113V161Q55 213 91 247T194 282H352V359Q352 392 331 409T255 427Q200 427
+178 411T156 362V354Q156 334 137 334H85Q67 334 67 354ZM220 71Q287 71 352 122V208H214Q178 208 163 193T148 147V127Q148 71 220 71ZM231 685V590Q231 571 213 571H178Q159 571 159 590V685Q159 704 178 704H213Q231 704 231 685ZM352 685V590Q352 571 334 571H299Q280
+571 280 590V685Q280 704 299 704H334Q352 704 352 685Z" />
+<glyph unicode="&#xe5;" glyph-name="aring" horiz-adv-x="510" d="M67 354V369Q67 504 256 504T445 369V20Q445 0 427 0H375Q357 0 356 20L354 49Q282 -8 196 -8Q129 -8 92 26T55 113V161Q55 213 91 247T194 282H352V359Q352 392 331 409T255 427Q200 427 178
+411T156 362V354Q156 334 137 334H85Q67 334 67 354ZM220 71Q287 71 352 122V208H214Q178 208 163 193T148 147V127Q148 71 220 71ZM354 653V620Q354 588 330 569T258 550T187 569T162 620V653Q162 685 186 704T258 724T329 705T354 653ZM302 630V643Q302 676 258
+676T214 643V630Q214 597 258 597T302 630Z" />
+<glyph unicode="&#xe6;" glyph-name="ae" horiz-adv-x="787" d="M734 367V250Q734 232 716 232H444V130Q444 97 466 81T544 64Q645 64 645 132V145Q645 164 663 164H712Q731 164 731 145V128Q731 -8 544 -8Q410 -8 371 58Q289 -8 196 -8Q126 -8 91 26T55 113V155Q55
+208 91 242T194 276H351V370Q351 434 254 434Q200 434 178 417T155 367V354Q155 335 137 335H85Q66 335 66 354V370Q66 504 256 504Q361 504 396 451Q439 504 544 504Q734 504 734 367ZM219 67Q279 67 351 123V211H210Q148 211 148 151V125Q148 97 166 82T219 67ZM444
+363V297H645V363Q645 432 544 432Q444 432 444 363Z" />
+<glyph unicode="&#xe7;" glyph-name="ccedilla" horiz-adv-x="485" d="M236 -52H270Q307 -52 331 -72T355 -131Q355 -171 331 -191T270 -211H157Q138 -211 138 -192V-172Q138 -154 157 -154H256Q288 -154 288 -131Q288 -109 256 -109H190Q172 -109 167 -103T164
+-85L185 -3Q60 18 60 129V367Q60 504 252 504Q443 504 443 367V349Q443 330 425 330H371Q352 330 352 349V360Q352 393 330 409T253 426Q199 426 177 410T155 360V136Q155 103 177 87T253 70Q308 70 330 86T352 136V156Q352 175 371 175H425Q443 175 443 156V129Q443
+-8 251 -8H248L236 -52Z" />
+<glyph unicode="&#xe8;" glyph-name="egrave" horiz-adv-x="495" d="M212 577L136 689Q122 708 145 708H207Q223 708 233 690L292 583Q302 565 283 565H236Q222 565 212 577ZM442 367V245Q442 227 425 227H153V135Q153 102 174 85T253 68T331 85T353 135V146Q353
+165 372 165H423Q442 165 442 146V129Q442 -8 251 -8T60 129V367Q60 504 253 504Q442 504 442 367ZM153 361V298H353V361Q353 428 253 428T153 361Z" />
+<glyph unicode="&#xe9;" glyph-name="eacute" horiz-adv-x="495" d="M361 689L285 577Q278 565 261 565H215Q195 565 205 583L264 690Q274 708 290 708H352Q375 708 361 689ZM442 367V245Q442 227 425 227H153V135Q153 102 174 85T253 68T331 85T353 135V146Q353
+165 372 165H423Q442 165 442 146V129Q442 -8 251 -8T60 129V367Q60 504 253 504Q442 504 442 367ZM153 361V298H353V361Q353 428 253 428T153 361Z" />
+<glyph unicode="&#xea;" glyph-name="ecircumflex" horiz-adv-x="495" d="M253 650L211 583Q200 565 185 565H140Q130 565 128 570T130 583L205 689Q219 708 235 708H270Q286 708 300 689L375 583Q380 576 378 571T365 565H320Q305 565 294 583L253 650ZM442 367V245Q442
+227 425 227H153V135Q153 102 174 85T253 68T331 85T353 135V146Q353 165 372 165H423Q442 165 442 146V129Q442 -8 251 -8T60 129V367Q60 504 253 504Q442 504 442 367ZM153 361V298H353V361Q353 428 253 428T153 361Z" />
+<glyph unicode="&#xeb;" glyph-name="edieresis" horiz-adv-x="495" d="M227 685V590Q227 571 209 571H174Q155 571 155 590V685Q155 704 174 704H209Q227 704 227 685ZM348 685V590Q348 571 330 571H295Q276 571 276 590V685Q276 704 295 704H330Q348 704 348
+685ZM442 367V245Q442 227 425 227H153V135Q153 102 174 85T253 68T331 85T353 135V146Q353 165 372 165H423Q442 165 442 146V129Q442 -8 251 -8T60 129V367Q60 504 253 504Q442 504 442 367ZM153 361V298H353V361Q353 428 253 428T153 361Z" />
+<glyph unicode="&#xec;" glyph-name="igrave" horiz-adv-x="237" d="M180 476V19Q180 0 162 0H103Q85 0 85 19V476Q85 496 103 496H162Q180 496 180 476ZM86 577L10 689Q-4 708 19 708H81Q97 708 107 690L166 583Q176 565 157 565H110Q96 565 86 577Z" />
+<glyph unicode="&#xed;" glyph-name="iacute" horiz-adv-x="237" d="M237 689L161 577Q154 565 137 565H91Q71 565 81 583L140 690Q150 708 166 708H228Q251 708 237 689ZM166 476V19Q166 0 148 0H89Q71 0 71 19V476Q71 496 89 496H148Q166 496 166 476Z" />
+<glyph unicode="&#xee;" glyph-name="icircumflex" horiz-adv-x="237" d="M124 650L82 583Q71 565 56 565H11Q1 565 -1 570T1 583L76 689Q90 708 106 708H141Q157 708 171 689L246 583Q251 576 249 571T236 565H191Q176 565 165 583L124 650ZM169 476V19Q169 0
+151 0H92Q74 0 74 19V476Q74 496 92 496H151Q169 496 169 476Z" />
+<glyph unicode="&#xef;" glyph-name="idieresis" horiz-adv-x="237" d="M95 685V590Q95 571 77 571H42Q23 571 23 590V685Q23 704 42 704H77Q95 704 95 685ZM216 685V590Q216 571 198 571H163Q144 571 144 590V685Q144 704 163 704H198Q216 704 216 685ZM166 476V19Q166
+0 148 0H89Q71 0 71 19V476Q71 496 89 496H148Q166 496 166 476Z" />
+<glyph unicode="&#xf0;" glyph-name="eth" horiz-adv-x="561" d="M278 594L340 622Q316 641 262 641H169Q150 641 150 660V689Q150 708 169 708H262Q370 708 416 665L464 689Q481 698 490 682L497 670Q505 655 489 646L445 624Q455 603 455 572V128Q455 -8 260
+-8Q158 -8 109 28T60 128V368Q60 432 95 468T202 504Q292 504 365 446V553Q365 566 359 576L302 551Q285 543 277 558L270 569Q259 585 278 594ZM365 136V369Q298 421 230 421Q155 421 155 355V136Q155 68 260 68T365 136Z" />
+<glyph unicode="&#xf1;" glyph-name="ntilde" horiz-adv-x="536" d="M90 496H143Q161 496 162 477L164 445Q233 504 330 504Q398 504 434 469T471 376V20Q471 0 453 0H395Q376 0 376 20V353Q376 419 302 419Q232 419 166 368V20Q166 0 148 0H90Q71 0 71 20V477Q71
+496 90 496ZM197 634Q184 634 181 627T178 596V589Q178 572 158 572H126Q108 572 110 594L112 626Q114 666 136 686T191 706Q224 706 250 690L293 664Q326 645 333 645Q345 645 348 653T352 683V690Q352 707 373 707H404Q422 707 420 685L418 653Q416 613 393 593T338
+573T280 589L237 615Q204 634 197 634Z" />
+<glyph unicode="&#xf2;" glyph-name="ograve" horiz-adv-x="520" d="M219 577L143 689Q129 708 152 708H214Q230 708 240 690L299 583Q309 565 290 565H243Q229 565 219 577ZM60 129V367Q60 431 109 467T260 504T411 468T460 367V129Q460 65 411 29T260 -8T109
+28T60 129ZM365 137V359Q365 426 260 426T155 359V137Q155 70 260 70T365 137Z" />
+<glyph unicode="&#xf3;" glyph-name="oacute" horiz-adv-x="520" d="M376 689L300 577Q293 565 276 565H230Q210 565 220 583L279 690Q289 708 305 708H367Q390 708 376 689ZM60 129V367Q60 431 109 467T260 504T411 468T460 367V129Q460 65 411 29T260 -8T109
+28T60 129ZM365 137V359Q365 426 260 426T155 359V137Q155 70 260 70T365 137Z" />
+<glyph unicode="&#xf4;" glyph-name="ocircumflex" horiz-adv-x="520" d="M262 650L220 583Q209 565 194 565H149Q139 565 137 570T139 583L214 689Q228 708 244 708H279Q295 708 309 689L384 583Q389 576 387 571T374 565H329Q314 565 303 583L262 650ZM60 129V367Q60
+431 109 467T260 504T411 468T460 367V129Q460 65 411 29T260 -8T109 28T60 129ZM365 137V359Q365 426 260 426T155 359V137Q155 70 260 70T365 137Z" />
+<glyph unicode="&#xf5;" glyph-name="otilde" horiz-adv-x="520" d="M193 628Q180 628 177 621T174 590V583Q174 566 154 566H122Q104 566 106 588L108 620Q110 660 132 680T187 700Q220 700 246 684L289 658Q322 639 329 639Q341 639 344 647T348 677V684Q348
+701 369 701H400Q418 701 416 679L414 647Q412 607 389 587T334 567T276 583L233 609Q200 628 193 628ZM60 129V367Q60 431 109 467T260 504T411 468T460 367V129Q460 65 411 29T260 -8T109 28T60 129ZM365 137V359Q365 426 260 426T155 359V137Q155 70 260 70T365
+137Z" />
+<glyph unicode="&#xf6;" glyph-name="odieresis" horiz-adv-x="520" d="M236 685V590Q236 571 218 571H183Q164 571 164 590V685Q164 704 183 704H218Q236 704 236 685ZM357 685V590Q357 571 339 571H304Q285 571 285 590V685Q285 704 304 704H339Q357 704 357
+685ZM60 129V367Q60 431 109 467T260 504T411 468T460 367V129Q460 65 411 29T260 -8T109 28T60 129ZM365 137V359Q365 426 260 426T155 359V137Q155 70 260 70T365 137Z" />
+<glyph unicode="&#xf7;" glyph-name="divide" horiz-adv-x="585" d="M89 350H495Q514 350 514 332V289Q514 270 495 270H90Q71 270 71 289V332Q71 350 89 350ZM341 180V100Q341 81 323 81H263Q244 81 244 100V180Q244 199 263 199H323Q341 199 341 180ZM341 524V444Q341
+425 323 425H263Q244 425 244 444V524Q244 543 263 543H323Q341 543 341 524Z" />
+<glyph unicode="&#xf8;" glyph-name="oslash" horiz-adv-x="520" d="M60 129V367Q60 431 109 467T260 504Q322 504 366 490L371 499Q372 500 375 506T379 513T383 519T388 525T394 527T403 529H423Q442 529 425 499L408 469Q460 434 460 367V129Q460 65 411 29T260
+-8Q200 -8 152 7L148 -1Q147 -3 145 -8T141 -14T138 -19T135 -24T131 -27T127 -29T121 -30T114 -31H97Q76 -31 94 -1L110 27Q60 61 60 129ZM365 137V359Q365 374 361 383L193 80Q216 70 260 70Q365 70 365 137ZM155 137Q155 121 158 114L325 416Q302 426 260 426Q155
+426 155 359V137Z" />
+<glyph unicode="&#xf9;" glyph-name="ugrave" horiz-adv-x="530" d="M368 19L366 49Q299 -8 206 -8Q139 -8 102 27T65 119V476Q65 496 83 496H141Q160 496 160 476V143Q160 77 234 77Q302 77 364 127V476Q364 496 382 496H441Q459 496 459 476V19Q459 0 441 0H387Q369
+0 368 19ZM225 577L149 689Q135 708 158 708H220Q236 708 246 690L305 583Q315 565 296 565H249Q235 565 225 577Z" />
+<glyph unicode="&#xfa;" glyph-name="uacute" horiz-adv-x="530" d="M377 689L301 577Q294 565 277 565H231Q211 565 221 583L280 690Q290 708 306 708H368Q391 708 377 689ZM368 19L366 49Q299 -8 206 -8Q139 -8 102 27T65 119V476Q65 496 83 496H141Q160 496
+160 476V143Q160 77 234 77Q302 77 364 127V476Q364 496 382 496H441Q459 496 459 476V19Q459 0 441 0H387Q369 0 368 19Z" />
+<glyph unicode="&#xfb;" glyph-name="ucircumflex" horiz-adv-x="530" d="M258 650L216 583Q205 565 190 565H145Q135 565 133 570T135 583L210 689Q224 708 240 708H275Q291 708 305 689L380 583Q385 576 383 571T370 565H325Q310 565 299 583L258 650ZM368 19L366
+49Q299 -8 206 -8Q139 -8 102 27T65 119V476Q65 496 83 496H141Q160 496 160 476V143Q160 77 234 77Q302 77 364 127V476Q364 496 382 496H441Q459 496 459 476V19Q459 0 441 0H387Q369 0 368 19Z" />
+<glyph unicode="&#xfc;" glyph-name="udieresis" horiz-adv-x="530" d="M238 685V590Q238 571 220 571H185Q166 571 166 590V685Q166 704 185 704H220Q238 704 238 685ZM359 685V590Q359 571 341 571H306Q287 571 287 590V685Q287 704 306 704H341Q359 704 359
+685ZM368 19L366 49Q299 -8 206 -8Q139 -8 102 27T65 119V476Q65 496 83 496H141Q160 496 160 476V143Q160 77 234 77Q302 77 364 127V476Q364 496 382 496H441Q459 496 459 476V19Q459 0 441 0H387Q369 0 368 19Z" />
+<glyph unicode="&#xfd;" glyph-name="yacute" horiz-adv-x="450" d="M119 476L216 187Q220 175 223 159T229 130L231 118Q238 151 249 185L348 476Q354 496 370 496H424Q447 496 441 476L215 -185Q209 -204 194 -204H151Q127 -204 133 -185L189 -8L21 476Q15 496
+38 496H97Q112 496 119 476ZM353 689L277 577Q270 565 253 565H207Q187 565 197 583L256 690Q266 708 282 708H344Q367 708 353 689Z" />
+<glyph unicode="&#xfe;" glyph-name="thorn" horiz-adv-x="531" d="M166 680V446Q237 504 329 504Q400 504 435 468T471 368V127Q471 64 436 28T329 -8Q237 -8 166 48V-185Q166 -204 148 -204H89Q71 -204 71 -185V680Q71 699 89 699H147Q166 699 166 680ZM376
+141V355Q376 421 301 421Q230 421 166 369V126Q234 74 301 74Q376 74 376 141Z" />
+<glyph unicode="&#xff;" glyph-name="ydieresis" horiz-adv-x="450" d="M119 476L216 187Q220 175 223 159T229 130L231 118Q238 151 249 185L348 476Q354 496 370 496H424Q447 496 441 476L215 -185Q209 -204 194 -204H151Q127 -204 133 -185L189 -8L21 476Q15
+496 38 496H97Q112 496 119 476ZM210 685V590Q210 571 192 571H157Q138 571 138 590V685Q138 704 157 704H192Q210 704 210 685ZM331 685V590Q331 571 313 571H278Q259 571 259 590V685Q259 704 278 704H313Q331 704 331 685Z" />
+<glyph unicode="&#x152;" glyph-name="OE" horiz-adv-x="865" d="M71 145V535Q71 603 124 645T298 688Q373 688 428 657V661Q428 680 447 680H788Q807 680 807 662V618Q807 599 788 599H526V394H771Q790 394 790 376V334Q790 316 771 316H526V81H800Q819 81 819
+63V19Q819 0 800 0H446Q428 0 428 19V23Q376 -8 298 -8Q178 -8 125 34T71 145ZM428 157V519Q428 607 298 607Q169 607 169 519V161Q169 73 298 73Q425 73 428 157Z" />
+<glyph unicode="&#x153;" glyph-name="oe" horiz-adv-x="801" d="M60 128V367Q60 431 109 467T260 504Q363 504 406 464Q454 504 558 504Q748 504 748 367V250Q748 232 730 232H458V132Q458 99 481 82T558 64Q659 64 659 132V145Q659 164 677 164H726Q745 164
+745 145V128Q745 -8 558 -8Q452 -8 406 32Q364 -8 260 -8Q158 -8 109 28T60 128ZM365 136V360Q365 428 260 428T155 360V136Q155 68 260 68T365 136ZM458 363V297H659V363Q659 432 558 432Q458 432 458 363Z" />
+<glyph unicode="&#x160;" glyph-name="Scaron" horiz-adv-x="568" d="M410 490V521Q410 606 289 606T168 521V501Q168 453 219 434L401 365Q511 323 511 229V146Q511 78 458 35T287 -8T116 35T62 146V204Q62 224 81 224H140Q158 224 158 204V159Q158 74 286 74Q415
+74 415 159V206Q415 229 401 246T372 271T331 288L162 353Q126 367 100 400T73 477V534Q73 602 123 645T288 688T453 645T505 534V490Q505 471 487 471H428Q410 471 410 490ZM245 859L286 793L327 859Q340 878 353 878H398Q408 878 411 873T408 859L333 753Q320
+735 303 735H268Q252 735 238 754L163 859Q157 867 160 872T173 878H218Q232 878 245 859Z" />
+<glyph unicode="&#x161;" glyph-name="scaron" horiz-adv-x="468" d="M197 689L239 623L280 689Q293 708 306 708H351Q361 708 364 703T361 689L286 583Q273 565 256 565H221Q205 565 191 584L116 689Q110 697 113 702T126 708H171Q184 708 197 689ZM333 357V381Q333
+434 238 434Q145 434 145 381V364Q145 332 187 318L337 266Q427 235 427 168V112Q427 61 380 27T237 -8Q141 -8 95 26T48 112V137Q48 155 65 155H118Q135 155 135 137V116Q135 63 237 63T339 116V143Q339 173 286 191L136 243Q105 254 82 281T58 344V381Q58 433
+101 468T239 504Q332 504 376 469T420 381V357Q420 339 402 339H350Q333 339 333 357Z" />
+<glyph unicode="&#x178;" glyph-name="Ydieresis" horiz-adv-x="529" d="M134 661L259 397Q270 370 275 352Q275 354 280 371T291 397L424 661Q434 680 446 680H507Q530 680 520 661L324 270V19Q324 0 306 0H245Q226 0 226 19V259L28 661Q18 680 42 680H111Q124
+680 134 661ZM249 853V758Q249 739 231 739H196Q178 739 178 758V853Q178 873 196 873H231Q249 873 249 853ZM370 853V758Q370 739 352 739H317Q299 739 299 758V853Q299 873 317 873H352Q370 873 370 853Z" />
+<glyph unicode="&#x17d;" glyph-name="Zcaron" horiz-adv-x="500" d="M211 868L253 802L294 868Q307 887 320 887H365Q375 887 378 882T375 868L300 762Q287 744 270 744H235Q219 744 205 763L130 868Q124 876 127 881T140 887H185Q198 887 211 868ZM79 680H431Q451
+680 451 661V618Q451 609 447 601L160 83H448Q467 83 467 65V19Q467 0 448 0H62Q43 0 43 19V65Q43 72 48 82L332 597H79Q60 597 60 616V661Q60 680 79 680Z" />
+<glyph unicode="&#x17e;" glyph-name="zcaron" horiz-adv-x="451" d="M187 689L229 623L270 689Q283 708 296 708H341Q351 708 354 703T351 689L276 583Q263 565 246 565H211Q195 565 181 584L106 689Q100 697 103 702T116 708H161Q174 708 187 689ZM74 496H376Q395
+496 395 477V437Q395 427 391 422L157 78H392Q411 78 411 60V19Q411 0 392 0H60Q41 0 41 19V60Q41 68 45 74L277 417H74Q55 417 55 436V477Q55 496 74 496Z" />
+<glyph unicode="&#x192;" glyph-name="florin" horiz-adv-x="562" d="M488 627H473Q370 627 362 561L345 424H432Q451 424 451 405V365Q451 346 432 346H338L290 -76Q275 -213 77 -213H70Q51 -213 51 -194V-153Q51 -133 70 -133H85Q187 -133 195 -66L242 346H165Q146
+346 146 365V405Q146 424 165 424H250L267 571Q282 708 480 708H488Q507 708 507 689V647Q507 627 488 627Z" />
+<glyph unicode="&#x2c6;" glyph-name="circumflex" horiz-adv-x="350" d="M177 650L135 583Q124 565 109 565H64Q54 565 52 570T54 583L129 689Q143 708 159 708H194Q210 708 224 689L299 583Q304 576 302 571T289 565H244Q229 565 218 583L177 650Z" />
+<glyph unicode="&#x2dc;" glyph-name="tilde" horiz-adv-x="416" d="M141 628Q128 628 125 621T122 590V583Q122 566 102 566H70Q52 566 54 588L56 620Q58 660 80 680T135 700Q168 700 194 684L237 658Q270 639 277 639Q289 639 292 647T296 677V684Q296 701 317
+701H348Q366 701 364 679L362 647Q360 607 337 587T282 567T224 583L181 609Q148 628 141 628Z" />
+<glyph unicode="&#x2013;" glyph-name="endash" horiz-adv-x="541" d="M90 328H451Q470 328 470 310V268Q470 250 451 250H90Q71 250 71 268V310Q71 328 90 328Z" />
+<glyph unicode="&#x2014;" glyph-name="emdash" horiz-adv-x="850" d="M90 328H760Q779 328 779 310V268Q779 250 760 250H90Q71 250 71 268V310Q71 328 90 328Z" />
+<glyph unicode="&#x2018;" glyph-name="quoteleft" horiz-adv-x="232" d="M155 601V537Q155 518 137 518H76Q58 518 58 537V606Q58 706 177 739Q195 743 201 727L215 686Q222 668 203 662Q155 643 155 601Z" />
+<glyph unicode="&#x2019;" glyph-name="quoteright" horiz-adv-x="232" d="M84 656V720Q84 739 102 739H163Q181 739 181 720V651Q181 551 62 518Q44 514 38 530L24 571Q17 589 36 595Q84 614 84 656Z" />
+<glyph unicode="&#x201a;" glyph-name="quotesinglbase" horiz-adv-x="232" d="M84 35V99Q84 118 102 118H163Q181 118 181 99V30Q181 -70 62 -103Q44 -107 38 -91L24 -50Q17 -32 36 -26Q84 -7 84 35Z" />
+<glyph unicode="&#x201c;" glyph-name="quotedblleft" horiz-adv-x="415" d="M338 601V537Q338 518 320 518H259Q241 518 241 537V606Q241 706 360 739Q378 743 384 727L398 686Q405 668 386 662Q338 643 338 601ZM155 601V537Q155 518 137 518H76Q58 518 58 537V606Q58
+706 177 739Q195 743 201 727L215 686Q222 668 203 662Q155 643 155 601Z" />
+<glyph unicode="&#x201d;" glyph-name="quotedblright" horiz-adv-x="415" d="M267 656V720Q267 739 285 739H346Q364 739 364 720V651Q364 551 245 518Q227 514 221 530L207 571Q200 589 219 595Q267 614 267 656ZM84 656V720Q84 739 102 739H163Q181 739 181
+720V651Q181 551 62 518Q44 514 38 530L24 571Q17 589 36 595Q84 614 84 656Z" />
+<glyph unicode="&#x201e;" glyph-name="quotedblbase" horiz-adv-x="415" d="M267 35V99Q267 118 285 118H346Q364 118 364 99V30Q364 -70 245 -103Q227 -107 221 -91L207 -50Q200 -32 219 -26Q267 -7 267 35ZM84 35V99Q84 118 102 118H163Q181 118 181 99V30Q181
+-70 62 -103Q44 -107 38 -91L24 -50Q17 -32 36 -26Q84 -7 84 35Z" />
+<glyph unicode="&#x2020;" glyph-name="dagger" horiz-adv-x="621" d="M359 679V20Q359 0 341 0H282Q264 0 264 20V679Q264 699 282 699H341Q359 699 359 679ZM101 507H221Q240 507 240 489V446Q240 427 221 427H101Q82 427 82 446V489Q82 507 101 507ZM402 507H521Q540
+507 540 489V446Q540 427 521 427H402Q382 427 382 446V489Q382 507 402 507Z" />
+<glyph unicode="&#x2021;" glyph-name="daggerdbl" horiz-adv-x="621" d="M359 679V20Q359 0 341 0H282Q264 0 264 20V679Q264 699 282 699H341Q359 699 359 679ZM101 507H221Q240 507 240 489V446Q240 427 221 427H101Q82 427 82 446V489Q82 507 101 507ZM402
+507H521Q540 507 540 489V446Q540 427 521 427H402Q382 427 382 446V489Q382 507 402 507ZM101 271H221Q240 271 240 252V210Q240 190 221 190H101Q82 190 82 210V252Q82 271 101 271ZM402 271H521Q540 271 540 252V210Q540 190 521 190H402Q382 190 382 210V252Q382
+271 402 271Z" />
+<glyph unicode="&#x2022;" glyph-name="bullet" horiz-adv-x="260" d="M179 335V198Q179 179 161 179H101Q82 179 82 198V335Q82 354 101 354H161Q179 354 179 335Z" />
+<glyph unicode="&#x2026;" glyph-name="ellipsis" horiz-adv-x="728" d="M165 99V19Q165 0 147 0H87Q68 0 68 19V99Q68 118 87 118H147Q165 118 165 99ZM660 99V19Q660 0 642 0H582Q563 0 563 19V99Q563 118 582 118H642Q660 118 660 99ZM413 99V19Q413 0 395
+0H335Q316 0 316 19V99Q316 118 335 118H395Q413 118 413 99Z" />
+<glyph unicode="&#x2030;" glyph-name="perthousand" horiz-adv-x="1157" d="M76 481V585Q76 687 220 687T364 585V481Q364 378 220 378T76 481ZM285 484V582Q285 623 220 623T155 582V484Q155 443 220 443T285 484ZM660 97V195Q660 235 595 235T530 195V97Q530
+55 595 55T660 97ZM451 93V197Q451 300 595 300T739 197V93Q739 -9 595 -9T451 93ZM1002 97V195Q1002 235 937 235T872 195V97Q872 55 937 55T1002 97ZM793 93V197Q793 300 938 300Q1081 300 1081 197V93Q1081 -9 938 -9Q793 -9 793 93ZM607 660L297 20Q287 0 270
+0H220Q212 0 210 7T211 20L522 660Q531 680 549 680H598Q607 680 609 674T607 660Z" />
+<glyph unicode="&#x2039;" glyph-name="guilsinglleft" horiz-adv-x="360" d="M271 337L145 245L271 154Q290 141 290 125V65Q290 55 284 52T271 54L87 190Q70 203 70 216V275Q70 287 87 300L271 437Q278 443 284 440T290 426V366Q290 352 271 337Z" />
+<glyph unicode="&#x203a;" glyph-name="guilsinglright" horiz-adv-x="360" d="M215 245L89 337Q70 352 70 366V426Q70 436 76 439T89 437L273 300Q290 287 290 275V216Q290 203 273 190L89 54Q82 49 76 52T70 65V125Q70 141 89 154L215 245Z" />
+<glyph unicode="&#x20ac;" glyph-name="Euro" horiz-adv-x="653" d="M95 306H135V373H95Q76 373 76 392V417Q76 435 95 435H135V534Q135 688 356 688T577 534V485Q577 465 559 465H501Q482 465 482 485V518Q482 605 357 605Q233 605 233 518V435H365Q384 435 384
+417V392Q384 373 365 373H233V306H365Q384 306 384 288V263Q384 244 365 244H233V162Q233 75 357 75Q482 75 482 162V209Q482 228 501 228H559Q577 228 577 209V146Q577 -8 356 -8T135 146V244H95Q76 244 76 263V288Q76 306 95 306Z" />
+<glyph unicode="&#x2122;" glyph-name="trademark" horiz-adv-x="905" d="M824 664V288Q824 272 808 272H761Q745 272 745 288V529Q745 528 744 524T740 513T736 502L667 349Q660 334 646 334H611Q597 334 590 349L518 504Q514 512 509 532V288Q509 272 494 272H449Q433
+272 433 288V664Q433 680 449 680H494Q504 680 507 673L615 453Q625 432 628 422Q628 425 640 451L746 673Q749 680 761 680H808Q824 680 824 664ZM98 680H370Q386 680 386 665V628Q386 613 370 613H275V288Q275 272 260 272H209Q193 272 193 288V613H98Q82 613
+82 628V665Q82 680 98 680Z" />
+</font>
+</defs>
+</svg>
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/svg/svg_test.html b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/svg/svg_test.html
new file mode 100644
index 00000000..fb7c83d3
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/svg/svg_test.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>MyFonts Webfonts Demo for iOS devices</title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+
+<style type="text/css" media="all">
+
+	h2 {
+		 font-weight:normal;
+	}
+
+		
+	@font-face {
+		font-family:"Geogrotesque-Medium";
+		src:url("1110FC_0.svg#Geogrotesque-Medium") format("svg");
+	}
+	
+	.webfont_0 {
+		font-family: Geogrotesque-Medium;
+	}
+		
+</style>
+
+</head>
+
+<body>
+
+<h1>MyFonts Webfonts Demo for iOS devices</h1>
+
+
+<h2>0. <span class='webfont_0'><a href='http://new.myfonts.com/search/style::169904/'>Geogrotesque Medium</a></span>
+<small>(VersionID 499206, otf)</small>
+</h2>
+
+<p class='webfont_0'>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+
+<p class='webfont_0'>An, partus ancillae sitne in fructu habendus, disseretur inter principes civitatis, P. Scaevolam M'.que Manilium, ab iisque M. Brutus dissentiet -- quod et acutum genus est et ad usus civium non inutile, nosque ea scripta reliquaque eiusdem generis et legimus libenter et legemus --, haec, quae vitam omnem continent, neglegentur? nam, ut sint illa vendibiliora, haec uberiora certe sunt. quamquam id quidem licebit iis existimare, qui legerint. nos autem hanc omnem quaestionem de finibus bonorum et malorum fere a nobis explicatam esse his litteris arbitramur, in quibus, quantum potuimus, non modo quid nobis probaretur, sed etiam quid a singulis philosophiae disciplinis diceretur, persecuti sumus.</p>
+
+<p class='webfont_0'>Id qui in una virtute ponunt et splendore nominis capti quid natura postulet non intellegunt, errore maximo, si Epicurum audire voluerint, liberabuntur: istae enim vestrae eximiae pulchraeque virtutes nisi voluptatem efficerent, quis eas aut laudabilis aut expetendas arbitraretur? ut enim medicorum scientiam non ipsius artis, sed bonae valetudinis causa probamus, et gubernatoris ars, quia bene navigandi rationem habet, utilitate, non arte laudatur, sic sapientia, quae ars vivendi putanda est, non expeteretur, si nihil efficeret; nunc expetitur, quod est tamquam artifex conquirendae et comparandae voluptatis.</p>
+
+
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/ttf/1110FC_0.ttf b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/ttf/1110FC_0.ttf
new file mode 100644
index 00000000..a43d6c3d
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/ttf/1110FC_0.ttf differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/woff/1110FC_0.woff b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/woff/1110FC_0.woff
new file mode 100644
index 00000000..f4317020
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-medium/woff/1110FC_0.woff differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/eot/11014B_0.eot b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/eot/11014B_0.eot
new file mode 100644
index 00000000..b87819c9
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/eot/11014B_0.eot differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/svg/11014B_0.svg b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/svg/11014B_0.svg
new file mode 100644
index 00000000..b366c725
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/svg/11014B_0.svg
@@ -0,0 +1,403 @@
+<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" > 
+<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
+<metadata version="1.0"><uniqueid id="com.myfonts.emtype.geogrotesque.regular.wfkit2.6Hhx"/><vendor name="MyFonts" url="http://www.myfonts.com/"/><credits><credit name="Eduardo Manso" url="http://www.myfonts.com/person/manso/eduardo/"/></credits><description><text lang="en">This is a Webfont from MyFonts. Full information about this font:
+http://www.myfonts.com/fonts/emtype/geogrotesque/
+</text></description><license url="http://www.myfonts.com/viewlicense?lid=1146"/><copyright><text lang="en">Copyright (c) 2009 by Eduardo Manso. All rights reserved.</text></copyright><trademark><text lang="en">Geogrotesque is a trademark of Eduardo Manso.</text></trademark></metadata>
+<defs >
+<font id="wf" horiz-adv-x="414" ><font-face
+    font-family="Geogrotesque Rg"
+    units-per-em="1000"
+    panose-1="2 0 0 0 0 0 0 0 0 0"
+    ascent="773"
+    descent="-226"
+    alphabetic="0" />
+<missing-glyph horiz-adv-x="859" d="M677 94Q573 -8 428 -8Q284 -8 182 94Q79 195 79 341Q79 485 182 588Q284 690 428 690Q575 690 677 588Q780 485 780 341T677 94ZM665 106Q764 205 764 341T665 576Q567 674 428 674Q292 674 194 576Q95 477 95 341Q95 204
+194 106Q292 8 428 8Q567 8 665 106ZM547 183L429 301L312 184Q302 174 291 185L271 204Q260 214 271 225L388 342L271 460Q260 470 271 481L291 501Q302 512 312 501L429 383L548 501Q559 512 569 502L589 482Q601 470 589 460L470 342L588 224Q598 214 588 203L568
+183Q558 172 547 183Z" />
+<glyph unicode=" " glyph-name="space" horiz-adv-x="224" />
+<glyph unicode="!" glyph-name="exclam" horiz-adv-x="254" d="M163 390L156 177Q156 162 142 162H112Q98 162 98 177L91 390V665Q91 680 105 680H149Q163 680 163 665V390ZM162 93V15Q162 0 148 0H106Q91 0 91 15V93Q91 108 106 108H148Q162 108 162 93Z" />
+<glyph unicode="&quot;" glyph-name="quotedbl" horiz-adv-x="367" d="M142 494Q142 479 128 479H100Q85 479 85 494L79 665Q79 680 94 680H134Q148 680 148 665L142 494ZM282 494Q282 479 267 479H239Q225 479 225 494L218 665Q218 680 233 680H273Q288 680 288
+665L282 494Z" />
+<glyph unicode="#" glyph-name="numbersign" horiz-adv-x="653" d="M97 270H179L209 379H139Q124 379 124 394V417Q124 431 139 431H224L251 527Q256 542 269 542H299Q314 542 310 527L283 431H435L462 527Q467 542 480 542H510Q525 542 521 527L494 431H555Q570
+431 570 417V394Q570 379 555 379H479L449 270H514Q528 270 528 256V234Q528 219 514 219H434L408 125Q403 109 391 109H360Q344 109 349 125L376 219H223L197 125Q192 109 179 109H149Q133 109 138 125L164 219H97Q83 219 83 234V256Q83 270 97 270ZM268 379L237
+270H390L421 379H268Z" />
+<glyph unicode="$" glyph-name="dollar" horiz-adv-x="529" d="M374 452V481Q374 543 263 543Q154 543 154 481V455Q154 416 205 400L359 350Q445 322 445 255V198Q445 155 410 125T303 87V15Q303 0 289 0H248Q233 0 233 15V86Q157 91 120 122T82 198V225Q82 239
+96 239H133Q146 239 146 225V201Q146 138 263 138Q320 138 350 154T381 201V238Q381 275 322 294L168 345Q138 355 115 381T91 442V481Q91 526 125 557T233 594V665Q233 680 248 680H289Q303 680 303 665V593Q372 586 405 555T438 481V452Q438 439 424 439H387Q374
+439 374 452Z" />
+<glyph unicode="%" glyph-name="percent" horiz-adv-x="776" d="M83 483V592Q83 687 218 687T353 592V483Q353 388 218 388T83 483ZM295 485V590Q295 639 218 639T141 590V485Q141 436 218 436T295 485ZM635 89V193Q635 242 559 242Q482 242 482 193V89Q482 39
+559 39Q635 39 635 89ZM423 86V195Q423 290 559 290Q694 290 694 195V86Q694 -9 559 -9Q423 -9 423 86ZM571 665L268 15Q261 0 247 0H211Q205 0 203 5T204 15L508 665Q516 680 529 680H563Q578 680 571 665Z" />
+<glyph unicode="&amp;" glyph-name="ampersand" horiz-adv-x="672" d="M294 389H616Q631 389 631 374V344Q631 330 616 330H541V137Q541 71 487 32T313 -8Q86 -8 86 135V245Q86 292 106 320T179 361Q131 373 112 400T93 472V545Q93 612 137 650T291 688Q402 688
+446 649T490 543V521Q490 507 475 507H434Q420 507 420 521V534Q420 581 392 605T291 629T191 605T163 534V482Q163 434 191 412T294 389ZM156 51T314 51T472 146V330H287Q212 330 184 308T156 237V146Q156 51 314 51Z" />
+<glyph unicode="&apos;" glyph-name="quotesingle" horiz-adv-x="227" d="M148 665L142 494Q142 479 128 479H100Q85 479 85 494L79 665Q79 680 94 680H134Q148 680 148 665Z" />
+<glyph unicode="(" glyph-name="parenleft" horiz-adv-x="354" d="M86 -89V579Q86 708 273 708H279Q294 708 294 693V664Q294 649 279 649H273Q210 649 184 630T158 572V-82Q158 -120 184 -139T273 -159H279Q294 -159 294 -174V-203Q294 -218 279 -218H273Q86
+-218 86 -89Z" />
+<glyph unicode=")" glyph-name="parenright" horiz-adv-x="354" d="M267 579V-89Q267 -218 80 -218H75Q60 -218 60 -203V-174Q60 -159 75 -159H80Q143 -159 169 -140T196 -82V572Q196 610 170 629T80 649H75Q60 649 60 664V693Q60 708 75 708H80Q267 708 267 579Z" />
+<glyph unicode="*" glyph-name="asterisk" horiz-adv-x="510" d="M252 350Q238 350 238 365L242 494L131 422Q118 414 111 428L101 446Q94 459 107 466L219 527L107 590Q95 596 101 609L111 629Q118 642 131 634L243 562L238 695Q238 710 252 710H274Q288 710
+288 695L282 562L393 634Q408 643 414 629L423 609Q428 597 417 590L305 527L417 466Q429 459 423 446L414 427Q408 413 393 422L283 493L288 365Q288 350 274 350H252Z" />
+<glyph unicode="+" glyph-name="plus" horiz-adv-x="579" d="M259 143V309H94Q79 309 79 324V354Q79 369 94 369H259V534Q259 550 273 550H303Q317 550 317 534V369H485Q500 369 500 354V324Q500 309 485 309H317V143Q317 129 303 129H273Q259 129 259 143Z" />
+<glyph unicode="," glyph-name="comma" horiz-adv-x="220" d="M80 32V93Q80 108 94 108H137Q151 108 151 93V29Q151 -63 50 -93Q37 -98 32 -84L22 -55Q17 -42 31 -36Q59 -24 69 -9T80 32Z" />
+<glyph unicode="-" glyph-name="hyphen" horiz-adv-x="456" d="M94 318H362Q377 318 377 304V275Q377 260 362 260H94Q79 260 79 275V304Q79 318 94 318Z" />
+<glyph unicode="." glyph-name="period" horiz-adv-x="221" d="M146 93V15Q146 0 132 0H90Q75 0 75 15V93Q75 108 90 108H132Q146 108 146 93Z" />
+<glyph unicode="/" glyph-name="slash" horiz-adv-x="369" d="M334 684L119 -133Q115 -148 101 -148H56Q40 -148 45 -133L261 684Q265 699 278 699H323Q339 699 334 684Z" />
+<glyph unicode="0" glyph-name="zero" horiz-adv-x="542" d="M65 138V542Q65 688 271 688Q478 688 478 542V138Q478 -8 271 -8Q65 -8 65 138ZM406 149V531Q406 578 376 602T271 627T166 603T136 531V149Q136 102 166 78T271 53T376 77T406 149Z" />
+<glyph unicode="1" glyph-name="one" horiz-adv-x="542" d="M89 631L305 683Q319 685 319 670V61H477Q492 61 492 47V15Q492 0 477 0H88Q73 0 73 15V47Q73 61 88 61H248V605L89 568Q74 565 74 580V614Q74 628 89 631Z" />
+<glyph unicode="2" glyph-name="two" horiz-adv-x="542" d="M154 61H468Q483 61 483 47V15Q483 0 468 0H97Q83 0 83 15V208Q83 271 165 298L351 360Q409 378 409 430V531Q409 579 380 603T275 628Q201 628 172 604T142 531V485Q142 469 128 469H88Q73 469 73 485V542Q73
+610 118 649T275 688Q480 688 480 542V431Q480 378 452 348T390 308L220 254Q154 235 154 188V61Z" />
+<glyph unicode="3" glyph-name="three" horiz-adv-x="542" d="M180 389H263Q338 389 365 411T393 482V534Q393 581 365 605T265 629T165 605T136 534V521Q136 507 122 507H81Q67 507 67 521V543Q67 610 111 649T266 688Q376 688 419 650T463 545V472Q463 427 445
+400T377 361Q430 348 450 320T470 245V135Q470 -8 267 -8Q62 -8 62 137V159Q62 173 76 173H117Q131 173 131 159V146Q131 100 162 76T266 51T369 75T400 146V237Q400 285 372 307T269 330H180Q165 330 165 344V374Q165 389 180 389Z" />
+<glyph unicode="4" glyph-name="four" horiz-adv-x="542" d="M261 665L121 276H387V665Q387 680 402 680H445Q459 680 459 665V15Q459 0 445 0H402Q387 0 387 15V215H62Q47 215 47 230V259Q47 266 50 275L190 665Q196 680 208 680H250Q266 680 261 665Z" />
+<glyph unicode="5" glyph-name="five" horiz-adv-x="542" d="M105 680H439Q454 680 454 665V634Q454 619 439 619H162V415H270Q370 415 420 380T471 281V136Q471 68 428 30T272 -9Q161 -9 118 29T74 136V158Q74 173 89 173H129Q144 173 144 158V146Q144 98 171
+75T272 51Q345 51 372 74T399 146V272Q399 356 269 356H105Q91 356 91 371V665Q91 680 105 680Z" />
+<glyph unicode="6" glyph-name="six" horiz-adv-x="542" d="M71 138V547Q71 688 271 688Q469 688 469 547V529Q469 514 454 514H414Q400 514 400 529V538Q400 629 271 629Q141 629 141 538V355Q176 405 281 405Q476 405 476 259V138Q476 70 431 31T273 -8Q161
+-8 116 31T71 138ZM406 147V250Q406 297 377 321T273 346Q141 346 141 258V147Q141 100 170 76T273 51Q348 51 377 75T406 147Z" />
+<glyph unicode="7" glyph-name="seven" horiz-adv-x="542" d="M68 680H478Q492 680 492 665V635Q492 631 489 622L233 15Q227 0 215 0H166Q149 0 155 15L411 619H68Q52 619 52 634V665Q52 680 68 680Z" />
+<glyph unicode="8" glyph-name="eight" horiz-adv-x="542" d="M77 477V542Q77 611 118 649T271 688T424 650T465 542V477Q465 431 445 403T374 362Q473 338 473 246V138Q473 70 429 31T271 -8T114 31T69 138V246Q69 291 91 320T167 362Q117 374 97 402T77 477ZM403
+147V236Q403 284 374 308T271 332Q196 332 168 308T140 236V147Q140 99 168 75T271 51Q345 51 374 75T403 147ZM396 487V533Q396 581 370 605T271 629T173 605T147 533V487Q147 438 172 414T271 390T370 414T396 487Z" />
+<glyph unicode="9" glyph-name="nine" horiz-adv-x="542" d="M471 542V133Q471 -8 271 -8Q74 -8 74 133V151Q74 166 88 166H129Q143 166 143 151V142Q143 51 271 51Q344 51 372 75T400 142V324Q366 275 260 275Q66 275 66 421V542Q66 610 111 649T269 688T426
+649T471 542ZM400 533Q400 580 372 604T269 629Q194 629 165 605T136 533V430Q136 383 165 359T269 334Q340 334 370 357T400 425V533Z" />
+<glyph unicode=":" glyph-name="colon" horiz-adv-x="221" d="M146 93V15Q146 0 132 0H90Q75 0 75 15V93Q75 108 90 108H132Q146 108 146 93ZM146 479V400Q146 386 132 386H90Q75 386 75 400V479Q75 494 90 494H132Q146 494 146 479Z" />
+<glyph unicode=";" glyph-name="semicolon" horiz-adv-x="270" d="M200 479V400Q200 386 186 386H145Q130 386 130 400V479Q130 494 145 494H186Q200 494 200 479ZM130 32V93Q130 108 145 108H186Q200 108 200 93V29Q200 -61 100 -93Q86 -98 81 -84L71 -55Q66
+-42 80 -36Q109 -23 119 -8T130 32Z" />
+<glyph unicode="&lt;" glyph-name="less" horiz-adv-x="539" d="M445 469L148 340L445 211Q460 204 460 195V155Q460 136 445 142L93 301Q79 308 79 318V363Q79 372 93 379L445 538Q452 541 456 537T460 525V485Q460 476 445 469Z" />
+<glyph unicode="=" glyph-name="equal" horiz-adv-x="588" d="M94 450H494Q509 450 509 436V406Q509 391 494 391H94Q79 391 79 406V436Q79 450 94 450ZM94 271H494Q509 271 509 257V227Q509 213 494 213H94Q79 213 79 227V257Q79 271 94 271Z" />
+<glyph unicode="&gt;" glyph-name="greater" horiz-adv-x="539" d="M391 340L94 468Q79 475 79 485V526Q79 545 94 539L446 380Q460 373 460 363V318Q460 307 446 300L94 141Q79 135 79 154V194Q79 205 94 212L391 340Z" />
+<glyph unicode="?" glyph-name="question" horiz-adv-x="567" d="M235 177V255Q235 318 301 351L371 387Q421 415 421 464V531Q421 578 390 603T283 628Q207 628 176 603T144 531V485Q144 469 130 469H90Q75 469 75 485V542Q75 688 283 688Q490 688 492 542V466Q492
+376 409 336L356 310Q306 286 306 239V177Q306 162 292 162H249Q235 162 235 177ZM306 93V15Q306 0 292 0H249Q235 0 235 15V93Q235 108 249 108H292Q306 108 306 93Z" />
+<glyph unicode="@" glyph-name="at" horiz-adv-x="852" d="M610 -122H426Q325 -122 257 -108T154 -68T105 -13T91 55V449Q91 479 99 503T129 550T187 589T284 614T426 624Q527 624 595 611T699 571T748 516T762 449V165Q762 33 632 33Q543 33 520 97Q441 33 359
+33Q242 33 242 139Q242 153 243 161L260 330Q273 458 395 458Q466 458 537 402L542 436Q545 450 559 450H594Q607 450 606 436L580 177Q571 86 636 86Q694 86 694 173V446Q694 505 636 536T426 567Q276 567 217 536T158 446V57Q158 19 179 -6T262 -48T426 -64H610Q625
+-64 625 -78V-107Q625 -122 610 -122ZM326 318L312 182Q310 162 310 161Q310 98 385 98Q440 98 510 145Q510 146 510 149T510 154T510 160L530 345Q470 396 413 396Q334 396 326 318Z" />
+<glyph unicode="A" glyph-name="A" horiz-adv-x="526" d="M289 680Q302 680 307 665L507 15Q512 0 495 0H452Q438 0 434 15L379 193H150L96 15Q92 0 79 0H39Q24 0 28 15L227 665Q232 680 246 680H289ZM364 250L291 484Q284 507 266 605Q256 532 241 486L167 250H364Z" />
+<glyph unicode="B" glyph-name="B" horiz-adv-x="582" d="M304 0H105Q91 0 91 15V665Q91 680 105 680H277Q493 680 493 540V474Q493 386 403 356Q521 330 521 233V144Q521 0 304 0ZM304 322H161V59H304Q450 59 450 155V229Q450 322 304 322ZM277 621H161V378H287Q423
+378 423 475V529Q423 575 389 598T277 621Z" />
+<glyph unicode="C" glyph-name="C" horiz-adv-x="552" d="M501 202V138Q501 -8 290 -8T79 138V542Q79 688 290 688T501 542V491Q501 475 487 475H447Q432 475 432 491V531Q432 627 291 627T150 531V149Q150 53 291 53T432 149V202Q432 217 447 217H487Q501 217 501 202Z" />
+<glyph unicode="D" glyph-name="D" horiz-adv-x="602" d="M306 0H103Q91 0 91 15V665Q91 680 104 680H306Q523 680 523 534V146Q523 0 306 0ZM306 619H161V61H306Q452 61 452 157V523Q452 619 306 619Z" />
+<glyph unicode="E" glyph-name="E" horiz-adv-x="524" d="M458 0H104Q91 0 91 15V665Q91 680 105 680H446Q461 680 461 665V634Q461 619 446 619H161V386H428Q443 386 443 371V342Q443 327 428 327H161V61H458Q473 61 473 47V15Q473 0 458 0Z" />
+<glyph unicode="F" glyph-name="F" horiz-adv-x="528" d="M105 680H472Q487 680 487 665V634Q487 619 472 619H161V385H454Q468 385 468 370V338Q468 323 454 323H161V15Q161 0 147 0H105Q91 0 91 15V665Q91 680 105 680Z" />
+<glyph unicode="G" glyph-name="G" horiz-adv-x="567" d="M298 327H486Q501 327 501 313V138Q501 -8 290 -8T79 138V542Q79 688 290 688T501 542V494Q501 480 487 480H447Q432 480 432 494V531Q432 627 291 627T150 531V149Q150 53 291 53T432 148V266H298Q284
+266 284 281V313Q284 327 298 327Z" />
+<glyph unicode="H" glyph-name="H" horiz-adv-x="614" d="M161 665V390H452V665Q452 680 466 680H509Q523 680 523 665V15Q523 0 509 0H466Q452 0 452 15V330H161V15Q161 0 147 0H105Q91 0 91 15V665Q91 680 105 680H147Q161 680 161 665Z" />
+<glyph unicode="I" glyph-name="I" horiz-adv-x="252" d="M161 665V15Q161 0 147 0H105Q91 0 91 15V665Q91 680 105 680H147Q161 680 161 665Z" />
+<glyph unicode="J" glyph-name="J" horiz-adv-x="496" d="M100 183V149Q100 102 127 78T221 53T314 77T341 149V665Q341 680 355 680H397Q412 680 412 665V138Q412 70 370 31T221 -8Q30 -8 30 138V183Q30 199 45 199H86Q100 199 100 183Z" />
+<glyph unicode="K" glyph-name="K" horiz-adv-x="549" d="M252 345L529 15Q533 10 531 5T522 0H466Q454 0 443 15L192 313H161V15Q161 0 147 0H105Q90 0 90 15V665Q90 680 105 680H147Q161 680 161 665V367H192L423 666Q434 680 448 680H494Q502 680 504 676T501
+665L252 345Z" />
+<glyph unicode="L" glyph-name="L" horiz-adv-x="490" d="M162 665V61H442Q456 61 456 47V15Q456 0 442 0H103Q91 0 91 15V665Q91 680 105 680H148Q162 680 162 665Z" />
+<glyph unicode="M" glyph-name="M" horiz-adv-x="726" d="M636 665V15Q636 0 621 0H581Q566 0 566 15V531Q558 496 546 469L401 119Q395 104 381 104H344Q331 104 325 119L174 478Q167 494 157 530V15Q157 0 143 0H105Q90 0 90 15V665Q90 680 105 680H143Q153
+680 156 672L345 230Q358 199 363 179Q371 202 382 229L567 672Q570 680 581 680H621Q636 680 636 665Z" />
+<glyph unicode="N" glyph-name="N" horiz-adv-x="613" d="M522 665V15Q522 0 508 0H470Q460 0 456 7L191 477Q162 527 157 542V15Q157 0 143 0H105Q90 0 90 15V665Q90 680 105 680H143Q152 680 155 674L426 197L456 137V665Q456 680 470 680H508Q522 680 522 665Z" />
+<glyph unicode="O" glyph-name="O" horiz-adv-x="591" d="M79 138V542Q79 688 295 688Q512 688 512 542V138Q512 -8 295 -8Q79 -8 79 138ZM441 149V531Q441 627 295 627Q150 627 150 531V149Q150 53 295 53Q441 53 441 149Z" />
+<glyph unicode="P" glyph-name="P" horiz-adv-x="566" d="M302 262H161V15Q161 0 147 0H105Q91 0 91 15V665Q91 680 104 680H302Q519 680 519 534V409Q519 262 302 262ZM302 619H161V323H302Q448 323 448 420V523Q448 619 302 619Z" />
+<glyph unicode="Q" glyph-name="Q" horiz-adv-x="590" d="M512 138Q512 17 363 -3L497 -126Q509 -136 499 -147L477 -170Q468 -181 457 -171L280 -8Q79 -3 79 138V542Q79 688 295 688Q512 688 512 542V138ZM150 148Q150 51 295 51Q441 51 441 148V532Q441 629
+295 629Q150 629 150 532V148Z" />
+<glyph unicode="R" glyph-name="R" horiz-adv-x="590" d="M302 277H161V15Q161 0 147 0H105Q91 0 91 15V665Q91 680 104 680H302Q519 680 519 534V422Q519 313 395 286L525 15Q528 8 524 4T511 0H469Q459 0 451 15L327 277H302ZM302 619H161V337H302Q448 337 448
+434V523Q448 619 302 619Z" />
+<glyph unicode="S" glyph-name="S" horiz-adv-x="565" d="M424 533Q424 579 393 603T287 628Q212 628 181 604T149 533V503Q149 448 207 425L395 354Q499 315 499 224V138Q499 -8 285 -8T71 138V193Q71 208 85 208H126Q140 208 140 193V147Q140 52 284 52Q429
+52 429 147V209Q429 244 407 263T346 297L167 366Q132 379 106 411T80 486V542Q80 688 286 688Q494 688 494 542V495Q494 480 479 480H438Q424 480 424 495V533Z" />
+<glyph unicode="T" glyph-name="T" horiz-adv-x="483" d="M33 680H449Q464 680 464 665V634Q464 619 449 619H277V15Q277 0 263 0H220Q205 0 205 15V619H33Q18 619 18 634V665Q18 680 33 680Z" />
+<glyph unicode="U" glyph-name="U" horiz-adv-x="602" d="M156 665V149Q156 53 300 53Q447 53 447 149V665Q447 680 461 680H503Q517 680 517 665V138Q517 -8 300 -8Q85 -8 85 138V665Q85 680 99 680H142Q156 680 156 665Z" />
+<glyph unicode="V" glyph-name="V" horiz-adv-x="526" d="M246 0Q232 0 227 15L28 665Q24 680 39 680H85Q98 680 102 665L245 196Q249 181 254 158T264 113T268 91Q283 165 292 194L436 665Q440 680 453 680H495Q512 680 507 665L307 15Q302 0 289 0H246Z" />
+<glyph unicode="W" glyph-name="W" horiz-adv-x="801" d="M446 665L565 195Q578 143 581 116Q581 134 597 195L717 665Q721 680 735 680H772Q787 680 783 665L618 15Q613 0 600 0H558Q545 0 540 15L419 493Q412 518 406 562Q400 528 392 492L271 15Q267 0 252
+0H210Q197 0 193 15L28 665Q23 680 40 680H83Q95 680 100 665L219 195L235 121Q240 152 251 195L371 665Q375 680 389 680H429Q441 680 446 665Z" />
+<glyph unicode="X" glyph-name="X" horiz-adv-x="552" d="M323 345L518 15Q527 0 510 0H461Q448 0 439 15L280 283L126 15Q117 0 105 0H58Q42 0 51 17L243 347L56 664Q46 680 62 680H112Q125 680 134 665L288 406L435 665Q443 680 456 680H502Q517 680 509 665L323 345Z" />
+<glyph unicode="Y" glyph-name="Y" horiz-adv-x="517" d="M104 665L251 375Q255 367 258 358T264 343L266 337Q266 345 281 375L433 665Q441 680 451 680H493Q511 680 503 665L302 277V15Q302 0 287 0H245Q230 0 230 15V269L28 665Q21 680 38 680H86Q97 680 104 665Z" />
+<glyph unicode="Z" glyph-name="Z" horiz-adv-x="503" d="M83 680H432Q447 680 447 665V634Q447 628 444 623L136 61H448Q463 61 463 47V15Q463 0 448 0H65Q51 0 51 15V47Q51 54 53 57L360 619H83Q68 619 68 634V665Q68 680 83 680Z" />
+<glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="366" d="M86 -196V684Q86 699 101 699H288Q302 699 302 684V653Q302 638 288 638H158V-150H288Q302 -150 302 -165V-196Q302 -211 288 -211H101Q86 -211 86 -196Z" />
+<glyph unicode="\" glyph-name="backslash" horiz-adv-x="369" d="M260 -133L44 684Q40 699 55 699H100Q114 699 118 684L333 -133Q338 -148 322 -148H277Q263 -148 260 -133Z" />
+<glyph unicode="]" glyph-name="bracketright" horiz-adv-x="366" d="M279 684V-196Q279 -211 265 -211H79Q64 -211 64 -196V-165Q64 -150 79 -150H208V638H79Q64 638 64 653V684Q64 699 79 699H265Q279 699 279 684Z" />
+<glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="557" d="M413 314L283 610L155 314Q149 298 139 298H99Q80 298 86 314L245 666Q252 680 261 680H306Q316 680 323 666L482 314Q488 298 470 298H429Q419 298 413 314Z" />
+<glyph unicode="_" glyph-name="underscore" horiz-adv-x="433" d="M37 -85H396Q411 -85 411 -99V-129Q411 -143 396 -143H37Q23 -143 23 -129V-99Q23 -85 37 -85Z" />
+<glyph unicode="`" glyph-name="grave" horiz-adv-x="331" d="M184 577L105 693Q94 708 112 708H156Q167 708 176 694L243 582Q252 568 236 568H202Q191 568 184 577Z" />
+<glyph unicode="a" glyph-name="a" horiz-adv-x="505" d="M72 358V375Q72 502 252 502T432 375V15Q432 0 418 0H382Q368 0 367 15L365 51Q291 -8 200 -8Q133 -8 98 25T62 110V160Q62 211 95 244T192 278H364V368Q364 405 339 425T251 445T163 426T137 370V358Q137
+342 122 342H86Q72 342 72 358ZM216 50Q292 50 364 106V223H205Q129 223 129 151V119Q129 50 216 50Z" />
+<glyph unicode="b" glyph-name="b" horiz-adv-x="524" d="M130 0H94Q79 0 79 15V684Q79 699 94 699H134Q148 699 148 684V443Q226 502 318 502Q387 502 421 468T456 374V120Q456 61 422 27T318 -8Q220 -8 147 52L145 15Q144 0 130 0ZM387 130V364Q387 439 299
+439Q221 439 148 382V111Q224 55 299 55Q387 55 387 130Z" />
+<glyph unicode="c" glyph-name="c" horiz-adv-x="479" d="M68 502T250 502T432 373V354Q432 339 417 339H380Q365 339 365 354V369Q365 406 340 425T251 445T163 426T137 369V126Q137 88 162 69T251 49T339 68T365 126V148Q365 163 380 163H417Q432 163 432 148V121Q432
+-8 249 -8Q151 -8 110 25T68 121V373Q68 502 250 502Z" />
+<glyph unicode="d" glyph-name="d" horiz-adv-x="524" d="M379 15L377 52Q301 -8 207 -8Q137 -8 103 26T68 120V374Q68 433 102 467T207 502Q296 502 376 443V684Q376 699 390 699H430Q445 699 445 684V15Q445 0 430 0H394Q380 0 379 15ZM137 364V130Q137 97 158
+76T225 55Q300 55 376 111V382Q303 439 225 439Q180 439 159 418T137 364Z" />
+<glyph unicode="e" glyph-name="e" horiz-adv-x="492" d="M433 373V250Q433 236 419 236H136V125Q136 87 161 68T252 48T342 67T368 125V142Q368 156 382 156H418Q433 156 433 142V121Q433 -8 250 -8Q68 -8 68 121V373Q68 502 252 502Q350 502 391 469T433 373ZM136
+369V289H368V369Q368 446 252 446T136 369Z" />
+<glyph unicode="f" glyph-name="f" horiz-adv-x="322" d="M96 492H104V578Q104 706 291 706H297Q312 706 312 692V662Q312 647 297 647H291Q174 647 174 571V492H283Q298 492 298 478V450Q298 435 283 435H174V15Q174 0 159 0H119Q104 0 104 15V435H42Q28 435
+28 450V474Q28 488 42 489L96 492Z" />
+<glyph unicode="g" glyph-name="g" horiz-adv-x="524" d="M207 -8Q137 -8 103 26T68 120V374Q68 433 102 467T207 502Q303 502 377 441L379 479Q380 494 394 494H430Q445 494 445 479V-77Q445 -206 258 -206H122Q107 -206 107 -192V-162Q107 -148 122 -148H258Q376
+-148 376 -71V50Q297 -8 207 -8ZM137 364V130Q137 97 158 76T225 55Q300 55 376 111V382Q303 439 225 439Q180 439 159 418T137 364Z" />
+<glyph unicode="h" glyph-name="h" horiz-adv-x="529" d="M148 684V443Q219 502 318 502Q385 502 420 468T456 379V15Q456 0 442 0H402Q387 0 387 15V364Q387 440 299 440Q220 440 148 384V15Q148 0 134 0H94Q79 0 79 15V684Q79 699 94 699H134Q148 699 148 684Z" />
+<glyph unicode="i" glyph-name="i" horiz-adv-x="228" d="M148 479V15Q148 0 134 0H94Q79 0 79 15V479Q79 494 94 494H134Q148 494 148 479ZM148 684V591Q148 576 134 576H94Q79 576 79 591V684Q79 699 94 699H134Q148 699 148 684Z" />
+<glyph unicode="j" glyph-name="j" horiz-adv-x="227" d="M148 684V591Q148 576 134 576H93Q79 576 79 591V684Q79 699 93 699H134Q148 699 148 684ZM148 479V-77Q148 -206 -38 -206H-45Q-59 -206 -59 -192V-162Q-59 -148 -45 -148H-38Q79 -148 79 -71V479Q79
+494 93 494H134Q148 494 148 479Z" />
+<glyph unicode="k" glyph-name="k" horiz-adv-x="459" d="M238 280L450 15Q455 10 453 5T443 0H398Q386 0 374 15L182 251H148V15Q148 0 134 0H93Q79 0 79 15V684Q79 699 93 699H134Q148 699 148 684V304H181L351 479Q364 494 375 494H420Q428 494 430 490T427
+479L238 280Z" />
+<glyph unicode="l" glyph-name="l" horiz-adv-x="228" d="M148 684V15Q148 0 134 0H94Q79 0 79 15V684Q79 699 94 699H134Q148 699 148 684Z" />
+<glyph unicode="m" glyph-name="m" horiz-adv-x="826" d="M94 494H130Q145 494 145 479L146 442Q216 502 312 502Q409 502 439 434Q520 502 614 502Q682 502 717 468T753 379V15Q753 0 738 0H698Q683 0 683 15V364Q683 440 595 440Q510 440 449 382Q450 377 450
+364V15Q450 0 436 0H396Q381 0 381 15V364Q381 440 293 440Q213 440 148 384V15Q148 0 134 0H94Q79 0 79 15V479Q79 494 94 494Z" />
+<glyph unicode="n" glyph-name="n" horiz-adv-x="529" d="M130 494Q144 494 145 479L147 441Q218 502 318 502Q385 502 420 468T456 379V15Q456 0 442 0H402Q387 0 387 15V364Q387 440 299 440Q220 440 148 384V15Q148 0 134 0H94Q79 0 79 15V479Q79 494 94 494H130Z" />
+<glyph unicode="o" glyph-name="o" horiz-adv-x="513" d="M68 121V373Q68 502 256 502Q445 502 445 373V121Q445 -8 256 -8Q68 -8 68 121ZM376 126V368Q376 445 256 445Q137 445 137 368V126Q137 49 256 49Q376 49 376 126Z" />
+<glyph unicode="p" glyph-name="p" horiz-adv-x="524" d="M130 494Q144 494 145 479L147 441Q221 502 318 502Q387 502 421 468T456 374V120Q456 61 422 27T318 -8Q224 -8 148 50V-192Q148 -206 134 -206H94Q79 -206 79 -192V479Q79 494 94 494H130ZM387 130V364Q387
+439 299 439Q221 439 148 382V111Q224 55 299 55Q387 55 387 130Z" />
+<glyph unicode="q" glyph-name="q" horiz-adv-x="524" d="M377 441L379 479Q380 494 394 494H430Q445 494 445 479V-192Q445 -206 430 -206H390Q376 -206 376 -192V50Q297 -8 207 -8Q137 -8 103 26T68 120V374Q68 433 102 467T207 502Q300 502 377 441ZM137 364V130Q137
+97 158 76T225 55Q300 55 376 111V382Q303 439 225 439Q180 439 159 418T137 364Z" />
+<glyph unicode="r" glyph-name="r" horiz-adv-x="345" d="M311 502Q327 502 327 487V454Q327 439 311 439Q224 436 148 372V15Q148 0 134 0H94Q79 0 79 15V479Q79 494 94 494H130Q144 494 145 479L148 430Q226 502 311 502Z" />
+<glyph unicode="s" glyph-name="s" horiz-adv-x="465" d="M347 359V388Q347 450 236 450Q127 450 127 388V362Q127 323 178 307L332 257Q418 229 418 162V105Q418 56 373 24T236 -8T100 24T55 105V132Q55 146 69 146H106Q119 146 119 132V108Q119 45 236 45Q293
+45 323 61T354 108V145Q354 182 295 201L141 252Q111 262 88 288T64 349V388Q64 438 105 470T237 502Q326 502 368 470T411 388V359Q411 346 397 346H360Q347 346 347 359Z" />
+<glyph unicode="t" glyph-name="t" horiz-adv-x="347" d="M170 492H282Q297 492 297 478V450Q297 435 282 435H170V136Q170 98 196 79T286 59H303Q318 59 318 44V15Q318 0 303 0H277Q179 0 140 32T100 129V435H40Q26 435 26 450V474Q26 488 40 489L92 492H100V598Q100
+613 115 613H156Q170 613 170 598V492Z" />
+<glyph unicode="u" glyph-name="u" horiz-adv-x="523" d="M378 15L376 51Q307 -8 212 -8Q144 -8 109 25T73 114V479Q73 494 87 494H128Q142 494 142 479V130Q142 54 231 54Q308 54 375 109V479Q375 494 389 494H430Q444 494 444 479V15Q444 0 430 0H393Q379 0 378 15Z" />
+<glyph unicode="v" glyph-name="v" horiz-adv-x="432" d="M242 0H196Q185 0 181 14L23 479Q18 494 36 494H79Q91 494 96 479L208 148Q218 115 222 86Q231 131 237 147L351 479Q356 494 368 494H406Q424 494 419 479L258 14Q254 0 242 0Z" />
+<glyph unicode="w" glyph-name="w" horiz-adv-x="656" d="M642 479L512 14Q508 0 497 0H449Q436 0 433 14L345 352Q343 360 335 399L323 351L227 14Q222 0 211 0H165Q153 0 149 14L23 479Q18 494 37 494H77Q90 494 93 479L187 131Q189 124 190 115T193 99T195
+91Q195 95 205 131L301 479Q306 494 318 494H361Q374 494 377 479L467 131L476 92Q476 98 486 131L579 479Q584 494 596 494H630Q647 494 642 479Z" />
+<glyph unicode="x" glyph-name="x" horiz-adv-x="464" d="M277 249L438 15Q447 0 430 0H385Q372 0 363 15L234 201L110 15Q101 0 88 0H48Q31 0 40 15L200 251L45 479Q40 485 42 489T52 494H98Q109 494 120 479L244 299L363 479Q372 494 385 494H425Q432 494 434
+490T432 479L277 249Z" />
+<glyph unicode="y" glyph-name="y" horiz-adv-x="432" d="M94 479L207 147Q211 135 214 121T219 97T221 87Q231 127 237 145L351 479Q356 494 368 494H406Q424 494 419 479L190 -192Q184 -207 173 -207H142Q125 -207 130 -192L190 -4L23 479Q18 494 36 494H77Q89
+494 94 479Z" />
+<glyph unicode="z" glyph-name="z" horiz-adv-x="454" d="M75 494H375Q390 494 390 480V452Q390 444 387 440L132 58H389Q404 58 404 43V15Q404 0 389 0H62Q47 0 47 15V43Q47 49 51 55L304 436H75Q60 436 60 451V480Q60 494 75 494Z" />
+<glyph unicode="{" glyph-name="braceleft" horiz-adv-x="448" d="M180 355V579Q180 708 366 708H373Q387 708 387 693V664Q387 649 373 649H366Q303 649 277 630T251 572V348Q251 268 170 249Q251 228 251 149V-82Q251 -120 277 -139T366 -159H373Q387 -159 387
+-174V-203Q387 -218 373 -218H366Q180 -218 180 -89V143Q180 219 72 219H71Q56 219 56 234V263Q56 278 71 278H72Q180 278 180 355Z" />
+<glyph unicode="|" glyph-name="bar" horiz-adv-x="252" d="M162 684V-196Q162 -211 148 -211H105Q91 -211 91 -196V684Q91 699 105 699H148Q162 699 162 684Z" />
+<glyph unicode="}" glyph-name="braceright" horiz-adv-x="448" d="M268 579V355Q268 278 376 278H377Q391 278 391 263V234Q391 219 377 219H376Q268 219 268 143V-89Q268 -218 81 -218H75Q60 -218 60 -203V-174Q60 -159 75 -159H81Q144 -159 170 -140T196 -82V149Q196
+228 278 249Q196 268 196 348V572Q196 610 170 629T81 649H75Q60 649 60 664V693Q60 708 75 708H81Q268 708 268 579Z" />
+<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="486" d="M160 283Q144 283 140 275T132 237L131 228Q130 215 115 215H94Q79 215 81 231L83 259Q86 303 105 324T154 345Q175 345 203 331L289 286Q317 272 331 272Q346 272 352 282T358 320V328Q358 341
+374 341H396Q410 341 409 324L407 297Q400 211 338 211Q312 211 283 226L195 271Q173 283 160 283Z" />
+<glyph unicode="&#xa0;" glyph-name="uni00A0" horiz-adv-x="224" />
+<glyph unicode="&#xa1;" glyph-name="exclamdown" horiz-adv-x="254" d="M91 104L98 317Q98 332 112 332H142Q156 332 156 317L163 104V-171Q163 -186 149 -186H105Q91 -186 91 -171V104ZM92 401V479Q92 494 106 494H148Q163 494 163 479V401Q163 386 148 386H106Q92
+386 92 401Z" />
+<glyph unicode="&#xa2;" glyph-name="cent" horiz-adv-x="529" d="M300 665V593Q447 582 447 466V447Q447 432 432 432H395Q380 432 380 447V462Q380 499 355 518T266 538T178 519T152 462V219Q152 181 177 162T266 142T354 161T380 219V241Q380 256 395 256H432Q447
+256 447 241V214Q447 98 300 86V15Q300 0 286 0H245Q230 0 230 15V86Q151 92 117 124T83 214V466Q83 582 230 593V665Q230 680 245 680H286Q300 680 300 665Z" />
+<glyph unicode="&#xa3;" glyph-name="sterling" horiz-adv-x="662" d="M227 370H380Q395 370 395 356V326Q395 311 380 311H227V59H428Q468 59 490 83T512 169V175Q512 191 526 191H564Q579 191 579 175V169Q579 73 544 37T445 0H97Q83 0 83 15V45Q83 59 97 59H156V311H97Q83
+311 83 326V356Q83 370 97 370H156V548Q156 615 198 651T353 688T508 652T551 548V519Q551 504 537 504H497Q483 504 483 519V537Q483 584 456 605T353 627Q280 627 254 606T227 537V370Z" />
+<glyph unicode="&#xa4;" glyph-name="currency" horiz-adv-x="554" d="M39 302H85V378H39Q24 378 24 393V411Q24 425 39 425H85V542Q85 688 296 688T507 542V491Q507 475 493 475H453Q438 475 438 491V531Q438 627 297 627T156 531V425H312Q327 425 327 411V393Q327
+378 312 378H156V302H312Q327 302 327 287V270Q327 255 312 255H156V149Q156 53 297 53T438 149V202Q438 217 453 217H493Q507 217 507 202V138Q507 -8 296 -8T85 138V255H39Q24 255 24 270V287Q24 302 39 302Z" />
+<glyph unicode="&#xa5;" glyph-name="yen" horiz-adv-x="646" d="M520 263H368V15Q368 0 353 0H311Q296 0 296 15V263H143Q129 263 129 278V296Q129 310 143 310H275L236 386H143Q129 386 129 401V419Q129 433 143 433H212L94 665Q86 680 104 680H152Q163 680
+170 665L317 375Q321 367 324 358T330 343L332 337Q332 345 347 375L499 665Q506 680 517 680H559Q576 680 569 665L449 433H520Q535 433 535 419V401Q535 386 520 386H424L385 310H520Q535 310 535 296V278Q535 263 520 263Z" />
+<glyph unicode="&#xa6;" glyph-name="brokenbar" horiz-adv-x="228" d="M148 665V329Q148 314 134 314H94Q79 314 79 329V665Q79 680 94 680H134Q148 680 148 665ZM148 140V-196Q148 -211 134 -211H94Q79 -211 79 -196V140Q79 155 94 155H134Q148 155 148 140Z" />
+<glyph unicode="&#xa7;" glyph-name="section" horiz-adv-x="549" d="M449 274V173Q449 158 435 158H399Q385 158 385 173V268Q385 294 367 309T328 331L187 373Q91 401 91 479V559Q91 688 275 688T459 561V549Q459 534 444 534H408Q394 534 394 549V564Q394 601
+368 620T277 639Q159 639 159 564V483Q159 445 226 424L360 384Q393 375 421 347T449 274ZM100 203V304Q100 319 114 319H151Q165 319 165 304V209Q165 183 183 168T222 146L363 105Q400 94 429 69T459 -2V-81Q459 -211 274 -211Q91 -211 91 -84V-71Q91 -56 105
+-56H141Q156 -56 156 -71V-87Q156 -163 273 -163Q337 -163 363 -144T390 -86V-5Q390 33 324 54L189 93Q156 102 128 130T100 203Z" />
+<glyph unicode="&#xa8;" glyph-name="dieresis" horiz-adv-x="324" d="M135 688V591Q135 577 121 577H96Q81 577 81 591V688Q81 703 96 703H121Q135 703 135 688ZM242 688V591Q242 577 228 577H203Q189 577 189 591V688Q189 703 203 703H228Q242 703 242 688Z" />
+<glyph unicode="&#xa9;" glyph-name="copyright" horiz-adv-x="728" d="M637 509V171Q637 141 632 117T609 69T562 28T482 2T364 -8T246 2T167 28T120 68T97 117T91 171V509Q91 539 96 563T119 611T166 652T246 678T364 688T482 678T561 652T608 612T631 563T637
+509ZM585 163V518Q585 642 364 642T143 517V163Q143 104 193 72T364 39Q585 39 585 163ZM282 550T364 550T477 519T508 425V410Q508 395 494 395H461Q446 395 446 410V424Q446 463 430 481T364 500T299 482T283 424V256Q283 216 299 198T364 179T429 198T446 256V277Q446
+293 461 293H494Q508 293 508 277V254Q508 192 477 161T364 129T251 160T220 254V425Q220 487 251 518Z" />
+<glyph unicode="&#xaa;" glyph-name="ordfeminine" horiz-adv-x="352" d="M68 601V611Q68 688 180 688Q291 688 291 609V397Q291 386 281 386H253Q243 386 242 397L240 416Q197 381 145 381Q103 381 82 401T61 453V482Q61 513 82 533T143 554H239V609Q239 649
+179 649Q118 649 118 609V601Q118 591 108 591H78Q68 591 68 601ZM113 421T159 421T239 452V517H153Q113 517 113 479V460Q113 421 159 421Z" />
+<glyph unicode="&#xab;" glyph-name="guillemotleft" horiz-adv-x="581" d="M486 351L344 245L486 140Q501 129 501 117V74Q501 67 496 65T486 66L301 205Q288 216 288 225V266Q288 274 301 285L486 424Q491 429 496 427T501 416V373Q501 362 486 351ZM278 351L136
+245L278 140Q293 129 293 117V74Q293 67 288 65T278 66L93 205Q80 216 80 225V266Q80 274 93 285L278 424Q283 429 288 427T293 416V373Q293 362 278 351Z" />
+<glyph unicode="&#xac;" glyph-name="logicalnot" horiz-adv-x="379" d="M76 314Q76 361 109 394T188 427Q235 427 268 394T301 314T268 235T188 202Q142 202 109 235T76 314Z" />
+<glyph unicode="&#xad;" glyph-name="uni00AD" horiz-adv-x="456" d="M94 318H362Q377 318 377 304V275Q377 260 362 260H94Q79 260 79 275V304Q79 318 94 318Z" />
+<glyph unicode="&#xae;" glyph-name="registered" horiz-adv-x="622" d="M532 550V371Q532 233 312 233Q91 233 91 371V550Q91 688 312 688Q532 688 532 550ZM484 366V554Q484 644 312 644Q139 644 139 554V367Q139 276 312 276Q484 276 484 366ZM323 421H263V335Q263
+324 253 324H224Q214 324 214 335V580Q214 591 225 591H323Q422 591 422 517V494Q422 444 374 428L413 335Q417 324 403 324H374Q366 324 363 335L326 421H323ZM318 553H263V458H318Q344 458 358 469T372 496V514Q372 553 318 553Z" />
+<glyph unicode="&#xaf;" glyph-name="overscore" horiz-adv-x="416" d="M82 651H334Q349 651 349 637V612Q349 597 334 597H82Q68 597 68 612V637Q68 651 82 651Z" />
+<glyph unicode="&#xb0;" glyph-name="degree" horiz-adv-x="405" d="M64 495V592Q64 638 95 662T203 687Q278 687 309 663T341 592V495Q341 449 310 425T203 400Q127 400 96 424T64 495ZM282 498V590Q282 639 203 639T124 590V498Q124 448 203 448T282 498Z" />
+<glyph unicode="&#xb1;" glyph-name="plusminus" horiz-adv-x="579" d="M259 228V351H94Q79 351 79 366V396Q79 410 94 410H259V532Q259 547 273 547H303Q317 547 317 532V410H485Q500 410 500 396V366Q500 351 485 351H317V228Q317 213 303 213H273Q259 213 259
+228ZM94 153H485Q500 153 500 138V109Q500 94 485 94H94Q79 94 79 109V138Q79 153 94 153Z" />
+<glyph unicode="&#xb2;" glyph-name="twosuperior" horiz-adv-x="374" d="M120 320H305Q316 320 316 309V286Q316 275 305 275H76Q66 275 66 286V399Q66 416 75 428T92 444T113 453L227 494Q260 505 260 533V590Q260 643 185 643Q113 643 113 590V563Q113 551
+102 551H70Q59 551 59 563V597Q59 688 185 688Q313 688 313 597V536Q313 477 259 458L153 420Q120 411 120 390V320Z" />
+<glyph unicode="&#xb3;" glyph-name="threesuperior" horiz-adv-x="373" d="M137 512H183Q224 512 239 524T255 564V592Q255 618 240 631T186 645Q147 645 131 632T115 592V585Q115 575 105 575H73Q62 575 62 585V600Q62 689 186 689T310 600V557Q310 505 260
+492Q314 477 314 422V359Q314 271 187 271Q59 271 59 360V375Q59 385 70 385H102Q113 385 113 375V368Q113 315 186 315Q260 315 260 368V416Q260 443 244 455T188 468H137Q125 468 125 479V501Q125 512 137 512Z" />
+<glyph unicode="&#xb4;" glyph-name="acute" horiz-adv-x="331" d="M245 693L166 577Q159 568 148 568H115Q98 568 107 582L174 694Q183 708 194 708H238Q256 708 245 693Z" />
+<glyph unicode="&#xb5;" glyph-name="uni00B5" horiz-adv-x="523" d="M378 15L376 51Q307 -8 212 -8Q167 -8 138 14L142 -191Q142 -206 128 -206H87Q73 -206 73 -191V479Q73 494 87 494H128Q142 494 142 479V130Q142 54 231 54Q308 54 375 109V479Q375 494 389
+494H430Q444 494 444 479V15Q444 0 430 0H393Q379 0 378 15Z" />
+<glyph unicode="&#xb6;" glyph-name="paragraph" horiz-adv-x="645" d="M400 666V-191Q400 -206 385 -206H343Q328 -206 328 -191V282H284Q177 282 134 316T91 413V549Q91 612 134 646T284 680H386Q400 680 400 666ZM555 665V-191Q555 -206 541 -206H498Q484 -206
+484 -191V665Q484 680 498 680H541Q555 680 555 665Z" />
+<glyph unicode="&#xb7;" glyph-name="middot" horiz-adv-x="221" d="M146 304V226Q146 211 132 211H90Q75 211 75 226V304Q75 319 90 319H132Q146 319 146 304Z" />
+<glyph unicode="&#xb8;" glyph-name="cedilla" horiz-adv-x="185" d="M91 -53H128Q163 -53 187 -72T211 -131T187 -191T128 -211H12Q-3 -211 -3 -196V-181Q-3 -167 12 -167H118Q160 -167 160 -132T118 -97H56Q32 -97 37 -78L59 5Q63 19 76 18L95 15Q110 12 105
+-3L91 -53Z" />
+<glyph unicode="&#xb9;" glyph-name="onesuperior" horiz-adv-x="375" d="M70 657L206 687Q210 688 213 686T216 677V322H306Q316 322 316 311V288Q316 277 306 277H70Q59 277 59 288V311Q59 322 70 322H161V632L70 613Q60 610 60 621V646Q60 655 70 657Z" />
+<glyph unicode="&#xba;" glyph-name="ordmasculine" horiz-adv-x="358" d="M60 461V608Q60 688 179 688T298 608V461Q298 381 179 381T60 461ZM244 466V603Q244 646 179 646T114 603V466Q114 424 179 424T244 466Z" />
+<glyph unicode="&#xbb;" glyph-name="guillemotright" horiz-adv-x="581" d="M303 147L445 253L303 358Q288 369 288 381V424Q288 431 293 433T303 432L488 293Q501 282 501 273V232Q501 224 488 213L303 74Q298 69 293 71T288 82V125Q288 136 303 147ZM95 147L237
+253L95 358Q80 369 80 381V424Q80 431 85 433T95 432L280 293Q293 282 293 273V232Q293 224 280 213L95 74Q90 69 85 71T80 82V125Q80 136 95 147Z" />
+<glyph unicode="&#xbc;" glyph-name="onequarter" horiz-adv-x="835" d="M655 397L577 169H721V397Q721 408 732 408H766Q777 408 777 397V11Q777 0 766 0H732Q721 0 721 11V124H530Q518 124 518 135V157Q518 161 520 165L600 397Q603 408 613 408H647Q659 408
+655 397ZM70 657L206 687Q210 688 213 686T216 677V322H306Q316 322 316 311V288Q316 277 306 277H70Q59 277 59 288V311Q59 322 70 322H161V633L70 613Q60 610 60 621V646Q60 655 70 657ZM563 718L366 -38Q363 -49 354 -49H319Q307 -49 310 -38L506 718Q509 729
+520 729H555Q566 729 563 718Z" />
+<glyph unicode="&#xbd;" glyph-name="onehalf" horiz-adv-x="851" d="M70 657L206 687Q210 688 213 686T216 677V322H306Q316 322 316 311V288Q316 277 306 277H70Q59 277 59 288V311Q59 322 70 322H161V633L70 613Q60 610 60 621V646Q60 655 70 657ZM556 718L359
+-38Q356 -49 347 -49H312Q300 -49 303 -38L500 718Q503 729 513 729H548Q559 729 556 718ZM597 45H782Q792 45 792 34V11Q792 0 782 0H553Q543 0 543 11V124Q543 141 552 153T569 169T590 178L704 219Q736 230 736 258V315Q736 368 662 368Q590 368 590 315V288Q590
+276 579 276H547Q535 276 535 288V322Q535 413 662 413Q790 413 790 322V261Q790 202 736 183L630 145Q597 133 597 115V45Z" />
+<glyph unicode="&#xbe;" glyph-name="threequarters" horiz-adv-x="837" d="M137 511H183Q224 511 239 523T255 563V591Q255 617 240 630T186 644Q147 644 131 631T115 591V584Q115 574 105 574H73Q62 574 62 584V599Q62 688 186 688T310 599V556Q310 504 260
+491Q314 476 314 421V358Q314 270 187 270Q59 270 59 359V374Q59 384 70 384H102Q113 384 113 374V367Q113 314 186 314Q260 314 260 367V415Q260 442 244 454T188 467H137Q125 467 125 478V500Q125 511 137 511ZM657 397L578 169H723V397Q723 408 734 408H767Q778
+408 778 397V11Q778 0 767 0H734Q723 0 723 11V124H531Q520 124 520 135V157Q520 163 521 165L601 397Q604 408 615 408H649Q661 408 657 397ZM565 718L368 -38Q365 -49 357 -49H321Q310 -49 313 -38L510 718Q513 729 522 729H558Q568 729 565 718Z" />
+<glyph unicode="&#xbf;" glyph-name="questiondown" horiz-adv-x="567" d="M332 317V239Q332 176 266 143L196 107Q146 79 146 30V-37Q146 -84 177 -109T284 -134Q360 -134 391 -109T423 -37V9Q423 25 437 25H477Q492 25 492 9V-48Q492 -194 284 -194Q77 -194
+75 -48V28Q75 118 158 158L211 184Q261 208 261 255V317Q261 332 275 332H318Q332 332 332 317ZM261 401V479Q261 494 275 494H318Q332 494 332 479V401Q332 386 318 386H275Q261 386 261 401Z" />
+<glyph unicode="&#xc0;" glyph-name="Agrave" horiz-adv-x="526" d="M229 747L150 863Q139 878 157 878H201Q212 878 221 864L288 752Q297 737 281 737H247Q236 737 229 747ZM289 680Q302 680 307 665L507 15Q512 0 495 0H452Q438 0 434 15L379 193H150L96 15Q92
+0 79 0H39Q24 0 28 15L227 665Q232 680 246 680H289ZM364 250L291 484Q284 507 266 605Q256 532 241 486L167 250H364Z" />
+<glyph unicode="&#xc1;" glyph-name="Aacute" horiz-adv-x="526" d="M382 863L303 747Q296 738 284 738H251Q236 738 244 752L311 864Q320 878 330 878H374Q391 878 382 863ZM289 680Q302 680 307 665L507 15Q512 0 495 0H452Q438 0 434 15L379 193H150L96 15Q92
+0 79 0H39Q24 0 28 15L227 665Q232 680 246 680H289ZM364 250L291 484Q284 507 266 605Q256 532 241 486L167 250H364Z" />
+<glyph unicode="&#xc2;" glyph-name="Acircumflex" horiz-adv-x="526" d="M289 680Q302 680 307 665L507 15Q512 0 495 0H452Q438 0 434 15L379 193H150L96 15Q92 0 79 0H39Q24 0 28 15L227 665Q232 680 246 680H289ZM364 250L291 484Q284 507 266 605Q256 532
+241 486L167 250H364ZM267 834L214 752Q206 738 194 738H162Q154 738 152 742T154 752L231 863Q242 878 254 878H280Q292 878 303 864L380 752Q390 738 372 738H340Q329 738 320 752L267 834Z" />
+<glyph unicode="&#xc3;" glyph-name="Atilde" horiz-adv-x="526" d="M200 819Q183 819 179 810T173 772V764Q173 750 158 750H135Q122 750 122 767L124 794Q129 873 196 873Q224 873 251 854L295 822Q319 804 333 804Q349 804 353 813T359 852V860Q359 873 375
+873H397Q410 873 410 857L409 832Q406 751 336 751Q309 751 282 769L237 801Q213 819 200 819ZM289 680Q302 680 307 665L507 15Q512 0 495 0H452Q438 0 434 15L379 193H150L96 15Q92 0 79 0H39Q24 0 28 15L227 665Q232 680 246 680H289ZM364 250L291 484Q284 507
+266 605Q256 532 241 486L167 250H364Z" />
+<glyph unicode="&#xc4;" glyph-name="Adieresis" horiz-adv-x="526" d="M289 680Q302 680 307 665L507 15Q512 0 495 0H452Q438 0 434 15L379 193H150L96 15Q92 0 79 0H39Q24 0 28 15L227 665Q232 680 246 680H289ZM364 250L291 484Q284 507 266 605Q256 532 241
+486L167 250H364ZM240 856V759Q240 744 226 744H202Q187 744 187 759V856Q187 870 202 870H226Q240 870 240 856ZM348 856V759Q348 744 333 744H309Q294 744 294 759V856Q294 870 309 870H333Q348 870 348 856Z" />
+<glyph unicode="&#xc5;" glyph-name="Aring" horiz-adv-x="526" d="M289 680Q302 680 307 665L507 15Q512 0 495 0H452Q438 0 434 15L379 193H150L96 15Q92 0 79 0H39Q24 0 28 15L227 665Q232 680 246 680H289ZM364 250L291 484Q284 507 266 605Q256 532 241 486L167
+250H364ZM362 812V795Q362 762 339 741T267 720T196 741T172 795V812Q172 845 195 866T267 887T338 866T362 812ZM319 800V807Q319 849 267 849Q216 849 216 807V800Q216 758 267 758Q319 758 319 800Z" />
+<glyph unicode="&#xc6;" glyph-name="AE" horiz-adv-x="839" d="M434 680H770Q785 680 785 666V636Q785 621 770 621H485V385H752Q767 385 767 371V343Q767 328 752 328H485V59H782Q797 59 797 45V15Q797 0 782 0H435Q418 0 418 15V193H205L103 15Q94 0 85 0H45Q25
+0 34 15L413 665Q423 680 434 680ZM384 502L239 250H418V563Q399 526 384 502Z" />
+<glyph unicode="&#xc7;" glyph-name="Ccedilla" horiz-adv-x="552" d="M275 -53H312Q347 -53 371 -72T395 -131T371 -191T312 -211H196Q181 -211 181 -196V-181Q181 -167 196 -167H302Q344 -167 344 -132T302 -97H240Q216 -97 221 -78L240 -5Q79 10 79 138V542Q79
+688 290 688T501 542V491Q501 475 487 475H447Q432 475 432 491V531Q432 627 291 627T150 531V149Q150 53 291 53T432 149V202Q432 217 447 217H487Q501 217 501 202V138Q501 -8 290 -8H287L275 -53Z" />
+<glyph unicode="&#xc8;" glyph-name="Egrave" horiz-adv-x="524" d="M257 747L178 863Q167 878 185 878H229Q240 878 249 864L316 752Q325 737 309 737H275Q264 737 257 747ZM458 0H104Q91 0 91 15V665Q91 680 105 680H446Q461 680 461 665V634Q461 619 446 619H161V386H428Q443
+386 443 371V342Q443 327 428 327H161V61H458Q473 61 473 47V15Q473 0 458 0Z" />
+<glyph unicode="&#xc9;" glyph-name="Eacute" horiz-adv-x="524" d="M458 0H104Q91 0 91 15V665Q91 680 105 680H446Q461 680 461 665V634Q461 619 446 619H161V386H428Q443 386 443 371V342Q443 327 428 327H161V61H458Q473 61 473 47V15Q473 0 458 0ZM379 863L300
+747Q293 738 281 738H248Q233 738 241 752L308 864Q317 878 327 878H371Q388 878 379 863Z" />
+<glyph unicode="&#xca;" glyph-name="Ecircumflex" horiz-adv-x="524" d="M262 834L209 752Q201 738 189 738H157Q149 738 147 742T149 752L226 863Q237 878 249 878H275Q288 878 298 864L375 752Q380 746 378 742T367 738H335Q324 738 315 752L262 834ZM458 0H104Q91
+0 91 15V665Q91 680 105 680H446Q461 680 461 665V634Q461 619 446 619H161V386H428Q443 386 443 371V342Q443 327 428 327H161V61H458Q473 61 473 47V15Q473 0 458 0Z" />
+<glyph unicode="&#xcb;" glyph-name="Edieresis" horiz-adv-x="524" d="M458 0H104Q91 0 91 15V665Q91 680 105 680H446Q461 680 461 665V634Q461 619 446 619H161V386H428Q443 386 443 371V342Q443 327 428 327H161V61H458Q473 61 473 47V15Q473 0 458 0ZM249
+856V759Q249 744 235 744H211Q196 744 196 759V856Q196 870 211 870H235Q249 870 249 856ZM357 856V759Q357 744 342 744H318Q303 744 303 759V856Q303 870 318 870H342Q357 870 357 856Z" />
+<glyph unicode="&#xcc;" glyph-name="Igrave" horiz-adv-x="252" d="M172 665V15Q172 0 158 0H116Q102 0 102 15V665Q102 680 116 680H158Q172 680 172 665ZM101 747L22 863Q11 878 29 878H73Q84 878 93 864L160 752Q169 737 153 737H119Q109 737 101 747Z" />
+<glyph unicode="&#xcd;" glyph-name="Iacute" horiz-adv-x="252" d="M161 665V15Q161 0 147 0H105Q91 0 91 15V665Q91 680 105 680H147Q161 680 161 665ZM237 863L158 747Q151 738 139 738H106Q91 738 99 752L166 864Q175 878 185 878H229Q246 878 237 863Z" />
+<glyph unicode="&#xce;" glyph-name="Icircumflex" horiz-adv-x="252" d="M163 665V15Q163 0 149 0H107Q93 0 93 15V665Q93 680 107 680H149Q163 680 163 665ZM128 834L75 752Q67 738 55 738H23Q15 738 13 742T15 752L92 863Q103 878 115 878H141Q154 878 164
+864L241 752Q251 738 233 738H201Q190 738 181 752L128 834Z" />
+<glyph unicode="&#xcf;" glyph-name="Idieresis" horiz-adv-x="252" d="M161 665V15Q161 0 147 0H105Q91 0 91 15V665Q91 680 105 680H147Q161 680 161 665ZM99 856V759Q99 744 85 744H61Q46 744 46 759V856Q46 870 61 870H85Q99 870 99 856ZM207 856V759Q207
+744 192 744H168Q153 744 153 759V856Q153 870 168 870H192Q207 870 207 856Z" />
+<glyph unicode="&#xd0;" glyph-name="Eth" horiz-adv-x="602" d="M306 0H103Q91 0 91 15V317H25Q10 317 10 331V357Q10 371 25 371H91V665Q91 680 104 680H306Q523 680 523 534V146Q523 0 306 0ZM306 619H161V371H293Q308 371 308 357V331Q308 317 293 317H161V61H306Q452
+61 452 157V523Q452 619 306 619Z" />
+<glyph unicode="&#xd1;" glyph-name="Ntilde" horiz-adv-x="613" d="M522 665V15Q522 0 508 0H470Q460 0 456 7L191 477Q160 529 157 541V15Q157 0 143 0H105Q90 0 90 15V665Q90 680 105 680H143Q152 680 155 674L426 197L456 137V665Q456 680 470 680H508Q522
+680 522 665ZM240 819Q223 819 219 810T213 772V764Q213 750 198 750H175Q162 750 162 767L164 794Q169 873 236 873Q264 873 291 854L335 822Q359 804 373 804Q389 804 393 813T399 852V860Q399 873 415 873H437Q450 873 450 857L449 832Q446 751 376 751Q349
+751 322 769L277 801Q253 819 240 819Z" />
+<glyph unicode="&#xd2;" glyph-name="Ograve" horiz-adv-x="591" d="M260 747L181 863Q170 878 188 878H232Q243 878 252 864L319 752Q328 737 312 737H278Q268 737 260 747ZM79 138V542Q79 688 295 688Q512 688 512 542V138Q512 -8 295 -8Q79 -8 79 138ZM441
+149V531Q441 627 295 627Q150 627 150 531V149Q150 53 295 53Q441 53 441 149Z" />
+<glyph unicode="&#xd3;" glyph-name="Oacute" horiz-adv-x="591" d="M399 863L320 747Q313 738 301 738H268Q253 738 261 752L328 864Q337 878 347 878H391Q408 878 399 863ZM79 138V542Q79 688 295 688Q512 688 512 542V138Q512 -8 295 -8Q79 -8 79 138ZM441
+149V531Q441 627 295 627Q150 627 150 531V149Q150 53 295 53Q441 53 441 149Z" />
+<glyph unicode="&#xd4;" glyph-name="Ocircumflex" horiz-adv-x="591" d="M295 834L242 752Q234 738 222 738H190Q182 738 180 742T182 752L259 863Q270 878 282 878H308Q320 878 331 864L408 752Q418 738 400 738H368Q357 738 348 752L295 834ZM79 138V542Q79
+688 295 688Q512 688 512 542V138Q512 -8 295 -8Q79 -8 79 138ZM441 149V531Q441 627 295 627Q150 627 150 531V149Q150 53 295 53Q441 53 441 149Z" />
+<glyph unicode="&#xd5;" glyph-name="Otilde" horiz-adv-x="591" d="M229 819Q212 819 208 810T202 772V764Q202 750 187 750H164Q151 750 151 767L153 794Q158 873 225 873Q253 873 280 854L324 822Q348 804 362 804Q378 804 382 813T388 852V860Q388 873 404
+873H426Q439 873 439 857L438 832Q435 751 365 751Q338 751 311 769L266 801Q242 819 229 819ZM79 138V542Q79 688 295 688Q512 688 512 542V138Q512 -8 295 -8Q79 -8 79 138ZM441 149V531Q441 627 295 627Q150 627 150 531V149Q150 53 295 53Q441 53 441 149Z"
+/>
+<glyph unicode="&#xd6;" glyph-name="Odieresis" horiz-adv-x="591" d="M79 138V542Q79 688 295 688Q512 688 512 542V138Q512 -8 295 -8Q79 -8 79 138ZM441 149V531Q441 627 295 627Q150 627 150 531V149Q150 53 295 53Q441 53 441 149ZM268 856V759Q268 744
+254 744H230Q215 744 215 759V856Q215 870 230 870H254Q268 870 268 856ZM376 856V759Q376 744 361 744H337Q322 744 322 759V856Q322 870 337 870H361Q376 870 376 856Z" />
+<glyph unicode="&#xd7;" glyph-name="multiply" horiz-adv-x="544" d="M351 155L268 298L124 215Q111 207 103 221L90 247Q83 260 95 267L239 349L155 494Q148 507 160 514L185 529Q197 536 205 523L289 379L434 462Q445 468 453 457L468 432Q475 419 462 411L318
+327L401 184Q407 172 395 164L370 149Q358 142 351 155Z" />
+<glyph unicode="&#xd8;" glyph-name="Oslash" horiz-adv-x="591" d="M79 137V540Q79 686 295 686Q381 686 436 661L448 685Q459 707 473 707H486Q501 707 490 685L468 641Q512 605 512 540V137Q512 -10 295 -10Q206 -10 152 16L140 -7Q128 -29 116 -29H103Q87
+-29 98 -7L120 37Q79 74 79 137ZM441 148V529Q441 552 432 570L183 78Q220 51 295 51Q441 51 441 148ZM150 148Q150 125 157 110L405 601Q369 626 295 626Q150 626 150 529V148Z" />
+<glyph unicode="&#xd9;" glyph-name="Ugrave" horiz-adv-x="602" d="M270 747L191 863Q180 878 198 878H242Q253 878 262 864L329 752Q338 737 322 737H288Q278 737 270 747ZM156 665V149Q156 53 300 53Q447 53 447 149V665Q447 680 461 680H503Q517 680 517 665V138Q517
+-8 300 -8Q85 -8 85 138V665Q85 680 99 680H142Q156 680 156 665Z" />
+<glyph unicode="&#xda;" glyph-name="Uacute" horiz-adv-x="602" d="M156 665V149Q156 53 300 53Q447 53 447 149V665Q447 680 461 680H503Q517 680 517 665V138Q517 -8 300 -8Q85 -8 85 138V665Q85 680 99 680H142Q156 680 156 665ZM411 863L332 747Q325 738
+313 738H280Q265 738 273 752L340 864Q349 878 359 878H403Q420 878 411 863Z" />
+<glyph unicode="&#xdb;" glyph-name="Ucircumflex" horiz-adv-x="602" d="M301 834L248 752Q240 738 228 738H196Q188 738 186 742T188 752L265 863Q276 878 288 878H314Q326 878 337 864L414 752Q424 738 406 738H374Q363 738 354 752L301 834ZM156 665V149Q156
+53 300 53Q447 53 447 149V665Q447 680 461 680H503Q517 680 517 665V138Q517 -8 300 -8Q85 -8 85 138V665Q85 680 99 680H142Q156 680 156 665Z" />
+<glyph unicode="&#xdc;" glyph-name="Udieresis" horiz-adv-x="602" d="M156 665V149Q156 53 300 53Q447 53 447 149V665Q447 680 461 680H503Q517 680 517 665V138Q517 -8 300 -8Q85 -8 85 138V665Q85 680 99 680H142Q156 680 156 665ZM274 856V759Q274 744 260
+744H236Q221 744 221 759V856Q221 870 236 870H260Q274 870 274 856ZM382 856V759Q382 744 367 744H343Q328 744 328 759V856Q328 870 343 870H367Q382 870 382 856Z" />
+<glyph unicode="&#xdd;" glyph-name="Yacute" horiz-adv-x="517" d="M104 665L251 375Q255 367 258 358T264 343L266 337Q266 345 281 375L433 665Q441 680 451 680H493Q511 680 503 665L302 277V15Q302 0 287 0H245Q230 0 230 15V269L28 665Q21 680 38 680H86Q97
+680 104 665ZM384 863L305 747Q298 738 286 738H253Q238 738 246 752L313 864Q322 878 332 878H376Q393 878 384 863Z" />
+<glyph unicode="&#xde;" glyph-name="Thorn" horiz-adv-x="566" d="M161 665V494H302Q519 494 519 348V246Q519 101 302 101H161V15Q161 0 147 0H105Q90 0 90 15V665Q90 680 105 680H147Q161 680 161 665ZM302 434H161V160H302Q448 160 448 257V337Q448 434 302 434Z" />
+<glyph unicode="&#xdf;" glyph-name="germandbls" horiz-adv-x="603" d="M174 574V15Q174 0 159 0H119Q104 0 104 15V435H42Q28 435 28 450V474Q28 488 42 489L96 492H104V579Q104 708 299 708Q493 708 493 579V542Q493 480 417 455L354 435Q337 430 329 427T312
+414T302 391V386Q302 352 356 330L475 284Q567 249 567 183V119Q567 58 530 25T400 -8Q308 -8 274 23T240 117V127Q240 143 254 143H283Q297 143 297 127V115Q297 78 319 59T400 40T480 59T503 115V171Q503 179 501 186T494 198T486 207T474 215T463 221T451 226T441
+230L327 275Q243 308 243 377V393Q243 453 318 477L373 494Q429 510 429 552V574Q429 653 302 653Q174 653 174 574Z" />
+<glyph unicode="&#xe0;" glyph-name="agrave" horiz-adv-x="505" d="M239 577L160 693Q149 708 167 708H211Q222 708 231 694L298 582Q307 568 291 568H257Q246 568 239 577ZM72 358V375Q72 502 252 502T432 375V15Q432 0 418 0H382Q368 0 367 15L365 51Q291 -8
+200 -8Q133 -8 98 25T62 110V160Q62 211 95 244T192 278H364V368Q364 405 339 425T251 445T163 426T137 370V358Q137 342 122 342H86Q72 342 72 358ZM216 50Q292 50 364 106V223H205Q129 223 129 151V119Q129 50 216 50Z" />
+<glyph unicode="&#xe1;" glyph-name="aacute" horiz-adv-x="505" d="M343 693L264 577Q257 568 246 568H213Q196 568 205 582L272 694Q281 708 292 708H336Q354 708 343 693ZM72 358V375Q72 502 252 502T432 375V15Q432 0 418 0H382Q368 0 367 15L365 51Q291 -8
+200 -8Q133 -8 98 25T62 110V160Q62 211 95 244T192 278H364V368Q364 405 339 425T251 445T163 426T137 370V358Q137 342 122 342H86Q72 342 72 358ZM216 50Q292 50 364 106V223H205Q129 223 129 151V119Q129 50 216 50Z" />
+<glyph unicode="&#xe2;" glyph-name="acircumflex" horiz-adv-x="505" d="M72 358V375Q72 502 252 502T432 375V15Q432 0 418 0H382Q368 0 367 15L365 51Q291 -8 200 -8Q133 -8 98 25T62 110V160Q62 211 95 244T192 278H364V368Q364 405 339 425T251 445T163 426T137
+370V358Q137 342 122 342H86Q72 342 72 358ZM216 50Q292 50 364 106V223H205Q129 223 129 151V119Q129 50 216 50ZM253 664L200 582Q192 568 180 568H148Q140 568 138 572T140 582L216 693Q227 708 239 708H265Q278 708 288 694L366 582Q375 568 358 568H326Q315
+568 306 582L253 664Z" />
+<glyph unicode="&#xe3;" glyph-name="atilde" horiz-adv-x="505" d="M187 643Q170 643 166 634T160 596V588Q160 574 145 574H122Q109 574 109 591L111 618Q116 697 183 697Q211 697 238 678L282 646Q306 628 320 628Q336 628 340 637T346 676V684Q346 697 362
+697H384Q397 697 397 681L396 656Q393 575 323 575Q296 575 269 593L224 625Q200 643 187 643ZM72 358V375Q72 502 252 502T432 375V15Q432 0 418 0H382Q368 0 367 15L365 51Q291 -8 200 -8Q133 -8 98 25T62 110V160Q62 211 95 244T192 278H364V368Q364 405 339
+425T251 445T163 426T137 370V358Q137 342 122 342H86Q72 342 72 358ZM216 50Q292 50 364 106V223H205Q129 223 129 151V119Q129 50 216 50Z" />
+<glyph unicode="&#xe4;" glyph-name="adieresis" horiz-adv-x="505" d="M72 358V375Q72 502 252 502T432 375V15Q432 0 418 0H382Q368 0 367 15L365 51Q291 -8 200 -8Q133 -8 98 25T62 110V160Q62 211 95 244T192 278H364V368Q364 405 339 425T251 445T163 426T137
+370V358Q137 342 122 342H86Q72 342 72 358ZM216 50Q292 50 364 106V223H205Q129 223 129 151V119Q129 50 216 50ZM225 688V591Q225 577 211 577H186Q171 577 171 591V688Q171 703 186 703H211Q225 703 225 688ZM332 688V591Q332 577 318 577H293Q279 577 279 591V688Q279
+703 293 703H318Q332 703 332 688Z" />
+<glyph unicode="&#xe5;" glyph-name="aring" horiz-adv-x="505" d="M72 358V375Q72 502 252 502T432 375V15Q432 0 418 0H382Q368 0 367 15L365 51Q291 -8 200 -8Q133 -8 98 25T62 110V160Q62 211 95 244T192 278H364V368Q364 405 339 425T251 445T163 426T137
+370V358Q137 342 122 342H86Q72 342 72 358ZM216 50Q292 50 364 106V223H205Q129 223 129 151V119Q129 50 216 50ZM347 649V624Q347 554 254 554Q208 554 185 573T162 624V649Q162 681 185 700T254 720Q301 720 324 701T347 649ZM306 631V642Q306 683 254 683T202
+642V631Q202 590 254 590T306 631Z" />
+<glyph unicode="&#xe6;" glyph-name="ae" horiz-adv-x="788" d="M729 373V253Q729 239 715 239H431V120Q431 83 457 64T547 45Q664 45 664 123V141Q664 156 678 156H713Q727 156 727 141V120Q727 59 686 26T547 -8Q410 -8 378 61Q292 -8 200 -8Q131 -8 96 25T61
+110V152Q61 203 95 236T192 270H363V377Q363 450 250 450Q187 450 162 431T136 373V358Q136 343 122 343H86Q71 343 71 358V375Q71 502 252 502Q365 502 397 445Q435 502 547 502Q729 502 729 373ZM216 47Q286 47 363 111V221H203Q166 221 148 201T129 149V118Q129
+85 151 66T216 47ZM431 371V288H664V371Q664 449 547 449Q431 449 431 371Z" />
+<glyph unicode="&#xe7;" glyph-name="ccedilla" horiz-adv-x="479" d="M233 -53H270Q305 -53 329 -72T353 -131T329 -191T270 -211H154Q139 -211 139 -196V-181Q139 -167 154 -167H260Q302 -167 302 -132T260 -97H198Q174 -97 179 -78L198 -5Q68 10 68 121V373Q68
+502 250 502T432 373V354Q432 339 417 339H380Q365 339 365 354V369Q365 406 340 425T251 445T163 426T137 369V126Q137 88 162 69T251 49T339 68T365 126V148Q365 163 380 163H417Q432 163 432 148V121Q432 -8 249 -8H245L233 -53Z" />
+<glyph unicode="&#xe8;" glyph-name="egrave" horiz-adv-x="492" d="M224 577L145 693Q134 708 152 708H196Q207 708 216 694L283 582Q292 568 276 568H242Q231 568 224 577ZM433 373V250Q433 236 419 236H136V125Q136 87 161 68T252 48T342 67T368 125V142Q368
+156 382 156H418Q433 156 433 142V121Q433 -8 250 -8Q68 -8 68 121V373Q68 502 252 502Q350 502 391 469T433 373ZM136 369V289H368V369Q368 446 252 446T136 369Z" />
+<glyph unicode="&#xe9;" glyph-name="eacute" horiz-adv-x="492" d="M350 693L271 577Q264 568 253 568H220Q203 568 212 582L279 694Q288 708 299 708H343Q361 708 350 693ZM433 373V250Q433 236 419 236H136V125Q136 87 161 68T252 48T342 67T368 125V142Q368
+156 382 156H418Q433 156 433 142V121Q433 -8 250 -8Q68 -8 68 121V373Q68 502 252 502Q350 502 391 469T433 373ZM136 369V289H368V369Q368 446 252 446T136 369Z" />
+<glyph unicode="&#xea;" glyph-name="ecircumflex" horiz-adv-x="492" d="M252 664L199 582Q191 568 179 568H147Q139 568 137 572T139 582L215 693Q226 708 238 708H264Q276 708 287 694L365 582Q374 568 357 568H325Q314 568 305 582L252 664ZM433 373V250Q433
+236 419 236H136V125Q136 87 161 68T252 48T342 67T368 125V142Q368 156 382 156H418Q433 156 433 142V121Q433 -8 250 -8Q68 -8 68 121V373Q68 502 252 502Q350 502 391 469T433 373ZM136 369V289H368V369Q368 446 252 446T136 369Z" />
+<glyph unicode="&#xeb;" glyph-name="edieresis" horiz-adv-x="492" d="M224 688V591Q224 577 210 577H185Q170 577 170 591V688Q170 703 185 703H210Q224 703 224 688ZM331 688V591Q331 577 317 577H292Q278 577 278 591V688Q278 703 292 703H317Q331 703 331
+688ZM433 373V250Q433 236 419 236H136V125Q136 87 161 68T252 48T342 67T368 125V142Q368 156 382 156H418Q433 156 433 142V121Q433 -8 250 -8Q68 -8 68 121V373Q68 502 252 502Q350 502 391 469T433 373ZM136 369V289H368V369Q368 446 252 446T136 369Z" />
+<glyph unicode="&#xec;" glyph-name="igrave" horiz-adv-x="227" d="M159 479V15Q159 0 145 0H104Q90 0 90 15V479Q90 494 104 494H145Q159 494 159 479ZM90 577L11 693Q0 708 18 708H62Q73 708 82 694L149 582Q158 568 142 568H108Q97 568 90 577Z" />
+<glyph unicode="&#xed;" glyph-name="iacute" horiz-adv-x="227" d="M226 693L147 577Q140 568 129 568H96Q79 568 88 582L155 694Q164 708 175 708H219Q237 708 226 693ZM150 479V15Q150 0 136 0H95Q81 0 81 15V479Q81 494 95 494H136Q150 494 150 479Z" />
+<glyph unicode="&#xee;" glyph-name="icircumflex" horiz-adv-x="227" d="M118 664L65 582Q57 568 45 568H13Q5 568 3 572T5 582L81 693Q92 708 104 708H130Q143 708 153 694L231 582Q240 568 223 568H191Q180 568 171 582L118 664ZM151 479V15Q151 0 137 0H96Q82
+0 82 15V479Q82 494 96 494H137Q151 494 151 479Z" />
+<glyph unicode="&#xef;" glyph-name="idieresis" horiz-adv-x="227" d="M88 688V591Q88 577 74 577H49Q34 577 34 591V688Q34 703 49 703H74Q88 703 88 688ZM195 688V591Q195 577 181 577H156Q142 577 142 591V688Q142 703 156 703H181Q195 703 195 688ZM148 479V15Q148
+0 134 0H93Q79 0 79 15V479Q79 494 93 494H134Q148 494 148 479Z" />
+<glyph unicode="&#xf0;" glyph-name="eth" horiz-adv-x="555" d="M277 601L352 634Q325 658 258 658H169Q154 658 154 673V693Q154 708 169 708H258Q365 708 408 665L460 689Q473 694 479 684L485 674Q492 661 478 655L431 633Q441 612 441 580V120Q441 -8 256
+-8Q68 -8 68 120V374Q68 433 102 467T207 502Q298 502 376 442V567Q376 585 368 599L296 568Q283 562 276 573L271 582Q264 594 277 601ZM376 125V384Q305 442 226 442Q180 442 159 421T137 365V125Q137 48 256 48Q376 48 376 125Z" />
+<glyph unicode="&#xf1;" glyph-name="ntilde" horiz-adv-x="530" d="M130 494Q144 494 145 479L147 441Q218 502 318 502Q385 502 420 468T456 379V15Q456 0 442 0H402Q387 0 387 15V364Q387 440 299 440Q220 440 148 384V15Q148 0 134 0H94Q79 0 79 15V479Q79
+494 94 494H130ZM196 647Q179 647 175 638T169 600V592Q169 578 154 578H131Q118 578 118 595L120 622Q125 701 192 701Q220 701 247 682L291 650Q315 632 329 632Q345 632 349 641T355 680V688Q355 701 371 701H393Q406 701 406 685L405 660Q402 579 332 579Q305
+579 278 597L233 629Q209 647 196 647Z" />
+<glyph unicode="&#xf2;" glyph-name="ograve" horiz-adv-x="513" d="M227 577L148 693Q137 708 155 708H199Q210 708 219 694L286 582Q295 568 279 568H245Q234 568 227 577ZM68 121V373Q68 502 256 502Q445 502 445 373V121Q445 -8 256 -8Q68 -8 68 121ZM376
+126V368Q376 445 256 445Q137 445 137 368V126Q137 49 256 49Q376 49 376 126Z" />
+<glyph unicode="&#xf3;" glyph-name="oacute" horiz-adv-x="513" d="M363 693L284 577Q277 568 266 568H233Q216 568 225 582L292 694Q301 708 312 708H356Q374 708 363 693ZM68 121V373Q68 502 256 502Q445 502 445 373V121Q445 -8 256 -8Q68 -8 68 121ZM376
+126V368Q376 445 256 445Q137 445 137 368V126Q137 49 256 49Q376 49 376 126Z" />
+<glyph unicode="&#xf4;" glyph-name="ocircumflex" horiz-adv-x="513" d="M257 664L204 582Q196 568 184 568H152Q134 568 144 582L220 693Q231 708 243 708H269Q282 708 292 694L370 582Q379 568 362 568H330Q319 568 310 582L257 664ZM68 121V373Q68 502 256
+502Q445 502 445 373V121Q445 -8 256 -8Q68 -8 68 121ZM376 126V368Q376 445 256 445Q137 445 137 368V126Q137 49 256 49Q376 49 376 126Z" />
+<glyph unicode="&#xf5;" glyph-name="otilde" horiz-adv-x="513" d="M191 643Q174 643 170 634T164 596V588Q164 574 149 574H126Q113 574 113 591L115 618Q120 697 187 697Q215 697 242 678L286 646Q310 628 324 628Q340 628 344 637T350 676V684Q350 697 366
+697H388Q401 697 401 681L400 656Q397 575 327 575Q300 575 273 593L228 625Q204 643 191 643ZM68 121V373Q68 502 256 502Q445 502 445 373V121Q445 -8 256 -8Q68 -8 68 121ZM376 126V368Q376 445 256 445Q137 445 137 368V126Q137 49 256 49Q376 49 376 126Z"
+/>
+<glyph unicode="&#xf6;" glyph-name="odieresis" horiz-adv-x="513" d="M230 688V591Q230 577 216 577H191Q176 577 176 591V688Q176 703 191 703H216Q230 703 230 688ZM337 688V591Q337 577 323 577H298Q284 577 284 591V688Q284 703 298 703H323Q337 703 337
+688ZM68 121V373Q68 502 256 502Q445 502 445 373V121Q445 -8 256 -8Q68 -8 68 121ZM376 126V368Q376 445 256 445Q137 445 137 368V126Q137 49 256 49Q376 49 376 126Z" />
+<glyph unicode="&#xf7;" glyph-name="divide" horiz-adv-x="588" d="M93 349H494Q509 349 509 335V305Q509 290 494 290H94Q79 290 79 305V335Q79 349 93 349ZM330 193V115Q330 100 316 100H274Q259 100 259 115V193Q259 208 274 208H316Q330 208 330 193ZM330
+528V450Q330 435 316 435H274Q259 435 259 450V528Q259 543 274 543H316Q330 543 330 528Z" />
+<glyph unicode="&#xf8;" glyph-name="oslash" horiz-adv-x="513" d="M68 121V373Q68 502 256 502Q322 502 368 484L378 502Q379 503 380 506T383 511T385 515T388 519T392 521T396 523T402 524H417Q433 524 420 502L400 467Q445 435 445 373V121Q445 -8 256 -8Q189
+-8 143 10L134 -6Q129 -15 127 -19T120 -25T109 -28H96Q80 -28 92 -6L110 27Q68 59 68 121ZM376 126V368Q376 390 366 406L173 64Q202 49 256 49Q376 49 376 126ZM137 126Q137 104 145 89L338 431Q308 445 256 445Q137 445 137 368V126Z" />
+<glyph unicode="&#xf9;" glyph-name="ugrave" horiz-adv-x="524" d="M378 15L376 51Q307 -8 212 -8Q144 -8 109 25T73 114V479Q73 494 87 494H128Q142 494 142 479V130Q142 54 231 54Q308 54 375 109V479Q375 494 389 494H430Q444 494 444 479V15Q444 0 430 0H393Q379
+0 378 15ZM237 577L158 693Q147 708 165 708H209Q220 708 229 694L296 582Q305 568 289 568H255Q244 568 237 577Z" />
+<glyph unicode="&#xfa;" glyph-name="uacute" horiz-adv-x="524" d="M364 693L285 577Q278 568 267 568H234Q217 568 226 582L293 694Q302 708 313 708H357Q375 708 364 693ZM378 15L376 51Q307 -8 212 -8Q144 -8 109 25T73 114V479Q73 494 87 494H128Q142 494
+142 479V130Q142 54 231 54Q308 54 375 109V479Q375 494 389 494H430Q444 494 444 479V15Q444 0 430 0H393Q379 0 378 15Z" />
+<glyph unicode="&#xfb;" glyph-name="ucircumflex" horiz-adv-x="524" d="M257 664L204 582Q196 568 184 568H152Q134 568 144 582L220 693Q231 708 243 708H269Q282 708 292 694L370 582Q379 568 362 568H330Q319 568 310 582L257 664ZM378 15L376 51Q307 -8
+212 -8Q144 -8 109 25T73 114V479Q73 494 87 494H128Q142 494 142 479V130Q142 54 231 54Q308 54 375 109V479Q375 494 389 494H430Q444 494 444 479V15Q444 0 430 0H393Q379 0 378 15Z" />
+<glyph unicode="&#xfc;" glyph-name="udieresis" horiz-adv-x="524" d="M234 688V591Q234 577 220 577H195Q180 577 180 591V688Q180 703 195 703H220Q234 703 234 688ZM341 688V591Q341 577 327 577H302Q288 577 288 591V688Q288 703 302 703H327Q341 703 341
+688ZM378 15L376 51Q307 -8 212 -8Q144 -8 109 25T73 114V479Q73 494 87 494H128Q142 494 142 479V130Q142 54 231 54Q308 54 375 109V479Q375 494 389 494H430Q444 494 444 479V15Q444 0 430 0H393Q379 0 378 15Z" />
+<glyph unicode="&#xfd;" glyph-name="yacute" horiz-adv-x="432" d="M94 479L207 147Q211 135 214 121T219 97T221 87Q231 127 237 145L351 479Q356 494 368 494H406Q424 494 419 479L190 -192Q184 -207 173 -207H142Q125 -207 130 -192L190 -4L23 479Q18 494
+36 494H77Q89 494 94 479ZM333 693L254 577Q247 568 236 568H203Q186 568 195 582L262 694Q271 708 282 708H326Q344 708 333 693Z" />
+<glyph unicode="&#xfe;" glyph-name="thorn" horiz-adv-x="524" d="M148 684V442Q224 502 317 502Q387 502 421 468T456 374V120Q456 60 422 26T317 -8Q222 -8 148 51V-192Q148 -207 134 -207H93Q79 -207 79 -192V684Q79 699 93 699H134Q148 699 148 684ZM387
+129V365Q387 399 366 420T298 442Q219 442 148 384V109Q218 52 298 52Q344 52 365 73T387 129Z" />
+<glyph unicode="&#xff;" glyph-name="ydieresis" horiz-adv-x="432" d="M94 479L207 147Q211 135 214 121T219 97T221 87Q231 127 237 145L351 479Q356 494 368 494H406Q424 494 419 479L190 -192Q184 -207 173 -207H142Q125 -207 130 -192L190 -4L23 479Q18 494
+36 494H77Q89 494 94 479ZM198 688V591Q198 577 184 577H159Q144 577 144 591V688Q144 703 159 703H184Q198 703 198 688ZM305 688V591Q305 577 291 577H266Q252 577 252 591V688Q252 703 266 703H291Q305 703 305 688Z" />
+<glyph unicode="&#x152;" glyph-name="OE" horiz-adv-x="874" d="M79 138V542Q79 688 295 688Q387 688 441 649V665Q441 680 455 680H797Q811 680 811 666V635Q811 621 797 621H512V385H779Q794 385 794 371V342Q794 328 779 328H512V59H809Q823 59 823 45V15Q823
+0 809 0H455Q441 0 441 15V31Q389 -8 295 -8Q79 -8 79 138ZM441 144V535Q438 629 295 629Q150 629 150 531V149Q150 51 295 51Q438 51 441 144Z" />
+<glyph unicode="&#x153;" glyph-name="oe" horiz-adv-x="800" d="M68 120V373Q68 502 256 502Q366 502 406 456Q449 502 560 502Q658 502 699 469T741 373V253Q741 239 728 239H444V123Q444 45 560 45T676 123V141Q676 156 691 156H725Q739 156 739 141V120Q739
+59 698 26T560 -8Q449 -8 406 37Q366 -8 256 -8Q68 -8 68 120ZM376 125V369Q376 446 256 446Q137 446 137 369V125Q137 48 256 48Q376 48 376 125ZM444 371V288H676V371Q676 449 560 449T444 371Z" />
+<glyph unicode="&#x160;" glyph-name="Scaron" horiz-adv-x="565" d="M424 533Q424 579 393 603T287 628Q212 628 181 604T149 533V503Q149 448 207 425L395 354Q499 315 499 224V138Q499 -8 285 -8T71 138V193Q71 208 85 208H126Q140 208 140 193V147Q140 52
+284 52Q429 52 429 147V209Q429 244 407 263T346 297L167 366Q132 379 106 411T80 486V542Q80 688 286 688Q494 688 494 542V495Q494 480 479 480H438Q424 480 424 495V533ZM233 863L286 781L339 863Q348 878 359 878H391Q399 878 401 874T399 863L322 752Q312
+738 299 738H273Q260 738 250 753L173 863Q169 869 171 873T181 878H213Q224 878 233 863Z" />
+<glyph unicode="&#x161;" glyph-name="scaron" horiz-adv-x="466" d="M185 693L238 611L291 693Q300 708 311 708H343Q360 708 351 693L273 582Q262 568 250 568H224Q211 568 201 583L125 693Q120 699 122 703T133 708H165Q176 708 185 693ZM347 359V388Q347 450
+236 450Q127 450 127 388V362Q127 323 178 307L332 257Q418 229 418 162V105Q418 56 373 24T236 -8T100 24T55 105V132Q55 146 69 146H106Q119 146 119 132V108Q119 45 236 45Q293 45 323 61T354 108V145Q354 182 295 201L141 252Q111 262 88 288T64 349V388Q64
+438 105 470T237 502Q326 502 368 470T411 388V359Q411 346 397 346H360Q347 346 347 359Z" />
+<glyph unicode="&#x178;" glyph-name="Ydieresis" horiz-adv-x="517" d="M104 665L251 375Q255 367 258 358T264 343L266 337Q266 345 281 375L433 665Q441 680 451 680H493Q511 680 503 665L302 277V15Q302 0 287 0H245Q230 0 230 15V269L28 665Q21 680 38 680H86Q97
+680 104 665ZM238 856V759Q238 744 224 744H200Q185 744 185 759V856Q185 870 200 870H224Q238 870 238 856ZM346 856V759Q346 744 331 744H307Q292 744 292 759V856Q292 870 307 870H331Q346 870 346 856Z" />
+<glyph unicode="&#x17d;" glyph-name="Zcaron" horiz-adv-x="503" d="M201 876L254 794L307 876Q316 891 327 891H359Q376 891 367 876L289 765Q278 751 266 751H240Q227 751 217 766L141 876Q136 882 138 886T149 891H181Q192 891 201 876ZM83 680H432Q447 680
+447 665V634Q447 628 444 623L136 61H448Q463 61 463 47V15Q463 0 448 0H65Q51 0 51 15V47Q51 54 53 57L360 619H83Q68 619 68 634V665Q68 680 83 680Z" />
+<glyph unicode="&#x17e;" glyph-name="zcaron" horiz-adv-x="454" d="M177 693L230 611L283 693Q292 708 303 708H335Q352 708 343 693L265 582Q254 568 242 568H216Q203 568 193 583L117 693Q112 699 114 703T125 708H157Q168 708 177 693ZM75 494H375Q390 494
+390 480V452Q390 444 387 440L132 58H389Q404 58 404 43V15Q404 0 389 0H62Q47 0 47 15V43Q47 49 51 55L304 436H75Q60 436 60 451V480Q60 494 75 494Z" />
+<glyph unicode="&#x192;" glyph-name="florin" horiz-adv-x="552" d="M484 649H472Q409 649 380 630T346 572L326 416H423Q438 416 438 401V374Q438 359 423 359H321L269 -86Q254 -215 68 -215H62Q47 -215 47 -200V-171Q47 -156 62 -156H74Q190 -156 200 -79L251
+359H162Q147 359 147 374V401Q147 416 162 416H257L276 579Q291 708 477 708H484Q498 708 498 693V664Q498 649 484 649Z" />
+<glyph unicode="&#x2c6;" glyph-name="circumflex" horiz-adv-x="347" d="M183 664L130 582Q122 568 110 568H78Q60 568 70 582L146 693Q157 708 169 708H195Q208 708 218 694L296 582Q305 568 288 568H256Q245 568 236 582L183 664Z" />
+<glyph unicode="&#x2dc;" glyph-name="tilde" horiz-adv-x="422" d="M144 643Q127 643 123 634T117 596V588Q117 574 102 574H79Q66 574 66 591L68 618Q73 697 140 697Q168 697 195 678L239 646Q263 628 277 628Q293 628 297 637T303 676V684Q303 697 319 697H341Q354
+697 354 681L353 656Q350 575 280 575Q253 575 226 593L181 625Q157 643 144 643Z" />
+<glyph unicode="&#x2013;" glyph-name="endash" horiz-adv-x="546" d="M94 318H452Q467 318 467 304V275Q467 260 452 260H94Q79 260 79 275V304Q79 318 94 318Z" />
+<glyph unicode="&#x2014;" glyph-name="emdash" horiz-adv-x="855" d="M94 318H761Q776 318 776 304V275Q776 260 761 260H94Q79 260 79 275V304Q79 318 94 318Z" />
+<glyph unicode="&#x2018;" glyph-name="quoteleft" horiz-adv-x="221" d="M139 604V543Q139 528 125 528H82Q68 528 68 543V607Q68 699 169 729Q182 734 187 720L197 691Q202 678 188 672Q160 660 150 645T139 604Z" />
+<glyph unicode="&#x2019;" glyph-name="quoteright" horiz-adv-x="220" d="M86 653V714Q86 729 100 729H143Q157 729 157 714V650Q157 558 56 528Q43 524 38 537L28 566Q23 579 37 585Q65 597 75 612T86 653Z" />
+<glyph unicode="&#x201a;" glyph-name="quotesinglbase" horiz-adv-x="220" d="M86 32V93Q86 108 100 108H143Q157 108 157 93V29Q157 -63 56 -93Q43 -98 38 -84L28 -55Q23 -42 37 -36Q65 -24 75 -9T86 32Z" />
+<glyph unicode="&#x201c;" glyph-name="quotedblleft" horiz-adv-x="378" d="M297 604V543Q297 528 283 528H240Q226 528 226 543V607Q226 699 327 729Q340 734 345 720L355 691Q360 678 346 672Q318 660 308 645T297 604ZM139 604V543Q139 528 125 528H82Q68
+528 68 543V607Q68 699 169 729Q182 734 187 720L197 691Q202 678 188 672Q160 660 150 645T139 604Z" />
+<glyph unicode="&#x201d;" glyph-name="quotedblright" horiz-adv-x="378" d="M244 653V714Q244 729 258 729H301Q315 729 315 714V650Q315 558 214 528Q201 524 196 537L186 566Q181 579 195 585Q223 597 233 612T244 653ZM86 653V714Q86 729 100 729H143Q157
+729 157 714V650Q157 558 56 528Q43 524 38 537L28 566Q23 579 37 585Q65 597 75 612T86 653Z" />
+<glyph unicode="&#x201e;" glyph-name="quotedblbase" horiz-adv-x="378" d="M244 32V93Q244 108 258 108H301Q315 108 315 93V29Q315 -63 214 -93Q201 -98 196 -84L186 -55Q181 -42 195 -36Q223 -24 233 -9T244 32ZM86 32V93Q86 108 100 108H143Q157 108 157
+93V29Q157 -63 56 -93Q43 -98 38 -84L28 -55Q23 -42 37 -36Q65 -24 75 -9T86 32Z" />
+<glyph unicode="&#x2020;" glyph-name="dagger" horiz-adv-x="580" d="M325 684V15Q325 0 311 0H270Q256 0 256 15V684Q256 699 270 699H311Q325 699 325 684ZM105 501H220Q235 501 235 487V457Q235 443 220 443H105Q91 443 91 457V487Q91 501 105 501ZM361 501H476Q490
+501 490 487V457Q490 443 476 443H361Q346 443 346 457V487Q346 501 361 501Z" />
+<glyph unicode="&#x2021;" glyph-name="daggerdbl" horiz-adv-x="580" d="M325 684V15Q325 0 311 0H270Q256 0 256 15V684Q256 699 270 699H311Q325 699 325 684ZM105 501H220Q235 501 235 487V457Q235 443 220 443H105Q91 443 91 457V487Q91 501 105 501ZM361
+501H476Q490 501 490 487V457Q490 443 476 443H361Q346 443 346 457V487Q346 501 361 501ZM105 256H220Q235 256 235 242V212Q235 197 220 197H105Q91 197 91 212V242Q91 256 105 256ZM361 256H476Q490 256 490 242V212Q490 197 476 197H361Q346 197 346 212V242Q346
+256 361 256Z" />
+<glyph unicode="&#x2022;" glyph-name="bullet" horiz-adv-x="251" d="M161 327V198Q161 183 147 183H105Q91 183 91 198V327Q91 342 105 342H147Q161 342 161 327Z" />
+<glyph unicode="&#x2026;" glyph-name="ellipsis" horiz-adv-x="716" d="M146 93V15Q146 0 132 0H90Q75 0 75 15V93Q75 108 90 108H132Q146 108 146 93ZM641 93V15Q641 0 627 0H585Q570 0 570 15V93Q570 108 585 108H627Q641 108 641 93ZM394 93V15Q394 0 380
+0H338Q323 0 323 15V93Q323 108 338 108H380Q394 108 394 93Z" />
+<glyph unicode="&#x2030;" glyph-name="perthousand" horiz-adv-x="1102" d="M83 483V592Q83 687 218 687T353 592V483Q353 388 218 388T83 483ZM295 485V590Q295 639 218 639T141 590V485Q141 436 218 436T295 485ZM635 89V193Q635 242 559 242Q482 242 482 193V89Q482
+39 559 39Q635 39 635 89ZM423 86V195Q423 290 559 290Q694 290 694 195V86Q694 -9 559 -9Q423 -9 423 86ZM961 89V193Q961 242 884 242T807 193V89Q807 39 884 39T961 89ZM748 86V195Q748 290 885 290Q1019 290 1019 195V86Q1019 -9 885 -9Q748 -9 748 86ZM571
+665L268 15Q261 0 247 0H211Q205 0 203 5T204 15L508 665Q516 680 529 680H563Q578 680 571 665Z" />
+<glyph unicode="&#x2039;" glyph-name="guilsinglleft" horiz-adv-x="373" d="M278 351L136 245L278 140Q293 129 293 117V74Q293 67 288 65T278 66L93 205Q80 216 80 225V266Q80 274 93 285L278 424Q283 429 288 427T293 416V373Q293 362 278 351Z" />
+<glyph unicode="&#x203a;" glyph-name="guilsinglright" horiz-adv-x="373" d="M237 245L95 351Q80 362 80 373V416Q80 424 85 426T95 424L280 285Q293 274 293 266V225Q293 216 280 205L95 66Q90 62 85 64T80 74V117Q80 129 95 140L237 245Z" />
+<glyph unicode="&#x20ac;" glyph-name="Euro" horiz-adv-x="649" d="M98 302H144V378H98Q83 378 83 393V411Q83 425 98 425H144V542Q144 688 355 688T566 542V491Q566 475 552 475H512Q497 475 497 491V531Q497 627 356 627T215 531V425H371Q385 425 385 411V393Q385
+378 371 378H215V302H371Q385 302 385 287V270Q385 255 371 255H215V149Q215 53 356 53T497 149V202Q497 217 512 217H552Q566 217 566 202V138Q566 -8 355 -8T144 138V255H98Q83 255 83 270V287Q83 302 98 302Z" />
+<glyph unicode="&#x2122;" glyph-name="trademark" horiz-adv-x="894" d="M804 668V284Q804 272 792 272H758Q746 272 746 284V566Q743 553 737 540L648 346Q643 334 632 334H606Q595 334 590 346L499 542Q496 547 490 569V284Q490 272 479 272H446Q435 272 435
+284V668Q435 680 446 680H479Q487 680 490 674L608 427Q613 417 619 399Q629 424 630 426L747 674Q750 680 758 680H792Q804 680 804 668ZM103 680H374Q387 680 387 668V642Q387 630 374 630H268V284Q268 272 257 272H220Q208 272 208 284V630H103Q90 630 90 642V668Q90
+680 103 680Z" />
+</font>
+</defs>
+</svg>
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/svg/svg_test.html b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/svg/svg_test.html
new file mode 100644
index 00000000..2d76f6a4
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/svg/svg_test.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>MyFonts Webfonts Demo for iOS devices</title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+
+<style type="text/css" media="all">
+
+	h2 {
+		 font-weight:normal;
+	}
+
+		
+	@font-face {
+		font-family:"Geogrotesque-Regular";
+		src:url("11014B_0.svg#Geogrotesque-Regular") format("svg");
+	}
+	
+	.webfont_0 {
+		font-family: Geogrotesque-Regular;
+	}
+		
+</style>
+
+</head>
+
+<body>
+
+<h1>MyFonts Webfonts Demo for iOS devices</h1>
+
+
+<h2>0. <span class='webfont_0'><a href='http://new.myfonts.com/search/style::169901/'>Geogrotesque Regular</a></span>
+<small>(VersionID 499202, otf)</small>
+</h2>
+
+<p class='webfont_0'>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+
+<p class='webfont_0'>An, partus ancillae sitne in fructu habendus, disseretur inter principes civitatis, P. Scaevolam M'.que Manilium, ab iisque M. Brutus dissentiet -- quod et acutum genus est et ad usus civium non inutile, nosque ea scripta reliquaque eiusdem generis et legimus libenter et legemus --, haec, quae vitam omnem continent, neglegentur? nam, ut sint illa vendibiliora, haec uberiora certe sunt. quamquam id quidem licebit iis existimare, qui legerint. nos autem hanc omnem quaestionem de finibus bonorum et malorum fere a nobis explicatam esse his litteris arbitramur, in quibus, quantum potuimus, non modo quid nobis probaretur, sed etiam quid a singulis philosophiae disciplinis diceretur, persecuti sumus.</p>
+
+<p class='webfont_0'>Id qui in una virtute ponunt et splendore nominis capti quid natura postulet non intellegunt, errore maximo, si Epicurum audire voluerint, liberabuntur: istae enim vestrae eximiae pulchraeque virtutes nisi voluptatem efficerent, quis eas aut laudabilis aut expetendas arbitraretur? ut enim medicorum scientiam non ipsius artis, sed bonae valetudinis causa probamus, et gubernatoris ars, quia bene navigandi rationem habet, utilitate, non arte laudatur, sic sapientia, quae ars vivendi putanda est, non expeteretur, si nihil efficeret; nunc expetitur, quod est tamquam artifex conquirendae et comparandae voluptatis.</p>
+
+
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/ttf/11014B_0.ttf b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/ttf/11014B_0.ttf
new file mode 100644
index 00000000..27e926e1
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/ttf/11014B_0.ttf differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/woff/11014B_0.woff b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/woff/11014B_0.woff
new file mode 100644
index 00000000..cae7abd8
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-regular/woff/11014B_0.woff differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/eot/style_169898.eot b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/eot/style_169898.eot
new file mode 100644
index 00000000..7fe26f1d
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/eot/style_169898.eot differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/svg/index.html b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/svg/index.html
new file mode 100644
index 00000000..5ae427cb
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/svg/index.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>MyFonts Webfonts Demo for iOS devices</title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+
+<style type="text/css" media="all">
+
+	h2 {
+		 font-weight:normal;
+	}
+
+		
+	@font-face {
+		font-family:"Geogrotesque-SemiBold";
+		src:url("style_169898.svg#Geogrotesque-SemiBold") format("svg");
+	}
+	
+	.webfont_0 {
+		font-family: Geogrotesque-SemiBold;
+	}
+		
+</style>
+
+</head>
+
+<body>
+
+<h1>MyFonts Webfonts Demo for iOS devices</h1>
+
+
+<h2>0. <span class='webfont_0'><a href='http://new.myfonts.com/search/style::169898/'>Geogrotesque SemiBold</a></span>
+<small>(VersionID 499201, otf)</small>
+</h2>
+
+<p class='webfont_0'>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+
+<p class='webfont_0'>An, partus ancillae sitne in fructu habendus, disseretur inter principes civitatis, P. Scaevolam M'.que Manilium, ab iisque M. Brutus dissentiet -- quod et acutum genus est et ad usus civium non inutile, nosque ea scripta reliquaque eiusdem generis et legimus libenter et legemus --, haec, quae vitam omnem continent, neglegentur? nam, ut sint illa vendibiliora, haec uberiora certe sunt. quamquam id quidem licebit iis existimare, qui legerint. nos autem hanc omnem quaestionem de finibus bonorum et malorum fere a nobis explicatam esse his litteris arbitramur, in quibus, quantum potuimus, non modo quid nobis probaretur, sed etiam quid a singulis philosophiae disciplinis diceretur, persecuti sumus.</p>
+
+<p class='webfont_0'>Id qui in una virtute ponunt et splendore nominis capti quid natura postulet non intellegunt, errore maximo, si Epicurum audire voluerint, liberabuntur: istae enim vestrae eximiae pulchraeque virtutes nisi voluptatem efficerent, quis eas aut laudabilis aut expetendas arbitraretur? ut enim medicorum scientiam non ipsius artis, sed bonae valetudinis causa probamus, et gubernatoris ars, quia bene navigandi rationem habet, utilitate, non arte laudatur, sic sapientia, quae ars vivendi putanda est, non expeteretur, si nihil efficeret; nunc expetitur, quod est tamquam artifex conquirendae et comparandae voluptatis.</p>
+
+
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/svg/style_169898.svg b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/svg/style_169898.svg
new file mode 100644
index 00000000..7a48dbb3
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/svg/style_169898.svg
@@ -0,0 +1,419 @@
+<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" > 
+<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
+<metadata version="1.0"><uniqueid id="com.myfonts.emtype.geogrotesque.semibold.wfkit1.5etR"/><vendor name="MyFonts" url="http://www.myfonts.com/"/><credits><credit name="Eduardo Manso" url="http://www.myfonts.com/person/manso/eduardo/"/></credits><description><text lang="en">This is a Webfont from MyFonts. Full information about this font:
+http://www.myfonts.com/fonts/emtype/geogrotesque/semibold//
+</text></description><license url="http://new.myfonts.com/license/836,1146"/><copyright><text lang="en">Copyright (c) 2009 by Eduardo Manso. All rights reserved.</text></copyright><trademark><text lang="en">Geogrotesque is a trademark of Eduardo Manso.</text></trademark></metadata>
+<defs >
+<font id="Geogrotesque-SemiBold" horiz-adv-x="424" ><font-face
+    font-family="Geogrotesque SmBd"
+    units-per-em="1000"
+    panose-1="2 0 0 0 0 0 0 0 0 0"
+    ascent="778"
+    descent="-222"
+    alphabetic="0" />
+<missing-glyph horiz-adv-x="847" d="M671 94Q567 -8 422 -8Q278 -8 176 94Q73 195 73 341Q73 485 176 588Q278 690 422 690Q569 690 671 588Q774 485 774 341T671 94ZM659 106Q758 205 758 341T659 576Q561 674 422 674Q286 674 188 576Q89 477 89 341Q89 204
+188 106Q286 8 422 8Q561 8 659 106ZM523 167L423 268L323 168Q304 149 288 168L246 210Q229 227 247 243L347 343L247 444Q229 462 246 478L287 520Q305 538 323 519L423 419L523 519Q542 538 558 521L600 480Q617 460 599 444L499 343L599 243Q618 226 599 208L557
+167Q541 149 523 167Z" />
+<glyph unicode=" " glyph-name="space" horiz-adv-x="194" />
+<glyph unicode="!" glyph-name="exclam" horiz-adv-x="277" d="M207 390L194 207Q193 193 188 188T170 182H108Q95 182 90 187T84 207L70 390V654Q70 680 95 680H183Q207 680 207 654V390ZM205 106V25Q205 0 181 0H94Q70 0 70 25V106Q70 131 94 131H181Q205 131 205 106Z" />
+<glyph unicode="&quot;" glyph-name="quotedbl" horiz-adv-x="427" d="M179 491Q179 466 155 466H96Q83 466 78 471T72 491L61 654Q60 680 85 680H166Q190 680 189 654L179 491ZM357 491Q357 466 333 466H275Q251 466 250 491L240 654Q239 680 264 680H344Q369
+680 368 654L357 491Z" />
+<glyph unicode="#" glyph-name="numbersign" horiz-adv-x="678" d="M92 272H161L182 347H140Q114 347 114 371V415Q114 438 140 438H209L231 516Q238 542 262 542H321Q346 542 339 516L316 438H439L461 516Q469 542 492 542H551Q576 542 569 516L547 438H586Q611
+438 611 415V371Q611 347 586 347H520L499 272H538Q564 272 564 249V205Q564 180 538 180H472L450 102Q443 77 420 77H361Q336 77 343 102L365 180H242L220 102Q213 77 190 77H130Q106 77 113 102L135 180H92Q67 180 67 205V249Q67 272 92 272ZM290 347L268 272H391L413
+347H290Z" />
+<glyph unicode="$" glyph-name="dollar" horiz-adv-x="536" d="M343 445V464Q343 505 270 505Q198 505 198 464V453Q198 429 229 418L373 367Q469 333 469 263V212Q469 170 437 136T339 89V26Q339 0 316 0H232Q208 0 208 26V87Q136 98 102 132T67 212V235Q67 258
+90 258H164Q187 258 187 235V218Q187 176 267 176Q348 176 348 218V235Q348 247 338 255T303 273L158 326Q127 338 103 367T79 432V464Q79 509 110 544T208 592V654Q208 680 232 680H316Q339 680 339 654V591Q403 578 432 543T462 464V445Q462 432 457 427T439
+422H365Q343 422 343 445Z" />
+<glyph unicode="%" glyph-name="percent" horiz-adv-x="869" d="M67 478V576Q67 688 223 688T379 576V478Q379 366 223 366T67 478ZM272 482V572Q272 602 223 602T174 572V482Q174 451 223 451T272 482ZM694 107V197Q694 227 646 227Q597 227 597 197V107Q597
+76 646 76Q694 76 694 107ZM490 102V200Q490 312 646 312T802 200V102Q802 -10 646 -10T490 102ZM655 654L335 26Q322 0 299 0H229Q219 0 216 9T217 26L538 654Q551 680 574 680H643Q655 680 658 672T655 654Z" />
+<glyph unicode="&amp;" glyph-name="ampersand" horiz-adv-x="696" d="M301 404H638Q663 404 663 380V321Q663 296 638 296H579V155Q579 83 520 38T319 -8Q62 -8 62 151V240Q62 323 146 354Q71 379 71 458V529Q71 688 294 688Q519 688 519 525V493Q519 468 496
+468H412Q388 468 388 493V506Q388 580 295 580Q203 580 203 506V478Q203 404 301 404ZM194 100T321 100T448 174V296H292Q194 296 194 223V174Q194 100 321 100Z" />
+<glyph unicode="&apos;" glyph-name="quotesingle" horiz-adv-x="248" d="M189 654L179 491Q178 466 155 466H96Q83 466 78 471T72 491L61 654Q60 680 85 680H166Q190 680 189 654Z" />
+<glyph unicode="(" glyph-name="parenleft" horiz-adv-x="357" d="M62 -70V560Q62 630 115 669T276 708H285Q310 708 310 683V625Q310 600 285 600H276Q197 600 197 546V-56Q197 -110 276 -110H285Q310 -110 310 -135V-193Q310 -218 285 -218H276Q169 -218 116
+-179T62 -70Z" />
+<glyph unicode=")" glyph-name="parenright" horiz-adv-x="357" d="M295 560V-70Q295 -140 242 -179T81 -218H71Q46 -218 46 -193V-135Q46 -110 71 -110H81Q123 -110 141 -97T159 -56V546Q159 574 141 587T81 600H71Q46 600 46 625V683Q46 708 71 708H81Q188 708
+241 669T295 560Z" />
+<glyph unicode="*" glyph-name="asterisk" horiz-adv-x="541" d="M262 286Q238 286 239 312L247 433L141 364Q119 349 107 373L87 412Q76 435 98 445L202 493L98 542Q75 553 87 575L107 613Q120 636 141 622L248 553L239 683Q238 697 243 702T263 708H306Q331
+708 330 683L320 556L424 622Q446 636 458 614L478 575Q490 553 467 542L363 493L467 445Q490 435 478 412L458 372Q446 349 424 364L321 429L330 312Q331 286 306 286H262Z" />
+<glyph unicode="+" glyph-name="plus" horiz-adv-x="560" d="M226 143V284H84Q59 284 59 309V368Q59 392 84 392H226V534Q226 560 249 560H308Q333 560 333 534V392H475Q501 392 501 368V309Q501 284 475 284H333V143Q333 118 308 118H249Q226 118 226 143Z" />
+<glyph unicode="," glyph-name="comma" horiz-adv-x="266" d="M83 39V106Q83 131 107 131H193Q216 131 216 106V32Q216 -82 72 -116Q49 -122 41 -100L21 -44Q13 -21 37 -13Q83 2 83 39Z" />
+<glyph unicode="-" glyph-name="hyphen" horiz-adv-x="436" d="M84 342H352Q377 342 377 318V259Q377 235 352 235H84Q59 235 59 259V318Q59 342 84 342Z" />
+<glyph unicode="." glyph-name="period" horiz-adv-x="250" d="M192 106V25Q192 0 168 0H83Q58 0 58 25V106Q58 131 83 131H168Q192 131 192 106Z" />
+<glyph unicode="/" glyph-name="slash" horiz-adv-x="366" d="M358 673L160 -122Q153 -148 131 -148H39Q14 -148 20 -122L219 673Q225 699 248 699H339Q364 699 358 673Z" />
+<glyph unicode="0" glyph-name="zero" horiz-adv-x="562" d="M48 155V525Q48 596 103 642T281 688Q402 688 458 642T514 525V155Q514 84 458 38T281 -8Q159 -8 104 38T48 155ZM379 179V501Q379 576 281 576T183 501V179Q183 104 281 104T379 179Z" />
+<glyph unicode="1" glyph-name="one" horiz-adv-x="562" d="M91 642L337 687Q347 689 354 684T361 663V112H492Q517 112 517 88V25Q517 0 492 0H90Q65 0 65 25V88Q65 112 90 112H226V552L91 528Q65 523 65 549V615Q65 637 91 642Z" />
+<glyph unicode="2" glyph-name="two" horiz-adv-x="562" d="M200 112H490Q515 112 515 88V25Q515 0 490 0H90Q64 0 64 25V209Q64 235 75 254T99 281T132 298L337 384Q377 400 377 442V503Q377 578 279 578Q182 578 182 503V464Q182 439 159 439H76Q51 439 51 464V525Q51
+596 104 642T279 688T455 642T511 525V446Q511 333 416 294L247 224Q222 214 211 203T200 168V112Z" />
+<glyph unicode="3" glyph-name="three" horiz-adv-x="562" d="M201 404H269Q367 404 367 478V506Q367 580 276 580Q183 580 183 506V493Q183 468 158 468H75Q52 468 52 493V525Q52 688 277 688Q500 688 500 529V458Q500 379 425 354Q509 323 509 240V151Q509 81
+456 37T279 -8T101 38T47 155V187Q47 212 71 212H154Q178 212 178 187V174Q178 100 278 100Q376 100 376 174V223Q376 296 278 296H201Q176 296 176 321V380Q176 404 201 404Z" />
+<glyph unicode="4" glyph-name="four" horiz-adv-x="562" d="M285 654L172 297H363V654Q363 680 387 680H474Q498 680 498 654V26Q498 0 474 0H387Q363 0 363 26V185H58Q33 185 33 209V270Q33 277 37 293L150 654Q158 680 180 680H267Q293 680 285 654Z" />
+<glyph unicode="5" glyph-name="five" horiz-adv-x="562" d="M100 680H466Q492 680 492 656V593Q492 568 466 568H212V437H280Q400 437 456 393T512 278V154Q512 82 459 37T281 -9T104 36T50 154V186Q50 211 74 211H157Q182 211 182 186V174Q182 99 279 99Q377
+99 377 174V259Q377 329 279 329H100Q77 329 77 355V654Q77 680 100 680Z" />
+<glyph unicode="6" glyph-name="six" horiz-adv-x="562" d="M55 155V526Q55 596 107 642T280 688T451 642T502 526V500Q502 475 477 475H394Q381 475 376 480T371 500V507Q371 580 280 580Q188 580 188 507V385Q233 416 300 416Q407 416 458 369T509 252V155Q509
+84 456 38T281 -8Q160 -8 108 38T55 155ZM375 175V233Q375 307 281 307Q188 307 188 239V175Q188 100 281 100Q375 100 375 175Z" />
+<glyph unicode="7" glyph-name="seven" horiz-adv-x="562" d="M67 680H502Q527 680 527 656V595Q527 587 522 575L280 26Q269 0 248 0H150Q121 0 133 26L374 568H67Q42 568 42 593V656Q42 680 67 680Z" />
+<glyph unicode="8" glyph-name="eight" horiz-adv-x="562" d="M65 459V525Q65 688 281 688Q496 688 496 525V459Q496 383 421 353Q507 322 507 246V155Q507 84 455 38T281 -8T108 37T55 155V246Q55 322 140 353Q65 383 65 459ZM374 175V225Q374 263 352 280T281
+298T210 281T188 225V175Q188 100 281 100T374 175ZM365 480V505Q365 544 346 562T281 580Q234 580 216 562T197 505V480Q197 441 215 423T281 405Q327 405 346 423T365 480Z" />
+<glyph unicode="9" glyph-name="nine" horiz-adv-x="562" d="M507 525V154Q507 84 455 38T282 -8T111 38T60 154V180Q60 205 85 205H168Q191 205 191 180V173Q191 100 282 100T373 173V294Q331 264 262 264Q156 264 105 311T53 428V525Q53 596 106 642T281 688Q402
+688 454 642T507 525ZM373 446V506Q373 580 281 580Q186 580 186 505V447Q186 373 281 373Q373 373 373 446Z" />
+<glyph unicode=":" glyph-name="colon" horiz-adv-x="250" d="M192 106V25Q192 0 168 0H83Q58 0 58 25V106Q58 131 83 131H168Q192 131 192 106ZM192 473V391Q192 366 168 366H83Q58 366 58 391V473Q58 498 83 498H168Q192 498 192 473Z" />
+<glyph unicode=";" glyph-name="semicolon" horiz-adv-x="290" d="M240 473V391Q240 366 217 366H131Q106 366 106 391V473Q106 498 131 498H217Q240 498 240 473ZM106 39V106Q106 131 131 131H217Q240 131 240 106V32Q240 -82 96 -116Q72 -122 64 -100L45 -44Q37
+-21 61 -13Q87 -4 96 8T106 39Z" />
+<glyph unicode="&lt;" glyph-name="less" horiz-adv-x="523" d="M438 435L187 339L438 243Q452 238 457 233T463 215V136Q463 121 457 114T438 112L82 266Q74 270 70 272T63 280T59 295V383Q59 392 62 397T70 405T82 412L438 566Q450 571 456 564T463 542V463Q463
+451 458 446T438 435Z" />
+<glyph unicode="=" glyph-name="equal" horiz-adv-x="581" d="M84 478H496Q521 478 521 454V394Q521 370 496 370H84Q59 370 59 394V454Q59 478 84 478ZM84 273H496Q521 273 521 250V190Q521 165 496 165H84Q59 165 59 190V250Q59 273 84 273Z" />
+<glyph unicode="&gt;" glyph-name="greater" horiz-adv-x="523" d="M336 338L84 434Q59 444 59 462V542Q59 556 66 564T84 567L441 413Q463 404 463 386V292Q463 274 441 265L84 111Q73 106 66 113T59 135V216Q59 225 62 230T70 238T84 244L336 338Z" />
+<glyph unicode="?" glyph-name="question" horiz-adv-x="565" d="M187 206V275Q187 313 203 332T250 365L342 412Q380 433 380 473V503Q380 578 281 578T182 503V464Q182 439 159 439H76Q51 439 51 464V525Q51 596 105 642T281 688T457 642T514 525V478Q514 364
+421 323L364 297Q341 286 332 275T322 241V206Q322 193 317 188T299 182H211Q187 182 187 206ZM322 106V25Q322 0 299 0H211Q187 0 187 25V106Q187 131 211 131H299Q322 131 322 106Z" />
+<glyph unicode="@" glyph-name="at" horiz-adv-x="954" d="M652 -150H477Q375 -150 300 -137T182 -103T112 -51T78 9T70 76V427Q70 464 78 493T112 554T181 605T300 639T477 652Q603 652 688 634T814 581T870 510T885 427V193Q885 33 699 33Q590 33 551 95Q481
+33 393 33Q269 33 269 154Q269 170 270 179L282 312Q295 458 423 458Q488 458 558 409L561 425Q565 450 588 450H661Q685 450 682 425L661 219Q659 194 660 174T672 141T707 128Q737 128 747 149T758 211V421Q758 463 737 488T653 530T477 546T302 530T218 489T197
+421V82Q197 40 218 14T302 -28T477 -44H652Q678 -44 678 -69V-125Q678 -150 652 -150ZM407 286L399 201Q397 179 408 166T449 153Q483 153 531 177V183L544 310Q498 343 464 343Q413 343 407 286Z" />
+<glyph unicode="A" glyph-name="A" horiz-adv-x="553" d="M241 680H328Q353 680 360 655L546 25Q554 0 528 0H438Q417 0 409 25L374 147H188L153 25Q145 0 123 0H42Q15 0 23 25L210 655Q217 680 241 680ZM344 254L311 365Q303 391 294 458T282 547Q258 390 251
+366L217 254H344Z" />
+<glyph unicode="B" glyph-name="B" horiz-adv-x="594" d="M308 0H94Q70 0 70 26V654Q70 680 94 680H277Q405 680 462 639T519 529V470Q519 393 444 358Q550 321 550 237V158Q550 88 493 44T308 0ZM308 296H205V108H308Q417 108 417 182V227Q417 259 388 277T308
+296ZM277 572H205V398H280Q385 398 385 473V508Q385 544 358 558T277 572Z" />
+<glyph unicode="C" glyph-name="C" horiz-adv-x="569" d="M529 217V155Q529 84 475 38T294 -8T114 38T59 155V525Q59 596 113 642T294 688T474 642T529 525V477Q529 452 506 452H423Q398 452 398 477V501Q398 576 296 576Q195 576 195 501V179Q195 104 296 104Q398
+104 398 179V217Q398 242 423 242H506Q529 242 529 217Z" />
+<glyph unicode="D" glyph-name="D" horiz-adv-x="615" d="M312 0H91Q70 0 70 26V654Q70 680 94 680H312Q438 680 497 634T556 517V163Q556 93 497 47T312 0ZM312 568H205V112H312Q421 112 421 187V493Q421 568 312 568Z" />
+<glyph unicode="E" glyph-name="E" horiz-adv-x="512" d="M446 0H94Q70 0 70 26V654Q70 680 94 680H436Q461 680 461 656V593Q461 568 436 568H205V406H419Q445 406 445 382V322Q445 298 419 298H205V112H446Q471 112 471 88V25Q471 0 446 0Z" />
+<glyph unicode="F" glyph-name="F" horiz-adv-x="518" d="M94 680H460Q485 680 485 656V593Q485 568 460 568H205V406H443Q468 406 468 382V318Q468 293 443 293H205V26Q205 0 181 0H94Q70 0 70 26V654Q70 680 94 680Z" />
+<glyph unicode="G" glyph-name="G" horiz-adv-x="581" d="M300 357H504Q529 357 529 333V155Q529 84 475 38T294 -8T114 38T59 155V525Q59 596 113 642T294 688T474 642T529 525V485Q529 460 506 460H423Q398 460 398 485V501Q398 576 296 576Q195 576 195 501V179Q195
+104 296 104Q398 104 398 178V245H300Q274 245 274 269V333Q274 357 300 357Z" />
+<glyph unicode="H" glyph-name="H" horiz-adv-x="626" d="M205 654V405H421V654Q421 680 445 680H532Q556 680 556 654V26Q556 0 532 0H445Q421 0 421 26V293H205V26Q205 0 181 0H94Q70 0 70 26V654Q70 680 94 680H181Q205 680 205 654Z" />
+<glyph unicode="I" glyph-name="I" horiz-adv-x="274" d="M205 654V26Q205 0 181 0H94Q70 0 70 26V654Q70 680 94 680H181Q205 680 205 654Z" />
+<glyph unicode="J" glyph-name="J" horiz-adv-x="515" d="M149 215V179Q149 104 235 104Q278 104 296 122T315 179V654Q315 680 339 680H426Q450 680 450 654V155Q450 -8 235 -8Q118 -8 67 38T16 155V215Q16 240 41 240H125Q149 240 149 215Z" />
+<glyph unicode="K" glyph-name="K" horiz-adv-x="584" d="M335 346L570 25Q577 16 574 8T557 0H446Q429 0 410 25L222 287H205V25Q205 0 181 0H94Q70 0 70 25V655Q70 680 94 680H181Q205 680 205 655V386H221L399 655Q415 680 439 680H532Q545 680 548 673T544
+655L335 346Z" />
+<glyph unicode="L" glyph-name="L" horiz-adv-x="477" d="M205 654V112H428Q453 112 453 88V25Q453 0 428 0H91Q70 0 70 26V654Q70 680 94 680H181Q205 680 205 654Z" />
+<glyph unicode="M" glyph-name="M" horiz-adv-x="746" d="M677 655V25Q677 0 653 0H570Q546 0 546 25V405L542 394Q539 382 535 369T526 339T517 314L441 128Q430 103 408 103H337Q315 103 305 128L220 329Q202 366 197 403V25Q197 0 173 0H94Q70 0 70 25V655Q70
+680 94 680H173Q189 680 195 666L348 317L373 247Q386 286 399 316L547 668Q552 680 570 680H653Q677 680 677 655Z" />
+<glyph unicode="N" glyph-name="N" horiz-adv-x="625" d="M556 655V25Q556 0 532 0H453Q437 0 430 12L237 343Q208 392 197 424V25Q197 0 173 0H94Q70 0 70 25V655Q70 680 94 680H173Q188 680 194 670L395 325L429 255V655Q429 680 453 680H532Q556 680 556 655Z" />
+<glyph unicode="O" glyph-name="O" horiz-adv-x="605" d="M59 155V525Q59 595 117 641T302 688T486 642T545 525V155Q545 85 487 39T302 -8T118 38T59 155ZM410 179V501Q410 576 302 576Q195 576 195 501V179Q195 104 302 104Q410 104 410 179Z" />
+<glyph unicode="P" glyph-name="P" horiz-adv-x="580" d="M304 241H205V26Q205 0 181 0H94Q70 0 70 26V654Q70 680 94 680H304Q430 680 488 634T546 517V404Q546 333 488 287T304 241ZM304 568H205V353H304Q355 353 383 372T412 427V493Q412 568 304 568Z" />
+<glyph unicode="Q" glyph-name="Q" horiz-adv-x="604" d="M545 525V155Q545 101 512 61T406 3L513 -92Q533 -110 516 -127L472 -174Q455 -193 438 -176L254 -5Q153 3 106 47T59 155V525Q59 595 117 641T302 688T486 642T545 525ZM195 504V176Q195 101 302 101Q410
+101 410 176V504Q410 579 302 579Q195 579 195 504Z" />
+<glyph unicode="R" glyph-name="R" horiz-adv-x="600" d="M304 259H205V26Q205 0 181 0H94Q70 0 70 26V654Q70 680 94 680H304Q430 680 488 634T546 517V422Q546 318 436 278L544 26Q549 14 542 7T521 0H433Q428 0 425 1T418 7T414 15T408 26L310 259H304ZM304
+568H205V371H304Q412 371 412 446V493Q412 568 304 568Z" />
+<glyph unicode="S" glyph-name="S" horiz-adv-x="572" d="M389 484V507Q389 579 292 579Q194 579 194 507V492Q194 453 235 438L409 376Q527 334 527 232V155Q527 84 471 38T289 -8Q165 -8 108 38T50 155V218Q50 244 74 244H158Q182 244 182 218V173Q182 101 288
+101T394 173V205Q394 224 381 239T353 261T309 279L154 337Q116 351 90 387T63 466V525Q63 596 116 642T290 688Q412 688 466 642T521 525V484Q521 459 496 459H412Q389 459 389 484Z" />
+<glyph unicode="T" glyph-name="T" horiz-adv-x="493" d="M36 680H456Q481 680 481 656V593Q481 568 456 568H314V26Q314 0 290 0H203Q178 0 178 26V568H36Q11 568 11 593V656Q11 680 36 680Z" />
+<glyph unicode="U" glyph-name="U" horiz-adv-x="615" d="M200 654V179Q200 104 307 104Q358 104 387 123T416 179V654Q416 680 440 680H527Q550 680 550 654V155Q550 85 492 39T307 -8T123 38T64 155V654Q64 680 89 680H176Q200 680 200 654Z" />
+<glyph unicode="V" glyph-name="V" horiz-adv-x="553" d="M328 0H241Q217 0 210 25L23 655Q15 680 42 680H137Q158 680 166 655L263 315Q270 291 276 255T284 194L287 170Q299 261 314 314L411 655Q419 680 441 680H528Q554 680 546 655L360 25Q353 0 328 0Z" />
+<glyph unicode="W" glyph-name="W" horiz-adv-x="838" d="M502 655L586 315Q595 275 602 216Q611 277 620 314L706 655Q712 680 735 680H811Q836 680 830 655L671 25Q665 0 640 0H555Q533 0 527 25L439 373Q430 405 425 464Q419 406 411 373L323 25Q317 0 292
+0H207Q185 0 179 25L20 655Q14 680 39 680H128Q151 680 157 655L241 314L257 230Q262 263 275 314L361 655Q367 680 391 680H472Q496 680 502 655Z" />
+<glyph unicode="X" glyph-name="X" horiz-adv-x="574" d="M364 349L552 25Q558 16 555 8T539 0H439Q418 0 403 25L283 231L174 25Q161 0 138 0H44Q32 0 30 9T34 29L215 351L41 652Q24 680 51 680H151Q173 680 188 655L299 463L403 655Q416 680 439 680H532Q558
+680 544 655L364 349Z" />
+<glyph unicode="Y" glyph-name="Y" horiz-adv-x="545" d="M165 655L260 427Q271 397 277 374Q286 408 295 427L401 655Q412 680 430 680H516Q529 680 534 674T534 655L345 260V25Q345 0 321 0H234Q209 0 209 25V244L19 655Q14 666 18 673T36 680H135Q155 680 165 655Z" />
+<glyph unicode="Z" glyph-name="Z" horiz-adv-x="497" d="M75 680H431Q457 680 457 656V594Q457 584 451 574L195 112H449Q474 112 474 88V25Q474 0 449 0H58Q33 0 33 25V88Q33 97 37 105L294 568H75Q50 568 50 593V656Q50 680 75 680Z" />
+<glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="394" d="M62 -185V673Q62 699 86 699H315Q340 699 340 675V612Q340 587 315 587H197V-99H315Q340 -99 340 -124V-187Q340 -211 315 -211H86Q62 -211 62 -185Z" />
+<glyph unicode="\" glyph-name="backslash" horiz-adv-x="366" d="M219 -122L20 673Q14 699 39 699H131Q154 699 160 673L358 -122Q364 -148 339 -148H248Q225 -148 219 -122Z" />
+<glyph unicode="]" glyph-name="bracketright" horiz-adv-x="394" d="M332 673V-185Q332 -211 308 -211H80Q54 -211 54 -187V-124Q54 -99 80 -99H197V587H80Q54 587 54 612V675Q54 699 80 699H308Q332 699 332 673Z" />
+<glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="577" d="M389 301L292 551L197 301Q192 287 187 281T169 275H90Q76 275 69 282T66 301L219 657Q223 665 225 669T233 676T246 680H339Q347 680 352 677T359 669T366 657L520 301Q525 289 518 282T496
+275H416Q404 275 399 281T389 301Z" />
+<glyph unicode="_" glyph-name="underscore" horiz-adv-x="456" d="M46 -74H410Q435 -74 435 -97V-157Q435 -182 410 -182H46Q21 -182 21 -157V-97Q21 -74 46 -74Z" />
+<glyph unicode="`" glyph-name="grave" horiz-adv-x="314" d="M135 577L63 683Q55 694 58 701T75 708H162Q185 708 197 683L245 585Q256 560 232 560H167Q147 560 135 577Z" />
+<glyph unicode="a" glyph-name="a" horiz-adv-x="517" d="M60 349V362Q60 506 262 506Q463 506 463 362V26Q463 0 439 0H364Q351 0 347 6T340 26L338 47Q272 -8 190 -8Q120 -8 83 28T46 117V162Q46 215 85 251T196 288H334V352Q334 380 318 394T259 408T200 396T182
+356V349Q182 324 158 324H84Q60 324 60 349ZM224 96Q276 96 334 139V196H222Q195 196 185 185T174 151V135Q174 96 224 96Z" />
+<glyph unicode="b" glyph-name="b" horiz-adv-x="540" d="M161 0H84Q59 0 59 26V673Q59 699 84 699H167Q190 699 190 673V452Q261 506 347 506Q419 506 455 468T492 360V138Q492 69 456 31T347 -8Q258 -8 187 48L185 26Q183 12 179 6T161 0ZM360 159V340Q360 392
+306 392Q250 392 190 346V152Q250 106 306 106Q360 106 360 159Z" />
+<glyph unicode="c" glyph-name="c" horiz-adv-x="492" d="M255 506Q460 506 460 359V342Q460 318 436 318H359Q334 318 334 342V349Q334 377 317 389T257 402T198 390T180 349V150Q180 122 197 109T257 96T316 109T334 150V165Q334 190 359 190H436Q460 190 460
+165V140Q460 -8 254 -8Q49 -8 49 140V359Q49 506 255 506Z" />
+<glyph unicode="d" glyph-name="d" horiz-adv-x="540" d="M355 26L353 48Q282 -8 194 -8Q122 -8 86 30T49 138V360Q49 429 85 467T194 506Q279 506 350 452V673Q350 699 374 699H457Q481 699 481 673V26Q481 0 457 0H380Q367 0 362 6T355 26ZM180 340V159Q180
+135 191 121T235 106Q290 106 350 152V346Q290 392 235 392T180 340Z" />
+<glyph unicode="e" glyph-name="e" horiz-adv-x="499" d="M455 359V243Q455 220 433 220H177V146Q177 118 194 105T255 91T315 104T333 146V151Q333 176 358 176H428Q453 176 453 151V140Q453 -8 254 -8Q49 -8 49 140V359Q49 506 255 506Q455 506 455 359ZM177
+352V308H333V352Q333 407 255 407T177 352Z" />
+<glyph unicode="f" glyph-name="f" horiz-adv-x="349" d="M94 496H97V558Q97 627 151 666T312 705H321Q346 705 346 681V623Q346 597 321 597H312Q229 597 229 543V496H312Q337 496 337 473V417Q337 392 312 392H229V26Q229 0 205 0H122Q97 0 97 26V392H43Q19
+392 19 417V467Q19 479 24 484T43 491L94 496Z" />
+<glyph unicode="g" glyph-name="g" horiz-adv-x="540" d="M194 -8Q122 -8 86 30T49 138V360Q49 429 85 467T194 506Q283 506 354 448L356 473Q358 487 362 492T380 498H457Q481 498 481 473V-54Q481 -123 428 -162T267 -201H126Q101 -201 101 -177V-119Q101 -93
+126 -93H267Q350 -93 350 -39V45Q277 -8 194 -8ZM180 340V159Q180 135 191 121T235 106Q290 106 350 152V346Q290 392 235 392T180 340Z" />
+<glyph unicode="h" glyph-name="h" horiz-adv-x="545" d="M190 673V454Q259 506 347 506Q415 506 453 469T492 372V26Q492 0 467 0H386Q360 0 360 26V339Q360 367 349 379T306 392Q249 392 190 347V26Q190 0 167 0H84Q59 0 59 26V673Q59 699 84 699H167Q190 699 190 673Z" />
+<glyph unicode="i" glyph-name="i" horiz-adv-x="250" d="M190 473V26Q190 0 167 0H84Q59 0 59 26V473Q59 498 84 498H167Q190 498 190 473ZM190 673V587Q190 563 167 563H84Q59 563 59 587V673Q59 699 84 699H167Q190 699 190 673Z" />
+<glyph unicode="j" glyph-name="j" horiz-adv-x="249" d="M190 673V587Q190 563 167 563H83Q59 563 59 587V673Q59 699 83 699H167Q190 699 190 673ZM190 473V-54Q190 -123 137 -162T-24 -201H-33Q-58 -201 -58 -177V-119Q-58 -93 -33 -93H-24Q59 -93 59 -39V473Q59
+498 83 498H166Q190 498 190 473Z" />
+<glyph unicode="k" glyph-name="k" horiz-adv-x="495" d="M316 283L491 25Q498 16 495 8T479 0H388Q369 0 352 25L212 229H190V25Q190 0 167 0H84Q59 0 59 25V674Q59 699 84 699H167Q190 699 190 674V328H212L336 473Q359 498 376 498H466Q479 498 482 490T478
+473L316 283Z" />
+<glyph unicode="l" glyph-name="l" horiz-adv-x="250" d="M190 673V26Q190 0 167 0H84Q59 0 59 26V673Q59 699 84 699H167Q190 699 190 673Z" />
+<glyph unicode="m" glyph-name="m" horiz-adv-x="835" d="M84 498H161Q174 498 179 493T185 474L186 450Q252 506 341 506Q435 506 469 439Q542 506 636 506Q704 506 742 469T781 372V26Q781 0 757 0H675Q650 0 650 26V339Q650 367 638 379T596 392Q537 392 486
+348V26Q486 0 461 0H380Q354 0 354 26V339Q354 367 343 379T300 392Q240 392 190 347V26Q190 0 167 0H84Q59 0 59 26V474Q59 498 84 498Z" />
+<glyph unicode="n" glyph-name="n" horiz-adv-x="545" d="M84 498H161Q174 498 179 493T185 474L187 450Q255 506 347 506Q415 506 453 469T492 372V26Q492 0 467 0H386Q360 0 360 26V339Q360 367 349 379T306 392Q249 392 190 347V26Q190 0 167 0H84Q59 0 59
+26V474Q59 498 84 498Z" />
+<glyph unicode="o" glyph-name="o" horiz-adv-x="530" d="M49 140V359Q49 428 103 467T265 506T426 467T481 359V140Q481 70 427 31T265 -8T104 31T49 140ZM350 151V348Q350 402 265 402T180 348V151Q180 96 265 96T350 151Z" />
+<glyph unicode="p" glyph-name="p" horiz-adv-x="540" d="M84 498H161Q174 498 179 493T185 473L187 449Q260 506 347 506Q419 506 455 468T492 360V138Q492 69 456 31T347 -8Q263 -8 190 45V-176Q190 -201 167 -201H84Q59 -201 59 -176V473Q59 498 84 498ZM360
+159V340Q360 392 306 392Q250 392 190 346V152Q250 106 306 106Q360 106 360 159Z" />
+<glyph unicode="q" glyph-name="q" horiz-adv-x="540" d="M353 449L355 473Q357 487 362 492T380 498H457Q481 498 481 473V-176Q481 -201 457 -201H374Q350 -201 350 -176V45Q277 -8 194 -8Q122 -8 86 30T49 138V360Q49 429 85 467T194 506Q280 506 353 449ZM180
+340V159Q180 135 191 121T235 106Q290 106 350 152V346Q290 392 235 392T180 340Z" />
+<glyph unicode="r" glyph-name="r" horiz-adv-x="371" d="M334 506Q360 506 360 482V418Q360 393 334 392Q248 386 190 333V26Q190 0 167 0H84Q59 0 59 26V474Q59 498 84 498H161Q174 498 179 493T185 474L188 439Q250 506 334 506Z" />
+<glyph unicode="s" glyph-name="s" horiz-adv-x="472" d="M314 354V373Q314 414 241 414Q169 414 169 373V362Q169 338 200 327L344 276Q440 242 440 172V121Q440 67 390 30T238 -8T88 29T38 121V144Q38 167 61 167H135Q158 167 158 144V127Q158 85 238 85Q319
+85 319 127V144Q319 156 309 164T274 182L129 235Q98 247 74 276T50 341V373Q50 428 96 467T242 506Q341 506 387 467T433 373V354Q433 341 428 336T410 331H336Q314 331 314 354Z" />
+<glyph unicode="t" glyph-name="t" horiz-adv-x="363" d="M220 496H311Q336 496 336 473V417Q336 392 311 392H220V162Q220 108 300 108H322Q347 108 347 83V25Q347 0 322 0H280Q173 0 131 35T88 148V392H39Q15 392 15 417V467Q15 479 20 484T39 491L85 496H88V592Q88
+617 113 617H196Q220 617 220 592V496Z" />
+<glyph unicode="u" glyph-name="u" horiz-adv-x="539" d="M354 25L352 47Q290 -8 198 -8Q131 -8 93 29T54 126V473Q54 498 78 498H160Q185 498 185 473V159Q185 131 197 119T239 106Q294 106 349 150V473Q349 498 373 498H456Q480 498 480 473V25Q480 0 456 0H379Q366
+0 361 5T354 25Z" />
+<glyph unicode="v" glyph-name="v" horiz-adv-x="474" d="M285 0H190Q177 0 173 4T164 23L15 473Q11 485 17 491T38 498H124Q144 498 152 473L225 246Q235 214 241 154Q247 205 261 245L340 473Q348 498 368 498H444Q458 498 465 492T468 473L310 23Q305 9 301 5T285 0Z" />
+<glyph unicode="w" glyph-name="w" horiz-adv-x="716" d="M712 473L584 23Q580 9 576 5T559 0H460Q447 0 442 5T434 23L378 260Q369 296 369 313L367 304Q365 296 362 284T356 260L287 23Q284 10 279 5T262 0H165Q152 0 147 5T139 23L18 473Q11 498 42 498H121Q142
+498 149 473L218 211Q220 202 222 191T225 172T226 163Q226 170 238 211L311 473Q318 498 338 498H418Q441 498 446 473L507 211Q509 201 511 190T514 172T516 164Q516 169 527 211L595 473Q602 498 623 498H689Q719 498 712 473Z" />
+<glyph unicode="x" glyph-name="x" horiz-adv-x="475" d="M309 250L459 25Q466 16 463 8T446 0H356Q338 0 321 25L229 161L141 25Q124 0 106 0H26Q14 0 11 8T14 25L167 254L21 473Q14 483 17 490T33 498H123Q142 498 160 473L247 343L329 473Q345 498 365 498H445Q457
+498 460 491T457 473L309 250Z" />
+<glyph unicode="y" glyph-name="y" horiz-adv-x="474" d="M149 473L224 244Q225 242 241 160Q259 230 262 240L341 473Q345 486 350 492T368 498H444Q458 498 465 492T468 473L247 -176Q239 -201 219 -201H159Q128 -201 135 -176L184 -13L15 473Q11 485 18 491T38
+498H121Q141 498 149 473Z" />
+<glyph unicode="z" glyph-name="z" horiz-adv-x="446" d="M74 498H377Q402 498 402 474V416Q402 405 394 394L192 107H395Q420 107 420 83V24Q420 0 395 0H57Q32 0 32 24V83Q32 94 40 105L240 391H74Q48 391 48 415V474Q48 498 74 498Z" />
+<glyph unicode="{" glyph-name="braceleft" horiz-adv-x="450" d="M155 357V560Q155 630 208 669T369 708H378Q403 708 403 683V625Q403 600 378 600H369Q290 600 290 546V343Q290 273 228 249Q290 223 290 154V-56Q290 -110 369 -110H378Q403 -110 403 -135V-193Q403
+-218 378 -218H369Q262 -218 209 -179T155 -70V141Q155 195 78 195H77Q52 195 52 220V277Q52 303 77 303H78Q155 303 155 357Z" />
+<glyph unicode="|" glyph-name="bar" horiz-adv-x="274" d="M205 673V-185Q205 -211 181 -211H94Q70 -211 70 -185V673Q70 699 94 699H181Q205 699 205 673Z" />
+<glyph unicode="}" glyph-name="braceright" horiz-adv-x="450" d="M295 560V357Q295 303 372 303H373Q398 303 398 277V220Q398 195 373 195H372Q295 195 295 141V-70Q295 -140 242 -179T81 -218H71Q46 -218 46 -193V-135Q46 -110 71 -110H81Q160 -110 160 -56V154Q160
+223 221 249Q160 273 160 343V546Q160 600 81 600H71Q46 600 46 625V683Q46 708 71 708H81Q188 708 241 669T295 560Z" />
+<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="504" d="M176 261Q168 261 164 256T158 246T154 230L153 224Q151 211 145 207T126 202H83Q60 202 63 230L67 278Q70 322 95 344T151 366Q179 366 205 355L295 314Q323 301 335 301Q342 301 346 305T351
+315T355 332L356 337Q360 359 383 359H426Q450 359 447 330L442 289Q436 242 413 219T360 195Q331 195 299 209L208 251Q188 261 176 261Z" />
+<glyph unicode="&#xa0;" glyph-name="uni00A0" horiz-adv-x="194" />
+<glyph unicode="&#xa1;" glyph-name="exclamdown" horiz-adv-x="277" d="M69 108L82 291Q83 305 88 310T106 316H168Q181 316 186 311T192 291L206 108V-156Q206 -182 181 -182H93Q69 -182 69 -156V108ZM71 392V473Q71 498 95 498H182Q206 498 206 473V392Q206
+367 182 367H95Q71 367 71 392Z" />
+<glyph unicode="&#xa2;" glyph-name="cent" horiz-adv-x="545" d="M341 654V592Q478 569 478 450V433Q478 409 454 409H377Q352 409 352 433V440Q352 468 335 480T275 493T216 481T198 440V241Q198 213 215 200T275 187T334 200T352 241V256Q352 281 377 281H454Q478
+281 478 256V231Q478 111 341 88V26Q341 0 317 0H234Q210 0 210 26V87Q67 107 67 231V450Q67 572 210 593V654Q210 680 234 680H317Q341 680 341 654Z" />
+<glyph unicode="&#xa3;" glyph-name="sterling" horiz-adv-x="687" d="M283 389H392Q417 389 417 365V305Q417 281 392 281H283V108H435Q492 108 492 189V198Q492 223 517 223H595Q620 223 620 198V189Q620 85 582 43T471 0H92Q67 0 67 25V84Q67 108 92 108H148V281H92Q67
+281 67 305V365Q67 389 92 389H148V527Q148 598 200 643T371 688T542 643T595 527V493Q595 467 571 467H490Q466 467 466 493V503Q466 576 372 576Q326 576 305 559T283 503V389Z" />
+<glyph unicode="&#xa4;" glyph-name="currency" horiz-adv-x="630" d="M92 311H123V366H92Q67 366 67 390V425Q67 449 92 449H123V525Q123 596 177 642T358 688T538 642T593 525V477Q593 452 570 452H487Q462 452 462 477V501Q462 576 360 576Q259 576 259 501V449H357Q382
+449 382 425V390Q382 366 357 366H259V311H357Q382 311 382 288V253Q382 228 357 228H259V179Q259 104 360 104Q462 104 462 179V217Q462 242 487 242H570Q593 242 593 217V155Q593 84 539 38T358 -8T178 38T123 155V228H92Q67 228 67 253V288Q67 311 92 311Z"
+/>
+<glyph unicode="&#xa5;" glyph-name="yen" horiz-adv-x="657" d="M537 231H401V25Q401 0 377 0H290Q265 0 265 25V231H130Q104 231 104 255V290Q104 314 130 314H232L207 368H130Q104 368 104 393V428Q104 451 130 451H169L75 655Q70 666 74 673T92 680H191Q211
+680 221 655L316 427Q327 397 333 374Q342 408 351 427L457 655Q468 680 486 680H572Q585 680 590 674T590 655L492 451H537Q562 451 562 428V393Q562 368 537 368H453L427 314H537Q562 314 562 290V255Q562 231 537 231Z" />
+<glyph unicode="&#xa6;" glyph-name="brokenbar" horiz-adv-x="250" d="M190 654V340Q190 314 167 314H84Q59 314 59 340V654Q59 680 84 680H167Q190 680 190 654ZM190 129V-185Q190 -211 167 -211H84Q59 -211 59 -185V129Q59 155 84 155H167Q190 155 190 129Z" />
+<glyph unicode="&#xa7;" glyph-name="section" horiz-adv-x="552" d="M468 281V203Q468 179 443 179H370Q346 179 346 203V268Q346 299 308 311L168 355Q70 386 70 478V539Q70 607 121 647T277 688Q482 688 482 545V536Q482 511 458 511H385Q361 511 361 536V551Q361
+578 342 590T281 602Q238 602 219 590T199 550V486Q199 460 247 445L373 406Q413 393 440 360T468 281ZM85 205V282Q85 296 90 301T109 306H182Q206 306 206 282V217Q206 186 244 174L384 130Q482 99 482 7V-53Q482 -121 432 -162T276 -203Q70 -203 70 -59V-50Q70
+-26 94 -26H167Q192 -26 192 -50V-66Q192 -94 210 -105T272 -117T334 -105T353 -65V0Q353 25 305 40L179 79Q140 91 113 125T85 205Z" />
+<glyph unicode="&#xa8;" glyph-name="dieresis" horiz-adv-x="381" d="M168 681V588Q168 563 145 563H96Q72 563 72 588V681Q72 706 96 706H145Q168 706 168 681ZM308 681V588Q308 563 285 563H236Q211 563 211 588V681Q211 706 236 706H285Q308 706 308 681Z" />
+<glyph unicode="&#xa9;" glyph-name="copyright" horiz-adv-x="778" d="M709 456V225Q709 187 703 158T678 96T625 42T531 6T389 -8Q308 -8 248 6T155 41T102 95T76 157T70 225V456Q70 494 76 523T101 585T154 639T248 674T389 688Q471 688 531 674T624 639T677
+586T703 524T709 456ZM614 206V475Q614 608 389 608Q165 608 165 474V207Q165 73 389 73Q614 73 614 206ZM299 546T391 546T521 512T560 407V398Q560 374 535 374H468Q444 374 444 398V404Q444 432 432 445T391 458T351 446T338 404V276Q338 248 350 235T391 222Q444
+222 444 276V289Q444 314 468 314H535Q560 314 560 289V272Q560 202 522 168T390 133Q298 133 260 167T221 272V407Q221 477 260 511Z" />
+<glyph unicode="&#xaa;" glyph-name="ordfeminine" horiz-adv-x="359" d="M56 594V601Q56 642 89 665T185 688Q312 688 312 597V400Q312 383 294 383H238Q228 383 225 386T220 400L218 409Q180 378 135 378Q91 378 69 400T47 455V480Q47 512 73 534T145 557H215V597Q215
+619 182 619T149 598V594Q149 577 132 577H75Q56 577 56 594ZM167 447Q193 447 215 469V498H165Q144 498 144 478V467Q144 447 167 447Z" />
+<glyph unicode="&#xab;" glyph-name="guillemotleft" horiz-adv-x="603" d="M513 319L407 245L513 172Q539 154 539 137V54Q539 42 531 37T513 38L327 171Q304 188 304 205V286Q304 302 327 319L513 453Q523 460 531 455T539 437V354Q539 338 513 319ZM273 319L167
+245L273 172Q299 154 299 137V54Q299 42 291 37T273 38L87 171Q64 188 64 205V286Q64 302 87 319L273 453Q283 460 291 455T299 437V354Q299 338 273 319Z" />
+<glyph unicode="&#xac;" glyph-name="logicalnot" horiz-adv-x="400" d="M74 320Q74 373 110 409T199 446Q252 446 288 409T325 320T288 232T199 195T111 231T74 320Z" />
+<glyph unicode="&#xad;" glyph-name="uni00AD" horiz-adv-x="436" d="M84 342H352Q377 342 377 318V259Q377 235 352 235H84Q59 235 59 259V318Q59 342 84 342Z" />
+<glyph unicode="&#xae;" glyph-name="registered" horiz-adv-x="646" d="M577 523V338Q577 314 573 294T553 251T511 211T437 184T324 173T211 184T137 211T95 250T75 294T70 338V523Q70 547 74 567T94 610T136 650T211 677T324 688T437 677T511 650T552 611T572
+567T577 523ZM490 329V531Q490 569 454 590T324 612Q156 612 156 531V330Q156 248 324 248Q490 248 490 329ZM449 466Q449 417 411 397L445 312Q448 304 444 299T428 294H375Q365 294 360 308Q359 311 358 312L330 382H296V312Q296 294 280 294H226Q209 294 209
+312V549Q209 566 226 566H339Q449 566 449 483V466ZM330 503H296V446H330Q340 446 350 452T360 468V480Q360 503 330 503Z" />
+<glyph unicode="&#xaf;" glyph-name="overscore" horiz-adv-x="406" d="M88 671H318Q343 671 343 647V596Q343 572 318 572H88Q62 572 62 596V647Q62 671 88 671Z" />
+<glyph unicode="&#xb0;" glyph-name="degree" horiz-adv-x="435" d="M54 481V576Q54 631 91 659T218 688T344 659T381 576V481Q381 427 344 399T218 370T92 398T54 481ZM270 486V572Q270 602 217 602Q165 602 165 572V486Q165 455 217 455Q270 455 270 486Z" />
+<glyph unicode="&#xb1;" glyph-name="plusminus" horiz-adv-x="560" d="M226 234V328H84Q59 328 59 352V412Q59 435 84 435H226V529Q226 554 249 554H308Q333 554 333 529V435H475Q501 435 501 412V352Q501 328 475 328H333V234Q333 209 308 209H249Q226 209 226
+234ZM84 153H475Q501 153 501 129V70Q501 45 475 45H84Q59 45 59 70V129Q59 153 84 153Z" />
+<glyph unicode="&#xb2;" glyph-name="twosuperior" horiz-adv-x="388" d="M158 356H324Q343 356 343 339V293Q343 275 324 275H74Q56 275 56 293V400Q56 423 64 434T92 453L220 510Q239 519 239 542V570Q239 589 226 599T191 609Q145 609 145 570V549Q145 530
+128 530H64Q46 530 46 549V585Q46 628 81 658T191 688T302 658T339 585V547Q339 473 281 447L172 397Q158 391 158 382V356Z" />
+<glyph unicode="&#xb3;" glyph-name="threesuperior" horiz-adv-x="387" d="M151 523H186Q234 523 234 561V572Q234 611 191 611T148 572V567Q148 550 130 550H66Q48 550 48 567V587Q48 631 81 660T193 689Q335 689 335 588V546Q335 502 293 487Q341 466 341 418V371Q341
+327 307 299T194 271T81 300T46 373V393Q46 410 64 410H127Q146 410 146 393V388Q146 349 193 349Q241 349 241 388V406Q241 445 192 445H151Q132 445 132 462V505Q132 523 151 523Z" />
+<glyph unicode="&#xb4;" glyph-name="acute" horiz-adv-x="314" d="M264 683L192 577Q180 560 160 560H95Q71 560 82 585L130 683Q142 708 165 708H252Q265 708 268 701T264 683Z" />
+<glyph unicode="&#xb5;" glyph-name="uni00B5" horiz-adv-x="539" d="M354 25L352 47Q290 -8 202 -8Q188 -8 178 -5L185 -176Q186 -201 161 -201H78Q54 -201 54 -176V473Q54 498 78 498H160Q185 498 185 473V159Q185 131 197 119T239 106Q294 106 349 150V473Q349
+498 373 498H456Q480 498 480 473V25Q480 0 456 0H379Q366 0 361 5T354 25Z" />
+<glyph unicode="&#xb6;" glyph-name="paragraph" horiz-adv-x="693" d="M422 655V-176Q422 -201 398 -201H311Q287 -201 287 -176V282H263Q156 282 113 316T70 413V549Q70 612 113 646T263 680H398Q422 680 422 655ZM624 654V-176Q624 -201 600 -201H513Q489 -201
+489 -176V654Q489 680 513 680H600Q624 680 624 654Z" />
+<glyph unicode="&#xb7;" glyph-name="middot" horiz-adv-x="250" d="M192 317V236Q192 211 168 211H83Q58 211 58 236V317Q58 342 83 342H168Q192 342 192 317Z" />
+<glyph unicode="&#xb8;" glyph-name="cedilla" horiz-adv-x="261" d="M131 -45H161Q202 -45 225 -65T249 -127Q249 -169 226 -190T161 -211H42Q17 -211 17 -186V-166Q17 -142 42 -142H140Q159 -142 159 -127Q159 -111 140 -111H65Q24 -111 34 -78L60 13Q67 36
+89 35L126 32Q152 30 144 2L131 -45Z" />
+<glyph unicode="&#xb9;" glyph-name="onesuperior" horiz-adv-x="374" d="M65 662L223 687Q227 687 231 687T237 683T240 670V355H311Q321 355 324 352T328 338V292Q328 274 311 274H65Q46 274 46 292V338Q46 348 50 351T65 355H138V592L65 583Q46 580 46 598V644Q46
+659 65 662Z" />
+<glyph unicode="&#xba;" glyph-name="ordmasculine" horiz-adv-x="372" d="M46 471V594Q46 638 82 663T186 688Q253 688 289 663T325 594V471Q325 428 289 403T186 378Q118 378 82 402T46 471ZM225 480V586Q225 612 186 612Q146 612 146 586V480Q146 453 186 453Q225
+453 225 480Z" />
+<glyph unicode="&#xbb;" glyph-name="guillemotright" horiz-adv-x="603" d="M330 179L436 253L330 326Q304 344 304 361V444Q304 456 312 461T330 460L516 327Q539 310 539 293V212Q539 196 516 179L330 45Q320 38 312 43T304 61V144Q304 160 330 179ZM90 179L196
+253L90 326Q64 344 64 361V444Q64 456 72 461T90 460L276 327Q299 310 299 293V212Q299 196 276 179L90 45Q80 38 72 43T64 61V144Q64 160 90 179Z" />
+<glyph unicode="&#xbc;" glyph-name="onequarter" horiz-adv-x="895" d="M717 390L658 183H747V390Q747 408 765 408H831Q849 408 849 390V18Q849 0 831 0H765Q747 0 747 18V103H571Q551 103 551 121V158Q551 168 554 177L614 390Q619 408 636 408H703Q722 408
+717 390ZM65 662L223 687Q227 687 231 687T237 683T240 670V355H311Q321 355 324 352T328 338V292Q328 274 311 274H65Q46 274 46 292V338Q46 348 50 351T65 355H138V595L65 583Q46 580 46 598V644Q46 659 65 662ZM601 711L421 -31Q419 -41 415 -45T401 -49H331Q312
+-49 317 -31L496 711Q500 729 518 729H587Q606 729 601 711Z" />
+<glyph unicode="&#xbd;" glyph-name="onehalf" horiz-adv-x="899" d="M65 662L223 687Q227 687 231 687T237 683T240 670V355H311Q321 355 324 352T328 338V292Q328 274 311 274H65Q46 274 46 292V338Q46 348 50 351T65 355H138V593L65 583Q46 580 46 598V644Q46
+659 65 662ZM592 711L412 -31Q408 -49 392 -49H322Q304 -49 308 -31L488 711Q492 729 509 729H578Q597 729 592 711ZM668 81H835Q853 81 853 64V18Q853 0 835 0H584Q566 0 566 18V125Q566 148 574 159T602 178L730 235Q749 244 749 267V295Q749 334 702 334T655
+295V274Q655 255 638 255H574Q556 255 556 274V310Q556 353 591 383T702 413Q777 413 813 383T849 310V272Q849 200 791 172L683 122Q668 116 668 108V81Z" />
+<glyph unicode="&#xbe;" glyph-name="threequarters" horiz-adv-x="906" d="M151 522H186Q234 522 234 560V571Q234 610 191 610T148 571V566Q148 549 130 549H66Q48 549 48 566V586Q48 630 81 659T193 688Q335 688 335 587V545Q335 501 293 486Q341 465 341 417V370Q341
+326 307 298T194 270T81 299T46 372V392Q46 409 64 409H127Q146 409 146 392V387Q146 348 193 348Q241 348 241 387V405Q241 444 192 444H151Q132 444 132 461V504Q132 522 151 522ZM612 711L432 -31Q428 -49 412 -49H342Q324 -49 328 -31L508 711Q512 729 529
+729H598Q617 729 612 711ZM728 390L669 183H758V390Q758 408 776 408H842Q860 408 860 390V18Q860 0 842 0H776Q758 0 758 18V103H582Q562 103 562 121V158Q562 168 565 177L625 390Q630 408 647 408H714Q733 408 728 390Z" />
+<glyph unicode="&#xbf;" glyph-name="questiondown" horiz-adv-x="565" d="M378 292V223Q378 185 362 166T315 133L223 86Q185 65 185 25V-5Q185 -80 284 -80T383 -5V34Q383 59 406 59H489Q514 59 514 34V-27Q514 -98 460 -144T284 -190T108 -144T51 -27V20Q51
+134 144 175L201 201Q224 212 233 223T243 257V292Q243 305 248 310T266 316H354Q378 316 378 292ZM243 392V473Q243 498 266 498H354Q378 498 378 473V392Q378 367 354 367H266Q243 367 243 392Z" />
+<glyph unicode="&#xc0;" glyph-name="Agrave" horiz-adv-x="553" d="M212 747L140 852Q132 863 136 870T153 878H240Q262 878 274 853L322 755Q333 730 310 730H245Q225 730 212 747ZM241 680H328Q353 680 360 655L546 25Q554 0 528 0H438Q417 0 409 25L374 147H188L153
+25Q145 0 123 0H42Q15 0 23 25L210 655Q217 680 241 680ZM344 254L311 365Q303 391 294 458T282 547Q258 390 251 366L217 254H344Z" />
+<glyph unicode="&#xc1;" glyph-name="Aacute" horiz-adv-x="553" d="M422 853L349 747Q337 730 317 730H252Q226 730 239 755L288 853Q300 878 322 878H409Q422 878 426 871T422 853ZM241 680H328Q353 680 360 655L546 25Q554 0 528 0H438Q417 0 409 25L374 147H188L153
+25Q145 0 123 0H42Q15 0 23 25L210 655Q217 680 241 680ZM344 254L311 365Q303 391 294 458T282 547Q258 390 251 366L217 254H344Z" />
+<glyph unicode="&#xc2;" glyph-name="Acircumflex" horiz-adv-x="553" d="M285 800L260 755Q246 730 226 730H162Q149 730 146 737T149 755L222 853Q240 878 261 878H309Q328 878 348 853L421 755Q428 744 425 737T408 730H344Q323 730 310 755L285 800ZM241 680H328Q353
+680 360 655L546 25Q554 0 528 0H438Q417 0 409 25L374 147H188L153 25Q145 0 123 0H42Q15 0 23 25L210 655Q217 680 241 680ZM344 254L311 365Q303 391 294 458T282 547Q258 390 251 366L217 254H344Z" />
+<glyph unicode="&#xc3;" glyph-name="Atilde" horiz-adv-x="553" d="M224 786Q205 786 205 761V756Q205 734 178 734H135Q111 734 114 763L118 804Q122 841 146 861T206 882Q236 882 264 869L307 848Q337 833 344 833Q353 833 357 838T363 857L364 863Q368 885
+391 885H434Q457 885 455 856L452 817Q449 779 426 759T369 739T305 752L262 771Q230 786 224 786ZM241 680H328Q353 680 360 655L546 25Q554 0 528 0H438Q417 0 409 25L374 147H188L153 25Q145 0 123 0H42Q15 0 23 25L210 655Q217 680 241 680ZM344 254L311 365Q303
+391 294 458T282 547Q258 390 251 366L217 254H344Z" />
+<glyph unicode="&#xc4;" glyph-name="Adieresis" horiz-adv-x="553" d="M241 680H328Q353 680 360 655L546 25Q554 0 528 0H438Q417 0 409 25L374 147H188L153 25Q145 0 123 0H42Q15 0 23 25L210 655Q217 680 241 680ZM344 254L311 365Q303 391 294 458T282 547Q258
+390 251 366L217 254H344ZM264 850V757Q264 732 240 732H191Q167 732 167 757V850Q167 876 191 876H240Q264 876 264 850ZM403 850V757Q403 732 380 732H331Q307 732 307 757V850Q307 876 331 876H380Q403 876 403 850Z" />
+<glyph unicode="&#xc5;" glyph-name="Aring" horiz-adv-x="553" d="M241 680H328Q353 680 360 655L546 25Q554 0 528 0H438Q417 0 409 25L374 147H188L153 25Q145 0 123 0H42Q15 0 23 25L210 655Q217 680 241 680ZM344 254L311 365Q303 391 294 458T282 547Q258
+390 251 366L217 254H344ZM397 821V792Q397 759 369 737T285 714T202 736T173 792V821Q173 854 201 876T285 899T368 877T397 821ZM325 801V813Q325 843 285 843T245 813V801Q245 770 285 770T325 801Z" />
+<glyph unicode="&#xc6;" glyph-name="AE" horiz-adv-x="835" d="M432 680H764Q789 680 789 656V595Q789 571 764 571H533V405H747Q773 405 773 381V324Q773 299 747 299H533V109H775Q800 109 800 86V24Q800 0 775 0H430Q405 0 405 25V147H222L151 25Q136 0 122
+0H40Q27 0 22 7T22 25L397 656Q412 680 432 680ZM371 400L286 254H405V465Q386 426 371 400Z" />
+<glyph unicode="&#xc7;" glyph-name="Ccedilla" horiz-adv-x="569" d="M294 -45H324Q365 -45 388 -65T412 -127Q412 -169 389 -190T324 -211H205Q180 -211 180 -186V-166Q180 -142 205 -142H303Q322 -142 322 -127Q322 -111 303 -111H228Q187 -111 197 -78L218
+-2Q133 11 96 53T59 155V525Q59 596 113 642T294 688T474 642T529 525V477Q529 452 506 452H423Q398 452 398 477V501Q398 576 296 576Q195 576 195 501V179Q195 104 296 104Q398 104 398 179V217Q398 242 423 242H506Q529 242 529 217V155Q529 85 477 40T304 -8L294
+-45Z" />
+<glyph unicode="&#xc8;" glyph-name="Egrave" horiz-adv-x="512" d="M205 747L133 852Q125 863 129 870T146 878H233Q255 878 267 853L315 755Q326 730 303 730H238Q218 730 205 747ZM446 0H94Q70 0 70 26V654Q70 680 94 680H436Q461 680 461 656V593Q461 568
+436 568H205V406H419Q445 406 445 382V322Q445 298 419 298H205V112H446Q471 112 471 88V25Q471 0 446 0Z" />
+<glyph unicode="&#xc9;" glyph-name="Eacute" horiz-adv-x="512" d="M446 0H94Q70 0 70 26V654Q70 680 94 680H436Q461 680 461 656V593Q461 568 436 568H205V406H419Q445 406 445 382V322Q445 298 419 298H205V112H446Q471 112 471 88V25Q471 0 446 0ZM388 853L315
+747Q303 730 283 730H218Q192 730 205 755L254 853Q266 878 288 878H375Q388 878 392 871T388 853Z" />
+<glyph unicode="&#xca;" glyph-name="Ecircumflex" horiz-adv-x="512" d="M256 800L231 755Q217 730 197 730H133Q120 730 117 737T120 755L193 853Q211 878 232 878H280Q299 878 319 853L392 755Q399 744 396 737T379 730H315Q294 730 281 755L256 800ZM446 0H94Q70
+0 70 26V654Q70 680 94 680H436Q461 680 461 656V593Q461 568 436 568H205V406H419Q445 406 445 382V322Q445 298 419 298H205V112H446Q471 112 471 88V25Q471 0 446 0Z" />
+<glyph unicode="&#xcb;" glyph-name="Edieresis" horiz-adv-x="512" d="M446 0H94Q70 0 70 26V654Q70 680 94 680H436Q461 680 461 656V593Q461 568 436 568H205V406H419Q445 406 445 382V322Q445 298 419 298H205V112H446Q471 112 471 88V25Q471 0 446 0ZM242
+850V757Q242 732 218 732H169Q145 732 145 757V850Q145 876 169 876H218Q242 876 242 850ZM381 850V757Q381 732 358 732H309Q285 732 285 757V850Q285 876 309 876H358Q381 876 381 850Z" />
+<glyph unicode="&#xcc;" glyph-name="Igrave" horiz-adv-x="274" d="M209 654V26Q209 0 185 0H98Q74 0 74 26V654Q74 680 98 680H185Q209 680 209 654ZM75 747L3 852Q-5 863 -1 870T16 878H103Q125 878 137 853L185 755Q196 730 173 730H108Q88 730 75 747Z" />
+<glyph unicode="&#xcd;" glyph-name="Iacute" horiz-adv-x="274" d="M205 654V26Q205 0 181 0H94Q70 0 70 26V654Q70 680 94 680H181Q205 680 205 654ZM269 853L196 747Q184 730 164 730H99Q73 730 86 755L135 853Q147 878 169 878H256Q269 878 273 871T269 853Z" />
+<glyph unicode="&#xce;" glyph-name="Icircumflex" horiz-adv-x="274" d="M209 654V26Q209 0 185 0H98Q74 0 74 26V654Q74 680 98 680H185Q209 680 209 654ZM141 800L116 755Q102 730 82 730H18Q5 730 2 737T5 755L78 853Q96 878 117 878H165Q184 878 204 853L277
+755Q284 744 281 737T264 730H200Q179 730 166 755L141 800Z" />
+<glyph unicode="&#xcf;" glyph-name="Idieresis" horiz-adv-x="274" d="M205 654V26Q205 0 181 0H94Q70 0 70 26V654Q70 680 94 680H181Q205 680 205 654ZM116 850V757Q116 732 92 732H43Q19 732 19 757V850Q19 876 43 876H92Q116 876 116 850ZM255 850V757Q255
+732 232 732H183Q159 732 159 757V850Q159 876 183 876H232Q255 876 255 850Z" />
+<glyph unicode="&#xd0;" glyph-name="Eth" horiz-adv-x="615" d="M312 0H91Q70 0 70 26V292H28Q2 292 2 317V368Q2 391 28 391H70V654Q70 680 94 680H312Q438 680 497 634T556 517V163Q556 93 497 47T312 0ZM312 568H205V391H295Q320 391 320 368V317Q320 292
+295 292H205V112H312Q421 112 421 187V493Q421 568 312 568Z" />
+<glyph unicode="&#xd1;" glyph-name="Ntilde" horiz-adv-x="625" d="M556 655V25Q556 0 532 0H453Q437 0 430 12L237 343Q203 398 197 423V25Q197 0 173 0H94Q70 0 70 25V655Q70 680 94 680H173Q188 680 194 670L395 325L429 255V655Q429 680 453 680H532Q556
+680 556 655ZM252 786Q233 786 233 761V756Q233 734 206 734H163Q139 734 142 763L146 804Q150 841 174 861T234 882Q264 882 292 869L335 848Q365 833 372 833Q381 833 385 838T391 857L392 863Q396 885 419 885H462Q485 885 483 856L480 817Q477 779 454 759T397
+739T333 752L290 771Q258 786 252 786Z" />
+<glyph unicode="&#xd2;" glyph-name="Ograve" horiz-adv-x="605" d="M236 747L164 852Q156 863 160 870T177 878H264Q286 878 298 853L346 755Q357 730 334 730H269Q249 730 236 747ZM59 155V525Q59 595 117 641T302 688T486 642T545 525V155Q545 85 487 39T302
+-8T118 38T59 155ZM410 179V501Q410 576 302 576Q195 576 195 501V179Q195 104 302 104Q410 104 410 179Z" />
+<glyph unicode="&#xd3;" glyph-name="Oacute" horiz-adv-x="605" d="M425 853L352 747Q340 730 320 730H255Q229 730 242 755L291 853Q303 878 325 878H412Q425 878 429 871T425 853ZM59 155V525Q59 595 117 641T302 688T486 642T545 525V155Q545 85 487 39T302
+-8T118 38T59 155ZM410 179V501Q410 576 302 576Q195 576 195 501V179Q195 104 302 104Q410 104 410 179Z" />
+<glyph unicode="&#xd4;" glyph-name="Ocircumflex" horiz-adv-x="605" d="M302 800L277 755Q263 730 243 730H179Q166 730 163 737T166 755L239 853Q257 878 278 878H326Q345 878 365 853L438 755Q445 744 442 737T425 730H361Q340 730 327 755L302 800ZM59 155V525Q59
+595 117 641T302 688T486 642T545 525V155Q545 85 487 39T302 -8T118 38T59 155ZM410 179V501Q410 576 302 576Q195 576 195 501V179Q195 104 302 104Q410 104 410 179Z" />
+<glyph unicode="&#xd5;" glyph-name="Otilde" horiz-adv-x="605" d="M242 786Q223 786 223 761V756Q223 734 196 734H153Q129 734 132 763L136 804Q140 841 164 861T224 882Q254 882 282 869L325 848Q355 833 362 833Q371 833 375 838T381 857L382 863Q386 885
+409 885H452Q475 885 473 856L470 817Q467 779 444 759T387 739T323 752L280 771Q248 786 242 786ZM59 155V525Q59 595 117 641T302 688T486 642T545 525V155Q545 85 487 39T302 -8T118 38T59 155ZM410 179V501Q410 576 302 576Q195 576 195 501V179Q195 104 302
+104Q410 104 410 179Z" />
+<glyph unicode="&#xd6;" glyph-name="Odieresis" horiz-adv-x="605" d="M59 155V525Q59 595 117 641T302 688T486 642T545 525V155Q545 85 487 39T302 -8T118 38T59 155ZM410 179V501Q410 576 302 576Q195 576 195 501V179Q195 104 302 104Q410 104 410 179ZM281
+850V757Q281 732 257 732H208Q184 732 184 757V850Q184 876 208 876H257Q281 876 281 850ZM420 850V757Q420 732 397 732H348Q324 732 324 757V850Q324 876 348 876H397Q420 876 420 850Z" />
+<glyph unicode="&#xd7;" glyph-name="multiply" horiz-adv-x="541" d="M333 142L262 264L140 194Q118 182 106 203L77 254Q65 276 87 288L209 358L138 481Q126 503 146 515L197 545Q218 558 231 535L302 412L425 483Q447 495 459 475L488 424Q501 401 479 389L355
+318L426 196Q438 174 417 162L366 133Q345 121 333 142Z" />
+<glyph unicode="&#xd8;" glyph-name="Oslash" horiz-adv-x="605" d="M59 154V524Q59 594 117 640T302 687Q378 687 435 667L444 684Q459 714 478 714H506Q528 714 513 684L489 638Q545 596 545 524V154Q545 84 487 38T302 -9Q225 -9 167 11L159 -5Q144 -35 123
+-35H97Q74 -35 89 -5L112 41Q59 83 59 154ZM410 178V483L224 121Q251 103 302 103Q410 103 410 178ZM195 500V201L379 558Q350 575 302 575Q195 575 195 500Z" />
+<glyph unicode="&#xd9;" glyph-name="Ugrave" horiz-adv-x="615" d="M249 747L177 852Q169 863 173 870T190 878H277Q299 878 311 853L359 755Q370 730 347 730H282Q262 730 249 747ZM200 654V179Q200 104 307 104Q358 104 387 123T416 179V654Q416 680 440 680H527Q550
+680 550 654V155Q550 85 492 39T307 -8T123 38T64 155V654Q64 680 89 680H176Q200 680 200 654Z" />
+<glyph unicode="&#xda;" glyph-name="Uacute" horiz-adv-x="615" d="M200 654V179Q200 104 307 104Q358 104 387 123T416 179V654Q416 680 440 680H527Q550 680 550 654V155Q550 85 492 39T307 -8T123 38T64 155V654Q64 680 89 680H176Q200 680 200 654ZM441 853L368
+747Q356 730 336 730H271Q245 730 258 755L307 853Q319 878 341 878H428Q441 878 445 871T441 853Z" />
+<glyph unicode="&#xdb;" glyph-name="Ucircumflex" horiz-adv-x="615" d="M307 800L282 755Q268 730 248 730H184Q171 730 168 737T171 755L244 853Q262 878 283 878H331Q350 878 370 853L443 755Q450 744 447 737T430 730H366Q345 730 332 755L307 800ZM200 654V179Q200
+104 307 104Q358 104 387 123T416 179V654Q416 680 440 680H527Q550 680 550 654V155Q550 85 492 39T307 -8T123 38T64 155V654Q64 680 89 680H176Q200 680 200 654Z" />
+<glyph unicode="&#xdc;" glyph-name="Udieresis" horiz-adv-x="615" d="M200 654V179Q200 104 307 104Q358 104 387 123T416 179V654Q416 680 440 680H527Q550 680 550 654V155Q550 85 492 39T307 -8T123 38T64 155V654Q64 680 89 680H176Q200 680 200 654ZM286
+850V757Q286 732 262 732H213Q189 732 189 757V850Q189 876 213 876H262Q286 876 286 850ZM425 850V757Q425 732 402 732H353Q329 732 329 757V850Q329 876 353 876H402Q425 876 425 850Z" />
+<glyph unicode="&#xdd;" glyph-name="Yacute" horiz-adv-x="545" d="M165 655L260 427L277 375Q281 402 295 427L401 655Q412 680 430 680H516Q529 680 534 674T534 655L345 260V25Q345 0 321 0H234Q209 0 209 25V244L19 655Q14 666 18 673T36 680H135Q155 680
+165 655ZM418 853L345 747Q333 730 313 730H248Q222 730 235 755L284 853Q296 878 318 878H405Q418 878 422 871T418 853Z" />
+<glyph unicode="&#xde;" glyph-name="Thorn" horiz-adv-x="580" d="M205 655V498H304Q430 498 488 452T546 335V250Q546 179 488 133T304 87H205V25Q205 0 181 0H94Q70 0 70 25V655Q70 680 94 680H181Q205 680 205 655ZM304 387H205V198H304Q355 198 384 217T413
+273V312Q413 349 384 368T304 387Z" />
+<glyph unicode="&#xdf;" glyph-name="germandbls" horiz-adv-x="641" d="M229 553V26Q229 0 205 0H122Q97 0 97 26V392H43Q19 392 19 417V467Q19 490 43 491L94 496H97V560Q97 629 154 668T325 708Q546 708 546 560V525Q546 463 477 433L410 404Q408 403 405 402T401
+400T396 398T392 395T388 392T385 388T384 384T383 378V376Q383 357 415 344L531 291Q566 275 593 247T620 181V136Q620 -8 441 -8Q346 -8 309 26T272 131V136Q272 161 296 161H353Q378 161 378 136V126Q378 75 439 75Q501 75 501 126V158Q501 182 463 198L356
+245Q274 281 274 360V380Q274 440 339 468L385 488Q424 505 424 536V553Q424 614 326 614Q229 614 229 553Z" />
+<glyph unicode="&#xe0;" glyph-name="agrave" horiz-adv-x="517" d="M214 577L142 683Q134 694 137 701T154 708H241Q264 708 276 683L324 585Q335 560 311 560H246Q226 560 214 577ZM60 349V362Q60 506 262 506Q463 506 463 362V26Q463 0 439 0H364Q351 0 347
+6T340 26L338 47Q272 -8 190 -8Q120 -8 83 28T46 117V162Q46 215 85 251T196 288H334V352Q334 380 318 394T259 408T200 396T182 356V349Q182 324 158 324H84Q60 324 60 349ZM224 96Q276 96 334 139V196H222Q195 196 185 185T174 151V135Q174 96 224 96Z" />
+<glyph unicode="&#xe1;" glyph-name="aacute" horiz-adv-x="517" d="M377 683L305 577Q293 560 273 560H208Q184 560 195 585L243 683Q255 708 278 708H365Q378 708 381 701T377 683ZM60 349V362Q60 506 262 506Q463 506 463 362V26Q463 0 439 0H364Q351 0 347
+6T340 26L338 47Q272 -8 190 -8Q120 -8 83 28T46 117V162Q46 215 85 251T196 288H334V352Q334 380 318 394T259 408T200 396T182 356V349Q182 324 158 324H84Q60 324 60 349ZM224 96Q276 96 334 139V196H222Q195 196 185 185T174 151V135Q174 96 224 96Z" />
+<glyph unicode="&#xe2;" glyph-name="acircumflex" horiz-adv-x="517" d="M261 630L236 585Q222 560 202 560H138Q125 560 122 567T125 585L198 683Q216 708 237 708H285Q304 708 324 683L397 585Q404 574 401 567T384 560H320Q299 560 286 585L261 630ZM60 349V362Q60
+506 262 506Q463 506 463 362V26Q463 0 439 0H364Q351 0 347 6T340 26L338 47Q272 -8 190 -8Q120 -8 83 28T46 117V162Q46 215 85 251T196 288H334V352Q334 380 318 394T259 408T200 396T182 356V349Q182 324 158 324H84Q60 324 60 349ZM224 96Q276 96 334 139V196H222Q195
+196 185 185T174 151V135Q174 96 224 96Z" />
+<glyph unicode="&#xe3;" glyph-name="atilde" horiz-adv-x="517" d="M204 607Q195 607 191 602T185 583L184 577Q180 555 158 555H114Q91 555 94 584L98 626Q102 663 126 683T185 703Q218 703 244 690L286 670Q318 655 324 655Q343 655 343 679V684Q343 706 370
+706H413Q436 706 434 677L431 638Q428 600 405 580T349 560Q314 560 285 573L242 592Q208 607 204 607ZM60 349V362Q60 506 262 506Q463 506 463 362V26Q463 0 439 0H364Q351 0 347 6T340 26L338 47Q272 -8 190 -8Q120 -8 83 28T46 117V162Q46 215 85 251T196 288H334V352Q334
+380 318 394T259 408T200 396T182 356V349Q182 324 158 324H84Q60 324 60 349ZM224 96Q276 96 334 139V196H222Q195 196 185 185T174 151V135Q174 96 224 96Z" />
+<glyph unicode="&#xe4;" glyph-name="adieresis" horiz-adv-x="517" d="M60 349V362Q60 506 262 506Q463 506 463 362V26Q463 0 439 0H364Q351 0 347 6T340 26L338 47Q272 -8 190 -8Q120 -8 83 28T46 117V162Q46 215 85 251T196 288H334V352Q334 380 318 394T259
+408T200 396T182 356V349Q182 324 158 324H84Q60 324 60 349ZM224 96Q276 96 334 139V196H222Q195 196 185 185T174 151V135Q174 96 224 96ZM239 681V588Q239 563 216 563H167Q143 563 143 588V681Q143 706 167 706H216Q239 706 239 681ZM379 681V588Q379 563 356
+563H307Q282 563 282 588V681Q282 706 307 706H356Q379 706 379 681Z" />
+<glyph unicode="&#xe5;" glyph-name="aring" horiz-adv-x="517" d="M60 349V362Q60 506 262 506Q463 506 463 362V26Q463 0 439 0H364Q351 0 347 6T340 26L338 47Q272 -8 190 -8Q120 -8 83 28T46 117V162Q46 215 85 251T196 288H334V352Q334 380 318 394T259 408T200
+396T182 356V349Q182 324 158 324H84Q60 324 60 349ZM224 96Q276 96 334 139V196H222Q195 196 185 185T174 151V135Q174 96 224 96ZM374 654V620Q374 587 346 566T264 544Q209 544 181 565T153 620V654Q153 687 181 708T264 730Q318 730 346 709T374 654ZM304 629V644Q304
+674 264 674Q223 674 223 644V629Q223 599 264 599Q304 599 304 629Z" />
+<glyph unicode="&#xe6;" glyph-name="ae" horiz-adv-x="785" d="M741 359V245Q741 222 718 222H462V143Q462 89 540 89T618 144V151Q618 175 643 175H712Q737 175 737 151V139Q737 -8 540 -8Q407 -8 362 54Q283 -8 190 -8Q119 -8 82 28T45 117V160Q45 213 85 249T196
+285H334V359Q334 411 259 411Q217 411 200 399T182 359V349Q182 325 157 325H84Q59 325 59 349V363Q59 506 261 506Q356 506 396 461Q444 506 540 506Q741 506 741 359ZM224 94Q272 94 334 140V197H220Q173 197 173 153V134Q173 94 224 94ZM462 353V309H618V353Q618
+409 540 409T462 353Z" />
+<glyph unicode="&#xe7;" glyph-name="ccedilla" horiz-adv-x="492" d="M252 -45H282Q323 -45 346 -65T370 -127Q370 -169 347 -190T282 -211H163Q138 -211 138 -186V-166Q138 -142 163 -142H261Q280 -142 280 -127Q280 -111 261 -111H186Q145 -111 155 -78L177
+-1Q49 23 49 140V359Q49 506 255 506Q460 506 460 359V342Q460 318 436 318H359Q334 318 334 342V349Q334 377 317 389T257 402T198 390T180 349V150Q180 122 197 109T257 96T316 109T334 150V165Q334 190 359 190H436Q460 190 460 165V140Q460 -5 262 -8L252 -45Z"
+/>
+<glyph unicode="&#xe8;" glyph-name="egrave" horiz-adv-x="500" d="M195 577L123 683Q115 694 118 701T135 708H222Q245 708 257 683L305 585Q316 560 292 560H227Q207 560 195 577ZM455 359V243Q455 220 433 220H177V146Q177 118 194 105T255 91T315 104T333
+146V151Q333 176 358 176H428Q453 176 453 151V140Q453 -8 254 -8Q49 -8 49 140V359Q49 506 255 506Q455 506 455 359ZM177 352V308H333V352Q333 407 255 407T177 352Z" />
+<glyph unicode="&#xe9;" glyph-name="eacute" horiz-adv-x="500" d="M376 683L304 577Q292 560 272 560H207Q183 560 194 585L242 683Q254 708 277 708H364Q377 708 380 701T376 683ZM455 359V243Q455 220 433 220H177V146Q177 118 194 105T255 91T315 104T333
+146V151Q333 176 358 176H428Q453 176 453 151V140Q453 -8 254 -8Q49 -8 49 140V359Q49 506 255 506Q455 506 455 359ZM177 352V308H333V352Q333 407 255 407T177 352Z" />
+<glyph unicode="&#xea;" glyph-name="ecircumflex" horiz-adv-x="500" d="M255 630L230 585Q216 560 196 560H132Q119 560 116 567T119 585L192 683Q210 708 231 708H279Q298 708 318 683L391 585Q398 574 395 567T378 560H314Q293 560 280 585L255 630ZM455 359V243Q455
+220 433 220H177V146Q177 118 194 105T255 91T315 104T333 146V151Q333 176 358 176H428Q453 176 453 151V140Q453 -8 254 -8Q49 -8 49 140V359Q49 506 255 506Q455 506 455 359ZM177 352V308H333V352Q333 407 255 407T177 352Z" />
+<glyph unicode="&#xeb;" glyph-name="edieresis" horiz-adv-x="500" d="M231 681V588Q231 563 208 563H159Q135 563 135 588V681Q135 706 159 706H208Q231 706 231 681ZM371 681V588Q371 563 348 563H299Q274 563 274 588V681Q274 706 299 706H348Q371 706 371
+681ZM455 359V243Q455 220 433 220H177V146Q177 118 194 105T255 91T315 104T333 146V151Q333 176 358 176H428Q453 176 453 151V140Q453 -8 254 -8Q49 -8 49 140V359Q49 506 255 506Q455 506 455 359ZM177 352V308H333V352Q333 407 255 407T177 352Z" />
+<glyph unicode="&#xec;" glyph-name="igrave" horiz-adv-x="250" d="M194 473V25Q194 0 171 0H88Q63 0 63 25V473Q63 498 88 498H171Q194 498 194 473ZM66 577L-6 683Q-14 694 -11 701T6 708H93Q116 708 128 683L176 585Q187 560 163 560H98Q78 560 66 577Z" />
+<glyph unicode="&#xed;" glyph-name="iacute" horiz-adv-x="250" d="M257 683L185 577Q173 560 153 560H88Q64 560 75 585L123 683Q135 708 158 708H245Q258 708 261 701T257 683ZM190 473V25Q190 0 167 0H84Q59 0 59 25V473Q59 498 84 498H167Q190 498 190 473Z" />
+<glyph unicode="&#xee;" glyph-name="icircumflex" horiz-adv-x="250" d="M132 630L107 585Q93 560 73 560H9Q-4 560 -7 567T-4 585L69 683Q87 708 108 708H156Q175 708 195 683L268 585Q275 574 272 567T255 560H191Q170 560 157 585L132 630ZM194 473V25Q194
+0 171 0H88Q63 0 63 25V473Q63 498 88 498H171Q194 498 194 473Z" />
+<glyph unicode="&#xef;" glyph-name="idieresis" horiz-adv-x="250" d="M104 681V588Q104 563 81 563H32Q8 563 8 588V681Q8 706 32 706H81Q104 706 104 681ZM244 681V588Q244 563 221 563H172Q147 563 147 588V681Q147 706 172 706H221Q244 706 244 681ZM190
+473V25Q190 0 167 0H84Q59 0 59 25V473Q59 498 84 498H167Q190 498 190 473Z" />
+<glyph unicode="&#xf0;" glyph-name="eth" horiz-adv-x="568" d="M279 583L323 606Q306 617 267 617H170Q144 617 144 642V684Q144 708 170 708H267Q374 708 427 665L471 689Q493 702 505 680L514 665Q526 646 504 633L465 611Q473 591 473 561V139Q473 -8 265
+-8Q158 -8 104 31T49 139V360Q49 429 85 467T194 506Q279 506 350 452V534Q350 540 347 544L312 527Q290 515 278 536L269 551Q257 571 279 583ZM350 150V347Q290 393 235 393Q203 393 192 379T180 340V150Q180 95 265 95T350 150Z" />
+<glyph unicode="&#xf1;" glyph-name="ntilde" horiz-adv-x="546" d="M84 498H161Q174 498 179 493T185 474L187 450Q255 506 347 506Q415 506 453 469T492 372V26Q492 0 467 0H386Q360 0 360 26V339Q360 367 349 379T306 392Q249 392 190 347V26Q190 0 167 0H84Q59
+0 59 26V474Q59 498 84 498ZM211 615Q202 615 198 610T192 591L191 585Q187 563 165 563H121Q98 563 101 592L105 634Q109 671 133 691T192 711Q225 711 251 698L293 678Q325 663 331 663Q350 663 350 687V692Q350 714 377 714H420Q443 714 441 685L438 646Q435
+608 412 588T356 568Q321 568 292 581L249 600Q215 615 211 615Z" />
+<glyph unicode="&#xf2;" glyph-name="ograve" horiz-adv-x="530" d="M207 577L135 683Q127 694 130 701T147 708H234Q257 708 269 683L317 585Q328 560 304 560H239Q219 560 207 577ZM49 140V359Q49 428 103 467T265 506T426 467T481 359V140Q481 70 427 31T265
+-8T104 31T49 140ZM350 151V348Q350 402 265 402T180 348V151Q180 96 265 96T350 151Z" />
+<glyph unicode="&#xf3;" glyph-name="oacute" horiz-adv-x="530" d="M394 683L322 577Q310 560 290 560H225Q201 560 212 585L260 683Q272 708 295 708H382Q395 708 398 701T394 683ZM49 140V359Q49 428 103 467T265 506T426 467T481 359V140Q481 70 427 31T265
+-8T104 31T49 140ZM350 151V348Q350 402 265 402T180 348V151Q180 96 265 96T350 151Z" />
+<glyph unicode="&#xf4;" glyph-name="ocircumflex" horiz-adv-x="530" d="M267 630L242 585Q228 560 208 560H144Q131 560 128 567T131 585L204 683Q222 708 243 708H291Q310 708 330 683L403 585Q410 574 407 567T390 560H326Q305 560 292 585L267 630ZM49 140V359Q49
+428 103 467T265 506T426 467T481 359V140Q481 70 427 31T265 -8T104 31T49 140ZM350 151V348Q350 402 265 402T180 348V151Q180 96 265 96T350 151Z" />
+<glyph unicode="&#xf5;" glyph-name="otilde" horiz-adv-x="530" d="M207 607Q198 607 194 602T188 583L187 577Q183 555 161 555H117Q94 555 97 584L101 626Q105 663 129 683T188 703Q221 703 247 690L289 670Q321 655 327 655Q346 655 346 679V684Q346 706 373
+706H416Q439 706 437 677L434 638Q431 600 408 580T352 560Q317 560 288 573L245 592Q211 607 207 607ZM49 140V359Q49 428 103 467T265 506T426 467T481 359V140Q481 70 427 31T265 -8T104 31T49 140ZM350 151V348Q350 402 265 402T180 348V151Q180 96 265 96T350
+151Z" />
+<glyph unicode="&#xf6;" glyph-name="odieresis" horiz-adv-x="530" d="M245 681V588Q245 563 222 563H173Q149 563 149 588V681Q149 706 173 706H222Q245 706 245 681ZM385 681V588Q385 563 362 563H313Q288 563 288 588V681Q288 706 313 706H362Q385 706 385
+681ZM49 140V359Q49 428 103 467T265 506T426 467T481 359V140Q481 70 427 31T265 -8T104 31T49 140ZM350 151V348Q350 402 265 402T180 348V151Q180 96 265 96T350 151Z" />
+<glyph unicode="&#xf7;" glyph-name="divide" horiz-adv-x="581" d="M84 352H496Q521 352 521 328V268Q521 244 496 244H84Q59 244 59 268V328Q59 352 84 352ZM357 161V80Q357 55 333 55H248Q223 55 223 80V161Q223 186 248 186H333Q357 186 357 161ZM357 517V436Q357
+411 333 411H248Q223 411 223 436V517Q223 542 248 542H333Q357 542 357 517Z" />
+<glyph unicode="&#xf8;" glyph-name="oslash" horiz-adv-x="530" d="M49 140V359Q49 428 103 467T265 506Q321 506 363 495L369 505Q385 535 403 535H431Q454 535 437 505L419 471Q481 433 481 359V140Q481 70 427 31T265 -8Q209 -8 165 3L161 -4Q152 -22 146
+-28T124 -34H99Q87 -34 87 -24T93 -4L110 27Q49 66 49 140ZM350 151V344L218 101Q234 96 265 96Q350 96 350 151ZM180 348V156L310 396Q292 402 265 402Q180 402 180 348Z" />
+<glyph unicode="&#xf9;" glyph-name="ugrave" horiz-adv-x="540" d="M354 25L352 47Q290 -8 198 -8Q131 -8 93 29T54 126V473Q54 498 78 498H160Q185 498 185 473V159Q185 131 197 119T239 106Q294 106 349 150V473Q349 498 373 498H456Q480 498 480 473V25Q480
+0 456 0H379Q366 0 361 5T354 25ZM208 577L136 683Q128 694 131 701T148 708H235Q258 708 270 683L318 585Q329 560 305 560H240Q220 560 208 577Z" />
+<glyph unicode="&#xfa;" glyph-name="uacute" horiz-adv-x="540" d="M396 683L324 577Q312 560 292 560H227Q203 560 214 585L262 683Q274 708 297 708H384Q397 708 400 701T396 683ZM354 25L352 47Q290 -8 198 -8Q131 -8 93 29T54 126V473Q54 498 78 498H160Q185
+498 185 473V159Q185 131 197 119T239 106Q294 106 349 150V473Q349 498 373 498H456Q480 498 480 473V25Q480 0 456 0H379Q366 0 361 5T354 25Z" />
+<glyph unicode="&#xfb;" glyph-name="ucircumflex" horiz-adv-x="540" d="M257 630L232 585Q218 560 198 560H134Q121 560 118 567T121 585L194 683Q212 708 233 708H281Q300 708 320 683L393 585Q400 574 397 567T380 560H316Q295 560 282 585L257 630ZM354 25L352
+47Q290 -8 198 -8Q131 -8 93 29T54 126V473Q54 498 78 498H160Q185 498 185 473V159Q185 131 197 119T239 106Q294 106 349 150V473Q349 498 373 498H456Q480 498 480 473V25Q480 0 456 0H379Q366 0 361 5T354 25Z" />
+<glyph unicode="&#xfc;" glyph-name="udieresis" horiz-adv-x="540" d="M244 681V588Q244 563 221 563H172Q148 563 148 588V681Q148 706 172 706H221Q244 706 244 681ZM384 681V588Q384 563 361 563H312Q287 563 287 588V681Q287 706 312 706H361Q384 706 384
+681ZM354 25L352 47Q290 -8 198 -8Q131 -8 93 29T54 126V473Q54 498 78 498H160Q185 498 185 473V159Q185 131 197 119T239 106Q294 106 349 150V473Q349 498 373 498H456Q480 498 480 473V25Q480 0 456 0H379Q366 0 361 5T354 25Z" />
+<glyph unicode="&#xfd;" glyph-name="yacute" horiz-adv-x="474" d="M149 473L224 244Q225 242 241 160Q259 230 262 240L341 473Q345 486 350 492T368 498H444Q458 498 465 492T468 473L247 -176Q239 -201 219 -201H159Q128 -201 135 -176L184 -13L15 473Q11
+485 18 491T38 498H121Q141 498 149 473ZM377 683L305 577Q293 560 273 560H208Q184 560 195 585L243 683Q255 708 278 708H365Q378 708 381 701T377 683Z" />
+<glyph unicode="&#xfe;" glyph-name="thorn" horiz-adv-x="540" d="M190 674V452Q261 506 346 506Q419 506 455 468T492 360V138Q492 69 456 31T346 -8Q263 -8 190 45V-176Q190 -201 167 -201H84Q59 -201 59 -176V674Q59 699 84 699H166Q190 699 190 674ZM360
+158V340Q360 393 306 393Q250 393 190 347V151Q250 105 306 105Q360 105 360 158Z" />
+<glyph unicode="&#xff;" glyph-name="ydieresis" horiz-adv-x="474" d="M149 473L224 244Q225 242 241 160Q259 230 262 240L341 473Q345 486 350 492T368 498H444Q458 498 465 492T468 473L247 -176Q239 -201 219 -201H159Q128 -201 135 -176L184 -13L15 473Q11
+485 18 491T38 498H121Q141 498 149 473ZM222 681V588Q222 563 199 563H150Q126 563 126 588V681Q126 706 150 706H199Q222 706 222 681ZM362 681V588Q362 563 339 563H290Q265 563 265 588V681Q265 706 290 706H339Q362 706 362 681Z" />
+<glyph unicode="&#x152;" glyph-name="OE" horiz-adv-x="852" d="M59 155V525Q59 595 117 641T302 688Q360 688 411 666Q416 680 435 680H776Q802 680 802 656V593Q802 569 776 569H545V406H760Q785 406 785 382V323Q785 299 760 299H545V111H787Q812 111 812
+87V24Q812 0 787 0H434Q414 0 411 14Q364 -8 302 -8Q176 -8 118 38T59 155ZM410 174V502Q410 577 302 577T194 502V178Q194 103 302 103Q352 103 380 121T410 174Z" />
+<glyph unicode="&#x153;" glyph-name="oe" horiz-adv-x="801" d="M49 139V359Q49 428 103 467T265 506Q361 506 407 472Q458 506 556 506Q757 506 757 359V245Q757 222 734 222H478V144Q478 89 556 89T634 144V151Q634 175 659 175H728Q753 175 753 151V139Q753
+-8 556 -8Q459 -8 407 25Q360 -8 265 -8Q158 -8 104 31T49 139ZM350 150V348Q350 403 265 403T180 348V150Q180 95 265 95T350 150ZM478 353V309H634V353Q634 409 556 409T478 353Z" />
+<glyph unicode="&#x160;" glyph-name="Scaron" horiz-adv-x="572" d="M389 484V507Q389 579 292 579Q194 579 194 507V492Q194 453 235 438L409 376Q527 334 527 232V155Q527 84 471 38T289 -8Q165 -8 108 38T50 155V218Q50 244 74 244H158Q182 244 182 218V173Q182
+101 288 101T394 173V205Q394 224 381 239T353 261T309 279L154 337Q116 351 90 387T63 466V525Q63 596 116 642T290 688Q412 688 466 642T521 525V484Q521 459 496 459H412Q389 459 389 484ZM262 854L287 808L312 854Q325 878 346 878H410Q423 878 426 871T423
+854L350 755Q330 730 311 730H263Q244 730 224 756L151 854Q144 864 147 871T164 878H228Q249 878 262 854Z" />
+<glyph unicode="&#x161;" glyph-name="scaron" horiz-adv-x="472" d="M215 684L240 638L265 684Q278 708 299 708H363Q376 708 379 701T376 684L303 585Q283 560 264 560H216Q197 560 177 586L104 684Q97 694 100 701T117 708H181Q202 708 215 684ZM314 354V373Q314
+414 241 414Q169 414 169 373V362Q169 338 200 327L344 276Q440 242 440 172V121Q440 67 390 30T238 -8T88 29T38 121V144Q38 167 61 167H135Q158 167 158 144V127Q158 85 238 85Q319 85 319 127V144Q319 156 309 164T274 182L129 235Q98 247 74 276T50 341V373Q50
+428 96 467T242 506Q341 506 387 467T433 373V354Q433 341 428 336T410 331H336Q314 331 314 354Z" />
+<glyph unicode="&#x178;" glyph-name="Ydieresis" horiz-adv-x="545" d="M165 655L260 427L277 375Q281 402 295 427L401 655Q412 680 430 680H516Q529 680 534 674T534 655L345 260V25Q345 0 321 0H234Q209 0 209 25V244L19 655Q14 666 18 673T36 680H135Q155
+680 165 655ZM255 850V757Q255 732 231 732H182Q158 732 158 757V850Q158 876 182 876H231Q255 876 255 850ZM394 850V757Q394 732 371 732H322Q298 732 298 757V850Q298 876 322 876H371Q394 876 394 850Z" />
+<glyph unicode="&#x17d;" glyph-name="Zcaron" horiz-adv-x="497" d="M227 858L252 812L277 858Q290 882 311 882H375Q388 882 391 875T388 858L315 759Q295 734 276 734H228Q209 734 189 760L116 858Q109 868 112 875T129 882H193Q214 882 227 858ZM75 680H431Q457
+680 457 656V594Q457 584 451 574L195 112H449Q474 112 474 88V25Q474 0 449 0H58Q33 0 33 25V88Q33 97 37 105L294 568H75Q50 568 50 593V656Q50 680 75 680Z" />
+<glyph unicode="&#x17e;" glyph-name="zcaron" horiz-adv-x="446" d="M203 684L228 638L253 684Q266 708 287 708H351Q364 708 367 701T364 684L291 585Q271 560 252 560H204Q185 560 165 586L92 684Q85 694 88 701T105 708H169Q190 708 203 684ZM74 498H377Q402
+498 402 474V416Q402 405 394 394L192 107H395Q420 107 420 83V24Q420 0 395 0H57Q32 0 32 24V83Q32 94 40 105L240 391H74Q48 391 48 415V474Q48 498 74 498Z" />
+<glyph unicode="&#x192;" glyph-name="florin" horiz-adv-x="576" d="M494 600H474Q391 600 385 546L372 434H444Q469 434 469 410V354Q469 330 444 330H362L319 -64Q311 -133 254 -172T90 -211H81Q56 -211 56 -187V-129Q56 -104 81 -104H101Q183 -104 189 -49L230
+330H169Q145 330 145 354V409Q145 434 169 434H241L254 560Q261 630 319 669T484 708H494Q519 708 519 683V625Q519 600 494 600Z" />
+<glyph unicode="&#x2c6;" glyph-name="circumflex" horiz-adv-x="354" d="M180 630L155 585Q141 560 121 560H57Q44 560 41 567T44 585L117 683Q135 708 156 708H204Q223 708 243 683L316 585Q323 574 320 567T303 560H239Q218 560 205 585L180 630Z" />
+<glyph unicode="&#x2dc;" glyph-name="tilde" horiz-adv-x="408" d="M146 607Q137 607 133 602T127 583L126 577Q122 555 100 555H56Q33 555 36 584L40 626Q44 663 68 683T127 703Q160 703 186 690L228 670Q260 655 266 655Q285 655 285 679V684Q285 706 312 706H355Q378
+706 376 677L373 638Q370 600 347 580T291 560Q256 560 227 573L184 592Q150 607 146 607Z" />
+<glyph unicode="&#x2013;" glyph-name="endash" horiz-adv-x="533" d="M84 342H449Q474 342 474 318V259Q474 235 449 235H84Q59 235 59 259V318Q59 342 84 342Z" />
+<glyph unicode="&#x2014;" glyph-name="emdash" horiz-adv-x="843" d="M84 342H759Q784 342 784 318V259Q784 235 759 235H84Q59 235 59 259V318Q59 342 84 342Z" />
+<glyph unicode="&#x2018;" glyph-name="quoteleft" horiz-adv-x="266" d="M187 597V530Q187 505 163 505H77Q54 505 54 530V604Q54 718 198 752Q221 758 229 736L249 680Q257 657 233 649Q187 634 187 597Z" />
+<glyph unicode="&#x2019;" glyph-name="quoteright" horiz-adv-x="266" d="M87 660V727Q87 752 111 752H197Q220 752 220 727V653Q220 540 76 505Q53 499 45 521L25 577Q17 600 41 608Q87 623 87 660Z" />
+<glyph unicode="&#x201a;" glyph-name="quotesinglbase" horiz-adv-x="266" d="M87 39V106Q87 131 111 131H197Q220 131 220 106V32Q220 -82 76 -116Q53 -122 45 -100L25 -44Q17 -21 41 -13Q87 2 87 39Z" />
+<glyph unicode="&#x201c;" glyph-name="quotedblleft" horiz-adv-x="484" d="M405 597V530Q405 505 381 505H295Q272 505 272 530V604Q272 718 416 752Q439 758 447 736L467 680Q475 657 451 649Q405 634 405 597ZM187 597V530Q187 505 163 505H77Q54 505 54 530V604Q54
+718 198 752Q221 758 229 736L249 680Q257 657 233 649Q187 634 187 597Z" />
+<glyph unicode="&#x201d;" glyph-name="quotedblright" horiz-adv-x="484" d="M305 660V727Q305 752 329 752H415Q438 752 438 727V653Q438 540 294 505Q271 499 263 521L243 577Q235 600 259 608Q305 623 305 660ZM87 660V727Q87 752 111 752H197Q220 752 220
+727V653Q220 540 76 505Q53 499 45 521L25 577Q17 600 41 608Q87 623 87 660Z" />
+<glyph unicode="&#x201e;" glyph-name="quotedblbase" horiz-adv-x="484" d="M305 39V106Q305 131 329 131H415Q438 131 438 106V32Q438 -82 294 -116Q271 -122 263 -100L243 -44Q235 -21 259 -13Q305 2 305 39ZM87 39V106Q87 131 111 131H197Q220 131 220 106V32Q220
+-82 76 -116Q53 -122 45 -100L25 -44Q17 -21 41 -13Q87 2 87 39Z" />
+<glyph unicode="&#x2020;" glyph-name="dagger" horiz-adv-x="678" d="M405 673V26Q405 0 382 0H298Q274 0 274 26V673Q274 699 298 699H382Q405 699 405 673ZM95 514H222Q247 514 247 491V431Q247 406 222 406H95Q70 406 70 431V491Q70 514 95 514ZM458 514H584Q609
+514 609 491V431Q609 406 584 406H458Q432 406 432 431V491Q432 514 458 514Z" />
+<glyph unicode="&#x2021;" glyph-name="daggerdbl" horiz-adv-x="678" d="M405 673V26Q405 0 382 0H298Q274 0 274 26V673Q274 699 298 699H382Q405 699 405 673ZM95 514H222Q247 514 247 491V431Q247 406 222 406H95Q70 406 70 431V491Q70 514 95 514ZM458 514H584Q609
+514 609 491V431Q609 406 584 406H458Q432 406 432 431V491Q432 514 458 514ZM95 290H222Q247 290 247 266V207Q247 182 222 182H95Q70 182 70 207V266Q70 290 95 290ZM458 290H584Q609 290 609 266V207Q609 182 584 182H458Q432 182 432 207V266Q432 290 458 290Z"
+/>
+<glyph unicode="&#x2022;" glyph-name="bullet" horiz-adv-x="273" d="M203 344V199Q203 174 180 174H94Q70 174 70 199V344Q70 370 94 370H180Q203 370 203 344Z" />
+<glyph unicode="&#x2026;" glyph-name="ellipsis" horiz-adv-x="745" d="M192 106V25Q192 0 168 0H83Q58 0 58 25V106Q58 131 83 131H168Q192 131 192 106ZM687 106V25Q687 0 663 0H578Q553 0 553 25V106Q553 131 578 131H663Q687 131 687 106ZM440 106V25Q440
+0 416 0H331Q306 0 306 25V106Q306 131 331 131H416Q440 131 440 106Z" />
+<glyph unicode="&#x2030;" glyph-name="perthousand" horiz-adv-x="1234" d="M67 478V576Q67 688 223 688T379 576V478Q379 366 223 366T67 478ZM272 482V572Q272 602 223 602T174 572V482Q174 451 223 451T272 482ZM694 107V197Q694 227 646 227Q597 227 597
+197V107Q597 76 646 76Q694 76 694 107ZM490 102V200Q490 312 646 312T802 200V102Q802 -10 646 -10T490 102ZM1060 107V197Q1060 227 1011 227Q963 227 963 197V107Q963 76 1011 76Q1060 76 1060 107ZM855 102V200Q855 312 1012 312Q1167 312 1167 200V102Q1167
+-10 1012 -10Q855 -10 855 102ZM655 654L335 26Q322 0 299 0H229Q219 0 216 9T217 26L538 654Q551 680 574 680H643Q655 680 658 672T655 654Z" />
+<glyph unicode="&#x2039;" glyph-name="guilsinglleft" horiz-adv-x="363" d="M273 319L167 245L273 172Q299 154 299 137V54Q299 42 291 37T273 38L87 171Q64 188 64 205V286Q64 302 87 319L273 453Q283 460 291 455T299 437V354Q299 338 273 319Z" />
+<glyph unicode="&#x203a;" glyph-name="guilsinglright" horiz-adv-x="363" d="M196 245L90 319Q64 338 64 354V437Q64 450 72 455T90 453L276 319Q299 302 299 286V205Q299 188 276 171L90 38Q81 32 73 37T64 54V137Q64 154 90 172L196 245Z" />
+<glyph unicode="&#x20ac;" glyph-name="Euro" horiz-adv-x="660" d="M92 311H123V366H92Q67 366 67 390V425Q67 449 92 449H123V525Q123 596 177 642T358 688T538 642T593 525V477Q593 452 570 452H487Q462 452 462 477V501Q462 576 360 576Q259 576 259 501V449H357Q382
+449 382 425V390Q382 366 357 366H259V311H357Q382 311 382 288V253Q382 228 357 228H259V179Q259 104 360 104Q462 104 462 179V217Q462 242 487 242H570Q593 242 593 217V155Q593 84 539 38T358 -8T178 38T123 155V228H92Q67 228 67 253V288Q67 311 92 311Z"
+/>
+<glyph unicode="&#x2122;" glyph-name="trademark" horiz-adv-x="921" d="M851 659V293Q851 272 831 272H765Q745 272 745 293V477Q736 451 735 449L692 354Q682 334 665 334H618Q600 334 590 354L544 451Q539 462 534 482V293Q534 272 514 272H452Q431 272 431
+293V659Q431 680 452 680H514Q528 680 532 671L626 488L641 454Q648 473 655 486L746 671Q750 680 765 680H831Q851 680 851 659ZM91 680H365Q386 680 386 661V608Q386 588 365 588H284V293Q284 272 264 272H193Q173 272 173 293V588H91Q79 588 75 592T70 608V661Q70
+680 91 680Z" />
+</font>
+</defs>
+</svg>
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/ttf/style_169898.ttf b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/ttf/style_169898.ttf
new file mode 100644
index 00000000..9ac21e8c
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/ttf/style_169898.ttf differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/woff/style_169898.woff b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/woff/style_169898.woff
new file mode 100644
index 00000000..1ad3fbfb
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/demo/fonts/webfonts/geo-semibold/woff/style_169898.woff differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/images/kitchen_adventurer_caramel.jpg b/htmltest/sites/all/libraries/flexslider-version/demo/images/kitchen_adventurer_caramel.jpg
new file mode 100644
index 00000000..1d8d6952
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/demo/images/kitchen_adventurer_caramel.jpg differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/images/kitchen_adventurer_cheesecake_brownie.jpg b/htmltest/sites/all/libraries/flexslider-version/demo/images/kitchen_adventurer_cheesecake_brownie.jpg
new file mode 100644
index 00000000..2fee762c
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/demo/images/kitchen_adventurer_cheesecake_brownie.jpg differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/images/kitchen_adventurer_donut.jpg b/htmltest/sites/all/libraries/flexslider-version/demo/images/kitchen_adventurer_donut.jpg
new file mode 100644
index 00000000..dca3a6e5
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/demo/images/kitchen_adventurer_donut.jpg differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/images/kitchen_adventurer_lemon.jpg b/htmltest/sites/all/libraries/flexslider-version/demo/images/kitchen_adventurer_lemon.jpg
new file mode 100644
index 00000000..2f4bff80
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/demo/images/kitchen_adventurer_lemon.jpg differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/images/logo.png b/htmltest/sites/all/libraries/flexslider-version/demo/images/logo.png
new file mode 100644
index 00000000..6799033c
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/demo/images/logo.png differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/index.html b/htmltest/sites/all/libraries/flexslider-version/demo/index.html
new file mode 100644
index 00000000..34aa8d5b
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/index.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+<head>
+	<meta content="charset=utf-8">
+	<title>FlexSlider 2</title>
+	<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
+
+  <!-- Demo CSS -->
+	<link rel="stylesheet" href="css/demo.css" type="text/css" media="screen" />
+	<link rel="stylesheet" href="../flexslider.css" type="text/css" media="screen" />
+
+	<!-- Modernizr -->
+  <script src="js/modernizr.js"></script>
+
+</head>
+<body class="loading">
+
+  <div id="container" class="cf">
+    <header role="navigation">
+      <a class="logo" href="http://www.woothemes.com" title="WooThemes">
+        <img src="images/logo.png" alt="WooThemes" />
+	  </a>
+      <h1>FlexSlider 2</h1>
+      <h2>The best responsive slider. Period.</h2>
+      <a class="button green" href="https://github.com/woothemes/FlexSlider/zipball/master">Download Flexslider</a>
+      <h3 class="nav-header">Other Examples</h3>
+      <nav>
+        <ul>
+          <li class="active"><a href="demo">Basic Slider</a></li>
+          <li><a href="thumbnail-controlnav.html">Slider w/thumbnail controlNav pattern</a></li>
+          <li><a href="thumbnail-slider.html">Slider w/thumbnail slider</a></li>
+          <li><a href="basic-carousel.html">Basic Carousel</a></li>
+          <li><a href="carousel-min-max.html">Carousel with min and max ranges</a></li>
+          <li><a href="dynamic-carousel-min-max.html">Carousel with dynamic min/max ranges</a></li>
+          <li><a href="video.html">Video & the api (vimeo)</a></li>
+          <li><a href="video-wistia.html">Video & the api (wistia)</a></li>
+        </ul>
+      </nav>
+    </header>
+
+	<div id="main" role="main">
+      <section class="slider">
+        <div class="flexslider">
+          <ul class="slides">
+            <li>
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+          </ul>
+        </div>
+      </section>
+      <aside>
+        <div class="cf">
+          <h3>Basic Slider</h3>
+          <ul class="toggle cf">
+            <li class="js"><a href="#view-js">JS</a></li>
+            <li class="html"><a href="#view-html">HTML</a></li>
+          </ul>
+        </div>
+        <div id="view-js" class="code">
+          <pre class="brush: js; toolbar: false; gutter: false;">
+            // Can also be used with $(document).ready()
+            $(window).load(function() {
+              $('.flexslider').flexslider({
+                animation: "slide"
+              });
+            });
+          </pre>
+        </div>
+        <div id="view-html" class="code">
+          <pre class="brush: xml; toolbar: false; gutter: false;">
+            &lt;!-- Place somewhere in the &lt;body&gt; of your page -->
+            &lt;div class="flexslider">
+              &lt;ul class="slides">
+                &lt;li>
+                  &lt;img src="slide1.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide2.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide3.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide4.jpg" />
+                &lt;/li>
+              &lt;/ul>
+            &lt;/div>
+          </pre>
+        </div>
+      </aside>
+    </div>
+
+  </div>
+
+  <!-- jQuery -->
+  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
+  <script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.min.js">\x3C/script>')</script>
+
+  <!-- FlexSlider -->
+  <script defer src="../jquery.flexslider.js"></script>
+
+  <script type="text/javascript">
+    $(function(){
+      SyntaxHighlighter.all();
+    });
+    $(window).load(function(){
+      $('.flexslider').flexslider({
+        animation: "slide",
+        start: function(slider){
+          $('body').removeClass('loading');
+        }
+      });
+    });
+  </script>
+
+
+  <!-- Syntax Highlighter -->
+  <script type="text/javascript" src="js/shCore.js"></script>
+  <script type="text/javascript" src="js/shBrushXml.js"></script>
+  <script type="text/javascript" src="js/shBrushJScript.js"></script>
+
+  <!-- Optional FlexSlider Additions -->
+  <script src="js/jquery.easing.js"></script>
+  <script src="js/jquery.mousewheel.js"></script>
+  <script defer src="js/demo.js"></script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/js/demo.js b/htmltest/sites/all/libraries/flexslider-version/demo/js/demo.js
new file mode 100644
index 00000000..25eb3428
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/js/demo.js
@@ -0,0 +1,16 @@
+$(function(){
+  var toggles = $('.toggle a'),
+      codes = $('.code');
+  
+  toggles.on("click", function(event){
+    event.preventDefault();
+    var $this = $(this);
+    
+    if (!$this.hasClass("active")) {
+      toggles.removeClass("active");
+      $this.addClass("active");
+      codes.hide().filter(this.hash).show();
+    }
+  });
+  toggles.first().click();
+});
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/js/froogaloop.js b/htmltest/sites/all/libraries/flexslider-version/demo/js/froogaloop.js
new file mode 100644
index 00000000..a9c7d2d9
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/js/froogaloop.js
@@ -0,0 +1,4 @@
+var Froogaloop=function(){function e(c){return new e.fn.init(c)}function g(c,b,a){if(!a.contentWindow.postMessage)return!1;var d=a.getAttribute("src").split("?")[0],c=JSON.stringify({method:c,value:b});a.contentWindow.postMessage(c,d)}function i(c){var b,a;try{b=JSON.parse(c.data),a=b.event||b.method}catch(l){}"ready"==a&&!h&&(h=!0);if(c.origin!=j)return!1;var c=b.value,e=b.data,f=""===f?null:b.player_id;b=f?d[f][a]:d[a];a=[];if(!b)return!1;void 0!==c&&a.push(c);e&&a.push(e);f&&a.push(f);return 0<
+a.length?b.apply(null,a):b.call()}function k(c,b,a){a?(d[a]||(d[a]={}),d[a][c]=b):d[c]=b}var d={},h=!1,j="";e.fn=e.prototype={element:null,init:function(c){"string"===typeof c&&(c=document.getElementById(c));this.element=c;for(var c=this.element.getAttribute("src").split("/"),b="",a=0,d=c.length;a<d;a++){if(3>a)b+=c[a];else break;2>a&&(b+="/")}j=b;return this},api:function(c,b){if(!this.element||!c)return!1;var a=this.element,d=""!==a.id?a.id:null,e=!b||!b.constructor||!b.call||!b.apply?b:null,f=
+b&&b.constructor&&b.call&&b.apply?b:null;f&&k(c,f,d);g(c,e,a);return this},addEvent:function(c,b){if(!this.element)return!1;var a=this.element,d=""!==a.id?a.id:null;k(c,b,d);"ready"!=c?g("addEventListener",c,a):"ready"==c&&h&&b.call(null,d);return this},removeEvent:function(c){if(!this.element)return!1;var b=this.element,a;a:{if((a=""!==b.id?b.id:null)&&d[a]){if(!d[a][c]){a=!1;break a}d[a][c]=null}else{if(!d[c]){a=!1;break a}d[c]=null}a=!0}"ready"!=c&&a&&g("removeEventListener",c,b)}};e.fn.init.prototype=
+e.fn;window.addEventListener?window.addEventListener("message",i,!1):window.attachEvent("onmessage",i,!1);return window.Froogaloop=window.$f=e}();
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/js/jquery.easing.js b/htmltest/sites/all/libraries/flexslider-version/demo/js/jquery.easing.js
new file mode 100644
index 00000000..eea539ec
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/js/jquery.easing.js
@@ -0,0 +1,205 @@
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ * 
+ * Open source under the BSD License. 
+ * 
+ * Copyright Â© 2008 George McGinley Smith
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without modification, 
+ * are permitted provided that the following conditions are met:
+ * 
+ * Redistributions of source code must retain the above copyright notice, this list of 
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list 
+ * of conditions and the following disclaimer in the documentation and/or other materials 
+ * provided with the distribution.
+ * 
+ * Neither the name of the author nor the names of contributors may be used to endorse 
+ * or promote products derived from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
+ * OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+*/
+
+// t: current time, b: begInnIng value, c: change In value, d: duration
+jQuery.easing['jswing'] = jQuery.easing['swing'];
+
+jQuery.extend( jQuery.easing,
+{
+	def: 'easeOutQuad',
+	swing: function (x, t, b, c, d) {
+		//alert(jQuery.easing.default);
+		return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
+	},
+	easeInQuad: function (x, t, b, c, d) {
+		return c*(t/=d)*t + b;
+	},
+	easeOutQuad: function (x, t, b, c, d) {
+		return -c *(t/=d)*(t-2) + b;
+	},
+	easeInOutQuad: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t + b;
+		return -c/2 * ((--t)*(t-2) - 1) + b;
+	},
+	easeInCubic: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t + b;
+	},
+	easeOutCubic: function (x, t, b, c, d) {
+		return c*((t=t/d-1)*t*t + 1) + b;
+	},
+	easeInOutCubic: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t + b;
+		return c/2*((t-=2)*t*t + 2) + b;
+	},
+	easeInQuart: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t*t + b;
+	},
+	easeOutQuart: function (x, t, b, c, d) {
+		return -c * ((t=t/d-1)*t*t*t - 1) + b;
+	},
+	easeInOutQuart: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+		return -c/2 * ((t-=2)*t*t*t - 2) + b;
+	},
+	easeInQuint: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t*t*t + b;
+	},
+	easeOutQuint: function (x, t, b, c, d) {
+		return c*((t=t/d-1)*t*t*t*t + 1) + b;
+	},
+	easeInOutQuint: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+		return c/2*((t-=2)*t*t*t*t + 2) + b;
+	},
+	easeInSine: function (x, t, b, c, d) {
+		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+	},
+	easeOutSine: function (x, t, b, c, d) {
+		return c * Math.sin(t/d * (Math.PI/2)) + b;
+	},
+	easeInOutSine: function (x, t, b, c, d) {
+		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+	},
+	easeInExpo: function (x, t, b, c, d) {
+		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+	},
+	easeOutExpo: function (x, t, b, c, d) {
+		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+	},
+	easeInOutExpo: function (x, t, b, c, d) {
+		if (t==0) return b;
+		if (t==d) return b+c;
+		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+	},
+	easeInCirc: function (x, t, b, c, d) {
+		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+	},
+	easeOutCirc: function (x, t, b, c, d) {
+		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+	},
+	easeInOutCirc: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+	},
+	easeInElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+	},
+	easeOutElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+	},
+	easeInOutElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+	},
+	easeInBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		return c*(t/=d)*t*((s+1)*t - s) + b;
+	},
+	easeOutBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+	},
+	easeInOutBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158; 
+		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+	},
+	easeInBounce: function (x, t, b, c, d) {
+		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+	},
+	easeOutBounce: function (x, t, b, c, d) {
+		if ((t/=d) < (1/2.75)) {
+			return c*(7.5625*t*t) + b;
+		} else if (t < (2/2.75)) {
+			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+		} else if (t < (2.5/2.75)) {
+			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+		} else {
+			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+		}
+	},
+	easeInOutBounce: function (x, t, b, c, d) {
+		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
+		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+	}
+});
+
+/*
+ *
+ * TERMS OF USE - EASING EQUATIONS
+ * 
+ * Open source under the BSD License. 
+ * 
+ * Copyright Â© 2001 Robert Penner
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without modification, 
+ * are permitted provided that the following conditions are met:
+ * 
+ * Redistributions of source code must retain the above copyright notice, this list of 
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list 
+ * of conditions and the following disclaimer in the documentation and/or other materials 
+ * provided with the distribution.
+ * 
+ * Neither the name of the author nor the names of contributors may be used to endorse 
+ * or promote products derived from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
+ * OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/js/jquery.fitvid.js b/htmltest/sites/all/libraries/flexslider-version/demo/js/jquery.fitvid.js
new file mode 100644
index 00000000..49e6b85b
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/js/jquery.fitvid.js
@@ -0,0 +1,11 @@
+/*global jQuery */
+/*! 
+* FitVids 1.0
+*
+* Copyright 2011, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com
+* Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/
+* Released under the WTFPL license - http://sam.zoy.org/wtfpl/
+*
+* Date: Thu Sept 01 18:00:00 2011 -0500
+*/
+(function(a){a.fn.fitVids=function(b){var c={customSelector:null},d=document.createElement("div"),e=document.getElementsByTagName("base")[0]||document.getElementsByTagName("script")[0];return d.className="fit-vids-style",d.innerHTML="&shy;<style>               .fluid-width-video-wrapper {                 width: 100%;                              position: relative;                       padding: 0;                            }                                                                                   .fluid-width-video-wrapper iframe,        .fluid-width-video-wrapper object,        .fluid-width-video-wrapper embed {           position: absolute;                       top: 0;                                   left: 0;                                  width: 100%;                              height: 100%;                          }                                       </style>",e.parentNode.insertBefore(d,e),b&&a.extend(c,b),this.each(function(){var b=["iframe[src^='http://player.vimeo.com']","iframe[src^='http://www.youtube.com']","iframe[src^='https://www.youtube.com']","iframe[src^='http://www.kickstarter.com']","iframe[src^='http://fast.wistia.com']","object","embed"];c.customSelector&&b.push(c.customSelector);var d=a(this).find(b.join(","));d.each(function(){var b=a(this);if(this.tagName.toLowerCase()=="embed"&&b.parent("object").length||b.parent(".fluid-width-video-wrapper").length)return;var c=this.tagName.toLowerCase()=="object"?b.attr("height"):b.height(),d=c/b.width();if(!b.attr("id")){var e="fitvid"+Math.floor(Math.random()*999999);b.attr("id",e)}b.wrap('<div class="fluid-width-video-wrapper"></div>').parent(".fluid-width-video-wrapper").css("padding-top",d*100+"%"),b.removeAttr("height").removeAttr("width")})})}})(jQuery)
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/js/jquery.mousewheel.js b/htmltest/sites/all/libraries/flexslider-version/demo/js/jquery.mousewheel.js
new file mode 100644
index 00000000..f1d5f72f
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/js/jquery.mousewheel.js
@@ -0,0 +1,84 @@
+/*! Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net)
+ * Licensed under the MIT License (LICENSE.txt).
+ *
+ * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
+ * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
+ * Thanks to: Seamus Leahy for adding deltaX and deltaY
+ *
+ * Version: 3.0.6
+ * 
+ * Requires: 1.2.2+
+ */
+
+(function($) {
+
+var types = ['DOMMouseScroll', 'mousewheel'];
+
+if ($.event.fixHooks) {
+    for ( var i=types.length; i; ) {
+        $.event.fixHooks[ types[--i] ] = $.event.mouseHooks;
+    }
+}
+
+$.event.special.mousewheel = {
+    setup: function() {
+        if ( this.addEventListener ) {
+            for ( var i=types.length; i; ) {
+                this.addEventListener( types[--i], handler, false );
+            }
+        } else {
+            this.onmousewheel = handler;
+        }
+    },
+    
+    teardown: function() {
+        if ( this.removeEventListener ) {
+            for ( var i=types.length; i; ) {
+                this.removeEventListener( types[--i], handler, false );
+            }
+        } else {
+            this.onmousewheel = null;
+        }
+    }
+};
+
+$.fn.extend({
+    mousewheel: function(fn) {
+        return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
+    },
+    
+    unmousewheel: function(fn) {
+        return this.unbind("mousewheel", fn);
+    }
+});
+
+
+function handler(event) {
+    var orgEvent = event || window.event, args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true, deltaX = 0, deltaY = 0;
+    event = $.event.fix(orgEvent);
+    event.type = "mousewheel";
+    
+    // Old school scrollwheel delta
+    if ( orgEvent.wheelDelta ) { delta = orgEvent.wheelDelta/120; }
+    if ( orgEvent.detail     ) { delta = -orgEvent.detail/3; }
+    
+    // New school multidimensional scroll (touchpads) deltas
+    deltaY = delta;
+    
+    // Gecko
+    if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
+        deltaY = 0;
+        deltaX = -1*delta;
+    }
+    
+    // Webkit
+    if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY/120; }
+    if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = -1*orgEvent.wheelDeltaX/120; }
+    
+    // Add event and delta to the front of the arguments
+    args.unshift(event, delta, deltaX, deltaY);
+    
+    return ($.event.dispatch || $.event.handle).apply(this, args);
+}
+
+})(jQuery);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/js/modernizr.js b/htmltest/sites/all/libraries/flexslider-version/demo/js/modernizr.js
new file mode 100644
index 00000000..471dead0
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/js/modernizr.js
@@ -0,0 +1,2 @@
+/* Modernizr 2.0.6 (Custom Build) | MIT & BSD */
+;window.Modernizr=function(a,b,c){function D(a,b){var c=a.charAt(0).toUpperCase()+a.substr(1),d=(a+" "+o.join(c+" ")+c).split(" ");return C(d,b)}function C(a,b){for(var d in a)if(k[a[d]]!==c)return b=="pfx"?a[d]:!0;return!1}function B(a,b){return!!~(""+a).indexOf(b)}function A(a,b){return typeof a===b}function z(a,b){return y(n.join(a+";")+(b||""))}function y(a){k.cssText=a}var d="2.0.6",e={},f=!0,g=b.documentElement,h=b.head||b.getElementsByTagName("head")[0],i="modernizr",j=b.createElement(i),k=j.style,l,m=Object.prototype.toString,n=" -webkit- -moz- -o- -ms- -khtml- ".split(" "),o="Webkit Moz O ms Khtml".split(" "),p={},q={},r={},s=[],t=function(a,c,d,e){var f,h,j,k=b.createElement("div");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:i+(d+1),k.appendChild(j);f=["&shy;","<style>",a,"</style>"].join(""),k.id=i,k.innerHTML+=f,g.appendChild(k),h=c(k,a),k.parentNode.removeChild(k);return!!h},u=function(b){if(a.matchMedia)return matchMedia(b).matches;var c;t("@media "+b+" { #"+i+" { position: absolute; } }",function(b){c=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle).position=="absolute"});return c},v,w={}.hasOwnProperty,x;!A(w,c)&&!A(w.call,c)?x=function(a,b){return w.call(a,b)}:x=function(a,b){return b in a&&A(a.constructor.prototype[b],c)},p.rgba=function(){y("background-color:rgba(150,255,150,.5)");return B(k.backgroundColor,"rgba")},p.boxshadow=function(){return D("boxShadow")},p.csstransitions=function(){return D("transitionProperty")};for(var E in p)x(p,E)&&(v=E.toLowerCase(),e[v]=p[E](),s.push((e[v]?"":"no-")+v));e.addTest=function(a,b){if(typeof a=="object")for(var d in a)x(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return;b=typeof b=="boolean"?b:!!b(),g.className+=" "+(b?"":"no-")+a,e[a]=b}return e},y(""),j=l=null,a.attachEvent&&function(){var a=b.createElement("div");a.innerHTML="<elem></elem>";return a.childNodes.length!==1}()&&function(a,b){function s(a){var b=-1;while(++b<g)a.createElement(f[b])}a.iepp=a.iepp||{};var d=a.iepp,e=d.html5elements||"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",f=e.split("|"),g=f.length,h=new RegExp("(^|\\s)("+e+")","gi"),i=new RegExp("<(/*)("+e+")","gi"),j=/^\s*[\{\}]\s*$/,k=new RegExp("(^|[^\\n]*?\\s)("+e+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),l=b.createDocumentFragment(),m=b.documentElement,n=m.firstChild,o=b.createElement("body"),p=b.createElement("style"),q=/print|all/,r;d.getCSS=function(a,b){if(a+""===c)return"";var e=-1,f=a.length,g,h=[];while(++e<f){g=a[e];if(g.disabled)continue;b=g.media||b,q.test(b)&&h.push(d.getCSS(g.imports,b),g.cssText),b="all"}return h.join("")},d.parseCSS=function(a){var b=[],c;while((c=k.exec(a))!=null)b.push(((j.exec(c[1])?"\n":c[1])+c[2]+c[3]).replace(h,"$1.iepp_$2")+c[4]);return b.join("\n")},d.writeHTML=function(){var a=-1;r=r||b.body;while(++a<g){var c=b.getElementsByTagName(f[a]),d=c.length,e=-1;while(++e<d)c[e].className.indexOf("iepp_")<0&&(c[e].className+=" iepp_"+f[a])}l.appendChild(r),m.appendChild(o),o.className=r.className,o.id=r.id,o.innerHTML=r.innerHTML.replace(i,"<$1font")},d._beforePrint=function(){p.styleSheet.cssText=d.parseCSS(d.getCSS(b.styleSheets,"all")),d.writeHTML()},d.restoreHTML=function(){o.innerHTML="",m.removeChild(o),m.appendChild(r)},d._afterPrint=function(){d.restoreHTML(),p.styleSheet.cssText=""},s(b),s(l);d.disablePP||(n.insertBefore(p,n.firstChild),p.media="print",p.className="iepp-printshim",a.attachEvent("onbeforeprint",d._beforePrint),a.attachEvent("onafterprint",d._afterPrint))}(a,b),e._version=d,e._prefixes=n,e._domPrefixes=o,e.mq=u,e.testProp=function(a){return C([a])},e.testAllProps=D,e.testStyles=t,g.className=g.className.replace(/\bno-js\b/,"")+(f?" js "+s.join(" "):"");return e}(this,this.document),function(a,b){function u(){r(!0)}a.respond={},respond.update=function(){},respond.mediaQueriesSupported=b;if(!b){var c=a.document,d=c.documentElement,e=[],f=[],g=[],h={},i=30,j=c.getElementsByTagName("head")[0]||d,k=j.getElementsByTagName("link"),l=[],m=function(){var b=k,c=b.length,d=0,e,f,g,i;for(;d<c;d++)e=b[d],f=e.href,g=e.media,i=e.rel&&e.rel.toLowerCase()==="stylesheet",!!f&&i&&!h[f]&&(!/^([a-zA-Z]+?:(\/\/)?(www\.)?)/.test(f)||f.replace(RegExp.$1,"").split("/")[0]===a.location.host?l.push({href:f,media:g}):h[f]=!0);n()},n=function(){if(l.length){var a=l.shift();s(a.href,function(b){o(b,a.href,a.media),h[a.href]=!0,n()})}},o=function(a,b,c){var d=a.match(/@media[^\{]+\{([^\{\}]+\{[^\}\{]+\})+/gi),g=d&&d.length||0,b=b.substring(0,b.lastIndexOf("/")),h=function(a){return a.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+b+"$2$3")},i=!g&&c,j=0,k,l,m,n,o;b.length&&(b+="/"),i&&(g=1);for(;j<g;j++){k=0,i?(l=c,f.push(h(a))):(l=d[j].match(/@media ([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1,f.push(RegExp.$2&&h(RegExp.$2))),n=l.split(","),o=n.length;for(;k<o;k++)m=n[k],e.push({media:m.match(/(only\s+)?([a-zA-Z]+)(\sand)?/)&&RegExp.$2,rules:f.length-1,minw:m.match(/\(min\-width:[\s]*([\s]*[0-9]+)px[\s]*\)/)&&parseFloat(RegExp.$1),maxw:m.match(/\(max\-width:[\s]*([\s]*[0-9]+)px[\s]*\)/)&&parseFloat(RegExp.$1)})}r()},p,q,r=function(a){var b="clientWidth",h=d[b],l=c.compatMode==="CSS1Compat"&&h||c.body[b]||h,m={},n=c.createDocumentFragment(),o=k[k.length-1],s=(new Date).getTime();if(a&&p&&s-p<i)clearTimeout(q),q=setTimeout(r,i);else{p=s;for(var t in e){var u=e[t];if(!u.minw&&!u.maxw||(!u.minw||u.minw&&l>=u.minw)&&(!u.maxw||u.maxw&&l<=u.maxw))m[u.media]||(m[u.media]=[]),m[u.media].push(f[u.rules])}for(var t in g)g[t]&&g[t].parentNode===j&&j.removeChild(g[t]);for(var t in m){var v=c.createElement("style"),w=m[t].join("\n");v.type="text/css",v.media=t,v.styleSheet?v.styleSheet.cssText=w:v.appendChild(c.createTextNode(w)),n.appendChild(v),g.push(v)}j.insertBefore(n,o.nextSibling)}},s=function(a,b){var c=t();if(!!c){c.open("GET",a,!0),c.onreadystatechange=function(){c.readyState==4&&(c.status==200||c.status==304)&&b(c.responseText)};if(c.readyState==4)return;c.send()}},t=function(){var a=!1,b=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new XMLHttpRequest}],c=b.length;while(c--){try{a=b[c]()}catch(d){continue}break}return function(){return a}}();m(),respond.update=m,a.addEventListener?a.addEventListener("resize",u,!1):a.attachEvent&&a.attachEvent("onresize",u)}}(this,Modernizr.mq("only all")),function(a,b,c){function k(a){return!a||a=="loaded"||a=="complete"}function j(){var a=1,b=-1;while(p.length- ++b)if(p[b].s&&!(a=p[b].r))break;a&&g()}function i(a){var c=b.createElement("script"),d;c.src=a.s,c.onreadystatechange=c.onload=function(){!d&&k(c.readyState)&&(d=1,j(),c.onload=c.onreadystatechange=null)},m(function(){d||(d=1,j())},H.errorTimeout),a.e?c.onload():n.parentNode.insertBefore(c,n)}function h(a){var c=b.createElement("link"),d;c.href=a.s,c.rel="stylesheet",c.type="text/css";if(!a.e&&(w||r)){var e=function(a){m(function(){if(!d)try{a.sheet.cssRules.length?(d=1,j()):e(a)}catch(b){b.code==1e3||b.message=="security"||b.message=="denied"?(d=1,m(function(){j()},0)):e(a)}},0)};e(c)}else c.onload=function(){d||(d=1,m(function(){j()},0))},a.e&&c.onload();m(function(){d||(d=1,j())},H.errorTimeout),!a.e&&n.parentNode.insertBefore(c,n)}function g(){var a=p.shift();q=1,a?a.t?m(function(){a.t=="c"?h(a):i(a)},0):(a(),j()):q=0}function f(a,c,d,e,f,h){function i(){!o&&k(l.readyState)&&(r.r=o=1,!q&&j(),l.onload=l.onreadystatechange=null,m(function(){u.removeChild(l)},0))}var l=b.createElement(a),o=0,r={t:d,s:c,e:h};l.src=l.data=c,!s&&(l.style.display="none"),l.width=l.height="0",a!="object"&&(l.type=d),l.onload=l.onreadystatechange=i,a=="img"?l.onerror=i:a=="script"&&(l.onerror=function(){r.e=r.r=1,g()}),p.splice(e,0,r),u.insertBefore(l,s?null:n),m(function(){o||(u.removeChild(l),r.r=r.e=o=1,j())},H.errorTimeout)}function e(a,b,c){var d=b=="c"?z:y;q=0,b=b||"j",C(a)?f(d,a,b,this.i++,l,c):(p.splice(this.i++,0,a),p.length==1&&g());return this}function d(){var a=H;a.loader={load:e,i:0};return a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=r&&!s,u=s?l:n.parentNode,v=a.opera&&o.call(a.opera)=="[object Opera]",w="webkitAppearance"in l.style,x=w&&"async"in b.createElement("script"),y=r?"object":v||x?"img":"script",z=w?"img":y,A=Array.isArray||function(a){return o.call(a)=="[object Array]"},B=function(a){return Object(a)===a},C=function(a){return typeof a=="string"},D=function(a){return o.call(a)=="[object Function]"},E=[],F={},G,H;H=function(a){function f(a){var b=a.split("!"),c=E.length,d=b.pop(),e=b.length,f={url:d,origUrl:d,prefixes:b},g,h;for(h=0;h<e;h++)g=F[b[h]],g&&(f=g(f));for(h=0;h<c;h++)f=E[h](f);return f}function e(a,b,e,g,h){var i=f(a),j=i.autoCallback;if(!i.bypass){b&&(b=D(b)?b:b[a]||b[g]||b[a.split("/").pop().split("?")[0]]);if(i.instead)return i.instead(a,b,e,g,h);e.load(i.url,i.forceCSS||!i.forceJS&&/css$/.test(i.url)?"c":c,i.noexec),(D(b)||D(j))&&e.load(function(){d(),b&&b(i.origUrl,h,g),j&&j(i.origUrl,h,g)})}}function b(a,b){function c(a){if(C(a))e(a,h,b,0,d);else if(B(a))for(i in a)a.hasOwnProperty(i)&&e(a[i],h,b,i,d)}var d=!!a.test,f=d?a.yep:a.nope,g=a.load||a.both,h=a.callback,i;c(f),c(g),a.complete&&b.load(a.complete)}var g,h,i=this.yepnope.loader;if(C(a))e(a,0,i,0);else if(A(a))for(g=0;g<a.length;g++)h=a[g],C(h)?e(h,0,i,0):A(h)?H(h):B(h)&&b(h,i);else B(a)&&b(a,i)},H.addPrefix=function(a,b){F[a]=b},H.addFilter=function(a){E.push(a)},H.errorTimeout=1e4,b.readyState==null&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",G=function(){b.removeEventListener("DOMContentLoaded",G,0),b.readyState="complete"},0)),a.yepnope=d()}(this,this.document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/js/shBrushCss.js b/htmltest/sites/all/libraries/flexslider-version/demo/js/shBrushCss.js
new file mode 100644
index 00000000..4297a9a6
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/js/shBrushCss.js
@@ -0,0 +1,91 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ * 
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+	// CommonJS
+	typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+	function Brush()
+	{
+		function getKeywordsCSS(str)
+		{
+			return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b';
+		};
+	
+		function getValuesCSS(str)
+		{
+			return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b';
+		};
+
+		var keywords =	'ascent azimuth background-attachment background-color background-image background-position ' +
+						'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +
+						'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +
+						'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +
+						'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +
+						'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +
+						'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +
+						'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +
+						'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +
+						'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +
+						'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +
+						'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +
+						'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +
+						'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';
+
+		var values =	'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+
+						'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+
+						'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero default digits disc dotted double '+
+						'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+
+						'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+
+						'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+
+						'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+
+						'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+
+						'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+
+						'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+
+						'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+
+						'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+
+						'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+
+						'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';
+
+		var fonts =		'[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif';
+	
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,		css: 'comments' },	// multiline comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },	// double quoted strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },	// single quoted strings
+			{ regex: /\#[a-fA-F0-9]{3,6}/g,								css: 'value' },		// html colors
+			{ regex: /(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)/g,				css: 'value' },		// sizes
+			{ regex: /!important/g,										css: 'color3' },	// !important
+			{ regex: new RegExp(getKeywordsCSS(keywords), 'gm'),		css: 'keyword' },	// keywords
+			{ regex: new RegExp(getValuesCSS(values), 'g'),				css: 'value' },		// values
+			{ regex: new RegExp(this.getKeywords(fonts), 'g'),			css: 'color1' }		// fonts
+			];
+
+		this.forHtmlScript({ 
+			left: /(&lt;|<)\s*style.*?(&gt;|>)/gi, 
+			right: /(&lt;|<)\/\s*style\s*(&gt;|>)/gi 
+			});
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['css'];
+
+	SyntaxHighlighter.brushes.CSS = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/js/shBrushJScript.js b/htmltest/sites/all/libraries/flexslider-version/demo/js/shBrushJScript.js
new file mode 100644
index 00000000..ff98daba
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/js/shBrushJScript.js
@@ -0,0 +1,52 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ * 
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+	// CommonJS
+	typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+	function Brush()
+	{
+		var keywords =	'break case catch continue ' +
+						'default delete do else false  ' +
+						'for function if in instanceof ' +
+						'new null return super switch ' +
+						'this throw true try typeof var while with'
+						;
+
+		var r = SyntaxHighlighter.regexLib;
+		
+		this.regexList = [
+			{ regex: r.multiLineDoubleQuotedString,					css: 'string' },			// double quoted strings
+			{ regex: r.multiLineSingleQuotedString,					css: 'string' },			// single quoted strings
+			{ regex: r.singleLineCComments,							css: 'comments' },			// one line comments
+			{ regex: r.multiLineCComments,							css: 'comments' },			// multiline comments
+			{ regex: /\s*#.*/gm,									css: 'preprocessor' },		// preprocessor tags like #region and #endregion
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),	css: 'keyword' }			// keywords
+			];
+	
+		this.forHtmlScript(r.scriptScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['js', 'jscript', 'javascript'];
+
+	SyntaxHighlighter.brushes.JScript = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/js/shBrushXml.js b/htmltest/sites/all/libraries/flexslider-version/demo/js/shBrushXml.js
new file mode 100644
index 00000000..69d9fd0b
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/js/shBrushXml.js
@@ -0,0 +1,69 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ * 
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+	// CommonJS
+	typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+	function Brush()
+	{
+		function process(match, regexInfo)
+		{
+			var constructor = SyntaxHighlighter.Match,
+				code = match[0],
+				tag = new XRegExp('(&lt;|<)[\\s\\/\\?]*(?<name>[:\\w-\\.]+)', 'xg').exec(code),
+				result = []
+				;
+		
+			if (match.attributes != null) 
+			{
+				var attributes,
+					regex = new XRegExp('(?<name> [\\w:\\-\\.]+)' +
+										'\\s*=\\s*' +
+										'(?<value> ".*?"|\'.*?\'|\\w+)',
+										'xg');
+
+				while ((attributes = regex.exec(code)) != null) 
+				{
+					result.push(new constructor(attributes.name, match.index + attributes.index, 'color1'));
+					result.push(new constructor(attributes.value, match.index + attributes.index + attributes[0].indexOf(attributes.value), 'string'));
+				}
+			}
+
+			if (tag != null)
+				result.push(
+					new constructor(tag.name, match.index + tag[0].indexOf(tag.name), 'keyword')
+				);
+
+			return result;
+		}
+	
+		this.regexList = [
+			{ regex: new XRegExp('(\\&lt;|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](\\&gt;|>)', 'gm'),			css: 'color2' },	// <![ ... [ ... ]]>
+			{ regex: SyntaxHighlighter.regexLib.xmlComments,												css: 'comments' },	// <!-- ... -->
+			{ regex: new XRegExp('(&lt;|<)[\\s\\/\\?]*(\\w+)(?<attributes>.*?)[\\s\\/\\?]*(&gt;|>)', 'sg'), func: process }
+		];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['xml', 'xhtml', 'xslt', 'html'];
+
+	SyntaxHighlighter.brushes.Xml = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/js/shCore.js b/htmltest/sites/all/libraries/flexslider-version/demo/js/shCore.js
new file mode 100644
index 00000000..b47b6454
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/js/shCore.js
@@ -0,0 +1,17 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ * 
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('K M;I(M)1S 2U("2a\'t 4k M 4K 2g 3l 4G 4H");(6(){6 r(f,e){I(!M.1R(f))1S 3m("3s 15 4R");K a=f.1w;f=M(f.1m,t(f)+(e||""));I(a)f.1w={1m:a.1m,19:a.19?a.19.1a(0):N};H f}6 t(f){H(f.1J?"g":"")+(f.4s?"i":"")+(f.4p?"m":"")+(f.4v?"x":"")+(f.3n?"y":"")}6 B(f,e,a,b){K c=u.L,d,h,g;v=R;5K{O(;c--;){g=u[c];I(a&g.3r&&(!g.2p||g.2p.W(b))){g.2q.12=e;I((h=g.2q.X(f))&&h.P===e){d={3k:g.2b.W(b,h,a),1C:h};1N}}}}5v(i){1S i}5q{v=11}H d}6 p(f,e,a){I(3b.Z.1i)H f.1i(e,a);O(a=a||0;a<f.L;a++)I(f[a]===e)H a;H-1}M=6(f,e){K a=[],b=M.1B,c=0,d,h;I(M.1R(f)){I(e!==1d)1S 3m("2a\'t 5r 5I 5F 5B 5C 15 5E 5p");H r(f)}I(v)1S 2U("2a\'t W 3l M 59 5m 5g 5x 5i");e=e||"";O(d={2N:11,19:[],2K:6(g){H e.1i(g)>-1},3d:6(g){e+=g}};c<f.L;)I(h=B(f,c,b,d)){a.U(h.3k);c+=h.1C[0].L||1}Y I(h=n.X.W(z[b],f.1a(c))){a.U(h[0]);c+=h[0].L}Y{h=f.3a(c);I(h==="[")b=M.2I;Y I(h==="]")b=M.1B;a.U(h);c++}a=15(a.1K(""),n.Q.W(e,w,""));a.1w={1m:f,19:d.2N?d.19:N};H a};M.3v="1.5.0";M.2I=1;M.1B=2;K C=/\\$(?:(\\d\\d?|[$&`\'])|{([$\\w]+)})/g,w=/[^5h]+|([\\s\\S])(?=[\\s\\S]*\\1)/g,A=/^(?:[?*+]|{\\d+(?:,\\d*)?})\\??/,v=11,u=[],n={X:15.Z.X,1A:15.Z.1A,1C:1r.Z.1C,Q:1r.Z.Q,1e:1r.Z.1e},x=n.X.W(/()??/,"")[1]===1d,D=6(){K f=/^/g;n.1A.W(f,"");H!f.12}(),y=6(){K f=/x/g;n.Q.W("x",f,"");H!f.12}(),E=15.Z.3n!==1d,z={};z[M.2I]=/^(?:\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\29-26-f]{2}|u[\\29-26-f]{4}|c[A-3o-z]|[\\s\\S]))/;z[M.1B]=/^(?:\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\29-26-f]{2}|u[\\29-26-f]{4}|c[A-3o-z]|[\\s\\S])|\\(\\?[:=!]|[?*+]\\?|{\\d+(?:,\\d*)?}\\??)/;M.1h=6(f,e,a,b){u.U({2q:r(f,"g"+(E?"y":"")),2b:e,3r:a||M.1B,2p:b||N})};M.2n=6(f,e){K a=f+"/"+(e||"");H M.2n[a]||(M.2n[a]=M(f,e))};M.3c=6(f){H r(f,"g")};M.5l=6(f){H f.Q(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g,"\\\\$&")};M.5e=6(f,e,a,b){e=r(e,"g"+(b&&E?"y":""));e.12=a=a||0;f=e.X(f);H b?f&&f.P===a?f:N:f};M.3q=6(){M.1h=6(){1S 2U("2a\'t 55 1h 54 3q")}};M.1R=6(f){H 53.Z.1q.W(f)==="[2m 15]"};M.3p=6(f,e,a,b){O(K c=r(e,"g"),d=-1,h;h=c.X(f);){a.W(b,h,++d,f,c);c.12===h.P&&c.12++}I(e.1J)e.12=0};M.57=6(f,e){H 6 a(b,c){K d=e[c].1I?e[c]:{1I:e[c]},h=r(d.1I,"g"),g=[],i;O(i=0;i<b.L;i++)M.3p(b[i],h,6(k){g.U(d.3j?k[d.3j]||"":k[0])});H c===e.L-1||!g.L?g:a(g,c+1)}([f],0)};15.Z.1p=6(f,e){H J.X(e[0])};15.Z.W=6(f,e){H J.X(e)};15.Z.X=6(f){K e=n.X.1p(J,14),a;I(e){I(!x&&e.L>1&&p(e,"")>-1){a=15(J.1m,n.Q.W(t(J),"g",""));n.Q.W(f.1a(e.P),a,6(){O(K c=1;c<14.L-2;c++)I(14[c]===1d)e[c]=1d})}I(J.1w&&J.1w.19)O(K b=1;b<e.L;b++)I(a=J.1w.19[b-1])e[a]=e[b];!D&&J.1J&&!e[0].L&&J.12>e.P&&J.12--}H e};I(!D)15.Z.1A=6(f){(f=n.X.W(J,f))&&J.1J&&!f[0].L&&J.12>f.P&&J.12--;H!!f};1r.Z.1C=6(f){M.1R(f)||(f=15(f));I(f.1J){K e=n.1C.1p(J,14);f.12=0;H e}H f.X(J)};1r.Z.Q=6(f,e){K a=M.1R(f),b,c;I(a&&1j e.58()==="3f"&&e.1i("${")===-1&&y)H n.Q.1p(J,14);I(a){I(f.1w)b=f.1w.19}Y f+="";I(1j e==="6")c=n.Q.W(J,f,6(){I(b){14[0]=1f 1r(14[0]);O(K d=0;d<b.L;d++)I(b[d])14[0][b[d]]=14[d+1]}I(a&&f.1J)f.12=14[14.L-2]+14[0].L;H e.1p(N,14)});Y{c=J+"";c=n.Q.W(c,f,6(){K d=14;H n.Q.W(e,C,6(h,g,i){I(g)5b(g){24"$":H"$";24"&":H d[0];24"`":H d[d.L-1].1a(0,d[d.L-2]);24"\'":H d[d.L-1].1a(d[d.L-2]+d[0].L);5a:i="";g=+g;I(!g)H h;O(;g>d.L-3;){i=1r.Z.1a.W(g,-1)+i;g=1Q.3i(g/10)}H(g?d[g]||"":"$")+i}Y{g=+i;I(g<=d.L-3)H d[g];g=b?p(b,i):-1;H g>-1?d[g+1]:h}})})}I(a&&f.1J)f.12=0;H c};1r.Z.1e=6(f,e){I(!M.1R(f))H n.1e.1p(J,14);K a=J+"",b=[],c=0,d,h;I(e===1d||+e<0)e=5D;Y{e=1Q.3i(+e);I(!e)H[]}O(f=M.3c(f);d=f.X(a);){I(f.12>c){b.U(a.1a(c,d.P));d.L>1&&d.P<a.L&&3b.Z.U.1p(b,d.1a(1));h=d[0].L;c=f.12;I(b.L>=e)1N}f.12===d.P&&f.12++}I(c===a.L){I(!n.1A.W(f,"")||h)b.U("")}Y b.U(a.1a(c));H b.L>e?b.1a(0,e):b};M.1h(/\\(\\?#[^)]*\\)/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"});M.1h(/\\((?!\\?)/,6(){J.19.U(N);H"("});M.1h(/\\(\\?<([$\\w]+)>/,6(f){J.19.U(f[1]);J.2N=R;H"("});M.1h(/\\\\k<([\\w$]+)>/,6(f){K e=p(J.19,f[1]);H e>-1?"\\\\"+(e+1)+(3R(f.2S.3a(f.P+f[0].L))?"":"(?:)"):f[0]});M.1h(/\\[\\^?]/,6(f){H f[0]==="[]"?"\\\\b\\\\B":"[\\\\s\\\\S]"});M.1h(/^\\(\\?([5A]+)\\)/,6(f){J.3d(f[1]);H""});M.1h(/(?:\\s+|#.*)+/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"},M.1B,6(){H J.2K("x")});M.1h(/\\./,6(){H"[\\\\s\\\\S]"},M.1B,6(){H J.2K("s")})})();1j 2e!="1d"&&(2e.M=M);K 1v=6(){6 r(a,b){a.1l.1i(b)!=-1||(a.1l+=" "+b)}6 t(a){H a.1i("3e")==0?a:"3e"+a}6 B(a){H e.1Y.2A[t(a)]}6 p(a,b,c){I(a==N)H N;K d=c!=R?a.3G:[a.2G],h={"#":"1c",".":"1l"}[b.1o(0,1)]||"3h",g,i;g=h!="3h"?b.1o(1):b.5u();I((a[h]||"").1i(g)!=-1)H a;O(a=0;d&&a<d.L&&i==N;a++)i=p(d[a],b,c);H i}6 C(a,b){K c={},d;O(d 2g a)c[d]=a[d];O(d 2g b)c[d]=b[d];H c}6 w(a,b,c,d){6 h(g){g=g||1P.5y;I(!g.1F){g.1F=g.52;g.3N=6(){J.5w=11}}c.W(d||1P,g)}a.3g?a.3g("4U"+b,h):a.4y(b,h,11)}6 A(a,b){K c=e.1Y.2j,d=N;I(c==N){c={};O(K h 2g e.1U){K g=e.1U[h];d=g.4x;I(d!=N){g.1V=h.4w();O(g=0;g<d.L;g++)c[d[g]]=h}}e.1Y.2j=c}d=e.1U[c[a]];d==N&&b!=11&&1P.1X(e.13.1x.1X+(e.13.1x.3E+a));H d}6 v(a,b){O(K c=a.1e("\\n"),d=0;d<c.L;d++)c[d]=b(c[d],d);H c.1K("\\n")}6 u(a,b){I(a==N||a.L==0||a=="\\n")H a;a=a.Q(/</g,"&1y;");a=a.Q(/ {2,}/g,6(c){O(K d="",h=0;h<c.L-1;h++)d+=e.13.1W;H d+" "});I(b!=N)a=v(a,6(c){I(c.L==0)H"";K d="";c=c.Q(/^(&2s;| )+/,6(h){d=h;H""});I(c.L==0)H d;H d+\'<17 1g="\'+b+\'">\'+c+"</17>"});H a}6 n(a,b){a.1e("\\n");O(K c="",d=0;d<50;d++)c+="                    ";H a=v(a,6(h){I(h.1i("\\t")==-1)H h;O(K g=0;(g=h.1i("\\t"))!=-1;)h=h.1o(0,g)+c.1o(0,b-g%b)+h.1o(g+1,h.L);H h})}6 x(a){H a.Q(/^\\s+|\\s+$/g,"")}6 D(a,b){I(a.P<b.P)H-1;Y I(a.P>b.P)H 1;Y I(a.L<b.L)H-1;Y I(a.L>b.L)H 1;H 0}6 y(a,b){6 c(k){H k[0]}O(K d=N,h=[],g=b.2D?b.2D:c;(d=b.1I.X(a))!=N;){K i=g(d,b);I(1j i=="3f")i=[1f e.2L(i,d.P,b.23)];h=h.1O(i)}H h}6 E(a){K b=/(.*)((&1G;|&1y;).*)/;H a.Q(e.3A.3M,6(c){K d="",h=N;I(h=b.X(c)){c=h[1];d=h[2]}H\'<a 2h="\'+c+\'">\'+c+"</a>"+d})}6 z(){O(K a=1E.36("1k"),b=[],c=0;c<a.L;c++)a[c].3s=="20"&&b.U(a[c]);H b}6 f(a){a=a.1F;K b=p(a,".20",R);a=p(a,".3O",R);K c=1E.4i("3t");I(!(!a||!b||p(a,"3t"))){B(b.1c);r(b,"1m");O(K d=a.3G,h=[],g=0;g<d.L;g++)h.U(d[g].4z||d[g].4A);h=h.1K("\\r");c.39(1E.4D(h));a.39(c);c.2C();c.4C();w(c,"4u",6(){c.2G.4E(c);b.1l=b.1l.Q("1m","")})}}I(1j 3F!="1d"&&1j M=="1d")M=3F("M").M;K e={2v:{"1g-27":"","2i-1s":1,"2z-1s-2t":11,1M:N,1t:N,"42-45":R,"43-22":4,1u:R,16:R,"3V-17":R,2l:11,"41-40":R,2k:11,"1z-1k":11},13:{1W:"&2s;",2M:R,46:11,44:11,34:"4n",1x:{21:"4o 1m",2P:"?",1X:"1v\\n\\n",3E:"4r\'t 4t 1D O: ",4g:"4m 4B\'t 51 O 1z-1k 4F: ",37:\'<!4T 1z 4S "-//4V//3H 4W 1.0 4Z//4Y" "1Z://2y.3L.3K/4X/3I/3H/3I-4P.4J"><1z 4I="1Z://2y.3L.3K/4L/5L"><3J><4N 1Z-4M="5G-5M" 6K="2O/1z; 6J=6I-8" /><1t>6L 1v</1t></3J><3B 1L="25-6M:6Q,6P,6O,6N-6F;6y-2f:#6x;2f:#6w;25-22:6v;2O-3D:3C;"><T 1L="2O-3D:3C;3w-32:1.6z;"><T 1L="25-22:6A-6E;">1v</T><T 1L="25-22:.6C;3w-6B:6R;"><T>3v 3.0.76 (72 73 3x)</T><T><a 2h="1Z://3u.2w/1v" 1F="38" 1L="2f:#3y">1Z://3u.2w/1v</a></T><T>70 17 6U 71.</T><T>6T 6X-3x 6Y 6D.</T></T><T>6t 61 60 J 1k, 5Z <a 2h="6u://2y.62.2w/63-66/65?64=5X-5W&5P=5O" 1L="2f:#3y">5R</a> 5V <2R/>5U 5T 5S!</T></T></3B></1z>\'}},1Y:{2j:N,2A:{}},1U:{},3A:{6n:/\\/\\*[\\s\\S]*?\\*\\//2c,6m:/\\/\\/.*$/2c,6l:/#.*$/2c,6k:/"([^\\\\"\\n]|\\\\.)*"/g,6o:/\'([^\\\\\'\\n]|\\\\.)*\'/g,6p:1f M(\'"([^\\\\\\\\"]|\\\\\\\\.)*"\',"3z"),6s:1f M("\'([^\\\\\\\\\']|\\\\\\\\.)*\'","3z"),6q:/(&1y;|<)!--[\\s\\S]*?--(&1G;|>)/2c,3M:/\\w+:\\/\\/[\\w-.\\/?%&=:@;]*/g,6a:{18:/(&1y;|<)\\?=?/g,1b:/\\?(&1G;|>)/g},69:{18:/(&1y;|<)%=?/g,1b:/%(&1G;|>)/g},6d:{18:/(&1y;|<)\\s*1k.*?(&1G;|>)/2T,1b:/(&1y;|<)\\/\\s*1k\\s*(&1G;|>)/2T}},16:{1H:6(a){6 b(i,k){H e.16.2o(i,k,e.13.1x[k])}O(K c=\'<T 1g="16">\',d=e.16.2x,h=d.2X,g=0;g<h.L;g++)c+=(d[h[g]].1H||b)(a,h[g]);c+="</T>";H c},2o:6(a,b,c){H\'<2W><a 2h="#" 1g="6e 6h\'+b+" "+b+\'">\'+c+"</a></2W>"},2b:6(a){K b=a.1F,c=b.1l||"";b=B(p(b,".20",R).1c);K d=6(h){H(h=15(h+"6f(\\\\w+)").X(c))?h[1]:N}("6g");b&&d&&e.16.2x[d].2B(b);a.3N()},2x:{2X:["21","2P"],21:{1H:6(a){I(a.V("2l")!=R)H"";K b=a.V("1t");H e.16.2o(a,"21",b?b:e.13.1x.21)},2B:6(a){a=1E.6j(t(a.1c));a.1l=a.1l.Q("47","")}},2P:{2B:6(){K a="68=0";a+=", 18="+(31.30-33)/2+", 32="+(31.2Z-2Y)/2+", 30=33, 2Z=2Y";a=a.Q(/^,/,"");a=1P.6Z("","38",a);a.2C();K b=a.1E;b.6W(e.13.1x.37);b.6V();a.2C()}}}},35:6(a,b){K c;I(b)c=[b];Y{c=1E.36(e.13.34);O(K d=[],h=0;h<c.L;h++)d.U(c[h]);c=d}c=c;d=[];I(e.13.2M)c=c.1O(z());I(c.L===0)H d;O(h=0;h<c.L;h++){O(K g=c[h],i=a,k=c[h].1l,j=3W 0,l={},m=1f M("^\\\\[(?<2V>(.*?))\\\\]$"),s=1f M("(?<27>[\\\\w-]+)\\\\s*:\\\\s*(?<1T>[\\\\w-%#]+|\\\\[.*?\\\\]|\\".*?\\"|\'.*?\')\\\\s*;?","g");(j=s.X(k))!=N;){K o=j.1T.Q(/^[\'"]|[\'"]$/g,"");I(o!=N&&m.1A(o)){o=m.X(o);o=o.2V.L>0?o.2V.1e(/\\s*,\\s*/):[]}l[j.27]=o}g={1F:g,1n:C(i,l)};g.1n.1D!=N&&d.U(g)}H d},1M:6(a,b){K c=J.35(a,b),d=N,h=e.13;I(c.L!==0)O(K g=0;g<c.L;g++){b=c[g];K i=b.1F,k=b.1n,j=k.1D,l;I(j!=N){I(k["1z-1k"]=="R"||e.2v["1z-1k"]==R){d=1f e.4l(j);j="4O"}Y I(d=A(j))d=1f d;Y 6H;l=i.3X;I(h.2M){l=l;K m=x(l),s=11;I(m.1i("<![6G[")==0){m=m.4h(9);s=R}K o=m.L;I(m.1i("]]\\>")==o-3){m=m.4h(0,o-3);s=R}l=s?m:l}I((i.1t||"")!="")k.1t=i.1t;k.1D=j;d.2Q(k);b=d.2F(l);I((i.1c||"")!="")b.1c=i.1c;i.2G.74(b,i)}}},2E:6(a){w(1P,"4k",6(){e.1M(a)})}};e.2E=e.2E;e.1M=e.1M;e.2L=6(a,b,c){J.1T=a;J.P=b;J.L=a.L;J.23=c;J.1V=N};e.2L.Z.1q=6(){H J.1T};e.4l=6(a){6 b(j,l){O(K m=0;m<j.L;m++)j[m].P+=l}K c=A(a),d,h=1f e.1U.5Y,g=J,i="2F 1H 2Q".1e(" ");I(c!=N){d=1f c;O(K k=0;k<i.L;k++)(6(){K j=i[k];g[j]=6(){H h[j].1p(h,14)}})();d.28==N?1P.1X(e.13.1x.1X+(e.13.1x.4g+a)):h.2J.U({1I:d.28.17,2D:6(j){O(K l=j.17,m=[],s=d.2J,o=j.P+j.18.L,F=d.28,q,G=0;G<s.L;G++){q=y(l,s[G]);b(q,o);m=m.1O(q)}I(F.18!=N&&j.18!=N){q=y(j.18,F.18);b(q,j.P);m=m.1O(q)}I(F.1b!=N&&j.1b!=N){q=y(j.1b,F.1b);b(q,j.P+j[0].5Q(j.1b));m=m.1O(q)}O(j=0;j<m.L;j++)m[j].1V=c.1V;H m}})}};e.4j=6(){};e.4j.Z={V:6(a,b){K c=J.1n[a];c=c==N?b:c;K d={"R":R,"11":11}[c];H d==N?c:d},3Y:6(a){H 1E.4i(a)},4c:6(a,b){K c=[];I(a!=N)O(K d=0;d<a.L;d++)I(1j a[d]=="2m")c=c.1O(y(b,a[d]));H J.4e(c.6b(D))},4e:6(a){O(K b=0;b<a.L;b++)I(a[b]!==N)O(K c=a[b],d=c.P+c.L,h=b+1;h<a.L&&a[b]!==N;h++){K g=a[h];I(g!==N)I(g.P>d)1N;Y I(g.P==c.P&&g.L>c.L)a[b]=N;Y I(g.P>=c.P&&g.P<d)a[h]=N}H a},4d:6(a){K b=[],c=2u(J.V("2i-1s"));v(a,6(d,h){b.U(h+c)});H b},3U:6(a){K b=J.V("1M",[]);I(1j b!="2m"&&b.U==N)b=[b];a:{a=a.1q();K c=3W 0;O(c=c=1Q.6c(c||0,0);c<b.L;c++)I(b[c]==a){b=c;1N a}b=-1}H b!=-1},2r:6(a,b,c){a=["1s","6i"+b,"P"+a,"6r"+(b%2==0?1:2).1q()];J.3U(b)&&a.U("67");b==0&&a.U("1N");H\'<T 1g="\'+a.1K(" ")+\'">\'+c+"</T>"},3Q:6(a,b){K c="",d=a.1e("\\n").L,h=2u(J.V("2i-1s")),g=J.V("2z-1s-2t");I(g==R)g=(h+d-1).1q().L;Y I(3R(g)==R)g=0;O(K i=0;i<d;i++){K k=b?b[i]:h+i,j;I(k==0)j=e.13.1W;Y{j=g;O(K l=k.1q();l.L<j;)l="0"+l;j=l}a=j;c+=J.2r(i,k,a)}H c},49:6(a,b){a=x(a);K c=a.1e("\\n");J.V("2z-1s-2t");K d=2u(J.V("2i-1s"));a="";O(K h=J.V("1D"),g=0;g<c.L;g++){K i=c[g],k=/^(&2s;|\\s)+/.X(i),j=N,l=b?b[g]:d+g;I(k!=N){j=k[0].1q();i=i.1o(j.L);j=j.Q(" ",e.13.1W)}i=x(i);I(i.L==0)i=e.13.1W;a+=J.2r(g,l,(j!=N?\'<17 1g="\'+h+\' 5N">\'+j+"</17>":"")+i)}H a},4f:6(a){H a?"<4a>"+a+"</4a>":""},4b:6(a,b){6 c(l){H(l=l?l.1V||g:g)?l+" ":""}O(K d=0,h="",g=J.V("1D",""),i=0;i<b.L;i++){K k=b[i],j;I(!(k===N||k.L===0)){j=c(k);h+=u(a.1o(d,k.P-d),j+"48")+u(k.1T,j+k.23);d=k.P+k.L+(k.75||0)}}h+=u(a.1o(d),c()+"48");H h},1H:6(a){K b="",c=["20"],d;I(J.V("2k")==R)J.1n.16=J.1n.1u=11;1l="20";J.V("2l")==R&&c.U("47");I((1u=J.V("1u"))==11)c.U("6S");c.U(J.V("1g-27"));c.U(J.V("1D"));a=a.Q(/^[ ]*[\\n]+|[\\n]*[ ]*$/g,"").Q(/\\r/g," ");b=J.V("43-22");I(J.V("42-45")==R)a=n(a,b);Y{O(K h="",g=0;g<b;g++)h+=" ";a=a.Q(/\\t/g,h)}a=a;a:{b=a=a;h=/<2R\\s*\\/?>|&1y;2R\\s*\\/?&1G;/2T;I(e.13.46==R)b=b.Q(h,"\\n");I(e.13.44==R)b=b.Q(h,"");b=b.1e("\\n");h=/^\\s*/;g=4Q;O(K i=0;i<b.L&&g>0;i++){K k=b[i];I(x(k).L!=0){k=h.X(k);I(k==N){a=a;1N a}g=1Q.4q(k[0].L,g)}}I(g>0)O(i=0;i<b.L;i++)b[i]=b[i].1o(g);a=b.1K("\\n")}I(1u)d=J.4d(a);b=J.4c(J.2J,a);b=J.4b(a,b);b=J.49(b,d);I(J.V("41-40"))b=E(b);1j 2H!="1d"&&2H.3S&&2H.3S.1C(/5s/)&&c.U("5t");H b=\'<T 1c="\'+t(J.1c)+\'" 1g="\'+c.1K(" ")+\'">\'+(J.V("16")?e.16.1H(J):"")+\'<3Z 5z="0" 5H="0" 5J="0">\'+J.4f(J.V("1t"))+"<3T><3P>"+(1u?\'<2d 1g="1u">\'+J.3Q(a)+"</2d>":"")+\'<2d 1g="17"><T 1g="3O">\'+b+"</T></2d></3P></3T></3Z></T>"},2F:6(a){I(a===N)a="";J.17=a;K b=J.3Y("T");b.3X=J.1H(a);J.V("16")&&w(p(b,".16"),"5c",e.16.2b);J.V("3V-17")&&w(p(b,".17"),"56",f);H b},2Q:6(a){J.1c=""+1Q.5d(1Q.5n()*5k).1q();e.1Y.2A[t(J.1c)]=J;J.1n=C(e.2v,a||{});I(J.V("2k")==R)J.1n.16=J.1n.1u=11},5j:6(a){a=a.Q(/^\\s+|\\s+$/g,"").Q(/\\s+/g,"|");H"\\\\b(?:"+a+")\\\\b"},5f:6(a){J.28={18:{1I:a.18,23:"1k"},1b:{1I:a.1b,23:"1k"},17:1f M("(?<18>"+a.18.1m+")(?<17>.*?)(?<1b>"+a.1b.1m+")","5o")}}};H e}();1j 2e!="1d"&&(2e.1v=1v);',62,441,'||||||function|||||||||||||||||||||||||||||||||||||return|if|this|var|length|XRegExp|null|for|index|replace|true||div|push|getParam|call|exec|else|prototype||false|lastIndex|config|arguments|RegExp|toolbar|code|left|captureNames|slice|right|id|undefined|split|new|class|addToken|indexOf|typeof|script|className|source|params|substr|apply|toString|String|line|title|gutter|SyntaxHighlighter|_xregexp|strings|lt|html|test|OUTSIDE_CLASS|match|brush|document|target|gt|getHtml|regex|global|join|style|highlight|break|concat|window|Math|isRegExp|throw|value|brushes|brushName|space|alert|vars|http|syntaxhighlighter|expandSource|size|css|case|font|Fa|name|htmlScript|dA|can|handler|gm|td|exports|color|in|href|first|discoveredBrushes|light|collapse|object|cache|getButtonHtml|trigger|pattern|getLineHtml|nbsp|numbers|parseInt|defaults|com|items|www|pad|highlighters|execute|focus|func|all|getDiv|parentNode|navigator|INSIDE_CLASS|regexList|hasFlag|Match|useScriptTags|hasNamedCapture|text|help|init|br|input|gi|Error|values|span|list|250|height|width|screen|top|500|tagName|findElements|getElementsByTagName|aboutDialog|_blank|appendChild|charAt|Array|copyAsGlobal|setFlag|highlighter_|string|attachEvent|nodeName|floor|backref|output|the|TypeError|sticky|Za|iterate|freezeTokens|scope|type|textarea|alexgorbatchev|version|margin|2010|005896|gs|regexLib|body|center|align|noBrush|require|childNodes|DTD|xhtml1|head|org|w3|url|preventDefault|container|tr|getLineNumbersHtml|isNaN|userAgent|tbody|isLineHighlighted|quick|void|innerHTML|create|table|links|auto|smart|tab|stripBrs|tabs|bloggerMode|collapsed|plain|getCodeLinesHtml|caption|getMatchesHtml|findMatches|figureOutLineNumbers|removeNestedMatches|getTitleHtml|brushNotHtmlScript|substring|createElement|Highlighter|load|HtmlScript|Brush|pre|expand|multiline|min|Can|ignoreCase|find|blur|extended|toLowerCase|aliases|addEventListener|innerText|textContent|wasn|select|createTextNode|removeChild|option|same|frame|xmlns|dtd|twice|1999|equiv|meta|htmlscript|transitional|1E3|expected|PUBLIC|DOCTYPE|on|W3C|XHTML|TR|EN|Transitional||configured|srcElement|Object|after|run|dblclick|matchChain|valueOf|constructor|default|switch|click|round|execAt|forHtmlScript|token|gimy|functions|getKeywords|1E6|escape|within|random|sgi|another|finally|supply|MSIE|ie|toUpperCase|catch|returnValue|definition|event|border|imsx|constructing|one|Infinity|from|when|Content|cellpadding|flags|cellspacing|try|xhtml|Type|spaces|2930402|hosted_button_id|lastIndexOf|donate|active|development|keep|to|xclick|_s|Xml|please|like|you|paypal|cgi|cmd|webscr|bin|highlighted|scrollbars|aspScriptTags|phpScriptTags|sort|max|scriptScriptTags|toolbar_item|_|command|command_|number|getElementById|doubleQuotedString|singleLinePerlComments|singleLineCComments|multiLineCComments|singleQuotedString|multiLineDoubleQuotedString|xmlComments|alt|multiLineSingleQuotedString|If|https|1em|000|fff|background|5em|xx|bottom|75em|Gorbatchev|large|serif|CDATA|continue|utf|charset|content|About|family|sans|Helvetica|Arial|Geneva|3em|nogutter|Copyright|syntax|close|write|2004|Alex|open|JavaScript|highlighter|July|02|replaceChild|offset|83'.split('|'),0,{}))
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/thumbnail-controlnav.html b/htmltest/sites/all/libraries/flexslider-version/demo/thumbnail-controlnav.html
new file mode 100644
index 00000000..a4877a7e
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/thumbnail-controlnav.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+<head>
+	<meta content="charset=utf-8">
+	<title>FlexSlider 2</title>
+	<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
+
+  <!-- Demo CSS -->
+	<link rel="stylesheet" href="css/demo.css" type="text/css" media="screen" />
+	<link rel="stylesheet" href="../flexslider.css" type="text/css" media="screen" />
+
+	<!-- Modernizr -->
+  <script src="js/modernizr.js"></script>
+
+</head>
+<body class="loading">
+
+  <div id="container" class="cf">
+    <header role="navigation">
+      <a class="logo" href="http://www.woothemes.com" title="WooThemes">
+        <img src="images/logo.png" alt="WooThemes" />
+	  </a>
+      <h1>FlexSlider 2</h1>
+      <h2>The best responsive slider. Period.</h2>
+      <a class="button green" href="https://github.com/woothemes/FlexSlider/zipball/master">Download Flexslider</a>
+      <h3 class="nav-header">Other Examples</h3>
+      <nav>
+        <ul>
+          <li><a href="index.html">Basic Slider</a></li>
+          <li class="active"><a href="thumbnail-controlnav.html">Slider w/thumbnail controlNav pattern</a></li>
+          <li><a href="thumbnail-slider.html">Slider w/thumbnail slider</a></li>
+          <li><a href="basic-carousel.html">Basic Carousel</a></li>
+          <li><a href="carousel-min-max.html">Carousel with min and max ranges</a></li>
+          <li><a href="dynamic-carousel-min-max.html">Carousel with dynamic min/max ranges</a></li>
+          <li><a href="video.html">Video & the api (vimeo)</a></li>
+          <li><a href="video-wistia.html">Video & the api (wistia)</a></li>
+        </ul>
+      </nav>
+    </header>
+
+	<div id="main" role="main">
+      <section class="slider">
+        <div class="flexslider">
+          <ul class="slides">
+            <li data-thumb="images/kitchen_adventurer_cheesecake_brownie.jpg">
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li data-thumb="images/kitchen_adventurer_lemon.jpg">
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li data-thumb="images/kitchen_adventurer_donut.jpg">
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li data-thumb="images/kitchen_adventurer_caramel.jpg">
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+          </ul>
+        </div>
+      </section>
+      <aside>
+        <div class="cf">
+          <h3>Thumbnail ControlNav Pattern</h3>
+          <ul class="toggle cf">
+            <li class="js"><a href="#view-js">JS</a></li>
+            <li class="html"><a href="#view-html">HTML</a></li>
+          </ul>
+        </div>
+        <div id="view-js" class="code">
+          <pre class="brush: js; toolbar: false; gutter: false;">
+            // Can also be used with $(document).ready()
+            $(window).load(function() {
+              $('.flexslider').flexslider({
+                animation: "slide",
+                controlNav: "thumbnails"
+              });
+            });
+          </pre>
+        </div>
+        <div id="view-html" class="code">
+          <pre class="brush: xml; toolbar: false; gutter: false;">
+            &lt;!-- Place somewhere in the &lt;body&gt; of your page -->
+            &lt;div class="flexslider">
+              &lt;ul class="slides">
+                &lt;li data-thumb="slide1-thumb.jpg">
+                  &lt;img src="slide1.jpg" />
+                &lt;/li>
+                &lt;li data-thumb="slide2-thumb.jpg">
+                  &lt;img src="slide2.jpg" />
+                &lt;/li>
+                &lt;li data-thumb="slide3-thumb.jpg">
+                  &lt;img src="slide3.jpg" />
+                &lt;/li>
+                &lt;li data-thumb="slide4-thumb.jpg">
+                  &lt;img src="slide4.jpg" />
+                &lt;/li>
+              &lt;/ul>
+            &lt;/div>
+          </pre>
+        </div>
+      </aside>
+    </div>
+
+  </div>
+
+  <!-- jQuery -->
+  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
+  <script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.min.js">\x3C/script>')</script>
+
+  <!-- FlexSlider -->
+  <script defer src="../jquery.flexslider.js"></script>
+
+  <script type="text/javascript">
+    $(function(){
+      SyntaxHighlighter.all();
+    });
+    $(window).load(function(){
+      $('.flexslider').flexslider({
+        animation: "slide",
+        controlNav: "thumbnails",
+        start: function(slider){
+          $('body').removeClass('loading');
+        }
+      });
+    });
+  </script>
+
+
+  <!-- Syntax Highlighter -->
+  <script type="text/javascript" src="js/shCore.js"></script>
+  <script type="text/javascript" src="js/shBrushXml.js"></script>
+  <script type="text/javascript" src="js/shBrushJScript.js"></script>
+
+  <!-- Optional FlexSlider Additions -->
+  <script src="js/jquery.easing.js"></script>
+  <script src="js/jquery.mousewheel.js"></script>
+  <script defer src="js/demo.js"></script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/thumbnail-slider.html b/htmltest/sites/all/libraries/flexslider-version/demo/thumbnail-slider.html
new file mode 100644
index 00000000..c93ce5e4
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/thumbnail-slider.html
@@ -0,0 +1,247 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+<head>
+	<meta content="charset=utf-8">
+	<title>FlexSlider 2</title>
+	<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
+
+  <!-- Demo CSS -->
+	<link rel="stylesheet" href="css/demo.css" type="text/css" media="screen" />
+	<link rel="stylesheet" href="../flexslider.css" type="text/css" media="screen" />
+
+	<!-- Modernizr -->
+  <script src="js/modernizr.js"></script>
+
+</head>
+<body class="loading">
+
+  <div id="container" class="cf">
+    <header role="navigation">
+      <a class="logo" href="http://www.woothemes.com" title="WooThemes">
+        <img src="images/logo.png" alt="WooThemes" />
+	  </a>
+      <h1>FlexSlider 2</h1>
+      <h2>The best responsive slider. Period.</h2>
+      <a class="button green" href="https://github.com/woothemes/FlexSlider/zipball/master">Download Flexslider</a>
+      <h3 class="nav-header">Other Examples</h3>
+      <nav>
+        <ul>
+          <li><a href="index.html">Basic Slider</a></li>
+          <li><a href="thumbnail-controlnav.html">Slider w/thumbnail controlNav pattern</a></li>
+          <li class="active"><a href="thumbnail-slider.html">Slider w/thumbnail slider</a></li>
+          <li><a href="basic-carousel.html">Basic Carousel</a></li>
+          <li><a href="carousel-min-max.html">Carousel with min and max ranges</a></li>
+          <li><a href="dynamic-carousel-min-max.html">Carousel with dynamic min/max ranges</a></li>
+          <li><a href="video.html">Video & the api (vimeo)</a></li>
+          <li><a href="video-wistia.html">Video & the api (wistia)</a></li>
+        </ul>
+      </nav>
+    </header>
+
+	<div id="main" role="main">
+      <section class="slider">
+        <div id="slider" class="flexslider">
+          <ul class="slides">
+            <li>
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+            <li>
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+            <li>
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+          </ul>
+        </div>
+        <div id="carousel" class="flexslider">
+          <ul class="slides">
+            <li>
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+            <li>
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+            <li>
+  	    	    <img src="images/kitchen_adventurer_cheesecake_brownie.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+          </ul>
+        </div>
+      </section>
+      <aside>
+        <div class="cf">
+          <h3>Slider with Carousel Slider as Navigation</h3>
+          <ul class="toggle cf">
+            <li class="js"><a href="#view-js">JS</a></li>
+            <li class="html"><a href="#view-html">HTML</a></li>
+          </ul>
+        </div>
+        <div id="view-js" class="code">
+          <pre class="brush: js; toolbar: false; gutter: false;">
+            $(window).load(function() {
+              // The slider being synced must be initialized first
+              $('#carousel').flexslider({
+                animation: "slide",
+                controlNav: false,
+                animationLoop: false,
+                slideshow: false,
+                itemWidth: 210,
+                itemMargin: 5,
+                asNavFor: '#slider'
+              });
+
+              $('#slider').flexslider({
+                animation: "slide",
+                controlNav: false,
+                animationLoop: false,
+                slideshow: false,
+                sync: "#carousel"
+              });
+            });
+          </pre>
+        </div>
+        <div id="view-html" class="code">
+          <pre class="brush: xml; toolbar: false; gutter: false;">
+            &lt;!-- Place somewhere in the &lt;body&gt; of your page -->
+            &lt;div id="slider" class="flexslider">
+              &lt;ul class="slides">
+                &lt;li>
+                  &lt;img src="slide1.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide2.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide3.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide4.jpg" />
+                &lt;/li>
+                &lt;!-- items mirrored twice, total of 12 -->
+              &lt;/ul>
+            &lt;/div>
+            &lt;div id="carousel" class="flexslider">
+              &lt;ul class="slides">
+                &lt;li>
+                  &lt;img src="slide1.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide2.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide3.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide4.jpg" />
+                &lt;/li>
+                &lt;!-- items mirrored twice, total of 12 -->
+              &lt;/ul>
+            &lt;/div>
+          </pre>
+        </div>
+      </aside>
+    </div>
+
+  </div>
+
+  <!-- jQuery -->
+  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
+  <script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.min.js">\x3C/script>')</script>
+
+  <!-- FlexSlider -->
+  <script defer src="../jquery.flexslider.js"></script>
+
+  <script type="text/javascript">
+    $(function(){
+      SyntaxHighlighter.all();
+    });
+    $(window).load(function(){
+      $('#carousel').flexslider({
+        animation: "slide",
+        controlNav: false,
+        animationLoop: false,
+        slideshow: false,
+        itemWidth: 210,
+        itemMargin: 5,
+        asNavFor: '#slider'
+      });
+
+      $('#slider').flexslider({
+        animation: "slide",
+        controlNav: false,
+        animationLoop: false,
+        slideshow: false,
+        sync: "#carousel",
+        start: function(slider){
+          $('body').removeClass('loading');
+        }
+      });
+    });
+  </script>
+
+
+  <!-- Syntax Highlighter -->
+  <script type="text/javascript" src="js/shCore.js"></script>
+  <script type="text/javascript" src="js/shBrushXml.js"></script>
+  <script type="text/javascript" src="js/shBrushJScript.js"></script>
+
+  <!-- Optional FlexSlider Additions -->
+  <script src="js/jquery.easing.js"></script>
+  <script src="js/jquery.mousewheel.js"></script>
+  <script defer src="js/demo.js"></script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/video-wistia.html b/htmltest/sites/all/libraries/flexslider-version/demo/video-wistia.html
new file mode 100644
index 00000000..d0285f89
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/video-wistia.html
@@ -0,0 +1,180 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+<head>
+	<meta content="charset=utf-8">
+	<title>FlexSlider 2</title>
+	<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
+
+  <!-- Demo CSS -->
+	<link rel="stylesheet" href="css/demo.css" type="text/css" media="screen" />
+	<link rel="stylesheet" href="../flexslider.css" type="text/css" media="screen" />
+
+	<!-- Modernizr -->
+  <script src="js/modernizr.js"></script>
+
+    <!-- jQuery -->
+  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
+  <script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.min.js">\x3C/script>')</script>
+
+  <!-- Wistia iframe API -->
+  <script src="http://fast.wistia.com/static/iframe-api-v1.js"></script>
+
+</head>
+<body class="loading">
+
+  <div id="container" class="cf">
+    <header role="navigation">
+      <a class="logo" href="http://www.woothemes.com" title="WooThemes">
+        <img src="images/logo.png" alt="WooThemes" />
+	  </a>
+      <h1>FlexSlider 2</h1>
+      <h2>The best responsive slider. Period.</h2>
+      <a class="button green" href="https://github.com/woothemes/FlexSlider/zipball/master">Download Flexslider</a>
+      <h3 class="nav-header">Other Examples</h3>
+      <nav>
+        <ul>
+          <li><a href="index.html">Basic Slider</a></li>
+          <li><a href="thumbnail-controlnav.html">Slider w/thumbnail controlNav pattern</a></li>
+          <li><a href="thumbnail-slider.html">Slider w/thumbnail slider</a></li>
+          <li><a href="basic-carousel.html">Basic Carousel</a></li>
+          <li><a href="carousel-min-max.html">Carousel with min and max ranges</a></li>
+          <li><a href="dynamic-carousel-min-max.html">Carousel with dynamic min/max ranges</a></li>
+          <li><a href="video.html">Video & the api (vimeo)</a></li>
+          <li class="active"><a href="video-wistia.html">Video & the api (wistia)</a></li>
+        </ul>
+      </nav>
+    </header>
+    <div id="main" role="main">
+      <section class="slider">
+        <div class="flexslider">
+          <ul class="slides">
+            <li>
+              <iframe id="player_1" src="http://fast.wistia.com/embed/iframe/t4yniozocs?controlsVisibleOnLoad=true&amp;playerColor=474745&amp;version=v1&amp;videoHeight=366&amp;videoWidth=650&amp;volumeControl=true&videoFoam=true" allowtransparency="true" frameborder="0" scrolling="no" class="wistia_embed" name="wistia_embed" width="650" height="366"></iframe>
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+          </ul>
+        </div>
+      </section>
+      <aside>
+        <div class="cf">
+          <h3>Video</h3>
+          <ul class="toggle cf">
+            <li class="js"><a href="#view-js">JS</a></li>
+            <li class="html"><a href="#view-html">HTML</a></li>
+          </ul>
+        </div>
+        <div id="view-js" class="code">
+          <pre class="brush: js; toolbar: false; gutter: false;">
+            // Can also be used with $(document).ready()
+            $(window).load(function(){
+            // Wistia handler.
+            wistiaEmbed = document.getElementById( 'player_1' ).wistiaApi;
+
+            // Call fitVid before FlexSlider initializes, so the proper initial height can be retrieved.
+            $( '.flexslider' )
+              .fitVids()
+              .flexslider({
+                animation: 'slide',
+                useCSS: false,
+                animationLoop: false,
+                smoothHeight: true,
+                start: function( slider ) {
+                  $('body').removeClass( 'loading' );
+                },
+                before: function ( slider ) {
+                  wistiaEmbed.pause();
+                }
+            });
+
+            wistiaEmbed.bind( 'play', function() {
+              jQuery( '.flexslider' ).flexslider( 'pause' );
+            });
+
+            wistiaEmbed.bind( 'end', function() {
+              jQuery( '.flexslider' ).flexslider( 'play' );
+            });
+          });
+          </pre>
+        </div>
+        <div id="view-html" class="code">
+          <pre class="brush: xml; toolbar: false; gutter: false;">
+            &lt;!-- Place somewhere in the &lt;body&gt; of your page -->
+            &lt;div class="flexslider">
+              &lt;ul class="slides">
+                &lt;li>
+                  &lt;iframe id="player_1" src="http://fast.wistia.com/embed/iframe/t4yniozocs?controlsVisibleOnLoad=true&amp;playerColor=474745&amp;version=v1&amp;videoHeight=366&amp;videoWidth=650&amp;volumeControl=true&videoFoam=true" allowtransparency="true" frameborder="0" scrolling="no" class="wistia_embed" name="wistia_embed" width="650" height="366"&gt;&lt;/iframe&gt;
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide2.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide3.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide4.jpg" />
+                &lt;/li>
+              &lt;/ul>
+            &lt;/div>
+          </pre>
+        </div>
+      </aside>
+    </div>
+
+  </div>
+
+  <!-- FlexSlider -->
+  <script defer src="../jquery.flexslider.js"></script>
+
+  <script type="text/javascript">
+    $(function(){
+      SyntaxHighlighter.all();
+    });
+    $(window).load(function(){
+      // Wistia handler.
+      wistiaEmbed = document.getElementById( 'player_1' ).wistiaApi;
+
+      // Call fitVid before FlexSlider initializes, so the proper initial height can be retrieved.
+      $( '.flexslider' )
+        .fitVids()
+        .flexslider({
+          animation: 'slide',
+          useCSS: false,
+          animationLoop: false,
+          smoothHeight: true,
+          start: function( slider ) {
+            $('body').removeClass( 'loading' );
+          },
+          before: function ( slider ) {
+            wistiaEmbed.pause();
+          }
+      });
+
+      wistiaEmbed.bind( 'play', function() {
+        jQuery( '.flexslider' ).flexslider( 'pause' );
+      });
+
+      wistiaEmbed.bind( 'end', function() {
+        jQuery( '.flexslider' ).flexslider( 'play' );
+      });
+    });
+  </script>
+
+   <!-- Syntax Highlighter -->
+	<script type="text/javascript" src="js/shCore.js"></script>
+	<script type="text/javascript" src="js/shBrushXml.js"></script>
+	<script type="text/javascript" src="js/shBrushJScript.js"></script>
+
+  <!-- Optional FlexSlider Additions -->
+	<script src="js/jquery.fitvid.js"></script>
+	<script src="js/demo.js"></script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/demo/video.html b/htmltest/sites/all/libraries/flexslider-version/demo/video.html
new file mode 100644
index 00000000..5a72e67f
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/demo/video.html
@@ -0,0 +1,199 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+<head>
+	<meta content="charset=utf-8">
+	<title>FlexSlider 2</title>
+	<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
+
+  <!-- Demo CSS -->
+	<link rel="stylesheet" href="css/demo.css" type="text/css" media="screen" />
+	<link rel="stylesheet" href="../flexslider.css" type="text/css" media="screen" />
+
+	<!-- Modernizr -->
+  <script src="js/modernizr.js"></script>
+
+</head>
+<body class="loading">
+
+  <div id="container" class="cf">
+    <header role="navigation">
+      <a class="logo" href="http://www.woothemes.com" title="WooThemes">
+        <img src="images/logo.png" alt="WooThemes" />
+	  </a>
+      <h1>FlexSlider 2</h1>
+      <h2>The best responsive slider. Period.</h2>
+      <a class="button green" href="https://github.com/woothemes/FlexSlider/zipball/master">Download Flexslider</a>
+      <h3 class="nav-header">Other Examples</h3>
+      <nav>
+        <ul>
+          <li><a href="index.html">Basic Slider</a></li>
+          <li><a href="thumbnail-controlnav.html">Slider w/thumbnail controlNav pattern</a></li>
+          <li><a href="thumbnail-slider.html">Slider w/thumbnail slider</a></li>
+          <li><a href="basic-carousel.html">Basic Carousel</a></li>
+          <li><a href="carousel-min-max.html">Carousel with min and max ranges</a></li>
+          <li><a href="dynamic-carousel-min-max.html">Carousel with dynamic min/max ranges</a></li>
+          <li class="active"><a href="video.html">Video & the api (vimeo)</a></li>
+          <li><a href="video-wistia.html">Video & the api (wistia)</a></li>
+        </ul>
+      </nav>
+    </header>
+    <div id="main" role="main">
+      <section class="slider">
+        <div class="flexslider">
+          <ul class="slides">
+            <li>
+              <iframe id="player_1" src="http://player.vimeo.com/video/39683393?api=1&amp;player_id=player_1" width="500" height="281" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_lemon.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_donut.jpg" />
+  	    		</li>
+  	    		<li>
+  	    	    <img src="images/kitchen_adventurer_caramel.jpg" />
+  	    		</li>
+          </ul>
+        </div>
+      </section>
+      <aside>
+        <div class="cf">
+          <h3>Video</h3>
+          <ul class="toggle cf">
+            <li class="js"><a href="#view-js">JS</a></li>
+            <li class="html"><a href="#view-html">HTML</a></li>
+          </ul>
+        </div>
+        <div id="view-js" class="code">
+          <pre class="brush: js; toolbar: false; gutter: false;">
+            // Can also be used with $(document).ready()
+            $(window).load(function() {
+
+              // Vimeo API nonsense
+              var player = document.getElementById('player_1');
+              $f(player).addEvent('ready', ready);
+
+              function addEvent(element, eventName, callback) {
+                if (element.addEventListener) {
+                  element.addEventListener(eventName, callback, false)
+                } else {
+                  element.attachEvent(eventName, callback, false);
+                }
+              }
+
+              function ready(player_id) {
+                var froogaloop = $f(player_id);
+                froogaloop.addEvent('play', function(data) {
+                  $('.flexslider').flexslider("pause");
+                });
+                froogaloop.addEvent('pause', function(data) {
+                  $('.flexslider').flexslider("play");
+                });
+              }
+
+
+              // Call fitVid before FlexSlider initializes, so the proper initial height can be retrieved.
+              $(".flexslider")
+                .fitVids()
+                .flexslider({
+                  animation: "slide",
+                  useCSS: false,
+                  animationLoop: false,
+                  smoothHeight: true,
+                  before: function(slider){
+                    $f(player).api('pause');
+                  }
+              });
+            });
+          </pre>
+        </div>
+        <div id="view-html" class="code">
+          <pre class="brush: xml; toolbar: false; gutter: false;">
+            &lt;!-- Place somewhere in the &lt;body&gt; of your page -->
+            &lt;div class="flexslider">
+              &lt;ul class="slides">
+                &lt;li>
+                  &lt;iframe id="player_1" src="http://player.vimeo.com/video/39683393?api=1&amp;player_id=player_1" width="500" height="281" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen>&lt;/iframe>
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide2.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide3.jpg" />
+                &lt;/li>
+                &lt;li>
+                  &lt;img src="slide4.jpg" />
+                &lt;/li>
+              &lt;/ul>
+            &lt;/div>
+          </pre>
+        </div>
+      </aside>
+    </div>
+
+  </div>
+
+  <!-- jQuery -->
+  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
+  <script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.min.js">\x3C/script>')</script>
+
+  <!-- FlexSlider -->
+  <script defer src="../jquery.flexslider.js"></script>
+
+  <script type="text/javascript">
+    $(function(){
+      SyntaxHighlighter.all();
+    });
+    $(window).load(function(){
+
+      // Vimeo API nonsense
+      var player = document.getElementById('player_1');
+      $f(player).addEvent('ready', ready);
+
+      function addEvent(element, eventName, callback) {
+        (element.addEventListener) ? element.addEventListener(eventName, callback, false) : element.attachEvent(eventName, callback, false);
+      }
+
+      function ready(player_id) {
+        var froogaloop = $f(player_id);
+
+        froogaloop.addEvent('play', function(data) {
+          $('.flexslider').flexslider("pause");
+        });
+
+        froogaloop.addEvent('pause', function(data) {
+          $('.flexslider').flexslider("play");
+        });
+      }
+
+
+      // Call fitVid before FlexSlider initializes, so the proper initial height can be retrieved.
+      $(".flexslider")
+        .fitVids()
+        .flexslider({
+          animation: "slide",
+          useCSS: false,
+          animationLoop: false,
+          smoothHeight: true,
+          start: function(slider){
+            $('body').removeClass('loading');
+          },
+          before: function(slider){
+            $f(player).api('pause');
+          }
+      });
+    });
+  </script>
+
+   <!-- Syntax Highlighter -->
+	<script type="text/javascript" src="js/shCore.js"></script>
+	<script type="text/javascript" src="js/shBrushXml.js"></script>
+	<script type="text/javascript" src="js/shBrushJScript.js"></script>
+
+  <!-- Optional FlexSlider Additions -->
+    <script src="js/froogaloop.js"></script>
+	<script src="js/jquery.fitvid.js"></script>
+	<script src="js/demo.js"></script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/flexslider.css b/htmltest/sites/all/libraries/flexslider-version/flexslider.css
new file mode 100644
index 00000000..9d941bc0
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/flexslider.css
@@ -0,0 +1,96 @@
+/*
+ * jQuery FlexSlider v2.2.0
+ * http://www.woothemes.com/flexslider/
+ *
+ * Copyright 2012 WooThemes
+ * Free to use under the GPLv2 license.
+ * http://www.gnu.org/licenses/gpl-2.0.html
+ *
+ * Contributing author: Tyler Smith (@mbmufffin)
+ */
+
+
+/* Browser Resets
+*********************************/
+.flex-container a:active,
+.flexslider a:active,
+.flex-container a:focus,
+.flexslider a:focus  {outline: none;}
+.slides,
+.flex-control-nav,
+.flex-direction-nav {margin: 0; padding: 0; list-style: none;}
+
+/* Icon Fonts
+*********************************/
+/* Font-face Icons */
+@font-face {
+	font-family: 'flexslider-icon';
+	src:url('fonts/flexslider-icon.eot');
+	src:url('fonts/flexslider-icon.eot?#iefix') format('embedded-opentype'),
+		url('fonts/flexslider-icon.woff') format('woff'),
+		url('fonts/flexslider-icon.ttf') format('truetype'),
+		url('fonts/flexslider-icon.svg#flexslider-icon') format('svg');
+	font-weight: normal;
+	font-style: normal;
+}
+
+/* FlexSlider Necessary Styles
+*********************************/
+.flexslider {margin: 0; padding: 0;}
+.flexslider .slides > li {display: none; -webkit-backface-visibility: hidden;} /* Hide the slides before the JS is loaded. Avoids image jumping */
+.flexslider .slides img {width: 100%; display: block;}
+.flex-pauseplay span {text-transform: capitalize;}
+
+/* Clearfix for the .slides element */
+.slides:after {content: "\0020"; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;}
+html[xmlns] .slides {display: block;}
+* html .slides {height: 1%;}
+
+/* No JavaScript Fallback */
+/* If you are not using another script, such as Modernizr, make sure you
+ * include js that eliminates this class on page load */
+.no-js .slides > li:first-child {display: block;}
+
+/* FlexSlider Default Theme
+*********************************/
+.flexslider { margin: 0 0 60px; background: #fff; border: 4px solid #fff; position: relative; -webkit-border-radius: 4px; -moz-border-radius: 4px; -o-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.2); -moz-box-shadow: 0 1px 4px rgba(0,0,0,.2); -o-box-shadow: 0 1px 4px rgba(0,0,0,.2); box-shadow: 0 1px 4px rgba(0,0,0,.2); zoom: 1; }
+.flex-viewport { max-height: 2000px; -webkit-transition: all 1s ease; -moz-transition: all 1s ease; -o-transition: all 1s ease; transition: all 1s ease; }
+.loading .flex-viewport { max-height: 300px; }
+.flexslider .slides { zoom: 1; }
+.carousel li { margin-right: 5px; }
+
+/* Direction Nav */
+.flex-direction-nav {*height: 0;}
+.flex-direction-nav a  { display: block; width: 40px; height: 40px; margin: -20px 0 0; position: absolute; top: 50%; z-index: 10; overflow: hidden; opacity: 0; cursor: pointer; color: rgba(0,0,0,0.8); text-shadow: 1px 1px 0 rgba(255,255,255,0.3); -webkit-transition: all .3s ease; -moz-transition: all .3s ease; transition: all .3s ease; }
+.flex-direction-nav .flex-prev { left: -50px; }
+.flex-direction-nav .flex-next { right: -50px; text-align: right; }
+.flexslider:hover .flex-prev { opacity: 0.7; left: 10px; }
+.flexslider:hover .flex-next { opacity: 0.7; right: 10px; }
+.flexslider:hover .flex-next:hover, .flexslider:hover .flex-prev:hover { opacity: 1; }
+.flex-direction-nav .flex-disabled { opacity: 0!important; filter:alpha(opacity=0); cursor: default; }
+.flex-direction-nav a:before  { font-family: "flexslider-icon"; font-size: 40px; display: inline-block; content: '\f001'; }
+.flex-direction-nav a.flex-next:before  { content: '\f002'; }
+
+/* Pause/Play */
+.flex-pauseplay a { display: block; width: 20px; height: 20px; position: absolute; bottom: 5px; left: 10px; opacity: 0.8; z-index: 10; overflow: hidden; cursor: pointer; color: #000; }
+.flex-pauseplay a:before  { font-family: "flexslider-icon"; font-size: 20px; display: inline-block; content: '\f004'; }
+.flex-pauseplay a:hover  { opacity: 1; }
+.flex-pauseplay a.flex-play:before { content: '\f003'; }
+
+/* Control Nav */
+.flex-control-nav {width: 100%; position: absolute; bottom: -40px; text-align: center;}
+.flex-control-nav li {margin: 0 6px; display: inline-block; zoom: 1; *display: inline;}
+.flex-control-paging li a {width: 11px; height: 11px; display: block; background: #666; background: rgba(0,0,0,0.5); cursor: pointer; text-indent: -9999px; -webkit-border-radius: 20px; -moz-border-radius: 20px; -o-border-radius: 20px; border-radius: 20px; -webkit-box-shadow: inset 0 0 3px rgba(0,0,0,0.3); -moz-box-shadow: inset 0 0 3px rgba(0,0,0,0.3); -o-box-shadow: inset 0 0 3px rgba(0,0,0,0.3); box-shadow: inset 0 0 3px rgba(0,0,0,0.3); }
+.flex-control-paging li a:hover { background: #333; background: rgba(0,0,0,0.7); }
+.flex-control-paging li a.flex-active { background: #000; background: rgba(0,0,0,0.9); cursor: default; }
+
+.flex-control-thumbs {margin: 5px 0 0; position: static; overflow: hidden;}
+.flex-control-thumbs li {width: 25%; float: left; margin: 0;}
+.flex-control-thumbs img {width: 100%; display: block; opacity: .7; cursor: pointer;}
+.flex-control-thumbs img:hover {opacity: 1;}
+.flex-control-thumbs .flex-active {opacity: 1; cursor: default;}
+
+@media screen and (max-width: 860px) {
+  .flex-direction-nav .flex-prev { opacity: 1; left: 10px;}
+  .flex-direction-nav .flex-next { opacity: 1; right: 10px;}
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/fonts/flexslider-icon.eot b/htmltest/sites/all/libraries/flexslider-version/fonts/flexslider-icon.eot
new file mode 100644
index 00000000..97c4196f
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/fonts/flexslider-icon.eot differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/fonts/flexslider-icon.svg b/htmltest/sites/all/libraries/flexslider-version/fonts/flexslider-icon.svg
new file mode 100644
index 00000000..89fd1ab8
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/fonts/flexslider-icon.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+This is a custom SVG font generated by IcoMoon.
+<iconset grid="14"></iconset>
+</metadata>
+<defs>
+<font id="flexslider-icon" horiz-adv-x="448" >
+<font-face units-per-em="448" ascent="384" descent="-64" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode="&#xf001;" d="M 185.50-9.25l-163.00,162.75q-9.25,9.25 -9.25,22.625t 9.25,22.625l 163.00,162.75q 9.25,9.25 22.625,9.25t 22.625-9.25l 18.75-18.75q 9.25-9.25 9.25-22.625t-9.25-22.625l-121.50-121.50l 121.50-121.25q 9.25-9.50 9.25-22.75t-9.25-22.50l-18.75-18.75q-9.25-9.25 -22.625-9.25t-22.625,9.25z" horiz-adv-x="288"  />
+<glyph unicode="&#xf002;" d="M 274.75,176.00q0.00-13.00 -9.25-22.75l-163.00-162.75q-9.25-9.25 -22.50-9.25t-22.50,9.25l-19.00,18.75q-9.25,9.75 -9.25,22.75q0.00,13.25 9.25,22.50l 121.50,121.50l-121.50,121.25q-9.25,9.75 -9.25,22.75q0.00,13.25 9.25,22.50l 19.00,18.75q 9.00,9.50 22.50,9.50t 22.50-9.50l 163.00-162.75q 9.25-9.25 9.25-22.50z" horiz-adv-x="288"  />
+<glyph unicode="&#xf003;" d="M 346.00,152.25l-332.00-184.50q-5.75-3.25 -9.875-0.75t-4.125,9.00l0.00,368.00 q0.00,6.50 4.125,9.00t 9.875-0.75l 332.00-184.50q 5.75-3.25 5.75-7.75t-5.75-7.75z" horiz-adv-x="352"  />
+<glyph unicode="&#xf004;" d="M 384.00,336.00l0.00-352.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-128.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,352.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 128.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 160.00,336.00l0.00-352.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-128.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,352.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 128.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25z" horiz-adv-x="384"  />
+<glyph unicode="&#xf005;" d="M 402.75,208.00q0.00-13.25 -9.25-22.50l-162.75-162.75q-9.50-9.50 -22.75-9.50q-13.50,0.00 -22.50,9.50l-162.75,162.75q-9.50,9.00 -9.50,22.50q0.00,13.25 9.50,22.75l 18.50,18.75q 9.75,9.25 22.75,9.25q 13.25,0.00 22.50-9.25l 121.50-121.50l 121.50,121.50q 9.25,9.25 22.50,9.25q 13.00,0.00 22.75-9.25l 18.75-18.75q 9.25-9.75 9.25-22.75z" horiz-adv-x="416"  />
+<glyph unicode="&#x20;" horiz-adv-x="224" />
+<glyph class="hidden" unicode="&#xf000;" d="M0,384L 448 -64L0 -64 z" horiz-adv-x="0" />
+</font></defs></svg>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/fonts/flexslider-icon.ttf b/htmltest/sites/all/libraries/flexslider-version/fonts/flexslider-icon.ttf
new file mode 100644
index 00000000..05432986
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/fonts/flexslider-icon.ttf differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/fonts/flexslider-icon.woff b/htmltest/sites/all/libraries/flexslider-version/fonts/flexslider-icon.woff
new file mode 100644
index 00000000..10c4eeb8
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/fonts/flexslider-icon.woff differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/images/bg_play_pause.png b/htmltest/sites/all/libraries/flexslider-version/images/bg_play_pause.png
new file mode 100644
index 00000000..aa3eb564
Binary files /dev/null and b/htmltest/sites/all/libraries/flexslider-version/images/bg_play_pause.png differ
diff --git a/htmltest/sites/all/libraries/flexslider-version/jquery.flexslider-min.js b/htmltest/sites/all/libraries/flexslider-version/jquery.flexslider-min.js
new file mode 100644
index 00000000..68bc6b1d
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/jquery.flexslider-min.js
@@ -0,0 +1,5 @@
+/*
+ * jQuery FlexSlider v2.2.0
+ * Copyright 2012 WooThemes
+ * Contributing Author: Tyler Smith
+ */(function(e){e.flexslider=function(t,n){var r=e(t);r.vars=e.extend({},e.flexslider.defaults,n);var i=r.vars.namespace,s=window.navigator&&window.navigator.msPointerEnabled&&window.MSGesture,o=("ontouchstart"in window||s||window.DocumentTouch&&document instanceof DocumentTouch)&&r.vars.touch,u="click touchend MSPointerUp",a="",f,l=r.vars.direction==="vertical",c=r.vars.reverse,h=r.vars.itemWidth>0,p=r.vars.animation==="fade",d=r.vars.asNavFor!=="",v={},m=!0;e.data(t,"flexslider",r);v={init:function(){r.animating=!1;r.currentSlide=parseInt(r.vars.startAt?r.vars.startAt:0);isNaN(r.currentSlide)&&(r.currentSlide=0);r.animatingTo=r.currentSlide;r.atEnd=r.currentSlide===0||r.currentSlide===r.last;r.containerSelector=r.vars.selector.substr(0,r.vars.selector.search(" "));r.slides=e(r.vars.selector,r);r.container=e(r.containerSelector,r);r.count=r.slides.length;r.syncExists=e(r.vars.sync).length>0;r.vars.animation==="slide"&&(r.vars.animation="swing");r.prop=l?"top":"marginLeft";r.args={};r.manualPause=!1;r.stopped=!1;r.started=!1;r.startTimeout=null;r.transitions=!r.vars.video&&!p&&r.vars.useCSS&&function(){var e=document.createElement("div"),t=["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"];for(var n in t)if(e.style[t[n]]!==undefined){r.pfx=t[n].replace("Perspective","").toLowerCase();r.prop="-"+r.pfx+"-transform";return!0}return!1}();r.vars.controlsContainer!==""&&(r.controlsContainer=e(r.vars.controlsContainer).length>0&&e(r.vars.controlsContainer));r.vars.manualControls!==""&&(r.manualControls=e(r.vars.manualControls).length>0&&e(r.vars.manualControls));if(r.vars.randomize){r.slides.sort(function(){return Math.round(Math.random())-.5});r.container.empty().append(r.slides)}r.doMath();r.setup("init");r.vars.controlNav&&v.controlNav.setup();r.vars.directionNav&&v.directionNav.setup();r.vars.keyboard&&(e(r.containerSelector).length===1||r.vars.multipleKeyboard)&&e(document).bind("keyup",function(e){var t=e.keyCode;if(!r.animating&&(t===39||t===37)){var n=t===39?r.getTarget("next"):t===37?r.getTarget("prev"):!1;r.flexAnimate(n,r.vars.pauseOnAction)}});r.vars.mousewheel&&r.bind("mousewheel",function(e,t,n,i){e.preventDefault();var s=t<0?r.getTarget("next"):r.getTarget("prev");r.flexAnimate(s,r.vars.pauseOnAction)});r.vars.pausePlay&&v.pausePlay.setup();r.vars.slideshow&&r.vars.pauseInvisible&&v.pauseInvisible.init();if(r.vars.slideshow){r.vars.pauseOnHover&&r.hover(function(){!r.manualPlay&&!r.manualPause&&r.pause()},function(){!r.manualPause&&!r.manualPlay&&!r.stopped&&r.play()});if(!r.vars.pauseInvisible||!v.pauseInvisible.isHidden())r.vars.initDelay>0?r.startTimeout=setTimeout(r.play,r.vars.initDelay):r.play()}d&&v.asNav.setup();o&&r.vars.touch&&v.touch();(!p||p&&r.vars.smoothHeight)&&e(window).bind("resize orientationchange focus",v.resize);r.find("img").attr("draggable","false");setTimeout(function(){r.vars.start(r)},200)},asNav:{setup:function(){r.asNav=!0;r.animatingTo=Math.floor(r.currentSlide/r.move);r.currentItem=r.currentSlide;r.slides.removeClass(i+"active-slide").eq(r.currentItem).addClass(i+"active-slide");if(!s)r.slides.click(function(t){t.preventDefault();var n=e(this),s=n.index(),o=n.offset().left-e(r).scrollLeft();if(o<=0&&n.hasClass(i+"active-slide"))r.flexAnimate(r.getTarget("prev"),!0);else if(!e(r.vars.asNavFor).data("flexslider").animating&&!n.hasClass(i+"active-slide")){r.direction=r.currentItem<s?"next":"prev";r.flexAnimate(s,r.vars.pauseOnAction,!1,!0,!0)}});else{t._slider=r;r.slides.each(function(){var t=this;t._gesture=new MSGesture;t._gesture.target=t;t.addEventListener("MSPointerDown",function(e){e.preventDefault();e.currentTarget._gesture&&e.currentTarget._gesture.addPointer(e.pointerId)},!1);t.addEventListener("MSGestureTap",function(t){t.preventDefault();var n=e(this),i=n.index();if(!e(r.vars.asNavFor).data("flexslider").animating&&!n.hasClass("active")){r.direction=r.currentItem<i?"next":"prev";r.flexAnimate(i,r.vars.pauseOnAction,!1,!0,!0)}})})}}},controlNav:{setup:function(){r.manualControls?v.controlNav.setupManual():v.controlNav.setupPaging()},setupPaging:function(){var t=r.vars.controlNav==="thumbnails"?"control-thumbs":"control-paging",n=1,s,o;r.controlNavScaffold=e('<ol class="'+i+"control-nav "+i+t+'"></ol>');if(r.pagingCount>1)for(var f=0;f<r.pagingCount;f++){o=r.slides.eq(f);s=r.vars.controlNav==="thumbnails"?'<img src="'+o.attr("data-thumb")+'"/>':"<a>"+n+"</a>";if("thumbnails"===r.vars.controlNav&&!0===r.vars.thumbCaptions){var l=o.attr("data-thumbcaption");""!=l&&undefined!=l&&(s+='<span class="'+i+'caption">'+l+"</span>")}r.controlNavScaffold.append("<li>"+s+"</li>");n++}r.controlsContainer?e(r.controlsContainer).append(r.controlNavScaffold):r.append(r.controlNavScaffold);v.controlNav.set();v.controlNav.active();r.controlNavScaffold.delegate("a, img",u,function(t){t.preventDefault();if(a===""||a===t.type){var n=e(this),s=r.controlNav.index(n);if(!n.hasClass(i+"active")){r.direction=s>r.currentSlide?"next":"prev";r.flexAnimate(s,r.vars.pauseOnAction)}}a===""&&(a=t.type);v.setToClearWatchedEvent()})},setupManual:function(){r.controlNav=r.manualControls;v.controlNav.active();r.controlNav.bind(u,function(t){t.preventDefault();if(a===""||a===t.type){var n=e(this),s=r.controlNav.index(n);if(!n.hasClass(i+"active")){s>r.currentSlide?r.direction="next":r.direction="prev";r.flexAnimate(s,r.vars.pauseOnAction)}}a===""&&(a=t.type);v.setToClearWatchedEvent()})},set:function(){var t=r.vars.controlNav==="thumbnails"?"img":"a";r.controlNav=e("."+i+"control-nav li "+t,r.controlsContainer?r.controlsContainer:r)},active:function(){r.controlNav.removeClass(i+"active").eq(r.animatingTo).addClass(i+"active")},update:function(t,n){r.pagingCount>1&&t==="add"?r.controlNavScaffold.append(e("<li><a>"+r.count+"</a></li>")):r.pagingCount===1?r.controlNavScaffold.find("li").remove():r.controlNav.eq(n).closest("li").remove();v.controlNav.set();r.pagingCount>1&&r.pagingCount!==r.controlNav.length?r.update(n,t):v.controlNav.active()}},directionNav:{setup:function(){var t=e('<ul class="'+i+'direction-nav"><li><a class="'+i+'prev" href="#">'+r.vars.prevText+'</a></li><li><a class="'+i+'next" href="#">'+r.vars.nextText+"</a></li></ul>");if(r.controlsContainer){e(r.controlsContainer).append(t);r.directionNav=e("."+i+"direction-nav li a",r.controlsContainer)}else{r.append(t);r.directionNav=e("."+i+"direction-nav li a",r)}v.directionNav.update();r.directionNav.bind(u,function(t){t.preventDefault();var n;if(a===""||a===t.type){n=e(this).hasClass(i+"next")?r.getTarget("next"):r.getTarget("prev");r.flexAnimate(n,r.vars.pauseOnAction)}a===""&&(a=t.type);v.setToClearWatchedEvent()})},update:function(){var e=i+"disabled";r.pagingCount===1?r.directionNav.addClass(e).attr("tabindex","-1"):r.vars.animationLoop?r.directionNav.removeClass(e).removeAttr("tabindex"):r.animatingTo===0?r.directionNav.removeClass(e).filter("."+i+"prev").addClass(e).attr("tabindex","-1"):r.animatingTo===r.last?r.directionNav.removeClass(e).filter("."+i+"next").addClass(e).attr("tabindex","-1"):r.directionNav.removeClass(e).removeAttr("tabindex")}},pausePlay:{setup:function(){var t=e('<div class="'+i+'pauseplay"><a></a></div>');if(r.controlsContainer){r.controlsContainer.append(t);r.pausePlay=e("."+i+"pauseplay a",r.controlsContainer)}else{r.append(t);r.pausePlay=e("."+i+"pauseplay a",r)}v.pausePlay.update(r.vars.slideshow?i+"pause":i+"play");r.pausePlay.bind(u,function(t){t.preventDefault();if(a===""||a===t.type)if(e(this).hasClass(i+"pause")){r.manualPause=!0;r.manualPlay=!1;r.pause()}else{r.manualPause=!1;r.manualPlay=!0;r.play()}a===""&&(a=t.type);v.setToClearWatchedEvent()})},update:function(e){e==="play"?r.pausePlay.removeClass(i+"pause").addClass(i+"play").html(r.vars.playText):r.pausePlay.removeClass(i+"play").addClass(i+"pause").html(r.vars.pauseText)}},touch:function(){var e,n,i,o,u,a,f=!1,d=0,v=0,m=0;if(!s){t.addEventListener("touchstart",g,!1);function g(s){if(r.animating)s.preventDefault();else if(window.navigator.msPointerEnabled||s.touches.length===1){r.pause();o=l?r.h:r.w;a=Number(new Date);d=s.touches[0].pageX;v=s.touches[0].pageY;i=h&&c&&r.animatingTo===r.last?0:h&&c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:h&&r.currentSlide===r.last?r.limit:h?(r.itemW+r.vars.itemMargin)*r.move*r.currentSlide:c?(r.last-r.currentSlide+r.cloneOffset)*o:(r.currentSlide+r.cloneOffset)*o;e=l?v:d;n=l?d:v;t.addEventListener("touchmove",y,!1);t.addEventListener("touchend",b,!1)}}function y(t){d=t.touches[0].pageX;v=t.touches[0].pageY;u=l?e-v:e-d;f=l?Math.abs(u)<Math.abs(d-n):Math.abs(u)<Math.abs(v-n);var s=500;if(!f||Number(new Date)-a>s){t.preventDefault();if(!p&&r.transitions){r.vars.animationLoop||(u/=r.currentSlide===0&&u<0||r.currentSlide===r.last&&u>0?Math.abs(u)/o+2:1);r.setProps(i+u,"setTouch")}}}function b(s){t.removeEventListener("touchmove",y,!1);if(r.animatingTo===r.currentSlide&&!f&&u!==null){var l=c?-u:u,h=l>0?r.getTarget("next"):r.getTarget("prev");r.canAdvance(h)&&(Number(new Date)-a<550&&Math.abs(l)>50||Math.abs(l)>o/2)?r.flexAnimate(h,r.vars.pauseOnAction):p||r.flexAnimate(r.currentSlide,r.vars.pauseOnAction,!0)}t.removeEventListener("touchend",b,!1);e=null;n=null;u=null;i=null}}else{t.style.msTouchAction="none";t._gesture=new MSGesture;t._gesture.target=t;t.addEventListener("MSPointerDown",w,!1);t._slider=r;t.addEventListener("MSGestureChange",E,!1);t.addEventListener("MSGestureEnd",S,!1);function w(e){e.stopPropagation();if(r.animating)e.preventDefault();else{r.pause();t._gesture.addPointer(e.pointerId);m=0;o=l?r.h:r.w;a=Number(new Date);i=h&&c&&r.animatingTo===r.last?0:h&&c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:h&&r.currentSlide===r.last?r.limit:h?(r.itemW+r.vars.itemMargin)*r.move*r.currentSlide:c?(r.last-r.currentSlide+r.cloneOffset)*o:(r.currentSlide+r.cloneOffset)*o}}function E(e){e.stopPropagation();var n=e.target._slider;if(!n)return;var r=-e.translationX,s=-e.translationY;m+=l?s:r;u=m;f=l?Math.abs(m)<Math.abs(-r):Math.abs(m)<Math.abs(-s);if(e.detail===e.MSGESTURE_FLAG_INERTIA){setImmediate(function(){t._gesture.stop()});return}if(!f||Number(new Date)-a>500){e.preventDefault();if(!p&&n.transitions){n.vars.animationLoop||(u=m/(n.currentSlide===0&&m<0||n.currentSlide===n.last&&m>0?Math.abs(m)/o+2:1));n.setProps(i+u,"setTouch")}}}function S(t){t.stopPropagation();var r=t.target._slider;if(!r)return;if(r.animatingTo===r.currentSlide&&!f&&u!==null){var s=c?-u:u,l=s>0?r.getTarget("next"):r.getTarget("prev");r.canAdvance(l)&&(Number(new Date)-a<550&&Math.abs(s)>50||Math.abs(s)>o/2)?r.flexAnimate(l,r.vars.pauseOnAction):p||r.flexAnimate(r.currentSlide,r.vars.pauseOnAction,!0)}e=null;n=null;u=null;i=null;m=0}}},resize:function(){if(!r.animating&&r.is(":visible")){h||r.doMath();if(p)v.smoothHeight();else if(h){r.slides.width(r.computedW);r.update(r.pagingCount);r.setProps()}else if(l){r.viewport.height(r.h);r.setProps(r.h,"setTotal")}else{r.vars.smoothHeight&&v.smoothHeight();r.newSlides.width(r.computedW);r.setProps(r.computedW,"setTotal")}}},smoothHeight:function(e){if(!l||p){var t=p?r:r.viewport;e?t.animate({height:r.slides.eq(r.animatingTo).height()},e):t.height(r.slides.eq(r.animatingTo).height())}},sync:function(t){var n=e(r.vars.sync).data("flexslider"),i=r.animatingTo;switch(t){case"animate":n.flexAnimate(i,r.vars.pauseOnAction,!1,!0);break;case"play":!n.playing&&!n.asNav&&n.play();break;case"pause":n.pause()}},pauseInvisible:{visProp:null,init:function(){var e=["webkit","moz","ms","o"];if("hidden"in document)return"hidden";for(var t=0;t<e.length;t++)e[t]+"Hidden"in document&&(v.pauseInvisible.visProp=e[t]+"Hidden");if(v.pauseInvisible.visProp){var n=v.pauseInvisible.visProp.replace(/[H|h]idden/,"")+"visibilitychange";document.addEventListener(n,function(){v.pauseInvisible.isHidden()?r.startTimeout?clearTimeout(r.startTimeout):r.pause():r.started?r.play():r.vars.initDelay>0?setTimeout(r.play,r.vars.initDelay):r.play()})}},isHidden:function(){return document[v.pauseInvisible.visProp]||!1}},setToClearWatchedEvent:function(){clearTimeout(f);f=setTimeout(function(){a=""},3e3)}};r.flexAnimate=function(t,n,s,u,a){!r.vars.animationLoop&&t!==r.currentSlide&&(r.direction=t>r.currentSlide?"next":"prev");d&&r.pagingCount===1&&(r.direction=r.currentItem<t?"next":"prev");if(!r.animating&&(r.canAdvance(t,a)||s)&&r.is(":visible")){if(d&&u){var f=e(r.vars.asNavFor).data("flexslider");r.atEnd=t===0||t===r.count-1;f.flexAnimate(t,!0,!1,!0,a);r.direction=r.currentItem<t?"next":"prev";f.direction=r.direction;if(Math.ceil((t+1)/r.visible)-1===r.currentSlide||t===0){r.currentItem=t;r.slides.removeClass(i+"active-slide").eq(t).addClass(i+"active-slide");return!1}r.currentItem=t;r.slides.removeClass(i+"active-slide").eq(t).addClass(i+"active-slide");t=Math.floor(t/r.visible)}r.animating=!0;r.animatingTo=t;n&&r.pause();r.vars.before(r);r.syncExists&&!a&&v.sync("animate");r.vars.controlNav&&v.controlNav.active();h||r.slides.removeClass(i+"active-slide").eq(t).addClass(i+"active-slide");r.atEnd=t===0||t===r.last;r.vars.directionNav&&v.directionNav.update();if(t===r.last){r.vars.end(r);r.vars.animationLoop||r.pause()}if(!p){var m=l?r.slides.filter(":first").height():r.computedW,g,y,b;if(h){g=r.vars.itemMargin;b=(r.itemW+g)*r.move*r.animatingTo;y=b>r.limit&&r.visible!==1?r.limit:b}else r.currentSlide===0&&t===r.count-1&&r.vars.animationLoop&&r.direction!=="next"?y=c?(r.count+r.cloneOffset)*m:0:r.currentSlide===r.last&&t===0&&r.vars.animationLoop&&r.direction!=="prev"?y=c?0:(r.count+1)*m:y=c?(r.count-1-t+r.cloneOffset)*m:(t+r.cloneOffset)*m;r.setProps(y,"",r.vars.animationSpeed);if(r.transitions){if(!r.vars.animationLoop||!r.atEnd){r.animating=!1;r.currentSlide=r.animatingTo}r.container.unbind("webkitTransitionEnd transitionend");r.container.bind("webkitTransitionEnd transitionend",function(){r.wrapup(m)})}else r.container.animate(r.args,r.vars.animationSpeed,r.vars.easing,function(){r.wrapup(m)})}else if(!o){r.slides.eq(r.currentSlide).css({zIndex:1}).animate({opacity:0},r.vars.animationSpeed,r.vars.easing);r.slides.eq(t).css({zIndex:2}).animate({opacity:1},r.vars.animationSpeed,r.vars.easing,r.wrapup)}else{r.slides.eq(r.currentSlide).css({opacity:0,zIndex:1});r.slides.eq(t).css({opacity:1,zIndex:2});r.wrapup(m)}r.vars.smoothHeight&&v.smoothHeight(r.vars.animationSpeed)}};r.wrapup=function(e){!p&&!h&&(r.currentSlide===0&&r.animatingTo===r.last&&r.vars.animationLoop?r.setProps(e,"jumpEnd"):r.currentSlide===r.last&&r.animatingTo===0&&r.vars.animationLoop&&r.setProps(e,"jumpStart"));r.animating=!1;r.currentSlide=r.animatingTo;r.vars.after(r)};r.animateSlides=function(){!r.animating&&m&&r.flexAnimate(r.getTarget("next"))};r.pause=function(){clearInterval(r.animatedSlides);r.animatedSlides=null;r.playing=!1;r.vars.pausePlay&&v.pausePlay.update("play");r.syncExists&&v.sync("pause")};r.play=function(){r.playing&&clearInterval(r.animatedSlides);r.animatedSlides=r.animatedSlides||setInterval(r.animateSlides,r.vars.slideshowSpeed);r.started=r.playing=!0;r.vars.pausePlay&&v.pausePlay.update("pause");r.syncExists&&v.sync("play")};r.stop=function(){r.pause();r.stopped=!0};r.canAdvance=function(e,t){var n=d?r.pagingCount-1:r.last;return t?!0:d&&r.currentItem===r.count-1&&e===0&&r.direction==="prev"?!0:d&&r.currentItem===0&&e===r.pagingCount-1&&r.direction!=="next"?!1:e===r.currentSlide&&!d?!1:r.vars.animationLoop?!0:r.atEnd&&r.currentSlide===0&&e===n&&r.direction!=="next"?!1:r.atEnd&&r.currentSlide===n&&e===0&&r.direction==="next"?!1:!0};r.getTarget=function(e){r.direction=e;return e==="next"?r.currentSlide===r.last?0:r.currentSlide+1:r.currentSlide===0?r.last:r.currentSlide-1};r.setProps=function(e,t,n){var i=function(){var n=e?e:(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo,i=function(){if(h)return t==="setTouch"?e:c&&r.animatingTo===r.last?0:c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:r.animatingTo===r.last?r.limit:n;switch(t){case"setTotal":return c?(r.count-1-r.currentSlide+r.cloneOffset)*e:(r.currentSlide+r.cloneOffset)*e;case"setTouch":return c?e:e;case"jumpEnd":return c?e:r.count*e;case"jumpStart":return c?r.count*e:e;default:return e}}();return i*-1+"px"}();if(r.transitions){i=l?"translate3d(0,"+i+",0)":"translate3d("+i+",0,0)";n=n!==undefined?n/1e3+"s":"0s";r.container.css("-"+r.pfx+"-transition-duration",n)}r.args[r.prop]=i;(r.transitions||n===undefined)&&r.container.css(r.args)};r.setup=function(t){if(!p){var n,s;if(t==="init"){r.viewport=e('<div class="'+i+'viewport"></div>').css({overflow:"hidden",position:"relative"}).appendTo(r).append(r.container);r.cloneCount=0;r.cloneOffset=0;if(c){s=e.makeArray(r.slides).reverse();r.slides=e(s);r.container.empty().append(r.slides)}}if(r.vars.animationLoop&&!h){r.cloneCount=2;r.cloneOffset=1;t!=="init"&&r.container.find(".clone").remove();r.container.append(r.slides.first().clone().addClass("clone").attr("aria-hidden","true")).prepend(r.slides.last().clone().addClass("clone").attr("aria-hidden","true"))}r.newSlides=e(r.vars.selector,r);n=c?r.count-1-r.currentSlide+r.cloneOffset:r.currentSlide+r.cloneOffset;if(l&&!h){r.container.height((r.count+r.cloneCount)*200+"%").css("position","absolute").width("100%");setTimeout(function(){r.newSlides.css({display:"block"});r.doMath();r.viewport.height(r.h);r.setProps(n*r.h,"init")},t==="init"?100:0)}else{r.container.width((r.count+r.cloneCount)*200+"%");r.setProps(n*r.computedW,"init");setTimeout(function(){r.doMath();r.newSlides.css({width:r.computedW,"float":"left",display:"block"});r.vars.smoothHeight&&v.smoothHeight()},t==="init"?100:0)}}else{r.slides.css({width:"100%","float":"left",marginRight:"-100%",position:"relative"});t==="init"&&(o?r.slides.css({opacity:0,display:"block",webkitTransition:"opacity "+r.vars.animationSpeed/1e3+"s ease",zIndex:1}).eq(r.currentSlide).css({opacity:1,zIndex:2}):r.slides.css({opacity:0,display:"block",zIndex:1}).eq(r.currentSlide).css({zIndex:2}).animate({opacity:1},r.vars.animationSpeed,r.vars.easing));r.vars.smoothHeight&&v.smoothHeight()}h||r.slides.removeClass(i+"active-slide").eq(r.currentSlide).addClass(i+"active-slide")};r.doMath=function(){var e=r.slides.first(),t=r.vars.itemMargin,n=r.vars.minItems,i=r.vars.maxItems;r.w=r.viewport===undefined?r.width():r.viewport.width();r.h=e.height();r.boxPadding=e.outerWidth()-e.width();if(h){r.itemT=r.vars.itemWidth+t;r.minW=n?n*r.itemT:r.w;r.maxW=i?i*r.itemT-t:r.w;r.itemW=r.minW>r.w?(r.w-t*(n-1))/n:r.maxW<r.w?(r.w-t*(i-1))/i:r.vars.itemWidth>r.w?r.w:r.vars.itemWidth;r.visible=Math.floor(r.w/r.itemW);r.move=r.vars.move>0&&r.vars.move<r.visible?r.vars.move:r.visible;r.pagingCount=Math.ceil((r.count-r.visible)/r.move+1);r.last=r.pagingCount-1;r.limit=r.pagingCount===1?0:r.vars.itemWidth>r.w?r.itemW*(r.count-1)+t*(r.count-1):(r.itemW+t)*r.count-r.w-t}else{r.itemW=r.w;r.pagingCount=r.count;r.last=r.count-1}r.computedW=r.itemW-r.boxPadding};r.update=function(e,t){r.doMath();if(!h){e<r.currentSlide?r.currentSlide+=1:e<=r.currentSlide&&e!==0&&(r.currentSlide-=1);r.animatingTo=r.currentSlide}if(r.vars.controlNav&&!r.manualControls)if(t==="add"&&!h||r.pagingCount>r.controlNav.length)v.controlNav.update("add");else if(t==="remove"&&!h||r.pagingCount<r.controlNav.length){if(h&&r.currentSlide>r.last){r.currentSlide-=1;r.animatingTo-=1}v.controlNav.update("remove",r.last)}r.vars.directionNav&&v.directionNav.update()};r.addSlide=function(t,n){var i=e(t);r.count+=1;r.last=r.count-1;l&&c?n!==undefined?r.slides.eq(r.count-n).after(i):r.container.prepend(i):n!==undefined?r.slides.eq(n).before(i):r.container.append(i);r.update(n,"add");r.slides=e(r.vars.selector+":not(.clone)",r);r.setup();r.vars.added(r)};r.removeSlide=function(t){var n=isNaN(t)?r.slides.index(e(t)):t;r.count-=1;r.last=r.count-1;isNaN(t)?e(t,r.slides).remove():l&&c?r.slides.eq(r.last).remove():r.slides.eq(t).remove();r.doMath();r.update(n,"remove");r.slides=e(r.vars.selector+":not(.clone)",r);r.setup();r.vars.removed(r)};v.init()};e(window).blur(function(e){focused=!1}).focus(function(e){focused=!0});e.flexslider.defaults={namespace:"flex-",selector:".slides > li",animation:"fade",easing:"swing",direction:"horizontal",reverse:!1,animationLoop:!0,smoothHeight:!1,startAt:0,slideshow:!0,slideshowSpeed:7e3,animationSpeed:600,initDelay:0,randomize:!1,thumbCaptions:!1,pauseOnAction:!0,pauseOnHover:!1,pauseInvisible:!0,useCSS:!0,touch:!0,video:!1,controlNav:!0,directionNav:!0,prevText:"Previous",nextText:"Next",keyboard:!0,multipleKeyboard:!1,mousewheel:!1,pausePlay:!1,pauseText:"Pause",playText:"Play",controlsContainer:"",manualControls:"",sync:"",asNavFor:"",itemWidth:0,itemMargin:0,minItems:1,maxItems:0,move:0,allowOneSlide:!0,start:function(){},before:function(){},after:function(){},end:function(){},added:function(){},removed:function(){}};e.fn.flexslider=function(t){t===undefined&&(t={});if(typeof t=="object")return this.each(function(){var n=e(this),r=t.selector?t.selector:".slides > li",i=n.find(r);if(i.length===1&&t.allowOneSlide===!0||i.length===0){i.fadeIn(400);t.start&&t.start(n)}else n.data("flexslider")===undefined&&new e.flexslider(this,t)});var n=e(this).data("flexslider");switch(t){case"play":n.play();break;case"pause":n.pause();break;case"stop":n.stop();break;case"next":n.flexAnimate(n.getTarget("next"),!0);break;case"prev":case"previous":n.flexAnimate(n.getTarget("prev"),!0);break;default:typeof t=="number"&&n.flexAnimate(t,!0)}}})(jQuery);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/flexslider-version/jquery.flexslider.js b/htmltest/sites/all/libraries/flexslider-version/jquery.flexslider.js
new file mode 100644
index 00000000..d5563d43
--- /dev/null
+++ b/htmltest/sites/all/libraries/flexslider-version/jquery.flexslider.js
@@ -0,0 +1,1128 @@
+/*
+ * jQuery FlexSlider v2.2.0
+ * Copyright 2012 WooThemes
+ * Contributing Author: Tyler Smith
+ */
+;
+(function ($) {
+
+  //FlexSlider: Object Instance
+  $.flexslider = function(el, options) {
+    var slider = $(el);
+
+    // making variables public
+    slider.vars = $.extend({}, $.flexslider.defaults, options);
+
+    var namespace = slider.vars.namespace,
+        msGesture = window.navigator && window.navigator.msPointerEnabled && window.MSGesture,
+        touch = (( "ontouchstart" in window ) || msGesture || window.DocumentTouch && document instanceof DocumentTouch) && slider.vars.touch,
+        // depricating this idea, as devices are being released with both of these events
+        //eventType = (touch) ? "touchend" : "click",
+        eventType = "click touchend MSPointerUp",
+        watchedEvent = "",
+        watchedEventClearTimer,
+        vertical = slider.vars.direction === "vertical",
+        reverse = slider.vars.reverse,
+        carousel = (slider.vars.itemWidth > 0),
+        fade = slider.vars.animation === "fade",
+        asNav = slider.vars.asNavFor !== "",
+        methods = {},
+        focused = true;
+
+    // Store a reference to the slider object
+    $.data(el, "flexslider", slider);
+
+    // Private slider methods
+    methods = {
+      init: function() {
+        slider.animating = false;
+        // Get current slide and make sure it is a number
+        slider.currentSlide = parseInt( ( slider.vars.startAt ? slider.vars.startAt : 0) );
+        if ( isNaN( slider.currentSlide ) ) slider.currentSlide = 0;
+        slider.animatingTo = slider.currentSlide;
+        slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last);
+        slider.containerSelector = slider.vars.selector.substr(0,slider.vars.selector.search(' '));
+        slider.slides = $(slider.vars.selector, slider);
+        slider.container = $(slider.containerSelector, slider);
+        slider.count = slider.slides.length;
+        // SYNC:
+        slider.syncExists = $(slider.vars.sync).length > 0;
+        // SLIDE:
+        if (slider.vars.animation === "slide") slider.vars.animation = "swing";
+        slider.prop = (vertical) ? "top" : "marginLeft";
+        slider.args = {};
+        // SLIDESHOW:
+        slider.manualPause = false;
+        slider.stopped = false;
+        //PAUSE WHEN INVISIBLE
+        slider.started = false;
+        slider.startTimeout = null;
+        // TOUCH/USECSS:
+        slider.transitions = !slider.vars.video && !fade && slider.vars.useCSS && (function() {
+          var obj = document.createElement('div'),
+              props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective'];
+          for (var i in props) {
+            if ( obj.style[ props[i] ] !== undefined ) {
+              slider.pfx = props[i].replace('Perspective','').toLowerCase();
+              slider.prop = "-" + slider.pfx + "-transform";
+              return true;
+            }
+          }
+          return false;
+        }());
+        // CONTROLSCONTAINER:
+        if (slider.vars.controlsContainer !== "") slider.controlsContainer = $(slider.vars.controlsContainer).length > 0 && $(slider.vars.controlsContainer);
+        // MANUAL:
+        if (slider.vars.manualControls !== "") slider.manualControls = $(slider.vars.manualControls).length > 0 && $(slider.vars.manualControls);
+
+        // RANDOMIZE:
+        if (slider.vars.randomize) {
+          slider.slides.sort(function() { return (Math.round(Math.random())-0.5); });
+          slider.container.empty().append(slider.slides);
+        }
+
+        slider.doMath();
+
+        // INIT
+        slider.setup("init");
+
+        // CONTROLNAV:
+        if (slider.vars.controlNav) methods.controlNav.setup();
+
+        // DIRECTIONNAV:
+        if (slider.vars.directionNav) methods.directionNav.setup();
+
+        // KEYBOARD:
+        if (slider.vars.keyboard && ($(slider.containerSelector).length === 1 || slider.vars.multipleKeyboard)) {
+          $(document).bind('keyup', function(event) {
+            var keycode = event.keyCode;
+            if (!slider.animating && (keycode === 39 || keycode === 37)) {
+              var target = (keycode === 39) ? slider.getTarget('next') :
+                           (keycode === 37) ? slider.getTarget('prev') : false;
+              slider.flexAnimate(target, slider.vars.pauseOnAction);
+            }
+          });
+        }
+        // MOUSEWHEEL:
+        if (slider.vars.mousewheel) {
+          slider.bind('mousewheel', function(event, delta, deltaX, deltaY) {
+            event.preventDefault();
+            var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev');
+            slider.flexAnimate(target, slider.vars.pauseOnAction);
+          });
+        }
+
+        // PAUSEPLAY
+        if (slider.vars.pausePlay) methods.pausePlay.setup();
+
+        //PAUSE WHEN INVISIBLE
+        if (slider.vars.slideshow && slider.vars.pauseInvisible) methods.pauseInvisible.init();
+
+        // SLIDSESHOW
+        if (slider.vars.slideshow) {
+          if (slider.vars.pauseOnHover) {
+            slider.hover(function() {
+              if (!slider.manualPlay && !slider.manualPause) slider.pause();
+            }, function() {
+              if (!slider.manualPause && !slider.manualPlay && !slider.stopped) slider.play();
+            });
+          }
+          // initialize animation
+          //If we're visible, or we don't use PageVisibility API
+          if(!slider.vars.pauseInvisible || !methods.pauseInvisible.isHidden()) {
+            (slider.vars.initDelay > 0) ? slider.startTimeout = setTimeout(slider.play, slider.vars.initDelay) : slider.play();
+          }
+        }
+
+        // ASNAV:
+        if (asNav) methods.asNav.setup();
+
+        // TOUCH
+        if (touch && slider.vars.touch) methods.touch();
+
+        // FADE&&SMOOTHHEIGHT || SLIDE:
+        if (!fade || (fade && slider.vars.smoothHeight)) $(window).bind("resize orientationchange focus", methods.resize);
+
+        slider.find("img").attr("draggable", "false");
+
+        // API: start() Callback
+        setTimeout(function(){
+          slider.vars.start(slider);
+        }, 200);
+      },
+      asNav: {
+        setup: function() {
+          slider.asNav = true;
+          slider.animatingTo = Math.floor(slider.currentSlide/slider.move);
+          slider.currentItem = slider.currentSlide;
+          slider.slides.removeClass(namespace + "active-slide").eq(slider.currentItem).addClass(namespace + "active-slide");
+          if(!msGesture){
+              slider.slides.click(function(e){
+                e.preventDefault();
+                var $slide = $(this),
+                    target = $slide.index();
+                var posFromLeft = $slide.offset().left - $(slider).scrollLeft(); // Find position of slide relative to left of slider container
+                if( posFromLeft <= 0 && $slide.hasClass( namespace + 'active-slide' ) ) {
+                  slider.flexAnimate(slider.getTarget("prev"), true);
+                } else if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass(namespace + "active-slide")) {
+                  slider.direction = (slider.currentItem < target) ? "next" : "prev";
+                  slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);
+                }
+              });
+          }else{
+              el._slider = slider;
+              slider.slides.each(function (){
+                  var that = this;
+                  that._gesture = new MSGesture();
+                  that._gesture.target = that;
+                  that.addEventListener("MSPointerDown", function (e){
+                      e.preventDefault();
+                      if(e.currentTarget._gesture)
+                          e.currentTarget._gesture.addPointer(e.pointerId);
+                  }, false);
+                  that.addEventListener("MSGestureTap", function (e){
+                      e.preventDefault();
+                      var $slide = $(this),
+                          target = $slide.index();
+                      if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass('active')) {
+                          slider.direction = (slider.currentItem < target) ? "next" : "prev";
+                          slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);
+                      }
+                  });
+              });
+          }
+        }
+      },
+      controlNav: {
+        setup: function() {
+          if (!slider.manualControls) {
+            methods.controlNav.setupPaging();
+          } else { // MANUALCONTROLS:
+            methods.controlNav.setupManual();
+          }
+        },
+        setupPaging: function() {
+          var type = (slider.vars.controlNav === "thumbnails") ? 'control-thumbs' : 'control-paging',
+              j = 1,
+              item,
+              slide;
+
+          slider.controlNavScaffold = $('<ol class="'+ namespace + 'control-nav ' + namespace + type + '"></ol>');
+
+          if (slider.pagingCount > 1) {
+            for (var i = 0; i < slider.pagingCount; i++) {
+              slide = slider.slides.eq(i);
+              item = (slider.vars.controlNav === "thumbnails") ? '<img src="' + slide.attr( 'data-thumb' ) + '"/>' : '<a>' + j + '</a>';
+              if ( 'thumbnails' === slider.vars.controlNav && true === slider.vars.thumbCaptions ) {
+                var captn = slide.attr( 'data-thumbcaption' );
+                if ( '' != captn && undefined != captn ) item += '<span class="' + namespace + 'caption">' + captn + '</span>';
+              }
+              slider.controlNavScaffold.append('<li>' + item + '</li>');
+              j++;
+            }
+          }
+
+          // CONTROLSCONTAINER:
+          (slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold);
+          methods.controlNav.set();
+
+          methods.controlNav.active();
+
+          slider.controlNavScaffold.delegate('a, img', eventType, function(event) {
+            event.preventDefault();
+
+            if (watchedEvent === "" || watchedEvent === event.type) {
+              var $this = $(this),
+                  target = slider.controlNav.index($this);
+
+              if (!$this.hasClass(namespace + 'active')) {
+                slider.direction = (target > slider.currentSlide) ? "next" : "prev";
+                slider.flexAnimate(target, slider.vars.pauseOnAction);
+              }
+            }
+
+            // setup flags to prevent event duplication
+            if (watchedEvent === "") {
+              watchedEvent = event.type;
+            }
+            methods.setToClearWatchedEvent();
+
+          });
+        },
+        setupManual: function() {
+          slider.controlNav = slider.manualControls;
+          methods.controlNav.active();
+
+          slider.controlNav.bind(eventType, function(event) {
+            event.preventDefault();
+
+            if (watchedEvent === "" || watchedEvent === event.type) {
+              var $this = $(this),
+                  target = slider.controlNav.index($this);
+
+              if (!$this.hasClass(namespace + 'active')) {
+                (target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev";
+                slider.flexAnimate(target, slider.vars.pauseOnAction);
+              }
+            }
+
+            // setup flags to prevent event duplication
+            if (watchedEvent === "") {
+              watchedEvent = event.type;
+            }
+            methods.setToClearWatchedEvent();
+          });
+        },
+        set: function() {
+          var selector = (slider.vars.controlNav === "thumbnails") ? 'img' : 'a';
+          slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider);
+        },
+        active: function() {
+          slider.controlNav.removeClass(namespace + "active").eq(slider.animatingTo).addClass(namespace + "active");
+        },
+        update: function(action, pos) {
+          if (slider.pagingCount > 1 && action === "add") {
+            slider.controlNavScaffold.append($('<li><a>' + slider.count + '</a></li>'));
+          } else if (slider.pagingCount === 1) {
+            slider.controlNavScaffold.find('li').remove();
+          } else {
+            slider.controlNav.eq(pos).closest('li').remove();
+          }
+          methods.controlNav.set();
+          (slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length) ? slider.update(pos, action) : methods.controlNav.active();
+        }
+      },
+      directionNav: {
+        setup: function() {
+          var directionNavScaffold = $('<ul class="' + namespace + 'direction-nav"><li><a class="' + namespace + 'prev" href="#">' + slider.vars.prevText + '</a></li><li><a class="' + namespace + 'next" href="#">' + slider.vars.nextText + '</a></li></ul>');
+
+          // CONTROLSCONTAINER:
+          if (slider.controlsContainer) {
+            $(slider.controlsContainer).append(directionNavScaffold);
+            slider.directionNav = $('.' + namespace + 'direction-nav li a', slider.controlsContainer);
+          } else {
+            slider.append(directionNavScaffold);
+            slider.directionNav = $('.' + namespace + 'direction-nav li a', slider);
+          }
+
+          methods.directionNav.update();
+
+          slider.directionNav.bind(eventType, function(event) {
+            event.preventDefault();
+            var target;
+
+            if (watchedEvent === "" || watchedEvent === event.type) {
+              target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev');
+              slider.flexAnimate(target, slider.vars.pauseOnAction);
+            }
+
+            // setup flags to prevent event duplication
+            if (watchedEvent === "") {
+              watchedEvent = event.type;
+            }
+            methods.setToClearWatchedEvent();
+          });
+        },
+        update: function() {
+          var disabledClass = namespace + 'disabled';
+          if (slider.pagingCount === 1) {
+            slider.directionNav.addClass(disabledClass).attr('tabindex', '-1');
+          } else if (!slider.vars.animationLoop) {
+            if (slider.animatingTo === 0) {
+              slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass).attr('tabindex', '-1');
+            } else if (slider.animatingTo === slider.last) {
+              slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass).attr('tabindex', '-1');
+            } else {
+              slider.directionNav.removeClass(disabledClass).removeAttr('tabindex');
+            }
+          } else {
+            slider.directionNav.removeClass(disabledClass).removeAttr('tabindex');
+          }
+        }
+      },
+      pausePlay: {
+        setup: function() {
+          var pausePlayScaffold = $('<div class="' + namespace + 'pauseplay"><a></a></div>');
+
+          // CONTROLSCONTAINER:
+          if (slider.controlsContainer) {
+            slider.controlsContainer.append(pausePlayScaffold);
+            slider.pausePlay = $('.' + namespace + 'pauseplay a', slider.controlsContainer);
+          } else {
+            slider.append(pausePlayScaffold);
+            slider.pausePlay = $('.' + namespace + 'pauseplay a', slider);
+          }
+
+          methods.pausePlay.update((slider.vars.slideshow) ? namespace + 'pause' : namespace + 'play');
+
+          slider.pausePlay.bind(eventType, function(event) {
+            event.preventDefault();
+
+            if (watchedEvent === "" || watchedEvent === event.type) {
+              if ($(this).hasClass(namespace + 'pause')) {
+                slider.manualPause = true;
+                slider.manualPlay = false;
+                slider.pause();
+              } else {
+                slider.manualPause = false;
+                slider.manualPlay = true;
+                slider.play();
+              }
+            }
+
+            // setup flags to prevent event duplication
+            if (watchedEvent === "") {
+              watchedEvent = event.type;
+            }
+            methods.setToClearWatchedEvent();
+          });
+        },
+        update: function(state) {
+          (state === "play") ? slider.pausePlay.removeClass(namespace + 'pause').addClass(namespace + 'play').html(slider.vars.playText) : slider.pausePlay.removeClass(namespace + 'play').addClass(namespace + 'pause').html(slider.vars.pauseText);
+        }
+      },
+      touch: function() {
+        var startX,
+          startY,
+          offset,
+          cwidth,
+          dx,
+          startT,
+          scrolling = false,
+          localX = 0,
+          localY = 0,
+          accDx = 0;
+
+        if(!msGesture){
+            el.addEventListener('touchstart', onTouchStart, false);
+
+            function onTouchStart(e) {
+              if (slider.animating) {
+                e.preventDefault();
+              } else if ( ( window.navigator.msPointerEnabled ) || e.touches.length === 1 ) {
+                slider.pause();
+                // CAROUSEL:
+                cwidth = (vertical) ? slider.h : slider. w;
+                startT = Number(new Date());
+                // CAROUSEL:
+
+                // Local vars for X and Y points.
+                localX = e.touches[0].pageX;
+                localY = e.touches[0].pageY;
+
+                offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
+                         (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
+                         (carousel && slider.currentSlide === slider.last) ? slider.limit :
+                         (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :
+                         (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
+                startX = (vertical) ? localY : localX;
+                startY = (vertical) ? localX : localY;
+
+                el.addEventListener('touchmove', onTouchMove, false);
+                el.addEventListener('touchend', onTouchEnd, false);
+              }
+            }
+
+            function onTouchMove(e) {
+              // Local vars for X and Y points.
+
+              localX = e.touches[0].pageX;
+              localY = e.touches[0].pageY;
+
+              dx = (vertical) ? startX - localY : startX - localX;
+              scrolling = (vertical) ? (Math.abs(dx) < Math.abs(localX - startY)) : (Math.abs(dx) < Math.abs(localY - startY));
+
+              var fxms = 500;
+
+              if ( ! scrolling || Number( new Date() ) - startT > fxms ) {
+                e.preventDefault();
+                if (!fade && slider.transitions) {
+                  if (!slider.vars.animationLoop) {
+                    dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1);
+                  }
+                  slider.setProps(offset + dx, "setTouch");
+                }
+              }
+            }
+
+            function onTouchEnd(e) {
+              // finish the touch by undoing the touch session
+              el.removeEventListener('touchmove', onTouchMove, false);
+
+              if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
+                var updateDx = (reverse) ? -dx : dx,
+                    target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');
+
+                if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {
+                  slider.flexAnimate(target, slider.vars.pauseOnAction);
+                } else {
+                  if (!fade) slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true);
+                }
+              }
+              el.removeEventListener('touchend', onTouchEnd, false);
+
+              startX = null;
+              startY = null;
+              dx = null;
+              offset = null;
+            }
+        }else{
+            el.style.msTouchAction = "none";
+            el._gesture = new MSGesture();
+            el._gesture.target = el;
+            el.addEventListener("MSPointerDown", onMSPointerDown, false);
+            el._slider = slider;
+            el.addEventListener("MSGestureChange", onMSGestureChange, false);
+            el.addEventListener("MSGestureEnd", onMSGestureEnd, false);
+
+            function onMSPointerDown(e){
+                e.stopPropagation();
+                if (slider.animating) {
+                    e.preventDefault();
+                }else{
+                    slider.pause();
+                    el._gesture.addPointer(e.pointerId);
+                    accDx = 0;
+                    cwidth = (vertical) ? slider.h : slider. w;
+                    startT = Number(new Date());
+                    // CAROUSEL:
+
+                    offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
+                        (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
+                            (carousel && slider.currentSlide === slider.last) ? slider.limit :
+                                (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :
+                                    (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
+                }
+            }
+
+            function onMSGestureChange(e) {
+                e.stopPropagation();
+                var slider = e.target._slider;
+                if(!slider){
+                    return;
+                }
+                var transX = -e.translationX,
+                    transY = -e.translationY;
+
+                //Accumulate translations.
+                accDx = accDx + ((vertical) ? transY : transX);
+                dx = accDx;
+                scrolling = (vertical) ? (Math.abs(accDx) < Math.abs(-transX)) : (Math.abs(accDx) < Math.abs(-transY));
+
+                if(e.detail === e.MSGESTURE_FLAG_INERTIA){
+                    setImmediate(function (){
+                        el._gesture.stop();
+                    });
+
+                    return;
+                }
+
+                if (!scrolling || Number(new Date()) - startT > 500) {
+                    e.preventDefault();
+                    if (!fade && slider.transitions) {
+                        if (!slider.vars.animationLoop) {
+                            dx = accDx / ((slider.currentSlide === 0 && accDx < 0 || slider.currentSlide === slider.last && accDx > 0) ? (Math.abs(accDx) / cwidth + 2) : 1);
+                        }
+                        slider.setProps(offset + dx, "setTouch");
+                    }
+                }
+            }
+
+            function onMSGestureEnd(e) {
+                e.stopPropagation();
+                var slider = e.target._slider;
+                if(!slider){
+                    return;
+                }
+                if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
+                    var updateDx = (reverse) ? -dx : dx,
+                        target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');
+
+                    if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {
+                        slider.flexAnimate(target, slider.vars.pauseOnAction);
+                    } else {
+                        if (!fade) slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true);
+                    }
+                }
+
+                startX = null;
+                startY = null;
+                dx = null;
+                offset = null;
+                accDx = 0;
+            }
+        }
+      },
+      resize: function() {
+        if (!slider.animating && slider.is(':visible')) {
+          if (!carousel) slider.doMath();
+
+          if (fade) {
+            // SMOOTH HEIGHT:
+            methods.smoothHeight();
+          } else if (carousel) { //CAROUSEL:
+            slider.slides.width(slider.computedW);
+            slider.update(slider.pagingCount);
+            slider.setProps();
+          }
+          else if (vertical) { //VERTICAL:
+            slider.viewport.height(slider.h);
+            slider.setProps(slider.h, "setTotal");
+          } else {
+            // SMOOTH HEIGHT:
+            if (slider.vars.smoothHeight) methods.smoothHeight();
+            slider.newSlides.width(slider.computedW);
+            slider.setProps(slider.computedW, "setTotal");
+          }
+        }
+      },
+      smoothHeight: function(dur) {
+        if (!vertical || fade) {
+          var $obj = (fade) ? slider : slider.viewport;
+          (dur) ? $obj.animate({"height": slider.slides.eq(slider.animatingTo).height()}, dur) : $obj.height(slider.slides.eq(slider.animatingTo).height());
+        }
+      },
+      sync: function(action) {
+        var $obj = $(slider.vars.sync).data("flexslider"),
+            target = slider.animatingTo;
+
+        switch (action) {
+          case "animate": $obj.flexAnimate(target, slider.vars.pauseOnAction, false, true); break;
+          case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break;
+          case "pause": $obj.pause(); break;
+        }
+      },
+      pauseInvisible: {
+        visProp: null,
+        init: function() {
+          var prefixes = ['webkit','moz','ms','o'];
+
+          if ('hidden' in document) return 'hidden';
+          for (var i = 0; i < prefixes.length; i++) {
+            if ((prefixes[i] + 'Hidden') in document) 
+            methods.pauseInvisible.visProp = prefixes[i] + 'Hidden';
+          }
+          if (methods.pauseInvisible.visProp) {
+            var evtname = methods.pauseInvisible.visProp.replace(/[H|h]idden/,'') + 'visibilitychange';
+            document.addEventListener(evtname, function() {
+              if (methods.pauseInvisible.isHidden()) {
+                if(slider.startTimeout) clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible
+                else slider.pause(); //Or just pause
+              }
+              else {
+                if(slider.started) slider.play(); //Initiated before, just play
+                else (slider.vars.initDelay > 0) ? setTimeout(slider.play, slider.vars.initDelay) : slider.play(); //Didn't init before: simply init or wait for it
+              }
+            });
+          }       
+        },
+        isHidden: function() {
+          return document[methods.pauseInvisible.visProp] || false;
+        }
+      },
+      setToClearWatchedEvent: function() {
+        clearTimeout(watchedEventClearTimer);
+        watchedEventClearTimer = setTimeout(function() {
+          watchedEvent = "";
+        }, 3000);
+      }
+    }
+
+    // public methods
+    slider.flexAnimate = function(target, pause, override, withSync, fromNav) {
+      if (!slider.vars.animationLoop && target !== slider.currentSlide) {
+        slider.direction = (target > slider.currentSlide) ? "next" : "prev";
+      }
+
+      if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev";
+
+      if (!slider.animating && (slider.canAdvance(target, fromNav) || override) && slider.is(":visible")) {
+        if (asNav && withSync) {
+          var master = $(slider.vars.asNavFor).data('flexslider');
+          slider.atEnd = target === 0 || target === slider.count - 1;
+          master.flexAnimate(target, true, false, true, fromNav);
+          slider.direction = (slider.currentItem < target) ? "next" : "prev";
+          master.direction = slider.direction;
+
+          if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) {
+            slider.currentItem = target;
+            slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
+            target = Math.floor(target/slider.visible);
+          } else {
+            slider.currentItem = target;
+            slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
+            return false;
+          }
+        }
+
+        slider.animating = true;
+        slider.animatingTo = target;
+
+        // SLIDESHOW:
+        if (pause) slider.pause();
+
+        // API: before() animation Callback
+        slider.vars.before(slider);
+
+        // SYNC:
+        if (slider.syncExists && !fromNav) methods.sync("animate");
+
+        // CONTROLNAV
+        if (slider.vars.controlNav) methods.controlNav.active();
+
+        // !CAROUSEL:
+        // CANDIDATE: slide active class (for add/remove slide)
+        if (!carousel) slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide');
+
+        // INFINITE LOOP:
+        // CANDIDATE: atEnd
+        slider.atEnd = target === 0 || target === slider.last;
+
+        // DIRECTIONNAV:
+        if (slider.vars.directionNav) methods.directionNav.update();
+
+        if (target === slider.last) {
+          // API: end() of cycle Callback
+          slider.vars.end(slider);
+          // SLIDESHOW && !INFINITE LOOP:
+          if (!slider.vars.animationLoop) slider.pause();
+        }
+
+        // SLIDE:
+        if (!fade) {
+          var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW,
+              margin, slideString, calcNext;
+
+          // INFINITE LOOP / REVERSE:
+          if (carousel) {
+            //margin = (slider.vars.itemWidth > slider.w) ? slider.vars.itemMargin * 2 : slider.vars.itemMargin;
+            margin = slider.vars.itemMargin;
+            calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo;
+            slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext;
+          } else if (slider.currentSlide === 0 && target === slider.count - 1 && slider.vars.animationLoop && slider.direction !== "next") {
+            slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0;
+          } else if (slider.currentSlide === slider.last && target === 0 && slider.vars.animationLoop && slider.direction !== "prev") {
+            slideString = (reverse) ? 0 : (slider.count + 1) * dimension;
+          } else {
+            slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension;
+          }
+          slider.setProps(slideString, "", slider.vars.animationSpeed);
+          if (slider.transitions) {
+            if (!slider.vars.animationLoop || !slider.atEnd) {
+              slider.animating = false;
+              slider.currentSlide = slider.animatingTo;
+            }
+            slider.container.unbind("webkitTransitionEnd transitionend");
+            slider.container.bind("webkitTransitionEnd transitionend", function() {
+              slider.wrapup(dimension);
+            });
+          } else {
+            slider.container.animate(slider.args, slider.vars.animationSpeed, slider.vars.easing, function(){
+              slider.wrapup(dimension);
+            });
+          }
+        } else { // FADE:
+          if (!touch) {
+            //slider.slides.eq(slider.currentSlide).fadeOut(slider.vars.animationSpeed, slider.vars.easing);
+            //slider.slides.eq(target).fadeIn(slider.vars.animationSpeed, slider.vars.easing, slider.wrapup);
+
+            slider.slides.eq(slider.currentSlide).css({"zIndex": 1}).animate({"opacity": 0}, slider.vars.animationSpeed, slider.vars.easing);
+            slider.slides.eq(target).css({"zIndex": 2}).animate({"opacity": 1}, slider.vars.animationSpeed, slider.vars.easing, slider.wrapup);
+
+          } else {
+            slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 });
+            slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 });
+            slider.wrapup(dimension);
+          }
+        }
+        // SMOOTH HEIGHT:
+        if (slider.vars.smoothHeight) methods.smoothHeight(slider.vars.animationSpeed);
+      }
+    }
+    slider.wrapup = function(dimension) {
+      // SLIDE:
+      if (!fade && !carousel) {
+        if (slider.currentSlide === 0 && slider.animatingTo === slider.last && slider.vars.animationLoop) {
+          slider.setProps(dimension, "jumpEnd");
+        } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && slider.vars.animationLoop) {
+          slider.setProps(dimension, "jumpStart");
+        }
+      }
+      slider.animating = false;
+      slider.currentSlide = slider.animatingTo;
+      // API: after() animation Callback
+      slider.vars.after(slider);
+    }
+
+    // SLIDESHOW:
+    slider.animateSlides = function() {
+      if (!slider.animating && focused ) slider.flexAnimate(slider.getTarget("next"));
+    }
+    // SLIDESHOW:
+    slider.pause = function() {
+      clearInterval(slider.animatedSlides);
+      slider.animatedSlides = null;
+      slider.playing = false;
+      // PAUSEPLAY:
+      if (slider.vars.pausePlay) methods.pausePlay.update("play");
+      // SYNC:
+      if (slider.syncExists) methods.sync("pause");
+    }
+    // SLIDESHOW:
+    slider.play = function() {
+      if (slider.playing) clearInterval(slider.animatedSlides);
+      slider.animatedSlides = slider.animatedSlides || setInterval(slider.animateSlides, slider.vars.slideshowSpeed);
+      slider.started = slider.playing = true;
+      // PAUSEPLAY:
+      if (slider.vars.pausePlay) methods.pausePlay.update("pause");
+      // SYNC:
+      if (slider.syncExists) methods.sync("play");
+    }
+    // STOP:
+    slider.stop = function () {
+      slider.pause();
+      slider.stopped = true;
+    }
+    slider.canAdvance = function(target, fromNav) {
+      // ASNAV:
+      var last = (asNav) ? slider.pagingCount - 1 : slider.last;
+      return (fromNav) ? true :
+             (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true :
+             (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false :
+             (target === slider.currentSlide && !asNav) ? false :
+             (slider.vars.animationLoop) ? true :
+             (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false :
+             (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false :
+             true;
+    }
+    slider.getTarget = function(dir) {
+      slider.direction = dir;
+      if (dir === "next") {
+        return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1;
+      } else {
+        return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1;
+      }
+    }
+
+    // SLIDE:
+    slider.setProps = function(pos, special, dur) {
+      var target = (function() {
+        var posCheck = (pos) ? pos : ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo,
+            posCalc = (function() {
+              if (carousel) {
+                return (special === "setTouch") ? pos :
+                       (reverse && slider.animatingTo === slider.last) ? 0 :
+                       (reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
+                       (slider.animatingTo === slider.last) ? slider.limit : posCheck;
+              } else {
+                switch (special) {
+                  case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos;
+                  case "setTouch": return (reverse) ? pos : pos;
+                  case "jumpEnd": return (reverse) ? pos : slider.count * pos;
+                  case "jumpStart": return (reverse) ? slider.count * pos : pos;
+                  default: return pos;
+                }
+              }
+            }());
+
+            return (posCalc * -1) + "px";
+          }());
+
+      if (slider.transitions) {
+        target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + target + ",0,0)";
+        dur = (dur !== undefined) ? (dur/1000) + "s" : "0s";
+        slider.container.css("-" + slider.pfx + "-transition-duration", dur);
+      }
+
+      slider.args[slider.prop] = target;
+      if (slider.transitions || dur === undefined) slider.container.css(slider.args);
+    }
+
+    slider.setup = function(type) {
+      // SLIDE:
+      if (!fade) {
+        var sliderOffset, arr;
+
+        if (type === "init") {
+          slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container);
+          // INFINITE LOOP:
+          slider.cloneCount = 0;
+          slider.cloneOffset = 0;
+          // REVERSE:
+          if (reverse) {
+            arr = $.makeArray(slider.slides).reverse();
+            slider.slides = $(arr);
+            slider.container.empty().append(slider.slides);
+          }
+        }
+        // INFINITE LOOP && !CAROUSEL:
+        if (slider.vars.animationLoop && !carousel) {
+          slider.cloneCount = 2;
+          slider.cloneOffset = 1;
+          // clear out old clones
+          if (type !== "init") slider.container.find('.clone').remove();
+          slider.container.append(slider.slides.first().clone().addClass('clone').attr('aria-hidden', 'true')).prepend(slider.slides.last().clone().addClass('clone').attr('aria-hidden', 'true'));
+        }
+        slider.newSlides = $(slider.vars.selector, slider);
+
+        sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset;
+        // VERTICAL:
+        if (vertical && !carousel) {
+          slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%");
+          setTimeout(function(){
+            slider.newSlides.css({"display": "block"});
+            slider.doMath();
+            slider.viewport.height(slider.h);
+            slider.setProps(sliderOffset * slider.h, "init");
+          }, (type === "init") ? 100 : 0);
+        } else {
+          slider.container.width((slider.count + slider.cloneCount) * 200 + "%");
+          slider.setProps(sliderOffset * slider.computedW, "init");
+          setTimeout(function(){
+            slider.doMath();
+            slider.newSlides.css({"width": slider.computedW, "float": "left", "display": "block"});
+            // SMOOTH HEIGHT:
+            if (slider.vars.smoothHeight) methods.smoothHeight();
+          }, (type === "init") ? 100 : 0);
+        }
+      } else { // FADE:
+        slider.slides.css({"width": "100%", "float": "left", "marginRight": "-100%", "position": "relative"});
+        if (type === "init") {
+          if (!touch) {
+            //slider.slides.eq(slider.currentSlide).fadeIn(slider.vars.animationSpeed, slider.vars.easing);
+            slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity": 1},slider.vars.animationSpeed,slider.vars.easing);
+          } else {
+            slider.slides.css({ "opacity": 0, "display": "block", "webkitTransition": "opacity " + slider.vars.animationSpeed / 1000 + "s ease", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2});
+          }
+        }
+        // SMOOTH HEIGHT:
+        if (slider.vars.smoothHeight) methods.smoothHeight();
+      }
+      // !CAROUSEL:
+      // CANDIDATE: active slide
+      if (!carousel) slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide");
+    }
+
+
+    slider.doMath = function() {
+      var slide = slider.slides.first(),
+          slideMargin = slider.vars.itemMargin,
+          minItems = slider.vars.minItems,
+          maxItems = slider.vars.maxItems;
+
+      slider.w = (slider.viewport===undefined) ? slider.width() : slider.viewport.width();
+      slider.h = slide.height();
+      slider.boxPadding = slide.outerWidth() - slide.width();
+
+      // CAROUSEL:
+      if (carousel) {
+        slider.itemT = slider.vars.itemWidth + slideMargin;
+        slider.minW = (minItems) ? minItems * slider.itemT : slider.w;
+        slider.maxW = (maxItems) ? (maxItems * slider.itemT) - slideMargin : slider.w;
+        slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * (minItems - 1)))/minItems :
+                       (slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1)))/maxItems :
+                       (slider.vars.itemWidth > slider.w) ? slider.w : slider.vars.itemWidth;
+
+        slider.visible = Math.floor(slider.w/(slider.itemW));
+        slider.move = (slider.vars.move > 0 && slider.vars.move < slider.visible ) ? slider.vars.move : slider.visible;
+        slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1);
+        slider.last =  slider.pagingCount - 1;
+        slider.limit = (slider.pagingCount === 1) ? 0 :
+                       (slider.vars.itemWidth > slider.w) ? (slider.itemW * (slider.count - 1)) + (slideMargin * (slider.count - 1)) : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin;
+      } else {
+        slider.itemW = slider.w;
+        slider.pagingCount = slider.count;
+        slider.last = slider.count - 1;
+      }
+      slider.computedW = slider.itemW - slider.boxPadding;
+    }
+
+
+    slider.update = function(pos, action) {
+      slider.doMath();
+
+      // update currentSlide and slider.animatingTo if necessary
+      if (!carousel) {
+        if (pos < slider.currentSlide) {
+          slider.currentSlide += 1;
+        } else if (pos <= slider.currentSlide && pos !== 0) {
+          slider.currentSlide -= 1;
+        }
+        slider.animatingTo = slider.currentSlide;
+      }
+
+      // update controlNav
+      if (slider.vars.controlNav && !slider.manualControls) {
+        if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) {
+          methods.controlNav.update("add");
+        } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) {
+          if (carousel && slider.currentSlide > slider.last) {
+            slider.currentSlide -= 1;
+            slider.animatingTo -= 1;
+          }
+          methods.controlNav.update("remove", slider.last);
+        }
+      }
+      // update directionNav
+      if (slider.vars.directionNav) methods.directionNav.update();
+
+    }
+
+    slider.addSlide = function(obj, pos) {
+      var $obj = $(obj);
+
+      slider.count += 1;
+      slider.last = slider.count - 1;
+
+      // append new slide
+      if (vertical && reverse) {
+        (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj);
+      } else {
+        (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj);
+      }
+
+      // update currentSlide, animatingTo, controlNav, and directionNav
+      slider.update(pos, "add");
+
+      // update slider.slides
+      slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
+      // re-setup the slider to accomdate new slide
+      slider.setup();
+
+      //FlexSlider: added() Callback
+      slider.vars.added(slider);
+    }
+    slider.removeSlide = function(obj) {
+      var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj;
+
+      // update count
+      slider.count -= 1;
+      slider.last = slider.count - 1;
+
+      // remove slide
+      if (isNaN(obj)) {
+        $(obj, slider.slides).remove();
+      } else {
+        (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove();
+      }
+
+      // update currentSlide, animatingTo, controlNav, and directionNav
+      slider.doMath();
+      slider.update(pos, "remove");
+
+      // update slider.slides
+      slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
+      // re-setup the slider to accomdate new slide
+      slider.setup();
+
+      // FlexSlider: removed() Callback
+      slider.vars.removed(slider);
+    }
+
+    //FlexSlider: Initialize
+    methods.init();
+  }
+
+  // Ensure the slider isn't focussed if the window loses focus.
+  $( window ).blur( function ( e ) {
+    focused = false;
+  }).focus( function ( e ) {
+    focused = true;
+  });
+
+  //FlexSlider: Default Settings
+  $.flexslider.defaults = {
+    namespace: "flex-",             //{NEW} String: Prefix string attached to the class of every element generated by the plugin
+    selector: ".slides > li",       //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril
+    animation: "fade",              //String: Select your animation type, "fade" or "slide"
+    easing: "swing",                //{NEW} String: Determines the easing method used in jQuery transitions. jQuery easing plugin is supported!
+    direction: "horizontal",        //String: Select the sliding direction, "horizontal" or "vertical"
+    reverse: false,                 //{NEW} Boolean: Reverse the animation direction
+    animationLoop: true,            //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end
+    smoothHeight: false,            //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode
+    startAt: 0,                     //Integer: The slide that the slider should start on. Array notation (0 = first slide)
+    slideshow: true,                //Boolean: Animate slider automatically
+    slideshowSpeed: 7000,           //Integer: Set the speed of the slideshow cycling, in milliseconds
+    animationSpeed: 600,            //Integer: Set the speed of animations, in milliseconds
+    initDelay: 0,                   //{NEW} Integer: Set an initialization delay, in milliseconds
+    randomize: false,               //Boolean: Randomize slide order
+    thumbCaptions: false,           //Boolean: Whether or not to put captions on thumbnails when using the "thumbnails" controlNav.
+
+    // Usability features
+    pauseOnAction: true,            //Boolean: Pause the slideshow when interacting with control elements, highly recommended.
+    pauseOnHover: false,            //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering
+    pauseInvisible: true,   		//{NEW} Boolean: Pause the slideshow when tab is invisible, resume when visible. Provides better UX, lower CPU usage.
+    useCSS: true,                   //{NEW} Boolean: Slider will use CSS3 transitions if available
+    touch: true,                    //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices
+    video: false,                   //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches
+
+    // Primary Controls
+    controlNav: true,               //Boolean: Create navigation for paging control of each clide? Note: Leave true for manualControls usage
+    directionNav: true,             //Boolean: Create navigation for previous/next navigation? (true/false)
+    prevText: "Previous",           //String: Set the text for the "previous" directionNav item
+    nextText: "Next",               //String: Set the text for the "next" directionNav item
+
+    // Secondary Navigation
+    keyboard: true,                 //Boolean: Allow slider navigating via keyboard left/right keys
+    multipleKeyboard: false,        //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present.
+    mousewheel: false,              //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel
+    pausePlay: false,               //Boolean: Create pause/play dynamic element
+    pauseText: "Pause",             //String: Set the text for the "pause" pausePlay item
+    playText: "Play",               //String: Set the text for the "play" pausePlay item
+
+    // Special properties
+    controlsContainer: "",          //{UPDATED} jQuery Object/Selector: Declare which container the navigation elements should be appended too. Default container is the FlexSlider element. Example use would be $(".flexslider-container"). Property is ignored if given element is not found.
+    manualControls: "",             //{UPDATED} jQuery Object/Selector: Declare custom control navigation. Examples would be $(".flex-control-nav li") or "#tabs-nav li img", etc. The number of elements in your controlNav should match the number of slides/tabs.
+    sync: "",                       //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care.
+    asNavFor: "",                   //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider
+
+    // Carousel Options
+    itemWidth: 0,                   //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding.
+    itemMargin: 0,                  //{NEW} Integer: Margin between carousel items.
+    minItems: 1,                    //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this.
+    maxItems: 0,                    //{NEW} Integer: Maxmimum number of carousel items that should be visible. Items will resize fluidly when above this limit.
+    move: 0,                        //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items.
+    allowOneSlide: true,           //{NEW} Boolean: Whether or not to allow a slider comprised of a single slide
+
+    // Callback API
+    start: function(){},            //Callback: function(slider) - Fires when the slider loads the first slide
+    before: function(){},           //Callback: function(slider) - Fires asynchronously with each slider animation
+    after: function(){},            //Callback: function(slider) - Fires after each slider animation completes
+    end: function(){},              //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous)
+    added: function(){},            //{NEW} Callback: function(slider) - Fires after a slide is added
+    removed: function(){}           //{NEW} Callback: function(slider) - Fires after a slide is removed
+  }
+
+
+  //FlexSlider: Plugin Function
+  $.fn.flexslider = function(options) {
+    if (options === undefined) options = {};
+
+    if (typeof options === "object") {
+      return this.each(function() {
+        var $this = $(this),
+            selector = (options.selector) ? options.selector : ".slides > li",
+            $slides = $this.find(selector);
+
+      if ( ( $slides.length === 1 && options.allowOneSlide === true ) || $slides.length === 0 ) {
+          $slides.fadeIn(400);
+          if (options.start) options.start($this);
+        } else if ($this.data('flexslider') === undefined) {
+          new $.flexslider(this, options);
+        }
+      });
+    } else {
+      // Helper strings to quickly perform functions on the slider
+      var $slider = $(this).data('flexslider');
+      switch (options) {
+        case "play": $slider.play(); break;
+        case "pause": $slider.pause(); break;
+        case "stop": $slider.stop(); break;
+        case "next": $slider.flexAnimate($slider.getTarget("next"), true); break;
+        case "prev":
+        case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break;
+        default: if (typeof options === "number") $slider.flexAnimate(options, true);
+      }
+    }
+  }
+})(jQuery);
diff --git a/htmltest/sites/all/libraries/fpdf_tpl b/htmltest/sites/all/libraries/fpdf_tpl
new file mode 120000
index 00000000..88e35df5
--- /dev/null
+++ b/htmltest/sites/all/libraries/fpdf_tpl
@@ -0,0 +1 @@
+fpdf_tpl-version
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/fpdf_tpl-version/fpdf_tpl.php b/htmltest/sites/all/libraries/fpdf_tpl-version/fpdf_tpl.php
new file mode 100644
index 00000000..86e38b71
--- /dev/null
+++ b/htmltest/sites/all/libraries/fpdf_tpl-version/fpdf_tpl.php
@@ -0,0 +1,460 @@
+<?php
+//
+//  FPDF_TPL - Version 1.2.3
+//
+//    Copyright 2004-2013 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+class FPDF_TPL extends FPDF {
+    /**
+     * Array of Tpl-Data
+     * @var array
+     */
+    var $tpls = array();
+
+    /**
+     * Current Template-ID
+     * @var int
+     */
+    var $tpl = 0;
+    
+    /**
+     * "In Template"-Flag
+     * @var boolean
+     */
+    var $_intpl = false;
+    
+    /**
+     * Nameprefix of Templates used in Resources-Dictonary
+     * @var string A String defining the Prefix used as Template-Object-Names. Have to beginn with an /
+     */
+    var $tplprefix = "/TPL";
+
+    /**
+     * Resources used By Templates and Pages
+     * @var array
+     */
+    var $_res = array();
+    
+    /**
+     * Last used Template data
+     *
+     * @var array
+     */
+    var $lastUsedTemplateData = array();
+    
+    /**
+     * Start a Template
+     *
+     * This method starts a template. You can give own coordinates to build an own sized
+     * Template. Pay attention, that the margins are adapted to the new templatesize.
+     * If you want to write outside the template, for example to build a clipped Template,
+     * you have to set the Margins and "Cursor"-Position manual after beginTemplate-Call.
+     *
+     * If no parameter is given, the template uses the current page-size.
+     * The Method returns an ID of the current Template. This ID is used later for using this template.
+     * Warning: A created Template is used in PDF at all events. Still if you don't use it after creation!
+     *
+     * @param int $x The x-coordinate given in user-unit
+     * @param int $y The y-coordinate given in user-unit
+     * @param int $w The width given in user-unit
+     * @param int $h The height given in user-unit
+     * @return int The ID of new created Template
+     */
+    function beginTemplate($x = null, $y = null, $w = null, $h = null) {
+    	if (is_subclass_of($this, 'TCPDF')) {
+    		$this->Error('This method is only usable with FPDF. Use TCPDF methods startTemplate() instead.');
+    		return;
+    	}
+    	
+        if ($this->page <= 0)
+            $this->error("You have to add a page to fpdf first!");
+
+        if ($x == null)
+            $x = 0;
+        if ($y == null)
+            $y = 0;
+        if ($w == null)
+            $w = $this->w;
+        if ($h == null)
+            $h = $this->h;
+
+        // Save settings
+        $this->tpl++;
+        $tpl =& $this->tpls[$this->tpl];
+        $tpl = array(
+            'o_x' => $this->x,
+            'o_y' => $this->y,
+            'o_AutoPageBreak' => $this->AutoPageBreak,
+            'o_bMargin' => $this->bMargin,
+            'o_tMargin' => $this->tMargin,
+            'o_lMargin' => $this->lMargin,
+            'o_rMargin' => $this->rMargin,
+            'o_h' => $this->h,
+            'o_w' => $this->w,
+            'o_FontFamily' => $this->FontFamily,
+            'o_FontStyle' => $this->FontStyle,
+            'o_FontSizePt' => $this->FontSizePt,
+            'o_FontSize' => $this->FontSize,
+            'buffer' => '',
+            'x' => $x,
+            'y' => $y,
+            'w' => $w,
+            'h' => $h
+        );
+
+        $this->SetAutoPageBreak(false);
+        
+        // Define own high and width to calculate possitions correct
+        $this->h = $h;
+        $this->w = $w;
+
+        $this->_intpl = true;
+        $this->SetXY($x + $this->lMargin, $y + $this->tMargin);
+        $this->SetRightMargin($this->w - $w + $this->rMargin);
+
+        if ($this->CurrentFont) {
+            $fontkey = $this->FontFamily . $this->FontStyle;
+		    $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey];
+            
+        	$this->_out(sprintf('BT /F%d %.2f Tf ET', $this->CurrentFont['i'], $this->FontSizePt));
+        }
+        
+        return $this->tpl;
+    }
+    
+    /**
+     * End Template
+     *
+     * This method ends a template and reset initiated variables on beginTemplate.
+     *
+     * @return mixed If a template is opened, the ID is returned. If not a false is returned.
+     */
+    function endTemplate() {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+        	return call_user_func_array(array($this, 'TCPDF::endTemplate'), $args);
+        }
+        
+        if ($this->_intpl) {
+            $this->_intpl = false; 
+            $tpl =& $this->tpls[$this->tpl];
+            $this->SetXY($tpl['o_x'], $tpl['o_y']);
+            $this->tMargin = $tpl['o_tMargin'];
+            $this->lMargin = $tpl['o_lMargin'];
+            $this->rMargin = $tpl['o_rMargin'];
+            $this->h = $tpl['o_h'];
+            $this->w = $tpl['o_w'];
+            $this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']);
+            
+            $this->FontFamily = $tpl['o_FontFamily'];
+			$this->FontStyle = $tpl['o_FontStyle'];
+			$this->FontSizePt = $tpl['o_FontSizePt'];
+			$this->FontSize = $tpl['o_FontSize'];
+        	
+			$fontkey = $this->FontFamily . $this->FontStyle;
+			if ($fontkey)
+            	$this->CurrentFont =& $this->fonts[$fontkey];
+            
+            return $this->tpl;
+        } else {
+            return false;
+        }
+    }
+    
+    /**
+     * Use a Template in current Page or other Template
+     *
+     * You can use a template in a page or in another template.
+     * You can give the used template a new size like you use the Image()-method.
+     * All parameters are optional. The width or height is calculated automaticaly
+     * if one is given. If no parameter is given the origin size as defined in
+     * beginTemplate() is used.
+     * The calculated or used width and height are returned as an array.
+     *
+     * @param int $tplidx A valid template-Id
+     * @param int $_x The x-position
+     * @param int $_y The y-position
+     * @param int $_w The new width of the template
+     * @param int $_h The new height of the template
+     * @retrun array The height and width of the template
+     */
+    function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0) {
+        if ($this->page <= 0)
+        	$this->error('You have to add a page first!');
+        
+        if (!isset($this->tpls[$tplidx]))
+            $this->error('Template does not exist!');
+            
+        if ($this->_intpl) {
+            $this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx];
+        }
+        
+        $tpl =& $this->tpls[$tplidx];
+        $w = $tpl['w'];
+        $h = $tpl['h'];
+        
+        if ($_x == null)
+            $_x = 0;
+        if ($_y == null)
+            $_y = 0;
+            
+        $_x += $tpl['x'];
+        $_y += $tpl['y'];
+        
+        $wh = $this->getTemplateSize($tplidx, $_w, $_h);
+        $_w = $wh['w'];
+        $_h = $wh['h'];
+    
+        $tData = array(
+            'x' => $this->x,
+            'y' => $this->y,
+            'w' => $_w,
+            'h' => $_h,
+            'scaleX' => ($_w / $w),
+            'scaleY' => ($_h / $h),
+            'tx' => $_x,
+            'ty' =>  ($this->h - $_y - $_h),
+            'lty' => ($this->h - $_y - $_h) - ($this->h - $h) * ($_h / $h)
+        );
+        
+        $this->_out(sprintf('q %.4F 0 0 %.4F %.4F %.4F cm', $tData['scaleX'], $tData['scaleY'], $tData['tx'] * $this->k, $tData['ty'] * $this->k)); // Translate 
+        $this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx));
+
+        $this->lastUsedTemplateData = $tData;
+        
+        return array('w' => $_w, 'h' => $_h);
+    }
+    
+    /**
+     * Get The calculated Size of a Template
+     *
+     * If one size is given, this method calculates the other one.
+     *
+     * @param int $tplidx A valid template-Id
+     * @param int $_w The width of the template
+     * @param int $_h The height of the template
+     * @return array The height and width of the template
+     */
+    function getTemplateSize($tplidx, $_w = 0, $_h = 0) {
+        if (!isset($this->tpls[$tplidx]))
+            return false;
+
+        $tpl =& $this->tpls[$tplidx];
+        $w = $tpl['w'];
+        $h = $tpl['h'];
+        
+        if ($_w == 0 and $_h == 0) {
+            $_w = $w;
+            $_h = $h;
+        }
+
+    	if($_w == 0)
+    		$_w = $_h * $w / $h;
+    	if($_h == 0)
+    		$_h = $_w * $h / $w;
+    		
+        return array("w" => $_w, "h" => $_h);
+    }
+    
+    /**
+     * See FPDF/TCPDF-Documentation ;-)
+     */
+    public function SetFont($family, $style = '', $size = 0) {
+        if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+        	return call_user_func_array(array($this, 'TCPDF::SetFont'), $args);
+        }
+        
+        parent::SetFont($family, $style, $size);
+       
+        $fontkey = $this->FontFamily . $this->FontStyle;
+        
+        if ($this->_intpl) {
+            $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey];
+        } else {
+            $this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey];
+        }
+    }
+    
+    /**
+     * See FPDF/TCPDF-Documentation ;-)
+     */
+    function Image(
+		$file, $x = '', $y = '', $w = 0, $h = 0, $type = '', $link = '', $align = '', $resize = false,
+		$dpi = 300, $palign = '', $ismask = false, $imgmask = false, $border = 0, $fitbox = false,
+		$hidden = false, $fitonpage = false, $alt = false, $altimgs = array()
+    ) {
+        if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::Image'), $args);
+        }
+        
+        $ret = parent::Image($file, $x, $y, $w, $h, $type, $link);
+        if ($this->_intpl) {
+            $this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file];
+        } else {
+            $this->_res['page'][$this->page]['images'][$file] =& $this->images[$file];
+        }
+        
+        return $ret;
+    }
+    
+    /**
+     * See FPDF-Documentation ;-)
+     *
+     * AddPage is not available when you're "in" a template.
+     */
+    function AddPage($orientation = '', $format = '', $keepmargins = false, $tocpage = false) {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+        	return call_user_func_array(array($this, 'TCPDF::AddPage'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Adding pages in templates isn\'t possible!');
+            
+        parent::AddPage($orientation, $format);
+    }
+
+    /**
+     * Preserve adding Links in Templates ...won't work
+     */
+    function Link($x, $y, $w, $h, $link, $spaces = 0) {
+        if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::Link'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Using links in templates aren\'t possible!');
+            
+        parent::Link($x, $y, $w, $h, $link);
+    }
+    
+    function AddLink() {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::AddLink'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Adding links in templates aren\'t possible!');
+        return parent::AddLink();
+    }
+    
+    function SetLink($link, $y = 0, $page = -1) {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::SetLink'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Setting links in templates aren\'t possible!');
+        parent::SetLink($link, $y, $page);
+    }
+    
+    /**
+     * Private Method that writes the form xobjects
+     */
+    function _putformxobjects() {
+        $filter=($this->compress) ? '/Filter /FlateDecode ' : '';
+	    reset($this->tpls);
+        foreach($this->tpls AS $tplidx => $tpl) {
+
+            $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer'];
+    		$this->_newobj();
+    		$this->tpls[$tplidx]['n'] = $this->n;
+    		$this->_out('<<'.$filter.'/Type /XObject');
+            $this->_out('/Subtype /Form');
+            $this->_out('/FormType 1');
+            $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]',
+                // llx
+                $tpl['x'] * $this->k,
+                // lly
+                -$tpl['y'] * $this->k,
+                // urx
+                ($tpl['w'] + $tpl['x']) * $this->k,
+                // ury
+                ($tpl['h'] - $tpl['y']) * $this->k
+            ));
+            
+            if ($tpl['x'] != 0 || $tpl['y'] != 0) {
+                $this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]',
+                     -$tpl['x'] * $this->k * 2, $tpl['y'] * $this->k * 2
+                ));
+            }
+            
+            $this->_out('/Resources ');
+
+            $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
+        	if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) {
+            	$this->_out('/Font <<');
+                foreach($this->_res['tpl'][$tplidx]['fonts'] as $font)
+            		$this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R');
+            	$this->_out('>>');
+            }
+        	if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || 
+        	   isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls']))
+        	{
+                $this->_out('/XObject <<');
+                if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) {
+                    foreach($this->_res['tpl'][$tplidx]['images'] as $image)
+              			$this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R');
+                }
+                if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) {
+                    foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl)
+                        $this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R');
+                }
+                $this->_out('>>');
+        	}
+        	$this->_out('>>');
+        	
+        	$this->_out('/Length ' . strlen($p) . ' >>');
+    		$this->_putstream($p);
+    		$this->_out('endobj');
+        }
+    }
+    
+    /**
+     * Overwritten to add _putformxobjects() after _putimages()
+     *
+     */
+    function _putimages() {
+        parent::_putimages();
+        $this->_putformxobjects();
+    }
+    
+    function _putxobjectdict() {
+        parent::_putxobjectdict();
+        
+        if (count($this->tpls)) {
+            foreach($this->tpls as $tplidx => $tpl) {
+                $this->_out(sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n']));
+            }
+        }
+    }
+
+    /**
+     * Private Method
+     */
+    function _out($s) {
+        if ($this->state == 2 && $this->_intpl) {
+            $this->tpls[$this->tpl]['buffer'] .= $s . "\n";
+        } else {
+            parent::_out($s);
+        }
+    }
+}
diff --git a/htmltest/sites/all/libraries/fpdi b/htmltest/sites/all/libraries/fpdi
new file mode 120000
index 00000000..69465ac4
--- /dev/null
+++ b/htmltest/sites/all/libraries/fpdi
@@ -0,0 +1 @@
+fpdi-version/
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/fpdi-version/1.4.4 b/htmltest/sites/all/libraries/fpdi-version/1.4.4
new file mode 100644
index 00000000..e69de29b
diff --git a/htmltest/sites/all/libraries/fpdi-version/filters/FilterASCII85.php b/htmltest/sites/all/libraries/fpdi-version/filters/FilterASCII85.php
new file mode 100644
index 00000000..a86c91ff
--- /dev/null
+++ b/htmltest/sites/all/libraries/fpdi-version/filters/FilterASCII85.php
@@ -0,0 +1,101 @@
+<?php
+//
+//  FPDI - Version 1.4.4
+//
+//    Copyright 2004-2013 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+if (!defined('ORD_z'))
+	define('ORD_z',ord('z'));
+if (!defined('ORD_exclmark'))
+	define('ORD_exclmark', ord('!'));
+if (!defined('ORD_u'))	
+	define('ORD_u', ord('u'));
+if (!defined('ORD_tilde'))
+	define('ORD_tilde', ord('~'));
+
+if (!class_exists('FilterASCII85', false)) {
+
+    class FilterASCII85 {
+        
+        function error($msg) {
+            die($msg);
+        }
+        
+        function decode($in) {
+            $out = '';
+            $state = 0;
+            $chn = null;
+            
+            $l = strlen($in);
+            
+            for ($k = 0; $k < $l; ++$k) {
+                $ch = ord($in[$k]) & 0xff;
+                
+                if ($ch == ORD_tilde) {
+                    break;
+                }
+                if (preg_match('/^\s$/',chr($ch))) {
+                    continue;
+                }
+                if ($ch == ORD_z && $state == 0) {
+                    $out .= chr(0) . chr(0) . chr(0) . chr(0);
+                    continue;
+                }
+                if ($ch < ORD_exclmark || $ch > ORD_u) {
+                    return $this->error('Illegal character in ASCII85Decode.');
+                }
+                
+                $chn[$state++] = $ch - ORD_exclmark;
+                
+                if ($state == 5) {
+                    $state = 0;
+                    $r = 0;
+                    for ($j = 0; $j < 5; ++$j)
+                        $r = $r * 85 + $chn[$j];
+                    $out .= chr($r >> 24);
+                    $out .= chr($r >> 16);
+                    $out .= chr($r >> 8);
+                    $out .= chr($r);
+                }
+            }
+            $r = 0;
+            
+            if ($state == 1)
+                return $this->error('Illegal length in ASCII85Decode.');
+            if ($state == 2) {
+                $r = $chn[0] * 85 * 85 * 85 * 85 + ($chn[1]+1) * 85 * 85 * 85;
+                $out .= chr($r >> 24);
+            }
+            else if ($state == 3) {
+                $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85  + ($chn[2]+1) * 85 * 85;
+                $out .= chr($r >> 24);
+                $out .= chr($r >> 16);
+            }
+            else if ($state == 4) {
+                $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85  + $chn[2] * 85 * 85  + ($chn[3]+1) * 85 ;
+                $out .= chr($r >> 24);
+                $out .= chr($r >> 16);
+                $out .= chr($r >> 8);
+            }
+    
+            return $out;
+        }
+        
+        function encode($in) {
+            return $this->error("ASCII85 encoding not implemented.");
+        }
+    }
+}
diff --git a/htmltest/sites/all/libraries/fpdi-version/filters/FilterASCII85_FPDI.php b/htmltest/sites/all/libraries/fpdi-version/filters/FilterASCII85_FPDI.php
new file mode 100644
index 00000000..03413ebf
--- /dev/null
+++ b/htmltest/sites/all/libraries/fpdi-version/filters/FilterASCII85_FPDI.php
@@ -0,0 +1,33 @@
+<?php
+//
+//  FPDI - Version 1.4.4
+//
+//    Copyright 2004-2013 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+require_once('FilterASCII85.php');
+
+class FilterASCII85_FPDI extends FilterASCII85 {
+
+    var $fpdi;
+    
+    function FilterASCII85_FPDI(&$fpdi) {
+        $this->fpdi =& $fpdi;
+    }
+
+    function error($msg) {
+        $this->fpdi->error($msg);
+    }
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/fpdi-version/filters/FilterLZW.php b/htmltest/sites/all/libraries/fpdi-version/filters/FilterLZW.php
new file mode 100644
index 00000000..d3d33332
--- /dev/null
+++ b/htmltest/sites/all/libraries/fpdi-version/filters/FilterLZW.php
@@ -0,0 +1,157 @@
+<?php
+//
+//  FPDI - Version 1.4.4
+//
+//    Copyright 2004-2013 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+if (!class_exists('FilterLZW', false)) {
+
+    class FilterLZW {
+        
+        var $sTable = array();
+        var $data = null;
+        var $dataLength = 0;
+        var $tIdx;
+        var $bitsToGet = 9;
+        var $bytePointer;
+        var $bitPointer;
+        var $nextData = 0;
+        var $nextBits = 0;
+        var $andTable = array(511, 1023, 2047, 4095);
+    
+        function error($msg) {
+            die($msg);
+        }
+        
+        /**
+         * Method to decode LZW compressed data.
+         *
+         * @param string data    The compressed data.
+         */
+        function decode($data) {
+    
+            if($data[0] == 0x00 && $data[1] == 0x01) {
+                $this->error('LZW flavour not supported.');
+            }
+    
+            $this->initsTable();
+    
+            $this->data = $data;
+            $this->dataLength = strlen($data);
+    
+            // Initialize pointers
+            $this->bytePointer = 0;
+            $this->bitPointer = 0;
+    
+            $this->nextData = 0;
+            $this->nextBits = 0;
+    
+            $oldCode = 0;
+    
+            $string = '';
+            $uncompData = '';
+    
+            while (($code = $this->getNextCode()) != 257) {
+                if ($code == 256) {
+                    $this->initsTable();
+                    $code = $this->getNextCode();
+    
+                    if ($code == 257) {
+                        break;
+                    }
+    
+                    $uncompData .= $this->sTable[$code];
+                    $oldCode = $code;
+    
+                } else {
+    
+                    if ($code < $this->tIdx) {
+                        $string = $this->sTable[$code];
+                        $uncompData .= $string;
+    
+                        $this->addStringToTable($this->sTable[$oldCode], $string[0]);
+                        $oldCode = $code;
+                    } else {
+                        $string = $this->sTable[$oldCode];
+                        $string = $string . $string[0];
+                        $uncompData .= $string;
+    
+                        $this->addStringToTable($string);
+                        $oldCode = $code;
+                    }
+                }
+            }
+            
+            return $uncompData;
+        }
+    
+    
+        /**
+         * Initialize the string table.
+         */
+        function initsTable() {
+            $this->sTable = array();
+    
+            for ($i = 0; $i < 256; $i++)
+                $this->sTable[$i] = chr($i);
+    
+            $this->tIdx = 258;
+            $this->bitsToGet = 9;
+        }
+    
+        /**
+         * Add a new string to the string table.
+         */
+        function addStringToTable ($oldString, $newString='') {
+            $string = $oldString.$newString;
+    
+            // Add this new String to the table
+            $this->sTable[$this->tIdx++] = $string;
+    
+            if ($this->tIdx == 511) {
+                $this->bitsToGet = 10;
+            } else if ($this->tIdx == 1023) {
+                $this->bitsToGet = 11;
+            } else if ($this->tIdx == 2047) {
+                $this->bitsToGet = 12;
+            }
+        }
+    
+        // Returns the next 9, 10, 11 or 12 bits
+        function getNextCode() {
+            if ($this->bytePointer == $this->dataLength) {
+                return 257;
+            }
+    
+            $this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff);
+            $this->nextBits += 8;
+    
+            if ($this->nextBits < $this->bitsToGet) {
+                $this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff);
+                $this->nextBits += 8;
+            }
+    
+            $code = ($this->nextData >> ($this->nextBits - $this->bitsToGet)) & $this->andTable[$this->bitsToGet-9];
+            $this->nextBits -= $this->bitsToGet;
+    
+            return $code;
+        }
+        
+        function encode($in) {
+            $this->error("LZW encoding not implemented.");
+        }
+    }
+}
diff --git a/htmltest/sites/all/libraries/fpdi-version/filters/FilterLZW_FPDI.php b/htmltest/sites/all/libraries/fpdi-version/filters/FilterLZW_FPDI.php
new file mode 100644
index 00000000..decc170b
--- /dev/null
+++ b/htmltest/sites/all/libraries/fpdi-version/filters/FilterLZW_FPDI.php
@@ -0,0 +1,33 @@
+<?php
+//
+//  FPDI - Version 1.4.4
+//
+//    Copyright 2004-2013 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+require_once('FilterLZW.php');
+
+class FilterLZW_FPDI extends FilterLZW {
+
+    var $fpdi;
+
+    function FilterLZW_FPDI(&$fpdi) {
+        $this->fpdi =& $fpdi;
+    }
+    
+    function error($msg) {
+        $this->fpdi->error($msg);
+    }
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/fpdi-version/fpdf_tpl.php b/htmltest/sites/all/libraries/fpdi-version/fpdf_tpl.php
new file mode 100644
index 00000000..86e38b71
--- /dev/null
+++ b/htmltest/sites/all/libraries/fpdi-version/fpdf_tpl.php
@@ -0,0 +1,460 @@
+<?php
+//
+//  FPDF_TPL - Version 1.2.3
+//
+//    Copyright 2004-2013 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+class FPDF_TPL extends FPDF {
+    /**
+     * Array of Tpl-Data
+     * @var array
+     */
+    var $tpls = array();
+
+    /**
+     * Current Template-ID
+     * @var int
+     */
+    var $tpl = 0;
+    
+    /**
+     * "In Template"-Flag
+     * @var boolean
+     */
+    var $_intpl = false;
+    
+    /**
+     * Nameprefix of Templates used in Resources-Dictonary
+     * @var string A String defining the Prefix used as Template-Object-Names. Have to beginn with an /
+     */
+    var $tplprefix = "/TPL";
+
+    /**
+     * Resources used By Templates and Pages
+     * @var array
+     */
+    var $_res = array();
+    
+    /**
+     * Last used Template data
+     *
+     * @var array
+     */
+    var $lastUsedTemplateData = array();
+    
+    /**
+     * Start a Template
+     *
+     * This method starts a template. You can give own coordinates to build an own sized
+     * Template. Pay attention, that the margins are adapted to the new templatesize.
+     * If you want to write outside the template, for example to build a clipped Template,
+     * you have to set the Margins and "Cursor"-Position manual after beginTemplate-Call.
+     *
+     * If no parameter is given, the template uses the current page-size.
+     * The Method returns an ID of the current Template. This ID is used later for using this template.
+     * Warning: A created Template is used in PDF at all events. Still if you don't use it after creation!
+     *
+     * @param int $x The x-coordinate given in user-unit
+     * @param int $y The y-coordinate given in user-unit
+     * @param int $w The width given in user-unit
+     * @param int $h The height given in user-unit
+     * @return int The ID of new created Template
+     */
+    function beginTemplate($x = null, $y = null, $w = null, $h = null) {
+    	if (is_subclass_of($this, 'TCPDF')) {
+    		$this->Error('This method is only usable with FPDF. Use TCPDF methods startTemplate() instead.');
+    		return;
+    	}
+    	
+        if ($this->page <= 0)
+            $this->error("You have to add a page to fpdf first!");
+
+        if ($x == null)
+            $x = 0;
+        if ($y == null)
+            $y = 0;
+        if ($w == null)
+            $w = $this->w;
+        if ($h == null)
+            $h = $this->h;
+
+        // Save settings
+        $this->tpl++;
+        $tpl =& $this->tpls[$this->tpl];
+        $tpl = array(
+            'o_x' => $this->x,
+            'o_y' => $this->y,
+            'o_AutoPageBreak' => $this->AutoPageBreak,
+            'o_bMargin' => $this->bMargin,
+            'o_tMargin' => $this->tMargin,
+            'o_lMargin' => $this->lMargin,
+            'o_rMargin' => $this->rMargin,
+            'o_h' => $this->h,
+            'o_w' => $this->w,
+            'o_FontFamily' => $this->FontFamily,
+            'o_FontStyle' => $this->FontStyle,
+            'o_FontSizePt' => $this->FontSizePt,
+            'o_FontSize' => $this->FontSize,
+            'buffer' => '',
+            'x' => $x,
+            'y' => $y,
+            'w' => $w,
+            'h' => $h
+        );
+
+        $this->SetAutoPageBreak(false);
+        
+        // Define own high and width to calculate possitions correct
+        $this->h = $h;
+        $this->w = $w;
+
+        $this->_intpl = true;
+        $this->SetXY($x + $this->lMargin, $y + $this->tMargin);
+        $this->SetRightMargin($this->w - $w + $this->rMargin);
+
+        if ($this->CurrentFont) {
+            $fontkey = $this->FontFamily . $this->FontStyle;
+		    $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey];
+            
+        	$this->_out(sprintf('BT /F%d %.2f Tf ET', $this->CurrentFont['i'], $this->FontSizePt));
+        }
+        
+        return $this->tpl;
+    }
+    
+    /**
+     * End Template
+     *
+     * This method ends a template and reset initiated variables on beginTemplate.
+     *
+     * @return mixed If a template is opened, the ID is returned. If not a false is returned.
+     */
+    function endTemplate() {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+        	return call_user_func_array(array($this, 'TCPDF::endTemplate'), $args);
+        }
+        
+        if ($this->_intpl) {
+            $this->_intpl = false; 
+            $tpl =& $this->tpls[$this->tpl];
+            $this->SetXY($tpl['o_x'], $tpl['o_y']);
+            $this->tMargin = $tpl['o_tMargin'];
+            $this->lMargin = $tpl['o_lMargin'];
+            $this->rMargin = $tpl['o_rMargin'];
+            $this->h = $tpl['o_h'];
+            $this->w = $tpl['o_w'];
+            $this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']);
+            
+            $this->FontFamily = $tpl['o_FontFamily'];
+			$this->FontStyle = $tpl['o_FontStyle'];
+			$this->FontSizePt = $tpl['o_FontSizePt'];
+			$this->FontSize = $tpl['o_FontSize'];
+        	
+			$fontkey = $this->FontFamily . $this->FontStyle;
+			if ($fontkey)
+            	$this->CurrentFont =& $this->fonts[$fontkey];
+            
+            return $this->tpl;
+        } else {
+            return false;
+        }
+    }
+    
+    /**
+     * Use a Template in current Page or other Template
+     *
+     * You can use a template in a page or in another template.
+     * You can give the used template a new size like you use the Image()-method.
+     * All parameters are optional. The width or height is calculated automaticaly
+     * if one is given. If no parameter is given the origin size as defined in
+     * beginTemplate() is used.
+     * The calculated or used width and height are returned as an array.
+     *
+     * @param int $tplidx A valid template-Id
+     * @param int $_x The x-position
+     * @param int $_y The y-position
+     * @param int $_w The new width of the template
+     * @param int $_h The new height of the template
+     * @retrun array The height and width of the template
+     */
+    function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0) {
+        if ($this->page <= 0)
+        	$this->error('You have to add a page first!');
+        
+        if (!isset($this->tpls[$tplidx]))
+            $this->error('Template does not exist!');
+            
+        if ($this->_intpl) {
+            $this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx];
+        }
+        
+        $tpl =& $this->tpls[$tplidx];
+        $w = $tpl['w'];
+        $h = $tpl['h'];
+        
+        if ($_x == null)
+            $_x = 0;
+        if ($_y == null)
+            $_y = 0;
+            
+        $_x += $tpl['x'];
+        $_y += $tpl['y'];
+        
+        $wh = $this->getTemplateSize($tplidx, $_w, $_h);
+        $_w = $wh['w'];
+        $_h = $wh['h'];
+    
+        $tData = array(
+            'x' => $this->x,
+            'y' => $this->y,
+            'w' => $_w,
+            'h' => $_h,
+            'scaleX' => ($_w / $w),
+            'scaleY' => ($_h / $h),
+            'tx' => $_x,
+            'ty' =>  ($this->h - $_y - $_h),
+            'lty' => ($this->h - $_y - $_h) - ($this->h - $h) * ($_h / $h)
+        );
+        
+        $this->_out(sprintf('q %.4F 0 0 %.4F %.4F %.4F cm', $tData['scaleX'], $tData['scaleY'], $tData['tx'] * $this->k, $tData['ty'] * $this->k)); // Translate 
+        $this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx));
+
+        $this->lastUsedTemplateData = $tData;
+        
+        return array('w' => $_w, 'h' => $_h);
+    }
+    
+    /**
+     * Get The calculated Size of a Template
+     *
+     * If one size is given, this method calculates the other one.
+     *
+     * @param int $tplidx A valid template-Id
+     * @param int $_w The width of the template
+     * @param int $_h The height of the template
+     * @return array The height and width of the template
+     */
+    function getTemplateSize($tplidx, $_w = 0, $_h = 0) {
+        if (!isset($this->tpls[$tplidx]))
+            return false;
+
+        $tpl =& $this->tpls[$tplidx];
+        $w = $tpl['w'];
+        $h = $tpl['h'];
+        
+        if ($_w == 0 and $_h == 0) {
+            $_w = $w;
+            $_h = $h;
+        }
+
+    	if($_w == 0)
+    		$_w = $_h * $w / $h;
+    	if($_h == 0)
+    		$_h = $_w * $h / $w;
+    		
+        return array("w" => $_w, "h" => $_h);
+    }
+    
+    /**
+     * See FPDF/TCPDF-Documentation ;-)
+     */
+    public function SetFont($family, $style = '', $size = 0) {
+        if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+        	return call_user_func_array(array($this, 'TCPDF::SetFont'), $args);
+        }
+        
+        parent::SetFont($family, $style, $size);
+       
+        $fontkey = $this->FontFamily . $this->FontStyle;
+        
+        if ($this->_intpl) {
+            $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey];
+        } else {
+            $this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey];
+        }
+    }
+    
+    /**
+     * See FPDF/TCPDF-Documentation ;-)
+     */
+    function Image(
+		$file, $x = '', $y = '', $w = 0, $h = 0, $type = '', $link = '', $align = '', $resize = false,
+		$dpi = 300, $palign = '', $ismask = false, $imgmask = false, $border = 0, $fitbox = false,
+		$hidden = false, $fitonpage = false, $alt = false, $altimgs = array()
+    ) {
+        if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::Image'), $args);
+        }
+        
+        $ret = parent::Image($file, $x, $y, $w, $h, $type, $link);
+        if ($this->_intpl) {
+            $this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file];
+        } else {
+            $this->_res['page'][$this->page]['images'][$file] =& $this->images[$file];
+        }
+        
+        return $ret;
+    }
+    
+    /**
+     * See FPDF-Documentation ;-)
+     *
+     * AddPage is not available when you're "in" a template.
+     */
+    function AddPage($orientation = '', $format = '', $keepmargins = false, $tocpage = false) {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+        	return call_user_func_array(array($this, 'TCPDF::AddPage'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Adding pages in templates isn\'t possible!');
+            
+        parent::AddPage($orientation, $format);
+    }
+
+    /**
+     * Preserve adding Links in Templates ...won't work
+     */
+    function Link($x, $y, $w, $h, $link, $spaces = 0) {
+        if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::Link'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Using links in templates aren\'t possible!');
+            
+        parent::Link($x, $y, $w, $h, $link);
+    }
+    
+    function AddLink() {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::AddLink'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Adding links in templates aren\'t possible!');
+        return parent::AddLink();
+    }
+    
+    function SetLink($link, $y = 0, $page = -1) {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::SetLink'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Setting links in templates aren\'t possible!');
+        parent::SetLink($link, $y, $page);
+    }
+    
+    /**
+     * Private Method that writes the form xobjects
+     */
+    function _putformxobjects() {
+        $filter=($this->compress) ? '/Filter /FlateDecode ' : '';
+	    reset($this->tpls);
+        foreach($this->tpls AS $tplidx => $tpl) {
+
+            $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer'];
+    		$this->_newobj();
+    		$this->tpls[$tplidx]['n'] = $this->n;
+    		$this->_out('<<'.$filter.'/Type /XObject');
+            $this->_out('/Subtype /Form');
+            $this->_out('/FormType 1');
+            $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]',
+                // llx
+                $tpl['x'] * $this->k,
+                // lly
+                -$tpl['y'] * $this->k,
+                // urx
+                ($tpl['w'] + $tpl['x']) * $this->k,
+                // ury
+                ($tpl['h'] - $tpl['y']) * $this->k
+            ));
+            
+            if ($tpl['x'] != 0 || $tpl['y'] != 0) {
+                $this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]',
+                     -$tpl['x'] * $this->k * 2, $tpl['y'] * $this->k * 2
+                ));
+            }
+            
+            $this->_out('/Resources ');
+
+            $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
+        	if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) {
+            	$this->_out('/Font <<');
+                foreach($this->_res['tpl'][$tplidx]['fonts'] as $font)
+            		$this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R');
+            	$this->_out('>>');
+            }
+        	if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || 
+        	   isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls']))
+        	{
+                $this->_out('/XObject <<');
+                if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) {
+                    foreach($this->_res['tpl'][$tplidx]['images'] as $image)
+              			$this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R');
+                }
+                if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) {
+                    foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl)
+                        $this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R');
+                }
+                $this->_out('>>');
+        	}
+        	$this->_out('>>');
+        	
+        	$this->_out('/Length ' . strlen($p) . ' >>');
+    		$this->_putstream($p);
+    		$this->_out('endobj');
+        }
+    }
+    
+    /**
+     * Overwritten to add _putformxobjects() after _putimages()
+     *
+     */
+    function _putimages() {
+        parent::_putimages();
+        $this->_putformxobjects();
+    }
+    
+    function _putxobjectdict() {
+        parent::_putxobjectdict();
+        
+        if (count($this->tpls)) {
+            foreach($this->tpls as $tplidx => $tpl) {
+                $this->_out(sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n']));
+            }
+        }
+    }
+
+    /**
+     * Private Method
+     */
+    function _out($s) {
+        if ($this->state == 2 && $this->_intpl) {
+            $this->tpls[$this->tpl]['buffer'] .= $s . "\n";
+        } else {
+            parent::_out($s);
+        }
+    }
+}
diff --git a/htmltest/sites/all/libraries/fpdi-version/fpdi b/htmltest/sites/all/libraries/fpdi-version/fpdi
new file mode 120000
index 00000000..1294554d
--- /dev/null
+++ b/htmltest/sites/all/libraries/fpdi-version/fpdi
@@ -0,0 +1 @@
+fpdi
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/fpdi-version/fpdi.php b/htmltest/sites/all/libraries/fpdi-version/fpdi.php
new file mode 100644
index 00000000..8cae46cf
--- /dev/null
+++ b/htmltest/sites/all/libraries/fpdi-version/fpdi.php
@@ -0,0 +1,588 @@
+<?php
+//
+//  FPDI - Version 1.4.4
+//
+//    Copyright 2004-2013 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+define('FPDI_VERSION', '1.4.4');
+
+// Check for TCPDF and remap TCPDF to FPDF
+if (class_exists('TCPDF', false)) {
+    require_once('fpdi2tcpdf_bridge.php');
+}
+
+require_once('fpdf_tpl.php');
+require_once('fpdi_pdf_parser.php');
+
+
+class FPDI extends FPDF_TPL {
+    /**
+     * Actual filename
+     * @var string
+     */
+    var $current_filename;
+
+    /**
+     * Parser-Objects
+     * @var array
+     */
+    var $parsers;
+    
+    /**
+     * Current parser
+     * @var object
+     */
+    var $current_parser;
+    
+    /**
+     * object stack
+     * @var array
+     */
+    var $_obj_stack;
+    
+    /**
+     * done object stack
+     * @var array
+     */
+    var $_don_obj_stack;
+
+    /**
+     * Current Object Id.
+     * @var integer
+     */
+    var $_current_obj_id;
+    
+    /**
+     * The name of the last imported page box
+     * @var string
+     */
+    var $lastUsedPageBox;
+    
+    /**
+     * Cache for imported pages/template ids
+     * @var array
+     */
+    var $_importedPages = array();
+    
+    /**
+     * Set a source-file
+     *
+     * @param string $filename a valid filename
+     * @return int number of available pages
+     */
+    function setSourceFile($filename) {
+        $this->current_filename = $filename;
+        
+        if (!isset($this->parsers[$filename]))
+            $this->parsers[$filename] = $this->_getPdfParser($filename);
+        $this->current_parser =& $this->parsers[$filename];
+        
+        return $this->parsers[$filename]->getPageCount();
+    }
+    
+    /**
+     * Returns a PDF parser object
+     *
+     * @param string $filename
+     * @return fpdi_pdf_parser
+     */
+    function _getPdfParser($filename) {
+    	return new fpdi_pdf_parser($filename, $this);
+    }
+    
+    /**
+     * Get the current PDF version
+     *
+     * @return string
+     */
+    function getPDFVersion() {
+		return $this->PDFVersion;
+	}
+    
+	/**
+     * Set the PDF version
+     *
+     * @return string
+     */
+	function setPDFVersion($version = '1.3') {
+		$this->PDFVersion = $version;
+	}
+	
+    /**
+     * Import a page
+     *
+     * @param int $pageno pagenumber
+     * @return int Index of imported page - to use with fpdf_tpl::useTemplate()
+     */
+    function importPage($pageno, $boxName = '/CropBox') {
+        if ($this->_intpl) {
+            return $this->error('Please import the desired pages before creating a new template.');
+        }
+        
+        $fn = $this->current_filename;
+        
+        // check if page already imported
+        $pageKey = $fn . '-' . ((int)$pageno) . $boxName;
+        if (isset($this->_importedPages[$pageKey]))
+            return $this->_importedPages[$pageKey];
+        
+        $parser =& $this->parsers[$fn];
+        $parser->setPageno($pageno);
+
+        if (!in_array($boxName, $parser->availableBoxes))
+            return $this->Error(sprintf('Unknown box: %s', $boxName));
+            
+        $pageboxes = $parser->getPageBoxes($pageno, $this->k);
+        
+        /**
+         * MediaBox
+         * CropBox: Default -> MediaBox
+         * BleedBox: Default -> CropBox
+         * TrimBox: Default -> CropBox
+         * ArtBox: Default -> CropBox
+         */
+        if (!isset($pageboxes[$boxName]) && ($boxName == '/BleedBox' || $boxName == '/TrimBox' || $boxName == '/ArtBox'))
+            $boxName = '/CropBox';
+        if (!isset($pageboxes[$boxName]) && $boxName == '/CropBox')
+            $boxName = '/MediaBox';
+        
+        if (!isset($pageboxes[$boxName]))
+            return false;
+            
+        $this->lastUsedPageBox = $boxName;
+        
+        $box = $pageboxes[$boxName];
+        
+        $this->tpl++;
+        $this->tpls[$this->tpl] = array();
+        $tpl =& $this->tpls[$this->tpl];
+        $tpl['parser'] =& $parser;
+        $tpl['resources'] = $parser->getPageResources();
+        $tpl['buffer'] = $parser->getContent();
+        $tpl['box'] = $box;
+        
+        // To build an array that can be used by PDF_TPL::useTemplate()
+        $this->tpls[$this->tpl] = array_merge($this->tpls[$this->tpl], $box);
+        
+        // An imported page will start at 0,0 everytime. Translation will be set in _putformxobjects()
+        $tpl['x'] = 0;
+        $tpl['y'] = 0;
+        
+        // handle rotated pages
+        $rotation = $parser->getPageRotation($pageno);
+        $tpl['_rotationAngle'] = 0;
+        if (isset($rotation[1]) && ($angle = $rotation[1] % 360) != 0) {
+        	$steps = $angle / 90;
+                
+            $_w = $tpl['w'];
+            $_h = $tpl['h'];
+            $tpl['w'] = $steps % 2 == 0 ? $_w : $_h;
+            $tpl['h'] = $steps % 2 == 0 ? $_h : $_w;
+            
+            if ($angle < 0)
+            	$angle += 360;
+            
+        	$tpl['_rotationAngle'] = $angle * -1;
+        }
+        
+        $this->_importedPages[$pageKey] = $this->tpl;
+        
+        return $this->tpl;
+    }
+    
+    /**
+     * Returns the last used page box
+     *
+     * @return string
+     */
+    function getLastUsedPageBox() {
+        return $this->lastUsedPageBox;
+    }
+    
+    
+    function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0, $adjustPageSize = false) {
+        if ($adjustPageSize == true && is_null($_x) && is_null($_y)) {
+            $size = $this->getTemplateSize($tplidx, $_w, $_h);
+            $orientation = $size['w'] > $size['h'] ? 'L' : 'P';
+            $size = array($size['w'], $size['h']);
+            
+            if (is_subclass_of($this, 'TCPDF')) {
+            	$this->setPageFormat($size, $orientation);
+            } else {
+            	$size = $this->_getpagesize($size);
+            	
+            	if($orientation!=$this->CurOrientation || $size[0]!=$this->CurPageSize[0] || $size[1]!=$this->CurPageSize[1])
+				{
+					// New size or orientation
+					if($orientation=='P')
+					{
+						$this->w = $size[0];
+						$this->h = $size[1];
+					}
+					else
+					{
+						$this->w = $size[1];
+						$this->h = $size[0];
+					}
+					$this->wPt = $this->w*$this->k;
+					$this->hPt = $this->h*$this->k;
+					$this->PageBreakTrigger = $this->h-$this->bMargin;
+					$this->CurOrientation = $orientation;
+					$this->CurPageSize = $size;
+					$this->PageSizes[$this->page] = array($this->wPt, $this->hPt);
+				}
+            } 
+        }
+        
+        $this->_out('q 0 J 1 w 0 j 0 G 0 g'); // reset standard values
+        $s = parent::useTemplate($tplidx, $_x, $_y, $_w, $_h);
+        $this->_out('Q');
+        
+        return $s;
+    }
+    
+    /**
+     * Private method, that rebuilds all needed objects of source files
+     */
+    function _putimportedobjects() {
+        if (is_array($this->parsers) && count($this->parsers) > 0) {
+            foreach($this->parsers AS $filename => $p) {
+                $this->current_parser =& $this->parsers[$filename];
+                if (isset($this->_obj_stack[$filename]) && is_array($this->_obj_stack[$filename])) {
+                    while(($n = key($this->_obj_stack[$filename])) !== null) {
+                        $nObj = $this->current_parser->pdf_resolve_object($this->current_parser->c, $this->_obj_stack[$filename][$n][1]);
+						
+                        $this->_newobj($this->_obj_stack[$filename][$n][0]);
+                        
+                        if ($nObj[0] == PDF_TYPE_STREAM) {
+							$this->pdf_write_value($nObj);
+                        } else {
+                            $this->pdf_write_value($nObj[1]);
+                        }
+                        
+                        $this->_out('endobj');
+                        $this->_obj_stack[$filename][$n] = null; // free memory
+                        unset($this->_obj_stack[$filename][$n]);
+                        reset($this->_obj_stack[$filename]);
+                    }
+                }
+            }
+        }
+    }
+    
+    
+    /**
+     * Private Method that writes the form xobjects
+     */
+    function _putformxobjects() {
+        $filter=($this->compress) ? '/Filter /FlateDecode ' : '';
+	    reset($this->tpls);
+        foreach($this->tpls AS $tplidx => $tpl) {
+            $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer'];
+    		$this->_newobj();
+    		$cN = $this->n; // TCPDF/Protection: rem current "n"
+    		
+    		$this->tpls[$tplidx]['n'] = $this->n;
+    		$this->_out('<<' . $filter . '/Type /XObject');
+            $this->_out('/Subtype /Form');
+            $this->_out('/FormType 1');
+            
+            $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]', 
+                (isset($tpl['box']['llx']) ? $tpl['box']['llx'] : $tpl['x']) * $this->k,
+                (isset($tpl['box']['lly']) ? $tpl['box']['lly'] : -$tpl['y']) * $this->k,
+                (isset($tpl['box']['urx']) ? $tpl['box']['urx'] : $tpl['w'] + $tpl['x']) * $this->k,
+                (isset($tpl['box']['ury']) ? $tpl['box']['ury'] : $tpl['h'] - $tpl['y']) * $this->k
+            ));
+            
+            $c = 1;
+            $s = 0;
+            $tx = 0;
+            $ty = 0;
+            
+            if (isset($tpl['box'])) {
+                $tx = -$tpl['box']['llx'];
+                $ty = -$tpl['box']['lly']; 
+                
+                if ($tpl['_rotationAngle'] <> 0) {
+                    $angle = $tpl['_rotationAngle'] * M_PI/180;
+                    $c=cos($angle);
+                    $s=sin($angle);
+                    
+                    switch($tpl['_rotationAngle']) {
+                        case -90:
+                           $tx = -$tpl['box']['lly'];
+                           $ty = $tpl['box']['urx'];
+                           break;
+                        case -180:
+                            $tx = $tpl['box']['urx'];
+                            $ty = $tpl['box']['ury'];
+                            break;
+                        case -270:
+                        	$tx = $tpl['box']['ury'];
+                            $ty = -$tpl['box']['llx'];
+                            break;
+                    }
+                }
+            } elseif ($tpl['x'] != 0 || $tpl['y'] != 0) {
+                $tx = -$tpl['x'] * 2;
+                $ty = $tpl['y'] * 2;
+            }
+            
+            $tx *= $this->k;
+            $ty *= $this->k;
+            
+            if ($c != 1 || $s != 0 || $tx != 0 || $ty != 0) {
+                $this->_out(sprintf('/Matrix [%.5F %.5F %.5F %.5F %.5F %.5F]',
+                    $c, $s, -$s, $c, $tx, $ty
+                ));
+            }
+            
+            $this->_out('/Resources ');
+
+            if (isset($tpl['resources'])) {
+                $this->current_parser =& $tpl['parser'];
+                $this->pdf_write_value($tpl['resources']); // "n" will be changed
+            } else {
+                $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
+            	if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) {
+                	$this->_out('/Font <<');
+                    foreach($this->_res['tpl'][$tplidx]['fonts'] as $font)
+                		$this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R');
+                	$this->_out('>>');
+                }
+            	if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || 
+            	   isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls']))
+            	{
+                    $this->_out('/XObject <<');
+                    if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) {
+                        foreach($this->_res['tpl'][$tplidx]['images'] as $image)
+                  			$this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R');
+                    }
+                    if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) {
+                        foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl)
+                            $this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R');
+                    }
+                    $this->_out('>>');
+            	}
+            	$this->_out('>>');
+            }
+            
+            $this->_out('/Group <</Type/Group/S/Transparency>>');
+            
+            $nN = $this->n; // TCPDF: rem new "n"
+            $this->n = $cN; // TCPDF: reset to current "n"
+            if (is_subclass_of($this, 'TCPDF')) {
+            	$p = $this->_getrawstream($p);
+            	$this->_out('/Length ' . strlen($p) . ' >>');
+            	$this->_out("stream\n" . $p . "\nendstream");
+            } else {
+	            $this->_out('/Length ' . strlen($p) . ' >>');
+	    		$this->_putstream($p);
+            }
+    		$this->_out('endobj');
+    		$this->n = $nN; // TCPDF: reset to new "n"
+        }
+        
+        $this->_putimportedobjects();
+    }
+
+    /**
+     * Rewritten to handle existing own defined objects
+     */
+    function _newobj($obj_id = false, $onlynewobj = false) {
+        if (!$obj_id) {
+            $obj_id = ++$this->n;
+        }
+
+        //Begin a new object
+        if (!$onlynewobj) {
+            $this->offsets[$obj_id] = is_subclass_of($this, 'TCPDF') ? $this->bufferlen : strlen($this->buffer);
+            $this->_out($obj_id . ' 0 obj');
+            $this->_current_obj_id = $obj_id; // for later use with encryption
+        }
+        
+        return $obj_id;
+    }
+
+    /**
+     * Writes a value
+     * Needed to rebuild the source document
+     *
+     * @param mixed $value A PDF-Value. Structure of values see cases in this method
+     */
+    function pdf_write_value(&$value)
+    {
+        if (is_subclass_of($this, 'TCPDF')) {
+            parent::pdf_write_value($value);
+        }
+        
+        switch ($value[0]) {
+
+    		case PDF_TYPE_TOKEN:
+                $this->_straightOut($value[1] . ' ');
+    			break;
+		    case PDF_TYPE_NUMERIC:
+    		case PDF_TYPE_REAL:
+                if (is_float($value[1]) && $value[1] != 0) {
+    			    $this->_straightOut(rtrim(rtrim(sprintf('%F', $value[1]), '0'), '.') . ' ');
+    			} else {
+        			$this->_straightOut($value[1] . ' ');
+    			}
+    			break;
+    			
+    		case PDF_TYPE_ARRAY:
+
+    			// An array. Output the proper
+    			// structure and move on.
+
+    			$this->_straightOut('[');
+                for ($i = 0; $i < count($value[1]); $i++) {
+    				$this->pdf_write_value($value[1][$i]);
+    			}
+
+    			$this->_out(']');
+    			break;
+
+    		case PDF_TYPE_DICTIONARY:
+
+    			// A dictionary.
+    			$this->_straightOut('<<');
+
+    			reset ($value[1]);
+
+    			while (list($k, $v) = each($value[1])) {
+    				$this->_straightOut($k . ' ');
+    				$this->pdf_write_value($v);
+    			}
+
+    			$this->_straightOut('>>');
+    			break;
+
+    		case PDF_TYPE_OBJREF:
+
+    			// An indirect object reference
+    			// Fill the object stack if needed
+    			$cpfn =& $this->current_parser->filename;
+    			
+    			if (!isset($this->_don_obj_stack[$cpfn][$value[1]])) {
+    			    $this->_newobj(false, true);
+    			    $this->_obj_stack[$cpfn][$value[1]] = array($this->n, $value);
+                    $this->_don_obj_stack[$cpfn][$value[1]] = array($this->n, $value); // Value is maybee obsolete!!!
+                }
+                $objid = $this->_don_obj_stack[$cpfn][$value[1]][0];
+
+    			$this->_out($objid . ' 0 R');
+    			break;
+
+    		case PDF_TYPE_STRING:
+
+    			// A string.
+                $this->_straightOut('(' . $value[1] . ')');
+
+    			break;
+
+    		case PDF_TYPE_STREAM:
+
+    			// A stream. First, output the
+    			// stream dictionary, then the
+    			// stream data itself.
+                $this->pdf_write_value($value[1]);
+    			$this->_out('stream');
+    			$this->_out($value[2][1]);
+    			$this->_out('endstream');
+    			break;
+    			
+            case PDF_TYPE_HEX:
+                $this->_straightOut('<' . $value[1] . '>');
+                break;
+
+            case PDF_TYPE_BOOLEAN:
+    		    $this->_straightOut($value[1] ? 'true ' : 'false ');
+    		    break;
+            
+    		case PDF_TYPE_NULL:
+                // The null object.
+
+    			$this->_straightOut('null ');
+    			break;
+    	}
+    }
+    
+    
+    /**
+     * Modified so not each call will add a newline to the output.
+     */
+    function _straightOut($s) {
+        if (!is_subclass_of($this, 'TCPDF')) {
+            if($this->state==2)
+        		$this->pages[$this->page] .= $s;
+        	else
+        		$this->buffer .= $s;
+        } else {
+            if ($this->state == 2) {
+				if ($this->inxobj) {
+					// we are inside an XObject template
+					$this->xobjects[$this->xobjid]['outdata'] .= $s;
+				} elseif ((!$this->InFooter) AND isset($this->footerlen[$this->page]) AND ($this->footerlen[$this->page] > 0)) {
+					// puts data before page footer
+					$pagebuff = $this->getPageBuffer($this->page);
+					$page = substr($pagebuff, 0, -$this->footerlen[$this->page]);
+					$footer = substr($pagebuff, -$this->footerlen[$this->page]);
+					$this->setPageBuffer($this->page, $page.$s.$footer);
+					// update footer position
+					$this->footerpos[$this->page] += strlen($s);
+				} else {
+					// set page data
+					$this->setPageBuffer($this->page, $s, true);
+				}
+			} elseif ($this->state > 0) {
+				// set general data
+				$this->setBuffer($s);
+			}
+        }
+    }
+
+    /**
+     * rewritten to close opened parsers
+     *
+     */
+    function _enddoc() {
+        parent::_enddoc();
+        $this->_closeParsers();
+    }
+    
+    /**
+     * close all files opened by parsers
+     */
+    function _closeParsers() {
+        if ($this->state > 2 && count($this->parsers) > 0) {
+          	$this->cleanUp();
+            return true;
+        }
+        return false;
+    }
+    
+    /**
+     * Removes cylced references and closes the file handles of the parser objects
+     */
+    function cleanUp() {
+    	foreach ($this->parsers as $k => $_){
+        	$this->parsers[$k]->cleanUp();
+        	$this->parsers[$k] = null;
+        	unset($this->parsers[$k]);
+        }
+    }
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/fpdi-version/fpdi2tcpdf_bridge.php b/htmltest/sites/all/libraries/fpdi-version/fpdi2tcpdf_bridge.php
new file mode 100644
index 00000000..88c847fc
--- /dev/null
+++ b/htmltest/sites/all/libraries/fpdi-version/fpdi2tcpdf_bridge.php
@@ -0,0 +1,167 @@
+<?php
+//
+//  FPDI - Version 1.4.4
+//
+//    Copyright 2004-2013 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+/**
+ * This class is used as a bridge between TCPDF and FPDI
+ * and will create the possibility to use both FPDF and TCPDF
+ * via one FPDI version.
+ * 
+ * We'll simply remap TCPDF to FPDF again.
+ * 
+ * It'll be loaded and extended by FPDF_TPL.
+ */
+class FPDF extends TCPDF {
+    
+	function _putstream($s) {
+		$this->_out($this->_getstream($s));
+	}
+	
+	function _getxobjectdict() {
+        $out = parent::_getxobjectdict();
+        if (count($this->tpls)) {
+            foreach($this->tpls as $tplidx => $tpl) {
+                $out .= sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n']);
+            }
+        }
+        
+        return $out;
+    }
+	
+    /**
+     * Encryption of imported data by FPDI
+     *
+     * @param array $value
+     */
+    function pdf_write_value(&$value) {
+        switch ($value[0]) {
+    		case PDF_TYPE_STRING:
+				if ($this->encrypted) {
+				    $value[1] = $this->_unescape($value[1]);
+                    $value[1] = $this->_encrypt_data($this->_current_obj_id, $value[1]);
+                 	$value[1] = TCPDF_STATIC::_escape($value[1]);
+                } 
+    			break;
+    			
+			case PDF_TYPE_STREAM:
+			    if ($this->encrypted) {
+			        $value[2][1] = $this->_encrypt_data($this->_current_obj_id, $value[2][1]);
+			        $value[1][1]['/Length'] = array(
+                        PDF_TYPE_NUMERIC,
+                        strlen($value[2][1])
+                    );
+                }
+                break;
+                
+            case PDF_TYPE_HEX:
+            	if ($this->encrypted) {
+                	$value[1] = $this->hex2str($value[1]);
+                	$value[1] = $this->_encrypt_data($this->_current_obj_id, $value[1]);
+                    
+                	// remake hexstring of encrypted string
+    				$value[1] = $this->str2hex($value[1]);
+                }
+                break;
+    	}
+    }
+    
+    /**
+     * Unescapes a PDF string
+     *
+     * @param string $s
+     * @return string
+     */
+    function _unescape($s) {
+        $out = '';
+        for ($count = 0, $n = strlen($s); $count < $n; $count++) {
+            if ($s[$count] != '\\' || $count == $n-1) {
+                $out .= $s[$count];
+            } else {
+                switch ($s[++$count]) {
+                    case ')':
+                    case '(':
+                    case '\\':
+                        $out .= $s[$count];
+                        break;
+                    case 'f':
+                        $out .= chr(0x0C);
+                        break;
+                    case 'b':
+                        $out .= chr(0x08);
+                        break;
+                    case 't':
+                        $out .= chr(0x09);
+                        break;
+                    case 'r':
+                        $out .= chr(0x0D);
+                        break;
+                    case 'n':
+                        $out .= chr(0x0A);
+                        break;
+                    case "\r":
+                        if ($count != $n-1 && $s[$count+1] == "\n")
+                            $count++;
+                        break;
+                    case "\n":
+                        break;
+                    default:
+                        // Octal-Values
+                        if (ord($s[$count]) >= ord('0') &&
+                            ord($s[$count]) <= ord('9')) {
+                            $oct = ''. $s[$count];
+                                
+                            if (ord($s[$count+1]) >= ord('0') &&
+                                ord($s[$count+1]) <= ord('9')) {
+                                $oct .= $s[++$count];
+                                
+                                if (ord($s[$count+1]) >= ord('0') &&
+                                    ord($s[$count+1]) <= ord('9')) {
+                                    $oct .= $s[++$count];    
+                                }                            
+                            }
+                            
+                            $out .= chr(octdec($oct));
+                        } else {
+                            $out .= $s[$count];
+                        }
+                }
+            }
+        }
+        return $out;
+    }
+    
+    /**
+     * Hexadecimal to string
+     *
+     * @param string $hex
+     * @return string
+     */
+    function hex2str($hex) {
+    	return pack('H*', str_replace(array("\r", "\n", ' '), '', $hex));
+    }
+    
+    /**
+     * String to hexadecimal
+     *
+     * @param string $str
+     * @return string
+     */
+    function str2hex($str) {
+        return current(unpack('H*', $str));
+    }
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/fpdi-version/fpdi_pdf_parser.php b/htmltest/sites/all/libraries/fpdi-version/fpdi_pdf_parser.php
new file mode 100644
index 00000000..8444d274
--- /dev/null
+++ b/htmltest/sites/all/libraries/fpdi-version/fpdi_pdf_parser.php
@@ -0,0 +1,421 @@
+<?php
+//
+//  FPDI - Version 1.4.4
+//
+//    Copyright 2004-2013 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+require_once('pdf_parser.php');
+
+class fpdi_pdf_parser extends pdf_parser {
+
+    /**
+     * Pages
+     * Index beginns at 0
+     *
+     * @var array
+     */
+    var $pages;
+    
+    /**
+     * Page count
+     * @var integer
+     */
+    var $page_count;
+    
+    /**
+     * actual page number
+     * @var integer
+     */
+    var $pageno;
+    
+    /**
+     * PDF Version of imported Document
+     * @var string
+     */
+    var $pdfVersion;
+    
+    /**
+     * FPDI Reference
+     * @var object
+     */
+    var $fpdi;
+    
+    /**
+     * Available BoxTypes
+     *
+     * @var array
+     */
+    var $availableBoxes = array('/MediaBox', '/CropBox', '/BleedBox', '/TrimBox', '/ArtBox');
+        
+    /**
+     * Constructor
+     *
+     * @param string $filename  Source-Filename
+     * @param object $fpdi      Object of type fpdi
+     */
+    function fpdi_pdf_parser($filename, &$fpdi) {
+        $this->fpdi =& $fpdi;
+		
+        parent::pdf_parser($filename);
+
+        // resolve Pages-Dictonary
+        $pages = $this->pdf_resolve_object($this->c, $this->root[1][1]['/Pages']);
+
+        // Read pages
+        $this->read_pages($this->c, $pages, $this->pages);
+        
+        // count pages;
+        $this->page_count = count($this->pages);
+    }
+    
+    /**
+     * Removes reference to fpdi object and closes the file handle
+     */
+    function cleanUp() {
+    	$this->fpdi = null;
+    	$this->closeFile();
+    }
+    
+    /**
+     * Overwrite parent::error()
+     *
+     * @param string $msg  Error-Message
+     */
+    function error($msg) {
+    	$this->fpdi->error($msg);	
+    }
+    
+    /**
+     * Get pagecount from sourcefile
+     *
+     * @return int
+     */
+    function getPageCount() {
+        return $this->page_count;
+    }
+
+
+    /**
+     * Set pageno
+     *
+     * @param int $pageno Pagenumber to use
+     */
+    function setPageno($pageno) {
+        $pageno = ((int) $pageno) - 1;
+
+        if ($pageno < 0 || $pageno >= $this->getPageCount()) {
+            $this->fpdi->error('Pagenumber is wrong!');
+        }
+
+        $this->pageno = $pageno;
+    }
+    
+    /**
+     * Get page-resources from current page
+     *
+     * @return array
+     */
+    function getPageResources() {
+        return $this->_getPageResources($this->pages[$this->pageno]);
+    }
+    
+    /**
+     * Get page-resources from /Page
+     *
+     * @param array $obj Array of pdf-data
+     */
+    function _getPageResources ($obj) { // $obj = /Page
+    	$obj = $this->pdf_resolve_object($this->c, $obj);
+
+        // If the current object has a resources
+    	// dictionary associated with it, we use
+    	// it. Otherwise, we move back to its
+    	// parent object.
+        if (isset ($obj[1][1]['/Resources'])) {
+    		$res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Resources']);
+    		if ($res[0] == PDF_TYPE_OBJECT)
+                return $res[1];
+            return $res;
+    	} else {
+    		if (!isset ($obj[1][1]['/Parent'])) {
+    			return false;
+    		} else {
+                $res = $this->_getPageResources($obj[1][1]['/Parent']);
+                if ($res[0] == PDF_TYPE_OBJECT)
+                    return $res[1];
+                return $res;
+    		}
+    	}
+    }
+
+
+    /**
+     * Get content of current page
+     *
+     * If more /Contents is an array, the streams are concated
+     *
+     * @return string
+     */
+    function getContent() {
+        $buffer = '';
+        
+        if (isset($this->pages[$this->pageno][1][1]['/Contents'])) {
+            $contents = $this->_getPageContent($this->pages[$this->pageno][1][1]['/Contents']);
+            foreach($contents AS $tmp_content) {
+                $buffer .= $this->_rebuildContentStream($tmp_content) . ' ';
+            }
+        }
+        
+        return $buffer;
+    }
+    
+    
+    /**
+     * Resolve all content-objects
+     *
+     * @param array $content_ref
+     * @return array
+     */
+    function _getPageContent($content_ref) {
+        $contents = array();
+        
+        if ($content_ref[0] == PDF_TYPE_OBJREF) {
+            $content = $this->pdf_resolve_object($this->c, $content_ref);
+            if ($content[1][0] == PDF_TYPE_ARRAY) {
+                $contents = $this->_getPageContent($content[1]);
+            } else {
+                $contents[] = $content;
+            }
+        } elseif ($content_ref[0] == PDF_TYPE_ARRAY) {
+            foreach ($content_ref[1] AS $tmp_content_ref) {
+                $contents = array_merge($contents,$this->_getPageContent($tmp_content_ref));
+            }
+        }
+
+        return $contents;
+    }
+
+
+    /**
+     * Rebuild content-streams
+     *
+     * @param array $obj
+     * @return string
+     */
+    function _rebuildContentStream($obj) {
+        $filters = array();
+        
+        if (isset($obj[1][1]['/Filter'])) {
+            $_filter = $obj[1][1]['/Filter'];
+
+            if ($_filter[0] == PDF_TYPE_OBJREF) {
+                $tmpFilter = $this->pdf_resolve_object($this->c, $_filter);
+                $_filter = $tmpFilter[1];
+            }
+            
+            if ($_filter[0] == PDF_TYPE_TOKEN) {
+                $filters[] = $_filter;
+            } elseif ($_filter[0] == PDF_TYPE_ARRAY) {
+                $filters = $_filter[1];
+            }
+        }
+
+        $stream = $obj[2][1];
+
+        foreach ($filters AS $_filter) {
+            switch ($_filter[1]) {
+                case '/FlateDecode':
+                case '/Fl':
+                	// $stream .= "\x0F\x0D"; // in an errorious stream this suffix could work
+                	// $stream .= "\x0A";
+                	// $stream .= "\x0D";
+                	if (function_exists('gzuncompress')) {
+                		$oStream = $stream;
+                        $stream = (strlen($stream) > 0) ? @gzuncompress($stream) : '';
+                    } else {
+                        $this->error(sprintf('To handle %s filter, please compile php with zlib support.',$_filter[1]));
+                    }
+                    
+                    if ($stream === false) {
+                    	$oStream = substr($oStream, 2);
+                    	$stream = @gzinflate($oStream);
+                    	if ($stream == false) {
+                    		$this->error('Error while decompressing stream.');
+                    	}
+                    }
+                break;
+                case '/LZWDecode':
+                    include_once('filters/FilterLZW_FPDI.php');
+                    $decoder = new FilterLZW_FPDI($this->fpdi);
+                    $stream = $decoder->decode($stream);
+                    break;
+                case '/ASCII85Decode':
+                    include_once('filters/FilterASCII85_FPDI.php');
+                    $decoder = new FilterASCII85_FPDI($this->fpdi);
+                    $stream = $decoder->decode($stream);
+                    break;
+                case null:
+                    $stream = $stream;
+                break;
+                default:
+                    $this->error(sprintf('Unsupported Filter: %s',$_filter[1]));
+            }
+        }
+        
+        return $stream;
+    }
+    
+    
+    /**
+     * Get a Box from a page
+     * Arrayformat is same as used by fpdf_tpl
+     *
+     * @param array $page a /Page
+     * @param string $box_index Type of Box @see $availableBoxes
+     * @param float Scale factor from user space units to points
+     * @return array
+     */
+    function getPageBox($page, $box_index, $k) {
+        $page = $this->pdf_resolve_object($this->c, $page);
+        $box = null;
+        if (isset($page[1][1][$box_index]))
+            $box =& $page[1][1][$box_index];
+        
+        if (!is_null($box) && $box[0] == PDF_TYPE_OBJREF) {
+            $tmp_box = $this->pdf_resolve_object($this->c, $box);
+            $box = $tmp_box[1];
+        }
+            
+        if (!is_null($box) && $box[0] == PDF_TYPE_ARRAY) {
+            $b =& $box[1];
+            return array('x' => $b[0][1] / $k,
+                         'y' => $b[1][1] / $k,
+                         'w' => abs($b[0][1] - $b[2][1]) / $k,
+                         'h' => abs($b[1][1] - $b[3][1]) / $k,
+                         'llx' => min($b[0][1], $b[2][1]) / $k,
+                         'lly' => min($b[1][1], $b[3][1]) / $k,
+                         'urx' => max($b[0][1], $b[2][1]) / $k,
+                         'ury' => max($b[1][1], $b[3][1]) / $k,
+                         );
+        } elseif (!isset ($page[1][1]['/Parent'])) {
+            return false;
+        } else {
+            return $this->getPageBox($this->pdf_resolve_object($this->c, $page[1][1]['/Parent']), $box_index, $k);
+        }
+    }
+
+    /**
+     * Get all page boxes by page no
+     * 
+     * @param int The page number
+     * @param float Scale factor from user space units to points
+     * @return array
+     */
+     function getPageBoxes($pageno, $k) {
+        return $this->_getPageBoxes($this->pages[$pageno - 1], $k);
+    }
+    
+    /**
+     * Get all boxes from /Page
+     *
+     * @param array a /Page
+     * @return array
+     */
+    function _getPageBoxes($page, $k) {
+        $boxes = array();
+
+        foreach($this->availableBoxes AS $box) {
+            if ($_box = $this->getPageBox($page, $box, $k)) {
+                $boxes[$box] = $_box;
+            }
+        }
+
+        return $boxes;
+    }
+
+    /**
+     * Get the page rotation by pageno
+     *
+     * @param integer $pageno
+     * @return array
+     */
+    function getPageRotation($pageno) {
+        return $this->_getPageRotation($this->pages[$pageno - 1]);
+    }
+    
+    function _getPageRotation($obj) { // $obj = /Page
+    	$obj = $this->pdf_resolve_object($this->c, $obj);
+    	if (isset ($obj[1][1]['/Rotate'])) {
+    		$res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Rotate']);
+    		if ($res[0] == PDF_TYPE_OBJECT)
+                return $res[1];
+            return $res;
+    	} else {
+    		if (!isset ($obj[1][1]['/Parent'])) {
+    			return false;
+    		} else {
+                $res = $this->_getPageRotation($obj[1][1]['/Parent']);
+                if ($res[0] == PDF_TYPE_OBJECT)
+                    return $res[1];
+                return $res;
+    		}
+    	}
+    }
+    
+    /**
+     * Read all /Page(es)
+     *
+     * @param object pdf_context
+     * @param array /Pages
+     * @param array the result-array
+     */
+    function read_pages(&$c, &$pages, &$result) {
+        // Get the kids dictionary
+    	$_kids = $this->pdf_resolve_object ($c, $pages[1][1]['/Kids']);
+        
+        if (!is_array($_kids))
+            $this->error('Cannot find /Kids in current /Page-Dictionary');
+            
+        if ($_kids[1][0] == PDF_TYPE_ARRAY) {
+            $kids = $_kids[1][1];
+        } else {
+            $kids = $_kids[1];
+        }
+        
+        foreach ($kids as $v) {
+    		$pg = $this->pdf_resolve_object ($c, $v);
+            if ($pg[1][1]['/Type'][1] === '/Pages') {
+                // If one of the kids is an embedded
+    			// /Pages array, resolve it as well.
+                $this->read_pages($c, $pg, $result);
+    		} else {
+    			$result[] = $pg;
+    		}
+    	}
+    }
+
+    
+    
+    /**
+     * Get PDF-Version
+     *
+     * And reset the PDF Version used in FPDI if needed
+     */
+    function getPDFVersion() {
+        parent::getPDFVersion();
+        $this->fpdi->setPDFVersion(max($this->fpdi->getPDFVersion(), $this->pdfVersion));
+    }
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/fpdi-version/pdf_context.php b/htmltest/sites/all/libraries/fpdi-version/pdf_context.php
new file mode 100644
index 00000000..f404039e
--- /dev/null
+++ b/htmltest/sites/all/libraries/fpdi-version/pdf_context.php
@@ -0,0 +1,104 @@
+<?php
+//
+//  FPDI - Version 1.4.4
+//
+//    Copyright 2004-2013 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+if (!class_exists('pdf_context', false)) {
+    
+    class pdf_context {
+    
+        /**
+         * Modi
+         *
+         * @var integer 0 = file | 1 = string
+         */
+        var $_mode = 0;
+        
+    	var $file;
+    	var $buffer;
+    	var $offset;
+    	var $length;
+    
+    	var $stack;
+    
+    	// Constructor
+    
+    	function pdf_context(&$f) {
+    		$this->file =& $f;
+    		if (is_string($this->file))
+    		    $this->_mode = 1;
+    		$this->reset();
+    	}
+    
+    	// Optionally move the file
+    	// pointer to a new location
+    	// and reset the buffered data
+    
+    	function reset($pos = null, $l = 100) {
+    	    if ($this->_mode == 0) {
+            	if (!is_null ($pos)) {
+        			fseek ($this->file, $pos);
+        		}
+        
+        		$this->buffer = $l > 0 ? fread($this->file, $l) : '';
+        		$this->length = strlen($this->buffer);
+        		if ($this->length < $l)
+                    $this->increase_length($l - $this->length);
+    	    } else {
+    	        $this->buffer = $this->file;
+    	        $this->length = strlen($this->buffer);
+    	    }
+    		$this->offset = 0;
+    		$this->stack = array();
+    	}
+    
+    	// Make sure that there is at least one
+    	// character beyond the current offset in
+    	// the buffer to prevent the tokenizer
+    	// from attempting to access data that does
+    	// not exist
+    
+    	function ensure_content() {
+    		if ($this->offset >= $this->length - 1) {
+    			return $this->increase_length();
+    		} else {
+    			return true;
+    		}
+    	}
+    
+    	// Forcefully read more data into the buffer
+    
+    	function increase_length($l = 100) {
+			if ($this->_mode == 0 && feof($this->file)) {
+				return false;
+			} elseif ($this->_mode == 0) {
+			    $totalLength = $this->length + $l;
+			    do {
+			    	$toRead = $totalLength - $this->length;
+			    	if ($toRead < 1)
+			    		break;
+			    
+			    	$this->buffer .= fread($this->file, $toRead);
+	            } while ((($this->length = strlen($this->buffer)) != $totalLength) && !feof($this->file));
+				
+				return true;
+			} else {
+		        return false;
+			}
+		}
+    }
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/fpdi-version/pdf_parser.php b/htmltest/sites/all/libraries/fpdi-version/pdf_parser.php
new file mode 100644
index 00000000..b1e7b8d2
--- /dev/null
+++ b/htmltest/sites/all/libraries/fpdi-version/pdf_parser.php
@@ -0,0 +1,719 @@
+<?php
+//
+//  FPDI - Version 1.4.4
+//
+//    Copyright 2004-2013 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+if (!defined ('PDF_TYPE_NULL'))
+    define ('PDF_TYPE_NULL', 0);
+if (!defined ('PDF_TYPE_NUMERIC'))
+    define ('PDF_TYPE_NUMERIC', 1);
+if (!defined ('PDF_TYPE_TOKEN'))
+    define ('PDF_TYPE_TOKEN', 2);
+if (!defined ('PDF_TYPE_HEX'))
+    define ('PDF_TYPE_HEX', 3);
+if (!defined ('PDF_TYPE_STRING'))
+    define ('PDF_TYPE_STRING', 4);
+if (!defined ('PDF_TYPE_DICTIONARY'))
+    define ('PDF_TYPE_DICTIONARY', 5);
+if (!defined ('PDF_TYPE_ARRAY'))
+    define ('PDF_TYPE_ARRAY', 6);
+if (!defined ('PDF_TYPE_OBJDEC'))
+    define ('PDF_TYPE_OBJDEC', 7);
+if (!defined ('PDF_TYPE_OBJREF'))
+    define ('PDF_TYPE_OBJREF', 8);
+if (!defined ('PDF_TYPE_OBJECT'))
+    define ('PDF_TYPE_OBJECT', 9);
+if (!defined ('PDF_TYPE_STREAM'))
+    define ('PDF_TYPE_STREAM', 10);
+if (!defined ('PDF_TYPE_BOOLEAN'))
+    define ('PDF_TYPE_BOOLEAN', 11);
+if (!defined ('PDF_TYPE_REAL'))
+    define ('PDF_TYPE_REAL', 12);
+    
+require_once('pdf_context.php');
+
+if (!class_exists('pdf_parser', false)) {
+    
+    class pdf_parser {
+    	
+    	/**
+         * Filename
+         * @var string
+         */
+        var $filename;
+        
+        /**
+         * File resource
+         * @var resource
+         */
+        var $f;
+        
+        /**
+         * PDF Context
+         * @var object pdf_context-Instance
+         */
+        var $c;
+        
+        /**
+         * xref-Data
+         * @var array
+         */
+        var $xref;
+    
+        /**
+         * root-Object
+         * @var array
+         */
+        var $root;
+    	
+        /**
+         * PDF version of the loaded document
+         * @var string
+         */
+        var $pdfVersion;
+        
+        /**
+	     * For reading encrypted documents and xref/objectstreams are in use
+	     *
+	     * @var boolean
+	     */
+	    var $readPlain = true;
+	    
+        /**
+         * Constructor
+         *
+         * @param string $filename  Source-Filename
+         */
+    	function pdf_parser($filename) {
+            $this->filename = $filename;
+            
+            $this->f = @fopen($this->filename, 'rb');
+    
+            if (!$this->f)
+                $this->error(sprintf('Cannot open %s !', $filename));
+    
+            $this->getPDFVersion();
+    
+            $this->c = new pdf_context($this->f);
+            
+            // Read xref-Data
+            $this->xref = array();
+            $this->pdf_read_xref($this->xref, $this->pdf_find_xref());
+            
+            // Check for Encryption
+            $this->getEncryption();
+    
+            // Read root
+            $this->pdf_read_root();
+        }
+        
+        /**
+         * Close the opened file
+         */
+        function closeFile() {
+        	if (isset($this->f) && is_resource($this->f)) {
+        	    fclose($this->f);	
+        		unset($this->f);
+        	}	
+        }
+        
+        /**
+         * Print Error and die
+         *
+         * @param string $msg  Error-Message
+         */
+        function error($msg) {
+        	die('<b>PDF-Parser Error:</b> ' . $msg);	
+        }
+        
+        /**
+         * Check Trailer for Encryption
+         */
+        function getEncryption() {
+            if (isset($this->xref['trailer'][1]['/Encrypt'])) {
+            	$this->error('File is encrypted!');
+            }
+        }
+        
+    	/**
+         * Find/Return /Root
+         *
+         * @return array
+         */
+        function pdf_find_root() {
+            if ($this->xref['trailer'][1]['/Root'][0] != PDF_TYPE_OBJREF) {
+                $this->error('Wrong Type of Root-Element! Must be an indirect reference');
+            }
+            
+            return $this->xref['trailer'][1]['/Root'];
+        }
+    
+        /**
+         * Read the /Root
+         */
+        function pdf_read_root() {
+            // read root
+            $this->root = $this->pdf_resolve_object($this->c, $this->pdf_find_root());
+        }
+        
+        /**
+         * Get PDF-Version
+         *
+         * And reset the PDF Version used in FPDI if needed
+         */
+        function getPDFVersion() {
+            fseek($this->f, 0);
+            preg_match('/\d\.\d/',fread($this->f, 16), $m);
+            if (isset($m[0]))
+                $this->pdfVersion = $m[0];
+            return $this->pdfVersion;
+        }
+        
+        /**
+         * Find the xref-Table
+         */
+        function pdf_find_xref() {
+           	$toRead = 1500;
+                    
+            $stat = fseek ($this->f, -$toRead, SEEK_END);
+            if ($stat === -1) {
+                fseek ($this->f, 0);
+            }
+           	$data = fread($this->f, $toRead);
+            
+            $pos = strlen($data) - strpos(strrev($data), strrev('startxref')); 
+            $data = substr($data, $pos);
+            
+            if (!preg_match('/\s*(\d+).*$/s', $data, $matches)) {
+                $this->error('Unable to find pointer to xref table');
+        	}
+    
+        	return (int) $matches[1];
+        }
+    
+        /**
+         * Read xref-table
+         *
+         * @param array $result Array of xref-table
+         * @param integer $offset of xref-table
+         */
+        function pdf_read_xref(&$result, $offset) {
+            $o_pos = $offset-min(20, $offset);
+        	fseek($this->f, $o_pos); // set some bytes backwards to fetch errorious docs
+                
+            $data = fread($this->f, 100);
+            
+            $xrefPos = strrpos($data, 'xref');
+    
+            if ($xrefPos === false) {
+                fseek($this->f, $offset);
+                $c = new pdf_context($this->f);
+                $xrefStreamObjDec = $this->pdf_read_value($c);
+                
+                if (is_array($xrefStreamObjDec) && isset($xrefStreamObjDec[0]) && $xrefStreamObjDec[0] == PDF_TYPE_OBJDEC) {
+                    $this->error(sprintf('This document (%s) probably uses a compression technique which is not supported by the free parser shipped with FPDI.', $this->filename));
+                } else {            
+                	$this->error('Unable to find xref table.');
+                }
+            }
+            
+            if (!isset($result['xref_location'])) {
+                $result['xref_location'] = $o_pos + $xrefPos;
+                $result['max_object'] = 0;
+        	}
+    
+        	$cylces = -1;
+            $bytesPerCycle = 100;
+            
+        	fseek($this->f, $o_pos = $o_pos + $xrefPos + 4); // set the handle directly after the "xref"-keyword
+            $data = fread($this->f, $bytesPerCycle);
+            
+            while (($trailerPos = strpos($data, 'trailer', max($bytesPerCycle * $cylces++, 0))) === false && !feof($this->f)) {
+                $data .= fread($this->f, $bytesPerCycle);
+            }
+            
+            if ($trailerPos === false) {
+                $this->error('Trailer keyword not found after xref table');
+            }
+            
+            $data = substr($data, 0, $trailerPos);
+            
+            // get Line-Ending
+            preg_match_all("/(\r\n|\n|\r)/", substr($data, 0, 100), $m); // check the first 100 bytes for linebreaks
+    
+            $differentLineEndings = count(array_unique($m[0]));
+            if ($differentLineEndings > 1) {
+                $lines = preg_split("/(\r\n|\n|\r)/", $data, -1, PREG_SPLIT_NO_EMPTY);
+            } else {
+                $lines = explode($m[0][1], $data);
+            }
+            
+            $data = $differentLineEndings = $m = null;
+            unset($data, $differentLineEndings, $m);
+            
+            $linesCount = count($lines);
+            
+            $start = 1;
+            
+            for ($i = 0; $i < $linesCount; $i++) {
+                $line = trim($lines[$i]);
+                if ($line) {
+                    $pieces = explode(' ', $line);
+                    $c = count($pieces);
+                    switch($c) {
+                        case 2:
+                            $start = (int)$pieces[0];
+                            $end   = $start + (int)$pieces[1];
+                            if ($end > $result['max_object'])
+                                $result['max_object'] = $end;
+                            break;
+                        case 3:
+                            if (!isset($result['xref'][$start]))
+                                $result['xref'][$start] = array();
+                            
+                            if (!array_key_exists($gen = (int) $pieces[1], $result['xref'][$start])) {
+                    	        $result['xref'][$start][$gen] = $pieces[2] == 'n' ? (int) $pieces[0] : null;
+                    	    }
+                            $start++;
+                            break;
+                        default:
+                            $this->error('Unexpected data in xref table');
+                    }
+                }
+            }
+            
+            $lines = $pieces = $line = $start = $end = $gen = null;
+            unset($lines, $pieces, $line, $start, $end, $gen);
+            
+            fseek($this->f, $o_pos + $trailerPos + 7);
+            
+            $c = new pdf_context($this->f);
+    	    $trailer = $this->pdf_read_value($c);
+    	    
+    	    $c = null;
+    	    unset($c);
+    	    
+    	    if (!isset($result['trailer'])) {
+                $result['trailer'] = $trailer;          
+    	    }
+    	    
+    	    if (isset($trailer[1]['/Prev'])) {
+    	        $this->pdf_read_xref($result, $trailer[1]['/Prev'][1]);
+    	    } 
+    	    
+    	    $trailer = null;
+    	    unset($trailer);
+            
+            return true;
+        }
+        
+        /**
+         * Reads an Value
+         *
+         * @param object $c pdf_context
+         * @param string $token a Token
+         * @return mixed
+         */
+        function pdf_read_value(&$c, $token = null) {
+        	if (is_null($token)) {
+        	    $token = $this->pdf_read_token($c);
+        	}
+        	
+            if ($token === false) {
+        	    return false;
+        	}
+    
+        	switch ($token) {
+                case	'<':
+        			// This is a hex string.
+        			// Read the value, then the terminator
+    
+                    $pos = $c->offset;
+    
+        			while(1) {
+    
+                        $match = strpos ($c->buffer, '>', $pos);
+    				
+        				// If you can't find it, try
+        				// reading more data from the stream
+    
+        				if ($match === false) {
+        					if (!$c->increase_length()) {
+        						return false;
+        					} else {
+                            	continue;
+                        	}
+        				}
+    
+        				$result = substr ($c->buffer, $c->offset, $match - $c->offset);
+        				$c->offset = $match + 1;
+        				
+        				return array (PDF_TYPE_HEX, $result);
+                    }
+                    
+                    break;
+        		case	'<<':
+        			// This is a dictionary.
+    
+        			$result = array();
+    
+        			// Recurse into this function until we reach
+        			// the end of the dictionary.
+        			while (($key = $this->pdf_read_token($c)) !== '>>') {
+        				if ($key === false) {
+        					return false;
+        				}
+        				
+        				if (($value =   $this->pdf_read_value($c)) === false) {
+        					return false;
+        				}
+        				
+        				// Catch missing value
+        				if ($value[0] == PDF_TYPE_TOKEN && $value[1] == '>>') {
+        				    $result[$key] = array(PDF_TYPE_NULL);
+        				    break;
+        				}
+        				
+        				$result[$key] = $value;
+        			}
+    				
+        			return array (PDF_TYPE_DICTIONARY, $result);
+    
+        		case	'[':
+        			// This is an array.
+    
+        			$result = array();
+    
+        			// Recurse into this function until we reach
+        			// the end of the array.
+        			while (($token = $this->pdf_read_token($c)) !== ']') {
+                        if ($token === false) {
+        					return false;
+        				}
+    					
+        				if (($value = $this->pdf_read_value($c, $token)) === false) {
+                            return false;
+        				}
+    					
+        				$result[] = $value;
+        			}
+        			
+                    return array (PDF_TYPE_ARRAY, $result);
+    
+        		case	'('		:
+                    // This is a string
+                    $pos = $c->offset;
+                    
+                    $openBrackets = 1;
+        			do {
+                        for (; $openBrackets != 0 && $pos < $c->length; $pos++) {
+                            switch (ord($c->buffer[$pos])) {
+                                case 0x28: // '('
+                                    $openBrackets++;
+                                    break;
+                                case 0x29: // ')'
+                                    $openBrackets--;
+                                    break;
+                                case 0x5C: // backslash
+                                    $pos++;
+                            }
+                        }
+        			} while($openBrackets != 0 && $c->increase_length());
+        			
+        			$result = substr($c->buffer, $c->offset, $pos - $c->offset - 1);
+        			$c->offset = $pos;
+        			
+        			return array (PDF_TYPE_STRING, $result);
+    
+                case 'stream':
+                	$o_pos = ftell($c->file)-strlen($c->buffer);
+    		        $o_offset = $c->offset;
+    		        
+    		        $c->reset($startpos = $o_pos + $o_offset);
+    		        
+    		        $e = 0; // ensure line breaks in front of the stream
+    		        if ($c->buffer[0] == chr(10) || $c->buffer[0] == chr(13))
+    		        	$e++;
+    		        if ($c->buffer[1] == chr(10) && $c->buffer[0] != chr(10))
+    		        	$e++;
+    		        
+    		        if ($this->actual_obj[1][1]['/Length'][0] == PDF_TYPE_OBJREF) {
+    		        	$tmp_c = new pdf_context($this->f);
+    		        	$tmp_length = $this->pdf_resolve_object($tmp_c, $this->actual_obj[1][1]['/Length']);
+    		        	$length = $tmp_length[1][1];
+    		        } else {
+    		        	$length = $this->actual_obj[1][1]['/Length'][1];	
+    		        }
+    		        	
+    		        if ($length > 0) {
+        		        $c->reset($startpos + $e,$length);
+        		        $v = $c->buffer;
+    		        } else {
+    		            $v = '';   
+    		        }
+    		        $c->reset($startpos + $e + $length + 9); // 9 = strlen("endstream")
+    		        
+    		        return array(PDF_TYPE_STREAM, $v);
+    		        
+    	        default	:
+                	if (is_numeric ($token)) {
+                        // A numeric token. Make sure that
+        				// it is not part of something else.
+        				if (($tok2 = $this->pdf_read_token ($c)) !== false) {
+                            if (is_numeric ($tok2)) {
+    
+        						// Two numeric tokens in a row.
+        						// In this case, we're probably in
+        						// front of either an object reference
+        						// or an object specification.
+        						// Determine the case and return the data
+        						if (($tok3 = $this->pdf_read_token ($c)) !== false) {
+                                    switch ($tok3) {
+        								case 'obj':
+                                            return array (PDF_TYPE_OBJDEC, (int) $token, (int) $tok2);
+        								case 'R':
+        									return array (PDF_TYPE_OBJREF, (int) $token, (int) $tok2);
+        							}
+        							// If we get to this point, that numeric value up
+        							// there was just a numeric value. Push the extra
+        							// tokens back into the stack and return the value.
+        							array_push ($c->stack, $tok3);
+        						}
+        					}
+    
+        					array_push ($c->stack, $tok2);
+        				}
+    
+        				if ($token === (string)((int)$token))
+            				return array (PDF_TYPE_NUMERIC, (int)$token);
+        				else 
+        					return array (PDF_TYPE_REAL, (float)$token);
+        			} elseif ($token == 'true' || $token == 'false') {
+                        return array (PDF_TYPE_BOOLEAN, $token == 'true');
+        			} elseif ($token == 'null') {
+        			   return array (PDF_TYPE_NULL);
+        			} else {
+                        // Just a token. Return it.
+        				return array (PDF_TYPE_TOKEN, $token);
+        			}
+             }
+        }
+        
+        /**
+         * Resolve an object
+         *
+         * @param object $c pdf_context
+         * @param array $obj_spec The object-data
+         * @param boolean $encapsulate Must set to true, cause the parsing and fpdi use this method only without this para
+         */
+        function pdf_resolve_object(&$c, $obj_spec, $encapsulate = true) {
+            // Exit if we get invalid data
+        	if (!is_array($obj_spec)) {
+                $ret = false;
+        	    return $ret;
+        	}
+    
+        	if ($obj_spec[0] == PDF_TYPE_OBJREF) {
+    
+        		// This is a reference, resolve it
+        		if (isset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]])) {
+    
+        			// Save current file position
+        			// This is needed if you want to resolve
+        			// references while you're reading another object
+        			// (e.g.: if you need to determine the length
+        			// of a stream)
+    
+        			$old_pos = ftell($c->file);
+    
+        			// Reposition the file pointer and
+        			// load the object header.
+    				
+        			$c->reset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]]);
+    
+        			$header = $this->pdf_read_value($c);
+    
+        			if ($header[0] != PDF_TYPE_OBJDEC || $header[1] != $obj_spec[1] || $header[2] != $obj_spec[2]) {
+        				$toSearchFor = $obj_spec[1] . ' ' . $obj_spec[2] . ' obj';
+        				if (preg_match('/' . $toSearchFor . '/', $c->buffer)) {
+        					$c->offset = strpos($c->buffer, $toSearchFor) + strlen($toSearchFor);
+        					// reset stack
+        					$c->stack = array();
+        				} else {
+	        				$this->error("Unable to find object ({$obj_spec[1]}, {$obj_spec[2]}) at expected location");
+        				}
+        			}
+    
+        			// If we're being asked to store all the information
+        			// about the object, we add the object ID and generation
+        			// number for later use
+    				$result = array();
+    				$this->actual_obj =& $result;
+        			if ($encapsulate) {
+        				$result = array (
+        					PDF_TYPE_OBJECT,
+        					'obj' => $obj_spec[1],
+        					'gen' => $obj_spec[2]
+        				);
+        			} 
+    
+        			// Now simply read the object data until
+        			// we encounter an end-of-object marker
+        			while(1) {
+                        $value = $this->pdf_read_value($c);
+    					if ($value === false || count($result) > 4) {
+    						// in this case the parser coudn't find an endobj so we break here
+    						break;
+        				}
+    
+        				if ($value[0] == PDF_TYPE_TOKEN && $value[1] === 'endobj') {
+        					break;
+        				}
+    
+                        $result[] = $value;
+        			}
+    
+        			$c->reset($old_pos);
+    
+                    if (isset($result[2][0]) && $result[2][0] == PDF_TYPE_STREAM) {
+                        $result[0] = PDF_TYPE_STREAM;
+                    }
+    
+        			return $result;
+        		}
+        	} else {
+        		return $obj_spec;
+        	}
+        }
+    
+        
+        
+        /**
+         * Reads a token from the file
+         *
+         * @param object $c pdf_context
+         * @return mixed
+         */
+        function pdf_read_token(&$c)
+        {
+        	// If there is a token available
+        	// on the stack, pop it out and
+        	// return it.
+    
+        	if (count($c->stack)) {
+        		return array_pop($c->stack);
+        	}
+    
+        	// Strip away any whitespace
+    
+        	do {
+        		if (!$c->ensure_content()) {
+        			return false;
+        		}
+        		$c->offset += strspn($c->buffer, "\x20\x0A\x0C\x0D\x09\x00", $c->offset);
+        	} while ($c->offset >= $c->length - 1);
+    
+        	// Get the first character in the stream
+    
+        	$char = $c->buffer[$c->offset++];
+    
+        	switch ($char) {
+    
+        		case '[':
+        		case ']':
+        		case '(':
+        		case ')':
+        		
+        			// This is either an array or literal string
+        			// delimiter, Return it
+    
+        			return $char;
+    
+        		case '<':
+        		case '>':
+    
+        			// This could either be a hex string or
+        			// dictionary delimiter. Determine the
+        			// appropriate case and return the token
+    
+        			if ($c->buffer[$c->offset] == $char) {
+        				if (!$c->ensure_content()) {
+        				    return false;
+        				}
+        				$c->offset++;
+        				return $char . $char;
+        			} else {
+        				return $char;
+        			}
+    
+    			case '%':
+    			    
+    			    // This is a comment - jump over it!
+    			    
+                    $pos = $c->offset;
+        			while(1) {
+        			    $match = preg_match("/(\r\n|\r|\n)/", $c->buffer, $m, PREG_OFFSET_CAPTURE, $pos);
+                        if ($match === 0) {
+        					if (!$c->increase_length()) {
+        						return false;
+        					} else {
+                            	continue;
+                        	}
+        				}
+    
+        				$c->offset = $m[0][1]+strlen($m[0][0]);
+        				
+        				return $this->pdf_read_token($c);
+                    }
+                    
+    			default:
+    
+        			// This is "another" type of token (probably
+        			// a dictionary entry or a numeric value)
+        			// Find the end and return it.
+    
+        			if (!$c->ensure_content()) {
+        				return false;
+        			}
+    
+        			while(1) {
+    
+        				// Determine the length of the token
+    
+        				$pos = strcspn($c->buffer, "\x20%[]<>()/\x0A\x0C\x0D\x09\x00", $c->offset);
+        				
+        				if ($c->offset + $pos <= $c->length - 1) {
+        					break;
+        				} else {
+        					// If the script reaches this point,
+        					// the token may span beyond the end
+        					// of the current buffer. Therefore,
+        					// we increase the size of the buffer
+        					// and try again--just to be safe.
+    
+        					$c->increase_length();
+        				}
+        			}
+    
+        			$result = substr($c->buffer, $c->offset - 1, $pos + 1);
+    
+        			$c->offset += $pos;
+        			return $result;
+        	}
+        }
+    }
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/LICENSE b/htmltest/sites/all/libraries/highlightjs/LICENSE
new file mode 100644
index 00000000..422deb73
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) 2006, Ivan Sagalaev
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of highlight.js nor the names of its contributors 
+      may be used to endorse or promote products derived from this software 
+      without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/htmltest/sites/all/libraries/highlightjs/README.md b/htmltest/sites/all/libraries/highlightjs/README.md
new file mode 100644
index 00000000..82a5d1f0
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/README.md
@@ -0,0 +1,167 @@
+# Highlight.js
+
+Highlight.js highlights syntax in code examples on blogs, forums and,
+in fact, on any web page. It's very easy to use because it works
+automatically: finds blocks of code, detects a language, highlights it.
+
+Autodetection can be fine tuned when it fails by itself (see "Heuristics").
+
+
+## Basic usage
+
+Link the library and a stylesheet from your page and hook highlighting to
+the page load event:
+
+```html
+<link rel="stylesheet" href="styles/default.css">
+<script src="highlight.pack.js"></script>
+<script>hljs.initHighlightingOnLoad();</script>
+```
+
+This will highlight all code on the page marked up as `<pre><code> .. </code></pre>`.
+If you use different markup or need to apply highlighting dynamically, read
+"Custom initialization" below.
+
+- You can download your own customized version of "highlight.pack.js" or
+  use the hosted one as described on the download page:
+  <http://highlightjs.org/download/>
+
+- Style themes are available in the download package or as hosted files.
+  To create a custom style for your site see the class reference in the file
+  [classref.txt][cr] from the downloaded package.
+
+[cr]: http://github.com/isagalaev/highlight.js/blob/master/classref.txt
+
+
+## node.js
+
+Highlight.js can be used under node.js. The package with all supported languages is
+installable from NPM:
+
+    npm install highlight.js
+
+Alternatively, you can build it from the source with only languages you need:
+
+    python3 tools/build.py -tnode lang1 lang2 ..
+
+Using the library:
+
+```javascript
+var hljs = require('highlight.js');
+
+// If you know the language
+hljs.highlight(lang, code).value;
+
+// Automatic language detection
+hljs.highlightAuto(code).value;
+```
+
+
+## AMD
+
+Highlight.js can be used with an AMD loader.  You will need to build it from
+source in order to do so:
+
+```bash
+$ python3 tools/build.py -tamd lang1 lang2 ..
+```
+
+Which will generate a `build/highlight.pack.js` which will load as an AMD
+module with support for the built languages and can be used like so:
+
+```javascript
+require(["highlight.js/build/highlight.pack"], function(hljs){
+
+  // If you know the language
+  hljs.highlight(lang, code).value;
+
+  // Automatic language detection
+  hljs.highlightAuto(code).value;
+});
+```
+
+
+## Tab replacement
+
+You can replace TAB ('\x09') characters used for indentation in your code
+with some fixed number of spaces or with a `<span>` to give them special
+styling:
+
+```html
+<script type="text/javascript">
+  hljs.tabReplace = '    '; // 4 spaces
+  // ... or
+  hljs.tabReplace = '<span class="indent">\t</span>';
+
+  hljs.initHighlightingOnLoad();
+</script>
+```
+
+## Custom initialization
+
+If you use different markup for code blocks you can initialize them manually
+with `highlightBlock(code, tabReplace, useBR)` function. It takes a DOM element
+containing the code to highlight and optionally a string with which to replace
+TAB characters.
+
+Initialization using, for example, jQuery might look like this:
+
+```javascript
+$(document).ready(function() {
+  $('pre code').each(function(i, e) {hljs.highlightBlock(e)});
+});
+```
+
+You can use `highlightBlock` to highlight blocks dynamically inserted into
+the page. Just make sure you don't do it twice for already highlighted
+blocks.
+
+If your code container relies on `<br>` tags instead of line breaks (i.e. if
+it's not `<pre>`) pass `true` into the third parameter of `highlightBlock`
+to make highlight.js use `<br>` in the output:
+
+```javascript
+$('div.code').each(function(i, e) {hljs.highlightBlock(e, null, true)});
+```
+
+
+## Heuristics
+
+Autodetection of a code's language is done using a simple heuristic:
+the program tries to highlight a fragment with all available languages and
+counts all syntactic structures that it finds along the way. The language
+with greatest count wins.
+
+This means that in short fragments the probability of an error is high
+(and it really happens sometimes). In this cases you can set the fragment's
+language explicitly by assigning a class to the `<code>` element:
+
+```html
+<pre><code class="html">...</code></pre>
+```
+
+You can use class names recommended in HTML5: "language-html",
+"language-php". Classes also can be assigned to the `<pre>` element.
+
+To disable highlighting of a fragment altogether use "no-highlight" class:
+
+```html
+<pre><code class="no-highlight">...</code></pre>
+```
+
+
+## Export
+
+File export.html contains a little program that allows you to paste in a code
+snippet and then copy and paste the resulting HTML code generated by the
+highlighter. This is useful in situations when you can't use the script itself
+on a site.
+
+
+## Meta
+
+- Version: 7.5
+- URL:     http://highlightjs.org/
+
+For the license terms see LICENSE files.
+For authors and contributors see AUTHORS.en.txt file.
diff --git a/htmltest/sites/all/libraries/highlightjs/README.ru.md b/htmltest/sites/all/libraries/highlightjs/README.ru.md
new file mode 100644
index 00000000..c87b3b38
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/README.ru.md
@@ -0,0 +1,172 @@
+# Highlight.js
+
+Highlight.js нужен для подсветки синтаксиса в примерах кода в блогах,
+форумах и вообще на любых веб-страницах. Пользоваться им очень просто,
+потому что работает он автоматически: сам находит блоки кода, сам
+определяет язык, сам подсвечивает.
+
+Автоопределением языка можно управлять, когда оно не справляется само (см.
+дальше "Эвристика").
+
+
+## Простое использование
+
+Подключите библиотеку и стиль на страницу и повесть вызов подсветки на
+загрузку страницы:
+
+```html
+<link rel="stylesheet" href="styles/default.css">
+<script src="highlight.pack.js"></script>
+<script>hljs.initHighlightingOnLoad();</script>
+```
+
+Весь код на странице, обрамлённый в теги `<pre><code> .. </code></pre>`
+будет автоматически подсвечен. Если вы используете другие теги или хотите
+подсвечивать блоки кода динамически, читайте "Инициализацию вручную" ниже.
+
+- Вы можете скачать собственную версию "highlight.pack.js" или сослаться
+  на захостенный файл, как описано на странице загрузки:
+  <http://highlightjs.org/download/>
+
+- Стилевые темы можно найти в загруженном архиве или также использовать
+  захостенные. Чтобы сделать собственный стиль для своего сайта, вам
+  будет полезен справочник классов в файле [classref.txt][cr], который тоже
+  есть в архиве.
+
+[cr]: http://github.com/isagalaev/highlight.js/blob/master/classref.txt
+
+
+## node.js
+
+Highlight.js можно использовать в node.js. Библиотеку со всеми возможными языками можно
+установить с NPM:
+
+    npm install highlight.js
+
+Также её можно собрать из исходников с только теми языками, которые нужны:
+
+    python3 tools/build.py -tnode lang1 lang2 ..
+
+Использование библиотеки:
+
+```javascript
+var hljs = require('highlight.js');
+
+// Если вы знаете язык
+hljs.highlight(lang, code).value;
+
+// Автоопределение языка
+hljs.highlightAuto(code).value;
+```
+
+
+## AMD
+
+Highlight.js можно использовать с загрузчиком AMD-модулей.  Для этого его
+нужно собрать из исходников следующей командой:
+
+```bash
+$ python3 tools/build.py -tamd lang1 lang2 ..
+```
+
+Она создаст файл `build/highlight.pack.js`, который является загружаемым
+AMD-модулем и содержит все выбранные при сборке языки. Используется он так:
+
+```javascript
+require(["highlight.js/build/highlight.pack"], function(hljs){
+
+  // Если вы знаете язык
+  hljs.highlight(lang, code).value;
+
+  // Автоопределение языка
+  hljs.highlightAuto(code).value;
+});
+```
+
+
+## Замена TABов
+
+Также вы можете заменить символы TAB ('\x09'), используемые для отступов, на
+фиксированное количество пробелов или на отдельный `<span>`, чтобы задать ему
+какой-нибудь специальный стиль:
+
+```html
+<script type="text/javascript">
+  hljs.tabReplace = '    '; // 4 spaces
+  // ... or
+  hljs.tabReplace = '<span class="indent">\t</span>';
+
+  hljs.initHighlightingOnLoad();
+</script>
+```
+
+
+## Инициализация вручную
+
+Если вы используете другие теги для блоков кода, вы можете инициализировать их
+явно с помощью функции `highlightBlock(code, tabReplace, useBR)`. Она принимает
+DOM-элемент с текстом расцвечиваемого кода и опционально - строчку для замены
+символов TAB.
+
+Например с использованием jQuery код инициализации может выглядеть так:
+
+```javascript
+$(document).ready(function() {
+  $('pre code').each(function(i, e) {hljs.highlightBlock(e)});
+});
+```
+
+`highlightBlock` можно также использовать, чтобы подсветить блоки кода,
+добавленные на страницу динамически. Только убедитесь, что вы не делаете этого
+повторно для уже раскрашенных блоков.
+
+Если ваш блок кода использует `<br>` вместо переводов строки (т.е. если это не
+`<pre>`), передайте `true` третьим параметром в `highlightBlock`:
+
+```javascript
+$('div.code').each(function(i, e) {hljs.highlightBlock(e, null, true)});
+```
+
+
+## Эвристика
+
+Определение языка, на котором написан фрагмент, делается с помощью
+довольно простой эвристики: программа пытается расцветить фрагмент всеми
+языками подряд, и для каждого языка считает количество подошедших
+синтаксически конструкций и ключевых слов. Для какого языка нашлось больше,
+тот и выбирается.
+
+Это означает, что в коротких фрагментах высока вероятность ошибки, что
+периодически и случается. Чтобы указать язык фрагмента явно, надо написать
+его название в виде класса к элементу `<code>`:
+
+```html
+<pre><code class="html">...</code></pre>
+```
+
+Можно использовать рекомендованные в HTML5 названия классов:
+"language-html", "language-php". Также можно назначать классы на элемент
+`<pre>`.
+
+Чтобы запретить расцветку фрагмента вообще, используется класс "no-highlight":
+
+```html
+<pre><code class="no-highlight">...</code></pre>
+```
+
+
+## Экспорт
+
+В файле export.html находится небольшая программка, которая показывает и дает
+скопировать непосредственно HTML-код подсветки для любого заданного фрагмента кода.
+Это может понадобится например на сайте, на котором нельзя подключить сам скрипт
+highlight.js.
+
+
+## Координаты
+
+- Версия: 7.5
+- URL:    http://highlightjs.org/
+
+Лицензионное соглашение читайте в файле LICENSE.
+Список авторов и соавторов читайте в файле AUTHORS.ru.txt
diff --git a/htmltest/sites/all/libraries/highlightjs/classref.txt b/htmltest/sites/all/libraries/highlightjs/classref.txt
new file mode 100644
index 00000000..8113987d
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/classref.txt
@@ -0,0 +1,733 @@
+This is a full list of available classes corresponding to languages'
+syntactic structures. The parentheses after language name contain identifiers
+used as class names in `<code>` element.
+
+Python ("python"):
+
+  keyword          keyword
+  built_in         built-in objects (None, False, True and Ellipsis)
+  number           number
+  string           string (of any type)
+  comment          comment
+  decorator        @-decorator for functions
+  function         function header "def some_name(...):"
+  class            class header "class SomeName(...):"
+  title            name of a function or a class inside a header
+  params           everything inside parentheses in a function's or class' header
+
+Python profiler results ("profile"):
+
+  number           number
+  string           string
+  built_in         built-in function entry
+  filename         filename in an entry
+  summary          profiling summary
+  header           header of table of results
+  keyword          column header
+  function         function name in an entry (including parentheses)
+  title            actual name of a function in an entry (excluding parentheses)
+  prompt           interpreter prompt (>>> or ...)
+
+Ruby ("ruby"):
+
+  keyword          keyword
+  string           string
+  subst            in-string substitution (#{...})
+  comment          comment
+  yardoctag        YARD tag
+  function         function header "def some_name(...):"
+  class            class header "class SomeName(...):"
+  title            name of a function or a class inside a header
+  parent           name of a parent class
+  symbol           symbol
+
+Haml ("haml"):
+
+  tag              any tag starting with "%"
+  title            tag's name
+  attribute        tag's attribute
+  keyword          tag's attribute that is a keyword
+  string           attribute's value that is a string
+  value            attribute's value, shorthand id or class for tag
+  comment          comment
+  doctype          !!! declaration
+  bullet           line defined by variable
+
+Perl ("perl"):
+
+  keyword          keyword
+  comment          comment
+  number           number
+  string           string
+  regexp           regular expression
+  sub              subroutine header (from "sub" till "{")
+  variable         variable starting with "$", "%", "@"
+  operator         operator
+  pod              plain old doc
+
+PHP ("php"):
+
+  keyword          keyword
+  number           number
+  string           string (of any type)
+  comment          comment
+  phpdoc           phpdoc params in comments
+  variable         variable starting with "$"
+  preprocessor     preprocessor marks: "<?php" and "?>"
+
+Scala ("scala"):
+
+  keyword          keyword
+  number           number
+  string           string
+  comment          comment
+  annotation       annotation
+  javadoc          javadoc comment
+  javadoctag       @-tag in javadoc
+  class            class header
+  title            class name inside a header
+  params           everything in parentheses inside a class header
+  inheritance      keywords "extends" and "with" inside class header
+
+Go ("go"):
+
+  comment          comment
+  string           string constant
+  number           number
+  keyword          language keywords
+  constant         true false nil iota
+  typename         built-in plain types (int, string etc.)
+  built_in         built-in functions
+
+HTML, XML ("xml"):
+
+  tag              any tag from "<" till ">"
+  attribute        tag's attribute with or without value
+  value            attribute's value
+  comment          comment
+  pi               processing instruction (<? ... ?>)
+  doctype          <!DOCTYPE ... > declaration
+  cdata            CDATA section
+
+Lasso ("lasso"):
+
+  preprocessor     delimiters and interpreter flags
+  shebang          Lasso 9 shell script header
+  comment          single- or multi-line comment
+  javadoc          doc comment
+  keyword          keyword
+  literal          keyword representing a value
+  built_in         built-in types and variables
+  number           number
+  string           string
+  variable         variable reference starting with "#" or "$"
+  tag              tag literal
+  attribute        named or rest parameter in method signature
+  class            type, trait, or method header
+  title            name following "define" inside a header
+
+CSS ("css"):
+
+  tag              tag in selectors
+  id               #some_name in selectors
+  class            .some_name in selectors
+  at_rule          @-rule till first "{" or ";"
+  attr_selector    attribute selector (square brackets in a[href^=http://])
+  pseudo           pseudo classes and elemens (:after, ::after etc.)
+  comment          comment
+  rules            everything from "{" till "}"
+  attribute        property name inside a rule
+  value            property value inside a rule, from ":" till ";" or
+                   till the end of rule block
+  number           number within a value
+  string           string within a value
+  hexcolor         hex color (#FFFFFF) within a value
+  function         CSS function within a value
+  important        "!important" symbol
+
+SCSS ("scss"):
+
+  tag              tag in selectors
+  id               #some_name in selectors
+  class            .some_name in selectors
+  at_rule          @-rule till first "{" or ";"
+  attr_selector    attribute selector (square brackets in a[href^=http://])
+  pseudo           pseudo classes and elemens (:after, ::after etc.)
+  comment          comment
+  rules            everything from "{" till "}"
+  attribute        property name inside a rule
+  value            property value inside a rule, from ":" till ";" or
+                   till the end of rule block
+  number           number within a value
+  string           string within a value
+  hexcolor         hex color (#FFFFFF) within a value
+  function         CSS function within a value
+  important        "!important" symbol
+  variable         variable starting with "$"
+  preprocessor     keywords after @
+
+Markdown ("markdown"):
+
+  header            header
+  bullet            list bullet
+  emphasis          emphasis
+  strong            strong emphasis
+  blockquote        blockquote
+  code              code
+  horizontal_rule   horizontal rule
+  link_label        link label
+  link_url          link url
+
+AsciiDoc ("asciidoc"):
+
+  header            heading
+  bullet            list or labeled bullet
+  emphasis          emphasis
+  strong            strong emphasis
+  blockquote        blockquote
+  code              inline or block code
+  horizontal_rule   horizontal rule
+  link_label        link or image label
+  link_url          link or image url
+  comment           comment
+  attribute         document attribute, block attributes
+  label             admonition label
+
+Django ("django"):
+
+  keyword          HTML tag in HTML, default tags and default filters in templates
+  tag              any tag from "<" till ">"
+  comment          comment
+  doctype          <!DOCTYPE ... > declaration
+  attribute        tag's attribute with or withou value
+  value            attribute's value
+  template_tag     template tag {% .. %}
+  variable         template variable {{ .. }}
+  template_comment template comment, both {# .. #} and {% comment %}
+  filter           filter from "|" till the next filter or the end of tag
+  argument         filter argument
+
+Handlebars ("handlebars"):
+
+  expression       expression to be evaluated
+  variable         variable
+  begin-block      the beginning of a block
+  end-block        the ending of a block
+  string           string
+
+JSON ("json"):
+
+  number           number
+  literal          "true", "false" and "null"
+  string           string value
+  attribute        name of an object property
+  value            value of an object property
+
+JavaScript ("javascript"):
+
+  keyword          keyword
+  comment          comment
+  number           number
+  literal          special literal: "true", "false" and "null"
+  string           string
+  regexp           regular expression
+  function         header of a function
+  title            name of a function inside a header
+  params           parentheses and everything inside them in a function's header
+
+CoffeeScript ("coffeescript"):
+
+  keyword          keyword
+  comment          comment
+  number           number
+  literal          special literal: "true", "false" and "null"
+  built_in         built-in objects and functions ("window", "console", "require", etc...)
+  string           string
+  subst            #{ ... } interpolation in double-quoted strings
+  regexp           regular expression
+  function         header of a function
+  class            header of a class
+  title            name of a function variable inside a header
+  params           parentheses and everything inside them in a function's header
+  property         @-property within class and functions
+
+ActionScript ("actionscript"):
+
+  comment          comment
+  string           string
+  number           number
+  keyword          keywords
+  literal          literal
+  reserved         reserved keyword
+  title            name of declaration (package, class or function)
+  preprocessor     preprocessor directive (import, include)
+  type             type of returned value (for functions)
+  package          package (named or not)
+  class            class/interface
+  function         function
+  param            params of function
+  rest_arg         rest argument of function
+
+VBScript ("vbscript"):
+
+  keyword          keyword
+  number           number
+  string           string
+  comment          comment
+  built_in         built-in function
+
+VB.Net ("vbnet"):
+
+  keyword          keyword
+  built_in         built-in types
+  literal          "true", "false" and "nothing"
+  string           string
+  comment          comment
+  xmlDocTag        xmldoc tag ("'''", "<!--", "-->", "<..>")
+  preprocessor     preprocessor directive
+
+HTTP ("http"):
+
+  request          first line of a request
+  status           first line of a response
+  attribute        header name
+  string           header value or query string in a request line
+  number           status code
+
+Lua ("lua"):
+
+  keyword          keyword
+  number           number
+  string           string
+  comment          comment
+  built_in         built-in operator
+  function         header of a function
+  title            name of a function inside a header
+  params           everything inside parentheses in a function's header
+  long_brackets    multiline string in [=[ .. ]=]
+
+Delphi ("delphi"):
+
+  keyword          keyword
+  comment          comment (of any type)
+  number           number
+  string           string
+  function         header of a function, procedure, constructor and destructor
+  title            name of a function, procedure, constructor or destructor
+                   inside a header
+  params           everything inside parentheses in a function's header
+  class            class' body from "= class" till "end;"
+
+Java ("java"):
+
+  keyword          keyword
+  number           number
+  string           string
+  comment          commment
+  annotaion        annotation
+  javadoc          javadoc comment
+  class            class header from "class" till "{"
+  title            class name inside a header
+  params           everything in parentheses inside a class header
+  inheritance      keywords "extends" and "implements" inside class header
+
+C++ ("cpp"):
+
+  keyword          keyword
+  number           number
+  string           string and character
+  comment          comment
+  preprocessor     preprocessor directive
+  stl_container    instantiation of STL containers ("vector<...>")
+
+Objective C ("objectivec"):
+
+  keyword          keyword
+  built_in         Cocoa/Cocoa Touch constants and classes
+  number           number
+  string           string
+  comment          comment
+  preprocessor     preprocessor directive
+  class            interface/implementation, protocol and forward class declaration
+  variable         properties and struct accesors
+
+Vala ("vala"):
+
+  keyword          keyword
+  number           number
+  string           string
+  comment          comment
+  class            class definitions
+  title            in class definition
+  constant         ALL_UPPER_CASE
+
+C# ("cs"):
+
+  keyword          keyword
+  number           number
+  string           string
+  comment          commment
+  xmlDocTag        xmldoc tag ("///", "<!--", "-->", "<..>")
+
+F# ("fsharp"):
+
+  keywords         keyword
+  number           number
+  string           string
+  commment         comment
+  class            any custom F# type
+  title            the name of a custom F# type
+  annotation       any attribute
+
+OCaml ("ocaml"):
+  keywords         keyword
+  number           number
+  string           string
+  commment         comment
+  class            any custom OCaml type
+  title            the name of a custom OCaml type
+  annotation       any attribute
+
+D ("d"):
+
+  comment          comment
+  string           string constant
+  number           number
+  keyword          language keywords (including @attributes)
+  constant         true false null
+  built_in         built-in plain types (int, string etc.)
+
+RenderMan RSL ("rsl"):
+
+  keyword          keyword
+  number           number
+  string           string (including @"..")
+  comment          comment
+  preprocessor     preprocessor directive
+  shader           sahder keywords
+  shading          shading keywords
+  built_in         built-in function
+
+RenderMan RIB ("rib"):
+
+  keyword          keyword
+  number           number
+  string           string
+  comment          comment
+  commands         command
+
+Maya Embedded Language ("mel"):
+
+  keyword          keyword
+  number           number
+  string           string
+  comment          comment
+  variable         variable
+
+SQL ("sql"):
+
+  keyword          keyword (mostly SQL'92 and SQL'99)
+  number           number
+  string           string (of any type: "..", '..', `..`)
+  comment          comment
+  aggregate        aggregate function
+
+Smalltalk ("smalltalk"):
+
+  keyword          keyword
+  number           number
+  string           string
+  comment          commment
+  symbol           symbol
+  array            array
+  class            name of a class
+  char             char
+  localvars        block of local variables
+
+Lisp ("lisp"):
+
+  keyword          keyword
+  number           number
+  string           string
+  comment          commment
+  variable         variable
+  literal          b, t and nil
+  list             non-quoted list
+  title            first symbol in a non-quoted list
+  body             remainder of the non-quoted list
+  quoted           quoted list, both "(quote .. )" and "'(..)"
+
+Clojure ("clojure"):
+
+  comment          comments and hints
+  string           string
+  number           number
+  collection       collections
+  attribute        :keyword
+  title            function name (built-in or user defined)
+  built_in         built-in function name
+
+Ini ("ini"):
+
+  title            title of a section
+  value            value of a setting of any type
+  string           string
+  number           number
+  keyword          boolean value keyword
+
+Apache ("apache"):
+
+  keyword          keyword
+  number           number
+  comment          commment
+  literal          On and Off
+  sqbracket        variables in rewrites "%{..}"
+  cbracket         options in rewrites "[..]"
+  tag              begin and end of a configuration section
+
+Nginx ("nginx"):
+
+  title            directive title
+  string           string
+  number           number
+  comment          comment
+  built_in         built-in constant
+  variable         $-variable
+  regexp           regexp
+
+Diff ("diff"):
+
+  header           file header
+  chunk            chunk header within a file
+  addition         added lines
+  deletion         deleted lines
+  change           changed lines
+
+DOS ("dos"):
+
+  keyword          keyword
+  flow             batch control keyword
+  stream           DOS special files ("con", "prn", ...)
+  winutils         some commands (see dos.js specifically)
+  envvar           environment variables
+
+Bash ("bash"):
+
+  keyword          keyword
+  string           string
+  number           number
+  comment          comment
+  literal          special literal: "true" и "false"
+  variable         variable
+  shebang          script interpreter header
+
+Makefile ("makefile"):
+
+  keyword          keyword ".PHONY" within the phony line
+  string           string
+  comment          comment
+  variable         $(..) variable
+  title            target title
+  constant         constant within the initial definition
+
+CMake ("cmake"):
+
+  keyword          keyword
+  number           number
+  string           string
+  comment          commment
+  envvar           $-variable
+  operator         operator (LESS, STREQUAL, MATCHES, etc)
+
+Axapta ("axapta"):
+
+  keyword          keyword
+  number           number
+  string           string
+  comment          commment
+  class            class header from "class" till "{"
+  title            class name inside a header
+  params           everything in parentheses inside a class header
+  inheritance      keywords "extends" and "implements" inside class header
+  preprocessor     preprocessor directive
+
+Oracle Rules Language ("ruleslanguage"):
+
+  comment          comment
+  string           string constant
+  number           number
+  keyword          language keywords
+  built_in         built-in functions
+  array            array stem
+
+1C ("1c"):
+
+  keyword          keyword
+  number           number
+  date             date
+  string           string
+  comment          commment
+  function         header of function or procudure
+  title            function name inside a header
+  params           everything in parentheses inside a function header
+  preprocessor     preprocessor directive
+
+AVR assembler ("avrasm"):
+
+  keyword          keyword
+  built_in         pre-defined register
+  number           number
+  string           string
+  comment          commment
+  label            label
+  preprocessor     preprocessor directive
+  localvars        substitution in .macro
+
+VHDL ("vhdl"):
+
+  keyword          keyword
+  number           number
+  string           string
+  comment          commment
+  literal          signal logical value
+  typename         typename
+  attribute        signal attribute
+
+Parser3 ("parser3"):
+
+  keyword          keyword
+  number           number
+  comment          commment
+  variable         variable starting with "$"
+  preprocessor     preprocessor directive
+  title            user-defined name starting with "@"
+
+LiveCode Server ("livecodeserver"):
+
+  variable         variable starting with "g", "t", "p", "s", "$_"
+  string           string
+  comment          comment
+  number           number
+  title            name of a command or a function
+  keyword          keyword
+  constant         constant
+  operator         operator
+  built_in         built_in functions and commands
+  function         header of a function
+  command          header of a command
+  preprocessor     preprocessor marks: "<?", "<?rev", "<?lc", "<?livecode" and "?>"
+
+TeX ("tex"):
+
+  comment          comment
+  number           number
+  command          command
+  parameter        parameter
+  formula          formula
+  special          special symbol
+
+Haskell ("haskell"):
+
+  comment          comment
+  pragma           GHC pragma
+  preprocessor     CPP preprocessor directive
+  keyword          keyword
+  number           number
+  string           string
+  title            function or variable name
+  type             value, type or type class constructor name (i.e. capitalized)
+  container        (..., ...) or {...; ...} list in declaration or record
+  module           module declaration
+  import           import declaration
+  class            type class or instance declaration
+  typedef          type declaration (type, newtype, data)
+  default          default declaration
+  infix            infix declaration
+  foreign          FFI declaration
+  shebang          shebang line
+
+Erlang ("erlang"):
+
+  comment          comment
+  string           string
+  number           number
+  keyword          keyword
+  record_name      record access (#record_name)
+  title            name of declaration function
+  variable         variable (starts with capital letter or with _)
+  pp.keywords      module's attribute (-attribute)
+  function_name    atom or atom:atom in case of function call
+
+Rust ("rust"):
+
+  comment          comment
+  string           string
+  number           number
+  keyword          keyword
+  title            name of declaration
+  preprocessor     preprocessor directive
+
+Matlab ("matlab"):
+
+  comment          comment
+  string           string
+  number           number
+  keyword          keyword
+  title            function name
+  function         function
+  param            params of function
+  matrix           matrix in [ .. ]
+  cell             cell in { .. }
+
+Scilab ("scilab"):
+
+  comment          comment
+  string           string
+  number           number
+  keyword          keyword
+  title            function name
+  function         function
+  param            params of function
+  matrix           matrix in [ .. ]
+
+R ("r"):
+
+  comment          comment
+  string           string constant
+  number           number
+  keyword          language keywords (function, if) plus "structural"
+                   functions (attach, require, setClass)
+  literal          special literal: TRUE, FALSE, NULL, NA, etc.
+
+OpenGL Shading Language ("glsl"):
+
+  comment          comment
+  number           number
+  preprocessor     preprocessor directive
+  keyword          keyword
+  built_in         GLSL built-in functions and variables
+  literal          true false
+
+AppleScript ("applescript"):
+
+  keyword          keyword
+  command          core AppleScript command
+  constant         AppleScript built in constant
+  type             AppleScript variable type (integer, etc.)
+  property         Applescript built in property (length, etc.)
+  number           number
+  string           string
+  comment          comment
+  title            name of a handler
+
+Brainfuck ("brainfuck"):
+
+  title            Brainfuck while loop command
+  literal          Brainfuck inc and dec commands
+  comment          comment
+  string           Brainfuck input and output commands
+
+Mizar ("mizar"):
+
+  keyword          keyword
+  comment          comment
diff --git a/htmltest/sites/all/libraries/highlightjs/highlight.pack.js b/htmltest/sites/all/libraries/highlightjs/highlight.pack.js
new file mode 100644
index 00000000..9196726e
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/highlight.pack.js
@@ -0,0 +1 @@
+var hljs=new function(){function l(o){return o.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function b(p){for(var o=p.firstChild;o;o=o.nextSibling){if(o.nodeName.toUpperCase()=="CODE"){return o}if(!(o.nodeType==3&&o.nodeValue.match(/\s+/))){break}}}function h(p,o){return Array.prototype.map.call(p.childNodes,function(q){if(q.nodeType==3){return o?q.nodeValue.replace(/\n/g,""):q.nodeValue}if(q.nodeName.toUpperCase()=="BR"){return"\n"}return h(q,o)}).join("")}function a(q){var p=(q.className+" "+(q.parentNode?q.parentNode.className:"")).split(/\s+/);p=p.map(function(r){return r.replace(/^language-/,"")});for(var o=0;o<p.length;o++){if(e[p[o]]||p[o]=="no-highlight"){return p[o]}}}function c(q){var o=[];(function p(r,s){for(var t=r.firstChild;t;t=t.nextSibling){if(t.nodeType==3){s+=t.nodeValue.length}else{if(t.nodeName.toUpperCase()=="BR"){s+=1}else{if(t.nodeType==1){o.push({event:"start",offset:s,node:t});s=p(t,s);o.push({event:"stop",offset:s,node:t})}}}}return s})(q,0);return o}function j(p,r,v){var q=0;var y="";var s=[];function u(){if(!p.length||!r.length){return p.length?p:r}if(p[0].offset!=r[0].offset){return(p[0].offset<r[0].offset)?p:r}return r[0].event=="start"?p:r}function t(A){function z(B){return" "+B.nodeName+'="'+l(B.value)+'"'}y+="<"+A.nodeName.toLowerCase()+Array.prototype.map.call(A.attributes,z).join("")+">"}function x(z){y+="</"+z.nodeName.toLowerCase()+">"}function o(z){(z.event=="start"?t:x)(z.node)}while(p.length||r.length){var w=u();y+=l(v.substr(q,w[0].offset-q));q=w[0].offset;if(w==p){s.reverse().forEach(x);do{o(w.splice(0,1)[0]);w=u()}while(w==p&&w.length&&w[0].offset==q);s.reverse().forEach(t)}else{if(w[0].event=="start"){s.push(w[0].node)}else{s.pop()}o(w.splice(0,1)[0])}}return y+l(v.substr(q))}function f(r){function o(s){return(s&&s.source)||s}function p(t,s){return RegExp(o(t),"m"+(r.cI?"i":"")+(s?"g":""))}function q(z,x){if(z.compiled){return}z.compiled=true;var u=[];if(z.k){var s={};function A(B,t){if(r.cI){t=t.toLowerCase()}t.split(" ").forEach(function(C){var D=C.split("|");s[D[0]]=[B,D[1]?Number(D[1]):1];u.push(D[0])})}z.lR=p(z.l||"\\b"+hljs.IR+"\\b(?!\\.)",true);if(typeof z.k=="string"){A("keyword",z.k)}else{for(var y in z.k){if(!z.k.hasOwnProperty(y)){continue}A(y,z.k[y])}}z.k=s}if(x){if(z.bWK){z.b="\\b("+u.join("|")+")\\b(?!\\.)\\s*"}z.bR=p(z.b?z.b:"\\B|\\b");if(!z.e&&!z.eW){z.e="\\B|\\b"}if(z.e){z.eR=p(z.e)}z.tE=o(z.e)||"";if(z.eW&&x.tE){z.tE+=(z.e?"|":"")+x.tE}}if(z.i){z.iR=p(z.i)}if(z.r===undefined){z.r=1}if(!z.c){z.c=[]}for(var w=0;w<z.c.length;w++){if(z.c[w]=="self"){z.c[w]=z}q(z.c[w],z)}if(z.starts){q(z.starts,x)}var v=[];for(var w=0;w<z.c.length;w++){v.push(o(z.c[w].b))}if(z.tE){v.push(o(z.tE))}if(z.i){v.push(o(z.i))}z.t=v.length?p(v.join("|"),true):{exec:function(t){return null}}}q(r)}function d(E,G,C,M){function o(r,P){for(var O=0;O<P.c.length;O++){var N=P.c[O].bR.exec(r);if(N&&N.index==0){return P.c[O]}}}function s(N,r){if(N.e&&N.eR.test(r)){return N}if(N.eW){return s(N.parent,r)}}function t(r,N){return !C&&N.i&&N.iR.test(r)}function y(O,r){var N=H.cI?r[0].toLowerCase():r[0];return O.k.hasOwnProperty(N)&&O.k[N]}function I(){var N=l(w);if(!B.k){return N}var r="";var Q=0;B.lR.lastIndex=0;var O=B.lR.exec(N);while(O){r+=N.substr(Q,O.index-Q);var P=y(B,O);if(P){v+=P[1];r+='<span class="'+P[0]+'">'+O[0]+"</span>"}else{r+=O[0]}Q=B.lR.lastIndex;O=B.lR.exec(N)}return r+N.substr(Q)}function z(){if(B.sL&&!e[B.sL]){return l(w)}var N=B.subLanguageMode=="continuous"?B.top:undefined;var r=B.sL?d(B.sL,w,true,N):g(w);if(B.r>0){v+=r.keyword_count;A+=r.r}B.top=r.top;return'<span class="'+r.language+'">'+r.value+"</span>"}function L(){return B.sL!==undefined?z():I()}function K(O,r){var N=O.cN?'<span class="'+O.cN+'">':"";if(O.rB){x+=N;w=""}else{if(O.eB){x+=l(r)+N;w=""}else{x+=N;w=r}}B=Object.create(O,{parent:{value:B}})}function D(N,r){w+=N;if(r===undefined){x+=L();return 0}var P=o(r,B);if(P){x+=L();K(P,r);return P.rB?0:r.length}var Q=s(B,r);if(Q){var O=B;if(!(O.rE||O.eE)){w+=r}x+=L();do{if(B.cN){x+="</span>"}A+=B.r;B=B.parent}while(B!=Q.parent);if(O.eE){x+=l(r)}w="";if(Q.starts){K(Q.starts,"")}return O.rE?0:r.length}if(t(r,B)){throw new Error('Illegal lexem "'+r+'" for mode "'+(B.cN||"<unnamed>")+'"')}w+=r;return r.length||1}var H=e[E];if(!H){throw new Error('Unknown language: "'+E+'"')}f(H);var B=M||H;var x="";for(var F=B;F!=H;F=F.parent){if(F.cN){x='<span class="'+F.cN+'">'+x}}var w="";var A=0;var v=0;try{var u,q,p=0;while(true){B.t.lastIndex=p;u=B.t.exec(G);if(!u){break}q=D(G.substr(p,u.index-p),u[0]);p=u.index+q}D(G.substr(p));for(var F=B;F.parent;F=F.parent){if(F.cN){x+="</span>"}}return{r:A,keyword_count:v,value:x,language:E,top:B}}catch(J){if(J.message.indexOf("Illegal")!=-1){return{r:0,keyword_count:0,value:l(G)}}else{throw J}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s,false);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g,"<br>")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v,true):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElementNS("http://www.w3.org/1999/xhtml","pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagNameNS("http://www.w3.org/1999/xhtml","pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES.bash=function(a){var c={cN:"variable",b:/\$[\w\d#@][\w\d_]*/};var b={cN:"variable",b:/\$\{(.*?)\}/};var e={cN:"string",b:/"/,e:/"/,c:[a.BE,c,b,{cN:"variable",b:/\$\(/,e:/\)/,c:a.BE}],r:0};var d={cN:"string",b:/'/,e:/'/,r:0};return{l:/-?[a-z]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[{cN:"title",b:/\w[\w\d_]*/}],r:0},a.HCM,a.NM,e,d,c,b]}}(hljs);hljs.LANGUAGES.cs=function(a){return{k:"abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield",c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"}]},a.CLCM,a.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},a.ASM,a.QSM,a.CNM]}}(hljs);hljs.LANGUAGES.ruby=function(e){var a="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g={keyword:"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include"};var c={cN:"yardoctag",b:"@[A-Za-z]+"};var k=[{cN:"comment",b:"#",e:"$",c:[c]},{cN:"comment",b:"^\\=begin",e:"^\\=end",c:[c],r:10},{cN:"comment",b:"^__END__",e:"\\n$"}];var d={cN:"subst",b:"#\\{",e:"}",l:a,k:g};var i=[e.BE,d];var b=[{cN:"string",b:"'",e:"'",c:i,r:0},{cN:"string",b:'"',e:'"',c:i,r:0},{cN:"string",b:"%[qw]?\\(",e:"\\)",c:i},{cN:"string",b:"%[qw]?\\[",e:"\\]",c:i},{cN:"string",b:"%[qw]?{",e:"}",c:i},{cN:"string",b:"%[qw]?<",e:">",c:i,r:10},{cN:"string",b:"%[qw]?/",e:"/",c:i,r:10},{cN:"string",b:"%[qw]?%",e:"%",c:i,r:10},{cN:"string",b:"%[qw]?-",e:"-",c:i,r:10},{cN:"string",b:"%[qw]?\\|",e:"\\|",c:i,r:10},{cN:"string",b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}];var h={cN:"function",bWK:true,e:" |$|;",k:"def",c:[{cN:"title",b:j,l:a,k:g},{cN:"params",b:"\\(",e:"\\)",l:a,k:g}].concat(k)};var f=k.concat(b.concat([{cN:"class",bWK:true,e:"$|;",k:"class module",c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(k)},h,{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:b.concat([{b:j}]),r:0},{cN:"symbol",b:a+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:k.concat([{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[e.BE,d]},{cN:"regexp",b:"%r{",e:"}[a-z]*",i:"\\n",c:[e.BE,d]},{cN:"regexp",b:"%r\\(",e:"\\)[a-z]*",i:"\\n",c:[e.BE,d]},{cN:"regexp",b:"%r!",e:"![a-z]*",i:"\\n",c:[e.BE,d]},{cN:"regexp",b:"%r\\[",e:"\\][a-z]*",i:"\\n",c:[e.BE,d]}]),r:0}]));d.c=f;h.c[1].c=f;return{l:a,k:g,c:f}}(hljs);hljs.LANGUAGES.diff=function(a){return{c:[{cN:"chunk",b:"^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$",r:10},{cN:"chunk",b:"^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$",r:10},{cN:"chunk",b:"^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$",r:10},{cN:"header",b:"Index: ",e:"$"},{cN:"header",b:"=====",e:"=====$"},{cN:"header",b:"^\\-\\-\\-",e:"$"},{cN:"header",b:"^\\*{3} ",e:"$"},{cN:"header",b:"^\\+\\+\\+",e:"$"},{cN:"header",b:"\\*{5}",e:"\\*{5}$"},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}}(hljs);hljs.LANGUAGES.javascript=function(a){return{k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const",literal:"true false null undefined NaN Infinity"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/</,e:/>;/,sL:"xml"}],r:0},{cN:"function",bWK:true,e:/{/,k:"function",c:[{cN:"title",b:/[A-Za-z$_][0-9A-Za-z$_]*/},{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBLCLM],i:/["'\(]/}],i:/\[|%/}]}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,r:0,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",r:0,c:[{cN:"title",b:"[^ /><]+"},b]}]}}(hljs);hljs.LANGUAGES.markdown=function(a){return{c:[{cN:"header",b:"^#{1,3}",e:"$"},{cN:"header",b:"^.+?\\n[=-]{2,}$"},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",b:"\\*.+?\\*"},{cN:"emphasis",b:"_.+?_",r:0},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",b:"`.+?`"},{cN:"code",b:"^    ",e:"$",r:0},{cN:"horizontal_rule",b:"^-{3,}",e:"$"},{b:"\\[.+?\\]\\(.+?\\)",rB:true,c:[{cN:"link_label",b:"\\[.+\\]"},{cN:"link_url",b:"\\(",e:"\\)",eB:true,eE:true}]}]}}(hljs);hljs.LANGUAGES.css=function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}}(hljs);hljs.LANGUAGES.http=function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}}(hljs);hljs.LANGUAGES.java=function(a){return{k:"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"(^|\\s)@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,a.ASM,a.QSM,{cN:"class",bWK:true,e:"{",k:"class interface",eE:true,i:":",c:[{bWK:true,k:"extends implements",r:10},{cN:"title",b:a.UIR}]},a.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}}(hljs);hljs.LANGUAGES.php=function(a){var e={cN:"variable",b:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var b=[a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),{cN:"string",b:'b"',e:'"',c:[a.BE]},{cN:"string",b:"b'",e:"'",c:[a.BE]}];var c=[a.BNM,a.CNM];var d={cN:"title",b:a.UIR};return{cI:true,l:a.UIR,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return implements parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try this switch continue endfor endif declare unset true false namespace trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[a.CLCM,a.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"}]},{cN:"comment",b:"__halt_compiler.+?;",eW:true,k:"__halt_compiler",l:a.UIR},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[a.BE]},{cN:"preprocessor",b:"<\\?php",r:10},{cN:"preprocessor",b:"\\?>"},e,{cN:"function",bWK:true,e:"{",k:"function",i:"\\$|\\[|%",c:[d,{cN:"params",b:"\\(",e:"\\)",c:["self",e,a.CBLCLM].concat(b).concat(c)}]},{cN:"class",bWK:true,e:"{",k:"class",i:"[:\\(\\$]",c:[{bWK:true,eW:true,k:"extends",c:[d]},d]},{b:"=>"}].concat(b).concat(c)}}(hljs);hljs.LANGUAGES.haskell=function(f){var h={cN:"comment",b:"--",e:"$"};var g={cN:"comment",c:["self"],b:"{-",e:"-}"};var e={cN:"pragma",b:"{-#",e:"#-}"};var b={cN:"preprocessor",b:"^#",e:"$"};var d={cN:"type",b:"\\b[A-Z][\\w']*",r:0};var c={cN:"container",b:"\\(",e:"\\)",i:'"',c:[e,h,g,b,{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},{cN:"title",b:"[_a-z][\\w']*"}]};var a={cN:"container",b:"{",e:"}",c:c.c};return{k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",c:[{cN:"module",b:"\\bmodule ",e:"where",k:"module where",c:[c,g],i:"\\W\\.|;"},{cN:"import",b:"\\bimport ",e:"$",k:"import qualified as hiding",c:[c,h,g],i:"\\W\\.|;"},{cN:"class",b:"\\b(class |instance )",e:"where",k:"class family instance where",c:[d,c,g]},{cN:"typedef",b:"\\b(data |(new)?type )",e:"$",k:"data family type newtype deriving",c:[e,h,g,d,c,a]},{cN:"default",b:"\\bdefault ",e:"$",k:"default",c:[d,c,h,g]},{cN:"infix",b:"\\b(infix |infixl |infixr )",e:"$",k:"infix infixl infixr",c:[f.CNM,h,g]},{cN:"foreign",b:"\\bforeign ",e:"$",k:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",c:[d,f.QSM,h,g]},{cN:"shebang",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},e,h,g,b,f.QSM,f.CNM,d,{cN:"title",b:"^[_a-z][\\w']*"},{b:"->|<-"}]}}(hljs);hljs.LANGUAGES.python=function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var c=[{cN:"string",b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{cN:"string",b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{cN:"string",b:/(u|r|ur)'/,e:/'/,c:[a.BE],r:10},{cN:"string",b:/(u|r|ur)"/,e:/"/,c:[a.BE],r:10},{cN:"string",b:/(b|br)'/,e:/'/,c:[a.BE]},{cN:"string",b:/(b|br)"/,e:/"/,c:[a.BE]}].concat([a.ASM,a.QSM]);var e={cN:"title",b:a.UIR};var d={cN:"params",b:/\(/,e:/\)/,c:["self",a.CNM,f].concat(c)};var b={bWK:true,e:/:/,i:/[${=;\n]/,c:[e,d],r:10};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:c.concat([f,a.HCM,a.inherit(b,{cN:"function",k:"def"}),a.inherit(b,{cN:"class",k:"class"}),a.CNM,{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}])}}(hljs);hljs.LANGUAGES.tex=function(a){var d={cN:"command",b:"\\\\[a-zA-Zа-яА-я]+[\\*]?"};var c={cN:"command",b:"\\\\[^a-zA-Zа-яА-я0-9]"};var b={cN:"special",b:"[{}\\[\\]\\&#~]",r:0};return{c:[{b:"\\\\[a-zA-Zа-яА-я]+[\\*]? *= *-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",rB:true,c:[d,c,{cN:"number",b:" *=",e:"-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",eB:true}],r:10},d,c,b,{cN:"formula",b:"\\$\\$",e:"\\$\\$",c:[d,c,b],r:0},{cN:"formula",b:"\\$",e:"\\$",c:[d,c,b],r:0},{cN:"comment",b:"%",e:"$",r:0}]}}(hljs);hljs.LANGUAGES.sql=function(a){return{cI:true,c:[{cN:"operator",b:"(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}],r:0},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}],r:0},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}}(hljs);hljs.LANGUAGES.ini=function(a){return{cI:true,i:"[^\\s]",c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}}(hljs);hljs.LANGUAGES.d=function(x){var b={keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"};var c="(0|[1-9][\\d_]*)",q="(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)",h="0[bB][01_]+",v="([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)",y="0[xX]"+v,p="([eE][+-]?"+q+")",o="("+q+"(\\.\\d*|"+p+")|\\d+\\."+q+q+"|\\."+c+p+"?)",k="(0[xX]("+v+"\\."+v+"|\\.?"+v+")[pP][+-]?"+q+")",l="("+c+"|"+h+"|"+y+")",n="("+k+"|"+o+")";var z="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};";var m={cN:"number",b:"\\b"+l+"(L|u|U|Lu|LU|uL|UL)?",r:0};var j={cN:"number",b:"\\b("+n+"([fF]|L|i|[fF]i|Li)?|"+l+"(i|[fF]i|Li))",r:0};var s={cN:"string",b:"'("+z+"|.)",e:"'",i:"."};var r={b:z,r:0};var w={cN:"string",b:'"',c:[r],e:'"[cwd]?',r:0};var f={cN:"string",b:'[rq]"',e:'"[cwd]?',r:5};var u={cN:"string",b:"`",e:"`[cwd]?"};var i={cN:"string",b:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',r:10};var t={cN:"string",b:'q"\\{',e:'\\}"'};var e={cN:"shebang",b:"^#!",e:"$",r:5};var g={cN:"preprocessor",b:"#(line)",e:"$",r:5};var d={cN:"keyword",b:"@[a-zA-Z_][a-zA-Z_\\d]*"};var a={cN:"comment",b:"\\/\\+",c:["self"],e:"\\+\\/",r:10};return{l:x.UIR,k:b,c:[x.CLCM,x.CBLCLM,a,i,w,f,u,t,j,m,s,e,g,d]}}(hljs);hljs.LANGUAGES.perl=function(e){var a="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var d={cN:"subst",b:"[$@]\\{",e:"\\}",k:a,r:10};var b={cN:"variable",b:"\\$\\d"};var i={cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|[^\\s\\w{]|{\\w+}|\\w+(\\:\\:\\w*)*)"};var f=[e.BE,d,b,i];var h={b:"->",c:[{b:e.IR},{b:"{",e:"}"}]};var g={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var c=[b,i,e.HCM,g,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},h,{cN:"string",b:"q[qwxr]?\\s*\\(",e:"\\)",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\[",e:"\\]",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\{",e:"\\}",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\|",e:"\\|",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\<",e:"\\>",c:f,r:5},{cN:"string",b:"qw\\s+q",e:"q",c:f,r:5},{cN:"string",b:"'",e:"'",c:[e.BE],r:0},{cN:"string",b:'"',e:'"',c:f,r:0},{cN:"string",b:"`",e:"`",c:[e.BE]},{cN:"string",b:"{\\w+}",r:0},{cN:"string",b:"-?\\w+\\s*\\=\\>",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"("+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,g,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"sub",bWK:true,e:"(\\s*\\(.*?\\))?[;{]",k:"sub",r:5},{cN:"operator",b:"-\\w\\b",r:0}];d.c=c;h.c[1].c=c;return{k:a,c:c}}(hljs);hljs.LANGUAGES.cmake=function(a){return{cI:true,k:{keyword:"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or",operator:"equal less greater strless strgreater strequal matches"},c:[{cN:"envvar",b:"\\${",e:"}"},a.HCM,a.QSM,a.NM]}}(hljs);hljs.LANGUAGES.objectivec=function(a){var b={keyword:"int float while private char catch export sizeof typedef const struct for union unsigned long volatile static protected bool mutable if public do return goto void enum else break extern asm case short default double throw register explicit signed typename try this switch continue wchar_t inline readonly assign property self synchronized end synthesize id optional required nonatomic super unichar finally dynamic IBOutlet IBAction selector strong weak readonly",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.CNM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"preprocessor",b:"#import",e:"$",c:[{cN:"title",b:'"',e:'"'},{cN:"title",b:"<",e:">"}]},{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bWK:true,e:"({|$)",k:"interface class protocol implementation",c:[{cN:"id",b:a.UIR}]},{cN:"variable",b:"\\."+a.UIR,r:0}]}}(hljs);hljs.LANGUAGES.coffeescript=function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module exports global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f={cN:"title",b:a};var e={cN:"subst",b:"#\\{",e:"}",k:b,};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",b:"'''",e:"'''",c:[c.BE]},{cN:"string",b:"'",e:"'",c:[c.BE],r:0},{cN:"string",b:'"""',e:'"""',c:[c.BE,e]},{cN:"string",b:'"',e:'"',c:[c.BE,e],r:0},{cN:"regexp",b:"///",e:"///",c:[c.HCM]},{cN:"regexp",b:"//[gim]*",r:0},{cN:"regexp",b:"/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)"},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{k:b,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\(",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bWK:true,k:"class",e:"$",i:"[:\\[\\]]",c:[{bWK:true,k:"extends",eW:true,i:":",c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true}])}}(hljs);hljs.LANGUAGES.nginx=function(b){var c=[{cN:"variable",b:"\\$\\d+"},{cN:"variable",b:"\\${",e:"}"},{cN:"variable",b:"[\\$\\@]"+b.UIR}];var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[b.HCM,{cN:"string",b:'"',e:'"',c:[b.BE].concat(c),r:0},{cN:"string",b:"'",e:"'",c:[b.BE].concat(c),r:0},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true},{cN:"regexp",b:"\\s\\^",e:"\\s|{|;",rE:true,c:[b.BE].concat(c)},{cN:"regexp",b:"~\\*?\\s+",e:"\\s|{|;",rE:true,c:[b.BE].concat(c)},{cN:"regexp",b:"\\*(\\.[a-z\\-]+)+",c:[b.BE].concat(c)},{cN:"regexp",b:"([a-z\\-]+\\.)+\\*",c:[b.BE].concat(c)},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0}].concat(c)};return{c:[b.HCM,{b:b.UIR+"\\s",e:";|{",rB:true,c:[{cN:"title",b:b.UIR,starts:a}],r:0}],i:"[^\\s\\}]"}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}}(hljs);hljs.LANGUAGES.django=function(a){var b={cN:"filter",b:/\|[A-Za-z]+\:?/,k:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone",c:[{cN:"argument",b:/"/,e:/"/},{cN:"argument",b:/'/,e:/'/}]};return{cI:true,sL:"xml",subLanguageMode:"continuous",c:[{cN:"template_comment",b:/{%\s*comment\s*%}/,e:/{%\s*endcomment\s*%}/},{cN:"template_comment",b:/{#/,e:/#}/},{cN:"template_tag",b:/{%/,e:/%}/,k:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim",c:[b]},{cN:"variable",b:/{{/,e:/}}/,c:[b]}]}}(hljs);hljs.LANGUAGES.apache=function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{cI:true,c:[a.HCM,{cN:"tag",b:"</?",e:">"},{cN:"keyword",b:/\w+/,r:0,k:{common:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,a.QSM]}}],i:/\S/}}(hljs);hljs.LANGUAGES.cpp=function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'\\\\?.",e:"'",i:"."},{cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},a.CNM,{cN:"preprocessor",b:"#",e:"$",c:[{b:"<",e:">",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10,c:["self"]}]}}(hljs);hljs.LANGUAGES.scilab=function(a){var b=[a.CNM,{cN:"string",b:"'|\"",e:"'|\"",c:[a.BE,{b:"''"}],r:0}];return{k:{keyword:"abort break case clear catch continue do elseif else endfunction end for functionglobal if pause return resume select try then while%f %F %t %T %pi %eps %inf %nan %e %i %z %s",built_in:"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp errorexec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isemptyisinfisnan isvector lasterror length load linspace list listfiles log10 log2 logmax min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand realround sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tantype typename warning zeros matrix"},i:'("|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bWK:true,e:"$",k:"function endfunction|10",c:[{cN:"title",b:a.UIR},{cN:"params",b:"\\(",e:"\\)"},],},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:""},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",c:b},{cN:"comment",b:"//",e:"$"}].concat(b)}}(hljs);hljs.LANGUAGES.makefile=function(a){var b={cN:"variable",b:/\$\(/,e:/\)/,c:a.BE};return{c:[a.HCM,{b:/^\w+\s*\W*=/,rB:true,r:0,starts:{cN:"constant",e:/\s*\W*=/,eE:true,starts:{e:/$/,r:0,c:[b],}}},{cN:"title",b:/^[\w]+:\s*$/},{cN:"phony",b:/^\.PHONY:/,e:/$/,k:".PHONY",l:/[\.\w]+/},{b:/^\t+/,e:/$/,c:[a.QSM,b]}]}}(hljs);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/arta.css b/htmltest/sites/all/libraries/highlightjs/styles/arta.css
new file mode 100644
index 00000000..e224db87
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/arta.css
@@ -0,0 +1,160 @@
+/*
+Date: 17.V.2011
+Author: pumbur <pumbur@pumbur.net>
+*/
+
+pre code
+{
+  display: block; padding: 0.5em;
+  background: #222;
+}
+
+pre .profile .header *,
+pre .ini .title,
+pre .nginx .title
+{
+  color: #fff;
+}
+
+pre .comment,
+pre .javadoc,
+pre .preprocessor,
+pre .preprocessor .title,
+pre .pragma,
+pre .shebang,
+pre .profile .summary,
+pre .diff,
+pre .pi,
+pre .doctype,
+pre .tag,
+pre .template_comment,
+pre .css .rules,
+pre .tex .special
+{
+  color: #444;
+}
+
+pre .string,
+pre .symbol,
+pre .diff .change,
+pre .regexp,
+pre .xml .attribute,
+pre .smalltalk .char,
+pre .xml .value,
+pre .ini .value,
+pre .clojure .attribute,
+pre .coffeescript .attribute
+{
+  color: #ffcc33;
+}
+
+pre .number,
+pre .addition
+{
+  color: #00cc66;
+}
+
+pre .built_in,
+pre .literal,
+pre .vhdl .typename,
+pre .go .constant,
+pre .go .typename,
+pre .ini .keyword,
+pre .lua .title,
+pre .perl .variable,
+pre .php .variable,
+pre .mel .variable,
+pre .django .variable,
+pre .css .funtion,
+pre .smalltalk .method,
+pre .hexcolor,
+pre .important,
+pre .flow,
+pre .inheritance,
+pre .parser3 .variable
+{
+  color: #32AAEE;
+}
+
+pre .keyword,
+pre .tag .title,
+pre .css .tag,
+pre .css .class,
+pre .css .id,
+pre .css .pseudo,
+pre .css .attr_selector,
+pre .lisp .title,
+pre .clojure .built_in,
+pre .winutils,
+pre .tex .command,
+pre .request,
+pre .status
+{
+  color: #6644aa;
+}
+
+pre .title,
+pre .ruby .constant,
+pre .vala .constant,
+pre .parent,
+pre .deletion,
+pre .template_tag,
+pre .css .keyword,
+pre .objectivec .class .id,
+pre .smalltalk .class,
+pre .lisp .keyword,
+pre .apache .tag,
+pre .nginx .variable,
+pre .envvar,
+pre .bash .variable,
+pre .go .built_in,
+pre .vbscript .built_in,
+pre .lua .built_in,
+pre .rsl .built_in,
+pre .tail,
+pre .avrasm .label,
+pre .tex .formula,
+pre .tex .formula *
+{
+  color: #bb1166;
+}
+
+pre .yardoctag,
+pre .phpdoc,
+pre .profile .header,
+pre .ini .title,
+pre .apache .tag,
+pre .parser3 .title
+{
+  font-weight: bold;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata
+{
+  opacity: 0.6;
+}
+
+pre code,
+pre .javascript,
+pre .css,
+pre .xml,
+pre .subst,
+pre .diff .chunk,
+pre .css .value,
+pre .css .attribute,
+pre .lisp .string,
+pre .lisp .number,
+pre .tail .params,
+pre .container,
+pre .haskell *,
+pre .erlang *,
+pre .erlang_repl *
+{
+  color: #aaa;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/ascetic.css b/htmltest/sites/all/libraries/highlightjs/styles/ascetic.css
new file mode 100644
index 00000000..63349b7f
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/ascetic.css
@@ -0,0 +1,50 @@
+﻿/*
+
+Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>
+
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background: white; color: black;
+}
+
+pre .string,
+pre .tag .value,
+pre .filter .argument,
+pre .addition,
+pre .change,
+pre .apache .tag,
+pre .apache .cbracket,
+pre .nginx .built_in,
+pre .tex .formula {
+  color: #888;
+}
+
+pre .comment,
+pre .template_comment,
+pre .shebang,
+pre .doctype,
+pre .pi,
+pre .javadoc,
+pre .deletion,
+pre .apache .sqbracket {
+  color: #CCC;
+}
+
+pre .keyword,
+pre .tag .title,
+pre .ini .title,
+pre .lisp .title,
+pre .clojure .title,
+pre .http .title,
+pre .nginx .title,
+pre .css .tag,
+pre .winutils,
+pre .flow,
+pre .apache .tag,
+pre .tex .command,
+pre .request,
+pre .status {
+  font-weight: bold;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/brown_paper.css b/htmltest/sites/all/libraries/highlightjs/styles/brown_paper.css
new file mode 100644
index 00000000..46ce452b
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/brown_paper.css
@@ -0,0 +1,105 @@
+/*
+
+Brown Paper style from goldblog.com.ua (c) Zaripov Yura <yur4ik7@ukr.net>
+
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background:#b7a68e url(./brown_papersq.png);
+}
+
+pre .keyword,
+pre .literal,
+pre .change,
+pre .winutils,
+pre .flow,
+pre .lisp .title,
+pre .clojure .built_in,
+pre .nginx .title,
+pre .tex .special,
+pre .request,
+pre .status {
+  color:#005599;
+  font-weight:bold;
+}
+
+pre code,
+pre .subst,
+pre .tag .keyword {
+  color: #363C69;
+}
+
+pre .string,
+pre .title,
+pre .haskell .type,
+pre .tag .value,
+pre .css .rules .value,
+pre .preprocessor,
+pre .pragma,
+pre .ruby .symbol,
+pre .ruby .symbol .string,
+pre .ruby .class .parent,
+pre .built_in,
+pre .sql .aggregate,
+pre .django .template_tag,
+pre .django .variable,
+pre .smalltalk .class,
+pre .javadoc,
+pre .ruby .string,
+pre .django .filter .argument,
+pre .smalltalk .localvars,
+pre .smalltalk .array,
+pre .attr_selector,
+pre .pseudo,
+pre .addition,
+pre .stream,
+pre .envvar,
+pre .apache .tag,
+pre .apache .cbracket,
+pre .tex .number {
+  color: #2C009F;
+}
+
+pre .comment,
+pre .java .annotation,
+pre .python .decorator,
+pre .template_comment,
+pre .pi,
+pre .doctype,
+pre .deletion,
+pre .shebang,
+pre .apache .sqbracket,
+pre .nginx .built_in,
+pre .tex .formula {
+  color: #802022;
+}
+
+pre .keyword,
+pre .literal,
+pre .css .id,
+pre .phpdoc,
+pre .title,
+pre .haskell .type,
+pre .vbscript .built_in,
+pre .sql .aggregate,
+pre .rsl .built_in,
+pre .smalltalk .class,
+pre .diff .header,
+pre .chunk,
+pre .winutils,
+pre .bash .variable,
+pre .apache .tag,
+pre .tex .command {
+  font-weight: bold;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.8;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/brown_papersq.png b/htmltest/sites/all/libraries/highlightjs/styles/brown_papersq.png
new file mode 100644
index 00000000..3813903d
Binary files /dev/null and b/htmltest/sites/all/libraries/highlightjs/styles/brown_papersq.png differ
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/dark.css b/htmltest/sites/all/libraries/highlightjs/styles/dark.css
new file mode 100644
index 00000000..07fd56e9
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/dark.css
@@ -0,0 +1,105 @@
+﻿/*
+
+Dark style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>
+
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background: #444;
+}
+
+pre .keyword,
+pre .literal,
+pre .change,
+pre .winutils,
+pre .flow,
+pre .lisp .title,
+pre .clojure .built_in,
+pre .nginx .title,
+pre .tex .special {
+  color: white;
+}
+
+pre code,
+pre .subst {
+  color: #DDD;
+}
+
+pre .string,
+pre .title,
+pre .haskell .type,
+pre .ini .title,
+pre .tag .value,
+pre .css .rules .value,
+pre .preprocessor,
+pre .pragma,
+pre .ruby .symbol,
+pre .ruby .symbol .string,
+pre .ruby .class .parent,
+pre .built_in,
+pre .sql .aggregate,
+pre .django .template_tag,
+pre .django .variable,
+pre .smalltalk .class,
+pre .javadoc,
+pre .ruby .string,
+pre .django .filter .argument,
+pre .smalltalk .localvars,
+pre .smalltalk .array,
+pre .attr_selector,
+pre .pseudo,
+pre .addition,
+pre .stream,
+pre .envvar,
+pre .apache .tag,
+pre .apache .cbracket,
+pre .tex .command,
+pre .prompt,
+pre .coffeescript .attribute {
+  color: #D88;
+}
+
+pre .comment,
+pre .java .annotation,
+pre .python .decorator,
+pre .template_comment,
+pre .pi,
+pre .doctype,
+pre .deletion,
+pre .shebang,
+pre .apache .sqbracket,
+pre .tex .formula {
+  color: #777;
+}
+
+pre .keyword,
+pre .literal,
+pre .title,
+pre .css .id,
+pre .phpdoc,
+pre .haskell .type,
+pre .vbscript .built_in,
+pre .sql .aggregate,
+pre .rsl .built_in,
+pre .smalltalk .class,
+pre .diff .header,
+pre .chunk,
+pre .winutils,
+pre .bash .variable,
+pre .apache .tag,
+pre .tex .special,
+pre .request,
+pre .status {
+  font-weight: bold;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/default.css b/htmltest/sites/all/libraries/highlightjs/styles/default.css
new file mode 100644
index 00000000..f46bcac3
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/default.css
@@ -0,0 +1,153 @@
+/*
+
+Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>
+
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background: #F0F0F0;
+}
+
+pre code,
+pre .subst,
+pre .tag .title,
+pre .lisp .title,
+pre .clojure .built_in,
+pre .nginx .title {
+  color: black;
+}
+
+pre .string,
+pre .title,
+pre .constant,
+pre .parent,
+pre .tag .value,
+pre .rules .value,
+pre .rules .value .number,
+pre .preprocessor,
+pre .pragma,
+pre .haml .symbol,
+pre .ruby .symbol,
+pre .ruby .symbol .string,
+pre .aggregate,
+pre .template_tag,
+pre .django .variable,
+pre .smalltalk .class,
+pre .addition,
+pre .flow,
+pre .stream,
+pre .bash .variable,
+pre .apache .tag,
+pre .apache .cbracket,
+pre .tex .command,
+pre .tex .special,
+pre .erlang_repl .function_or_atom,
+pre .asciidoc .header,
+pre .markdown .header,
+pre .coffeescript .attribute {
+  color: #800;
+}
+
+pre .smartquote,
+pre .comment,
+pre .annotation,
+pre .template_comment,
+pre .diff .header,
+pre .chunk,
+pre .asciidoc .blockquote,
+pre .markdown .blockquote {
+  color: #888;
+}
+
+pre .number,
+pre .date,
+pre .regexp,
+pre .literal,
+pre .hexcolor,
+pre .smalltalk .symbol,
+pre .smalltalk .char,
+pre .go .constant,
+pre .change,
+pre .lasso .variable,
+pre .makefile .variable,
+pre .asciidoc .bullet,
+pre .markdown .bullet,
+pre .asciidoc .link_url,
+pre .markdown .link_url {
+  color: #080;
+}
+
+pre .label,
+pre .javadoc,
+pre .ruby .string,
+pre .decorator,
+pre .filter .argument,
+pre .localvars,
+pre .array,
+pre .attr_selector,
+pre .important,
+pre .pseudo,
+pre .pi,
+pre .haml .bullet,
+pre .doctype,
+pre .deletion,
+pre .envvar,
+pre .shebang,
+pre .apache .sqbracket,
+pre .nginx .built_in,
+pre .tex .formula,
+pre .erlang_repl .reserved,
+pre .prompt,
+pre .asciidoc .link_label,
+pre .markdown .link_label,
+pre .vhdl .attribute,
+pre .clojure .attribute,
+pre .asciidoc .attribute,
+pre .lasso .attribute,
+pre .coffeescript .property,
+pre .makefile .phony {
+  color: #88F
+}
+
+pre .keyword,
+pre .id,
+pre .title,
+pre .built_in,
+pre .aggregate,
+pre .css .tag,
+pre .javadoctag,
+pre .phpdoc,
+pre .yardoctag,
+pre .smalltalk .class,
+pre .winutils,
+pre .bash .variable,
+pre .apache .tag,
+pre .go .typename,
+pre .tex .command,
+pre .asciidoc .strong,
+pre .markdown .strong,
+pre .request,
+pre .status {
+  font-weight: bold;
+}
+
+pre .asciidoc .emphasis,
+pre .markdown .emphasis {
+  font-style: italic;
+}
+
+pre .nginx .built_in {
+  font-weight: normal;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .lasso .markup,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/docco.css b/htmltest/sites/all/libraries/highlightjs/styles/docco.css
new file mode 100644
index 00000000..e0b6f8cb
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/docco.css
@@ -0,0 +1,132 @@
+/*
+Docco style used in http://jashkenas.github.com/docco/ converted by Simon Madine (@thingsinjars)
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  color: #000;
+  background: #f8f8ff
+}
+
+pre .comment,
+pre .template_comment,
+pre .diff .header,
+pre .javadoc {
+  color: #408080;
+  font-style: italic
+}
+
+pre .keyword,
+pre .assignment,
+pre .literal,
+pre .css .rule .keyword,
+pre .winutils,
+pre .javascript .title,
+pre .lisp .title,
+pre .subst {
+  color: #954121;
+}
+
+pre .number,
+pre .hexcolor {
+  color: #40a070
+}
+
+pre .string,
+pre .tag .value,
+pre .phpdoc,
+pre .tex .formula {
+  color: #219161;
+}
+
+pre .title,
+pre .id {
+  color: #19469D;
+}
+pre .params {
+  color: #00F;
+}
+
+pre .javascript .title,
+pre .lisp .title,
+pre .subst {
+  font-weight: normal
+}
+
+pre .class .title,
+pre .haskell .label,
+pre .tex .command {
+  color: #458;
+  font-weight: bold
+}
+
+pre .tag,
+pre .tag .title,
+pre .rules .property,
+pre .django .tag .keyword {
+  color: #000080;
+  font-weight: normal
+}
+
+pre .attribute,
+pre .variable,
+pre .instancevar,
+pre .lisp .body {
+  color: #008080
+}
+
+pre .regexp {
+  color: #B68
+}
+
+pre .class {
+  color: #458;
+  font-weight: bold
+}
+
+pre .symbol,
+pre .ruby .symbol .string,
+pre .ruby .symbol .keyword,
+pre .ruby .symbol .keymethods,
+pre .lisp .keyword,
+pre .tex .special,
+pre .input_number {
+  color: #990073
+}
+
+pre .builtin,
+pre .constructor,
+pre .built_in,
+pre .lisp .title {
+  color: #0086b3
+}
+
+pre .preprocessor,
+pre .pragma,
+pre .pi,
+pre .doctype,
+pre .shebang,
+pre .cdata {
+  color: #999;
+  font-weight: bold
+}
+
+pre .deletion {
+  background: #fdd
+}
+
+pre .addition {
+  background: #dfd
+}
+
+pre .diff .change {
+  background: #0086b3
+}
+
+pre .chunk {
+  color: #aaa
+}
+
+pre .tex .formula {
+  opacity: 0.5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/far.css b/htmltest/sites/all/libraries/highlightjs/styles/far.css
new file mode 100644
index 00000000..728c2df0
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/far.css
@@ -0,0 +1,113 @@
+/*
+
+FAR Style (c) MajestiC <majestic2k@gmail.com>
+
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background: #000080;
+}
+
+pre code,
+pre .subst {
+  color: #0FF;
+}
+
+pre .string,
+pre .ruby .string,
+pre .haskell .type,
+pre .tag .value,
+pre .css .rules .value,
+pre .css .rules .value .number,
+pre .preprocessor,
+pre .pragma,
+pre .ruby .symbol,
+pre .ruby .symbol .string,
+pre .built_in,
+pre .sql .aggregate,
+pre .django .template_tag,
+pre .django .variable,
+pre .smalltalk .class,
+pre .addition,
+pre .apache .tag,
+pre .apache .cbracket,
+pre .tex .command,
+pre .clojure .title,
+pre .coffeescript .attribute {
+  color: #FF0;
+}
+
+pre .keyword,
+pre .css .id,
+pre .title,
+pre .haskell .type,
+pre .vbscript .built_in,
+pre .sql .aggregate,
+pre .rsl .built_in,
+pre .smalltalk .class,
+pre .xml .tag .title,
+pre .winutils,
+pre .flow,
+pre .change,
+pre .envvar,
+pre .bash .variable,
+pre .tex .special,
+pre .clojure .built_in {
+  color: #FFF;
+}
+
+pre .comment,
+pre .phpdoc,
+pre .javadoc,
+pre .java .annotation,
+pre .template_comment,
+pre .deletion,
+pre .apache .sqbracket,
+pre .tex .formula {
+  color: #888;
+}
+
+pre .number,
+pre .date,
+pre .regexp,
+pre .literal,
+pre .smalltalk .symbol,
+pre .smalltalk .char,
+pre .clojure .attribute {
+  color: #0F0;
+}
+
+pre .python .decorator,
+pre .django .filter .argument,
+pre .smalltalk .localvars,
+pre .smalltalk .array,
+pre .attr_selector,
+pre .pseudo,
+pre .xml .pi,
+pre .diff .header,
+pre .chunk,
+pre .shebang,
+pre .nginx .built_in,
+pre .prompt {
+  color: #008080;
+}
+
+pre .keyword,
+pre .css .id,
+pre .title,
+pre .haskell .type,
+pre .vbscript .built_in,
+pre .sql .aggregate,
+pre .rsl .built_in,
+pre .smalltalk .class,
+pre .winutils,
+pre .flow,
+pre .apache .tag,
+pre .nginx .built_in,
+pre .tex .command,
+pre .tex .special,
+pre .request,
+pre .status {
+  font-weight: bold;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/foundation.css b/htmltest/sites/all/libraries/highlightjs/styles/foundation.css
new file mode 100644
index 00000000..b74d0d34
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/foundation.css
@@ -0,0 +1,133 @@
+/*
+Description: Foundation 4 docs style for highlight.js
+Author: Dan Allen <dan.j.allen@gmail.com>
+Website: http://foundation.zurb.com/docs/
+Version: 1.0
+Date: 2013-04-02
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background: #eee;
+}
+
+pre .header,
+pre .decorator,
+pre .annotation {
+  color: #000077;
+}
+
+pre .horizontal_rule,
+pre .link_url,
+pre .emphasis,
+pre .attribute {
+  color: #070;
+}
+
+pre .emphasis {
+  font-style: italic;
+}
+
+pre .link_label,
+pre .strong,
+pre .value,
+pre .string,
+pre .scss .value .string {
+  color: #d14;
+}
+
+pre .strong {
+  font-weight: bold;
+}
+
+pre .blockquote,
+pre .comment {
+  color: #998;
+  font-style: italic;
+}
+
+pre .asciidoc .title,
+pre .function .title {
+  color: #900;
+}
+
+pre .class {
+  color: #458;
+}
+
+pre .id,
+pre .pseudo,
+pre .constant,
+pre .hexcolor {
+  color: teal;
+}
+
+pre .variable {
+  color: #336699;
+}
+
+pre .bullet, 
+pre .javadoc {
+  color: #997700;
+}
+
+pre .pi,
+pre .doctype {
+  color: #3344bb;
+}
+
+pre .code,
+pre .number {
+  color: #099;
+}
+
+pre .important {
+  color: #f00;
+}
+
+pre .smartquote,
+pre .label {
+  color: #970;
+}
+
+pre .preprocessor,
+pre .pragma {
+  color: #579;
+}
+
+pre .reserved,
+pre .keyword,
+pre .scss .value {
+  color: #000;
+}
+
+pre .regexp {
+  background-color: #fff0ff;
+  color: #880088;
+}
+
+pre .symbol {
+  color: #990073;
+}
+
+pre .symbol .string {
+  color: #a60;
+}
+
+pre .tag {
+  color: #007700;
+}
+
+pre .at_rule,
+pre .at_rule .keyword {
+  color: #088;
+}
+
+pre .at_rule .preprocessor {
+  color: #808;
+}
+
+pre .scss .tag,
+pre .scss .attribute {
+  color: #339;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/github.css b/htmltest/sites/all/libraries/highlightjs/styles/github.css
new file mode 100644
index 00000000..f31bfdc5
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/github.css
@@ -0,0 +1,130 @@
+/*
+
+github.com style (c) Vasily Polovnyov <vast@whiteants.net>
+
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  color: #333;
+  background: #f8f8ff
+}
+
+pre .comment,
+pre .template_comment,
+pre .diff .header,
+pre .javadoc {
+  color: #998;
+  font-style: italic
+}
+
+pre .keyword,
+pre .css .rule .keyword,
+pre .winutils,
+pre .javascript .title,
+pre .nginx .title,
+pre .subst,
+pre .request,
+pre .status {
+  color: #333;
+  font-weight: bold
+}
+
+pre .number,
+pre .hexcolor,
+pre .ruby .constant {
+  color: #099;
+}
+
+pre .string,
+pre .tag .value,
+pre .phpdoc,
+pre .tex .formula {
+  color: #d14
+}
+
+pre .title,
+pre .id,
+pre .coffeescript .params,
+pre .scss .preprocessor {
+  color: #900;
+  font-weight: bold
+}
+
+pre .javascript .title,
+pre .lisp .title,
+pre .clojure .title,
+pre .subst {
+  font-weight: normal
+}
+
+pre .class .title,
+pre .haskell .type,
+pre .vhdl .literal,
+pre .tex .command {
+  color: #458;
+  font-weight: bold
+}
+
+pre .tag,
+pre .tag .title,
+pre .rules .property,
+pre .django .tag .keyword {
+  color: #000080;
+  font-weight: normal
+}
+
+pre .attribute,
+pre .variable,
+pre .lisp .body {
+  color: #008080
+}
+
+pre .regexp {
+  color: #009926
+}
+
+pre .class {
+  color: #458;
+  font-weight: bold
+}
+
+pre .symbol,
+pre .ruby .symbol .string,
+pre .lisp .keyword,
+pre .tex .special,
+pre .prompt {
+  color: #990073
+}
+
+pre .built_in,
+pre .lisp .title,
+pre .clojure .built_in {
+  color: #0086b3
+}
+
+pre .preprocessor,
+pre .pragma,
+pre .pi,
+pre .doctype,
+pre .shebang,
+pre .cdata {
+  color: #999;
+  font-weight: bold
+}
+
+pre .deletion {
+  background: #fdd
+}
+
+pre .addition {
+  background: #dfd
+}
+
+pre .diff .change {
+  background: #0086b3
+}
+
+pre .chunk {
+  color: #aaa
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/googlecode.css b/htmltest/sites/all/libraries/highlightjs/styles/googlecode.css
new file mode 100644
index 00000000..9ef1c1d6
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/googlecode.css
@@ -0,0 +1,146 @@
+/*
+
+Google Code style (c) Aahan Krish <geekpanth3r@gmail.com>
+
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background: white; color: black;
+}
+
+pre .comment,
+pre .template_comment,
+pre .javadoc,
+pre .comment * {
+  color: #800;
+}
+
+pre .keyword,
+pre .method,
+pre .list .title,
+pre .clojure .built_in,
+pre .nginx .title,
+pre .tag .title,
+pre .setting .value,
+pre .winutils,
+pre .tex .command,
+pre .http .title,
+pre .request,
+pre .status {
+  color: #008;
+}
+
+pre .envvar,
+pre .tex .special {
+  color: #660;
+}
+
+pre .string,
+pre .tag .value,
+pre .cdata,
+pre .filter .argument,
+pre .attr_selector,
+pre .apache .cbracket,
+pre .date,
+pre .regexp,
+pre .coffeescript .attribute {
+  color: #080;
+}
+
+pre .sub .identifier,
+pre .pi,
+pre .tag,
+pre .tag .keyword,
+pre .decorator,
+pre .ini .title,
+pre .shebang,
+pre .prompt,
+pre .hexcolor,
+pre .rules .value,
+pre .css .value .number,
+pre .literal,
+pre .symbol,
+pre .ruby .symbol .string,
+pre .number,
+pre .css .function,
+pre .clojure .attribute {
+  color: #066;
+}
+
+pre .class .title,
+pre .haskell .type,
+pre .smalltalk .class,
+pre .javadoctag,
+pre .yardoctag,
+pre .phpdoc,
+pre .typename,
+pre .tag .attribute,
+pre .doctype,
+pre .class .id,
+pre .built_in,
+pre .setting,
+pre .params,
+pre .variable,
+pre .clojure .title {
+  color: #606;
+}
+
+pre .css .tag,
+pre .rules .property,
+pre .pseudo,
+pre .subst {
+  color: #000;
+}
+
+pre .css .class, pre .css .id {
+  color: #9B703F;
+}
+
+pre .value .important {
+  color: #ff7700;
+  font-weight: bold;
+}
+
+pre .rules .keyword {
+  color: #C5AF75;
+}
+
+pre .annotation,
+pre .apache .sqbracket,
+pre .nginx .built_in {
+  color: #9B859D;
+}
+
+pre .preprocessor,
+pre .preprocessor *,
+pre .pragma {
+  color: #444;
+}
+
+pre .tex .formula {
+  background-color: #EEE;
+  font-style: italic;
+}
+
+pre .diff .header,
+pre .chunk {
+  color: #808080;
+  font-weight: bold;
+}
+
+pre .diff .change {
+  background-color: #BCCFF9;
+}
+
+pre .addition {
+  background-color: #BAEEBA;
+}
+
+pre .deletion {
+  background-color: #FFC8BD;
+}
+
+pre .comment .yardoctag {
+  font-weight: bold;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/idea.css b/htmltest/sites/all/libraries/highlightjs/styles/idea.css
new file mode 100644
index 00000000..2959c7a9
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/idea.css
@@ -0,0 +1,122 @@
+/*
+
+Intellij Idea-like styling (c) Vasily Polovnyov <vast@whiteants.net>
+
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  color: #000;
+  background: #fff;
+}
+
+pre .subst,
+pre .title {
+  font-weight: normal;
+  color: #000;
+}
+
+pre .comment,
+pre .template_comment,
+pre .javadoc,
+pre .diff .header {
+  color: #808080;
+  font-style: italic;
+}
+
+pre .annotation,
+pre .decorator,
+pre .preprocessor,
+pre .pragma,
+pre .doctype,
+pre .pi,
+pre .chunk,
+pre .shebang,
+pre .apache .cbracket,
+pre .prompt,
+pre .http .title {
+  color: #808000;
+}
+
+pre .tag,
+pre .pi {
+  background: #efefef;
+}
+
+pre .tag .title,
+pre .id,
+pre .attr_selector,
+pre .pseudo,
+pre .literal,
+pre .keyword,
+pre .hexcolor,
+pre .css .function,
+pre .ini .title,
+pre .css .class,
+pre .list .title,
+pre .clojure .title,
+pre .nginx .title,
+pre .tex .command,
+pre .request,
+pre .status {
+  font-weight: bold;
+  color: #000080;
+}
+
+pre .attribute,
+pre .rules .keyword,
+pre .number,
+pre .date,
+pre .regexp,
+pre .tex .special {
+  font-weight: bold;
+  color: #0000ff;
+}
+
+pre .number,
+pre .regexp {
+  font-weight: normal;
+}
+
+pre .string,
+pre .value,
+pre .filter .argument,
+pre .css .function .params,
+pre .apache .tag {
+  color: #008000;
+  font-weight: bold;
+}
+
+pre .symbol,
+pre .ruby .symbol .string,
+pre .char,
+pre .tex .formula {
+  color: #000;
+  background: #d0eded;
+  font-style: italic;
+}
+
+pre .phpdoc,
+pre .yardoctag,
+pre .javadoctag {
+  text-decoration: underline;
+}
+
+pre .variable,
+pre .envvar,
+pre .apache .sqbracket,
+pre .nginx .built_in {
+  color: #660e7a;
+}
+
+pre .addition {
+  background: #baeeba;
+}
+
+pre .deletion {
+  background: #ffc8bd;
+}
+
+pre .diff .change {
+  background: #bccff9;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/ir_black.css b/htmltest/sites/all/libraries/highlightjs/styles/ir_black.css
new file mode 100644
index 00000000..91682835
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/ir_black.css
@@ -0,0 +1,105 @@
+/*
+  IR_Black style (c) Vasily Mikhailitchenko <vaskas@programica.ru>
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background: #000; color: #f8f8f8;
+}
+
+pre .shebang,
+pre .comment,
+pre .template_comment,
+pre .javadoc {
+  color: #7c7c7c;
+}
+
+pre .keyword,
+pre .tag,
+pre .tex .command,
+pre .request,
+pre .status,
+pre .clojure .attribute {
+  color: #96CBFE;
+}
+
+pre .sub .keyword,
+pre .method,
+pre .list .title,
+pre .nginx .title {
+  color: #FFFFB6;
+}
+
+pre .string,
+pre .tag .value,
+pre .cdata,
+pre .filter .argument,
+pre .attr_selector,
+pre .apache .cbracket,
+pre .date,
+pre .coffeescript .attribute {
+  color: #A8FF60;
+}
+
+pre .subst {
+  color: #DAEFA3;
+}
+
+pre .regexp {
+  color: #E9C062;
+}
+
+pre .title,
+pre .sub .identifier,
+pre .pi,
+pre .decorator,
+pre .tex .special,
+pre .haskell .type,
+pre .constant,
+pre .smalltalk .class,
+pre .javadoctag,
+pre .yardoctag,
+pre .phpdoc,
+pre .nginx .built_in {
+  color: #FFFFB6;
+}
+
+pre .symbol,
+pre .ruby .symbol .string,
+pre .number,
+pre .variable,
+pre .vbscript,
+pre .literal {
+  color: #C6C5FE;
+}
+
+pre .css .tag {
+  color: #96CBFE;
+}
+
+pre .css .rules .property,
+pre .css .id {
+  color: #FFFFB6;
+}
+
+pre .css .class {
+  color: #FFF;
+}
+
+pre .hexcolor {
+  color: #C6C5FE;
+}
+
+pre .number {
+  color:#FF73FD;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.7;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/magula.css b/htmltest/sites/all/libraries/highlightjs/styles/magula.css
new file mode 100644
index 00000000..1c466dd5
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/magula.css
@@ -0,0 +1,123 @@
+﻿/*
+Description: Magula style for highligh.js
+Author: Ruslan Keba <rukeba@gmail.com>
+Website: http://rukeba.com/
+Version: 1.0
+Date: 2009-01-03
+Music: Aphex Twin / Xtal
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background-color: #f4f4f4;
+}
+
+pre code,
+pre .subst,
+pre .lisp .title,
+pre .clojure .built_in {
+  color: black;
+}
+
+pre .string,
+pre .title,
+pre .parent,
+pre .tag .value,
+pre .rules .value,
+pre .rules .value .number,
+pre .preprocessor,
+pre .pragma,
+pre .ruby .symbol,
+pre .ruby .symbol .string,
+pre .aggregate,
+pre .template_tag,
+pre .django .variable,
+pre .smalltalk .class,
+pre .addition,
+pre .flow,
+pre .stream,
+pre .bash .variable,
+pre .apache .cbracket,
+pre .coffeescript .attribute {
+  color: #050;
+}
+
+pre .comment,
+pre .annotation,
+pre .template_comment,
+pre .diff .header,
+pre .chunk {
+  color: #777;
+}
+
+pre .number,
+pre .date,
+pre .regexp,
+pre .literal,
+pre .smalltalk .symbol,
+pre .smalltalk .char,
+pre .change,
+pre .tex .special {
+  color: #800;
+}
+
+pre .label,
+pre .javadoc,
+pre .ruby .string,
+pre .decorator,
+pre .filter .argument,
+pre .localvars,
+pre .array,
+pre .attr_selector,
+pre .pseudo,
+pre .pi,
+pre .doctype,
+pre .deletion,
+pre .envvar,
+pre .shebang,
+pre .apache .sqbracket,
+pre .nginx .built_in,
+pre .tex .formula,
+pre .prompt,
+pre .clojure .attribute {
+  color: #00e;
+}
+
+pre .keyword,
+pre .id,
+pre .phpdoc,
+pre .title,
+pre .built_in,
+pre .aggregate,
+pre .smalltalk .class,
+pre .winutils,
+pre .bash .variable,
+pre .apache .tag,
+pre .xml .tag,
+pre .tex .command,
+pre .request,
+pre .status {
+  font-weight: bold;
+  color: navy;
+}
+
+pre .nginx .built_in {
+  font-weight: normal;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.5;
+}
+
+/* --- */
+pre .apache .tag {
+  font-weight: bold;
+  color: blue;
+}
+
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/mono-blue.css b/htmltest/sites/all/libraries/highlightjs/styles/mono-blue.css
new file mode 100644
index 00000000..85769e8f
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/mono-blue.css
@@ -0,0 +1,62 @@
+/*
+  Five-color theme from a single blue hue.
+*/
+pre code {
+  display: block; padding: 0.5em;
+  background: #EAEEF3; color: #00193A;
+}
+
+pre .keyword,
+pre .title,
+pre .important,
+pre .request,
+pre .header,
+pre .javadoctag {
+  font-weight: bold;
+}
+
+pre .comment,
+pre .chunk,
+pre .template_comment {
+  color: #738191;
+}
+
+pre .string,
+pre .title,
+pre .parent,
+pre .built_in,
+pre .literal,
+pre .filename,
+pre .value,
+pre .addition,
+pre .tag,
+pre .argument,
+pre .link_label,
+pre .blockquote,
+pre .header {
+  color: #0048AB;
+}
+
+pre .decorator,
+pre .prompt,
+pre .yardoctag,
+pre .subst,
+pre .symbol,
+pre .doctype,
+pre .regexp,
+pre .preprocessor,
+pre .pragma,
+pre .pi,
+pre .attribute,
+pre .attr_selector,
+pre .javadoc,
+pre .xmlDocTag,
+pre .deletion,
+pre .shebang,
+pre .string .variable,
+pre .link_url,
+pre .bullet,
+pre .sqbracket,
+pre .phony {
+  color: #4C81C9;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/monokai.css b/htmltest/sites/all/libraries/highlightjs/styles/monokai.css
new file mode 100644
index 00000000..e0c3eb37
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/monokai.css
@@ -0,0 +1,127 @@
+/*
+Monokai style - ported by Luigi Maselli - http://grigio.org
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background: #272822;
+}
+
+pre .tag,
+pre .tag .title,
+pre .keyword,
+pre .literal,
+pre .strong,
+pre .change,
+pre .winutils,
+pre .flow,
+pre .lisp .title,
+pre .clojure .built_in,
+pre .nginx .title,
+pre .tex .special {
+  color: #F92672;
+}
+
+pre code {
+  color: #DDD;
+}
+
+pre code .constant,
+pre .asciidoc .code {
+	color: #66D9EF;
+}
+
+pre .code,
+pre .class .title,
+pre .header {
+	color: white;
+}
+
+pre .link_label,
+pre .attribute,
+pre .symbol,
+pre .symbol .string,
+pre .value,
+pre .regexp {
+	color: #BF79DB;
+}
+
+pre .link_url,
+pre .tag .value,
+pre .string,
+pre .bullet,
+pre .subst,
+pre .title,
+pre .emphasis,
+pre .haskell .type,
+pre .preprocessor,
+pre .pragma,
+pre .ruby .class .parent,
+pre .built_in,
+pre .sql .aggregate,
+pre .django .template_tag,
+pre .django .variable,
+pre .smalltalk .class,
+pre .javadoc,
+pre .django .filter .argument,
+pre .smalltalk .localvars,
+pre .smalltalk .array,
+pre .attr_selector,
+pre .pseudo,
+pre .addition,
+pre .stream,
+pre .envvar,
+pre .apache .tag,
+pre .apache .cbracket,
+pre .tex .command,
+pre .prompt {
+  color: #A6E22E;
+}
+
+pre .comment,
+pre .java .annotation,
+pre .smartquote,
+pre .blockquote,
+pre .horizontal_rule,
+pre .python .decorator,
+pre .template_comment,
+pre .pi,
+pre .doctype,
+pre .deletion,
+pre .shebang,
+pre .apache .sqbracket,
+pre .tex .formula {
+  color: #75715E;
+}
+
+pre .keyword,
+pre .literal,
+pre .css .id,
+pre .phpdoc,
+pre .title,
+pre .header,
+pre .haskell .type,
+pre .vbscript .built_in,
+pre .sql .aggregate,
+pre .rsl .built_in,
+pre .smalltalk .class,
+pre .diff .header,
+pre .chunk,
+pre .winutils,
+pre .bash .variable,
+pre .apache .tag,
+pre .tex .special,
+pre .request,
+pre .status {
+  font-weight: bold;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/monokai_sublime.css b/htmltest/sites/all/libraries/highlightjs/styles/monokai_sublime.css
new file mode 100644
index 00000000..49a4eec3
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/monokai_sublime.css
@@ -0,0 +1,102 @@
+/*
+
+Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/
+
+*/
+
+pre code {
+  display: block;
+  padding: 0.5em;
+  background: #23241f;
+}
+pre .tag,
+pre code {
+  color: #f8f8f2;
+}
+pre .keyword,
+pre .function,
+pre .literal,
+pre .change,
+pre .winutils,
+pre .flow,
+pre .lisp .title,
+pre .clojure .built_in,
+pre .nginx .title,
+pre .tex .special {
+  color: #66d9ef;
+}
+pre .variable,
+pre .params {
+  color: #fd9720;
+}
+pre .constant {
+  color: #66d9ef;
+}
+pre .title,
+pre .class .title,
+pre .css .class {
+  color: #a6e22e;
+}
+pre .attribute,
+pre .symbol,
+pre .symbol .string,
+pre .tag .title,
+pre .value,
+pre .css .tag {
+  color: #f92672;
+}
+pre .number,
+pre .preprocessor,
+pre .pragma,
+pre .regexp {
+  color: #ae81ff;
+}
+pre .tag .value,
+pre .string,
+pre .css .id,
+pre .subst,
+pre .haskell .type,
+pre .ruby .class .parent,
+pre .built_in,
+pre .sql .aggregate,
+pre .django .template_tag,
+pre .django .variable,
+pre .smalltalk .class,
+pre .django .filter .argument,
+pre .smalltalk .localvars,
+pre .smalltalk .array,
+pre .attr_selector,
+pre .pseudo,
+pre .addition,
+pre .stream,
+pre .envvar,
+pre .apache .tag,
+pre .apache .cbracket,
+pre .tex .command,
+pre .prompt {
+  color: #e6db74;
+}
+pre .comment,
+pre .javadoc,
+pre .java .annotation,
+pre .python .decorator,
+pre .template_comment,
+pre .pi,
+pre .doctype,
+pre .deletion,
+pre .shebang,
+pre .apache .sqbracket,
+pre .tex .formula {
+  color: #75715e;
+}
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula {
+  opacity: 0.5;
+}
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/obsidian.css b/htmltest/sites/all/libraries/highlightjs/styles/obsidian.css
new file mode 100644
index 00000000..b1b9df08
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/obsidian.css
@@ -0,0 +1,154 @@
+/**
+ * Obsidian style
+ * ported by Alexander Marenin (http://github.com/ioncreature)
+ */
+
+pre code {
+    display: block; padding: 0.5em;
+    background: #282B2E;
+}
+
+pre .keyword,
+pre .literal,
+pre .change,
+pre .winutils,
+pre .flow,
+pre .lisp .title,
+pre .clojure .built_in,
+pre .nginx .title,
+pre .css .id,
+pre .tex .special {
+    color: #93C763;
+}
+
+pre .number {
+    color: #FFCD22;
+}
+
+pre code {
+    color: #E0E2E4;
+}
+
+pre .css .tag,
+pre .css .pseudo {
+    color: #D0D2B5;
+}
+
+pre .attribute,
+pre code .constant {
+    color: #668BB0;
+}
+
+pre .xml .attribute {
+    color: #B3B689;
+}
+
+pre .xml .tag .value {
+    color: #E8E2B7;
+}
+
+pre .code,
+pre .class .title,
+pre .header {
+    color: white;
+}
+
+pre .class,
+pre .hexcolor {
+    color: #93C763;
+}
+
+pre .regexp {
+    color: #D39745;
+}
+
+pre .at_rule,
+pre .at_rule .keyword {
+    color: #A082BD;
+}
+
+pre .doctype {
+    color: #557182;
+}
+
+pre .link_url,
+pre .tag,
+pre .tag .title,
+pre .bullet,
+pre .subst,
+pre .emphasis,
+pre .haskell .type,
+pre .preprocessor,
+pre .pragma,
+pre .ruby .class .parent,
+pre .built_in,
+pre .sql .aggregate,
+pre .django .template_tag,
+pre .django .variable,
+pre .smalltalk .class,
+pre .javadoc,
+pre .django .filter .argument,
+pre .smalltalk .localvars,
+pre .smalltalk .array,
+pre .attr_selector,
+pre .pseudo,
+pre .addition,
+pre .stream,
+pre .envvar,
+pre .apache .tag,
+pre .apache .cbracket,
+pre .tex .command,
+pre .prompt {
+    color: #8CBBAD;
+}
+
+pre .string {
+    color: #EC7600;
+}
+
+pre .comment,
+pre .java .annotation,
+pre .blockquote,
+pre .horizontal_rule,
+pre .python .decorator,
+pre .template_comment,
+pre .pi,
+pre .deletion,
+pre .shebang,
+pre .apache .sqbracket,
+pre .tex .formula {
+    color: #818E96;
+}
+
+pre .keyword,
+pre .literal,
+pre .css .id,
+pre .phpdoc,
+pre .title,
+pre .header,
+pre .haskell .type,
+pre .vbscript .built_in,
+pre .sql .aggregate,
+pre .rsl .built_in,
+pre .smalltalk .class,
+pre .diff .header,
+pre .chunk,
+pre .winutils,
+pre .bash .variable,
+pre .apache .tag,
+pre .tex .special,
+pre .request,
+pre .at_rule .keyword,
+pre .status {
+    font-weight: bold;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+    opacity: 0.5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/pojoaque.css b/htmltest/sites/all/libraries/highlightjs/styles/pojoaque.css
new file mode 100644
index 00000000..8c7e627d
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/pojoaque.css
@@ -0,0 +1,105 @@
+/*
+
+Pojoaque Style by Jason Tate
+http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html
+Based on Solarized Style from http://ethanschoonover.com/solarized
+
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  color: #DCCF8F;
+  background: url(./pojoaque.jpg) repeat scroll left top #181914;
+}
+
+pre .comment,
+pre .template_comment,
+pre .diff .header,
+pre .doctype,
+pre .lisp .string,
+pre .javadoc {
+  color: #586e75;
+  font-style: italic;
+}
+
+pre .keyword,
+pre .css .rule .keyword,
+pre .winutils,
+pre .javascript .title,
+pre .method,
+pre .addition,
+pre .css .tag,
+pre .clojure .title,
+pre .nginx .title {
+  color: #B64926;
+}
+
+pre .number,
+pre .command,
+pre .string,
+pre .tag .value,
+pre .phpdoc,
+pre .tex .formula,
+pre .regexp,
+pre .hexcolor {
+  color: #468966;
+}
+
+pre .title,
+pre .localvars,
+pre .function .title,
+pre .chunk,
+pre .decorator,
+pre .built_in,
+pre .lisp .title,
+pre .clojure .built_in,
+pre .identifier,
+pre .id {
+  color: #FFB03B;
+}
+
+pre .attribute,
+pre .variable,
+pre .lisp .body,
+pre .smalltalk .number,
+pre .constant,
+pre .class .title,
+pre .parent,
+pre .haskell .type {
+  color: #b58900;
+}
+
+pre .css .attribute {
+  color: #b89859;
+}
+
+pre .css .number,pre .css .hexcolor{
+  color: #DCCF8F;
+}
+
+pre .css .class {
+  color: #d3a60c;
+}
+
+pre .preprocessor,
+pre .pragma,
+pre .pi,
+pre .shebang,
+pre .symbol,
+pre .symbol .string,
+pre .diff .change,
+pre .special,
+pre .attr_selector,
+pre .important,
+pre .subst,
+pre .cdata {
+  color: #cb4b16;
+}
+
+pre .deletion {
+  color: #dc322f;
+}
+
+pre .tex .formula {
+  background: #073642;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/pojoaque.jpg b/htmltest/sites/all/libraries/highlightjs/styles/pojoaque.jpg
new file mode 100644
index 00000000..9c07d4ab
Binary files /dev/null and b/htmltest/sites/all/libraries/highlightjs/styles/pojoaque.jpg differ
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/railscasts.css b/htmltest/sites/all/libraries/highlightjs/styles/railscasts.css
new file mode 100644
index 00000000..fb6f1458
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/railscasts.css
@@ -0,0 +1,182 @@
+/*
+
+Railscasts-like style (c) Visoft, Inc. (Damien White)
+
+*/
+
+pre code {
+  display: block;
+  padding: 0.5em;
+  background: #232323;
+  color: #E6E1DC;
+}
+
+pre .comment,
+pre .template_comment,
+pre .javadoc,
+pre .shebang {
+  color: #BC9458;
+  font-style: italic;
+}
+
+pre .keyword,
+pre .ruby .function .keyword,
+pre .request,
+pre .status,
+pre .nginx .title,
+pre .method,
+pre .list .title {
+  color: #C26230;
+}
+
+pre .string,
+pre .number,
+pre .regexp,
+pre .tag .value,
+pre .cdata,
+pre .filter .argument,
+pre .attr_selector,
+pre .apache .cbracket,
+pre .date,
+pre .tex .command,
+pre .markdown .link_label {
+  color: #A5C261;
+}
+
+pre .subst {
+  color: #519F50;
+}
+
+pre .tag,
+pre .tag .keyword,
+pre .tag .title,
+pre .doctype,
+pre .sub .identifier,
+pre .pi,
+pre .input_number {
+  color: #E8BF6A;
+}
+
+pre .identifier {
+  color: #D0D0FF;
+}
+
+pre .class .title,
+pre .haskell .type,
+pre .smalltalk .class,
+pre .javadoctag,
+pre .yardoctag,
+pre .phpdoc {
+  text-decoration: none;
+}
+
+pre .constant {
+  color: #DA4939;
+}
+
+
+pre .symbol,
+pre .built_in,
+pre .ruby .symbol .string,
+pre .ruby .symbol .identifier,
+pre .markdown .link_url,
+pre .attribute {
+  color: #6D9CBE;
+}
+
+pre .markdown .link_url {
+  text-decoration: underline;
+}
+
+
+
+pre .params,
+pre .variable,
+pre .clojure .attribute {
+  color: #D0D0FF;
+}
+
+pre .css .tag,
+pre .rules .property,
+pre .pseudo,
+pre .tex .special {
+  color: #CDA869;
+}
+
+pre .css .class {
+  color: #9B703F;
+}
+
+pre .rules .keyword {
+  color: #C5AF75;
+}
+
+pre .rules .value {
+  color: #CF6A4C;
+}
+
+pre .css .id {
+  color: #8B98AB;
+}
+
+pre .annotation,
+pre .apache .sqbracket,
+pre .nginx .built_in {
+  color: #9B859D;
+}
+
+pre .preprocessor,
+pre .preprocessor *
+pre .pragma {
+  color: #8996A8 !important;
+}
+
+pre .hexcolor,
+pre .css .value .number {
+  color: #A5C261;
+}
+
+pre .title,
+pre .decorator,
+pre .css .function {
+  color: #FFC66D;
+}
+
+pre .diff .header,
+pre .chunk {
+  background-color: #2F33AB;
+  color: #E6E1DC;
+  display: inline-block;
+  width: 100%;
+}
+
+pre .diff .change {
+  background-color: #4A410D;
+  color: #F8F8F8;
+  display: inline-block;
+  width: 100%;
+}
+
+pre .addition {
+  background-color: #144212;
+  color: #E6E1DC;
+  display: inline-block;
+  width: 100%;
+}
+
+pre .deletion {
+  background-color: #600;
+  color: #E6E1DC;
+  display: inline-block;
+  width: 100%;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.7;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/rainbow.css b/htmltest/sites/all/libraries/highlightjs/styles/rainbow.css
new file mode 100644
index 00000000..f4399e87
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/rainbow.css
@@ -0,0 +1,115 @@
+/*
+
+Style with support for rainbow parens
+
+*/
+
+pre ::-moz-selection{ background: #FF5E99; color:#fff; text-shadow: none; }
+pre ::selection { background:#FF5E99; color:#fff; text-shadow: none; }
+
+pre code {
+  display: block; padding: 0.5em;
+  background: #474949; color: #D1D9E1;
+}
+
+
+pre .body,
+pre .collection {
+   color: #D1D9E1;
+}
+
+pre .comment,
+pre .template_comment,
+pre .diff .header,
+pre .doctype,
+pre .lisp .string,
+pre .javadoc {
+  color: #969896;
+  font-style: italic;
+}
+
+pre .keyword,
+pre .clojure .attribute,
+pre .winutils,
+pre .javascript .title,
+pre .addition,
+pre .css .tag {
+  color: #cc99cc;
+}
+
+pre .number { color: #f99157; }
+
+pre .command,
+pre .string,
+pre .tag .value,
+pre .phpdoc,
+pre .tex .formula,
+pre .regexp,
+pre .hexcolor {
+  color: #8abeb7;
+}
+
+pre .title,
+pre .localvars,
+pre .function .title,
+pre .chunk,
+pre .decorator,
+pre .built_in,
+pre .lisp .title,
+pre .identifier
+{
+  color: #b5bd68;
+}
+
+pre .class .keyword
+{
+  color: #f2777a;
+}
+
+pre .variable,
+pre .lisp .body,
+pre .smalltalk .number,
+pre .constant,
+pre .class .title,
+pre .parent,
+pre .haskell .label,
+pre .id,
+pre .lisp .title,
+pre .clojure .title .built_in {
+   color: #ffcc66;
+}
+
+pre .tag .title,
+pre .rules .property,
+pre .django .tag .keyword,
+pre .clojure .title .built_in {
+  font-weight: bold;
+}
+
+pre .attribute,
+pre .clojure .title {
+  color: #81a2be;
+}
+
+pre .preprocessor,
+pre .pragma,
+pre .pi,
+pre .shebang,
+pre .symbol,
+pre .symbol .string,
+pre .diff .change,
+pre .special,
+pre .attr_selector,
+pre .important,
+pre .subst,
+pre .cdata {
+  color: #f99157;
+}
+
+pre .deletion {
+  color: #dc322f;
+}
+
+pre .tex .formula {
+  background: #eee8d5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/school_book.css b/htmltest/sites/all/libraries/highlightjs/styles/school_book.css
new file mode 100644
index 00000000..12963b9f
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/school_book.css
@@ -0,0 +1,113 @@
+/*
+
+School Book style from goldblog.com.ua (c) Zaripov Yura <yur4ik7@ukr.net>
+
+*/
+
+pre code {
+  display: block; padding: 15px 0.5em 0.5em 30px;
+  font-size: 11px !important;
+  line-height:16px !important;
+}
+
+pre{
+  background:#f6f6ae url(./school_book.png);
+  border-top: solid 2px #d2e8b9;
+  border-bottom: solid 1px #d2e8b9;
+}
+
+pre .keyword,
+pre .literal,
+pre .change,
+pre .winutils,
+pre .flow,
+pre .lisp .title,
+pre .clojure .built_in,
+pre .nginx .title,
+pre .tex .special {
+  color:#005599;
+  font-weight:bold;
+}
+
+pre code,
+pre .subst,
+pre .tag .keyword {
+  color: #3E5915;
+}
+
+pre .string,
+pre .title,
+pre .haskell .type,
+pre .tag .value,
+pre .css .rules .value,
+pre .preprocessor,
+pre .pragma,
+pre .ruby .symbol,
+pre .ruby .symbol .string,
+pre .ruby .class .parent,
+pre .built_in,
+pre .sql .aggregate,
+pre .django .template_tag,
+pre .django .variable,
+pre .smalltalk .class,
+pre .javadoc,
+pre .ruby .string,
+pre .django .filter .argument,
+pre .smalltalk .localvars,
+pre .smalltalk .array,
+pre .attr_selector,
+pre .pseudo,
+pre .addition,
+pre .stream,
+pre .envvar,
+pre .apache .tag,
+pre .apache .cbracket,
+pre .nginx .built_in,
+pre .tex .command,
+pre .coffeescript .attribute {
+  color: #2C009F;
+}
+
+pre .comment,
+pre .java .annotation,
+pre .python .decorator,
+pre .template_comment,
+pre .pi,
+pre .doctype,
+pre .deletion,
+pre .shebang,
+pre .apache .sqbracket {
+  color: #E60415;
+}
+
+pre .keyword,
+pre .literal,
+pre .css .id,
+pre .phpdoc,
+pre .title,
+pre .haskell .type,
+pre .vbscript .built_in,
+pre .sql .aggregate,
+pre .rsl .built_in,
+pre .smalltalk .class,
+pre .xml .tag .title,
+pre .diff .header,
+pre .chunk,
+pre .winutils,
+pre .bash .variable,
+pre .apache .tag,
+pre .tex .command,
+pre .request,
+pre .status {
+  font-weight: bold;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/school_book.png b/htmltest/sites/all/libraries/highlightjs/styles/school_book.png
new file mode 100644
index 00000000..956e9790
Binary files /dev/null and b/htmltest/sites/all/libraries/highlightjs/styles/school_book.png differ
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/solarized_dark.css b/htmltest/sites/all/libraries/highlightjs/styles/solarized_dark.css
new file mode 100644
index 00000000..94d99b5f
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/solarized_dark.css
@@ -0,0 +1,92 @@
+/*
+
+Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>
+
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background: #002b36; color: #839496;
+}
+
+pre .comment,
+pre .template_comment,
+pre .diff .header,
+pre .doctype,
+pre .pi,
+pre .lisp .string,
+pre .javadoc {
+  color: #586e75;
+  font-style: italic;
+}
+
+pre .keyword,
+pre .winutils,
+pre .method,
+pre .addition,
+pre .css .tag,
+pre .request,
+pre .status,
+pre .nginx .title {
+  color: #859900;
+}
+
+pre .number,
+pre .command,
+pre .string,
+pre .tag .value,
+pre .rules .value,
+pre .phpdoc,
+pre .tex .formula,
+pre .regexp,
+pre .hexcolor {
+  color: #2aa198;
+}
+
+pre .title,
+pre .localvars,
+pre .chunk,
+pre .decorator,
+pre .built_in,
+pre .identifier,
+pre .vhdl .literal,
+pre .id,
+pre .css .function {
+  color: #268bd2;
+}
+
+pre .attribute,
+pre .variable,
+pre .lisp .body,
+pre .smalltalk .number,
+pre .constant,
+pre .class .title,
+pre .parent,
+pre .haskell .type {
+  color: #b58900;
+}
+
+pre .preprocessor,
+pre .preprocessor .keyword,
+pre .pragma,
+pre .shebang,
+pre .symbol,
+pre .symbol .string,
+pre .diff .change,
+pre .special,
+pre .attr_selector,
+pre .important,
+pre .subst,
+pre .cdata,
+pre .clojure .title,
+pre .css .pseudo {
+  color: #cb4b16;
+}
+
+pre .deletion {
+  color: #dc322f;
+}
+
+pre .tex .formula {
+  background: #073642;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/solarized_light.css b/htmltest/sites/all/libraries/highlightjs/styles/solarized_light.css
new file mode 100644
index 00000000..7e1339ef
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/solarized_light.css
@@ -0,0 +1,92 @@
+/*
+
+Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>
+
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background: #fdf6e3; color: #657b83;
+}
+
+pre .comment,
+pre .template_comment,
+pre .diff .header,
+pre .doctype,
+pre .pi,
+pre .lisp .string,
+pre .javadoc {
+  color: #93a1a1;
+  font-style: italic;
+}
+
+pre .keyword,
+pre .winutils,
+pre .method,
+pre .addition,
+pre .css .tag,
+pre .request,
+pre .status,
+pre .nginx .title {
+  color: #859900;
+}
+
+pre .number,
+pre .command,
+pre .string,
+pre .tag .value,
+pre .rules .value,
+pre .phpdoc,
+pre .tex .formula,
+pre .regexp,
+pre .hexcolor {
+  color: #2aa198;
+}
+
+pre .title,
+pre .localvars,
+pre .chunk,
+pre .decorator,
+pre .built_in,
+pre .identifier,
+pre .vhdl .literal,
+pre .id,
+pre .css .function {
+  color: #268bd2;
+}
+
+pre .attribute,
+pre .variable,
+pre .lisp .body,
+pre .smalltalk .number,
+pre .constant,
+pre .class .title,
+pre .parent,
+pre .haskell .type {
+  color: #b58900;
+}
+
+pre .preprocessor,
+pre .preprocessor .keyword,
+pre .pragma,
+pre .shebang,
+pre .symbol,
+pre .symbol .string,
+pre .diff .change,
+pre .special,
+pre .attr_selector,
+pre .important,
+pre .subst,
+pre .cdata,
+pre .clojure .title,
+pre .css .pseudo {
+  color: #cb4b16;
+}
+
+pre .deletion {
+  color: #dc322f;
+}
+
+pre .tex .formula {
+  background: #eee8d5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/sunburst.css b/htmltest/sites/all/libraries/highlightjs/styles/sunburst.css
new file mode 100644
index 00000000..6f1ed98b
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/sunburst.css
@@ -0,0 +1,160 @@
+/*
+
+Sunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>
+
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background: #000; color: #f8f8f8;
+}
+
+pre .comment,
+pre .template_comment,
+pre .javadoc {
+  color: #aeaeae;
+  font-style: italic;
+}
+
+pre .keyword,
+pre .ruby .function .keyword,
+pre .request,
+pre .status,
+pre .nginx .title {
+  color: #E28964;
+}
+
+pre .function .keyword,
+pre .sub .keyword,
+pre .method,
+pre .list .title {
+  color: #99CF50;
+}
+
+pre .string,
+pre .tag .value,
+pre .cdata,
+pre .filter .argument,
+pre .attr_selector,
+pre .apache .cbracket,
+pre .date,
+pre .tex .command,
+pre .coffeescript .attribute {
+  color: #65B042;
+}
+
+pre .subst {
+  color: #DAEFA3;
+}
+
+pre .regexp {
+  color: #E9C062;
+}
+
+pre .title,
+pre .sub .identifier,
+pre .pi,
+pre .tag,
+pre .tag .keyword,
+pre .decorator,
+pre .shebang,
+pre .prompt {
+  color: #89BDFF;
+}
+
+pre .class .title,
+pre .haskell .type,
+pre .smalltalk .class,
+pre .javadoctag,
+pre .yardoctag,
+pre .phpdoc {
+  text-decoration: underline;
+}
+
+pre .symbol,
+pre .ruby .symbol .string,
+pre .number {
+  color: #3387CC;
+}
+
+pre .params,
+pre .variable,
+pre .clojure .attribute {
+  color: #3E87E3;
+}
+
+pre .css .tag,
+pre .rules .property,
+pre .pseudo,
+pre .tex .special {
+  color: #CDA869;
+}
+
+pre .css .class {
+  color: #9B703F;
+}
+
+pre .rules .keyword {
+  color: #C5AF75;
+}
+
+pre .rules .value {
+  color: #CF6A4C;
+}
+
+pre .css .id {
+  color: #8B98AB;
+}
+
+pre .annotation,
+pre .apache .sqbracket,
+pre .nginx .built_in {
+  color: #9B859D;
+}
+
+pre .preprocessor,
+pre .pragma {
+  color: #8996A8;
+}
+
+pre .hexcolor,
+pre .css .value .number {
+  color: #DD7B3B;
+}
+
+pre .css .function {
+  color: #DAD085;
+}
+
+pre .diff .header,
+pre .chunk,
+pre .tex .formula {
+  background-color: #0E2231;
+  color: #F8F8F8;
+  font-style: italic;
+}
+
+pre .diff .change {
+  background-color: #4A410D;
+  color: #F8F8F8;
+}
+
+pre .addition {
+  background-color: #253B22;
+  color: #F8F8F8;
+}
+
+pre .deletion {
+  background-color: #420E09;
+  color: #F8F8F8;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/tomorrow-night-blue.css b/htmltest/sites/all/libraries/highlightjs/styles/tomorrow-night-blue.css
new file mode 100644
index 00000000..86de93c2
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/tomorrow-night-blue.css
@@ -0,0 +1,52 @@
+/* Tomorrow Night Blue Theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+/* Original theme - https://github.com/chriskempson/tomorrow-theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+.tomorrow-comment, pre .comment, pre .title {
+  color: #7285b7;
+}
+
+.tomorrow-red, pre .variable, pre .attribute, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo {
+  color: #ff9da4;
+}
+
+.tomorrow-orange, pre .number, pre .preprocessor, pre .pragma, pre .built_in, pre .literal, pre .params, pre .constant {
+  color: #ffc58f;
+}
+
+.tomorrow-yellow, pre .ruby .class .title, pre .css .rules .attribute {
+  color: #ffeead;
+}
+
+.tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata {
+  color: #d1f1a9;
+}
+
+.tomorrow-aqua, pre .css .hexcolor {
+  color: #99ffff;
+}
+
+.tomorrow-blue, pre .function, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title {
+  color: #bbdaff;
+}
+
+.tomorrow-purple, pre .keyword, pre .javascript .function {
+  color: #ebbbff;
+}
+
+pre code {
+  display: block;
+  background: #002451;
+  color: white;
+  padding: 0.5em;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/tomorrow-night-bright.css b/htmltest/sites/all/libraries/highlightjs/styles/tomorrow-night-bright.css
new file mode 100644
index 00000000..7e2450b6
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/tomorrow-night-bright.css
@@ -0,0 +1,51 @@
+/* Tomorrow Night Bright Theme */
+/* Original theme - https://github.com/chriskempson/tomorrow-theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+.tomorrow-comment, pre .comment, pre .title {
+  color: #969896;
+}
+
+.tomorrow-red, pre .variable, pre .attribute, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo {
+  color: #d54e53;
+}
+
+.tomorrow-orange, pre .number, pre .preprocessor, pre .pragma, pre .built_in, pre .literal, pre .params, pre .constant {
+  color: #e78c45;
+}
+
+.tomorrow-yellow, pre .ruby .class .title, pre .css .rules .attribute {
+  color: #e7c547;
+}
+
+.tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata {
+  color: #b9ca4a;
+}
+
+.tomorrow-aqua, pre .css .hexcolor {
+  color: #70c0b1;
+}
+
+.tomorrow-blue, pre .function, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title {
+  color: #7aa6da;
+}
+
+.tomorrow-purple, pre .keyword, pre .javascript .function {
+  color: #c397d8;
+}
+
+pre code {
+  display: block;
+  background: black;
+  color: #eaeaea;
+  padding: 0.5em;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/tomorrow-night-eighties.css b/htmltest/sites/all/libraries/highlightjs/styles/tomorrow-night-eighties.css
new file mode 100644
index 00000000..bd0c45ec
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/tomorrow-night-eighties.css
@@ -0,0 +1,51 @@
+/* Tomorrow Night Eighties Theme */
+/* Original theme - https://github.com/chriskempson/tomorrow-theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+.tomorrow-comment, pre .comment, pre .title {
+  color: #999999;
+}
+
+.tomorrow-red, pre .variable, pre .attribute, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo {
+  color: #f2777a;
+}
+
+.tomorrow-orange, pre .number, pre .preprocessor, pre .pragma, pre .built_in, pre .literal, pre .params, pre .constant {
+  color: #f99157;
+}
+
+.tomorrow-yellow, pre .ruby .class .title, pre .css .rules .attribute {
+  color: #ffcc66;
+}
+
+.tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata {
+  color: #99cc99;
+}
+
+.tomorrow-aqua, pre .css .hexcolor {
+  color: #66cccc;
+}
+
+.tomorrow-blue, pre .function, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title {
+  color: #6699cc;
+}
+
+.tomorrow-purple, pre .keyword, pre .javascript .function {
+  color: #cc99cc;
+}
+
+pre code {
+  display: block;
+  background: #2d2d2d;
+  color: #cccccc;
+  padding: 0.5em;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/tomorrow-night.css b/htmltest/sites/all/libraries/highlightjs/styles/tomorrow-night.css
new file mode 100644
index 00000000..2cc110b3
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/tomorrow-night.css
@@ -0,0 +1,52 @@
+/* Tomorrow Night Theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+/* Original theme - https://github.com/chriskempson/tomorrow-theme */
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+.tomorrow-comment, pre .comment, pre .title {
+  color: #969896;
+}
+
+.tomorrow-red, pre .variable, pre .attribute, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo {
+  color: #cc6666;
+}
+
+.tomorrow-orange, pre .number, pre .preprocessor, pre .pragma, pre .built_in, pre .literal, pre .params, pre .constant {
+  color: #de935f;
+}
+
+.tomorrow-yellow, pre .ruby .class .title, pre .css .rules .attribute {
+  color: #f0c674;
+}
+
+.tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata {
+  color: #b5bd68;
+}
+
+.tomorrow-aqua, pre .css .hexcolor {
+  color: #8abeb7;
+}
+
+.tomorrow-blue, pre .function, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title {
+  color: #81a2be;
+}
+
+.tomorrow-purple, pre .keyword, pre .javascript .function {
+  color: #b294bb;
+}
+
+pre code {
+  display: block;
+  background: #1d1f21;
+  color: #c5c8c6;
+  padding: 0.5em;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/tomorrow.css b/htmltest/sites/all/libraries/highlightjs/styles/tomorrow.css
new file mode 100644
index 00000000..4da26b05
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/tomorrow.css
@@ -0,0 +1,49 @@
+/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
+.tomorrow-comment, pre .comment, pre .title {
+  color: #8e908c;
+}
+
+.tomorrow-red, pre .variable, pre .attribute, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo {
+  color: #c82829;
+}
+
+.tomorrow-orange, pre .number, pre .preprocessor, pre .pragma, pre .built_in, pre .literal, pre .params, pre .constant {
+  color: #f5871f;
+}
+
+.tomorrow-yellow, pre .ruby .class .title, pre .css .rules .attribute {
+  color: #eab700;
+}
+
+.tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata {
+  color: #718c00;
+}
+
+.tomorrow-aqua, pre .css .hexcolor {
+  color: #3e999f;
+}
+
+.tomorrow-blue, pre .function, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title {
+  color: #4271ae;
+}
+
+.tomorrow-purple, pre .keyword, pre .javascript .function {
+  color: #8959a8;
+}
+
+pre code {
+  display: block;
+  background: white;
+  color: #4d4d4c;
+  padding: 0.5em;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.5;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/vs.css b/htmltest/sites/all/libraries/highlightjs/styles/vs.css
new file mode 100644
index 00000000..482ae258
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/vs.css
@@ -0,0 +1,89 @@
+/*
+
+Visual Studio-like style based on original C# coloring by Jason Diamond <jason@diamond.name>
+
+*/
+pre code {
+  display: block; padding: 0.5em;
+  background: white; color: black;
+}
+
+pre .comment,
+pre .annotation,
+pre .template_comment,
+pre .diff .header,
+pre .chunk,
+pre .apache .cbracket {
+  color: rgb(0, 128, 0);
+}
+
+pre .keyword,
+pre .id,
+pre .built_in,
+pre .smalltalk .class,
+pre .winutils,
+pre .bash .variable,
+pre .tex .command,
+pre .request,
+pre .status,
+pre .nginx .title,
+pre .xml .tag,
+pre .xml .tag .value {
+  color: rgb(0, 0, 255);
+}
+
+pre .string,
+pre .title,
+pre .parent,
+pre .tag .value,
+pre .rules .value,
+pre .rules .value .number,
+pre .ruby .symbol,
+pre .ruby .symbol .string,
+pre .aggregate,
+pre .template_tag,
+pre .django .variable,
+pre .addition,
+pre .flow,
+pre .stream,
+pre .apache .tag,
+pre .date,
+pre .tex .formula,
+pre .coffeescript .attribute {
+  color: rgb(163, 21, 21);
+}
+
+pre .ruby .string,
+pre .decorator,
+pre .filter .argument,
+pre .localvars,
+pre .array,
+pre .attr_selector,
+pre .pseudo,
+pre .pi,
+pre .doctype,
+pre .deletion,
+pre .envvar,
+pre .shebang,
+pre .preprocessor,
+pre .pragma,
+pre .userType,
+pre .apache .sqbracket,
+pre .nginx .built_in,
+pre .tex .special,
+pre .prompt {
+  color: rgb(43, 145, 175);
+}
+
+pre .phpdoc,
+pre .javadoc,
+pre .xmlDocTag {
+  color: rgb(128, 128, 128);
+}
+
+pre .vhdl .typename { font-weight: bold; }
+pre .vhdl .string { color: #666666; }
+pre .vhdl .literal { color: rgb(163, 21, 21); }
+pre .vhdl .attribute { color: #00B0E8; }
+
+pre .xml .attribute { color: rgb(255, 0, 0); }
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/xcode.css b/htmltest/sites/all/libraries/highlightjs/styles/xcode.css
new file mode 100644
index 00000000..3b355a20
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/xcode.css
@@ -0,0 +1,157 @@
+/*
+
+XCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>
+
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background: #fff; color: black;
+}
+
+pre .comment,
+pre .template_comment,
+pre .javadoc,
+pre .comment * {
+  color: rgb(0,106,0);
+}
+
+pre .keyword,
+pre .literal,
+pre .nginx .title {
+  color: rgb(170,13,145);
+}
+pre .method,
+pre .list .title,
+pre .tag .title,
+pre .setting .value,
+pre .winutils,
+pre .tex .command,
+pre .http .title,
+pre .request,
+pre .status {
+  color: #008;
+}
+
+pre .envvar,
+pre .tex .special {
+  color: #660;
+}
+
+pre .string {
+  color: rgb(196,26,22);
+}
+pre .tag .value,
+pre .cdata,
+pre .filter .argument,
+pre .attr_selector,
+pre .apache .cbracket,
+pre .date,
+pre .regexp {
+  color: #080;
+}
+
+pre .sub .identifier,
+pre .pi,
+pre .tag,
+pre .tag .keyword,
+pre .decorator,
+pre .ini .title,
+pre .shebang,
+pre .prompt,
+pre .hexcolor,
+pre .rules .value,
+pre .css .value .number,
+pre .symbol,
+pre .symbol .string,
+pre .number,
+pre .css .function,
+pre .clojure .title,
+pre .clojure .built_in,
+pre .function .title,
+pre .coffeescript .attribute {
+  color: rgb(28,0,207);
+}
+
+pre .class .title,
+pre .haskell .type,
+pre .smalltalk .class,
+pre .javadoctag,
+pre .yardoctag,
+pre .phpdoc,
+pre .typename,
+pre .tag .attribute,
+pre .doctype,
+pre .class .id,
+pre .built_in,
+pre .setting,
+pre .params,
+pre .clojure .attribute {
+  color: rgb(92,38,153);
+}
+
+pre .variable {
+ color: rgb(63,110,116);
+}
+pre .css .tag,
+pre .rules .property,
+pre .pseudo,
+pre .subst {
+  color: #000;
+}
+
+pre .css .class, pre .css .id {
+  color: #9B703F;
+}
+
+pre .value .important {
+  color: #ff7700;
+  font-weight: bold;
+}
+
+pre .rules .keyword {
+  color: #C5AF75;
+}
+
+pre .annotation,
+pre .apache .sqbracket,
+pre .nginx .built_in {
+  color: #9B859D;
+}
+
+pre .preprocessor,
+pre .preprocessor *,
+pre .pragma {
+  color: rgb(100,56,32);
+}
+
+pre .tex .formula {
+  background-color: #EEE;
+  font-style: italic;
+}
+
+pre .diff .header,
+pre .chunk {
+  color: #808080;
+  font-weight: bold;
+}
+
+pre .diff .change {
+  background-color: #BCCFF9;
+}
+
+pre .addition {
+  background-color: #BAEEBA;
+}
+
+pre .deletion {
+  background-color: #FFC8BD;
+}
+
+pre .comment .yardoctag {
+  font-weight: bold;
+}
+
+pre .method .id {
+  color: #000;
+}
diff --git a/htmltest/sites/all/libraries/highlightjs/styles/zenburn.css b/htmltest/sites/all/libraries/highlightjs/styles/zenburn.css
new file mode 100644
index 00000000..3fc6bd0a
--- /dev/null
+++ b/htmltest/sites/all/libraries/highlightjs/styles/zenburn.css
@@ -0,0 +1,117 @@
+/*
+
+Zenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>
+based on dark.css by Ivan Sagalaev
+
+*/
+
+pre code {
+  display: block; padding: 0.5em;
+  background: #3F3F3F;
+  color: #DCDCDC;
+}
+
+pre .keyword,
+pre .tag,
+pre .css .class,
+pre .css .id,
+pre .lisp .title,
+pre .nginx .title,
+pre .request,
+pre .status,
+pre .clojure .attribute {
+  color: #E3CEAB;
+}
+
+pre .django .template_tag,
+pre .django .variable,
+pre .django .filter .argument {
+  color: #DCDCDC;
+}
+
+pre .number,
+pre .date {
+  color: #8CD0D3;
+}
+
+pre .dos .envvar,
+pre .dos .stream,
+pre .variable,
+pre .apache .sqbracket {
+  color: #EFDCBC;
+}
+
+pre .dos .flow,
+pre .diff .change,
+pre .python .exception,
+pre .python .built_in,
+pre .literal,
+pre .tex .special {
+  color: #EFEFAF;
+}
+
+pre .diff .chunk,
+pre .subst {
+  color: #8F8F8F;
+}
+
+pre .dos .keyword,
+pre .python .decorator,
+pre .title,
+pre .haskell .type,
+pre .diff .header,
+pre .ruby .class .parent,
+pre .apache .tag,
+pre .nginx .built_in,
+pre .tex .command,
+pre .prompt {
+    color: #efef8f;
+}
+
+pre .dos .winutils,
+pre .ruby .symbol,
+pre .ruby .symbol .string,
+pre .ruby .string {
+  color: #DCA3A3;
+}
+
+pre .diff .deletion,
+pre .string,
+pre .tag .value,
+pre .preprocessor,
+pre .pragma,
+pre .built_in,
+pre .sql .aggregate,
+pre .javadoc,
+pre .smalltalk .class,
+pre .smalltalk .localvars,
+pre .smalltalk .array,
+pre .css .rules .value,
+pre .attr_selector,
+pre .pseudo,
+pre .apache .cbracket,
+pre .tex .formula,
+pre .coffeescript .attribute {
+  color: #CC9393;
+}
+
+pre .shebang,
+pre .diff .addition,
+pre .comment,
+pre .java .annotation,
+pre .template_comment,
+pre .pi,
+pre .doctype {
+  color: #7F9F7F;
+}
+
+pre .coffeescript .javascript,
+pre .javascript .xml,
+pre .tex .formula,
+pre .xml .javascript,
+pre .xml .vbscript,
+pre .xml .css,
+pre .xml .cdata {
+  opacity: 0.5;
+}
+
diff --git a/htmltest/sites/all/libraries/iCalcreator b/htmltest/sites/all/libraries/iCalcreator
new file mode 120000
index 00000000..c6c70736
--- /dev/null
+++ b/htmltest/sites/all/libraries/iCalcreator
@@ -0,0 +1 @@
+iCalcreator-version
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/iCalcreator-version/README.txt b/htmltest/sites/all/libraries/iCalcreator-version/README.txt
new file mode 100644
index 00000000..7a2694ca
--- /dev/null
+++ b/htmltest/sites/all/libraries/iCalcreator-version/README.txt
@@ -0,0 +1,5 @@
+iCalcreator
+is a PHP class managing iCal (rfc2445/rfc5445) formatted files for non-calendar
+systems like CMS, project management systems and other applications able to
+process calendar information like agendas, tasks, reports, totos, journaling
+data and for communication with calendar systems and applications.
diff --git a/htmltest/sites/all/libraries/iCalcreator-version/iCalcreator-version b/htmltest/sites/all/libraries/iCalcreator-version/iCalcreator-version
new file mode 120000
index 00000000..c6c70736
--- /dev/null
+++ b/htmltest/sites/all/libraries/iCalcreator-version/iCalcreator-version
@@ -0,0 +1 @@
+iCalcreator-version
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/iCalcreator-version/iCalcreator.class.php b/htmltest/sites/all/libraries/iCalcreator-version/iCalcreator.class.php
new file mode 100644
index 00000000..81a4c076
--- /dev/null
+++ b/htmltest/sites/all/libraries/iCalcreator-version/iCalcreator.class.php
@@ -0,0 +1,10540 @@
+<?php
+/*********************************************************************************/
+/**
+ * iCalcreator v2.18
+ * copyright (c) 2007-2013 Kjell-Inge Gustafsson, kigkonsult, All rights reserved
+ * kigkonsult.se/iCalcreator/index.php
+ * ical@kigkonsult.se
+ *
+ * Description:
+ * This file is a PHP implementation of rfc2445/rfc5545.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+/*********************************************************************************/
+/*********************************************************************************/
+/*         A little setup                                                        */
+/*********************************************************************************/
+            /* your local language code */
+// define( 'ICAL_LANG', 'sv' );
+            // alt. autosetting
+/*
+$langstr     = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
+$pos         = strpos( $langstr, ';' );
+if ($pos   !== false) {
+  $langstr   = substr( $langstr, 0, $pos );
+  $pos       = strpos( $langstr, ',' );
+  if ($pos !== false) {
+    $pos     = strpos( $langstr, ',' );
+    $langstr = substr( $langstr, 0, $pos );
+  }
+  define( 'ICAL_LANG', $langstr );
+}
+*/
+/*********************************************************************************/
+/*         version, do NOT remove!!                                              */
+define( 'ICALCREATOR_VERSION', 'iCalcreator 2.18' );
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * vcalendar class
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.9.6 - 2011-05-14
+ */
+class vcalendar {
+            //  calendar property variables
+  var $calscale;
+  var $method;
+  var $prodid;
+  var $version;
+  var $xprop;
+            //  container for calendar components
+  var $components;
+            //  component config variables
+  var $allowEmpty;
+  var $unique_id;
+  var $language;
+  var $directory;
+  var $filename;
+  var $url;
+  var $delimiter;
+  var $nl;
+  var $format;
+  var $dtzid;
+            //  component internal variables
+  var $attributeDelimiter;
+  var $valueInit;
+            //  component xCal declaration container
+  var $xcaldecl;
+/**
+ * constructor for calendar object
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.9.6 - 2011-05-14
+ * @param array $config
+ * @return void
+ */
+  function vcalendar ( $config = array()) {
+    $this->_makeVersion();
+    $this->calscale   = null;
+    $this->method     = null;
+    $this->_makeUnique_id();
+    $this->prodid     = null;
+    $this->xprop      = array();
+    $this->language   = null;
+    $this->directory  = null;
+    $this->filename   = null;
+    $this->url        = null;
+    $this->dtzid      = null;
+/**
+ *   language = <Text identifying a language, as defined in [RFC 1766]>
+ */
+    if( defined( 'ICAL_LANG' ) && !isset( $config['language'] ))
+                                          $config['language']   = ICAL_LANG;
+    if( !isset( $config['allowEmpty'] ))  $config['allowEmpty'] = TRUE;
+    if( !isset( $config['nl'] ))          $config['nl']         = "\r\n";
+    if( !isset( $config['format'] ))      $config['format']     = 'iCal';
+    if( !isset( $config['delimiter'] ))   $config['delimiter']  = DIRECTORY_SEPARATOR;
+    $this->setConfig( $config );
+
+    $this->xcaldecl   = array();
+    $this->components = array();
+  }
+/*********************************************************************************/
+/**
+ * Property Name: CALSCALE
+ */
+/**
+ * creates formatted output for calendar property calscale
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.10.16 - 2011-10-28
+ * @return string
+ */
+  function createCalscale() {
+    if( empty( $this->calscale )) return FALSE;
+    switch( $this->format ) {
+      case 'xcal':
+        return $this->nl.' calscale="'.$this->calscale.'"';
+        break;
+      default:
+        return 'CALSCALE:'.$this->calscale.$this->nl;
+        break;
+    }
+  }
+/**
+ * set calendar property calscale
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @param string $value
+ * @return void
+ */
+  function setCalscale( $value ) {
+    if( empty( $value )) return FALSE;
+    $this->calscale = $value;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: METHOD
+ */
+/**
+ * creates formatted output for calendar property method
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.10.16 - 2011-10-28
+ * @return string
+ */
+  function createMethod() {
+    if( empty( $this->method )) return FALSE;
+    switch( $this->format ) {
+      case 'xcal':
+        return $this->nl.' method="'.$this->method.'"';
+        break;
+      default:
+        return 'METHOD:'.$this->method.$this->nl;
+        break;
+    }
+  }
+/**
+ * set calendar property method
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-20-23
+ * @param string $value
+ * @return bool
+ */
+  function setMethod( $value ) {
+    if( empty( $value )) return FALSE;
+    $this->method = $value;
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: PRODID
+ *
+ *  The identifier is RECOMMENDED to be the identical syntax to the
+ * [RFC 822] addr-spec. A good method to assure uniqueness is to put the
+ * domain name or a domain literal IP address of the host on which.. .
+ */
+/**
+ * creates formatted output for calendar property prodid
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.12.11 - 2012-05-13
+ * @return string
+ */
+  function createProdid() {
+    if( !isset( $this->prodid ))
+      $this->_makeProdid();
+    switch( $this->format ) {
+      case 'xcal':
+        return $this->nl.' prodid="'.$this->prodid.'"';
+        break;
+      default:
+        $toolbox = new calendarComponent();
+        $toolbox->setConfig( $this->getConfig());
+        return $toolbox->_createElement( 'PRODID', '', $this->prodid );
+        break;
+    }
+  }
+/**
+ * make default value for calendar prodid
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.6.8 - 2009-12-30
+ * @return void
+ */
+  function _makeProdid() {
+    $this->prodid  = '-//'.$this->unique_id.'//NONSGML kigkonsult.se '.ICALCREATOR_VERSION.'//'.strtoupper( $this->language );
+  }
+/**
+ * Conformance: The property MUST be specified once in an iCalendar object.
+ * Description: The vendor of the implementation SHOULD assure that this
+ * is a globally unique identifier; using some technique such as an FPI
+ * value, as defined in [ISO 9070].
+ */
+/**
+ * make default unique_id for calendar prodid
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 0.3.0 - 2006-08-10
+ * @return void
+ */
+  function _makeUnique_id() {
+    $this->unique_id  = ( isset( $_SERVER['SERVER_NAME'] )) ? gethostbyname( $_SERVER['SERVER_NAME'] ) : 'localhost';
+  }
+/*********************************************************************************/
+/**
+ * Property Name: VERSION
+ *
+ * Description: A value of "2.0" corresponds to this memo.
+ */
+/**
+ * creates formatted output for calendar property version
+
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.10.16 - 2011-10-28
+ * @return string
+ */
+  function createVersion() {
+    if( empty( $this->version ))
+      $this->_makeVersion();
+    switch( $this->format ) {
+      case 'xcal':
+        return $this->nl.' version="'.$this->version.'"';
+        break;
+      default:
+        return 'VERSION:'.$this->version.$this->nl;
+        break;
+    }
+  }
+/**
+ * set default calendar version
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 0.3.0 - 2006-08-10
+ * @return void
+ */
+  function _makeVersion() {
+    $this->version = '2.0';
+  }
+/**
+ * set calendar version
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @param string $value
+ * @return void
+ */
+  function setVersion( $value ) {
+    if( empty( $value )) return FALSE;
+    $this->version = $value;
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: x-prop
+ */
+/**
+ * creates formatted output for calendar property x-prop, iCal format only
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-05-25
+ * @return string
+ */
+  function createXprop() {
+    if( empty( $this->xprop ) || !is_array( $this->xprop )) return FALSE;
+    $output        = null;
+    $toolbox       = new calendarComponent();
+    $toolbox->setConfig( $this->getConfig());
+    foreach( $this->xprop as $label => $xpropPart ) {
+      if( !isset($xpropPart['value']) || ( empty( $xpropPart['value'] ) && !is_numeric( $xpropPart['value'] ))) {
+        if( $this->getConfig( 'allowEmpty' ))
+          $output .= $toolbox->_createElement( $label );
+        continue;
+      }
+      $attributes  = $toolbox->_createParams( $xpropPart['params'], array( 'LANGUAGE' ));
+      if( is_array( $xpropPart['value'] )) {
+        foreach( $xpropPart['value'] as $pix => $theXpart )
+          $xpropPart['value'][$pix] = iCalUtilityFunctions::_strrep( $theXpart, $this->format, $this->nl );
+        $xpropPart['value']  = implode( ',', $xpropPart['value'] );
+      }
+      else
+        $xpropPart['value'] = iCalUtilityFunctions::_strrep( $xpropPart['value'], $this->format, $this->nl );
+      $output     .= $toolbox->_createElement( $label, $attributes, $xpropPart['value'] );
+      if( is_array( $toolbox->xcaldecl ) && ( 0 < count( $toolbox->xcaldecl ))) {
+        foreach( $toolbox->xcaldecl as $localxcaldecl )
+          $this->xcaldecl[] = $localxcaldecl;
+      }
+    }
+    return $output;
+  }
+/**
+ * set calendar property x-prop
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $label
+ * @param string $value
+ * @param array $params optional
+ * @return bool
+ */
+  function setXprop( $label, $value, $params=FALSE ) {
+    if( empty( $label ))
+      return FALSE;
+    if( 'X-' != strtoupper( substr( $label, 0, 2 )))
+      return FALSE;
+    if( empty( $value ) && !is_numeric( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $xprop           = array( 'value' => $value );
+    $xprop['params'] = iCalUtilityFunctions::_setParams( $params );
+    if( !is_array( $this->xprop )) $this->xprop = array();
+    $this->xprop[strtoupper( $label )] = $xprop;
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * delete calendar property value
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.8.8 - 2011-03-15
+ * @param mixed $propName, bool FALSE => X-property
+ * @param int $propix, optional, if specific property is wanted in case of multiply occurences
+ * @return bool, if successfull delete
+ */
+  function deleteProperty( $propName=FALSE, $propix=FALSE ) {
+    $propName = ( $propName ) ? strtoupper( $propName ) : 'X-PROP';
+    if( !$propix )
+      $propix = ( isset( $this->propdelix[$propName] ) && ( 'X-PROP' != $propName )) ? $this->propdelix[$propName] + 2 : 1;
+    $this->propdelix[$propName] = --$propix;
+    $return = FALSE;
+    switch( $propName ) {
+      case 'CALSCALE':
+        if( isset( $this->calscale )) {
+          $this->calscale = null;
+          $return = TRUE;
+        }
+        break;
+      case 'METHOD':
+        if( isset( $this->method )) {
+          $this->method   = null;
+          $return = TRUE;
+        }
+        break;
+      default:
+        $reduced = array();
+        if( $propName != 'X-PROP' ) {
+          if( !isset( $this->xprop[$propName] )) { unset( $this->propdelix[$propName] ); return FALSE; }
+          foreach( $this->xprop as $k => $a ) {
+            if(( $k != $propName ) && !empty( $a ))
+              $reduced[$k] = $a;
+          }
+        }
+        else {
+          if( count( $this->xprop ) <= $propix )  return FALSE;
+          $xpropno = 0;
+          foreach( $this->xprop as $xpropkey => $xpropvalue ) {
+            if( $propix != $xpropno )
+              $reduced[$xpropkey] = $xpropvalue;
+            $xpropno++;
+          }
+        }
+        $this->xprop = $reduced;
+        if( empty( $this->xprop )) {
+          unset( $this->propdelix[$propName] );
+          return FALSE;
+        }
+        return TRUE;
+    }
+    return $return;
+  }
+/**
+ * get calendar property value/params
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.13.4 - 2012-08-08
+ * @param string $propName, optional
+ * @param int $propix, optional, if specific property is wanted in case of multiply occurences
+ * @param bool $inclParam=FALSE
+ * @return mixed
+ */
+  function getProperty( $propName=FALSE, $propix=FALSE, $inclParam=FALSE ) {
+    $propName = ( $propName ) ? strtoupper( $propName ) : 'X-PROP';
+    if( 'X-PROP' == $propName ) {
+      if( !$propix )
+        $propix  = ( isset( $this->propix[$propName] )) ? $this->propix[$propName] + 2 : 1;
+      $this->propix[$propName] = --$propix;
+    }
+    else
+      $mProps    = array( 'ATTENDEE', 'CATEGORIES', 'CONTACT', 'RELATED-TO', 'RESOURCES' );
+    switch( $propName ) {
+      case 'ATTENDEE':
+      case 'CATEGORIES':
+      case 'CONTACT':
+      case 'DTSTART':
+      case 'GEOLOCATION':
+      case 'LOCATION':
+      case 'ORGANIZER':
+      case 'PRIORITY':
+      case 'RESOURCES':
+      case 'STATUS':
+      case 'SUMMARY':
+      case 'RECURRENCE-ID-UID':
+      case 'RELATED-TO':
+      case 'R-UID':
+      case 'UID':
+      case 'URL':
+        $output  = array();
+        foreach ( $this->components as $cix => $component) {
+          if( !in_array( $component->objName, array('vevent', 'vtodo', 'vjournal', 'vfreebusy' )))
+            continue;
+          if( in_array( strtoupper( $propName ), $mProps )) {
+            $component->_getProperties( $propName, $output );
+            continue;
+          }
+          elseif(( 3 < strlen( $propName )) && ( 'UID' == substr( $propName, -3 ))) {
+            if( FALSE !== ( $content = $component->getProperty( 'RECURRENCE-ID' )))
+              $content = $component->getProperty( 'UID' );
+          }
+          elseif( 'GEOLOCATION' == $propName ) {
+            $content = $component->getProperty( 'LOCATION' );
+            $content = ( !empty( $content )) ? $content.' ' : '';
+            if(( FALSE === ( $geo     = $component->getProperty( 'GEO' ))) || empty( $geo ))
+              continue;
+            if( 0.0 < $geo['latitude'] )
+              $sign   = '+';
+            else
+              $sign   = ( 0.0 > $geo['latitude'] ) ? '-' : '';
+            $content .= ' '.$sign.sprintf( "%09.6f", abs( $geo['latitude'] ));
+            $content  = rtrim( rtrim( $content, '0' ), '.' );
+            if( 0.0 < $geo['longitude'] )
+              $sign   = '+';
+            else
+              $sign   = ( 0.0 > $geo['longitude'] ) ? '-' : '';
+            $content .= $sign.sprintf( '%8.6f', abs( $geo['longitude'] )).'/';
+          }
+          elseif( FALSE === ( $content = $component->getProperty( $propName )))
+            continue;
+          if(( FALSE === $content ) || empty( $content ))
+            continue;
+          elseif( is_array( $content )) {
+            if( isset( $content['year'] )) {
+              $key  = sprintf( '%04d%02d%02d', $content['year'], $content['month'], $content['day'] );
+              if( !isset( $output[$key] ))
+                $output[$key] = 1;
+              else
+                $output[$key] += 1;
+            }
+            else {
+              foreach( $content as $partValue => $partCount ) {
+                if( !isset( $output[$partValue] ))
+                  $output[$partValue] = $partCount;
+                else
+                  $output[$partValue] += $partCount;
+              }
+            }
+          } // end elseif( is_array( $content )) {
+          elseif( !isset( $output[$content] ))
+            $output[$content] = 1;
+          else
+            $output[$content] += 1;
+        } // end foreach ( $this->components as $cix => $component)
+        if( !empty( $output ))
+          ksort( $output );
+        return $output;
+        break;
+      case 'CALSCALE':
+        return ( !empty( $this->calscale )) ? $this->calscale : FALSE;
+        break;
+      case 'METHOD':
+        return ( !empty( $this->method )) ? $this->method : FALSE;
+        break;
+      case 'PRODID':
+        if( empty( $this->prodid ))
+          $this->_makeProdid();
+        return $this->prodid;
+        break;
+      case 'VERSION':
+        return ( !empty( $this->version )) ? $this->version : FALSE;
+        break;
+      default:
+        if( $propName != 'X-PROP' ) {
+          if( !isset( $this->xprop[$propName] )) return FALSE;
+          return ( $inclParam ) ? array( $propName, $this->xprop[$propName] )
+                                : array( $propName, $this->xprop[$propName]['value'] );
+        }
+        else {
+          if( empty( $this->xprop )) return FALSE;
+          $xpropno = 0;
+          foreach( $this->xprop as $xpropkey => $xpropvalue ) {
+            if( $propix == $xpropno )
+              return ( $inclParam ) ? array( $xpropkey, $this->xprop[$xpropkey] )
+                                    : array( $xpropkey, $this->xprop[$xpropkey]['value'] );
+            else
+              $xpropno++;
+          }
+          unset( $this->propix[$propName] );
+          return FALSE; // not found ??
+        }
+    }
+    return FALSE;
+  }
+/**
+ * general vcalendar property setting
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.2.13 - 2007-11-04
+ * @param mixed $args variable number of function arguments,
+ *                    first argument is ALWAYS component name,
+ *                    second ALWAYS component value!
+ * @return bool
+ */
+  function setProperty () {
+    $numargs    = func_num_args();
+    if( 1 > $numargs )
+      return FALSE;
+    $arglist    = func_get_args();
+    $arglist[0] = strtoupper( $arglist[0] );
+    switch( $arglist[0] ) {
+      case 'CALSCALE':
+        return $this->setCalscale( $arglist[1] );
+      case 'METHOD':
+        return $this->setMethod( $arglist[1] );
+      case 'VERSION':
+        return $this->setVersion( $arglist[1] );
+      default:
+        if( !isset( $arglist[1] )) $arglist[1] = null;
+        if( !isset( $arglist[2] )) $arglist[2] = null;
+        return $this->setXprop( $arglist[0], $arglist[1], $arglist[2] );
+    }
+    return FALSE;
+  }
+/*********************************************************************************/
+/**
+ * get vcalendar config values or * calendar components
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.11.7 - 2012-01-12
+ * @param mixed $config
+ * @return value
+ */
+  function getConfig( $config = FALSE ) {
+    if( !$config ) {
+      $return = array();
+      $return['ALLOWEMPTY']  = $this->getConfig( 'ALLOWEMPTY' );
+      $return['DELIMITER']   = $this->getConfig( 'DELIMITER' );
+      $return['DIRECTORY']   = $this->getConfig( 'DIRECTORY' );
+      $return['FILENAME']    = $this->getConfig( 'FILENAME' );
+      $return['DIRFILE']     = $this->getConfig( 'DIRFILE' );
+      $return['FILESIZE']    = $this->getConfig( 'FILESIZE' );
+      $return['FORMAT']      = $this->getConfig( 'FORMAT' );
+      if( FALSE !== ( $lang  = $this->getConfig( 'LANGUAGE' )))
+        $return['LANGUAGE']  = $lang;
+      $return['NEWLINECHAR'] = $this->getConfig( 'NEWLINECHAR' );
+      $return['UNIQUE_ID']   = $this->getConfig( 'UNIQUE_ID' );
+      if( FALSE !== ( $url   = $this->getConfig( 'URL' )))
+        $return['URL']       = $url;
+      $return['TZID']        = $this->getConfig( 'TZID' );
+      return $return;
+    }
+    switch( strtoupper( $config )) {
+      case 'ALLOWEMPTY':
+        return $this->allowEmpty;
+        break;
+      case 'COMPSINFO':
+        unset( $this->compix );
+        $info = array();
+        foreach( $this->components as $cix => $component ) {
+          if( empty( $component )) continue;
+          $info[$cix]['ordno'] = $cix + 1;
+          $info[$cix]['type']  = $component->objName;
+          $info[$cix]['uid']   = $component->getProperty( 'uid' );
+          $info[$cix]['props'] = $component->getConfig( 'propinfo' );
+          $info[$cix]['sub']   = $component->getConfig( 'compsinfo' );
+        }
+        return $info;
+        break;
+      case 'DELIMITER':
+        return $this->delimiter;
+        break;
+      case 'DIRECTORY':
+        if( empty( $this->directory ) && ( '0' != $this->directory ))
+          $this->directory = '.';
+        return $this->directory;
+        break;
+      case 'DIRFILE':
+        return $this->getConfig( 'directory' ).$this->getConfig( 'delimiter' ).$this->getConfig( 'filename' );
+        break;
+      case 'FILEINFO':
+        return array( $this->getConfig( 'directory' )
+                    , $this->getConfig( 'filename' )
+                    , $this->getConfig( 'filesize' ));
+        break;
+      case 'FILENAME':
+        if( empty( $this->filename ) && ( '0' != $this->filename )) {
+          if( 'xcal' == $this->format )
+            $this->filename = date( 'YmdHis' ).'.xml'; // recommended xcs.. .
+          else
+            $this->filename = date( 'YmdHis' ).'.ics';
+        }
+        return $this->filename;
+        break;
+      case 'FILESIZE':
+        $size    = 0;
+        if( empty( $this->url )) {
+          $dirfile = $this->getConfig( 'dirfile' );
+          if( !is_file( $dirfile ) || ( FALSE === ( $size = filesize( $dirfile ))))
+            $size = 0;
+          clearstatcache();
+        }
+        return $size;
+        break;
+      case 'FORMAT':
+        return ( $this->format == 'xcal' ) ? 'xCal' : 'iCal';
+        break;
+      case 'LANGUAGE':
+         /* get language for calendar component as defined in [RFC 1766] */
+        return $this->language;
+        break;
+      case 'NL':
+      case 'NEWLINECHAR':
+        return $this->nl;
+        break;
+      case 'TZID':
+        return $this->dtzid;
+        break;
+      case 'UNIQUE_ID':
+        return $this->unique_id;
+        break;
+      case 'URL':
+        if( !empty( $this->url ))
+          return $this->url;
+        else
+          return FALSE;
+        break;
+    }
+  }
+/**
+ * general vcalendar config setting
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.7 - 2013-01-11
+ * @param mixed  $config
+ * @param string $value
+ * @return void
+ */
+  function setConfig( $config, $value = FALSE) {
+    if( is_array( $config )) {
+      $ak = array_keys( $config );
+      foreach( $ak as $k ) {
+        if( 'DIRECTORY' == strtoupper( $k )) {
+          if( FALSE === $this->setConfig( 'DIRECTORY', $config[$k] ))
+            return FALSE;
+          unset( $config[$k] );
+        }
+        elseif( 'NEWLINECHAR' == strtoupper( $k )) {
+          if( FALSE === $this->setConfig( 'NEWLINECHAR', $config[$k] ))
+            return FALSE;
+          unset( $config[$k] );
+        }
+      }
+      foreach( $config as $cKey => $cValue ) {
+        if( FALSE === $this->setConfig( $cKey, $cValue ))
+          return FALSE;
+      }
+      return TRUE;
+    }
+    $res = FALSE;
+    switch( strtoupper( $config )) {
+      case 'ALLOWEMPTY':
+        $this->allowEmpty = $value;
+        $subcfg  = array( 'ALLOWEMPTY' => $value );
+        $res = TRUE;
+        break;
+      case 'DELIMITER':
+        $this->delimiter = $value;
+        return TRUE;
+        break;
+      case 'DIRECTORY':
+        $value   = trim( $value );
+        $del     = $this->getConfig('delimiter');
+        if( $del == substr( $value, ( 0 - strlen( $del ))))
+          $value = substr( $value, 0, ( strlen( $value ) - strlen( $del )));
+        if( is_dir( $value )) {
+            /* local directory */
+          clearstatcache();
+          $this->directory = $value;
+          $this->url       = null;
+          return TRUE;
+        }
+        else
+          return FALSE;
+        break;
+      case 'FILENAME':
+        $value   = trim( $value );
+        if( !empty( $this->url )) {
+            /* remote directory+file -> URL */
+          $this->filename = $value;
+          return TRUE;
+        }
+        $dirfile = $this->getConfig( 'directory' ).$this->getConfig( 'delimiter' ).$value;
+        if( file_exists( $dirfile )) {
+            /* local file exists */
+          if( is_readable( $dirfile ) || is_writable( $dirfile )) {
+            clearstatcache();
+            $this->filename = $value;
+            return TRUE;
+          }
+          else
+            return FALSE;
+        }
+        elseif( is_readable($this->getConfig( 'directory' ) ) || is_writable( $this->getConfig( 'directory' ) )) {
+            /* read- or writable directory */
+          $this->filename = $value;
+          return TRUE;
+        }
+        else
+          return FALSE;
+        break;
+      case 'FORMAT':
+        $value   = trim( strtolower( $value ));
+        if( 'xcal' == $value ) {
+          $this->format             = 'xcal';
+          $this->attributeDelimiter = $this->nl;
+          $this->valueInit          = null;
+        }
+        else {
+          $this->format             = null;
+          $this->attributeDelimiter = ';';
+          $this->valueInit          = ':';
+        }
+        $subcfg  = array( 'FORMAT' => $value );
+        $res = TRUE;
+        break;
+      case 'LANGUAGE': // set language for calendar component as defined in [RFC 1766]
+        $value   = trim( $value );
+        $this->language = $value;
+        $this->_makeProdid();
+        $subcfg  = array( 'LANGUAGE' => $value );
+        $res = TRUE;
+        break;
+      case 'NL':
+      case 'NEWLINECHAR':
+        $this->nl = $value;
+        if( 'xcal' == $value ) {
+          $this->attributeDelimiter = $this->nl;
+          $this->valueInit          = null;
+        }
+        else {
+          $this->attributeDelimiter = ';';
+          $this->valueInit          = ':';
+        }
+        $subcfg  = array( 'NL' => $value );
+        $res = TRUE;
+        break;
+      case 'TZID':
+        $this->dtzid = $value;
+        $subcfg  = array( 'TZID' => $value );
+        $res = TRUE;
+        break;
+      case 'UNIQUE_ID':
+        $value   = trim( $value );
+        $this->unique_id = $value;
+        $this->_makeProdid();
+        $subcfg  = array( 'UNIQUE_ID' => $value );
+        $res = TRUE;
+        break;
+      case 'URL':
+            /* remote file - URL */
+        $value     = str_replace( array( 'HTTP://', 'WEBCAL://', 'webcal://' ), 'http://', trim( $value ));
+        if( 'http://' != substr( $value, 0, 7 ))
+          return FALSE;
+        $s1        = $this->url;
+        $this->url = $value;
+        $s2        = $this->directory;
+        $this->directory = null;
+        $parts     = pathinfo( $value );
+        if( FALSE === $this->setConfig( 'filename',  $parts['basename'] )) {
+          $this->url       = $s1;
+          $this->directory = $s2;
+          return FALSE;
+        }
+        else
+          return TRUE;
+        break;
+      default:  // any unvalid config key.. .
+        return TRUE;
+    }
+    if( !$res ) return FALSE;
+    if( isset( $subcfg ) && !empty( $this->components )) {
+      foreach( $subcfg as $cfgkey => $cfgvalue ) {
+        foreach( $this->components as $cix => $component ) {
+          $res = $component->setConfig( $cfgkey, $cfgvalue, TRUE );
+          if( !$res )
+            break 2;
+          $this->components[$cix] = $component->copy(); // PHP4 compliant
+        }
+      }
+    }
+    return $res;
+  }
+/*********************************************************************************/
+/**
+ * add calendar component to container
+ *
+ * alias to setComponent
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 1.x.x - 2007-04-24
+ * @param object $component calendar component
+ * @return void
+ */
+  function addComponent( $component ) {
+    $this->setComponent( $component );
+  }
+/**
+ * delete calendar component from container
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.8.8 - 2011-03-15
+ * @param mixed $arg1 ordno / component type / component uid
+ * @param mixed $arg2 optional, ordno if arg1 = component type
+ * @return void
+ */
+  function deleteComponent( $arg1, $arg2=FALSE  ) {
+    $argType = $index = null;
+    if ( ctype_digit( (string) $arg1 )) {
+      $argType = 'INDEX';
+      $index   = (int) $arg1 - 1;
+    }
+    elseif(( strlen( $arg1 ) <= strlen( 'vfreebusy' )) && ( FALSE === strpos( $arg1, '@' ))) {
+      $argType = strtolower( $arg1 );
+      $index   = ( !empty( $arg2 ) && ctype_digit( (string) $arg2 )) ? (( int ) $arg2 - 1 ) : 0;
+    }
+    $cix1dC = 0;
+    foreach ( $this->components as $cix => $component) {
+      if( empty( $component )) continue;
+      if(( 'INDEX' == $argType ) && ( $index == $cix )) {
+        unset( $this->components[$cix] );
+        return TRUE;
+      }
+      elseif( $argType == $component->objName ) {
+        if( $index == $cix1dC ) {
+          unset( $this->components[$cix] );
+          return TRUE;
+        }
+        $cix1dC++;
+      }
+      elseif( !$argType && ($arg1 == $component->getProperty( 'uid' ))) {
+        unset( $this->components[$cix] );
+        return TRUE;
+      }
+    }
+    return FALSE;
+  }
+/**
+ * get calendar component from container
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.15 - 2013-04-25
+ * @param mixed $arg1 optional, ordno/component type/ component uid
+ * @param mixed $arg2 optional, ordno if arg1 = component type
+ * @return object
+ */
+  function getComponent( $arg1=FALSE, $arg2=FALSE ) {
+    $index = $argType = null;
+    if ( !$arg1 ) { // first or next in component chain
+      $argType = 'INDEX';
+      $index   = $this->compix['INDEX'] = ( isset( $this->compix['INDEX'] )) ? $this->compix['INDEX'] + 1 : 1;
+    }
+    elseif( is_array( $arg1 )) { // array( *[propertyName => propertyValue] )
+      $arg2  = implode( '-', array_keys( $arg1 ));
+      $index = $this->compix[$arg2] = ( isset( $this->compix[$arg2] )) ? $this->compix[$arg2] + 1 : 1;
+      $dateProps  = array( 'DTSTART', 'DTEND', 'DUE', 'CREATED', 'COMPLETED', 'DTSTAMP', 'LAST-MODIFIED', 'RECURRENCE-ID' );
+      $otherProps = array( 'ATTENDEE', 'CATEGORIES', 'CONTACT', 'LOCATION', 'ORGANIZER', 'PRIORITY', 'RELATED-TO', 'RESOURCES', 'STATUS', 'SUMMARY', 'UID', 'URL' );
+      $mProps     = array( 'ATTENDEE', 'CATEGORIES', 'CONTACT', 'RELATED-TO', 'RESOURCES' );
+    }
+    elseif ( ctype_digit( (string) $arg1 )) { // specific component in chain
+      $argType = 'INDEX';
+      $index   = (int) $arg1;
+      unset( $this->compix );
+    }
+    elseif(( strlen( $arg1 ) <= strlen( 'vfreebusy' )) && ( FALSE === strpos( $arg1, '@' ))) { // object class name
+      unset( $this->compix['INDEX'] );
+      $argType = strtolower( $arg1 );
+      if( !$arg2 )
+        $index = $this->compix[$argType] = ( isset( $this->compix[$argType] )) ? $this->compix[$argType] + 1 : 1;
+      elseif( isset( $arg2 ) && ctype_digit( (string) $arg2 ))
+        $index = (int) $arg2;
+    }
+    elseif(( strlen( $arg1 ) > strlen( 'vfreebusy' )) && ( FALSE !== strpos( $arg1, '@' ))) { // UID as 1st argument
+      if( !$arg2 )
+        $index = $this->compix[$arg1] = ( isset( $this->compix[$arg1] )) ? $this->compix[$arg1] + 1 : 1;
+      elseif( isset( $arg2 ) && ctype_digit( (string) $arg2 ))
+        $index = (int) $arg2;
+    }
+    if( isset( $index ))
+      $index  -= 1;
+    $ckeys = array_keys( $this->components );
+    if( !empty( $index) && ( $index > end(  $ckeys )))
+      return FALSE;
+    $cix1gC = 0;
+    foreach ( $this->components as $cix => $component) {
+      if( empty( $component )) continue;
+      if(( 'INDEX' == $argType ) && ( $index == $cix ))
+        return $component->copy();
+      elseif( $argType == $component->objName ) {
+        if( $index == $cix1gC )
+          return $component->copy();
+        $cix1gC++;
+      }
+      elseif( is_array( $arg1 )) { // array( *[propertyName => propertyValue] )
+        $hit = array();
+        foreach( $arg1 as $pName => $pValue ) {
+          $pName = strtoupper( $pName );
+          if( !in_array( $pName, $dateProps ) && !in_array( $pName, $otherProps ))
+            continue;
+          if( in_array( $pName, $mProps )) { // multiple occurrence
+            $propValues = array();
+            $component->_getProperties( $pName, $propValues );
+            $propValues = array_keys( $propValues );
+            $hit[] = ( in_array( $pValue, $propValues )) ? TRUE : FALSE;
+            continue;
+          } // end   if(.. .// multiple occurrence
+          if( FALSE === ( $value = $component->getProperty( $pName ))) { // single occurrence
+            $hit[] = FALSE; // missing property
+            continue;
+          }
+          if( 'SUMMARY' == $pName ) { // exists within (any case)
+            $hit[] = ( FALSE !== stripos( $value, $pValue )) ? TRUE : FALSE;
+            continue;
+          }
+          if( in_array( strtoupper( $pName ), $dateProps )) {
+            $valuedate = sprintf( '%04d%02d%02d', $value['year'], $value['month'], $value['day'] );
+            if( 8 < strlen( $pValue )) {
+              if( isset( $value['hour'] )) {
+                if( 'T' == substr( $pValue, 8, 1 ))
+                  $pValue = str_replace( 'T', '', $pValue );
+                $valuedate .= sprintf( '%02d%02d%02d', $value['hour'], $value['min'], $value['sec'] );
+              }
+              else
+                $pValue = substr( $pValue, 0, 8 );
+            }
+            $hit[] = ( $pValue == $valuedate ) ? TRUE : FALSE;
+            continue;
+          }
+          elseif( !is_array( $value ))
+            $value = array( $value );
+          foreach( $value as $part ) {
+            $part = ( FALSE !== strpos( $part, ',' )) ? explode( ',', $part ) : array( $part );
+            foreach( $part as $subPart ) {
+              if( $pValue == $subPart ) {
+                $hit[] = TRUE;
+                continue 3;
+              }
+            }
+          } // end foreach( $value as $part )
+          $hit[] = FALSE; // no hit in property
+        } // end  foreach( $arg1 as $pName => $pValue )
+        if( in_array( TRUE, $hit )) {
+          if( $index == $cix1gC )
+            return $component->copy();
+          $cix1gC++;
+        }
+      } // end elseif( is_array( $arg1 )) { // array( *[propertyName => propertyValue] )
+      elseif( !$argType && ($arg1 == $component->getProperty( 'uid' ))) { // UID
+        if( $index == $cix1gC )
+          return $component->copy();
+        $cix1gC++;
+      }
+    } // end foreach ( $this->components.. .
+            /* not found.. . */
+    unset( $this->compix );
+    return FALSE;
+  }
+/**
+ * create new calendar component, already included within calendar
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.6.33 - 2011-01-03
+ * @param string $compType component type
+ * @return object (reference)
+ */
+  function & newComponent( $compType ) {
+    $config = $this->getConfig();
+    $keys   = array_keys( $this->components );
+    $ix     = end( $keys) + 1;
+    switch( strtoupper( $compType )) {
+      case 'EVENT':
+      case 'VEVENT':
+        $this->components[$ix] = new vevent( $config );
+        break;
+      case 'TODO':
+      case 'VTODO':
+        $this->components[$ix] = new vtodo( $config );
+        break;
+      case 'JOURNAL':
+      case 'VJOURNAL':
+        $this->components[$ix] = new vjournal( $config );
+        break;
+      case 'FREEBUSY':
+      case 'VFREEBUSY':
+        $this->components[$ix] = new vfreebusy( $config );
+        break;
+      case 'TIMEZONE':
+      case 'VTIMEZONE':
+        array_unshift( $this->components, new vtimezone( $config ));
+        $ix = 0;
+        break;
+      default:
+        return FALSE;
+    }
+    return $this->components[$ix];
+  }
+/**
+ * select components from calendar on date or selectOption basis
+ *
+ * Ensure DTSTART is set for every component.
+ * No date controls occurs.
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.13 - 2013-03-16
+ * @param mixed $startY optional, start Year,  default current Year ALT. array selecOptions ( *[ <propName> => <uniqueValue> ] )
+ * @param int   $startM optional, start Month, default current Month
+ * @param int   $startD optional, start Day,   default current Day
+ * @param int   $endY   optional, end   Year,  default $startY
+ * @param int   $endY   optional, end   Month, default $startM
+ * @param int   $endY   optional, end   Day,   default $startD
+ * @param mixed $cType  optional, calendar component type(-s), default FALSE=all else string/array type(-s)
+ * @param bool  $flat   optional, FALSE (default) => output : array[Year][Month][Day][]
+ *                                TRUE            => output : array[] (ignores split)
+ * @param bool  $any    optional, TRUE (default) - select component(-s) that occurs within period
+ *                                FALSE          - only component(-s) that starts within period
+ * @param bool  $split  optional, TRUE (default) - one component copy every DAY it occurs during the
+ *                                                 period (implies flat=FALSE)
+ *                                FALSE          - one occurance of component only in output array
+ * @return array or FALSE
+ */
+  function selectComponents( $startY=FALSE, $startM=FALSE, $startD=FALSE, $endY=FALSE, $endM=FALSE, $endD=FALSE, $cType=FALSE, $flat=FALSE, $any=TRUE, $split=TRUE ) {
+            /* check  if empty calendar */
+    if( 0 >= count( $this->components )) return FALSE;
+    if( is_array( $startY ))
+      return $this->selectComponents2( $startY );
+            /* check default dates */
+    if( !$startY ) $startY = date( 'Y' );
+    if( !$startM ) $startM = date( 'm' );
+    if( !$startD ) $startD = date( 'd' );
+    $startDate = mktime( 0, 0, 0, $startM, $startD, $startY );
+    if( !$endY )   $endY   = $startY;
+    if( !$endM )   $endM   = $startM;
+    if( !$endD )   $endD   = $startD;
+    $endDate   = mktime( 23, 59, 59, $endM, $endD, $endY );
+// echo 'selectComp arg='.date( 'Y-m-d H:i:s', $startDate).' -- '.date( 'Y-m-d H:i:s', $endDate)."<br>\n"; $tcnt = 0;// test ###
+            /* check component types */
+    $validTypes = array('vevent', 'vtodo', 'vjournal', 'vfreebusy' );
+    if( is_array( $cType )) {
+      foreach( $cType as $cix => $theType ) {
+        $cType[$cix] = $theType = strtolower( $theType );
+        if( !in_array( $theType, $validTypes ))
+          $cType[$cix] = 'vevent';
+      }
+      $cType = array_unique( $cType );
+    }
+    elseif( !empty( $cType )) {
+      $cType = strtolower( $cType );
+      if( !in_array( $cType, $validTypes ))
+        $cType = array( 'vevent' );
+      else
+        $cType = array( $cType );
+    }
+    else
+      $cType = $validTypes;
+    if( 0 >= count( $cType ))
+      $cType = $validTypes;
+    if(( FALSE === $flat ) && ( FALSE === $any )) // invalid combination
+      $split = FALSE;
+    if(( TRUE === $flat ) && ( TRUE === $split )) // invalid combination
+      $split = FALSE;
+            /* iterate components */
+    $result       = array();
+    $this->sort( 'UID' );
+    $compUIDcmp   = null;
+    $recurridList = array();
+    foreach ( $this->components as $cix => $component ) {
+      if( empty( $component )) continue;
+      unset( $start );
+            /* deselect unvalid type components */
+      if( !in_array( $component->objName, $cType ))
+        continue;
+      $start = $component->getProperty( 'dtstart' );
+            /* select due when dtstart is missing */
+      if( empty( $start ) && ( $component->objName == 'vtodo' ) && ( FALSE === ( $start = $component->getProperty( 'due' ))))
+        continue;
+      if( empty( $start ))
+        continue;
+      $compUID      = $component->getProperty( 'UID' );
+      if( $compUIDcmp != $compUID ) {
+        $compUIDcmp = $compUID;
+        unset( $exdatelist, $recurridList );
+      }
+      $dtendExist = $dueExist = $durationExist = $endAllDayEvent = $recurrid = FALSE;
+      unset( $end, $startWdate, $endWdate, $rdurWsecs, $rdur, $workstart, $workend, $endDateFormat ); // clean up
+      $startWdate = iCalUtilityFunctions::_date2timestamp( $start );
+      $startDateFormat = ( isset( $start['hour'] )) ? 'Y-m-d H:i:s' : 'Y-m-d';
+            /* get end date from dtend/due/duration properties */
+      $end = $component->getProperty( 'dtend' );
+      if( !empty( $end )) {
+        $dtendExist = TRUE;
+        $endDateFormat = ( isset( $end['hour'] )) ? 'Y-m-d H:i:s' : 'Y-m-d';
+      }
+      if( empty( $end ) && ( $component->objName == 'vtodo' )) {
+        $end = $component->getProperty( 'due' );
+        if( !empty( $end )) {
+          $dueExist = TRUE;
+          $endDateFormat = ( isset( $end['hour'] )) ? 'Y-m-d H:i:s' : 'Y-m-d';
+        }
+      }
+      if( !empty( $end ) && !isset( $end['hour'] )) {
+          /* a DTEND without time part regards an event that ends the day before,
+             for an all-day event DTSTART=20071201 DTEND=20071202 (taking place 20071201!!! */
+        $endAllDayEvent = TRUE;
+        $endWdate = mktime( 23, 59, 59, $end['month'], ($end['day'] - 1), $end['year'] );
+        $end['year']  = date( 'Y', $endWdate );
+        $end['month'] = date( 'm', $endWdate );
+        $end['day']   = date( 'd', $endWdate );
+        $end['hour']  = 23;
+        $end['min']   = $end['sec'] = 59;
+      }
+      if( empty( $end )) {
+        $end = $component->getProperty( 'duration', FALSE, FALSE, TRUE );// in dtend (array) format
+        if( !empty( $end ))
+          $durationExist = TRUE;
+          $endDateFormat = ( isset( $start['hour'] )) ? 'Y-m-d H:i:s' : 'Y-m-d';
+// if( !empty($end))  echo 'selectComp 4 start='.implode('-',$start).' end='.implode('-',$end)."<br>\n"; // test ###
+      }
+      if( empty( $end )) { // assume one day duration if missing end date
+        $end = array( 'year' => $start['year'], 'month' => $start['month'], 'day' => $start['day'], 'hour' => 23, 'min' => 59, 'sec' => 59 );
+      }
+// if( isset($end))  echo 'selectComp 5 start='.implode('-',$start).' end='.implode('-',$end)."<br>\n"; // test ###
+      $endWdate = iCalUtilityFunctions::_date2timestamp( $end );
+      if( $endWdate < $startWdate ) { // MUST be after start date!!
+        $end = array( 'year' => $start['year'], 'month' => $start['month'], 'day' => $start['day'], 'hour' => 23, 'min' => 59, 'sec' => 59 );
+        $endWdate = iCalUtilityFunctions::_date2timestamp( $end );
+      }
+      $rdurWsecs  = $endWdate - $startWdate; // compute event (component) duration in seconds
+            /* make a list of optional exclude dates for component occurence from exrule and exdate */
+      $exdatelist = array();
+      $workstart  = iCalUtilityFunctions::_timestamp2date(( $startDate - $rdurWsecs ), 6);
+      $workend    = iCalUtilityFunctions::_timestamp2date(( $endDate + $rdurWsecs ), 6);
+      while( FALSE !== ( $exrule = $component->getProperty( 'exrule' )))    // check exrule
+        iCalUtilityFunctions::_recur2date( $exdatelist, $exrule, $start, $workstart, $workend );
+      while( FALSE !== ( $exdate = $component->getProperty( 'exdate' ))) {  // check exdate
+        foreach( $exdate as $theExdate ) {
+          $exWdate = iCalUtilityFunctions::_date2timestamp( $theExdate );
+          $exWdate = mktime( 0, 0, 0, date( 'm', $exWdate ), date( 'd', $exWdate ), date( 'Y', $exWdate )); // on a day-basis !!!
+          if((( $startDate - $rdurWsecs ) <= $exWdate ) && ( $endDate >= $exWdate ))
+            $exdatelist[$exWdate] = TRUE;
+        } // end - foreach( $exdate as $theExdate )
+      }  // end - check exdate
+            /* check recurrence-id (note, a missing sequence is the same as sequence=0 so don't test for sequence), remove hit with reccurr-id date */
+      if( FALSE !== ( $t = $recurrid = $component->getProperty( 'recurrence-id' ))) {
+        $recurrid = iCalUtilityFunctions::_date2timestamp( $recurrid );
+        $recurrid = mktime( 0, 0, 0, date( 'm', $recurrid ), date( 'd', $recurrid ), date( 'Y', $recurrid )); // on a day-basis !!!
+        $recurridList[$recurrid] = TRUE;                                             // no recurring to start this day
+// echo "adding comp no:$cix with date=".implode($start)." and recurrid=".implode($t)." to recurridList id=$recurrid<br>\n"; // test ###
+      } // end recurrence-id/sequence test
+            /* select only components with.. . */
+      if(( !$any && ( $startWdate >= $startDate ) && ( $startWdate <= $endDate )) || // (dt)start within the period
+         (  $any && ( $startWdate < $endDate ) && ( $endWdate >= $startDate ))) {    // occurs within the period
+            /* add the selected component (WITHIN valid dates) to output array */
+        if( $flat ) { // any=true/false, ignores split
+          if( !$recurrid )
+            $result[$compUID] = $component->copy(); // copy original to output (but not anyone with recurrence-id)
+        }
+        elseif( $split ) { // split the original component
+          if( $endWdate > $endDate )
+            $endWdate = $endDate;     // use period end date
+          $rstart   = $startWdate;
+          if( $rstart < $startDate )
+            $rstart = $startDate; // use period start date
+          $startYMD = $rstartYMD = date( 'Ymd', $rstart );
+          $endYMD   = date( 'Ymd', $endWdate );
+          $checkDate = mktime( 0, 0, 0, date( 'm', $rstart ), date( 'd', $rstart ), date( 'Y', $rstart ) ); // on a day-basis !!!
+// echo "going to test comp no:$cix with rstartYMD=$rstartYMD, endYMD=$endYMD and checkDate($checkDate) with recurridList=".implode(',',array_keys($recurridList))."<br>\n"; // test ###
+          if( !isset( $exdatelist[$checkDate] )) { // exclude any recurrence START date, found in exdatelist
+            while( $rstartYMD <= $endYMD ) { // iterate
+              if( isset( $exdatelist[$checkDate] ) ||                   // exclude any recurrence date, found in the exdatelist
+                ( isset( $recurridList[$checkDate] ) && !$recurrid )) { // or in the recurridList, but not itself
+// echo "skipping comp no:$cix with datestart=$rstartYMD and checkdate=$checkDate<br>\n"; // test ###
+                $rstart = mktime( date( 'H', $rstart ), date( 'i', $rstart ), date( 's', $rstart ), date( 'm', $rstart ), date( 'd', $rstart ) + 1, date( 'Y', $rstart ) ); // step one day
+                $rstartYMD = date( 'Ymd', $rstart );
+                continue;
+              }
+              if( $rstartYMD > $startYMD ) // date after dtstart
+                $datestring = date( $startDateFormat, $checkDate ); // mktime( 0, 0, 0, date( 'm', $rstart ), date( 'd', $rstart ), date( 'Y', $rstart )));
+              else
+                $datestring = date( $startDateFormat, $rstart );
+              if( isset( $start['tz'] ))
+                $datestring .= ' '.$start['tz'];
+// echo "split org comp no:$cix rstartYMD=$rstartYMD (datestring=$datestring)<br>\n"; // test ###
+              $component->setProperty( 'X-CURRENT-DTSTART', $datestring );
+              if( $dtendExist || $dueExist || $durationExist ) {
+                if( $rstartYMD < $endYMD ) // not the last day
+                  $tend = mktime( 23, 59, 59, date( 'm', $rstart ), date( 'd', $rstart ), date( 'Y', $rstart ));
+                else
+                  $tend = mktime( date( 'H', $endWdate ), date( 'i', $endWdate ), date( 's', $endWdate ), date( 'm', $rstart ), date( 'd', $rstart ), date( 'Y', $rstart ) ); // on a day-basis !!!
+                if( $endAllDayEvent && $dtendExist )
+                  $tend += ( 24 * 3600 ); // alldaysevents has an end date 'day after' meaning this day
+                $datestring = date( $endDateFormat, $tend );
+                if( isset( $end['tz'] ))
+                  $datestring .= ' '.$end['tz'];
+                $propName = ( !$dueExist ) ? 'X-CURRENT-DTEND' : 'X-CURRENT-DUE';
+                $component->setProperty( $propName, $datestring );
+              } // end if( $dtendExist || $dueExist || $durationExist )
+              $wd        = getdate( $rstart );
+              $result[$wd['year']][$wd['mon']][$wd['mday']][$compUID] = $component->copy(); // copy to output
+              $rstart    = mktime( date( 'H', $rstart ), date( 'i', $rstart ), date( 's', $rstart ), date( 'm', $rstart ), date( 'd', $rstart ) + 1, date( 'Y', $rstart ) ); // step one day
+              $rstartYMD = date( 'Ymd', $rstart );
+              $checkDate = mktime( 0, 0, 0, date( 'm', $rstart ), date( 'd', $rstart ), date( 'Y', $rstart ) ); // on a day-basis !!!
+            } // end while( $rstart <= $endWdate )
+          } // end if( !isset( $exdatelist[$checkDate] ))
+        } // end elseif( $split )   -  else use component date
+        elseif( $recurrid && !$flat && !$any && !$split )
+          $continue = TRUE;
+        else { // !$flat && !$split, i.e. no flat array and DTSTART within period
+          $checkDate = mktime( 0, 0, 0, date( 'm', $startWdate ), date( 'd', $startWdate ), date( 'Y', $startWdate ) ); // on a day-basis !!!
+// echo "going to test comp no:$cix with checkDate=$checkDate with recurridList=".implode(',',array_keys($recurridList)); // test ###
+          if(( !$any || !isset( $exdatelist[$checkDate] )) &&   // exclude any recurrence date, found in exdatelist
+              ( !isset( $recurridList[$checkDate] ) || $recurrid )) { // or in the recurridList, but not itself
+// echo " and copied to output<br>\n"; // test ###
+            $wd = getdate( $startWdate );
+            $result[$wd['year']][$wd['mon']][$wd['mday']][$compUID] = $component->copy(); // copy to output
+          }
+        }
+      } // end if(( $startWdate >= $startDate ) && ( $startWdate <= $endDate ))
+            /* if 'any' components, check components with reccurrence rules, removing all excluding dates */
+      if( TRUE === $any ) {
+            /* make a list of optional repeating dates for component occurence, rrule, rdate */
+        $recurlist = array();
+        while( FALSE !== ( $rrule = $component->getProperty( 'rrule' )))    // check rrule
+          iCalUtilityFunctions::_recur2date( $recurlist, $rrule, $start, $workstart, $workend );
+        foreach( $recurlist as $recurkey => $recurvalue )                   // key=match date as timestamp
+          $recurlist[$recurkey] = $rdurWsecs;                               // add duration in seconds
+        while( FALSE !== ( $rdate = $component->getProperty( 'rdate' ))) {  // check rdate
+          foreach( $rdate as $theRdate ) {
+            if( is_array( $theRdate ) && ( 2 == count( $theRdate )) &&      // all days within PERIOD
+                   array_key_exists( '0', $theRdate ) &&  array_key_exists( '1', $theRdate )) {
+              $rstart = iCalUtilityFunctions::_date2timestamp( $theRdate[0] );
+              if(( $rstart < ( $startDate - $rdurWsecs )) || ( $rstart > $endDate ))
+                continue;
+              if( isset( $theRdate[1]['year'] )) // date-date period
+                $rend = iCalUtilityFunctions::_date2timestamp( $theRdate[1] );
+              else {                             // date-duration period
+                $rend = iCalUtilityFunctions::_duration2date( $theRdate[0], $theRdate[1] );
+                $rend = iCalUtilityFunctions::_date2timestamp( $rend );
+              }
+              while( $rstart < $rend ) {
+                $recurlist[$rstart] = $rdurWsecs; // set start date for recurrence instance + rdate duration in seconds
+                $rstart = mktime( date( 'H', $rstart ), date( 'i', $rstart ), date( 's', $rstart ), date( 'm', $rstart ), date( 'd', $rstart ) + 1, date( 'Y', $rstart ) ); // step one day
+              }
+            } // PERIOD end
+            else { // single date
+              $theRdate = iCalUtilityFunctions::_date2timestamp( $theRdate );
+              if((( $startDate - $rdurWsecs ) <= $theRdate ) && ( $endDate >= $theRdate ))
+                $recurlist[$theRdate] = $rdurWsecs; // set start date for recurrence instance + event duration in seconds
+            }
+          }
+        }  // end - check rdate
+        foreach( $recurlist as $recurkey => $durvalue ) { // remove all recurrence START dates found in the exdatelist
+          $checkDate = mktime( 0, 0, 0, date( 'm', $recurkey ), date( 'd', $recurkey ), date( 'Y', $recurkey ) ); // on a day-basis !!!
+          if( isset( $exdatelist[$checkDate] )) // no recurring to start this day
+            unset( $recurlist[$recurkey] );
+        }
+        if( 0 < count( $recurlist )) {
+          ksort( $recurlist );
+          $xRecurrence = 1;
+          $component2  = $component->copy();
+          $compUID     = $component2->getProperty( 'UID' );
+          foreach( $recurlist as $recurkey => $durvalue ) {
+// echo "recurKey=".date( 'Y-m-d H:i:s', $recurkey ).' dur='.iCalUtilityFunctions::offsetSec2His( $durvalue )."<br>\n"; // test ###;
+            if((( $startDate - $rdurWsecs ) > $recurkey ) || ( $endDate < $recurkey )) // not within period
+              continue;
+            $checkDate = mktime( 0, 0, 0, date( 'm', $recurkey ), date( 'd', $recurkey ), date( 'Y', $recurkey ) ); // on a day-basis !!!
+            if( isset( $recurridList[$checkDate] )) // no recurring to start this day
+              continue;
+            if( isset( $exdatelist[$checkDate] ))   // check excluded dates
+              continue;
+            if( $startWdate >= $recurkey )          // exclude component start date
+              continue;
+            $rstart = $recurkey;
+            $rend   = $recurkey + $durvalue;
+           /* add repeating components within valid dates to output array, only start date set */
+            if( $flat ) {
+              if( !isset( $result[$compUID] )) // only one comp
+                $result[$compUID] = $component2->copy(); // copy to output
+            }
+           /* add repeating components within valid dates to output array, one each day */
+            elseif( $split ) {
+              $xRecurrence += 1;
+              if( $rend > $endDate )
+                $rend = $endDate;
+              $startYMD = $rstartYMD = date( 'Ymd', $rstart );
+              $endYMD   = date( 'Ymd', $rend );
+// echo "splitStart=".date( 'Y-m-d H:i:s', $rstart ).' end='.date( 'Y-m-d H:i:s', $rend )."<br>\n"; // test ###;
+              while( $rstart <= $rend ) { // iterate.. .
+                $checkDate = mktime( 0, 0, 0, date( 'm', $rstart ), date( 'd', $rstart ), date( 'Y', $rstart ) ); // on a day-basis !!!
+                if( isset( $recurridList[$checkDate] )) // no recurring to start this day
+                  break;
+                if( isset( $exdatelist[$checkDate] ))   // exclude any recurrence START date, found in exdatelist
+                  break;
+// echo "checking date after startdate=".date( 'Y-m-d H:i:s', $rstart ).' mot '.date( 'Y-m-d H:i:s', $startDate )."<br>"; // test ###;
+                if( $rstart >= $startDate ) {           // date after dtstart
+                  if( $rstartYMD > $startYMD )          // date after dtstart
+                    $datestring = date( $startDateFormat, $checkDate );
+                  else
+                    $datestring = date( $startDateFormat, $rstart );
+                  if( isset( $start['tz'] ))
+                    $datestring .= ' '.$start['tz'];
+// echo "spliting = $datestring<BR>\n"; // test ###
+                  $component2->setProperty( 'X-CURRENT-DTSTART', $datestring );
+                  if( $dtendExist || $dueExist || $durationExist ) {
+                    if( $rstartYMD < $endYMD ) // not the last day
+                      $tend = mktime( 23, 59, 59, date( 'm', $rstart ), date( 'd', $rstart ), date( 'Y', $rstart ));
+                    else
+                      $tend = mktime( date( 'H', $endWdate ), date( 'i', $endWdate ), date( 's', $endWdate ), date( 'm', $rstart ), date( 'd', $rstart ), date( 'Y', $rstart ) ); // on a day-basis !!!
+                    if( $endAllDayEvent && $dtendExist )
+                      $tend += ( 24 * 3600 );           // alldaysevents has an end date 'day after' meaning this day
+                    $datestring = date( $endDateFormat, $tend );
+                    if( isset( $end['tz'] ))
+                      $datestring .= ' '.$end['tz'];
+                    $propName = ( !$dueExist ) ? 'X-CURRENT-DTEND' : 'X-CURRENT-DUE';
+                    $component2->setProperty( $propName, $datestring );
+                  } // end if( $dtendExist || $dueExist || $durationExist )
+                  $component2->setProperty( 'X-RECURRENCE', $xRecurrence );
+                  $wd = getdate( $rstart );
+                  $result[$wd['year']][$wd['mon']][$wd['mday']][$compUID] = $component2->copy(); // copy to output
+                } // end if( $checkDate > $startYMD ) { // date after dtstart
+                $rstart = mktime( date( 'H', $rstart ), date( 'i', $rstart ), date( 's', $rstart ), date( 'm', $rstart ), date( 'd', $rstart ) + 1, date( 'Y', $rstart ) ); // step one day
+                $rstartYMD = date( 'Ymd', $rstart );
+              } // end while( $rstart <= $rend )
+            } // end elseif( $split )
+            elseif( $rstart >= $startDate ) {           // date within period   //* flat=FALSE && split=FALSE => one comp every recur startdate *//
+              $xRecurrence += 1;
+              $checkDate = mktime( 0, 0, 0, date( 'm', $rstart ), date( 'd', $rstart ), date( 'Y', $rstart ) ); // on a day-basis !!!
+              if( !isset( $exdatelist[$checkDate] )) {  // exclude any recurrence START date, found in exdatelist
+                $datestring = date( $startDateFormat, $rstart );
+                if( isset( $start['tz'] ))
+                  $datestring .= ' '.$start['tz'];
+//echo "X-CURRENT-DTSTART 2 = $datestring xRecurrence=$xRecurrence tcnt =".++$tcnt."<br>";$component2->setProperty( 'X-CNT', $tcnt ); // test ###
+                $component2->setProperty( 'X-CURRENT-DTSTART', $datestring );
+                if( $dtendExist || $dueExist || $durationExist ) {
+                  $tend = $rstart + $rdurWsecs;
+                  if( date( 'Ymd', $tend ) < date( 'Ymd', $endWdate ))
+                    $tend = mktime( 23, 59, 59, date( 'm', $tend ), date( 'd', $tend ), date( 'Y', $tend ));
+                  else
+                    $tend = mktime( date( 'H', $endWdate ), date( 'i', $endWdate ), date( 's', $endWdate ), date( 'm', $tend ), date( 'd', $tend ), date( 'Y', $tend ) ); // on a day-basis !!!
+                  if( $endAllDayEvent && $dtendExist )
+                    $tend += ( 24 * 3600 ); // alldaysevents has an end date 'day after' meaning this day
+                  $datestring = date( $endDateFormat, $tend );
+                  if( isset( $end['tz'] ))
+                    $datestring .= ' '.$end['tz'];
+                  $propName = ( !$dueExist ) ? 'X-CURRENT-DTEND' : 'X-CURRENT-DUE';
+                  $component2->setProperty( $propName, $datestring );
+                } // end if( $dtendExist || $dueExist || $durationExist )
+                $component2->setProperty( 'X-RECURRENCE', $xRecurrence );
+                $wd = getdate( $rstart );
+                $result[$wd['year']][$wd['mon']][$wd['mday']][$compUID] = $component2->copy(); // copy to output
+              } // end if( !isset( $exdatelist[$checkDate] ))
+            } // end elseif( $rstart >= $startDate )
+          } // end foreach( $recurlist as $recurkey => $durvalue )
+          unset( $component2 );
+        } // end if( 0 < count( $recurlist ))
+            /* deselect components with startdate/enddate not within period */
+        if(( $endWdate < $startDate ) || ( $startWdate > $endDate ))
+          continue;
+      } // end if( TRUE === $any )
+    } // end foreach ( $this->components as $cix => $component )
+    unset( $dtendExist, $dueExist, $durationExist, $endAllDayEvent, $recurrid, $recurridList,
+           $end, $startWdate, $endWdate, $rdurWsecs, $rdur, $exdatelist, $recurlist, $workstart, $workend, $endDateFormat ); // clean up
+    if( 0 >= count( $result )) return FALSE;
+    elseif( !$flat ) {
+      foreach( $result as $y => $yeararr ) {
+        foreach( $yeararr as $m => $montharr ) {
+          foreach( $montharr as $d => $dayarr ) {
+            if( empty( $result[$y][$m][$d] ))
+                unset( $result[$y][$m][$d] );
+            else
+              $result[$y][$m][$d] = array_values( $dayarr ); // skip tricky UID-index, hoping they are in hour order.. .
+          }
+          if( empty( $result[$y][$m] ))
+              unset( $result[$y][$m] );
+          else
+            ksort( $result[$y][$m] );
+        }
+        if( empty( $result[$y] ))
+            unset( $result[$y] );
+        else
+          ksort( $result[$y] );
+      }
+      if( empty( $result ))
+          unset( $result );
+      else
+        ksort( $result );
+    } // end elseif( !$flat )
+    if( 0 >= count( $result ))
+      return FALSE;
+    return $result;
+  }
+/**
+ * select components from calendar on based on specific property value(-s)
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.6 - 2012-12-26
+ * @param array $selectOptions, (string) key => (mixed) value, (key=propertyName)
+ * @return array
+ */
+  function selectComponents2( $selectOptions ) {
+    $output = array();
+    $allowedComps      = array('vevent', 'vtodo', 'vjournal', 'vfreebusy' );
+    $allowedProperties = array( 'ATTENDEE', 'CATEGORIES', 'CONTACT', 'LOCATION', 'ORGANIZER', 'PRIORITY', 'RELATED-TO', 'RESOURCES', 'STATUS', 'SUMMARY', 'UID', 'URL' );
+    foreach( $this->components as $cix => $component3 ) {
+      if( !in_array( $component3->objName, $allowedComps ))
+        continue;
+      $uid = $component3->getProperty( 'UID' );
+      foreach( $selectOptions as $propName => $pvalue ) {
+        $propName = strtoupper( $propName );
+        if( !in_array( $propName, $allowedProperties ))
+          continue;
+        if( !is_array( $pvalue ))
+          $pvalue = array( $pvalue );
+        if(( 'UID' == $propName ) && in_array( $uid, $pvalue )) {
+          $output[$uid][] = $component3->copy();
+          continue;
+        }
+        elseif(( 'ATTENDEE' == $propName ) || ( 'CATEGORIES' == $propName ) || ( 'CONTACT' == $propName ) || ( 'RELATED-TO' == $propName ) || ( 'RESOURCES' == $propName )) { // multiple occurrence?
+          $propValues = array();
+          $component3->_getProperties( $propName, $propValues );
+          $propValues = array_keys( $propValues );
+          foreach( $pvalue as $theValue ) {
+            if( in_array( $theValue, $propValues )) { //  && !isset( $output[$uid] )) {
+              $output[$uid][] = $component3->copy();
+              break;
+            }
+          }
+          continue;
+        } // end   elseif( // multiple occurrence?
+        elseif( FALSE === ( $d = $component3->getProperty( $propName ))) // single occurrence
+          continue;
+        if( is_array( $d )) {
+          foreach( $d as $part ) {
+            if( in_array( $part, $pvalue ) && !isset( $output[$uid] ))
+              $output[$uid][] = $component3->copy();
+          }
+        }
+        elseif(( 'SUMMARY' == $propName ) && !isset( $output[$uid] )) {
+          foreach( $pvalue as $pval ) {
+            if( FALSE !== stripos( $d, $pval )) {
+              $output[$uid][] = $component3->copy();
+              break;
+            }
+          }
+        }
+        elseif( in_array( $d, $pvalue ) && !isset( $output[$uid] ))
+          $output[$uid][] = $component3->copy();
+      } // end foreach( $selectOptions as $propName => $pvalue ) {
+    } // end foreach( $this->components as $cix => $component3 ) {
+    if( !empty( $output )) {
+      ksort( $output ); // uid order
+      $output2 = array();
+      foreach( $output as $uid => $components ) {
+        foreach( $components as $component )
+          $output2[] = $component;
+      }
+      $output = $output2;
+    }
+    return $output;
+  }
+/**
+ * add calendar component to container
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.8.8 - 2011-03-15
+ * @param object $component calendar component
+ * @param mixed $arg1 optional, ordno/component type/ component uid
+ * @param mixed $arg2 optional, ordno if arg1 = component type
+ * @return void
+ */
+  function setComponent( $component, $arg1=FALSE, $arg2=FALSE  ) {
+    $component->setConfig( $this->getConfig(), FALSE, TRUE );
+    if( !in_array( $component->objName, array( 'valarm', 'vtimezone' ))) {
+            /* make sure dtstamp and uid is set */
+      $dummy1 = $component->getProperty( 'dtstamp' );
+      $dummy2 = $component->getProperty( 'uid' );
+    }
+    if( !$arg1 ) { // plain insert, last in chain
+      $this->components[] = $component->copy();
+      return TRUE;
+    }
+    $argType = $index = null;
+    if ( ctype_digit( (string) $arg1 )) { // index insert/replace
+      $argType = 'INDEX';
+      $index   = (int) $arg1 - 1;
+    }
+    elseif( in_array( strtolower( $arg1 ), array( 'vevent', 'vtodo', 'vjournal', 'vfreebusy', 'valarm', 'vtimezone' ))) {
+      $argType = strtolower( $arg1 );
+      $index = ( ctype_digit( (string) $arg2 )) ? ((int) $arg2) - 1 : 0;
+    }
+    // else if arg1 is set, arg1 must be an UID
+    $cix1sC = 0;
+    foreach ( $this->components as $cix => $component2) {
+      if( empty( $component2 )) continue;
+      if(( 'INDEX' == $argType ) && ( $index == $cix )) { // index insert/replace
+        $this->components[$cix] = $component->copy();
+        return TRUE;
+      }
+      elseif( $argType == $component2->objName ) { // component Type index insert/replace
+        if( $index == $cix1sC ) {
+          $this->components[$cix] = $component->copy();
+          return TRUE;
+        }
+        $cix1sC++;
+      }
+      elseif( !$argType && ( $arg1 == $component2->getProperty( 'uid' ))) { // UID insert/replace
+        $this->components[$cix] = $component->copy();
+        return TRUE;
+      }
+    }
+            /* arg1=index and not found.. . insert at index .. .*/
+    if( 'INDEX' == $argType ) {
+      $this->components[$index] = $component->copy();
+      ksort( $this->components, SORT_NUMERIC );
+    }
+    else    /* not found.. . insert last in chain anyway .. .*/
+      $this->components[] = $component->copy();
+    return TRUE;
+  }
+/**
+ * sort iCal compoments
+ *
+ * ascending sort on properties (if exist) x-current-dtstart, dtstart,
+ * x-current-dtend, dtend, x-current-due, due, duration, created, dtstamp, uid if called without arguments,
+ * otherwise sorting on specific (argument) property values
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.4 - 2012-12-17
+ * @param string $sortArg, optional
+ * @return void
+ *
+ */
+  function sort( $sortArg=FALSE ) {
+    if( ! is_array( $this->components ) || ( 2 > count( $this->components )))
+      return;
+    if( $sortArg ) {
+      $sortArg = strtoupper( $sortArg );
+      if( !in_array( $sortArg, array( 'ATTENDEE', 'CATEGORIES', 'CONTACT', 'DTSTAMP', 'LOCATION', 'ORGANIZER', 'PRIORITY', 'RELATED-TO', 'RESOURCES', 'STATUS', 'SUMMARY', 'UID', 'URL' )))
+        $sortArg = FALSE;
+    }
+            /* set sort parameters for each component */
+    foreach( $this->components as $cix => & $c ) {
+      $c->srtk = array( '0', '0', '0', '0' );
+      if( 'vtimezone' == $c->objName ) {
+        if( FALSE === ( $c->srtk[0] = $c->getProperty( 'tzid' )))
+          $c->srtk[0] = 0;
+        continue;
+      }
+      elseif( $sortArg ) {
+        if(( 'ATTENDEE' == $sortArg ) || ( 'CATEGORIES' == $sortArg ) || ( 'CONTACT' == $sortArg ) || ( 'RELATED-TO' == $sortArg ) || ( 'RESOURCES' == $sortArg )) {
+          $propValues = array();
+          $c->_getProperties( $sortArg, $propValues );
+          if( !empty( $propValues )) {
+            $sk         = array_keys( $propValues );
+            $c->srtk[0] = $sk[0];
+            if( 'RELATED-TO'  == $sortArg )
+              $c->srtk[0] .= $c->getProperty( 'uid' );
+          }
+          elseif( 'RELATED-TO'  == $sortArg )
+            $c->srtk[0] = $c->getProperty( 'uid' );
+        }
+        elseif( FALSE !== ( $d = $c->getProperty( $sortArg ))) {
+          $c->srtk[0] = $d;
+          if( 'UID' == $sortArg ) {
+            if( FALSE !== ( $d = $c->getProperty( 'recurrence-id' ))) {
+              $c->srtk[1] = iCalUtilityFunctions::_date2strdate( $d );
+              if( FALSE === ( $c->srtk[2] = $c->getProperty( 'sequence' )))
+                $c->srtk[2] = PHP_INT_MAX;
+            }
+            else
+              $c->srtk[1] = $c->srtk[2] = PHP_INT_MAX;
+          }
+        }
+        continue;
+      } // end elseif( $sortArg )
+      if( FALSE !== ( $d = $c->getProperty( 'X-CURRENT-DTSTART' ))) {
+        $c->srtk[0] = iCalUtilityFunctions::_strdate2date( $d[1] );
+        unset( $c->srtk[0]['unparsedtext'] );
+      }
+      elseif( FALSE === ( $c->srtk[0] = $c->getProperty( 'dtstart' )))
+        $c->srtk[0] = 0;                                                  // sortkey 0 : dtstart
+
+      if( FALSE !== ( $d = $c->getProperty( 'X-CURRENT-DTEND' ))) {
+        $c->srtk[1] = iCalUtilityFunctions::_strdate2date( $d[1] );   // sortkey 1 : dtend/due(/duration)
+        unset( $c->srtk[1]['unparsedtext'] );
+      }
+      elseif( FALSE === ( $c->srtk[1] = $c->getProperty( 'dtend' ))) {
+        if( FALSE !== ( $d = $c->getProperty( 'X-CURRENT-DUE' ))) {
+          $c->srtk[1] = iCalUtilityFunctions::_strdate2date( $d[1] );
+          unset( $c->srtk[1]['unparsedtext'] );
+        }
+        elseif( FALSE === ( $c->srtk[1] = $c->getProperty( 'due' )))
+          if( FALSE === ( $c->srtk[1] = $c->getProperty( 'duration', FALSE, FALSE, TRUE )))
+            $c->srtk[1] = 0;
+      }
+
+      if( FALSE === ( $c->srtk[2] = $c->getProperty( 'created' )))      // sortkey 2 : created/dtstamp
+        if( FALSE === ( $c->srtk[2] = $c->getProperty( 'dtstamp' )))
+          $c->srtk[2] = 0;
+
+      if( FALSE === ( $c->srtk[3] = $c->getProperty( 'uid' )))          // sortkey 3 : uid
+        $c->srtk[3] = 0;
+    } // end foreach( $this->components as & $c
+            /* sort */
+    usort( $this->components, array( 'iCalUtilityFunctions', '_cmpfcn' ));
+  }
+/**
+ * parse iCal text/file into vcalendar, components, properties and parameters
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @param mixed $unparsedtext, optional, strict rfc2445 formatted, single property string or array of property strings
+ * @return bool FALSE if error occurs during parsing
+ *
+ */
+  function parse( $unparsedtext=FALSE ) {
+    $nl = $this->getConfig( 'nl' );
+    if(( FALSE === $unparsedtext ) || empty( $unparsedtext )) {
+            /* directory+filename is set previously via setConfig directory+filename or url */
+      if( FALSE === ( $filename = $this->getConfig( 'url' )))
+        $filename = $this->getConfig( 'dirfile' );
+            /* READ FILE */
+      if( FALSE === ( $rows = file_get_contents( $filename )))
+        return FALSE;                 /* err 1 */
+    }
+    elseif( is_array( $unparsedtext ))
+      $rows =  implode( '\n'.$nl, $unparsedtext );
+    else
+      $rows = & $unparsedtext;
+            /* fix line folding */
+    $rows = explode( $nl, iCalUtilityFunctions::convEolChar( $rows, $nl ));
+            /* skip leading (empty/invalid) lines */
+    foreach( $rows as $lix => $line ) {
+      if( FALSE !== stripos( $line, 'BEGIN:VCALENDAR' ))
+        break;
+      unset( $rows[$lix] );
+    }
+    $rcnt = count( $rows );
+    if( 3 > $rcnt )                  /* err 10 */
+      return FALSE;
+            /* skip trailing empty lines and ensure an end row */
+    $lix  = array_keys( $rows );
+    $lix  = end( $lix );
+    while( 3 < $lix ) {
+      $tst = trim( $rows[$lix] );
+      if(( '\n' == $tst ) || empty( $tst )) {
+        unset( $rows[$lix] );
+        $lix--;
+        continue;
+      }
+      if( FALSE === stripos( $rows[$lix], 'END:VCALENDAR' ))
+        $rows[] = 'END:VCALENDAR';
+      break;
+    }
+    $comp    = & $this;
+    $calsync = $compsync = 0;
+            /* identify components and update unparsed data within component */
+    $config = $this->getConfig();
+    $endtxt = array( 'END:VE', 'END:VF', 'END:VJ', 'END:VT' );
+    foreach( $rows as $lix => $line ) {
+      if(     'BEGIN:VCALENDAR' == strtoupper( substr( $line, 0, 15 ))) {
+        $calsync++;
+        continue;
+      }
+      elseif( 'END:VCALENDAR'   == strtoupper( substr( $line, 0, 13 ))) {
+        if( 0 < $compsync )
+          $this->components[] = $comp->copy();
+        $compsync--;
+        $calsync--;
+        break;
+      }
+      elseif( 1 != $calsync )
+        return FALSE;                 /* err 20 */
+      elseif( in_array( strtoupper( substr( $line, 0, 6 )), $endtxt )) {
+        $this->components[] = $comp->copy();
+        $compsync--;
+        continue;
+      }
+      if(     'BEGIN:VEVENT'    == strtoupper( substr( $line, 0, 12 ))) {
+        $comp = new vevent( $config );
+        $compsync++;
+      }
+      elseif( 'BEGIN:VFREEBUSY' == strtoupper( substr( $line, 0, 15 ))) {
+        $comp = new vfreebusy( $config );
+        $compsync++;
+      }
+      elseif( 'BEGIN:VJOURNAL'  == strtoupper( substr( $line, 0, 14 ))) {
+        $comp = new vjournal( $config );
+        $compsync++;
+      }
+      elseif( 'BEGIN:VTODO'     == strtoupper( substr( $line, 0, 11 ))) {
+        $comp = new vtodo( $config );
+        $compsync++;
+      }
+      elseif( 'BEGIN:VTIMEZONE' == strtoupper( substr( $line, 0, 15 ))) {
+        $comp = new vtimezone( $config );
+        $compsync++;
+      }
+      else { /* update component with unparsed data */
+        $comp->unparsed[] = $line;
+      }
+    } // end foreach( $rows as $line )
+    unset( $config, $endtxt );
+            /* parse data for calendar (this) object */
+    if( isset( $this->unparsed ) && is_array( $this->unparsed ) && ( 0 < count( $this->unparsed ))) {
+            /* concatenate property values spread over several lines */
+      $propnames = array( 'calscale','method','prodid','version','x-' );
+      $proprows  = array();
+      for( $i = 0; $i < count( $this->unparsed ); $i++ ) { // concatenate lines
+        $line = rtrim( $this->unparsed[$i], $nl );
+        while( isset( $this->unparsed[$i+1] ) && !empty( $this->unparsed[$i+1] ) && ( ' ' == $this->unparsed[$i+1]{0} ))
+          $line .= rtrim( substr( $this->unparsed[++$i], 1 ), $nl );
+        $proprows[] = $line;
+      }
+      $paramMStz   = array( 'utc-', 'utc+', 'gmt-', 'gmt+' );
+      $paramProto3 = array( 'fax:', 'cid:', 'sms:', 'tel:', 'urn:' );
+      $paramProto4 = array( 'crid:', 'news:', 'pres:' );
+      foreach( $proprows as $line ) {
+        if( '\n' == substr( $line, -2 ))
+          $line = substr( $line, 0, -2 );
+            /* get property name */
+        $propname  = '';
+        $cix       = 0;
+        while( FALSE !== ( $char = substr( $line, $cix, 1 ))) {
+          if( in_array( $char, array( ':', ';' )))
+            break;
+          else
+            $propname .= $char;
+          $cix++;
+        }
+            /* skip non standard property names */
+        if(( 'x-' != strtolower( substr( $propname, 0, 2 ))) && !in_array( strtolower( $propname ), $propnames ))
+          continue;
+            /* ignore version/prodid properties */
+        if( in_array( strtolower( $propname ), array( 'version', 'prodid' )))
+          continue;
+            /* rest of the line is opt.params and value */
+        $line = substr( $line, $cix);
+            /* separate attributes from value */
+        $attr         = array();
+        $attrix       = -1;
+        $strlen       = strlen( $line );
+        $WithinQuotes = FALSE;
+        $cix          = 0;
+        while( FALSE !== substr( $line, $cix, 1 )) {
+          if(                       ( ':'  == $line[$cix] )                         &&
+                                    ( substr( $line,$cix,     3 )  != '://' )       &&
+             ( !in_array( strtolower( substr( $line,$cix - 6, 4 )), $paramMStz ))   &&
+             ( !in_array( strtolower( substr( $line,$cix - 3, 4 )), $paramProto3 )) &&
+             ( !in_array( strtolower( substr( $line,$cix - 4, 5 )), $paramProto4 )) &&
+                        ( strtolower( substr( $line,$cix - 6, 7 )) != 'mailto:' )   &&
+               !$WithinQuotes ) {
+            $attrEnd = TRUE;
+            if(( $cix < ( $strlen - 4 )) &&
+                 ctype_digit( substr( $line, $cix+1, 4 ))) { // an URI with a (4pos) portnr??
+              for( $c2ix = $cix; 3 < $c2ix; $c2ix-- ) {
+                if( '://' == substr( $line, $c2ix - 2, 3 )) {
+                  $attrEnd = FALSE;
+                  break; // an URI with a portnr!!
+                }
+              }
+            }
+            if( $attrEnd) {
+              $line = substr( $line, ( $cix + 1 ));
+              break;
+            }
+          }
+          if( '"' == $line[$cix] )
+            $WithinQuotes = ( FALSE === $WithinQuotes ) ? TRUE : FALSE;
+          if( ';' == $line[$cix] )
+            $attr[++$attrix] = null;
+          else
+            $attr[$attrix] .= $line[$cix];
+          $cix++;
+        }
+            /* make attributes in array format */
+        $propattr = array();
+        foreach( $attr as $attribute ) {
+          $attrsplit = explode( '=', $attribute, 2 );
+          if( 1 < count( $attrsplit ))
+            $propattr[$attrsplit[0]] = $attrsplit[1];
+          else
+            $propattr[] = $attribute;
+        }
+            /* update Property */
+        if( FALSE !== strpos( $line, ',' )) {
+          $content  = array( 0 => '' );
+          $cix = $lix = 0;
+          while( FALSE !== substr( $line, $lix, 1 )) {
+            if(( 0 < $lix ) && ( ',' == $line[$lix] ) && ( "\\" != $line[( $lix - 1 )])) {
+              $cix++;
+              $content[$cix] = '';
+            }
+            else
+              $content[$cix] .= $line[$lix];
+            $lix++;
+          }
+          if( 1 < count( $content )) {
+            foreach( $content as $cix => $contentPart )
+              $content[$cix] = iCalUtilityFunctions::_strunrep( $contentPart );
+            $this->setProperty( $propname, $content, $propattr );
+            continue;
+          }
+          else
+            $line = reset( $content );
+          $line = iCalUtilityFunctions::_strunrep( $line );
+        }
+        $this->setProperty( $propname, rtrim( $line, "\x00..\x1F" ), $propattr );
+      } // end - foreach( $this->unparsed.. .
+    } // end - if( is_array( $this->unparsed.. .
+    unset( $unparsedtext, $rows, $this->unparsed, $proprows );
+            /* parse Components */
+    if( is_array( $this->components ) && ( 0 < count( $this->components ))) {
+      $ckeys = array_keys( $this->components );
+      foreach( $ckeys as $ckey ) {
+        if( !empty( $this->components[$ckey] ) && !empty( $this->components[$ckey]->unparsed )) {
+          $this->components[$ckey]->parse();
+        }
+      }
+    }
+    else
+      return FALSE;                   /* err 91 or something.. . */
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * creates formatted output for calendar object instance
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.10.16 - 2011-10-28
+ * @return string
+ */
+  function createCalendar() {
+    $calendarInit = $calendarxCaldecl = $calendarStart = $calendar = '';
+    switch( $this->format ) {
+      case 'xcal':
+        $calendarInit  = '<?xml version="1.0" encoding="UTF-8"?>'.$this->nl.
+                         '<!DOCTYPE vcalendar PUBLIC "-//IETF//DTD XCAL/iCalendar XML//EN"'.$this->nl.
+                         '"http://www.ietf.org/internet-drafts/draft-ietf-calsch-many-xcal-01.txt"';
+        $calendarStart = '>'.$this->nl.'<vcalendar';
+        break;
+      default:
+        $calendarStart = 'BEGIN:VCALENDAR'.$this->nl;
+        break;
+    }
+    $calendarStart .= $this->createVersion();
+    $calendarStart .= $this->createProdid();
+    $calendarStart .= $this->createCalscale();
+    $calendarStart .= $this->createMethod();
+    if( 'xcal' == $this->format )
+      $calendarStart .= '>'.$this->nl;
+    $calendar .= $this->createXprop();
+
+    foreach( $this->components as $component ) {
+      if( empty( $component )) continue;
+      $component->setConfig( $this->getConfig(), FALSE, TRUE );
+      $calendar .= $component->createComponent( $this->xcaldecl );
+    }
+    if(( 'xcal' == $this->format ) && ( 0 < count( $this->xcaldecl ))) { // xCal only
+      $calendarInit .= ' [';
+      $old_xcaldecl  = array();
+      foreach( $this->xcaldecl as $declix => $declPart ) {
+        if(( 0 < count( $old_xcaldecl))    &&
+             isset( $declPart['uri'] )     && isset( $declPart['external'] )     &&
+             isset( $old_xcaldecl['uri'] ) && isset( $old_xcaldecl['external'] ) &&
+           ( in_array( $declPart['uri'],      $old_xcaldecl['uri'] ))            &&
+           ( in_array( $declPart['external'], $old_xcaldecl['external'] )))
+          continue; // no duplicate uri and ext. references
+        if(( 0 < count( $old_xcaldecl))    &&
+            !isset( $declPart['uri'] )     && !isset( $declPart['uri'] )         &&
+             isset( $declPart['ref'] )     && isset( $old_xcaldecl['ref'] )      &&
+           ( in_array( $declPart['ref'],      $old_xcaldecl['ref'] )))
+          continue; // no duplicate element declarations
+        $calendarxCaldecl .= $this->nl.'<!';
+        foreach( $declPart as $declKey => $declValue ) {
+          switch( $declKey ) {                    // index
+            case 'xmldecl':                       // no 1
+              $calendarxCaldecl .= $declValue.' ';
+              break;
+            case 'uri':                           // no 2
+              $calendarxCaldecl .= $declValue.' ';
+              $old_xcaldecl['uri'][] = $declValue;
+              break;
+            case 'ref':                           // no 3
+              $calendarxCaldecl .= $declValue.' ';
+              $old_xcaldecl['ref'][] = $declValue;
+              break;
+            case 'external':                      // no 4
+              $calendarxCaldecl .= '"'.$declValue.'" ';
+              $old_xcaldecl['external'][] = $declValue;
+              break;
+            case 'type':                          // no 5
+              $calendarxCaldecl .= $declValue.' ';
+              break;
+            case 'type2':                         // no 6
+              $calendarxCaldecl .= $declValue;
+              break;
+          }
+        }
+        $calendarxCaldecl .= '>';
+      }
+      $calendarxCaldecl .= $this->nl.']';
+    }
+    switch( $this->format ) {
+      case 'xcal':
+        $calendar .= '</vcalendar>'.$this->nl;
+        break;
+      default:
+        $calendar .= 'END:VCALENDAR'.$this->nl;
+        break;
+    }
+    return $calendarInit.$calendarxCaldecl.$calendarStart.$calendar;
+  }
+/**
+ * a HTTP redirect header is sent with created, updated and/or parsed calendar
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.10.24 - 2011-12-23
+ * @param bool $utf8Encode
+ * @param bool $gzip
+ * @return redirect
+ */
+  function returnCalendar( $utf8Encode=FALSE, $gzip=FALSE ) {
+    $filename = $this->getConfig( 'filename' );
+    $output   = $this->createCalendar();
+    if( $utf8Encode )
+      $output = utf8_encode( $output );
+    if( $gzip ) {
+      $output = gzencode( $output, 9 );
+      header( 'Content-Encoding: gzip' );
+      header( 'Vary: *' );
+      header( 'Content-Length: '.strlen( $output ));
+    }
+    if( 'xcal' == $this->format )
+      header( 'Content-Type: application/calendar+xml; charset=utf-8' );
+    else
+      header( 'Content-Type: text/calendar; charset=utf-8' );
+    header( 'Content-Disposition: attachment; filename="'.$filename.'"' );
+    header( 'Cache-Control: max-age=10' );
+    die( $output );
+  }
+/**
+ * save content in a file
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.2.12 - 2007-12-30
+ * @param string $directory optional
+ * @param string $filename optional
+ * @param string $delimiter optional
+ * @return bool
+ */
+  function saveCalendar( $directory=FALSE, $filename=FALSE, $delimiter=FALSE ) {
+    if( $directory )
+      $this->setConfig( 'directory', $directory );
+    if( $filename )
+      $this->setConfig( 'filename',  $filename );
+    if( $delimiter && ($delimiter != DIRECTORY_SEPARATOR ))
+      $this->setConfig( 'delimiter', $delimiter );
+    if( FALSE === ( $dirfile = $this->getConfig( 'url' )))
+      $dirfile = $this->getConfig( 'dirfile' );
+    $iCalFile = @fopen( $dirfile, 'w' );
+    if( $iCalFile ) {
+      if( FALSE === fwrite( $iCalFile, $this->createCalendar() ))
+        return FALSE;
+      fclose( $iCalFile );
+      return TRUE;
+    }
+    else
+      return FALSE;
+  }
+/**
+ * if recent version of calendar file exists (default one hour), an HTTP redirect header is sent
+ * else FALSE is returned
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.2.12 - 2007-10-28
+ * @param string $directory optional alt. int timeout
+ * @param string $filename optional
+ * @param string $delimiter optional
+ * @param int timeout optional, default 3600 sec
+ * @return redirect/FALSE
+ */
+  function useCachedCalendar( $directory=FALSE, $filename=FALSE, $delimiter=FALSE, $timeout=3600) {
+    if ( $directory && ctype_digit( (string) $directory ) && !$filename ) {
+      $timeout   = (int) $directory;
+      $directory = FALSE;
+    }
+    if( $directory )
+      $this->setConfig( 'directory', $directory );
+    if( $filename )
+      $this->setConfig( 'filename',  $filename );
+    if( $delimiter && ( $delimiter != DIRECTORY_SEPARATOR ))
+      $this->setConfig( 'delimiter', $delimiter );
+    $filesize    = $this->getConfig( 'filesize' );
+    if( 0 >= $filesize )
+      return FALSE;
+    $dirfile     = $this->getConfig( 'dirfile' );
+    if( time() - filemtime( $dirfile ) < $timeout) {
+      clearstatcache();
+      $dirfile   = $this->getConfig( 'dirfile' );
+      $filename  = $this->getConfig( 'filename' );
+//    if( headers_sent( $filename, $linenum ))
+//      die( "Headers already sent in $filename on line $linenum\n" );
+      if( 'xcal' == $this->format )
+        header( 'Content-Type: application/calendar+xml; charset=utf-8' );
+      else
+        header( 'Content-Type: text/calendar; charset=utf-8' );
+      header( 'Content-Length: '.$filesize );
+      header( 'Content-Disposition: attachment; filename="'.$filename.'"' );
+      header( 'Cache-Control: max-age=10' );
+      $fp = @fopen( $dirfile, 'r' );
+      if( $fp ) {
+        fpassthru( $fp );
+        fclose( $fp );
+      }
+      die();
+    }
+    else
+      return FALSE;
+  }
+}
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ *  abstract class for calendar components
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.9.6 - 2011-05-14
+ */
+class calendarComponent {
+            //  component property variables
+  var $uid;
+  var $dtstamp;
+
+            //  component config variables
+  var $allowEmpty;
+  var $language;
+  var $nl;
+  var $unique_id;
+  var $format;
+  var $objName; // created automatically at instance creation
+  var $dtzid;   // default (local) timezone
+            //  component internal variables
+  var $componentStart1;
+  var $componentStart2;
+  var $componentEnd1;
+  var $componentEnd2;
+  var $elementStart1;
+  var $elementStart2;
+  var $elementEnd1;
+  var $elementEnd2;
+  var $intAttrDelimiter;
+  var $attributeDelimiter;
+  var $valueInit;
+            //  component xCal declaration container
+  var $xcaldecl;
+/**
+ * constructor for calendar component object
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.9.6 - 2011-05-17
+ */
+  function calendarComponent() {
+    $this->objName         = ( isset( $this->timezonetype )) ?
+                          strtolower( $this->timezonetype )  :  get_class ( $this );
+    $this->uid             = array();
+    $this->dtstamp         = array();
+
+    $this->language        = null;
+    $this->nl              = null;
+    $this->unique_id       = null;
+    $this->format          = null;
+    $this->dtzid           = null;
+    $this->allowEmpty      = TRUE;
+    $this->xcaldecl        = array();
+
+    $this->_createFormat();
+    $this->_makeDtstamp();
+  }
+/*********************************************************************************/
+/**
+ * Property Name: ACTION
+ */
+/**
+ * creates formatted output for calendar component property action
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @return string
+ */
+  function createAction() {
+    if( empty( $this->action )) return FALSE;
+    if( empty( $this->action['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'ACTION' ) : FALSE;
+    $attributes = $this->_createParams( $this->action['params'] );
+    return $this->_createElement( 'ACTION', $attributes, $this->action['value'] );
+  }
+/**
+ * set calendar component property action
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value  "AUDIO" / "DISPLAY" / "EMAIL" / "PROCEDURE"
+ * @param mixed $params
+ * @return bool
+ */
+  function setAction( $value, $params=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $this->action = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: ATTACH
+ */
+/**
+ * creates formatted output for calendar component property attach
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.11.16 - 2012-02-04
+ * @return string
+ */
+  function createAttach() {
+    if( empty( $this->attach )) return FALSE;
+    $output       = null;
+    foreach( $this->attach as $attachPart ) {
+      if( !empty( $attachPart['value'] )) {
+        $attributes = $this->_createParams( $attachPart['params'] );
+        if(( 'xcal' != $this->format ) && isset( $attachPart['params']['VALUE'] ) && ( 'BINARY' == $attachPart['params']['VALUE'] )) {
+          $attributes = str_replace( $this->intAttrDelimiter, $this->attributeDelimiter, $attributes );
+          $str        = 'ATTACH'.$attributes.$this->valueInit.$attachPart['value'];
+          $output     = substr( $str, 0, 75 ).$this->nl;
+          $str        = substr( $str, 75 );
+          $output    .= ' '.chunk_split( $str, 74, $this->nl.' ' );
+          if( ' ' == substr( $output, -1 ))
+            $output   = rtrim( $output );
+          if( $this->nl != substr( $output, ( 0 - strlen( $this->nl ))))
+            $output  .= $this->nl;
+          return $output;
+        }
+        $output    .= $this->_createElement( 'ATTACH', $attributes, $attachPart['value'] );
+      }
+      elseif( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'ATTACH' );
+    }
+    return $output;
+  }
+/**
+ * set calendar component property attach
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+  function setAttach( $value, $params=FALSE, $index=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    iCalUtilityFunctions::_setMval( $this->attach, $value, $params, FALSE, $index );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: ATTENDEE
+ */
+/**
+ * creates formatted output for calendar component property attendee
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.11.12 - 2012-01-31
+ * @return string
+ */
+  function createAttendee() {
+    if( empty( $this->attendee )) return FALSE;
+    $output = null;
+    foreach( $this->attendee as $attendeePart ) {                      // start foreach 1
+      if( empty( $attendeePart['value'] )) {
+        if( $this->getConfig( 'allowEmpty' ))
+          $output .= $this->_createElement( 'ATTENDEE' );
+        continue;
+      }
+      $attendee1 = $attendee2 = null;
+      foreach( $attendeePart as $paramlabel => $paramvalue ) {         // start foreach 2
+        if( 'value' == $paramlabel )
+          $attendee2     .= $paramvalue;
+        elseif(( 'params' == $paramlabel ) && ( is_array( $paramvalue ))) { // start elseif
+          $mParams = array( 'MEMBER', 'DELEGATED-TO', 'DELEGATED-FROM' );
+          foreach( $paramvalue as $pKey => $pValue ) {                 // fix (opt) quotes
+            if( is_array( $pValue ) || in_array( $pKey, $mParams ))
+              continue;
+            if(( FALSE !== strpos( $pValue, ':' )) ||
+               ( FALSE !== strpos( $pValue, ';' )) ||
+               ( FALSE !== strpos( $pValue, ',' )))
+              $paramvalue[$pKey] = '"'.$pValue.'"';
+          }
+        // set attenddee parameters in rfc2445 order
+          if( isset( $paramvalue['CUTYPE'] ))
+            $attendee1   .= $this->intAttrDelimiter.'CUTYPE='.$paramvalue['CUTYPE'];
+          if( isset( $paramvalue['MEMBER'] )) {
+            $attendee1   .= $this->intAttrDelimiter.'MEMBER=';
+            foreach( $paramvalue['MEMBER'] as $cix => $opv )
+              $attendee1 .= ( $cix ) ? ',"'.$opv.'"' : '"'.$opv.'"' ;
+          }
+          if( isset( $paramvalue['ROLE'] ))
+            $attendee1   .= $this->intAttrDelimiter.'ROLE='.$paramvalue['ROLE'];
+          if( isset( $paramvalue['PARTSTAT'] ))
+            $attendee1   .= $this->intAttrDelimiter.'PARTSTAT='.$paramvalue['PARTSTAT'];
+          if( isset( $paramvalue['RSVP'] ))
+            $attendee1   .= $this->intAttrDelimiter.'RSVP='.$paramvalue['RSVP'];
+          if( isset( $paramvalue['DELEGATED-TO'] )) {
+            $attendee1   .= $this->intAttrDelimiter.'DELEGATED-TO=';
+            foreach( $paramvalue['DELEGATED-TO'] as $cix => $opv )
+              $attendee1 .= ( $cix ) ? ',"'.$opv.'"' : '"'.$opv.'"' ;
+          }
+          if( isset( $paramvalue['DELEGATED-FROM'] )) {
+            $attendee1   .= $this->intAttrDelimiter.'DELEGATED-FROM=';
+            foreach( $paramvalue['DELEGATED-FROM'] as $cix => $opv )
+              $attendee1 .= ( $cix ) ? ',"'.$opv.'"' : '"'.$opv.'"' ;
+          }
+          if( isset( $paramvalue['SENT-BY'] ))
+            $attendee1   .= $this->intAttrDelimiter.'SENT-BY='.$paramvalue['SENT-BY'];
+          if( isset( $paramvalue['CN'] ))
+            $attendee1   .= $this->intAttrDelimiter.'CN='.$paramvalue['CN'];
+          if( isset( $paramvalue['DIR'] )) {
+            $delim = ( FALSE === strpos( $paramvalue['DIR'], '"' )) ? '"' : '';
+            $attendee1   .= $this->intAttrDelimiter.'DIR='.$delim.$paramvalue['DIR'].$delim;
+          }
+          if( isset( $paramvalue['LANGUAGE'] ))
+            $attendee1   .= $this->intAttrDelimiter.'LANGUAGE='.$paramvalue['LANGUAGE'];
+          $xparams = array();
+          foreach( $paramvalue as $optparamlabel => $optparamvalue ) { // start foreach 3
+            if( ctype_digit( (string) $optparamlabel )) {
+              $xparams[]  = $optparamvalue;
+              continue;
+            }
+            if( !in_array( $optparamlabel, array( 'CUTYPE', 'MEMBER', 'ROLE', 'PARTSTAT', 'RSVP', 'DELEGATED-TO', 'DELEGATED-FROM', 'SENT-BY', 'CN', 'DIR', 'LANGUAGE' )))
+              $xparams[$optparamlabel] = $optparamvalue;
+          } // end foreach 3
+          ksort( $xparams, SORT_STRING );
+          foreach( $xparams as $paramKey => $paramValue ) {
+            if( ctype_digit( (string) $paramKey ))
+              $attendee1 .= $this->intAttrDelimiter.$paramValue;
+            else
+              $attendee1 .= $this->intAttrDelimiter."$paramKey=$paramValue";
+          }      // end foreach 3
+        }        // end elseif(( 'params' == $paramlabel ) && ( is_array( $paramvalue )))
+      }          // end foreach 2
+      $output .= $this->_createElement( 'ATTENDEE', $attendee1, $attendee2 );
+    }              // end foreach 1
+    return $output;
+  }
+/**
+ * set calendar component property attach
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+  function setAttendee( $value, $params=FALSE, $index=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+          // ftp://, http://, mailto:, file://, gopher://, news:, nntp://, telnet://, wais://, prospero://  may exist.. . also in params
+    if( !empty( $value )) {
+      if( FALSE === ( $pos = strpos( substr( $value, 0, 9 ), ':' )))
+        $value = 'MAILTO:'.$value;
+      elseif( !empty( $value ))
+        $value = strtolower( substr( $value, 0, $pos )).substr( $value, $pos );
+      $value = str_replace( 'mailto:', 'MAILTO:', $value );
+    }
+    $params2 = array();
+    if( is_array($params )) {
+      $optarrays = array();
+      foreach( $params as $optparamlabel => $optparamvalue ) {
+        $optparamlabel = strtoupper( $optparamlabel );
+        switch( $optparamlabel ) {
+          case 'MEMBER':
+          case 'DELEGATED-TO':
+          case 'DELEGATED-FROM':
+            if( !is_array( $optparamvalue ))
+              $optparamvalue = array( $optparamvalue );
+            foreach( $optparamvalue as $part ) {
+              $part = trim( $part );
+              if(( '"' == substr( $part, 0, 1 )) &&
+                 ( '"' == substr( $part, -1 )))
+                $part = substr( $part, 1, ( strlen( $part ) - 2 ));
+              if( 'mailto:' != strtolower( substr( $part, 0, 7 )))
+                $part = "MAILTO:$part";
+              else
+                $part = 'MAILTO:'.substr( $part, 7 );
+              $optarrays[$optparamlabel][] = $part;
+            }
+            break;
+          default:
+            if(( '"' == substr( $optparamvalue, 0, 1 )) &&
+               ( '"' == substr( $optparamvalue, -1 )))
+              $optparamvalue = substr( $optparamvalue, 1, ( strlen( $optparamvalue ) - 2 ));
+            if( 'SENT-BY' ==  $optparamlabel ) {
+              if( 'mailto:' != strtolower( substr( $optparamvalue, 0, 7 )))
+                $optparamvalue = "MAILTO:$optparamvalue";
+              else
+                $optparamvalue = 'MAILTO:'.substr( $optparamvalue, 7 );
+            }
+            $params2[$optparamlabel] = $optparamvalue;
+            break;
+        } // end switch( $optparamlabel.. .
+      } // end foreach( $optparam.. .
+      foreach( $optarrays as $optparamlabel => $optparams )
+        $params2[$optparamlabel] = $optparams;
+    }
+        // remove defaults
+    iCalUtilityFunctions::_existRem( $params2, 'CUTYPE',   'INDIVIDUAL' );
+    iCalUtilityFunctions::_existRem( $params2, 'PARTSTAT', 'NEEDS-ACTION' );
+    iCalUtilityFunctions::_existRem( $params2, 'ROLE',     'REQ-PARTICIPANT' );
+    iCalUtilityFunctions::_existRem( $params2, 'RSVP',     'FALSE' );
+        // check language setting
+    if( isset( $params2['CN' ] )) {
+      $lang = $this->getConfig( 'language' );
+      if( !isset( $params2['LANGUAGE' ] ) && !empty( $lang ))
+        $params2['LANGUAGE' ] = $lang;
+    }
+    iCalUtilityFunctions::_setMval( $this->attendee, $value, $params2, FALSE, $index );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: CATEGORIES
+ */
+/**
+ * creates formatted output for calendar component property categories
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @return string
+ */
+  function createCategories() {
+    if( empty( $this->categories )) return FALSE;
+    $output = null;
+    foreach( $this->categories as $category ) {
+      if( empty( $category['value'] )) {
+        if ( $this->getConfig( 'allowEmpty' ))
+          $output .= $this->_createElement( 'CATEGORIES' );
+        continue;
+      }
+      $attributes = $this->_createParams( $category['params'], array( 'LANGUAGE' ));
+      if( is_array( $category['value'] )) {
+        foreach( $category['value'] as $cix => $categoryPart )
+          $category['value'][$cix] = iCalUtilityFunctions::_strrep( $categoryPart, $this->format, $this->nl );
+        $content  = implode( ',', $category['value'] );
+      }
+      else
+        $content  = iCalUtilityFunctions::_strrep( $category['value'], $this->format, $this->nl );
+      $output    .= $this->_createElement( 'CATEGORIES', $attributes, $content );
+    }
+    return $output;
+  }
+/**
+ * set calendar component property categories
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param mixed $value
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+  function setCategories( $value, $params=FALSE, $index=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    iCalUtilityFunctions::_setMval( $this->categories, $value, $params, FALSE, $index );
+    return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: CLASS
+ */
+/**
+ * creates formatted output for calendar component property class
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 0.9.7 - 2006-11-20
+ * @return string
+ */
+  function createClass() {
+    if( empty( $this->class )) return FALSE;
+    if( empty( $this->class['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'CLASS' ) : FALSE;
+    $attributes = $this->_createParams( $this->class['params'] );
+    return $this->_createElement( 'CLASS', $attributes, $this->class['value'] );
+  }
+/**
+ * set calendar component property class
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value "PUBLIC" / "PRIVATE" / "CONFIDENTIAL" / iana-token / x-name
+ * @param array $params optional
+ * @return bool
+ */
+  function setClass( $value, $params=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $this->class = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: COMMENT
+ */
+/**
+ * creates formatted output for calendar component property comment
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @return string
+ */
+  function createComment() {
+    if( empty( $this->comment )) return FALSE;
+    $output = null;
+    foreach( $this->comment as $commentPart ) {
+      if( empty( $commentPart['value'] )) {
+        if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'COMMENT' );
+        continue;
+      }
+      $attributes = $this->_createParams( $commentPart['params'], array( 'ALTREP', 'LANGUAGE' ));
+      $content    = iCalUtilityFunctions::_strrep( $commentPart['value'], $this->format, $this->nl );
+      $output    .= $this->_createElement( 'COMMENT', $attributes, $content );
+    }
+    return $output;
+  }
+/**
+ * set calendar component property comment
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+  function setComment( $value, $params=FALSE, $index=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    iCalUtilityFunctions::_setMval( $this->comment, $value, $params, FALSE, $index );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: COMPLETED
+ */
+/**
+ * creates formatted output for calendar component property completed
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @return string
+ */
+  function createCompleted( ) {
+    if( empty( $this->completed )) return FALSE;
+    if( !isset( $this->completed['value']['year'] )  &&
+        !isset( $this->completed['value']['month'] ) &&
+        !isset( $this->completed['value']['day'] )   &&
+        !isset( $this->completed['value']['hour'] )  &&
+        !isset( $this->completed['value']['min'] )   &&
+        !isset( $this->completed['value']['sec'] ))
+      if( $this->getConfig( 'allowEmpty' ))
+        return $this->_createElement( 'COMPLETED' );
+      else return FALSE;
+    $formatted  = iCalUtilityFunctions::_date2strdate( $this->completed['value'], 7 );
+    $attributes = $this->_createParams( $this->completed['params'] );
+    return $this->_createElement( 'COMPLETED', $attributes, $formatted );
+  }
+/**
+ * set calendar component property completed
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param array $params optional
+ * @return bool
+ */
+  function setCompleted( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $params=FALSE ) {
+    if( empty( $year )) {
+      if( $this->getConfig( 'allowEmpty' )) {
+        $this->completed = array( 'value' => '', 'params' => iCalUtilityFunctions::_setParams( $params ));
+        return TRUE;
+      }
+      else
+        return FALSE;
+    }
+    $this->completed = iCalUtilityFunctions::_setDate2( $year, $month, $day, $hour, $min, $sec, $params );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: CONTACT
+ */
+/**
+ * creates formatted output for calendar component property contact
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @return string
+ */
+  function createContact() {
+    if( empty( $this->contact )) return FALSE;
+    $output = null;
+    foreach( $this->contact as $contact ) {
+      if( !empty( $contact['value'] )) {
+        $attributes = $this->_createParams( $contact['params'], array( 'ALTREP', 'LANGUAGE' ));
+        $content    = iCalUtilityFunctions::_strrep( $contact['value'], $this->format, $this->nl );
+        $output    .= $this->_createElement( 'CONTACT', $attributes, $content );
+      }
+      elseif( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'CONTACT' );
+    }
+    return $output;
+  }
+/**
+ * set calendar component property contact
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+  function setContact( $value, $params=FALSE, $index=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    iCalUtilityFunctions::_setMval( $this->contact, $value, $params, FALSE, $index );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: CREATED
+ */
+/**
+ * creates formatted output for calendar component property created
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+  function createCreated() {
+    if( empty( $this->created )) return FALSE;
+    $formatted  = iCalUtilityFunctions::_date2strdate( $this->created['value'], 7 );
+    $attributes = $this->_createParams( $this->created['params'] );
+    return $this->_createElement( 'CREATED', $attributes, $formatted );
+  }
+/**
+ * set calendar component property created
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @param mixed $year optional
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param mixed $params optional
+ * @return bool
+ */
+  function setCreated( $year=FALSE, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $params=FALSE ) {
+    if( !isset( $year )) {
+      $year = date('Ymd\THis', mktime( date( 'H' ), date( 'i' ), date( 's' ) - date( 'Z'), date( 'm' ), date( 'd' ), date( 'Y' )));
+    }
+    $this->created = iCalUtilityFunctions::_setDate2( $year, $month, $day, $hour, $min, $sec, $params );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: DESCRIPTION
+ */
+/**
+ * creates formatted output for calendar component property description
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @return string
+ */
+  function createDescription() {
+    if( empty( $this->description )) return FALSE;
+    $output       = null;
+    foreach( $this->description as $description ) {
+      if( !empty( $description['value'] )) {
+        $attributes = $this->_createParams( $description['params'], array( 'ALTREP', 'LANGUAGE' ));
+        $content    = iCalUtilityFunctions::_strrep( $description['value'], $this->format, $this->nl );
+        $output    .= $this->_createElement( 'DESCRIPTION', $attributes, $content );
+      }
+      elseif( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'DESCRIPTION' );
+    }
+    return $output;
+  }
+/**
+ * set calendar component property description
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+  function setDescription( $value, $params=FALSE, $index=FALSE ) {
+    if( empty( $value )) { if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE; }
+    if( 'vjournal' != $this->objName )
+      $index = 1;
+    iCalUtilityFunctions::_setMval( $this->description, $value, $params, FALSE, $index );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: DTEND
+ */
+/**
+ * creates formatted output for calendar component property dtend
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.14.4 - 2012-09-26
+ * @return string
+ */
+  function createDtend() {
+    if( empty( $this->dtend )) return FALSE;
+    if( !isset( $this->dtend['value']['year'] )  &&
+        !isset( $this->dtend['value']['month'] ) &&
+        !isset( $this->dtend['value']['day'] )   &&
+        !isset( $this->dtend['value']['hour'] )  &&
+        !isset( $this->dtend['value']['min'] )   &&
+        !isset( $this->dtend['value']['sec'] ))
+      if( $this->getConfig( 'allowEmpty' ))
+        return $this->_createElement( 'DTEND' );
+      else return FALSE;
+    $parno      = ( isset( $this->dtend['params']['VALUE'] ) && ( 'DATE' == $this->dtend['params']['VALUE'] )) ? 3 : null;
+    $formatted  = iCalUtilityFunctions::_date2strdate( $this->dtend['value'], $parno );
+    $attributes = $this->_createParams( $this->dtend['params'] );
+    return $this->_createElement( 'DTEND', $attributes, $formatted );
+  }
+/**
+ * set calendar component property dtend
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param string $tz optional
+ * @param array params optional
+ * @return bool
+ */
+  function setDtend( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $tz=FALSE, $params=FALSE ) {
+    if( empty( $year )) {
+      if( $this->getConfig( 'allowEmpty' )) {
+        $this->dtend = array( 'value' => '', 'params' => iCalUtilityFunctions::_setParams( $params ));
+        return TRUE;
+      }
+      else
+        return FALSE;
+    }
+    $this->dtend = iCalUtilityFunctions::_setDate( $year, $month, $day, $hour, $min, $sec, $tz, $params, null, null, $this->getConfig( 'TZID' ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: DTSTAMP
+ */
+/**
+ * creates formatted output for calendar component property dtstamp
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.4 - 2008-03-07
+ * @return string
+ */
+  function createDtstamp() {
+    if( !isset( $this->dtstamp['value']['year'] )  &&
+        !isset( $this->dtstamp['value']['month'] ) &&
+        !isset( $this->dtstamp['value']['day'] )   &&
+        !isset( $this->dtstamp['value']['hour'] )  &&
+        !isset( $this->dtstamp['value']['min'] )   &&
+        !isset( $this->dtstamp['value']['sec'] ))
+      $this->_makeDtstamp();
+    $formatted  = iCalUtilityFunctions::_date2strdate( $this->dtstamp['value'], 7 );
+    $attributes = $this->_createParams( $this->dtstamp['params'] );
+    return $this->_createElement( 'DTSTAMP', $attributes, $formatted );
+  }
+/**
+ * computes datestamp for calendar component object instance dtstamp
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.14.1 - 2012-09-29
+ * @return void
+ */
+  function _makeDtstamp() {
+    $d    = date( 'Y-m-d-H-i-s', mktime( date('H'), date('i'), (date('s') - date( 'Z' )), date('m'), date('d'), date('Y')));
+    $date = explode( '-', $d );
+    $this->dtstamp['value'] = array( 'year' => $date[0], 'month' => $date[1], 'day' => $date[2], 'hour' => $date[3], 'min' => $date[4], 'sec' => $date[5], 'tz' => 'Z' );
+    $this->dtstamp['params'] = null;
+  }
+/**
+ * set calendar component property dtstamp
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param array $params optional
+ * @return TRUE
+ */
+  function setDtstamp( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $params=FALSE ) {
+    if( empty( $year ))
+      $this->_makeDtstamp();
+    else
+      $this->dtstamp = iCalUtilityFunctions::_setDate2( $year, $month, $day, $hour, $min, $sec, $params );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: DTSTART
+ */
+/**
+ * creates formatted output for calendar component property dtstart
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.14.4 - 2012-09-26
+ * @return string
+ */
+  function createDtstart() {
+    if( empty( $this->dtstart )) return FALSE;
+    if( !isset( $this->dtstart['value']['year'] )  &&
+        !isset( $this->dtstart['value']['month'] ) &&
+        !isset( $this->dtstart['value']['day'] )   &&
+        !isset( $this->dtstart['value']['hour'] )  &&
+        !isset( $this->dtstart['value']['min'] )   &&
+        !isset( $this->dtstart['value']['sec'] )) {
+      if( $this->getConfig( 'allowEmpty' ))
+        return $this->_createElement( 'DTSTART' );
+      else return FALSE;
+    }
+    if( in_array( $this->objName, array( 'vtimezone', 'standard', 'daylight' )))
+       unset( $this->dtstart['value']['tz'], $this->dtstart['params']['TZID'] );
+    $parno      = ( isset( $this->dtstart['params']['VALUE'] ) && ( 'DATE' == $this->dtstart['params']['VALUE'] )) ? 3 : null;
+    $formatted  = iCalUtilityFunctions::_date2strdate( $this->dtstart['value'], $parno );
+    $attributes = $this->_createParams( $this->dtstart['params'] );
+    return $this->_createElement( 'DTSTART', $attributes, $formatted );
+  }
+/**
+ * set calendar component property dtstart
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param string $tz optional
+ * @param array $params optional
+ * @return bool
+ */
+  function setDtstart( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $tz=FALSE, $params=FALSE ) {
+    if( empty( $year )) {
+      if( $this->getConfig( 'allowEmpty' )) {
+        $this->dtstart = array( 'value' => '', 'params' => iCalUtilityFunctions::_setParams( $params ));
+        return TRUE;
+      }
+      else
+        return FALSE;
+    }
+    $this->dtstart = iCalUtilityFunctions::_setDate( $year, $month, $day, $hour, $min, $sec, $tz, $params, 'dtstart', $this->objName, $this->getConfig( 'TZID' ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: DUE
+ */
+/**
+ * creates formatted output for calendar component property due
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.14.4 - 2012-09-26
+ * @return string
+ */
+  function createDue() {
+    if( empty( $this->due )) return FALSE;
+    if( !isset( $this->due['value']['year'] )  &&
+        !isset( $this->due['value']['month'] ) &&
+        !isset( $this->due['value']['day'] )   &&
+        !isset( $this->due['value']['hour'] )  &&
+        !isset( $this->due['value']['min'] )   &&
+        !isset( $this->due['value']['sec'] )) {
+      if( $this->getConfig( 'allowEmpty' ))
+        return $this->_createElement( 'DUE' );
+      else
+       return FALSE;
+    }
+    $parno      = ( isset( $this->due['params']['VALUE'] ) && ( 'DATE' == $this->due['params']['VALUE'] )) ? 3 : null;
+    $formatted  = iCalUtilityFunctions::_date2strdate( $this->due['value'], $parno );
+    $attributes = $this->_createParams( $this->due['params'] );
+    return $this->_createElement( 'DUE', $attributes, $formatted );
+  }
+/**
+ * set calendar component property due
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param array $params optional
+ * @return bool
+ */
+  function setDue( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $tz=FALSE, $params=FALSE ) {
+    if( empty( $year )) {
+      if( $this->getConfig( 'allowEmpty' )) {
+        $this->due = array( 'value' => '', 'params' => iCalUtilityFunctions::_setParams( $params ));
+        return TRUE;
+      }
+      else
+        return FALSE;
+    }
+    $this->due = iCalUtilityFunctions::_setDate( $year, $month, $day, $hour, $min, $sec, $tz, $params, null, null, $this->getConfig( 'TZID' ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: DURATION
+ */
+/**
+ * creates formatted output for calendar component property duration
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-05-25
+ * @return string
+ */
+  function createDuration() {
+    if( empty( $this->duration )) return FALSE;
+    if( !isset( $this->duration['value']['week'] ) &&
+        !isset( $this->duration['value']['day'] )  &&
+        !isset( $this->duration['value']['hour'] ) &&
+        !isset( $this->duration['value']['min'] )  &&
+        !isset( $this->duration['value']['sec'] ))
+      if( $this->getConfig( 'allowEmpty' ))
+        return $this->_createElement( 'DURATION' );
+      else return FALSE;
+    $attributes = $this->_createParams( $this->duration['params'] );
+    return $this->_createElement( 'DURATION', $attributes, iCalUtilityFunctions::_duration2str( $this->duration['value'] ));
+  }
+/**
+ * set calendar component property duration
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-05-25
+ * @param mixed $week
+ * @param mixed $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param array $params optional
+ * @return bool
+ */
+  function setDuration( $week, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $params=FALSE ) {
+    if( empty( $week ) && empty( $day ) && empty( $hour ) && empty( $min ) && empty( $sec )) {
+      if( $this->getConfig( 'allowEmpty' ))
+        $week = $day = null;
+      else
+        return FALSE;
+    }
+    if( is_array( $week ) && ( 1 <= count( $week )))
+      $this->duration = array( 'value' => iCalUtilityFunctions::_duration2arr( $week ), 'params' => iCalUtilityFunctions::_setParams( $day ));
+    elseif( is_string( $week ) && ( 3 <= strlen( trim( $week )))) {
+      $week = trim( $week );
+      if( in_array( substr( $week, 0, 1 ), array( '+', '-' )))
+        $week = substr( $week, 1 );
+      $this->duration = array( 'value' => iCalUtilityFunctions::_durationStr2arr( $week ), 'params' => iCalUtilityFunctions::_setParams( $day ));
+    }
+    else
+      $this->duration = array( 'value' => iCalUtilityFunctions::_duration2arr( array( 'week' => $week, 'day' => $day, 'hour' => $hour, 'min' => $min, 'sec' => $sec ))
+                             , 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: EXDATE
+ */
+/**
+ * creates formatted output for calendar component property exdate
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.5 - 2012-12-28
+ * @return string
+ */
+  function createExdate() {
+    if( empty( $this->exdate )) return FALSE;
+    $output  = null;
+    $exdates = array();
+    foreach( $this->exdate as $theExdate ) {
+      if( empty( $theExdate['value'] )) {
+        if( $this->getConfig( 'allowEmpty' ))
+          $output .= $this->_createElement( 'EXDATE' );
+        continue;
+      }
+      if( 1 < count( $theExdate['value'] ))
+        usort( $theExdate['value'], array( 'iCalUtilityFunctions', '_sortExdate1' ));
+      $exdates[] = $theExdate;
+    }
+    if( 1 < count( $exdates ))
+      usort( $exdates, array( 'iCalUtilityFunctions', '_sortExdate2' ));
+    foreach( $exdates as $theExdate ) {
+      $content = $attributes = null;
+      foreach( $theExdate['value'] as $eix => $exdatePart ) {
+        $parno = count( $exdatePart );
+        $formatted = iCalUtilityFunctions::_date2strdate( $exdatePart, $parno );
+        if( isset( $theExdate['params']['TZID'] ))
+          $formatted = str_replace( 'Z', '', $formatted);
+        if( 0 < $eix ) {
+          if( isset( $theExdate['value'][0]['tz'] )) {
+            if( ctype_digit( substr( $theExdate['value'][0]['tz'], -4 )) ||
+               ( 'Z' == $theExdate['value'][0]['tz'] )) {
+              if( 'Z' != substr( $formatted, -1 ))
+                $formatted .= 'Z';
+            }
+            else
+              $formatted = str_replace( 'Z', '', $formatted );
+          }
+          else
+            $formatted = str_replace( 'Z', '', $formatted );
+        } // end if( 0 < $eix )
+        $content .= ( 0 < $eix ) ? ','.$formatted : $formatted;
+      } // end foreach( $theExdate['value'] as $eix => $exdatePart )
+      $attributes .= $this->_createParams( $theExdate['params'] );
+      $output .= $this->_createElement( 'EXDATE', $attributes, $content );
+    } // end foreach( $exdates as $theExdate )
+    return $output;
+  }
+/**
+ * set calendar component property exdate
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param array exdates
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+  function setExdate( $exdates, $params=FALSE, $index=FALSE ) {
+    if( empty( $exdates )) {
+      if( $this->getConfig( 'allowEmpty' )) {
+        iCalUtilityFunctions::_setMval( $this->exdate, '', $params, FALSE, $index );
+        return TRUE;
+      }
+      else
+        return FALSE;
+    }
+    $input  = array( 'params' => iCalUtilityFunctions::_setParams( $params, array( 'VALUE' => 'DATE-TIME' )));
+    $toZ = ( isset( $input['params']['TZID'] ) && in_array( strtoupper( $input['params']['TZID'] ), array( 'GMT', 'UTC', 'Z' ))) ? TRUE : FALSE;
+            /* ev. check 1:st date and save ev. timezone **/
+    iCalUtilityFunctions::_chkdatecfg( reset( $exdates ), $parno, $input['params'] );
+    iCalUtilityFunctions::_existRem( $input['params'], 'VALUE', 'DATE-TIME' ); // remove default parameter
+    foreach( $exdates as $eix => $theExdate ) {
+      iCalUtilityFunctions::_strDate2arr( $theExdate );
+      if( iCalUtilityFunctions::_isArrayTimestampDate( $theExdate )) {
+        if( isset( $theExdate['tz'] ) && !iCalUtilityFunctions::_isOffset( $theExdate['tz'] )) {
+          if( isset( $input['params']['TZID'] ))
+            $theExdate['tz'] = $input['params']['TZID'];
+          else
+            $input['params']['TZID'] = $theExdate['tz'];
+        }
+        $exdatea = iCalUtilityFunctions::_timestamp2date( $theExdate, $parno );
+      }
+      elseif(  is_array( $theExdate )) {
+        $d = iCalUtilityFunctions::_chkDateArr( $theExdate, $parno );
+        if( isset( $d['tz'] ) && ( 'Z' != $d['tz'] ) && iCalUtilityFunctions::_isOffset( $d['tz'] )) {
+          $strdate = sprintf( '%04d-%02d-%02d %02d:%02d:%02d %s', $d['year'], $d['month'], $d['day'], $d['hour'], $d['min'], $d['sec'], $d['tz'] );
+          $exdatea = iCalUtilityFunctions::_strdate2date( $strdate, 7 );
+          unset( $exdatea['unparsedtext'] );
+        }
+        else
+          $exdatea = $d;
+      }
+      elseif( 8 <= strlen( trim( $theExdate ))) { // ex. 2006-08-03 10:12:18
+        $exdatea = iCalUtilityFunctions::_strdate2date( $theExdate, $parno );
+        unset( $exdatea['unparsedtext'] );
+      }
+      if( 3 == $parno )
+        unset( $exdatea['hour'], $exdatea['min'], $exdatea['sec'], $exdatea['tz'] );
+      elseif( isset( $exdatea['tz'] ))
+        $exdatea['tz'] = (string) $exdatea['tz'];
+      if(  isset( $input['params']['TZID'] ) ||
+         ( isset( $exdatea['tz'] ) && !iCalUtilityFunctions::_isOffset( $exdatea['tz'] )) ||
+         ( isset( $input['value'][0] ) && ( !isset( $input['value'][0]['tz'] ))) ||
+         ( isset( $input['value'][0]['tz'] ) && !iCalUtilityFunctions::_isOffset( $input['value'][0]['tz'] )))
+        unset( $exdatea['tz'] );
+      if( $toZ ) // time zone Z
+        $exdatea['tz'] = 'Z';
+      $input['value'][] = $exdatea;
+    }
+    if( 0 >= count( $input['value'] ))
+      return FALSE;
+    if( 3 == $parno ) {
+      $input['params']['VALUE'] = 'DATE';
+      unset( $input['params']['TZID'] );
+    }
+    if( $toZ ) // time zone Z
+      unset( $input['params']['TZID'] );
+    iCalUtilityFunctions::_setMval( $this->exdate, $input['value'], $input['params'], FALSE, $index );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: EXRULE
+ */
+/**
+ * creates formatted output for calendar component property exrule
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @return string
+ */
+  function createExrule() {
+    if( empty( $this->exrule )) return FALSE;
+    return $this->_format_recur( 'EXRULE', $this->exrule );
+  }
+/**
+ * set calendar component property exdate
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param array $exruleset
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+  function setExrule( $exruleset, $params=FALSE, $index=FALSE ) {
+    if( empty( $exruleset )) if( $this->getConfig( 'allowEmpty' )) $exruleset = ''; else return FALSE;
+    iCalUtilityFunctions::_setMval( $this->exrule, iCalUtilityFunctions::_setRexrule( $exruleset ), $params, FALSE, $index );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: FREEBUSY
+ */
+/**
+ * creates formatted output for calendar component property freebusy
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.27 - 2013-07-05
+ * @return string
+ */
+  function createFreebusy() {
+    if( empty( $this->freebusy )) return FALSE;
+    $output = null;
+    foreach( $this->freebusy as $freebusyPart ) {
+      if( empty( $freebusyPart['value'] ) || (( 1 == count( $freebusyPart['value'] )) && isset( $freebusyPart['value']['fbtype'] ))) {
+        if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'FREEBUSY' );
+        continue;
+      }
+      $attributes = $content = null;
+      if( isset( $freebusyPart['value']['fbtype'] )) {
+          $attributes .= $this->intAttrDelimiter.'FBTYPE='.$freebusyPart['value']['fbtype'];
+        unset( $freebusyPart['value']['fbtype'] );
+        $freebusyPart['value'] = array_values( $freebusyPart['value'] );
+      }
+      else
+        $attributes .= $this->intAttrDelimiter.'FBTYPE=BUSY';
+      $attributes .= $this->_createParams( $freebusyPart['params'] );
+      $fno = 1;
+      $cnt = count( $freebusyPart['value']);
+      if( 1 < $cnt )
+        usort( $freebusyPart['value'], array( 'iCalUtilityFunctions', '_sortRdate1' ));
+      foreach( $freebusyPart['value'] as $periodix => $freebusyPeriod ) {
+        $formatted   = iCalUtilityFunctions::_date2strdate( $freebusyPeriod[0] );
+        $content .= $formatted;
+        $content .= '/';
+        $cnt2 = count( $freebusyPeriod[1]);
+        if( array_key_exists( 'year', $freebusyPeriod[1] ))      // date-time
+          $cnt2 = 7;
+        elseif( array_key_exists( 'week', $freebusyPeriod[1] ))  // duration
+          $cnt2 = 5;
+        if(( 7 == $cnt2 )   &&    // period=  -> date-time
+            isset( $freebusyPeriod[1]['year'] )  &&
+            isset( $freebusyPeriod[1]['month'] ) &&
+            isset( $freebusyPeriod[1]['day'] )) {
+          $content .= iCalUtilityFunctions::_date2strdate( $freebusyPeriod[1] );
+        }
+        else {                                  // period=  -> dur-time
+          $content .= iCalUtilityFunctions::_duration2str( $freebusyPeriod[1] );
+        }
+        if( $fno < $cnt )
+          $content .= ',';
+        $fno++;
+      }
+      $output .= $this->_createElement( 'FREEBUSY', $attributes, $content );
+    }
+    return $output;
+  }
+/**
+ * set calendar component property freebusy
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $fbType
+ * @param array $fbValues
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+  function setFreebusy( $fbType, $fbValues, $params=FALSE, $index=FALSE ) {
+    if( empty( $fbValues )) {
+      if( $this->getConfig( 'allowEmpty' )) {
+        iCalUtilityFunctions::_setMval( $this->freebusy, '', $params, FALSE, $index );
+        return TRUE;
+      }
+      else
+        return FALSE;
+    }
+    $fbType = strtoupper( $fbType );
+    if(( !in_array( $fbType, array( 'FREE', 'BUSY', 'BUSY-UNAVAILABLE', 'BUSY-TENTATIVE' ))) &&
+       ( 'X-' != substr( $fbType, 0, 2 )))
+      $fbType = 'BUSY';
+    $input = array( 'fbtype' => $fbType );
+    foreach( $fbValues as $fbPeriod ) {   // periods => period
+      if( empty( $fbPeriod ))
+        continue;
+      $freebusyPeriod = array();
+      foreach( $fbPeriod as $fbMember ) { // pairs => singlepart
+        $freebusyPairMember = array();
+        if( is_array( $fbMember )) {
+          if( iCalUtilityFunctions::_isArrayDate( $fbMember )) { // date-time value
+            $freebusyPairMember       = iCalUtilityFunctions::_chkDateArr( $fbMember, 7 );
+            $freebusyPairMember['tz'] = 'Z';
+          }
+          elseif( iCalUtilityFunctions::_isArrayTimestampDate( $fbMember )) { // timestamp value
+            $freebusyPairMember       = iCalUtilityFunctions::_timestamp2date( $fbMember['timestamp'], 7 );
+            $freebusyPairMember['tz'] = 'Z';
+          }
+          else {                                         // array format duration
+            $freebusyPairMember = iCalUtilityFunctions::_duration2arr( $fbMember );
+          }
+        }
+        elseif(( 3 <= strlen( trim( $fbMember ))) &&    // string format duration
+               ( in_array( $fbMember{0}, array( 'P', '+', '-' )))) {
+          if( 'P' != $fbMember{0} )
+            $fbmember = substr( $fbMember, 1 );
+          $freebusyPairMember = iCalUtilityFunctions::_durationStr2arr( $fbMember );
+        }
+        elseif( 8 <= strlen( trim( $fbMember ))) { // text date ex. 2006-08-03 10:12:18
+          $freebusyPairMember       = iCalUtilityFunctions::_strdate2date( $fbMember, 7 );
+          unset( $freebusyPairMember['unparsedtext'] );
+          $freebusyPairMember['tz'] = 'Z';
+        }
+        $freebusyPeriod[]   = $freebusyPairMember;
+      }
+      $input[]              = $freebusyPeriod;
+    }
+    iCalUtilityFunctions::_setMval( $this->freebusy, $input, $params, FALSE, $index );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: GEO
+ */
+/**
+ * creates formatted output for calendar component property geo
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.12.6 - 2012-04-21
+ * @return string
+ */
+  function createGeo() {
+    if( empty( $this->geo )) return FALSE;
+    if( empty( $this->geo['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'GEO' ) : FALSE;
+    $attributes = $this->_createParams( $this->geo['params'] );
+    if( 0.0 < $this->geo['value']['latitude'] )
+      $sign   = '+';
+    else
+      $sign   = ( 0.0 > $this->geo['value']['latitude'] ) ? '-' : '';
+    $content  = $sign.sprintf( "%09.6f", abs( $this->geo['value']['latitude'] ));       // sprintf && lpad && float && sign !"#¤%&/(
+    $content  = rtrim( rtrim( $content, '0' ), '.' );
+    if( 0.0 < $this->geo['value']['longitude'] )
+      $sign   = '+';
+    else
+      $sign   = ( 0.0 > $this->geo['value']['longitude'] ) ? '-' : '';
+    $content .= ';'.$sign.sprintf( '%8.6f', abs( $this->geo['value']['longitude'] ));   // sprintf && lpad && float && sign !"#¤%&/(
+    $content  = rtrim( rtrim( $content, '0' ), '.' );
+    return $this->_createElement( 'GEO', $attributes, $content );
+  }
+/**
+ * set calendar component property geo
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param float $latitude
+ * @param float $longitude
+ * @param array $params optional
+ * @return bool
+ */
+  function setGeo( $latitude, $longitude, $params=FALSE ) {
+    if( isset( $latitude ) && isset( $longitude )) {
+      if( !is_array( $this->geo )) $this->geo = array();
+      $this->geo['value']['latitude']  = (float) $latitude;
+      $this->geo['value']['longitude'] = (float) $longitude;
+      $this->geo['params'] = iCalUtilityFunctions::_setParams( $params );
+    }
+    elseif( $this->getConfig( 'allowEmpty' ))
+      $this->geo = array( 'value' => '', 'params' => iCalUtilityFunctions::_setParams( $params ) );
+    else
+      return FALSE;
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: LAST-MODIFIED
+ */
+/**
+ * creates formatted output for calendar component property last-modified
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+  function createLastModified() {
+    if( empty( $this->lastmodified )) return FALSE;
+    $attributes = $this->_createParams( $this->lastmodified['params'] );
+    $formatted  = iCalUtilityFunctions::_date2strdate( $this->lastmodified['value'], 7 );
+    return $this->_createElement( 'LAST-MODIFIED', $attributes, $formatted );
+  }
+/**
+ * set calendar component property completed
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @param mixed $year optional
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param array $params optional
+ * @return boll
+ */
+  function setLastModified( $year=FALSE, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $params=FALSE ) {
+    if( empty( $year ))
+      $year = date('Ymd\THis', mktime( date( 'H' ), date( 'i' ), date( 's' ) - date( 'Z'), date( 'm' ), date( 'd' ), date( 'Y' )));
+    $this->lastmodified = iCalUtilityFunctions::_setDate2( $year, $month, $day, $hour, $min, $sec, $params );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: LOCATION
+ */
+/**
+ * creates formatted output for calendar component property location
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @return string
+ */
+  function createLocation() {
+    if( empty( $this->location )) return FALSE;
+    if( empty( $this->location['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'LOCATION' ) : FALSE;
+    $attributes = $this->_createParams( $this->location['params'], array( 'ALTREP', 'LANGUAGE' ));
+    $content    = iCalUtilityFunctions::_strrep( $this->location['value'], $this->format, $this->nl );
+    return $this->_createElement( 'LOCATION', $attributes, $content );
+  }
+/**
+ * set calendar component property location
+ '
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param array params optional
+ * @return bool
+ */
+  function setLocation( $value, $params=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $this->location = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: ORGANIZER
+ */
+/**
+ * creates formatted output for calendar component property organizer
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.6.33 - 2010-12-17
+ * @return string
+ */
+  function createOrganizer() {
+    if( empty( $this->organizer )) return FALSE;
+    if( empty( $this->organizer['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'ORGANIZER' ) : FALSE;
+    $attributes = $this->_createParams( $this->organizer['params']
+                                      , array( 'CN', 'DIR', 'SENT-BY', 'LANGUAGE' ));
+    return $this->_createElement( 'ORGANIZER', $attributes, $this->organizer['value'] );
+  }
+/**
+ * set calendar component property organizer
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param array params optional
+ * @return bool
+ */
+  function setOrganizer( $value, $params=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    if( !empty( $value )) {
+      if( FALSE === ( $pos = strpos( substr( $value, 0, 9 ), ':' )))
+        $value = 'MAILTO:'.$value;
+      elseif( !empty( $value ))
+        $value = strtolower( substr( $value, 0, $pos )).substr( $value, $pos );
+      $value = str_replace( 'mailto:', 'MAILTO:', $value );
+    }
+    $this->organizer = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    if( isset( $this->organizer['params']['SENT-BY'] )){
+      if( 'mailto:' !== strtolower( substr( $this->organizer['params']['SENT-BY'], 0, 7 )))
+        $this->organizer['params']['SENT-BY'] = 'MAILTO:'.$this->organizer['params']['SENT-BY'];
+      else
+        $this->organizer['params']['SENT-BY'] = 'MAILTO:'.substr( $this->organizer['params']['SENT-BY'], 7 );
+    }
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: PERCENT-COMPLETE
+ */
+/**
+ * creates formatted output for calendar component property percent-complete
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.9.3 - 2011-05-14
+ * @return string
+ */
+  function createPercentComplete() {
+    if( !isset($this->percentcomplete) || ( empty( $this->percentcomplete ) && !is_numeric( $this->percentcomplete ))) return FALSE;
+    if( !isset( $this->percentcomplete['value'] ) || ( empty( $this->percentcomplete['value'] ) && !is_numeric( $this->percentcomplete['value'] )))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'PERCENT-COMPLETE' ) : FALSE;
+    $attributes = $this->_createParams( $this->percentcomplete['params'] );
+    return $this->_createElement( 'PERCENT-COMPLETE', $attributes, $this->percentcomplete['value'] );
+  }
+/**
+ * set calendar component property percent-complete
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param int $value
+ * @param array $params optional
+ * @return bool
+ */
+  function setPercentComplete( $value, $params=FALSE ) {
+    if( empty( $value ) && !is_numeric( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $this->percentcomplete = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: PRIORITY
+ */
+/**
+ * creates formatted output for calendar component property priority
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.9.3 - 2011-05-14
+ * @return string
+ */
+  function createPriority() {
+    if( !isset($this->priority) || ( empty( $this->priority ) && !is_numeric( $this->priority ))) return FALSE;
+    if( !isset( $this->priority['value'] ) || ( empty( $this->priority['value'] ) && !is_numeric( $this->priority['value'] )))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'PRIORITY' ) : FALSE;
+    $attributes = $this->_createParams( $this->priority['params'] );
+    return $this->_createElement( 'PRIORITY', $attributes, $this->priority['value'] );
+  }
+/**
+ * set calendar component property priority
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param int $value
+ * @param array $params optional
+ * @return bool
+ */
+  function setPriority( $value, $params=FALSE  ) {
+    if( empty( $value ) && !is_numeric( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $this->priority = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: RDATE
+ */
+/**
+ * creates formatted output for calendar component property rdate
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.9 - 2013-01-09
+ * @return string
+ */
+  function createRdate() {
+    if( empty( $this->rdate )) return FALSE;
+    $utctime = ( in_array( $this->objName, array( 'vtimezone', 'standard', 'daylight' ))) ? TRUE : FALSE;
+    $output = null;
+    $rdates = array();
+    foreach( $this->rdate as $rpix => $theRdate ) {
+      if( empty( $theRdate['value'] )) {
+        if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'RDATE' );
+        continue;
+      }
+      if( $utctime  )
+        unset( $theRdate['params']['TZID'] );
+      if( 1 < count( $theRdate['value'] ))
+        usort( $theRdate['value'], array( 'iCalUtilityFunctions', '_sortRdate1' ));
+      $rdates[] = $theRdate;
+    }
+    if( 1 < count( $rdates ))
+      usort( $rdates, array( 'iCalUtilityFunctions', '_sortRdate2' ));
+    foreach( $rdates as $rpix => $theRdate ) {
+      $attributes = $this->_createParams( $theRdate['params'] );
+      $cnt = count( $theRdate['value'] );
+      $content = null;
+      $rno = 1;
+      foreach( $theRdate['value'] as $rix => $rdatePart ) {
+        $contentPart = null;
+        if( is_array( $rdatePart ) &&
+            isset( $theRdate['params']['VALUE'] ) && ( 'PERIOD' == $theRdate['params']['VALUE'] )) { // PERIOD
+          if( $utctime )
+            unset( $rdatePart[0]['tz'] );
+          $formatted = iCalUtilityFunctions::_date2strdate( $rdatePart[0] ); // PERIOD part 1
+          if( $utctime || !empty( $theRdate['params']['TZID'] ))
+            $formatted = str_replace( 'Z', '', $formatted);
+          $contentPart .= $formatted;
+          $contentPart .= '/';
+          $cnt2 = count( $rdatePart[1]);
+          if( array_key_exists( 'year', $rdatePart[1] )) {
+            if( array_key_exists( 'hour', $rdatePart[1] ))
+              $cnt2 = 7;                                      // date-time
+            else
+              $cnt2 = 3;                                      // date
+          }
+          elseif( array_key_exists( 'week', $rdatePart[1] ))  // duration
+            $cnt2 = 5;
+          if(( 7 == $cnt2 )   &&    // period=  -> date-time
+              isset( $rdatePart[1]['year'] )  &&
+              isset( $rdatePart[1]['month'] ) &&
+              isset( $rdatePart[1]['day'] )) {
+            if( $utctime )
+              unset( $rdatePart[1]['tz'] );
+            $formatted = iCalUtilityFunctions::_date2strdate( $rdatePart[1] ); // PERIOD part 2
+            if( $utctime || !empty( $theRdate['params']['TZID'] ))
+              $formatted = str_replace( 'Z', '', $formatted );
+           $contentPart .= $formatted;
+          }
+          else {                                  // period=  -> dur-time
+            $contentPart .= iCalUtilityFunctions::_duration2str( $rdatePart[1] );
+          }
+        } // PERIOD end
+        else { // SINGLE date start
+          if( $utctime )
+            unset( $rdatePart['tz'] );
+          $parno = ( isset( $theRdate['params']['VALUE'] ) && ( 'DATE' == isset( $theRdate['params']['VALUE'] ))) ? 3 : null;
+          $formatted = iCalUtilityFunctions::_date2strdate( $rdatePart, $parno );
+          if( $utctime || !empty( $theRdate['params']['TZID'] ))
+            $formatted = str_replace( 'Z', '', $formatted);
+          $contentPart .= $formatted;
+        }
+        $content .= $contentPart;
+        if( $rno < $cnt )
+          $content .= ',';
+        $rno++;
+      }
+      $output    .= $this->_createElement( 'RDATE', $attributes, $content );
+    }
+    return $output;
+  }
+/**
+ * set calendar component property rdate
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param array $rdates
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+  function setRdate( $rdates, $params=FALSE, $index=FALSE ) {
+    if( empty( $rdates )) {
+      if( $this->getConfig( 'allowEmpty' )) {
+        iCalUtilityFunctions::_setMval( $this->rdate, '', $params, FALSE, $index );
+        return TRUE;
+      }
+      else
+        return FALSE;
+    }
+    $input = array( 'params' => iCalUtilityFunctions::_setParams( $params, array( 'VALUE' => 'DATE-TIME' )));
+    if( in_array( $this->objName, array( 'vtimezone', 'standard', 'daylight' ))) {
+      unset( $input['params']['TZID'] );
+      $input['params']['VALUE'] = 'DATE-TIME';
+    }
+    $zArr = array( 'GMT', 'UTC', 'Z' );
+    $toZ = ( isset( $params['TZID'] ) && in_array( strtoupper( $params['TZID'] ), $zArr )) ? TRUE : FALSE;
+            /*  check if PERIOD, if not set */
+    if((!isset( $input['params']['VALUE'] ) || !in_array( $input['params']['VALUE'], array( 'DATE', 'PERIOD' ))) &&
+          isset( $rdates[0] )    && is_array( $rdates[0] ) && ( 2 == count( $rdates[0] )) &&
+          isset( $rdates[0][0] ) &&    isset( $rdates[0][1] ) && !isset( $rdates[0]['timestamp'] ) &&
+    (( is_array( $rdates[0][0] ) && ( isset( $rdates[0][0]['timestamp'] ) ||
+                                      iCalUtilityFunctions::_isArrayDate( $rdates[0][0] ))) ||
+                                    ( is_string( $rdates[0][0] ) && ( 8 <= strlen( trim( $rdates[0][0] )))))  &&
+     ( is_array( $rdates[0][1] ) || ( is_string( $rdates[0][1] ) && ( 3 <= strlen( trim( $rdates[0][1] ))))))
+      $input['params']['VALUE'] = 'PERIOD';
+            /* check 1:st date, upd. $parno (opt) and save ev. timezone **/
+    $date  = reset( $rdates );
+    if( isset( $input['params']['VALUE'] ) && ( 'PERIOD' == $input['params']['VALUE'] )) // PERIOD
+      $date  = reset( $date );
+    iCalUtilityFunctions::_chkdatecfg( $date, $parno, $input['params'] );
+    iCalUtilityFunctions::_existRem( $input['params'], 'VALUE', 'DATE-TIME' ); // remove default
+    foreach( $rdates as $rpix => $theRdate ) {
+      $inputa = null;
+      iCalUtilityFunctions::_strDate2arr( $theRdate );
+      if( is_array( $theRdate )) {
+        if( isset( $input['params']['VALUE'] ) && ( 'PERIOD' == $input['params']['VALUE'] )) { // PERIOD
+          foreach( $theRdate as $rix => $rPeriod ) {
+            iCalUtilityFunctions::_strDate2arr( $theRdate );
+            if( is_array( $rPeriod )) {
+              if( iCalUtilityFunctions::_isArrayTimestampDate( $rPeriod )) {    // timestamp
+                if( isset( $rPeriod['tz'] ) && !iCalUtilityFunctions::_isOffset( $rPeriod['tz'] )) {
+                  if( isset( $input['params']['TZID'] ))
+                    $rPeriod['tz'] = $input['params']['TZID'];
+                  else
+                    $input['params']['TZID'] = $rPeriod['tz'];
+                }
+                $inputab = iCalUtilityFunctions::_timestamp2date( $rPeriod, $parno );
+              }
+              elseif( iCalUtilityFunctions::_isArrayDate( $rPeriod )) {
+                $d = ( 3 < count ( $rPeriod )) ? iCalUtilityFunctions::_chkDateArr( $rPeriod, $parno ) : iCalUtilityFunctions::_chkDateArr( $rPeriod, 6 );
+                if( isset( $d['tz'] ) && ( 'Z' != $d['tz'] ) && iCalUtilityFunctions::_isOffset( $d['tz'] )) {
+                  $strdate = sprintf( '%04d-%02d-%02d %02d:%02d:%02d %s', $d['year'], $d['month'], $d['day'], $d['hour'], $d['min'], $d['sec'], $d['tz'] );
+                  $inputab = iCalUtilityFunctions::_strdate2date( $strdate, 7 );
+                  unset( $inputab['unparsedtext'] );
+                }
+                else
+                  $inputab = $d;
+              }
+              elseif (( 1 == count( $rPeriod )) && ( 8 <= strlen( reset( $rPeriod )))) { // text-date
+                $inputab   = iCalUtilityFunctions::_strdate2date( reset( $rPeriod ), $parno );
+                unset( $inputab['unparsedtext'] );
+              }
+              else                                               // array format duration
+                $inputab   = iCalUtilityFunctions::_duration2arr( $rPeriod );
+            }
+            elseif(( 3 <= strlen( trim( $rPeriod ))) &&          // string format duration
+                   ( in_array( $rPeriod[0], array( 'P', '+', '-' )))) {
+              if( 'P' != $rPeriod[0] )
+                $rPeriod   = substr( $rPeriod, 1 );
+              $inputab     = iCalUtilityFunctions::_durationStr2arr( $rPeriod );
+            }
+            elseif( 8 <= strlen( trim( $rPeriod ))) {            // text date ex. 2006-08-03 10:12:18
+              $inputab     = iCalUtilityFunctions::_strdate2date( $rPeriod, $parno );
+              unset( $inputab['unparsedtext'] );
+            }
+            if(( 0 == $rpix ) && ( 0 == $rix )) {
+              if( isset( $inputab['tz'] ) && in_array( strtoupper( $inputab['tz'] ), $zArr )) {
+                $inputab['tz'] = 'Z';
+                $toZ = TRUE;
+              }
+            }
+            else {
+              if( isset( $inputa[0]['tz'] ) && ( 'Z' == $inputa[0]['tz'] ) && isset( $inputab['year'] ))
+                $inputab['tz'] = 'Z';
+              else
+                unset( $inputab['tz'] );
+            }
+            if( $toZ && isset( $inputab['year'] ) )
+              $inputab['tz'] = 'Z';
+            $inputa[]      = $inputab;
+          }
+        } // PERIOD end
+        elseif ( iCalUtilityFunctions::_isArrayTimestampDate( $theRdate )) {    // timestamp
+          if( isset( $theRdate['tz'] ) && !iCalUtilityFunctions::_isOffset( $theRdate['tz'] )) {
+            if( isset( $input['params']['TZID'] ))
+              $theRdate['tz'] = $input['params']['TZID'];
+            else
+              $input['params']['TZID'] = $theRdate['tz'];
+          }
+          $inputa = iCalUtilityFunctions::_timestamp2date( $theRdate, $parno );
+        }
+        else {                                                                  // date[-time]
+          $inputa = iCalUtilityFunctions::_chkDateArr( $theRdate, $parno );
+          if( isset( $inputa['tz'] ) && ( 'Z' != $inputa['tz'] ) && iCalUtilityFunctions::_isOffset( $inputa['tz'] )) {
+            $strdate = sprintf( '%04d-%02d-%02d %02d:%02d:%02d %s', $inputa['year'], $inputa['month'], $inputa['day'], $inputa['hour'], $inputa['min'], $inputa['sec'], $inputa['tz'] );
+            $inputa  = iCalUtilityFunctions::_strdate2date( $strdate, 7 );
+            unset( $inputa['unparsedtext'] );
+          }
+        }
+      }
+      elseif( 8 <= strlen( trim( $theRdate ))) {                 // text date ex. 2006-08-03 10:12:18
+        $inputa       = iCalUtilityFunctions::_strdate2date( $theRdate, $parno );
+        unset( $inputa['unparsedtext'] );
+        if( $toZ )
+          $inputa['tz'] = 'Z';
+      }
+      if( !isset( $input['params']['VALUE'] ) || ( 'PERIOD' != $input['params']['VALUE'] )) { // no PERIOD
+        if(( 0 == $rpix ) && !$toZ )
+          $toZ = ( isset( $inputa['tz'] ) && in_array( strtoupper( $inputa['tz'] ), $zArr )) ? TRUE : FALSE;
+        if( $toZ )
+          $inputa['tz']    = 'Z';
+        if( 3 == $parno )
+          unset( $inputa['hour'], $inputa['min'], $inputa['sec'], $inputa['tz'] );
+        elseif( isset( $inputa['tz'] ))
+          $inputa['tz']    = (string) $inputa['tz'];
+        if( isset( $input['params']['TZID'] ) || ( isset( $input['value'][0] ) && ( !isset( $input['value'][0]['tz'] ))))
+          if( !$toZ )
+            unset( $inputa['tz'] );
+      }
+      $input['value'][]    = $inputa;
+    }
+    if( 3 == $parno ) {
+      $input['params']['VALUE'] = 'DATE';
+      unset( $input['params']['TZID'] );
+    }
+    if( $toZ )
+      unset( $input['params']['TZID'] );
+    iCalUtilityFunctions::_setMval( $this->rdate, $input['value'], $input['params'], FALSE, $index );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: RECURRENCE-ID
+ */
+/**
+ * creates formatted output for calendar component property recurrence-id
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.14.4 - 2012-09-26
+ * @return string
+ */
+  function createRecurrenceid() {
+    if( empty( $this->recurrenceid )) return FALSE;
+    if( empty( $this->recurrenceid['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'RECURRENCE-ID' ) : FALSE;
+    $parno      = ( isset( $this->recurrenceid['params']['VALUE'] ) && ( 'DATE' == $this->recurrenceid['params']['VALUE'] )) ? 3 : null;
+    $formatted  = iCalUtilityFunctions::_date2strdate( $this->recurrenceid['value'], $parno );
+    $attributes = $this->_createParams( $this->recurrenceid['params'] );
+    return $this->_createElement( 'RECURRENCE-ID', $attributes, $formatted );
+  }
+/**
+ * set calendar component property recurrence-id
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param array $params optional
+ * @return bool
+ */
+  function setRecurrenceid( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $tz=FALSE, $params=FALSE ) {
+    if( empty( $year )) {
+      if( $this->getConfig( 'allowEmpty' )) {
+        $this->recurrenceid = array( 'value' => '', 'params' => null );
+        return TRUE;
+      }
+      else
+        return FALSE;
+    }
+    $this->recurrenceid = iCalUtilityFunctions::_setDate( $year, $month, $day, $hour, $min, $sec, $tz, $params, null, null, $this->getConfig( 'TZID' ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: RELATED-TO
+ */
+/**
+ * creates formatted output for calendar component property related-to
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-05-25
+ * @return string
+ */
+  function createRelatedTo() {
+    if( empty( $this->relatedto )) return FALSE;
+    $output = null;
+    foreach( $this->relatedto as $relation ) {
+      if( !empty( $relation['value'] ))
+        $output .= $this->_createElement( 'RELATED-TO', $this->_createParams( $relation['params'] ), iCalUtilityFunctions::_strrep( $relation['value'], $this->format, $this->nl ));
+      elseif( $this->getConfig( 'allowEmpty' ))
+        $output .= $this->_createElement( 'RELATED-TO' );
+    }
+    return $output;
+  }
+/**
+ * set calendar component property related-to
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param float $relid
+ * @param array $params, optional
+ * @param index $index, optional
+ * @return bool
+ */
+  function setRelatedTo( $value, $params=FALSE, $index=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    iCalUtilityFunctions::_existRem( $params, 'RELTYPE', 'PARENT', TRUE ); // remove default
+    iCalUtilityFunctions::_setMval( $this->relatedto, $value, $params, FALSE, $index );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: REPEAT
+ */
+/**
+ * creates formatted output for calendar component property repeat
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.9.3 - 2011-05-14
+ * @return string
+ */
+  function createRepeat() {
+    if( !isset( $this->repeat ) || ( empty( $this->repeat ) && !is_numeric( $this->repeat ))) return FALSE;
+    if( !isset( $this->repeat['value']) || ( empty( $this->repeat['value'] ) && !is_numeric( $this->repeat['value'] )))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'REPEAT' ) : FALSE;
+    $attributes = $this->_createParams( $this->repeat['params'] );
+    return $this->_createElement( 'REPEAT', $attributes, $this->repeat['value'] );
+  }
+/**
+ * set calendar component property repeat
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param array $params optional
+ * @return void
+ */
+  function setRepeat( $value, $params=FALSE ) {
+    if( empty( $value ) && !is_numeric( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $this->repeat = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: REQUEST-STATUS
+ */
+/**
+ * creates formatted output for calendar component property request-status
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @return string
+ */
+  function createRequestStatus() {
+    if( empty( $this->requeststatus )) return FALSE;
+    $output = null;
+    foreach( $this->requeststatus as $rstat ) {
+      if( empty( $rstat['value']['statcode'] )) {
+        if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'REQUEST-STATUS' );
+        continue;
+      }
+      $attributes  = $this->_createParams( $rstat['params'], array( 'LANGUAGE' ));
+      $content     = number_format( (float) $rstat['value']['statcode'], 2, '.', '');
+      $content    .= ';'.iCalUtilityFunctions::_strrep( $rstat['value']['text'], $this->format, $this->nl );
+      if( isset( $rstat['value']['extdata'] ))
+        $content  .= ';'.iCalUtilityFunctions::_strrep( $rstat['value']['extdata'], $this->format, $this->nl );
+      $output     .= $this->_createElement( 'REQUEST-STATUS', $attributes, $content );
+    }
+    return $output;
+  }
+/**
+ * set calendar component property request-status
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param float $statcode
+ * @param string $text
+ * @param string $extdata, optional
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+  function setRequestStatus( $statcode, $text, $extdata=FALSE, $params=FALSE, $index=FALSE ) {
+    if( empty( $statcode ) || empty( $text )) if( $this->getConfig( 'allowEmpty' )) $statcode = $text = ''; else return FALSE;
+    $input              = array( 'statcode' => $statcode, 'text' => $text );
+    if( $extdata )
+      $input['extdata'] = $extdata;
+    iCalUtilityFunctions::_setMval( $this->requeststatus, $input, $params, FALSE, $index );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: RESOURCES
+ */
+/**
+ * creates formatted output for calendar component property resources
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @return string
+ */
+  function createResources() {
+    if( empty( $this->resources )) return FALSE;
+    $output = null;
+    foreach( $this->resources as $resource ) {
+      if( empty( $resource['value'] )) {
+        if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'RESOURCES' );
+        continue;
+      }
+      $attributes  = $this->_createParams( $resource['params'], array( 'ALTREP', 'LANGUAGE' ));
+      if( is_array( $resource['value'] )) {
+        foreach( $resource['value'] as $rix => $resourcePart )
+          $resource['value'][$rix] = iCalUtilityFunctions::_strrep( $resourcePart, $this->format, $this->nl );
+        $content   = implode( ',', $resource['value'] );
+      }
+      else
+        $content   = iCalUtilityFunctions::_strrep( $resource['value'], $this->format, $this->nl );
+      $output     .= $this->_createElement( 'RESOURCES', $attributes, $content );
+    }
+    return $output;
+  }
+/**
+ * set calendar component property recources
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param mixed $value
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+  function setResources( $value, $params=FALSE, $index=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    iCalUtilityFunctions::_setMval( $this->resources, $value, $params, FALSE, $index );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: RRULE
+ */
+/**
+ * creates formatted output for calendar component property rrule
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+  function createRrule() {
+    if( empty( $this->rrule )) return FALSE;
+    return $this->_format_recur( 'RRULE', $this->rrule );
+  }
+/**
+ * set calendar component property rrule
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param array $rruleset
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return void
+ */
+  function setRrule( $rruleset, $params=FALSE, $index=FALSE ) {
+    if( empty( $rruleset )) if( $this->getConfig( 'allowEmpty' )) $rruleset = ''; else return FALSE;
+    iCalUtilityFunctions::_setMval( $this->rrule, iCalUtilityFunctions::_setRexrule( $rruleset ), $params, FALSE, $index );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: SEQUENCE
+ */
+/**
+ * creates formatted output for calendar component property sequence
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.9.3 - 2011-05-14
+ * @return string
+ */
+  function createSequence() {
+    if( !isset( $this->sequence ) || ( empty( $this->sequence ) && !is_numeric( $this->sequence ))) return FALSE;
+    if(( !isset($this->sequence['value'] ) || ( empty( $this->sequence['value'] ) && !is_numeric( $this->sequence['value'] ))) &&
+       ( '0' != $this->sequence['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'SEQUENCE' ) : FALSE;
+    $attributes = $this->_createParams( $this->sequence['params'] );
+    return $this->_createElement( 'SEQUENCE', $attributes, $this->sequence['value'] );
+  }
+/**
+ * set calendar component property sequence
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.10.8 - 2011-09-19
+ * @param int $value optional
+ * @param array $params optional
+ * @return bool
+ */
+  function setSequence( $value=FALSE, $params=FALSE ) {
+    if(( empty( $value ) && !is_numeric( $value )) && ( '0' != $value ))
+      $value = ( isset( $this->sequence['value'] ) && ( -1 < $this->sequence['value'] )) ? $this->sequence['value'] + 1 : '0';
+    $this->sequence = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: STATUS
+ */
+/**
+ * creates formatted output for calendar component property status
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+  function createStatus() {
+    if( empty( $this->status )) return FALSE;
+    if( empty( $this->status['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'STATUS' ) : FALSE;
+    $attributes = $this->_createParams( $this->status['params'] );
+    return $this->_createElement( 'STATUS', $attributes, $this->status['value'] );
+  }
+/**
+ * set calendar component property status
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param array $params optional
+ * @return bool
+ */
+  function setStatus( $value, $params=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $this->status = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: SUMMARY
+ */
+/**
+ * creates formatted output for calendar component property summary
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @return string
+ */
+  function createSummary() {
+    if( empty( $this->summary )) return FALSE;
+    if( empty( $this->summary['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'SUMMARY' ) : FALSE;
+    $attributes = $this->_createParams( $this->summary['params'], array( 'ALTREP', 'LANGUAGE' ));
+    $content    = iCalUtilityFunctions::_strrep( $this->summary['value'], $this->format, $this->nl );
+    return $this->_createElement( 'SUMMARY', $attributes, $content );
+  }
+/**
+ * set calendar component property summary
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param string $params optional
+ * @return bool
+ */
+  function setSummary( $value, $params=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $this->summary = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: TRANSP
+ */
+/**
+ * creates formatted output for calendar component property transp
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+  function createTransp() {
+    if( empty( $this->transp )) return FALSE;
+    if( empty( $this->transp['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'TRANSP' ) : FALSE;
+    $attributes = $this->_createParams( $this->transp['params'] );
+    return $this->_createElement( 'TRANSP', $attributes, $this->transp['value'] );
+  }
+/**
+ * set calendar component property transp
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param string $params optional
+ * @return bool
+ */
+  function setTransp( $value, $params=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $this->transp = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: TRIGGER
+ */
+/**
+ * creates formatted output for calendar component property trigger
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.16 - 2008-10-21
+ * @return string
+ */
+  function createTrigger() {
+    if( empty( $this->trigger )) return FALSE;
+    if( empty( $this->trigger['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'TRIGGER' ) : FALSE;
+    $content = $attributes = null;
+    if( isset( $this->trigger['value']['year'] )   &&
+        isset( $this->trigger['value']['month'] )  &&
+        isset( $this->trigger['value']['day'] ))
+      $content      .= iCalUtilityFunctions::_date2strdate( $this->trigger['value'] );
+    else {
+      if( TRUE !== $this->trigger['value']['relatedStart'] )
+        $attributes .= $this->intAttrDelimiter.'RELATED=END';
+      if( $this->trigger['value']['before'] )
+        $content    .= '-';
+      $content      .= iCalUtilityFunctions::_duration2str( $this->trigger['value'] );
+    }
+    $attributes     .= $this->_createParams( $this->trigger['params'] );
+    return $this->_createElement( 'TRIGGER', $attributes, $content );
+  }
+/**
+ * set calendar component property trigger
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $week optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param bool $relatedStart optional
+ * @param bool $before optional
+ * @param array $params optional
+ * @return bool
+ */
+  function setTrigger( $year, $month=null, $day=null, $week=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $relatedStart=TRUE, $before=TRUE, $params=FALSE ) {
+    if( empty( $year ) && ( empty( $month ) || is_array( $month )) && empty( $day ) && empty( $week ) && empty( $hour ) && empty( $min ) && empty( $sec ))
+      if( $this->getConfig( 'allowEmpty' )) {
+        $this->trigger = array( 'value' => '', 'params' => iCalUtilityFunctions::_setParams( $month ) );
+        return TRUE;
+      }
+      else
+        return FALSE;
+    if( iCalUtilityFunctions::_isArrayTimestampDate( $year )) { // timestamp UTC
+      $params = iCalUtilityFunctions::_setParams( $month );
+      $date   = iCalUtilityFunctions::_timestamp2date( $year, 7 );
+      foreach( $date as $k => $v )
+        $$k = $v;
+    }
+    elseif( is_array( $year ) && ( is_array( $month ) || empty( $month ))) {
+      $params = iCalUtilityFunctions::_setParams( $month );
+      if(!(array_key_exists( 'year',  $year ) &&   // exclude date-time
+           array_key_exists( 'month', $year ) &&
+           array_key_exists( 'day',   $year ))) {  // when this must be a duration
+        if( isset( $params['RELATED'] ) && ( 'END' == strtoupper( $params['RELATED'] )))
+          $relatedStart = FALSE;
+        else
+          $relatedStart = ( array_key_exists( 'relatedStart', $year ) && ( TRUE !== $year['relatedStart'] )) ? FALSE : TRUE;
+        $before         = ( array_key_exists( 'before', $year )       && ( TRUE !== $year['before'] ))       ? FALSE : TRUE;
+      }
+      $SSYY  = ( array_key_exists( 'year',  $year )) ? $year['year']  : null;
+      $month = ( array_key_exists( 'month', $year )) ? $year['month'] : null;
+      $day   = ( array_key_exists( 'day',   $year )) ? $year['day']   : null;
+      $week  = ( array_key_exists( 'week',  $year )) ? $year['week']  : null;
+      $hour  = ( array_key_exists( 'hour',  $year )) ? $year['hour']  : 0; //null;
+      $min   = ( array_key_exists( 'min',   $year )) ? $year['min']   : 0; //null;
+      $sec   = ( array_key_exists( 'sec',   $year )) ? $year['sec']   : 0; //null;
+      $year  = $SSYY;
+    }
+    elseif(is_string( $year ) && ( is_array( $month ) || empty( $month ))) {  // duration or date in a string
+      $params = iCalUtilityFunctions::_setParams( $month );
+      if( in_array( $year{0}, array( 'P', '+', '-' ))) { // duration
+        $relatedStart = ( isset( $params['RELATED'] ) && ( 'END' == strtoupper( $params['RELATED'] ))) ? FALSE : TRUE;
+        $before       = ( '-'  == $year[0] ) ? TRUE : FALSE;
+        if(     'P'  != $year[0] )
+          $year       = substr( $year, 1 );
+        $date         = iCalUtilityFunctions::_durationStr2arr( $year);
+      }
+      else   // date
+        $date    = iCalUtilityFunctions::_strdate2date( $year, 7 );
+      unset( $year, $month, $day, $date['unparsedtext'] );
+      if( empty( $date ))
+        $sec = 0;
+      else
+        foreach( $date as $k => $v )
+          $$k = $v;
+    }
+    else // single values in function input parameters
+      $params = iCalUtilityFunctions::_setParams( $params );
+    if( !empty( $year ) && !empty( $month ) && !empty( $day )) { // date
+      $params['VALUE'] = 'DATE-TIME';
+      $hour = ( $hour ) ? $hour : 0;
+      $min  = ( $min  ) ? $min  : 0;
+      $sec  = ( $sec  ) ? $sec  : 0;
+      $this->trigger = array( 'params' => $params );
+      $this->trigger['value'] = array( 'year'  => $year
+                                     , 'month' => $month
+                                     , 'day'   => $day
+                                     , 'hour'  => $hour
+                                     , 'min'   => $min
+                                     , 'sec'   => $sec
+                                     , 'tz'    => 'Z' );
+      return TRUE;
+    }
+    elseif(( empty( $year ) && empty( $month )) &&    // duration
+           (( !empty( $week ) || ( 0 == $week )) ||
+            ( !empty( $day )  || ( 0 == $day  )) ||
+            ( !empty( $hour ) || ( 0 == $hour )) ||
+            ( !empty( $min )  || ( 0 == $min  )) ||
+            ( !empty( $sec )  || ( 0 == $sec  )))) {
+      unset( $params['RELATED'] ); // set at output creation (END only)
+      unset( $params['VALUE'] );   // 'DURATION' default
+      $this->trigger = array( 'params' => $params );
+      $this->trigger['value']  = array();
+      if( !empty( $week )) $this->trigger['value']['week'] = $week;
+      if( !empty( $day  )) $this->trigger['value']['day']  = $day;
+      if( !empty( $hour )) $this->trigger['value']['hour'] = $hour;
+      if( !empty( $min  )) $this->trigger['value']['min']  = $min;
+      if( !empty( $sec  )) $this->trigger['value']['sec']  = $sec;
+      if( empty( $this->trigger['value'] )) {
+        $this->trigger['value']['sec'] = 0;
+        $before                        = FALSE;
+      }
+      else
+        $this->trigger['value'] = iCalUtilityFunctions::_duration2arr( $this->trigger['value'] );
+      $relatedStart = ( FALSE !== $relatedStart ) ? TRUE : FALSE;
+      $before       = ( FALSE !== $before )       ? TRUE : FALSE;
+      $this->trigger['value']['relatedStart'] = $relatedStart;
+      $this->trigger['value']['before']       = $before;
+      return TRUE;
+    }
+    return FALSE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: TZID
+ */
+/**
+ * creates formatted output for calendar component property tzid
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @return string
+ */
+  function createTzid() {
+    if( empty( $this->tzid )) return FALSE;
+    if( empty( $this->tzid['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'TZID' ) : FALSE;
+    $attributes = $this->_createParams( $this->tzid['params'] );
+    return $this->_createElement( 'TZID', $attributes, iCalUtilityFunctions::_strrep( $this->tzid['value'], $this->format, $this->nl ));
+  }
+/**
+ * set calendar component property tzid
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param array $params optional
+ * @return bool
+ */
+  function setTzid( $value, $params=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $this->tzid = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * .. .
+ * Property Name: TZNAME
+ */
+/**
+ * creates formatted output for calendar component property tzname
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @return string
+ */
+  function createTzname() {
+    if( empty( $this->tzname )) return FALSE;
+    $output = null;
+    foreach( $this->tzname as $theName ) {
+      if( !empty( $theName['value'] )) {
+        $attributes = $this->_createParams( $theName['params'], array( 'LANGUAGE' ));
+        $output    .= $this->_createElement( 'TZNAME', $attributes, iCalUtilityFunctions::_strrep( $theName['value'], $this->format, $this->nl ));
+      }
+      elseif( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'TZNAME' );
+    }
+    return $output;
+  }
+/**
+ * set calendar component property tzname
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param string $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+  function setTzname( $value, $params=FALSE, $index=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    iCalUtilityFunctions::_setMval( $this->tzname, $value, $params, FALSE, $index );
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: TZOFFSETFROM
+ */
+/**
+ * creates formatted output for calendar component property tzoffsetfrom
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+  function createTzoffsetfrom() {
+    if( empty( $this->tzoffsetfrom )) return FALSE;
+    if( empty( $this->tzoffsetfrom['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'TZOFFSETFROM' ) : FALSE;
+    $attributes = $this->_createParams( $this->tzoffsetfrom['params'] );
+    return $this->_createElement( 'TZOFFSETFROM', $attributes, $this->tzoffsetfrom['value'] );
+  }
+/**
+ * set calendar component property tzoffsetfrom
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param string $params optional
+ * @return bool
+ */
+  function setTzoffsetfrom( $value, $params=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $this->tzoffsetfrom = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: TZOFFSETTO
+ */
+/**
+ * creates formatted output for calendar component property tzoffsetto
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+  function createTzoffsetto() {
+    if( empty( $this->tzoffsetto )) return FALSE;
+    if( empty( $this->tzoffsetto['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'TZOFFSETTO' ) : FALSE;
+    $attributes = $this->_createParams( $this->tzoffsetto['params'] );
+    return $this->_createElement( 'TZOFFSETTO', $attributes, $this->tzoffsetto['value'] );
+  }
+/**
+ * set calendar component property tzoffsetto
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param string $params optional
+ * @return bool
+ */
+  function setTzoffsetto( $value, $params=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $this->tzoffsetto = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: TZURL
+ */
+/**
+ * creates formatted output for calendar component property tzurl
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+  function createTzurl() {
+    if( empty( $this->tzurl )) return FALSE;
+    if( empty( $this->tzurl['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'TZURL' ) : FALSE;
+    $attributes = $this->_createParams( $this->tzurl['params'] );
+    return $this->_createElement( 'TZURL', $attributes, $this->tzurl['value'] );
+  }
+/**
+ * set calendar component property tzurl
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param string $params optional
+ * @return boll
+ */
+  function setTzurl( $value, $params=FALSE ) {
+    if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $this->tzurl = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: UID
+ */
+/**
+ * creates formatted output for calendar component property uid
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 0.9.7 - 2006-11-20
+ * @return string
+ */
+  function createUid() {
+    if( 0 >= count( $this->uid ))
+      $this->_makeuid();
+    $attributes = $this->_createParams( $this->uid['params'] );
+    return $this->_createElement( 'UID', $attributes, $this->uid['value'] );
+  }
+/**
+ * create an unique id for this calendar component object instance
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.2.7 - 2007-09-04
+ * @return void
+ */
+  function _makeUid() {
+    $date   = date('Ymd\THisT');
+    $unique = substr(microtime(), 2, 4);
+    $base   = 'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPrRsStTuUvVxXuUvVwWzZ1234567890';
+    $start  = 0;
+    $end    = strlen( $base ) - 1;
+    $length = 6;
+    $str    = null;
+    for( $p = 0; $p < $length; $p++ )
+      $unique .= $base{mt_rand( $start, $end )};
+    $this->uid = array( 'params' => null );
+    $this->uid['value']  = $date.'-'.$unique.'@'.$this->getConfig( 'unique_id' );
+  }
+/**
+ * set calendar component property uid
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value
+ * @param string $params optional
+ * @return bool
+ */
+  function setUid( $value, $params=FALSE ) {
+    if( empty( $value )) return FALSE; // no allowEmpty check here !!!!
+    $this->uid = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: URL
+ */
+/**
+ * creates formatted output for calendar component property url
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+  function createUrl() {
+    if( empty( $this->url )) return FALSE;
+    if( empty( $this->url['value'] ))
+      return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'URL' ) : FALSE;
+    $attributes = $this->_createParams( $this->url['params'] );
+    return $this->_createElement( 'URL', $attributes, $this->url['value'] );
+  }
+/**
+ * set calendar component property url
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $value
+ * @param string $params optional
+ * @return bool
+ */
+  function setUrl( $value, $params=FALSE ) {
+    if( !empty( $value )) {
+      if( !filter_var( $value, FILTER_VALIDATE_URL ) && ( 'urn' != strtolower( substr( $value, 0, 3 ))))
+        return FALSE;
+    }
+    elseif( $this->getConfig( 'allowEmpty' ))
+      $value = '';
+    else
+      return FALSE;
+    $this->url = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params ));
+    return TRUE;
+  }
+/*********************************************************************************/
+/**
+ * Property Name: x-prop
+ */
+/**
+ * creates formatted output for calendar component property x-prop
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @return string
+ */
+  function createXprop() {
+    if( empty( $this->xprop )) return FALSE;
+    $output = null;
+    foreach( $this->xprop as $label => $xpropPart ) {
+      if( !isset($xpropPart['value']) || ( empty( $xpropPart['value'] ) && !is_numeric( $xpropPart['value'] ))) {
+        if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( $label );
+        continue;
+      }
+      $attributes = $this->_createParams( $xpropPart['params'], array( 'LANGUAGE' ));
+      if( is_array( $xpropPart['value'] )) {
+        foreach( $xpropPart['value'] as $pix => $theXpart )
+          $xpropPart['value'][$pix] = iCalUtilityFunctions::_strrep( $theXpart, $this->format, $this->format );
+        $xpropPart['value']  = implode( ',', $xpropPart['value'] );
+      }
+      else
+        $xpropPart['value'] = iCalUtilityFunctions::_strrep( $xpropPart['value'], $this->format, $this->nl );
+      $output    .= $this->_createElement( $label, $attributes, $xpropPart['value'] );
+    }
+    return $output;
+  }
+/**
+ * set calendar component property x-prop
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $label
+ * @param mixed $value
+ * @param array $params optional
+ * @return bool
+ */
+  function setXprop( $label, $value, $params=FALSE ) {
+    if( empty( $label ))
+      return FALSE;
+    if( 'X-' != strtoupper( substr( $label, 0, 2 )))
+      return FALSE;
+    if( empty( $value ) && !is_numeric( $value )) if( $this->getConfig( 'allowEmpty' )) $value = ''; else return FALSE;
+    $xprop           = array( 'value' => $value );
+    $xprop['params'] = iCalUtilityFunctions::_setParams( $params );
+    if( !is_array( $this->xprop )) $this->xprop = array();
+    $this->xprop[strtoupper( $label )] = $xprop;
+    return TRUE;
+  }
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * create element format parts
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.0.6 - 2006-06-20
+ * @return string
+ */
+  function _createFormat() {
+    $objectname                   = null;
+    switch( $this->format ) {
+      case 'xcal':
+        $objectname               = ( isset( $this->timezonetype )) ?
+                                 strtolower( $this->timezonetype )  :  strtolower( $this->objName );
+        $this->componentStart1    = $this->elementStart1 = '<';
+        $this->componentStart2    = $this->elementStart2 = '>';
+        $this->componentEnd1      = $this->elementEnd1   = '</';
+        $this->componentEnd2      = $this->elementEnd2   = '>'.$this->nl;
+        $this->intAttrDelimiter   = '<!-- -->';
+        $this->attributeDelimiter = $this->nl;
+        $this->valueInit          = null;
+        break;
+      default:
+        $objectname               = ( isset( $this->timezonetype )) ?
+                                 strtoupper( $this->timezonetype )  :  strtoupper( $this->objName );
+        $this->componentStart1    = 'BEGIN:';
+        $this->componentStart2    = null;
+        $this->componentEnd1      = 'END:';
+        $this->componentEnd2      = $this->nl;
+        $this->elementStart1      = null;
+        $this->elementStart2      = null;
+        $this->elementEnd1        = null;
+        $this->elementEnd2        = $this->nl;
+        $this->intAttrDelimiter   = '<!-- -->';
+        $this->attributeDelimiter = ';';
+        $this->valueInit          = ':';
+        break;
+    }
+    return $objectname;
+  }
+/**
+ * creates formatted output for calendar component property
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @param string $label property name
+ * @param string $attributes property attributes
+ * @param string $content property content (optional)
+ * @return string
+ */
+  function _createElement( $label, $attributes=null, $content=FALSE ) {
+    switch( $this->format ) {
+      case 'xcal':
+        $label = strtolower( $label );
+        break;
+      default:
+        $label = strtoupper( $label );
+        break;
+    }
+    $output = $this->elementStart1.$label;
+    $categoriesAttrLang = null;
+    $attachInlineBinary = FALSE;
+    $attachfmttype      = null;
+    if (( 'xcal' == $this->format) && ( 'x-' == substr( $label, 0, 2 ))) {
+      $this->xcaldecl[] = array( 'xmldecl'  => 'ELEMENT'
+                               , 'ref'      => $label
+                               , 'type2'    => '(#PCDATA)' );
+    }
+    if( !empty( $attributes ))  {
+      $attributes  = trim( $attributes );
+      if ( 'xcal' == $this->format ) {
+        $attributes2 = explode( $this->intAttrDelimiter, $attributes );
+        $attributes  = null;
+        foreach( $attributes2 as $aix => $attribute ) {
+          $attrKVarr = explode( '=', $attribute );
+          if( empty( $attrKVarr[0] ))
+            continue;
+          if( !isset( $attrKVarr[1] )) {
+            $attrValue = $attrKVarr[0];
+            $attrKey   = $aix;
+          }
+          elseif( 2 == count( $attrKVarr)) {
+            $attrKey   = strtolower( $attrKVarr[0] );
+            $attrValue = $attrKVarr[1];
+          }
+          else {
+            $attrKey   = strtolower( $attrKVarr[0] );
+            unset( $attrKVarr[0] );
+            $attrValue = implode( '=', $attrKVarr );
+          }
+          if(( 'attach' == $label ) && ( in_array( $attrKey, array( 'fmttype', 'encoding', 'value' )))) {
+            $attachInlineBinary = TRUE;
+            if( 'fmttype' == $attrKey )
+              $attachfmttype = $attrKey.'='.$attrValue;
+            continue;
+          }
+          elseif(( 'categories' == $label ) && ( 'language' == $attrKey ))
+            $categoriesAttrLang = $attrKey.'='.$attrValue;
+          else {
+            $attributes .= ( empty( $attributes )) ? ' ' : $this->attributeDelimiter.' ';
+            $attributes .= ( !empty( $attrKey )) ? $attrKey.'=' : null;
+            if(( '"' == substr( $attrValue, 0, 1 )) && ( '"' == substr( $attrValue, -1 ))) {
+              $attrValue = substr( $attrValue, 1, ( strlen( $attrValue ) - 2 ));
+              $attrValue = str_replace( '"', '', $attrValue );
+            }
+            $attributes .= '"'.htmlspecialchars( $attrValue ).'"';
+          }
+        }
+      }
+      else {
+        $attributes = str_replace( $this->intAttrDelimiter, $this->attributeDelimiter, $attributes );
+      }
+    }
+    if(( 'xcal' == $this->format) &&
+       ((( 'attach' == $label ) && !$attachInlineBinary ) || ( in_array( $label, array( 'tzurl', 'url' ))))) {
+      $pos = strrpos($content, "/");
+      $docname = ( $pos !== false) ? substr( $content, (1 - strlen( $content ) + $pos )) : $content;
+      $this->xcaldecl[] = array( 'xmldecl'  => 'ENTITY'
+                               , 'uri'      => $docname
+                               , 'ref'      => 'SYSTEM'
+                               , 'external' => $content
+                               , 'type'     => 'NDATA'
+                               , 'type2'    => 'BINERY' );
+      $attributes .= ( empty( $attributes )) ? ' ' : $this->attributeDelimiter.' ';
+      $attributes .= 'uri="'.$docname.'"';
+      $content = null;
+      if( 'attach' == $label ) {
+        $attributes = str_replace( $this->attributeDelimiter, $this->intAttrDelimiter, $attributes );
+        $content = $this->nl.$this->_createElement( 'extref', $attributes, null );
+        $attributes = null;
+      }
+    }
+    elseif(( 'xcal' == $this->format) && ( 'attach' == $label ) && $attachInlineBinary ) {
+      $content = $this->nl.$this->_createElement( 'b64bin', $attachfmttype, $content ); // max one attribute
+    }
+    $output .= $attributes;
+    if( !$content && ( '0' != $content )) {
+      switch( $this->format ) {
+        case 'xcal':
+          $output .= ' /';
+          $output .= $this->elementStart2.$this->nl;
+          return $output;
+          break;
+        default:
+          $output .= $this->elementStart2.$this->valueInit;
+          return iCalUtilityFunctions::_size75( $output, $this->nl );
+          break;
+      }
+    }
+    $output .= $this->elementStart2;
+    $output .= $this->valueInit.$content;
+    switch( $this->format ) {
+      case 'xcal':
+        return $output.$this->elementEnd1.$label.$this->elementEnd2;
+        break;
+      default:
+        return iCalUtilityFunctions::_size75( $output, $this->nl );
+        break;
+    }
+  }
+/**
+ * creates formatted output for calendar component property parameters
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.10.27 - 2012-01-16
+ * @param array $params  optional
+ * @param array $ctrKeys optional
+ * @return string
+ */
+  function _createParams( $params=array(), $ctrKeys=array() ) {
+    if( !is_array( $params ) || empty( $params ))
+      $params = array();
+    $attrLANG = $attr1 = $attr2 = $lang = null;
+    $CNattrKey   = ( in_array( 'CN',       $ctrKeys )) ? TRUE : FALSE ;
+    $LANGattrKey = ( in_array( 'LANGUAGE', $ctrKeys )) ? TRUE : FALSE ;
+    $CNattrExist = $LANGattrExist = FALSE;
+    $xparams = array();
+    foreach( $params as $paramKey => $paramValue ) {
+      if(( FALSE !== strpos( $paramValue, ':' )) ||
+         ( FALSE !== strpos( $paramValue, ';' )) ||
+         ( FALSE !== strpos( $paramValue, ',' )))
+        $paramValue = '"'.$paramValue.'"';
+      if( ctype_digit( (string) $paramKey )) {
+        $xparams[]          = $paramValue;
+        continue;
+      }
+      $paramKey             = strtoupper( $paramKey );
+      if( !in_array( $paramKey, array( 'ALTREP', 'CN', 'DIR', 'ENCODING', 'FMTTYPE', 'LANGUAGE', 'RANGE', 'RELTYPE', 'SENT-BY', 'TZID', 'VALUE' )))
+        $xparams[$paramKey] = $paramValue;
+      else
+        $params[$paramKey]  = $paramValue;
+    }
+    ksort( $xparams, SORT_STRING );
+    foreach( $xparams as $paramKey => $paramValue ) {
+      if( ctype_digit( (string) $paramKey ))
+        $attr2             .= $this->intAttrDelimiter.$paramValue;
+      else
+        $attr2             .= $this->intAttrDelimiter."$paramKey=$paramValue";
+    }
+    if( isset( $params['FMTTYPE'] )  && !in_array( 'FMTTYPE', $ctrKeys )) {
+      $attr1               .= $this->intAttrDelimiter.'FMTTYPE='.$params['FMTTYPE'].$attr2;
+      $attr2                = null;
+    }
+    if( isset( $params['ENCODING'] ) && !in_array( 'ENCODING',   $ctrKeys )) {
+      if( !empty( $attr2 )) {
+        $attr1             .= $attr2;
+        $attr2              = null;
+      }
+      $attr1               .= $this->intAttrDelimiter.'ENCODING='.$params['ENCODING'];
+    }
+    if( isset( $params['VALUE'] )    && !in_array( 'VALUE',   $ctrKeys ))
+      $attr1               .= $this->intAttrDelimiter.'VALUE='.$params['VALUE'];
+    if( isset( $params['TZID'] )     && !in_array( 'TZID',    $ctrKeys )) {
+      $attr1               .= $this->intAttrDelimiter.'TZID='.$params['TZID'];
+    }
+    if( isset( $params['RANGE'] )    && !in_array( 'RANGE',   $ctrKeys ))
+      $attr1               .= $this->intAttrDelimiter.'RANGE='.$params['RANGE'];
+    if( isset( $params['RELTYPE'] )  && !in_array( 'RELTYPE', $ctrKeys ))
+      $attr1               .= $this->intAttrDelimiter.'RELTYPE='.$params['RELTYPE'];
+    if( isset( $params['CN'] )       && $CNattrKey ) {
+      $attr1                = $this->intAttrDelimiter.'CN='.$params['CN'];
+      $CNattrExist          = TRUE;
+    }
+    if( isset( $params['DIR'] )      && in_array( 'DIR',      $ctrKeys )) {
+      $delim = ( FALSE !== strpos( $params['DIR'], '"' )) ? '' : '"';
+      $attr1               .= $this->intAttrDelimiter.'DIR='.$delim.$params['DIR'].$delim;
+    }
+    if( isset( $params['SENT-BY'] )  && in_array( 'SENT-BY',  $ctrKeys ))
+      $attr1               .= $this->intAttrDelimiter.'SENT-BY='.$params['SENT-BY'];
+    if( isset( $params['ALTREP'] )   && in_array( 'ALTREP',   $ctrKeys )) {
+      $delim = ( FALSE !== strpos( $params['ALTREP'], '"' )) ? '' : '"';
+      $attr1               .= $this->intAttrDelimiter.'ALTREP='.$delim.$params['ALTREP'].$delim;
+    }
+    if( isset( $params['LANGUAGE'] ) && $LANGattrKey ) {
+      $attrLANG            .= $this->intAttrDelimiter.'LANGUAGE='.$params['LANGUAGE'];
+      $LANGattrExist        = TRUE;
+    }
+    if( !$LANGattrExist ) {
+      $lang = $this->getConfig( 'language' );
+      if(( $CNattrExist || $LANGattrKey ) && $lang )
+        $attrLANG .= $this->intAttrDelimiter.'LANGUAGE='.$lang;
+    }
+    return $attr1.$attrLANG.$attr2;
+  }
+/**
+ * creates formatted output for calendar component property data value type recur
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.25 - 2013-06-30
+ * @param array $recurlabel
+ * @param array $recurdata
+ * @return string
+ */
+  function _format_recur( $recurlabel, $recurdata ) {
+    $output = null;
+    foreach( $recurdata as $therule ) {
+      if( empty( $therule['value'] )) {
+        if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( $recurlabel );
+        continue;
+      }
+      $attributes = ( isset( $therule['params'] )) ? $this->_createParams( $therule['params'] ) : null;
+      $content1  = $content2  = null;
+      foreach( $therule['value'] as $rulelabel => $rulevalue ) {
+        switch( strtoupper( $rulelabel )) {
+          case 'FREQ': {
+            $content1 .= "FREQ=$rulevalue";
+            break;
+          }
+          case 'UNTIL': {
+            $parno     = ( isset( $rulevalue['hour'] )) ? 7 : 3;
+            $content2 .= ';UNTIL='.iCalUtilityFunctions::_date2strdate( $rulevalue, $parno );
+            break;
+          }
+          case 'COUNT':
+          case 'INTERVAL':
+          case 'WKST': {
+            $content2 .= ";$rulelabel=$rulevalue";
+            break;
+          }
+          case 'BYSECOND':
+          case 'BYMINUTE':
+          case 'BYHOUR':
+          case 'BYMONTHDAY':
+          case 'BYYEARDAY':
+          case 'BYWEEKNO':
+          case 'BYMONTH':
+          case 'BYSETPOS': {
+            $content2 .= ";$rulelabel=";
+            if( is_array( $rulevalue )) {
+              foreach( $rulevalue as $vix => $valuePart ) {
+                $content2 .= ( $vix ) ? ',' : null;
+                $content2 .= $valuePart;
+              }
+            }
+            else
+             $content2 .= $rulevalue;
+            break;
+          }
+          case 'BYDAY': {
+            $byday          = array( '' );
+            $bx             = 0;
+            foreach( $rulevalue as $bix => $bydayPart ) {
+              if( ! empty( $byday[$bx] ) && ! ctype_digit( substr( $byday[$bx], -1 ))) // new day
+                $byday[++$bx] = '';
+              if( ! is_array( $bydayPart ))   // day without order number
+                $byday[$bx] .= (string) $bydayPart;
+              else {                          // day with order number
+                foreach( $bydayPart as $bix2 => $bydayPart2 )
+                  $byday[$bx] .= (string) $bydayPart2;
+              }
+            } // end foreach( $rulevalue as $bix => $bydayPart )
+            if( 1 < count( $byday ))
+              usort( $byday, array( 'iCalUtilityFunctions', '_recurBydaySort' ));
+            $content2      .= ';BYDAY='.implode( ',', $byday );
+            break;
+          }
+          default: {
+            $content2 .= ";$rulelabel=$rulevalue";
+            break;
+          }
+        }
+      }
+      $output .= $this->_createElement( $recurlabel, $attributes, $content1.$content2 );
+    }
+    return $output;
+  }
+/**
+ * check if property not exists within component
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.5.1 - 2008-10-15
+ * @param string $propName
+ * @return bool
+ */
+  function _notExistProp( $propName ) {
+    if( empty( $propName )) return FALSE; // when deleting x-prop, an empty propName may be used=allowed
+    $propName = strtolower( $propName );
+    if(     'last-modified'    == $propName )  { if( !isset( $this->lastmodified ))    return TRUE; }
+    elseif( 'percent-complete' == $propName )  { if( !isset( $this->percentcomplete )) return TRUE; }
+    elseif( 'recurrence-id'    == $propName )  { if( !isset( $this->recurrenceid ))    return TRUE; }
+    elseif( 'related-to'       == $propName )  { if( !isset( $this->relatedto ))       return TRUE; }
+    elseif( 'request-status'   == $propName )  { if( !isset( $this->requeststatus ))   return TRUE; }
+    elseif((       'x-' != substr($propName,0,2)) && !isset( $this->$propName ))       return TRUE;
+    return FALSE;
+  }
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * get general component config variables or info about subcomponents
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.9.6 - 2011-05-14
+ * @param mixed $config
+ * @return value
+ */
+  function getConfig( $config = FALSE) {
+    if( !$config ) {
+      $return = array();
+      $return['ALLOWEMPTY']  = $this->getConfig( 'ALLOWEMPTY' );
+      $return['FORMAT']      = $this->getConfig( 'FORMAT' );
+      if( FALSE !== ( $lang  = $this->getConfig( 'LANGUAGE' )))
+        $return['LANGUAGE']  = $lang;
+      $return['NEWLINECHAR'] = $this->getConfig( 'NEWLINECHAR' );
+      $return['TZTD']        = $this->getConfig( 'TZID' );
+      $return['UNIQUE_ID']   = $this->getConfig( 'UNIQUE_ID' );
+      return $return;
+    }
+    switch( strtoupper( $config )) {
+      case 'ALLOWEMPTY':
+        return $this->allowEmpty;
+        break;
+      case 'COMPSINFO':
+        unset( $this->compix );
+        $info = array();
+        if( isset( $this->components )) {
+          foreach( $this->components as $cix => $component ) {
+            if( empty( $component )) continue;
+            $info[$cix]['ordno'] = $cix + 1;
+            $info[$cix]['type']  = $component->objName;
+            $info[$cix]['uid']   = $component->getProperty( 'uid' );
+            $info[$cix]['props'] = $component->getConfig( 'propinfo' );
+            $info[$cix]['sub']   = $component->getConfig( 'compsinfo' );
+          }
+        }
+        return $info;
+        break;
+      case 'FORMAT':
+        return $this->format;
+        break;
+      case 'LANGUAGE':
+         // get language for calendar component as defined in [RFC 1766]
+        return $this->language;
+        break;
+      case 'NL':
+      case 'NEWLINECHAR':
+        return $this->nl;
+        break;
+      case 'PROPINFO':
+        $output = array();
+        if( !in_array( $this->objName, array( 'valarm', 'vtimezone', 'standard', 'daylight' ))) {
+          if( empty( $this->uid['value'] ))   $this->_makeuid();
+                                              $output['UID']              = 1;
+          if( empty( $this->dtstamp ))        $this->_makeDtstamp();
+                                              $output['DTSTAMP']          = 1;
+        }
+        if( !empty( $this->summary ))         $output['SUMMARY']          = 1;
+        if( !empty( $this->description ))     $output['DESCRIPTION']      = count( $this->description );
+        if( !empty( $this->dtstart ))         $output['DTSTART']          = 1;
+        if( !empty( $this->dtend ))           $output['DTEND']            = 1;
+        if( !empty( $this->due ))             $output['DUE']              = 1;
+        if( !empty( $this->duration ))        $output['DURATION']         = 1;
+        if( !empty( $this->rrule ))           $output['RRULE']            = count( $this->rrule );
+        if( !empty( $this->rdate ))           $output['RDATE']            = count( $this->rdate );
+        if( !empty( $this->exdate ))          $output['EXDATE']           = count( $this->exdate );
+        if( !empty( $this->exrule ))          $output['EXRULE']           = count( $this->exrule );
+        if( !empty( $this->action ))          $output['ACTION']           = 1;
+        if( !empty( $this->attach ))          $output['ATTACH']           = count( $this->attach );
+        if( !empty( $this->attendee ))        $output['ATTENDEE']         = count( $this->attendee );
+        if( !empty( $this->categories ))      $output['CATEGORIES']       = count( $this->categories );
+        if( !empty( $this->class ))           $output['CLASS']            = 1;
+        if( !empty( $this->comment ))         $output['COMMENT']          = count( $this->comment );
+        if( !empty( $this->completed ))       $output['COMPLETED']        = 1;
+        if( !empty( $this->contact ))         $output['CONTACT']          = count( $this->contact );
+        if( !empty( $this->created ))         $output['CREATED']          = 1;
+        if( !empty( $this->freebusy ))        $output['FREEBUSY']         = count( $this->freebusy );
+        if( !empty( $this->geo ))             $output['GEO']              = 1;
+        if( !empty( $this->lastmodified ))    $output['LAST-MODIFIED']    = 1;
+        if( !empty( $this->location ))        $output['LOCATION']         = 1;
+        if( !empty( $this->organizer ))       $output['ORGANIZER']        = 1;
+        if( !empty( $this->percentcomplete )) $output['PERCENT-COMPLETE'] = 1;
+        if( !empty( $this->priority ))        $output['PRIORITY']         = 1;
+        if( !empty( $this->recurrenceid ))    $output['RECURRENCE-ID']    = 1;
+        if( !empty( $this->relatedto ))       $output['RELATED-TO']       = count( $this->relatedto );
+        if( !empty( $this->repeat ))          $output['REPEAT']           = 1;
+        if( !empty( $this->requeststatus ))   $output['REQUEST-STATUS']   = count( $this->requeststatus );
+        if( !empty( $this->resources ))       $output['RESOURCES']        = count( $this->resources );
+        if( !empty( $this->sequence ))        $output['SEQUENCE']         = 1;
+        if( !empty( $this->sequence ))        $output['SEQUENCE']         = 1;
+        if( !empty( $this->status ))          $output['STATUS']           = 1;
+        if( !empty( $this->transp ))          $output['TRANSP']           = 1;
+        if( !empty( $this->trigger ))         $output['TRIGGER']          = 1;
+        if( !empty( $this->tzid ))            $output['TZID']             = 1;
+        if( !empty( $this->tzname ))          $output['TZNAME']           = count( $this->tzname );
+        if( !empty( $this->tzoffsetfrom ))    $output['TZOFFSETFROM']     = 1;
+        if( !empty( $this->tzoffsetto ))      $output['TZOFFSETTO']       = 1;
+        if( !empty( $this->tzurl ))           $output['TZURL']            = 1;
+        if( !empty( $this->url ))             $output['URL']              = 1;
+        if( !empty( $this->xprop ))           $output['X-PROP']           = count( $this->xprop );
+        return $output;
+        break;
+      case 'SETPROPERTYNAMES':
+        return array_keys( $this->getConfig( 'propinfo' ));
+        break;
+      case 'TZID':
+        return $this->dtzid;
+        break;
+      case 'UNIQUE_ID':
+        if( empty( $this->unique_id ))
+          $this->unique_id  = ( isset( $_SERVER['SERVER_NAME'] )) ? gethostbyname( $_SERVER['SERVER_NAME'] ) : 'localhost';
+        return $this->unique_id;
+        break;
+    }
+  }
+/**
+ * general component config setting
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.10.18 - 2011-10-28
+ * @param mixed  $config
+ * @param string $value
+ * @param bool   $softUpdate
+ * @return void
+ */
+  function setConfig( $config, $value = FALSE, $softUpdate = FALSE ) {
+    if( is_array( $config )) {
+      $ak = array_keys( $config );
+      foreach( $ak as $k ) {
+        if( 'NEWLINECHAR' == strtoupper( $k )) {
+          if( FALSE === $this->setConfig( 'NEWLINECHAR', $config[$k] ))
+            return FALSE;
+          unset( $config[$k] );
+          break;
+        }
+      }
+      foreach( $config as $cKey => $cValue ) {
+        if( FALSE === $this->setConfig( $cKey, $cValue, $softUpdate ))
+          return FALSE;
+      }
+      return TRUE;
+    }
+    $res = FALSE;
+    switch( strtoupper( $config )) {
+      case 'ALLOWEMPTY':
+        $this->allowEmpty = $value;
+        $subcfg = array( 'ALLOWEMPTY' => $value );
+        $res    = TRUE;
+        break;
+      case 'FORMAT':
+        $value  = trim( strtolower( $value ));
+        $this->format = $value;
+        $this->_createFormat();
+        $subcfg = array( 'FORMAT' => $value );
+        $res    = TRUE;
+        break;
+      case 'LANGUAGE':
+         // set language for calendar component as defined in [RFC 1766]
+        $value  = trim( $value );
+        if( empty( $this->language ) || !$softUpdate )
+          $this->language = $value;
+        $subcfg = array( 'LANGUAGE' => $value );
+        $res    = TRUE;
+        break;
+      case 'NL':
+      case 'NEWLINECHAR':
+        $this->nl = $value;
+        $this->_createFormat();
+        $subcfg = array( 'NL' => $value );
+        $res    = TRUE;
+        break;
+      case 'TZID':
+        $this->dtzid = $value;
+        $subcfg = array( 'TZID' => $value );
+        $res    = TRUE;
+        break;
+      case 'UNIQUE_ID':
+        $value  = trim( $value );
+        $this->unique_id = $value;
+        $subcfg = array( 'UNIQUE_ID' => $value );
+        $res    = TRUE;
+        break;
+      default:  // any unvalid config key.. .
+        return TRUE;
+    }
+    if( !$res ) return FALSE;
+    if( isset( $subcfg ) && !empty( $this->components )) {
+      foreach( $subcfg as $cfgkey => $cfgvalue ) {
+        foreach( $this->components as $cix => $component ) {
+          $res = $component->setConfig( $cfgkey, $cfgvalue, $softUpdate );
+          if( !$res )
+            break 2;
+          $this->components[$cix] = $component->copy(); // PHP4 compliant
+        }
+      }
+    }
+    return $res;
+  }
+/*********************************************************************************/
+/**
+ * delete component property value
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.8.8 - 2011-03-15
+ * @param mixed $propName, bool FALSE => X-property
+ * @param int   $propix, optional, if specific property is wanted in case of multiply occurences
+ * @return bool, if successfull delete TRUE
+ */
+  function deleteProperty( $propName=FALSE, $propix=FALSE ) {
+    if( $this->_notExistProp( $propName )) return FALSE;
+    $propName = strtoupper( $propName );
+    if( in_array( $propName, array( 'ATTACH',   'ATTENDEE', 'CATEGORIES', 'COMMENT',   'CONTACT', 'DESCRIPTION',    'EXDATE', 'EXRULE',
+                                    'FREEBUSY', 'RDATE',    'RELATED-TO', 'RESOURCES', 'RRULE',   'REQUEST-STATUS', 'TZNAME', 'X-PROP'  ))) {
+      if( !$propix )
+        $propix = ( isset( $this->propdelix[$propName] ) && ( 'X-PROP' != $propName )) ? $this->propdelix[$propName] + 2 : 1;
+      $this->propdelix[$propName] = --$propix;
+    }
+    $return = FALSE;
+    switch( $propName ) {
+      case 'ACTION':
+        if( !empty( $this->action )) {
+          $this->action = '';
+          $return = TRUE;
+        }
+        break;
+      case 'ATTACH':
+        return $this->deletePropertyM( $this->attach, $this->propdelix[$propName] );
+        break;
+      case 'ATTENDEE':
+        return $this->deletePropertyM( $this->attendee, $this->propdelix[$propName] );
+        break;
+      case 'CATEGORIES':
+        return $this->deletePropertyM( $this->categories, $this->propdelix[$propName] );
+        break;
+      case 'CLASS':
+        if( !empty( $this->class )) {
+          $this->class = '';
+          $return = TRUE;
+        }
+        break;
+      case 'COMMENT':
+        return $this->deletePropertyM( $this->comment, $this->propdelix[$propName] );
+        break;
+      case 'COMPLETED':
+        if( !empty( $this->completed )) {
+          $this->completed = '';
+          $return = TRUE;
+        }
+        break;
+      case 'CONTACT':
+        return $this->deletePropertyM( $this->contact, $this->propdelix[$propName] );
+        break;
+      case 'CREATED':
+        if( !empty( $this->created )) {
+          $this->created = '';
+          $return = TRUE;
+        }
+        break;
+      case 'DESCRIPTION':
+        return $this->deletePropertyM( $this->description, $this->propdelix[$propName] );
+        break;
+      case 'DTEND':
+        if( !empty( $this->dtend )) {
+          $this->dtend = '';
+          $return = TRUE;
+        }
+        break;
+      case 'DTSTAMP':
+        if( in_array( $this->objName, array( 'valarm', 'vtimezone', 'standard', 'daylight' )))
+          return FALSE;
+        if( !empty( $this->dtstamp )) {
+          $this->dtstamp = '';
+          $return = TRUE;
+        }
+        break;
+      case 'DTSTART':
+        if( !empty( $this->dtstart )) {
+          $this->dtstart = '';
+          $return = TRUE;
+        }
+        break;
+      case 'DUE':
+        if( !empty( $this->due )) {
+          $this->due = '';
+          $return = TRUE;
+        }
+        break;
+      case 'DURATION':
+        if( !empty( $this->duration )) {
+          $this->duration = '';
+          $return = TRUE;
+        }
+        break;
+      case 'EXDATE':
+        return $this->deletePropertyM( $this->exdate, $this->propdelix[$propName] );
+        break;
+      case 'EXRULE':
+        return $this->deletePropertyM( $this->exrule, $this->propdelix[$propName] );
+        break;
+      case 'FREEBUSY':
+        return $this->deletePropertyM( $this->freebusy, $this->propdelix[$propName] );
+        break;
+      case 'GEO':
+        if( !empty( $this->geo )) {
+          $this->geo = '';
+          $return = TRUE;
+        }
+        break;
+      case 'LAST-MODIFIED':
+        if( !empty( $this->lastmodified )) {
+          $this->lastmodified = '';
+          $return = TRUE;
+        }
+        break;
+      case 'LOCATION':
+        if( !empty( $this->location )) {
+          $this->location = '';
+          $return = TRUE;
+        }
+        break;
+      case 'ORGANIZER':
+        if( !empty( $this->organizer )) {
+          $this->organizer = '';
+          $return = TRUE;
+        }
+        break;
+      case 'PERCENT-COMPLETE':
+        if( !empty( $this->percentcomplete )) {
+          $this->percentcomplete = '';
+          $return = TRUE;
+        }
+        break;
+      case 'PRIORITY':
+        if( !empty( $this->priority )) {
+          $this->priority = '';
+          $return = TRUE;
+        }
+        break;
+      case 'RDATE':
+        return $this->deletePropertyM( $this->rdate, $this->propdelix[$propName] );
+        break;
+      case 'RECURRENCE-ID':
+        if( !empty( $this->recurrenceid )) {
+          $this->recurrenceid = '';
+          $return = TRUE;
+        }
+        break;
+      case 'RELATED-TO':
+        return $this->deletePropertyM( $this->relatedto, $this->propdelix[$propName] );
+        break;
+      case 'REPEAT':
+        if( !empty( $this->repeat )) {
+          $this->repeat = '';
+          $return = TRUE;
+        }
+        break;
+      case 'REQUEST-STATUS':
+        return $this->deletePropertyM( $this->requeststatus, $this->propdelix[$propName] );
+        break;
+      case 'RESOURCES':
+        return $this->deletePropertyM( $this->resources, $this->propdelix[$propName] );
+        break;
+      case 'RRULE':
+        return $this->deletePropertyM( $this->rrule, $this->propdelix[$propName] );
+        break;
+      case 'SEQUENCE':
+        if( !empty( $this->sequence )) {
+          $this->sequence = '';
+          $return = TRUE;
+        }
+        break;
+      case 'STATUS':
+        if( !empty( $this->status )) {
+          $this->status = '';
+          $return = TRUE;
+        }
+        break;
+      case 'SUMMARY':
+        if( !empty( $this->summary )) {
+          $this->summary = '';
+          $return = TRUE;
+        }
+        break;
+      case 'TRANSP':
+        if( !empty( $this->transp )) {
+          $this->transp = '';
+          $return = TRUE;
+        }
+        break;
+      case 'TRIGGER':
+        if( !empty( $this->trigger )) {
+          $this->trigger = '';
+          $return = TRUE;
+        }
+        break;
+      case 'TZID':
+        if( !empty( $this->tzid )) {
+          $this->tzid = '';
+          $return = TRUE;
+        }
+        break;
+      case 'TZNAME':
+        return $this->deletePropertyM( $this->tzname, $this->propdelix[$propName] );
+        break;
+      case 'TZOFFSETFROM':
+        if( !empty( $this->tzoffsetfrom )) {
+          $this->tzoffsetfrom = '';
+          $return = TRUE;
+        }
+        break;
+      case 'TZOFFSETTO':
+        if( !empty( $this->tzoffsetto )) {
+          $this->tzoffsetto = '';
+          $return = TRUE;
+        }
+        break;
+      case 'TZURL':
+        if( !empty( $this->tzurl )) {
+          $this->tzurl = '';
+          $return = TRUE;
+        }
+        break;
+      case 'UID':
+        if( in_array( $this->objName, array( 'valarm', 'vtimezone', 'standard', 'daylight' )))
+          return FALSE;
+        if( !empty( $this->uid )) {
+          $this->uid = '';
+          $return = TRUE;
+        }
+        break;
+      case 'URL':
+        if( !empty( $this->url )) {
+          $this->url = '';
+          $return = TRUE;
+        }
+        break;
+      default:
+        $reduced = '';
+        if( $propName != 'X-PROP' ) {
+          if( !isset( $this->xprop[$propName] )) return FALSE;
+          foreach( $this->xprop as $k => $a ) {
+            if(( $k != $propName ) && !empty( $a ))
+              $reduced[$k] = $a;
+          }
+        }
+        else {
+          if( count( $this->xprop ) <= $propix ) { unset( $this->propdelix[$propName] ); return FALSE; }
+          $xpropno = 0;
+          foreach( $this->xprop as $xpropkey => $xpropvalue ) {
+            if( $propix != $xpropno )
+              $reduced[$xpropkey] = $xpropvalue;
+            $xpropno++;
+          }
+        }
+        $this->xprop = $reduced;
+        if( empty( $this->xprop )) {
+          unset( $this->propdelix[$propName] );
+          return FALSE;
+        }
+        return TRUE;
+    }
+    return $return;
+  }
+/*********************************************************************************/
+/**
+ * delete component property value, fixing components with multiple occurencies
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.8.8 - 2011-03-15
+ * @param array $multiprop, reference to a component property
+ * @param int   $propix, reference to removal counter
+ * @return bool TRUE
+ */
+  function deletePropertyM( & $multiprop, & $propix ) {
+    if( isset( $multiprop[$propix] ))
+      unset( $multiprop[$propix] );
+    if( empty( $multiprop )) {
+      $multiprop = '';
+      unset( $propix );
+      return FALSE;
+    }
+    else
+      return TRUE;
+  }
+/**
+ * get component property value/params
+ *
+ * if property has multiply values, consequtive function calls are needed
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param string $propName, optional
+ * @param int @propix, optional, if specific property is wanted in case of multiply occurences
+ * @param bool $inclParam=FALSE
+ * @param bool $specform=FALSE
+ * @return mixed
+ */
+  function getProperty( $propName=FALSE, $propix=FALSE, $inclParam=FALSE, $specform=FALSE ) {
+    if( 'GEOLOCATION' == strtoupper( $propName )) {
+      $content = $this->getProperty( 'LOCATION' );
+      $content = ( !empty( $content )) ? $content.' ' : '';
+      if(( FALSE === ( $geo     = $this->getProperty( 'GEO' ))) || empty( $geo ))
+        return FALSE;
+      if( 0.0 < $geo['latitude'] )
+        $sign   = '+';
+      else
+        $sign   = ( 0.0 > $geo['latitude'] ) ? '-' : '';
+      $content .= $sign.sprintf( "%09.6f", abs( $geo['latitude'] ));   // sprintf && lpad && float && sign !"#¤%&/(
+      $content  = rtrim( rtrim( $content, '0' ), '.' );
+      if( 0.0 < $geo['longitude'] )
+        $sign   = '+';
+      else
+       $sign   = ( 0.0 > $geo['longitude'] ) ? '-' : '';
+      return $content.$sign.sprintf( '%8.6f', abs( $geo['longitude'] )).'/';   // sprintf && lpad && float && sign !"#¤%&/(
+    }
+    if( $this->_notExistProp( $propName )) return FALSE;
+    $propName = ( $propName ) ? strtoupper( $propName ) : 'X-PROP';
+    if( in_array( $propName, array( 'ATTACH',   'ATTENDEE', 'CATEGORIES', 'COMMENT',   'CONTACT', 'DESCRIPTION',    'EXDATE', 'EXRULE',
+                                    'FREEBUSY', 'RDATE',    'RELATED-TO', 'RESOURCES', 'RRULE',   'REQUEST-STATUS', 'TZNAME', 'X-PROP'  ))) {
+      if( !$propix )
+        $propix = ( isset( $this->propix[$propName] )) ? $this->propix[$propName] + 2 : 1;
+      $this->propix[$propName] = --$propix;
+    }
+    switch( $propName ) {
+      case 'ACTION':
+        if( isset( $this->action['value'] )) return ( $inclParam ) ? $this->action : $this->action['value'];
+        break;
+      case 'ATTACH':
+        $ak = ( is_array( $this->attach )) ? array_keys( $this->attach ) : array();
+        while( is_array( $this->attach ) && !isset( $this->attach[$propix] ) && ( 0 < count( $this->attach )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->attach[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->attach[$propix] : $this->attach[$propix]['value'];
+        break;
+      case 'ATTENDEE':
+        $ak = ( is_array( $this->attendee )) ? array_keys( $this->attendee ) : array();
+        while( is_array( $this->attendee ) && !isset( $this->attendee[$propix] ) && ( 0 < count( $this->attendee )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->attendee[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->attendee[$propix] : $this->attendee[$propix]['value'];
+        break;
+      case 'CATEGORIES':
+        $ak = ( is_array( $this->categories )) ? array_keys( $this->categories ) : array();
+        while( is_array( $this->categories ) && !isset( $this->categories[$propix] ) && ( 0 < count( $this->categories )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->categories[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->categories[$propix] : $this->categories[$propix]['value'];
+        break;
+      case 'CLASS':
+        if( isset( $this->class['value'] )) return ( $inclParam ) ? $this->class : $this->class['value'];
+        break;
+      case 'COMMENT':
+        $ak = ( is_array( $this->comment )) ? array_keys( $this->comment ) : array();
+        while( is_array( $this->comment ) && !isset( $this->comment[$propix] ) && ( 0 < count( $this->comment )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->comment[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->comment[$propix] : $this->comment[$propix]['value'];
+        break;
+      case 'COMPLETED':
+        if( isset( $this->completed['value'] )) return ( $inclParam ) ? $this->completed : $this->completed['value'];
+        break;
+      case 'CONTACT':
+        $ak = ( is_array( $this->contact )) ? array_keys( $this->contact ) : array();
+        while( is_array( $this->contact ) && !isset( $this->contact[$propix] ) && ( 0 < count( $this->contact )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->contact[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->contact[$propix] : $this->contact[$propix]['value'];
+        break;
+      case 'CREATED':
+        if( isset( $this->created['value'] )) return ( $inclParam ) ? $this->created : $this->created['value'];
+        break;
+      case 'DESCRIPTION':
+        $ak = ( is_array( $this->description )) ? array_keys( $this->description ) : array();
+        while( is_array( $this->description ) && !isset( $this->description[$propix] ) && ( 0 < count( $this->description )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->description[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->description[$propix] : $this->description[$propix]['value'];
+        break;
+      case 'DTEND':
+        if( isset( $this->dtend['value'] )) return ( $inclParam ) ? $this->dtend : $this->dtend['value'];
+        break;
+      case 'DTSTAMP':
+        if( in_array( $this->objName, array( 'valarm', 'vtimezone', 'standard', 'daylight' )))
+          return;
+        if( !isset( $this->dtstamp['value'] ))
+          $this->_makeDtstamp();
+        return ( $inclParam ) ? $this->dtstamp : $this->dtstamp['value'];
+        break;
+      case 'DTSTART':
+        if( isset( $this->dtstart['value'] )) return ( $inclParam ) ? $this->dtstart : $this->dtstart['value'];
+        break;
+      case 'DUE':
+        if( isset( $this->due['value'] )) return ( $inclParam ) ? $this->due : $this->due['value'];
+        break;
+      case 'DURATION':
+        if( ! isset( $this->duration['value'] )) return FALSE;
+        $value = ( $specform && isset( $this->dtstart['value'] ) && isset( $this->duration['value'] )) ? iCalUtilityFunctions::_duration2date( $this->dtstart['value'], $this->duration['value'] ) : $this->duration['value'];
+        return ( $inclParam ) ? array( 'value' => $value, 'params' =>  $this->duration['params'] ) : $value;
+        break;
+      case 'EXDATE':
+        $ak = ( is_array( $this->exdate )) ? array_keys( $this->exdate ) : array();
+        while( is_array( $this->exdate ) && !isset( $this->exdate[$propix] ) && ( 0 < count( $this->exdate )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->exdate[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->exdate[$propix] : $this->exdate[$propix]['value'];
+        break;
+      case 'EXRULE':
+        $ak = ( is_array( $this->exrule )) ? array_keys( $this->exrule ) : array();
+        while( is_array( $this->exrule ) && !isset( $this->exrule[$propix] ) && ( 0 < count( $this->exrule )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->exrule[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->exrule[$propix] : $this->exrule[$propix]['value'];
+        break;
+      case 'FREEBUSY':
+        $ak = ( is_array( $this->freebusy )) ? array_keys( $this->freebusy ) : array();
+        while( is_array( $this->freebusy ) && !isset( $this->freebusy[$propix] ) && ( 0 < count( $this->freebusy )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->freebusy[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->freebusy[$propix] : $this->freebusy[$propix]['value'];
+        break;
+      case 'GEO':
+        if( isset( $this->geo['value'] )) return ( $inclParam ) ? $this->geo : $this->geo['value'];
+        break;
+      case 'LAST-MODIFIED':
+        if( isset( $this->lastmodified['value'] )) return ( $inclParam ) ? $this->lastmodified : $this->lastmodified['value'];
+        break;
+      case 'LOCATION':
+        if( isset( $this->location['value'] )) return ( $inclParam ) ? $this->location : $this->location['value'];
+        break;
+      case 'ORGANIZER':
+        if( isset( $this->organizer['value'] )) return ( $inclParam ) ? $this->organizer : $this->organizer['value'];
+        break;
+      case 'PERCENT-COMPLETE':
+        if( isset( $this->percentcomplete['value'] )) return ( $inclParam ) ? $this->percentcomplete : $this->percentcomplete['value'];
+        break;
+      case 'PRIORITY':
+        if( isset( $this->priority['value'] )) return ( $inclParam ) ? $this->priority : $this->priority['value'];
+        break;
+      case 'RDATE':
+        $ak = ( is_array( $this->rdate )) ? array_keys( $this->rdate ) : array();
+        while( is_array( $this->rdate ) && !isset( $this->rdate[$propix] ) && ( 0 < count( $this->rdate )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->rdate[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->rdate[$propix] : $this->rdate[$propix]['value'];
+        break;
+      case 'RECURRENCE-ID':
+        if( isset( $this->recurrenceid['value'] )) return ( $inclParam ) ? $this->recurrenceid : $this->recurrenceid['value'];
+        break;
+      case 'RELATED-TO':
+        $ak = ( is_array( $this->relatedto )) ? array_keys( $this->relatedto ) : array();
+        while( is_array( $this->relatedto ) && !isset( $this->relatedto[$propix] ) && ( 0 < count( $this->relatedto )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->relatedto[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->relatedto[$propix] : $this->relatedto[$propix]['value'];
+        break;
+      case 'REPEAT':
+        if( isset( $this->repeat['value'] )) return ( $inclParam ) ? $this->repeat : $this->repeat['value'];
+        break;
+      case 'REQUEST-STATUS':
+        $ak = ( is_array( $this->requeststatus )) ? array_keys( $this->requeststatus ) : array();
+        while( is_array( $this->requeststatus ) && !isset( $this->requeststatus[$propix] ) && ( 0 < count( $this->requeststatus )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->requeststatus[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->requeststatus[$propix] : $this->requeststatus[$propix]['value'];
+        break;
+      case 'RESOURCES':
+        $ak = ( is_array( $this->resources )) ? array_keys( $this->resources ) : array();
+        while( is_array( $this->resources ) && !isset( $this->resources[$propix] ) && ( 0 < count( $this->resources )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->resources[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->resources[$propix] : $this->resources[$propix]['value'];
+        break;
+      case 'RRULE':
+        $ak = ( is_array( $this->rrule )) ? array_keys( $this->rrule ) : array();
+        while( is_array( $this->rrule ) && !isset( $this->rrule[$propix] ) && ( 0 < count( $this->rrule )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->rrule[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->rrule[$propix] : $this->rrule[$propix]['value'];
+        break;
+      case 'SEQUENCE':
+        if( isset( $this->sequence['value'] )) return ( $inclParam ) ? $this->sequence : $this->sequence['value'];
+        break;
+      case 'STATUS':
+        if( isset( $this->status['value'] )) return ( $inclParam ) ? $this->status : $this->status['value'];
+        break;
+      case 'SUMMARY':
+        if( isset( $this->summary['value'] )) return ( $inclParam ) ? $this->summary : $this->summary['value'];
+        break;
+      case 'TRANSP':
+        if( isset( $this->transp['value'] )) return ( $inclParam ) ? $this->transp : $this->transp['value'];
+        break;
+      case 'TRIGGER':
+        if( isset( $this->trigger['value'] )) return ( $inclParam ) ? $this->trigger : $this->trigger['value'];
+        break;
+      case 'TZID':
+        if( isset( $this->tzid['value'] )) return ( $inclParam ) ? $this->tzid : $this->tzid['value'];
+        break;
+      case 'TZNAME':
+        $ak = ( is_array( $this->tzname )) ? array_keys( $this->tzname ) : array();
+        while( is_array( $this->tzname ) && !isset( $this->tzname[$propix] ) && ( 0 < count( $this->tzname )) && ( $propix < end( $ak )))
+          $propix++;
+        $this->propix[$propName] = $propix;
+        if( !isset( $this->tzname[$propix] )) { unset( $this->propix[$propName] ); return FALSE; }
+        return ( $inclParam ) ? $this->tzname[$propix] : $this->tzname[$propix]['value'];
+        break;
+      case 'TZOFFSETFROM':
+        if( isset( $this->tzoffsetfrom['value'] )) return ( $inclParam ) ? $this->tzoffsetfrom : $this->tzoffsetfrom['value'];
+        break;
+      case 'TZOFFSETTO':
+        if( isset( $this->tzoffsetto['value'] )) return ( $inclParam ) ? $this->tzoffsetto : $this->tzoffsetto['value'];
+        break;
+      case 'TZURL':
+        if( isset( $this->tzurl['value'] )) return ( $inclParam ) ? $this->tzurl : $this->tzurl['value'];
+        break;
+      case 'UID':
+        if( in_array( $this->objName, array( 'valarm', 'vtimezone', 'standard', 'daylight' )))
+          return FALSE;
+        if( empty( $this->uid['value'] ))
+          $this->_makeuid();
+        return ( $inclParam ) ? $this->uid : $this->uid['value'];
+        break;
+      case 'URL':
+        if( isset( $this->url['value'] )) return ( $inclParam ) ? $this->url : $this->url['value'];
+        break;
+      default:
+        if( $propName != 'X-PROP' ) {
+          if( !isset( $this->xprop[$propName] )) return FALSE;
+          return ( $inclParam ) ? array( $propName, $this->xprop[$propName] )
+                                : array( $propName, $this->xprop[$propName]['value'] );
+        }
+        else {
+          if( empty( $this->xprop )) return FALSE;
+          $xpropno = 0;
+          foreach( $this->xprop as $xpropkey => $xpropvalue ) {
+            if( $propix == $xpropno )
+              return ( $inclParam ) ? array( $xpropkey, $this->xprop[$xpropkey] )
+                                    : array( $xpropkey, $this->xprop[$xpropkey]['value'] );
+            else
+              $xpropno++;
+          }
+          return FALSE; // not found ??
+        }
+    }
+    return FALSE;
+  }
+/**
+ * returns calendar property unique values for 'ATTENDEE', 'CATEGORIES', 'CONTACT', 'RELATED-TO' or 'RESOURCES' and for each, number of occurrence
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.13.4 - 2012-08-07
+ * @param string $propName
+ * @param array  $output, incremented result array
+ */
+  function _getProperties( $propName, & $output ) {
+    if( empty( $output ))
+      $output = array();
+    if( !in_array( strtoupper( $propName ), array( 'ATTENDEE', 'CATEGORIES', 'CONTACT', 'RELATED-TO', 'RESOURCES' )))
+      return $output;
+    while( FALSE !== ( $content = $this->getProperty( $propName ))) {
+      if( empty( $content ))
+        continue;
+      if( is_array( $content )) {
+        foreach( $content as $part ) {
+          if( FALSE !== strpos( $part, ',' )) {
+            $part = explode( ',', $part );
+            foreach( $part as $thePart ) {
+              $thePart = trim( $thePart );
+              if( !empty( $thePart )) {
+                if( !isset( $output[$thePart] ))
+                  $output[$thePart] = 1;
+                else
+                  $output[$thePart] += 1;
+              }
+            }
+          }
+          else {
+            $part = trim( $part );
+            if( !isset( $output[$part] ))
+              $output[$part] = 1;
+            else
+              $output[$part] += 1;
+          }
+        }
+      } // end if( is_array( $content ))
+      elseif( FALSE !== strpos( $content, ',' )) {
+        $content = explode( ',', $content );
+        foreach( $content as $thePart ) {
+          $thePart = trim( $thePart );
+          if( !empty( $thePart )) {
+            if( !isset( $output[$thePart] ))
+              $output[$thePart] = 1;
+            else
+              $output[$thePart] += 1;
+          }
+        }
+      } // end elseif( FALSE !== strpos( $content, ',' ))
+      else {
+        $content = trim( $content );
+        if( !empty( $content )) {
+          if( !isset( $output[$content] ))
+            $output[$content] = 1;
+          else
+            $output[$content] += 1;
+        }
+      }
+    }
+    ksort( $output );
+  }
+/**
+ * general component property setting
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.5.1 - 2008-11-05
+ * @param mixed $args variable number of function arguments,
+ *                    first argument is ALWAYS component name,
+ *                    second ALWAYS component value!
+ * @return void
+ */
+  function setProperty() {
+    $numargs    = func_num_args();
+    if( 1 > $numargs ) return FALSE;
+    $arglist    = func_get_args();
+    if( $this->_notExistProp( $arglist[0] )) return FALSE;
+    if( !$this->getConfig( 'allowEmpty' ) && ( !isset( $arglist[1] ) || empty( $arglist[1] )))
+      return FALSE;
+    $arglist[0] = strtoupper( $arglist[0] );
+    for( $argix=$numargs; $argix < 12; $argix++ ) {
+      if( !isset( $arglist[$argix] ))
+        $arglist[$argix] = null;
+    }
+    switch( $arglist[0] ) {
+      case 'ACTION':
+        return $this->setAction(          $arglist[1], $arglist[2] );
+      case 'ATTACH':
+        return $this->setAttach(          $arglist[1], $arglist[2], $arglist[3] );
+      case 'ATTENDEE':
+        return $this->setAttendee(        $arglist[1], $arglist[2], $arglist[3] );
+      case 'CATEGORIES':
+        return $this->setCategories(      $arglist[1], $arglist[2], $arglist[3] );
+      case 'CLASS':
+        return $this->setClass(           $arglist[1], $arglist[2] );
+      case 'COMMENT':
+        return $this->setComment(         $arglist[1], $arglist[2], $arglist[3] );
+      case 'COMPLETED':
+        return $this->setCompleted(       $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7] );
+      case 'CONTACT':
+        return $this->setContact(         $arglist[1], $arglist[2], $arglist[3] );
+      case 'CREATED':
+        return $this->setCreated(         $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7] );
+      case 'DESCRIPTION':
+        return $this->setDescription(     $arglist[1], $arglist[2], $arglist[3] );
+      case 'DTEND':
+        return $this->setDtend(           $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7], $arglist[8] );
+      case 'DTSTAMP':
+        return $this->setDtstamp(         $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7] );
+      case 'DTSTART':
+        return $this->setDtstart(         $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7], $arglist[8] );
+      case 'DUE':
+        return $this->setDue(             $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7], $arglist[8] );
+      case 'DURATION':
+        return $this->setDuration(        $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6] );
+      case 'EXDATE':
+        return $this->setExdate(          $arglist[1], $arglist[2], $arglist[3] );
+      case 'EXRULE':
+        return $this->setExrule(          $arglist[1], $arglist[2], $arglist[3] );
+      case 'FREEBUSY':
+        return $this->setFreebusy(        $arglist[1], $arglist[2], $arglist[3], $arglist[4] );
+      case 'GEO':
+        return $this->setGeo(             $arglist[1], $arglist[2], $arglist[3] );
+      case 'LAST-MODIFIED':
+        return $this->setLastModified(    $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7] );
+      case 'LOCATION':
+        return $this->setLocation(        $arglist[1], $arglist[2] );
+      case 'ORGANIZER':
+        return $this->setOrganizer(       $arglist[1], $arglist[2] );
+      case 'PERCENT-COMPLETE':
+        return $this->setPercentComplete( $arglist[1], $arglist[2] );
+      case 'PRIORITY':
+        return $this->setPriority(        $arglist[1], $arglist[2] );
+      case 'RDATE':
+        return $this->setRdate(           $arglist[1], $arglist[2], $arglist[3] );
+      case 'RECURRENCE-ID':
+       return $this->setRecurrenceid(     $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7], $arglist[8] );
+      case 'RELATED-TO':
+        return $this->setRelatedTo(       $arglist[1], $arglist[2], $arglist[3] );
+      case 'REPEAT':
+        return $this->setRepeat(          $arglist[1], $arglist[2] );
+      case 'REQUEST-STATUS':
+        return $this->setRequestStatus(   $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5] );
+      case 'RESOURCES':
+        return $this->setResources(       $arglist[1], $arglist[2], $arglist[3] );
+      case 'RRULE':
+        return $this->setRrule(           $arglist[1], $arglist[2], $arglist[3] );
+      case 'SEQUENCE':
+        return $this->setSequence(        $arglist[1], $arglist[2] );
+      case 'STATUS':
+        return $this->setStatus(          $arglist[1], $arglist[2] );
+      case 'SUMMARY':
+        return $this->setSummary(         $arglist[1], $arglist[2] );
+      case 'TRANSP':
+        return $this->setTransp(          $arglist[1], $arglist[2] );
+      case 'TRIGGER':
+        return $this->setTrigger(         $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7], $arglist[8], $arglist[9], $arglist[10], $arglist[11] );
+      case 'TZID':
+        return $this->setTzid(            $arglist[1], $arglist[2] );
+      case 'TZNAME':
+        return $this->setTzname(          $arglist[1], $arglist[2], $arglist[3] );
+      case 'TZOFFSETFROM':
+        return $this->setTzoffsetfrom(    $arglist[1], $arglist[2] );
+      case 'TZOFFSETTO':
+        return $this->setTzoffsetto(      $arglist[1], $arglist[2] );
+      case 'TZURL':
+        return $this->setTzurl(           $arglist[1], $arglist[2] );
+      case 'UID':
+        return $this->setUid(             $arglist[1], $arglist[2] );
+      case 'URL':
+        return $this->setUrl(             $arglist[1], $arglist[2] );
+      default:
+        return $this->setXprop(           $arglist[0], $arglist[1], $arglist[2] );
+    }
+    return FALSE;
+  }
+/*********************************************************************************/
+/**
+ * parse component unparsed data into properties
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.26 - 2013-07-02
+ * @param mixed $unparsedtext, optional, strict rfc2445 formatted, single property string or array of strings
+ * @return bool FALSE if error occurs during parsing
+ *
+ */
+  function parse( $unparsedtext=null ) {
+    $nl = $this->getConfig( 'nl' );
+    if( !empty( $unparsedtext )) {
+      if( is_array( $unparsedtext ))
+        $unparsedtext = implode( '\n'.$nl, $unparsedtext );
+      $unparsedtext = explode( $nl, iCalUtilityFunctions::convEolChar( $unparsedtext, $nl ));
+    }
+    elseif( !isset( $this->unparsed ))
+      $unparsedtext = array();
+    else
+      $unparsedtext = $this->unparsed;
+            /* skip leading (empty/invalid) lines */
+    foreach( $unparsedtext as $lix => $line ) {
+      $tst = trim( $line );
+      if(( '\n' == $tst ) || empty( $tst ))
+        unset( $unparsedtext[$lix] );
+      else
+        break;
+    }
+    $this->unparsed = array();
+    $comp           = & $this;
+    $config         = $this->getConfig();
+    $compsync = $subsync = 0;
+    foreach ( $unparsedtext as $lix => $line ) {
+      if( 'END:VALARM'         == strtoupper( substr( $line, 0, 10 ))) {
+        if( 1 != $subsync ) return FALSE;
+        $this->components[]     = $comp->copy();
+        $subsync--;
+      }
+      elseif( 'END:DAYLIGHT'   == strtoupper( substr( $line, 0, 12 ))) {
+        if( 1 != $subsync ) return FALSE;
+        $this->components[]     = $comp->copy();
+        $subsync--;
+      }
+      elseif( 'END:STANDARD'   == strtoupper( substr( $line, 0, 12 ))) {
+        if( 1 != $subsync ) return FALSE;
+        array_unshift( $this->components, $comp->copy());
+        $subsync--;
+      }
+      elseif( 'END:'           == strtoupper( substr( $line, 0, 4 ))) { // end:<component>
+        if( 1 != $compsync ) return FALSE;
+        if( 0 < $subsync )
+          $this->components[]   = $comp->copy();
+        $compsync--;
+        break;                       /* skip trailing empty lines */
+      }
+      elseif( 'BEGIN:VALARM'   == strtoupper( substr( $line, 0, 12 ))) {
+        $comp = new valarm( $config);
+        $subsync++;
+      }
+      elseif( 'BEGIN:STANDARD' == strtoupper( substr( $line, 0, 14 ))) {
+        $comp = new vtimezone( 'standard', $config );
+        $subsync++;
+      }
+      elseif( 'BEGIN:DAYLIGHT' == strtoupper( substr( $line, 0, 14 ))) {
+        $comp = new vtimezone( 'daylight', $config );
+        $subsync++;
+      }
+      elseif( 'BEGIN:'         == strtoupper( substr( $line, 0, 6 )))  // begin:<component>
+        $compsync++;
+      else
+        $comp->unparsed[]       = $line;
+    }
+    if( 0 < $subsync )
+      $this->components[]   = $comp->copy();
+    unset( $config );
+            /* concatenate property values spread over several lines */
+    $lastix    = -1;
+    $propnames = array( 'action', 'attach', 'attendee', 'categories', 'comment', 'completed'
+                      , 'contact', 'class', 'created', 'description', 'dtend', 'dtstart'
+                      , 'dtstamp', 'due', 'duration', 'exdate', 'exrule', 'freebusy', 'geo'
+                      , 'last-modified', 'location', 'organizer', 'percent-complete'
+                      , 'priority', 'rdate', 'recurrence-id', 'related-to', 'repeat'
+                      , 'request-status', 'resources', 'rrule', 'sequence', 'status'
+                      , 'summary', 'transp', 'trigger', 'tzid', 'tzname', 'tzoffsetfrom'
+                      , 'tzoffsetto', 'tzurl', 'uid', 'url', 'x-' );
+    $proprows  = array();
+    for( $i = 0; $i < count( $this->unparsed ); $i++ ) { // concatenate lines
+      $line = rtrim( $this->unparsed[$i], $nl );
+      while( isset( $this->unparsed[$i+1] ) && !empty( $this->unparsed[$i+1] ) && ( ' ' == $this->unparsed[$i+1]{0} ))
+        $line .= rtrim( substr( $this->unparsed[++$i], 1 ), $nl );
+      $proprows[] = $line;
+    }
+            /* parse each property 'line' */
+    $paramMStz   = array( 'utc-', 'utc+', 'gmt-', 'gmt+' );
+    $paramProto3 = array( 'fax:', 'cid:', 'sms:', 'tel:', 'urn:' );
+    $paramProto4 = array( 'crid:', 'news:', 'pres:' );
+    foreach( $proprows as $line ) {
+      if( '\n' == substr( $line, -2 ))
+        $line = substr( $line, 0, -2 );
+            /* get propname */
+      $propname = null;
+      $cix = 0;
+      while( isset( $line[$cix] )) {
+        if( in_array( $line[$cix], array( ':', ';' )))
+          break;
+        else
+          $propname .= $line[$cix];
+        $cix++;
+      }
+      if(( 'x-' == substr( $propname, 0, 2 )) || ( 'X-' == substr( $propname, 0, 2 ))) {
+        $propname2 = $propname;
+        $propname  = 'X-';
+      }
+      if( !in_array( strtolower( $propname ), $propnames )) // skip non standard property names
+        continue;
+            /* rest of the line is opt.params and value */
+      $line = substr( $line, $cix );
+            /* separate attributes from value */
+      $attr         = array();
+      $attrix       = -1;
+      $clen         = strlen( $line );
+      $WithinQuotes = FALSE;
+      $cix          = 0;
+      while( FALSE !== substr( $line, $cix, 1 )) {
+        if(                       (  ':' == $line[$cix] )                         &&
+                                  ( substr( $line,$cix,     3 )  != '://' )       &&
+           ( !in_array( strtolower( substr( $line,$cix - 6, 4 )), $paramMStz ))   &&
+           ( !in_array( strtolower( substr( $line,$cix - 3, 4 )), $paramProto3 )) &&
+           ( !in_array( strtolower( substr( $line,$cix - 4, 5 )), $paramProto4 )) &&
+                      ( strtolower( substr( $line,$cix - 6, 7 )) != 'mailto:' )   &&
+             !$WithinQuotes ) {
+          $attrEnd = TRUE;
+          if(( $cix < ( $clen - 4 )) &&
+               ctype_digit( substr( $line, $cix+1, 4 ))) { // an URI with a (4pos) portnr??
+            for( $c2ix = $cix; 3 < $c2ix; $c2ix-- ) {
+              if( '://' == substr( $line, $c2ix - 2, 3 )) {
+                $attrEnd = FALSE;
+                break; // an URI with a portnr!!
+              }
+            }
+          }
+          if( $attrEnd) {
+            $line = substr( $line, ( $cix + 1 ));
+            break;
+          }
+          $cix++;
+        }
+        if( '"' == $line[$cix] )
+          $WithinQuotes = ( FALSE === $WithinQuotes ) ? TRUE : FALSE;
+        if( ';' == $line[$cix] )
+          $attr[++$attrix] = null;
+        else
+          $attr[$attrix] .= $line[$cix];
+        $cix++;
+      }
+            /* make attributes in array format */
+      $propattr = array();
+      foreach( $attr as $attribute ) {
+        $attrsplit = explode( '=', $attribute, 2 );
+        if( 1 < count( $attrsplit ))
+          $propattr[$attrsplit[0]] = $attrsplit[1];
+        else
+          $propattr[] = $attribute;
+      }
+            /* call setProperty( $propname.. . */
+      switch( strtoupper( $propname )) {
+        case 'ATTENDEE':
+          foreach( $propattr as $pix => $attr ) {
+            if( !in_array( strtoupper( $pix ), array( 'MEMBER', 'DELEGATED-TO', 'DELEGATED-FROM' )))
+              continue;
+            $attr2 = explode( ',', $attr );
+              if( 1 < count( $attr2 ))
+                $propattr[$pix] = $attr2;
+          }
+          $this->setProperty( $propname, $line, $propattr );
+          break;
+        case 'CATEGORIES':
+        case 'RESOURCES':
+          if( FALSE !== strpos( $line, ',' )) {
+            $content  = array( 0 => '' );
+            $cix = $lix = 0;
+            while( FALSE !== substr( $line, $lix, 1 )) {
+              if(( ',' == $line[$lix] ) && ( "\\" != $line[( $lix - 1 )])) {
+                $cix++;
+                $content[$cix] = '';
+              }
+              else
+                $content[$cix] .= $line[$lix];
+              $lix++;
+            }
+            if( 1 < count( $content )) {
+              $content = array_values( $content );
+              foreach( $content as $cix => $contentPart )
+                $content[$cix] = iCalUtilityFunctions::_strunrep( $contentPart );
+              $this->setProperty( $propname, $content, $propattr );
+              break;
+            }
+            else
+              $line = reset( $content );
+          }
+        case 'COMMENT':
+        case 'CONTACT':
+        case 'DESCRIPTION':
+        case 'LOCATION':
+        case 'SUMMARY':
+          if( empty( $line ))
+            $propattr = null;
+          $this->setProperty( $propname, iCalUtilityFunctions::_strunrep( $line ), $propattr );
+          break;
+        case 'REQUEST-STATUS':
+          $values    = explode( ';', $line, 3 );
+          $values[1] = ( !isset( $values[1] )) ? null : iCalUtilityFunctions::_strunrep( $values[1] );
+          $values[2] = ( !isset( $values[2] )) ? null : iCalUtilityFunctions::_strunrep( $values[2] );
+          $this->setProperty( $propname
+                            , $values[0]  // statcode
+                            , $values[1]  // statdesc
+                            , $values[2]  // extdata
+                            , $propattr );
+          break;
+        case 'FREEBUSY':
+          $fbtype = ( isset( $propattr['FBTYPE'] )) ? $propattr['FBTYPE'] : ''; // force setting default, if missing
+          unset( $propattr['FBTYPE'] );
+          $values = explode( ',', $line );
+          foreach( $values as $vix => $value ) {
+            $value2 = explode( '/', $value );
+            if( 1 < count( $value2 ))
+              $values[$vix] = $value2;
+          }
+          $this->setProperty( $propname, $fbtype, $values, $propattr );
+          break;
+        case 'GEO':
+          $value = explode( ';', $line, 2 );
+          if( 2 > count( $value ))
+            $value[1] = null;
+          $this->setProperty( $propname, $value[0], $value[1], $propattr );
+          break;
+        case 'EXDATE':
+          $values = ( !empty( $line )) ? explode( ',', $line ) : null;
+          $this->setProperty( $propname, $values, $propattr );
+          break;
+        case 'RDATE':
+          if( empty( $line )) {
+            $this->setProperty( $propname, $line, $propattr );
+            break;
+          }
+          $values = explode( ',', $line );
+          foreach( $values as $vix => $value ) {
+            $value2 = explode( '/', $value );
+            if( 1 < count( $value2 ))
+              $values[$vix] = $value2;
+          }
+          $this->setProperty( $propname, $values, $propattr );
+          break;
+        case 'EXRULE':
+        case 'RRULE':
+          $values = explode( ';', $line );
+          $recur = array();
+          foreach( $values as $value2 ) {
+            if( empty( $value2 ))
+              continue; // ;-char in ending position ???
+            $value3 = explode( '=', $value2, 2 );
+            $rulelabel = strtoupper( $value3[0] );
+            switch( $rulelabel ) {
+              case 'BYDAY': {
+                $value4 = explode( ',', $value3[1] );
+                if( 1 < count( $value4 )) {
+                  foreach( $value4 as $v5ix => $value5 ) {
+                    $value6 = array();
+                    $dayno = $dayname = null;
+                    $value5 = trim( (string) $value5 );
+                    if(( ctype_alpha( substr( $value5, -1 ))) &&
+                       ( ctype_alpha( substr( $value5, -2, 1 )))) {
+                      $dayname = substr( $value5, -2, 2 );
+                      if( 2 < strlen( $value5 ))
+                        $dayno = substr( $value5, 0, ( strlen( $value5 ) - 2 ));
+                    }
+                    if( $dayno )
+                      $value6[] = $dayno;
+                    if( $dayname )
+                      $value6['DAY'] = $dayname;
+                    $value4[$v5ix] = $value6;
+                  }
+                }
+                else {
+                  $value4 = array();
+                  $dayno  = $dayname = null;
+                  $value5 = trim( (string) $value3[1] );
+                  if(( ctype_alpha( substr( $value5, -1 ))) &&
+                     ( ctype_alpha( substr( $value5, -2, 1 )))) {
+                      $dayname = substr( $value5, -2, 2 );
+                    if( 2 < strlen( $value5 ))
+                      $dayno = substr( $value5, 0, ( strlen( $value5 ) - 2 ));
+                  }
+                  if( $dayno )
+                    $value4[] = $dayno;
+                  if( $dayname )
+                    $value4['DAY'] = $dayname;
+                }
+                $recur[$rulelabel] = $value4;
+                break;
+              }
+              default: {
+                $value4 = explode( ',', $value3[1] );
+                if( 1 < count( $value4 ))
+                  $value3[1] = $value4;
+                $recur[$rulelabel] = $value3[1];
+                break;
+              }
+            } // end - switch $rulelabel
+          } // end - foreach( $values.. .
+          $this->setProperty( $propname, $recur, $propattr );
+          break;
+        case 'X-':
+          $propname = ( isset( $propname2 )) ? $propname2 : $propname;
+          unset( $propname2 );
+        case 'ACTION':
+        case 'CLASSIFICATION':
+        case 'STATUS':
+        case 'TRANSP':
+        case 'UID':
+        case 'TZID':
+        case 'RELATED-TO':
+        case 'TZNAME':
+          $line = iCalUtilityFunctions::_strunrep( $line );
+        default:
+          $this->setProperty( $propname, $line, $propattr );
+          break;
+      } // end  switch( $propname.. .
+    } // end - foreach( $proprows.. .
+    unset( $unparsedtext, $this->unparsed, $proprows );
+    if( isset( $this->components ) && is_array( $this->components ) && ( 0 < count( $this->components ))) {
+      $ckeys = array_keys( $this->components );
+      foreach( $ckeys as $ckey ) {
+        if( !empty( $this->components[$ckey] ) && !empty( $this->components[$ckey]->unparsed )) {
+          $this->components[$ckey]->parse();
+        }
+      }
+    }
+    return TRUE;
+  }
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * return a copy of this component
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.15.4 - 2012-10-18
+ * @return object
+ */
+  function copy() {
+    return unserialize( serialize( $this ));
+ }
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * delete calendar subcomponent from component container
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.8.8 - 2011-03-15
+ * @param mixed $arg1 ordno / component type / component uid
+ * @param mixed $arg2 optional, ordno if arg1 = component type
+ * @return void
+ */
+  function deleteComponent( $arg1, $arg2=FALSE  ) {
+    if( !isset( $this->components )) return FALSE;
+    $argType = $index = null;
+    if ( ctype_digit( (string) $arg1 )) {
+      $argType = 'INDEX';
+      $index   = (int) $arg1 - 1;
+    }
+    elseif(( strlen( $arg1 ) <= strlen( 'vfreebusy' )) && ( FALSE === strpos( $arg1, '@' ))) {
+      $argType = strtolower( $arg1 );
+      $index   = ( !empty( $arg2 ) && ctype_digit( (string) $arg2 )) ? (( int ) $arg2 - 1 ) : 0;
+    }
+    $cix2dC = 0;
+    foreach ( $this->components as $cix => $component) {
+      if( empty( $component )) continue;
+      if(( 'INDEX' == $argType ) && ( $index == $cix )) {
+        unset( $this->components[$cix] );
+        return TRUE;
+      }
+      elseif( $argType == $component->objName ) {
+        if( $index == $cix2dC ) {
+          unset( $this->components[$cix] );
+          return TRUE;
+        }
+        $cix2dC++;
+      }
+      elseif( !$argType && ($arg1 == $component->getProperty( 'uid' ))) {
+        unset( $this->components[$cix] );
+        return TRUE;
+      }
+    }
+    return FALSE;
+  }
+/**
+ * get calendar component subcomponent from component container
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.8.8 - 2011-03-15
+ * @param mixed $arg1 optional, ordno/component type/ component uid
+ * @param mixed $arg2 optional, ordno if arg1 = component type
+ * @return object
+ */
+  function getComponent ( $arg1=FALSE, $arg2=FALSE ) {
+    if( !isset( $this->components )) return FALSE;
+    $index = $argType = null;
+    if ( !$arg1 ) {
+      $argType = 'INDEX';
+      $index   = $this->compix['INDEX'] =
+        ( isset( $this->compix['INDEX'] )) ? $this->compix['INDEX'] + 1 : 1;
+    }
+    elseif ( ctype_digit( (string) $arg1 )) {
+      $argType = 'INDEX';
+      $index   = (int) $arg1;
+      unset( $this->compix );
+    }
+    elseif(( strlen( $arg1 ) <= strlen( 'vfreebusy' )) && ( FALSE === strpos( $arg1, '@' ))) {
+      unset( $this->compix['INDEX'] );
+      $argType = strtolower( $arg1 );
+      if( !$arg2 )
+        $index = $this->compix[$argType] = ( isset( $this->compix[$argType] )) ? $this->compix[$argType] + 1 : 1;
+      else
+        $index = (int) $arg2;
+    }
+    $index  -= 1;
+    $ckeys = array_keys( $this->components );
+    if( !empty( $index) && ( $index > end( $ckeys )))
+      return FALSE;
+    $cix2gC = 0;
+    foreach( $this->components as $cix => $component ) {
+      if( empty( $component )) continue;
+      if(( 'INDEX' == $argType ) && ( $index == $cix ))
+        return $component->copy();
+      elseif( $argType == $component->objName ) {
+         if( $index == $cix2gC )
+           return $component->copy();
+         $cix2gC++;
+      }
+      elseif( !$argType && ( $arg1 == $component->getProperty( 'uid' )))
+        return $component->copy();
+    }
+            /* not found.. . */
+    unset( $this->compix );
+    return false;
+  }
+/**
+ * add calendar component as subcomponent to container for subcomponents
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 1.x.x - 2007-04-24
+ * @param object $component calendar component
+ * @return void
+ */
+  function addSubComponent ( $component ) {
+    $this->setComponent( $component );
+  }
+/**
+ * create new calendar component subcomponent, already included within component
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.6.33 - 2011-01-03
+ * @param string $compType subcomponent type
+ * @return object (reference)
+ */
+  function & newComponent( $compType ) {
+    $config = $this->getConfig();
+    $keys   = array_keys( $this->components );
+    $ix     = end( $keys) + 1;
+    switch( strtoupper( $compType )) {
+      case 'ALARM':
+      case 'VALARM':
+        $this->components[$ix] = new valarm( $config );
+        break;
+      case 'STANDARD':
+        array_unshift( $this->components, new vtimezone( 'STANDARD', $config ));
+        $ix = 0;
+        break;
+      case 'DAYLIGHT':
+        $this->components[$ix] = new vtimezone( 'DAYLIGHT', $config );
+        break;
+      default:
+        return FALSE;
+    }
+    return $this->components[$ix];
+  }
+/**
+ * add calendar component as subcomponent to container for subcomponents
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.8.8 - 2011-03-15
+ * @param object $component calendar component
+ * @param mixed $arg1 optional, ordno/component type/ component uid
+ * @param mixed $arg2 optional, ordno if arg1 = component type
+ * @return bool
+ */
+  function setComponent( $component, $arg1=FALSE, $arg2=FALSE  ) {
+    if( !isset( $this->components )) return FALSE;
+    $component->setConfig( $this->getConfig(), FALSE, TRUE );
+    if( !in_array( $component->objName, array( 'valarm', 'vtimezone', 'standard', 'daylight' ))) {
+            /* make sure dtstamp and uid is set */
+      $dummy = $component->getProperty( 'dtstamp' );
+      $dummy = $component->getProperty( 'uid' );
+    }
+    if( !$arg1 ) { // plain insert, last in chain
+      $this->components[] = $component->copy();
+      return TRUE;
+    }
+    $argType = $index = null;
+    if ( ctype_digit( (string) $arg1 )) { // index insert/replace
+      $argType = 'INDEX';
+      $index   = (int) $arg1 - 1;
+    }
+    elseif( in_array( strtolower( $arg1 ), array( 'vevent', 'vtodo', 'vjournal', 'vfreebusy', 'valarm', 'vtimezone' ))) {
+      $argType = strtolower( $arg1 );
+      $index = ( ctype_digit( (string) $arg2 )) ? ((int) $arg2) - 1 : 0;
+    }
+    // else if arg1 is set, arg1 must be an UID
+    $cix2sC = 0;
+    foreach ( $this->components as $cix => $component2 ) {
+      if( empty( $component2 )) continue;
+      if(( 'INDEX' == $argType ) && ( $index == $cix )) { // index insert/replace
+        $this->components[$cix] = $component->copy();
+        return TRUE;
+      }
+      elseif( $argType == $component2->objName ) { // component Type index insert/replace
+        if( $index == $cix2sC ) {
+          $this->components[$cix] = $component->copy();
+          return TRUE;
+        }
+        $cix2sC++;
+      }
+      elseif( !$argType && ( $arg1 == $component2->getProperty( 'uid' ))) { // UID insert/replace
+        $this->components[$cix] = $component->copy();
+        return TRUE;
+      }
+    }
+            /* arg1=index and not found.. . insert at index .. .*/
+    if( 'INDEX' == $argType ) {
+      $this->components[$index] = $component->copy();
+      ksort( $this->components, SORT_NUMERIC );
+    }
+    else    /* not found.. . insert last in chain anyway .. .*/
+    $this->components[] = $component->copy();
+    return TRUE;
+  }
+/**
+ * creates formatted output for subcomponents
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.11.20 - 2012-02-06
+ * @param array $xcaldecl
+ * @return string
+ */
+  function createSubComponent() {
+    $output = null;
+    if( 'vtimezone' == $this->objName ) { // sort subComponents, first standard, then daylight, in dtstart order
+      $stdarr = $dlarr = array();
+      foreach( $this->components as $component ) {
+        if( empty( $component ))
+          continue;
+        $dt  = $component->getProperty( 'dtstart' );
+        $key = sprintf( '%04d%02d%02d%02d%02d%02d000', $dt['year'], $dt['month'], $dt['day'], $dt['hour'], $dt['min'], $dt['sec'] );
+        if( 'standard' == $component->objName ) {
+          while( isset( $stdarr[$key] ))
+            $key += 1;
+          $stdarr[$key] = $component->copy();
+        }
+        elseif( 'daylight' == $component->objName ) {
+          while( isset( $dlarr[$key] ))
+            $key += 1;
+          $dlarr[$key] = $component->copy();
+        }
+      } // end foreach( $this->components as $component )
+      $this->components = array();
+      ksort( $stdarr, SORT_NUMERIC );
+      foreach( $stdarr as $std )
+        $this->components[] = $std->copy();
+      unset( $stdarr );
+      ksort( $dlarr,  SORT_NUMERIC );
+      foreach( $dlarr as $dl )
+        $this->components[] = $dl->copy();
+      unset( $dlarr );
+    } // end if( 'vtimezone' == $this->objName )
+    foreach( $this->components as $component ) {
+      $component->setConfig( $this->getConfig(), FALSE, TRUE );
+      $output .= $component->createComponent( $this->xcaldecl );
+    }
+    return $output;
+  }
+}
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * class for calendar component VEVENT
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.5.1 - 2008-10-12
+ */
+class vevent extends calendarComponent {
+  var $attach;
+  var $attendee;
+  var $categories;
+  var $comment;
+  var $contact;
+  var $class;
+  var $created;
+  var $description;
+  var $dtend;
+  var $dtstart;
+  var $duration;
+  var $exdate;
+  var $exrule;
+  var $geo;
+  var $lastmodified;
+  var $location;
+  var $organizer;
+  var $priority;
+  var $rdate;
+  var $recurrenceid;
+  var $relatedto;
+  var $requeststatus;
+  var $resources;
+  var $rrule;
+  var $sequence;
+  var $status;
+  var $summary;
+  var $transp;
+  var $url;
+  var $xprop;
+            //  component subcomponents container
+  var $components;
+/**
+ * constructor for calendar component VEVENT object
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.8.2 - 2011-05-01
+ * @param  array $config
+ * @return void
+ */
+  function vevent( $config = array()) {
+    $this->calendarComponent();
+
+    $this->attach          = '';
+    $this->attendee        = '';
+    $this->categories      = '';
+    $this->class           = '';
+    $this->comment         = '';
+    $this->contact         = '';
+    $this->created         = '';
+    $this->description     = '';
+    $this->dtstart         = '';
+    $this->dtend           = '';
+    $this->duration        = '';
+    $this->exdate          = '';
+    $this->exrule          = '';
+    $this->geo             = '';
+    $this->lastmodified    = '';
+    $this->location        = '';
+    $this->organizer       = '';
+    $this->priority        = '';
+    $this->rdate           = '';
+    $this->recurrenceid    = '';
+    $this->relatedto       = '';
+    $this->requeststatus   = '';
+    $this->resources       = '';
+    $this->rrule           = '';
+    $this->sequence        = '';
+    $this->status          = '';
+    $this->summary         = '';
+    $this->transp          = '';
+    $this->url             = '';
+    $this->xprop           = '';
+
+    $this->components      = array();
+
+    if( defined( 'ICAL_LANG' ) && !isset( $config['language'] ))
+                                          $config['language']   = ICAL_LANG;
+    if( !isset( $config['allowEmpty'] ))  $config['allowEmpty'] = TRUE;
+    if( !isset( $config['nl'] ))          $config['nl']         = "\r\n";
+    if( !isset( $config['format'] ))      $config['format']     = 'iCal';
+    if( !isset( $config['delimiter'] ))   $config['delimiter']  = DIRECTORY_SEPARATOR;
+    $this->setConfig( $config );
+
+  }
+/**
+ * create formatted output for calendar component VEVENT object instance
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.10.16 - 2011-10-28
+ * @param array $xcaldecl
+ * @return string
+ */
+  function createComponent( &$xcaldecl ) {
+    $objectname    = $this->_createFormat();
+    $component     = $this->componentStart1.$objectname.$this->componentStart2.$this->nl;
+    $component    .= $this->createUid();
+    $component    .= $this->createDtstamp();
+    $component    .= $this->createAttach();
+    $component    .= $this->createAttendee();
+    $component    .= $this->createCategories();
+    $component    .= $this->createComment();
+    $component    .= $this->createContact();
+    $component    .= $this->createClass();
+    $component    .= $this->createCreated();
+    $component    .= $this->createDescription();
+    $component    .= $this->createDtstart();
+    $component    .= $this->createDtend();
+    $component    .= $this->createDuration();
+    $component    .= $this->createExdate();
+    $component    .= $this->createExrule();
+    $component    .= $this->createGeo();
+    $component    .= $this->createLastModified();
+    $component    .= $this->createLocation();
+    $component    .= $this->createOrganizer();
+    $component    .= $this->createPriority();
+    $component    .= $this->createRdate();
+    $component    .= $this->createRrule();
+    $component    .= $this->createRelatedTo();
+    $component    .= $this->createRequestStatus();
+    $component    .= $this->createRecurrenceid();
+    $component    .= $this->createResources();
+    $component    .= $this->createSequence();
+    $component    .= $this->createStatus();
+    $component    .= $this->createSummary();
+    $component    .= $this->createTransp();
+    $component    .= $this->createUrl();
+    $component    .= $this->createXprop();
+    $component    .= $this->createSubComponent();
+    $component    .= $this->componentEnd1.$objectname.$this->componentEnd2;
+    if( is_array( $this->xcaldecl ) && ( 0 < count( $this->xcaldecl ))) {
+      foreach( $this->xcaldecl as $localxcaldecl )
+        $xcaldecl[] = $localxcaldecl;
+    }
+    return $component;
+  }
+}
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * class for calendar component VTODO
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.5.1 - 2008-10-12
+ */
+class vtodo extends calendarComponent {
+  var $attach;
+  var $attendee;
+  var $categories;
+  var $comment;
+  var $completed;
+  var $contact;
+  var $class;
+  var $created;
+  var $description;
+  var $dtstart;
+  var $due;
+  var $duration;
+  var $exdate;
+  var $exrule;
+  var $geo;
+  var $lastmodified;
+  var $location;
+  var $organizer;
+  var $percentcomplete;
+  var $priority;
+  var $rdate;
+  var $recurrenceid;
+  var $relatedto;
+  var $requeststatus;
+  var $resources;
+  var $rrule;
+  var $sequence;
+  var $status;
+  var $summary;
+  var $url;
+  var $xprop;
+            //  component subcomponents container
+  var $components;
+/**
+ * constructor for calendar component VTODO object
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.8.2 - 2011-05-01
+ * @param array $config
+ * @return void
+ */
+  function vtodo( $config = array()) {
+    $this->calendarComponent();
+
+    $this->attach          = '';
+    $this->attendee        = '';
+    $this->categories      = '';
+    $this->class           = '';
+    $this->comment         = '';
+    $this->completed       = '';
+    $this->contact         = '';
+    $this->created         = '';
+    $this->description     = '';
+    $this->dtstart         = '';
+    $this->due             = '';
+    $this->duration        = '';
+    $this->exdate          = '';
+    $this->exrule          = '';
+    $this->geo             = '';
+    $this->lastmodified    = '';
+    $this->location        = '';
+    $this->organizer       = '';
+    $this->percentcomplete = '';
+    $this->priority        = '';
+    $this->rdate           = '';
+    $this->recurrenceid    = '';
+    $this->relatedto       = '';
+    $this->requeststatus   = '';
+    $this->resources       = '';
+    $this->rrule           = '';
+    $this->sequence        = '';
+    $this->status          = '';
+    $this->summary         = '';
+    $this->url             = '';
+    $this->xprop           = '';
+
+    $this->components      = array();
+
+    if( defined( 'ICAL_LANG' ) && !isset( $config['language'] ))
+                                          $config['language']   = ICAL_LANG;
+    if( !isset( $config['allowEmpty'] ))  $config['allowEmpty'] = TRUE;
+    if( !isset( $config['nl'] ))          $config['nl']         = "\r\n";
+    if( !isset( $config['format'] ))      $config['format']     = 'iCal';
+    if( !isset( $config['delimiter'] ))   $config['delimiter']  = DIRECTORY_SEPARATOR;
+    $this->setConfig( $config );
+
+  }
+/**
+ * create formatted output for calendar component VTODO object instance
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.5.1 - 2008-11-07
+ * @param array $xcaldecl
+ * @return string
+ */
+  function createComponent( &$xcaldecl ) {
+    $objectname    = $this->_createFormat();
+    $component     = $this->componentStart1.$objectname.$this->componentStart2.$this->nl;
+    $component    .= $this->createUid();
+    $component    .= $this->createDtstamp();
+    $component    .= $this->createAttach();
+    $component    .= $this->createAttendee();
+    $component    .= $this->createCategories();
+    $component    .= $this->createClass();
+    $component    .= $this->createComment();
+    $component    .= $this->createCompleted();
+    $component    .= $this->createContact();
+    $component    .= $this->createCreated();
+    $component    .= $this->createDescription();
+    $component    .= $this->createDtstart();
+    $component    .= $this->createDue();
+    $component    .= $this->createDuration();
+    $component    .= $this->createExdate();
+    $component    .= $this->createExrule();
+    $component    .= $this->createGeo();
+    $component    .= $this->createLastModified();
+    $component    .= $this->createLocation();
+    $component    .= $this->createOrganizer();
+    $component    .= $this->createPercentComplete();
+    $component    .= $this->createPriority();
+    $component    .= $this->createRdate();
+    $component    .= $this->createRelatedTo();
+    $component    .= $this->createRequestStatus();
+    $component    .= $this->createRecurrenceid();
+    $component    .= $this->createResources();
+    $component    .= $this->createRrule();
+    $component    .= $this->createSequence();
+    $component    .= $this->createStatus();
+    $component    .= $this->createSummary();
+    $component    .= $this->createUrl();
+    $component    .= $this->createXprop();
+    $component    .= $this->createSubComponent();
+    $component    .= $this->componentEnd1.$objectname.$this->componentEnd2;
+    if( is_array( $this->xcaldecl ) && ( 0 < count( $this->xcaldecl ))) {
+      foreach( $this->xcaldecl as $localxcaldecl )
+        $xcaldecl[] = $localxcaldecl;
+    }
+    return $component;
+  }
+}
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * class for calendar component VJOURNAL
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.5.1 - 2008-10-12
+ */
+class vjournal extends calendarComponent {
+  var $attach;
+  var $attendee;
+  var $categories;
+  var $comment;
+  var $contact;
+  var $class;
+  var $created;
+  var $description;
+  var $dtstart;
+  var $exdate;
+  var $exrule;
+  var $lastmodified;
+  var $organizer;
+  var $rdate;
+  var $recurrenceid;
+  var $relatedto;
+  var $requeststatus;
+  var $rrule;
+  var $sequence;
+  var $status;
+  var $summary;
+  var $url;
+  var $xprop;
+/**
+ * constructor for calendar component VJOURNAL object
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.8.2 - 2011-05-01
+ * @param array $config
+ * @return void
+ */
+  function vjournal( $config = array()) {
+    $this->calendarComponent();
+
+    $this->attach          = '';
+    $this->attendee        = '';
+    $this->categories      = '';
+    $this->class           = '';
+    $this->comment         = '';
+    $this->contact         = '';
+    $this->created         = '';
+    $this->description     = '';
+    $this->dtstart         = '';
+    $this->exdate          = '';
+    $this->exrule          = '';
+    $this->lastmodified    = '';
+    $this->organizer       = '';
+    $this->rdate           = '';
+    $this->recurrenceid    = '';
+    $this->relatedto       = '';
+    $this->requeststatus   = '';
+    $this->rrule           = '';
+    $this->sequence        = '';
+    $this->status          = '';
+    $this->summary         = '';
+    $this->url             = '';
+    $this->xprop           = '';
+
+    if( defined( 'ICAL_LANG' ) && !isset( $config['language'] ))
+                                          $config['language']   = ICAL_LANG;
+    if( !isset( $config['allowEmpty'] ))  $config['allowEmpty'] = TRUE;
+    if( !isset( $config['nl'] ))          $config['nl']         = "\r\n";
+    if( !isset( $config['format'] ))      $config['format']     = 'iCal';
+    if( !isset( $config['delimiter'] ))   $config['delimiter']  = DIRECTORY_SEPARATOR;
+    $this->setConfig( $config );
+
+  }
+/**
+ * create formatted output for calendar component VJOURNAL object instance
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.5.1 - 2008-10-12
+ * @param array $xcaldecl
+ * @return string
+ */
+  function createComponent( &$xcaldecl ) {
+    $objectname = $this->_createFormat();
+    $component  = $this->componentStart1.$objectname.$this->componentStart2.$this->nl;
+    $component .= $this->createUid();
+    $component .= $this->createDtstamp();
+    $component .= $this->createAttach();
+    $component .= $this->createAttendee();
+    $component .= $this->createCategories();
+    $component .= $this->createClass();
+    $component .= $this->createComment();
+    $component .= $this->createContact();
+    $component .= $this->createCreated();
+    $component .= $this->createDescription();
+    $component .= $this->createDtstart();
+    $component .= $this->createExdate();
+    $component .= $this->createExrule();
+    $component .= $this->createLastModified();
+    $component .= $this->createOrganizer();
+    $component .= $this->createRdate();
+    $component .= $this->createRequestStatus();
+    $component .= $this->createRecurrenceid();
+    $component .= $this->createRelatedTo();
+    $component .= $this->createRrule();
+    $component .= $this->createSequence();
+    $component .= $this->createStatus();
+    $component .= $this->createSummary();
+    $component .= $this->createUrl();
+    $component .= $this->createXprop();
+    $component .= $this->componentEnd1.$objectname.$this->componentEnd2;
+    if( is_array( $this->xcaldecl ) && ( 0 < count( $this->xcaldecl ))) {
+      foreach( $this->xcaldecl as $localxcaldecl )
+        $xcaldecl[] = $localxcaldecl;
+    }
+    return $component;
+  }
+}
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * class for calendar component VFREEBUSY
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.5.1 - 2008-10-12
+ */
+class vfreebusy extends calendarComponent {
+  var $attendee;
+  var $comment;
+  var $contact;
+  var $dtend;
+  var $dtstart;
+  var $duration;
+  var $freebusy;
+  var $organizer;
+  var $requeststatus;
+  var $url;
+  var $xprop;
+            //  component subcomponents container
+  var $components;
+/**
+ * constructor for calendar component VFREEBUSY object
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.8.2 - 2011-05-01
+ * @param array $config
+ * @return void
+ */
+  function vfreebusy( $config = array()) {
+    $this->calendarComponent();
+
+    $this->attendee        = '';
+    $this->comment         = '';
+    $this->contact         = '';
+    $this->dtend           = '';
+    $this->dtstart         = '';
+    $this->duration        = '';
+    $this->freebusy        = '';
+    $this->organizer       = '';
+    $this->requeststatus   = '';
+    $this->url             = '';
+    $this->xprop           = '';
+
+    if( defined( 'ICAL_LANG' ) && !isset( $config['language'] ))
+                                          $config['language']   = ICAL_LANG;
+    if( !isset( $config['allowEmpty'] ))  $config['allowEmpty'] = TRUE;
+    if( !isset( $config['nl'] ))          $config['nl']         = "\r\n";
+    if( !isset( $config['format'] ))      $config['format']     = 'iCal';
+    if( !isset( $config['delimiter'] ))   $config['delimiter']  = DIRECTORY_SEPARATOR;
+    $this->setConfig( $config );
+
+  }
+/**
+ * create formatted output for calendar component VFREEBUSY object instance
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.3.1 - 2007-11-19
+ * @param array $xcaldecl
+ * @return string
+ */
+  function createComponent( &$xcaldecl ) {
+    $objectname = $this->_createFormat();
+    $component  = $this->componentStart1.$objectname.$this->componentStart2.$this->nl;
+    $component .= $this->createUid();
+    $component .= $this->createDtstamp();
+    $component .= $this->createAttendee();
+    $component .= $this->createComment();
+    $component .= $this->createContact();
+    $component .= $this->createDtstart();
+    $component .= $this->createDtend();
+    $component .= $this->createDuration();
+    $component .= $this->createFreebusy();
+    $component .= $this->createOrganizer();
+    $component .= $this->createRequestStatus();
+    $component .= $this->createUrl();
+    $component .= $this->createXprop();
+    $component .= $this->componentEnd1.$objectname.$this->componentEnd2;
+    if( is_array( $this->xcaldecl ) && ( 0 < count( $this->xcaldecl ))) {
+      foreach( $this->xcaldecl as $localxcaldecl )
+        $xcaldecl[] = $localxcaldecl;
+    }
+    return $component;
+  }
+}
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * class for calendar component VALARM
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.5.1 - 2008-10-12
+ */
+class valarm extends calendarComponent {
+  var $action;
+  var $attach;
+  var $attendee;
+  var $description;
+  var $duration;
+  var $repeat;
+  var $summary;
+  var $trigger;
+  var $xprop;
+/**
+ * constructor for calendar component VALARM object
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.8.2 - 2011-05-01
+ * @param array $config
+ * @return void
+ */
+  function valarm( $config = array()) {
+    $this->calendarComponent();
+
+    $this->action          = '';
+    $this->attach          = '';
+    $this->attendee        = '';
+    $this->description     = '';
+    $this->duration        = '';
+    $this->repeat          = '';
+    $this->summary         = '';
+    $this->trigger         = '';
+    $this->xprop           = '';
+
+    if( defined( 'ICAL_LANG' ) && !isset( $config['language'] ))
+                                          $config['language']   = ICAL_LANG;
+    if( !isset( $config['allowEmpty'] ))  $config['allowEmpty'] = TRUE;
+    if( !isset( $config['nl'] ))          $config['nl']         = "\r\n";
+    if( !isset( $config['format'] ))      $config['format']     = 'iCal';
+    if( !isset( $config['delimiter'] ))   $config['delimiter']  = DIRECTORY_SEPARATOR;
+    $this->setConfig( $config );
+
+  }
+/**
+ * create formatted output for calendar component VALARM object instance
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.5.1 - 2008-10-22
+ * @param array $xcaldecl
+ * @return string
+ */
+  function createComponent( &$xcaldecl ) {
+    $objectname    = $this->_createFormat();
+    $component     = $this->componentStart1.$objectname.$this->componentStart2.$this->nl;
+    $component    .= $this->createAction();
+    $component    .= $this->createAttach();
+    $component    .= $this->createAttendee();
+    $component    .= $this->createDescription();
+    $component    .= $this->createDuration();
+    $component    .= $this->createRepeat();
+    $component    .= $this->createSummary();
+    $component    .= $this->createTrigger();
+    $component    .= $this->createXprop();
+    $component    .= $this->componentEnd1.$objectname.$this->componentEnd2;
+    if( is_array( $this->xcaldecl ) && ( 0 < count( $this->xcaldecl ))) {
+      foreach( $this->xcaldecl as $localxcaldecl )
+        $xcaldecl[] = $localxcaldecl;
+    }
+    return $component;
+  }
+}
+/**********************************************************************************
+/*********************************************************************************/
+/**
+ * class for calendar component VTIMEZONE
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.5.1 - 2008-10-12
+ */
+class vtimezone extends calendarComponent {
+  var $timezonetype;
+
+  var $comment;
+  var $dtstart;
+  var $lastmodified;
+  var $rdate;
+  var $rrule;
+  var $tzid;
+  var $tzname;
+  var $tzoffsetfrom;
+  var $tzoffsetto;
+  var $tzurl;
+  var $xprop;
+            //  component subcomponents container
+  var $components;
+/**
+ * constructor for calendar component VTIMEZONE object
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.8.2 - 2011-05-01
+ * @param mixed $timezonetype optional, default FALSE ( STANDARD / DAYLIGHT )
+ * @param array $config
+ * @return void
+ */
+  function vtimezone( $timezonetype=FALSE, $config = array()) {
+    if( is_array( $timezonetype )) {
+      $config       = $timezonetype;
+      $timezonetype = FALSE;
+    }
+    if( !$timezonetype )
+      $this->timezonetype = 'VTIMEZONE';
+    else
+      $this->timezonetype = strtoupper( $timezonetype );
+    $this->calendarComponent();
+
+    $this->comment         = '';
+    $this->dtstart         = '';
+    $this->lastmodified    = '';
+    $this->rdate           = '';
+    $this->rrule           = '';
+    $this->tzid            = '';
+    $this->tzname          = '';
+    $this->tzoffsetfrom    = '';
+    $this->tzoffsetto      = '';
+    $this->tzurl           = '';
+    $this->xprop           = '';
+
+    $this->components      = array();
+
+    if( defined( 'ICAL_LANG' ) && !isset( $config['language'] ))
+                                          $config['language']   = ICAL_LANG;
+    if( !isset( $config['allowEmpty'] ))  $config['allowEmpty'] = TRUE;
+    if( !isset( $config['nl'] ))          $config['nl']         = "\r\n";
+    if( !isset( $config['format'] ))      $config['format']     = 'iCal';
+    if( !isset( $config['delimiter'] ))   $config['delimiter']  = DIRECTORY_SEPARATOR;
+    $this->setConfig( $config );
+
+  }
+/**
+ * create formatted output for calendar component VTIMEZONE object instance
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.5.1 - 2008-10-25
+ * @param array $xcaldecl
+ * @return string
+ */
+  function createComponent( &$xcaldecl ) {
+    $objectname    = $this->_createFormat();
+    $component     = $this->componentStart1.$objectname.$this->componentStart2.$this->nl;
+    $component    .= $this->createTzid();
+    $component    .= $this->createLastModified();
+    $component    .= $this->createTzurl();
+    $component    .= $this->createDtstart();
+    $component    .= $this->createTzoffsetfrom();
+    $component    .= $this->createTzoffsetto();
+    $component    .= $this->createComment();
+    $component    .= $this->createRdate();
+    $component    .= $this->createRrule();
+    $component    .= $this->createTzname();
+    $component    .= $this->createXprop();
+    $component    .= $this->createSubComponent();
+    $component    .= $this->componentEnd1.$objectname.$this->componentEnd2;
+    if( is_array( $this->xcaldecl ) && ( 0 < count( $this->xcaldecl ))) {
+      foreach( $this->xcaldecl as $localxcaldecl )
+        $xcaldecl[] = $localxcaldecl;
+    }
+    return $component;
+  }
+}
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * moving all utility (static) functions to a utility class
+ * 20111223 - move iCalUtilityFunctions class to the end of the iCalcreator class file
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.10.1 - 2011-07-16
+ *
+ */
+class iCalUtilityFunctions {
+  // Store the single instance of iCalUtilityFunctions
+  private static $m_pInstance;
+
+  // Private constructor to limit object instantiation to within the class
+  private function __construct() {
+    $m_pInstance = FALSE;
+  }
+
+  // Getter method for creating/returning the single instance of this class
+  public static function getInstance() {
+    if (!self::$m_pInstance)
+      self::$m_pInstance = new iCalUtilityFunctions();
+
+    return self::$m_pInstance;
+  }
+/**
+ * ensures internal date-time/date format (keyed array) for an input date-time/date array (keyed or unkeyed)
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.24 - 2013-06-26
+ * @param array $datetime
+ * @param int $parno optional, default FALSE
+ * @return array
+ */
+  public static function _date_time_array( $datetime, $parno=FALSE ) {
+    return iCalUtilityFunctions::_chkDateArr( $datetime, $parno );
+  }
+  public static function _chkDateArr( $datetime, $parno=FALSE ) {
+    $output = array();
+    if(( !$parno || ( 6 <= $parno )) && isset( $datetime[3] ) && !isset( $datetime[4] )) { // Y-m-d with tz
+      $temp        = $datetime[3];
+      $datetime[3] = $datetime[4] = $datetime[5] = 0;
+      $datetime[6] = $temp;
+    }
+    foreach( $datetime as $dateKey => $datePart ) {
+      switch ( $dateKey ) {
+        case '0': case 'year':   $output['year']  = $datePart; break;
+        case '1': case 'month':  $output['month'] = $datePart; break;
+        case '2': case 'day':    $output['day']   = $datePart; break;
+      }
+      if( 3 != $parno ) {
+        switch ( $dateKey ) {
+          case '0':
+          case '1':
+          case '2': break;
+          case '3': case 'hour': $output['hour']  = $datePart; break;
+          case '4': case 'min' : $output['min']   = $datePart; break;
+          case '5': case 'sec' : $output['sec']   = $datePart; break;
+          case '6': case 'tz'  : $output['tz']    = $datePart; break;
+        }
+      }
+    }
+    if( 3 != $parno ) {
+      if( !isset( $output['hour'] ))         $output['hour'] = 0;
+      if( !isset( $output['min']  ))         $output['min']  = 0;
+      if( !isset( $output['sec']  ))         $output['sec']  = 0;
+      if( isset( $output['tz'] ) &&
+        (( '+0000' == $output['tz'] ) || ( '-0000' == $output['tz'] ) || ( '+000000' == $output['tz'] ) || ( '-000000' == $output['tz'] )))
+                                             $output['tz']   = 'Z';
+    }
+    return $output;
+  }
+/**
+ * check date(-time) and params arrays for an opt. timezone and if it is a DATE-TIME or DATE (updates $parno and params)
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.10.30 - 2012-01-16
+ * @param array $date, date to check
+ * @param int $parno, no of date parts (i.e. year, month.. .)
+ * @param array $params, property parameters
+ * @return void
+ */
+  public static function _chkdatecfg( $theDate, & $parno, & $params ) {
+    if( isset( $params['TZID'] ))
+      $parno = 6;
+    elseif( isset( $params['VALUE'] ) && ( 'DATE' == $params['VALUE'] ))
+      $parno = 3;
+    else {
+      if( isset( $params['VALUE'] ) && ( 'PERIOD' == $params['VALUE'] ))
+        $parno = 7;
+      if( is_array( $theDate )) {
+        if( isset( $theDate['timestamp'] ))
+          $tzid = ( isset( $theDate['tz'] )) ? $theDate['tz'] : null;
+        else
+          $tzid = ( isset( $theDate['tz'] )) ? $theDate['tz'] : ( 7 == count( $theDate )) ? end( $theDate ) : null;
+        if( !empty( $tzid )) {
+          $parno = 7;
+          if( !iCalUtilityFunctions::_isOffset( $tzid ))
+            $params['TZID'] = $tzid; // save only timezone
+        }
+        elseif( !$parno && ( 3 == count( $theDate )) &&
+          ( isset( $params['VALUE'] ) && ( 'DATE' == $params['VALUE'] )))
+          $parno = 3;
+        else
+          $parno = 6;
+      }
+      else { // string
+        $date = trim( $theDate );
+        if( 'Z' == substr( $date, -1 ))
+          $parno = 7; // UTC DATE-TIME
+        elseif((( 8 == strlen( $date ) && ctype_digit( $date )) || ( 11 >= strlen( $date ))) &&
+          ( !isset( $params['VALUE'] ) || !in_array( $params['VALUE'], array( 'DATE-TIME', 'PERIOD' ))))
+          $parno = 3; // DATE
+        $date = iCalUtilityFunctions::_strdate2date( $date, $parno );
+        unset( $date['unparsedtext'] );
+        if( !empty( $date['tz'] )) {
+          $parno = 7;
+          if( !iCalUtilityFunctions::_isOffset( $date['tz'] ))
+            $params['TZID'] = $date['tz']; // save only timezone
+        }
+        elseif( empty( $parno ))
+          $parno = 6;
+      }
+      if( isset( $params['TZID'] ))
+        $parno = 6;
+    }
+  }
+/**
+ * vcalendar sort callback function
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-17
+ * @param array $a
+ * @param array $b
+ * @return int
+ */
+  public static function _cmpfcn( $a, $b ) {
+    if(        empty( $a ))                       return -1;
+    if(        empty( $b ))                       return  1;
+    if( 'vtimezone' == $a->objName ) {
+      if( 'vtimezone' != $b->objName )            return -1;
+      elseif( $a->srtk[0] <= $b->srtk[0] )        return -1;
+      else                                        return  1;
+    }
+    elseif( 'vtimezone' == $b->objName )          return  1;
+    $sortkeys = array( 'year', 'month', 'day', 'hour', 'min', 'sec' );
+    for( $k = 0; $k < 4 ; $k++ ) {
+      if(        empty( $a->srtk[$k] ))           return -1;
+      elseif(    empty( $b->srtk[$k] ))           return  1;
+      if( is_array( $a->srtk[$k] )) {
+        if( is_array( $b->srtk[$k] )) {
+          foreach( $sortkeys as $key ) {
+            if    ( !isset( $a->srtk[$k][$key] )) return -1;
+            elseif( !isset( $b->srtk[$k][$key] )) return  1;
+            if    (  empty( $a->srtk[$k][$key] )) return -1;
+            elseif(  empty( $b->srtk[$k][$key] )) return  1;
+            if    (         $a->srtk[$k][$key] == $b->srtk[$k][$key])
+                                                  continue;
+            if    ((  (int) $a->srtk[$k][$key] ) < ((int) $b->srtk[$k][$key] ))
+                                                  return -1;
+            elseif((  (int) $a->srtk[$k][$key] ) > ((int) $b->srtk[$k][$key] ))
+                                                  return  1;
+          }
+        }
+        else                                      return -1;
+      }
+      elseif( is_array( $b->srtk[$k] ))           return  1;
+      elseif( $a->srtk[$k] < $b->srtk[$k] )       return -1;
+      elseif( $a->srtk[$k] > $b->srtk[$k] )       return  1;
+    }
+    return 0;
+  }
+/**
+ * byte oriented line folding fix
+ *
+ * remove any line-endings that may include spaces or tabs
+ * and convert all line endings (iCal default '\r\n'),
+ * takes care of '\r\n', '\r' and '\n' and mixed '\r\n'+'\r', '\r\n'+'\n'
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.12.17 - 2012-07-12
+ * @param string $text
+ * @param string $nl
+ * @return string
+ */
+  public static function convEolChar( & $text, $nl ) {
+    $outp = '';
+    $cix  = 0;
+    while(    isset(   $text[$cix] )) {
+      if(     isset(   $text[$cix + 2] ) &&  ( "\r" == $text[$cix] ) && ( "\n" == $text[$cix + 1] ) &&
+        ((    " " ==   $text[$cix + 2] ) ||  ( "\t" == $text[$cix + 2] )))                    // 2 pos eolchar + ' ' or '\t'
+        $cix  += 2;                                                                           // skip 3
+      elseif( isset(   $text[$cix + 1] ) &&  ( "\r" == $text[$cix] ) && ( "\n" == $text[$cix + 1] )) {
+        $outp .= $nl;                                                                         // 2 pos eolchar
+        $cix  += 1;                                                                           // replace with $nl
+      }
+      elseif( isset(   $text[$cix + 1] ) && (( "\r" == $text[$cix] ) || ( "\n" == $text[$cix] )) &&
+           (( " " ==   $text[$cix + 1] ) ||  ( "\t" == $text[$cix + 1] )))                     // 1 pos eolchar + ' ' or '\t'
+        $cix  += 1;                                                                            // skip 2
+      elseif(( "\r" == $text[$cix] )     ||  ( "\n" == $text[$cix] ))                          // 1 pos eolchar
+        $outp .= $nl;                                                                          // replace with $nl
+      else
+        $outp .= $text[$cix];                                                                  // add any other byte
+      $cix    += 1;
+    }
+    return $outp;
+  }
+/**
+ * create a calendar timezone and standard/daylight components
+ *
+ * Result when 'Europe/Stockholm' and no from/to arguments is used as timezone:
+ *
+ * BEGIN:VTIMEZONE
+ * TZID:Europe/Stockholm
+ * BEGIN:STANDARD
+ * DTSTART:20101031T020000
+ * TZOFFSETFROM:+0200
+ * TZOFFSETTO:+0100
+ * TZNAME:CET
+ * END:STANDARD
+ * BEGIN:DAYLIGHT
+ * DTSTART:20100328T030000
+ * TZOFFSETFROM:+0100
+ * TZOFFSETTO:+0200
+ * TZNAME:CEST
+ * END:DAYLIGHT
+ * END:VTIMEZONE
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.1 - 2012-11-26
+ * Generates components for all transitions in a date range, based on contribution by Yitzchok Lavi <icalcreator@onebigsystem.com>
+ * Additional changes jpirkey
+ * @param object $calendar, reference to an iCalcreator calendar instance
+ * @param string $timezone, a PHP5 (DateTimeZone) valid timezone
+ * @param array  $xProp,    *[x-propName => x-propValue], optional
+ * @param int    $from      a unix timestamp
+ * @param int    $to        a unix timestamp
+ * @return bool
+ */
+  public static function createTimezone( & $calendar, $timezone, $xProp=array(), $from=null, $to=null ) {
+    if( empty( $timezone ))
+      return FALSE;
+    if( !empty( $from ) && !is_int( $from ))
+      return FALSE;
+    if( !empty( $to )   && !is_int( $to ))
+      return FALSE;
+    try {
+      $dtz               = new DateTimeZone( $timezone );
+      $transitions       = $dtz->getTransitions();
+      $utcTz             = new DateTimeZone( 'UTC' );
+    }
+    catch( Exception $e ) { return FALSE; }
+    if( empty( $to )) {
+      $dates             = array_keys( $calendar->getProperty( 'dtstart' ));
+      if( empty( $dates ))
+        $dates           = array( date( 'Ymd' ));
+    }
+    if( !empty( $from ))
+      $dateFrom          = new DateTime( "@$from" );             // set lowest date (UTC)
+    else {
+      $from              = reset( $dates );                      // set lowest date to the lowest dtstart date
+      $dateFrom          = new DateTime( $from.'T000000', $dtz );
+      $dateFrom->modify( '-1 month' );                           // set $dateFrom to one month before the lowest date
+      $dateFrom->setTimezone( $utcTz );                          // convert local date to UTC
+    }
+    $dateFromYmd         = $dateFrom->format('Y-m-d' );
+    if( !empty( $to ))
+      $dateTo            = new DateTime( "@$to" );               // set end date (UTC)
+    else {
+      $to                = end( $dates );                        // set highest date to the highest dtstart date
+      $dateTo            = new DateTime( $to.'T235959', $dtz );
+      $dateTo->modify( '+1 year' );                              // set $dateTo to one year after the highest date
+      $dateTo->setTimezone( $utcTz );                            // convert local date to UTC
+    }
+    $dateToYmd           = $dateTo->format('Y-m-d' );
+    unset( $dtz );
+    $transTemp           = array();
+    $prevOffsetfrom      = 0;
+    $stdIx  = $dlghtIx   = null;
+    $prevTrans           = FALSE;
+    foreach( $transitions as $tix => $trans ) {                  // all transitions in date-time order!!
+      $date              = new DateTime( "@{$trans['ts']}" );    // set transition date (UTC)
+      $transDateYmd      = $date->format('Y-m-d' );
+      if ( $transDateYmd < $dateFromYmd ) {
+        $prevOffsetfrom  = $trans['offset'];                     // previous trans offset will be 'next' trans offsetFrom
+        $prevTrans       = $trans;                               // save it in case we don't find any that match
+        $prevTrans['offsetfrom'] = ( 0 < $tix ) ? $transitions[$tix-1]['offset'] : 0;
+        continue;
+      }
+      if( $transDateYmd > $dateToYmd )
+        break;                                                   // loop always (?) breaks here
+      if( !empty( $prevOffsetfrom ) || ( 0 == $prevOffsetfrom )) {
+        $trans['offsetfrom'] = $prevOffsetfrom;                  // i.e. set previous offsetto as offsetFrom
+        $date->modify( $trans['offsetfrom'].'seconds' );         // convert utc date to local date
+        $d = $date->format( 'Y-n-j-G-i-s' );                     // set date to array to ease up dtstart and (opt) rdate setting
+        $d = explode( '-', $d );
+        $trans['time']   = array( 'year' => $d[0], 'month' => $d[1], 'day' => $d[2], 'hour' => $d[3], 'min' => $d[4], 'sec' => $d[5] );
+      }
+      $prevOffsetfrom    = $trans['offset'];
+      if( TRUE !== $trans['isdst'] ) {                           // standard timezone
+        if( !empty( $stdIx ) && isset( $transTemp[$stdIx]['offsetfrom'] )  && // check for any repeating rdate's (in order)
+           ( $transTemp[$stdIx]['abbr']       ==   $trans['abbr'] )        &&
+           ( $transTemp[$stdIx]['offsetfrom'] ==   $trans['offsetfrom'] )  &&
+           ( $transTemp[$stdIx]['offset']     ==   $trans['offset'] )) {
+          $transTemp[$stdIx]['rdate'][]        =   $trans['time'];
+          continue;
+        }
+        $stdIx           = $tix;
+      } // end standard timezone
+      else {                                                     // daylight timezone
+        if( !empty( $dlghtIx ) && isset( $transTemp[$dlghtIx]['offsetfrom'] ) && // check for any repeating rdate's (in order)
+           ( $transTemp[$dlghtIx]['abbr']       ==   $trans['abbr'] )         &&
+           ( $transTemp[$dlghtIx]['offsetfrom'] ==   $trans['offsetfrom'] )   &&
+           ( $transTemp[$dlghtIx]['offset']     ==   $trans['offset'] )) {
+          $transTemp[$dlghtIx]['rdate'][]        =   $trans['time'];
+          continue;
+        }
+        $dlghtIx         = $tix;
+      } // end daylight timezone
+      $transTemp[$tix]   = $trans;
+    } // end foreach( $transitions as $tix => $trans )
+    $tz  = & $calendar->newComponent( 'vtimezone' );
+    $tz->setproperty( 'tzid', $timezone );
+    if( !empty( $xProp )) {
+      foreach( $xProp as $xPropName => $xPropValue )
+        if( 'x-' == strtolower( substr( $xPropName, 0, 2 )))
+          $tz->setproperty( $xPropName, $xPropValue );
+    }
+    if( empty( $transTemp )) {      // if no match found
+      if( $prevTrans ) {            // then we use the last transition (before startdate) for the tz info
+        $date = new DateTime( "@{$prevTrans['ts']}" );           // set transition date (UTC)
+        $date->modify( $prevTrans['offsetfrom'].'seconds' );     // convert utc date to local date
+        $d = $date->format( 'Y-n-j-G-i-s' );                     // set date to array to ease up dtstart setting
+        $d = explode( '-', $d );
+        $prevTrans['time'] = array( 'year' => $d[0], 'month' => $d[1], 'day' => $d[2], 'hour' => $d[3], 'min' => $d[4], 'sec' => $d[5] );
+        $transTemp[0] = $prevTrans;
+      }
+      else {                        // or we use the timezone identifier to BUILD the standard tz info (?)
+        $date = new DateTime( 'now', new DateTimeZone( $timezone ));
+        $transTemp[0] = array( 'time'       => $date->format( 'Y-m-d\TH:i:s O' )
+                             , 'offset'     => $date->format( 'Z' )
+                             , 'offsetfrom' => $date->format( 'Z' )
+                             , 'isdst'      => FALSE );
+      }
+    }
+    unset( $transitions, $date, $prevTrans );
+    foreach( $transTemp as $tix => $trans ) {
+      $type  = ( TRUE !== $trans['isdst'] ) ? 'standard' : 'daylight';
+      $scomp = & $tz->newComponent( $type );
+      $scomp->setProperty( 'dtstart',         $trans['time'] );
+//      $scomp->setProperty( 'x-utc-timestamp', $tix.' : '.$trans['ts'] );   // test ###
+      if( !empty( $trans['abbr'] ))
+        $scomp->setProperty( 'tzname',        $trans['abbr'] );
+      if( isset( $trans['offsetfrom'] ))
+        $scomp->setProperty( 'tzoffsetfrom',  iCalUtilityFunctions::offsetSec2His( $trans['offsetfrom'] ));
+      $scomp->setProperty( 'tzoffsetto',      iCalUtilityFunctions::offsetSec2His( $trans['offset'] ));
+      if( isset( $trans['rdate'] ))
+        $scomp->setProperty( 'RDATE',         $trans['rdate'] );
+    }
+    return TRUE;
+  }
+/**
+ * creates formatted output for calendar component property data value type date/date-time
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.14.1 - 2012-09-17
+ * @param array   $datetime
+ * @param int     $parno, optional, default 6
+ * @return string
+ */
+  public static function _format_date_time( $datetime, $parno=6 ) {
+    return iCalUtilityFunctions::_date2strdate( $datetime, $parno );
+  }
+  public static function _date2strdate( $datetime, $parno=6 ) {
+    if( !isset( $datetime['year'] )  &&
+        !isset( $datetime['month'] ) &&
+        !isset( $datetime['day'] )   &&
+        !isset( $datetime['hour'] )  &&
+        !isset( $datetime['min'] )   &&
+        !isset( $datetime['sec'] ))
+      return;
+    $output     = null;
+    foreach( $datetime as $dkey => & $dvalue )
+      if( 'tz' != $dkey ) $dvalue = (integer) $dvalue;
+    $output = sprintf( '%04d%02d%02d', $datetime['year'], $datetime['month'], $datetime['day'] );
+    if( 3 == $parno )
+      return $output;
+    if( !isset( $datetime['hour'] )) $datetime['hour'] = 0;
+    if( !isset( $datetime['min'] ))  $datetime['min']  = 0;
+    if( !isset( $datetime['sec'] ))  $datetime['sec']  = 0;
+    $output    .= sprintf( 'T%02d%02d%02d', $datetime['hour'], $datetime['min'], $datetime['sec'] );
+    if( isset( $datetime['tz'] ) && ( '' < trim( $datetime['tz'] ))) {
+      $datetime['tz'] = trim( $datetime['tz'] );
+      if( 'Z'  == $datetime['tz'] )
+        $parno  = 7;
+      elseif( iCalUtilityFunctions::_isOffset( $datetime['tz'] )) {
+        $parno  = 7;
+        $offset = iCalUtilityFunctions::_tz2offset( $datetime['tz'] );
+        try {
+          $d    = new DateTime( $output, new DateTimeZone( 'UTC' ));
+          if( 0 != $offset ) // adjust för offset
+            $d->modify( "$offset seconds" );
+          $output = $d->format( 'Ymd\THis' );
+        }
+        catch( Exception $e ) {
+          $output = date( 'Ymd\THis', mktime( $datetime['hour'], $datetime['min'], ($datetime['sec'] - $offset), $datetime['month'], $datetime['day'], $datetime['year'] ));
+        }
+      }
+      if( 7 == $parno )
+        $output .= 'Z';
+    }
+    return $output;
+  }
+/**
+ * convert a date/datetime (array) to timestamp
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.14.1 - 2012-09-29
+ * @param array  $datetime  datetime(/date)
+ * @param string $wtz       timezone
+ * @return int
+ */
+  public static function _date2timestamp( $datetime, $wtz=null ) {
+    if( !isset( $datetime['hour'] )) $datetime['hour'] = 0;
+    if( !isset( $datetime['min'] ))  $datetime['min']  = 0;
+    if( !isset( $datetime['sec'] ))  $datetime['sec']  = 0;
+    if( empty( $wtz ) && ( !isset( $datetime['tz'] ) || empty(  $datetime['tz'] )))
+      return mktime( $datetime['hour'], $datetime['min'], $datetime['sec'], $datetime['month'], $datetime['day'], $datetime['year'] );
+    $output = $offset = 0;
+    if( empty( $wtz )) {
+      if( iCalUtilityFunctions::_isOffset( $datetime['tz'] )) {
+        $offset = iCalUtilityFunctions::_tz2offset( $datetime['tz'] ) * -1;
+        $wtz    = 'UTC';
+      }
+      else
+        $wtz    = $datetime['tz'];
+    }
+    if(( 'Z' == $wtz ) || ( 'GMT' == strtoupper( $wtz )))
+      $wtz      = 'UTC';
+    try {
+      $strdate  = sprintf( '%04d-%02d-%02d %02d:%02d:%02d', $datetime['year'], $datetime['month'], $datetime['day'], $datetime['hour'], $datetime['min'], $datetime['sec'] );
+      $d        = new DateTime( $strdate, new DateTimeZone( $wtz ));
+      if( 0    != $offset )  // adjust for offset
+        $d->modify( $offset.' seconds' );
+      $output   = $d->format( 'U' );
+      unset( $d );
+    }
+    catch( Exception $e ) {
+      $output = mktime( $datetime['hour'], $datetime['min'], $datetime['sec'], $datetime['month'], $datetime['day'], $datetime['year'] );
+    }
+    return $output;
+  }
+/**
+ * ensures internal duration format for input in array format
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.23 - 2013-06-23
+ * @param array $duration
+ * @return array
+ */
+  public static function _duration_array( $duration ) {
+    return iCalUtilityFunctions::_duration2arr( $duration );
+  }
+  public static function _duration2arr( $duration ) {
+    $seconds        = 0;
+    foreach( $duration as $durKey => $durValue ) {
+      if( empty( $durValue )) continue;
+      switch ( $durKey ) {
+        case '0': case 'week':
+          $seconds += (((int) $durValue ) * 60 * 60 * 24 * 7 );
+          break;
+        case '1': case 'day':
+          $seconds += (((int) $durValue ) * 60 * 60 * 24 );
+          break;
+        case '2': case 'hour':
+          $seconds += (((int) $durValue ) * 60 * 60 );
+          break;
+        case '3': case 'min':
+          $seconds += (((int) $durValue ) * 60 );
+          break;
+        case '4': case 'sec':
+          $seconds +=   (int) $durValue;
+          break;
+      }
+    }
+    $output         = array();
+    $output['week'] = (int) floor( $seconds / ( 60 * 60 * 24 * 7 ));
+    $seconds        =            ( $seconds % ( 60 * 60 * 24 * 7 ));
+    $output['day']  = (int) floor( $seconds / ( 60 * 60 * 24 ));
+    $seconds        =            ( $seconds % ( 60 * 60 * 24 ));
+    $output['hour'] = (int) floor( $seconds / ( 60 * 60 ));
+    $seconds        =            ( $seconds % ( 60 * 60 ));
+    $output['min']  = (int) floor( $seconds /   60 );
+    $output['sec']  =            ( $seconds %   60 );
+    if( !empty( $output['week'] ))
+      unset( $output['day'], $output['hour'], $output['min'], $output['sec'] );
+    else {
+      unset( $output['week'] );
+      if( empty( $output['day'] ))
+        unset( $output['day'] );
+      if(( 0 == $output['hour'] ) && ( 0 == $output['min'] ) && ( 0 == $output['sec'] ))
+        unset( $output['hour'], $output['min'], $output['sec'] );
+    }
+    return $output;
+  }
+/**
+ * convert startdate+duration to a array format datetime
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.15.12 - 2012-10-31
+ * @param array   $startdate
+ * @param array   $duration
+ * @return array, date format
+ */
+  public static function _duration2date( $startdate, $duration ) {
+    $dateOnly          = ( isset( $startdate['hour'] ) || isset( $startdate['min'] ) || isset( $startdate['sec'] )) ? FALSE : TRUE;
+    $startdate['hour'] = ( isset( $startdate['hour'] )) ? $startdate['hour'] : 0;
+    $startdate['min']  = ( isset( $startdate['min'] ))  ? $startdate['min']  : 0;
+    $startdate['sec']  = ( isset( $startdate['sec'] ))  ? $startdate['sec']  : 0;
+    $dtend = 0;
+    if(    isset( $duration['week'] )) $dtend += ( $duration['week'] * 7 * 24 * 60 * 60 );
+    if(    isset( $duration['day'] ))  $dtend += ( $duration['day'] * 24 * 60 * 60 );
+    if(    isset( $duration['hour'] )) $dtend += ( $duration['hour'] * 60 *60 );
+    if(    isset( $duration['min'] ))  $dtend += ( $duration['min'] * 60 );
+    if(    isset( $duration['sec'] ))  $dtend +=   $duration['sec'];
+    $date     = date( 'Y-m-d-H-i-s', mktime((int) $startdate['hour'], (int) $startdate['min'], (int) ( $startdate['sec'] + $dtend ), (int) $startdate['month'], (int) $startdate['day'], (int) $startdate['year'] ));
+    $d        = explode( '-', $date );
+    $dtend2   = array( 'year' => $d[0], 'month' => $d[1], 'day' => $d[2], 'hour' => $d[3], 'min' => $d[4], 'sec' => $d[5] );
+    if( isset( $startdate['tz'] ))
+      $dtend2['tz']   = $startdate['tz'];
+    if( $dateOnly && (( 0 == $dtend2['hour'] ) && ( 0 == $dtend2['min'] ) && ( 0 == $dtend2['sec'] )))
+      unset( $dtend2['hour'], $dtend2['min'], $dtend2['sec'] );
+    return $dtend2;
+  }
+/**
+ * ensures internal duration format for an input string (iCal) formatted duration
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.14.1 - 2012-09-25
+ * @param string $duration
+ * @return array
+ */
+  public static function _duration_string( $duration ) {
+    return iCalUtilityFunctions::_durationStr2arr( $duration );
+  }
+  public static function _durationStr2arr( $duration ) {
+    $duration = (string) trim( $duration );
+    while( 'P' != strtoupper( substr( $duration, 0, 1 ))) {
+      if( 0 < strlen( $duration ))
+        $duration = substr( $duration, 1 );
+      else
+        return false; // no leading P !?!?
+    }
+    $duration = substr( $duration, 1 ); // skip P
+    $duration = str_replace ( 't', 'T', $duration );
+    $duration = str_replace ( 'T', '', $duration );
+    $output = array();
+    $val    = null;
+    for( $ix=0; $ix < strlen( $duration ); $ix++ ) {
+      switch( strtoupper( substr( $duration, $ix, 1 ))) {
+       case 'W':
+         $output['week'] = $val;
+         $val            = null;
+         break;
+       case 'D':
+         $output['day']  = $val;
+         $val            = null;
+         break;
+       case 'H':
+         $output['hour'] = $val;
+         $val            = null;
+         break;
+       case 'M':
+         $output['min']  = $val;
+         $val            = null;
+         break;
+       case 'S':
+         $output['sec']  = $val;
+         $val            = null;
+         break;
+       default:
+         if( !ctype_digit( substr( $duration, $ix, 1 )))
+           return false; // unknown duration control character  !?!?
+         else
+           $val .= substr( $duration, $ix, 1 );
+      }
+    }
+    return iCalUtilityFunctions::_duration2arr( $output );
+  }
+/**
+ * creates formatted output for calendar component property data value type duration
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.15.8 - 2012-10-30
+ * @param array $duration, array( week, day, hour, min, sec )
+ * @return string
+ */
+  public static function _format_duration( $duration ) {
+    return iCalUtilityFunctions::_duration2str( $duration );
+  }
+  public static function _duration2str( $duration ) {
+    if( isset( $duration['week'] ) ||
+        isset( $duration['day'] )  ||
+        isset( $duration['hour'] ) ||
+        isset( $duration['min'] )  ||
+        isset( $duration['sec'] ))
+       $ok = TRUE;
+    else
+      return;
+    if( isset( $duration['week'] ) && ( 0 < $duration['week'] ))
+      return 'P'.$duration['week'].'W';
+    $output = 'P';
+    if( isset($duration['day'] ) && ( 0 < $duration['day'] ))
+      $output .= $duration['day'].'D';
+    if(( isset( $duration['hour']) && ( 0 < $duration['hour'] )) ||
+       ( isset( $duration['min'])  && ( 0 < $duration['min'] ))  ||
+       ( isset( $duration['sec'])  && ( 0 < $duration['sec'] ))) {
+      $output .= 'T';
+      $output .= ( isset( $duration['hour']) && ( 0 < $duration['hour'] )) ? $duration['hour'].'H' : '0H';
+      $output .= ( isset( $duration['min'])  && ( 0 < $duration['min'] ))  ? $duration['min']. 'M' : '0M';
+      $output .= ( isset( $duration['sec'])  && ( 0 < $duration['sec'] ))  ? $duration['sec']. 'S' : '0S';
+    }
+    if( 'P' == $output )
+      $output = 'PT0H0M0S';
+    return $output;
+  }
+/**
+ * removes expkey+expvalue from array and returns hitval (if found) else returns elseval
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.16 - 2008-11-08
+ * @param array $array
+ * @param string $expkey, expected key
+ * @param string $expval, expected value
+ * @param int $hitVal optional, return value if found
+ * @param int $elseVal optional, return value if not found
+ * @param int $preSet optional, return value if already preset
+ * @return int
+ */
+  public static function _existRem( &$array, $expkey, $expval=FALSE, $hitVal=null, $elseVal=null, $preSet=null ) {
+    if( $preSet )
+      return $preSet;
+    if( !is_array( $array ) || ( 0 == count( $array )))
+      return $elseVal;
+    foreach( $array as $key => $value ) {
+      if( strtoupper( $expkey ) == strtoupper( $key )) {
+        if( !$expval || ( strtoupper( $expval ) == strtoupper( $array[$key] ))) {
+          unset( $array[$key] );
+          return $hitVal;
+        }
+      }
+    }
+    return $elseVal;
+  }
+/**
+ * checks if input contains a (array formatted) date/time
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.24 - 2013-07-02
+ * @param array $input
+ * @return bool
+ */
+  public static function _isArrayDate( $input ) {
+    if( !is_array( $input ) || isset( $input['week'] ) || isset( $input['timestamp'] ) || ( 3 > count( $input )))
+      return FALSE;
+    if( 7 == count( $input ))
+      return TRUE;
+    if( isset( $input['year'] ) && isset( $input['month'] ) && isset( $input['day'] ))
+      return checkdate( (int) $input['month'], (int) $input['day'], (int) $input['year'] );
+    if( isset( $input['day'] ) || isset( $input['hour'] ) || isset( $input['min'] ) || isset( $input['sec'] ))
+      return FALSE;
+    if(( 0 == $input[0] ) || ( 0 == $input[1] ) || ( 0 == $input[2] ))
+      return FALSE;
+    if(( 1970 > $input[0] ) || ( 12 < $input[1] ) || ( 31 < $input[2] ))
+      return FALSE;
+    if(( isset( $input[0] ) && isset( $input[1] ) && isset( $input[2] )) &&
+         checkdate((int) $input[1], (int) $input[2], (int) $input[0] ))
+      return TRUE;
+    $input = iCalUtilityFunctions::_strdate2date( $input[1].'/'.$input[2].'/'.$input[0], 3 ); //  m - d - Y
+    if( isset( $input['year'] ) && isset( $input['month'] ) && isset( $input['day'] ))
+      return checkdate( (int) $input['month'], (int) $input['day'], (int) $input['year'] );
+    return FALSE;
+  }
+/**
+ * checks if input array contains a timestamp date
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.4.16 - 2008-10-18
+ * @param array $input
+ * @return bool
+ */
+  public static function _isArrayTimestampDate( $input ) {
+    return ( is_array( $input ) && isset( $input['timestamp'] )) ? TRUE : FALSE ;
+  }
+/**
+ * controls if input string contains (trailing) UTC/iCal offset
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.14.1 - 2012-09-21
+ * @param string $input
+ * @return bool
+ */
+  public static function _isOffset( $input ) {
+    $input         = trim( (string) $input );
+    if( 'Z' == substr( $input, -1 ))
+      return TRUE;
+    elseif((   5 <= strlen( $input )) &&
+       ( in_array( substr( $input, -5, 1 ), array( '+', '-' ))) &&
+       (   '0000' <= substr( $input, -4 )) && (   '9999' >= substr( $input, -4 )))
+      return TRUE;
+    elseif((    7 <= strlen( $input )) &&
+       ( in_array( substr( $input, -7, 1 ), array( '+', '-' ))) &&
+       ( '000000' <= substr( $input, -6 )) && ( '999999' >= substr( $input, -6 )))
+      return TRUE;
+    return FALSE;
+  }
+/**
+ * (very simple) conversion of a MS timezone to a PHP5 valid (Date-)timezone
+ * matching (MS) UCT offset and time zone descriptors
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.14.1 - 2012-09-16
+ * @param string $timezone, input/output variable reference
+ * @return bool
+ */
+  public static function ms2phpTZ( & $timezone ) {
+    if( empty( $timezone ))
+      return FALSE;
+    $search = str_replace( '"', '', $timezone );
+    $search = str_replace( array('GMT', 'gmt', 'utc' ), 'UTC', $search );
+    if( '(UTC' != substr( $search, 0, 4 ))
+      return FALSE;
+    if( FALSE === ( $pos = strpos( $search, ')' )))
+      return FALSE;
+    $pos    = strpos( $search, ')' );
+    $searchOffset = substr( $search, 4, ( $pos - 4 ));
+    $searchOffset = iCalUtilityFunctions::_tz2offset( str_replace( ':', '', $searchOffset ));
+    while( ' ' ==substr( $search, ( $pos + 1 )))
+      $pos += 1;
+    $searchText   = trim( str_replace( array( '(', ')', '&', ',', '  ' ), ' ', substr( $search, ( $pos + 1 )) ));
+    $searchWords  = explode( ' ', $searchText );
+    $timezone_abbreviations = DateTimeZone::listAbbreviations();
+    $hits = array();
+    foreach( $timezone_abbreviations as $name => $transitions ) {
+      foreach( $transitions as $cnt => $transition ) {
+        if( empty( $transition['offset'] )      ||
+            empty( $transition['timezone_id'] ) ||
+          ( $transition['offset'] != $searchOffset ))
+        continue;
+        $cWords = explode( '/', $transition['timezone_id'] );
+        $cPrio   = $hitCnt = $rank = 0;
+        foreach( $cWords as $cWord ) {
+          if( empty( $cWord ))
+            continue;
+          $cPrio += 1;
+          $sPrio  = 0;
+          foreach( $searchWords as $sWord ) {
+            if( empty( $sWord ) || ( 'time' == strtolower( $sWord )))
+              continue;
+            $sPrio += 1;
+            if( strtolower( $cWord ) == strtolower( $sWord )) {
+              $hitCnt += 1;
+              $rank   += ( $cPrio + $sPrio );
+            }
+            else
+              $rank += 10;
+          }
+        }
+        if( 0 < $hitCnt ) {
+          $hits[$rank][] = $transition['timezone_id'];
+        }
+      }
+    }
+    unset( $timezone_abbreviations );
+    if( empty( $hits ))
+      return FALSE;
+    ksort( $hits );
+    foreach( $hits as $rank => $tzs ) {
+      if( !empty( $tzs )) {
+        $timezone = reset( $tzs );
+        return TRUE;
+      }
+    }
+    return FALSE;
+  }
+/**
+ * transforms offset in seconds to [-/+]hhmm[ss]
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2011-05-02
+ * @param string $seconds
+ * @return string
+ */
+  public static function offsetSec2His( $seconds ) {
+    if( '-' == substr( $seconds, 0, 1 )) {
+      $prefix  = '-';
+      $seconds = substr( $seconds, 1 );
+    }
+    elseif( '+' == substr( $seconds, 0, 1 )) {
+      $prefix  = '+';
+      $seconds = substr( $seconds, 1 );
+    }
+    else
+      $prefix  = '+';
+    $output  = '';
+    $hour    = (int) floor( $seconds / 3600 );
+    if( 10 > $hour )
+      $hour  = '0'.$hour;
+    $seconds = $seconds % 3600;
+    $min     = (int) floor( $seconds / 60 );
+    if( 10 > $min )
+      $min   = '0'.$min;
+    $output  = $hour.$min;
+    $seconds = $seconds % 60;
+    if( 0 < $seconds) {
+      if( 9 < $seconds)
+        $output .= $seconds;
+      else
+        $output .= '0'.$seconds;
+    }
+    return $prefix.$output;
+  }
+/**
+ * updates an array with dates based on a recur pattern
+ *
+ * if missing, UNTIL is set 1 year from startdate (emergency break)
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.10.19 - 2011-10-31
+ * @param array $result, array to update, array([timestamp] => timestamp)
+ * @param array $recur, pattern for recurrency (only value part, params ignored)
+ * @param array $wdate, component start date
+ * @param array $startdate, start date
+ * @param array $enddate, optional
+ * @return void
+ * @todo BYHOUR, BYMINUTE, BYSECOND, WEEKLY at year end/start
+ */
+  public static function _recur2date( & $result, $recur, $wdate, $startdate, $enddate=FALSE ) {
+    foreach( $wdate as $k => $v ) if( ctype_digit( $v )) $wdate[$k] = (int) $v;
+    $wdateStart  = $wdate;
+    $wdatets     = iCalUtilityFunctions::_date2timestamp( $wdate );
+    $startdatets = iCalUtilityFunctions::_date2timestamp( $startdate );
+    if( !$enddate ) {
+      $enddate = $startdate;
+      $enddate['year'] += 1;
+    }
+// echo "recur __in_ comp start ".implode('-',$wdate)." period start ".implode('-',$startdate)." period end ".implode('-',$enddate)."<br>\n";print_r($recur);echo "<br>\n";//test###
+    $endDatets = iCalUtilityFunctions::_date2timestamp( $enddate ); // fix break
+    if( !isset( $recur['COUNT'] ) && !isset( $recur['UNTIL'] ))
+      $recur['UNTIL'] = $enddate; // create break
+    if( isset( $recur['UNTIL'] )) {
+      $tdatets = iCalUtilityFunctions::_date2timestamp( $recur['UNTIL'] );
+      if( $endDatets > $tdatets ) {
+        $endDatets = $tdatets; // emergency break
+        $enddate   = iCalUtilityFunctions::_timestamp2date( $endDatets, 6 );
+      }
+      else
+        $recur['UNTIL'] = iCalUtilityFunctions::_timestamp2date( $endDatets, 6 );
+    }
+    if( $wdatets > $endDatets ) {
+// echo "recur out of date ".date('Y-m-d H:i:s',$wdatets)."<br>\n";//test
+      return array(); // nothing to do.. .
+    }
+    if( !isset( $recur['FREQ'] )) // "MUST be specified.. ."
+      $recur['FREQ'] = 'DAILY'; // ??
+    $wkst = ( isset( $recur['WKST'] ) && ( 'SU' == $recur['WKST'] )) ? 24*60*60 : 0; // ??
+    $weekStart = (int) date( 'W', ( $wdatets + $wkst ));
+    if( !isset( $recur['INTERVAL'] ))
+      $recur['INTERVAL'] = 1;
+    $countcnt = ( !isset( $recur['BYSETPOS'] )) ? 1 : 0; // DTSTART counts as the first occurrence
+            /* find out how to step up dates and set index for interval count */
+    $step = array();
+    if( 'YEARLY' == $recur['FREQ'] )
+      $step['year']  = 1;
+    elseif( 'MONTHLY' == $recur['FREQ'] )
+      $step['month'] = 1;
+    elseif( 'WEEKLY' == $recur['FREQ'] )
+      $step['day']   = 7;
+    else
+      $step['day']   = 1;
+    if( isset( $step['year'] ) && isset( $recur['BYMONTH'] ))
+      $step = array( 'month' => 1 );
+    if( empty( $step ) && isset( $recur['BYWEEKNO'] )) // ??
+      $step = array( 'day' => 7 );
+    if( isset( $recur['BYYEARDAY'] ) || isset( $recur['BYMONTHDAY'] ) || isset( $recur['BYDAY'] ))
+      $step = array( 'day' => 1 );
+    $intervalarr = array();
+    if( 1 < $recur['INTERVAL'] ) {
+      $intervalix = iCalUtilityFunctions::_recurIntervalIx( $recur['FREQ'], $wdate, $wkst );
+      $intervalarr = array( $intervalix => 0 );
+    }
+    if( isset( $recur['BYSETPOS'] )) { // save start date + weekno
+      $bysetposymd1 = $bysetposymd2 = $bysetposw1 = $bysetposw2 = array();
+// echo "bysetposXold_start=$bysetposYold $bysetposMold $bysetposDold<br>\n"; // test ###
+      if( is_array( $recur['BYSETPOS'] )) {
+        foreach( $recur['BYSETPOS'] as $bix => $bval )
+          $recur['BYSETPOS'][$bix] = (int) $bval;
+      }
+      else
+        $recur['BYSETPOS'] = array( (int) $recur['BYSETPOS'] );
+      if( 'YEARLY' == $recur['FREQ'] ) {
+        $wdate['month'] = $wdate['day'] = 1; // start from beginning of year
+        $wdatets        = iCalUtilityFunctions::_date2timestamp( $wdate );
+        iCalUtilityFunctions::_stepdate( $enddate, $endDatets, array( 'year' => 1 )); // make sure to count whole last year
+      }
+      elseif( 'MONTHLY' == $recur['FREQ'] ) {
+        $wdate['day']   = 1; // start from beginning of month
+        $wdatets        = iCalUtilityFunctions::_date2timestamp( $wdate );
+        iCalUtilityFunctions::_stepdate( $enddate, $endDatets, array( 'month' => 1 )); // make sure to count whole last month
+      }
+      else
+        iCalUtilityFunctions::_stepdate( $enddate, $endDatets, $step); // make sure to count whole last period
+// echo "BYSETPOS endDat++ =".implode('-',$enddate).' step='.var_export($step,TRUE)."<br>\n";//test###
+      $bysetposWold = (int) date( 'W', ( $wdatets + $wkst ));
+      $bysetposYold = $wdate['year'];
+      $bysetposMold = $wdate['month'];
+      $bysetposDold = $wdate['day'];
+    }
+    else
+      iCalUtilityFunctions::_stepdate( $wdate, $wdatets, $step);
+    $year_old     = null;
+    $daynames     = array( 'SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA' );
+             /* MAIN LOOP */
+// echo "recur start ".implode('-',$wdate)." end ".implode('-',$enddate)."<br>\n";//test
+    while( TRUE ) {
+      if( isset( $endDatets ) && ( $wdatets > $endDatets ))
+        break;
+      if( isset( $recur['COUNT'] ) && ( $countcnt >= $recur['COUNT'] ))
+        break;
+      if( $year_old != $wdate['year'] ) {
+        $year_old   = $wdate['year'];
+        $daycnts    = array();
+        $yeardays   = $weekno = 0;
+        $yeardaycnt = array();
+        foreach( $daynames as $dn )
+          $yeardaycnt[$dn] = 0;
+        for( $m = 1; $m <= 12; $m++ ) { // count up and update up-counters
+          $daycnts[$m] = array();
+          $weekdaycnt = array();
+          foreach( $daynames as $dn )
+            $weekdaycnt[$dn] = 0;
+          $mcnt     = date( 't', mktime( 0, 0, 0, $m, 1, $wdate['year'] ));
+          for( $d   = 1; $d <= $mcnt; $d++ ) {
+            $daycnts[$m][$d] = array();
+            if( isset( $recur['BYYEARDAY'] )) {
+              $yeardays++;
+              $daycnts[$m][$d]['yearcnt_up'] = $yeardays;
+            }
+            if( isset( $recur['BYDAY'] )) {
+              $day    = date( 'w', mktime( 0, 0, 0, $m, $d, $wdate['year'] ));
+              $day    = $daynames[$day];
+              $daycnts[$m][$d]['DAY'] = $day;
+              $weekdaycnt[$day]++;
+              $daycnts[$m][$d]['monthdayno_up'] = $weekdaycnt[$day];
+              $yeardaycnt[$day]++;
+              $daycnts[$m][$d]['yeardayno_up'] = $yeardaycnt[$day];
+            }
+            if(  isset( $recur['BYWEEKNO'] ) || ( $recur['FREQ'] == 'WEEKLY' ))
+              $daycnts[$m][$d]['weekno_up'] =(int)date('W',mktime(0,0,$wkst,$m,$d,$wdate['year']));
+          }
+        }
+        $daycnt = 0;
+        $yeardaycnt = array();
+        if(  isset( $recur['BYWEEKNO'] ) || ( $recur['FREQ'] == 'WEEKLY' )) {
+          $weekno = null;
+          for( $d=31; $d > 25; $d-- ) { // get last weekno for year
+            if( !$weekno )
+              $weekno = $daycnts[12][$d]['weekno_up'];
+            elseif( $weekno < $daycnts[12][$d]['weekno_up'] ) {
+              $weekno = $daycnts[12][$d]['weekno_up'];
+              break;
+            }
+          }
+        }
+        for( $m = 12; $m > 0; $m-- ) { // count down and update down-counters
+          $weekdaycnt = array();
+          foreach( $daynames as $dn )
+            $yeardaycnt[$dn] = $weekdaycnt[$dn] = 0;
+          $monthcnt = 0;
+          $mcnt     = date( 't', mktime( 0, 0, 0, $m, 1, $wdate['year'] ));
+          for( $d   = $mcnt; $d > 0; $d-- ) {
+            if( isset( $recur['BYYEARDAY'] )) {
+              $daycnt -= 1;
+              $daycnts[$m][$d]['yearcnt_down'] = $daycnt;
+            }
+            if( isset( $recur['BYMONTHDAY'] )) {
+              $monthcnt -= 1;
+              $daycnts[$m][$d]['monthcnt_down'] = $monthcnt;
+            }
+            if( isset( $recur['BYDAY'] )) {
+              $day  = $daycnts[$m][$d]['DAY'];
+              $weekdaycnt[$day] -= 1;
+              $daycnts[$m][$d]['monthdayno_down'] = $weekdaycnt[$day];
+              $yeardaycnt[$day] -= 1;
+              $daycnts[$m][$d]['yeardayno_down'] = $yeardaycnt[$day];
+            }
+            if(  isset( $recur['BYWEEKNO'] ) || ( $recur['FREQ'] == 'WEEKLY' ))
+              $daycnts[$m][$d]['weekno_down'] = ($daycnts[$m][$d]['weekno_up'] - $weekno - 1);
+          }
+        }
+      }
+            /* check interval */
+      if( 1 < $recur['INTERVAL'] ) {
+            /* create interval index */
+        $intervalix = iCalUtilityFunctions::_recurIntervalIx( $recur['FREQ'], $wdate, $wkst );
+            /* check interval */
+        $currentKey = array_keys( $intervalarr );
+        $currentKey = end( $currentKey ); // get last index
+        if( $currentKey != $intervalix )
+          $intervalarr = array( $intervalix => ( $intervalarr[$currentKey] + 1 ));
+        if(( $recur['INTERVAL'] != $intervalarr[$intervalix] ) &&
+           ( 0 != $intervalarr[$intervalix] )) {
+            /* step up date */
+// echo "skip: ".implode('-',$wdate)." ix=$intervalix old=$currentKey interval=".$intervalarr[$intervalix]."<br>\n";//test
+          iCalUtilityFunctions::_stepdate( $wdate, $wdatets, $step);
+          continue;
+        }
+        else // continue within the selected interval
+          $intervalarr[$intervalix] = 0;
+// echo "cont: ".implode('-',$wdate)." ix=$intervalix old=$currentKey interval=".$intervalarr[$intervalix]."<br>\n";//test
+      }
+      $updateOK = TRUE;
+      if( $updateOK && isset( $recur['BYMONTH'] ))
+        $updateOK = iCalUtilityFunctions::_recurBYcntcheck( $recur['BYMONTH']
+                                           , $wdate['month']
+                                           ,($wdate['month'] - 13));
+      if( $updateOK && isset( $recur['BYWEEKNO'] ))
+        $updateOK = iCalUtilityFunctions::_recurBYcntcheck( $recur['BYWEEKNO']
+                                           , $daycnts[$wdate['month']][$wdate['day']]['weekno_up']
+                                           , $daycnts[$wdate['month']][$wdate['day']]['weekno_down'] );
+      if( $updateOK && isset( $recur['BYYEARDAY'] ))
+        $updateOK = iCalUtilityFunctions::_recurBYcntcheck( $recur['BYYEARDAY']
+                                           , $daycnts[$wdate['month']][$wdate['day']]['yearcnt_up']
+                                           , $daycnts[$wdate['month']][$wdate['day']]['yearcnt_down'] );
+      if( $updateOK && isset( $recur['BYMONTHDAY'] ))
+        $updateOK = iCalUtilityFunctions::_recurBYcntcheck( $recur['BYMONTHDAY']
+                                           , $wdate['day']
+                                           , $daycnts[$wdate['month']][$wdate['day']]['monthcnt_down'] );
+// echo "efter BYMONTHDAY: ".implode('-',$wdate).' status: '; echo ($updateOK) ? 'TRUE' : 'FALSE'; echo "<br>\n";//test###
+      if( $updateOK && isset( $recur['BYDAY'] )) {
+        $updateOK = FALSE;
+        $m = $wdate['month'];
+        $d = $wdate['day'];
+        if( isset( $recur['BYDAY']['DAY'] )) { // single day, opt with year/month day order no
+          $daynoexists = $daynosw = $daynamesw =  FALSE;
+          if( $recur['BYDAY']['DAY'] == $daycnts[$m][$d]['DAY'] )
+            $daynamesw = TRUE;
+          if( isset( $recur['BYDAY'][0] )) {
+            $daynoexists = TRUE;
+            if(( isset( $recur['FREQ'] ) && ( $recur['FREQ'] == 'MONTHLY' )) || isset( $recur['BYMONTH'] ))
+              $daynosw = iCalUtilityFunctions::_recurBYcntcheck( $recur['BYDAY'][0]
+                                                , $daycnts[$m][$d]['monthdayno_up']
+                                                , $daycnts[$m][$d]['monthdayno_down'] );
+            elseif( isset( $recur['FREQ'] ) && ( $recur['FREQ'] == 'YEARLY' ))
+              $daynosw = iCalUtilityFunctions::_recurBYcntcheck( $recur['BYDAY'][0]
+                                                , $daycnts[$m][$d]['yeardayno_up']
+                                                , $daycnts[$m][$d]['yeardayno_down'] );
+          }
+          if((  $daynoexists &&  $daynosw && $daynamesw ) ||
+             ( !$daynoexists && !$daynosw && $daynamesw )) {
+            $updateOK = TRUE;
+// echo "m=$m d=$d day=".$daycnts[$m][$d]['DAY']." yeardayno_up=".$daycnts[$m][$d]['yeardayno_up']." daynoexists:$daynoexists daynosw:$daynosw daynamesw:$daynamesw updateOK:$updateOK<br>\n"; // test ###
+          }
+// echo "m=$m d=$d day=".$daycnts[$m][$d]['DAY']." yeardayno_up=".$daycnts[$m][$d]['yeardayno_up']." daynoexists:$daynoexists daynosw:$daynosw daynamesw:$daynamesw updateOK:$updateOK<br>\n"; // test ###
+        }
+        else {
+          foreach( $recur['BYDAY'] as $bydayvalue ) {
+            $daynoexists = $daynosw = $daynamesw = FALSE;
+            if( isset( $bydayvalue['DAY'] ) &&
+                     ( $bydayvalue['DAY'] == $daycnts[$m][$d]['DAY'] ))
+              $daynamesw = TRUE;
+            if( isset( $bydayvalue[0] )) {
+              $daynoexists = TRUE;
+              if(( isset( $recur['FREQ'] ) && ( $recur['FREQ'] == 'MONTHLY' )) ||
+                   isset( $recur['BYMONTH'] ))
+                $daynosw = iCalUtilityFunctions::_recurBYcntcheck( $bydayvalue['0']
+                                                  , $daycnts[$m][$d]['monthdayno_up']
+                                                  , $daycnts[$m][$d]['monthdayno_down'] );
+              elseif( isset( $recur['FREQ'] ) && ( $recur['FREQ'] == 'YEARLY' ))
+                $daynosw = iCalUtilityFunctions::_recurBYcntcheck( $bydayvalue['0']
+                                                  , $daycnts[$m][$d]['yeardayno_up']
+                                                  , $daycnts[$m][$d]['yeardayno_down'] );
+            }
+// echo "daynoexists:$daynoexists daynosw:$daynosw daynamesw:$daynamesw<br>\n"; // test ###
+            if((  $daynoexists &&  $daynosw && $daynamesw ) ||
+               ( !$daynoexists && !$daynosw && $daynamesw )) {
+              $updateOK = TRUE;
+              break;
+            }
+          }
+        }
+      }
+// echo "efter BYDAY: ".implode('-',$wdate).' status: '; echo ($updateOK) ? 'TRUE' : 'FALSE'; echo "<br>\n"; // test ###
+            /* check BYSETPOS */
+      if( $updateOK ) {
+        if( isset( $recur['BYSETPOS'] ) &&
+          ( in_array( $recur['FREQ'], array( 'YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY' )))) {
+          if( isset( $recur['WEEKLY'] )) {
+            if( $bysetposWold == $daycnts[$wdate['month']][$wdate['day']]['weekno_up'] )
+              $bysetposw1[] = $wdatets;
+            else
+              $bysetposw2[] = $wdatets;
+          }
+          else {
+            if(( isset( $recur['FREQ'] ) && ( 'YEARLY'      == $recur['FREQ'] )  &&
+                                            ( $bysetposYold == $wdate['year'] ))   ||
+               ( isset( $recur['FREQ'] ) && ( 'MONTHLY'     == $recur['FREQ'] )  &&
+                                           (( $bysetposYold == $wdate['year'] )  &&
+                                            ( $bysetposMold == $wdate['month'] ))) ||
+               ( isset( $recur['FREQ'] ) && ( 'DAILY'       == $recur['FREQ'] )  &&
+                                           (( $bysetposYold == $wdate['year'] )  &&
+                                            ( $bysetposMold == $wdate['month'])  &&
+                                            ( $bysetposDold == $wdate['day'] )))) {
+// echo "bysetposymd1[]=".date('Y-m-d H:i:s',$wdatets)."<br>\n";//test
+              $bysetposymd1[] = $wdatets;
+            }
+            else {
+// echo "bysetposymd2[]=".date('Y-m-d H:i:s',$wdatets)."<br>\n";//test
+              $bysetposymd2[] = $wdatets;
+            }
+          }
+        }
+        else {
+            /* update result array if BYSETPOS is set */
+          $countcnt++;
+          if( $startdatets <= $wdatets ) { // only output within period
+            $result[$wdatets] = TRUE;
+// echo "recur ".date('Y-m-d H:i:s',$wdatets)."<br>\n";//test
+          }
+// echo "recur undate ".date('Y-m-d H:i:s',$wdatets)." okdatstart ".date('Y-m-d H:i:s',$startdatets)."<br>\n";//test
+          $updateOK = FALSE;
+        }
+      }
+            /* step up date */
+      iCalUtilityFunctions::_stepdate( $wdate, $wdatets, $step);
+            /* check if BYSETPOS is set for updating result array */
+      if( $updateOK && isset( $recur['BYSETPOS'] )) {
+        $bysetpos       = FALSE;
+        if( isset( $recur['FREQ'] ) && ( 'YEARLY'  == $recur['FREQ'] ) &&
+          ( $bysetposYold != $wdate['year'] )) {
+          $bysetpos     = TRUE;
+          $bysetposYold = $wdate['year'];
+        }
+        elseif( isset( $recur['FREQ'] ) && ( 'MONTHLY' == $recur['FREQ'] &&
+         (( $bysetposYold != $wdate['year'] ) || ( $bysetposMold != $wdate['month'] )))) {
+          $bysetpos     = TRUE;
+          $bysetposYold = $wdate['year'];
+          $bysetposMold = $wdate['month'];
+        }
+        elseif( isset( $recur['FREQ'] ) && ( 'WEEKLY'  == $recur['FREQ'] )) {
+          $weekno = (int) date( 'W', mktime( 0, 0, $wkst, $wdate['month'], $wdate['day'], $wdate['year']));
+          if( $bysetposWold != $weekno ) {
+            $bysetposWold = $weekno;
+            $bysetpos     = TRUE;
+          }
+        }
+        elseif( isset( $recur['FREQ'] ) && ( 'DAILY'   == $recur['FREQ'] ) &&
+         (( $bysetposYold != $wdate['year'] )  ||
+          ( $bysetposMold != $wdate['month'] ) ||
+          ( $bysetposDold != $wdate['day'] ))) {
+          $bysetpos     = TRUE;
+          $bysetposYold = $wdate['year'];
+          $bysetposMold = $wdate['month'];
+          $bysetposDold = $wdate['day'];
+        }
+        if( $bysetpos ) {
+          if( isset( $recur['BYWEEKNO'] )) {
+            $bysetposarr1 = & $bysetposw1;
+            $bysetposarr2 = & $bysetposw2;
+          }
+          else {
+            $bysetposarr1 = & $bysetposymd1;
+            $bysetposarr2 = & $bysetposymd2;
+          }
+// echo 'test före out startYMD (weekno)='.$wdateStart['year'].':'.$wdateStart['month'].':'.$wdateStart['day']." ($weekStart) "; // test ###
+          foreach( $recur['BYSETPOS'] as $ix ) {
+            if( 0 > $ix ) // both positive and negative BYSETPOS allowed
+              $ix = ( count( $bysetposarr1 ) + $ix + 1);
+            $ix--;
+            if( isset( $bysetposarr1[$ix] )) {
+              if( $startdatets <= $bysetposarr1[$ix] ) { // only output within period
+//                $testdate   = iCalUtilityFunctions::_timestamp2date( $bysetposarr1[$ix], 6 );                // test ###
+//                $testweekno = (int) date( 'W', mktime( 0, 0, $wkst, $testdate['month'], $testdate['day'], $testdate['year'] )); // test ###
+// echo " testYMD (weekno)=".$testdate['year'].':'.$testdate['month'].':'.$testdate['day']." ($testweekno)";   // test ###
+                $result[$bysetposarr1[$ix]] = TRUE;
+// echo " recur ".date('Y-m-d H:i:s',$bysetposarr1[$ix]); // test ###
+              }
+              $countcnt++;
+            }
+            if( isset( $recur['COUNT'] ) && ( $countcnt >= $recur['COUNT'] ))
+              break;
+          }
+// echo "<br>\n"; // test ###
+          $bysetposarr1 = $bysetposarr2;
+          $bysetposarr2 = array();
+        }
+      }
+    }
+  }
+  public static function _recurBYcntcheck( $BYvalue, $upValue, $downValue ) {
+    if( is_array( $BYvalue ) &&
+      ( in_array( $upValue, $BYvalue ) || in_array( $downValue, $BYvalue )))
+      return TRUE;
+    elseif(( $BYvalue == $upValue ) || ( $BYvalue == $downValue ))
+      return TRUE;
+    else
+      return FALSE;
+  }
+  public static function _recurIntervalIx( $freq, $date, $wkst ) {
+            /* create interval index */
+    switch( $freq ) {
+      case 'YEARLY':
+        $intervalix = $date['year'];
+        break;
+      case 'MONTHLY':
+        $intervalix = $date['year'].'-'.$date['month'];
+        break;
+      case 'WEEKLY':
+        $wdatets    = iCalUtilityFunctions::_date2timestamp( $date );
+        $intervalix = (int) date( 'W', ( $wdatets + $wkst ));
+       break;
+      case 'DAILY':
+           default:
+        $intervalix = $date['year'].'-'.$date['month'].'-'.$date['day'];
+        break;
+    }
+    return $intervalix;
+  }
+  public static function _recurBydaySort( $bydaya, $bydayb ) {
+    static $days = array( 'SU' => 0, 'MO' => 1, 'TU' => 2, 'WE' => 3, 'TH' => 4, 'FR' => 5, 'SA' => 6 );
+    return ( $days[substr( $bydaya, -2 )] < $days[substr( $bydayb, -2 )] ) ? -1 : 1;
+  }
+/**
+ * convert input format for exrule and rrule to internal format
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.14.1 - 2012-09-24
+ * @param array $rexrule
+ * @return array
+ */
+  public static function _setRexrule( $rexrule ) {
+    $input          = array();
+    if( empty( $rexrule ))
+      return $input;
+    foreach( $rexrule as $rexrulelabel => $rexrulevalue ) {
+      $rexrulelabel = strtoupper( $rexrulelabel );
+      if( 'UNTIL'  != $rexrulelabel )
+        $input[$rexrulelabel]   = $rexrulevalue;
+      else {
+        iCalUtilityFunctions::_strDate2arr( $rexrulevalue );
+        if( iCalUtilityFunctions::_isArrayTimestampDate( $rexrulevalue )) // timestamp, always date-time UTC
+          $input[$rexrulelabel] = iCalUtilityFunctions::_timestamp2date( $rexrulevalue, 7, 'UTC' );
+        elseif( iCalUtilityFunctions::_isArrayDate( $rexrulevalue )) { // date or UTC date-time
+          $parno = ( isset( $rexrulevalue['hour'] ) || isset( $rexrulevalue[4] )) ? 7 : 3;
+          $d = iCalUtilityFunctions::_chkDateArr( $rexrulevalue, $parno );
+          if(( 3 < $parno ) && isset( $d['tz'] ) && ( 'Z' != $d['tz'] ) && iCalUtilityFunctions::_isOffset( $d['tz'] )) {
+            $strdate              = sprintf( '%04d-%02d-%02d %02d:%02d:%02d %s', $d['year'], $d['month'], $d['day'], $d['hour'], $d['min'], $d['sec'], $d['tz'] );
+            $input[$rexrulelabel] = iCalUtilityFunctions::_strdate2date( $strdate, 7 );
+            unset( $input[$rexrulelabel]['unparsedtext'] );
+          }
+          else
+           $input[$rexrulelabel] = $d;
+        }
+        elseif( 8 <= strlen( trim( $rexrulevalue ))) { // ex. textual date-time 2006-08-03 10:12:18 => UTC
+          $input[$rexrulelabel] = iCalUtilityFunctions::_strdate2date( $rexrulevalue );
+          unset( $input['$rexrulelabel']['unparsedtext'] );
+        }
+        if(( 3 < count( $input[$rexrulelabel] )) && !isset( $input[$rexrulelabel]['tz'] ))
+          $input[$rexrulelabel]['tz'] = 'Z';
+      }
+    }
+            /* set recurrence rule specification in rfc2445 order */
+    $input2 = array();
+    if( isset( $input['FREQ'] ))
+      $input2['FREQ']       = $input['FREQ'];
+    if( isset( $input['UNTIL'] ))
+      $input2['UNTIL']      = $input['UNTIL'];
+    elseif( isset( $input['COUNT'] ))
+      $input2['COUNT']      = $input['COUNT'];
+    if( isset( $input['INTERVAL'] ))
+      $input2['INTERVAL']   = $input['INTERVAL'];
+    if( isset( $input['BYSECOND'] ))
+      $input2['BYSECOND']   = $input['BYSECOND'];
+    if( isset( $input['BYMINUTE'] ))
+      $input2['BYMINUTE']   = $input['BYMINUTE'];
+    if( isset( $input['BYHOUR'] ))
+      $input2['BYHOUR']     = $input['BYHOUR'];
+    if( isset( $input['BYDAY'] )) {
+      if( !is_array( $input['BYDAY'] )) // ensure upper case.. .
+        $input2['BYDAY']    = strtoupper( $input['BYDAY'] );
+      else {
+        foreach( $input['BYDAY'] as $BYDAYx => $BYDAYv ) {
+          if( 'DAY'        == strtoupper( $BYDAYx ))
+             $input2['BYDAY']['DAY'] = strtoupper( $BYDAYv );
+          elseif( !is_array( $BYDAYv )) {
+             $input2['BYDAY'][$BYDAYx]  = $BYDAYv;
+          }
+          else {
+            foreach( $BYDAYv as $BYDAYx2 => $BYDAYv2 ) {
+              if( 'DAY'    == strtoupper( $BYDAYx2 ))
+                 $input2['BYDAY'][$BYDAYx]['DAY'] = strtoupper( $BYDAYv2 );
+              else
+                 $input2['BYDAY'][$BYDAYx][$BYDAYx2] = $BYDAYv2;
+            }
+          }
+        }
+      }
+    }
+    if( isset( $input['BYMONTHDAY'] ))
+      $input2['BYMONTHDAY'] = $input['BYMONTHDAY'];
+    if( isset( $input['BYYEARDAY'] ))
+      $input2['BYYEARDAY']  = $input['BYYEARDAY'];
+    if( isset( $input['BYWEEKNO'] ))
+      $input2['BYWEEKNO']   = $input['BYWEEKNO'];
+    if( isset( $input['BYMONTH'] ))
+      $input2['BYMONTH']    = $input['BYMONTH'];
+    if( isset( $input['BYSETPOS'] ))
+      $input2['BYSETPOS']   = $input['BYSETPOS'];
+    if( isset( $input['WKST'] ))
+      $input2['WKST']       = $input['WKST'];
+    return $input2;
+  }
+/**
+ * convert format for input date to internal date with parameters
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.24 - 2013-06-26
+ * @param mixed  $year
+ * @param mixed  $month   optional
+ * @param int    $day     optional
+ * @param int    $hour    optional
+ * @param int    $min     optional
+ * @param int    $sec     optional
+ * @param string $tz      optional
+ * @param array  $params  optional
+ * @param string $caller  optional
+ * @param string $objName optional
+ * @param string $tzid    optional
+ * @return array
+ */
+  public static function _setDate( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $tz=FALSE, $params=FALSE, $caller=null, $objName=null, $tzid=FALSE ) {
+    $input = $parno = null;
+    $localtime = (( 'dtstart' == $caller ) && in_array( $objName, array( 'vtimezone', 'standard', 'daylight' ))) ? TRUE : FALSE;
+    iCalUtilityFunctions::_strDate2arr( $year );
+    if( iCalUtilityFunctions::_isArrayDate( $year )) {
+      $input['value']  = iCalUtilityFunctions::_chkDateArr( $year, FALSE ); //$parno );
+      if( 100 > $input['value']['year'] )
+        $input['value']['year'] += 2000;
+      if( $localtime )
+        unset( $month['VALUE'], $month['TZID'] );
+      elseif( !isset( $month['TZID'] ) && isset( $tzid ))
+        $month['TZID'] = $tzid;
+      if( isset( $input['value']['tz'] ) && iCalUtilityFunctions::_isOffset( $input['value']['tz'] ))
+        unset( $month['TZID'] );
+      elseif( !isset( $input['value']['tz'] ) &&  isset( $month['TZID'] ) && iCalUtilityFunctions::_isOffset( $month['TZID'] )) {
+        $input['value']['tz'] = $month['TZID'];
+        unset( $month['TZID'] );
+      }
+      $input['params'] = iCalUtilityFunctions::_setParams( $month, array( 'VALUE' => 'DATE-TIME' ));
+      $hitval          = ( isset( $input['value']['tz'] )) ? 7 : 6;
+      $parno           = iCalUtilityFunctions::_existRem( $input['params'], 'VALUE', 'DATE-TIME', $hitval );
+      $parno           = iCalUtilityFunctions::_existRem( $input['params'], 'VALUE', 'DATE', 3, count( $input['value'] ), $parno );
+      if( 6 > $parno )
+        unset( $input['value']['tz'], $input['params']['TZID'], $tzid );
+      if(( 6 <= $parno ) && isset( $input['value']['tz'] ) && ( 'Z' != $input['value']['tz'] ) && iCalUtilityFunctions::_isOffset( $input['value']['tz'] )) {
+        $d             = $input['value'];
+        $strdate       = sprintf( '%04d-%02d-%02d %02d:%02d:%02d %s', $d['year'], $d['month'], $d['day'], $d['hour'], $d['min'], $d['sec'], $d['tz'] );
+        $input['value'] = iCalUtilityFunctions::_strdate2date( $strdate, $parno );
+        unset( $input['value']['unparsedtext'], $input['params']['TZID'] );
+      }
+      if( isset( $input['value']['tz'] ) && !iCalUtilityFunctions::_isOffset( $input['value']['tz'] )) {
+        $input['params']['TZID'] = $input['value']['tz'];
+        unset( $input['value']['tz'] );
+      }
+    } // end if( iCalUtilityFunctions::_isArrayDate( $year ))
+    elseif( iCalUtilityFunctions::_isArrayTimestampDate( $year )) {
+      if( $localtime ) unset ( $month['VALUE'], $month['TZID'] );
+      $input['params'] = iCalUtilityFunctions::_setParams( $month, array( 'VALUE' => 'DATE-TIME' ));
+      $parno           = iCalUtilityFunctions::_existRem( $input['params'], 'VALUE', 'DATE', 3 );
+      $hitval          = 7;
+      $parno           = iCalUtilityFunctions::_existRem( $input['params'], 'VALUE', 'DATE-TIME', $hitval, $parno );
+      if( isset( $year['tz'] ) && !empty( $year['tz'] )) {
+        if( !iCalUtilityFunctions::_isOffset( $year['tz'] )) {
+          $input['params']['TZID'] = $year['tz'];
+          unset( $year['tz'], $tzid );
+        }
+        else {
+          if( isset( $input['params']['TZID'] ) && !empty( $input['params']['TZID'] )) {
+            if( !iCalUtilityFunctions::_isOffset( $input['params']['TZID'] ))
+              unset( $tzid );
+            else
+              unset( $input['params']['TZID']);
+          }
+          elseif( isset( $tzid ) && !iCalUtilityFunctions::_isOffset( $tzid ))
+            $input['params']['TZID'] = $tzid;
+        }
+      }
+      elseif( isset( $input['params']['TZID'] ) && !empty( $input['params']['TZID'] )) {
+        if( iCalUtilityFunctions::_isOffset( $input['params']['TZID'] )) {
+          $year['tz'] = $input['params']['TZID'];
+          unset( $input['params']['TZID']);
+          if( isset( $tzid ) && !empty( $tzid ) && !iCalUtilityFunctions::_isOffset( $tzid ))
+            $input['params']['TZID'] = $tzid;
+        }
+      }
+      elseif( isset( $tzid ) && !empty( $tzid )) {
+        if( iCalUtilityFunctions::_isOffset( $tzid )) {
+          $year['tz'] = $tzid;
+          unset( $input['params']['TZID']);
+        }
+        else
+          $input['params']['TZID'] = $tzid;
+      }
+      $input['value']  = iCalUtilityFunctions::_timestamp2date( $year, $parno );
+    } // end elseif( iCalUtilityFunctions::_isArrayTimestampDate( $year ))
+    elseif( 8 <= strlen( trim( $year ))) { // ex. 2006-08-03 10:12:18 [[[+/-]1234[56]] / timezone]
+      if( $localtime )
+        unset( $month['VALUE'], $month['TZID'] );
+      elseif( !isset( $month['TZID'] ) && !empty( $tzid ))
+        $month['TZID'] = $tzid;
+      $input['params'] = iCalUtilityFunctions::_setParams( $month, array( 'VALUE' => 'DATE-TIME' ));
+      $parno           = iCalUtilityFunctions::_existRem( $input['params'], 'VALUE', 'DATE-TIME', 7, $parno );
+      $parno           = iCalUtilityFunctions::_existRem( $input['params'], 'VALUE', 'DATE', 3, $parno, $parno );
+      $input['value']  = iCalUtilityFunctions::_strdate2date( $year, $parno );
+      if( 3 == $parno )
+        unset( $input['value']['tz'], $input['params']['TZID'] );
+      unset( $input['value']['unparsedtext'] );
+      if( isset( $input['value']['tz'] )) {
+        if( iCalUtilityFunctions::_isOffset( $input['value']['tz'] )) {
+          $d           = $input['value'];
+          $strdate     = sprintf( '%04d-%02d-%02d %02d:%02d:%02d %s', $d['year'], $d['month'], $d['day'], $d['hour'], $d['min'], $d['sec'], $d['tz'] );
+          $input['value'] = iCalUtilityFunctions::_strdate2date( $strdate, 7 );
+          unset( $input['value']['unparsedtext'], $input['params']['TZID'] );
+        }
+        else {
+          $input['params']['TZID'] = $input['value']['tz'];
+          unset( $input['value']['tz'] );
+        }
+      }
+      elseif( isset( $input['params']['TZID'] ) && iCalUtilityFunctions::_isOffset( $input['params']['TZID'] )) {
+        $d             = $input['value'];
+        $strdate       = sprintf( '%04d-%02d-%02d %02d:%02d:%02d %s', $d['year'], $d['month'], $d['day'], $d['hour'], $d['min'], $d['sec'], $input['params']['TZID'] );
+        $input['value'] = iCalUtilityFunctions::_strdate2date( $strdate, 7 );
+        unset( $input['value']['unparsedtext'], $input['params']['TZID'] );
+      }
+    } // end elseif( 8 <= strlen( trim( $year )))
+    else {
+      if( is_array( $params ))
+        $input['params'] = iCalUtilityFunctions::_setParams( $params, array( 'VALUE' => 'DATE-TIME' ));
+      elseif( is_array( $tz )) {
+        $input['params'] = iCalUtilityFunctions::_setParams( $tz,     array( 'VALUE' => 'DATE-TIME' ));
+        $tz = FALSE;
+      }
+      elseif( is_array( $hour )) {
+        $input['params'] = iCalUtilityFunctions::_setParams( $hour,   array( 'VALUE' => 'DATE-TIME' ));
+        $hour = $min = $sec = $tz = FALSE;
+      }
+      if( $localtime )
+        unset ( $input['params']['VALUE'], $input['params']['TZID'] );
+      elseif( !isset( $tz ) && !isset( $input['params']['TZID'] ) && !empty( $tzid ))
+        $input['params']['TZID'] = $tzid;
+      elseif( isset( $tz ) && iCalUtilityFunctions::_isOffset( $tz ))
+        unset( $input['params']['TZID'] );
+      elseif( isset( $input['params']['TZID'] ) && iCalUtilityFunctions::_isOffset( $input['params']['TZID'] )) {
+        $tz            = $input['params']['TZID'];
+        unset( $input['params']['TZID'] );
+      }
+      $parno           = iCalUtilityFunctions::_existRem( $input['params'], 'VALUE', 'DATE', 3 );
+      $hitval          = ( iCalUtilityFunctions::_isOffset( $tz )) ? 7 : 6;
+      $parno           = iCalUtilityFunctions::_existRem( $input['params'], 'VALUE', 'DATE-TIME', $hitval, $parno, $parno );
+      $input['value']  = array( 'year'  => $year, 'month' => $month, 'day'   => $day );
+      if( 3 != $parno ) {
+        $input['value']['hour'] = ( $hour ) ? $hour : '0';
+        $input['value']['min']  = ( $min )  ? $min  : '0';
+        $input['value']['sec']  = ( $sec )  ? $sec  : '0';
+        if( !empty( $tz ))
+          $input['value']['tz'] = $tz;
+        $strdate       = iCalUtilityFunctions::_date2strdate( $input['value'], $parno );
+        if( !empty( $tz ) && !iCalUtilityFunctions::_isOffset( $tz ))
+          $strdate    .= ( 'Z' == $tz ) ? $tz : ' '.$tz;
+        $input['value'] = iCalUtilityFunctions::_strdate2date( $strdate, $parno );
+        unset( $input['value']['unparsedtext'] );
+        if( isset( $input['value']['tz'] )) {
+          if( iCalUtilityFunctions::_isOffset( $input['value']['tz'] )) {
+            $d           = $input['value'];
+            $strdate     = sprintf( '%04d-%02d-%02d %02d:%02d:%02d %s', $d['year'], $d['month'], $d['day'], $d['hour'], $d['min'], $d['sec'], $d['tz'] );
+            $input['value'] = iCalUtilityFunctions::_strdate2date( $strdate, 7 );
+            unset( $input['value']['unparsedtext'], $input['params']['TZID'] );
+          }
+          else {
+            $input['params']['TZID'] = $input['value']['tz'];
+            unset( $input['value']['tz'] );
+          }
+        }
+        elseif( isset( $input['params']['TZID'] ) && iCalUtilityFunctions::_isOffset( $input['params']['TZID'] )) {
+          $d             = $input['value'];
+          $strdate       = sprintf( '%04d-%02d-%02d %02d:%02d:%02d %s', $d['year'], $d['month'], $d['day'], $d['hour'], $d['min'], $d['sec'], $input['params']['TZID'] );
+          $input['value'] = iCalUtilityFunctions::_strdate2date( $strdate, 7 );
+          unset( $input['value']['unparsedtext'], $input['params']['TZID'] );
+        }
+      }
+    } // end else (i.e. using all arguments)
+    if(( 3 == $parno ) || ( isset( $input['params']['VALUE'] ) && ( 'DATE' == $input['params']['VALUE'] ))) {
+      $input['params']['VALUE'] = 'DATE';
+      unset( $input['value']['hour'], $input['value']['min'], $input['value']['sec'], $input['value']['tz'], $input['params']['TZID'] );
+    }
+    elseif( isset( $input['params']['TZID'] )) {
+      if(( 'UTC' == strtoupper( $input['params']['TZID'] )) || ( 'GMT' == strtoupper( $input['params']['TZID'] ))) {
+        $input['value']['tz'] = 'Z';
+        unset( $input['params']['TZID'] );
+      }
+      else
+        unset( $input['value']['tz'] );
+    }
+    elseif( isset( $input['value']['tz'] )) {
+      if(( 'UTC' == strtoupper( $input['value']['tz'] )) || ( 'GMT' == strtoupper( $input['value']['tz'] )))
+        $input['value']['tz'] = 'Z';
+      if( 'Z' != $input['value']['tz'] ) {
+        $input['params']['TZID'] = $input['value']['tz'];
+        unset( $input['value']['tz'] );
+      }
+      else
+        unset( $input['params']['TZID'] );
+    }
+    if( $localtime )
+      unset( $input['value']['tz'], $input['params']['TZID'] );
+    return $input;
+  }
+/**
+ * convert format for input date (UTC) to internal date with parameters
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.24 - 2013-07-01
+ * @param mixed $year
+ * @param mixed $month  optional
+ * @param int   $day    optional
+ * @param int   $hour   optional
+ * @param int   $min    optional
+ * @param int   $sec    optional
+ * @param array $params optional
+ * @return array
+ */
+  public static function _setDate2( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $params=FALSE ) {
+    $input = null;
+    iCalUtilityFunctions::_strDate2arr( $year );
+    if( iCalUtilityFunctions::_isArrayDate( $year )) {
+      $input['value']  = iCalUtilityFunctions::_chkDateArr( $year, 7 );
+      if( isset( $input['value']['year'] ) && ( 100 > $input['value']['year'] ))
+        $input['value']['year'] += 2000;
+      $input['params'] = iCalUtilityFunctions::_setParams( $month, array( 'VALUE' => 'DATE-TIME' ));
+      unset( $input['params']['VALUE']  );
+      if( isset( $input['value']['tz'] ) && iCalUtilityFunctions::_isOffset( $input['value']['tz'] ))
+        $tzid = $input['value']['tz'];
+      elseif( isset( $input['params']['TZID'] ) && iCalUtilityFunctions::_isOffset( $input['params']['TZID'] ))
+        $tzid = $input['params']['TZID'];
+      else
+        $tzid = '';
+      unset( $input['params']['VALUE'], $input['params']['TZID']  );
+      if( !empty( $tzid ) && ( 'Z' != $tzid ) && iCalUtilityFunctions::_isOffset( $tzid )) {
+        $d             = $input['value'];
+        $strdate       = sprintf( '%04d-%02d-%02d %02d:%02d:%02d %s', $d['year'], $d['month'], $d['day'], $d['hour'], $d['min'], $d['sec'], $tzid );
+        $input['value'] = iCalUtilityFunctions::_strdate2date( $strdate, 7 );
+        unset( $input['value']['unparsedtext'] );
+      }
+    }
+    elseif( iCalUtilityFunctions::_isArrayTimestampDate( $year )) {
+      if( isset( $year['tz'] ) && ! iCalUtilityFunctions::_isOffset( $year['tz'] ))
+        $year['tz']    = 'UTC';
+      elseif( isset( $input['params']['TZID'] ) && iCalUtilityFunctions::_isOffset( $input['params']['TZID'] ))
+        $year['tz']    = $input['params']['TZID'];
+      else
+        $year['tz']    = 'UTC';
+      $input['value']  = iCalUtilityFunctions::_timestamp2date( $year, 7 );
+      $input['params'] = iCalUtilityFunctions::_setParams( $month, array( 'VALUE' => 'DATE-TIME' ));
+      unset( $input['params']['VALUE'], $input['params']['TZID']  );
+    }
+    elseif( 8 <= strlen( trim( $year ))) { // ex. 2006-08-03 10:12:18
+      $input['value']  = iCalUtilityFunctions::_strdate2date( $year, 7 );
+      unset( $input['value']['unparsedtext'] );
+      $input['params'] = iCalUtilityFunctions::_setParams( $month, array( 'VALUE' => 'DATE-TIME' ));
+      if(( !isset( $input['value']['tz'] ) || empty( $input['value']['tz'] )) && isset( $input['params']['TZID'] ) && iCalUtilityFunctions::_isOffset( $input['params']['TZID'] )) {
+        $d             = $input['value'];
+        $strdate       = sprintf( '%04d-%02d-%02d %02d:%02d:%02d %s', $d['year'], $d['month'], $d['day'], $d['hour'], $d['min'], $d['sec'], $input['params']['TZID'] );
+        $input['value'] = iCalUtilityFunctions::_strdate2date( $strdate, 7 );
+        unset( $input['value']['unparsedtext'] );
+      }
+      unset( $input['params']['VALUE'], $input['params']['TZID']  );
+    }
+    else {
+      $input['value']  = array( 'year'  => $year
+                              , 'month' => $month
+                              , 'day'   => $day
+                              , 'hour'  => $hour
+                              , 'min'   => $min
+                              , 'sec'   => $sec );
+      if(  isset( $tz )) $input['value']['tz'] = $tz;
+      if(( isset( $tz ) && iCalUtilityFunctions::_isOffset( $tz )) ||
+         ( isset( $input['params']['TZID'] ) && iCalUtilityFunctions::_isOffset( $input['params']['TZID'] ))) {
+          if( !isset( $tz ) && isset( $input['params']['TZID'] ) && iCalUtilityFunctions::_isOffset( $input['params']['TZID'] ))
+            $input['value']['tz'] = $input['params']['TZID'];
+          unset( $input['params']['TZID'] );
+        $strdate        = iCalUtilityFunctions::_date2strdate( $input['value'], 7 );
+        $input['value'] = iCalUtilityFunctions::_strdate2date( $strdate, 7 );
+        unset( $input['value']['unparsedtext'] );
+      }
+      $input['params'] = iCalUtilityFunctions::_setParams( $params, array( 'VALUE' => 'DATE-TIME' ));
+      unset( $input['params']['VALUE']  );
+    }
+    $parno = iCalUtilityFunctions::_existRem( $input['params'], 'VALUE', 'DATE-TIME', 7 ); // remove default
+    if( !isset( $input['value']['hour'] )) $input['value']['hour'] = 0;
+    if( !isset( $input['value']['min'] ))  $input['value']['min']  = 0;
+    if( !isset( $input['value']['sec'] ))  $input['value']['sec']  = 0;
+    $input['value']['tz'] = 'Z';
+    return $input;
+  }
+/**
+ * check index and set (an indexed) content in multiple value array
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.6.12 - 2011-01-03
+ * @param array $valArr
+ * @param mixed $value
+ * @param array $params
+ * @param array $defaults
+ * @param int $index
+ * @return void
+ */
+  public static function _setMval( & $valArr, $value, $params=FALSE, $defaults=FALSE, $index=FALSE ) {
+    if( !is_array( $valArr )) $valArr = array();
+    if( $index )
+      $index = $index - 1;
+    elseif( 0 < count( $valArr )) {
+      $keys  = array_keys( $valArr );
+      $index = end( $keys ) + 1;
+    }
+    else
+      $index = 0;
+    $valArr[$index] = array( 'value' => $value, 'params' => iCalUtilityFunctions::_setParams( $params, $defaults ));
+    ksort( $valArr );
+  }
+/**
+ * set input (formatted) parameters- component property attributes
+ *
+ * default parameters can be set, if missing
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 1.x.x - 2007-05-01
+ * @param array $params
+ * @param array $defaults
+ * @return array
+ */
+  public static function _setParams( $params, $defaults=FALSE ) {
+    if( !is_array( $params))
+      $params = array();
+    $input = array();
+    foreach( $params as $paramKey => $paramValue ) {
+      if( is_array( $paramValue )) {
+        foreach( $paramValue as $pkey => $pValue ) {
+          if(( '"' == substr( $pValue, 0, 1 )) && ( '"' == substr( $pValue, -1 )))
+            $paramValue[$pkey] = substr( $pValue, 1, ( strlen( $pValue ) - 2 ));
+        }
+      }
+      elseif(( '"' == substr( $paramValue, 0, 1 )) && ( '"' == substr( $paramValue, -1 )))
+        $paramValue = substr( $paramValue, 1, ( strlen( $paramValue ) - 2 ));
+      if( 'VALUE' == strtoupper( $paramKey ))
+        $input['VALUE']                 = strtoupper( $paramValue );
+      else
+        $input[strtoupper( $paramKey )] = $paramValue;
+    }
+    if( is_array( $defaults )) {
+      foreach( $defaults as $paramKey => $paramValue ) {
+        if( !isset( $input[$paramKey] ))
+          $input[$paramKey] = $paramValue;
+      }
+    }
+    return (0 < count( $input )) ? $input : null;
+  }
+/**
+ * break lines at pos 75
+ *
+ * Lines of text SHOULD NOT be longer than 75 octets, excluding the line
+ * break. Long content lines SHOULD be split into a multiple line
+ * representations using a line "folding" technique. That is, a long
+ * line can be split between any two characters by inserting a CRLF
+ * immediately followed by a single linear white space character (i.e.,
+ * SPACE, US-ASCII decimal 32 or HTAB, US-ASCII decimal 9). Any sequence
+ * of CRLF followed immediately by a single linear white space character
+ * is ignored (i.e., removed) when processing the content type.
+ *
+ * Edited 2007-08-26 by Anders Litzell, anders@litzell.se to fix bug where
+ * the reserved expression "\n" in the arg $string could be broken up by the
+ * folding of lines, causing ambiguity in the return string.
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @param string $value
+ * @return string
+ */
+  public static function _size75( $string, $nl ) {
+    $tmp             = $string;
+    $string          = '';
+    $cCnt = $x       = 0;
+    while( TRUE ) {
+      if( !isset( $tmp[$x] )) {
+        $string     .= $nl;                           // loop breakes here
+        break;
+      }
+      elseif(( 74   <= $cCnt ) && ( '\\'  == $tmp[$x] ) && ( 'n' == $tmp[$x+1] )) {
+        $string     .= $nl.' \n';                     // don't break lines inside '\n'
+        $x          += 2;
+        if( !isset( $tmp[$x] )) {
+          $string   .= $nl;
+          break;
+        }
+        $cCnt        = 3;
+      }
+      elseif( 75    <= $cCnt ) {
+        $string     .= $nl.' ';
+        $cCnt        = 1;
+      }
+      $byte          = ord( $tmp[$x] );
+      $string       .= $tmp[$x];
+      switch( TRUE ) { // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+        case(( $byte >= 0x20 ) && ( $byte <= 0x7F )): // characters U-00000000 - U-0000007F (same as ASCII)
+          $cCnt     += 1;
+          break;                                      // add a one byte character
+        case(( $byte & 0xE0) == 0xC0 ):               // characters U-00000080 - U-000007FF, mask 110XXXXX
+          if( isset( $tmp[$x+1] )) {
+            $cCnt   += 1;
+            $string  .= $tmp[$x+1];
+            $x       += 1;                            // add a two bytes character
+          }
+          break;
+        case(( $byte & 0xF0 ) == 0xE0 ):              // characters U-00000800 - U-0000FFFF, mask 1110XXXX
+          if( isset( $tmp[$x+2] )) {
+            $cCnt   += 1;
+            $string .= $tmp[$x+1].$tmp[$x+2];
+            $x      += 2;                             // add a three bytes character
+          }
+          break;
+        case(( $byte & 0xF8 ) == 0xF0 ):              // characters U-00010000 - U-001FFFFF, mask 11110XXX
+          if( isset( $tmp[$x+3] )) {
+            $cCnt   += 1;
+            $string .= $tmp[$x+1].$tmp[$x+2].$tmp[$x+3];
+            $x      += 3;                             // add a four bytes character
+          }
+          break;
+        case(( $byte & 0xFC ) == 0xF8 ):              // characters U-00200000 - U-03FFFFFF, mask 111110XX
+          if( isset( $tmp[$x+4] )) {
+            $cCnt   += 1;
+            $string .= $tmp[$x+1].$tmp[$x+2].$tmp[$x+3].$tmp[$x+4];
+            $x      += 4;                             // add a five bytes character
+          }
+          break;
+        case(( $byte & 0xFE ) == 0xFC ):              // characters U-04000000 - U-7FFFFFFF, mask 1111110X
+          if( isset( $tmp[$x+5] )) {
+            $cCnt   += 1;
+            $string .= $tmp[$x+1].$tmp[$x+2].$tmp[$x+3].$tmp[$x+4].$tmp[$x+5];
+            $x      += 5;                             // add a six bytes character
+          }
+        default:                                      // add any other byte without counting up $cCnt
+          break;
+      } // end switch( TRUE )
+      $x         += 1;                                // next 'byte' to test
+    } // end while( TRUE ) {
+    return $string;
+  }
+/**
+ * sort callback functions for exdate
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.11 - 2013-01-12
+ * @param array $a
+ * @param array $b
+ * @return int
+ */
+  public static function _sortExdate1( $a, $b ) {
+    $as  = sprintf( '%04d%02d%02d', $a['year'], $a['month'], $a['day'] );
+    $as .= ( isset( $a['hour'] )) ? sprintf( '%02d%02d%02d', $a['hour'], $a['min'], $a['sec'] ) : '';
+    $bs  = sprintf( '%04d%02d%02d', $b['year'], $b['month'], $b['day'] );
+    $bs .= ( isset( $b['hour'] )) ? sprintf( '%02d%02d%02d', $b['hour'], $b['min'], $b['sec'] ) : '';
+    return strcmp( $as, $bs );
+  }
+  public static function _sortExdate2( $a, $b ) {
+    $val = reset( $a['value'] );
+    $as  = sprintf( '%04d%02d%02d', $val['year'], $val['month'], $val['day'] );
+    $as .= ( isset( $val['hour'] )) ? sprintf( '%02d%02d%02d', $val['hour'], $val['min'], $val['sec'] ) : '';
+    $val = reset( $b['value'] );
+    $bs  = sprintf( '%04d%02d%02d', $val['year'], $val['month'], $val['day'] );
+    $bs .= ( isset( $val['hour'] )) ? sprintf( '%02d%02d%02d', $val['hour'], $val['min'], $val['sec'] ) : '';
+    return strcmp( $as, $bs );
+  }
+/**
+ * sort callback functions for rdate
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.27 - 2013-07-05
+ * @param array $a
+ * @param array $b
+ * @return int
+ */
+  public static function _sortRdate1( $a, $b ) {
+    $val = isset( $a['year'] ) ? $a : $a[0];
+    $as  = sprintf( '%04d%02d%02d', $val['year'], $val['month'], $val['day'] );
+    $as .= ( isset( $val['hour'] )) ? sprintf( '%02d%02d%02d', $val['hour'], $val['min'], $val['sec'] ) : '';
+    $val = isset( $b['year'] ) ? $b : $b[0];
+    $bs  = sprintf( '%04d%02d%02d', $val['year'], $val['month'], $val['day'] );
+    $bs .= ( isset( $val['hour'] )) ? sprintf( '%02d%02d%02d', $val['hour'], $val['min'], $val['sec'] ) : '';
+    return strcmp( $as, $bs );
+  }
+  public static function _sortRdate2( $a, $b ) {
+    $val   = isset( $a['value'][0]['year'] ) ? $a['value'][0] : $a['value'][0][0];
+    if( empty( $val ))
+      $as  = '';
+    else {
+      $as  = sprintf( '%04d%02d%02d', $val['year'], $val['month'], $val['day'] );
+      $as .= ( isset( $val['hour'] )) ? sprintf( '%02d%02d%02d', $val['hour'], $val['min'], $val['sec'] ) : '';
+    }
+    $val   = isset( $b['value'][0]['year'] ) ? $b['value'][0] : $b['value'][0][0];
+    if( empty( $val ))
+      $bs  = '';
+    else {
+      $bs  = sprintf( '%04d%02d%02d', $val['year'], $val['month'], $val['day'] );
+      $bs .= ( isset( $val['hour'] )) ? sprintf( '%02d%02d%02d', $val['hour'], $val['min'], $val['sec'] ) : '';
+    }
+    return strcmp( $as, $bs );
+  }
+/**
+ * step date, return updated date, array and timpstamp
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.14.1 - 2012-09-24
+ * @param array $date, date to step
+ * @param int   $timestamp
+ * @param array $step, default array( 'day' => 1 )
+ * @return void
+ */
+  public static function _stepdate( &$date, &$timestamp, $step=array( 'day' => 1 )) {
+    if( !isset( $date['hour'] )) $date['hour'] = 0;
+    if( !isset( $date['min'] ))  $date['min']  = 0;
+    if( !isset( $date['sec'] ))  $date['sec']  = 0;
+    foreach( $step as $stepix => $stepvalue )
+      $date[$stepix] += $stepvalue;
+    $timestamp  = mktime( $date['hour'], $date['min'], $date['sec'], $date['month'], $date['day'], $date['year'] );
+    $d          = date( 'Y-m-d-H-i-s', $timestamp);
+    $d          = explode( '-', $d );
+    $date       = array( 'year' => $d[0], 'month' => $d[1], 'day' => $d[2], 'hour' => $d[3], 'min' => $d[4], 'sec' => $d[5] );
+    foreach( $date as $k => $v )
+      $date[$k] = (int) $v;
+  }
+/**
+ * convert a date from specific string to array format
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.11.8 - 2012-01-27
+ * @param mixed $input
+ * @return bool, TRUE on success
+ */
+  public static function _strDate2arr( & $input ) {
+    if( is_array( $input ))
+      return FALSE;
+    if( 5 > strlen( (string) $input ))
+      return FALSE;
+    $work = $input;
+    if( 2 == substr_count( $work, '-' ))
+      $work = str_replace( '-', '', $work );
+    if( 2 == substr_count( $work, '/' ))
+      $work = str_replace( '/', '', $work );
+    if( !ctype_digit( substr( $work, 0, 8 )))
+      return FALSE;
+    $temp = array( 'year'  => (int) substr( $work,  0, 4 )
+                 , 'month' => (int) substr( $work,  4, 2 )
+                 , 'day'   => (int) substr( $work,  6, 2 ));
+    if( !checkdate( $temp['month'], $temp['day'], $temp['year'] ))
+      return FALSE;
+    if( 8 == strlen( $work )) {
+      $input = $temp;
+      return TRUE;
+    }
+    if(( ' ' == substr( $work, 8, 1 )) || ( 'T' == substr( $work, 8, 1 )) || ( 't' == substr( $work, 8, 1 )))
+      $work =  substr( $work, 9 );
+    elseif( ctype_digit( substr( $work, 8, 1 )))
+      $work = substr( $work, 8 );
+    else
+     return FALSE;
+    if( 2 == substr_count( $work, ':' ))
+      $work = str_replace( ':', '', $work );
+    if( !ctype_digit( substr( $work, 0, 4 )))
+      return FALSE;
+    $temp['hour']  = substr( $work, 0, 2 );
+    $temp['min']   = substr( $work, 2, 2 );
+    if((( 0 > $temp['hour'] ) || ( $temp['hour'] > 23 )) ||
+       (( 0 > $temp['min'] )  || ( $temp['min']  > 59 )))
+      return FALSE;
+    if( ctype_digit( substr( $work, 4, 2 ))) {
+      $temp['sec'] = substr( $work, 4, 2 );
+      if((  0 > $temp['sec'] ) || ( $temp['sec']  > 59 ))
+        return FALSE;
+      $len = 6;
+    }
+    else {
+      $temp['sec'] = 0;
+      $len = 4;
+    }
+    if( $len < strlen( $work))
+      $temp['tz'] = trim( substr( $work, 6 ));
+    $input = $temp;
+    return TRUE;
+  }
+/**
+ * ensures internal date-time/date format for input date-time/date in string fromat
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.24 - 2013-06-26
+ * Modified to also return original string value by Yitzchok Lavi <icalcreator@onebigsystem.com>
+ * @param array $datetime
+ * @param int   $parno optional, default FALSE
+ * @param moxed $wtz optional, default null
+ * @return array
+ */
+  public static function _date_time_string( $datetime, $parno=FALSE ) {
+    return iCalUtilityFunctions::_strdate2date( $datetime, $parno, null );
+  }
+  public static function _strdate2date( $datetime, $parno=FALSE, $wtz=null ) {
+    // save original input string to return it later
+    $unparseddatetime = $datetime;
+    $datetime   = (string) trim( $datetime );
+    $tz         = null;
+    $offset     = 0;
+    $tzSts      = FALSE;
+    $len        = strlen( $datetime );
+    if( 'Z' == substr( $datetime, -1 )) {
+      $tz       = 'Z';
+      $datetime = trim( substr( $datetime, 0, ( $len - 1 )));
+      $tzSts    = TRUE;
+    }
+    if( iCalUtilityFunctions::_isOffset( substr( $datetime, -5, 5 ))) { // [+/-]NNNN offset
+      $tz       = substr( $datetime, -5, 5 );
+      $datetime = trim( substr( $datetime, 0, ($len - 5)));
+    }
+    elseif( iCalUtilityFunctions::_isOffset( substr( $datetime, -7, 7 ))) { // [+/-]NNNNNN offset
+      $tz       = substr( $datetime, -7, 7 );
+      $datetime = trim( substr( $datetime, 0, ($len - 7)));
+    }
+    elseif( empty( $wtz ) && ctype_digit( substr( $datetime, 0, 4 )) && ctype_digit( substr( $datetime, -2, 2 )) && iCalUtilityFunctions::_strDate2arr( $datetime )) {
+      $output = $datetime;
+      if( !empty( $tz ))
+        $output['tz'] = 'Z';
+      $output['unparsedtext'] = $unparseddatetime;
+      return $output;
+    }
+    else {
+      $cx  = $tx = 0;    //  find any trailing timezone or offset
+      $len = strlen( $datetime );
+      for( $cx = -1; $cx > ( 9 - $len ); $cx-- ) {
+        $char = substr( $datetime, $cx, 1 );
+        if(( ' ' == $char ) || ctype_digit( $char ))
+          break; // if exists, tz ends here.. . ?
+        else
+           $tx--; // tz length counter
+      }
+      if( 0 > $tx ) { // if any
+        $tz     = substr( $datetime, $tx );
+        $datetime = trim( substr( $datetime, 0, $len + $tx ));
+      }
+      if(( ctype_digit( substr( $datetime, 0, 8 )) && ( 'T' ==  substr( $datetime, 8, 1 )) && ctype_digit( substr( $datetime, -6, 6 ))) ||
+         ( ctype_digit( substr( $datetime, 0, 14 ))))
+        $tzSts  = TRUE;
+    }
+    if( empty( $tz ) && !empty( $wtz ))
+      $tz       = $wtz;
+    if( 3 == $parno )
+      $tz       = null;
+    if( !empty( $tz )) { // tz set
+      if(( 'Z' != $tz ) && ( iCalUtilityFunctions::_isOffset( $tz ))) {
+        $offset = (string) iCalUtilityFunctions::_tz2offset( $tz ) * -1;
+        $tz     = 'UTC';
+        $tzSts  = TRUE;
+      }
+      elseif( !empty( $wtz ))
+        $tzSts  = TRUE;
+      $tz       = trim( $tz );
+      if(( 'Z' == $tz ) || ( 'GMT' == strtoupper( $tz )))
+        $tz     = 'UTC';
+      if( 0 < substr_count( $datetime, '-' ))
+        $datetime = str_replace( '-', '/', $datetime );
+      try {
+        $d        = new DateTime( $datetime, new DateTimeZone( $tz ));
+        if( 0  != $offset )  // adjust for offset
+          $d->modify( $offset.' seconds' );
+        $datestring = $d->format( 'Y-m-d-H-i-s' );
+        unset( $d );
+      }
+      catch( Exception $e ) {
+        $datestring = date( 'Y-m-d-H-i-s', strtotime( $datetime ));
+      }
+    } // end if( !empty( $tz ))
+    else
+      $datestring = date( 'Y-m-d-H-i-s', strtotime( $datetime ));
+    if( 'UTC' == $tz )
+      $tz         = 'Z';
+    $d            = explode( '-', $datestring );
+    $output       = array( 'year' => $d[0], 'month' => $d[1], 'day' => $d[2] );
+    if( !$parno || ( 3 != $parno )) { // parno is set to 6 or 7
+      $output['hour'] = $d[3];
+      $output['min']  = $d[4];
+      $output['sec']  = $d[5];
+      if(( $tzSts || ( 7 == $parno )) && !empty( $tz ))
+        $output['tz'] = $tz;
+    }
+    // return original string in the array in case strtotime failed to make sense of it
+    $output['unparsedtext'] = $unparseddatetime;
+    return $output;
+  }
+/********************************************************************************/
+/**
+ * special characters management output
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @param string $string
+ * @param string $format
+ * @param string $nl
+ * @return string
+ */
+  public static function _strrep( $string, $format, $nl ) {
+    switch( $format ) {
+      case 'xcal':
+        $string = str_replace( '\n',  $nl, $string);
+        $string = htmlspecialchars( strip_tags( stripslashes( urldecode ( $string ))));
+        break;
+      default:
+        $pos = 0;
+        $specChars = array( 'n', 'N', 'r', ',', ';' );
+        while( isset( $string[$pos] )) {
+          if( FALSE === ( $pos = strpos( $string, "\\", $pos )))
+            break;
+          if( !in_array( substr( $string, $pos, 1 ), $specChars )) {
+            $string = substr( $string, 0, $pos )."\\".substr( $string, ( $pos + 1 ));
+            $pos += 1;
+          }
+          $pos += 1;
+        }
+        if( FALSE !== strpos( $string, '"' ))
+          $string = str_replace('"',   "'",       $string);
+        if( FALSE !== strpos( $string, ',' ))
+          $string = str_replace(',',   '\,',      $string);
+        if( FALSE !== strpos( $string, ';' ))
+          $string = str_replace(';',   '\;',      $string);
+        if( FALSE !== strpos( $string, "\r\n" ))
+          $string = str_replace( "\r\n", '\n',    $string);
+        elseif( FALSE !== strpos( $string, "\r" ))
+          $string = str_replace( "\r", '\n',      $string);
+        elseif( FALSE !== strpos( $string, "\n" ))
+          $string = str_replace( "\n", '\n',      $string);
+        if( FALSE !== strpos( $string, '\N' ))
+          $string = str_replace( '\N', '\n',      $string);
+//        if( FALSE !== strpos( $string, $nl ))
+          $string = str_replace( $nl, '\n', $string);
+        break;
+    }
+    return $string;
+  }
+/**
+ * special characters management input (from iCal file)
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.2 - 2012-12-18
+ * @param string $string
+ * @return string
+ */
+  public static function _strunrep( $string ) {
+    $string = str_replace( '\\\\', '\\',     $string);
+    $string = str_replace( '\,',   ',',      $string);
+    $string = str_replace( '\;',   ';',      $string);
+//    $string = str_replace( '\n',  $nl, $string); // ??
+    return $string;
+  }
+/**
+ * convert timestamp to date array, default UTC or adjusted for offset/timezone
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.15.1 - 2012-10-17
+ * @param mixed   $timestamp
+ * @param int     $parno
+ * @param string  $wtz
+ * @return array
+ */
+  public static function _timestamp2date( $timestamp, $parno=6, $wtz=null ) {
+    if( is_array( $timestamp )) {
+      $tz        = ( isset( $timestamp['tz'] )) ? $timestamp['tz'] : $wtz;
+      $timestamp = $timestamp['timestamp'];
+    }
+    $tz          = ( isset( $tz )) ? $tz : $wtz;
+    $offset      = 0;
+    if( empty( $tz ) || ( 'Z' == $tz ) || ( 'GMT' == strtoupper( $tz )))
+      $tz        = 'UTC';
+    elseif( iCalUtilityFunctions::_isOffset( $tz )) {
+      $offset    = iCalUtilityFunctions::_tz2offset( $tz );
+//      $tz        = 'UTC';
+    }
+    try {
+      $d         = new DateTime( "@$timestamp" );  // set UTC date
+      if(  0 != $offset )                          // adjust for offset
+        $d->modify( $offset.' seconds' );
+      elseif( 'UTC' != $tz )
+        $d->setTimezone( new DateTimeZone( $tz )); // convert to local date
+      $date      = $d->format( 'Y-m-d-H-i-s' );
+      unset( $d );
+    }
+    catch( Exception $e ) {
+      $date      = date( 'Y-m-d-H-i-s', $timestamp );
+    }
+    $date        = explode( '-', $date );
+    $output      = array( 'year' => $date[0], 'month' => $date[1], 'day' => $date[2] );
+    if( 3 != $parno ) {
+      $output['hour'] = $date[3];
+      $output['min']  = $date[4];
+      $output['sec']  = $date[5];
+      if(( 'UTC' == $tz ) || ( 0 == $offset ))
+        $output['tz'] = 'Z';
+    }
+    return $output;
+  }
+/**
+ * convert timestamp (seconds) to duration in array format
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.6.23 - 2010-10-23
+ * @param int $timestamp
+ * @return array, duration format
+ */
+  public static function _timestamp2duration( $timestamp ) {
+    $dur         = array();
+    $dur['week'] = (int) floor( $timestamp / ( 7 * 24 * 60 * 60 ));
+    $timestamp   =              $timestamp % ( 7 * 24 * 60 * 60 );
+    $dur['day']  = (int) floor( $timestamp / ( 24 * 60 * 60 ));
+    $timestamp   =              $timestamp % ( 24 * 60 * 60 );
+    $dur['hour'] = (int) floor( $timestamp / ( 60 * 60 ));
+    $timestamp   =              $timestamp % ( 60 * 60 );
+    $dur['min']  = (int) floor( $timestamp / ( 60 ));
+    $dur['sec']  = (int)        $timestamp % ( 60 );
+    return $dur;
+  }
+/**
+ * transforms a dateTime from a timezone to another using PHP DateTime and DateTimeZone class (PHP >= PHP 5.2.0)
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.15.1 - 2012-10-17
+ * @param mixed  $date,   date to alter
+ * @param string $tzFrom, PHP valid 'from' timezone
+ * @param string $tzTo,   PHP valid 'to' timezone, default 'UTC'
+ * @param string $format, date output format, default 'Ymd\THis'
+ * @return bool
+ */
+  public static function transformDateTime( & $date, $tzFrom, $tzTo='UTC', $format = 'Ymd\THis' ) {
+    if( is_array( $date ) && isset( $date['timestamp'] )) {
+      try {
+        $d = new DateTime( "@{$date['timestamp']}" ); // set UTC date
+        $d->setTimezone(new DateTimeZone( $tzFrom )); // convert to 'from' date
+      }
+      catch( Exception $e ) { return FALSE; }
+    }
+    else {
+      if( iCalUtilityFunctions::_isArrayDate( $date )) {
+        if( isset( $date['tz'] ))
+          unset( $date['tz'] );
+        $date  = iCalUtilityFunctions::_date2strdate( iCalUtilityFunctions::_chkDateArr( $date ));
+      }
+      if( 'Z' == substr( $date, -1 ))
+        $date = substr( $date, 0, ( strlen( $date ) - 2 ));
+      try { $d = new DateTime( $date, new DateTimeZone( $tzFrom )); }
+      catch( Exception $e ) { return FALSE; }
+    }
+    try { $d->setTimezone( new DateTimeZone( $tzTo )); }
+    catch( Exception $e ) { return FALSE; }
+    $date = $d->format( $format );
+    return TRUE;
+  }
+/**
+ * convert offset, [+/-]HHmm[ss], to seconds, used when correcting UTC to localtime or v.v.
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.11.4 - 2012-01-11
+ * @param string $offset
+ * @return integer
+ */
+  public static function _tz2offset( $tz ) {
+    $tz           = trim( (string) $tz );
+    $offset       = 0;
+    if(((     5  != strlen( $tz ))       && ( 7  != strlen( $tz ))) ||
+       ((    '+' != substr( $tz, 0, 1 )) && ( '-' != substr( $tz, 0, 1 ))) ||
+       (( '0000' >= substr( $tz, 1, 4 )) && ( '9999' < substr( $tz, 1, 4 ))) ||
+           (( 7  == strlen( $tz ))       && ( '00' > substr( $tz, 5, 2 )) && ( '99' < substr( $tz, 5, 2 ))))
+      return $offset;
+    $hours2sec    = (int) substr( $tz, 1, 2 ) * 3600;
+    $min2sec      = (int) substr( $tz, 3, 2 ) *   60;
+    $sec          = ( 7  == strlen( $tz )) ? (int) substr( $tz, -2 ) : '00';
+    $offset       = $hours2sec + $min2sec + $sec;
+    $offset       = ('-' == substr( $tz, 0, 1 )) ? $offset * -1 : $offset;
+    return $offset;
+  }
+}
+/*********************************************************************************/
+/*          iCalcreator vCard helper functions                                   */
+/*********************************************************************************/
+/**
+ * convert single ATTENDEE, CONTACT or ORGANIZER (in email format) to vCard
+ * returns vCard/TRUE or if directory (if set) or file write is unvalid, FALSE
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.12.2 - 2012-07-11
+ * @param object $email
+ * $param string $version, vCard version (default 2.1)
+ * $param string $directory, where to save vCards (default FALSE)
+ * $param string $ext, vCard file extension (default 'vcf')
+ * @return mixed
+ */
+function iCal2vCard( $email, $version='2.1', $directory=FALSE, $ext='vcf' ) {
+  if( FALSE === ( $pos = strpos( $email, '@' )))
+    return FALSE;
+  if( $directory ) {
+    if( DIRECTORY_SEPARATOR != substr( $directory, ( 0 - strlen( DIRECTORY_SEPARATOR ))))
+      $directory .= DIRECTORY_SEPARATOR;
+    if( !is_dir( $directory ) || !is_writable( $directory ))
+      return FALSE;
+  }
+            /* prepare vCard */
+  $email  = str_replace( 'MAILTO:', '', $email );
+  $name   = $person = substr( $email, 0, $pos );
+  if( ctype_upper( $name ) || ctype_lower( $name ))
+    $name = array( $name );
+  else {
+    if( FALSE !== ( $pos = strpos( $name, '.' ))) {
+      $name = explode( '.', $name );
+      foreach( $name as $k => $part )
+        $name[$k] = ucfirst( $part );
+    }
+    else { // split camelCase
+      $chars = $name;
+      $name  = array( $chars[0] );
+      $k     = 0;
+      $x     = 1;
+      while( FALSE !== ( $char = substr( $chars, $x, 1 ))) {
+        if( ctype_upper( $char )) {
+          $k += 1;
+          $name[$k] = '';
+        }
+        $name[$k]  .= $char;
+        $x++;
+      }
+    }
+  }
+  $nl     = "\r\n";
+  $FN     = 'FN:'.implode( ' ', $name ).$nl;
+  $name   = array_reverse( $name );
+  $N      = 'N:'.array_shift( $name );
+  $scCnt  = 0;
+  while( NULL != ( $part = array_shift( $name ))) {
+    if(( '4.0' != $version ) || ( 4 > $scCnt ))
+      $scCnt += 1;
+    $N   .= ';'.$part;
+  }
+  while(( '4.0' == $version ) && ( 4 > $scCnt )) {
+    $N   .= ';';
+    $scCnt += 1;
+  }
+  $N     .= $nl;
+  $EMAIL  = 'EMAIL:'.$email.$nl;
+           /* create vCard */
+  $vCard  = 'BEGIN:VCARD'.$nl;
+  $vCard .= "VERSION:$version$nl";
+  $vCard .= 'PRODID:-//kigkonsult.se '.ICALCREATOR_VERSION."//$nl";
+  $vCard .= $N;
+  $vCard .= $FN;
+  $vCard .= $EMAIL;
+  $vCard .= 'REV:'.gmdate( 'Ymd\THis\Z' ).$nl;
+  $vCard .= 'END:VCARD'.$nl;
+            /* save each vCard as (unique) single file */
+  if( $directory ) {
+    $fname = $directory.preg_replace( '/[^a-z0-9.]/i', '', $email );
+    $cnt   = 1;
+    $dbl   = '';
+    while( is_file ( $fname.$dbl.'.'.$ext )) {
+      $cnt += 1;
+      $dbl = "_$cnt";
+    }
+    if( FALSE === file_put_contents( $fname, $fname.$dbl.'.'.$ext ))
+      return FALSE;
+    return TRUE;
+  }
+            /* return vCard */
+  else
+    return $vCard;
+}
+/**
+ * convert ATTENDEEs, CONTACTs and ORGANIZERs (in email format) to vCards
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.12.2 - 2012-05-07
+ * @param object $calendar, iCalcreator vcalendar instance reference
+ * $param string $version, vCard version (default 2.1)
+ * $param string $directory, where to save vCards (default FALSE)
+ * $param string $ext, vCard file extension (default 'vcf')
+ * @return mixed
+ */
+function iCal2vCards( & $calendar, $version='2.1', $directory=FALSE, $ext='vcf' ) {
+  $hits   = array();
+  $vCardP = array( 'ATTENDEE', 'CONTACT', 'ORGANIZER' );
+  foreach( $vCardP as $prop ) {
+    $hits2 = $calendar->getProperty( $prop );
+    foreach( $hits2 as $propValue => $occCnt ) {
+      if( FALSE === ( $pos = strpos( $propValue, '@' )))
+        continue;
+      $propValue = str_replace( 'MAILTO:', '', $propValue );
+      if( isset( $hits[$propValue] ))
+        $hits[$propValue] += $occCnt;
+      else
+        $hits[$propValue]  = $occCnt;
+    }
+  }
+  if( empty( $hits ))
+    return FALSE;
+  ksort( $hits );
+  $output   = '';
+  foreach( $hits as $email => $skip ) {
+    $res = iCal2vCard( $email, $version, $directory, $ext );
+    if( $directory && !$res )
+      return FALSE;
+    elseif( !$res )
+      return $res;
+    else
+      $output .= $res;
+  }
+  if( $directory )
+    return TRUE;
+  if( !empty( $output ))
+    return $output;
+  return FALSE;
+}
+/*********************************************************************************/
+/*          iCalcreator XML (rfc6321) helper functions                           */
+/*********************************************************************************/
+/**
+ * format iCal XML output, rfc6321, using PHP SimpleXMLElement
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.22 - 2013-06-27
+ * @param object $calendar, iCalcreator vcalendar instance reference
+ * @return string
+ */
+function iCal2XML( & $calendar ) {
+            /** fix an SimpleXMLElement instance and create root element */
+  $xmlstr       = '<?xml version="1.0" encoding="utf-8"?><icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">';
+  $xmlstr      .= '<!-- created '.date( 'Ymd\THis\Z', time());
+  $xmlstr      .= ' utilizing kigkonsult.se '.ICALCREATOR_VERSION.' iCal2XMl (rfc6321) -->';
+  $xmlstr      .= '</icalendar>';
+  $xml          = new SimpleXMLElement( $xmlstr );
+  $vcalendar    = $xml->addChild( 'vcalendar' );
+            /** fix calendar properties */
+  $properties   = $vcalendar->addChild( 'properties' );
+  $calProps     = array( 'version', 'prodid', 'calscale', 'method' );
+  foreach( $calProps as $calProp ) {
+    if( FALSE !== ( $content = $calendar->getProperty( $calProp )))
+      _addXMLchild( $properties, $calProp, 'text', $content );
+  }
+  while( FALSE !== ( $content = $calendar->getProperty( FALSE, FALSE, TRUE )))
+    _addXMLchild( $properties, $content[0], 'unknown', $content[1]['value'], $content[1]['params'] );
+  $langCal = $calendar->getConfig( 'language' );
+            /** prepare to fix components with properties */
+  $components   = $vcalendar->addChild( 'components' );
+            /** fix component properties */
+  while( FALSE !== ( $component = $calendar->getComponent())) {
+    $compName   = $component->objName;
+    $child      = $components->addChild( $compName );
+    $properties = $child->addChild( 'properties' );
+    $langComp   = $component->getConfig( 'language' );
+    $props      = $component->getConfig( 'setPropertyNames' );
+    foreach( $props as $prop ) {
+      switch( strtolower( $prop )) {
+        case 'attach':          // may occur multiple times, below
+          while( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE ))) {
+            $type = ( isset( $content['params']['VALUE'] ) && ( 'BINARY' == $content['params']['VALUE'] )) ? 'binary' : 'uri';
+            unset( $content['params']['VALUE'] );
+            _addXMLchild( $properties, $prop, $type, $content['value'], $content['params'] );
+          }
+          break;
+        case 'attendee':
+          while( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE ))) {
+            if( isset( $content['params']['CN'] ) && !isset( $content['params']['LANGUAGE'] )) {
+              if( $langComp )
+                $content['params']['LANGUAGE'] = $langComp;
+              elseif( $langCal )
+                $content['params']['LANGUAGE'] = $langCal;
+            }
+            _addXMLchild( $properties, $prop, 'cal-address', $content['value'], $content['params'] );
+          }
+          break;
+        case 'exdate':
+          while( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE ))) {
+            $type = ( isset( $content['params']['VALUE'] ) && ( 'DATE' == $content['params']['VALUE'] )) ? 'date' : 'date-time';
+            unset( $content['params']['VALUE'] );
+            _addXMLchild( $properties, $prop, $type, $content['value'], $content['params'] );
+          }
+          break;
+        case 'freebusy':
+          while( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE ))) {
+            if( is_array( $content ) && isset( $content['value']['fbtype'] )) {
+              $content['params']['FBTYPE'] = $content['value']['fbtype'];
+              unset( $content['value']['fbtype'] );
+            }
+            _addXMLchild( $properties, $prop, 'period', $content['value'], $content['params'] );
+          }
+          break;
+        case 'request-status':
+          while( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE ))) {
+            if( !isset( $content['params']['LANGUAGE'] )) {
+              if( $langComp )
+                $content['params']['LANGUAGE'] = $langComp;
+              elseif( $langCal )
+                $content['params']['LANGUAGE'] = $langCal;
+            }
+            _addXMLchild( $properties, $prop, 'rstatus', $content['value'], $content['params'] );
+          }
+          break;
+        case 'rdate':
+          while( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE ))) {
+            $type = 'date-time';
+            if( isset( $content['params']['VALUE'] )) {
+              if( 'DATE' == $content['params']['VALUE'] )
+                $type = 'date';
+              elseif( 'PERIOD' == $content['params']['VALUE'] )
+                $type = 'period';
+            }
+            unset( $content['params']['VALUE'] );
+            _addXMLchild( $properties, $prop, $type, $content['value'], $content['params'] );
+          }
+          break;
+        case 'categories':
+        case 'comment':
+        case 'contact':
+        case 'description':
+        case 'related-to':
+        case 'resources':
+          while( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE ))) {
+            if(( 'related-to' != $prop ) && !isset( $content['params']['LANGUAGE'] )) {
+              if( $langComp )
+                $content['params']['LANGUAGE'] = $langComp;
+              elseif( $langCal )
+                $content['params']['LANGUAGE'] = $langCal;
+            }
+            _addXMLchild( $properties, $prop, 'text', $content['value'], $content['params'] );
+          }
+          break;
+        case 'x-prop':
+          while( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE )))
+            _addXMLchild( $properties, $content[0], 'unknown', $content[1]['value'], $content[1]['params'] );
+          break;
+        case 'created':         // single occurence below, if set
+        case 'completed':
+        case 'dtstamp':
+        case 'last-modified':
+          $utcDate = TRUE;
+        case 'dtstart':
+        case 'dtend':
+        case 'due':
+        case 'recurrence-id':
+          if( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE ))) {
+            $type = ( isset( $content['params']['VALUE'] ) && ( 'DATE' == $content['params']['VALUE'] )) ? 'date' : 'date-time';
+            unset( $content['params']['VALUE'] );
+            if(( isset( $content['params']['TZID'] ) && empty( $content['params']['TZID'] )) || @is_null( $content['params']['TZID'] ))
+              unset( $content['params']['TZID'] );
+            _addXMLchild( $properties, $prop, $type, $content['value'], $content['params'] );
+          }
+          unset( $utcDate );
+          break;
+        case 'duration':
+          if( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE )))
+            _addXMLchild( $properties, $prop, 'duration', $content['value'], $content['params'] );
+          break;
+        case 'exrule':
+        case 'rrule':
+          while( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE )))
+            _addXMLchild( $properties, $prop, 'recur', $content['value'], $content['params'] );
+          break;
+        case 'class':
+        case 'location':
+        case 'status':
+        case 'summary':
+        case 'transp':
+        case 'tzid':
+        case 'uid':
+          if( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE ))) {
+            if((( 'location' == $prop ) || ( 'summary' == $prop )) && !isset( $content['params']['LANGUAGE'] )) {
+              if( $langComp )
+                $content['params']['LANGUAGE'] = $langComp;
+              elseif( $langCal )
+                $content['params']['LANGUAGE'] = $langCal;
+            }
+            _addXMLchild( $properties, $prop, 'text', $content['value'], $content['params'] );
+          }
+          break;
+        case 'geo':
+          if( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE )))
+            _addXMLchild( $properties, $prop, 'geo', $content['value'], $content['params'] );
+          break;
+        case 'organizer':
+          if( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE ))) {
+            if( isset( $content['params']['CN'] ) && !isset( $content['params']['LANGUAGE'] )) {
+              if( $langComp )
+                $content['params']['LANGUAGE'] = $langComp;
+              elseif( $langCal )
+                $content['params']['LANGUAGE'] = $langCal;
+            }
+            _addXMLchild( $properties, $prop, 'cal-address', $content['value'], $content['params'] );
+          }
+          break;
+        case 'percent-complete':
+        case 'priority':
+        case 'sequence':
+          if( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE )))
+            _addXMLchild( $properties, $prop, 'integer', $content['value'], $content['params'] );
+          break;
+        case 'tzurl':
+        case 'url':
+          if( FALSE !== ( $content = $component->getProperty( $prop, FALSE, TRUE )))
+            _addXMLchild( $properties, $prop, 'uri', $content['value'], $content['params'] );
+          break;
+      } // end switch( $prop )
+    } // end foreach( $props as $prop )
+            /** fix subComponent properties, if any */
+    while( FALSE !== ( $subcomp = $component->getComponent())) {
+      $subCompName  = $subcomp->objName;
+      $child2       = $child->addChild( $subCompName );
+      $properties   = $child2->addChild( 'properties' );
+      $langComp     = $subcomp->getConfig( 'language' );
+      $subCompProps = $subcomp->getConfig( 'setPropertyNames' );
+      foreach( $subCompProps as $prop ) {
+        switch( strtolower( $prop )) {
+          case 'attach':          // may occur multiple times, below
+            while( FALSE !== ( $content = $subcomp->getProperty( $prop, FALSE, TRUE ))) {
+              $type = ( isset( $content['params']['VALUE'] ) && ( 'BINARY' == $content['params']['VALUE'] )) ? 'binary' : 'uri';
+              unset( $content['params']['VALUE'] );
+              _addXMLchild( $properties, $prop, $type, $content['value'], $content['params'] );
+            }
+            break;
+          case 'attendee':
+            while( FALSE !== ( $content = $subcomp->getProperty( $prop, FALSE, TRUE ))) {
+              if( isset( $content['params']['CN'] ) && !isset( $content['params']['LANGUAGE'] )) {
+                if( $langComp )
+                  $content['params']['LANGUAGE'] = $langComp;
+                elseif( $langCal )
+                  $content['params']['LANGUAGE'] = $langCal;
+              }
+              _addXMLchild( $properties, $prop, 'cal-address', $content['value'], $content['params'] );
+            }
+            break;
+          case 'comment':
+          case 'tzname':
+            while( FALSE !== ( $content = $subcomp->getProperty( $prop, FALSE, TRUE ))) {
+              if( !isset( $content['params']['LANGUAGE'] )) {
+                if( $langComp )
+                  $content['params']['LANGUAGE'] = $langComp;
+                elseif( $langCal )
+                  $content['params']['LANGUAGE'] = $langCal;
+              }
+              _addXMLchild( $properties, $prop, 'text', $content['value'], $content['params'] );
+            }
+            break;
+          case 'rdate':
+            while( FALSE !== ( $content = $subcomp->getProperty( $prop, FALSE, TRUE ))) {
+              $type = 'date-time';
+              if( isset( $content['params']['VALUE'] )) {
+                if( 'DATE' == $content['params']['VALUE'] )
+                  $type = 'date';
+                elseif( 'PERIOD' == $content['params']['VALUE'] )
+                  $type = 'period';
+              }
+              unset( $content['params']['VALUE'] );
+              _addXMLchild( $properties, $prop, $type, $content['value'], $content['params'] );
+            }
+            break;
+          case 'x-prop':
+            while( FALSE !== ( $content = $subcomp->getProperty( $prop, FALSE, TRUE )))
+              _addXMLchild( $properties, $content[0], 'unknown', $content[1]['value'], $content[1]['params'] );
+            break;
+          case 'action':      // single occurence below, if set
+          case 'description':
+          case 'summary':
+            if( FALSE !== ( $content = $subcomp->getProperty( $prop, FALSE, TRUE ))) {
+              if(( 'action' != $prop ) && !isset( $content['params']['LANGUAGE'] )) {
+                if( $langComp )
+                  $content['params']['LANGUAGE'] = $langComp;
+                elseif( $langCal )
+                  $content['params']['LANGUAGE'] = $langCal;
+              }
+              _addXMLchild( $properties, $prop, 'text', $content['value'], $content['params'] );
+            }
+            break;
+          case 'dtstart':
+            if( FALSE !== ( $content = $subcomp->getProperty( $prop, FALSE, TRUE ))) {
+              unset( $content['value']['tz'], $content['params']['VALUE'] ); // always local time
+              _addXMLchild( $properties, $prop, 'date-time', $content['value'], $content['params'] );
+            }
+            break;
+          case 'duration':
+            if( FALSE !== ( $content = $subcomp->getProperty( $prop, FALSE, TRUE )))
+              _addXMLchild( $properties, $prop, 'duration', $content['value'], $content['params'] );
+            break;
+          case 'repeat':
+            if( FALSE !== ( $content = $subcomp->getProperty( $prop, FALSE, TRUE )))
+              _addXMLchild( $properties, $prop, 'integer', $content['value'], $content['params'] );
+            break;
+          case 'trigger':
+            if( FALSE !== ( $content = $subcomp->getProperty( $prop, FALSE, TRUE ))) {
+              if( isset( $content['value']['year'] )   &&
+                  isset( $content['value']['month'] )  &&
+                  isset( $content['value']['day'] ))
+                $type = 'date-time';
+              else {
+                $type = 'duration';
+                if( !isset( $content['value']['relatedStart'] ) || ( TRUE !== $content['value']['relatedStart'] ))
+                  $content['params']['RELATED'] = 'END';
+              }
+              _addXMLchild( $properties, $prop, $type, $content['value'], $content['params'] );
+            }
+            break;
+          case 'tzoffsetto':
+          case 'tzoffsetfrom':
+            if( FALSE !== ( $content = $subcomp->getProperty( $prop, FALSE, TRUE )))
+              _addXMLchild( $properties, $prop, 'utc-offset', $content['value'], $content['params'] );
+            break;
+          case 'rrule':
+            while( FALSE !== ( $content = $subcomp->getProperty( $prop, FALSE, TRUE )))
+              _addXMLchild( $properties, $prop, 'recur', $content['value'], $content['params'] );
+            break;
+        } // switch( $prop )
+      } // end foreach( $subCompProps as $prop )
+    } // end while( FALSE !== ( $subcomp = $component->getComponent()))
+  } // end while( FALSE !== ( $component = $calendar->getComponent()))
+  return $xml->asXML();
+}
+/**
+ * Add children to a SimpleXMLelement
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.22 - 2013-06-24
+ * @param object $parent,  reference to a SimpleXMLelement node
+ * @param string $name,    new element node name
+ * @param string $type,    content type, subelement(-s) name
+ * @param string $content, new subelement content
+ * @param array  $params,  new element 'attributes'
+ * @return void
+ */
+function _addXMLchild( & $parent, $name, $type, $content, $params=array()) {
+            /** create new child node */
+  $name  = strtolower( $name );
+  $child = $parent->addChild( $name );
+  if( !empty( $params )) {
+    $parameters = $child->addChild( 'parameters' );
+    foreach( $params as $param => $parVal ) {
+      if( 'VALUE' == $param )
+        continue;
+      $param = strtolower( $param );
+      if( 'x-' == substr( $param, 0, 2  )) {
+        $p1 = $parameters->addChild( $param );
+        $p2 = $p1->addChild( 'unknown', htmlspecialchars( $parVal ));
+      }
+      else {
+        $p1 = $parameters->addChild( $param );
+        switch( $param ) {
+          case 'altrep':
+          case 'dir':            $ptype = 'uri';            break;
+          case 'delegated-from':
+          case 'delegated-to':
+          case 'member':
+          case 'sent-by':        $ptype = 'cal-address';    break;
+          case 'rsvp':           $ptype = 'boolean';        break ;
+          default:               $ptype = 'text';           break;
+        }
+        if( is_array( $parVal )) {
+          foreach( $parVal as $pV )
+            $p2 = $p1->addChild( $ptype, htmlspecialchars( $pV ));
+        }
+        else
+          $p2 = $p1->addChild( $ptype, htmlspecialchars( $parVal ));
+      }
+    }
+  } // end if( !empty( $params ))
+  if(( empty( $content ) && ( '0' != $content )) || ( !is_array( $content) && ( '-' != substr( $content, 0, 1 ) && ( 0 > $content ))))
+    return;
+            /** store content */
+  switch( $type ) {
+    case 'binary':
+      $v = $child->addChild( $type, $content );
+      break;
+    case 'boolean':
+      break;
+    case 'cal-address':
+      $v = $child->addChild( $type, $content );
+      break;
+    case 'date':
+      if( array_key_exists( 'year', $content ))
+        $content = array( $content );
+      foreach( $content as $date ) {
+        $str = sprintf( '%04d-%02d-%02d', $date['year'], $date['month'], $date['day'] );
+        $v = $child->addChild( $type, $str );
+      }
+      break;
+    case 'date-time':
+      if( array_key_exists( 'year', $content ))
+        $content = array( $content );
+      foreach( $content as $dt ) {
+        if( !isset( $dt['hour'] )) $dt['hour'] = 0;
+        if( !isset( $dt['min'] ))  $dt['min']  = 0;
+        if( !isset( $dt['sec'] ))  $dt['sec']  = 0;
+        $str = sprintf( '%04d-%02d-%02dT%02d:%02d:%02d', $dt['year'], $dt['month'], $dt['day'], $dt['hour'], $dt['min'], $dt['sec'] );
+        if( isset( $dt['tz'] ) && ( 'Z' == $dt['tz'] ))
+          $str .= 'Z';
+        $v = $child->addChild( $type, $str );
+      }
+      break;
+    case 'duration':
+      $output = (( 'trigger' == $name ) && ( FALSE !== $content['before'] )) ? '-' : '';
+      $v = $child->addChild( $type, $output.iCalUtilityFunctions::_duration2str( $content ) );
+      break;
+    case 'geo':
+      if( !empty( $content )) {
+        $v1 = $child->addChild( 'latitude',  number_format( (float) $content['latitude'],  6, '.', '' ));
+        $v1 = $child->addChild( 'longitude', number_format( (float) $content['longitude'], 6, '.', '' ));
+      }
+      break;
+    case 'integer':
+      $v = $child->addChild( $type, (string) $content );
+      break;
+    case 'period':
+      if( !is_array( $content ))
+        break;
+      foreach( $content as $period ) {
+        $v1 = $child->addChild( $type );
+        $str = sprintf( '%04d-%02d-%02dT%02d:%02d:%02d', $period[0]['year'], $period[0]['month'], $period[0]['day'], $period[0]['hour'], $period[0]['min'], $period[0]['sec'] );
+        if( isset( $period[0]['tz'] ) && ( 'Z' == $period[0]['tz'] ))
+          $str .= 'Z';
+        $v2 = $v1->addChild( 'start', $str );
+        if( array_key_exists( 'year', $period[1] )) {
+          $str = sprintf( '%04d-%02d-%02dT%02d:%02d:%02d', $period[1]['year'], $period[1]['month'], $period[1]['day'], $period[1]['hour'], $period[1]['min'], $period[1]['sec'] );
+          if( isset($period[1]['tz'] ) && ( 'Z' == $period[1]['tz'] ))
+            $str .= 'Z';
+          $v2 = $v1->addChild( 'end', $str );
+        }
+        else
+          $v2 = $v1->addChild( 'duration', iCalUtilityFunctions::_duration2str( $period[1] ));
+      }
+      break;
+    case 'recur':
+      foreach( $content as $rulelabel => $rulevalue ) {
+        $rulelabel = strtolower( $rulelabel );
+        switch( $rulelabel ) {
+          case 'until':
+            if( isset( $rulevalue['hour'] ))
+              $str = sprintf( '%04d-%02d-%02dT%02d:%02d:%02dZ', $rulevalue['year'], $rulevalue['month'], $rulevalue['day'], $rulevalue['hour'], $rulevalue['min'], $rulevalue['sec'] );
+            else
+              $str = sprintf( '%04d-%02d-%02d', $rulevalue['year'], $rulevalue['month'], $rulevalue['day'] );
+            $v = $child->addChild( $rulelabel, $str );
+            break;
+          case 'bysecond':
+          case 'byminute':
+          case 'byhour':
+          case 'bymonthday':
+          case 'byyearday':
+          case 'byweekno':
+          case 'bymonth':
+          case 'bysetpos': {
+            if( is_array( $rulevalue )) {
+              foreach( $rulevalue as $vix => $valuePart )
+                $v = $child->addChild( $rulelabel, $valuePart );
+            }
+            else
+              $v = $child->addChild( $rulelabel, $rulevalue );
+            break;
+          }
+          case 'byday': {
+            if( isset( $rulevalue['DAY'] )) {
+              $str  = ( isset( $rulevalue[0] )) ? $rulevalue[0] : '';
+              $str .= $rulevalue['DAY'];
+              $p    = $child->addChild( $rulelabel, $str );
+            }
+            else {
+              foreach( $rulevalue as $valuePart ) {
+                if( isset( $valuePart['DAY'] )) {
+                  $str  = ( isset( $valuePart[0] )) ? $valuePart[0] : '';
+                  $str .= $valuePart['DAY'];
+                  $p    = $child->addChild( $rulelabel, $str );
+                }
+                else
+                  $p    = $child->addChild( $rulelabel, $valuePart );
+              }
+            }
+            break;
+          }
+          case 'freq':
+          case 'count':
+          case 'interval':
+          case 'wkst':
+          default:
+            $p = $child->addChild( $rulelabel, $rulevalue );
+            break;
+        } // end switch( $rulelabel )
+      } // end foreach( $content as $rulelabel => $rulevalue )
+      break;
+    case 'rstatus':
+      $v = $child->addChild( 'code', number_format( (float) $content['statcode'], 2, '.', ''));
+      $v = $child->addChild( 'description', htmlspecialchars( $content['text'] ));
+      if( isset( $content['extdata'] ))
+        $v = $child->addChild( 'data', htmlspecialchars( $content['extdata'] ));
+      break;
+    case 'text':
+      if( !is_array( $content ))
+        $content = array( $content );
+      foreach( $content as $part )
+        $v = $child->addChild( $type, htmlspecialchars( $part ));
+      break;
+    case 'time':
+      break;
+    case 'uri':
+      $v = $child->addChild( $type, $content );
+      break;
+    case 'utc-offset':
+      if( in_array( substr( $content, 0, 1 ), array( '-', '+' ))) {
+        $str     = substr( $content, 0, 1 );
+        $content = substr( $content, 1 );
+      }
+      else
+        $str     = '+';
+      $str .= substr( $content, 0, 2 ).':'.substr( $content, 2, 2 );
+      if( 4 < strlen( $content ))
+        $str .= ':'.substr( $content, 4 );
+      $v = $child->addChild( $type, $str );
+      break;
+    case 'unknown':
+    default:
+      if( is_array( $content ))
+        $content = implode( '', $content );
+      $v = $child->addChild( 'unknown', htmlspecialchars( $content ));
+      break;
+  }
+}
+/**
+ * parse xml file into iCalcreator instance
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.22 - 2013-06-18
+ * @param  string $xmlfile
+ * @param  array  $iCalcfg iCalcreator config array (opt)
+ * @return mixediCalcreator instance or FALSE on error
+ */
+function XMLfile2iCal( $xmlfile, $iCalcfg=array()) {
+  if( FALSE === ( $xmlstr = file_get_contents( $xmlfile )))
+    return FALSE;
+  return xml2iCal( $xmlstr, $iCalcfg );
+}
+/**
+ * parse xml string into iCalcreator instance, alias of XML2iCal
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.22 - 2013-06-18
+ * @param  string $xmlstr
+ * @param  array  $iCalcfg iCalcreator config array (opt)
+ * @return mixed  iCalcreator instance or FALSE on error
+ */
+function XMLstr2iCal( $xmlstr, $iCalcfg=array()) {
+  return XML2iCal( $xmlstr, $iCalcfg);
+}
+/**
+ * parse xml string into iCalcreator instance
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.22 - 2013-06-20
+ * @param  string $xmlstr
+ * @param  array  $iCalcfg iCalcreator config array (opt)
+ * @return mixed  iCalcreator instance or FALSE on error
+ */
+function XML2iCal( $xmlstr, $iCalcfg=array()) {
+  $xmlstr  = str_replace( array( "\r\n", "\n\r", "\n", "\r" ), '', $xmlstr );
+  $xml     = XMLgetTagContent1( $xmlstr, 'vcalendar', $endIx );
+  $iCal    = new vcalendar( $iCalcfg );
+  XMLgetComps( $iCal, $xmlstr );
+  unset( $xmlstr );
+  return $iCal;
+}
+/**
+ * parse XML string into iCalcreator components
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.22 - 2013-06-20
+ * @param object $iCal, iCalcreator vcalendar or component object instance
+ * @param string $xml
+ * @return bool
+ */
+function XMLgetComps( $iCal, $xml ) {
+  static $comps = array( 'vtimezone', 'standard', 'daylight', 'vevent', 'vtodo', 'vjournal', 'vfreebusy', 'valarm' );
+  $sx      = 0;
+  while(( FALSE !== substr( $xml, ( $sx + 11 ), 1 )) &&
+        ( '<properties>' != substr( $xml, $sx, 12 )) && ( '<components>' != substr( $xml, $sx, 12 )))
+    $sx   += 1;
+  if( FALSE === substr( $xml, ( $sx + 11 ), 1 ))
+    return FALSE;
+  if( '<properties>' == substr( $xml, $sx, 12 )) {
+    $xml2  = XMLgetTagContent1( $xml, 'properties', $endIx );
+    XMLgetProps( $iCal, $xml2 );
+    $xml   = substr( $xml, $endIx );
+  }
+  if( '<components>' == substr( $xml, 0, 12 ))
+    $xml     = XMLgetTagContent1( $xml, 'components', $endIx );
+  while( ! empty( $xml )) {
+    $xml2  = XMLgetTagContent2( $xml, $tagName, $endIx );
+    if( in_array( strtolower( $tagName ), $comps ) && ( FALSE !== ( $subComp = $iCal->newComponent( $tagName ))))
+      XMLgetComps( $subComp, $xml2 );
+    $xml   = substr( $xml, $endIx);
+  }
+  unset( $xml );
+  return $iCal;
+}
+/**
+ * parse XML into iCalcreator properties
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.21 - 2013-06-23
+ * @param  array  $iCal iCalcreator calendar/component instance
+ * @param  string $xml
+ * @return void
+ */
+function XMLgetProps( $iCal, $xml) {
+  while( ! empty( $xml )) {
+    $xml2         = XMLgetTagContent2( $xml, $propName, $endIx );
+    $propName     = strtoupper( $propName );
+    if( empty( $xml2 ) && ( '0' != $xml2 )) {
+      $iCal->setProperty( $propName );
+      $xml        = substr( $xml, $endIx);
+      continue;
+    }
+    $params       = array();
+    if( '<parameters/>' == substr( $xml2, 0, 13 ))
+      $xml2       = substr( $xml2, 13 );
+    elseif( '<parameters>' == substr( $xml2, 0, 12 )) {
+      $xml3       = XMLgetTagContent1( $xml2, 'parameters', $endIx2 );
+      while( ! empty( $xml3 )) {
+        $xml4     = XMLgetTagContent2( $xml3, $paramKey, $endIx3 );
+        $pType    = FALSE; // skip parameter valueType
+        $paramKey = strtoupper( $paramKey );
+        if( in_array( $paramKey, array( 'DELEGATED-FROM', 'DELEGATED-TO', 'MEMBER' ))) {
+          while( ! empty( $xml4 )) {
+            if( ! isset( $params[$paramKey] ))
+              $params[$paramKey]   = array( XMLgetTagContent1( $xml4, 'cal-address', $endIx4 ));
+            else
+              $params[$paramKey][] = XMLgetTagContent1( $xml4, 'cal-address', $endIx4 );
+            $xml4     = substr( $xml4, $endIx4 );
+          }
+        }
+        else {
+          if( ! isset( $params[$paramKey] ))
+            $params[$paramKey]  = html_entity_decode( XMLgetTagContent2( $xml4, $pType, $endIx4 ));
+          else
+            $params[$paramKey] .= ','.html_entity_decode( XMLgetTagContent2( $xml4, $pType, $endIx4 ));
+        }
+        $xml3     = substr( $xml3, $endIx3 );
+      }
+      $xml2       = substr( $xml2, $endIx2 );
+    } // if( '<parameters>' == substr( $xml2, 0, 12 ))
+    $valueType    = FALSE;
+    $value        = ( ! empty( $xml2 ) || ( '0' == $xml2 )) ? XMLgetTagContent2( $xml2, $valueType, $endIx3 ) : '';
+    switch( $propName ) {
+      case 'CATEGORIES':
+      case 'RESOURCES':
+        $tValue      = array();
+        while( ! empty( $xml2 )) {
+          $tValue[]  = html_entity_decode( XMLgetTagContent2( $xml2, $valueType, $endIx4 ));
+          $xml2      = substr( $xml2, $endIx4 );
+        }
+        $value       = $tValue;
+        break;
+      case 'EXDATE':   // multiple single-date(-times) may exist
+      case 'RDATE':
+        if( 'period' != $valueType ) {
+          if( 'date' == $valueType )
+            $params['VALUE'] = 'DATE';
+          $t         = array();
+          while( ! empty( $xml2 ) && ( '<date' == substr( $xml2, 0, 5 ))) {
+            $t[]     = XMLgetTagContent2( $xml2, $pType, $endIx4 );
+            $xml2    = substr( $xml2, $endIx4 );
+          }
+          $value = $t;
+          break;
+        }
+      case 'FREEBUSY':
+        if( 'RDATE' == $propName )
+          $params['VALUE'] = 'PERIOD';
+        $value       = array();
+        while( ! empty( $xml2 ) && ( '<period>' == substr( $xml2, 0, 8 ))) {
+          $xml3      = XMLgetTagContent1( $xml2, 'period', $endIx4 ); // period
+          $t         = array();
+          while( ! empty( $xml3 )) {
+            $t[]     = XMLgetTagContent2( $xml3, $pType, $endIx5 ); // start - end/duration
+            $xml3    = substr( $xml3, $endIx5 );
+          }
+          $value[]   = $t;
+          $xml2      = substr( $xml2, $endIx4 );
+        }
+        break;
+      case 'TZOFFSETTO':
+      case 'TZOFFSETFROM':
+        $value       = str_replace( ':', '', $value );
+        break;
+      case 'GEO':
+        $tValue      = array( 'latitude' => $value );
+        $tValue['longitude'] = XMLgetTagContent1( substr( $xml2, $endIx3 ), 'longitude', $endIx3 );
+        $value       = $tValue;
+        break;
+      case 'EXRULE':
+      case 'RRULE':
+        $tValue      = array( $valueType => $value );
+        $xml2        = substr( $xml2, $endIx3 );
+        $valueType   = FALSE;
+        while( ! empty( $xml2 )) {
+          $t         = XMLgetTagContent2( $xml2, $valueType, $endIx4 );
+          switch( $valueType ) {
+            case 'freq':
+            case 'count':
+            case 'until':
+            case 'interval':
+            case 'wkst':
+              $tValue[$valueType] = $t;
+              break;
+            case 'byday':
+              if( 2 == strlen( $t ))
+                $tValue[$valueType][] = array( 'DAY' => $t );
+              else {
+                $day = substr( $t, -2 );
+                $key = substr( $t, 0, ( strlen( $t ) - 2 ));
+                $tValue[$valueType][] = array( $key, 'DAY' => $day );
+              }
+              break;
+            default:
+              $tValue[$valueType][] = $t;
+          }
+          $xml2      = substr( $xml2, $endIx4 );
+        }
+        $value       = $tValue;
+        break;
+      case 'REQUEST-STATUS':
+        $tValue      = array();
+        while( ! empty( $xml2 )) {
+          $t         = html_entity_decode( XMLgetTagContent2( $xml2, $valueType, $endIx4 ));
+          $tValue[$valueType] = $t;
+          $xml2    = substr( $xml2, $endIx4 );
+        }
+        if( ! empty( $tValue ))
+          $value   = $tValue;
+        else
+          $value   = array( 'code' => null, 'description' => null );
+        break;
+      default:
+        switch( $valueType ) {
+          case 'binary':    $params['VALUE'] = 'BINARY';           break;
+          case 'date':      $params['VALUE'] = 'DATE';             break;
+          case 'date-time': $params['VALUE'] = 'DATE-TIME';        break;
+          case 'text':
+          case 'unknown':   $value = html_entity_decode( $value ); break;
+        }
+        break;
+    } // end switch( $propName )
+    if( 'FREEBUSY' == $propName ) {
+      $fbtype = $params['FBTYPE'];
+      unset( $params['FBTYPE'] );
+      $iCal->setProperty( $propName, $fbtype, $value, $params );
+    }
+    elseif( 'GEO' == $propName )
+      $iCal->setProperty( $propName, $value['latitude'], $value['longitude'], $params );
+    elseif( 'REQUEST-STATUS' == $propName ) {
+      if( !isset( $value['data'] ))
+        $value['data'] = FALSE;
+      $iCal->setProperty( $propName, $value['code'], $value['description'], $value['data'], $params );
+    }
+    else {
+      if( empty( $value ) && ( is_array( $value ) || ( '0' > $value )))
+        $value = '';
+      $iCal->setProperty( $propName, $value, $params );
+    }
+    $xml        = substr( $xml, $endIx);
+  } // end while( ! empty( $xml ))
+}
+/**
+ * fetch a specific XML tag content
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.22 - 2013-06-20
+ * @param string $xml
+ * @param string $tagName
+ * @param int $endIx
+ * @return mixed
+ */
+function XMLgetTagContent1( $xml, $tagName, & $endIx=0 ) {
+  $strlen    = strlen( $tagName );
+  $sx1       = 0;
+  while( FALSE !== substr( $xml, $sx1, 1 )) {
+    if(( FALSE !== substr( $xml, ( $sx1 + $strlen + 1 ), 1 )) &&
+       ( strtolower( "<$tagName>" )   == strtolower( substr( $xml, $sx1, ( $strlen + 2 )))))
+      break;
+    if(( FALSE !== substr( $xml, ( $sx1 + $strlen + 3 ), 1 )) &&
+       ( strtolower( "<$tagName />" ) == strtolower( substr( $xml, $sx1, ( $strlen + 4 ))))) { // empty tag
+      $endIx = $strlen + 5;
+      return '';
+    }
+    if(( FALSE !== substr( $xml, ( $sx1 + $strlen + 2 ), 1 )) &&
+       ( strtolower( "<$tagName/>" )  == strtolower( substr( $xml, $sx1, ( $strlen + 3 ))))) { // empty tag
+      $endIx = $strlen + 4;
+      return '';
+    }
+    $sx1    += 1;
+  }
+  if( FALSE === substr( $xml, $sx1, 1 )) {
+    $endIx   = ( empty( $sx )) ? 0 : $sx - 1;
+    return '';
+  }
+  if( FALSE === ( $pos = stripos( $xml, "</$tagName>" ))) { // missing end tag??
+    $endIx   = strlen( $xml ) + 1;
+    return '';
+  }
+  $endIx     = $pos + $strlen + 3;
+  return substr( $xml, ( $sx1 + $strlen + 2 ), ( $pos - $sx1 - 2 - $strlen ));
+}
+/**
+ * fetch next (unknown) XML tagname AND content
+ *
+ * @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @since 2.16.22 - 2013-06-20
+ * @param string $xml
+ * @param string $tagName
+ * @param int $endIx
+ * @return mixed
+ */
+function XMLgetTagContent2( $xml, & $tagName, & $endIx ) {
+  $endIx       = strlen( $xml ) + 1; // just in case.. .
+  $sx1         = 0;
+  while( FALSE !== substr( $xml, $sx1, 1 )) {
+    if( '<' == substr( $xml, $sx1, 1 )) {
+      if(( FALSE !== substr( $xml, ( $sx1 + 3 ), 1 )) && ( '<!--' == substr( $xml, $sx1, 4 ))) // skip comment
+        $sx1  += 1;
+      else
+        break; // tagname start here
+    }
+    else
+      $sx1    += 1;
+  }
+  $sx2         = $sx1;
+  while( FALSE !== substr( $xml, $sx2 )) {
+    if(( FALSE !== substr( $xml, ( $sx2 + 1 ), 1 )) && ( '/>' == substr( $xml, $sx2, 2 ))) { // empty tag
+      $tagName = trim( substr( $xml, ( $sx1 + 1 ), ( $sx2 - $sx1 - 1 )));
+      $endIx   = $sx2 + 2;
+      return '';
+    }
+    if( '>' == substr( $xml, $sx2, 1 )) // tagname ends here
+      break;
+    $sx2      += 1;
+  }
+  $tagName     = substr( $xml, ( $sx1 + 1 ), ( $sx2 - $sx1 - 1 ));
+  $endIx       = $sx2 + 1;
+  if( FALSE === substr( $xml, $sx2, 1 )) {
+    return '';
+  }
+  $strlen      = strlen( $tagName );
+  if(( 'duration' == $tagName ) &&
+     ( FALSE !== ( $pos1 = stripos( $xml, "<duration>",  $sx1+1  ))) &&
+     ( FALSE !== ( $pos2 = stripos( $xml, "</duration>", $pos1+1 ))) &&
+     ( FALSE !== ( $pos3 = stripos( $xml, "</duration>", $pos2+1 ))) &&
+     ( $pos1 < $pos2 ) && ( $pos2 < $pos3 ))
+    $pos = $pos3;
+  elseif( FALSE === ( $pos = stripos( $xml, "</$tagName>", $sx2 )))
+    return '';
+  $endIx       = $pos + $strlen + 3;
+  return substr( $xml, ( $sx1 + $strlen + 2 ), ( $pos - $strlen - 2 ));
+}
+/*********************************************************************************/
+/*          Additional functions to use with vtimezone components                */
+/*********************************************************************************/
+/**
+ * For use with
+ * iCalcreator (kigkonsult.se/iCalcreator/index.php)
+ * copyright (c) 2011 Yitzchok Lavi
+ * icalcreator@onebigsystem.com
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+/**
+ * Additional functions to use with vtimezone components
+ *
+ * Before calling the functions, set time zone 'GMT' ('date_default_timezone_set')!
+ *
+ * @author Yitzchok Lavi <icalcreator@onebigsystem.com>
+ *         adjusted for iCalcreator Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
+ * @version 1.0.2 - 2011-02-24
+ *
+ */
+/**
+ * Returns array with the offset information from UTC for a (UTC) datetime/timestamp in the
+ * timezone, according to the VTIMEZONE information in the input array.
+ *
+ * $param array  $timezonesarray, output from function getTimezonesAsDateArrays (below)
+ * $param string $tzid,           time zone identifier
+ * $param mixed  $timestamp,      timestamp or a UTC datetime (in array format)
+ * @return array, time zone data with keys for 'offsetHis', 'offsetSec' and 'tzname'
+ *
+ */
+function getTzOffsetForDate($timezonesarray, $tzid, $timestamp) {
+    if( is_array( $timestamp )) {
+//$disp = sprintf( '%04d%02d%02d %02d%02d%02d', $timestamp['year'], $timestamp['month'], $timestamp['day'], $timestamp['hour'], $timestamp['min'], $timestamp['sec'] ); // test ###
+      $timestamp = gmmktime(
+            $timestamp['hour'],
+            $timestamp['min'],
+            $timestamp['sec'],
+            $timestamp['month'],
+            $timestamp['day'],
+            $timestamp['year']
+            ) ;
+    }
+    $tzoffset = array();
+    // something to return if all goes wrong (such as if $tzid doesn't find us an array of dates)
+    $tzoffset['offsetHis'] = '+0000';
+    $tzoffset['offsetSec'] = 0;
+    $tzoffset['tzname']    = '?';
+    if( !isset( $timezonesarray[$tzid] ))
+      return $tzoffset;
+    $tzdatearray = $timezonesarray[$tzid];
+    if ( is_array($tzdatearray) ) {
+        sort($tzdatearray); // just in case
+        if ( $timestamp < $tzdatearray[0]['timestamp'] ) {
+            // our date is before the first change
+            $tzoffset['offsetHis'] = $tzdatearray[0]['tzbefore']['offsetHis'] ;
+            $tzoffset['offsetSec'] = $tzdatearray[0]['tzbefore']['offsetSec'] ;
+            $tzoffset['tzname']    = $tzdatearray[0]['tzbefore']['offsetHis'] ; // we don't know the tzname in this case
+        } elseif ( $timestamp >= $tzdatearray[count($tzdatearray)-1]['timestamp'] ) {
+            // our date is after the last change (we do this so our scan can stop at the last record but one)
+            $tzoffset['offsetHis'] = $tzdatearray[count($tzdatearray)-1]['tzafter']['offsetHis'] ;
+            $tzoffset['offsetSec'] = $tzdatearray[count($tzdatearray)-1]['tzafter']['offsetSec'] ;
+            $tzoffset['tzname']    = $tzdatearray[count($tzdatearray)-1]['tzafter']['tzname'] ;
+        } else {
+            // our date somewhere in between
+            // loop through the list of dates and stop at the one where the timestamp is before our date and the next one is after it
+            // we don't include the last date in our loop as there isn't one after it to check
+            for ( $i = 0 ; $i <= count($tzdatearray)-2 ; $i++ ) {
+                if(( $timestamp >= $tzdatearray[$i]['timestamp'] ) && ( $timestamp < $tzdatearray[$i+1]['timestamp'] )) {
+                    $tzoffset['offsetHis'] = $tzdatearray[$i]['tzafter']['offsetHis'] ;
+                    $tzoffset['offsetSec'] = $tzdatearray[$i]['tzafter']['offsetSec'] ;
+                    $tzoffset['tzname']    = $tzdatearray[$i]['tzafter']['tzname'] ;
+                    break;
+                }
+            }
+        }
+    }
+    return $tzoffset;
+}
+/**
+ * Returns an array containing all the timezone data in the vcalendar object
+ *
+ * @param object $vcalendar, iCalcreator calendar instance
+ * @return array, time zone transition timestamp, array before(offsetHis, offsetSec), array after(offsetHis, offsetSec, tzname)
+ *                based on the timezone data in the vcalendar object
+ *
+ */
+function getTimezonesAsDateArrays($vcalendar) {
+    $timezonedata = array();
+    while( $vtz = $vcalendar->getComponent( 'vtimezone' )) {
+        $tzid       = $vtz->getProperty('tzid');
+        $alltzdates = array();
+        while ( $vtzc = $vtz->getComponent( 'standard' )) {
+            $newtzdates = expandTimezoneDates($vtzc);
+            $alltzdates = array_merge($alltzdates, $newtzdates);
+        }
+        while ( $vtzc = $vtz->getComponent( 'daylight' )) {
+            $newtzdates = expandTimezoneDates($vtzc);
+            $alltzdates = array_merge($alltzdates, $newtzdates);
+        }
+        sort($alltzdates);
+        $timezonedata[$tzid] = $alltzdates;
+    }
+    return $timezonedata;
+}
+/**
+ * Returns an array containing time zone data from vtimezone standard/daylight instances
+ *
+ * @param object $vtzc, an iCalcreator calendar standard/daylight instance
+ * @return array, time zone data; array before(offsetHis, offsetSec), array after(offsetHis, offsetSec, tzname)
+ *
+ */
+function expandTimezoneDates($vtzc) {
+    $tzdates = array();
+    // prepare time zone "description" to attach to each change
+    $tzbefore = array();
+    $tzbefore['offsetHis']  = $vtzc->getProperty('tzoffsetfrom') ;
+    $tzbefore['offsetSec'] = iCalUtilityFunctions::_tz2offset($tzbefore['offsetHis']);
+    if(( '-' != substr( (string) $tzbefore['offsetSec'], 0, 1 )) && ( '+' != substr( (string) $tzbefore['offsetSec'], 0, 1 )))
+      $tzbefore['offsetSec'] = '+'.$tzbefore['offsetSec'];
+    $tzafter = array();
+    $tzafter['offsetHis']   = $vtzc->getProperty('tzoffsetto') ;
+    $tzafter['offsetSec']  = iCalUtilityFunctions::_tz2offset($tzafter['offsetHis']);
+    if(( '-' != substr( (string) $tzafter['offsetSec'], 0, 1 )) && ( '+' != substr( (string) $tzafter['offsetSec'], 0, 1 )))
+      $tzafter['offsetSec'] = '+'.$tzafter['offsetSec'];
+    if( FALSE === ( $tzafter['tzname'] = $vtzc->getProperty('tzname')))
+      $tzafter['tzname'] = $tzafter['offsetHis'];
+    // find out where to start from
+    $dtstart = $vtzc->getProperty('dtstart');
+    $dtstarttimestamp = mktime(
+            $dtstart['hour'],
+            $dtstart['min'],
+            $dtstart['sec'],
+            $dtstart['month'],
+            $dtstart['day'],
+            $dtstart['year']
+            ) ;
+    if( !isset( $dtstart['unparsedtext'] )) // ??
+      $dtstart['unparsedtext'] = sprintf( '%04d%02d%02dT%02d%02d%02d', $dtstart['year'], $dtstart['month'], $dtstart['day'], $dtstart['hour'], $dtstart['min'], $dtstart['sec'] );
+    if ( $dtstarttimestamp == 0 ) {
+        // it seems that the dtstart string may not have parsed correctly
+        // let's set a timestamp starting from 1902, using the time part of the original string
+        // so that the time will change at the right time of day
+        // at worst we'll get midnight again
+        $origdtstartsplit = explode('T',$dtstart['unparsedtext']) ;
+        $dtstarttimestamp = strtotime("19020101",0);
+        $dtstarttimestamp = strtotime($origdtstartsplit[1],$dtstarttimestamp);
+    }
+    // the date (in dtstart and opt RDATE/RRULE) is ALWAYS LOCAL (not utc!!), adjust from 'utc' to 'local' timestamp
+    $diff  = -1 * $tzbefore['offsetSec'];
+    $dtstarttimestamp += $diff;
+                // add this (start) change to the array of changes
+    $tzdates[] = array(
+        'timestamp' => $dtstarttimestamp,
+        'tzbefore'  => $tzbefore,
+        'tzafter'   => $tzafter
+        );
+    $datearray = getdate($dtstarttimestamp);
+    // save original array to use time parts, because strtotime (used below) apparently loses the time
+    $changetime = $datearray ;
+    // generate dates according to an RRULE line
+    $rrule = $vtzc->getProperty('rrule') ;
+    if ( is_array($rrule) ) {
+        if ( $rrule['FREQ'] == 'YEARLY' ) {
+            // calculate transition dates starting from DTSTART
+            $offsetchangetimestamp = $dtstarttimestamp;
+            // calculate transition dates until 10 years in the future
+            $stoptimestamp = strtotime("+10 year",time());
+            // if UNTIL is set, calculate until then (however far ahead)
+            if ( isset( $rrule['UNTIL'] ) && ( $rrule['UNTIL'] != '' )) {
+                $stoptimestamp = mktime(
+                    $rrule['UNTIL']['hour'],
+                    $rrule['UNTIL']['min'],
+                    $rrule['UNTIL']['sec'],
+                    $rrule['UNTIL']['month'],
+                    $rrule['UNTIL']['day'],
+                    $rrule['UNTIL']['year']
+                    ) ;
+            }
+            $count = 0 ;
+            $stopcount = isset( $rrule['COUNT'] ) ? $rrule['COUNT'] : 0 ;
+            $daynames = array(
+                        'SU' => 'Sunday',
+                        'MO' => 'Monday',
+                        'TU' => 'Tuesday',
+                        'WE' => 'Wednesday',
+                        'TH' => 'Thursday',
+                        'FR' => 'Friday',
+                        'SA' => 'Saturday'
+                        );
+            // repeat so long as we're between DTSTART and UNTIL, or we haven't prepared COUNT dates
+            while ( $offsetchangetimestamp < $stoptimestamp && ( $stopcount == 0 || $count < $stopcount ) ) {
+                // break up the timestamp into its parts
+                $datearray = getdate($offsetchangetimestamp);
+                if ( isset( $rrule['BYMONTH'] ) && ( $rrule['BYMONTH'] != 0 )) {
+                    // set the month
+                    $datearray['mon'] = $rrule['BYMONTH'] ;
+                }
+                if ( isset( $rrule['BYMONTHDAY'] ) && ( $rrule['BYMONTHDAY'] != 0 )) {
+                    // set specific day of month
+                    $datearray['mday']  = $rrule['BYMONTHDAY'];
+                } elseif ( is_array($rrule['BYDAY']) ) {
+                    // find the Xth WKDAY in the month
+                    // the starting point for this process is the first of the month set above
+                    $datearray['mday'] = 1 ;
+                    // turn $datearray as it is now back into a timestamp
+                    $offsetchangetimestamp = mktime(
+                        $datearray['hours'],
+                        $datearray['minutes'],
+                        $datearray['seconds'],
+                        $datearray['mon'],
+                        $datearray['mday'],
+                        $datearray['year']
+                            );
+                    if ($rrule['BYDAY'][0] > 0) {
+                        // to find Xth WKDAY in month, we find last WKDAY in month before
+                        // we do that by finding first WKDAY in this month and going back one week
+                        // then we add X weeks (below)
+                        $offsetchangetimestamp = strtotime($daynames[$rrule['BYDAY']['DAY']],$offsetchangetimestamp);
+                        $offsetchangetimestamp = strtotime("-1 week",$offsetchangetimestamp);
+                    } else {
+                        // to find Xth WKDAY before the end of the month, we find the first WKDAY in the following month
+                        // we do that by going forward one month and going to WKDAY there
+                        // then we subtract X weeks (below)
+                        $offsetchangetimestamp = strtotime("+1 month",$offsetchangetimestamp);
+                        $offsetchangetimestamp = strtotime($daynames[$rrule['BYDAY']['DAY']],$offsetchangetimestamp);
+                    }
+                    // now move forward or back the appropriate number of weeks, into the month we want
+                    $offsetchangetimestamp = strtotime($rrule['BYDAY'][0] . " week",$offsetchangetimestamp);
+                    $datearray = getdate($offsetchangetimestamp);
+                }
+                // convert the date parts back into a timestamp, setting the time parts according to the
+                // original time data which we stored
+                $offsetchangetimestamp = mktime(
+                    $changetime['hours'],
+                    $changetime['minutes'],
+                    $changetime['seconds'] + $diff,
+                    $datearray['mon'],
+                    $datearray['mday'],
+                    $datearray['year']
+                        );
+                // add this change to the array of changes
+                $tzdates[] = array(
+                    'timestamp' => $offsetchangetimestamp,
+                    'tzbefore'  => $tzbefore,
+                    'tzafter'   => $tzafter
+                    );
+                // update counters (timestamp and count)
+                $offsetchangetimestamp = strtotime("+" . (( isset( $rrule['INTERVAL'] ) && ( $rrule['INTERVAL'] != 0 )) ? $rrule['INTERVAL'] : 1 ) . " year",$offsetchangetimestamp);
+                $count += 1 ;
+            }
+        }
+    }
+    // generate dates according to RDATE lines
+    while ($rdates = $vtzc->getProperty('rdate')) {
+        if ( is_array($rdates) ) {
+
+            foreach ( $rdates as $rdate ) {
+                // convert the explicit change date to a timestamp
+                $offsetchangetimestamp = mktime(
+                        $rdate['hour'],
+                        $rdate['min'],
+                        $rdate['sec'] + $diff,
+                        $rdate['month'],
+                        $rdate['day'],
+                        $rdate['year']
+                        ) ;
+                // add this change to the array of changes
+                $tzdates[] = array(
+                    'timestamp' => $offsetchangetimestamp,
+                    'tzbefore'  => $tzbefore,
+                    'tzafter'   => $tzafter
+                    );
+            }
+        }
+    }
+    return $tzdates;
+}
+?>
diff --git a/htmltest/sites/all/libraries/iCalcreator-version/lgpl.txt b/htmltest/sites/all/libraries/iCalcreator-version/lgpl.txt
new file mode 100644
index 00000000..5ab7695a
--- /dev/null
+++ b/htmltest/sites/all/libraries/iCalcreator-version/lgpl.txt
@@ -0,0 +1,504 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/htmltest/sites/all/libraries/iCalcreator-version/releaseNotes-2.18 b/htmltest/sites/all/libraries/iCalcreator-version/releaseNotes-2.18
new file mode 100644
index 00000000..46ccbec0
--- /dev/null
+++ b/htmltest/sites/all/libraries/iCalcreator-version/releaseNotes-2.18
@@ -0,0 +1,40 @@
+2.16.13 ######################
+BUG: fcn selectComponents, sequence usage
+
+2.16.15 ######################
+BUG: fcn getComponent, making a selection based on a property value
+
+2.16.16 ######################
+BUG: fcn _duration2arr, duration parts management
+
+2.16.17 ######################
+BUG: fcn _duration2arr, array input
+
+2.16.18 ######################
+BUG: fcn setDuration, empty input
+
+2.16.19 ######################
+BUG: fcn sort, sort key setting
+
+2.16.21 ######################
+BUG: mgnt of empty properties
+
+2.16.22 ######################
+NEW: fcn XML2iCal, rewrite from the furure iCalcreator (Pro) 3.0.0
+UPD: fcn iCal2XML, updated from the furure iCalcreator (Pro) 3.0.0
+
+2.16.23 ######################
+BUG: fcn _duration2arr (setTRIGGER), array input
+
+2.16.24 ######################
+UPD: fcn _setDate,  (_chkDateArr, _strdate2date), DTSTART etc
+UPD: fcn _setDate2 (_isArrayDate() DTSTAMP etc
+
+2.16.25  ######################
+UPD: fcn _format_recur, updated from the furure iCalcreator (Pro) 3.0.0
+
+2.16.26  ######################
+BUG: fcn parse, 'X-'-properties in an array of (iCal property) lines
+
+2.16.27  ######################
+NEW: fcn, sort freebusy dates asc
diff --git a/htmltest/sites/all/libraries/iCalcreator-version/summary.html b/htmltest/sites/all/libraries/iCalcreator-version/summary.html
new file mode 100644
index 00000000..a45ed667
--- /dev/null
+++ b/htmltest/sites/all/libraries/iCalcreator-version/summary.html
@@ -0,0 +1,538 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
+<html>
+<head>
+<title>iCalcreator 2.18 summary</title>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+<meta name="author"      content="Kjell-Inge Gustafsson, kigkonsult, All rights reserved">
+<meta name="copyright"   content="2007-2013 Kjell-Inge Gustafsson, kigkonsult">
+<meta name="keywords"    content="ical, calendar, calender, xcal, xml, icalender, rfc2445, rfc5545, vcalender, php, create">
+<meta name="description" content="iCalcreator summary" />
+<style type="text/css">
+body {
+  FONT-FAMILY     : "Lucida Grande","Lucida Sans Unicode", "Bitstream Vera Sans", Lucida, Arial, Geneva, Helvetica, sans-serif;
+  FONT-SIZE       : small;
+  MARGIN          : 10px;
+  WIDTH           : 800px;
+}
+h1 {
+  FONT-SIZE       : large;
+  FONT-WEIGHT     : bold;
+}
+h2 {
+  FONT-SIZE       : large;
+}
+h3 {
+  FONT-SIZE       : medium;
+}
+h4 {
+  FONT-SIZE       : small;
+  FONT-WEIGHT     : bold;
+}
+h5 {
+  FONT-SIZE       : small;
+  FONT-WEIGHT     : normal;
+  TEXT-DECORATION : underline;
+}
+pre {
+  BACKGROUND-COLOR: #DCDCDC;
+  FONT-FAMILY     : monospace;
+  FONT-SIZE       : medium;
+  LETTER-SPACING  : 0.1em;
+  LINE-HEIGHT     : 1.5em;
+  WHITE-SPACE     : pre-wrap;      /* css-3 */
+  WHITE-SPACE     : -moz-pre-wrap; /* Mozilla, since 1999 */
+  WHITE-SPACE     : -pre-wrap;     /* Opera 4-6 */
+  WHITE-SPACE     : -o-pre-wrap;   /* Opera 7 */
+  WORD-WRAP       : break-word;    /* Internet Explorer 5.5+ */
+}
+.comment {
+  FONT-FAMILY     : arial;
+  FONT-SIZE       : small;
+  FONT-STYLE      : italic;
+}
+</style>
+</head>
+<body>
+
+<h1>iCalcreator v2.18</h1>
+<p>
+iCalcreator v2.18<br>
+Copyright (c) 2007-2013 Kjell-Inge Gustafsson, kigkonsult, All rights reserved.<br>
+<a href="http://kigkonsult.se/iCalcreator/index.php" title="kigkonsult.se/iCalcreator" target="_blank">kigkonsult.se iCalcreator</a><br>
+<a href="http://kigkonsult.se/contact/index.php" title="kigkonsult.se contact" target="_blank">kigkonsult.se contact</a>
+</p>
+<h4>Preface</h2>
+<p>
+This document is provided by kigkonsult for informational purposes
+and is provided on an &quot;as is&quot; basis without any warranties expressed or implied.
+</p>
+<p>
+Information in this document is subject to change without notice and does
+not represent a commitment on the part of kigkonsult.
+The software described in this document is provided under a license agreement, <a href="http://kigkonsult.se/downloads/dl.php?f=GPL">GNU Lesser General Public License</a>.
+The software may be used only in accordance with the terms of that license agreement.
+It is against the law to copy or use the software except as specifically allowed in the license agreement.
+</p>
+<p>
+It is the users responsibility to ensure the suitability of the software before using it.
+In no circumstances will kigkonsult be responsible for
+the use of the software's outcomes or results or any loss
+or damage of data or programs as a result of using the software.
+The use of the software implies acceptance of these terms.
+</p>
+<p>
+This document makes previous versions obsolete.
+</p>
+<h4>The software</h2>
+<p>
+This document describes a <b>short summary</b> usage of iCalcreator, a <em>PHP</em> software implementation of standards rfc5545/rfc5546 (rfc2445/rfc2446) to manage iCal formatted files.
+</p>
+<p>
+iCalcreator is a <em>PHP</em> class package managing iCal files, supporting (non-)<strong>calendar</strong>
+systems and applications to process and communicate <strong>calendar</strong> information like
+events, agendas, tasks, reports, totos and journaling information.
+</p>
+<p>
+The iCalcreator package, built of a <strong>calendar</strong> class with support of a function class and helper functions, are <strong>calendar</strong>
+component property oriented. Development environment is <em>PHP</em> version 5.x but coding is done
+to meet 4.x backward compatibility and may work. Some functions requires <em>PHP</em> >= 5.2.0.
+</p>
+<p>
+The iCalcreator main class, utility class and helper functions are included in the &quot;iCalcreator.class.php&quot; file.
+</p>
+<p>
+More iCalcreator supplementary, usage and &quot;howto&quot; information will be found at kigkonsult.se iCalcreator
+ <a href="http://kigkonsult.se/test/index.php" title="kigkonsult.se iCalcreator implement and test examples" target="_blank">coding and test</a> pages.
+ A strong recommendation is to have the document
+ <a href="http://kigkonsult.se/iCalcreator/docs/using.html" title="iCalcreator user's Manual" target="_blank">user's manual</a>
+ open in parallel when exploiting the link.
+</p>
+
+<h4>iCal</h4>
+<p>
+A short iCal description is found at <a href="http://en.wikipedia.org/wiki/ICalendar#Core_object" title="iCalendar From Wikipedia, the free encyclopedia" target="_blank">Wikipedia</a>.
+ If You are not familiar with iCal, read this first!
+</p>
+<p>
+Knowledge of <strong>calendar</strong> protocol rfc5545/rfc5546  is to recommend;
+</p>
+<dl>
+<dt><a href="http://kigkonsult.se/downloads/dl.php?f=rfc5545" title="Download RFC5545 in text format" target="_blank">rfc5545</a>
+<dd>Internet Calendaring and Scheduling Core Object Specification (iCalendar)
+<dd>obsoletes <a href="http://kigkonsult.se/downloads/dl.php?f=rfc2445" title="Download RFC2445 in text format">rfc2445</a>
+<dt><a href="http://kigkonsult.se/downloads/dl.php?f=rfc5546" title="Download RFC5546 in text format" target="_blank">rfc5546</a>
+<dd>iCalendar Transport-Independent Interoperability Protocol (iTIP) Scheduling Events, BusyTime, To-dos and Journal Entries
+<dd>obsoletes <a href="http://kigkonsult.se/downloads/dl.php?f=rfc2446" title="Download RFC2446 in text format">rfc2446</a>.
+</dl>
+
+<h4>xCal</h4>
+<p>
+iCalcreator also supports xCal (iCal xml).
+</p>
+<dl>
+<dt>
+<dt><a href="http://kigkonsult.se/downloads/dl.php?f=rfc6321" title="Download RFC6321 in text format" target="_blank">rfc6321</a>
+<dd>xCal: The XML Format for <strong>iCalendar</strong>
+</dl>
+
+<h4>SUPPORT</h4>
+<p>
+The main support channel is using iCalcreator
+<a title="Sourceforge" href="http://sourceforge.net/projects/icalcreator/forums/" target="_blank">Sourceforge</a> forum.
+</p>
+<p>
+Support and development is now focused on iCalcreator (Pro) 3.x versions, which, in turn, will affect future releases
+of iCalcreator 2.x.
+</p>
+<p>
+kigkonsult offer services for software support, design and development of customizations and adaptations of <em>PHP</em>/<em>MySQL</em> solutions
+with a special focus on software long term utility and reliability,
+supported through our agile acquire/design/transition process model.
+</p>
+
+<h4>DONATE</h4>
+<p>
+You can show your appreciation for our free software,
+and can support future development by making a donation to the kigkonsult GPL/LGPL projects.
+</p>
+<p>
+Make a donation of any size by clicking <a href="http://kigkonsult.se/contact/index.php#Donate" title="Donate" target="_blank">here</a>.
+Thanks in advance!
+</p>
+
+<h4>Contact</h4>
+<p>
+Use the <a href="http://kigkonsult.se/contact/index.php" title="kigkonsult.se/contact" target="_blank">contact page</a>
+ for queries, improvement/development issues or professional support and development.
+ Please note that paid support or consulting service has the highest priority.
+</p>
+
+<h4>Downloads and usage examples</h4>
+<p>
+At <a href="http://kigkonsult.se/iCalcreator/index.php" title="kigkonsult iCalcreator" target="_blank">kigkonsult.se</a> you can download the
+<a href="http://kigkonsult.se/downloads/index.php#iCalcreator" title="iCalcreator complete manual" target="_blank">complete manual</a>
+and review and explore iCalcreator usage at the
+<a href="http://kigkonsult.se/test/index.php" title="kigkonsult.se iCalcreator implement and test examples" target="_blank">coding and test</a> pages.
+</p>
+
+<h4>INSTALL</h4>
+<dl>
+<dt>Unpack to any folder
+<dd>add this folder to your include-path
+<dd>or unpack to your application-(include)-folder<br>
+</dl>
+<p>
+Add
+</p>
+<pre>&lt;?php
+.. .
+require_once './iCalcreator.class.php';
+.. .
+?&gt;
+</pre>
+<p>
+to your php-script.
+</p>
+<p>
+When creating a new calendar(/component) object instance, review config settings.
+</p>
+<p>
+To really boost performance, visit kigkonsult.se contact <a href="http://kigkonsult.se/contact/index.php"><u>page</u></a> for information.
+</p>
+
+
+<h2>CREATE</h2>
+
+<pre>&lt;?php
+.. .
+require_once( &quot;iCalcreator.class.php&quot; );
+$tz = &quot;Europe/Stockholm&quot;;                                  // <span class="comment">define time zone</span>
+$config = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,           // <span class="comment">set Your unique id, </span>
+                                                           // <span class="comment">required if any component UID is missing</span>
+                 &quot;TZID&quot;      =&gt; $tz );                     // <span class="comment">opt. set &quot;calendar&quot; timezone</span>
+$v = new vcalendar( $config );                             // <span class="comment">create a new calendar object instance</span>
+
+$v->setProperty( &quot;method&quot;, &quot;PUBLISH&quot; );                    // <span class="comment">required of some <strong>calendar</strong> software</span>
+$v->setProperty( &quot;x-wr-calname&quot;, &quot;Calendar Sample&quot; );      // <span class="comment">required of some <strong>calendar</strong> software</span>
+$v->setProperty( &quot;X-WR-CALDESC&quot;, &quot;Calendar Description&quot; ); // <span class="comment">required of some <strong>calendar</strong> software</span>
+$v->setProperty( &quot;X-WR-TIMEZONE&quot;, $tz );                   // <span class="comment">required of some <strong>calendar</strong> software</span>
+.. .
+$xprops = array( &quot;X-LIC-LOCATION&quot; => $tz );                // <span class="comment">required of some <strong>calendar</strong> software</span>
+iCalUtilityFunctions::createTimezone( $v, $tz, $xprops );  // <span class="comment">create timezone component(-s) <b>opt. 1</b></span>
+.. .                                                       // <span class="comment">based on present date</span>
+.. .
+$vevent = &amp; $v->newComponent( &quot;vevent&quot; );                  // <span class="comment">create an event <strong>calendar</strong> component</span>
+$vevent->setProperty( &quot;dtstart&quot;, array( &quot;year&quot;  =&gt; 2007
+                                      , &quot;month&quot; =&gt;    4
+                                      , &quot;day&quot;   =&gt;    1
+                                      , &quot;hour&quot;  =&gt;   19
+                                      , &quot;min&quot;   =&gt;    0
+                                      , &quot;sec&quot;   =&gt;    0 ));
+$vevent->setProperty( &quot;dtend&quot;,   array( &quot;year&quot;  =&gt; 2007
+                                      , &quot;month&quot; =&gt;    4
+                                      , &quot;day&quot;   =&gt;    1
+                                      , &quot;hour&quot;  =&gt;   22
+                                      , &quot;min&quot;   =&gt;   30
+                                      , &quot;sec&quot;   =&gt;    0 ));
+$vevent->setProperty( &quot;LOCATION&quot;, &quot;Central Placa&quot; );       // <span class="comment">property name - case independent</span>
+$vevent->setProperty( &quot;summary&quot;, &quot;PHP summit&quot; );
+$vevent->setProperty( &quot;description&quot;, &quot;This is a description&quot; );
+$vevent->setProperty( &quot;comment&quot;, &quot;This is a comment&quot; );
+$vevent->setProperty( &quot;attendee&quot;, &quot;attendee1@icaldomain.net&quot; );
+.. .
+$valarm = &amp; $vevent->newComponent( &quot;valarm&quot; );             // <span class="comment">create an event alarm</span>
+$valarm->setProperty(&quot;action&quot;, &quot;DISPLAY&quot; );
+$valarm->setProperty(&quot;description&quot;, $vevent->getProperty( &quot;description&quot; );
+.. .                                                       // <span class="comment">reuse the event description</span>
+$d = sprintf( '%04d%02d%02d %02d%02d%02d', 2007, 3, 31, 15, 0, 0 );
+iCalUtilityFunctions::transformDateTime( $d, $tz, &quot;UTC&quot;, &quot;Ymd\THis\Z&quot;);
+$valarm->setProperty( &quot;trigger&quot;, $d );                     // <span class="comment">create alarm trigger (in UTC datetime)</span>
+.. .
+$vevent = &amp; $v->newComponent( &quot;vevent&quot; );                  // <span class="comment">create next event calendar component</span>
+$vevent->setProperty( &quot;dtstart&quot;, &quot;20070401&quot;, array(&quot;VALUE&quot; =&gt; &quot;DATE&quot;));// <span class="comment">alt. date format,</span>
+                                                           // <span class="comment"> now for an all-day event</span>
+$vevent->setProperty( &quot;organizer&quot; , &quot;boss@icaldomain.com&quot; );
+$vevent->setProperty( &quot;summary&quot;, &quot;ALL-DAY event&quot; );
+$vevent->setProperty( &quot;description&quot;, &quot;This is a description for an all-day event&quot; );
+$vevent->setProperty( &quot;resources&quot;, &quot;COMPUTER PROJECTOR&quot; );
+$vevent->setProperty( &quot;rrule&quot;, array( &quot;FREQ&quot; =&gt; &quot;WEEKLY&quot;, &quot;count&quot; =&gt; 4));// <span class="comment">weekly, four occasions</span>
+$vevent->parse( &quot;LOCATION:1CP Conference Room 4350&quot; );     // <span class="comment">supporting parse of</span>
+                                                           // <span class="comment"> strict rfc5545 formatted text</span>
+.. .
+.. .// <span class="comment">all calendar components are described in <a href="http://kigkonsult.se/downloads/dl.php?f=rfc5545" title="RFC5545" target="_blank">rfc5545</a></span>
+.. .// <span class="comment">a complete iCalcreator function list (ex. setProperty) in <a href="http://kigkonsult.se/downloads/index.php#iCalcreator" title="iCalcreator complete manual" target="_blank">iCalcreator manual</a></span>
+.. .
+iCalUtilityFunctions::createTimezone( $v, $tz, $xprops);   // <span class="comment">create timezone component(-s) <b>opt. 2</b></span>
+                                                           // <span class="comment">based on all start dates in events</span>
+                                                           // <span class="comment">(i.e. dtstart)</span>
+.. .
+?&gt;
+</pre>
+
+<h2>PARSE</h2>
+<h4>iCal, rfc5545 / rfc2445 </h4>
+<h5>create iCalcreator object instance</h5>
+<pre>&lt;?php
+.. .
+require_once( &quot;iCalcreator.class.php&quot; );
+$config = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot; );         // <span class="comment">set Your unique id, </span>
+.. .                                                       // <span class="comment">required if any component UID is missing</span>
+$v = new vcalendar( $config );                             // <span class="comment">create a new <strong>calendar</strong> object instance</span>
+.. .
+</pre>
+<h5>when parse a local iCal file</h5>
+<pre>.. .
+$config = array( &quot;directory&quot; =&gt; &quot;calendar&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot; );
+$v->setConfig( $config );                                  // <span class="comment">set directory and file name</span>
+$v->parse();
+.. .                                                       // <span class="comment">continue process (edit, parse,select)</span>
+.. .                                                       // <span class="comment"> the iCalcreator object instance</span>
+.. .
+?&gt;
+</pre>
+<h5>or parse a remote iCal file (resource)</h5>
+<pre>.. .
+$v->setConfig( &quot;url&quot;, &quot;http://www.aDomain.net/file.ics&quot; ); // <span class="comment">supporting parse of remote files</span>
+$v->parse();
+.. .
+$v->sort();                                                // <span class="comment">ensure start date order</span>
+.. .                                                       // <span class="comment">(opt., <b>NOT</b> required after parse)</span>
+.. .
+.. .                                                       // <span class="comment">continue process (edit, parse,select)</span>
+.. .                                                       // <span class="comment"> the iCalcreator object instance</span>
+.. .
+?&gt;
+</pre>
+<p>
+On error, the parse method returns FALSE.
+</p>
+<h4>xCal, rfc6321 (XML)</h4>
+<pre>&lt;?php
+.. .
+require_once( &quot;iCalcreator.class.php&quot; );
+$config = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot; );         // <span class="comment">set Your unique id, </span>
+.. .                                                       // <span class="comment">required if any component UID is missing</span>
+.. .
+$filename = 'xmlfile.xml';                                 // <span class="comment">use a local xCal file</span>
+// $filename = 'http://kigkonsult.se/xcal.php?a=1&amp;b=2&amp;c=3';// <span class="comment"> or a remote xCal resource</span>
+if( FALSE === ( $v = XMLfile2iCal(  $filename, $config ))) // <span class="comment">convert the XML resource</span>
+  exit( &quot;Error when parsing $filename&quot; );                  // <span class="comment"> to an iCalcreator object instance</span>
+.. .                                                       // <span class="comment">continue process (edit, parse,select)</span>
+.. .                                                       // <span class="comment"> the iCalcreator object instance</span>
+.. .
+?&gt;
+</pre>
+
+
+<h2>EDIT</h2>
+<pre>&lt;?php
+.. .
+require_once( &quot;iCalcreator.class.php&quot; );
+$config = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;            // <span class="comment">set Your unique id,</span>
+               , &quot;directory&quot; =&gt; &quot;calendar&quot;                 // <span class="comment">import directory</span>
+               , &quot;filename&quot; =&gt; &quot;file.ics&quot; );               // <span class="comment"> and file name</span>
+
+$v = new vcalendar( $config );                             // <span class="comment">create a new calendar object instance</span>
+
+$v->parse();
+
+$v->setProperty( &quot;method&quot;, &quot;PUBLISH&quot; );                    // <span class="comment">required of some <strong>calendar</strong> software</span>
+$v->setProperty( &quot;x-wr-calname&quot;, &quot;Calendar Sample&quot; );      // <span class="comment">required of some <strong>calendar</strong> software</span>
+$v->setProperty( &quot;X-WR-CALDESC&quot;, &quot;Calendar Description&quot; ); // <span class="comment">required of some <strong>calendar</strong> software</span>
+$v->setProperty( &quot;X-WR-TIMEZONE&quot;, &quot;Europe/Stockholm&quot; );    // <span class="comment">required of some <strong>calendar</strong> software</span>
+
+while( $vevent = $v->getComponent( &quot;vevent&quot; )) {           // <span class="comment">read events, one by one</span>
+  $uid = $vevent->getProperty( &quot;uid&quot; );                    // <span class="comment">uid required, one occurrence</span>
+  .. .                                                     // <span class="comment">  (unique id/key for component)</span>
+  $dtstart = $vevent->getProperty( &quot;dtstart&quot; );            // <span class="comment">dtstart required, one occurrence</span>
+  .. .
+  if( $description = $vevent->getProperty( &quot;description&quot;, 1 )) { // <span class="comment">opt. description, 1st occurrence</span>
+    .. .                                                   // <span class="comment">edit the description</span>
+    $vevent->setProperty( &quot;description&quot;, $description, FALSE, 1 ); // <span class="comment">update/replace the description</span>
+  }
+  while( $comment = $vevent->getProperty( &quot;comment&quot; )) {   // <span class="comment">optional comments</span>
+    .. .                                                   // <span class="comment">manage comments</span>
+  }
+  .. .
+  while( $vevent->deleteProperty( &quot;attendee&quot; ))
+    continue;                                              // <span class="comment">remove all ATTENDEE properties .. .</span>
+  .. .
+  $v->setComponent ( $vevent, $uid );                      // <span class="comment">update/replace event in calendar</span>
+                                                           // <span class="comment"> with <b>UID</b> as key</span>
+}
+.. .
+.. .// <span class="comment">a complete iCalcreator function list (ex. getProperty, deleteProperty) in <a href="http://kigkonsult.se/downloads/index.php#iCalcreator" title="iCalcreator complete manual" target="_blank">iCalcreator manual</a></span>
+.. .
+?&gt;
+</pre>
+<br>
+<br>
+
+<h2>SELECT</h2>
+<pre>&lt;?php
+.. .
+require_once( &quot;iCalcreator.class.php&quot; );
+$config = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot; );         // <span class="comment">set Your unique id</span>
+$v = new vcalendar( $config );                             // <span class="comment">create a new <strong>calendar</strong> object instance</span>
+
+$v->setConfig( &quot;url&quot;, &quot;http://www.aDomain.net/file.ics&quot; ); // <span class="comment">iCalcreator also support remote files</span>
+$v->parse();
+
+$v->setProperty( &quot;method&quot;, &quot;PUBLISH&quot; );                    // <span class="comment">required of some <strong>calendar</strong> software</span>
+$v->setProperty( &quot;x-wr-calname&quot;, &quot;Calendar Sample&quot; );      // <span class="comment">required of some <strong>calendar</strong> software</span>
+$v->setProperty( &quot;X-WR-CALDESC&quot;, &quot;Calendar Description&quot; ); // <span class="comment">required of some <strong>calendar</strong> software</span>
+$v->setProperty( &quot;X-WR-TIMEZONE&quot;, &quot;Europe/Stockholm&quot; );    // <span class="comment">required of some <strong>calendar</strong> software</span>
+.. .
+?&gt;
+</pre>
+<h4>Date based select</h4>
+<pre>&lt;?php
+.. .
+$eventArray = $v->selectComponents();                      // <span class="comment">select components occurring <b>today</b></span>
+                                                           // <span class="comment">(including components</span>
+                                                           // <span class="comment">with recurrence pattern)</span>
+foreach( $eventArray as $year =&gt; $yearArray) {
+ foreach( $yearArray as $month =&gt; $monthArray ) {
+  foreach( $monthArray as $day =&gt; $dailyEventsArray ) {
+   foreach( $dailyEventsArray as $vevent ) {
+    $currddate = $event->getProperty( &quot;x-current-dtstart&quot; );
+                                                           // <span class="comment">if member of a recurrence set</span>
+                                                           // <span class="comment">(2nd occurrence etc)</span>
+                                                           // <span class="comment">returns array( </span>
+                                                           // <span class="comment">    &quot;x-current-dtstart&quot;</span>
+                                                           // <span class="comment">  , (string) date(</span>
+                                                           // <span class="comment">    &quot;Y-m-d [H:i:s][timezone/UTC offset]&quot;))</span>
+    $dtstart = $vevent->getProperty( &quot;dtstart&quot; );          // <span class="comment">dtstart required, one occurrence,</span>
+                                                           // <span class="comment"> (orig. start date)</span>
+    $summary = $vevent->getProperty( &quot;summary&quot; );
+    $description = $vevent->getProperty( &quot;description&quot; );
+    .. .
+    .. .
+   }
+  }
+ }
+}
+.. .
+?&gt;
+</pre>
+<h4>Select specific property values</h4>
+<pre>&lt;?php
+.. .
+$valueOccur = $v->getProperty( &quot;RESOURCES&quot; );              // <span class="comment">fetch specific property</span>
+                                                           // <span class="comment">(unique) values and occurrences</span>
+                                                           // <span class="comment">ATTENDEE, CATEGORIES, CONTACT,</span>
+                                                           // <span class="comment">DTSTART, LOCATION, ORGANIZER,</span>
+                                                           // <span class="comment">PRIORITY, RESOURCES, STATUS,</span>
+                                                           // <span class="comment">SUMMARY, UID, URL,</span>
+                                                           // <span class="comment">GEOLOCATION<sup>*</sup></span>
+foreach( $valueOccur as $uniqueValue =&gt; $occurCnt ) {
+  echo &quot;The RESOURCES value &lt;b&gt;$uniqueValue&lt;/b&gt; occurs &lt;b&gt;$occurCnt&lt;/b&gt; times&lt;br /&gt;&quot;;
+  .. .
+}
+.. .
+?&gt;
+</pre>
+<p>
+<sup>*</sup>) Using the non-standard directive "GEOLOCATION", iCalcreator returns output supporting
+ISO6709 "Standard representation of geographic point location by coordinates",
+by combining the "LOCATION" and "GEO" property values (only if "GEO" is set).
+</p>
+<h4>Select components based on specific property value</h4>
+<pre>&lt;?php
+.. .
+$selectSpec = array( &quot;CATEGORIES&quot; =&gt; &quot;course1&quot; );
+$specComps = $v->selectComponents( $selectSpec );          // <span class="comment">selects components</span>
+                                                           // <span class="comment">based on specific property value(-s)</span>
+                                                           // <span class="comment">ATTENDEE, CATEGORIES, CONTACT,</span>
+                                                           // <span class="comment">LOCATION, ORGANIZER,</span>
+                                                           // <span class="comment">PRIORITY, RESOURCES, STATUS,</span>
+                                                           // <span class="comment">SUMMARY, URL, UID</span>
+foreach( $specComps as $comp ) {
+ .. .
+}
+.. .
+?&gt;
+</pre>
+<br>
+<br>
+
+<h2>OUTPUT</h2>
+<h5>create iCalcreator object instance</h5>
+<pre>&lt;?php
+.. .
+require_once( &quot;iCalcreator.class.php&quot; );
+$config = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot; );         // <span class="comment">set Your unique id</span>
+$v = new vcalendar( $config );                             // <span class="comment">create a new calendar object instance</span>
+
+$v->setProperty( &quot;method&quot;, &quot;PUBLISH&quot; );                    // <span class="comment">required of some <strong>calendar</strong> software</span>
+$v->setProperty( &quot;x-wr-calname&quot;, &quot;Calendar Sample&quot; );      // <span class="comment">required of some <strong>calendar</strong> software</span>
+$v->setProperty( &quot;X-WR-CALDESC&quot;, &quot;Calendar Description&quot; ); // <span class="comment">required of some <strong>calendar</strong> software</span>
+$v->setProperty( &quot;X-WR-TIMEZONE&quot;, &quot;Europe/Stockholm&quot; );    // <span class="comment">required of some <strong>calendar</strong> software</span>
+.. .
+.. .                                                       // <span class="comment">continue process (edit, parse,select)</span>
+.. .                                                       // <span class="comment"> the iCalcreator object instance</span>
+.. .
+?&gt;
+</pre>
+<h5>opt 1</h5>
+<pre>&lt;?php
+.. .
+$v->returnCalendar();                                      // <span class="comment">redirect calendar file to browser</span>
+?&gt;
+</pre>
+
+<h5>opt 2</h5>
+<pre>&lt;?php
+.. .
+$config = array( &quot;directory&quot; =&gt; &quot;depot&quot;, &quot;filename&quot; =&gt; &quot;calendar.ics&quot; );
+$v->setConfig( $config );                                  // <span class="comment">set output directory and file name</span>
+$v->saveCalendar();                                        // <span class="comment">save calendar to (local) file</span>
+.. .
+?&gt;
+</pre>
+
+<h5>opt 3, xCal</h5>
+<pre>&lt;?php
+.. .
+$mlstr = iCal2XML( $v );                                   // <span class="comment">create well-formed XML, rfc6321</span>
+.. .
+?&gt;
+</pre>
+<br>
+<br>
+
+
+<h2>COPYRIGHT AND LICENSE</h2>
+
+<h4>Copyright</h4>
+<p>
+iCalcreator v2.18<br>
+Copyright (c) 2007-2013 Kjell-Inge Gustafsson, kigkonsult, All rights reserved.<br>
+<a href="http://kigkonsult.se/iCalcreator/index.php" title="kigkonsult.se/iCalcreator" target="_blank">kigkonsult.se iCalcreator</a><br>
+<a href="http://kigkonsult.se/contact/index.php" title="kigkonsult.se contact" target="_blank">kigkonsult.se contact</a>
+</p>
+
+<h4>License</h4>
+
+<p>
+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.
+</p>
+<p>
+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.
+</p>
+<p>
+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., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+or download it <a href="http://kigkonsult.se/downloads/dl.php?f=LGPL" target="_blank">here</a>.
+</p>
+<br>
+<br>
+</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/iCalcreator-version/using.html b/htmltest/sites/all/libraries/iCalcreator-version/using.html
new file mode 100644
index 00000000..8e02c67d
--- /dev/null
+++ b/htmltest/sites/all/libraries/iCalcreator-version/using.html
@@ -0,0 +1,7850 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
+<html>
+<head>
+<title>iCalcreator 2.18 manual</title>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+<meta name="author"      content="Kjell-Inge Gustafsson, kigkonsult, All rights reserved">
+<meta name="copyright"   content="2007-2013 Kjell-Inge Gustafsson, kigkonsult">
+<meta name="keywords"    content="ical, calendar, calender, xcal, xml, icalender, rfc2445, rfc5545, vcalender, php, create">
+<meta name="description" content="using iCalcreator v2.18">
+<style type="text/css">
+* {
+  FONT-FAMILY     : "Bitstream Vera Sans", Helvetica, "Lucida Grande","Lucida Sans Unicode", Lucida, Arial, Geneva, sans-serif;
+  BACKGROUND-COLOR: white;
+  COLOR           : black;
+  FONT-SIZE       : small;
+}
+body {
+  MARGIN-LEFT     : 10px;
+  WIDTH           : 750px;
+}
+a.ref {
+  BACKGROUND-COLOR: inherit;
+  FONT-SIZE       : 8pt;
+  LETTER-SPACING  : 0.1em;
+}
+h1 {
+  BACKGROUND-COLOR: silver;
+  BORDER          : thin solid black;
+  FONT-SIZE       : x-large;
+  FONT-WEIGHT     : bold;
+  DISPLAY         : block;
+}
+h2 {
+  FONT-SIZE       : large;
+}
+h3 {
+  FONT-SIZE       : medium;
+}
+h4 {
+  FONT-SIZE       : small;
+  FONT-WEIGHT     : bold;
+}
+h5 {
+  FONT-SIZE       : small;
+  FONT-WEIGHT     : normal;
+  TEXT-DECORATION : underline;
+}
+table {
+  border-collapse : collapse;
+  width           : 100%;
+}
+.bb {
+  BORDER-BOTTOM   : gray dotted thin;
+}
+.blb {
+  BORDER-LEFT     : gray dotted thin;
+  BORDER-BOTTOM   : gray dotted thin;
+  TEXT-ALIGN      : center;
+}
+.bl {
+  BORDER-LEFT     : gray dotted thin;
+}
+.center {
+  TEXT-ALIGN      : center;
+}
+p.comment {
+  FONT-FAMILY     : monospace;
+  FONT-SIZE       : 9pt;
+  FONT-WEIGHT     : 500;
+  WHITE-SPACE     : pre-wrap;      /* css-3 */
+  WHITE-SPACE     : -moz-pre-wrap; /* Mozilla, since 1999 */
+  WHITE-SPACE     : -pre-wrap;     /* Opera 4-6 */
+  WHITE-SPACE     : -o-pre-wrap;   /* Opera 7 */
+  WORD-WRAP       : break-word;    /* Internet Explorer 5.5+ */
+}
+span.comment {
+  BACKGROUND-COLOR: transparent;
+  FONT-FAMILY     : Areal;
+  FONT-SIZE       : 8pt;
+  LETTER-SPACING  : 0.2em;
+}
+p.example {
+  BACKGROUND-COLOR: #DCDCDC;
+  font-family     : monospace;
+  FONT-SIZE       : 9pt;
+  LETTER-SPACING  : 0.1em;
+  LINE-HEIGHT     : 1.5em;
+  WHITE-SPACE     : pre-wrap;      /* css-3 */
+  WHITE-SPACE     : -moz-pre-wrap; /* Mozilla, since 1999 */
+  WHITE-SPACE     : -pre-wrap;     /* Opera 4-6 */
+  WHITE-SPACE     : -o-pre-wrap;   /* Opera 7 */
+  WORD-WRAP       : break-word;    /* Internet Explorer 5.5+ */
+}
+p.format {
+  BORDER          : gray dotted thin;
+  FONT-FAMILY     : Helvetica;
+  FONT-SIZE       : 9pt;
+  LETTER-SPACING  : 0.2em;
+  LINE-HEIGHT     : 2em;
+  WHITE-SPACE     : pre-wrap;      /* css-3 */
+  WHITE-SPACE     : -moz-pre-wrap; /* Mozilla, since 1999 */
+  WHITE-SPACE     : -pre-wrap;     /* Opera 4-6 */
+  WHITE-SPACE     : -o-pre-wrap;   /* Opera 7 */
+  WORD-WRAP       : break-word;    /* Internet Explorer 5.5+ */
+}
+.header {
+  BACKGROUND-COLOR: silver;
+  BORDER          : thin solid black;
+  FONT-SIZE       : xx-large;
+}
+p.label {
+  FONT-FAMILY     : Arial;
+  FONT-WEIGHT     : bold;
+  LETTER-SPACING  : 0.1em;
+}
+p.quotes {
+  BACKGROUND-COLOR: #F5F5F5;
+  FONT-FAMILY     : Arial;
+  FONT-STYLE      : italic;
+  LETTER-SPACING  : 0.1em;
+}
+sup {
+  BACKGROUND-COLOR: transparent;
+  FONT-SIZE       : x-small;
+  FONT-WEIGHT     : bold;
+  VERTICAL-ALIGN  : super;
+}
+.ref {
+  BACKGROUND-COLOR: transparent;
+  FONT-SIZE       : 8pt;
+  LETTER-SPACING  : 0.1em;
+}
+.top {
+  VERTICAL-ALIGN  : top;
+}
+</style>
+</head>
+<body>
+<a name="top"></a>
+<p class="header">iCalcreator v2.18</p>
+<p>
+iCalcreator v2.18<br>
+Copyright (c) 2007-2013 Kjell-Inge Gustafsson, kigkonsult, All rights reserved.<br>
+<a href="http://kigkonsult.se/iCalcreator/index.php" title="kigkonsult.se/iCalcreator" target="_blank">kigkonsult.se iCalcreator</a><br>
+<a href="http://kigkonsult.se/contact/index.php" title="kigkonsult.se contact" target="_blank">kigkonsult.se contact</a>
+</p>
+
+<h2>Preface</h2>
+<p>
+This document describes usage of iCalcreator, a <em>PHP</em> software implementation of standards <a href="#Standards">rfc5545/rfc5546 (rfc2445/rfc2446)</a> to manage iCal formatted files.
+</p>
+<p>
+This document is provided by kigkonsult for informational purposes
+and is provided on an &quot;as is&quot; basis without any warranties expressed or implied.
+</p>
+<p>
+Information in this document is subject to change without notice and does
+not represent a commitment on the part of kigkonsult.
+The software described in this document is provided under a <a href="#Copyright_and_Licence">license agreement</a>.
+The software may be used only in accordance with the terms of that <a href="#Copyright_and_Licence">license agreement</a>.
+It is against the law to copy or use the software except as specifically allowed in the <a href="#Copyright_and_Licence">license agreement</a>.
+</p>
+<p>
+It is the users responsibility to ensure the suitability of the software before using it.
+In no circumstances will kigkonsult be responsible for
+the use of the software's outcomes or results or any loss
+or damage of data or programs as a result of using the software.
+The use of the software implies acceptance of these terms.
+</p>
+<p>
+This document makes previous versions obsolete.
+</p>
+<a href="#INDEX">[index]</a></a>
+
+<a name="INTRO"></a><h1>1 INTRO</h1>
+<p>
+iCalcreator is a <em>PHP</em> class package managing iCal files, supporting (non-)<strong>calendar</strong>
+systems and applications to process and communicate <strong>calendar</strong> information like
+events, agendas, tasks, reports, totos and journaling information.
+</p>
+<p>
+The iCal standards are <a href="#Standards">rfc5545/rfc5546 (rfc2445/rfc2446)</a>.</p>
+<p>
+iCalcreator features create, parse, edit and select <strong>calendar</strong> and <strong>calendar</strong> components.
+</p>
+<p>
+The iCalcreator package, built of a <strong>calendar</strong> class with support of a function class and helper functions,
+are <strong>calendar</strong> component property oriented. For iCalcreator 2.18 version (and later),
+<em>PHP</em> version &gt;= 5.2.0 is required, due to the use of <em>PHP</em> DateTime class (and related functions) .
+</p>
+<p>
+The iCalcreator main class, utility class and helper functions are all included in the &quot;iCalcreator.class.php&quot; file.
+</p>
+<p>
+More iCalcreator supplementary, &quot;howto&quot; and coding support information will be found at
+kigkonsult.se iCalcreator implement examples and test <a href="http://kigkonsult.se/test/index.php" title="kigkonsult.se iCalcreator implement howto" target="_blank">pages</a>.
+A strong recommendation is to have this document open in parallell when exploiting the link.
+</p>
+<p>
+iCalcreator will support hiphop if the HDF AllDynamic option is enabled (the helper <a href="#iCal2XML">iCal2XML</a> function is excluded).
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
+
+<a name="Standards"></a><h2>1.1 Standards</h2>
+
+<h4>iCal</h4>
+The <strong>iCalendar</strong> format, <strong>iCal</strong>, as described in
+<dl>
+<dt><a href="http://kigkonsult.se/downloads/dl.php?f=rfc5545" title="Download RFC5545 in text format" target="_blank">rfc5545</a>
+<dd>&quot;Internet Calendaring and Scheduling Core Object Specification (<strong>iCalendar</strong>)&quot;
+<dt><a href="http://kigkonsult.se/downloads/dl.php?f=rfc5546" title="Download RFC5546 in text format" target="_blank">rfc5546</a>
+<dd>&quot;iCalendar Transport-Independent Interoperability Protocol (iTIP)&quot;<br>Scheduling Events, BusyTime, To-dos and Journal Entries
+</dl>
+<p class="quotes">. ..allows for the capture and exchange of information normally stored
+within a calendaring and scheduling application.</p>
+and
+<p class="quotes">. ..is an exchange format between applications or systems.</p>
+<p><a href="http://kigkonsult.se/downloads/dl.php?f=rfc5545" title="Download RFC5545 in text format" target="_blank">rfc5545</a> and
+<a href="http://kigkonsult.se/downloads/dl.php?f=rfc5546" title="Download RFC5546 in text format" target="_blank">rfc5546</a>
+obsoletes, respectively,
+<a href="http://kigkonsult.se/downloads/dl.php?f=rfc2445" title="Download RFC2445 in text format" target="_blank">rfc2445</a> and
+<a href="http://kigkonsult.se/downloads/dl.php?f=rfc2446" title="Download RFC2446 in text format" target="_blank">rfc2446</a>.
+</p>
+<p>
+A short iCal description is found at <a href="http://en.wikipedia.org/wiki/ICalendar#Core_object" title="iCalendar From Wikipedia, the free encyclopedia" target="_blank">Wikipedia</a>. If You are not familiar with iCal, read this first!
+Knowledge of <strong>calendar</strong> protocol rfc5545/rfc5546 is to recommend.
+</p>
+<p>
+Any references to rfc2445, below, corresponds to rfc5545.
+</p>
+
+<h4>xCal</h4>
+<p>iCalcreator also supports xCal (iCal xml) rfc6321, &quot;xCal: The XML Format for <strong>iCalendar</strong>&quot;, to be downloaded from</p>
+<dl>
+<dt><a href="http://kigkonsult.se/downloads/dl.php?f=rfc6321" title="Download RFC6321 in text format" target="_blank">rfc6321</a>
+<dd>&quot;xCal: The XML Format for <strong>iCalendar</strong>&quot;
+</dl>
+<p>
+A short xCal description is found at <a href="http://en.wikipedia.org/wiki/XCal" title="xCal on Wikipedia, the free encyclopedia" target="_blank">Wikipedia</a>.
+</p>
+
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
+
+
+<a name="This_manual"></a><h2>1.2 This manual</h2>
+<p>This style is used for text.</p>
+<p class="format">This style is used for formats.</p>
+<p class="example">&lt;?php
+.. .
+This style is used for <em>PHP</em> coding examples.
+<span class="comment"> // this style is used for coding comments.</span>
+.. .
+</p>
+<p class="comment">This style is used for content details.</p>
+<p class="quotes">This style is used for RFC2445/5545 quotes.</p>
+
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
+
+
+<a name="Versioning"></a><h2>1.3 Versioning</h2>
+
+<p>The release numbering convention used is major.minor(.micro&nbsp;/&nbsp;suffix).</p>
+<dl>
+<dt>Major
+<dd>Indicates a very large change in the core package. Rewrites or major milestones.
+<dt>Minor
+<dd>Significant amount of feature addition/modification.<br>odd number - development/experimental release<br> even number - production release
+<dt>Micro
+<dd>Primarily bug fix and maintenance number.
+<dt>Suffix
+<dd>rc1 for first release candidate etc.
+</dl>
+
+<p>The release plan is based on yearly releases with exception of emergency releases.</p>
+
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
+
+<a name="Support"></a><h2>1.4 Support</h2>
+<p>
+The main support channel is using iCalcreator
+<a title="Sourceforge" href="http://sourceforge.net/projects/icalcreator/forums/" target="_blank">Sourceforge</a> forum.
+</p>
+<p>
+Support and development is now focused on iCalcreator (Pro) 3.x versions, which, in turn, will affect future releases
+of iCalcreator 2.x.
+</p>
+<p>
+Use the contact <a href="http://kigkonsult.se/contact/index.php" title="kigkonsult.se/contact" target="_blank">page</a>
+for queries, improvement/development issues or professional support and development.
+Please note that paid support or consulting service has the highest priority.
+</p>
+<p>
+kigkonsult offer services for software support, design and development of customizations and adaptations
+of <em>PHP</em>/<em>MySQL</em> solutions
+with a special focus on software long term utility and reliability,
+supported through our agile acquire/design/transition process model.
+</p>
+
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
+
+
+<a name="Donate"></a><h2>1.5 Donate</h2>
+<p>
+You can show your appreciation for our free software,
+and can support future development by making a donation to the kigkonsult project iCalcreator.
+</p>
+<p>
+Make a donation of any size by clicking <a href="http://kigkonsult.se/contact/index.php#Donate" title="Donate" target="_blank">here</a>.
+Thanks in advance!
+</p>
+
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
+
+<a name="INSTALL"></a><h2>1.6 Install</h2>
+
+<a name="Basic"></a><h3>1.6.1 Basic</h3>
+<p>
+Unpack to any folder<br>
+- add this folder to your include-path<br>
+- or unpack to your application-(include)-folder
+</p>
+<p>Add</p>
+<p class="format">require_once &quot;[folder/]iCalcreator.class.php&quot;;</p>
+<p>to your <em>PHP</em>-script.</p>
+<p>
+If using <em>PHP</em> version 5.1 or higher, the default timezone may need to be set.
+</p>
+<p>
+Creating a new iCalcreator object instance/component instance, review <a href="#iCalcreator_configuration_methods">config</a> settings.
+</p>
+
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
+
+
+<a name="Boost"></a><h3>1.6.2 Boost performance</h3>
+<p>
+To really boost performance, kigkonsult can now offer <em>PHP</em> (4 and 5) packages (iCalcreator etc) in byte coded files,
+using <a href="http://www.ioncube.com" target="_blank"><u>ionCube</u></a> encoder.
+</p>
+<p>
+Encoded files use a platform independent file format, and can be run on any platform for which ionCube supply a (free) Loader.
+Currently supported platforms are Windows (e.g. NT, XP, W2K), Intel Linux, FreeBSD, NetBSD, OpenBSD, OS X, and Sparc Solaris.
+</p>
+<p>
+Visit kigkonsult.se contact <a href="http://kigkonsult.se/contact/index.php" target="_blank"><u>page</u></a> for information and purchase.
+</p>
+<p>
+Use basic install (above), install ionCube Loader (requires an update of &quot;php.ini&quot;
+or additional file in &quot;/etc/php.d&quot; folder AND the execute rights to use the <em>PHP</em> &quot;dl&quot; function)
+and simply replace the <em>PHP</em> class files with the encoded files.
+</p>
+
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
+
+
+<a name="Additional_Descriptors"></a><h2>1.7 Additional Descriptors</h2>
+<p>The following properties (as described in <a href="http://en.wikipedia.org/wiki/ICalendar#Calendar_extensions" title="http://en.wikipedia.org/wiki/ICalendar#Calendar_extensions" target="_blank">wikipedia:iCal</a>)
+may be required when importing iCal files into some calendaring software (MS etc.):</p>
+<dl>
+<dt>on <strong>calendar</strong> level
+<dd><a href="#METHOD">METHOD</a> property (value PUBLISH etc.)
+<dd><a href="#X-PROPERTY">X-WR-CALNAME</a> x-property
+<dd><a href="#X-PROPERTY">X-WR-CALDESC</a> x-property
+<dd><a href="#X-PROPERTY">X-WR-RELCALID</a> x-property <span class="comment">(a <a href="/wiki/Universally_Unique_Identifier" title="Universally Unique Identifier" class="mw-redirect">UUID</a>.)</span>
+<dd><a href="#X-PROPERTY">X-WR-TIMEZONE</a> x-property
+<dt>on component level
+<dd><a href="#DTSTAMP">DTSTAMP</a> property (in iCalcreator created automatically, if not set)
+<dd><a href="#UID">UID</a> property (in iCalcreator created automatically, if not set)
+<dt>on component level in a <a href="#VTIMEZONE">vtimezone</a> component
+<dd><a href="#X-PROPERTY">X-LIC-LOCATION</a> x-property
+</dl>
+<p class="label">Example</p>
+<p>
+A strong recommendation is also to set config <a href="#Unique_id">unique_id</a>, creating a new vcalendar/component instance,
+to ensure accurate setting of all components <a href="#UID">UID</a> property, especially before <a href="#parse_merge">parse</a>.
+Also setting of config timezone (&quot;TZID&quot; and &quot;X-WR-TIMEZONE&quot; below) is to recommend.
+</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;setProperty( &quot;method&quot;,        &quot;PUBLISH&quot; )
+$vcalendar-&gt;setProperty( &quot;x-wr-calname&quot;,  &quot;Calendar Sample&quot; );
+$vcalendar-&gt;setProperty( &quot;X-WR-CALDESC&quot;,  &quot;Calendar Description&quot; );
+$uuid      = &quot;3E26604A-50F4-4449-8B3E-E4F4932D05B5&quot;;
+$vcalendar-&gt;setProperty( &quot;X-WR-RELCALID&quot;, $uuid );
+$vcalendar-&gt;setProperty( &quot;X-WR-TIMEZONE&quot;, &quot;Europe/Stockholm&quot; );
+.. .
+</p>
+
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
+
+
+<a name="Addendum"></a><h2>1.8 Addendum</h2>
+<p>
+For iCalcreator usage, coding samples and tests, visit the public kigkonsult.se
+<a title="iCalcreator coding and test pages" href="http://kigkonsult.se/test/index.php" target="_blank">test</a> resource.
+</p>
+<dl>
+<dt>Examples how to employ iCalcreator in software development
+<dd><a title="dbiCal" href="http://kigkonsult.se/dbiCal/index.php" target="_blank">dbiCal</a>, an iCal file <i>PHP</i> database backend solution.
+<dd><a title="Create iCal event file on-demand from form" href="http://kigkonsult.se/eventCreator/index.php" target="_blank">The iCal file event editor</a>
+<dd><a title="tinycal" href="http://kigkonsult.se/tinycal/index.php" target="_blank">tinycal</a>, <strong>calendar</strong>-in-a-box.
+</dl>
+<p>
+There are free iCal/xCal icons (use as buttons on a web page?) to download
+<a href="http://kigkonsult.se/downloads/i.php?i=all" title="iCal images" target="_blank">here</a>.
+</p>
+<p>
+The <em>PHP</em> coding in this document or &quot;coding samples&quot; (above) are only for display of usage, recommendation is to use a
+coding standard, the following, incomplete, list is a good start;
+</p>
+<dl>
+<dd><a href="http://www.dagbladet.no/development/phpcodingstandard/" target="_blank">http://www.dagbladet.no/development/phpcodingstandard/</a>
+<!-- <a href="http://ez.no/ezpublish/documentation/development/standards/php" target="_blank">http://ez.no/ezpublish/documentation/development/standards/php</a> -->
+<dd><a href="http://framework.zend.com/manual/en/coding-standard.overview.html" target="_blank">http://framework.zend.com/manual/en/coding-standard.overview.html</a>
+<!-- <a href="http://gforge.org/docman/view.php/1/2/coding-standards.html" target="_blank">http://gforge.org/docman/view.php/1/2/coding-standards.html</a> -->
+<dd><a href="http://pear.php.net/manual/en/standards.php" target="_blank">http://pear.php.net/manual/en/standards.php</a>
+</dl>
+
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
+
+
+<a name="INDEX"></a><h2>1.9 INDEX</h2>
+
+<a href="#INTRO">1 INTRO</a><br>
+<br>
+<a href="#Standards">1.1 Standards</a><br>
+<a href="#This_manual">1.2 This manual</a><br>
+<a href="#Versioning">1.3 Versioning</a><br>
+<a href="#Support">1.4 Support</a><br>
+<a href="#Donate">1.5 Donate</a><br>
+<a href="#INSTALL">1.6 Install</a><br>
+<a href="#Basic">1.6.1 Basic</a><br>
+<a href="#Boost">1.6.2 Boost performance</a><br>
+<a href="#Additional_Descriptors">1.7 Additional_Descriptors</a><br>
+<a href="#Addendum">1.8 Addendum</a><br>
+<a href="#INDEX">1.9 INDEX</a><br>
+<br>
+<a href="#Calendar_Component_list">2 Calendar Component list</a><br>
+<br>
+<a href="#VCALENDAR">2.1  VCALENDAR</a><br>
+<a href="#VEVENT">2.2  VEVENT</a><br>
+<a href="#VTODO">2.3  VTODO</a><br>
+<a href="#VJOURNAL">2.4  VJOURNAL</a><br>
+<a href="#VFREEBUSY">2.5  VFREEBUSY</a><br>
+<a href="#VALARM">2.6  VALARM</a><br>
+<a href="#VTIMEZONE">2.7  VTIMEZONE</a><br>
+<a href="#CalProps">2.8  Component Properties</a><br>
+<br>
+<a href="#Function_list">3 Function list</a><br>
+<br>
+<a href="#iCalcreator_object_methods">3.1 iCalcreator object methods</a><br>
+<br>
+<a href="#Calendar_object_constructors">3.1.1 Constructors</a><br>
+<a href="#vcalendar_constr">3.1.1.1 vcalendar</a><br>
+<a href="#vevent_constr">3.1.1.2 vevent</a><br>
+<a href="#vtodo_constr">3.1.1.3 vtodo</a><br>
+<a href="#vjournal_constr">3.1.1.4 vjournal</a><br>
+<a href="#vfreebusy_constr">3.1.1.5 vfreebusy</a><br>
+<a href="#valarm_constr">3.1.1.6 valarm</a><br>
+<a href="#vtimezone_constr">3.1.1.7 vtimezone</a><br>
+<a href="#standard_constr">3.1.1.8 standard</a><br>
+<a href="#daylight_constr">3.1.1.9 daylight</a><br>
+<br>
+<a href="#iCalcreator_object_property_methods">3.1.2 iCalcreator object property methods</a><br>
+<a href="#deleteProperty">3.1.2.1 deleteProperty</a><br>
+<a href="#getProperty">3.1.2.2 getProperty</a><br>
+<a href="#setProperty">3.1.2.3 setProperty</a><br>
+<a href="#CALSCALE">3.1.2.4 CALSCALE</a><br>
+<a href="#METHOD">3.1.2.5 METHOD</a><br>
+<a href="#VERSION">3.1.2.6 VERSION</a><br>
+<a href="#X-PROPERTY">3.1.2.7 X-PROPERTY</a><br>
+<br>
+<a href="#iCalcreator_component_object_methods">3.1.3 iCalcreator component object methods</a><br>
+<a href="#deleteComponent">3.1.3.1 deleteComponent</a><br>
+<a href="#getComponent">3.1.3.2 getComponent</a><br>
+<a href="#newComponent">3.1.3.3 newComponent</a><br>
+<a href="#selectComponents">3.1.3.4 selectComponents</a><br>
+<a href="#setComponent">3.1.3.5 setComponent</a><br>
+<br>
+<a href="#iCalcreator_inputoutput_methods">3.1.4 iCalcreator input/output methods</a><br>
+<a href="#parse_merge">3.1.4.1 parse and merge</a><br>
+<a href="#createCalendar">3.1.4.2 createCalendar</a><br>
+<a href="#returnCalendar">3.1.4.3 returnCalendar</a><br>
+<a href="#saveCalendar">3.1.4.4 saveCalendar</a><br>
+<a href="#sort">3.1.4.5 sort</a><br>
+<a href="#useCachedCalendar">3.1.4.6 useCachedCalendar</a><br>
+<br>
+<a href="#iCalcreator_configuration_methods">3.1.5 iCalcreator configuration methods</a><br>
+<a href="#configKeys">3.1.5.1 configuration keys</a><br>
+<a href="#getConfig">3.1.5.2 getConfig</a><br>
+<a href="#initConfig">3.1.5.3 calendar/component initialization</a><br>
+<a href="#setConfig">3.1.5.4 setConfig</a><br>
+<a href="#allowEmpty">3.1.5.5 Allow empty components</a><br>
+<a href="#Compsinfo">3.1.5.6 Component information</a><br>
+<a href="#Delimiter">3.1.5.7 Delimiter</a><br>
+<a href="#Directory">3.1.5.8 Directory</a><br>
+<a href="#Fileinfo">3.1.5.9 Fileinfo</a><br>
+<a href="#Filename">3.1.5.10 Filename</a><br>
+<a href="#Filesize">3.1.5.11 Filesize</a><br>
+<a href="#Format">3.1.5.12 Format</a><br>
+<a href="#Language">3.1.5.13 Language</a><br>
+<a href="#NewlineChar">3.1.5.14 NewlineChar</a><br>
+<a href="#setPropertyNames">3.1.5.15 setPropertyNames</a><br>
+<a href="#dTZID">3.1.5.16 TZID</a><br>
+<a href="#Unique_id">3.1.5.17 Unique_id</a><br>
+<a href="#configURL">3.1.5.18 URL</a><br>
+<br>
+<a href="#Calendar_component_object_property_function_list">3.2 Calendar component property method list</a><br>
+<br>
+<a href="#deleteProperty_PROP">3.2.1 deleteProperty</a><br>
+<a href="#getProperty_PROP">3.2.2 getProperty</a><br>
+<a href="#parse">3.2.3 parse</a><br>
+<a href="#setProperty_PROP">3.2.4 setProperty</a><br>
+<dl>
+<dt>Ascending property order
+<dd><a href="#ACTION">3.2.5 ACTION</a>
+<dd><a href="#ATTACH">3.2.6 ATTACH</a>
+<dd><a href="#ATTENDEE">3.2.7 ATTENDEE</a>
+<dd><a href="#CATEGORIES">3.2.8 CATEGORIES</a>
+<dd><a href="#CLASS">3.2.9 CLASS</a>
+<dd><a href="#COMMENT">3.2.10 COMMENT</a>
+<dd><a href="#COMPLETED">3.2.11 COMPLETED</a>
+<dd><a href="#CONTACT">3.2.12 CONTACT</a>
+<dd><a href="#CREATED">3.2.13 CREATED</a>
+<dd><a href="#DESCRIPTION">3.2.14 DESCRIPTION</a>
+<dd><a href="#DTEND">3.2.15 DTEND</a>
+<dd><a href="#DTSTAMP">3.2.16 DTSTAMP</a>
+<dd><a href="#DTSTART">3.2.17 DTSTART</a>
+<dd><a href="#DUE">3.2.18 DUE</a>
+<dd><a href="#DURATION">3.2.19 DURATION</a>
+<dd><a href="#EXDATE">3.2.20 EXDATE</a>
+<dd><a href="#EXRULE">3.2.21 EXRULE</a>
+<dd><a href="#FREEBUSY_PROP">3.2.22 FREEBUSY</a>
+<dd><a href="#GEO">3.2.23 GEO</a>
+<dd><a href="#LAST-MODIFIED">3.2.24 LAST-MODIFIED</a>
+<dd><a href="#LOCATION">3.2.25 LOCATION</a>
+<dd><a href="#ORGANIZER">3.2.26 ORGANIZER</a>
+<dd><a href="#PERCENT-COMPLETE">3.2.27 PERCENT-COMPLETE</a>
+<dd><a href="#PRIORITY">3.2.28 PRIORITY</a>
+<dd><a href="#RDATE">3.2.29 RDATE</a>
+<dd><a href="#RECURRENCE-ID">3.2.30 RECURRENCE-ID</a>
+<dd><a href="#RELATED-TO">3.2.31 RELATED-TO</a>
+<dd><a href="#REPEAT">3.2.32 REPEAT</a>
+<dd><a href="#REQUEST-STATUS">3.2.33 REQUEST-STATUS</a>
+<dd><a href="#RESOURCES">3.2.34 RESOURCES</a>
+<dd><a href="#RRULE">3.2.35 RRULE</a>
+<dd><a href="#SEQUENCE">3.2.36 SEQUENCE</a>
+<dd><a href="#STATUS">3.2.37 STATUS</a>
+<dd><a href="#SUMMARY">3.2.38 SUMMARY</a>
+<dd><a href="#TRANSP">3.2.39 TRANSP</a>
+<dd><a href="#TRIGGER">3.2.40 TRIGGER</a>
+<dd><a href="#TZID">3.2.41 TZID</a>
+<dd><a href="#TZNAME">3.2.42 TZNAME</a>
+<dd><a href="#TZOFFSETFROM">3.2.43 TZOFFSETFROM</a>
+<dd><a href="#TZOFFSETTO">3.2.44 TZOFFSETTO</a>
+<dd><a href="#TZURL">3.2.45 TZURL</a>
+<dd><a href="#UID">3.2.46 UID</a>
+<dd><a href="#URL">3.2.47 URL</a>
+<dd><a href="#X-PROPERTY_PROP">3.2.48 X-PROPERTY</a>
+<dt>Descriptive Component Properties
+<dd><a href="#ATTACH">3.2.6 ATTACH</a>
+<dd><a href="#CATEGORIES">3.2.8 CATEGORIES</a>
+<dd><a href="#COMMENT">3.2.10 COMMENT</a>
+<dd><a href="#DESCRIPTION">3.2.14 DESCRIPTION</a>
+<dd><a href="#GEO">3.2.23 GEO</a>
+<dd><a href="#LOCATION">3.2.25 LOCATION</a>
+<dd><a href="#PERCENT-COMPLETE">3.2.27 PERCENT-COMPLETE</a>
+<dd><a href="#PRIORITY">3.2.28 PRIORITY</a>
+<dd><a href="#RESOURCES">3.2.34 RESOURCES</a>
+<dd><a href="#STATUS">3.2.37 STATUS</a>
+<dd><a href="#SUMMARY">3.2.38 SUMMARY</a>
+<dt>Date and Time Component Properties
+<dd><a href="#COMPLETED">3.2.11 COMPLETED</a>
+<dd><a href="#DTEND">3.2.15 DTEND</a>
+<dd><a href="#DUE">3.2.18 DUE</a>
+<dd><a href="#DTSTART">3.2.17 DTSTART</a>
+<dd><a href="#DURATION">3.2.19 DURATION</a>
+<dd><a href="#FREEBUSY_PROP">3.2.22 FREEBUSY</a>
+<dd><a href="#TRANSP">3.2.39 TRANSP</a>
+<dt>Time Zone Component Properties
+<dd><a href="#TZID">3.2.41 TZID</a>
+<dd><a href="#TZNAME">3.2.42 TZNAME</a>
+<dd><a href="#TZOFFSETFROM">3.2.43 TZOFFSETFROM</a>
+<dd><a href="#TZOFFSETTO">3.2.44 TZOFFSETTO</a>
+<dd><a href="#TZURL">3.2.45 TZURL</a>
+<dt>Relationship Component Properties
+<dd><a href="#ATTENDEE">3.2.7 ATTENDEE</a>
+<dd><a href="#CONTACT">3.2.12 CONTACT</a>
+<dd><a href="#ORGANIZER">3.2.26 ORGANIZER</a>
+<dd><a href="#RECURRENCE-ID">3.2.30 RECURRENCE-ID</a>
+<dd><a href="#RELATED-TO">3.2.31 RELATED-TO</a>
+<dd><a href="#URL">3.2.47 URL</a>
+<dd><a href="#UID">3.2.46 UID</a>
+<dt>Recurrence Component Properties
+<dd><a href="#EXDATE">3.2.20 EXDATE</a>
+<dd><a href="#RDATE">3.2.29 RDATE</a>
+<dd><a href="#RRULE">3.2.35 RRULE</a>
+<dt>Alarm Component Properties
+<dd><a href="#ACTION">3.2.5 ACTION</a>
+<dd><a href="#REPEAT">3.2.32 REPEAT</a>
+<dd><a href="#TRIGGER">3.2.40 TRIGGER</a>
+<dt>Change Management Component Properties
+<dd><a href="#CREATED">3.2.13 CREATED</a>
+<dd><a href="#DTSTAMP">3.2.16 DTSTAMP</a>
+<dd><a href="#LAST-MODIFIED">3.2.24 LAST-MODIFIED</a>
+<dd><a href="#SEQUENCE">3.2.36 SEQUENCE</a>
+<dt>Miscellaneous Component Properties
+<dd><a href="#X-PROPERTY_PROP">3.2.48 X-PROPERTY</a>
+<dd><a href="#REQUEST-STATUS">3.2.33 REQUEST-STATUS</a>
+</dl>
+<a href="#iCalcreator_component_configuration_methods">3.3 iCalcreator Component configuration methods</a><br>
+<br>
+<a href="#Language_PROP">3.3.1 Language</a><br>
+<br>
+<a href="#iCalcreator_component_object_misc_methods">3.4 iCalcreator component object misc. methods</a><br>
+<br>
+<a href="#deleteComponent_PROP">3.4.1 deleteComponent</a><br>
+<a href="#getComponent_PROP">3.4.2 getComponent</a><br>
+<a href="#newComponent_PROP">3.4.3 newComponent</a><br>
+<a href="#setComponent_PROP">3.4.4 setComponent</a><br>
+<br>
+<a href="#iCalUtilityFunctions">4 iCalUtilityFunctions</a><br>
+<br>
+<a href="#convEolChar">4.1 convEolChar</a><br>
+<a href="#createTimezone">4.2 createTimezone</a><br>
+<a href="#ms2phpTZ">4.3 ms2phpTZ</a><br>
+<a href="#transformDateTime">4.4 transformDateTime</a><br>
+<a href="#mddtuf">4.5 Misc. date/duration/timestamp util. functions</a><br>
+<br>
+<a href="#helperFunctions">5 Helper functions</a><br>
+<br>
+<a href="#XMLhelpers">5.1 iCal and XML helper functions</a><br>
+<br>
+<a href="#iCal2XML">5.1.1 iCal2XML</a><br>
+<a href="#XML2iCal">5.1.2 XML2iCal</a><br>
+<br>
+<a href="#vCardhelpers">5.2 iCal and vCard helper functions</a><br>
+<br>
+<a href="#iCal2vCard">5.2.1 iCal2vCard</a><br>
+<a href="#iCal2vCards">5.2.2 iCal2vCards</a><br>
+<br>
+<br>
+<a href="#TZhelpers">5.3 Time zone helper functions</a><br>
+<br>
+<a href="#getTzOffsetForDate">5.3.1 getTzOffsetForDate</a><br>
+<a href="#getTimezonesAsDateArrays">5.3.2 getTimezonesAsDateArrays</a><br>
+<br>
+<a href="#Copyright_and_Licence">6 COPYRIGHT AND LICENSE</a><br>
+<br>
+<a href="#Copyright">6.1 Copyright</a><br>
+<a href="#Licence">6.2 License</a><br>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a>
+
+<a name="Calendar_Component_list"></a><h1>2 Calendar Component list</h1>
+<p>
+Quote from <a href="http://kigkonsult.se/downloads/dl.php?f=rfc2445" title="RFC2445" target="_blank">RFC2445</a> - Internet Calendaring and Scheduling Core Object Specification (<strong>iCalendar</strong>)!
+(Described in iCal output format, content corresponds to xCal format.)
+</p>
+<a name="VCALENDAR"></a><h2>2.1  VCALENDAR</h2>
+<p class="center">icalobject = 1*(&quot;BEGIN&quot; &quot;:&quot; &quot;VCALENDAR&quot; CRLF</p>
+<p class="center">icalbody</p>
+<p class="center">&quot;END&quot; &quot;:&quot; &quot;VCALENDAR&quot; CRLF)</p>
+<p>icalbody = calprops component</p>
+<p>calprops = 2*(</p>
+<p class="center">&quot;prodid&quot; and &quot;version&quot; are both REQUIRED, but MUST NOT occur more than once
+<p class="center">prodid / <a href="#VERSION">version</a> /</p>
+<p class="center">&quot;calscale&quot;and &quot;method&quot;are optional, but MUST NOT occur more than once</p>
+<p class="center"><a href="#CALSCALE">calscale</a> / <a href="#METHOD">method</a> /</p>
+<p class="center"><a href="#X-PROPERTY">x-prop</a></p>
+<p>)</p>
+<p class="center">component  = 1*(<a href="#VEVENT">eventc</a> / <a href="#VTODO">todoc</a> / <a href="#VJOURNAL">journalc</a> / <a href="#VFREEBUSY">freebusyc</a> / <a href="#VTIMEZONE">timezonec</a> / iana-comp* / x-comp*)</p>
+<p class="center">iana-comp  = &quot;BEGIN&quot; &quot;:&quot; iana-token CRLF</p>
+<p class="center">1*contentline</p>
+<p class="center">&quot;END&quot; &quot;:&quot; iana-token CRLF</p>
+<p class="center">x-comp     = &quot;BEGIN&quot; &quot;:&quot; x-name CRLF</p>
+<p class="center">1*contentline</p>
+<p class="center">&quot;END&quot; &quot;:&quot; x-name CRLF</p>
+<p>*) <span class="comment">not supported by iCalcreator</span></p>
+
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
+
+<a name="VEVENT"></a><h2>2.2  VEVENT</h2>
+<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;VEVENT&quot; CRLF</p>
+<p class="center">eventprop *alarmc</p>
+<p class="center">&quot;END&quot; &quot;:&quot; &quot;VEVENT&quot; CRLF</p>
+<p>eventprop = *(</p>
+<p class="center">the following are optional,but MUST NOT occur more than once</p>
+<p class="center"><a href="#CLASS">class</a> / <a href="#CREATED">created</a> / <a href="#DESCRIPTION">description</a> / <a href="#DTSTART">dtstart</a> /</p>
+<p class="center"><a href="#GEO">geo</a> / <a href="#LAST-MODIFIED">last-mod</a> / <a href="#LOCATION">location</a> / <a href="#ORGANIZER">organizer</a> / <a href="#PRIORITY">priority</a> / </p>
+<p class="center"><a href="#DTSTAMP">dtstamp</a> / <a href="#SEQUENCE">seq</a> / <a href="#STATUS">status</a> / <a href="#SUMMARY">summary</a> / </p>
+<p class="center"><a href="#TRANSP">transp</a> / <a href="#UID">uid</a> / <a href="#URL">url</a> / <a href="#RECURRENCE-ID">recurid</a> /</p>
+<p class="center">either &quot;<a href="#DTEND">dtend</a>&quot; or &quot;<a href="#DURATION">duration</a>&quot; may appear in a &quot;eventprop&quot;, </p>
+<p class="center">but &quot;<a href="#DTEND">dtend</a>&quot; and &quot;<a href="#DURATION">duration</a>&quot; MUST NOT occur in the same &quot;eventprop&quot;</p>
+<p class="center"><a href="#DTEND">dtend</a> / <a href="#DURATION">duration</a> /</p>
+<p class="center">the following are optional, and MAY occur more than once</p>
+<p class="center"><a href="#ATTACH">attach</a> / <a href="#ATTENDEE">attendee</a> / <a href="#CATEGORIES">categories</a> / <a href="#COMMENT">comment</a> / </p>
+<p class="center"><a href="#CONTACT">contact</a> / <a href="#EXDATE">exdate</a> / <a href="#EXRULE">exrule</a> / <a href="#REQUEST-STATUS">rstatus</a> / </p>
+<p class="center"><a href="#RELATED-TO">related</a> / <a href="#RESOURCES">resources</a> / <a href="#RDATE">rdate</a> / <a href="#RRULE">rrule</a> / <a href="#X-PROPERTY_PROP">x-prop</a></p>
+<p>)</p>
+
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
+
+<a name="VTODO"></a><h2>2.3  VTODO</h2>
+<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;VTODO&quot; CRLF</p>
+<p class="center">todoprop *alarmc</p>
+<p class="center">&quot;END&quot; &quot;:&quot; &quot;VTODO&quot; CRLF</p>
+<p>todoprop   = *(</p>
+<p class="center">the following are optional, but MUST NOT occur more than once</p>
+<p class="center"><a href="#CLASS">class</a> / <a href="#COMPLETED">completed</a> / <a href="#CREATED">created</a> / <a href="#DESCRIPTION">description</a> / <a href="#DTSTAMP">dtstamp</a> / <a href="#DTSTART">dtstart</a> / </p>
+<p class="center"><a href="#GEO">geo</a> / <a href="#LAST-MODIFIED">last-mod</a> / <a href="#LOCATION">location</a> / <a href="#ORGANIZER">organizer</a> / <a href="#PERCENT-COMPLETE">percent</a> / <a href="#PRIORITY">priority</a> / </p>
+<p class="center"><a href="#RECURRENCE-ID">recurid</a> / <a href="#SEQUENCE">seq</a> / <a href="#STATUS">status</a> / <a href="#SUMMARY">summary</a> /<a href="#UID">uid</a> / <a href="#URL">url</a> /</p>
+<p class="center">either &quot;<a href="#DUE">due</a>&quot; or &quot;<a href="#DURATION">duration</a>&quot; may appear in a &quot;todoprop&quot;,</p>
+<p class="center"> but &quot;<a href="#DUE">due</a>&quot; and &quot;<a href="#DURATION">duration</a>&quot; MUST NOT occur in the same &quot;todoprop&quot;</p>
+<p class="center"><a href="#DUE">due</a> / <a href="#DURATION">duration</a> /</p>
+<p class="center">the following are optional,and MAY occur more than once</p>
+<p class="center"><a href="#ATTACH">attach</a> / <a href="#ATTENDEE">attendee</a> / <a href="#CATEGORIES">categories</a> / <a href="#COMMENT">comment</a> / </p>
+<p class="center"><a href="#CONTACT">contact</a> / <a href="#EXDATE">exdate</a> / <a href="#EXRULE">exrule</a> / <a href="#REQUEST-STATUS">rstatus</a> / </p>
+<p class="center"><a href="#RELATED-TO">related</a> / <a href="#RESOURCES">resources</a> / <a href="#RDATE">rdate</a> / <a href="#RRULE">rrule</a> / <a href="#X-PROPERTY_PROP">x-prop</a></p>
+<p>)</p>
+
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
+
+<a name="VJOURNAL"></a><h2>2.4  VJOURNAL</h2>
+<p class="center">journalc   = &quot;BEGIN&quot; &quot;:&quot; &quot;VJOURNAL&quot; CRLF</p>
+<p class="center">jourprop</p>
+<p class="center">&quot;END&quot; &quot;:&quot; &quot;VJOURNAL&quot; CRLF</p>
+<p>jourprop   = *(</p>
+<p class="center">the following are optional, but MUST NOT occur more than once</p>
+<p class="center"><a href="#CLASS">class</a> / <a href="#CREATED">created</a> / <a href="#DESCRIPTION">description</a> / <a href="#DTSTART">dtstart</a> / </p>
+<p class="center"><a href="#DTSTAMP">dtstamp</a> / <a href="#LAST-MODIFIED">last-mod</a> / <a href="#ORGANIZER">organizer</a> / <a href="#RECURRENCE-ID">recurid</a> / </p>
+<p class="center"><a href="#SEQUENCE">seq</a> / <a href="#STATUS">status</a> / <a href="#SUMMARY">summary</a> /<a href="#UID">uid</a> / <a href="#URL">url</a> /</p>
+<p class="center">the following are optional,and MAY occur more than once</p>
+<p class="center"><a href="#ATTACH">attach</a> / <a href="#ATTENDEE">attendee</a> / <a href="#CATEGORIES">categories</a> / <a href="#COMMENT">comment</a> /</p>
+<p class="center"><a href="#CONTACT">contact</a> / <a href="#EXDATE">exdate</a> / <a href="#EXRULE">exrule</a> / <a href="#RELATED-TO">related</a> / </p>
+<p class="center"><a href="#RDATE">rdate</a> / <a href="#RRULE">rrule</a> / <a href="#REQUEST-STATUS">rstatus</a> / <a href="#X-PROPERTY_PROP">x-prop</a></p>
+<p>)</p>
+
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
+
+<a name="VFREEBUSY"></a><h2>2.5  VFREEBUSY</h2>
+<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;VFREEBUSY&quot; CRLF</p>
+<p class="center">fbprop</p>
+<p class="center">&quot;END&quot; &quot;:&quot; &quot;VFREEBUSY&quot; CRLF</p>
+<p>fbprop     = *(</p>
+<p class="center">the following are optional, but MUST NOT occur more than once</p>
+<p class="center"><a href="#CONTACT">contact</a> / <a href="#DTSTART">dtstart</a> / <a href="#DTEND">dtend</a> / <a href="#DURATION">duration</a> / </p>
+<p class="center"><a href="#DTSTAMP">dtstamp</a> / <a href="#ORGANIZER">organizer</a> / <a href="#UID">uid</a> / <a href="#URL">url</a> / </p>
+<p class="center">the following are optional,and MAY occur more than once</p>
+<p class="center"><a href="#ATTENDEE">attendee</a> / <a href="#COMMENT">comment</a> / <a href="#FREEBUSY_PROP">freebusy</a> / <a href="#REQUEST-STATUS">rstatus</a> / <a href="#X-PROPERTY_PROP">x-prop</a></p>
+<p>)</p>
+
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
+
+<a name="VALARM"></a><h2>2.6  VALARM</h2>
+<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;VALARM&quot; CRLF</p>
+<p class="center">(audioprop / dispprop / emailprop / procprop)</p>
+<p class="center">&quot;END&quot; &quot;:&quot; &quot;VALARM&quot; CRLF</p>
+<p>audioprop  = 2*(</p>
+<p class="center">&quot;<a href="#ACTION">action</a>&quot; and &quot;<a href="#TRIGGER">trigger</a>&quot; are both REQUIRED, but MUST NOT occur more than once</p>
+<p class="center"><a href="#ACTION">action</a> / <a href="#TRIGGER">trigger</a> /</p>
+<p class="center">&quot;<a href="#DURATION">duration</a>&quot; and &quot;<a href="#REPEAT">repeat</a>&quot; are both optional,and MUST NOT occur more than once each,</p>
+<p class="center">but if one occurs, so MUST the other</p>
+<p class="center"><a href="#DURATION">duration</a> / <a href="#REPEAT">repeat</a> /</p>
+<p class="center">the following is optional, but MUST NOT occur more than once</p>
+<p class="center"><a href="#ATTACH">attach</a> / </p>
+<p class="center">the following is optional, and MAY occur more than once</p>
+<p class="center"><a href="#X-PROPERTY_PROP">x-prop</a></p>
+<p>)</p>
+
+<p>dispprop   = 3*(</p>
+<p class="center">the following are all REQUIRED, but MUST NOT occur more than once</p>
+<p class="center"><a href="#ACTION">action</a> / <a href="#DESCRIPTION">description</a> / <a href="#TRIGGER">trigger</a> /</p>
+<p class="center">&quot;<a href="#DURATION">duration</a>&quot; and &quot;<a href="#REPEAT">repeat</a>&quot; are both optional,and MUST NOT occur more than once each,</p>
+<p class="center">but if one occurs, so MUST the other</p>
+<p class="center"><a href="#DURATION">duration</a> / <a href="#REPEAT">repeat</a> /</p>
+<p class="center">the following is optional, and MAY occur more than once</p>
+<p class="center"><a href="#X-PROPERTY_PROP">x-prop</a></p>
+<p>)</p>
+
+<p>emailprop  = 5*(</p>
+<p class="center">the following are all REQUIRED, but MUST NOT occur more than once</p>
+<p class="center"><a href="#ACTION">action</a> / <a href="#DESCRIPTION">description</a> / <a href="#TRIGGER">trigger</a> / <a href="#SUMMARY">summary</a></p>
+<p class="center">the following is REQUIRED, and MAY occur more than once</p>
+<p class="center"><a href="#ATTENDEE">attendee</a> / </p>
+<p class="center">&quot;<a href="#DURATION">duration</a>&quot; and &quot;<a href="#REPEAT">repeat</a>&quot; are both optional, and MUST NOT occur more than once each,</p>
+<p class="center">but if one occurs, so MUST the other</p>
+<p class="center"><a href="#DURATION">duration</a> / <a href="#REPEAT">repeat</a> /</p>
+<p class="center">the following are optional, and MAY occur more than once</p>
+<p class="center"><a href="#ATTACH">attach</a> / <a href="#X-PROPERTY_PROP">x-prop</a></p>
+<p>)</p>
+
+<p>procprop   = 3*(</p>
+<p class="center">the following are all REQUIRED, but MUST NOT occur more than once</p>
+<p class="center"><a href="#ACTION">action</a> / <a href="#ATTACH">attach</a> / <a href="#TRIGGER">trigger</a> /</p>
+<p class="center">&quot;<a href="#DURATION">duration</a>&quot; and &quot;<a href="#REPEAT">repeat</a>&quot; are both optional, and MUST NOT occur more than once each,</p>
+<p class="center">but if one occurs, so MUST the other</p>
+<p class="center"><a href="#DURATION">duration</a> /
+<a href="#REPEAT">repeat</a> /</p>
+<p class="center">&quot;<a href="#DESCRIPTION">description</a>&quot; is optional, and MUST NOT occur more than once</p>
+<p class="center"><a href="#DESCRIPTION">description</a> / </p>
+<p class="center">the following is optional, and MAY occur more than once</p>
+<p class="center"><a href="#X-PROPERTY_PROP">x-prop</a></p>
+<p>)</p>
+
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
+
+<a name="VTIMEZONE"></a><h2>2.7  VTIMEZONE</h2>
+<p class="center">&quot;BEGIN&quot; &quot;:&quot; &quot;VTIMEZONE&quot; CRLF</p>
+<p>2*(</p>
+<p class="center">&quot;<a href="#TZID">tzid</a>&quot; is required, but MUST NOT occur more than once</p>
+<p class="center"><a href="#TZID">tzid</a> / </p>
+<p class="center">&quot;<a href="#LAST-MODIFIED">last-mod</a>&quot; and &quot;<a href="#TZURL">tzurl</a>&quot; are optional, but MUST NOT occur more than once</p>
+<p class="center"><a href="#LAST-MODIFIED">last-mod</a> / <a href="#TZURL">tzurl</a> /</p>
+<p class="center">one of &quot;standardc&quot; or &quot;daylightc&quot; MUST occur and each MAY occur more than once.</p>
+<p class="center">standardc / daylightc /</p>
+<p class="center">the following is optional, and MAY occur more than once</p>
+<p class="center"><a href="#X-PROPERTY_PROP">x-prop</a></p>
+<p>)</p>
+<p class="center">&quot;END&quot; &quot;:&quot; &quot;VTIMEZONE&quot; CRLF</p>
+<p class="center">standardc  = &quot;BEGIN&quot; &quot;:&quot; &quot;STANDARD&quot; CRLF</p>
+<p class="center">tzprop</p>
+<p class="center">&quot;END&quot; &quot;:&quot; &quot;STANDARD&quot; CRLF</p>
+<p class="center">daylightc  = &quot;BEGIN&quot; &quot;:&quot; &quot;DAYLIGHT&quot; CRLF</p>
+<p class="center">tzprop</p>
+<p class="center">&quot;END&quot; &quot;:&quot; &quot;DAYLIGHT&quot; CRLF</p>
+
+<p>tzprop     = 3*(</p>
+<p class="center">the following are each REQUIRED, but MUST NOT occur more than once</p>
+<p class="center"><a href="#DTSTART">dtstart</a> / <a href="#TZOFFSETTO">tzoffsetto</a> / <a href="#TZOFFSETFROM">tzoffsetfrom</a> /</p>
+<p class="center">the following are optional, and MAY occur more than once</p>
+<p class="center"><a href="#COMMENT">comment</a> /<a href="#RDATE">rdate</a> / <a href="#RRULE">rrule</a> / <a href="#TZNAME">tzname</a> / <a href="#X-PROPERTY_PROP">x-prop</a></p>
+<p>)</p>
+
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
+
+<a name="CalProps"></a><h2>2.8  Component Properties</h2>
+<p>
+A comprehensive table showing relation between <strong>calendar</strong> components and properties.
+<a href="#VTIMEZONE">vtimezone</a> properties are not included.
+</p>
+<table>
+<tr>
+<td>0-1</td>
+<td colspan="8">OPTIONAL property, MUST NOT occur more than once.</td>
+</tr>
+<tr>
+<td>0-m</td>
+<td colspan="8">OPTIONAL property, MAY occur more than once.</td>
+</tr>
+<tr>
+<td>0&nbsp;/&nbsp;1=1</td>
+<td colspan="8">A pair of OPTIONAL properties, MUST NOT occur more than once each.<br>If one occurs, so MUST the other</td>
+</tr>
+<tr>
+<td>0*1</td>
+<td colspan="8">A pair of OPTIONAL properties, MUST NOT occur more than once each.<br>If one occurs, so MUST NOT the other</td>
+</tr>
+<tr>
+<td>1-m</td>
+<td colspan="8">REQUIRED property, MAY occur more than once.</td>
+</tr>
+<tr>
+<td>1</td>
+<td colspan="8">REQUIRED property, MUST NOT occur more than once.</td>
+</tr>
+<tr>
+<td colspan="9">&nbsp;</td>
+</tr>
+<tr>
+<td>&nbsp;</td>
+<td class="bl bb center top" rowspan="2"><a class="ref" href="#VEVENT">v<br>e<br>v<br>e<br>n<br>t</a></td>
+<td class="bl bb center top" rowspan="2"><a class="ref" href="#VTODO">v<br>t<br>o<br>d<br>o</a></td>
+<td class="bl bb center top" rowspan="2"><a class="ref" href="#VJOURNAL">v<br>j<br>o<br>u<br>r<br>n<br>a<br>l</a></td>
+<td class="bl bb center top" rowspan="2"><a class="ref" href="#VFREEBUSY">v<br>f<br>r<br>e<br>e<br>b<br>u<br>s<br>y</a></td>
+<td class="bl top center" colspan="4"><a class="ref" href="#VALARM">v&nbsp;a&nbsp;l&nbsp;a&nbsp;r&nbsp;m</a></td>
+</tr>
+<tr>
+<td class="bb">&nbsp;</td>
+<td class="bl bb center ref"><br><br><br><br>a<br>u<br>d<br>i<br>o</td>
+<td class="bl bb center ref"><br><br>d<br>i<br>s<br>p<br>l<br>a<br>y</td>
+<td class="bl bb center ref"><br><br><br><br>e<br>m<br>a<br>i<br>l</td>
+<td class="bl bb center ref">p<br>r<br>o<br>c<br>e<br>d<br>u<br>r<br>e</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#ACTION">action</a></td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">1</td>
+<td class="blb">1</td>
+<td class="blb">1</td>
+<td class="blb">1</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#ATTACH">attach</a></td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">0-m</td>
+<td class="blb">1</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#ATTENDEE">attendee</a></td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">1-m</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#CATEGORIES">categories</a></td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#CLASS">class</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#COMMENT">comment</a></td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#COMPLETED">completed</a></td>
+<td class="blb">&nbsp;</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#CONTACT">contact</a></td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#CREATED">created</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#DESCRIPTION">description</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-m</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">1</td>
+<td class="blb">1</td>
+<td class="blb">0-1</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#DTEND">dtend</a></td>
+<td class="blb">0*1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#DTSTAMP">dtstamp</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#DTSTART">dtstart</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#DUE">due</a></td>
+<td class="blb">&nbsp;</td>
+<td class="blb">0*1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#DURATION">duration</a></td>
+<td class="blb">0*1</td>
+<td class="blb">0*1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">0-1</td>
+<td class="blb">0&nbsp;/&nbsp;1=1</td>
+<td class="blb">0&nbsp;/&nbsp;1=1</td>
+<td class="blb">0&nbsp;/&nbsp;1=1</td>
+<td class="blb">0&nbsp;/&nbsp;1=1</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#EXDATE">exdate</a></td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#EXRULE">exrule</a></td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#FREEBUSY_PROP">freebusy</a></td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">0-m</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#GEO">geo</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#LAST-MODIFIED">last-mod</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb"></td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#LOCATION">location</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#ORGANIZER">organizer</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#PERCENT-COMPLETE">percent</a></td>
+<td class="blb">&nbsp;</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#PRIORITY">priority</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#RDATE">rdate</a></td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#RECURRENCE-ID">recurid</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#RELATED-TO">related</a></td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#REPEAT">repeat</a></td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">0&nbsp;/&nbsp;1=1</td>
+<td class="blb">0&nbsp;/&nbsp;1=1</td>
+<td class="blb">0&nbsp;/&nbsp;1=1</td>
+<td class="blb">0&nbsp;/&nbsp;1=1</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#RESOURCES">resources</a></td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#RRULE">rrule</a></td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#REQUEST-STATUS">rstatus</a></td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#SEQUENCE">sequence</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#STATUS">status</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#SUMMARY">summary</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">1</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#TRANSP">transp</a></td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#TRIGGER">trigger</a></td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">1</td>
+<td class="blb">1</td>
+<td class="blb">1</td>
+<td class="blb">1</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#UID">uid</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#URL">url</a></td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">0-1</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+<td class="blb">&nbsp;</td>
+</tr>
+<tr>
+<td class="bb"><a class="ref" href="#X-PROPERTY_PROP">x-prop</a></td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+<td class="blb">0-m</td>
+</tr>
+</table>
+<p>
+If not set, the <a href="#DTSTAMP">DTSTAMP</a> and <a href="#UID">UID</a> properties
+are automatically created by iCalcreator<br>
+for <a href="#VEVENT">vevent</a>,<a href="#VTODO">vtodo</a>, <a href="#VJOURNAL">vjournal</a> and <a href="#VFREEBUSY">vfreebusy</a> components<br>
+when using iCalcreator object methods <a href="#saveCalendar">saveCalendar</a> or <a href="#returnCalendar">returnCalendar</a><br>
+or when fetching <a href="#DTSTAMP">DTSTAMP</a>/<a href="#UID">UID</a> property value with the component function <a href="#getProperty_PROP">getProperty</a>.
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_Component_list">[up]</a>
+
+<a name="Function_list"></a><h1>3 Function list</h1>
+
+<a name="iCalcreator_object_methods"></a><h2>3.1 iCalcreator object methods</h2>
+
+<a name="Calendar_object_constructors"></a><h3>3.1.1 Constructors</h3>
+<a name="vcalendar_constr"></a><h4>3.1.1.1 vcalendar</h4>
+<p>Create a new <a href="#VCALENDAR">VCALENDAR</a> object.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::vcalendar( [ config ] )</p>
+<p class="comment">
+config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
+</p>
+<p class="label">Basic example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot; );
+$vcalendar = new vcalendar( $config );
+...
+</p>
+<p>
+The <strong>calendar</strong> property PRODID and each component property <a href="#UID">UID</a> are AUTOMATICALLY generated in iCalcreator,
+if not set manually, and based on the configuration <a href="#Unique_id">unique_id</a>.
+</p>
+<p class="label">Extended example</p>
+<p class="example">&lt;?php
+.. .
+$tz        = &quot;Europe/Stockholm&quot;
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;
+                    &quot;TZID&quot;      =&gt; $tz );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;setProperty( "X-WR-TIMEZONE", $tz );
+.. .
+.. .  // <span class="comment">insert components or parse an iCal file (and edit components)</span>
+.. .
+$xprops    = array( &quot;X-LIC-LOCATION&quot; => $tz );
+iCalUtilityFunctions::createTimezone( $vcalendar, $tz, $xprops );
+.. .
+</p>
+<p>
+The <a href="#dTZID">TZID</a> config key and value (timezone) is supplied when setting <a href="#DTSTART">DTSTART</a>,
+<a href="#DTEND">DTEND</a>, <a href="#DUE">DUE</a> or <a href="#RECURRENCE-ID">RECURRENCE-ID</a>,
+if not set manually, a TZID <b>auto completion</b>.
+</p>
+<p>
+Some <strong>calendar</strong> software may also require calendar property <a href="#Additional_Descriptors">X-WR-TIMEZONE</a>
+and vtimezone component with property <a href="#Additional_Descriptors">X-LIC-LOCATION</a>,
+review <a href="#createTimezone">createTimezone</a>, a function in iCalUtilityFunctions class.
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Function_list">[up]</a>
+
+
+<a name="vevent_constr"></a><h4>3.1.1.2 vevent</h4>
+<p class="label">Format 1</p>
+<p>Create a new <a href="#VEVENT">VEVENT</a> object using an iCalcreator object component factory-method, returning a reference to the new component.</p>
+<p class="format">vcalendar::newComponent( &quot;vevent&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vevent    = &amp; $vcalendar-&gt;newComponent( &quot;vevent&quot; );
+$vevent-&gt;setProperty(...
+...
+</p>
+<p class="label">Format 2</p>
+<p>Create a new <a href="#VEVENT">VEVENT</a> object.</p>
+<p class="format">vevent::vevent( [ config ] )</p>
+<p class="comment">
+config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$config    = $vcalendar-&gt;getConfig();
+$vevent    = new vevent( $config );
+$vevent-&gt;setProperty(...
+...
+$vcalendar-&gt;setComponent( $vevent );
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Function_list">[up]</a>
+
+
+<a name="vtodo_constr"></a><h4>3.1.1.3 vtodo</h4>
+<p class="label">Format 1</p>
+<p>Create a new <a href="#VTODO">VTODO</a> object using an iCalcreator object component factory-method, returning a reference to the new component.</p>
+<p class="format">vcalendar::newComponent( &quot;vtodo&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vtodo     = &amp; $vcalendar-&gt;newComponent( &quot;vtodo&quot; );
+$vtodo-&gt;setProperty(...
+...
+</p>
+<p class="label">Format 2</p>
+<p>Create a new <a href="#VTODO">VTODO</a> object.</p>
+<p class="format">vtodo::vtodo( [ config ] )</p>
+<p class="comment">
+config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vtodo     = new vtodo( $vcalendar-&gt;getConfig());
+$vtodo-&gt;setProperty(...
+...
+$vcalendar-&gt;setComponent( $vtodo );
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Function_list">[up]</a>
+
+
+<a name="vjournal_constr"></a><h4>3.1.1.4 vjournal</h4>
+<p class="label">Format 1</p>
+<p>Create a new <a href="#VJOUNAL">VJOURNAL</a> object using an iCalcreator object factory-method, returning a reference to the new component.</p>
+<p class="format">vcalendar::newComponent( &quot;vjournal&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vjournal  = &amp; $vcalendar-&gt;newComponent( &quot;vjournal&quot; );
+$vjournal-&gt;setProperty(...
+...
+</p>
+<p class="label">Format 2</p>
+<p>Create a new <a href="#VJOURNAL">VJOURNAL</a> object.</p>
+<p class="format">vjournal::vjournal( [ config ] )</p>
+<p class="comment">
+config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vjournal  = new vjournal( $vcalendar-&gt;getConfig());
+$vjournal-&gt;setProperty(...
+...
+$vcalendar-&gt;setComponent( $vjournal );
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Function_list">[up]</a>
+
+
+<a name="vfreebusy_constr"></a><h4>3.1.1.5 vfreebusy</h4>
+<p class="label">Format 1</p>
+<p>Create a new <a href="#VFREEBUSY">VFREEBUSY</a> object using an iCalcreator object factory-method, returning a reference to the new component.</p>
+<p class="format">vcalendar::newComponent( &quot;vfreebusy&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vfreebusy = &amp; $vcalendar-&gt;newComponent( &quot;vfreebusy&quot; );
+$vfreebusy-&gt;setProperty(...
+...
+</p>
+<p class="label">Format 2</p>
+<p>Create a new <a href="#VFREEBUSY">VFREEBUSY</a> object.</p>
+<p class="format">vfreebusy::vfreebusy( [ config ] )</p>
+<p class="comment">
+config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vfreebusy = new vfreebusy( $vcalendar-&gt;getConfig());
+$vfreebusy-&gt;setProperty(...
+...
+$vcalendar-&gt;setComponent( $vfreebusy );
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Function_list">[up]</a>
+
+
+<a name="valarm_constr"></a><h4>3.1.1.6 valarm</h4>
+<p class="label">Format 1</p>
+<p>Create a new <a href="#VALARM">VALARM</a> object using an iCalcreator object component factory-method, returning a reference to the new (sub-)component.</p>
+<p class="format">calendarComponent::newComponent( &quot;valarm&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vevent    = &amp; $vcalendar-&gt;newComponent( &quot;vevent&quot; );
+$vevent-&gt;setProperty(...
+...
+$valarm    = &amp; $vevent-&gt;newComponent( &quot;valarm&quot; );
+$valarm-&gt;setProperty(...
+...
+</p>
+<p class="label">Format 2</p>
+<p>Create a new <a href="#VALARM">VALARM</a> object.</p>
+<p class="format">valarm::valarm( [ config ] )</p>
+<p class="comment">
+config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vevent    = new vevent();
+$vevent-&gt;setProperty(...
+...
+$valarm    = new valarm( $vevent-&gt;getConfig());
+$valarm-&gt;setProperty(...
+...
+$vevent-&gt;setComponent( $valarm );
+...
+$vcalendar-&gt;setComponent( $vevent );
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Function_list">[up]</a>
+
+
+<a name="vtimezone_constr"></a><h4>3.1.1.7 vtimezone</h4>
+<p>
+The vtimezone component describe, at a minimum, the base offset from <b>UTC</b> for the time zone.
+For dates with UTC DATE-TIME, read <a href="#DATE_WITH_UTC_TIME">this</a>!
+</p>
+<p class="label">Format 1</p>
+<p>Create a new <a href="#VTIMEZONE">VTIMEZONE</a> object using an iCalcreator object component factory-method, returning a reference to the new component.</p>
+<p class="format">vcalendar::newComponent( &quot;vtimezone&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vtimezone = &amp; $vcalendar-&gt;newComponent( &quot;vtimezone&quot; );
+$vtimezone-&gt;setProperty(...
+...
+</p>
+<p class="label">Format 2</p>
+<p>Create a new <a href="#VTIMEZONE">VTIMEZONE</a> object.</p>
+<p class="format">vtimezone::vtimezone( [ config ] )</p>
+<p class="comment">
+config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vtimezone = new vtimezone( $vcalendar-&gt;getConfig());
+$vtimezone-&gt;setProperty(...
+...
+$vcalendar-&gt;setComponent( $vtimezone );
+...
+</p>
+<br>
+<h5>Creation of timezone components</h5>
+<p>
+It is possible to create timezone components, using a function in iCalUtilityFunctions class, <a href="#createTimezone">createTimezone</a>
+and utilizing the <em>PHP</em> DateTimeZone class (<em>PHP</em> 5 >= 5.2.0).
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Function_list">[up]</a>
+
+<a name="standard_constr"></a><h4>3.1.1.8 standard</h4>
+<p class="label">Format 1</p>
+<p>Create a new <a href="#VTIMEZONE">VTIMEZONE</a> <b>standard</b> object using an iCalcreator object component factory-method, returning a reference to the new (sub-)component.</p>
+<p class="format">vtimezone::newComponent( &quot;standard&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vtimezone = &amp; $vcalendar-&gt;newComponent( &quot;vtimezone&quot; );
+$vtimezone-&gt;setProperty(...
+...
+$standard  = &amp; $vtimezone-&gt;newComponent( &quot;standard&quot; );
+$standard-&gt;setProperty(...
+...
+$daylight  = &amp; $vtimezone-&gt;newComponent( &quot;daylight&quot; );
+$daylight-&gt;setProperty(...
+...
+</p>
+<p class="label">Format 2</p>
+<p>Create a new <a href="#VTIMEZONE">VTIMEZONE</a> STANDARD object.</p>
+<p class="format">vtimezone::vtimezone( &quot;standard&quot; [, config ] )</p>
+<p class="comment">
+config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vtimezone = new vtimezone( $vcalendar-&gt;getConfig());
+$vtimezone-&gt;setProperty(...
+...
+$standard  = new vtimezone( &quot;standard&quot;, $vtimezone-&gt;getConfig());
+$standard-&gt;setProperty(...
+...
+$vtimezone-&gt;setComponent( $standard );
+...
+$daylight  = new vtimezone( &quot;daylight&quot;, $vtimezone-&gt;getConfig());
+$daylight-&gt;setProperty(...
+...
+$vtimezone-&gt;setComponent( $daylight );
+...
+$vcalendar-&gt;setComponent( $vtimezone );
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Function_list">[up]</a>
+
+
+<a name="daylight_constr"></a><h4>3.1.1.9 daylight</h4>
+<p class="label">Format 1</p>
+<p>Create a new <a name="VTIMEZONE">VTIMEZONE</a> <b>daylight</b> object using a component factory-method, returning a reference to the new (sub-)component.</p>
+<p class="format">vtimezone::newComponent( &quot;standard&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vtimezone = &amp; $vcalendar-&gt;newComponent( &quot;vtimezone&quot; );
+...
+$standard  = &amp; $vtimezone-&gt;newComponent( &quot;standard&quot; );
+...
+$daylight  = &amp; $vtimezone-&gt;newComponent( &quot;daylight&quot; );
+...
+</p>
+<p class="label">Format 2</p>
+<p>Create a new <a href="#VTIMEZONE">VTIMEZONE</a> DAYLIGHT object.</p>
+<p class="format">vtimezone::vtimezone( &quot;daylight&quot; [, config ] )</p>
+<p class="comment">
+config = array, review <a href="#iCalcreator_configuration_methods">configuration</a> options.
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vtimezone = new vtimezone( $vcalendar-&gt;getConfig());
+...
+$standard  = new vtimezone( &quot;standard&quot;, $vtimezone-&gt;getConfig());
+...
+$vtimezone-&gt;setComponent( $standard );
+$daylight  = new vtimezone( &quot;daylight&quot;, $vtimezone-&gt;getConfig() );
+...
+$vtimezone-&gt;setComponent( $daylight );
+$vcalendar-&gt;setComponent( $vtimezone );
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Function_list">[up]</a>
+
+
+<a name="iCalcreator_object_property_methods"></a><h3>3.1.2 iCalcreator object property methods</h3>
+
+<a name="deleteProperty"></a><h4>3.1.2.1 deleteProperty</h4>
+<p>Generic iCalcreator object deleteProperty method, simplifying removal of <strong>calendar</strong> properties.</p>
+<p>FALSE is returned if no property exists or when end-of-properties at consecutive function calls.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::deleteProperty( [ PropName [, order=1 ] )</p>
+<p class="comment">propName = (string) case independent, [RFC5545] component property names,
+                    unknown/missing propName will be regarded as <a href="#X-PROPERTY">X-property</a>.
+order    = (int) if missing 1st/next occurrence,
+                 used with multiple (property) occurrences
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+if( !$vcalendar-&gt;deleteProperty( &quot;method&quot; ))
+&nbsp;&nbsp;echo "METHOD property not found";
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_object_property_methods">[up]</a>
+
+
+<a name="getProperty"></a><h4>3.1.2.2 getProperty</h4>
+<p class="label">Format 1</p>
+<p>Generic iCalcreator getProperty method, simplifying fetch of <strong>calendar</strong> properties.</p>
+<p>FALSE is returned if no property exists or when end-of-properties at consecutive function calls.</p>
+<p class="format">vcalendar::getProperty( [ PropName [, order=1 [, complete=FALSE ]]] )</p>
+<p class="comment">propName = (string) case independent, [RFC5545] component property names,
+           unknown/missing propName will be regarded as <a href="#X-PROPERTY">X-property</a>.
+order    = (int) if missing 1st/next occurrence,
+           used with multiply (property) occurrences
+complete = (bool) FALSE (default) : output only property value
+                  TRUE            : output = array( &quot;value&quot;=&gt; &lt;value&gt; ,&quot;params&quot; =&gt; &lt;parameter array&gt;)
+</p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$calscale  = $vcalendar-&gt;getProperty( &quot;calscale&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p class="example">&lt;?php
+.. .
+$config       = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar    = new vcalendar( $config );
+$vcalendar-&gt;parse();
+while( $xprop = $vcalendar-&gt;getProperty( )) { // <span class="comment">get x-properties</span>
+.. .
+</p>
+<a name="getProperty2"></a>
+<a name="geoLocation"></a>
+<p class="label">Format 2</p>
+<p>
+Ability to fetch specific <i>component</i> property (unique) value(-s) and number of occurrence(-s).
+ The search includes <b>ALL</b> components within the iCalcreator object instance.
+</p>
+<p>
+Outputs an array( *[ (string) unique-property-value =&gt; (int) number_of_occurrence ] ) or an empty array if no hits.
+The array is sorted by (asc.) key. If a property contains multiple values (like &quot;CATAGORIES:course1,courseB&quot; or
+ &quot;RESOURCES:pc,camera&quot;), they are split into unique values.
+</p>
+<dl>
+<dt>Supported Descriptive Component Properties
+<dd><a href="#CATEGORIES">CATEGORIES</a>
+<dd><a href="#LOCATION">LOCATION</a>
+<dd>GEOLOCATION&nbsp;<sup>*1</sup>
+<dd><a href="#PRIORITY">PRIORITY</a>
+<dd><a href="#RESOURCES">RESOURCES</a>
+<dd><a href="#STATUS">STATUS</a>
+<dd><a href="#SUMMARY">SUMMARY</a>
+<dt>Supported Date and Time Component Property
+<dd><a href="#DTSTART">DTSTART</a>&nbsp;<sup>*2</sup>
+<dt>Supported Relationship Component Properties
+<dd><a href="#ATTENDEE">ATTENDEE</a>&nbsp;<sup>*3</sup>
+<dd><a href="#CONTACT">CONTACT</a>
+<dd><a href="#ORGANIZER">ORGANIZER</a>&nbsp;<sup>*3</sup>
+<dd><a href="#RECURRENCE-ID">RECURRENCE-ID</a>&nbsp;<sup>*4</sup> (alt. &quot;R-UID&quot;)
+<dd><a href="#RELATED-TO">RELATED-TO</a>
+<dd><a href="#URL">URL</a>
+<dd><a href="#UID">UID</a>
+</dl>
+<dl>
+<dt><sup>*1</sup>
+<dd>Using the non-standard directive &quot;GEOLOCATION&quot;, iCalcreator returns output supporting<br>
+ISO6709 &quot;Standard representation of geographic point location by coordinates&quot;,<br>
+by combining the <a href="#LOCATION">LOCATION</a> and <a href="#GEO">GEO</a> property values
+ (only if <a href="#GEO">GEO</a> is set).
+<dt><sup>*2</sup>
+<dd>Using <a href="#DTSTART">DTSTART</a> as argument returns dates in format &quot;YYYYMMDD&quot; (please note, dates within a <a href="#RDATE">RDATE</a>/<a href="#RRULE">RRULE</a>
+ recurrence set are NOT included, only the origin start date (<a href="#DTSTART">DTSTART</a>)).
+<dt><sup>*3</sup>
+<dd>The <a href="#ATTENDEE">ATTENDEE</a> and <a href="#ORGANIZER">ORGANIZER</a> output values are prefixed
+ by &quot;protocol&quot; like &quot;MAILTO:chair@kigkonsult.se&quot;.
+<dt><sup>*4</sup>
+<dd>Using &quot;RECURRENCE-ID-UID&quot; returns <a href="#UID">UID</a> values for component(-s) where <a href="#RECURRENCE-ID">RECURRENCE-ID</a> is set.
+</dl>
+<p>
+To select components based on property values, use <a href="#selectComponents2">selectComponents</a> (Format 2).
+</p>
+<p>
+To get components based on property values, use <a href="#getComponent5">getComponent</a> (Format 5).
+</p>
+<p class="format">vcalendar::getProperty( PropName )</p>
+<p class="comment">propName = (string) case independent, property name</p>
+<p class="label">Example 1</p>
+<p>Fetch all attendees in the iCalcreator object instance.</p>
+<p class="example">&lt;?php
+.. .
+$attendees = $vcalendar-&gt;getProperty( &quot;ATTENDEE&quot; );
+foreach( $attendees as $attendee => $occurrCount ) {
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Fetch all DTSTARTs in the iCalcreator object instance.</p>
+<p class="example">&lt;?php
+.. .
+$startDates = $vcalendar-&gt;getProperty( &quot;DTSTART&quot; );
+foreach( $startDates as $startDate => $occurrCount ) {
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_object_property_methods">[up]</a>
+
+
+<a name="setProperty"></a><h4>3.1.2.3 setProperty</h4>
+<p>Generic the iCalcreator object setProperty method,simplifying insert of <strong>calendar</strong> properties.</p>
+<p>A successful update returns TRUE.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::setProperty( PropName, Proparg_1 *[, Proparg_n] )</p>
+<p class="comment">propName = (string) case independent, strict [RFC5545] <strong>calendar</strong> property names,
+                                      unknown propName will be regarded as (a non-standard) <a href="#X-PROPERTY">X-property</a>.
+Proparg  = (mixed) property argument
+           Last property argument is a (optional) property dependent parameters
+           array( *[(string) key =&gt; (string) value ] ).
+           A non-standard (, experimental) parameter key MUST be prefixed by &quot;X-&quot;.
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;filename&quot;  =&gt; &quot;file.ics&quot;,
+                    &quot;TZID&quot;      =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config ); // <span class="comment">initiate new CALENDAR</span>
+$vcalendar-&gt;setProperty( &quot;calscale&quot;, &quot;GREGORIAN&quot; );
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_object_property_methods">[up]</a>
+
+
+<a name="CALSCALE"></a><h4>3.1.2.4 CALSCALE</h4>
+<p>
+This property defines the <strong>calendar</strong> scale used for the <strong>calendar</strong> information specified in the <strong>iCalendar</strong> object.
+</p>
+<p>
+The default value is &quot;GREGORIAN&quot;, implied when missing.
+</p>
+<h5>Create CALSCALE</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::createCalscale()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $vcalendar-&gt;createCalscale();
+...
+</p>
+<h5>Delete CALSCALE</h5>
+<p>Remove CALSCALE from calendar.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::deleteProperty( &quot;calscale&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vcalendar-&gt;deleteProperty( &quot;CALSCALE&quot; );
+...
+</p>
+<h5>Get Calscale</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::getProperty( &quot;calscale&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$calscale  = $vcalendar-&gt;getProperty( &quot;calscale&quot; );
+.. .
+</p>
+<h5>Set CALSCALE</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::setProperty( &quot;calscale&quot;, value )</p>
+<p class="comment">value = (string) calscale value</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config ); // <span class="comment">initiate new CALENDAR</span>
+$vcalendar-&gt;setProperty( &quot;calscale&quot;, &quot;GREGORIAN&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_object_property_methods">[up]</a>
+
+
+<a name="METHOD"></a><h4>3.1.2.5 METHOD</h4>
+<p>
+This property defines the <strong>iCalendar</strong> object method associated with the <strong>calendar</strong> object.
+</p>
+<p>
+METHOD property (value PUBLISH etc.) may be required when importing iCal files
+into some calendaring software (MS etc.), as well as <a href="#X-PROPERTY">x-properties</a>
+"X-WR-CALNAME", "X-WR-CALDESC" and "X-WR-TIMEZONE"
+and the (automatically created) <a href="#DTSTAMP">DTSTAMP</a> and <a href="#UID">UID</a> properties.
+</p>
+<h5>Create METHOD</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::createMethod()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $vcalendar-&gt;createMethod();
+...
+</p>
+<h5>Delete METHOD</h5>
+<p>Remove METHOD from calendar.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::deleteProperty( &quot;METHOD&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vcalendar-&gt;deleteProperty( &quot;METHOD&quot; );
+...
+</p>
+<h5>Get METHOD</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::getProperty( &quot;method&quot; );</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;);
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$method    = $vcalendar-&gt;getProperty( &quot;method&quot; );
+.. .
+</p>
+<h5>Set METHOD</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::setProperty( &quot;method&quot;, value )</p>
+<p class="comment">value = (string) method value</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config ); // <span class="comment">initiate new CALENDAR</span>
+$vcalendar-&gt;setProperty( &quot;method&quot;, &quot;PUBLISH&quot; );
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_object_property_methods">[up]</a>
+
+
+<a name="VERSION"></a><h4>3.1.2.6 VERSION</h4>
+<p>
+This property specifies the identifier corresponding to the version number of the <strong>iCalendar</strong> specification.
+This property is always placed first in the <strong>calendar</strong> file.
+</p>
+<h5>Create Version</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::createVersion()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $vcalendar-&gt;createVersion();
+...
+</p>
+<h5>Get Version</h5>
+<p>Fetch property value.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::getProperty( &quot;version&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$version   = $vcalendar-&gt;getProperty( &quot;version&quot; )
+.. .
+</p>
+<h5>Set Version</h5>
+<p>Insert property value.
+Only version 2.0 valid, version is <b>AUTO</b> generated at <strong>calendar</strong> creation.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::setProperty( &quot;version&quot;, version )</p>
+<p class="comment">version = (string) iCal version</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config ); // <span class="comment">initiate new CALENDAR</span>
+$vcalendar-&gt;setProperty( &quot;version&quot;, &quot;2.0&quot; );
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_object_property_methods">[up]</a>
+
+<a name="X-PROPERTY"></a><h4>3.1.2.7 X-PROPERTY</h4>
+<p>
+A <strong>calendar</strong>, non-standard property with a TEXT value and a name with an &quot;X-&quot; prefix. In a <strong>calendar</strong>,
+an x-property, with an unique name, can occur only once but the number of x-properties are unlimited.
+</p>
+<p>
+X-properties "X-WR-CALNAME", "X-WR-CALDESC" and "X-WR-TIMEZONE"  may be required when importing iCal files
+into some calendaring software (MS etc.), as well as <a href="#METHOD">METHOD</a> property (value PUBLISH etc.)
+and the (automatically created) <a href="#DTSTAMP">DTSTAMP</a> and <a href="#UID">UID</a> properties.
+</p>
+<p>The value type is TEXT.</p>
+<h5>Create X-property</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::createXprop()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $vcalendar-&gt;createXprop();
+...
+</p>
+<h5>Delete X-PROPERTY</h5>
+<p>Remove X-PROPERTY from <strong>calendar</strong>.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::deleteProperty( &quot;&lt;X-PROPERTY&gt;&quot; )</p>
+<p class="label">Example 1</p>
+<p>Delete the x-property named &quot;X-PROPERTY&quot;.</p>
+<p class="example">&lt;?php
+.. .
+$vcalendar-&gt;deleteProperty( &quot;X-PROPERTY&quot; );
+...
+</p>
+<p class="label">Example 2</p>
+<p>Delete all x-properties.</p>
+<p class="example">&lt;?php
+.. .
+while( $vcalendar-&gt;deleteProperty())
+  continue;
+...
+</p>
+<h5>Get X-PROPERTY</h5>
+<p>If set, returns property (name and) value, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::getProperty()</p>
+<p class="format">vcalendar::getProperty( &quot;&lt;X-PROPERTY&gt;&quot; )</p>
+<p class="comment">output = array( propertyName<sup>1</sup>, propertyData<sup>2</sup> )</p>
+<p class="format">vcalendar::getProperty( FALSE, propOrderNo/FALSE, TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( propertyName<sup>1</sup>
+              , array( &quot;value&quot;  =&gt; propertyData<sup>2</sup> )
+                     , &quot;params&quot; =&gt; params<sup>3</sup>))
+</p>
+<p class="label">Example 1</p>
+<p>Read all x-prop values in a loop.</p>
+<p class="example">&lt;?php
+.. .
+$config       = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar    = new vcalendar( $config );
+$vcalendar-&gt;parse();
+while( $xprop = $vcalendar-&gt;getProperty( )) { // <span class="comment">$xprop = array( propertyName<sup>1</sup>, propertyData<sup>2</sup> )</span>
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>If exists, read X-WR-TIMEZONE x-prop</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+if( $xprop = $vcalendar-&gt;getProperty( &quot;X-WR-TIMEZONE&quot; )) {
+.. . // <span class="comment">$xprop = array( &quot;X-WR-TIMEZONE&quot;, propertyData<sup>2</sup> )</span>
+.. .
+</p>
+<p class="label">Example 3</p>
+<p class="example">&lt;?php
+.. .
+$config       = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar    = new vcalendar( $config );
+$vcalendar-&gt;parse();
+while( $xprop = $vcalendar-&gt;getProperty( FALSE, FALSE, TRUE )) {
+     /* <span class="comment">$xprop = array( propertyName<sup>1</sup>
+                                         , array( &quot;value &quot;   =&gt; propertyData<sup>2</sup>
+                                                   , &quot;params &quot;=&gt; params<sup>3</sup> ))</span>
+     */
+.. .
+</p>
+<h5>Set X-PROPERTY</h5>
+Insert property name and value. If an x-prop with the same name already exists, it will be replaced.
+PropertyNames are always stored upperCase, ex. x-wr-calname =&gt; X-WR-CALNAME.
+<p class="label">Format</p>
+<p class="format">vcalendar::setProperty( propertyName, propertyData [, params ] )</p>
+<p class="comment">propertyName<sup>1</sup> = (string) Any property name with a &quot;X-&quot; prefix
+propertyData<sup>2</sup> = (string) Value type TEXT
+params<sup>3</sup>       = (array) ( [&quot;LANGUAGE&quot; =&gt; (string) &quot;lang<sup>*</sup>&quot;] *[, xparams] )
+xparams       = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo   = (int) order number             // <span class="comment">1=1st, 2=2nd etc</span>
+lang<sup>*</sup>         = as defined in [RFC5646]
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config ); // initiate new CALENDAR
+     // <span class="comment">set some X-properties.. .</span>
+$vcalendar-&gt;setProperty( &quot;x-wr-calname&quot;,  &quot;Calendar Sample&quot; )
+$vcalendar-&gt;setProperty( &quot;X-WR-CALDESC&quot;,  &quot;Calendar Description&quot; );
+$vcalendar-&gt;setProperty( &quot;X-WR-TIMEZONE&quot;, &quot;Europe/Stockholm&quot; );
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_object_property_methods">[up]</a>
+
+<a name="iCalcreator_component_object_methods"></a><h3>3.1.3 iCalcreator component object methods</h3>
+
+<a name="deleteComponent"></a><h4>3.1.3.1 deleteComponent</h4>
+<p>
+Remove component from the iCalcreator object instance.<br>
+FALSE is returned if no property exists or when end-of-properties at consecutive function calls.
+</p>
+<p class="label">format 1</p>
+Remove component with order number (1st=1, 2nd=2.. .).
+<p class="format">vcalendar::deleteComponent( orderNumber )</p>
+<p class="comment">orderNumber = (int) order number</p>
+<p class="label">format 2</p>
+<P>Remove component with component type (e.g. &quot;vevent&quot;) and order 1 alt. suborder number.</p>
+<p class="format">vcalendar::deleteComponent( componentType [, componentSuborderNumber])</p>
+<p class="comment">componentType           = (string) component type
+componentSuborderNumber = (int) order number</p>
+<p class="label">format 3</p>
+<p>Remove component with <a href="#UID">UID</a>. N.B <a href="#UID">UID</a> is NOT set for <a href="#VALARM">ALARM</a> / <a href="#VTIMEZONE">TIMEZONE</a> components.</p>
+<p class="format">vcalendar::deleteComponent( <a href="#UID">UID</a> )</p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$vcalendar-&gt;deleteComponent( 1 );
+$vcalendar-&gt;deleteComponent( &quot;vtodo&quot;, 2 );
+$vcalendar-&gt;deleteComponent( &quot;20070803T194810CEST-0123U3PXiX@kigkonsult.se&quot;);
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Deleting all components, using format 2 without order number.</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+.. .
+while( $vcalendar-&gt;deleteComponent( &quot;vevent&quot;))
+  continue;
+.. .
+$vtodo = $vcalendar-&gt;getComponent( &quot;vtodo&quot; );
+while( $vtodo-&gt;deleteComponent( &quot;valarm&quot;))
+  continue;
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_object_methods">[up]</a>
+
+<a name="getComponent"></a><h4>3.1.3.2 getComponent</h4>
+<p>Get component from the iCalcreator object instance.</p>
+<p>FALSE is returned if no property exists or when end-of-properties at consecutive function calls.</p>
+<p class="label">format 1</p>
+<p>Get next component, until end-of-components.</p>
+<p class="format">vcalendar::getComponent()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config      = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar   = new vcalendar( $config );
+$vcalendar-&gt;parse();
+while( $comp = $vcalendar-&gt;getComponent()) {
+.. .
+}
+.. .
+</p>
+<p class="label">format 2</p>
+<P>Get specific component with order number (1st=1, 2nd=2.. .).</p>
+<p class="format">vcalendar::getComponent( orderNumber )</p>
+<p class="comment">orderNumber = (int) order number</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+if( $comp  = $vcalendar-&gt;getComponent( 1 )) {
+.. .
+}
+.. .
+</p>
+
+<p class="label">format 3</p>
+<p>
+Get (first/next) component with component type (until end-of-components) alt.
+get specific component with component type and suborder number (1st=1, 2nd=2.. .).
+</p>
+<p class="format">vcalendar::getComponent( componentType [, componentSuborderNumber])</p>
+<p class="comment">componentType           = (string) component type
+componentSuborderNumber = (int) order number</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+if( $comp  = $vcalendar-&gt;getComponent( &quot;vtodo&quot;, 2 )) {
+.. .
+}
+.. .
+</p>
+
+<p class="label">format 4</p>
+<p>
+Get (first/next) component with <a href="#UID">UID</a> as key.
+(<a href="#UID">UID</a> is NOT set for <a href="#VALARM">ALARM</a> / <a href="#VTIMEZONE">TIMEZONE</a> components.)
+</p>
+<p class="format">vcalendar::getComponent( <a href="#UID">UID</a> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$uid       = &quot;20070803T194810CEST-0123U3PXiX@kigkonsult.se&quot;;
+if( $comp  = $vcalendar-&gt;getComponent( $uid )) {
+.. .
+}
+.. .
+</p>
+
+<a name="getComponent5"></a>
+<p class="label">format 5</p>
+<p>
+Get (first/next) component based on specific property contents:
+</p>
+<dl>
+<dt>Supported Descriptive Component Properties
+<dd><a href="#CATEGORIES">CATEGORIES</a>
+<dd><a href="#LOCATION">LOCATION</a>
+<dd><a href="#PRIORITY">PRIORITY</a>
+<dd><a href="#RESOURCES">RESOURCES</a>
+<dd><a href="#STATUS">STATUS</a>
+<dd><a href="#SUMMARY">SUMMARY</a>
+<dt>Date and Time Component Properties
+<dd><a href="#COMPLETED">COMPLETED</a>
+<dd><a href="#DTEND">DTEND</a>
+<dd><a href="#DUE">DUE</a>
+<dd><a href="#DTSTART">DTSTART</a>
+<dt>SupportedRelationship Component Properties
+<dd><a href="#ATTENDEE">ATTENDEE</a>&nbsp;<sup>*1</sup>
+<dd><a href="#CONTACT">CONTACT</a>
+<dd><a href="#ORGANIZER">ORGANIZER</a>&nbsp;<sup>*1</sup>
+<dd><a href="#RECURRENCE-ID">RECURRENCE-ID</a>
+<dd><a href="#RELATED-TO">RELATED-TO</a>
+<dd><a href="#URL">URL</a>
+<dd><a href="#UID">UID</a>
+<dt>Change Management Component Properties
+<dd><a href="#CREATED">CREATED</a>
+<dd><a href="#DTSTAMP">DTSTAMP</a>
+<dd><a href="#LAST-MODIFIED">LAST-MODIFIED</a>
+</dl>
+<dl>
+<dt><sup>*1</sup>
+<dd><a href="#ATTENDEE">ATTENDEE</a> and
+<a href="#ORGANIZER">ORGANIZER</a> search values must be prefixed by protocol ex. &quot;MAILTO:chair@ical.net&quot;.
+</dl>
+<p>
+For the property &quot;SUMMARY&quot; ,if a search value (any case) exists within property value, a hit exists.
+For the other, non-date, properties an exact (strict case) match is required.
+</p>
+<p>
+To select components based on property values, use <a href="#selectComponents2">selectComponents</a> (Format 2).
+</p>
+<p>
+To retrieve specific iCalcreator instance property values, searching <b>ALL</b> components,
+use <a href="#getProperty2">getProperty</a> (Format 2).
+</p>
+<p class="format">vcalendar::getComponent( search )</p>
+<p class="comment">
+search       = (array) ( *[ propertyName =&gt; uniqueValue ]), multiple array elements are combined by &quot;OR&quot;
+propertyName = (string) property name, above
+propertyData = (string) unique property value (strict case),
+               date format &quot;YYYYMMDD&quot; (if any side is DATE, only dates are used),
+               datetime format &quot;YYYYMMDDTHHMMSS&quot;</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+while( $comp  = $vcalendar-&gt;getComponent( array( &quot;RESOURCES&quot; =&gt; &quot;PC&quot; )) {
+.. .
+}
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_object_methods">[up]</a>
+
+<a name="newComponent"></a><h4>3.1.3.3 newComponent</h4>
+<P>
+Create component (<a href="#VEVENT">VEVENT</a> / <a href="#VTODO">VTODO</a> / <a href="#VJOURNAL">VJOURNAL</a> / <a href="#VFREEBUSY">VFREEBUSY</a> / <a href="#VTIMEZONE">VTIMEZONE</a>)
+using a iCalcreator object factory-method, returning a reference to the new component.
+</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::newComponent( componentType )</p>
+<p class="comment">componentType = (string) component type</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vevent    = &amp; $vcalendar-&gt;newComponent( &quot;vevent&quot; );
+...
+</p>
+
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_object_methods">[up]</a>
+
+<a name="selectComponents"></a><h4>3.1.3.4 selectComponents</h4>
+<p class="label">Format 1</p>
+<p>
+Selects  <a href="#VEVENT">EVENT</a> / <a href="#VTODO">VTODO</a> / <a href="#VJOURNAL">VJOURNAL</a> /
+<a href="#VFREEBUSY">VFREEBUSY</a> components from the iCalcreator object instance on based on <b>dates</b>
+(notice <a href="#date_restriction">date restriction</a>), based on the initial <a href="#DTSTART">DTSTART</a>
+property along with the <a href="#RRULE">RRULE</a>, <a href="#RDATE">RDATE</a>, <a href="#EXDATE">EXDATE</a>
+and <a href="#EXRULE">EXRULE</a> properties in the component.
+</p>
+<p>Requirement:</p>
+<ul>
+<li>The property <a href="#DTSTART">DTSTART</a> is required. If missing in a <a href="#VTODO">VTODO</a> component, <a href="#DTSTART">DUE</a> is used.<br>
+</ul>
+<p>Limitations:</p>
+<ul>
+<li>The values &quot;SECONDLY&quot; / &quot;MINUTELY&quot; / &quot;HOURLY&quot; in the &quot;FREQ&quot; rule part are NOT supported.
+<li>If using components with properties<br>
+<a href="#UID">UID</a> in combination with <a href="#SEQUENCE">SEQUENCE</a> and <a href="#RECURRENCE-ID">RECURRENCE-ID</a><br>
+(i.e. an individual instance within the recurrence set),<br>
+the <a href="#RECURRENCE-ID">RECURRENCE-ID</a> parameter &quot;RANGE&quot; (&quot;THISANDPRIOR&quot; / &quot;THISANDFUTURE&quot;) is NOT supported.<br>
+</ul>
+<p>FALSE is returned if no selected component exists.</p>
+<p class="format">vcalendar::selectComponents([ startYear, startMonth, startDay
+                [, endYear,   endMonth,   endDay
+                [, cType [, flat [, any [, split]]]]]])
+</p>
+<p>
+Returns an array with components (events.. .).
+For all recurrent instances of a <strong>calendar</strong> component, an x-property,
+&quot;X-CURRENT-DTSTART&quot; and opt. also &quot;X-CURRENT-DTEND&quot; alt. &quot;X-CURRENT-DUE&quot;,
+has been created with a TEXT content, &quot;Y-m-d&nbsp;[H:i:s][timezone/UTC&nbsp;offset]&quot;
+showing the current start and opt. also end alt. due date.<br>
+Also a &quot;X-RECURRENCE&quot; x-property is set with order number (valid if selectComponents is called from DTSTART date).
+</p>
+<p class="comment">startYear  : (int) start year  (4*digit),   default current year
+startMonth : (int) start month (1-2*digit), default current month
+startDay   : (int) start day   (1-2*digit), default current day
+endYear    : (int) end year    (4*digit),   default startYear
+endMonth   : (int) end month   (1-2*digit), default startMonth
+endDay     : (int) end day     (1-2*digit), default startDay
+cType      : (mixed) <strong>calendar</strong> component type(-s), (string/array)
+                   (&quot;vevent&quot;, &quot;vtodo&quot;, &quot;vjournal&quot;, &quot;vfreebusy&quot;)
+             (bool) FALSE (default) =&gt; all
+flat       : (bool) TRUE =&gt; output : array[] (ignores split)
+               component where recurrence pattern exists within period
+             FALSE (default) =&gt; output : array[Year][Month][Day][]
+any        : (bool) TRUE (default) =&gt; select components with recurrence within period
+                    FALSE =&gt; only components that starts (DTSTART) within period
+split      : (bool) TRUE (default) =&gt; one component copy for every day it occurs
+                                      within the period
+                    FALSE =&gt; one occurrence of component in output array,
+                             start date/recurrence (start) date
+
+valid         flat    any     split
+combinations                          (defaults in upper case)
+           1  FALSE   TRUE    TRUE
+           2  FALSE   TRUE    false
+           3  FALSE   false   [false] (split set to false if flat=FALSE and any=false)
+           4  true    TRUE    [false] (split set to false if flat=true)
+           5  true    false   [false] (split set to false if flat=true)
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config     = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                     &quot;directory&quot; =&gt; &quot;import&quot;,
+                     &quot;filename&quot;  =&gt; &quot;file.ics&quot; );
+$vcalendar  = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$events_arr = $vcalendar-&gt;selectComponents( 2007, 11, 1, 2007, 11, 30, &quot;vevent&quot; );
+ // <span class="comment">select all events occurring 1-30 nov. 2007</span>
+foreach( $events_arr as $year =&gt; $year_arr ) {
+  foreach( $year_arr as $month =&gt; $month_arr ) {
+    foreach( $month_arr as $day =&gt; $day_arr ) {
+      foreach( $day_arr as $event ) {
+        $currddate   = $event-&gt;getProperty( &quot;x-current-dtstart&quot; );
+        <span class="comment">// if member of a recurrence set, returns
+       // array(&quot; x-current-dtstart&quot;,
+       // &lt;(string) date(&quot;Y-m-d&nbsp;[H:i:s][timezone/UTC&nbsp;offset]&quot;)&gt;)</span>
+        $startDate   = $event-&gt;getProperty( &quot;dtstart&quot; );
+        $summary     = $event-&gt;getProperty( &quot;summary&quot; );
+        $description = $event-&gt;getProperty( &quot;description&quot; );
+        .. .
+        .. .
+</p>
+<a name="selectComponents2"></a>
+<p class="label">format 2</p>
+<p>
+Using this format, the iCalcreator object method selects components based on specific property value(-s).
+</p>
+<dl>
+<dt>Supported Descriptive Component Properties
+<dd><a href="#CATEGORIES">CATEGORIES</a>
+<dd><a href="#LOCATION">LOCATION</a>
+<dd><a href="#PRIORITY">PRIORITY</a>
+<dd><a href="#RESOURCES">RESOURCES</a>
+<dd><a href="#STATUS">STATUS</a>
+<dd><a href="#SUMMARY">SUMMARY</a>
+<dt>Supported Relationship Component Properties
+<dd><a href="#ATTENDEE">ATTENDEE</a>&nbsp;<sup>*1</sup>
+<dd><a href="#CONTACT">CONTACT</a>
+<dd><a href="#ORGANIZER">ORGANIZER</a>&nbsp;<sup>*1</sup>
+<dd><a href="#RELATED-TO">RELATED-TO</a>
+<dd><a href="#URL">URL</a>
+<dd><a href="#UID">UID</a>
+</dl>
+<dl>
+<dt><sup>*1</sup>
+<dd><a href="#ATTENDEE">ATTENDEE</a> and
+<a href="#ORGANIZER">ORGANIZER</a> search values must be prefixed by (upper case) protocol like &quot;MAILTO:chair@ical.net&quot;.
+</dl>
+<p>
+For the property <a href="#SUMMARY">SUMMARY</a>, if a search value (any case) exists within property value, a hit is found.
+For the other properties an exact (strict case) match is required. Multiple search properties may coexist.
+</p>
+<p>
+To retrieve specific iCalcreator instance property values, searching <b>ALL</b> components,
+use <a href="#getProperty2">getProperty</a> (Format 2).
+</p>
+<p>
+To get components based on property values, use <a href="#getComponent5">getComponent</a> (Format 5).
+</p>
+<p class="format">vcalendar::selectComponents( searchArray )</p>
+<p>Outputs an array of matched (unique) components in <a href="#UID">UID</a> order.</p>
+<p class="comment">searchArray   : (array) *( propertyName =&gt; propertyValue )
+propertyName  : (string) above (any case)
+propertyValue : (string) value / (array) ( *[ (string) value] )
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config        = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                        &quot;directory&quot; =&gt; &quot;import&quot;,
+                        &quot;filename&quot;  =&gt; &quot;file.ics&quot; );
+$vcalendar     = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$searchArray   = array( &quot;PRIORITY&quot; =&gt; array( 1, 2, 3, 4 ));
+$highPrioArr   = $vcalendar-&gt;selectComponents( $searchArray );
+ // <span class="comment">select all components with PRIORITY set to high (1-4)</span>
+if( !empty( $highPrioArr )) {
+  $highPrioCal = new vcalendar( array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot; ));
+  $highPrioCal-&gt;setProperty( "X-WR-CALDESC", "High priority events" );
+  foreach( $highPrioArr as $highPrioComponent )
+    $highPrioCal-&gt;setComponent( $highPrioComponent );
+  $highPrioCal-&gt;returnCalendar();
+}
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_object_methods">[up]</a>
+
+<a name="setComponent"></a><h4>3.1.3.5 setComponent</h4>
+<p>
+Replace or update component in the iCalcreator object instance.
+Also add a <strong>calendar</strong> component to the iCalcreator object instance
+when <strong>calendar</strong> component is created with the procedural (<b>non</b>-factory) method,
+see example <a href="#vevent_constr">VEVENT</a>, format 2.
+</p>
+<p>A successful update returns TRUE.</p>
+<p class="label">format 1</p>
+<p>Insert last in component chain.</p>
+<p class="format">vcalendar::setComponent( component )
+addComponent( component ) // <span class="comment">alias</span></p>
+<p class="comment">component = (object) iCalcreator component instance</p>
+<p class="comment">addComponent, may be removed in future versions.</p>
+<p class="label">format 2</p>
+<p>
+Insert/replace component with order number (1st=1, 2nd=2.. .).
+If replace and orderNumber is not found, component is inserted last in chain.
+</p>
+<p class="format">vcalendar::setComponent( component, orderNumber )</p>
+<p class="comment">component = (object) iCalcreator component instance
+int       = (int) order numder</p>
+<p class="label">format 3</p>
+<p>
+Replace component with component type and 1st alt. component order number.
+If orderNumber is not found, component is inserted last in chain.
+</p>
+<p class="format">vcalendar::setComponent( component, componentType [, componentSuborderNo])</p>
+<p class="comment">component           = (object) iCalcreator component instance
+componentType       = (string) component type
+componentSuborderNo = (int) component Suborder Number</p>
+<p class="label">format 4</p>
+<p>
+Replace component with <a href="#UID">UID</a>.
+N.B <a href="#UID">UID</a> is NOT set for <a href="#VALARM">ALARM</a> / <a href="#VTIMEZONE">TIMEZONE</a> components.
+If <a href="#UID">UID</a> is not found, component is inserted last in chain.
+</p>
+<p class="format">vcalendar::setComponent( component, <a href="#UID">UID</a> )</p>
+<p class="comment">component = (object) iCalcreator component instance</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;filename&quot; =&gt; &quot;file.ics&quot;);
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$vevent    = vcalendar-&gt;getComponent( 1 ); // <span class="comment">fetch first EVENT</span>
+$vevent-&gt;setProperty( &quot;dtstart, 2006, 12, 24, 19, 30, 00 );
+                                           // <span class="comment">update <a class="ref" href="#DTSTART">DTSTART</a> property</span>
+$vcalendar-&gt;setComponent( $vevent, 1 );    // <span class="comment">replace first component</span>
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_object_methods">[up]</a>
+
+<a name="iCalcreator_inputoutput_methods"></a><h3>3.1.4 iCalcreator input/output methods</h3>
+
+<a name="parse_merge"></a><h4>3.1.4.1 parse and merge</h4>
+<p>
+Parse iCal file(-s) or string/array <strong>calendar</strong> content into a single iCalcreator object instance (components, properties and parameters),
+including multiple vcalendars (within a single ICS file) parse, e.g. Oracle Calendar exports.
+</p>
+<p>
+As long as php.ini directive &quot;allow_url_fopen&quot; is enabled, remote files, URLs; protocol &quot;http&quot; (&quot;webcal&quot;), are supported.
+ A remote file, URL, <b>must</b> be prefixed by &quot;http://&quot; (&quot;webcal://&quot;) and suffixed by a valid filename.!
+ Recommendation is to download (cache) remote file before parsing, due to execution time and control.
+</p>
+<p>
+If missing, component property <a href="#UID">UID</a> is created when parsing.
+ For that reason <a href="#Unique_id">UNIQUE_ID</a> might need to be set before parsing, Se examples below.
+</p>
+<p>
+Notice <a href="#date_restriction">date restriction</a>!
+</p>
+<p>
+If major parse error occurs (like file access error, invalid <strong>calendar</strong> file or <strong>calendar</strong> file without components), FALSE is returned.
+</p>
+<p>
+Minor errors like non-standard line-endings, initial and trailing empty lines
+ as well as files without proper end line(-s) (i.e. missing component end and/or &quot;END:CALENDAR&quot; iCal directives)
+ are managed.
+</p>
+<p>
+Non-standard iCal properties (except the <a href="#X-PROPERTY_PROP">X-properties</a>) are ignored.
+</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::parse( [ textToParse ] )</p>
+<p class="comment">textToParse = (string) calendarContent
+                       ex. result from - file_get_contents( &quot;filename&quot;)
+              (array)  calendarContent
+                       ex. result from - file( &quot;filename&quot;, FILE_IGNORE_NEW_LINES )</p>
+<p class="label">parse example 1</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;filename&quot;  =&gt; &quot;file.ics&quot; );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+.. .
+</p>
+<p class="label">parse example 2</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;url&quot;       =&gt; &quot;http://www.ical.net/calendars/calendar.ics&quot; );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+.. .
+</p>
+<p class="label">parse example 3</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;url&quot;       =&gt; &quot;http://www.ical.net/calendars/calendar.ics&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$str       = array(
+&quot;BEGIN:VCALENDAR&quot;,
+&quot;PRODID:-//kigkonsult.se//NONSGML kigkonsult.se iCalcreator 2.16.6//&quot;,
+&quot;VERSION:2.0&quot;,
+&quot;BEGIN:VEVENT&quot;,
+&quot;DTSTART:20101224T190000Z&quot;,
+&quot;DTEND:20101224T200000Z&quot;,
+&quot;DTSTAMP:20101020T103827Z&quot;,
+&quot;UID:20101020T113827-1234GkdhFR@test.org&quot;,
+&quot;DESCRIPTION:example&quot;,
+&quot;END:VEVENT&quot;,
+&quot;END:VCALENDAR&quot;);
+$vcalendar-&gt;parse( $str );
+...
+</p>
+<p class="label">merge example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;directory&quot; =&gt; &quot;import&quot; );
+$vcalendar = new vcalendar( $config );
+
+$vcalendar-&gt;setConfig( &quot;filename&quot;,&nbsp;&nbsp;&quot;file1.ics&quot; );
+$vcalendar-&gt;parse();
+
+$vcalendar-&gt;setConfig( &quot;filename&quot;,&nbsp;&nbsp;&quot;file2.ics&quot; );
+$vcalendar-&gt;parse();
+
+$vcalendar-&gt;setConfig( &quot;directory&quot;,&nbsp;&quot;export&quot; );
+$vcalendar-&gt;setConfig( &quot;filename&quot;,&nbsp;&nbsp;&quot;icalmerge.ics&quot; );
+$vcalendar-&gt;saveCalendar();
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_inputoutput_methods">[up]</a>
+
+<a name="createCalendar"></a><h4>3.1.4.2 createCalendar</h4>
+Generate and return <strong>calendar</strong> in a string, testing.. .?
+<p class="label">Format</p>
+<p class="format">vcalendar::createCalendar()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $vcalendar-&gt;createCalendar();
+echo $str;
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_inputoutput_methods">[up]</a>
+
+<a name="returnCalendar"></a><h4>3.1.4.3 returnCalendar</h4>
+<p>
+Redirect the iCalcreator object instance content to user browser. Filename, addressed to browser, is automatically generated if missing or not set;<br>
+<span class="format">$filename = date( &quot;YmdHis&quot; ).&quot;.ics&quot; </span>.
+</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::returnCalendar( [ utf8Encode [, gzip ]] )</p>
+<p class="comment">utf8Encode = (bool) TRUE:  utf8 encoded output, FALSE: (default) no encoding
+gzip       = (bool) TRUE:  gzip compressed output
+                           Header &quot;Content-Length&quot; only sent when gzip=TRUE
+                    FALSE: (default) no compressing</p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+.. .
+$vevent    = &amp; $vcalendar-&gt;newComponent( &quot;vevent&quot; );
+$vevent-&gt;setProperty( &quot;dtstart&quot;, array( &quot;year&quot;  =&gt; 2007
+                                      , &quot;month&quot; =&gt; 4
+                                      , &quot;day&quot;   =&gt; 1
+                                      , &quot;hour&quot;  =&gt; 19 ));
+$vevent-&gt;setProperty( &quot;duration&quot;, 0, 0, 3 ));
+$vevent-&gt;setProperty( &quot;LOCATION&quot;, &quot;Central Plaza&quot; );
+$vevent-&gt;setProperty( &quot;summary&quot;, &quot;PHP summit&quot; );
+.. .
+$vcalendar-&gt;returnCalendar();
+.. .
+</p>
+<p class="label">Example 2</p>
+<p class="example">&lt;?php
+.. .
+$config     = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                     &quot;directory&quot; =&gt; &quot;import&quot;,
+                     &quot;filename&quot;  =&gt; &quot;file.ics&quot; );
+$vcalendar  = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$utf8Encode = TRUE;
+if( isset( $_SERVER[&quot;HTTP_ACCEPT_ENCODING&quot;] ) &amp;&amp;
+  ( FALSE !== strpos( strtolower( $_SERVER[&quot;HTTP_ACCEPT_ENCODING&quot;] ), &quot;gzip&quot; )))
+  $gzip     = TRUE;
+else
+  $gzip     = FALSE;
+$vcalendar-&gt;returnCalendar( $utf8Encode, $gzip );
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_inputoutput_methods">[up]</a>
+
+<a name="saveCalendar"></a><h4>3.1.4.4 saveCalendar</h4>
+<p>
+Save the iCalcreator object instance in a file, uses present directory if directory not set, filename is automatically generated if missing or not set;<br>
+<span class="format">$filename = date( &quot;YmdHis&quot; ).&quot;.ics&quot; </span>.
+</p>
+<p>Directory/filename <b>must</b> be writeable, delimiter default <em>PHP</em> constant DIRECTORY_SEPARATOR.</p>
+<p>If file error occurs, FALSE is returned.</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::saveCalendar ( [ directory [, filename [, delimiter ]]] )</p>
+<p class="comment">directory = (string) directory, default FALSE
+filename  = (string  file name, default FALSE
+delimiter = (string) path directory/filename separator, default FALSE</p>
+Parameters for <span class="format">directory/filename/delimiter</span>, kept for backward compatibility,
+may be removed i future versions. Recommendation is to use <span class="format">setConfig</span>, Se
+example below.
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vcalendar-&gt;setConfig( array( &quot;directory&quot; =&gt; &quot;depot&quot;,
+                              &quot;filename&quot;  =&gt; &quot;calendar.ics&quot; ));
+$result = $vcalendar-&gt;saveCalendar();
+if( !$result )
+&nbsp;&nbsp;echo &quot;error when saving.. .&quot;
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_inputoutput_methods">[up]</a>
+
+<a name="sort"></a><h4>3.1.4.5 sort</h4>
+<p class="label">Format 1</p>
+<p>
+Sort created/parsed <strong>calendar</strong> components on the following (prioritized) keys:<br>
+1 - X-CURRENT-DTSTART - X-CURRENT-DTEND/X-CURRENT-DUE<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(if created in iCalcreator object method <a href="#selectComponents">selectComponents</a>)<br>
+1 - <a href="#DTSTART">DTSTART</a> - <a href="#DTEND">DTEND</a> alt. <a href="#DURATION">DURATION</a> (<a href="#VEVENT">VEVENT</a> and <a href="#VFREEBUSY">VFREEBUSY</a> components)<br>
+1 - <a href="#DTSTART">DTSTART</a> - <a href="#DUE">DUE</a> alt. <a href="#DURATION">DURATION</a> (<a href="#VTODO">VTODO</a> components)<br>
+1 - <a href="#DTSTART">DTSTART</a> (<a href="#VJOURNAL">VJOURNAL</a> components)<br>
+2 - <a href="#CREATED">CREATED</a> / <a href="#DTSTAMP">DTSTAMP</a><br>
+3 - <a href="#UID">UID</a><br>
+A date value, like &quot;DTSTART;VALUE=DATE:20120717&quot;, are sorted before a datetime value.<br>
+<a href="#VTIMEZONE">VTIMEZONE</a> component(-s) is always placed first (ordered by <a href="#TZID">TZID</a>). The
+<a href="#VTIMEZONE">STANDARD</a>&nbsp;/&nbsp;<a href="#VTIMEZONE">DAYLIGHT</a>&nbsp; sub-components are sorted (on asc. key <a href="#DTSTART">DTSTART</a>) when calling
+<a href="#createCalendar">createCalendar</a> (or <a href="#returnCalender">returnCalender</a>).
+<br>
+<a href="#VALARM">ALARM</a> sub-components, if exists, are not sorted.
+
+</p>
+<p class="format">vcalendar::sort()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;directory&quot; =&gt; &quot;import&quot;,
+                    &quot;filename&quot;  =&gt; &quot;file.ics&quot; );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$vcalendar-&gt;returnCalendar();
+...
+</p>
+
+<p class="label">Format 2</p>
+<p>
+Sort created/parsed <strong>calendar</strong> components based on specific property values and ascending order.
+ If a property is not set in component, an empty sort key is used (i.e. sorted first).
+</p>
+<p class="format">vcalendar::sort( sortArgument )</p>
+<p class="comment">sortArgument: (string) &quot;<a href="#ATTENDEE">ATTENDEE</a>&quot; <sup>*</sup> / &quot;<a href="#CATEGORIES">CATEGORIES</a>&quot; <sup>*</sup> / &quot;<a href="#CONTACT">CONTACT</a>&quot; <sup>*</sup> / &quot;<a href="#DTSTAMP">DTSTAMP</a>&quot; /
+                       &quot;<a href="#LOCATION">LOCATION"</a>&quot; / &quot;<a href="#ORGANIZER">ORGANIZER</a>&quot; / &quot;<a href="#PRIORITY">PRIORITY</a>&quot; /
+                       &quot;<a href="#RESOURCES">RESOURCES</a>&quot; <sup>*</sup> / &quot;<a href="#STATUS">STATUS</a>&quot; / &quot;<a href="#SUMMARY">SUMMARY</a>&quot; / &quot;<a href="#URL">URL</a>&quot; / &quot;<a href="#UID">UID</a>&quot; <sup>**</sup>.
+<p class="comment"><sup>*) </sup> For a property where multiple occurrence may exist (<a href="#ATTENDEE">ATTENDEE</a>, <a href="#CATEGORIES">CATEGORIES</a>, <a href="#CONTACT">CONTACT</a>, <a href="#RESOURCES">RESOURCES</a>) lowest (alphabetic) value is used as sort key.</p>
+<p class="comment"><sup>**)</sup> For multiple components with the same <a href="#UID">UID</a>, components with <a href="#RECURRENCE-ID">RECURRENCE-ID</a> / <a href="#SEQUENCE">SEQUENCE</a> set are sorted first (on asc. values).</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_inputoutput_methods">[up]</a>
+
+<a name="useCachedCalendar"></a><h4>3.1.4.6 useCachedCalendar</h4>
+<p>
+If recent version of local (non-empty and saved) <strong>calendar</strong> file exists, an HTTP redirect header is sent otherwise FALSE is returned.
+</p>
+<p class="label">Format</p>
+<p class="format">vcalendar::useCachedCalendar( [ timeout ] )</p>
+<p class="format">vcalendar::useCachedCalendar( [ directory [, filename [, delimiter [, timeout ]]]] )</p>
+<p class="comment">directory = (string) directory, default FALSE
+filename  = (string  file name, default FALSE
+delimiter = (string) path directory/filename separator, default FALSE
+timeout   = (int) default 3600 sec
+Second format with parameters for <span class="format">directory/filename/delimiter</span>,<br>kept for backward compatibility, may be removed i future<br>versions. Recommendation is to use <span class="format">setConfig</span>, Se example below.</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vcalendar-&gt;setConfig( &quot;directory&quot;, &quot;depot&quot; );
+$vcalendar-&gt;setConfig( &quot;filename&quot;, &quot;calendar.ics&quot; );
+$vcalendar-&gt;useCachedCalendar();
+...
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_inputoutput_methods">[up]</a>
+
+<a name="iCalcreator_configuration_methods"></a><h3>3.1.5 iCalcreator configuration methods</h3>
+
+<a name="configKeys"></a><h4>3.1.5.1 configuration keys</h4>
+<p>All configuration keys (allowEmpty, compsInfo etc.) case independent.</p>
+<table>
+<tr>
+<td class="bl bb">key</td>
+<td class="bl bb"><strong>calendar</strong></td>
+<td class="bl bb">component</td>
+<td class="bl bb">remark</td>
+</tr>
+<tr>
+<td class="bl bb"><a class="ref" href="#allowEmpty">allowEmpty</a></td>
+<td class="bl bb center">*</td>
+<td class="bl bb center">*</td>
+<td class="bl bb ref">&nbsp;</td>
+</tr>
+<tr>
+<td class="bl bb"><a class="ref" href="#Compsinfo">Compsinfo</a></td>
+<td class="bl bb center">*</td>
+<td class="bl bb center">*</td>
+<td class="bl bb ref">getConfig only</td>
+</tr>
+<tr>
+<td class="bl bb"><a class="ref" href="#Delimiter">Delimiter</a></td>
+<td class="bl bb center">*</td>
+<td class="bl bb">&nbsp;</td>
+<td class="bl bb ref">&nbsp;</td>
+</tr>
+<tr>
+<td class="bl bb"><a class="ref" href="#Directory">Directory</a></td>
+<td class="bl bb center">*</td>
+<td class="bl bb">&nbsp;</td>
+<td class="bl bb ref">&nbsp;</td>
+</tr>
+<tr>
+<td class="bl bb"><a class="ref" href="#Filename">Filename</a></td>
+<td class="bl bb center">*</td>
+<td class="bl bb">&nbsp;</td>
+<td class="bl bb ref">&nbsp;</td>
+</tr>
+<tr>
+<td class="bl bb"><a class="ref" href="#Dirfile">Dirfile</a></td>
+<td class="bl bb center">*</td>
+<td class="bl bb">&nbsp;</td>
+<td class="bl bb ref">getConfig only</td>
+</tr>
+<tr>
+<td class="bl bb"><a class="ref" href="#Filesize">Filesize</a></td>
+<td class="bl bb center">*</td>
+<td class="bl bb">&nbsp;</td>
+<td class="bl bb ref">getConfig only</td>
+</tr>
+<tr>
+<td class="bl bb"><a class="ref" href="#Format">Format</a></td>
+<td class="bl bb center">*</td>
+<td class="bl bb">&nbsp;</td>
+<td class="bl bb ref">&nbsp;</td>
+</tr>
+<tr>
+<td class="bl bb"><a class="ref" href="#Language">Language</a></td>
+<td class="bl bb center">*</td>
+<td class="bl bb center">*</td>
+<td class="bl bb ref">&nbsp;</td>
+</tr>
+<tr>
+<td class="bl bb"><a class="ref" href="#NewlineChar">NewlineChar</a></td>
+<td class="bl bb center">*</td>
+<td class="bl bb center">*</td>
+<td class="bl bb ref">&nbsp;</td>
+</tr>
+<tr>
+<td class="bl bb"><a class="ref" href="#setPropertyNames">setPropertyNames</a></td>
+<td class="bl bb center">&nbsp;</td>
+<td class="bl bb center">*</td>
+<td class="bl bb ref">getConfig only</td>
+</tr>
+<tr>
+<td class="bl bb"><a class="ref" href="#dTZID">TZID</a></td>
+<td class="bl bb center">*</td>
+<td class="bl bb center">*</td>
+<td class="bl bb ref">&nbsp;</td>
+</tr>
+<tr>
+<td class="bl bb"><a class="ref" href="#Unique_id">Unique_id</a></td>
+<td class="bl bb center">*</td>
+<td class="bl bb center">*</td>
+<td class="bl bb ref">&nbsp;</td>
+</tr>
+<tr>
+<td class="bl bb"><a class="ref" href="#configURL">URL</a></td>
+<td class="bl bb center">*</td>
+<td class="bl bb">&nbsp;</td>
+<td class="bl bb ref">&nbsp;</td>
+</tr>
+</table>
+<br>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="getConfig"></a><h4>3.1.5.2 getConfig</h4>
+<p class="format">vcalendar::getConfig( [ key ] )</p>
+<p class="comment">key = (string) config key</p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$filename = $vcalendar-&gt;getConfig( &quot;filename&quot; );
+.. .
+</p>
+In this example, notice <a href="#Filename">Filename</a>
+<br>
+<p class="label">Example 2</p>
+<p class="example">&lt;?php
+.. .
+$config = $vcalendar-&gt;getConfig();
+.. .
+</p>
+<p class="comment">Output= array( string key =&gt; mixed value
+           *[, string key =&gt; mixed value] )</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="initConfig"></a><h4>3.1.5.3 calendar/component initialization</h4>
+<p class="label">Format</p>
+<p>Create a new iCalcreator object instance.</p>
+<p class="format">vcalendar::vcalendar( [ config ] )</p>
+<p class="comment">config = (array) ( *[, key =&gt; value] )
+key    = (string) config key
+value  = (mixed) config value</p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;directory&quot; =&gt; &quot;import&quot;,
+                    &quot;filename&quot;  =&gt; &quot;file.ics&quot; );
+$vcalendar = new vcalendar( $config );
+.. .
+</p>
+<p>Create a new <strong>calendar</strong> component.</p>
+<p class="format">vcalendar::component( [ config ] )</p>
+<p class="comment">config = (array) ( key =&gt; value *[, key =&gt; value] )
+key    = (string) config key
+value  = (mixed) config value</p>
+<p class="label">Example 2</p>
+<p class="example">&lt;?php
+.. .
+$config = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot; );
+$vevent = new vevent( $config );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p class="example">&lt;?php
+.. .
+$config = $vcalendar-&gt;getConfig();
+$vevent = new vevent( $config );
+.. .
+</p>
+<p>Only component relevant configuration are set. If using the <a href="#newComponent">newComponent</a> function, configuration is set automatically.</p>
+<br>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="setConfig"></a><h4>3.1.5.4 setConfig</h4>
+<p>A successful &quot;setConfig&quot; returns TRUE.</p>
+<p class="label">Format 1</p>
+<p class="format">vcalendar::setConfig( [ config ] )</p>
+<p class="comment">config = (array) ( key =&gt; value *[, key =&gt; value] )
+key    = (string) config key
+value  = (mixed) config value</p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;directory&quot; =&gt; &quot;import&quot;,
+                    &quot;filename&quot;  =&gt; &quot;file.ics&quot; );
+$vcalendar = new vcalendar();
+$vcalendar-&gt;setConfig( $config );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p class="example">&lt;?php
+.. .
+$config = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot; );
+$vevent = new vevent();
+$vevent-&gt;setConfig( $config );
+.. .
+</p>
+<p class="label">Format 2</p>
+<p class="format">vcalendar::setConfig( key, value )</p>
+<p class="comment">key    = (string) config key
+value  = (mixed) config value</p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$vcalendar = new vcalendar();
+$vcalendar-&gt;setConfig( &quot;directory&quot;, &quot;depot&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p class="example">&lt;?php
+.. .
+$vevent = new vevent();
+$vevent-&gt;setConfig( &quot;unique_id&quot;, &quot;kigkonsult.se&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="allowEmpty"></a><h4>3.1.5.5 Allow empty components</h4>
+<p>
+Allow or reject empty <strong>calendar</strong> properties. Used in <a href="#createCalendar">createCalendar</a>, <a href="#returnCalender">returnCalender</a> or
+create&lt;Property&gt; methods, creating [RFC5545] formats.
+</p>
+<p>
+Default TRUE (allow).
+</p>
+
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="Compsinfo"></a><h4>3.1.5.6 Component information</h4>
+<p>Only to use with iCalcreator object method getConfig.</p>
+<p>
+Get information about the iCalcreator object instance components. Returns array with basic information
+about all components (in array format) within the iCalcreator object instance.
+</p>
+<p class="comment">Output   = array ( *compinfo )
+compinfo = array ( &quot;ordno&quot; =&gt; int ordno,
+                   // <span class="commsnt">order number (1st=1, 2nd=2..)</span>
+                 , &quot;type&quot;  =&gt; string type
+                   // <span class="comment">component type (vevent, vtodo.. .</span>
+                 , &quot;uid&quot;   =&gt; string uid
+                   // <span class="comment">component <a href="#UID">UID</a> (not for <a href="#VALARM">ALARM</a> / <a href="#VTIMEZONE">TIMEZONE</a>)</span>
+                 , &quot;props&quot; =&gt;
+                     array( *[ propertyName =&gt; Property count ])
+                   // <span class="comment">for every set property</span>
+                 , &quot;sub&quot;   =&gt; array( *compinfo ))
+                   // <span class="comment">if subcomponents exists, an array for each subcomponent</span></p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;directory&quot; =&gt; &quot;import&quot;,
+                    &quot;filename&quot;  =&gt; &quot;file.ics&quot; );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$compsinfo = $vcalendar-&gt;getConfig( &quot;compsinfo&quot; );
+foreach( $compsinfo as compinfo) {
+&nbsp;&nbsp;echo &quot; order number : &quot;.$compinfo[&quot;ordno&quot;].&quot;&lt;br&nbsp;/&gt;&quot;;
+&nbsp;&nbsp;echo &quot; type : &quot;.$compinfo[&quot;type&quot;].&quot;&lt;br&nbsp;/&gt;&quot;;
+&nbsp;&nbsp;echo &quot; UID : &quot;.$compinfo[&quot;uid&quot;].&quot;&lt;br&nbsp;/&gt;&quot;;
+&nbsp;&nbsp;foreach( $compinfo[&quot;props&quot;] as $propertyName =&gt; $propertyCount )
+&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;  $propertyName = $propertyCount&quot;;
+&nbsp;&nbsp;if( is_array( $compinfo[&quot;sub&quot;] )) {
+&nbsp;&nbsp;&nbsp;&nbsp;foreach( $compinfo[&quot;sub&quot;] as $subcompinfo ) {
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot; order number : &quot;.$subcompinfo[&quot;ordno&quot;].&quot;&lt;br&nbsp;/&gt;&quot;;
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* .. dito if subcomponents exists .. . */
+&nbsp;&nbsp;&nbsp;&nbsp;}
+&nbsp;&nbsp;}
+}
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="Delimiter"></a><h4>3.1.5.7 Delimiter</h4>
+<p>Directory/filename delimiter.</p>
+<p>
+Default <em>PHP</em> constant DIRECTORY_SEPARATOR. If used, <b>must</b> be set BEFORE filename!
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="Directory"></a><h4>3.1.5.8 Directory</h4>
+<p>
+Local directory to store/read iCal files.
+</p>
+<p>
+Default &quot;<b>.</b>&quot;.
+</p>
+<p>
+Directory <b>must</b> be set BEFORE <a href="#Filename">filename</a> and <b>must</b> exist and be writeable otherwise FALSE is returned.
+If set using an config array and together with <a name="Filename"><u>Filename</u></a>, Directory are set automatically first.
+When setting Directory, any previously set <a href="#configURL">URL</a> is removed.
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="Fileinfo"></a><h4>3.1.5.9 Fileinfo</h4>
+<p>
+Only available in iCalcreator object method getConfig, giving information in array format about <a href="#Directory">directory</a>,
+<a href="#Filename">filename</a> and <a href="#Filesize">filesize</a>.
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$fileinfo = $vcalendar-&gt;getConfig( &quot;fileinfo&quot; );
+.. .
+</p>
+<p class="comment">output = array( &lt;directory&gt;, &lt;filename&gt;, &lt;filesize&gt; )</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="Filename"></a><h4>3.1.5.10 Filename</h4>
+<p>iCal local file name, default created like (if not set):</p>
+<p class="format">$filename = date( &quot;YmdHis&quot; ).&quot;.ics&quot;;</p>
+<p class="format">$filename = date( &quot;YmdHis&quot; ).&quot;.xml&quot;; <span class="comment"> // if <a href="#Format">format</a> set to &quot;xcal&quot;</span></p>
+<p>
+If not set, filename is created when requested, ex. in iCalcreator object methods <a href="#saveCalendar">saveCalendar</a> or getConfig(&quot;filename&quot;).
+</p>
+<p>
+Local filename <b>must</b> be set AFTER setting directory (and opt. delimiter)!
+Filename (and opt. directory) <b>must</b> be readable/writeable otherwise FALSE is returned.
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="Filesize"></a><h4>3.1.5.11 Filesize</h4>
+<p>
+Only when getting configuration (using iCalcreator object method getConfig).<br>
+Returns the size of the file in bytes, to be called<br>
+- after &quot;saveCalendar()&quot;<br>
+or<br>
+- after a &quot;setConfig( &quot;directory&quot; / &quot;filename&quot; )&quot; and before/after &quot;parse()&quot;.<br>
+Getting the filesize for a remote file (URL) will always return zero.
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="Format"></a><h4>3.1.5.12 Format</h4>
+<p>Format for the iCalcreator object instance output, &quot;iCal&quot;/&quot;xCal&quot;, any case.</p>
+<p>
+&quot;iCal&quot; is default ([RFC5545]), &quot;xCal&quot; force xml formatted output, according to<br>
+&quot;draft-ietf-calsch-many-xcal-01.txt&quot; (now obsolete).
+</p>
+<p>
+For converting to and from XML, according to rfc6321, &quot;xCal: The XML Format for <strong>iCalendar</strong>&quot;,use functions<br>
+- <a href="#iCal2XML">iCal2XML</a> converts an iCalcreator object instance to XML<br>
+- <a href="#XML2iCal">XML2iCal</a> converts XML (string/file) to an iCalcreator object instance.
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="Language"></a><h4>3.1.5.13 Language</h4>
+<p>
+Language for the iCalcreator object instance and component TEXT value properties as defined in [RFC5646].
+</p>
+<p>
+Default empty.
+</p>
+<p>
+If NOT set in TEXT property parameters, language from component instance &quot;setConfig( &quot;language&quot;, ..)&quot; method will be used, if set,
+otherwise language from <strong>calendar</strong> method &quot;setConfig( &quot;language&quot;, ..)&quot; will be used, if set.
+</p>
+<p>
+The <strong>calendar</strong> property PRODID is always recreated when setting (<strong>calendar</strong>) language
+ (, note <a href="#Unique_id">Unique_id</a>, below).
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="NewlineChar"></a><h4>3.1.5.14 NewlineChar</h4>
+<p>
+Character(s) used for carriage return + line feed (CR+LF).
+</p>
+<p>
+Default &quot;\r\n&quot; as defined in [RFC5545].
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="setPropertyNames"></a><h4>3.1.5.15 setPropertyNames</h4>
+<p>
+Returns array of property names for all set properties in component. &quot;X-PROP&quot; will be used when <a href="#X-PROPERTY_PROP">X-properties</a> are set.
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="dTZID"></a><h4>3.1.5.16 TZID</h4>
+<p>
+General timezone, will be used if no TZID parameter is supplied when setting <a href="#DTSTART">DTSTART</a>,
+<a href="#DTEND">DTEND</a>, <a href="#DUE">DUE</a> or <a href="#RECURRENCE-ID">RECURRENCE-ID</a>, a TZID <b>auto completion</b>.
+</p>
+<p>
+Default empty.
+</p>
+<p>
+Note, some <strong>calendar</strong> software may also require calendar property <a href="#Additional_Descriptors">X-WR-TIMEZONE</a>
+and vtimezone component property <a href="#Additional_Descriptors">X-LIC-LOCATION</a>
+(to be set manually, examine also the <a href="#createTimezone">createTimezone</a> function).
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="Unique_id"></a><h4>3.1.5.17 Unique_id</h4>
+<p>
+&quot;Unique_id&quot; is used in <strong>calendar</strong> property PRODID and component property <a href="#UID">UID</a>,
+both created automatically (, if not setting <a href="#UID">UID</a> manually.
+</p>
+<p class="quotes">PRODID
+The identifier is RECOMMENDED to be the identical syntax to the [RFC 822] addr-spec.
+A good method to assure uniqueness is to put the domain name or a domain literal IP address of the host on which.. .
+</p>
+<p>
+Default <b>AUTOMATICALLY</b> generated by using <em>PHP</em> function gethostbyname( $_SERVER[&quot;SERVER_NAME&quot;] )
+when running in a web server environment or &quot;localhost&quot; when using command line interface.
+Used when setting other (domain) name than server name.
+</p>
+<p>
+The <strong>calendar</strong> property PRODID is always recreated when setting unique_id.
+</p>
+<p>
+If missing, the component property <a href="#UID">UID</a> is created at first use of iCalcreator object methods <a href="#createCalendar">createCalendar</a>, <a href="#returnCalendar">returnCalendar</a> or <a href="#saveCalendar">saveCalendar</a>
+</p>
+<p>
+A strong recommendation is <b>always</b> to set unique_id, creating a new iCalcreator object or component instance,
+to ensure accurate creation of all components <a href="#UID">UID</a> property, also before <a href="#parse">parse</a>, in case of missing <a href="#UID">UID</a>.
+</p>
+<br>
+
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="configURL"></a><h4>3.1.5.18 URL</h4>
+<p>
+When reading remote files with URL (using the <a href="#parse">parse()</a> method),
+only protocol &quot;http&quot; (&quot;webcal&quot;) is supported,
+i.e. URL <b>must</b> be prefixed by &quot;http://&quot; (&quot;webcal://&quot;) and suffixed by a valid filename.
+</p>
+<p>
+When setting URL, any previously set Directory is removed.<br>
+The URL filename part can be retrieved by - getConfig( &quot;filename&quot; ).
+</p>
+<p>
+When storing a remote iCal file locally, only directory need to be set,
+filename remains unchanged (i.e. 1. set URL, 2. parse, 3. set directory, 4. saveCalendar).
+</p>
+<p class="label">Example</p>
+<p>Parse of remote file, then local save in &quot;depot&quot; folder, using original filename</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;url&quot;       =&gt; &quot;http://www.iCal.net/depot/calendar.ics&quot; );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$vcalendar-&gt;sort();
+.. .
+.. .
+$vcalendar-&gt;setConfig( &quot;directory&quot;, &quot;depot&quot; );
+$vcalendar-&gt;saveCalendar();
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_configuration_methods">[up]</a>
+
+<a name="Calendar_component_object_property_function_list"></a><h2>3.2 Calendar component property method list</h2>
+<p>
+All iCalcreator component object property methods for get/set data.<br>
+For property format in detail, see
+<a href="http://kigkonsult.se/downloads/dl.php?f=rfc2445" title="RFC2445" target="_blank">RFC2445</a> - Internet Calendaring and Scheduling Core Object Specification (iCalendar).
+</p>
+<a name="DATE_WITH_UTC_TIME"></a>
+<span class="label">Notice:</span> for properties and DATE-TIME with <b>UTC</b> time.
+<p class="quotes">RFC2445:
+The date with UTC time, or absolute time,
+is identified by a LATIN CAPITAL LETTER Z suffix character (US-ASCII decimal 90),
+the UTC designator, appended to the time value.
+For example, the following represents January 19, 1998, at 0700 UTC:
+</p>
+<p class="quotes">DTSTART:19980119T070000Z</p>
+<p class="quotes">The <a href="#TZID">TZID</a> property parameter MUST <b>NOT</b> be applied to DATE-TIME properties
+whose time values are specified in UTC.
+</p>
+<p>
+<a name="date_restriction"></a>
+<span class="label">Notice:</span> date limitation.<br>
+Due to a limitation in <em>PHP</em> date functions, e.g. <span class="format">mktime</span>,
+<span class="format">strtotime</span>, a date (e.g. while setting <a href="#DTSTART">DTSTART</a> property)
+before &quot;January 1 1970 00:00:00 GMT&quot; may force a <em>PHP</em> date function to generate an error or set date to &quot;January 1 1970&quot;.
+</p>
+<a name="deleteProperty_PROP"></a><h3>3.2.1 deleteProperty</h3>
+Generic iCalcreator object instance delete property method,simplifying removal of <strong>calendar</strong> properties.<br>
+FALSE is returned if no property exists or when end-of-properties at consecutive function calls.
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( [ PropName [, order ] )</p>
+<p class="comment">propName = (string) case independent, [RFC5545] component property names,
+                    unknown/missing propName will be used as <a href="#X-PROPERTY_PROP">X-property</a>.
+order    = (int)    if missing 1st/next occurrence,
+                    used with multiply (property) occurrences</p>
+<p class="label">Example</p>
+<p>Remove all COMMENT properties in first event component.</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;directory&quot; =&gt; &quot;import&quot;,
+                    &quot;filename&quot;  =&gt; &quot;file.ics&quot; );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$event     = $vcalendar-&gt;getComponent( &quot;vevent&quot; );
+while( $event-&gt;deleteProperty( &quot;comment&quot; ))
+&nbsp;&nbsp;continue;
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+<a name="getProperty_PROP"></a><h3>3.2.2 getProperty</h3>
+<a name="geoLocation_PROP"></a>
+<p>Generic iCalcreator component get property method, simplifying fetch of properties.</p>
+<p>FALSE is returned if no property exists or when end-of-properties at consecutive function calls.</p>
+<p>Using the non-standard directive &quot;GEOLOCATION&quot;, iCalcreator returns output supporting<br>
+ISO6709 &quot;Standard representation of geographic point location by coordinates&quot;,<br>
+ by combining the <a href="#LOCATION">LOCATION</a> and <a href="#GEO">GEO</a> property values
+ (only if <a href="#GEO">GEO</a> is set).
+</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::getProperty( PropName [, order [, complete ]] )</p>
+<p class="comment">propName = (string) case independent, [RFc5545] component property names,
+                    unknown/missing propName will be used as <a href="#X-PROPERTY_PROP">X-property</a>.
+order    = (int)    if missing/FALSE 1st/next occurrence,
+                    otherwise with multiply occurrences (1st=1, 2nd=2.. .)
+complete - (bool)   FALSE (default): output only property value
+                    TRUE           : output =
+                             array(&quot;value&quot; =&gt; &lt;value&gt;
+                                  ,&quot;params&quot;=&gt; &lt;parameter array&gt;)</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;directory&quot; =&gt; &quot;import&quot;,
+                    &quot;filename&quot;  =&gt; &quot;file.ics&quot; );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+while( $vevent = $vcalendar-&gt;getComponent( &quot;vevent&quot; )) {
+  $dtstart     = $vevent-&gt;getProperty( &quot;dtstart&quot; );      // <span class="comment">one occurrence</span>
+  $description = $vevent-&gt;getProperty( &quot;description&quot; );  // <span class="comment">one occurrence</span>
+  while( $comment = $vevent-&gt;getProperty( &quot;comment&quot; )) { // <span class="comment">MAY occur more than once</span>
+  .. .
+  }
+}
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+<a name="parse"></a><h3>3.2.3 parse</h3>
+<p>
+Parse iCal component property text from a string or an array.
+Each string/array row must be strict RFC5545 formatted, i.e. begin with a property name.
+</p>
+<p>
+Complete <a href="#VALARM">ALARM</a>s, all properties included, in array format and
+first array row as &quot;BEGIN:VALARM&quot;, last as &quot;END:VALARM&quot;
+as well as <a href="#VTIMEZONE">TIMEZONE</a> and standard/daylight subcomponents.
+</p>
+<p>
+If major parse error occurs (like invalid <strong>calendar</strong> structure or no <strong>calendar</strong> components), FALSE is returned.
+</p>
+<p>
+Minor errors like non-standard line-endings, initial and trailing empty lines
+ as well as files without proper end line(-s) (i.e. missing component end iCal directives)
+ are managed.
+</p>
+<p>
+Except the <a href="#X-PROPERTY_PROP">X-properties</a>, non-standard properties are ignored.
+</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::parse( propertyText )</p>
+<p class="comment">propertyText = (string) [RFC5545] formatted property,
+               (array)  [RFC5545] formatted properties,
+               property name <b>must</b> start string / rows(-s)</p>
+<p class="label">example</p>
+<p class="example">&lt;?php
+.. .
+$e = &amp; $vcalendar-&gt;newComponent( &quot;vevent&quot; );
+$e-&gt;parse( &quot;DTSTAMP:19970324T1200Z&quot; );
+$e-&gt;parse( &quot;SEQUENCE:0&quot; );
+$e-&gt;parse( &quot;ORGANIZER:MAILTO:jdoe@host1.com&quot; );
+$e-&gt;parse( array(
+&quot;ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host1.com&quot;,
+&quot;ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host2.com&quot;,
+&quot;ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host3.com&quot;,
+&quot;ATTENDEE;RSVP=TRUE:MAILTO:jsmith@host4.com&quot; ));
+$e-&gt;parse( &quot;DTSTART:19970324T123000Z&quot; );
+$e-&gt;parse( &quot;DTEND:19970324T210000Z&quot; );
+$e-&gt;parse( &quot;CATEGORIES:MEETING,PROJECT&quot; );
+$e-&gt;parse( &quot;CLASS:PUBLIC&quot; );
+$e-&gt;parse( &quot;SUMMARY:Calendaring Interoperability Planning Meeting&quot; );
+$e-&gt;parse( &quot;STATUS:DRAFT&quot; );
+$e-&gt;parse( &quot;DESCRIPTION:Project xyz Review Meeting Minutes\\n &quot;
+         . &quot;Agenda\\n &quot;
+         . &quot;1. Review of project version 1.0 requirements.\\n &quot;
+         . &quot;2. Definition of project processes.\\n &quot;
+         . &quot;3. Review of project schedule.\\n &quot;
+         . &quot;Participants: John Smith, Jane Doe, Jim Dandy\\n &quot;
+         . &quot;- It was decided that the requirements need to be signed off by \\n &quot;
+         . &quot;product marketing.\\n &quot;
+         . &quot;- Project processes were accepted.\\n &quot;
+         . &quot;- Project schedule needs to account for scheduled holidays and employee\\n &quot;
+         . &quot; vacation time. Check with HR for specific dates.\\n &quot;
+         . &quot;- New schedule will be distributed by Friday.\\n &quot;
+         . &quot;- Next weeks meeting is cancelled. No meeting until 3/23.&quot; );
+$e-&gt;parse( &quot;LOCATION:LDB Lobby&quot; );
+$e-&gt;parse( &quot;ATTACH;FMTTYPE=application/postscript:ftp://xyz.com/pub/conf/bkgrnd.ps&quot; );
+$e-&gt;parse( array( &quot;BEGIN:VALARM&quot;
+                , &quot;ACTION:AUDIO&quot;
+                , &quot;TRIGGER;VALUE=DATE-TIME:19970224T070000Z&quot;
+                , &quot;ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-files/ssbanner.aud&quot;
+                , &quot;REPEAT:4&quot;
+                , &quot;DURATION:PT1H&quot;
+                , &quot;X-alarm:non-standard ALARM property&quot;
+                , &quot;END:VALARM&quot; ));
+$e-&gt;parse( &quot;X-xomment:non-standard property will be displayed, comma escaped&quot;);
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="setProperty_PROP"></a><h3>3.2.4 setProperty</h3>
+<p>
+Generic iCalcreator component object set property method, simplifying insert of properties. For properties where
+multiple occurrences are allowed, last parameter is an index, implementing replaceProperty functionality.
+</p>
+<p>A successful update returns TRUE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( PropName, Proparg_1 *[, Proparg_n] )</p>
+<p class="comment">propName  = (string) case independent, [RFC5545] component property names,
+                    unknown propName will be regarded as (a non-standard) <a href="#X-PROPERTY_PROP">X-property</a>.
+Proparg_n = (mixed) property content
+            Last property argument is a (optional) property dependent parameters
+            array( *[(string) key =&gt; (string) value ] ).
+            A non-standard (, experimental) parameter key MUST be prefixed by &quot;X-&quot;.
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent = &amp; $vcalendar-&gt;newComponent( &quot;vevent&quot; );
+$vevent-&gt;setProperty( &quot;dtstart&quot;
+                    , array(&quot;year&quot;=&gt;2007,&quot;month&quot;=&gt;4,&quot;day&quot;=&gt;1,&quot;hour&quot;=&gt;19));
+$vevent-&gt;setProperty( &quot;duration&quot;, 0, 0, 3 ));
+$vevent-&gt;setProperty( &quot;LOCATION&quot;, &quot;Central Plaza&quot; );
+$vevent-&gt;setProperty( &quot;summary&quot;, &quot;PHP summit&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="ACTION"></a><h3>3.2.5 ACTION</h3>
+<p>
+This property defines the action to be invoked when an <a href="#VALARM">VALARM</a> is triggered,
+<br> &quot;AUDIO&quot; / &quot;DISPLAY&quot; / &quot;EMAIL&quot; / &quot;PROCEDURE&quot;.
+This property is REQUIRED and MUST NOT occur more than once. (&quot;PROCEDURE&quot; is deprecated in [RFC5545].)
+</p>
+<h5>Create ACTION</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createAction()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createAction();
+.. .
+</p>
+<h5>Delete ACTION</h5>
+<p>Remove ACTION from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;Action&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;deleteProperty( &quot;Action&quot; );
+.. .
+</p>
+<h5>Get ACTION</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;Action&quot; )</p>
+<p class="comment">output = actionValue<sup>1</sup>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;Action&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; actionValue<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$action = $valarm-&gt;getProperty( &quot;action&quot; );
+.. .
+</p>
+<h5>Set ACTION</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;Action&quot;, actionValue [, xparams ] )</p>
+<p class="comment">actionValue<sup>1</sup> = (string) one of &quot;AUDIO&quot; / &quot;DISPLAY&quot; / &quot;EMAIL&quot; / &quot;PROCEDURE&quot;
+xparams<sup>2</sup>     = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;setProperty( &quot;action&quot;, &quot;DISPLAY&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="ATTACH"></a><h3>3.2.6 ATTACH</h3>
+<p>
+The property provides the capability to associate a document object with a <strong>calendar</strong> component. The property is
+is REQUIRED and MUST NOT occur more than once in an &quot;ALARM&quot; (&quot;ACTION&quot; &quot;procedure&quot;),
+OPTIONAL and MUST NOT occur more than once in an &quot;ALARM&quot; (&quot;ACTION&quot; &quot;audio&quot;) and
+OPTIONAL and MAY occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a> and <a href="#VALARM">VALARM</a> (&quot;ACTION&quot; &quot;email&quot;) components.
+</p>
+<p>
+The default value type for ATTACH is URI. The value type can also be set to BINARY to indicate inline binary encoded content (params<sup>2</sup>).
+</p>
+<p>
+If using other parameters than the recommended &quot;FMTTYPE&quot; and the mandatory &quot;ENCODING&quot; (=&quot;BASE64&quot;)and &quot;VALUE&quot; (=&quot;BINARY&quot;)
+for an inline binary encoded attachment,
+please use only characters within the ASCII character set in parameter name and content,
+to ensure proper line folding when using <a href="#createCalendar">createCalendar</a> and/or <a href="#returnCalendar">returnCalendar</a>.
+</p>
+<h5>Create ATTACH</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createAttach()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createAttach();
+.. .
+</p>
+<h5>Delete ATTACH</h5>
+<p>Remove ATTACH from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;ATTACH&quot; )</p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;deleteProperty( &quot;ATTACH&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+Delete ATTACH property no 2.
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;deleteProperty( &quot;ATTACH&quot;, 2 );
+.. .
+</p>
+<p class="label">Example 3</p>
+Deleting all ATTACH properties.
+<p class="example">&lt;?php
+.. .
+while( $valarm-&gt;deleteProperty( &quot;ATTACH&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get ATTACH</h5>
+<p>If set, returns property value(-s), otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;Attach&quot; )</p>
+<p class="comment">output = attachValue<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;ATTACH&quot;, propOrderNo/FALSE , TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value,
+<p class="comment">output = array( &quot;value&quot;  =&gt; attachValue<sup>1</sup>
+              , &quot;params&quot; =&gt; params<sup>2</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( &quot;Attach&quot;, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">Get propOrderNo ATTACH</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$attach = $valarm-&gt;getProperty( &quot;attach&quot; );
+.. .
+</p>
+<h5>Set ATTACH</h5>
+<p>Insert property value. Parameters, if any, will be ordered as prescribed in [RFC5545].</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;attach&quot;, attachValue<sup>1</sup> [, params [, propOrderNo ]] )</p>
+<p class="comment">attachValue<sup>1</sup> = (string) URI / inline binary encoded content
+params<sup>2</sup>      = (array ) ( [ &quot;ENCODING&quot; =&gt; &quot;BASE64&quot;, &quot;VALUE&quot; =&gt; &quot;BINARY&quot; ]
+                          [, &quot;FMTTYPE&quot;  =&gt; contentType ]
+                         *[,&nbsp;xparams ] )
+contentType  = (string) The parameter value MUST be the TEXT for either an IANA
+                        registered content type or a non-standard content type.
+xparams      = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo  = (int) order number             // <span class="comment">1=1st, 2=2nd etc</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;attach&quot;
+                    , &quot;ftp://domain.com/pub/docs/agenda.doc&quot;
+                    , array( &quot;FMTTYPE&quot; =&gt; &quot;application/binary&quot; ));
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="ATTENDEE"></a><h3>3.2.7 ATTENDEE</h3>
+<p>
+The property defines an "Attendee" within a <strong>calendar</strong> component and is OPTIONAL and MUST NOT occur more than once
+in a VALARM (&quot;ACTION&quot; &quot;email&quot;), OPTIONAL and MAY occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a> and <a href="#VFREEBUSY">VFREEBUSY</a> components.
+</p>
+<p>This value type for ATTENDEE is URI, a <strong>calendar</strong> user address.</p>
+<h5>Create ATTENDEE</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createAttendee()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createAttendee();
+.. .
+</p>
+<h5>Delete ATTENDEE</h5>
+<p>Remove ATTENDEE from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;ATTENDEE&quot; )</p>
+<p class="label">Example 1</p>
+<p>Delete (single/first) ATTENDEE property</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;deleteProperty( &quot;ATTENDEE&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Delete ATTENDEE property no 2.</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;deleteProperty( &quot;ATTENDEE&quot;, 2 );
+.. .
+</p>
+<p class="label">Example 3</p>
+Deleting all ATTENDEE properties.
+<p class="example">&lt;?php
+.. .
+while( $valarm-&gt;deleteProperty( &quot;ATTENDEE&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get ATTENDEE</h5>
+<p>If set, returns property value(-s), otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;Attendee&quot; )</p>
+<p class="comment">output = attendeeValue<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;ATTENDEE&quot;, propOrderNo/FALSE , TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; attendeeValue<sup>1</sup>
+              , &quot;params&quot; =&gt; array( params<sup>2</sup> ))</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( &quot;ATTENDEE&quot;, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = attendeeValue<sup>1</sup></p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$attendee = $valarm-&gt;getProperty( &quot;attendee&quot; );
+.. .
+</p>
+<h5>Set ATTENDEE</h5>
+<p>
+Insert property value. If exist, default parameter values are removed after input (params<sup>2</sup>).
+Property value must be prefixed by protocol (ftp://, http://,mailto:, file://.. . ref. rfc 1738 ),
+if missing, &quot;mailto:&quot; is set (indicating an internet mail address).
+Also MEMBER and DIR parameters must be prefixed by protocol. DELEGATED-TO, DELEGATED-FROM, SENT-BY parameters
+must use protocol &quot;mailto:&quot;, prefixed if missing (indicating an internet mail address).
+</p>
+<p>Parameters, if any, will be ordered as prescribed in [RFC5545].</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;attendee&quot;, attendeeValue [, params [, propOrderNo ]] )</p>
+<p class="comment">attendeeValue<sup>1</sup> = (string) a <strong>calendar</strong> user address, a URI as defined by
+                         [RFC 1738] or any other IANA registered form
+                         for a URI.
+params<sup>2</sup>        = (array) ( [CUTYPE] [,MEMBER] [,ROLE] [,PARTSTAT]
+                           [,RVSP] [,DELEGATED-TO] [,DELEGATED-FROM]
+                           [,SENT-BY] [,CN] [,DIR] [,LANGUAGE]
+                          *[,xparams] )
+CUTYPE        = "CUTYPE" =&gt; &quot;INDIVIDUAL&quot;
+                            (An individual, <b>Default</b>)
+                          / &quot;GROUP&quot;
+                            (A group of individuals)
+                          / &quot;RESOURCE&quot;
+                            (A physical resource)
+                          / &quot;ROOM&quot;
+                            (A room resource)
+                          / &quot;UNKNOWN&quot;
+                            (Otherwise not known)
+                          / (string) x-name
+                            (Experimental type)
+                          / iana-token
+                            (string) (Other IANA registered type)
+MEMBER        = "MEMBER" =&gt; array( *[ (string) &quot;single member
+                            of the group or list membership&quot;])
+ROLE          = "ROLE"   =&gt; &quot;CHAIR&quot;
+                            (Indicates chair of the <strong>calendar</strong>
+                             entity)
+                          / &quot;REQ-PARTICIPANT&quot;
+                            (required participation, <b>Default</b>)
+                          / &quot;OPT-PARTICIPANT&quot;
+                            (optional participation)
+                          / &quot;NON-PARTICIPANT&quot;
+                            (information purposes only)
+                          / (string) x-name
+                            (Experimental role)
+                          / (string) iana-token
+                            (Other IANA role)
+PARTSTAT       = &quot;PARTSTAT&quot; =&gt; &quot;NEEDS-ACTION&quot;
+                            (Event needs action, <b>Default</b>)
+                          / &quot;ACCEPTED&quot;
+                            (Event accepted)
+                          / &quot;DECLINED&quot;
+                            (Event declined)
+                          / &quot;TENTATIVE&quot;
+                            (Event tentatively accepted)
+                          / &quot;DELEGATED&quot;
+                            (Event delegated)
+                          / &quot;NEEDS-ACTION&quot;
+                            (To-do needs action, <b>Default</b>)
+                          / &quot;ACCEPTED&quot;
+                            (To-do accepted)
+                          / &quot;DECLINED&quot;
+                            (To-do declined)
+                          / &quot;TENTATIVE&quot;
+                            (To-do tentatively accepted)
+                          / &quot;DELEGATED&quot;
+                            (To-do delegated)
+                          / &quot;COMPLETED&quot;
+                            (To-do completed.
+                              <a href="#COMPLETED">COMPLETED</a> property
+                                 has date/time completed)
+                          / &quot;IN-PROCESS&quot;
+                            (To-do in process of being completed)
+                          / &quot;NEEDS-ACTION&quot;
+                            (Journal needs action, <b>Default</b>)
+                          / &quot;ACCEPTED&quot;
+                            (Journal accepted)
+                          / &quot;DECLINED&quot;
+                            (Journal declined)
+                          / (string) x-name
+                            (Experimental status)
+                          / (string) iana-token
+                            (Other IANA registered status)
+RSVP           = &quot;RSVP&quot; =&gt; (string) &quot;TRUE&quot;
+                                  / &quot;FALSE&quot;, <b>Default</b> (reply expectation)
+DELEGATED-TO   = &quot;DELEGATED-TO&quot; =&gt; array(*[(string) &quot;single <strong>calendar</strong> user
+                                            to specified by the property
+                                            has delegated participation&quot;])
+DELEGATED-FROM = &quot;DELEGATED-FROM&quot; =&gt; array( *[ (string) &quot;single <strong>calendar</strong> user that
+                                                have delegated their
+                                                participation to the
+                                                <strong>calendar</strong> user specified
+                                                by the property&quot; ] )
+SENT-BY        = &quot;SENT-BY&quot; =&gt; (string) single <strong>calendar</strong> user that is
+                              acting on behalf
+                              of the <strong>calendar</strong> user
+                              specified by the property&quot;
+LANGUAGE       = &quot;LANGUAGE&quot; =&gt; (string) &quot;lang<sup>*</sup>&quot; (applies to the CN parameter value)
+CN             = &quot;CN&quot; =&gt; (string) &quot;common name to be associated with the <strong>calendar</strong>
+                          user specified by the property&quot;
+DIR            = &quot;DIR&quot; =&gt; (string) &quot;reference to a directory entry associated with
+                           the <strong>calendar</strong> user specified by the property&quot;
+xparams        = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo    = (int) order number             // <span class="comment">1=1st, 2=2nd etc</span>
+lang<sup>*</sup>          = as defined in [RFC5646]</p>
+<p>
+See rules in detail in <a href="http://kigkonsult.se/downloads/dl.php?f=rfc2445" title="RFC2445" target="_blank">RFC2445</a> - Internet Calendaring and Scheduling Core Object Specification (iCalendar).
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;attendee&quot;
+                    , &quot;attendee1@ical.net&quot;
+$vevent-&gt;setProperty( &quot;attendee&quot;
+                    , &quot;attendee2@ical.net&quot;
+                    , array( &quot;cutype&quot;   =&gt; &quot;INDIVIDUAL&quot;
+                           , &quot;member&quot;   =&gt; array( &quot;member1@ical.net&quot;
+                                                , &quot;member2@ical.net&quot;
+                                                , &quot;member3@ical.net&quot; )
+                           , &quot;role&quot;     =&gt; &quot;CHAIR&quot;
+                           , &quot;PARTSTAT&quot; =&gt; &quot;ACCEPTED&quot;
+                           , &quot;RSVP&quot;     =&gt; &quot;TRUE&quot;
+                           , &quot;DELEgated-to&quot; =&gt; array( &quot;part1@ical.net&quot;
+                                                    , &quot;part2@ical.net&quot;
+                                                    , &quot;part3@ical.net&quot; )
+                           , &quot;delegateD-FROM&quot; =&gt;array( &quot;cio@ical.net&quot;
+                                                     , &quot;vice.cio@ical.net&quot;)
+                           , &quot;SENT-BY&quot;  =&gt; &quot;secretary@ical.net&quot;
+                           , &quot;LANGUAGE&quot; =&gt; &quot;us-EN&quot;
+                           , &quot;CN&quot;       =&gt; &quot;John Doe&quot;
+                           , &quot;DIR&quot;      =&gt; &quot;http://www.ical.net/info.doc&quot;
+                           , &quot;x-agenda&quot; =&gt; &quot;status reports&quot; <span class="comment">// xparam</span>
+                           , &quot;x-length&quot; =&gt; &quot;15 min&quot;  ));    <span class="comment">// xparam</span>
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+<a name="CATEGORIES"></a><h3>3.2.8 CATEGORIES</h3>
+<p>
+This property defines the categories for a <strong>calendar</strong> component and is OPTIONAL and MAY occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a> and <a href="#VJOURNAL">VJOURNAL</a> components.<br><br>
+The value type for CATEGORIES is TEXT.
+</p>
+<h5>Create CATEGORIES</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createCategories()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createCategories();
+.. .
+</p>
+<h5>Delete CATEGORIES</h5>
+<p>Remove CATEGORIES from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;CATEGORIES&quot; )</p>
+<p class="label">Example 1</p>
+<p>Delete (single/first) CATEGORIES property</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;CATEGORIES&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Delete CATEGORIES property no 2.</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;CATEGORIES&quot;, 2 );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p>Deleting all CATEGORIES properties.</p>
+<p class="example">&lt;?php
+.. .
+while( $vevent-&gt;deleteProperty( &quot;CATEGORIES&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get CATEGORIES</h5>
+<p>If set, returns property value(-s), otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;CATEGORIES&quot; )</p>
+<p class="comment">output = categoryValue<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;CATEGORIES&quot;, propOrderNo/FALSE , TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; categories<sup>1</sup>
+              , &quot;params&quot; =&gt; params<sup>3</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( &quot;CATEGORIES&quot;, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">Get propOrderNo CATEGORIES</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$categories = $valarm-&gt;getProperty( &quot;categories&quot; );
+.. .
+</p>
+<h5>Set CATEGORIES</h5>
+<p>Insert property value.</p>
+<p>
+In spite of the fact that CATEGORIES may contain a (comma separated) list of values,
+a strong recommendation is to split a CATEGORIES &quot;list&quot; into multiple single CATEGORIES entrys.
+</p>
+<p>Parameters, if any, will be ordered as prescribed in [RFC5545].</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;categories&quot;, categories [, params [, propOrderNo ]] )</p>
+<p class="comment">categories<sup>1</sup>    = (string) categoryValue / (array) ( *categoryValue )
+categoryValue<sup>2</sup> = (string) textual categories or subtypes of the <strong>calendar</strong> component,
+                can be specified as a list of categories
+                separated by the COMMA character
+params<sup>3</sup>        = (array) ( [&quot;LANGUAGE&quot; =&gt; (string) &quot;&lt;lang<sup>*</sup>&gt;&quot;] *[, xparams] )
+xparams        = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo    = (int) order number             // <span class="comment">1=1st, 2=2nd etc</span>
+lang<sup>*</sup>         = as defined in [RFC5646]</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;categories&quot;, &quot;project_x&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="CLASS"></a><h3>3.2.9 CLASS</h3>
+<p>
+This property defines the access classification for a <strong>calendar</strong> component and is OPTIONAL
+and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a> and <a href="#VJOURNAL">VJOURNAL</a> components.
+</p>
+<h5>Create CLASS</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createClass()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createClass();
+.. .
+</p>
+<h5>Delete CLASS</h5>
+<p>Remove CLASS from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;CLASS&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vjournal-&gt;deleteProperty( &quot;CLASS&quot; );
+.. .
+</p>
+<h5>Get CLASS</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;CLASS&quot; )</p>
+<p class="comment">output = classValue<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;CLASS&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array &quot;value&quot;   =&gt; classValue<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$class = $valarm-&gt;getProperty( &quot;class&quot; );
+.. .
+</p>
+<h5>Set CLASS</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;class&quot;, classvalue [, xparams ] )</p>
+<p class="comment">classvalue<sup>1</sup> = &quot;PUBLIC&quot;
+            / &quot;PRIVATE&quot;
+            / &quot;CONFIDENTIAL&quot;
+            / (string) iana-token
+            / (string) x-name
+xparams<sup>2</sup>    = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;class&quot;, &quot;CONFIDENTIAL&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+<a name="COMMENT"></a><h3>3.2.10 COMMENT</h3>
+<p>
+This property specifies non-processing information intended to provide a comment to the <strong>calendar</strong> user
+and is OPTIONAL and MAY occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a>, <a href="#VFREEBUSY">VFREEBUSY</a>, <a href="#VTIMEZONE">STANDARD</a> and <a href="#VTIMEZONE">DAYLIGHT</a> components.
+</p>
+<p>The value type for COMMENT is TEXT.</p>
+<h5>Create COMMENT</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createComment()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createComment();
+.. .
+</p>
+<h5>Delete COMMENT</h5>
+<p>Remove COMMENT from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;COMMENT&quot; )</p>
+<p class="label">Example 1</p>
+<p>Delete (single/first) COMMENT property</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;COMMENT&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Delete COMMENT property no 2.</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;COMMENT&quot;, 2 );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p>Deleting all COMMENT properties.</p>
+<p class="example">&lt;?php
+.. .
+while( $vevent-&gt;deleteProperty( &quot;COMMENT&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get COMMENT</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;COMMENT&quot; )</p>
+<p class="comment">output = commentValue<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;COMMENT&quot;, propOrderNo/FALSE , TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; commentValue<sup>1</sup>
+              , &quot;params&quot; =&gt; params<sup>2</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( &quot;COMMENT&quot;, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">Get propOrderNo COMMENT</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$comment = $vevent-&gt;getProperty( &quot;comment&quot; );
+.. .
+</p>
+<h5>Set COMMENT</h5>
+<p>Insert property value. Parameters, if any, will be ordered as prescribed in [RFC5545].</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;comment&quot;, commentValue [, params [, propOrderNo ]] )</p>
+<p class="comment">commentValue<sup>1</sup> = (string) Value type Text
+params<sup>2</sup>       = (array) (
+                   [ &quot;ALTREP&quot; =&gt; (string) &quot;&lt;an alternate text representation, URI&gt;&quot;]
+                   [, &quot;LANGUAGE&quot; =&gt; (string) &quot;lang<sup>*</sup>&quot;]
+                  *[, xparams ] )
+xparams       = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo   = (int) order number             // <span class="comment">1=1st, 2=2nd etc</span>
+lang<sup>*</sup>         = as defined in [RFC5646]</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;comment&quot;, &quot;this is a comment&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="COMPLETED"></a><h3>3.2.11 COMPLETED</h3>
+<p>
+This property defines the date and time that a <a href="#VTODO">VTODO</a> was actually completed and is OPTIONAL and MUST NOT occur more than once.
+</p>
+<p>The value type for COMPLETED is <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME.</p>
+<p>For methods and formatting, explore the <a href="#CREATED">CREATED</a> property.</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="CONTACT"></a><h3>3.2.12 CONTACT</h3>
+<p>
+The property is used to represent textual contact information or alternately a reference to textual contact information
+ associated with the <strong>calendar</strong> component. The property is OPTIONAL and MUST NOT occur more than once in
+ a VFREEBUSY or MAY occur more than once  in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a> and
+ <a href="#VJOURNAL">VJOURNAL</a> components.
+</p>
+<p>The value type for CONTACT is TEXT.</p>
+<h5>Create CONTACT</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createContact()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createContact();
+.. .
+</p>
+<h5>Delete CONTACT</h5>
+<p>Remove CONTACT from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;CONTACT&quot; )</p>
+<p class="label">Example 1</p>
+<p>Delete (single/first) CONTACT property<p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;CONTACT&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Delete CONTACT property no 2.</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;CONTACT&quot;, 2 );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p>Deleting all CONTACT properties.</p>
+<p class="example">&lt;?php
+.. .
+while( $vevent-&gt;deleteProperty( &quot;CONTACT&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get CONTACT</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;CONTACT&quot; )</p>
+<p class="comment">output = contactValue<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;CONTACT&quot;, propOrderNo/FALSE , TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; contactValue<sup>1</sup>
+              , &quot;params&quot; =&gt; params<sup>2</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( &quot;CONTACT&quot;, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">Get propOrderNo CONTACT</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$contact = $vevent-&gt;getProperty( &quot;contact&quot; );
+.. .
+</p>
+<h5>Set CONTACT</h5>
+<p>Insert property value. Parameters, if any, will be ordered as prescribed in [RFC5545].</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;contact&quot;, contactValue [, params [, propOrderNo ]] )</p>
+<p class="comment">contactValue<sup>1</sup> = (string) Value type TEXT
+params<sup>2</sup>       = (array) (
+                   [ &quot;ALTREP&quot; =&gt; (string) &quot;&lt;an alternate text representation, URI&gt;&quot;]
+                   [, &quot;LANGUAGE&quot; =&gt; (string) &quot;lang<sup>*</sup>&quot;]
+                  *[, xparams] )
+xparams       = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo   = (int) order number             // <span class="comment">1=1st, 2=2nd etc</span>
+lang<sup>*</sup>         = as defined in [RFC5646]</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$c-&gt;setProperty( &quot;contact&quot;, &quot;tel 012-34 56 789&quot; )
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="CREATED"></a><h3>3.2.13 CREATED</h3>
+<p>
+This property specifies the date and time that the <strong>calendar</strong> information was created by
+the <strong>calendar</strong> user agent in the <strong>calendar</strong> store.
+Note: This is analogous to the creation date and time for a file in the file system.
+The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>,
+<a href="#VTODO">VTODO</a> and <a href="#VJOURNAL">VJOURNAL</a> components.
+</p>
+<p>The value type for CREATED is <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME.</p>
+<h5>Create CREATED</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createCreated()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createCreated();
+.. .
+</p>
+<h5>Delete CREATED</h5>
+<p>Remove CREATED from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;CREATED&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;CREATED&quot; );
+.. .
+</p>
+<h5>Get CREATED</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;CREATED&quot; )</p>
+<p class="comment">output = createdDate<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;CREATED&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; createdDate<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$created = $vevent-&gt;getProperty( &quot;CREATED&quot; );
+.. .
+</p>
+<h5>Set CREATED</h5>
+<p>
+Insert property value. Input date is always a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME or,
+if &quot;offset&quot; parameter is used, converted to a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME.
+Notice, use function <a href="#transformDateTime">transformDateTime</a> to change a local datetime to UTC datetime.
+</p>
+<p>The current UTC date-time is set if called without parameters.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;created&quot;, [ createdDate [, xparams ]] )</p>
+<p class="comment">createdDate<sup>1</sup> = (array) ( &quot;year&quot;  =&gt; (int) year
+                       , &quot;month&quot; =&gt; (int) month
+                       , &quot;day&quot;   =&gt; (int) day
+                      [, &quot;hour&quot;  =&gt; (int) hour
+                       , &quot;min&quot;   =&gt; (int) min
+                       , &quot;sec&quot;   =&gt; (int) sec
+                       , &quot;tz&quot;    =&gt; offset ]] )
+createdDate  = (int) year
+             , (int) month
+             , (int) day
+            [, (int) hour
+             , (int) min
+             , (int) sec ]
+createdDate  = (array) ( (int) year
+                       , (int) month
+                       , (int) day
+                      [, (int) hour
+                       , (int) min
+                       , (int) sec
+                      [, offset ]] )
+createdDate  = (array) ( &quot;timestamp&quot; =&gt; (int) timestamp ) // <span class="comment">results in a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+createdDate  = (string) date/datetime string<sup>*</sup>
+offset       = (int) (+/-)HHmm[ss] // <span class="comment">(arr/str) local date + UTC offset will result in a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+xparams<sup>2</sup>     = array( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+<br>date/datetime string<sup>*</sup> recommended formats
+    &quot;20110625&quot;,            &quot;2011-06-25&quot;,          &quot;2011/06/26&quot;
+    &quot;20110625051015&quot;,      &quot;20110625 051015&quot;
+    &quot;20110625T051015&quot;,     &quot;20110625t051015&quot;
+    &quot;2011-06-25 05:10:15&quot;, &quot;2011-06-25T05:10:15&quot;, &quot;2011-06-25t05:10:15&quot;
+    &quot;2011/06/25 05:10:15&quot;, &quot;2011/06/25T05:10:15&quot;, &quot;2011/06/25t05:10:15&quot;
+    trailing characters (digits), if exists, will be interpreted as offset
+    other string formats, acceptable by <em>PHP</em> strtotime function, may (would) work
+    <span class="comment">(notice <a href="#date_restriction">date restriction</a>)</span></p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot; );
+$vcalendar = new vcalendar( $config );
+$vtodo     = &amp; $vcalendar-&gt;newComponent( &quot;vtodo&quot; );
+.. .
+$vtodo-&gt;setProperty( &quot;created&quot;, 2006, 8, 11, 14, 30, 35 ); // <span class="comment">11 august 2006 14.30.35 UTC</span>
+.. .
+</p>
+<p class="label">Example 2</p>
+<p class="example">&lt;?php
+.. .
+$date = array(&quot;year&quot; =&gt; 2006, &quot;month&quot; =&gt; 10, &quot;day&quot; =&gt; 10,
+              &quot;hour&quot; =&gt; 10, &quot;min&quot; =&gt; 0, &quot;sec&quot; =&gt; 0, &quot;tz&quot; =&gt; &quot;+0200&quot;);
+              // <span class="comment">local date + UTC offset will result in a <a class="ref" href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+$vtodo-&gt;setProperty( &quot;created&quot;, $date );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;created&quot; ); // <span class="comment">current UTC date-time is set if called without parameters</span>
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="DESCRIPTION"></a><h3>3.2.14 DESCRIPTION</h3>
+<p>
+This property provides a more complete textual description of the <strong>calendar</strong> component,
+than that provided by the <a href="#SUMMARY">SUMMARY</a> property (, analogous to a mail BODY).
+The property is OPTIONAL, MUST NOT occur more than once within <a href="#VEVENT">VEVENT</a>,
+<a href="#VTODO">VTODO</a> or <a href="#VALARM">VALARM</a> (PROCEDURE) but can be specified multiple
+times within a <a href="#VJOURNAL">VJOURNAL</a> <strong>calendar</strong> component. The property is REQUIRED in  <a href="#VALARM">VALARM</a> (DISPLAY, EMAIL) component.
+</p>
+<p>The value type for DESCRIPTION is TEXT.</p>
+<h5>Create DESCRIPTION</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createDescription()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createDescription();
+.. .
+</p>
+<h5>Delete DESCRIPTION</h5>
+<p>Remove DESCRIPTION from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;DESCRIPTION&quot; )</p>
+<p class="label">Example 1</p>
+<p>Delete (single/first) DESCRIPTION property.</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;DESCRIPTION&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Delete DESCRIPTION property no 2.</p>
+<p class="example">&lt;?php
+.. .
+$vjournal-&gt;deleteProperty( &quot;DESCRIPTION&quot;, 2 );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p>Deleting all DESCRIPTION properties.</p>
+<p class="example">&lt;?php
+.. .
+while( $vjournal-&gt;deleteProperty( &quot;DESCRIPTION&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get DESCRIPTION</h5>
+<p>If set, returns property value(-s), otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;DESCRIPTION&quot; )</p>
+<p class="comment">output = descriptionValue<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;DESCRIPTION&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; descriptionValue<sup>1</sup>
+              , &quot;params&quot; =&gt; params<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$description = $vevent-&gt;getProperty( &quot;description&quot; );
+.. .
+</p>
+<h5>Set DESCRIPTION</h5>
+<p>Insert property value.</p>
+<br>
+Parameters, if any, will be ordered as prescribed in [RFC5545].
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;description&quot;, descriptionValue [, params [, propOrderNo ]] )</p>
+<p class="comment">descriptionValue<sup>1</sup> = (string) Value type TEXT
+params<sup>2</sup>         = (array) (
+                    [ &quot;ALTREP&quot; =&gt; (string) &quot;&lt;an alternate text representation, URI&gt;&quot;]
+                    [, &quot;LANGUAGE&quot; =&gt; (string) &quot;lang<sup>*</sup>&quot;]
+                   *[, xparams ] )
+xparams           = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo       = (int) order number             // <span class="comment">1=1st, 2=2nd etc</span>
+lang<sup>*</sup>          = as defined in [RFC5646]</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;description&quot;, &quot;This is a description&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="DTEND"></a><h3>3.2.15 DTEND</h3>
+<p>
+This property specifies the date and time that a <strong>calendar</strong> component ends.
+The property is OPTIONAL and MUST NOT occur more than once in VFREEBUSY and VEVENT. In VEVENT, it only occurs
+if DURATION NOT occurs.
+</p>
+<p>
+The default value type for DTEND is DATE-TIME, can be set to a DATE value type.
+</p>
+<p class="quotes">
+The value type of the "DTEND" or "DUE" properties MUST match the value type of "DTSTART" property as defined in [RFC5545])
+</p>
+<p>
+Notice that an end date without a time is in effect midnight of the day before the date,
+so for timeless dates, use the date following the event date for it to be correct.
+For an &quot;all-day event&quot; and using timeless dates, the DTEND is equal DTSTART plus one day,
+example all-day event (2007-12-01)<br>DTSTART;VALUE=DATE:20071201<br> DTEND;VALUE=DATE:20071202.
+</p>
+<h5>Create DTEND</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createDtend()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createDtend();
+.. .
+</p>
+<h5>Delete DTEND</h5>
+<p>Remove DTEND from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;DTEND&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;DTEND&quot; );
+.. .
+</p>
+<h5>Get DTEND</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;DTEND&quot; )</p>
+<p class="comment">output = dtendDate<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;DTEND&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; dtendDate<sup>1</sup>
+              , &quot;params&quot; =&gt; params<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$dtend = $vevent-&gt;getProperty( &quot;dtend&quot; );
+.. .
+</p>
+<h5>Set DTEND</h5>
+<p>
+Insert property value. If DATE value type is expected, &quot;VALUE&quot; = &quot;DATE&quot; <b>must</b> be set
+(in params<sup>2</sup>) otherwise DATE-TIME (default) value type is set.
+</p>
+<p>
+If no timezone parameter (tz or tzidparam below) is set (i.e.local time) and config <a href="#dTZID">TZID</a> is set,
+date-time values will be set WITH timezone from config.
+Notice, use function <a href="#transformDateTime">transformDateTime</a> to change a datetime from one time zone to another.
+</p>
+<p>Parameters, if any, will be ordered as prescribed in [RFC5545].</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;dtend&quot;, dtendDate [, params<sup>2</sup> ] )
+<p class="comment">dtendDate<sup>1</sup>    = (array) ( &quot;year&quot;  =&gt; (int) year
+                        , &quot;month&quot; =&gt; (int) month
+                        , &quot;day&quot;   =&gt; (int) day
+                       [, &quot;hour&quot;  =&gt; (int) hour
+                        , &quot;min&quot;   =&gt; (int) min
+                        , &quot;sec&quot;   =&gt; (int) sec
+                       [, &quot;tz&quot;    =&gt; tz ]] )
+dtendDate     = (int) year
+              , (int) month
+              , (int) day
+             [, (int) hour
+              , (int) min
+              , (int) sec
+             [, tz ]]
+dtendDate     = array( (int) year
+                     , (int) month
+                     , (int) day
+                    [, (int) hour
+                     , (int) min
+                     , (int) sec
+                    [, tz ]] )
+dtendDate     = (array) ( &quot;timestamp&quot; =&gt; (int) timestamp [,&quot;tz&quot; =&gt; tz])
+                // <span class="comment">timestamp without tz will result in a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+                // <span class="comment">timestamp with tz=offset will result in a local DATE-TIME</span>
+dtendDate     = (string) date/datetime string<sup>*</sup>
+                // <span class="comment">Within the "VFREEBUSY" <strong>calendar</strong> component,</span>
+                // <span class="comment">the time MUST be specified in the <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+tz            = (string) &lt;timezone  identifier&gt; / offset
+                // <span class="comment">timezone will be used as tzidparam (below), if tzidparam not set</span>
+offset        = (int) (+/-)HHmm[ss] // <span class="comment">(arr/str) local date + UTC offset</span>
+                                    // <span class="comment">will result in a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+params<sup>2</sup>       = (array) ([ tzidparam/datetimeparam/dateparam ] *[,xparams])
+tzidparam     = &quot;TZID&quot; =&gt; (string) &lt;timezone identifier&gt;
+                // <span class="comment">output as local date-time with timezone identifier</span>
+                // <span class="comment">if tzidparam=&quot;GMT&quot;/&quot;UTC&quot; then</span>
+                // <span class="comment">output date-time is suffixed by 'Z'</span>
+datetimeparam = &quot;VALUE&quot; =&gt; &quot;DATE-TIME&quot; // <span class="comment">default, output as date-time</span>
+dateparam     = &quot;VALUE&quot; =&gt; &quot;DATE&quot; // <span class="comment">output as DATE, ex. all-day event</span>
+xparams       = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+<br>date/datetime string<sup>*</sup> recommended formats
+    &quot;20110625&quot;,            &quot;2011-06-25&quot;,          &quot;2011/06/26&quot;
+    &quot;20110625051015&quot;,      &quot;20110625 051015&quot;
+    &quot;20110625T051015&quot;,     &quot;20110625t051015&quot;
+    &quot;2011-06-25 05:10:15&quot;, &quot;2011-06-25T05:10:15&quot;, &quot;2011-06-25t05:10:15&quot;
+    &quot;2011/06/25 05:10:15&quot;, &quot;2011/06/25T05:10:15&quot;, &quot;2011/06/25t05:10:15&quot;
+    trailing characters (digits), if exists, will be interpreted as offset/timezone
+    other string formats, acceptable by <em>PHP</em> strtotime function, may (would) work
+    <span class="comment">(notice <a href="#date_restriction">date restriction</a>)</span></p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;dtend&quot;, 2006, 8, 11, 16, 30, 0 ); <span class="comment">// 11 august 2006 16.30.00 local date</span>
+.. .
+</p>
+<p class="label">Example 2</p>
+<p class="example">&lt;?php
+.. .
+$vfreebusy-&gt;setProperty( &quot;dtend&quot;, 2006, 8, 11, 16, 30, 0, &quot;-040000&quot; );
+                         <span class="comment">// 11 august 2006 16.30.00 -040000</span>
+                         <span class="comment">// local date + UTC offset will result in a <a class="ref" href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+.. .
+</p>
+<p class="label">Example 3</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;dtend&quot;
+                    , array( &quot;year&quot; =&gt;, 2006, &quot;month&quot; =&gt; 8, &quot;day&quot;=&gt; 11 )
+                    , array( &quot;VALUE&quot; =&gt; &quot;DATE&quot; ));
+                    <span class="comment">// end of an all-day event</span>
+.. .
+</p>
+<p class="label">Example 4</p>
+<p class="example">&lt;?php
+.. .
+$calendar->setConfig( 'TZID', 'Europe/Stockholm' );
+.. .
+$vevent-&gt;setProperty( &quot;dtend&quot;, 2006, 8, 11, 7, 30, 0 );
+                   <span class="comment">// output: DTEND;TZID=Europe/Stockholm:20060811T073000</span>
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="DTSTAMP"></a><h3>3.2.16 DTSTAMP</h3>
+<p>
+The property indicates the date/time the instance of the <strong>iCalendar</strong> object was created and is OPTIONAL and
+MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a>
+and <a href="#VFREEBUSY">VFREEBUSY</a> components. However, DTSTAMP is <b>AUTOMATICALLY GENERATED</b> in iCalcreator when creating a component.
+</p>
+<p>
+DTSTAMP may be required when importing iCal files into some <strong>calendar</strong> software<br>(MS etc.),
+as well as (<strong>calendar</strong>) <a href="#X-PROPERTY">x-properties</a> "X-WR-CALNAME", "X-WR-CALDESC" and<br>"X-WR-TIMEZONE",
+<a href="#METHOD">METHOD</a> property (value PUBLISH etc.) and the (also auto created) <a href="#UID">UID</a> property.
+</p>
+<p>The value type for DTSTAMP is <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME.</p>
+<p>For methods and formatting, explore the <a href="#CREATED">CREATED</a> property.</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="DTSTART"></a><h3>3.2.17 DTSTART</h3>
+<p>
+This property specifies when the <strong>calendar</strong> component begins.
+The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>,
+<a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a> and <a href="#VFREEBUSY">VFREEBUSY</a> components.
+The property is REQUIRED, but MUST NOT occur more than once in <a href="#VTIMEZONE">STANDARD</a> and <a href="#VTIMEZONE">DAYLIGHT</a> components.
+</p>
+<p>The default value type for DTSTART is DATE-TIME, can be set to a DATE value type.</p>
+<p>
+For an &quot;all-day event&quot; and using timeless dates, example (2007-12-01)<br>
+DTSTART;VALUE=DATE:20071201<br>
+DTEND;VALUE=DATE:20071202. // <span class="comment">opt., in effect midnight of the day <u>before</u> the date!!</span>
+</p>
+<p>For methods and formatting, explore the <a href="#DTEND">DTEND</a> property.</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="DUE"></a><h3>3.2.18 DUE</h3>
+<p>
+This property defines the date and time when a <a href="#VTODO">VTODO</a> is expected to be completed
+and is OPTIONAL and MUST NOT occur more than once and only if DURATION NOT occurs.
+</p>
+<p>
+The default value type for DUE is DATE-TIME, can be set to a DATE value type.
+</p>
+<p class="quotes">
+The value type of the "DTEND" or "DUE" properties MUST match the value type of "DTSTART" property as defined in [RFC5545])
+</p>
+<p>For methods and formatting, explore the <a href="#DTEND">DTEND</a> property.</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="DURATION"></a><h3>3.2.19 DURATION</h3>
+<p>The property specifies a positive duration of time.</p>
+<dl>
+<dt>In a <a href="#VEVENT">VEVENT</a>
+<dd>it is OPTIONAL and MUST NOT occur more than once and MUST NOT occur in pair with DTEND. If one occurs, so MUST NOT the other.<br>
+<dt>In a <a href="#VTODO">VTODO</a>
+<dd>it is OPTIONAL and MUST NOT occur more than once and MUST NOT occur in pair with DUE. If one occurs, so MUST NOT the other.<br>
+<dt>In a <a href="#VFREEBUSY">VFREEBUSY</a>
+<dd>it is OPTIONAL and MUST NOT occur more than once. ([RFC2445])<br>
+<dd>it can not appear. ([RFC5545])<br>
+<dt>In a <a href="#VALARM">VALARM</a>
+<dd>it is OPTIONAL and MUST NOT occur more than once and MUST occur in pair with TRIGGER. If one occurs, so MUST  the other.
+</dl>
+<p>
+If any hour/minute/second duration part is set, all parts are included in output (ex. one hour duration: &quot;PT1H0M0S&quot;).
+</p>
+<h5>Create DURATION</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createDuration()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createDuration();
+.. .
+</p>
+<h5>Delete DURATION</h5>
+<p>Remove DURATION from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;DURATION&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;deleteProperty( &quot;DURATION&quot; );
+.. .
+</p>
+<h5>Get DURATION</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;DURATION&quot; )</p>
+<p class="comment">output = duration<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;DURATION&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; duration<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$duration = $vtodo-&gt;getProperty( &quot;duration&quot; );
+.. .
+</p>
+<p class="label">option</p>
+<p>
+If a 4th argument is used and set to TRUE, returned output is in a DATE-TIME
+ output format (like <a href="#DTEND">DTEND</a> / <a href="#DUE">DUE</a>), based on
+<a href="#DTSTART">DTSTART</a> value with the added DURATION value.
+</p>
+<h5>Set DURATION</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;duration&quot;, duration [, xparams ] )</p>
+<p class="comment">
+duration<sup>1</sup>  = (array) ( &quot;week&quot; =&gt; (int) week )
+duration<sup>1</sup>  = array ( &quot;day&quot;   =&gt; (int) day )
+                  [, &quot;hour&quot;  =&gt; (int) hour
+                   , &quot;min&quot;   =&gt; (int) min
+                   , &quot;sec&quot;   =&gt; (int) sec ])
+duration   = (array) ( &quot;sec&quot; =&gt; (int) sec )
+duration   = (array) ( (int) week/false
+                    [, (int) day/false
+                    [, (int) hour
+                     , (int) min
+                     , (int) sec ]] )
+duration   = (int) week/false
+          [, (int) day/false
+          [, (int) hour
+           , (int) min
+           , (int) sec ]]
+duration   = (string) dur-value = [&quot;+&quot;] &quot;P&quot; (dur-date/dur-time/dur-week)
+dur-date   = dur-day [dur-time]
+dur-time   = &quot;T&quot; (dur-hour / dur-minute / dur-second)
+dur-week   = 1*DIGIT &quot;W&quot;
+dur-hour   = 1*DIGIT &quot;H&quot; [dur-minute]
+dur-minute = 1*DIGIT &quot;M&quot; [dur-second]
+dur-second = 1*DIGIT &quot;S&quot;
+dur-day    = 1*DIGIT &quot;D&quot;
+xparams<sup>2</sup>    = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example 1</p>
+<p>One day duration.</p>
+<p class="example">&lt;?php
+.. .
+$vtodo-&gt;setProperty &quot;duration&quot; , array( &quot;day&quot; =&gt; 1 ));
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Four hours duration.</p>
+<p class="example">&lt;?php
+.. .
+$vtodo-&gt;setProperty( &quot;duration&quot;, &quot;PT4H&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="EXDATE"></a><h3>3.2.20 EXDATE</h3>
+<p>
+This property defines the list of date/time exceptions for a recurring <strong>calendar</strong> component and is OPTIONAL
+and MAY occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a> components.
+</p>
+<p>The default value type for EXDATE is DATE-TIME, can be set to a DATE value type.</p>
+<h5>Create EXDATE</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createExdate()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createExdate();
+.. .
+</p>
+<h5>Delete EXDATE</h5>
+<p>Remove EXDATE from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;EXDATE&quot; )</p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$vtodo-&gt;deleteProperty( &quot;EXDATE&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<P>Delete EXDATE property no 2.</p>
+<p class="example">&lt;?php
+.. .
+$vjournal-&gt;deleteProperty( &quot;EXDATE&quot;, 2 );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p>Deleting all EXDATE properties.</p>
+<p class="example">&lt;?php
+.. .
+while( $vjournal-&gt;deleteProperty( &quot;EXDATE&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get EXDATE</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;EXDATE&quot; )<p>
+<p class="comment">output = exdates<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;exdate&quot;, propOrderNo/FALSE, TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; exdates<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( &quot;EXDATE&quot;, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">Get propOrderNo EXDATE</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$exdate = $vtodo-&gt;getProperty( &quot;exdate&quot; );
+.. .
+</p>
+<h5>Set EXDATE</h5>
+<p>Insert property value.</p>
+<p>The value type for EXDATE should match the <a href="#DTSTART">DTSTART</a> value type.</p>
+<p>
+If DATE value type is set in params (&quot;VALUE&quot; = &quot;DATE&quot;), all timezone or offset in dates are ignored.<br>
+If no &quot;VALUE&quot; value type is set or if DATE-TIME value type or TZID value is set in params, DATE-TIME (default) value type is set.
+</p>
+<p>
+If &quot;TZID&quot; is set in params,
+all timezone or offset in dates are ignored (note timestamp, below) and DATE-TIME value type is set.<br>
+If empty params and offset in 1st date, all remaining (non-timestamp) dates are set to UTC.<br>
+If no &quot;TZID&quot; is set in params and timezone in 1st date, all remaining dates are within this timezone and param &quot;TZID&quot; is set.<br>
+If none of the above rules are applicable, DATE-TIME and local date is set default.
+</p>
+<p>
+Notice, use function <a href="#transformDateTime">transformDateTime</a> to convert a datetime from one time zone to another.
+</p>
+<p>EXDATEs are automatically sorted in ascending order (Y-m-d[-H-i-s]).</p>
+<p>
+In spite of the fact that EXDATE may contain a (comma separated) list of values,
+a strong recommendation is to split a EXDATE &quot;list&quot; into multiple single EXDATE entrys.
+</p>
+<p>Parameters, if any, will be ordered as prescribed in [RFC5545].</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;exdate&quot;, exdates [, params [, propOrderNo ]] )</p>
+<p class="comment">exdates<sup>1</sup>      = (array) ( date *[, date ] )
+date          = array( (int) year
+                     , (int) month
+                     , (int) day
+                    [, (int) hour
+                     , (int) min
+                     , (int) sec
+                    [, tz ]] )
+date<sup>1</sup>         = (array) ( &quot;year&quot;  =&gt; (int) year
+                        , &quot;month&quot; =&gt; (int) month
+                        , &quot;day&quot;   =&gt; (int) day
+                       [, &quot;hour&quot;  =&gt; (int) hour
+                        , &quot;min&quot;   =&gt; (int) min
+                        , &quot;sec&quot;   =&gt; (int) sec
+                       [, &quot;tz&quot;    =&gt; tz ]] )
+date          = (array) ( &quot;timestamp&quot; =&gt; (int) timestamp [, &quot;tz&quot; =&gt; tz])
+                // <span class="comment">timestamp without tz will result in a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+date          = (string) date/datetime string<sup>*</sup>
+tz            = (string) &lt;timezone identifier&gt; / offset
+                // <span class="comment">timezone will be used as tzidparam (below), if tzidparam not set</span>
+offset        = (int) (+/-)HHmm[ss] // <span class="comment">(arr/str) local date + UTC offset will result in a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+params<sup>2</sup>       = (array) ([(datetimeparam/dateparam)&nbsp;/ tzidparam] *[,xparams])
+datetimeparam = &quot;VALUE&quot; =&gt; &quot;DATE-TIME&quot; // <span class="comment">default, output as date-time</span>
+dateparam     = &quot;VALUE&quot; =&gt; &quot;DATE&quot; // <span class="comment">output as DATE</span>
+tzidparam     = &quot;TZID&quot; =&gt; (string) &lt;timezone identifier&gt;
+xparams       = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo   = (int) order number             // <span class="comment">1=1st, 2=2nd etc</span>
+<br>date/datetime string<sup>*</sup> recommended formats
+    &quot;20110625&quot;,            &quot;2011-06-25&quot;,          &quot;2011/06/26&quot;
+    &quot;20110625051015&quot;,      &quot;20110625 051015&quot;
+    &quot;20110625T051015&quot;,     &quot;20110625t051015&quot;
+    &quot;2011-06-25 05:10:15&quot;, &quot;2011-06-25T05:10:15&quot;, &quot;2011-06-25t05:10:15&quot;
+    &quot;2011/06/25 05:10:15&quot;, &quot;2011/06/25T05:10:15&quot;, &quot;2011/06/25t05:10:15&quot;
+    trailing characters (digits), if exists, will be interpreted as offset/timezone
+    other string formats, acceptable by <em>PHP</em> strtotime function, may (would) work
+    <span class="commsnt">(notice <a href="#date_restriction">date restriction</a>)</span></p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;exdate&quot;, array( array( 2006, 8, 14, 16, 0, 0 ));
+                    <span class="comment">// exclude 2006-08-14 16.00.00 (local date) from recurrence pattern</span>
+.. .
+</p>
+<p class="label">Example 2</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;exdate&quot;
+                    , array( array(&quot;year&quot; =&gt;,2006,&quot;month&quot; =&gt; 8,&quot;day&quot;=&gt; 11))
+                    , array( &quot;VALUE&quot; =&gt; &quot;DATE&quot; ));
+                   <span class="comment">// exclude 2006-08-11 from recurrence pattern;</span>
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="EXRULE"></a><h3>3.2.21 EXRULE</h3>
+<p>
+This property defines a rule or repeating pattern for an exception to a recurrence set and is OPTIONAL
+and MAY occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a> components.
+</p>
+<p>EXRULE is deprecated in [RFC5545]!</p>
+<h5>Create EXRULE</h5>
+<p>If set, returns [RFC2445] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createExrule()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createExrule();
+.. .
+</p>
+<h5>Delete EXRULE</h5>
+<p>Remove EXRULE from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;EXRULE&quot; )</p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$vtodo-&gt;deleteProperty( &quot;EXRULE&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Delete EXRULE property no 2.</p>
+<p class="example">&lt;?php
+.. .
+$vjournal-&gt;deleteProperty( &quot;EXRULE&quot;, 2 );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p>Deleting all EXRULE properties.</p>
+<p class="example">&lt;?php
+.. .
+while( $vjournal-&gt;deleteProperty( &quot;EXRULE&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get EXRULE</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;EXRULE&quot; )</p>
+<p class="comment">output = recur<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;exrule&quot;, propOrderNo/FALSE, TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; recur<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( &quot;EXRULE&quot;, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">Get propOrderNo EXRULE</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$exrule = $vtodo-&gt;getProperty( &quot;exrule&quot; );
+.. .
+</p>
+<h5>Set EXRULE</h5>
+<p>
+Insert property value.
+Notice, use function <a href="#transformDateTime">transformDateTime</a>to change a local datetime to a UTC datetime.
+</p>
+<p>Parameters, will be ordered as prescribed in [RFC5545].</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;exrule&quot;, recur [, xparams [, propOrderNo ]] )</p>
+See rules in detail in <a href="http://kigkonsult.se/downloads/dl.php?f=rfc2445" title="RFC2445" target="_blank">RFC2445</a> - Internet Calendaring and Scheduling Core Object Specification (iCalendar).
+<p class="comment">recur<sup>1</sup>      = (array) ( "FREQ" =&gt; freq
+     // <span class="comment">either UNTIL or COUNT may appear in a &quot;recur&quot;,
+        but UNTIL and COUNT MUST NOT occur in the same &quot;recur&quot;</span>
+                  [, &quot;UNTIL&quot; &quot;=&gt;&quot; >enddate ]
+                  [, &quot;COUNT&quot; &quot;=&gt;&quot; 1*DIGIT ]
+     // <span class="comment">the rest of these keywords are optional,
+        but MUST NOT occur more than once</span>
+                  [, &quot;INTERVAL&quot;   &quot;=&gt;&quot; 1*DIGIT ]
+                  [, &quot;BYSECOND&quot;   &quot;=&gt;&quot; byseclist ]
+                  [, &quot;BYMINUTE&quot;   &quot;=&gt;&quot; byminlist ]
+                  [, &quot;BYHOUR&quot;     &quot;=&gt;&quot; byhrlist ]
+                  [, &quot;BYDAY&quot;      &quot;=&gt;&quot; bywdaylist ]
+                  [, &quot;BYMONTHDAY&quot; &quot;=&gt;&quot; bymodaylist ]
+                  [, &quot;BYYEARDAY&quot;  &quot;=&gt;&quot; byyrdaylist ]
+                  [, &quot;BYWEEKNO&quot;   &quot;=&gt;&quot; bywknolist ]
+                  [, &quot;BYMONTH&quot;    &quot;=&gt;&quot; bymolist ]
+                  [, &quot;BYSETPOS&quot;   &quot;=&gt;&quot; bysplist ]
+                  [, &quot;WKST&quot;       &quot;=&gt;&quot; weekday ]
+                  [, x-name       &quot;=&gt;&quot; (string) text ] )
+freq        = &quot;SECONDLY&quot; /
+              &quot;MINUTELY&quot; /
+              &quot;HOURLY&quot;   /
+              &quot;DAILY&quot;    /
+              &quot;WEEKLY&quot;   /
+              &quot;MONTHLY&quot;  /
+              &quot;YEARLY&quot;
+enddate     = date // <span class="comment">a DATE value or a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME value</span>
+date        = (array) ( &quot;year&quot;  =&gt; (int) year
+                      , &quot;month&quot; =&gt; (int) month
+                      , &quot;day&quot;   =&gt; (int) day
+                     [, &quot;hour&quot;  =&gt; (int) hour
+                      , &quot;min&quot;   =&gt; (int) min
+                      , &quot;sec&quot;   =&gt; (int) sec ])
+date        = (array) ( &quot;timestamp&quot; =&gt; (int) timestamp ) // <span class="comment">results in a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+date        = (string) date/datetime string<sup>*</sup>
+byseclist   = seconds
+byseclist   = (array) (seconds *(, seconds ))
+seconds     = 1DIGIT / 2DIGIT ;0 to 59
+byminlist   = minutes
+byminlist   = (array) ( minutes *(, minutes ))
+minutes     = 1DIGIT / 2DIGIT ;0 to 59
+byhrlist    = hour
+byhrlist    = (array) ( hour *(, hour ))
+hour        = 1DIGIT / 2DIGIT ;0 to 23
+bywdaylist  = weekdaynum
+bywdaylist  = (array) ( weekdaynum *("," weekdaynum ))
+weekdaynum  = (array) ( [([plus] ordwk / minus ordwk)], &quot;DAY&quot; =&gt; weekday )
+plus        = &quot;+&quot;
+minus       = &quot;-&quot;
+ordwk       = 1DIGIT / 2DIGIT ;1 to 53
+weekday     = &quot;SU&quot; / &quot;MO&quot; / &quot;TU&quot; / &quot;WE&quot; / &quot;TH&quot; / &quot;FR&quot; / &quot;SA&quot;
+                ; Corresponding to
+                ; SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
+                ; FRIDAY, SATURDAY and SUNDAY days of the week.
+bymodaylist = monthdaynum
+bymodaylist = (array) ( monthdaynum *(, monthdaynum ))
+monthdaynum = ( [plus] ordmoday ) / ( minus ordmoday )
+ordmoday    = 1DIGIT / 2DIGIT ;1 to 31
+byyrdaylist = yeardaynum
+byyrdaylist = (array) ( yeardaynum *(, yeardaynum ))
+yeardaynum  = ( [plus] ordyrday ) / ( minus ordyrday )
+ordyrday    = 1DIGIT / 2DIGIT / 3DIGIT ;1 to 366
+bywknolist  = weeknum
+bywknolist  = (array) ( weeknum *(, weeknum ))
+weeknum     = ( [plus] ordwk ) / ( minus ordwk )
+bymolist    = monthnum
+bymolist    = (array) ( monthnum *(, monthnum ))
+monthnum    = 1DIGIT / 2DIGIT ;1 to 12
+bysplist    = setposday
+bysplist    = (array) ( setposday *(, setposday ))
+setposday   = yeardaynum
+xparams<sup>2</sup>    = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo = (int) order number                              // <span class="comment">1=1st, 2=2nd etc</span>
+<br>date/datetime string<sup>*</sup> recommended formats
+    &quot;20110625&quot;,            &quot;2011-06-25&quot;,          &quot;2011/06/26&quot;
+    &quot;20110625051015&quot;,      &quot;20110625 051015&quot;
+    &quot;20110625T051015&quot;,     &quot;20110625t051015&quot;
+    &quot;2011-06-25 05:10:15&quot;, &quot;2011-06-25T05:10:15&quot;, &quot;2011-06-25t05:10:15&quot;
+    &quot;2011/06/25 05:10:15&quot;, &quot;2011/06/25T05:10:15&quot;, &quot;2011/06/25t05:10:15&quot;
+    other string formats, acceptable by <em>PHP</em> strtotime function, may (would) work
+    <span class="comment">(notice <a href="#date_restriction">date restriction</a>)</span></p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty(&nbsp;&quot;Exrule&quot;
+             ,&nbsp;array( &quot;FREQ&quot;       =&gt; &quot;MONTHLY&quot;
+                    , &quot;UNTIL&quot;      =&gt; &quot;20060831&quot;
+   // <span class="comment">DATE / DATE-TIME in <a class="ref" href="#DATE_WITH_UTC_TIME">UTC</a> format; string/array, see <a class="ref" href="#CREATED">CREATED</a> format</span>
+                    , &quot;INTERVAL&quot;   =&gt; 2
+                    , &quot;WKST&quot;       =&gt; &quot;SU&quot;
+                    , &quot;BYSECOND&quot;   =&gt; 2
+                    , &quot;BYMINUTE&quot;   =&gt; array( 2, -4, 6 )                // (*)
+                    , &quot;BYHOUR&quot;     =&gt; array( 2, 4, -6 )                // (*)
+                    , &quot;BYMONTHDAY&quot; =&gt; -2                               // (*)
+                    , &quot;BYYEARDAY&quot;  =&gt; 2                                // (*)
+                    , &quot;BYWEEKNO&quot;   =&gt; array( 2, -4, 6 )                // (*)
+                    , &quot;BYMONTH&quot;    =&gt; 2                                // (*)
+                    , &quot;BYSETPOS&quot;   =&gt; array( 2, -4, 6 )                // (*)
+                    , &quot;BYday&quot;      =&gt; array( array(-2, &quot;DAY&quot; =&gt; &quot;WE&quot; )
+                                           , array( 3, &quot;DAY&quot; =&gt; &quot;TH&quot;)
+                                           , array( 5, &quot;DAY&quot; =&gt; &quot;FR&quot;)
+                                           , array(    &quot;DAY&quot; =&gt; &quot;MO&quot;)) // (**)
+                    , &quot;X-NAME&quot;     =&gt; &quot;x-value&quot; )
+            , array( &quot;key&quot;   =&gt; &quot;xparamValue&quot; ));
+
+$vtodo-&gt;setProperty( >&quot;exrule&quot;
+            , array( &quot;FREQ&quot;        =&gt; &quot;WEEKLY&quot;
+                   , &quot;COUNT&quot;       =&gt; 2
+                   , &quot;INTERVAL&quot;    =&gt; 2
+                   , &quot;WKST&quot;        =&gt; &quot;SU&quot;
+                   , &quot;BYSECOND&quot;    =&gt; array( -2, 4, 6 )                // (*)
+                   , &quot;BYMINUTE&quot;    =&gt; -2                               // (*)
+                   , &quot;BYHOUR&quot;      =&gt; 2                                // (*)
+                   , &quot;BYMONTHDAY&quot;  =&gt; array( 2, -4, 6 )                // (*)
+                   , &quot;BYYEARDAY&quot;   =&gt; array( -2, 4, 6 )                // (*)
+                   , &quot;BYWEEKNO&quot;    =&gt; -2                               // (*)
+                   , &quot;BYMONTH&quot;     =&gt; array( 2, 4, -6 )                // (*)
+                   , &quot;BYSETPOS&quot;    =&gt; -2                               // (*)
+                   , &quot;BYday&quot;       =&gt; array( 5, &quot;DAY&quot; =&gt; &quot;WE&quot; )        // (**)
+                   , &quot;X-NAME&quot;      =&gt; &quot;x-value&quot;  )
+            , array( &quot;key&quot;   =&gt; &quot;xparamValue&quot; ));
+  // <span class="comment">(*)  single value/array of values</span>
+  // <span class="comment">(**) single value array /array of arrays</span>
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="FREEBUSY_PROP"></a><h3>3.2.22 FREEBUSY</h3>
+<p>
+The property defines one or more free or busy time intervals in a <a href="#VFREEBUSY">VFREEBUSY</a>
+<strong>calendar</strong> component.
+<p>
+<p>The value type for FREEBUSY is PERIOD. A PERIOD is a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME/DATE-TIME or a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME/duration.</p>
+<h5>Create FREEBUSY</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createFreebusy()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createfreebusy();
+.. .
+</p>
+<h5>Delete FREEBUSY</h5>
+<p>Remove FREEBUSY from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;FREEBUSY&quot; )</p>
+<p class="label">Example 1</p>
+<p>Delete (single/first) FREEBUSY property</p>
+<p class="example">&lt;?php
+.. .
+$vfreebusy-&gt;deleteProperty( &quot;FREEBUSY&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Delete FREEBUSY property no 2.</p>
+<p class="example">&lt;?php
+.. .
+$vfreebusy-&gt;deleteProperty( &quot;FREEBUSY&quot;, 2 );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p>Deleting all FREEBUSY properties.</p>
+<p class="example">&lt;?php
+.. .
+while( $vfreebusy-&gt;deleteProperty( &quot;FREEBUSY&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get FREEBUSY</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;FREEBUSY&quot; )</p>
+<p class="comment">output = array( &quot;fbtyp&quot; =&gt; freebusytype<sup>1</sup> , periods<sup>2</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( &quot;FREEBUSY&quot;, propOrderNo/FALSE , TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( &quot;value&quot; =&gt; array(&quot;fbtype&quot; =&gt; freebusytype<sup>1</sup> ,periods<sup>2</sup>)
+              , &quot;params&quot; =&gt; xparams<sup>3</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( &quot;FREEBUSY&quot;, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">Get propOrderNo FREEBUSY</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$freebusy = $vfreebusy-&gt;getProperty( &quot;FREEBUSY&quot; );
+.. .
+</p>
+<h5>Set FREEBUSY</h5>
+Insert property value. A FREEBUSY input date is always a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME.
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;freebusy&quot;,freebusytype,fbperiods [,xparams [,propOrderNo ]] )</p>
+<p class="comment">freebusytype<sup>1</sup>     = one of &quot;FREE&quot;
+                        / &quot;BUSY&quot; <b>Default</b>
+                        / &quot;BUSY-UNAVAILABLE&quot;
+                        / &quot;BUSY-TENTATIVE&quot;
+                        /  x-name
+fbperiods         = (array) ( periods<sup>2</sup> )&nbsp;
+periods<sup>2</sup>          = (array) ( startdate, enddate/duration ) /
+                    (array) ( *[, (array) ( startdate, enddate/duration )] )
+startdate/enddate = (array) ( (int) year
+                            , (int) month
+                            , (int) day
+                            , (int) hour
+                            , (int) min
+                            , (int) sec )
+startdate/enddate = (array) ( &quot;year&quot;  =&gt; (int) year
+                            , &quot;month&quot; =&gt; (int) month
+                            , &quot;day&quot;   =&gt; (int) day
+                            , &quot;hour&quot;  =&gt; (int) hour
+                            , &quot;min&quot;   =&gt; (int) min
+                            , &quot;sec&quot;   =&gt; (int) sec ) // <span class="comment">output format</span>
+startdate/enddate = (array) ( &quot;timestamp&quot; =&gt; (int) timestamp ) // <span class="comment">results in a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+startdate/enddate = (string) datetime string<sup>*</sup>
+                    // <span class="comment">startdate/enddate MUST be an <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+duration          = (array) ( (int) week / FALSE
+                           [, (int) day / FALSE
+                            , (int) hour
+                            , (int) min
+                            , (int) sec] )
+duration          = (array) ( &quot;week&quot; =&gt; (int) week / FALSE
+                           [, &quot;day&quot;  =&gt; (int) day / FALSE
+                           [, &quot;hour&quot; =&gt; (int) hour
+                            , &quot;min&quot;  =&gt; (int) min
+                            , &quot;sec&quot;  =&gt; (int) sec ]] ); // <span class="comment">output format</span>
+duration          = (array) ( &quot;sec&quot;  =&gt; (int) sec )
+duration          = (string) dur-value
+                        = ([&quot;+&quot;]/&quot;-&quot;) &quot;P&quot; (dur-date/dur-time/dur-week)
+dur-date          = dur-day [dur-time]
+dur-time          = &quot;T&quot; (dur-hour / dur-minute / dur-second)
+dur-week          = 1*DIGIT &quot;W&quot;
+dur-hour          = 1*DIGIT &quot;H&quot; [dur-minute]
+dur-minute        = 1*DIGIT &quot;M&quot; [dur-second]
+dur-second        = 1*DIGIT &quot;S&quot;
+dur-day           = 1*DIGIT &quot;D&quot;
+xparams<sup>3 </sup>          = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo       = (int) order number                              // <span class="comment">1=1st, 2=2nd etc</span>
+<br>date/datetime string<sup>*</sup> recommended formats
+    &quot;20110625051015&quot;,      &quot;20110625 051015&quot;
+    &quot;20110625T051015&quot;,     &quot;20110625t051015&quot;
+    &quot;2011-06-25 05:10:15&quot;, &quot;2011-06-25T05:10:15&quot;, &quot;2011-06-25t05:10:15&quot;
+    &quot;2011/06/25 05:10:15&quot;, &quot;2011/06/25T05:10:15&quot;, &quot;2011/06/25t05:10:15&quot;
+    other string formats, acceptable by <em>PHP</em> strtotime function, may (would) work
+    <span class="comment">(notice <a href="#date_restriction">date restriction</a>)</span></p>
+<p class="label">Example</p>
+See rules in detail in <a href="http://kigkonsult.se/downloads/dl.php?f=rfc2445" title="RFC2445" target="_blank">RFC2445</a> - Internet Calendaring and Scheduling Core Object Specification (iCalendar).
+<p class="example">&lt;?php
+.. .
+$fdate1 = array ( 2001, 1, 1, 1, 1, 1 );
+alt.
+$fdate1 = array ( &quot;year&quot;  =&gt; 2001
+                , &quot;month&quot; =&gt; 1
+                , &quot;day&quot;   =&gt; 1
+                , &quot;hour&quot;  =&gt; 1
+                , &quot;min&quot;   =&gt; 1
+                , &quot;sec&quot;   =&gt; 1 );
+$fdate2 = array ( 2002, 2, 2, 2, 2, 2 );
+$fdate3 = array ( 2003, 3, 3, 3, 3, 3 );
+$fdate4 = &quot;4 April 2005 4:4:4&quot;;
+$fdate7 = array ( &quot;year&quot;  =&gt; 2007
+                , &quot;month&quot; =&gt; 7
+                , &quot;day&quot;   =&gt; 7 );
+$fdur6  = array ( &quot;week&quot; =&gt; 0
+                , &quot;day&quot;  =&gt; 5
+                , &quot;hour&quot; =&gt; 5
+                , &quot;min&quot;  =&gt; 5
+                , &quot;sec&quot;  =&gt; 5 );
+$fdur7  = array ( 0, 0, 6 ); // <span class="comment">duration for 6 hours</span>
+$fdur8  = &quot;P2D&quot;;             // <span class="comment">duration two days</span>
+$freebusy-&gt;setProperty &quot;freebusy&quot;
+                      , &quot;FREE&quot;
+                      , array( array( $fdate1, $fdate2 )
+                             , array( $fdate3, $fdur6 )
+                             , array( $fdate4, $fdate5 )));
+$freebusy-&gt;setProperty(&quot;freebusy&quot;
+                      , &quot;Busy&quot;
+                      , array( array( array( $fdate1, $fdate2 )
+                             , array( $fdate3, $fdur8 )
+                             , array( $fdate4, $fdur7 )
+                             , array( $fdate1, $fdate3 )));
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="GEO"></a><h3>3.2.23 GEO</h3>
+<p>
+This property specifies information related to the global position for the activity specified by
+<a href="#VEVENT">VEVENT</a> and <a href="#VTODO">VTODO</a> components and is OPTIONAL and MUST NOT occur more than once.
+</p>
+<p>Value type for latitude and longitude is FLOAT.</p>
+<p class="quotes">Values for latitude and longitude shall be expressed as decimal
+fractions of degrees. Whole degrees of latitude shall be represented by
+a two-digit decimal number ranging from 0 through 90. Whole degrees
+of longitude shall be represented by a decimal number ranging from 0
+through 180. When a decimal fraction of a degree is specified, it shall
+be separated from the whole number of degrees by a decimal point.</p>
+<p>The output (float) latitude and longitude values are presented up to six decimals.</p>
+<p>Using the non-standard directive &quot;GEOLOCATION&quot; when calling iCalcreator
+ <a href="#geoLocation"><em>calendar</em></a> or <a href="#geoLocation_PROP">component</a>
+ getProperty method, iCalcreator returns output supporting<br>
+ ISO6709 &quot;Standard representation of geographic point location by coordinates&quot;<br>
+ by combining the <a href="#LOCATION">LOCATION</a> and <a href="#GEO">GEO</a> property values
+ (only if <a href="#GEO">GEO</a> is set).
+</p>
+<h5>Create GEO</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createGeo()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createGeo();
+.. .
+</p>
+<h5>Delete GEO</h5>
+<p>Remove GEO from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;GEO&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;GEO&quot; );
+.. .
+</p>
+<h5>Get GEO</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;GEO&quot; )</p>
+<p class="comment">output = array( &quot;latitude&quot;  =&gt; &lt;latitude&gt;
+              , &quot;longitude&quot; =&gt; &lt;longitude&gt;))</p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;GEO&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot; =&gt; array ( &quot;latitude&quot;  =&gt; &lt;latitude&gt;
+                                 , &quot;longitude&quot; =&gt; &lt;longitude&gt;))
+              , &quot;params&quot; =&gt; xparams<sup>1</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$geo = $vevent-&gt;getProperty( &quot;GEO&quot; );
+.. .
+</p>
+<h5>Set GEO</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;geo&quot;, latitude, longitude [, xparams ] )</p>
+<p class="comment">latitude  = (float) latitude
+longitude = (float) longitude
+xparams<sup>1</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;geo&quot;, 11.23456, -23.45678 );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="LAST-MODIFIED"></a><h3>3.2.24 LAST-MODIFIED</h3>
+<p>
+The property specifies the date and time that the information associated with the <strong>calendar</strong>
+component was last revised in the <strong>calendar</strong> store.
+The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>,
+<a href="#VTODO">VTODO</a>,  <a href="#VJOURNAL">VJOURNAL</a> and <a href="#VTIMEZONE">VTIMEZONE</a> components.
+</p>
+<p>The value type for LAST-MODIFIED is <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME.</p>
+<p>For methods and formatting, explore the <a href="#CREATED">CREATED</a> property.</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="LOCATION"></a><h3>3.2.25 LOCATION</h3>
+<p>
+The property defines the intended venue for the activity defined by a <strong>calendar</strong> component.
+The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a> and <a href="#VTODO">VTODO</a> components.
+</p>
+<p>The value type for LOCATION is TEXT.</p>
+<p>Using the non-standard directive &quot;GEOLOCATION&quot; when calling iCalcreator
+ <a href="#geoLocation"><em>calendar</em></a> or <a href="#geoLocation_PROP">component</a>
+ getProperty method, iCalcreator returns output supporting<br>
+ISO6709 &quot;Standard representation of geographic point location by coordinates&quot;,<br>
+by combining the <a href="#LOCATION">LOCATION</a> and <a href="#GEO">GEO</a> property values
+ (only if <a href="#GEO">GEO</a> is set).
+</p>
+<h5>Create LOCATION</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createLocation()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createLocation();
+.. .
+</p>
+<h5>Delete LOCATION</h5>
+<p>Remove LOCATION from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;LOCATION&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;LOCATION&quot; );
+.. .
+</p>
+<h5>Get LOCATION</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;LOCATION&quot; )</p>
+<p class="comment">output = location<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;LOCATION&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; location<sup>1</sup>
+              , &quot;params&quot; =&gt; param<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$location = $vevent-&gt;getProperty( &quot;LOCATION&quot; );
+.. .
+</p>
+<h5>Set LOCATION</h5>
+<p>Insert property value.</p>
+<p>Parameters, if any, will be ordered as prescribed in [RFC5545].</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;location&quot;, location [, param] )</p>
+<p class="comment">location<sup>1</sup> = (string) Value type TEXT
+params<sup>2</sup>   = (array) ( [&quot;ALTREP&quot; =&gt; (string) &quot;&lt;an alternate text representation, URI&gt;&quot;]
+                  [, &quot;LANGUAGE&quot; =&gt; (string) &quot;lang<sup>*</sup>&quot;]
+                 *[, xparams ]
+xparams   = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+lang<sup>*</sup>     = as defined in [RFC5646]</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;location&quot;, &quot;Buckingham Palace&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="ORGANIZER"></a><h3>3.2.26 ORGANIZER</h3>
+<p>
+The property defines the organizer for a <strong>calendar</strong> component and is OPTIONAL
+and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>,
+<a href="#VJOURNAL">VJOURNAL</a> and <a href="#VFREEBUSY">VFREEBUSY</a> components.
+</p>
+<p>This value type for ORGANIZER is URI, a <strong>calendar</strong> user address.</p>
+<h5>Create ORGANIZER</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createOrganizer()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createOrganizer();
+.. .
+</p>
+<h5>Delete ORGANIZER</h5>
+<p>Remove ORGANIZER from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;ORGANIZER&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;ORGANIZER&quot; );
+.. .
+</p>
+<h5>Get ORGANIZER</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;ORGANIZER&quot; )</p>
+<p class="comment">output = organizer<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;ORGANIZER&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; organizer<sup>1</sup>
+              , &quot;params&quot; =&gt; params<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$organizer = $vevent-&gt;getProperty( &quot;ORGANIZER&quot; );
+.. .
+</p>
+<h5>Set ORGANIZER</h5>
+<p>Insert property value.
+Property value must be prefixed by protocol (ftp://, http://,mailto:, file://.. . ref. rfc 1738), &quot;mailto:&quot; prefixed if missing.
+Also DIR parameter must be prefixed by protocol.
+SENT-BY parameter must use protocol &quot;mailto:&quot;, prefixed if missing.
+</p>
+<p>Parameters, if any, will be ordered as prescribed in [RFC5545].</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;organizer&quot;, organizer [, params] )</p>
+<p class="comment">organizer<sup>1</sup> = (string) a <strong>calendar</strong> user address (cal-address), a URI as defined by
+             [RFC 1738] or any other IANA registered form for a URI.
+params<sup>2</sup>    = (array) ( [ &quot;LANGUAGE&quot; =&gt; (string) &quot;lang<sup>*</sup>&quot; (applies to the CN parameter value) ]
+                       [, &quot;CN&quot;      =&gt; (string) &quot;common name to be associated with the
+                                         <strong>calendar</strong> user specified by the property&quot;]
+                       [, &quot;DIR&quot;     =&gt; (string) &quot;reference to a directory entry associated
+                                         with the <strong>calendar</strong> user specified by the property&quot; ]
+                       [, &quot;SENT-BY&quot; =&gt; (string) (cal-address, above)
+                                         &quot;single <strong>calendar</strong> user that is acting on behalf
+                                         of the <strong>calendar</strong> user specified by the property&quot; ]
+                      *[, xparams ]
+xparams    = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+lang<sup>*</sup>      = as defined in [RFC5646]</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$dir = &quot;ldap://domain.com:6666/o=3DDC%20Comp,c=3DUS??(cn=3DJohn%20Doe)&quot;;
+$vevent-&gt;setProperty( &quot;organizer&quot;
+                    , &quot;ical@domain.com&quot;
+                    , array( &quot;CN&quot;      =&gt; &quot;John Doe&quot;
+                           , &quot;DIR&quot;     =&gt; $dir
+                           , &quot;SENT-BY&quot; =&gt; &quot;secretary@domain.com&quot;
+                           , &quot;X-Key1&quot;  =&gt; &quot;X-Value1&quot;
+                           , &quot;X-Key2&quot;  =&gt; &quot;X-Value2&quot; ));
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="PERCENT-COMPLETE"></a><h3>3.2.27 PERCENT-COMPLETE</h3>
+<p>
+This property is used by an assignee or delegatee of a <a href="#VTODO">VTODO</a> to
+convey the percent completion of a <a href="#VTODO">VTODO</a> to the Organizer and is
+OPTIONAL and MUST NOT occur more than once.
+</p>
+<p>
+The property value is a positive integer between zero and one hundred.
+A value of "0" indicates the <a href="#VTODO">VTODO</a> has not yet been started.
+A value of "100" indicates that the <a href="#VTODO">VTODO</a> has been completed.
+Integer values in between indicate the percent partially complete.
+</p>
+<h5>Create PERCENT-COMPLETE</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createPercentComplete()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createPercentComplete();
+.. .
+</p>
+<h5>Delete PERCENT-COMPLETE</h5>
+<p>Remove PERCENT-COMPLETE from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;PERCENT-COMPLETE&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vtodo-&gt;deleteProperty( &quot;PERCENT-COMPLETE&quot; )
+.. .
+</p>
+<h5>Get PERCENT-COMPLETE</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;PERCENT-COMPLETE&quot; )</p>
+<p class="comment">output = percent<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;PRIORITY&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; percent<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$percent = $vtodo-&gt;getProperty( &quot;PERCENT-COMPLETE&quot; );
+.. .
+</p>
+<h5>Set PERCENT-COMPLETE</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;Percent-Complete&quot;, percent [, xparams ] )</p>
+<p class="comment">percent<sup>1</sup> = (int) Value type INTEGER
+xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vtodo-&gt;setProperty( &quot;percent-complete&quot;, 90 );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="PRIORITY"></a><h3>3.2.28 PRIORITY</h3>
+<p>
+The property defines the relative priority for a <strong>calendar</strong> component and is OPTIONAL
+and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a> and <a href="#VTODO">VTODO</a> components.
+</p>
+<p>
+The priority is specified as an integer in the range zero to nine.<br>
+A value of zero (US-ASCII decimal 48) specifies an undefined priority.<br>
+A value of one (US-ASCII decimal 49) is the highest priority.<br>
+A value of two (US-ASCII decimal 50) is the second highest priority.<br>
+Subsequent numbers specify a decreasing ordinal priority.<br>
+A value of nine (US-ASCII decimal 58) is the lowest priority.
+</p>
+<h5>Create PRIORITY</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createPriority()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createPriority();
+.. .
+</p>
+<h5>Delete PRIORITY</h5>
+<p>Remove PRIORITY from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;PRIORITY&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;PRIORITY&quot; );
+.. .
+</p>
+<h5>Get PRIORITY</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;PRIORITY&quot; )</p>
+<p class="comment">output = priority<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;PRIORITY&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; priority<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$priority = $vevent-&gt;getProperty( &quot;priority&quot; );
+.. .
+</p>
+<h5>Set PRIORITY</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;priority&quot;, priority [, xparams ] )</p>
+<p class="comment">priority<sup>1</sup> = (int) Value type INTEGER
+xparams<sup>2</sup>  = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;priority&quot;, 3 );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="RDATE"></a><h3>3.2.29 RDATE</h3>
+<p>
+This property defines the list of date/times for a recurrence set and is OPTIONAL and MAY occur
+more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a>,
+<a href="#VTIMEZONE">STANDARD</a> and <a href="#VTIMEZONE">DAYLIGHT</a> components.
+</p>
+<p>
+The default value type for RDATE is DATE-TIME, can be set to DATE or PERIOD (params<sup>2</sup>).
+In <a href="#VTIMEZONE">STANDARD</a> and <a href="#VTIMEZONE">DAYLIGHT</a> components, RDATE MUST be specified as a date-time value type with local time value.
+</p>
+<h5>Create RDATE</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createRdate()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createRdate();
+.. .
+</p>
+<h5>Delete RDATE</h5>
+<p>Remove RDATE from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;RDATE&quot; )</p>
+<p class="label">Example 1</p>
+<p>Delete (single/first) RDATE property.</p>
+<p class="example">&lt;?php
+.. .
+$vtodo-&gt;deleteProperty( &quot;RDATE&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Delete RDATE property no 2.</p>
+<p class="example">&lt;?php
+.. .
+$vjournal-&gt;deleteProperty( &quot;RDATE&quot;, 2 );</p>
+<p class="label">Example 3</p>
+<p>Delete all RDATE properties.</p>
+<p class="example">&lt;?php
+.. .
+while( $vjournal-&gt;deleteProperty( &quot;RDATE&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get RDATE</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;RDATE&quot; )</p>
+<p class="comment">output = dates<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;RDATE&quot;, propOrderNo/FALSE , TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; dates<sup>1</sup>
+              , &quot;params&quot; =&gt; params<sup>2</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( &quot;RDATE&quot;, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">Get propOrderNo RDATE</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$rdates = $vevent-&gt;getProperty( &quot;RDATE&quot; );
+.. .
+</p>
+<h5>Set RDATE</h5>
+<p>Insert property value.</p>
+<p>The value type for RDATE should match the <a href="#DTSTART">DTSTART</a> value type.</p>
+<p>
+If DATE value type is set in params (&quot;VALUE&quot; = &quot;DATE&quot;), all timezone or offset in dates are ignored.<br>
+If no &quot;VALUE&quot; value type is set or if DATE-TIME value type or TZID value is set in params, DATE-TIME (default) value type is set.
+</p>
+<p>
+If &quot;TZID&quot; is set in params,
+all timezone or offset in dates are ignored (note timestamp, below) and DATE-TIME value type is set.<br>
+If empty params and offset in 1st date, all remaining (non-timestamp) dates are set to UTC.<br>
+If no &quot;TZID&quot; is set in params and timezone in 1st date, all remaining dates are within this timezone and param &quot;TZID&quot; is set.<br>
+If none of the above rules are applicable, DATE-TIME and local date is set default.
+</p>
+<p>
+Notice, use function <a href="#transformDateTime">transformDateTime</a> to convert a datetime from one time zone to another.
+</p>
+<p>RDATEs are automatically sorted in ascending order (Y-m-d[-H-i-s]).</p>
+<p>
+In spite of the fact that RDATE may contain a (comma separated) list of values,
+a strong recommendation is to split a RDATE &quot;list&quot; into multiple single RDATE entrys.
+</p>
+<p>Parameters, if any, will be ordered as prescribed in [RFC5545].</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;rdate&quot;, dates [, params [, propOrderNo ]] )</p>
+<p class="comment">dates<sup>1</sup>        = (array) ( date2 *[, date2 ] )
+date2         = date / (array) ( startdate, enddate/duration )
+startdate     = date
+enddate       = date
+date          = (array) ( (int) year
+                        , (int) month
+                        , (int) day
+                       [, (int) int hour
+                        , (int) min
+                        , (int) day
+                        , tz ] )
+date          = (array) ( &quot;year&quot;  =&gt; (int) year
+                        , &quot;month&quot; =&gt; (int) month
+                        , &quot;day&quot;   =&gt; (int) day
+                       [, &quot;hour&quot;  =&gt; (int) hour
+                        , &quot;min&quot;   =&gt; (int) min
+                        , &quot;sec&quot;   =&gt; (int) sec
+                       [, &quot;tz&quot;    =&gt; tz ]] )
+                     // <span class="comment">output format</span>
+date          = (array) ( &quot;timestamp&quot; =&gt; (int) timestamp [, &quot;tz&quot; =&gt; tz ] )
+                // <span class="comment">timestamp without tz will result in a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+date          = (string) date/datetime string<sup>*</sup>
+tz            = &lt;timezone identifier&gt; / offset
+                // <span class="comment">timezone will be used as tzidparam, if tzidparam not set</span>
+offset        = (int) (+/-)HHmm[ss] // <span class="comment">(arr/str) local date + UTC offset will result in a <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+duration      = (array) ( (int) week/false
+                       [, (int) day/false
+                        , (int) hour
+                        , (int) min
+                        , (int) sec] )
+duration      = (array) ([  &quot;week&quot; =&gt; (int) week / FALSE ,] /
+                         [  &quot;day&quot;  =&gt; (int) day / FALSE
+                         [, &quot;hour&quot; =&gt; (int) hour
+                          , &quot;min&quot;  =&gt; (int) min
+                          , &quot;sec&quot;  =&gt; (int) sec ]] );
+                     // <span class="comment">output format, only used keys</span>
+duration      = (array) ( &quot;sec&quot;  =&gt; (int) sec );
+duration      = (string) duration like &quot;P15DT5H0M20S&quot;
+params<sup>2</sup>       = ([tzidparam ( / datetimeparam / dateparam / periodparam )] *[, xparams ] )
+tzidparam     = &quot;TZID&quot; =&gt; (string) &lt;timezone identifier&gt;
+                // <span class="comment">output as local DATE-TIME with timezone identifier</span>
+                // <span class="comment">if tzidparam=&quot;GMT&quot;/&quot;UTC&quot; then</span>
+                // <span class="comment">output date-time is suffixed by 'Z'</span>
+datetimeparam = &quot;VALUE&quot; =&gt; &quot;DATE-TIME&quot;         // <span class="comment">default, output as DATE-TIME</span>
+dateparam     = &quot;VALUE&quot; =&gt; &quot;DATE&quot;              // <span class="comment">output as DATE</span>
+periodparam   = &quot;VALUE&quot; =&gt; &quot;PERIOD&quot;            // <span class="comment">output as PERIOD (datetime)</span>
+xparams       = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo   = (int) order number             // <span class="comment">1=1st, 2=2nd etc</span>
+<br>date/datetime string<sup>*</sup> recommended formats
+    &quot;20110625&quot;,            &quot;2011-06-25&quot;,          &quot;2011/06/26&quot;
+    &quot;20110625051015&quot;,      &quot;20110625 051015&quot;
+    &quot;20110625T051015&quot;,     &quot;20110625t051015&quot;
+    &quot;2011-06-25 05:10:15&quot;, &quot;2011-06-25T05:10:15&quot;, &quot;2011-06-25t05:10:15&quot;
+    &quot;2011/06/25 05:10:15&quot;, &quot;2011/06/25T05:10:15&quot;, &quot;2011/06/25t05:10:15&quot;
+    trailing characters (digits), if exists, will be interpreted as offset/timezone
+    other string formats, acceptable by <em>PHP</em> strtotime function, may (would) work
+    <span class="comment">(notice <a href="#date_restriction">date restriction</a>)</span></p>
+<p class="label">Example</p>
+See rules in detail in <a href="http://kigkonsult.se/downloads/dl.php?f=rfc2445" title="RFC2445" target="_blank">RFC2445</a> - Internet Calendaring and Scheduling Core Object Specification (iCalendar).<br>
+<p class="example">&lt;?php
+.. .
+// $rdate1 = array ( 2001, 1, 1, 1, 1, 1 );
+// alt.
+$rdate1 = array( &quot;year&quot;  =&gt; 2001
+               , &quot;month&quot; =&gt; 1
+               , &quot;day&quot;   =&gt; 1
+               , &quot;hour&quot;  =&gt; 1
+               , &quot;min&quot;   =&gt; 1
+               , &quot;sec&quot;   =&gt; 1
+               , &quot;tz&quot;    =&gt; &quot;GMT&quot; );
+$rdate2 = array( 2002, 2, 2, 2, 2, 2, &quot;GMT&quot; );
+$rdate3 = &quot;3 March 2003 03.03.03&quot;;
+$rdate4 = array( 2004, 4, 4, 4, 4, 4, &quot;GMT&quot; );
+$rdate5 = array( 2005, 10, 5, 5, 5, 5 );
+$rdate8 = array( &quot;year&quot; =&gt; 2007, &quot;month&quot; =&gt; 7, &quot;day&quot; =&gt; 7 );
+$rdur6  = array( &quot;week&quot; =&gt; 0
+               , &quot;day&quot;  =&gt; 0
+               , &quot;hour&quot; =&gt; 5
+               , &quot;min&quot;  =&gt; 5
+               , &quot;sec&quot;  =&gt; 5 );
+$rdur7  = array( 0, 0, 6 );
+  <span class="comment">// duration for 6 hours</span>
+$rdur8  = array( &quot;week&quot; =&gt; 8 );
+  <span class="comment">// duration for 8 weeks</span>
+
+$vevent = &amp; $vcalendar-&gt;newComponent( &quot;vevent&quot; );
+$vevent-&gt;setProperty( &quot;rdate&quot;, array( $rdate1 ));
+  <span class="comment">// one recurrence date, date in 7-params format (DATE-TIME)</span>
+
+$vevent-&gt;setProperty( &quot;rdate&quot;, array( $rdate1, $rdate2 ));
+  <span class="comment">// two dates, date 7-params format (DATE-TIME)</span>
+
+$vevent-&gt;setProperty( &quot;rdate&quot;, array( array( $rdate1, $rdate2 )
+                                    , array( $rdate3, $rdate4 ))
+                             , array( &quot;VALUE&quot; => &quot;PERIOD&quot; ));
+  <span class="comment">// Both fromdate and enddate must have 7 params (DATE-TIME) !!!</span>
+
+$vevent-&gt;setProperty( &quot;rdate&quot;, array( array( $rdate2, $rdur6 ))
+                             , array( &quot;VALUE&quot; => &quot;PERIOD&quot; ));
+  <span class="comment">// one duration (fromdate-duration)</span>
+
+$vevent-&gt;setProperty( &quot;rdate&quot;, array( array( $rdate1, $date2 )
+                                    , array( $rdate3, $rdur7 ))
+                             , array( &quot;VALUE&quot; => &quot;PERIOD&quot; ));
+  <span class="comment">// period, pairs of fromdate+enddate and fromdate-duration</span>
+
+$vevent-&gt;setProperty( &quot;rdate&quot;, array( $rdate5, $date8 ))
+                             , array( &quot;VALUE&quot; => &quot;DATE&quot; ));
+  <span class="comment">// dates in DATE format</span>
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="RECURRENCE-ID"></a><h3>3.2.30 RECURRENCE-ID</h3>
+<p>
+This property is used in conjunction with the <a href="#UID">UID</a> and <a href="#SEQUENCE">SEQUENCE</a>
+property to identify a specific instance of a recurring <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>
+or <a href="#VJOURNAL">VJOURNAL</a> <strong>calendar</strong> component and is OPTIONAL and MAY NOT occur more than once.
+</p>
+<p>
+The property value is the effective value of the <a href="#DTSTART">DTSTART</a> property of the recurrence instance.
+The default value type is DATE-TIME, can be set to DATE (params<sup>2</sup>).
+</p>
+<p>For methods and formatting, explore the <a href="#DTEND">DTEND</a> property.</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="RELATED-TO"></a><h3>3.2.31 RELATED-TO</h3>
+<p>
+The property is used to represent a relationship or reference between one <strong>calendar</strong> component and another
+and is OPTIONAL and MAY occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a> components.
+</p>
+<p>
+The property value consists of the persistent, globally unique identifier of another <strong>calendar</strong> component.
+This value would be represented in a <strong>calendar</strong> component by the <a href="#UID">UID</a> property.
+</p>
+<p>The value type for RELATED-TO is TEXT.</p>
+<h5>Create RELATED-TO</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createRelatedTo()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createRelatedTo();
+.. .
+</p>
+<h5>Delete RELATED-TO</h5>
+<p>Remove RELATED-TO from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;RELATED-TO&quot; )</p>
+<p class="label">Example 1</p>
+<p>Delete /single/first) RELATED-TO property</p>
+<p class="example">&lt;?php
+.. .
+$vtodo-&gt;deleteProperty( &quot;RELATED-TO&quot; )</p>
+<p class="label">Example 2</p>
+<p>Delete RELATED-TO property no 2.</p>
+<p class="example">&lt;?php
+.. .
+$vjournal-&gt;deleteProperty( &quot;RELATED-TO&quot;, 2 );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p>Deleting all RELATED-TO properties.</p>
+<p class="example">&lt;?php
+.. .
+while( $vjournal-&gt;deleteProperty( &quot;RELATED-TO&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get RELATED-TO</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;RELATED-TO&quot; )</p>
+<p class="comment">output = relid<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;RELATED-TO&quot;, propOrderNo/FALSE , TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; relid<sup>1</sup>
+              , &quot;params&quot; =&gt; params<sup>2</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( &quot;RELATED-TO&quot;, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">Get propOrderNo RELATED-TO</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$relatedId = $vtodo-&gt;getProperty( &quot;RELATED-TO&quot; );
+.. .
+</p>
+<h5>Set RELATED-TO</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;Related-To&quot;, relid [, params [, propOrderNo ]] )</p>
+<p class="comment">relid<sup>1</sup>      = (string) Value type TEXT.
+params<sup>2</sup>     = (array) ( [ reltype ] *[, xparams] )
+reltype     = &quot;RELTYPE&quot; =&gt; (&quot;PARENT&quot; (Default)
+                          / &quot;CHILD&quot;
+                          / &quot;SIBLING&quot;
+                          / (string) iana-token
+                          / (string) x-name )
+xparams     = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo = (int) order number             // <span class="comment">1=1st, 2=2nd etc</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vtodo-&gt;setProperty( &quot;related-to&quot;, &quot;19960401-080045-4000F192713@host.com&quot;);
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+<a name="REPEAT"></a><h3>3.2.32 REPEAT</h3>
+<p>
+This property defines the number of time the <a href="#VALARM">ALARM</a> should be repeated, after the initial trigger.
+If the <a href="#VALARM">ALARM</a> triggers more than once, then this property MUST be specified along with the <a href="#DURATION">DURATION</a> property.
+</p>
+<p>The value type for REPEAT is INTEGER.</p>
+<h5>Create REPEAT</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createRepeat()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createRepeat();
+.. .
+</p>
+<h5>Delete REPEAT</h5>
+<p>Remove REPEAT from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;REPEAT&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;deleteProperty( &quot;REPEAT&quot; );
+.. .
+</p>
+<h5>Get REPEAT</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;REPEAT&quot; )</p>
+<p class="comment">output = repeatTimes<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;REPEAT&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; repeatTimes<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$repeat = $vtodo-&gt;getProperty( &quot;REPEAT&quot; );
+.. .
+</p>
+<h5>Set REPEAT</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;repeat&quot;, repeatTimes [, xparams ] )</p>
+<p class="comment">repeatTimes<sup>1</sup> = (int) Value type INTEGER
+xparams<sup>2</sup>     = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;setProperty( &quot;repeat&quot;, 2 );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="REQUEST-STATUS"></a><h3>3.2.33 REQUEST-STATUS</h3>
+<p>
+This property defines the status code returned for a scheduling request and is OPTIONAL and
+MAY occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a> and <a href="#VFREEBUSY">VFREEBUSY</a> components.
+</p>
+<p>The value type for REQUEST-STATUS is TEXT and consists of</p>
+<dl>
+<dt>a short return status component,
+<dd>(in output) a PERIOD character separated 3-tuple of integers, ex 3.11
+<dt>a longer return status description component
+<dt>optionally a statusspecific data component
+</dl>
+<p>In output, the components are separated by (BACKSLASHed) SEMICOLON.</p>
+<h5>Create REQUEST-STATUS</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createRequestStatus()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createRequestStatus();
+.. .
+</p>
+<h5>Delete REQUEST-STATUS</h5>
+<p>Remove REQUEST-STATUS from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;REQUEST-STATUS&quot; )</p>
+<p class="label">Example 1</p>
+<p>Delete (single/first) REQUEST-STATUS property.</p>
+<p class="example">&lt;?php
+.. .
+$vtodo-&gt;deleteProperty( &quot;REQUEST-STATUS&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Delete REQUEST-STATUS property no 2.</p>
+<p class="example">&lt;?php
+.. .
+$vjournal-&gt;deleteProperty( &quot;REQUEST-STATUS&quot;, 2 );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p>Deleting all REQUEST-STATUS properties.</p>
+<p class="example">&lt;?php
+.. .
+while( $vjournal-&gt;deleteProperty( &quot;REQUEST-STATUS&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get REQUEST-STATUS</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;REQUEST-STATUS&quot; )</p>
+<p class="comment">output = array( &quot;statcode&quot; =&gt; statcode<sup>1</sup>
+              , &quot;text&quot;     =&gt; errtext<sup>2</sup>
+            [ , &quot;extdata&quot;  =&gt; extraData<sup>3</sup> ] )</p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;REQUEST-STATUS&quot;, propOrderNo/FALSE, TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( &quot;value&quot; =&gt; array( &quot;statcode&quot; =&gt; statcode<sup>1</sup>
+                                , &quot;text&quot;     =&gt; errtext<sup>2</sup>
+                              [ , &quot;extdata&quot;  =&gt; extraData<sup>3</sup> ] )
+              , &quot;params&quot; =&gt; params<sup>4</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( &quot;REQUEST-STATUS&quot;, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">Get propOrderNo REQUEST-STATUS</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$requestStatus = $vtodo-&gt;getProperty( &quot;REQUEST-STATUS&quot; );
+.. .
+</p>
+<h5>Set REQUEST-STATUS</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;Request-Status&quot;
+           , statcode, errtext [,extraData/FALSE [,params [,propOrderNo]]])</p>
+<p class="comment">statcode<sup>1</sup>   = (int) Hierarchical, numeric return status code
+                          (1*DIGIT &quot;.&quot; 1*DIGIT 1*DIGIT)
+errtext<sup>2</sup>    = (string) Textual status description
+extraData<sup>3</sup>  = (string) Textual exception data.
+             For example, the offending property name and value
+             or complete property line.
+params<sup>4</sup>     = (array) ( [&quot;LANGUAGE&quot; =&gt; (string) &quot;lang<sup>*</sup>&quot;] *[, xparams ] )
+xparams     = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo = (int) order number             // <span class="comment">1=1st, 2=2nd etc</span>
+lang<sup>*</sup>       = as defined in [RFC5646]</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vfreebusy-&gt;setProperty(&quot;request-status&quot;
+                       , 2.00
+                       , &quot;Invalid property value&quot;
+                       , &quot;DTSTART:96-Apr-31&quot;);
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="RESOURCES"></a><h3>3.2.34 RESOURCES</h3>
+<p>
+This property defines the equipment or resources anticipated for an activity specified by a <strong>calendar</strong> entity
+and is OPTIONAL and MAY occur more than once in <a href="#VEVENT">VEVENT</a> and <a href="#VTODO">VTODO</a> components.
+</p>
+<p>The value type for RESOURCES is TEXT.</p>
+<h5>Create RESOURCES</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createResources()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createResources();
+.. .
+</p>
+<h5>Delete RESOURCES</h5>
+<p>Remove RESOURCES from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;RESOURCES&quot; )</p>
+<p class="label">Example 1</p>
+<p>Delete (single/first) RESOURCES property.</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;RESOURCES&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Delete RESOURCES property no 2.</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;RESOURCES&quot;, 2 );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p>Delete all RESOURCES properties.<p>
+<p class="example">&lt;?php
+.. .
+while( $vevent-&gt;deleteProperty( &quot;RESOURCES&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get RESOURCES</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;RESOURCES&quot; )</p>
+<p class="comment">output = resources<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;RESOURCES&quot;, propOrderNo/FALSE, TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; resources<sup>1</sup>
+              , &quot;params&quot; =&gt; params<sup>2</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( &quot;RESOURCES&quot;, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">Get propOrderNo RESOURCES</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$resources = $vtodo-&gt;getProperty( &quot;RESOURCES&quot; );
+.. .
+</p>
+<h5>Set RESOURCES</h5>
+<p>Insert property value.</p>
+<p>
+In spite of the fact that RESOURCES may contain a (comma separated) list of values,
+a strong recommendation is to split a RESOURCES &quot;list&quot; into multiple single RESOURCES entrys.
+</p>
+<p>Parameters, if any, will be ordered as prescribed in [RFC5545].</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;resources&quot;, resources [, params [, propOrderNo ]] )</p>
+<p class="comment">resources<sup>1</sup>  = (string) resource / (array) ( *resource )
+resource    = (string) textual resources or subtypes of the <strong>calendar</strong> component,
+                       can be specified as a list of resources
+                       separated by the COMMA character.
+params<sup>2</sup>     = (array) (
+                   [ &quot;ALTREP&quot; =&gt; (string) &quot;&lt;an alternate text representation, URI&gt;&quot;]
+                   [, &quot;LANGUAGE&quot; =&gt; (string) &quot;lang<sup>*</sup>&quot;]
+                  *[, xparams] )
+xparams     = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo = (int) order number             // <span class="comment">1=1st, 2=2nd etc</span>
+lang<sup>*</sup>       = as defined in [RFC5646]</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;resources&quot;, &quot;COMPUTER PROJECTOR&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="RRULE"></a><h3>3.2.35 RRULE</h3>
+<p>
+This property defines a rule or repeating pattern for recurring <a href="#VEVENT">EVENTs</a>, <a href="#VTODO">TODOs</a>,
+<a href="#VTIMEZONE">STANDARD</a> or <a href="#VTIMEZONE">DAYLIGHT</a> definitions and is OPTIONAL and MAY occur more than once ([RFC2445]),
+SHOULD NOT occur more than once ([RFC5545]).
+</p>
+<h5>Create RRULE</h5>
+<p>If set, returns iCal formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createRrule()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createRrule();
+.. .
+</p>
+<h5>Delete RRULE</h5>
+<p>Remove RRULE from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;RRULE&quot; )</p>
+<p class="label">Example 1</p>
+<p>Delete (single/first) RRULE property.</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;RRULE&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Delete RRULE property no 2.</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;RRULE&quot;, 2 );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p>Delete all RRULE properties.</p>
+<p class="example">&lt;?php
+.. .
+while( $vevent-&gt;deleteProperty( &quot;RRULE&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get RRULE</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;RRULE&quot; )</p>
+<p class="comment">output = recur<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;RRULE&quot;, propOrderNo/FALSE, TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; recur<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( &quot;RRULE&quot;, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">Get propOrderNo RRULE</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$rrules = $vtodo-&gt;getProperty( &quot;RRULE&quot; );
+.. .
+</p>
+<h5>Set RRULE</h5>
+<p>Insert property value.</p>
+<p>Parameters will be ordered as prescribed in [RFC5545].</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;rrule&quot;, recur [, xparams [, propOrderNo ]] )</p>
+<p>
+For rules example see <a href="#EXRULE">Exrule</a> format and in detail in <a href="http://kigkonsult.se/downloads/dl.php?f=rfc2445" title="RFC2445" target="_blank">RFC2445</a> - Internet Calendaring and Scheduling Core Object Specification (iCalendar).
+</p>
+<p class="comment">recur<sup>1</sup>      = see <a href="#EXRULE">Exrule</a>
+xparams<sup>2</sup>    = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo = (int) order number                              // <span class="comment">1=1st, 2=2nd etc</span>
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+<a name="SEQUENCE"></a><h3>3.2.36 SEQUENCE</h3>
+<p>
+This property defines the revision sequence number of the <strong>calendar</strong> component within a sequence of revisions.
+The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>,
+<a href="#VTODO">VTODO</a> and <a href="#VJOURNAL">VJOURNAL</a> components.
+</p>
+<p class="quotes">
+It is monotonically incremented by the <a href="#ORGANIZER">ORGANIZER's</a> CUA (Calendar
+User Agent) each time the <a href="#ORGANIZER">ORGANIZER</a> makes a significant revision
+to the <strong>calendar</strong> component.
+<br><br>
+When the <a href="#ORGANIZER">ORGANIZER</a> makes changes to one of the following
+properties, the sequence number MUST be incremented: <a href="#DTSTART">DTSTART</a>,
+<a href="#DTEND">DTEND</a>, <a href="#DUE">DUE</a>, <a href="#RDATE">RDATE</a>, <a href="#RRULE">RRULE</a>,
+<a href="#EXDATE">EXDATE</a>, <a href="#EXRULE">EXRULE</a>, <a href="#STATUS">STATUS</a>. In addition,
+changes made by the <a href="#ORGANIZER">ORGANIZER</a> to other properties can also force
+the sequence number to be incremented. The <a href="#ORGANIZER">ORGANIZER</a> CUA MUST
+increment the sequence number when ever it makes changes to
+properties in the <strong>calendar</strong> component that the <a href="#ORGANIZER">ORGANIZER</a>
+deems will jeopardize the validity of the participation status of the
+<a href="#ATTENDEE">Attendees</a>. For example, changing the location
+of a meeting from one locale to another distant locale could
+effectively impact the participation status of the <a href="#ATTENDEE">Attendees</a>.
+</p>
+<p>The value type of SEQUENCE is INTEGER.</p>
+<h5>Create SEQUENCE</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createSequence()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createSequence();
+.. .
+</p>
+<h5>Delete SEQUENCE</h5>
+<p>Remove SEQUENCE from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;SEQUENCE&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vtodo-&gt;deleteProperty( &quot;SEQUENCE&quot; );
+.. .
+</p>
+<h5>Get SEQUENCE</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;SEQUENCE&quot; )</p>
+<p class="comment">output = sequence<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;SEQUENCE&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; sequence<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$sequence = $vtodo-&gt;getProperty( &quot;SEQUENCE&quot; );
+.. .
+</p>
+<h5>Set SEQUENCE</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;sequence&quot; [, sequence [, xparams ]] )</p>
+<p class="comment">sequence<sup>1</sup> = (int) Value type INTEGER
+xparams<sup>2</sup>  = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;sequence&quot;, 2 ); <span class="comment">// set sequence number to 2</span>
+.. .
+</p>
+<p class="label">Example 2</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;sequence&quot; ); <span class="comment">// force sequence number to be set to 0
+                                                                        // or, if sequence exists, incremented by 1</span>
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="STATUS"></a><h3>3.2.37 STATUS</h3>
+<p>
+This property defines the overall status or confirmation for the <strong>calendar</strong> component.
+The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>
+and <a href="#VJOURNAL">VJOURNAL</a> components.
+</p>
+<h5>Create STATUS</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createStatus()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createStatus();
+.. .
+</p>
+<h5>Delete STATUS</h5>
+<p>Remove STATUS from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;STATUS&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vtodo-&gt;deleteProperty( &quot;STATUS&quot; );
+.. .
+</p>
+<h5>Get STATUS</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;STATUS&quot; )</p>
+<p class="comment">output = status<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;STATUS&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; status<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$status = $vtodo-&gt;getProperty( &quot;STATUS&quot; );
+.. .
+</p>
+<h5>Set STATUS</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;status&quot;, status [, xparams ] )</p>
+<p class="comment">                          // <span class="comment">Status values for a <a href="#vevent">VEVENT</a></span>
+status<sup>1</sup>  = &quot;TENTATIVE&quot;    // <span class="comment">Indicates event is tentative</span>
+         / &quot;CONFIRMED&quot;    // <span class="comment">Indicates event is definite</span>
+         / &quot;CANCELLED&quot;    // <span class="comment">Indicates event was cancelled</span>
+                          // <span class="comment">Status values for <a href="#VTODO">VTODO</a></span>
+status<sup>1</sup>  = &quot;NEEDS-ACTION&quot; // <span class="comment">Indicates to-do needs action</span>
+         / &quot;COMPLETED&quot;    // <span class="comment">Indicates to-do completed</span>
+         / &quot;IN-PROCESS&quot;   // <span class="comment">Indicates to-do in process of</span>
+         / &quot;CANCELLED&quot;    // <span class="comment">Indicates to-do was cancelled</span>
+                          // <span class="commsnt">Status values for <a href="#VJOURNAL">VJOURNAL</a></span>
+status<sup>1</sup>  = &quot;DRAFT&quot;        // <span class="comment">Indicates journal is draft</span>
+         / &quot;FINAL&quot;        // <span class="comment">Indicates journal is final</span>
+         / &quot;CANCELLED&quot;    // <span class="comment">Indicates journal is removed</span>
+xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;Status&quot;, &quot;COMPLETED&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="SUMMARY"></a><h3>3.2.38 SUMMARY</h3>
+<p>
+This property defines a short (&quot;one line&quot;) summary or subject for the <strong>calendar</strong> component.
+(In &quot;[RFC5545], Recommended Practices&quot;, up to 255 characters) (, analogous to a mail SUBJECT).
+The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>
+and <a href="#VJOURNAL">VJOURNAL</a> components. The property is REQUIRED and MUST occur once in
+<a href="#VALARM">VALARM</a> (EMAIL) <strong>calendar</strong> component.
+</p>
+<p>The value type for SUMMARY is TEXT.</p>
+<h5>Create SUMMARY</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createSummary()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createSummary();
+.. .
+</p>
+<h5>Delete SUMMARY</h5>
+<p>Remove SUMMARY from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;SUMMARY&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;SUMMARY&quot; );
+.. .
+</p>
+<h5>Get SUMMARY</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;SUMMARY&quot; )</p>
+<p class="comment">output = summary<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;SUMMARY&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; summary<sup>1</sup>
+              , &quot;params&quot; =&gt; params<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$summary = $vtodo-&gt;getProperty( &quot;SUMMARY&quot; );
+.. .
+</p>
+<h5>Set SUMMARY</h5>
+<p>Insert property value.</p>
+<p>Parameters, if any, will be ordered as prescribed in [RFC5545].</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;summary&quot;, summary [, params ] )</p>
+<p CLASS="comment">summary<span class="comment">1</span> = (string) Value type TEXT,
+           a short, one line summary about the activity or journal entry.
+params<sup>2</sup>  = array( [&quot;ALTREP&quot;   =&gt; (string) &quot;&lt;an alternate text representation, URI&gt;&quot;]
+                [, &quot;LANGUAGE&quot; =&gt; (string) &quot;lang<sup>*</sup>&quot;]
+               *[, xparams ] )
+xparams  = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+lang<sup>*</sup>    = as defined in [RFC5646]</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;summary&quot;, &quot;This is a summary&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="TRANSP"></a><h3>3.2.39 TRANSP</h3>
+<p>
+This property defines whether an <a href="#VEVENT">EVENT</a> is transparent or not to busy time searches and is OPTIONAL and MUST NOT occur more than once.
+</p>
+<h5>Create TRANSP</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createTransp()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createTransp();
+.. .
+</p>
+<h5>Delete TRANSP</h5>
+<p>Remove TRANSP from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;TRANSP&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;TRANSP&quot; );
+.. .
+</p>
+<h5>Get TRANSP</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;TRANSP&quot; )</p>
+<p class="comment">output = transp<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;TRANSP&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; transp<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$transp = $vtodo-&gt;getProperty( &quot;TRANSP&quot; );
+.. .
+</p>
+<h5>Set TRANSP</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;transp&quot;, transp [, xparams ] )</p>
+<p class="comment">transp<span class="comment">1</span>  = &quot;OPAQUE&quot; / &quot;TRANSPARENT&quot;
+xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty( &quot;transp&quot;, &quot;TRANSPARENT&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="TRIGGER"></a><h3>3.2.40 TRIGGER</h3>
+<p>
+This property specifies when an <a href="#VALARM">ALARM</a> will trigger and is REQUIRED and MUST NOT occur more than once.
+</p>
+<p>
+The default value type is DURATION. The value type can be set to a DATE-TIME value type,
+in which case the value MUST specify an <a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME value.
+</p>
+<h5>Create TRIGGER</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">valarm::createTrigger()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createTrigger();
+.. .
+</p>
+<h5>Delete TRIGGER</h5>
+<p>Remove TRIGGER from component.</p>
+<p class="label">Format</p>
+<p class="format">valarm::deleteProperty( &quot;TRIGGER&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;deleteProperty( &quot;TRIGGER&quot; );
+.. .
+</p>
+<h5>Get TRIGGER</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">valarm::getProperty( &quot;TRIGGER&quot; )</p>
+<p class="comment">output = duration/date</p>
+<p class="label">Format 2</p>
+<p class="format">valarm::getProperty( &quot;TRIGGER&quot;, FALSE , TRUE )</p>
+<p class="comment">output   = array( &quot;value&quot;        =&gt; duration<sup>1</sup>/date<sup>3</sup> )
+                , &quot;params&quot;       =&gt; params<sup>4</sup> )
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$trigger = $vtodo-&gt;getProperty( &quot;TRIGGER&quot; );
+.. .
+</p>
+<h5>Set TRIGGER</h5>
+<p>Insert property value.</p>
+<p>Note, use function <a href="#transformDateTime">transformDateTime</a> to change a (local) datetime to UTC time zone.</p>
+<p class="label">Format 1</p>
+<p class="format">valarm::setProperty( &quot;trigger&quot;, duration<sup>1</sup> [, params<sup>4</sup> ] )</p>
+<p class="label">Format 2</p>
+<p class="format">valarm::setProperty( &quot;trigger&quot;, duration<sup>2</sup> [, params<sup>4</sup> ] )</p>
+<p class="label">Format 3</p>
+<p class="format">valqarm::setProperty( &quot;trigger&quot;, date<sup>3</sup> [, params<sup>4</sup> ] )</p>
+<p class="label">Format</p>
+<p class="format">valarm::setProperty( &quot;trigger&quot;, (int) year / FALSE
+                      , (int) month / FALSE
+                      , (int) day / FALSE
+                     [, (int) week / FALSE
+                     [, (int) hour / FALSE
+                      , (int) min / FALSE
+                      , (int) sec / FALSE
+                     [, relatedStart
+                     [, before
+                     [, params<sup>4</sup> ]]]]] )</p>
+<p class="comment">duration<sup>1</sup> = (array) ( &quot;week&quot;     =&gt; (int) week
+                , &quot;relatedStart&quot; =&gt; relatedStart
+                , &quot;before&quot;       =&gt; before )
+duration<sup>1</sup> = (array) ( &quot;day&quot;  =&gt; (int) day
+                , &quot;hour&quot; =&gt; (int) hour
+                , &quot;min&quot;  =&gt; (int) min
+                , &quot;sec&quot;  =&gt; (int) sec
+                , &quot;relatedStart&quot; =&gt; relatedStart
+                , &quot;before&quot;       =&gt; before )
+relatedStart = (bool) TRUE  : related start (default),
+                      FALSE : related end
+before       = (booL) TRUE  : before relatedStart (default),
+                      FALSE : after relatedStart
+duration<sup>2</sup> = (string) dur-value = ([&quot;+&quot;]/&quot;-&quot;)&quot;P&quot;(dur-date/dur-time/dur-week)
+dur-date     = dur-day [dur-time]
+dur-time     = &quot;T&quot; (dur-hour / dur-minute / dur-second)
+dur-week     = 1*DIGIT &quot;W&quot;
+dur-day      = 1*DIGIT &quot;D&quot;
+dur-hour     = 1*DIGIT &quot;H&quot; [dur-minute]
+dur-minute   = 1*DIGIT &quot;M&quot; [dur-second]
+dur-second   = 1*DIGIT &quot;S&quot;
+date<sup>3</sup>        = (array) ( &quot;year&quot;  =&gt; (int) year // <span class="comment"><a href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+                       , &quot;month&quot; =&gt; (int) month
+                       , &quot;day&quot;   =&gt; (int) day
+                      [, &quot;hour&quot;  =&gt; (int) hour
+                       , &quot;min&quot;   =&gt; (int) min
+                       , &quot;sec&quot;   =&gt; (int) sec ])
+date<sup>3</sup>        = (array) ( &quot;timestamp&quot; =&gt; (int) timestamp ) // <span class="comment"><a class="ref" href="#DATE_WITH_UTC_TIME">UTC</a> DATE-TIME</span>
+date<sup>3</sup>        = (string) datetime string<sup>*</sup>
+params<sup>4</sup>      = (array) ( [[ reltype [, trigRelparam ]] / datetimeparam ] *[, xparams ] )
+reltyp       = &quot;RELATED&quot; =&gt; &quot;START&quot; (default) / &quot;END&quot;
+trigRelparam = &quot;VALUE&quot; =&gt; &quot;DURATION&quot;
+datetimeparam= &quot;VALUE&quot; =&gt; &quot;DATE-TIME&quot; // <span class="comment">mandatory if DATE-TIME</span>
+xparams      = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+<br>datetime string<sup>*</sup> recommended formats
+    &quot;20110625&quot;,            &quot;2011-06-25&quot;,          &quot;2011/06/26&quot;
+    &quot;20110625051015&quot;,      &quot;20110625 051015&quot;
+    &quot;20110625T051015&quot;,     &quot;20110625t051015&quot;
+    &quot;2011-06-25 05:10:15&quot;, &quot;2011-06-25T05:10:15&quot;, &quot;2011-06-25t05:10:15&quot;
+    &quot;2011/06/25 05:10:15&quot;, &quot;2011/06/25T05:10:15&quot;, &quot;2011/06/25t05:10:15&quot;
+    other string formats, acceptable by <em>PHP</em> strtotime function, may (would) work
+    <span class="comment">(notice <a href="#date_restriction">date restriction</a>)</span></p>
+<p class="label">Example 1</p>
+<p>A duration, 1 hour 2 min 3 sec, before start</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;setProperty( &quot;trigger&quot;
+                    , FALSE, FALSE, FALSE, FALSE, 1, 2, 3 );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>A duration, 1 hour 2 min 3 sec, before start</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;setProperty( &quot;trigger&quot;
+                    , array (&quot;hour&quot;=&gt;1,&quot;min&quot;=&gt;2,&quot;sec&quot;=&gt;3 );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p>A duration, 1 hour 2 min 3 sec, before start</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;setProperty( &quot;trigger&quot;
+                    , &quot;PT1H2M3S&quot; );
+.. .
+</p>
+<p class="label">Example 4</p>
+<p>A duration, 1 week after end.</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;setProperty( &quot;trigger&quot;
+                    , FALSE, FALSE, FALSE, 1
+                    , FALSE, FALSE, FALSE, FALSE, FALSE );
+.. .
+</p>
+<p class="label">Example 5</p>
+<p>A duration, 1 week after end.</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;setProperty( &quot;trigger&quot;
+                    , array ( &quot;week&quot; =&gt; 1
+                            , &quot;relatedStart&quot; =&gt; FALSE
+                            , &quot;before&quot;       =&gt; FALSE ));
+.. .
+</p>
+<p class="label">Example 6</p>
+<p>A duration, 1 week after end.</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;setProperty( &quot;trigger&quot;
+                    , &quot;P1W&quot;
+                    , array( &quot;related&quot; =&gt; &quot;END&quot; ));
+.. .
+</p>
+<p class="label">Example 7</p>
+<p class="example">&lt;?php
+.. .
+$valarm-&gt;setProperty( &quot;trigger&quot;
+                    , array( &quot;year&quot; =&gt; 2007
+                           , &quot;month&quot; =&gt; 6
+                           , &quot;day&quot;   =&gt; 5,
+                           , &quot;hour&quot;  =&gt; 2
+                           , &quot;min&quot;   =&gt; 2
+                           , &quot;sec&quot;   =&gt; 3 )
+                    , array( &quot;VALUE&quot; =&gt; &quot;DATE-TIME&quot; ));
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="TZID"></a><h3>3.2.41 TZID</h3>
+<p>
+This property specifies the text value that uniquely identifies the <a href="#VTIMEZONE">VTIMEZONE</a>
+<strong>calendar</strong> component and is REQUIRED, but MUST NOT occur more than once.
+</p>
+<p>The value type for TZID is TEXT.</p>
+<h5>Create TZID</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::createTzid()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createTzid();
+.. .
+</p>
+<h5>Delete TZID</h5>
+<p>Remove TZID from component.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::deleteProperty( &quot;TZID&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vtimezone-&gt;deleteProperty( &quot;TZID&quot; );
+.. .
+</p>
+<h5>Get TZID</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">vtimezone::getProperty( &quot;TZID&quot; )</p>
+<p class="comment">output = tzid<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">vtimezone::getProperty( &quot;TZID&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; tzid<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$tzid = $vtimezone-&gt;getProperty( &quot;TZID&quot; );
+.. .
+</p>
+<h5>Set TZID</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::setProperty( &quot;tzid&quot;, tzid [, xparams ] )</p>
+<p class="comment">tzid<sup>1</sup>    = (string) Value type TEXT
+xparams<sup>2</sup> = (array)( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot; );
+$vcalendar = new vcalendar( $config );
+$vtimezone = &amp; $vcalendar-&gt;newComponent( &quot;vtimezone&quot; );
+$vtimezone-&gt;setProperty( &quot;tzid&quot;, &quot;US-Eastern&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="TZNAME"></a><h3>3.2.42 TZNAME</h3>
+<p>
+This property specifies the customary designation for a <a href="#VTIMEZONE">STANDARD</a> or <a href="#VTIMEZONE">DAYLIGHT</a> description
+and is OPTIONAL and MAY occur more than once.
+</p>
+<p>The value type for TZNAME is TEXT.</p>
+<h5>Create TZNAME</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::createTzname()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createTzname();
+.. .
+</p>
+<h5>Delete TZNAME</h5>
+<p>Remove TZNAME from component.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::deleteProperty( &quot;TZNAME&quot; )</p>
+<p class="label">Example 1</p>
+<p>Delete (single/first) TZNAME property.</p>
+<p class="example">&lt;?php
+.. .
+$vtimezonestd-&gt;deleteProperty( &quot;TZNAME&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Delete TZNAME property no 2.</p>
+<p class="example">&lt;?php
+.. .
+$vtimezonestd-&gt;deleteProperty( &quot;TZNAME&quot;, 2 );
+.. .
+</p>
+<p class="label">Example 3</p>
+<p>Deleting all TZNAME properties.</p>
+<p class="example">&lt;?php
+.. .
+while( $vtimezonestd-&gt;deleteProperty( &quot;TZNAME&quot; ))
+  continue;
+.. .
+</p>
+<h5>Get TZNAME</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">vtimezone::getProperty( &quot;TZNAME&quot; )</p>
+<p class="comment">output = tzname<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">vtimezone::getProperty( &quot;TZNAME&quot;, propOrderNo/FALSE, TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; tzname<sup>1</sup>
+              , &quot;params&quot; =&gt; params<sup>2</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">vtimezone::getProperty( &quot;TZNAME&quot;, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">Get propOrderNo TZNAME</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$tzname = $timezonestandard-&gt;getProperty( &quot;TZNAME&quot; );
+.. .
+</p>
+<h5>Set TZNAME</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::setProperty( &quot;tzname&quot;, tzname [, params [, propOrderNo ]] )</p>
+<p class="comment">tzname<sup>1</sup>     = (string) Value type TEXT
+params<sup>2</sup>     = (array) ( [ &quot;LANGUAGE&quot; =&gt; (string) &quot;lang<sup>*</sup>&quot; ]*[, xparams ] )
+xparams     = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+propOrderNo = (int) order number             // <span class="comment">1=1st, 2=2nd etc</span>
+lang<sup>*</sup>       = as defined in [RFC5646]</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot; );
+$vcalendar = new vcalendar( $config );
+$vtimezone = &amp; $vcalendar-&gt;newComponent( &quot;vtimezone&quot; );
+$vtimezone-&gt;setProperty( &quot;Tzid&quot;, &quot;US-Eastern&quot; );
+$vtimezone-&gt;setProperty( &quot;Last-Modified&quot;, &quot;19870101&quot; );
+$standard  = &amp; $vtimezone-&gt;newComponent( &quot;standard&quot; );
+$standard-&gt;setProperty( &quot;tzname&quot;, &quot;EST&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="TZOFFSETFROM"></a><h3>3.2.43 TZOFFSETFROM</h3>
+<p>
+This property specifies the offset which is in use prior to this <a href="#VTIMEZONE">TIMEZONE</a> observance.
+The property is REQUIRED, but MUST NOT occur more than once in <a href="#VTIMEZONE">STANDARD</a> and <a href="#VTIMEZONE">DAYLIGHT</a> components.
+</p>
+<p>The value type is UTC-OFFSET, &quot;+&quot; / &quot;-&quot; time-hour (2*DIGIT) time-minute (2*DIGIT) [time-second (2*DIGIT)].</p>
+<h5>Create TZOFFSETFROM</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::createTzoffsetfrom()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createTzoffsetfrom();
+.. .
+</p>
+<h5>Delete TZOFFSETFROM</h5>
+<p>Remove TZOFFSETFROM from component.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::deleteProperty( &quot;TZOFFSETFROM&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vtimezonestd-&gt;deleteProperty( &quot;TZOFFSETFROM&quot; );
+.. .
+</p>
+<h5>Get TZOFFSETFROM</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">vtimezone::getProperty( &quot;TZOFFSETFROM&quot; )</p>
+<p class="comment">output = tzoffsetfrom<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">vtimezone::getProperty( &quot;TZOFFSETFROM&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; tzoffsetfrom<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$tzoffsetfrom = $timezonestandard-&gt;getProperty( &quot;TZOFFSETFROM&quot; );
+.. .
+</p>
+<h5>Set TZOFFSETFROM</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::setProperty( &quot;tzoffsetfrom&quot;, tzoffsetfrom [, xparams ] )</p>
+<p class="comment">tzoffsetfrom<sup>1</sup> = (int) (+/-)HHmm[ss] // <span class="comment">UTC offset</span>
+xparams<sup>2</sup>      = (array) ( *[ /string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot; );
+$vcalendar = new vcalendar( $config );
+$vtimezone = &amp; $vcalendar-&gt;newComponent( &quot;vtimezone&quot; );
+$vtimezone-&gt;setProperty( &quot;Tzid&quot;, &quot;US-Eastern&quot; );
+$vtimezone-&gt;setProperty( &quot;Last-Modified&quot;, &quot;19870101&quot; );
+$standard  = &amp; $vtimezone-&gt;newComponent( &quot;standard&quot; );
+$standard-&gt;setProperty( &quot;tzname&quot;, &quot;EST&quot; );
+$standard-&gt;setProperty( &quot;tzoffsetfrom&quot;, &quot;-0500&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="TZOFFSETTO"></a><h3>3.2.44 TZOFFSETTO</h3>
+<p>
+This property specifies the offset which is in use in this <a href="#VTIMEZONE">TIMEZONE</a> observance.
+The property is REQUIRED, but MUST NOT occur more than once in <a href="#VTIMEZONE">STANDARD</a> and <a href="#VTIMEZONE">DAYLIGHT</a> components.
+</p>
+<p>The value type is UTC-OFFSET, &quot;+&quot; / &quot;-&quot; time-hour (2*DIGIT) time-minute (2*DIGIT) [time-second (2*DIGIT)].</p>
+<h5>Create TZOFFSETTO</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::createTzoffsetto()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createTzoffsetto();
+.. .
+</p>
+<h5>Delete TZOFFSETTO</h5>
+<p>Remove TZOFFSETTO from component.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::deleteProperty( &quot;TZOFFSETTO&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$daylight-&gt;deleteProperty( &quot;TZOFFSETTO&quot; );
+.. .
+</p>
+<h5>Get TZOFFSETTO</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">vtimezone::getProperty( &quot;TZOFFSETTO&quot; )</p>
+<p class="comment">output = tzoffsetto<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">vtimezone::getProperty( &quot;TZOFFSETTO&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; tzoffsetto<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$tzoffsetto = $timezonestandard-&gt;getProperty( &quot;TZOFFSETTO&quot; );
+.. .
+</p>
+<h5>Set TZOFFSETTO</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::setProperty( &quot;tzoffsetto&quot;, tzoffsetto [, xparams ] )</p>
+<p class="comment">tzoffsetto<sup>1</sup> = (int) (+/-)HHmm[ss] // <span class="comment">UTC offset</span>
+xparams<sup>2</sup>    = array( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot; );
+$vcalendar = new vcalendar( $config );
+$vtimezone = &amp; $vcalendar-&gt;newComponent( &quot;vtimezone&quot; );
+$vtimezone-&gt;setProperty( &quot;Tzid&quot;, &quot;US-Eastern&quot; );
+$vtimezone-&gt;setProperty( &quot;Last-Modified&quot;, &quot;19870101&quot; );
+$standard  = &amp; $vtimezone-&gt;newComponent( &quot;standard&quot; );
+.. .
+$daylight  = &amp; $vtimezone-&gt;newComponent( &quot;daylight&quot; );
+$daylight-&gt;setProperty( &quot;tzoffsetto&quot;, &quot;1345&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="TZURL"></a><h3>3.2.45 TZURL</h3>
+<p>
+The TZURL provides a means for a <a href="#VTIMEZONE">VTIMEZONE</a> component to point to
+a network location that can be used to retrieve an up-to-date version of itself. The property
+is OPTIONAL and MUST NOT occur more than once.
+</p>
+<p> The value type is URI.</p>
+<h5>Create TZURL</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::createTzurl()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createTzurl();
+.. .
+</p>
+<h5>Delete TZURL</h5>
+<p>Remove TZURL from component.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::deleteProperty( &quot;TZURL&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vtimezone-&gt;deleteProperty( &quot;TZURL&quot; );
+.. .
+</p>
+<h5>Get TZURL</h5>
+<p>If set, returns property value, otherwise FALSE.</p>.
+<p class="label">Format 1</p>
+<p class="format">vtimezone::getProperty( &quot;TZURL&quot; )</p>
+<p class="comment">output = tzurl<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">vtimezone::getProperty( &quot;TZURL&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; tzurl<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$tzurl = $timezonestandard-&gt;getProperty( &quot;TZURL&quot; );
+.. .
+</p>
+<h5>Set TZURL</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">vtimezone::setProperty( &quot;tzurl&quot;, tzurl [, xparams ] )</p>
+<p class="comment">tzurl<sup>1</sup>   = (string) Value type URI
+xparams<sup>2</sup> = array( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$tz        = &quot;http://zones.stds_r_us.net/tz/US-Eastern&quot; );
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot; );
+$vcalendar = new vcalendar( $config );
+$vtimezone = &amp; $vcalendar-&gt;newComponent( &quot;vtimezone&quot; );
+$vtimezone-&gt;setProperty( &quot;Tzid&quot;, &quot;US-Eastern&quot; );
+$vtimezone-&gt;setProperty( &quot;Last-Modified&quot;, &quot;19870101T000000&quot; );
+$vtimezone-&gt;setProperty( &quot;tzurl&quot;, $tz );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="UID"></a><h3>3.2.46 UID</h3>
+<p>
+The persistent, globally <b>U</b>nique <b>ID</b>entifier for the <strong>calendar</strong> component.
+The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>, <a href="#VTODO">VTODO</a>,
+<a href="#VJOURNAL">VJOURNAL</a> and <a href="#VFREEBUSY">VFREEBUSY</a> components.<br>
+However, UID is <b>AUTOMATICALLY</b> generated in iCalcreator and configuration <a href="#Unique_id">unique_id</a>
+is used when auto-creating component UID.
+</p>
+<p>UID generated format :</p>
+<p class="format">date(&quot;Ymd\THisT&quot;).&quot;-&quot;.[microSec][random].&quot;@&quot;.<a href="#Unique_id">unique_id</a></p>
+<p>
+microSec = microseconds, 4 pos<br>
+random    = 6 characters aA-zZ, 0-9
+</p>
+<p class="label">Example</p>
+<p class="example">&quot;20070803T194810CEST-0123U3PXiX@kigkonsult.se&quot;</p>
+<p>
+UID may be required when importing iCal files into some <strong>calendar</strong> software (MS etc.),
+as well as (<strong>calendar</strong>) properties <a href="#X-PROPERTY">x-properties</a> "X-WR-CALNAME", "X-WR-CALDESC" and "X-WR-TIMEZONE",
+<a href="#METHOD">METHOD</a> (value PUBLISH etc.) and the (also automatically created) <a href="#DTSTAMP">DTSTAMP</a> property.
+</p>
+<p>The value type for UID is TEXT.</p>
+<h5>Create UID</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createUid()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createUid();
+.. .
+</p>
+<h5>Delete UID</h5>
+<p>
+If UID is remove from a component, UID will automatically be recreated when iCalcreator object output methods
+like <a href="#createCalendar">createCalendar</a>, <a href="#returnCalendar">returnCalendar</a>
+or <a href="#saveCalendar">saveCalendar</a> is executed.
+</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;UID&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;UID&quot; );
+.. .
+</p>
+<h5>Get UID</h5>
+<p>If set, returns property, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;UID&quot; )</p>
+<p class="comment">output = uid<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;UID&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array( &quot;value&quot;  =&gt; uid<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$uid = $vevent-&gt;getProperty( &quot;UID&quot; );
+.. .
+</p>
+<h5>Set UID</h5>
+<p>Insert property value, overrides any previously set or auto-created UID.</p>
+<p>
+Do <b>NOT</b> use an integer UID or only a component name in UID (ex. &quot;vevent&quot;),
+this may cause malfunction in iCalcreator object method <a href="#setComponent">setComponent</a> with index or UID argument.
+</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;uid&quot;, uid [, xparams ] )</p>
+<p class="comment">uid<sup>1</sup>     = (string) Value type TEXT
+xparams<sup>2</sup> = array( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setProperty(&quot;uid&quot;,&quot;20070803T194810CEST-0123U3PXiX@kigkonsult.se&quot;);
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="URL"></a><h3>3.2.47 URL</h3>
+<p>
+This property defines a Uniform Resource Locator (URL) associated with the <strong>iCalendar</strong> object.
+The property is OPTIONAL and MUST NOT occur more than once in <a href="#VEVENT">VEVENT</a>,
+<a href="#VTODO">VTODO</a>, <a href="#VJOURNAL">VJOURNAL</a> and <a href="#VFREEBUSY">VFREEBUSY</a> components.
+</p>
+<p> The value type is URI.</p>
+<h5>Create URL</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createUrl()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createUrl();
+.. .
+</p>
+<h5>Delete URL</h5>
+<p>Remove URL from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;URL&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;URL&quot; );
+.. .
+</p>
+<h5>Get URL</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;URL&quot; )</p>
+<p class="comment">output = url<sup>1</sup></p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty( &quot;URL&quot;, FALSE , TRUE )</p>
+<p class="comment">output = array &quot;value&quot;   =&gt; url<sup>1</sup>
+              , &quot;params&quot; =&gt; xparams<sup>2</sup> )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$url = $vevent-&gt;getProperty( &quot;URL&quot; );
+.. .
+</p>
+<h5>Set URL</h5>
+<p>Insert property value.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( &quot;url&quot;, url [, xparams ] )</p>
+<p class="comment">url<sup>1</sup>     = (string) Value type URI
+xparams<sup>2</sup> = (array) ( *[ (string) key =&gt; (string) value ] ) // <span class="comment">key prefix &quot;X-&quot;</span>
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vtodo-&gt;setProperty( &quot;url&quot;, &quot;http://www.icaldomain.net&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a name="X-PROPERTY_PROP"></a><h3>3.2.48 X-PROPERTY</h3>
+<p>
+A component, non-standard property with a TEXT value and a name with an &quot;X-&quot; prefix. In a component,
+an x-property, with an unique name, can occur only once but the number of x-properties are unlimited.
+</p>
+<p>The value type is TEXT.</p>
+<h5>Create X-PROPERTY</h5>
+<p>If set, returns [RFC5545] formatted string, otherwise FALSE.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::createXprop()</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$str = $component-&gt;createxProp();
+.. .
+</p>
+<h5>Delete X-PROPERTY</h5>
+<p>Remove X-PROPERTY from component.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteProperty( &quot;&lt;X-PROPERTY&gt;&quot; )</p>
+<p class="label">Example 1</p>
+<p>Deleting x-property named &quot;X-PROPERTY&quot;.</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;deleteProperty( &quot;X-PROPERTY&quot; );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Deleting all x-properties.</p>
+<p class="example">&lt;?php
+.. .
+while( $vevent-&gt;deleteProperty())
+  continue;
+.. .
+</p>
+<h5>Get X-property</h5>
+<p>If set, returns property value, otherwise FALSE.</p>
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getProperty( &quot;&lt;X-PROPERTY&gt;&quot; )</p>
+<p class="comment">output = array( propertyName<sup>1</sup>
+              , propertyData<sup>2</sup> )</p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getProperty()</p>
+<p class="comment">output = array( propertyName<sup>1</sup>
+              , propertyData<sup>2</sup> )</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getProperty( FALSE, propOrderNo/FALSE, TRUE )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">output = array( propertyName<sup>1</sup>
+              , array ( &quot;value&quot;  =&gt; propertyData<sup>2</sup> )
+                      , &quot;params&quot; =&gt; params<sup>3</sup>))</p>
+<p class="label">Format 4</p>
+<p class="format">calendarComponent::getProperty( FALSE, propOrderNo )</p>
+<p class="comment">propOrderNo = (int) specific property value</p>
+<p class="comment">Get propOrderNo X-property</p>
+
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;filename&quot;, &quot;file.ics&quot; ); );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+if( FALSE !== ( $d = $vcalendar-&gt;getProperty( &quot;X-WR-TIMEZONE&quot; )))
+   echo $d[1]; <span class="comment">// $d = array( &quot;X-WR-TIMEZONE&quot;, propertyData<sup>2</sup> )</span>
+.. .
+</p>
+
+<p class="label">Example 2</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;filename&quot;, &quot;file.ics&quot; ); );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+while( $xprop = $vcalendar-&gt;getProperty( )) {<span class="comment">// $xprop = array( propertyName<sup>1</sup>, propertyData<sup>2</sup> )</span>
+.. .
+</p>
+
+
+<p class="label">Example 3</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;filename&quot;, &quot;file.ics&quot; ); );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+while( $xprop = $vcalendar-&gt;getProperty( &quot;X-ABC-MMSUBJ&quot; )) {
+.. .     <span class="comment">// $xprop = array( &quot;X-ABC-MMSUBJ&quot;, propertyData<sup>2</sup> )</span>
+.. .
+</p>
+
+<p class="label">Example 4</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;filename&quot;, &quot;file.ics&quot; ); );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+while( $xprop = $vcalendar-&gt;getProperty( FALSE, FALSE, TRUE )) {
+       /*<span class="comment"> $xprop = array( propertyName<sup>1</sup>
+                                      , array( &quot;value&quot;    =&gt; propertyData<sup>2</sup> )
+                                                , &quot;params&quot; =&gt; params<sup>3</sup> )</span>
+       */
+.. .
+</p>
+<h5>Set X-property</h5>
+<p>Insert property name and value. If an x-prop with the same name already exists, it will be replaced.</p>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setProperty( propertyName, propertyData [, params ] )</p>
+<p class="comment">propertyName<sup>1</sup> = (string) Any property name with a &quot;X-&quot; prefix
+propertyData<sup>2</sup> = (string) Value type TEXT
+params<sup>3</sup>       = (array) ( [&quot;LANGUAGE&quot; =&gt; (string) &quot;lang<sup>*</sup>&quot;] *[, xparams] )
+xparams       = (string) key =&gt; (string) value // <span class="comment">key prefix &quot;X-&quot;</span>
+lang<sup>*</sup>         = as defined in [RFC5646]</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$component-&gt;setProperty(&quot;X-ABC-MMSUBJ&quot;,&quot;http://load.noise.org/mysubj.wav&quot;);
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Calendar_component_object_property_function_list">[up]</a>
+
+
+<a NAME="iCalcreator_component_configuration_methods"></a><h2>3.3 iCalcreator Component configuration methods</h2>
+
+<a name="Language_PROP"></a><h3>3.3.1 Language</h3>
+Language for specific <strong>calendar</strong> component as defined in [RFC5646].<br>
+Language set at component level can be overridden by specific component property parameter.<br>
+A successful &quot;setConfig&quot; returns TRUE.
+<h5>Get language</h5>
+Language for <strong>calendar</strong> (only if language is set at component level).
+<p class="label">Format</p>
+<p class="format">calendarComponent::getConfig( &quot;language&quot; )</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$lang = $vevent-&gt;getConfig( &quot;language&quot; );
+.. .
+</p>
+<h5>Set LANGUAGE</h5>
+<p class="label">Format</p>
+<p class="format">calendarComponent::setConfig( &quot;language&quot;, lang )</p>
+<p class="comment">lang = (string) language</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$vevent-&gt;setConfig( &quot;language&quot;, &quot;en&quot; );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_configuration_methods">[up]</a>
+
+
+<a name="iCalcreator_component_object_misc_methods"></a><h2>3.4 iCalcreator component object misc. methods</h2>
+<p>Calendar component subcomponent functions.</p>
+
+<a name="deleteComponent_PROP"></a><h4>3.4.1 deleteComponent</h4>
+Remove subcomponent from component.
+<p class="label">Format</p>
+<p class="format">calendarComponent::deleteComponent( orderNumber )</p>
+<p class="comment">orderNumber = (int) component order Number</p>
+<p class="comment">Remove component with order number (1st=1, 2nd=2.. .).</p>
+<p class="format">calendarComponent::deleteComponent( componentType [, componentSuborderNumber])</p>
+<p class="comment">componentType = (string) component type
+componentSuborderNumber = (int) component suborder number</p>
+<p class="comment">Remove component with component type (ex. &quot;vevent&quot;)
+and order 1 alt. suborder number.</p>
+<p class="format">calendarComponent::deleteComponent( <a href="#UID">UID</a> )</p>
+<p class="comment">Remove component with <a href="#UID">UID</a>.
+N.B <a href="#UID">UID</a> is NOT set for <a href="#VALARM">ALARM</a> / <a href="#VTIMEZONE">timezone</a> components.</p>
+<p class="label">Example 1</p>
+<p>Delete first subcomponent.</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;filename&quot;  =&gt; &quot;file.ics&quot; );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$comp1     = $vcalendar-&gt;getComponent();
+$comp1-&gt;deleteComponent( 1 );
+.. .
+</p>
+<p class="label">Example 2</p>
+<p>Delete all subcomponents.</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;filename&quot;  =&gt; &quot;file.ics&quot; );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$comp1     = $vcalendar-&gt;getComponent();
+while( $comp1-&gt;deleteComponent( &quot;valarm&quot; )
+  continue;
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_configuration_methods">[up]</a>
+
+
+<a name="getComponent_PROP"></a><h4>3.4.2 getComponent</h4>
+Get subComponent from component.
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::getComponent()</p>
+<p class="comment">Get next component until end-of-components.</p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::getComponent( int orderNumber )</p>
+<p class="comment">orderNumber = (int) component order number</p>
+<p class="comment">Get component with order number (1st=1, 2nd=2.. .).</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::getComponent( string componentType [, int componentSuborderNumber])</p>
+<p class="comment">componentType = (string) component type
+componentSuborderNumber = (int) component suborder number</p>
+<p class="comment">Get (next) component with component type (until end-of-components)
+alt. component with component type and suborder number (1st=1, 2nd=2..).</p>
+<p class="label">Format 4</p>
+<p class="format">calendarComponent::getComponent( <a href="#UID">UID</a> )</p>
+<p class="comment">Get component with <a href="#UID">UID</a>.
+N.B <a href="#UID">UID</a> is NOT set for <a href="#VALARM">ALARM</a> / <a href="#VTIMEZONE">timezone</a> components.</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;,
+                    &quot;filename&quot;  =&gt; &quot;file.ics&quot; );
+$vcalendar = new vcalendar( $config );
+$vcalendar-&gt;parse();
+$comp1     = $vcalendar-&gt;getComponent());
+while( $subComp = $comp1-&gt;getComponent()) {
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_configuration_methods">[up]</a>
+
+
+<a name="newComponent_PROP"></a><h4>3.4.3 newComponent</h4>
+Create subcomponent (<a href="#VALARM">ALARN</a> / <a href="#VTIMEZONE">VTIMEZONE STANDARD</a> / <a href="#VTIMEZONE">VTIMEZONE DAYLIGHT</a>)
+using a component factory-method, returning a reference to the new component.
+<p class="label">Format</p>
+<p class="format">calendarComponent::newComponent( componentType )</p>
+<p class="comment">componentType = (string) component type</p>
+<p class="label">Example 1</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vevent    = &amp; $vcalendar-&gt;newComponent( &quot;vevent&quot; );
+             // <span class="comment">add some <a class="ref" href="#VEVENT">EVENT</a> properties</span>
+$vevent-&gt;setProperty( &quot;dtstart&quot;, 2006, 12, 24, 19, 30, 00 );
+$vevent-&gt;setProperty(.. .
+...
+$valarm    = &amp; $vevent-&gt;newComponent( &quot;valarm&quot; );
+$valarm-&gt;setProperty( &quot;trigger&quot;, .. .
+...
+</p>
+<p class="label">Example 2</p>
+<p class="example">&lt;?php
+.. .
+$config = array( &quot;unique_id&quot; => &quot;kigkonsult.se&quot; );
+$vcalendar = new vcalendar( $config );
+...
+$vtimezone = &amp; $vcalendar-&gt;newComponent( &quot;vtimezone&quot; );
+$vtimezone-&gt;setProperty(.. .
+...
+$standard = &amp; $vtimezone-&gt;newComponent( &quot;standard&quot; );
+$standard-&gt;setProperty(.. .
+...
+$daylight = &amp; $vtimezone-&gt;newComponent( &quot;daylight&quot; );
+$daylight-&gt;setProperty(.. .
+...
+</p>
+
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_configuration_methods">[up]</a>
+
+
+<a name="setComponent_PROP"></a><h4>3.4.4 setComponent</h4>
+Add <strong>calendar</strong> component to the iCalcreator object instance or replace/update component in the iCalcreator object instance.
+<p class="label">Format 1</p>
+<p class="format">calendarComponent::setComponent( component )
+addSubComponent( component ) // <span class="comment">alias</span></p>
+<p class="comment">Insert last in component chain.</p>
+<p class="label">Format 2</p>
+<p class="format">calendarComponent::setComponent( component, int orderNumber )</p>
+<p class="comment">orderNumber = (int) component order number</p>
+<p class="comment">Replace component with order number(1st=1, 2nd=2.. .).
+If orderNumber is not found, component is inserted last in chain.</p>
+<p class="label">Format 3</p>
+<p class="format">calendarComponent::setComponent( component, componentType [,componentSuborderNumber])</p>
+<p class="comment">componentType = (string) component type
+componentSuborderNumber = (int) component suborder number</p>
+<p class="comment">Replace component with component type and component order number.
+if orderNumber is not found, component is inserted last in chain. </p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$config    = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; &quot;Europe/Stockholm&quot; );
+$vcalendar = new vcalendar( $config ); // <span class="comment">initiate new CALENDAR</span>
+.. .
+$vevent    = new vevent();
+            // <span class="comment">add some <a class="ref" href="#VEVENT">EVENT</a> properties</span>
+$vevent-&gt;setProperty( &quot;dtstart&quot;, 2006, 12, 24, 19, 30, 00 );
+$vevent-&gt;setProperty(.. .
+.. .
+$valarm    = new valarm();
+$valarm-&gt;setProperty( &quot;trigger&quot;, .. .
+.. .
+$vevent-&gt;setComponent( $valarm );
+$vcalendar-&gt;setComponent( $vevent );
+.. .
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalcreator_component_configuration_methods">[up]</a>
+
+
+<a name="iCalUtilityFunctions"></a><h1>4 iCalUtilityFunctions</h1>
+<p>
+iCalUtilityFunctions class contains static functions used by iCalcreator,
+also usable outside the iCalcreator class.
+</p>
+<dl>
+<dt>&quot;External&quot; functions
+<dd><a href="#convEolChar">4.1 convEolChar</a>
+<dd><a href="#createTimezone">4.2 createTimezone</a>
+<dd><a href="#ms2phpTZ">4.3 ms2phpTZ</a>
+<dd><a href="#transformDateTime">4.4 transformDateTime</a>
+<dt>&quot;Internal&quot; functions
+<dd><a href="#mddtuf">4.5 Misc. date/duration/timestamp util. functions</a>
+</dl>
+
+
+<a name="convEolChar"></a><h4>4.1 convEolChar</h4>
+<p>Removes any line-endings that may include spaces or tabs (\t)
+and convert all line endings (iCal default &quot;\r\n&quot;),
+takes care of &quot;\r\n&quot;, &quot;\r&quot; and &quot;\n&quot; and mixed &quot;\r\n&quot;+&quot;\r&quot;, &quot;\r\n&quot;+&quot;\n&quot;.
+</p>
+<p>Returns string with controlled and corrected line endings.</p>
+<p class="label">Format</p>
+<p class="format">iCalUtilityFunctions::convEolChar( str, nl )</p>
+<p class="comment">str = (string) string to adjust
+nl  = line ending to convert to
+</p>
+<br>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalUtilityFunctions">[up]</a>
+
+
+<a name="createTimezone"></a><h4>4.2 createTimezone</h4>
+<p>
+The function, applied on a iCalcrator object instance and using a <em>PHP</em> valid timezone (as argument)
+creates <a href="#VTIMEZONE">vtimezone</a>, <a href="#STANDARD">standard</a> and <a href="#DAYLIGHT">daylight</a> components,
+based on <em>PHP</em> DateTimeZone class and the time zone transition dates.
+(<em>PHP</em> 5 >= 5.2.0)
+</p>
+<p>
+Recommendation is to call the function <b>after</b> editing components (and without (period) from/to arguments, below),
+ it will automatically create timezone components to fit.
+</p>
+<p>
+If no time zone transition exists within date arguments or within the &quot;<a href="#DTSTART">DTSTART</a>&quot;s span,
+then the time zone transition with the highest transistion date before &quot;from&quot; date is used as base.
+If still missing,a timezone standard component are created, using current date.
+</p>
+<p>
+Note, only when timezone NOT is UTC.
+For dates with UTC DATE-TIME, read <a href="#DATE_WITH_UTC_TIME">this</a>!
+</p>
+<p>
+FALSE is returned if not using a <em>PHP</em> valid timezone.
+</p>
+<p class="label">Format</p>
+<p class="format">iCalUtilityFunctions::createTimezone( calendar, timezone [, xprops, [, from [, to ]]] )</p>
+<p class="comment">calendar = (object) iCalcreator instance
+timezone = (string) an <em>PHP</em> (DateTimeZone) valid timezone
+xprops   = (array) ( *[ x-propName =&gt; value ] ), timezone non-standard properties
+from     = (int) timestamp, period start date
+to       = (int) timestamp, period end date
+           if the &quot;from&quot; and &quot;to&quot; arguments are missing,
+             the calendar <a href="#getProperty2">getProperty</a> method (with &quot;<a href="#DTSTART">DTSTART</a>&quot; as argument)
+             is used to get the lowest (modified, minus one month) and highest (modified, plus one year) DTSTART dates.
+</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$tz     = &quot;Europe/Stockholm&quot;;
+$config = array( &quot;unique_id&quot; =&gt; &quot;kigkonsult.se&quot;, &quot;TZID&quot; =&gt; $tz );
+$c      = new vcalendar( $config );
+$c-&gt;setProperty( "X-WR-TIMEZONE", $tz );
+.. .
+.. .  // <span class="comment">insert components or parse an iCal file</span>
+.. .
+$xprops = array( &quot;X-LIC-LOCATION&quot; => $tz );
+iCalUtilityFunctions::createTimezone( $c, $tz, $xprops );
+.. .
+</p>
+<p>
+Output example (when using iCalcreator object createCalendar or returnCalendar methods):
+</p>
+<p class="example">BEGIN:VTIMEZONE
+TZID:Europe/Stockholm
+X-LIC-LOCATION:Europe/Stockholm
+BEGIN:STANDARD
+DTSTART:20111030T003000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:20110327T002000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+END:DAYLIGHT
+END:VTIMEZONE
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalUtilityFunctions">[up]</a>
+
+
+<a name="ms2phpTZ"></a><h4>4.3 ms2phpTZ</h4>
+<p>
+Conversion (very simple) of a MS timezone to a <em>PHP</em>5 valid (Date-)timezone,<br>
+matching (MS) UTC offset and time zone descriptors, based on <em>PHP</em> DateTimeZone class.
+(<em>PHP</em> 5 >= 5.2.0)
+</p>
+<p>If TRUE is returned, the MS timezone argument (below) is converted to a <em>PHP</em>5 time zone, otherwise unaltered.</p>
+<p class="label">Format</p>
+<p class="format">iCalUtilityFunctions::ms2phpTZ( timezone )</p>
+<p class="comment">timezone = (string) MS timezone (input), PHP5 timezone (output)</p>
+<p class="label">Example</p>
+<p class="example">&lt;?php
+.. .
+$search = '"(UTC-06:00) Central Time (US & Canada)"';
+echo "MS  tz:'$search'&lt;br&gt;\n";
+if( FALSE !== iCalUtilityFunctions::ms2phpTZ( $search ))
+  echo "PHP tz:'$search'&lt;br&gt;\n";
+.. .
+</p>
+<br>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalUtilityFunctions">[up]</a>
+
+
+<a name="transformDateTime"></a><h4>4.4 transformDateTime</h4>
+<p>
+Transforms a datetime from a time zone to another. (Requires <em>PHP</em> >= 5.2.0 and <em>PHP</em> DateTimeZone acceptable time zones).
+</p>
+<p>
+FALSE is returned if not using a &quot;strtotime&quot; acceptable datetime string or unacceptable <em>PHP</em> time zones.
+If TRUE, the dateTime argument (below) is converted to the new time zone, otherwise unaltered.
+</p>
+<p>
+A DATE input (&lt;year&gt;&lt;month&gt;&lt;day&gt;) will be expanded to a DATETIME (&lt;year&gt;&lt;month&gt;&lt;day&gt;000000) before transform.
+</p>
+<p class="label">Format</p>
+<p class="format">iCalUtilityFunctions::transformDateTime( dateTime, timezoneFrom [, timezoneTo [, format ]] )</p>
+<p class="comment">
+dateTime     = (array) ( &quot;year&quot;  =&gt; (int) year            // <span class="comment">input</span>
+                        , &quot;month&quot; =&gt; (int) month
+                        , &quot;day&quot;   =&gt; (int) day
+                       [, &quot;hour&quot;  =&gt; (int) hour
+                        , &quot;min&quot;   =&gt; (int) min
+                        , &quot;sec&quot;   =&gt; (int) sec ] )
+dateTime     = (array) ( (int) year                       // <span class="comment">input</span>
+                        , (int) month
+                        , (int) day
+                       [, (int) hour
+                        , (int) min
+                        , (int) sec ] )
+dateTime     = (array) ( &quot;timestamp&quot; =&gt; (int) timestamp ) // <span class="comment">input</span>
+dateTime     = (string) datetime string<sup>*</sup>                  // <span class="comment">input</span>
+dateTime     = (string) datetime string                   // <span class="comment">on successful output</span>
+timezoneFrom = (string) a <em>PHP</em> (DateTimeZone) valid time zone
+timezoneTo   = (string) a <em>PHP</em> (DateTimeZone) valid time zone, default &quot;UTC&quot;
+format       = (string) output format (any date formatting, default &quot;Ymd\THis&quot;)
+<br>datetime string<sup>*</sup> recommended formats
+    &quot;20110625&quot;,            &quot;2011-06-25&quot;,          &quot;2011/06/26&quot;
+    &quot;20110625051015&quot;,      &quot;20110625 051015&quot;
+    &quot;20110625T051015&quot;,     &quot;20110625t051015&quot;
+    &quot;2011-06-25 05:10:15&quot;, &quot;2011-06-25T05:10:15&quot;, &quot;2011-06-25t05:10:15&quot;
+    &quot;2011/06/25 05:10:15&quot;, &quot;2011/06/25T05:10:15&quot;, &quot;2011/06/25t05:10:15&quot;
+    other string formats, acceptable by <em>PHP</em> strtotime function, may (would) work
+    <span class="comment">(notice <a href="#date_restriction">date restriction</a>)</span></p>
+<p class="label">Example</p>
+<p>Convert from time zone &quot;Europe/Stockholm&quot; to &quot;UTC&quot;</p>
+<p class="example">&lt;?php
+.. .
+$d          = date( &quot;Y-m-d H:i:s&quot; );
+$tzFr       = &quot;Europe/Stockholm&quot;;
+if( FALSE !== iCalUtilityFunctions::transformDateTime( $d, $tzFr ))
+  $event-&gt;setProperty( &quot;dtstart&quot;, $d.&quot;Z&quot; );
+else
+  $event-&gt;setProperty( &quot;dtstart&quot;, $d, array( &quot;TZID&quot; => $tzFr ));
+.. .
+</p>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalUtilityFunctions">[up]</a>
+
+
+<a name="mddtuf"></a><h4>4.5 Misc. date/duration/timestamp util. functions</h4>
+<p>
+iCalUtilityFunctions static date(-time)/timestamp functions.
+Please examine the class file for more information about arguments and output.
+</p>
+<dl>
+<dt>iCalUtilityFunctions::_chkDateArr( $datetime, $parno=FALSE )
+<dd>Returns internal date-time/date formatted (keyed) array for an input date-time/date array (keyed or unkeyed)
+<dd>name changed from _date_time_array (exists as alias, may be removed in future versions)
+<dt>iCalUtilityFunctions::_chkdatecfg( $theDate, & $parno, & $params )
+<dd>Check date(-time) and params arrays for an opt. timezone and if it is a DATE-TIME or DATE (updates $parno and (opt) $params)
+<dt>iCalUtilityFunctions::_date2strdate( $datetime, $parno=6 )
+<dd>Returns formatted output (string) for calendar component property data value type date/date-time
+<dd>name changed from _format_date_time (exists as alias, may be removed in future versions)
+<dt>iCalUtilityFunctions::_date2timestamp( $datetime, $wtz=null )
+<dd>Returns a timestamp (int) for a date/datetime (array)
+<dt>iCalUtilityFunctions::_duration2arr( $duration )
+<dd>Returns internal duration formatted (keyed) array for input in array format
+<dd>name changed from _duration_array (exists as alias, may be removed in future versions)
+<dt>iCalUtilityFunctions::_duration2date( $startdate, $duration )
+<dd>Returns a datetime (keyed) array for a startdate+duration
+<dt>iCalUtilityFunctions::_durationStr2arr( $duration )
+<dd>Returns internal duration formatted (keyed)  array for an input string (iCal) formatted duration
+<dd>name changed from _duration_string (exists as alias, may be removed in future versions)
+<dt>iCalUtilityFunctions::_duration2str( $duration )
+<dd>Returns a formatted string for a calendar component property data value type duration
+<dd>name changed from _format_duration (exists as alias, may be removed in future versions)
+<dt>iCalUtilityFunctions::_isArrayDate( $input )
+<dd>Returns bool TRUE if input contains a (array formatted) date/time
+<dt>iCalUtilityFunctions::_isArrayTimestampDate( $input )
+<dd>Returns bool TRUE if input array contains a timestamp date
+<dt>iCalUtilityFunctions::_isOffset( $input )
+<dd>Returns bool TRUE if input string contains (trailing) UTC/iCal offset
+<dt>iCalUtilityFunctions::offsetSec2His( $seconds )
+<dd>Returns iCal offset [-/+]hhmm[ss] (string) from UTC offset seconds
+<dt>iCalUtilityFunctions::_strDate2arr( & $input )
+<dd>Convert a date from specific string to (keyed) array format, returns TRUE on success
+<dt>iCalUtilityFunctions::_strdate2date( $datetime, $parno=FALSE, $wtz=null )
+<dd>Returns internal date-time/date formatted (keyed) array for input date-time/date in string fromat
+<dd>name changed from _date_time_string (exists as alias, may be removed in future versions)
+<dt>iCalUtilityFunctions::_timestamp2date( $timestamp, $parno=6, $wtz=null )
+<dd>Returns internal date-time/date formatted (keyed) array, based on a timestamp, default UTC or adjusted for offset/timezone
+<dt>iCalUtilityFunctions::_timestamp2duration( $timestamp )
+<dd>Returns internal duration formatted (keyed) array for a timestamp (i.e. seconds)
+<dt>iCalUtilityFunctions::_tz2offset( $tz )
+<dd>Returns seconds (int) from an offset, [+/-]HHmm[ss], used when correcting UTC to localtime or v.v.
+</dl>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#iCalUtilityFunctions">[up]</a>
+
+
+<a name="helperFunctions"></a><h1>5 Helper functions</h1>
+<p>The helper functions extend the utility of iCalcreator.</p>
+
+<a name="XMLhelpers"></a><h3>5.1 iCal and XML helper functions</h3>
+<p>
+The XML helper functions convert iCal into XML and parse XML into iCal.
+XML is defined by rfc6321, &quot;xCal: The XML Format for <strong>iCalendar</strong>&quot;.
+</p>
+<a name="iCal2XML"></a><h4>5.1.1 iCal2XML</h4>
+<p>The iCal2XML function converts an iCalcreator object instance to XML.</p>
+<p>
+Requires <em>PHP</em> 5 and &quot;libxml&quot; <em>PHP</em> extension (--enable-libxml) and utilizes the SimpleXML extension.
+Before <em>PHP</em> 5.1.2, &quot;--enable-simplexml&quot; (at compile time) is required to enable this extension, after <em>PHP</em> 5.1.2 enabled by default.
+</p>
+<p>An rfc6321 XML string is returned.</p>
+<p class="label">Format</p>
+<p class="format">iCal2XML( iCalobj )</p>
+<p class="comment">iCalobj = (object) iCalcreator instance</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#helperFunctions">[up]</a>
+
+<a name="XML2iCal"></a><h4>5.1.2 XML2iCal</h4>
+<p>
+The XML2iCal function, with the two entry functions: XMLstr2iCal and XMLfile2iCal, parse an XML string/file to an iCalcreator instance.
+The function is <b>not</b> using the <em>PHP</em> SimpleXML extension.
+</p>
+<p>
+On success, an iCalcreator instance is returned.
+</p>
+<p>
+On XML parse error, FALSE is returned.
+</p>
+<h5>XMLstr2iCal</h5>
+<p>
+The function accepts a well-formed (rfc6321) XML string as argument.
+</p>
+<p class="label">Format</p>
+<p class="format">XMLstr2iCal( xmlstr [, config] )</p>
+<p class="comment">xmlstr  = (string) rfc6321 XML
+config  = (array) iCalcreator config array (opt)</p>
+<h5>XMLfile2iCal</h5>
+<p>
+The function accepts an XML (rfc6321) local file or a remote URI, as argument.
+</p>
+<p class="label">Format</p>
+<p class="format">XMLfile2iCal( xmlfile [, config] )</p>
+<p class="comment">xmlfile = (string) rfc6321 XML file name or resource
+config  = (array) iCalcreator config array (opt)</p>
+<h5>XML2iCal</h5>
+<p>
+This function is doing the hard work in XMLstr2iCal/XMLfile2iCal functions.
+</p>
+<p class="label">Format</p>
+<p class="format">XML2iCal( xmlstr [, config] )</p>
+<p class="comment">xmlstr  = (string) rfc6321 XML
+config  = (array)  iCalcreator config array (opt)</p>
+<br>
+
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#helperFunctions">[up]</a>
+
+
+<a name="vCardhelpers"></a><h3>5.2 vCard helper functions</h3>
+<p>
+The purpose of the vCard helper functions are to produce simplified vCard output.
+</p>
+<a name="iCal2vCard"></a><h4>5.2.1 iCal2vCard</h4>
+<p>
+Convert single <a href="#ATTENDEE">ATTENDEE</a>, <a href="#CONTACT">CONTACT</a> or
+<a href="#ORGANIZER">ORGANIZER</a> URI (in email format) to simplified vCard output or saved in vCard file.
+</p>
+<p>
+If argument directory is set, vCards are saved in (directory/) files, named like &lt;firstName&gt;.&lt;familyName&gt;.&quot;ext&quot;.
+</p>
+<p>
+Returns vCard string or TRUE if a valid directory is used as argument (and file write ok)
+otherwise FALSE.
+</p>
+<p class="label">Format</p>
+<p class="format">iCal2vCard( email [ ,version [ ,directory [ ,ext ]]] )</p>
+<p class="comment">
+email     = (string) ATTENDEE, CONTACT or ORGANIZER URI in email format
+version   = (string) vCard version, default &quot;2.1&quot;, opt. &quot;3.0&quot;/&quot;4.0&quot;
+directory = (string) if and where to save vCards files (write rights required), default FALSE
+ext       = (string) vCard file extension, default &quot;vcf&quot;
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#helperFunctions">[up]</a>
+
+<a name="iCal2vCards"></a><h4>5.2.2 iCal2vCards</h4>
+<p>
+Collect and convert all <a href="#ATTENDEE">ATTENDEE</a>s, <a href="#CONTACT">CONTACT</a>s and
+<a href="#ORGANIZER">ORGANIZER</a>s (URI, in email format) to simplified vCard (string) output or
+saved in vCard files, using <a href="#iCal2vCard">iCal2vCard</a> function (above).
+</p>
+<p>
+The file name formatting and return values are described above in <a href="#iCal2vCard">iCal2vCard</a> function.
+</p>
+<p class="label">Format</p>
+<p class="format">iCal2vCards( vcalendar [ ,version [ ,directory [ ,ext ]]] )</p>
+<p class="comment">
+vcalendar = (object) iCalcreator object instance
+version   = (string) vCard version, default &quot;2.1&quot;, opt. &quot;3.0&quot;/&quot;4.0&quot;
+directory = (string) if and where to save vCards files (write rights required), default FALSE
+ext       = (string) vCard file extension, default &quot;vcf&quot;
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#helperFunctions">[up]</a>
+
+
+<a name="TZhelpers"></a><h3>5.3 time zone helper functions</h3>
+<p>
+Additional functions to use with vtimezone components.
+</p>
+<p>
+The <a href="#getTimezonesAsDateArrays">getTimezonesAsDateArrays</a> function
+creates time zone transition information, based on vtimezone components contents in a iCalcreator calendar instance.
+</p>
+<p>
+The <a href="#getTzOffsetForDate">getTzOffsetForDate</a> function returns UTC offset information for specific date (timestamp) based on output from <a href="#getTimezonesAsDateArrays">getTimezonesAsDateArrays</a> function.
+</p>
+<p>
+Before calling the functions <a href="#getTzOffsetForDate">getTzOffsetForDate</a> and <a href="#getTimezonesAsDateArrays">getTimezonesAsDateArrays</a>,
+set time zone 'GMT' ('date_default_timezone_set')!
+</p>
+
+<a name="getTzOffsetForDate"></a><h4>5.3.1 getTzOffsetForDate</h4>
+<p>
+The <a href="#getTzOffsetForDate">getTzOffsetForDate</a> function returns UTC offset information for specific date (timezone) based on output from <a href="#getTimezonesAsDateArrays">getTimezonesAsDateArrays</a> function.
+</p>
+<p>
+Before calling the function, set time zone 'GMT' ('date_default_timezone_set')!
+</p>
+<p>
+Returns array, time zone data for specific date (timestamp) with keys for
+</p>
+<ul>
+<li>&quot;offsetHis&quot; (+/-Hi[s])
+<li>&quot;offsetSec&quot;( UTC offset in seconds)
+<li>&quot;tzname&quot; (standard/daylight time zone name)
+</ul>
+<p class="label">Format</p>
+<p class="format">getTzOffsetForDate( timezonesarray, tzid, timestamp )</p>
+<p class="comment">timezonesarray = (array)  output from getTimezonesAsDateArrays, below
+tzid           = (string) time zone identifier
+timestamp      = (mixed)  the date in question (timestamp)
+                          or UTC datetime (array) ( &quot;year&quot;  =&gt; (int) year
+                                                  , &quot;month&quot; =&gt; (int) month
+                                                  , &quot;day&quot;   =&gt; (int) day
+                                                  , &quot;hour&quot;  =&gt; (int) hour
+                                                  , &quot;min&quot;   =&gt; (int) min
+                                                  , &quot;sec&quot;   =&gt; (int) sec )</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#helperFunctions">[up]</a>
+
+<a name="getTimezonesAsDateArrays"></a><h4>5.3.2 getTimezonesAsDateArrays</h4>
+<p>
+The function creates time zone transition information,
+based on vtimezone component contents in a iCalcreator calendar instance,
+using sub-function expandTimezoneDates.
+</p>
+<p>
+Before calling the function, set time zone 'GMT' ('date_default_timezone_set')!
+</p>
+<p>
+Returns an array containing time zone data from vtimezone standard/daylight instances (input to <a href="#getTzOffsetForDate">getTzOffsetForDate</a>, above).
+</p>
+<p class="label">Format</p>
+<p class="format">getTimezonesAsDateArrays( iCalobj )</p>
+<p class="comment">iCalobj= (object) iCalcreator calendar instance</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#helperFunctions">[up]</a>
+
+
+<a name="Copyright_and_Licence"></a><h1>6 COPYRIGHT AND LICENSE</h1>
+
+<a name="Copyright"></a><h4>6.1 Copyright</h4>
+<p>
+iCalcreator v2.18<br>
+Copyright (c) 2007-2013 Kjell-Inge Gustafsson, kigkonsult, All rights reserved.<br>
+<a href="http://kigkonsult.se/iCalcreator/index.php" title="kigkonsult.se/iCalcreator" target="_blank">kigkonsult.se iCalcreator</a><br>
+<a href="http://kigkonsult.se/contact/index.php" title="kigkonsult.se contact" target="_blank">kigkonsult.se contact</a>
+</p>
+
+<a name="Licence"></a><h4>6.2 License</h4>
+<p>
+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.
+</p>
+<p>
+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.
+</p>
+<p>
+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., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+or download it <a href="http://kigkonsult.se/downloads/dl.php?f=LGPL" target="_blank">here</a>.
+</p>
+<br>
+<a href="#INDEX">[index]</a> <a href="#top">[top]</a> <a href="#Copyright_and_Licence">[up]</a>
+</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/jquery.cycle b/htmltest/sites/all/libraries/jquery.cycle
new file mode 120000
index 00000000..bcb35cfc
--- /dev/null
+++ b/htmltest/sites/all/libraries/jquery.cycle
@@ -0,0 +1 @@
+jquery.cycle-version
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/jquery.cycle-version/jquery.cycle.all.js b/htmltest/sites/all/libraries/jquery.cycle-version/jquery.cycle.all.js
new file mode 100644
index 00000000..d57fb720
--- /dev/null
+++ b/htmltest/sites/all/libraries/jquery.cycle-version/jquery.cycle.all.js
@@ -0,0 +1,1529 @@
+/*!
+ * jQuery Cycle Plugin (with Transition Definitions)
+ * Examples and documentation at: http://jquery.malsup.com/cycle/
+ * Copyright (c) 2007-2010 M. Alsup
+ * Version: 2.9999 (13-NOV-2011)
+ * Dual licensed under the MIT and GPL licenses.
+ * http://jquery.malsup.com/license.html
+ * Requires: jQuery v1.3.2 or later
+ */
+;(function($, undefined) {
+
+var ver = '2.9999';
+
+// if $.support is not defined (pre jQuery 1.3) add what I need
+if ($.support == undefined) {
+	$.support = {
+		opacity: !($.browser.msie)
+	};
+}
+
+function debug(s) {
+	$.fn.cycle.debug && log(s);
+}		
+function log() {
+	window.console && console.log && console.log('[cycle] ' + Array.prototype.join.call(arguments,' '));
+}
+$.expr[':'].paused = function(el) {
+	return el.cyclePause;
+}
+
+
+// the options arg can be...
+//   a number  - indicates an immediate transition should occur to the given slide index
+//   a string  - 'pause', 'resume', 'toggle', 'next', 'prev', 'stop', 'destroy' or the name of a transition effect (ie, 'fade', 'zoom', etc)
+//   an object - properties to control the slideshow
+//
+// the arg2 arg can be...
+//   the name of an fx (only used in conjunction with a numeric value for 'options')
+//   the value true (only used in first arg == 'resume') and indicates
+//	 that the resume should occur immediately (not wait for next timeout)
+
+$.fn.cycle = function(options, arg2) {
+	var o = { s: this.selector, c: this.context };
+
+	// in 1.3+ we can fix mistakes with the ready state
+	if (this.length === 0 && options != 'stop') {
+		if (!$.isReady && o.s) {
+			log('DOM not ready, queuing slideshow');
+			$(function() {
+				$(o.s,o.c).cycle(options,arg2);
+			});
+			return this;
+		}
+		// is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
+		log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
+		return this;
+	}
+
+	// iterate the matched nodeset
+	return this.each(function() {
+		var opts = handleArguments(this, options, arg2);
+		if (opts === false)
+			return;
+
+		opts.updateActivePagerLink = opts.updateActivePagerLink || $.fn.cycle.updateActivePagerLink;
+		
+		// stop existing slideshow for this container (if there is one)
+		if (this.cycleTimeout)
+			clearTimeout(this.cycleTimeout);
+		this.cycleTimeout = this.cyclePause = 0;
+
+		var $cont = $(this);
+		var $slides = opts.slideExpr ? $(opts.slideExpr, this) : $cont.children();
+		var els = $slides.get();
+
+		var opts2 = buildOptions($cont, $slides, els, opts, o);
+		if (opts2 === false)
+			return;
+
+		if (els.length < 2) {
+			log('terminating; too few slides: ' + els.length);
+			return;
+		}
+
+		var startTime = opts2.continuous ? 10 : getTimeout(els[opts2.currSlide], els[opts2.nextSlide], opts2, !opts2.backwards);
+
+		// if it's an auto slideshow, kick it off
+		if (startTime) {
+			startTime += (opts2.delay || 0);
+			if (startTime < 10)
+				startTime = 10;
+			debug('first timeout: ' + startTime);
+			this.cycleTimeout = setTimeout(function(){go(els,opts2,0,!opts.backwards)}, startTime);
+		}
+	});
+};
+
+function triggerPause(cont, byHover, onPager) {
+	var opts = $(cont).data('cycle.opts');
+	var paused = !!cont.cyclePause;
+	if (paused && opts.paused)
+		opts.paused(cont, opts, byHover, onPager);
+	else if (!paused && opts.resumed)
+		opts.resumed(cont, opts, byHover, onPager);
+}
+
+// process the args that were passed to the plugin fn
+function handleArguments(cont, options, arg2) {
+	if (cont.cycleStop == undefined)
+		cont.cycleStop = 0;
+	if (options === undefined || options === null)
+		options = {};
+	if (options.constructor == String) {
+		switch(options) {
+		case 'destroy':
+		case 'stop':
+			var opts = $(cont).data('cycle.opts');
+			if (!opts)
+				return false;
+			cont.cycleStop++; // callbacks look for change
+			if (cont.cycleTimeout)
+				clearTimeout(cont.cycleTimeout);
+			cont.cycleTimeout = 0;
+			opts.elements && $(opts.elements).stop();
+			$(cont).removeData('cycle.opts');
+			if (options == 'destroy')
+				destroy(opts);
+			return false;
+		case 'toggle':
+			cont.cyclePause = (cont.cyclePause === 1) ? 0 : 1;
+			checkInstantResume(cont.cyclePause, arg2, cont);
+			triggerPause(cont);
+			return false;
+		case 'pause':
+			cont.cyclePause = 1;
+			triggerPause(cont);
+			return false;
+		case 'resume':
+			cont.cyclePause = 0;
+			checkInstantResume(false, arg2, cont);
+			triggerPause(cont);
+			return false;
+		case 'prev':
+		case 'next':
+			var opts = $(cont).data('cycle.opts');
+			if (!opts) {
+				log('options not found, "prev/next" ignored');
+				return false;
+			}
+			$.fn.cycle[options](opts);
+			return false;
+		default:
+			options = { fx: options };
+		};
+		return options;
+	}
+	else if (options.constructor == Number) {
+		// go to the requested slide
+		var num = options;
+		options = $(cont).data('cycle.opts');
+		if (!options) {
+			log('options not found, can not advance slide');
+			return false;
+		}
+		if (num < 0 || num >= options.elements.length) {
+			log('invalid slide index: ' + num);
+			return false;
+		}
+		options.nextSlide = num;
+		if (cont.cycleTimeout) {
+			clearTimeout(cont.cycleTimeout);
+			cont.cycleTimeout = 0;
+		}
+		if (typeof arg2 == 'string')
+			options.oneTimeFx = arg2;
+		go(options.elements, options, 1, num >= options.currSlide);
+		return false;
+	}
+	return options;
+	
+	function checkInstantResume(isPaused, arg2, cont) {
+		if (!isPaused && arg2 === true) { // resume now!
+			var options = $(cont).data('cycle.opts');
+			if (!options) {
+				log('options not found, can not resume');
+				return false;
+			}
+			if (cont.cycleTimeout) {
+				clearTimeout(cont.cycleTimeout);
+				cont.cycleTimeout = 0;
+			}
+			go(options.elements, options, 1, !options.backwards);
+		}
+	}
+};
+
+function removeFilter(el, opts) {
+	if (!$.support.opacity && opts.cleartype && el.style.filter) {
+		try { el.style.removeAttribute('filter'); }
+		catch(smother) {} // handle old opera versions
+	}
+};
+
+// unbind event handlers
+function destroy(opts) {
+	if (opts.next)
+		$(opts.next).unbind(opts.prevNextEvent);
+	if (opts.prev)
+		$(opts.prev).unbind(opts.prevNextEvent);
+	
+	if (opts.pager || opts.pagerAnchorBuilder)
+		$.each(opts.pagerAnchors || [], function() {
+			this.unbind().remove();
+		});
+	opts.pagerAnchors = null;
+	if (opts.destroy) // callback
+		opts.destroy(opts);
+};
+
+// one-time initialization
+function buildOptions($cont, $slides, els, options, o) {
+	var startingSlideSpecified;
+	// support metadata plugin (v1.0 and v2.0)
+	var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {});
+	var meta = $.isFunction($cont.data) ? $cont.data(opts.metaAttr) : null;
+	if (meta)
+		opts = $.extend(opts, meta);
+	if (opts.autostop)
+		opts.countdown = opts.autostopCount || els.length;
+
+	var cont = $cont[0];
+	$cont.data('cycle.opts', opts);
+	opts.$cont = $cont;
+	opts.stopCount = cont.cycleStop;
+	opts.elements = els;
+	opts.before = opts.before ? [opts.before] : [];
+	opts.after = opts.after ? [opts.after] : [];
+
+	// push some after callbacks
+	if (!$.support.opacity && opts.cleartype)
+		opts.after.push(function() { removeFilter(this, opts); });
+	if (opts.continuous)
+		opts.after.push(function() { go(els,opts,0,!opts.backwards); });
+
+	saveOriginalOpts(opts);
+
+	// clearType corrections
+	if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
+		clearTypeFix($slides);
+
+	// container requires non-static position so that slides can be position within
+	if ($cont.css('position') == 'static')
+		$cont.css('position', 'relative');
+	if (opts.width)
+		$cont.width(opts.width);
+	if (opts.height && opts.height != 'auto')
+		$cont.height(opts.height);
+
+	if (opts.startingSlide != undefined) {
+		opts.startingSlide = parseInt(opts.startingSlide,10);
+		if (opts.startingSlide >= els.length || opts.startSlide < 0)
+			opts.startingSlide = 0; // catch bogus input
+		else 
+			startingSlideSpecified = true;
+	}
+	else if (opts.backwards)
+		opts.startingSlide = els.length - 1;
+	else
+		opts.startingSlide = 0;
+
+	// if random, mix up the slide array
+	if (opts.random) {
+		opts.randomMap = [];
+		for (var i = 0; i < els.length; i++)
+			opts.randomMap.push(i);
+		opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
+		if (startingSlideSpecified) {
+			// try to find the specified starting slide and if found set start slide index in the map accordingly
+			for ( var cnt = 0; cnt < els.length; cnt++ ) {
+				if ( opts.startingSlide == opts.randomMap[cnt] ) {
+					opts.randomIndex = cnt;
+				}
+			}
+		}
+		else {
+			opts.randomIndex = 1;
+			opts.startingSlide = opts.randomMap[1];
+		}
+	}
+	else if (opts.startingSlide >= els.length)
+		opts.startingSlide = 0; // catch bogus input
+	opts.currSlide = opts.startingSlide || 0;
+	var first = opts.startingSlide;
+
+	// set position and zIndex on all the slides
+	$slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) {
+		var z;
+		if (opts.backwards)
+			z = first ? i <= first ? els.length + (i-first) : first-i : els.length-i;
+		else
+			z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i;
+		$(this).css('z-index', z)
+	});
+
+	// make sure first slide is visible
+	$(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case
+	removeFilter(els[first], opts);
+
+	// stretch slides
+	if (opts.fit) {
+		if (!opts.aspect) {
+	        if (opts.width)
+	            $slides.width(opts.width);
+	        if (opts.height && opts.height != 'auto')
+	            $slides.height(opts.height);
+		} else {
+			$slides.each(function(){
+				var $slide = $(this);
+				var ratio = (opts.aspect === true) ? $slide.width()/$slide.height() : opts.aspect;
+				if( opts.width && $slide.width() != opts.width ) {
+					$slide.width( opts.width );
+					$slide.height( opts.width / ratio );
+				}
+
+				if( opts.height && $slide.height() < opts.height ) {
+					$slide.height( opts.height );
+					$slide.width( opts.height * ratio );
+				}
+			});
+		}
+	}
+
+	if (opts.center && ((!opts.fit) || opts.aspect)) {
+		$slides.each(function(){
+			var $slide = $(this);
+			$slide.css({
+				"margin-left": opts.width ?
+					((opts.width - $slide.width()) / 2) + "px" :
+					0,
+				"margin-top": opts.height ?
+					((opts.height - $slide.height()) / 2) + "px" :
+					0
+			});
+		});
+	}
+
+	if (opts.center && !opts.fit && !opts.slideResize) {
+	  	$slides.each(function(){
+	    	var $slide = $(this);
+	    	$slide.css({
+	      		"margin-left": opts.width ? ((opts.width - $slide.width()) / 2) + "px" : 0,
+	      		"margin-top": opts.height ? ((opts.height - $slide.height()) / 2) + "px" : 0
+	    	});
+	  	});
+	}
+		
+	// stretch container
+	var reshape = opts.containerResize && !$cont.innerHeight();
+	if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9
+		var maxw = 0, maxh = 0;
+		for(var j=0; j < els.length; j++) {
+			var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight();
+			if (!w) w = e.offsetWidth || e.width || $e.attr('width');
+			if (!h) h = e.offsetHeight || e.height || $e.attr('height');
+			maxw = w > maxw ? w : maxw;
+			maxh = h > maxh ? h : maxh;
+		}
+		if (maxw > 0 && maxh > 0)
+			$cont.css({width:maxw+'px',height:maxh+'px'});
+	}
+
+	var pauseFlag = false;  // https://github.com/malsup/cycle/issues/44
+	if (opts.pause)
+		$cont.hover(
+			function(){
+				pauseFlag = true;
+				this.cyclePause++;
+				triggerPause(cont, true);
+			},
+			function(){
+				pauseFlag && this.cyclePause--;
+				triggerPause(cont, true);
+			}
+		);
+
+	if (supportMultiTransitions(opts) === false)
+		return false;
+
+	// apparently a lot of people use image slideshows without height/width attributes on the images.
+	// Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that.
+	var requeue = false;
+	options.requeueAttempts = options.requeueAttempts || 0;
+	$slides.each(function() {
+		// try to get height/width of each slide
+		var $el = $(this);
+		this.cycleH = (opts.fit && opts.height) ? opts.height : ($el.height() || this.offsetHeight || this.height || $el.attr('height') || 0);
+		this.cycleW = (opts.fit && opts.width) ? opts.width : ($el.width() || this.offsetWidth || this.width || $el.attr('width') || 0);
+
+		if ( $el.is('img') ) {
+			// sigh..  sniffing, hacking, shrugging...  this crappy hack tries to account for what browsers do when
+			// an image is being downloaded and the markup did not include sizing info (height/width attributes);
+			// there seems to be some "default" sizes used in this situation
+			var loadingIE	= ($.browser.msie  && this.cycleW == 28 && this.cycleH == 30 && !this.complete);
+			var loadingFF	= ($.browser.mozilla && this.cycleW == 34 && this.cycleH == 19 && !this.complete);
+			var loadingOp	= ($.browser.opera && ((this.cycleW == 42 && this.cycleH == 19) || (this.cycleW == 37 && this.cycleH == 17)) && !this.complete);
+			var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete);
+			// don't requeue for images that are still loading but have a valid size
+			if (loadingIE || loadingFF || loadingOp || loadingOther) {
+				if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever
+					log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH);
+					setTimeout(function() {$(o.s,o.c).cycle(options)}, opts.requeueTimeout);
+					requeue = true;
+					return false; // break each loop
+				}
+				else {
+					log('could not determine size of image: '+this.src, this.cycleW, this.cycleH);
+				}
+			}
+		}
+		return true;
+	});
+
+	if (requeue)
+		return false;
+
+	opts.cssBefore = opts.cssBefore || {};
+	opts.cssAfter = opts.cssAfter || {};
+	opts.cssFirst = opts.cssFirst || {};
+	opts.animIn = opts.animIn || {};
+	opts.animOut = opts.animOut || {};
+
+	$slides.not(':eq('+first+')').css(opts.cssBefore);
+	$($slides[first]).css(opts.cssFirst);
+
+	if (opts.timeout) {
+		opts.timeout = parseInt(opts.timeout,10);
+		// ensure that timeout and speed settings are sane
+		if (opts.speed.constructor == String)
+			opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed,10);
+		if (!opts.sync)
+			opts.speed = opts.speed / 2;
+		
+		var buffer = opts.fx == 'none' ? 0 : opts.fx == 'shuffle' ? 500 : 250;
+		while((opts.timeout - opts.speed) < buffer) // sanitize timeout
+			opts.timeout += opts.speed;
+	}
+	if (opts.easing)
+		opts.easeIn = opts.easeOut = opts.easing;
+	if (!opts.speedIn)
+		opts.speedIn = opts.speed;
+	if (!opts.speedOut)
+		opts.speedOut = opts.speed;
+
+	opts.slideCount = els.length;
+	opts.currSlide = opts.lastSlide = first;
+	if (opts.random) {
+		if (++opts.randomIndex == els.length)
+			opts.randomIndex = 0;
+		opts.nextSlide = opts.randomMap[opts.randomIndex];
+	}
+	else if (opts.backwards)
+		opts.nextSlide = opts.startingSlide == 0 ? (els.length-1) : opts.startingSlide-1;
+	else
+		opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1;
+
+	// run transition init fn
+	if (!opts.multiFx) {
+		var init = $.fn.cycle.transitions[opts.fx];
+		if ($.isFunction(init))
+			init($cont, $slides, opts);
+		else if (opts.fx != 'custom' && !opts.multiFx) {
+			log('unknown transition: ' + opts.fx,'; slideshow terminating');
+			return false;
+		}
+	}
+
+	// fire artificial events
+	var e0 = $slides[first];
+	if (!opts.skipInitializationCallbacks) {
+		if (opts.before.length)
+			opts.before[0].apply(e0, [e0, e0, opts, true]);
+		if (opts.after.length)
+			opts.after[0].apply(e0, [e0, e0, opts, true]);
+	}
+	if (opts.next)
+		$(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,1)});
+	if (opts.prev)
+		$(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,0)});
+	if (opts.pager || opts.pagerAnchorBuilder)
+		buildPager(els,opts);
+
+	exposeAddSlide(opts, els);
+
+	return opts;
+};
+
+// save off original opts so we can restore after clearing state
+function saveOriginalOpts(opts) {
+	opts.original = { before: [], after: [] };
+	opts.original.cssBefore = $.extend({}, opts.cssBefore);
+	opts.original.cssAfter  = $.extend({}, opts.cssAfter);
+	opts.original.animIn	= $.extend({}, opts.animIn);
+	opts.original.animOut   = $.extend({}, opts.animOut);
+	$.each(opts.before, function() { opts.original.before.push(this); });
+	$.each(opts.after,  function() { opts.original.after.push(this); });
+};
+
+function supportMultiTransitions(opts) {
+	var i, tx, txs = $.fn.cycle.transitions;
+	// look for multiple effects
+	if (opts.fx.indexOf(',') > 0) {
+		opts.multiFx = true;
+		opts.fxs = opts.fx.replace(/\s*/g,'').split(',');
+		// discard any bogus effect names
+		for (i=0; i < opts.fxs.length; i++) {
+			var fx = opts.fxs[i];
+			tx = txs[fx];
+			if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) {
+				log('discarding unknown transition: ',fx);
+				opts.fxs.splice(i,1);
+				i--;
+			}
+		}
+		// if we have an empty list then we threw everything away!
+		if (!opts.fxs.length) {
+			log('No valid transitions named; slideshow terminating.');
+			return false;
+		}
+	}
+	else if (opts.fx == 'all') {  // auto-gen the list of transitions
+		opts.multiFx = true;
+		opts.fxs = [];
+		for (p in txs) {
+			tx = txs[p];
+			if (txs.hasOwnProperty(p) && $.isFunction(tx))
+				opts.fxs.push(p);
+		}
+	}
+	if (opts.multiFx && opts.randomizeEffects) {
+		// munge the fxs array to make effect selection random
+		var r1 = Math.floor(Math.random() * 20) + 30;
+		for (i = 0; i < r1; i++) {
+			var r2 = Math.floor(Math.random() * opts.fxs.length);
+			opts.fxs.push(opts.fxs.splice(r2,1)[0]);
+		}
+		debug('randomized fx sequence: ',opts.fxs);
+	}
+	return true;
+};
+
+// provide a mechanism for adding slides after the slideshow has started
+function exposeAddSlide(opts, els) {
+	opts.addSlide = function(newSlide, prepend) {
+		var $s = $(newSlide), s = $s[0];
+		if (!opts.autostopCount)
+			opts.countdown++;
+		els[prepend?'unshift':'push'](s);
+		if (opts.els)
+			opts.els[prepend?'unshift':'push'](s); // shuffle needs this
+		opts.slideCount = els.length;
+
+		// add the slide to the random map and resort
+		if (opts.random) {
+			opts.randomMap.push(opts.slideCount-1);
+			opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
+		}
+
+		$s.css('position','absolute');
+		$s[prepend?'prependTo':'appendTo'](opts.$cont);
+
+		if (prepend) {
+			opts.currSlide++;
+			opts.nextSlide++;
+		}
+
+		if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
+			clearTypeFix($s);
+
+		if (opts.fit && opts.width)
+			$s.width(opts.width);
+		if (opts.fit && opts.height && opts.height != 'auto')
+			$s.height(opts.height);
+		s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height();
+		s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width();
+
+		$s.css(opts.cssBefore);
+
+		if (opts.pager || opts.pagerAnchorBuilder)
+			$.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts);
+
+		if ($.isFunction(opts.onAddSlide))
+			opts.onAddSlide($s);
+		else
+			$s.hide(); // default behavior
+	};
+}
+
+// reset internal state; we do this on every pass in order to support multiple effects
+$.fn.cycle.resetState = function(opts, fx) {
+	fx = fx || opts.fx;
+	opts.before = []; opts.after = [];
+	opts.cssBefore = $.extend({}, opts.original.cssBefore);
+	opts.cssAfter  = $.extend({}, opts.original.cssAfter);
+	opts.animIn	= $.extend({}, opts.original.animIn);
+	opts.animOut   = $.extend({}, opts.original.animOut);
+	opts.fxFn = null;
+	$.each(opts.original.before, function() { opts.before.push(this); });
+	$.each(opts.original.after,  function() { opts.after.push(this); });
+
+	// re-init
+	var init = $.fn.cycle.transitions[fx];
+	if ($.isFunction(init))
+		init(opts.$cont, $(opts.elements), opts);
+};
+
+// this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt
+function go(els, opts, manual, fwd) {
+	// opts.busy is true if we're in the middle of an animation
+	if (manual && opts.busy && opts.manualTrump) {
+		// let manual transitions requests trump active ones
+		debug('manualTrump in go(), stopping active transition');
+		$(els).stop(true,true);
+		opts.busy = 0;
+	}
+	// don't begin another timeout-based transition if there is one active
+	if (opts.busy) {
+		debug('transition active, ignoring new tx request');
+		return;
+	}
+
+	var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide];
+
+	// stop cycling if we have an outstanding stop request
+	if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual)
+		return;
+
+	// check to see if we should stop cycling based on autostop options
+	if (!manual && !p.cyclePause && !opts.bounce &&
+		((opts.autostop && (--opts.countdown <= 0)) ||
+		(opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) {
+		if (opts.end)
+			opts.end(opts);
+		return;
+	}
+
+	// if slideshow is paused, only transition on a manual trigger
+	var changed = false;
+	if ((manual || !p.cyclePause) && (opts.nextSlide != opts.currSlide)) {
+		changed = true;
+		var fx = opts.fx;
+		// keep trying to get the slide size if we don't have it yet
+		curr.cycleH = curr.cycleH || $(curr).height();
+		curr.cycleW = curr.cycleW || $(curr).width();
+		next.cycleH = next.cycleH || $(next).height();
+		next.cycleW = next.cycleW || $(next).width();
+
+		// support multiple transition types
+		if (opts.multiFx) {
+			if (fwd && (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length))
+				opts.lastFx = 0;
+			else if (!fwd && (opts.lastFx == undefined || --opts.lastFx < 0))
+				opts.lastFx = opts.fxs.length - 1;
+			fx = opts.fxs[opts.lastFx];
+		}
+
+		// one-time fx overrides apply to:  $('div').cycle(3,'zoom');
+		if (opts.oneTimeFx) {
+			fx = opts.oneTimeFx;
+			opts.oneTimeFx = null;
+		}
+
+		$.fn.cycle.resetState(opts, fx);
+
+		// run the before callbacks
+		if (opts.before.length)
+			$.each(opts.before, function(i,o) {
+				if (p.cycleStop != opts.stopCount) return;
+				o.apply(next, [curr, next, opts, fwd]);
+			});
+
+		// stage the after callacks
+		var after = function() {
+			opts.busy = 0;
+			$.each(opts.after, function(i,o) {
+				if (p.cycleStop != opts.stopCount) return;
+				o.apply(next, [curr, next, opts, fwd]);
+			});
+			if (!p.cycleStop) {
+				// queue next transition
+				queueNext();
+			}
+		};
+
+		debug('tx firing('+fx+'); currSlide: ' + opts.currSlide + '; nextSlide: ' + opts.nextSlide);
+		
+		// get ready to perform the transition
+		opts.busy = 1;
+		if (opts.fxFn) // fx function provided?
+			opts.fxFn(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
+		else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ?
+			$.fn.cycle[opts.fx](curr, next, opts, after, fwd, manual && opts.fastOnEvent);
+		else
+			$.fn.cycle.custom(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
+	}
+	else {
+		queueNext();
+	}
+
+	if (changed || opts.nextSlide == opts.currSlide) {
+		// calculate the next slide
+		opts.lastSlide = opts.currSlide;
+		if (opts.random) {
+			opts.currSlide = opts.nextSlide;
+			if (++opts.randomIndex == els.length) {
+				opts.randomIndex = 0;
+				opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
+			}
+			opts.nextSlide = opts.randomMap[opts.randomIndex];
+			if (opts.nextSlide == opts.currSlide)
+				opts.nextSlide = (opts.currSlide == opts.slideCount - 1) ? 0 : opts.currSlide + 1;
+		}
+		else if (opts.backwards) {
+			var roll = (opts.nextSlide - 1) < 0;
+			if (roll && opts.bounce) {
+				opts.backwards = !opts.backwards;
+				opts.nextSlide = 1;
+				opts.currSlide = 0;
+			}
+			else {
+				opts.nextSlide = roll ? (els.length-1) : opts.nextSlide-1;
+				opts.currSlide = roll ? 0 : opts.nextSlide+1;
+			}
+		}
+		else { // sequence
+			var roll = (opts.nextSlide + 1) == els.length;
+			if (roll && opts.bounce) {
+				opts.backwards = !opts.backwards;
+				opts.nextSlide = els.length-2;
+				opts.currSlide = els.length-1;
+			}
+			else {
+				opts.nextSlide = roll ? 0 : opts.nextSlide+1;
+				opts.currSlide = roll ? els.length-1 : opts.nextSlide-1;
+			}
+		}
+	}
+	if (changed && opts.pager)
+		opts.updateActivePagerLink(opts.pager, opts.currSlide, opts.activePagerClass);
+	
+	function queueNext() {
+		// stage the next transition
+		var ms = 0, timeout = opts.timeout;
+		if (opts.timeout && !opts.continuous) {
+			ms = getTimeout(els[opts.currSlide], els[opts.nextSlide], opts, fwd);
+         if (opts.fx == 'shuffle')
+            ms -= opts.speedOut;
+      }
+		else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic
+			ms = 10;
+		if (ms > 0)
+			p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.backwards) }, ms);
+	}
+};
+
+// invoked after transition
+$.fn.cycle.updateActivePagerLink = function(pager, currSlide, clsName) {
+   $(pager).each(function() {
+       $(this).children().removeClass(clsName).eq(currSlide).addClass(clsName);
+   });
+};
+
+// calculate timeout value for current transition
+function getTimeout(curr, next, opts, fwd) {
+	if (opts.timeoutFn) {
+		// call user provided calc fn
+		var t = opts.timeoutFn.call(curr,curr,next,opts,fwd);
+		while (opts.fx != 'none' && (t - opts.speed) < 250) // sanitize timeout
+			t += opts.speed;
+		debug('calculated timeout: ' + t + '; speed: ' + opts.speed);
+		if (t !== false)
+			return t;
+	}
+	return opts.timeout;
+};
+
+// expose next/prev function, caller must pass in state
+$.fn.cycle.next = function(opts) { advance(opts,1); };
+$.fn.cycle.prev = function(opts) { advance(opts,0);};
+
+// advance slide forward or back
+function advance(opts, moveForward) {
+	var val = moveForward ? 1 : -1;
+	var els = opts.elements;
+	var p = opts.$cont[0], timeout = p.cycleTimeout;
+	if (timeout) {
+		clearTimeout(timeout);
+		p.cycleTimeout = 0;
+	}
+	if (opts.random && val < 0) {
+		// move back to the previously display slide
+		opts.randomIndex--;
+		if (--opts.randomIndex == -2)
+			opts.randomIndex = els.length-2;
+		else if (opts.randomIndex == -1)
+			opts.randomIndex = els.length-1;
+		opts.nextSlide = opts.randomMap[opts.randomIndex];
+	}
+	else if (opts.random) {
+		opts.nextSlide = opts.randomMap[opts.randomIndex];
+	}
+	else {
+		opts.nextSlide = opts.currSlide + val;
+		if (opts.nextSlide < 0) {
+			if (opts.nowrap) return false;
+			opts.nextSlide = els.length - 1;
+		}
+		else if (opts.nextSlide >= els.length) {
+			if (opts.nowrap) return false;
+			opts.nextSlide = 0;
+		}
+	}
+
+	var cb = opts.onPrevNextEvent || opts.prevNextClick; // prevNextClick is deprecated
+	if ($.isFunction(cb))
+		cb(val > 0, opts.nextSlide, els[opts.nextSlide]);
+	go(els, opts, 1, moveForward);
+	return false;
+};
+
+function buildPager(els, opts) {
+	var $p = $(opts.pager);
+	$.each(els, function(i,o) {
+		$.fn.cycle.createPagerAnchor(i,o,$p,els,opts);
+	});
+	opts.updateActivePagerLink(opts.pager, opts.startingSlide, opts.activePagerClass);
+};
+
+$.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) {
+	var a;
+	if ($.isFunction(opts.pagerAnchorBuilder)) {
+		a = opts.pagerAnchorBuilder(i,el);
+		debug('pagerAnchorBuilder('+i+', el) returned: ' + a);
+	}
+	else
+		a = '<a href="#">'+(i+1)+'</a>';
+		
+	if (!a)
+		return;
+	var $a = $(a);
+	// don't reparent if anchor is in the dom
+	if ($a.parents('body').length === 0) {
+		var arr = [];
+		if ($p.length > 1) {
+			$p.each(function() {
+				var $clone = $a.clone(true);
+				$(this).append($clone);
+				arr.push($clone[0]);
+			});
+			$a = $(arr);
+		}
+		else {
+			$a.appendTo($p);
+		}
+	}
+
+	opts.pagerAnchors =  opts.pagerAnchors || [];
+	opts.pagerAnchors.push($a);
+	
+	var pagerFn = function(e) {
+		e.preventDefault();
+		opts.nextSlide = i;
+		var p = opts.$cont[0], timeout = p.cycleTimeout;
+		if (timeout) {
+			clearTimeout(timeout);
+			p.cycleTimeout = 0;
+		}
+		var cb = opts.onPagerEvent || opts.pagerClick; // pagerClick is deprecated
+		if ($.isFunction(cb))
+			cb(opts.nextSlide, els[opts.nextSlide]);
+		go(els,opts,1,opts.currSlide < i); // trigger the trans
+//		return false; // <== allow bubble
+	}
+	
+	if ( /mouseenter|mouseover/i.test(opts.pagerEvent) ) {
+		$a.hover(pagerFn, function(){/* no-op */} );
+	}
+	else {
+		$a.bind(opts.pagerEvent, pagerFn);
+	}
+	
+	if ( ! /^click/.test(opts.pagerEvent) && !opts.allowPagerClickBubble)
+		$a.bind('click.cycle', function(){return false;}); // suppress click
+	
+	var cont = opts.$cont[0];
+	var pauseFlag = false; // https://github.com/malsup/cycle/issues/44
+	if (opts.pauseOnPagerHover) {
+		$a.hover(
+			function() { 
+				pauseFlag = true;
+				cont.cyclePause++; 
+				triggerPause(cont,true,true);
+			}, function() { 
+				pauseFlag && cont.cyclePause--; 
+				triggerPause(cont,true,true);
+			} 
+		);
+	}
+};
+
+// helper fn to calculate the number of slides between the current and the next
+$.fn.cycle.hopsFromLast = function(opts, fwd) {
+	var hops, l = opts.lastSlide, c = opts.currSlide;
+	if (fwd)
+		hops = c > l ? c - l : opts.slideCount - l;
+	else
+		hops = c < l ? l - c : l + opts.slideCount - c;
+	return hops;
+};
+
+// fix clearType problems in ie6 by setting an explicit bg color
+// (otherwise text slides look horrible during a fade transition)
+function clearTypeFix($slides) {
+	debug('applying clearType background-color hack');
+	function hex(s) {
+		s = parseInt(s,10).toString(16);
+		return s.length < 2 ? '0'+s : s;
+	};
+	function getBg(e) {
+		for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) {
+			var v = $.css(e,'background-color');
+			if (v && v.indexOf('rgb') >= 0 ) {
+				var rgb = v.match(/\d+/g);
+				return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
+			}
+			if (v && v != 'transparent')
+				return v;
+		}
+		return '#ffffff';
+	};
+	$slides.each(function() { $(this).css('background-color', getBg(this)); });
+};
+
+// reset common props before the next transition
+$.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) {
+	$(opts.elements).not(curr).hide();
+	if (typeof opts.cssBefore.opacity == 'undefined')
+		opts.cssBefore.opacity = 1;
+	opts.cssBefore.display = 'block';
+	if (opts.slideResize && w !== false && next.cycleW > 0)
+		opts.cssBefore.width = next.cycleW;
+	if (opts.slideResize && h !== false && next.cycleH > 0)
+		opts.cssBefore.height = next.cycleH;
+	opts.cssAfter = opts.cssAfter || {};
+	opts.cssAfter.display = 'none';
+	$(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0));
+	$(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1));
+};
+
+// the actual fn for effecting a transition
+$.fn.cycle.custom = function(curr, next, opts, cb, fwd, speedOverride) {
+	var $l = $(curr), $n = $(next);
+	var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut;
+	$n.css(opts.cssBefore);
+	if (speedOverride) {
+		if (typeof speedOverride == 'number')
+			speedIn = speedOut = speedOverride;
+		else
+			speedIn = speedOut = 1;
+		easeIn = easeOut = null;
+	}
+	var fn = function() {
+		$n.animate(opts.animIn, speedIn, easeIn, function() {
+			cb();
+		});
+	};
+	$l.animate(opts.animOut, speedOut, easeOut, function() {
+		$l.css(opts.cssAfter);
+		if (!opts.sync) 
+			fn();
+	});
+	if (opts.sync) fn();
+};
+
+// transition definitions - only fade is defined here, transition pack defines the rest
+$.fn.cycle.transitions = {
+	fade: function($cont, $slides, opts) {
+		$slides.not(':eq('+opts.currSlide+')').css('opacity',0);
+		opts.before.push(function(curr,next,opts) {
+			$.fn.cycle.commonReset(curr,next,opts);
+			opts.cssBefore.opacity = 0;
+		});
+		opts.animIn	   = { opacity: 1 };
+		opts.animOut   = { opacity: 0 };
+		opts.cssBefore = { top: 0, left: 0 };
+	}
+};
+
+$.fn.cycle.ver = function() { return ver; };
+
+// override these globally if you like (they are all optional)
+$.fn.cycle.defaults = {
+	activePagerClass: 'activeSlide', // class name used for the active pager link
+	after:		   null,  // transition callback (scope set to element that was shown):  function(currSlideElement, nextSlideElement, options, forwardFlag)
+	allowPagerClickBubble: false, // allows or prevents click event on pager anchors from bubbling
+	animIn:		   null,  // properties that define how the slide animates in
+	animOut:	   null,  // properties that define how the slide animates out
+	aspect:		   false,  // preserve aspect ratio during fit resizing, cropping if necessary (must be used with fit option)
+	autostop:	   0,	  // true to end slideshow after X transitions (where X == slide count)
+	autostopCount: 0,	  // number of transitions (optionally used with autostop to define X)
+	backwards:     false, // true to start slideshow at last slide and move backwards through the stack
+	before:		   null,  // transition callback (scope set to element to be shown):	 function(currSlideElement, nextSlideElement, options, forwardFlag)
+	center: 	   null,  // set to true to have cycle add top/left margin to each slide (use with width and height options)
+	cleartype:	   !$.support.opacity,  // true if clearType corrections should be applied (for IE)
+	cleartypeNoBg: false, // set to true to disable extra cleartype fixing (leave false to force background color setting on slides)
+	containerResize: 1,	  // resize container to fit largest slide
+	continuous:	   0,	  // true to start next transition immediately after current one completes
+	cssAfter:	   null,  // properties that defined the state of the slide after transitioning out
+	cssBefore:	   null,  // properties that define the initial state of the slide before transitioning in
+	delay:		   0,	  // additional delay (in ms) for first transition (hint: can be negative)
+	easeIn:		   null,  // easing for "in" transition
+	easeOut:	   null,  // easing for "out" transition
+	easing:		   null,  // easing method for both in and out transitions
+	end:		   null,  // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options)
+	fastOnEvent:   0,	  // force fast transitions when triggered manually (via pager or prev/next); value == time in ms
+	fit:		   0,	  // force slides to fit container
+	fx:			  'fade', // name of transition effect (or comma separated names, ex: 'fade,scrollUp,shuffle')
+	fxFn:		   null,  // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag)
+	height:		  'auto', // container height (if the 'fit' option is true, the slides will be set to this height as well)
+	manualTrump:   true,  // causes manual transition to stop an active transition instead of being ignored
+	metaAttr:     'cycle',// data- attribute that holds the option data for the slideshow
+	next:		   null,  // element, jQuery object, or jQuery selector string for the element to use as event trigger for next slide
+	nowrap:		   0,	  // true to prevent slideshow from wrapping
+	onPagerEvent:  null,  // callback fn for pager events: function(zeroBasedSlideIndex, slideElement)
+	onPrevNextEvent: null,// callback fn for prev/next events: function(isNext, zeroBasedSlideIndex, slideElement)
+	pager:		   null,  // element, jQuery object, or jQuery selector string for the element to use as pager container
+	pagerAnchorBuilder: null, // callback fn for building anchor links:  function(index, DOMelement)
+	pagerEvent:	  'click.cycle', // name of event which drives the pager navigation
+	pause:		   0,	  // true to enable "pause on hover"
+	pauseOnPagerHover: 0, // true to pause when hovering over pager link
+	prev:		   null,  // element, jQuery object, or jQuery selector string for the element to use as event trigger for previous slide
+	prevNextEvent:'click.cycle',// event which drives the manual transition to the previous or next slide
+	random:		   0,	  // true for random, false for sequence (not applicable to shuffle fx)
+	randomizeEffects: 1,  // valid when multiple effects are used; true to make the effect sequence random
+	requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded
+	requeueTimeout: 250,  // ms delay for requeue
+	rev:		   0,	  // causes animations to transition in reverse (for effects that support it such as scrollHorz/scrollVert/shuffle)
+	shuffle:	   null,  // coords for shuffle animation, ex: { top:15, left: 200 }
+	skipInitializationCallbacks: false, // set to true to disable the first before/after callback that occurs prior to any transition
+	slideExpr:	   null,  // expression for selecting slides (if something other than all children is required)
+	slideResize:   1,     // force slide width/height to fixed size before every transition
+	speed:		   1000,  // speed of the transition (any valid fx speed value)
+	speedIn:	   null,  // speed of the 'in' transition
+	speedOut:	   null,  // speed of the 'out' transition
+	startingSlide: undefined,	  // zero-based index of the first slide to be displayed
+	sync:		   1,	  // true if in/out transitions should occur simultaneously
+	timeout:	   4000,  // milliseconds between slide transitions (0 to disable auto advance)
+	timeoutFn:     null,  // callback for determining per-slide timeout value:  function(currSlideElement, nextSlideElement, options, forwardFlag)
+	updateActivePagerLink: null, // callback fn invoked to update the active pager link (adds/removes activePagerClass style)
+	width:         null   // container width (if the 'fit' option is true, the slides will be set to this width as well)
+};
+
+})(jQuery);
+
+
+/*!
+ * jQuery Cycle Plugin Transition Definitions
+ * This script is a plugin for the jQuery Cycle Plugin
+ * Examples and documentation at: http://malsup.com/jquery/cycle/
+ * Copyright (c) 2007-2010 M. Alsup
+ * Version:	 2.73
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ */
+(function($) {
+
+//
+// These functions define slide initialization and properties for the named
+// transitions. To save file size feel free to remove any of these that you
+// don't need.
+//
+$.fn.cycle.transitions.none = function($cont, $slides, opts) {
+	opts.fxFn = function(curr,next,opts,after){
+		$(next).show();
+		$(curr).hide();
+		after();
+	};
+};
+
+// not a cross-fade, fadeout only fades out the top slide
+$.fn.cycle.transitions.fadeout = function($cont, $slides, opts) {
+	$slides.not(':eq('+opts.currSlide+')').css({ display: 'block', 'opacity': 1 });
+	opts.before.push(function(curr,next,opts,w,h,rev) {
+		$(curr).css('zIndex',opts.slideCount + (!rev === true ? 1 : 0));
+		$(next).css('zIndex',opts.slideCount + (!rev === true ? 0 : 1));
+	});
+	opts.animIn.opacity = 1;
+	opts.animOut.opacity = 0;
+	opts.cssBefore.opacity = 1;
+	opts.cssBefore.display = 'block';
+	opts.cssAfter.zIndex = 0;
+};
+
+// scrollUp/Down/Left/Right
+$.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) {
+	$cont.css('overflow','hidden');
+	opts.before.push($.fn.cycle.commonReset);
+	var h = $cont.height();
+	opts.cssBefore.top = h;
+	opts.cssBefore.left = 0;
+	opts.cssFirst.top = 0;
+	opts.animIn.top = 0;
+	opts.animOut.top = -h;
+};
+$.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) {
+	$cont.css('overflow','hidden');
+	opts.before.push($.fn.cycle.commonReset);
+	var h = $cont.height();
+	opts.cssFirst.top = 0;
+	opts.cssBefore.top = -h;
+	opts.cssBefore.left = 0;
+	opts.animIn.top = 0;
+	opts.animOut.top = h;
+};
+$.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) {
+	$cont.css('overflow','hidden');
+	opts.before.push($.fn.cycle.commonReset);
+	var w = $cont.width();
+	opts.cssFirst.left = 0;
+	opts.cssBefore.left = w;
+	opts.cssBefore.top = 0;
+	opts.animIn.left = 0;
+	opts.animOut.left = 0-w;
+};
+$.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) {
+	$cont.css('overflow','hidden');
+	opts.before.push($.fn.cycle.commonReset);
+	var w = $cont.width();
+	opts.cssFirst.left = 0;
+	opts.cssBefore.left = -w;
+	opts.cssBefore.top = 0;
+	opts.animIn.left = 0;
+	opts.animOut.left = w;
+};
+$.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) {
+	$cont.css('overflow','hidden').width();
+	opts.before.push(function(curr, next, opts, fwd) {
+		if (opts.rev)
+			fwd = !fwd;
+		$.fn.cycle.commonReset(curr,next,opts);
+		opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW);
+		opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW;
+	});
+	opts.cssFirst.left = 0;
+	opts.cssBefore.top = 0;
+	opts.animIn.left = 0;
+	opts.animOut.top = 0;
+};
+$.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) {
+	$cont.css('overflow','hidden');
+	opts.before.push(function(curr, next, opts, fwd) {
+		if (opts.rev)
+			fwd = !fwd;
+		$.fn.cycle.commonReset(curr,next,opts);
+		opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1);
+		opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH;
+	});
+	opts.cssFirst.top = 0;
+	opts.cssBefore.left = 0;
+	opts.animIn.top = 0;
+	opts.animOut.left = 0;
+};
+
+// slideX/slideY
+$.fn.cycle.transitions.slideX = function($cont, $slides, opts) {
+	opts.before.push(function(curr, next, opts) {
+		$(opts.elements).not(curr).hide();
+		$.fn.cycle.commonReset(curr,next,opts,false,true);
+		opts.animIn.width = next.cycleW;
+	});
+	opts.cssBefore.left = 0;
+	opts.cssBefore.top = 0;
+	opts.cssBefore.width = 0;
+	opts.animIn.width = 'show';
+	opts.animOut.width = 0;
+};
+$.fn.cycle.transitions.slideY = function($cont, $slides, opts) {
+	opts.before.push(function(curr, next, opts) {
+		$(opts.elements).not(curr).hide();
+		$.fn.cycle.commonReset(curr,next,opts,true,false);
+		opts.animIn.height = next.cycleH;
+	});
+	opts.cssBefore.left = 0;
+	opts.cssBefore.top = 0;
+	opts.cssBefore.height = 0;
+	opts.animIn.height = 'show';
+	opts.animOut.height = 0;
+};
+
+// shuffle
+$.fn.cycle.transitions.shuffle = function($cont, $slides, opts) {
+	var i, w = $cont.css('overflow', 'visible').width();
+	$slides.css({left: 0, top: 0});
+	opts.before.push(function(curr,next,opts) {
+		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
+	});
+	// only adjust speed once!
+	if (!opts.speedAdjusted) {
+		opts.speed = opts.speed / 2; // shuffle has 2 transitions
+		opts.speedAdjusted = true;
+	}
+	opts.random = 0;
+	opts.shuffle = opts.shuffle || {left:-w, top:15};
+	opts.els = [];
+	for (i=0; i < $slides.length; i++)
+		opts.els.push($slides[i]);
+
+	for (i=0; i < opts.currSlide; i++)
+		opts.els.push(opts.els.shift());
+
+	// custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!)
+	opts.fxFn = function(curr, next, opts, cb, fwd) {
+		if (opts.rev)
+			fwd = !fwd;
+		var $el = fwd ? $(curr) : $(next);
+		$(next).css(opts.cssBefore);
+		var count = opts.slideCount;
+		$el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() {
+			var hops = $.fn.cycle.hopsFromLast(opts, fwd);
+			for (var k=0; k < hops; k++)
+				fwd ? opts.els.push(opts.els.shift()) : opts.els.unshift(opts.els.pop());
+			if (fwd) {
+				for (var i=0, len=opts.els.length; i < len; i++)
+					$(opts.els[i]).css('z-index', len-i+count);
+			}
+			else {
+				var z = $(curr).css('z-index');
+				$el.css('z-index', parseInt(z,10)+1+count);
+			}
+			$el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() {
+				$(fwd ? this : curr).hide();
+				if (cb) cb();
+			});
+		});
+	};
+	$.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
+};
+
+// turnUp/Down/Left/Right
+$.fn.cycle.transitions.turnUp = function($cont, $slides, opts) {
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts,true,false);
+		opts.cssBefore.top = next.cycleH;
+		opts.animIn.height = next.cycleH;
+		opts.animOut.width = next.cycleW;
+	});
+	opts.cssFirst.top = 0;
+	opts.cssBefore.left = 0;
+	opts.cssBefore.height = 0;
+	opts.animIn.top = 0;
+	opts.animOut.height = 0;
+};
+$.fn.cycle.transitions.turnDown = function($cont, $slides, opts) {
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts,true,false);
+		opts.animIn.height = next.cycleH;
+		opts.animOut.top   = curr.cycleH;
+	});
+	opts.cssFirst.top = 0;
+	opts.cssBefore.left = 0;
+	opts.cssBefore.top = 0;
+	opts.cssBefore.height = 0;
+	opts.animOut.height = 0;
+};
+$.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) {
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts,false,true);
+		opts.cssBefore.left = next.cycleW;
+		opts.animIn.width = next.cycleW;
+	});
+	opts.cssBefore.top = 0;
+	opts.cssBefore.width = 0;
+	opts.animIn.left = 0;
+	opts.animOut.width = 0;
+};
+$.fn.cycle.transitions.turnRight = function($cont, $slides, opts) {
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts,false,true);
+		opts.animIn.width = next.cycleW;
+		opts.animOut.left = curr.cycleW;
+	});
+	$.extend(opts.cssBefore, { top: 0, left: 0, width: 0 });
+	opts.animIn.left = 0;
+	opts.animOut.width = 0;
+};
+
+// zoom
+$.fn.cycle.transitions.zoom = function($cont, $slides, opts) {
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts,false,false,true);
+		opts.cssBefore.top = next.cycleH/2;
+		opts.cssBefore.left = next.cycleW/2;
+		$.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
+		$.extend(opts.animOut, { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 });
+	});
+	opts.cssFirst.top = 0;
+	opts.cssFirst.left = 0;
+	opts.cssBefore.width = 0;
+	opts.cssBefore.height = 0;
+};
+
+// fadeZoom
+$.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) {
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts,false,false);
+		opts.cssBefore.left = next.cycleW/2;
+		opts.cssBefore.top = next.cycleH/2;
+		$.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
+	});
+	opts.cssBefore.width = 0;
+	opts.cssBefore.height = 0;
+	opts.animOut.opacity = 0;
+};
+
+// blindX
+$.fn.cycle.transitions.blindX = function($cont, $slides, opts) {
+	var w = $cont.css('overflow','hidden').width();
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts);
+		opts.animIn.width = next.cycleW;
+		opts.animOut.left   = curr.cycleW;
+	});
+	opts.cssBefore.left = w;
+	opts.cssBefore.top = 0;
+	opts.animIn.left = 0;
+	opts.animOut.left = w;
+};
+// blindY
+$.fn.cycle.transitions.blindY = function($cont, $slides, opts) {
+	var h = $cont.css('overflow','hidden').height();
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts);
+		opts.animIn.height = next.cycleH;
+		opts.animOut.top   = curr.cycleH;
+	});
+	opts.cssBefore.top = h;
+	opts.cssBefore.left = 0;
+	opts.animIn.top = 0;
+	opts.animOut.top = h;
+};
+// blindZ
+$.fn.cycle.transitions.blindZ = function($cont, $slides, opts) {
+	var h = $cont.css('overflow','hidden').height();
+	var w = $cont.width();
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts);
+		opts.animIn.height = next.cycleH;
+		opts.animOut.top   = curr.cycleH;
+	});
+	opts.cssBefore.top = h;
+	opts.cssBefore.left = w;
+	opts.animIn.top = 0;
+	opts.animIn.left = 0;
+	opts.animOut.top = h;
+	opts.animOut.left = w;
+};
+
+// growX - grow horizontally from centered 0 width
+$.fn.cycle.transitions.growX = function($cont, $slides, opts) {
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts,false,true);
+		opts.cssBefore.left = this.cycleW/2;
+		opts.animIn.left = 0;
+		opts.animIn.width = this.cycleW;
+		opts.animOut.left = 0;
+	});
+	opts.cssBefore.top = 0;
+	opts.cssBefore.width = 0;
+};
+// growY - grow vertically from centered 0 height
+$.fn.cycle.transitions.growY = function($cont, $slides, opts) {
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts,true,false);
+		opts.cssBefore.top = this.cycleH/2;
+		opts.animIn.top = 0;
+		opts.animIn.height = this.cycleH;
+		opts.animOut.top = 0;
+	});
+	opts.cssBefore.height = 0;
+	opts.cssBefore.left = 0;
+};
+
+// curtainX - squeeze in both edges horizontally
+$.fn.cycle.transitions.curtainX = function($cont, $slides, opts) {
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts,false,true,true);
+		opts.cssBefore.left = next.cycleW/2;
+		opts.animIn.left = 0;
+		opts.animIn.width = this.cycleW;
+		opts.animOut.left = curr.cycleW/2;
+		opts.animOut.width = 0;
+	});
+	opts.cssBefore.top = 0;
+	opts.cssBefore.width = 0;
+};
+// curtainY - squeeze in both edges vertically
+$.fn.cycle.transitions.curtainY = function($cont, $slides, opts) {
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts,true,false,true);
+		opts.cssBefore.top = next.cycleH/2;
+		opts.animIn.top = 0;
+		opts.animIn.height = next.cycleH;
+		opts.animOut.top = curr.cycleH/2;
+		opts.animOut.height = 0;
+	});
+	opts.cssBefore.height = 0;
+	opts.cssBefore.left = 0;
+};
+
+// cover - curr slide covered by next slide
+$.fn.cycle.transitions.cover = function($cont, $slides, opts) {
+	var d = opts.direction || 'left';
+	var w = $cont.css('overflow','hidden').width();
+	var h = $cont.height();
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts);
+		if (d == 'right')
+			opts.cssBefore.left = -w;
+		else if (d == 'up')
+			opts.cssBefore.top = h;
+		else if (d == 'down')
+			opts.cssBefore.top = -h;
+		else
+			opts.cssBefore.left = w;
+	});
+	opts.animIn.left = 0;
+	opts.animIn.top = 0;
+	opts.cssBefore.top = 0;
+	opts.cssBefore.left = 0;
+};
+
+// uncover - curr slide moves off next slide
+$.fn.cycle.transitions.uncover = function($cont, $slides, opts) {
+	var d = opts.direction || 'left';
+	var w = $cont.css('overflow','hidden').width();
+	var h = $cont.height();
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
+		if (d == 'right')
+			opts.animOut.left = w;
+		else if (d == 'up')
+			opts.animOut.top = -h;
+		else if (d == 'down')
+			opts.animOut.top = h;
+		else
+			opts.animOut.left = -w;
+	});
+	opts.animIn.left = 0;
+	opts.animIn.top = 0;
+	opts.cssBefore.top = 0;
+	opts.cssBefore.left = 0;
+};
+
+// toss - move top slide and fade away
+$.fn.cycle.transitions.toss = function($cont, $slides, opts) {
+	var w = $cont.css('overflow','visible').width();
+	var h = $cont.height();
+	opts.before.push(function(curr, next, opts) {
+		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
+		// provide default toss settings if animOut not provided
+		if (!opts.animOut.left && !opts.animOut.top)
+			$.extend(opts.animOut, { left: w*2, top: -h/2, opacity: 0 });
+		else
+			opts.animOut.opacity = 0;
+	});
+	opts.cssBefore.left = 0;
+	opts.cssBefore.top = 0;
+	opts.animIn.left = 0;
+};
+
+// wipe - clip animation
+$.fn.cycle.transitions.wipe = function($cont, $slides, opts) {
+	var w = $cont.css('overflow','hidden').width();
+	var h = $cont.height();
+	opts.cssBefore = opts.cssBefore || {};
+	var clip;
+	if (opts.clip) {
+		if (/l2r/.test(opts.clip))
+			clip = 'rect(0px 0px '+h+'px 0px)';
+		else if (/r2l/.test(opts.clip))
+			clip = 'rect(0px '+w+'px '+h+'px '+w+'px)';
+		else if (/t2b/.test(opts.clip))
+			clip = 'rect(0px '+w+'px 0px 0px)';
+		else if (/b2t/.test(opts.clip))
+			clip = 'rect('+h+'px '+w+'px '+h+'px 0px)';
+		else if (/zoom/.test(opts.clip)) {
+			var top = parseInt(h/2,10);
+			var left = parseInt(w/2,10);
+			clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)';
+		}
+	}
+
+	opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)';
+
+	var d = opts.cssBefore.clip.match(/(\d+)/g);
+	var t = parseInt(d[0],10), r = parseInt(d[1],10), b = parseInt(d[2],10), l = parseInt(d[3],10);
+
+	opts.before.push(function(curr, next, opts) {
+		if (curr == next) return;
+		var $curr = $(curr), $next = $(next);
+		$.fn.cycle.commonReset(curr,next,opts,true,true,false);
+		opts.cssAfter.display = 'block';
+
+		var step = 1, count = parseInt((opts.speedIn / 13),10) - 1;
+		(function f() {
+			var tt = t ? t - parseInt(step * (t/count),10) : 0;
+			var ll = l ? l - parseInt(step * (l/count),10) : 0;
+			var bb = b < h ? b + parseInt(step * ((h-b)/count || 1),10) : h;
+			var rr = r < w ? r + parseInt(step * ((w-r)/count || 1),10) : w;
+			$next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' });
+			(step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none');
+		})();
+	});
+	$.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
+	opts.animIn	   = { left: 0 };
+	opts.animOut   = { left: 0 };
+};
+
+})(jQuery);
diff --git a/htmltest/sites/all/libraries/jsonpath-0.8.1.php b/htmltest/sites/all/libraries/jsonpath-0.8.1.php
new file mode 100644
index 00000000..0dbbaf48
--- /dev/null
+++ b/htmltest/sites/all/libraries/jsonpath-0.8.1.php
@@ -0,0 +1,111 @@
+<?php
+/* JSONPath 0.8.1 - XPath for JSON
+ *
+ * Copyright (c) 2007 Stefan Goessner (goessner.net)
+ * Licensed under the MIT (MIT-LICENSE.txt) licence.
+ */
+
+// API function 
+function jsonPath($obj, $expr, $args=null) {
+   $jsonpath = new JsonPath();
+   $jsonpath->resultType = ($args ? $args['resultType'] : "VALUE");
+   $x = $jsonpath->normalize($expr);
+   $jsonpath->obj = $obj;
+   if ($expr && $obj && ($jsonpath->resultType == "VALUE" || $jsonpath->resultType == "PATH")) {
+      $jsonpath->trace(preg_replace("/^\\$;/", "", $x), $obj, "$");
+      if (count($jsonpath->result))
+         return $jsonpath->result;
+      else
+         return false;
+   }
+}
+
+// JsonPath class (internal use only)
+class JsonPath {
+   var $obj = null;
+   var $resultType = "Value";
+   var $result = array();
+   var $subx = array();
+
+   // normalize path expression
+   function normalize($x) {
+      $x = preg_replace_callback("/[\['](\??\(.*?\))[\]']/", array(&$this, "_callback_01"), $x);
+      $x = preg_replace(array("/'?\.'?|\['?/", "/;;;|;;/", "/;$|'?\]|'$/"),
+                        array(";", ";..;", ""),
+                        $x);
+      $x = preg_replace_callback("/#([0-9]+)/", array(&$this, "_callback_02"), $x);
+      $this->result = array();  // result array was temporarily used as a buffer ..
+      return $x;
+   }
+   function _callback_01($m) { return "[#".(array_push($this->result, $m[1])-1)."]"; }
+   function _callback_02($m) { return $this->result[$m[1]]; }
+
+   function asPath($path) {
+      $x = explode(";", $path);
+      $p = "$";
+      for ($i=1,$n=count($x); $i<$n; $i++)
+         $p .= preg_match("/^[0-9*]+$/", $x[$i]) ? ("[".$x[$i]."]") : ("['".$x[$i]."']");
+      return $p;
+   }
+   function store($p, $v) {
+      if ($p) array_push($this->result, ($this->resultType == "PATH" ? $this->asPath($p) : $v));
+      return !!$p;
+   }
+   function trace($expr, $val, $path) {
+      if ($expr) {
+         $x = explode(";", $expr);
+         $loc = array_shift($x);
+         $x = implode(";", $x);
+
+         if (is_array($val) && array_key_exists($loc, $val))
+            $this->trace($x, $val[$loc], $path.";".$loc);
+         else if ($loc == "*")
+            $this->walk($loc, $x, $val, $path, array(&$this, "_callback_03"));
+         else if ($loc === "..") {
+            $this->trace($x, $val, $path);
+            $this->walk($loc, $x, $val, $path, array(&$this, "_callback_04"));
+         }
+         else if (preg_match("/,/", $loc)) // [name1,name2,...]
+            for ($s=preg_split("/'?,'?/", $loc),$i=0,$n=count($s); $i<$n; $i++)
+                $this->trace($s[$i].";".$x, $val, $path);
+         else if (preg_match("/^\(.*?\)$/", $loc)) // [(expr)]
+            $this->trace($this->evalx($loc, $val, substr($path,strrpos($path,";")+1)).";".$x, $val, $path);
+         else if (preg_match("/^\?\(.*?\)$/", $loc)) // [?(expr)]
+            $this->walk($loc, $x, $val, $path, array(&$this, "_callback_05"));
+         else if (preg_match("/^(-?[0-9]*):(-?[0-9]*):?(-?[0-9]*)$/", $loc)) // [start:end:step]  phyton slice syntax
+            $this->slice($loc, $x, $val, $path);
+      }
+      else
+         $this->store($path, $val);
+   }
+   function _callback_03($m,$l,$x,$v,$p) { $this->trace($m.";".$x,$v,$p); }
+   function _callback_04($m,$l,$x,$v,$p) { if (is_array($v[$m])) $this->trace("..;".$x,$v[$m],$p.";".$m); }
+   function _callback_05($m,$l,$x,$v,$p) { if ($this->evalx(preg_replace("/^\?\((.*?)\)$/","$1",$l),$v[$m])) $this->trace($m.";".$x,$v,$p); }
+
+   function walk($loc, $expr, $val, $path, $f) {
+      foreach($val as $m => $v)
+         call_user_func($f, $m, $loc, $expr, $val, $path);
+   }
+   function slice($loc, $expr, $v, $path) {
+      $s = explode(":", preg_replace("/^(-?[0-9]*):(-?[0-9]*):?(-?[0-9]*)$/", "$1:$2:$3", $loc));
+      $len=count($v);
+      $start=(int)$s[0]?$s[0]:0; 
+      $end=(int)$s[1]?$s[1]:$len; 
+      $step=(int)$s[2]?$s[2]:1;
+      $start = ($start < 0) ? max(0,$start+$len) : min($len,$start);
+      $end   = ($end < 0)   ? max(0,$end+$len)   : min($len,$end);
+      for ($i=$start; $i<$end; $i+=$step)
+         $this->trace($i.";".$expr, $v, $path);
+   }
+   function evalx($x, $v, $vname) {
+      $name = "";
+      $expr = preg_replace(array("/\\$/","/@/"), array("\$this->obj","\$v"), $x);
+      $res = eval("\$name = $expr;");
+
+      if ($res === FALSE)
+         print("(jsonPath) SyntaxError: " . $expr);
+      else
+         return $name;
+   }
+}
+?>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/jwplayer b/htmltest/sites/all/libraries/jwplayer
new file mode 120000
index 00000000..f44510bb
--- /dev/null
+++ b/htmltest/sites/all/libraries/jwplayer
@@ -0,0 +1 @@
+jwplayer-version
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/jwplayer-version/README.html b/htmltest/sites/all/libraries/jwplayer-version/README.html
new file mode 100644
index 00000000..22570f94
--- /dev/null
+++ b/htmltest/sites/all/libraries/jwplayer-version/README.html
@@ -0,0 +1,105 @@
+<!doctype html>
+<html>
+<head>
+<title>README: JW Player</title>
+<style>
+    body { padding: 50px 100px; width: 700px; font: 13px/20px Arial; background: #FFF; }
+    a, h1, h2 { color: #369; }
+    h2 { margin-top: 50px; }
+    pre { font-size: 12px; background:#E5F3C8; padding:5px 10px; border: 1px solid #D3EAA4; }
+    dt { font-weight: bold; }
+</style>
+</head><body>
+
+<h1>README: JW Player</h1>
+
+<p>Thank you for downloading JW Player 6, the world's most popular HTML5/Flash video player! See <a href="http://www.longtailvideo.com/support/jw-player/28832/about-jw-player">About JW Player</a> for an overview of supported browsers/devices, as well as a more detailed feature list. See the <a href="http://www.longtailvideo.com/support/jw-player/28835/release-notes">Release Notes</a> if you want to learn what changed with this latest release.</p>
+
+<h2>Quick Start</h2>
+
+<p>Copy the <strong>jwplayer</strong> folder that contains this README to the www root of your website. Next, include the <em>jwplayer.js</em> script in the &lt;head&gt; of your HTML page.</p>
+
+<p>If you have purchased the <a href="http://www.longtailvideo.com/jw-player/pricing/">Pro, Premium or Ads edition</a> of JW Player, its features can be activated by inserting your server-less JW Player license key in the second line:</p>
+
+<pre>
+&lt;script type="text/javascript" src="/jwplayer/jwplayer.js"&gt;&lt;/script&gt;
+&lt;script type="text/javascript"&gt;jwplayer.key="ABCDEFGHIJKLMOPQ";&lt;/script&gt;
+</pre>
+
+<p>Note: A key is not required to use the Free edition, but will still be available from your <a href="https://account.longtailvideo.com/">JW Player Account</a>. Including your key will enable the free <a href="http://www.longtailvideo.com/support/jw-player/28852/using-jw-player-analytics">JW Player Analytics</a> for your account.</p>
+
+<h3>Embed Code</h3>
+
+<p>When the script and key are set, scroll down to the &lt;body&gt; of your HTML page and insert the JW Player embed code at the place you want your video to appear:</p>
+
+<pre>
+&lt;div id="myElement"&gt;Loading the player...&lt;/div&gt;
+
+&lt;script type="text/javascript"&gt;
+    jwplayer("myElement").setup({
+        file: "/uploads/myVideo.mp4",
+        image: "/uploads/myPoster.jpg"
+    });
+&lt;/script&gt;
+</pre>
+
+<p>See <a href="http://www.longtailvideo.com/support/jw-player/28839/embedding-the-player">Embedding JW Player</a> for a more elaborate description of options and some example embeds.</p>
+
+<p><em>Note two very common issues prevent smooth video playback in Internet Explorer 9/10. First, you need to set <strong>&lt;!DOCTYPE html&gt;</strong> to prevent triggering IE's compatibility mode. Second, your videos must be served with the <strong>video/mp4</strong> mimetype. Not doing so will cause IE not to play them. See our <a href="http://www.longtailvideo.com/support/jw-player/28840/troubleshooting-your-setup">troubleshooting guide</a> for more common issues.</em></p>
+
+<h3>Premium Skins</h3>
+
+<p>If you have purchased the Premium or Ads edition of the player, your player includes a set of Premium skins. These skins can be downloaded from your <a href="https://account.longtailvideo.com/">JW Player Account</a>, but you can also load them off our CDN by simply inserting the skin name:</p>
+<pre>    skin: "bekle"</pre>
+
+<p>See <a href="http://www.longtailvideo.com/support/jw-player/28846/using-jw-player-skins">Using JW Player Skins</a> for more info.</p>
+
+
+
+<h2>Documentation</h2>
+
+<p>If you need help, the LongTail Support Community contains a wealth of information, including guides on:</p>
+
+<ul>
+<li>Supported <a href="http://www.longtailvideo.com/support/jw-player/28836/media-format-support">Media Formats</a> and <a href="http://www.longtailvideo.com/support/jw-player/28837/browser-device-support">Browsers &amp; Devices</a>.</li>
+<li> How to <a href="http://www.longtailvideo.com/support/jw-player/28839/embedding-the-player">Customize</a> and <a href="http://www.longtailvideo.com/support/jw-player/28840/troubleshooting-your-setup">Troubleshoot</a> your embeds.</li>
+<li>Configuring <a href="http://www.longtailvideo.com/support/jw-player/28842/working-with-playlists">Inline Playlists</a> or <a href="http://www.longtailvideo.com/support/jw-player/28843/loading-rss-feeds">RSS Feeds</a> (with multiple formats/qualities).</li>
+<li>The <a href="http://www.longtailvideo.com/support/jw-player/28846/using-jw-player-skins">PNG Skinning Model</a> and <a href="http://www.longtailvideo.com/support/jw-player/28850/using-the-javascript-api">JavaScript API</a>.</li>
+<li>Using <a href="http://www.longtailvideo.com/support/jw-player/28854/using-rtmp-streaming">RTMP Streaming</a> and <a href="http://www.longtailvideo.com/support/jw-player/28856/using-apple-hls-streaming/">Apple HLS</a> (Premium/Ads edition only).</li>
+<li>How to <a href="http://www.longtailvideo.com/support/jw-player/28862/configuring-video-ads">Configure Video Ads</a> (Ads edition only).</li>
+</ul>
+
+<p>Visit our <a href="http://www.longtailvideo.com/support/forums/jw-player/">Support Forums</a> for setup problems, bug reports or suggestions for new features or enhancements. The forums are very active and frequently visited by members of the JW Player development team. Please see your <a href="http://account.longtailvideo.com">JW Player Account</a> for more information on obtaining technical support.</p>
+
+<p>Follow the <a href="http://www.longtailvideo.com/blog/">LongTail Video Blog</a> for news on the JW Player and online video in general. We frequently publish posts on topics such as HTML5, video SEO, H.264, VAST advertising, etc. You can also <a href="http://twitter.com/longtailvideo">follow us on Twitter</a> or <a href="http://www.facebook.com/longtailvideo">like us on Facebook</a> to stay connected.</p>
+
+
+
+<h2>Licensing</h2>
+
+<p>Please be aware that each player edition has its own license:</p>
+
+<dl>
+<dt>JW Player Free</dt>
+<dd>Under the terms of our <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/">Creative Commons license</a>, you can use, modify and redistribute the player for non-commercial purposes only. 
+Commercial sites must <a href=" http://www.longtailvideo.com/jw-player/pricing/">purchase a license</a> for the <strong>Pro</strong>, <strong>Premium</strong> or <strong>Ads</strong> editions. See the <a href="http://www.longtailvideo.com/jw-player/license/jw-player-license-text">JW Player 6 License</a> for further details.</dd>
+<dt>JW Player Pro</dt>
+<dd>
+Under the terms of our <a href="http://www.longtailvideo.com/jw-player/license/jw-player-license-text">Commercial License</a>, you can deploy your copy of JW Player <strong>Pro</strong> for commercial use on 1 domain.  See our <a href="http://www.longtailvideo.com/jw-player/pricing/">pricing page</a> for more information on edition features and pricing.
+</dd>
+<dt>JW Player Premium</dt>
+<dd>
+  Under the terms of our <a href="http://www.longtailvideo.com/jw-player/license/jw-player-license-text">Commercial License</a>, you can deploy your copy of JW Player <strong>Premium</strong> for commercial use on up to 10 domains. See our <a href="http://www.longtailvideo.com/jw-player/pricing/">pricing page</a> for more information on edition features and pricing.
+</dd>
+<dt>JW Player Ads</dt>
+<dd>
+Under the terms of our <a href="http://www.longtailvideo.com/jw-player/license/jw-player-license-text">Commercial License</a>, you can deploy your copy of JW Player <strong>Ads</strong> for commercial use on up to 10 domains, with an additional restriction of up to 250.000 filled ad impressions per month. See our <a href="http://www.longtailvideo.com/jw-player/pricing/">pricing page</a> for more information on edition features and price.</dd>
+</dl>
+
+<p>Examples of <strong>commercial use</strong> includes websites with any advertisements, websites owned or operated by businesses, websites designed to promote products or services, and tools (e.g. a CMS) that bundle JW Player in their offering.</p>
+
+<p>Note all editions of JW Player incorporate the <a href="http://www.movable-type.co.uk/scripts/tea-block.html">Block TEA library</a> from Movable Type (CC-BY license).</p>
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/jwplayer-version/jwplayer.flash.swf b/htmltest/sites/all/libraries/jwplayer-version/jwplayer.flash.swf
new file mode 100644
index 00000000..6f9107af
Binary files /dev/null and b/htmltest/sites/all/libraries/jwplayer-version/jwplayer.flash.swf differ
diff --git a/htmltest/sites/all/libraries/jwplayer-version/jwplayer.html5.js b/htmltest/sites/all/libraries/jwplayer-version/jwplayer.html5.js
new file mode 100644
index 00000000..05c179e4
--- /dev/null
+++ b/htmltest/sites/all/libraries/jwplayer-version/jwplayer.html5.js
@@ -0,0 +1,196 @@
+(function(f){f.html5={};f.html5.version="6.5.3609"})(jwplayer);
+(function(f){function h(a){return function(){a("Error loading file")}}function e(a,b,c,e){return function(){try{var g=a.responseXML;if(g&&g.firstChild)return c(a)}catch(d){}(g=f.parseXML(a.responseText))&&g.firstChild?(a=f.extend({},a,{responseXML:g}),c(a)):e&&e(a.responseText?"Invalid XML":b)}}var d=window;f.serialize=function(a){return null==a?null:"true"==a.toString().toLowerCase()?!0:"false"==a.toString().toLowerCase()?!1:isNaN(Number(a))||5<a.length||0==a.length?a:Number(a)};f.filterSources=
+function(a){var b,c,e=f.extensionmap;if(a){c=[];for(var g=0;g<a.length;g++){var d=a[g].type,h=a[g].file;d||(d=e.extType(f.extension(h)),a[g].type=d);f.canPlayHTML5(d)&&(b||(b=d),d==b&&c.push(f.extend({},a[g])))}}return c};f.canPlayHTML5=function(a){if(f.isAndroid()&&("hls"==a||"m3u"==a||"m3u8"==a))return!1;a=f.extensionmap.types[a];return!!a&&jwplayer.vid.canPlayType(a)};f.ajax=function(a,b,c){var k;0<a.indexOf("#")&&(a=a.replace(/#.*$/,""));var g;g=(g=a)&&0<=g.indexOf("://")&&g.split("/")[2]!=d.location.href.split("/")[2]?
+!0:!1;if(g&&f.exists(d.XDomainRequest))k=new XDomainRequest,k.onload=e(k,a,b,c),k.onerror=h(c,a,k);else if(f.exists(d.XMLHttpRequest)){var r=k=new XMLHttpRequest,l=a;k.onreadystatechange=function(){if(4===r.readyState)switch(r.status){case 200:e(r,l,b,c)();break;case 404:c("File not found")}};k.onerror=h(c,a)}else c&&c();try{k.open("GET",a,!0),k.send(null)}catch(j){c&&c(a)}return k};f.parseXML=function(a){try{var b;if(d.DOMParser){b=(new DOMParser).parseFromString(a,"text/xml");try{if("parsererror"==
+b.childNodes[0].firstChild.nodeName)return}catch(c){}}else b=new ActiveXObject("Microsoft.XMLDOM"),b.async="false",b.loadXML(a);return b}catch(e){}};f.parseDimension=function(a){if("string"==typeof a){if(""===a)return 0;if(!(-1<a.lastIndexOf("%")))return parseInt(a.replace("px",""),10)}return a};f.timeFormat=function(a){if(0<a){var b=Math.floor(a/3600),c=Math.floor((a-3600*b)/60);a=Math.floor(a%60);return(b?b+":":"")+(10>c?"0":"")+c+":"+(10>a?"0":"")+a}return"00:00"};f.seconds=function(a){a=a.replace(",",
+".");var b=a.split(":"),c=0;"s"==a.substr(-1)?c=Number(a.substr(0,a.length-1)):"m"==a.substr(-1)?c=60*Number(a.substr(0,a.length-1)):"h"==a.substr(-1)?c=3600*Number(a.substr(0,a.length-1)):1<b.length?(c=Number(b[b.length-1]),c+=60*Number(b[b.length-2]),3==b.length&&(c+=3600*Number(b[b.length-3]))):c=Number(a);return c};f.bounds=function(a){if(!a)return{left:0,right:0,width:0,height:0,top:0,bottom:0};var b=a,c=0,e=0,g=isNaN(a.offsetWidth)?0:a.offsetWidth;a=isNaN(a.offsetHeight)?0:a.offsetHeight;do c+=
+isNaN(b.offsetLeft)?0:b.offsetLeft,e+=isNaN(b.offsetTop)?0:b.offsetTop;while(b=b.offsetParent);return{left:c,top:e,width:g,height:a,right:c+g,bottom:e+a}};f.empty=function(a){if(a)for(;0<a.childElementCount;)a.removeChild(a.children[0])}})(jwplayer.utils);
+(function(f){function h(){var a=document.createElement("style");a.type="text/css";document.getElementsByTagName("head")[0].appendChild(a);return a}function e(b){if(j)a[b].innerHTML=d(b);else{var g=a[b].sheet,c=l[b];if(g){var e=g.cssRules;f.exists(c)&&c<e.length&&e[c].selectorText==b?g.deleteRule(c):l[b]=e.length;g.insertRule(d(b),l[b])}}}function d(a){var b=a+"{\n";r(c[a],function(a,g){b+="  "+a+": "+g+";\n"});return b+="}\n"}var a={},b,c={},k=0,g=f.exists,r=f.foreach,l={},j=!1,q=f.css=function(d,
+p,l){if(!a[d])if(j)a[d]=h();else{if(!b||5E4<b.sheet.cssRules.length)b=h();a[d]=b}g(l)||(l=!1);c[d]||(c[d]={});r(p,function(a,b){a:{var e=b;if("undefined"===typeof e)b=void 0;else{var k=l?" !important":"";if(isNaN(e))b=e.match(/png|gif|jpe?g/i)&&0>e.indexOf("url")?"url("+e+")":e+k;else switch(a){case "z-index":case "opacity":b=e+k;break a;default:b=a.match(/color/i)?"#"+f.pad(e.toString(16).replace(/^0x/i,""),6)+k:0===e?0+k:Math.ceil(e)+"px"+k}}}g(c[d][a])&&!g(b)?delete c[d][a]:g(b)&&(c[d][a]=b)});
+0<k||e(d)};q.block=function(){k++};q.unblock=function(){k=Math.max(k-1,0);0==k&&r(a,function(a){e(a)})};f.clearCss=function(b){r(c,function(a){0<=a.indexOf(b)&&delete c[a]});r(a,function(a){0<=a.indexOf(b)&&e(a)})};f.transform=function(a,b){var g="-transform",e;b=b?b:"";"string"==typeof a?(e={},e["-webkit"+g]=b,e["-ms"+g]=b,e["-moz"+g]=b,e["-o"+g]=b,f.css(a,e)):(g="Transform",e=a.style,e["webkit"+g]=b,e["Moz"+g]=b,e["ms"+g]=b,e["O"+g]=b)};f.dragStyle=function(a,b){f.css(a,{"-webkit-user-select":b,
+"-moz-user-select":b,"-ms-user-select":b,"-webkit-user-drag":b,"user-select":b,"user-drag":b})};f.transitionStyle=function(b,a){navigator.userAgent.match(/5\.\d(\.\d)? safari/i)||f.css(b,{"-webkit-transition":a,"-moz-transition":a,"-o-transition":a})};f.rotate=function(b,a){f.transform(b,"rotate("+a+"deg)")};q(".jwplayer "+" div span a img ul li video".split(" ").join(",.jwplayer ")+", .jwclick",{margin:0,padding:0,border:0,color:"#000000","font-size":"100%",font:"inherit","vertical-align":"baseline",
+"background-color":"transparent","text-align":"left",direction:"ltr"});q(".jwplayer ul",{"list-style":"none"})})(jwplayer.utils);
+(function(f){f.scale=function(e,d,a,b,c){var k=f.exists;k(d)||(d=1);k(a)||(a=1);k(b)||(b=0);k(c)||(c=0);f.transform(e,1==d&&1==a&&0==b&&0==c?"":"scale("+d+","+a+") translate("+b+"px,"+c+"px)")};f.stretch=function(e,d,a,b,c,k){if(d&&(e||(e=h.UNIFORM),a&&b&&c&&k)){var g=a/c,r=b/k,l="video"==d.tagName.toLowerCase(),j=!1,q;l&&f.transform(d);q="jw"+e.toLowerCase();switch(e.toLowerCase()){case h.FILL:g>r?(c*=g,k*=g):(c*=r,k*=r);case h.NONE:g=r=1;case h.EXACTFIT:j=!0;break;default:g>r?0.95<c*r/a?(j=!0,q=
+"jwexactfit"):(c*=r,k*=r):0.95<k*g/b?(j=!0,q="jwexactfit"):(c*=g,k*=g),j&&(r=Math.ceil(100*b/k)/100,g=Math.ceil(100*a/c)/100)}l?j?(d.style.width=c+"px",d.style.height=k+"px",f.scale(d,g,r,(a-c)/2/g,(b-k)/2/r)):(d.style.width="",d.style.height=""):(d.className=d.className.replace(/\s*jw(none|exactfit|uniform|fill)/g,""),d.className+=" "+q)}};var h=f.stretching={NONE:"none",FILL:"fill",UNIFORM:"uniform",EXACTFIT:"exactfit"}})(jwplayer.utils);
+(function(f){f.parsers={localName:function(h){return h?h.localName?h.localName:h.baseName?h.baseName:"":""},textContent:function(h){return h?h.textContent?h.textContent:h.text?h.text:"":""},getChildNode:function(h,e){return h.childNodes[e]},numChildren:function(h){return h.childNodes?h.childNodes.length:0}}})(jwplayer.html5);
+(function(f){f.dfxp=function(h,e){var d,a,b=jwplayer.utils.seconds;this.load=function(b){a=b;try{d.open("GET",b,!0),d.send(null)}catch(k){e("Error loading DFXP File: "+b)}};d=new XMLHttpRequest;d.onreadystatechange=function(){if(4===d.readyState)if(200===d.status){for(var c=d.responseText,k=[{begin:0,text:""}],c=c.replace(/^\s+/,"").replace(/\s+$/,""),c=c.split("\x3c/p\x3e"),g=[],f=0;f<c.length;f++)0<=c[f].indexOf("\x3cp")&&(c[f]=c[f].substr(c[f].indexOf("\x3cp")+2).replace(/^\s+/,"").replace(/\s+$/,
+""),g.push(c[f]));c=g;for(f=0;f<c.length;f++){var g=c[f],l={};try{var j=g.indexOf('begin\x3d"'),g=g.substr(j+7),j=g.indexOf('" end\x3d"');l.begin=b(g.substr(0,j));g=g.substr(j+7);j=g.indexOf('"\x3e');l.end=b(g.substr(0,j));g=g.substr(j+2);l.text=g}catch(q){}g=l;g.text&&(k.push(g),g.end&&(k.push({begin:g.end,text:""}),delete g.end))}1<k.length?h(k):e("Invalid DFXP file: "+a)}else k=d.status,0==k?e("Crossdomain loading denied: "+a):404==k?e("DFXP File not found: "+a):e("Error "+k+" loading DFXP file: "+
+a)}}})(jwplayer.html5.parsers);
+(function(f){var h=f.html5.parsers;(h.jwparser=function(){}).parseEntry=function(e,d){for(var a=[],b=[],c=f.utils.xmlAttribute,k=0;k<e.childNodes.length;k++){var g=e.childNodes[k];if("jwplayer"==g.prefix){var r=h.localName(g);"source"==r?(delete d.sources,a.push({file:c(g,"file"),"default":c(g,"default"),label:c(g,"label"),type:c(g,"type")})):"track"==r?(delete d.tracks,b.push({file:c(g,"file"),"default":c(g,"default"),kind:c(g,"kind"),label:c(g,"label")})):(d[r]=f.utils.serialize(h.textContent(g)),"file"==
+r&&d.sources&&delete d.sources)}d.file||(d.file=d.link)}if(a.length){d.sources=[];for(k=0;k<a.length;k++)0<a[k].file.length&&(a[k]["default"]="true"==a[k]["default"]?!0:!1,a[k].label.length||delete a[k].label,d.sources.push(a[k]))}if(b.length){d.tracks=[];for(k=0;k<b.length;k++)0<b[k].file.length&&(b[k]["default"]="true"==b[k]["default"]?!0:!1,b[k].kind=!b[k].kind.length?"captions":b[k].kind,b[k].label.length||delete b[k].label,d.tracks.push(b[k]))}return d}})(jwplayer);
+(function(f){var h=jwplayer.utils,e=h.xmlAttribute,d=f.localName,a=f.textContent,b=f.numChildren,c=f.mediaparser=function(){};c.parseGroup=function(k,g){var f,l,j=[];for(l=0;l<b(k);l++)if(f=k.childNodes[l],"media"==f.prefix&&d(f))switch(d(f).toLowerCase()){case "content":e(f,"duration")&&(g.duration=h.seconds(e(f,"duration")));0<b(f)&&(g=c.parseGroup(f,g));e(f,"url")&&(g.sources||(g.sources=[]),g.sources.push({file:e(f,"url"),type:e(f,"type"),width:e(f,"width"),label:e(f,"label")}));break;case "title":g.title=
+a(f);break;case "description":g.description=a(f);break;case "guid":g.mediaid=a(f);break;case "thumbnail":g.image||(g.image=e(f,"url"));break;case "group":c.parseGroup(f,g);break;case "subtitle":var q={};q.file=e(f,"url");q.kind="captions";if(0<e(f,"lang").length){var m=q;f=e(f,"lang");var p={zh:"Chinese",nl:"Dutch",en:"English",fr:"French",de:"German",it:"Italian",ja:"Japanese",pt:"Portuguese",ru:"Russian",es:"Spanish"};f=p[f]?p[f]:f;m.label=f}j.push(q)}g.hasOwnProperty("tracks")||(g.tracks=[]);for(l=
+0;l<j.length;l++)g.tracks.push(j[l]);return g}})(jwplayer.html5.parsers);
+(function(f){function h(b){for(var a={},h=0;h<b.childNodes.length;h++){var l=b.childNodes[h],j=c(l);if(j)switch(j.toLowerCase()){case "enclosure":a.file=e.xmlAttribute(l,"url");break;case "title":a.title=d(l);break;case "guid":a.mediaid=d(l);break;case "pubdate":a.date=d(l);break;case "description":a.description=d(l);break;case "link":a.link=d(l);break;case "category":a.tags=a.tags?a.tags+d(l):d(l)}}a=f.mediaparser.parseGroup(b,a);a=f.jwparser.parseEntry(b,a);return new jwplayer.playlist.item(a)}
+var e=jwplayer.utils,d=f.textContent,a=f.getChildNode,b=f.numChildren,c=f.localName;f.rssparser={};f.rssparser.parse=function(e){for(var g=[],d=0;d<b(e);d++){var f=a(e,d);if("channel"==c(f).toLowerCase())for(var j=0;j<b(f);j++){var q=a(f,j);"item"==c(q).toLowerCase()&&g.push(h(q))}}return g}})(jwplayer.html5.parsers);
+(function(f){f.srt=function(f,e,d){function a(a){0==a?e("Crossdomain loading denied: "+k):404==a?e("SRT File not found: "+k):e("Error "+a+" loading SRT file: "+k)}function b(a){var b=d?[]:[{begin:0,text:""}];a=a.replace(/^\s+/,"").replace(/\s+$/,"");var g=a.split("\r\n\r\n");1==g.length&&(g=a.split("\n\n"));for(a=0;a<g.length;a++)if("WEBVTT"!=g[a]){var c,p=g[a];c={};var s=p.split("\r\n");1==s.length&&(s=p.split("\n"));try{p=1;0<s[0].indexOf(" --\x3e ")&&(p=0);var v=s[p].indexOf(" --\x3e ");0<v&&(c.begin=
+r(s[p].substr(0,v)),c.end=r(s[p].substr(v+5)));if(s[p+1]){c.text=s[p+1];for(p+=2;p<s.length;p++)c.text+="\x3cbr/\x3e"+s[p]}}catch(u){}c.text&&(b.push(c),c.end&&!d&&(b.push({begin:c.end,text:""}),delete c.end))}1<b.length?f(b):e("Invalid SRT file: "+k)}var c,k,g=jwplayer.utils,r=g.seconds;this.load=function(d){k=d;try{var f;f=d&&0<=d.indexOf("://")&&d.split("/")[2]!=window.location.href.split("/")[2]?!0:!1;f&&g.exists(window.XDomainRequest)&&(c=new XDomainRequest,c.onload=function(){b(c.responseText)},
+c.onerror=function(){a(c.status)});c.open("GET",d,!0);c.send(null)}catch(h){e("Error loading SRT File: "+d)}};c=new XMLHttpRequest;c.onreadystatechange=function(){4===c.readyState&&(200===c.status?b(c.responseText):a(c.status))}}})(jwplayer.html5.parsers);
+(function(f){var h=jwplayer.utils,e=jwplayer.events,d=e.state,a=h.css,b="playing",c=document;f.captions=function(a,g){function r(a){h.log("CAPTIONS("+a+")")}function l(a){(I=a.fullscreen)?(j(),setTimeout(j,500)):s(!0)}function j(){var a=n.offsetHeight,b=n.offsetWidth;0!=a&&0!=b&&y.resize(b,Math.round(0.94*a))}function q(a){a=a.responseXML.firstChild;"xml"==f.parsers.localName(a)&&(a=a.nextSibling);("tt"==f.parsers.localName(a)?new jwplayer.html5.parsers.dfxp(p,r):new jwplayer.html5.parsers.srt(p,
+r)).load(E)}function m(){(new jwplayer.html5.parsers.srt(p,r)).load(E)}function p(a){y.populate(a);D<x.length&&(x[D].data=a);s(!1)}function s(a){h.isMobile()||!x.length?y.hide():w==b&&0<z?(y.show(),I?l({fullscreen:!0}):(v(),a&&setTimeout(v,500))):y.hide()}function v(){y.resize()}function u(a){0<a?(D=a-1,z=a):z=0;D>=x.length||(x[D].data?y.populate(x[D].data):(E=a=x[D].file,h.ajax(a,q,m)),s(!1))}function A(){var a=[];a.push({label:"Off"});for(var b=0;b<x.length;b++)a.push({label:x[b].label});return a}
+var n,B={back:!0,color:"#FFFFFF",fontSize:15},t={fontFamily:"Arial,sans-serif",fontStyle:"normal",fontWeight:"normal",textDecoration:"none"},y,w,D,x=[],z=0,I=!1,E,C=new e.eventdispatcher;h.extend(this,C);this.element=function(){return n};this.getCaptionsList=function(){return A()};this.getCurrentCaptions=function(){return z};this.setCurrentCaptions=function(a){if(0<=a&&z!=a&&a<=x.length){u(a);a=A();h.saveCookie("captionLabel",a[z].label);var b=e.JWPLAYER_CAPTIONS_CHANGED;C.sendEvent(b,{type:b,tracks:a,
+track:z})}};n=c.createElement("div");n.id=a.id+"_caption";n.className="jwcaptions";a.jwAddEventListener(e.JWPLAYER_PLAYER_STATE,function(a){switch(a.newstate){case d.IDLE:w="idle";s(!1);break;case d.PLAYING:w=b,s(!1)}});a.jwAddEventListener(e.JWPLAYER_PLAYLIST_ITEM,function(){D=0;x=[];y.update(0);for(var b=a.jwGetPlaylist()[a.jwGetPlaylistIndex()].tracks,g=[],c=0,d="",f=0,d="",c=0;c<b.length;c++)d=b[c].kind.toLowerCase(),("captions"==d||"subtitles"==d)&&g.push(b[c]);for(c=z=0;c<g.length;c++)if(d=
+g[c].file)g[c].label||(g[c].label=c.toString()),x.push(g[c]);for(c=0;c<x.length;c++)if(x[c]["default"]){f=c+1;break}if(d=h.getCookies().captionLabel){b=A();for(c=0;c<b.length;c++)if(d==b[c].label){f=c;break}}u(f);s(!1);b=e.JWPLAYER_CAPTIONS_LIST;g=A();C.sendEvent(b,{type:b,tracks:g,track:z})});a.jwAddEventListener(e.JWPLAYER_MEDIA_ERROR,r);a.jwAddEventListener(e.JWPLAYER_ERROR,r);a.jwAddEventListener(e.JWPLAYER_READY,function(){h.foreach(B,function(a,b){g&&void 0!=g[a.toLowerCase()]?"color"==a?t.color=
+"#"+String(g.color).substr(-6):t[a]=g[a.toLowerCase()]:t[a]=b});y=new jwplayer.html5.captions.renderer(t,n);s(!1)});a.jwAddEventListener(e.JWPLAYER_MEDIA_TIME,function(a){y.update(a.position)});a.jwAddEventListener(e.JWPLAYER_FULLSCREEN,l);a.jwAddEventListener(e.JWPLAYER_RESIZE,function(){s(!1)})};a(".jwcaptions",{position:"absolute",cursor:"pointer",width:"100%",height:"100%",overflow:"hidden"})})(jwplayer.html5);
+(function(f){var h=jwplayer.utils.foreach;f.captions.renderer=function(e,d){function a(a){f(r,{visibility:"hidden"});l.innerHTML=a;m=""==a?"hidden":"visible";setTimeout(b,20)}function b(){var a=r.clientWidth,b=Math.round(e.fontSize*Math.pow(a/400,0.6)),c=Math.round(1.4*b);f(l,{maxWidth:a+"px",fontSize:b+"px",lineHeight:c+"px",visibility:m})}function c(){for(var b=-1,c=0;c<g.length;c++)if(g[c].begin<=q&&(c==g.length-1||g[c+1].begin>=q)){b=c;break}-1==b?a(""):b!=j&&(j=b,a(g[c].text))}function f(a,b){h(b,
+function(b,c){a.style[b]=c})}var g,r,l,j,q,m="visible",p;this.hide=function(){f(r,{display:"none"});p&&(clearInterval(p),p=null)};this.populate=function(a){j=-1;g=a;c()};this.resize=function(){b()};r=document.createElement("div");l=document.createElement("span");r.appendChild(l);d.appendChild(r);f(r,{display:"block",height:"auto",position:"absolute",bottom:"20px",textAlign:"center",width:"100%"});f(l,{color:"#"+e.color.substr(-6),display:"inline-block",fontFamily:e.fontFamily,fontStyle:e.fontStyle,
+fontWeight:e.fontWeight,height:"auto",margin:"auto",position:"relative",textAlign:"center",textDecoration:e.textDecoration,wordWrap:"break-word",width:"auto"});e.back?f(l,{background:"#000"}):f(l,{textShadow:"-2px 0px 1px #000,2px 0px 1px #000,0px -2px 1px #000,0px 2px 1px #000,-1px 1px 1px #000,1px 1px 1px #000,1px -1px 1px #000,1px 1px 1px #000"});this.show=function(){f(r,{display:"block"});p||(p=setInterval(b,250));b()};this.update=function(a){q=a;g&&c()}}})(jwplayer.html5);
+(function(f){var h=f.html5,e=f.utils,d=f.events,a=d.state,b=e.css;f=e.transitionStyle;var c="button",k="text",g="divider",r="slider",l="100%",j={display:"none"},q={display:v},m=!1,p=!0,s=null,v=void 0,u=window,A=document;h.controlbar=function(f,B){function t(a,b,c){return{name:a,type:b,className:c}}function y(a){var b=m,c;K.elapsed&&(c=e.timeFormat(a.position),K.elapsed.innerHTML=c,b=c.length!=e.timeFormat(wa).length);K.duration&&(c=e.timeFormat(a.duration),K.duration.innerHTML=c,b=b||c.length!=e.timeFormat(ia).length);
+0<a.duration?qa(a.position/a.duration):qa(0);ia=a.duration;wa=a.position;b&&ya()}function w(){var a=H.jwGetMute();Z("mute",a);ja(a?0:Ja)}function D(){Ja=H.jwGetVolume()/100;ja(Ja)}function x(){b(C(".jwhd"),j);b(C(".jwcc"),j);za();ya()}function z(a){Aa=a.currentQuality;la&&0<=Aa&&la.setActive(a.currentQuality)}function I(a){ba&&(Ba=a.track,ma&&0<=Ba&&ma.setActive(a.track))}function E(){ca=e.extend({},W,R.getComponentSettings("controlbar"),B);V=Q("background").height;b("#"+$,{height:V,bottom:ua?0:ca.margin});
+b(C(".jwtext"),{font:ca.fontsize+"px/"+Q("background").height+"px "+ca.font,color:ca.fontcolor,"font-weight":ca.fontweight});b(C(".jwoverlay"),{bottom:V});0<ca.maxwidth&&b(C(),{"max-width":ua?v:ca.maxwidth})}function C(a){return"#"+$+(a?" "+a:"")}function M(){return A.createElement("span")}function F(a){switch(a.type){case g:var e;a.width?(e=M(),e.className="jwblankDivider",b(e,{width:parseInt(a.width)})):a.element?e=G(a.element):(e=G(a.name),e||(e=M(),e.className="jwblankDivider"));a.className&&
+(e.className+=" "+a.className);return e;case k:a=a.name;e={};var d=Q(a+"Background");if(d.src){var f=M();f.id=$+"_"+a;f.className="jwtext jw"+a;e.background="url("+d.src+") no-repeat center";e["background-size"]="100% "+Q("background").height+"px";b(C(".jw"+a),e);f.innerHTML="00:00";a=K[a]=f}else a=null;return a;case c:if("blank"!=a.name)return a=a.name,Q(a+"Button").src?(e=M(),e.className="jw"+a+" jwbuttoncontainer",d=A.createElement("button"),d.addEventListener("click",T(a),m),d.innerHTML="\x26nbsp;",
+e.appendChild(d),d=Q(a+"Button"),f=Q(a+"ButtonOver"),N(C(".jw"+a+" button"),d,f),(d=bb[a])&&N(C(".jw"+a+".jwtoggle button"),Q(d+"Button"),Q(d+"ButtonOver")),a=K[a]=e):a=s,a;break;case r:d=a.name;a=M();var j=d+("time"==d?"Slider":"")+"Cap",p=(f="volume"==d)?"Top":"Left",q=f?"Bottom":"Right",I=G(j+p,s,m,m,f),t=G(j+q,s,m,m,f);e=M();var n=["Rail","Buffer","Progress"],ea;e.className="jwrail jwsmooth";for(var y=0;y<n.length;y++){var L="time"==d?"Slider":"",z=d+L+n[y],w=G(z,s,!f,"volume"==d),x=G(z+"Cap"+
+p,s,m,m,f),B=G(z+"Cap"+q,s,m,m,f),u=Q(z+"Cap"+p),F=Q(z+"Cap"+q);if(w){var E=M();E.className="jwrailgroup "+n[y];x&&E.appendChild(x);E.appendChild(w);B&&(E.appendChild(B),B.className+=" jwcap"+(f?"Bottom":"Right"));b(C(".jwrailgroup."+n[y]),{"min-width":f?v:u.width+F.width});E.capSize=f?u.height+F.height:u.width+F.width;b(C("."+w.className),{left:f?v:u.width,right:f?v:F.width,top:f?u.height:v,bottom:f?F.height:v,height:f?"auto":v});2==y&&(ea=E);K[z]=E;e.appendChild(E)}}if(L=G(d+L+"Thumb",s,m,m,f))b(C("."+
+L.className),{opacity:"time"==d?0:1,"margin-top":f?L.skin.height/-2:v}),L.className+=" jwthumb",(f&&ea?ea:e).appendChild(L);e.addEventListener("mousedown",Pa(d),m);"time"==d&&(e.addEventListener("mousemove",Ca,m),e.addEventListener("mouseout",S,m));K[d+"Rail"]=e;ea=Q(j+p);j=Q(j+p);Q(d+"SliderRail");a.className="jwslider jw"+d;I&&a.appendChild(I);a.appendChild(e);t&&(f&&(t.className+=" jwcapBottom"),a.appendChild(t));b(C(".jw"+d+" .jwrail"),{left:f?v:ea.width,right:f?v:j.width,top:f?ea.height:v,bottom:f?
+j.height:v,width:f?l:v,height:f?"auto":v});K[d]=a;a.vertical=f;"time"==d?(na=new h.overlay($+"_timetooltip",R),Ka=new h.thumbs($+"_thumb"),Qa=A.createElement("div"),Qa.className="jwoverlaytext",La=A.createElement("div"),d=Ka.element(),La.appendChild(d),La.appendChild(Qa),na.setContents(La),Va=e,J(0),d=na.element(),e.appendChild(d),K.timeSliderThumb&&b(C(".jwtimeSliderThumb"),{"margin-left":Q("timeSliderThumb").width/-2}),Da(0),qa(0),qa(0),Da(0)):"volume"==d&&(b(C(".jwvolume"),{width:Q("volumeRail").width+
+(f?0:Q("volumeCap"+p).width+Q("volumeCap"+q).width),height:f?Q("volumeCap"+p).height+Q("volumeRail").height+Q("volumeRailCap"+p).height+Q("volumeRailCap"+q).height+Q("volumeCap"+q).height:v}),f&&(a.className+=" jwvertical"));return a}}function G(a,c,d,g,f){var h=M();h.className="jw"+a;var k=g?" left center":" center";g=Q(a);h.innerHTML="\x26nbsp;";if(g&&""!=g.src)return d=d?{background:"url('"+g.src+"') repeat-x "+k,height:f?g.height:v}:{background:"url('"+g.src+"') no-repeat"+k,width:g.width,height:f?
+g.height:v},h.skin=g,b(C(".jw"+a),e.extend(d,c)),K[a]=h}function N(a,c,e){c.src&&(b(a,{width:c.width,background:"url("+c.src+") center no-repeat"}),e.src&&b(a+":hover",{background:"url("+e.src+") center no-repeat"}))}function T(a){return function(b){if(Wa[a])Wa[a]();b.preventDefault()}}function L(a){e.foreach(Ea,function(b,c){b!=a&&c.hide()})}function X(){ua||(ra.show(),L("volume"))}function da(){ua||(Ma.show(),L("fullscreen"))}function Z(a,b){e.exists(b)||(b=!Na[a]);K[a]&&(K[a].className="jw"+a+
+(b?" jwtoggle jwtoggling":" jwtoggling"),setTimeout(function(){K[a].className=K[a].className.replace(" jwtoggling","")},100));Na[a]=b}function oa(){sa&&1<sa.length&&(Ra&&(clearTimeout(Ra),Ra=void 0),la.show(),L("hd"))}function ea(){ba&&1<ba.length&&(Sa&&(clearTimeout(Sa),Sa=void 0),ma.show(),L("cc"))}function Ta(a){0<=a&&a<sa.length&&(H.jwSetCurrentQuality(a),la.hide())}function Ua(a){0<=a&&a<ba.length&&(H.jwSetCurrentCaptions(a),ma.hide())}function Fa(a){a.preventDefault();A.onselectstart=function(){return m}}
+function Pa(b){return function(c){0==c.button&&(K[b+"Rail"].className="jwrail","time"==b?H.jwGetState()!=a.IDLE&&(H.jwSeekDrag(p),ta=b):ta=b)}}function fa(a){var b=(new Date).getTime();if(50<b-Xa){if((Oa=e.bounds(Va))&&0!=Oa.width){var c=na.element(),d=a.pageX-Oa.left-u.pageXOffset;0<=d&&d<=Oa.width&&(c.style.left=Math.round(d)+"px",J(ia*d/Oa.width),ka=e.bounds(O))}Xa=b}if(ta&&0==a.button)return c=K[ta].getElementsByClassName("jwrail")[0],d=e.bounds(c),c=ta,d=K[c].vertical?(d.bottom-a.pageY)/d.height:
+(a.pageX-d.left)/d.width,"mouseup"==a.type?("time"==c&&H.jwSeekDrag(m),K[c+"Rail"].className="jwrail jwsmooth",ta=s,Ya[c](d)):("time"==ta?qa(d):ja(d),500<b-Za&&(Za=b,Ya[ta](d))),!1}function Ca(){na&&(ia&&!ua)&&(pa(na),na.show())}function S(){na&&na.hide()}function J(a){Qa.innerHTML=e.timeFormat(a);Ka.updateTimeline(a);na.setContents(La);ka=e.bounds(O);pa(na)}function P(){Sa=setTimeout(ma.hide,500)}function va(){Ra=setTimeout(la.hide,500)}function aa(a,c,d,e){var g=a.element();c.appendChild(g);c.addEventListener("mousemove",
+d,m);e?c.addEventListener("mouseout",e,m):c.addEventListener("mouseout",a.hide,m);b("#"+g.id,{left:"50%"})}function Ga(a){var b=M();b.className="jwgroup jw"+a;xa[a]=b;if(ga[a]&&(b=ga[a],a=xa[a],b&&0<b.elements.length))for(var c=0;c<b.elements.length;c++){var d=F(b.elements[c]);d&&("volume"==b.elements[c].name&&d.vertical?(ra=new h.overlay($+"_volumeOverlay",R),ra.setContents(d)):a.appendChild(d))}}function za(){1<H.jwGetPlaylist().length&&(!A.querySelector("#"+H.id+" .jwplaylist")||H.jwGetFullscreen())?
+(b(C(".jwnext"),q),b(C(".jwprev"),q),b(C(".nextdiv"),q)):(b(C(".jwnext"),j),b(C(".jwprev"),j),b(C(".nextdiv"),j))}function pa(a){ka||(ka=e.bounds(O));a.offsetX(0);var b=e.bounds(a.element());b.right>ka.right?a.offsetX(ka.right-b.right):b.left<ka.left&&a.offsetX(ka.left-b.left)}function Da(a){a=Math.min(Math.max(0,a),1);K.timeSliderBuffer&&(K.timeSliderBuffer.style.width=100*a+"%",K.timeSliderBuffer.style.opacity=0<a?1:0)}function Y(a,b){var c=K[a].vertical,d=a+("time"==a?"Slider":""),e=100*Math.min(Math.max(0,
+b),1)+"%",g=K[d+"Progress"],d=K[d+"Thumb"],f=m;g&&(c?(g.style.height=e,g.style.bottom=0,g.clientHeight<=g.capSize&&(f=p)):(g.style.width=e,g.clientWidth<=g.capSize&&(f=p)),g.style.opacity=!f&&0<b||ta?1:0);d&&(c?d.style.top=0:d.style.left=e)}function ja(a){Y("volume",a)}function qa(a){Y("time",a)}function Q(a){return(a=R.getSkinElement(0==a.indexOf("volume")?"tooltip":"controlbar",a))?a:{width:0,height:0,src:"",image:v,ready:m}}var H,R,U=t("divider",g),W={margin:8,maxwidth:800,font:"Arial,sans-serif",
+fontsize:11,fontcolor:15658734,fontweight:"bold",layout:{left:{position:"left",elements:[t("play",c),U,t("prev",c),t("next",c),t("divider",g,"nextdiv"),t("elapsed",k)]},center:{position:"center",elements:[t("time",r)]},right:{position:"right",elements:[t("duration",k),U,t("hd",c),t("cc",c),t("divider",g,"hddiv"),t("mute",c),t("volume",r),t("divider",g,"fsdiv"),t("fullscreen",c)]}}},ca,ga,K,V,O,$,ia,wa,sa,Aa,ba,Ba,Ja,ra,ka,Va,Oa,na,La,Ka,Qa,Ra,la,Sa,ma,Ma,$a,Ha,ua=m,ta=m,Za=0,Xa=0,bb={play:"pause",
+mute:"unmute",fullscreen:"normalscreen"},Na={play:m,mute:m,fullscreen:m},Wa={play:function(){Na.play?H.jwPause():H.jwPlay()},mute:function(){H.jwSetMute(!Na.mute);w({mute:Na.mute})},fullscreen:function(){H.jwSetFullscreen()},next:function(){H.jwPlaylistNext()},prev:function(){H.jwPlaylistPrev()}},Ya={time:function(a){H.jwSeek(a*ia)},volume:function(a){ja(a);0.1>a&&(a=0);0.9<a&&(a=1);H.jwSetVolume(100*a)}},Ea={},ha=this,xa={},ya=function(){clearTimeout($a);$a=setTimeout(ha.redraw,0)};ha.redraw=function(){E();
+var a=Q("capLeft"),c=Q("capRight");b(C(".jwgroup.jwcenter"),{left:Math.round(e.parseDimension(xa.left.offsetWidth)+a.width),right:Math.round(e.parseDimension(xa.right.offsetWidth)+c.width)});a=!ua&&O.parentNode.clientWidth>ca.maxwidth;c=ua?0:ca.margin;b(C(),{left:a?"50%":c,right:a?v:c,"margin-left":a?O.clientWidth/-2:v,width:a?l:v});ka=e.bounds(O);e.foreach(Ea,function(a,b){pa(b)})};ha.audioMode=function(a){a!=ua&&(ua=a,b(C(".jwfullscreen"),{display:a?"none":v}),b(C(".jwhd"),{display:a?"none":v}),
+b(C(".jwcc"),{display:a?"none":v}),a&&(b(C(".fsdiv"),j),b(C(".hddiv"),j)),ya())};ha.element=function(){return O};ha.margin=function(){return parseInt(ca.margin)};ha.height=function(){return V};ha.show=function(){ha.visible||(clearTimeout(Ha),Ha=v,ha.visible=!0,O.style.display="inline-block",ya(),w(),Ha=setTimeout(function(){O.style.opacity=1},10))};ha.hide=function(){ha.visible&&(ha.visible=!1,O.style.opacity=0,clearTimeout(Ha),Ha=v,Ha=setTimeout(function(){O.style.display="none"},150))};K={};H=f;
+$=H.id+"_controlbar";ia=wa=0;O=M();O.id=$;O.className="jwcontrolbar";R=H.skin;ga=R.getComponentLayout("controlbar");ga||(ga=W.layout);e.clearCss("#"+$);E();var Ia=G("capLeft"),U=G("capRight"),ab=G("background",{position:"absolute",left:Q("capLeft").width,right:Q("capRight").width,"background-repeat":"repeat-x"},p);ab&&O.appendChild(ab);Ia&&O.appendChild(Ia);Ga("left");Ga("center");Ga("right");O.appendChild(xa.left);O.appendChild(xa.center);O.appendChild(xa.right);K.hd&&(la=new h.menu("hd",$+"_hd",
+R,Ta),aa(la,K.hd,oa,va),Ea.hd=la);K.cc&&(ma=new h.menu("cc",$+"_cc",R,Ua),aa(ma,K.cc,ea,P),Ea.cc=ma);K.mute&&(K.volume&&K.volume.vertical)&&(ra=new h.overlay($+"_volumeoverlay",R),ra.setContents(K.volume),aa(ra,K.mute,X),Ea.volume=ra);K.fullscreen&&(Ma=new h.overlay($+"_fullscreenoverlay",R),Ia=A.createElement("div"),Ia.className="jwoverlaytext",Ia.innerHTML="Fullscreen",Ma.setContents(Ia),aa(Ma,K.fullscreen,da),Ea.fullscreen=Ma);b(C(".jwright"),{right:Q("capRight").width});U&&O.appendChild(U);H.jwAddEventListener(d.JWPLAYER_MEDIA_TIME,
+y);H.jwAddEventListener(d.JWPLAYER_PLAYER_STATE,function(c){switch(c.newstate){case a.BUFFERING:case a.PLAYING:b(C(".jwtimeSliderThumb"),{opacity:1});Z("play",p);break;case a.PAUSED:ta||Z("play",m);break;case a.IDLE:Z("play",m),b(C(".jwtimeSliderThumb"),{opacity:0}),K.timeRail&&(K.timeRail.className="jwrail",setTimeout(function(){K.timeRail.className+=" jwsmooth"},100)),Da(0),y({position:0,duration:0})}});H.jwAddEventListener(d.JWPLAYER_PLAYLIST_ITEM,function(a){a=H.jwGetPlaylist()[a.index].tracks;
+if("array"==e.typeOf(a))for(var b=0;b<a.length;b++)if(a[b].file&&a[b].kind&&"thumbnails"==a[b].kind.toLowerCase()){Ka.load(a[b].file);return}Ka.load()});H.jwAddEventListener(d.JWPLAYER_MEDIA_MUTE,w);H.jwAddEventListener(d.JWPLAYER_MEDIA_VOLUME,D);H.jwAddEventListener(d.JWPLAYER_MEDIA_BUFFER,function(a){Da(a.bufferPercent/100)});H.jwAddEventListener(d.JWPLAYER_FULLSCREEN,function(a){Z("fullscreen",a.fullscreen);za()});H.jwAddEventListener(d.JWPLAYER_PLAYLIST_LOADED,x);H.jwAddEventListener(d.JWPLAYER_MEDIA_LEVELS,
+function(a){if((sa=a.levels)&&1<sa.length&&la){b(C(".jwhd"),{display:v});la.clearOptions();for(var c=0;c<sa.length;c++)la.addOption(sa[c].label,c);z(a)}else b(C(".hddiv"),j),b(C(".jwhd"),{display:"none"});ya()});H.jwAddEventListener(d.JWPLAYER_MEDIA_LEVEL_CHANGED,z);H.jwAddEventListener(d.JWPLAYER_CAPTIONS_LIST,function(a){if((ba=a.tracks)&&1<ba.length&&ma){b(C(".jwcc"),{display:v});ma.clearOptions();for(var c=0;c<ba.length;c++)ma.addOption(ba[c].label,c);I(a)}else b(C(".jwcc"),{display:"none"});
+ya()});H.jwAddEventListener(d.JWPLAYER_CAPTIONS_CHANGED,I);O.addEventListener("mouseover",function(){u.addEventListener("mousemove",fa,m);u.addEventListener("mouseup",fa,m);u.addEventListener("mousedown",Fa,m)},!1);O.addEventListener("mouseout",function(){u.removeEventListener("mousemove",fa);u.removeEventListener("mouseup",fa);u.removeEventListener("mousedown",Fa);A.onselectstart=null},!1);setTimeout(function(){D();w()},0);x();ha.visible=!1};b(".jwcontrolbar",{position:"absolute",opacity:0,display:"none"});
+b(".jwcontrolbar span",{height:l});e.dragStyle(".jwcontrolbar span","none");b(".jwcontrolbar .jwgroup",{display:"inline"});b(".jwcontrolbar span, .jwcontrolbar .jwgroup button,.jwcontrolbar .jwleft",{position:"relative","float":"left"});b(".jwcontrolbar .jwright",{position:"absolute"});b(".jwcontrolbar .jwcenter",{position:"absolute"});b(".jwcontrolbar buttoncontainer,.jwcontrolbar button",{display:"inline-block",height:l,border:"none",cursor:"pointer"});b(".jwcontrolbar .jwcapRight,.jwcontrolbar .jwtimeSliderCapRight,.jwcontrolbar .jwvolumeCapRight",
+{right:0,position:"absolute"});b(".jwcontrolbar .jwcapBottom",{bottom:0,position:"absolute"});b(".jwcontrolbar .jwtime",{position:"absolute",height:l,width:l,left:0});b(".jwcontrolbar .jwthumb",{position:"absolute",height:l,cursor:"pointer"});b(".jwcontrolbar .jwrail",{position:"absolute",cursor:"pointer"});b(".jwcontrolbar .jwrailgroup",{position:"absolute",width:l});b(".jwcontrolbar .jwrailgroup span",{position:"absolute"});b(".jwcontrolbar .jwdivider+.jwdivider",{display:"none"});b(".jwcontrolbar .jwtext",
+{padding:"0 5px","text-align":"center"});b(".jwcontrolbar .jwoverlaytext",{padding:3,"text-align":"center"});b(".jwcontrolbar .jwvertical *",{display:"block"});f(".jwcontrolbar","opacity .15s, background .15s, visibility .15s");f(".jwcontrolbar button","opacity .15s, background .15s, visibility .15s");f(".jwcontrolbar .jwtime .jwsmooth span","opacity .15s, background .15s, visibility .15s, width .15s linear, left .05s linear");f(".jwcontrolbar .jwtoggling","none")})(jwplayer);
+(function(f){var h=f.html5,e=f.utils,d=f.events,a=d.state;h.controller=function(b,c){function k(a){n.sendEvent(a.type,a)}function g(a){l(!0);switch(e.typeOf(a)){case "string":var b=new h.playlistloader;b.addEventListener(d.JWPLAYER_PLAYLIST_LOADED,function(a){g(a.playlist)});b.addEventListener(d.JWPLAYER_ERROR,function(a){g([]);a.message="Could not load playlist: "+a.message;k(a)});b.load(a);break;case "object":case "array":u.setPlaylist(new f.playlist(a));break;case "number":u.setItem(a)}}function r(b){e.exists(b)||
+(b=!0);if(!b)return j();try{0<=t&&(g(t),t=-1);if(!y&&(y=!0,n.sendEvent(d.JWPLAYER_MEDIA_BEFOREPLAY),y=!1,x)){x=!1;w=null;return}if(u.state==a.IDLE){if(0==u.playlist.length)return!1;A.load(u.playlist[u.item])}else u.state==a.PAUSED&&A.play();return!0}catch(c){n.sendEvent(d.JWPLAYER_ERROR,c),w=null}return!1}function l(b){w=null;try{return u.state!=a.IDLE?A.stop():b||(D=!0),y&&(x=!0),!0}catch(c){n.sendEvent(d.JWPLAYER_ERROR,c)}return!1}function j(b){w=null;e.exists(b)||(b=!0);if(!b)return r();try{switch(u.state){case a.PLAYING:case a.BUFFERING:A.pause();
+break;default:y&&(x=!0)}return!0}catch(c){n.sendEvent(d.JWPLAYER_ERROR,c)}return!1}function q(a){g(a);r()}function m(){q(u.item+1)}function p(){u.state==a.IDLE&&(D?D=!1:(w=p,u.repeat?m():u.item==u.playlist.length-1?(t=0,l(!0),setTimeout(function(){n.sendEvent(d.JWPLAYER_PLAYLIST_COMPLETE)},0)):m()))}function s(a){return function(){B?v(a,arguments):z.push({method:a,arguments:arguments})}}function v(a,b){var c=[],d;for(d=0;d<b.length;d++)c.push(b[d]);a.apply(this,c)}var u=b,A=b.getVideo(),n=new d.eventdispatcher(u.id,
+u.config.debug),B=!1,t=-1,y,w,D=!1,x,z=[];e.extend(this,n);this.play=s(r);this.pause=s(j);this.seek=s(function(b){u.state!=a.PLAYING&&r(!0);A.seek(b)});this.stop=function(){D=!0;s(l)()};this.load=s(g);this.next=s(m);this.prev=s(function(){q(u.item-1)});this.item=s(q);this.setVolume=s(u.setVolume);this.setMute=s(u.setMute);this.setFullscreen=s(function(a){c.fullscreen(a)});this.setStretching=s(function(a){u.stretching=a;c.resize()});this.detachMedia=function(){try{return u.getVideo().detachMedia()}catch(a){return null}};
+this.attachMedia=function(a){try{u.getVideo().attachMedia(a),"function"==typeof w&&w()}catch(b){return null}};this.setCurrentQuality=s(function(a){A.setCurrentQuality(a)});this.getCurrentQuality=function(){return A?A.getCurrentQuality():-1};this.getQualityLevels=function(){return A?A.getQualityLevels():null};this.setCurrentCaptions=s(function(a){c.setCurrentCaptions(a)});this.getCurrentCaptions=function(){return c.getCurrentCaptions()};this.getCaptionsList=function(){return c.getCaptionsList()};this.checkBeforePlay=
+function(){return y};this.playerReady=function(a){if(!B){c.completeSetup();n.sendEvent(a.type,a);f.utils.exists(window.jwplayer.playerReady)&&f.playerReady(a);u.addGlobalListener(k);c.addGlobalListener(k);n.sendEvent(f.events.JWPLAYER_PLAYLIST_LOADED,{playlist:f(u.id).getPlaylist()});n.sendEvent(f.events.JWPLAYER_PLAYLIST_ITEM,{index:u.item});g();u.autostart&&!e.isMobile()&&r();for(B=!0;0<z.length;)a=z.shift(),v(a.method,a.arguments)}};u.addEventListener(d.JWPLAYER_MEDIA_BUFFER_FULL,function(){A.play()});
+u.addEventListener(d.JWPLAYER_MEDIA_COMPLETE,function(){setTimeout(p,25)});u.addEventListener(d.JWPLAYER_MEDIA_ERROR,function(a){a=e.extend({},a);a.type=d.JWPLAYER_ERROR;n.sendEvent(a.type,a)})}})(jwplayer);
+(function(f){f.html5.defaultskin=function(){this.text='\x3c?xml version\x3d"1.0" ?\x3e\x3cskin author\x3d"LongTail Video" name\x3d"Six" version\x3d"2.0" target\x3d"6.0"\x3e\x3ccomponents\x3e\x3ccomponent name\x3d"controlbar"\x3e\x3csettings\x3e\x3csetting name\x3d"margin" value\x3d"8"/\x3e\x3csetting name\x3d"fontcolor" value\x3d"eeeeee"/\x3e\x3csetting name\x3d"fontsize" value\x3d"11"/\x3e\x3csetting name\x3d"fontweight" value\x3d"bold"/\x3e\x3csetting name\x3d"maxwidth" value\x3d"800"/\x3e\x3c/settings\x3e\x3celements\x3e\x3celement name\x3d"background" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAaCAIAAAD5ZqGGAAAAJklEQVR42mNKSUlhevToEdPXr1+Z/v37RxH+//8/htjv379BZgMA4j5LOzqaqAsAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"capLeft" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAaCAYAAAB/75arAAAAh0lEQVR42t2RywnDMAxAhSbJRukGPtgDdJSO0k7U4IOPBhuM8b9SIAG3p0JPFTwETxJICIFCSrkqpZ7EYFAIsbbW7s65RWsNDJK4ee/BGAMhhB2stS7WWui9n7CEGOMsaXwSZ+d/yR+cOcaY+HL8vcByyzl/7HllyX8qpexgSulBhQvl7XjxCydafIt3Z4BrAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"capRight" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAaCAYAAAB/75arAAAAjUlEQVR42tWRywnDMAxAhSbJRukGPtgDdJSO0k7U4INPvthgjP+VSlsSkkvpqYKH4EnCFkKl1Hhxl1LOQIFaa2Ccc1Nr7SqEmDGEAIwxBrz3QIUL9t7hjbUWaq3TRqaUWMJGMjS+l4edfy2/XHOMAWt+eJ3FTuacWS5YSgEmxviU9M/z58R0tIXEifLtATSUfIsSwhegAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"divider" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAaCAYAAAB2BDbRAAAAEElEQVR42mP4//8/A8NAEgDiqk2zfDlcXgAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"playButton" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAcCAYAAAB75n/uAAAAdUlEQVR42u2TsQ3AIAwE2YARMkJGyCiMwiiMwgjUFMAIjOC8lMJdiIjd+aSrr3i9MwzjHXoYMOgFmAIvvQCT4aEXYNLvEK2ZMEKvFODQVqC1Rl/sve8Faq20cMIIvUYgQR5ZMJDh6RixQIF8NMHAgMEZhrHNDU+1T3s3o0CaAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"playButtonOver" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAcCAYAAAB75n/uAAABhUlEQVR42uXVzUoCYRTGcXNGR3HSDPtASyIhrIjaFJlBRBRUdAUGQQurdVfSrl2LuhEvYxR1IYroRhCEWU1/4R2Yxcz4MUlQB34bGc6D58y8r+/vl2EYczNpKvitzN9/orEEGUEoQhAyJDNs2gAJCiKIYVGIQUUIAWvQNM2jWMEGtoRNpJBAFOGJgsRDAahYRRbHuMAVznGEHaSxZBNkvyPLQhXEkUEew+riE88o4AYn2BVBCcxDgWz+G6fxhLGMPdzBWh184RUPuEUOWaSwgBBkpwAZESRxiALsqoV3EXSPSxwgLUIUc1xOAWvI4RFupeENRVxjH0moCMBvF6BiHXkUMap0lPCCM2QQh2LuwingFE8Ytwa4wTYSCEEaGVCtVo1x1Gq1CQPEiDRNM9yUy2W92WyWdF13HJHrkt2aNxoNbTAYuC555Gtq17her7f6/f7HmK+p+4dmbcysO71ez8OHZnNUDBtXKpVuu932clTM/rCb/XHt/cL5/SvT+6XvKcz3r+sbpPMfjCOvfIMAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"pauseButton" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAcCAYAAAB75n/uAAAAN0lEQVR42u3NoQ0AMAwDwe6/YYBncWlUyQFBBX+SickfADM/0k+AQCbJffHfqir3hZ/ADwEAowtQ1mmQzb8rQgAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"pauseButtonOver" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAcCAYAAAB75n/uAAABdUlEQVR42t2WzWrCQBSFq1FSaSjaFi1iF6UFtdBdF6WhC0Hoym3BlSAu+wbddSF9xfyTJ7k9gRMJuY2Oi2w88BG5zLlHZiYzOTttiUijyP768Y2bxCKVv0nD+B/T2AY2OAcdPnOKNZtjrdx/KMCi6QJ0wTW44fOKFGtdjrXzEJPml2AA7sEEPIExeCRj1iYcM6CnOoTz2AYOuAVT8Arm4APMwDuZsTbnmCk9Dns0qxbVBj3wAFzR+iRlufT02IOLrqenA/rgGSxE64uUtaCnzx7WfwEtLtYQvIClaH2Tspb0DNmjtS9gxHldidYPKWtFz+hQgAPuwBtYi9aWlLXOPPQ6JgEu2IjWLylrQ89xAVEUSRzHkiSJpGm6C8jqBVSA8RR5nie+70sQBHmjbUZWL6CmyHiRVQAXWQfoRTbapiqA21QH6G1q9KJl5jwkDMPdi6YCzF40fVSoAB4VKqDiqKj1sKv9uK71wqn9yqzt0q/vs+Wk9QeSkdKwXIKzCgAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"prevButton" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAcCAYAAABsxO8nAAAAfUlEQVR42u2MwQnAIAxFu4EjOIIjOFJH6EiCF8fw7BQZwf5AegkU2tje8uGR5Afe5vH8mTHGZG5+EXSzSPoMCEyzCPd+9SYRZgCFb7MIJNB5XxURT7OotTYFkql5Jqq1TiGBzrvinUj2AMqSSHXHikj3GZBVpH8R9M3j+Tgn8lcGnlSSd08AAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"prevButtonOver" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAcCAYAAABsxO8nAAABhUlEQVR42uXUz0oCURTH8VKz/BNFmZJ/iMAoEmohlRRI7Yp2Qa0igyJc9Qot2vUGbnwB3yJXPYKaCi5m62LQzSymr3KE09hAi1nVgQ93hnv4wZ259878o7Jte/YXfADPcAvwIeDgFwHMKYFJoDPILw0hREQYCyKMKBZlDCEIvzMkiAhWEEdCxlURRwoZJBGTwOA4SC0nLJMb2MGujFlsIYc8DrCPrIRHZtR3mccSMtI0qTMUcYoLXKGMTxxiE8t6WSHEsI2iCirhDg94RgVDmTtHDmvjILWsBPZwqYJe8Io3vEPXDfJY10ERJGXiWjVXUYMBZ5VQQMoZlMIRblVzHSZ+qkccI62DokijgHvVbMGtnnCCjGtQu922R7rdriXPU3SQ69IajYY9MhgM6p1Ox5R3zbE0l4+tmquWZdV6vZ7hDNIf2/X3T5r17zcM40MH6d/vuiGleWpD9vv9SrPZHDLn2JAuR0QFTR0R0zTLrVbr2xHx7NB6do14drF5dtV6c/n/7foCpva8IJ04vWUAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"nextButton" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAcCAYAAABsxO8nAAAAdklEQVR42u3OwQnAIAyF4WzgCB3BERypI3QkwYtjeHaKjGBfIeClFmvaWx58KAg/ks329WqtBbbBW7vMhhowBH2o2/WhLoJTh0QBrw4JfhXKObcBlnMulFJqNwp4uS+HIjjCNKGDZKshhkCYJlRge/ot2Ww/7gSJGQaejWvrvwAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"nextButtonOver" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAcCAYAAABsxO8nAAABjElEQVR42uXUPUvDQBwGcNvUatOK4kuKfUEERVGwg/iCguimuAk6iQqKOPkVHLr5DVz8An4LO/kR2jQtZMjaIbRLhvOpPOHOJMahnfQPP5IcyXO5S+5G/ngJIRKUpMRvwiEyIAWjPl5rlApIhgJ5YxoykIMJHnUYJx2ylGFHWjAozQdnoQBlKIIBM2RAnsdpBqa/hbHRgCWowBZswjoss30V1nhcYKe6P0w/aAoWYRua8ABncAKHcABHQlaFbz0JY/589YPm2Psxb+zBCzzCLVzBtWAxeIVvlQHND5rnUC5ArXd4hio8Ke2nsAF5OTwEcWJ32WuwHHiDV6XtnB0XIKsGlWAP7iCqXKgp15ewA8VgUBn24R5+Kk85v+EISpCLDLIsS0Rpt9sez+OC5NDq9boIarVabrfbrfE6bmhysoMhtm07nud9TTbb4iZbfn41xHGcD/Xzsz3u88sfsn9jo9HodTqd0A/JoLgfUi4R0zSbrutGLhEGxS2RwRftMLeRwTe2oW21g2/+/6c+AdO5vCABA1zBAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"elapsedBackground" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAaCAYAAAB2BDbRAAAAEElEQVR42mP4//8/A8NAEgDiqk2zfDlcXgAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"timeSliderCapLeft" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAcCAYAAABCgc61AAAAD0lEQVQoFWNgGAWjYGgCAAK8AAEb3eOQAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"timeSliderCapRight" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAcCAYAAABCgc61AAAAD0lEQVQoFWNgGAWjYGgCAAK8AAEb3eOQAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"timeSliderRail" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAcCAYAAABGdB6IAAAALElEQVQY02NkQAOMg1aAmZn5P4oALy8vqoCYmBiqgIKCAqqAmpoaxQJDJsQA+54Krz/ExkoAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"timeSliderRailCapLeft" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAcCAYAAABGdB6IAAAAWklEQVR42tWLsQlAIQwFBcVKGyEGK61cJ/tXGeVptPjwN/DgQnIQ9xYxRgkhqPceLqUkW5g5Z7g91BYiQq31BDAzxhjmDb13zDnN+/IP0lr7glFKkX3oCc+wAHpnIpi5hlqoAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"timeSliderRailCapRight" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAcCAYAAABGdB6IAAAAVklEQVR42tXJMQ4AIQhEURKMFZZCrLDyOty/4ijsYuJWewEn+c0buGeIGKUUr7XahtZaENHJgJmj9x7vkTnMOSMTkY2w1opMVX/BPxhjJNgBFxGDq/YAy/oipxG/oRoAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"timeSliderBuffer" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAcCAYAAABGdB6IAAAAE0lEQVQYV2NgGErgPxoeKIGhAQB1/x/hLROY4wAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"timeSliderBufferCapLeft" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAcCAYAAABGdB6IAAAAJ0lEQVQYlWNgGGrAH4jvA/F/GOc/EobLwAX+ExTA0IJhKIa1QwMAAIX5GqOIS3lSAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"timeSliderBufferCapRight" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAcCAYAAABGdB6IAAAAJ0lEQVQY02NgGErgPxDfB2J/ZAEY9kcXuI8u8J+gwH2chqJYOzQAALXhGqOFxXzUAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"timeSliderProgress" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAcCAYAAABGdB6IAAAALUlEQVQYV2NgGCqA8T8QIAuwoPEZWD58+IAq8Pr1a1IF3r59iyrw9+9fhqEJABv9F+gP7YohAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"timeSliderProgressCapLeft" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAcCAYAAABGdB6IAAAASklEQVR42tXDQQ0AIAwDwDqcPhLQgAlM8JqDORilnyVY4JLDX0iaOgWZaeccVkSEKyv23nxjrcU35pyurBhjWO+dFZDWmqkr8Y0Lr65i67XRzKcAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"timeSliderProgressCapRight" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAcCAYAAABGdB6IAAAAS0lEQVQY09XDQQ0AIRAEwXa4+iYBDZjABC8c4ADmHheStUAlBc/wb9oOAM45vvfewVrL6WSM4Zzeu3Naa04npRTftdZAkiVNScFTPhkFYuvY2zeUAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"timeSliderThumb" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAcCAYAAABYvS47AAAAwElEQVR42tWTPQrCQBCF84OsYJCIYEQrsZAU6QKx9xheyG4L6zTZs3iInGZ9Tx4iAWHaDHwwvPlgyWY2mVvFGNNf/gmZyEUm0q+kwQI4sBROWf6R2ShcgRJsRanM0UnUrEEFTuBC1FeaOYoF2IMaXMGNqK81KyhuwDmEcB/H8RVV7JlxRofiDjTe+0eclLKGDsUDaPu+91NRWUuH4hF0wzA8p6Kyjo5ZNB9t/hjz9Zgv3PwLzUthXjPT4hqewrzqDfMnQ2tu8Pr1AAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"durationBackground" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAaCAYAAAB2BDbRAAAAEElEQVR42mP4//8/A8NAEgDiqk2zfDlcXgAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"hdButton" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAcCAMAAACu5JSlAAAAZlBMVEUAAACysrLZ2dkmJiYuLi4xMTE3Nzc8PDxAQEBJSUlRUVFSUlJaWlpdXV1jY2NpaWlsbGx0dHR3d3d4eHh9fX2KioqPj4+SkpKVlZWXl5ehoaGpqamsrKyysrK3t7fCwsLNzc3Z2dkN+/dcAAAAA3RSTlMAf3+Sa81KAAAAh0lEQVQoU+3J0RpCQBCA0dW/i02KpEIzzPu/ZJc+7CM4t8e5k3PuYgmX9VNttv2W2iww9gDhe/iK3mZYHhRVIBwe+l9PYQWjzbB/BYB6gdl096ra4WP0PD/kqh25qq4vIjfuIvBuuMrkaURk8yUvGUAiefSU0/5hkJZSPECcZP8J62epztzpDzcuFrDsGN7pAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"hdButtonOver" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAcCAYAAACZOmSXAAACFUlEQVR42u2WsWoCQRCGE42I5AikkSBaGSwsAiIpQi4BK0vF+qwEjb1gaWMlaGfvA5xYWvgCNraChY0+gU+wmR3+DcPGC0lQrnHg43bvbv5/d25v764uYYdS6voc/MY0AqLEzYmICt3roJlGiRgRJxLELXD+g8hPQDPGHnIAwjiOpHsiSaSINMj8CeRBIwlNBx7RY8Z3xAORJZ6IZ+KFeCXcP/KK3GdoZbU2POLGPIJyOLiYJ96ICuERDaJJtIiPX9JCTgMaFWjm4eHIBRZHWR6Jd8JXpw8f2o/aS5Y8QSRRnqo6X1ThkTTmN1iRKTwfz87o9/sql8updrutTBSLRT63WCzUZDLhtoCvT6dTW8qDR8o2T2OBNL5leJ4WZBMd+/3+y+RwOKhut8vtUqnE92JgfLSiAY+0NHeIDFZo085gI5gvl0s+GjMKPpoq2IOzogmPzDFzl1eriPV6zSI2eAw8c/TZ1M6RAW33R/PtdqsMo9GIRQqFgqrVagy1+dxwOFSz2YzbrutaOeIckOaBZd9sNgro2bFQp9Mx575m5fu+6vV63K7X63xttVqZwfE1qSXLHrjgZEK5XGah8XjM/fl8bsx1nyuBWcqq6DweiNSSCy7wVZMJMNKm3B8MBkac+zCT8CBgLLFetYBNBjefHLnJBG6vu93OP7Wx1pTba6gfllA/qaH+TIT6GxXaD2Q4v86XoPgE1h55oNE1QD4AAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"ccButton" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAcCAMAAACqEUSYAAAAXVBMVEUAAACysrLZ2dkmJiYuLi4xMTFAQEBHR0dJSUlKSkpRUVFSUlJaWlpdXV1jY2N0dHR9fX1/f3+Pj4+SkpKVlZWXl5ehoaGpqamsrKytra2ysrK3t7fCwsLNzc3Z2dky1qB2AAAAA3RSTlMAf3+Sa81KAAAAe0lEQVR42uXNQRKCMBAAQWCCIgGCGEU3sv9/JpXykCLxB8y1D1OdsEaLmqT6p6M6wKn6FuyWaUQL9zdcW2yuLV49dmTUL2S6gcYsr+IbwgdC7MYj/EoqIoZFHF1PL08QkYNO0MG8wMUw5LoOwCQyG+jWTMuS1iXW1SnbAaDLE32SOX+lAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"ccButtonOver" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAcCAYAAACdz7SqAAAB8UlEQVR42uWWsWoCQRCGEzUcEhFsQpCzUiwsBBGLoElrp0HbsxI09j6ClaXgW5xYWvgCNhaWFjb6BD7BZmb5HWSXXAw5rnHg43bd3f/fG+f27uE+Qyn1GCa3mMVAnEj8k7jowdwyxKQnwiGSxDNI/Qmsg4YDzbh15/jRwaIM8UJkCRfkbsQFWWhkoOmwh2nqEGnilcgTZaJGvBF1onEjdaypQSMPzbRlzLvBYIl4J9qER/SJATEkvn5hiLl9rG1DqwTtFFId06ZIQ4H4IHwVXvjQLMDDkcJC/svEpwo5oFmGR1JSjD++ptNixGQyUcViUeD+JRaLhapWqzLmeZ46n8+mhAftLKo6cTF1UQB921AEpT2bzdRms5F+q9Vic5lnRB/armmaI+ooBAkI6TvCnYnwaDTitr5ynE4n2YQRA9aGR8o0baAKOXSaRMQOufP1eq2CApqNQNPD4aCY3W4nptS36Ha7emy5XHL/R4JNkd79fq8uVCoVLez7vu5Pp1Pd73Q6qtfrcZuvemy1WskmrzQC0yuFdL1gPB5rERhJez6f80ak32w29QbxHxumdiFZj8z1gu12KwUD9EYwzuYwk43xGsPUfmSswwGTwyLwcJBj8Hg8+mEZklbgMRj9gR/9qy36l3j0nyuRfphF+wl69/ENcVv6gzz3ulwAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"muteButton" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAcCAYAAACQ0cTtAAAA30lEQVR42u2UzQmEMBCFtwNLsARLSAkpwVJSwpZgCQEv6skS5iieLCElzL6FJwxCDlllT3nwkb8hXxLQV01Nzc/Z9739l8gBBRE0j94AiBk3oAceJCCPCM2GauY6zh3AsR/vit5AT8zzBbZCoWdNWypQS0YmQM2tekpDkWzbNs1xqRMQwGraMtk8z5rD1k3TJJgLYF2WZfi2oEw2jqPm4HoHhHMOJNCDAxTLnGHIyALXhRLPmnsfOU+dTpkRJooc+/F1N/bpzLjhITxFAp77i1w3440UxALRzQPU1NTk8gF0y3zyjAvd3AAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"muteButtonOver" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAcCAYAAACQ0cTtAAAC2UlEQVR42u3WPUwTYRzHcWmBFnqKBYpAHVSQoEB8QTQaiMSILhgDiiFxUBMSlUETnYiDg9GJmDA44OCgo8bF18EFibq5MEBpeUsDIaVAm6P02qTUb5N/k5P2oNg46ZN88tz1yT2//p9e77lt/1u6Fo/Hc9L5GwEmmJGrY4bpz0JlcoOAPFhRCAU2FMAi46YtBa4LyEM+LBKwHSUoh1OUYaeM5yUDtxpSAAVFKJZJd6MGh9GEY6jHXjigpAQaBskySQWlcMpE+3FQJj+DDtxBN9pxCjUogw25yEkJEWbkw4ZiqaBWJm9GK86jEz0YRKKNok9Cm1El11th/i1QF2TBDuxCtYS0oQv3MIObuI+nGMIwIljAQ1xGI5xQINWlBhXBiTqclgtv4xXCUsUTDOADotAwIsce9OIsqmFHPkzJsORvpKACDVLNNfThJ/TtBb7ADRfCEjQm4/3okHkcyaXU3xAW2FEtFW3U3uAbVDn3IQYvQhjGVTSiHIX6MDMK4EA9LsRisbgR2jt8wg/OtbW1NZU+Qu+nX6T/zth1nEBl8q5cH1aGQ+icmpqKG9GHeb1ebWlpSZ2bm4v4fL7A7OzsIn1GYQ7Uod3lcsWN0N6GQqGhyclJNXG+srLic7vdseXlZa/H4wkRnLKMRr9ZFVr8fv8jLh4MBAKv+fbudWEvCfs8Pz/vUVXVRbXaxMRENBgMjiXGV1dX094g6e7GcqmuFVfQiwcszfvx8fGwhPXjGYEf+SxKNRqhI4nj6elpw1vf6A9dgRo0yUWXcINv/piJvRzfRV80Gh1gBb6yAsMERahugc82/FOnC1RQonvYHkELzoXD4S76i+jGLYKeJ6qlolGCtvC4gv5Jr9tGKrEPB9CAoziJNnRqmtaz2YM40+3FCgV2OHT71x7UStXH0ZTJFpNpqEWqtUnFRShFxWabZ1bvHLpd2yrhijB4LcjyXSSLF56sw4WE/HPtFwoiecfnKRGcAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"unmuteButton" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAcCAYAAACQ0cTtAAAAk0lEQVR42u2NwQnDMAxFtUFH6AgdISN0hI6UEf4Oxgdvkas9RUZQ/yEBYdChgoZC9eCBLBs/SZLkjxlj3Ol2RehJd6rfDq1UT81eKcwZVCMB9Zw/p7CzfErvXT2ndzB3kAitNfUUQ60V555zLFZKUU/zBscOdo7EFiOcmFLMcQli4y+6Bz4LBx90E3JV8CZJkvwsb8qa9F25tXYIAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"unmuteButtonOver" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAcCAYAAACQ0cTtAAACOUlEQVR42u3WS2sTURjG8ZqJuTSJTW1T26YqrWmN1jt2ISpWTb1ABS3iRkS84WUndlNQFN34Fdy5d+U36MJVQVroKgnmvgqBZBV3Gf8DTyQMzMggRZC+8CNnJsn75CRnzqRvu/6/Mk1zRw8fwBhbEeSDAT92ih+cU7D8dYiahxFFTPoR1HOG+Fxm7h6kRiE1H8Y49iKJEcQRRRghhQegmTuFKkQMBBDBbkwgjVOY0+Mh7McoEhjSa+OIIawehluYgSB2YQ9SOI0MbuEFfuCizs8ijYOYwRSSCo8g0J2hU9AAkmp0AbfxDJ/RhlV3sYgFZPR4GedwApMKDMNvD+v+RlGM4aga3McKvqO3XuKhxt/wFI+xClOBScTU12dfEEEMIqUZudU7vMKajjewrvGqZjiFOAL2MANhJHAENzqdjumE+ojXeMvxJkyxAh/hEqYxiKBT2AiOY6lQKJhOesNqtdpm93y1WvUUlsAsFrPZrOmEeo/lcrm8Zh1XKpUNxuvWuFgsun6N9t/sAM43Go0PzWbzU6vV+sInztvClvHEGpdKpd8LxArinPMCsa9GjGp287iD51ip1+tfc7ncTzV7gJu4igVc8bL07Rf0GGYwhwyWcI9Zvsnn80XG13EGx3AYafzxonYKjOoNE2pyEmcx3263r2nLmu7ZJ4e9b1ew7fQxhY5jUgEp7FPIAPq9bcTut5cQoohjSOKIIKjGhrjeYryEBhWMnnuZ9+buoaJgUcjW/xeRvu36F/ULlStUoyVtQSYAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"fullscreenButton" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAcCAYAAAB75n/uAAAAbElEQVR42u2R0QnAIAxEu1lWc5/+ZYKs4TTWjwS0qIFrP+/BkYMLOdCLELKn1tpG5TleYF2yyMUzvCAOZDtwgU85PJGE/+NPyuTJG1Uts/9+sI0+y6GCrtunLHKJHbjAZYcd8x28IJTmhJAtD4gEt9ueDIktAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"fullscreenButtonOver" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAcCAYAAAB75n/uAAACFUlEQVR42t2W324SURCHhS67VCoFbYhRkbQsaCwVSwgUaZP2yia9Mb6MN41vYfpIfYIm5QIegJfA3yTfSU52c1i98KabfGGYmd+cPX+Gw7On+2w2m5JPUfxfC5dhB8pQKooXvjGCiohFFRJ8EVTwVSHGtxOckSuOsCb2xUsDe0/swl42jiZxg2wr/kK0REf0DOzX4hXIzsVbaPODsH4VUSOxL8biwsD+SCEhOx/vo61Rq5zd1JipdhBkn6k4hmk2iKZDjdhtuj9Awnqm4twTPopf4lKM4BLfo0tCk1IjCQ3QFF0xR+QK/BBXYgxX+PycOdpmaAC3RG1xiui7uMWeic8ww3dLzgZNO7tEoU1OxYhpX7Dmd+KDgT0ldk5umt/k/DGtioZ4y/E7EUMx4JQcQR/fkJwemgY1OKbhAd6wnscU+ESRQ+jhOyGniyY4QFlE4rk4sCKIJyzFaLVa/XaNhT0iNiH30LTUiEJ9UGeqg8ViYRv3TVxjj80PY3zXloM9QFvf1gcN3mRiIr3pvX2u1+ufHMMvMDefn2MatI2iPjgSZyYylsvlg77fiK/umGLfWMzlmQbt3/UBQoc7530IxLf3QeT3AYIZbzbE9w5SfGfknGb6IAr1Qez9XL8XXabdxtc0sNvEuuS20MZFd0LsXThNqOOrQg0fcS6cXPHiKzOB2L8yg3GKG4WXfoBSUfz//W15ss8fvEcYMYnLr+AAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"normalscreenButton" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAcCAYAAAB75n/uAAAAbElEQVR42u2Q0QnAMAhEu5kD588JXMNpbIUEpCBpe5+9B4JczF3MQQjpcfeBz+4vxpMe2ULSIF9YjaqWM+hXWRrdA2YZah61Wv2/qGrU6nQkQK6yLmCeCbzFCmk02FxWX/WyYXw1H69mCSEtJ16St50Fqd0HAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"normalscreenButtonOver" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAcCAYAAAB75n/uAAACDUlEQVR42u2Vy0ojURCGZ9Kmk4A63cYLMhdE28tCECUgxCuzGBDc6AgO7uYizKAP4NKNb6S+g08gSZO8QZ7h+Bd8ScDDIZmsLfhIpc7/V53uPnS/e4uRwjn3vsto2sHiggdrw2iGaT4miiKGEhShBDEU8YSH9Jr3G4yLSZGID+Q9qCXk0rIBhoSaj4kyxlnxUXyBz+ITKKcuDdoEb+9KQrufEHPiXqyLLVETmwDUpEE7h7cYGhBxmQk72xAWR+KY/Bs4akfkG3gSekTebaJYFlWxKLbFDQ2e+P0BvRqabTxVekT+M+gPmBKZ2BWn4tn146czCNa+o83wlkNXUGAxRVx3fvyC11HHk9KjQFtvQIxoSeyIE/Fb/BWX5EK5auQnaJfwxsMMyMSeOKPZVX8IzVUjP0Ob+QP8Y1rhPq6Kg2az6Yw8z12j0XCKf4blVuuum9Y8eCvBY8ritFgTXzudzl273c4VzlBcG93/tmYa05oHb2XQMZ0RK2JfnFujVquVs9M/huVWY+g52hXzDjqmJe7jgqhZI+3wVvkFA04N8gtbI6/hSekRhV4VMS+vee3uAeOeOOSs1w3yQ9Zq0j6aB2/sPwP/ZTeFYUEsc/mZWISM2jKaeTzeyy50FWV2k/LgquQJpNSmySfxeLsPfnAQlzCC1dgAoInxDP9Vg8gAauG1//82I/ZM1DztW4wSL9xQTRdfTNL0AAAAAElFTkSuQmCC"/\x3e\x3c/elements\x3e\x3c/component\x3e\x3ccomponent name\x3d"display"\x3e\x3csettings\x3e\x3csetting name\x3d"bufferinterval" value\x3d"100"/\x3e\x3csetting name\x3d"bufferrotation" value\x3d"45"/\x3e\x3csetting name\x3d"fontcolor" value\x3d"cccccc"/\x3e\x3csetting name\x3d"overcolor" value\x3d"ffffff"/\x3e\x3csetting name\x3d"fontsize" value\x3d"15"/\x3e\x3csetting name\x3d"fontweight" value\x3d"normal"/\x3e\x3c/settings\x3e\x3celements\x3e\x3celement name\x3d"background" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA8CAIAAAAok0etAAAAJUlEQVR42mNKTU1lunnzJtP///+ZGBgYwDQ6xiVOrhw1zSNRPQBu5Zagca3K1AAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"capLeft" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAA8CAYAAABfESsNAAAAnElEQVR42u2WvQ2DMBCFv8I1M3gjMoTpMwqjkI1S0RnJEhaiuZcFEuyCBCnyqz+9+9XpHMAwDD0wAp4PciGEXtK0risxRvZ9fw+a2ZhzZp5njuTMzC/LQklOEtu21YGSyqCZ1YHfcazR1Tle6FjVnr+q+vz2XJxjW4p2Utr2tFn/OvT5s5b0BHwJdmZ2Bybg0NmllB5d190kHb5cL8J5WhbWZJeBAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"capRight" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAA8CAYAAABfESsNAAAAmklEQVR42mNKTU39jwffB2J/BiBgunnzJgM2/PjxY4bPnz8r/P//f0NKSoo/E5DBgA1//fqV4enTpyDFDP/+/ZvAxEAAvHnzBqRQAaeJMPzz508wTVAhDBOlEGg1LUxkIAIMtBsH0ERigmf4+XpggodGbhxNFKNFymiRMhrXA1Gk0D+uoQH+gIkIRSCrC5gIeOIBkA74+PHjRgDhswBcaL43lQAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"bufferIcon" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAQAAAAm93DmAAAFy0lEQVR42oWXy2sk1xWHv1vvR1erNeqWZ2TFiSQ/ZI2GMBDygsRhTIwZgg3ZeeFV9lnlT8giS/8BhqxCICYJ2TgPhzEhYLJQFgMT2SN79JhoMq1Hq7tVXV3ve7PoktQjd8sHCpq6zVfn8TvnVAkumRLnPzV0LFw8XCwgI2ZITEaJFIqJZlxCneEEAg0bn0Y8176eB2CG19tuhx4DUpRiMtIYw40gooJqGHjMHi5urzt39JZgeHRwb/nBPJRIFOWVHqoRzEDHQKvOTGpxc/uW+zNnzUcQoy9vvx/EbkxKgWS6h0og0DGxcbAxERRIdIKDBfeOszZPgCDmcE2+3n68dMyADJSYFLRx7p2JS0B9a34YCGEMb3aQ+HJGb/kEGIBPQLyUB1joiLXGYx1FwmBSyAIDm2DY2ljVX9WXoXzy8db6f1tSM8V5UkGghwB/t36x0iYfBR2xj3wWKNDQcahvrNo/Mr7joZPcSlYffPT9XTsbnCTE+EDKkPy4FvaK9xaGWZ5XBJ9FHl8A9Sp/NrWtr8Xftl5v0STAFqqhiqx94/TpQC1krZKYHtFm+PsXtz7IP9E7RaLiswxaJGSXQ9Yxh4G+7FHHAmoqE/ELHe+lg6WHX/y6fC1tqqDYHt5bfuAe/9PtFZHMxgviXGTyQthCCNDPNaODoQqi2d6tk6c7eYByw5faboferugY+ZQ+OcshSHIjKp8k6wk+UBAruW+dEjJ01NIhJuqs9XpG1sjUMx4mX+4URXHz6ONPk1c6Sym6ign7w/vrbQYMKBAIFJKcgvzW8aafaWO4bFw6QmlomKOubV/fXHVv21/HlPvx/dbm6i5dIopKFhKFRKJEnefQK0LJHuk40MDAxsGjhp/4O3PdQEo3Wmk3OvQZkFBWQDW6hAJMrmEDIf1xFYJQNjZ+P9iaLwLLDNQLoZORkVSjKqn8U6M/f6kGGgEmkBOOwEIF+FvNf78ys2bXhC6j5PPbO8+fEBGTkI+GwLTZh80i1nkm90nBwOoFGy83f+Dd8IUgFdq1f+Vv9IOclOIrcNoYDiwW2UFqmJtzM2vejRYt1VJNVXvOe3mzXlVVwlQcBGO4ETIAAyNxzZqHjwF4KmEwN3TQERe5m2LmpDuVnsYnColSqCtRV5hG4cT5ICFBVc2QDdyEEoX4Cmg+6Y5Gvtbpb0ZPO5zQEx0RtvsPb3arAa9dCQwvZkxV5xAMskb4ra0N8rUoEE5+cvrZd3fqKQqdEjV9uwGS/UuykWfC9nrBw1bma1pQrHT9mISEjIyC/ErhTBS2gY6NjYODGZob9T23KN3oe4fLAxIyCqSQSlwS0BWtpyEwMbBxP2v87RszC1Zd09J+/+nSzk/axOQUVXEu2m9m+nAwUECBRgl/Xphfqc066Cp1rcauejRYGe1fdY5UijXz0wsc6CzyaAwolBKAQnxU9+e9RkP5CDKEk9345GBlQHHmW9U7cu+aZTwzXi1qz66A0aF27DmBjYsGWHg49Y6HgfmF8buga0KQvd37Zk5pOsXl0kzcKUqq8ccKkKVC/MP7zYI7YxlwlP+qe3fv3YGrlQKyK9++FAo5F+10k/mYUcgxcf/58Ej/4+J803UsBTm+/SG3P38x+o93CTe2U7Tz7BRvdvP/hftdTuhyQq93sP/Dk3u+2/CdgDoz1Jlxm7N/mPllKEpLjOGi8Z1igFBKIClI39n+LcOoNiuITsODH+/OJU9cXbexlQ7Y5NTs0HpN3Xn81wXLrLyM2J8UsqQkaw1+/vAvhx0floZv9MhRqSykHJtEUgJ8kPKoUc8MYMhwQg6FUlACkuLNFA1GAkFoSZJnKsMGCjLivJmNVNHvTevFqmFQlBRkJAwZkpCSk7/VOzg5jUMGRIT04qPuT/uV1KfYuWyEUiO/RrNWAQLxanp370Oas56paVF61L27t55Ne3c9l9u4KXHpVEe/b/6pEVoXwqa8av4Iplr1VaChoVVejzKrrlpd/wdqZ96EzbsuCAAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"errorIcon" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAACL0lEQVR42u2T64nCUBCF7SAlpIQtISVYQkrYElKCJaSElHBL8LfPKD7wyUXxgYrOzkCyHC6b3LgasywOfBDuOTNzcklq73rXfygiqjMxk1YsZ38lXIOyq1F1OI/s5VUZsAlBNOMlaDhvVhXOZ7B80D4ztNeV+VNY9VdUzg3VM/5srM9XhXOMb0zleJXxjTqlB7xer8HtdiPAy/KKhl7pLTXc5XJxGc1QggJNIXgOfs24pQU8nU4hQynn89kFjZD0XDyGFpYS7nA4uMfjkYAQddQEQwtRk1lPD7jb7SKGUvb7vWvoTdCbqIkXNCF6arjNZuNtt1sCAtPDZwp09YMe4AyZ+bSAWmvFUILm4Y7Fo0xderQUep5Rq9XKW6/XBAQ/+fi8AZ5GhicwZj1+i4vFIl4ul5QQZ/lYC8AX5Pi+58nsh8LNZjOfoZT5fO7neAPwZgaUGeIB/F+Fm0wmznQ6jRlKyH1b1uvgred5zbmy6+6Ao9EoGI/HBHh5ftF/6SXZdVe44XDoMJqhBFWgxwO/V8CvwK+Z4rfY7/eDOI4JsC4cDAYO4yVYl8lM3CE7C4XrdrsuQym9Xi+qlVQyW3YArrWp3W6HDKV0Oh1usler1fLTHnku0iOzxQ+EtiUfDAHYYOsl5I6+0Oj9yDNHYNSM84KADqOhNyq65K5fX/wP9tpfznrV9kWu7dbtn1bxgCHj1sorfKmwaEDFUMUo21XrCsNpyVD4yl8GflLvetcfqy+dCCa6ODMoXAAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"playIcon" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAArElEQVR42u3YywnAIBBFUTtJaSnFUqzLhVjKZDZmI8HfGx3CPLj7AyKIjoic5pwBDWhAA+oBei5wlxMYClgGh6KBcKgUEAaVBi5DdwGnobuBw9BTwG7oaWATqgX4CdUGrKBagWX3MjCl5DmSKOe8Dowxeo7ABQ5zxGDgC4NdEhCwgmkBfsJOA5uwU8Bu2G7gMGwXcBomDVyGSQFhMDQQDkO+ZuxnwYAGNOAfgQ8LTbXBn1RvGQAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"playIconOver" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAACJElEQVR42u2YS0sCURTHNc3sTWEPelMQUQQtKnptIojosWgdFLTIFu2qdZ8i6Cv0BVq3KUi3IqgI4hN0rS5v/xtnahh1Gqd7Z0bowA/EWcyPM/ece+9xMcZcTsbVcoJ6gedul4VhSJBLEW0a3LKFdQVVYh7gBT7QQfjoP48ia5egh4S6QT8YJPjvHuAH7bJEGwpq5PrACJgB88QsGAcBet4pQ1RPsI1eyLM0ChbABtgD+2AXrINFMAWGZIg2ajNKQfDsDYA5sA2ewRt4ANfgDByCLbAEpkWL6gl66CXDYBmcgBf2E1HwCG7BBTiWIaon6KXCGANrlK1XVhtx8ATuZYgaEZwAm+ASvLPGkZAh+psgL5BJWn9X4IP9HkJFjQrugCAIMeMhRLQZQV61YdZ86Ikq7amXGr5XK2mFYCPRI1rbi/QOvjt1UTa/Ja0U1IregXNwAFZpZwpoJe0QVLcn3kdvwCntUrOUST+tSVsFlYjQzsQ3ghXquz2URUcIKvFEa3Kaqlv5zMYFi8ViOJlMMhmUSqW/CxYKhXAsFmMiSafTkXK5LOYTixTMZDLxSqUitkhECEIsUa1W5bSZvwiqxOQ1ajOCdcSkbXVBCIYEiQk/LHwdt/L5/IdVYqYOrBB8t0rM1JE/l8u91msXMsRMXZqy2eyLqsFGqY/ZdmmquXZC6jmVSr1R57fv2un4i3tLjD4cPzxqifGb4weYjh0B/0/5m+QT3Dh1BNFdpj4AAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"replayIcon" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAABxUlEQVR42u2XwY3CMBBF0wElpARKcAkpISWkhJRACS5hS3AJnOHAwoEDB2QOHJCQmP2DcrBGycZ2BtiVMtKTEGLe/NixJYq55prrxUVEBjSgBStgu88NMJ8KVXZBPI2XBxaU7wi2AJbyy7LjVeGWwNP08uzSDlcDPzLUCcZ+X79j5RyofumtgNNeSfnO+QG5SfCYIc+kd3LgQKxzpNzT9cqy2VfJ4BPr70iptXpG42JXWcXH4+EBBbhCqdgl3D5JcL/fDSBBpRWQXT3++N253W4NoABfKBc7xYwmuvl6vbaAApx2QHaKGW108+VysYAC1AOyU8yID3g+n1eAAtQDslPMiA94Op1aQAHqAdkpZsQHPB6PDaAA9UPCTjEj/pAcDgcDSJB1zez3e9Pjr3r8Jkm82+08oADe5lSH6Xqt+N4Jd/oObbdbCyhks9mYREcd9D9DskN6gU0OCFEJSODBIsGxEv22c5Ag7/9KJyTBV0K/AzSCLXKLV6vnieuEftkr+RY7khVyGQyqJ74iEp0/TxBVTGKPedX2aj1UC+jPhuTDBEgvpH7AdUJA/4GAw2GAAy2oNQ7KlEt+DWwXxoBFMddc/6x+ACbEv+zn5grUAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"replayIconOver" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAGZklEQVR42rWYTWxUVRiGoTPM0LG20IEypUCKTX9IhCK0iqAVGtQAIUasAyaAWkaJJlZMhigs8CcaEhdSdSNx0bhRFrqQjS66BTFGFiSFgC2/bWkhQIFSZ4pwfW/ynOTkwO3l9yZPAnfO+b53vvOd95zpuLt9PM8bb1EgIhB1iECBPWfcw3psUQiYIOKiUCTEIw4JPoszNmqLfRjCIkYUyYtFqSgT5aJCzIAK3pUxppg5RmzkgQh1KjZRFJEwJSpFrZgnGsQisRgW8W4eYyqZU0qMiXZF70dcRMRYslKqUyMWiCaxUrSI9aJVZKCVdy2MaWJODTFKiRkz1bxXcXGWJyWqRaN4QaTF2yIrOkSn2C8Oii7+3clnWcammdtIrBSx4wEiQ8VNFCV847limVgn2kQ7QvIi7Mkztp2564g1l9gl5ELkHVaOiTPFfLGCpdspjoh7fY4QI0PM+eQosSsZtiFilH4GAVaJd0UH1bivhxgdxFxFjhnkjAVuHARGad4US7CCQL+JfEjSs6IfzoaOV0xiryBXitxRBAb2XZLd1iwyIZUbEHvFJ2KreB+28m6vGAipZIZcNeR2+hGBGGgR5W6kmXcGiBsVv4odYrNIYyfLYaVI89kOxo4GiNxJrkZyF6FlvNt7cfypFjtoC9gQQ2K3yBK4GY+rE1VQx7tmxmSZMxSwcdrIWYuGuOlFu/cSopzAa7EF9xkl0QdiDSdGNfOSogSSvKtmzBrm7A6oZDs5FzAvYXrRXt5ijqQmjLXLjcJSZUnYKGYjpohvHYM475KMaWROlhju00XOJjRIC8vsLG8d/ZO9efNmTngWA/TTOqoymzmFBONqJbhY8FkpYxcxd4cfy4mdQ/xKUWcv8ziCFXLzqBctN27c6Lh+/bpno3d7afpmli7JPPfQdy8ZhYytZu5mP9Zt4nf4udFQxryIEWj6r0Fs0ITOXC7nWeSxjbTpE2u3FYQYv3GH6cxN+7H8mHYOP6efGw30oQRa5lzBMrRqwv7h4WHPMDIychZvM0uQDDma3Crir7SQYvkx7Rx+Tj83GiqMaRuBxv8Wi4wmdA0NDXmGK1eu9GHAy7GRSeZYCrt5O71YLZ4XW/yYdo5r164dwLQXGz8MFKjJBy9cuOCBHyBYYHDV4ggrwnqmWR67RTH77RxXr14NFugu8eXLl/cPDg564Adwltgx09tsDERNFeUkrKIHXxIf+jHtHMoZtMS3bhJ9u86+vj7P0N/fbzbJq+IJxtoHu3ueT0JUragn7tNU7w3xhR/TzqGcQZvkVptRuTtOnTrl2egb+jbzlnhOPIYIU0X7qvYoFZgnll68eHE79vGa2CS2q4V+d+MrZ4DNBBj1iRMncsePH/cMZ86c8Zd5m3iZICmRsHzQvQ0tu3Tp0uea61fob/3/Yy4G3/X29p63YytXoFEHHnUS1HXs2DHPRsuwhz551jqSYoiLIjhFG7xy7ty5PWauRPXo3c+q1J9uXOU6zCHgHnXBlwX51K6jR496NgqWy+fzH+nzF+2bhznaWN5ZYololai/7Pmq5HnF+M+Nq1zfcAwudC8LY1233jt9+vRhN5iW4xBLMcdcMAkWoy+rsKM2je1jXiCq3j84xConJg4RfGFNj46OfuZXzQ44MDDwAwJqxGQRt08LkqwW2zQ3P5a47u7uER1x32vsO2Ipl4oSx2Mdi8Dx2a0btOPalehfBfT96kes5imW0vRg1HGCtJbt27Dq6fTYp7G7RCsGPZM24UYd8KMJ15+DyBY1+9c+3OmeoXpTERW1e5jqb/Q3VJjAXj0a+5UlcFaYQNvLUghp8EXBQqo7zbrNROzjEkPeJCM+gJAxUZ934a/uDi4Y8+8xJJyC6VZChblBW/ZSYAmcyQ7OnDx5shsRoWjsPusAcHowWOQE+7CHIucGTdWxGAlkqd7s6ekZRMCdMMwXqwwT6C63ERoDhHG8gVXBCvOTNUiMv7NlP/16/lBf/6Ij9FNsq15Mt3923tWfel1RDHONfpp4XDt/IzbSpx47JDH7tGl+km196Z/FXN0yYi2eu5DqTXZ+uN/341rUZBIt4GLawg3ldbEei1qNjy5BWB2tUWqf7Q9WIH2IRSWxizmcyU9Cg6jnfRVjyhlfbHrbFfcwRCZo9ClY1XQoF2UImsSmSlD52IOtXPiPpBiJEwF/9TcbLupuOjfu/32eYAv3OqcpAAAAAElFTkSuQmCC"/\x3e\x3c/elements\x3e\x3c/component\x3e\x3ccomponent name\x3d"dock"\x3e\x3csettings\x3e\x3csetting name\x3d"iconalpha" value\x3d"0.75"/\x3e\x3csetting name\x3d"iconalphaactive" value\x3d"0.5"/\x3e\x3csetting name\x3d"iconalphaover" value\x3d"1"/\x3e\x3csetting name\x3d"margin" value\x3d"8"/\x3e\x3c/settings\x3e\x3celements\x3e\x3celement name\x3d"button" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAA80lEQVR42u2WQQqDMBBFQ4pQeoVueiN7BtG9R+lR7IlaAllnIZaCxHR+KWLpou7mCxE+Jm7m8b+TiTXy1HVdim5N0yQNoTYYwGKrqiqnaer6vj865x4aQm0wgMXGGC/yYfTeP4dhiBpCbTCAxQrZKYQwppSMpsAAFgAZJiGy90LbITCAhc8hBneWLs2RMegrMgZ3ZodYIuP8qSnbfpmhln66jO5gpOsyhsh4HaI7qfMs29Qsy5H9iyxfYddMe8r7EFWX5cg2FVkeritO6rtsCoILWgEWONRiY4zZy3unoU9tmNLaEMJVFmeRl48HDaE2GMDyAjEWKwKFLBqcAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"buttonOver" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAA80lEQVR42u2WQQqDMBBFQ4pQeoVueiN7BtG9R+lR7IlaAllnIZaCxHR+KWLpou7mCxE+Jm7m8b+TiTXy1HVdim5N0yQNoTYYwGKrqiqnaer6vj865x4aQm0wgMXGGC/yYfTeP4dhiBpCbTCAxQrZKYQwppSMpsAAFgAZJiGy90LbITCAhc8hBneWLs2RMegrMgZ3ZodYIuP8qSnbfpmhln66jO5gpOsyhsh4HaI7qfMs29Qsy5H9iyxfYddMe8r7EFWX5cg2FVkeritO6rtsCoILWgEWONRiY4zZy3unoU9tmNLaEMJVFmeRl48HDaE2GMDyAjEWKwKFLBqcAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"buttonActive" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAABD0lEQVR42u2XQQ6CMBREm97BeCnjIQjcxLt4KVckrKuphYIC/jEtKRu3fxaSDGlh0ZeZ/2mxRq66rs+iW9M0bw1hbTCAxVZVdVqW5eq9P7Rte9cQ1gYDWOw8zxd5ELque4QQeg1hbTCAxQrZ0Tn3XNd11BQYwAKgkUmI7DsQyklTYAALn0Nyi4lyVBZciltkDNpFpu3QrqizZcoiLeqi7dUj2xxKFa6q/C3idIiyywgiI3ZIBi9th8BQdhmFdl3GuJepn4fy8eMf2c/IEtBEENnEu9uz1BBvlzFGRvHXwRmZUMU0icpCUUfL4E7pEhwayvOIllLbD3DIY2KMUSvsvDZYrHPuLYM+v9BQgunB8gFJekgEq5c0PwAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"divider" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAEklEQVR42mP4//8/AzJmIF0AAHImL9Fd8LZHAAAAAElFTkSuQmCC"/\x3e\x3c/elements\x3e\x3c/component\x3e\x3ccomponent name\x3d"playlist"\x3e\x3csettings\x3e\x3csetting name\x3d"activecolor" value\x3d"bfbfbf"/\x3e\x3csetting name\x3d"backgroundcolor" value\x3d"262626"/\x3e\x3csetting name\x3d"fontcolor" value\x3d"999999"/\x3e\x3csetting name\x3d"fontsize" value\x3d"11"/\x3e\x3csetting name\x3d"fontweight" value\x3d"normal"/\x3e\x3csetting name\x3d"overcolor" value\x3d"cccccc"/\x3e\x3csetting name\x3d"titlecolor" value\x3d"cccccc"/\x3e\x3csetting name\x3d"titleactivecolor" value\x3d"ffffff"/\x3e\x3csetting name\x3d"titleovercolor" value\x3d"ffffff"/\x3e\x3csetting name\x3d"titlesize" value\x3d"13"/\x3e\x3csetting name\x3d"titleweight" value\x3d"normal"/\x3e\x3c/settings\x3e\x3celements\x3e\x3celement name\x3d"divider" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAACCAIAAABANcwGAAAAKElEQVR42mNhGPqAmZmZiYkJQsIZuLgsvr6+Q9q3/2Dg79+/yAxcXADiODDtLQ68BAAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"item" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAAMElEQVR42u3BMQEAAADCoPVPbQ0PoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAXA2RQAAEB5C4HAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"itemActive" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAAkklEQVR42u3QsQkAIAxFQQsHy/4LqYWohYW9IAj34ENIeTkiRvq7vlb3ynHXB/+Wk64CCBAgQIACCBAgQAEECBCgAAIECFAAAQIEKIAAAQIUQIAAAQogQIAABRAgQIACCBAgQAEECBAgQAEECBCgAAIECFAAAQIEKIAAAQIUQIAAAQogQIAABRAgQIACCBAgQJ1NmcoiAdM9H4IAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"itemImage" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA2CAAAAACpLjUBAAAAeklEQVR42mPiJQswMXCSARiYGFjIAEBtZAEmRnJ0MZJrG321jfpt1G+DzW8jMUj2lzMwlO8n2W87PMrLPXaQ7LfOHR4eOzpJ99vLe/deku63eItDhyziSfab5fGFC49bkuy3jIUMDAszRtPkaDYd9duo34aT3/6TARgA1wJNszqw3XsAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"sliderCapBottom" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAKCAYAAACqnE5VAAAAEklEQVQ4EWNgGAWjYBSMAnQAAAQaAAFh133DAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"sliderCapTop" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAKCAYAAACqnE5VAAAAEklEQVQ4EWNgGAWjYBSMAnQAAAQaAAFh133DAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"sliderRail" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAABCAYAAADAW76WAAAAEElEQVR42mNiIA78J4AJAgCXsgf7Men2/QAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"sliderRailCapBottom" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAECAYAAACQli8lAAAAJklEQVR42mNgIA78J4CpBu7jseQ+NS3yx2ORPwOVgT+az+6TYgkAKMIaoyp3CGoAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"sliderRailCapTop" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAECAYAAACQli8lAAAALElEQVR42mNgIB74A/F9IP4PxfehYlQF/kgWoGOqWnYfj0X3qWnRfwKYIAAAPu0ao3yGmCgAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"sliderThumb" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAABCAYAAADAW76WAAAAMElEQVR42mP+//8/Q0NDA16sqqr6Pycnp6G0tLShqqqqoba2tgEEGhsbG6CgkZAZAEhcK/uBtK2eAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"sliderThumbCapBottom" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAECAYAAACQli8lAAAAUElEQVR42q3NoREAIQwEwHSYJjOo1IBIDfEx+EgEDMfLVwyCbWDphoig1gp3R2sNmYneO+acWGuBXimlxCEKekVV+RAxvWRm/EXxi2KMcZ1sxLJpnEUZrv0AAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"sliderThumbCapTop" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAECAYAAACQli8lAAAAUklEQVR42q3NoREAIQwFUTpMk0wUNSBSAz4mPhIBk8/JUwwiW8C+8pqI0BhDzQzujjmnrrWoZNZao947Pgg/CHtvREQexsx6gTQNqrXiAuHlcQDl9mmceNYnwwAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3c/elements\x3e\x3c/component\x3e\x3ccomponent name\x3d"tooltip"\x3e\x3csettings\x3e\x3csetting name\x3d"fontcase" value\x3d"normal"/\x3e\x3csetting name\x3d"fontcolor" value\x3d"cccccc"/\x3e\x3csetting name\x3d"fontsize" value\x3d"12"/\x3e\x3csetting name\x3d"fontweight" value\x3d"normal"/\x3e\x3csetting name\x3d"activecolor" value\x3d"cccccc"/\x3e\x3csetting name\x3d"overcolor" value\x3d"ffffff"/\x3e\x3c/settings\x3e\x3celements\x3e\x3celement name\x3d"arrow" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAASklEQVR42p3KQQ2AMAAEwXOAi/lWSqUgpZIqASmVAN+GNECYZH8bHDhfOoLyYSxJEuwP054Z+mLqucOGMU0DW1ZQp7HmCRpa/roABHU6b1RN/woAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"background" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAIAAAAmkwkpAAAADklEQVR42mNQQwIMxHEAuXQHISaBGr0AAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"capTop" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAIAAAAmkwkpAAAADklEQVR42mNQQwIMxHEAuXQHISaBGr0AAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"capBottom" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAIAAAAmkwkpAAAADklEQVR42mNQQwIMxHEAuXQHISaBGr0AAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"capLeft" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAIAAAAmkwkpAAAADklEQVR42mNQQwIMxHEAuXQHISaBGr0AAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"capRight" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAIAAAAmkwkpAAAADklEQVR42mNQQwIMxHEAuXQHISaBGr0AAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"capTopLeft" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAIElEQVR42mNgAAI1NTV/IL4PxP9hnP8wzACTQRb4j4wBSrYUAF5mO7QAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"capTopRight" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAH0lEQVR42mNQU1P7D8T3gdifAQSgAjDsjy5wH13gPwBoAhQA/dBvkQAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"capBottomLeft" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAHUlEQVR42mNQU1P7j4wZgMR9dAF/FAEQgAqCVQIAxzkUAKo9yiMAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"capBottomRight" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAHElEQVR42mNQU1P7j4wZ0ATuowv4wwTugzlAAADkhRQAhODqdgAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"menuTopHD" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAYCAYAAABtGnqsAAABKUlEQVR42u2WYQ2DMBSEcYCESuAHAioBCZOAhOFgEiahEpCAhEpAQtcu1+TSwSDbfrDtvuQFWtpHe7lXqCohhBAPDMPQxBhjhBhzjDM9O3MbfWmspfYVc82zeegPlCMUkfpc8f4aa2qOKl5eYI+2iTHlTewU0Mc4bQnPAq6No/UYtN1SniMJmDbuFhzp9wgYr11yIO6ndwWknPd3cM6jCrhValsCJod0VMrduwJS3nDY0qWF9tlB1Gf2OBDlVp5j7kMCpvzjN3xATD6kIYjjcwclPi6dUXhWiu/x7D8EJJFmOMvDSX3hOI/rTOJOuWRp7CWLQnPGLMZPCkjOsuTEtLG6+LDY4lfFruRp4ELLsTQH48xaHv1kCiGEECLStm1QvB5ykBBCiJe5AX69621Fd8YvAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"menuTopCC" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAYCAYAAAAF6fiUAAABjklEQVR42u1X3c2DMAzsBhmBEXhggIzACIzACGUDRmCEjsAIGSEjMAIfkS7oegr0oQ/9IvkkC2HH+fHZDjweBoPBYDAIpmlqD1kP2Q/ZDhnEPsA2kM5Dt5PfWNBnSfpnEpojvUfYwyE92ZJulPXWi/3ONQff5eDhvcG7pzGvFJwcAA2I+DUcRFnrJABkhTwe8yX/lgiIYl9pP0/af9CkqYmAlN0v0TV08HTASAdvSgRAF4S4OwJiDjbZEykLVwAFnQlYMJfT/dZIwFtbKNjHXOIga6aAxOyPoATxvSNgL6zFQd7xXLEu2xzmCpCTjBoJOLNOKqClrH7r9RcEjBqEDwRsmrVcjURAbm09V4O00EXPUBMBDfde7rGwRRm/aEbezH1HwMxBo17eqy9d1iu1r/6ujdZ4D2wo94inQ5BmGdvD/i0BDkTn9d6+Zgq+Qb6CNmpBm94ntX4NeamEttRbMc59OjS3iqvLEjpfaF/+qi3KPrz9SBgMBoPBYDD8a3Rdt5v8TiwDDQaDwWD4Ef4AO4h4lB2vwSEAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"menuOption" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAuElEQVR42u2SQQqGIBCF/wOU1UYUMjAiQdSTeI4O2DnmUL9PatVq3AUNPBhEPt6bmd9XL6u+77uiXHRAV9+1wvais4iEEFXor7e9xdkJiJSSjDG0LAsppWgYhgplOb2iVdi2bRRCqHLOkdb6dpo5wAPu4AyglFJVjJGstTSOI+EPF4iYD+C6rjRNExuIyJgZYgJU5b2neZ7vBWX2UrAAzAwx4QwwuLuX0no2mBlAcMY4G85hf/Wu+gNm+kvWRCvtuQAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"menuOptionOver" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABfklEQVR42r2VTWqDUBSFG6v5KcVJsWTWaUZdRLuNbsNxt5CZ4/xsIJhAkGQJ3UBCcCA6UhBJQDDk9h04giREKQkVPpD37j3cc+/z+dD0iEirSn10s4hGHokG/iReEdIVbUVH0SMdrumlcKMYKzEUTwpT8aKwAN9N7hmMbdWKsYJnCrwpBop3MuCaxZh2KXrNpsHAPpK32+2H4zjfw+HQAXjHGoX7jDUu7FNQpxULCa7rftm2/TMajeLZbJaB8XgcYw17FLWYo58LaizfhCVVxScSl8vlYbPZSBiGEkWR7HY78TzvgD3E0L7JXO3cbpdNH8AaqoFYmqZSFIUcj0fZ7/fi+75MJpMYMYhlTre0XR1GT/GK5qNfsIjKIFY+p9NJ4jiW1Wp1QAximdODRqMgbKKyqmCSJLJYLLJrgrWW0TPYhBDI81yCIJDpdHrVcu1QMAD0DDZRGcTW63XdUJqPDSqdz+cZ+oZhNB6b+x/s+396t18Od72+/vuCvf0X8At7J48fIgP61QAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"menuOptionActive" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABfklEQVR42r2VTWqDUBSFG6v5KcVJsWTWaUZdRLuNbsNxt5CZ4/xsIJhAkGQJ3UBCcCA6UhBJQDDk9h04giREKQkVPpD37j3cc+/z+dD0iEirSn10s4hGHokG/iReEdIVbUVH0SMdrumlcKMYKzEUTwpT8aKwAN9N7hmMbdWKsYJnCrwpBop3MuCaxZh2KXrNpsHAPpK32+2H4zjfw+HQAXjHGoX7jDUu7FNQpxULCa7rftm2/TMajeLZbJaB8XgcYw17FLWYo58LaizfhCVVxScSl8vlYbPZSBiGEkWR7HY78TzvgD3E0L7JXO3cbpdNH8AaqoFYmqZSFIUcj0fZ7/fi+75MJpMYMYhlTre0XR1GT/GK5qNfsIjKIFY+p9NJ4jiW1Wp1QAximdODRqMgbKKyqmCSJLJYLLJrgrWW0TPYhBDI81yCIJDpdHrVcu1QMAD0DDZRGcTW63XdUJqPDSqdz+cZ+oZhNB6b+x/s+396t18Od72+/vuCvf0X8At7J48fIgP61QAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"volumeCapTop" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAAFUlEQVR42mP4//8/AzUxw6iBg89AACt1ZqjY29nMAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"volumeCapBottom" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAAFUlEQVR42mP4//8/AzUxw6iBg89AACt1ZqjY29nMAAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"volumeRail" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAA8CAYAAABmdppWAAAAPklEQVR42u3MoREAIAwDQDpI95+xVwG2AjziY3IR+ViPZOaeu7tXVc2O2y+AQCAQCAQCgUAgEAgEAoHAP8ADVGLAaqN7TdUAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"volumeRailCapBottom" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAAXklEQVR42pXOMQrAIAyFYUGSIeqQuLh4Ju8/eZRXIhQ6WMHhhxDIRwKAsKv3jm+tNagqcs4gIvzdhQM4d2BKCcw8r8FSyqi1Lsgzs/WdgzHGcQ2+qIhMhzyffXe6eQBmfbZnUQ+tqAAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"volumeRailCapTop" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAAX0lEQVR42p2OsQrAIAxEhRAHoxB1cfGb/P/JTzkboVsttMODcOEe5wC4EymlEUKYMUYYdlv21jk+VHXUWtFa25RStlREQETjs7D3Pi9wY9Kc8xZ67+cfIZ6EtpKZceot+LS2cEn/XGYAAAAASUVORK5CYII\x3d"/\x3e\x3celement name\x3d"volumeProgress" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAA8CAYAAABmdppWAAAASUlEQVR42u3MQQ0AUQjE0CFYgARQjGvWwBewh/beZ3enV7t77q7MVFWpuzUzigiZmSTZ6zNAQEBAQEBAQEBAQEBAQEBAQMB/gB8nJqOYNsUfIAAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"volumeProgressCapBottom" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAAVUlEQVR42pXMwQkAIQxE0XSYshQtImXYhh3kKFiD+L3s3iTgwBz/E0BuTylRSsHMaK3Re2fOyd6bb9dOAtAD0J/BnLMGoD6DgNRa1cz8B8cYvtbSqDn4F/TaDHcq1wAAAABJRU5ErkJggg\x3d\x3d"/\x3e\x3celement name\x3d"volumeProgressCapTop" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAAVElEQVR42mP5//8/Ay7Q09PjLyIiMkFCQkJBUlKSQVxc/IGoqGgBMzPzRlx6WHBJdHZ2+jMxMW1AFgMapAAVCwDijSQZCHT5BAbcYALJBgKBAjlyAHZIEpxZZYn/AAAAAElFTkSuQmCC"/\x3e\x3celement name\x3d"volumeThumb" src\x3d"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAAnklEQVR42mP4//8/AxbMBMTsQMwHxMJALALFwlAxdqgaDL24DOMGYoVly5ZFVldXz6ysrFwOwiA2SAwkB1XDRMhARqjtigcPHsw/d+7c9Z9A8B8KQGyQGEgOpAaqlpGQgSAv2Vy7du38fxwAKmcDVYvXQCZoOHkjuwwdQOW8oWqZCBkICvyA/4RBAFQt/Q2kqpepHilUTzZUT9gUZz0ACDf945eBHBQAAAAASUVORK5CYII\x3d"/\x3e\x3c/elements\x3e\x3c/component\x3e\x3c/components\x3e\x3c/skin\x3e';this.xml=
+f.utils.parseXML(this.text);return this}})(jwplayer);
+(function(f){var h=jwplayer.utils,e=jwplayer.events,d=e.state,a=h.css,b=document,c=".jwpreview",k=!0,g=!1;f.display=function(r,l){function j(a){if(da)da(a);else{switch(B.jwGetState()){case d.PLAYING:case d.BUFFERING:B.jwPause();break;default:B.jwPlay()}X.sendEvent(e.JWPLAYER_DISPLAY_CLICK)}}function q(a,b){L.showicons&&(a||b?(G.setRotation("buffer"==a?parseInt(L.bufferrotation):0,parseInt(L.bufferinterval)),G.setIcon(a),G.setText(b)):G.hide())}function m(b){D!=b?(D&&n(c,g),(D=b)?(b=new Image,b.addEventListener("load",
+v,g),b.src=D):(a("#"+t.id+" "+c,{"background-image":void 0}),n(c,g),x=z=0)):D&&n(c,k);s(B.jwGetState())}function p(a){clearTimeout(Z);Z=setTimeout(function(){s(a.newstate)},100)}function s(a){a=N?N:B?B.jwGetState():d.IDLE;if(a!=T)switch(T=a,G&&G.setRotation(0),a){case d.IDLE:!C&&!M&&(D&&!I&&n(c,k),a=!0,B._model&&!1===B._model.config.displaytitle&&(a=!1),q("play",w&&a?w.title:""));break;case d.BUFFERING:C=g;E.error&&E.error.setText();M=g;q("buffer");break;case d.PLAYING:q();break;case d.PAUSED:q("play")}}
+function v(){x=this.width;z=this.height;s(B.jwGetState());A();D&&a("#"+t.id+" "+c,{"background-image":"url("+D+")"})}function u(a){C=k;q("error",a.message)}function A(){0<t.clientWidth*t.clientHeight&&h.stretch(B.jwGetStretching(),y,t.clientWidth,t.clientHeight,x,z)}function n(b,c){h.exists(F[b])||(F[b]=!1);F[b]!=c&&(F[b]=c,a("#"+t.id+" "+b,{opacity:c?1:0,visibility:c?"visible":"hidden"}))}var B=r,t,y,w,D,x,z,I=g,E={},C=g,M=g,F={},G,N,T,L=h.extend({showicons:k,bufferrotation:45,bufferinterval:100,
+fontcolor:"#ccc",overcolor:"#fff",fontsize:15,fontweight:""},r.skin.getComponentSettings("display"),l),X=new e.eventdispatcher,da;h.extend(this,X);this.clickHandler=j;var Z;this.forceState=function(a){N=a;s(a);this.show()};this.releaseState=function(a){N=null;s(a);this.show()};this.hidePreview=function(a){I=a;n(c,!a)};this.element=function(){return t};this.redraw=A;this.show=function(){G&&(N?N:B?B.jwGetState():d.IDLE)!=d.PLAYING&&G.show()};this.hide=function(){G&&G.hide()};this.setAlternateClickHandler=
+function(a){da=a};this.revertAlternateClickHandler=function(){da=void 0};t=b.createElement("div");t.id=B.id+"_display";t.className="jwdisplay";y=b.createElement("div");y.className="jwpreview jw"+B.jwGetStretching();t.appendChild(y);B.jwAddEventListener(e.JWPLAYER_PLAYER_STATE,p);B.jwAddEventListener(e.JWPLAYER_PLAYLIST_ITEM,function(){C=g;E.error&&E.error.setText();var a=(w=B.jwGetPlaylist()[B.jwGetPlaylistIndex()])?w.image:"";T=void 0;m(a)});B.jwAddEventListener(e.JWPLAYER_PLAYLIST_COMPLETE,function(){M=
+k;q("replay");var a=B.jwGetPlaylist()[0];m(a.image)});B.jwAddEventListener(e.JWPLAYER_MEDIA_ERROR,u);B.jwAddEventListener(e.JWPLAYER_ERROR,u);t.addEventListener("click",j,g);var oa={font:L.fontweight+" "+L.fontsize+"px/"+(parseInt(L.fontsize)+3)+"px Arial,Helvetica,sans-serif",color:L.fontcolor};G=new f.displayicon(t.id+"_button",B,oa,{color:L.overcolor});t.appendChild(G.element());p({newstate:d.IDLE})};a(".jwdisplay",{position:"absolute",cursor:"pointer",width:"100%",height:"100%",overflow:"hidden"});
+a(".jwdisplay .jwpreview",{position:"absolute",width:"100%",height:"100%",background:"no-repeat center",overflow:"hidden",opacity:0});a(".jwdisplay, .jwdisplay *",{"-webkit-transition":"opacity .25s, background-image .25s, color .25s","-moz-transition":"opacity .25s, background-image .25s, color .25s","-o-transition":"opacity .25s, background-image .25s, color .25s"})})(jwplayer.html5);
+(function(f){var h=jwplayer.utils,e=h.css,d=void 0,a=document,b="none",c="100%";f.displayicon=function(f,g,r,l){function j(a,b){return"#"+B+(b?":hover":"")+" "+(a?a:"")}function q(b,c,d,e){var g=a.createElement("div");g.className=b;c&&c.appendChild(g);m(b,"."+b,d,e);return g}function m(a,b,c,d){var g=p(a);"replayIcon"==a&&!g.src&&(g=p("playIcon"));c=h.extend({},c);0<a.indexOf("Icon")&&(E=g.width);g.src&&(c["background-image"]="url("+g.src+")",c.width=g.width);e(j(b),c);d=h.extend({},d);g.overSrc&&
+(d["background-image"]="url("+g.overSrc+")");I=g;e("#"+A.id+" .jwdisplay:hover "+(b?b:j()),d)}function p(a){var b=n.getSkinElement("display",a);a=n.getSkinElement("display",a+"Over");return b?(b.overSrc=a&&a.src?a.src:"",b):{src:"",overSrc:"",width:0,height:0}}function s(){var a=D||0==E,g="px "+c;e(j(".jwtext"),{display:x.innerHTML&&a?d:b});M=10;setTimeout(function(){v(g)},0);a&&(C=setInterval(function(){v(g)},100))}function v(a){if(0>=M)clearInterval(C);else{M--;var b=Math.max(I.width,h.bounds(t).width-
+w.width-y.width);(h.isFF()||h.isIE())&&b++;h.isChrome()&&1==t.parentNode.clientWidth%2&&b++;e(j(),{"background-size":[y.width+a,b+a,w.width+a].join()},!0)}}function u(){N=(N+G)%360;h.rotate(z,N)}var A=g,n=A.skin,B=f,t,y,w,D,x,z,I,E=0,C,M;this.element=function(){return t};this.setText=function(b){var c=x.style;x.innerHTML=b?b.replace(":",":\x3cbr\x3e"):"";c.height="0";c.display="block";if(b)for(;2<Math.floor(x.scrollHeight/a.defaultView.getComputedStyle(x,null).lineHeight.replace("px",""));)x.innerHTML=
+x.innerHTML.replace(/(.*) .*$/,"$1...");c.height="";c.display="";s()};this.setIcon=function(a){var b=q("jwicon");b.id=t.id+"_"+a;m(a+"Icon","#"+b.id);t.contains(z)?t.replaceChild(b,z):t.appendChild(b);z=b};var F,G=0,N;this.setRotation=function(a,b){clearInterval(F);N=0;G=a;0==a?u():F=setInterval(u,b)};g=this.hide=function(){t.style.opacity=0};this.show=function(){t.style.opacity=1};t=q("jwdisplayIcon");t.id=B;f=p("background");y=p("capLeft");w=p("capRight");D=0<y.width*w.width;var T={"background-image":"url("+
+y.src+"), url("+f.src+"), url("+w.src+")","background-position":"left,center,right","background-repeat":"no-repeat",padding:"0 "+w.width+"px 0 "+y.width+"px",height:f.height,"margin-top":f.height/-2};e(j(),T);f.overSrc&&(T["background-image"]="url("+y.overSrc+"), url("+f.overSrc+"), url("+w.overSrc+")");e("#"+A.id+" .jwdisplay:hover "+j(),T);x=q("jwtext",t,r,l);z=q("jwicon",t);g();s()};e(".jwdisplayIcon",{display:"table",cursor:"pointer",position:"relative","margin-left":"auto","margin-right":"auto",
+top:"50%"},!0);e(".jwdisplayIcon div",{position:"relative",display:"table-cell","vertical-align":"middle","background-repeat":"no-repeat","background-position":"center"});e(".jwdisplayIcon div",{"vertical-align":"middle"},!0);e(".jwdisplayIcon .jwtext",{color:"#fff",padding:"0 1px","max-width":"300px","overflow-y":"hidden","text-align":"center","-webkit-user-select":b,"-moz-user-select":b,"-ms-user-select":b,"user-select":b})})(jwplayer.html5);
+(function(f){var h=jwplayer.utils,e=h.css,d=h.bounds,a=".jwdockbuttons",b=document,c="none",k="block";f.dock=function(g,r){function l(a,b){var c=m(a);e(j("."+a),{width:c.width,background:c.src});return q("div",a,b)}function j(a){return"#"+v+" "+(a?a:"")}function q(a,c,d){a=b.createElement(a);c&&(a.className=c);d&&d.appendChild(a);return a}function m(a){return(a=u.getSkinElement("dock",a))?a:{width:0,height:0,src:""}}function p(){e(a+" .capLeft, "+a+" .capRight",{display:A?k:c})}var s=h.extend({},
+{iconalpha:0.75,iconalphaactive:0.5,iconalphaover:1,margin:8},r),v=g.id+"_dock",u=g.skin,A=0,n={},B={},t,y,w=this;w.redraw=function(){d(t)};w.element=function(){return t};w.offset=function(a){e(j(),{"margin-left":a})};w.hide=function(){w.visible&&(w.visible=!1,t.style.opacity=0,setTimeout(function(){t.style.display=c},150))};w.show=function(){!w.visible&&A&&(w.visible=!0,t.style.display=k,setTimeout(function(){t.style.opacity=1},0))};w.addButton=function(a,b,c,g){if(!n[g]){var k=q("div","divider",
+y),j=q("button",null,y),l=q("div",null,j);l.id=v+"_"+g;l.innerHTML="\x26nbsp;";e("#"+l.id,{"background-image":a});"string"==typeof c&&(c=new Function(c));j.addEventListener("click",function(a){c(a);a.preventDefault()});n[g]={element:j,label:b,divider:k,icon:l};if(b){var m=new f.overlay(l.id+"_tooltip",u,!0);a=q("div");a.id=l.id+"_label";a.innerHTML=b;e("#"+a.id,{padding:3});m.setContents(a);var s;j.addEventListener("mouseover",function(){clearTimeout(s);var a=B[g],b,c;b=d(n[g].icon);a.offsetX(0);
+c=d(t);e("#"+a.element().id,{left:b.left-c.left+b.width/2});b=d(a.element());c.left>b.left&&a.offsetX(c.left-b.left+8);m.show();h.foreach(B,function(a,b){a!=g&&b.hide()})},!1);j.addEventListener("mouseout",function(){s=setTimeout(m.hide,100)},!1);t.appendChild(m.element());B[g]=m}A++;p()}};w.removeButton=function(a){n[a]&&(y.removeChild(n[a].element),y.removeChild(n[a].divider),delete n[a],A--,p())};w.numButtons=function(){return A};w.visible=!1;t=q("div","jwdock");y=q("div","jwdockbuttons");t.appendChild(y);
+t.id=v;var D=m("button"),x=m("buttonOver"),z=m("buttonActive");D&&(e(j(),{height:D.height,padding:s.margin}),e(a,{height:D.height}),e(j("button"),{width:D.width,cursor:"pointer",border:c,background:D.src}),x.src&&e(j("button:hover"),{background:x.src}),z.src&&e(j("button:active"),{background:z.src}),e(j("button\x3ediv"),{opacity:s.iconalpha}),e(j("button:hover\x3ediv"),{opacity:s.iconalphaover}),e(j("button:active\x3ediv"),{opacity:s.iconalphaactive}),e(j(".jwoverlay"),{top:s.margin+D.height}),l("capLeft",
+y),l("capRight",y),l("divider"));setTimeout(function(){d(t)})};e(".jwdock",{opacity:0,display:c});e(".jwdock \x3e *",{height:"100%","float":"left"});e(".jwdock \x3e .jwoverlay",{height:"auto","float":c,"z-index":99});e(a+" button",{position:"relative"});e(a+" \x3e *",{height:"100%","float":"left"});e(a+" .divider",{display:c});e(a+" button ~ .divider",{display:k});e(a+" .capLeft, "+a+" .capRight",{display:c});e(a+" .capRight",{"float":"right"});e(a+" button \x3e div",{left:0,right:0,top:0,bottom:0,
+margin:5,position:"absolute","background-position":"center","background-repeat":"no-repeat"});h.transitionStyle(".jwdock","background .15s, opacity .15s");h.transitionStyle(".jwdock .jwoverlay","opacity .15s");h.transitionStyle(a+" button div","opacity .15s")})(jwplayer.html5);
+(function(f){var h=jwplayer,e=h.utils,d=h.events,a=d.state,b=h.playlist;f.instream=function(c,h,g,r){function l(a){a.type==d.JWPLAYER_MEDIA_ERROR&&(a=e.extend({},a),a.type=d.JWPLAYER_ERROR);s(a.type,a);N=!0;G.jwInstreamDestroy(!1)}function j(a){E&&s(a.type,a)}function q(){E&&x.play()}function m(){E&&setTimeout(function(){G.jwInstreamDestroy(!0)},10)}function p(a){a.width&&a.height&&B.resizeMedia()}function s(a,b,c){(E||c)&&C.sendEvent(a,b)}function v(){z&&z.redraw();I&&I.redraw()}var u={controlbarseekable:"never",
+controlbarpausable:!0,controlbarstoppable:!0,playlistclickable:!0},A,n,B=g,t,y,w,D,x,z,I,E=!1,C,M,F,G=this,N=!1,T=!0;this.load=function(g,C){e.isAndroid(2.3)?l({type:d.JWPLAYER_ERROR,message:"Error loading instream: Cannot play instream on Android 2.3"}):(E=!0,n=e.extend(u,C),A=new b.item(g),M=document.createElement("div"),M.id=G.id+"_instream_container",t=r.detachMedia(),x=new f.video(t),x.addGlobalListener(j),x.addEventListener(d.JWPLAYER_MEDIA_META,p),x.addEventListener(d.JWPLAYER_MEDIA_COMPLETE,
+m),x.addEventListener(d.JWPLAYER_MEDIA_BUFFER_FULL,q),x.addEventListener(d.JWPLAYER_MEDIA_ERROR,l),x.attachMedia(),x.mute(h.mute),x.volume(h.volume),F=new f.model({},x),F.setVolume(h.volume),F.setMute(h.mute),F.addEventListener(d.JWPLAYER_ERROR,l),D=h.playlist[h.item],w=h.getVideo().checkComplete()?a.IDLE:c.jwGetState(),r.checkBeforePlay()&&(w=a.PLAYING,T=!1),y=t.currentTime,F.setPlaylist([g]),N||((w==a.BUFFERING||w==a.PLAYING)&&t.pause(),I=new f.display(G),I.setAlternateClickHandler(function(b){F.state==
+a.PAUSED?G.jwInstreamPlay():(G.jwInstreamPause(),s(d.JWPLAYER_INSTREAM_CLICK,b))}),M.appendChild(I.element()),e.isMobile()||(z=new f.controlbar(G),M.appendChild(z.element()),z.show()),B.setupInstream(M,z,I,t),v(),x.load(F.playlist[0])))};this.jwInstreamDestroy=function(b){if(E){E=!1;w!=a.IDLE?x.load(D,!1):x.stop();C.resetEventListeners();N||I.revertAlternateClickHandler();x.detachMedia();B.destroyInstream();if(z)try{z.element().parentNode.removeChild(z.getDisplayElement())}catch(c){}s(d.JWPLAYER_INSTREAM_DESTROYED,
+{reason:b?"complete":"destroyed"},!0);r.attachMedia();if(w==a.BUFFERING||w==a.PLAYING)t.play(),h.playlist[h.item]==D&&T&&h.getVideo().seek(y)}};this.jwInstreamAddEventListener=function(a,b){C.addEventListener(a,b)};this.jwInstreamRemoveEventListener=function(a,b){C.removeEventListener(a,b)};this.jwInstreamPlay=function(){E&&(x.play(!0),h.state=jwplayer.events.state.PLAYING,I.show())};this.jwInstreamPause=function(){E&&(x.pause(!0),h.state=jwplayer.events.state.PAUSED,I.show())};this.jwInstreamSeek=
+function(a){E&&x.seek(a)};this.jwPlay=function(){"true"==n.controlbarpausable.toString().toLowerCase()&&this.jwInstreamPlay()};this.jwPause=function(){"true"==n.controlbarpausable.toString().toLowerCase()&&this.jwInstreamPause()};this.jwStop=function(){"true"==n.controlbarstoppable.toString().toLowerCase()&&(this.jwInstreamDestroy(),c.jwStop())};this.jwSeek=function(a){switch(n.controlbarseekable.toLowerCase()){case "always":this.jwInstreamSeek(a);break;case "backwards":F.position>a&&this.jwInstreamSeek(a)}};
+this.jwSeekDrag=function(a){F.seekDrag(a)};this.jwGetPosition=function(){};this.jwGetDuration=function(){};this.jwGetWidth=c.jwGetWidth;this.jwGetHeight=c.jwGetHeight;this.jwGetFullscreen=c.jwGetFullscreen;this.jwSetFullscreen=c.jwSetFullscreen;this.jwGetVolume=function(){return h.volume};this.jwSetVolume=function(a){F.setVolume(a);c.jwSetVolume(a)};this.jwGetMute=function(){return h.mute};this.jwSetMute=function(a){F.setMute(a);c.jwSetMute(a)};this.jwGetState=function(){return h.state};this.jwGetPlaylist=
+function(){return[A]};this.jwGetPlaylistIndex=function(){return 0};this.jwGetStretching=function(){return h.config.stretching};this.jwAddEventListener=function(a,b){C.addEventListener(a,b)};this.jwRemoveEventListener=function(a,b){C.removeEventListener(a,b)};this.jwSetCurrentQuality=function(){};this.jwGetQualityLevels=function(){return[]};this.skin=c.skin;this.id=c.id+"_instream";C=new d.eventdispatcher;c.jwAddEventListener(d.JWPLAYER_RESIZE,v);c.jwAddEventListener(d.JWPLAYER_FULLSCREEN,function(a){j(a);
+v()});return this}})(jwplayer.html5);
+(function(f){var h=f.utils,e=h.css,d=f.events.state,a=f.html5.logo=function(b,c){function k(a){h.exists(a)&&a.stopPropagation();if(!m||!l.link)g.jwGetState()==d.IDLE||g.jwGetState()==d.PAUSED?g.jwPlay():g.jwPause();m&&l.link&&(g.jwPause(),g.jwSetFullscreen(!1),window.open(l.link,l.linktarget))}var g=b,r=g.id+"_logo",l,j,q=a.defaults,m=!1;this.resize=function(){};this.element=function(){return j};this.offset=function(a){e("#"+r+" ",{"margin-bottom":a})};this.position=function(){return l.position};
+this.margin=function(){return parseInt(l.margin)};this.hide=function(a){if(l.hide||a)m=!1,j.style.visibility="hidden",j.style.opacity=0};this.show=function(){m=!0;j.style.visibility="visible";j.style.opacity=1};var p="o";g.edition&&(p=g.edition(),p="pro"==p?"p":"premium"==p?"r":"ads"==p?"a":"free"==p?"f":"o");if("o"==p||"f"==p)q.link="http://www.longtailvideo.com/jwpabout/?a\x3dl\x26v\x3d"+f.version+"\x26m\x3dh\x26e\x3d"+p;l=h.extend({},q,c);l.hide="true"==l.hide.toString();j=document.createElement("img");
+j.className="jwlogo";j.id=r;if(l.file){var q=/(\w+)-(\w+)/.exec(l.position),p={},s=l.margin;3==q.length?(p[q[1]]=s,p[q[2]]=s):p.top=p.right=s;e("#"+r+" ",p);j.src=(l.prefix?l.prefix:"")+l.file;j.onclick=k}else j.style.display="none";return this};a.defaults={prefix:h.repo(),file:"logo.png",linktarget:"_top",margin:8,hide:!1,position:"top-right"};e(".jwlogo",{cursor:"pointer",position:"absolute","z-index":100,opacity:0});h.transitionStyle(".jwlogo","visibility .15s, opacity .15s")})(jwplayer);
+(function(f){var h=f.html5,e=f.utils,d=e.css,a=void 0;h.menu=function(b,c,f,g){function r(a,b){return function(){v(a);q&&q(b)}}function l(a,b){var c=document.createElement("div");a&&(c.className=a);b&&b.appendChild(c);return c}function j(b){return(b=f.getSkinElement("tooltip",b))?b:{width:0,height:0,src:a}}var q=g,m=new h.overlay(c+"_overlay",f);g=e.extend({fontcase:a,fontcolor:"#cccccc",fontsize:11,fontweight:a,activecolor:"#ffffff",overcolor:"#ffffff"},f.getComponentSettings("tooltip"));var p,s=
+[];this.element=function(){return m.element()};this.addOption=function(a,b){var d=l("jwoption",p);d.id=c+"_option_"+b;d.innerHTML=a;d.addEventListener("click",r(s.length,b));s.push(d)};this.clearOptions=function(){for(;0<s.length;)p.removeChild(s.pop())};var v=this.setActive=function(a){for(var b=0;b<s.length;b++){var c=s[b];c.className=c.className.replace(" active","");b==a&&(c.className+=" active")}};this.show=m.show;this.hide=m.hide;this.offsetX=m.offsetX;p=l("jwmenu");p.id=c;var u=j("menuTop"+
+b);b=j("menuOption");var A=j("menuOptionOver"),n=j("menuOptionActive");u&&u.image&&p.appendChild(u.image);b&&(u="#"+c+" .jwoption",d(u,{"background-image":b.src,height:b.height,color:g.fontcolor,"padding-left":b.width,font:g.fontweight+" "+g.fontsize+"px Arial,Helvetica,sans-serif","line-height":b.height,"text-transform":"upper"==g.fontcase?"uppercase":a}),d(u+":hover",{"background-image":A.src?A.src:a,color:g.overcolor}),d(u+".active",{"background-image":n.src?n.src:a,color:g.activecolor}));m.setContents(p)};
+d("."+"jwmenu jwoption".replace(/ /g," ."),{"background-repeat":"no-repeat",cursor:"pointer",position:"relative"})})(jwplayer);
+(function(f){var h=jwplayer.utils,e=jwplayer.events;f.model=function(d,a){function b(a){var b=j[a.type]?j[a.type].split(","):[],d,g;if(0<b.length){for(d=0;d<b.length;d++){var e=b[d].split("-\x3e"),f=e[0],e=e[1]?e[1]:f;c[e]!=a[f]&&(c[e]=a[f],g=!0)}g&&c.sendEvent(a.type,a)}else c.sendEvent(a.type,a)}var c=this,k,g;g=h.getCookies();var r={controlbar:{},display:{}},l={autostart:!1,controls:!0,debug:void 0,fullscreen:!1,height:320,mobilecontrols:!1,mute:!1,playlist:[],playlistposition:"none",playlistsize:180,
+repeat:!1,skin:void 0,stretching:h.stretching.UNIFORM,width:480,volume:90},j={};j[e.JWPLAYER_MEDIA_MUTE]="mute";j[e.JWPLAYER_MEDIA_VOLUME]="volume";j[e.JWPLAYER_PLAYER_STATE]="newstate-\x3estate";j[e.JWPLAYER_MEDIA_BUFFER]="bufferPercent-\x3ebuffer";j[e.JWPLAYER_MEDIA_TIME]="position,duration";c.getVideo=function(){return k};c.seekDrag=function(a){k.seekDrag(a)};c.setFullscreen=function(a){a!=c.fullscreen&&(c.fullscreen=a,c.sendEvent(e.JWPLAYER_FULLSCREEN,{fullscreen:a}))};c.setPlaylist=function(a){for(var b=
+c,d=[],g=0;g<a.length;g++){var f=h.extend({},a[g]);f.sources=h.filterSources(f.sources);if(0<f.sources.length){for(var j=0;j<f.sources.length;j++){var l=f.sources[j];l.label||(l.label=j.toString())}d.push(f)}}b.playlist=d;0==c.playlist.length?c.sendEvent(e.JWPLAYER_ERROR,{message:"Error loading playlist: No playable sources found"}):(c.sendEvent(e.JWPLAYER_PLAYLIST_LOADED,{playlist:jwplayer(c.id).getPlaylist()}),c.item=-1,c.setItem(0))};c.setItem=function(a){var b=!1;a==c.playlist.length||-1>a?(a=
+0,b=!0):a=-1==a||a>c.playlist.length?c.playlist.length-1:a;if(b||a!=c.item)c.item=a,c.sendEvent(e.JWPLAYER_PLAYLIST_ITEM,{index:c.item})};c.setVolume=function(a){c.mute&&0<a&&c.setMute(!1);a=Math.round(a);c.mute||h.saveCookie("volume",a);b({type:e.JWPLAYER_MEDIA_VOLUME,volume:a});k.volume(a)};c.setMute=function(a){h.exists(a)||(a=!c.mute);h.saveCookie("mute",a);b({type:e.JWPLAYER_MEDIA_MUTE,mute:a});k.mute(a)};c.componentConfig=function(a){return r[a]};h.extend(c,new e.eventdispatcher);var q=c,m=
+h.extend({},l,g,d);h.foreach(m,function(a,b){m[a]=h.serialize(b)});q.config=m;h.extend(c,{id:d.id,state:e.state.IDLE,duration:-1,position:0,buffer:0},c.config);c.playlist=[];c.setItem(0);a?(k=a,g=k.getTag()):(g=document.createElement("video"),k=new f.video(g));k.volume(c.volume);k.mute(c.mute);k.addGlobalListener(b)}})(jwplayer.html5);
+(function(f){var h=f.utils,e=h.css,d=h.transitionStyle,a="top",b="bottom",c="right",k="left",g=void 0,r=document,l={fontcase:g,fontcolor:"#ffffff",fontsize:12,fontweight:g,activecolor:"#ffffff",overcolor:"#ffffff"};f.html5.overlay=function(d,f,m){function p(a){return"#"+B+(a?" ."+a:"")}function s(a,b){var c=r.createElement("div");a&&(c.className=a);b&&b.appendChild(c);return c}function v(a,b){var c;c=(c=n.getSkinElement("tooltip",a))?c:{width:0,height:0,src:"",image:g,ready:!1};var d=s(b,t);e(p(b.replace(" ",
+".")),{"background-image":c.src});return[d,c]}function u(d,f){f||(f="");var h=v("cap"+d+f,"jwborder jw"+d+(f?f:"")),l=h[0],h=h[1],j={"background-image":h.src,width:d==k||f==k||d==c||f==c?h.width:g,height:d==a||f==a||d==b||f==b?h.height:g};j[d]=d==b&&!z||d==a&&z?x:0;f&&(j[f]=0);e(p(l.className.replace(/ /g,".")),j);l={};j={};h={left:h.width,right:h.width,top:(z?x:0)+h.height,bottom:(z?0:x)+h.height};f&&(l[f]=h[f],l[d]=0,j[d]=h[d],j[f]=0,e(p("jw"+d),l),e(p("jw"+f),j),I[d]=h[d],I[f]=h[f])}function A(){0!=
+t.clientWidth&&(e(p(),{"margin-left":Math.round(w-t.clientWidth/2)}),e(p("jwarrow"),{"margin-left":Math.round(D.width/-2-w)}))}var n=f,B=d,t,y,w=0,D,x,z=m;d=h.extend({},l,n.getComponentSettings("tooltip"));var I={},E=this;E.element=function(){return t};var C;E.setContents=function(a){h.empty(y);y.appendChild(a);clearTimeout(C);C=setTimeout(A,0)};E.offsetX=function(a){w=a;clearTimeout(C);A()};E.borderWidth=function(){return I.left};E.show=function(){E.showing=!0;t.style.opacity=1;t.style.visibility=
+"visible"};E.hide=function(){E.showing=!1;t.style.opacity=0;t.style.visibility="hidden"};t=s(".jwoverlay".replace(".",""));t.id=B;D=v("arrow","jwarrow")[1];x=D.height;e(p("jwarrow"),{position:"absolute",bottom:z?g:0,top:z?0:g,width:D.width,height:x,left:"50%"});u(a,k);u(b,k);u(a,c);u(b,c);u(k);u(c);u(a);u(b);v("background","jwback");e(p("jwback"),{left:I.left,right:I.right,top:I.top,bottom:I.bottom});y=s("jwcontents",t);e(p("jwcontents")+" *",{color:d.fontcolor,font:d.fontweight+" "+d.fontsize+"px Arial,Helvetica,sans-serif",
+"text-transform":"upper"==d.fontcase?"uppercase":g});z&&h.transform(p("jwarrow"),"rotate(180deg)");e(p(),{padding:I.top+1+"px "+I.right+"px "+(I.bottom+1)+"px "+I.left+"px"});E.showing=!1};e(".jwoverlay",{position:"absolute",visibility:"hidden",opacity:0});e(".jwoverlay .jwcontents",{position:"relative","z-index":1});e(".jwoverlay .jwborder",{position:"absolute","background-size":"100% 100%"},!0);e(".jwoverlay .jwback",{position:"absolute","background-size":"100% 100%"});d(".jwoverlay","opacity .15s, visibility .15s, left .01s linear")})(jwplayer);
+(function(f){var h=jwplayer.utils;f.player=function(e){function d(a){var b={description:a.description,file:a.file,image:a.image,mediaid:a.mediaid,title:a.title};h.foreach(a,function(a,c){b[a]=c});b.sources=[];b.tracks=[];0<a.sources.length&&h.foreach(a.sources,function(a,c){b.sources.push({file:c.file,type:c.type?c.type:void 0,label:c.label,"default":c["default"]?!0:!1})});0<a.tracks.length&&h.foreach(a.tracks,function(a,c){b.tracks.push({file:c.file,kind:c.kind?c.kind:void 0,label:c.label,"default":c["default"]?
+!0:!1})});!a.file&&0<a.sources.length&&(b.file=a.sources[0].file);return b}function a(a){return function(){return c[a]}}var b=this,c,k,g,r;c=new f.model(e);b.id=c.id;k=new f.view(b,c);g=new f.controller(c,k);b._model=c;jwplayer.utils.css.block();b.jwPlay=g.play;b.jwPause=g.pause;b.jwStop=g.stop;b.jwSeek=g.seek;b.jwSetVolume=g.setVolume;b.jwSetMute=g.setMute;b.jwLoad=g.load;b.jwPlaylistNext=g.next;b.jwPlaylistPrev=g.prev;b.jwPlaylistItem=g.item;b.jwSetFullscreen=g.setFullscreen;b.jwResize=k.resize;
+b.jwSeekDrag=c.seekDrag;b.jwSetStretching=g.setStretching;b.jwGetQualityLevels=g.getQualityLevels;b.jwGetCurrentQuality=g.getCurrentQuality;b.jwSetCurrentQuality=g.setCurrentQuality;b.jwGetCaptionsList=g.getCaptionsList;b.jwGetCurrentCaptions=g.getCurrentCaptions;b.jwSetCurrentCaptions=g.setCurrentCaptions;b.jwSetControls=k.setControls;b.jwGetSafeRegion=k.getSafeRegion;b.jwForceState=k.forceState;b.jwReleaseState=k.releaseState;b.jwGetPlaylistIndex=a("item");b.jwGetPosition=a("position");b.jwGetDuration=
+a("duration");b.jwGetBuffer=a("buffer");b.jwGetWidth=a("width");b.jwGetHeight=a("height");b.jwGetFullscreen=a("fullscreen");b.jwGetVolume=a("volume");b.jwGetMute=a("mute");b.jwGetState=a("state");b.jwGetStretching=a("stretching");b.jwGetPlaylist=function(){for(var a=c.playlist,b=[],g=0;g<a.length;g++)b.push(d(a[g]));return b};b.jwGetControls=a("controls");b.jwDetachMedia=g.detachMedia;b.jwAttachMedia=g.attachMedia;b.jwPlayAd=function(a){var c=jwplayer(b.id).plugins;c.vast&&c.vast.jwPlayAd(a)};b.jwLoadInstream=
+function(a,d){r||(r=new f.instream(b,c,k,g));r.load(a,d)};b.jwInstreamPlay=function(){r&&r.jwInstreamPlay()};b.jwInstreamPause=function(){r&&r.jwInstreamPause()};b.jwInstreamDestroy=function(){r&&r.jwInstreamDestroy();r=void 0};b.jwInstreamAddEventListener=function(a,b){r&&r.jwInstreamAddEventListener(a,b)};b.jwInstreamRemoveEventListener=function(a,b){r&&r.jwInstreamRemoveEventListener(a,b)};b.jwPlayerDestroy=function(){k&&k.destroy()};b.jwIsBeforePlay=function(){return g.checkBeforePlay()};b.jwIsBeforeComplete=
+function(){return c.getVideo().checkComplete()};b.jwAddEventListener=g.addEventListener;b.jwRemoveEventListener=g.removeEventListener;b.jwDockAddButton=k.addButton;b.jwDockRemoveButton=k.removeButton;e=new f.setup(c,k,g);e.addEventListener(jwplayer.events.JWPLAYER_READY,function(a){g.playerReady(a);h.css.unblock()});e.addEventListener(jwplayer.events.JWPLAYER_ERROR,function(a){h.log("There was a problem setting up the player: ",a);h.css.unblock()});e.start()}})(jwplayer.html5);
+(function(f){var h={size:180,backgroundcolor:"#333333",fontcolor:"#999999",overcolor:"#CCCCCC",activecolor:"#CCCCCC",titlecolor:"#CCCCCC",titleovercolor:"#FFFFFF",titleactivecolor:"#FFFFFF",fontweight:"normal",titleweight:"normal",fontsize:11,titlesize:13},e=jwplayer.events,d=jwplayer.utils,a=d.css,b=document;f.playlistcomponent=function(c,k){function g(a){return"#"+p.id+(a?" ."+a:"")}function r(a,c){var d=b.createElement(a);c&&(d.className=c);return d}function l(a){return function(){n=a;j.jwPlaylistItem(a);
+j.jwPlay(!0)}}var j=c,q=j.skin,m=d.extend({},h,j.skin.getComponentSettings("playlist"),k),p,s,v,u,A=-1,n,B,t=-1,y=60,w={background:void 0,divider:void 0,item:void 0,itemOver:void 0,itemImage:void 0,itemActive:void 0},D=this;D.element=function(){return p};D.redraw=function(){B&&B.redraw()};D.show=function(){d.show(p)};D.hide=function(){d.hide(p)};p=r("div","jwplaylist");p.id=j.id+"_jwplayer_playlistcomponent";s=r("div","jwlistcontainer");p.appendChild(s);d.foreach(w,function(a){w[a]=q.getSkinElement("playlist",
+a)});w.item&&(y=w.item.height);var x=0,z=0,I=0;d.clearCss(g());a(g(),{"background-color":m.backgroundcolor});a(g("jwlist"),{"background-image":w.background?" url("+w.background.src+")":""});a(g("jwlist *"),{color:m.fontcolor,font:m.fontweight+" "+m.fontsize+"px Arial, Helvetica, sans-serif"});w.itemImage?(x=(y-w.itemImage.height)/2+"px ",z=w.itemImage.width,I=w.itemImage.height):(z=4*y/3,I=y);w.divider&&a(g("jwplaylistdivider"),{"background-image":"url("+w.divider.src+")","background-size":"100% "+
+w.divider.height+"px",width:"100%",height:w.divider.height});a(g("jwplaylistimg"),{height:I,width:z,margin:x?x+x+x+x:"0 5px 0 0"});a(g("jwlist li"),{"background-image":w.item?"url("+w.item.src+")":"",height:y,"background-size":"100% "+y+"px",cursor:"pointer"});z={overflow:"hidden"};""!==m.activecolor&&(z.color=m.activecolor);w.itemActive&&(z["background-image"]="url("+w.itemActive.src+")");a(g("jwlist li.active"),z);a(g("jwlist li.active .jwtitle"),{color:m.titleactivecolor});z={overflow:"hidden"};
+""!==m.overcolor&&(z.color=m.overcolor);w.itemOver&&(z["background-image"]="url("+w.itemOver.src+")");a(g("jwlist li:hover"),z);a(g("jwlist li:hover .jwtitle"),{color:m.titleovercolor});a(g("jwtextwrapper"),{height:y-5,position:"relative"});a(g("jwtitle"),{height:15,overflow:"hidden",display:"inline-block",width:"100%",color:m.titlecolor,"margin-top":x?x:7,"line-height":13,"font-size":m.titlesize,"font-weight":m.titleweight});a(g("jwdescription"),{display:"block","font-size":m.fontsize,"line-height":19,
+"margin-top":5,overflow:"hidden",height:y,position:"relative"});j.jwAddEventListener(e.JWPLAYER_PLAYLIST_LOADED,function(){s.innerHTML="";for(var b=j.jwGetPlaylist(),c=[],g=0;g<b.length;g++)b[g]["ova.hidden"]||c.push(b[g]);if(v=c){b=r("ul","jwlist");b.id=p.id+"_ul"+Math.round(1E7*Math.random());u=b;for(b=0;b<v.length;b++){var e=b,c=v[e],g=r("li","jwitem"),h=void 0;g.id=u.id+"_item_"+e;0<e&&(h=r("div","jwplaylistdivider"),g.appendChild(h));e=r("div","jwplaylistimg jwfill");if(c.image||c["playlist.image"]||
+w.itemImage)h=void 0,c["playlist.image"]?h=c["playlist.image"]:c.image?h=c.image:w.itemImage&&(h=w.itemImage.src),a("#"+g.id+" .jwplaylistimg",{"background-image":h?"url("+h+")":null}),g.appendChild(e);e=r("div","jwtextwrapper");h=r("span","jwtitle");h.innerHTML=c&&c.title?c.title:"";e.appendChild(h);c.description&&(h=r("span","jwdescription"),h.innerHTML=c.description,e.appendChild(h));g.appendChild(e);c=g;c.onclick=l(b);u.appendChild(c)}A=j.jwGetPlaylistIndex();d.isIOS()&&window.iScroll?(p.innerHTML=
+"",p.appendChild(u),u.style.height=y*v.length+"px",new iScroll(p.id)):(s.appendChild(u),B=new f.playlistslider(p.id+"_slider",j.skin,p,u))}});j.jwAddEventListener(e.JWPLAYER_PLAYLIST_ITEM,function(a){0<=A&&(b.getElementById(u.id+"_item_"+A).className="jwitem",A=a.index);b.getElementById(u.id+"_item_"+a.index).className="jwitem active";a=j.jwGetPlaylistIndex();a!=n&&(n=-1,d.isIOS()&&window.iScroll?u.scrollTop=a*y:B&&B.visible()&&B.thumbPosition(a/(j.jwGetPlaylist().length-1)))});var E=setInterval(function(){var a=
+b.getElementById(p.id),c=d.bounds(a).height;a!=p?clearInterval(E):c!=t&&(t=c,D.redraw())},200);return this};a(".jwplaylist",{position:"absolute",width:"100%",height:"100%"});d.dragStyle(".jwplaylist","none");a(".jwplaylist .jwplaylistimg",{position:"relative",width:"100%","float":"left",margin:"0 5px 0 0",background:"#000",overflow:"hidden"});a(".jwplaylist .jwlist",{position:"absolute",width:"100%","list-style":"none",margin:0,padding:0,overflow:"hidden"});a(".jwplaylist .jwlistcontainer",{position:"absolute",
+overflow:"hidden",width:"100%",height:"100%"});a(".jwplaylist .jwlist li",{width:"100%"});a(".jwplaylist .jwtextwrapper",{overflow:"hidden"});a(".jwplaylist .jwplaylistdivider",{position:"absolute"})})(jwplayer.html5);
+(function(f){var h=jwplayer,e=h.utils,d=h.events;f.playlistloader=function(){function a(a){try{var b=a.responseXML.childNodes;a="";for(var l=0;l<b.length&&!(a=b[l],a.nodeType!=a.COMMENT_NODE);l++);"xml"==f.parsers.localName(a)&&(a=a.nextSibling);if("rss"!=f.parsers.localName(a))c("Not a valid RSS feed");else{var j=new h.playlist(f.parsers.rssparser.parse(a));if(b=j){a=[];var q,m,p;for(q=0;q<b.length;q++)if(m=b[q],(p=e.filterSources(m.sources))&&p.length)m.sources=p,a.push(m);j=a}else j=void 0;j&&
+j.length&&j[0].sources&&j[0].sources.length&&j[0].sources[0].file?k.sendEvent(d.JWPLAYER_PLAYLIST_LOADED,{playlist:j}):c("No playable sources found")}}catch(s){c()}}function b(a){c(a.match(/invalid/i)?"Not a valid RSS feed":"")}function c(a){k.sendEvent(d.JWPLAYER_ERROR,{message:a?a:"Error loading file"})}var k=new d.eventdispatcher;e.extend(this,k);this.load=function(c){e.ajax(c,a,b)}}})(jwplayer.html5);
+(function(f){function h(){var a=[],b;for(b=0;b<arguments.length;b++)a.push(".jwplaylist ."+arguments[b]);return a.join(",")}var e=jwplayer.utils,d=e.css,a=document,b=window,c=void 0;f.playlistslider=function(f,g,h,l){function j(a){return"#"+n.id+(a?" ."+a:"")}function q(b,e,g,f){var h=a.createElement("div");b&&(h.className=b,e&&d(j(b),{"background-image":e.src?e.src:c,"background-repeat":f?"repeat-y":"no-repeat",height:f?c:e.height}));g&&g.appendChild(h);return h}function m(a){return(a=A.getSkinElement("playlist",
+a))?a:{width:0,height:0,src:c}}function p(a){if(z)return a=a?a:b.event,X(w-(a.detail?-1*a.detail:a.wheelDelta/40)/10),a.stopPropagation&&a.stopPropagation(),a.preventDefault&&a.preventDefault(),a.cancelBubble=!0,a.cancel=!0,a.returnValue=!1}function s(a){if(y||"click"==a.type){var b=e.bounds(B),c=t.clientHeight/2;X((a.pageY-b.top-c)/(b.height-c-c))}}function v(a){return function(b){0<b.button||(X(w+0.05*a),D=setTimeout(function(){x=setInterval(function(){X(w+0.05*a)},50)},500))}}function u(){y=!1;
+b.removeEventListener("mousemove",s);b.removeEventListener("mouseup",u);a.onselectstart=c;clearTimeout(D);clearInterval(x)}var A=g,n,B,t,y,w=0,D,x,z=!0,I,E,C,M,F,G,N,T;this.element=function(){return n};this.visible=function(){return z};var L=this.redraw=function(){clearTimeout(T);T=setTimeout(function(){if(l&&l.clientHeight){var a=l.parentNode.clientHeight/l.clientHeight;0>a&&(a=0);1<a?z=!1:(z=!0,d(j("jwthumb"),{height:Math.max(B.clientHeight*a,M.height+F.height)}));d(j(),{visibility:z?"visible":
+"hidden"});l&&(l.style.width=z?l.parentElement.clientWidth-C.width+"px":"")}else T=setTimeout(L,10)},0)},X=this.thumbPosition=function(a){isNaN(a)&&(a=0);w=Math.max(0,Math.min(1,a));d(j("jwthumb"),{top:G+(B.clientHeight-t.clientHeight)*w});l&&(l.style.top=(n.clientHeight-l.scrollHeight)*w+"px")};n=q("jwslider",null,h);n.id=f;n.addEventListener("mousedown",function(c){0==c.button&&(y=!0);a.onselectstart=function(){return!1};b.addEventListener("mousemove",s,!1);b.addEventListener("mouseup",u,!1)},!1);
+n.addEventListener("click",s,!1);I=m("sliderCapTop");E=m("sliderCapBottom");C=m("sliderRail");f=m("sliderRailCapTop");g=m("sliderRailCapBottom");h=m("sliderThumb");M=m("sliderThumbCapTop");F=m("sliderThumbCapBottom");G=I.height;N=E.height;d(j(),{width:C.width});d(j("jwrail"),{top:G,bottom:N});d(j("jwthumb"),{top:G});I=q("jwslidertop",I,n);E=q("jwsliderbottom",E,n);B=q("jwrail",null,n);t=q("jwthumb",null,n);I.addEventListener("mousedown",v(-1),!1);E.addEventListener("mousedown",v(1),!1);q("jwrailtop",
+f,B);q("jwrailback",C,B,!0);q("jwrailbottom",g,B);d(j("jwrailback"),{top:f.height,bottom:g.height});q("jwthumbtop",M,t);q("jwthumbback",h,t,!0);q("jwthumbbottom",F,t);d(j("jwthumbback"),{top:M.height,bottom:F.height});L();l&&(l.addEventListener("mousewheel",p,!1),l.addEventListener("DOMMouseScroll",p,!1));return this};d(h("jwslider"),{position:"absolute",height:"100%",visibility:"hidden",right:0,top:0,cursor:"pointer","z-index":1,overflow:"hidden"});d(h("jwslider")+" *",{position:"absolute",width:"100%",
+"background-position":"center","background-size":"100% 100%",overflow:"hidden"});d(h("jwslidertop","jwrailtop","jwthumbtop"),{top:0});d(h("jwsliderbottom","jwrailbottom","jwthumbbottom"),{bottom:0})})(jwplayer.html5);
+(function(f){var h=jwplayer.utils,e=h.css,d=document,a="none";f.rightclick=function(b,c){function e(a){var b=d.createElement("div");b.className=a.replace(".","");return b}function g(){j||(q.style.display=a)}var r,l=h.extend({aboutlink:"http://www.longtailvideo.com/jwpabout/?a\x3dr\x26v\x3d"+f.version+"\x26m\x3dh\x26e\x3do",abouttext:"About JW Player "+f.version+"..."},c),j=!1,q,m;this.element=function(){return q};this.destroy=function(){d.removeEventListener("mousedown",g,!1)};r=d.getElementById(b.id);
+q=e(".jwclick");q.id=b.id+"_menu";q.style.display=a;r.oncontextmenu=function(b){if(!j){null==b&&(b=window.event);var c=h.bounds(r),d=c.top,c=c.left;q.style.display=a;q.style.left=b.pageX-c+"px";q.style.top=b.pageY-d+"px";q.style.display="block";b.preventDefault()}};q.onmouseover=function(){j=!0};q.onmouseout=function(){j=!1};d.addEventListener("mousedown",g,!1);m=e(".jwclick_item");m.innerHTML=l.abouttext;m.onclick=function(){window.location.href=l.aboutlink};q.appendChild(m);r.appendChild(q)};e(".jwclick",
+{"background-color":"#FFF","-webkit-border-radius":5,"-moz-border-radius":5,"border-radius":5,height:"auto",border:"1px solid #bcbcbc","font-family":'"MS Sans Serif", "Geneva", sans-serif',"font-size":10,width:320,"-webkit-box-shadow":"5px 5px 7px rgba(0,0,0,.10), 0px 1px 0px rgba(255,255,255,.3) inset","-moz-box-shadow":"5px 5px 7px rgba(0,0,0,.10), 0px 1px 0px rgba(255,255,255,.3) inset","box-shadow":"5px 5px 7px rgba(0,0,0,.10), 0px 1px 0px rgba(255,255,255,.3) inset",position:"absolute","z-index":999},
+!0);e(".jwclick div",{padding:"8px 21px",margin:"0px","background-color":"#FFF",border:"none","font-family":'"MS Sans Serif", "Geneva", sans-serif',"font-size":10,color:"inherit"},!0);e(".jwclick_item",{padding:"8px 21px","text-align":"left",cursor:"pointer"},!0);e(".jwclick_item:hover",{"background-color":"#595959",color:"#FFF"},!0);e(".jwclick_item a",{"text-decoration":a,color:"#000"},!0);e(".jwclick hr",{width:"100%",padding:0,margin:0,border:"1px #e9e9e9 solid"},!0)})(jwplayer.html5);
+(function(f){var h=jwplayer,e=h.utils,d=h.events,a=h.playlist,b=2,c=3,k=4;f.setup=function(g,h){function l(a,b,c){x.push({name:a,method:b,depends:c})}function j(){for(var a=0;a<x.length;a++){var b=x[a],c;a:{if(c=b.depends){c=c.toString().split(",");for(var d=0;d<c.length;d++)if(!t[c[d]]){c=!1;break a}}c=!0}if(c){x.splice(a,1);try{b.method(),j()}catch(e){A(e.message)}return}}0<x.length&&!D&&setTimeout(j,500)}function q(){t[b]=!0}function m(a){A("Error loading skin: "+a)}function p(a){s(a.playlist)}
+function s(a){n.setPlaylist(a);0==n.playlist[0].sources.length?A("Error loading playlist: No playable sources found"):t[c]=!0}function v(a){A("Error loading playlist: "+a.message)}function u(){t[k]=!0}function A(a){D=!0;w.sendEvent(d.JWPLAYER_ERROR,{message:a});B.setupError(a)}var n=g,B=h,t={},y,w=new d.eventdispatcher,D=!1,x=[];e.extend(this,w);this.start=j;l(1,function(){g.edition&&"invalid"==g.edition()?A("Error setting up player: Invalid license key"):t[1]=!0});l(b,function(){y=new f.skin;y.load(n.config.skin,
+q,m)},1);l(c,function(){switch(e.typeOf(n.config.playlist)){case "string":var b=new f.playlistloader;b.addEventListener(d.JWPLAYER_PLAYLIST_LOADED,p);b.addEventListener(d.JWPLAYER_ERROR,v);b.load(n.config.playlist);break;case "array":s(new a(n.config.playlist))}},1);l(k,function(){var a=n.playlist[n.item].image;if(a){var b=new Image;b.addEventListener("load",u,!1);b.addEventListener("error",u,!1);b.src=a;setTimeout(u,500)}else t[k]=!0},c);l(5,function(){B.setup(y);t[5]=!0},k+","+b);l(6,function(){t[6]=
+!0},"5,"+c);l(7,function(){w.sendEvent(d.JWPLAYER_READY);t[7]=!0},6)}})(jwplayer.html5);
+(function(f){f.skin=function(){var h={},e=!1;this.load=function(d,a,b){new f.skinloader(d,function(b){e=!0;h=b;"function"==typeof a&&a()},function(a){"function"==typeof b&&b(a)})};this.getSkinElement=function(d,a){d=d.toLowerCase();a=a.toLowerCase();if(e)try{return h[d].elements[a]}catch(b){jwplayer.utils.log("No such skin component / element: ",[d,a])}return null};this.getComponentSettings=function(d){d=d.toLowerCase();return e&&h&&h[d]?h[d].settings:null};this.getComponentLayout=function(d){d=d.toLowerCase();
+if(e){var a=h[d].layout;if(a&&(a.left||a.right||a.center))return h[d].layout}return null}}})(jwplayer.html5);
+(function(f){var h=jwplayer.utils,e=h.foreach,d="Skin formatting error";f.skinloader=function(a,b,c){function k(a){m=a;h.ajax(h.getAbsolutePath(A),function(a){try{h.exists(a.responseXML)&&r(a.responseXML)}catch(b){s(d)}},function(a){s(a)})}function g(a,b){return a?a.getElementsByTagName(b):null}function r(a){var b=g(a,"skin")[0];a=g(b,"component");b=b.getAttribute("target");(!b||parseFloat(b)>parseFloat(jwplayer.version))&&s("Incompatible player version");if(0===a.length)p(m);else for(b=0;b<a.length;b++){var c=
+q(a[b].getAttribute("name")),d={settings:{},elements:{},layout:{}},e=g(g(a[b],"elements")[0],"element");m[c]=d;for(var f=0;f<e.length;f++)j(e[f],c);if((c=g(a[b],"settings")[0])&&0<c.childNodes.length){c=g(c,"setting");for(e=0;e<c.length;e++){var f=c[e].getAttribute("name"),k=c[e].getAttribute("value");/color$/.test(f)&&(k=h.stringToColor(k));d.settings[q(f)]=k}}if((c=g(a[b],"layout")[0])&&0<c.childNodes.length){c=g(c,"group");for(e=0;e<c.length;e++){k=c[e];f={elements:[]};d.layout[q(k.getAttribute("position"))]=
+f;for(var n=0;n<k.attributes.length;n++){var r=k.attributes[n];f[r.name]=r.value}k=g(k,"*");for(n=0;n<k.length;n++){r=k[n];f.elements.push({type:r.tagName});for(var u=0;u<r.attributes.length;u++){var A=r.attributes[u];f.elements[n][q(A.name)]=A.value}h.exists(f.elements[n].name)||(f.elements[n].name=r.tagName)}}}v=!1;l()}}function l(){clearInterval(u);n||(u=setInterval(function(){var a=!0;e(m,function(b,c){"properties"!=b&&e(c.elements,function(c){(m[q(b)]?m[q(b)].elements[q(c)]:null).ready||(a=!1)})});
+a&&!1==v&&(clearInterval(u),p(m))},100))}function j(a,b){b=q(b);var c=new Image,d=q(a.getAttribute("name")),e=a.getAttribute("src");if(0!==e.indexOf("data:image/png;base64,"))var f=h.getAbsolutePath(A),e=[f.substr(0,f.lastIndexOf("/")),b,e].join("/");m[b].elements[d]={height:0,width:0,src:"",ready:!1,image:c};c.onload=function(){var a=b,e=m[q(a)]?m[q(a)].elements[q(d)]:null;e?(e.height=c.height,e.width=c.width,e.src=c.src,e.ready=!0,l()):h.log("Loaded an image for a missing element: "+a+"."+d)};c.onerror=
+function(){n=!0;l();s("Skin image not found: "+this.src)};c.src=e}function q(a){return a?a.toLowerCase():""}var m={},p=b,s=c,v=!0,u,A=a,n=!1;"string"!=typeof A||""===A?r(f.defaultskin().xml):"xml"!=h.extension(A)?s("Skin not a valid file type"):new f.skinloader("",k,s)}})(jwplayer.html5);
+(function(f){var h=jwplayer.utils,e=jwplayer.events,d=h.css;f.thumbs=function(a){function b(a){if("array"==!h.typeOf(a))return c("Invalid data");r=a;d("#"+j,{display:"block"})}function c(a){h.log("Thumbnails could not be loaded: "+a)}function k(a){a=a.target;d("#"+j,{"background-image":a.src,"background-position":"0 0",width:a.width,height:a.height})}var g,r,l,j=a;a=new e.eventdispatcher;h.extend(this,a);this.load=function(a){d("#"+j,{display:"none"});a&&(l=a.split("?")[0].split("/").slice(0,-1).join("/"),
+(new f.parsers.srt(b,c,!0)).load(a))};this.element=function(){return g};this.updateTimeline=function(a){var b=0;if(r){for(;b<r.length&&a>r[b].end;)b++;b==r.length&&b--;if(r[b].text)if(a=r[b].text,0>a.indexOf("://")&&(a=l?l+"/"+a:a),0<a.indexOf("#xywh"))try{var e=/(.+)\#xywh=(\d+),(\d+),(\d+),(\d+)/.exec(a),f=e[1];d("#"+j,{"background-image":f,"background-position":-1*e[2]+"px "+-1*e[3]+"px",width:e[4],height:e[5]})}catch(g){c("Could not parse thumbnail")}else f=new Image,f.addEventListener("load",
+k,!1),f.src=a}};g=document.createElement("div");g.id=j}})(jwplayer.html5);
+(function(f){var h=f.utils,e=f.events,d=e.state;f.html5.video=function(a){function b(a,b){F&&M.sendEvent(a,b)}function c(){}function f(){F&&(z==d.PLAYING&&!x)&&(t=Number(n.currentTime.toFixed(1)),b(e.JWPLAYER_MEDIA_TIME,{position:t,duration:B}))}function g(a){F&&(y||(y=!0,w||(w=!0,b(e.JWPLAYER_MEDIA_BUFFER_FULL))),"loadedmetadata"==a.type&&(n.muted&&(n.muted=!1,n.muted=!0),b(e.JWPLAYER_MEDIA_META,{duration:n.duration,height:n.videoHeight,width:n.videoWidth})))}function r(a){F&&!x&&(n.paused?n.currentTime==
+n.duration&&3<n.duration||da():(!h.isFF()||!("play"==a.type&&z==d.BUFFERING))&&m(d.PLAYING))}function l(){F&&(x||m(d.BUFFERING))}function j(a){var b;if("array"==h.typeOf(a)&&0<a.length){b=[];for(var c=0;c<a.length;c++){var d=a[c],e={};e.label=d.label&&d.label?d.label?d.label:0:c;b[c]=e}}return b}function q(){w=y=!1;A=G[N];m(d.BUFFERING);n.src=A.file;n.load();E=setInterval(p,100);if((h.isIPod()||h.isAndroid(2.3))&&!w)w=!0,b(e.JWPLAYER_MEDIA_BUFFER_FULL)}function m(a){if(!(a==d.PAUSED&&z==d.IDLE)&&
+!x&&z!=a){var c=z;z=a;b(e.JWPLAYER_PLAYER_STATE,{oldstate:c,newstate:a})}}function p(){if(F){var a;a=0==n.buffered.length||0==n.duration?0:n.buffered.end(n.buffered.length-1)/n.duration;a!=C&&(C=a,b(e.JWPLAYER_MEDIA_BUFFER,{bufferPercent:Math.round(100*C)}));1<=a&&clearInterval(E)}}var s=h.isIE(),v={abort:c,canplay:g,canplaythrough:c,durationchange:function(){if(F){var a=Number(n.duration.toFixed(1));B!=a&&(B=a);T&&(0<D&&a>D)&&Z(D);f()}},emptied:c,ended:function(){F&&z!=d.IDLE&&(N=-1,X=!0,b(e.JWPLAYER_MEDIA_BEFORECOMPLETE),
+F&&(m(d.IDLE),X=!1,b(e.JWPLAYER_MEDIA_COMPLETE)))},error:function(){F&&(h.log("Error playing media: %o",n.error),M.sendEvent(e.JWPLAYER_MEDIA_ERROR,{message:"Error loading media: File could not be played"}),m(d.IDLE))},loadeddata:c,loadedmetadata:g,loadstart:c,pause:r,play:r,playing:r,progress:function(){y&&(0<D&&!T)&&(s?setTimeout(function(){Z(D)},200):Z(D))},ratechange:c,readystatechange:c,seeked:function(){!x&&z!=d.PAUSED&&m(d.PLAYING)},seeking:s?l:c,stalled:c,suspend:c,timeupdate:f,volumechange:function(){b(e.JWPLAYER_MEDIA_VOLUME,
+{volume:Math.round(100*n.volume)});b(e.JWPLAYER_MEDIA_MUTE,{mute:n.muted})},waiting:l},u,A,n,B,t,y,w,D,x,z=d.IDLE,I,E=-1,C=-1,M=new e.eventdispatcher,F=!1,G,N=-1,T=h.isAndroid(),L=this,X=!1;h.extend(L,M);L.load=function(a){if(F){u=a;D=0;B=a.duration?a.duration:-1;t=0;G=u.sources;0>N&&(N=0);for(a=0;a<G.length;a++)if(G[a]["default"]){N=a;break}var b=h.getCookies().qualityLabel;if(b)for(a=0;a<G.length;a++)if(G[a].label==b){N=a;break}(a=j(G))&&M.sendEvent(e.JWPLAYER_MEDIA_LEVELS,{levels:a,currentQuality:N});
+q()}};L.stop=function(){F&&(n.removeAttribute("src"),s||n.load(),N=-1,clearInterval(E),m(d.IDLE))};L.play=function(){F&&!x&&n.play()};var da=L.pause=function(){F&&(n.pause(),m(d.PAUSED))};L.seekDrag=function(a){F&&((x=a)?n.pause():n.play())};var Z=L.seek=function(a){F&&(!x&&0==D&&b(e.JWPLAYER_MEDIA_SEEK,{position:t,offset:a}),y?(D=0,n.currentTime=a):D=a)},oa=L.volume=function(a){h.exists(a)&&(n.volume=Math.min(Math.max(0,a/100),1),I=100*n.volume)};L.mute=function(a){h.exists(a)||(a=!n.muted);a?(I=
+100*n.volume,n.muted=!0):(oa(I),n.muted=!1)};this.checkComplete=function(){return X};L.detachMedia=function(){F=!1;return n};L.attachMedia=function(a){F=!0;a||(y=!1);X&&(m(d.IDLE),b(e.JWPLAYER_MEDIA_COMPLETE),X=!1)};L.getTag=function(){return n};L.audioMode=function(){if(!G)return!1;var a=G[0].type;return"aac"==a||"mp3"==a||"vorbis"==a};L.setCurrentQuality=function(a){N!=a&&(a=parseInt(a),0<=a&&(G&&G.length>a)&&(N=a,h.saveCookie("qualityLabel",G[a].label),b(e.JWPLAYER_MEDIA_LEVEL_CHANGED,{currentQuality:a,
+levels:j(G)}),a=n.currentTime,q(),L.seek(a)))};L.getCurrentQuality=function(){return N};L.getQualityLevels=function(){return j(G)};n=a;h.foreach(v,function(a,b){n.addEventListener(a,b,!1)});n.controls=!0;n.controls=!1;n.setAttribute("x-webkit-airplay","allow");F=!0}})(jwplayer);
+(function(f){var h=jwplayer.utils,e=jwplayer.events,d=e.state,a=h.css,b=h.isMobile(),c=h.isIPad(),k=h.isIPod(),g=h.isAndroid(),r=h.isIOS(),l=document,j="aspectMode",q="jwmain",m="jwvideo",p="jwplaylistcontainer",s=!0,v=!1,u="hidden",A="none",n="block";f.view=function(B,t){function y(a){a&&(a.element().addEventListener("mousemove",x,v),a.element().addEventListener("mouseout",z,v))}function w(a,b){var c=l.createElement(a);b&&(c.className=b);return c}function D(){clearTimeout(pa);if(S.jwGetState()==
+d.PLAYING||S.jwGetState()==d.PAUSED)oa(),Aa||(pa=setTimeout(I,Da))}function x(){clearTimeout(pa);Aa=s}function z(){Aa=v}function I(){S.jwGetState()!=d.BUFFERING&&(H&&(!V&&!O)&&H.hide(),U&&(!ia&&!O)&&U.hide(),X());clearTimeout(pa);pa=0}function E(a){ba.sendEvent(a.type,a)}function C(b,c,d){h.exists(d)||(d=!0);h.exists(b)&&h.exists(c)&&(J.width=b,J.height=c);P.style.width=isNaN(b)?b:b+"px";-1==P.className.indexOf(j)&&(P.style.height=isNaN(c)?c:c+"px");R&&R.redraw();H&&H.redraw();W&&(W.offset(H&&0<=
+W.position().indexOf("bottom")?H.height()+H.margin():0),setTimeout(function(){U&&U.offset("top-left"==W.position()?W.element().clientWidth+W.margin():0)},500));b=J.playlistsize;var f=J.playlistposition;M(c);if(K&&b&&("right"==f||"bottom"==f)){K.redraw();c={display:n};var g={};c[f]=0;g[f]=b;"right"==f?c.width=b:c.height=b;a(fa(p),c);a(fa(q),g)}F();d&&ba.sendEvent(e.JWPLAYER_RESIZE)}function M(a){V=b&&!O?v:0<a.toString().indexOf("%")?v:"bottom"==J.playlistposition?a<=40+J.playlistsize:40>=a;H&&(V?(H.audioMode(s),
+oa(),R.hidePreview(s),Z(),ea(v)):(H.audioMode(v),Pa(S.jwGetState())));W&&V&&X();P.style.backgroundColor=V?"transparent":"#000"}function F(){Y&&-1==P.className.indexOf(j)&&h.stretch(J.stretching,Y,ja.clientWidth,ja.clientHeight,Y.videoWidth,Y.videoHeight)}function G(a){if(J.fullscreen)switch(a.keyCode){case 27:Ba(v)}}function N(a){r||(a?(P.className+=" jwfullscreen",l.getElementsByTagName("body")[0].style["overflow-y"]=u):(P.className=P.className.replace(/\s+jwfullscreen/,""),l.getElementsByTagName("body")[0].style["overflow-y"]=
+""))}function T(){var a;a:{a=[l.mozFullScreenElement,l.webkitCurrentFullScreenElement,Y.webkitDisplayingFullscreen];for(var b=0;b<a.length;b++)if(a[b]&&(!a[b].id||a[b].id==S.id)){a=s;break a}a=v}J.fullscreen!=a&&Ba(a)}function L(){U&&(!V&&(!b||ia))&&U.show()}function X(){W&&(!O||V)&&W.hide(V)}function da(){R&&J.controls&&!V&&(!k||S.jwGetState()==d.IDLE)&&R.show();if(b&&!O&&(g&&(aa.style.display=n),!b||!J.fullscreen))Y.controls=!1}function Z(){R&&(b&&!O&&(g&&J.controls&&(aa.style.display=A),Y.controls=
+J.controls),R.hide())}function oa(){if(J.controls||V)H&&H.show(),L();W&&!V&&W.show()}function ea(b){b=b&&!V;a(fa(m),{visibility:b?"visible":u,opacity:b?1:0})}function Ta(){ia=s;Ba(!1);J.controls&&L()}function Ua(){}function Fa(a){ia=v;clearTimeout(ra);ra=setTimeout(function(){Pa(a.newstate)},100)}function Pa(a){switch(a){case d.PLAYING:!J.getVideo().audioMode()||b?(ea(s),F(),R.hidePreview(s),b&&(!c||!O)&&Z()):(ea(v),R.hidePreview(V));D();break;case d.IDLE:ea(v);I();V||(R.hidePreview(v),da(),ca.hide||
+W&&!V&&W.show());break;case d.BUFFERING:da();b?ea(s):oa();break;case d.PAUSED:da(),(!b||O)&&oa()}}function fa(a){return"#"+S.id+(a?" ."+a:"")}function Ca(b,c){a(b,{display:c?n:A})}var S=B,J=t,P,va,aa,Ga,za,pa=0,Da=2E3,Y,ja,qa,Q,H,R,U,W,ca=h.extend({},J.componentConfig("logo")),ga,K,V,O=J.mobilecontrols,$=v,ia,wa,sa,Aa=v,ba=new e.eventdispatcher;h.extend(this,ba);this.getCurrentCaptions=function(){return ga.getCurrentCaptions()};this.setCurrentCaptions=function(a){ga.setCurrentCaptions(a)};this.getCaptionsList=
+function(){return ga.getCaptionsList()};this.setup=function(c){if(!$){S.skin=c;va=w("span",q);ja=w("span",m);Y=J.getVideo().getTag();ja.appendChild(Y);aa=w("span","jwcontrols");qa=w("span","jwinstream");za=w("span",p);Ga=w("span","jwaspect");c=J.height;var g=J.componentConfig("controlbar"),k=J.componentConfig("display");M(c);ga=new f.captions(S,J.captions);ga.addEventListener(e.JWPLAYER_CAPTIONS_LIST,E);ga.addEventListener(e.JWPLAYER_CAPTIONS_CHANGED,E);aa.appendChild(ga.element());R=new f.display(S,
+k);R.addEventListener(e.JWPLAYER_DISPLAY_CLICK,E);V&&R.hidePreview(s);aa.appendChild(R.element());W=new f.logo(S,ca);aa.appendChild(W.element());U=new f.dock(S,J.componentConfig("dock"));aa.appendChild(U.element());wa=S.edition?new f.rightclick(S,{abouttext:J.abouttext,aboutlink:J.aboutlink}):new f.rightclick(S,{});J.playlistsize&&(J.playlistposition&&J.playlistposition!=A)&&(K=new f.playlistcomponent(S,{}),za.appendChild(K.element()));if(!b||O)H=new f.controlbar(S,g),aa.appendChild(H.element()),
+O&&oa();setTimeout(function(){C(J.width,J.height,!1)},0);va.appendChild(ja);va.appendChild(aa);va.appendChild(qa);P.appendChild(va);P.appendChild(Ga);P.appendChild(za);l.addEventListener("webkitfullscreenchange",T,v);Y.addEventListener("webkitbeginfullscreen",T,v);Y.addEventListener("webkitendfullscreen",T,v);l.addEventListener("mozfullscreenchange",T,v);l.addEventListener("keydown",G,v);S.jwAddEventListener(e.JWPLAYER_PLAYER_READY,Ua);S.jwAddEventListener(e.JWPLAYER_PLAYER_STATE,Fa);S.jwAddEventListener(e.JWPLAYER_PLAYLIST_COMPLETE,
+Ta);Fa({newstate:d.IDLE});aa.addEventListener("mouseout",function(){clearTimeout(pa);pa=setTimeout(I,10)},v);aa.addEventListener("mousemove",D,v);h.isIE()&&(ja.addEventListener("mousemove",D,v),ja.addEventListener("click",R.clickHandler));y(H);y(U);y(W);a("#"+P.id+"."+j+" .jwaspect",{"margin-top":J.aspectratio,display:n});c=h.exists(J.aspectratio)?parseFloat(J.aspectratio):100;g=J.playlistsize;a("#"+P.id+".playlist-right .jwaspect",{"margin-bottom":-1*g*(c/100)+"px"});a("#"+P.id+".playlist-right ."+
+p,{width:g+"px",right:0,top:0,height:"100%"});a("#"+P.id+".playlist-bottom .jwaspect",{"padding-bottom":g+"px"});a("#"+P.id+".playlist-bottom ."+p,{width:"100%",height:g+"px",bottom:0});a("#"+P.id+".playlist-right ."+q,{right:g+"px"});a("#"+P.id+".playlist-bottom ."+q,{bottom:g+"px"})}};var Ba=this.fullscreen=function(a){h.exists(a)||(a=!J.fullscreen);a?J.fullscreen||(N(s),P.requestFullScreen?P.requestFullScreen():P.mozRequestFullScreen?P.mozRequestFullScreen():P.webkitRequestFullScreen&&P.webkitRequestFullScreen(),
+J.setFullscreen(s)):(N(v),J.fullscreen&&(J.setFullscreen(v),l.cancelFullScreen?l.cancelFullScreen():l.mozCancelFullScreen?l.mozCancelFullScreen():l.webkitCancelFullScreen?l.webkitCancelFullScreen():Y.webkitExitFullScreen&&Y.webkitExitFullScreen()),c&&S.jwGetState()==d.PAUSED&&setTimeout(da,500));H&&H.redraw();R&&R.redraw();U&&U.redraw();F();J.fullscreen?sa=setInterval(F,200):clearInterval(sa);setTimeout(function(){var a=h.bounds(va);J.width=a.width;J.height=a.height;ba.sendEvent(e.JWPLAYER_RESIZE)},
+0)};this.resize=C;this.resizeMedia=F;var Ja=this.completeSetup=function(){a(fa(),{opacity:1})},ra;this.setupInstream=function(a,c){Ca(fa("jwinstream"),s);Ca(fa("jwcontrols"),v);qa.appendChild(a);_instreamVideo=c;Fa({newstate:d.PLAYING});b&&(Q=S.jwGetControls(),S.jwSetControls(v))};this.destroyInstream=function(){Ca(fa("jwinstream"),v);Ca(fa("jwcontrols"),s);qa.innerHTML="";_instreamVideo=null;b&&S.jwSetControls(Q)};this.setupError=function(a){$=!0;jwplayer.embed.errorScreen(P,a);Ja()};this.addButton=
+function(a,b,c,d){U&&U.addButton(a,b,c,d)};this.removeButton=function(a){U&&U.removeButton(a)};this.setControls=function(a){var b=J.controls;a=a?s:v;J.controls=a;a!=b&&(a?da():(H&&(!V&&!O)&&H.hide(),U&&(!ia&&!O)&&U.hide(),X(),Z()),ba.sendEvent(e.JWPLAYER_CONTROLS,{controls:a}))};this.forceState=function(a){R.forceState(a)};this.releaseState=function(){R.releaseState(S.jwGetState())};this.getSafeRegion=function(){var a=J.controls,b=h.bounds(va),c=b.top,d=h.bounds(H?H.element():null),e=0<U.numButtons(),
+f=h.bounds(U.element()),g=h.bounds(W.element()),j=0==W.position().indexOf("top"),e=Math.max(e?f.top+f.height-c:0,j?g.top+g.height-c:0),f=b.width,b=d.height?(j?d.top:g.top)-e-c:b.height-e;return{x:0,y:a?e:0,width:a?f:0,height:a?b:0}};this.destroy=function(){l.removeEventListener("webkitfullscreenchange",T,v);l.removeEventListener("mozfullscreenchange",T,v);Y.removeEventListener("webkitbeginfullscreen",T,v);Y.removeEventListener("webkitendfullscreen",T,v);l.removeEventListener("keydown",G,v);wa&&wa.destroy()};
+P=w("div","jwplayer playlist-"+J.playlistposition);P.id=S.id;J.aspectratio&&(a(".jwplayer",{display:"inline-block"}),P.className=P.className.replace("jwplayer","jwplayer "+j));C(J.width,J.height);var ka=document.getElementById(S.id);ka.parentNode.replaceChild(P,ka)};a(".jwplayer",{position:"relative",display:"block",opacity:0,"min-height":h.isMobile()?200:0,"-webkit-transition":"opacity .5s ease","-moz-transition":"opacity .5s ease","-o-transition":"opacity .5s ease"});a("."+q,{position:"absolute",
+left:0,right:0,top:0,bottom:0,"-webkit-transition":"opacity .5s ease","-moz-transition":"opacity .5s ease","-o-transition":"opacity .5s ease"});a("."+m+" ,.jwcontrols",{position:"absolute",height:"100%",width:"100%","-webkit-transition":"opacity .5s ease","-moz-transition":"opacity .5s ease","-o-transition":"opacity .5s ease"});a("."+m,{overflow:u,visibility:u,opacity:0,cursor:"pointer"});a("."+m+" video",{background:"transparent",width:"100%",height:"100%"});a("."+p,{position:"absolute",height:"100%",
+width:"100%",display:A});a(".jwinstream",{position:"absolute",top:0,left:0,bottom:0,right:0,display:"none"});a(".jwaspect",{display:"none"});a(".jwplayer."+j,{height:"auto"});a(".jwplayer.jwfullscreen",{width:"100%",height:"100%",left:0,right:0,top:0,bottom:0,"z-index":1E3,position:"fixed"},s);a(".jwplayer.jwfullscreen ."+q,{left:0,right:0,top:0,bottom:0},s);a(".jwplayer.jwfullscreen ."+p,{display:A},s);a(".jwplayer .jwuniform",{"background-size":"contain !important"});a(".jwplayer .jwfill",{"background-size":"cover !important",
+"background-position":"center"});a(".jwplayer .jwexactfit",{"background-size":"100% 100% !important"})})(jwplayer.html5);
+(function(f){var h=jwplayer.utils.extend,e=f.logo,d;d=function(a,b){"free"==a.edition()?b=null:(e.defaults.file="",e.defaults.prefix="");h(this,new e(a,b))};d.defaults={prefix:"",file:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG0AAAATCAYAAACa0IPnAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NUVGQjQ0N0ZEOThDMTFFMUFDMUZCMzY5RkYyQkY5NDUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NUVGQjQ0ODBEOThDMTFFMUFDMUZCMzY5RkYyQkY5NDUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1RUZCNDQ3REQ5OEMxMUUxQUMxRkIzNjlGRjJCRjk0NSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1RUZCNDQ3RUQ5OEMxMUUxQUMxRkIzNjlGRjJCRjk0NSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pr5HQqEAAArQSURBVHja3JkJUNT3Fcf3AARBQVFR8IjGCw1aT9R6UKVe0TgYOxNHG5tqD+o48ajVia21mdaJ49FoCloNKho0FkbjQRwRvAUVFUO8gCDKIbccciyw7Pbztr+1G2Sp0yKj/c28+f/3d733e993/f6r1TTSwsLCtDwcIbPq0kM6qErTeHOCau2MtVLPWpv9rE2n1pps+FQ3ssfPoR5QNHRN8+o3bSNn/Z/awoULn707NDZBr9d7ms3m3/FqqKurO8rv4Vqt1l+n031B35kG04OZ68f4Td4/bzAWxNjk+vr6Sw4ODpENgNXRP54956pDuog87JPCMxtKgO5Y0K6t/dDJyWlQSUlJbbt27V4H0PpB05UBOkOHoMfNtXmjoBUUFHTu0qXLcl5rsrOzEzw8PMagrPcNBoOHs7NzIv1P1dS2gPJXFN0KcB86OjoKqAarhzF/GfPHsV8B+2j8/f2f8bh69aq2b9++E9n3l/K7pqYmi32c2OM9+Q2gyRiLyHD26dOnJvapq6iocOzYseMrj1hhYeEPkHOz9XdZWVmau7v7ywWttLRUD2hVAGIsKioq43dKp06dzCaTaSSK80bR4g2aqqqqka1bt7aGv3bQaJR+Vn5UVlb2xbt64kk1t2/fTtq/f79x7Nix/2bs4KARENhXk5ubmxwREfE5wDjDtzvzJnp5eQ3CEDYCZgB71kMayCzPV72Vl5c7Ir8BoxMv07i4uLyH3HF2Qn/zgEYoMgth7Zpu3brpk5OTLxOiCtzc3LwBozcCWEDDM2aj/Hr6Cl1dXTvhEXMA0QIaAI/FuroQ0tLbtGmTcvjwYVODECx8TAqM/MTExHCV09q0b9/+CYf+LXsNKS4u9mBvC1gC9OsAWqtWrSznkjNawlHbtu9ifDsA79JLA00p0srU7dSpUwljxoxJx8O8UKQ/yj5FvxFQZgNc7fHjx0MXLFjwMZ4xmjEpLkwoeBjC6/HUxGvXruVMnz79+4wVAMzX4GD1J06cKFdDJVlZWRUc0BHgawBdC1+tzLPOVy0AWgR1U+Facu1nUB30J2UAYVCGDdvxas1B6KTq+wCaAXlCD6DdkFW5A6CV0FdQMfRTqAL6RKKgXaWqs8lTNWfeQ6EJcr6XApowE+WgNGHumJ+fX4anpdI3Bqv/IYp0wxPeYsiT0HY7Ly8vwmg0fshYV0DsQ38W7wNlD7wv/vr16xU2yn4ONHJmN57vKnn8evTo8QHjjjk5OUmZmZkV/fv3t8yjz6T2WUTo3iryIVcpAHtLwUN/R/ivRb5x7DkW626NQSxXLH34/WcMadyDBw8u9+rVy52+cNa9TUQph0yMTWDPQEL6CsYiOdsQwvXPONuP6NNAPRivevz4cXjXrl3tgmY9lw1o8tuPtf9gjyAFfPN7GgewgAZjS/n66NGjC3369HmH0OVPUeFOPpuBp2lQ7FkKjDxqjRsUFj8mns9AETGenp5+1dXV+Sjj7vnz5032DiZ8ePrS9YUKuc7SBw/Jc5/ideUzZszQSR+kleeuXbsyeO66efNmJgCVwstr7dq1wciznFC94+LFi1/PmTMngEgxDz5/FE9EvoEUB2Jwj44ePZq4YsWK1YzNio+PPxIeHh4LMPWTJk0aPHfu3F/z/jFjkZzRRfHtgfHE79y5M4xQryNNFC9evNiuUq3nsgVNtUB0c5ozLuA9tdlBE8aS06w55MKFC3Hjx4/Pw4IHECJ9EP5tBNMlJCREEdoMa9asOenn5zcZgUZw6GKs31Uqzxs3btybNWuW3RAifPDktEOHDn3VoUMHN3KY4datW/koNxVLP8P+dYRYq+VawuSxY8cSV61a5TRv3rwJyOCPnOJ+bdjP6eHDhx327dv3JTwlJ7ZHljms2YM8k0VejODC0KFDs8TipbDp169fdWhoaFsA1sHTgPwSFXwYe4v3GuEH4GkHDhwIEWNQOitbtmyZpqnw2NDTbNoogLvK3iG8/0VV2+b/CjSsVsdhTIqpWaxaPA3m4mkaCoUcrDiNfl9Cwx845JtUlVmExmTWmqKiohKZX4YnilA+zDOjhGunT58u2rBhg13QxCI5wOODBw9+qu40NaIUuZ6xr1EldgtJFSmKP3fu3Bq6l0nOI/xm4hEFeJtWGZoeb8/hSnGYPBpMhbqANccZn838ciLG11OnTu3MXu6ETm337t3Fot4RJ5eCh/U6gDYQAnszbhS+ACyFVizylL6IUpvwNGvzgD6CfgOFSpiGctXZ6/4jaHfu3JGd+yHsaN4jBw4cWMYBMdLWLuSAUooLy4WYsXrC3A0UHIiXTVVAxhEaq0RA7iIZHPTGgAEDJsrXCxRZInctWdeUN8tavMDIvLymlCCEodRKzuR9JQb0ZOPGjX+LjIxMwlAMVKefIZe77MteZjx/H6C9TygTj1lNBdeTXHZl8+bNsVTEXsOHD68W3qz7Eg9KByA9Stb7+Pi44+FFAJSEsU2UOejCGBgYaJD3F2lWY2wCNOtXE7kmiQGuwdCToGgMRO7BUp2Xqy9FAqTo59mXFgcO34lccBJFdEPJk9PS0jaQi4JRpAOhKoswdNOqOKrA2JEjR/6Kd1fp43Anly5davHOkJCQQgC/wJiApgHA7+R+NnPmzKYqLK0CRNewUGlQQksu06FYM4pvTxg2c7hKwuP19evX38ODpkFdbEMuIfVbDho3atQo8aLljBs5zzXOV0RuNuDZ1ymmek6bNq0rhc4ecnMF8g8BtJUZGRm/J3JkYSSOqmrVWUPei4LWRHi014YosjQAFCMuQ+4HqnK1fuar1M2fP7+cA0ThUUVY1E9QznXy1gI8JTcpKSn6yZMn+dYQtXfv3m8AOROhTDyzr1y5Em8NXSTqOiq5JKxaPM+M532ze/fuR9bxhqRKYpOyyHp786zjzDdC+ujo6Jz09PSrXMq7E86PoxzJD4sB0bIXipbQrrl06VLVmTNn9tIvHqUlTGbHxMQcVrJWbNq0KQQA4/HSsUSL80FBQRfJb3vg5U0LZI6JtWYb/pqmZLQlSSkYmO5F5zdGrO8M9QOTadB8RXOhRQ6pqamV69at28ahKkeMGDEM6+tAnio8cuRIHMXBEWuSFMuhv2rr1q2HsMxcFHdv8ODBRbbWxyX8W8DfL6fGyk8yv8aeWbHeTD66hVfHYOXnevfubdcE8fAYhP0OA7qHIeSmpKRsoHpbSG71Jv9Ub9++PdLX1/cNPND3/v37xRRMIqt5yZIll/G4NK4Qg8i/9ykmErds2WLZkwIpgfD5EZFkVkBAwDDCpysFR0lsbGwCUeME6zV3795NwyDiyIPnAbF2ypQpL/a1WKs1SSh3+JermZrx3m7Jt1qbDm+5y8gFXhUC6XYugl5QF+Wy2Q0qH0Gwu9ojw3Y9Cn9uI6y8A483JdIynmlPUub1kks+lMO8Yn5LwTJQ5QQpVm5B7kq2ZOZYvn8CkjPhORXL9QwLC1sRHBy8o5G95XL+hiqC5JL+kPV5asxdXbClSMik/4UA2LZt20iuF7/AO11QcrN97ccGngPtpTa8qiW/JA0SEMgHQYS41XjJXfLVRGTIbwnmFERuygH0zfwXjXxtqndoKS225DdDrDEKsDrC0wOgSgipuwwGQ35L8YdXhaoAm62R375XdraUIlsMtIiIiNCeNDysND4+/g6X57/Dv1DzGjfbSlSr+f9sfSUlqW98+U193H0d2z8FGACF4VIWnpOTrQAAAABJRU5ErkJggg%3D%3D"};h(d.defaults,
+e.defaults);f.logo=d})(jwplayer.html5);(function(f){var h=f.model;f.model=function(e,d){var a=new jwplayer.utils.key(e.key),b=new h(e,d),c=b.componentConfig;b.edition=function(){return a.edition()};b.componentConfig=function(a){return"logo"==a?b.logo:c(a)};return b}})(jwplayer.html5);(function(f){f.player.prototype.edition=function(){return this._model.edition()}})(jwplayer.html5);
+(function(f){var h=jwplayer.utils.extend,e=f.rightclick;f.rightclick=function(d,a){if("free"==d.edition())a.aboutlink="http://www.longtailvideo.com/jwpabout/?a\x3dr\x26v\x3d"+f.version+"\x26m\x3dh\x26e\x3df",delete a.abouttext;else{if(!a.aboutlink){var b="http://www.longtailvideo.com/jwpabout/?a\x3dr\x26v\x3d"+f.version+"\x26m\x3dh\x26e\x3d",c=d.edition();a.aboutlink=b+("pro"==c?"p":"premium"==c?"r":"ads"==c?"a":"f")}a.abouttext?a.abouttext="About "+a.abouttext+" ...":(b=d.edition(),b=b.charAt(0).toUpperCase()+
+b.substr(1),a.abouttext="About JW Player "+f.version+" ("+b+" edition)")}h(this,new e(d,a))}})(jwplayer.html5);(function(f){var h=f.view;f.view=function(e,d){var a=new h(e,d);"invalid"==d.edition()&&a.setupError("Error setting up player: Invalid license key");return a}})(jwplayer.html5);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/jwplayer-version/jwplayer.js b/htmltest/sites/all/libraries/jwplayer-version/jwplayer.js
new file mode 100644
index 00000000..0780a9ea
--- /dev/null
+++ b/htmltest/sites/all/libraries/jwplayer-version/jwplayer.js
@@ -0,0 +1,80 @@
+"undefined"==typeof jwplayer&&(jwplayer=function(f){if(jwplayer.api)return jwplayer.api.selectPlayer(f)},jwplayer.version="6.5.3609",jwplayer.vid=document.createElement("video"),jwplayer.audio=document.createElement("audio"),jwplayer.source=document.createElement("source"),function(f){function a(h){return function(){return d(h)}}var k=document,e=window,c=navigator,b=f.utils=function(){};b.exists=function(h){switch(typeof h){case "string":return 0<h.length;case "object":return null!==h;case "undefined":return!1}return!0};
+b.styleDimension=function(h){return h+(0<h.toString().indexOf("%")?"":"px")};b.getAbsolutePath=function(h,a){b.exists(a)||(a=k.location.href);if(b.exists(h)){var d;if(b.exists(h)){d=h.indexOf("://");var c=h.indexOf("?");d=0<d&&(0>c||c>d)}else d=void 0;if(d)return h;d=a.substring(0,a.indexOf("://")+3);var c=a.substring(d.length,a.indexOf("/",d.length+1)),e;0===h.indexOf("/")?e=h.split("/"):(e=a.split("?")[0],e=e.substring(d.length+c.length+1,e.lastIndexOf("/")),e=e.split("/").concat(h.split("/")));
+for(var g=[],m=0;m<e.length;m++)e[m]&&(b.exists(e[m])&&"."!=e[m])&&(".."==e[m]?g.pop():g.push(e[m]));return d+c+"/"+g.join("/")}};b.extend=function(){var a=b.extend.arguments;if(1<a.length){for(var d=1;d<a.length;d++)b.foreach(a[d],function(d,c){try{b.exists(c)&&(a[0][d]=c)}catch(e){}});return a[0]}return null};b.log=function(a,b){"undefined"!=typeof console&&"undefined"!=typeof console.log&&(b?console.log(a,b):console.log(a))};var d=b.userAgentMatch=function(a){return null!==c.userAgent.toLowerCase().match(a)};
+b.isIE=a(/msie/i);b.isFF=a(/firefox/i);b.isChrome=a(/chrome/i);b.isIOS=a(/iP(hone|ad|od)/i);b.isIPod=a(/iP(hone|od)/i);b.isIPad=a(/iPad/i);b.isSafari602=a(/Macintosh.*Mac OS X 10_8.*6\.0\.\d* Safari/i);b.isAndroid=function(a){return a?d(RegExp("android.*"+a,"i")):d(/android/i)};b.isMobile=function(){return b.isIOS()||b.isAndroid()};b.saveCookie=function(a,b){k.cookie="jwplayer."+a+"\x3d"+b+"; path\x3d/"};b.getCookies=function(){for(var a={},b=k.cookie.split("; "),d=0;d<b.length;d++){var c=b[d].split("\x3d");
+0==c[0].indexOf("jwplayer.")&&(a[c[0].substring(9,c[0].length)]=c[1])}return a};b.typeOf=function(a){var b=typeof a;return"object"===b?!a?"null":a instanceof Array?"array":b:b};b.translateEventResponse=function(a,d){var c=b.extend({},d);a==f.events.JWPLAYER_FULLSCREEN&&!c.fullscreen?(c.fullscreen="true"==c.message?!0:!1,delete c.message):"object"==typeof c.data?(c=b.extend(c,c.data),delete c.data):"object"==typeof c.metadata&&b.deepReplaceKeyName(c.metadata,["__dot__","__spc__","__dsh__","__default__"],
+["."," ","-","default"]);b.foreach(["position","duration","offset"],function(a,b){c[b]&&(c[b]=Math.round(1E3*c[b])/1E3)});return c};b.flashVersion=function(){if(b.isAndroid())return 0;var a=c.plugins,d;try{if("undefined"!==a&&(d=a["Shockwave Flash"]))return parseInt(d.description.replace(/\D+(\d+)\..*/,"$1"))}catch(n){}if("undefined"!=typeof e.ActiveXObject)try{if(d=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"))return parseInt(d.GetVariable("$version").split(" ")[1].split(",")[0])}catch(f){}return 0};
+b.getScriptPath=function(a){for(var b=k.getElementsByTagName("script"),d=0;d<b.length;d++){var c=b[d].src;if(c&&0<=c.indexOf(a))return c.substr(0,c.indexOf(a))}return""};b.deepReplaceKeyName=function(a,d,c){switch(f.utils.typeOf(a)){case "array":for(var e=0;e<a.length;e++)a[e]=f.utils.deepReplaceKeyName(a[e],d,c);break;case "object":b.foreach(a,function(b,g){var e;if(d instanceof Array&&c instanceof Array){if(d.length!=c.length)return;e=d}else e=[d];for(var n=b,k=0;k<e.length;k++)n=n.replace(RegExp(d[k],
+"g"),c[k]);a[n]=f.utils.deepReplaceKeyName(g,d,c);b!=n&&delete a[b]})}return a};var n=b.pluginPathType={ABSOLUTE:0,RELATIVE:1,CDN:2};b.getPluginPathType=function(a){if("string"==typeof a){a=a.split("?")[0];var d=a.indexOf("://");if(0<d)return n.ABSOLUTE;var c=a.indexOf("/");a=b.extension(a);return 0>d&&0>c&&(!a||!isNaN(a))?n.CDN:n.RELATIVE}};b.getPluginName=function(a){return a.replace(/^(.*\/)?([^-]*)-?.*\.(swf|js)$/,"$2")};b.getPluginVersion=function(a){return a.replace(/[^-]*-?([^\.]*).*$/,"$1")};
+b.isYouTube=function(a){return-1<a.indexOf("youtube.com")||-1<a.indexOf("youtu.be")};b.isRtmp=function(a,b){return 0==a.indexOf("rtmp")||"rtmp"==b};b.foreach=function(a,b){var d,c;for(d in a)a.hasOwnProperty(d)&&(c=a[d],b(d,c))};b.isHTTPS=function(){return 0==e.location.href.indexOf("https")};b.repo=function(){var a="http://p.jwpcdn.com/"+f.version.split(/\W/).splice(0,2).join("/")+"/";try{b.isHTTPS()&&(a=a.replace("http://","https://ssl."))}catch(d){}return a}}(jwplayer),function(f){var a="video/",
+k=f.foreach,e={mp4:a+"mp4",vorbis:"audio/ogg",ogg:a+"ogg",webm:a+"webm",aac:"audio/mp4",mp3:"audio/mpeg",hls:"application/vnd.apple.mpegurl"},c={mp4:e.mp4,f4v:e.mp4,m4v:e.mp4,mov:e.mp4,m4a:e.aac,f4a:e.aac,aac:e.aac,mp3:e.mp3,ogv:e.ogg,ogg:e.vorbis,oga:e.vorbis,webm:e.webm,m3u8:e.hls,hls:e.hls},a="video",a={flv:a,f4v:a,mov:a,m4a:a,m4v:a,mp4:a,aac:a,f4a:a,mp3:"sound",smil:"rtmp",m3u8:"hls",hls:"hls"},b=f.extensionmap={};k(c,function(a,c){b[a]={html5:c}});k(a,function(a,c){b[a]||(b[a]={});b[a].flash=
+c});b.types=e;b.mimeType=function(a){var b;k(e,function(c,e){!b&&e==a&&(b=c)});return b};b.extType=function(a){return b.mimeType(c[a])}}(jwplayer.utils),function(f){var a=f.loaderstatus={NEW:0,LOADING:1,ERROR:2,COMPLETE:3},k=document;f.scriptloader=function(e){function c(){d=a.ERROR;h.sendEvent(n.ERROR)}function b(){d=a.COMPLETE;h.sendEvent(n.COMPLETE)}var d=a.NEW,n=jwplayer.events,h=new n.eventdispatcher;f.extend(this,h);this.load=function(){var h=f.scriptloader.loaders[e];if(h&&(h.getStatus()==
+a.NEW||h.getStatus()==a.LOADING))h.addEventListener(n.ERROR,c),h.addEventListener(n.COMPLETE,b);else if(f.scriptloader.loaders[e]=this,d==a.NEW){d=a.LOADING;var p=k.createElement("script");p.addEventListener?(p.onload=b,p.onerror=c):p.readyState&&(p.onreadystatechange=function(){("loaded"==p.readyState||"complete"==p.readyState)&&b()});k.getElementsByTagName("head")[0].appendChild(p);p.src=e}};this.getStatus=function(){return d}};f.scriptloader.loaders={}}(jwplayer.utils),function(f){f.trim=function(a){return a.replace(/^\s*/,
+"").replace(/\s*$/,"")};f.pad=function(a,f,e){for(e||(e="0");a.length<f;)a=e+a;return a};f.xmlAttribute=function(a,f){for(var e=0;e<a.attributes.length;e++)if(a.attributes[e].name&&a.attributes[e].name.toLowerCase()==f.toLowerCase())return a.attributes[e].value.toString();return""};f.extension=function(a){if(!a||"rtmp"==a.substr(0,4))return"";a=a.substring(a.lastIndexOf("/")+1,a.length).split("?")[0].split("#")[0];if(-1<a.lastIndexOf("."))return a.substr(a.lastIndexOf(".")+1,a.length).toLowerCase()};
+f.stringToColor=function(a){a=a.replace(/(#|0x)?([0-9A-F]{3,6})$/gi,"$2");3==a.length&&(a=a.charAt(0)+a.charAt(0)+a.charAt(1)+a.charAt(1)+a.charAt(2)+a.charAt(2));return parseInt(a,16)}}(jwplayer.utils),function(f){f.key=function(a){var k,e,c;this.edition=function(){return c&&c.getTime()<(new Date).getTime()?"invalid":k};this.token=function(){return e};f.exists(a)||(a="");try{a=f.tea.decrypt(a,"36QXq4W@GSBV^teR");var b=a.split("/");(k=b[0])?/^(free|pro|premium|ads)$/i.test(k)?(e=b[1],b[2]&&0<parseInt(b[2])&&
+(c=new Date,c.setTime(String(b[2])))):k="invalid":k="free"}catch(d){k="invalid"}}}(jwplayer.utils),function(f){var a=f.tea={};a.encrypt=function(c,b){if(0==c.length)return"";var d=a.strToLongs(e.encode(c));1>=d.length&&(d[1]=0);for(var n=a.strToLongs(e.encode(b).slice(0,16)),h=d.length,f=d[h-1],p=d[0],q,j=Math.floor(6+52/h),g=0;0<j--;){g+=2654435769;q=g>>>2&3;for(var m=0;m<h;m++)p=d[(m+1)%h],f=(f>>>5^p<<2)+(p>>>3^f<<4)^(g^p)+(n[m&3^q]^f),f=d[m]+=f}d=a.longsToStr(d);return k.encode(d)};a.decrypt=function(c,
+b){if(0==c.length)return"";for(var d=a.strToLongs(k.decode(c)),n=a.strToLongs(e.encode(b).slice(0,16)),h=d.length,f=d[h-1],p=d[0],q,j=2654435769*Math.floor(6+52/h);0!=j;){q=j>>>2&3;for(var g=h-1;0<=g;g--)f=d[0<g?g-1:h-1],f=(f>>>5^p<<2)+(p>>>3^f<<4)^(j^p)+(n[g&3^q]^f),p=d[g]-=f;j-=2654435769}d=a.longsToStr(d);d=d.replace(/\0+$/,"");return e.decode(d)};a.strToLongs=function(a){for(var b=Array(Math.ceil(a.length/4)),d=0;d<b.length;d++)b[d]=a.charCodeAt(4*d)+(a.charCodeAt(4*d+1)<<8)+(a.charCodeAt(4*d+
+2)<<16)+(a.charCodeAt(4*d+3)<<24);return b};a.longsToStr=function(a){for(var b=Array(a.length),d=0;d<a.length;d++)b[d]=String.fromCharCode(a[d]&255,a[d]>>>8&255,a[d]>>>16&255,a[d]>>>24&255);return b.join("")};var k={code:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\x3d",encode:function(a,b){var d,n,h,f,p=[],q="",j,g,m=k.code;g=("undefined"==typeof b?0:b)?e.encode(a):a;j=g.length%3;if(0<j)for(;3>j++;)q+="\x3d",g+="\x00";for(j=0;j<g.length;j+=3)d=g.charCodeAt(j),n=g.charCodeAt(j+
+1),h=g.charCodeAt(j+2),f=d<<16|n<<8|h,d=f>>18&63,n=f>>12&63,h=f>>6&63,f&=63,p[j/3]=m.charAt(d)+m.charAt(n)+m.charAt(h)+m.charAt(f);p=p.join("");return p=p.slice(0,p.length-q.length)+q},decode:function(a,b){b="undefined"==typeof b?!1:b;var d,f,h,r,p,q=[],j,g=k.code;j=b?e.decode(a):a;for(var m=0;m<j.length;m+=4)d=g.indexOf(j.charAt(m)),f=g.indexOf(j.charAt(m+1)),r=g.indexOf(j.charAt(m+2)),p=g.indexOf(j.charAt(m+3)),h=d<<18|f<<12|r<<6|p,d=h>>>16&255,f=h>>>8&255,h&=255,q[m/4]=String.fromCharCode(d,f,
+h),64==p&&(q[m/4]=String.fromCharCode(d,f)),64==r&&(q[m/4]=String.fromCharCode(d));r=q.join("");return b?e.decode(r):r}},e={encode:function(a){a=a.replace(/[\u0080-\u07ff]/g,function(a){a=a.charCodeAt(0);return String.fromCharCode(192|a>>6,128|a&63)});return a=a.replace(/[\u0800-\uffff]/g,function(a){a=a.charCodeAt(0);return String.fromCharCode(224|a>>12,128|a>>6&63,128|a&63)})},decode:function(a){a=a.replace(/[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g,function(a){a=(a.charCodeAt(0)&15)<<12|
+(a.charCodeAt(1)&63)<<6|a.charCodeAt(2)&63;return String.fromCharCode(a)});return a=a.replace(/[\u00c0-\u00df][\u0080-\u00bf]/g,function(a){a=(a.charCodeAt(0)&31)<<6|a.charCodeAt(1)&63;return String.fromCharCode(a)})}}}(jwplayer.utils),function(f){f.events={COMPLETE:"COMPLETE",ERROR:"ERROR",API_READY:"jwplayerAPIReady",JWPLAYER_READY:"jwplayerReady",JWPLAYER_FULLSCREEN:"jwplayerFullscreen",JWPLAYER_RESIZE:"jwplayerResize",JWPLAYER_ERROR:"jwplayerError",JWPLAYER_SETUP_ERROR:"jwplayerSetupError",JWPLAYER_MEDIA_BEFOREPLAY:"jwplayerMediaBeforePlay",
+JWPLAYER_MEDIA_BEFORECOMPLETE:"jwplayerMediaBeforeComplete",JWPLAYER_COMPONENT_SHOW:"jwplayerComponentShow",JWPLAYER_COMPONENT_HIDE:"jwplayerComponentHide",JWPLAYER_MEDIA_BUFFER:"jwplayerMediaBuffer",JWPLAYER_MEDIA_BUFFER_FULL:"jwplayerMediaBufferFull",JWPLAYER_MEDIA_ERROR:"jwplayerMediaError",JWPLAYER_MEDIA_LOADED:"jwplayerMediaLoaded",JWPLAYER_MEDIA_COMPLETE:"jwplayerMediaComplete",JWPLAYER_MEDIA_SEEK:"jwplayerMediaSeek",JWPLAYER_MEDIA_TIME:"jwplayerMediaTime",JWPLAYER_MEDIA_VOLUME:"jwplayerMediaVolume",
+JWPLAYER_MEDIA_META:"jwplayerMediaMeta",JWPLAYER_MEDIA_MUTE:"jwplayerMediaMute",JWPLAYER_MEDIA_LEVELS:"jwplayerMediaLevels",JWPLAYER_MEDIA_LEVEL_CHANGED:"jwplayerMediaLevelChanged",JWPLAYER_CAPTIONS_CHANGED:"jwplayerCaptionsChanged",JWPLAYER_CAPTIONS_LIST:"jwplayerCaptionsList",JWPLAYER_PLAYER_STATE:"jwplayerPlayerState",state:{BUFFERING:"BUFFERING",IDLE:"IDLE",PAUSED:"PAUSED",PLAYING:"PLAYING"},JWPLAYER_PLAYLIST_LOADED:"jwplayerPlaylistLoaded",JWPLAYER_PLAYLIST_ITEM:"jwplayerPlaylistItem",JWPLAYER_PLAYLIST_COMPLETE:"jwplayerPlaylistComplete",
+JWPLAYER_DISPLAY_CLICK:"jwplayerViewClick",JWPLAYER_CONTROLS:"jwplayerViewControls",JWPLAYER_INSTREAM_CLICK:"jwplayerInstreamClicked",JWPLAYER_INSTREAM_DESTROYED:"jwplayerInstreamDestroyed",JWPLAYER_AD_TIME:"jwplayerAdTime",JWPLAYER_AD_ERROR:"jwplayerAdError",JWPLAYER_AD_CLICK:"jwplayerAdClicked",JWPLAYER_AD_COMPLETE:"jwplayerAdComplete",JWPLAYER_AD_IMPRESSION:"jwplayerAdImpression",JWPLAYER_AD_COMPANIONS:"jwplayerAdCompanions"}}(jwplayer),function(f){var a=jwplayer.utils;f.eventdispatcher=function(f,
+e){var c,b;this.resetEventListeners=function(){c={};b=[]};this.resetEventListeners();this.addEventListener=function(b,e,h){try{a.exists(c[b])||(c[b]=[]),"string"==a.typeOf(e)&&(e=(new Function("return "+e))()),c[b].push({listener:e,count:h})}catch(f){a.log("error",f)}return!1};this.removeEventListener=function(b,e){if(c[b]){try{for(var h=0;h<c[b].length;h++)if(c[b][h].listener.toString()==e.toString()){c[b].splice(h,1);break}}catch(f){a.log("error",f)}return!1}};this.addGlobalListener=function(d,
+c){try{"string"==a.typeOf(d)&&(d=(new Function("return "+d))()),b.push({listener:d,count:c})}catch(e){a.log("error",e)}return!1};this.removeGlobalListener=function(d){if(d){try{for(var c=0;c<b.length;c++)if(b[c].listener.toString()==d.toString()){b.splice(c,1);break}}catch(e){a.log("error",e)}return!1}};this.sendEvent=function(d,n){a.exists(n)||(n={});a.extend(n,{id:f,version:jwplayer.version,type:d});e&&a.log(d,n);if("undefined"!=a.typeOf(c[d]))for(var h=0;h<c[d].length;h++){try{c[d][h].listener(n)}catch(r){a.log("There was an error while handling a listener: "+
+r.toString(),c[d][h].listener)}c[d][h]&&(1===c[d][h].count?delete c[d][h]:0<c[d][h].count&&(c[d][h].count-=1))}for(h=0;h<b.length;h++){try{b[h].listener(n)}catch(p){a.log("There was an error while handling a listener: "+p.toString(),b[h].listener)}b[h]&&(1===b[h].count?delete b[h]:0<b[h].count&&(b[h].count-=1))}}}}(jwplayer.events),function(f){var a={},k={};f.plugins=function(){};f.plugins.loadPlugins=function(e,c){k[e]=new f.plugins.pluginloader(new f.plugins.model(a),c);return k[e]};f.plugins.registerPlugin=
+function(e,c,b,d){var n=f.utils.getPluginName(e);a[n]||(a[n]=new f.plugins.plugin(e));a[n].registerPlugin(e,c,b,d)}}(jwplayer),function(f){f.plugins.model=function(a){this.addPlugin=function(k){var e=f.utils.getPluginName(k);a[e]||(a[e]=new f.plugins.plugin(k));return a[e]};this.getPlugins=function(){return a}}}(jwplayer),function(f){var a=jwplayer.utils,k=jwplayer.events;f.pluginmodes={FLASH:0,JAVASCRIPT:1,HYBRID:2};f.plugin=function(e){function c(){switch(a.getPluginPathType(e)){case a.pluginPathType.ABSOLUTE:return e;
+case a.pluginPathType.RELATIVE:return a.getAbsolutePath(e,window.location.href)}}function b(){q=setTimeout(function(){n=a.loaderstatus.COMPLETE;j.sendEvent(k.COMPLETE)},1E3)}function d(){n=a.loaderstatus.ERROR;j.sendEvent(k.ERROR)}var n=a.loaderstatus.NEW,h,r,p,q,j=new k.eventdispatcher;a.extend(this,j);this.load=function(){if(n==a.loaderstatus.NEW)if(0<e.lastIndexOf(".swf"))h=e,n=a.loaderstatus.COMPLETE,j.sendEvent(k.COMPLETE);else if(a.getPluginPathType(e)==a.pluginPathType.CDN)n=a.loaderstatus.COMPLETE,
+j.sendEvent(k.COMPLETE);else{n=a.loaderstatus.LOADING;var g=new a.scriptloader(c());g.addEventListener(k.COMPLETE,b);g.addEventListener(k.ERROR,d);g.load()}};this.registerPlugin=function(b,d,c,e){q&&(clearTimeout(q),q=void 0);p=d;c&&e?(h=e,r=c):"string"==typeof c?h=c:"function"==typeof c?r=c:!c&&!e&&(h=b);n=a.loaderstatus.COMPLETE;j.sendEvent(k.COMPLETE)};this.getStatus=function(){return n};this.getPluginName=function(){return a.getPluginName(e)};this.getFlashPath=function(){if(h)switch(a.getPluginPathType(h)){case a.pluginPathType.ABSOLUTE:return h;
+case a.pluginPathType.RELATIVE:return 0<e.lastIndexOf(".swf")?a.getAbsolutePath(h,window.location.href):a.getAbsolutePath(h,c())}return null};this.getJS=function(){return r};this.getTarget=function(){return p};this.getPluginmode=function(){if("undefined"!=typeof h&&"undefined"!=typeof r)return f.pluginmodes.HYBRID;if("undefined"!=typeof h)return f.pluginmodes.FLASH;if("undefined"!=typeof r)return f.pluginmodes.JAVASCRIPT};this.getNewInstance=function(a,b,d){return new r(a,b,d)};this.getURL=function(){return e}}}(jwplayer.plugins),
+function(f){var a=f.utils,k=f.events,e=a.foreach;f.plugins.pluginloader=function(c,b){function d(){p?g.sendEvent(k.ERROR,{message:q}):r||(r=!0,h=a.loaderstatus.COMPLETE,g.sendEvent(k.COMPLETE))}function n(){j||d();if(!r&&!p){var b=0,e=c.getPlugins();a.foreach(j,function(c){c=a.getPluginName(c);var g=e[c];c=g.getJS();var h=g.getTarget(),g=g.getStatus();if(g==a.loaderstatus.LOADING||g==a.loaderstatus.NEW)b++;else if(c&&(!h||parseFloat(h)>parseFloat(f.version)))p=!0,q="Incompatible player version",d()});
+0==b&&d()}}var h=a.loaderstatus.NEW,r=!1,p=!1,q,j=b,g=new k.eventdispatcher;a.extend(this,g);this.setupPlugins=function(b,d,g){var h={length:0,plugins:{}},m=0,f={},j=c.getPlugins();e(d.plugins,function(c,e){var A=a.getPluginName(c),n=j[A],k=n.getFlashPath(),p=n.getJS(),q=n.getURL();k&&(h.plugins[k]=a.extend({},e),h.plugins[k].pluginmode=n.getPluginmode(),h.length++);try{if(p&&d.plugins&&d.plugins[q]){var r=document.createElement("div");r.id=b.id+"_"+A;r.style.position="absolute";r.style.top=0;r.style.zIndex=
+m+10;f[A]=n.getNewInstance(b,a.extend({},d.plugins[q]),r);m++;b.onReady(g(f[A],r,!0));b.onResize(g(f[A],r))}}catch(E){a.log("ERROR: Failed to load "+A+".")}});b.plugins=f;return h};this.load=function(){if(!(a.exists(b)&&"object"!=a.typeOf(b))){h=a.loaderstatus.LOADING;e(b,function(b){a.exists(b)&&(b=c.addPlugin(b),b.addEventListener(k.COMPLETE,n),b.addEventListener(k.ERROR,m))});var d=c.getPlugins();e(d,function(a,b){b.load()})}n()};var m=this.pluginFailed=function(){p||(p=!0,q="File not found",d())};
+this.getStatus=function(){return h}}}(jwplayer),function(f){f.playlist=function(a){var k=[];if("array"==f.utils.typeOf(a))for(var e=0;e<a.length;e++)k.push(new f.playlist.item(a[e]));else k.push(new f.playlist.item(a));return k}}(jwplayer),function(f){var a=f.item=function(k){var e=jwplayer.utils,c=e.extend({},a.defaults,k);c.tracks=e.exists(k.tracks)?k.tracks:[];0==c.sources.length&&(c.sources=[new f.source(c)]);for(var b=0;b<c.sources.length;b++){var d=c.sources[b]["default"];c.sources[b]["default"]=
+d?"true"==d.toString():!1;c.sources[b]=new f.source(c.sources[b])}if(c.captions&&!e.exists(k.tracks)){for(k=0;k<c.captions.length;k++)c.tracks.push(c.captions[k]);delete c.captions}for(b=0;b<c.tracks.length;b++)c.tracks[b]=new f.track(c.tracks[b]);return c};a.defaults={description:"",image:"",mediaid:"",title:"",sources:[],tracks:[]}}(jwplayer.playlist),function(f){var a=jwplayer.utils,k={file:void 0,label:void 0,type:void 0,"default":void 0};f.source=function(e){var c=a.extend({},k);a.foreach(k,
+function(b){a.exists(e[b])&&(c[b]=e[b],delete e[b])});c.type&&0<c.type.indexOf("/")&&(c.type=a.extensionmap.mimeType(c.type));"m3u8"==c.type&&(c.type="hls");"smil"==c.type&&(c.type="rtmp");return c}}(jwplayer.playlist),function(f){var a=jwplayer.utils,k={file:void 0,label:void 0,kind:"captions","default":!1};f.track=function(e){var c=a.extend({},k);e||(e={});a.foreach(k,function(b){a.exists(e[b])&&(c[b]=e[b],delete e[b])});return c}}(jwplayer.playlist),function(f){var a=f.utils,k=f.events,e=!0,c=
+!1,b=document,d=f.embed=function(n){function h(b,d){a.foreach(d,function(a,d){"function"==typeof b[a]&&b[a].call(b,d)})}function r(a){j(l,B+a.message)}function p(){j(l,B+"No playable sources found")}function q(){j(l,"Adobe SiteCatalyst Error: Could not find Media Module")}function j(b,d){if(m.fallback){var h=b.style;h.backgroundColor="#000";h.color="#FFF";h.width=a.styleDimension(m.width);h.height=a.styleDimension(m.height);h.display="table";h.opacity=1;var h=document.createElement("p"),f=h.style;
+f.verticalAlign="middle";f.textAlign="center";f.display="table-cell";f.font="15px/20px Arial, Helvetica, sans-serif";h.innerHTML=d.replace(":",":\x3cbr\x3e");b.innerHTML="";b.appendChild(h);g(d,e)}else g(d,c)}function g(a,b){x&&(clearTimeout(x),x=null);n.dispatchEvent(k.JWPLAYER_SETUP_ERROR,{message:a,fallback:b})}var m=new d.config(n.config),l,t,u,w=m.width,z=m.height,B="Error loading player: ",y=f.plugins.loadPlugins(n.id,m.plugins),x=null;m.fallbackDiv&&(u=m.fallbackDiv,delete m.fallbackDiv);m.id=
+n.id;t=b.getElementById(n.id);m.aspectratio?n.config.aspectratio=m.aspectratio:delete n.config.aspectratio;l=b.createElement("div");l.id=t.id;l.style.width=0<w.toString().indexOf("%")?w:w+"px";l.style.height=0<z.toString().indexOf("%")?z:z+"px";t.parentNode.replaceChild(l,t);f.embed.errorScreen=j;y.addEventListener(k.COMPLETE,function(){if(m.sitecatalyst)try{null!=s&&s.hasOwnProperty("Media")||q()}catch(b){q();return}if("array"==a.typeOf(m.playlist)&&2>m.playlist.length&&(0==m.playlist.length||!m.playlist[0].sources||
+0==m.playlist[0].sources.length))p();else if(y.getStatus()==a.loaderstatus.COMPLETE){for(var f=0;f<m.modes.length;f++)if(m.modes[f].type&&d[m.modes[f].type]){var j=a.extend({},m),D=new d[m.modes[f].type](l,m.modes[f],j,y,n);if(D.supportsConfig())return D.addEventListener(k.ERROR,r),D.embed(),h(n,j.events),n}if(m.fallback){var t="No suitable players found and fallback enabled";x=setTimeout(function(){g(t,e)},10);a.log(t);new d.download(l,m,p)}else t="No suitable players found and fallback disabled",
+g(t,c),a.log(t),l.parentNode.replaceChild(u,l)}});y.addEventListener(k.ERROR,function(a){j(l,"Could not load plugins: "+a.message)});y.load();return n}}(jwplayer),function(f){function a(a){if(a.playlist)for(var d=0;d<a.playlist.length;d++)a.playlist[d]=new c(a.playlist[d]);else{var f={};e.foreach(c.defaults,function(d){k(a,f,d)});f.sources||(a.levels?(f.sources=a.levels,delete a.levels):(d={},k(a,d,"file"),k(a,d,"type"),f.sources=d.file?[d]:[]));a.playlist=[new c(f)]}}function k(a,d,c){e.exists(a[c])&&
+(d[c]=a[c],delete a[c])}var e=f.utils,c=f.playlist.item;(f.embed.config=function(b){var d={fallback:!0,height:270,primary:"html5",width:480,base:b.base?b.base:e.getScriptPath("jwplayer.js"),aspectratio:""};b=e.extend(d,f.defaults,b);var d={type:"html5",src:b.base+"jwplayer.html5.js"},c={type:"flash",src:b.base+"jwplayer.flash.swf"};b.modes="flash"==b.primary?[c,d]:[d,c];b.listbar&&(b.playlistsize=b.listbar.size,b.playlistposition=b.listbar.position);b.flashplayer&&(c.src=b.flashplayer);b.html5player&&
+(d.src=b.html5player);a(b);c=b.aspectratio;if("string"!=typeof c||!e.exists(c))d=0;else{var h=c.indexOf(":");-1==h?d=0:(d=parseFloat(c.substr(0,h)),c=parseFloat(c.substr(h+1)),d=0>=d||0>=c?0:100*(c/d)+"%")}-1==b.width.toString().indexOf("%")?delete b.aspectratio:d?b.aspectratio=d:delete b.aspectratio;return b}).addConfig=function(b,c){a(c);return e.extend(b,c)}}(jwplayer),function(f){var a=f.utils,k=document;f.embed.download=function(e,c,b){function d(b,c){for(var d=k.querySelectorAll(b),e=0;e<d.length;e++)a.foreach(c,
+function(a,b){d[e].style[a]=b})}function f(a,b,c){a=k.createElement(a);b&&(a.className="jwdownload"+b);c&&c.appendChild(a);return a}var h=a.extend({},c),r=h.width?h.width:480,p=h.height?h.height:320,q;c=c.logo?c.logo:{prefix:a.repo(),file:"logo.png",margin:10};var j,g,m,h=h.playlist,l,t=["mp4","aac","mp3"];if(h&&h.length){l=h[0];q=l.sources;for(h=0;h<q.length;h++){var u=q[h],w=u.type?u.type:a.extensionmap.extType(a.extension(u.file));u.file&&a.foreach(t,function(b){w==t[b]?(j=u.file,g=l.image):a.isYouTube(u.file)&&
+(m=u.file)})}j?(q=j,b=g,e&&(h=f("a","display",e),f("div","icon",h),f("div","logo",h),q&&h.setAttribute("href",a.getAbsolutePath(q))),h="#"+e.id+" .jwdownload",e.style.width="",e.style.height="",d(h+"display",{width:a.styleDimension(Math.max(320,r)),height:a.styleDimension(Math.max(180,p)),background:"black center no-repeat "+(b?"url("+b+")":""),backgroundSize:"contain",position:"relative",border:"none",display:"block"}),d(h+"display div",{position:"absolute",width:"100%",height:"100%"}),d(h+"logo",
+{top:c.margin+"px",right:c.margin+"px",background:"top right no-repeat url("+c.prefix+c.file+")"}),d(h+"icon",{background:"center no-repeat url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAgNJREFUeNrs28lqwkAYB/CZqNVDDj2r6FN41QeIy8Fe+gj6BL275Q08u9FbT8ZdwVfotSBYEPUkxFOoks4EKiJdaDuTjMn3wWBO0V/+sySR8SNSqVRKIR8qaXHkzlqS9jCfzzWcTCYp9hF5o+59sVjsiRzcegSckFzcjT+ruN80TeSlAjCAAXzdJSGPFXRpAAMYwACGZQkSdhG4WCzehMNhqV6vG6vVSrirKVEw66YoSqDb7cqlUilE8JjHd/y1MQefVzqdDmiaJpfLZWHgXMHn8F6vJ1cqlVAkEsGuAn83J4gAd2RZymQygX6/L1erVQt+9ZPWb+CDwcCC2zXGJaewl/DhcHhK3DVj+KfKZrMWvFarcYNLomAv4aPRSFZVlTlcSPA5fDweW/BoNIqFnKV53JvncjkLns/n/cLdS+92O7RYLLgsKfv9/t8XlDn4eDyiw+HA9Jyz2eyt0+kY2+3WFC5hluej0Ha7zQQq9PPwdDq1Et1sNsx/nFBgCqWJ8oAK1aUptNVqcYWewE4nahfU0YQnk4ntUEfGMIU2m01HoLaCKbTRaDgKtaVLk9tBYaBcE/6Artdr4RZ5TB6/dC+9iIe/WgAMYADDpAUJAxjAAAYwgGFZgoS/AtNNTF7Z2bL0BYPBV3Jw5xFwwWcYxgtBP5OkE8i9G7aWGOOCruvauwADALMLMEbKf4SdAAAAAElFTkSuQmCC)"})):
+m?(c=m,e=f("embed","",e),e.src="http://www.youtube.com/v/"+/v=([^&]+)|\/([\w-]+)$|^([\w-]+)$/i.exec(c).slice(1).join(""),e.type="application/x-shockwave-flash",e.width=r,e.height=p):b()}}}(jwplayer),function(f){var a=f.utils,k=f.events,e={};(f.embed.flash=function(c,b,d,n,h){function r(a,b,c){var d=document.createElement("param");d.setAttribute("name",b);d.setAttribute("value",c);a.appendChild(d)}function p(a,b,c){return function(){try{c&&document.getElementById(h.id+"_wrapper").appendChild(b);var d=
+document.getElementById(h.id).getPluginConfig("display");"function"==typeof a.resize&&a.resize(d.width,d.height);b.style.left=d.x;b.style.top=d.h}catch(e){}}}function q(b){if(!b)return{};var c={},d=[];a.foreach(b,function(b,e){var g=a.getPluginName(b);d.push(b);a.foreach(e,function(a,b){c[g+"."+a]=b})});c.plugins=d.join(",");return c}var j=new f.events.eventdispatcher,g=a.flashVersion();a.extend(this,j);this.embed=function(){d.id=h.id;if(10>g)return j.sendEvent(k.ERROR,{message:"Flash version must be 10.0 or greater"}),
+!1;var f,l,t=h.config.listbar,u=a.extend({},d);if(c.id+"_wrapper"==c.parentNode.id)f=document.getElementById(c.id+"_wrapper");else{f=document.createElement("div");l=document.createElement("div");l.style.display="none";l.id=c.id+"_aspect";f.id=c.id+"_wrapper";f.style.position="relative";f.style.display="block";f.style.width=a.styleDimension(u.width);f.style.height=a.styleDimension(u.height);if(h.config.aspectratio){var w=parseFloat(h.config.aspectratio);l.style.display="block";l.style.marginTop=h.config.aspectratio;
+f.style.height="auto";f.style.display="inline-block";t&&("bottom"==t.position?l.style.paddingBottom=t.size+"px":"right"==t.position&&(l.style.marginBottom=-1*t.size*(w/100)+"px"))}c.parentNode.replaceChild(f,c);f.appendChild(c);f.appendChild(l)}f=n.setupPlugins(h,u,p);0<f.length?a.extend(u,q(f.plugins)):delete u.plugins;"undefined"!=typeof u["dock.position"]&&"false"==u["dock.position"].toString().toLowerCase()&&(u.dock=u["dock.position"],delete u["dock.position"]);f=u.wmode?u.wmode:u.height&&40>=
+u.height?"transparent":"opaque";l="height width modes events primary base fallback volume".split(" ");for(t=0;t<l.length;t++)delete u[l[t]];l=a.getCookies();a.foreach(l,function(a,b){"undefined"==typeof u[a]&&(u[a]=b)});l=window.location.href.split("/");l.splice(l.length-1,1);l=l.join("/");u.base=l+"/";e[c.id]=u;a.isIE()?(l='\x3cobject classid\x3d"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" " width\x3d"100%" height\x3d"100%"id\x3d"'+c.id+'" name\x3d"'+c.id+'" tabindex\x3d0""\x3e',l+='\x3cparam name\x3d"movie" value\x3d"'+
+b.src+'"\x3e',l+='\x3cparam name\x3d"allowfullscreen" value\x3d"true"\x3e\x3cparam name\x3d"allowscriptaccess" value\x3d"always"\x3e',l+='\x3cparam name\x3d"seamlesstabbing" value\x3d"true"\x3e',l+='\x3cparam name\x3d"wmode" value\x3d"'+f+'"\x3e',l+='\x3cparam name\x3d"bgcolor" value\x3d"#000000"\x3e',l+="\x3c/object\x3e",c.outerHTML=l,f=document.getElementById(c.id)):(l=document.createElement("object"),l.setAttribute("type","application/x-shockwave-flash"),l.setAttribute("data",b.src),l.setAttribute("width",
+"100%"),l.setAttribute("height","100%"),l.setAttribute("bgcolor","#000000"),l.setAttribute("id",c.id),l.setAttribute("name",c.id),l.setAttribute("tabindex",0),r(l,"allowfullscreen","true"),r(l,"allowscriptaccess","always"),r(l,"seamlesstabbing","true"),r(l,"wmode",f),c.parentNode.replaceChild(l,c),f=l);h.config.aspectratio&&(f.style.position="absolute");h.container=f;h.setPlayer(f,"flash")};this.supportsConfig=function(){if(g)if(d){if("string"==a.typeOf(d.playlist))return!0;try{var b=d.playlist[0].sources;
+if("undefined"==typeof b)return!0;for(var c=0;c<b.length;c++){var e;if(e=b[c].file){var f=b[c].file,h=b[c].type;if(a.isYouTube(f)||a.isRtmp(f,h)||"hls"==h)e=!0;else{var j=a.extensionmap[h?h:a.extension(f)];e=!j?!1:!!j.flash}}if(e)return!0}}catch(k){}}else return!0;return!1}}).getVars=function(a){return e[a]}}(jwplayer),function(f){var a=f.utils,k=a.extensionmap,e=f.events;f.embed.html5=function(c,b,d,n,h){function r(a,b,d){return function(){try{var e=document.querySelector("#"+c.id+" .jwmain");d&&
+e.appendChild(b);"function"==typeof a.resize&&(a.resize(e.clientWidth,e.clientHeight),setTimeout(function(){a.resize(e.clientWidth,e.clientHeight)},400));b.left=e.style.left;b.top=e.style.top}catch(f){}}}function p(a){q.sendEvent(a.type,{message:"HTML5 player not found"})}var q=this,j=new e.eventdispatcher;a.extend(q,j);q.embed=function(){if(f.html5){n.setupPlugins(h,d,r);c.innerHTML="";var g=f.utils.extend({},d);delete g.volume;g=new f.html5.player(g);h.container=document.getElementById(h.id);h.setPlayer(g,
+"html5")}else g=new a.scriptloader(b.src),g.addEventListener(e.ERROR,p),g.addEventListener(e.COMPLETE,q.embed),g.load()};q.supportsConfig=function(){if(f.vid.canPlayType)try{if("string"==a.typeOf(d.playlist))return!0;for(var b=d.playlist[0].sources,c=0;c<b.length;c++){var e;var h=b[c].file,j=b[c].type;if(null!==navigator.userAgent.match(/BlackBerry/i)||a.isAndroid()&&("m3u"==a.extension(h)||"m3u8"==a.extension(h))||a.isRtmp(h,j))e=!1;else{var n=k[j?j:a.extension(h)],p;if(!n||n.flash&&!n.html5)p=!1;
+else{var r=n.html5,q=f.vid;if(r)try{p=q.canPlayType(r)?!0:!1}catch(x){p=!1}else p=!0}e=p}if(e)return!0}}catch(v){}return!1}}}(jwplayer),function(f){var a=f.embed,k=f.utils,e=k.extend(function(c){function b(a){m.debug&&k.log(a)}function d(a){a=a.split("/");a=a[a.length-1];a=a.split("?");return a[0]}function e(){if(!C){var a=c.getPosition();b("stop: "+v+" : "+a);s.Media.stop(v,a)}}function h(a){C=!0;x=0;m.mediaName?a=m.mediaName:(a=c.getPlaylistItem(a.index),a=a.title?a.title:a.file?d(a.file):a.sources&&
+a.sources.length?d(a.sources[0].file):"");v=a;A=m.playerName?m.playerName:c.id}function r(a,b){var c=g.events[a];g.events[a]="function"!=typeof g.events[a]?b:function(a){c&&c(a);b(a)}}var p=k.repo(),q=k.extend({},f.defaults),j=k.extend({},q,c.config),g=c.config,m=g.sitecatalyst,l=j.plugins,t=j.analytics,u=p+"jwpsrv.js",w=p+"sharing.js",z=p+"related.js",B=p+"gapro.js",q=f.key?f.key:q.key,y=(new f.utils.key(q)).edition(),x=0,v="",A="",C=!0,l=l?l:{};"ads"==y&&j.advertising&&(j.advertising.client.match(".js$|.swf$")?
+l[j.advertising.client]=j.advertising:l[p+j.advertising.client+".js"]=j.advertising);delete g.advertising;g.key=q;j.analytics&&(j.analytics.client&&j.analytics.client.match(".js$|.swf$"))&&(u=j.analytics.client);delete g.analytics;if("free"==y||!t||!1!==t.enabled)l[u]=t?t:{};delete l.sharing;delete l.related;switch(y){case "premium":case "ads":j.sharing&&(j.sharing.client&&j.sharing.client.match(".js$|.swf$")&&(w=j.sharing.client),l[w]=j.sharing),j.related&&(j.related.client&&j.related.client.match(".js$|.swf$")&&
+(z=j.related.client),l[z]=j.related),j.ga&&(j.ga.client&&j.ga.client.match(".js$|.swf$")&&(B=j.ga.client),l[B]=j.ga),m&&(g.events=k.extend({},g.events),r("onPlay",function(){if(!C){var a=c.getPosition();b("play: "+v+" : "+a);s.Media.play(v,a)}}),r("onPause",function(){e()}),r("onBuffer",function(){e()}),r("onPlaylistItem",h),r("onTime",function(){a:{if(C){var a=c.getDuration();if(-1==a)break a;C=!1;b("open: "+v+" : "+a+" : "+A);s.Media.open(v,a,A);b("play: "+v+" : 0");s.Media.play(v,0)}a=c.getPosition();
+if(3<=Math.abs(a-x)){var d=x;b("seek: "+d+" to "+a);b("stop: "+v+" : "+d);s.Media.stop(v,d);b("play: "+v+" : "+a);s.Media.play(v,a)}x=a}}),r("onComplete",function(){var a=c.getPosition();b("stop: "+v+" : "+a);s.Media.stop(v,a);b("close: "+v);s.Media.close(v);C=!0;x=0}));case "pro":j.skin&&(g.skin=j.skin.replace(/^(beelden|bekle|five|glow|modieus|roundster|stormtrooper|vapor)$/i,k.repo()+"skins/$1.xml"))}g.plugins=l;return new a(c)},a);f.embed=e}(jwplayer),function(f){var a=[],k=f.utils,e=f.events,
+c=e.state,b=document,d=f.api=function(a){function h(a,b){return function(c){return b(a,c)}}function r(a,b){l[a]||(l[a]=[],q(e.JWPLAYER_PLAYER_STATE,function(b){var c=b.newstate;b=b.oldstate;if(c==a){var d=l[c];if(d)for(var e=0;e<d.length;e++)"function"==typeof d[e]&&d[e].call(this,{oldstate:b,newstate:c})}}));l[a].push(b);return g}function p(a,b){try{a.jwAddEventListener(b,'function(dat) { jwplayer("'+g.id+'").dispatchEvent("'+b+'", dat); }')}catch(c){k.log("Could not add internal listener")}}function q(a,
+b){m[a]||(m[a]=[],t&&u&&p(t,a));m[a].push(b);return g}function j(){if(u){for(var a=arguments[0],b=[],c=1;c<arguments.length;c++)b.push(arguments[c]);if("undefined"!=typeof t&&"function"==typeof t[a])switch(b.length){case 4:return t[a](b[0],b[1],b[2],b[3]);case 3:return t[a](b[0],b[1],b[2]);case 2:return t[a](b[0],b[1]);case 1:return t[a](b[0]);default:return t[a]()}return null}w.push(arguments)}var g=this,m={},l={},t=void 0,u=!1,w=[],z=void 0,B={},y={};g.container=a;g.id=a.id;g.getBuffer=function(){return j("jwGetBuffer")};
+g.getContainer=function(){return g.container};g.addButton=function(a,b,c,d){try{y[d]=c,j("jwDockAddButton",a,b,"jwplayer('"+g.id+"').callback('"+d+"')",d)}catch(e){k.log("Could not add dock button"+e.message)}};g.removeButton=function(a){j("jwDockRemoveButton",a)};g.callback=function(a){if(y[a])y[a]()};g.forceState=function(a){j("jwForceState",a);return g};g.releaseState=function(){return j("jwReleaseState")};g.getDuration=function(){return j("jwGetDuration")};g.getFullscreen=function(){return j("jwGetFullscreen")};
+g.getStretching=function(){return j("jwGetStretching")};g.getHeight=function(){return j("jwGetHeight")};g.getLockState=function(){return j("jwGetLockState")};g.getMeta=function(){return g.getItemMeta()};g.getMute=function(){return j("jwGetMute")};g.getPlaylist=function(){var a=j("jwGetPlaylist");"flash"==g.renderingMode&&k.deepReplaceKeyName(a,["__dot__","__spc__","__dsh__","__default__"],["."," ","-","default"]);return a};g.getPlaylistItem=function(a){k.exists(a)||(a=g.getPlaylistIndex());return g.getPlaylist()[a]};
+g.getPlaylistIndex=function(){return j("jwGetPlaylistIndex")};g.getPosition=function(){return j("jwGetPosition")};g.getRenderingMode=function(){return g.renderingMode};g.getState=function(){return j("jwGetState")};g.getVolume=function(){return j("jwGetVolume")};g.getWidth=function(){return j("jwGetWidth")};g.setFullscreen=function(a){k.exists(a)?j("jwSetFullscreen",a):j("jwSetFullscreen",!j("jwGetFullscreen"));return g};g.setStretching=function(a){j("jwSetStretching",a);return g};g.setMute=function(a){k.exists(a)?
+j("jwSetMute",a):j("jwSetMute",!j("jwGetMute"));return g};g.lock=function(){return g};g.unlock=function(){return g};g.load=function(a){j("jwLoad",a);return g};g.playlistItem=function(a){j("jwPlaylistItem",parseInt(a));return g};g.playlistPrev=function(){j("jwPlaylistPrev");return g};g.playlistNext=function(){j("jwPlaylistNext");return g};g.resize=function(a,c){if("flash"!=g.renderingMode){var d=document.getElementById(g.id);d.className=d.className.replace(/\s+aspectMode/,"");d.style.display="block";
+j("jwResize",a,c)}else{var d=b.getElementById(g.id+"_wrapper"),e=b.getElementById(g.id+"_aspect");e&&(e.style.display="none");d&&(d.style.display="block",d.style.width=k.styleDimension(a),d.style.height=k.styleDimension(c))}return g};g.play=function(a){"undefined"==typeof a?(a=g.getState(),a==c.PLAYING||a==c.BUFFERING?j("jwPause"):j("jwPlay")):j("jwPlay",a);return g};g.pause=function(a){"undefined"==typeof a?(a=g.getState(),a==c.PLAYING||a==c.BUFFERING?j("jwPause"):j("jwPlay")):j("jwPause",a);return g};
+g.stop=function(){j("jwStop");return g};g.seek=function(a){j("jwSeek",a);return g};g.setVolume=function(a){j("jwSetVolume",a);return g};g.loadInstream=function(a,b){return z=new d.instream(this,t,a,b)};g.getQualityLevels=function(){return j("jwGetQualityLevels")};g.getCurrentQuality=function(){return j("jwGetCurrentQuality")};g.setCurrentQuality=function(a){j("jwSetCurrentQuality",a)};g.getCaptionsList=function(){return j("jwGetCaptionsList")};g.getCurrentCaptions=function(){return j("jwGetCurrentCaptions")};
+g.setCurrentCaptions=function(a){j("jwSetCurrentCaptions",a)};g.getControls=function(){return j("jwGetControls")};g.getSafeRegion=function(){return j("jwGetSafeRegion")};g.setControls=function(a){j("jwSetControls",a)};g.destroyPlayer=function(){j("jwPlayerDestroy")};g.playAd=function(a){j("jwPlayAd",a)};var x={onBufferChange:e.JWPLAYER_MEDIA_BUFFER,onBufferFull:e.JWPLAYER_MEDIA_BUFFER_FULL,onError:e.JWPLAYER_ERROR,onSetupError:e.JWPLAYER_SETUP_ERROR,onFullscreen:e.JWPLAYER_FULLSCREEN,onMeta:e.JWPLAYER_MEDIA_META,
+onMute:e.JWPLAYER_MEDIA_MUTE,onPlaylist:e.JWPLAYER_PLAYLIST_LOADED,onPlaylistItem:e.JWPLAYER_PLAYLIST_ITEM,onPlaylistComplete:e.JWPLAYER_PLAYLIST_COMPLETE,onReady:e.API_READY,onResize:e.JWPLAYER_RESIZE,onComplete:e.JWPLAYER_MEDIA_COMPLETE,onSeek:e.JWPLAYER_MEDIA_SEEK,onTime:e.JWPLAYER_MEDIA_TIME,onVolume:e.JWPLAYER_MEDIA_VOLUME,onBeforePlay:e.JWPLAYER_MEDIA_BEFOREPLAY,onBeforeComplete:e.JWPLAYER_MEDIA_BEFORECOMPLETE,onDisplayClick:e.JWPLAYER_DISPLAY_CLICK,onControls:e.JWPLAYER_CONTROLS,onQualityLevels:e.JWPLAYER_MEDIA_LEVELS,
+onQualityChange:e.JWPLAYER_MEDIA_LEVEL_CHANGED,onCaptionsList:e.JWPLAYER_CAPTIONS_LIST,onCaptionsChange:e.JWPLAYER_CAPTIONS_CHANGED,onAdError:e.JWPLAYER_AD_ERROR,onAdClick:e.JWPLAYER_AD_CLICK,onAdImpression:e.JWPLAYER_AD_IMPRESSION,onAdTime:e.JWPLAYER_AD_TIME,onAdComplete:e.JWPLAYER_AD_COMPLETE,onAdCompanions:e.JWPLAYER_AD_COMPANIONS};k.foreach(x,function(a){g[a]=h(x[a],q)});var v={onBuffer:c.BUFFERING,onPause:c.PAUSED,onPlay:c.PLAYING,onIdle:c.IDLE};k.foreach(v,function(a){g[a]=h(v[a],r)});g.remove=
+function(){if(!u)throw"Cannot call remove() before player is ready";w=[];d.destroyPlayer(this.id)};g.setup=function(a){if(f.embed){var c=b.getElementById(g.id);c&&(a.fallbackDiv=c);c=g;w=[];d.destroyPlayer(c.id);c=f(g.id);c.config=a;return new f.embed(c)}return g};g.registerPlugin=function(a,b,c,d){f.plugins.registerPlugin(a,b,c,d)};g.setPlayer=function(a,b){t=a;g.renderingMode=b};g.detachMedia=function(){if("html5"==g.renderingMode)return j("jwDetachMedia")};g.attachMedia=function(a){if("html5"==
+g.renderingMode)return j("jwAttachMedia",a)};g.dispatchEvent=function(a,b){if(m[a])for(var c=k.translateEventResponse(a,b),d=0;d<m[a].length;d++)if("function"==typeof m[a][d])try{a==e.JWPLAYER_PLAYLIST_LOADED&&k.deepReplaceKeyName(c.playlist,["__dot__","__spc__","__dsh__","__default__"],["."," ","-","default"]),m[a][d].call(this,c)}catch(f){k.log("There was an error calling back an event handler")}};g.dispatchInstreamEvent=function(a){z&&z.dispatchEvent(a,arguments)};g.callInternal=j;g.playerReady=
+function(a){u=!0;t||g.setPlayer(b.getElementById(a.id));g.container=b.getElementById(g.id);k.foreach(m,function(a){p(t,a)});q(e.JWPLAYER_PLAYLIST_ITEM,function(){B={}});q(e.JWPLAYER_MEDIA_META,function(a){k.extend(B,a.metadata)});for(g.dispatchEvent(e.API_READY);0<w.length;)j.apply(this,w.shift())};g.getItemMeta=function(){return B};g.isBeforePlay=function(){return t.jwIsBeforePlay()};g.isBeforeComplete=function(){return t.jwIsBeforeComplete()};return g};d.selectPlayer=function(c){var e;k.exists(c)||
+(c=0);c.nodeType?e=c:"string"==typeof c&&(e=b.getElementById(c));return e?(c=d.playerById(e.id))?c:d.addPlayer(new d(e)):"number"==typeof c?a[c]:null};d.playerById=function(b){for(var c=0;c<a.length;c++)if(a[c].id==b)return a[c];return null};d.addPlayer=function(b){for(var c=0;c<a.length;c++)if(a[c]==b)return b;a.push(b);return b};d.destroyPlayer=function(c){for(var d=-1,e,f=0;f<a.length;f++)a[f].id==c&&(d=f,e=a[f]);0<=d&&(c=e.id,f=b.getElementById(c+("flash"==e.renderingMode?"_wrapper":"")),k.clearCss&&
+k.clearCss("#"+c),f&&("html5"==e.renderingMode&&e.destroyPlayer(),e=b.createElement("div"),e.id=c,f.parentNode.replaceChild(e,f)),a.splice(d,1));return null};f.playerReady=function(a){var b=f.api.playerById(a.id);b?b.playerReady(a):f.api.selectPlayer(a.id).playerReady(a)}}(jwplayer),function(f){var a=f.events,k=f.utils,e=a.state;f.api.instream=function(c,b,d,f){function h(a,b){j[a]||(j[a]=[],q.jwInstreamAddEventListener(a,'function(dat) { jwplayer("'+p.id+'").dispatchInstreamEvent("'+a+'", dat); }'));
+j[a].push(b);return this}function r(b,c){g[b]||(g[b]=[],h(a.JWPLAYER_PLAYER_STATE,function(a){var c=a.newstate,d=a.oldstate;if(c==b){var e=g[c];if(e)for(var f=0;f<e.length;f++)"function"==typeof e[f]&&e[f].call(this,{oldstate:d,newstate:c,type:a.type})}}));g[b].push(c);return this}var p=c,q=b,j={},g={};this.dispatchEvent=function(a,b){if(j[a])for(var c=k.translateEventResponse(a,b[1]),d=0;d<j[a].length;d++)"function"==typeof j[a][d]&&j[a][d].call(this,c)};this.onError=function(b){return h(a.JWPLAYER_ERROR,
+b)};this.onFullscreen=function(b){return h(a.JWPLAYER_FULLSCREEN,b)};this.onMeta=function(b){return h(a.JWPLAYER_MEDIA_META,b)};this.onMute=function(b){return h(a.JWPLAYER_MEDIA_MUTE,b)};this.onComplete=function(b){return h(a.JWPLAYER_MEDIA_COMPLETE,b)};this.onTime=function(b){return h(a.JWPLAYER_MEDIA_TIME,b)};this.onBuffer=function(a){return r(e.BUFFERING,a)};this.onPause=function(a){return r(e.PAUSED,a)};this.onPlay=function(a){return r(e.PLAYING,a)};this.onIdle=function(a){return r(e.IDLE,a)};
+this.onClick=function(b){return h(a.JWPLAYER_INSTREAM_CLICK,b)};this.onInstreamDestroyed=function(b){return h(a.JWPLAYER_INSTREAM_DESTROYED,b)};this.play=function(a){q.jwInstreamPlay(a)};this.pause=function(a){q.jwInstreamPause(a)};this.destroy=function(){q.jwInstreamDestroy()};p.callInternal("jwLoadInstream",d,f?f:{})}}(jwplayer),function(f){var a=f.api,k=a.selectPlayer;a.selectPlayer=function(a){return(a=k(a))?a:{registerPlugin:function(a,b,d){f.plugins.registerPlugin(a,b,d)}}}}(jwplayer));
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/jwplayer-version/player.swf b/htmltest/sites/all/libraries/jwplayer-version/player.swf
new file mode 100644
index 00000000..6f9107af
Binary files /dev/null and b/htmltest/sites/all/libraries/jwplayer-version/player.swf differ
diff --git a/htmltest/sites/all/libraries/superfish b/htmltest/sites/all/libraries/superfish
new file mode 120000
index 00000000..5ff5d5a6
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish
@@ -0,0 +1 @@
+Superfish-for-Drupal-1.x/
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/_README.txt b/htmltest/sites/all/libraries/superfish-version/_README.txt
new file mode 100644
index 00000000..afaf396f
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/_README.txt
@@ -0,0 +1,10 @@
+ABOUT:
+------------------------------------------
+This is the Superfish library for the Superfish module of the Drupal CMS.
+http://drupal.org/project/superfish
+
+CHANGELOG:
+------------------------------------------
+Version 1.0, 2011-03-23
+---------------------
+- Initial release.
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/css/superfish-navbar.css b/htmltest/sites/all/libraries/superfish-version/css/superfish-navbar.css
new file mode 100644
index 00000000..1ea1b494
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/css/superfish-navbar.css
@@ -0,0 +1,66 @@
+.sf-navbar,
+.sf-navbar li li {
+  position: relative;
+}
+.sf-navbar li {
+  position: static;
+}
+.sf-navbar li ul,
+.sf-navbar li li li {
+  width: 100%;
+}
+.sf-navbar ul li {
+  width: auto;
+  float: left;
+}
+.sf-navbar ul,
+.sf-navbar .active-trail ul ul {
+  left: 0;
+  top: -99999em;
+}
+.sf-navbar li:focus ul,
+.sf-navbar li:hover ul,
+.sf-navbar li:active ul,
+.sf-navbar li.sfHover ul,
+.sf-navbar li li:focus ul,
+.sf-navbar li li:hover ul,
+.sf-navbar li li:active ul,
+.sf-navbar li li.sfHover ul,
+.sf-navbar .active-trail ul {
+  left: 0;
+  top: 2.5em;
+}
+.sf-navbar ul .sf-sub-indicator {
+  background-position: -10px -100px;
+}
+.sf-navbar ul a > .sf-sub-indicator {
+  background-position: 0 -100px;
+}
+.sf-navbar ul a:focus > .sf-sub-indicator,
+.sf-navbar ul a:hover > .sf-sub-indicator,
+.sf-navbar ul a:active > .sf-sub-indicator,
+.sf-navbar ul li:hover > a > .sf-sub-indicator,
+.sf-navbar ul li.sfHover > a > .sf-sub-indicator {
+  background-position: -10px -100px;
+}
+.sf-navbar ul ul .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-navbar ul ul a > .sf-sub-indicator {
+  background-position: 0 0;
+}
+.sf-navbar ul ul a:focus > .sf-sub-indicator,
+.sf-navbar ul ul a:hover > .sf-sub-indicator,
+.sf-navbar ul ul a:active > .sf-sub-indicator,
+.sf-navbar ul ul li:hover > a > .sf-sub-indicator,
+.sf-navbar ul ul li.sfHover > a > .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-navbar > li > ul {
+  background: transparent;
+  padding: 0;
+  -moz-border-radius-bottomleft: 0;
+  -moz-border-radius-topright: 0;
+  -webkit-border-top-right-radius: 0;
+  -webkit-border-bottom-left-radius: 0;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/css/superfish-vertical.css b/htmltest/sites/all/libraries/superfish-version/css/superfish-vertical.css
new file mode 100644
index 00000000..ad5e6c90
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/css/superfish-vertical.css
@@ -0,0 +1,24 @@
+.sf-vertical,
+.sf-vertical li {
+  width: 12em;
+}
+.sf-vertical li:focus ul,
+.sf-vertical li:hover ul,
+.sf-vertical li:active ul,
+.sf-vertical li.sfHover ul {
+  left: 12em;
+  top: 0;
+}
+.sf-vertical .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-vertical a > .sf-sub-indicator {
+  background-position: 0 0;
+}
+.sf-vertical a:focus > .sf-sub-indicator,
+.sf-vertical a:hover > .sf-sub-indicator,
+.sf-vertical a:active > .sf-sub-indicator,
+.sf-vertical li:hover > a > .sf-sub-indicator,
+.sf-vertical li.sfHover > a > .sf-sub-indicator {
+  background-position: -10px 0;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/css/superfish.css b/htmltest/sites/all/libraries/superfish-version/css/superfish.css
new file mode 100644
index 00000000..31f94755
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/css/superfish.css
@@ -0,0 +1,202 @@
+.sf-menu,
+.sf-menu * {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.sf-menu {
+  line-height: 1.0;
+  z-index: 497;
+}
+.sf-menu ul {
+  position: absolute;
+  top: -99999em;
+  width: 12em;
+}
+.sf-menu ul li {
+  width: 100%;
+}
+.sf-menu li:hover {
+  visibility: inherit;
+}
+.sf-menu li {
+  float: left;
+  position: relative;
+  z-index: 498;
+}
+.sf-menu a {
+  display: block;
+  position: relative;
+}
+.sf-menu li:hover,
+.sf-menu li.sfHover,
+.sf-menu li:hover ul,
+.sf-menu li.sfHover ul {
+  z-index: 499;
+}
+.sf-menu li:hover ul,
+.sf-menu li.sfHover ul {
+  left: 0;
+  top: 2.5em;
+}
+.sf-menu li:hover li ul,
+.sf-menu li.sfHover li ul,
+.sf-menu li li:hover li ul,
+.sf-menu li li.sfHover li ul {
+  top: -99999em;
+}
+.sf-menu li li:hover ul,
+.sf-menu li li.sfHover ul,
+.sf-menu li li li:hover ul,
+.sf-menu li li li.sfHover ul {
+  left: 12em;
+  top: 0;
+}
+.sf-menu a.sf-with-ul {
+  min-width: 1px;
+}
+.sf-sub-indicator {
+  background: url('../images/arrows-ffffff.png') no-repeat -10px -100px;
+  display: block;
+  height: 10px;
+  overflow: hidden;
+  position: absolute;
+  right: 0.75em;
+  text-indent: -999em;
+  top: 1.05em;
+  width: 10px;
+}
+a > .sf-sub-indicator {
+  top: 0.8em;
+  background-position: 0 -100px;
+}
+a:focus > .sf-sub-indicator,
+a:hover > .sf-sub-indicator,
+a:active > .sf-sub-indicator,
+li:hover > a > .sf-sub-indicator,
+li.sfHover > a > .sf-sub-indicator {
+  background-position: -10px -100px;
+}
+.sf-menu ul .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-menu ul a > .sf-sub-indicator {
+  background-position: 0 0;
+}
+.sf-menu ul a:focus > .sf-sub-indicator,
+.sf-menu ul a:hover > .sf-sub-indicator,
+.sf-menu ul a:active > .sf-sub-indicator,
+.sf-menu ul li:hover > a > .sf-sub-indicator,
+.sf-menu ul li.sfHover > a > .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-shadow ul {
+  background: url('../images/shadow.png') no-repeat bottom right;
+  padding: 0 8px 9px 0;
+  -moz-border-radius-bottomleft: 17px;
+  -moz-border-radius-topright: 17px;
+  -webkit-border-top-right-radius: 17px;
+  -webkit-border-bottom-left-radius: 17px;
+}
+.sf-shadow ul.sf-shadow-off {
+  background: transparent;
+}
+.sf-menu.rtl,
+.sf-menu.rtl li {
+  float: right;
+}
+.sf-menu.rtl li:hover ul,
+.sf-menu.rtl li.sfHover ul {
+  right: 0;
+}
+.sf-menu.rtl li li:hover ul,
+.sf-menu.rtl li li.sfHover ul,
+.sf-menu.rtl li li li:hover ul,
+.sf-menu.rtl li li li.sfHover ul {
+  right: 12em;
+}
+.sf-menu.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.rtl .sf-sub-indicator {
+  left: 0.75em;
+  right: auto;
+  background: url('../images/arrows-ffffff-rtl.png') no-repeat -10px -100px;
+}
+.sf-menu.rtl a > .sf-sub-indicator {
+  top: 0.8em;
+  background-position: -10px -100px;
+}
+.sf-menu.rtl a:focus > .sf-sub-indicator,
+.sf-menu.rtl a:hover > .sf-sub-indicator,
+.sf-menu.rtl a:active > .sf-sub-indicator,
+.sf-menu.rtl li:hover > a > .sf-sub-indicator,
+.sf-menu.rtl li.sfHover > a > .sf-sub-indicator {
+  background-position: 0 -100px;
+}
+.sf-menu.rtl ul .sf-sub-indicator {
+  background-position: 0 0;
+}
+.sf-menu.rtl ul a > .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-menu.rtl ul a:focus > .sf-sub-indicator,
+.sf-menu.rtl ul a:hover > .sf-sub-indicator,
+.sf-menu.rtl ul a:active > .sf-sub-indicator,
+.sf-menu.rtl ul li:hover > a > .sf-sub-indicator,
+.sf-menu.rtl ul li.sfHover > a > .sf-sub-indicator {
+  background-position: 0 0;
+}
+.sf-navbar.rtl li li:hover ul,
+.sf-navbar.rtl li li.sfHover ul {
+  right: 0;
+}
+.sf-navbar.rtl li li li:hover ul,
+.sf-navbar.rtl li li li.sfHover ul {
+  right: 12em;
+}
+.sf-vertical.rtl li:hover ul,
+.sf-vertical.rtl li.sfHover ul {
+  left: auto;
+  right: 12em;
+}
+.sf-navbar.rtl ul .sf-sub-indicator {
+  background-position: 0 -100px;
+}
+.sf-navbar.rtl ul a > .sf-sub-indicator {
+  background-position: -10px -100px;
+}
+.sf-navbar.rtl ul a:focus > .sf-sub-indicator,
+.sf-navbar.rtl ul a:hover > .sf-sub-indicator,
+.sf-navbar.rtl ul a:active > .sf-sub-indicator,
+.sf-navbar.rtl ul li:hover > a > .sf-sub-indicator,
+.sf-navbar.rtl ul li.sfHover > a > .sf-sub-indicator {
+  background-position: 0 -100px;
+}
+.sf-navbar.rtl ul ul .sf-sub-indicator {
+  background-position:  0 0;
+}
+.sf-navbar.rtl ul ul a > .sf-sub-indicator {
+  background-position:  -10px 0;
+}
+.sf-navbar.rtl ul ul a:focus > .sf-sub-indicator,
+.sf-navbar.rtl ul ul a:hover > .sf-sub-indicator,
+.sf-navbar.rtl ul ul a:active > .sf-sub-indicator,
+.sf-navbar.rtl ul ul li:hover > a > .sf-sub-indicator,
+.sf-navbar.rtl ul ul li.sfHover > a > .sf-sub-indicator {
+  background-position: 0 0;
+}
+.sf-vertical.rtl .sf-sub-indicator {
+  background-position: -10px 0;
+}
+.sf-vertical.rtl a > .sf-sub-indicator {
+  background-position: 0 0;
+}
+.sf-vertical.rtl a:focus > .sf-sub-indicator,
+.sf-vertical.rtl a:hover > .sf-sub-indicator,
+.sf-vertical.rtl a:active > .sf-sub-indicator,
+.sf-vertical.rtl li:hover > a > .sf-sub-indicator,
+.sf-vertical.rtl li.sfHover > a > .sf-sub-indicator {
+  background-position: -10px 0;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/images/arrows-777777-rtl.png b/htmltest/sites/all/libraries/superfish-version/images/arrows-777777-rtl.png
new file mode 100644
index 00000000..3e5757fd
Binary files /dev/null and b/htmltest/sites/all/libraries/superfish-version/images/arrows-777777-rtl.png differ
diff --git a/htmltest/sites/all/libraries/superfish-version/images/arrows-777777.png b/htmltest/sites/all/libraries/superfish-version/images/arrows-777777.png
new file mode 100644
index 00000000..92f2571e
Binary files /dev/null and b/htmltest/sites/all/libraries/superfish-version/images/arrows-777777.png differ
diff --git a/htmltest/sites/all/libraries/superfish-version/images/arrows-ffffff-rtl.png b/htmltest/sites/all/libraries/superfish-version/images/arrows-ffffff-rtl.png
new file mode 100644
index 00000000..f4637907
Binary files /dev/null and b/htmltest/sites/all/libraries/superfish-version/images/arrows-ffffff-rtl.png differ
diff --git a/htmltest/sites/all/libraries/superfish-version/images/arrows-ffffff.png b/htmltest/sites/all/libraries/superfish-version/images/arrows-ffffff.png
new file mode 100644
index 00000000..4d34b389
Binary files /dev/null and b/htmltest/sites/all/libraries/superfish-version/images/arrows-ffffff.png differ
diff --git a/htmltest/sites/all/libraries/superfish-version/images/shadow.png b/htmltest/sites/all/libraries/superfish-version/images/shadow.png
new file mode 100644
index 00000000..d8badfa4
Binary files /dev/null and b/htmltest/sites/all/libraries/superfish-version/images/shadow.png differ
diff --git a/htmltest/sites/all/libraries/superfish-version/jquery.bgiframe.min.js b/htmltest/sites/all/libraries/superfish-version/jquery.bgiframe.min.js
new file mode 100644
index 00000000..8fab87aa
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/jquery.bgiframe.min.js
@@ -0,0 +1,6 @@
+/* Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net)
+ * Licensed under the MIT License (LICENSE.txt).
+ *
+ * Version 2.1.2
+ */
+(function(a){a.fn.bgiframe=(a.browser.msie&&/msie 6\.0/i.test(navigator.userAgent)?function(d){d=a.extend({top:"auto",left:"auto",width:"auto",height:"auto",opacity:true,src:"javascript:false;"},d);var c='<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+d.src+'"style="display:block;position:absolute;z-index:-1;'+(d.opacity!==false?"filter:Alpha(Opacity='0');":"")+"top:"+(d.top=="auto"?"expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+'px')":b(d.top))+";left:"+(d.left=="auto"?"expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+'px')":b(d.left))+";width:"+(d.width=="auto"?"expression(this.parentNode.offsetWidth+'px')":b(d.width))+";height:"+(d.height=="auto"?"expression(this.parentNode.offsetHeight+'px')":b(d.height))+';"/>';return this.each(function(){if(a(this).children("iframe.bgiframe").length===0){this.insertBefore(document.createElement(c),this.firstChild)}})}:function(){return this});a.fn.bgIframe=a.fn.bgiframe;function b(c){return c&&c.constructor===Number?c+"px":c}})(jQuery);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/jquery.hoverIntent.minified.js b/htmltest/sites/all/libraries/superfish-version/jquery.hoverIntent.minified.js
new file mode 100644
index 00000000..bd16bbfb
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/jquery.hoverIntent.minified.js
@@ -0,0 +1,9 @@
+/**
+* hoverIntent r6 // 2011.02.26 // jQuery 1.5.1+
+* <http://cherne.net/brian/resources/jquery.hoverIntent.html>
+* 
+* @param  f  onMouseOver function || An object with configuration options
+* @param  g  onMouseOut function  || Nothing (use configuration options object)
+* @author    Brian Cherne brian(at)cherne(dot)net
+*/
+(function($){$.fn.hoverIntent=function(f,g){var cfg={sensitivity:7,interval:100,timeout:0};cfg=$.extend(cfg,g?{over:f,out:g}:f);var cX,cY,pX,pY;var track=function(ev){cX=ev.pageX;cY=ev.pageY};var compare=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);if((Math.abs(pX-cX)+Math.abs(pY-cY))<cfg.sensitivity){$(ob).unbind("mousemove",track);ob.hoverIntent_s=1;return cfg.over.apply(ob,[ev])}else{pX=cX;pY=cY;ob.hoverIntent_t=setTimeout(function(){compare(ev,ob)},cfg.interval)}};var delay=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);ob.hoverIntent_s=0;return cfg.out.apply(ob,[ev])};var handleHover=function(e){var ev=jQuery.extend({},e);var ob=this;if(ob.hoverIntent_t){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t)}if(e.type=="mouseenter"){pX=ev.pageX;pY=ev.pageY;$(ob).bind("mousemove",track);if(ob.hoverIntent_s!=1){ob.hoverIntent_t=setTimeout(function(){compare(ev,ob)},cfg.interval)}}else{$(ob).unbind("mousemove",track);if(ob.hoverIntent_s==1){ob.hoverIntent_t=setTimeout(function(){delay(ev,ob)},cfg.timeout)}}};return this.bind('mouseenter',handleHover).bind('mouseleave',handleHover)}})(jQuery);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/sftouchscreen.js b/htmltest/sites/all/libraries/superfish-version/sftouchscreen.js
new file mode 100644
index 00000000..bedc6e98
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/sftouchscreen.js
@@ -0,0 +1,40 @@
+/*
+ * sf-Touchscreen v1.0b - Provides touchscreen compatibility for the jQuery Superfish plugin. - LAST UPDATE: MARCH 23rd, 2011
+ *
+ * Developer's notes:
+ * Built as a part of the Superfish project for Drupal (http://drupal.org/project/superfish) 
+ * Found any bug? have any cool ideas? contact me right away! http://drupal.org/user/619294/contact
+ *
+ * jQuery version: 1.3.x or higher.
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+*/
+
+(function($){
+  $.fn.sftouchscreen = function() {
+    // Return original object to support chaining.
+    return this.each( function() {
+      // Select hyperlinks from parent menu items.
+      $(this).find('li > ul').closest('li').children('a').each( function() {
+	    var $item = $(this);
+        // No .toggle() here as it's not possible to reset it.
+        $item.click( function(event){
+	      // Already clicked? proceed to the URI.
+          if ($item.hasClass('sf-clicked')) {
+            var $uri = $item.attr('href');
+            window.location = $uri;
+          }
+          else {
+            event.preventDefault();
+            $item.addClass('sf-clicked');
+          }
+        }).closest('li').mouseleave( function(){
+          // So, we reset everything.
+          $item.removeClass('sf-clicked');
+        });
+	  });
+    });
+  };
+})(jQuery);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/style/blue.css b/htmltest/sites/all/libraries/superfish-version/style/blue.css
new file mode 100644
index 00000000..7795b891
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/style/blue.css
@@ -0,0 +1,107 @@
+.sf-menu.sf-style-blue {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-blue.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-blue ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-blue a {
+  border: 1px outset #003973;
+  color: #ffffff;
+  padding: 0.75em 1em;
+  white-space: nowrap;
+}
+.sf-menu.sf-style-blue a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-blue.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-blue.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-blue span.sf-description {
+  color: #13a;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-blue li,
+.sf-menu.sf-style-blue.sf-navbar {
+  background: #095cb1;
+}
+.sf-menu.sf-style-blue li li {
+  background: #0151a4;
+}
+.sf-menu.sf-style-blue li li li {
+  background: #00478f;
+}
+.sf-menu.sf-style-blue li:hover,
+.sf-menu.sf-style-blue li.sfHover,
+.sf-menu.sf-style-blue li.active a,
+.sf-menu.sf-style-blue a:focus,
+.sf-menu.sf-style-blue a:hover,
+.sf-menu.sf-style-blue a:active,
+.sf-menu.sf-style-blue.sf-navbar li li {
+  background: #3270c5;
+  color: #ffea00;
+}
+.sf-menu.sf-style-blue.sf-navbar li ul {
+  background-color: #3270c5;
+}
+.sf-menu.sf-style-blue.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-blue ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-blue ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+	margin: 0;
+	padding: 0;
+}
+.sf-menu.sf-style-blue ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+	font-weight: bold;
+}
+.sf-menu.sf-style-blue ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	display: inline;
+	float: left;
+	width: 12em;
+}
+.sf-menu.sf-style-blue.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	float: right;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-1 ul.sf-megamenu {
+	width: 12em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-2 ul.sf-megamenu {
+	width: 24em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-3 ul.sf-megamenu {
+	width: 36em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-4 ul.sf-megamenu {
+	width: 48em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-5 ul.sf-megamenu {
+	width: 60em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-6 ul.sf-megamenu {
+	width: 72em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-7 ul.sf-megamenu {
+	width: 84em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-8 ul.sf-megamenu {
+	width: 96em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-9 ul.sf-megamenu {
+	width: 108em;
+}
+.sf-menu.sf-style-blue li.sf-parent-children-10 ul.sf-megamenu {
+	width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/style/coffee.css b/htmltest/sites/all/libraries/superfish-version/style/coffee.css
new file mode 100644
index 00000000..255ac2d3
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/style/coffee.css
@@ -0,0 +1,108 @@
+.sf-menu.sf-style-coffee {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-coffee.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-coffee ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-coffee a {
+  border: 1px solid #381301;
+  color: #f1dec6;
+  font-weight: bold;
+  padding: 0.75em 1em;
+  white-space: nowrap;
+}
+.sf-menu.sf-style-coffee a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-coffee.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-coffee.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-coffee span.sf-description {
+  color: #13a;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-coffee li,
+.sf-menu.sf-style-coffee.sf-navbar {
+  background: #210c02;
+}
+.sf-menu.sf-style-coffee li li {
+  background: #290f03;
+}
+.sf-menu.sf-style-coffee li li li {
+  background: #311304;
+}
+.sf-menu.sf-style-coffee li:hover,
+.sf-menu.sf-style-coffee li.sfHover,
+.sf-menu.sf-style-coffee li.active a,
+.sf-menu.sf-style-coffee a:focus,
+.sf-menu.sf-style-coffee a:hover,
+.sf-menu.sf-style-coffee a:active,
+.sf-menu.sf-style-coffee.sf-navbar li li {
+  background: #52250f;
+  color: #ffffff;
+}
+.sf-menu.sf-style-coffee.sf-navbar li ul {
+  background-color: #52250f;
+}
+.sf-menu.sf-style-coffee.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-coffee ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-coffee ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+	margin: 0;
+	padding: 0;
+}
+.sf-menu.sf-style-coffee ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+	font-weight: bold;
+}
+.sf-menu.sf-style-coffee ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	display: inline;
+	float: left;
+	width: 12em;
+}
+.sf-menu.sf-style-coffee.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	float: right;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-1 ul.sf-megamenu {
+	width: 12em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-2 ul.sf-megamenu {
+	width: 24em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-3 ul.sf-megamenu {
+	width: 36em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-4 ul.sf-megamenu {
+	width: 48em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-5 ul.sf-megamenu {
+	width: 60em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-6 ul.sf-megamenu {
+	width: 72em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-7 ul.sf-megamenu {
+	width: 84em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-8 ul.sf-megamenu {
+	width: 96em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-9 ul.sf-megamenu {
+	width: 108em;
+}
+.sf-menu.sf-style-coffee li.sf-parent-children-10 ul.sf-megamenu {
+	width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/style/default.css b/htmltest/sites/all/libraries/superfish-version/style/default.css
new file mode 100644
index 00000000..32e3e523
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/style/default.css
@@ -0,0 +1,100 @@
+.sf-menu.sf-style-default {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-default.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-default ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-default a {
+  border-left: 1px solid #fff;
+  border-top: 1px solid #CFDEFF;
+  padding: 0.75em 1em;
+  text-decoration: none;
+}
+.sf-menu.sf-style-default a,
+.sf-menu.sf-style-default a:visited  {
+  color: #13a;
+}
+.sf-menu.sf-style-default a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-default.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-default span.sf-description {
+  color: #13a;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-default li,
+.sf-menu.sf-style-default.sf-navbar {
+  background: #BDD2FF;
+}
+.sf-menu.sf-style-default li li {
+  background: #AABDE6;
+}
+.sf-menu.sf-style-default li li li {
+  background: #9AAEDB;
+}
+.sf-menu.sf-style-default li:hover,
+.sf-menu.sf-style-default li.sfHover,
+.sf-menu.sf-style-default a:focus,
+.sf-menu.sf-style-default a:hover,
+.sf-menu.sf-style-default a:active {
+  background: #CFDEFF;
+  outline: 0;
+}
+.sf-menu.sf-style-default ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-default ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+	margin: 0;
+	padding: 0;
+}
+.sf-menu.sf-style-default ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+	font-weight: bold;
+}
+.sf-menu.sf-style-default ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	display: inline;
+	float: left;
+	width: 12em;
+}
+.sf-menu.sf-style-default.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	float: right;
+}
+.sf-menu.sf-style-default li.sf-parent-children-1 ul.sf-megamenu {
+	width: 12em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-2 ul.sf-megamenu {
+	width: 24em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-3 ul.sf-megamenu {
+	width: 36em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-4 ul.sf-megamenu {
+	width: 48em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-5 ul.sf-megamenu {
+	width: 60em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-6 ul.sf-megamenu {
+	width: 72em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-7 ul.sf-megamenu {
+	width: 84em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-8 ul.sf-megamenu {
+	width: 96em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-9 ul.sf-megamenu {
+	width: 108em;
+}
+.sf-menu.sf-style-default li.sf-parent-children-10 ul.sf-megamenu {
+	width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/style/light-blue.css b/htmltest/sites/all/libraries/superfish-version/style/light-blue.css
new file mode 100644
index 00000000..adbe2c90
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/style/light-blue.css
@@ -0,0 +1,113 @@
+.sf-menu.sf-style-light-blue {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-light-blue.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-light-blue ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-light-blue a {
+  border: 1px solid #b7d5f3;
+  color: #00305f;
+  padding: 0.75em 1em;
+  white-space: nowrap;
+}
+.sf-menu.sf-style-light-blue a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-light-blue.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-light-blue.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-light-blue span.sf-description {
+  color: #13a;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-light-blue li,
+.sf-menu.sf-style-light-blue.sf-navbar {
+  background: #d9ecff;
+}
+.sf-menu.sf-style-light-blue li li {
+  background: #d1e8ff;
+}
+.sf-menu.sf-style-light-blue li li li {
+  background: #c6e3ff;
+}
+.sf-menu.sf-style-light-blue li:hover,
+.sf-menu.sf-style-light-blue li.sfHover,
+.sf-menu.sf-style-light-blue li.active a,
+.sf-menu.sf-style-light-blue a:focus,
+.sf-menu.sf-style-light-blue a:hover,
+.sf-menu.sf-style-light-blue a:active,
+.sf-menu.sf-style-light-blue.sf-navbar li li {
+  background: #b5d8fa;
+  color: #001020;
+}
+.sf-menu.sf-style-light-blue.sf-navbar li ul {
+  background-color: #b5d8fa;
+}
+.sf-menu.sf-style-light-blue.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-light-blue .sf-sub-indicator {
+  background-image: url('../../images/arrows-ffffff.png');
+}
+.sf-menu.rtl.sf-style-light-blue .sf-sub-indicator {
+  background-image: url('../../images/arrows-ffffff-rtl.png');
+}
+.sf-menu.sf-style-light-blue ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-light-blue ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+	margin: 0;
+	padding: 0;
+}
+.sf-menu.sf-style-light-blue ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+	font-weight: bold;
+}
+.sf-menu.sf-style-light-blue ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	display: inline;
+	float: left;
+	width: 12em;
+}
+.sf-menu.sf-style-light-blue.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	float: right;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-1 ul.sf-megamenu {
+	width: 12em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-2 ul.sf-megamenu {
+	width: 24em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-3 ul.sf-megamenu {
+	width: 36em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-4 ul.sf-megamenu {
+	width: 48em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-5 ul.sf-megamenu {
+	width: 60em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-6 ul.sf-megamenu {
+	width: 72em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-7 ul.sf-megamenu {
+	width: 84em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-8 ul.sf-megamenu {
+	width: 96em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-9 ul.sf-megamenu {
+	width: 108em;
+}
+.sf-menu.sf-style-light-blue li.sf-parent-children-10 ul.sf-megamenu {
+	width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/style/pomegranate.css b/htmltest/sites/all/libraries/superfish-version/style/pomegranate.css
new file mode 100644
index 00000000..829a29cf
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/style/pomegranate.css
@@ -0,0 +1,107 @@
+.sf-menu.sf-style-pomegranate {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-pomegranate.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-pomegranate ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-pomegranate a {
+  border: 1px outset #68000e;
+  color: #ffebee;
+  padding: 0.75em 1em;
+  white-space: nowrap;
+}
+.sf-menu.sf-style-pomegranate a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-pomegranate.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-pomegranate.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-pomegranate span.sf-description {
+  color: #13a;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-pomegranate li,
+.sf-menu.sf-style-pomegranate.sf-navbar {
+  background: #79001c;
+}
+.sf-menu.sf-style-pomegranate li li{
+  background: #6c0019;
+}
+.sf-menu.sf-style-pomegranate li li li {
+  background: #5f0016;
+}
+.sf-menu.sf-style-pomegranate li:hover,
+.sf-menu.sf-style-pomegranate li.sfHover,
+.sf-menu.sf-style-pomegranate li.active a,
+.sf-menu.sf-style-pomegranate a:focus,
+.sf-menu.sf-style-pomegranate a:hover,
+.sf-menu.sf-style-pomegranate a:active,
+.sf-menu.sf-style-pomegranate.sf-navbar li li {
+  background: #4c0012;
+  color: #ffffff;
+}
+.sf-menu.sf-style-pomegranate.sf-navbar li ul {
+  background-color: #4c0012;
+}
+.sf-menu.sf-style-pomegranate.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-pomegranate ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-pomegranate ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+	margin: 0;
+	padding: 0;
+}
+.sf-menu.sf-style-pomegranate ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+	font-weight: bold;
+}
+.sf-menu.sf-style-pomegranate ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	display: inline;
+	float: left;
+	width: 12em;
+}
+.sf-menu.sf-style-pomegranate.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	float: right;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-1 ul.sf-megamenu {
+	width: 12em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-2 ul.sf-megamenu {
+	width: 24em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-3 ul.sf-megamenu {
+	width: 36em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-4 ul.sf-megamenu {
+	width: 48em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-5 ul.sf-megamenu {
+	width: 60em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-6 ul.sf-megamenu {
+	width: 72em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-7 ul.sf-megamenu {
+	width: 84em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-8 ul.sf-megamenu {
+	width: 96em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-9 ul.sf-megamenu {
+	width: 108em;
+}
+.sf-menu.sf-style-pomegranate li.sf-parent-children-10 ul.sf-megamenu {
+	width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/style/space-orange.css b/htmltest/sites/all/libraries/superfish-version/style/space-orange.css
new file mode 100644
index 00000000..b8844df5
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/style/space-orange.css
@@ -0,0 +1,103 @@
+.sf-menu.sf-style-space-orange {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-space-orange.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-space-orange ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-space-orange a {
+  border: 1px outset #000000;
+  color: #f1f1f1;
+  padding: 0.75em 1em;
+  white-space: nowrap;
+}
+.sf-menu.sf-style-space-orange a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-space-orange.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-space-orange.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-space-orange span.sf-description {
+  color: #13a;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-space-orange li,
+.sf-menu.sf-style-space-orange li li,
+.sf-menu.sf-style-space-orange li li li,
+.sf-menu.sf-style-space-orange.sf-navbar {
+  background: #333333;
+}
+.sf-menu.sf-style-space-orange li:hover,
+.sf-menu.sf-style-space-orange li.sfHover,
+.sf-menu.sf-style-space-orange li.active a,
+.sf-menu.sf-style-space-orange a:focus,
+.sf-menu.sf-style-space-orange a:hover,
+.sf-menu.sf-style-space-orange a:active,
+.sf-menu.sf-style-space-orange.sf-navbar li li {
+  background: #dc5300;
+  color: #ffffff;
+}
+.sf-menu.sf-style-space-orange.sf-navbar li ul {
+  background-color: #dc5300;
+}
+.sf-menu.sf-style-space-orange.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-space-orange ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-space-orange ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+	margin: 0;
+	padding: 0;
+}
+.sf-menu.sf-style-space-orange ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+	font-weight: bold;
+}
+.sf-menu.sf-style-space-orange ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	display: inline;
+	float: left;
+	width: 12em;
+}
+.sf-menu.sf-style-space.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	float: right;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-1 ul.sf-megamenu {
+	width: 12em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-2 ul.sf-megamenu {
+	width: 24em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-3 ul.sf-megamenu {
+	width: 36em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-4 ul.sf-megamenu {
+	width: 48em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-5 ul.sf-megamenu {
+	width: 60em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-6 ul.sf-megamenu {
+	width: 72em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-7 ul.sf-megamenu {
+	width: 84em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-8 ul.sf-megamenu {
+	width: 96em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-9 ul.sf-megamenu {
+	width: 108em;
+}
+.sf-menu.sf-style-space-orange li.sf-parent-children-10 ul.sf-megamenu {
+	width: 120em;
+} 
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/style/space-teal.css b/htmltest/sites/all/libraries/superfish-version/style/space-teal.css
new file mode 100644
index 00000000..73a4d358
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/style/space-teal.css
@@ -0,0 +1,103 @@
+.sf-menu.sf-style-space-teal {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-space-teal.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-space-teal ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-space-teal a {
+  border: 1px outset #000000;
+  color: #f1f1f1;
+  padding: 0.75em 1em;
+  white-space: nowrap;
+}
+.sf-menu.sf-style-space-teal a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-space-teal.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-space-teal.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-space-teal span.sf-description {
+  color: #13a;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-space-teal li,
+.sf-menu.sf-style-space-teal li li,
+.sf-menu.sf-style-space-teal li li li,
+.sf-menu.sf-style-space-teal.sf-navbar {
+  background: #333333;
+}
+.sf-menu.sf-style-space-teal li:hover,
+.sf-menu.sf-style-space-teal li.sfHover,
+.sf-menu.sf-style-space-teal li.active a,
+.sf-menu.sf-style-space-teal a:focus,
+.sf-menu.sf-style-space-teal a:hover,
+.sf-menu.sf-style-space-teal a:active,
+.sf-menu.sf-style-space-teal.sf-navbar li li {
+  background: #08997f;
+  color: #ffffff;
+}
+.sf-menu.sf-style-space-teal.sf-navbar li ul {
+  background-color: #08997f;
+}
+.sf-menu.sf-style-space-teal.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-space-teal ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-space-teal ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+	margin: 0;
+	padding: 0;
+}
+.sf-menu.sf-style-space-teal ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+	font-weight: bold;
+}
+.sf-menu.sf-style-space-teal ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	display: inline;
+	float: left;
+	width: 12em;
+}
+.sf-menu.sf-style-space-teal.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	float: right;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-1 ul.sf-megamenu {
+	width: 12em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-2 ul.sf-megamenu {
+	width: 24em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-3 ul.sf-megamenu {
+	width: 36em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-4 ul.sf-megamenu {
+	width: 48em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-5 ul.sf-megamenu {
+	width: 60em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-6 ul.sf-megamenu {
+	width: 72em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-7 ul.sf-megamenu {
+	width: 84em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-8 ul.sf-megamenu {
+	width: 96em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-9 ul.sf-megamenu {
+	width: 108em;
+}
+.sf-menu.sf-style-space-teal li.sf-parent-children-10 ul.sf-megamenu {
+	width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/style/space.css b/htmltest/sites/all/libraries/superfish-version/style/space.css
new file mode 100644
index 00000000..53d8759b
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/style/space.css
@@ -0,0 +1,103 @@
+.sf-menu.sf-style-space {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-space.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-space ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-space a {
+  border: 1px outset #000000;
+  color: #f1f1f1;
+  padding: 0.75em 1em;
+  white-space: nowrap;
+}
+.sf-menu.sf-style-space a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-space.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-space.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-space span.sf-description {
+  color: #13a;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-space li,
+.sf-menu.sf-style-space li li,
+.sf-menu.sf-style-space li li li,
+.sf-menu.sf-style-space.sf-navbar {
+  background: #333333;
+}
+.sf-menu.sf-style-space li:hover,
+.sf-menu.sf-style-space li.sfHover,
+.sf-menu.sf-style-space li.active a,
+.sf-menu.sf-style-space a:focus,
+.sf-menu.sf-style-space a:hover,
+.sf-menu.sf-style-space a:active,
+.sf-menu.sf-style-space.sf-navbar li li {
+  background: #008ad2;
+  color: #ffffff;
+}
+.sf-menu.sf-style-space.sf-navbar li ul {
+  background-color: #008ad2;
+}
+.sf-menu.sf-style-space.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-space ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-space ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+	margin: 0;
+	padding: 0;
+}
+.sf-menu.sf-style-space ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+	font-weight: bold;
+}
+.sf-menu.sf-style-space ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	display: inline;
+	float: left;
+	width: 12em;
+}
+.sf-menu.sf-style-space.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	float: right;
+}
+.sf-menu.sf-style-space li.sf-parent-children-1 ul.sf-megamenu {
+	width: 12em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-2 ul.sf-megamenu {
+	width: 24em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-3 ul.sf-megamenu {
+	width: 36em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-4 ul.sf-megamenu {
+	width: 48em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-5 ul.sf-megamenu {
+	width: 60em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-6 ul.sf-megamenu {
+	width: 72em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-7 ul.sf-megamenu {
+	width: 84em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-8 ul.sf-megamenu {
+	width: 96em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-9 ul.sf-megamenu {
+	width: 108em;
+}
+.sf-menu.sf-style-space li.sf-parent-children-10 ul.sf-megamenu {
+	width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/style/spring.css b/htmltest/sites/all/libraries/superfish-version/style/spring.css
new file mode 100644
index 00000000..815be07f
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/style/spring.css
@@ -0,0 +1,112 @@
+.sf-menu.sf-style-spring {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-spring.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-spring ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-spring a {
+  border: 1px solid #ffffff;
+  color: #37731f;
+  padding: 0.75em 1em;
+  white-space: nowrap;
+}
+.sf-menu.sf-style-spring a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-spring.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-spring.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-spring span.sf-description {
+  color: #13a;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-spring li,
+.sf-menu.sf-style-spring.sf-navbar {
+  background: #ecffdf;
+}
+.sf-menu.sf-style-spring li li {
+  background: #eaffdb;
+}
+.sf-menu.sf-style-spring li li li {
+  background: #daf8c5;
+}
+.sf-menu.sf-style-spring li:hover,
+.sf-menu.sf-style-spring li.sfHover,
+.sf-menu.sf-style-spring li.active a,
+.sf-menu.sf-style-spring a:focus,
+.sf-menu.sf-style-spring a:hover,
+.sf-menu.sf-style-spring a:active,
+.sf-menu.sf-style-spring.sf-navbar li li {
+  background: #bff6a9;
+}
+.sf-menu.sf-style-spring.sf-navbar li ul {
+  background-color: #bff6a9;
+}
+.sf-menu.sf-style-spring.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-spring .sf-sub-indicator {
+  background-image: url('../../images/arrows-777777.png');
+}
+.sf-menu.sf-style-spring.rtl .sf-sub-indicator {
+  background-image: url('../../images/arrows-777777-rtl.png');
+}
+.sf-menu.sf-style-spring ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-spring ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+	margin: 0;
+	padding: 0;
+}
+.sf-menu.sf-style-spring ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+	font-weight: bold;
+}
+.sf-menu.sf-style-spring ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	display: inline;
+	float: left;
+	width: 12em;
+}
+.sf-menu.sf-style-spring.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	float: right;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-1 ul.sf-megamenu {
+	width: 12em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-2 ul.sf-megamenu {
+	width: 24em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-3 ul.sf-megamenu {
+	width: 36em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-4 ul.sf-megamenu {
+	width: 48em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-5 ul.sf-megamenu {
+	width: 60em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-6 ul.sf-megamenu {
+	width: 72em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-7 ul.sf-megamenu {
+	width: 84em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-8 ul.sf-megamenu {
+	width: 96em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-9 ul.sf-megamenu {
+	width: 108em;
+}
+.sf-menu.sf-style-spring li.sf-parent-children-10 ul.sf-megamenu {
+	width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/style/white.css b/htmltest/sites/all/libraries/superfish-version/style/white.css
new file mode 100644
index 00000000..3a6d2613
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/style/white.css
@@ -0,0 +1,112 @@
+.sf-menu.sf-style-white {
+  float: left;
+  margin-bottom: 1em;
+  padding: 0;
+}
+.sf-menu.sf-style-white.sf-navbar {
+  width: 100%;
+}
+.sf-menu.sf-style-white ul {
+  padding-left: 0;
+}
+.sf-menu.sf-style-white a {
+  border: 1px solid #e1e1e1;
+  color: #555555;
+  padding: 0.75em 1em;
+  white-space: nowrap;
+}
+.sf-menu.sf-style-white a.sf-with-ul {
+  padding-right: 2.25em;
+}
+.sf-menu.sf-style-white.rtl a.sf-with-ul {
+  padding-left: 2.25em;
+  padding-right: 1em;
+}
+.sf-menu.sf-style-white.sf-navbar a {
+  border: 0;
+}
+.sf-menu.sf-style-white span.sf-description {
+  color: #13a;
+  display: block;
+  font-size: 0.8em;
+  line-height: 1.5em;
+  margin: 5px 0 0 5px;
+  padding: 0;
+}
+.sf-menu.sf-style-white li,
+.sf-menu.sf-style-white.sf-navbar {
+  background: #f9f9f9;
+}
+.sf-menu.sf-style-white li li {
+  background: #f7f7f7;
+}
+.sf-menu.sf-style-white li li li {
+  background: #f5f5f5;
+}
+.sf-menu.sf-style-white li:hover,
+.sf-menu.sf-style-white li.sfHover,
+.sf-menu.sf-style-white li.active a,
+.sf-menu.sf-style-white a:focus,
+.sf-menu.sf-style-white a:hover,
+.sf-menu.sf-style-white a:active,
+.sf-menu.sf-style-white.sf-navbar li li {
+  background: #e9e9e9;
+}
+.sf-menu.sf-style-white.sf-navbar li ul {
+  background-color: #e9e9e9;
+}
+.sf-menu.sf-style-white.sf-navbar li ul li ul {
+  background-color: transparent;
+}
+.sf-menu.sf-style-white .sf-sub-indicator {
+  background-image: url('../../images/arrows-777777.png');
+}
+.sf-menu.sf-style-white.rtl .sf-sub-indicator {
+  background-image: url('../../images/arrows-777777-rtl.png');
+}
+.sf-menu.sf-style-white ul.sf-megamenu li.sf-megamenu-wrapper ol,
+.sf-menu.sf-style-white ul.sf-megamenu li.sf-megamenu-wrapper ol li {
+	margin: 0;
+	padding: 0;
+}
+.sf-menu.sf-style-white ul.sf-megamenu li.sf-megamenu-wrapper a.menuparent {
+	font-weight: bold;
+}
+.sf-menu.sf-style-white ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	display: inline;
+	float: left;
+	width: 12em;
+}
+.sf-menu.sf-style-white.rtl ul.sf-megamenu li.sf-megamenu-wrapper ol li.sf-megamenu-column {
+	float: right;
+}
+.sf-menu.sf-style-white li.sf-parent-children-1 ul.sf-megamenu {
+	width: 12em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-2 ul.sf-megamenu {
+	width: 24em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-3 ul.sf-megamenu {
+	width: 36em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-4 ul.sf-megamenu {
+	width: 48em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-5 ul.sf-megamenu {
+	width: 60em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-6 ul.sf-megamenu {
+	width: 72em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-7 ul.sf-megamenu {
+	width: 84em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-8 ul.sf-megamenu {
+	width: 96em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-9 ul.sf-megamenu {
+	width: 108em;
+}
+.sf-menu.sf-style-white li.sf-parent-children-10 ul.sf-megamenu {
+	width: 120em;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/superfish.js b/htmltest/sites/all/libraries/superfish-version/superfish.js
new file mode 100644
index 00000000..25eface6
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/superfish.js
@@ -0,0 +1,118 @@
+/*
+ * Superfish v1.4.8 - jQuery menu widget
+ * Copyright (c) 2008 Joel Birch
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ *
+ * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
+ */
+
+(function($){
+  $.fn.superfish = function(op){
+    var sf = $.fn.superfish,
+      c = sf.c,
+      $arrow = $(['<span class="',c.arrowClass,'"> &#187;</span>'].join('')),
+      over = function(){
+        var $$ = $(this), menu = getMenu($$);
+        clearTimeout(menu.sfTimer);
+        $$.showSuperfishUl().siblings().hideSuperfishUl();
+      },
+      out = function(){
+        var $$ = $(this), menu = getMenu($$), o = sf.op;
+        clearTimeout(menu.sfTimer);
+        menu.sfTimer=setTimeout(function(){
+          o.retainPath=($.inArray($$[0],o.$path)>-1);
+          $$.hideSuperfishUl();
+          if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
+        },o.delay);
+      },
+      getMenu = function($menu){
+        var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
+        sf.op = sf.o[menu.serial];
+        return menu;
+      },
+      addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); };
+
+    return this.each(function() {
+      var s = this.serial = sf.o.length;
+      var o = $.extend({},sf.defaults,op);
+      o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
+        $(this).addClass([o.hoverClass,c.bcClass].join(' '))
+          .filter('li:has(ul)').removeClass(o.pathClass);
+      });
+      sf.o[s] = sf.op = o;
+
+      $('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() {
+        if (o.autoArrows) addArrow( $('>a:first-child',this) );
+      })
+      .not('.'+c.bcClass)
+        .hideSuperfishUl();
+
+      var $a = $('a',this);
+      $a.each(function(i){
+        var $li = $a.eq(i).parents('li');
+        $a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
+      });
+      o.onInit.call(this);
+
+    }).each(function() {
+      var menuClasses = [c.menuClass];
+      if (sf.op.dropShadows  && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass);
+      $(this).addClass(menuClasses.join(' '));
+    });
+  };
+
+  var sf = $.fn.superfish;
+  sf.o = [];
+  sf.op = {};
+  sf.IE7fix = function(){
+    var o = sf.op;
+    if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined)
+      this.toggleClass(sf.c.shadowClass+'-off');
+    };
+  sf.c = {
+    bcClass: 'sf-breadcrumb',
+    menuClass: 'sf-js-enabled',
+    anchorClass: 'sf-with-ul',
+    arrowClass: 'sf-sub-indicator',
+    shadowClass: 'sf-shadow'
+  };
+  sf.defaults = {
+    hoverClass: 'sfHover',
+    pathClass: 'overideThisToUse',
+    pathLevels: 1,
+    delay: 800,
+    animation: {opacity:'show'},
+    speed: 'normal',
+    autoArrows: true,
+    dropShadows: true,
+    disableHI: false, // true disables hoverIntent detection
+    onInit: function(){}, // callback functions
+    onBeforeShow: function(){},
+    onShow: function(){},
+    onHide: function(){}
+  };
+  $.fn.extend({
+    hideSuperfishUl : function(){
+      var o = sf.op,
+        not = (o.retainPath===true) ? o.$path : '';
+      o.retainPath = false;
+      var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
+          .find('>ul').hide().css('visibility','hidden');
+      o.onHide.call($ul);
+      return this;
+    },
+    showSuperfishUl : function(){
+      var o = sf.op,
+        sh = sf.c.shadowClass+'-off',
+        $ul = this.addClass(o.hoverClass)
+          .find('>ul:hidden').css('visibility','visible');
+      sf.IE7fix.call($ul);
+      o.onBeforeShow.call($ul);
+      $ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); });
+      return this;
+    }
+  });
+})(jQuery);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/supersubs.js b/htmltest/sites/all/libraries/superfish-version/supersubs.js
new file mode 100644
index 00000000..b4233726
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/supersubs.js
@@ -0,0 +1,95 @@
+/*
+ * Supersubs v0.2b - jQuery plugin - LAST UPDATE: MARCH 23rd, 2011
+ * Copyright (c) 2008 Joel Birch
+ *
+ * Jan 16th, 2011 - Modified a little in order to work with NavBar menus as well.
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ *
+ * This plugin automatically adjusts submenu widths of suckerfish-style menus to that of
+ * their longest list item children. If you use this, please expect bugs and report them
+ * to the jQuery Google Group with the word 'Superfish' in the subject line.
+ *
+ */
+
+(function($){ // $ will refer to jQuery within this closure
+
+  $.fn.supersubs = function(options){
+    var opts = $.extend({}, $.fn.supersubs.defaults, options);
+	// return original object to support chaining
+    return this.each(function() {
+      // cache selections
+      var $$ = $(this);
+      // support metadata
+      var o = $.meta ? $.extend({}, opts, $$.data()) : opts;
+      // get the font size of menu.
+      // .css('fontSize') returns various results cross-browser, so measure an em dash instead
+      var fontsize = $('<li id="menu-fontsize">&#8212;</li>').css({
+        'padding' : 0,
+        'position' : 'absolute',
+        'top' : '-99999em',
+        'width' : 'auto'
+      }).appendTo($$).width(); //clientWidth is faster, but was incorrect here
+      // remove em dash
+      $('#menu-fontsize').remove();
+
+      // Jump on level if it's a "NavBar"
+      if ($$.hasClass('sf-navbar')) {
+        $$ = $('li > ul', $$);
+      }
+      // cache all ul elements 
+      $ULs = $$.find('ul:not(.sf-megamenu)');
+      // loop through each ul in menu
+      $ULs.each(function(i) {
+        // cache this ul
+        var $ul = $ULs.eq(i);
+        // get all (li) children of this ul
+        var $LIs = $ul.children();
+        // get all anchor grand-children
+        var $As = $LIs.children('a');
+        // force content to one line and save current float property
+        var liFloat = $LIs.css('white-space','nowrap').css('float');
+        // remove width restrictions and floats so elements remain vertically stacked
+        var emWidth = $ul.add($LIs).add($As).css({
+          'float' : 'none',
+          'width'  : 'auto'
+        })
+        // this ul will now be shrink-wrapped to longest li due to position:absolute
+        // so save its width as ems. Clientwidth is 2 times faster than .width() - thanks Dan Switzer
+        .end().end()[0].clientWidth / fontsize;
+        // add more width to ensure lines don't turn over at certain sizes in various browsers
+        emWidth += o.extraWidth;
+        // restrict to at least minWidth and at most maxWidth
+        if (emWidth > o.maxWidth)    { emWidth = o.maxWidth; }
+        else if (emWidth < o.minWidth)  { emWidth = o.minWidth; }
+        emWidth += 'em';
+        // set ul to width in ems
+        $ul.css('width',emWidth);
+        // restore li floats to avoid IE bugs
+        // set li width to full width of this ul
+        // revert white-space to normal
+        $LIs.css({
+          'float' : liFloat,
+          'width' : '100%',
+          'white-space' : 'normal'
+        })
+        // update offset position of descendant ul to reflect new width of parent
+        .each(function(){
+          var $childUl = $('>ul',this);
+          var offsetDirection = $childUl.css('left')!==undefined ? 'left' : 'right';
+          $childUl.css(offsetDirection,emWidth);
+        });
+      });
+
+    });
+  };
+  // expose defaults
+  $.fn.supersubs.defaults = {
+    minWidth: 9, // requires em unit.
+    maxWidth: 25, // requires em unit.
+    extraWidth: 0 // extra width can ensure lines don't sometimes turn over due to slight browser differences in how they round-off values
+  };
+
+})(jQuery); // plugin code ends
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/superfish-version/supposition.js b/htmltest/sites/all/libraries/superfish-version/supposition.js
new file mode 100644
index 00000000..f58811fe
--- /dev/null
+++ b/htmltest/sites/all/libraries/superfish-version/supposition.js
@@ -0,0 +1,82 @@
+/*
+* Supposition v0.2 - an optional enhancer for Superfish jQuery menu widget - LAST UPDATE: MARCH 23rd, 2011
+*
+* Copyright (c) 2008 Joel Birch - based mostly on work by Jesse Klaasse and credit goes largely to him.
+* Special thanks to Karl Swedberg for valuable input.
+* 
+* Dec 28th, 2010 - Modified for the Superfish project for Drupal (http://drupal.org/project/superfish)
+*
+* jQuery version: 1.3.x or higher.
+*
+* Dual licensed under the MIT and GPL licenses:
+* 	http://www.opensource.org/licenses/mit-license.php
+* 	http://www.gnu.org/licenses/gpl.html
+*/
+
+(function($){
+  $.fn.supposition = function(){
+    var $w = $(window), /*do this once instead of every onBeforeShow call*/
+    _offset = function(dir) {
+      return window[dir == 'y' ? 'pageYOffset' : 'pageXOffset']
+      || document.documentElement && document.documentElement[dir=='y' ? 'scrollTop' : 'scrollLeft']
+      || document.body[dir=='y' ? 'scrollTop' : 'scrollLeft'];
+    },
+    onHide = function(){
+      this.css({Top:'',Right:'',Bottom:'',Left:''});
+    },
+    onBeforeShow = function(){
+      this.each(function(){
+        var $u = $(this);
+        $u.css('display','block');
+        var menuWidth = $u.width(),
+        menuParentWidth = $u.closest('li').outerWidth(true),
+        menuParentLeft = $u.closest('li').offset().left,
+        totalRight = $w.width() + _offset('x'),
+        menuRight = $u.offset().left + menuWidth,
+        exactMenuWidth = (menuRight > (menuParentWidth + menuParentLeft)) ? menuWidth - (menuRight - (menuParentWidth + menuParentLeft)) : menuWidth;  
+        if ($u.parents('.sf-js-enabled').hasClass('rtl')) {
+          if (menuParentLeft < exactMenuWidth) {
+            $u.css('left', menuParentWidth + 'px');
+            $u.css('right', 'auto');
+          }
+        }
+        else {
+          if (menuRight > totalRight && menuParentLeft > menuWidth) {
+            $u.css('right', menuParentWidth + 'px');
+            $u.css('left', 'auto');
+          }
+        }
+        var windowHeight = $w.height(),
+        offsetTop = $u.offset().top,
+        menuParentHeight = $u.parent().outerHeight(true),
+        menuHeight = $u.height(),
+        baseline = windowHeight + _offset('y');
+        var expandUp = ((offsetTop + menuHeight > baseline) && (offsetTop > menuHeight));
+        if (expandUp) {
+          $u.css('bottom', menuParentHeight + 'px');
+          $u.css('top', 'auto');
+        }
+        $u.css('display','none');
+      });
+    };
+
+    return this.each(function() {
+    var o = $.fn.superfish.o[this.serial]; /* get this menu's options */
+
+    /* if callbacks already set, store them */
+    var _onBeforeShow = o.onBeforeShow,
+    _onHide = o.onHide;
+
+    $.extend($.fn.superfish.o[this.serial],{
+    onBeforeShow: function() {
+    onBeforeShow.call(this); /* fire our Supposition callback */
+    _onBeforeShow.call(this); /* fire stored callbacks */
+    },
+    onHide: function() {
+    onHide.call(this); /* fire our Supposition callback */
+    _onHide.call(this); /* fire stored callbacks */
+    }
+    });
+    });
+  };
+})(jQuery);
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/tcpdf b/htmltest/sites/all/libraries/tcpdf
new file mode 120000
index 00000000..5ea4e3f1
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf
@@ -0,0 +1 @@
+tcpdf-version
\ No newline at end of file
diff --git a/htmltest/sites/all/libraries/tcpdf-version/CHANGELOG.TXT b/htmltest/sites/all/libraries/tcpdf-version/CHANGELOG.TXT
new file mode 100644
index 00000000..6585c2fe
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/CHANGELOG.TXT
@@ -0,0 +1,2660 @@
+6.0.038 (2013-10-06)
+	- Bug #841 "Division by zero warning at writeHTML a <li> tag" was fixed.
+
+6.0.037 (2013-09-30)
+	- Method getAllSpotColors() was added to return all spot colors.
+	- Method colorRegistrationBar() was extended to automatically print all spot colors and support individual spot colors.
+	- The method registrationMarkCMYK() was added to print a registration mark for CMYK colors.
+	- A bug related to page groups was fixed.
+	- Gradient() method now supports CMYK equivalents of spot colors.
+	- Example n. 56 was updated.
+
+6.0.036 (2013-09-29)
+	- Methods for registration bars and crop marks were extended to support registration color (see example n. 56).
+	- New default spot colors were added to tcpdf_colors.php, including the 'All' and 'None' special registration colors.
+
+6.0.035 (2013-09-25)
+	- TCPDF_PARSER class was improved.
+
+6.0.034 (2013-09-24)
+	- Bug #839 "Error in xref parsing in mixed newline chars" was fixed.
+
+6.0.033 (2013-09-23)
+	- Bug fix related to PNG image transparency using GD library.
+
+6.0.032 (2013-09-23)
+	- Bug #838 "Fatal error when imagick cannot handle the image, even though GD is available and can" was fixed.
+
+6.0.031 (2013-09-18)
+	- Bug #836 "Optional EOL marker before endstream" was fixed.
+	- Some additional controls were added to avoid "division by zero" error with badly formatted input.
+
+6.0.030 (2013-09-17)
+	- Bug #835 "PDF417 and Cyrilic simbols" was fixed.
+
+6.0.029 (2013-09-15)
+	- Constants K_TCPDF_PARSER_THROW_EXCEPTION_ERROR and K_TCPDF_PARSER_IGNORE_DECODING_ERRORS where removed in favor of a new configuration array in the TCPDF_PARSER class.
+	- The TCPDF_PARSER class can now be configured using the new $cfg parameter.
+
+6.0.028 (2013-09-15)
+	- A debug print_r was removed form tcpdf_parser.php.
+	- TCPDF_FILTERS class now throws an exception in case of error.
+	- TCPDF_PARSER class now throws an exception in case of error unless you define the constant K_TCPDF_PARSER_THROW_EXCEPTION_ERROR to false.
+	- The constant K_TCPDF_PARSER_IGNORE_DECODING_ERRORS can be set to tru eto ignore decoding errors on TCPDF_PARSER.
+
+6.0.027 (2013-09-14)
+	- A bug in tcpdf_parser wen parsing hexadecimal strings was fixed.
+	- A bug in tcpdf_parser wen looking for statxref was fixed.
+	- A bug on RC4 encryption was fixed.
+
+6.0.026 (2013-09-14)
+	- A bug in tcpdf_parser wen decoding streams was fixed.
+
+6.0.025 (2013-09-04)
+	- A pregSplit() bug was fixed.
+	- Improved content loading from URLs.
+	- Improved font path loading.
+
+6.0.024 (2013-09-02)
+	- Bug #826 "addEmptySignatureAppearance issue" was fixed.
+
+6.0.023 (2013-08-05)
+	- GNU Freefont fonts were updated.
+	- Licensing and copyright information about fonts were improved.
+	- PNG image support was improved.
+
+6.0.022 (2013-08-02)
+	- fixing initialization problem for signature_appearance property.
+
+6.0.021 (2013-07-18)
+	- The bug caused by the preg_split function on some PHP 5.2.x versions was fixed.
+
+6.0.020 (2013-06-04)
+	- The method addTTFfont() was fixed (Bug item #813 Undefined offset).
+
+6.0.019 (2013-06-04)
+	- The magic constant __DIR__ was replaced with dirname(__FILE__) for php 5.2 compatibility.
+	- The exceptions raised by file_exists() function were suppressed.
+
+6.0.018 (2013-05-19)
+	- The barcode examples were changed to automatically search for the barcode class path (in case the examples directory is not installed under the TCPDF root).
+
+6.0.017 (2013-05-16)
+	- The command line tool tcpdf_addfont.php was improved.
+	- The php logic was removed from configuration files that now contains only constant defines.
+	- The tcpdf_autoconfig.php file was added to automatically set missing configuration values.
+
+6.0.016 (2013-05-15)
+	- The tcpdf_addfont.php tool was improved (thanks to Remi Collet).
+	- Constant K_PATH_IMAGES is now automatically set in configuration file.
+
+6.0.015 (2013-05-14)
+	- Some unused vars were removed from AddFont() method.
+	- Some directories were moved inside the examples directory.
+	- All examples were updated to reflect the new default structure.
+	- Source code were clean-up up to be more compatible with system packaging.
+	- Files encodings and permissions were reset.
+	- The command line tool tcpdf_addfont.php was added on the tools directory.
+
+6.0.014 (2013-04-13)
+	- The signature of addTTFfont() method includes a new parameter to link existing fonts instead of copying and compressing them.
+
+6.0.013 (2013-04-10)
+	- Add support for SVG dx and dy text/tspan attributes.
+	- replace require() with require_once().
+	- fix some minor typos on documentation.
+	- fix a problem when deleting all pages.
+
+6.0.012 (2013-04-24)
+	- An error condition in addHtmlLink() method was fixed (bug #799).
+
+6.0.011 (2013-04-22)
+	- Minor documentation changes.
+
+6.0.010 (2013-04-03)
+	- The method Rect() was fixed to print borders correctly.
+
+6.0.009 (2013-04-02)
+	- Adding back some files that were not properly committed on the latest release.
+
+6.0.008 (2013-04-01)
+	- Duplicated encoding maps was removed from tcpdf_font_data.php.
+	- Fixing bug on AddTTFFont().
+
+6.0.007 (2013-03-29)
+	- HTML/CSS font size conversion were improved.
+
+6.0.006 (2013-03-27)
+	- Bug related to SVG and EPS files on xobjects were fixed.
+
+6.0.005 (2013-03-26)
+	- Default font path was fixed.
+
+6.0.004 (2013-03-21)
+	- Return value of addTTFfont() method was fixed.
+
+6.0.003 (2013-03-20)
+	- A bug related to non-unicode mode was fixed.
+
+6.0.002 (2013-03-18)
+	- _getFIXED call on tcpdf_fonts.php was fixed.
+
+6.0.001 (2013-03-18)
+	- Fixed $uni_type call on tcpdf.php.
+
+6.0.000 (2013-03-17)
+	- IMPORTANT: PHP4 support has been removed starting from this version.
+	- Several TCPDF methods and vars were moved to new class files: tcpdf_static.php, tcpdf_colors.php, tcpdf_images.php, tcpdf_font_data.php, tcpdf_fonts.php.
+	- Files htmlcolors.php, spotcolors.php, unicode_data.php and ecodings_maps.php were removed.
+	- Barcode classes were renamed and new barcode examples were added.
+	- Class TCPDF_PARSER was improved.
+
+********************************************************************************
+
+5.9.209 (2013-03-15)
+	- Image method was improved.
+
+5.9.208 (2013-03-15)
+	- objclone fuction was patched to support old imagick extensions.
+	- tcpdf_parser was improved to support Cross-Reference Streams and large streams.
+
+5.9.207 (2013-03-04)
+	- Datamatrix class was fixed (a debug echo was removed).
+
+5.9.206 (2013-02-22)
+	- Bug item #754 "PNG with alpha channel becomes gray scale" was fixed.
+	- Minor documentation fixes.
+
+5.9.205 (2013-02-06)
+	- The constant K_TCPDF_THROW_EXCEPTION_ERROR was added on configuration file to change the behavior of Error() method.
+	- PDF417 barcode bug was fixed.
+
+5.9.204 (2013-01-23)
+	- The method Bookmark() was extended to include named destinations, URLs, internal links or embedded files (see example n. 15).
+	- automatic path calculation on configuration file was fixed.
+	- Error() method was extended to throw new Exception if PHP > 5.
+
+5.9.203 (2013-01-22)
+	- Horizontal position of radiobuttons and checkboxes was adjusted.
+
+5.9.202 (2012-12-16)
+	- Vertical space problem after table was fixed.
+
+5.9.201 (2012-12-10)
+	- First 256 chars are now always included on font subset to overcome a problem reported on the forum.
+
+5.9.200 (2012-12-05)
+	- Bug item #768 "Rowspan with Pagebreak error" was fixed.
+	- Page regions now works also with limited MultiCell() cells.
+
+5.9.199 (2012-11-29)
+	- Internal setImageBuffer() method was improved.
+
+5.9.198 (2012-11-19)
+	- Datamatrix EDIFACT mode was fixed.
+
+5.9.197 (2012-11-06)
+	- Bug item #756 "TCPDF 5.9.196 shows line on top of all PDFs" was fixed.
+
+5.9.196 (2012-11-02)
+	- Several methods were improved to avoid output when the context is out of page.
+	- Bug item #755 "remove cached files before unsetting" was fixed.
+
+5.9.195 (2012-10-24)
+	- Method _putfonts() was improved.
+
+5.9.194 (2012-10-23)
+	- Text alignment on TextField() method was fixed.
+
+5.9.193 (2012-09-25)
+	- Support for named destinations on HTML links was added  (i.e.: <a href="#destinationname">link to named destination</a>).
+
+5.9.192 (2012-09-24)
+	- A problem on the releasing process was fixed.
+
+5.9.191 (2012-09-24)
+	- SVG image naow support svg and eps images.
+
+5.9.190 (2012-09-23)
+	- "page" word translation is now set to empty if not defined.
+	- Tooltip feature was added on the radiobutton annotation.
+
+5.9.189 (2012-09-18)
+	- Bug item #3568969 "ini_get safe_mode error" was fixed.
+
+5.9.188 (2012-09-15)
+	- A datamatrix barcode bug was fixed.
+
+5.9.187 (2012-09-14)
+	- Subset feature was extended to include the first 256 characters.
+
+5.9.186 (2012-09-13)
+	- barcodes.php file was resynced.
+	- Methods SetAbsX, SetAbsY, SetAbsXY where added to set the absolute pointer coordinates.
+	- Method getCharBBox were added to get single character bounding box.
+	- Signature of addTTFfont method was changed ($addcbbox paramter was added).
+
+5.9.185 (2012-09-12)
+	- Method _putfontwidths() was fixed.
+
+5.9.184 (2012-09-11)
+	- A problem with EAN barcodes was fixed.
+
+5.9.183 (2012-09-07)
+	- A problem with font names normalization was fixed.
+
+5.9.182 (2012-09-05)
+	- Bug item #3564982 "Infinite loop in Write() method" was fixed.
+
+5.9.181 (2012-08-31)
+	- composer.json file was added.
+	- Bug item #3563369 "Cached images are not unlinked some time" was fixed.
+
+5.9.180 (2012-08-22)
+	- Bug item #3560493 "Problems with nested cells in HTML" was fixed.
+
+5.9.179 (2012-08-04)
+	- SVG 'use' tag was fixed for 'circle' and 'ellipse' shift problem.
+	- Alpha status is now correctly stored and restored by getGraphicVars() and SetGraphicVars() methods.
+
+5.9.178 (2012-08-02)
+	- SVG 'use' tag was fixed for 'circle' and 'ellipse'.
+
+5.9.177 (2012-08-02)
+	- An additional control on annotations was fixed.
+
+5.9.176 (2012-07-25)
+	- A bug related to stroke width was fixed.
+	- A problem related to font spacing in HTML was fixed.
+
+5.9.175 (2012-07-25)
+	- The problem of missing letter on hyphen break was fixed.
+
+5.9.174 (2012-07-25)
+	- The problem of wrong filename when downloading PDF from an Android device was fixed.
+	- The method setHeaderData() was extended to set text and line color for header (see example n. 1).
+	- The method setFooterData() was added to set text and line color for footer (see example n. 1).
+	- The methods setTextShadow() and getTextShadow() were added to set text shadows (see example n. 1).
+	- The GetCharWidth() method was fixed for negative character spacing.
+	- A 'none' border mode is now correctly recognized.
+	- Break on hyphen problem was fixed.
+
+5.9.173 (2012-07-23)
+	- Some additional control wher added on barcode methods.
+	- The option CURLOPT_FOLLOWLOCATION on Image method is now disabled if PHP safe_mode is on or open_basedir is set.
+	- Method Bookmark() was extended to include X parameter.
+	- Method setDestination() was extended to include X parameter.
+	- A problem with Thai language was fixed.
+
+5.9.172 (2012-07-02)
+	- A PNG color profile issue was fixed.
+
+5.9.171 (2012-07-01)
+	- Some SVG rendering problems were fixed.
+
+5.9.170 (2012-06-27)
+	- Bug #3538227 "Numerous errors inserting shared images" was fixed.
+
+5.9.169 (2012-06-25)
+	- Some SVG rendering problems were fixed.
+
+5.9.168 (2012-06-22)
+	- Thai language rendering was fixed.
+
+5.9.167 (2012-06-22)
+	- Thai language rendering was fixed and improved.
+	- Method isCharDefined() was improved.
+	- Protected method replaceChar() was added.
+	- Font "kerning" word was corrected to "tracking".
+
+5.9.166 (2012-06-21)
+	- Array to string conversion on file_id creation was fixed.
+	- Thai language rendering was fixed (thanks to Atsawin Chaowanakritsanakul).
+
+5.9.165 (2012-06-07)
+	- Some HTML form related bugs were fixed.
+
+5.9.164 (2012-06-06)
+	- A bug introduced on the latest release was fixed.
+
+5.9.163 (2012-06-05)
+	- Method getGDgamma() was changed.
+	- Rendering performances of PNG images with alpha channel were improved.
+
+5.9.162 (2012-05-11)
+	- A bug related to long text on TD cells was fixed.
+
+5.9.161 (2012-05-09)
+	- A bug on XREF table was fixed (Bug ID: 3525051).
+	- Deprecated Imagick:clone was replaced.
+	- Method objclone() was fixed for PHP4.
+
+5.9.160 (2012-05-03)
+	- A bug on tcpdf_parser.php was fixed.
+
+5.9.159 (2012-04-30)
+	- Barcode classes were updated to fix PNG export Bug (ID: 3522291).
+
+5.9.158 (2012-04-22)
+	- Some SVG-related bugs were fixed.
+
+5.9.157 (2012-04-16)
+	- Some SVG-related bugs were fixed.
+
+5.9.156 (2012-04-10)
+	- Bug item #3515885 "TOC and booklet: left and right page exchanged".
+	- SetAutoPageBreak(false) now works also in multicolumn mode.
+
+5.9.155 (2012-04-02)
+	- Bug item #3512596 "font import problems" was fixed.
+	- Method addTTFfont() was modified to extract only specified Platform ID and Encoding ID (check the source code documentation).
+	- All fonts were updated.
+	- Bug item #3513867 "booklet and setHeaderTemplateAutoreset: header shifted left" was fixed.
+	- Bug item #3513749 "TCPDF Superscript/Subscript" was fixed.
+
+5.9.154 (2012-03-29)
+	- A debug echo was removed.
+
+5.9.153 (2012-03-28)
+	- A bug on font conversion was fixed.
+	- All fonts were updated.
+	- Method isCharDefined() was added to find if a character is defined on the selected font.
+	- Method replaceMissingChars() was added to automatically replace missing chars on selected font.
+	- SetFont() method was fixed.
+
+5.9.152 (2012-03-23)
+	- The following overprint methods were added: setOverprint(), getOverprint().
+	- Signature of setAlpha() method was changed and method getAlpha() was added.
+	- stroke-opacity support was added on SVG.
+	- The following date methods were added: setDocCreationTimestamp(), setDocModificationTimestamp(), getDocCreationTimestamp(), getDocModificationTimestamp(), getFormattedDate(), getTimestamp().
+	- Signature of _datestring() method was changed.
+	- Method getFontBBox() was added.
+	- Method setPageBoxTypes() was aded.
+
+5.9.151 (2012-03-22)
+	- Bug item #3509889 "Transform() distorts PDF" was fixed.
+	- Precision of real number were extended.
+	- ComboBox and ListBox methods were fixed.
+	- Bulgarian language file was added.
+	- addTOC() method was improved to include bookmark color and font style.
+
+5.9.150 (2012-03-16)
+	- A bug related to form fields in PDF/A mode was fixed.
+
+5.9.149 (2012-02-21)
+	- Bug item #3489933 "SVG Parser treats tspan like text" was fixed.
+
+5.9.148 (2012-02-17)
+	- Bug item #3488600 "Multiple radiobutton sets get first set value" was fixed.
+
+5.9.147 (2012-02-14)
+	- A problem with SVG gradients has been fixed.
+
+5.9.146 (2012-02-12)
+	- Bug item #3486880 "$filehash undefine error" was fixed.
+	- The default font is now the one specified at PDF_FONT_NAME_MAIN constant.
+
+5.9.145 (2012-01-28)
+	- Japanese language file was added.
+	- TCPDF license and README.TXT files were updated.
+
+5.9.144 (2012-01-12)
+	- HTML output on barcode classes was improved.
+
+5.9.143 (2012-01-08)
+	- Bug item #3471057 "setCreator() has no effect" was fixed.
+
+5.9.142 (2011-12-23)
+	- Source code documentation was updated.
+
+5.9.141 (2011-12-14)
+	- Some minor bugs were fixed.
+
+5.9.140 (2011-12-13)
+	- SVG now supports embedded images encoded as base64.
+
+5.9.139 (2011-12-11)
+	- Spot color methods were fixed.
+
+5.9.138 (2011-12-10)
+	- cropMark() method was improved (check source code documentation).
+	- Example n. 56 was updated.
+	- Bug item #3452390 "Check Box still not ticked when set to true" was fixed.
+
+5.9.137 (2011-12-01)
+	- Bug item #3447005 "Background color and border of Form Elements is printed" was fixed.
+	- Color support for Form elements was improved.
+
+5.9.136 (2011-11-27)
+	- Bug item #3443387 "SetMargins with keep option does not work for top margin" was fixed.
+
+5.9.135 (2011-11-04)
+	- Bug item #3433406 "Double keywords in description" was fixed.
+
+5.9.134 (2011-10-29)
+	- The default value for $defcol parameter on convertHTMLColorToDec() method was fixed.
+	- Deafult HTTP headers were changed to avoid browser caching.
+	- Some deprecated syntax were replaced.
+
+5.9.133 (2011-10-26)
+	- Bug item #3428446 "copyPage method not working when diskcache enabled" was fixed.
+
+5.9.132 (2011-10-20)
+	- Bug item #3426167 "bug in function convertHTMLColorToDec()" was fixed.
+
+5.9.131 (2011-10-13)
+	- An error message was added to ImagePngAlpha() method.
+
+5.9.130 (2011-10-12)
+	- Now you can set image data strings on HTML img tag by encoding the image binary data in this way: $imgsrc = '@'.base64_encode($imgdata);
+
+5.9.129 (2011-10-07)
+	- Core fonts metrics was fixed (replace all helvetica and times php files on fonts folder).
+	- Form fields support was improved and some problems were fixed (check the example n. 14).
+	- Bug item #3420249 "Issue with booklet and MultiCell" was fixed.
+
+5.9.128 (2011-10-06)
+	- Method addTTFfont() was improved (check the source code documentation).
+	- Method setExtraXMP() to set custom XMP data was added.
+
+5.9.127 (2011-10-04)
+	- Readonly mode option was activated for radiobuttons.
+
+5.9.126 (2011-10-03)
+	- Bug item #3417989 "Graphics State operator in form XObject fails to render" was fixed.
+	- Xobjects problems with transparency, gradients and spot colors were fixed.
+
+5.9.125 (2011-10-03)
+	- Support for 8-digit CMYK hexadecimal color representation was added (to be used with XHTML and SVG).
+	- Spot colors support was improved (check example n. 37).
+	- Color methods were improved.
+
+5.9.124 (2011-10-02)
+	- Core fonts were updated.
+
+5.9.123 (2011-10-02)
+	- The method addTTFfont() wad added to automatically convert TTF fonts (check the new fonts guide at http://www.tcpdf.org).
+	- Old font utils were removed.
+	- All fonts were updated and new arabic fonts were added (almohanad were removed and replaced by aefurat and aealarabiya).
+	- The file unicode_data.php was updated.
+	- The file encodings_maps.php was added.
+	- PDF/A files are now compressed to save space.
+	- XHTML input form fields now support text-alignment attribute.
+
+5.9.122 (2011-09-29)
+	- PDF/A-1b compliance was improved to pass some online testing.
+
+5.9.121 (2011-09-28)
+	- This version includes support for PDF/A-1b format (the class constructor signature was changed - see example n. 65).
+	- Method setSRGBmode() was added to force sRGB_IEC61966-2.1 black scaled ICC color profile for the whole document (file sRGB.icc was added).
+	- 14 new fonts were added to allow embedding core fonts (for PDF/A compliance).
+	- Font utils were fixed.
+
+5.9.120 (2011-09-22)
+	- This version includes a fix for _getTrueTypeFontSubset() method.
+
+5.9.119 (2011-09-19)
+	- This version includes a fix for extra page numbering on TOC.
+
+5.9.118 (2011-09-17)
+	- This version includes some changes that allows you to add a bookmark for a page that do not exist.
+
+5.9.117 (2011-09-15)
+	- TCPDFBarcode and TCPDF2DBarcode classes were extended to include a method for exporting barcodes as PNG images.
+
+5.9.116 (2011-09-14)
+	- Datamatrix class was improved and documentation was fixed.
+
+5.9.115 (2011-09-13)
+	- Datamatrix ECC200 barcode support was added (a new datamatrix.php file was added) - check example n. 50.
+	- getBarcodeHTML() method was added on TCPDFBarcode and TCPDF2DBarcode classes to return an HTML representation of the barcode.
+	- cURL options on Image() method were improved.
+	- A bug on write2DBarcode() was fixed.
+
+5.9.114 (2011-09-04)
+	- A bug related to column position was fixed.
+
+5.9.113 (2011-08-24)
+	- This release include two new experimental files for parsing an existing PDF document (the integration with TCPDF is under development).
+
+5.9.112 (2011-08-18)
+	- A newline character was added after the 'trailer' keyword for compatibility with some parsers.
+	- Support for layers was improved.
+
+5.9.111 (2011-08-17)
+	- Barcode CODE 39 default gap was restored at 1.
+
+5.9.110 (2011-08-17)
+	- Barcode CODE 39 was fixed.
+
+5.9.109 (2011-08-12)
+	- Method getNumLines() was fixed.
+	- A bug related to page break in multi-column mode was fixed.
+
+5.9.108 (2011-08-09)
+	- A bug on PHP4 version was fixed.
+
+5.9.107 (2011-08-08)
+	- This version includes a minor bugfix.
+
+5.9.106 (2011-08-04)
+	- This version includes transparency groups: check the new parameter on startTemplate() method and example 62.
+
+5.9.105 (2011-08-04)
+	- Bug item #3386153 "Check Box not ticked when set to true" was fixed.
+
+5.9.104 (2011-08-01)
+	- Bug item #3383698 "imagemagick, resize and dpi" was fixed.
+
+5.9.103 (2011-07-16)
+	- Alignment of XHTML lines was improved.
+	- Spell of the "length" word was fixed.
+
+5.9.102 (2011-07-13)
+	- Methods startLayer() and endLayer() were added to support arbitrary PDF layers.
+	- Some improvements/fixes for images were added (thanks to Brendan Abbott).
+
+5.9.101 (2011-07-07)
+	- Support for JPEG and PNG ICC Color Profiles was added.
+	- Method addEmptySignatureAppearance() was added to add empty signature fields (see example n. 52).
+	- Bug item #3354332 "Strange line spacing with reduced font-size in writeHTML" was fixed.
+
+5.9.100 (2011-06-29)
+	- An SVG bug has been fixed.
+
+5.9.099 (2011-06-27)
+	- Bug item #3335045 "Font freesans seems somehow corrupted in footer" was fixed.
+
+5.9.098 (2011-06-23)
+	- The Named Destination feature was fixed.
+
+5.9.097 (2011-06-23)
+	- The method setHtmlVSpace() now can be used also for tags: div, li, br, dt and dd.
+	- The Named Destination feature was added (check the example n. 15) - thanks to Christian Deligant.
+
+5.9.096 (2011-06-19)
+	- Bug item #3322234 "Surrogate pairs codes in arrUTF8ToUTF16BE" was fixed.
+
+5.9.095 (2011-06-18)
+	- Numbers alignment for Table-Of-Content methods was improved and fixed.
+	- Font subsetting was fixed to include all parts of composite fonts.
+
+5.9.094 (2011-06-17)
+	- Bug item #3317898 "Page Group numbering broken in 5.9.093" was fixed.
+
+5.9.093 (2011-06-16)
+	- Method setStartingPageNumber() was added to set starting page number (for automatic page numbering).
+
+5.9.092 (2011-06-15)
+	- Method _putpages() was improved.
+	- Bug item #3316678 "Memory overflow when use Rotate and SetAutoPageBreak" was fixed.
+	- Right alignment of page numbers was improved.
+
+5.9.090 (2011-06-14)
+	- Methods AliasNbPages() and AliasNumPage() were re-added as deprecated for backward compatibility.
+
+5.9.089 (2011-06-13)
+	- Example n. 8 was updated.
+	- Method sendOutputData() was changed to remove default compression (it was incompatible with some server settings).
+	- Bugs related to page group numbers were fixed.
+	- Method copyPage() was fixed.
+	- Method Image() was improved to include support for alternative and external images.
+
+5.9.088 (2011-06-01)
+	- Method getAutoPageBreak() was added (see example n. 51).
+	- Example n. 51 (full page background) was updated.
+
+5.9.087 (2011-06-01)
+	- Method sendOutputData() was improved to include deflate encoding.
+	- Barcode classes on PHP 4 version were fixed.
+
+5.9.086 (2011-05-31)
+	- Font files were updated (the ones on the previous release were broken).
+	- The script fonts/utils/makeallttffonts.php was updated and fixed.
+	- Output() method was improved to use compression when available.
+
+5.9.085 (2011-05-31)
+	- TCPDFBarcode class (barcodes.php) now includes getBarcodeSVG() and getBarcodeSVGcode() methods to get SVG image representation of the barcode.
+	- TCPDF2DBarcode class (2dbarcodes.php) now includes getBarcodeSVG() and getBarcodeSVGcode() methods to get SVG image representation of the barcode.
+
+5.9.084 (2011-05-29)
+	- Font files were updated.
+	- The file fonts/utils/makeallttffonts.php was updated.
+	- Bug item# 3308774 "Problems with font subsetting" was fixed.
+
+5.9.083 (2011-05-24)
+	- Bug item #3308387 "line height & SetCellHeightRatio" was fixed.
+
+5.9.082 (2011-05-22)
+	- Bug item #3305592 "Setting fill color <> text color breaks text clipping" was fixed.
+
+5.9.081 (2011-05-18)
+	- Method resetHeaderTemplate() was added to reset the xobject template used by Header() method.
+	- Method setHeaderTemplateAutoreset() was added to automatically reset the xobject template used by Header() method at each page.
+
+5.9.080 (2011-05-17)
+	- A problem related to file path calculation for images was fixed.
+	- A problem related to unsupressed getimagesize() error was fixed.
+
+5.9.079 (2011-05-16)
+	- Footer() method was changed to use C128 barcode as default (instead of the previous C128B).
+
+5.9.078 (2011-05-12)
+	- Bug item #3300878 "wrong rendering for html bullet list in some case" was fixed.
+	- Bug item #3301017 "Emphasized vs. font-weight" was fixed.
+	- Barcode Code 128 was improved to include AUTO mode (automatically switch between A, B and C modes).
+	- Examples n. 27 and 49 were updated.
+
+5.9.077 (2011-05-07)
+	- Bug item #3298591 "error code93" was fixed.
+	- SetLineStyle() function was improved.
+
+5.9.076 (2011-05-06)
+	- Bug item #3298264 "codebar 93 error" was fixed.
+
+5.9.075 (2011-05-02)
+	- Table header alignment when using WriteHTMLCell() or MultiCell() was fixed.
+
+5.9.074 (2011-04-28)
+	- Bug item #3294306 "CSS classes not work in <thead> table section" was fixed.
+
+5.9.073 (2011-04-27)
+	- A bug related to character entities on HTML cells was fixed.
+
+5.9.072 (2011-04-26)
+	- Method resetColumns() was added to remove multiple columns and reset page margins (example n. 10 was updated).
+
+5.9.071 (2011-04-19)
+	- Bug #3288574 "<br/> trouble" was fixed.
+
+5.9.069 (2011-04-19)
+	- Bug #3288763 "HTML-Table: non-breaking table rows: Bug" was fixed.
+
+5.9.068 (2011-04-15)
+	- Bookmark, addTOC and addHTMLTOC methods were improved to include font style and color (Examples 15, 49 and 59 were updated).
+	- Default $_SERVER['DOCUMENT_ROOT'] value on tcpdf_config.php file was changed.
+
+5.9.067 (2011-04-10)
+	- Performances were drastically improved (PDF documents are now created more quickly).
+
+5.9.066 (2011-04-09)
+	- A bug related to digital signature + encryption was fixed.
+	- A bug related to encryption + xobject templates was fixed.
+
+5.9.065 (2011-04-08)
+	- Bug item #3280512 "Text encoding iso-8859-2 crashes" was fixed.
+
+5.9.064 (2011-04-05)
+	- A bug related to character entities on HTML cells was fixed.
+
+5.9.063 (2011-04-01)
+	- Bug item #3267235 "WriteHTML() and image that doesn't fit on the page" was fixed.
+
+5.9.062 (2011-03-23)
+	- Bug item #3232650 "Using Write if there are pageRegions active creates error" was fixed.
+	- Bug item #3221891 "text input borders" was fixed.
+	- Bug item #3228958 "Adobe Reader 9.4.2 crash" was fixed.
+
+5.9.061 (2011-03-15)
+	- Bug item #3213488 "wrong function call in function Write" was fixed.
+	- Bug item #3203007 "list element with black background" was fixed.
+
+5.9.060 (2011-03-08)
+	- addTOC() method was fixed for text alignment problems.
+
+5.9.059 (2011-02-27)
+	- Default Header() method was improved to reduce document size.
+
+5.9.058 (2011-02-25)
+	- Image() method was improved to cache images with transparency layers (thanks to Korneliusz Jarzębski for reporting this problem).
+
+5.9.057 (2011-02-24)
+	- A problem with image caching system was fixed (thanks to Korneliusz Jarzębski for reporting this problem).
+
+5.9.056 (2011-02-22)
+	- A bug on fixHTMLCode() method was fixed.
+	- Automatic line break for HTML was fixed.
+
+5.9.055 (2011-02-17)
+	- Another bug related to HTML table page break was fixed.
+
+5.9.054 (2011-02-16)
+	- A bug related to HTML table page break was fixed.
+
+5.9.053 (2011-02-16)
+	- Support for HTML attribute display="none" was added.
+
+5.9.052 (2011-02-15)
+	- A bug related to HTML automatic newlines was fixed.
+
+5.9.051 (2011-02-12)
+	- "Commas at beginning of new lines" problem was fixed.
+
+5.9.050 (2011-02-11)
+	- Bug #3177606 "SVG Bar chart error" was fixed.
+
+5.9.049 (2011-02-03)
+	- Bug #3170777 "TCPDF creates a new page after a single line in writeHTML" was fixed.
+
+5.9.048 (2011-02-02)
+	- No changes. Just released to override previous release that was not uploaded correctly.
+
+5.9.047 (2011-01-28)
+	- Bug #3167115 "PDF error in <table> (example 48)" was fixed (was introduced in 5.8.046).
+
+5.9.046 (2011-01-18)
+	- PDF view/print layers are now automatically turned off if not used (see setVisibility() method).
+
+5.9.045 (2011-01-17)
+	- HTML list support were improved.
+
+5.9.044 (2011-01-15)
+	- Bug #3158422 "writeHTMLCell Loop" was fixed.
+	- Some HTML image alignment problems were fixed.
+
+5.9.043 (2011-01-14)
+	- Bug #3158178 "PHP Notice" was fixed.
+	- Bug #3158193 "Endless loop in writeHTML" was fixed.
+	- Bug #3157764 "SVG Pie chart incorrectly rendered2".
+
+5.9.042 (2011-01-14)
+	- Some problems of the PHP4 version were fixed.
+
+5.9.041 (2011-01-13)
+	- A problem with SVG elliptical arc path was fixed (ref. bug #3156574).
+	- A problem related to font weight on HTML table headers was fixed.
+
+5.9.040 (2011-01-12)
+	- A bug related to empty pages after table was fixed.
+
+5.9.039 (2011-01-12)
+	- Bug item #3155759 "openssl_random_pseudo_bytes() slow under Windows" was fixed.
+
+5.9.038 (2011-01-11)
+	- Minor bugs were fixed.
+
+5.9.037 (2011-01-09)
+	- An alignment problem for HTML texts was fixed.
+
+5.9.036 (2011-01-07)
+	- A bug related to HTML tables on header was fixed.
+
+5.9.035 (2011-01-03)
+	- A problem related to HTML table border alignment was fixed.
+	- Bug #2996366 "FastCGI and Header Problems" was fixed.
+
+5.9.034 (2010-12-19)
+	- DejaVu and GNU Free fonts were updated.
+
+5.9.033 (2010-12-18)
+	- Source code documetnation was improved.
+
+5.9.032 (2010-12-18)
+	- Default font stretching and spacing values are now inherited by HTML methods.
+
+5.9.031 (2010-12-16)
+	- Source code documentation errors were fixed.
+
+5.9.030 (2010-12-16)
+	- Several source code documentation errors were fixed.
+	- Source code style was changed for Doxygen.
+	- Source code documentation was moved online to http://www.tcpdf.org
+
+5.9.029 (2010-12-04)
+	- The $fitbox parameter on Image() method was extended to specify image alignment inside the box (check the example n. 9).
+
+5.9.028 (2010-12-03)
+	- Font utils makefont.php and makeallttffonts.php were updated.
+
+5.9.027 (2010-12-01)
+	- Spot Colors are now better integrated with HTML mode.
+	- Method SetDocInfoUnicode() was added to turn on/off Unicode mode for document information dictionary (meta tags) - check the example n. 19.
+
+5.9.026 (2010-12-01)
+	- A problem with mixed text directions on HTML was fixed.
+
+5.9.025 (2010-12-01)
+	- The AddSpotColor() now automatically fills the spotcolor array (defined on spotcolors.php file).
+
+5.9.024 (2010-11-30)
+	- Bug item #3123612 "SVG not use gradientTransform in percentage mode" was fixed.
+
+5.9.023 (2010-11-25)
+	- A potential bug on SVG transcoder was fixed.
+
+5.9.022 (2010-11-21)
+	- Method ImageEPS includes support for EPS/AI Spot colors.
+	- Method ImageEPS includes a new parameter $fixoutvals to remove values outside the bounding box.
+
+5.9.021 (2010-11-20)
+	- Support for custom bullet points images was added (check the example n.6)
+	- Examples n. 6 and 61 were update (check the comments inside).
+
+5.9.020 (2010-11-19)
+	- A problem related to additional page when using multicolumn mode was fixed.
+
+5.9.019 (2010-11-19)
+	- An SVG bug was fixed.
+	- ImageSVG() and ImageEPS() methods now accepts image data streams (put the string on the $file parameter preceded by '@' character).
+	- Option 'E' was added to the $dest parameter of Output() method to return the document as base64 mime multi-part email attachment (RFC 2045).
+
+5.9.018 (2010-11-19)
+	- An SVG bug was fixed.
+
+5.9.017 (2010-11-16)
+	- Tagline color was set to transparent.
+	- The method fixHTMLCode() was added to automatically clean up HTML code (requires HTML Tidy).
+
+5.9.016 (2010-11-16)
+	- Bug item #3109705 "list item page break hanging bullet" was fixed.
+
+5.9.015 (2010-11-16)
+	- Bug item affecting QRCode was fixed.
+	- Some bugs affecting HTML lists were fixed.
+	- ImageSVG() and fitBlock() methods were improved to handle some SVG problems.
+	- Some problems with PHP4 compatibility were fixed.
+
+5.9.014 (2010-11-15)
+	- Bug item #3109464 "QRCode error" was fixed.
+
+5.9.013 (2010-11-15)
+	- Bug item #3109257 "Problem with interlaced GIFs and PNGs" was fixed.
+	- Image function now accepts image data streams (check example n. 9).
+
+5.9.012 (2010-11-12)
+	- Method getTCPDFVersion() was added.
+	- PDF_PRODUCER constant was removed.
+	- Method convertHTMLColorToDec() was improved.
+	- HTML colors now support spot color names defined on the new spotcolors.php file.
+	- The default method Header() was improved to support SVG and EPS/AI images.
+	- A bug on SVG importer was fixed.
+
+5.9.011 (2010-11-02)
+	- Bug item #3101486 "Bug Fix for image loading" was fixed.
+
+5.9.010 (2010-10-27)
+	- Support for CSS properties 'border-spacing' and 'padding' for tables were added.
+	- Several language files were added.
+
+5.9.009 (2010-10-21)
+	- HTML text alignment was improved to include the case of RTL text on LTR direction and LTR text on RTL direction.
+
+5.9.008 (2010-10-21)
+	- Bug item #3091502 "Bookmark oddity" was fixed.
+	- HTML internal links now accepts page number and Y position.
+	- The method write1DBarcode() was improved to accept separate horizontal and vertical padding (see example n. 27).
+
+5.9.007 (2010-10-20)
+	- Method adjustCellPadding() was fixed to handle bad input.
+
+5.9.006 (2010-10-19)
+	- Support for AES 256 bit encryption was added (see example n. 16).
+	- Method getNumLines() was fixed for the empty string case.
+
+5.9.005 (2010-10-18)
+	- Method addPageRegion() was changed to accept regions starting exactly from the top of the page.
+
+5.9.004 (2010-10-18)
+	- A bug related to annotations was fixed.
+	- The file unicode_data.php was canged to encapsulate all data in a class.
+	- The file htmlcolors.php was changed to remove the global variable.
+
+5.9.003 (2010-10-15)
+	- Support for no-write page regions was added. Check the example n. 64 and new methods setPageRegions(), addPageRegion(), getPageRegions(), removePageRegion().
+	- A bug on Right-To-Left alignment was fixed.
+
+5.9.002 (2010-10-08)
+	- Cell method was improved to preserve the font stretching and spacing values when using the $stretch parameter (see example n. 4).
+
+5.9.001 (2010-10-07)
+	- The problem of blank page for nobr table higher than a single page was fixed.
+
+5.9.000 (2010-10-06)
+	- Support for text stretching and spacing (tracking) was added, see example n. 63 and methods setFontStretching(), getFontStretching(), setFontSpacing(), getFontSpacing().
+	- Support for CSS properties 'font-stretch' and 'letter-spacing' was added (see example n. 63).
+	- The cMargin state was replaced by cell_padding array that can be set/get using setCellPadding() and getCellPadding() methods.
+	- Methods getCellPaddings() and setCellPaddings() were added to fine tune cell paddings (see example n. 5).
+	- Methods getCellMargins() and setCellMargins() were added to fine tune cell margins (see example n. 5).
+	- Method write1DBarcode() was improved to permit custom labels (see example n. 27).
+	- Method ImagePngAlpha() now includes support for ImageMagick to improve performances.
+	- XObject Template support was extended to support Multicell(), writeHTML() and writeHTMLCell() methods.
+	- The signature of getNumLines() and getStringHeight() methods is changed.
+	- Example n. 57 was updated.
+
+// -------------------------------------------------------------------
+
+5.8.034 (2010-09-27)
+	- A bug related to SetFont on XObject templates was fixed.
+
+5.8.033 (2010-09-25)
+	- A problem with Footer() and multiple columns was fixed.
+
+5.8.032 (2010-09-22)
+	- Bug #3073165 "Issues with changes to addHTMLVertSpace()" was fixed.
+
+5.8.031 (2010-09-20)
+	- Bug #3071961 "Spaces in HTML" was fixed.
+
+5.8.030 (2010-09-17)
+	- SVG support was improved and some bugs were fixed.
+
+5.8.029 (2010-09-16)
+	- A problem with HTML borders was fixed.
+
+5.8.028 (2010-09-13)
+	- Bug #3065224 "mcrypt_create_iv error on TCPDF 5.8.027 on PHP 5.3.2" was fixed.
+
+5.8.027 (2010-09-13)
+	- Bug #3065118 "mcrypt_decrypt error on TCPDF 5.8.026 on PHP 5.3.2" was fixed.
+
+5.8.026 (2010-09-13)
+	- A bug on addHTMLTOC() method was fixed. Note: be sure that the #TOC_PAGE_NUMBER# template has enough width to be printed correctly.
+
+5.8.025 (2010-09-09)
+	- Bug #3062692 "Textarea inside a table" was fixed.
+
+5.8.024 (2010-09-08)
+	- Bug #3062005 "Undefined variable: ann_obj_id" was fixed.
+
+5.8.023 (2010-08-31)
+	- Forms bug added on version 5.8.019 was fixed.
+
+5.8.022 (2010-08-31)
+	- Bug #3056632 "SVG rendered vertically flipped" was fixed.
+
+5.8.021 (2010-08-30)
+	- A new CID-0 'chinese' font was added for traditional Chinese.
+	- Bug #3054287 'Inner tags are ignored due to "align" attribute' was fixed.
+
+5.8.020 (2010-08-26)
+	- CSS "catch-all" class selector is now supported.
+
+5.8.019 (2010-08-26)
+	- XObject Templates now includes support for links and annotations.
+	- A problem related to link alignment on cell was fixed.
+	- A problem related to SVG styles was fixed.
+
+5.8.018 (2010-08-25)
+	- Method getNumberOfColumns() was added.
+	- A problem related to table header was fixed.
+	- Method getSVGTransformMatrix() was fixed to apply SVG transformations in the correct order.
+	- SVG support was improved and several bugs were fixed.
+
+5.8.017 (2010-08-25)
+	- This version includes support for XObject Templates (see the new example n. 62).
+	- Methods starttemplate(), endTemplate() and printTemplate() were added (see the new example n. 62).
+
+5.8.016 (2010-08-24)
+	- Alignment problem on write2DBarcode was fixed.
+
+5.8.015 (2010-08-24)
+	- A problem arised with the latest bugfix was fixed.
+
+5.8.014 (2010-08-23)
+	- Method _getxobjectdict() was added for better compatibility with external extensions.
+	- A bug related to radiobuttons was fixed.
+	- Bug #3051509 "new line after punctuation marks" was fixed (partially).
+
+5.8.013 (2010-08-23)
+	- SVG support for 'direction' property was added.
+	- A problem on default width calculation for linear barcodes was fixed.
+	- New option was added to write1DBarcode() method to improve alignments (see example n. 27).
+	- Bug #3050896 "Nested HTML tables: styles are not applied" was fixed.
+	- Method _putresourcedict() was improved to include external XObject templates.
+
+5.8.012 (2010-08-22)
+	- Support for SVG 'text-anchor' property was added.
+
+5.8.011 (2010-08-21)
+	- Method write1DBarcode() was improved to be backward compatible (check the new example n. 27).
+	- Support for CSS width and height properties on images were added.
+
+5.8.010 (2010-08-20)
+	- Documentation of unhtmlentities() was fixed.
+	- The 'fitwidth' option was added and border color problem was fixed on write1DBarcode() method (check the example n. 27).
+
+5.8.009 (2010-08-20)
+	- Internal object numbering was improved.
+	- Some errors in object encryption were fixed.
+
+5.8.008 (2010-08-19)
+	- Method write1DBarcode() was changed, check the example n. 27.
+	- Method Footer() was changed to account for barcode changes.
+	- Automatic calculation of K_PATH_URL constant was fixed on configuration file.
+	- Method setEqualColumns() was fixed for $width=0 case.
+	- Method AddTOC() was fixed for multipage and multicolumn modes.
+	- Better support for SVG "font-family" property.
+	- A problem on default Page Zoom mode was fixed.
+	- Several Annotation bugs were fixed.
+
+5.8.007 (2010-08-18)
+	- A bug affecting HTML tables was fixed.
+	- Bug #3047500 "SVG not rendering paths properly" was fixed.
+
+5.8.006 (2010-08-17)
+	- A bug affecting HTML table nesting was fixed.
+
+5.8.005 (2010-08-17)
+	- A bug affecting the HTML 'select' tag in certain conditions was fixed.
+
+5.8.004 (2010-08-17)
+	- Better support for HTML "font-family" property.
+	- A bug related to HTML multicolumn was fixed.
+
+5.8.003 (2010-08-16)
+	- Better support for HTML "font-family" property.
+
+5.8.002 (2010-08-14)
+	- HTML alignments were improved
+	- IMPORTANT: Default regular expression to find spaces has been changed to exclude the non-breaking-space (160 DEC- A0 HEX). If you are using setSpacesRE() method, please read the new documentation.
+	- Example n. 1 was updated.
+
+5.8.001 (2010-08-12)
+	- Bug #3043650 "subsetchars incorrectly cached" was fixed.
+
+5.8.000 (2010-08-11)
+	- A control to avoid bookmarking page 0 was added.
+	- addTOC() method now includes support for multicolumn mode.
+	- Support for tables in multicolumn mode was improved.
+	- Example n.10 was updated.
+	- All trimming functions were replaced with stringLeftTrim(), stringRightTrim() and stringTrim().
+	- HTML alignments were improved.
+
+------------------------------------------------------------
+
+5.7.003 (2010-08-08)
+	- Bug #3041263 "php source ending is bad" was fixed (all PHP files were updated, including fonts).
+
+5.7.002 (2010-08-06)
+	- Methods copyPage(), movePage() and deletePage() were changed to account for internal markings.
+
+5.7.001 (2010-08-05)
+	- Bug #3040105 "Broken PDF when using TOC (example 45)" was fixed.
+
+5.7.000 (2010-08-03)
+	- CSS borders are now supported for HTML tables and other block tags (see example n. 61);
+	- Cell borders were improved (see example n. 57);
+	- Minor bugs were fixed.
+
+------------------------------------------------------------
+
+5.6.000 (2010-07-31)
+	- A bug with object IDs was fixes.
+	- Performances were improved.
+
+------------------------------------------------------------
+
+5.5.015 (2010-07-29)
+	- Automatic fix for unclosed self-closing tag.
+	- Support for deprecated 's' and 'strike' tags was added.
+	- Empty list items problem was fixed.
+
+5.5.014 (2010-07-15)
+	- Support for external images was improved.
+
+5.5.013 (2010-07-14)
+	- Bug #3029338 "FI and FO output destination filename bug" was fixed (previous fix was wrong).
+
+5.5.012 (2010-07-14)
+	- Bug #3029310 "Font baseline inconsistencies with line-height and font-size" was fixed.
+	- Bug #3029338 "FI and FO output destination filename bug" was fixed.
+
+5.5.011 (2010-07-09)
+	- Support for multiple CSS classes was added.
+	- The method getColumn() was added to return the current column number.
+	- Some regular Expressions were fixed to be more compatible with UTF-8.
+
+5.5.010 (2010-07-06)
+	- Bug item #3025772 "Borders in all image functions are still flawed" was fixed.
+
+5.5.009 (2010-07-05)
+	- A problem related to last page footer was fixed.
+	- Image alignments and fit-on-page features were improved.
+
+5.5.008 (2010-07-02)
+	- A problem on table header alignment in booklet mode was fixed.
+	- Default graphic vars are now applied for setHeader();
+
+5.5.007 (2010-07-02)
+	- Attribute "readonly" was added to input and textarea form fields.
+	- Vertical alignment feature was added on MultiCell() method only for simple text mode (see example n. 5).
+	- Text-Fit feature was added on MultiCell() method only for simple text mode (see example n. 5).
+
+5.5.006 (2010-06-29)
+	- getStringHeight() and getNumLines() methods were fixed.
+
+5.5.005 (2010-06-28)
+	- Bug #3022170 "getFontDescent() does not return correct descent value" was fixed.
+	- Some problems with multicolumn mode were fixed.
+
+5.5.004 (2010-06-27)
+	- Bug #3021803 "SVG Border" was fixed.
+
+5.5.003 (2010-06-26)
+	- On Write() method, blank lines at the beginning of a page or column are now automatically removed.
+
+5.5.002 (2010-06-24)
+	- ToUnicode Identity-H name was replaced with a full CMap (to avoid preflight syntax error).
+	- Bug #3020638 "str_split() not available in php4" was fixed.
+	- Bug #3020665 "file_get_contents() too many parameters for php4" was fixed.
+
+5.5.001 (2010-06-23)
+	- A problem on image streams was fixed.
+
+5.5.000 (2010-06-22)
+	- Several PDF syntax errors (and related bugs) were fixed.
+	- Bug #3019090 "/Length values are wrong if AES encryption is used" was fixed.
+
+------------------------------------------------------------
+
+5.4.003 (2010-06-19)
+	- A problem related to page boxes was fixed.
+	- Bug #3016920 "Font subsetting issues when editing pdf" was partially fixed (Note that flattening transparency layers is currently incompatible with TrueTypeUnicode fonts).
+
+5.4.002 (2010-06-18)
+	- A problem related with setProtection() method was fixed.
+
+5.4.001 (2010-06-18)
+	- A problem related with setProtection() method was fixed.
+
+5.4.000 (2010-06-18)
+	- The method setSignatureAppearance() was added, check the example n. 52.
+	- Several problems related to font subsetting were fixed.
+
+------------------------------------------------------------
+
+5.3.010 (2010-06-15)
+	- Previous release was corrupted.
+
+5.3.009 (2010-06-15)
+	- Bug #3015934 "Bullets don't display correctly" was fixed.
+
+5.3.008 (2010-06-13)
+	- This version fixes some problems of SVG rasterization.
+
+5.3.007 (2010-06-13)
+	- This version improves SVG support.
+
+5.3.006 (2010-06-10)
+	- This version includes a change in uniqid calls for backward compatibility with PHP4.
+
+5.3.005 (2010-06-09)
+	- The method getPageSizeFromFormat() was changed to include all standard page formats (includes 281 page formats + variation).
+
+5.3.004 (2010-06-08)
+	- Bug #3013291 "HTML table cell width" was fixed.
+	- Bug #3013294 "HTML table cell alignment" was fixed.
+	- The columns widths of HTML tables are now inherited from the first row.
+
+5.3.003 (2010-06-08)
+	- Bug #3013102 "HTML table header misaligned after page break" was fixed.
+
+5.3.002 (2010-06-07)
+	- The methods setFontSubsetting() and setFontSubsetting() were added to control the default font subsetting mode (see example n. 1).
+	- Bug #3012596 "Whitespace should not appeared after use Thai top characters" was fixed.
+	- Examples n. 1, 14, and 54 were updated.
+
+5.3.001 (2010-06-06)
+	- Barcode PDF417 was improved to support Macro Code Blocks (see example n. 50).
+
+5.3.000 (2010-06-05)
+	- License was changed to GNU-LGPLv3 (see the updated LICENSE.TXT file).
+	- PDF417 barcode support was added (check the example n. 50).
+	- The method write2DBarcode() was improved (some parameters were added and other changed - check example n. 50).
+
+------------------------------------------------------------
+
+5.2.000 (2010-06-02)
+	- IMPORTANT: Support for font subsetting was added by default to reduce the size of documents using large unicode font files.
+		If you embed the whole font in the PDF, the person on the other end can make changes to it even if he didn't have your font.
+		If you subset the font, file size of the PDF will be smaller but the person who receives your PDF would need to have your same font in order to make changes to your PDF.
+	- The signature of the SetFont() and AddFont() methods were changed to include the font subsetting option (subsetting is applied by default).
+	- Examples 14 and 54 were updated.
+
+------------------------------------------------------------
+
+5.1.002 (2010-05-27)
+	- Bug #3007818 "SetAutoPageBreak fails with MultiCell" was fixed.
+	- A bug related to MultiCell() minimun height was fixed.
+
+5.1.001 (2010-05-26)
+	- The problem of blank page after table was fixed.
+
+5.1.000 (2010-05-25)
+	- This version includes support for CSS (Cascading Style Sheets) (see example n. 61).
+	- The convertHTMLColorToDec() method was improved.
+
+------------------------------------------------------------
+
+5.0.014 (2010-05-21)
+	- A problem on color and style of HTML links was fixed.
+	- A bug relative to gradients was fixed.
+	- The getStringHeight() method was added and getNumLines() method was improved.
+	- All examples were updated.
+
+5.0.013 (2010-05-19)
+	- A bug related to page-breaks and table cells was fixed.
+
+5.0.012 (2010-05-19)
+	- Page orientation bug was fixed.
+	- The access to method setPageFormat() was changed to 'protected' because it is not intended to be directly called.
+
+5.0.011 (2010-05-19)
+	- Page orientation bug was fixed.
+	- Bug #3003966 "Multiple columns and nested lists" was fixed.
+
+5.0.010 (2010-05-17)
+	- The methods setPageFormat(), setPageOrientation() and related methods were extended to include page boxes, page rotations and page transitions.
+	- The method setPageBoxes() was added to set page boundaries (MediaBox, CropBox, BleedBox, TrimBox, ArtBox);
+	- A bug relative to underline, overline and linethrough was fixed.
+
+5.0.009 (2010-05-16)
+	- Bug #3002381 "Multiple columns and nested lists" was fixed.
+
+5.0.008 (2010-05-15)
+	- Bug "Columns WriteHTML and Justification" was fixed.
+
+5.0.007 (2010-05-14)
+	- Bug #3001347 "Bug when using  WriteHTML with setEqualColumns()" was fixed.
+	- Bug #3001505 "problem with sup and sub tags at the beginning of a line" was fixed.
+
+5.0.006 (2010-05-13)
+	- Length of hr tag was fixed.
+	- An error on 2d barcode method was fixed.
+
+5.0.005 (2010-05-12)
+	- WARNING: The logic of permissions on the SetProtection() method has been inverted and extended (see example 16). Now you have to specify the features you want to block.
+	- SetProtection() method was extended to support RSA and AES 128 encryption and public-keys (see example 16).
+	- Bug #2999489 "setEqualColumns() and TOC uses wrong columns" was fixed (see the example 10).
+
+5.0.004 (2010-05-10)
+	- HTML line alignment when using sub and sup tags was fixed.
+
+5.0.003 (2010-05-07)
+	- Horizontal alignment was fixed for images and barcodes. Now the X coordinate is always relative to the left margin. Use GetAbsX() instead of GetX() to get the X relative to left margin.
+	- Header() method was changed to account for new image alignment rules.
+
+5.0.002 (2010-05-06)
+	- Bookmark() and related methods were fixed to accept HTML code.
+	- A problem on HTML links was fixed.
+
+5.0.001 (2010-05-06)
+	- Protected method _putstream was re-added for backward compatibility.
+	- The following method were added to display HTML Table Of Content (see example n. 59):
+		addTOCPage(), endTOCPage(), addHTMLTOC().
+
+5.0.000 (2010-05-05)
+	- Method ImageSVG() was added to embedd SVG images (see example n. 58). Note that not all SVG images are supported.
+	- Method setRasterizeVectorImages() was added to enable/disable rasterization for vector images via ImageMagick library.
+	- Method RoundedRectXY() was added.
+	- Method PieSectorXY() was added.
+	- Gradient() method is now public and support new features.
+	- Shading to transparency is now supported.
+	- Image alignments were fixed.
+	- Support for dynamic images were improved.
+	- PDF_IMAGE_SCALE_RATIO has been changed to 1.25 for better compatibility with SVG.
+	- RAW and RAW2 modes were added to 2D Barcodes (see example n. 50).
+	- Automatic padding feature was added on barcodes (see examples n. 27 and 50).
+	- Bug #2995003 "Reproduced thead bug" was fixed.
+	- The Output() method now accepts FI and FD destinations to save the document on server before sending it to the client.
+	- Ellipse() method was improved and fixed (see page 2 of example n. 12).
+
+------------------------------------------------------------
+
+4.9.018 (2010-04-21)
+	- Bug item #2990356 "Current font size not respected with more than two HTML <p>" was fixed.
+
+4.9.017 (2010-04-21)
+	- Bug item #2990224 "Different behaviour for equivalent HTML strings" was fixed.
+	- Bug item #2990314 "Dash is not appearing with SHY character" was fixed.
+
+4.9.016 (2010-04-20)
+	- An error on htmlcolors.php was fixed.
+	- getImageFileType() method was improved.
+	- GIF images with transparency are now better supported.
+	- Automatic page orientation was improved.
+
+4.9.015 (2010-04-20)
+	- A new method copyPage() was added to clone pages (see example n. 44).
+	- Support for text overline was added.
+	- Underline and linethrough methods were fixed.
+	- Bug #2989058 "SHY character causes unnecessary word-wrapping" was fixed.
+
+4.9.014 (2010-04-18)
+	- Bug item #2988845 was fixed.
+
+4.9.013 (2010-04-15)
+	- Image() and ImageEPS() methods were fixed and improved; $fitonpage parameter was added.
+
+4.9.012 (2010-04-12)
+	- The hyphenateText() method was added to automatically hyphenate text (see example n. 46).
+
+4.9.011 (2010-04-07)
+	- Vertical alignments for Cell() method were improved (see example n. 57).
+
+4.9.010 (2010-04-06)
+	- Signature of Cell() method now includes new parameters for vertical alignment (see example n. 57).
+	- Text() method was extended to include all Cell() parameters.
+	- HTML line alignment procedure was changed to fix some bugs.
+
+4.9.009 (2010-04-05)
+	- Text() method was fixed for backward compatibility.
+
+4.9.008 (2010-04-03)
+	- Additional line space after table header was removed.
+	- Support for HTML lists in multicolumn mode was added.
+	- The method setTextRenderingMode() was added to set text rendering modes (see the example n. 26).
+	- The following HTML attributes were added to set text rendering modes (see the example n. 26): stroke, strokecolor, fill.
+
+4.9.007 (2010-04-03)
+	- Font Descent computation was fixed (patch #2981441).
+
+4.9.006 (2010-04-02)
+	- The constant K_TCPDF_CALLS_IN_HTML was added on configuration file to enable/disable the ability to call TCPDF methods in HTML.
+	- The usage of tcpdf tag in HTML mode was changed to remove the possible security flaw offered by the eval() function (thanks to Matthias Hecker for spotting this security problem). See the new example n. 49 for further information.
+
+4.9.005 (2010-04-01)
+	- Bug# 2980354 "Wrong File attachment description with security" was fixed.
+	- Several problems with HTML line alignment were fixed.
+	- The constant K_THAI_TOPCHAR was added on configuration file to enable/disable the special procedure used to avoid the overlappind of symbols on Thai language.
+	- A problem with font name directory was fixed.
+	- A bug on _destroy() method was fixed.
+
+4.9.004 (2010-03-31)
+	- Patch #979681 "GetCharWidth - default character width" was applied (bugfix).
+
+4.9.003 (2010-03-30)
+	- Problem of first <br /> on multiple columns was fixed.
+	- HTML line alignment was fixed.
+	- A QR-code bug was fixed.
+
+4.9.002 (2010-03-29)
+	- Patch #2978349 "$ignore_min_height is ignored in function Cell()" was applied.
+	- Bug #2978607 "2D Barcodes are wrong" was fixed.
+	- A problem with HTML block tags was fixed.
+	- Artificial italic for CID-0 fonts was added.
+	- Several multicolumn bugs were fixed.
+	- Support for HTML tables on multicolumn was added.
+
+4.9.001 (2010-03-28)
+	- QR Code minor bug was fixed.
+	- Multicolumn mode was added (see the new example n. 10).
+	- The following methods were added: setEqualColumns(), setColumnsArray(), selectColumn().
+	- Thai diacritics support were changed (note that this is incompatible with html justification).
+
+4.9.000 (2010-03-27)
+	- QR Code (2D barcode) support was added (see example n. 50).
+	- The following methods were added to print crop and registration marks (see example n. 56): colorRegistrationBar(), cropMark(), registrationMark().
+	- Limited support for CSS line-height property was added.
+	- Gradient method now supports Gray, RGB and CMYK space color.
+	- Example n. 51 was updated.
+	- Vertical alignment of font inside cell was fixed.
+	- Support for multiple Thai diacritics was added.
+	- Bug item #2974929 "Duplicate case values" was fixed.
+	- Bug item #2976729 "File attachment not working with security" was fixed.
+
+------------------------------------------------------------
+
+4.8.039 (2010-03-20)
+	- Problems related to custom locale settings were fixed.
+	- Problems related to HTML on Header and Footer were fixed.
+
+4.8.038 (2010-03-13)
+	- Various bugs related to page-break in HTML mode were fixed.
+	- Bug item #2968974 "Another <thead> pagebreak problem" was fixed.
+	- Bug item #2969276 "justification problem" was fixed.
+	- Bug item #2969289 "bug when using justified text and custom headers" was fixed.
+	- Images are now automatically resized to be contained on the page.
+	- Some HTML line alignments were fixed.
+	- Signature of AddPage() and SetMargins() methods were changed to include an option to set default page margins.
+
+4.8.037 (2010-03-03)
+	- Bug item #2962068 was fixed.
+	- Bug item #2967017 "Problems with <thead> and pagebreaks" was fixed.
+	- Bug item #2967023 "table header lost with pagebreak" was fixed.
+	- Bug item #2967032 "Header lost with nested tables" was fixed.
+
+4.8.036 (2010-02-24)
+	- Automatic page break for HTML images was improved.
+	- Example 10 was updated.
+	- Japanese was removed from example 8 because the freeserif font doesn't contain japanese (you can display it using arialunicid0 font).
+
+4.8.035 (2010-02-23)
+	- Automatic page break for HTML images was added.
+	- Support for multicolumn HTML was added (example 10 was updated).
+
+4.8.034 (2010-02-17)
+	- Language files were updated.
+
+4.8.033 (2010-02-12)
+	- A bug related to protection mode with links was fixed.
+
+4.8.032 (2010-02-04)
+	- A bug related to $maxh parameter on Write() and MultiCell() was fixed.
+	- Support for body tag was added.
+
+4.8.031 (2010-01-30)
+	- Bug item #2941589 "paragraph justify not working on some non-C locales" was fixed.
+
+4.8.030 (2010-01-27)
+	- Some text alignment cases were fixed.
+
+4.8.029 (2010-01-27)
+	- Bug item #2941057 "TOC Error in PDF File Output" was fixed.
+	- Some text alignment cases were fixed.
+
+4.8.028 (2010-01-26)
+	- Text alignment for RTL mode was fixed.
+
+4.8.027 (2010-01-25)
+	- Bug item #2938412 "Table related problems - thead, nobr, table width" was fixed.
+
+4.8.026 (2010-01-19)
+	- The misspelled word "lenght" was replaced with "length" in some variables and comments.
+
+4.8.025 (2010-01-18)
+	- addExtGState() method was improved to reuse existing ExtGState objects.
+
+4.8.024 (2010-01-15)
+	- Justification mode for HTML was fixed (Bug item #2932470).
+
+4.8.023 (2010-01-15)
+	- Bug item #2932470 "Some HTML entities breaks justification" was fixed.
+
+4.8.022 (2010-01-14)
+	- Source code documentation was fixed.
+
+4.8.021 (2010-01-03)
+	- A Bug relative to Table Of Content index was fixed.
+
+4.8.020 (2009-12-21)
+	- Bug item #2918545 "Display problem of the first row of a table with larger font" was fixed.
+	- A Bug relative to table rowspan mode was fixed.
+
+4.8.019 (2009-12-16)
+	- Bug item #2915684 "Image size" was fixed.
+	- Bug item #2914995 "Image jpeg quality" was fixed.
+	- The signature of the Image() method was changed (check the documentation for the $resize parameter).
+
+4.8.018 (2009-12-15)
+	- Bug item #2914352 "write error" was fixed.
+
+4.8.017 (2009-11-27)
+	- THEAD problem when table is used on header/footer was fixed.
+	- A first line alignment on HTML justification was fixed.
+	- Method getImageFileType() was added.
+	- Images with unknown extension and type are now supported via ImageMagick PHP extension.
+
+4.8.016 (2009-11-21)
+	- Document Information Dictionary was fixed.
+	- CSS attributes 'page-break-before', 'page-break-after' and 'page-break-inside' are now supported.
+	- Problem of unclosed last page was fixed.
+	- Problem of 'thead' unnecessarily repeated on the next page was fixed.
+
+4.8.015 (2009-11-20)
+	- A problem with some PNG transparency images was fixed.
+	- Bug #2900762 "Sort issues in Bookmarks" was fixed.
+	- Text justification was fixed for various modes: underline, strikeout and background.
+
+4.8.014 (2009-11-04)
+	- Bug item #2891316 "writeHTML, underlining replacing spaces" was fixed.
+	- The handling of temporary RTL text direction mode was fixed.
+
+4.8.013 (2009-10-26)
+	- Bug item #2884729 "Problem with word-wrap and hyphen" was fixed.
+
+4.8.012 (2009-10-23)
+	- Table cell alignments for RTL booklet mode were fixed.
+	- Images and barcode alignments for booklet mode were fixed.
+
+4.8.011 (2009-10-22)
+	- DejaVu fonts were updated to latest version.
+
+4.8.010 (2009-10-21)
+	- Bookmark for TOC page was added.
+	- Signature of addTOC() method is changed.
+	- Bookmarks are now automatically sorted by page and Y position.
+	- Example n. 45 was updated.
+	- Example n. 55 was added to display all charactes available on core fonts.
+
+4.8.009 (2009-09-30)
+	- Compatibility with PHP 5.3 was improved.
+	- All examples were updated.
+	- Index file for examples was added.
+
+4.8.008 (2009-09-29)
+	- Example 49 was updated.
+	- Underline and linethrough now works with cell stretching mode.
+
+4.8.007 (2009-09-23)
+	- Infinite loop problem caused by nobr attribute was fixed.
+
+4.8.006 (2009-09-23)
+	- Bug item #2864522 "No images if DOCUMENT_ROOT=='/'" was fixed.
+	- Support for text-indent CSS attribute was added.
+	- Method rollbackTransaction() was changed to support self-reassigment of previous object (check source code documentation).
+	- Support for the HTML "nobr" attribute was added to avoid splitting a table or a table row on two pages (i.e.: <tr nobr="true">...</tr>).
+
+4.8.005 (2009-09-17)
+	- A bug relative to multiple transformations and annotations was fixed.
+
+4.8.004 (2009-09-16)
+	- A bug on _putannotsrefs() method was fixed.
+
+4.8.003 (2009-09-15)
+	- Bug item #2858754 "Division by zero" was fixed.
+	- A bug relative to HTML list items was fixed.
+	- A bug relative to form fields on multiple pages was fixed.
+	- PolyLine() method was added (see example n. 12).
+	- Signature of Polygon() method was changed.
+
+4.8.002 (2009-09-12)
+	- A problem related to CID-0 fonts offset was fixed: if the $cw[1] entry on the CID-0 font file is not defined, then a CID keys offset is introduced.
+
+4.8.001 (2009-09-09)
+	- The appearance streams (AP) for anotations form fields was fixed (see examples n. 14 and 54).
+	- Radiobuttons were fixed.
+
+4.8.000 (2009-09-07)
+	- This version includes some support for Forms fields (see example n. 14) and XHTML forms (see example n. 54).
+	- The following methods were changed to work without JavaScript: TextField(), RadioButton(), ListBox(), ComboBox(), CheckBox(), Button().
+	- Support for Widget annotations was improved.
+	- Alignment of annotation objects was fixed (examples 36 and 41 were updated).
+	- addJavascriptObject() method was added.
+	- Signature of Image() method was changed.
+	- htmlcolors.php file was updated.
+
+------------------------------------------------------------
+
+4.7.003 (2009-09-03)
+	- Support for TCPDF methods on HTML was improved (see example n. 49).
+
+4.7.002 (2009-09-02)
+	- Bug item #2848892 "writeHTML + table: Gaps between rows" was fixed.
+	- JavaScript support was fixed (see example n. 53).
+
+4.7.001 (2009-08-30)
+	- The Polygon() and Arrow() methods were fixed and improved (see example n. 12).
+
+4.7.000 (2009-08-29)
+	- This is a major release.
+	- Some procedures were internally optimized.
+	- The problem of mixed signature and annotations was fixed (example n. 52).
+
+4.6.030 (2009-08-29)
+	- IMPORTANT: percentages on table cell widths are now relative to the full table width (as in standard HTML).
+	- Various minor bugs were fixed.
+	- Example n. 52 (digital signature) was updated.
+
+4.6.029 (2009-08-26)
+	- PHP4 version was fixed.
+
+4.6.028 (2009-08-25)
+	- Signature algorithm was finally fixed (see example n. 52).
+
+4.6.027 (2009-08-24)
+	- TCPDF now supports unembedded TrueTypeUnicode Fonts (just comment the $file entry on the fonts' php file.
+
+4.6.026 (2009-08-21)
+	- Bug #2841693 "Problem with MultiCell and ishtml and justification" was fixed.
+	- Signature functions were improved but not yet fixed (tcpdf.crt and example n. 52 were updated).
+
+4.6.025 (2009-08-17)
+	- Carriage returns (\r) were removed from source code.
+	- Problem related to set_magic_quotes_runtime() depracated was fixed.
+
+4.6.024 (2009-08-07)
+	- Bug item #2833556 "justification using other units than mm" was fixed.
+	- Documentation was fixed/updated.
+
+4.6.023 (2009-08-02)
+	- Bug item #2830537 "MirrorH can show mask for transparent PNGs" was fixed.
+
+4.6.022 (2009-07-24)
+	- A bug relative to single line printing when using WriteHTMLCell() was fixed.
+	- Signature support were improved but is still experimental.
+	- Fonts Free and Dejavu were updated to latest versions.
+
+4.6.021 (2009-07-20)
+	- Bug item #2824015 "XHTML Ampersand &amp; in hyperlink bug" was fixed.
+	- Bug item #2824036 "Image as hyperlink in table, text displaced at page break" was fixed.
+	- Links alignment on justified text was fixed.
+	- Unicode "\u" modifier was added to re_spaces variable by default.
+
+4.6.020 (2009-07-16)
+	- Bug item #2821921 "issue in example 18" was fixed.
+	- Signature of SetRTL() method was changed.
+
+4.6.019 (2009-07-13)
+	- Bug item #2820703 "xref table broken" was fixed.
+
+4.6.018 (2009-07-10)
+	- Bug item #2819319 "Text over text" was fixed.
+	- Method Arrow() was added to print graphic arrows (example 12 was updated).
+
+4.6.017 (2009-07-05)
+	- Bug item #2816079 "Example 48 not working" was fixed.
+	- The signature of the checkPageBreak() was changed. The parameter $addpage was added to turn off the automatic page creation.
+
+4.6.016 (2009-06-16)
+	- Method setSpacesRE() was added to set the regular expression used for detecting withespaces or word separators. If you are using chinese, try: setSpacesRE('/[\s\p{Z}\p{Lo}]/');, otherwise you can use setSpacesRE('/[\s\p{Z}]/');
+	- The method _putinfo() now automatically fills the metadata with '?' in case of empty string.
+
+4.6.015 (2009-06-11)
+	- Bug #2804667 "word wrap bug" was fixed.
+
+4.6.014 (2009-06-04)
+	- Bug #2800931 "Table thead tag bug" was fixed.
+	- A bug related to <pre> tag was fixed.
+
+4.6.013 (2009-05-28)
+	- List bullets position was fixed for RTL languages.
+
+4.6.012 (2009-05-23)
+	- setUserRights() method doesn't work anymore unless you call the setSignature() method with the Adobe private key!
+
+4.6.011 (2009-05-18)
+	- Signature of the Image() method was changed to include the new $fitbox parameter (see source code documentation).
+
+4.6.010 (2009-05-17)
+	- Image() method was improved: now is possible to specify the maximum dimensions for a constraint box defined by $w and $h parameters, and setting the $resize parameter to null.
+	- <tcpdf> tag indent problem was fixed.
+	- $y parameter was added to checkPageBreak() method.
+	- Bug n. 2791773 "writeHTML" was fixed.
+
+4.6.009 (2009-05-13)
+	- xref table for embedded files was fixed.
+
+4.6.008 (2009-05-07)
+	- setSignature() method was improved (but is still experimental).
+	- Example n. 52 was added.
+
+4.6.007 (2009-05-05)
+	- Bug #2786685 "writeHtmlCell and <br /> in custom footer" was fixed.
+	- Table header repeating bug was fixed.
+	- Some newlines and tabs are now automatically removed from HTML strings.
+
+4.6.006 (2009-04-28)
+	- Support for "<a name="...">...</a>" was added.
+	- By default TCPDF requires PCRE Unicode support turned on but now works also without it (with limited ability to detect some Unicode blank spaces).
+
+4.6.005 (2009-04-25)
+	- Points (pt) conversion in getHTMLUnitToUnits() was fixed.
+	- Default tcpdf.pem certificate file was added.
+	- Experimental support for signing document was added but it is not yet completed (some help is needed - I think that the calculation of the ByteRange is OK and the problem is on the signature calculation).
+
+4.6.004 (2009-04-23)
+	- Method deletePage() was added to delete pages (see example n. 44).
+
+4.6.003 (2009-04-21)
+	- The caching mechanism of the UTF8StringToArray() method was fixed.
+
+4.6.002 (2009-04-20)
+	- Documentation of rollbackTransaction() method was fixed.
+	- The setImageScale() and getImageScale() methods now set and get the adjusting parameter used by pixelsToUnits() method.
+	- HTML images now support other units of measure than pixels (getHTMLUnitToUnits() is now used instead of pixelsToUnits()).
+	- WARNING: PDF_IMAGE_SCALE_RATIO has been changed by default to 1.
+
+4.6.001 (2009-04-17)
+	- Spaces between HTML block tags are now automatically removed.
+	- The bug related to cMargin changes between tables was fixed.
+
+4.6.000 (2009-04-16)
+	- WARNING: THIS VERSION CHANGES THE BEHAVIOUR OF $x and $y parameters for several TCPDF methods:
+		zero coordinates for $x and $y are now valid coordinates;
+		set $x and $y as empty strings to get the current value.
+	- Some error caused by 'empty' funtion were fixed.
+	- Default color for convertHTMLColorToDec() method was changed to white and the return value for invalid color is false.
+	- HTML on footer bug was fixed.
+	- The following examples were fixed: 5,7,10,17,19,20,21,33,42,43.
+
+4.5.043 (2009-04-15)
+	- Barcode class (barcode.php) was extended to include new linear barcode types (see example n. 27):
+		C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9
+		C39+ : CODE 39 with checksum
+		C39E : CODE 39 EXTENDED
+		C39E+ : CODE 39 EXTENDED + CHECKSUM
+		C93 : CODE 93 - USS-93
+		S25 : Standard 2 of 5
+		S25+ : Standard 2 of 5 + CHECKSUM
+		I25 : Interleaved 2 of 5
+		I25+ : Interleaved 2 of 5 + CHECKSUM
+		C128A : CODE 128 A
+		C128B : CODE 128 B
+		C128C : CODE 128 C
+		EAN2 : 2-Digits UPC-Based Extention
+		EAN5 : 5-Digits UPC-Based Extention
+		EAN8 : EAN 8
+		EAN13 : EAN 13
+		UPCA : UPC-A
+		UPCE : UPC-E
+		MSI : MSI (Variation of Plessey code)
+		MSI+ : MSI + CHECKSUM (modulo 11)
+		POSTNET : POSTNET
+		PLANET : PLANET
+		RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)
+		KIX : KIX (Klant index - Customer index)
+		IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200 (NOTE: requires BCMath PHP extension)
+		CODABAR : CODABAR
+		CODE11 : CODE 11
+		PHARMA : PHARMACODE
+		PHARMA2T : PHARMACODE TWO-TRACKS
+
+4.5.042 (2009-04-15)
+	- Method Write() was fixed for the strings containing only zero value.
+
+4.5.041 (2009-04-14)
+	- Barcode methods were fixed.
+
+4.5.040 (2009-04-14)
+	- Method Write() was fixed to handle empty strings.
+
+4.5.039 (2009-04-11)
+	- Support for linear barcodes was extended (see example n. 27 and barcodes.php documentation).
+
+4.5.038 (2009-04-10)
+	- Write() method was improved to support separators for Japanese, Korean, Chinese Traditional and Chinese Simplified.
+
+4.5.037 (2009-04-09)
+	- General performances were improved.
+	- The signature of the method utf8Bidi() was changed.
+	- The method UniArrSubString() was added.
+	- Experimental support for 2D barcodes were added (see example n. 50 and 2dbarcodes.php class).
+
+4.5.036 (2009-04-03)
+	- TCPDF methods can be called inside the HTML code (see example n. 49).
+	- All tag attributes, such as <p align="center"> must be enclosed within double quotes.
+
+4.5.035 (2009-03-28)
+	- Bug #2717436 "writeHTML rowspan problem (continued)" was fixed.
+	- Bug #2719090 "writeHTML fix follow up" was fixed.
+	- The method _putuserrights() was changed to avoid Adobe Reader 9.1 crash. This broken the 'trick' that was used to display forms in Acrobat Reader.
+
+4.5.034 (2009-03-27)
+	- Bug #2716914 "Bug writeHTML of a table in body and footer related with pb" was fixed.
+	- Bug #2717056 ] "writeHTML problem when setting tr style" was fixed.
+	- The signature of the Cell() method was changed.
+
+4.5.033 (2009-03-27)
+	- The support for rowspan/colspan on HTML tables was improved (see example n. 48).
+
+4.5.032 (2009-03-23)
+	- setPrintFooter(false) bug was fixed.
+
+4.5.031 (2009-03-20)
+	- Table header support was extended to multiple pages.
+
+4.5.030 (2009-03-20)
+	- thead tag is now supported on HTML tables (header rows are repeated after page breaks).
+	- The startTransaction() was improved to autocommit.
+	- List bullets now uses the foreground color (putHtmlListBullet()).
+
+4.5.029 (2009-03-19)
+	- The following methods were added to UNDO commands (see example 47): startTransaction(), commitTransaction(), rollbackTransaction().
+	- All examples were updated.
+
+4.5.028 (2009-03-18)
+	- Bug #2690945 "List Bugs" was fixed.
+	- HTML text alignment on lists was fixed.
+	- The constant PDF_FONT_MONOSPACED was added to the configuration file to define the default monospaced font.
+	- The following methods were fixed: getPageWidth(), getPageHeight(), getBreakMargin().
+	- All examples were updated.
+
+4.5.027 (2009-03-16)
+	- Method getPageDimensions() was added to get page dimensions.
+	- The signature of the following methos were changed: getPageWidth(), getPageHeight(), getBreakMargin().
+	- _parsepng() method was fixed for PNG URL images (fread bug).
+
+4.5.026 (2009-03-11)
+	- Bug #2681793 affecting URL images with spaces was fixed.
+
+4.5.025 (2009-03-10)
+	- A small bug affecting hyphenation support was fixed.
+	- The method SetDefaultMonospacedFont() was added to define the default monospaced font.
+
+4.5.024 (2009-03-07)
+	- The bug #2666493 was fixed "Footer corrupts document".
+
+4.5.023 (2009-03-06)
+	- The bug #2666688 was fixed "Rowspan in tables".
+
+4.5.022 (2009-03-05)
+	- The bug #2659676 was fixed "refer to #2157099 test 4 < BR > problem still not fixed".
+	- addTOC() function bug was fixed.
+
+4.5.020 (2009-03-03)
+	- The following bug was fixed: "function removeSHY corrupts unicode".
+
+4.5.019 (2009-02-28)
+	- The problem of decimal separator using different locale was fixed.
+	- The text hyphenation is now supported (see example n. 46).
+
+4.5.018 (2009-02-26)
+	- The _destroy() method was added to unset all class variables and frees memory.
+	- Now it's possible to call Output() method multiple times.
+
+4.5.017 (2009-02-24)
+	- A minor bug that raises a PHP warning was fixed.
+
+4.5.016 (2009-02-24)
+	- Bug item #2631200 "getNumLines() counts wrong" was fixed.
+	- Multiple attachments bug was fixed.
+	- All class variables are now cleared on Output() for memory otpimization.
+
+4.5.015 (2009-02-18)
+	- Bug item #2612553 "function Write() must not break a line on &nbsp;  character" was fixed.
+
+4.5.014 (2009-02-13)
+	- Bug item #2595015 "POSTNET Barcode Checksum Error" was fixed (on barcode.php).
+	- Pagebreak bug for barcode was fixed.
+
+4.5.013 (2009-02-12)
+	- border attribute is now supported on HTML images (only accepts the same values accepted by Cell()).
+
+4.5.012 (2009-02-12)
+	- An error on image border feature was fixed.
+
+4.5.011 (2009-02-12)
+	- HTML links for images are now supported.
+	- height attribute is now supported on HTML cells.
+	- $border parameter was added to Image() and ImageEps() methods.
+	- The method getNumLines() was added to estimate the number of lines required for the specified text.
+
+4.5.010 (2009-01-29)
+	- Bug n. 2546108 "BarCode Y position" was fixed.
+
+4.5.009 (2009-01-26)
+	- Bug n. 2538094 "Empty pdf file created" was fixed.
+
+4.5.008 (2009-01-26)
+	- setPage() method was fixed to correctly restore graphic states.
+	- Source code was cleaned up for performances.
+
+4.5.007 (2009-01-24)
+	- checkPageBreak() and write1DBarcode() methods were fixed.
+	- Source code was cleaned up for performances.
+	- barcodes.php was updated.
+
+4.5.006 (2009-01-23)
+	- getHTMLUnitToPoints() method was replaced by getHTMLUnitToUnits() to fix HTML units bugs.
+
+4.5.005 (2009-01-23)
+	- Page closing bug was fixed.
+
+4.5.004 (2009-01-21)
+	- The access of convertHTMLColorToDec() method was changed to public
+	- Fixed bug on UL tag.
+
+4.5.003 (2009-01-19)
+	- Fonts on different folders are now supported.
+
+4.5.002 (2009-01-07)
+	- addTOC() function was improved (see example n. 45).
+
+4.5.001 (2009-01-04)
+	- The signature of startPageGroup() function was changed.
+	- Method Footer() was improved to automatically print page or page-group number (see example n. 23).
+	- Protected method formatTOCPageNumber() was added to customize the format of page numbers on the Table Of Content.
+	- The signature of addTOC() was changed to include the font used for page numbers.
+
+4.5.000 (2009-01-03)
+	- A new $diskcache parameter was added to class constructor to enable disk caching and reduce RAM memory usage (see example n. 43).
+	- The method movePageTo() was added to move pages to previous positions (see example n. 44).
+	- The methods getAliasNumPage() and getPageNumGroupAlias() were added to get the alias for page number (needed when using movepageTo()).
+	- The methods addTOC() was added to print a Table Of Content (see example n. 45).
+	- Imagick class constant was removed for better compatibility with PHP4.
+	- All existing examples were updated and new examples were added.
+
+4.4.009 (2008-12-29)
+	- Examples 1 and 35 were fixed.
+
+4.4.008 (2008-12-28)
+	- Bug #2472169 "Unordered bullet size not adjusted for unit type" was fixed.
+
+4.4.007 (2008-12-23)
+	- Bug #2459935 "no unit conversion for header line" was fixed.
+	- Example n. 42 for image alpha channel was added.
+	- All examples were updated.
+
+4.4.006 (2008-12-11)
+	- Method setLIsymbol() was changed to reflect latest changes in HTML list handling.
+
+4.4.005 (2008-12-10)
+	- Bug item #2413870 "ordered list override value" was fixed.
+
+4.4.004 (2008-12-10)
+	- The protected method getHTMLUnitToPoints() was added to accept various HTML units of measure (em, ex, px, in, cm, mm, pt, pc, %).
+	- The method intToRoman() was added to convert integer number to Roman representation.
+	- Support fot HTML lists was improved: the CSS property list-style-type is now supported.
+
+4.4.003 (2008-12-09)
+	- Bug item #2412147 "Warning on line 3367" was fixed.
+	- Method setHtmlLinksStyle() was added to set default HTML link colors and font style.
+	- Method addHtmlLink() was changed to use color and style defined on the inline CSS.
+
+4.4.002 (2008-12-09)
+	- Borders on Multicell() were fixed.
+	- Problem of Multicell() on Header function (Bug item #2407579) was fixed.
+	- Problem on graphics tranformations applied to Multicell() was fixed.
+	- Support for ImageMagick was added.
+	- Width calculation for nested tables was fixed.
+
+4.4.001 (2008-12-08)
+	- Some missing core fonts were added on fonts directory.
+	- CID0 fonts rendering was fixed.
+	- HTML support was improved (<pre> and <tt> tags are now supported).
+	- Bug item #2406022 "Left padding bug in MultiCell with maxh" was fixed.
+
+4.4.000 (2008-12-07)
+	- File attachments are now supported (see example n. 41).
+	- Font functions were optimized to reduce document size.
+	- makefont.php was updated.
+	- Linux binaries were added on /fonts/utils
+	- All fonts were updated.
+	- $autopadding parameter was added to Multicell() to disable automatic padding features.
+	- $maxh parameter was added to Multicell() and Write() to set a maximum height.
+
+4.3.009 (2008-12-05)
+	- Bug item #2392989 (Custom header + setlinewidth + cell border bug) was fixed.
+
+4.3.008 (2008-12-05)
+	- Bug item #2390566 "rect bug" was fixed.
+	- File path was fixed for font embedded files.
+	- SetFont() method signature was changed to include the font filename.
+	- Some font-related methods were improved.
+	- Methods getFontFamily() and getFontStyle() were added.
+
+4.3.007 (2008-12-03)
+	- PNG alpha channel is now supported (GD library is required).
+	- AddFont() function now support custom font file path on $file parameter.
+	- The default width variable ($dw) is now always defined for any font.
+	- The 'Style' attribute on CID-0 fonts was removed because of protection bug.
+
+4.3.006 (2008-12-01)
+	- A regular expression on getHtmlDomArray() to find HTML tags was fixed.
+
+4.3.005 (2008-11-25)
+	- makefont.php was fixed.
+	- Bug item #2339877 was fixed (false loop condition detected on WriteHTML()).
+	- Bug item #2336733 was fixed (lasth value update on Multicell() when border and fill are disabled).
+	- Bug item #2342303 was fixed (automatic page-break on Image() and ImageEPS()).
+
+4.3.004 (2008-11-19)
+	- Function _textstring() was fixed (bug 2309051).
+	- All examples were updated.
+
+4.3.003 (2008-11-18)
+	- CID-0 font bug was fixed.
+	- Some functions were optimized.
+	- Function getGroupPageNoFormatted() was added.
+	- Example n. 23 was updated.
+
+4.3.002 (2008-11-17)
+	- Bug item #2305518 "CID-0 font don't work with encryption" was fixed.
+
+4.3.001 (2008-11-17)
+	- Bug item #2300007 "download mimetype pdf" was fixed.
+	- Double quotes were replaced by single quotes to improve PHP performances.
+	- A bug relative to HTML cell borders was fixed.
+
+4.3.000 (2008-11-14)
+	- The function setOpenCell() was added to set the top/bottom cell sides to be open or closed when the cell cross the page.
+	- A bug relative to list items indentation was fixed.
+	- A bug relative to borders on HTML tables and Multicell was fixed.
+	- A bug relative to rowspanned cells was fixed.
+	- A bug relative to html images across pages was fixed.
+
+4.2.009 (2008-11-13)
+	- Spaces between li tags are now automatically removed.
+
+4.2.008 (2008-11-12)
+	- A bug relative to fill color on next page was fixed.
+
+4.2.007 (2008-11-12)
+	- The function setListIndentWidth() was added to set custom indentation widht for HTML lists.
+
+4.2.006 (2008-11-06)
+	- A bug relative to HTML justification was fixed.
+
+4.2.005 (2008-11-06)
+	- A bug relative to HTML justification was fixed.
+	- The methods formatPageNumber() and PageNoFormatted() were added to format page numbers.
+	- Default Footer() method was changed to use PageNoFormatted() instead of PageNo().
+	- Example 6 was updated.
+
+4.2.004 (2008-11-04)
+	- Bug item n. 2217039 "filename handling improvement" was fixed.
+
+4.2.003 (2008-10-31)
+	- Font style bug was fixed.
+
+4.2.002 (2008-10-31)
+	- Bug item #2210922 (htm element br not work) was fixed.
+	- Write() function was improved to support margin changes.
+
+4.2.001 (2008-10-30)
+	- setHtmlVSpace($tagvs) function was added to set custom vertical spaces for HTML tags.
+	- writeHTML() function now support margin changes during execution.
+	- Signature of addHTMLVertSpace() function is changed.
+
+4.2.000 (2008-10-29)
+	- htmlcolors.php was changed to support class-loaders.
+	- ImageEps() function was improved in performances.
+	- Signature of Link() And Annotation() functions were changed.
+	- (Bug item #2198926) Links and Annotations alignment were fixed (support for geometric tranformations was added).
+	- rowspan mode for HTML table cells was improved and fixed.
+	- Booklet mode for double-sided pages was added; see SetBooklet() function and example n. 40.
+	- lastPage() signature is changed.
+	- Signature of Write() function is changed.
+	- Some HTML justification problems were fixed.
+	- Some functions were fixed to better support RTL mode.
+	- Example n. 10 was changed to support RTL mode.
+	- All examples were updated.
+
+4.1.004 (2008-10-23)
+	- unicode_data.php was changed to support class-loaders.
+	- Bug item #2186040/2 (writeHTML margin problem) was fixed.
+
+4.1.003 (2008-10-22)
+	- Bug item #2185399 was fixed (rowspan and page break).
+	- Bugs item #2186040 was fixed (writeHTML margin problem).
+	- Newline after table was removed.
+
+4.1.002 (2008-10-21)
+	- Bug item #2184525 was fixed (rowspan on HTML cell).
+
+4.1.001 (2008-10-21)
+	- Support for "start" attribute was added to HTML ordered list.
+	- unicode_data.php file was changed to include UTF-8 to ASCII table.
+	- Some functions were modified to better support UTF-8 extensions to core fonts.
+	- Support for images on HTML lists was improved.
+	- Examples n. 1 and 6 were updated.
+
+4.1.000 (2008-10-18)
+	- Page-break bug using HTML content was fixed.
+	- The "false" parameter was reintroduced to class_exists function on PHP5 version to avoid autoload.
+	- addHtmlLink() function was improved to support internal links (i.e.: <a href="#23">link to page 23</a>).
+	- Justification alignment is now supported on HTML (see example n. 39).
+	- example_006.php was updated.
+
+4.0.033 (2008-10-13)
+	- Bug n. 2157099 was fixed.
+	- SetX() and SetY() functions were improved.
+	- SetY() includes a new parameter to avoid the X reset.
+
+4.0.032 (2008-10-10)
+	- Bug n. 2156926 was fixed (bold, italic, underlined, linethrough).
+	- setStyle() method was removed.
+	- Configuration file was changed to use helvetica (non-unicode) font by default.
+	- The use of mixed font types was improved.
+	- All examples were updated.
+
+4.0.031 (2008-10-09)
+	- _putannots() and _putbookmarks() links alignments were fixed.
+
+4.0.030 (2008-10-07)
+	- _putbookmarks() function was fixed.
+	- _putannots() was fixed to include internal links.
+
+4.0.029 (2008-09-27)
+	- Infinite loop bug was fixed [Bug item #130309].
+	- Multicell() problem on Header() was fixed.
+
+4.0.028 (2008-09-26)
+	- setLIsymbol() was added to set the LI symbol used on UL lists.
+	- Missing $padding and $encryption_key variables declarations were added [Bug item #2129058].
+
+4.0.027 (2008-09-19)
+	- Bug #2118588 "Undefined offset in tcpdf.php on line 9581" was fixed.
+	- arailunicid0.php font was updated.
+	- The problem of javascript form fields duplication after saving was fixed.
+
+4.0.026 (2008-09-17)
+	- convertHTMLColorToDec() function was improved to support rgb(RR,GG,BB) notation.
+	- The following inline CSS attributes are now supported: text-decoration, color, background-color and font-size names: xx-small, x-small, small, medium, large, x-large, xx-large
+	- Example n. 6 was updated.
+
+4.0.025 (2008-09-15)
+	- _putcidfont0 function was improved to include CJK fonts (Chinese, Japanese, Korean, CJK, Asian fonts) without embedding.
+	- arialunicid0 font was added (see the new example n. 38).
+	- The following Unicode to CID-0 tables were added on fonts folder: uni2cid_ak12.php, uni2cid_aj16.php, uni2cid_ag15.php, uni2cid_ac15.php.
+
+4.0.024 (2008-09-12)
+	- "stripos" function was replaced with "strpos + strtolower" for backward compatibility with PHP4.
+	- support for Spot Colors were added. Check the new example n. 37 and the following new functions:
+		AddSpotColor()
+		SetDrawSpotColor()
+		SetFillSpotColor()
+		SetTextSpotColor()
+		_putspotcolors()
+	- Bookmark() function was improved to fix wrong levels.
+	- $lasth changes after header/footer calls were fixed.
+
+4.0.023 (2008-09-05)
+	- Some HTML related problems were fixed.
+	- Image alignment on HTML was changed, now it always defaults to the normal mode (see example_006.php).
+
+4.0.022 (2008-08-28)
+	- Line height on HTML was fixed.
+	- Image inside an HTML cell problem was fixed.
+	- A new "zarbold" persian font was added.
+
+4.0.021 (2008-08-24)
+	- HTTP headers were fixed on Output function().
+	- getAliasNbPages() and getPageGroupAlias() functions were changed to support non-unicode fonts on unicode documents.
+	- Function Write() was fixed.
+	- The problem of additional vertical spaces on HTML was fixed.
+	- The problem of frame around HTML links was fixed.
+
+4.0.020 (2008-08-15)
+	- "[2052259] WriteHTML <u> & <b>" bug was fixed.
+
+4.0.019 (2008-08-13)
+	- "Rowspan on first cell" bug was fixed.
+
+4.0.018 (2008-08-08)
+	- Default cellpadding for HTML tables was fixed.
+	- Annotation() function was added to support some PDF annotations (see example_036.php and section 8.4 of PDF reference 1.7).
+	- HTML links are now correclty shifted during line alignments.
+	- function getAliasNbPages() was added and Footer() was updated.
+	- RowSpan mode for HTML tables was fixed.
+	- Bugs item #2043610 "Multiple sizes vertical align wrong" was fixed.
+	- ImageEPS() function was improved and RTL alignment was fixed (see example_032.php).
+
+4.0.017 (2008-08-05)
+	- Missing CNZ and CEO style modes were added to Rect() function.
+	- Fonts utils were updated to include support for OpenType fonts.
+	- getLastH() function was added.
+
+4.0.016 (2008-07-30)
+	- setPageMark() function was added. This function must be called after calling Image() function for a background image.
+
+4.0.015 (2008-07-29)
+	- Some functions were changed to support different page formats (see example_028.php).
+	- The signature of setPage() function is changed.
+
+4.0.014 (2008-07-29)
+	- K_PATH_MAIN calculation on tcpdf_config.php was fixed.
+	- HTML support for EPS/AI images was added (see example_006.php).
+	- Bugs item #2030807 "Truncated text on multipage html fields" was fixed.
+	- PDF header bug was fixed.
+	- helvetica was added as default font family.
+	- Stroke mode was fixed on Text function.
+	- several minor bugs were fixed.
+
+4.0.013 (2008-07-27)
+	- Bugs item #2027799 " Big spaces between lines after page break" was fixed.
+	- K_PATH_MAIN calculation on tcpdf_config.php was changed.
+	- Function setVisibility() was fixed to avoid the "Incorrect PDEObject type" error message.
+
+4.0.012 (2008-07-24)
+	- Addpage(), Header() and Footer() functions were changed to simplify the implementation of external header/footer functions.
+	- The following functions were added:
+			setHeader()
+			setFooter()
+			getImageRBX()
+			getImageRBY()
+			getCellHeightRatio()
+			getHeaderFont()
+			getFooterFont()
+			getRTL()
+			getBarcode()
+			getHeaderData()
+			getHeaderMargin()
+			getFooterMargin()
+
+4.0.011 (2008-07-23)
+	- Font support was improved.
+	- The folder /fonts/utils contains new utilities and instructions for embedd font files.
+	- Documentation was updated.
+
+4.0.010 (2008-07-22)
+	- HTML tables were fixed to work across pages.
+	- Header() and Footer() functions were updated to preserve previous settings.
+	- example_035.php was added.
+
+4.0.009 (2008-07-21)
+	- UTF8StringToArray() function was fixed for non-unicode mode.
+
+4.0.008 (2008-07-21)
+	- Barcodes alignment was fixed (see example_027.php).
+	- unicode_data.php was updated.
+	- Arabic shaping for "Zero-Width Non-Joiner" character (U+200C) was fixed.
+
+4.0.007 (2008-07-18)
+	- str_split was replaced by preg_split for compatibility with PHP4 version.
+	- Clipping mode was added to all graphic functions by using parameter $style = "CNZ" or "CEO" (see example_034.php).
+
+4.0.006 (2008-07-16)
+	- HTML rowspan bug was fixed.
+	- Line style for MultiCell() was fixed.
+	- WriteHTML() function was improved.
+	- CODE128C barcode was fixed (barcodes.php).
+
+4.0.005 (2008-07-11)
+	- Bug [2015715] "PHP Error/Warning" was fixed.
+
+4.0.004 (2008-07-09)
+	- HTML cell internal padding was fixed.
+
+4.0.003 (2008-07-08)
+	- Removed URL encoding when F option is selected on Output() function.
+	- fixed some minor bugs in html tables.
+
+4.0.002 (2008-07-07)
+	- Bug [2000861] was still unfixed and has been fixed.
+
+4.0.001 (2008-07-05)
+	- Bug [2000861] was fixed.
+
+4.0.000 (2008-07-03)
+	- THIS IS A MAIN RELEASE THAT INCLUDES SEVERAL NEW FEATURES AND BUGFIXES
+	- Signature fo SetTextColor() and SetFillColor() functions was changed (parameter $storeprev was removed).
+	- HTML support was completely rewritten and improved (see example 6).
+	- Alignments parameters were fixed.
+	- Functions GetArrStringWidth() and GetStringWidth() now include font parameters.
+	- Fonts support was improved.
+	- All core fonts were replaced and moved to fonts/ directory.
+	- The following functions were added: getMargins(), getFontSize(), getFontSizePt().
+	- File config/tcpdf_config_old.php was renamed tcpdf_config_alt.php and updated.
+	- Multicell and WriteHTMLCell fill function was fixed.
+	- Several minor bugs were fixed.
+	- barcodes.php was updated.
+	- All examples were updated.
+
+------------------------------------------------------------
+
+3.1.001 (2008-06-13)
+	- Bug [1992515] "K_PATH_FONTS default value wrong" was fixed.
+	- Vera font was removed, DejaVu font and Free fonts were updated.
+	- Image handling was improved.
+	- All examples were updated.
+
+3.1.000 (2008-06-11)
+	- setPDFVersion() was added to change the default PDF version (currently 1.7).
+	- setViewerPreferences() was added to control the way the document is to be presented on the screen or printed (see example 29).
+	- SetDisplayMode() signature was changed (new options were added).
+	- LinearGradient(), RadialGradient(), CoonsPatchMesh() functions were added to print various color gradients (see example 30).
+	- PieSector() function was added to render render pie charts (see example 31).
+	- ImageEps() was added to display EPS and AI images with limited support (see example 32).
+	- writeBarcode() function is now depracated, a new write1DBarcode() function was added. The barcode directory was removed and a new barcodes.php file was added.
+	- The new write1DBarcode() function support more barcodes and do not need the GD library (see example 027). All barcodes are directly written to PDF using graphic functions.
+	- HTML lists were improved and could be nested (you may now represent trees).
+	- AddFont() bug was fixed.
+	- _putfonts() bug was fixed.
+	- graphics functions were fixed.
+	- unicode_data.php file was updated (fixed).
+	- almohanad font was updated.
+	- example 18 was updated (Farsi and Arabic languages).
+	- source code cleanup.
+	- All examples were updated and new examples were added.
+
+3.0.015 (2008-06-06)
+	- AddPage() function signature is changed to include page format.
+	- example 28 was added to show page format changes.
+	- setPageUnit() function was added to change the page units of measure.
+	- setPageFormat() function was added to change the page format and orientation between pages.
+	- setPageOrientation() function was added to change the page orientation.
+	- Arabic font shaping was fixed for laa letter and square boxes (see the example 18).
+
+3.0.014 (2008-06-04)
+	- Arabic font shaping was fixed.
+	- setDefaultTableColumns() function was added.
+	- $cell_height_ratio variable was added.
+	- setCellHeightRatio() function was added to define the default height of cell repect font height.
+
+3.0.013 (2008-06-03)
+	- Multicell height parameter was fixed.
+	- Arabic font shaping was improved.
+	- unicode_data.php was updated.
+
+3.0.012 (2008-05-30)
+	- K_PATH_MAIN and K_PATH_URL constants are now automatically set on config file.
+	- DOCUMENT_ROOT constant was fixed for IIS Webserver (config file was updated).
+	- Arabic font shaping was improved.
+	- TranslateY() function was fixed (bug [1977962]).
+	- setVisibility() function was fixed.
+	- writeBarcode() function was fixed to scale using $xref parameter.
+	- All examples were updated.
+
+3.0.011 (2008-05-23)
+	- CMYK color support was added to all graphic functions.
+	- HTML table support was improved:
+	  -- now it's possible to include additional html tags inside a cell;
+	  -- colspan attribute was added.
+	- example 006 was updated.
+
+3.0.010 (2008-05-21)
+	- fixed $laa_array inclusion on utf8Bidi() function.
+
+3.0.009 (2008-05-20)
+	- unicode_data.php was updated.
+	- Arabic laa letter problem was fixed.
+
+3.0.008 (2008-05-12)
+	- Arabic support was fixed and improved (unicode_data.php was updated).
+	- Polycurve() function was added to draw a poly-Bezier curve.
+	- list items alignment was fixed.
+	- example 6 was updated.
+
+3.0.007 (2008-05-06)
+	- Arabic support was fixed and improved.
+	- AlMohanad (arabic) font was added.
+	- C128 barcode bugs were fixed.
+
+3.0.006 (2008-04-21)
+	- Condition to check negative width values was added.
+
+3.0.005 (2008-04-18)
+	- back-Slash character escape was fixed on writeHTML() function.
+	- Exampe 6 was updated.
+
+3.0.004 (2008-04-11)
+	- Bug [1939304] (Right to Left Issue) was fixed.
+
+3.0.003 (2008-04-07)
+	- Bug [1934523](Words between HTML tags in cell not kept on one line) was fixed.
+	- "face" attribute of "font" tag is now fully supported.
+
+3.0.002 (2008-04-01)
+	- Write() functions now return the number of cells and not the number of lines.
+	- TCPDF is released under LGPL 2.1, or any later version.
+
+3.0.001 (2008-05-28)
+	- _legacyparsejpeg() and _legacyparsepng() were renamed _parsejpeg() and _parsepng().
+	- function writeBarcode() was fixed.
+	- all examples were updated.
+	- example 27 was added to show various barcodes.
+
+3.0.000 (2008-03-27)
+	- private function pixelsToMillimeters() was changed to public function pixelsToUnits() to fix html image size bug.
+	- Image-related functions were rewritten.
+	- resize parameter was added to Image() signature to reduce the image size and fit width and height (see example 9).
+	- TCPDF now supports all images supported by GD library: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM.
+	- CMYK support was added to SetDrawColor(), SetFillColor(), SetTextColor() (see example 22).
+	- Page Groups were added (see example 23).
+	- setVisibility() function was added to restrict the rendering of some elements to screen or printout (see example 24).
+	- All private variables and functions were changed to protected.
+	- setAlpha() function was added to give transparency support for all objects (see example 25).
+	- Clipping and stroke modes were added to Text() function (see example 26).
+	- All examples were moved to "examples" directory.
+	- function setJPEGQuality() was added to set the JPEG image comrpession (see example 9).
+
+2.9.000 (2008-03-26)
+	- htmlcolors.php file was added to include html colors.
+	- Support for HTML color names and three-digit hexadecimal color codes was added.
+	- private function convertColorHexToDec() was renamed convertHTMLColorToDec().
+	- color and bgcolor attributes are now supported on all HTML tags (color nesting is also supported).
+	- Write() function were fixed.
+	- example_006.php was updated.
+	- private function setUserRights() was added to release user rights on Acrobat Reader (this allows to display forms, see example 14)
+
+2.8.000 (2008-03-20)
+	- Private variables were changed to protected.
+	- Function Write() was fixed and improved.
+	- Support for dl, dt, dd, del HTML tags was introduced.
+	- Line-trought mode was added for HTML and text.
+	- Text vertical alignment on cells were fixed.
+	- Examples were updated to reflect changes.
+
+2.7.002 (2008-03-13)
+	- Bug "[1912142] Encrypted PDF created/modified date" was fixed.
+
+2.7.001 (2008-03-10)
+	- Cell justification was fixed for non-unicode mode.
+
+2.7.000 (2008-03-09)
+	- Cell() stretching mode 4 (forced character spacing) was fixed.
+	- writeHTMLCell() now uses Multicell() to write.
+	- Multicell() has a new parameter $ishtml to act as writeHTMLCell().
+	- Write() speed was improved for non-arabic strings.
+	- Example n. 20 was changed.
+
+2.6.000 (2008-03-07)
+	- various alignments bugs were fixed.
+
+2.5.000 (2008-03-07)
+	- Several bugs were fixed.
+	- example_019.php was added to test non-unicode mode using old fonts.
+
+2.4.000 (2008-03-06)
+	- RTL support was deeply improved.
+	- GetStringWidth() was fixed to support RTL languages.
+	- Text() RTL alignment was fixed.
+	- Some functions were added: GetArrStringWidth(), GetCharWidth(), uniord(), utf8Bidi().
+	- example_018.php was added and test_unicode.php was removed.
+
+2.3.000 (2008-03-05)
+	- MultiCell() signature is changed. Now support multiple columns across pages (see example_017).
+	- Write() signature is changed. Now support the cell mode to be used with MultiCell.
+	- Header() and Footer() were changed.
+	- The following functions were added: UTF8ArrSubString() and unichr().
+	- Examples were updated to reflect last changes.
+
+2.2.004 (2008-03-04)
+	- Several examples were added.
+	- AddPage() Header() and Footer() were fixed.
+	- Documentation is now available on http://www.tcpdf.org
+
+2.2.003 (2008-03-03)
+	- [1894853] Performance of MultiCell() was improved.
+	- RadioButton and ListBox functions were added.
+	- javascript form functions were rewritten and properties names are changed. The properties function supported by form fields are listed on Possible values are listed on http://www.adobe.com/devnet/acrobat/pdfs/js_developer_guide.pdf.
+
+2.2.002 (2008-02-28)
+	- [1900495] html images path was fixed.
+	- Legacy image functions were reintroduced to allow PNG and JPEG support without GD library.
+
+2.2.001 (2008-02-16)
+	- The bug "[1894700] bug with replace relative path" was fixed
+	- Justification was fixed
+
+2.2.000 (2008-02-12)
+	- fixed javascript bug introduced with latest release
+
+2.1.002 (2008-02-12)
+	- Justify function was fixed on PHP4 version.
+	- Bookmank function was added ([1578250] Table of contents).
+	- Javascript and Form fields support was added ([1796359] Form fields).
+
+2.1.001 (2008-02-10)
+	- The bug "[1885776] Race Condition in function justitfy" was fixed.
+	- The bug "[1890217] xpdf complains that pdf is incorrect" was fixed.
+
+2.1.000 (2008-01-07)
+	- FPDF_FONTPATH constant was changed to K_PATH_FONTS on config file
+	- Bidirectional Algorithm to correctly reverse bidirectional languages was added.
+	- SetLeftMargin, SetTopMargin, SetRightMargin functions were fixed.
+	- SetCellPadding function was added.
+	- writeHTML was updated with new parameters.
+	- Text function was fixed.
+	- MultiCell function was fixed, now works also across multiple pages.
+	- Line width was fixed on Header and Footer functions and <hr> tag.
+	- "GetImageSize" was renamed "getimagesize".
+	- Document version was changed from 1.3 to 1.5.
+	- _begindoc() function was fixed.
+	- ChangeDate was fixed and ModDate was added.
+	- The following functions were added:
+	  setPage() : Move pointer to the specified document page.
+	  getPage() : Get current document page number.
+	  lastpage() : Reset pointer to the last document page.
+	  getNumPages() : Get the total number of inserted pages.
+	  GetNumChars() : count the number of (UTF-8) characters in a string.
+	- $stretch parameter was added to Cell() function to fit text on cell:
+			0 = disabled
+			1 = horizontal scaling only if necessary
+			2 = forced horizontal scaling
+			3 = character spacing only if necessary
+			4 = forced character spacing
+	- Line function was fixed for RTL.
+	- Graphic transformation functions were added [1811158]:
+			StartTransform()
+			StopTransform()
+			ScaleX()
+			ScaleY()
+			ScaleXY()
+			Scale()
+			MirrorH()
+			MirrorV()
+			MirrorP()
+			MirrorL()
+			TranslateX()
+			TranslateY()
+			Translate()
+			Rotate()
+			SkewX()
+			SkewY()
+			Skew()
+	- Graphic function were added/updated [1688549]:
+			SetLineStyle()
+			_outPoint()
+			_outLine()
+			_outRect()
+			_outCurve()
+			Line()
+			Rect()
+			Curve
+			Ellipse
+			Circle
+			Polygon
+			RegularPolygon
+
+2.0.000 (2008-01-04)
+	- RTL (Right-To-Left) languages support was added. Language direction is set using the $l['a_meta_dir'] setting on /configure/language/xxx.php language files.
+	- setRTL($enable) method was added to manually enable/disable the RTL text direction.
+	- The attribute "dir" was added to support custom text direction on HTML tags. Possible values are: ltr - for Left-To-Right and RTL for Right-To-Left.
+	- RC4 40bit encryption was added. Check the SetProtection method.
+	- [1815213] Improved image support for GIF, JPEG, PNG formats.
+	- [1800094] Attribute "value" was added to ordered list items <li>.
+	- Image function now has a new "align" parameter that indicates the alignment of the pointer next to image insertion and relative to image height. The value can be:
+			T: top-right for LTR or top-left for RTL
+			M: middle-right for LTR or middle-left for RTL
+			B: bottom-right for LTR or bottom-left for RTL
+			N: next line
+	- Attribute "align" was added to <img> html tag to set the above image "align" parameter. Possible values are:
+			top: top-right for LTR or top-left for RTL
+			middle: middle-right for LTR or middle-left for RTL
+			bottom: bottom-right for LTR or bottom-left for RTL
+	- [1798103] newline was added after </ul>, </ol> and </p> tages.
+	- [1816393] Documentation was updated.
+	- 'ln' parameter was fixed on writeHTMLCell. Now it's possible to print two or more columns across several pages;
+	- The method lastPage() was added to move the pointer on the last page;
+
+------------------------------------------------------------
+
+1.53.0.TC034 (2007-07-30)
+	- fixed htmlentities conversion.
+	- MultiCell() function returns the number of cells.
+
+1.53.0.TC033 (2007-07-30)
+	- fixed bug 1762550: case sensitive for font files
+	- NOTE: all fonts files names must be in lowercase!
+
+1.53.0.TC032 (2007-07-27)
+	- setLastH method was added to resolve bug 1689071.
+	- all fonts names were converted in lowercase (bug 1713005).
+	- bug 1740954 was fixed.
+	- justification was added as Cell option.
+
+1.53.0.TC031 (2007-03-20)
+	- ToUnicode CMap were added on _puttruetypeunicode function. Now you may search and copy unicode text.
+
+1.53.0.TC030 (2007-03-06)
+	- fixed bug on PHP4 version.
+
+1.53.0.TC029 (2007-03-06)
+	- DejaVu Fonts were added.
+
+1.53.0.TC028 (2007-03-03)
+	- MultiCell function signature were changed: the $ln parameter were added. Check documentation for further information.
+	- Greek language were added on example sentences.
+	- setPrintHeader() and setPrintFooter() functions were added to enable or disable page header and footer.
+
+1.53.0.TC027 (2006-12-14)
+	- $attr['face'] bug were fixed.
+	- K_TCPDF_EXTERNAL_CONFIG control where introduced on /config/tcpdf_config.php to use external configuration files.
+
+1.53.0.TC026 (2006-10-28)
+	- writeHTML function call were fixed on examples.
+
+1.53.0.TC025 (2006-10-27)
+	- Bugs item #1421290 were fixed (0D - 0A substitution in some characters)
+	- Bugs item #1573174 were fixed (MultiCell documentation)
+
+1.53.0.TC024 (2006-09-26)
+	- getPageHeight() function were fixed (bug 1543476).
+	- fixed missing breaks on closedHTMLTagHandler function (bug 1535263).
+	- fixed extra spaces on Write function (bug 1535262).
+
+1.53.0.TC023 (2006-08-04)
+	- paths to barcode directory were fixed.
+	- documentation were updated.
+
+1.53.0.TC022 (2006-07-16)
+	- fixed bug: [ 1516858 ] Probs with PHP autoloader and class_exists()
+
+1.53.0.TC021 (2006-07-01)
+	- HTML attributes with whitespaces are now supported (thanks to Nelson Benitez for his support)
+
+1.53.0.TC020 (2006-06-23)
+	- code cleanup
+
+1.53.0.TC019 (2006-05-21)
+	- fixed <strong> and <em> closing tags
+
+1.53.0.TC018 (2006-05-18)
+	- fixed font names bug
+
+1.53.0.TC017 (2006-05-18)
+	- the TTF2UFM utility to convert True Type fonts for TCPDF were included on fonts folder.
+	- new free unicode fonts were included on /fonts/freefont.
+	- test_unicode.php example were exended.
+	- parameter $fill were added on Write, writeHTML and writeHTMLCell functions.
+	- documentation were updated.
+
+1.53.0.TC016 (2006-03-09)
+	- fixed closing <strong> tag on html parser.
+
+1.53.0.TC016 (2005-08-28)
+	- fpdf.php and tcpdf.php files were joined in one single class (you can still extend TCPDF with your own class).
+	- fixed problem when mb_internal_encoding is set.
+
+1.53.0.TC014 (2005-05-29)
+	- fixed WriteHTMLCell new page issue.
+
+1.53.0.TC013 (2005-05-29)
+	- fixed WriteHTMLCell across pages.
+
+1.53.0.TC012 (2005-05-29)
+	- font color attribute bug were fixed.
+
+1.53.0.TC011 (2005-03-31)
+	- SetFont function were fixed (thank Sjaak Lauwers for bug notice).
+
+1.53.0.TC010 (2005-03-22)
+	- the html functions were improved (thanks to Manfred Vervuert for bug reporting).
+
+1.53.0.TC009 (2005-03-19)
+	- a wrong reference to convertColorHexToDec were fixed.
+
+1.53.0.TC008 (2005-02-07)
+	- removed some extra bytes from PHP files.
+
+1.53.0.TC007 (2005-01-08)
+	- fill attribute were removed from writeHTMLCell method.
+
+1.53.0.TC006 (2005-01-08)
+	- the documentation were updated.
+
+1.53.0.TC005 (2005-01-05)
+	- Steven Wittens's unicode methods were removed.
+	- All unicode methods were rewritten from scratch.
+	- TCPDF is now licensed as LGPL.
+
+1.53.0.TC004 (2005-01-04)
+	- this changelog were added.
+	- removed commercial fonts for licensing issue.
+	- Bitstream Vera Fonts were added (http://www.bitstream.com/font_rendering/products/dev_fonts/vera.html).
+	- Now the AddFont and SetFont functions returns the basic font if the styled version do not exist.
+
+EOF --------------------------------------------------------
diff --git a/htmltest/sites/all/libraries/tcpdf-version/LICENSE.TXT b/htmltest/sites/all/libraries/tcpdf-version/LICENSE.TXT
new file mode 100644
index 00000000..daf21f7d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/LICENSE.TXT
@@ -0,0 +1,858 @@
+**********************************************************************
+* TCPDF LICENSE
+**********************************************************************
+
+  TCPDF 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 3 of the
+  License, or (at your option) any later version.
+
+**********************************************************************
+**********************************************************************
+
+                   GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
+**********************************************************************
+**********************************************************************
+
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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 <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
+**********************************************************************
+**********************************************************************
diff --git a/htmltest/sites/all/libraries/tcpdf-version/README.TXT b/htmltest/sites/all/libraries/tcpdf-version/README.TXT
new file mode 100644
index 00000000..593e4d21
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/README.TXT
@@ -0,0 +1,111 @@
+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
+
+------------------------------------------------------------
+
+Name: TCPDF
+Version: 6.0.038
+Release date: 2013-10-06
+Author:	Nicola Asuni
+
+Copyright (c) 2002-2013:
+	Nicola Asuni
+	Tecnick.com LTD
+	www.tecnick.com
+
+URLs:
+	http://www.tcpdf.org
+	http://www.sourceforge.net/projects/tcpdf
+
+Description:
+	TCPDF is a PHP class for generating PDF files on-the-fly without requiring external extensions.
+	This library includes also a class to extract data from existing PDF documents and
+	classes to generate 1D and 2D barcodes in various formats.
+
+Main Features:
+    * no external libraries are required for the basic functions;
+    * all standard page formats, custom page formats, custom margins and units of measure;
+    * UTF-8 Unicode and Right-To-Left languages;
+    * TrueTypeUnicode, OpenTypeUnicode v1, TrueType, OpenType v1, Type1 and CID-0 fonts;
+    * 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)
+    * 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 Extention, 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;
+    * document encryption up to 256 bit and digital signature certifications;
+    * transactions to UNDO commands;
+    * PDF annotations, including links, text and file attachments;
+    * text rendering modes (fill, stroke and clipping);
+    * multiple columns mode;
+    * no-write page regions;
+    * bookmarks, named destinations and table of content;
+    * text hyphenation;
+    * text stretching and spacing (tracking);
+    * automatic page break, line break and text alignments including justification;
+    * automatic page numbering and page groups;
+    * move and delete pages;
+    * page compression (requires php-zlib extension);
+    * XOBject Templates;
+	* Layers and object visibility.
+	* PDF/A-1b support.
+
+Installation (full instructions on http:  www.tcpdf.org):
+	1. copy the folder on your Web server
+	2. set your installation path and other parameters on the config/tcpdf_config.php
+	3. call the examples/example_001.php page with your browser to see an example
+
+Source Code Documentation:
+	http://www.tcpdf.org
+
+Additional Documentation:
+	http://www.tcpdf.org
+
+License:
+	Copyright (C) 2002-2013  Nicola Asuni - Tecnick.com LTD
+
+	TCPDF 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 3 of the
+	License, or (at your option) any later version.
+
+	TCPDF 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 License
+	along with TCPDF. If not, see
+	<http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>.
+
+	See LICENSE.TXT file for more information.
+
+Third party fonts:
+
+	This library may include third party font files released with different licenses.
+	
+	All the PHP files on the fonts directory are subject to the general TCPDF license (GNU-LGPLv3),
+	they do not contain any binary data but just a description of the general properties of a particular font.
+	These files can be also generated on the fly using the font utilities and TCPDF methods.
+	
+	All the original binary TTF font files have been renamed for compatibility with TCPDF and compressed using the gzcompress PHP function that uses the ZLIB data format (.z files).
+	
+	The binary files (.z) that begins with the prefix "free" have been extracted from the GNU FreeFont collection (GNU-GPLv3).
+	The binary files (.z) that begins with the prefix "pdfa" have been derived from the GNU FreeFont, so they are subject to the same license.
+	For the details of Copyright, License and other information, please check the files inside the directory fonts/freefont-20120503
+	Link : http://www.gnu.org/software/freefont/
+	
+	The binary files (.z) that begins with the prefix "dejavu" have been extracted from the DejaVu fonts 2.33 (Bitstream) collection.
+	For the details of Copyright, License and other information, please check the files inside the directory fonts/dejavu-fonts-ttf-2.33
+	Link : http://dejavu-fonts.org
+	
+	The binary files (.z) that begins with the prefix "ae" have been extracted from the Arabeyes.org collection (GNU-GPLv2).
+	Link : http://projects.arabeyes.org/
+
+
+============================================================
diff --git a/htmltest/sites/all/libraries/tcpdf-version/composer.json b/htmltest/sites/all/libraries/tcpdf-version/composer.json
new file mode 100644
index 00000000..b86e643a
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/composer.json
@@ -0,0 +1,40 @@
+{
+	"name": "tecnick.com/tcpdf",
+	"version": "6.0.038",
+	"homepage": "http://www.tcpdf.org/",
+	"type": "library",
+	"description": "TCPDF is a PHP class for generating PDF documents.",
+	"keywords": ["PDF","tcpdf","PDFD32000-2008","qrcode","datamatrix","pdf417","barcodes"],
+	"license": "LGPLv3",
+	"authors": [
+	{
+		"name": "Nicola Asuni",
+		"email": "info@tecnick.com",
+		"homepage": "http://nicolaasuni.tecnick.com"
+	}
+	],
+	"require": {
+		"php": ">=5.3.0"
+	},
+	"autoload": {
+		"classmap": [
+		"fonts",
+		"config",
+		"include",
+		"tcpdf.php",
+		"tcpdf_parser.php",
+		"tcpdf_import.php",
+		"tcpdf_barcodes_1d.php",
+		"tcpdf_barcodes_2d.php",
+		"include/tcpdf_colors.php",
+		"include/tcpdf_filters.php",
+		"include/tcpdf_font_data.php",
+		"include/tcpdf_fonts.php",
+		"include/tcpdf_images.php",
+		"include/tcpdf_static.php",
+		"include/barcodes/datamatrix.php",
+		"include/barcodes/pdf417.php",
+		"include/barcodes/qrcode.php"
+		]
+	}
+}
diff --git a/htmltest/sites/all/libraries/tcpdf-version/config/tcpdf_config.php b/htmltest/sites/all/libraries/tcpdf-version/config/tcpdf_config.php
new file mode 100644
index 00000000..e6c1bf0d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/config/tcpdf_config.php
@@ -0,0 +1,219 @@
+<?php
+//============================================================+
+// File name   : tcpdf_config.php
+// Begin       : 2004-06-11
+// Last Update : 2013-05-16
+//
+// Description : Configuration file for TCPDF.
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2004-2013  Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+//============================================================+
+
+/**
+ * Configuration file for TCPDF.
+ * @author Nicola Asuni
+ * @package com.tecnick.tcpdf
+ * @version 4.9.005
+ * @since 2004-10-27
+ */
+
+// If you define the constant K_TCPDF_EXTERNAL_CONFIG, the following settings will be ignored.
+
+/**
+ * Installation path (/var/www/tcpdf/).
+ * By default it is automatically calculated but you can also set it as a fixed string to improve performances.
+ */
+//define ('K_PATH_MAIN', '');
+
+/**
+ * URL path to tcpdf installation folder (http://localhost/tcpdf/).
+ * By default it is automatically set but you can also set it as a fixed string to improve performances.
+ */
+//define ('K_PATH_URL', '');
+
+/**
+ * Path for PDF fonts.
+ * By default it is automatically set but you can also set it as a fixed string to improve performances.
+ */
+//define ('K_PATH_FONTS', K_PATH_MAIN.'fonts/');
+
+/**
+ * Default images directory.
+ * By default it is automatically set but you can also set it as a fixed string to improve performances.
+ */
+//define ('K_PATH_IMAGES', '');
+
+/**
+ * Deafult image logo used be the default Header() method.
+ * Please set here your own logo or an empty string to disable it.
+ */
+//define ('PDF_HEADER_LOGO', '');
+
+/**
+ * Header logo image width in user units.
+ */
+//define ('PDF_HEADER_LOGO_WIDTH', 0);
+
+/**
+ * Cache directory for temporary files (full path).
+ */
+define ('K_PATH_CACHE', sys_get_temp_dir().'/');
+
+/**
+ * Generic name for a blank image.
+ */
+define ('K_BLANK_IMAGE', '_blank.png');
+
+/**
+ * Page format.
+ */
+define ('PDF_PAGE_FORMAT', 'A4');
+
+/**
+ * Page orientation (P=portrait, L=landscape).
+ */
+define ('PDF_PAGE_ORIENTATION', 'P');
+
+/**
+ * Document creator.
+ */
+define ('PDF_CREATOR', 'TCPDF');
+
+/**
+ * Document author.
+ */
+define ('PDF_AUTHOR', 'TCPDF');
+
+/**
+ * Header title.
+ */
+define ('PDF_HEADER_TITLE', 'TCPDF Example');
+
+/**
+ * Header description string.
+ */
+define ('PDF_HEADER_STRING', "by Nicola Asuni - Tecnick.com\nwww.tcpdf.org");
+
+/**
+ * Document unit of measure [pt=point, mm=millimeter, cm=centimeter, in=inch].
+ */
+define ('PDF_UNIT', 'mm');
+
+/**
+ * Header margin.
+ */
+define ('PDF_MARGIN_HEADER', 5);
+
+/**
+ * Footer margin.
+ */
+define ('PDF_MARGIN_FOOTER', 10);
+
+/**
+ * Top margin.
+ */
+define ('PDF_MARGIN_TOP', 27);
+
+/**
+ * Bottom margin.
+ */
+define ('PDF_MARGIN_BOTTOM', 25);
+
+/**
+ * Left margin.
+ */
+define ('PDF_MARGIN_LEFT', 15);
+
+/**
+ * Right margin.
+ */
+define ('PDF_MARGIN_RIGHT', 15);
+
+/**
+ * Default main font name.
+ */
+define ('PDF_FONT_NAME_MAIN', 'helvetica');
+
+/**
+ * Default main font size.
+ */
+define ('PDF_FONT_SIZE_MAIN', 10);
+
+/**
+ * Default data font name.
+ */
+define ('PDF_FONT_NAME_DATA', 'helvetica');
+
+/**
+ * Default data font size.
+ */
+define ('PDF_FONT_SIZE_DATA', 8);
+
+/**
+ * Default monospaced font name.
+ */
+define ('PDF_FONT_MONOSPACED', 'courier');
+
+/**
+ * Ratio used to adjust the conversion of pixels to user units.
+ */
+define ('PDF_IMAGE_SCALE_RATIO', 1.25);
+
+/**
+ * Magnification factor for titles.
+ */
+define('HEAD_MAGNIFICATION', 1.1);
+
+/**
+ * Height of cell respect font height.
+ */
+define('K_CELL_HEIGHT_RATIO', 1.25);
+
+/**
+ * Title magnification respect main font size.
+ */
+define('K_TITLE_MAGNIFICATION', 1.3);
+
+/**
+ * Reduction factor for small font.
+ */
+define('K_SMALL_RATIO', 2/3);
+
+/**
+ * Set to true to enable the special procedure used to avoid the overlappind of symbols on Thai language.
+ */
+define('K_THAI_TOPCHARS', true);
+
+/**
+ * If true allows to call TCPDF methods using HTML syntax
+ * IMPORTANT: For security reason, disable this feature if you are printing user HTML content.
+ */
+define('K_TCPDF_CALLS_IN_HTML', true);
+
+/**
+ * If true adn PHP version is greater than 5, then the Error() method throw new exception instead of terminating the execution.
+ */
+define('K_TCPDF_THROW_EXCEPTION_ERROR', false);
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_1d_html.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_1d_html.php
new file mode 100644
index 00000000..67d22e72
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_1d_html.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_1d_html.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.000
+ */
+
+// include 1D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_1d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDFBarcode('http://www.tcpdf.org', 'C128');
+
+// output the barcode as HTML object
+echo $barcodeobj->getBarcodeHTML(2, 30, 'black');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_1d_png.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_1d_png.php
new file mode 100644
index 00000000..9e44909f
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_1d_png.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_1d_png.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.000
+ */
+
+// include 1D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_1d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDFBarcode('http://www.tcpdf.org', 'C128');
+
+// output the barcode as PNG image
+$barcodeobj->getBarcodePNG(2, 30, array(0,0,0));
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_1d_svg.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_1d_svg.php
new file mode 100644
index 00000000..f7b585ac
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_1d_svg.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_1d_svg.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.000
+ */
+
+// include 1D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_1d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDFBarcode('http://www.tcpdf.org', 'C128');
+
+// output the barcode as SVG image
+$barcodeobj->getBarcodeSVG(2, 30, 'black');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_1d_svgi.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_1d_svgi.php
new file mode 100644
index 00000000..a74a3046
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_1d_svgi.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_1d_svgi.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.000
+ */
+
+// include 1D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_1d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDFBarcode('http://www.tcpdf.org', 'C128');
+
+// output the barcode as SVG inline code
+echo $barcodeobj->getBarcodeSVGcode(2, 40, 'black');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_datamatrix_html.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_datamatrix_html.php
new file mode 100644
index 00000000..dc7bab32
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_datamatrix_html.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_2d_html.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.009
+ */
+
+// include 2D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_2d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDF2DBarcode('http://www.tcpdf.org', 'DATAMATRIX');
+
+// output the barcode as HTML object
+echo $barcodeobj->getBarcodeHTML(6, 6, 'black');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_datamatrix_png.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_datamatrix_png.php
new file mode 100644
index 00000000..87b7a330
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_datamatrix_png.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_2d_png.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.009
+ */
+
+// include 2D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_2d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDF2DBarcode('http://www.tcpdf.org', 'DATAMATRIX');
+
+// output the barcode as PNG image
+$barcodeobj->getBarcodePNG(6, 6, array(0,0,0));
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_datamatrix_svg.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_datamatrix_svg.php
new file mode 100644
index 00000000..523ebfa3
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_datamatrix_svg.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_2d_svg.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.009
+ */
+
+// include 2D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_2d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDF2DBarcode('http://www.tcpdf.org', 'DATAMATRIX');
+
+// output the barcode as SVG image
+$barcodeobj->getBarcodeSVG(6, 6, 'black');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_datamatrix_svgi.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_datamatrix_svgi.php
new file mode 100644
index 00000000..4470981e
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_datamatrix_svgi.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_2d_svgi.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.009
+ */
+
+// include 2D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_2d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDF2DBarcode('http://www.tcpdf.org', 'DATAMATRIX');
+
+// output the barcode as SVG inline code
+echo $barcodeobj->getBarcodeSVGcode(6, 6, 'black');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_pdf417_html.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_pdf417_html.php
new file mode 100644
index 00000000..4c4e9ee7
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_pdf417_html.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_2d_html.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.009
+ */
+
+// include 2D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_2d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDF2DBarcode('http://www.tcpdf.org', 'PDF417');
+
+// output the barcode as HTML object
+echo $barcodeobj->getBarcodeHTML(4, 4, 'black');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_pdf417_png.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_pdf417_png.php
new file mode 100644
index 00000000..df939bb1
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_pdf417_png.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_2d_png.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.009
+ */
+
+// include 2D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_2d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDF2DBarcode('http://www.tcpdf.org', 'PDF417');
+
+// output the barcode as PNG image
+$barcodeobj->getBarcodePNG(4, 4, array(0,0,0));
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_pdf417_svg.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_pdf417_svg.php
new file mode 100644
index 00000000..fb29ea24
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_pdf417_svg.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_2d_svg.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.009
+ */
+
+// include 2D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_2d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDF2DBarcode('http://www.tcpdf.org', 'PDF417');
+
+// output the barcode as SVG image
+$barcodeobj->getBarcodeSVG(4, 4, 'black');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_pdf417_svgi.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_pdf417_svgi.php
new file mode 100644
index 00000000..94e1c71c
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_pdf417_svgi.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_2d_svgi.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.009
+ */
+
+// include 2D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_2d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDF2DBarcode('http://www.tcpdf.org', 'PDF417');
+
+// output the barcode as SVG inline code
+echo $barcodeobj->getBarcodeSVGcode(4, 4, 'black');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_qrcode_html.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_qrcode_html.php
new file mode 100644
index 00000000..ac828f7d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_qrcode_html.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_2d_html.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.009
+ */
+
+// include 2D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_2d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDF2DBarcode('http://www.tcpdf.org', 'QRCODE,H');
+
+// output the barcode as HTML object
+echo $barcodeobj->getBarcodeHTML(6, 6, 'black');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_qrcode_png.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_qrcode_png.php
new file mode 100644
index 00000000..71f87101
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_qrcode_png.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_2d_png.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.009
+ */
+
+// include 2D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_2d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDF2DBarcode('http://www.tcpdf.org', 'QRCODE,H');
+
+// output the barcode as PNG image
+$barcodeobj->getBarcodePNG(6, 6, array(0,0,0));
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_qrcode_svg.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_qrcode_svg.php
new file mode 100644
index 00000000..1baa43de
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_qrcode_svg.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_2d_svg.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.009
+ */
+
+// include 2D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_2d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDF2DBarcode('http://www.tcpdf.org', 'QRCODE,H');
+
+// output the barcode as SVG image
+$barcodeobj->getBarcodeSVG(6, 6, 'black');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_qrcode_svgi.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_qrcode_svgi.php
new file mode 100644
index 00000000..99d65908
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/example_2d_qrcode_svgi.php
@@ -0,0 +1,53 @@
+<?php
+//============================================================+
+// File name   : example_2d_svgi.php
+// Version     : 1.0.000
+// Begin       : 2011-07-21
+// Last Update : 2013-03-19
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Example for tcpdf_barcodes_2d.php class
+//
+//============================================================+
+
+/**
+ * @file
+ * Example for tcpdf_barcodes_2d.php class
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.009
+ */
+
+// include 2D barcode class (search for installation path)
+require_once(dirname(__FILE__).'/tcpdf_barcodes_2d_include.php');
+
+// set the barcode content and type
+$barcodeobj = new TCPDF2DBarcode('http://www.tcpdf.org', 'QRCODE,H');
+
+// output the barcode as SVG inline code
+echo $barcodeobj->getBarcodeSVGcode(6, 6, 'black');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/tcpdf_barcodes_1d_include.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/tcpdf_barcodes_1d_include.php
new file mode 100644
index 00000000..a0bde57e
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/tcpdf_barcodes_1d_include.php
@@ -0,0 +1,37 @@
+<?php
+//============================================================+
+// File name   : tcpdf_barcodes_1d_include.php
+// Begin       : 2013-05-19
+// Last Update : 2013-05-19
+//
+// Description : Search and include the TCPDF Barcode 1D class.
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Search and include the TCPDF Barcode 1D class.
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Include the main class.
+ * @author Nicola Asuni
+ * @since 2013-05-19
+ */
+
+// Include the TCPDF 1D barcode class (search the class on the following directories).
+$tcpdf_barcodes_1d_include_dirs = array(realpath('../../tcpdf_barcodes_1d.php'), '/usr/share/php/tcpdf/tcpdf_barcodes_1d.php', '/usr/share/tcpdf/tcpdf_barcodes_1d.php', '/usr/share/php-tcpdf/tcpdf_barcodes_1d.php', '/var/www/tcpdf/tcpdf_barcodes_1d.php', '/var/www/html/tcpdf/tcpdf_barcodes_1d.php', '/usr/local/apache2/htdocs/tcpdf/tcpdf_barcodes_1d.php');
+foreach ($tcpdf_barcodes_1d_include_dirs as $tcpdf_barcodes_1d_include_path) {
+	if (@file_exists($tcpdf_barcodes_1d_include_path)) {
+		require_once($tcpdf_barcodes_1d_include_path);
+		break;
+	}
+}
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/tcpdf_barcodes_2d_include.php b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/tcpdf_barcodes_2d_include.php
new file mode 100644
index 00000000..61c4a8bb
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/barcodes/tcpdf_barcodes_2d_include.php
@@ -0,0 +1,37 @@
+<?php
+//============================================================+
+// File name   : tcpdf_barcodes_2d_include.php
+// Begin       : 2013-05-19
+// Last Update : 2013-05-19
+//
+// Description : Search and include the TCPDF Barcode 1D class.
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Search and include the TCPDF Barcode 2D class.
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Include the main class.
+ * @author Nicola Asuni
+ * @since 2013-05-19
+ */
+
+// Include the TCPDF 2D barcode class (search the class on the following directories).
+$tcpdf_barcodes_2d_include_dirs = array(realpath('../../tcpdf_barcodes_2d.php'), '/usr/share/php/tcpdf/tcpdf_barcodes_2d.php', '/usr/share/tcpdf/tcpdf_barcodes_2d.php', '/usr/share/php-tcpdf/tcpdf_barcodes_2d.php', '/var/www/tcpdf/tcpdf_barcodes_2d.php', '/var/www/html/tcpdf/tcpdf_barcodes_2d.php', '/usr/local/apache2/htdocs/tcpdf/tcpdf_barcodes_2d.php');
+foreach ($tcpdf_barcodes_2d_include_dirs as $tcpdf_barcodes_2d_include_path) {
+	if (@file_exists($tcpdf_barcodes_2d_include_path)) {
+		require_once($tcpdf_barcodes_2d_include_path);
+		break;
+	}
+}
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/config/tcpdf_config_alt.php b/htmltest/sites/all/libraries/tcpdf-version/examples/config/tcpdf_config_alt.php
new file mode 100644
index 00000000..62f3dfa7
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/config/tcpdf_config_alt.php
@@ -0,0 +1,222 @@
+<?php
+//============================================================+
+// File name   : tcpdf_config.php
+// Begin       : 2004-06-11
+// Last Update : 2013-05-16
+//
+// Description : Example of alternative configuration file for TCPDF.
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2004-2013  Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+//============================================================+
+
+/**
+ * Example of alternative configuration file for TCPDF.
+ * @author Nicola Asuni
+ * @package com.tecnick.tcpdf
+ * @version 4.9.005
+ * @since 2004-10-27
+ */
+
+/**
+ * Define the following constant to ignore the default configuration file.
+ */
+define ('K_TCPDF_EXTERNAL_CONFIG', true);
+
+/**
+ * Installation path (/var/www/tcpdf/).
+ * By default it is automatically calculated but you can also set it as a fixed string to improve performances.
+ */
+//define ('K_PATH_MAIN', '');
+
+/**
+ * URL path to tcpdf installation folder (http://localhost/tcpdf/).
+ * By default it is automatically set but you can also set it as a fixed string to improve performances.
+ */
+//define ('K_PATH_URL', '');
+
+/**
+ * Path for PDF fonts.
+ * By default it is automatically set but you can also set it as a fixed string to improve performances.
+ */
+//define ('K_PATH_FONTS', K_PATH_MAIN.'fonts/');
+
+/**
+ * Default images directory.
+ * By default it is automatically set but you can also set it as a fixed string to improve performances.
+ */
+define ('K_PATH_IMAGES', dirname(__FILE__).'/../images/');
+
+/**
+ * Deafult image logo used be the default Header() method.
+ * Please set here your own logo or an empty string to disable it.
+ */
+define ('PDF_HEADER_LOGO', 'tcpdf_logo.jpg');
+
+/**
+ * Header logo image width in user units.
+ */
+define ('PDF_HEADER_LOGO_WIDTH', 30);
+
+/**
+ * Cache directory for temporary files (full path).
+ */
+define ('K_PATH_CACHE', sys_get_temp_dir().'/');
+
+/**
+ * Generic name for a blank image.
+ */
+define ('K_BLANK_IMAGE', '_blank.png');
+
+/**
+ * Page format.
+ */
+define ('PDF_PAGE_FORMAT', 'A4');
+
+/**
+ * Page orientation (P=portrait, L=landscape).
+ */
+define ('PDF_PAGE_ORIENTATION', 'P');
+
+/**
+ * Document creator.
+ */
+define ('PDF_CREATOR', 'TCPDF');
+
+/**
+ * Document author.
+ */
+define ('PDF_AUTHOR', 'TCPDF');
+
+/**
+ * Header title.
+ */
+define ('PDF_HEADER_TITLE', 'TCPDF Example');
+
+/**
+ * Header description string.
+ */
+define ('PDF_HEADER_STRING', "by Nicola Asuni - Tecnick.com\nwww.tcpdf.org");
+
+/**
+ * Document unit of measure [pt=point, mm=millimeter, cm=centimeter, in=inch].
+ */
+define ('PDF_UNIT', 'mm');
+
+/**
+ * Header margin.
+ */
+define ('PDF_MARGIN_HEADER', 5);
+
+/**
+ * Footer margin.
+ */
+define ('PDF_MARGIN_FOOTER', 10);
+
+/**
+ * Top margin.
+ */
+define ('PDF_MARGIN_TOP', 27);
+
+/**
+ * Bottom margin.
+ */
+define ('PDF_MARGIN_BOTTOM', 25);
+
+/**
+ * Left margin.
+ */
+define ('PDF_MARGIN_LEFT', 15);
+
+/**
+ * Right margin.
+ */
+define ('PDF_MARGIN_RIGHT', 15);
+
+/**
+ * Default main font name.
+ */
+define ('PDF_FONT_NAME_MAIN', 'helvetica');
+
+/**
+ * Default main font size.
+ */
+define ('PDF_FONT_SIZE_MAIN', 10);
+
+/**
+ * Default data font name.
+ */
+define ('PDF_FONT_NAME_DATA', 'helvetica');
+
+/**
+ * Default data font size.
+ */
+define ('PDF_FONT_SIZE_DATA', 8);
+
+/**
+ * Default monospaced font name.
+ */
+define ('PDF_FONT_MONOSPACED', 'courier');
+
+/**
+ * Ratio used to adjust the conversion of pixels to user units.
+ */
+define ('PDF_IMAGE_SCALE_RATIO', 1.25);
+
+/**
+ * Magnification factor for titles.
+ */
+define('HEAD_MAGNIFICATION', 1.1);
+
+/**
+ * Height of cell respect font height.
+ */
+define('K_CELL_HEIGHT_RATIO', 1.25);
+
+/**
+ * Title magnification respect main font size.
+ */
+define('K_TITLE_MAGNIFICATION', 1.3);
+
+/**
+ * Reduction factor for small font.
+ */
+define('K_SMALL_RATIO', 2/3);
+
+/**
+ * Set to true to enable the special procedure used to avoid the overlappind of symbols on Thai language.
+ */
+define('K_THAI_TOPCHARS', true);
+
+/**
+ * If true allows to call TCPDF methods using HTML syntax
+ * IMPORTANT: For security reason, disable this feature if you are printing user HTML content.
+ */
+define('K_TCPDF_CALLS_IN_HTML', true);
+
+/**
+ * If true adn PHP version is greater than 5, then the Error() method throw new exception instead of terminating the execution.
+ */
+define('K_TCPDF_THROW_EXCEPTION_ERROR', false);
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/data/cert/tcpdf.crt b/htmltest/sites/all/libraries/tcpdf-version/examples/data/cert/tcpdf.crt
new file mode 100644
index 00000000..f0491391
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/data/cert/tcpdf.crt
@@ -0,0 +1,40 @@
+Bag Attributes
+    localKeyID: 7B AB 1B 7A BE 4C 85 C0 1A A6 DC 59 3F 79 48 C3 93 38 68 9C 
+subject=/CN=TCPDF DEMO/O=TCPDF/OU=DEMO/emailAddress=you@example.com/C=IT
+issuer=/CN=TCPDF DEMO/O=TCPDF/OU=DEMO/emailAddress=you@example.com/C=IT
+-----BEGIN CERTIFICATE-----
+MIIC1TCCAj6gAwIBAgIKkehOL/XGkB5cjjANBgkqhkiG9w0BAQUFADBhMRMwEQYD
+VQQDEwpUQ1BERiBERU1PMQ4wDAYDVQQKEwVUQ1BERjENMAsGA1UECxMEREVNTzEe
+MBwGCSqGSIb3DQEJARYPeW91QGV4YW1wbGUuY29tMQswCQYDVQQGEwJJVDAeFw0w
+OTA4MjExMjU0NDhaFw0xNDA4MjExMjU0NDhaMGExEzARBgNVBAMTClRDUERGIERF
+TU8xDjAMBgNVBAoTBVRDUERGMQ0wCwYDVQQLEwRERU1PMR4wHAYJKoZIhvcNAQkB
+Fg95b3VAZXhhbXBsZS5jb20xCzAJBgNVBAYTAklUMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDAqIL0uGKmTR98Lxx2vEEE1OGKkMXFo0JViitALe7Onhxxqx0H
+XMUDKF5mvEVu1rcvh7/oAnAfrCuEpL/up3u1mQCgBE7WXBnFFE/AE3jCksh9OkS0
+Z0Xj9woN5bzxRDsGoPiOu/4xzk5qSEXt8jf2Ep90QuNkqLIRT4swAzpDbwIDAQAB
+o4GTMIGQMDcGA1UdEgQwMC6gEQYDVQQDDApUQ1BERiBERU1PoAwGA1UECgwFVENQ
+REagCwYDVQQLDARERU1PMDcGA1UdEQQwMC6gEQYDVQQDDApUQ1BERiBERU1PoAwG
+A1UECgwFVENQREagCwYDVQQLDARERU1PMA8GCSqGSIb3LwEBCgQCBQAwCwYDVR0P
+BAQDAgSQMA0GCSqGSIb3DQEBBQUAA4GBAEhTQfqX3ZNdHmpTLDbIj22RHXii2roE
+OavCbu9WsHoWpva0qSd+yIoD594VHvYAd29sfzDfiN+7W0aiZfDhq5jpaSQMVlN8
+RGYMupbHY/+a9Gz1wqxnR84mlTtIkZVRYAhsfPwy6M1BEjdMqfdh9h40JIdkdjtb
+8faTCfXPePWQ
+-----END CERTIFICATE-----
+Bag Attributes
+    localKeyID: 7B AB 1B 7A BE 4C 85 C0 1A A6 DC 59 3F 79 48 C3 93 38 68 9C 
+Key Attributes: <No Attributes>
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQDAqIL0uGKmTR98Lxx2vEEE1OGKkMXFo0JViitALe7Onhxxqx0H
+XMUDKF5mvEVu1rcvh7/oAnAfrCuEpL/up3u1mQCgBE7WXBnFFE/AE3jCksh9OkS0
+Z0Xj9woN5bzxRDsGoPiOu/4xzk5qSEXt8jf2Ep90QuNkqLIRT4swAzpDbwIDAQAB
+AoGAXc+wNMmz/5Z+RlIKYia44klmqbplEx+0JULqXI4BQsrqvs67i+I4bJkznoL+
+rEIRYSuQ3sCRKFsFtckjTGpxadnxkB+uwGKc6pZChv99BFX6HFR4hgBlT/BBRAQA
+hMDlM2JIRr4S4SMVXR7MHwGMUf9mUeanGLR3ZWtU3aXJrIECQQD7OaYUVYNEEnM9
+uXyjm22CuHyqyEf5gb13sK0uQty67547yJTMUQZd/sQc9KGwhzBbhrob2LO2jAhh
+S+f+NSRnAkEAxFHm3fMI5RgXmswxlGm4QW07a/Ueo7ZJG6xjTkFXluJhd+XHswRD
+dQIO3zG9nGjNUoeMrPhXhPvKqFc2F9RDuQJAQBEGin74N77gxqfr4ik79y8nE8J5
+oGZ2s/RJZdfFRKLg3mwbjjNHhWb4Ck5UgZkoOt8TzRApXG8/n9hktE5HFwJBALur
+M5AueO1Pl5kB489lNJ9OxUQRYUXMxpxuscuoCQwSwmv0O2+0/qtG2WKhUQnI4aYo
+L+FV0YwtivBb1jj3T/kCQQDIWOxq8eRowdaMzvJpRUHFgMcf1AVZExKyrugwYOWd
+KNsDxC4KaQOsPt8iT/Ulo4g/MJC0HolCOhWibKmR9Ayl
+-----END RSA PRIVATE KEY-----
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/data/cert/tcpdf.fdf b/htmltest/sites/all/libraries/tcpdf-version/examples/data/cert/tcpdf.fdf
new file mode 100644
index 00000000..a8f7c35d
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/examples/data/cert/tcpdf.fdf differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/data/cert/tcpdf.p12 b/htmltest/sites/all/libraries/tcpdf-version/examples/data/cert/tcpdf.p12
new file mode 100644
index 00000000..611f0dfb
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/examples/data/cert/tcpdf.p12 differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/data/chapter_demo_1.txt b/htmltest/sites/all/libraries/tcpdf-version/examples/data/chapter_demo_1.txt
new file mode 100644
index 00000000..4025de93
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/data/chapter_demo_1.txt
@@ -0,0 +1,19 @@
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue. Sed vel velit erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras eget velit nulla, eu sagittis elit. Nunc ac arcu est, in lobortis tellus. Praesent condimentum rhoncus sodales. In hac habitasse platea dictumst. Proin porta eros pharetra enim tincidunt dignissim nec vel dolor. Cras sapien elit, ornare ac dignissim eu, ultricies ac eros. Maecenas augue magna, ultrices a congue in, mollis eu nulla. Nunc venenatis massa at est eleifend faucibus. Vivamus sed risus lectus, nec interdum nunc.
+
+Fusce et felis vitae diam lobortis sollicitudin. Aenean tincidunt accumsan nisi, id vehicula quam laoreet elementum. Phasellus egestas interdum erat, et viverra ipsum ultricies ac. Praesent sagittis augue at augue volutpat eleifend. Cras nec orci neque. Mauris bibendum posuere blandit. Donec feugiat mollis dui sit amet pellentesque. Sed a enim justo. Donec tincidunt, nisl eget elementum aliquam, odio ipsum ultrices quam, eu porttitor ligula urna at lorem. Donec varius, eros et convallis laoreet, ligula tellus consequat felis, ut ornare metus tellus sodales velit. Duis sed diam ante. Ut rutrum malesuada massa, vitae consectetur ipsum rhoncus sed. Suspendisse potenti. Pellentesque a congue massa.
+
+Integer non sem eget neque mattis accumsan. Maecenas eu nisl mauris, sit amet interdum ipsum. In pharetra erat vel lectus venenatis elementum. Nulla non elit ligula, sit amet mollis urna. Morbi ut gravida est. Mauris tincidunt sem et turpis molestie malesuada. Curabitur vel nulla risus, sed mollis erat. Suspendisse vehicula accumsan purus nec varius. Donec fermentum lorem id felis sodales dictum. Quisque et dolor ipsum. Nam luctus consectetur dui vitae fermentum. Curabitur sodales consequat augue, id ultricies augue tempor ac. Aliquam ac magna id ipsum vehicula bibendum. Sed elementum congue tristique. Phasellus vel lorem eu lectus porta sodales. Etiam neque tortor, sagittis id pharetra quis, laoreet vel arcu.
+
+Cras quam mi, ornare laoreet laoreet vel, vehicula at lacus. Maecenas a lacus accumsan augue convallis sagittis sed quis odio. Morbi sit amet turpis diam, dictum convallis urna. Cras eget interdum augue. Cras eu nisi sit amet dolor faucibus porttitor. Suspendisse potenti. Nunc vitae dolor risus, at cursus libero. Suspendisse bibendum tellus non nibh hendrerit tristique. Mauris eget orci elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta libero non ante laoreet semper. Proin volutpat sodales mi, ac fermentum erat sagittis in. Vivamus at viverra felis. Ut pretium facilisis ante et pharetra.
+
+Nulla facilisi. Cras varius quam eget libero aliquam vitae tincidunt leo rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque a nisl massa, quis pretium urna. Proin vel porttitor tortor. Cras rhoncus congue velit in bibendum. Donec pharetra semper augue id lacinia. Quisque magna quam, hendrerit eu aliquam et, pellentesque ut tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas nulla quam, rutrum eu feugiat at, elementum eu libero. Maecenas ullamcorper leo et turpis rutrum ac laoreet eros faucibus. Phasellus condimentum lorem quis neque imperdiet quis molestie enim iaculis. Phasellus risus est, vestibulum ut convallis ultrices, dignissim nec erat. Etiam congue lobortis laoreet. Nulla ut neque sed velit dapibus semper. Quisque nec dolor id nibh eleifend iaculis. Vivamus vitae fermentum odio. Etiam malesuada quam in nulla aliquam sed convallis dui feugiat.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue. Sed vel velit erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras eget velit nulla, eu sagittis elit. Nunc ac arcu est, in lobortis tellus. Praesent condimentum rhoncus sodales. In hac habitasse platea dictumst. Proin porta eros pharetra enim tincidunt dignissim nec vel dolor. Cras sapien elit, ornare ac dignissim eu, ultricies ac eros. Maecenas augue magna, ultrices a congue in, mollis eu nulla. Nunc venenatis massa at est eleifend faucibus. Vivamus sed risus lectus, nec interdum nunc.
+
+Fusce et felis vitae diam lobortis sollicitudin. Aenean tincidunt accumsan nisi, id vehicula quam laoreet elementum. Phasellus egestas interdum erat, et viverra ipsum ultricies ac. Praesent sagittis augue at augue volutpat eleifend. Cras nec orci neque. Mauris bibendum posuere blandit. Donec feugiat mollis dui sit amet pellentesque. Sed a enim justo. Donec tincidunt, nisl eget elementum aliquam, odio ipsum ultrices quam, eu porttitor ligula urna at lorem. Donec varius, eros et convallis laoreet, ligula tellus consequat felis, ut ornare metus tellus sodales velit. Duis sed diam ante. Ut rutrum malesuada massa, vitae consectetur ipsum rhoncus sed. Suspendisse potenti. Pellentesque a congue massa.
+
+Integer non sem eget neque mattis accumsan. Maecenas eu nisl mauris, sit amet interdum ipsum. In pharetra erat vel lectus venenatis elementum. Nulla non elit ligula, sit amet mollis urna. Morbi ut gravida est. Mauris tincidunt sem et turpis molestie malesuada. Curabitur vel nulla risus, sed mollis erat. Suspendisse vehicula accumsan purus nec varius. Donec fermentum lorem id felis sodales dictum. Quisque et dolor ipsum. Nam luctus consectetur dui vitae fermentum. Curabitur sodales consequat augue, id ultricies augue tempor ac. Aliquam ac magna id ipsum vehicula bibendum. Sed elementum congue tristique. Phasellus vel lorem eu lectus porta sodales. Etiam neque tortor, sagittis id pharetra quis, laoreet vel arcu.
+
+Cras quam mi, ornare laoreet laoreet vel, vehicula at lacus. Maecenas a lacus accumsan augue convallis sagittis sed quis odio. Morbi sit amet turpis diam, dictum convallis urna. Cras eget interdum augue. Cras eu nisi sit amet dolor faucibus porttitor. Suspendisse potenti. Nunc vitae dolor risus, at cursus libero. Suspendisse bibendum tellus non nibh hendrerit tristique. Mauris eget orci elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta libero non ante laoreet semper. Proin volutpat sodales mi, ac fermentum erat sagittis in. Vivamus at viverra felis. Ut pretium facilisis ante et pharetra.
+
+Nulla facilisi. Cras varius quam eget libero aliquam vitae tincidunt leo rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque a nisl massa, quis pretium urna. Proin vel porttitor tortor. Cras rhoncus congue velit in bibendum. Donec pharetra semper augue id lacinia. Quisque magna quam, hendrerit eu aliquam et, pellentesque ut tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas nulla quam, rutrum eu feugiat at, elementum eu libero. Maecenas ullamcorper leo et turpis rutrum ac laoreet eros faucibus. Phasellus condimentum lorem quis neque imperdiet quis molestie enim iaculis. Phasellus risus est, vestibulum ut convallis ultrices, dignissim nec erat. Etiam congue lobortis laoreet. Nulla ut neque sed velit dapibus semper. Quisque nec dolor id nibh eleifend iaculis. Vivamus vitae fermentum odio. Etiam malesuada quam in nulla aliquam sed convallis dui feugiat.
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/data/chapter_demo_2.txt b/htmltest/sites/all/libraries/tcpdf-version/examples/data/chapter_demo_2.txt
new file mode 100644
index 00000000..a0210ff0
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/data/chapter_demo_2.txt
@@ -0,0 +1,23 @@
+<p><strong>Lorem ipsum</strong> dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue. Sed vel velit erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras eget velit nulla, eu sagittis elit. Nunc ac arcu est, in lobortis tellus. Praesent condimentum rhoncus sodales. In hac habitasse platea dictumst. Proin porta eros pharetra enim tincidunt dignissim nec vel dolor. Cras sapien elit, ornare ac dignissim eu, ultricies ac eros. Maecenas augue magna, ultrices a congue in, mollis eu nulla. Nunc venenatis massa at est eleifend faucibus. Vivamus sed risus lectus, nec interdum nunc.</p>
+
+<img src="images/image_demo.jpg" width="54mm" height="80mm" />
+
+<p style="background-color:yellow;"><i>Fusce et felis vitae diam lobortis sollicitudin. Aenean tincidunt accumsan nisi, id vehicula quam laoreet elementum. Phasellus egestas interdum erat, et viverra ipsum ultricies ac. Praesent sagittis augue at augue volutpat eleifend. Cras nec orci neque. Mauris bibendum posuere blandit. Donec feugiat mollis dui sit amet pellentesque. Sed a enim justo. Donec tincidunt, nisl eget elementum aliquam, odio ipsum ultrices quam, eu porttitor ligula urna at lorem. Donec varius, eros et convallis laoreet, ligula tellus consequat felis, ut ornare metus tellus sodales velit. Duis sed diam ante. Ut rutrum malesuada massa, vitae consectetur ipsum rhoncus sed. Suspendisse potenti. Pellentesque a congue massa.</i></p>
+
+<p>Integer non sem eget neque mattis accumsan. Maecenas eu nisl mauris, sit amet interdum ipsum. In pharetra erat vel lectus venenatis elementum. Nulla non elit ligula, sit amet mollis urna. Morbi ut gravida est. Mauris tincidunt sem et turpis molestie malesuada. Curabitur vel nulla risus, sed mollis erat. Suspendisse vehicula accumsan purus nec varius. Donec fermentum lorem id felis sodales dictum. Quisque et dolor ipsum. Nam luctus consectetur dui vitae fermentum. Curabitur sodales consequat augue, id ultricies augue tempor ac. Aliquam ac magna id ipsum vehicula bibendum. Sed elementum congue tristique. Phasellus vel lorem eu lectus porta sodales. Etiam neque tortor, sagittis id pharetra quis, laoreet vel arcu.</p>
+
+<p style="color:navy;">Cras quam mi, ornare laoreet laoreet vel, vehicula at lacus. Maecenas a lacus accumsan augue convallis sagittis sed quis odio. Morbi sit amet turpis diam, dictum convallis urna. Cras eget interdum augue. Cras eu nisi sit amet dolor faucibus porttitor. Suspendisse potenti. Nunc vitae dolor risus, at cursus libero. Suspendisse bibendum tellus non nibh hendrerit tristique. Mauris eget orci elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta libero non ante laoreet semper. Proin volutpat sodales mi, ac fermentum erat sagittis in. Vivamus at viverra felis. Ut pretium facilisis ante et pharetra.</p>
+
+<p>Nulla facilisi. Cras varius quam eget libero aliquam vitae tincidunt leo rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque a nisl massa, quis pretium urna. Proin vel porttitor tortor. Cras rhoncus congue velit in bibendum. Donec pharetra semper augue id lacinia. Quisque magna quam, hendrerit eu aliquam et, pellentesque ut tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas nulla quam, rutrum eu feugiat at, elementum eu libero. Maecenas ullamcorper leo et turpis rutrum ac laoreet eros faucibus. Phasellus condimentum lorem quis neque imperdiet quis molestie enim iaculis. Phasellus risus est, vestibulum ut convallis ultrices, dignissim nec erat. Etiam congue lobortis laoreet. Nulla ut neque sed velit dapibus semper. Quisque nec dolor id nibh eleifend iaculis. Vivamus vitae fermentum odio. Etiam malesuada quam in nulla aliquam sed convallis dui feugiat.</p>
+
+<p><strong>Lorem ipsum</strong> dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue. Sed vel velit erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras eget velit nulla, eu sagittis elit. Nunc ac arcu est, in lobortis tellus. Praesent condimentum rhoncus sodales. In hac habitasse platea dictumst. Proin porta eros pharetra enim tincidunt dignissim nec vel dolor. Cras sapien elit, ornare ac dignissim eu, ultricies ac eros. Maecenas augue magna, ultrices a congue in, mollis eu nulla. Nunc venenatis massa at est eleifend faucibus. Vivamus sed risus lectus, nec interdum nunc.</p>
+
+<img src="images/image_demo.jpg" width="54mm" height="80mm" />
+
+<p style="background-color:yellow;"><i>Fusce et felis vitae diam lobortis sollicitudin. Aenean tincidunt accumsan nisi, id vehicula quam laoreet elementum. Phasellus egestas interdum erat, et viverra ipsum ultricies ac. Praesent sagittis augue at augue volutpat eleifend. Cras nec orci neque. Mauris bibendum posuere blandit. Donec feugiat mollis dui sit amet pellentesque. Sed a enim justo. Donec tincidunt, nisl eget elementum aliquam, odio ipsum ultrices quam, eu porttitor ligula urna at lorem. Donec varius, eros et convallis laoreet, ligula tellus consequat felis, ut ornare metus tellus sodales velit. Duis sed diam ante. Ut rutrum malesuada massa, vitae consectetur ipsum rhoncus sed. Suspendisse potenti. Pellentesque a congue massa.</i></p>
+
+<p>Integer non sem eget neque mattis accumsan. Maecenas eu nisl mauris, sit amet interdum ipsum. In pharetra erat vel lectus venenatis elementum. Nulla non elit ligula, sit amet mollis urna. Morbi ut gravida est. Mauris tincidunt sem et turpis molestie malesuada. Curabitur vel nulla risus, sed mollis erat. Suspendisse vehicula accumsan purus nec varius. Donec fermentum lorem id felis sodales dictum. Quisque et dolor ipsum. Nam luctus consectetur dui vitae fermentum. Curabitur sodales consequat augue, id ultricies augue tempor ac. Aliquam ac magna id ipsum vehicula bibendum. Sed elementum congue tristique. Phasellus vel lorem eu lectus porta sodales. Etiam neque tortor, sagittis id pharetra quis, laoreet vel arcu.</p>
+
+<p style="color:navy;">Cras quam mi, ornare laoreet laoreet vel, vehicula at lacus. Maecenas a lacus accumsan augue convallis sagittis sed quis odio. Morbi sit amet turpis diam, dictum convallis urna. Cras eget interdum augue. Cras eu nisi sit amet dolor faucibus porttitor. Suspendisse potenti. Nunc vitae dolor risus, at cursus libero. Suspendisse bibendum tellus non nibh hendrerit tristique. Mauris eget orci elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta libero non ante laoreet semper. Proin volutpat sodales mi, ac fermentum erat sagittis in. Vivamus at viverra felis. Ut pretium facilisis ante et pharetra.</p>
+
+<p>Nulla facilisi. Cras varius quam eget libero aliquam vitae tincidunt leo rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque a nisl massa, quis pretium urna. Proin vel porttitor tortor. Cras rhoncus congue velit in bibendum. Donec pharetra semper augue id lacinia. Quisque magna quam, hendrerit eu aliquam et, pellentesque ut tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas nulla quam, rutrum eu feugiat at, elementum eu libero. Maecenas ullamcorper leo et turpis rutrum ac laoreet eros faucibus. Phasellus condimentum lorem quis neque imperdiet quis molestie enim iaculis. Phasellus risus est, vestibulum ut convallis ultrices, dignissim nec erat. Etiam congue lobortis laoreet. Nulla ut neque sed velit dapibus semper. Quisque nec dolor id nibh eleifend iaculis. Vivamus vitae fermentum odio. Etiam malesuada quam in nulla aliquam sed convallis dui feugiat.</p>
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/data/table_data_demo.txt b/htmltest/sites/all/libraries/tcpdf-version/examples/data/table_data_demo.txt
new file mode 100644
index 00000000..5a48a42e
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/data/table_data_demo.txt
@@ -0,0 +1,15 @@
+Austria;Vienna;83859;8075
+Belgium;Brussels;30518;10192
+Denmark;Copenhagen;43094;5295
+Finland;Helsinki;304529;5147
+France;Paris;543965;58728
+Germany;Berlin;357022;82057
+Greece;Athens;131625;10511
+Ireland;Dublin;70723;3694
+Italy;Roma;301316;57563
+Luxembourg;Luxembourg;2586;424
+Netherlands;Amsterdam;41526;15654
+Portugal;Lisbon;91906;9957
+Spain;Madrid;504790;39348
+Sweden;Stockholm;410934;8839
+United Kingdom;London;243820;58862
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/data/utf8test.txt b/htmltest/sites/all/libraries/tcpdf-version/examples/data/utf8test.txt
new file mode 100644
index 00000000..291d4e73
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/data/utf8test.txt
@@ -0,0 +1,128 @@
+Sentences that contain all letters commonly used in a language
+--------------------------------------------------------------
+
+This file is UTF-8 encoded.
+
+Czech (cz)
+---------
+
+  Příšerně žluťoučký kůň úpěl ďábelské ódy.
+  Hleď, toť přízračný kůň v mátožné póze šíleně úpí.
+  Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů.
+  Loď čeří kýlem tůň obzvlášť v Grónské úžině.
+  Ó, náhlý déšť již zvířil prach a čilá laň teď běží s houfcem gazel k úkrytům.
+
+Danish (da)
+---------
+
+  Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen
+  Wolther spillede på xylofon.
+  (= Quiz contestants were eating strawbery with cream while Wolther
+  the circus clown played on xylophone.)
+
+German (de)
+-----------
+
+  Falsches Üben von Xylophonmusik quält jeden größeren Zwerg
+  (= Wrongful practicing of xylophone music tortures every larger dwarf)
+
+  Zwölf Boxkämpfer jagten Eva quer über den Sylter Deich
+  (= Twelve boxing fighters hunted Eva across the dike of Sylt)
+
+  Heizölrückstoßabdämpfung
+  (= fuel oil recoil absorber)
+  (jqvwxy missing, but all non-ASCII letters in one word)
+
+English (en)
+------------
+
+  The quick brown fox jumps over the lazy dog
+
+Spanish (es)
+------------
+
+  El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y
+  frío, añoraba a su querido cachorro.
+  (Contains every letter and every accent, but not every combination
+  of vowel + acute.)
+
+French (fr)
+-----------
+
+  Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à
+  côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce
+  qui lui permet de penser à la cænogenèse de l'être dont il est question
+  dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui,
+  pense-t-il, diminue çà et là la qualité de son œuvre.
+
+  l'île exiguë
+  Où l'obèse jury mûr
+  Fête l'haï volapük,
+  Âne ex aéquo au whist,
+  Ôtez ce vœu déçu.
+
+  Le cœur déçu mais l'âme plutôt naïve, Louÿs rêva de crapaüter en
+  canoë au delà des îles, près du mälström où brûlent les novæ.
+
+Irish Gaelic (ga)
+-----------------
+
+  D'fhuascail Íosa, Úrmhac na hÓighe Beannaithe, pór Éava agus Ádhaimh
+
+Hungarian (hu)
+--------------
+
+  Árvíztűrő tükörfúrógép
+  (= flood-proof mirror-drilling machine, only all non-ASCII letters)
+
+Icelandic (is)
+--------------
+
+  Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa
+
+  Sævör grét áðan því úlpan var ónýt
+  (some ASCII letters missing)
+
+Greek (el)
+-------------
+
+  Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ στὸ χρυσαφὶ ξέφωτο
+  (= No more shall I see acacias or myrtles in the golden clearing)
+
+  Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία
+  (= I uncover the soul-destroying abhorrence)
+
+Hebrew (iw)
+-----------
+
+  ? דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה
+
+Polish (pl)
+-----------
+
+  Pchnąć w tę łódź jeża lub osiem skrzyń fig
+  (= To push a hedgehog or eight bins of figs in this boat)
+
+  Zażółć gęślą jaźń
+
+Russian (ru)
+------------
+
+  В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!
+  (= Would a citrus live in the bushes of south? Yes, but only a fake one!)
+
+Thai (th)
+---------
+
+  [--------------------------|------------------------]
+  ๏ เป็นมนุษย์สุดประเสริฐเลิศคุณค่า  กว่าบรรดาฝูงสัตว์เดรัจฉาน
+  จงฝ่าฟันพัฒนาวิชาการ           อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร
+  ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า     หัดอภัยเหมือนกีฬาอัชฌาสัย
+  ปฏิบัติประพฤติกฎกำหนดใจ        พูดจาให้จ๊ะๆ จ๋าๆ น่าฟังเอย ฯ
+
+  [The copyright for the Thai example is owned by The Computer
+  Association of Thailand under the Royal Patronage of His Majesty the
+  King.]
+
+Please let me know if you find others! Special thanks to the people
+from all over the world who contributed these sentences.
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_001.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_001.php
new file mode 100644
index 00000000..055c66af
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_001.php
@@ -0,0 +1,106 @@
+<?php
+//============================================================+
+// File name   : example_001.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 001 for TCPDF class
+//               Default Header and Footer
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Default Header and Footer
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 001');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 001', PDF_HEADER_STRING, array(0,64,255), array(0,64,128));
+$pdf->setFooterData(array(0,64,0), array(0,64,128));
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set default font subsetting mode
+$pdf->setFontSubsetting(true);
+
+// Set font
+// dejavusans is a UTF-8 Unicode font, if you only need to
+// print standard ASCII chars, you can use core fonts like
+// helvetica or times to reduce file size.
+$pdf->SetFont('dejavusans', '', 14, '', true);
+
+// Add a page
+// This method has several options, check the source code documentation for more information.
+$pdf->AddPage();
+
+// set text shadow effect
+$pdf->setTextShadow(array('enabled'=>true, 'depth_w'=>0.2, 'depth_h'=>0.2, 'color'=>array(196,196,196), 'opacity'=>1, 'blend_mode'=>'Normal'));
+
+// Set some content to print
+$html = <<<EOD
+<h1>Welcome to <a href="http://www.tcpdf.org" style="text-decoration:none;background-color:#CC0000;color:black;">&nbsp;<span style="color:black;">TC</span><span style="color:white;">PDF</span>&nbsp;</a>!</h1>
+<i>This is the first example of TCPDF library.</i>
+<p>This text is printed using the <i>writeHTMLCell()</i> method but you can also use: <i>Multicell(), writeHTML(), Write(), Cell() and Text()</i>.</p>
+<p>Please check the source code documentation and other examples for further information.</p>
+<p style="color:#CC0000;">TO IMPROVE AND EXPAND TCPDF I NEED YOUR SUPPORT, PLEASE <a href="http://sourceforge.net/donate/index.php?group_id=128076">MAKE A DONATION!</a></p>
+EOD;
+
+// Print text using writeHTMLCell()
+$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);
+
+// ---------------------------------------------------------
+
+// Close and output PDF document
+// This method has several options, check the source code documentation for more information.
+$pdf->Output('example_001.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_002.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_002.php
new file mode 100644
index 00000000..020dd299
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_002.php
@@ -0,0 +1,87 @@
+<?php
+//============================================================+
+// File name   : example_002.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 002 for TCPDF class
+//               Removing Header and Footer
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Removing Header and Footer
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 002');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// remove default header/footer
+$pdf->setPrintHeader(false);
+$pdf->setPrintFooter(false);
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('times', 'BI', 20);
+
+// add a page
+$pdf->AddPage();
+
+// set some text to print
+$txt = <<<EOD
+TCPDF Example 002
+
+Default page header and footer are disabled using setPrintHeader() and setPrintFooter() methods.
+EOD;
+
+// print a block of text using Write()
+$pdf->Write(0, $txt, '', 0, 'C', true, 0, false, false, 0);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_002.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_003.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_003.php
new file mode 100644
index 00000000..73a0e8c1
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_003.php
@@ -0,0 +1,118 @@
+<?php
+//============================================================+
+// File name   : example_003.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 003 for TCPDF class
+//               Custom Header and Footer
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Custom Header and Footer
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+
+// Extend the TCPDF class to create custom Header and Footer
+class MYPDF extends TCPDF {
+
+	//Page header
+	public function Header() {
+		// Logo
+		$image_file = K_PATH_IMAGES.'logo_example.jpg';
+		$this->Image($image_file, 10, 10, 15, '', 'JPG', '', 'T', false, 300, '', false, false, 0, false, false, false);
+		// Set font
+		$this->SetFont('helvetica', 'B', 20);
+		// Title
+		$this->Cell(0, 15, '<< TCPDF Example 003 >>', 0, false, 'C', 0, '', 0, false, 'M', 'M');
+	}
+
+	// Page footer
+	public function Footer() {
+		// Position at 15 mm from bottom
+		$this->SetY(-15);
+		// Set font
+		$this->SetFont('helvetica', 'I', 8);
+		// Page number
+		$this->Cell(0, 10, 'Page '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 0, false, 'C', 0, '', 0, false, 'T', 'M');
+	}
+}
+
+// create new PDF document
+$pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 003');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE, PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('times', 'BI', 12);
+
+// add a page
+$pdf->AddPage();
+
+// set some text to print
+$txt = <<<EOD
+TCPDF Example 003
+
+Custom page header and footer are defined by extending the TCPDF class and overriding the Header() and Footer() methods.
+EOD;
+
+// print a block of text using Write()
+$pdf->Write(0, $txt, '', 0, 'C', true, 0, false, false, 0);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_003.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_004.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_004.php
new file mode 100644
index 00000000..88e08c1b
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_004.php
@@ -0,0 +1,121 @@
+<?php
+//============================================================+
+// File name   : example_004.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 004 for TCPDF class
+//               Cell stretching
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Cell stretching
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 004');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 004', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('times', '', 11);
+
+// add a page
+$pdf->AddPage();
+
+//Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=0, $link='', $stretch=0, $ignore_min_height=false, $calign='T', $valign='M')
+
+// test Cell stretching
+$pdf->Cell(0, 0, 'TEST CELL STRETCH: no stretch', 1, 1, 'C', 0, '', 0);
+$pdf->Cell(0, 0, 'TEST CELL STRETCH: scaling', 1, 1, 'C', 0, '', 1);
+$pdf->Cell(0, 0, 'TEST CELL STRETCH: force scaling', 1, 1, 'C', 0, '', 2);
+$pdf->Cell(0, 0, 'TEST CELL STRETCH: spacing', 1, 1, 'C', 0, '', 3);
+$pdf->Cell(0, 0, 'TEST CELL STRETCH: force spacing', 1, 1, 'C', 0, '', 4);
+
+$pdf->Ln(5);
+
+$pdf->Cell(45, 0, 'TEST CELL STRETCH: scaling', 1, 1, 'C', 0, '', 1);
+$pdf->Cell(45, 0, 'TEST CELL STRETCH: force scaling', 1, 1, 'C', 0, '', 2);
+$pdf->Cell(45, 0, 'TEST CELL STRETCH: spacing', 1, 1, 'C', 0, '', 3);
+$pdf->Cell(45, 0, 'TEST CELL STRETCH: force spacing', 1, 1, 'C', 0, '', 4);
+
+$pdf->AddPage();
+
+// example using general stretching and spacing
+
+for ($stretching = 90; $stretching <= 110; $stretching += 10) {
+	for ($spacing = -0.254; $spacing <= 0.254; $spacing += 0.254) {
+
+		// set general stretching (scaling) value
+		$pdf->setFontStretching($stretching);
+
+		// set general spacing value
+		$pdf->setFontSpacing($spacing);
+
+		$pdf->Cell(0, 0, 'Stretching '.$stretching.'%, Spacing '.sprintf('%+.3F', $spacing).'mm, no stretch', 1, 1, 'C', 0, '', 0);
+		$pdf->Cell(0, 0, 'Stretching '.$stretching.'%, Spacing '.sprintf('%+.3F', $spacing).'mm, scaling', 1, 1, 'C', 0, '', 1);
+		$pdf->Cell(0, 0, 'Stretching '.$stretching.'%, Spacing '.sprintf('%+.3F', $spacing).'mm, force scaling', 1, 1, 'C', 0, '', 2);
+		$pdf->Cell(0, 0, 'Stretching '.$stretching.'%, Spacing '.sprintf('%+.3F', $spacing).'mm, spacing', 1, 1, 'C', 0, '', 3);
+		$pdf->Cell(0, 0, 'Stretching '.$stretching.'%, Spacing '.sprintf('%+.3F', $spacing).'mm, force spacing', 1, 1, 'C', 0, '', 4);
+
+		$pdf->Ln(2);
+	}
+}
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_004.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_005.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_005.php
new file mode 100644
index 00000000..5a592d16
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_005.php
@@ -0,0 +1,158 @@
+<?php
+//============================================================+
+// File name   : example_005.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 005 for TCPDF class
+//               Multicell
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Multicell
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 005');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 005', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('times', '', 10);
+
+// add a page
+$pdf->AddPage();
+
+// set cell padding
+$pdf->setCellPaddings(1, 1, 1, 1);
+
+// set cell margins
+$pdf->setCellMargins(1, 1, 1, 1);
+
+// set color for background
+$pdf->SetFillColor(255, 255, 127);
+
+// MultiCell($w, $h, $txt, $border=0, $align='J', $fill=0, $ln=1, $x='', $y='', $reseth=true, $stretch=0, $ishtml=false, $autopadding=true, $maxh=0)
+
+// set some text for example
+$txt = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.';
+
+// Multicell test
+$pdf->MultiCell(55, 5, '[LEFT] '.$txt, 1, 'L', 1, 0, '', '', true);
+$pdf->MultiCell(55, 5, '[RIGHT] '.$txt, 1, 'R', 0, 1, '', '', true);
+$pdf->MultiCell(55, 5, '[CENTER] '.$txt, 1, 'C', 0, 0, '', '', true);
+$pdf->MultiCell(55, 5, '[JUSTIFY] '.$txt."\n", 1, 'J', 1, 2, '' ,'', true);
+$pdf->MultiCell(55, 5, '[DEFAULT] '.$txt, 1, '', 0, 1, '', '', true);
+
+$pdf->Ln(4);
+
+// set color for background
+$pdf->SetFillColor(220, 255, 220);
+
+// Vertical alignment
+$pdf->MultiCell(55, 40, '[VERTICAL ALIGNMENT - TOP] '.$txt, 1, 'J', 1, 0, '', '', true, 0, false, true, 40, 'T');
+$pdf->MultiCell(55, 40, '[VERTICAL ALIGNMENT - MIDDLE] '.$txt, 1, 'J', 1, 0, '', '', true, 0, false, true, 40, 'M');
+$pdf->MultiCell(55, 40, '[VERTICAL ALIGNMENT - BOTTOM] '.$txt, 1, 'J', 1, 1, '', '', true, 0, false, true, 40, 'B');
+
+$pdf->Ln(4);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// set color for background
+$pdf->SetFillColor(215, 235, 255);
+
+// set some text for example
+$txt = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue. Sed vel velit erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras eget velit nulla, eu sagittis elit. Nunc ac arcu est, in lobortis tellus. Praesent condimentum rhoncus sodales. In hac habitasse platea dictumst. Proin porta eros pharetra enim tincidunt dignissim nec vel dolor. Cras sapien elit, ornare ac dignissim eu, ultricies ac eros. Maecenas augue magna, ultrices a congue in, mollis eu nulla. Nunc venenatis massa at est eleifend faucibus. Vivamus sed risus lectus, nec interdum nunc.
+
+Fusce et felis vitae diam lobortis sollicitudin. Aenean tincidunt accumsan nisi, id vehicula quam laoreet elementum. Phasellus egestas interdum erat, et viverra ipsum ultricies ac. Praesent sagittis augue at augue volutpat eleifend. Cras nec orci neque. Mauris bibendum posuere blandit. Donec feugiat mollis dui sit amet pellentesque. Sed a enim justo. Donec tincidunt, nisl eget elementum aliquam, odio ipsum ultrices quam, eu porttitor ligula urna at lorem. Donec varius, eros et convallis laoreet, ligula tellus consequat felis, ut ornare metus tellus sodales velit. Duis sed diam ante. Ut rutrum malesuada massa, vitae consectetur ipsum rhoncus sed. Suspendisse potenti. Pellentesque a congue massa.';
+
+// print a blox of text using multicell()
+$pdf->MultiCell(80, 5, $txt."\n", 1, 'J', 1, 1, '' ,'', true);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// AUTO-FITTING
+
+// set color for background
+$pdf->SetFillColor(255, 235, 235);
+
+// Fit text on cell by reducing font size
+$pdf->MultiCell(55, 60, '[FIT CELL] '.$txt."\n", 1, 'J', 1, 1, 125, 145, true, 0, false, true, 60, 'M', true);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// CUSTOM PADDING
+
+// set color for background
+$pdf->SetFillColor(255, 255, 215);
+
+// set font
+$pdf->SetFont('helvetica', '', 8);
+
+// set cell padding
+$pdf->setCellPaddings(2, 4, 6, 8);
+
+$txt = "CUSTOM PADDING:\nLeft=2, Top=4, Right=6, Bottom=8\nLorem ipsum dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue.\n";
+
+$pdf->MultiCell(55, 5, $txt, 1, 'J', 1, 2, 125, 210, true);
+
+// move pointer to last page
+$pdf->lastPage();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_005.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_006.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_006.php
new file mode 100644
index 00000000..c1557a47
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_006.php
@@ -0,0 +1,330 @@
+<?php
+//============================================================+
+// File name   : example_006.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 006 for TCPDF class
+//               WriteHTML and RTL support
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: WriteHTML and RTL support
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 006');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 006', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('dejavusans', '', 10);
+
+// add a page
+$pdf->AddPage();
+
+// writeHTML($html, $ln=true, $fill=false, $reseth=false, $cell=false, $align='')
+// writeHTMLCell($w, $h, $x, $y, $html='', $border=0, $ln=0, $fill=0, $reseth=true, $align='', $autopadding=true)
+
+// create some HTML content
+$html = '<h1>HTML Example</h1>
+Some special characters: &lt; € &euro; &#8364; &amp; è &egrave; &copy; &gt; \\slash \\\\double-slash \\\\\\triple-slash
+<h2>List</h2>
+List example:
+<ol>
+	<li><img src="images/logo_example.png" alt="test alt attribute" width="30" height="30" border="0" /> test image</li>
+	<li><b>bold text</b></li>
+	<li><i>italic text</i></li>
+	<li><u>underlined text</u></li>
+	<li><b>b<i>bi<u>biu</u>bi</i>b</b></li>
+	<li><a href="http://www.tecnick.com" dir="ltr">link to http://www.tecnick.com</a></li>
+	<li>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.<br />Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.</li>
+	<li>SUBLIST
+		<ol>
+			<li>row one
+				<ul>
+					<li>sublist</li>
+				</ul>
+			</li>
+			<li>row two</li>
+		</ol>
+	</li>
+	<li><b>T</b>E<i>S</i><u>T</u> <del>line through</del></li>
+	<li><font size="+3">font + 3</font></li>
+	<li><small>small text</small> normal <small>small text</small> normal <sub>subscript</sub> normal <sup>superscript</sup> normal</li>
+</ol>
+<dl>
+	<dt>Coffee</dt>
+	<dd>Black hot drink</dd>
+	<dt>Milk</dt>
+	<dd>White cold drink</dd>
+</dl>
+<div style="text-align:center">IMAGES<br />
+<img src="images/logo_example.png" alt="test alt attribute" width="100" height="100" border="0" /><img src="images/tiger.ai" alt="test alt attribute" width="100" height="100" border="0" /><img src="images/logo_example.jpg" alt="test alt attribute" width="100" height="100" border="0" />
+</div>';
+
+// output the HTML content
+$pdf->writeHTML($html, true, false, true, false, '');
+
+
+// output some RTL HTML content
+$html = '<div style="text-align:center">The words &#8220;<span dir="rtl">&#1502;&#1494;&#1500; [mazel] &#1496;&#1493;&#1489; [tov]</span>&#8221; mean &#8220;Congratulations!&#8221;</div>';
+$pdf->writeHTML($html, true, false, true, false, '');
+
+// test some inline CSS
+$html = '<p>This is just an example of html code to demonstrate some supported CSS inline styles.
+<span style="font-weight: bold;">bold text</span>
+<span style="text-decoration: line-through;">line-trough</span>
+<span style="text-decoration: underline line-through;">underline and line-trough</span>
+<span style="color: rgb(0, 128, 64);">color</span>
+<span style="background-color: rgb(255, 0, 0); color: rgb(255, 255, 255);">background color</span>
+<span style="font-weight: bold;">bold</span>
+<span style="font-size: xx-small;">xx-small</span>
+<span style="font-size: x-small;">x-small</span>
+<span style="font-size: small;">small</span>
+<span style="font-size: medium;">medium</span>
+<span style="font-size: large;">large</span>
+<span style="font-size: x-large;">x-large</span>
+<span style="font-size: xx-large;">xx-large</span>
+</p>';
+
+$pdf->writeHTML($html, true, false, true, false, '');
+
+// reset pointer to the last page
+$pdf->lastPage();
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// Print a table
+
+// add a page
+$pdf->AddPage();
+
+// create some HTML content
+$subtable = '<table border="1" cellspacing="6" cellpadding="4"><tr><td>a</td><td>b</td></tr><tr><td>c</td><td>d</td></tr></table>';
+
+$html = '<h2>HTML TABLE:</h2>
+<table border="1" cellspacing="3" cellpadding="4">
+	<tr>
+		<th>#</th>
+		<th align="right">RIGHT align</th>
+		<th align="left">LEFT align</th>
+		<th>4A</th>
+	</tr>
+	<tr>
+		<td>1</td>
+		<td bgcolor="#cccccc" align="center" colspan="2">A1 ex<i>amp</i>le <a href="http://www.tcpdf.org">link</a> column span. One two tree four five six seven eight nine ten.<br />line after br<br /><small>small text</small> normal <sub>subscript</sub> normal <sup>superscript</sup> normal  bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla<ol><li>first<ol><li>sublist</li><li>sublist</li></ol></li><li>second</li></ol><small color="#FF0000" bgcolor="#FFFF00">small small small small small small small small small small small small small small small small small small small small</small></td>
+		<td>4B</td>
+	</tr>
+	<tr>
+		<td>'.$subtable.'</td>
+		<td bgcolor="#0000FF" color="yellow" align="center">A2 € &euro; &#8364; &amp; è &egrave;<br/>A2 € &euro; &#8364; &amp; è &egrave;</td>
+		<td bgcolor="#FFFF00" align="left"><font color="#FF0000">Red</font> Yellow BG</td>
+		<td>4C</td>
+	</tr>
+	<tr>
+		<td>1A</td>
+		<td rowspan="2" colspan="2" bgcolor="#FFFFCC">2AA<br />2AB<br />2AC</td>
+		<td bgcolor="#FF0000">4D</td>
+	</tr>
+	<tr>
+		<td>1B</td>
+		<td>4E</td>
+	</tr>
+	<tr>
+		<td>1C</td>
+		<td>2C</td>
+		<td>3C</td>
+		<td>4F</td>
+	</tr>
+</table>';
+
+// output the HTML content
+$pdf->writeHTML($html, true, false, true, false, '');
+
+// Print some HTML Cells
+
+$html = '<span color="red">red</span> <span color="green">green</span> <span color="blue">blue</span><br /><span color="red">red</span> <span color="green">green</span> <span color="blue">blue</span>';
+
+$pdf->SetFillColor(255,255,0);
+
+$pdf->writeHTMLCell(0, 0, '', '', $html, 'LRTB', 1, 0, true, 'L', true);
+$pdf->writeHTMLCell(0, 0, '', '', $html, 'LRTB', 1, 1, true, 'C', true);
+$pdf->writeHTMLCell(0, 0, '', '', $html, 'LRTB', 1, 0, true, 'R', true);
+
+// reset pointer to the last page
+$pdf->lastPage();
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// Print a table
+
+// add a page
+$pdf->AddPage();
+
+// create some HTML content
+$html = '<h1>Image alignments on HTML table</h1>
+<table cellpadding="1" cellspacing="1" border="1" style="text-align:center;">
+<tr><td><img src="images/logo_example.png" border="0" height="41" width="41" /></td></tr>
+<tr style="text-align:left;"><td><img src="images/logo_example.png" border="0" height="41" width="41" align="top" /></td></tr>
+<tr style="text-align:center;"><td><img src="images/logo_example.png" border="0" height="41" width="41" align="middle" /></td></tr>
+<tr style="text-align:right;"><td><img src="images/logo_example.png" border="0" height="41" width="41" align="bottom" /></td></tr>
+<tr><td style="text-align:left;"><img src="images/logo_example.png" border="0" height="41" width="41" align="top" /></td></tr>
+<tr><td style="text-align:center;"><img src="images/logo_example.png" border="0" height="41" width="41" align="middle" /></td></tr>
+<tr><td style="text-align:right;"><img src="images/logo_example.png" border="0" height="41" width="41" align="bottom" /></td></tr>
+</table>';
+
+// output the HTML content
+$pdf->writeHTML($html, true, false, true, false, '');
+
+// reset pointer to the last page
+$pdf->lastPage();
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// Print all HTML colors
+
+// add a page
+$pdf->AddPage();
+
+$textcolors = '<h1>HTML Text Colors</h1>';
+$bgcolors = '<hr /><h1>HTML Background Colors</h1>';
+
+foreach(TCPDF_COLORS::$webcolor as $k => $v) {
+	$textcolors .= '<span color="#'.$v.'">'.$v.'</span> ';
+	$bgcolors .= '<span bgcolor="#'.$v.'" color="#333333">'.$v.'</span> ';
+}
+
+// output the HTML content
+$pdf->writeHTML($textcolors, true, false, true, false, '');
+$pdf->writeHTML($bgcolors, true, false, true, false, '');
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// Test word-wrap
+
+// create some HTML content
+$html = '<hr />
+<h1>Various tests</h1>
+<a href="#2">link to page 2</a><br />
+<font face="courier"><b>thisisaverylongword</b></font> <font face="helvetica"><i>thisisanotherverylongword</i></font> <font face="times"><b>thisisaverylongword</b></font> thisisanotherverylongword <font face="times">thisisaverylongword</font> <font face="courier"><b>thisisaverylongword</b></font> <font face="helvetica"><i>thisisanotherverylongword</i></font> <font face="times"><b>thisisaverylongword</b></font> thisisanotherverylongword <font face="times">thisisaverylongword</font> <font face="courier"><b>thisisaverylongword</b></font> <font face="helvetica"><i>thisisanotherverylongword</i></font> <font face="times"><b>thisisaverylongword</b></font> thisisanotherverylongword <font face="times">thisisaverylongword</font> <font face="courier"><b>thisisaverylongword</b></font> <font face="helvetica"><i>thisisanotherverylongword</i></font> <font face="times"><b>thisisaverylongword</b></font> thisisanotherverylongword <font face="times">thisisaverylongword</font> <font face="courier"><b>thisisaverylongword</b></font> <font face="helvetica"><i>thisisanotherverylongword</i></font> <font face="times"><b>thisisaverylongword</b></font> thisisanotherverylongword <font face="times">thisisaverylongword</font>';
+
+// output the HTML content
+$pdf->writeHTML($html, true, false, true, false, '');
+
+// Test fonts nesting
+$html1 = 'Default <font face="courier">Courier <font face="helvetica">Helvetica <font face="times">Times <font face="dejavusans">dejavusans </font>Times </font>Helvetica </font>Courier </font>Default';
+$html2 = '<small>small text</small> normal <small>small text</small> normal <sub>subscript</sub> normal <sup>superscript</sup> normal';
+$html3 = '<font size="10" color="#ff7f50">The</font> <font size="10" color="#6495ed">quick</font> <font size="14" color="#dc143c">brown</font> <font size="18" color="#008000">fox</font> <font size="22"><a href="http://www.tcpdf.org">jumps</a></font> <font size="22" color="#a0522d">over</font> <font size="18" color="#da70d6">the</font> <font size="14" color="#9400d3">lazy</font> <font size="10" color="#4169el">dog</font>.';
+
+$html = $html1.'<br />'.$html2.'<br />'.$html3.'<br />'.$html3.'<br />'.$html2;
+
+// output the HTML content
+$pdf->writeHTML($html, true, false, true, false, '');
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// test pre tag
+
+// add a page
+$pdf->AddPage();
+
+$html = <<<EOF
+<div style="background-color:#880000;color:white;">
+Hello World!<br />
+Hello
+</div>
+<pre style="background-color:#336699;color:white;">
+int main() {
+    printf("HelloWorld");
+    return 0;
+}
+</pre>
+<tt>Monospace font</tt>, normal font, <tt>monospace font</tt>, normal font.
+<br />
+<div style="background-color:#880000;color:white;">DIV LEVEL 1<div style="background-color:#008800;color:white;">DIV LEVEL 2</div>DIV LEVEL 1</div>
+<br />
+<span style="background-color:#880000;color:white;">SPAN LEVEL 1 <span style="background-color:#008800;color:white;">SPAN LEVEL 2</span> SPAN LEVEL 1</span>
+EOF;
+
+// output the HTML content
+$pdf->writeHTML($html, true, false, true, false, '');
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// test custom bullet points for list
+
+// add a page
+$pdf->AddPage();
+
+$html = <<<EOF
+<h1>Test custom bullet image for list items</h1>
+<ul style="font-size:14pt;list-style-type:img|png|4|4|images/logo_example.png">
+	<li>test custom bullet image</li>
+	<li>test custom bullet image</li>
+	<li>test custom bullet image</li>
+	<li>test custom bullet image</li>
+<ul>
+EOF;
+
+// output the HTML content
+$pdf->writeHTML($html, true, false, true, false, '');
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// reset pointer to the last page
+$pdf->lastPage();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_006.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_007.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_007.php
new file mode 100644
index 00000000..97ebecb2
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_007.php
@@ -0,0 +1,113 @@
+<?php
+//============================================================+
+// File name   : example_007.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 007 for TCPDF class
+//               Two independent columns with WriteHTMLCell()
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Two independent columns with WriteHTMLCell()
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 007');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 007', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('times', '', 12);
+
+// add a page
+$pdf->AddPage();
+
+// create columns content
+$left_column = '<b>LEFT COLUMN</b> left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column';
+
+$right_column = '<b>RIGHT COLUMN</b> right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column';
+
+// writeHTMLCell($w, $h, $x, $y, $html='', $border=0, $ln=0, $fill=0, $reseth=true, $align='', $autopadding=true)
+
+// get current vertical position
+$y = $pdf->getY();
+
+// set color for background
+$pdf->SetFillColor(255, 255, 200);
+
+// set color for text
+$pdf->SetTextColor(0, 63, 127);
+
+// write the first column
+$pdf->writeHTMLCell(80, '', '', $y, $left_column, 1, 0, 1, true, 'J', true);
+
+// set color for background
+$pdf->SetFillColor(215, 235, 255);
+
+// set color for text
+$pdf->SetTextColor(127, 31, 0);
+
+// write the second column
+$pdf->writeHTMLCell(80, '', '', '', $right_column, 1, 1, 1, true, 'J', true);
+
+// reset pointer to the last page
+$pdf->lastPage();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_007.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_008.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_008.php
new file mode 100644
index 00000000..4349c386
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_008.php
@@ -0,0 +1,97 @@
+<?php
+//============================================================+
+// File name   : example_008.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 008 for TCPDF class
+//               Include external UTF-8 text file
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Include external UTF-8 text file
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 008');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 008', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set default font subsetting mode
+$pdf->setFontSubsetting(true);
+
+// set font
+$pdf->SetFont('freeserif', '', 12);
+
+// add a page
+$pdf->AddPage();
+
+// get esternal file content
+$utf8text = file_get_contents('data/utf8test.txt', false);
+
+// set color for text
+$pdf->SetTextColor(0, 63, 127);
+
+//Write($h, $txt, $link='', $fill=0, $align='', $ln=false, $stretch=0, $firstline=false, $firstblock=false, $maxh=0)
+
+// write the text
+$pdf->Write(5, $utf8text, '', 0, '', false, 0, false, false, 0);
+
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_008.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_009.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_009.php
new file mode 100644
index 00000000..bb72d8b7
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_009.php
@@ -0,0 +1,146 @@
+<?php
+//============================================================+
+// File name   : example_009.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 009 for TCPDF class
+//               Test Image
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Test Image
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 009');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 009', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// -------------------------------------------------------------------
+
+// add a page
+$pdf->AddPage();
+
+// set JPEG quality
+$pdf->setJPEGQuality(75);
+
+// Image method signature:
+// Image($file, $x='', $y='', $w=0, $h=0, $type='', $link='', $align='', $resize=false, $dpi=300, $palign='', $ismask=false, $imgmask=false, $border=0, $fitbox=false, $hidden=false, $fitonpage=false)
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// Example of Image from data stream ('PHP rules')
+$imgdata = base64_decode('iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABlBMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDrEX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg==');
+
+// The '@' character is used to indicate that follows an image data stream and not an image file name
+$pdf->Image('@'.$imgdata);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// Image example with resizing
+$pdf->Image('images/image_demo.jpg', 15, 140, 75, 113, 'JPG', 'http://www.tcpdf.org', '', true, 150, '', false, false, 1, false, false, false);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// test fitbox with all alignment combinations
+
+$horizontal_alignments = array('L', 'C', 'R');
+$vertical_alignments = array('T', 'M', 'B');
+
+$x = 15;
+$y = 35;
+$w = 30;
+$h = 30;
+// test all combinations of alignments
+for ($i = 0; $i < 3; ++$i) {
+	$fitbox = $horizontal_alignments[$i].' ';
+	$x = 15;
+	for ($j = 0; $j < 3; ++$j) {
+		$fitbox{1} = $vertical_alignments[$j];
+		$pdf->Rect($x, $y, $w, $h, 'F', array(), array(128,255,128));
+		$pdf->Image('images/image_demo.jpg', $x, $y, $w, $h, 'JPG', '', '', false, 300, '', false, false, 0, $fitbox, false, false);
+		$x += 32; // new column
+	}
+	$y += 32; // new row
+}
+
+$x = 115;
+$y = 35;
+$w = 25;
+$h = 50;
+for ($i = 0; $i < 3; ++$i) {
+	$fitbox = $horizontal_alignments[$i].' ';
+	$x = 115;
+	for ($j = 0; $j < 3; ++$j) {
+		$fitbox{1} = $vertical_alignments[$j];
+		$pdf->Rect($x, $y, $w, $h, 'F', array(), array(128,255,255));
+		$pdf->Image('images/image_demo.jpg', $x, $y, $w, $h, 'JPG', '', '', false, 300, '', false, false, 0, $fitbox, false, false);
+		$x += 27; // new column
+	}
+	$y += 52; // new row
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// Stretching, position and alignment example
+
+$pdf->SetXY(110, 200);
+$pdf->Image('images/image_demo.jpg', '', '', 40, 40, '', '', 'T', false, 300, '', false, false, 1, false, false, false);
+$pdf->Image('images/image_demo.jpg', '', '', 40, 40, '', '', '', false, 300, '', false, false, 1, false, false, false);
+
+// -------------------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_009.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_010.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_010.php
new file mode 100644
index 00000000..5b980b04
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_010.php
@@ -0,0 +1,150 @@
+<?php
+//============================================================+
+// File name   : example_010.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 010 for TCPDF class
+//               Text on multiple columns
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Text on multiple columns
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+
+/**
+ * Extend TCPDF to work with multiple columns
+ */
+class MC_TCPDF extends TCPDF {
+
+	/**
+	 * Print chapter
+	 * @param $num (int) chapter number
+	 * @param $title (string) chapter title
+	 * @param $file (string) name of the file containing the chapter body
+	 * @param $mode (boolean) if true the chapter body is in HTML, otherwise in simple text.
+	 * @public
+	 */
+	public function PrintChapter($num, $title, $file, $mode=false) {
+		// add a new page
+		$this->AddPage();
+		// disable existing columns
+		$this->resetColumns();
+		// print chapter title
+		$this->ChapterTitle($num, $title);
+		// set columns
+		$this->setEqualColumns(3, 57);
+		// print chapter body
+		$this->ChapterBody($file, $mode);
+	}
+
+	/**
+	 * Set chapter title
+	 * @param $num (int) chapter number
+	 * @param $title (string) chapter title
+	 * @public
+	 */
+	public function ChapterTitle($num, $title) {
+		$this->SetFont('helvetica', '', 14);
+		$this->SetFillColor(200, 220, 255);
+		$this->Cell(180, 6, 'Chapter '.$num.' : '.$title, 0, 1, '', 1);
+		$this->Ln(4);
+	}
+
+	/**
+	 * Print chapter body
+	 * @param $file (string) name of the file containing the chapter body
+	 * @param $mode (boolean) if true the chapter body is in HTML, otherwise in simple text.
+	 * @public
+	 */
+	public function ChapterBody($file, $mode=false) {
+		$this->selectColumn();
+		// get esternal file content
+		$content = file_get_contents($file, false);
+		// set font
+		$this->SetFont('times', '', 9);
+		$this->SetTextColor(50, 50, 50);
+		// print content
+		if ($mode) {
+			// ------ HTML MODE ------
+			$this->writeHTML($content, true, false, true, false, 'J');
+		} else {
+			// ------ TEXT MODE ------
+			$this->Write(0, $content, '', 0, 'J', true, 0, false, true, 0);
+		}
+		$this->Ln();
+	}
+} // end of extended class
+
+// ---------------------------------------------------------
+// EXAMPLE
+// ---------------------------------------------------------
+// create new PDF document
+$pdf = new MC_TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 010');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 010', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// print TEXT
+$pdf->PrintChapter(1, 'LOREM IPSUM [TEXT]', 'data/chapter_demo_1.txt', false);
+
+// print HTML
+$pdf->PrintChapter(2, 'LOREM IPSUM [HTML]', 'data/chapter_demo_2.txt', true);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_010.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_011.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_011.php
new file mode 100644
index 00000000..623ba3b8
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_011.php
@@ -0,0 +1,138 @@
+<?php
+//============================================================+
+// File name   : example_011.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 011 for TCPDF class
+//               Colored Table (very simple table)
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Colored Table
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// extend TCPF with custom functions
+class MYPDF extends TCPDF {
+
+	// Load table data from file
+	public function LoadData($file) {
+		// Read file lines
+		$lines = file($file);
+		$data = array();
+		foreach($lines as $line) {
+			$data[] = explode(';', chop($line));
+		}
+		return $data;
+	}
+
+	// Colored table
+	public function ColoredTable($header,$data) {
+		// Colors, line width and bold font
+		$this->SetFillColor(255, 0, 0);
+		$this->SetTextColor(255);
+		$this->SetDrawColor(128, 0, 0);
+		$this->SetLineWidth(0.3);
+		$this->SetFont('', 'B');
+		// Header
+		$w = array(40, 35, 40, 45);
+		$num_headers = count($header);
+		for($i = 0; $i < $num_headers; ++$i) {
+			$this->Cell($w[$i], 7, $header[$i], 1, 0, 'C', 1);
+		}
+		$this->Ln();
+		// Color and font restoration
+		$this->SetFillColor(224, 235, 255);
+		$this->SetTextColor(0);
+		$this->SetFont('');
+		// Data
+		$fill = 0;
+		foreach($data as $row) {
+			$this->Cell($w[0], 6, $row[0], 'LR', 0, 'L', $fill);
+			$this->Cell($w[1], 6, $row[1], 'LR', 0, 'L', $fill);
+			$this->Cell($w[2], 6, number_format($row[2]), 'LR', 0, 'R', $fill);
+			$this->Cell($w[3], 6, number_format($row[3]), 'LR', 0, 'R', $fill);
+			$this->Ln();
+			$fill=!$fill;
+		}
+		$this->Cell(array_sum($w), 0, '', 'T');
+	}
+}
+
+// create new PDF document
+$pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 011');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 011', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 12);
+
+// add a page
+$pdf->AddPage();
+
+// column titles
+$header = array('Country', 'Capital', 'Area (sq km)', 'Pop. (thousands)');
+
+// data loading
+$data = $pdf->LoadData('data/table_data_demo.txt');
+
+// print colored table
+$pdf->ColoredTable($header, $data);
+
+// ---------------------------------------------------------
+
+// close and output PDF document
+$pdf->Output('example_011.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_012.pdf b/htmltest/sites/all/libraries/tcpdf-version/examples/example_012.pdf
new file mode 100644
index 00000000..eec8ee0c
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/examples/example_012.pdf differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_012.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_012.php
new file mode 100644
index 00000000..aaa196b7
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_012.php
@@ -0,0 +1,205 @@
+<?php
+//============================================================+
+// File name   : example_012.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 012 for TCPDF class
+//               Graphic Functions
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Graphic Functions
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 012');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// disable header and footer
+$pdf->setPrintHeader(false);
+$pdf->setPrintFooter(false);
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 10);
+
+// add a page
+$pdf->AddPage();
+
+$style = array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => '10,20,5,10', 'phase' => 10, 'color' => array(255, 0, 0));
+$style2 = array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(255, 0, 0));
+$style3 = array('width' => 1, 'cap' => 'round', 'join' => 'round', 'dash' => '2,10', 'color' => array(255, 0, 0));
+$style4 = array('L' => 0,
+                'T' => array('width' => 0.25, 'cap' => 'butt', 'join' => 'miter', 'dash' => '20,10', 'phase' => 10, 'color' => array(100, 100, 255)),
+                'R' => array('width' => 0.50, 'cap' => 'round', 'join' => 'miter', 'dash' => 0, 'color' => array(50, 50, 127)),
+                'B' => array('width' => 0.75, 'cap' => 'square', 'join' => 'miter', 'dash' => '30,10,5,10'));
+$style5 = array('width' => 0.25, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 64, 128));
+$style6 = array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => '10,10', 'color' => array(0, 128, 0));
+$style7 = array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(255, 128, 0));
+
+// Line
+$pdf->Text(5, 4, 'Line examples');
+$pdf->Line(5, 10, 80, 30, $style);
+$pdf->Line(5, 10, 5, 30, $style2);
+$pdf->Line(5, 10, 80, 10, $style3);
+
+// Rect
+$pdf->Text(100, 4, 'Rectangle examples');
+$pdf->Rect(100, 10, 40, 20, 'DF', $style4, array(220, 220, 200));
+$pdf->Rect(145, 10, 40, 20, 'D', array('all' => $style3));
+
+// Curve
+$pdf->Text(5, 34, 'Curve examples');
+$pdf->Curve(5, 40, 30, 55, 70, 45, 60, 75, null, $style6);
+$pdf->Curve(80, 40, 70, 75, 150, 45, 100, 75, 'F', $style6);
+$pdf->Curve(140, 40, 150, 55, 180, 45, 200, 75, 'DF', $style6, array(200, 220, 200));
+
+// Circle and ellipse
+$pdf->Text(5, 79, 'Circle and ellipse examples');
+$pdf->SetLineStyle($style5);
+$pdf->Circle(25,105,20);
+$pdf->Circle(25,105,10, 90, 180, null, $style6);
+$pdf->Circle(25,105,10, 270, 360, 'F');
+$pdf->Circle(25,105,10, 270, 360, 'C', $style6);
+
+$pdf->SetLineStyle($style5);
+$pdf->Ellipse(100,103,40,20);
+$pdf->Ellipse(100,105,20,10, 0, 90, 180, null, $style6);
+$pdf->Ellipse(100,105,20,10, 0, 270, 360, 'DF', $style6);
+
+$pdf->SetLineStyle($style5);
+$pdf->Ellipse(175,103,30,15,45);
+$pdf->Ellipse(175,105,15,7.50, 45, 90, 180, null, $style6);
+$pdf->Ellipse(175,105,15,7.50, 45, 270, 360, 'F', $style6, array(220, 200, 200));
+
+// Polygon
+$pdf->Text(5, 129, 'Polygon examples');
+$pdf->SetLineStyle(array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)));
+$pdf->Polygon(array(5,135,45,135,15,165));
+$pdf->Polygon(array(60,135,80,135,80,155,70,165,50,155), 'DF', array($style6, $style7, $style7, 0, $style6), array(220, 200, 200));
+$pdf->Polygon(array(120,135,140,135,150,155,110,155), 'D', array($style6, 0, $style7, $style6));
+$pdf->Polygon(array(160,135,190,155,170,155,200,160,160,165), 'DF', array('all' => $style6), array(220, 220, 220));
+
+// Polygonal Line
+$pdf->SetLineStyle(array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 164)));
+$pdf->PolyLine(array(80,165,90,160,100,165,110,160,120,165,130,160,140,165), 'D', array(), array());
+
+// Regular polygon
+$pdf->Text(5, 169, 'Regular polygon examples');
+$pdf->SetLineStyle($style5);
+$pdf->RegularPolygon(20, 190, 15, 6, 0, 1, 'F');
+$pdf->RegularPolygon(55, 190, 15, 6);
+$pdf->RegularPolygon(55, 190, 10, 6, 45, 0, 'DF', array($style6, 0, $style7, 0, $style7, $style7));
+$pdf->RegularPolygon(90, 190, 15, 3, 0, 1, 'DF', array('all' => $style5), array(200, 220, 200), 'F', array(255, 200, 200));
+$pdf->RegularPolygon(125, 190, 15, 4, 30, 1, null, array('all' => $style5), null, null, $style6);
+$pdf->RegularPolygon(160, 190, 15, 10);
+
+// Star polygon
+$pdf->Text(5, 209, 'Star polygon examples');
+$pdf->SetLineStyle($style5);
+$pdf->StarPolygon(20, 230, 15, 20, 3, 0, 1, 'F');
+$pdf->StarPolygon(55, 230, 15, 12, 5);
+$pdf->StarPolygon(55, 230, 7, 12, 5, 45, 0, 'DF', array('all' => $style7), array(220, 220, 200), 'F', array(255, 200, 200));
+$pdf->StarPolygon(90, 230, 15, 20, 6, 0, 1, 'DF', array('all' => $style5), array(220, 220, 200), 'F', array(255, 200, 200));
+$pdf->StarPolygon(125, 230, 15, 5, 2, 30, 1, null, array('all' => $style5), null, null, $style6);
+$pdf->StarPolygon(160, 230, 15, 10, 3);
+$pdf->StarPolygon(160, 230, 7, 50, 26);
+
+// Rounded rectangle
+$pdf->Text(5, 249, 'Rounded rectangle examples');
+$pdf->SetLineStyle(array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)));
+$pdf->RoundedRect(5, 255, 40, 30, 3.50, '1111', 'DF');
+$pdf->RoundedRect(50, 255, 40, 30, 6.50, '1000');
+$pdf->RoundedRect(95, 255, 40, 30, 10.0, '1111', null, $style6);
+$pdf->RoundedRect(140, 255, 40, 30, 8.0, '0101', 'DF', $style6, array(200, 200, 200));
+
+// Arrows
+$pdf->Text(185, 249, 'Arrows');
+$pdf->SetLineStyle($style5);
+$pdf->SetFillColor(255, 0, 0);
+$pdf->Arrow(200, 280, 185, 266, 0, 5, 15);
+$pdf->Arrow(200, 280, 190, 263, 1, 5, 15);
+$pdf->Arrow(200, 280, 195, 261, 2, 5, 15);
+$pdf->Arrow(200, 280, 200, 260, 3, 5, 15);
+
+// - . - . - . - . - . - . - . - . - . - . - . - . - . - . -
+
+// ellipse
+
+// add a page
+$pdf->AddPage();
+
+$pdf->Cell(0, 0, 'Arc of Ellipse');
+
+// center of ellipse
+$xc=100;
+$yc=100;
+
+// X Y axis
+$pdf->SetDrawColor(200, 200, 200);
+$pdf->Line($xc-50, $yc, $xc+50, $yc);
+$pdf->Line($xc, $yc-50, $xc, $yc+50);
+
+// ellipse axis
+$pdf->SetDrawColor(200, 220, 255);
+$pdf->Line($xc-50, $yc-50, $xc+50, $yc+50);
+$pdf->Line($xc-50, $yc+50, $xc+50, $yc-50);
+
+// ellipse
+$pdf->SetDrawColor(200, 255, 200);
+$pdf->Ellipse($xc, $yc, 30, 15, 45, 0, 360, 'D', array(), array(), 2);
+
+// ellipse arc
+$pdf->SetDrawColor(255, 0, 0);
+$pdf->Ellipse($xc, $yc, 30, 15, 45, 45, 90, 'D', array(), array(), 2);
+
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_012.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_013.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_013.php
new file mode 100644
index 00000000..a472760c
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_013.php
@@ -0,0 +1,229 @@
+<?php
+//============================================================+
+// File name   : example_013.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 013 for TCPDF class
+//               Graphic Transformations
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Graphic Transformations
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 013');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 013', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', 'B', 20);
+
+// add a page
+$pdf->AddPage();
+
+$pdf->Write(0, 'Graphic Transformations', '', 0, 'C', 1, 0, false, false, 0);
+
+// set font
+$pdf->SetFont('helvetica', '', 10);
+
+// --- Scaling ---------------------------------------------
+$pdf->SetDrawColor(200);
+$pdf->SetTextColor(200);
+$pdf->Rect(50, 70, 40, 10, 'D');
+$pdf->Text(50, 66, 'Scale');
+$pdf->SetDrawColor(0);
+$pdf->SetTextColor(0);
+// Start Transformation
+$pdf->StartTransform();
+// Scale by 150% centered by (50,80) which is the lower left corner of the rectangle
+$pdf->ScaleXY(150, 50, 80);
+$pdf->Rect(50, 70, 40, 10, 'D');
+$pdf->Text(50, 66, 'Scale');
+// Stop Transformation
+$pdf->StopTransform();
+
+// --- Translation -----------------------------------------
+$pdf->SetDrawColor(200);
+$pdf->SetTextColor(200);
+$pdf->Rect(125, 70, 40, 10, 'D');
+$pdf->Text(125, 66, 'Translate');
+$pdf->SetDrawColor(0);
+$pdf->SetTextColor(0);
+// Start Transformation
+$pdf->StartTransform();
+// Translate 7 to the right, 5 to the bottom
+$pdf->Translate(7, 5);
+$pdf->Rect(125, 70, 40, 10, 'D');
+$pdf->Text(125, 66, 'Translate');
+// Stop Transformation
+$pdf->StopTransform();
+
+// --- Rotation --------------------------------------------
+$pdf->SetDrawColor(200);
+$pdf->SetTextColor(200);
+$pdf->Rect(70, 100, 40, 10, 'D');
+$pdf->Text(70, 96, 'Rotate');
+$pdf->SetDrawColor(0);
+$pdf->SetTextColor(0);
+// Start Transformation
+$pdf->StartTransform();
+// Rotate 20 degrees counter-clockwise centered by (70,110) which is the lower left corner of the rectangle
+$pdf->Rotate(20, 70, 110);
+$pdf->Rect(70, 100, 40, 10, 'D');
+$pdf->Text(70, 96, 'Rotate');
+// Stop Transformation
+$pdf->StopTransform();
+
+// --- Skewing ---------------------------------------------
+$pdf->SetDrawColor(200);
+$pdf->SetTextColor(200);
+$pdf->Rect(125, 100, 40, 10, 'D');
+$pdf->Text(125, 96, 'Skew');
+$pdf->SetDrawColor(0);
+$pdf->SetTextColor(0);
+// Start Transformation
+$pdf->StartTransform();
+// skew 30 degrees along the x-axis centered by (125,110) which is the lower left corner of the rectangle
+$pdf->SkewX(30, 125, 110);
+$pdf->Rect(125, 100, 40, 10, 'D');
+$pdf->Text(125, 96, 'Skew');
+// Stop Transformation
+$pdf->StopTransform();
+
+// --- Mirroring horizontally ------------------------------
+$pdf->SetDrawColor(200);
+$pdf->SetTextColor(200);
+$pdf->Rect(70, 130, 40, 10, 'D');
+$pdf->Text(70, 126, 'MirrorH');
+$pdf->SetDrawColor(0);
+$pdf->SetTextColor(0);
+// Start Transformation
+$pdf->StartTransform();
+// mirror horizontally with axis of reflection at x-position 70 (left side of the rectangle)
+$pdf->MirrorH(70);
+$pdf->Rect(70, 130, 40, 10, 'D');
+$pdf->Text(70, 126, 'MirrorH');
+// Stop Transformation
+$pdf->StopTransform();
+
+// --- Mirroring vertically --------------------------------
+$pdf->SetDrawColor(200);
+$pdf->SetTextColor(200);
+$pdf->Rect(125, 130, 40, 10, 'D');
+$pdf->Text(125, 126, 'MirrorV');
+$pdf->SetDrawColor(0);
+$pdf->SetTextColor(0);
+// Start Transformation
+$pdf->StartTransform();
+// mirror vertically with axis of reflection at y-position 140 (bottom side of the rectangle)
+$pdf->MirrorV(140);
+$pdf->Rect(125, 130, 40, 10, 'D');
+$pdf->Text(125, 126, 'MirrorV');
+// Stop Transformation
+$pdf->StopTransform();
+
+// --- Point reflection ------------------------------------
+$pdf->SetDrawColor(200);
+$pdf->SetTextColor(200);
+$pdf->Rect(70, 160, 40, 10, 'D');
+$pdf->Text(70, 156, 'MirrorP');
+$pdf->SetDrawColor(0);
+$pdf->SetTextColor(0);
+// Start Transformation
+$pdf->StartTransform();
+// point reflection at the lower left point of rectangle
+$pdf->MirrorP(70,170);
+$pdf->Rect(70, 160, 40, 10, 'D');
+$pdf->Text(70, 156, 'MirrorP');
+// Stop Transformation
+$pdf->StopTransform();
+
+// --- Mirroring against a straigth line described by a point (120, 120) and an angle -20°
+$angle=-20;
+$px=120;
+$py=170;
+
+// just for visualisation: the straight line to mirror against
+
+$pdf->SetDrawColor(200);
+$pdf->Line($px-1,$py-1,$px+1,$py+1);
+$pdf->Line($px-1,$py+1,$px+1,$py-1);
+$pdf->StartTransform();
+$pdf->Rotate($angle, $px, $py);
+$pdf->Line($px-5, $py, $px+60, $py);
+$pdf->StopTransform();
+
+$pdf->SetDrawColor(200);
+$pdf->SetTextColor(200);
+$pdf->Rect(125, 160, 40, 10, 'D');
+$pdf->Text(125, 156, 'MirrorL');
+$pdf->SetDrawColor(0);
+$pdf->SetTextColor(0);
+//Start Transformation
+$pdf->StartTransform();
+//mirror against the straight line
+$pdf->MirrorL($angle, $px, $py);
+$pdf->Rect(125, 160, 40, 10, 'D');
+$pdf->Text(125, 156, 'MirrorL');
+//Stop Transformation
+$pdf->StopTransform();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_013.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_014.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_014.php
new file mode 100644
index 00000000..4941dd00
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_014.php
@@ -0,0 +1,194 @@
+<?php
+//============================================================+
+// File name   : example_014.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 014 for TCPDF class
+//               Javascript Form and user rights (only works on Adobe Acrobat)
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Javascript Form and user rights (only works on Adobe Acrobat)
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 014');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 014', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// IMPORTANT: disable font subsetting to allow users editing the document
+$pdf->setFontSubsetting(false);
+
+// set font
+$pdf->SetFont('helvetica', '', 10, '', false);
+
+// add a page
+$pdf->AddPage();
+
+/*
+It is possible to create text fields, combo boxes, check boxes and buttons.
+Fields are created at the current position and are given a name.
+This name allows to manipulate them via JavaScript in order to perform some validation for instance.
+*/
+
+// set default form properties
+$pdf->setFormDefaultProp(array('lineWidth'=>1, 'borderStyle'=>'solid', 'fillColor'=>array(255, 255, 200), 'strokeColor'=>array(255, 128, 128)));
+
+$pdf->SetFont('helvetica', 'BI', 18);
+$pdf->Cell(0, 5, 'Example of Form', 0, 1, 'C');
+$pdf->Ln(10);
+
+$pdf->SetFont('helvetica', '', 12);
+
+// First name
+$pdf->Cell(35, 5, 'First name:');
+$pdf->TextField('firstname', 50, 5);
+$pdf->Ln(6);
+
+// Last name
+$pdf->Cell(35, 5, 'Last name:');
+$pdf->TextField('lastname', 50, 5);
+$pdf->Ln(6);
+
+// Gender
+$pdf->Cell(35, 5, 'Gender:');
+$pdf->ComboBox('gender', 30, 5, array(array('', '-'), array('M', 'Male'), array('F', 'Female')));
+$pdf->Ln(6);
+
+// Drink
+$pdf->Cell(35, 5, 'Drink:');
+//$pdf->RadioButton('drink', 5, array('readonly' => 'true'), array(), 'Water');
+$pdf->RadioButton('drink', 5, array(), array(), 'Water');
+$pdf->Cell(35, 5, 'Water');
+$pdf->Ln(6);
+$pdf->Cell(35, 5, '');
+$pdf->RadioButton('drink', 5, array(), array(), 'Beer', true);
+$pdf->Cell(35, 5, 'Beer');
+$pdf->Ln(6);
+$pdf->Cell(35, 5, '');
+$pdf->RadioButton('drink', 5, array(), array(), 'Wine');
+$pdf->Cell(35, 5, 'Wine');
+$pdf->Ln(6);
+$pdf->Cell(35, 5, '');
+$pdf->RadioButton('drink', 5, array(), array(), 'Milk');
+$pdf->Cell(35, 5, 'Milk');
+$pdf->Ln(10);
+
+// Newsletter
+$pdf->Cell(35, 5, 'Newsletter:');
+$pdf->CheckBox('newsletter', 5, true, array(), array(), 'OK');
+
+$pdf->Ln(10);
+// Adress
+$pdf->Cell(35, 5, 'Address:');
+$pdf->TextField('address', 60, 18, array('multiline'=>true, 'lineWidth'=>0, 'borderStyle'=>'none'), array('v'=>'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', 'dv'=>'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'));
+$pdf->Ln(19);
+
+// Listbox
+$pdf->Cell(35, 5, 'List:');
+$pdf->ListBox('listbox', 60, 15, array('', 'item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7'), array('multipleSelection'=>'true'));
+$pdf->Ln(20);
+
+// E-mail
+$pdf->Cell(35, 5, 'E-mail:');
+$pdf->TextField('email', 50, 5);
+$pdf->Ln(6);
+
+// Date of the day
+$pdf->Cell(35, 5, 'Date:');
+$pdf->TextField('date', 30, 5, array(), array('v'=>date('Y-m-d'), 'dv'=>date('Y-m-d')));
+$pdf->Ln(10);
+
+$pdf->SetX(50);
+
+// Button to validate and print
+$pdf->Button('print', 30, 10, 'Print', 'Print()', array('lineWidth'=>2, 'borderStyle'=>'beveled', 'fillColor'=>array(128, 196, 255), 'strokeColor'=>array(64, 64, 64)));
+
+// Reset Button
+$pdf->Button('reset', 30, 10, 'Reset', array('S'=>'ResetForm'), array('lineWidth'=>2, 'borderStyle'=>'beveled', 'fillColor'=>array(128, 196, 255), 'strokeColor'=>array(64, 64, 64)));
+
+// Submit Button
+$pdf->Button('submit', 30, 10, 'Submit', array('S'=>'SubmitForm', 'F'=>'http://localhost/printvars.php', 'Flags'=>array('ExportFormat')), array('lineWidth'=>2, 'borderStyle'=>'beveled', 'fillColor'=>array(128, 196, 255), 'strokeColor'=>array(64, 64, 64)));
+
+// Form validation functions
+$js = <<<EOD
+function CheckField(name,message) {
+	var f = getField(name);
+	if(f.value == '') {
+	    app.alert(message);
+	    f.setFocus();
+	    return false;
+	}
+	return true;
+}
+function Print() {
+	if(!CheckField('firstname','First name is mandatory')) {return;}
+	if(!CheckField('lastname','Last name is mandatory')) {return;}
+	if(!CheckField('gender','Gender is mandatory')) {return;}
+	if(!CheckField('address','Address is mandatory')) {return;}
+	print();
+}
+EOD;
+
+// Add Javascript code
+$pdf->IncludeJS($js);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_014.pdf', 'D');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_015.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_015.php
new file mode 100644
index 00000000..4cc03cab
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_015.php
@@ -0,0 +1,161 @@
+<?php
+//============================================================+
+// File name   : example_015.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 015 for TCPDF class
+//               Bookmarks (Table of Content)
+//               and Named Destinations.
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Bookmarks (Table of Content)
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 015');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 015', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// Bookmark($txt, $level=0, $y=-1, $page='', $style='', $color=array(0,0,0))
+
+// set font
+$pdf->SetFont('times', 'B', 20);
+
+// add a page
+$pdf->AddPage();
+
+// set a bookmark for the current position
+$pdf->Bookmark('Chapter 1', 0, 0, '', 'B', array(0,64,128));
+
+// print a line using Cell()
+$pdf->Cell(0, 10, 'Chapter 1', 0, 1, 'L');
+
+$pdf->SetFont('times', 'I', 14);
+$pdf->Write(0, 'You can set PDF Bookmarks using the Bookmark() method.
+You can set PDF Named Destinations using the setDestination() method.');
+
+$pdf->SetFont('times', 'B', 20);
+
+// add other pages and bookmarks
+
+$pdf->AddPage();
+$pdf->Bookmark('Paragraph 1.1', 1, 0, '', '', array(0,0,0));
+$pdf->Cell(0, 10, 'Paragraph 1.1', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Bookmark('Paragraph 1.2', 1, 0, '', '', array(0,0,0));
+$pdf->Cell(0, 10, 'Paragraph 1.2', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Bookmark('Sub-Paragraph 1.2.1', 2, 0, '', 'I', array(0,0,0));
+$pdf->Cell(0, 10, 'Sub-Paragraph 1.2.1', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Bookmark('Paragraph 1.3', 1, 0, '', '', array(0,0,0));
+$pdf->Cell(0, 10, 'Paragraph 1.3', 0, 1, 'L');
+
+$pdf->AddPage();
+// add a named destination so you can open this document at this page using the link: "example_015.pdf#chapter2"
+$pdf->setDestination('chapter2', 0, '');
+// add a bookmark that points to a named destination
+$pdf->Bookmark('Chapter 2', 0, 0, '', 'BI', array(128,0,0), -1, '#chapter2');
+$pdf->Cell(0, 10, 'Chapter 2', 0, 1, 'L');
+$pdf->SetFont('times', 'I', 14);
+$pdf->Write(0, 'Once saved, you can open this document at this page using the link: "example_015.pdf#chapter2".');
+
+$pdf->AddPage();
+$pdf->setDestination('chapter3', 0, '');
+$pdf->SetFont('times', 'B', 20);
+$pdf->Bookmark('Chapter 3', 0, 0, '', 'B', array(0,64,128));
+$pdf->Cell(0, 10, 'Chapter 3', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->setDestination('chapter4', 0, '');
+$pdf->SetFont('times', 'B', 20);
+$pdf->Bookmark('Chapter 4', 0, 0, '', 'B', array(0,64,128));
+$pdf->Cell(0, 10, 'Chapter 4', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Bookmark('Chapter 5', 0, 0, '', 'B', array(0,128,0));
+$pdf->Cell(0, 10, 'Chapter 5', 0, 1, 'L');
+$txt = 'Example of File Attachment.
+Double click on the icon to open the attached file.';
+$pdf->SetFont('helvetica', '', 10);
+$pdf->Write(0, $txt, '', 0, 'L', true, 0, false, false, 0);
+
+// attach an external file TXT file
+$pdf->Annotation(20, 50, 5, 5, 'TXT file', array('Subtype'=>'FileAttachment', 'Name' => 'PushPin', 'FS' => 'data/utf8test.txt'));
+
+// attach an external file
+$pdf->Annotation(50, 50, 5, 5, 'PDF file', array('Subtype'=>'FileAttachment', 'Name' => 'PushPin', 'FS' => 'example_012.pdf'));
+
+// add a bookmark that points to an embedded file
+// NOTE: prefix the file name with the * character for generic file and with % character for PDF file
+$pdf->Bookmark('TXT file', 0, 0, '', 'B', array(128,0,255), -1, '*utf8test.txt');
+
+// add a bookmark that points to an embedded file
+// NOTE: prefix the file name with the * character for generic file and with % character for PDF file
+$pdf->Bookmark('PDF file', 0, 0, '', 'B', array(128,0,255), -1, '%example_012.pdf');
+
+// add a bookmark that points to an external URL
+$pdf->Bookmark('External URL', 0, 0, '', 'B', array(0,0,255), -1, 'http://www.tcpdf.org');
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_015.pdf', 'D');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_016.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_016.php
new file mode 100644
index 00000000..34284f20
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_016.php
@@ -0,0 +1,134 @@
+<?php
+//============================================================+
+// File name   : example_016.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 016 for TCPDF class
+//               Document Encryption / Security
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Document Encryption / Security
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+
+// *** Set PDF protection (encryption) *********************
+
+/*
+  The permission array is composed of values taken from the following ones (specify the ones you want to block):
+	- print : Print the document;
+	- modify : Modify the contents of the document by operations other than those controlled by 'fill-forms', 'extract' and 'assemble';
+	- copy : Copy or otherwise extract text and graphics from the document;
+	- annot-forms : Add or modify text annotations, fill in interactive form fields, and, if 'modify' is also set, create or modify interactive form fields (including signature fields);
+	- fill-forms : Fill in existing interactive form fields (including signature fields), even if 'annot-forms' is not specified;
+	- extract : Extract text and graphics (in support of accessibility to users with disabilities or for other purposes);
+	- assemble : Assemble the document (insert, rotate, or delete pages and create bookmarks or thumbnail images), even if 'modify' is not set;
+	- print-high : Print the document to a representation from which a faithful digital copy of the PDF content could be generated. When this is not set, printing is limited to a low-level representation of the appearance, possibly of degraded quality.
+	- owner : (inverted logic - only for public-key) when set permits change of encryption and enables all other permissions.
+
+ If you don't set any password, the document will open as usual.
+ If you set a user password, the PDF viewer will ask for it before displaying the document.
+ The master (owner) password, if different from the user one, can be used to get full document access.
+
+ Possible encryption modes are:
+ 	0 = RSA 40 bit
+ 	1 = RSA 128 bit
+ 	2 = AES 128 bit
+ 	3 = AES 256 bit
+
+ NOTES:
+ - To create self-signed signature: openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt
+ - To export crt to p12: openssl pkcs12 -export -in tcpdf.crt -out tcpdf.p12
+ - To convert pfx certificate to pem: openssl pkcs12 -in tcpdf.pfx -out tcpdf.crt -nodes
+
+*/
+
+$pdf->SetProtection(array('print', 'copy'), '', null, 0, null);
+
+// Example with public-key
+// To open the document you need to install the private key (tcpdf.p12) on the Acrobat Reader. The password is: 1234
+//$pdf->SetProtection($permissions=array('print', 'copy'), $user_pass='', $owner_pass=null, $mode=1, $pubkeys=array(array('c' => 'file://../config/cert/tcpdf.crt', 'p' => array('print'))));
+
+// *********************************************************
+
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 016');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 016', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array('helvetica', '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array('helvetica', '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('times', '', 16);
+
+// add a page
+$pdf->AddPage();
+
+// set some text to print
+$txt = <<<EOD
+Encryption Example
+
+Consult the source code documentation for the SetProtection() method.
+EOD;
+
+// print a block of text using Write()
+$pdf->Write(0, $txt, '', 0, 'L', true, 0, false, false, 0);
+
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_016.pdf', 'D');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_017.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_017.php
new file mode 100644
index 00000000..1324091c
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_017.php
@@ -0,0 +1,117 @@
+<?php
+//============================================================+
+// File name   : example_017.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 017 for TCPDF class
+//               Two independent columns with MultiCell
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Two independent columns with MultiCell
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 017');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 017', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 20);
+
+// add a page
+$pdf->AddPage();
+
+$pdf->Write(0, 'Example of independent Multicell() columns', '', 0, 'L', true, 0, false, false, 0);
+
+$pdf->Ln(5);
+
+$pdf->SetFont('times', '', 12);
+
+// create columns content
+// create columns content
+$left_column = '[LEFT COLUMN] left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column left column'."\n";
+
+$right_column = '[RIGHT COLUMN] right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column right column'."\n";
+
+// MultiCell($w, $h, $txt, $border=0, $align='J', $fill=0, $ln=1, $x='', $y='', $reseth=true, $stretch=0, $ishtml=false, $autopadding=true, $maxh=0)
+
+// set color for background
+$pdf->SetFillColor(255, 255, 200);
+
+// set color for text
+$pdf->SetTextColor(0, 63, 127);
+
+// write the first column
+$pdf->MultiCell(80, 0, $left_column, 1, 'J', 1, 0, '', '', true, 0, false, true, 0);
+
+// set color for background
+$pdf->SetFillColor(215, 235, 255);
+
+// set color for text
+$pdf->SetTextColor(127, 31, 0);
+
+// write the second column
+$pdf->MultiCell(80, 0, $right_column, 1, 'J', 1, 1, '', '', true, 0, false, true, 0);
+
+// reset pointer to the last page
+$pdf->lastPage();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_017.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_018.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_018.php
new file mode 100644
index 00000000..a97a44ac
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_018.php
@@ -0,0 +1,128 @@
+<?php
+//============================================================+
+// File name   : example_018.php
+// Begin       : 2008-03-06
+// Last Update : 2013-05-14
+//
+// Description : Example 018 for TCPDF class
+//               RTL document with Persian language
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: RTL document with Persian language
+ * @author Nicola Asuni
+ * @since 2008-03-06
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 018');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 018', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language dependent data:
+$lg = Array();
+$lg['a_meta_charset'] = 'UTF-8';
+$lg['a_meta_dir'] = 'rtl';
+$lg['a_meta_language'] = 'fa';
+$lg['w_page'] = 'page';
+
+// set some language-dependent strings (optional)
+$pdf->setLanguageArray($lg);
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('dejavusans', '', 12);
+
+// add a page
+$pdf->AddPage();
+
+// Persian and English content
+$htmlpersian = '<span color="#660000">Persian example:</span><br />سلام بالاخره مشکل PDF فارسی به طور کامل حل شد. اینم یک نمونش.<br />مشکل حرف \"ژ\" در بعضی کلمات مانند کلمه ویژه نیز بر طرف شد.<br />نگارش حروف لام و الف پشت سر هم نیز تصحیح شد.<br />با تشکر از  "Asuni Nicola" و محمد علی گل کار برای پشتیبانی زبان فارسی.';
+$pdf->WriteHTML($htmlpersian, true, 0, true, 0);
+
+// set LTR direction for english translation
+$pdf->setRTL(false);
+
+$pdf->SetFontSize(10);
+
+// print newline
+$pdf->Ln();
+
+// Persian and English content
+$htmlpersiantranslation = '<span color="#0000ff">Hi, At last Problem of Persian PDF Solved completely. This is a example for it.<br />Problem of "jeh" letter in some word like "ویژه" (=special) fix too.<br />The joining of laa and alf letter fix now.<br />Special thanks to "Nicola Asuni" and "Mohamad Ali Golkar" for Persian support.</span>';
+$pdf->WriteHTML($htmlpersiantranslation, true, 0, true, 0);
+
+// Restore RTL direction
+$pdf->setRTL(true);
+
+// set font
+$pdf->SetFont('aefurat', '', 18);
+
+// print newline
+$pdf->Ln();
+
+// Arabic and English content
+$pdf->Cell(0, 12, 'بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ',0,1,'C');
+$htmlcontent = 'تمَّ بِحمد الله حلّ مشكلة الكتابة باللغة العربية في ملفات الـ<span color="#FF0000">PDF</span> مع دعم الكتابة <span color="#0000FF">من اليمين إلى اليسار</span> و<span color="#009900">الحركَات</span> .<br />تم الحل بواسطة <span color="#993399">صالح المطرفي و Asuni Nicola</span>  . ';
+$pdf->WriteHTML($htmlcontent, true, 0, true, 0);
+
+// set LTR direction for english translation
+$pdf->setRTL(false);
+
+// print newline
+$pdf->Ln();
+
+$pdf->SetFont('aealarabiya', '', 18);
+
+// Arabic and English content
+$htmlcontent2 = '<span color="#0000ff">This is Arabic "العربية" Example With TCPDF.</span>';
+$pdf->WriteHTML($htmlcontent2, true, 0, true, 0);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_018.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_019.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_019.php
new file mode 100644
index 00000000..a1d5f08a
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_019.php
@@ -0,0 +1,98 @@
+<?php
+//============================================================+
+// File name   : example_019.php
+// Begin       : 2008-03-07
+// Last Update : 2013-05-14
+//
+// Description : Example 019 for TCPDF class
+//               Non unicode with alternative config file
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Non unicode with alternative config file
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, false, 'ISO-8859-1', false);
+
+// Set document information dictionary in unicode mode
+$pdf->SetDocInfoUnicode(true);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni [€]');
+$pdf->SetTitle('TCPDF Example 019');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 019', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language dependent data:
+$lg = Array();
+$lg['a_meta_charset'] = 'ISO-8859-1';
+$lg['a_meta_dir'] = 'ltr';
+$lg['a_meta_language'] = 'en';
+$lg['w_page'] = 'page';
+
+// set some language-dependent strings (optional)
+$pdf->setLanguageArray($lg);
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 12);
+
+// add a page
+$pdf->AddPage();
+
+// set color for background
+$pdf->SetFillColor(200, 255, 200);
+
+$txt = 'An alternative configuration file is used on this example.
+Check the definition of the K_TCPDF_EXTERNAL_CONFIG constant on the source code.';
+
+// print some text
+$pdf->MultiCell(0, 0, $txt."\n", 1, 'J', 1, 1, '', '', true, 0, false, true, 0);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_019.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_020.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_020.php
new file mode 100644
index 00000000..6204f746
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_020.php
@@ -0,0 +1,146 @@
+<?php
+//============================================================+
+// File name   : example_020.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 020 for TCPDF class
+//               Two columns composed by MultiCell of different
+//               heights
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+* Creates an example PDF TEST document using TCPDF
+* @package com.tecnick.tcpdf
+* @abstract TCPDF - Example: Two columns composed by MultiCell of different heights
+* @author Nicola Asuni
+* @since 2008-03-04
+*/
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// extend TCPF with custom functions
+class MYPDF extends TCPDF {
+
+	public function MultiRow($left, $right) {
+		// MultiCell($w, $h, $txt, $border=0, $align='J', $fill=0, $ln=1, $x='', $y='', $reseth=true, $stretch=0)
+
+		$page_start = $this->getPage();
+		$y_start = $this->GetY();
+
+		// write the left cell
+		$this->MultiCell(40, 0, $left, 1, 'R', 1, 2, '', '', true, 0);
+
+		$page_end_1 = $this->getPage();
+		$y_end_1 = $this->GetY();
+
+		$this->setPage($page_start);
+
+		// write the right cell
+		$this->MultiCell(0, 0, $right, 1, 'J', 0, 1, $this->GetX() ,$y_start, true, 0);
+
+		$page_end_2 = $this->getPage();
+		$y_end_2 = $this->GetY();
+
+		// set the new row position by case
+		if (max($page_end_1,$page_end_2) == $page_start) {
+			$ynew = max($y_end_1, $y_end_2);
+		} elseif ($page_end_1 == $page_end_2) {
+			$ynew = max($y_end_1, $y_end_2);
+		} elseif ($page_end_1 > $page_end_2) {
+			$ynew = $y_end_1;
+		} else {
+			$ynew = $y_end_2;
+		}
+
+		$this->setPage(max($page_end_1,$page_end_2));
+		$this->SetXY($this->GetX(),$ynew);
+	}
+
+}
+
+// create new PDF document
+$pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 020');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 020', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 20);
+// add a page
+$pdf->AddPage();
+
+$pdf->Write(0, 'Example of text layout using Multicell()', '', 0, 'L', true, 0, false, false, 0);
+
+$pdf->Ln(5);
+
+$pdf->SetFont('times', '', 9);
+
+//$pdf->SetCellPadding(0);
+//$pdf->SetLineWidth(2);
+
+// set color for background
+$pdf->SetFillColor(255, 255, 200);
+
+$text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue. Sed vel velit erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras eget velit nulla, eu sagittis elit. Nunc ac arcu est, in lobortis tellus. Praesent condimentum rhoncus sodales. In hac habitasse platea dictumst. Proin porta eros pharetra enim tincidunt dignissim nec vel dolor. Cras sapien elit, ornare ac dignissim eu, ultricies ac eros. Maecenas augue magna, ultrices a congue in, mollis eu nulla. Nunc venenatis massa at est eleifend faucibus. Vivamus sed risus lectus, nec interdum nunc.
+
+Fusce et felis vitae diam lobortis sollicitudin. Aenean tincidunt accumsan nisi, id vehicula quam laoreet elementum. Phasellus egestas interdum erat, et viverra ipsum ultricies ac. Praesent sagittis augue at augue volutpat eleifend. Cras nec orci neque. Mauris bibendum posuere blandit. Donec feugiat mollis dui sit amet pellentesque. Sed a enim justo. Donec tincidunt, nisl eget elementum aliquam, odio ipsum ultrices quam, eu porttitor ligula urna at lorem. Donec varius, eros et convallis laoreet, ligula tellus consequat felis, ut ornare metus tellus sodales velit. Duis sed diam ante. Ut rutrum malesuada massa, vitae consectetur ipsum rhoncus sed. Suspendisse potenti. Pellentesque a congue massa.';
+
+// print some rows just as example
+for ($i = 0; $i < 10; ++$i) {
+	$pdf->MultiRow('Row '.($i+1), $text."\n");
+}
+
+// reset pointer to the last page
+$pdf->lastPage();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_020.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_021.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_021.php
new file mode 100644
index 00000000..65e39fbf
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_021.php
@@ -0,0 +1,91 @@
+<?php
+//============================================================+
+// File name   : example_021.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 021 for TCPDF class
+//               WriteHTML text flow
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: WriteHTML text flow.
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 021');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 021', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 9);
+
+// add a page
+$pdf->AddPage();
+
+// create some HTML content
+$html = '<h1>Example of HTML text flow</h1>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. <em>Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?</em> <em>Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</em><br /><br /><b>A</b> + <b>B</b> = <b>C</b> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>B</i> = <i>A</i> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>A</i> = <i>B</i> -&gt; &nbsp;&nbsp; <b>A</b> + <b>B</b> = <b>C</b> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>B</i> = <i>A</i> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>A</i> = <i>B</i> -&gt; &nbsp;&nbsp; <b>A</b> + <b>B</b> = <b>C</b> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>B</i> = <i>A</i> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>A</i> = <i>B</i> -&gt; &nbsp;&nbsp; <b>A</b> + <b>B</b> = <b>C</b> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>B</i> = <i>A</i> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>A</i> = <i>B</i> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <b>A</b> + <b>B</b> = <b>C</b> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>B</i> = <i>A</i> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>A</i> = <i>B</i> -&gt; &nbsp;&nbsp; <b>A</b> + <b>B</b> = <b>C</b> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>B</i> = <i>A</i> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>A</i> = <i>B</i> -&gt; &nbsp;&nbsp; <b>A</b> + <b>B</b> = <b>C</b> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>B</i> = <i>A</i> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>A</i> = <i>B</i> -&gt; &nbsp;&nbsp; <b>A</b> + <b>B</b> = <b>C</b> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>B</i> = <i>A</i> &nbsp;&nbsp; -&gt; &nbsp;&nbsp; <i>C</i> - <i>A</i> = <i>B</i><br /><br /><b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u> <b>Bold</b><i>Italic</i><u>Underlined</u>';
+
+// output the HTML content
+$pdf->writeHTML($html, true, 0, true, 0);
+
+// reset pointer to the last page
+$pdf->lastPage();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_021.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_022.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_022.php
new file mode 100644
index 00000000..ca35d68a
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_022.php
@@ -0,0 +1,146 @@
+<?php
+//============================================================+
+// File name   : example_022.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 022 for TCPDF class
+//               CMYK colors
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: CMYK colors.
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 022');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 022', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// check also the following methods:
+// SetDrawColorArray()
+// SetFillColorArray()
+// SetTextColorArray()
+
+// set font
+$pdf->SetFont('helvetica', 'B', 18);
+
+// add a page
+$pdf->AddPage();
+
+$pdf->Write(0, 'Example of CMYK, RGB and Grayscale colours', '', 0, 'L', true, 0, false, false, 0);
+
+// define style for border
+$border_style = array('all' => array('width' => 2, 'cap' => 'square', 'join' => 'miter', 'dash' => 0, 'phase' => 0));
+
+// --- CMYK ------------------------------------------------
+
+$pdf->SetDrawColor(50, 0, 0, 0);
+$pdf->SetFillColor(100, 0, 0, 0);
+$pdf->SetTextColor(100, 0, 0, 0);
+$pdf->Rect(30, 60, 30, 30, 'DF', $border_style);
+$pdf->Text(30, 92, 'Cyan');
+
+$pdf->SetDrawColor(0, 50, 0, 0);
+$pdf->SetFillColor(0, 100, 0, 0);
+$pdf->SetTextColor(0, 100, 0, 0);
+$pdf->Rect(70, 60, 30, 30, 'DF', $border_style);
+$pdf->Text(70, 92, 'Magenta');
+
+$pdf->SetDrawColor(0, 0, 50, 0);
+$pdf->SetFillColor(0, 0, 100, 0);
+$pdf->SetTextColor(0, 0, 100, 0);
+$pdf->Rect(110, 60, 30, 30, 'DF', $border_style);
+$pdf->Text(110, 92, 'Yellow');
+
+$pdf->SetDrawColor(0, 0, 0, 50);
+$pdf->SetFillColor(0, 0, 0, 100);
+$pdf->SetTextColor(0, 0, 0, 100);
+$pdf->Rect(150, 60, 30, 30, 'DF', $border_style);
+$pdf->Text(150, 92, 'Black');
+
+// --- RGB -------------------------------------------------
+
+$pdf->SetDrawColor(255, 127, 127);
+$pdf->SetFillColor(255, 0, 0);
+$pdf->SetTextColor(255, 0, 0);
+$pdf->Rect(30, 110, 30, 30, 'DF', $border_style);
+$pdf->Text(30, 142, 'Red');
+
+$pdf->SetDrawColor(127, 255, 127);
+$pdf->SetFillColor(0, 255, 0);
+$pdf->SetTextColor(0, 255, 0);
+$pdf->Rect(70, 110, 30, 30, 'DF', $border_style);
+$pdf->Text(70, 142, 'Green');
+
+$pdf->SetDrawColor(127, 127, 255);
+$pdf->SetFillColor(0, 0, 255);
+$pdf->SetTextColor(0, 0, 255);
+$pdf->Rect(110, 110, 30, 30, 'DF', $border_style);
+$pdf->Text(110, 142, 'Blue');
+
+// --- GRAY ------------------------------------------------
+
+$pdf->SetDrawColor(191);
+$pdf->SetFillColor(127);
+$pdf->SetTextColor(127);
+$pdf->Rect(30, 160, 30, 30, 'DF', $border_style);
+$pdf->Text(30, 192, 'Gray');
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_022.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_023.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_023.php
new file mode 100644
index 00000000..dbb8b983
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_023.php
@@ -0,0 +1,113 @@
+<?php
+//============================================================+
+// File name   : example_023.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 023 for TCPDF class
+//               Page Groups
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Page Groups.
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 023');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 023', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('times', 'BI', 14);
+
+// Start First Page Group
+$pdf->startPageGroup();
+
+// add a page
+$pdf->AddPage();
+
+// set some text to print
+$txt = <<<EOD
+Example of page groups.
+Check the page numbers on the page footer.
+
+This is the first page of group 1.
+EOD;
+
+// print a block of text using Write()
+$pdf->Write(0, $txt, '', 0, 'L', true, 0, false, false, 0);
+
+// add second page
+$pdf->AddPage();
+$pdf->Cell(0, 10, 'This is the second page of group 1', 0, 1, 'L');
+
+// Start Second Page Group
+$pdf->startPageGroup();
+
+// add some pages
+$pdf->AddPage();
+$pdf->Cell(0, 10, 'This is the first page of group 2', 0, 1, 'L');
+$pdf->AddPage();
+$pdf->Cell(0, 10, 'This is the second page of group 2', 0, 1, 'L');
+$pdf->AddPage();
+$pdf->Cell(0, 10, 'This is the third page of group 2', 0, 1, 'L');
+$pdf->AddPage();
+$pdf->Cell(0, 10, 'This is the fourth page of group 2', 0, 1, 'L');
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_023.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_024.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_024.php
new file mode 100644
index 00000000..b60d12dc
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_024.php
@@ -0,0 +1,140 @@
+<?php
+//============================================================+
+// File name   : example_024.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 024 for TCPDF class
+//               Object Visibility and Layers
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Object Visibility and Layers
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 024');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 024', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('times', '', 18);
+
+// add a page
+$pdf->AddPage();
+
+/*
+ * setVisibility() allows to restrict the rendering of some
+ * elements to screen or printout. This can be useful, for
+ * instance, to put a background image or color that will
+ * show on screen but won't print.
+ */
+
+$txt = 'You can limit the visibility of PDF objects to screen or printer by using the setVisibility() method.
+Check the print preview of this document to display the alternative text.';
+
+$pdf->Write(0, $txt, '', 0, '', true, 0, false, false, 0);
+
+// change font size
+$pdf->SetFontSize(40);
+
+// change text color
+$pdf->SetTextColor(0,63,127);
+
+// set visibility only for screen
+$pdf->setVisibility('screen');
+
+// write something only for screen
+$pdf->Write(0, '[This line is for display]', '', 0, 'C', true, 0, false, false, 0);
+
+// set visibility only for print
+$pdf->setVisibility('print');
+
+// change text color
+$pdf->SetTextColor(127,0,0);
+
+// write something only for print
+$pdf->Write(0, '[This line is for printout]', '', 0, 'C', true, 0, false, false, 0);
+
+// restore visibility
+$pdf->setVisibility('all');
+
+// ---------------------------------------------------------
+
+// LAYERS
+
+// start a new layer
+$pdf->startLayer('layer1', true, true);
+
+// change font size
+$pdf->SetFontSize(18);
+
+// change text color
+$pdf->SetTextColor(0,127,0);
+
+$txt = 'Using the startLayer() method you can group PDF objects into layers.
+This text is on "layer1".';
+
+// write something
+$pdf->Write(0, $txt, '', 0, 'L', true, 0, false, false, 0);
+
+// close the current layer
+$pdf->endLayer();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_024.pdf', 'D');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_025.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_025.php
new file mode 100644
index 00000000..1260d620
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_025.php
@@ -0,0 +1,118 @@
+<?php
+//============================================================+
+// File name   : example_025.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 025 for TCPDF class
+//               Object Transparency
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Object Transparency
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 025');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 025', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 12);
+
+// add a page
+$pdf->AddPage();
+
+$txt = 'You can set the transparency of PDF objects using the setAlpha() method.';
+$pdf->Write(0, $txt, '', 0, '', true, 0, false, false, 0);
+
+/*
+ * setAlpha() gives transparency support. You can set the
+ * alpha channel from 0 (fully transparent) to 1 (fully
+ * opaque). It applies to all elements (text, drawings,
+ * images).
+ */
+
+$pdf->SetLineWidth(2);
+
+// draw opaque red square
+$pdf->SetFillColor(255, 0, 0);
+$pdf->SetDrawColor(127, 0, 0);
+$pdf->Rect(30, 40, 60, 60, 'DF');
+
+// set alpha to semi-transparency
+$pdf->SetAlpha(0.5);
+
+// draw green square
+$pdf->SetFillColor(0, 255, 0);
+$pdf->SetDrawColor(0, 127, 0);
+$pdf->Rect(50, 60, 60, 60, 'DF');
+
+// draw blue square
+$pdf->SetFillColor(0, 0, 255);
+$pdf->SetDrawColor(0, 0, 127);
+$pdf->Rect(70, 80, 60, 60, 'DF');
+
+// draw jpeg image
+$pdf->Image('images/image_demo.jpg', 90, 100, 60, 60, '', 'http://www.tcpdf.org', '', true, 72);
+
+// restore full opacity
+$pdf->SetAlpha(1);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_025.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_026.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_026.php
new file mode 100644
index 00000000..5646e915
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_026.php
@@ -0,0 +1,145 @@
+<?php
+//============================================================+
+// File name   : example_026.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 026 for TCPDF class
+//               Text Rendering Modes and Text Clipping
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Text Rendering Modes and Text Clipping
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 026');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 026', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 22);
+
+// add a page
+$pdf->AddPage();
+
+// set color for text stroke
+$pdf->SetDrawColor(255,0,0);
+
+
+$pdf->setTextRenderingMode($stroke=0, $fill=true, $clip=false);
+$pdf->Write(0, 'Fill text', '', 0, '', true, 0, false, false, 0);
+
+$pdf->setTextRenderingMode($stroke=0.2, $fill=false, $clip=false);
+$pdf->Write(0, 'Stroke text', '', 0, '', true, 0, false, false, 0);
+
+$pdf->setTextRenderingMode($stroke=0.2, $fill=true, $clip=false);
+$pdf->Write(0, 'Fill, then stroke text', '', 0, '', true, 0, false, false, 0);
+
+$pdf->setTextRenderingMode($stroke=0, $fill=false, $clip=false);
+$pdf->Write(0, 'Neither fill nor stroke text (invisible)', '', 0, '', true, 0, false, false, 0);
+
+
+// * * * CLIPPING MODES  * * * * * * * * * * * * * * * * * *
+
+$pdf->StartTransform();
+$pdf->setTextRenderingMode($stroke=0, $fill=true, $clip=true);
+$pdf->Write(0, 'Fill text and add to path for clipping', '', 0, '', true, 0, false, false, 0);
+$pdf->Image('images/image_demo.jpg', 15, 65, 170, 10, '', '', '', true, 72);
+$pdf->StopTransform();
+
+$pdf->StartTransform();
+$pdf->setTextRenderingMode($stroke=0.3, $fill=false, $clip=true);
+$pdf->Write(0, 'Stroke text and add to path for clipping', '', 0, '', true, 0, false, false, 0);
+$pdf->Image('images/image_demo.jpg', 15, 75, 170, 10, '', '', '', true, 72);
+$pdf->StopTransform();
+
+$pdf->StartTransform();
+$pdf->setTextRenderingMode($stroke=0.3, $fill=true, $clip=true);
+$pdf->Write(0, 'Fill, then stroke text and add to path for clipping', '', 0, '', true, 0, false, false, 0);
+$pdf->Image('images/image_demo.jpg', 15, 85, 170, 10, '', '', '', true, 72);
+$pdf->StopTransform();
+
+$pdf->StartTransform();
+$pdf->setTextRenderingMode($stroke=0, $fill=false, $clip=true);
+$pdf->Write(0, 'Add text to path for clipping', '', 0, '', true, 0, false, false, 0);
+$pdf->Image('images/image_demo.jpg', 15, 95, 170, 10, '', '', '', true, 72);
+$pdf->StopTransform();
+
+// reset text rendering mode
+$pdf->setTextRenderingMode($stroke=0, $fill=true, $clip=false);
+
+// * * * HTML MODE * * * * * * * * * * * * * * * * * * * * *
+
+// The following attributes were added to HTML:
+// stroke : stroke width
+// strokecolor : stroke color
+// fill : true (default) to fill the font, false otherwise
+
+
+// create some HTML content with text rendering modes
+$html  = '<span stroke="0" fill="true">HTML Fill text</span><br />';
+$html .= '<span stroke="0.2" fill="false">HTML Stroke text</span><br />';
+$html .= '<span stroke="0.2" fill="true" strokecolor="#FF0000" color="#FFFF00">HTML Fill, then stroke text</span><br />';
+$html .= '<span stroke="0" fill="false">HTML Neither fill nor stroke text (invisible)</span><br />';
+
+// output the HTML content
+$pdf->writeHTML($html, true, 0, true, 0);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_026.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_027.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_027.php
new file mode 100644
index 00000000..c05da5a2
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_027.php
@@ -0,0 +1,418 @@
+<?php
+//============================================================+
+// File name   : example_027.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 027 for TCPDF class
+//               1D Barcodes
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: 1D Barcodes.
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 027');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 027', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set a barcode on the page footer
+$pdf->setBarcode(date('Y-m-d H:i:s'));
+
+// set font
+$pdf->SetFont('helvetica', '', 11);
+
+// add a page
+$pdf->AddPage();
+
+// print a message
+$txt = "You can also export 1D barcodes in other formats (PNG, SVG, HTML). Check the examples inside the barcodes directory.\n";
+$pdf->MultiCell(70, 50, $txt, 0, 'J', false, 1, 125, 30, true, 0, false, true, 0, 'T', false);
+$pdf->SetY(30);
+
+// -----------------------------------------------------------------------------
+
+$pdf->SetFont('helvetica', '', 10);
+
+// define barcode style
+$style = array(
+	'position' => '',
+	'align' => 'C',
+	'stretch' => false,
+	'fitwidth' => true,
+	'cellfitalign' => '',
+	'border' => true,
+	'hpadding' => 'auto',
+	'vpadding' => 'auto',
+	'fgcolor' => array(0,0,0),
+	'bgcolor' => false, //array(255,255,255),
+	'text' => true,
+	'font' => 'helvetica',
+	'fontsize' => 8,
+	'stretchtext' => 4
+);
+
+// PRINT VARIOUS 1D BARCODES
+
+// CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.
+$pdf->Cell(0, 0, 'CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9', 0, 1);
+$pdf->write1DBarcode('CODE 39', 'C39', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// CODE 39 + CHECKSUM
+$pdf->Cell(0, 0, 'CODE 39 + CHECKSUM', 0, 1);
+$pdf->write1DBarcode('CODE 39 +', 'C39+', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// CODE 39 EXTENDED
+$pdf->Cell(0, 0, 'CODE 39 EXTENDED', 0, 1);
+$pdf->write1DBarcode('CODE 39 E', 'C39E', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// CODE 39 EXTENDED + CHECKSUM
+$pdf->Cell(0, 0, 'CODE 39 EXTENDED + CHECKSUM', 0, 1);
+$pdf->write1DBarcode('CODE 39 E+', 'C39E+', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// CODE 93 - USS-93
+$pdf->Cell(0, 0, 'CODE 93 - USS-93', 0, 1);
+$pdf->write1DBarcode('TEST93', 'C93', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// Standard 2 of 5
+$pdf->Cell(0, 0, 'Standard 2 of 5', 0, 1);
+$pdf->write1DBarcode('1234567', 'S25', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// Standard 2 of 5 + CHECKSUM
+$pdf->Cell(0, 0, 'Standard 2 of 5 + CHECKSUM', 0, 1);
+$pdf->write1DBarcode('1234567', 'S25+', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// Interleaved 2 of 5
+$pdf->Cell(0, 0, 'Interleaved 2 of 5', 0, 1);
+$pdf->write1DBarcode('1234567', 'I25', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// Interleaved 2 of 5 + CHECKSUM
+$pdf->Cell(0, 0, 'Interleaved 2 of 5 + CHECKSUM', 0, 1);
+$pdf->write1DBarcode('1234567', 'I25+', '', '', '', 18, 0.4, $style, 'N');
+
+
+// add a page ----------
+$pdf->AddPage();
+
+// CODE 128 AUTO
+$pdf->Cell(0, 0, 'CODE 128 AUTO', 0, 1);
+$pdf->write1DBarcode('CODE 128 AUTO', 'C128', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// CODE 128 A
+$pdf->Cell(0, 0, 'CODE 128 A', 0, 1);
+$pdf->write1DBarcode('CODE 128 A', 'C128A', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// CODE 128 B
+$pdf->Cell(0, 0, 'CODE 128 B', 0, 1);
+$pdf->write1DBarcode('CODE 128 B', 'C128B', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// CODE 128 C
+$pdf->Cell(0, 0, 'CODE 128 C', 0, 1);
+$pdf->write1DBarcode('0123456789', 'C128C', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// EAN 8
+$pdf->Cell(0, 0, 'EAN 8', 0, 1);
+$pdf->write1DBarcode('1234567', 'EAN8', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// EAN 13
+$pdf->Cell(0, 0, 'EAN 13', 0, 1);
+$pdf->write1DBarcode('1234567890128', 'EAN13', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// UPC-A
+$pdf->Cell(0, 0, 'UPC-A', 0, 1);
+$pdf->write1DBarcode('12345678901', 'UPCA', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// UPC-E
+$pdf->Cell(0, 0, 'UPC-E', 0, 1);
+$pdf->write1DBarcode('04210000526', 'UPCE', '', '', '', 18, 0.4, $style, 'N');
+
+// add a page ----------
+$pdf->AddPage();
+
+// 5-Digits UPC-Based Extention
+$pdf->Cell(0, 0, '5-Digits UPC-Based Extention', 0, 1);
+$pdf->write1DBarcode('51234', 'EAN5', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// 2-Digits UPC-Based Extention
+$pdf->Cell(0, 0, '2-Digits UPC-Based Extention', 0, 1);
+$pdf->write1DBarcode('34', 'EAN2', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// MSI
+$pdf->Cell(0, 0, 'MSI', 0, 1);
+$pdf->write1DBarcode('80523', 'MSI', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// MSI + CHECKSUM (module 11)
+$pdf->Cell(0, 0, 'MSI + CHECKSUM (module 11)', 0, 1);
+$pdf->write1DBarcode('80523', 'MSI+', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// CODABAR
+$pdf->Cell(0, 0, 'CODABAR', 0, 1);
+$pdf->write1DBarcode('123456789', 'CODABAR', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// CODE 11
+$pdf->Cell(0, 0, 'CODE 11', 0, 1);
+$pdf->write1DBarcode('123-456-789', 'CODE11', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// PHARMACODE
+$pdf->Cell(0, 0, 'PHARMACODE', 0, 1);
+$pdf->write1DBarcode('789', 'PHARMA', '', '', '', 18, 0.4, $style, 'N');
+
+$pdf->Ln();
+
+// PHARMACODE TWO-TRACKS
+$pdf->Cell(0, 0, 'PHARMACODE TWO-TRACKS', 0, 1);
+$pdf->write1DBarcode('105', 'PHARMA2T', '', '', '', 18, 2, $style, 'N');
+
+// add a page ----------
+$pdf->AddPage();
+
+// IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200
+$pdf->Cell(0, 0, 'IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200', 0, 1);
+$pdf->write1DBarcode('01234567094987654321-01234567891', 'IMB', '', '', '', 15, 0.6, $style, 'N');
+
+$pdf->Ln();
+
+// POSTNET
+$pdf->Cell(0, 0, 'POSTNET', 0, 1);
+$pdf->write1DBarcode('98000', 'POSTNET', '', '', '', 15, 0.6, $style, 'N');
+
+$pdf->Ln();
+
+// PLANET
+$pdf->Cell(0, 0, 'PLANET', 0, 1);
+$pdf->write1DBarcode('98000', 'PLANET', '', '', '', 15, 0.6, $style, 'N');
+
+$pdf->Ln();
+
+// RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)
+$pdf->Cell(0, 0, 'RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)', 0, 1);
+$pdf->write1DBarcode('SN34RD1A', 'RMS4CC', '', '', '', 15, 0.6, $style, 'N');
+
+$pdf->Ln();
+
+// KIX (Klant index - Customer index)
+$pdf->Cell(0, 0, 'KIX (Klant index - Customer index)', 0, 1);
+$pdf->write1DBarcode('SN34RDX1A', 'KIX', '', '', '', 15, 0.6, $style, 'N');
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// TEST BARCODE ALIGNMENTS
+
+// add a page
+$pdf->AddPage();
+
+// set a background color
+$style['bgcolor'] = array(255,255,240);
+$style['fgcolor'] = array(127,0,0);
+
+// Left position
+$style['position'] = 'L';
+$pdf->write1DBarcode('LEFT', 'C128A', '', '', '', 15, 0.4, $style, 'N');
+
+$pdf->Ln(2);
+
+// Center position
+$style['position'] = 'C';
+$pdf->write1DBarcode('CENTER', 'C128A', '', '', '', 15, 0.4, $style, 'N');
+
+$pdf->Ln(2);
+
+// Right position
+$style['position'] = 'R';
+$pdf->write1DBarcode('RIGHT', 'C128A', '', '', '', 15, 0.4, $style, 'N');
+
+$pdf->Ln(2);
+// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+
+$style['fgcolor'] = array(0,127,0);
+$style['position'] = '';
+$style['stretch'] = false; // disable stretch
+$style['fitwidth'] = false; // disable fitwidth
+
+// Left alignment
+$style['align'] = 'L';
+$pdf->write1DBarcode('LEFT', 'C128A', '', '', '', 15, 0.4, $style, 'N');
+
+$pdf->Ln(2);
+
+// Center alignment
+$style['align'] = 'C';
+$pdf->write1DBarcode('CENTER', 'C128A', '', '', '', 15, 0.4, $style, 'N');
+
+$pdf->Ln(2);
+
+// Right alignment
+$style['align'] = 'R';
+$pdf->write1DBarcode('RIGHT', 'C128A', '', '', '', 15, 0.4, $style, 'N');
+
+$pdf->Ln(2);
+// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+
+$style['fgcolor'] = array(0,64,127);
+$style['position'] = '';
+$style['stretch'] = false; // disable stretch
+$style['fitwidth'] = true; // disable fitwidth
+
+// Left alignment
+$style['cellfitalign'] = 'L';
+$pdf->write1DBarcode('LEFT', 'C128A', 105, '', 90, 15, 0.4, $style, 'N');
+
+$pdf->Ln(2);
+
+// Center alignment
+$style['cellfitalign'] = 'C';
+$pdf->write1DBarcode('CENTER', 'C128A', 105, '', 90, 15, 0.4, $style, 'N');
+
+$pdf->Ln(2);
+
+// Right alignment
+$style['cellfitalign'] = 'R';
+$pdf->write1DBarcode('RIGHT', 'C128A', 105, '', 90, 15, 0.4, $style, 'N');
+
+$pdf->Ln(2);
+// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+
+$style['fgcolor'] = array(127,0,127);
+
+// Left alignment
+$style['position'] = 'L';
+$pdf->write1DBarcode('LEFT', 'C128A', '', '', '', 15, 0.4, $style, 'N');
+
+$pdf->Ln(2);
+
+// Center alignment
+$style['position'] = 'C';
+$pdf->write1DBarcode('CENTER', 'C128A', '', '', '', 15, 0.4, $style, 'N');
+
+$pdf->Ln(2);
+
+// Right alignment
+$style['position'] = 'R';
+$pdf->write1DBarcode('RIGHT', 'C128A', '', '', '', 15, 0.4, $style, 'N');
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// TEST BARCODE STYLE
+
+// define barcode style
+$style = array(
+	'position' => '',
+	'align' => '',
+	'stretch' => true,
+	'fitwidth' => false,
+	'cellfitalign' => '',
+	'border' => true,
+	'hpadding' => 'auto',
+	'vpadding' => 'auto',
+	'fgcolor' => array(0,0,128),
+	'bgcolor' => array(255,255,128),
+	'text' => true,
+	'label' => 'CUSTOM LABEL',
+	'font' => 'helvetica',
+	'fontsize' => 8,
+	'stretchtext' => 4
+);
+
+// CODE 39 EXTENDED + CHECKSUM
+$pdf->Cell(0, 0, 'CODE 39 EXTENDED + CHECKSUM', 0, 1);
+$pdf->SetLineStyle(array('width' => 1, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(255, 0, 0)));
+$pdf->write1DBarcode('CODE 39 E+', 'C39E+', '', '', 120, 25, 0.4, $style, 'N');
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_027.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_028.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_028.php
new file mode 100644
index 00000000..f250ac58
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_028.php
@@ -0,0 +1,138 @@
+<?php
+//============================================================+
+// File name   : example_028.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 028 for TCPDF class
+//               Changing page formats
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: changing page formats
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 028');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// remove default header/footer
+$pdf->setPrintHeader(false);
+$pdf->setPrintFooter(false);
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(10, PDF_MARGIN_TOP, 10);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+$pdf->SetDisplayMode('fullpage', 'SinglePage', 'UseNone');
+
+// set font
+$pdf->SetFont('times', 'B', 20);
+
+$pdf->AddPage('P', 'A4');
+$pdf->Cell(0, 0, 'A4 PORTRAIT', 1, 1, 'C');
+
+$pdf->AddPage('L', 'A4');
+$pdf->Cell(0, 0, 'A4 LANDSCAPE', 1, 1, 'C');
+
+$pdf->AddPage('P', 'A5');
+$pdf->Cell(0, 0, 'A5 PORTRAIT', 1, 1, 'C');
+
+$pdf->AddPage('L', 'A5');
+$pdf->Cell(0, 0, 'A5 LANDSCAPE', 1, 1, 'C');
+
+$pdf->AddPage('P', 'A6');
+$pdf->Cell(0, 0, 'A6 PORTRAIT', 1, 1, 'C');
+
+$pdf->AddPage('L', 'A6');
+$pdf->Cell(0, 0, 'A6 LANDSCAPE', 1, 1, 'C');
+
+$pdf->AddPage('P', 'A7');
+$pdf->Cell(0, 0, 'A7 PORTRAIT', 1, 1, 'C');
+
+$pdf->AddPage('L', 'A7');
+$pdf->Cell(0, 0, 'A7 LANDSCAPE', 1, 1, 'C');
+
+
+// --- test backward editing ---
+
+
+$pdf->setPage(1, true);
+$pdf->SetY(50);
+$pdf->Cell(0, 0, 'A4 test', 1, 1, 'C');
+
+$pdf->setPage(2, true);
+$pdf->SetY(50);
+$pdf->Cell(0, 0, 'A4 test', 1, 1, 'C');
+
+$pdf->setPage(3, true);
+$pdf->SetY(50);
+$pdf->Cell(0, 0, 'A5 test', 1, 1, 'C');
+
+$pdf->setPage(4, true);
+$pdf->SetY(50);
+$pdf->Cell(0, 0, 'A5 test', 1, 1, 'C');
+
+$pdf->setPage(5, true);
+$pdf->SetY(50);
+$pdf->Cell(0, 0, 'A6 test', 1, 1, 'C');
+
+$pdf->setPage(6, true);
+$pdf->SetY(50);
+$pdf->Cell(0, 0, 'A6 test', 1, 1, 'C');
+
+$pdf->setPage(7, true);
+$pdf->SetY(40);
+$pdf->Cell(0, 0, 'A7 test', 1, 1, 'C');
+
+$pdf->setPage(8, true);
+$pdf->SetY(40);
+$pdf->Cell(0, 0, 'A7 test', 1, 1, 'C');
+
+$pdf->lastPage();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_028.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_029.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_029.php
new file mode 100644
index 00000000..33be97ec
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_029.php
@@ -0,0 +1,124 @@
+<?php
+//============================================================+
+// File name   : example_029.php
+// Begin       : 2008-06-09
+// Last Update : 2013-05-14
+//
+// Description : Example 029 for TCPDF class
+//               Set PDF viewer display preferences.
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Set PDF viewer display preferences.
+ * @author Nicola Asuni
+ * @since 2008-06-09
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 029');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 029', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set array for viewer preferences
+$preferences = array(
+	'HideToolbar' => true,
+	'HideMenubar' => true,
+	'HideWindowUI' => true,
+	'FitWindow' => true,
+	'CenterWindow' => true,
+	'DisplayDocTitle' => true,
+	'NonFullScreenPageMode' => 'UseNone', // UseNone, UseOutlines, UseThumbs, UseOC
+	'ViewArea' => 'CropBox', // CropBox, BleedBox, TrimBox, ArtBox
+	'ViewClip' => 'CropBox', // CropBox, BleedBox, TrimBox, ArtBox
+	'PrintArea' => 'CropBox', // CropBox, BleedBox, TrimBox, ArtBox
+	'PrintClip' => 'CropBox', // CropBox, BleedBox, TrimBox, ArtBox
+	'PrintScaling' => 'AppDefault', // None, AppDefault
+	'Duplex' => 'DuplexFlipLongEdge', // Simplex, DuplexFlipShortEdge, DuplexFlipLongEdge
+	'PickTrayByPDFSize' => true,
+	'PrintPageRange' => array(1,1,2,3),
+	'NumCopies' => 2
+);
+
+// Check the example n. 60 for advanced page settings
+
+// set pdf viewer preferences
+$pdf->setViewerPreferences($preferences);
+
+// set font
+$pdf->SetFont('times', '', 14);
+
+// add a page
+$pdf->AddPage();
+
+// print a line
+$pdf->Cell(0, 12, 'DISPLAY PREFERENCES - PAGE 1', 1, 1, 'C');
+
+$pdf->Ln(5);
+
+$pdf->Write(0, 'You can use the setViewerPreferences() method to change viewer preferences.', '', 0, 'L', true, 0, false, false, 0);
+
+// add a page
+$pdf->AddPage();
+// print a line
+$pdf->Cell(0, 12, 'DISPLAY PREFERENCES - PAGE 2', 0, 0, 'C');
+
+// add a page
+$pdf->AddPage();
+// print a line
+$pdf->Cell(0, 12, 'DISPLAY PREFERENCES - PAGE 3', 0, 0, 'C');
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_029.pdf', 'D');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_030.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_030.php
new file mode 100644
index 00000000..ed4e799d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_030.php
@@ -0,0 +1,188 @@
+<?php
+//============================================================+
+// File name   : example_030.php
+// Begin       : 2008-06-09
+// Last Update : 2013-05-14
+//
+// Description : Example 030 for TCPDF class
+//               Colour gradients
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Colour gradients
+ * @author Nicola Asuni
+ * @since 2008-06-09
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 030');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 030', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', 'B', 20);
+
+// --- first page ------------------------------------------
+
+// add a page
+$pdf->AddPage();
+
+$pdf->Cell(0, 0, 'TCPDF Gradients', 0, 1, 'C', 0, '', 0, false, 'T', 'M');
+
+// set colors for gradients (r,g,b) or (grey 0-255)
+$red = array(255, 0, 0);
+$blue = array(0, 0, 200);
+$yellow = array(255, 255, 0);
+$green = array(0, 255, 0);
+$white = array(255);
+$black = array(0);
+
+// set the coordinates x1,y1,x2,y2 of the gradient (see linear_gradient_coords.jpg)
+$coords = array(0, 0, 1, 0);
+
+// paint a linear gradient
+$pdf->LinearGradient(20, 45, 80, 80, $red, $blue, $coords);
+
+// write label
+$pdf->Text(20, 130, 'LinearGradient()');
+
+// set the coordinates fx,fy,cx,cy,r of the gradient (see radial_gradient_coords.jpg)
+$coords = array(0.5, 0.5, 1, 1, 1.2);
+
+// paint a radial gradient
+$pdf->RadialGradient(110, 45, 80, 80, $white, $black, $coords);
+
+// write label
+$pdf->Text(110, 130, 'RadialGradient()');
+
+// paint a coons patch mesh with default coordinates
+$pdf->CoonsPatchMesh(20, 155, 80, 80, $yellow, $blue, $green, $red);
+
+// write label
+$pdf->Text(20, 240, 'CoonsPatchMesh()');
+
+// set the coordinates for the cubic Bézier points x1,y1 ... x12, y12 of the patch (see coons_patch_mesh_coords.jpg)
+$coords = array(
+	0.00,0.00, 0.33,0.20,             //lower left
+	0.67,0.00, 1.00,0.00, 0.80,0.33,  //lower right
+	0.80,0.67, 1.00,1.00, 0.67,0.80,  //upper right
+	0.33,1.00, 0.00,1.00, 0.20,0.67,  //upper left
+	0.00,0.33);                       //lower left
+$coords_min = 0;   //minimum value of the coordinates
+$coords_max = 1;   //maximum value of the coordinates
+
+// paint a coons patch gradient with the above coordinates
+$pdf->CoonsPatchMesh(110, 155, 80, 80, $yellow, $blue, $green, $red, $coords, $coords_min, $coords_max);
+
+// write label
+$pdf->Text(110, 240, 'CoonsPatchMesh()');
+
+// --- second page -----------------------------------------
+$pdf->AddPage();
+
+// first patch: f = 0
+$patch_array[0]['f'] = 0;
+$patch_array[0]['points'] = array(
+	0.00,0.00, 0.33,0.00,
+	0.67,0.00, 1.00,0.00, 1.00,0.33,
+	0.8,0.67, 1.00,1.00, 0.67,0.8,
+	0.33,1.80, 0.00,1.00, 0.00,0.67,
+	0.00,0.33);
+$patch_array[0]['colors'][0] = array('r' => 255, 'g' => 255, 'b' => 0);
+$patch_array[0]['colors'][1] = array('r' => 0, 'g' => 0, 'b' => 255);
+$patch_array[0]['colors'][2] = array('r' => 0, 'g' => 255,'b' => 0);
+$patch_array[0]['colors'][3] = array('r' => 255, 'g' => 0,'b' => 0);
+
+// second patch - above the other: f = 2
+$patch_array[1]['f'] = 2;
+$patch_array[1]['points'] = array(
+	0.00,1.33,
+	0.00,1.67, 0.00,2.00, 0.33,2.00,
+	0.67,2.00, 1.00,2.00, 1.00,1.67,
+	1.5,1.33);
+$patch_array[1]['colors'][0]=array('r' => 0, 'g' => 0, 'b' => 0);
+$patch_array[1]['colors'][1]=array('r' => 255, 'g' => 0, 'b' => 255);
+
+// third patch - right of the above: f = 3
+$patch_array[2]['f'] = 3;
+$patch_array[2]['points'] = array(
+	1.33,0.80,
+	1.67,1.50, 2.00,1.00, 2.00,1.33,
+	2.00,1.67, 2.00,2.00, 1.67,2.00,
+	1.33,2.00);
+$patch_array[2]['colors'][0] = array('r' => 0, 'g' => 255, 'b' => 255);
+$patch_array[2]['colors'][1] = array('r' => 0, 'g' => 0, 'b' => 0);
+
+// fourth patch - below the above, which means left(?) of the above: f = 1
+$patch_array[3]['f'] = 1;
+$patch_array[3]['points'] = array(
+	2.00,0.67,
+	2.00,0.33, 2.00,0.00, 1.67,0.00,
+	1.33,0.00, 1.00,0.00, 1.00,0.33,
+	0.8,0.67);
+$patch_array[3]['colors'][0] = array('r' => 0, 'g' => 0, 'b' => 0);
+$patch_array[3]['colors'][1] = array('r' => 0, 'g' => 0, 'b' => 255);
+
+$coords_min = 0;
+$coords_max = 2;
+
+$pdf->CoonsPatchMesh(10, 45, 190, 200, '', '', '', '', $patch_array, $coords_min, $coords_max);
+
+// write label
+$pdf->Text(10, 250, 'CoonsPatchMesh()');
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_030.pdf', 'D');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_031.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_031.php
new file mode 100644
index 00000000..160d162e
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_031.php
@@ -0,0 +1,103 @@
+<?php
+//============================================================+
+// File name   : example_031.php
+// Begin       : 2008-06-09
+// Last Update : 2013-05-14
+//
+// Description : Example 031 for TCPDF class
+//               Pie Chart
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Pie Chart
+ * @author Nicola Asuni
+ * @since 2008-06-09
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 031');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 031', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', 'B', 20);
+
+// add a page
+$pdf->AddPage();
+
+$pdf->Write(0, 'Example of PieSector() method.');
+
+$xc = 105;
+$yc = 100;
+$r = 50;
+
+$pdf->SetFillColor(0, 0, 255);
+$pdf->PieSector($xc, $yc, $r, 20, 120, 'FD', false, 0, 2);
+
+$pdf->SetFillColor(0, 255, 0);
+$pdf->PieSector($xc, $yc, $r, 120, 250, 'FD', false, 0, 2);
+
+$pdf->SetFillColor(255, 0, 0);
+$pdf->PieSector($xc, $yc, $r, 250, 20, 'FD', false, 0, 2);
+
+// write labels
+$pdf->SetTextColor(255,255,255);
+$pdf->Text(105, 65, 'BLUE');
+$pdf->Text(60, 95, 'GREEN');
+$pdf->Text(120, 115, 'RED');
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_031.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_032.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_032.php
new file mode 100644
index 00000000..8f042d74
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_032.php
@@ -0,0 +1,93 @@
+<?php
+//============================================================+
+// File name   : example_032.php
+// Begin       : 2008-06-09
+// Last Update : 2013-05-14
+//
+// Description : Example 032 for TCPDF class
+//               EPS/AI image
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: EPS/AI image
+ * @author Nicola Asuni
+ * @since 2008-06-09
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 032');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 032', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 12);
+
+$pdf->AddPage();
+
+$pdf->Write(0, 'Example of ImageEPS() method for AI and EPS images');
+
+$pdf->ImageEps($file='images/tiger.ai', $x=10, $y=50, $w=190, $h=190, $link='', $useBoundingBox=true, $align='', $palign='', $border=0, $fitonpage=false);
+
+$pdf->AddPage();
+
+$pdf->ImageEps('images/bug.eps', 0, 25, 0, 240, "http://www.tcpdf.org", true, 'T', 'C');
+
+$pdf->AddPage();
+
+$pdf->ImageEps('images/pelican.ai', 15, 70, 180);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_032.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_033.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_033.php
new file mode 100644
index 00000000..4f95e409
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_033.php
@@ -0,0 +1,105 @@
+<?php
+//============================================================+
+// File name   : example_033.php
+// Begin       : 2008-06-24
+// Last Update : 2013-05-14
+//
+// Description : Example 033 for TCPDF class
+//               Mixed font types
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Mixed font types
+ * @author Nicola Asuni
+ * @since 2008-06-24
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 033');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 033', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// add a page
+$pdf->AddPage();
+
+// set default font subsetting mode
+$pdf->setFontSubsetting(false);
+
+$pdf->SetFont('helvetica', 'B', 20);
+
+$pdf->Write(0, 'Font Types', '', 0, 'C', 1, 0, false, false, 0);
+
+$pdf->Ln(10);
+
+$pdf->SetFont('times', '', 10);
+
+$pdf->MultiCell(80, 0, "[Core font] : Cras eros leo, porttitor porta, accumsan fermentum, ornare ac, est. Praesent dui lorem, imperdiet at, cursus sed, facilisis aliquam, nibh. Nulla accumsan nonummy diam. Donec tempus. Etiam posuere. Proin lectus. Donec purus. Duis in sem pretium urna feugiat vehicula. Ut suscipit velit eget massa. Nam nonummy, enim commodo euismod placerat, tortor elit tempus lectus, quis suscipit metus lorem blandit turpis.\n", 1, 'J', 0, 1, '', '', true, 0);
+
+$pdf->Ln(2);
+
+$pdf->SetFont('dejavusans', '', 10);
+
+$pdf->MultiCell(80, 0, "[True Type Unicode font] : Cras eros leo, porttitor porta, accumsan fermentum, ornare ac, est. Praesent dui lorem, imperdiet at, cursus sed, facilisis aliquam, nibh. Nulla accumsan nonummy diam. Donec tempus. Etiam posuere. Proin lectus. Donec purus. Duis in sem pretium urna feugiat vehicula. Ut suscipit velit eget massa. Nam nonummy, enim commodo euismod placerat, tortor elit tempus lectus, quis suscipit metus lorem blandit turpis.\n", 1, 'J', 0, 1, '', '', true, 0);
+
+$pdf->Ln(2);
+
+$pdf->SetFont('cid0jp', '', 9);
+
+$pdf->MultiCell(80, 0, "[CID-0 font] : Cras eros leo, porttitor porta, accumsan fermentum, ornare ac, est. Praesent dui lorem, imperdiet at, cursus sed, facilisis aliquam, nibh. Nulla accumsan nonummy diam. Donec tempus. Etiam posuere. Proin lectus. Donec purus. Duis in sem pretium urna feugiat vehicula. Ut suscipit velit eget massa. Nam nonummy, enim commodo euismod placerat, tortor elit tempus lectus, quis suscipit metus lorem blandit turpis.\n", 1, 'J', 0, 1, '', '', true, 0);
+
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_033.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_034.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_034.php
new file mode 100644
index 00000000..bb15902f
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_034.php
@@ -0,0 +1,96 @@
+<?php
+//============================================================+
+// File name   : example_034.php
+// Begin       : 2008-07-18
+// Last Update : 2013-05-14
+//
+// Description : Example 034 for TCPDF class
+//               Clipping
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Clipping
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 034');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 034', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', 'B', 20);
+
+// add a page
+$pdf->AddPage();
+
+$pdf->Write(0, 'Image Clipping using geometric functions', '', 0, 'C', 1, 0, false, false, 0);
+
+//Start Graphic Transformation
+$pdf->StartTransform();
+
+// set clipping mask
+$pdf->StarPolygon(105, 100, 30, 10, 3, 0, 1, 'CNZ');
+
+// draw jpeg image to be clipped
+$pdf->Image('images/image_demo.jpg', 75, 70, 60, 60, '', 'http://www.tcpdf.org', '', true, 72);
+
+//Stop Graphic Transformation
+$pdf->StopTransform();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_034.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_035.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_035.php
new file mode 100644
index 00000000..0e5280c2
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_035.php
@@ -0,0 +1,111 @@
+<?php
+//============================================================+
+// File name   : example_035.php
+// Begin       : 2008-07-22
+// Last Update : 2013-05-14
+//
+// Description : Example 035 for TCPDF class
+//               Line styles with cells and multicells
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Line styles with cells and multicells
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 035');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 035', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('times', 'BI', 16);
+
+// add a page
+$pdf->AddPage();
+
+$pdf->Write(0, 'Example of SetLineStyle() method', '', 0, 'L', true, 0, false, false, 0);
+
+$pdf->Ln();
+
+$pdf->SetLineStyle(array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => 4, 'color' => array(255, 0, 0)));
+$pdf->SetFillColor(255,255,128);
+$pdf->SetTextColor(0,0,128);
+
+$text="DUMMY";
+
+$pdf->Cell(0, 0, $text, 1, 1, 'L', 1, 0);
+
+$pdf->Ln();
+
+$pdf->SetLineStyle(array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 255)));
+$pdf->SetFillColor(255,255,0);
+$pdf->SetTextColor(0,0,255);
+$pdf->MultiCell(60, 4, $text, 1, 'C', 1, 0);
+
+$pdf->SetLineStyle(array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(255, 255, 0)));
+$pdf->SetFillColor(0,0,255);
+$pdf->SetTextColor(255,255,0);
+$pdf->MultiCell(60, 4, $text, 'TB', 'C', 1, 0);
+
+$pdf->SetLineStyle(array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(255, 0, 255)));
+$pdf->SetFillColor(0,255,0);
+$pdf->SetTextColor(255,0,255);
+$pdf->MultiCell(60, 4, $text, 1, 'C', 1, 1);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_035.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_036.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_036.php
new file mode 100644
index 00000000..26254974
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_036.php
@@ -0,0 +1,89 @@
+<?php
+//============================================================+
+// File name   : example_036.php
+// Begin       : 2008-08-08
+// Last Update : 2013-05-14
+//
+// Description : Example 036 for TCPDF class
+//               Annotations
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Annotations
+ * @author Nicola Asuni
+ * @since 2008-08-08
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 036');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 036', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('times', '', 16);
+
+// add a page
+$pdf->AddPage();
+
+$txt = 'Example of Text Annotation.
+Move your mouse over the yellow box or double click on it to display the annotation text.';
+$pdf->Write(0, $txt, '', 0, 'L', true, 0, false, false, 0);
+
+// text annotation
+$pdf->Annotation(83, 27, 10, 10, "Text annotation example\naccented letters test: àèéìòù", array('Subtype'=>'Text', 'Name' => 'Comment', 'T' => 'title example', 'Subj' => 'example', 'C' => array(255, 255, 0)));
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_036.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_037.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_037.php
new file mode 100644
index 00000000..deb7d92a
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_037.php
@@ -0,0 +1,147 @@
+<?php
+//============================================================+
+// File name   : example_037.php
+// Begin       : 2008-09-12
+// Last Update : 2013-09-30
+//
+// Description : Example 037 for TCPDF class
+//               Spot colors
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Spot colors.
+ * @author Nicola Asuni
+ * @since 2008-09-12
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 037');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 037', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 11);
+
+// add a page
+$pdf->AddPage();
+
+$html = '<h1>Example of Spot Colors</h1>Spot colors are single ink colors, rather than colors produced by four (CMYK), six (CMYKOG) or more inks in the printing process (process colors). They can be obtained by special vendors, but often the printers have found their own way of mixing inks to match defined colors.<br /><br />As long as no open standard for spot colours exists, TCPDF users will have to buy a colour book by one of the colour manufacturers and insert the values and names of spot colours directly into the $spotcolor array in <b><em>include/tcpdf_colors.php</em></b> file, or define them using the <b><em>AddSpotColor()</em></b> method.<br /><br />Common industry standard spot colors are:<br /><span color="#008800">ANPA-COLOR, DIC, FOCOLTONE, GCMI, HKS, PANTONE, TOYO, TRUMATCH</span>.';
+
+// Print text using writeHTMLCell()
+$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, 'J', true);
+
+
+$pdf->SetFont('helvetica', '', 10);
+
+// Define some new spot colors
+// $c, $m, $y and $k (2nd, 3rd, 4th and 5th parameter) are the CMYK color components.
+// AddSpotColor($name, $c, $m, $y, $k)
+
+$pdf->AddSpotColor('My TCPDF Dark Green', 100, 50, 80, 45);
+$pdf->AddSpotColor('My TCPDF Light Yellow', 0, 0, 55, 0);
+$pdf->AddSpotColor('My TCPDF Black', 0, 0, 0, 100);
+$pdf->AddSpotColor('My TCPDF Red', 30, 100, 90, 10);
+$pdf->AddSpotColor('My TCPDF Green', 100, 30, 100, 0);
+$pdf->AddSpotColor('My TCPDF Blue', 100, 60, 10, 5);
+$pdf->AddSpotColor('My TCPDF Yellow', 0, 20, 100, 0);
+
+// Select the spot color
+// $tint (the second parameter) is the intensity of the color (0-100).
+// SetTextSpotColor($name, $tint=100)
+// SetDrawSpotColor($name, $tint=100)
+// SetFillSpotColor($name, $tint=100)
+
+$pdf->SetTextSpotColor('My TCPDF Black', 100);
+$pdf->SetDrawSpotColor('My TCPDF Black', 100);
+
+$starty = 100;
+
+// print some spot colors
+
+$pdf->SetFillSpotColor('My TCPDF Dark Green', 100);
+$pdf->Rect(30, $starty, 40, 20, 'DF');
+$pdf->Text(73, $starty + 8, 'My TCPDF Dark Green');
+
+$starty += 24;
+$pdf->SetFillSpotColor('My TCPDF Light Yellow', 100);
+$pdf->Rect(30, $starty, 40, 20, 'DF');
+$pdf->Text(73, $starty + 8, 'My TCPDF Light Yellow');
+
+
+// --- default values defined on spotcolors.php ---
+
+$starty += 24;
+$pdf->SetFillSpotColor('My TCPDF Red', 100);
+$pdf->Rect(30, $starty, 40, 20, 'DF');
+$pdf->Text(73, $starty + 8, 'My TCPDF Red');
+
+$starty += 24;
+$pdf->SetFillSpotColor('My TCPDF Green', 100);
+$pdf->Rect(30, $starty, 40, 20, 'DF');
+$pdf->Text(73, $starty + 8, 'My TCPDF Green');
+
+$starty += 24;
+$pdf->SetFillSpotColor('My TCPDF Blue', 100);
+$pdf->Rect(30, $starty, 40, 20, 'DF');
+$pdf->Text(73, $starty + 8, 'My TCPDF Blue');
+
+$starty += 24;
+$pdf->SetFillSpotColor('My TCPDF Yellow', 100);
+$pdf->Rect(30, $starty, 40, 20, 'DF');
+$pdf->Text(73, $starty + 8, 'My TCPDF Yellow');
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_037.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_038.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_038.php
new file mode 100644
index 00000000..a1e57e20
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_038.php
@@ -0,0 +1,92 @@
+<?php
+//============================================================+
+// File name   : example_038.php
+// Begin       : 2008-09-15
+// Last Update : 2013-05-14
+//
+// Description : Example 038 for TCPDF class
+//               CID-0 CJK unembedded font
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: CID-0 CJK unembedded font
+ * @author Nicola Asuni
+ * @since 2008-09-15
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 038');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 038', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 20);
+
+// add a page
+$pdf->AddPage();
+
+$txt = 'Example of CID-0 CJK unembedded font.
+To display extended text you must have CJK fonts installed for your PDF reader:';
+$pdf->Write(0, $txt, '', 0, 'L', true, 0, false, false, 0);
+
+// set font
+$pdf->SetFont('cid0jp', '', 40);
+
+$txt = 'こんにちは世界';
+$pdf->Write(0, $txt, '', 0, 'L', true, 0, false, false, 0);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_038.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_039.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_039.php
new file mode 100644
index 00000000..5d5ad3b1
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_039.php
@@ -0,0 +1,104 @@
+<?php
+//============================================================+
+// File name   : example_039.php
+// Begin       : 2008-10-16
+// Last Update : 2013-05-14
+//
+// Description : Example 039 for TCPDF class
+//               HTML justification
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: HTML justification
+ * @author Nicola Asuni
+ * @since 2008-10-18
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 039');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 039', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// add a page
+$pdf->AddPage();
+
+// set font
+$pdf->SetFont('helvetica', 'B', 20);
+
+$pdf->Write(0, 'Example of HTML Justification', '', 0, 'L', true, 0, false, false, 0);
+
+// create some HTML content
+$html = '<span style="text-align:justify;">a <u>abc</u> abcdefghijkl abcdef abcdefg <b>abcdefghi</b> a abc abcd <img src="images/logo_example.png" border="0" height="41" width="41" /> <img src="images/tiger.ai" alt="test alt attribute" width="100" height="100" border="0" /> abcdef abcdefg <b>abcdefghi</b> a abc abcd abcdef abcdefg <b>abcdefghi</b> a abc abcd abcdef abcdefg <b>abcdefghi</b> a <u>abc</u> abcd abcdef abcdefg <b>abcdefghi</b> a abc abcd abcdef abcdefg <b>abcdefghi</b> a abc abcd abcdef abcdefg <b>abcdefghi</b> a abc abcd abcdef abcdefg <b>abcdefghi</b> a abc abcd abcdef abcdefg <b>abcdefghi</b> a abc abcd abcdef abcdefg abcdefghi a abc abcd <a href="http://tcpdf.org">abcdef abcdefg</a> start a abc before <span style="background-color:yellow">yellow color</span> after a abc abcd abcdef abcdefg abcdefghi a abc abcd end abcdefg abcdefghi a abc abcd abcdef abcdefg abcdefghi a abc abcd abcdef abcdefg abcdefghi a abc abcd abcdef abcdefg abcdefghi a abc abcd abcdef abcdefg abcdefghi a abc abcd abcdef abcdefg abcdefghi a abc abcd abcdef abcdefg abcdefghi a abc abcd abcdef abcdefg abcdefghi<br />abcd abcdef abcdefg abcdefghi<br />abcd abcde abcdef</span>';
+
+// set core font
+$pdf->SetFont('helvetica', '', 10);
+
+// output the HTML content
+$pdf->writeHTML($html, true, 0, true, true);
+
+$pdf->Ln();
+
+// set UTF-8 Unicode font
+$pdf->SetFont('dejavusans', '', 10);
+
+// output the HTML content
+$pdf->writeHTML($html, true, 0, true, true);
+
+// reset pointer to the last page
+$pdf->lastPage();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_039.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_040.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_040.php
new file mode 100644
index 00000000..c1d90917
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_040.php
@@ -0,0 +1,116 @@
+<?php
+//============================================================+
+// File name   : example_040.php
+// Begin       : 2008-10-28
+// Last Update : 2013-05-14
+//
+// Description : Example 040 for TCPDF class
+//               Booklet mode (double-sided pages)
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Booklet mode (double-sided pages)
+ * @author Nicola Asuni
+ * @since 2008-10-28
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 040');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 040', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set display mode
+$pdf->SetDisplayMode($zoom='fullpage', $layout='TwoColumnRight', $mode='UseNone');
+
+// set pdf viewer preferences
+$pdf->setViewerPreferences(array('Duplex' => 'DuplexFlipLongEdge'));
+
+// set booklet mode
+$pdf->SetBooklet(true, 10, 30);
+
+// set core font
+$pdf->SetFont('helvetica', '', 18);
+
+// add a page (left page)
+$pdf->AddPage();
+
+$pdf->Write(0, 'Example of booklet mode', '', 0, 'L', true, 0, false, false, 0);
+
+// print a line using Cell()
+$pdf->Cell(0, 0, 'PAGE 1', 1, 1, 'C');
+
+
+// add a page (right page)
+$pdf->AddPage();
+
+// print a line using Cell()
+$pdf->Cell(0, 0, 'PAGE 2', 1, 1, 'C');
+
+
+// add a page (left page)
+$pdf->AddPage();
+
+// print a line using Cell()
+$pdf->Cell(0, 0, 'PAGE 3', 1, 1, 'C');
+
+// add a page (right page)
+$pdf->AddPage();
+
+// print a line using Cell()
+$pdf->Cell(0, 0, 'PAGE 4', 1, 1, 'C');
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_040.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_041.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_041.php
new file mode 100644
index 00000000..973bdf99
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_041.php
@@ -0,0 +1,90 @@
+<?php
+//============================================================+
+// File name   : example_041.php
+// Begin       : 2008-12-07
+// Last Update : 2013-05-14
+//
+// Description : Example 041 for TCPDF class
+//               Annotation - FileAttachment
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Annotation - FileAttachment
+ * @author Nicola Asuni
+ * @since 2008-12-07
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 041');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 041', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('times', '', 16);
+
+// add a page
+$pdf->AddPage();
+
+
+$txt = 'Example of File Attachment.
+Double click on the icon to open the attached file.';
+$pdf->Write(0, $txt, '', 0, 'L', true, 0, false, false, 0);
+
+// attach an external file
+$pdf->Annotation(85, 27, 5, 5, 'text file', array('Subtype'=>'FileAttachment', 'Name' => 'PushPin', 'FS' => 'data/utf8test.txt'));
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_041.pdf', 'D');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_042.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_042.php
new file mode 100644
index 00000000..14c9fd0a
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_042.php
@@ -0,0 +1,102 @@
+<?php
+//============================================================+
+// File name   : example_042.php
+// Begin       : 2008-12-23
+// Last Update : 2013-05-14
+//
+// Description : Example 042 for TCPDF class
+//               Test Image with alpha channel
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Test Image with alpha channel
+ * @author Nicola Asuni
+ * @since 2008-12-23
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 042');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 042', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set JPEG quality
+//$pdf->setJPEGQuality(75);
+
+$pdf->SetFont('helvetica', '', 18);
+
+// add a page
+$pdf->AddPage();
+
+// create background text
+$background_text = str_repeat('TCPDF test PNG Alpha Channel ', 50);
+$pdf->MultiCell(0, 5, $background_text, 0, 'J', 0, 2, '', '', true, 0, false);
+
+// --- Method (A) ------------------------------------------
+// the Image() method recognizes the alpha channel embedded on the image:
+
+$pdf->Image('images/image_with_alpha.png', 50, 50, 100, '', '', 'http://www.tcpdf.org', '', false, 300);
+
+// --- Method (B) ------------------------------------------
+// provide image + separate 8-bit mask
+
+// first embed mask image (w, h, x and y will be ignored, the image will be scaled to the target image's size)
+$mask = $pdf->Image('images/alpha.png', 50, 140, 100, '', '', '', '', false, 300, '', true);
+
+// embed image, masked with previously embedded mask
+$pdf->Image('images/img.png', 50, 140, 100, '', '', 'http://www.tcpdf.org', '', false, 300, '', false, $mask);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_042.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_043.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_043.php
new file mode 100644
index 00000000..116827e8
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_043.php
@@ -0,0 +1,85 @@
+<?php
+//============================================================+
+// File name   : example_043.php
+// Begin       : 2009-01-02
+// Last Update : 2013-05-14
+//
+// Description : Example 043 for TCPDF class
+//               Disk caching
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Disk caching
+ * @author Nicola Asuni
+ * @since 2009-01-02
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', true);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 043');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 043', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 16);
+
+// add a page
+$pdf->AddPage();
+
+// Multicell test
+$pdf->MultiCell(0, 0, 'DISK CACHING TEST: check the parameters of the class constructor.', 1, 'L', 0, 0, '', '', true);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_043.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_044.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_044.php
new file mode 100644
index 00000000..949270cc
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_044.php
@@ -0,0 +1,128 @@
+<?php
+//============================================================+
+// File name   : example_044.php
+// Begin       : 2009-01-02
+// Last Update : 2013-05-14
+//
+// Description : Example 044 for TCPDF class
+//               Move, copy and delete pages
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Move, copy and delete pages
+ * @author Nicola Asuni
+ * @since 2009-01-02
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 044');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 044', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', 'B', 40);
+
+// print a line using Cell()
+$pdf->AddPage();
+$pdf->Cell(0, 10, 'PAGE: A', 0, 1, 'L');
+
+// add some vertical space
+$pdf->Ln(10);
+
+// print some text
+$pdf->SetFont('times', 'I', 16);
+$txt = 'TCPDF allows you to Copy, Move and Delete pages.';
+$pdf->Write(0, $txt, '', 0, 'L', true, 0, false, false, 0);
+
+$pdf->SetFont('helvetica', 'B', 40);
+
+$pdf->AddPage();
+$pdf->Cell(0, 10, 'PAGE: B', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Cell(0, 10, 'PAGE: D', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Cell(0, 10, 'PAGE: E', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Cell(0, 10, 'PAGE: E-2', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Cell(0, 10, 'PAGE: F', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Cell(0, 10, 'PAGE: C', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Cell(0, 10, 'PAGE: G', 0, 1, 'L');
+
+// Move page 7 to page 3
+$pdf->movePage(7, 3);
+
+// Delete page 6
+$pdf->deletePage(6);
+
+$pdf->AddPage();
+$pdf->Cell(0, 10, 'PAGE: H', 0, 1, 'L');
+
+// copy the second page
+$pdf->copyPage(2);
+
+// NOTE: to insert a page to a previous position, you can add a new page to the end of document and then move it using movePage().
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_044.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_045.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_045.php
new file mode 100644
index 00000000..523cb8b1
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_045.php
@@ -0,0 +1,130 @@
+<?php
+//============================================================+
+// File name   : example_045.php
+// Begin       : 2008-03-04
+// Last Update : 2013-05-14
+//
+// Description : Example 045 for TCPDF class
+//               Bookmarks and Table of Content
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Bookmarks and Table of Content
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 045');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 045', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('times', 'B', 20);
+
+// add a page
+$pdf->AddPage();
+
+// set a bookmark for the current position
+$pdf->Bookmark('Chapter 1', 0, 0, '', 'B', array(0,64,128));
+
+// print a line using Cell()
+$pdf->Cell(0, 10, 'Chapter 1', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Bookmark('Paragraph 1.1', 1, 0, '', '', array(128,0,0));
+$pdf->Cell(0, 10, 'Paragraph 1.1', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Bookmark('Paragraph 1.2', 1, 0, '', '', array(128,0,0));
+$pdf->Cell(0, 10, 'Paragraph 1.2', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Bookmark('Sub-Paragraph 1.2.1', 2, 0, '', 'I', array(0,128,0));
+$pdf->Cell(0, 10, 'Sub-Paragraph 1.2.1', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Bookmark('Paragraph 1.3', 1, 0, '', '', array(128,0,0));
+$pdf->Cell(0, 10, 'Paragraph 1.3', 0, 1, 'L');
+
+// add some pages and bookmarks
+for ($i = 2; $i < 12; $i++) {
+	$pdf->AddPage();
+	$pdf->Bookmark('Chapter '.$i, 0, 0, '', 'B', array(0,64,128));
+	$pdf->Cell(0, 10, 'Chapter '.$i, 0, 1, 'L');
+}
+
+// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+
+// add a new page for TOC
+$pdf->addTOCPage();
+
+// write the TOC title
+$pdf->SetFont('times', 'B', 16);
+$pdf->MultiCell(0, 0, 'Table Of Content', 0, 'C', 0, 1, '', '', true, 0);
+$pdf->Ln();
+
+$pdf->SetFont('dejavusans', '', 12);
+
+// add a simple Table Of Content at first page
+// (check the example n. 59 for the HTML version)
+$pdf->addTOC(1, 'courier', '.', 'INDEX', 'B', array(128,0,0));
+
+// end of TOC page
+$pdf->endTOCPage();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_045.pdf', 'D');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_046.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_046.php
new file mode 100644
index 00000000..188b8082
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_046.php
@@ -0,0 +1,123 @@
+<?php
+//============================================================+
+// File name   : example_046.php
+// Begin       : 2009-02-28
+// Last Update : 2013-05-14
+//
+// Description : Example 046 for TCPDF class
+//               Text Hyphenation
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: text Hyphenation
+ * @author Nicola Asuni
+ * @since 2009-02-28
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 046');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 046', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', 'B', 20);
+
+// add a page
+$pdf->AddPage();
+
+$pdf->Write(0, 'Example of Text Hyphenation', '', 0, 'L', true, 0, false, false, 0);
+
+$pdf->Ln(10);
+
+/*
+Unicode Data for SHY:
+	Name : SOFT HYPHEN, commonly abbreviated as SHY
+	HTML Entity (decimal): &#173;
+	HTML Entity (hex): &#xad;
+	HTML Entity (named): &shy;
+	How to type in Microsoft Windows: [Alt +00AD] or [Alt 0173]
+	UTF-8 (hex): 0xC2 0xAD (c2ad)
+*/
+
+/*
+// You can autmatically add SOFT HYPHENS to your text using
+// the hyphenateText() method, but this requires either an
+// hyphenation pattern array of a hyphenation pattern TEX file.
+// You can download hyphenation TEX patterns from:
+// http://www.ctan.org/tex-archive/language/hyph-utf8/tex/generic/hyph-utf8/patterns/
+
+// EXAMPLE:
+
+$html = 'On the other hand, we denounce with righteous indignation and dislike men who are so beguiled and demoralized by the charms of pleasure of the moment, so blinded by desire, that they cannot foresee the pain and trouble that are bound to ensue; and equal blame belongs to those who fail in their duty through weakness of will, which is the same as saying through shrinking from toil and pain. These cases are perfectly simple and easy to distinguish. In a free hour, when our power of choice is untrammelled and when nothing prevents our being able to do what we like best, every pleasure is to be welcomed and every pain avoided. But in certain circumstances and owing to the claims of duty or the obligations of business it will frequently occur that pleasures have to be repudiated and annoyances accepted. The wise man therefore always holds in these matters to this principle of selection: he rejects pleasures to secure other greater pleasures, or else he endures pains to avoid worse pains.';
+
+$hyphen_patterns = $pdf->getHyphenPatternsFromTEX('hyphens/hyph-en-gb.tex');
+
+$html = $pdf->hyphenateText($html, $hyphen_patterns, array(), 1, 2, 1, 8);
+*/
+
+
+// HTML text with soft hyphens (&shy;)
+$html = 'On the other hand, we de&shy;nounce with righ&shy;teous in&shy;dig&shy;na&shy;tion and dis&shy;like men who are so be&shy;guiled and de&shy;mo&shy;r&shy;al&shy;ized by the charms of plea&shy;sure of the mo&shy;ment, so blind&shy;ed by de&shy;sire, that they can&shy;not fore&shy;see the pain and trou&shy;ble that are bound to en&shy;sue; and equal blame be&shy;longs to those who fail in their du&shy;ty through weak&shy;ness of will, which is the same as say&shy;ing through shrink&shy;ing from toil and pain. Th&shy;ese cas&shy;es are per&shy;fect&shy;ly sim&shy;ple and easy to distin&shy;guish. In a free hour, when our pow&shy;er of choice is un&shy;tram&shy;melled and when noth&shy;ing pre&shy;vents our be&shy;ing able to do what we like best, ev&shy;ery plea&shy;sure is to be wel&shy;comed and ev&shy;ery pain avoid&shy;ed. But in cer&shy;tain cir&shy;cum&shy;s&shy;tances and ow&shy;ing to the claims of du&shy;ty or the obli&shy;ga&shy;tions of busi&shy;ness it will fre&shy;quent&shy;ly oc&shy;cur that plea&shy;sures have to be re&shy;pu&shy;di&shy;at&shy;ed and an&shy;noy&shy;ances ac&shy;cept&shy;ed. The wise man there&shy;fore al&shy;ways holds in th&shy;ese mat&shy;ters to this prin&shy;ci&shy;ple of se&shy;lec&shy;tion: he re&shy;jects plea&shy;sures to se&shy;cure other greater plea&shy;sures, or else he en&shy;dures pains to avoid worse pains.';
+
+$pdf->SetFont('times', '', 10);
+$pdf->SetDrawColor(255,0,0);
+$pdf->SetTextColor(0,63,127);
+
+// print a cell
+$pdf->writeHTMLCell(50, 0, '', '', $html, 1, 1, 0, true, 'J');
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_046.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_047.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_047.php
new file mode 100644
index 00000000..a26ae5d5
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_047.php
@@ -0,0 +1,117 @@
+<?php
+//============================================================+
+// File name   : example_047.php
+// Begin       : 2009-03-19
+// Last Update : 2013-05-14
+//
+// Description : Example 047 for TCPDF class
+//               Transactions
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Transactions
+ * @author Nicola Asuni
+ * @since 2009-03-19
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 047');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 047', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 16);
+
+// add a page
+$pdf->AddPage();
+
+$txt = 'Example of Transactions.
+TCPDF allows you to undo some operations using the Transactions.
+Check the source code for further information.';
+$pdf->Write(0, $txt, '', 0, 'L', true, 0, false, false, 0);
+
+$pdf->Ln(5);
+
+$pdf->SetFont('times', '', 12);
+
+// start transaction
+$pdf->startTransaction();
+
+$pdf->Write(0, "LINE 1\n");
+$pdf->Write(0, "LINE 2\n");
+
+// restarts transaction
+$pdf->startTransaction();
+
+$pdf->Write(0, "LINE 3\n");
+$pdf->Write(0, "LINE 4\n");
+
+// rolls back to the last (re)start
+$pdf = $pdf->rollbackTransaction();
+
+$pdf->Write(0, "LINE 5\n");
+$pdf->Write(0, "LINE 6\n");
+
+// start transaction
+$pdf->startTransaction();
+
+$pdf->Write(0, "LINE 7\n");
+
+// commit transaction (actually just frees memory)
+$pdf->commitTransaction();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_047.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_048.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_048.php
new file mode 100644
index 00000000..ca88a148
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_048.php
@@ -0,0 +1,313 @@
+<?php
+//============================================================+
+// File name   : example_048.php
+// Begin       : 2009-03-20
+// Last Update : 2013-05-14
+//
+// Description : Example 048 for TCPDF class
+//               HTML tables and table headers
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: HTML tables and table headers
+ * @author Nicola Asuni
+ * @since 2009-03-20
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 048');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 048', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', 'B', 20);
+
+// add a page
+$pdf->AddPage();
+
+$pdf->Write(0, 'Example of HTML tables', '', 0, 'L', true, 0, false, false, 0);
+
+$pdf->SetFont('helvetica', '', 8);
+
+// -----------------------------------------------------------------------------
+
+$tbl = <<<EOD
+<table cellspacing="0" cellpadding="1" border="1">
+    <tr>
+        <td rowspan="3">COL 1 - ROW 1<br />COLSPAN 3</td>
+        <td>COL 2 - ROW 1</td>
+        <td>COL 3 - ROW 1</td>
+    </tr>
+    <tr>
+    	<td rowspan="2">COL 2 - ROW 2 - COLSPAN 2<br />text line<br />text line<br />text line<br />text line</td>
+    	<td>COL 3 - ROW 2</td>
+    </tr>
+    <tr>
+       <td>COL 3 - ROW 3</td>
+    </tr>
+
+</table>
+EOD;
+
+$pdf->writeHTML($tbl, true, false, false, false, '');
+
+// -----------------------------------------------------------------------------
+
+$tbl = <<<EOD
+<table cellspacing="0" cellpadding="1" border="1">
+    <tr>
+        <td rowspan="3">COL 1 - ROW 1<br />COLSPAN 3<br />text line<br />text line<br />text line<br />text line<br />text line<br />text line</td>
+        <td>COL 2 - ROW 1</td>
+        <td>COL 3 - ROW 1</td>
+    </tr>
+    <tr>
+    	<td rowspan="2">COL 2 - ROW 2 - COLSPAN 2<br />text line<br />text line<br />text line<br />text line</td>
+    	 <td>COL 3 - ROW 2</td>
+    </tr>
+    <tr>
+       <td>COL 3 - ROW 3</td>
+    </tr>
+
+</table>
+EOD;
+
+$pdf->writeHTML($tbl, true, false, false, false, '');
+
+// -----------------------------------------------------------------------------
+
+$tbl = <<<EOD
+<table cellspacing="0" cellpadding="1" border="1">
+    <tr>
+        <td rowspan="3">COL 1 - ROW 1<br />COLSPAN 3<br />text line<br />text line<br />text line<br />text line<br />text line<br />text line</td>
+        <td>COL 2 - ROW 1</td>
+        <td>COL 3 - ROW 1</td>
+    </tr>
+    <tr>
+    	<td rowspan="2">COL 2 - ROW 2 - COLSPAN 2<br />text line<br />text line<br />text line<br />text line</td>
+    	 <td>COL 3 - ROW 2<br />text line<br />text line</td>
+    </tr>
+    <tr>
+       <td>COL 3 - ROW 3</td>
+    </tr>
+
+</table>
+EOD;
+
+$pdf->writeHTML($tbl, true, false, false, false, '');
+
+// -----------------------------------------------------------------------------
+
+$tbl = <<<EOD
+<table border="1">
+<tr>
+<th rowspan="3">Left column</th>
+<th colspan="5">Heading Column Span 5</th>
+<th colspan="9">Heading Column Span 9</th>
+</tr>
+<tr>
+<th rowspan="2">Rowspan 2<br />This is some text that fills the table cell.</th>
+<th colspan="2">span 2</th>
+<th colspan="2">span 2</th>
+<th rowspan="2">2 rows</th>
+<th colspan="8">Colspan 8</th>
+</tr>
+<tr>
+<th>1a</th>
+<th>2a</th>
+<th>1b</th>
+<th>2b</th>
+<th>1</th>
+<th>2</th>
+<th>3</th>
+<th>4</th>
+<th>5</th>
+<th>6</th>
+<th>7</th>
+<th>8</th>
+</tr>
+</table>
+EOD;
+
+$pdf->writeHTML($tbl, true, false, false, false, '');
+
+// -----------------------------------------------------------------------------
+
+// Table with rowspans and THEAD
+$tbl = <<<EOD
+<table border="1" cellpadding="2" cellspacing="2">
+<thead>
+ <tr style="background-color:#FFFF00;color:#0000FF;">
+  <td width="30" align="center"><b>A</b></td>
+  <td width="140" align="center"><b>XXXX</b></td>
+  <td width="140" align="center"><b>XXXX</b></td>
+  <td width="80" align="center"> <b>XXXX</b></td>
+  <td width="80" align="center"><b>XXXX</b></td>
+  <td width="45" align="center"><b>XXXX</b></td>
+ </tr>
+ <tr style="background-color:#FF0000;color:#FFFF00;">
+  <td width="30" align="center"><b>B</b></td>
+  <td width="140" align="center"><b>XXXX</b></td>
+  <td width="140" align="center"><b>XXXX</b></td>
+  <td width="80" align="center"> <b>XXXX</b></td>
+  <td width="80" align="center"><b>XXXX</b></td>
+  <td width="45" align="center"><b>XXXX</b></td>
+ </tr>
+</thead>
+ <tr>
+  <td width="30" align="center">1.</td>
+  <td width="140" rowspan="6">XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX</td>
+  <td width="140">XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td width="80">XXXX</td>
+  <td align="center" width="45">XXXX<br />XXXX</td>
+ </tr>
+ <tr>
+  <td width="30" align="center" rowspan="3">2.</td>
+  <td width="140" rowspan="3">XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td align="center" width="45">XXXX<br />XXXX</td>
+ </tr>
+ <tr>
+  <td width="80">XXXX<br />XXXX<br />XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td align="center" width="45">XXXX<br />XXXX</td>
+ </tr>
+ <tr>
+  <td width="80" rowspan="2" >RRRRRR<br />XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td align="center" width="45">XXXX<br />XXXX</td>
+ </tr>
+ <tr>
+  <td width="30" align="center">3.</td>
+  <td width="140">XXXX1<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td align="center" width="45">XXXX<br />XXXX</td>
+ </tr>
+ <tr>
+  <td width="30" align="center">4.</td>
+  <td width="140">XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td align="center" width="45">XXXX<br />XXXX</td>
+ </tr>
+</table>
+EOD;
+
+$pdf->writeHTML($tbl, true, false, false, false, '');
+
+$pdf->writeHTML($tbl, true, false, false, false, '');
+
+// -----------------------------------------------------------------------------
+
+// NON-BREAKING TABLE (nobr="true")
+
+$tbl = <<<EOD
+<table border="1" cellpadding="2" cellspacing="2" nobr="true">
+ <tr>
+  <th colspan="3" align="center">NON-BREAKING TABLE</th>
+ </tr>
+ <tr>
+  <td>1-1</td>
+  <td>1-2</td>
+  <td>1-3</td>
+ </tr>
+ <tr>
+  <td>2-1</td>
+  <td>3-2</td>
+  <td>3-3</td>
+ </tr>
+ <tr>
+  <td>3-1</td>
+  <td>3-2</td>
+  <td>3-3</td>
+ </tr>
+</table>
+EOD;
+
+$pdf->writeHTML($tbl, true, false, false, false, '');
+
+// -----------------------------------------------------------------------------
+
+// NON-BREAKING ROWS (nobr="true")
+
+$tbl = <<<EOD
+<table border="1" cellpadding="2" cellspacing="2" align="center">
+ <tr nobr="true">
+  <th colspan="3">NON-BREAKING ROWS</th>
+ </tr>
+ <tr nobr="true">
+  <td>ROW 1<br />COLUMN 1</td>
+  <td>ROW 1<br />COLUMN 2</td>
+  <td>ROW 1<br />COLUMN 3</td>
+ </tr>
+ <tr nobr="true">
+  <td>ROW 2<br />COLUMN 1</td>
+  <td>ROW 2<br />COLUMN 2</td>
+  <td>ROW 2<br />COLUMN 3</td>
+ </tr>
+ <tr nobr="true">
+  <td>ROW 3<br />COLUMN 1</td>
+  <td>ROW 3<br />COLUMN 2</td>
+  <td>ROW 3<br />COLUMN 3</td>
+ </tr>
+</table>
+EOD;
+
+$pdf->writeHTML($tbl, true, false, false, false, '');
+
+// -----------------------------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_048.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_049.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_049.php
new file mode 100644
index 00000000..755c049f
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_049.php
@@ -0,0 +1,126 @@
+<?php
+//============================================================+
+// File name   : example_049.php
+// Begin       : 2009-04-03
+// Last Update : 2013-05-14
+//
+// Description : Example 049 for TCPDF class
+//               WriteHTML with TCPDF callback functions
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: WriteHTML with TCPDF callback functions
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 049');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 049', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 10);
+
+// add a page
+$pdf->AddPage();
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+IMPORTANT:
+If you are printing user-generated content, tcpdf tag can be unsafe.
+You can disable this tag by setting to false the K_TCPDF_CALLS_IN_HTML
+constant on TCPDF configuration file.
+
+For security reasons, the parameters for the 'params' attribute of TCPDF
+tag must be prepared as an array and encoded with the
+serializeTCPDFtagParameters() method (see the example below).
+
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+$html = '<h1>Test TCPDF Methods in HTML</h1>
+<h2 style="color:red;">IMPORTANT:</h2>
+<span style="color:red;">If you are using user-generated content, the tcpdf tag can be unsafe.<br />
+You can disable this tag by setting to false the <b>K_TCPDF_CALLS_IN_HTML</b> constant on TCPDF configuration file.</span>
+<h2>write1DBarcode method in HTML</h2>';
+
+$params = TCPDF_STATIC::serializeTCPDFtagParameters(array('CODE 39', 'C39', '', '', 80, 30, 0.4, array('position'=>'S', 'border'=>true, 'padding'=>4, 'fgcolor'=>array(0,0,0), 'bgcolor'=>array(255,255,255), 'text'=>true, 'font'=>'helvetica', 'fontsize'=>8, 'stretchtext'=>4), 'N'));
+$html .= '<tcpdf method="write1DBarcode" params="'.$params.'" />';
+
+$params = TCPDF_STATIC::serializeTCPDFtagParameters(array('CODE 128', 'C128', '', '', 80, 30, 0.4, array('position'=>'S', 'border'=>true, 'padding'=>4, 'fgcolor'=>array(0,0,0), 'bgcolor'=>array(255,255,255), 'text'=>true, 'font'=>'helvetica', 'fontsize'=>8, 'stretchtext'=>4), 'N'));
+$html .= '<tcpdf method="write1DBarcode" params="'.$params.'" />';
+
+$html .= '<tcpdf method="AddPage" /><h2>Graphic Functions</h2>';
+
+$params = TCPDF_STATIC::serializeTCPDFtagParameters(array(0));
+$html .= '<tcpdf method="SetDrawColor" params="'.$params.'" />';
+
+$params = TCPDF_STATIC::serializeTCPDFtagParameters(array(50, 50, 40, 10, 'DF', array(), array(0,128,255)));
+$html .= '<tcpdf method="Rect" params="'.$params.'" />';
+
+
+// output the HTML content
+$pdf->writeHTML($html, true, 0, true, 0);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// reset pointer to the last page
+$pdf->lastPage();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_049.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_050.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_050.php
new file mode 100644
index 00000000..5ccae31a
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_050.php
@@ -0,0 +1,210 @@
+<?php
+//============================================================+
+// File name   : example_050.php
+// Begin       : 2009-04-09
+// Last Update : 2013-05-14
+//
+// Description : Example 050 for TCPDF class
+//               2D Barcodes
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: 2D barcodes.
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 050');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 050', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// NOTE: 2D barcode algorithms must be implemented on 2dbarcode.php class file.
+
+// set font
+$pdf->SetFont('helvetica', '', 11);
+
+// add a page
+$pdf->AddPage();
+
+// print a message
+$txt = "You can also export 2D barcodes in other formats (PNG, SVG, HTML). Check the examples inside the barcode directory.\n";
+$pdf->MultiCell(70, 50, $txt, 0, 'J', false, 1, 125, 30, true, 0, false, true, 0, 'T', false);
+
+
+$pdf->SetFont('helvetica', '', 10);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// set style for barcode
+$style = array(
+	'border' => true,
+	'vpadding' => 'auto',
+	'hpadding' => 'auto',
+	'fgcolor' => array(0,0,0),
+	'bgcolor' => false, //array(255,255,255)
+	'module_width' => 1, // width of a single module in points
+	'module_height' => 1 // height of a single module in points
+);
+
+// write RAW 2D Barcode
+
+$code = '111011101110111,010010001000010,010011001110010,010010000010010,010011101110010';
+$pdf->write2DBarcode($code, 'RAW', 80, 30, 30, 20, $style, 'N');
+
+// write RAW2 2D Barcode
+$code = '[111011101110111][010010001000010][010011001110010][010010000010010][010011101110010]';
+$pdf->write2DBarcode($code, 'RAW2', 80, 60, 30, 20, $style, 'N');
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// set style for barcode
+$style = array(
+	'border' => 2,
+	'vpadding' => 'auto',
+	'hpadding' => 'auto',
+	'fgcolor' => array(0,0,0),
+	'bgcolor' => false, //array(255,255,255)
+	'module_width' => 1, // width of a single module in points
+	'module_height' => 1 // height of a single module in points
+);
+
+// QRCODE,L : QR-CODE Low error correction
+$pdf->write2DBarcode('www.tcpdf.org', 'QRCODE,L', 20, 30, 50, 50, $style, 'N');
+$pdf->Text(20, 25, 'QRCODE L');
+
+// QRCODE,M : QR-CODE Medium error correction
+$pdf->write2DBarcode('www.tcpdf.org', 'QRCODE,M', 20, 90, 50, 50, $style, 'N');
+$pdf->Text(20, 85, 'QRCODE M');
+
+// QRCODE,Q : QR-CODE Better error correction
+$pdf->write2DBarcode('www.tcpdf.org', 'QRCODE,Q', 20, 150, 50, 50, $style, 'N');
+$pdf->Text(20, 145, 'QRCODE Q');
+
+// QRCODE,H : QR-CODE Best error correction
+$pdf->write2DBarcode('www.tcpdf.org', 'QRCODE,H', 20, 210, 50, 50, $style, 'N');
+$pdf->Text(20, 205, 'QRCODE H');
+
+// -------------------------------------------------------------------
+// PDF417 (ISO/IEC 15438:2006)
+
+/*
+
+ The $type parameter can be simple 'PDF417' or 'PDF417' followed by a
+ number of comma-separated options:
+
+ 'PDF417,a,e,t,s,f,o0,o1,o2,o3,o4,o5,o6'
+
+ Possible options are:
+
+ 	a  = aspect ratio (width/height);
+ 	e  = error correction level (0-8);
+
+ 	Macro Control Block options:
+
+ 	t  = total number of macro segments;
+ 	s  = macro segment index (0-99998);
+ 	f  = file ID;
+ 	o0 = File Name (text);
+ 	o1 = Segment Count (numeric);
+ 	o2 = Time Stamp (numeric);
+ 	o3 = Sender (text);
+ 	o4 = Addressee (text);
+ 	o5 = File Size (numeric);
+ 	o6 = Checksum (numeric).
+
+ Parameters t, s and f are required for a Macro Control Block, all other parametrs are optional.
+ To use a comma character ',' on text options, replace it with the character 255: "\xff".
+
+*/
+
+$pdf->write2DBarcode('www.tcpdf.org', 'PDF417', 80, 90, 0, 30, $style, 'N');
+$pdf->Text(80, 85, 'PDF417 (ISO/IEC 15438:2006)');
+
+// -------------------------------------------------------------------
+// DATAMATRIX (ISO/IEC 16022:2006)
+
+$pdf->write2DBarcode('http://www.tcpdf.org', 'DATAMATRIX', 80, 150, 50, 50, $style, 'N');
+$pdf->Text(80, 145, 'DATAMATRIX (ISO/IEC 16022:2006)');
+
+// -------------------------------------------------------------------
+
+// new style
+$style = array(
+	'border' => 2,
+	'padding' => 'auto',
+	'fgcolor' => array(0,0,255),
+	'bgcolor' => array(255,255,64)
+);
+
+// QRCODE,H : QR-CODE Best error correction
+$pdf->write2DBarcode('www.tcpdf.org', 'QRCODE,H', 80, 210, 50, 50, $style, 'N');
+$pdf->Text(80, 205, 'QRCODE H - COLORED');
+
+// new style
+$style = array(
+	'border' => false,
+	'padding' => 0,
+	'fgcolor' => array(128,0,0),
+	'bgcolor' => false
+);
+
+// QRCODE,H : QR-CODE Best error correction
+$pdf->write2DBarcode('www.tcpdf.org', 'QRCODE,H', 140, 210, 50, 50, $style, 'N');
+$pdf->Text(140, 205, 'QRCODE H - NO PADDING');
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_050.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_051.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_051.php
new file mode 100644
index 00000000..dc2d94ec
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_051.php
@@ -0,0 +1,145 @@
+<?php
+//============================================================+
+// File name   : example_051.php
+// Begin       : 2009-04-16
+// Last Update : 2013-05-14
+//
+// Description : Example 051 for TCPDF class
+//               Full page background
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Full page background
+ * @author Nicola Asuni
+ * @since 2009-04-16
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+
+// Extend the TCPDF class to create custom Header and Footer
+class MYPDF extends TCPDF {
+	//Page header
+	public function Header() {
+		// get the current page break margin
+		$bMargin = $this->getBreakMargin();
+		// get current auto-page-break mode
+		$auto_page_break = $this->AutoPageBreak;
+		// disable auto-page-break
+		$this->SetAutoPageBreak(false, 0);
+		// set bacground image
+		$img_file = K_PATH_IMAGES.'image_demo.jpg';
+		$this->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
+		// restore auto-page-break status
+		$this->SetAutoPageBreak($auto_page_break, $bMargin);
+		// set the starting point for the page content
+		$this->setPageMark();
+	}
+}
+
+// create new PDF document
+$pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 051');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(0);
+$pdf->SetFooterMargin(0);
+
+// remove default footer
+$pdf->setPrintFooter(false);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('times', '', 48);
+
+// add a page
+$pdf->AddPage();
+
+// Print a text
+$html = '<span style="background-color:yellow;color:blue;">&nbsp;PAGE 1&nbsp;</span>
+<p stroke="0.2" fill="true" strokecolor="yellow" color="blue" style="font-family:helvetica;font-weight:bold;font-size:26pt;">You can set a full page background.</p>';
+$pdf->writeHTML($html, true, false, true, false, '');
+
+
+// add a page
+$pdf->AddPage();
+
+// Print a text
+$html = '<span style="background-color:yellow;color:blue;">&nbsp;PAGE 2&nbsp;</span>';
+$pdf->writeHTML($html, true, false, true, false, '');
+
+// --- example with background set on page ---
+
+// remove default header
+$pdf->setPrintHeader(false);
+
+// add a page
+$pdf->AddPage();
+
+
+// -- set new background ---
+
+// get the current page break margin
+$bMargin = $pdf->getBreakMargin();
+// get current auto-page-break mode
+$auto_page_break = $pdf->getAutoPageBreak();
+// disable auto-page-break
+$pdf->SetAutoPageBreak(false, 0);
+// set bacground image
+$img_file = K_PATH_IMAGES.'image_demo.jpg';
+$pdf->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
+// restore auto-page-break status
+$pdf->SetAutoPageBreak($auto_page_break, $bMargin);
+// set the starting point for the page content
+$pdf->setPageMark();
+
+
+// Print a text
+$html = '<span style="color:white;text-align:center;font-weight:bold;font-size:80pt;">PAGE 3</span>';
+$pdf->writeHTML($html, true, false, true, false, '');
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_051.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_052.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_052.php
new file mode 100644
index 00000000..2af27f08
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_052.php
@@ -0,0 +1,121 @@
+<?php
+//============================================================+
+// File name   : example_052.php
+// Begin       : 2009-05-07
+// Last Update : 2013-05-14
+//
+// Description : Example 052 for TCPDF class
+//               Certification Signature (experimental)
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Certification Signature (experimental)
+ * @author Nicola Asuni
+ * @since 2009-05-07
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 052');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 052', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+/*
+NOTES:
+ - To create self-signed signature: openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt
+ - To export crt to p12: openssl pkcs12 -export -in tcpdf.crt -out tcpdf.p12
+ - To convert pfx certificate to pem: openssl pkcs12 -in tcpdf.pfx -out tcpdf.crt -nodes
+*/
+
+// set certificate file
+$certificate = 'file://data/cert/tcpdf.crt';
+
+// set additional information
+$info = array(
+	'Name' => 'TCPDF',
+	'Location' => 'Office',
+	'Reason' => 'Testing TCPDF',
+	'ContactInfo' => 'http://www.tcpdf.org',
+	);
+
+// set document signature
+$pdf->setSignature($certificate, $certificate, 'tcpdfdemo', '', 2, $info);
+
+// set font
+$pdf->SetFont('helvetica', '', 12);
+
+// add a page
+$pdf->AddPage();
+
+// print a line of text
+$text = 'This is a <b color="#FF0000">digitally signed document</b> using the default (example) <b>tcpdf.crt</b> certificate.<br />To validate this signature you have to load the <b color="#006600">tcpdf.fdf</b> on the Arobat Reader to add the certificate to <i>List of Trusted Identities</i>.<br /><br />For more information check the source code of this example and the source code documentation for the <i>setSignature()</i> method.<br /><br /><a href="http://www.tcpdf.org">www.tcpdf.org</a>';
+$pdf->writeHTML($text, true, 0, true, 0);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// *** set signature appearance ***
+
+// create content for signature (image and/or text)
+$pdf->Image('images/tcpdf_signature.png', 180, 60, 15, 15, 'PNG');
+
+// define active area for signature appearance
+$pdf->setSignatureAppearance(180, 60, 15, 15);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// *** set an empty signature appearance ***
+$pdf->addEmptySignatureAppearance(180, 80, 15, 15);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_052.pdf', 'D');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_053.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_053.php
new file mode 100644
index 00000000..8c784d5f
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_053.php
@@ -0,0 +1,108 @@
+<?php
+//============================================================+
+// File name   : example_053.php
+// Begin       : 2009-09-02
+// Last Update : 2013-05-14
+//
+// Description : Example 053 for TCPDF class
+//               Javascript example.
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Javascript example.
+ * @author Nicola Asuni
+ * @since 2009-09-02
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 053');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 053', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('times', '', 14);
+
+// add a page
+$pdf->AddPage();
+
+// print a some of text
+$text = 'This is an example of <strong>JavaScript</strong> usage on PDF documents.<br /><br />For more information check the source code of this example, the source code documentation for the <i>IncludeJS()</i> method and the <i>JavaScript for Acrobat API Reference</i> guide.<br /><br /><a href="http://www.tcpdf.org">www.tcpdf.org</a>';
+$pdf->writeHTML($text, true, 0, true, 0);
+
+// write some JavaScript code
+$js = <<<EOD
+app.alert('JavaScript Popup Example', 3, 0, 'Welcome');
+var cResponse = app.response({
+	cQuestion: 'How are you today?',
+	cTitle: 'Your Health Status',
+	cDefault: 'Fine',
+	cLabel: 'Response:'
+});
+if (cResponse == null) {
+	app.alert('Thanks for trying anyway.', 3, 0, 'Result');
+} else {
+	app.alert('You responded, "'+cResponse+'", to the health question.', 3, 0, 'Result');
+}
+EOD;
+
+// force print dialog
+$js .= 'print(true);';
+
+// set javascript
+$pdf->IncludeJS($js);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_053.pdf', 'D');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_054.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_054.php
new file mode 100644
index 00000000..af4545df
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_054.php
@@ -0,0 +1,128 @@
+<?php
+//============================================================+
+// File name   : example_054.php
+// Begin       : 2009-09-07
+// Last Update : 2013-05-14
+//
+// Description : Example 054 for TCPDF class
+//               XHTML Forms
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: XHTML Forms
+ * @author Nicola Asuni
+ * @since 2009-09-07
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 054');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 054', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// IMPORTANT: disable font subsetting to allow users editing the document
+$pdf->setFontSubsetting(false);
+
+// set font
+$pdf->SetFont('helvetica', '', 10, '', false);
+
+// add a page
+$pdf->AddPage();
+
+// create some HTML content
+$html = <<<EOD
+<h1>XHTML Form Example</h1>
+<form method="post" action="http://localhost/printvars.php" enctype="multipart/form-data">
+<label for="name">name:</label> <input type="text" name="name" value="" size="20" maxlength="30" /><br />
+<label for="password">password:</label> <input type="password" name="password" value="" size="20" maxlength="30" /><br /><br />
+<label for="infile">file:</label> <input type="file" name="userfile" size="20" /><br /><br />
+<input type="checkbox" name="agree" value="1" checked="checked" /> <label for="agree">I agree </label><br /><br />
+<input type="radio" name="radioquestion" id="rqa" value="1" /> <label for="rqa">one</label><br />
+<input type="radio" name="radioquestion" id="rqb" value="2" checked="checked"/> <label for="rqb">two</label><br />
+<input type="radio" name="radioquestion" id="rqc" value="3" /> <label for="rqc">three</label><br /><br />
+<label for="selection">select:</label>
+<select name="selection" size="0">
+	<option value="0">zero</option>
+	<option value="1">one</option>
+	<option value="2">two</option>
+	<option value="3">three</option>
+</select><br /><br />
+<label for="selection">select:</label>
+<select name="multiselection" size="2" multiple="multiple">
+	<option value="0">zero</option>
+	<option value="1">one</option>
+	<option value="2">two</option>
+	<option value="3">three</option>
+</select><br /><br /><br />
+<label for="text">text area:</label><br />
+<textarea cols="40" rows="3" name="text">line one
+line two</textarea><br />
+<br /><br /><br />
+<input type="reset" name="reset" value="Reset" />
+<input type="submit" name="submit" value="Submit" />
+<input type="button" name="print" value="Print" onclick="print()" />
+<input type="hidden" name="hiddenfield" value="OK" />
+<br />
+</form>
+EOD;
+
+// output the HTML content
+$pdf->writeHTML($html, true, 0, true, 0);
+
+// reset pointer to the last page
+$pdf->lastPage();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_054.pdf', 'D');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_055.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_055.php
new file mode 100644
index 00000000..1dfff3c9
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_055.php
@@ -0,0 +1,115 @@
+<?php
+//============================================================+
+// File name   : example_055.php
+// Begin       : 2009-10-21
+// Last Update : 2013-05-14
+//
+// Description : Example 055 for TCPDF class
+//               Display all characters available on core fonts.
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Display all characters available on core fonts.
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: XHTML Forms
+ * @author Nicola Asuni
+ * @since 2009-10-21
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 055');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 055', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 14);
+
+// array of font names
+$core_fonts = array('courier', 'courierB', 'courierI', 'courierBI', 'helvetica', 'helveticaB', 'helveticaI', 'helveticaBI', 'times', 'timesB', 'timesI', 'timesBI', 'symbol', 'zapfdingbats');
+
+// set fill color
+$pdf->SetFillColor(221,238,255);
+
+// create one HTML table for each core font
+foreach($core_fonts as $font) {
+	// add a page
+	$pdf->AddPage();
+
+	// Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='', $stretch=0, $ignore_min_height=false, $calign='T', $valign='M')
+
+	// set font for title
+	$pdf->SetFont('helvetica', 'B', 16);
+
+	// print font name
+	$pdf->Cell(0, 10, 'FONT: '.$font, 1, 1, 'C', true, '', 0, false, 'T', 'M');
+
+	// set font for chars
+	$pdf->SetFont($font, '', 16);
+
+	// print each character
+	for ($i = 0; $i < 256; ++$i) {
+		if (($i > 0) AND (($i % 16) == 0)) {
+			$pdf->Ln();
+		}
+		$pdf->Cell(11.25, 11.25, $pdf->unichr($i), 1, 0, 'C', false, '', 0, false, 'T', 'M');
+	}
+
+	$pdf->Ln(20);
+
+	// print a pangram
+	$pdf->Cell(0, 0, 'The quick brown fox jumps over the lazy dog', 0, 1, 'C', false, '', 0, false, 'T', 'M');
+}
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_055.pdf', 'D');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_056.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_056.php
new file mode 100644
index 00000000..c3dfe255
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_056.php
@@ -0,0 +1,133 @@
+<?php
+//============================================================+
+// File name   : example_056.php
+// Begin       : 2010-03-26
+// Last Update : 2013-09-30
+//
+// Description : Example 056 for TCPDF class
+//               Crop marks and color registration bars
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Crop marks and color registration bars
+ * @author Nicola Asuni
+ * @since 2010-03-26
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 056');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 056', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 18);
+
+// add a page
+$pdf->AddPage();
+
+$pdf->Write(0, 'Example of Registration Marks, Crop Marks and Color Bars', '', 0, 'L', true, 0, false, false, 0);
+
+$pdf->Ln(5);
+
+// color registration bars
+
+// A,W,R,G,B,C,M,Y,K,RGB,CMYK,ALL,ALLSPOT,<SPOT_COLOR_NAME>
+$pdf->colorRegistrationBar(50, 70, 40, 40, true, false, 'A,R,G,B,C,M,Y,K');
+$pdf->colorRegistrationBar(90, 70, 40, 40, true, true, 'A,R,G,B,C,M,Y,K');
+$pdf->colorRegistrationBar(50, 115, 80, 5, false, true, 'A,W,R,G,B,C,M,Y,K,ALL');
+$pdf->colorRegistrationBar(135, 70, 5, 50, false, false, 'A,W,R,G,B,C,M,Y,K,ALL');
+
+// corner crop marks
+
+$pdf->cropMark(50, 70, 10, 10, 'TL');
+$pdf->cropMark(140, 70, 10, 10, 'TR');
+$pdf->cropMark(50, 120, 10, 10, 'BL');
+$pdf->cropMark(140, 120, 10, 10, 'BR');
+
+// various crop marks
+
+$pdf->cropMark(95, 65, 5, 5, 'LEFT,TOP,RIGHT', array(255,0,0));
+$pdf->cropMark(95, 125, 5, 5, 'LEFT,BOTTOM,RIGHT', array(255,0,0));
+
+$pdf->cropMark(45, 95, 5, 5, 'TL,BL', array(0,255,0));
+$pdf->cropMark(145, 95, 5, 5, 'TR,BR', array(0,255,0));
+
+$pdf->cropMark(95, 140, 5, 5, 'A,D', array(0,0,255));
+
+// registration marks
+
+$pdf->registrationMark(40, 60, 5, false);
+$pdf->registrationMark(150, 60, 5, true, array(0,0,0), array(255,255,0));
+$pdf->registrationMark(40, 130, 5, true, array(0,0,0), array(255,255,0));
+$pdf->registrationMark(150, 130, 5, false, array(100,100,100,100,'All'), array(0,0,0,0,'None'));
+
+// test registration bar with spot colors
+
+$pdf->AddSpotColor('My TCPDF Dark Green', 100, 50, 80, 45);
+$pdf->AddSpotColor('My TCPDF Light Yellow', 0, 0, 55, 0);
+$pdf->AddSpotColor('My TCPDF Black', 0, 0, 0, 100);
+$pdf->AddSpotColor('My TCPDF Red', 30, 100, 90, 10);
+$pdf->AddSpotColor('My TCPDF Green', 100, 30, 100, 0);
+$pdf->AddSpotColor('My TCPDF Blue', 100, 60, 10, 5);
+$pdf->AddSpotColor('My TCPDF Yellow', 0, 20, 100, 0);
+
+$pdf->colorRegistrationBar(50, 150, 80, 10, false, true, 'ALLSPOT');
+
+// CMYK registration mark
+$pdf->registrationMarkCMYK(150, 155, 8);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_056.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_057.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_057.php
new file mode 100644
index 00000000..9714b40b
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_057.php
@@ -0,0 +1,268 @@
+<?php
+//============================================================+
+// File name   : example_057.php
+// Begin       : 2010-04-03
+// Last Update : 2013-05-14
+//
+// Description : Example 057 for TCPDF class
+//               Cell vertical alignments
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Cell vertical alignments
+ * @author Nicola Asuni
+ * @since 2008-03-04
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 057');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 057', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', 'B', 20);
+
+// add a page
+$pdf->AddPage();
+
+$pdf->Write(0, 'Example of alignment options for Cell()', '', 0, 'L', true, 0, false, false, 0);
+
+$pdf->SetFont('helvetica', '', 11);
+
+// set border width
+$pdf->SetLineWidth(0.7);
+
+// set color for cell border
+$pdf->SetDrawColor(0,128,255);
+
+$pdf->setCellHeightRatio(3);
+
+$pdf->SetXY(15, 60);
+
+// text on center
+$pdf->Cell(30, 0, 'Top-Center', 1, $ln=0, 'C', 0, '', 0, false, 'T', 'C');
+$pdf->Cell(30, 0, 'Center-Center', 1, $ln=0, 'C', 0, '', 0, false, 'C', 'C');
+$pdf->Cell(30, 0, 'Bottom-Center', 1, $ln=0, 'C', 0, '', 0, false, 'B', 'C');
+$pdf->Cell(30, 0, 'Ascent-Center', 1, $ln=0, 'C', 0, '', 0, false, 'A', 'C');
+$pdf->Cell(30, 0, 'Baseline-Center', 1, $ln=0, 'C', 0, '', 0, false, 'L', 'C');
+$pdf->Cell(30, 0, 'Descent-Center', 1, $ln=0, 'C', 0, '', 0, false, 'D', 'C');
+
+
+$pdf->SetXY(15, 90);
+
+// text on top
+$pdf->Cell(30, 0, 'Top-Top', 1, $ln=0, 'C', 0, '', 0, false, 'T', 'T');
+$pdf->Cell(30, 0, 'Center-Top', 1, $ln=0, 'C', 0, '', 0, false, 'C', 'T');
+$pdf->Cell(30, 0, 'Bottom-Top', 1, $ln=0, 'C', 0, '', 0, false, 'B', 'T');
+$pdf->Cell(30, 0, 'Ascent-Top', 1, $ln=0, 'C', 0, '', 0, false, 'A', 'T');
+$pdf->Cell(30, 0, 'Baseline-Top', 1, $ln=0, 'C', 0, '', 0, false, 'L', 'T');
+$pdf->Cell(30, 0, 'Descent-Top', 1, $ln=0, 'C', 0, '', 0, false, 'D', 'T');
+
+
+$pdf->SetXY(15, 120);
+
+// text on bottom
+$pdf->Cell(30, 0, 'Top-Bottom', 1, $ln=0, 'C', 0, '', 0, false, 'T', 'B');
+$pdf->Cell(30, 0, 'Center-Bottom', 1, $ln=0, 'C', 0, '', 0, false, 'C', 'B');
+$pdf->Cell(30, 0, 'Bottom-Bottom', 1, $ln=0, 'C', 0, '', 0, false, 'B', 'B');
+$pdf->Cell(30, 0, 'Ascent-Bottom', 1, $ln=0, 'C', 0, '', 0, false, 'A', 'B');
+$pdf->Cell(30, 0, 'Baseline-Bottom', 1, $ln=0, 'C', 0, '', 0, false, 'L', 'B');
+$pdf->Cell(30, 0, 'Descent-Bottom', 1, $ln=0, 'C', 0, '', 0, false, 'D', 'B');
+
+
+// draw some reference lines
+$linestyle = array('width' => 0.1, 'cap' => 'butt', 'join' => 'miter', 'dash' => '', 'phase' => 0, 'color' => array(255, 0, 0));
+$pdf->Line(15, 60, 195, 60, $linestyle);
+$pdf->Line(15, 90, 195, 90, $linestyle);
+$pdf->Line(15, 120, 195, 120, $linestyle);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// Print an image to explain cell measures
+
+$pdf->Image('images/tcpdf_cell.png', 15, 160, 100, 100, 'PNG', '', '', false, 300, '', false, false, 0, false, false, false);
+$legend = 'LEGEND:
+
+X: cell x top-left origin (top-right for RTL)
+Y: cell y top-left origin (top-right for RTL)
+CW: cell width
+CH: cell height
+LW: line width
+NRL: normal line position
+EXT: external line position
+INT: internal line position
+ML: margin left
+MR: margin right
+MT: margin top
+MB: margin bottom
+PL: padding left
+PR: padding right
+PT: padding top
+PB: padding bottom
+TW: text width
+FA: font ascent
+FB: font baseline
+FD: font descent';
+$pdf->SetFont('helvetica', '', 10);
+$pdf->setCellHeightRatio(1.25);
+$pdf->MultiCell(0, 0, $legend, 0, 'L', false, 1, 125, 160, true, 0, false, true, 0, 'T', false);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// CELL BORDERS
+
+// add a page
+$pdf->AddPage();
+
+$pdf->SetFont('helvetica', 'B', 20);
+
+$pdf->Write(0, 'Example of borders for Cell()', '', 0, 'L', true, 0, false, false, 0);
+
+$pdf->SetFont('helvetica', '', 11);
+
+// set border width
+$pdf->SetLineWidth(0.508);
+
+// set color for cell border
+$pdf->SetDrawColor(0,128,255);
+
+// set filling color
+$pdf->SetFillColor(255,255,128);
+
+// set cell height ratio
+$pdf->setCellHeightRatio(3);
+
+$pdf->Cell(30, 0, '1', 1, 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'LTRB', 'LTRB', 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'LTR', 'LTR', 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'TRB', 'TRB', 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'LRB', 'LRB', 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'LTB', 'LTB', 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'LT', 'LT', 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'TR', 'TR', 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'RB', 'RB', 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'LB', 'LB', 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'LR', 'LR', 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'TB', 'TB', 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'L', 'L', 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'T', 'T', 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'R', 'R', 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(2);
+$pdf->Cell(30, 0, 'B', 'B', 1, 'C', 1, '', 0, false, 'T', 'C');
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// ADVANCED SETTINGS FOR CELL BORDERS
+
+// add a page
+$pdf->AddPage();
+
+$pdf->SetFont('helvetica', 'B', 20);
+
+$pdf->Write(0, 'Example of advanced border settings for Cell()', '', 0, 'L', true, 0, false, false, 0);
+
+$pdf->SetFont('helvetica', '', 11);
+
+// set border width
+$pdf->SetLineWidth(1);
+
+// set color for cell border
+$pdf->SetDrawColor(0,128,255);
+
+// set filling color
+$pdf->SetFillColor(255,255,128);
+
+$border = array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(255, 0, 0)));
+$pdf->Cell(30, 0, 'LTRB', $border, 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(5);
+
+$border = array(
+'L' => array('width' => 2, 'cap' => 'square', 'join' => 'miter', 'dash' => 0, 'color' => array(255, 0, 0)),
+'R' => array('width' => 2, 'cap' => 'square', 'join' => 'miter', 'dash' => 0, 'color' => array(255, 0, 255)),
+'T' => array('width' => 2, 'cap' => 'square', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 255, 0)),
+'B' => array('width' => 2, 'cap' => 'square', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 255)));
+$pdf->Cell(30, 0, 'LTRB', $border, 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(5);
+
+$border = array('mode' => 'ext', 'LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(255, 0, 0)));
+$pdf->Cell(30, 0, 'LTRB EXT', $border, 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(5);
+
+$border = array('mode' => 'int', 'LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(255, 0, 0)));
+$pdf->Cell(30, 0, 'LTRB INT', $border, 1, 'C', 1, '', 0, false, 'T', 'C');
+$pdf->Ln(5);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// reset pointer to the last page
+$pdf->lastPage();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_057.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_058.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_058.php
new file mode 100644
index 00000000..1e472fbc
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_058.php
@@ -0,0 +1,94 @@
+<?php
+//============================================================+
+// File name   : example_058.php
+// Begin       : 2010-04-22
+// Last Update : 2013-05-14
+//
+// Description : Example 058 for TCPDF class
+//               SVG Image
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: SVG Image
+ * @author Nicola Asuni
+ * @since 2010-05-02
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 058');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 058', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 10);
+
+// add a page
+$pdf->AddPage();
+
+// NOTE: Uncomment the following line to rasterize SVG image using the ImageMagick library.
+//$pdf->setRasterizeVectorImages(true);
+
+$pdf->ImageSVG($file='images/testsvg.svg', $x=15, $y=30, $w='', $h='', $link='http://www.tcpdf.org', $align='', $palign='', $border=1, $fitonpage=false);
+
+$pdf->ImageSVG($file='images/tux.svg', $x=30, $y=100, $w='', $h=100, $link='', $align='', $palign='', $border=0, $fitonpage=false);
+
+$pdf->SetFont('helvetica', '', 8);
+$pdf->SetY(195);
+$txt = '© The copyright holder of the above Tux image is Larry Ewing, allows anyone to use it for any purpose, provided that the copyright holder is properly attributed. Redistribution, derivative work, commercial use, and all other use is permitted.';
+$pdf->Write(0, $txt, '', 0, 'L', true, 0, false, false, 0);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_058.pdf', 'D');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_059.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_059.php
new file mode 100644
index 00000000..9396784d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_059.php
@@ -0,0 +1,190 @@
+<?php
+//============================================================+
+// File name   : example_059.php
+// Begin       : 2010-05-06
+// Last Update : 2013-05-14
+//
+// Description : Example 059 for TCPDF class
+//               Table Of Content using HTML templates.
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Table Of Content using HTML templates.
+ * @author Nicola Asuni
+ * @since 2010-05-06
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+/**
+ * TCPDF class extension with custom header and footer for TOC page
+ */
+class TOC_TCPDF extends TCPDF {
+
+	/**
+ 	 * Overwrite Header() method.
+	 * @public
+	 */
+	public function Header() {
+		if ($this->tocpage) {
+			// *** replace the following parent::Header() with your code for TOC page
+			parent::Header();
+		} else {
+			// *** replace the following parent::Header() with your code for normal pages
+			parent::Header();
+		}
+	}
+
+	/**
+ 	 * Overwrite Footer() method.
+	 * @public
+	 */
+	public function Footer() {
+		if ($this->tocpage) {
+			// *** replace the following parent::Footer() with your code for TOC page
+			parent::Footer();
+		} else {
+			// *** replace the following parent::Footer() with your code for normal pages
+			parent::Footer();
+		}
+	}
+
+} // end of class
+
+// create new PDF document
+$pdf = new TOC_TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 059');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 059', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// set font
+$pdf->SetFont('helvetica', '', 10);
+
+// ---------------------------------------------------------
+
+// create some content ...
+
+// add a page
+$pdf->AddPage();
+
+// set a bookmark for the current position
+$pdf->Bookmark('Chapter 1', 0, 0, '', 'B', array(0,64,128));
+
+// print a line using Cell()
+$pdf->Cell(0, 10, 'Chapter 1', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Bookmark('Paragraph 1.1', 1, 0, '', '', array(128,0,0));
+$pdf->Cell(0, 10, 'Paragraph 1.1', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Bookmark('Paragraph 1.2', 1, 0, '', '', array(128,0,0));
+$pdf->Cell(0, 10, 'Paragraph 1.2', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Bookmark('Sub-Paragraph 1.2.1', 2, 0, '', 'I', array(0,128,0));
+$pdf->Cell(0, 10, 'Sub-Paragraph 1.2.1', 0, 1, 'L');
+
+$pdf->AddPage();
+$pdf->Bookmark('Paragraph 1.3', 1, 0, '', '', array(128,0,0));
+$pdf->Cell(0, 10, 'Paragraph 1.3', 0, 1, 'L');
+
+// add some pages and bookmarks
+for ($i = 2; $i < 12; $i++) {
+	$pdf->AddPage();
+	$pdf->Bookmark('Chapter '.$i, 0, 0, '', 'B', array(0,64,128));
+	$pdf->Cell(0, 10, 'Chapter '.$i, 0, 1, 'L');
+}
+
+
+// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+
+
+// add a new page for TOC
+$pdf->addTOCPage();
+
+// write the TOC title and/or other elements on the TOC page
+$pdf->SetFont('times', 'B', 16);
+$pdf->MultiCell(0, 0, 'Table Of Content', 0, 'C', 0, 1, '', '', true, 0);
+$pdf->Ln();
+$pdf->SetFont('helvetica', '', 10);
+
+// define styles for various bookmark levels
+$bookmark_templates = array();
+
+/*
+ * The key of the $bookmark_templates array represent the bookmark level (from 0 to n).
+ * The following templates will be replaced with proper content:
+ *     #TOC_DESCRIPTION#    this will be replaced with the bookmark description;
+ *     #TOC_PAGE_NUMBER#    this will be replaced with page number.
+ *
+ * NOTES:
+ *     If you want to align the page number on the right you have to use a monospaced font like courier, otherwise you can left align using any font type.
+ *     The following is just an example, you can get various styles by combining various HTML elements.
+ */
+
+// A monospaced font for the page number is mandatory to get the right alignment
+$bookmark_templates[0] = '<table border="0" cellpadding="0" cellspacing="0" style="background-color:#EEFAFF"><tr><td width="155mm"><span style="font-family:times;font-weight:bold;font-size:12pt;color:black;">#TOC_DESCRIPTION#</span></td><td width="25mm"><span style="font-family:courier;font-weight:bold;font-size:12pt;color:black;" align="right">#TOC_PAGE_NUMBER#</span></td></tr></table>';
+$bookmark_templates[1] = '<table border="0" cellpadding="0" cellspacing="0"><tr><td width="5mm">&nbsp;</td><td width="150mm"><span style="font-family:times;font-size:11pt;color:green;">#TOC_DESCRIPTION#</span></td><td width="25mm"><span style="font-family:courier;font-weight:bold;font-size:11pt;color:green;" align="right">#TOC_PAGE_NUMBER#</span></td></tr></table>';
+$bookmark_templates[2] = '<table border="0" cellpadding="0" cellspacing="0"><tr><td width="10mm">&nbsp;</td><td width="145mm"><span style="font-family:times;font-size:10pt;color:#666666;"><i>#TOC_DESCRIPTION#</i></span></td><td width="25mm"><span style="font-family:courier;font-weight:bold;font-size:10pt;color:#666666;" align="right">#TOC_PAGE_NUMBER#</span></td></tr></table>';
+// add other bookmark level templates here ...
+
+// add table of content at page 1
+// (check the example n. 45 for a text-only TOC
+$pdf->addHTMLTOC(1, 'INDEX', $bookmark_templates, true, 'B', array(128,0,0));
+
+// end of TOC page
+$pdf->endTOCPage();
+
+// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_059.pdf', 'D');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_060.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_060.php
new file mode 100644
index 00000000..03bad28a
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_060.php
@@ -0,0 +1,108 @@
+<?php
+//============================================================+
+// File name   : example_060.php
+// Begin       : 2010-05-17
+// Last Update : 2013-05-14
+//
+// Description : Example 060 for TCPDF class
+//               Advanced page settings.
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Advanced page settings.
+ * @author Nicola Asuni
+ * @since 2010-05-17
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 060');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 060', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// set font
+$pdf->SetFont('helvetica', '', 20);
+
+// ---------------------------------------------------------
+
+// set page format (read source code documentation for further information)
+$page_format = array(
+	'MediaBox' => array ('llx' => 0, 'lly' => 0, 'urx' => 210, 'ury' => 297),
+	'CropBox' => array ('llx' => 0, 'lly' => 0, 'urx' => 210, 'ury' => 297),
+	'BleedBox' => array ('llx' => 5, 'lly' => 5, 'urx' => 205, 'ury' => 292),
+	'TrimBox' => array ('llx' => 10, 'lly' => 10, 'urx' => 200, 'ury' => 287),
+	'ArtBox' => array ('llx' => 15, 'lly' => 15, 'urx' => 195, 'ury' => 282),
+	'Dur' => 3,
+	'trans' => array(
+		'D' => 1.5,
+		'S' => 'Split',
+		'Dm' => 'V',
+		'M' => 'O'
+	),
+	'Rotate' => 90,
+	'PZ' => 1,
+);
+
+// Check the example n. 29 for viewer preferences
+
+// add first page ---
+$pdf->AddPage('P', $page_format, false, false);
+$pdf->Cell(0, 12, 'First Page', 1, 1, 'C');
+
+// add second page ---
+$page_format['Rotate'] = 270;
+$pdf->AddPage('P', $page_format, false, false);
+$pdf->Cell(0, 12, 'Second Page', 1, 1, 'C');
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_060.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_061.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_061.php
new file mode 100644
index 00000000..11e7e28f
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_061.php
@@ -0,0 +1,250 @@
+<?php
+//============================================================+
+// File name   : example_061.php
+// Begin       : 2010-05-24
+// Last Update : 2013-05-14
+//
+// Description : Example 061 for TCPDF class
+//               XHTML + CSS
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: XHTML + CSS
+ * @author Nicola Asuni
+ * @since 2010-05-25
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 061');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 061', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 10);
+
+// add a page
+$pdf->AddPage();
+
+/* NOTE:
+ * *********************************************************
+ * You can load external XHTML using :
+ *
+ * $html = file_get_contents('/path/to/your/file.html');
+ *
+ * External CSS files will be automatically loaded.
+ * Sometimes you need to fix the path of the external CSS.
+ * *********************************************************
+ */
+
+// define some HTML content with style
+$html = <<<EOF
+<!-- EXAMPLE OF CSS STYLE -->
+<style>
+	h1 {
+		color: navy;
+		font-family: times;
+		font-size: 24pt;
+		text-decoration: underline;
+	}
+	p.first {
+		color: #003300;
+		font-family: helvetica;
+		font-size: 12pt;
+	}
+	p.first span {
+		color: #006600;
+		font-style: italic;
+	}
+	p#second {
+		color: rgb(00,63,127);
+		font-family: times;
+		font-size: 12pt;
+		text-align: justify;
+	}
+	p#second > span {
+		background-color: #FFFFAA;
+	}
+	table.first {
+		color: #003300;
+		font-family: helvetica;
+		font-size: 8pt;
+		border-left: 3px solid red;
+		border-right: 3px solid #FF00FF;
+		border-top: 3px solid green;
+		border-bottom: 3px solid blue;
+		background-color: #ccffcc;
+	}
+	td {
+		border: 2px solid blue;
+		background-color: #ffffee;
+	}
+	td.second {
+		border: 2px dashed green;
+	}
+	div.test {
+		color: #CC0000;
+		background-color: #FFFF66;
+		font-family: helvetica;
+		font-size: 10pt;
+		border-style: solid solid solid solid;
+		border-width: 2px 2px 2px 2px;
+		border-color: green #FF00FF blue red;
+		text-align: center;
+	}
+</style>
+
+<h1 class="title">Example of <i style="color:#990000">XHTML + CSS</i></h1>
+
+<p class="first">Example of paragraph with class selector. <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue. Sed vel velit erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras eget velit nulla, eu sagittis elit. Nunc ac arcu est, in lobortis tellus. Praesent condimentum rhoncus sodales. In hac habitasse platea dictumst. Proin porta eros pharetra enim tincidunt dignissim nec vel dolor. Cras sapien elit, ornare ac dignissim eu, ultricies ac eros. Maecenas augue magna, ultrices a congue in, mollis eu nulla. Nunc venenatis massa at est eleifend faucibus. Vivamus sed risus lectus, nec interdum nunc.</span></p>
+
+<p id="second">Example of paragraph with ID selector. <span>Fusce et felis vitae diam lobortis sollicitudin. Aenean tincidunt accumsan nisi, id vehicula quam laoreet elementum. Phasellus egestas interdum erat, et viverra ipsum ultricies ac. Praesent sagittis augue at augue volutpat eleifend. Cras nec orci neque. Mauris bibendum posuere blandit. Donec feugiat mollis dui sit amet pellentesque. Sed a enim justo. Donec tincidunt, nisl eget elementum aliquam, odio ipsum ultrices quam, eu porttitor ligula urna at lorem. Donec varius, eros et convallis laoreet, ligula tellus consequat felis, ut ornare metus tellus sodales velit. Duis sed diam ante. Ut rutrum malesuada massa, vitae consectetur ipsum rhoncus sed. Suspendisse potenti. Pellentesque a congue massa.</span></p>
+
+<div class="test">example of DIV with border and fill.<br />Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus.</div>
+
+<br />
+
+<table class="first" cellpadding="4" cellspacing="6">
+ <tr>
+  <td width="30" align="center"><b>No.</b></td>
+  <td width="140" align="center" bgcolor="#FFFF00"><b>XXXX</b></td>
+  <td width="140" align="center"><b>XXXX</b></td>
+  <td width="80" align="center"> <b>XXXX</b></td>
+  <td width="80" align="center"><b>XXXX</b></td>
+  <td width="45" align="center"><b>XXXX</b></td>
+ </tr>
+ <tr>
+  <td width="30" align="center">1.</td>
+  <td width="140" rowspan="6" class="second">XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX</td>
+  <td width="140">XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td width="80">XXXX</td>
+  <td align="center" width="45">XXXX<br />XXXX</td>
+ </tr>
+ <tr>
+  <td width="30" align="center" rowspan="3">2.</td>
+  <td width="140" rowspan="3">XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td align="center" width="45">XXXX<br />XXXX</td>
+ </tr>
+ <tr>
+  <td width="80">XXXX<br />XXXX<br />XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td align="center" width="45">XXXX<br />XXXX</td>
+ </tr>
+ <tr>
+  <td width="80" rowspan="2" >XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td align="center" width="45">XXXX<br />XXXX</td>
+ </tr>
+ <tr>
+  <td width="30" align="center">3.</td>
+  <td width="140">XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td align="center" width="45">XXXX<br />XXXX</td>
+ </tr>
+ <tr bgcolor="#FFFF80">
+  <td width="30" align="center">4.</td>
+  <td width="140" bgcolor="#00CC00" color="#FFFF00">XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td width="80">XXXX<br />XXXX</td>
+  <td align="center" width="45">XXXX<br />XXXX</td>
+ </tr>
+</table>
+EOF;
+
+// output the HTML content
+$pdf->writeHTML($html, true, false, true, false, '');
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// add a page
+$pdf->AddPage();
+
+$html = '
+<h1>HTML TIPS & TRICKS</h1>
+
+<h3>REMOVE CELL PADDING</h3>
+<pre>$pdf->SetCellPadding(0);</pre>
+This is used to remove any additional vertical space inside a single cell of text.
+
+<h3>REMOVE TAG TOP AND BOTTOM MARGINS</h3>
+<pre>$tagvs = array(\'p\' => array(0 => array(\'h\' => 0, \'n\' => 0), 1 => array(\'h\' => 0, \'n\' => 0)));
+$pdf->setHtmlVSpace($tagvs);</pre>
+Since the CSS margin command is not yet implemented on TCPDF, you need to set the spacing of block tags using the following method.
+
+<h3>SET LINE HEIGHT</h3>
+<pre>$pdf->setCellHeightRatio(1.25);</pre>
+You can use the following method to fine tune the line height (the number is a percentage relative to font height).
+
+<h3>CHANGE THE PIXEL CONVERSION RATIO</h3>
+<pre>$pdf->setImageScale(0.47);</pre>
+This is used to adjust the conversion ratio between pixels and document units. Increase the value to get smaller objects.<br />
+Since you are using pixel unit, this method is important to set theright zoom factor.<br /><br />
+Suppose that you want to print a web page larger 1024 pixels to fill all the available page width.<br />
+An A4 page is larger 210mm equivalent to 8.268 inches, if you subtract 13mm (0.512") of margins for each side, the remaining space is 184mm (7.244 inches).<br />
+The default resolution for a PDF document is 300 DPI (dots per inch), so you have 7.244 * 300 = 2173.2 dots (this is the maximum number of points you can print at 300 DPI for the given width).<br />
+The conversion ratio is approximatively 1024 / 2173.2 = 0.47 px/dots<br />
+If the web page is larger 1280 pixels, on the same A4 page the conversion ratio to use is 1280 / 2173.2 = 0.59 pixels/dots';
+
+// output the HTML content
+$pdf->writeHTML($html, true, false, true, false, '');
+
+// reset pointer to the last page
+$pdf->lastPage();
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_061.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_062.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_062.php
new file mode 100644
index 00000000..45fc25da
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_062.php
@@ -0,0 +1,140 @@
+<?php
+//============================================================+
+// File name   : example_062.php
+// Begin       : 2010-08-25
+// Last Update : 2013-05-14
+//
+// Description : Example 062 for TCPDF class
+//               XObject Template
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: XObject Template
+ * @author Nicola Asuni
+ * @since 2010-08-25
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 062');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 062', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', 'B', 20);
+
+// add a page
+$pdf->AddPage();
+
+$pdf->Write(0, 'XObject Templates', '', 0, 'C', 1, 0, false, false, 0);
+
+/*
+ * An XObject Template is a PDF block that is a self-contained
+ * description of any sequence of graphics objects (including path
+ * objects, text objects, and sampled images).
+ * An XObject Template may be painted multiple times, either on
+ * several pages or at several locations on the same page and produces
+ * the same results each time, subject only to the graphics state at
+ * the time it is invoked.
+ */
+
+
+// start a new XObject Template and set transparency group option
+$template_id = $pdf->startTemplate(60, 60, true);
+
+// create Template content
+// ...................................................................
+//Start Graphic Transformation
+$pdf->StartTransform();
+
+// set clipping mask
+$pdf->StarPolygon(30, 30, 29, 10, 3, 0, 1, 'CNZ');
+
+// draw jpeg image to be clipped
+$pdf->Image('images/image_demo.jpg', 0, 0, 60, 60, '', '', '', true, 72, '', false, false, 0, false, false, false);
+
+//Stop Graphic Transformation
+$pdf->StopTransform();
+
+$pdf->SetXY(0, 0);
+
+$pdf->SetFont('times', '', 40);
+
+$pdf->SetTextColor(255, 0, 0);
+
+// print a text
+$pdf->Cell(60, 60, 'Template', 0, 0, 'C', false, '', 0, false, 'T', 'M');
+// ...................................................................
+
+// end the current Template
+$pdf->endTemplate();
+
+
+// print the selected Template various times using various transparencies
+
+$pdf->SetAlpha(0.4);
+$pdf->printTemplate($template_id, 15, 50, 20, 20, '', '', false);
+
+$pdf->SetAlpha(0.6);
+$pdf->printTemplate($template_id, 27, 62, 40, 40, '', '', false);
+
+$pdf->SetAlpha(0.8);
+$pdf->printTemplate($template_id, 55, 85, 60, 60, '', '', false);
+
+$pdf->SetAlpha(1);
+$pdf->printTemplate($template_id, 95, 125, 80, 80, '', '', false);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_062.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_063.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_063.php
new file mode 100644
index 00000000..de13515c
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_063.php
@@ -0,0 +1,131 @@
+<?php
+//============================================================+
+// File name   : example_063.php
+// Begin       : 2010-09-29
+// Last Update : 2013-05-14
+//
+// Description : Example 063 for TCPDF class
+//               Text stretching and spacing (tracking)
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: Text stretching and spacing (tracking)
+ * @author Nicola Asuni
+ * @since 2010-09-29
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 063');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 063', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', 'B', 16);
+
+// add a page
+$pdf->AddPage();
+
+$pdf->Write(0, 'Example of Text Stretching and Spacing (tracking)', '', 0, 'L', true, 0, false, false, 0);
+$pdf->Ln(5);
+
+// create several cells to display all cases of stretching and spacing combinations.
+
+$fonts = array('times', 'dejavuserif');
+$alignments = array('L' => 'LEFT', 'C' => 'CENTER', 'R' => 'RIGHT', 'J' => 'JUSTIFY');
+
+
+// Test all cases using direct stretching/spacing methods
+foreach ($fonts as $fkey => $font) {
+	$pdf->SetFont($font, '', 14);
+	foreach ($alignments as $align_mode => $align_name) {
+		for ($stretching = 90; $stretching <= 110; $stretching += 10) {
+			for ($spacing = -0.254; $spacing <= 0.254; $spacing += 0.254) {
+				$pdf->setFontStretching($stretching);
+				$pdf->setFontSpacing($spacing);
+				$txt = $align_name.' | Stretching = '.$stretching.'% | Spacing = '.sprintf('%+.3F', $spacing).'mm';
+				$pdf->Cell(0, 0, $txt, 1, 1, $align_mode);
+			}
+		}
+	}
+	$pdf->AddPage();
+}
+
+
+// Test all cases using CSS stretching/spacing properties
+foreach ($fonts as $fkey => $font) {
+	$pdf->SetFont($font, '', 11);
+	foreach ($alignments as $align_mode => $align_name) {
+		for ($stretching = 90; $stretching <= 110; $stretching += 10) {
+			for ($spacing = -0.254; $spacing <= 0.254; $spacing += 0.254) {
+				$html = '<span style="font-stretch:'.$stretching.'%;letter-spacing:'.$spacing.'mm;"><span style="color:red;">'.$align_name.'</span> | <span style="color:green;">Stretching = '.$stretching.'%</span> | <span style="color:blue;">Spacing = '.sprintf('%+.3F', $spacing).'mm</span><br />Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue. Sed vel velit erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</span>';
+				$pdf->writeHTMLCell(0, 0, '', '', $html, 1, 1, false, true, $align_mode, false);
+			}
+		}
+		if (!(($fkey == 1) AND ($align_mode == 'J'))) {
+			$pdf->AddPage();
+		}
+	}
+}
+
+
+// reset font stretching
+$pdf->setFontStretching(100);
+
+// reset font spacing
+$pdf->setFontSpacing(0);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_063.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_064.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_064.php
new file mode 100644
index 00000000..85ae9aee
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_064.php
@@ -0,0 +1,176 @@
+<?php
+//============================================================+
+// File name   : example_064.php
+// Begin       : 2010-10-13
+// Last Update : 2013-05-14
+//
+// Description : Example 064 for TCPDF class
+//               No-write page regions
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF TEST document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: No-write page regions
+ * @author Nicola Asuni
+ * @since 2010-10-14
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 064');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 064', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set font
+$pdf->SetFont('helvetica', '', 8);
+
+
+// define some html content for testing
+$txt = '<p style="text-align:justify;color:blue;font-size:12pt;"><span style="color:red;font-size:14pt;font-weight:bold;">TEST PAGE REGIONS:</span> <span style="color:green;">A no-write region is a portion of the page with a rectangular or trapezium shape that will not be covered when writing text or html code. A region is always aligned on the left or right side of the page ad is defined using a vertical segment. You can set multiple regions for the same page. You can combine several adjacent regions to aproximate curved shapes.</span> Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue. Sed vel velit erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras eget velit nulla, eu sagittis elit. Nunc ac arcu est, in lobortis tellus. Praesent condimentum rhoncus sodales. In hac habitasse platea dictumst. Proin porta eros pharetra enim tincidunt dignissim nec vel dolor. Cras sapien elit, ornare ac dignissim eu, ultricies ac eros. Maecenas augue magna, ultrices a congue in, mollis eu nulla. Nunc venenatis massa at est eleifend faucibus. Vivamus sed risus lectus, nec interdum nunc.
+Fusce et felis vitae diam lobortis sollicitudin. Aenean tincidunt accumsan nisi, id vehicula quam laoreet elementum. Phasellus egestas interdum erat, et viverra ipsum ultricies ac. Praesent sagittis augue at augue volutpat eleifend. Cras nec orci neque. Mauris bibendum posuere blandit. Donec feugiat mollis dui sit amet pellentesque. Sed a enim justo. Donec tincidunt, nisl eget elementum aliquam, odio ipsum ultrices quam, eu porttitor ligula urna at lorem. Donec varius, eros et convallis laoreet, ligula tellus consequat felis, ut ornare metus tellus sodales velit. Duis sed diam ante. Ut rutrum malesuada massa, vitae consectetur ipsum rhoncus sed. Suspendisse potenti. Pellentesque a congue massa.
+Integer non sem eget neque mattis accumsan. Maecenas eu nisl mauris, sit amet interdum ipsum. In pharetra erat vel lectus venenatis elementum. Nulla non elit ligula, sit amet mollis urna. Morbi ut gravida est. Mauris tincidunt sem et turpis molestie malesuada. Curabitur vel nulla risus, sed mollis erat. Suspendisse vehicula accumsan purus nec varius. Donec fermentum lorem id felis sodales dictum. Quisque et dolor ipsum. Nam luctus consectetur dui vitae fermentum. Curabitur sodales consequat augue, id ultricies augue tempor ac. Aliquam ac magna id ipsum vehicula bibendum. Sed elementum congue tristique. <img src="images/image_demo.jpg" width="5mm" height="5mm" /> Phasellus vel lorem eu lectus porta sodales. Etiam neque tortor, sagittis id pharetra quis, laoreet vel arcu.
+Cras quam mi, ornare laoreet laoreet vel, vehicula at lacus. Maecenas a lacus accumsan augue convallis sagittis sed quis odio. Morbi sit amet turpis diam, dictum convallis urna. Cras eget interdum augue. Cras eu nisi sit amet dolor faucibus porttitor. Suspendisse potenti. Nunc vitae dolor risus, at cursus libero. Suspendisse bibendum tellus non nibh hendrerit tristique. Mauris eget orci elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta libero non ante laoreet semper. Proin volutpat sodales mi, ac fermentum erat sagittis in. Vivamus at viverra felis. Ut pretium facilisis ante et pharetra.
+Nulla facilisi. Cras varius quam eget libero aliquam vitae tincidunt leo rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque a nisl massa, quis pretium urna. Proin vel porttitor tortor. Cras rhoncus congue velit in bibendum. Donec pharetra semper augue id lacinia. Quisque magna quam, hendrerit eu aliquam et, pellentesque ut tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas nulla quam, rutrum eu feugiat at, elementum eu libero. Maecenas ullamcorper leo et turpis rutrum ac laoreet eros faucibus. Phasellus condimentum lorem quis neque imperdiet quis molestie enim iaculis. Phasellus risus est, vestibulum ut convallis ultrices, dignissim nec erat. Etiam congue lobortis laoreet. Nulla ut neque sed velit dapibus semper. Quisque nec dolor id nibh eleifend iaculis. Vivamus vitae fermentum odio. Etiam malesuada quam in nulla aliquam sed convallis dui feugiat.</p>';
+
+
+// add a page
+$pdf->AddPage();
+
+// print some graphic content
+$pdf->Image('images/image_demo.jpg', 155,  30, 40, 40, 'JPG', '', '', true);
+$pdf->Image('images/image_demo.jpg',  15, 230, 40, 40, 'JPG', '', '', true);
+
+// define some graphic styles
+$styleA = array('width' => 0.254, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(255, 0, 0));
+$styleB = array('width' => 0.254, 'cap' => 'butt', 'join' => 'miter', 'dash' => 3, 'color' => array(127, 127, 127));
+$pdf->SetFillColor(220, 255, 220);
+
+// write a trapezoid with some information about no-write page regions
+$pdf->Polygon(array(15,90, 57,90, 67,140, 15,140), 'DF', array($styleB, $styleA, $styleB, $styleB));
+$pdf->SetXY(15, 90);
+$pdf->Cell(42, 0, 'xt,yt', 0, 0, 'R', false, '', 0, false, 'T', 'T');
+$pdf->SetXY(15, 140);
+$pdf->Cell(52, 0, 'xb,yb', 0, 0, 'R', false, '', 0, false, 'B', 'B');
+$pdf->SetXY(15, 115);
+$pdf->Cell(40, 0, 'side', 0, 0, 'R', false, '', 0, false, 'B', 'B');
+$pdf->SetLineStyle(array('width' => 0.254, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)));
+$pdf->Arrow(60, 115, 35, 115, 2, 5, 15);
+
+// write a trapezoid with some information about no-write page regions
+$pdf->Polygon(array(145,130, 195,130, 195,180, 155,180), 'DF', array($styleB, $styleB, $styleB, $styleA));
+$pdf->SetXY(145, 130);
+$pdf->Cell(42, 0, 'xt,yt', 0, 0, 'L', false, '', 0, false, 'T', 'T');
+$pdf->SetXY(155, 180);
+$pdf->Cell(52, 0, 'xb,yb', 0, 0, 'L', false, '', 0, false, 'B', 'B');
+$pdf->SetXY(160, 155);
+$pdf->Cell(30, 0, 'side', 0, 0, 'L', false, '', 0, false, 'B', 'B');
+$pdf->SetLineStyle(array('width' => 0.254, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)));
+$pdf->Arrow(155, 155, 180, 155, 2, 5, 15);
+
+// reset x,y position
+$pdf->SetXY(15, 30);
+
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
+// define no-write page regions to avoid text overlapping images
+/*
+	'page' => page number or empy for current page
+	'xt' => X top
+	'yt' => Y top
+	'yb' => Y bottom
+	'side' => page side ('L' = left or 'R' = right)
+*/
+$regions = array(
+array('page' => '', 'xt' => 153, 'yt' =>  30, 'xb' => 153, 'yb' =>  70, 'side' => 'R'),
+array('page' => '', 'xt' =>  60, 'yt' =>  90, 'xb' =>  70, 'yb' => 140, 'side' => 'L'),
+array('page' => '', 'xt' => 143, 'yt' => 130, 'xb' => 153, 'yb' => 180, 'side' => 'R'),
+array('page' => '', 'xt' =>  58, 'yt' => 230, 'xb' =>  58, 'yb' => 270, 'side' => 'L')
+);
+
+// set page regions, check also getPageRegions(), addPageRegion() and removePageRegion()
+$pdf->setPageRegions($regions);
+
+// write html text
+$pdf->writeHTML($txt, true, false, true, false, '');
+
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// set a circular no-write region on the second page
+$regions = array(
+array('page' => 2, 'xt' => 195, 'yt' => 110, 'xb' => 179.693, 'yb' =>  113.045, 'side' => 'R'),
+array('page' => 2, 'xt' => 179.693, 'yt' => 113.045, 'xb' => 166.716, 'yb' => 121.716, 'side' => 'R'),
+array('page' => 2, 'xt' => 166.716, 'yt' => 121.716, 'xb' => 158.045, 'yb' => 134.693, 'side' => 'R'),
+array('page' => 2, 'xt' => 158.045, 'yt' => 134.693, 'xb' => 155, 'yb' => 150, 'side' => 'R'),
+array('page' => 2, 'xt' => 155, 'yt' => 150, 'xb' => 158.045, 'yb' => 165.307, 'side' => 'R'),
+array('page' => 2, 'xt' => 158.045, 'yt' => 165.307, 'xb' => 166.716, 'yb' => 178.284, 'side' => 'R'),
+array('page' => 2, 'xt' => 166.716, 'yt' => 178.284, 'xb' => 179.693, 'yb' => 186.955, 'side' => 'R'),
+array('page' => 2, 'xt' => 179.693, 'yt' => 186.955, 'xb' => 195, 'yb' => 190, 'side' => 'R')
+);
+$pdf->setPageRegions($regions);
+
+$pdf->Polygon(array(195,110, 179.693,113.045, 166.716,121.716, 158.045,134.693, 155,150, 158.045,165.307, 166.716,178.284, 179.693,186.955, 195,190), 'DF');
+
+$pdf->Ln(15);
+
+// define some html content for testing
+$txt = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sed imperdiet lectus. Phasellus quis velit velit, non condimentum quam. Sed neque urna, ultrices ac volutpat vel, laoreet vitae augue. Sed vel velit erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras eget velit nulla, eu sagittis elit. Nunc ac arcu est, in lobortis tellus. Praesent condimentum rhoncus sodales. In hac habitasse platea dictumst. Proin porta eros pharetra enim tincidunt dignissim nec vel dolor. Cras sapien elit, ornare ac dignissim eu, ultricies ac eros. Maecenas augue magna, ultrices a congue in, mollis eu nulla. Nunc venenatis massa at est eleifend faucibus. Vivamus sed risus lectus, nec interdum nunc. Fusce et felis vitae diam lobortis sollicitudin. Aenean tincidunt accumsan nisi, id vehicula quam laoreet elementum. Phasellus egestas interdum erat, et viverra ipsum ultricies ac. Praesent sagittis augue at augue volutpat eleifend. Cras nec orci neque. Mauris bibendum posuere blandit. Donec feugiat mollis dui sit amet pellentesque. Sed a enim justo. Donec tincidunt, nisl eget elementum aliquam, odio ipsum ultrices quam, eu porttitor ligula urna at lorem. Donec varius, eros et convallis laoreet, ligula tellus consequat felis, ut ornare metus tellus sodales velit. Duis sed diam ante. Ut rutrum malesuada massa, vitae consectetur ipsum rhoncus sed. Suspendisse potenti. Pellentesque a congue massa. Integer non sem eget neque mattis accumsan. Maecenas eu nisl mauris, sit amet interdum ipsum. In pharetra erat vel lectus venenatis elementum. Nulla non elit ligula, sit amet mollis urna. Morbi ut gravida est. Mauris tincidunt sem et turpis molestie malesuada. Curabitur vel nulla risus, sed mollis erat. Suspendisse vehicula accumsan purus nec varius. Donec fermentum lorem id felis sodales dictum. Quisque et dolor ipsum. Nam luctus consectetur dui vitae fermentum. Curabitur sodales consequat augue, id ultricies augue tempor ac. Aliquam ac magna id ipsum vehicula bibendum. Sed elementum congue tristique. Phasellus vel lorem eu lectus porta sodales. Etiam neque tortor, sagittis id pharetra quis, laoreet vel arcu. Cras quam mi, ornare laoreet laoreet vel, vehicula at lacus. Maecenas a lacus accumsan augue convallis sagittis sed quis odio. Morbi sit amet turpis diam, dictum convallis urna. Cras eget interdum augue. Cras eu nisi sit amet dolor faucibus porttitor. Suspendisse potenti. Nunc vitae dolor risus, at cursus libero. Suspendisse bibendum tellus non nibh hendrerit tristique. Mauris eget orci elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta libero non ante laoreet semper. Proin volutpat sodales mi, ac fermentum erat sagittis in. Vivamus at viverra felis. Ut pretium facilisis ante et pharetra. Nulla facilisi. Cras varius quam eget libero aliquam vitae tincidunt leo rutrum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque a nisl massa, quis pretium urna. Proin vel porttitor tortor. Cras rhoncus congue velit in bibendum. Donec pharetra semper augue id lacinia. Quisque magna quam, hendrerit eu aliquam et, pellentesque ut tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas nulla quam, rutrum eu feugiat at, elementum eu libero. Maecenas ullamcorper leo et turpis rutrum ac laoreet eros faucibus. Phasellus condimentum lorem quis neque imperdiet quis molestie enim iaculis. Phasellus risus est, vestibulum ut convallis ultrices, dignissim nec erat. Etiam congue lobortis laoreet. Nulla ut neque sed velit dapibus semper. Quisque nec dolor id nibh eleifend iaculis. Vivamus vitae fermentum odio. Etiam malesuada quam in nulla aliquam sed convallis dui feugiat.'."\n";
+
+// write text
+$pdf->MultiCell(0, 0, $txt, 0, 'J', false, 1, '', '', true, 0, false, true, 0, 'T', false);
+
+// ---------------------------------------------------------
+
+//Close and output PDF document
+$pdf->Output('example_064.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/example_065.php b/htmltest/sites/all/libraries/tcpdf-version/examples/example_065.php
new file mode 100644
index 00000000..f1bbcbe9
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/example_065.php
@@ -0,0 +1,98 @@
+<?php
+//============================================================+
+// File name   : example_065.php
+// Begin       : 2011-09-28
+// Last Update : 2013-05-14
+//
+// Description : Example 065 for TCPDF class
+//               Creates an example PDF/A-1b document using TCPDF
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Creates an example PDF/A-1b document using TCPDF
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Example: PDF/A-1b mode
+ * @author Nicola Asuni
+ * @since 2011-09-28
+ */
+
+// Include the main TCPDF library (search for installation path).
+require_once('tcpdf_include.php');
+
+// create new PDF document
+$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false, true);
+
+// set document information
+$pdf->SetCreator(PDF_CREATOR);
+$pdf->SetAuthor('Nicola Asuni');
+$pdf->SetTitle('TCPDF Example 065');
+$pdf->SetSubject('TCPDF Tutorial');
+$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
+
+// set default header data
+$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 065', PDF_HEADER_STRING);
+
+// set header and footer fonts
+$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
+$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
+
+// set default monospaced font
+$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
+
+// set margins
+$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
+$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
+$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
+
+// set auto page breaks
+$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
+
+// set image scale factor
+$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
+
+// set some language-dependent strings (optional)
+if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
+	require_once(dirname(__FILE__).'/lang/eng.php');
+	$pdf->setLanguageArray($l);
+}
+
+// ---------------------------------------------------------
+
+// set default font subsetting mode
+$pdf->setFontSubsetting(true);
+
+// Set font
+$pdf->SetFont('helvetica', '', 14, '', true);
+
+// Add a page
+// This method has several options, check the source code documentation for more information.
+$pdf->AddPage();
+
+// Set some content to print
+$html = <<<EOD
+<h1>Example of <a href="http://www.tcpdf.org" style="text-decoration:none;background-color:#CC0000;color:black;">&nbsp;<span style="color:black;">TC</span><span style="color:white;">PDF</span>&nbsp;</a> document in <span style="background-color:#99ccff;color:black;"> PDF/A-1b </span> mode.</h1>
+<i>This document conforms to the standard <b>PDF/A-1b (ISO 19005-1:2005)</b>.</i>
+<p>Please check the source code documentation and other examples for further information (<a href="http://www.tcpdf.org">http://www.tcpdf.org</a>).</p>
+<p style="color:#CC0000;">TO IMPROVE AND EXPAND TCPDF I NEED YOUR SUPPORT, PLEASE <a href="http://sourceforge.net/donate/index.php?group_id=128076">MAKE A DONATION!</a></p>
+EOD;
+
+// Print text using writeHTMLCell()
+$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);
+
+// ---------------------------------------------------------
+
+// Close and output PDF document
+// This method has several options, check the source code documentation for more information.
+$pdf->Output('example_065.pdf', 'I');
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/_blank.png b/htmltest/sites/all/libraries/tcpdf-version/examples/images/_blank.png
new file mode 100644
index 00000000..38f7b2fa
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/examples/images/_blank.png differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/alpha.png b/htmltest/sites/all/libraries/tcpdf-version/examples/images/alpha.png
new file mode 100644
index 00000000..08daf2d4
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/examples/images/alpha.png differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/bug.eps b/htmltest/sites/all/libraries/tcpdf-version/examples/images/bug.eps
new file mode 100644
index 00000000..52e9da7e
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/images/bug.eps
@@ -0,0 +1,1809 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Adobe Illustrator(TM) 3.2
+%%AI8_CreatorVersion: 12.0.0
+%%For: (fluxus) (x)
+%%Title: (bug.eps)
+%%CreationDate: 4/15/2006 11:11 PM
+%%BoundingBox: -2 747 53 843
+% -2 747 53 843
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%%DocumentSuppliedResources: procset Adobe_packedarray 2.0 0
+%%+ procset Adobe_cmykcolor 1.1 0
+%%+ procset Adobe_cshow 1.1 0
+%%+ procset Adobe_customcolor 1.0 0
+%%+ procset Adobe_pattern_AI3 1.0 0
+%%+ procset Adobe_Illustrator_AI3 1.0 1
+%AI3_ColorUsage: Color
+%AI3_IncludePlacedImages
+%%CMYKCustomColor: 1 1 1 1 ([Registration])
+%AI3_TemplateBox: 298.5 420.3896 298.5 420.3896
+%AI3_TileBox: 0.157715 0.044861 595.1177 841.9648
+%AI3_DocumentPreview: Header
+%%PageOrigin:-32 11.8896
+%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9
+%AI9_Flatten: 1
+%AI12_CMSettings: 00.MS
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset Adobe_packedarray 2.0 0
+%%Title: (Packed Array Operators)
+%%Version: 2.0 0
+%%CreationDate: (8/2/90) ()
+%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
+userdict /Adobe_packedarray 5 dict dup begin put
+/initialize
+{
+/packedarray where
+	{
+	pop
+	}
+	{
+	Adobe_packedarray begin
+	Adobe_packedarray
+		{
+		dup xcheck
+			{
+			bind
+			} if
+		userdict 3 1 roll put
+		} forall
+ end
+	} ifelse
+} def
+/terminate
+{
+} def
+/packedarray
+{
+array astore readonly
+} def
+/setpacking
+{
+pop
+} def
+/currentpacking
+{
+false
+} def
+currentdict readonly pop end
+%%EndResource
+Adobe_packedarray /initialize get exec
+%%BeginResource: procset Adobe_cmykcolor 1.1 0
+%%Title: (CMYK Color Operators)
+%%Version: 1.1 0
+%%CreationDate: (1/23/89) ()
+%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
+currentpacking true setpacking
+userdict /Adobe_cmykcolor 4 dict dup begin put
+/initialize
+{
+/setcmykcolor where
+	{
+	pop
+	}
+	{
+	userdict /Adobe_cmykcolor_vars 2 dict dup begin put
+	/_setrgbcolor
+		/setrgbcolor load def
+	/_currentrgbcolor
+		/currentrgbcolor load def
+	Adobe_cmykcolor begin
+	Adobe_cmykcolor
+		{
+		dup xcheck
+			{
+			bind
+			} if
+		pop pop
+		} forall
+ end
+ end
+	Adobe_cmykcolor begin
+	} ifelse
+} def
+/terminate
+{
+currentdict Adobe_cmykcolor eq
+	{
+ end
+	} if
+} def
+/setcmykcolor
+{
+1 sub 4 1 roll
+3
+	{
+	3 index add neg dup 0 lt
+		{
+		pop 0
+		} if
+	3 1 roll
+	} repeat
+Adobe_cmykcolor_vars /_setrgbcolor get exec
+pop
+} def
+/currentcmykcolor
+{
+Adobe_cmykcolor_vars /_currentrgbcolor get exec
+3
+	{
+	1 sub neg 3 1 roll
+	} repeat
+0
+} def
+currentdict readonly pop end
+setpacking
+%%EndResource
+%%BeginResource: procset Adobe_cshow 1.1 0
+%%Title: (cshow Operator)
+%%Version: 1.1 0
+%%CreationDate: (1/23/89) ()
+%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
+currentpacking true setpacking
+userdict /Adobe_cshow 3 dict dup begin put
+/initialize
+{
+/cshow where
+	{
+	pop
+	}
+	{
+	userdict /Adobe_cshow_vars 1 dict dup begin put
+	/_cshow
+		{} def
+	Adobe_cshow begin
+	Adobe_cshow
+		{
+		dup xcheck
+			{
+			bind
+			} if
+		userdict 3 1 roll put
+		} forall
+ end
+ end
+	} ifelse
+} def
+/terminate
+{
+} def
+/cshow
+{
+exch
+Adobe_cshow_vars
+	exch /_cshow
+	exch put
+	{
+	0 0 Adobe_cshow_vars /_cshow get exec
+	} forall
+} def
+currentdict readonly pop end
+setpacking
+%%EndResource
+%%BeginResource: procset Adobe_customcolor 1.0 0
+%%Title: (Custom Color Operators)
+%%Version: 1.0 0
+%%CreationDate: (5/9/88) ()
+%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
+currentpacking true setpacking
+userdict /Adobe_customcolor 5 dict dup begin put
+/initialize
+{
+/setcustomcolor where
+	{
+	pop
+	}
+	{
+	Adobe_customcolor begin
+	Adobe_customcolor
+		{
+		dup xcheck
+			{
+			bind
+			} if
+		pop pop
+		} forall
+ end
+	Adobe_customcolor begin
+	} ifelse
+} def
+/terminate
+{
+currentdict Adobe_customcolor eq
+	{
+ end
+	} if
+} def
+/findcmykcustomcolor
+{
+5 packedarray
+}  def
+/setcustomcolor
+{
+exch
+aload pop pop
+4
+	{
+	4 index mul 4 1 roll
+	} repeat
+5 -1 roll pop
+setcmykcolor
+} def
+/setoverprint
+{
+pop
+} def
+currentdict readonly pop end
+setpacking
+%%EndResource
+%%BeginResource: procset Adobe_pattern_AI3 1.1 0
+%%Title: (Adobe Illustrator (R) Version 3.0 Pattern Operators)
+%%Version: 1.1 0
+%%CreationDate: (7/21/89) ()
+%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
+currentpacking true setpacking
+userdict /Adobe_pattern_AI3 16 dict dup begin put
+/initialize
+{
+/definepattern where
+	{
+	pop
+	}
+	{
+	Adobe_pattern_AI3 begin
+	Adobe_pattern_AI3
+		{
+		dup xcheck
+			{
+			bind
+			} if
+		pop pop
+		} forall
+	mark
+	cachestatus 7 1 roll pop pop pop pop exch pop exch
+		{
+		{
+		10000 add
+		dup 2 index gt
+			{
+			exit
+			} if
+		dup setcachelimit
+		} loop
+		} stopped
+	cleartomark
+	} ifelse
+} def
+/terminate
+{
+currentdict Adobe_pattern_AI3 eq
+	{
+ end
+	} if
+} def
+errordict
+/nocurrentpoint
+{
+pop
+stop
+} put
+errordict
+/invalidaccess
+{
+pop
+stop
+} put
+/patternencoding
+256 array def
+0 1 255
+{
+patternencoding exch ( ) 2 copy exch 0 exch put cvn put
+} for
+/definepattern
+{
+17 dict begin
+/uniform exch def
+/cache exch def
+/key exch def
+/procarray exch def
+/mtx exch matrix invertmatrix def
+/height exch def
+/width exch def
+/ctm matrix currentmatrix def
+/ptm matrix def
+/str 32 string def
+/slice 9 dict def
+slice /s 1 put
+slice /q 256 procarray length div sqrt floor cvi put
+slice /b 0 put
+/FontBBox [0 0 0 0] def
+/FontMatrix mtx matrix copy def
+/Encoding patternencoding def
+/FontType 3 def
+/BuildChar
+	{
+	exch
+ begin
+	/setstrokeadjust where {pop true setstrokeadjust} if
+	slice begin
+	dup q dup mul mod s idiv /i exch def
+	dup q dup mul mod s mod /j exch def
+	q dup mul idiv procarray exch get
+	/xl j width s div mul def
+	/xg j 1 add width s div mul def
+	/yl i height s div mul def
+	/yg i 1 add height s div mul def
+	uniform
+		{
+		1 1
+		}
+		{
+		width 0 dtransform
+		dup mul exch dup mul add sqrt dup 1 add exch div
+		0 height dtransform
+		dup mul exch dup mul add sqrt dup 1 add exch div
+		} ifelse
+	width 0 cache
+		{
+		xl 4 index mul yl 4 index mul xg 6 index mul yg 6 index mul
+		setcachedevice
+		}
+		{
+		setcharwidth
+		} ifelse
+	gsave
+	scale
+	newpath
+	xl yl moveto
+	xg yl lineto
+	xg yg lineto
+	xl yg lineto
+	closepath
+	clip
+	newpath
+ end
+ end
+	exec
+	grestore
+	} def
+key currentdict definefont
+end
+} def
+/patterncachesize
+{
+gsave
+newpath
+0 0 moveto
+width 0 lineto
+width height lineto
+0 height lineto
+closepath
+patternmatrix setmatrix
+pathbbox
+exch ceiling 4 -1 roll floor sub 3 1 roll
+ceiling exch floor sub
+mul 1 add
+grestore
+} def
+/patterncachelimit
+{
+cachestatus 7 1 roll 6 npop 8 mul
+} def
+/patternpath
+{
+exch dup begin setfont
+ctm setmatrix
+concat
+slice exch /b exch slice /q get dup mul mul put
+FontMatrix concat
+uniform
+	{
+	width 0 dtransform round width div exch round width div exch
+	0 height dtransform round height div exch height div exch
+	0 0 transform round exch round exch
+	ptm astore setmatrix
+	}
+	{
+	ptm currentmatrix pop
+	} ifelse
+{currentpoint} stopped not
+	{
+	2 npop
+	pathbbox
+	true
+	4 index 3 index eq
+	4 index 3 index eq
+	and
+		{
+		pop false
+			{
+			{2 npop}
+			{3 npop true}
+			{7 npop true}
+			{pop true}
+			pathforall
+			} stopped
+			{
+			5 npop true
+			} if
+		} if
+		{
+		height div ceiling height mul 4 1 roll
+		width div ceiling width mul 4 1 roll
+		height div floor height mul 4 1 roll
+		width div floor width mul 4 1 roll
+		2 index sub height div ceiling cvi exch
+		3 index sub width div ceiling cvi exch
+		4 2 roll moveto
+		FontMatrix mtx invertmatrix
+		dup dup 4 get exch 5 get rmoveto
+		ptm ptm concatmatrix pop
+		slice /s
+		patterncachesize patterncachelimit div ceiling sqrt ceiling cvi
+		dup slice /q get gt
+			{
+			pop slice /q get
+			} if
+		put
+		0 1 slice /s get dup mul 1 sub
+			{
+			slice /b get add
+			gsave
+			0 1 str length 1 sub
+				{
+				str exch 2 index put
+				} for
+			pop
+			dup
+				{
+				gsave
+				ptm setmatrix
+				1 index str length idiv {str show} repeat
+				1 index str length mod str exch 0 exch getinterval show
+				grestore
+				0 height rmoveto
+				} repeat
+			grestore
+			} for
+		2 npop
+		}
+		{
+		4 npop
+		} ifelse
+	} if
+end
+} def
+/patternclip
+{
+clip
+} def
+/patternstrokepath
+{
+strokepath
+} def
+/patternmatrix
+matrix def
+/patternfill
+{
+dup type /dicttype eq
+	{
+	Adobe_pattern_AI3 /patternmatrix get
+	} if
+gsave
+patternclip
+Adobe_pattern_AI3 /patternpath get exec
+grestore
+newpath
+} def
+/patternstroke
+{
+dup type /dicttype eq
+	{
+	Adobe_pattern_AI3 /patternmatrix get
+	} if
+gsave
+patternstrokepath
+true
+	{
+		{
+			{
+			newpath
+			moveto
+			}
+			{
+			lineto
+			}
+			{
+			curveto
+			}
+			{
+			closepath
+			3 copy
+			Adobe_pattern_AI3 /patternfill get exec
+			} pathforall
+		3 npop
+		} stopped
+			{
+			5 npop
+			patternclip
+			Adobe_pattern_AI3 /patternfill get exec
+			} if
+	}
+	{
+	patternclip
+	Adobe_pattern_AI3 /patternfill get exec
+	} ifelse
+grestore
+newpath
+} def
+/patternashow
+{
+3 index type /dicttype eq
+	{
+	Adobe_pattern_AI3 /patternmatrix get 4 1 roll
+	} if
+	{
+	2 npop (0) exch
+	2 copy 0 exch put pop
+	gsave
+	false charpath currentpoint
+	6 index 6 index 6 index
+	Adobe_pattern_AI3 /patternfill get exec
+	grestore
+	newpath moveto
+	2 copy rmoveto
+	} exch cshow
+5 npop
+} def
+/patternawidthshow
+{
+6 index type /dicttype eq
+	{
+	Adobe_pattern_AI3 /patternmatrix get 7 1 roll
+	} if
+	{
+	2 npop (0) exch
+	2 copy 0 exch put
+	gsave
+	_sp eq {5 index 5 index rmoveto} if
+	false charpath currentpoint
+	9 index 9 index 9 index
+	Adobe_pattern_AI3 /patternfill get exec
+	grestore
+	newpath moveto
+	2 copy rmoveto
+	} exch cshow
+8 npop
+} def
+/patternashowstroke
+{
+4 index type /dicttype eq
+	{
+	patternmatrix /patternmatrix get 5 1 roll
+	} if
+4 1 roll
+	{
+	2 npop (0) exch
+	2 copy 0 exch put pop
+	gsave
+	false charpath
+	currentpoint
+	4 index setmatrix
+	7 index 7 index 7 index
+	Adobe_pattern_AI3 /patternstroke get exec
+	grestore
+	newpath moveto
+	2 copy rmoveto
+	} exch cshow
+6 npop
+} def
+/patternawidthshowstroke
+{
+7 index type /dicttype eq
+	{
+	patternmatrix /patternmatrix get 8 1 roll
+	} if
+7 1 roll
+	{
+	2 npop (0) exch
+	2 copy 0 exch put
+	gsave
+	_sp eq {5 index 5 index rmoveto} if
+	false charpath currentpoint
+	7 index setmatrix
+	10 index 10 index 10 index
+	Adobe_pattern_AI3 /patternstroke get exec
+	grestore
+	newpath moveto
+	2 copy rmoveto
+	} exch cshow
+9 npop
+} def
+currentdict readonly pop end
+setpacking
+%%EndResource
+%%BeginResource: procset Adobe_Illustrator_AI3 1.1 0
+%%Title: (Adobe Illustrator (R) Version 3.0 Full Prolog)
+%%Version: 1.1 0
+%%CreationDate: (3/7/1994) ()
+%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
+currentpacking true setpacking
+userdict /Adobe_Illustrator_AI3 71 dict dup begin put
+/initialize
+{
+userdict /Adobe_Illustrator_AI3_vars 67 dict dup begin put
+/_lp /none def
+/_pf {} def
+/_ps {} def
+/_psf {} def
+/_pss {} def
+/_pjsf {} def
+/_pjss {} def
+/_pola 0 def
+/_doClip 0 def
+/cf	currentflat def
+/_tm matrix def
+/_renderStart [/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0] def
+/_renderEnd [null null null null /i1 /i1 /i1 /i1] def
+/_render -1 def
+/_rise 0 def
+/_ax 0 def
+/_ay 0 def
+/_cx 0 def
+/_cy 0 def
+/_leading [0 0] def
+/_ctm matrix def
+/_mtx matrix def
+/_sp 16#020 def
+/_hyphen (-) def
+/_fScl 0 def
+/_cnt 0 def
+/_hs 1 def
+/_nativeEncoding 0 def
+/_useNativeEncoding 0 def
+/_tempEncode 0 def
+/_pntr 0 def
+/_tDict 2 dict def
+/_wv 0 def
+/Tx {} def
+/Tj {} def
+/CRender {} def
+/_AI3_savepage {} def
+/_gf null def
+/_cf 4 array def
+/_if null def
+/_of false def
+/_fc {} def
+/_gs null def
+/_cs 4 array def
+/_is null def
+/_os false def
+/_sc {} def
+/_pd 1 dict def
+/_ed 15 dict def
+/_pm matrix def
+/_fm null def
+/_fd null def
+/_fdd null def
+/_sm null def
+/_sd null def
+/_sdd null def
+/_i null def
+Adobe_Illustrator_AI3 begin
+Adobe_Illustrator_AI3 dup /nc get begin
+	{
+	dup xcheck
+		{
+		bind
+		} if
+	pop pop
+	} forall
+end
+end
+end
+Adobe_Illustrator_AI3 begin
+Adobe_Illustrator_AI3_vars begin
+newpath
+} def
+/terminate
+{
+end
+end
+} def
+/_
+null def
+/ddef
+{
+Adobe_Illustrator_AI3_vars 3 1 roll put
+} def
+/xput
+{
+dup load dup length exch maxlength eq
+	{
+	dup dup load dup
+	length 2 mul dict copy def
+	} if
+load begin def end
+} def
+/npop
+{
+	{
+	pop
+	} repeat
+} def
+/sw
+{
+dup length exch stringwidth
+exch 5 -1 roll 3 index mul add
+4 1 roll 3 1 roll mul add
+} def
+/swj
+{
+dup 4 1 roll
+dup length exch stringwidth
+exch 5 -1 roll 3 index mul add
+4 1 roll 3 1 roll mul add
+6 2 roll /_cnt 0 ddef
+{1 index eq {/_cnt _cnt 1 add ddef} if} forall pop
+exch _cnt mul exch _cnt mul 2 index add 4 1 roll 2 index add 4 1 roll pop pop
+} def
+/ss
+{
+4 1 roll
+	{
+	2 npop
+	(0) exch 2 copy 0 exch put pop
+	gsave
+	false charpath currentpoint
+	4 index setmatrix
+	stroke
+	grestore
+	moveto
+	2 copy rmoveto
+	} exch cshow
+3 npop
+} def
+/jss
+{
+4 1 roll
+	{
+	2 npop
+	(0) exch 2 copy 0 exch put
+	gsave
+	_sp eq
+		{
+		exch 6 index 6 index 6 index 5 -1 roll widthshow
+		currentpoint
+		}
+		{
+		false charpath currentpoint
+		4 index setmatrix stroke
+		}ifelse
+	grestore
+	moveto
+	2 copy rmoveto
+	} exch cshow
+6 npop
+} def
+/sp
+{
+	{
+	2 npop (0) exch
+	2 copy 0 exch put pop
+	false charpath
+	2 copy rmoveto
+	} exch cshow
+2 npop
+} def
+/jsp
+{
+	{
+	2 npop
+	(0) exch 2 copy 0 exch put
+	_sp eq
+		{
+		exch 5 index 5 index 5 index 5 -1 roll widthshow
+		}
+		{
+		false charpath
+		}ifelse
+	2 copy rmoveto
+	} exch cshow
+5 npop
+} def
+/pl
+{
+transform
+0.25 sub round 0.25 add exch
+0.25 sub round 0.25 add exch
+itransform
+} def
+/setstrokeadjust where
+	{
+	pop true setstrokeadjust
+	/c
+	{
+	curveto
+	} def
+	/C
+	/c load def
+	/v
+	{
+	currentpoint 6 2 roll curveto
+	} def
+	/V
+	/v load def
+	/y
+	{
+	2 copy curveto
+	} def
+	/Y
+	/y load def
+	/l
+	{
+	lineto
+	} def
+	/L
+	/l load def
+	/m
+	{
+	moveto
+	} def
+	}
+	{
+	/c
+	{
+	pl curveto
+	} def
+	/C
+	/c load def
+	/v
+	{
+	currentpoint 6 2 roll pl curveto
+	} def
+	/V
+	/v load def
+	/y
+	{
+	pl 2 copy curveto
+	} def
+	/Y
+	/y load def
+	/l
+	{
+	pl lineto
+	} def
+	/L
+	/l load def
+	/m
+	{
+	pl moveto
+	} def
+	} ifelse
+/d
+{
+setdash
+} def
+/cf	{} def
+/i
+{
+dup 0 eq
+	{
+	pop cf
+	} if
+setflat
+} def
+/j
+{
+setlinejoin
+} def
+/J
+{
+setlinecap
+} def
+/M
+{
+setmiterlimit
+} def
+/w
+{
+setlinewidth
+} def
+/H
+{} def
+/h
+{
+closepath
+} def
+/N
+{
+_pola 0 eq
+	{
+	_doClip 1 eq {clip /_doClip 0 ddef} if
+	newpath
+	}
+	{
+	/CRender {N} ddef
+	}ifelse
+} def
+/n
+{N} def
+/F
+{
+_pola 0 eq
+	{
+	_doClip 1 eq
+		{
+		gsave _pf grestore clip newpath /_lp /none ddef _fc
+		/_doClip 0 ddef
+		}
+		{
+		_pf
+		}ifelse
+	}
+	{
+	/CRender {F} ddef
+	}ifelse
+} def
+/f
+{
+closepath
+F
+} def
+/S
+{
+_pola 0 eq
+	{
+	_doClip 1 eq
+		{
+		gsave _ps grestore clip newpath /_lp /none ddef _sc
+		/_doClip 0 ddef
+		}
+		{
+		_ps
+		}ifelse
+	}
+	{
+	/CRender {S} ddef
+	}ifelse
+} def
+/s
+{
+closepath
+S
+} def
+/B
+{
+_pola 0 eq
+	{
+	_doClip 1 eq
+	gsave F grestore
+		{
+		gsave S grestore clip newpath /_lp /none ddef _sc
+		/_doClip 0 ddef
+		}
+		{
+		S
+		}ifelse
+	}
+	{
+	/CRender {B} ddef
+	}ifelse
+} def
+/b
+{
+closepath
+B
+} def
+/W
+{
+/_doClip 1 ddef
+} def
+/*
+{
+count 0 ne
+	{
+	dup type (stringtype) eq {pop} if
+	} if
+_pola 0 eq {newpath} if
+} def
+/u
+{} def
+/U
+{} def
+/q
+{
+_pola 0 eq {gsave} if
+} def
+/Q
+{
+_pola 0 eq {grestore} if
+} def
+/*u
+{
+_pola 1 add /_pola exch ddef
+} def
+/*U
+{
+_pola 1 sub /_pola exch ddef
+_pola 0 eq {CRender} if
+} def
+/D
+{pop} def
+/*w
+{} def
+/*W
+{} def
+/`
+{
+/_i save ddef
+6 1 roll 4 npop
+concat pop
+userdict begin
+/showpage {} def
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[] 0 setdash
+/setstrokeadjust where {pop false setstrokeadjust} if
+newpath
+0 setgray
+false setoverprint
+} def
+/~
+{
+end
+_i restore
+} def
+/@
+{} def
+/&
+{} def
+/O
+{
+0 ne
+/_of exch ddef
+/_lp /none ddef
+} def
+/R
+{
+0 ne
+/_os exch ddef
+/_lp /none ddef
+} def
+/g
+{
+/_gf exch ddef
+/_fc
+{
+_lp /fill ne
+	{
+	_of setoverprint
+	_gf setgray
+	/_lp /fill ddef
+	} if
+} ddef
+/_pf
+{
+_fc
+fill
+} ddef
+/_psf
+{
+_fc
+ashow
+} ddef
+/_pjsf
+{
+_fc
+awidthshow
+} ddef
+/_lp /none ddef
+} def
+/G
+{
+/_gs exch ddef
+/_sc
+{
+_lp /stroke ne
+	{
+	_os setoverprint
+	_gs setgray
+	/_lp /stroke ddef
+	} if
+} ddef
+/_ps
+{
+_sc
+stroke
+} ddef
+/_pss
+{
+_sc
+ss
+} ddef
+/_pjss
+{
+_sc
+jss
+} ddef
+/_lp /none ddef
+} def
+/k
+{
+_cf astore pop
+/_fc
+{
+_lp /fill ne
+	{
+	_of setoverprint
+	_cf aload pop setcmykcolor
+	/_lp /fill ddef
+	} if
+} ddef
+/_pf
+{
+_fc
+fill
+} ddef
+/_psf
+{
+_fc
+ashow
+} ddef
+/_pjsf
+{
+_fc
+awidthshow
+} ddef
+/_lp /none ddef
+} def
+/K
+{
+_cs astore pop
+/_sc
+{
+_lp /stroke ne
+	{
+	_os setoverprint
+	_cs aload pop setcmykcolor
+	/_lp /stroke ddef
+	} if
+} ddef
+/_ps
+{
+_sc
+stroke
+} ddef
+/_pss
+{
+_sc
+ss
+} ddef
+/_pjss
+{
+_sc
+jss
+} ddef
+/_lp /none ddef
+} def
+/x
+{
+/_gf exch ddef
+findcmykcustomcolor
+/_if exch ddef
+/_fc
+{
+_lp /fill ne
+	{
+	_of setoverprint
+	_if _gf 1 exch sub setcustomcolor
+	/_lp /fill ddef
+	} if
+} ddef
+/_pf
+{
+_fc
+fill
+} ddef
+/_psf
+{
+_fc
+ashow
+} ddef
+/_pjsf
+{
+_fc
+awidthshow
+} ddef
+/_lp /none ddef
+} def
+/X
+{
+/_gs exch ddef
+findcmykcustomcolor
+/_is exch ddef
+/_sc
+{
+_lp /stroke ne
+	{
+	_os setoverprint
+	_is _gs 1 exch sub setcustomcolor
+	/_lp /stroke ddef
+	} if
+} ddef
+/_ps
+{
+_sc
+stroke
+} ddef
+/_pss
+{
+_sc
+ss
+} ddef
+/_pjss
+{
+_sc
+jss
+} ddef
+/_lp /none ddef
+} def
+/dp
+{
+dup null eq
+{
+pop
+_dp 0 ne
+	{
+	0 1 _dp 1 sub _dl mod
+		{
+		_da exch get 3 get
+		} for
+	_dp 1 sub _dl mod 1 add packedarray
+	_da 0 get aload pop 8 -1 roll 5 -1 roll pop 4 1 roll
+	definepattern pop
+	} if
+}
+{
+_dp 0 ne _dp _dl mod 0 eq and
+	{
+	null dp
+	} if
+7 packedarray _da exch _dp _dl mod exch put
+_dp _dl mod _da 0 get 4 get 2 packedarray
+/_dp _dp 1 add def
+} ifelse
+} def
+/E
+{
+_ed begin
+dup 0 get type /arraytype ne
+	{
+	0
+		{
+		dup 1 add index type /arraytype eq
+			{
+			1 add
+			}
+			{
+			exit
+			} ifelse
+		} loop
+	array astore
+	} if
+/_dd exch def
+/_ury exch def
+/_urx exch def
+/_lly exch def
+/_llx exch def
+/_n exch def
+/_y 0 def
+/_dl 4 def
+/_dp 0 def
+/_da _dl array def
+0 1 _dd length 1 sub
+	{
+	/_d exch _dd exch get def
+	0 2 _d length 2 sub
+		{
+		/_x exch def
+		/_c _d _x get _ ne def
+		/_r _d _x 1 add get cvlit def
+		_r _ ne
+			{
+			_urx _llx sub _ury _lly sub [1 0 0 1 0 0]
+				[
+				/save cvx
+				_llx neg _lly neg /translate cvx
+				_c
+					{
+					nc /begin cvx
+					} if
+				_r dup type /stringtype eq
+					{
+					cvx
+					}
+					{
+					{exec} /forall cvx
+					} ifelse
+				_c
+					{
+					/end cvx
+					} if
+				/restore cvx
+				] cvx
+			/_fn 12 _n length add string def
+			_y _fn cvs pop
+			/_y _y 1 add def
+			_fn 12 _n putinterval
+			_fn _c false dp
+			_d exch _x 1 add exch put
+			} if
+		} for
+	} for
+null dp
+_n _dd /_pd
+end xput
+} def
+/fc
+{
+_fm dup concatmatrix pop
+} def
+/p
+{
+/_fm exch ddef
+9 -2 roll _pm translate fc
+7 -2 roll _pm scale fc
+5 -1 roll _pm rotate fc
+4 -2 roll exch 0 ne
+	{
+	dup _pm rotate fc
+	1 -1 _pm scale fc
+	neg _pm rotate fc
+	}
+	{
+	pop
+	} ifelse
+dup _pm rotate fc
+exch dup sin exch cos div 1 0 0 1 0 6 2 roll
+_pm astore fc
+neg _pm rotate fc
+_pd exch get /_fdd exch ddef
+/_pf
+{
+save
+/_doClip 0 ddef
+0 1 _fdd length 1 sub
+	{
+	/_fd exch _fdd exch get ddef
+	_fd
+	0 2 _fd length 2 sub
+		{
+		gsave
+		2 copy get dup _ ne
+			{
+			cvx exec _fc
+			}
+			{
+			pop
+			} ifelse
+		2 copy 1 add get dup _ ne
+			{
+			aload pop findfont _fm
+			patternfill
+			}
+			{
+			pop
+			fill
+			} ifelse
+		grestore
+		pop
+		} for
+	pop
+	} for
+restore
+newpath
+} ddef
+/_psf
+{
+save
+/_doClip 0 ddef
+0 1 _fdd length 1 sub
+	{
+	/_fd exch _fdd exch get ddef
+	_fd
+	0 2 _fd length 2 sub
+		{
+		gsave
+		2 copy get dup _ ne
+			{
+			cvx exec _fc
+			}
+			{
+			pop
+			} ifelse
+		2 copy 1 add get dup _ ne
+			{
+			aload pop findfont _fm
+			9 copy 6 npop patternashow
+			}
+			{
+			pop
+			6 copy 3 npop ashow
+			} ifelse
+		grestore
+		pop
+		} for
+	pop
+	} for
+restore
+%3 npop newpath
+sw rmoveto
+} ddef
+/_pjsf
+{
+save
+/_doClip 0 ddef
+0 1 _fdd length 1 sub
+	{
+	/_fd exch _fdd exch get ddef
+	_fd
+	0 2 _fd length 2 sub
+		{
+		gsave
+		2 copy get dup _ ne
+			{
+			cvx exec _fc
+			}
+			{
+			pop
+			} ifelse
+		2 copy 1 add get dup _ ne
+			{
+			aload pop findfont _fm
+			12 copy 6 npop patternawidthshow
+			}
+			{
+			pop 9 copy 3 npop awidthshow
+			} ifelse
+		grestore
+		pop
+		} for
+	pop
+	} for
+restore
+swj rmoveto
+} ddef
+/_lp /none ddef
+} def
+/sc
+{
+_sm dup concatmatrix pop
+} def
+/P
+{
+/_sm exch ddef
+9 -2 roll _pm translate sc
+7 -2 roll _pm scale sc
+5 -1 roll _pm rotate sc
+4 -2 roll exch 0 ne
+	{
+	dup _pm rotate sc
+	1 -1 _pm scale sc
+	neg _pm rotate sc
+	}
+	{
+	pop
+	} ifelse
+dup _pm rotate sc
+exch dup sin exch cos div 1 0 0 1 0 6 2 roll
+_pm astore sc
+neg _pm rotate sc
+_pd exch get /_sdd exch ddef
+/_ps
+{
+save
+/_doClip 0 ddef
+0 1 _sdd length 1 sub
+	{
+	/_sd exch _sdd exch get ddef
+	_sd
+	0 2 _sd length 2 sub
+		{
+		gsave
+		2 copy get dup _ ne
+			{
+			cvx exec _sc
+			}
+			{
+			pop
+			} ifelse
+		2 copy 1 add get dup _ ne
+			{
+			aload pop findfont _sm
+			patternstroke
+			}
+			{
+			pop stroke
+			} ifelse
+		grestore
+		pop
+		} for
+	pop
+	} for
+restore
+newpath
+} ddef
+/_pss
+{
+save
+/_doClip 0 ddef
+0 1 _sdd length 1 sub
+	{
+	/_sd exch _sdd exch get ddef
+	_sd
+	0 2 _sd length 2 sub
+		{
+		gsave
+		2 copy get dup _ ne
+			{
+			cvx exec _sc
+			}
+			{
+			pop
+			} ifelse
+		2 copy 1 add get dup _ ne
+			{
+			aload pop findfont _sm
+			10 copy 6 npop patternashowstroke
+			}
+			{
+			pop 7 copy 3 npop ss
+			} ifelse
+		grestore
+		pop
+		} for
+	pop
+	} for
+restore
+pop sw rmoveto
+} ddef
+/_pjss
+{
+save
+/_doClip 0 ddef
+0 1 _sdd length 1 sub
+	{
+	/_sd exch _sdd exch get ddef
+	_sd
+	0 2 _sd length 2 sub
+		{
+		gsave
+		2 copy get dup _ ne
+			{
+			cvx exec _sc
+			}
+			{
+			pop
+			} ifelse
+		2 copy 1 add get dup _ ne
+			{
+			aload pop findfont _sm
+			13 copy 6 npop patternawidthshowstroke
+			}
+			{
+			pop 10 copy 3 npop jss
+			} ifelse
+		grestore
+		pop
+		} for
+	pop
+	} for
+restore
+pop swj rmoveto
+} ddef
+/_lp /none ddef
+} def
+/A
+{
+pop
+} def
+/nc 3 dict def
+nc begin
+/setgray
+{
+pop
+} bind def
+/setcmykcolor
+{
+4 npop
+} bind def
+/setcustomcolor
+{
+2 npop
+} bind def
+currentdict readonly pop end
+currentdict readonly pop end
+setpacking
+/annotatepage
+{
+} def
+%%EndResource
+%%EndProlog
+%%BeginSetup
+Adobe_cmykcolor /initialize get exec
+Adobe_cshow /initialize get exec
+Adobe_customcolor /initialize get exec
+Adobe_pattern_AI3 /initialize get exec
+Adobe_Illustrator_AI3 /initialize get exec
+%%EndSetup
+0 A
+0 O
+0.25 1 1 0.25 k
+0 R
+0 0 0 1 K
+0 J 0 j 0.2 w 4 M []0 d
+9.19971 841.8735 m
+10.3311 842.1226 8.4126 839.4165 8 839.2729 c
+9.57471 839.1421 9.3999 839.0728 v
+9 838.9233 8.8623 838.561 8.6001 838.2729 c
+7.39355 836.9985 6.49365 836.7915 7.3999 834.8735 C
+8.03125 834.9233 8.1626 835.1919 8.6001 834.8735 c
+9.32471 834.3423 7.78125 832.979 10 832.0728 c
+11.356 831.5229 14.1997 832.1792 15.7998 832.2729 C
+15.1997 831.8481 12.5186 830.4546 12.3999 829.6733 c
+12.1812 828.2612 12.9434 828.686 13.5996 828.4731 C
+13.2998 827.2544 13.106 827.5854 14.1997 827.0737 C
+13.9058 825.7485 14.3687 824.8296 15.3999 824.0737 C
+15.1309 824.0229 15.0996 823.2983 15.1997 823.4731 C
+16.7246 820.23 19.1123 818.5229 21.9995 816.6733 C
+21.6309 816.3979 20.6558 815.2925 20.5996 815.2739 C
+21.5811 815.061 22.6807 814.1675 23.1997 814.0737 c
+25.1621 813.7358 24.1309 815.5171 25.7998 814.2739 C
+26.6689 815.0239 26.7061 815.8735 25.9995 816.2729 C
+28.0439 816.4048 32.4873 820.0112 33.7998 821.6733 c
+34.6494 822.7612 35.0557 823.9985 34.999 825.4731 C
+36.499 826.3667 36.6807 826.5669 35.999 828.0737 C
+38.5498 828.7544 34.6494 830.9604 33.5996 831.6733 C
+35.2559 831.6235 37.4619 830.6421 39.3994 831.0728 c
+40.8428 831.4048 40.2432 832.3169 40.5996 833.2729 c
+41.0186 834.4165 42.5557 833.5415 42.999 834.4731 c
+43.1182 834.7417 42.999 836.0728 Y
+42.3311 836.8979 41.6055 837.5981 40.7998 838.2729 c
+40.0811 838.8794 42.4736 838.6919 41.999 838.8735 c
+41.293 839.1479 40.9424 840.7671 40.5996 841.4731 C
+42.5557 840.1978 45.3623 837.6665 44.5986 833.8735 c
+44.124 831.5298 41.2871 829.8423 40.1992 827.8735 c
+37.6934 823.3608 36.5117 817.7612 33.3994 813.8735 c
+33.2178 813.6548 33.1182 813.3608 32.7998 813.2739 c
+32.3496 813.1606 33.4121 812.8677 33.5996 812.8735 c
+38.4121 813.0864 39.874 811.2544 40.7998 816.0737 C
+40.8428 815.8169 40.4053 818.0737 42.1992 818.6733 C
+42.5557 815.4302 40.749 813.4673 39.3994 811.2739 C
+37.5996 811.7231 36.3115 812.2739 33.7998 812.2739 C
+33.7998 810.0112 33.793 805.686 33.1992 804.4731 c
+33.168 804.4233 32.6182 803.5981 32.7998 803.4731 c
+33.9248 802.7231 34.6367 801.4048 34.1992 800.0737 c
+33.9365 799.3052 32.999 797.7427 33.7998 797.2739 c
+35.624 796.2114 37.168 797.3052 38.7998 796.8735 C
+40.0742 800.6548 40.874 803.8608 42.1992 807.8735 C
+42.624 807.6987 42.6924 807.5425 42.999 807.2739 C
+44.7861 810.73 46.999 812.7485 47.999 817.0737 C
+48.3994 815.8735 L
+49.7373 815.98 49.999 816.0737 V
+48.4678 814.7856 47.0674 812.6235 46.999 812.4731 c
+44.9561 809.3237 44.4111 808.8481 43.999 807.2739 C
+44.9932 807.2427 44.6494 807.5552 45.5986 806.6733 C
+44.6436 805.8989 45.2686 805.9048 44.7998 805.0737 c
+44.7617 805.0171 44.0742 805.0737 43.999 805.0737 C
+43.624 803.2427 42.4307 802.436 41.999 801.0737 c
+41.3994 799.2046 41.5557 798.2983 40.3994 796.4741 c
+38.4561 793.4302 38.249 794.9546 34.5996 793.8745 c
+33.7686 792.7495 33.5996 792.6733 v
+32.6748 792.2983 31.1309 792.1987 30.1992 792.0737 C
+30.9619 790.1802 31.7998 790.4741 34.3994 790.4741 C
+35.0371 788.0308 35.1934 789.2681 37.1992 788.2739 c
+38.0742 787.8433 38.793 786.0991 39.3994 785.2739 c
+39.999 784.4614 41.499 783.8433 41.999 783.0737 c
+42.1807 782.7866 41.668 782.5308 41.5996 782.4741 C
+44.5049 779.7056 47.499 773.8804 51.1992 772.0737 c
+51.3242 772.0181 51.7803 771.8862 51.7998 771.8745 c
+52.1436 771.6929 52.2178 771.3745 52.3994 771.2749 C
+50.8682 771.6245 51.3057 771.1558 50.999 771.2749 C
+51.2178 769.8745 50.5986 769.8745 V
+49.4561 774.1743 45.3369 775.1304 43.5986 778.8745 C
+43.3555 778.4624 42.8369 778.3179 42.7998 778.2749 C
+40.999 780.8931 38.7305 783.2056 37.3994 786.0737 C
+36.4248 785.9429 35.9678 785.9429 34.999 786.0737 C
+35.1553 784.6245 35.5244 783.0181 35.3994 781.2749 c
+35.2432 779.2612 34.8623 776.6558 34.5996 774.6743 C
+35.3623 774.3237 36.1309 773.9556 36.7998 773.4741 c
+37.2559 773.1499 38.1992 772.437 38.3994 771.8745 c
+39.1621 769.6929 38.1992 765.2183 38.5996 762.0747 c
+38.6748 761.437 39.2871 760.2368 39.1992 759.4741 c
+39.1494 759.0991 38.4619 758.9116 38.5996 758.0747 c
+38.7686 757.0122 39.7549 755.5435 40.1992 754.6753 c
+41.0811 752.9253 41.6924 751.1128 41.999 748.8745 C
+40.3496 749.8628 41.7373 748.5815 40.1992 748.0747 c
+39.7061 747.9185 40.1992 748.8745 Y
+40.3115 751.7866 39.9424 753.1685 38.999 755.2749 c
+38.9492 755.3804 38.0498 756.2866 37.999 756.4741 c
+37.2178 759.269 36.6367 763.4556 36.999 767.4741 c
+37.1992 769.7495 37.5303 770.1245 35.999 770.8745 c
+35.3311 771.2056 34.8994 771.2437 33.999 771.4741 C
+33.3057 768.7056 32.5557 766.3491 30.999 764.4741 c
+27.2686 759.9995 20.481 761.3491 17.9995 766.0737 c
+17.1621 767.6675 16.3745 769.3179 15.7998 771.2749 C
+14.7061 770.8745 14.106 770.73 13 770.2749 C
+13.5308 766.6675 12.6812 763.0366 12.7998 760.0747 C
+12.5308 760.4312 12.0562 760.731 11.7998 761.0747 C
+10.4248 756.4253 6.0376 755.6304 5 750.2749 C
+4.7998 752.7437 4 751.8745 Y
+3.20605 751.9312 3.625 752.4683 3.6001 752.4741 C
+5.65625 753.9116 9.43115 757.1304 10.3999 759.4741 c
+11.6875 762.606 10.7437 769.3433 12 771.8745 c
+12.4497 772.7993 14.3062 773.5366 15.1997 774.0737 C
+14.7124 777.6558 14.1436 781.7925 14.5996 785.8745 C
+13.8184 785.8745 12.9746 785.8745 12.1997 785.8745 C
+11.6997 783.9868 10.1812 779.5679 9.19971 778.0737 c
+9.125 777.9683 8.5376 778.2368 8.3999 778.2749 C
+8.10596 777.1675 8.2876 776.6616 7.7998 775.6743 c
+7.79346 775.6675 7.2251 775.6743 7.19971 775.6743 C
+6.08105 773.3062 2.625 770.9116 4.19971 767.8745 C
+3.88721 768.0425 3.49365 768.4312 3.3999 768.4741 C
+3.33105 768.4741 3.26855 768.4741 3.19971 768.4741 C
+3 768.6675 3.08105 769.1304 3 769.4741 C
+0.90625 769.6245 1.65625 769.6187 2.6001 770.4741 c
+3.94971 771.7124 5.19385 773.7368 6.19971 775.2749 c
+4.34375 772.1187 8.3125 778.4487 7 778.4741 C
+7.51855 779.5181 8.44336 780.4995 9 781.4741 C
+8.78125 781.5181 9.19971 782.2749 Y
+8.9751 782.2241 8.8999 782.1812 8.6001 782.0737 C
+10.2813 783.4116 10.3062 786.6304 12 787.8745 c
+14.1748 789.48 14.7935 787.48 15.5996 790.6733 C
+18.1558 790.6733 19.1245 790.0806 19.7998 792.0737 C
+19.8496 792.0864 18.7998 792.0737 Y
+18.0435 792.2983 16.062 792.2495 15.1997 792.6733 c
+14.9434 792.8052 14.6685 793.7808 14.3999 793.8745 c
+10.856 795.1489 10.5747 792.9116 8.6001 796.6733 c
+6.70605 800.2739 6.4126 803.3481 4.19971 806.0737 C
+4.76855 806.9175 4.86865 806.7544 5.3999 807.0737 C
+3.6626 809.73 2.69385 813.2114 0 814.2739 C
+0 814.3481 0.037598 815.0552 0 815.0737 C
+1.2251 815.4106 1.44385 815.311 2.3999 815.8735 C
+1.44385 813.9487 5.23096 809.1489 6.3999 806.6733 C
+7.1748 807.186 7.13721 807.6177 7.7998 806.2739 C
+7.70605 806.2173 7.5874 805.2612 7.6001 805.0737 c
+7.75 802.3608 9.5625 799.7358 10.1997 796.6733 C
+12.1748 797.1802 13.3999 796.6304 15.5996 797.2739 C
+15.2061 799.3921 14.6309 800.1548 14.1997 802.2739 C
+15.4873 802.5171 15.231 802.6548 16.1997 803.4731 c
+16.437 803.6802 15.8184 804.23 15.7998 804.2739 c
+15.2749 805.3735 15.1875 810.2046 15.3999 812.0737 C
+13.7124 811.73 12.3311 810.6606 11.1997 810.4731 c
+10.7749 810.4106 10.4248 810.4731 10 810.4731 C
+9.2749 812.2671 6.80615 814.355 6.6001 815.4731 c
+6.4375 816.3481 6.875 816.7856 7 817.2729 C
+7.1499 817.1733 7.94336 817.0854 8 817.0737 C
+8.44336 814.0796 9.2373 813.8921 10.5996 811.4731 C
+12.6558 811.8794 14.0186 812.7231 16.3999 813.0737 C
+13.4497 817.5854 12.0747 823.5542 9.3999 828.4731 c
+8.1875 830.6978 5.5249 832.2856 5.19971 835.2729 c
+5.16846 835.5103 5.38086 836.1919 5.3999 836.0728 C
+5.79346 838.0298 6.21875 838.8296 7.19971 840.0728 c
+7.50586 840.4731 7.81836 840.9673 8.19971 841.2729 c
+8.3999 841.4419 8.9624 841.8228 9.19971 841.8735 c
+b
+%%PageTrailer
+gsave annotatepage grestore showpage
+%%Trailer
+Adobe_Illustrator_AI3 /terminate get exec
+Adobe_pattern_AI3 /terminate get exec
+Adobe_customcolor /terminate get exec
+Adobe_cshow /terminate get exec
+Adobe_cmykcolor /terminate get exec
+Adobe_packedarray /terminate get exec
+%%EOF
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/image_demo.jpg b/htmltest/sites/all/libraries/tcpdf-version/examples/images/image_demo.jpg
new file mode 100644
index 00000000..262bce27
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/examples/images/image_demo.jpg differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/image_with_alpha.png b/htmltest/sites/all/libraries/tcpdf-version/examples/images/image_with_alpha.png
new file mode 100644
index 00000000..27df6afc
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/examples/images/image_with_alpha.png differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/img.png b/htmltest/sites/all/libraries/tcpdf-version/examples/images/img.png
new file mode 100644
index 00000000..1816e3f0
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/examples/images/img.png differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/logo_example.gif b/htmltest/sites/all/libraries/tcpdf-version/examples/images/logo_example.gif
new file mode 100644
index 00000000..010b487d
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/examples/images/logo_example.gif differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/logo_example.jpg b/htmltest/sites/all/libraries/tcpdf-version/examples/images/logo_example.jpg
new file mode 100644
index 00000000..6d9b8fd8
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/examples/images/logo_example.jpg differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/logo_example.png b/htmltest/sites/all/libraries/tcpdf-version/examples/images/logo_example.png
new file mode 100644
index 00000000..13799452
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/examples/images/logo_example.png differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/pelican.ai b/htmltest/sites/all/libraries/tcpdf-version/examples/images/pelican.ai
new file mode 100644
index 00000000..75c64033
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/images/pelican.ai
@@ -0,0 +1,147 @@
+%!PS-Adobe-3.0
+%%Creator: Adobe Illustrator(TM) 3.2
+%%AI8_CreatorVersion: 12.0.0
+%%For: (fluxus) (x)
+%%Title: (pelican.ai)
+%%CreationDate: 4/15/2006 11:28 PM
+%%BoundingBox: 38 221 564 654
+%%DocumentProcessColors: Black
+%%DocumentNeededResources: procset Adobe_packedarray 2.0 0
+%%+ procset Adobe_cshow 1.1 0
+%%+ procset Adobe_customcolor 1.0 0
+%%+ procset Adobe_pattern_AI3 1.0 0
+%%+ procset Adobe_Illustrator_AI3 1.0 1
+%AI3_ColorUsage: Color
+%%CMYKCustomColor: 1 1 1 1 ([Registration])
+%AI3_TemplateBox: 298.5 420.3896 298.5 420.3896
+%AI3_TileBox: 0.157715 0.044861 595.1177 841.9648
+%AI3_DocumentPreview: None
+%%PageOrigin:-32 11.8896
+%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9
+%AI9_Flatten: 1
+%AI12_CMSettings: 00.MS
+%%EndComments
+%%BeginProlog
+%%IncludeResource: procset Adobe_packedarray 2.0 0
+Adobe_packedarray /initialize get exec
+%%IncludeResource: procset Adobe_cshow 1.1 0
+%%IncludeResource: procset Adobe_customcolor 1.0 0
+%%IncludeResource: procset Adobe_pattern_AI3 1.0 0
+%%IncludeResource: procset Adobe_Illustrator_AI3 1.0 1
+%%EndProlog
+%%BeginSetup
+Adobe_cshow /initialize get exec
+Adobe_customcolor /initialize get exec
+Adobe_pattern_AI3 /initialize get exec
+Adobe_Illustrator_AI3 /initialize get exec
+%%EndSetup
+0 A
+0 O
+0.823529 g
+0 J 0 j 1 w 4 M []0 d
+406.3574 653.9336 m
+464.8369 654.4839 476.1016 604.7227 506.8555 577.2656 c
+518.2334 567.1074 538.876 556.4058 541.0449 537.8945 C
+525.793 545.1372 515.3398 557.5967 502.1924 566.9033 c
+492.1299 574.0298 478.9131 577.0991 467.4844 582.9634 c
+454.5439 589.603 441.3213 599.4785 424.4873 589.1792 c
+413.7012 582.5776 412.9746 565.8579 406.3574 554.9893 c
+401.2715 546.6338 390.2637 539.4668 382.0098 534.269 c
+370.5801 527.0684 326.3232 509.3872 322.4365 499.042 C
+331.416 493.8628 340.3955 488.6816 349.375 483.5005 C
+370.4541 474.8203 420.0293 453.8994 428.1152 435.3247 C
+427.9424 435.3247 427.7695 435.3247 427.5967 435.3247 C
+422.0781 438.2988 418.0566 441.834 411.0205 443.6128 C
+411.0205 442.9214 411.0205 442.2324 411.0205 441.541 C
+415.6807 438.0884 420.3457 434.6333 425.0059 431.1807 C
+426.5615 431.6968 428.1152 432.2153 429.6689 432.7339 C
+436.3252 429.1694 440.0146 421.5771 446.2451 417.1924 c
+468.749 401.3643 540.2861 360.04 557.624 408.9043 C
+559.6963 408.7314 561.7676 408.5586 563.8398 408.3857 C
+564.2002 369.6592 525.0967 377.3896 496.4951 382.4844 c
+485.8457 384.3838 476.0742 379.3203 465.4141 380.9307 c
+458.0371 382.0459 454.999 385.5068 447.8008 386.1123 C
+444.6514 384.4326 443.9072 382.2314 441.583 379.8955 C
+441.7559 379.5498 441.9287 379.2041 442.1016 378.8584 C
+453.1211 376.5439 474.8496 358.7158 485.6162 352.4404 c
+499.0371 344.6182 513.7188 346.8398 528.6133 341.043 C
+531.0205 346.2412 546.2559 365.248 551.9258 365.9072 C
+552.0986 365.3896 552.2715 364.8721 552.4424 364.3545 C
+553.4883 360.7607 550.0078 356.1338 548.2988 353.4756 c
+539.4346 339.6855 527.2559 336.8584 503.748 337.415 C
+507.8379 329.7158 516.5977 331.1191 522.3965 325.501 C
+510.8311 324.9131 495.6875 323.7822 486.6533 327.5732 C
+483.0273 329.6455 479.4004 331.7178 475.7744 333.79 C
+468.749 335.082 467.1133 328.6885 461.7891 327.5732 c
+451.8096 325.4854 442.6299 328.9424 433.8125 329.6455 C
+427.6152 314.2881 411.4697 330.1348 399.1045 326.5381 C
+395.1328 323.6025 391.1621 320.666 387.1904 317.7314 C
+380.2559 315.4561 375.2725 320.9756 368.0234 319.2861 C
+363.707 316.8682 359.3877 314.4502 355.0732 312.0322 C
+346.0449 325.4189 337.3516 308.3584 325.0264 313.0693 c
+319.249 315.2764 317.3877 322.9951 312.0762 324.9834 c
+302.3477 328.626 290.0044 321.8848 280.4756 325.501 c
+275.7075 327.3125 274.5767 334.043 270.1157 335.8623 C
+266.6616 335.6885 263.208 335.5166 259.7544 335.3428 C
+254.7881 336.4834 253.1904 341.9092 248.8755 343.6338 C
+245.7686 343.8066 242.6592 343.9775 239.5513 344.1494 C
+236.9614 347.4326 234.3711 350.7119 231.7803 353.9941 C
+227.1187 356.2158 222.1738 353.7666 218.312 356.0654 C
+217.707 358.9385 216.9556 361.4961 214.6855 362.8008 C
+210.5415 362.9736 206.396 363.1465 202.2529 363.3174 C
+200.6987 365.3896 199.145 367.4639 197.5903 369.5332 C
+193.9648 370.2246 190.3384 370.916 186.7119 371.6074 C
+183.0776 383.6631 179.9097 377.1084 172.7246 383.0029 C
+172.0347 384.5557 171.3433 386.1123 170.6528 387.665 C
+167.4033 390.2705 160.396 389.1025 157.1846 391.291 C
+150.2778 399.2334 143.3691 407.1787 136.4629 415.1201 C
+135.7725 415.1201 135.0811 415.1201 134.3906 415.1201 C
+129.8872 408.9912 123.022 405.2783 118.332 399.5791 c
+109.856 389.2803 103.8877 376.3271 98.6465 362.8008 c
+91.7344 344.96 87.7056 323.8467 83.6235 304.2627 c
+81.5273 294.2061 81.9316 284.2168 78.4434 275.7705 c
+74.5234 266.2822 66.5 259.7139 60.8296 251.9404 c
+54.7129 243.5557 51.2388 224.7588 40.627 221.3779 C
+40.7998 221.7217 40.9727 222.0674 41.144 222.4131 C
+39.79 227.2139 42.2383 230.333 43.2163 234.3291 C
+41.1147 235.4502 39.3652 235.8232 38.5547 238.4736 C
+40.1084 244.3438 41.6626 250.2139 43.2163 256.085 C
+42.6357 258.7764 38.5103 262.4824 40.1084 267.4814 c
+41.354 271.3818 44.9365 271.5908 45.2896 277.3262 C
+43.8086 279.5244 41.9907 280.7529 40.1084 282.5049 C
+40.1084 282.6777 40.1084 282.8506 40.1084 283.0234 C
+52.8052 283.6553 57.1475 290.5166 61.3481 299.6006 C
+53.7988 301.8721 41.7808 303.3838 38.5547 309.96 C
+46.126 307.9092 59.4692 305.3623 67.0459 307.3721 C
+69.4639 315.3115 71.8813 323.2568 74.2993 331.1992 C
+77.9248 347.085 81.5513 362.9736 85.1777 378.8584 C
+87.957 392.2158 84.7827 409.2002 90.3579 419.7832 C
+92.7749 421.6826 95.1934 423.5815 97.6104 425.481 C
+99.3364 431.1782 101.064 436.8784 102.7905 442.5757 C
+107.7554 450.8428 114.814 456.6777 119.3677 465.8892 C
+115.0508 468.8232 110.7329 471.7593 106.417 474.6938 C
+106.7617 476.2495 107.1074 477.8027 107.4531 479.3564 C
+93.3389 475.1343 85.5649 470.4336 75.8525 462.7798 C
+65.6665 462.7798 55.4756 462.7798 45.2896 462.7798 C
+45.4609 463.1255 45.6338 463.4712 45.8066 463.8169 C
+74.2612 470.5581 82.3726 479.2275 102.7905 491.7886 C
+114.7041 497.832 126.6211 503.8774 138.5347 509.9204 C
+142.1606 513.2007 145.7881 516.4824 149.4136 519.7622 C
+168.4629 531.9883 188.5562 540.2256 210.5415 549.8081 c
+217.877 553.0059 224.0391 558.6489 232.2988 561.2056 c
+245.8008 565.3853 266.6577 569.8081 284.1025 566.3867 C
+292.7354 563.4507 301.3701 560.5142 310.0039 557.5801 C
+324.5254 553.9165 346.2764 558.8447 355.0732 564.3149 c
+369.0625 573.0098 372.4688 593.5171 375.793 613.0088 C
+376.6572 620.606 377.5195 628.2046 378.3838 635.8013 C
+383.2783 647.8481 394.3535 648.647 406.3574 653.9336 C
+f
+%%PageTrailer
+gsave annotatepage grestore showpage
+%%Trailer
+Adobe_Illustrator_AI3 /terminate get exec
+Adobe_pattern_AI3 /terminate get exec
+Adobe_customcolor /terminate get exec
+Adobe_cshow /terminate get exec
+Adobe_packedarray /terminate get exec
+%%EOF
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/tcpdf_cell.png b/htmltest/sites/all/libraries/tcpdf-version/examples/images/tcpdf_cell.png
new file mode 100644
index 00000000..98a1553a
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/examples/images/tcpdf_cell.png differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/tcpdf_logo.jpg b/htmltest/sites/all/libraries/tcpdf-version/examples/images/tcpdf_logo.jpg
new file mode 100644
index 00000000..257f8fb6
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/examples/images/tcpdf_logo.jpg differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/tcpdf_signature.png b/htmltest/sites/all/libraries/tcpdf-version/examples/images/tcpdf_signature.png
new file mode 100644
index 00000000..a4f06372
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/examples/images/tcpdf_signature.png differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/testsvg.svg b/htmltest/sites/all/libraries/tcpdf-version/examples/images/testsvg.svg
new file mode 100644
index 00000000..fd8314e3
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/images/testsvg.svg
@@ -0,0 +1,328 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   width="12cm"
+   height="6cm"
+   id="svg2">
+  <desc
+     id="desc4">TCPDF SVG EXAMPLE</desc>
+  <defs
+     id="defs42">
+    <radialGradient
+       cx="85"
+       cy="15"
+       r="5.25"
+       fx="85"
+       fy="15"
+       id="radialGradient2865"
+       xlink:href="#MyRGradient"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="60"
+       cy="25"
+       r="10.5"
+       fx="60"
+       fy="25"
+       id="radialGradient2867"
+       xlink:href="#MyRGradient"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="17.82198"
+       cy="28.055244"
+       r="10.871407"
+       fx="17.82198"
+       fy="28.055244"
+       id="radialGradient2869"
+       xlink:href="#MyRGradient"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.6200333,0,0,1.8396889,173.9517,-9.005912)" />
+    <radialGradient
+       cx="184.10963"
+       cy="476.55164"
+       r="74.151497"
+       fx="184.10963"
+       fy="476.55164"
+       id="radialGradient5087"
+       xlink:href="#linearGradient5075"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.2520801,0,0,1.0907419,-234.6921,-1.613686)" />
+    <linearGradient
+       id="linearGradient5075">
+      <stop
+         id="stop5077"
+         style="stop-color:#ffff00;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop5079"
+         style="stop-color:#ff0000;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <radialGradient
+       cx="184.10963"
+       cy="476.55164"
+       r="74.151497"
+       fx="184.10963"
+       fy="476.55164"
+       id="radialGradient2846"
+       xlink:href="#linearGradient5075"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.2520801,0,0,1.0907419,-234.6921,-1.613686)" />
+    <linearGradient
+       id="linearGradient2848">
+      <stop
+         id="stop2850"
+         style="stop-color:#ffff00;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2852"
+         style="stop-color:#ff0000;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <radialGradient
+       cx="184.10963"
+       cy="476.55164"
+       r="74.151497"
+       fx="184.10963"
+       fy="476.55164"
+       id="radialGradient2854"
+       xlink:href="#linearGradient5075"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.2520801,0,0,1.0907419,-234.6921,-1.613686)" />
+    <linearGradient
+       id="linearGradient2856">
+      <stop
+         id="stop2858"
+         style="stop-color:#ffff00;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2860"
+         style="stop-color:#ff0000;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <radialGradient
+       cx="184.10963"
+       cy="476.55164"
+       r="74.151497"
+       fx="184.10963"
+       fy="476.55164"
+       id="radialGradient2862"
+       xlink:href="#linearGradient5075"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.2520801,0,0,1.0907419,-234.6921,-1.613686)" />
+    <linearGradient
+       id="linearGradient2864">
+      <stop
+         id="stop2866"
+         style="stop-color:#ffff00;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2868"
+         style="stop-color:#ff0000;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <radialGradient
+       cx="184.10963"
+       cy="476.55164"
+       r="74.151497"
+       fx="184.10963"
+       fy="476.55164"
+       id="radialGradient2885"
+       xlink:href="#linearGradient5075"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.2520801,0,0,1.0907419,-234.6921,-1.613686)" />
+    <radialGradient
+       cx="60"
+       cy="25"
+       r="10.5"
+       fx="60"
+       fy="25"
+       id="radialGradient5215"
+       xlink:href="#MyRGradient"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="184.10963"
+       cy="476.55164"
+       r="74.151497"
+       fx="184.10963"
+       fy="476.55164"
+       id="radialGradient5223"
+       xlink:href="#linearGradient5075"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.2520801,0,0,1.0907419,-234.6921,-1.613686)" />
+    <radialGradient
+       cx="184.10963"
+       cy="476.55164"
+       r="74.151497"
+       fx="184.10963"
+       fy="476.55164"
+       id="radialGradient5245"
+       xlink:href="#linearGradient5075"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.2520801,0,0,1.0907419,-234.6921,-1.613686)" />
+    <radialGradient
+       cx="184.10963"
+       cy="476.55164"
+       r="74.151497"
+       fx="184.10963"
+       fy="476.55164"
+       id="radialGradient5261"
+       xlink:href="#linearGradient5075"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.2520801,0,0,1.0907419,-234.6921,-1.613686)" />
+    <radialGradient
+       cx="184.10963"
+       cy="476.55164"
+       r="74.151497"
+       fx="184.10963"
+       fy="476.55164"
+       id="radialGradient5264"
+       xlink:href="#linearGradient5075"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.53063427,0,0,0.17133835,-41.5959,-53.579631)" />
+    <radialGradient
+       cx="184.10963"
+       cy="476.55164"
+       r="74.151497"
+       fx="184.10963"
+       fy="476.55164"
+       id="radialGradient5267"
+       xlink:href="#linearGradient5075"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.53063427,0,0,0.17133835,-41.5959,-53.579631)" />
+    <radialGradient
+       cx="184.10963"
+       cy="476.55164"
+       r="74.151497"
+       fx="184.10963"
+       fy="476.55164"
+       id="radialGradient5270"
+       xlink:href="#linearGradient5075"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.53063427,0,0,0.17133835,-41.5959,-53.579631)" />
+    <radialGradient
+       cx="85"
+       cy="15"
+       r="5.25"
+       fx="85"
+       fy="15"
+       id="radialGradient5295"
+       xlink:href="#MyRGradient"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <linearGradient
+     x1="2.4930596"
+     y1="8.1225491"
+     x2="58.448399"
+     y2="8.1225491"
+     id="MyLGradient"
+     gradientUnits="userSpaceOnUse"
+     gradientTransform="matrix(2.1674701,3.2244804e-8,-1.0401032e-8,0.46846403,253.27742,-193.75856)">
+    <stop
+       id="stop7"
+       style="stop-color:#ff6600;stop-opacity:1"
+       offset="0.05" />
+    <stop
+       id="stop9"
+       style="stop-color:#ffff66;stop-opacity:1"
+       offset="0.94999999" />
+  </linearGradient>
+  <radialGradient
+     id="MyRGradient">
+    <stop
+       id="stop12"
+       style="stop-color:#0033ff;stop-opacity:1"
+       offset="0.05" />
+    <stop
+       id="stop14"
+       style="stop-color:#ffff66;stop-opacity:1"
+       offset="0.94999999" />
+  </radialGradient>
+  <rect
+     width="120.08073"
+     height="25.367481"
+     rx="3.602421"
+     ry="2.5367482"
+     x="259.28146"
+     y="-189.53065"
+     transform="matrix(0.71626866,0.69782463,-0.72008162,0.69388937,0,0)"
+     id="rect16"
+     style="fill:url(#MyLGradient);stroke:#0000ff;stroke-width:1.00766146" />
+  <ellipse
+     cx="90"
+     cy="30"
+     rx="20"
+     ry="10"
+     transform="matrix(1.4285714,0,0,1.4285714,178.03709,88.814199)"
+     id="ellipse20"
+     style="fill:#00ff00;stroke:#008000;stroke-width:1" />
+  <path
+     d="m 199.75816,42.607008 c 0,-25.80645 38.7097,-25.80645 38.7097,0 0,25.80645 38.70969,25.80645 38.70969,0 z"
+     id="path30"
+     style="fill:url(#radialGradient2869);stroke:#0000ff;stroke-width:1.29032314" />
+  <path
+     d="m 56.981711,101.40999 q 38.411107,-48.013879 76.822209,0 38.41109,48.01387 76.8222,0"
+     id="path32"
+     style="fill:none;stroke:#008000;stroke-width:0.96027768" />
+  <path
+     d="m 56.981711,101.40999 38.411107,-48.013879 38.411102,48.013879 38.41109,48.01387 38.41111,-48.01387"
+     id="path34"
+     style="fill:none;stroke:#888888;stroke-width:0.38411102" />
+  <line
+     x1="158.17"
+     y1="196.27382"
+     x2="403.61057"
+     y2="196.27382"
+     id="line22"
+     style="fill:#ff0000;stroke:#ff0000;stroke-width:2.72711658;stroke-opacity:1" />
+  <text
+     x="158.15259"
+     y="182.61755"
+     id="text38"
+     style="font-size:35.67964172px;font-weight:bold;fill:#0000ff;font-family:Helvetica">www.tcpdf.org</text>
+  <polygon
+     points="80,10 90,10 90,20 80,20 80,10 "
+     transform="matrix(4.7619048,0,0,4.7619048,-28.55484,-29.862646)"
+     id="polygon26"
+     style="fill:url(#radialGradient5295);stroke:#ff0000;stroke-width:0.5" />
+  <path
+     d="M 172.22678,86.983374 H 140.4086 A 31.818187,31.818187 0 1 0 172.22678,55.16517 z"
+     id="path10"
+     style="fill:#ff0000;stroke:#0000ff;stroke-width:1.06060624" />
+  <path
+     d="M 166.92376,81.680334 V 49.86215 a 31.818187,31.818187 0 0 0 -31.81821,31.818184 z"
+     id="path12"
+     style="fill:#ffff00;stroke:#0000ff;stroke-width:1.06060624" />
+  <path
+     d="m 191.9699,155.18875 13.78038,-6.89018 a 7.7034622,7.7034622 0 1 1 13.78037,-6.89018 l 13.78033,-6.89018 a 15.386158,7.6930793 60 0 1 13.78034,-6.89016 l 13.78034,-6.89017 a 23.073485,7.6911617 60 0 1 13.78037,-6.89019 l 13.78037,-6.89017 a 30.761945,7.6904861 60 1 1 13.78036,-6.89019 l 13.78034,-6.890167"
+     id="path14"
+     style="fill:none;stroke:#ff0000;stroke-width:1.37803578" />
+  <circle
+     cx="60"
+     cy="25"
+     r="10"
+     transform="matrix(2.3809524,0,0,2.3809524,-86.105483,113.11357)"
+     id="circle18"
+     style="fill:url(#radialGradient5215);stroke:#ff0000;stroke-width:1" />
+  <path
+     d="m 32.361418,52.28906 48.780487,0 -24.39025,48.78049 z"
+     id="path28"
+     style="fill:#ffff00;stroke:#0000ff;stroke-width:1.21951222" />
+  <image
+     xlink:href="tcpdf_logo.jpg"
+     id="image36"
+     height="26.666664"
+     width="80"
+     y="111.32501"
+     x="16.751661" />
+  <text
+     x="13.399332"
+     y="41.580627"
+     id="text5343"
+     xml:space="preserve"
+     style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#008000;font-family:helvetica;font-size:30pt">SVG</text>
+</svg>
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/tiger.ai b/htmltest/sites/all/libraries/tcpdf-version/examples/images/tiger.ai
new file mode 100644
index 00000000..23c50c4c
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/images/tiger.ai
@@ -0,0 +1,3599 @@
+%!PS-Adobe-3.0
+%%Creator: Adobe Illustrator(TM) 3.2
+%%AI8_CreatorVersion: 12.0.0
+%%For: (fluxus) (x)
+%%Title: (tiger.ai)
+%%CreationDate: 4/14/2006 11:35 PM
+%%BoundingBox: 22 167 567 730
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%%DocumentNeededResources: procset Adobe_packedarray 2.0 0
+%%+ procset Adobe_cmykcolor 1.1 0
+%%+ procset Adobe_cshow 1.1 0
+%%+ procset Adobe_customcolor 1.0 0
+%%+ procset Adobe_pattern_AI3 1.0 0
+%%+ procset Adobe_Illustrator_AI3 1.0 1
+%AI3_ColorUsage: Color
+%%CMYKCustomColor: 0.74902 0.678431 0.670588 0.901961 ([Registration])
+%AI3_TemplateBox: 306.5 396.5 306.5 396.5
+%AI3_TileBox: 0 1 612 793
+%AI3_DocumentPreview: None
+%%PageOrigin:0 0
+%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9
+%AI9_Flatten: 1
+%AI12_CMSettings: 00.MS
+%%EndComments
+%%BeginProlog
+%%IncludeResource: procset Adobe_packedarray 2.0 0
+Adobe_packedarray /initialize get exec
+%%IncludeResource: procset Adobe_cmykcolor 1.1 0
+%%IncludeResource: procset Adobe_cshow 1.1 0
+%%IncludeResource: procset Adobe_customcolor 1.0 0
+%%IncludeResource: procset Adobe_pattern_AI3 1.0 0
+%%IncludeResource: procset Adobe_Illustrator_AI3 1.0 1
+%%EndProlog
+0 A
+u
+0 O
+1 g
+0 J 0 j 1 w 4 M []0 d
+90.5 477.5 m
+90.5767 475.4434 89.7798 475.5801 v
+88.7646 475.4863 70.6641 528.3682 48.02 525.9795 c
+67.6445 533.9883 90.5 477.5 v
+F
+0 R
+0 G
+0.1892 w 10 M
+90.5 477.5 m
+90.5767 475.4434 89.7798 475.5801 v
+88.7646 475.4863 70.6641 528.3682 48.02 525.9795 c
+67.6445 533.9883 90.5 477.5 v
+90.5 477.5 l
+s
+0 O
+1 g
+1 w 4 M
+94.3398 480.8594 m
+93.7446 478.8555 92.8999 479.1797 v
+92.0552 479.5107 93.0249 535.3975 71.0601 540.8594 c
+92.0981 541.709 94.3398 480.8594 v
+F
+0 R
+0 G
+0.1892 w 10 M
+94.3398 480.8594 m
+93.7446 478.8555 92.8999 479.1797 v
+92.0552 479.5107 93.0249 535.3975 71.0601 540.8594 c
+92.0981 541.709 94.3398 480.8594 v
+94.3398 480.8594 l
+s
+0 O
+1 g
+1 w 4 M
+124.5801 434.2998 m
+126.3872 433.2363 125.7798 432.3799 v
+125.3525 431.7461 71.2617 445.8291 60.98 425.6602 c
+64.9063 446.4102 124.5801 434.2998 v
+F
+0 R
+0 G
+0.1892 w 10 M
+124.5801 434.2998 m
+126.3872 433.2363 125.7798 432.3799 v
+125.3525 431.7461 71.2617 445.8291 60.98 425.6602 c
+64.9063 446.4102 124.5801 434.2998 v
+124.5801 434.2998 l
+s
+0 O
+1 g
+1 w 4 M
+121.46 423.0195 m
+123.5381 422.624 123.3799 421.8193 v
+123.0249 420.8838 67.2534 417.207 63.8599 394.7002 c
+61.04 415.7598 121.46 423.0195 v
+F
+0 R
+0 G
+0.1892 w 10 M
+121.46 423.0195 m
+123.5381 422.624 123.3799 421.8193 v
+123.0249 420.8838 67.2534 417.207 63.8599 394.7002 c
+61.04 415.7598 121.46 423.0195 v
+121.46 423.0195 l
+s
+0 O
+1 g
+1 w 4 M
+116.8999 429.0195 m
+118.8223 428.4082 118.3398 427.5801 v
+118.0615 426.7617 62.3481 431.2617 55.7002 409.5801 c
+55.9902 430.7334 116.8999 429.0195 v
+F
+0 R
+0 G
+0.1892 w 10 M
+116.8999 429.0195 m
+118.8223 428.4082 118.3398 427.5801 v
+118.0615 426.7617 62.3481 431.2617 55.7002 409.5801 c
+55.9902 430.7334 116.8999 429.0195 v
+116.8999 429.0195 l
+s
+0 O
+1 g
+1 w 4 M
+105.1401 449.1797 m
+106.5298 447.6514 105.8599 447.0195 v
+105.123 446.5039 57.0054 474.9434 41.54 458.2998 c
+51.0586 477.2549 105.1401 449.1797 v
+F
+0 R
+0 G
+0.1892 w 10 M
+105.1401 449.1797 m
+106.5298 447.6514 105.8599 447.0195 v
+105.123 446.5039 57.0054 474.9434 41.54 458.2998 c
+51.0586 477.2549 105.1401 449.1797 v
+105.1401 449.1797 l
+s
+0 O
+1 g
+1 w 4 M
+96.7402 444.6201 m
+98.3936 443.2139 97.7002 442.46 v
+97.1265 441.9131 46.0977 464.7266 32.4199 446.54 c
+39.9297 466.3496 96.7402 444.6201 v
+F
+0 R
+0 G
+0.1892 w 10 M
+96.7402 444.6201 m
+98.3936 443.2139 97.7002 442.46 v
+97.1265 441.9131 46.0977 464.7266 32.4199 446.54 c
+39.9297 466.3496 96.7402 444.6201 v
+96.7402 444.6201 l
+s
+0 O
+1 g
+1 w 4 M
+93.8599 440.0596 m
+95.6982 438.9629 95.0601 438.1396 v
+94.6206 437.5059 40.9614 453.1494 30.02 433.3398 c
+34.6279 453.917 93.8599 440.0596 v
+F
+0 R
+0 G
+0.1892 w 10 M
+93.8599 440.0596 m
+95.6982 438.9629 95.0601 438.1396 v
+94.6206 437.5059 40.9614 453.1494 30.02 433.3398 c
+34.6279 453.917 93.8599 440.0596 v
+93.8599 440.0596 l
+s
+0 O
+1 g
+1 w 4 M
+105.6201 439.3398 m
+106.9736 437.7129 106.1001 437.1797 v
+105.4302 436.7549 61.3545 471.1279 43.7002 456.6201 c
+55.7529 474.1826 105.6201 439.3398 v
+F
+0 R
+0 G
+0.1892 w 10 M
+105.6201 439.3398 m
+106.9736 437.7129 106.1001 437.1797 v
+105.4302 436.7549 61.3545 471.1279 43.7002 456.6201 c
+55.7529 474.1826 105.6201 439.3398 v
+105.6201 439.3398 l
+s
+0 O
+1 g
+1 w 4 M
+84.02 471.2598 m
+84.6416 469.2607 83.7798 469.0996 v
+82.8799 468.8213 51.4209 515.0215 30.2598 506.7803 c
+47.0215 519.6416 84.02 471.2598 v
+F
+0 R
+0 G
+0.1892 w 10 M
+84.02 471.2598 m
+84.6416 469.2607 83.7798 469.0996 v
+82.8799 468.8213 51.4209 515.0215 30.2598 506.7803 c
+47.0215 519.6416 84.02 471.2598 v
+84.02 471.2598 l
+s
+0 O
+1 g
+1 w 4 M
+84.7402 463.5801 m
+85.8174 461.7725 84.98 461.4199 v
+84.1929 460.9639 43.5078 499.292 24.7402 486.6201 c
+38.2158 502.8535 84.7402 463.5801 v
+F
+0 R
+0 G
+0.1892 w 10 M
+84.7402 463.5801 m
+85.8174 461.7725 84.98 461.4199 v
+84.1929 460.9639 43.5078 499.292 24.7402 486.6201 c
+38.2158 502.8535 84.7402 463.5801 v
+84.7402 463.5801 l
+s
+0 O
+1 g
+1 w 4 M
+84.5 458.7803 m
+85.8535 457.0732 84.98 456.6201 v
+84.3105 456.1182 40.2344 490.4883 22.5801 476.0596 c
+34.6328 493.541 84.5 458.7803 v
+F
+0 R
+0 G
+0.1892 w 10 M
+84.5 458.7803 m
+85.8535 457.0732 84.98 456.6201 v
+84.3105 456.1182 40.2344 490.4883 22.5801 476.0596 c
+34.6328 493.541 84.5 458.7803 v
+84.5 458.7803 l
+s
+0 O
+1 g
+1 w 4 M
+82.1001 456.8594 m
+82.7407 450.2168 83.8281 442.9902 85.7002 439.5801 c
+81.7808 425.9189 91.46 411.5 v
+91.0205 403.4795 92.8999 399.9795 v
+97.1816 390.7207 102.5 389.8994 v
+106.7334 389.1299 116.3286 385.7529 127.2197 384.1396 c
+146.0215 368.7197 142.5801 354.6201 v
+142.0615 336.6006 138.02 334.9395 v
+150.8599 347.1582 140.4199 328.7002 v
+135.3799 308.0596 l
+163.6206 331.7598 146.4199 311.4199 v
+135.3799 282.8594 l
+157.0205 303.1592 149.0601 293.8994 v
+145.7002 284.2998 l
+193.1001 314.1582 159.1401 281.6602 v
+168.02 285.5596 172.8198 282.3799 v
+180.3418 283.8008 179.54 282.1396 v
+156.5815 270.6006 152.6602 250.46 v
+161.8613 261.3584 158.4199 249.5 v
+158.8999 236.7803 l
+163.1816 260.4795 162.7402 219.0195 v
+183.8599 238.9209 171.1401 216.1396 v
+171.1401 197.6602 l
+187.8198 215.5996 180.7402 201.5 v
+191.7798 211.2002 187.46 194.54 v
+186.5 183.0391 191.2998 195.2598 v
+208.9399 229.0205 202.3398 200.2998 v
+201.4614 179.0791 206.6602 195.2598 v
+207.1807 183.9199 217.2197 176.0596 v
+215.9814 231.8789 230.1802 192.3799 v
+234.5 174.1396 l
+237.541 184.3594 237.1401 189.9795 v
+253.3809 208.1191 246.02 181.3398 v
+262.6206 206.3594 259.2197 191.8994 v
+250.7407 174.2402 252.5 168.8594 v
+270.98 207.2402 272.4199 208.9395 v
+270.1016 162.3584 282.02 201.9795 v
+288.1401 188.7607 285.1401 183.9795 v
+293.8613 192.7207 293.0601 196.2197 v
+298.04 205.2607 301.2197 190.2197 v
+303.1016 179.96 304.8198 183.5 v
+309.2598 157.0781 310.5801 182.0596 v
+312.3418 197.1201 304.3398 209.8994 v
+305.2998 213.3994 302.1802 217.8193 v
+317.1797 194.04 309.3799 225.7393 v
+321.582 216.9199 322.8203 216.8594 v
+307.9395 242.4385 317.54 237.2598 v
+311.9004 248.5996 331.7002 235.3398 v
+314.1006 252.999 333.3799 242.54 v
+342.2617 235.3994 333.8594 246.3799 v
+318.0605 264.001 342.2598 244.2197 v
+355.0205 226.1602 355.9395 223.0996 v
+344.9023 255.2002 340.0996 258.3799 v
+349.3018 298.3203 394.5801 281.1797 v
+402.1016 262.2393 407.0605 282.3799 v
+421.0215 289.5195 433.46 259.0996 v
+437.7422 274.1191 436.8203 277.0996 v
+444.3418 275.8779 443.54 277.0996 v
+457.9805 272.3594 459.3799 273.2598 v
+466.7813 265.7598 467.2998 269.6602 v
+477.3418 266.6406 475.2197 270.6201 v
+484.8223 253.4404 485.2998 249.5 v
+487.9395 264.8594 l
+490.0996 261.7393 l
+491.8613 270.1592 491.0605 271.5801 v
+490.1025 272.7988 512.9814 264.001 518.1797 241.0996 c
+520.5801 231.9795 l
+527.0625 248.1602 525.3799 252.6201 v
+531.0225 251.6787 531.3799 246.8594 v
+535.8613 272.3594 530.6602 279.0195 v
+535.4219 279.8408 536.6602 275.8994 v
+536.6602 283.8193 l
+544.6621 282.9199 544.5801 285.5 v
+549.502 289.959 551.7793 284.7803 v
+538.0615 323.4004 558.2598 302.2998 v
+566.2207 290.4004 562.3398 311.1797 v
+558.3008 331.7598 553.9014 333.5186 559.2207 333.9795 c
+560.0625 337.9209 557.7793 339.7393 v
+555.6602 341.4385 559.2207 339.7393 y
+564.4609 335.2803 558.7402 359.4199 v
+565.7813 357.7207 552.5 389.8994 v
+555.6602 392.4795 551.2998 401.6602 v
+560.0625 396.8789 563.0605 398.54 v
+562.7021 400.3994 559.2207 404.7803 v
+535.4219 465.0801 557.7793 440.7803 v
+570.8965 425.9746 563.7793 451.0996 v
+553.834 477.4658 554.6602 482.2998 v
+82.1001 456.8594 l
+F
+0 R
+0 G
+1.1 w 10 M
+82.1001 456.8594 m
+82.7407 450.2168 83.8281 442.9902 85.7002 439.5801 c
+81.7808 425.9189 91.46 411.5 v
+91.0205 403.4795 92.8999 399.9795 v
+97.1816 390.7207 102.5 389.8994 v
+106.7334 389.1299 116.3286 385.7529 127.2197 384.1396 c
+146.0215 368.7197 142.5801 354.6201 v
+142.0615 336.6006 138.02 334.9395 v
+150.8599 347.1582 140.4199 328.7002 v
+135.3799 308.0596 l
+163.6206 331.7598 146.4199 311.4199 v
+135.3799 282.8594 l
+157.0205 303.1592 149.0601 293.8994 v
+145.7002 284.2998 l
+193.1001 314.1582 159.1401 281.6602 v
+168.02 285.5596 172.8198 282.3799 v
+180.3418 283.8008 179.54 282.1396 v
+156.5815 270.6006 152.6602 250.46 v
+161.8613 261.3584 158.4199 249.5 v
+158.8999 236.7803 l
+163.1816 260.4795 162.7402 219.0195 v
+183.8599 238.9209 171.1401 216.1396 v
+171.1401 197.6602 l
+187.8198 215.5996 180.7402 201.5 v
+191.7798 211.2002 187.46 194.54 v
+186.5 183.0391 191.2998 195.2598 v
+208.9399 229.0205 202.3398 200.2998 v
+201.4614 179.0791 206.6602 195.2598 v
+207.1807 183.9199 217.2197 176.0596 v
+215.9814 231.8789 230.1802 192.3799 v
+234.5 174.1396 l
+237.541 184.3594 237.1401 189.9795 v
+253.3809 208.1191 246.02 181.3398 v
+262.6206 206.3594 259.2197 191.8994 v
+250.7407 174.2402 252.5 168.8594 v
+270.98 207.2402 272.4199 208.9395 v
+270.1016 162.3584 282.02 201.9795 v
+288.1401 188.7607 285.1401 183.9795 v
+293.8613 192.7207 293.0601 196.2197 v
+298.04 205.2607 301.2197 190.2197 v
+303.1016 179.96 304.8198 183.5 v
+309.2598 157.0781 310.5801 182.0596 v
+312.3418 197.1201 304.3398 209.8994 v
+305.2998 213.3994 302.1802 217.8193 v
+317.1797 194.04 309.3799 225.7393 v
+321.582 216.9199 322.8203 216.8594 v
+307.9395 242.4385 317.54 237.2598 v
+311.9004 248.5996 331.7002 235.3398 v
+314.1006 252.999 333.3799 242.54 v
+342.2617 235.3994 333.8594 246.3799 v
+318.0605 264.001 342.2598 244.2197 v
+355.0205 226.1602 355.9395 223.0996 v
+344.9023 255.2002 340.0996 258.3799 v
+349.3018 298.3203 394.5801 281.1797 v
+402.1016 262.2393 407.0605 282.3799 v
+421.0215 289.5195 433.46 259.0996 v
+437.7422 274.1191 436.8203 277.0996 v
+444.3418 275.8779 443.54 277.0996 v
+457.9805 272.3594 459.3799 273.2598 v
+466.7813 265.7598 467.2998 269.6602 v
+477.3418 266.6406 475.2197 270.6201 v
+484.8223 253.4404 485.2998 249.5 v
+487.9395 264.8594 l
+490.0996 261.7393 l
+491.8613 270.1592 491.0605 271.5801 v
+490.1025 272.7988 512.9814 264.001 518.1797 241.0996 c
+520.5801 231.9795 l
+527.0625 248.1602 525.3799 252.6201 v
+531.0225 251.6787 531.3799 246.8594 v
+535.8613 272.3594 530.6602 279.0195 v
+535.4219 279.8408 536.6602 275.8994 v
+536.6602 283.8193 l
+544.6621 282.9199 544.5801 285.5 v
+549.502 289.959 551.7793 284.7803 v
+538.0615 323.4004 558.2598 302.2998 v
+566.2207 290.4004 562.3398 311.1797 v
+558.3008 331.7598 553.9014 333.5186 559.2207 333.9795 c
+560.0625 337.9209 557.7793 339.7393 v
+555.6602 341.4385 559.2207 339.7393 y
+564.4609 335.2803 558.7402 359.4199 v
+565.7813 357.7207 552.5 389.8994 v
+555.6602 392.4795 551.2998 401.6602 v
+560.0625 396.8789 563.0605 398.54 v
+562.7021 400.3994 559.2207 404.7803 v
+535.4219 465.0801 557.7793 440.7803 v
+570.8965 425.9746 563.7793 451.0996 v
+553.834 477.4658 554.6602 482.2998 v
+82.1001 456.8594 l
+82.1001 456.8594 l
+s
+0 O
+0.164706 0.627451 1 0.031373 k
+1 w 4 M
+554.6602 482.0596 m
+555.3799 481.7715 557.8066 480.5361 559.2197 478.7002 c
+566.6621 466.8418 560.9004 487.0996 v
+550.8223 518.7607 560.4199 506.54 v
+567.1016 498.5215 563.54 513.5 v
+559.3301 531.5498 556.5801 538.46 y
+569.3027 533.2803 539.7793 576.8594 v
+549.6201 572.7793 l
+527.9414 616.4404 504.2598 622.2197 v
+495.3799 628.7002 l
+537.623 670.5605 523.46 711.0195 v
+516.0605 716.7607 505.46 706.7002 v
+498.4609 701.3594 491.7793 703.0996 v
+457.9805 701.8018 455.7793 701.8994 v
+453.582 701.8018 415.3018 742.7217 343.2197 723.2598 c
+337.4219 721.1602 332.6602 722.54 v
+312.3418 740.0811 258.7397 715.0996 v
+247.6616 712.8008 246.02 712.7002 v
+244.1406 712.8008 241.0615 712.8008 232.3398 705.7393 c
+223.46 698.7197 223.0205 697.8418 220.8198 696.1396 c
+202.7817 683.7607 197.54 682.9395 v
+184.7407 675.8408 180.02 664.9395 v
+175.9399 663.5 l
+174.1807 655.6016 173.7798 654.3799 v
+168.4614 650.3213 167.54 644.0596 v
+157.9014 637.5605 158.4199 632.7793 v
+156.5815 627.001 155.7798 621.7393 v
+147.7808 616.4404 148.5801 613.3398 v
+140.2998 597.9609 141.6201 590.54 v
+134.5806 590.9209 131.54 588.3799 v
+130.6206 583.001 128.8999 582.6201 v
+125.7798 581.2393 128.4199 576.8594 v
+126.6606 573.7617 126.2598 572.0596 v
+127.1001 568.9209 122.1797 562.7002 v
+115.2197 542.0811 117.3799 536.2998 v
+117.8599 531.0801 114.7397 529.3398 v
+110.8208 529.7598 120.02 516.6201 v
+120.9414 515.2393 117.3799 512.54 v
+98.5015 508.6396 95.7798 490.7002 v
+80.8999 474.3193 80.8999 468.6201 v
+80.8999 466.0664 81.1973 462.6025 81.8599 457.5801 c
+81.3418 448.3594 111.6201 447.5 v
+142.0615 446.5996 554.6602 482.0596 y
+F
+0 R
+0 G
+1.1 w 10 M
+554.6602 482.0596 m
+555.3799 481.7715 557.8066 480.5361 559.2197 478.7002 c
+566.6621 466.8418 560.9004 487.0996 v
+550.8223 518.7607 560.4199 506.54 v
+567.1016 498.5215 563.54 513.5 v
+559.3301 531.5498 556.5801 538.46 y
+569.3027 533.2803 539.7793 576.8594 v
+549.6201 572.7793 l
+527.9414 616.4404 504.2598 622.2197 v
+495.3799 628.7002 l
+537.623 670.5605 523.46 711.0195 v
+516.0605 716.7607 505.46 706.7002 v
+498.4609 701.3594 491.7793 703.0996 v
+457.9805 701.8018 455.7793 701.8994 v
+453.582 701.8018 415.3018 742.7217 343.2197 723.2598 c
+337.4219 721.1602 332.6602 722.54 v
+312.3418 740.0811 258.7397 715.0996 v
+247.6616 712.8008 246.02 712.7002 v
+244.1406 712.8008 241.0615 712.8008 232.3398 705.7393 c
+223.46 698.7197 223.0205 697.8418 220.8198 696.1396 c
+202.7817 683.7607 197.54 682.9395 v
+184.7407 675.8408 180.02 664.9395 v
+175.9399 663.5 l
+174.1807 655.6016 173.7798 654.3799 v
+168.4614 650.3213 167.54 644.0596 v
+157.9014 637.5605 158.4199 632.7793 v
+156.5815 627.001 155.7798 621.7393 v
+147.7808 616.4404 148.5801 613.3398 v
+140.2998 597.9609 141.6201 590.54 v
+134.5806 590.9209 131.54 588.3799 v
+130.6206 583.001 128.8999 582.6201 v
+125.7798 581.2393 128.4199 576.8594 v
+126.6606 573.7617 126.2598 572.0596 v
+127.1001 568.9209 122.1797 562.7002 v
+115.2197 542.0811 117.3799 536.2998 v
+117.8599 531.0801 114.7397 529.3398 v
+110.8208 529.7598 120.02 516.6201 v
+120.9414 515.2393 117.3799 512.54 v
+98.5015 508.6396 95.7798 490.7002 v
+80.8999 474.3193 80.8999 468.6201 v
+80.8999 466.0664 81.1973 462.6025 81.8599 457.5801 c
+81.3418 448.3594 111.6201 447.5 v
+142.0615 446.5996 554.6602 482.0596 y
+554.6602 482.0596 l
+s
+0 O
+0.164706 0.627451 1 0.031373 k
+1 w 4 M
+97.9399 457.3398 m
+70.3398 500.7197 86.1802 438.6201 y
+95.8613 400.8389 238.3398 442.2197 y
+424.1025 475.6396 436.3398 480.1396 v
+448.7402 484.4404 553.46 477.5 y
+547.2207 495.9795 l
+476.0215 546.9199 454.9014 521.4004 439.9395 525.7402 c
+424.9805 530.2012 427.6211 519.6416 424.0996 518.7803 c
+420.582 517.8799 377.4609 545.1602 370.3398 544.2197 c
+363.3828 543.4014 335.5059 569.5273 351.8594 534.6201 c
+369.541 497.2012 287.7007 491.4795 269.2998 503.8994 c
+250.7407 516.1201 277.2197 483.5 y
+297.3799 461.5615 259.46 480.1396 y
+221.7007 494.1201 195.3008 465.9609 191.7798 465.0195 c
+188.2617 464.2012 182.9814 460.6807 182.1802 467.6602 c
+181.2197 474.7617 172.959 493.1309 138.02 464.2998 c
+116.1006 445.9395 100.8198 470.0596 y
+97.9399 457.3398 l
+F
+0.054902 0.607843 0.878431 0 k
+371.7793 542.2998 m
+364.8203 541.4814 336.918 567.5938 353.2998 532.7002 c
+371.6406 493.9609 289.1406 489.5596 270.7402 501.9795 c
+252.1807 514.2002 278.6602 481.5801 y
+298.8198 459.6416 260.8999 478.2197 y
+223.1406 492.2002 196.7407 464.04 193.2197 463.0996 c
+189.7017 462.2813 184.4214 458.7607 183.6201 465.7393 c
+182.6602 472.8418 174.543 491.0283 139.46 462.3799 c
+116.1802 443.1992 101.2998 466.7002 y
+97.9399 455.6602 l
+70.3208 499.46 86.8999 435.2598 y
+96.5815 397.4785 239.7798 440.2998 y
+425.54 473.7197 437.7793 478.2197 v
+450.1807 482.5205 553.9395 475.5801 y
+547.9395 494.54 l
+476.5801 545.6406 456.3418 519.4805 441.3799 523.8193 c
+426.4209 528.2813 429.0605 517.7217 425.54 516.8594 c
+422.0215 515.96 378.9004 543.2402 371.7793 542.2998 c
+F
+0.047059 0.537255 0.772549 0 k
+373.2197 540.3799 m
+366.2598 539.5615 339.0537 565.9922 354.7402 530.7793 c
+372.6416 490.9395 290.5806 487.6396 272.1802 500.0596 c
+253.6206 512.2783 280.1001 479.6602 y
+300.2598 457.7188 262.3398 476.2998 y
+224.5806 490.2793 198.1807 462.1182 194.6602 461.1797 c
+191.1392 460.3594 185.8594 456.8379 185.0601 463.8193 c
+184.1001 470.9189 176.127 488.9238 140.8999 460.46 c
+116.2593 440.458 101.7798 463.3398 y
+97.7002 453.9795 l
+71.6216 496.8799 87.6201 431.8994 y
+97.3018 394.1191 241.2197 438.3799 y
+426.9805 471.7998 439.2197 476.2998 v
+451.6211 480.5977 554.4199 473.6602 y
+548.4199 493.3398 l
+477.1406 544.3594 457.7813 517.5605 442.8203 521.8994 c
+427.8613 526.3613 430.501 515.8018 426.9805 514.9395 c
+423.4609 514.04 380.3408 541.3203 373.2197 540.3799 c
+F
+0.039216 0.462745 0.67451 0 k
+374.6602 538.46 m
+367.7002 537.6416 340.498 564.0752 356.1797 528.8594 c
+374.7422 487.5293 291.4326 486.1113 273.6201 498.1396 c
+255.0605 510.3604 281.54 477.7393 y
+301.7002 455.8018 263.7798 474.3799 y
+226.0205 488.3594 199.6206 460.2002 196.1001 459.2598 c
+192.5815 458.4414 187.3018 454.9209 186.5 461.8994 c
+185.54 469.001 177.7134 486.8164 142.3398 458.54 c
+116.3408 437.7197 102.2598 460.2197 y
+97.7002 452.2998 l
+73.7983 492.7617 88.3398 428.54 y
+98.0215 390.7588 242.6602 436.46 y
+428.4199 469.8799 440.6602 474.3799 v
+453.0625 478.6807 554.9004 471.9795 y
+548.9004 492.1396 l
+477.7012 543.0801 459.2217 515.6406 444.2598 519.9795 c
+429.3008 524.4414 431.9414 513.8818 428.4199 513.0195 c
+424.9014 512.1201 381.7813 539.4004 374.6602 538.46 c
+F
+0.035294 0.396078 0.572549 0 k
+376.0996 536.54 m
+369.1406 535.7188 342.4951 562.3994 357.6201 526.9395 c
+376.1816 483.7998 293.4609 483.7998 275.0601 496.2197 c
+256.501 508.4385 282.98 475.8193 y
+303.1401 453.8789 265.2197 472.46 y
+227.4609 486.4395 201.0605 458.2783 197.54 457.3398 c
+194.0215 456.5186 188.7417 452.998 187.9399 459.9795 c
+186.98 467.0791 179.2974 484.7139 143.7798 456.6201 c
+116.4199 434.9785 102.5 456.8594 y
+97.7002 450.6201 l
+75.98 488.8613 89.0601 425.1797 y
+98.7393 387.3994 244.1001 434.54 y
+429.8623 467.96 442.0996 472.46 v
+454.5039 476.7578 555.3799 470.0596 y
+549.6201 490.7002 l
+478.2637 541.8008 460.6621 513.7178 445.7002 518.0596 c
+430.7432 522.5186 433.3828 511.959 429.8594 511.0996 c
+426.3418 510.2002 383.2227 537.4785 376.0996 536.54 c
+F
+0.031373 0.333333 0.470588 0 k
+377.54 534.6201 m
+370.582 533.8018 342.0225 559.5967 359.0605 525.0195 c
+380.2617 482.3213 294.9009 481.8799 276.5 494.2998 c
+257.9409 506.5205 284.4199 473.8994 y
+304.5801 451.959 266.6602 470.54 y
+228.9009 484.5195 202.501 456.3604 198.98 455.4199 c
+195.4614 454.6016 190.1816 451.0801 189.3799 458.0596 c
+188.4199 465.1592 180.8818 482.6094 145.2197 454.7002 c
+116.5015 432.2383 102.98 453.5 y
+97.7002 448.9395 l
+77.9409 485.4004 89.7798 421.8193 y
+99.4614 384.0391 245.54 432.6201 y
+431.3027 466.04 443.54 470.54 v
+455.9434 474.8408 555.8594 468.1396 y
+550.0996 489.5 l
+478.8223 540.5186 462.1016 511.8008 447.1406 516.1396 c
+432.1836 520.6016 434.8232 510.0391 431.2998 509.1797 c
+427.7813 508.2793 384.6631 535.5605 377.54 534.6201 c
+F
+0.027451 0.278431 0.372549 0 k
+378.9805 532.7002 m
+372.0195 531.8818 343.0449 557.4678 360.5 523.0996 c
+383.0215 479.0791 296.3408 479.96 277.9399 492.3799 c
+259.3809 504.5977 285.8599 471.9795 y
+306.02 450.0391 268.1001 468.6201 y
+230.3408 482.5996 203.9409 454.4385 200.4199 453.5 c
+196.9014 452.6787 191.6216 449.1582 190.8198 456.1396 c
+189.8599 463.2393 182.4658 480.5049 146.6602 452.7793 c
+116.5806 429.5 103.46 450.1396 y
+97.7002 447.2598 l
+80.1201 480.3994 90.5 418.46 y
+100.1792 380.6787 246.98 430.7002 y
+432.7422 464.1201 444.9805 468.6201 v
+457.3828 472.918 556.3398 466.46 y
+550.5801 488.2998 l
+479.3818 539.2393 463.541 509.8779 448.5801 514.2197 c
+433.623 518.6816 436.2637 508.1191 432.7402 507.2598 c
+429.2217 506.3594 386.1035 533.6406 378.9805 532.7002 c
+F
+0.019608 0.215686 0.286275 0 k
+380.4199 530.7793 m
+373.4629 529.959 343.2754 554.9023 361.9395 521.1797 c
+386.2227 477.6006 297.7808 478.04 279.3799 490.46 c
+260.8208 502.6807 287.2998 470.0596 y
+307.46 448.1191 269.54 466.7002 y
+231.7808 480.6797 205.3809 452.5205 201.8599 451.5801 c
+198.3418 450.7588 193.0615 447.2402 192.2598 454.2197 c
+191.2998 461.3193 184.0498 478.3994 148.1001 450.8594 c
+116.6602 426.7588 103.9399 446.7793 y
+97.7002 445.5801 l
+81.8599 476.7197 91.2197 415.0996 y
+100.9014 377.3193 248.4199 428.7793 y
+434.1826 462.2002 446.4199 466.7002 v
+458.8232 471.001 556.8203 464.54 y
+551.2998 486.8594 l
+479.9434 537.9609 464.9814 507.9609 450.0195 512.2998 c
+435.0625 516.7588 437.7031 506.1992 434.1797 505.3398 c
+430.6621 504.4395 387.543 531.7207 380.4199 530.7793 c
+F
+0.015686 0.156863 0.203922 0 k
+381.8594 528.8594 m
+374.9023 528.0391 344.7148 552.9824 363.3799 519.2598 c
+387.6631 475.6777 299.2231 476.1201 280.8198 488.54 c
+262.2607 500.7578 288.7402 468.1396 y
+308.9023 446.1992 270.98 464.7793 y
+233.2207 478.7598 206.8208 450.5977 203.2998 449.6602 c
+199.7817 448.8389 194.5015 445.3184 193.7002 452.2998 c
+192.7402 459.3994 185.6357 476.2949 149.54 448.9395 c
+116.7417 424.0186 104.1802 443.4199 y
+97.7002 443.6602 l
+82.7192 472.8193 91.9399 411.7393 y
+101.6216 373.959 249.8599 426.8594 y
+435.623 460.2793 447.8594 464.7793 v
+460.2637 469.0781 557.2998 462.6201 y
+551.7793 485.6602 l
+480.502 536.6787 466.4219 506.0381 451.46 510.3799 c
+436.501 514.8389 439.1426 504.2793 435.6201 503.4199 c
+432.1016 502.5195 388.9834 529.7979 381.8594 528.8594 c
+F
+0.011765 0.098039 0.12549 0 k
+383.2998 526.9395 m
+376.3418 526.1191 346.582 551.2949 364.8203 517.3398 c
+389.1006 472.4404 300.6606 474.2002 282.2598 486.6201 c
+263.7007 498.8408 290.1802 466.2197 y
+310.3418 444.2793 272.4199 462.8594 y
+234.6606 476.8398 208.2607 448.6807 204.7402 447.7393 c
+201.2217 446.9189 195.9414 443.4004 195.1401 450.3799 c
+194.1802 457.4785 187.2197 474.1904 150.98 447.0195 c
+116.8208 421.2793 104.6602 440.0596 y
+97.7002 441.9795 l
+83.3599 468.4805 92.6602 408.3799 y
+102.3418 370.5986 251.2998 424.9395 y
+437.0625 458.3594 449.2998 462.8594 v
+461.7012 467.1602 557.7793 460.9395 y
+552.2598 484.46 l
+481.0615 535.3994 467.8613 504.1201 452.9004 508.46 c
+437.9414 512.9189 440.5801 502.3594 437.0605 501.5 c
+433.541 500.5996 390.4209 527.8809 383.2998 526.9395 c
+F
+0 0.039216 0.05098 0 k
+384.7402 525.0195 m
+377.7822 524.2012 349.208 549.9893 366.2598 515.4199 c
+389.6621 468.3193 302.1006 472.2793 283.7002 484.7002 c
+265.1406 496.918 291.6201 464.2998 y
+311.7822 442.3594 273.8599 460.9395 y
+236.1006 474.9199 209.7007 446.7578 206.1802 445.8193 c
+202.6616 444.999 197.3818 441.4785 196.5801 448.46 c
+195.6226 455.5586 188.8042 472.085 152.4199 445.0996 c
+116.8999 418.5391 105.1401 436.7002 y
+97.7002 440.2998 l
+83.5591 465.8984 93.3799 405.0195 y
+103.0615 367.2393 252.7402 423.0195 y
+438.502 456.4395 450.7402 460.9395 v
+463.1426 465.2383 558.2598 459.0195 y
+552.9805 483.0195 l
+481.6211 534.1201 469.3018 502.1982 454.3398 506.54 c
+439.3828 511.001 442.0234 500.4385 438.5 499.5801 c
+434.9814 498.6797 391.8613 525.9609 384.7402 525.0195 c
+F
+1 g
+97.7002 438.6201 m
+83.54 462.8818 94.1001 401.6602 y
+103.7817 363.8789 254.1802 421.0996 y
+439.9424 454.5195 452.1797 459.0195 v
+464.5801 463.3203 558.7402 457.0996 y
+553.46 481.8193 l
+482.1826 532.8418 470.7422 500.2803 455.7793 504.6201 c
+440.8203 509.0811 443.4609 498.5215 439.9395 497.6602 c
+436.4219 496.7598 393.3008 524.041 386.1797 523.0996 c
+379.2227 522.2813 351.4785 548.4678 367.7002 513.5 c
+392.2305 461.002 300.9463 472.0898 285.1401 482.7803 c
+266.5806 495.001 293.0601 462.3799 y
+313.2197 440.4395 275.2998 459.0195 y
+237.541 473 211.1406 444.8408 207.6201 443.8994 c
+204.1016 443.0791 198.8218 439.5586 198.02 446.54 c
+197.0601 453.6416 190.3877 469.9834 153.8599 443.1797 c
+116.9814 415.8008 105.6201 433.3398 y
+97.7002 438.6201 l
+F
+0 g
+143.2998 405.7402 m
+135.4614 392.9189 158.4199 378.3799 v
+159.8818 376.8584 140.1802 381.5 v
+133.2607 383.6787 131.54 395.1797 v
+126.2217 399.958 120.98 406.2197 v
+115.6616 412.2803 143.2998 405.7402 y
+F
+0.8 g
+297.3799 458.0596 m
+316.8486 428.5371 316.0996 423.2598 v
+314.7607 411.8408 314.54 401.2803 318.0195 396.8594 c
+321.582 392.4795 331.2197 356.0596 y
+330.8223 354.6387 344.4199 396.3799 v
+357.2217 414.0391 335.2998 434.2998 v
+296.5015 465.9609 297.3799 458.0596 v
+F
+0 g
+165.3799 376.2197 m
+177.7017 368.2803 161.7798 333.9795 v
+168.98 336.6201 l
+168.02 324.2793 164.4199 321.7393 v
+172.3398 325.0996 l
+177.7017 316.3594 173.2998 311.1797 v
+191.7798 302.2803 190.8198 295.3398 v
+197.9409 304.04 193.46 311.1797 v
+189.1401 318.1201 181.2197 313.7188 182.1802 333.9795 c
+172.3398 330.3799 l
+178.5801 340.1191 178.5801 347.1797 v
+169.7002 344.54 l
+186.7949 373.7549 174.98 375.2598 v
+168.4614 376.2002 165.3799 376.2197 y
+F
+0.8 g
+201.1401 357.7393 m
+204.1016 362.5586 201.1401 361.5801 v
+197.9409 360.7998 163.6206 344.5205 156.98 333.9795 c
+194.8613 360.7998 201.1401 357.7393 v
+F
+212.4199 348.8594 m
+215.54 353.7578 212.4199 352.9395 v
+209.3818 351.999 175.0615 335.7197 168.5 325.0996 c
+206.2998 351.999 212.4199 348.8594 v
+F
+227.0601 365.6602 m
+230.0601 370.4795 227.0601 369.5 v
+223.9014 368.7197 189.5815 352.4404 182.8999 341.8994 c
+220.8198 368.7197 227.0601 365.6602 v
+F
+201.3799 317.6602 m
+201.4614 324.2793 198.5 323.4199 v
+195.3008 322.5195 155.7007 303.1592 149.0601 292.7002 c
+195.3008 320.7578 201.3799 317.6602 v
+F
+202.8198 329.6602 m
+204.1016 334.8389 201.1401 333.9795 v
+198.8218 333.958 169.7817 321.2002 163.2197 310.7002 c
+195.7402 334.3994 202.8198 329.6602 v
+F
+186.98 277.0996 m
+175.9399 268.9395 l
+187.3809 277.2002 191.2998 275.8994 v
+183.8599 263.5586 182.8999 257.8994 v
+194.4199 271.9209 200.6602 271.5801 v
+208.9399 271.04 209.0601 259.0996 v
+215.1006 270.6006 218.6602 270.1396 v
+219.9414 263.1201 218.6602 255.7393 v
+223.0205 264.001 227.54 262.2197 v
+234.4614 264.4395 233.54 251.6602 v
+233.5806 240.2402 232.8198 237.2598 v
+238.8608 266.1992 241.46 266.54 v
+250.3018 267.958 255.6201 258.3799 v
+251.1802 266.6406 256.5801 264.3799 v
+268.3398 262.6777 271.9399 255.2598 v
+264.3799 268.3994 270.5 264.8594 v
+278.0215 264.8789 279.3799 257.8994 v
+288.5815 234.5186 290.8999 232.7002 v
+282.4209 256.5195 284.1802 256.46 v
+281.9814 269.7197 287.7798 253.3398 v
+284.1802 268.8389 290.4199 267.9795 v
+296.5015 267.0801 301.3398 256.0781 310.5801 258.6201 c
+321.1426 252.5596 323.2998 328.7002 v
+186.98 277.0996 l
+F
+0 g
+192.2598 379.3398 m
+208.501 385.8799 252.5 379.3398 v
+260.4199 378.8408 267.8599 388.46 v
+275.3818 398.1992 304.8608 406.1191 312.0195 403.8193 c
+322.5801 396.8594 l
+323.2998 395.6602 l
+336.9824 384.1201 337.46 375.7393 v
+337.8613 367.3994 321.582 314.5996 311.0605 297.0195 c
+300.4614 279.3994 289.9014 265.7598 268.8198 268.46 c
+245.8999 272.7988 217.7002 268.46 v
+185.6216 270.1592 182.6602 279.0195 v
+179.4609 287.7578 194.8999 304.46 y
+199.7002 313.7188 198.5 329.6602 v
+197.0601 345.3994 197.5015 376.2002 192.2598 379.3398 c
+F
+0.047059 0.745098 0.211765 0 k
+216.5 377.1797 m
+225.6606 356.8398 193.2197 285.0195 y
+190.9014 283.3594 207.0273 276.7109 218.1802 279.5 c
+230.2207 282.3008 274.5801 277.5801 y
+300.4614 294.7998 314.6602 343.5801 y
+325.9805 370.04 306.7402 373.5801 v
+287.2617 377.0791 216.5 377.1797 y
+F
+0.247059 0.933333 0.509804 0.070588 k
+214.1001 343.0996 m
+217.8438 357.1641 219.5864 370.1426 216.5 377.1797 c
+285.0605 370.04 297.3799 393.0195 v
+302.0454 401.583 318.2813 367.8389 317.7793 357.2598 c
+248.54 341.4385 232.3398 353.6602 v
+214.1001 343.0996 l
+F
+0.266667 0.972549 0.580392 0.137255 k
+219.1401 325.0996 m
+221.2617 317.2393 218.6602 312.8594 v
+216.8599 311.96 215.54 311.4199 v
+216.8599 307.5586 223.46 305.8994 v
+225.6606 300.958 228.2598 300.6201 v
+230.9409 300.0801 236.2207 293.9189 240.7402 295.3398 c
+245.0215 296.5586 257.2998 300.8594 y
+263.5015 304.4795 273.1401 300.6201 v
+275.792 301.4023 276.2598 305.8994 v
+276.8096 310.9707 280.2197 315.0391 282.5 317.1797 c
+284.6216 319.4404 295.1816 333.5186 293.7798 333.9795 c
+292.5415 334.3994 219.1401 325.0996 y
+F
+0 0.698039 0.356863 0 k
+214.3398 378.3799 m
+211.1406 353.7578 214.5801 344.54 v
+218.1802 335.2803 217.3018 333.0801 216.5 328.7002 c
+215.54 324.2793 220.3809 313.2803 226.5801 306.6201 c
+239.7798 304.9395 l
+256.46 308.8809 266.6602 305.8994 v
+276.4736 304.3232 280.3398 320.7803 v
+285.5 327.7998 293.54 330.8594 v
+301.3398 333.958 309.2598 379.7188 304.8198 388.46 c
+300.4614 397.3203 284.6216 402.1592 267.1401 385.0996 c
+249.4209 367.8389 247.2197 386.3193 214.3398 378.3799 c
+F
+0 R
+0 G
+1.1 w 10 M
+214.3398 378.3799 m
+211.1406 353.7578 214.5801 344.54 v
+218.1802 335.2803 217.3018 333.0801 216.5 328.7002 c
+215.54 324.2793 220.3809 313.2803 226.5801 306.6201 c
+239.7798 304.9395 l
+256.46 308.8809 266.6602 305.8994 v
+276.4736 304.3232 280.3398 320.7803 v
+285.5 327.7998 293.54 330.8594 v
+301.3398 333.958 309.2598 379.7188 304.8198 388.46 c
+300.4614 397.3203 284.6216 402.1592 267.1401 385.0996 c
+249.4209 367.8389 247.2197 386.3193 214.3398 378.3799 c
+214.3398 378.3799 l
+s
+0 O
+0.011765 0 0.239216 0 k
+1 w 4 M
+216.02 296.0596 m
+215.1006 298.3203 210.2598 298.7002 v
+185.6216 302.7197 176.4199 316.46 v
+168.9009 322.5195 173.7798 309.7393 v
+185.1802 287.3193 192.7402 284.2998 v
+210.7017 279.8408 216.02 296.0596 v
+F
+0 R
+0 G
+0.550001 w 10 M
+216.02 296.0596 m
+215.1006 298.3203 210.2598 298.7002 v
+185.6216 302.7197 176.4199 316.46 v
+168.9009 322.5195 173.7798 309.7393 v
+185.1802 287.3193 192.7402 284.2998 v
+210.7017 279.8408 216.02 296.0596 v
+216.02 296.0596 l
+s
+0 O
+0.145098 0.898039 0.682353 0.027451 k
+1 w 4 M
+303.8599 366.3799 m
+304.6426 375.1855 306.7905 384.6602 304.8198 388.46 c
+297.771 402.7041 279.0991 396.7754 267.1401 385.0996 c
+249.4209 367.8389 247.2197 386.3193 214.3398 378.3799 c
+212.2998 363.041 213.1401 351.9795 v
+254.2617 364.7598 255.1401 358.7002 v
+256.9014 362.1201 267.1401 362.0596 v
+277.1406 362.1201 302.1558 363.4082 303.8599 366.3799 c
+F
+0 R
+0.231373 1 0.941176 0.172549 K
+2.2 w 10 M
+256.5801 377.4199 m
+261.7402 372.2402 257.7798 361.5801 v
+241.9399 344.0791 244.1001 328.7002 v
+S
+0 O
+0.011765 0 0.239216 0 k
+1 w 4 M
+203.7798 284.2998 m
+198.8218 298.3203 208.5801 290.7803 v
+213.7808 288.6387 212.4199 286.9395 v
+211.1406 285.1201 204.98 280.7188 203.7798 284.2998 c
+F
+0 R
+0 G
+0.550001 w 10 M
+203.7798 284.2998 m
+198.8218 298.3203 208.5801 290.7803 v
+213.7808 288.6387 212.4199 286.9395 v
+211.1406 285.1201 204.98 280.7188 203.7798 284.2998 c
+203.7798 284.2998 l
+s
+0 O
+0.011765 0 0.239216 0 k
+1 w 4 M
+209.2998 282.8594 m
+205.333 294.1826 213.1401 288.1396 v
+217.9399 285.5068 216.2598 285.0195 v
+211.2295 283.623 216.2432 280.8076 209.2998 282.8594 c
+F
+0 R
+0 G
+0.550001 w 10 M
+209.2998 282.8594 m
+205.333 294.1826 213.1401 288.1396 v
+217.9399 285.5068 216.2598 285.0195 v
+211.2295 283.623 216.2432 280.8076 209.2998 282.8594 c
+209.2998 282.8594 l
+s
+0 O
+0.011765 0 0.239216 0 k
+1 w 4 M
+214.5801 282.8594 m
+210.6128 294.1826 218.4199 288.1396 v
+223.1694 285.6582 221.54 285.0195 v
+217.8296 283.623 221.5229 280.8076 214.5801 282.8594 c
+F
+0 R
+0 G
+0.550001 w 10 M
+214.5801 282.8594 m
+210.6128 294.1826 218.4199 288.1396 v
+223.1694 285.6582 221.54 285.0195 v
+217.8296 283.623 221.5229 280.8076 214.5801 282.8594 c
+214.5801 282.8594 l
+s
+0 O
+0.011765 0 0.239216 0 k
+1 w 4 M
+221.7798 282.6201 m
+217.8726 293.9648 225.6201 287.8994 v
+230.4365 285.4131 228.7402 284.7803 v
+225.5288 283.623 228.7856 280.5869 221.7798 282.6201 c
+F
+0 R
+0 G
+0.550001 w 10 M
+221.7798 282.6201 m
+217.8726 293.9648 225.6201 287.8994 v
+230.4365 285.4131 228.7402 284.7803 v
+225.5288 283.623 228.7856 280.5869 221.7798 282.6201 c
+221.7798 282.6201 l
+s
+0 O
+0.011765 0 0.239216 0 k
+1 w 4 M
+228.98 282.8594 m
+225.001 294.0508 232.8198 288.1396 v
+236.9697 286.3086 235.9399 284.7803 v
+234.8574 283.4912 235.9136 280.6758 228.98 282.8594 c
+F
+0 R
+0 G
+0.550001 w 10 M
+228.98 282.8594 m
+225.001 294.0508 232.8198 288.1396 v
+236.9697 286.3086 235.9399 284.7803 v
+234.8574 283.4912 235.9136 280.6758 228.98 282.8594 c
+228.98 282.8594 l
+s
+0 O
+0.011765 0 0.239216 0 k
+1 w 4 M
+236.1802 282.1396 m
+230.9409 295.6807 240.98 288.6201 v
+246.3418 286.4404 245.0601 284.7803 v
+243.7017 282.9199 245.0215 279.3994 236.1802 282.1396 c
+F
+0 R
+0 G
+0.550001 w 10 M
+236.1802 282.1396 m
+230.9409 295.6807 240.98 288.6201 v
+246.3418 286.4404 245.0601 284.7803 v
+243.7017 282.9199 245.0215 279.3994 236.1802 282.1396 c
+236.1802 282.1396 l
+s
+*u
+0.266667 0.972549 0.580392 0.137255 K
+2.2 w
+204.98 300.8594 m
+219.5 304.04 226.1001 300.6201 v
+232.7002 299.1992 234.02 299.6602 v
+235.3398 300.0801 238.8198 300.6201 y
+S
+1 D
+242.4199 291.2598 m
+255.5815 306.2402 268.8198 301.3398 v
+276.4976 298.5703 275.3818 302.2803 276.2598 305.4199 c
+277.1406 308.4385 277.3613 313.0586 282.98 316.46 c
+S
+*U
+0 D
+0 O
+0.011765 0 0.239216 0 k
+1 w 4 M
+261.3799 308.7803 m
+256.9014 320.7578 253.9399 306.6201 v
+250.7407 292.5986 247.2197 288.6387 245.54 285.5 c
+245.4609 279.8408 254.6602 280.2197 v
+266.5806 280.7188 267.1401 283.8193 v
+267.4614 286.8799 265.7002 299.6406 261.3799 308.7803 c
+F
+0 R
+0 G
+0.550001 w 10 M
+261.3799 308.7803 m
+256.9014 320.7578 253.9399 306.6201 v
+250.7407 292.5986 247.2197 288.6387 245.54 285.5 c
+245.4609 279.8408 254.6602 280.2197 v
+266.5806 280.7188 267.1401 283.8193 v
+267.4614 286.8799 265.7002 299.6406 261.3799 308.7803 c
+261.3799 308.7803 l
+s
+*u
+0.266667 0.972549 0.580392 0.137255 K
+2.2 w
+276.7402 300.8594 m
+280.6616 303.6006 283.2197 302.2998 v
+S
+283.9399 319.0996 m
+287.041 324.3896 292.3398 325.3398 v
+S
+*U
+0 O
+0.701961 g
+1 w 4 M
+196.5801 278.54 m
+216.4209 275 221.2998 276.8594 v
+230.9409 276.7588 221.7798 274.46 v
+207.6201 274.5586 198.7402 275.8994 v
+186.0605 282.0391 196.5801 278.54 v
+F
+0.011765 0 0.239216 0 k
+211.9399 381.0195 m
+231.3799 381.0391 233.54 380.0596 v
+241.501 346.2803 237.6201 337.8193 v
+236.2207 334.8389 233.0601 340.9395 v
+212.8999 377.0791 209.2998 379.3398 v
+205.8608 381.4805 210.7017 381.0391 211.9399 381.0195 c
+F
+0 R
+0 G
+0.550001 w 10 M
+211.9399 381.0195 m
+231.3799 381.0391 233.54 380.0596 v
+241.501 346.2803 237.6201 337.8193 v
+236.2207 334.8389 233.0601 340.9395 v
+212.8999 377.0791 209.2998 379.3398 v
+205.8608 381.4805 210.7017 381.0391 211.9399 381.0195 c
+211.9399 381.0195 l
+s
+0 O
+0.011765 0 0.239216 0 k
+1 w 4 M
+127.2197 383.8994 m
+137 382.1406 150.98 379.3398 v
+156.1401 354.6387 159.6201 349.3398 v
+163.1816 344.0791 159.2217 344.0791 155.2998 347.1797 c
+151.3018 350.2393 135.02 365.6406 132.7402 370.46 c
+130.6206 375.3193 127.2197 383.8994 y
+F
+0 R
+0 G
+0.550001 w 10 M
+127.2197 383.8994 m
+137 382.1406 150.98 379.3398 v
+156.1401 354.6387 159.6201 349.3398 v
+163.1816 344.0791 159.2217 344.0791 155.2998 347.1797 c
+151.3018 350.2393 135.02 365.6406 132.7402 370.46 c
+130.6206 375.3193 127.2197 383.8994 y
+127.2197 383.8994 l
+s
+0 O
+0.011765 0 0.239216 0 k
+1 w 4 M
+151.2197 379.0996 m
+157.6377 377.3379 158.6602 375.0195 v
+159.855 372.4658 157.46 368.7803 y
+156.3247 365.2041 155.0601 367.5801 v
+153.6802 369.9629 150.5215 378.3867 151.2197 379.0996 c
+F
+0 R
+0 G
+0.550001 w 10 M
+151.2197 379.0996 m
+157.6377 377.3379 158.6602 375.0195 v
+159.855 372.4658 157.46 368.7803 y
+156.3247 365.2041 155.0601 367.5801 v
+153.6802 369.9629 150.5215 378.3867 151.2197 379.0996 c
+151.2197 379.0996 l
+s
+0 O
+0 g
+1 w 4 M
+151.2197 379.3398 m
+155.2617 373.5586 159.1401 373.5801 v
+163.1816 373.5586 163.6016 374.0146 166.8198 373.3398 c
+171.7617 372.2402 171.3198 374.4385 178.5801 373.0996 c
+181.4839 372.5908 184.3018 373.5586 187.46 372.1396 c
+190.46 370.9209 193.981 371.7988 195.3799 374.0596 c
+196.6206 376.2002 201.8599 380.7803 y
+187.8198 378.8408 184.8198 377.8994 v
+160.1001 376.6396 151.2197 379.3398 v
+F
+0.011765 0 0.239216 0 k
+200.4199 379.0996 m
+193.2656 375.209 192.7402 372.6201 v
+192.3848 369.9297 198.5 365.8994 y
+201.625 360.7998 202.3398 363.5 v
+202.9448 366.0801 201.2407 378.6201 200.4199 379.0996 c
+F
+0 R
+0 G
+0.550001 w 10 M
+200.4199 379.0996 m
+193.2656 375.209 192.7402 372.6201 v
+192.3848 369.9297 198.5 365.8994 y
+201.625 360.7998 202.3398 363.5 v
+202.9448 366.0801 201.2407 378.6201 200.4199 379.0996 c
+200.4199 379.0996 l
+s
+0 O
+0.011765 0 0.239216 0 k
+1 w 4 M
+159.1401 373.0996 m
+166.8345 360.7422 167.0601 373.0996 v
+167.6865 374.458 165.8599 374.54 v
+159.0679 374.5664 160.7407 379.0781 159.1401 373.0996 c
+F
+0 R
+0 G
+0.550001 w 10 M
+159.1401 373.0996 m
+166.8345 360.7422 167.0601 373.0996 v
+167.6865 374.458 165.8599 374.54 v
+159.0679 374.5664 160.7407 379.0781 159.1401 373.0996 c
+159.1401 373.0996 l
+s
+0 O
+0.011765 0 0.239216 0 k
+1 w 4 M
+167.0601 372.8594 m
+175.7358 360.4707 174.98 372.8594 v
+175.0449 373.2441 173.0601 373.3398 v
+167.8926 373.8682 168.272 378.8359 167.0601 372.8594 c
+F
+0 R
+0 G
+0.550001 w 10 M
+167.0601 372.8594 m
+175.7358 360.4707 174.98 372.8594 v
+175.0449 373.2441 173.0601 373.3398 v
+167.8926 373.8682 168.272 378.8359 167.0601 372.8594 c
+167.0601 372.8594 l
+s
+0 O
+0.011765 0 0.239216 0 k
+1 w 4 M
+174.98 372.8594 m
+183.7134 361.0762 182.8999 371.6602 v
+183.1089 373.0664 181.2197 373.3398 v
+177.0078 374.1729 176.7754 377.7461 174.98 372.8594 c
+F
+0 R
+0 G
+0.550001 w 10 M
+174.98 372.8594 m
+183.7134 361.0762 182.8999 371.6602 v
+183.1089 373.0664 181.2197 373.3398 v
+177.0078 374.1729 176.7754 377.7461 174.98 372.8594 c
+174.98 372.8594 l
+s
+0 O
+0.011765 0 0.239216 0 k
+1 w 4 M
+182.4199 372.6201 m
+191.2109 359.9619 191.54 370.7002 v
+193.4023 372.2354 191.54 372.3799 v
+185.0815 373.2939 185.96 378.1953 182.4199 372.6201 c
+F
+0 R
+0 G
+0.550001 w 10 M
+182.4199 372.6201 m
+191.2109 359.9619 191.54 370.7002 v
+193.4023 372.2354 191.54 372.3799 v
+185.0815 373.2939 185.96 378.1953 182.4199 372.6201 c
+182.4199 372.6201 l
+s
+0 O
+0.105882 0.031373 0.356863 0 k
+1 w 4 M
+142.8198 368.7803 m
+134.4199 370.46 l
+131.4463 375.9795 129.1401 382.7002 y
+136.1216 381.6465 149.7798 378.6201 v
+150.8335 374.9141 152.4199 368.54 v
+142.8198 368.7803 l
+F
+214.3398 373.8193 m
+212.4702 376.6807 211.0229 378.6152 210.2598 379.0996 c
+206.9937 381.1328 211.5513 380.7178 212.8999 380.7803 c
+231.02 380.7178 233.0601 379.8193 v
+233.6694 377.4219 234.5 373.5801 v
+223.3232 375.9033 214.3398 373.8193 v
+F
+0.164706 0.627451 1 0.031373 k
+273.3799 525.9795 m
+303.7617 521.5303 331.832 560.7363 333.8594 571.3398 c
+335.7051 582.0322 324.5 595.0996 y
+326.0264 598.4883 320.7012 613.9756 314.9004 624.1396 c
+309.085 634.3057 291.5938 633.2334 272.4199 634.2197 c
+254.876 635.2734 234.5479 609.6201 233.0601 607.5801 c
+231.644 605.749 238.4214 563.6406 239.7798 557.4199 c
+241.3232 551.0547 238.3398 521.8994 y
+276.085 532.0254 242.7754 530.2441 273.3799 525.9795 c
+F
+0.047059 0.517647 0.756863 0 k
+233.7798 606.8594 m
+232.4722 605.0713 239.125 563.7266 240.5 557.6602 c
+241.9761 551.3721 239.0601 522.8594 y
+275.0649 532.6279 243.4014 530.9385 273.3799 526.7002 c
+303.2769 522.3848 330.8379 560.876 332.6602 571.3398 c
+334.6406 581.7871 323.7793 594.6201 y
+325.1357 597.9434 319.9082 613.1504 314.1797 623.1797 c
+308.5039 633.1084 291.332 632.0547 272.4199 633.0195 c
+255.2817 634.0586 235.3232 608.873 233.7798 606.8594 c
+F
+0.035294 0.372549 0.533333 0 k
+234.7402 606.1396 m
+233.2998 604.3926 239.8281 563.8154 241.2197 557.6602 c
+242.6265 551.6885 239.7798 523.8193 y
+274.3735 533.7822 244.0254 531.6338 273.3799 527.4199 c
+302.792 523.2393 329.8447 561.0176 331.7002 571.3398 c
+333.5762 581.54 322.8203 594.1396 y
+324.248 597.3965 319.1172 612.3223 313.46 622.2197 c
+307.9238 631.9111 291.0703 630.8789 272.4199 631.8193 c
+255.6846 632.8447 236.0981 608.124 234.7402 606.1396 c
+F
+0.023529 0.239216 0.32549 0 k
+235.46 605.6602 m
+234.1255 603.7158 240.5313 563.9043 241.9399 557.8994 c
+243.2769 552.0049 240.5 524.54 y
+272.9121 534.4951 244.6494 532.3301 273.3799 528.1396 c
+302.3096 524.0938 328.8516 561.1563 330.7402 571.3398 c
+332.5117 581.293 322.0996 593.6602 y
+323.3594 596.8516 318.3242 611.4941 312.7402 621.0195 c
+307.3418 630.7129 290.8066 629.7002 272.6602 630.6201 c
+256.0903 631.6299 236.8711 607.376 235.46 605.6602 c
+F
+0.011765 0.109804 0.137255 0 k
+236.1802 604.9395 m
+234.9536 603.0391 241.2368 563.9912 242.6602 558.1396 c
+243.9297 552.3223 241.2197 525.5 y
+271.8921 535.208 245.2759 533.0234 273.6201 529.0996 c
+301.8247 524.9453 327.8555 561.2979 329.54 571.0996 c
+331.4453 581.0479 321.1406 593.1797 y
+322.4697 596.3066 317.5332 610.6689 312.2598 620.0596 c
+306.7617 629.5186 290.5449 628.5244 272.6602 629.4199 c
+256.4961 630.416 237.6465 606.6289 236.1802 604.9395 c
+F
+1 g
+273.6201 529.8193 m
+301.3398 525.7998 326.8613 561.4395 328.5801 571.0996 c
+330.3828 580.8008 320.1797 592.7002 y
+321.582 595.7598 316.7402 609.8408 311.54 619.0996 c
+306.1807 628.3203 290.2808 627.3457 272.6602 628.2197 c
+256.9014 629.2012 238.4214 605.8809 237.1401 604.2197 c
+235.7817 602.3594 241.9399 564.0801 243.3799 558.3799 c
+244.5801 552.6416 241.9399 526.2197 y
+269.9912 535.7002 245.8999 533.7197 273.6201 529.8193 c
+F
+0.8 g
+324.7402 567.2598 m
+294.0801 558.7998 281.2998 560.54 v
+263.9409 567.8213 254.1802 543.7393 v
+250.3018 535.9209 248.1802 533.6602 v
+245.8999 531.5215 324.7402 567.2598 y
+F
+0 g
+328.8203 569.6602 m
+296.9409 556.1602 285.8599 556.7002 v
+267.9009 561.6602 258.7402 545.6602 v
+249.4209 535.4814 246.02 533.6602 v
+245.4609 531.9609 252.5 536.2998 v
+264.02 530.54 l
+280.2197 520.0801 290.8999 537.7393 v
+295.1816 550.001 295.2197 552.1396 v
+295.1816 554.4004 318.5 560.5615 320.1797 561.0195 c
+322.0205 561.4395 329.2813 566.0596 328.8203 569.6602 c
+F
+0.45098 0 1 0 k
+276.7402 530.0596 m
+269.1416 530.0762 259.9302 534.3271 259.9399 541.0996 c
+259.9302 548.0742 269.1416 554.9648 276.7402 555.0195 c
+284.2617 554.9648 290.3911 549.3945 290.4199 542.54 c
+290.3911 535.6465 284.2617 530.0762 276.7402 530.0596 c
+F
+0.658824 0.2 1 0.039216 k
+272.6602 548.54 m
+267.3848 547.6328 261.7881 545.9814 261.8599 546.1396 c
+263.5591 551.2998 270.5576 554.9648 276.7402 555.0195 c
+281.4248 554.9648 285.5938 552.79 288.02 549.5 c
+282.2046 549.8408 272.6602 548.54 v
+F
+1 g
+285.8599 548.7793 m
+281.1006 552.2002 281.0601 549.7393 v
+285.0605 544.9395 285.8599 548.7793 v
+F
+0 g
+275.0601 539.6602 m
+272.1919 539.7412 269.9624 541.9707 270.02 544.7002 c
+269.9624 547.4697 272.1919 549.6992 275.0601 549.7393 c
+277.6904 549.6992 279.9199 547.4697 279.8599 544.7002 c
+279.9199 541.9707 277.6904 539.7412 275.0601 539.6602 c
+F
+0.164706 0.627451 1 0.031373 k
+160.5801 554.2998 m
+157.0205 577.7217 159.6201 582.6201 v
+171.541 593.5615 171.1401 597.5 v
+170.6602 617.3213 169.46 618.1396 v
+168.02 619.0801 159.6606 625.6807 153.1401 618.6201 c
+141.6201 598.8418 142.5801 591.7393 v
+142.5801 589.5801 l
+134.1416 590.04 132.5 587.8994 v
+131.0601 582.1201 129.8599 581.6602 v
+126.6606 579.041 128.8999 575.8994 v
+126.6606 573.3193 127.2197 568.9395 v
+135.3799 564.6201 l
+137.6602 548.6816 149.54 543.0195 v
+154.8608 540.3994 158.3408 547.8008 160.5801 554.2998 c
+F
+1 g
+159.3799 556.46 m
+156.272 577.4121 158.6602 581.6602 v
+169.3398 591.668 168.98 595.3398 v
+168.5479 613.0518 167.2998 613.8193 v
+166.1719 614.6357 158.6479 620.5752 152.6602 614.2998 c
+142.4121 596.4199 143.2998 590.0596 v
+143.2998 588.1396 l
+135.6802 588.5 134.1802 586.46 v
+132.9082 581.3721 131.7798 580.9395 v
+128.9478 578.5996 130.8198 575.8994 v
+128.9478 573.4521 129.3799 569.4199 v
+136.8198 565.5801 l
+138.8481 551.2754 149.54 546.1396 v
+154.3281 543.8232 157.46 550.4863 159.3799 556.46 c
+F
+0.043137 0.478431 0.701961 0 k
+168.7402 617.1797 m
+167.6455 618.0576 159.4063 624.4063 152.8999 617.6602 c
+141.8193 598.2363 142.5801 591.2598 v
+142.5801 589.3398 l
+134.5254 589.6563 132.7402 587.4199 v
+131.5229 581.9336 130.3398 581.4199 v
+127.2319 578.9307 129.3799 575.8994 v
+127.2319 573.3535 127.7002 569.1797 v
+135.8599 564.8594 l
+137.9575 549.3291 149.54 543.7393 v
+154.7266 541.2559 158.1201 548.4697 160.3398 555.0195 c
+156.8335 577.6445 159.3799 582.3799 v
+170.9912 593.0889 170.6602 597.0195 v
+170.1318 616.2529 168.7402 617.1797 v
+F
+0.027451 0.305882 0.423529 0 k
+168.2598 615.9795 m
+167.271 617.0332 159.1543 623.1289 152.8999 616.46 c
+142.0161 597.6318 142.8198 591.0195 v
+142.8198 588.8594 l
+134.9097 589.2705 133.2197 587.1797 v
+131.9839 581.7461 130.8198 581.4199 v
+127.8032 578.8203 129.8599 575.8994 v
+127.8032 573.3867 128.1802 569.1797 v
+136.1001 565.0996 l
+138.2554 549.9795 149.54 544.46 v
+154.5942 542.1104 157.9014 549.1426 160.1001 555.5 c
+156.6465 577.5674 159.1401 582.1396 v
+170.4414 592.6133 169.9399 596.2998 v
+169.604 615.1875 168.2598 615.9795 v
+F
+0.015686 0.141176 0.184314 0 k
+167.7798 615.0195 m
+166.8994 616.0107 158.8999 621.8525 152.8999 615.2598 c
+142.2153 597.0244 143.0601 590.54 v
+143.0601 588.3799 l
+135.2959 588.8857 133.7002 586.9395 v
+132.4473 581.5586 131.2998 581.1797 v
+128.377 578.71 130.3398 575.8994 v
+128.377 573.4209 128.8999 569.4199 v
+136.5801 565.3398 l
+138.5503 550.6279 149.54 545.4199 v
+154.46 542.9668 157.6807 549.8145 159.6201 555.9795 c
+156.459 577.4912 158.8999 581.8994 v
+169.8896 592.1426 169.46 595.8193 v
+169.0762 614.1201 167.7798 615.0195 v
+F
+1 g
+159.3799 556.46 m
+156.272 577.4121 158.6602 581.6602 v
+169.3398 591.668 168.98 595.3398 v
+168.5479 613.0518 167.2998 613.8193 v
+166.5249 614.9883 158.6479 620.5752 152.6602 614.2998 c
+142.4121 596.4199 143.2998 590.0596 v
+143.2998 588.1396 l
+135.6802 588.5 134.1802 586.46 v
+132.9082 581.3721 131.7798 580.9395 v
+128.9478 578.5996 130.8198 575.8994 v
+128.9478 573.4521 129.3799 569.4199 v
+136.8198 565.5801 l
+138.8481 551.2754 149.54 546.1396 v
+154.3281 543.8232 157.46 550.5938 159.3799 556.46 c
+F
+0.8 g
+156.02 563.4199 m
+132.2695 574.6396 131.2998 575.4199 v
+141.291 566.501 142.1001 566.54 v
+143.0503 566.501 156.02 563.4199 y
+F
+0 g
+137.2998 570.1396 m
+157.46 566.2803 157.46 561.5 v
+157.46 558.2383 157.1934 543.4756 151.2197 545.1797 c
+142.0615 547.8008 146.0215 563.6406 137.2998 570.1396 c
+F
+0.45098 0 1 0 k
+146.4199 566.0596 m
+156.3369 564.4395 157.46 561.5 v
+158.1201 559.6807 158.8496 550.541 152.8999 549.2598 c
+147.8335 548.3379 145.3809 559.582 146.4199 566.0596 c
+F
+0 g
+240.98 519.2598 m
+240.5098 521.1729 241.9497 521.0283 243.8599 521.6602 c
+246.1206 522.2813 259.5415 526.46 260.4199 529.3398 c
+261.3008 532.1816 275.7798 527.4199 y
+277.8008 526.46 282.7402 523.5801 y
+287.9214 522.2813 295.2197 521.8994 y
+297.8218 520.7402 301.46 517.5801 y
+317.6211 506.4414 331.2197 514.46 y
+353.2617 521.6211 346.5801 540.6201 y
+343.3613 550.4404 346.8203 554.2998 y
+347.1006 558.3604 354.9805 551.4199 y
+357.8818 546.7012 358.8203 541.0996 y
+367.5605 528.8818 363.8594 548.54 y
+364.043 549.5596 360.9609 553.5195 360.9805 554.7793 c
+360.9609 556.1602 359.0605 559.8193 y
+355.6807 563.6406 358.3398 571.3398 y
+360.3008 586.5195 357.8594 584.54 y
+356.5615 586.5195 346.3398 575.4199 y
+344.0215 571.7813 337.46 570.1396 y
+334.3418 568.04 330.5 569.6602 y
+327.7422 570.0195 321.6201 562.2197 y
+324.6602 562.541 327.3008 557.7002 330.0195 557.4199 c
+332.5801 557.2617 334.5605 560.1201 336.2598 560.7793 c
+338.082 561.4395 341.0605 555.0195 y
+341.6025 552.2002 335.54 546.8594 y
+335.002 541.8604 333.1406 543.7393 y
+329.9414 544.2793 328.6211 540.1016 327.6201 535.0996 c
+326.4219 529.9805 321.8594 529.5801 y
+320.041 521.4004 318.7402 524.7793 y
+318.5 530.8613 312.0195 524.54 y
+310.5801 522.2813 305.54 524.7793 y
+298.04 526.9014 300.7402 529.0996 y
+302.6602 531.5215 314.9004 529.0996 y
+317.4004 530.8613 308.6602 535.3398 y
+307.9395 537.2402 309.1406 542.0596 y
+310.3613 545.5996 317.7793 551.6602 y
+328.1816 553.0801 325.2197 554.7793 y
+318.2813 560.5615 312.0195 552.1396 y
+309.4805 545.3818 290.4199 528.8594 y
+285.0605 525.1396 287.9214 532.6201 283.46 528.8594 c
+279.1206 525.1396 256.5801 535.0996 y
+243.7422 536.3525 240.7373 519.0361 236.8999 522.3799 c
+242.8135 513.0967 240.98 519.2598 v
+F
+455.2998 702.1396 m
+427.1816 693.4395 424.0996 672.8594 v
+421.4629 647.6816 444.0195 628.2197 v
+444.3418 621.2813 446.6602 617.6602 v
+444.7813 612.4805 465.3799 620.7793 v
+495.3799 630.1396 l
+502.4219 632.7197 508.0996 642.3799 v
+513.8623 652.0801 530.5801 672.7617 526.5801 700.46 c
+527.9414 712.8008 521.2998 713.1797 v
+512.1006 715.001 504.2598 706.7002 v
+496.7021 703.1211 494.1797 703.5801 v
+455.2998 702.1396 l
+F
+515.54 703.3398 m
+517.7334 713.1533 512.4199 707.8994 v
+504.668 701.5371 496.3398 701.4199 v
+480.4668 699.1162 475.6992 684.6201 v
+471.2695 655.0732 480.0195 648.8594 v
+485.3047 640.5537 492.9805 647.8994 v
+500.7949 655.0732 517.8438 688.3252 515.54 703.3398 c
+F
+0.2 g
+515.0605 702.8594 m
+517.3105 712.5537 512.1797 707.4199 v
+504.4805 701.1514 496.3398 701.1797 v
+480.7207 698.7725 475.9395 684.6201 v
+471.6914 655.5293 480.2598 649.3398 v
+485.4727 641.2734 492.9805 648.3799 v
+500.6797 655.5293 517.3877 688.2051 515.0605 702.8594 c
+F
+0.4 g
+514.5801 702.6201 m
+516.8906 711.9561 511.6992 706.9395 v
+504.2959 700.7617 496.3398 700.7002 v
+480.9746 698.4297 476.4199 684.3799 v
+472.1143 655.9873 480.5 649.8193 v
+485.6387 641.9961 493.2197 649.0996 v
+500.5664 655.9873 516.9346 688.083 514.5801 702.6201 c
+F
+0.6 g
+514.0996 702.1396 m
+516.4668 711.3584 511.46 706.2197 v
+504.1113 700.376 496.3398 700.46 v
+481.2324 698.0859 476.6602 684.3799 v
+472.5371 656.4463 480.7402 650.54 v
+485.8066 642.7178 493.2197 649.5801 v
+500.4512 656.4463 516.4785 687.9629 514.0996 702.1396 c
+F
+0.8 g
+513.8594 701.6602 m
+516.0469 710.7578 511.2197 705.7393 v
+503.9258 699.9893 496.3398 699.9795 v
+481.4863 697.7432 476.9004 684.3799 v
+472.959 656.9043 480.9805 651.0195 v
+485.9746 643.4385 493.2197 650.0596 v
+500.3359 656.9043 516.0225 687.8428 513.8594 701.6602 c
+F
+1 g
+513.3799 701.4199 m
+515.6211 710.1602 510.7402 705.2598 v
+503.7422 699.6006 496.3398 699.5 v
+481.7402 697.3994 477.3799 684.1396 v
+473.3809 657.3604 481.2197 651.7393 v
+486.1426 644.1602 493.2197 650.7793 v
+500.2207 657.3604 515.5664 687.7207 513.3799 701.4199 c
+F
+0.254902 0.941176 1 0.243137 k
+280.5801 477.7402 m
+258.2217 498.9609 249.3799 499.8193 v
+211.5801 504.2402 195.3799 484.46 v
+214.6616 506.8809 245.0601 500.7803 v
+221.2617 505.5605 207.6201 501.9795 v
+189.1401 502.04 178.5801 486.6201 v
+175.46 481.3398 l
+179.8999 497.6406 200.1802 504.1396 v
+225.2217 509.5205 237.1401 504.1396 v
+213.3418 511.7217 202.3398 509.4199 v
+168.9009 512.1602 154.8198 483.0195 v
+159.2217 498.9609 175.46 506.7803 v
+190.46 516.5596 212.8999 513.5 v
+228.7402 509.96 234.5 507.2598 v
+240.1807 504.6797 238.8608 507.7617 229.7002 513.0195 c
+223.46 524.041 208.1001 523.5801 v
+160.981 519.6416 149.54 506.54 v
+164.5015 518.7607 175.9399 521.8994 v
+200.5806 530.6406 209.7798 529.8193 v
+237.1016 528.6602 245.54 533.1797 v
+233.1416 527.5615 236.6602 524.0596 v
+240.1807 520.5195 247.6616 512.1602 247.7002 510.8594 c
+247.6616 509.5205 274.2798 485.2109 278.1802 480.3799 c
+280.5801 477.7402 l
+F
+0.8 g
+432.9805 264.3799 m
+415.8516 304.5918 402.0195 315.0195 v
+430.7002 297.4395 434.6602 277.5801 v
+434.5498 266.6406 432.9805 264.3799 v
+F
+484.5801 256.2197 m
+455.4512 316.6904 435.1406 343.0996 v
+482.9502 301.8418 488.4199 272.7803 v
+488.9004 266.54 l
+485.7793 269.4199 l
+485.1514 259.4912 484.5801 256.2197 v
+F
+546.7402 309.5 m
+478.002 374.9912 476.4199 377.6602 v
+542.9004 305.1416 546.2598 296.7803 v
+544.002 306.79 546.7402 309.5 v
+F
+339.3799 261.7393 m
+360.8506 318.8906 381.8594 294.1396 v
+398.25 283.1406 397.7002 279.7393 v
+393.3008 286.9902 373.46 286.46 v
+352.6016 289.7402 339.3799 261.7393 v
+F
+548.9004 401.8994 m
+499.4502 433.292 491.2998 435.0195 v
+478.2129 437.5371 545.6504 403.04 551.0605 391.5801 c
+553.3496 394.2412 548.9004 401.8994 v
+F
+0 g
+383.2998 284.7803 m
+405.623 286.8799 413.0605 294.3799 v
+417.8594 290.2998 l
+437.2998 332.54 l
+441.3799 327.0195 l
+457.1025 343.2002 456.2598 351.9795 v
+455.3408 360.7998 470.4199 345.5 y
+469.4219 358.1602 477.3799 350.7803 v
+474.7012 367.8389 483.8594 358.9395 v
+472.3496 392.2139 497.0605 363.9795 v
+503.3027 356.8398 498.5 364.2197 y
+469.8613 417.1201 493.7002 401.1797 v
+495.8213 426.3584 494.4199 431.1797 v
+493.1816 436.04 490.9805 460.6807 485.7793 466.46 c
+480.4209 472.1211 486.1426 473.8809 492.2598 468.1396 c
+479.9814 494.5615 494.4199 481.3398 v
+490.541 498.0801 485.7793 501.2598 v
+479.543 520.0811 496.3398 508.2197 v
+491.4219 521.8398 487.9395 525.2598 v
+475.1406 555.7207 483.1406 550.46 v
+487.9395 546.3799 l
+480.4209 561.8818 487.46 556.9395 v
+494.502 552.2002 494.4199 552.6201 y
+471.1807 589.1602 493.7002 569.8994 v
+484.6465 585.1113 480.9805 592.7002 v
+460.1816 615.1201 475.9395 608.0596 v
+481.2197 606.3799 l
+471.623 617.3213 462.7402 619.0996 v
+454.0205 620.8398 465.4609 627.8818 472.5801 625.5801 c
+479.543 623.4795 496.8203 615.0195 y
+510.7813 594.4395 515.2998 593.8994 v
+493.1816 602.3594 499.7002 593.6602 v
+515.6211 578.1602 507.6201 578.54 v
+501.1016 570.6797 506.4199 561.0195 v
+486.0752 581.2305 502.3398 553.0996 v
+510.0195 535.0996 l
+483.0605 562.3203 495.3799 538.2197 v
+514.3018 512.1602 516.5 511.8193 v
+518.7012 511.2803 523.46 501.5 y
+518.6602 503.8994 l
+524.4199 494.0596 l
+512.1006 507.3193 518.6602 492.8594 v
+524.9004 477.0195 l
+502.4219 501.1611 517.46 468.6201 v
+499.3418 474.3193 509.0605 455.4199 v
+507.2617 437.7988 507.6201 432.1396 v
+508.1406 426.3584 509.4609 395.1201 504.7402 386.2998 c
+499.7813 377.5205 511.2227 356.4004 513.3799 351.9795 c
+515.6211 347.5996 519.582 335.7197 510.0195 345.7393 c
+500.2207 355.959 505.0615 349.8008 507.3799 340.2197 c
+509.4609 330.4395 516.0605 313.2803 515.2998 307.0996 c
+513.8623 305.7988 510.2598 309.7393 v
+494.0625 334.8389 495.8594 319.0996 v
+494.502 310.2002 491.0605 300.6201 v
+487.4629 288.6387 487.46 298.2197 v
+483.9414 316.8008 480.9805 308.54 v
+477.7813 300.0801 473.8203 293.4795 470.6602 290.7803 c
+467.6621 288.2002 461.9414 313.2803 460.5801 301.8193 c
+447.4209 315.4805 442.0996 297.5 v
+429.3799 279.5 l
+428.9414 293.04 427.7002 286.46 v
+394.6211 279.8408 383.2998 284.7803 v
+F
+345.3799 677.1797 m
+332.5801 685.9609 328.0996 685.5801 v
+323.7822 685.0801 358.541 695.2012 403.9395 664.9395 c
+409.1406 661.7598 413.0605 662.2998 v
+416.6211 659.5615 413.54 655.5801 v
+403.8613 645.041 416.1797 632.7793 v
+436.4219 625.2412 430.3398 634.9395 v
+442.1406 630.5215 444.7402 626.0596 v
+447.4209 621.7207 446.1797 626.0596 y
+439.0615 634.04 432.5 639.7393 v
+426.7422 641.96 423.6201 651.2598 v
+420.582 660.4395 417.9414 671.4414 422.9004 675.0195 c
+418.3809 670.1211 419.2998 674.54 v
+420.1426 678.9199 424.1025 682.8799 425.7793 683.4199 c
+427.6211 683.7607 445.6621 701.1416 453.1406 701.6602 c
+443.0215 700.04 439.7002 701.1797 v
+436.4219 702.2402 407.1602 714.7803 400.5801 716.0596 c
+382.0801 723.3604 395.2998 721.0996 v
+434.6621 716.9814 454.5801 702.3799 v
+446.7607 711.7012 426.5 719.4199 v
+402.1016 733.2607 363.3799 727.8193 v
+343.8008 724.2412 335.2998 722.2998 v
+332.3623 722.9209 331.7002 723.2598 v
+331.043 723.7998 318.0605 733.7002 287.7798 725.8994 c
+269 720.9414 259.46 715.5801 v
+242.8208 714.3408 238.8198 710.7793 v
+218.4009 694.7598 216.2598 693.9795 v
+214.0015 693.001 201.4614 684.6416 200.6602 684.1396 c
+227.6406 691.46 230.1802 694.2197 v
+232.9209 696.7393 252.0605 699.6006 254.6602 698.0596 c
+257.3408 696.5215 266.5806 697.1816 256.1001 696.6201 c
+339.1807 680.2393 340.0996 678.1396 v
+340.9424 675.8408 345.3799 677.1797 y
+F
+0.164706 0.627451 1 0.031373 k
+423.8594 687.2598 m
+412.6621 695.4199 410.4199 695.4199 v
+408.2617 695.4199 394.6211 706.6396 390.0195 706.2197 c
+385.3809 705.7617 371.9629 716.7607 341.7793 707.6602 c
+341.1602 709.9395 345.1406 710.7793 v
+352.1621 713.2393 352.5801 713.8994 v
+374.8203 718.5195 382.8203 714.6201 v
+392.8613 711.7012 399.6201 704.7793 v
+412.002 701.3594 415.46 702.3799 v
+425.2012 700.04 425.54 698.0596 v
+432.0225 694.7598 430.0996 691.8193 v
+430.4814 690.1396 423.8594 687.2598 v
+F
+410.1797 689.6602 m
+411.0508 688.9063 412.1719 688.7979 412.8203 687.9795 c
+413.0938 687.5625 412.7773 687.2041 412.3398 687.0195 c
+411.2842 686.749 410.123 687.375 408.9805 686.7793 c
+408.4238 686.501 407.7178 686.7002 407.0605 686.7793 c
+405.3125 687.3506 403.3018 687.377 401.54 686.54 c
+399.2578 687.8623 396.6631 687.2217 394.3398 688.2197 c
+394.3086 688.3516 394.0645 687.9697 394.0996 687.9795 c
+390.6318 689.2588 386.5156 688.9492 383.7793 691.5801 c
+381.1709 691.9131 378.5762 692.4219 375.8594 693.2598 c
+373.9063 693.7305 372.3584 694.8174 370.5801 695.6602 c
+369.0605 696.5117 367.457 697.085 365.7793 697.5801 c
+363.7207 697.9922 361.707 697.8701 359.54 698.54 c
+359.5234 698.4678 359.3125 698.0908 359.2998 698.0596 c
+358.8652 698.2393 358.5469 698.8809 358.3398 698.7793 c
+356.5088 698.2471 354.8721 699.3174 353.0605 699.0195 c
+351.7441 700.2871 349.8438 700.0186 348.2598 700.46 c
+344.8828 701.4365 341.415 700.04 338.1797 701.1797 c
+342.6055 703.167 347.7607 701.8105 352.3398 704.0596 c
+354.791 705.3916 357.7188 704.1797 360.5 705.0195 c
+361.0801 705.1729 361.8418 705.3965 362.1797 704.7793 c
+362.4297 704.8086 362.6289 705.0723 362.6602 705.0195 c
+365.3887 703.7695 367.9355 702.3682 370.5801 701.1797 c
+371.0391 701.0332 371.627 701.29 372.0195 701.1797 c
+373.5752 699.7305 375.7109 699.8428 377.2998 698.54 c
+379.1094 699.0537 381.082 698.6338 383.0605 699.2598 c
+383.0693 699.3506 383.3262 698.9766 383.2998 699.0195 c
+384.6055 699.8232 385.875 699.5264 386.9004 699.2598 c
+387.2285 699.0625 387.959 698.792 388.3398 698.7793 c
+389.5303 698.4072 390.4736 697.8799 391.7002 697.5801 c
+391.8965 697.6592 392.0986 698.0332 392.1797 698.0596 c
+393.4141 697.5195 394.5586 697.5801 395.2998 696.3799 c
+395.4297 696.4492 395.6113 696.7109 395.7793 696.6201 c
+396.8311 696.3105 397.5469 695.4795 398.6602 695.1797 c
+399.291 695.0977 399.9629 694.4092 400.5801 694.2197 c
+403.2266 693.4111 405.2559 691.7285 407.7793 690.8594 c
+408.5049 690.4033 409.4668 690.1465 410.1797 689.6602 c
+F
+325.9395 705.2598 m
+323.0957 707.1514 320.4922 708.3682 317.7793 710.2998 c
+317.6055 710.4795 317.2109 710.29 317.0605 710.54 c
+315.8789 711.0967 314.9043 711.7354 313.9395 712.46 c
+313.2295 712.9209 312.3271 712.9082 311.7793 713.1797 c
+308.9697 714.6123 306.0776 715.2266 303.3799 716.54 c
+304.0713 717.2432 305.3047 716.9736 306.02 717.9795 c
+306.1733 717.5527 306.4351 717.2402 306.7402 717.5 c
+308.6699 718.4453 310.7051 718.6133 312.5 718.46 c
+314.4248 718.4121 316.3164 718.0781 318.2598 717.7393 c
+318.6055 717.7275 318.8242 717.1514 319.2197 717.0195 c
+321.6318 716.3145 324.2598 716.8926 326.6602 716.0596 c
+328.3398 715.2793 330.0684 714.375 331.46 712.9395 c
+331.707 712.6855 331.3496 712.3545 330.9805 712.2197 c
+331.4697 712.2607 331.7695 712.0352 331.9395 711.7393 c
+331.9834 711.4277 331.9834 711.0938 331.9395 710.7793 c
+331.7676 710.4893 331.46 710.377 330.9805 710.2998 c
+329.502 710.1123 331.4502 711.6289 330.7402 711.0195 c
+329.2813 710.2422 330.1016 708.6963 329.2998 707.4199 c
+328.9736 707.5137 328.7217 707.7529 328.8203 708.1396 c
+329.0977 707.6064 328.4355 707.2881 328.3398 706.9395 c
+327.8281 706.1426 326.8398 704.585 325.9395 705.2598 c
+F
+290.1802 697.0996 m
+286.6494 698.043 283.2944 697.918 279.8599 699.2598 c
+279.9033 699.3535 279.6582 698.9697 279.6201 699.0195 c
+278.084 699.6533 277.0737 700.7168 275.7798 701.8994 c
+274.8872 702.8428 273.063 702.418 271.7002 702.8594 c
+271.3042 703.0898 271.0806 703.6514 270.7402 703.5801 c
+269.4102 703.8682 268.3906 704.9121 267.1401 705.5 c
+269.811 706.4141 272.4629 706.3809 275.0601 706.7002 c
+275.2949 706.8242 275.4536 706.4697 275.54 706.46 c
+275.751 706.4697 275.8926 706.7119 276.02 706.9395 c
+276.2554 706.5537 276.5864 706.1934 276.98 706.46 c
+277.4722 707.0674 278.084 706.8584 278.6602 706.7002 c
+278.835 706.8027 278.9746 706.4697 279.1401 706.46 c
+279.2695 706.4697 279.4136 706.8125 279.6201 706.7002 c
+279.7109 706.8105 279.855 706.4697 280.1001 706.46 c
+280.1504 706.4697 280.292 706.7119 280.3398 706.9395 c
+281.2017 706.001 282.1733 706.6113 282.98 706.46 c
+284.2207 706.165 284.5137 704.8994 285.6201 704.54 c
+290.8833 703.1377 295.4336 700.7793 300.2598 698.54 c
+300.5693 698.3213 300.7998 698.0479 300.7402 697.5801 c
+300.9751 697.6201 301.3184 697.7168 301.46 697.5801 c
+302.6914 696.7666 303.8359 696.1641 304.5801 694.9395 c
+304.8418 694.585 304.479 694.1357 304.3398 694.2197 c
+299.3506 695.2881 294.9438 695.9551 290.1802 697.0996 c
+F
+274.8198 648.6201 m
+273.1206 649.8799 272.4775 652.1113 271.2197 654.1396 c
+271.0015 654.4561 271.3042 654.8047 271.7002 654.8594 c
+272.2686 655.0752 272.8662 654.5498 273.3799 654.3799 c
+275.2354 653.3789 276.9248 652.0137 279.1401 651.9795 c
+281.3096 649.4043 285.9941 648.9795 286.1001 645.2598 c
+286.0039 644.3164 284.4321 645.3242 283.9399 644.2998 c
+281.2642 645.4834 278.6357 645.3701 276.02 646.9395 c
+275.3384 647.4033 275.7031 647.9023 274.8198 648.6201 c
+F
+244.5801 706.46 m
+244.729 706.3711 252.4614 706.1143 252.5 705.9795 c
+252.3945 705.6514 243.8911 704.4971 243.3799 704.7793 c
+243.3105 704.7676 235.0474 702.0938 234.98 702.1396 c
+235.1934 702.3896 244.2871 706.373 244.5801 706.46 c
+F
+0 g
+261.6201 695.6602 m
+245.2402 693.6602 240.5 692.2998 v
+235.5605 691.0205 215.1006 682.6611 211.7002 680.54 c
+197.0601 674.5205 178.3398 652.46 v
+186.7207 656.2617 189.1401 659.4199 v
+204.1016 673.2002 203.7798 670.46 v
+217.3018 679.8008 216.7402 677.4199 v
+243.481 689.7002 241.2197 686.2998 v
+265.04 691.2412 264.02 688.9395 v
+284.6216 684.2002 281.54 683.8994 v
+275.1606 682.6611 282.2598 678.6201 v
+278.4609 673.8604 272.4199 678.3799 v
+266.5806 682.6611 269.8809 680.2393 264.5 679.0996 c
+261.5215 678.2598 256.5801 682.7002 v
+250.3018 687.7207 240.7402 683.6602 v
+206.96 669.9004 204.7402 669.2598 v
+200.8018 666.1611 198.2598 662.2998 v
+191.7798 657.3604 188.4199 655.8193 v
+174.4014 643.0615 173.0601 641.4199 v
+169.3398 635.8018 168.5 635.4199 v
+175.501 639.54 177.6201 641.6602 v
+193.1001 652.7402 198.98 653.6602 v
+203.8809 656.9209 204.7402 658.46 v
+220.6016 668.5801 225.1401 668.54 v
+235.3398 662.8613 238.1001 670.46 v
+244.3613 672.54 250.5801 671.1797 v
+254.041 674.0811 253.2197 676.46 v
+254.9214 678.4805 256.1001 674.2998 v
+259.7598 670.3398 264.98 672.6201 v
+269.4414 672.7617 267.1401 670.2197 v
+262.3999 665.9404 249.3799 665.6602 v
+235.7817 665.0596 217.7002 656.7793 v
+184.9614 645.2598 174.7402 633.7393 v
+167.8018 624.1396 161.7798 622.9395 v
+155.48 621.9414 148.8198 613.8193 v
+159.6606 620.1797 169.46 620.2998 v
+173.96 622.8193 169.7002 618.8594 v
+165.8218 610.501 167.54 604.46 v
+166.9209 598.8418 166.1001 597.0195 v
+157.46 583.001 157.46 580.46 v
+157.46 577.7217 158.7798 566.9404 159.1401 566.2998 c
+159.6606 565.6201 158.1201 568.04 162.2598 565.3398 c
+166.4814 562.7598 169.5605 561.001 170.4199 557.8994 c
+171.3198 554.8398 168.2407 563.8613 168.02 565.8193 c
+167.8018 567.8213 163.1816 575.7412 164.1802 578.2998 c
+165.1616 577.2793 166.1001 575.6602 v
+165.3799 576.4014 166.1001 580.46 v
+166.9209 586.0801 168.5 589.5801 v
+170 593.1201 172.2007 597.3008 172.5801 598.2197 c
+173.0815 599.0596 173.0815 605.4414 174.7402 602.54 c
+178.3398 599.6602 l
+175.2798 602.5801 177.6201 604.9395 v
+176.6001 611.1602 178.5801 614.0596 v
+186.2817 623.2617 187.9399 624.3799 v
+189.7998 625.46 188.1802 625.0996 y
+194.8613 629.6406 188.4199 627.9795 v
+184.0806 626.1201 180.7402 626.0596 v
+172.4214 623.9209 176.8999 628.46 v
+181.2197 633.1611 192.2217 639.1016 196.3398 638.7793 c
+197.2998 637.0996 l
+209.54 639.7393 l
+208.3398 638.7793 l
+208.0615 639.1016 212.6602 639.5 v
+217.3018 639.9795 223.6807 638.4414 225.1401 640.46 c
+226.7598 642.4014 230.5015 643.501 230.1802 641.8994 c
+229.6206 640.4209 229.46 638.2998 y
+234.9009 644.5996 234.2598 642.1396 v
+233.5806 639.7617 224.5615 634.04 222.98 627.2598 c
+234.5 636.1396 l
+238.3398 639.5 l
+242.3818 637.1211 242.6602 638.7793 v
+242.8208 640.6396 247.8799 647.0215 249.1401 646.7002 c
+250.52 646.5801 252.7207 649.6611 252.5 646.7002 c
+252.2817 643.9395 260.6602 638.0596 y
+264.1616 639.9795 265.7002 638.54 v
+267.2407 636.9004 271.9399 660.1396 y
+299.2998 671.8994 l
+347.2998 675.7393 l
+328.5801 683.1797 l
+261.6201 695.6602 l
+F
+*u
+1 D
+0 R
+0.435294 0.886275 0.8 0.670588 K
+1 J 2.2 w 10 M
+281.54 476.7803 m
+265.04 495.2217 255.8599 498.1396 v
+241.0615 505.5605 214.1001 496.9395 v
+S
+252.2598 499.5801 m
+224.5615 508.4209 207.6201 503.8994 v
+187.3809 501.6006 178.1001 486.3799 v
+S
+248.4199 501.0195 m
+229.6206 508.8604 213.3799 511.3398 v
+195.0801 514.1406 176.8999 506.2998 v
+163.3999 499.6201 157.46 488.2998 v
+S
+249.3799 500.54 m
+232.4814 512.5996 231.3799 514.2197 v
+223.6807 526.2412 209.2998 526.7002 v
+185.8398 525.7998 166.8198 517.0996 v
+S
+*U
+0 D
+0 O
+0 g
+0 J 1 w 4 M
+247.9399 510.3799 m
+249.6802 508.7842 279.3799 477.0195 y
+318.0605 436.7002 287.2998 474.3799 y
+278.8999 479.5996 268.8198 500.2998 y
+267.4614 503.3594 284.1802 492.3799 y
+288.5815 491.4795 303.6201 470.2998 y
+296.0601 473 301.46 465.0195 y
+304.4214 462.8818 326.9004 445.8193 y
+330.8223 441.3193 335.2998 439.5801 y
+350.6211 445.2793 343.7002 430.7002 y
+346.2227 423.2793 352.3398 435.9795 y
+364.7021 454.5195 346.5801 451.8193 y
+313.6621 448.8008 306.2598 466.46 y
+303.541 469.04 313.2197 466.46 y
+322.4629 464.2012 305.2998 480.1396 y
+307.9395 480.041 318.0195 472.46 y
+329.502 462.4395 331.7002 464.54 y
+351.502 474.3193 362.9004 465.9795 y
+365.1416 464.2012 358.9805 456.7207 360.7402 451.0996 c
+362.502 445.2793 367.7002 431.6602 y
+365.1416 429.8789 365.54 417.9795 y
+384.0605 392.4795 373.46 394.7002 y
+356.3408 395.1201 372.7402 386.7793 y
+376.1406 384.5596 385.9395 376.7002 y
+382.7402 377.96 380.9004 372.1396 y
+386.2617 367.8389 383.2998 362.54 y
+376.582 361.2393 375.3799 356.7793 y
+382.7402 348.0391 371.7793 347.6602 y
+375.7012 342.7588 370.3398 329.6602 y
+365.1416 329.5586 358.0996 323.4199 y
+360.7422 318.1201 349.2197 311.8994 y
+340.0615 310.2002 343.2197 302.7793 y
+334.3418 296.1201 331.7002 278.54 y
+330.8223 267.0801 328.1816 263.5586 333.8594 265.8193 c
+339.623 267.958 338.6602 281.6602 y
+333.4609 298.7598 380.6602 316.46 y
+384.9414 318.1201 385.9395 323.8994 y
+388.0215 323.4004 397.7002 315.0195 y
+406.0615 302.7197 406.5801 312.8594 y
+407.8203 316.8008 406.0996 323.4199 y
+412.6621 347.1582 397.2197 354.1396 y
+386.2617 391.1602 401.7793 381.9795 y
+404.7422 375.7588 416.6602 369.9795 y
+420.5 372.6201 l
+418.8223 377.96 428.1797 384.6201 y
+431.1416 377.5205 437.7793 386.2998 y
+441.7012 413.1582 455.2998 397.3398 y
+459.7422 396.001 461.0605 403.5801 y
+465.0225 414.9199 461.0605 429.9795 y
+465.0225 430.3203 475.7002 423.7393 y
+478.6621 427.6807 468.541 446.1582 473.0605 443.4199 c
+477.3418 440.8809 482.1797 439.0996 y
+483.0605 441.3193 472.0996 454.9395 y
+467.2207 458.04 461.54 480.3799 y
+469.4219 476.5205 458.4199 493.3398 y
+458.4219 496.7598 465.1406 509.1797 y
+464.1416 516.5596 465.1406 516.1396 y
+468.1016 514.8008 476.9023 513.041 469.46 519.9795 c
+461.9414 527.1201 470.4199 532.46 y
+475.1406 535.4814 460.0996 535.0996 y
+454.4629 539.8809 454.8203 544.2197 y
+463.7021 542.0811 447.8623 557.9209 445.2197 561.9795 c
+442.582 565.8418 453.1406 571.5801 y
+467.6621 575.5205 454.8203 579.0195 y
+433.3418 578.5996 445.2197 590.54 y
+451.8223 590.04 450.0195 592.7002 y
+444.3418 594.001 433.7002 601.0996 y
+429.3828 605 433.46 604.2197 y
+451.8223 602.8018 420.2598 615.0195 y
+428.9414 615.1201 409.2197 626.54 y
+406.9424 628.3203 403.46 636.6201 y
+396.8223 642.4014 391.46 649.8193 y
+391.1025 654.7207 385.9395 659.8994 y
+373.0615 674.96 366.9805 674.54 y
+350.6211 678.4805 344.9004 677.6602 y
+286.8198 672.8594 l
+257.7798 658.6807 266.4199 635.6602 y
+273.4014 626.3408 283.46 630.6201 y
+288.5815 637.3398 301.46 634.9395 y
+323.7822 631.3994 320.9004 635.4199 y
+318.2813 640.4209 300.4614 647.2393 300.2598 647.8994 c
+300.02 648.5596 290.4199 652.2197 y
+287.041 653.6211 282.2598 663.7393 y
+278.6816 667.4814 296.1802 661.0996 y
+294.7402 660.001 302.8999 655.5801 y
+322.0205 656.7002 333.6201 644.7793 y
+345.5625 626.5615 345.8594 635.6602 y
+348.8623 645.9199 335.7793 669.2598 y
+336.3223 671.4414 345.3799 664.2197 y
+346.8828 666.3799 347.7793 659.8994 y
+347.9814 657.3604 352.0996 648.6201 y
+355.2422 634.2607 359.2998 642.3799 y
+364.3398 632.0596 l
+365.8018 629.2012 359.2998 620.7793 y
+358.9805 617.7607 359.8613 617.9814 353.7793 609.7393 c
+347.543 601.2607 351.3799 596.54 y
+349.7402 589.1602 359.54 589.5801 y
+362.2813 587.1797 366.0195 587.1797 y
+368.002 584.9814 370.5801 585.7393 y
+372.4014 589.8193 379.2197 587.6602 y
+380.7607 590.2617 389.7793 590.7793 y
+390.8809 593.5615 391.3203 595.3203 395.0605 596.0596 c
+398.8018 596.6406 371.7793 644.0596 y
+378.7813 644.8203 369.8594 658.46 y
+367.3418 665.7197 379.8828 649.6611 382.3398 648.1396 c
+384.7207 646.5801 385.8223 644.1602 384.0195 644.2998 c
+382.3018 644.5996 380.3223 642.1807 381.8594 641.8994 c
+383.4004 641.7412 397.7021 625.2412 401.54 614.0596 c
+405.1807 602.8018 411.7813 598.3994 418.5801 591.7393 c
+425.4219 585.2002 424.5801 558.6201 y
+424.1025 548.8994 430.8203 537.2598 y
+432.9004 533.0596 428.1797 513.0195 y
+426.082 510.6201 427.7002 509.6602 y
+428.7227 508.4209 436.0996 493.8193 y
+434.2207 494.1201 438.2598 490.2197 y
+443.9023 483.5596 436.8203 486.8594 y
+430.2607 488.6211 438.0195 477.7393 y
+439.2822 475.8604 429.3799 480.8594 y
+419.2617 481.5801 432.0195 473.6602 y
+441.4805 465.7393 428.9004 470.54 y
+423.8809 472.5605 427.46 465.0195 y
+430.9209 463.3203 449.7793 455.6602 y
+450.2813 451.4404 446.9004 445.8193 y
+447.4209 441.54 444.9805 437.8994 y
+443.6816 428.7793 443.0605 427.8193 y
+438.4014 427.6807 430.3398 412.46 y
+428.2813 409.6396 417.1406 396.3799 y
+414.8623 388.7402 395.0605 396.6201 y
+387.8027 392.9189 390.0195 396.6201 y
+389.5615 399.0801 394.8203 405.7393 y
+402.541 408.54 399.6201 420.3799 y
+404.082 421.959 391.7617 425.04 391.9395 426.3799 c
+392.2012 427.6807 398.6602 429.2598 y
+407.3809 431.4199 402.5 434.0596 y
+401.8809 438.459 405.1406 444.6201 y
+417.9414 445.501 405.1406 463.3398 y
+393.3008 471.6797 392.1797 477.9795 y
+406.0615 487.0801 397.043 500.7197 397.2197 504.6201 c
+397.4814 508.6396 398.9004 532.46 y
+396.6006 539.2207 393.3799 554.2998 y
+395.7227 559.9014 403.9395 573.7393 y
+406.9424 578.3818 416.6211 583.6611 414.2598 586.9395 c
+411.7813 590.2617 403.2197 588.3799 y
+394.6211 589.8193 395.2998 584.0596 y
+393.5215 583.001 392.6602 577.5801 y
+391.8486 568.7744 382.0996 561.9795 y
+369.7617 555.0605 379.9395 550.7002 y
+386.4824 543.4014 375.6201 543.2598 y
+363.6006 545.1602 372.7402 533.8994 y
+384.502 519.8594 381.1406 516.8594 y
+369.9824 515.6816 383.7793 505.5801 y
+382.9609 507.7617 383.2998 505.8193 v
+383.4004 503.8018 386.7012 499.1816 387.6201 496.9395 c
+388.4629 494.7793 384.0195 494.54 y
+384.7207 484.001 367.7002 488.54 y
+367.7813 488.6211 366.0195 488.2998 v
+364.2607 488.1797 351.9414 489.0605 345.6201 491.4199 c
+339.1807 493.9014 331.7002 493.8193 y
+327.3008 491.9209 318.9805 492.1396 v
+310.5801 492.3604 301.7002 489.2598 y
+296.9409 489.7207 306.4014 494.5615 306.7402 494.2998 c
+306.8408 494.1201 313.002 500.2803 304.1001 499.5801 c
+280.2246 497.8232 268.3398 509.1797 y
+266.1416 510.6201 263.2998 513.7393 y
+252.2817 515.8994 264.7402 500.0596 y
+266.1416 498.5215 264.5 497.4199 y
+263.7197 499.1816 255.1401 505.0996 y
+252.0488 506.1914 250.5488 507.6582 247.9399 510.3799 c
+F
+0.435294 0.886275 0.8 0.670588 k
+221.7798 523.0996 m
+234.4614 517.001 237.3799 513.9795 v
+240.1807 510.8408 255.6201 498.3799 y
+249.6416 500.501 246.7402 502.46 v
+243.9199 504.4609 232.1001 513.5 y
+227.8613 520.0801 221.7798 523.0996 v
+F
+0.45098 0 1 0 k
+157.9399 557.4199 m
+158.2617 557.6406 157.6855 560.624 157.46 561.2598 c
+156.3369 564.2188 146.4199 565.8193 y
+146.2109 564.3389 146.1514 562.585 146.1802 560.7793 c
+151.6206 554.71 157.9399 557.4199 v
+F
+0.658824 0.2 1 0.039216 k
+157.9399 557.6602 m
+157.395 557.5225 157.875 560.7051 157.7002 561.2598 c
+156.5552 564.2188 146.4199 566.0596 y
+146.2109 564.4492 146.1514 562.6924 146.1802 560.7793 c
+150.9609 555.2598 157.9399 557.6602 v
+F
+0 g
+153.1401 557.6602 m
+152.3721 557.54 151.8154 558.7949 151.7002 560.2998 c
+151.8154 561.8857 152.3721 563.1416 153.1401 563.1797 c
+153.7471 563.1416 154.3066 561.8857 154.3398 560.2998 c
+154.3066 558.7949 153.7471 557.54 153.1401 557.6602 c
+F
+102.98 449.6602 m
+96.7402 438.6797 124.1001 445.3398 v
+139.4214 446.5996 142.1001 449.1797 v
+143.3818 448.3594 152.583 445.1338 155.7798 444.3799 c
+163.1816 442.6396 172.3398 453.7402 y
+177.481 465.1904 180.5 465.2598 v
+183.6416 465.1904 180.02 463.3398 y
+172.8608 452.3193 173.2998 450.6201 v
+167.5806 428.5586 150.02 427.5801 v
+132.2144 426.6338 133.7002 420.1396 v
+143.3818 422.8398 145.9399 420.1396 v
+157.9014 420.6387 149.0601 413.6602 v
+141.6201 400.9395 l
+141.7734 396.5313 130.5801 400.46 v
+119.8398 404.1387 108.5 418.2197 y
+90.9658 434.333 102.98 449.6602 v
+F
+0.066667 0.470588 0.290196 0 k
+101.54 445.3398 m
+99.3799 434.7197 139.9399 446.0596 v
+144.7017 446.1582 147.3799 445.3398 v
+149.9814 444.3994 163.1816 441.3193 165.3799 442.7002 c
+157.46 427.6807 144.7402 429.5 v
+130.1816 427.6807 130.5801 422.2998 v
+135.02 414.4805 140.4199 411.7402 v
+143.3818 409.2002 143.0601 405.7402 v
+142.501 402.1592 139.4214 400.3994 137.2998 399.5 c
+135.02 398.6406 131.5015 402.1592 129.8599 402.1396 c
+127.981 402.1592 118.7407 409.2002 114.02 414.3799 c
+109.0615 419.7578 99.8218 432.958 100.3398 435.9795 c
+100.7002 439.1191 101.54 445.3398 y
+F
+0.262745 0.682353 0.52549 0.062745 k
+105.1401 426.1396 m
+107.96 421.7402 111.481 417.1201 114.02 414.3799 c
+118.7407 409.2002 127.981 402.1592 129.8599 402.1396 c
+131.5015 402.1592 135.02 398.6406 137.2998 399.5 c
+139.4214 400.3994 142.501 402.1592 143.0601 405.7402 c
+143.3818 409.2002 140.4199 411.7402 y
+136.9277 413.5254 133.9136 417.3682 132.2598 419.8994 c
+132.3799 417.1201 126.7402 417.9795 v
+120.9414 418.8799 115.2197 421.959 113.54 425.4199 c
+111.7017 429.001 109.0615 431.6406 110.8999 427.5801 c
+112.5801 423.7207 115.2197 419.7578 116.8999 419.4199 c
+118.7407 418.8799 118.3018 417.5596 115.7002 417.9795 c
+113.0215 418.4404 109.9399 418.8799 105.1401 424.7002 c
+F
+0.254902 0.941176 1 0.243137 k
+102.2598 449.1797 m
+104.2207 464.2012 105.6201 468.6201 v
+104.6602 476.0811 107.2998 480.6201 v
+109.9399 485.3213 112.1406 492.1396 115.46 498.1396 c
+118.7407 504.0195 118.9614 508.4209 123.3799 510.1396 c
+127.7598 511.9395 134.3599 521.4004 137.54 522.6201 c
+140.5205 523.6016 140.4199 522.6201 y
+147.7808 539 162.7402 534.6201 v
+144.9199 537.6797 162.2598 548.0596 v
+157.0205 546.8115 160.5801 554.54 v
+163.0713 559.6445 162.5215 552.2002 150.5 539.1797 c
+144.9199 529.7598 139.2197 526.46 v
+133.4814 523.1602 120.2817 515.4609 119.0601 511.3398 c
+117.6416 507.1016 114.1206 500.7197 111.8599 498.8594 c
+109.7217 497.2012 106.6401 492.5811 106.1001 488.7803 c
+104.8809 484.4404 103.46 483.0195 v
+101.8018 481.8008 101.5806 478.2803 101.54 476.0596 c
+101.5806 473.8809 99.3799 470.8018 99.6201 468.1396 c
+100.4814 447.2598 100.1001 445.0996 v
+102.2598 449.1797 l
+F
+1 g
+92.8999 444.1396 m
+90.5815 445.7188 85.7002 439.0996 v
+93.771 402.8193 93.8599 401.1797 v
+94.981 403.5898 93.6201 411.5 v
+92.1201 419.4297 91.2197 433.3398 y
+92.8999 444.1396 l
+F
+0.254902 0.941176 1 0.243137 k
+116.6602 510.8594 m
+97.1816 507.3193 97.7002 475.0996 v
+96.7402 447.9795 l
+95.4199 476.0811 94.1001 477.7393 v
+92.7798 479.5996 97.1816 491.9209 93.6201 485.4199 c
+78.2598 469.9209 87.1401 446.54 v
+88.7095 442.9707 85.46 447.9795 v
+80.3506 461.8896 81.6201 468.8594 v
+81.7808 471.3506 83.7798 474.3799 v
+93.3296 487.3018 96.2598 489.7393 v
+98.2808 505.6709 115.2197 511.3398 v
+121.4912 513.9199 116.6602 510.8594 v
+F
+0 g
+269.7798 583.5801 m
+270.6055 584.0498 270.5957 585.1182 271.2197 585.2598 c
+272.499 585.6846 272.6792 586.8584 273.1401 587.6602 c
+274.208 589.1719 274.4214 590.8594 275.0601 592.46 c
+275.3599 593.2686 275.3911 594.3193 275.0601 595.0996 c
+273.7544 597.7734 272.9814 600.4688 271.46 603.0195 c
+271.1001 603.6318 270.812 604.5049 270.5 605.1797 c
+270.0825 606.6865 268.7002 607.7764 267.8599 609.2598 c
+267.4375 609.7129 268.0137 610.7305 267.1401 610.9395 c
+266.2402 610.9395 264.6465 611.5752 264.5 610.46 c
+263.7441 607.6016 264.855 604.8271 265.9399 602.0596 c
+265.0591 601.3779 265.4263 600.3682 265.7002 599.4199 c
+266.377 595.5557 265.0566 591.8691 264.2598 588.1396 c
+264.1953 587.9336 264.5718 587.7148 264.5 587.6602 c
+263.1968 584.6934 261.5981 582.0029 259.7002 579.5 c
+258.7642 578.293 257.8066 577.2842 257.2998 576.1396 c
+256.8535 575.249 256.4048 574.1885 256.5801 573.0195 c
+252.9033 570.0439 250.4263 565.8125 247.46 561.5 c
+247.0474 560.835 247.3662 559.5049 247.9399 559.0996 c
+248.8662 558.7705 249.9199 559.8965 250.3398 560.7793 c
+250.8633 561.5957 251.252 562.3105 251.7798 562.9395 c
+251.9385 563.2109 251.7417 563.6719 251.7798 563.8994 c
+254.7871 566.3857 256.623 569.6162 259.2197 572.2998 c
+261.4663 572.583 263.1558 573.6797 264.98 574.7002 c
+265.417 574.9902 265.9951 574.7168 266.4199 574.9395 c
+268.2417 576.2266 268.2393 578.4678 268.3398 580.46 c
+268.4097 581.54 268.6255 582.9893 269.7798 583.5801 c
+F
+260.1802 588.6201 m
+260.2905 588.6582 260.1201 589.124 260.1802 589.3398 c
+260.4199 589.7168 260.8613 589.9229 261.1401 590.2998 c
+261.1616 590.5186 260.9814 590.9355 261.1401 591.0195 c
+263.6982 593.7842 263.979 597.1113 262.8198 600.3799 c
+263.9673 601.0635 264.0342 602.4512 263.54 603.5 c
+262.6279 605.252 262.417 607.3711 261.3799 609.0195 c
+260.4609 610.4648 258.7256 611.833 257.2998 610.46 c
+256.7554 609.958 256.3999 609.0938 256.8198 608.2998 c
+256.7769 608.1318 257.0913 607.9707 257.0601 607.8193 c
+256.9424 607.5244 256.3423 607.2773 256.3398 606.8594 c
+256.3042 605.333 255.2529 603.6699 255.8599 602.2998 c
+256.7959 600.418 257.6958 598.373 258.5 596.54 c
+257.0815 594.0918 258.2192 591.3994 256.3398 589.3398 c
+256.1406 589.1738 256.1504 588.749 256.3398 588.6201 c
+256.6064 587.9932 257.0527 587.5469 257.54 587.1797 c
+257.811 587.0908 258.1929 587.0908 258.5 587.1797 c
+259.0498 587.624 259.4863 588.1592 260.1802 588.6201 c
+F
+329.2998 599.8994 m
+330.7754 597.9434 331.0957 594.8691 328.8203 593.4199 c
+329.4463 589.7002 333.1328 591.877 335.54 592.46 c
+335.3223 592.8867 335.5713 593.2666 335.7793 593.1797 c
+337.0449 593.2881 337.793 594.4229 338.9004 594.1396 c
+339.4395 595.9326 341.2402 596.7051 342.0195 598.2197 c
+343.8457 602.2881 343.1982 606.9893 340.3398 610.46 c
+340.1338 610.8389 340.3711 611.4072 340.3398 611.8994 c
+339.4043 614.2373 337.1289 614.583 335.0605 615.2598 c
+333.707 619.6035 332.9785 624.0361 330.9805 628.2197 c
+329.2666 628.376 328.498 630.2881 327.1406 631.0996 c
+325.5605 631.8701 324.9365 630.1348 324.9805 628.9395 c
+324.9902 628.7598 325.4863 628.5127 325.2197 628.2197 c
+325.2148 627.9297 324.9297 627.8096 324.9805 627.7393 c
+324.9316 627.5117 325.1738 627.3682 325.2197 627.2598 c
+324.3105 626.3193 322.7461 625.793 322.3398 624.6201 c
+321.373 620.4531 324.2021 617.0166 325.9395 613.5801 c
+326.6865 612.248 325.877 610.8486 324.9805 609.5 c
+324.5605 608.7559 324.6797 607.5146 324.9805 606.6201 c
+325.8105 604.0107 327.5605 602.0957 329.2998 599.8994 c
+F
+288.2598 579.7393 m
+286.7358 577.6543 282.9849 574.8291 286.1001 572.7793 c
+286.4048 572.5664 286.8125 572.5615 287.0601 572.7793 c
+289.2246 574.4307 291.4302 575.4248 294.02 576.1396 c
+294.2456 576.0967 294.5479 575.583 294.98 575.6602 c
+296.7271 576.5332 298.9375 576.4688 300.2598 578.0596 c
+304.3833 577.6953 308.3047 578.9209 312.0195 580.46 c
+313.3135 580.8535 314.7109 581.4678 316.0996 582.1396 c
+317.5449 582.6533 318.8691 583.6758 320.1797 585.0195 c
+320.2373 585.0801 320.6289 584.9814 320.9004 585.0195 c
+320.8789 585.9297 321.9365 586.0713 322.0996 586.7002 c
+322.3086 587.0098 322.1426 587.4463 322.3398 587.6602 c
+324.6416 589.3496 325.6543 591.5693 324.2598 594.1396 c
+324.0537 594.8213 323.7793 595.501 323.0605 596.0596 c
+321.9629 597.0244 320.751 596.0859 319.7002 596.54 c
+319.4258 595.7305 318.625 595.918 318.2598 595.8193 c
+317.2539 595.2197 315.7881 595.8633 314.9004 595.3398 c
+313.3447 594.6152 311.9785 594.4297 310.3398 593.8994 c
+310.0713 593.9258 309.2168 594.0293 309.1406 593.4199 c
+308.8926 593.4893 308.7295 593.7461 308.6602 593.6602 c
+306.5146 593.2852 305.1294 593.0498 303.6201 591.2598 c
+303.584 591.0439 303.0967 591.2402 302.8999 591.0195 c
+301.8701 590.2012 301.4263 588.8457 300.2598 588.1396 c
+299.9937 587.9697 299.605 588.1563 299.2998 587.8994 c
+298.6807 587.54 298.2773 586.834 297.6201 586.46 c
+297.2095 586.0898 296.7705 586.4473 296.8999 586.7002 c
+297.0752 588.8721 297.793 590.8369 297.1401 592.9395 c
+299.4463 595.6729 302.2134 597.8164 304.1001 600.8594 c
+304.2178 603.2041 304.9785 605.5635 304.8198 607.8193 c
+304.8418 608.0596 304.5249 608.8662 304.3398 609.2598 c
+304.0449 610.1885 305.041 611.3594 304.1001 612.1396 c
+302.5688 613.4814 301.1479 612.5166 300.2598 610.9395 c
+298.2178 610.5098 295.9448 609.749 294.2598 611.1797 c
+293.103 611.9717 292.4673 612.9697 291.6201 614.0596 c
+290.5039 615.5625 290.8735 617.1416 290.8999 618.8594 c
+290.9551 619.0039 290.6094 619.1523 290.6602 619.3398 c
+290.6118 619.4502 290.8521 619.5938 290.8999 619.8193 c
+290.2231 620.4297 289.9209 621.5938 288.7402 621.9795 c
+289.1357 623.1416 288.3921 624.1133 287.54 624.3799 c
+285.2383 625.208 283.395 623.1025 281.2998 622.9395 c
+280.748 623.002 280.2344 624.1445 279.6201 624.6201 c
+279.0464 624.7393 278.271 624.7754 277.9399 624.3799 c
+277.1167 623.9287 276.4688 623.8037 275.54 623.6602 c
+273.855 623.0977 272.4512 621.8936 270.7402 621.0195 c
+269.1895 620.0117 268.1382 618.4297 266.8999 616.9395 c
+265.9136 615.7109 265.7646 613.0566 267.3799 612.6201 c
+269.355 611.792 270.7881 614.7656 272.8999 614.2998 c
+273.2935 614.3506 273.5215 614.0068 273.3799 613.5801 c
+273.8286 613.46 274.0688 613.7119 274.3398 614.0596 c
+275.2231 612.9004 276.5049 612.5283 277.46 611.6602 c
+278.605 610.5752 280.5249 611.0332 281.54 609.9795 c
+283.3232 608.2852 282.7065 605.3359 284.8999 603.9795 c
+284.1968 602.4561 283.5298 601.0518 283.2197 599.4199 c
+282.8506 598.1553 283.9424 596.8398 285.3799 597.0195 c
+286.6592 597.041 286.9473 597.877 287.54 599.1797 c
+287.7754 598.7666 288.291 598.4404 288.2598 598.2197 c
+287.7417 595.5771 286.6133 593.3857 286.1001 590.7793 c
+286.0449 590.3623 285.709 590.1387 285.3799 590.2998 c
+284.7656 585.6963 280.3086 583.0635 277.46 579.5 c
+277.0664 579.0293 277.0615 577.6563 277.46 577.0996 c
+279.0537 575.6865 281.2109 577.3877 282.98 578.0596 c
+283.3135 579.2666 284.2593 580.3037 285.6201 580.2197 c
+286.0063 580.2314 286.2656 580.8271 286.5801 580.9395 c
+287.0049 581.1221 287.5566 580.875 287.7798 581.1797 c
+289.772 582.4082 291.3223 583.625 293.2998 585.0195 c
+293.4438 585.0752 293.8232 584.9023 294.02 585.0195 c
+294.4185 585.2002 294.625 585.624 294.98 585.7393 c
+295.3613 586.0469 295.6279 585.7275 295.9399 585.5 c
+295.1313 585.0361 295.1265 583.9834 294.5 583.8193 c
+293.6338 583.4668 293.0166 582.9033 292.3398 582.3799 c
+291.9536 582.2002 291.229 582.4707 291.1401 582.3799 c
+290.4561 581.1436 289.1528 580.6611 288.2598 579.7393 c
+F
+227.54 633.9795 m
+217.2583 637.2002 204.98 609.0195 v
+202.3398 603.2402 199.7002 601.0996 v
+197.0601 598.8418 184.7407 594.8818 182.6602 590.54 c
+171.1401 572.7793 l
+187.3809 590.4795 190.8198 593.1797 v
+199.7002 602.3594 196.1001 594.8594 v
+180.7808 583.001 182.1802 572.7793 v
+175.9399 557.04 174.98 554.7793 v
+192.6606 590.04 195.3799 591.2598 v
+197.9409 592.6807 199.2607 592.6807 198.02 588.6201 c
+196.6206 584.7607 196.1816 566.7197 193.2197 564.6201 c
+201.9009 586.9609 201.1401 590.54 v
+204.541 594.4395 207.1401 588.6201 v
+205.9399 571.0996 l
+210.7402 557.8994 l
+208.0615 570.2402 209.7798 587.4199 v
+207.6201 598.8418 211.9399 592.7002 v
+216.4209 586.5195 226.981 579.9199 227.0601 574.7002 c
+221.2617 594.001 211.2197 599.1797 v
+206.6602 592.7002 l
+205.46 594.8594 l
+201.4614 595.7598 206.4199 603.2598 v
+211.1406 610.7217 210.7402 611.6602 y
+217.7407 603.6797 219.6201 603.7393 v
+234.02 612.041 235.46 585.2598 v
+242.8208 601.04 232.8198 608.54 v
+216.4209 610.7217 217.7002 616.46 v
+225.6201 630.1396 l
+229.6206 635.8018 227.7798 632.7793 y
+F
+205.46 615.9795 m
+191.3408 616.001 187.9399 610.2197 v
+180.02 599.6602 l
+198.8218 610.7217 203.2998 612.1396 v
+207.6201 613.3613 205.46 615.9795 y
+F
+161.54 609.0195 m
+159.2217 607.6396 158.8999 604.46 v
+158.3408 601.4814 155.7007 601.04 156.5 597.9795 c
+157.46 594.8818 159.6606 592.2412 159.6201 596.54 c
+159.6606 601.04 161.4199 603.2402 162.2598 604.46 c
+163.1816 605.8809 164.9409 610.7217 161.54 609.0195 c
+F
+151.7002 541.5801 m
+142.501 546.041 138.98 549.9795 v
+135.4614 553.9609 135.9585 548.2783 130.5801 548.7793 c
+124.189 549.166 125.2998 566.7793 y
+120.98 558.3799 l
+119.6216 542.5205 128.4199 545.1797 v
+132.7183 546.4492 134.1416 544.7217 132.5 543.7393 c
+130.6206 542.96 138.541 542.5205 135.3799 540.8594 c
+132.3799 539 148.2197 544.7217 145.7002 533.1797 c
+151.7002 541.5801 l
+F
+137.7798 525.7393 m
+120.9414 520.9609 116.8999 531.5 v
+111.7017 528.8818 114.02 525.5 v
+116.54 522.2813 117.8599 521.8994 y
+123.7998 520.5195 123.1401 519.7393 v
+122.48 518.7607 119.7798 514.9395 y
+131.0601 521.6211 137.7798 525.7393 v
+F
+1 g
+389.0605 439.8193 m
+388.6523 437.4316 386.8135 436.5508 384.7402 435.7402 c
+382.6133 436.8721 379.7559 440.29 377.7793 437.8994 c
+377.1602 438.5479 376.3037 438.6123 375.8594 439.3398 c
+375.4141 440.3311 375.7129 441.4805 375.3799 442.46 c
+374.7363 443.7578 373.957 445.2607 374.1797 446.7803 c
+376.1484 447.6025 376.8027 449.6982 376.3398 451.5801 c
+376.2051 451.9209 375.7324 452.1387 375.8594 452.54 c
+376.1582 452.8779 376.5078 453.1279 376.8203 453.5 c
+376.6523 453.2715 376.4941 453.0146 376.3398 453.0195 c
+375.7012 453.1543 375.8359 453.8545 375.8594 454.2197 c
+376.623 456.2021 378.8379 456.4922 380.4199 455.1797 c
+380.6025 455.8018 381.1621 455.5879 381.6201 455.6602 c
+381.5859 456.2578 382.0352 456.8379 382.3398 457.3398 c
+382.8223 458.5059 384.6152 457.2891 385.46 458.0596 c
+386.6738 458.8711 387.8438 459.6416 389.0605 459.0195 c
+391.0215 457.8633 392.9004 456.5313 394.0996 454.7002 c
+394.8516 453.6963 395.1152 452.2881 395.0605 451.3398 c
+395.0098 450.5215 393.4902 450.9102 393.1406 449.8994 c
+392.4033 447.9658 394.417 447.3945 395.2998 445.8193 c
+395.4678 445.5391 395.1777 445.2031 394.8203 445.0996 c
+394.3789 444.9561 393.5166 445.165 393.6201 444.6201 c
+394.7363 441.1514 391.7051 440.4082 389.0605 439.8193 c
+F
+378.5 418.2197 m
+378.5527 420.1299 376.791 422.0645 378.0195 423.9795 c
+378.2695 423.793 378.4141 423.5498 378.5 423.5 c
+378.7109 423.5498 378.8555 423.793 378.9805 423.9795 c
+380.6455 421.5029 384.6631 420.4805 384.5 417.2598 c
+384.4834 416.8594 383.2881 415.8486 384.2598 415.0996 c
+382.2871 413.6572 382.2266 411.0508 381.1406 408.8594 c
+379.8398 409.2939 378.5078 409.6924 377.2998 410.2998 c
+377.6289 411.9346 377.499 413.7871 378.5 415.3398 c
+378.8789 416.0068 378.5645 417.1924 378.5 418.2197 c
+F
+0.8 g
+195.8599 428.0596 m
+177.1953 416.9697 192.7402 433.8193 v
+202.3398 444.3994 213.3799 450.6201 y
+224.7798 455.4004 228.7402 456.6201 v
+232.7002 458.041 249.4209 463.7598 252.98 464.2998 c
+256.46 464.6406 267.02 469.04 274.5801 464.54 c
+281.9814 460.2412 290.8999 455.4199 y
+272.7417 464.6406 268.8198 461.8994 v
+264.8218 459.3604 256.9014 459.7998 250.3398 456.3799 c
+234.02 451.4404 230.4199 449.1797 v
+226.981 447.0391 215.54 434.2803 213.8599 435.2598 c
+212.0215 436.04 214.2197 436.4795 215.54 439.5801 c
+216.8599 442.6396 214.6616 444.3994 205.9399 437.4199 c
+197.0601 430.3203 195.8599 428.0596 y
+F
+0 g
+203.7798 434.7803 m
+205.436 449.0264 214.8198 447.2598 v
+223.8105 451.7842 226.8198 453.9795 v
+235.7578 455.8203 237.1401 456.3799 v
+257.5254 466.0684 273.7183 461.0986 274.3398 462.3799 c
+274.9185 463.5605 296.5063 455.7314 300.5 451.3398 c
+300.9082 450.749 289.2222 457.3945 278.6602 459.5 c
+269.4536 461.249 245.6934 459.2021 233.7798 453.0195 c
+230.4248 451.4521 220.585 445.0898 217.7002 445.0996 c
+215.0166 445.335 203.7798 434.7803 y
+F
+0.8 g
+199.7002 406.46 m
+182.9814 409.2002 201.3799 411.0195 v
+221.2617 413.1582 225.6201 418.9395 v
+240.6201 429.001 243.6201 429.5 v
+246.7808 429.8789 279.7808 437.7988 280.3398 440.54 c
+280.6616 443.0791 286.8198 443.0791 288.5 442.2197 c
+290.3408 441.3193 289.46 440 286.3398 439.0996 c
+283.3018 438.2402 248.9814 420.2002 241.9399 418.9395 c
+234.9009 417.5596 222.1401 409.2002 216.98 407.8994 c
+211.5801 406.5586 199.7002 406.46 y
+F
+0 g
+221.0601 414.6201 m
+211.731 415.6113 221.2998 416.54 v
+230.8906 420.2764 233.0601 423.2598 v
+240.8047 428.3887 242.4199 428.54 v
+243.9585 428.8369 259.3135 432.8936 259.46 434.2998 c
+259.7646 435.5957 297.2383 449.4365 302.1802 445.8193 c
+305.3022 443.6162 294.4111 445.46 283.7002 440.54 c
+282.3223 439.9277 245.084 423.8818 241.46 423.2598 c
+237.8745 422.5303 231.3418 418.251 228.7402 417.5 c
+225.9346 416.8975 221.0601 414.6201 y
+F
+212.4199 412.2197 m
+218.1802 412.7188 216.98 411.0195 v
+215.54 409.2002 212.8999 410.0596 y
+212.4199 412.2197 l
+F
+204.5 410.54 m
+210.2598 410.96 209.0601 409.0996 v
+207.6201 407.4395 204.98 408.3799 y
+204.5 410.54 l
+F
+193.2197 408.8594 m
+198.8218 409.2002 197.54 407.4199 v
+196.1816 405.6797 193.46 406.46 y
+193.2197 408.8594 l
+F
+184.8198 407.8994 m
+190.46 408.3193 189.1401 406.46 v
+187.8198 404.7988 185.2998 405.7402 y
+184.8198 407.8994 l
+F
+227.0601 451.3398 m
+231.8218 451.4404 230.4199 449.6602 v
+229.1816 447.9199 225.6201 448.46 y
+227.0601 451.3398 l
+F
+216.02 445.3398 m
+223.1357 447.6338 220.3398 443.8994 v
+219.0605 442.2002 216.5 443.1797 y
+216.02 445.3398 l
+F
+203.7798 440.0596 m
+209.3818 440.4395 208.1001 438.6201 v
+206.7417 436.9209 204.02 437.8994 y
+203.7798 440.0596 l
+F
+195.3799 433.3398 m
+201.02 433.8389 199.7002 432.1396 v
+198.3799 430.3203 195.8599 431.1797 y
+195.3799 433.3398 l
+F
+187.9399 428.0596 m
+193.5415 428.5586 192.2598 426.8594 v
+190.9014 425.041 188.1802 425.8994 y
+187.9399 428.0596 l
+F
+230.8999 421.0996 m
+238.4238 421.6689 236.6602 419.4199 v
+234.9102 416.9834 231.3799 418.2197 y
+230.8999 421.0996 l
+F
+242.1802 426.3799 m
+249.8647 426.9482 248.1802 424.7002 v
+246.3511 422.2637 242.8999 423.5 y
+242.1802 426.3799 l
+F
+254.1802 431.1797 m
+261.7446 431.7891 259.9399 429.5 v
+258.231 427.1045 254.6602 428.2998 y
+254.1802 431.1797 l
+F
+265.46 436.46 m
+273.1831 437.0693 271.46 434.7803 v
+269.6694 432.3848 266.1802 433.5801 y
+265.46 436.46 l
+F
+235.2197 456.3799 m
+242.8232 456.8691 240.98 454.46 v
+239.3096 452.1846 234.98 452.54 y
+235.2197 456.3799 l
+F
+246.2598 459.7402 m
+253.8247 460.3877 252.02 458.0596 v
+250.311 455.7031 245.54 455.8994 y
+246.2598 459.7402 l
+F
+221.2998 415.8193 m
+226.981 416.2402 225.6201 414.3799 v
+224.3408 412.7188 221.7798 413.6602 y
+221.2998 415.8193 l
+F
+0.254902 0.941176 1 0.243137 k
+140.6602 525.0195 m
+135.9009 515.2393 135.3799 511.8193 v
+136.3398 521.4004 137.7798 523.5801 v
+138.98 525.7998 140.6602 525.0195 y
+F
+120.5 509.4199 m
+116.9814 493.6807 117.3799 490.7002 v
+116.1006 503.3594 116.6602 504.6201 v
+116.9814 506 120.5 509.4199 y
+F
+0.8 g
+143.2998 591.5 m
+143.0601 588.1396 l
+140.6602 587.8994 l
+156.3608 573.9795 156.98 565.5801 v
+157.9014 574.6396 143.2998 591.5 v
+F
+0 g
+147.8599 590.2998 m
+147.2891 590.6475 147.5288 591.4658 147.1401 591.7393 c
+146.1919 592.3203 148.5078 592.3828 148.3398 593.1797 c
+147.8359 594.4971 148.0425 594.5215 147.8599 595.8193 c
+147.8457 596.5801 148.4912 598.2744 148.8198 598.7002 c
+150.5073 600.5762 149.0503 603.8018 150.7402 605.4199 c
+151.189 605.8252 151.6016 606.4326 151.9399 606.8594 c
+152.6406 607.9521 153.9414 608.4893 155.0601 609.5 c
+155.3384 609.7041 155.1152 610.6133 155.7798 610.46 c
+156.5264 610.3857 157.8921 610.5293 157.9399 609.5 c
+157.7192 607.2705 156.2578 605.3789 154.8198 603.5 c
+155.3457 602.7705 154.8418 602.0713 154.5801 601.3398 c
+153.0605 598.5771 153.2695 595.4502 153.1401 592.2197 c
+153.0703 592.2344 152.7344 592.1475 152.6602 591.9795 c
+153.1304 589.5225 153.7734 587.1025 154.8198 584.54 c
+155.1416 583.6279 155.6602 582.6436 155.7798 581.6602 c
+155.9478 580.8682 156.0605 579.9531 155.54 579.2598 c
+157.8511 575.998 156.4111 573.082 157.7002 569.1797 c
+157.9233 568.5098 159.7856 566.4053 159.3799 566.54 c
+156.5117 567.54 156.3896 567.9775 156.2598 568.7002 c
+156.0342 569.4922 155.6694 571.0059 155.2998 571.5801 c
+155.3384 571.8486 155.1514 573.9219 155.0601 573.9795 c
+153.4014 576.6748 154.8945 576.4834 153.3799 579.0195 c
+151.8174 579.8232 150.7544 581.0381 149.54 582.3799 c
+149.3022 582.54 150.5601 583.3369 150.2598 583.5801 c
+149.1582 584.9912 147.8911 585.833 148.3398 587.4199 c
+148.4312 588.2334 148.5801 589.3975 147.8599 590.2998 c
+F
+143.7798 588.3799 m
+144.2598 580.8008 146.8999 579.0195 v
+149.54 577.2793 148.2197 578.1602 144.7402 579.5 c
+141.1807 580.8008 142.5801 581.6602 y
+139.4214 581.2393 142.1001 579.0195 v
+144.7017 576.8408 148.6616 574.2002 146.8999 574.2197 c
+145.1406 574.2002 136.7817 578.5996 136.8198 581.6602 c
+136.7817 584.7607 135.6201 589.3398 y
+136.8896 590.1514 142.1001 590.0596 v
+143.7104 589.2705 143.7798 588.3799 v
+F
+1 g
+143.0601 567.7393 m
+133.5679 570.8906 113.2998 567.2598 v
+123.1733 569.4463 143.7798 567.0195 v
+155.1514 565.5654 143.0601 567.7393 y
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+143.0601 567.7393 m
+133.5679 570.8906 113.2998 567.2598 v
+123.1733 569.4463 143.7798 567.0195 v
+155.1514 565.5654 143.0601 567.7393 y
+143.0601 567.7393 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+145.2197 567.9795 m
+136.1768 571.7695 115.7002 569.8994 v
+125.6982 571.2266 145.9399 567.0195 v
+157.2178 564.5957 145.2197 567.9795 y
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+145.2197 567.9795 m
+136.1768 571.7695 115.7002 569.8994 v
+125.6982 571.2266 145.9399 567.0195 v
+157.2178 564.5957 145.2197 567.9795 y
+145.2197 567.9795 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+147.1401 567.7393 m
+138.457 572.3311 117.8599 571.8193 v
+127.9663 572.5713 147.8599 566.7793 v
+158.9048 563.6113 147.1401 567.7393 y
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+147.1401 567.7393 m
+138.457 572.3311 117.8599 571.8193 v
+127.9663 572.5713 147.8599 566.7793 v
+158.9048 563.6113 147.1401 567.7393 y
+147.1401 567.7393 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+148.5801 567.5 m
+141.1064 572.2881 122.6602 573.5 v
+131.7178 573.3105 149.2998 566.54 v
+158.7729 562.9014 148.5801 567.5 y
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+148.5801 567.5 m
+141.1064 572.2881 122.6602 573.5 v
+131.7178 573.3105 149.2998 566.54 v
+158.7729 562.9014 148.5801 567.5 y
+148.5801 567.5 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+275.54 555.9795 m
+274.3999 555.2764 274.5801 556.46 v
+274.8726 557.873 305.9023 572.3594 309.8594 572.0596 c
+276.6055 557.5586 275.54 555.9795 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+275.54 555.9795 m
+274.3999 555.2764 274.5801 556.46 v
+274.8726 557.873 305.9023 572.3594 309.8594 572.0596 c
+276.6055 557.5586 275.54 555.9795 v
+275.54 555.9795 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+271.7002 555.2598 m
+270.728 554.4941 270.98 555.7393 v
+270.9922 557.1201 300.7881 574.001 304.8198 573.9795 c
+272.7441 556.9424 271.7002 555.2598 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+271.7002 555.2598 m
+270.728 554.4941 270.98 555.7393 v
+270.9922 557.1201 300.7881 574.001 304.8198 573.9795 c
+272.7441 556.9424 271.7002 555.2598 v
+271.7002 555.2598 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+268.1001 553.8193 m
+267.1665 552.9199 267.1401 554.2998 v
+267.2578 555.5576 289.0566 572.6045 299.7798 574.7002 c
+280.0161 565.7266 268.1001 553.8193 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+268.1001 553.8193 m
+267.1665 552.9199 267.1401 554.2998 v
+267.2578 555.5576 289.0566 572.6045 299.7798 574.7002 c
+280.0161 565.7266 268.1001 553.8193 v
+268.1001 553.8193 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+264.98 551.6602 m
+264.0918 550.9561 264.02 552.1396 v
+264.1758 553.3301 283.7935 568.6709 293.54 570.6201 c
+275.6602 562.4814 264.98 551.6602 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+264.98 551.6602 m
+264.0918 550.9561 264.02 552.1396 v
+264.1758 553.3301 283.7935 568.6709 293.54 570.6201 c
+275.6602 562.4814 264.98 551.6602 v
+264.98 551.6602 l
+s
+0 O
+0.8 g
+0 J 1 w 4 M
+230.1802 388.9395 m
+213.3418 391.5986 231.8599 393.2598 v
+251.6216 395.5586 256.1001 401.1797 v
+270.98 411.3994 274.1001 411.7402 v
+277.1406 412.2803 295.1816 416.2402 295.7002 418.9395 c
+296.0601 421.5195 302.6602 424.1602 304.3398 423.2598 c
+306.1807 422.4004 306.1807 412.2803 303.1401 411.5 c
+300.02 410.5205 279.3418 402.6006 272.4199 401.1797 c
+265.2607 399.958 252.5 391.5986 247.2197 390.3799 c
+241.9399 388.959 230.1802 388.9395 y
+F
+0 g
+310.3398 429.9795 m
+307.0615 428.3408 305.7798 425.4199 v
+298.7002 413.8203 282.98 410.2998 v
+257.7798 400.3994 249.1401 398.2998 v
+234.4614 392.7002 226.3398 393.5 v
+218.6216 393.3584 225.3799 391.5801 v
+247.6616 393.7998 251.2998 395.6602 v
+268.5605 401.499 271.9399 404.2998 v
+275.1606 407.2207 295.1816 412.7188 297.6201 414.8594 c
+300.02 417.1201 310.8008 426.3584 310.3398 429.9795 c
+F
+245.7798 395.4199 m
+251.5229 395.6865 250.3398 393.9795 v
+248.9863 392.2783 246.2598 393.2598 y
+245.7798 395.4199 l
+F
+237.8599 393.9795 m
+243.5981 394.2002 242.4199 392.54 v
+241.064 390.79 238.3398 391.8193 y
+237.8599 393.9795 l
+F
+226.3398 392.54 m
+232.1289 392.8281 230.8999 391.0996 v
+229.5918 389.4199 226.8198 390.3799 y
+226.3398 392.54 l
+F
+217.9399 392.0596 m
+223.731 392.2275 222.5 390.6201 v
+221.1943 388.8193 218.4199 389.8994 y
+217.9399 392.0596 l
+F
+264.02 403.5801 m
+271.6133 403.9082 270.02 401.6602 v
+268.2368 399.3701 264.7402 400.7002 y
+264.02 403.5801 l
+F
+275.2998 408.3799 m
+281.8569 412.0762 281.2998 406.46 v
+280.9736 403.6953 276.02 405.5 y
+275.2998 408.3799 l
+F
+285.3799 411.5 m
+293.2231 415.6113 291.3799 409.5801 v
+290.4609 406.9063 286.1001 408.6201 y
+285.3799 411.5 l
+F
+295.7002 416.7803 m
+300.6079 422.2373 301.7002 414.8594 v
+302.228 412.1162 296.4199 413.8994 y
+295.7002 416.7803 l
+F
+254.4199 398.54 m
+260.2686 398.8945 258.98 397.0996 v
+257.7319 395.4844 255.1401 396.3799 y
+254.4199 398.54 l
+F
+1 g
+293.7798 532.2197 m
+292.8799 531.4473 292.8198 532.7002 v
+292.8774 533.8018 312.1113 548.3906 321.8594 549.9795 c
+304.1289 542.5107 293.7798 532.2197 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+293.7798 532.2197 m
+292.8799 531.4473 292.8198 532.7002 v
+292.8774 533.8018 312.1113 548.3906 321.8594 549.9795 c
+304.1289 542.5107 293.7798 532.2197 v
+293.7798 532.2197 l
+s
+0 O
+0 g
+0 J 1 w 4 M
+296.8999 461.8994 m
+321.1426 437.3594 331.2197 433.3398 v
+341.3818 421.0811 336.9805 392.54 v
+333.4609 384.1201 330.0195 406.9395 v
+333.4609 434.7197 321.1406 417.0195 v
+311.9004 428.0098 318.9805 427.5801 v
+322.4629 425.4795 322.8203 427.3398 v
+323.3408 429.001 314.54 443.96 295.7002 459.7402 c
+276.7017 475.6396 296.8999 461.8994 y
+F
+1 g
+232.8198 419.4199 m
+232.4814 421.2988 234.5 420.3799 v
+236.4414 419.54 340.0615 412.7188 374.9004 386.2998 c
+325.1025 411.8408 232.8198 419.4199 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+232.8198 419.4199 m
+232.4814 421.2988 234.5 420.3799 v
+236.4414 419.54 340.0615 412.7188 374.9004 386.2998 c
+325.1025 411.8408 232.8198 419.4199 v
+232.8198 419.4199 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+244.1001 424.2197 m
+243.9199 426.1396 246.02 425.1797 v
+247.8799 424.3809 398.1416 425.4795 424.0996 389.8994 c
+399.9004 417.5596 244.1001 424.2197 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+244.1001 424.2197 m
+243.9199 426.1396 246.02 425.1797 v
+247.8799 424.3809 398.1416 425.4795 424.0996 389.8994 c
+399.9004 417.5596 244.1001 424.2197 v
+244.1001 424.2197 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+256.8198 428.54 m
+256.6807 430.5391 258.7402 429.7402 v
+260.6406 428.7803 451.3809 443.0791 477.3799 407.4199 c
+466.7813 435.6006 256.8198 428.54 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+256.8198 428.54 m
+256.6807 430.5391 258.7402 429.7402 v
+260.6406 428.7803 451.3809 443.0791 477.3799 407.4199 c
+466.7813 435.6006 256.8198 428.54 v
+256.8198 428.54 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+267.8599 433.8193 m
+267.6802 435.8193 269.7798 435.0195 v
+271.6401 434.0596 406.0615 476.5205 432.0195 440.7803 c
+417.2813 467.9404 267.8599 433.8193 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+267.8599 433.8193 m
+267.6802 435.8193 269.7798 435.0195 v
+271.6401 434.0596 406.0615 476.5205 432.0195 440.7803 c
+417.2813 467.9404 267.8599 433.8193 v
+267.8599 433.8193 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+204.02 408.8594 m
+203.8809 410.7393 205.9399 409.8193 v
+207.8408 408.9795 227.4199 406.5586 229.7002 363.9795 c
+221.7007 410.0791 204.02 408.8594 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+204.02 408.8594 m
+203.8809 410.7393 205.9399 409.8193 v
+207.8408 408.9795 227.4199 406.5586 229.7002 363.9795 c
+221.7007 410.0791 204.02 408.8594 v
+204.02 408.8594 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+194.4199 406.9395 m
+194.2017 408.9795 196.1001 408.1396 v
+198.1616 407.2207 213.7808 412.2803 210.7402 369.5 c
+212.0215 408.3193 194.4199 406.9395 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+194.4199 406.9395 m
+194.2017 408.9795 196.1001 408.1396 v
+198.1616 407.2207 213.7808 412.2803 210.7402 369.5 c
+212.0215 408.3193 194.4199 406.9395 v
+194.4199 406.9395 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+185.54 406.46 m
+185.4009 408.541 187.46 407.6602 v
+189.3608 406.7793 206.2998 406.1191 192.7402 381.5 c
+203.2207 407.8809 185.54 406.46 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+185.54 406.46 m
+185.4009 408.541 187.46 407.6602 v
+189.3608 406.7793 206.2998 406.1191 192.7402 381.5 c
+203.2207 407.8809 185.54 406.46 v
+185.54 406.46 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+237.6201 455.4199 m
+237.1904 453.1299 238.8198 454.46 v
+256.5703 468.3555 292.2559 533.1484 353.54 539.4199 c
+311.3691 552.668 237.6201 455.4199 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+237.6201 455.4199 m
+237.1904 453.1299 238.8198 454.46 v
+256.5703 468.3555 292.2559 533.1484 353.54 539.4199 c
+311.3691 552.668 237.6201 455.4199 v
+237.6201 455.4199 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+250.1001 457.3398 m
+248.499 458.6211 250.5801 459.2598 v
+252.6104 459.9971 376.2949 539.749 419.54 531.0195 c
+389.6914 539.2471 250.1001 457.3398 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+250.1001 457.3398 m
+248.499 458.6211 250.5801 459.2598 v
+252.6104 459.9971 376.2949 539.749 419.54 531.0195 c
+389.6914 539.2471 250.1001 457.3398 v
+250.1001 457.3398 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+227.0601 450.6201 m
+226.5151 448.8389 228.5 449.8994 v
+238.2681 455.5449 242.2446 518.4746 290.1802 519.7402 c
+254.5278 536.043 227.0601 450.6201 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+227.0601 450.6201 m
+226.5151 448.8389 228.5 449.8994 v
+238.2681 455.5449 242.2446 518.4746 290.1802 519.7402 c
+254.5278 536.043 227.0601 450.6201 v
+227.0601 450.6201 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+205.2197 438.3799 m
+203.9746 437.0547 206.1802 437.4199 v
+217.3926 438.7998 240.9365 484.1953 289.9399 478.7002 c
+254.6577 494.3906 205.2197 438.3799 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+205.2197 438.3799 m
+203.9746 437.0547 206.1802 437.4199 v
+217.3926 438.7998 240.9365 484.1953 289.9399 478.7002 c
+254.6577 494.3906 205.2197 438.3799 v
+205.2197 438.3799 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+217.46 445.0996 m
+216.6294 443.5898 218.6602 444.3799 v
+229.4624 447.8818 243.855 496.9521 292.8198 500.7803 c
+255.3633 509.5928 217.46 445.0996 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+217.46 445.0996 m
+216.6294 443.5898 218.6602 444.3799 v
+229.4624 447.8818 243.855 496.9521 292.8198 500.7803 c
+255.3633 509.5928 217.46 445.0996 v
+217.46 445.0996 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+197.2998 432.8594 m
+196.4551 431.6914 198.2598 431.8994 v
+207.3247 433.1045 226.395 469.877 265.9399 465.2598 c
+237.5098 478.1338 197.2998 432.8594 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+197.2998 432.8594 m
+196.4551 431.6914 198.2598 431.8994 v
+207.3247 433.1045 226.395 469.877 265.9399 465.2598 c
+237.5098 478.1338 197.2998 432.8594 v
+197.2998 432.8594 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+189.1401 426.3799 m
+187.9497 425.1895 189.6201 425.4199 v
+194.2856 425.6572 227.9863 462.0459 248.4199 445.0996 c
+235.0854 465.5889 189.1401 426.3799 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+189.1401 426.3799 m
+187.9497 425.1895 189.6201 425.4199 v
+194.2856 425.6572 227.9863 462.0459 248.4199 445.0996 c
+235.0854 465.5889 189.1401 426.3799 v
+189.1401 426.3799 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+265.46 461.4199 m
+264.2192 462.9434 266.4199 463.3398 v
+268.4697 463.791 401.2441 527.2734 443.0605 513.0195 c
+414.4668 525.082 265.46 461.4199 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+265.46 461.4199 m
+264.2192 462.9434 266.4199 463.3398 v
+268.4697 463.791 401.2441 527.2734 443.0605 513.0195 c
+414.4668 525.082 265.46 461.4199 v
+265.46 461.4199 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+228.7402 390.6201 m
+228.5215 392.7002 230.4199 391.8193 v
+232.4814 390.9395 249.4209 390.2793 235.7002 365.6602 c
+246.3418 392.041 228.7402 390.6201 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+228.7402 390.6201 m
+228.5215 392.7002 230.4199 391.8193 v
+232.4814 390.9395 249.4209 390.2793 235.7002 365.6602 c
+246.3418 392.041 228.7402 390.6201 v
+228.7402 390.6201 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+240.2598 392.54 m
+239.96 394.46 241.9399 393.5 v
+243.9199 392.7002 263.5015 390.2793 265.7002 347.6602 c
+257.7798 393.7998 240.2598 392.54 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+240.2598 392.54 m
+239.96 394.46 241.9399 393.5 v
+243.9199 392.7002 263.5015 390.2793 265.7002 347.6602 c
+257.7798 393.7998 240.2598 392.54 v
+240.2598 392.54 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+247.7002 394.2197 m
+247.4409 396.2188 249.3799 395.4199 v
+251.4009 394.46 278.4609 390.7207 304.3398 355.0996 c
+265.2607 395.5586 247.7002 394.2197 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+247.7002 394.2197 m
+247.4409 396.2188 249.3799 395.4199 v
+251.4009 394.46 278.4609 390.7207 304.3398 355.0996 c
+265.2607 395.5586 247.7002 394.2197 v
+247.7002 394.2197 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+256.1001 396.3799 m
+255.5674 398.4053 257.54 397.8193 v
+259.7266 397.1865 282.2021 399.2764 324.0195 361.5801 c
+273.3174 400.1191 256.1001 396.3799 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+256.1001 396.3799 m
+255.5674 398.4053 257.54 397.8193 v
+259.7266 397.1865 282.2021 399.2764 324.0195 361.5801 c
+273.3174 400.1191 256.1001 396.3799 v
+256.1001 396.3799 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+267.3799 401.4199 m
+267.0078 403.2461 269.0601 402.6201 v
+271.165 402.0273 309.4834 397.0762 366.2598 358.7002 c
+284.7559 404.96 267.3799 401.4199 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+267.3799 401.4199 m
+267.0078 403.2461 269.0601 402.6201 v
+271.165 402.0273 309.4834 397.0762 366.2598 358.7002 c
+284.7559 404.96 267.3799 401.4199 v
+267.3799 401.4199 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+222.98 414.1396 m
+222.7998 416.0186 224.8999 415.0996 v
+226.7598 414.2598 285.5 411.3994 318.9805 381.9795 c
+280.5488 409.1719 222.98 414.1396 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+222.98 414.1396 m
+222.7998 416.0186 224.8999 415.0996 v
+226.7598 414.2598 285.5 411.3994 318.9805 381.9795 c
+280.5488 409.1719 222.98 414.1396 v
+222.98 414.1396 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+211.9399 409.5801 m
+211.8008 411.6201 213.8599 410.7803 v
+215.7607 409.8584 242.8208 406.1191 268.8198 370.46 c
+229.6206 410.96 211.9399 409.5801 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+211.9399 409.5801 m
+211.8008 411.6201 213.8599 410.7803 v
+215.7607 409.8584 242.8208 406.1191 268.8198 370.46 c
+229.6206 410.96 211.9399 409.5801 v
+211.9399 409.5801 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+279.3799 406.46 m
+278.833 408.2764 281.0601 407.8994 v
+283.0688 407.3672 321.6465 405.2354 381.1406 370.9395 c
+295.748 408.8672 279.3799 406.46 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+279.3799 406.46 m
+278.833 408.2764 281.0601 407.8994 v
+283.0688 407.3672 321.6465 405.2354 381.1406 370.9395 c
+295.748 408.8672 279.3799 406.46 v
+279.3799 406.46 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+288.7402 409.0996 m
+288.0728 410.917 290.1802 410.54 v
+292.3086 410.0068 330.8867 407.876 390.5 373.5801 c
+305.6479 411.9463 288.7402 409.0996 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+288.7402 409.0996 m
+288.0728 410.917 290.1802 410.54 v
+292.3086 410.0068 330.8867 407.876 390.5 373.5801 c
+305.6479 411.9463 288.7402 409.0996 v
+288.7402 409.0996 l
+s
+0 O
+1 g
+0 J 1 w 4 M
+299.2998 414.6201 m
+298.6328 416.415 300.7402 416.0596 v
+302.8687 415.5049 350.2471 410.7363 449.0605 373.0996 c
+316.208 417.4473 299.2998 414.6201 v
+F
+0 R
+0 G
+1 J 0.11 w 10 M
+299.2998 414.6201 m
+298.6328 416.415 300.7402 416.0596 v
+302.8687 415.5049 350.2471 410.7363 449.0605 373.0996 c
+316.208 417.4473 299.2998 414.6201 v
+299.2998 414.6201 l
+s
+0 O
+0 g
+0 J 1 w 4 M
+176.8999 406.9395 m
+182.54 407.4395 181.2197 405.7402 v
+179.8999 403.9209 177.3799 404.7803 y
+176.8999 406.9395 l
+F
+210.7402 391.5801 m
+216.4209 392.041 215.0601 390.3799 v
+213.7808 388.5195 211.2197 389.4199 y
+210.7402 391.5801 l
+F
+201.1401 392.0596 m
+206.7417 392.4795 205.46 390.6201 v
+204.1016 388.959 201.3799 389.8994 y
+201.1401 392.0596 l
+F
+96.02 405.0195 m
+101.665 403.585 99.8599 402.3799 v
+98.0166 401.1221 95.7798 402.8594 y
+96.02 405.0195 l
+F
+98.4199 415.5801 m
+103.8633 414.1445 102.02 412.9395 v
+100.2178 411.6826 97.9399 413.4199 y
+98.4199 415.5801 l
+F
+90.5 420.3799 m
+95.9434 418.9854 94.1001 417.7402 v
+92.2974 416.5225 90.02 418.2197 y
+90.5 420.3799 l
+F
+0.8 g
+178.1001 337.8193 m
+176.3818 337.9209 172.1001 335.6602 v
+169.7817 335.7197 157.46 331.7598 151.2197 320.7803 c
+164.9409 331.3203 178.1001 337.8193 v
+F
+274.5801 236.0596 m
+274.7842 235.7266 274.8438 235.2627 275.0601 235.3398 c
+275.8877 235.2002 277.2441 234.8691 277.2197 235.5801 c
+276.1733 240.3057 275.2134 245.7363 270.7402 247.8193 c
+269.9648 248.0313 268.3784 247.5771 268.3398 246.6201 c
+268.1553 244.9277 268.0278 243.4443 268.3398 241.8193 c
+268.6978 240.2695 271.0713 240.2578 272.1802 241.8193 c
+273.1113 239.9404 273.5864 237.9121 274.5801 236.0596 c
+F
+262.3398 230.7803 m
+263.2666 229.2461 263.125 227.2012 264.7402 226.7002 c
+265.4961 226.2607 267.5313 227.333 267.1401 228.6201 c
+266.1895 230.7803 265.7622 233.2441 264.2598 235.3398 c
+264.0151 235.5244 264.2769 236.1104 264.02 236.54 c
+263.4487 237.8115 262.189 238.623 260.6602 238.2197 c
+259.4146 235.8369 260.6768 233.4941 262.3398 231.5 c
+262.501 231.4473 262.3184 231.0342 262.3398 230.7803 c
+F
+218.8999 236.54 m
+218.7607 236.9258 218.7197 237.4346 218.8999 237.7393 c
+219.4854 238.9229 220.3569 240.1592 220.1001 241.3398 c
+219.603 242.4434 218.377 242.2441 217.7002 241.5801 c
+216.4136 240.5234 216.3584 238.5146 215.54 237.0195 c
+215.3838 236.5947 215.4395 235.9658 215.0601 235.5801 c
+214.4336 235.0732 213.9487 233.3955 214.1001 232.7002 c
+214.1118 232.4238 213.9102 221.5254 214.1001 221.8994 c
+214.8369 222.6201 218.1919 233.3291 218.1802 234.3799 c
+218.3311 235.1143 219.1353 235.625 218.8999 236.54 c
+F
+190.5801 243.9795 m
+193.5752 246.7305 196.6445 249.9893 196.1001 254.0596 c
+196.0303 255.1445 194.0767 254.5664 193.9399 253.5801 c
+192.9897 249.6465 190.748 246.7207 187.9399 243.9795 c
+185.5063 241.8369 183.459 234.8594 183.1401 234.3799 c
+187.2681 240.082 189.7495 243.1016 190.5801 243.9795 c
+F
+175.7002 250.46 m
+176.3218 250.9492 175.9902 251.4893 176.1802 251.8994 c
+177.2769 253.457 178.707 254.8281 178.8198 256.7002 c
+178.731 257.0449 178.3159 257.3857 177.8599 257.1797 c
+177.6416 256.9375 177.2646 256.793 177.1401 256.7002 c
+174.915 253.957 173.3745 251.0186 171.8599 247.8193 c
+171.5864 247.5322 170.3262 242.5928 170.6602 242.54 c
+170.9336 242.377 172.8271 246.9746 173.0601 247.0996 c
+174.4473 247.8555 174.459 249.6318 175.7002 250.46 c
+F
+194.1802 229.0996 m
+194.6406 230 196.3735 231.3223 196.3398 232.2197 c
+196.1216 233.3213 196.6353 234.9082 195.6201 234.1396 c
+194.2495 233.1074 190.4551 231.625 190.1001 225.2598 c
+190.1313 224.6064 193.4023 227.5713 194.1802 229.0996 c
+F
+210.02 247.8193 m
+210.481 248.6738 211.2583 248.1533 211.7002 248.54 c
+212.4775 248.8516 213.1494 249.4658 213.3799 250.2197 c
+214.5366 252.543 216.4834 254.5469 216.7402 257.1797 c
+215 258.7256 214.2534 256.4814 213.6201 255.5 c
+212.1055 257.2305 211.0063 255.1709 209.54 254.54 c
+209.499 254.5684 209.2642 254.9502 209.2998 255.0195 c
+207.8862 254.4365 207.1401 253.2461 205.9399 252.3799 c
+205.8535 252.2402 205.4097 252.4395 205.2197 252.3799 c
+204.5288 251.626 203.4585 251.2686 203.0601 250.46 c
+201.9297 247.541 198.4761 245.2354 196.3398 237.0195 c
+196.8198 235.9395 201.3633 244.2461 201.8599 244.9395 c
+202.8198 246.3291 202.9497 243.1875 204.2598 243.9795 c
+204.4087 243.9482 204.6128 243.6865 204.7402 243.5 c
+204.9727 243.8477 205.2129 244.0996 205.7002 243.9795 c
+205.6401 244.4189 205.4937 245.0313 205.7002 245.1797 c
+207.0752 246.2813 206.9814 247.4551 207.8599 248.7803 c
+208.3447 247.9521 209.5112 248.7412 210.02 247.8193 c
+F
+275.7798 188.0596 m
+283.9614 210.54 279.1401 222.8594 v
+291.6606 199.0996 286.5801 186.8594 v
+286.1602 198.2188 281.7798 203.6602 v
+277.3613 189.6387 275.7798 188.0596 v
+F
+259.46 190.9395 m
+265.4814 200.6406 256.5801 220.9395 v
+255.7998 198.4395 248.4199 186.3799 v
+263.9409 208.5605 259.46 190.9395 v
+F
+248.6602 193.0996 m
+248.3218 215.1602 248.6602 218.54 v
+244.5801 200.1992 233.2998 189.7393 v
+249.2002 202.8389 248.6602 193.0996 v
+F
+238.1001 228.3799 m
+244.5801 213.3994 233.54 193.0996 v
+240.6201 206.5781 235.46 214.2197 v
+238.2007 218.0186 238.1001 228.3799 v
+F
+216.98 193.5801 m
+215.7607 210.7588 217.7002 213.2598 v
+217.9614 220.2197 217.46 221.4199 v
+221.9214 228.1396 222.2598 219.9795 v
+223.6807 211.4189 226.8198 206.2998 v
+230.7197 200.4199 230.4199 193.3398 v
+219.5 226.5986 216.98 193.5801 v
+F
+212.8999 224.0596 m
+205.6401 212.0791 203.7798 191.1797 v
+202.1216 198.001 206.4199 213.7393 v
+210.9199 230.7803 212.8999 224.0596 v
+F
+188.8999 202.2197 m
+194.4199 208.1191 195.8599 213.5 v
+199.9209 231.001 192.98 221.4199 v
+193.1001 212.7393 184.1001 204.6201 v
+189.3608 207.2402 188.8999 202.2197 v
+F
+182.6602 207.7393 m
+186.2817 226.8193 187.2197 227.6602 v
+189.1401 231.4395 186.02 227.8994 v
+176.3818 206.7988 172.1001 199.5801 v
+180.7808 209.6602 182.6602 207.7393 v
+F
+176.1802 225.9795 m
+188.9214 250.5801 164.8999 222.1396 v
+177.0415 232.9785 176.1802 225.9795 v
+F
+159.1401 242.0596 m
+164.5015 262.6777 167.2998 262.46 v
+176.3818 272.3594 169.2197 260.7803 v
+162.5215 250.1406 163.2197 239.4199 v
+162.5215 249.9199 159.1401 242.0596 v
+F
+522.5 254.54 m
+509.3496 265.541 506.6602 269.4199 v
+521.4512 249.041 521.54 241.3398 v
+524.2012 249.5908 522.5 254.54 v
+F
+528.5 278.7803 m
+505.501 295.2412 501.6201 303.5 v
+530.8018 271.04 530.9004 266.0596 v
+531.3516 275.9912 528.5 278.7803 v
+F
+547.2197 448.2197 m
+534.1016 456.9414 532.3398 454.7002 v
+544.002 447.5908 546.7402 438.1396 v
+545.1006 448.1406 547.2197 448.2197 v
+F
+556.5801 359.6602 m
+537.3799 372.8594 l
+558.3008 354.0918 558.7402 349.5801 v
+556.5801 359.6602 l
+F
+*u
+0 R
+0 G
+1 J 1.1 w 10 M
+126.7402 384.3799 m
+150.98 379.0996 l
+S
+1 D
+182.1802 206.0596 m
+181.5513 209.9912 171.6201 198.3799 v
+S
+188.1802 200.54 m
+190.3496 207.79 183.1401 202.9395 v
+S
+247.46 191.1797 m
+249.2002 203.3906 236.6602 189.0195 v
+S
+*U
+U
+%%PageTrailer
+gsave annotatepage grestore showpage
+%%Trailer
+Adobe_Illustrator_AI3 /terminate get exec
+Adobe_pattern_AI3 /terminate get exec
+Adobe_customcolor /terminate get exec
+Adobe_cshow /terminate get exec
+Adobe_cmykcolor /terminate get exec
+Adobe_packedarray /terminate get exec
+%%EOF
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/images/tux.svg b/htmltest/sites/all/libraries/tcpdf-version/examples/images/tux.svg
new file mode 100644
index 00000000..de8c8696
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/images/tux.svg
@@ -0,0 +1,1487 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="500pt"
+   height="600pt"
+   id="svg5620"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docname="mh_inksc_100511_NewTux.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   inkscape:export-filename="/media/disk/※T h i n g S/UB SOFTWARE/Openclipart/mh_inksc_100511_NewTux.png"
+   inkscape:export-xdpi="150.03999"
+   inkscape:export-ydpi="150.03999">
+  <metadata
+     id="metadata5712">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     inkscape:window-height="728"
+     inkscape:window-width="1280"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     guidetolerance="10.0"
+     gridtolerance="10.0"
+     objecttolerance="10.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     showgrid="false"
+     inkscape:zoom="0.65866667"
+     inkscape:cx="837.03841"
+     inkscape:cy="362.33556"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:current-layer="svg5620"
+     showguides="true"
+     inkscape:guide-bbox="true" />
+  <defs
+     id="defs5622">
+    <linearGradient
+       id="linearGradient6810">
+      <stop
+         id="stop6812"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:0.04385965;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.35964912;"
+         offset="0.46429399"
+         id="stop6816" />
+      <stop
+         id="stop6814"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 375 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="625 : 375 : 1"
+       inkscape:persp3d-origin="312.5 : 250 : 1"
+       id="perspective5714" />
+    <linearGradient
+       id="linearGradient172">
+      <stop
+         style="stop-color:#3f2600;stop-opacity:0.6;"
+         offset="0"
+         id="stop173" />
+      <stop
+         style="stop-color:#3f2600;stop-opacity:0;"
+         offset="1"
+         id="stop174" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient167">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.65;"
+         offset="0"
+         id="stop168" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop169" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient162">
+      <stop
+         style="stop-color:#ffa63f;stop-opacity:1;"
+         offset="0"
+         id="stop163" />
+      <stop
+         style="stop-color:#ffff00;stop-opacity:1;"
+         offset="1"
+         id="stop164" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient153">
+      <stop
+         style="stop-color:#ffeed7;stop-opacity:1;"
+         offset="0"
+         id="stop154" />
+      <stop
+         style="stop-color:#bdbfc2;stop-opacity:1;"
+         offset="1"
+         id="stop155" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient138">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.8;"
+         offset="0"
+         id="stop139" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop140" />
+    </linearGradient>
+    <linearGradient
+       xlink:href="#linearGradient138"
+       id="linearGradient141"
+       x1="0.47424799"
+       y1="0.020191999"
+       x2="0.417539"
+       y2="0.90125799"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient142"
+       x1="0.55880702"
+       y1="0.031192999"
+       x2="0.553922"
+       y2="0.94531101"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient143"
+       x1="0.46557701"
+       y1="0.028819799"
+       x2="0.41365999"
+       y2="0.93366498"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient144"
+       x1="0.70346397"
+       y1="0.059404202"
+       x2="0.64553201"
+       y2="0.94063401"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient145"
+       x1="0.46741399"
+       y1="-0.036155298"
+       x2="0.86741799"
+       y2="0.75857902"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient146"
+       x1="0.57152498"
+       y1="0.023441499"
+       x2="0.57143003"
+       y2="0.71875"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient147"
+       x1="0.5"
+       y1="0.0234362"
+       x2="0.5"
+       y2="0.8125"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient148"
+       x1="0.50799799"
+       y1="0.37435901"
+       x2="0.51599997"
+       y2="0.92820501"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient138"
+       id="linearGradient149"
+       x1="0.5"
+       y1="0.131707"
+       x2="0.50400001"
+       y2="0.94634098"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient150"
+       x1="-0.30509499"
+       y1="0.099496603"
+       x2="0.156323"
+       y2="0.94191301"
+       gradientUnits="objectBoundingBox"
+       gradientTransform="matrix(-0.928523,0.283938,0.435332,0.943857,-1.91327e-7,5.49908e-8)" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient151"
+       x1="0.433979"
+       y1="0.022184599"
+       x2="0.487055"
+       y2="1.02569"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient153"
+       id="linearGradient152"
+       x1="0.5"
+       y1="0.89842999"
+       x2="0.5"
+       y2="0.40625"
+       gradientUnits="objectBoundingBox"
+       spreadMethod="reflect" />
+    <linearGradient
+       xlink:href="#linearGradient153"
+       id="linearGradient156"
+       x1="0.43568701"
+       y1="0.98882002"
+       x2="0.453989"
+       y2="0.23093501"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient153"
+       id="linearGradient157"
+       x1="0.49180499"
+       y1="1.15284"
+       x2="0.49482101"
+       y2="0.41252401"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient153"
+       id="linearGradient158"
+       x1="0.51730198"
+       y1="0.85418499"
+       x2="0.49843901"
+       y2="0.136172"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient153"
+       id="linearGradient159"
+       x1="0.46201"
+       y1="0.87917101"
+       x2="0.49215299"
+       y2="0.096282303"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient162"
+       id="linearGradient161"
+       x1="0.50086302"
+       y1="0.34872901"
+       x2="0.41209599"
+       y2="0.98558098"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient162"
+       id="linearGradient165"
+       x1="0.60399801"
+       y1="0.51020199"
+       x2="0.46399999"
+       y2="0.98367399"
+       gradientUnits="objectBoundingBox" />
+    <linearGradient
+       xlink:href="#linearGradient162"
+       id="linearGradient166"
+       x1="0.50000501"
+       y1="0.191616"
+       x2="0.50800002"
+       y2="0.97005898"
+       gradientUnits="objectBoundingBox" />
+    <radialGradient
+       xlink:href="#linearGradient172"
+       id="radialGradient171"
+       cx="0.5"
+       cy="0.5"
+       fx="0.5"
+       fy="0.5"
+       r="0.5"
+       gradientUnits="objectBoundingBox" />
+    <radialGradient
+       xlink:href="#linearGradient172"
+       id="radialGradient176" />
+    <linearGradient
+       xlink:href="#linearGradient153"
+       id="linearGradient178"
+       x1="0.94027299"
+       y1="1.2934099"
+       x2="0.19452"
+       y2="-0.675295"
+       gradientUnits="objectBoundingBox" />
+    <radialGradient
+       xlink:href="#linearGradient172"
+       id="radialGradient1399"
+       gradientTransform="scale(1.045233,0.956725)"
+       cx="446.77762"
+       cy="1219.4125"
+       fx="446.77762"
+       fy="1219.4125"
+       r="195.07191"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       xlink:href="#linearGradient153"
+       id="linearGradient1401"
+       gradientUnits="userSpaceOnUse"
+       x1="400.57785"
+       y1="369.53015"
+       x2="400.84448"
+       y2="304.07886"
+       gradientTransform="scale(0.575262,1.738339)" />
+    <linearGradient
+       xlink:href="#linearGradient138"
+       id="linearGradient1403"
+       gradientUnits="userSpaceOnUse"
+       x1="303.01761"
+       y1="237.93179"
+       x2="297.0856"
+       y2="330.09561"
+       gradientTransform="scale(1.116071,0.896001)" />
+    <linearGradient
+       xlink:href="#linearGradient153"
+       id="linearGradient1405"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.816497,1.224744)"
+       x1="378.93771"
+       y1="278.60202"
+       x2="380.27319"
+       y2="243.91606" />
+    <linearGradient
+       xlink:href="#linearGradient153"
+       id="linearGradient1407"
+       gradientUnits="userSpaceOnUse"
+       x1="381.38742"
+       y1="277.495"
+       x2="380.5517"
+       y2="245.68338"
+       gradientTransform="scale(0.816497,1.224744)" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient1409"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.816497,1.224744)"
+       x1="379.09573"
+       y1="240.92712"
+       x2="376.79556"
+       y2="281.01636" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient1411"
+       gradientUnits="userSpaceOnUse"
+       x1="389.63535"
+       y1="242.28218"
+       x2="387.06866"
+       y2="281.32513"
+       gradientTransform="scale(0.816497,1.224744)" />
+    <linearGradient
+       xlink:href="#linearGradient153"
+       id="linearGradient1413"
+       gradientUnits="userSpaceOnUse"
+       spreadMethod="reflect"
+       x1="437.57941"
+       y1="528.87177"
+       x2="437.57941"
+       y2="394.10361"
+       gradientTransform="scale(0.812855,1.230232)" />
+    <linearGradient
+       xlink:href="#linearGradient153"
+       id="linearGradient1415"
+       gradientUnits="userSpaceOnUse"
+       x1="375.17325"
+       y1="419.78485"
+       x2="377.48541"
+       y2="324.03815"
+       gradientTransform="scale(0.649784,1.538974)" />
+    <linearGradient
+       xlink:href="#linearGradient138"
+       id="linearGradient1417"
+       gradientUnits="userSpaceOnUse"
+       x1="320.75104"
+       y1="498.17776"
+       x2="321.32224"
+       y2="614.50439"
+       gradientTransform="scale(1.074798,0.930408)" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient1419"
+       gradientUnits="userSpaceOnUse"
+       x1="322.48257"
+       y1="435.26761"
+       x2="323.2514"
+       y2="488.48251"
+       gradientTransform="scale(1.077001,0.928504)" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient1421"
+       gradientUnits="userSpaceOnUse"
+       x1="411.2215"
+       y1="242.94365"
+       x2="411.2215"
+       y2="331.44858"
+       gradientTransform="scale(0.571707,1.749147)" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient1423"
+       gradientUnits="userSpaceOnUse"
+       x1="867.34546"
+       y1="234.73897"
+       x2="867.33453"
+       y2="314.83911"
+       gradientTransform="scale(0.572667,1.746214)" />
+    <linearGradient
+       xlink:href="#linearGradient162"
+       id="linearGradient1425"
+       gradientUnits="userSpaceOnUse"
+       x1="236.25362"
+       y1="657.11133"
+       x2="212.5099"
+       y2="737.41229"
+       gradientTransform="scale(1.011514,0.988617)" />
+    <linearGradient
+       xlink:href="#linearGradient153"
+       id="linearGradient1427"
+       gradientUnits="userSpaceOnUse"
+       x1="381.56607"
+       y1="655.73102"
+       x2="279.64313"
+       y2="386.66583"
+       gradientTransform="scale(1.065499,0.938527)" />
+    <linearGradient
+       xlink:href="#linearGradient162"
+       id="linearGradient1429"
+       gradientUnits="userSpaceOnUse"
+       x1="218.11714"
+       y1="630.30475"
+       x2="203.12654"
+       y2="737.8537"
+       gradientTransform="scale(1.009851,0.990245)" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient1431"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.007724,0.992335)"
+       x1="117.88966"
+       y1="587.23602"
+       x2="182.24524"
+       y2="704.73077" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient1433"
+       gradientUnits="userSpaceOnUse"
+       x1="223.10072"
+       y1="570.41809"
+       x2="230.53499"
+       y2="710.97723"
+       gradientTransform="scale(0.999504,1.000496)" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient1435"
+       gradientUnits="userSpaceOnUse"
+       x1="316.93988"
+       y1="474.01779"
+       x2="371.60889"
+       y2="582.63507"
+       gradientTransform="scale(1.065499,0.938527)" />
+    <linearGradient
+       xlink:href="#linearGradient162"
+       id="linearGradient1437"
+       gradientUnits="userSpaceOnUse"
+       x1="284.68652"
+       y1="410.46326"
+       x2="285.45923"
+       y2="485.69934"
+       gradientTransform="scale(1.218684,0.820557)" />
+    <linearGradient
+       xlink:href="#linearGradient167"
+       id="linearGradient1439"
+       gradientUnits="userSpaceOnUse"
+       x1="288.82358"
+       y1="398.85422"
+       x2="288.37628"
+       y2="482.55939"
+       gradientTransform="scale(1.221941,0.81837)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient172"
+       id="radialGradient5844"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.045233,0.956725)"
+       cx="446.77762"
+       cy="1219.4125"
+       fx="446.77762"
+       fy="1219.4125"
+       r="195.07191" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient5846"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.575262,1.738339)"
+       x1="400.57785"
+       y1="369.53015"
+       x2="400.84448"
+       y2="304.07886" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient138"
+       id="linearGradient5848"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.116071,0.896001)"
+       x1="303.01761"
+       y1="237.93179"
+       x2="297.0856"
+       y2="330.09561" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient5850"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.816497,1.224744)"
+       x1="378.93771"
+       y1="278.60202"
+       x2="380.27319"
+       y2="243.91606" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient5852"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.816497,1.224744)"
+       x1="381.38742"
+       y1="277.495"
+       x2="380.5517"
+       y2="245.68338" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5854"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.816497,1.224744)"
+       x1="379.09573"
+       y1="240.92712"
+       x2="376.79556"
+       y2="281.01636" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5856"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.816497,1.224744)"
+       x1="389.63535"
+       y1="242.28218"
+       x2="387.06866"
+       y2="281.32513" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient5858"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.812855,1.230232)"
+       spreadMethod="reflect"
+       x1="437.57941"
+       y1="528.87177"
+       x2="437.57941"
+       y2="394.10361" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient5860"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.649784,1.538974)"
+       x1="375.17325"
+       y1="419.78485"
+       x2="377.48541"
+       y2="324.03815" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient138"
+       id="linearGradient5862"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.074798,0.930408)"
+       x1="320.75104"
+       y1="498.17776"
+       x2="321.32224"
+       y2="614.50439" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5864"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.077001,0.928504)"
+       x1="322.48257"
+       y1="435.26761"
+       x2="323.2514"
+       y2="488.48251" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5866"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.571707,1.749147)"
+       x1="411.2215"
+       y1="242.94365"
+       x2="411.2215"
+       y2="331.44858" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5868"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.572667,1.746214)"
+       x1="867.34546"
+       y1="234.73897"
+       x2="867.33453"
+       y2="314.83911" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient162"
+       id="linearGradient5870"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.011514,0.988617)"
+       x1="236.25362"
+       y1="657.11133"
+       x2="212.5099"
+       y2="737.41229" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient5872"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.065499,0.938527)"
+       x1="381.56607"
+       y1="655.73102"
+       x2="279.64313"
+       y2="386.66583" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient162"
+       id="linearGradient5874"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.009851,0.990245)"
+       x1="218.11714"
+       y1="630.30475"
+       x2="203.12654"
+       y2="737.8537" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5876"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.007724,0.992335)"
+       x1="117.88966"
+       y1="587.23602"
+       x2="182.24524"
+       y2="704.73077" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5878"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.999504,1.000496)"
+       x1="223.10072"
+       y1="570.41809"
+       x2="230.53499"
+       y2="710.97723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5880"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.065499,0.938527)"
+       x1="316.93988"
+       y1="474.01779"
+       x2="371.60889"
+       y2="582.63507" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient162"
+       id="linearGradient5882"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.218684,0.820557)"
+       x1="284.68652"
+       y1="410.46326"
+       x2="285.45923"
+       y2="485.69934" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5884"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.221941,0.81837)"
+       x1="288.82358"
+       y1="398.85422"
+       x2="288.37628"
+       y2="482.55939" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5936"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(6.8689234e-2,-0.4008691,0.3415516,4.336381e-2,-313.66484,483.36861)"
+       x1="316.93988"
+       y1="474.01779"
+       x2="371.60889"
+       y2="582.63507" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient5949"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.6373879,0.286176,-0.2248927,0.5792711,-190.14391,-154.55792)"
+       x1="381.56607"
+       y1="655.73102"
+       x2="279.64313"
+       y2="386.66583" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient5992"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9649387,-1.2915552e-2,-3.6719978e-2,2.5569228,169.00168,-594.11178)"
+       x1="400.57785"
+       y1="369.53015"
+       x2="400.84448"
+       y2="304.07886" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient6820"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1593287,2.2594958e-2,6.8898041e-2,-0.4858355,313.34561,293.76431)"
+       x1="867.34546"
+       y1="234.73897"
+       x2="867.33453"
+       y2="314.83911" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient6824"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.184254,-0.3061768,0.2434767,-0.1724949,439.82488,377.41134)"
+       x1="294.40485"
+       y1="481.32233"
+       x2="371.60889"
+       y2="582.63507" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient2514"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(7.6104436e-3,-0.1875898,0.5720113,2.3206217e-2,1167.6399,-164.81318)"
+       x1="892.69696"
+       y1="258.28925"
+       x2="564.89618"
+       y2="281.90463" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient2517"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2316272,0.2342907,0.7144146,-0.7062927,960.97808,-166.19015)"
+       x1="867.34546"
+       y1="234.73897"
+       x2="867.33453"
+       y2="314.83911" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient2520"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7672384,0,0,0.4874752,936.37068,-466.38275)"
+       x1="288.82358"
+       y1="398.85422"
+       x2="288.37628"
+       y2="482.55939" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient162"
+       id="linearGradient2524"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.523355,0,0,1.0256962,729.45868,-685.70504)"
+       x1="284.68652"
+       y1="410.46326"
+       x2="285.45923"
+       y2="485.69934" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient2527"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0038119,-5.2260066e-2,-1.740863e-2,1.0462687,788.19568,-546.66535)"
+       x1="223.10072"
+       y1="570.41809"
+       x2="230.53499"
+       y2="710.97723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient2530"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9523959,0.3464001,0.4208255,0.9487298,1258.3327,-582.54204)"
+       x1="117.88966"
+       y1="587.23602"
+       x2="182.24524"
+       y2="704.73077" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient162"
+       id="linearGradient2533"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.1800109,0.4273134,0.4706466,1.1534176,1272.3477,-732.02104)"
+       x1="218.11714"
+       y1="630.30475"
+       x2="203.12654"
+       y2="737.8537" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient162"
+       id="linearGradient2536"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2643925,0,0,1.2357712,729.45868,-685.70504)"
+       x1="236.25362"
+       y1="657.11133"
+       x2="212.5099"
+       y2="737.41229" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6810"
+       id="linearGradient2539"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.599201,7.9485483e-2,-0.2318863,1.9097465,860.80461,-630.61189)"
+       x1="855.06372"
+       y1="238.8383"
+       x2="871.15576"
+       y2="315.45914" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient2545"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2781848,0,0,0.990788,754.62768,-618.27804)"
+       x1="322.48257"
+       y1="435.26761"
+       x2="323.2514"
+       y2="488.48251" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient138"
+       id="linearGradient2548"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3994837,0,0,1.1399824,714.04668,-671.75704)"
+       x1="320.75104"
+       y1="498.17776"
+       x2="321.32224"
+       y2="614.50439" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient2555"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0160687,0,0,1.53779,729.45868,-686.43004)"
+       spreadMethod="reflect"
+       x1="437.57941"
+       y1="528.87177"
+       x2="437.57941"
+       y2="394.10361" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient2558"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2914159,-3.3330306e-2,5.0610341e-2,0.4881144,1003.9662,-404.72726)"
+       x1="389.63535"
+       y1="242.28218"
+       x2="387.06866"
+       y2="281.32513" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient2561"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.3921823,-2.9764582e-2,-5.7310058e-2,0.5824956,1376.4784,-428.91032)"
+       x1="379.09573"
+       y1="240.92712"
+       x2="376.79556"
+       y2="281.01636" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient2566"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.4785291,4.0425338e-2,3.8864067e-2,1.9024316,1751.4647,-802.97704)"
+       x1="381.38742"
+       y1="277.495"
+       x2="380.5517"
+       y2="245.68338" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient2569"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0650795,-6.1672141e-2,9.4458503e-2,1.6443046,688.76168,-695.81704)"
+       x1="378.93771"
+       y1="278.60202"
+       x2="380.27319"
+       y2="243.91606" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient138"
+       id="linearGradient2572"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.4132361,-7.9650304e-2,-4.1197678e-2,1.0713842,746.14768,-643.96104)"
+       x1="303.01761"
+       y1="237.93179"
+       x2="297.0856"
+       y2="330.09561" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient172"
+       id="radialGradient2577"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.4818268,0,0,0.3967969,505.21028,-296.00604)"
+       cx="446.77762"
+       cy="1219.4125"
+       fx="446.77762"
+       fy="1219.4125"
+       r="195.07191" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient3353"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-7.6104436e-3,-0.1875898,-0.5720113,2.3206217e-2,1186.0942,-162.08752)"
+       x1="892.69696"
+       y1="258.28925"
+       x2="564.89618"
+       y2="281.90463" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient172"
+       id="radialGradient3411"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.4818268,0,0,0.3967969,-359.87341,176.94177)"
+       cx="446.77762"
+       cy="1219.4125"
+       fx="446.77762"
+       fy="1219.4125"
+       r="195.07191" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient138"
+       id="linearGradient3413"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.4132361,-7.9650304e-2,-4.1197678e-2,1.0713842,-118.936,-171.0132)"
+       x1="303.01761"
+       y1="237.93179"
+       x2="297.0856"
+       y2="330.09561" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient3415"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0650795,-6.1672141e-2,9.4458503e-2,1.6443046,-176.32201,-222.8692)"
+       x1="378.93771"
+       y1="278.60202"
+       x2="380.27319"
+       y2="243.91606" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient3417"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.4785291,4.0425338e-2,3.8864067e-2,1.9024316,886.38099,-330.0292)"
+       x1="381.38742"
+       y1="277.495"
+       x2="380.5517"
+       y2="245.68338" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient3419"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.3921823,-2.9764582e-2,-5.7310058e-2,0.5824956,511.39472,44.037525)"
+       x1="379.09573"
+       y1="240.92712"
+       x2="376.79556"
+       y2="281.01636" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient3421"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2914159,-3.3330306e-2,5.0610341e-2,0.4881144,138.88252,68.220525)"
+       x1="389.63535"
+       y1="242.28218"
+       x2="387.06866"
+       y2="281.32513" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient3423"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0160687,0,0,1.53779,-135.62501,-213.4822)"
+       spreadMethod="reflect"
+       x1="437.57941"
+       y1="528.87177"
+       x2="437.57941"
+       y2="394.10361" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient3425"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9027839,-7.2174108e-2,0.1573001,2.0039596,-212.66601,-211.1902)"
+       x1="375.17325"
+       y1="419.78485"
+       x2="377.48541"
+       y2="324.03815" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient138"
+       id="linearGradient3427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3994837,0,0,1.1399824,-151.03701,-198.8092)"
+       x1="320.75104"
+       y1="498.17776"
+       x2="321.32224"
+       y2="614.50439" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient3429"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2781848,0,0,0.990788,-110.456,-145.33018)"
+       x1="322.48257"
+       y1="435.26761"
+       x2="323.2514"
+       y2="488.48251" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient3431"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7146338,0,0,2.1864338,-135.62501,-212.7572)"
+       x1="411.2215"
+       y1="242.94365"
+       x2="411.2215"
+       y2="331.44858" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6810"
+       id="linearGradient3433"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.599201,7.9485483e-2,-0.2318863,1.9097465,10.90312,-180.4374)"
+       x1="855.06372"
+       y1="238.8383"
+       x2="871.15576"
+       y2="315.45914" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient162"
+       id="linearGradient3435"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2643925,0,0,1.2357712,-135.62501,-212.7572)"
+       x1="236.25362"
+       y1="657.11133"
+       x2="212.5099"
+       y2="737.41229" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient162"
+       id="linearGradient3437"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.1800109,0.4273134,0.4706466,1.1534176,407.26399,-259.0732)"
+       x1="218.11714"
+       y1="630.30475"
+       x2="203.12654"
+       y2="737.8537" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient3439"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9523959,0.3464001,0.4208255,0.9487298,393.24899,-109.59418)"
+       x1="117.88966"
+       y1="587.23602"
+       x2="182.24524"
+       y2="704.73077" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient3441"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0038119,-5.2260066e-2,-1.740863e-2,1.0462687,-76.888003,-73.717475)"
+       x1="223.10072"
+       y1="570.41809"
+       x2="230.53499"
+       y2="710.97723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient162"
+       id="linearGradient3443"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.523355,0,0,1.0256962,-135.62501,-212.7572)"
+       x1="284.68652"
+       y1="410.46326"
+       x2="285.45923"
+       y2="485.69934" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient3445"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7672384,0,0,0.4874752,71.286992,6.5651249)"
+       x1="288.82358"
+       y1="398.85422"
+       x2="288.37628"
+       y2="482.55939" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient3447"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2316272,0.2342907,0.7144146,-0.7062927,95.894394,306.75766)"
+       x1="867.34546"
+       y1="234.73897"
+       x2="867.33453"
+       y2="314.83911" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient3449"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(7.6104436e-3,-0.1875898,0.5720113,2.3206217e-2,302.55621,308.13463)"
+       x1="892.69696"
+       y1="258.28925"
+       x2="564.89618"
+       y2="281.90463" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient3455"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.1449278,0.2958704,-0.9021871,-0.4419231,1401.2488,-283.33537)"
+       x1="867.34546"
+       y1="234.73897"
+       x2="867.33453"
+       y2="314.83911" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6810"
+       id="linearGradient3459"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.6037841,2.836597e-2,6.9037787e-2,1.9225339,1538.2922,-593.33926)"
+       x1="855.06372"
+       y1="238.8383"
+       x2="871.15576"
+       y2="315.45914" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5957"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(7.6104436e-3,-0.1875898,0.5720113,2.3206217e-2,313.36793,291.43423)"
+       x1="892.69696"
+       y1="258.28925"
+       x2="564.89618"
+       y2="281.90463" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5960"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2316272,0.2342907,0.7144146,-0.7062927,95.894394,306.75766)"
+       x1="867.34546"
+       y1="234.73897"
+       x2="867.33453"
+       y2="314.83911" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5963"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7672384,0,0,0.4874752,71.286992,6.5651249)"
+       x1="288.82358"
+       y1="398.85422"
+       x2="288.37628"
+       y2="482.55939" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient162"
+       id="linearGradient5967"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.523355,0,0,1.0256962,-135.62501,-212.7572)"
+       x1="284.68652"
+       y1="410.46326"
+       x2="285.45923"
+       y2="485.69934" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5970"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0038119,-5.2260066e-2,-1.740863e-2,1.0462687,-76.888003,-73.717475)"
+       x1="223.10072"
+       y1="570.41809"
+       x2="230.53499"
+       y2="710.97723" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5973"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.9523959,0.3464001,0.4208255,0.9487298,393.24899,-109.59418)"
+       x1="117.88966"
+       y1="587.23602"
+       x2="182.24524"
+       y2="704.73077" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient162"
+       id="linearGradient5976"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.1800109,0.4273134,0.4706466,1.1534176,407.26399,-259.0732)"
+       x1="218.11714"
+       y1="630.30475"
+       x2="203.12654"
+       y2="737.8537" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient162"
+       id="linearGradient5979"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2643925,0,0,1.2357712,-135.62501,-212.7572)"
+       x1="236.25362"
+       y1="657.11133"
+       x2="212.5099"
+       y2="737.41229" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6810"
+       id="linearGradient5982"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.599201,7.9485483e-2,-0.2318863,1.9097465,10.90312,-180.4374)"
+       x1="855.06372"
+       y1="238.8383"
+       x2="871.15576"
+       y2="315.45914" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5985"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.7146338,0,0,2.1864338,-135.62501,-212.7572)"
+       x1="411.2215"
+       y1="242.94365"
+       x2="411.2215"
+       y2="331.44858" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient5988"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.2781848,0,0,0.990788,-110.456,-145.33018)"
+       x1="322.48257"
+       y1="435.26761"
+       x2="323.2514"
+       y2="488.48251" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient138"
+       id="linearGradient5991"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3994837,0,0,1.1399824,-151.03701,-198.8092)"
+       x1="320.75104"
+       y1="498.17776"
+       x2="321.32224"
+       y2="614.50439" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient5995"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9027839,-7.2174108e-2,0.1573001,2.0039596,-212.66601,-211.1902)"
+       x1="375.17325"
+       y1="419.78485"
+       x2="377.48541"
+       y2="324.03815" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient5998"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0160687,0,0,1.53779,-135.62501,-213.4822)"
+       spreadMethod="reflect"
+       x1="437.57941"
+       y1="528.87177"
+       x2="437.57941"
+       y2="394.10361" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient6001"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2914159,-3.3330306e-2,5.0610341e-2,0.4881144,138.88252,68.220525)"
+       x1="389.63535"
+       y1="242.28218"
+       x2="387.06866"
+       y2="281.32513" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient167"
+       id="linearGradient6004"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.3921823,-2.9764582e-2,-5.7310058e-2,0.5824956,511.39472,44.037525)"
+       x1="379.09573"
+       y1="240.92712"
+       x2="376.79556"
+       y2="281.01636" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient6009"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1.4785291,4.0425338e-2,3.8864067e-2,1.9024316,886.38099,-330.0292)"
+       x1="381.38742"
+       y1="277.495"
+       x2="380.5517"
+       y2="245.68338" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient153"
+       id="linearGradient6012"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0650795,-6.1672141e-2,9.4458503e-2,1.6443046,-176.32201,-222.8692)"
+       x1="378.93771"
+       y1="278.60202"
+       x2="380.27319"
+       y2="243.91606" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient138"
+       id="linearGradient6015"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.4132361,-7.9650304e-2,-4.1197678e-2,1.0713842,-118.936,-171.0132)"
+       x1="303.01761"
+       y1="237.93179"
+       x2="297.0856"
+       y2="330.09561" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient172"
+       id="radialGradient6020"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.4818268,0,0,0.3967969,-359.87341,176.94177)"
+       cx="446.77762"
+       cy="1219.4125"
+       fx="446.77762"
+       fy="1219.4125"
+       r="195.07191" />
+  </defs>
+  <g
+     id="g6022">
+    <path
+       d="M 591.23603,660.80083 C 591.23603,703.54984 461.81827,738.20477 302.17337,738.20477 C 142.52846,738.20477 13.110708,703.54984 13.110708,660.80083 C 13.110708,618.05182 142.52846,583.39691 302.17337,583.39691 C 461.81827,583.39691 591.23603,618.05182 591.23603,660.80083 z"
+       id="path3355"
+       style="fill:url(#radialGradient6020);stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter" />
+    <path
+       sodipodi:nodetypes="ccccccccc"
+       id="path3357"
+       d="M 143.90874,577.54277 C 115.92374,537.26402 110.46624,406.31277 175.76749,325.75527 C 208.12499,287.10777 216.37999,260.17402 218.93124,224.01402 C 220.66749,182.79027 189.77499,59.711525 306.28499,50.334025 C 424.29249,40.919025 417.95499,157.40902 417.27624,219.05277 C 416.71249,271.10277 419.0565,276.31252 445.584,316.88002 C 494.68275,391.41752 526.96749,544.04652 472.77249,613.51152 C 404.12624,700.47152 345.33124,662.75902 306.28499,665.92402 C 233.16874,669.92652 230.75124,708.91277 143.90874,577.54277 z"
+       style="fill:#000000;stroke:none;stroke-width:1.25" />
+    <path
+       sodipodi:nodetypes="cssccc"
+       id="path3359"
+       d="M 437.66398,210.61794 C 450.11848,228.11403 483.19457,249.41586 502.10694,275.91451 C 521.01932,302.41316 477.73746,333.2079 443.1675,314.23928 C 417.44041,300.12277 444.25181,384.39183 467.34598,377.01641 C 614.65479,312.95238 492.4139,250.78608 485.61266,191.90909 C 540.40451,67.355773 400.47822,152.79209 437.66398,210.61794 z"
+       style="fill:#000000;stroke:#000000;stroke-width:1.5625006" />
+    <path
+       d="M 375.15201,109.16012 C 373.96198,140.10802 339.90409,167.06128 299.08159,169.36204 C 258.25909,171.66281 226.13061,148.43982 227.32064,117.49192 C 228.51067,86.544125 262.56856,59.590825 303.39106,57.290125 C 344.21356,54.989325 376.34204,78.212325 375.15201,109.16012 z"
+       id="path3361"
+       style="fill:url(#linearGradient6015);stroke:none;stroke-width:1.26498997" />
+    <path
+       d="M 277.39315,182.77455 C 278.54881,202.89182 268.92216,219.81175 255.89144,220.56628 C 242.86071,221.3208 231.36038,205.62421 230.20473,185.50694 C 229.04907,165.38967 238.67572,148.46972 251.70644,147.71522 C 264.73717,146.96072 276.2375,162.65728 277.39315,182.77455 z"
+       id="path3363"
+       style="fill:url(#linearGradient6012);stroke:none;stroke-width:1.17873001" />
+    <path
+       d="M 301.04358,184.3151 C 301.51907,207.59043 316.56861,226.05786 334.65769,225.56328 C 352.74677,225.06869 367.02541,205.79938 366.54992,182.52405 C 366.07444,159.24872 351.02489,140.78132 332.93581,141.27592 C 314.84674,141.77042 300.5681,161.03977 301.04358,184.3151 z"
+       id="path3365"
+       style="fill:url(#linearGradient6009);stroke:none;stroke-width:0.93138498" />
+    <path
+       d="M 331.21231,191.85453 C 330.93912,204.63094 337.38392,215.00253 345.60719,215.02013 C 353.83046,215.03772 360.7182,204.69466 360.99139,191.91824 C 361.26458,179.14182 354.81978,168.77023 346.59651,168.75264 C 338.37324,168.73505 331.4855,179.07811 331.21231,191.85453 z"
+       id="path3367"
+       style="fill:#000000;stroke:none;stroke-width:1.86495996" />
+    <path
+       d="M 273.01381,188.19365 C 274.04499,198.77003 270.0676,207.92934 264.13008,208.65153 C 258.19256,209.37373 252.54331,201.38533 251.51214,190.80895 C 250.48097,180.23257 254.45835,171.07326 260.39587,170.35107 C 266.33339,169.62887 271.98264,177.61727 273.01381,188.19365 z"
+       id="path3369"
+       style="fill:#000000;stroke:none;stroke-width:2.39814997" />
+    <path
+       d="M 338.4302,184.54815 C 337.72904,191.6747 341.05031,197.74711 345.84847,198.11127 C 350.64663,198.47542 355.10471,192.99342 355.80587,185.86687 C 356.50703,178.74032 353.18576,172.6679 348.3876,172.30374 C 343.58944,171.93959 339.13136,177.42159 338.4302,184.54815 z"
+       id="path3371"
+       style="fill:url(#linearGradient6004);stroke:none;stroke-width:3.1916101" />
+    <path
+       d="M 269.50703,182.58574 C 270.12623,188.55758 267.73791,193.72929 264.17258,194.13707 C 260.60725,194.54485 257.21502,190.03429 256.59583,184.06244 C 255.97663,178.0906 258.36495,172.91889 261.93028,172.51111 C 265.49561,172.10333 268.88784,176.6139 269.50703,182.58574 z"
+       id="path3373"
+       style="fill:url(#linearGradient6001);stroke:none;stroke-width:4.12025976" />
+    <path
+       id="path3375"
+       d="M 187.75249,405.79902 C 203.79749,369.42027 237.89499,305.51652 238.62124,256.10152 C 238.62124,216.79902 356.34499,207.41277 365.79249,246.65402 C 375.23999,285.89527 399.21874,344.75777 414.47999,373.09902 C 429.73999,401.43902 474.24124,491.46777 426.83499,570.03152 C 384.13874,639.58652 254.67874,694.61402 185.57249,560.58527 C 162.31874,514.07652 166.46624,456.44152 187.75249,405.79902 z"
+       style="fill:url(#linearGradient5998);stroke:none;stroke-width:1.25" />
+    <path
+       id="path3377"
+       d="M 173.24559,378.8028 C 159.53586,404.75152 131.00745,472.99595 200.53857,510.33418 C 275.38701,549.97538 275.02711,631.56055 185.18731,592.7418 C 103.05444,557.65452 139.36496,415.87304 162.33593,381.94969 C 177.39745,358.18988 199.98644,329.10722 173.24559,378.8028 z"
+       style="fill:url(#linearGradient5995);stroke:none;stroke-width:1.15804005" />
+    <path
+       id="path3379"
+       d="M 185.01624,349.39277 C 163.18499,385.02777 110.79499,469.15902 180.90624,512.79652 C 275.36749,570.74027 248.62249,628.68527 162.40749,576.51402 C 41.021247,503.68402 147.62624,356.99402 196.32124,301.09152 C 251.87624,238.34152 207.01374,312.45027 185.01624,349.39277 z"
+       style="fill:#000000;stroke:#000000;stroke-width:1.5625" />
+    <path
+       id="path3381"
+       d="M 397.76919,419.60753 C 397.76919,459.32033 359.65441,510.90826 294.21657,510.44511 C 226.73185,511.0026 197.92832,459.32033 197.92832,419.60753 C 197.92832,379.89472 242.69287,347.66452 297.8494,347.66452 C 353.00463,347.66452 397.76919,379.89472 397.76919,419.60753 z"
+       style="font-size:12px;fill:url(#linearGradient5991);stroke:none;stroke-width:1.23705006;stroke-dasharray:none" />
+    <path
+       id="path3383"
+       d="M 362.15979,294.61832 C 361.43347,335.77773 334.64977,345.48709 300.75476,345.48709 C 266.85857,345.48709 242.25502,339.41113 239.34854,294.61832 C 239.34854,266.53917 266.85857,250.28968 300.75476,250.28968 C 334.64977,250.28968 362.15979,266.53917 362.15979,294.61832 z"
+       style="font-size:12px;fill:url(#linearGradient5988);stroke:none;stroke-width:1.38846004;stroke-dasharray:none" />
+    <path
+       id="path3385"
+       d="M 157.23124,357.83652 C 179.37624,324.09152 225.99999,272.38152 165.95249,365.10277 C 117.26374,441.40652 147.94874,490.44402 163.77249,503.90152 C 209.43124,544.60402 207.47999,571.83777 171.76624,550.40902 C 94.734994,504.62652 110.72249,427.59902 157.23124,357.83652 z"
+       style="fill:url(#linearGradient5985);stroke:none;stroke-width:1.25" />
+    <path
+       id="path3387"
+       d="M 462.21568,398.96909 C 450.39659,362.17304 409.96999,267.68577 467.11982,378.94676 C 519.1881,479.53006 466.98563,537.85433 458.30537,543.16377 C 449.62629,548.47226 421.31707,557.63765 431.92723,536.4342 C 442.53632,515.23062 487.08834,478.21682 462.21568,398.96909 z"
+       style="fill:url(#linearGradient5982);fill-opacity:1;stroke:none;stroke-width:1.25" />
+    <path
+       id="path3389"
+       d="M 140.51874,683.39402 C 89.966244,656.62402 16.453747,688.54902 43.141247,615.81152 C 48.486247,599.26402 35.172497,574.55152 43.867497,558.40402 C 54.041247,538.78152 75.842494,543.14277 88.923744,530.06152 C 101.82124,516.44777 109.99749,493.00027 133.97874,496.63402 C 157.95874,500.26777 173.90999,529.71027 190.65874,565.67027 C 203.01249,591.46777 246.83499,627.75027 243.97124,656.61777 C 240.60124,700.99277 190.18749,709.35527 140.51874,683.39402 z"
+       style="fill:url(#linearGradient5979);stroke:#e68c3f;stroke-width:7.8125" />
+    <path
+       id="path3391"
+       d="M 491.31808,670.91489 C 528.39675,625.95042 610.70818,635.17384 555.19701,573.52225 C 543.452,560.30492 546.95774,531.65049 532.68995,519.54726 C 515.71854,504.70652 496.99731,516.87766 479.79512,509.11645 C 462.56223,500.79684 444.55058,484.62292 423.51456,496.12697 C 402.4797,507.6306 400.21642,537.55836 398.23263,576.73647 C 396.49323,604.95714 370.77728,652.14775 384.4305,678.07775 C 404.45332,718.28664 455.96509,712.96302 491.31808,670.91489 z"
+       style="fill:url(#linearGradient5976);stroke:#e68c3f;stroke-width:7.81249762" />
+    <path
+       id="path3393"
+       d="M 475.19239,610.80964 C 532.58685,526.08884 489.81056,526.70588 475.48217,520.29802 C 461.11206,513.43236 445.8707,500.12629 428.97182,509.5003 C 412.07389,518.87396 411.10688,543.40025 410.64335,575.50997 C 410.05505,598.63832 390.69247,637.08007 402.33826,658.54446 C 416.30733,683.56395 450.20934,647.22527 475.19239,610.80964 z"
+       style="fill:url(#linearGradient5973);stroke:none;stroke-width:1.52532005" />
+    <path
+       id="path3395"
+       d="M 128.7701,623.00924 C 42.866706,567.39983 83.051524,548.52024 96.092064,539.78558 C 111.73042,528.58358 111.85185,506.75151 131.06896,508.78839 C 150.28506,510.82534 161.47212,534.4833 174.42831,563.86686 C 183.9948,584.9323 216.82272,612.77142 214.47562,637.07862 C 211.37663,665.56569 165.98235,646.7897 128.7701,623.00924 z"
+       style="fill:url(#linearGradient5970);stroke:none;stroke-width:1.52532005" />
+    <path
+       id="path3397"
+       d="M 251.81749,210.65402 C 260.75124,202.19152 282.83124,176.82152 324.26874,203.46027 C 331.97124,208.47277 338.22124,208.93152 353.04499,215.27902 C 382.70249,227.46527 368.52249,256.85277 337.11499,266.66402 C 323.66749,271.02527 311.44499,287.35902 286.95374,285.96277 C 266.03624,284.74152 260.55499,271.12027 247.70624,263.58027 C 224.86999,250.69152 221.49999,233.26277 233.83124,224.01402 C 246.16374,214.76527 250.98749,211.44027 251.81749,210.65402 z"
+       style="fill:url(#linearGradient5967);stroke:#e68c3f;stroke-width:4.6875" />
+    <path
+       id="path3399"
+       d="M 353.43874,234.29902 C 341.08499,235.02527 314.19749,261.91277 285.85624,261.91277 C 257.51499,261.91277 240.80124,235.75152 236.44124,235.75152"
+       style="fill:none;stroke:#e68c3f;stroke-width:3.125" />
+    <path
+       id="path3401"
+       d="M 265.90246,208.33442 C 270.38995,204.30176 284.54499,193.23548 303.31687,204.56504 C 307.27192,206.80832 311.35631,209.24996 317.43047,212.58509 C 329.462,219.58298 323.50274,229.6676 309.08839,236.04837 C 302.54708,238.72589 291.76316,244.6349 283.55168,244.22151 C 274.42662,243.38281 268.52325,237.43151 262.47546,233.55551 C 251.38073,226.22703 252.05445,220.30969 257.20813,215.38293 C 261.10416,212.00015 265.48554,208.70909 265.90246,208.33442 z"
+       style="fill:url(#linearGradient5963);stroke:none" />
+    <path
+       sodipodi:nodetypes="ccscc"
+       id="path3403"
+       d="M 485.62558,318.40009 C 470.31375,326.6082 417.68681,322.14515 480.02902,326.05185 C 529.45102,323.13335 535.62952,273.72084 534.95116,268.27709 C 534.2728,262.83418 518.48464,252.49699 513.21723,263.8189 C 507.9494,275.14041 526.70967,304.0309 485.62558,318.40009 z"
+       style="fill:url(#linearGradient5960);stroke:none;stroke-width:1.25" />
+    <path
+       sodipodi:nodetypes="ccscc"
+       id="path3405"
+       d="M 473.26296,135.03602 C 463.66338,137.45706 448.44209,148.26182 466.22252,134.32762 C 494.98909,121.13922 505.82847,135.59547 486.85683,175.63681 C 482.71091,184.38715 460.74905,201.85561 454.18436,199.10941 C 500.29783,163.55611 496.08175,126.83432 473.26296,135.03602 z"
+       style="fill:url(#linearGradient5957);stroke:none;stroke-width:1.25" />
+  </g>
+</svg>
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/index.php b/htmltest/sites/all/libraries/tcpdf-version/examples/index.php
new file mode 100644
index 00000000..75125235
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/index.php
@@ -0,0 +1,115 @@
+<?php
+echo '<'.'?'.'xml version="1.0" encoding="UTF-8"'.'?'.'>';
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
+
+<head>
+<title>TCPDF Examples</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="description" content="TCPDF is a PHP class for generating PDF documents on the fly" />
+<meta name="author" content="Nicola Asuni" />
+<meta name="keywords" content="Examples, TCPDF, PDF, PHP class" />
+</head>
+
+<body>
+
+<h1>TCPDF Examples</h1>
+
+<h2>PDF</h2>
+
+<ol>
+<li>Simple PDF with default Header and Footer: [<a href="example_001.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Simple PDF without Header and Footer: [<a href="example_002.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Custom Header and Footer: [<a href="example_003.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Cell stretching: [<a href="example_004.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Multicell: [<a href="example_005.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>WriteHTML and RTL support: [<a href="example_006.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Independent columns with WriteHTMLCell: [<a href="example_007.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>External UTF-8 text file: [<a href="example_008.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Image: [<a href="example_009.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Multiple columns: [<a href="example_010.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Colored Tables: [<a href="example_011.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Graphic Functions: [<a href="example_012.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Graphic Transformations: [<a href="example_013.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Javascript and Forms: [<a href="example_014.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Bookmarks (Table of Content): [<a href="example_015.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Document Encryption: [<a href="example_016.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Independent columns with MultiCell: [<a href="example_017.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Persian and Arabic language on RTL document: [<a href="example_018.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Non unicode / Alternative config file: [<a href="example_019.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Multicell complex alignment: [<a href="example_020.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>writeHTML alignment: [<a href="example_021.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>CMYK colors: [<a href="example_022.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Page Groups: [<a href="example_023.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Object Visibility and Layers: [<a href="example_024.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Object Transparency: [<a href="example_025.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Text Rendering Modes and Text Clipping: [<a href="example_026.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>1D Barcodes: [<a href="example_027.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Multiple page formats: [<a href="example_028.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Set PDF viewer display preferences: [<a href="example_029.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Colour gradients: [<a href="example_030.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Pie Chart Graphic: [<a href="example_031.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>EPS/AI vectorial image: [<a href="example_032.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Mixed font types (TrueType Unicode, core, CID-0): [<a href="example_033.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Clipping masks: [<a href="example_034.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Line styles with cells and multicells: [<a href="example_035.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Text Annotations: [<a href="example_036.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Spot Colors: [<a href="example_037.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>NON-embedded CID-0 CJK font: [<a href="example_038.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>HTML Justification: [<a href="example_039.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Booklet (double-sided pages): [<a href="example_040.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>File attachment: [<a href="example_041.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Image with Alpha Channel Transparency: [<a href="example_042.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Disk caching: [<a href="example_043.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Move, Copy and Delete page: [<a href="example_044.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Table Of Content with Bookmarks: [<a href="example_045.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Text hyphenation: [<a href="example_046.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Transactions and UNDO: [<a href="example_047.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Table header and rowspan: [<a href="example_048.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>TCPDF methods in HTML: [<a href="example_049.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>2D Barcode (QR-Code, Datamatrix ECC200 and PDF417): [<a href="example_050.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Full page background: [<a href="example_051.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Digital Signature Certification: [<a href="example_052.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Javascript functions: [<a href="example_053.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>XHTML Form: [<a href="example_054.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Font Dump: [<a href="example_055.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Crop Marks and Registration Marks: [<a href="example_056.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Cell vertical alignments and borders: [<a href="example_057.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>SVG Image: [<a href="example_058.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Table Of Content with HTML templates: [<a href="example_059.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Advanced page settings: [<a href="example_060.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>XHTML + CSS: [<a href="example_061.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>XObject Templates: [<a href="example_062.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>Text stretching and spacing (tracking/kerning): [<a href="example_063.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>No-write page regions: [<a href="example_064.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+<li>PDF/A-1b (ISO 19005-1:2005) document: [<a href="example_065.php" title="PDF [new window]" target="_blank">PDF</a>]</li>
+</ol>
+
+<h2>Barcodes</h2>
+
+<ol>
+<li>1D barcode HTML format [<a href="barcodes/example_1d_html.php" title="1D barcode [HTML] [new window]" target="_blank">HTML</a>]</li>
+<li>1D barcode PNG format [<a href="barcodes/example_1d_png.php" title="1D barcode [PNG] [new window]" target="_blank">PNG</a>]</li>
+<li>1D barcode SVG format [<a href="barcodes/example_1d_svg.php" title="1D barcode [SVG] [new window]" target="_blank">SVG</a>]</li>
+<li>1D barcode SVG INLINE format [<a href="barcodes/example_1d_svgi.php" title="1D barcode [SVGI] [new window]" target="_blank">SVG INLINE</a>]</li>
+
+<li>2D datamatrix barcode HTML format [<a href="barcodes/example_2d_datamatrix_html.php" title="2D datamatrix barcode [HTML] [new window]" target="_blank">HTML</a>]</li>
+<li>2D datamatrix barcode PNG format [<a href="barcodes/example_2d_datamatrix_png.php" title="2D datamatrix barcode [PNG] [new window]" target="_blank">PNG</a>]</li>
+<li>2D datamatrix barcode SVG format [<a href="barcodes/example_2d_datamatrix_svg.php" title="2D datamatrix barcode [SVG] [new window]" target="_blank">SVG</a>]</li>
+<li>2D datamatrix barcode SVG INLINE format [<a href="barcodes/example_2d_datamatrix_svgi.php" title="2D datamatrix barcode [SVGI] [new window]" target="_blank">SVG INLINE</a>]</li>
+
+<li>2D pdf417 barcode HTML format [<a href="barcodes/example_2d_pdf417_html.php" title="2D pdf417 barcode [HTML] [new window]" target="_blank">HTML</a>]</li>
+<li>2D pdf417 barcode PNG format [<a href="barcodes/example_2d_pdf417_png.php" title="2D pdf417 barcode [PNG] [new window]" target="_blank">PNG</a>]</li>
+<li>2D pdf417 barcode SVG format [<a href="barcodes/example_2d_pdf417_svg.php" title="2D pdf417 barcode [SVG] [new window]" target="_blank">SVG</a>]</li>
+<li>2D pdf417 barcode SVG INLINE format [<a href="barcodes/example_2d_pdf417_svgi.php" title="2D pdf417 barcode [SVGI] [new window]" target="_blank">SVG INLINE</a>]</li>
+
+<li>2D qrcode barcode HTML format [<a href="barcodes/example_2d_qrcode_html.php" title="2D qrcode barcode [HTML] [new window]" target="_blank">HTML</a>]</li>
+<li>2D qrcode barcode PNG format [<a href="barcodes/example_2d_qrcode_png.php" title="2D qrcode barcode [PNG] [new window]" target="_blank">PNG</a>]</li>
+<li>2D qrcode barcode SVG format [<a href="barcodes/example_2d_qrcode_svg.php" title="2D qrcode barcode [SVG] [new window]" target="_blank">SVG</a>]</li>
+<li>2D qrcode barcode SVG INLINE format [<a href="barcodes/example_2d_qrcode_svgi.php" title="2D qrcode barcode [SVGI] [new window]" target="_blank">SVG INLINE</a>]</li>
+</ol>
+
+</body>
+</html>
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/afr.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/afr.php
new file mode 100644
index 00000000..367b7e87
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/afr.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : afr.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Afrikaans
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Afrikaans
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Afrikaans
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'af';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'bladsy';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ara.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ara.php
new file mode 100644
index 00000000..32acfb4b
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ara.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : ara.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Arabic
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Arabic
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Arabic
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'rtl';
+$l['a_meta_language'] = 'ar';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'صفحة';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/aze.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/aze.php
new file mode 100644
index 00000000..9d19281d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/aze.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : aze.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Azerbaijani
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Azerbaijani
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Azerbaijani
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'az';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'səhifə';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/bel.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/bel.php
new file mode 100644
index 00000000..cc33cac1
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/bel.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : bel.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Basque
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Basque
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Basque
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'be';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'старонкі';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/bra.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/bra.php
new file mode 100644
index 00000000..cb2e1b2f
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/bra.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : eng.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Brazilian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Brazilian
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Brazilian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'pt';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'página';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/bul.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/bul.php
new file mode 100644
index 00000000..3605977d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/bul.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : bul.php
+// Begin       : 2004-03-03
+// Last Update : 2013-05-13
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Bulgarian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Bulgarian
+ * @author Nicola Asuni
+ * @since 2012-03-22
+ */
+
+// Bulgarian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'bg';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'страница';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/cat.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/cat.php
new file mode 100644
index 00000000..29ea3d8c
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/cat.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : cat.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Catalan
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Catalan
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Catalan
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'ca';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'pàgina';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ces.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ces.php
new file mode 100644
index 00000000..1b86789d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ces.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : ces.php
+// Begin       : 2010-10-26
+// Last Update : 2010-11-22
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Czech
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Czech
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Czech
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'cs';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'stránka';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/chi.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/chi.php
new file mode 100644
index 00000000..131c7df1
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/chi.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : chi.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Chinese (Simplified)
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Chinese (Simplified)
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Chinese (Simplified)
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'cn';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = '页面';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/cym.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/cym.php
new file mode 100644
index 00000000..935cf9aa
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/cym.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : urd.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Welsh
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Welsh
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Welsh
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'cy';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'tudalen';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/dan.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/dan.php
new file mode 100644
index 00000000..a04af116
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/dan.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : dan.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Danish
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Danish
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Danish
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'da';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'side';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/eng.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/eng.php
new file mode 100644
index 00000000..97526108
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/eng.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : eng.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               English
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: English
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// English
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'en';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'page';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/est.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/est.php
new file mode 100644
index 00000000..c9d9472d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/est.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : est.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Estonian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Estonian
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Estonian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'et';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'lehekülg';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/eus.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/eus.php
new file mode 100644
index 00000000..63e86946
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/eus.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : eus.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Basque
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Basque
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Basque
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'eu';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'Orrialdearen';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/far.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/far.php
new file mode 100644
index 00000000..dc71cf7c
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/far.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : far.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Farsi
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Farsi
+ * @author Sina Saeedi
+ * @since 2011-04-12
+ */
+
+// Farsi
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'rtl';
+$l['a_meta_language'] = 'fa';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'صفحه';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/fra.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/fra.php
new file mode 100644
index 00000000..bf98f85d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/fra.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : fra.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               French
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: French
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// French
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'fr';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'page';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ger.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ger.php
new file mode 100644
index 00000000..dad6268b
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ger.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : ger.php
+// Begin       : 2004-03-03
+// Last Update : 2010-11-16
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               German
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: German
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// German
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'de';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'Seite';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/gle.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/gle.php
new file mode 100644
index 00000000..e8f40fed
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/gle.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : ind.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Irish
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Irish
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Irish
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'ga';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'leathanach';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/glg.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/glg.php
new file mode 100644
index 00000000..1d717142
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/glg.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : glg.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Galician
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Galician
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Galician
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'gl';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'Páxina';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/hat.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/hat.php
new file mode 100644
index 00000000..f6b27c3c
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/hat.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : hat.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Haitian Creole
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Haitian Creole
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Haitian Creole
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'ht';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'paj';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/heb.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/heb.php
new file mode 100644
index 00000000..33f12040
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/heb.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : heb.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Hebrew
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Hebrew
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Hebrew
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'rtl';
+$l['a_meta_language'] = 'he';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'מקור:';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/hrv.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/hrv.php
new file mode 100644
index 00000000..47fe5d45
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/hrv.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : hrv.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Croatian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Croatian
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Croatian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'hr';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'stranica';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/hun.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/hun.php
new file mode 100644
index 00000000..1053d699
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/hun.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : hun.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Hungarian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Hungarian
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Hungarian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'hu';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'oldal';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/hye.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/hye.php
new file mode 100644
index 00000000..fbade3e7
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/hye.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : hye.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Armenian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Armenian
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Armenian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'hy';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'էջ';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ind.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ind.php
new file mode 100644
index 00000000..9a16ee3d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ind.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : ind.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Indonesian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Indonesian
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Indonesian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'id';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'halaman';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ita.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ita.php
new file mode 100644
index 00000000..0d3f5f1a
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ita.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : ita.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Italian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Italian
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Italian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'it';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'pagina';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/jpn.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/jpn.php
new file mode 100644
index 00000000..dc6dfb66
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/jpn.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : jpn.php
+// Begin       : 2011-01-24
+// Last Update : 2011-01-24
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Japanese
+//
+// Author: Nicola Asuni - Translation by redcocker
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Japanese
+ * @author Nicola Asuni - Translation by redcocker
+ * @since 2012-01-24
+ */
+
+// Japanese
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'ja';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'ページ';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/kat.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/kat.php
new file mode 100644
index 00000000..168dc34c
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/kat.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : kat.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Georgian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Georgian
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Georgian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'ka';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'გვერდი';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/kor.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/kor.php
new file mode 100644
index 00000000..a817985c
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/kor.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : kor.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Korean
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Korean
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Korean
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'ko';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = '페이지';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/mkd.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/mkd.php
new file mode 100644
index 00000000..39ea8aef
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/mkd.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : mkd.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Macedonian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Macedonian
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Macedonian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'mk';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'страница';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/mlt.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/mlt.php
new file mode 100644
index 00000000..f946c039
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/mlt.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : mlt.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Maltese
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Maltese
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Maltese
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'mt';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'paġna';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/msa.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/msa.php
new file mode 100644
index 00000000..69c564ad
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/msa.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : msa.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Malay
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Malay
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Malay
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'ms';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'laman';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/nld.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/nld.php
new file mode 100644
index 00000000..0f19bed8
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/nld.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : nld.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Dutch
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Dutch
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Dutch
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'nl';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'pagina';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/nob.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/nob.php
new file mode 100644
index 00000000..94e8ff06
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/nob.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : nob.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Norwegian Bokmål
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Norwegian Bokmål
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Norwegian Bokmål
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'nb';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'side';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/pol.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/pol.php
new file mode 100644
index 00000000..fbf386f0
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/pol.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : pol.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Polish
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Polish
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Polish
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'pl';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'strona';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/por.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/por.php
new file mode 100644
index 00000000..ab45c714
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/por.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : por.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Portuguese
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Portuguese
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Portuguese
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'pt';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'página';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ron.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ron.php
new file mode 100644
index 00000000..985622ca
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ron.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : ron.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Romanian, Moldavian, Moldovan
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Romanian, Moldavian, Moldovan
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Romanian, Moldavian, Moldovan
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'ro';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'pagina';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/rus.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/rus.php
new file mode 100644
index 00000000..45cb5158
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/rus.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : rus.php
+// Begin       : 2004-03-03
+// Last Update : 2012-07-25
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Russian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Russian
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Russian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'ru';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'страница';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/slv.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/slv.php
new file mode 100644
index 00000000..c2a8d987
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/slv.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : slv.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Slovene
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Slovene
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Slovene
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'sl';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'stran';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/spa.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/spa.php
new file mode 100644
index 00000000..02e0220e
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/spa.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : spa.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Spanish; Castilian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Spanish; Castilian
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Spanish; Castilian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'es';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'página';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/sqi.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/sqi.php
new file mode 100644
index 00000000..bd01da37
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/sqi.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : sqi.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Albanian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Albanian
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Albanian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'sq';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'faqe';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/srp.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/srp.php
new file mode 100644
index 00000000..60a5e028
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/srp.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : srp.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Serbian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Serbian
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Serbian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'sr';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'страна';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/swa.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/swa.php
new file mode 100644
index 00000000..f30486dc
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/swa.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : swa.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Swahili
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Swahili
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Swahili
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'sw';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'ukurasa';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/swe.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/swe.php
new file mode 100644
index 00000000..22a38cea
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/swe.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : swe.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Swedish
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Swedish
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Swedish
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'sv';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'sida';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ukr.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ukr.php
new file mode 100644
index 00000000..ef71b7fe
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/ukr.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : ukr.php
+// Begin       : 2004-03-03
+// Last Update : 2012-07-25
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Ukrainian
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Ukrainian
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Russian
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'ua';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'сторінка';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/urd.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/urd.php
new file mode 100644
index 00000000..2045a907
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/urd.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : urd.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Urdu
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Urdu
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Urdu
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'rtl';
+$l['a_meta_language'] = 'ur';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'صفحہ';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/yid.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/yid.php
new file mode 100644
index 00000000..2e55322b
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/yid.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : yid.php
+// Begin       : 2004-03-03
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Welsh
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Welsh
+ * @author Nicola Asuni
+ * @since 2004-03-03
+ */
+
+// Welsh
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'rtl';
+$l['a_meta_language'] = 'yi';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = 'זייַט';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/lang/zho.php b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/zho.php
new file mode 100644
index 00000000..8eea0a9e
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/lang/zho.php
@@ -0,0 +1,44 @@
+<?php
+//============================================================+
+// File name   : zho.php
+// Begin       : 2010-10-26
+// Last Update : 2010-10-26
+//
+// Description : Language module for TCPDF
+//               (contains translated texts)
+//               Chinese
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * TCPDF language file (contains translated texts).
+ * @package com.tecnick.tcpdf
+ * @brief TCPDF language file: Chinese
+ * @author Nicola Asuni
+ * @since 2010-10-26
+ */
+
+// Chinese
+
+global $l;
+$l = Array();
+
+// PAGE META DESCRIPTORS --------------------------------------
+
+$l['a_meta_charset'] = 'UTF-8';
+$l['a_meta_dir'] = 'ltr';
+$l['a_meta_language'] = 'zh';
+
+// TRANSLATIONS --------------------------------------
+$l['w_page'] = '頁面';
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/examples/tcpdf_include.php b/htmltest/sites/all/libraries/tcpdf-version/examples/tcpdf_include.php
new file mode 100644
index 00000000..694a6446
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/examples/tcpdf_include.php
@@ -0,0 +1,40 @@
+<?php
+//============================================================+
+// File name   : tcpdf_include.php
+// Begin       : 2008-05-14
+// Last Update : 2013-05-14
+//
+// Description : Search and include the TCPDF library.
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+//               Nicola Asuni
+//               Tecnick.com LTD
+//               www.tecnick.com
+//               info@tecnick.com
+//============================================================+
+
+/**
+ * Search and include the TCPDF library.
+ * @package com.tecnick.tcpdf
+ * @abstract TCPDF - Include the main class.
+ * @author Nicola Asuni
+ * @since 2013-05-14
+ */
+
+// always load alternative config file for examples
+require_once('config/tcpdf_config_alt.php');
+
+// Include the main TCPDF library (search the library on the following directories).
+$tcpdf_include_dirs = array(realpath('../tcpdf.php'), '/usr/share/php/tcpdf/tcpdf.php', '/usr/share/tcpdf/tcpdf.php', '/usr/share/php-tcpdf/tcpdf.php', '/var/www/tcpdf/tcpdf.php', '/var/www/html/tcpdf/tcpdf.php', '/usr/local/apache2/htdocs/tcpdf/tcpdf.php');
+foreach ($tcpdf_include_dirs as $tcpdf_include_path) {
+	if (@file_exists($tcpdf_include_path)) {
+		require_once($tcpdf_include_path);
+		break;
+	}
+}
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/ae_fonts_2.0/COPYING b/htmltest/sites/all/libraries/tcpdf-version/fonts/ae_fonts_2.0/COPYING
new file mode 100644
index 00000000..a8e2dd49
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/ae_fonts_2.0/COPYING
@@ -0,0 +1,343 @@
+                        -* www.gnu.org *-
+
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/ae_fonts_2.0/ChangeLog b/htmltest/sites/all/libraries/tcpdf-version/fonts/ae_fonts_2.0/ChangeLog
new file mode 100644
index 00000000..6e5cb895
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/ae_fonts_2.0/ChangeLog
@@ -0,0 +1,863 @@
+2007-08-20 00:48  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_AlArabiya.sfd: Diagonal marks
+
+2007-08-20 00:25  Khaled Hosny <khaledhosny@eglug.org>
+
+	* README: Added Release notes, preparing for 2.0 release.
+
+2007-08-19 23:19  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_AlArabiya.sfd: Stack diacritics definition
+
+2007-08-19 22:56  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Tholoth.sfd:
+	  * Added 'rlg' lookup table and subtable and registered stacked
+	  diacritic ligatures.
+	  * kasrah and kasratan were too close to the base glyph, fixed.
+
+2007-08-19 22:28  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_AlHor.sfd, ae_AlMateen-Bold.sfd, ae_AlMohanad.sfd,
+	  ae_AlYarmook.sfd, ae_Arab.sfd, ae_Cortoba.sfd, ae_Furat.sfd,
+	  ae_Graph.sfd, ae_Kayrawan.sfd, ae_Khalid.sfd, ae_Mashq-Bold.sfd,
+	  ae_Mashq.sfd, ae_Metal.sfd, ae_Nada.sfd, ae_Nagham.sfd,
+	  ae_Ostorah.sfd, ae_Ouhod-Bold.sfd, ae_Petra.sfd,
+	  ae_Rasheeq-Bold.sfd, ae_Rehan.sfd, ae_Salem.sfd, ae_Shado.sfd,
+	  ae_Sharjah.sfd, ae_Sindbad.sfd, ae_Tarablus.sfd: Scaled up
+	  diacritic glyphs, this makes them more readable.
+
+2007-08-19 22:03  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_AlArabiya.sfd: New sukun, removed wrong anchors from
+	  kasrah
+
+2007-08-19 20:26  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlMothnna-Bold.sfd: Added 'rlg' lookup table and subtable
+	  and registered stacked diacritic ligatures.
+
+2007-08-19 18:28  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_AlMothnna-Bold.sfd: Fixed shaddas
+
+2007-08-19 18:01  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_AlMothnna-Bold.sfd: Stacked diacrititcs
+
+2007-08-19 14:49  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlArabiya.sfd: Removed mark2mark anchors, now we use
+	  ligature substitution for stacked	diacritics instead of anchors.
+	  Added 'rlg' lookup table and subtable and registered stacked
+	  diacritic ligatures.
+
+2007-08-19 02:30  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_AlArabiya.sfd: Stacked diacritics added
+
+2007-08-19 01:53  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ArabicReesha.sfd:
+	  * Added to new ligatures; <fathatan><alef isolated> and
+	  <fathatan><alef final>.
+	  * Small fixes to Jeem isolated width.
+
+2007-08-18 21:30  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_AlMothnna-Bold.sfd: Diacritics fixed except allahisolated
+	  ligature
+
+2007-08-18 20:13  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlMothnna-Bold.sfd: Removed old, buggy, anchors and auto
+	  added new ones, needs manual editing.
+
+2007-08-18 19:11  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_AlMothnna-Bold.sfd: New shadda, modified sukun to meet the
+	  other marks
+
+2007-08-18 17:20  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_AlArabiya.sfd: New diacritics for ae_AlArabiya.sfd
+
+2007-08-17 23:19  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Tholoth.sfd: ae_Tholoth.sfd: Added glyphs U+FC5E - U+FC62.
+
+2007-08-16 14:56  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlMohanad.sfd: AlMohanad: Fixed U+FEDA (kaf final) to take
+	  the shape of ordinary final kaf rather than the long variant.
+
+2007-08-15 14:25  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ArabicReesha.sfd: ArabicReesha.sfd: Fixed a bug that caused
+	  some isolated glyphs to have more space to the right.
+
+2007-08-15 12:02  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_AlMateen-Bold.sfd, ae_AlMohanad.sfd, ae_AlYarmook.sfd,
+	  ae_Electron.sfd, ae_Hani.sfd, ae_Haramain.sfd, ae_Khalid.sfd,
+	  ae_Rasheeq-Bold.sfd, ae_Rehan.sfd, ae_Sharjah.sfd,
+	  ae_Tarablus.sfd, ae_Tholoth.sfd: Add new 'liga' table without
+	  "Ignore Combining Marks" flag, allahisolated ligature belong to that
+	  table now, so when allahisolated has a tashkil on it, the ligature
+	  will be ignored and will use normal glyphs instead.
+
+2007-08-15 11:05  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Granada.sfd, ae_Graph.sfd, ae_Haramain.sfd,
+	  ae_Nagham.sfd, ae_Nice.sfd, ae_Ostorah.sfd, ae_Sindbad.sfd,
+	  ae_Tarablus.sfd: Added "Ignore Combining Marks flag" to 'liga'
+	  table.
+
+2007-08-15 10:35  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ArabicReesha.sfd: ArabicReesha: New font based on SIL's
+	  Scheherazade, first version.
+
+2007-08-15 00:23  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlArabiya.sfd: Shadda was missing mark2mark below anchor.
+
+2007-08-14 23:28  Mohammed Adnene Trojette <adn@diwi.org>
+
+	* Makefile: GPL has been removed
+
+2007-08-14 23:21  Mohammed Adnene Trojette <adn@diwi.org>
+
+	* COPYING, README: Copyright informations
+
+2007-08-14 23:05  Khaled Hosny <khaledhosny@eglug.org>
+
+	* COPYING: Updated to refer to FreeFonts project.
+
+2007-08-14 22:56  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Salem.sfd: Updated the copyright statement, to mention GPL
+	  font exception and FreeFonts project, again
+
+2007-08-14 22:43  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Salem.sfd: Revert to 1.7 and added Allah anchors(again).
+
+2007-08-14 21:35  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Tholoth.sfd: Minor positioning fix
+
+2007-08-14 21:12  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Tholoth.sfd: Added missed U+0647.
+
+2007-08-14 18:37  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_AlArabiya.sfd, ae_AlBattar.sfd, ae_AlHor.sfd,
+	  ae_AlManzomah.sfd, ae_AlMateen-Bold.sfd, ae_AlMohanad.sfd,
+	  ae_AlMothnna-Bold.sfd, ae_AlYarmook.sfd, ae_Arab.sfd,
+	  ae_Cortoba.sfd, ae_Dimnah.sfd, ae_Electron.sfd, ae_Furat.sfd,
+	  ae_Granada.sfd, ae_Graph.sfd, ae_Hani.sfd, ae_Haramain.sfd,
+	  ae_Hor.sfd, ae_Japan.sfd, ae_Jet.sfd, ae_Kayrawan.sfd,
+	  ae_Khalid.sfd, ae_Mashq-Bold.sfd, ae_Mashq.sfd, ae_Metal.sfd,
+	  ae_Nada.sfd, ae_Nagham.sfd, ae_Nice.sfd, ae_Ostorah.sfd,
+	  ae_Ouhod-Bold.sfd, ae_Petra.sfd, ae_Rasheeq-Bold.sfd,
+	  ae_Rehan.sfd, ae_Salem.sfd, ae_Shado.sfd, ae_Sharjah.sfd,
+	  ae_Sindbad.sfd, ae_Tarablus.sfd, ae_Tholoth.sfd: Updated the
+	  copyright statement, to mention GPL font exception and FreeFonts
+	  project.
+
+2007-08-13 22:18  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_AlArabiya.sfd, ae_AlBattar.sfd, ae_AlManzomah.sfd,
+	  ae_AlMateen-Bold.sfd, ae_AlMohanad.sfd, ae_AlMothnna-Bold.sfd,
+	  ae_Arab.sfd, ae_Cortoba.sfd, ae_Electron.sfd, ae_Furat.sfd,
+	  ae_Granada.sfd, ae_Graph.sfd, ae_Hani.sfd, ae_Haramain.sfd,
+	  ae_Hor.sfd, ae_Jet.sfd, ae_Kayrawan.sfd, ae_Mashq-Bold.sfd,
+	  ae_Mashq.sfd, ae_Nada.sfd, ae_Nagham.sfd, ae_Nice.sfd,
+	  ae_Ostorah.sfd, ae_Ouhod-Bold.sfd, ae_Petra.sfd,
+	  ae_Rasheeq-Bold.sfd, ae_Rehan.sfd, ae_Salem.sfd, ae_Shado.sfd,
+	  ae_Sharjah.sfd, ae_Sindbad.sfd, ae_Tarablus.sfd, ae_Tholoth.sfd:
+	  * Add missed mark2mark anchors in the affected files, though we
+	  aren't going to use this on the long run, but I'll leave that task
+	  for 2.1 .
+	  * Reencoded all files to unicode glyph map.
+
+2007-08-13 14:47  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Petra.sfd, ae_Shado.sfd: ae_Petra.sfd, ae_Shado.sfd:
+	  Full support for diacritics positioning by Osama Khalid.
+
+2007-08-13 10:38  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Hor.sfd, ae_Sharjah.sfd:
+	  * ae_Hor: Full support for diacritics positioning by Fahd.
+	  * ae_Sharjah: Full support for diacritics positioning by Fahd.
+
+2007-08-13 05:34  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/: ae_Nice.sfd, ae_Tarablus.sfd: Full diacritics supports,
+	  needs a check
+
+2007-08-13 05:24  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_Nagham.sfd: Full diacritics supports, needs a check
+
+2007-08-13 05:08  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_Haramain.sfd: Full diacritics supports, needs a check
+
+2007-08-13 04:42  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_Graph.sfd: Full diacritics supports, needs a check
+
+2007-08-13 04:38  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_Granada.sfd: Full diacritics supports, needs a check
+
+2007-08-13 03:28  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Ostorah.sfd: ae_Ostorah.sfd: Full support for diacritic
+	  positioning.
+
+2007-08-13 02:13  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_Haramain.sfd: Done: replaced ugly marks, repositioned
+	  below marks
+
+2007-08-13 01:31  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_Graph.sfd: Done, needs to be checked
+
+2007-08-13 01:16  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_Granada.sfd: Done, needs to be checked
+
+2007-08-12 23:05  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/: ae_Tarablus.sfd: First steps
+
+2007-08-12 18:24  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Electron.sfd: ae_Electron.sfd: Full support for diacritic
+	  positioning.
+
+2007-08-12 16:06  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Hani.sfd: ae_Hani.sfd: Full support for diacritic
+	  positioning by Osama Khaled
+
+2007-08-11 23:33  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Ouhod-Bold.sfd: ae_Ouhod-Bold.sfd: Full support for
+	  diacritic positioning.
+
+2007-08-11 21:28  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Rasheeq-Bold.sfd: ae_Rasheeq-Bold.sfd: Full diacritic
+	  support.
+
+2007-08-11 15:09  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Hor.sfd: some fixes
+
+2007-08-11 14:55  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Electron.sfd, ae_Granada.sfd, ae_Graph.sfd,
+	  ae_Haramain.sfd, ae_Nagham.sfd, ae_Nice.sfd, ae_Ostorah.sfd,
+	  ae_Ouhod-Bold.sfd, ae_Rasheeq-Bold.sfd, ae_Shado.sfd,
+	  ae_Sharjah.sfd, ae_Tarablus.sfd: More tweaking, it is ready for
+	  manual editing now (I hope so).
+
+2007-08-11 11:08  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Hor.sfd: Fahd: I updated the anchor points, please use
+	  this instead of the old version.
+
+2007-08-11 10:45  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Electron.sfd, ae_Granada.sfd, ae_Graph.sfd, ae_Hani.sfd,
+	  ae_Haramain.sfd, ae_Nagham.sfd, ae_Nice.sfd, ae_Ostorah.sfd,
+	  ae_Ouhod-Bold.sfd, ae_Petra.sfd, ae_Rasheeq-Bold.sfd,
+	  ae_Shado.sfd, ae_Sharjah.sfd, ae_Tarablus.sfd: Replaced old
+	  anchor points with new ones and better automatic positioning using
+	  the improved addanchors.pe script. Please update your local copy
+	  before doing any further work, this will make our life easier.
+
+2007-08-11 10:25  Khaled Hosny <khaledhosny@eglug.org>
+
+	* tools/addanchors.pe: Now X and Y values are computed to produce a
+	  far better result, the needed manual tweaking is very little now.
+
+2007-08-10 01:27  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Nada.sfd: ae_Nada.sfd: Full support for diacritic
+	  positioning by Fahd AlSaidi.
+
+2007-08-07 23:47  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlYarmook.sfd:
+	  * ae_AlYarmook.sfd: Changed font name and other related feilds from
+	  AlYermook to AlYarmook
+	  * ae_AlYarmook.sfd: Full support for diacritic positioning.
+
+2007-08-07 00:22  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Mashq-Bold.sfd: sfd/ae_Mashq-Bold.sfd: Full support for
+	  diacritic positioning.
+
+2007-08-06 02:58  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Rehan.sfd: Mark to mark ligatures were too close, fixed.
+
+2007-08-04 20:14  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Rehan.sfd: ae_Rehan.sfd: Full support for diacritic
+	  positioning.
+
+2007-08-04 01:22  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Mashq.sfd: ae_Mashq.sfd: Full support for diacritic
+	  positioning.
+
+2007-08-04 01:19  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Khalid.sfd: Reencoded the file to Unicode.
+
+2007-08-04 01:16  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Kayrawan.sfd: Fixed ArabicMark2MarkBelow anchor point.
+	  Reencoded the file to Unicode.
+
+2007-08-03 06:12  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_Kayrawan.sfd: Fixed two letters ligatures diacritics
+
+2007-08-03 05:55  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_Kayrawan.sfd: Added لله ligature diacritics
+
+2007-08-03 05:01  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_Kayrawan.sfd: Ignore combining marks set
+
+2007-08-03 04:51  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_Kayrawan.sfd: Full diacritics support -
+	  ArabicMark2MarkBelow need to be checked
+
+2007-08-03 02:40  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Salem.sfd: Added and positioned anchors for Allah glyph.
+
+2007-08-03 02:32  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Dimnah.sfd: ae_Dimnah.sfd: Full support for diacritic
+	  positioning.
+
+2007-08-03 01:26  Youssef Chahibi <chahibi@gmail.com>
+
+	* sfd/ae_Kayrawan.sfd: First steps in font editing
+
+2007-08-03 00:10  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Salem.sfd: ae_Salem.sfd: Full diacritic support.
+
+2007-08-02 04:50  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Arab.sfd: Fixed ligatures anchor points.
+
+2007-08-02 02:15  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Arab.sfd: Support for diacritic positioning by Osama
+	  Khalid.
+
+2007-08-01 23:09  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlManzomah.sfd: ae_AlManzomah.sfd: Full support for
+	  diacritic positioning.
+
+2007-08-01 01:56  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Khalid.sfd: ae_Khalid.sfd: Full support for diacritic
+	  positioning.
+
+2007-07-28 11:43  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlMateen-Bold.sfd: ae_AlMateen-Bold.sfd: Full support for
+	  diacritic positioning.
+
+2007-07-27 22:16  Afief Halumi <afief.h@gmail.com>
+
+	* Makefile: New make targets as requested by KhaledHosney.
+
+2007-07-27 21:04  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlHor.sfd: ae_AlHor.sfd: Full diacritic support
+
+2007-07-26 10:14  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Jet.sfd: ./sfd/ae_Jet.sfd: Full diacritic support.
+
+2007-07-26 01:38  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Japan.sfd: Aeif, you forgot the ligatures and letter beh
+	  isolated, fixed
+
+2007-07-25 14:41  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Metal.sfd: Add anchor points for لله ligature
+
+2007-07-25 12:52  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Metal.sfd: ae_Metal: Full diacritic support.
+
+2007-07-25 01:36  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Japan.sfd: ae_Japan: Full diacritic support.
+
+2007-07-25 01:28  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Cortoba.sfd: minor fix
+
+2007-07-25 00:24  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Cortoba.sfd:
+
+	  ----------------------------------------------------------------------ae_Cortoba.sfd: Full support for diacritic positioning.
+
+2007-07-24 18:34  Khaled Hosny <khaledhosny@eglug.org>
+
+	* tools/generate.sh: not needed any more, use 'make' instead
+
+2007-07-24 18:31  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Sindbad.sfd: Add anchor points for لله ligature
+
+2007-07-24 18:04  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlArabiya.sfd: Fixed ligatures anchor points
+
+2007-07-24 17:55  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Furat.sfd: Add anchor points for لله ligature
+
+2007-07-23 23:16  Khaled Hosny <khaledhosny@eglug.org>
+
+	* README, README.cvs:
+	  - new readme file to explain how to build ttf onts from our cvs
+	  tree.
+
+2007-07-23 23:01  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlBattar.sfd: few fixes in the diacritic positions
+
+2007-07-23 13:56  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlBattar.sfd: ae_AlBattar.sfd, full support for diacritic
+	  positioning.
+
+2007-07-23 05:28  Afief Halumi <afief.h@gmail.com>
+
+	* Makefile: Now doesn't rebuild untouched fonts, should save some
+	  server cycles.
+
+2007-07-23 04:00  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Sindbad.sfd: Unchecked 'compact' option
+
+2007-07-23 00:16  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Sindbad.sfd:
+	  - Add the missed "Ignore Combining Marks" feature to Arabic liga
+	  lookuptable, Afief please remember this.
+	  - Few changes in ArabicBelow anchor points placement.
+
+2007-07-22 14:42  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlBattar.sfd: Diacritic support, for isolated glyphs only.
+
+2007-07-22 00:43  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Sindbad.sfd: Full support for diacritic positioning.
+
+2007-07-21 21:38  Khaled Hosny <khaledhosny@eglug.org>
+
+	* Makefile: fixed "clean" to remove the bzipped archive.
+
+2007-07-21 21:34  Khaled Hosny <khaledhosny@eglug.org>
+
+	* Makefile:
+	  - All files are under ae_fonts dir now.
+	  - The archive is bzipped.
+
+2007-07-21 20:05  Afief Halumi <afief.h@gmail.com>
+
+	* Makefile: Commited the Makefile. Hope you like it.
+
+2007-07-21 19:11  Khaled Hosny <khaledhosny@eglug.org>
+
+	* tools/generate.pe: Add a usage note.
+
+2007-07-21 19:09  Khaled Hosny <khaledhosny@eglug.org>
+
+	* tools/generate.pe: Now accepts a 2nd argument for the .ttf file
+	  name.
+
+2007-07-21 18:52  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Tholoth.sfd: A few fixes in positioning.
+
+2007-07-21 16:48  Afief Halumi <afief.h@gmail.com>
+
+	* sfd/ae_Tholoth.sfd: Finished work on ae_Tholoth.sfd; Added a few
+	  better glyphs and full support for diacritic positioning.
+
+2007-07-21 00:04  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Tholoth.sfd:
+
+	  Diacritics work by afief
+
+2007-07-19 23:49  Khaled Hosny <khaledhosny@eglug.org>
+
+	* tools/addanchors.pe: Add support for mark2glyph anchor points,
+	  thanks George Williams for fixing fontforge's bug.
+
+2007-07-19 23:16  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_AlBattar.sfd, ae_AlHor.sfd, ae_AlManzomah.sfd,
+	  ae_AlMateen-Bold.sfd, ae_AlYarmook.sfd, ae_Arab.sfd,
+	  ae_Cortoba.sfd, ae_Dimnah.sfd, ae_Electron.sfd, ae_Granada.sfd,
+	  ae_Graph.sfd, ae_Hani.sfd, ae_Haramain.sfd, ae_Hor.sfd,
+	  ae_Japan.sfd, ae_Jet.sfd, ae_Kayrawan.sfd, ae_Khalid.sfd,
+	  ae_Mashq-Bold.sfd, ae_Mashq.sfd, ae_Metal.sfd, ae_Nada.sfd,
+	  ae_Nagham.sfd, ae_Nice.sfd, ae_Ostorah.sfd, ae_Ouhod-Bold.sfd,
+	  ae_Petra.sfd, ae_Rasheeq-Bold.sfd, ae_Rehan.sfd, ae_Salem.sfd,
+	  ae_Shado.sfd, ae_Sharjah.sfd, ae_Sindbad.sfd, ae_Tarablus.sfd,
+	  ae_Tholoth.sfd:
+
+	  - Removed Cyrillic and Greek glyphs, this makes the font more
+	  lighter.
+	  - Add all needed anchor points, still needs to be manually adjusted.
+
+2007-07-19 23:15  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_AlMohanad.sfd, ae_AlMothnna-Bold.sfd, ae_Furat.sfd:
+	  Removed Cyrillic and Greek glyphs, this makes the font more lighter.
+
+2007-07-19 23:12  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlArabiya.sfd: full support for diacritic positioning
+
+2007-07-18 14:57  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlArabiya.sfd:
+
+	  Full mark2base and mark2mark anchor points
+
+2007-07-16 20:53  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Nada.sfd:
+
+	  Removed obsolete reference to Btstream copyright, we don't include
+	  any Bitstream copyrighted glyphs anymore.
+
+2007-07-16 20:03  Khaled Hosny <khaledhosny@eglug.org>
+
+	* tools/: addanchors.pe, addlookups.pe, cp.pe, generate.pe:
+
+	  use "#!/usr/bin/env fontforge" instead of "#!/usr/bin/fontforge"
+
+2007-07-16 13:47  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlMohanad.sfd:
+
+	  Full support for proper diacritics positioning
+
+2007-07-16 00:16  Khaled Hosny <khaledhosny@eglug.org>
+
+	* tools/: addanchors.pe, addlookups.pe, cp.pe, generate.pe: Now the
+	  scripts require Fotforge 20070501 or newer, older versions use older
+	  SFD formate which we don't suport.
+
+2007-07-16 00:09  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlArabiya.sfd: Add support for proper diacritic
+	  positioning by Afief Halumi, still in progress
+
+2007-07-15 23:48  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Furat.sfd: full support for diacritic positioning
+
+2007-07-15 20:08  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_AlBattar.sfd, ae_AlHor.sfd, ae_AlManzomah.sfd,
+	  ae_AlMateen-Bold.sfd, ae_AlMohanad.sfd, ae_AlYarmook.sfd,
+	  ae_Arab.sfd, ae_Cortoba.sfd, ae_Dimnah.sfd, ae_Electron.sfd,
+	  ae_Granada.sfd, ae_Graph.sfd, ae_Hani.sfd, ae_Haramain.sfd,
+	  ae_Hor.sfd, ae_Japan.sfd, ae_Jet.sfd, ae_Kayrawan.sfd,
+	  ae_Khalid.sfd, ae_Mashq-Bold.sfd, ae_Mashq.sfd, ae_Metal.sfd,
+	  ae_Nada.sfd, ae_Nagham.sfd, ae_Nice.sfd, ae_Ostorah.sfd,
+	  ae_Ouhod-Bold.sfd, ae_Petra.sfd, ae_Rasheeq-Bold.sfd,
+	  ae_Rehan.sfd, ae_Salem.sfd, ae_Shado.sfd, ae_Sharjah.sfd,
+	  ae_Sindbad.sfd, ae_Tarablus.sfd, ae_Tholoth.sfd: removed traces
+	  of ae_ prefix
+
+2007-07-15 19:44  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlArabiya.sfd: removed traces of ae_ prefix
+
+2007-07-13 20:14  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlMothnna-Bold.sfd:
+	  - Removed traces of ae_ prefix.
+	  - Full support for proper Arabic diacritics positioning.
+
+2007-07-13 19:38  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Furat.sfd:
+	  - Removed traces of ae_ prefix.
+	  - add anchor points for Arabic diacritics, needs manual tuning.
+
+2007-07-13 19:09  Khaled Hosny <khaledhosny@eglug.org>
+
+	* tools/: addanchors.pe, addlookups.pe: scripts to assist adding
+	  lookup tables and anchor points needed for proper diacritics
+	  (harakat) support.
+
+2007-07-01 03:31  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_AlArabiya.sfd, ae_AlBattar.sfd, ae_AlHor.sfd,
+	  ae_AlManzomah.sfd, ae_AlMateen-Bold.sfd, ae_AlMohanad.sfd,
+	  ae_AlMothnna-Bold.sfd, ae_AlYarmook.sfd, ae_Arab.sfd,
+	  ae_Cortoba.sfd, ae_Dimnah.sfd, ae_Electron.sfd, ae_Furat.sfd,
+	  ae_Granada.sfd, ae_Graph.sfd, ae_Hani.sfd, ae_Haramain.sfd,
+	  ae_Hor.sfd, ae_Japan.sfd, ae_Jet.sfd, ae_Kayrawan.sfd,
+	  ae_Khalid.sfd, ae_Mashq-Bold.sfd, ae_Mashq.sfd, ae_Metal.sfd,
+	  ae_Nada.sfd, ae_Nagham.sfd, ae_Nice.sfd, ae_Ostorah.sfd,
+	  ae_Ouhod-Bold.sfd, ae_Petra.sfd, ae_Rasheeq-Bold.sfd,
+	  ae_Rehan.sfd, ae_Salem.sfd, ae_Shado.sfd, ae_Sharjah.sfd,
+	  ae_Sindbad.sfd, ae_Tarablus.sfd, ae_Tholoth.sfd: Removed ae_
+	  prefix from all fonts, see
+	  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=361965
+
+2007-06-30 22:02  Khaled Hosny <khaledhosny@eglug.org>
+
+	* README: Initial README file
+
+2007-06-30 20:20  Khaled Hosny <khaledhosny@eglug.org>
+
+	* tools/: generate.pe, generate.sh: Scripts to generate TTF files
+	  from SFD ones.
+
+2007-06-30 19:58  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Tarablus.sfd: add the missed U+F6BE that caused bug in 'j'
+	  glyph, CVS_SILENT
+
+2007-06-30 19:48  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Sindbad.sfd:
+	   add the missed U+F6BE that caused bug in 'j' glyph, CVS_SILENT
+
+2007-06-23 22:29  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Shado.sfd, ae_Sharjah.sfd: add the missed U+F6BE that
+	  caused bug in 'j' glyph
+
+2007-06-23 22:26  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Rasheeq-Bold.sfd, ae_Rehan.sfd, ae_Salem.sfd: add the
+	  missed U+F6BE that caused bug in 'j' glyph
+
+2007-06-23 22:22  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Nice.sfd, ae_Ostorah.sfd, ae_Ouhod-Bold.sfd,
+	  ae_Petra.sfd: add the missed U+F6BE that caused bug in 'j' glyph
+
+2007-06-23 22:19  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Metal.sfd, ae_Nada.sfd, ae_Nagham.sfd: add the missed
+	  U+F6BE that caused bug in 'j' glyph
+
+2007-06-23 22:16  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Kayrawan.sfd, ae_Khalid.sfd, ae_Mashq-Bold.sfd,
+	  ae_Mashq.sfd: add the missed U+F6BE that caused bug in 'j' glyph
+
+2007-06-23 22:12  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Haramain.sfd, ae_Hor.sfd, ae_Japan.sfd, ae_Jet.sfd: add
+	  the missed U+F6BE that caused bug in 'j' glyph
+
+2007-06-23 22:09  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Granada.sfd, ae_Graph.sfd, ae_Hani.sfd: add the missed
+	  U+F6BE that caused bug in 'j' glyph
+
+2007-06-23 22:05  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Electron.sfd, ae_Furat.sfd: add the missed U+F6BE that
+	  caused bug in 'j' glyph
+
+2007-06-23 22:02  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Cortoba.sfd, ae_Dimnah.sfd: add the missed U+F6BE that
+	  caused bug in 'j' glyph
+
+2007-06-23 21:59  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_AlYarmook.sfd, ae_Arab.sfd: add the missed U+F6BE that
+	  caused bug in 'j' glyph
+
+2007-06-23 21:19  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_AlArabiya.sfd, ae_AlBattar.sfd, ae_AlHor.sfd,
+	  ae_AlManzomah.sfd, ae_AlMateen-Bold.sfd, ae_AlMohanad.sfd,
+	  ae_AlMothnna-Bold.sfd: Added the missed U+U+F6BE glyphs which
+	  caused a bug in "j" glyph
+
+2007-06-23 18:30  Khaled Hosny <khaledhosny@eglug.org>
+
+	* COPYING: -Moved GPL to a separate file.  -Added GPL font
+	  exception to COPYING.
+
+2007-06-23 18:12  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_Tholoth.sfd:
+	  - New glyphs (covering every thing outside Arabic block) based on
+	  the GPL'd FreeFont project [http://www.nongnu.org/freefont/].
+	  - Arabic diacritic marks (harakat) are set to have zero advance
+	  width and OT class as 'mark' nstead of 'base glyph'
+
+2007-06-23 18:07  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Shado.sfd, ae_Sharjah.sfd, ae_Sindbad.sfd,
+	  ae_Tarablus.sfd:
+	  - New glyphs (covering every thing outside Arabic block) based on
+	  the GPL'd FreeFont project [http://www.nongnu.org/freefont/].
+	  - Arabic diacritic marks (harakat) are set to have zero advance
+	  width and OT class as 'mark' nstead of 'base glyph'
+
+2007-06-23 18:04  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Petra.sfd, ae_Rasheeq-Bold.sfd, ae_Rehan.sfd,
+	  ae_Salem.sfd:
+	  - New glyphs (covering every thing outside Arabic block) based on
+	  the GPL'd FreeFont project [http://www.nongnu.org/freefont/].
+	  - Arabic diacritic marks (harakat) are set to have zero advance
+	  width and OT class as 'mark' nstead of 'base glyph'
+
+2007-06-23 18:01  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Nagham.sfd, ae_Nice.sfd, ae_Ostorah.sfd,
+	  ae_Ouhod-Bold.sfd:
+	  - New glyphs (covering every thing outside Arabic block) based on
+	  the GPL'd FreeFont project [http://www.nongnu.org/freefont/].
+	  - Arabic diacritic marks (harakat) are set to have zero advance
+	  width and OT class as 'mark' nstead of 'base glyph'
+
+2007-06-23 17:57  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Metal.sfd, ae_Nada.sfd:
+	  - New glyphs (covering every thing outside Arabic block) based on
+	  the GPL'd FreeFont project [http://www.nongnu.org/freefont/].
+	  - Arabic diacritic marks (harakat) are set to have zero advance
+	  width and OT class as 'mark' nstead of 'base glyph'
+
+2007-06-23 17:54  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Kayrawan.sfd, ae_Khalid.sfd, ae_Mashq-Bold.sfd,
+	  ae_Mashq.sfd:
+	  - New glyphs (covering every thing outside Arabic block) based on
+	  the GPL'd FreeFont project [http://www.nongnu.org/freefont/].
+	  - Arabic diacritic marks (harakat) are set to have zero advance
+	  width and OT class as 'mark' nstead of 'base glyph'
+
+2007-06-23 17:51  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Haramain.sfd, ae_Hor.sfd, ae_Japan.sfd, ae_Jet.sfd:
+	  - New glyphs (covering every thing outside Arabic block) based on
+	  the GPL'd FreeFont project [http://www.nongnu.org/freefont/].
+	  - Arabic diacritic marks (harakat) are set to have zero advance
+	  width and OT class as 'mark' nstead of 'base glyph'
+
+2007-06-23 17:47  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Furat.sfd, ae_Granada.sfd, ae_Graph.sfd, ae_Hani.sfd:
+	  - New glyphs (covering every thing outside Arabic block) based on
+	  the GPL'd FreeFont project [http://www.nongnu.org/freefont/].
+	  - Arabic diacritic marks (harakat) are set to have zero advance
+	  width and OT class as 'mark' nstead of 'base glyph'
+
+2007-06-23 17:43  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_Arab.sfd, ae_Cortoba.sfd, ae_Dimnah.sfd,
+	  ae_Electron.sfd:
+	  - New glyphs (covering every thing outside Arabic block) based on
+	  the GPL'd FreeFont project [http://www.nongnu.org/freefont/].
+	  - Arabic diacritic marks (harakat) are set to have zero advance
+	  width and OT class as 'mark' nstead of 'base glyph'
+
+2007-06-23 17:40  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_AlMateen-Bold.sfd, ae_AlMohanad.sfd,
+	  ae_AlMothnna-Bold.sfd, ae_AlYarmook.sfd:
+	  - New glyphs (covering every thing outside Arabic block) based on
+	  the GPL'd FreeFont project [http://www.nongnu.org/freefont/].
+	  - Arabic diacritic marks (harakat) are set to have zero advance
+	  width and OT class as 'mark' nstead of 'base glyph'
+
+2007-06-23 17:37  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_AlArabiya.sfd, ae_AlBattar.sfd, ae_AlHor.sfd,
+	  ae_AlManzomah.sfd:
+	  - New glyphs (covering every thing outside Arabic block) based on
+	  the GPL'd FreeFont project [http://www.nongnu.org/freefont/].
+	  - Arabic diacritic marks (harakat) are set to have zero advance
+	  width and OT class as 'mark' nstead of 'base glyph'
+
+2007-06-21 05:57  Khaled Hosny <khaledhosny@eglug.org>
+
+	* tools/cp.pe: Simple ff script to copy a specific range of glyphs
+	  from on font to another.
+
+2007-06-16 01:54  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlMothnna-Bold.sfd:
+	  - Identical glyphs (or parts of glyphs) are referenced to one common
+	  glyph instead of copying the same shape each time.
+	  - Add few missed Arabic glyphs, DOTLESS QAF, DOTLESS BEH, HAMZA
+	  ABOVE, HAMZA BELOW and EXTENDED ARABIC-INDIC DIGIT ZERO, ONE, TWO,
+	  THREE, SEVEN, EIGHT, NINE.
+
+2007-06-15 07:10  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/: ae_AlArabiya.sfd, ae_AlBattar.sfd, ae_AlHor.sfd,
+	  ae_AlManzomah.sfd, ae_AlMateen-Bold.sfd, ae_AlMohanad.sfd,
+	  ae_AlMothnna-Bold.sfd, ae_AlYarmook.sfd, ae_Arab.sfd,
+	  ae_Cortoba.sfd, ae_Dimnah.sfd, ae_Electron.sfd, ae_Furat.sfd,
+	  ae_Granada.sfd, ae_Graph.sfd, ae_Hani.sfd, ae_Haramain.sfd,
+	  ae_Hor.sfd, ae_Japan.sfd, ae_Jet.sfd, ae_Kayrawan.sfd,
+	  ae_Khalid.sfd, ae_Mashq-Bold.sfd, ae_Mashq.sfd, ae_Metal.sfd,
+	  ae_Nada.sfd, ae_Nagham.sfd, ae_Nice.sfd, ae_Ostorah.sfd,
+	  ae_Ouhod-Bold.sfd, ae_Petra.sfd, ae_Rasheeq-Bold.sfd,
+	  ae_Rehan.sfd, ae_Salem.sfd, ae_Shado.sfd, ae_Sharjah.sfd,
+	  ae_Sindbad.sfd, ae_Tarablus.sfd, ae_Tholoth.sfd: Preparing to
+	  work
+
+2007-06-02 21:25  Khaled Hosny <khaledhosny@eglug.org>
+
+	* sfd/ae_AlMothnna-Bold.sfd:
+	  - A modified version of "AlMothnna", partially fixes the vowel marks
+	  issues.
+	  - This is fontforg's sfd file.
+
+2004-07-10 09:48  nadim
+
+	* COPYING: + Minor mods to the GPL license mention (their address
+	  changed) + Added disclaimer + Renamed file from license.txt for
+	  consistency
+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/ae_fonts_2.0/README b/htmltest/sites/all/libraries/tcpdf-version/fonts/ae_fonts_2.0/README
new file mode 100644
index 00000000..b517cc85
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/ae_fonts_2.0/README
@@ -0,0 +1,58 @@
+This project aims at increasing the number of available Arabic free and
+open source fonts. The goals of this project are,
+
+ * Create and/or salvage high quality free and open TTF Arabic fonts.
+
+ * Create a central repository of all free and open source Arabic fonts
+(TTF and otherwise) in order to get them included into the various
+distributions.
+
+ * To better couple and artistically match Arabic fonts to their latin
+counterparts.
+
+You can visit our web page
+http://www.arabeyes.org/project.php?proj=Khotot
+
+This software package/product and attached documentations are provided
+"as is", with no warranty.
+
+                     -* www.arabeyes.org *-
+
+If you'd like to help the Arabeyes Project, then consider:
+
+  http://www.arabeyes.org/donate.php
+
+Typeface and data © 2003-2007, Arabeyes.org.
+
+Latin glyphs (U+0021-U+007E, U+00A1-U+0237, U+1E00-U+1EF9 and
+U+FB00-U+FB06 Unicode ranges) are based on "Free UCS Outline Fonts",
+www.nongnu.org/freefont (Copyleft 2002, 2003, 2005 Free Software
+Foundation).
+
+These fonts are subject to the GNU GENERAL PUBLIC (GPL) LICENSE (Version 2).
+See COPYING for details or http://www.gnu.org/copyleft/gpl.html
+
+As a special exception, if you create a document which uses this
+font, and embed this font or unaltered portions of this font into the
+document, this font does not by itself cause the resulting document to
+be covered by the GNU General Public License. This exception does not
+however invalidate any other reasons why the document might be covered
+by the GNU General Public License. If you modify this font, you may
+extend this exception to your version of the font, but you are not
+obligated to do so. If you do not wish to do so, delete this exception
+statement from your version.
+
+Release Notes
+-------------
+2.0
+This the second major release of Arabeyes fonts, this release features:
+  * Completely new Latin Glyphs, based on font distributed by FreeFonts project
+    (See the legal notes above)
+  * Proper support for Arabic diacritics; all fonts now have anchor points
+    adjusted manually to fit nicely with each glyph.
+  * Diacritics for AlMothnna, AlArabiya and Tholoth fonts have been redisigned
+    too look better and fit with the style of the font.
+  * We dropped ae_ prefix from all fonts, so please fix your configuration
+    files.
+  * Various other small fixes, see ChangeLog file for details.
+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/aealarabiya.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/aealarabiya.ctg.z
new file mode 100644
index 00000000..b837d85b
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/aealarabiya.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/aealarabiya.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/aealarabiya.php
new file mode 100644
index 00000000..f7c996c4
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/aealarabiya.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='AlArabiya';
+$up=-136;
+$ut=64;
+$dw=367;
+$diff='';
+$originalsize=121496;
+$enc='';
+$file='aealarabiya.z';
+$ctg='aealarabiya.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-123 -488 1305 1230]','ItalicAngle'=>0,'Ascent'=>1230,'Descent'=>-503,'Leading'=>200,'CapHeight'=>729,'XHeight'=>524,'StemV'=>39,'StemH'=>17,'AvgWidth'=>441,'MaxWidth'=>1332,'MissingWidth'=>367);
+$cw=array(0=>0,12=>318,13=>332,14=>212,32=>278,33=>278,34=>354,35=>556,36=>556,37=>888,38=>667,39=>191,40=>332,41=>332,42=>388,43=>584,44=>278,45=>332,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584,62=>584,63=>556,64=>1014,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>832,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278,92=>278,93=>278,94=>468,95=>556,96=>332,97=>556,98=>556,99=>500,100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>832,110=>556,111=>556,112=>556,113=>556,114=>332,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584,160=>278,161=>278,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556,168=>332,169=>737,170=>370,171=>556,172=>584,173=>332,174=>737,175=>332,176=>606,177=>584,178=>351,179=>351,180=>332,181=>574,182=>537,183=>278,184=>332,185=>351,186=>364,187=>556,188=>868,189=>868,190=>868,191=>556,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>666,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>888,231=>500,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278,238=>278,239=>278,240=>556,241=>556,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>554,255=>500,256=>667,257=>556,258=>667,259=>556,260=>667,261=>556,262=>722,263=>500,264=>722,265=>500,266=>722,267=>500,268=>722,269=>500,270=>722,271=>722,272=>722,273=>556,274=>667,275=>556,276=>667,277=>556,278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>556,286=>778,287=>556,288=>778,289=>556,290=>778,291=>697,292=>722,293=>556,294=>722,295=>556,296=>278,297=>278,298=>278,299=>278,300=>278,301=>278,302=>278,303=>222,304=>278,305=>278,306=>700,307=>374,308=>500,309=>222,310=>667,311=>500,312=>500,313=>556,314=>222,315=>556,316=>222,317=>556,318=>387,319=>556,320=>500,321=>556,322=>222,323=>722,324=>556,325=>722,326=>556,327=>722,328=>556,329=>722,330=>722,331=>556,332=>778,333=>556,334=>778,335=>556,336=>778,337=>556,338=>1000,339=>944,340=>722,341=>332,342=>722,343=>332,344=>722,345=>332,346=>667,347=>500,348=>667,349=>500,350=>667,351=>500,352=>667,353=>500,354=>611,355=>278,356=>611,357=>442,358=>611,359=>278,360=>722,361=>556,362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556,372=>944,373=>722,374=>667,375=>500,376=>667,377=>611,378=>500,379=>611,380=>500,381=>611,382=>500,383=>278,384=>556,385=>854,386=>667,387=>556,388=>667,389=>556,390=>722,391=>722,392=>500,393=>722,394=>898,395=>667,396=>556,397=>556,398=>667,399=>722,400=>667,401=>611,402=>278,403=>778,404=>667,405=>888,406=>278,407=>332,408=>667,409=>500,410=>332,411=>560,412=>832,413=>722,414=>556,415=>778,416=>778,417=>556,418=>944,419=>722,420=>842,421=>556,422=>666,423=>667,424=>500,425=>611,426=>332,427=>278,428=>611,429=>278,430=>611,431=>722,432=>556,433=>778,434=>722,435=>722,436=>556,437=>611,438=>500,439=>611,440=>611,441=>500,442=>500,443=>556,446=>556,447=>556,448=>260,449=>370,450=>584,451=>278,452=>1311,453=>1208,454=>1056,455=>1056,456=>778,457=>444,458=>1158,459=>944,460=>778,461=>667,462=>556,463=>278,464=>278,465=>778,466=>556,467=>722,468=>556,469=>722,470=>556,471=>722,472=>556,473=>722,474=>556,475=>722,476=>556,477=>556,478=>667,479=>556,480=>667,481=>556,482=>1000,483=>888,484=>778,485=>556,486=>778,487=>556,488=>667,489=>500,490=>778,491=>556,492=>778,493=>556,494=>611,495=>500,496=>222,497=>1332,498=>1222,499=>1056,500=>778,501=>556,504=>722,505=>556,506=>667,507=>556,508=>1000,509=>888,510=>778,511=>611,512=>667,513=>556,514=>667,515=>556,516=>667,517=>556,518=>667,519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>556,526=>778,527=>556,528=>722,529=>332,530=>1082,531=>332,532=>722,533=>556,534=>722,535=>556,536=>667,537=>500,538=>611,539=>278,542=>722,543=>556,548=>611,549=>500,550=>667,551=>556,552=>667,553=>556,554=>778,555=>556,556=>778,557=>556,558=>778,559=>556,560=>778,561=>556,562=>667,563=>500,1548=>202,1563=>202,1567=>402,1569=>399,1570=>173,1571=>166,1572=>371,1573=>171,1574=>486,1575=>171,1576=>806,1577=>459,1578=>806,1579=>808,1580=>439,1581=>438,1582=>438,1583=>414,1584=>413,1585=>223,1586=>221,1587=>1024,1588=>1022,1589=>953,1590=>951,1591=>637,1592=>637,1593=>438,1594=>443,1600=>147,1601=>776,1602=>561,1603=>808,1604=>565,1605=>409,1606=>536,1607=>459,1608=>369,1609=>495,1610=>494,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1632=>467,1633=>391,1634=>467,1635=>467,1636=>467,1637=>467,1638=>467,1639=>467,1640=>467,1641=>467,1642=>508,1645=>332,7680=>667,7681=>556,7682=>667,7683=>556,7684=>667,7685=>556,7686=>667,7687=>556,7688=>722,7689=>500,7690=>722,7691=>556,7692=>722,7693=>556,7694=>722,7695=>556,7696=>722,7697=>556,7698=>722,7699=>556,7700=>667,7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667,7707=>556,7708=>667,7709=>556,7710=>611,7711=>278,7712=>778,7713=>556,7714=>722,7715=>556,7716=>722,7717=>556,7718=>722,7719=>556,7720=>722,7721=>556,7722=>722,7723=>556,7724=>278,7725=>222,7726=>278,7727=>278,7728=>667,7729=>500,7730=>667,7731=>500,7732=>667,7733=>500,7734=>556,7735=>222,7736=>556,7737=>222,7738=>556,7739=>222,7740=>556,7741=>222,7742=>832,7743=>832,7744=>832,7745=>832,7746=>832,7747=>832,7748=>722,7749=>556,7750=>722,7751=>556,7752=>722,7753=>556,7754=>722,7755=>556,7756=>778,7757=>556,7758=>778,7759=>556,7760=>778,7761=>556,7762=>778,7763=>556,7764=>667,7765=>556,7766=>667,7767=>556,7768=>722,7769=>332,7770=>722,7771=>332,7772=>722,7773=>332,7774=>722,7775=>332,7776=>667,7777=>500,7778=>667,7779=>500,7780=>667,7781=>500,7782=>667,7783=>500,7784=>667,7785=>500,7786=>611,7787=>278,7788=>611,7789=>278,7790=>611,7791=>278,7792=>611,7793=>278,7794=>722,7795=>556,7796=>722,7797=>556,7798=>722,7799=>556,7800=>722,7801=>556,7802=>722,7803=>556,7804=>667,7805=>500,7806=>667,7807=>500,7808=>944,7809=>722,7810=>944,7811=>722,7812=>944,7813=>722,7814=>944,7815=>722,7816=>944,7817=>722,7818=>667,7819=>500,7820=>667,7821=>500,7822=>667,7823=>500,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500,7830=>556,7831=>278,7832=>722,7833=>500,7835=>278,7840=>667,7841=>556,7842=>667,7843=>556,7844=>667,7845=>556,7846=>667,7847=>556,7848=>667,7849=>556,7850=>667,7851=>556,7852=>667,7853=>556,7854=>667,7855=>556,7856=>667,7857=>556,7858=>667,7859=>556,7860=>667,7861=>556,7862=>667,7863=>556,7864=>667,7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667,7871=>556,7872=>667,7873=>556,7874=>667,7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278,7881=>278,7882=>278,7883=>222,7884=>778,7885=>556,7886=>778,7887=>556,7888=>778,7889=>556,7890=>778,7891=>556,7892=>778,7893=>556,7894=>778,7895=>556,7896=>778,7897=>556,7898=>778,7899=>556,7900=>778,7901=>556,7902=>778,7903=>556,7904=>778,7905=>556,7906=>778,7907=>556,7908=>722,7909=>556,7910=>722,7911=>556,7912=>722,7913=>556,7914=>722,7915=>556,7916=>722,7917=>556,7918=>722,7919=>556,7920=>722,7921=>556,7922=>667,7923=>500,7924=>667,7925=>500,7926=>667,7927=>500,7928=>667,7929=>500,8204=>0,8205=>0,8206=>0,8207=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,64256=>407,64257=>366,64258=>366,64259=>569,64260=>569,64261=>407,64262=>569,64606=>0,64607=>0,64608=>0,64609=>0,64610=>0,64611=>0,64830=>457,64831=>457,65010=>879,65152=>403,65153=>174,65154=>196,65155=>169,65156=>192,65157=>362,65158=>377,65159=>169,65160=>193,65161=>491,65162=>488,65163=>244,65164=>244,65165=>173,65166=>192,65167=>810,65168=>806,65169=>244,65170=>251,65171=>461,65172=>462,65173=>810,65174=>807,65175=>292,65176=>293,65177=>813,65178=>807,65179=>277,65180=>294,65181=>437,65182=>451,65183=>439,65184=>441,65185=>439,65186=>449,65187=>441,65188=>441,65189=>439,65190=>446,65191=>439,65192=>441,65193=>418,65194=>427,65195=>415,65196=>426,65197=>226,65198=>224,65199=>222,65200=>224,65201=>1024,65202=>1022,65203=>757,65204=>770,65205=>1023,65206=>1025,65207=>756,65208=>770,65209=>946,65210=>948,65211=>782,65212=>786,65213=>956,65214=>953,65215=>779,65216=>787,65217=>633,65218=>648,65219=>613,65220=>643,65221=>641,65222=>643,65223=>613,65224=>646,65225=>441,65226=>433,65227=>373,65228=>423,65229=>437,65230=>438,65231=>379,65232=>425,65233=>762,65234=>770,65235=>416,65236=>418,65237=>563,65238=>568,65239=>426,65240=>423,65241=>808,65242=>812,65243=>558,65244=>545,65245=>564,65246=>585,65247=>207,65248=>253,65249=>407,65250=>408,65251=>352,65252=>354,65253=>537,65254=>541,65255=>244,65256=>244,65257=>452,65258=>463,65259=>512,65260=>516,65261=>366,65262=>368,65263=>487,65264=>488,65265=>491,65266=>486,65267=>293,65268=>294,65269=>514,65270=>527,65271=>518,65272=>522,65273=>512,65274=>536,65275=>514,65276=>522,65535=>367);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/aealarabiya.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/aealarabiya.z
new file mode 100644
index 00000000..fc16a2a1
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/aealarabiya.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/aefurat.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/aefurat.ctg.z
new file mode 100644
index 00000000..1b5a507c
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/aefurat.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/aefurat.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/aefurat.php
new file mode 100644
index 00000000..cea052a8
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/aefurat.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='Furat';
+$up=-136;
+$ut=64;
+$dw=367;
+$diff='';
+$originalsize=171060;
+$enc='';
+$file='aefurat.z';
+$ctg='aefurat.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-272 -501 1319 1114]','ItalicAngle'=>0,'Ascent'=>1162,'Descent'=>-508,'Leading'=>200,'CapHeight'=>662,'XHeight'=>450,'StemV'=>39,'StemH'=>17,'AvgWidth'=>401,'MaxWidth'=>1332,'MissingWidth'=>367);
+$cw=array(0=>0,12=>318,32=>250,33=>332,34=>408,35=>500,36=>500,37=>832,38=>778,39=>180,40=>332,41=>332,42=>500,43=>564,44=>250,45=>332,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>278,59=>278,60=>564,61=>564,62=>564,63=>444,64=>921,65=>722,66=>667,67=>667,68=>722,69=>611,70=>556,71=>722,72=>722,73=>332,74=>388,75=>722,76=>611,77=>888,78=>722,79=>722,80=>556,81=>722,82=>667,83=>556,84=>611,85=>722,86=>722,87=>944,88=>722,89=>722,90=>611,91=>332,92=>278,93=>332,94=>468,95=>500,96=>332,97=>444,98=>500,99=>444,100=>500,101=>444,102=>332,103=>500,104=>500,105=>278,106=>278,107=>500,108=>278,109=>778,110=>500,111=>500,112=>500,113=>500,114=>332,115=>388,116=>278,117=>500,118=>500,119=>722,120=>500,121=>500,122=>444,123=>480,124=>200,125=>480,126=>541,160=>250,161=>332,162=>500,163=>500,164=>500,165=>500,166=>200,167=>500,168=>332,169=>760,170=>276,171=>500,172=>564,173=>332,174=>760,175=>332,176=>400,177=>564,178=>300,179=>300,180=>332,181=>534,182=>452,183=>250,184=>332,185=>300,186=>310,187=>500,188=>750,189=>750,190=>750,191=>444,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>888,199=>667,200=>611,201=>611,202=>611,203=>611,204=>332,205=>332,206=>332,207=>332,208=>722,209=>722,210=>722,211=>722,212=>722,213=>722,214=>722,215=>564,216=>722,217=>722,218=>722,219=>722,220=>722,221=>722,222=>556,223=>500,224=>444,225=>444,226=>444,227=>444,228=>444,229=>444,230=>667,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>500,242=>500,243=>500,244=>500,245=>500,246=>500,247=>564,248=>500,249=>500,250=>500,251=>500,252=>500,253=>500,254=>500,255=>500,256=>722,257=>444,258=>722,259=>444,260=>722,261=>444,262=>667,263=>444,264=>667,265=>444,266=>667,267=>444,268=>667,269=>444,270=>722,271=>600,272=>722,273=>500,274=>611,275=>444,276=>611,277=>444,278=>611,279=>444,280=>611,281=>444,282=>611,283=>444,284=>722,285=>500,286=>722,287=>500,288=>722,289=>500,290=>722,291=>500,292=>722,293=>500,294=>722,295=>548,296=>332,297=>278,298=>332,299=>278,300=>332,301=>278,302=>332,303=>278,304=>332,305=>278,306=>722,307=>556,308=>388,309=>203,310=>722,311=>500,312=>500,313=>611,314=>278,315=>611,316=>278,317=>611,318=>348,319=>611,320=>444,321=>611,322=>278,323=>722,324=>500,325=>722,326=>500,327=>722,328=>500,329=>556,330=>722,331=>500,332=>722,333=>500,334=>722,335=>500,336=>722,337=>500,338=>888,339=>722,340=>667,341=>332,342=>667,343=>332,344=>667,345=>332,346=>556,347=>388,348=>556,349=>388,350=>556,351=>388,352=>556,353=>388,354=>611,355=>278,356=>611,357=>278,358=>611,359=>278,360=>722,361=>500,362=>722,363=>500,364=>722,365=>500,366=>722,367=>500,368=>722,369=>500,370=>722,371=>500,372=>944,373=>722,374=>722,375=>500,376=>722,377=>611,378=>444,379=>611,380=>444,381=>611,382=>444,383=>332,384=>500,385=>667,386=>646,387=>500,388=>646,389=>500,390=>667,391=>667,392=>444,393=>722,394=>722,395=>646,396=>500,397=>534,398=>611,399=>722,400=>518,401=>556,402=>332,403=>722,404=>664,405=>728,406=>332,407=>332,408=>810,409=>500,410=>278,411=>480,412=>944,413=>722,414=>500,415=>726,416=>722,417=>500,418=>1042,419=>778,420=>556,421=>500,422=>667,423=>556,424=>388,425=>627,426=>592,427=>278,428=>611,429=>278,430=>611,431=>722,432=>500,433=>757,434=>722,435=>822,436=>667,437=>611,438=>444,439=>556,440=>556,441=>388,442=>500,443=>500,444=>614,445=>438,446=>421,447=>500,448=>200,449=>400,450=>600,451=>332,452=>1332,453=>1166,454=>944,455=>1000,456=>888,457=>556,458=>1111,459=>1000,460=>778,461=>722,462=>444,463=>332,464=>278,465=>722,466=>500,467=>722,468=>500,469=>722,470=>500,471=>722,472=>500,473=>722,474=>500,475=>722,476=>500,477=>444,478=>722,479=>444,480=>722,481=>444,482=>888,483=>667,484=>722,485=>500,486=>722,487=>500,488=>722,489=>500,490=>722,491=>500,492=>722,493=>500,494=>556,495=>388,496=>278,497=>1332,498=>1166,499=>944,500=>722,501=>500,502=>944,504=>722,505=>500,506=>722,507=>444,508=>888,509=>667,510=>722,511=>500,512=>722,513=>444,514=>722,515=>444,516=>611,517=>444,518=>611,519=>444,520=>332,521=>278,522=>332,523=>278,524=>722,525=>500,526=>722,527=>500,528=>667,529=>332,530=>667,531=>332,532=>722,533=>500,534=>722,535=>500,536=>556,537=>388,538=>611,539=>278,542=>722,543=>500,550=>722,551=>444,552=>611,553=>444,554=>722,555=>500,556=>722,557=>500,558=>722,559=>500,560=>722,561=>500,562=>722,563=>500,565=>597,567=>278,1548=>278,1563=>278,1567=>322,1569=>278,1570=>343,1571=>298,1572=>442,1573=>343,1574=>634,1575=>298,1576=>806,1577=>324,1578=>808,1579=>815,1580=>616,1581=>616,1582=>625,1583=>407,1584=>408,1585=>459,1586=>469,1587=>880,1588=>907,1589=>1099,1590=>1077,1591=>750,1592=>755,1593=>522,1594=>529,1600=>439,1601=>806,1602=>584,1603=>782,1604=>589,1605=>413,1606=>623,1607=>332,1608=>435,1609=>634,1610=>634,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1632=>419,1633=>419,1634=>419,1635=>419,1636=>419,1637=>419,1638=>419,1639=>419,1640=>419,1641=>419,1642=>462,1645=>398,7680=>722,7681=>444,7682=>667,7683=>500,7684=>667,7685=>500,7686=>667,7687=>500,7688=>667,7689=>444,7690=>722,7691=>500,7692=>722,7693=>500,7694=>722,7695=>500,7696=>722,7697=>500,7698=>722,7699=>500,7700=>611,7701=>444,7702=>611,7703=>444,7704=>611,7705=>444,7706=>611,7707=>444,7708=>611,7709=>444,7710=>556,7711=>332,7712=>722,7713=>500,7714=>722,7715=>500,7716=>722,7717=>500,7718=>722,7719=>500,7720=>722,7721=>500,7722=>722,7723=>500,7724=>332,7725=>278,7726=>332,7727=>278,7728=>722,7729=>500,7730=>722,7731=>500,7732=>722,7733=>500,7734=>611,7735=>278,7736=>611,7737=>278,7738=>611,7739=>278,7740=>611,7741=>278,7742=>888,7743=>778,7744=>888,7745=>778,7746=>888,7747=>778,7748=>722,7749=>500,7750=>722,7751=>500,7752=>722,7753=>500,7754=>722,7755=>500,7756=>722,7757=>500,7758=>722,7759=>500,7760=>722,7761=>500,7762=>722,7763=>500,7764=>556,7765=>500,7766=>556,7767=>500,7768=>667,7769=>332,7770=>667,7771=>332,7772=>667,7773=>332,7774=>667,7775=>332,7776=>556,7777=>388,7778=>556,7779=>388,7780=>556,7781=>388,7782=>556,7783=>388,7784=>556,7785=>388,7786=>611,7787=>278,7788=>611,7789=>278,7790=>611,7791=>278,7792=>611,7793=>278,7794=>722,7795=>500,7796=>722,7797=>500,7798=>722,7799=>500,7800=>722,7801=>500,7802=>722,7803=>500,7804=>722,7805=>500,7806=>722,7807=>500,7808=>944,7809=>722,7810=>944,7811=>722,7812=>944,7813=>722,7814=>944,7815=>722,7816=>944,7817=>722,7818=>722,7819=>500,7820=>722,7821=>500,7822=>722,7823=>500,7824=>611,7825=>444,7826=>611,7827=>444,7828=>611,7829=>444,7830=>500,7831=>278,7832=>722,7833=>500,7834=>444,7835=>332,7840=>722,7841=>444,7842=>807,7843=>528,7844=>722,7845=>444,7846=>722,7847=>444,7848=>807,7849=>528,7850=>722,7851=>444,7852=>722,7853=>444,7854=>722,7855=>444,7856=>722,7857=>444,7858=>807,7859=>528,7860=>722,7861=>444,7862=>722,7863=>444,7864=>611,7865=>444,7866=>696,7867=>528,7868=>611,7869=>444,7870=>611,7871=>444,7872=>611,7873=>444,7874=>696,7875=>528,7876=>611,7877=>444,7878=>611,7879=>444,7880=>332,7881=>278,7882=>332,7883=>278,7884=>722,7885=>500,7886=>807,7887=>584,7888=>722,7889=>500,7890=>722,7891=>500,7892=>807,7893=>584,7894=>722,7895=>500,7896=>722,7897=>500,7898=>722,7899=>500,7900=>722,7901=>500,7902=>807,7903=>584,7904=>722,7905=>500,7906=>722,7907=>500,7908=>722,7909=>500,7910=>807,7911=>584,7912=>722,7913=>500,7914=>722,7915=>500,7916=>807,7917=>584,7918=>722,7919=>500,7920=>722,7921=>500,7922=>722,7923=>500,7924=>722,7925=>500,7926=>807,7927=>584,7928=>722,7929=>500,8204=>0,8205=>0,8206=>0,8207=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,64256=>443,64257=>407,64258=>407,64259=>603,64260=>601,64262=>496,64830=>554,64831=>554,65010=>719,65152=>329,65153=>366,65154=>391,65155=>296,65156=>339,65157=>439,65158=>448,65159=>342,65160=>354,65161=>659,65162=>538,65163=>267,65164=>253,65165=>298,65166=>354,65167=>808,65168=>777,65169=>274,65170=>253,65171=>337,65172=>438,65173=>818,65174=>784,65175=>293,65176=>296,65177=>818,65178=>784,65179=>293,65180=>293,65181=>608,65182=>568,65183=>599,65184=>539,65185=>606,65186=>568,65187=>606,65188=>539,65189=>616,65190=>563,65191=>599,65192=>539,65193=>411,65194=>402,65195=>423,65196=>396,65197=>459,65198=>464,65199=>464,65200=>469,65201=>887,65202=>916,65203=>623,65204=>640,65205=>883,65206=>914,65207=>621,65208=>640,65209=>1080,65210=>1084,65211=>772,65212=>761,65213=>1075,65214=>1084,65215=>767,65216=>761,65217=>762,65218=>729,65219=>654,65220=>616,65221=>762,65222=>722,65223=>642,65224=>616,65225=>522,65226=>422,65227=>553,65228=>387,65229=>529,65230=>422,65231=>541,65232=>387,65233=>815,65234=>791,65235=>346,65236=>315,65237=>587,65238=>584,65239=>348,65240=>315,65241=>806,65242=>767,65243=>408,65244=>410,65245=>589,65246=>616,65247=>278,65248=>245,65249=>407,65250=>472,65251=>439,65252=>423,65253=>611,65254=>616,65255=>281,65256=>253,65257=>332,65258=>444,65259=>507,65260=>415,65261=>439,65262=>449,65263=>637,65264=>546,65265=>639,65266=>546,65267=>293,65268=>282,65269=>569,65270=>744,65271=>577,65272=>744,65273=>579,65274=>744,65275=>537,65276=>744,65535=>367);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/aefurat.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/aefurat.z
new file mode 100644
index 00000000..5089d15a
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/aefurat.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/cid0cs.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/cid0cs.php
new file mode 100644
index 00000000..84e80ee8
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/cid0cs.php
@@ -0,0 +1,16 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='cidfont0';
+$name='ArialUnicodeMS';
+$up=-100;
+$ut=50;
+$dw=1000;
+$diff='';
+$originalsize=23275812;
+// Chinese Simplified
+$enc='UniGB-UTF16-H';
+$cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'GB1','Supplement'=>2);
+include(dirname(__FILE__).'/uni2cid_ag15.php');
+$desc=array('Flags'=>32,'FontBBox'=>'[-1011 -330 2260 1078]','ItalicAngle'=>0,'Ascent'=>1069,'Descent'=>-271,'Leading'=>0,'CapHeight'=>716,'XHeight'=>518,'StemV'=>34,'StemH'=>15,'AvgWidth'=>441,'MaxWidth'=>2259,'MissingWidth'=>1000);
+$cw=array(0=>1000,32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584,62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278,92=>278,93=>278,94=>469,95=>500,96=>333,97=>556,98=>556,99=>500,100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556,112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>500,176=>400,177=>584,178=>333,179=>333,180=>333,181=>556,182=>537,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834,190=>834,191=>611,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278,238=>278,239=>278,240=>556,241=>556,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>556,255=>500,256=>667,257=>556,258=>667,259=>556,260=>667,261=>556,262=>722,263=>500,264=>722,265=>500,266=>722,267=>500,268=>722,269=>500,270=>722,271=>627,272=>722,273=>556,274=>667,275=>556,276=>667,277=>556,278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>556,286=>778,287=>556,288=>778,289=>556,290=>778,291=>556,292=>722,293=>556,294=>722,295=>556,296=>278,297=>222,298=>278,299=>222,300=>278,301=>222,302=>278,303=>222,304=>278,305=>278,306=>751,307=>444,308=>500,309=>222,310=>667,311=>500,312=>437,313=>556,314=>222,315=>556,316=>222,317=>556,318=>222,319=>556,320=>318,321=>556,322=>222,323=>722,324=>556,325=>722,326=>556,327=>722,328=>556,329=>626,330=>723,331=>556,332=>778,333=>556,334=>778,335=>556,336=>778,337=>556,338=>1000,339=>944,340=>722,341=>333,342=>722,343=>333,344=>722,345=>333,346=>667,347=>500,348=>667,349=>500,350=>667,351=>500,352=>667,353=>500,354=>611,355=>278,356=>611,357=>406,358=>611,359=>278,360=>722,361=>556,362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556,372=>944,373=>722,374=>667,375=>500,376=>667,377=>611,378=>500,379=>611,380=>500,381=>611,382=>500,383=>222,384=>556,385=>740,386=>655,387=>556,388=>556,389=>556,390=>722,391=>766,392=>579,393=>722,394=>789,395=>655,396=>556,397=>557,398=>667,399=>729,400=>604,401=>611,402=>278,403=>791,404=>649,405=>806,406=>245,407=>322,408=>667,409=>500,410=>322,411=>500,412=>833,413=>722,414=>556,415=>778,416=>776,417=>556,418=>1019,419=>782,420=>735,421=>556,422=>722,423=>667,424=>500,425=>602,426=>366,427=>278,428=>571,429=>278,430=>611,431=>776,432=>620,433=>748,434=>667,435=>752,436=>615,437=>611,438=>500,439=>628,440=>628,441=>526,442=>480,443=>556,444=>556,445=>526,446=>556,447=>556,448=>278,449=>464,450=>474,451=>278,452=>1333,453=>1222,454=>1056,455=>1030,456=>778,457=>444,458=>1222,459=>944,460=>778,461=>667,462=>556,463=>278,464=>278,465=>778,466=>556,467=>722,468=>556,469=>722,470=>556,471=>722,472=>556,473=>722,474=>556,475=>722,476=>556,477=>556,478=>667,479=>556,480=>667,481=>556,482=>1000,483=>889,484=>778,485=>556,486=>778,487=>556,488=>667,489=>500,490=>778,491=>556,492=>778,493=>556,494=>534,495=>534,496=>222,497=>1333,498=>1222,499=>1056,500=>778,501=>556,506=>667,507=>556,508=>1000,509=>889,510=>778,511=>611,512=>667,513=>556,514=>667,515=>556,516=>667,517=>556,518=>667,519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>556,526=>778,527=>556,528=>722,529=>333,530=>722,531=>333,532=>722,533=>556,534=>722,535=>556,592=>556,593=>556,594=>556,595=>556,596=>500,597=>500,598=>556,599=>556,600=>556,601=>556,602=>777,603=>485,604=>485,605=>686,606=>519,607=>260,608=>556,609=>556,610=>557,611=>500,612=>500,613=>556,614=>556,615=>556,616=>242,617=>282,618=>356,619=>356,620=>425,621=>222,622=>635,623=>833,624=>833,625=>833,626=>556,627=>556,628=>558,629=>556,630=>715,631=>674,632=>558,633=>333,634=>333,635=>333,636=>333,637=>333,638=>312,639=>312,640=>530,641=>530,642=>500,643=>216,644=>276,645=>216,646=>222,647=>278,648=>278,649=>596,650=>558,651=>556,652=>500,653=>722,654=>500,655=>500,656=>500,657=>564,658=>530,659=>530,660=>464,661=>464,662=>464,663=>500,664=>614,665=>526,666=>519,667=>557,668=>558,669=>222,670=>500,671=>416,672=>556,673=>464,674=>464,675=>966,676=>966,677=>1030,678=>689,679=>484,680=>718,688=>326,689=>326,690=>153,691=>201,692=>201,693=>201,694=>304,695=>389,696=>278,697=>222,698=>372,699=>222,700=>222,701=>222,702=>222,703=>222,704=>250,705=>250,706=>320,707=>320,708=>320,709=>320,710=>333,711=>333,712=>192,713=>333,714=>333,715=>333,716=>192,717=>333,718=>333,719=>333,720=>300,721=>300,722=>222,723=>222,724=>340,725=>340,726=>280,727=>362,728=>333,729=>333,730=>333,731=>333,732=>333,733=>333,734=>333,736=>278,737=>153,738=>270,739=>274,740=>325,741=>360,742=>360,743=>360,744=>360,745=>360,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,864=>0,865=>0,884=>308,885=>308,890=>278,894=>278,900=>278,901=>278,902=>667,903=>278,904=>704,905=>759,906=>315,908=>778,910=>746,911=>758,912=>222,913=>667,914=>667,915=>550,916=>682,917=>667,918=>611,919=>722,920=>778,921=>278,922=>667,923=>667,924=>833,925=>722,926=>650,927=>778,928=>722,929=>667,931=>602,932=>611,933=>667,934=>808,935=>667,936=>804,937=>758,938=>278,939=>667,940=>576,941=>434,942=>556,943=>222,944=>551,945=>576,946=>563,947=>500,948=>557,949=>434,950=>440,951=>556,952=>556,953=>222,954=>498,955=>500,956=>553,957=>500,958=>432,959=>556,960=>678,961=>571,962=>472,963=>619,964=>382,965=>551,966=>649,967=>522,968=>729,969=>766,970=>222,971=>551,972=>556,973=>551,974=>766,976=>563,977=>616,978=>631,979=>726,980=>631,981=>644,982=>781,986=>722,988=>578,990=>570,992=>692,994=>880,995=>833,996=>684,997=>558,998=>680,999=>529,1000=>557,1001=>505,1002=>623,1003=>603,1004=>610,1005=>611,1006=>568,1007=>434,1008=>600,1009=>571,1010=>500,1011=>222,1025=>667,1026=>865,1027=>567,1028=>717,1029=>667,1030=>278,1031=>278,1032=>500,1033=>1105,1034=>1009,1035=>867,1036=>584,1038=>635,1039=>723,1040=>667,1041=>655,1042=>667,1043=>567,1044=>677,1045=>667,1046=>923,1047=>604,1048=>722,1049=>722,1050=>584,1051=>705,1052=>833,1053=>722,1054=>778,1055=>723,1056=>667,1057=>722,1058=>611,1059=>635,1060=>760,1061=>667,1062=>740,1063=>684,1064=>920,1065=>939,1066=>793,1067=>883,1068=>655,1069=>717,1070=>1006,1071=>722,1072=>556,1073=>573,1074=>531,1075=>383,1076=>583,1077=>556,1078=>669,1079=>458,1080=>559,1081=>559,1082=>437,1083=>571,1084=>683,1085=>552,1086=>556,1087=>542,1088=>556,1089=>500,1090=>458,1091=>500,1092=>823,1093=>500,1094=>562,1095=>533,1096=>802,1097=>823,1098=>620,1099=>717,1100=>523,1101=>510,1102=>744,1103=>542,1105=>556,1106=>556,1107=>383,1108=>510,1109=>500,1110=>222,1111=>278,1112=>222,1113=>873,1114=>811,1115=>556,1116=>437,1118=>500,1119=>542,1120=>976,1121=>766,1122=>656,1123=>521,1124=>950,1125=>694,1126=>667,1127=>597,1128=>952,1129=>817,1130=>654,1131=>600,1132=>932,1133=>817,1134=>604,1135=>458,1136=>804,1137=>729,1138=>778,1139=>556,1140=>667,1141=>500,1142=>667,1143=>500,1144=>1279,1145=>1060,1146=>778,1147=>556,1148=>976,1149=>766,1150=>976,1151=>766,1152=>722,1153=>514,1154=>686,1155=>334,1156=>382,1157=>334,1158=>334,1168=>435,1169=>339,1170=>567,1171=>383,1172=>656,1173=>556,1174=>923,1175=>669,1176=>604,1177=>458,1178=>584,1179=>437,1180=>584,1181=>437,1182=>584,1183=>437,1184=>764,1185=>537,1186=>741,1187=>573,1188=>900,1189=>670,1190=>736,1191=>560,1192=>778,1193=>560,1194=>722,1195=>500,1196=>611,1197=>458,1198=>667,1199=>500,1200=>667,1201=>500,1202=>667,1203=>500,1204=>916,1205=>661,1206=>684,1207=>533,1208=>684,1209=>533,1210=>684,1211=>556,1212=>829,1213=>667,1214=>829,1215=>667,1216=>278,1217=>923,1218=>669,1219=>584,1220=>437,1223=>735,1224=>570,1227=>684,1228=>533,1232=>667,1233=>556,1234=>667,1235=>556,1236=>1000,1237=>889,1238=>667,1239=>556,1240=>729,1241=>556,1242=>729,1243=>556,1244=>923,1245=>669,1246=>604,1247=>458,1248=>604,1249=>492,1250=>722,1251=>559,1252=>722,1253=>559,1254=>778,1255=>556,1256=>778,1257=>556,1258=>778,1259=>556,1262=>635,1263=>500,1264=>635,1265=>500,1266=>635,1267=>500,1268=>684,1269=>533,1272=>883,1273=>717,1329=>635,1330=>531,1331=>583,1332=>583,1333=>531,1334=>531,1335=>427,1336=>531,1337=>750,1338=>635,1339=>531,1340=>375,1341=>583,1342=>698,1343=>531,1344=>427,1345=>531,1346=>583,1347=>531,1348=>635,1349=>698,1350=>635,1351=>635,1352=>531,1353=>531,1354=>698,1355=>531,1356=>635,1357=>531,1358=>698,1359=>583,1360=>479,1361=>583,1362=>531,1363=>698,1364=>698,1365=>635,1366=>750,1369=>271,1370=>271,1371=>150,1372=>300,1373=>271,1374=>271,1375=>420,1377=>583,1378=>427,1379=>427,1380=>427,1381=>427,1382=>427,1383=>427,1384=>427,1385=>459,1386=>427,1387=>427,1388=>323,1389=>531,1390=>427,1391=>427,1392=>427,1393=>427,1394=>427,1395=>427,1396=>427,1397=>271,1398=>427,1399=>375,1400=>427,1401=>375,1402=>583,1403=>427,1404=>427,1405=>427,1406=>427,1407=>583,1408=>427,1409=>427,1410=>323,1411=>583,1412=>375,1413=>375,1414=>583,1415=>527,1417=>271,1425=>360,1426=>360,1427=>360,1428=>360,1429=>360,1430=>360,1431=>360,1432=>360,1433=>360,1434=>360,1435=>360,1436=>360,1437=>360,1438=>360,1439=>360,1440=>360,1441=>360,1443=>360,1444=>360,1445=>360,1446=>360,1447=>360,1448=>360,1449=>360,1450=>360,1451=>360,1452=>360,1453=>360,1454=>360,1455=>360,1456=>360,1457=>360,1458=>360,1459=>360,1460=>360,1461=>360,1462=>360,1463=>360,1464=>360,1465=>360,1467=>360,1468=>360,1469=>360,1470=>366,1471=>360,1472=>225,1473=>360,1474=>360,1475=>238,1476=>360,1488=>577,1489=>563,1490=>411,1491=>512,1492=>594,1493=>316,1494=>326,1495=>594,1496=>594,1497=>316,1498=>507,1499=>527,1500=>484,1501=>594,1502=>594,1503=>316,1504=>338,1505=>604,1506=>550,1507=>567,1508=>569,1509=>505,1510=>514,1511=>583,1512=>507,1513=>700,1514=>633,1520=>590,1521=>590,1522=>590,1523=>216,1524=>412,1548=>278,1563=>278,1567=>556,1569=>529,1570=>243,1571=>243,1572=>470,1573=>243,1574=>731,1575=>243,1576=>771,1577=>514,1578=>771,1579=>771,1580=>544,1581=>544,1582=>544,1583=>430,1584=>430,1585=>421,1586=>421,1587=>1194,1588=>1194,1589=>1291,1590=>1291,1591=>843,1592=>843,1593=>594,1594=>594,1600=>279,1601=>957,1602=>800,1603=>757,1604=>662,1605=>589,1606=>692,1607=>514,1608=>470,1609=>731,1610=>731,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1632=>480,1633=>480,1634=>480,1635=>480,1636=>480,1637=>480,1638=>480,1639=>480,1640=>480,1641=>480,1642=>547,1643=>278,1644=>278,1645=>438,1648=>0,1649=>243,1650=>243,1651=>243,1652=>0,1653=>380,1654=>470,1655=>548,1656=>772,1657=>771,1658=>771,1659=>771,1660=>771,1661=>771,1662=>771,1663=>771,1664=>771,1665=>544,1666=>544,1667=>544,1668=>544,1669=>544,1670=>544,1671=>544,1672=>430,1673=>430,1674=>430,1675=>430,1676=>430,1677=>430,1678=>430,1679=>430,1680=>430,1681=>421,1682=>421,1683=>421,1684=>421,1685=>421,1686=>419,1687=>421,1688=>421,1689=>421,1690=>1194,1691=>1194,1692=>1194,1693=>1291,1694=>1291,1695=>843,1696=>594,1697=>957,1698=>957,1699=>957,1700=>957,1701=>957,1702=>957,1703=>800,1704=>800,1705=>828,1706=>1058,1707=>828,1708=>757,1709=>757,1710=>757,1711=>828,1712=>828,1713=>828,1714=>828,1715=>828,1716=>828,1717=>662,1718=>662,1719=>662,1722=>692,1723=>692,1724=>692,1725=>692,1726=>706,1728=>514,1729=>509,1730=>509,1731=>509,1732=>470,1733=>470,1734=>470,1735=>470,1736=>470,1737=>470,1738=>470,1739=>470,1740=>731,1741=>841,1742=>731,1744=>731,1745=>731,1746=>550,1747=>550,1748=>279,1749=>514,1750=>726,1751=>558,1752=>321,1753=>318,1754=>342,1755=>373,1756=>716,1757=>688,1758=>852,1759=>288,1760=>288,1761=>388,1762=>350,1763=>716,1764=>146,1765=>282,1766=>339,1767=>339,1768=>415,1769=>514,1770=>220,1771=>220,1772=>220,1773=>350,1776=>480,1777=>480,1778=>480,1779=>480,1780=>480,1781=>480,1782=>480,1783=>480,1784=>480,1785=>480,2305=>0,2306=>0,2307=>294,2309=>693,2310=>910,2311=>533,2312=>533,2313=>590,2314=>713,2315=>920,2316=>677,2317=>611,2318=>611,2319=>611,2320=>611,2321=>910,2322=>910,2323=>910,2324=>910,2325=>667,2326=>732,2327=>593,2328=>639,2329=>624,2330=>688,2331=>713,2332=>688,2333=>712,2334=>697,2335=>502,2336=>533,2337=>583,2338=>523,2339=>693,2340=>585,2341=>638,2342=>533,2343=>640,2344=>585,2345=>585,2346=>565,2347=>699,2348=>592,2349=>689,2350=>633,2351=>600,2352=>486,2353=>486,2354=>680,2355=>730,2356=>730,2357=>592,2358=>684,2359=>608,2360=>646,2361=>546,2364=>0,2365=>373,2366=>319,2367=>319,2368=>319,2369=>0,2370=>0,2371=>0,2372=>0,2373=>0,2374=>0,2375=>0,2376=>0,2377=>319,2378=>319,2379=>319,2380=>319,2381=>0,2384=>884,2385=>0,2386=>0,2387=>0,2388=>0,2392=>667,2393=>732,2394=>593,2395=>688,2396=>583,2397=>523,2398=>699,2399=>600,2400=>920,2401=>677,2402=>0,2403=>0,2404=>331,2405=>513,2406=>639,2407=>639,2408=>639,2409=>639,2410=>639,2411=>639,2412=>639,2413=>639,2414=>639,2415=>639,2416=>362,2433=>0,2434=>430,2435=>430,2437=>786,2438=>1030,2439=>582,2440=>603,2441=>648,2442=>757,2443=>758,2444=>630,2447=>685,2448=>746,2451=>711,2452=>776,2453=>779,2454=>655,2455=>606,2456=>645,2457=>661,2458=>554,2459=>585,2460=>729,2461=>752,2462=>893,2463=>567,2464=>625,2465=>648,2466=>567,2467=>598,2468=>680,2469=>645,2470=>609,2471=>596,2472=>595,2474=>635,2475=>780,2476=>593,2477=>677,2478=>621,2479=>601,2480=>593,2482=>640,2486=>598,2487=>596,2488=>637,2489=>582,2492=>0,2494=>245,2495=>245,2496=>245,2497=>0,2498=>0,2499=>0,2500=>0,2503=>309,2504=>309,2507=>932,2508=>932,2509=>0,2519=>245,2524=>648,2525=>553,2527=>596,2528=>758,2529=>630,2530=>0,2531=>335,2534=>610,2535=>559,2536=>595,2537=>711,2538=>610,2539=>661,2540=>661,2541=>559,2542=>661,2543=>600,2544=>593,2545=>593,2546=>601,2547=>567,2548=>601,2549=>699,2550=>661,2551=>267,2552=>610,2553=>424,2554=>548,2562=>0,2565=>691,2566=>936,2567=>803,2568=>803,2569=>678,2570=>678,2575=>557,2576=>691,2579=>678,2580=>691,2581=>602,2582=>567,2583=>641,2584=>688,2585=>565,2586=>592,2587=>603,2588=>591,2589=>541,2590=>558,2591=>543,2592=>581,2593=>596,2594=>640,2595=>640,2596=>591,2597=>564,2598=>640,2599=>564,2600=>581,2602=>564,2603=>551,2604=>560,2605=>549,2606=>558,2607=>652,2608=>540,2610=>677,2611=>677,2613=>601,2614=>558,2616=>558,2617=>549,2620=>0,2622=>246,2623=>246,2624=>246,2625=>0,2626=>0,2631=>0,2632=>0,2635=>0,2636=>0,2637=>0,2649=>567,2650=>690,2651=>591,2652=>591,2654=>581,2662=>591,2663=>591,2664=>591,2665=>591,2666=>591,2667=>591,2668=>591,2669=>591,2670=>591,2671=>591,2672=>0,2673=>0,2674=>557,2675=>678,2676=>894,2689=>0,2690=>0,2691=>300,2693=>781,2694=>1044,2695=>589,2696=>589,2697=>560,2698=>758,2699=>806,2701=>781,2703=>781,2704=>781,2705=>1044,2707=>1044,2708=>1044,2709=>413,2710=>773,2711=>606,2712=>558,2713=>483,2714=>600,2715=>691,2716=>811,2717=>647,2718=>651,2719=>453,2720=>450,2721=>425,2722=>478,2723=>694,2724=>534,2725=>553,2726=>446,2727=>541,2728=>582,2730=>572,2731=>437,2732=>663,2733=>756,2734=>594,2735=>493,2736=>392,2738=>613,2739=>656,2741=>538,2742=>611,2743=>507,2744=>663,2745=>587,2748=>0,2749=>478,2750=>273,2751=>273,2752=>273,2753=>0,2754=>0,2755=>0,2756=>0,2757=>0,2759=>0,2760=>0,2761=>273,2763=>273,2764=>273,2765=>0,2768=>843,2784=>893,2790=>625,2791=>625,2792=>625,2793=>625,2794=>625,2795=>625,2796=>625,2797=>625,2798=>625,2799=>625,2817=>0,2818=>306,2819=>391,2821=>590,2822=>808,2823=>658,2824=>658,2825=>633,2826=>654,2827=>636,2828=>540,2831=>560,2832=>938,2835=>600,2836=>973,2837=>603,2838=>620,2839=>620,2840=>605,2841=>712,2842=>579,2843=>579,2844=>593,2845=>564,2846=>581,2847=>604,2848=>578,2849=>579,2850=>579,2851=>607,2852=>579,2853=>587,2854=>579,2855=>602,2856=>579,2858=>605,2859=>728,2860=>579,2861=>643,2862=>605,2863=>628,2864=>619,2866=>653,2867=>593,2870=>620,2871=>605,2872=>605,2873=>579,2876=>0,2877=>333,2878=>218,2879=>0,2880=>294,2881=>0,2882=>0,2883=>0,2887=>479,2888=>479,2891=>1026,2892=>1026,2893=>0,2902=>0,2903=>218,2908=>579,2909=>579,2911=>599,2912=>636,2913=>540,2918=>578,2919=>480,2920=>480,2921=>622,2922=>506,2923=>605,2924=>529,2925=>548,2926=>512,2927=>528,2928=>561,2946=>0,2947=>742,2949=>1002,2950=>1118,2951=>994,2952=>660,2953=>1012,2954=>1231,2958=>726,2959=>731,2960=>870,2962=>763,2963=>763,2964=>1636,2965=>667,2969=>830,2970=>584,2972=>876,2974=>986,2975=>802,2979=>1295,2980=>656,2984=>630,2985=>1012,2986=>694,2990=>727,2991=>790,2992=>545,2993=>718,2994=>821,2995=>871,2996=>724,2997=>873,2999=>1087,3000=>1098,3001=>1274,3006=>547,3007=>172,3008=>93,3009=>519,3010=>814,3014=>748,3015=>681,3016=>956,3018=>1666,3019=>1666,3020=>1994,3021=>0,3031=>871,3047=>667,3048=>1012,3049=>751,3050=>740,3051=>924,3052=>884,3053=>726,3054=>1002,3055=>825,3056=>717,3057=>719,3058=>774,3073=>365,3074=>601,3075=>346,3077=>720,3078=>786,3079=>567,3080=>1159,3081=>690,3082=>1047,3083=>1299,3084=>913,3086=>625,3087=>625,3088=>712,3090=>655,3091=>655,3092=>862,3093=>515,3094=>680,3095=>526,3096=>943,3097=>655,3098=>684,3099=>684,3100=>670,3101=>1205,3102=>732,3103=>888,3104=>597,3105=>709,3106=>709,3107=>809,3108=>715,3109=>702,3110=>702,3111=>702,3112=>607,3114=>623,3115=>623,3116=>681,3117=>681,3118=>932,3119=>1203,3120=>597,3121=>893,3122=>631,3123=>608,3125=>620,3126=>541,3127=>667,3128=>640,3129=>911,3134=>644,3135=>298,3136=>298,3137=>361,3138=>682,3139=>342,3140=>704,3142=>624,3143=>624,3144=>900,3146=>849,3147=>849,3148=>976,3149=>669,3157=>298,3158=>119,3168=>1620,3169=>1281,3174=>840,3175=>840,3176=>840,3177=>840,3178=>840,3179=>840,3180=>840,3181=>840,3182=>840,3183=>840,3202=>440,3203=>251,3205=>654,3206=>654,3207=>631,3208=>891,3209=>957,3210=>1293,3211=>1044,3212=>744,3214=>650,3215=>650,3216=>659,3218=>667,3219=>667,3220=>667,3221=>462,3222=>749,3223=>543,3224=>779,3225=>674,3226=>682,3227=>660,3228=>667,3229=>1171,3230=>926,3231=>671,3232=>557,3233=>669,3234=>669,3235=>728,3236=>544,3237=>672,3238=>672,3239=>672,3240=>560,3242=>668,3243=>668,3244=>681,3245=>687,3246=>972,3247=>1101,3248=>556,3249=>677,3250=>661,3251=>545,3253=>666,3254=>553,3255=>670,3256=>549,3257=>716,3262=>425,3263=>341,3264=>680,3265=>354,3266=>714,3267=>386,3268=>638,3270=>307,3271=>670,3272=>462,3274=>908,3275=>1251,3276=>434,3277=>336,3285=>344,3286=>404,3294=>673,3296=>1695,3297=>978,3302=>549,3303=>549,3304=>549,3305=>549,3306=>549,3307=>549,3308=>549,3309=>549,3310=>549,3311=>549,3330=>368,3331=>305,3333=>1201,3334=>1351,3335=>905,3336=>1459,3337=>635,3338=>1198,3339=>861,3340=>957,3342=>1211,3343=>1202,3344=>1839,3346=>642,3347=>1114,3348=>1195,3349=>861,3350=>982,3351=>874,3352=>1354,3353=>957,3354=>1016,3355=>1266,3356=>712,3357=>1454,3358=>1215,3359=>563,3360=>565,3361=>1192,3362=>1244,3363=>1268,3364=>878,3365=>966,3366=>545,3367=>879,3368=>879,3370=>1031,3371=>1175,3372=>1334,3373=>546,3374=>643,3375=>949,3376=>642,3377=>555,3378=>945,3379=>631,3380=>553,3381=>959,3382=>936,3383=>1122,3384=>1190,3385=>1112,3390=>475,3391=>418,3392=>442,3393=>340,3394=>340,3395=>473,3398=>640,3399=>530,3400=>1279,3402=>1368,3403=>1258,3404=>1447,3405=>0,3415=>553,3424=>861,3425=>1100,3430=>1095,3431=>929,3432=>854,3433=>1181,3434=>658,3435=>972,3436=>1210,3437=>650,3438=>959,3439=>896,3585=>595,3586=>648,3587=>665,3588=>608,3589=>608,3590=>665,3591=>471,3592=>556,3593=>652,3594=>664,3595=>681,3596=>816,3597=>849,3598=>620,3599=>620,3600=>541,3601=>785,3602=>826,3603=>887,3604=>598,3605=>605,3606=>595,3607=>650,3608=>541,3609=>652,3610=>608,3611=>608,3612=>630,3613=>630,3614=>695,3615=>695,3616=>620,3617=>581,3618=>588,3619=>501,3620=>595,3621=>569,3622=>620,3623=>519,3624=>592,3625=>659,3626=>574,3627=>654,3628=>695,3629=>566,3630=>574,3631=>517,3632=>452,3633=>0,3634=>496,3635=>496,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0,3647=>687,3648=>302,3649=>571,3650=>478,3651=>515,3652=>515,3653=>496,3654=>506,3655=>0,3656=>0,3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0,3663=>555,3664=>598,3665=>640,3666=>688,3667=>690,3668=>657,3669=>657,3670=>635,3671=>839,3672=>693,3673=>769,3674=>673,3675=>994,3713=>775,3714=>707,3716=>724,3719=>524,3720=>690,3722=>678,3725=>711,3732=>719,3733=>834,3734=>776,3735=>916,3737=>744,3738=>740,3739=>740,3740=>834,3741=>834,3742=>854,3743=>854,3745=>775,3746=>724,3747=>697,3749=>700,3751=>700,3754=>708,3755=>916,3757=>700,3758=>697,3759=>658,3760=>432,3761=>534,3762=>476,3763=>476,3764=>778,3765=>778,3766=>778,3767=>778,3768=>778,3769=>778,3771=>778,3772=>778,3773=>670,3776=>420,3777=>806,3778=>430,3779=>446,3780=>346,3782=>571,3784=>778,3785=>778,3786=>778,3787=>778,3788=>778,3789=>778,3792=>721,3793=>719,3794=>601,3795=>711,3796=>686,3797=>686,3798=>834,3799=>756,3800=>724,3801=>906,3804=>1272,3805=>1272,3840=>600,3841=>600,3842=>600,3843=>600,3844=>600,3845=>600,3846=>600,3847=>600,3848=>600,3849=>600,3850=>600,3851=>600,3852=>600,3853=>600,3854=>600,3855=>600,3856=>600,3857=>600,3858=>600,3859=>600,3860=>600,3861=>600,3862=>600,3863=>600,3864=>600,3865=>600,3866=>600,3867=>600,3868=>600,3869=>600,3870=>600,3871=>600,3872=>600,3873=>600,3874=>600,3875=>600,3876=>600,3877=>600,3878=>600,3879=>600,3880=>600,3881=>600,3882=>600,3883=>600,3884=>600,3885=>600,3886=>600,3887=>600,3888=>600,3889=>600,3890=>600,3891=>600,3892=>600,3893=>600,3894=>600,3895=>600,3896=>600,3897=>600,3898=>600,3899=>600,3900=>600,3901=>600,3902=>600,3903=>600,3904=>600,3905=>600,3906=>600,3907=>600,3908=>600,3909=>600,3910=>600,3911=>600,3913=>600,3914=>600,3915=>600,3916=>600,3917=>600,3918=>600,3919=>600,3920=>600,3921=>600,3922=>600,3923=>600,3924=>600,3925=>600,3926=>600,3927=>600,3928=>600,3929=>600,3930=>600,3931=>600,3932=>600,3933=>600,3934=>600,3935=>600,3936=>600,3937=>600,3938=>600,3939=>600,3940=>600,3941=>600,3942=>600,3943=>600,3944=>600,3945=>600,3953=>600,3954=>600,3955=>600,3956=>600,3957=>600,3958=>600,3959=>600,3960=>600,3961=>600,3962=>600,3963=>600,3964=>600,3965=>600,3966=>600,3967=>600,3968=>600,3969=>600,3970=>600,3971=>600,3972=>600,3973=>600,3974=>600,3975=>600,3976=>600,3977=>600,3978=>600,3979=>600,3984=>600,3985=>600,3986=>600,3987=>600,3988=>600,3989=>600,3991=>600,3993=>600,3994=>600,3995=>600,3996=>600,3997=>600,3998=>600,3999=>600,4000=>600,4001=>600,4002=>600,4003=>600,4004=>600,4005=>600,4006=>600,4007=>600,4008=>600,4009=>600,4010=>600,4011=>600,4012=>600,4013=>600,4017=>600,4018=>600,4019=>600,4020=>600,4021=>600,4022=>600,4023=>600,4025=>600,4256=>662,4257=>677,4258=>708,4259=>696,4260=>609,4261=>790,4262=>664,4263=>785,4264=>560,4265=>634,4266=>782,4267=>701,4268=>629,4269=>682,4270=>705,4271=>692,4272=>734,4273=>615,4274=>592,4275=>680,4276=>679,4277=>705,4278=>643,4279=>623,4280=>623,4281=>629,4282=>633,4283=>770,4284=>592,4285=>662,4286=>629,4287=>672,4288=>735,4289=>576,4290=>606,4291=>605,4292=>676,4293=>792,4304=>435,4305=>556,4306=>565,4307=>872,4308=>506,4309=>544,4310=>723,4311=>868,4312=>530,4313=>532,4314=>955,4315=>552,4316=>565,4317=>712,4318=>547,4319=>574,4320=>685,4321=>554,4322=>806,4323=>810,4324=>777,4325=>502,4326=>686,4327=>512,4328=>552,4329=>496,4330=>568,4331=>552,4332=>592,4333=>565,4334=>552,4335=>741,4336=>549,4337=>659,4338=>559,4339=>524,4340=>482,4341=>565,4342=>822,4347=>506,4352=>1000,4353=>1000,4354=>1000,4355=>1000,4356=>1000,4357=>1000,4358=>1000,4359=>1000,4360=>1000,4361=>1000,4362=>1000,4363=>1000,4364=>1000,4365=>1000,4366=>1000,4367=>1000,4368=>1000,4369=>1000,4370=>1000,4371=>1000,4372=>1000,4373=>1000,4374=>1000,4375=>1000,4376=>1000,4377=>1000,4378=>1000,4379=>1000,4380=>1000,4381=>1000,4382=>1000,4383=>1000,4384=>1000,4385=>1000,4386=>1000,4387=>1000,4388=>1000,4389=>1000,4390=>1000,4391=>1000,4392=>1000,4393=>1000,4394=>1000,4395=>1000,4396=>1000,4397=>1000,4398=>1000,4399=>1000,4400=>1000,4401=>1000,4402=>1000,4403=>1000,4404=>1000,4405=>1000,4406=>1000,4407=>1000,4408=>1000,4409=>1000,4410=>1000,4411=>1000,4412=>1000,4413=>1000,4414=>1000,4415=>1000,4416=>1000,4417=>1000,4418=>1000,4419=>1000,4420=>1000,4421=>1000,4422=>1000,4423=>1000,4424=>1000,4425=>1000,4426=>1000,4427=>1000,4428=>1000,4429=>1000,4430=>1000,4431=>1000,4432=>1000,4433=>1000,4434=>1000,4435=>1000,4436=>1000,4437=>1000,4438=>1000,4439=>1000,4440=>1000,4441=>1000,4447=>1000,4448=>1000,4449=>1000,4450=>1000,4451=>1000,4452=>1000,4453=>1000,4454=>1000,4455=>1000,4456=>1000,4457=>1000,4458=>1000,4459=>1000,4460=>1000,4461=>1000,4462=>1000,4463=>1000,4464=>1000,4465=>1000,4466=>1000,4467=>1000,4468=>1000,4469=>1000,4470=>1000,4471=>1000,4472=>1000,4473=>1000,4474=>1000,4475=>1000,4476=>1000,4477=>1000,4478=>1000,4479=>1000,4480=>1000,4481=>1000,4482=>1000,4483=>1000,4484=>1000,4485=>1000,4486=>1000,4487=>1000,4488=>1000,4489=>1000,4490=>1000,4491=>1000,4492=>1000,4493=>1000,4494=>1000,4495=>1000,4496=>1000,4497=>1000,4498=>1000,4499=>1000,4500=>1000,4501=>1000,4502=>1000,4503=>1000,4504=>1000,4505=>1000,4506=>1000,4507=>1000,4508=>1000,4509=>1000,4510=>1000,4511=>1000,4512=>1000,4513=>1000,4514=>1000,4520=>1000,4521=>1000,4522=>1000,4523=>1000,4524=>1000,4525=>1000,4526=>1000,4527=>1000,4528=>1000,4529=>1000,4530=>1000,4531=>1000,4532=>1000,4533=>1000,4534=>1000,4535=>1000,4536=>1000,4537=>1000,4538=>1000,4539=>1000,4540=>1000,4541=>1000,4542=>1000,4543=>1000,4544=>1000,4545=>1000,4546=>1000,4547=>1000,4548=>1000,4549=>1000,4550=>1000,4551=>1000,4552=>1000,4553=>1000,4554=>1000,4555=>1000,4556=>1000,4557=>1000,4558=>1000,4559=>1000,4560=>1000,4561=>1000,4562=>1000,4563=>1000,4564=>1000,4565=>1000,4566=>1000,4567=>1000,4568=>1000,4569=>1000,4570=>1000,4571=>1000,4572=>1000,4573=>1000,4574=>1000,4575=>1000,4576=>1000,4577=>1000,4578=>1000,4579=>1000,4580=>1000,4581=>1000,4582=>1000,4583=>1000,4584=>1000,4585=>1000,4586=>1000,4587=>1000,4588=>1000,4589=>1000,4590=>1000,4591=>1000,4592=>1000,4593=>1000,4594=>1000,4595=>1000,4596=>1000,4597=>1000,4598=>1000,4599=>1000,4600=>1000,4601=>1000,7680=>667,7681=>556,7682=>667,7683=>556,7684=>667,7685=>556,7686=>667,7687=>556,7688=>722,7689=>500,7690=>722,7691=>556,7692=>722,7693=>556,7694=>722,7695=>556,7696=>722,7697=>556,7698=>722,7699=>556,7700=>667,7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667,7707=>556,7708=>667,7709=>556,7710=>611,7711=>278,7712=>778,7713=>556,7714=>722,7715=>556,7716=>722,7717=>556,7718=>722,7719=>556,7720=>722,7721=>556,7722=>722,7723=>556,7724=>278,7725=>222,7726=>278,7727=>278,7728=>667,7729=>500,7730=>667,7731=>500,7732=>667,7733=>500,7734=>556,7735=>222,7736=>556,7737=>222,7738=>556,7739=>222,7740=>556,7741=>222,7742=>833,7743=>833,7744=>833,7745=>833,7746=>833,7747=>833,7748=>722,7749=>556,7750=>722,7751=>556,7752=>722,7753=>556,7754=>722,7755=>556,7756=>778,7757=>556,7758=>778,7759=>556,7760=>778,7761=>556,7762=>778,7763=>556,7764=>667,7765=>556,7766=>667,7767=>556,7768=>722,7769=>333,7770=>722,7771=>333,7772=>722,7773=>333,7774=>722,7775=>333,7776=>667,7777=>500,7778=>667,7779=>500,7780=>667,7781=>500,7782=>667,7783=>500,7784=>667,7785=>500,7786=>611,7787=>278,7788=>611,7789=>278,7790=>611,7791=>278,7792=>611,7793=>278,7794=>722,7795=>556,7796=>722,7797=>556,7798=>722,7799=>556,7800=>722,7801=>556,7802=>722,7803=>556,7804=>667,7805=>500,7806=>667,7807=>500,7808=>944,7809=>722,7810=>944,7811=>722,7812=>944,7813=>722,7814=>944,7815=>722,7816=>944,7817=>722,7818=>667,7819=>500,7820=>667,7821=>500,7822=>667,7823=>500,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500,7830=>556,7831=>278,7832=>722,7833=>500,7834=>556,7835=>278,7840=>667,7841=>556,7842=>667,7843=>556,7844=>667,7845=>556,7846=>667,7847=>556,7848=>667,7849=>556,7850=>667,7851=>556,7852=>667,7853=>556,7854=>667,7855=>556,7856=>667,7857=>556,7858=>667,7859=>556,7860=>667,7861=>556,7862=>667,7863=>556,7864=>667,7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667,7871=>556,7872=>667,7873=>556,7874=>667,7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278,7881=>278,7882=>278,7883=>222,7884=>778,7885=>556,7886=>778,7887=>556,7888=>778,7889=>556,7890=>778,7891=>556,7892=>778,7893=>556,7894=>778,7895=>556,7896=>778,7897=>556,7898=>776,7899=>556,7900=>776,7901=>556,7902=>776,7903=>556,7904=>776,7905=>556,7906=>776,7907=>556,7908=>722,7909=>556,7910=>722,7911=>556,7912=>776,7913=>620,7914=>776,7915=>620,7916=>776,7917=>620,7918=>776,7919=>620,7920=>776,7921=>620,7922=>667,7923=>500,7924=>667,7925=>500,7926=>667,7927=>500,7928=>667,7929=>500,7936=>576,7937=>576,7938=>576,7939=>576,7940=>576,7941=>576,7942=>576,7943=>576,7944=>667,7945=>667,7946=>680,7947=>680,7948=>680,7949=>680,7950=>718,7951=>718,7952=>434,7953=>434,7954=>434,7955=>434,7956=>434,7957=>434,7960=>692,7961=>692,7962=>823,7963=>823,7964=>823,7965=>823,7968=>556,7969=>556,7970=>556,7971=>556,7972=>556,7973=>556,7974=>556,7975=>556,7976=>747,7977=>747,7978=>878,7979=>878,7980=>878,7981=>878,7982=>923,7983=>923,7984=>222,7985=>222,7986=>222,7987=>222,7988=>222,7989=>222,7990=>222,7991=>222,7992=>303,7993=>303,7994=>434,7995=>434,7996=>434,7997=>434,7998=>479,7999=>479,8000=>556,8001=>556,8002=>556,8003=>556,8004=>556,8005=>556,8008=>778,8009=>778,8010=>894,8011=>894,8012=>894,8013=>894,8016=>551,8017=>551,8018=>551,8019=>551,8020=>551,8021=>551,8022=>551,8023=>551,8025=>777,8027=>893,8029=>885,8031=>940,8032=>766,8033=>766,8034=>766,8035=>766,8036=>766,8037=>766,8038=>766,8039=>766,8040=>758,8041=>758,8042=>874,8043=>874,8044=>868,8045=>867,8046=>911,8047=>911,8048=>576,8049=>576,8050=>434,8051=>434,8052=>556,8053=>556,8054=>222,8055=>222,8056=>556,8057=>556,8058=>551,8059=>551,8060=>766,8061=>766,8064=>576,8065=>576,8066=>576,8067=>576,8068=>576,8069=>576,8070=>576,8071=>576,8072=>667,8073=>667,8074=>680,8075=>680,8076=>680,8077=>680,8078=>718,8079=>718,8080=>556,8081=>556,8082=>556,8083=>556,8084=>556,8085=>556,8086=>556,8087=>556,8088=>747,8089=>747,8090=>878,8091=>878,8092=>878,8093=>878,8094=>923,8095=>923,8096=>766,8097=>766,8098=>766,8099=>766,8100=>766,8101=>766,8102=>766,8103=>766,8104=>758,8105=>758,8106=>874,8107=>874,8108=>868,8109=>867,8110=>911,8111=>911,8112=>576,8113=>576,8114=>576,8115=>576,8116=>576,8118=>576,8119=>576,8120=>667,8121=>667,8122=>667,8123=>667,8124=>667,8125=>278,8126=>278,8127=>278,8128=>278,8129=>278,8130=>556,8131=>556,8132=>556,8134=>556,8135=>556,8136=>693,8137=>704,8138=>748,8139=>759,8140=>722,8141=>278,8142=>278,8143=>278,8144=>222,8145=>222,8146=>222,8147=>222,8150=>222,8151=>222,8152=>278,8153=>278,8154=>304,8155=>304,8157=>278,8158=>278,8159=>278,8160=>551,8161=>551,8162=>551,8163=>551,8164=>571,8165=>571,8166=>551,8167=>551,8168=>667,8169=>667,8170=>742,8171=>746,8172=>693,8173=>278,8174=>278,8175=>278,8178=>766,8179=>766,8180=>766,8182=>766,8183=>766,8184=>778,8185=>778,8186=>758,8187=>758,8188=>758,8189=>278,8190=>278,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>100,8202=>50,8203=>0,8204=>0,8205=>0,8208=>333,8209=>333,8210=>556,8211=>500,8212=>1000,8213=>564,8214=>428,8215=>500,8216=>222,8217=>222,8218=>222,8219=>222,8220=>333,8221=>333,8222=>333,8223=>333,8224=>556,8225=>556,8226=>350,8227=>350,8228=>278,8229=>556,8230=>1000,8231=>278,8232=>0,8233=>0,8240=>1000,8241=>1330,8242=>222,8243=>372,8244=>522,8245=>206,8246=>356,8247=>506,8248=>312,8249=>333,8250=>333,8251=>1000,8252=>471,8253=>556,8254=>500,8255=>945,8256=>945,8257=>312,8258=>820,8259=>333,8260=>167,8261=>278,8262=>278,8304=>333,8308=>333,8309=>333,8310=>333,8311=>333,8312=>333,8313=>333,8314=>333,8315=>333,8316=>333,8317=>210,8318=>210,8319=>333,8320=>333,8321=>333,8322=>333,8323=>333,8324=>333,8325=>333,8326=>333,8327=>333,8328=>333,8329=>333,8330=>333,8331=>333,8332=>333,8333=>210,8334=>210,8352=>556,8353=>556,8354=>556,8355=>556,8356=>556,8357=>833,8358=>556,8359=>556,8360=>1024,8361=>940,8362=>784,8363=>556,8364=>556,8400=>600,8401=>600,8402=>600,8403=>600,8404=>700,8405=>700,8406=>600,8407=>600,8408=>600,8409=>600,8410=>600,8411=>600,8412=>600,8413=>900,8414=>900,8415=>900,8416=>900,8417=>700,8448=>889,8449=>889,8450=>667,8451=>1022,8452=>611,8453=>889,8454=>889,8455=>501,8456=>667,8457=>921,8458=>510,8459=>906,8460=>988,8461=>722,8462=>500,8463=>500,8464=>688,8465=>553,8466=>708,8467=>291,8468=>778,8469=>722,8470=>1073,8471=>737,8472=>740,8473=>556,8474=>722,8475=>927,8476=>795,8477=>667,8478=>667,8479=>667,8480=>1000,8481=>1174,8482=>1000,8483=>722,8484=>611,8485=>542,8486=>768,8487=>768,8488=>698,8489=>321,8490=>667,8491=>667,8492=>927,8493=>646,8494=>556,8495=>385,8496=>615,8497=>688,8498=>611,8499=>1115,8500=>406,8501=>688,8502=>688,8503=>344,8504=>688,8531=>834,8532=>834,8533=>834,8534=>834,8535=>834,8536=>834,8537=>834,8538=>834,8539=>834,8540=>834,8541=>834,8542=>834,8543=>834,8544=>278,8545=>555,8546=>832,8547=>933,8548=>667,8549=>934,8550=>1031,8551=>1268,8552=>944,8553=>667,8554=>944,8555=>1035,8556=>556,8557=>722,8558=>722,8559=>833,8560=>222,8561=>444,8562=>666,8563=>700,8564=>500,8565=>700,8566=>922,8567=>1144,8568=>712,8569=>500,8570=>712,8571=>934,8572=>222,8573=>500,8574=>556,8575=>833,8576=>983,8577=>722,8578=>983,8592=>713,8593=>713,8594=>713,8595=>713,8596=>713,8597=>713,8598=>713,8599=>713,8600=>713,8601=>713,8602=>713,8603=>713,8604=>713,8605=>713,8606=>713,8607=>713,8608=>713,8609=>713,8610=>713,8611=>713,8612=>713,8613=>713,8614=>713,8615=>713,8616=>713,8617=>713,8618=>713,8619=>713,8620=>713,8621=>813,8622=>813,8623=>713,8624=>713,8625=>713,8626=>713,8627=>713,8628=>713,8629=>713,8630=>713,8631=>713,8632=>713,8633=>713,8634=>800,8635=>800,8636=>713,8637=>713,8638=>713,8639=>713,8640=>713,8641=>713,8642=>713,8643=>713,8644=>713,8645=>713,8646=>713,8647=>713,8648=>713,8649=>713,8650=>713,8651=>713,8652=>713,8653=>713,8654=>950,8655=>713,8656=>713,8657=>713,8658=>713,8659=>713,8660=>863,8661=>713,8662=>713,8663=>713,8664=>713,8665=>713,8666=>713,8667=>713,8668=>813,8669=>813,8670=>713,8671=>713,8672=>713,8673=>713,8674=>713,8675=>713,8676=>713,8677=>713,8678=>713,8679=>713,8680=>713,8681=>713,8682=>713,8704=>600,8705=>600,8706=>494,8707=>600,8708=>600,8709=>800,8710=>612,8711=>612,8712=>549,8713=>549,8714=>549,8715=>549,8716=>549,8717=>549,8718=>549,8719=>823,8720=>823,8721=>713,8722=>584,8723=>584,8724=>584,8725=>167,8726=>278,8727=>389,8728=>400,8729=>400,8730=>600,8731=>600,8732=>600,8733=>549,8734=>549,8735=>584,8736=>584,8737=>584,8738=>584,8739=>260,8740=>444,8741=>418,8742=>602,8743=>561,8744=>561,8745=>561,8746=>561,8747=>506,8748=>806,8749=>1106,8750=>506,8751=>806,8752=>1106,8753=>506,8754=>506,8755=>506,8756=>561,8757=>561,8758=>422,8759=>561,8760=>584,8761=>584,8762=>584,8763=>584,8764=>584,8765=>584,8766=>584,8767=>584,8768=>422,8769=>584,8770=>584,8771=>584,8772=>584,8773=>584,8774=>584,8775=>584,8776=>584,8777=>584,8778=>584,8779=>584,8780=>584,8781=>584,8782=>584,8783=>584,8784=>584,8785=>584,8786=>584,8787=>584,8788=>737,8789=>737,8790=>584,8791=>584,8792=>584,8793=>584,8794=>584,8795=>584,8796=>584,8797=>584,8798=>584,8799=>584,8800=>584,8801=>584,8802=>584,8803=>584,8804=>584,8805=>584,8806=>584,8807=>584,8808=>584,8809=>584,8810=>969,8811=>969,8812=>584,8813=>584,8814=>584,8815=>584,8816=>584,8817=>584,8818=>584,8819=>584,8820=>584,8821=>584,8822=>584,8823=>584,8824=>584,8825=>584,8826=>584,8827=>584,8828=>584,8829=>584,8830=>584,8831=>584,8832=>584,8833=>584,8834=>678,8835=>678,8836=>678,8837=>678,8838=>678,8839=>678,8840=>678,8841=>678,8842=>678,8843=>678,8844=>561,8845=>561,8846=>561,8847=>678,8848=>678,8849=>673,8850=>673,8851=>561,8852=>561,8853=>800,8854=>800,8855=>800,8856=>800,8857=>800,8858=>800,8859=>800,8860=>800,8861=>800,8862=>800,8863=>800,8864=>800,8865=>800,8866=>549,8867=>549,8868=>549,8869=>549,8870=>399,8871=>399,8872=>549,8873=>549,8874=>549,8875=>672,8876=>549,8877=>549,8878=>549,8879=>672,8880=>549,8881=>549,8882=>549,8883=>549,8884=>549,8885=>549,8886=>713,8887=>713,8888=>713,8889=>549,8890=>549,8891=>584,8892=>584,8893=>584,8894=>584,8895=>584,8896=>561,8897=>561,8898=>561,8899=>561,8900=>549,8901=>250,8902=>549,8903=>649,8904=>630,8905=>630,8906=>630,8907=>630,8908=>630,8909=>584,8910=>561,8911=>561,8912=>668,8913=>668,8914=>668,8915=>668,8916=>561,8917=>602,8918=>584,8919=>584,8920=>1354,8921=>1354,8922=>584,8923=>584,8924=>584,8925=>584,8926=>584,8927=>584,8928=>584,8929=>584,8930=>673,8931=>673,8932=>673,8933=>673,8934=>584,8935=>584,8936=>584,8937=>584,8938=>584,8939=>584,8940=>584,8941=>584,8942=>278,8943=>1000,8944=>1000,8945=>1000,8960=>549,8962=>549,8963=>549,8964=>549,8965=>549,8966=>549,8967=>549,8968=>449,8969=>449,8970=>449,8971=>449,8972=>549,8973=>549,8974=>549,8975=>549,8976=>549,8977=>549,8978=>800,8979=>800,8980=>549,8981=>549,8982=>549,8983=>650,8984=>780,8985=>549,8986=>549,8987=>549,8988=>549,8989=>549,8990=>549,8991=>549,8992=>506,8993=>506,8994=>713,8995=>713,8996=>1000,8997=>1000,8998=>1000,8999=>1000,9000=>1000,9001=>329,9002=>329,9003=>1000,9004=>549,9005=>549,9006=>549,9007=>549,9008=>549,9009=>549,9010=>549,9011=>549,9012=>549,9013=>549,9014=>600,9015=>600,9016=>600,9017=>600,9018=>600,9019=>600,9020=>600,9021=>600,9022=>600,9023=>600,9024=>600,9025=>600,9026=>600,9027=>600,9028=>600,9029=>600,9030=>600,9031=>600,9032=>600,9033=>600,9034=>600,9035=>600,9036=>600,9037=>600,9038=>600,9039=>600,9040=>600,9041=>600,9042=>600,9043=>600,9044=>600,9045=>600,9046=>600,9047=>600,9048=>600,9049=>600,9050=>600,9051=>600,9052=>600,9053=>600,9054=>600,9055=>600,9056=>600,9057=>600,9058=>600,9059=>600,9060=>600,9061=>600,9062=>600,9063=>600,9064=>600,9065=>600,9066=>600,9067=>600,9068=>600,9069=>600,9070=>600,9071=>600,9072=>600,9073=>600,9074=>600,9075=>600,9076=>600,9077=>600,9078=>600,9079=>600,9080=>600,9081=>600,9082=>600,9109=>600,9216=>600,9217=>600,9218=>600,9219=>600,9220=>600,9221=>600,9222=>600,9223=>600,9224=>600,9225=>600,9226=>600,9227=>600,9228=>600,9229=>600,9230=>600,9231=>600,9232=>600,9233=>600,9234=>600,9235=>600,9236=>600,9237=>600,9238=>600,9239=>600,9240=>600,9241=>600,9242=>600,9243=>600,9244=>600,9245=>600,9246=>600,9247=>600,9248=>600,9249=>600,9250=>600,9251=>600,9252=>600,9280=>604,9281=>604,9282=>604,9283=>604,9284=>604,9285=>604,9286=>750,9287=>750,9288=>750,9289=>750,9290=>604,9312=>1000,9313=>1000,9314=>1000,9315=>1000,9316=>1000,9317=>1000,9318=>1000,9319=>1000,9320=>1000,9321=>1000,9322=>1000,9323=>1000,9324=>1000,9325=>1000,9326=>1000,9327=>1000,9328=>1000,9329=>1000,9330=>1000,9331=>1000,9332=>1000,9333=>1000,9334=>1000,9335=>1000,9336=>1000,9337=>1000,9338=>1000,9339=>1000,9340=>1000,9341=>1000,9342=>1000,9343=>1000,9344=>1000,9345=>1000,9346=>1000,9347=>1000,9348=>1000,9349=>1000,9350=>1000,9351=>1000,9352=>1000,9353=>1000,9354=>1000,9355=>1000,9356=>1000,9357=>1000,9358=>1000,9359=>1000,9360=>1000,9361=>1000,9362=>1000,9363=>1000,9364=>1000,9365=>1000,9366=>1000,9367=>1000,9368=>1000,9369=>1000,9370=>1000,9371=>1000,9372=>1000,9373=>1000,9374=>1000,9375=>1000,9376=>1000,9377=>1000,9378=>1000,9379=>1000,9380=>1000,9381=>1000,9382=>1000,9383=>1000,9384=>1000,9385=>1000,9386=>1000,9387=>1000,9388=>1000,9389=>1000,9390=>1000,9391=>1000,9392=>1000,9393=>1000,9394=>1000,9395=>1000,9396=>1000,9397=>1000,9398=>1000,9399=>1000,9400=>1000,9401=>1000,9402=>1000,9403=>1000,9404=>1000,9405=>1000,9406=>1000,9407=>1000,9408=>1000,9409=>1000,9410=>1000,9411=>1000,9412=>1000,9413=>1000,9414=>1000,9415=>1000,9416=>1000,9417=>1000,9418=>1000,9419=>1000,9420=>1000,9421=>1000,9422=>1000,9423=>1000,9424=>1000,9425=>1000,9426=>1000,9427=>1000,9428=>1000,9429=>1000,9430=>1000,9431=>1000,9432=>1000,9433=>1000,9434=>1000,9435=>1000,9436=>1000,9437=>1000,9438=>1000,9439=>1000,9440=>1000,9441=>1000,9442=>1000,9443=>1000,9444=>1000,9445=>1000,9446=>1000,9447=>1000,9448=>1000,9449=>1000,9450=>1000,9472=>600,9473=>600,9474=>600,9475=>600,9476=>600,9477=>600,9478=>600,9479=>600,9480=>600,9481=>600,9482=>600,9483=>600,9484=>600,9485=>600,9486=>600,9487=>600,9488=>600,9489=>600,9490=>600,9491=>600,9492=>600,9493=>600,9494=>600,9495=>600,9496=>600,9497=>600,9498=>600,9499=>600,9500=>600,9501=>600,9502=>600,9503=>600,9504=>600,9505=>600,9506=>600,9507=>600,9508=>600,9509=>600,9510=>600,9511=>600,9512=>600,9513=>600,9514=>600,9515=>600,9516=>600,9517=>600,9518=>600,9519=>600,9520=>600,9521=>600,9522=>600,9523=>600,9524=>600,9525=>600,9526=>600,9527=>600,9528=>600,9529=>600,9530=>600,9531=>600,9532=>600,9533=>600,9534=>600,9535=>600,9536=>600,9537=>600,9538=>600,9539=>600,9540=>600,9541=>600,9542=>600,9543=>600,9544=>600,9545=>600,9546=>600,9547=>600,9548=>600,9549=>600,9550=>600,9551=>600,9552=>600,9553=>600,9554=>600,9555=>600,9556=>600,9557=>600,9558=>600,9559=>600,9560=>600,9561=>600,9562=>600,9563=>600,9564=>600,9565=>600,9566=>600,9567=>600,9568=>600,9569=>600,9570=>600,9571=>600,9572=>600,9573=>600,9574=>600,9575=>600,9576=>600,9577=>600,9578=>600,9579=>600,9580=>600,9581=>600,9582=>600,9583=>600,9584=>600,9585=>600,9586=>600,9587=>600,9588=>600,9589=>600,9590=>600,9591=>600,9592=>600,9593=>600,9594=>600,9595=>600,9596=>600,9597=>600,9598=>600,9599=>600,9600=>600,9601=>600,9602=>600,9603=>600,9604=>600,9605=>600,9606=>600,9607=>600,9608=>600,9609=>600,9610=>600,9611=>600,9612=>600,9613=>600,9614=>600,9615=>600,9616=>600,9617=>600,9618=>600,9619=>600,9620=>600,9621=>600,9632=>600,9633=>600,9634=>600,9635=>600,9636=>600,9637=>600,9638=>600,9639=>600,9640=>600,9641=>600,9642=>600,9643=>600,9644=>600,9645=>600,9646=>600,9647=>600,9648=>600,9649=>600,9650=>600,9651=>600,9652=>600,9653=>600,9654=>600,9655=>600,9656=>600,9657=>600,9658=>600,9659=>600,9660=>600,9661=>600,9662=>600,9663=>600,9664=>600,9665=>600,9666=>600,9667=>600,9668=>600,9669=>600,9670=>600,9671=>600,9672=>600,9673=>600,9674=>600,9675=>600,9676=>600,9677=>600,9678=>600,9679=>600,9680=>600,9681=>600,9682=>600,9683=>600,9684=>600,9685=>600,9686=>600,9687=>600,9688=>600,9689=>600,9690=>600,9691=>600,9692=>600,9693=>600,9694=>600,9695=>600,9696=>600,9697=>600,9698=>600,9699=>600,9700=>600,9701=>600,9702=>600,9703=>600,9704=>600,9705=>600,9706=>600,9707=>600,9708=>600,9709=>600,9710=>600,9711=>600,9728=>750,9729=>1000,9730=>750,9731=>750,9732=>1000,9733=>816,9734=>823,9735=>500,9736=>500,9737=>800,9738=>800,9739=>800,9740=>800,9741=>800,9742=>719,9743=>719,9744=>734,9745=>734,9746=>734,9747=>762,9754=>960,9755=>960,9756=>939,9757=>939,9758=>939,9759=>939,9760=>750,9761=>600,9762=>750,9763=>750,9764=>580,9765=>460,9766=>444,9767=>650,9768=>444,9769=>768,9770=>800,9771=>850,9772=>675,9773=>800,9774=>750,9775=>750,9776=>900,9777=>900,9778=>900,9779=>900,9780=>900,9781=>900,9782=>900,9783=>900,9784=>750,9785=>750,9786=>750,9787=>750,9788=>750,9789=>750,9790=>750,9791=>740,9792=>740,9793=>740,9794=>740,9795=>653,9796=>490,9797=>632,9798=>780,9799=>560,9800=>838,9801=>780,9802=>734,9803=>887,9804=>780,9805=>1080,9806=>896,9807=>1080,9808=>804,9809=>868,9810=>922,9811=>696,9812=>1000,9813=>1000,9814=>1000,9815=>1000,9816=>1000,9817=>1000,9818=>1000,9819=>1000,9820=>1000,9821=>1000,9822=>1000,9823=>1000,9824=>722,9825=>734,9826=>674,9827=>804,9828=>722,9829=>734,9830=>674,9831=>804,9832=>860,9833=>423,9834=>592,9835=>750,9836=>750,9837=>439,9838=>439,9839=>439,9985=>974,9986=>961,9987=>974,9988=>980,9990=>789,9991=>790,9992=>791,9993=>690,9996=>549,9997=>855,9998=>911,9999=>933,10000=>911,10001=>945,10002=>974,10003=>755,10004=>846,10005=>762,10006=>761,10007=>571,10008=>677,10009=>763,10010=>760,10011=>759,10012=>754,10013=>494,10014=>552,10015=>537,10016=>577,10017=>692,10018=>786,10019=>788,10020=>788,10021=>790,10022=>793,10023=>794,10025=>823,10026=>789,10027=>841,10028=>823,10029=>833,10030=>816,10031=>831,10032=>923,10033=>744,10034=>723,10035=>749,10036=>790,10037=>792,10038=>695,10039=>776,10040=>768,10041=>792,10042=>759,10043=>707,10044=>708,10045=>682,10046=>701,10047=>826,10048=>815,10049=>789,10050=>789,10051=>707,10052=>687,10053=>696,10054=>689,10055=>786,10056=>787,10057=>713,10058=>791,10059=>785,10061=>873,10063=>762,10064=>762,10065=>759,10066=>759,10070=>784,10072=>138,10073=>277,10074=>415,10075=>392,10076=>392,10077=>668,10078=>668,10081=>732,10082=>544,10083=>544,10084=>910,10085=>667,10086=>760,10087=>760,10102=>788,10103=>788,10104=>788,10105=>788,10106=>788,10107=>788,10108=>788,10109=>788,10110=>788,10111=>788,10112=>788,10113=>788,10114=>788,10115=>788,10116=>788,10117=>788,10118=>788,10119=>788,10120=>788,10121=>788,10122=>788,10123=>788,10124=>788,10125=>788,10126=>788,10127=>788,10128=>788,10129=>788,10130=>788,10131=>788,10132=>894,10136=>748,10137=>924,10138=>748,10139=>918,10140=>927,10141=>928,10142=>928,10143=>834,10144=>873,10145=>828,10146=>924,10147=>924,10148=>917,10149=>930,10150=>931,10151=>463,10152=>883,10153=>836,10154=>836,10155=>867,10156=>867,10157=>696,10158=>696,10159=>874,10161=>874,10162=>760,10163=>946,10164=>771,10165=>865,10166=>771,10167=>888,10168=>967,10169=>888,10170=>831,10171=>873,10172=>927,10173=>970,10174=>918,12288=>1000,12289=>1000,12290=>1000,12291=>1000,12292=>1000,12293=>1000,12294=>1000,12295=>1000,12296=>1000,12297=>1000,12298=>1000,12299=>1000,12300=>1000,12301=>1000,12302=>1000,12303=>1000,12304=>1000,12305=>1000,12306=>1000,12307=>1000,12308=>1000,12309=>1000,12310=>1000,12311=>1000,12312=>1000,12313=>1000,12314=>1000,12315=>1000,12316=>1000,12317=>1000,12318=>1000,12319=>1000,12320=>1000,12321=>1000,12322=>1000,12323=>1000,12324=>1000,12325=>1000,12326=>1000,12327=>1000,12328=>1000,12329=>1000,12330=>1000,12331=>1000,12332=>1000,12333=>1000,12334=>1000,12335=>1000,12336=>1000,12337=>1000,12338=>1000,12339=>1000,12340=>1000,12341=>1000,12342=>1000,12343=>1000,12351=>1000,12353=>1000,12354=>1000,12355=>1000,12356=>1000,12357=>1000,12358=>1000,12359=>1000,12360=>1000,12361=>1000,12362=>1000,12363=>1000,12364=>1000,12365=>1000,12366=>1000,12367=>1000,12368=>1000,12369=>1000,12370=>1000,12371=>1000,12372=>1000,12373=>1000,12374=>1000,12375=>1000,12376=>1000,12377=>1000,12378=>1000,12379=>1000,12380=>1000,12381=>1000,12382=>1000,12383=>1000,12384=>1000,12385=>1000,12386=>1000,12387=>1000,12388=>1000,12389=>1000,12390=>1000,12391=>1000,12392=>1000,12393=>1000,12394=>1000,12395=>1000,12396=>1000,12397=>1000,12398=>1000,12399=>1000,12400=>1000,12401=>1000,12402=>1000,12403=>1000,12404=>1000,12405=>1000,12406=>1000,12407=>1000,12408=>1000,12409=>1000,12410=>1000,12411=>1000,12412=>1000,12413=>1000,12414=>1000,12415=>1000,12416=>1000,12417=>1000,12418=>1000,12419=>1000,12420=>1000,12421=>1000,12422=>1000,12423=>1000,12424=>1000,12425=>1000,12426=>1000,12427=>1000,12428=>1000,12429=>1000,12430=>1000,12431=>1000,12432=>1000,12433=>1000,12434=>1000,12435=>1000,12436=>1000,12441=>1000,12442=>1000,12443=>1000,12444=>1000,12445=>1000,12446=>1000,12449=>1000,12450=>1000,12451=>1000,12452=>1000,12453=>1000,12454=>1000,12455=>1000,12456=>1000,12457=>1000,12458=>1000,12459=>1000,12460=>1000,12461=>1000,12462=>1000,12463=>1000,12464=>1000,12465=>1000,12466=>1000,12467=>1000,12468=>1000,12469=>1000,12470=>1000,12471=>1000,12472=>1000,12473=>1000,12474=>1000,12475=>1000,12476=>1000,12477=>1000,12478=>1000,12479=>1000,12480=>1000,12481=>1000,12482=>1000,12483=>1000,12484=>1000,12485=>1000,12486=>1000,12487=>1000,12488=>1000,12489=>1000,12490=>1000,12491=>1000,12492=>1000,12493=>1000,12494=>1000,12495=>1000,12496=>1000,12497=>1000,12498=>1000,12499=>1000,12500=>1000,12501=>1000,12502=>1000,12503=>1000,12504=>1000,12505=>1000,12506=>1000,12507=>1000,12508=>1000,12509=>1000,12510=>1000,12511=>1000,12512=>1000,12513=>1000,12514=>1000,12515=>1000,12516=>1000,12517=>1000,12518=>1000,12519=>1000,12520=>1000,12521=>1000,12522=>1000,12523=>1000,12524=>1000,12525=>1000,12526=>1000,12527=>1000,12528=>1000,12529=>1000,12530=>1000,12531=>1000,12532=>1000,12533=>1000,12534=>1000,12535=>1000,12536=>1000,12537=>1000,12538=>1000,12539=>1000,12540=>1000,12541=>1000,12542=>1000,12549=>1000,12550=>1000,12551=>1000,12552=>1000,12553=>1000,12554=>1000,12555=>1000,12556=>1000,12557=>1000,12558=>1000,12559=>1000,12560=>1000,12561=>1000,12562=>1000,12563=>1000,12564=>1000,12565=>1000,12566=>1000,12567=>1000,12568=>1000,12569=>1000,12570=>1000,12571=>1000,12572=>1000,12573=>1000,12574=>1000,12575=>1000,12576=>1000,12577=>1000,12578=>1000,12579=>1000,12580=>1000,12581=>1000,12582=>1000,12583=>1000,12584=>1000,12585=>1000,12586=>1000,12587=>1000,12588=>1000,12593=>1000,12594=>1000,12595=>1000,12596=>1000,12597=>1000,12598=>1000,12599=>1000,12600=>1000,12601=>1000,12602=>1000,12603=>1000,12604=>1000,12605=>1000,12606=>1000,12607=>1000,12608=>1000,12609=>1000,12610=>1000,12611=>1000,12612=>1000,12613=>1000,12614=>1000,12615=>1000,12616=>1000,12617=>1000,12618=>1000,12619=>1000,12620=>1000,12621=>1000,12622=>1000,12623=>1000,12624=>1000,12625=>1000,12626=>1000,12627=>1000,12628=>1000,12629=>1000,12630=>1000,12631=>1000,12632=>1000,12633=>1000,12634=>1000,12635=>1000,12636=>1000,12637=>1000,12638=>1000,12639=>1000,12640=>1000,12641=>1000,12642=>1000,12643=>1000,12644=>1000,12645=>1000,12646=>1000,12647=>1000,12648=>1000,12649=>1000,12650=>1000,12651=>1000,12652=>1000,12653=>1000,12654=>1000,12655=>1000,12656=>1000,12657=>1000,12658=>1000,12659=>1000,12660=>1000,12661=>1000,12662=>1000,12663=>1000,12664=>1000,12665=>1000,12666=>1000,12667=>1000,12668=>1000,12669=>1000,12670=>1000,12671=>1000,12672=>1000,12673=>1000,12674=>1000,12675=>1000,12676=>1000,12677=>1000,12678=>1000,12679=>1000,12680=>1000,12681=>1000,12682=>1000,12683=>1000,12684=>1000,12685=>1000,12686=>1000,12688=>1000,12689=>1000,12690=>1000,12691=>1000,12692=>1000,12693=>1000,12694=>1000,12695=>1000,12696=>1000,12697=>1000,12698=>1000,12699=>1000,12700=>1000,12701=>1000,12702=>1000,12703=>1000,12800=>1000,12801=>1000,12802=>1000,12803=>1000,12804=>1000,12805=>1000,12806=>1000,12807=>1000,12808=>1000,12809=>1000,12810=>1000,12811=>1000,12812=>1000,12813=>1000,12814=>1000,12815=>1000,12816=>1000,12817=>1000,12818=>1000,12819=>1000,12820=>1000,12821=>1000,12822=>1000,12823=>1000,12824=>1000,12825=>1000,12826=>1000,12827=>1000,12828=>1000,12832=>1000,12833=>1000,12834=>1000,12835=>1000,12836=>1000,12837=>1000,12838=>1000,12839=>1000,12840=>1000,12841=>1000,12842=>1000,12843=>1000,12844=>1000,12845=>1000,12846=>1000,12847=>1000,12848=>1000,12849=>1000,12850=>1000,12851=>1000,12852=>1000,12853=>1000,12854=>1000,12855=>1000,12856=>1000,12857=>1000,12858=>1000,12859=>1000,12860=>1000,12861=>1000,12862=>1000,12863=>1000,12864=>1000,12865=>1000,12866=>1000,12867=>1000,12896=>1000,12897=>1000,12898=>1000,12899=>1000,12900=>1000,12901=>1000,12902=>1000,12903=>1000,12904=>1000,12905=>1000,12906=>1000,12907=>1000,12908=>1000,12909=>1000,12910=>1000,12911=>1000,12912=>1000,12913=>1000,12914=>1000,12915=>1000,12916=>1000,12917=>1000,12918=>1000,12919=>1000,12920=>1000,12921=>1000,12922=>1000,12923=>1000,12927=>1000,12928=>1000,12929=>1000,12930=>1000,12931=>1000,12932=>1000,12933=>1000,12934=>1000,12935=>1000,12936=>1000,12937=>1000,12938=>1000,12939=>1000,12940=>1000,12941=>1000,12942=>1000,12943=>1000,12944=>1000,12945=>1000,12946=>1000,12947=>1000,12948=>1000,12949=>1000,12950=>1000,12951=>1000,12952=>1000,12953=>1000,12954=>1000,12955=>1000,12956=>1000,12957=>1000,12958=>1000,12959=>1000,12960=>1000,12961=>1000,12962=>1000,12963=>1000,12964=>1000,12965=>1000,12966=>1000,12967=>1000,12968=>1000,12969=>1000,12970=>1000,12971=>1000,12972=>1000,12973=>1000,12974=>1000,12975=>1000,12976=>1000,12992=>1000,12993=>1000,12994=>1000,12995=>1000,12996=>1000,12997=>1000,12998=>1000,12999=>1000,13000=>1000,13001=>1000,13002=>1000,13003=>1000,13008=>1000,13009=>1000,13010=>1000,13011=>1000,13012=>1000,13013=>1000,13014=>1000,13015=>1000,13016=>1000,13017=>1000,13018=>1000,13019=>1000,13020=>1000,13021=>1000,13022=>1000,13023=>1000,13024=>1000,13025=>1000,13026=>1000,13027=>1000,13028=>1000,13029=>1000,13030=>1000,13031=>1000,13032=>1000,13033=>1000,13034=>1000,13035=>1000,13036=>1000,13037=>1000,13038=>1000,13039=>1000,13040=>1000,13041=>1000,13042=>1000,13043=>1000,13044=>1000,13045=>1000,13046=>1000,13047=>1000,13048=>1000,13049=>1000,13050=>1000,13051=>1000,13052=>1000,13053=>1000,13054=>1000,13056=>1000,13057=>1000,13058=>1000,13059=>1000,13060=>1000,13061=>1000,13062=>1000,13063=>1000,13064=>1000,13065=>1000,13066=>1000,13067=>1000,13068=>1000,13069=>1000,13070=>1000,13071=>1000,13072=>1000,13073=>1000,13074=>1000,13075=>1000,13076=>1000,13077=>1000,13078=>1000,13079=>1000,13080=>1000,13081=>1000,13082=>1000,13083=>1000,13084=>1000,13085=>1000,13086=>1000,13087=>1000,13088=>1000,13089=>1000,13090=>1000,13091=>1000,13092=>1000,13093=>1000,13094=>1000,13095=>1000,13096=>1000,13097=>1000,13098=>1000,13099=>1000,13100=>1000,13101=>1000,13102=>1000,13103=>1000,13104=>1000,13105=>1000,13106=>1000,13107=>1000,13108=>1000,13109=>1000,13110=>1000,13111=>1000,13112=>1000,13113=>1000,13114=>1000,13115=>1000,13116=>1000,13117=>1000,13118=>1000,13119=>1000,13120=>1000,13121=>1000,13122=>1000,13123=>1000,13124=>1000,13125=>1000,13126=>1000,13127=>1000,13128=>1000,13129=>1000,13130=>1000,13131=>1000,13132=>1000,13133=>1000,13134=>1000,13135=>1000,13136=>1000,13137=>1000,13138=>1000,13139=>1000,13140=>1000,13141=>1000,13142=>1000,13143=>1000,13144=>1000,13145=>1000,13146=>1000,13147=>1000,13148=>1000,13149=>1000,13150=>1000,13151=>1000,13152=>1000,13153=>1000,13154=>1000,13155=>1000,13156=>1000,13157=>1000,13158=>1000,13159=>1000,13160=>1000,13161=>1000,13162=>1000,13163=>1000,13164=>1000,13165=>1000,13166=>1000,13167=>1000,13168=>1000,13169=>1000,13170=>1000,13171=>1000,13172=>1000,13173=>1000,13174=>1000,13179=>1000,13180=>1000,13181=>1000,13182=>1000,13183=>1000,13184=>1000,13185=>1000,13186=>1000,13187=>1000,13188=>1000,13189=>1000,13190=>1000,13191=>1000,13192=>1000,13193=>1000,13194=>1000,13195=>1000,13196=>1000,13197=>1000,13198=>1000,13199=>1000,13200=>1000,13201=>1000,13202=>1000,13203=>1000,13204=>1000,13205=>1000,13206=>1000,13207=>1000,13208=>1000,13209=>1000,13210=>1000,13211=>1000,13212=>1000,13213=>1000,13214=>1000,13215=>1000,13216=>1000,13217=>1000,13218=>1000,13219=>1000,13220=>1000,13221=>1000,13222=>1000,13223=>1000,13224=>1000,13225=>1000,13226=>1000,13227=>1000,13228=>1000,13229=>1000,13230=>1000,13231=>1000,13232=>1000,13233=>1000,13234=>1000,13235=>1000,13236=>1000,13237=>1000,13238=>1000,13239=>1000,13240=>1000,13241=>1000,13242=>1000,13243=>1000,13244=>1000,13245=>1000,13246=>1000,13247=>1000,13248=>1000,13249=>1000,13250=>1000,13251=>1000,13252=>1000,13253=>1000,13254=>1000,13255=>1000,13256=>1000,13257=>1000,13258=>1000,13259=>1000,13260=>1000,13261=>1000,13262=>1000,13263=>1000,13264=>1000,13265=>1000,13266=>1000,13267=>1000,13268=>1000,13269=>1000,13270=>1000,13271=>1000,13272=>1000,13273=>1000,13274=>1000,13275=>1000,13276=>1000,13277=>1000,13280=>1000,13281=>1000,13282=>1000,13283=>1000,13284=>1000,13285=>1000,13286=>1000,13287=>1000,13288=>1000,13289=>1000,13290=>1000,13291=>1000,13292=>1000,13293=>1000,13294=>1000,13295=>1000,13296=>1000,13297=>1000,13298=>1000,13299=>1000,13300=>1000,13301=>1000,13302=>1000,13303=>1000,13304=>1000,13305=>1000,13306=>1000,13307=>1000,13308=>1000,13309=>1000,13310=>1000,19968=>1000,19969=>1000,19970=>1000,19971=>1000,19972=>1000,19973=>1000,19974=>1000,19975=>1000,19976=>1000,19977=>1000,19978=>1000,19979=>1000,19980=>1000,19981=>1000,19982=>1000,19983=>1000,19984=>1000,19985=>1000,19986=>1000,19987=>1000,19988=>1000,19989=>1000,19990=>1000,19991=>1000,19992=>1000,19993=>1000,19994=>1000,19995=>1000,19996=>1000,19997=>1000,19998=>1000,19999=>1000,20000=>1000,20001=>1000,20002=>1000,20003=>1000,20004=>1000,20005=>1000,20006=>1000,20007=>1000,20008=>1000,20009=>1000,20010=>1000,20011=>1000,20012=>1000,20013=>1000,20014=>1000,20015=>1000,20016=>1000,20017=>1000,20018=>1000,20019=>1000,20020=>1000,20021=>1000,20022=>1000,20023=>1000,20024=>1000,20025=>1000,20026=>1000,20027=>1000,20028=>1000,20029=>1000,20030=>1000,20031=>1000,20032=>1000,20033=>1000,20034=>1000,20035=>1000,20036=>1000,20037=>1000,20038=>1000,20039=>1000,20040=>1000,20041=>1000,20042=>1000,20043=>1000,20044=>1000,20045=>1000,20046=>1000,20047=>1000,20048=>1000,20049=>1000,20050=>1000,20051=>1000,20052=>1000,20053=>1000,20054=>1000,20055=>1000,20056=>1000,20057=>1000,20058=>1000,20059=>1000,20060=>1000,20061=>1000,20062=>1000,20063=>1000,20064=>1000,20065=>1000,20066=>1000,20067=>1000,20068=>1000,20069=>1000,20070=>1000,20071=>1000,20072=>1000,20073=>1000,20074=>1000,20075=>1000,20076=>1000,20077=>1000,20078=>1000,20079=>1000,20080=>1000,20081=>1000,20082=>1000,20083=>1000,20084=>1000,20085=>1000,20086=>1000,20087=>1000,20088=>1000,20089=>1000,20090=>1000,20091=>1000,20092=>1000,20093=>1000,20094=>1000,20095=>1000,20096=>1000,20097=>1000,20098=>1000,20099=>1000,20100=>1000,20101=>1000,20102=>1000,20103=>1000,20104=>1000,20105=>1000,20106=>1000,20107=>1000,20108=>1000,20109=>1000,20110=>1000,20111=>1000,20112=>1000,20113=>1000,20114=>1000,20115=>1000,20116=>1000,20117=>1000,20118=>1000,20119=>1000,20120=>1000,20121=>1000,20122=>1000,20123=>1000,20124=>1000,20125=>1000,20126=>1000,20127=>1000,20128=>1000,20129=>1000,20130=>1000,20131=>1000,20132=>1000,20133=>1000,20134=>1000,20135=>1000,20136=>1000,20137=>1000,20138=>1000,20139=>1000,20140=>1000,20141=>1000,20142=>1000,20143=>1000,20144=>1000,20145=>1000,20146=>1000,20147=>1000,20148=>1000,20149=>1000,20150=>1000,20151=>1000,20152=>1000,20153=>1000,20154=>1000,20155=>1000,20156=>1000,20157=>1000,20158=>1000,20159=>1000,20160=>1000,20161=>1000,20162=>1000,20163=>1000,20164=>1000,20165=>1000,20166=>1000,20167=>1000,20168=>1000,20169=>1000,20170=>1000,20171=>1000,20172=>1000,20173=>1000,20174=>1000,20175=>1000,20176=>1000,20177=>1000,20178=>1000,20179=>1000,20180=>1000,20181=>1000,20182=>1000,20183=>1000,20184=>1000,20185=>1000,20186=>1000,20187=>1000,20188=>1000,20189=>1000,20190=>1000,20191=>1000,20192=>1000,20193=>1000,20194=>1000,20195=>1000,20196=>1000,20197=>1000,20198=>1000,20199=>1000,20200=>1000,20201=>1000,20202=>1000,20203=>1000,20204=>1000,20205=>1000,20206=>1000,20207=>1000,20208=>1000,20209=>1000,20210=>1000,20211=>1000,20212=>1000,20213=>1000,20214=>1000,20215=>1000,20216=>1000,20217=>1000,20218=>1000,20219=>1000,20220=>1000,20221=>1000,20222=>1000,20223=>1000,20224=>1000,20225=>1000,20226=>1000,20227=>1000,20228=>1000,20229=>1000,20230=>1000,20231=>1000,20232=>1000,20233=>1000,20234=>1000,20235=>1000,20236=>1000,20237=>1000,20238=>1000,20239=>1000,20240=>1000,20241=>1000,20242=>1000,20243=>1000,20244=>1000,20245=>1000,20246=>1000,20247=>1000,20248=>1000,20249=>1000,20250=>1000,20251=>1000,20252=>1000,20253=>1000,20254=>1000,20255=>1000,20256=>1000,20257=>1000,20258=>1000,20259=>1000,20260=>1000,20261=>1000,20262=>1000,20263=>1000,20264=>1000,20265=>1000,20266=>1000,20267=>1000,20268=>1000,20269=>1000,20270=>1000,20271=>1000,20272=>1000,20273=>1000,20274=>1000,20275=>1000,20276=>1000,20277=>1000,20278=>1000,20279=>1000,20280=>1000,20281=>1000,20282=>1000,20283=>1000,20284=>1000,20285=>1000,20286=>1000,20287=>1000,20288=>1000,20289=>1000,20290=>1000,20291=>1000,20292=>1000,20293=>1000,20294=>1000,20295=>1000,20296=>1000,20297=>1000,20298=>1000,20299=>1000,20300=>1000,20301=>1000,20302=>1000,20303=>1000,20304=>1000,20305=>1000,20306=>1000,20307=>1000,20308=>1000,20309=>1000,20310=>1000,20311=>1000,20312=>1000,20313=>1000,20314=>1000,20315=>1000,20316=>1000,20317=>1000,20318=>1000,20319=>1000,20320=>1000,20321=>1000,20322=>1000,20323=>1000,20324=>1000,20325=>1000,20326=>1000,20327=>1000,20328=>1000,20329=>1000,20330=>1000,20331=>1000,20332=>1000,20333=>1000,20334=>1000,20335=>1000,20336=>1000,20337=>1000,20338=>1000,20339=>1000,20340=>1000,20341=>1000,20342=>1000,20343=>1000,20344=>1000,20345=>1000,20346=>1000,20347=>1000,20348=>1000,20349=>1000,20350=>1000,20351=>1000,20352=>1000,20353=>1000,20354=>1000,20355=>1000,20356=>1000,20357=>1000,20358=>1000,20359=>1000,20360=>1000,20361=>1000,20362=>1000,20363=>1000,20364=>1000,20365=>1000,20366=>1000,20367=>1000,20368=>1000,20369=>1000,20370=>1000,20371=>1000,20372=>1000,20373=>1000,20374=>1000,20375=>1000,20376=>1000,20377=>1000,20378=>1000,20379=>1000,20380=>1000,20381=>1000,20382=>1000,20383=>1000,20384=>1000,20385=>1000,20386=>1000,20387=>1000,20388=>1000,20389=>1000,20390=>1000,20391=>1000,20392=>1000,20393=>1000,20394=>1000,20395=>1000,20396=>1000,20397=>1000,20398=>1000,20399=>1000,20400=>1000,20401=>1000,20402=>1000,20403=>1000,20404=>1000,20405=>1000,20406=>1000,20407=>1000,20408=>1000,20409=>1000,20410=>1000,20411=>1000,20412=>1000,20413=>1000,20414=>1000,20415=>1000,20416=>1000,20417=>1000,20418=>1000,20419=>1000,20420=>1000,20421=>1000,20422=>1000,20423=>1000,20424=>1000,20425=>1000,20426=>1000,20427=>1000,20428=>1000,20429=>1000,20430=>1000,20431=>1000,20432=>1000,20433=>1000,20434=>1000,20435=>1000,20436=>1000,20437=>1000,20438=>1000,20439=>1000,20440=>1000,20441=>1000,20442=>1000,20443=>1000,20444=>1000,20445=>1000,20446=>1000,20447=>1000,20448=>1000,20449=>1000,20450=>1000,20451=>1000,20452=>1000,20453=>1000,20454=>1000,20455=>1000,20456=>1000,20457=>1000,20458=>1000,20459=>1000,20460=>1000,20461=>1000,20462=>1000,20463=>1000,20464=>1000,20465=>1000,20466=>1000,20467=>1000,20468=>1000,20469=>1000,20470=>1000,20471=>1000,20472=>1000,20473=>1000,20474=>1000,20475=>1000,20476=>1000,20477=>1000,20478=>1000,20479=>1000,20480=>1000,20481=>1000,20482=>1000,20483=>1000,20484=>1000,20485=>1000,20486=>1000,20487=>1000,20488=>1000,20489=>1000,20490=>1000,20491=>1000,20492=>1000,20493=>1000,20494=>1000,20495=>1000,20496=>1000,20497=>1000,20498=>1000,20499=>1000,20500=>1000,20501=>1000,20502=>1000,20503=>1000,20504=>1000,20505=>1000,20506=>1000,20507=>1000,20508=>1000,20509=>1000,20510=>1000,20511=>1000,20512=>1000,20513=>1000,20514=>1000,20515=>1000,20516=>1000,20517=>1000,20518=>1000,20519=>1000,20520=>1000,20521=>1000,20522=>1000,20523=>1000,20524=>1000,20525=>1000,20526=>1000,20527=>1000,20528=>1000,20529=>1000,20530=>1000,20531=>1000,20532=>1000,20533=>1000,20534=>1000,20535=>1000,20536=>1000,20537=>1000,20538=>1000,20539=>1000,20540=>1000,20541=>1000,20542=>1000,20543=>1000,20544=>1000,20545=>1000,20546=>1000,20547=>1000,20548=>1000,20549=>1000,20550=>1000,20551=>1000,20552=>1000,20553=>1000,20554=>1000,20555=>1000,20556=>1000,20557=>1000,20558=>1000,20559=>1000,20560=>1000,20561=>1000,20562=>1000,20563=>1000,20564=>1000,20565=>1000,20566=>1000,20567=>1000,20568=>1000,20569=>1000,20570=>1000,20571=>1000,20572=>1000,20573=>1000,20574=>1000,20575=>1000,20576=>1000,20577=>1000,20578=>1000,20579=>1000,20580=>1000,20581=>1000,20582=>1000,20583=>1000,20584=>1000,20585=>1000,20586=>1000,20587=>1000,20588=>1000,20589=>1000,20590=>1000,20591=>1000,20592=>1000,20593=>1000,20594=>1000,20595=>1000,20596=>1000,20597=>1000,20598=>1000,20599=>1000,20600=>1000,20601=>1000,20602=>1000,20603=>1000,20604=>1000,20605=>1000,20606=>1000,20607=>1000,20608=>1000,20609=>1000,20610=>1000,20611=>1000,20612=>1000,20613=>1000,20614=>1000,20615=>1000,20616=>1000,20617=>1000,20618=>1000,20619=>1000,20620=>1000,20621=>1000,20622=>1000,20623=>1000,20624=>1000,20625=>1000,20626=>1000,20627=>1000,20628=>1000,20629=>1000,20630=>1000,20631=>1000,20632=>1000,20633=>1000,20634=>1000,20635=>1000,20636=>1000,20637=>1000,20638=>1000,20639=>1000,20640=>1000,20641=>1000,20642=>1000,20643=>1000,20644=>1000,20645=>1000,20646=>1000,20647=>1000,20648=>1000,20649=>1000,20650=>1000,20651=>1000,20652=>1000,20653=>1000,20654=>1000,20655=>1000,20656=>1000,20657=>1000,20658=>1000,20659=>1000,20660=>1000,20661=>1000,20662=>1000,20663=>1000,20664=>1000,20665=>1000,20666=>1000,20667=>1000,20668=>1000,20669=>1000,20670=>1000,20671=>1000,20672=>1000,20673=>1000,20674=>1000,20675=>1000,20676=>1000,20677=>1000,20678=>1000,20679=>1000,20680=>1000,20681=>1000,20682=>1000,20683=>1000,20684=>1000,20685=>1000,20686=>1000,20687=>1000,20688=>1000,20689=>1000,20690=>1000,20691=>1000,20692=>1000,20693=>1000,20694=>1000,20695=>1000,20696=>1000,20697=>1000,20698=>1000,20699=>1000,20700=>1000,20701=>1000,20702=>1000,20703=>1000,20704=>1000,20705=>1000,20706=>1000,20707=>1000,20708=>1000,20709=>1000,20710=>1000,20711=>1000,20712=>1000,20713=>1000,20714=>1000,20715=>1000,20716=>1000,20717=>1000,20718=>1000,20719=>1000,20720=>1000,20721=>1000,20722=>1000,20723=>1000,20724=>1000,20725=>1000,20726=>1000,20727=>1000,20728=>1000,20729=>1000,20730=>1000,20731=>1000,20732=>1000,20733=>1000,20734=>1000,20735=>1000,20736=>1000,20737=>1000,20738=>1000,20739=>1000,20740=>1000,20741=>1000,20742=>1000,20743=>1000,20744=>1000,20745=>1000,20746=>1000,20747=>1000,20748=>1000,20749=>1000,20750=>1000,20751=>1000,20752=>1000,20753=>1000,20754=>1000,20755=>1000,20756=>1000,20757=>1000,20758=>1000,20759=>1000,20760=>1000,20761=>1000,20762=>1000,20763=>1000,20764=>1000,20765=>1000,20766=>1000,20767=>1000,20768=>1000,20769=>1000,20770=>1000,20771=>1000,20772=>1000,20773=>1000,20774=>1000,20775=>1000,20776=>1000,20777=>1000,20778=>1000,20779=>1000,20780=>1000,20781=>1000,20782=>1000,20783=>1000,20784=>1000,20785=>1000,20786=>1000,20787=>1000,20788=>1000,20789=>1000,20790=>1000,20791=>1000,20792=>1000,20793=>1000,20794=>1000,20795=>1000,20796=>1000,20797=>1000,20798=>1000,20799=>1000,20800=>1000,20801=>1000,20802=>1000,20803=>1000,20804=>1000,20805=>1000,20806=>1000,20807=>1000,20808=>1000,20809=>1000,20810=>1000,20811=>1000,20812=>1000,20813=>1000,20814=>1000,20815=>1000,20816=>1000,20817=>1000,20818=>1000,20819=>1000,20820=>1000,20821=>1000,20822=>1000,20823=>1000,20824=>1000,20825=>1000,20826=>1000,20827=>1000,20828=>1000,20829=>1000,20830=>1000,20831=>1000,20832=>1000,20833=>1000,20834=>1000,20835=>1000,20836=>1000,20837=>1000,20838=>1000,20839=>1000,20840=>1000,20841=>1000,20842=>1000,20843=>1000,20844=>1000,20845=>1000,20846=>1000,20847=>1000,20848=>1000,20849=>1000,20850=>1000,20851=>1000,20852=>1000,20853=>1000,20854=>1000,20855=>1000,20856=>1000,20857=>1000,20858=>1000,20859=>1000,20860=>1000,20861=>1000,20862=>1000,20863=>1000,20864=>1000,20865=>1000,20866=>1000,20867=>1000,20868=>1000,20869=>1000,20870=>1000,20871=>1000,20872=>1000,20873=>1000,20874=>1000,20875=>1000,20876=>1000,20877=>1000,20878=>1000,20879=>1000,20880=>1000,20881=>1000,20882=>1000,20883=>1000,20884=>1000,20885=>1000,20886=>1000,20887=>1000,20888=>1000,20889=>1000,20890=>1000,20891=>1000,20892=>1000,20893=>1000,20894=>1000,20895=>1000,20896=>1000,20897=>1000,20898=>1000,20899=>1000,20900=>1000,20901=>1000,20902=>1000,20903=>1000,20904=>1000,20905=>1000,20906=>1000,20907=>1000,20908=>1000,20909=>1000,20910=>1000,20911=>1000,20912=>1000,20913=>1000,20914=>1000,20915=>1000,20916=>1000,20917=>1000,20918=>1000,20919=>1000,20920=>1000,20921=>1000,20922=>1000,20923=>1000,20924=>1000,20925=>1000,20926=>1000,20927=>1000,20928=>1000,20929=>1000,20930=>1000,20931=>1000,20932=>1000,20933=>1000,20934=>1000,20935=>1000,20936=>1000,20937=>1000,20938=>1000,20939=>1000,20940=>1000,20941=>1000,20942=>1000,20943=>1000,20944=>1000,20945=>1000,20946=>1000,20947=>1000,20948=>1000,20949=>1000,20950=>1000,20951=>1000,20952=>1000,20953=>1000,20954=>1000,20955=>1000,20956=>1000,20957=>1000,20958=>1000,20959=>1000,20960=>1000,20961=>1000,20962=>1000,20963=>1000,20964=>1000,20965=>1000,20966=>1000,20967=>1000,20968=>1000,20969=>1000,20970=>1000,20971=>1000,20972=>1000,20973=>1000,20974=>1000,20975=>1000,20976=>1000,20977=>1000,20978=>1000,20979=>1000,20980=>1000,20981=>1000,20982=>1000,20983=>1000,20984=>1000,20985=>1000,20986=>1000,20987=>1000,20988=>1000,20989=>1000,20990=>1000,20991=>1000,20992=>1000,20993=>1000,20994=>1000,20995=>1000,20996=>1000,20997=>1000,20998=>1000,20999=>1000,21000=>1000,21001=>1000,21002=>1000,21003=>1000,21004=>1000,21005=>1000,21006=>1000,21007=>1000,21008=>1000,21009=>1000,21010=>1000,21011=>1000,21012=>1000,21013=>1000,21014=>1000,21015=>1000,21016=>1000,21017=>1000,21018=>1000,21019=>1000,21020=>1000,21021=>1000,21022=>1000,21023=>1000,21024=>1000,21025=>1000,21026=>1000,21027=>1000,21028=>1000,21029=>1000,21030=>1000,21031=>1000,21032=>1000,21033=>1000,21034=>1000,21035=>1000,21036=>1000,21037=>1000,21038=>1000,21039=>1000,21040=>1000,21041=>1000,21042=>1000,21043=>1000,21044=>1000,21045=>1000,21046=>1000,21047=>1000,21048=>1000,21049=>1000,21050=>1000,21051=>1000,21052=>1000,21053=>1000,21054=>1000,21055=>1000,21056=>1000,21057=>1000,21058=>1000,21059=>1000,21060=>1000,21061=>1000,21062=>1000,21063=>1000,21064=>1000,21065=>1000,21066=>1000,21067=>1000,21068=>1000,21069=>1000,21070=>1000,21071=>1000,21072=>1000,21073=>1000,21074=>1000,21075=>1000,21076=>1000,21077=>1000,21078=>1000,21079=>1000,21080=>1000,21081=>1000,21082=>1000,21083=>1000,21084=>1000,21085=>1000,21086=>1000,21087=>1000,21088=>1000,21089=>1000,21090=>1000,21091=>1000,21092=>1000,21093=>1000,21094=>1000,21095=>1000,21096=>1000,21097=>1000,21098=>1000,21099=>1000,21100=>1000,21101=>1000,21102=>1000,21103=>1000,21104=>1000,21105=>1000,21106=>1000,21107=>1000,21108=>1000,21109=>1000,21110=>1000,21111=>1000,21112=>1000,21113=>1000,21114=>1000,21115=>1000,21116=>1000,21117=>1000,21118=>1000,21119=>1000,21120=>1000,21121=>1000,21122=>1000,21123=>1000,21124=>1000,21125=>1000,21126=>1000,21127=>1000,21128=>1000,21129=>1000,21130=>1000,21131=>1000,21132=>1000,21133=>1000,21134=>1000,21135=>1000,21136=>1000,21137=>1000,21138=>1000,21139=>1000,21140=>1000,21141=>1000,21142=>1000,21143=>1000,21144=>1000,21145=>1000,21146=>1000,21147=>1000,21148=>1000,21149=>1000,21150=>1000,21151=>1000,21152=>1000,21153=>1000,21154=>1000,21155=>1000,21156=>1000,21157=>1000,21158=>1000,21159=>1000,21160=>1000,21161=>1000,21162=>1000,21163=>1000,21164=>1000,21165=>1000,21166=>1000,21167=>1000,21168=>1000,21169=>1000,21170=>1000,21171=>1000,21172=>1000,21173=>1000,21174=>1000,21175=>1000,21176=>1000,21177=>1000,21178=>1000,21179=>1000,21180=>1000,21181=>1000,21182=>1000,21183=>1000,21184=>1000,21185=>1000,21186=>1000,21187=>1000,21188=>1000,21189=>1000,21190=>1000,21191=>1000,21192=>1000,21193=>1000,21194=>1000,21195=>1000,21196=>1000,21197=>1000,21198=>1000,21199=>1000,21200=>1000,21201=>1000,21202=>1000,21203=>1000,21204=>1000,21205=>1000,21206=>1000,21207=>1000,21208=>1000,21209=>1000,21210=>1000,21211=>1000,21212=>1000,21213=>1000,21214=>1000,21215=>1000,21216=>1000,21217=>1000,21218=>1000,21219=>1000,21220=>1000,21221=>1000,21222=>1000,21223=>1000,21224=>1000,21225=>1000,21226=>1000,21227=>1000,21228=>1000,21229=>1000,21230=>1000,21231=>1000,21232=>1000,21233=>1000,21234=>1000,21235=>1000,21236=>1000,21237=>1000,21238=>1000,21239=>1000,21240=>1000,21241=>1000,21242=>1000,21243=>1000,21244=>1000,21245=>1000,21246=>1000,21247=>1000,21248=>1000,21249=>1000,21250=>1000,21251=>1000,21252=>1000,21253=>1000,21254=>1000,21255=>1000,21256=>1000,21257=>1000,21258=>1000,21259=>1000,21260=>1000,21261=>1000,21262=>1000,21263=>1000,21264=>1000,21265=>1000,21266=>1000,21267=>1000,21268=>1000,21269=>1000,21270=>1000,21271=>1000,21272=>1000,21273=>1000,21274=>1000,21275=>1000,21276=>1000,21277=>1000,21278=>1000,21279=>1000,21280=>1000,21281=>1000,21282=>1000,21283=>1000,21284=>1000,21285=>1000,21286=>1000,21287=>1000,21288=>1000,21289=>1000,21290=>1000,21291=>1000,21292=>1000,21293=>994,21294=>1000,21295=>1000,21296=>1000,21297=>1000,21298=>1000,21299=>1000,21300=>1000,21301=>1000,21302=>1000,21303=>1000,21304=>1000,21305=>1000,21306=>1000,21307=>1000,21308=>1000,21309=>1000,21310=>1000,21311=>1000,21312=>1000,21313=>1000,21314=>1000,21315=>1000,21316=>1000,21317=>1000,21318=>1000,21319=>1000,21320=>1000,21321=>1000,21322=>1000,21323=>1000,21324=>1000,21325=>1000,21326=>1000,21327=>1000,21328=>1000,21329=>1000,21330=>1000,21331=>1000,21332=>1000,21333=>1000,21334=>1000,21335=>1000,21336=>1000,21337=>1000,21338=>1000,21339=>1000,21340=>1000,21341=>1000,21342=>1000,21343=>1000,21344=>1000,21345=>1000,21346=>1000,21347=>1000,21348=>1000,21349=>1000,21350=>1000,21351=>1000,21352=>1000,21353=>1000,21354=>1000,21355=>1000,21356=>1000,21357=>1000,21358=>1000,21359=>1000,21360=>1000,21361=>1000,21362=>1000,21363=>1000,21364=>1000,21365=>1000,21366=>1000,21367=>1000,21368=>1000,21369=>1000,21370=>1000,21371=>1000,21372=>1000,21373=>1000,21374=>1000,21375=>1000,21376=>1000,21377=>1000,21378=>1000,21379=>1000,21380=>1000,21381=>1000,21382=>1000,21383=>1000,21384=>1000,21385=>1000,21386=>1000,21387=>1000,21388=>1000,21389=>1000,21390=>1000,21391=>1000,21392=>1000,21393=>1000,21394=>1000,21395=>1000,21396=>1000,21397=>1000,21398=>1000,21399=>1000,21400=>1000,21401=>1000,21402=>1000,21403=>1000,21404=>1000,21405=>1000,21406=>1000,21407=>1000,21408=>1000,21409=>1000,21410=>1000,21411=>1000,21412=>1000,21413=>1000,21414=>1000,21415=>1000,21416=>1000,21417=>1000,21418=>1000,21419=>1000,21420=>1000,21421=>1000,21422=>1000,21423=>1000,21424=>1000,21425=>1000,21426=>1000,21427=>1000,21428=>1000,21429=>1000,21430=>1000,21431=>1000,21432=>1000,21433=>1000,21434=>1000,21435=>1000,21436=>1000,21437=>1000,21438=>1000,21439=>1000,21440=>1000,21441=>1000,21442=>1000,21443=>1000,21444=>1000,21445=>1000,21446=>1000,21447=>1000,21448=>1000,21449=>1000,21450=>1000,21451=>1000,21452=>1000,21453=>1000,21454=>1000,21455=>1000,21456=>1000,21457=>1000,21458=>1000,21459=>1000,21460=>1000,21461=>1000,21462=>1000,21463=>1000,21464=>1000,21465=>1000,21466=>1000,21467=>1000,21468=>1000,21469=>1000,21470=>1000,21471=>1000,21472=>1000,21473=>1000,21474=>1000,21475=>1000,21476=>1000,21477=>1000,21478=>1000,21479=>1000,21480=>1000,21481=>1000,21482=>1000,21483=>1000,21484=>1000,21485=>1000,21486=>1000,21487=>1000,21488=>1000,21489=>1000,21490=>1000,21491=>1000,21492=>1000,21493=>1000,21494=>1000,21495=>1000,21496=>1000,21497=>1000,21498=>1000,21499=>1000,21500=>1000,21501=>1000,21502=>1000,21503=>1000,21504=>1000,21505=>1000,21506=>1000,21507=>1000,21508=>1000,21509=>1000,21510=>1000,21511=>1000,21512=>1000,21513=>1000,21514=>1000,21515=>1000,21516=>1000,21517=>1000,21518=>1000,21519=>1000,21520=>1000,21521=>1000,21522=>1000,21523=>1000,21524=>1000,21525=>1000,21526=>1000,21527=>1000,21528=>1000,21529=>1000,21530=>1000,21531=>1000,21532=>1000,21533=>1000,21534=>1000,21535=>1000,21536=>1000,21537=>1000,21538=>1000,21539=>1000,21540=>1000,21541=>1000,21542=>1000,21543=>1000,21544=>1000,21545=>1000,21546=>1000,21547=>1000,21548=>1000,21549=>1000,21550=>1000,21551=>1000,21552=>1000,21553=>1000,21554=>1000,21555=>1000,21556=>1000,21557=>1000,21558=>1000,21559=>1000,21560=>1000,21561=>1000,21562=>1000,21563=>1000,21564=>1000,21565=>1000,21566=>1000,21567=>1000,21568=>1000,21569=>1000,21570=>1000,21571=>1000,21572=>1000,21573=>1000,21574=>1000,21575=>1000,21576=>1000,21577=>1000,21578=>1000,21579=>1000,21580=>1000,21581=>1000,21582=>1000,21583=>1000,21584=>1000,21585=>1000,21586=>1000,21587=>1000,21588=>1000,21589=>1000,21590=>1000,21591=>1000,21592=>1000,21593=>1000,21594=>1000,21595=>1000,21596=>1000,21597=>1000,21598=>1000,21599=>1000,21600=>1000,21601=>1000,21602=>1000,21603=>1000,21604=>1000,21605=>1000,21606=>1000,21607=>1000,21608=>1000,21609=>1000,21610=>1000,21611=>1000,21612=>1000,21613=>1000,21614=>1000,21615=>1000,21616=>1000,21617=>1000,21618=>1000,21619=>1000,21620=>1000,21621=>1000,21622=>1000,21623=>1000,21624=>1000,21625=>1000,21626=>1000,21627=>1000,21628=>1000,21629=>1000,21630=>1000,21631=>1000,21632=>1000,21633=>1000,21634=>1000,21635=>1000,21636=>1000,21637=>1000,21638=>1000,21639=>1000,21640=>1000,21641=>1000,21642=>1000,21643=>1000,21644=>1000,21645=>1000,21646=>1000,21647=>1000,21648=>1000,21649=>1000,21650=>1000,21651=>1000,21652=>1000,21653=>1000,21654=>1000,21655=>1000,21656=>1000,21657=>1000,21658=>1000,21659=>1000,21660=>1000,21661=>1000,21662=>1000,21663=>1000,21664=>1000,21665=>1000,21666=>1000,21667=>1000,21668=>1000,21669=>1000,21670=>1000,21671=>1000,21672=>1000,21673=>1000,21674=>1000,21675=>1000,21676=>1000,21677=>1000,21678=>1000,21679=>1000,21680=>1000,21681=>1000,21682=>1000,21683=>1000,21684=>1000,21685=>1000,21686=>1000,21687=>1000,21688=>1000,21689=>1000,21690=>1000,21691=>1000,21692=>1000,21693=>1000,21694=>1000,21695=>1000,21696=>1000,21697=>1000,21698=>1000,21699=>1000,21700=>1000,21701=>1000,21702=>1000,21703=>1000,21704=>1000,21705=>1000,21706=>1000,21707=>1000,21708=>1000,21709=>1000,21710=>1000,21711=>1000,21712=>1000,21713=>1000,21714=>1000,21715=>1000,21716=>1000,21717=>1000,21718=>1000,21719=>1000,21720=>1000,21721=>1000,21722=>1000,21723=>1000,21724=>1000,21725=>1000,21726=>1000,21727=>1000,21728=>1000,21729=>1000,21730=>1000,21731=>1000,21732=>1000,21733=>1000,21734=>1000,21735=>1000,21736=>1000,21737=>1000,21738=>1000,21739=>1000,21740=>1000,21741=>1000,21742=>1000,21743=>1000,21744=>1000,21745=>1000,21746=>1000,21747=>1000,21748=>1000,21749=>1000,21750=>1000,21751=>1000,21752=>1000,21753=>1000,21754=>1000,21755=>1000,21756=>1000,21757=>1000,21758=>1000,21759=>1000,21760=>1000,21761=>1000,21762=>1000,21763=>1000,21764=>1000,21765=>1000,21766=>1000,21767=>1000,21768=>1000,21769=>1000,21770=>1000,21771=>1000,21772=>1000,21773=>1000,21774=>1000,21775=>1000,21776=>1000,21777=>1000,21778=>1000,21779=>1000,21780=>1000,21781=>1000,21782=>1000,21783=>1000,21784=>1000,21785=>1000,21786=>1000,21787=>1000,21788=>1000,21789=>1000,21790=>1000,21791=>1000,21792=>1000,21793=>1000,21794=>1000,21795=>1000,21796=>1000,21797=>1000,21798=>1000,21799=>1000,21800=>1000,21801=>1000,21802=>1000,21803=>1000,21804=>1000,21805=>1000,21806=>1000,21807=>1000,21808=>1000,21809=>1000,21810=>1000,21811=>1000,21812=>1000,21813=>1000,21814=>1000,21815=>1000,21816=>1000,21817=>1000,21818=>1000,21819=>1000,21820=>1000,21821=>1000,21822=>1000,21823=>1000,21824=>1000,21825=>1000,21826=>1000,21827=>1000,21828=>1000,21829=>1000,21830=>1000,21831=>1000,21832=>1000,21833=>1000,21834=>1000,21835=>1000,21836=>1000,21837=>1000,21838=>1000,21839=>1000,21840=>1000,21841=>1000,21842=>1000,21843=>1000,21844=>1000,21845=>1000,21846=>1000,21847=>1000,21848=>1000,21849=>1000,21850=>1000,21851=>1000,21852=>1000,21853=>1000,21854=>1000,21855=>1000,21856=>1000,21857=>1000,21858=>1000,21859=>1000,21860=>1000,21861=>1000,21862=>1000,21863=>1000,21864=>1000,21865=>1000,21866=>1000,21867=>1000,21868=>1000,21869=>1000,21870=>1000,21871=>1000,21872=>1000,21873=>1000,21874=>1000,21875=>1000,21876=>1000,21877=>1000,21878=>1000,21879=>1000,21880=>1000,21881=>1000,21882=>1000,21883=>1000,21884=>1000,21885=>1000,21886=>1000,21887=>1000,21888=>1000,21889=>1000,21890=>1000,21891=>1000,21892=>1000,21893=>1000,21894=>1000,21895=>1000,21896=>1000,21897=>1000,21898=>1000,21899=>1000,21900=>1000,21901=>1000,21902=>1000,21903=>1000,21904=>1000,21905=>1000,21906=>1000,21907=>1000,21908=>1000,21909=>1000,21910=>1000,21911=>1000,21912=>1000,21913=>1000,21914=>1000,21915=>1000,21916=>1000,21917=>1000,21918=>1000,21919=>1000,21920=>1000,21921=>1000,21922=>1000,21923=>1000,21924=>1000,21925=>1000,21926=>1000,21927=>1000,21928=>1000,21929=>1000,21930=>1000,21931=>1000,21932=>1000,21933=>1000,21934=>1000,21935=>1000,21936=>1000,21937=>1000,21938=>1000,21939=>1000,21940=>1000,21941=>1000,21942=>1000,21943=>1000,21944=>1000,21945=>1000,21946=>1000,21947=>1000,21948=>1000,21949=>1000,21950=>1000,21951=>1000,21952=>1000,21953=>1000,21954=>1000,21955=>1000,21956=>1000,21957=>1000,21958=>1000,21959=>1000,21960=>1000,21961=>1000,21962=>1000,21963=>1000,21964=>1000,21965=>1000,21966=>1000,21967=>1000,21968=>1000,21969=>1000,21970=>1000,21971=>1000,21972=>1000,21973=>1000,21974=>1000,21975=>1000,21976=>1000,21977=>1000,21978=>1000,21979=>1000,21980=>1000,21981=>1000,21982=>1000,21983=>1000,21984=>1000,21985=>1000,21986=>1000,21987=>1000,21988=>1000,21989=>1000,21990=>1000,21991=>1000,21992=>1000,21993=>1000,21994=>1000,21995=>1000,21996=>1000,21997=>1000,21998=>1000,21999=>1000,22000=>1000,22001=>1000,22002=>1000,22003=>1000,22004=>1000,22005=>1000,22006=>1000,22007=>1000,22008=>1000,22009=>1000,22010=>1000,22011=>1000,22012=>1000,22013=>1000,22014=>1000,22015=>1000,22016=>1000,22017=>1000,22018=>1000,22019=>1000,22020=>1000,22021=>1000,22022=>1000,22023=>1000,22024=>1000,22025=>1000,22026=>1000,22027=>1000,22028=>1000,22029=>1000,22030=>1000,22031=>1000,22032=>1000,22033=>1000,22034=>1000,22035=>1000,22036=>1000,22037=>1000,22038=>1000,22039=>1000,22040=>1000,22041=>1000,22042=>1000,22043=>1000,22044=>1000,22045=>1000,22046=>1000,22047=>1000,22048=>1000,22049=>1000,22050=>1000,22051=>1000,22052=>1000,22053=>1000,22054=>1000,22055=>1000,22056=>1000,22057=>1000,22058=>1000,22059=>1000,22060=>1000,22061=>1000,22062=>1000,22063=>1000,22064=>1000,22065=>1000,22066=>1000,22067=>1000,22068=>1000,22069=>1000,22070=>1000,22071=>1000,22072=>1000,22073=>1000,22074=>1000,22075=>1000,22076=>1000,22077=>1000,22078=>1000,22079=>1000,22080=>1000,22081=>1000,22082=>1000,22083=>1000,22084=>1000,22085=>1000,22086=>1000,22087=>1000,22088=>1000,22089=>1000,22090=>1000,22091=>1000,22092=>1000,22093=>1000,22094=>1000,22095=>1000,22096=>1000,22097=>1000,22098=>1000,22099=>1000,22100=>1000,22101=>1000,22102=>1000,22103=>1000,22104=>1000,22105=>1000,22106=>1000,22107=>1000,22108=>1000,22109=>1000,22110=>1000,22111=>1000,22112=>1000,22113=>1000,22114=>1000,22115=>1000,22116=>1000,22117=>1000,22118=>1000,22119=>1000,22120=>1000,22121=>1000,22122=>1000,22123=>1000,22124=>1000,22125=>1000,22126=>1000,22127=>1000,22128=>1000,22129=>1000,22130=>1000,22131=>1000,22132=>1000,22133=>1000,22134=>1000,22135=>1000,22136=>1000,22137=>1000,22138=>1000,22139=>1000,22140=>1000,22141=>1000,22142=>1000,22143=>1000,22144=>1000,22145=>1000,22146=>1000,22147=>1000,22148=>1000,22149=>1000,22150=>1000,22151=>1000,22152=>1000,22153=>1000,22154=>1000,22155=>1000,22156=>1000,22157=>1000,22158=>1000,22159=>1000,22160=>1000,22161=>1000,22162=>1000,22163=>1000,22164=>1000,22165=>1000,22166=>1000,22167=>1000,22168=>1000,22169=>1000,22170=>1000,22171=>1000,22172=>1000,22173=>1000,22174=>1000,22175=>1000,22176=>1000,22177=>1000,22178=>1000,22179=>1000,22180=>1000,22181=>1000,22182=>1000,22183=>1000,22184=>1000,22185=>1000,22186=>1000,22187=>1000,22188=>1000,22189=>1000,22190=>1000,22191=>1000,22192=>1000,22193=>1000,22194=>1000,22195=>1000,22196=>1000,22197=>1000,22198=>1000,22199=>1000,22200=>1000,22201=>1000,22202=>1000,22203=>1000,22204=>1000,22205=>1000,22206=>1000,22207=>1000,22208=>1000,22209=>1000,22210=>1000,22211=>1000,22212=>1000,22213=>1000,22214=>1000,22215=>1000,22216=>1000,22217=>1000,22218=>1000,22219=>1000,22220=>1000,22221=>1000,22222=>1000,22223=>1000,22224=>1000,22225=>1000,22226=>1000,22227=>1000,22228=>1000,22229=>1000,22230=>1000,22231=>1000,22232=>1000,22233=>1000,22234=>1000,22235=>1000,22236=>1000,22237=>1000,22238=>1000,22239=>1000,22240=>1000,22241=>1000,22242=>1000,22243=>1000,22244=>1000,22245=>1000,22246=>1000,22247=>1000,22248=>1000,22249=>1000,22250=>1000,22251=>1000,22252=>1000,22253=>1000,22254=>1000,22255=>1000,22256=>1000,22257=>1000,22258=>1000,22259=>1000,22260=>1000,22261=>1000,22262=>1000,22263=>1000,22264=>1000,22265=>1000,22266=>1000,22267=>1000,22268=>1000,22269=>1000,22270=>1000,22271=>1000,22272=>1000,22273=>1000,22274=>1000,22275=>1000,22276=>1000,22277=>1000,22278=>1000,22279=>1000,22280=>1000,22281=>1000,22282=>1000,22283=>1000,22284=>1000,22285=>1000,22286=>1000,22287=>1000,22288=>1000,22289=>1000,22290=>1000,22291=>1000,22292=>1000,22293=>1000,22294=>1000,22295=>1000,22296=>1000,22297=>1000,22298=>1000,22299=>1000,22300=>1000,22301=>1000,22302=>1000,22303=>1000,22304=>1000,22305=>1000,22306=>1000,22307=>1000,22308=>1000,22309=>1000,22310=>1000,22311=>1000,22312=>1000,22313=>1000,22314=>1000,22315=>1000,22316=>1000,22317=>1000,22318=>1000,22319=>1000,22320=>1000,22321=>1000,22322=>1000,22323=>1000,22324=>1000,22325=>1000,22326=>1000,22327=>1000,22328=>1000,22329=>1000,22330=>1000,22331=>1000,22332=>1000,22333=>1000,22334=>1000,22335=>1000,22336=>1000,22337=>1000,22338=>1000,22339=>1000,22340=>1000,22341=>1000,22342=>1000,22343=>1000,22344=>1000,22345=>1000,22346=>1000,22347=>1000,22348=>1000,22349=>1000,22350=>1000,22351=>1000,22352=>1000,22353=>1000,22354=>1000,22355=>1000,22356=>1000,22357=>1000,22358=>1000,22359=>1000,22360=>1000,22361=>1000,22362=>1000,22363=>1000,22364=>1000,22365=>1000,22366=>1000,22367=>1000,22368=>1000,22369=>1000,22370=>1000,22371=>1000,22372=>1000,22373=>1000,22374=>1000,22375=>1000,22376=>1000,22377=>1000,22378=>1000,22379=>1000,22380=>1000,22381=>1000,22382=>1000,22383=>1000,22384=>1000,22385=>1000,22386=>1000,22387=>1000,22388=>1000,22389=>1000,22390=>1000,22391=>1000,22392=>1000,22393=>1000,22394=>1000,22395=>1000,22396=>1000,22397=>1000,22398=>1000,22399=>1000,22400=>1000,22401=>1000,22402=>1000,22403=>1000,22404=>1000,22405=>1000,22406=>1000,22407=>1000,22408=>1000,22409=>1000,22410=>1000,22411=>1000,22412=>1000,22413=>1000,22414=>1000,22415=>1000,22416=>1000,22417=>1000,22418=>1000,22419=>1000,22420=>1000,22421=>1000,22422=>1000,22423=>1000,22424=>1000,22425=>1000,22426=>1000,22427=>1000,22428=>1000,22429=>1000,22430=>1000,22431=>1000,22432=>1000,22433=>1000,22434=>1000,22435=>1000,22436=>1000,22437=>1000,22438=>1000,22439=>1000,22440=>1000,22441=>1000,22442=>1000,22443=>1000,22444=>1000,22445=>1000,22446=>1000,22447=>1000,22448=>1000,22449=>1000,22450=>1000,22451=>1000,22452=>1000,22453=>1000,22454=>1000,22455=>1000,22456=>1000,22457=>1000,22458=>1000,22459=>1000,22460=>1000,22461=>1000,22462=>1000,22463=>1000,22464=>1000,22465=>1000,22466=>1000,22467=>1000,22468=>1000,22469=>1000,22470=>1000,22471=>1000,22472=>1000,22473=>1000,22474=>1000,22475=>1000,22476=>1000,22477=>1000,22478=>1000,22479=>1000,22480=>1000,22481=>1000,22482=>1000,22483=>1000,22484=>1000,22485=>1000,22486=>1000,22487=>1000,22488=>1000,22489=>1000,22490=>1000,22491=>1000,22492=>1000,22493=>1000,22494=>1000,22495=>1000,22496=>1000,22497=>1000,22498=>1000,22499=>1000,22500=>1000,22501=>1000,22502=>1000,22503=>1000,22504=>1000,22505=>1000,22506=>1000,22507=>1000,22508=>1000,22509=>1000,22510=>1000,22511=>1000,22512=>1000,22513=>1000,22514=>1000,22515=>1000,22516=>1000,22517=>1000,22518=>1000,22519=>1000,22520=>1000,22521=>1000,22522=>1000,22523=>1000,22524=>1000,22525=>1000,22526=>1000,22527=>1000,22528=>1000,22529=>1000,22530=>1000,22531=>1000,22532=>1000,22533=>1000,22534=>1000,22535=>1000,22536=>1000,22537=>1000,22538=>1000,22539=>1000,22540=>1000,22541=>1000,22542=>1000,22543=>1000,22544=>1000,22545=>1000,22546=>1000,22547=>1000,22548=>1000,22549=>1000,22550=>1000,22551=>1000,22552=>1000,22553=>1000,22554=>1000,22555=>1000,22556=>1000,22557=>1000,22558=>1000,22559=>1000,22560=>1000,22561=>1000,22562=>1000,22563=>1000,22564=>1000,22565=>1000,22566=>1000,22567=>1000,22568=>1000,22569=>1000,22570=>1000,22571=>1000,22572=>1000,22573=>1000,22574=>1000,22575=>1000,22576=>1000,22577=>1000,22578=>1000,22579=>1000,22580=>1000,22581=>1000,22582=>1000,22583=>1000,22584=>1000,22585=>1000,22586=>1000,22587=>1000,22588=>1000,22589=>1000,22590=>1000,22591=>1000,22592=>1000,22593=>1000,22594=>1000,22595=>1000,22596=>1000,22597=>1000,22598=>1000,22599=>1000,22600=>1000,22601=>1000,22602=>1000,22603=>1000,22604=>1000,22605=>1000,22606=>1000,22607=>1000,22608=>1000,22609=>1000,22610=>1000,22611=>1000,22612=>1000,22613=>1000,22614=>1000,22615=>1000,22616=>1000,22617=>1000,22618=>1000,22619=>1000,22620=>1000,22621=>1000,22622=>1000,22623=>1000,22624=>1000,22625=>1000,22626=>1000,22627=>1000,22628=>1000,22629=>1000,22630=>1000,22631=>1000,22632=>1000,22633=>1000,22634=>1000,22635=>1000,22636=>1000,22637=>1000,22638=>1000,22639=>1000,22640=>1000,22641=>1000,22642=>1000,22643=>1000,22644=>1000,22645=>1000,22646=>1000,22647=>1000,22648=>1000,22649=>1000,22650=>1000,22651=>1000,22652=>1000,22653=>1000,22654=>1000,22655=>1000,22656=>1000,22657=>1000,22658=>1000,22659=>1000,22660=>1000,22661=>1000,22662=>1000,22663=>1000,22664=>1000,22665=>1000,22666=>1000,22667=>1000,22668=>1000,22669=>1000,22670=>1000,22671=>1000,22672=>1000,22673=>1000,22674=>1000,22675=>1000,22676=>1000,22677=>1000,22678=>1000,22679=>1000,22680=>1000,22681=>1000,22682=>1000,22683=>1000,22684=>1000,22685=>1000,22686=>1000,22687=>1000,22688=>1000,22689=>1000,22690=>1000,22691=>1000,22692=>1000,22693=>1000,22694=>1000,22695=>1000,22696=>1000,22697=>1000,22698=>1000,22699=>1000,22700=>1000,22701=>1000,22702=>1000,22703=>1000,22704=>1000,22705=>1000,22706=>1000,22707=>1000,22708=>1000,22709=>1000,22710=>1000,22711=>1000,22712=>1000,22713=>1000,22714=>1000,22715=>1000,22716=>1000,22717=>1000,22718=>1000,22719=>1000,22720=>1000,22721=>1000,22722=>1000,22723=>1000,22724=>1000,22725=>1000,22726=>1000,22727=>1000,22728=>1000,22729=>1000,22730=>1000,22731=>1000,22732=>1000,22733=>1000,22734=>1000,22735=>1000,22736=>1000,22737=>1000,22738=>1000,22739=>1000,22740=>1000,22741=>1000,22742=>1000,22743=>1000,22744=>1000,22745=>1000,22746=>1000,22747=>1000,22748=>1000,22749=>1000,22750=>1000,22751=>1000,22752=>1000,22753=>1000,22754=>1000,22755=>1000,22756=>1000,22757=>1000,22758=>1000,22759=>1000,22760=>1000,22761=>1000,22762=>1000,22763=>1000,22764=>1000,22765=>1000,22766=>1000,22767=>1000,22768=>1000,22769=>1000,22770=>1000,22771=>1000,22772=>1000,22773=>1000,22774=>1000,22775=>1000,22776=>1000,22777=>1000,22778=>1000,22779=>1000,22780=>1000,22781=>1000,22782=>1000,22783=>1000,22784=>1000,22785=>1000,22786=>1000,22787=>1000,22788=>1000,22789=>1000,22790=>1000,22791=>1000,22792=>1000,22793=>1000,22794=>1000,22795=>1000,22796=>1000,22797=>1000,22798=>1000,22799=>1000,22800=>1000,22801=>1000,22802=>1000,22803=>1000,22804=>1000,22805=>1000,22806=>1000,22807=>1000,22808=>1000,22809=>1000,22810=>1000,22811=>1000,22812=>1000,22813=>1000,22814=>1000,22815=>1000,22816=>1000,22817=>1000,22818=>1000,22819=>1000,22820=>1000,22821=>1000,22822=>1000,22823=>1000,22824=>1000,22825=>1000,22826=>1000,22827=>1000,22828=>1000,22829=>1000,22830=>1000,22831=>1000,22832=>1000,22833=>1000,22834=>1000,22835=>1000,22836=>1000,22837=>1000,22838=>1000,22839=>1000,22840=>1000,22841=>1000,22842=>1000,22843=>1000,22844=>1000,22845=>1000,22846=>1000,22847=>1000,22848=>1000,22849=>1000,22850=>1000,22851=>1000,22852=>1000,22853=>1000,22854=>1000,22855=>1000,22856=>1000,22857=>1000,22858=>1000,22859=>1000,22860=>1000,22861=>1000,22862=>1000,22863=>1000,22864=>1000,22865=>1000,22866=>1000,22867=>1000,22868=>1000,22869=>1000,22870=>1000,22871=>1000,22872=>1000,22873=>1000,22874=>1000,22875=>1000,22876=>1000,22877=>1000,22878=>1000,22879=>1000,22880=>1000,22881=>1000,22882=>1000,22883=>1000,22884=>1000,22885=>1000,22886=>1000,22887=>1000,22888=>1000,22889=>1000,22890=>1000,22891=>1000,22892=>1000,22893=>1000,22894=>1000,22895=>1000,22896=>1000,22897=>1000,22898=>1000,22899=>1000,22900=>1000,22901=>1000,22902=>1000,22903=>1000,22904=>1000,22905=>1000,22906=>1000,22907=>1000,22908=>1000,22909=>1000,22910=>1000,22911=>1000,22912=>1000,22913=>1000,22914=>1000,22915=>1000,22916=>1000,22917=>1000,22918=>1000,22919=>1000,22920=>1000,22921=>1000,22922=>1000,22923=>1000,22924=>1000,22925=>1000,22926=>1000,22927=>1000,22928=>1000,22929=>1000,22930=>1000,22931=>1000,22932=>1000,22933=>1000,22934=>1000,22935=>1000,22936=>1000,22937=>1000,22938=>1000,22939=>1000,22940=>1000,22941=>1000,22942=>1000,22943=>1000,22944=>1000,22945=>1000,22946=>1000,22947=>1000,22948=>1000,22949=>1000,22950=>1000,22951=>1000,22952=>1000,22953=>1000,22954=>1000,22955=>1000,22956=>1000,22957=>1000,22958=>1000,22959=>1000,22960=>1000,22961=>1000,22962=>1000,22963=>1000,22964=>1000,22965=>1000,22966=>1000,22967=>1000,22968=>1000,22969=>1000,22970=>1000,22971=>1000,22972=>1000,22973=>1000,22974=>1000,22975=>1000,22976=>1000,22977=>1000,22978=>1000,22979=>1000,22980=>1000,22981=>1000,22982=>1000,22983=>1000,22984=>1000,22985=>1000,22986=>1000,22987=>1000,22988=>1000,22989=>1000,22990=>1000,22991=>1000,22992=>1000,22993=>1000,22994=>1000,22995=>1000,22996=>1000,22997=>1000,22998=>1000,22999=>1000,23000=>1000,23001=>1000,23002=>1000,23003=>1000,23004=>1000,23005=>1000,23006=>1000,23007=>1000,23008=>1000,23009=>1000,23010=>1000,23011=>1000,23012=>1000,23013=>1000,23014=>1000,23015=>1000,23016=>1000,23017=>1000,23018=>1000,23019=>1000,23020=>1000,23021=>1000,23022=>1000,23023=>1000,23024=>1000,23025=>1000,23026=>1000,23027=>1000,23028=>1000,23029=>1000,23030=>1000,23031=>1000,23032=>1000,23033=>1000,23034=>1000,23035=>1000,23036=>1000,23037=>1000,23038=>1000,23039=>1000,23040=>1000,23041=>1000,23042=>1000,23043=>1000,23044=>1000,23045=>1000,23046=>1000,23047=>1000,23048=>1000,23049=>1000,23050=>1000,23051=>1000,23052=>1000,23053=>1000,23054=>1000,23055=>1000,23056=>1000,23057=>1000,23058=>1000,23059=>1000,23060=>1000,23061=>1000,23062=>1000,23063=>1000,23064=>1000,23065=>1000,23066=>1000,23067=>1000,23068=>1000,23069=>1000,23070=>1000,23071=>1000,23072=>1000,23073=>1000,23074=>1000,23075=>1000,23076=>1000,23077=>1000,23078=>1000,23079=>1000,23080=>1000,23081=>1000,23082=>1000,23083=>1000,23084=>1000,23085=>1000,23086=>1000,23087=>1000,23088=>1000,23089=>1000,23090=>1000,23091=>1000,23092=>1000,23093=>1000,23094=>1000,23095=>1000,23096=>1000,23097=>1000,23098=>1000,23099=>1000,23100=>1000,23101=>1000,23102=>1000,23103=>1000,23104=>1000,23105=>1000,23106=>1000,23107=>1000,23108=>1000,23109=>1000,23110=>1000,23111=>1000,23112=>1000,23113=>1000,23114=>1000,23115=>1000,23116=>1000,23117=>1000,23118=>1000,23119=>1000,23120=>1000,23121=>1000,23122=>1000,23123=>1000,23124=>1000,23125=>1000,23126=>1000,23127=>1000,23128=>1000,23129=>1000,23130=>1000,23131=>1000,23132=>1000,23133=>1000,23134=>1000,23135=>1000,23136=>1000,23137=>1000,23138=>1000,23139=>1000,23140=>1000,23141=>1000,23142=>1000,23143=>1000,23144=>1000,23145=>1000,23146=>1000,23147=>1000,23148=>1000,23149=>1000,23150=>1000,23151=>1000,23152=>1000,23153=>1000,23154=>1000,23155=>1000,23156=>1000,23157=>1000,23158=>1000,23159=>1000,23160=>1000,23161=>1000,23162=>1000,23163=>1000,23164=>1000,23165=>1000,23166=>1000,23167=>1000,23168=>1000,23169=>1000,23170=>1000,23171=>1000,23172=>1000,23173=>1000,23174=>1000,23175=>1000,23176=>1000,23177=>1000,23178=>1000,23179=>1000,23180=>1000,23181=>1000,23182=>1000,23183=>1000,23184=>1000,23185=>1000,23186=>1000,23187=>1000,23188=>1000,23189=>1000,23190=>1000,23191=>1000,23192=>1000,23193=>1000,23194=>1000,23195=>1000,23196=>1000,23197=>1000,23198=>1000,23199=>1000,23200=>1000,23201=>1000,23202=>1000,23203=>1000,23204=>1000,23205=>1000,23206=>1000,23207=>1000,23208=>1000,23209=>1000,23210=>1000,23211=>1000,23212=>1000,23213=>1000,23214=>1000,23215=>1000,23216=>1000,23217=>1000,23218=>1000,23219=>1000,23220=>1000,23221=>1000,23222=>1000,23223=>1000,23224=>1000,23225=>1000,23226=>1000,23227=>1000,23228=>1000,23229=>1000,23230=>1000,23231=>1000,23232=>1000,23233=>1000,23234=>1000,23235=>1000,23236=>1000,23237=>1000,23238=>1000,23239=>1000,23240=>1000,23241=>1000,23242=>1000,23243=>1000,23244=>1000,23245=>1000,23246=>1000,23247=>1000,23248=>1000,23249=>1000,23250=>1000,23251=>1000,23252=>1000,23253=>1000,23254=>1000,23255=>1000,23256=>1000,23257=>1000,23258=>1000,23259=>1000,23260=>1000,23261=>1000,23262=>1000,23263=>1000,23264=>1000,23265=>1000,23266=>1000,23267=>1000,23268=>1000,23269=>1000,23270=>1000,23271=>1000,23272=>1000,23273=>1000,23274=>1000,23275=>1000,23276=>1000,23277=>1000,23278=>1000,23279=>1000,23280=>1000,23281=>1000,23282=>1000,23283=>1000,23284=>1000,23285=>1000,23286=>1000,23287=>1000,23288=>1000,23289=>1000,23290=>1000,23291=>1000,23292=>1000,23293=>1000,23294=>1000,23295=>1000,23296=>1000,23297=>1000,23298=>1000,23299=>1000,23300=>1000,23301=>1000,23302=>1000,23303=>1000,23304=>1000,23305=>1000,23306=>1000,23307=>1000,23308=>1000,23309=>1000,23310=>1000,23311=>1000,23312=>1000,23313=>1000,23314=>1000,23315=>1000,23316=>1000,23317=>1000,23318=>1000,23319=>1000,23320=>1000,23321=>1000,23322=>1000,23323=>1000,23324=>1000,23325=>1000,23326=>1000,23327=>1000,23328=>1000,23329=>1000,23330=>1000,23331=>1000,23332=>1000,23333=>1000,23334=>1000,23335=>1000,23336=>1000,23337=>1000,23338=>1000,23339=>1000,23340=>1000,23341=>1000,23342=>1000,23343=>1000,23344=>1000,23345=>1000,23346=>1000,23347=>1000,23348=>1000,23349=>1000,23350=>1000,23351=>1000,23352=>1000,23353=>1000,23354=>1000,23355=>1000,23356=>1000,23357=>1000,23358=>1000,23359=>1000,23360=>1000,23361=>1000,23362=>1000,23363=>1000,23364=>1000,23365=>1000,23366=>1000,23367=>1000,23368=>1000,23369=>1000,23370=>1000,23371=>1000,23372=>1000,23373=>1000,23374=>1000,23375=>1000,23376=>1000,23377=>1000,23378=>1000,23379=>1000,23380=>1000,23381=>1000,23382=>1000,23383=>1000,23384=>1000,23385=>1000,23386=>1000,23387=>1000,23388=>1000,23389=>1000,23390=>1000,23391=>1000,23392=>1000,23393=>1000,23394=>1000,23395=>1000,23396=>1000,23397=>1000,23398=>1000,23399=>1000,23400=>1000,23401=>1000,23402=>1000,23403=>1000,23404=>1000,23405=>1000,23406=>1000,23407=>1000,23408=>1000,23409=>1000,23410=>1000,23411=>1000,23412=>1000,23413=>1000,23414=>1000,23415=>1000,23416=>1000,23417=>1000,23418=>1000,23419=>1000,23420=>1000,23421=>1000,23422=>1000,23423=>1000,23424=>1000,23425=>1000,23426=>1000,23427=>1000,23428=>1000,23429=>1000,23430=>1000,23431=>1000,23432=>1000,23433=>1000,23434=>1000,23435=>1000,23436=>1000,23437=>1000,23438=>1000,23439=>1000,23440=>1000,23441=>1000,23442=>1000,23443=>1000,23444=>1000,23445=>1000,23446=>1000,23447=>1000,23448=>1000,23449=>1000,23450=>1000,23451=>1000,23452=>1000,23453=>1000,23454=>1000,23455=>1000,23456=>1000,23457=>1000,23458=>1000,23459=>1000,23460=>1000,23461=>1000,23462=>1000,23463=>1000,23464=>1000,23465=>1000,23466=>1000,23467=>1000,23468=>1000,23469=>1000,23470=>1000,23471=>1000,23472=>1000,23473=>1000,23474=>1000,23475=>1000,23476=>1000,23477=>1000,23478=>1000,23479=>1000,23480=>1000,23481=>1000,23482=>1000,23483=>1000,23484=>1000,23485=>1000,23486=>1000,23487=>1000,23488=>1000,23489=>1000,23490=>1000,23491=>1000,23492=>1000,23493=>1000,23494=>1000,23495=>1000,23496=>1000,23497=>1000,23498=>1000,23499=>1000,23500=>1000,23501=>1000,23502=>1000,23503=>1000,23504=>1000,23505=>1000,23506=>1000,23507=>1000,23508=>1000,23509=>1000,23510=>1000,23511=>1000,23512=>1000,23513=>1000,23514=>1000,23515=>1000,23516=>1000,23517=>1000,23518=>1000,23519=>1000,23520=>1000,23521=>1000,23522=>1000,23523=>1000,23524=>1000,23525=>1000,23526=>1000,23527=>1000,23528=>1000,23529=>1000,23530=>1000,23531=>1000,23532=>1000,23533=>1000,23534=>1000,23535=>1000,23536=>1000,23537=>1000,23538=>1000,23539=>1000,23540=>1000,23541=>1000,23542=>1000,23543=>1000,23544=>1000,23545=>1000,23546=>1000,23547=>1000,23548=>1000,23549=>1000,23550=>1000,23551=>1000,23552=>1000,23553=>1000,23554=>1000,23555=>1000,23556=>1000,23557=>1000,23558=>1000,23559=>1000,23560=>1000,23561=>1000,23562=>1000,23563=>1000,23564=>1000,23565=>1000,23566=>1000,23567=>1000,23568=>1000,23569=>1000,23570=>1000,23571=>1000,23572=>1000,23573=>1000,23574=>1000,23575=>1000,23576=>1000,23577=>1000,23578=>1000,23579=>1000,23580=>1000,23581=>1000,23582=>1000,23583=>1000,23584=>1000,23585=>1000,23586=>1000,23587=>1000,23588=>1000,23589=>1000,23590=>1000,23591=>1000,23592=>1000,23593=>1000,23594=>1000,23595=>1000,23596=>1000,23597=>1000,23598=>1000,23599=>1000,23600=>1000,23601=>1000,23602=>1000,23603=>1000,23604=>1000,23605=>1000,23606=>1000,23607=>1000,23608=>1000,23609=>1000,23610=>1000,23611=>1000,23612=>1000,23613=>1000,23614=>1000,23615=>1000,23616=>1000,23617=>1000,23618=>1000,23619=>1000,23620=>1000,23621=>1000,23622=>1000,23623=>1000,23624=>1000,23625=>1000,23626=>1000,23627=>1000,23628=>1000,23629=>1000,23630=>1000,23631=>1000,23632=>1000,23633=>1000,23634=>1000,23635=>1000,23636=>1000,23637=>1000,23638=>1000,23639=>1000,23640=>1000,23641=>1000,23642=>1000,23643=>1000,23644=>1000,23645=>1000,23646=>1000,23647=>1000,23648=>1000,23649=>1000,23650=>1000,23651=>1000,23652=>1000,23653=>1000,23654=>1000,23655=>1000,23656=>1000,23657=>1000,23658=>1000,23659=>1000,23660=>1000,23661=>1000,23662=>1000,23663=>1000,23664=>1000,23665=>1000,23666=>1000,23667=>1000,23668=>1000,23669=>1000,23670=>1000,23671=>1000,23672=>1000,23673=>1000,23674=>1000,23675=>1000,23676=>1000,23677=>1000,23678=>1000,23679=>1000,23680=>1000,23681=>1000,23682=>1000,23683=>1000,23684=>1000,23685=>1000,23686=>1000,23687=>1000,23688=>1000,23689=>1000,23690=>1000,23691=>1000,23692=>1000,23693=>1000,23694=>1000,23695=>1000,23696=>1000,23697=>1000,23698=>1000,23699=>1000,23700=>1000,23701=>1000,23702=>1000,23703=>1000,23704=>1000,23705=>1000,23706=>1000,23707=>1000,23708=>1000,23709=>1000,23710=>1000,23711=>1000,23712=>1000,23713=>1000,23714=>1000,23715=>1000,23716=>1000,23717=>1000,23718=>1000,23719=>1000,23720=>1000,23721=>1000,23722=>1000,23723=>1000,23724=>1000,23725=>1000,23726=>1000,23727=>1000,23728=>1000,23729=>1000,23730=>1000,23731=>1000,23732=>1000,23733=>1000,23734=>1000,23735=>1000,23736=>1000,23737=>1000,23738=>1000,23739=>1000,23740=>1000,23741=>1000,23742=>1000,23743=>1000,23744=>1000,23745=>1000,23746=>1000,23747=>1000,23748=>1000,23749=>1000,23750=>1000,23751=>1000,23752=>1000,23753=>1000,23754=>1000,23755=>1000,23756=>1000,23757=>1000,23758=>1000,23759=>1000,23760=>1000,23761=>1000,23762=>1000,23763=>1000,23764=>1000,23765=>1000,23766=>1000,23767=>1000,23768=>1000,23769=>1000,23770=>1000,23771=>1000,23772=>1000,23773=>1000,23774=>1000,23775=>1000,23776=>1000,23777=>1000,23778=>1000,23779=>1000,23780=>1000,23781=>1000,23782=>1000,23783=>1000,23784=>1000,23785=>1000,23786=>1000,23787=>1000,23788=>1000,23789=>1000,23790=>1000,23791=>1000,23792=>1000,23793=>1000,23794=>1000,23795=>1000,23796=>1000,23797=>1000,23798=>1000,23799=>1000,23800=>1000,23801=>1000,23802=>1000,23803=>1000,23804=>1000,23805=>1000,23806=>1000,23807=>1000,23808=>1000,23809=>1000,23810=>1000,23811=>1000,23812=>1000,23813=>1000,23814=>1000,23815=>1000,23816=>1000,23817=>1000,23818=>1000,23819=>1000,23820=>1000,23821=>1000,23822=>1000,23823=>1000,23824=>1000,23825=>1000,23826=>1000,23827=>1000,23828=>1000,23829=>1000,23830=>1000,23831=>1000,23832=>1000,23833=>1000,23834=>1000,23835=>1000,23836=>1000,23837=>1000,23838=>1000,23839=>1000,23840=>1000,23841=>1000,23842=>1000,23843=>1000,23844=>1000,23845=>1000,23846=>1000,23847=>1000,23848=>1000,23849=>1000,23850=>1000,23851=>1000,23852=>1000,23853=>1000,23854=>1000,23855=>1000,23856=>1000,23857=>1000,23858=>1000,23859=>1000,23860=>1000,23861=>1000,23862=>1000,23863=>1000,23864=>1000,23865=>1000,23866=>1000,23867=>1000,23868=>1000,23869=>1000,23870=>1000,23871=>1000,23872=>1000,23873=>1000,23874=>1000,23875=>1000,23876=>1000,23877=>1000,23878=>1000,23879=>1000,23880=>1000,23881=>1000,23882=>1000,23883=>1000,23884=>1000,23885=>1000,23886=>1000,23887=>1000,23888=>1000,23889=>1000,23890=>1000,23891=>1000,23892=>1000,23893=>1000,23894=>1000,23895=>1000,23896=>1000,23897=>1000,23898=>1000,23899=>1000,23900=>1000,23901=>1000,23902=>1000,23903=>1000,23904=>1000,23905=>1000,23906=>1000,23907=>1000,23908=>1000,23909=>1000,23910=>1000,23911=>1000,23912=>1000,23913=>1000,23914=>1000,23915=>1000,23916=>1000,23917=>1000,23918=>1000,23919=>1000,23920=>1000,23921=>1000,23922=>1000,23923=>1000,23924=>1000,23925=>1000,23926=>1000,23927=>1000,23928=>1000,23929=>1000,23930=>1000,23931=>1000,23932=>1000,23933=>1000,23934=>1000,23935=>1000,23936=>1000,23937=>1000,23938=>1000,23939=>1000,23940=>1000,23941=>1000,23942=>1000,23943=>1000,23944=>1000,23945=>1000,23946=>1000,23947=>1000,23948=>1000,23949=>1000,23950=>1000,23951=>1000,23952=>1000,23953=>1000,23954=>1000,23955=>1000,23956=>1000,23957=>1000,23958=>1000,23959=>1000,23960=>1000,23961=>1000,23962=>1000,23963=>1000,23964=>1000,23965=>1000,23966=>1000,23967=>1000,23968=>1000,23969=>1000,23970=>1000,23971=>1000,23972=>1000,23973=>1000,23974=>1000,23975=>1000,23976=>1000,23977=>1000,23978=>1000,23979=>1000,23980=>1000,23981=>1000,23982=>1000,23983=>1000,23984=>1000,23985=>1000,23986=>1000,23987=>1000,23988=>1000,23989=>1000,23990=>1000,23991=>1000,23992=>1000,23993=>1000,23994=>1000,23995=>1000,23996=>1000,23997=>1000,23998=>1000,23999=>1000,24000=>1000,24001=>1000,24002=>1000,24003=>1000,24004=>1000,24005=>1000,24006=>1000,24007=>1000,24008=>1000,24009=>1000,24010=>1000,24011=>1000,24012=>1000,24013=>1000,24014=>1000,24015=>1000,24016=>1000,24017=>1000,24018=>1000,24019=>1000,24020=>1000,24021=>1000,24022=>1000,24023=>1000,24024=>1000,24025=>1000,24026=>1000,24027=>1000,24028=>1000,24029=>1000,24030=>1000,24031=>1000,24032=>1000,24033=>1000,24034=>1000,24035=>1000,24036=>1000,24037=>1000,24038=>1000,24039=>1000,24040=>1000,24041=>1000,24042=>1000,24043=>1000,24044=>1000,24045=>1000,24046=>1000,24047=>1000,24048=>1000,24049=>1000,24050=>1000,24051=>1000,24052=>1000,24053=>1000,24054=>1000,24055=>1000,24056=>1000,24057=>1000,24058=>1000,24059=>1000,24060=>1000,24061=>1000,24062=>1000,24063=>1000,24064=>1000,24065=>1000,24066=>1000,24067=>1000,24068=>1000,24069=>1000,24070=>1000,24071=>1000,24072=>1000,24073=>1000,24074=>1000,24075=>1000,24076=>1000,24077=>1000,24078=>1000,24079=>1000,24080=>1000,24081=>1000,24082=>1000,24083=>1000,24084=>1000,24085=>1000,24086=>1000,24087=>1000,24088=>1000,24089=>1000,24090=>1000,24091=>1000,24092=>1000,24093=>1000,24094=>1000,24095=>1000,24096=>1000,24097=>1000,24098=>1000,24099=>1000,24100=>1000,24101=>1000,24102=>1000,24103=>1000,24104=>1000,24105=>1000,24106=>1000,24107=>1000,24108=>1000,24109=>1000,24110=>1000,24111=>1000,24112=>1000,24113=>1000,24114=>1000,24115=>1000,24116=>1000,24117=>1000,24118=>1000,24119=>1000,24120=>1000,24121=>1000,24122=>1000,24123=>1000,24124=>1000,24125=>1000,24126=>1000,24127=>1000,24128=>1000,24129=>1000,24130=>1000,24131=>1000,24132=>1000,24133=>1000,24134=>1000,24135=>1000,24136=>1000,24137=>1000,24138=>1000,24139=>1000,24140=>1000,24141=>1000,24142=>1000,24143=>1000,24144=>1000,24145=>1000,24146=>1000,24147=>1000,24148=>1000,24149=>1000,24150=>1000,24151=>1000,24152=>1000,24153=>1000,24154=>1000,24155=>1000,24156=>1000,24157=>1000,24158=>1000,24159=>1000,24160=>1000,24161=>1000,24162=>1000,24163=>1000,24164=>1000,24165=>1000,24166=>1000,24167=>1000,24168=>1000,24169=>1000,24170=>1000,24171=>1000,24172=>1000,24173=>1000,24174=>1000,24175=>1000,24176=>1000,24177=>1000,24178=>1000,24179=>1000,24180=>1000,24181=>1000,24182=>1000,24183=>1000,24184=>1000,24185=>1000,24186=>1000,24187=>1000,24188=>1000,24189=>1000,24190=>1000,24191=>1000,24192=>1000,24193=>1000,24194=>1000,24195=>1000,24196=>1000,24197=>1000,24198=>1000,24199=>1000,24200=>1000,24201=>1000,24202=>1000,24203=>1000,24204=>1000,24205=>1000,24206=>1000,24207=>1000,24208=>1000,24209=>1000,24210=>1000,24211=>1000,24212=>1000,24213=>1000,24214=>1000,24215=>1000,24216=>1000,24217=>1000,24218=>1000,24219=>1000,24220=>1000,24221=>1000,24222=>1000,24223=>1000,24224=>1000,24225=>1000,24226=>1000,24227=>1000,24228=>1000,24229=>1000,24230=>1000,24231=>1000,24232=>1000,24233=>1000,24234=>1000,24235=>1000,24236=>1000,24237=>1000,24238=>1000,24239=>1000,24240=>1000,24241=>1000,24242=>1000,24243=>1000,24244=>1000,24245=>1000,24246=>1000,24247=>1000,24248=>1000,24249=>1000,24250=>1000,24251=>1000,24252=>1000,24253=>1000,24254=>1000,24255=>1000,24256=>1000,24257=>1000,24258=>1000,24259=>1000,24260=>1000,24261=>1000,24262=>1000,24263=>1000,24264=>1000,24265=>1000,24266=>1000,24267=>1000,24268=>1000,24269=>1000,24270=>1000,24271=>1000,24272=>1000,24273=>1000,24274=>1000,24275=>1000,24276=>1000,24277=>1000,24278=>1000,24279=>1000,24280=>1000,24281=>1000,24282=>1000,24283=>1000,24284=>1000,24285=>1000,24286=>1000,24287=>1000,24288=>1000,24289=>1000,24290=>1000,24291=>1000,24292=>1000,24293=>1000,24294=>1000,24295=>1000,24296=>1000,24297=>1000,24298=>1000,24299=>1000,24300=>1000,24301=>1000,24302=>1000,24303=>1000,24304=>1000,24305=>1000,24306=>1000,24307=>1000,24308=>1000,24309=>1000,24310=>1000,24311=>1000,24312=>1000,24313=>1000,24314=>1000,24315=>1000,24316=>1000,24317=>1000,24318=>1000,24319=>1000,24320=>1000,24321=>1000,24322=>1000,24323=>1000,24324=>1000,24325=>1000,24326=>1000,24327=>1000,24328=>1000,24329=>1000,24330=>1000,24331=>1000,24332=>1000,24333=>1000,24334=>1000,24335=>1000,24336=>1000,24337=>1000,24338=>1000,24339=>1000,24340=>1000,24341=>1000,24342=>1000,24343=>1000,24344=>1000,24345=>1000,24346=>1000,24347=>1000,24348=>1000,24349=>1000,24350=>1000,24351=>1000,24352=>1000,24353=>1000,24354=>1000,24355=>1000,24356=>1000,24357=>1000,24358=>1000,24359=>1000,24360=>1000,24361=>1000,24362=>1000,24363=>1000,24364=>1000,24365=>1000,24366=>1000,24367=>1000,24368=>1000,24369=>1000,24370=>1000,24371=>1000,24372=>1000,24373=>1000,24374=>1000,24375=>1000,24376=>1000,24377=>1000,24378=>1000,24379=>1000,24380=>1000,24381=>1000,24382=>1000,24383=>1000,24384=>1000,24385=>1000,24386=>1000,24387=>1000,24388=>1000,24389=>1000,24390=>1000,24391=>1000,24392=>1000,24393=>1000,24394=>1000,24395=>1000,24396=>1000,24397=>1000,24398=>1000,24399=>1000,24400=>1000,24401=>1000,24402=>1000,24403=>1000,24404=>1000,24405=>1000,24406=>1000,24407=>1000,24408=>1000,24409=>1000,24410=>1000,24411=>1000,24412=>1000,24413=>1000,24414=>1000,24415=>1000,24416=>1000,24417=>1000,24418=>1000,24419=>1000,24420=>1000,24421=>1000,24422=>1000,24423=>1000,24424=>1000,24425=>1000,24426=>1000,24427=>1000,24428=>1000,24429=>1000,24430=>1000,24431=>1000,24432=>1000,24433=>1000,24434=>1000,24435=>1000,24436=>1000,24437=>1000,24438=>1000,24439=>1000,24440=>1000,24441=>1000,24442=>1000,24443=>1000,24444=>1000,24445=>1000,24446=>1000,24447=>1000,24448=>1000,24449=>1000,24450=>1000,24451=>1000,24452=>1000,24453=>1000,24454=>1000,24455=>1000,24456=>1000,24457=>1000,24458=>1000,24459=>1000,24460=>1000,24461=>1000,24462=>1000,24463=>1000,24464=>1000,24465=>1000,24466=>1000,24467=>1000,24468=>1000,24469=>1000,24470=>1000,24471=>1000,24472=>1000,24473=>1000,24474=>1000,24475=>1000,24476=>1000,24477=>1000,24478=>1000,24479=>1000,24480=>1000,24481=>1000,24482=>1000,24483=>1000,24484=>1000,24485=>1000,24486=>1000,24487=>1000,24488=>1000,24489=>1000,24490=>1000,24491=>1000,24492=>1000,24493=>1000,24494=>1000,24495=>1000,24496=>1000,24497=>1000,24498=>1000,24499=>1000,24500=>1000,24501=>1000,24502=>1000,24503=>1000,24504=>1000,24505=>1000,24506=>1000,24507=>1000,24508=>1000,24509=>1000,24510=>1000,24511=>1000,24512=>1000,24513=>1000,24514=>1000,24515=>1000,24516=>1000,24517=>1000,24518=>1000,24519=>1000,24520=>1000,24521=>1000,24522=>1000,24523=>1000,24524=>1000,24525=>1000,24526=>1000,24527=>1000,24528=>1000,24529=>1000,24530=>1000,24531=>1000,24532=>1000,24533=>1000,24534=>1000,24535=>1000,24536=>1000,24537=>1000,24538=>1000,24539=>1000,24540=>1000,24541=>1000,24542=>1000,24543=>1000,24544=>1000,24545=>1000,24546=>1000,24547=>1000,24548=>1000,24549=>1000,24550=>1000,24551=>1000,24552=>1000,24553=>1000,24554=>1000,24555=>1000,24556=>1000,24557=>1000,24558=>1000,24559=>1000,24560=>1000,24561=>1000,24562=>1000,24563=>1000,24564=>1000,24565=>1000,24566=>1000,24567=>1000,24568=>1000,24569=>1000,24570=>1000,24571=>1000,24572=>1000,24573=>1000,24574=>1000,24575=>1000,24576=>1000,24577=>1000,24578=>1000,24579=>1000,24580=>1000,24581=>1000,24582=>1000,24583=>1000,24584=>1000,24585=>1000,24586=>1000,24587=>1000,24588=>1000,24589=>1000,24590=>1000,24591=>1000,24592=>1000,24593=>1000,24594=>1000,24595=>1000,24596=>1000,24597=>1000,24598=>1000,24599=>1000,24600=>1000,24601=>1000,24602=>1000,24603=>1000,24604=>1000,24605=>1000,24606=>1000,24607=>1000,24608=>1000,24609=>1000,24610=>1000,24611=>1000,24612=>1000,24613=>1000,24614=>1000,24615=>1000,24616=>1000,24617=>1000,24618=>1000,24619=>1000,24620=>1000,24621=>1000,24622=>1000,24623=>1000,24624=>1000,24625=>1000,24626=>1000,24627=>1000,24628=>1000,24629=>1000,24630=>1000,24631=>1000,24632=>1000,24633=>1000,24634=>1000,24635=>1000,24636=>1000,24637=>1000,24638=>1000,24639=>1000,24640=>1000,24641=>1000,24642=>1000,24643=>1000,24644=>1000,24645=>1000,24646=>1000,24647=>1000,24648=>1000,24649=>1000,24650=>1000,24651=>1000,24652=>1000,24653=>1000,24654=>1000,24655=>1000,24656=>1000,24657=>1000,24658=>1000,24659=>1000,24660=>1000,24661=>1000,24662=>1000,24663=>1000,24664=>1000,24665=>1000,24666=>1000,24667=>1000,24668=>1000,24669=>1000,24670=>1000,24671=>1000,24672=>1000,24673=>1000,24674=>1000,24675=>1000,24676=>1000,24677=>1000,24678=>1000,24679=>1000,24680=>1000,24681=>1000,24682=>1000,24683=>1000,24684=>1000,24685=>1000,24686=>1000,24687=>1000,24688=>1000,24689=>1000,24690=>1000,24691=>1000,24692=>1000,24693=>1000,24694=>1000,24695=>1000,24696=>1000,24697=>1000,24698=>1000,24699=>1000,24700=>1000,24701=>1000,24702=>1000,24703=>1000,24704=>1000,24705=>1000,24706=>1000,24707=>1000,24708=>1000,24709=>1000,24710=>1000,24711=>1000,24712=>1000,24713=>1000,24714=>1000,24715=>1000,24716=>1000,24717=>1000,24718=>1000,24719=>1000,24720=>1000,24721=>1000,24722=>1000,24723=>1000,24724=>1000,24725=>1000,24726=>1000,24727=>1000,24728=>1000,24729=>1000,24730=>1000,24731=>1000,24732=>1000,24733=>1000,24734=>1000,24735=>1000,24736=>1000,24737=>1000,24738=>1000,24739=>1000,24740=>1000,24741=>1000,24742=>1000,24743=>1000,24744=>1000,24745=>1000,24746=>1000,24747=>1000,24748=>1000,24749=>1000,24750=>1000,24751=>1000,24752=>1000,24753=>1000,24754=>1000,24755=>1000,24756=>1000,24757=>1000,24758=>1000,24759=>1000,24760=>1000,24761=>1000,24762=>1000,24763=>1000,24764=>1000,24765=>1000,24766=>1000,24767=>1000,24768=>1000,24769=>1000,24770=>1000,24771=>1000,24772=>1000,24773=>1000,24774=>1000,24775=>1000,24776=>1000,24777=>1000,24778=>1000,24779=>1000,24780=>1000,24781=>1000,24782=>1000,24783=>1000,24784=>1000,24785=>1000,24786=>1000,24787=>1000,24788=>1000,24789=>1000,24790=>1000,24791=>1000,24792=>1000,24793=>1000,24794=>1000,24795=>1000,24796=>1000,24797=>1000,24798=>1000,24799=>1000,24800=>1000,24801=>1000,24802=>1000,24803=>1000,24804=>1000,24805=>1000,24806=>1000,24807=>1000,24808=>1000,24809=>1000,24810=>1000,24811=>1000,24812=>1000,24813=>1000,24814=>1000,24815=>1000,24816=>1000,24817=>1000,24818=>1000,24819=>1000,24820=>1000,24821=>1000,24822=>1000,24823=>1000,24824=>1000,24825=>1000,24826=>1000,24827=>1000,24828=>1000,24829=>1000,24830=>1000,24831=>1000,24832=>1000,24833=>1000,24834=>1000,24835=>1000,24836=>1000,24837=>1000,24838=>1000,24839=>1000,24840=>1000,24841=>1000,24842=>1000,24843=>1000,24844=>1000,24845=>1000,24846=>1000,24847=>1000,24848=>1000,24849=>1000,24850=>1000,24851=>1000,24852=>1000,24853=>1000,24854=>1000,24855=>1000,24856=>1000,24857=>1000,24858=>1000,24859=>1000,24860=>1000,24861=>1000,24862=>1000,24863=>1000,24864=>1000,24865=>1000,24866=>1000,24867=>1000,24868=>1000,24869=>1000,24870=>1000,24871=>1000,24872=>1000,24873=>1000,24874=>1000,24875=>1000,24876=>1000,24877=>1000,24878=>1000,24879=>1000,24880=>1000,24881=>1000,24882=>1000,24883=>1000,24884=>1000,24885=>1000,24886=>1000,24887=>1000,24888=>1000,24889=>1000,24890=>1000,24891=>1000,24892=>1000,24893=>1000,24894=>1000,24895=>1000,24896=>1000,24897=>1000,24898=>1000,24899=>1000,24900=>1000,24901=>1000,24902=>1000,24903=>1000,24904=>1000,24905=>1000,24906=>1000,24907=>1000,24908=>1000,24909=>1000,24910=>1000,24911=>1000,24912=>1000,24913=>1000,24914=>1000,24915=>1000,24916=>1000,24917=>1000,24918=>1000,24919=>1000,24920=>1000,24921=>1000,24922=>1000,24923=>1000,24924=>1000,24925=>1000,24926=>1000,24927=>1000,24928=>1000,24929=>1000,24930=>1000,24931=>1000,24932=>1000,24933=>1000,24934=>1000,24935=>1000,24936=>1000,24937=>1000,24938=>1000,24939=>1000,24940=>1000,24941=>1000,24942=>1000,24943=>1000,24944=>1000,24945=>1000,24946=>1000,24947=>1000,24948=>1000,24949=>1000,24950=>1000,24951=>1000,24952=>1000,24953=>1000,24954=>1000,24955=>1000,24956=>1000,24957=>1000,24958=>1000,24959=>1000,24960=>1000,24961=>1001,24962=>1000,24963=>1000,24964=>1000,24965=>1000,24966=>1000,24967=>1000,24968=>1000,24969=>1000,24970=>1000,24971=>1000,24972=>1000,24973=>1000,24974=>1000,24975=>1000,24976=>1000,24977=>1000,24978=>1000,24979=>1000,24980=>1000,24981=>1000,24982=>1000,24983=>1000,24984=>1000,24985=>1000,24986=>1000,24987=>1000,24988=>1000,24989=>1000,24990=>1000,24991=>1000,24992=>1000,24993=>1000,24994=>1000,24995=>1000,24996=>1000,24997=>1000,24998=>1000,24999=>1000,25000=>1000,25001=>1000,25002=>1000,25003=>1000,25004=>1000,25005=>1000,25006=>1000,25007=>1000,25008=>1000,25009=>1000,25010=>1000,25011=>1000,25012=>1000,25013=>1000,25014=>1000,25015=>1000,25016=>1000,25017=>1000,25018=>1000,25019=>1000,25020=>1000,25021=>1000,25022=>1000,25023=>1000,25024=>1000,25025=>1000,25026=>1000,25027=>1000,25028=>1000,25029=>1000,25030=>1000,25031=>1000,25032=>1000,25033=>1000,25034=>1000,25035=>1000,25036=>1000,25037=>1000,25038=>1000,25039=>1000,25040=>1000,25041=>1000,25042=>1000,25043=>1000,25044=>1000,25045=>1000,25046=>1000,25047=>1000,25048=>1000,25049=>1000,25050=>1000,25051=>1000,25052=>1000,25053=>1000,25054=>1000,25055=>1000,25056=>1000,25057=>1000,25058=>1000,25059=>1000,25060=>1000,25061=>1000,25062=>1000,25063=>1000,25064=>1000,25065=>1000,25066=>1000,25067=>1000,25068=>1000,25069=>1000,25070=>1000,25071=>1000,25072=>1000,25073=>1000,25074=>1000,25075=>1000,25076=>1000,25077=>1000,25078=>1000,25079=>1000,25080=>1000,25081=>1000,25082=>1000,25083=>1000,25084=>1000,25085=>1000,25086=>1000,25087=>1000,25088=>1000,25089=>1000,25090=>1000,25091=>1000,25092=>1000,25093=>1000,25094=>1000,25095=>1000,25096=>1000,25097=>1000,25098=>1000,25099=>1000,25100=>1000,25101=>1000,25102=>1000,25103=>1000,25104=>1000,25105=>1000,25106=>1000,25107=>1000,25108=>1000,25109=>1000,25110=>1000,25111=>1000,25112=>1000,25113=>1000,25114=>1000,25115=>1000,25116=>1000,25117=>1000,25118=>1000,25119=>1000,25120=>1000,25121=>1000,25122=>1000,25123=>1000,25124=>1000,25125=>1000,25126=>1000,25127=>1000,25128=>1000,25129=>1000,25130=>1000,25131=>1000,25132=>1000,25133=>1000,25134=>1000,25135=>1000,25136=>1000,25137=>1000,25138=>1000,25139=>1000,25140=>1000,25141=>1000,25142=>1000,25143=>1000,25144=>1000,25145=>1000,25146=>1000,25147=>1000,25148=>1000,25149=>1000,25150=>1000,25151=>1000,25152=>1000,25153=>1000,25154=>1000,25155=>1000,25156=>1000,25157=>1000,25158=>1000,25159=>1000,25160=>1000,25161=>1000,25162=>1000,25163=>1000,25164=>1000,25165=>1000,25166=>1000,25167=>1000,25168=>1000,25169=>1000,25170=>1000,25171=>1000,25172=>1000,25173=>1000,25174=>1000,25175=>1000,25176=>1000,25177=>1000,25178=>1000,25179=>1000,25180=>1000,25181=>1000,25182=>1000,25183=>1000,25184=>1000,25185=>1000,25186=>1000,25187=>1000,25188=>1000,25189=>1000,25190=>1000,25191=>1000,25192=>1000,25193=>1000,25194=>1000,25195=>1000,25196=>1000,25197=>1000,25198=>1000,25199=>1000,25200=>1000,25201=>1000,25202=>1000,25203=>1000,25204=>1000,25205=>1000,25206=>1000,25207=>1000,25208=>1000,25209=>1000,25210=>1000,25211=>1000,25212=>1000,25213=>1000,25214=>1000,25215=>1000,25216=>1000,25217=>1000,25218=>1000,25219=>1000,25220=>1000,25221=>1000,25222=>1000,25223=>1000,25224=>1000,25225=>1000,25226=>1000,25227=>1000,25228=>1000,25229=>1000,25230=>1000,25231=>1000,25232=>1000,25233=>1000,25234=>1000,25235=>1000,25236=>1000,25237=>1000,25238=>1000,25239=>1000,25240=>1000,25241=>1000,25242=>1000,25243=>1000,25244=>1000,25245=>1000,25246=>1000,25247=>1000,25248=>1000,25249=>1000,25250=>1000,25251=>1000,25252=>1000,25253=>1000,25254=>1000,25255=>1000,25256=>1000,25257=>1000,25258=>1000,25259=>1000,25260=>1000,25261=>1000,25262=>1000,25263=>1000,25264=>1000,25265=>1000,25266=>1000,25267=>1000,25268=>1000,25269=>1000,25270=>1000,25271=>1000,25272=>1000,25273=>1000,25274=>1000,25275=>1000,25276=>1000,25277=>1000,25278=>1000,25279=>1000,25280=>1000,25281=>1000,25282=>1000,25283=>1000,25284=>1000,25285=>1000,25286=>1000,25287=>1000,25288=>1000,25289=>1000,25290=>1000,25291=>1000,25292=>1000,25293=>1000,25294=>1000,25295=>1000,25296=>1000,25297=>1000,25298=>1000,25299=>1000,25300=>1000,25301=>1000,25302=>1000,25303=>1000,25304=>1000,25305=>1000,25306=>1000,25307=>1000,25308=>1000,25309=>1000,25310=>1000,25311=>1000,25312=>1000,25313=>1000,25314=>1000,25315=>1000,25316=>1000,25317=>1000,25318=>1000,25319=>1000,25320=>1000,25321=>1000,25322=>1000,25323=>1000,25324=>1000,25325=>1000,25326=>1000,25327=>1000,25328=>1000,25329=>1000,25330=>1000,25331=>1000,25332=>1000,25333=>1000,25334=>1000,25335=>1000,25336=>1000,25337=>1000,25338=>1000,25339=>1000,25340=>1000,25341=>1000,25342=>1000,25343=>1000,25344=>1000,25345=>1000,25346=>1000,25347=>1000,25348=>1000,25349=>1000,25350=>1000,25351=>1000,25352=>1000,25353=>1000,25354=>1000,25355=>1000,25356=>1000,25357=>1000,25358=>1000,25359=>1000,25360=>1000,25361=>1000,25362=>1000,25363=>1000,25364=>1000,25365=>1000,25366=>1000,25367=>1000,25368=>1000,25369=>1000,25370=>1000,25371=>1000,25372=>1000,25373=>1000,25374=>1000,25375=>1000,25376=>1000,25377=>1000,25378=>1000,25379=>1000,25380=>1000,25381=>1000,25382=>1000,25383=>1000,25384=>1000,25385=>1000,25386=>1000,25387=>1000,25388=>1000,25389=>1000,25390=>1000,25391=>1000,25392=>1000,25393=>1000,25394=>1000,25395=>1000,25396=>1000,25397=>1000,25398=>1000,25399=>1000,25400=>1000,25401=>1000,25402=>1000,25403=>1000,25404=>1000,25405=>1000,25406=>1000,25407=>1000,25408=>1000,25409=>1000,25410=>1000,25411=>1000,25412=>1000,25413=>1000,25414=>1000,25415=>1000,25416=>1000,25417=>1000,25418=>1000,25419=>1000,25420=>1000,25421=>1000,25422=>1000,25423=>1000,25424=>1000,25425=>1000,25426=>1000,25427=>1000,25428=>1000,25429=>1000,25430=>1000,25431=>1000,25432=>1000,25433=>1000,25434=>1000,25435=>1000,25436=>1000,25437=>1000,25438=>1000,25439=>1000,25440=>1000,25441=>1000,25442=>1000,25443=>1000,25444=>1000,25445=>1000,25446=>1000,25447=>1000,25448=>1000,25449=>1000,25450=>1000,25451=>1000,25452=>1000,25453=>1000,25454=>1000,25455=>1000,25456=>1000,25457=>1000,25458=>1000,25459=>1000,25460=>1000,25461=>1000,25462=>1000,25463=>1000,25464=>1000,25465=>1000,25466=>1000,25467=>1000,25468=>1000,25469=>1000,25470=>1000,25471=>1000,25472=>1000,25473=>1000,25474=>1000,25475=>1000,25476=>1000,25477=>1000,25478=>1000,25479=>1000,25480=>1000,25481=>1000,25482=>1000,25483=>1000,25484=>1000,25485=>1000,25486=>1000,25487=>1000,25488=>1000,25489=>1000,25490=>1000,25491=>1000,25492=>1000,25493=>1000,25494=>1000,25495=>1000,25496=>1000,25497=>1000,25498=>1000,25499=>1000,25500=>1000,25501=>1000,25502=>1000,25503=>1000,25504=>1000,25505=>1000,25506=>1000,25507=>1000,25508=>1000,25509=>1000,25510=>1000,25511=>1000,25512=>1000,25513=>1000,25514=>1000,25515=>1000,25516=>1000,25517=>1000,25518=>1000,25519=>1000,25520=>1000,25521=>1000,25522=>1000,25523=>1000,25524=>1000,25525=>1000,25526=>1000,25527=>1000,25528=>1000,25529=>1000,25530=>1000,25531=>1000,25532=>1000,25533=>1000,25534=>1000,25535=>1000,25536=>1000,25537=>1000,25538=>1000,25539=>1000,25540=>1000,25541=>1000,25542=>1000,25543=>1000,25544=>1000,25545=>1000,25546=>1000,25547=>1000,25548=>1000,25549=>1000,25550=>1000,25551=>1000,25552=>1000,25553=>1000,25554=>1000,25555=>1000,25556=>1000,25557=>1000,25558=>1000,25559=>1000,25560=>1000,25561=>1000,25562=>1000,25563=>1000,25564=>1000,25565=>1000,25566=>1000,25567=>1000,25568=>1000,25569=>1000,25570=>1000,25571=>1000,25572=>1000,25573=>1000,25574=>1000,25575=>1000,25576=>1000,25577=>1000,25578=>1000,25579=>1000,25580=>1000,25581=>1000,25582=>1000,25583=>1000,25584=>1000,25585=>1000,25586=>1000,25587=>1000,25588=>1000,25589=>1000,25590=>1000,25591=>1000,25592=>1000,25593=>1000,25594=>1000,25595=>1000,25596=>1000,25597=>1000,25598=>1000,25599=>1000,25600=>1000,25601=>1000,25602=>1000,25603=>1000,25604=>1000,25605=>1000,25606=>1000,25607=>1000,25608=>1000,25609=>1000,25610=>1000,25611=>1000,25612=>1000,25613=>1000,25614=>1000,25615=>1000,25616=>1000,25617=>1000,25618=>1000,25619=>1000,25620=>1000,25621=>1000,25622=>1000,25623=>1000,25624=>1000,25625=>1000,25626=>1000,25627=>1000,25628=>1000,25629=>1000,25630=>1000,25631=>1000,25632=>1000,25633=>1000,25634=>1000,25635=>1000,25636=>1000,25637=>1000,25638=>1000,25639=>1000,25640=>1000,25641=>1000,25642=>1000,25643=>1000,25644=>1000,25645=>1000,25646=>1000,25647=>1000,25648=>1000,25649=>1000,25650=>1000,25651=>1000,25652=>1000,25653=>1000,25654=>1000,25655=>1000,25656=>1000,25657=>1000,25658=>1000,25659=>1000,25660=>1000,25661=>1000,25662=>1000,25663=>1000,25664=>1000,25665=>1000,25666=>1000,25667=>1000,25668=>1000,25669=>1000,25670=>1000,25671=>1000,25672=>1000,25673=>1000,25674=>1000,25675=>1000,25676=>1000,25677=>1000,25678=>1000,25679=>1000,25680=>1000,25681=>1000,25682=>1000,25683=>1000,25684=>1000,25685=>1000,25686=>1000,25687=>1000,25688=>1000,25689=>1000,25690=>1000,25691=>1000,25692=>1000,25693=>1000,25694=>1000,25695=>1000,25696=>1000,25697=>1000,25698=>1000,25699=>1000,25700=>1000,25701=>1000,25702=>1000,25703=>1000,25704=>1000,25705=>1000,25706=>1000,25707=>1000,25708=>1000,25709=>1000,25710=>1000,25711=>1000,25712=>1000,25713=>1000,25714=>1000,25715=>1000,25716=>1000,25717=>1000,25718=>1000,25719=>1000,25720=>1000,25721=>1000,25722=>1000,25723=>1000,25724=>1000,25725=>1000,25726=>1000,25727=>1000,25728=>1000,25729=>1000,25730=>1000,25731=>1000,25732=>1000,25733=>1000,25734=>1000,25735=>1000,25736=>1000,25737=>1000,25738=>1000,25739=>1000,25740=>1000,25741=>1000,25742=>1000,25743=>1000,25744=>1000,25745=>1000,25746=>1000,25747=>1000,25748=>1000,25749=>1000,25750=>1000,25751=>1000,25752=>1000,25753=>1000,25754=>1000,25755=>1000,25756=>1000,25757=>1000,25758=>1000,25759=>1000,25760=>1000,25761=>1000,25762=>1000,25763=>1000,25764=>1000,25765=>1000,25766=>1000,25767=>1000,25768=>1000,25769=>1000,25770=>1000,25771=>1000,25772=>1000,25773=>1000,25774=>1000,25775=>1000,25776=>1000,25777=>1000,25778=>1000,25779=>1000,25780=>1000,25781=>1000,25782=>1000,25783=>1000,25784=>1000,25785=>1000,25786=>1000,25787=>1000,25788=>1000,25789=>1000,25790=>1000,25791=>1000,25792=>1000,25793=>1000,25794=>1000,25795=>1000,25796=>1000,25797=>1000,25798=>1000,25799=>1000,25800=>1000,25801=>1000,25802=>1000,25803=>1000,25804=>1000,25805=>1000,25806=>1000,25807=>1000,25808=>1000,25809=>1000,25810=>1000,25811=>1000,25812=>1000,25813=>1000,25814=>1000,25815=>1000,25816=>1000,25817=>1000,25818=>1000,25819=>1000,25820=>1000,25821=>1000,25822=>1000,25823=>1000,25824=>1000,25825=>1000,25826=>1000,25827=>1000,25828=>1000,25829=>1000,25830=>1000,25831=>1000,25832=>1000,25833=>1000,25834=>1000,25835=>1000,25836=>1000,25837=>1000,25838=>1000,25839=>1000,25840=>1000,25841=>1000,25842=>1000,25843=>1000,25844=>1000,25845=>1000,25846=>1000,25847=>1000,25848=>1000,25849=>1000,25850=>1000,25851=>1000,25852=>1000,25853=>1000,25854=>1000,25855=>1000,25856=>1000,25857=>1000,25858=>1000,25859=>1000,25860=>1000,25861=>1000,25862=>1000,25863=>1000,25864=>1000,25865=>1000,25866=>1000,25867=>1000,25868=>1000,25869=>1000,25870=>1000,25871=>1000,25872=>1000,25873=>1000,25874=>1000,25875=>1000,25876=>1000,25877=>1000,25878=>1000,25879=>1000,25880=>1000,25881=>1000,25882=>1000,25883=>1000,25884=>1000,25885=>1000,25886=>1000,25887=>1000,25888=>1000,25889=>1000,25890=>1000,25891=>1000,25892=>1000,25893=>1000,25894=>1000,25895=>1000,25896=>1000,25897=>1000,25898=>1000,25899=>1000,25900=>1000,25901=>1000,25902=>1000,25903=>1000,25904=>1000,25905=>1000,25906=>1000,25907=>1000,25908=>1000,25909=>1000,25910=>1000,25911=>1000,25912=>1000,25913=>1000,25914=>1000,25915=>1000,25916=>1000,25917=>1000,25918=>1000,25919=>1000,25920=>1000,25921=>1000,25922=>1000,25923=>1000,25924=>1000,25925=>1000,25926=>1000,25927=>1000,25928=>1000,25929=>1000,25930=>1000,25931=>1000,25932=>1000,25933=>1000,25934=>1000,25935=>1000,25936=>1000,25937=>1000,25938=>1000,25939=>1000,25940=>1000,25941=>1000,25942=>1000,25943=>1000,25944=>1000,25945=>1000,25946=>1000,25947=>1000,25948=>1000,25949=>1000,25950=>1000,25951=>1000,25952=>1000,25953=>1000,25954=>1000,25955=>1000,25956=>1000,25957=>1000,25958=>1000,25959=>1000,25960=>1000,25961=>1000,25962=>1000,25963=>1000,25964=>1000,25965=>1000,25966=>1000,25967=>1000,25968=>1000,25969=>1000,25970=>1000,25971=>1000,25972=>1000,25973=>1000,25974=>1000,25975=>1000,25976=>1000,25977=>1000,25978=>1000,25979=>1000,25980=>1000,25981=>1000,25982=>1000,25983=>1000,25984=>1000,25985=>1000,25986=>1000,25987=>1000,25988=>1000,25989=>1000,25990=>1000,25991=>1000,25992=>1000,25993=>1000,25994=>1000,25995=>1000,25996=>1000,25997=>1000,25998=>1000,25999=>1000,26000=>1000,26001=>1000,26002=>1000,26003=>1000,26004=>1000,26005=>1000,26006=>1000,26007=>1000,26008=>1000,26009=>1000,26010=>1000,26011=>1000,26012=>1000,26013=>1000,26014=>1000,26015=>1000,26016=>1000,26017=>1000,26018=>1000,26019=>1000,26020=>1000,26021=>1000,26022=>1000,26023=>1000,26024=>1000,26025=>1000,26026=>1000,26027=>1000,26028=>1000,26029=>1000,26030=>1000,26031=>1000,26032=>1000,26033=>1000,26034=>1000,26035=>1000,26036=>1000,26037=>1000,26038=>1000,26039=>1000,26040=>1000,26041=>1000,26042=>1000,26043=>1000,26044=>1000,26045=>1000,26046=>1000,26047=>1000,26048=>1000,26049=>1000,26050=>1000,26051=>1000,26052=>1000,26053=>1000,26054=>1000,26055=>1000,26056=>1000,26057=>1000,26058=>1000,26059=>1000,26060=>1000,26061=>1000,26062=>1000,26063=>1000,26064=>1000,26065=>1000,26066=>1000,26067=>1000,26068=>1000,26069=>1000,26070=>1000,26071=>1000,26072=>1000,26073=>1000,26074=>1000,26075=>1000,26076=>1000,26077=>1000,26078=>1000,26079=>1000,26080=>1000,26081=>1000,26082=>1000,26083=>1000,26084=>1000,26085=>1000,26086=>1000,26087=>1000,26088=>1000,26089=>1000,26090=>1000,26091=>1000,26092=>1000,26093=>1000,26094=>1000,26095=>1000,26096=>1000,26097=>1000,26098=>1000,26099=>1000,26100=>1000,26101=>1000,26102=>1000,26103=>1000,26104=>1000,26105=>1000,26106=>1000,26107=>1000,26108=>1000,26109=>1000,26110=>1000,26111=>1000,26112=>1000,26113=>1000,26114=>1000,26115=>1000,26116=>1000,26117=>1000,26118=>1000,26119=>1000,26120=>1000,26121=>1000,26122=>1000,26123=>1000,26124=>1000,26125=>1000,26126=>1000,26127=>1000,26128=>1000,26129=>1000,26130=>1000,26131=>1000,26132=>1000,26133=>1000,26134=>1000,26135=>1000,26136=>1000,26137=>1000,26138=>1000,26139=>1000,26140=>1000,26141=>1000,26142=>1000,26143=>1000,26144=>1000,26145=>1000,26146=>1000,26147=>1000,26148=>1000,26149=>1000,26150=>1000,26151=>1000,26152=>1000,26153=>1000,26154=>1000,26155=>1000,26156=>1000,26157=>1000,26158=>1000,26159=>1000,26160=>1000,26161=>1000,26162=>1000,26163=>1000,26164=>1000,26165=>1000,26166=>1000,26167=>1000,26168=>1000,26169=>1000,26170=>1000,26171=>1000,26172=>1000,26173=>1000,26174=>1000,26175=>1000,26176=>1000,26177=>1000,26178=>1000,26179=>1000,26180=>1000,26181=>1000,26182=>1000,26183=>1000,26184=>1000,26185=>1000,26186=>1000,26187=>1000,26188=>1000,26189=>1000,26190=>1000,26191=>1000,26192=>1000,26193=>1000,26194=>1000,26195=>1000,26196=>1000,26197=>1000,26198=>1000,26199=>1000,26200=>1000,26201=>1000,26202=>1000,26203=>1000,26204=>1000,26205=>1000,26206=>1000,26207=>1000,26208=>1000,26209=>1000,26210=>1000,26211=>1000,26212=>1000,26213=>1000,26214=>1000,26215=>1000,26216=>1000,26217=>1000,26218=>1000,26219=>1000,26220=>1000,26221=>1000,26222=>1000,26223=>1000,26224=>1000,26225=>1000,26226=>1000,26227=>1000,26228=>1000,26229=>1000,26230=>1000,26231=>1000,26232=>1000,26233=>1000,26234=>1000,26235=>1000,26236=>1000,26237=>1000,26238=>1000,26239=>1000,26240=>1000,26241=>1000,26242=>1000,26243=>1000,26244=>1000,26245=>1000,26246=>1000,26247=>1000,26248=>1000,26249=>1000,26250=>1000,26251=>1000,26252=>1000,26253=>1000,26254=>1000,26255=>1000,26256=>1000,26257=>1000,26258=>1000,26259=>1000,26260=>1000,26261=>1000,26262=>1000,26263=>1000,26264=>1000,26265=>1000,26266=>1000,26267=>1000,26268=>1000,26269=>1000,26270=>1000,26271=>1000,26272=>1000,26273=>1000,26274=>1000,26275=>1000,26276=>1000,26277=>1000,26278=>1000,26279=>1000,26280=>1000,26281=>1000,26282=>1000,26283=>1000,26284=>1000,26285=>1000,26286=>1000,26287=>1000,26288=>1000,26289=>1000,26290=>1000,26291=>1000,26292=>1000,26293=>1000,26294=>1000,26295=>1000,26296=>1000,26297=>1000,26298=>1000,26299=>1000,26300=>1000,26301=>1000,26302=>1000,26303=>1000,26304=>1000,26305=>1000,26306=>1000,26307=>1000,26308=>1000,26309=>1000,26310=>1000,26311=>1000,26312=>1000,26313=>1000,26314=>1000,26315=>1000,26316=>1000,26317=>1000,26318=>1000,26319=>1000,26320=>1000,26321=>1000,26322=>1000,26323=>1000,26324=>1000,26325=>1000,26326=>1000,26327=>1000,26328=>1000,26329=>1000,26330=>1000,26331=>1000,26332=>1000,26333=>1000,26334=>1000,26335=>1000,26336=>1000,26337=>1000,26338=>1000,26339=>1000,26340=>1000,26341=>1000,26342=>1000,26343=>1000,26344=>1000,26345=>1000,26346=>1000,26347=>1000,26348=>1000,26349=>1000,26350=>1000,26351=>1000,26352=>1000,26353=>1000,26354=>1000,26355=>1000,26356=>1000,26357=>1000,26358=>1000,26359=>1000,26360=>1000,26361=>1000,26362=>1000,26363=>1000,26364=>1000,26365=>1000,26366=>1000,26367=>1000,26368=>1000,26369=>1000,26370=>1000,26371=>1000,26372=>1000,26373=>1000,26374=>1000,26375=>1000,26376=>1000,26377=>1000,26378=>1000,26379=>1000,26380=>1000,26381=>1000,26382=>1000,26383=>1000,26384=>1000,26385=>1000,26386=>1000,26387=>1000,26388=>1000,26389=>1000,26390=>1000,26391=>1000,26392=>1000,26393=>1000,26394=>1000,26395=>1000,26396=>1000,26397=>1000,26398=>1000,26399=>1000,26400=>1000,26401=>1000,26402=>1000,26403=>1000,26404=>1000,26405=>1000,26406=>1000,26407=>1000,26408=>1000,26409=>1000,26410=>1000,26411=>1000,26412=>1000,26413=>1000,26414=>1000,26415=>1000,26416=>1000,26417=>1000,26418=>1000,26419=>1000,26420=>1000,26421=>1000,26422=>1000,26423=>1000,26424=>1000,26425=>1000,26426=>1000,26427=>1000,26428=>1000,26429=>1000,26430=>1000,26431=>1000,26432=>1000,26433=>1000,26434=>1000,26435=>1000,26436=>1000,26437=>1000,26438=>1000,26439=>1000,26440=>1000,26441=>1000,26442=>1000,26443=>1000,26444=>1000,26445=>1000,26446=>1000,26447=>1000,26448=>1000,26449=>1000,26450=>1000,26451=>1000,26452=>1000,26453=>1000,26454=>1000,26455=>1000,26456=>1000,26457=>1000,26458=>1000,26459=>1000,26460=>1000,26461=>1000,26462=>1000,26463=>1000,26464=>1000,26465=>1000,26466=>1000,26467=>1000,26468=>1000,26469=>1000,26470=>1000,26471=>1000,26472=>1000,26473=>1000,26474=>1000,26475=>1000,26476=>1000,26477=>1000,26478=>1000,26479=>1000,26480=>1000,26481=>1000,26482=>1000,26483=>1000,26484=>1000,26485=>1000,26486=>1000,26487=>1000,26488=>1000,26489=>1000,26490=>1000,26491=>1000,26492=>1000,26493=>1000,26494=>1000,26495=>1000,26496=>1000,26497=>1000,26498=>1000,26499=>1000,26500=>1000,26501=>1000,26502=>1000,26503=>1000,26504=>1000,26505=>1000,26506=>1000,26507=>1000,26508=>1000,26509=>1000,26510=>1000,26511=>1000,26512=>1000,26513=>1000,26514=>1000,26515=>1000,26516=>1000,26517=>1000,26518=>1000,26519=>1000,26520=>1000,26521=>1000,26522=>1000,26523=>1000,26524=>1000,26525=>1000,26526=>1000,26527=>1000,26528=>1000,26529=>1000,26530=>1000,26531=>1000,26532=>1000,26533=>1000,26534=>1000,26535=>1000,26536=>1000,26537=>1000,26538=>1000,26539=>1000,26540=>1000,26541=>1000,26542=>1000,26543=>1000,26544=>1000,26545=>1000,26546=>1000,26547=>1000,26548=>1000,26549=>1000,26550=>1000,26551=>1000,26552=>1000,26553=>1000,26554=>1000,26555=>1000,26556=>1000,26557=>1000,26558=>1000,26559=>1000,26560=>1000,26561=>1000,26562=>1000,26563=>1000,26564=>1000,26565=>1000,26566=>1000,26567=>1000,26568=>1000,26569=>1000,26570=>1000,26571=>1000,26572=>1000,26573=>1000,26574=>1000,26575=>1000,26576=>1000,26577=>1000,26578=>1000,26579=>1000,26580=>1000,26581=>1000,26582=>1000,26583=>1000,26584=>1000,26585=>1000,26586=>1000,26587=>1000,26588=>1000,26589=>1000,26590=>1000,26591=>1000,26592=>1000,26593=>1000,26594=>1000,26595=>1000,26596=>1000,26597=>1000,26598=>1000,26599=>1000,26600=>1000,26601=>1000,26602=>1000,26603=>1000,26604=>1000,26605=>1000,26606=>1000,26607=>1000,26608=>1000,26609=>1000,26610=>1000,26611=>1000,26612=>1000,26613=>1000,26614=>1000,26615=>1000,26616=>1000,26617=>1000,26618=>1000,26619=>1000,26620=>1000,26621=>1000,26622=>1000,26623=>1000,26624=>1000,26625=>1000,26626=>1000,26627=>1000,26628=>1000,26629=>1000,26630=>1000,26631=>1000,26632=>1000,26633=>1000,26634=>1000,26635=>1000,26636=>1000,26637=>1000,26638=>1000,26639=>1000,26640=>1000,26641=>1000,26642=>1000,26643=>1000,26644=>1000,26645=>1000,26646=>1000,26647=>1000,26648=>1000,26649=>1000,26650=>1000,26651=>1000,26652=>1000,26653=>1000,26654=>1000,26655=>1000,26656=>1000,26657=>1000,26658=>1000,26659=>1000,26660=>1000,26661=>1000,26662=>1000,26663=>1000,26664=>1000,26665=>1000,26666=>1000,26667=>1000,26668=>1000,26669=>1000,26670=>1000,26671=>1000,26672=>1000,26673=>1000,26674=>1000,26675=>1000,26676=>1000,26677=>1000,26678=>1000,26679=>1000,26680=>1000,26681=>1000,26682=>1000,26683=>1000,26684=>1000,26685=>1000,26686=>1000,26687=>1000,26688=>1000,26689=>1000,26690=>1000,26691=>1000,26692=>1000,26693=>1000,26694=>1000,26695=>1000,26696=>1000,26697=>1000,26698=>1000,26699=>1000,26700=>1000,26701=>1000,26702=>1000,26703=>1000,26704=>1000,26705=>1000,26706=>1000,26707=>1000,26708=>1000,26709=>1000,26710=>1000,26711=>1000,26712=>1000,26713=>1000,26714=>1000,26715=>1000,26716=>1000,26717=>1000,26718=>1000,26719=>1000,26720=>1000,26721=>1000,26722=>1000,26723=>1000,26724=>1000,26725=>1000,26726=>1000,26727=>1000,26728=>1000,26729=>1000,26730=>1000,26731=>1000,26732=>1000,26733=>1000,26734=>1000,26735=>1000,26736=>1000,26737=>1000,26738=>1000,26739=>1000,26740=>1000,26741=>1000,26742=>1000,26743=>1000,26744=>1000,26745=>1000,26746=>1000,26747=>1000,26748=>1000,26749=>1000,26750=>1000,26751=>1000,26752=>1000,26753=>1000,26754=>1000,26755=>1000,26756=>1000,26757=>1000,26758=>1000,26759=>1000,26760=>1000,26761=>1000,26762=>1000,26763=>1000,26764=>1000,26765=>1000,26766=>1000,26767=>1000,26768=>1000,26769=>1000,26770=>1000,26771=>1000,26772=>1000,26773=>1000,26774=>1000,26775=>1000,26776=>1000,26777=>1000,26778=>1000,26779=>1000,26780=>1000,26781=>1000,26782=>1000,26783=>1000,26784=>1000,26785=>1000,26786=>1000,26787=>1000,26788=>1000,26789=>1000,26790=>1000,26791=>1000,26792=>1000,26793=>1000,26794=>1000,26795=>1000,26796=>1000,26797=>1000,26798=>1000,26799=>1000,26800=>1000,26801=>1000,26802=>1000,26803=>1000,26804=>1000,26805=>1000,26806=>1000,26807=>1000,26808=>1000,26809=>1000,26810=>1000,26811=>1000,26812=>1000,26813=>1000,26814=>1000,26815=>1000,26816=>1000,26817=>1000,26818=>1000,26819=>1000,26820=>1000,26821=>1000,26822=>1000,26823=>1000,26824=>1000,26825=>1000,26826=>1000,26827=>1000,26828=>1000,26829=>1000,26830=>1000,26831=>1000,26832=>1000,26833=>1000,26834=>1000,26835=>1000,26836=>1000,26837=>1000,26838=>1000,26839=>1000,26840=>1000,26841=>1000,26842=>1000,26843=>1000,26844=>1000,26845=>1000,26846=>1000,26847=>1000,26848=>1000,26849=>1000,26850=>1000,26851=>1000,26852=>1000,26853=>1000,26854=>1000,26855=>1000,26856=>1000,26857=>1000,26858=>1000,26859=>1000,26860=>1000,26861=>1000,26862=>1000,26863=>1000,26864=>1000,26865=>1000,26866=>1000,26867=>1000,26868=>1000,26869=>1000,26870=>1000,26871=>1000,26872=>1000,26873=>1000,26874=>1000,26875=>1000,26876=>1000,26877=>1000,26878=>1000,26879=>1000,26880=>1000,26881=>1000,26882=>1000,26883=>1000,26884=>1000,26885=>1000,26886=>1000,26887=>1000,26888=>1000,26889=>1000,26890=>1000,26891=>1000,26892=>1000,26893=>1000,26894=>1000,26895=>1000,26896=>1000,26897=>1000,26898=>1000,26899=>1000,26900=>1000,26901=>1000,26902=>1000,26903=>1000,26904=>1000,26905=>1000,26906=>1000,26907=>1000,26908=>1000,26909=>1000,26910=>1000,26911=>1000,26912=>1000,26913=>1000,26914=>1000,26915=>1000,26916=>1000,26917=>1000,26918=>1000,26919=>1000,26920=>1000,26921=>1000,26922=>1000,26923=>1000,26924=>1000,26925=>1000,26926=>1000,26927=>1000,26928=>1000,26929=>1000,26930=>1000,26931=>1000,26932=>1000,26933=>1000,26934=>1000,26935=>1000,26936=>1000,26937=>1000,26938=>1000,26939=>1000,26940=>1000,26941=>1000,26942=>1000,26943=>1000,26944=>1000,26945=>1000,26946=>1000,26947=>1000,26948=>1000,26949=>1000,26950=>1000,26951=>1000,26952=>1000,26953=>1000,26954=>1000,26955=>1000,26956=>1000,26957=>1000,26958=>1000,26959=>1000,26960=>1000,26961=>1000,26962=>1000,26963=>1000,26964=>1000,26965=>1000,26966=>1000,26967=>1000,26968=>1000,26969=>1000,26970=>1000,26971=>1000,26972=>1000,26973=>1000,26974=>1000,26975=>1000,26976=>1000,26977=>1000,26978=>1000,26979=>1000,26980=>1000,26981=>1000,26982=>1000,26983=>1000,26984=>1000,26985=>1000,26986=>1000,26987=>1000,26988=>1000,26989=>1000,26990=>1000,26991=>1000,26992=>1000,26993=>1000,26994=>1000,26995=>1000,26996=>1000,26997=>1000,26998=>1000,26999=>1000,27000=>1000,27001=>1000,27002=>1000,27003=>1000,27004=>1000,27005=>1000,27006=>1000,27007=>1000,27008=>1000,27009=>1000,27010=>1000,27011=>1000,27012=>1000,27013=>1000,27014=>1000,27015=>1000,27016=>1000,27017=>1000,27018=>1000,27019=>1000,27020=>1000,27021=>1000,27022=>1000,27023=>1000,27024=>1000,27025=>1000,27026=>1000,27027=>1000,27028=>1000,27029=>1000,27030=>1000,27031=>1000,27032=>1000,27033=>1000,27034=>1000,27035=>1000,27036=>1000,27037=>1000,27038=>1000,27039=>1000,27040=>1000,27041=>1000,27042=>1000,27043=>1000,27044=>1000,27045=>1000,27046=>1000,27047=>1000,27048=>1000,27049=>1000,27050=>1000,27051=>1000,27052=>1000,27053=>1000,27054=>1000,27055=>1000,27056=>1000,27057=>1000,27058=>1000,27059=>1000,27060=>1000,27061=>1000,27062=>1000,27063=>1000,27064=>1000,27065=>1000,27066=>1000,27067=>1000,27068=>1000,27069=>1000,27070=>1000,27071=>1000,27072=>1000,27073=>1000,27074=>1000,27075=>1000,27076=>1000,27077=>1000,27078=>1000,27079=>1000,27080=>1000,27081=>1000,27082=>1000,27083=>1000,27084=>1000,27085=>1000,27086=>1000,27087=>1000,27088=>1000,27089=>1000,27090=>1000,27091=>1000,27092=>1000,27093=>1000,27094=>1000,27095=>1000,27096=>1000,27097=>1000,27098=>1000,27099=>1000,27100=>1000,27101=>1000,27102=>1000,27103=>1000,27104=>1000,27105=>1000,27106=>1000,27107=>1000,27108=>1000,27109=>1000,27110=>1000,27111=>1000,27112=>1000,27113=>1000,27114=>1000,27115=>1000,27116=>1000,27117=>1000,27118=>1000,27119=>1000,27120=>1000,27121=>1000,27122=>1000,27123=>1000,27124=>1000,27125=>1000,27126=>1000,27127=>1000,27128=>1000,27129=>1000,27130=>1000,27131=>1000,27132=>1000,27133=>1000,27134=>1000,27135=>1000,27136=>1000,27137=>1000,27138=>1000,27139=>1000,27140=>1000,27141=>1000,27142=>1000,27143=>1000,27144=>1000,27145=>1000,27146=>1000,27147=>1000,27148=>1000,27149=>1000,27150=>1000,27151=>1000,27152=>1000,27153=>1000,27154=>1000,27155=>1000,27156=>1000,27157=>1000,27158=>1000,27159=>1000,27160=>1000,27161=>1000,27162=>1000,27163=>1000,27164=>1000,27165=>1000,27166=>1000,27167=>1000,27168=>1000,27169=>1000,27170=>1000,27171=>1000,27172=>1000,27173=>1000,27174=>1000,27175=>1000,27176=>1000,27177=>1000,27178=>1000,27179=>1000,27180=>1000,27181=>1000,27182=>1000,27183=>1000,27184=>1000,27185=>1000,27186=>1000,27187=>1000,27188=>1000,27189=>1000,27190=>1000,27191=>1000,27192=>1000,27193=>1000,27194=>1000,27195=>1000,27196=>1000,27197=>1000,27198=>1000,27199=>1000,27200=>1000,27201=>1000,27202=>1000,27203=>1000,27204=>1000,27205=>1000,27206=>1000,27207=>1000,27208=>1000,27209=>1000,27210=>1000,27211=>1000,27212=>1000,27213=>1000,27214=>1000,27215=>1000,27216=>1000,27217=>1000,27218=>1000,27219=>1000,27220=>1000,27221=>1000,27222=>1000,27223=>1000,27224=>1000,27225=>1000,27226=>1000,27227=>1000,27228=>1000,27229=>1000,27230=>1000,27231=>1000,27232=>1000,27233=>1000,27234=>1000,27235=>1000,27236=>1000,27237=>1000,27238=>1000,27239=>1000,27240=>1000,27241=>1000,27242=>1000,27243=>1000,27244=>1000,27245=>1000,27246=>1000,27247=>1000,27248=>1000,27249=>1000,27250=>1000,27251=>1000,27252=>1000,27253=>1000,27254=>1000,27255=>1000,27256=>1000,27257=>1000,27258=>1000,27259=>1000,27260=>1000,27261=>1000,27262=>1000,27263=>1000,27264=>1000,27265=>1000,27266=>1000,27267=>1000,27268=>1000,27269=>1000,27270=>1000,27271=>1000,27272=>1000,27273=>1000,27274=>1000,27275=>1000,27276=>1000,27277=>1000,27278=>1000,27279=>1000,27280=>1000,27281=>1000,27282=>1000,27283=>1000,27284=>1000,27285=>1000,27286=>1000,27287=>1000,27288=>1000,27289=>1000,27290=>1000,27291=>1000,27292=>1000,27293=>1000,27294=>1000,27295=>1000,27296=>1000,27297=>1000,27298=>1000,27299=>1000,27300=>1000,27301=>1000,27302=>1000,27303=>1000,27304=>1000,27305=>1000,27306=>1000,27307=>1000,27308=>1000,27309=>1000,27310=>1000,27311=>1000,27312=>1000,27313=>1000,27314=>1000,27315=>1000,27316=>1000,27317=>1000,27318=>1000,27319=>1000,27320=>1000,27321=>1000,27322=>1000,27323=>1000,27324=>1000,27325=>1000,27326=>1000,27327=>1000,27328=>1000,27329=>1000,27330=>1000,27331=>1000,27332=>1000,27333=>1000,27334=>1000,27335=>1000,27336=>1000,27337=>1000,27338=>1000,27339=>1000,27340=>1000,27341=>1000,27342=>1000,27343=>1000,27344=>1000,27345=>1000,27346=>1000,27347=>1000,27348=>1000,27349=>1000,27350=>1000,27351=>1000,27352=>1000,27353=>1000,27354=>1000,27355=>1000,27356=>1000,27357=>1000,27358=>1000,27359=>1000,27360=>1000,27361=>1000,27362=>1000,27363=>1000,27364=>1000,27365=>1000,27366=>1000,27367=>1000,27368=>1000,27369=>1000,27370=>1000,27371=>1000,27372=>1000,27373=>1000,27374=>1000,27375=>1000,27376=>1000,27377=>1000,27378=>1000,27379=>1000,27380=>1000,27381=>1000,27382=>1000,27383=>1000,27384=>1000,27385=>1000,27386=>1000,27387=>1000,27388=>1000,27389=>1000,27390=>1000,27391=>1000,27392=>1000,27393=>1000,27394=>1000,27395=>1000,27396=>1000,27397=>1000,27398=>1000,27399=>1000,27400=>1000,27401=>1000,27402=>1000,27403=>1000,27404=>1000,27405=>1000,27406=>1000,27407=>1000,27408=>1000,27409=>1000,27410=>1000,27411=>1000,27412=>1000,27413=>1000,27414=>1000,27415=>1000,27416=>1000,27417=>1000,27418=>1000,27419=>1000,27420=>1000,27421=>1000,27422=>1000,27423=>1000,27424=>1000,27425=>1000,27426=>1000,27427=>1000,27428=>1000,27429=>1000,27430=>1000,27431=>1000,27432=>1000,27433=>1000,27434=>1000,27435=>1000,27436=>1000,27437=>1000,27438=>1000,27439=>1000,27440=>1000,27441=>1000,27442=>1000,27443=>1000,27444=>1000,27445=>1000,27446=>1000,27447=>1000,27448=>1000,27449=>1000,27450=>1000,27451=>1000,27452=>1000,27453=>1000,27454=>1000,27455=>1000,27456=>1000,27457=>1000,27458=>1000,27459=>1000,27460=>1000,27461=>1000,27462=>1000,27463=>1000,27464=>1000,27465=>1000,27466=>1000,27467=>1000,27468=>1000,27469=>1000,27470=>1000,27471=>1000,27472=>1000,27473=>1000,27474=>1000,27475=>1000,27476=>1000,27477=>1000,27478=>1000,27479=>1000,27480=>1000,27481=>1000,27482=>1000,27483=>1000,27484=>1000,27485=>1000,27486=>1000,27487=>1000,27488=>1000,27489=>1000,27490=>1000,27491=>1000,27492=>1000,27493=>1000,27494=>1000,27495=>1000,27496=>1000,27497=>1000,27498=>1000,27499=>1000,27500=>1000,27501=>1000,27502=>1000,27503=>1000,27504=>1000,27505=>1000,27506=>1000,27507=>1000,27508=>1000,27509=>1000,27510=>1000,27511=>1000,27512=>1000,27513=>1000,27514=>1000,27515=>1000,27516=>1000,27517=>1000,27518=>1000,27519=>1000,27520=>1000,27521=>1000,27522=>1000,27523=>1000,27524=>1000,27525=>1000,27526=>1000,27527=>1000,27528=>1000,27529=>1000,27530=>1000,27531=>1000,27532=>1000,27533=>1000,27534=>1000,27535=>1000,27536=>1000,27537=>1000,27538=>1000,27539=>1000,27540=>1000,27541=>1000,27542=>1000,27543=>1000,27544=>1000,27545=>1000,27546=>1000,27547=>1000,27548=>1000,27549=>1000,27550=>1000,27551=>1000,27552=>1000,27553=>1000,27554=>1000,27555=>1000,27556=>1000,27557=>1000,27558=>1000,27559=>1000,27560=>1000,27561=>1000,27562=>1000,27563=>1000,27564=>1000,27565=>1000,27566=>1000,27567=>1000,27568=>1000,27569=>1000,27570=>1000,27571=>1000,27572=>1000,27573=>1000,27574=>1000,27575=>1000,27576=>1000,27577=>1000,27578=>1000,27579=>1000,27580=>1000,27581=>1000,27582=>1000,27583=>1000,27584=>1000,27585=>1000,27586=>1000,27587=>1000,27588=>1000,27589=>1000,27590=>1000,27591=>1000,27592=>1000,27593=>1000,27594=>1000,27595=>1000,27596=>1000,27597=>1000,27598=>1000,27599=>1000,27600=>1000,27601=>1000,27602=>1000,27603=>1000,27604=>1000,27605=>1000,27606=>1000,27607=>1000,27608=>1000,27609=>1000,27610=>1000,27611=>1000,27612=>1000,27613=>1000,27614=>1000,27615=>1000,27616=>1000,27617=>1000,27618=>1000,27619=>1000,27620=>1000,27621=>1000,27622=>1000,27623=>1000,27624=>1000,27625=>1000,27626=>1000,27627=>1000,27628=>1000,27629=>1000,27630=>1000,27631=>1000,27632=>1000,27633=>1000,27634=>1000,27635=>1000,27636=>1000,27637=>1000,27638=>1000,27639=>1000,27640=>1000,27641=>1000,27642=>1000,27643=>1000,27644=>1000,27645=>1000,27646=>1000,27647=>1000,27648=>1000,27649=>1000,27650=>1000,27651=>1000,27652=>1000,27653=>1000,27654=>1000,27655=>1000,27656=>1000,27657=>1000,27658=>1000,27659=>1000,27660=>1000,27661=>1000,27662=>1000,27663=>1000,27664=>1000,27665=>1000,27666=>1000,27667=>1000,27668=>1000,27669=>1000,27670=>1000,27671=>1000,27672=>1000,27673=>1000,27674=>1000,27675=>1000,27676=>1000,27677=>1000,27678=>1000,27679=>1000,27680=>1000,27681=>1000,27682=>1000,27683=>1000,27684=>1000,27685=>1000,27686=>1000,27687=>1000,27688=>1000,27689=>1000,27690=>1000,27691=>1000,27692=>1000,27693=>1000,27694=>1000,27695=>1000,27696=>1000,27697=>1000,27698=>1000,27699=>1000,27700=>1000,27701=>1000,27702=>1000,27703=>1000,27704=>1000,27705=>1000,27706=>1000,27707=>1000,27708=>1000,27709=>1000,27710=>1000,27711=>1000,27712=>1000,27713=>1000,27714=>1000,27715=>1000,27716=>1000,27717=>1000,27718=>1000,27719=>1000,27720=>1000,27721=>1000,27722=>1000,27723=>1000,27724=>1000,27725=>1000,27726=>1000,27727=>1000,27728=>1000,27729=>1000,27730=>1000,27731=>1000,27732=>1000,27733=>1000,27734=>1000,27735=>1000,27736=>1000,27737=>1000,27738=>1000,27739=>1000,27740=>1000,27741=>1000,27742=>1000,27743=>1000,27744=>1000,27745=>1000,27746=>1000,27747=>1000,27748=>1000,27749=>1000,27750=>1000,27751=>1000,27752=>1000,27753=>1000,27754=>1000,27755=>1000,27756=>1000,27757=>1000,27758=>1000,27759=>1000,27760=>1000,27761=>1000,27762=>1000,27763=>1000,27764=>1000,27765=>1000,27766=>1000,27767=>1000,27768=>1000,27769=>1000,27770=>1000,27771=>1000,27772=>1000,27773=>1000,27774=>1000,27775=>1000,27776=>1000,27777=>1000,27778=>1000,27779=>1000,27780=>1000,27781=>1000,27782=>1000,27783=>1000,27784=>1000,27785=>1000,27786=>1000,27787=>1000,27788=>1000,27789=>1000,27790=>1000,27791=>1000,27792=>1000,27793=>1000,27794=>1000,27795=>1000,27796=>1000,27797=>1000,27798=>1000,27799=>1000,27800=>1000,27801=>1000,27802=>1000,27803=>1000,27804=>1000,27805=>1000,27806=>1000,27807=>1000,27808=>1000,27809=>1000,27810=>1000,27811=>1000,27812=>1000,27813=>1000,27814=>1000,27815=>1000,27816=>1000,27817=>1000,27818=>1000,27819=>1000,27820=>1000,27821=>1000,27822=>1000,27823=>1000,27824=>1000,27825=>1000,27826=>1000,27827=>1000,27828=>1000,27829=>1000,27830=>1000,27831=>1000,27832=>1000,27833=>1000,27834=>1000,27835=>1000,27836=>1000,27837=>1000,27838=>1000,27839=>1000,27840=>1000,27841=>1000,27842=>1000,27843=>1000,27844=>1000,27845=>1000,27846=>1000,27847=>1000,27848=>1000,27849=>1000,27850=>1000,27851=>1000,27852=>1000,27853=>1000,27854=>1000,27855=>1000,27856=>1000,27857=>1000,27858=>1000,27859=>1000,27860=>1000,27861=>1000,27862=>1000,27863=>1000,27864=>1000,27865=>1000,27866=>1000,27867=>1000,27868=>1000,27869=>1000,27870=>1000,27871=>1000,27872=>1000,27873=>1000,27874=>1000,27875=>1000,27876=>1000,27877=>1000,27878=>1000,27879=>1000,27880=>1000,27881=>1000,27882=>1000,27883=>1000,27884=>1000,27885=>1000,27886=>1000,27887=>1000,27888=>1000,27889=>1000,27890=>1000,27891=>1000,27892=>1000,27893=>1000,27894=>1000,27895=>1000,27896=>1000,27897=>1000,27898=>1000,27899=>1000,27900=>1000,27901=>1000,27902=>1000,27903=>1000,27904=>1000,27905=>1000,27906=>1000,27907=>1000,27908=>1000,27909=>1000,27910=>1000,27911=>1000,27912=>1000,27913=>1000,27914=>1000,27915=>1000,27916=>1000,27917=>1000,27918=>1000,27919=>1000,27920=>1000,27921=>1000,27922=>1000,27923=>1000,27924=>1000,27925=>1000,27926=>1000,27927=>1000,27928=>1000,27929=>1000,27930=>1000,27931=>1000,27932=>1000,27933=>1000,27934=>1000,27935=>1000,27936=>1000,27937=>1000,27938=>1000,27939=>1000,27940=>1000,27941=>1000,27942=>1000,27943=>1000,27944=>1000,27945=>1000,27946=>1000,27947=>1000,27948=>1000,27949=>1000,27950=>1000,27951=>1000,27952=>1000,27953=>1000,27954=>1000,27955=>1000,27956=>1000,27957=>1000,27958=>1000,27959=>1000,27960=>1000,27961=>1000,27962=>1000,27963=>1000,27964=>1000,27965=>1000,27966=>1000,27967=>1000,27968=>1000,27969=>1000,27970=>1000,27971=>1000,27972=>1000,27973=>1000,27974=>1000,27975=>1000,27976=>1000,27977=>1000,27978=>1000,27979=>1000,27980=>1000,27981=>1000,27982=>1000,27983=>1000,27984=>1000,27985=>1000,27986=>1000,27987=>1000,27988=>1000,27989=>1000,27990=>1000,27991=>1000,27992=>1000,27993=>1000,27994=>1000,27995=>1000,27996=>1000,27997=>1000,27998=>1000,27999=>1000,28000=>1000,28001=>1000,28002=>1000,28003=>1000,28004=>1000,28005=>1000,28006=>1000,28007=>1000,28008=>1000,28009=>1000,28010=>1000,28011=>1000,28012=>1000,28013=>1000,28014=>1000,28015=>1000,28016=>1000,28017=>1000,28018=>1000,28019=>1000,28020=>1000,28021=>1000,28022=>1000,28023=>1000,28024=>1000,28025=>1000,28026=>1000,28027=>1000,28028=>1000,28029=>1000,28030=>1000,28031=>1000,28032=>1000,28033=>1000,28034=>1000,28035=>1000,28036=>1000,28037=>1000,28038=>1000,28039=>1000,28040=>1000,28041=>1000,28042=>1000,28043=>1000,28044=>1000,28045=>1000,28046=>1000,28047=>1000,28048=>1000,28049=>1000,28050=>1000,28051=>1000,28052=>1000,28053=>1000,28054=>1000,28055=>1000,28056=>1000,28057=>1000,28058=>1000,28059=>1000,28060=>1000,28061=>1000,28062=>1000,28063=>1000,28064=>1000,28065=>1000,28066=>1000,28067=>1000,28068=>1000,28069=>1000,28070=>1000,28071=>1000,28072=>1000,28073=>1000,28074=>1000,28075=>1000,28076=>1000,28077=>1000,28078=>1000,28079=>1000,28080=>1000,28081=>1000,28082=>1000,28083=>1000,28084=>1000,28085=>1000,28086=>1000,28087=>1000,28088=>1000,28089=>1000,28090=>1000,28091=>1000,28092=>1000,28093=>1000,28094=>1000,28095=>1000,28096=>1000,28097=>1000,28098=>1000,28099=>1000,28100=>1000,28101=>1000,28102=>1000,28103=>1000,28104=>1000,28105=>1000,28106=>1000,28107=>1000,28108=>1000,28109=>1000,28110=>1000,28111=>1000,28112=>1000,28113=>1000,28114=>1000,28115=>1000,28116=>1000,28117=>1000,28118=>1000,28119=>1000,28120=>1000,28121=>1000,28122=>1000,28123=>1000,28124=>1000,28125=>1000,28126=>1000,28127=>1000,28128=>1000,28129=>1000,28130=>1000,28131=>1000,28132=>1000,28133=>1000,28134=>1000,28135=>1000,28136=>1000,28137=>1000,28138=>1000,28139=>1000,28140=>1000,28141=>1000,28142=>1000,28143=>1000,28144=>1000,28145=>1000,28146=>1000,28147=>1000,28148=>1000,28149=>1000,28150=>1000,28151=>1000,28152=>1000,28153=>1000,28154=>1000,28155=>1000,28156=>1000,28157=>1000,28158=>1000,28159=>1000,28160=>1000,28161=>1000,28162=>1000,28163=>1000,28164=>1000,28165=>1000,28166=>1000,28167=>1000,28168=>1000,28169=>1000,28170=>1000,28171=>1000,28172=>1000,28173=>1000,28174=>1000,28175=>1000,28176=>1000,28177=>1000,28178=>1000,28179=>1000,28180=>1000,28181=>1000,28182=>1000,28183=>1000,28184=>1000,28185=>1000,28186=>1000,28187=>1000,28188=>1000,28189=>1000,28190=>1000,28191=>1000,28192=>1000,28193=>1000,28194=>1000,28195=>1000,28196=>1000,28197=>1000,28198=>1000,28199=>1000,28200=>1000,28201=>1000,28202=>1000,28203=>1000,28204=>1000,28205=>1000,28206=>1000,28207=>1000,28208=>1000,28209=>1000,28210=>1000,28211=>1000,28212=>1000,28213=>1000,28214=>1000,28215=>1000,28216=>1000,28217=>1000,28218=>1000,28219=>1000,28220=>1000,28221=>1000,28222=>1000,28223=>1000,28224=>1000,28225=>1000,28226=>1000,28227=>1000,28228=>1000,28229=>1000,28230=>1000,28231=>1000,28232=>1000,28233=>1000,28234=>1000,28235=>1000,28236=>1000,28237=>1000,28238=>1000,28239=>1000,28240=>1000,28241=>1000,28242=>1000,28243=>1000,28244=>1000,28245=>1000,28246=>1000,28247=>1000,28248=>1000,28249=>1000,28250=>1000,28251=>1000,28252=>1000,28253=>1000,28254=>1000,28255=>1000,28256=>1000,28257=>1000,28258=>1000,28259=>1000,28260=>1000,28261=>1000,28262=>1000,28263=>1000,28264=>1000,28265=>1000,28266=>1000,28267=>1000,28268=>1000,28269=>1000,28270=>1000,28271=>1000,28272=>1000,28273=>1000,28274=>1000,28275=>1000,28276=>1000,28277=>1000,28278=>1000,28279=>1000,28280=>1000,28281=>1000,28282=>1000,28283=>1000,28284=>1000,28285=>1000,28286=>1000,28287=>1000,28288=>1000,28289=>1000,28290=>1000,28291=>1000,28292=>1000,28293=>1000,28294=>1000,28295=>1000,28296=>1000,28297=>1000,28298=>1000,28299=>1000,28300=>1000,28301=>1000,28302=>1000,28303=>1000,28304=>1000,28305=>1000,28306=>1000,28307=>1000,28308=>1000,28309=>1000,28310=>1000,28311=>1000,28312=>1000,28313=>1000,28314=>1000,28315=>1000,28316=>1000,28317=>1000,28318=>1000,28319=>1000,28320=>1000,28321=>1000,28322=>1000,28323=>1000,28324=>1000,28325=>1000,28326=>1000,28327=>1000,28328=>1000,28329=>1000,28330=>1000,28331=>1000,28332=>1000,28333=>1000,28334=>1000,28335=>1000,28336=>1000,28337=>1000,28338=>1000,28339=>1000,28340=>1000,28341=>1000,28342=>1000,28343=>1000,28344=>1000,28345=>1000,28346=>1000,28347=>1000,28348=>1000,28349=>1000,28350=>1000,28351=>1000,28352=>1000,28353=>1000,28354=>1000,28355=>1000,28356=>1000,28357=>1000,28358=>1000,28359=>1000,28360=>1000,28361=>1000,28362=>1000,28363=>1000,28364=>1000,28365=>1000,28366=>1000,28367=>1000,28368=>1000,28369=>1000,28370=>1000,28371=>1000,28372=>1000,28373=>1000,28374=>1000,28375=>1000,28376=>1000,28377=>1000,28378=>1000,28379=>1000,28380=>1000,28381=>1000,28382=>1000,28383=>1000,28384=>1000,28385=>1000,28386=>1000,28387=>1000,28388=>1000,28389=>1000,28390=>1000,28391=>1000,28392=>1000,28393=>1000,28394=>1000,28395=>1000,28396=>1000,28397=>1000,28398=>1000,28399=>1000,28400=>1000,28401=>1000,28402=>1000,28403=>1000,28404=>1000,28405=>1000,28406=>1000,28407=>1000,28408=>1000,28409=>1000,28410=>1000,28411=>1000,28412=>1000,28413=>1000,28414=>1000,28415=>1000,28416=>1000,28417=>1000,28418=>1000,28419=>1000,28420=>1000,28421=>1000,28422=>1000,28423=>1000,28424=>1000,28425=>1000,28426=>1000,28427=>1000,28428=>1000,28429=>1000,28430=>1000,28431=>1000,28432=>1000,28433=>1000,28434=>1000,28435=>1000,28436=>1000,28437=>1000,28438=>1000,28439=>1000,28440=>1000,28441=>1000,28442=>1000,28443=>1000,28444=>1000,28445=>1000,28446=>1000,28447=>1000,28448=>1000,28449=>1000,28450=>1000,28451=>1000,28452=>1000,28453=>1000,28454=>1000,28455=>1000,28456=>1000,28457=>1000,28458=>1000,28459=>1000,28460=>1000,28461=>1000,28462=>1000,28463=>1000,28464=>1000,28465=>1000,28466=>1000,28467=>1000,28468=>1000,28469=>1000,28470=>1000,28471=>1000,28472=>1000,28473=>1000,28474=>1000,28475=>1000,28476=>1000,28477=>1000,28478=>1000,28479=>1000,28480=>1000,28481=>1000,28482=>1000,28483=>1000,28484=>1000,28485=>1000,28486=>1000,28487=>1000,28488=>1000,28489=>1000,28490=>1000,28491=>1000,28492=>1000,28493=>1000,28494=>1000,28495=>1000,28496=>1000,28497=>1000,28498=>1000,28499=>1000,28500=>1000,28501=>1000,28502=>1000,28503=>1000,28504=>1000,28505=>1000,28506=>1000,28507=>1000,28508=>1000,28509=>1000,28510=>1000,28511=>1000,28512=>1000,28513=>1000,28514=>1000,28515=>1000,28516=>1000,28517=>1000,28518=>1000,28519=>1000,28520=>1000,28521=>1000,28522=>1000,28523=>1000,28524=>1000,28525=>1000,28526=>1000,28527=>1000,28528=>1000,28529=>1000,28530=>1000,28531=>1000,28532=>1000,28533=>1000,28534=>1000,28535=>1000,28536=>1000,28537=>1000,28538=>1000,28539=>1000,28540=>1000,28541=>1000,28542=>1000,28543=>1000,28544=>1000,28545=>1000,28546=>1000,28547=>1000,28548=>1000,28549=>1000,28550=>1000,28551=>1000,28552=>1000,28553=>1000,28554=>1000,28555=>1000,28556=>1000,28557=>1000,28558=>1000,28559=>1000,28560=>1000,28561=>1000,28562=>1000,28563=>1000,28564=>1000,28565=>1000,28566=>1000,28567=>1000,28568=>1000,28569=>1000,28570=>1000,28571=>1000,28572=>1000,28573=>1000,28574=>1000,28575=>1000,28576=>1000,28577=>1000,28578=>1000,28579=>1000,28580=>1000,28581=>1000,28582=>1000,28583=>1000,28584=>1000,28585=>1000,28586=>1000,28587=>1000,28588=>1000,28589=>1000,28590=>1000,28591=>1000,28592=>1000,28593=>1000,28594=>1000,28595=>1000,28596=>1000,28597=>1000,28598=>1000,28599=>1000,28600=>1000,28601=>1000,28602=>1000,28603=>1000,28604=>1000,28605=>1000,28606=>1000,28607=>1000,28608=>1000,28609=>1000,28610=>1000,28611=>1000,28612=>1000,28613=>1000,28614=>1000,28615=>1000,28616=>1000,28617=>1000,28618=>1000,28619=>1000,28620=>1000,28621=>1000,28622=>1000,28623=>1000,28624=>1000,28625=>1000,28626=>1000,28627=>1000,28628=>1000,28629=>1000,28630=>1000,28631=>1000,28632=>1000,28633=>1000,28634=>1000,28635=>1000,28636=>1000,28637=>1000,28638=>1000,28639=>1000,28640=>1000,28641=>1000,28642=>1000,28643=>1000,28644=>1000,28645=>1000,28646=>1000,28647=>1000,28648=>1000,28649=>1000,28650=>1000,28651=>1000,28652=>1000,28653=>1000,28654=>1000,28655=>1000,28656=>1000,28657=>1000,28658=>1000,28659=>1000,28660=>1000,28661=>1000,28662=>1000,28663=>1000,28664=>1000,28665=>1000,28666=>1000,28667=>1000,28668=>1000,28669=>1000,28670=>1000,28671=>1000,28672=>1000,28673=>1000,28674=>1000,28675=>1000,28676=>1000,28677=>1000,28678=>1000,28679=>1000,28680=>1000,28681=>1000,28682=>1000,28683=>1000,28684=>1000,28685=>1000,28686=>1000,28687=>1000,28688=>1000,28689=>1000,28690=>1000,28691=>1000,28692=>1000,28693=>1000,28694=>1000,28695=>1000,28696=>1000,28697=>1000,28698=>1000,28699=>1000,28700=>1000,28701=>1000,28702=>1000,28703=>1000,28704=>1000,28705=>1000,28706=>1000,28707=>1000,28708=>1000,28709=>1000,28710=>1000,28711=>1000,28712=>1000,28713=>1000,28714=>1000,28715=>1000,28716=>1000,28717=>1000,28718=>1000,28719=>1000,28720=>1000,28721=>1000,28722=>1000,28723=>1000,28724=>1000,28725=>1000,28726=>1000,28727=>1000,28728=>1000,28729=>1000,28730=>1000,28731=>1000,28732=>1000,28733=>1000,28734=>1000,28735=>1000,28736=>1000,28737=>1000,28738=>1000,28739=>1000,28740=>1000,28741=>1000,28742=>1000,28743=>1000,28744=>1000,28745=>1000,28746=>1000,28747=>1000,28748=>1000,28749=>1000,28750=>1000,28751=>1000,28752=>1000,28753=>1000,28754=>1000,28755=>1000,28756=>1000,28757=>1000,28758=>1000,28759=>1000,28760=>1000,28761=>1000,28762=>1000,28763=>1000,28764=>1000,28765=>1000,28766=>1000,28767=>1000,28768=>1000,28769=>1000,28770=>1000,28771=>1000,28772=>1000,28773=>1000,28774=>1000,28775=>1000,28776=>1000,28777=>1000,28778=>1000,28779=>1000,28780=>1000,28781=>1000,28782=>1000,28783=>1000,28784=>1000,28785=>1000,28786=>1000,28787=>1000,28788=>1000,28789=>1000,28790=>1000,28791=>1000,28792=>1000,28793=>1000,28794=>1000,28795=>1000,28796=>1000,28797=>1000,28798=>1000,28799=>1000,28800=>1000,28801=>1000,28802=>1000,28803=>1000,28804=>1000,28805=>1000,28806=>1000,28807=>1000,28808=>1000,28809=>1000,28810=>1000,28811=>1000,28812=>1000,28813=>1000,28814=>1000,28815=>1000,28816=>1000,28817=>1000,28818=>1000,28819=>1000,28820=>1000,28821=>1000,28822=>1000,28823=>1000,28824=>1000,28825=>1000,28826=>1000,28827=>1000,28828=>1000,28829=>1000,28830=>1000,28831=>1000,28832=>1000,28833=>1000,28834=>1000,28835=>1000,28836=>1000,28837=>1000,28838=>1000,28839=>1000,28840=>1000,28841=>1000,28842=>1000,28843=>1000,28844=>1000,28845=>1000,28846=>1000,28847=>1000,28848=>1000,28849=>1000,28850=>1000,28851=>1000,28852=>1000,28853=>1000,28854=>1000,28855=>1000,28856=>1000,28857=>1000,28858=>1000,28859=>1000,28860=>1000,28861=>1000,28862=>1000,28863=>1000,28864=>1000,28865=>1000,28866=>1000,28867=>1000,28868=>1000,28869=>1000,28870=>1000,28871=>1000,28872=>1000,28873=>1000,28874=>1000,28875=>1000,28876=>1000,28877=>1000,28878=>1000,28879=>1000,28880=>1000,28881=>1000,28882=>1000,28883=>1000,28884=>1000,28885=>1000,28886=>1000,28887=>1000,28888=>1000,28889=>1000,28890=>1000,28891=>1000,28892=>1000,28893=>1000,28894=>1000,28895=>1000,28896=>1000,28897=>1000,28898=>1000,28899=>1000,28900=>1000,28901=>1000,28902=>1000,28903=>1000,28904=>1000,28905=>1000,28906=>1000,28907=>1000,28908=>1000,28909=>1000,28910=>1000,28911=>1000,28912=>1000,28913=>1000,28914=>1000,28915=>1000,28916=>1000,28917=>1000,28918=>1000,28919=>1000,28920=>1000,28921=>1000,28922=>1000,28923=>1000,28924=>1000,28925=>1000,28926=>1000,28927=>1000,28928=>1000,28929=>1000,28930=>1000,28931=>1000,28932=>1000,28933=>1000,28934=>1000,28935=>1000,28936=>1000,28937=>1000,28938=>1000,28939=>1000,28940=>1000,28941=>1000,28942=>1000,28943=>1000,28944=>1000,28945=>1000,28946=>1000,28947=>1000,28948=>1000,28949=>1000,28950=>1000,28951=>1000,28952=>1000,28953=>1000,28954=>1000,28955=>1000,28956=>1000,28957=>1000,28958=>1000,28959=>1000,28960=>1000,28961=>1000,28962=>1000,28963=>1000,28964=>1000,28965=>1000,28966=>1000,28967=>1000,28968=>1000,28969=>1000,28970=>1000,28971=>1000,28972=>1000,28973=>1000,28974=>1000,28975=>1000,28976=>1000,28977=>1000,28978=>1000,28979=>1000,28980=>1000,28981=>1000,28982=>1000,28983=>1000,28984=>1000,28985=>1000,28986=>1000,28987=>1000,28988=>1000,28989=>1000,28990=>1000,28991=>1000,28992=>1000,28993=>1000,28994=>1000,28995=>1000,28996=>1000,28997=>1000,28998=>1000,28999=>1000,29000=>1000,29001=>1000,29002=>1000,29003=>1000,29004=>1000,29005=>1000,29006=>1000,29007=>1000,29008=>1000,29009=>1000,29010=>1000,29011=>1000,29012=>1000,29013=>1000,29014=>1000,29015=>1000,29016=>1000,29017=>1000,29018=>1000,29019=>1000,29020=>1000,29021=>1000,29022=>1000,29023=>1000,29024=>1000,29025=>1000,29026=>1000,29027=>1000,29028=>1000,29029=>1000,29030=>1000,29031=>1000,29032=>1000,29033=>1000,29034=>1000,29035=>1000,29036=>1000,29037=>1000,29038=>1000,29039=>1000,29040=>1000,29041=>1000,29042=>1000,29043=>1000,29044=>1000,29045=>1000,29046=>1000,29047=>1000,29048=>1000,29049=>1000,29050=>1000,29051=>1000,29052=>1000,29053=>1000,29054=>1000,29055=>1000,29056=>1000,29057=>1000,29058=>1000,29059=>1000,29060=>1000,29061=>1000,29062=>1000,29063=>1000,29064=>1000,29065=>1000,29066=>1000,29067=>1000,29068=>1000,29069=>1000,29070=>1000,29071=>1000,29072=>1000,29073=>1000,29074=>1000,29075=>1000,29076=>1000,29077=>1000,29078=>1000,29079=>1000,29080=>1000,29081=>1000,29082=>1000,29083=>1000,29084=>1000,29085=>1000,29086=>1000,29087=>1000,29088=>1000,29089=>1000,29090=>1000,29091=>1000,29092=>1000,29093=>1000,29094=>1000,29095=>1000,29096=>1000,29097=>1000,29098=>1000,29099=>1000,29100=>1000,29101=>1000,29102=>1000,29103=>1000,29104=>1000,29105=>1000,29106=>1000,29107=>1000,29108=>1000,29109=>1000,29110=>1000,29111=>1000,29112=>1000,29113=>1000,29114=>1000,29115=>1000,29116=>1000,29117=>1000,29118=>1000,29119=>1000,29120=>1000,29121=>1000,29122=>1000,29123=>1000,29124=>1000,29125=>1000,29126=>1000,29127=>1000,29128=>1000,29129=>1000,29130=>1000,29131=>1000,29132=>1000,29133=>1000,29134=>1000,29135=>1000,29136=>1000,29137=>1000,29138=>1000,29139=>1000,29140=>1000,29141=>1000,29142=>1000,29143=>1000,29144=>1000,29145=>1000,29146=>1000,29147=>1000,29148=>1000,29149=>1000,29150=>1000,29151=>1000,29152=>1000,29153=>1000,29154=>1000,29155=>1000,29156=>1000,29157=>1000,29158=>1000,29159=>1000,29160=>1000,29161=>1000,29162=>1000,29163=>1000,29164=>1000,29165=>1000,29166=>1000,29167=>1000,29168=>1000,29169=>1000,29170=>1000,29171=>1000,29172=>1000,29173=>1000,29174=>1000,29175=>1000,29176=>1000,29177=>1000,29178=>1000,29179=>1000,29180=>1000,29181=>1000,29182=>1000,29183=>1000,29184=>1000,29185=>1000,29186=>1000,29187=>1000,29188=>1000,29189=>1000,29190=>1000,29191=>1000,29192=>1000,29193=>1000,29194=>1000,29195=>1000,29196=>1000,29197=>1000,29198=>1000,29199=>1000,29200=>1000,29201=>1000,29202=>1000,29203=>1000,29204=>1000,29205=>1000,29206=>1000,29207=>1000,29208=>1000,29209=>1000,29210=>1000,29211=>1000,29212=>1000,29213=>1000,29214=>1000,29215=>1000,29216=>1000,29217=>1000,29218=>1000,29219=>1000,29220=>1000,29221=>1000,29222=>1000,29223=>1000,29224=>1000,29225=>1000,29226=>1000,29227=>1000,29228=>1000,29229=>1000,29230=>1000,29231=>1000,29232=>1000,29233=>1000,29234=>1000,29235=>1000,29236=>1000,29237=>1000,29238=>1000,29239=>1000,29240=>1000,29241=>1000,29242=>1000,29243=>1000,29244=>1000,29245=>1000,29246=>1000,29247=>1000,29248=>1000,29249=>1000,29250=>1000,29251=>1000,29252=>1000,29253=>1000,29254=>1000,29255=>1000,29256=>1000,29257=>1000,29258=>1000,29259=>1000,29260=>1000,29261=>1000,29262=>1000,29263=>1000,29264=>1000,29265=>1000,29266=>1000,29267=>1000,29268=>1000,29269=>1000,29270=>1000,29271=>1000,29272=>1000,29273=>1000,29274=>1000,29275=>1000,29276=>1000,29277=>1000,29278=>1000,29279=>1000,29280=>1000,29281=>1000,29282=>1000,29283=>1000,29284=>1000,29285=>1000,29286=>1000,29287=>1000,29288=>1000,29289=>1000,29290=>1000,29291=>1000,29292=>1000,29293=>1000,29294=>1000,29295=>1000,29296=>1000,29297=>1000,29298=>1000,29299=>1000,29300=>1000,29301=>1000,29302=>1000,29303=>1000,29304=>1000,29305=>1000,29306=>1000,29307=>1000,29308=>1000,29309=>1000,29310=>1000,29311=>1000,29312=>1000,29313=>1000,29314=>1000,29315=>1000,29316=>1000,29317=>1000,29318=>1000,29319=>1000,29320=>1000,29321=>1000,29322=>1000,29323=>1000,29324=>1000,29325=>1000,29326=>1000,29327=>1000,29328=>1000,29329=>1000,29330=>1000,29331=>1000,29332=>1000,29333=>1000,29334=>1000,29335=>1000,29336=>1000,29337=>1000,29338=>1000,29339=>1000,29340=>1000,29341=>1000,29342=>1000,29343=>1000,29344=>1000,29345=>1000,29346=>1000,29347=>1000,29348=>1000,29349=>1000,29350=>1000,29351=>1000,29352=>1000,29353=>1000,29354=>1000,29355=>1000,29356=>1000,29357=>1000,29358=>1000,29359=>1000,29360=>1000,29361=>1000,29362=>1000,29363=>1000,29364=>1000,29365=>1000,29366=>1000,29367=>1000,29368=>1000,29369=>1000,29370=>1000,29371=>1000,29372=>1000,29373=>1000,29374=>1000,29375=>1000,29376=>1000,29377=>1000,29378=>1000,29379=>1000,29380=>1000,29381=>1000,29382=>1000,29383=>1000,29384=>1000,29385=>1000,29386=>1000,29387=>1000,29388=>1000,29389=>1000,29390=>1000,29391=>1000,29392=>1000,29393=>1000,29394=>1000,29395=>1000,29396=>1000,29397=>1000,29398=>1000,29399=>1000,29400=>1000,29401=>1000,29402=>1000,29403=>1000,29404=>1000,29405=>1000,29406=>1000,29407=>1000,29408=>1000,29409=>1000,29410=>1000,29411=>1000,29412=>1000,29413=>1000,29414=>1000,29415=>1000,29416=>1000,29417=>1000,29418=>1000,29419=>1000,29420=>1000,29421=>1000,29422=>1000,29423=>1000,29424=>1000,29425=>1000,29426=>1000,29427=>1000,29428=>1000,29429=>1000,29430=>1000,29431=>1000,29432=>1000,29433=>1000,29434=>1000,29435=>1000,29436=>1000,29437=>1000,29438=>1000,29439=>1000,29440=>1000,29441=>1000,29442=>1000,29443=>1000,29444=>1000,29445=>1000,29446=>1000,29447=>1000,29448=>1000,29449=>1000,29450=>1000,29451=>1000,29452=>1000,29453=>1000,29454=>1000,29455=>1000,29456=>1000,29457=>1000,29458=>1000,29459=>1000,29460=>1000,29461=>1000,29462=>1000,29463=>1000,29464=>1000,29465=>1000,29466=>1000,29467=>1000,29468=>1000,29469=>1000,29470=>1000,29471=>1000,29472=>1000,29473=>1000,29474=>1000,29475=>1000,29476=>1000,29477=>1000,29478=>1000,29479=>1000,29480=>1000,29481=>1000,29482=>1000,29483=>1000,29484=>1000,29485=>1000,29486=>1000,29487=>1000,29488=>1000,29489=>1000,29490=>1000,29491=>1000,29492=>1000,29493=>1000,29494=>1000,29495=>1000,29496=>1000,29497=>1000,29498=>1000,29499=>1000,29500=>1000,29501=>1000,29502=>1000,29503=>1000,29504=>1000,29505=>1000,29506=>1000,29507=>1000,29508=>1000,29509=>1000,29510=>1000,29511=>1000,29512=>1000,29513=>1000,29514=>1000,29515=>1000,29516=>1000,29517=>1000,29518=>1000,29519=>1000,29520=>1000,29521=>1000,29522=>1000,29523=>1000,29524=>1000,29525=>1000,29526=>1000,29527=>1000,29528=>1000,29529=>1000,29530=>1000,29531=>1000,29532=>1000,29533=>1000,29534=>1000,29535=>1000,29536=>1000,29537=>1000,29538=>1000,29539=>1000,29540=>1000,29541=>1000,29542=>1000,29543=>1000,29544=>1000,29545=>1000,29546=>1000,29547=>1000,29548=>1000,29549=>1000,29550=>1000,29551=>1000,29552=>1000,29553=>1000,29554=>1000,29555=>1000,29556=>1000,29557=>1000,29558=>1000,29559=>1000,29560=>1000,29561=>1000,29562=>1000,29563=>1000,29564=>1000,29565=>1000,29566=>1000,29567=>1000,29568=>1000,29569=>1000,29570=>1000,29571=>1000,29572=>1000,29573=>1000,29574=>1000,29575=>1000,29576=>1000,29577=>1000,29578=>1000,29579=>1000,29580=>1000,29581=>1000,29582=>1000,29583=>1000,29584=>1000,29585=>1000,29586=>1000,29587=>1000,29588=>1000,29589=>1000,29590=>1000,29591=>1000,29592=>1000,29593=>1000,29594=>1000,29595=>1000,29596=>1000,29597=>1000,29598=>1000,29599=>1000,29600=>1000,29601=>1000,29602=>1000,29603=>1000,29604=>1000,29605=>1000,29606=>1000,29607=>1000,29608=>1000,29609=>1000,29610=>1000,29611=>1000,29612=>1000,29613=>1000,29614=>1000,29615=>1000,29616=>1000,29617=>1000,29618=>1000,29619=>1000,29620=>1000,29621=>1000,29622=>1000,29623=>1000,29624=>1000,29625=>1000,29626=>1000,29627=>1000,29628=>1000,29629=>1000,29630=>1000,29631=>1000,29632=>1000,29633=>1000,29634=>1000,29635=>1000,29636=>1000,29637=>1000,29638=>1000,29639=>1000,29640=>1000,29641=>1000,29642=>1000,29643=>1000,29644=>1000,29645=>1000,29646=>1000,29647=>1000,29648=>1000,29649=>1000,29650=>1000,29651=>1000,29652=>1000,29653=>1000,29654=>1000,29655=>1000,29656=>1000,29657=>1000,29658=>1000,29659=>1000,29660=>1000,29661=>1000,29662=>1000,29663=>1000,29664=>1000,29665=>1000,29666=>1000,29667=>1000,29668=>1000,29669=>1000,29670=>1000,29671=>1000,29672=>1000,29673=>1000,29674=>1000,29675=>1000,29676=>1000,29677=>1000,29678=>1000,29679=>1000,29680=>1000,29681=>1000,29682=>1000,29683=>1000,29684=>1000,29685=>1000,29686=>1000,29687=>1000,29688=>1000,29689=>1000,29690=>1000,29691=>1000,29692=>1000,29693=>1000,29694=>1000,29695=>1000,29696=>1000,29697=>1000,29698=>1000,29699=>1000,29700=>1000,29701=>1000,29702=>1000,29703=>1000,29704=>1000,29705=>1000,29706=>1000,29707=>1000,29708=>1000,29709=>1000,29710=>1000,29711=>1000,29712=>1000,29713=>1000,29714=>1000,29715=>1000,29716=>1000,29717=>1000,29718=>1000,29719=>1000,29720=>1000,29721=>1000,29722=>1000,29723=>1000,29724=>1000,29725=>1000,29726=>1000,29727=>1000,29728=>1000,29729=>1000,29730=>1000,29731=>1000,29732=>1000,29733=>1000,29734=>1000,29735=>1000,29736=>1000,29737=>1000,29738=>1000,29739=>1000,29740=>1000,29741=>1000,29742=>1000,29743=>1000,29744=>1000,29745=>1000,29746=>1000,29747=>1000,29748=>1000,29749=>1000,29750=>1000,29751=>1000,29752=>1000,29753=>1000,29754=>1000,29755=>1000,29756=>1000,29757=>1000,29758=>1000,29759=>1000,29760=>1000,29761=>1000,29762=>1000,29763=>1000,29764=>1000,29765=>1000,29766=>1000,29767=>1000,29768=>1000,29769=>1000,29770=>1000,29771=>1000,29772=>1000,29773=>1000,29774=>1000,29775=>1000,29776=>1000,29777=>1000,29778=>1000,29779=>1000,29780=>1000,29781=>1000,29782=>1000,29783=>1000,29784=>1000,29785=>1000,29786=>1000,29787=>1000,29788=>1000,29789=>1000,29790=>1000,29791=>1000,29792=>1000,29793=>1000,29794=>1000,29795=>1000,29796=>1000,29797=>1000,29798=>1000,29799=>1000,29800=>1000,29801=>1000,29802=>1000,29803=>1000,29804=>1000,29805=>1000,29806=>1000,29807=>1000,29808=>1000,29809=>1000,29810=>1000,29811=>1000,29812=>1000,29813=>1000,29814=>1000,29815=>1000,29816=>1000,29817=>1000,29818=>1000,29819=>1000,29820=>1000,29821=>1000,29822=>1000,29823=>1000,29824=>1000,29825=>1000,29826=>1000,29827=>1000,29828=>1000,29829=>1000,29830=>1000,29831=>1000,29832=>1000,29833=>1000,29834=>1000,29835=>1000,29836=>1000,29837=>1000,29838=>1000,29839=>1000,29840=>1000,29841=>1000,29842=>1000,29843=>1000,29844=>1000,29845=>1000,29846=>1000,29847=>1000,29848=>1000,29849=>1000,29850=>1000,29851=>1000,29852=>1000,29853=>1000,29854=>1000,29855=>1000,29856=>1000,29857=>1000,29858=>1000,29859=>1000,29860=>1000,29861=>1000,29862=>1000,29863=>1000,29864=>1000,29865=>1000,29866=>1000,29867=>1000,29868=>1000,29869=>1000,29870=>1000,29871=>1000,29872=>1000,29873=>1000,29874=>1000,29875=>1000,29876=>1000,29877=>1000,29878=>1000,29879=>1000,29880=>1000,29881=>1000,29882=>1000,29883=>1000,29884=>1000,29885=>1000,29886=>1000,29887=>1000,29888=>1000,29889=>1000,29890=>1000,29891=>1000,29892=>1000,29893=>1000,29894=>1000,29895=>1000,29896=>1000,29897=>1000,29898=>1000,29899=>1000,29900=>1000,29901=>1000,29902=>1000,29903=>1000,29904=>1000,29905=>1000,29906=>1000,29907=>1000,29908=>1000,29909=>1000,29910=>1000,29911=>1000,29912=>1000,29913=>1000,29914=>1000,29915=>1000,29916=>1000,29917=>1000,29918=>1000,29919=>1000,29920=>1000,29921=>1000,29922=>1000,29923=>1000,29924=>1000,29925=>1000,29926=>1000,29927=>1000,29928=>1000,29929=>1000,29930=>1000,29931=>1000,29932=>1000,29933=>1000,29934=>1000,29935=>1000,29936=>1000,29937=>1000,29938=>1000,29939=>1000,29940=>1000,29941=>1000,29942=>1000,29943=>1000,29944=>1000,29945=>1000,29946=>1000,29947=>1000,29948=>1000,29949=>1000,29950=>1000,29951=>1000,29952=>1000,29953=>1000,29954=>1000,29955=>1000,29956=>1000,29957=>1000,29958=>1000,29959=>1000,29960=>1000,29961=>1000,29962=>1000,29963=>1000,29964=>1000,29965=>1000,29966=>1000,29967=>1000,29968=>1000,29969=>1000,29970=>1000,29971=>1000,29972=>1000,29973=>1000,29974=>1000,29975=>1000,29976=>1000,29977=>1000,29978=>1000,29979=>1000,29980=>1000,29981=>1000,29982=>1000,29983=>1000,29984=>1000,29985=>1000,29986=>1000,29987=>1000,29988=>1000,29989=>1000,29990=>1000,29991=>1000,29992=>1000,29993=>1000,29994=>1000,29995=>1000,29996=>1000,29997=>1000,29998=>1000,29999=>1000,30000=>1000,30001=>1000,30002=>1000,30003=>1000,30004=>1000,30005=>1000,30006=>1000,30007=>1000,30008=>1000,30009=>1000,30010=>1000,30011=>1000,30012=>1000,30013=>1000,30014=>1000,30015=>1000,30016=>1000,30017=>1000,30018=>1000,30019=>1000,30020=>1000,30021=>1000,30022=>1000,30023=>1000,30024=>1000,30025=>1000,30026=>1000,30027=>1000,30028=>1000,30029=>1000,30030=>1000,30031=>1000,30032=>1000,30033=>1000,30034=>1000,30035=>1000,30036=>1000,30037=>1000,30038=>1000,30039=>1000,30040=>1000,30041=>1000,30042=>1000,30043=>1000,30044=>1000,30045=>1000,30046=>1000,30047=>1000,30048=>1000,30049=>1000,30050=>1000,30051=>1000,30052=>1000,30053=>1000,30054=>1000,30055=>1000,30056=>1000,30057=>1000,30058=>1000,30059=>1000,30060=>1000,30061=>1000,30062=>1000,30063=>1000,30064=>1000,30065=>1000,30066=>1000,30067=>1000,30068=>1000,30069=>1000,30070=>1000,30071=>1000,30072=>1000,30073=>1000,30074=>1000,30075=>1000,30076=>1000,30077=>1000,30078=>1000,30079=>1000,30080=>1000,30081=>1000,30082=>1000,30083=>1000,30084=>1000,30085=>1000,30086=>1000,30087=>1000,30088=>1000,30089=>1000,30090=>1000,30091=>1000,30092=>1000,30093=>1000,30094=>1000,30095=>1000,30096=>1000,30097=>1000,30098=>1000,30099=>1000,30100=>1000,30101=>1000,30102=>1000,30103=>1000,30104=>1000,30105=>1000,30106=>1000,30107=>1000,30108=>1000,30109=>1000,30110=>1000,30111=>1000,30112=>1000,30113=>1000,30114=>1000,30115=>1000,30116=>1000,30117=>1000,30118=>1000,30119=>1000,30120=>1000,30121=>1000,30122=>1000,30123=>1000,30124=>1000,30125=>1000,30126=>1000,30127=>1000,30128=>1000,30129=>1000,30130=>1000,30131=>1000,30132=>1000,30133=>1000,30134=>1000,30135=>1000,30136=>1000,30137=>1000,30138=>1000,30139=>1000,30140=>1000,30141=>1000,30142=>1000,30143=>1000,30144=>1000,30145=>1000,30146=>1000,30147=>1000,30148=>1000,30149=>1000,30150=>1000,30151=>1000,30152=>1000,30153=>1000,30154=>1000,30155=>1000,30156=>1000,30157=>1000,30158=>1000,30159=>1000,30160=>1000,30161=>1000,30162=>1000,30163=>1000,30164=>1000,30165=>1000,30166=>1000,30167=>1000,30168=>1000,30169=>1000,30170=>1000,30171=>1000,30172=>1000,30173=>1000,30174=>1000,30175=>1000,30176=>1000,30177=>1000,30178=>1000,30179=>1000,30180=>1000,30181=>1000,30182=>1000,30183=>1000,30184=>1000,30185=>1000,30186=>1000,30187=>1000,30188=>1000,30189=>1000,30190=>1000,30191=>1000,30192=>1000,30193=>1000,30194=>1000,30195=>1000,30196=>1000,30197=>1000,30198=>1000,30199=>1000,30200=>1000,30201=>1000,30202=>1000,30203=>1000,30204=>1000,30205=>1000,30206=>1000,30207=>1000,30208=>1000,30209=>1000,30210=>1000,30211=>1000,30212=>1000,30213=>1000,30214=>1000,30215=>1000,30216=>1000,30217=>1000,30218=>1000,30219=>1000,30220=>1000,30221=>1000,30222=>1000,30223=>1000,30224=>1000,30225=>1000,30226=>1000,30227=>1000,30228=>1000,30229=>1000,30230=>1000,30231=>1000,30232=>1000,30233=>1000,30234=>1000,30235=>1000,30236=>1000,30237=>1000,30238=>1000,30239=>1000,30240=>1000,30241=>1000,30242=>1000,30243=>1000,30244=>1000,30245=>1000,30246=>1000,30247=>1000,30248=>1000,30249=>1000,30250=>1000,30251=>1000,30252=>1000,30253=>1000,30254=>1000,30255=>1000,30256=>1000,30257=>1000,30258=>1000,30259=>1000,30260=>1000,30261=>1000,30262=>1000,30263=>1000,30264=>1000,30265=>1000,30266=>1000,30267=>1000,30268=>1000,30269=>1000,30270=>1000,30271=>1000,30272=>1000,30273=>1000,30274=>1000,30275=>1000,30276=>1000,30277=>1000,30278=>1000,30279=>1000,30280=>1000,30281=>1000,30282=>1000,30283=>1000,30284=>1000,30285=>1000,30286=>1000,30287=>1000,30288=>1000,30289=>1000,30290=>1000,30291=>1000,30292=>1000,30293=>1000,30294=>1000,30295=>1000,30296=>1000,30297=>1000,30298=>1000,30299=>1000,30300=>1000,30301=>1000,30302=>1000,30303=>1000,30304=>1000,30305=>1000,30306=>1000,30307=>1000,30308=>1000,30309=>1000,30310=>1000,30311=>1000,30312=>1000,30313=>1000,30314=>1000,30315=>1000,30316=>1000,30317=>1000,30318=>1000,30319=>1000,30320=>1000,30321=>1000,30322=>1000,30323=>1000,30324=>1000,30325=>1000,30326=>1000,30327=>1000,30328=>1000,30329=>1000,30330=>1000,30331=>1000,30332=>1000,30333=>1000,30334=>1000,30335=>1000,30336=>1000,30337=>1000,30338=>1000,30339=>1000,30340=>1000,30341=>1000,30342=>1000,30343=>1000,30344=>1000,30345=>1000,30346=>1000,30347=>1000,30348=>1000,30349=>1000,30350=>1000,30351=>1000,30352=>1000,30353=>1000,30354=>1000,30355=>1000,30356=>1000,30357=>1000,30358=>1000,30359=>1000,30360=>1000,30361=>1000,30362=>1000,30363=>1000,30364=>1000,30365=>1000,30366=>1000,30367=>1000,30368=>1000,30369=>1000,30370=>1000,30371=>1000,30372=>1000,30373=>1000,30374=>1000,30375=>1000,30376=>1000,30377=>1000,30378=>1000,30379=>1000,30380=>1000,30381=>1000,30382=>1000,30383=>1000,30384=>1000,30385=>1000,30386=>1000,30387=>1000,30388=>1000,30389=>1000,30390=>1000,30391=>1000,30392=>1000,30393=>1000,30394=>1000,30395=>1000,30396=>1000,30397=>1000,30398=>1000,30399=>1000,30400=>1000,30401=>1000,30402=>1000,30403=>1000,30404=>1000,30405=>1000,30406=>1000,30407=>1000,30408=>1000,30409=>1000,30410=>1000,30411=>1000,30412=>1000,30413=>1000,30414=>1000,30415=>1000,30416=>1000,30417=>1000,30418=>1000,30419=>1000,30420=>1000,30421=>1000,30422=>1000,30423=>1000,30424=>1000,30425=>1000,30426=>1000,30427=>1000,30428=>1000,30429=>1000,30430=>1000,30431=>1000,30432=>1000,30433=>1000,30434=>1000,30435=>1000,30436=>1000,30437=>1000,30438=>1000,30439=>1000,30440=>1000,30441=>1000,30442=>1000,30443=>1000,30444=>1000,30445=>1000,30446=>1000,30447=>1000,30448=>1000,30449=>1000,30450=>1000,30451=>1000,30452=>1000,30453=>1000,30454=>1000,30455=>1000,30456=>1000,30457=>1000,30458=>1000,30459=>1000,30460=>1000,30461=>1000,30462=>1000,30463=>1000,30464=>1000,30465=>1000,30466=>1000,30467=>1000,30468=>1000,30469=>1000,30470=>1000,30471=>1000,30472=>1000,30473=>1000,30474=>1000,30475=>1000,30476=>1000,30477=>1000,30478=>1000,30479=>1000,30480=>1000,30481=>1000,30482=>1000,30483=>1000,30484=>1000,30485=>1000,30486=>1000,30487=>1000,30488=>1000,30489=>1000,30490=>1000,30491=>1000,30492=>1000,30493=>1000,30494=>1000,30495=>1000,30496=>1000,30497=>1000,30498=>1000,30499=>1000,30500=>1000,30501=>1000,30502=>1000,30503=>1000,30504=>1000,30505=>1000,30506=>1000,30507=>1000,30508=>1000,30509=>1000,30510=>1000,30511=>1000,30512=>1000,30513=>1000,30514=>1000,30515=>1000,30516=>1000,30517=>1000,30518=>1000,30519=>1000,30520=>1000,30521=>1000,30522=>1000,30523=>1000,30524=>1000,30525=>1000,30526=>1000,30527=>1000,30528=>1000,30529=>1000,30530=>1000,30531=>1000,30532=>1000,30533=>1000,30534=>1000,30535=>1000,30536=>1000,30537=>1000,30538=>1000,30539=>1000,30540=>1000,30541=>1000,30542=>1000,30543=>1000,30544=>1000,30545=>1000,30546=>1000,30547=>1000,30548=>1000,30549=>1000,30550=>1000,30551=>1000,30552=>1000,30553=>1000,30554=>1000,30555=>1000,30556=>1000,30557=>1000,30558=>1000,30559=>1000,30560=>1000,30561=>1000,30562=>1000,30563=>1000,30564=>1000,30565=>1000,30566=>1000,30567=>1000,30568=>1000,30569=>1000,30570=>1000,30571=>1000,30572=>1000,30573=>1000,30574=>1000,30575=>1000,30576=>1000,30577=>1000,30578=>1000,30579=>1000,30580=>1000,30581=>1000,30582=>1000,30583=>1000,30584=>1000,30585=>1000,30586=>1000,30587=>1000,30588=>1000,30589=>1000,30590=>1000,30591=>1000,30592=>1000,30593=>1000,30594=>1000,30595=>1000,30596=>1000,30597=>1000,30598=>1000,30599=>1000,30600=>1000,30601=>1000,30602=>1000,30603=>1000,30604=>1000,30605=>1000,30606=>1000,30607=>1000,30608=>1000,30609=>1000,30610=>1000,30611=>1000,30612=>1000,30613=>1000,30614=>1000,30615=>1000,30616=>1000,30617=>1000,30618=>1000,30619=>1000,30620=>1000,30621=>1000,30622=>1000,30623=>1000,30624=>1000,30625=>1000,30626=>1000,30627=>1000,30628=>1000,30629=>1000,30630=>1000,30631=>1000,30632=>1000,30633=>1000,30634=>1000,30635=>1000,30636=>1000,30637=>1000,30638=>1000,30639=>1000,30640=>1000,30641=>1000,30642=>1000,30643=>1000,30644=>1000,30645=>1000,30646=>1000,30647=>1000,30648=>1000,30649=>1000,30650=>1000,30651=>1000,30652=>1000,30653=>1000,30654=>1000,30655=>1000,30656=>1000,30657=>1000,30658=>1000,30659=>1000,30660=>1000,30661=>1000,30662=>1000,30663=>1000,30664=>1000,30665=>1000,30666=>1000,30667=>1000,30668=>1000,30669=>1000,30670=>1000,30671=>1000,30672=>1000,30673=>1000,30674=>1000,30675=>1000,30676=>1000,30677=>1000,30678=>1000,30679=>1000,30680=>1000,30681=>1000,30682=>1000,30683=>1000,30684=>1000,30685=>1000,30686=>1000,30687=>1000,30688=>1000,30689=>1000,30690=>1000,30691=>1000,30692=>1000,30693=>1000,30694=>1000,30695=>1000,30696=>1000,30697=>1000,30698=>1000,30699=>1000,30700=>1000,30701=>1000,30702=>1000,30703=>1000,30704=>1000,30705=>1000,30706=>1000,30707=>1000,30708=>1000,30709=>1000,30710=>1000,30711=>1000,30712=>1000,30713=>1000,30714=>1000,30715=>1000,30716=>1000,30717=>1000,30718=>1000,30719=>1000,30720=>1000,30721=>1000,30722=>1000,30723=>1000,30724=>1000,30725=>1000,30726=>1000,30727=>1000,30728=>1000,30729=>1000,30730=>1000,30731=>1000,30732=>1000,30733=>1000,30734=>1000,30735=>1000,30736=>1000,30737=>1000,30738=>1000,30739=>1000,30740=>1000,30741=>1000,30742=>1000,30743=>1000,30744=>1000,30745=>1000,30746=>1000,30747=>1000,30748=>1000,30749=>1000,30750=>1000,30751=>1000,30752=>1000,30753=>1000,30754=>1000,30755=>1000,30756=>1000,30757=>1000,30758=>1000,30759=>1000,30760=>1000,30761=>1000,30762=>1000,30763=>1000,30764=>1000,30765=>1000,30766=>1000,30767=>1000,30768=>1000,30769=>1000,30770=>1000,30771=>1000,30772=>1000,30773=>1000,30774=>1000,30775=>1000,30776=>1000,30777=>1000,30778=>1000,30779=>1000,30780=>1000,30781=>1000,30782=>1000,30783=>1000,30784=>1000,30785=>1000,30786=>1000,30787=>1000,30788=>1000,30789=>1000,30790=>1000,30791=>1000,30792=>1000,30793=>1000,30794=>1000,30795=>1000,30796=>1000,30797=>1000,30798=>1000,30799=>1000,30800=>1000,30801=>1000,30802=>1000,30803=>1000,30804=>1000,30805=>1000,30806=>1000,30807=>1000,30808=>1000,30809=>1000,30810=>1000,30811=>1000,30812=>1000,30813=>1000,30814=>1000,30815=>1000,30816=>1000,30817=>1000,30818=>1000,30819=>1000,30820=>1000,30821=>1000,30822=>1000,30823=>1000,30824=>1000,30825=>1000,30826=>1000,30827=>1000,30828=>1000,30829=>1000,30830=>1000,30831=>1000,30832=>1000,30833=>1000,30834=>1000,30835=>1000,30836=>1000,30837=>1000,30838=>1000,30839=>1000,30840=>1000,30841=>1000,30842=>1000,30843=>1000,30844=>1000,30845=>1000,30846=>1000,30847=>1000,30848=>1000,30849=>1000,30850=>1000,30851=>1000,30852=>1000,30853=>1000,30854=>1000,30855=>1000,30856=>1000,30857=>1000,30858=>1000,30859=>1000,30860=>1000,30861=>1000,30862=>1000,30863=>1000,30864=>1000,30865=>1000,30866=>1000,30867=>1000,30868=>1000,30869=>1000,30870=>1000,30871=>1000,30872=>1000,30873=>1000,30874=>1000,30875=>1000,30876=>1000,30877=>1000,30878=>1000,30879=>1000,30880=>1000,30881=>1000,30882=>1000,30883=>1000,30884=>1000,30885=>1000,30886=>1000,30887=>1000,30888=>1000,30889=>1000,30890=>1000,30891=>1000,30892=>1000,30893=>1000,30894=>1000,30895=>1000,30896=>1000,30897=>1000,30898=>1000,30899=>1000,30900=>1000,30901=>1000,30902=>1000,30903=>1000,30904=>1000,30905=>1000,30906=>1000,30907=>1000,30908=>1000,30909=>1000,30910=>1000,30911=>1000,30912=>1000,30913=>1000,30914=>1000,30915=>1000,30916=>1000,30917=>1000,30918=>1000,30919=>1000,30920=>1000,30921=>1000,30922=>1000,30923=>1000,30924=>1000,30925=>1000,30926=>1000,30927=>1000,30928=>1000,30929=>1000,30930=>1000,30931=>1000,30932=>1000,30933=>1000,30934=>1000,30935=>1000,30936=>1000,30937=>1000,30938=>1000,30939=>1000,30940=>1000,30941=>1000,30942=>1000,30943=>1000,30944=>1000,30945=>1000,30946=>1000,30947=>1000,30948=>1000,30949=>1000,30950=>1000,30951=>1000,30952=>1000,30953=>1000,30954=>1000,30955=>1000,30956=>1000,30957=>1000,30958=>1000,30959=>1000,30960=>1000,30961=>1000,30962=>1000,30963=>1000,30964=>1000,30965=>1000,30966=>1000,30967=>1000,30968=>1000,30969=>1000,30970=>1000,30971=>1000,30972=>1000,30973=>1000,30974=>1000,30975=>1000,30976=>1000,30977=>1000,30978=>1000,30979=>1000,30980=>1000,30981=>1000,30982=>1000,30983=>1000,30984=>1000,30985=>1000,30986=>1000,30987=>1000,30988=>1000,30989=>1000,30990=>1000,30991=>1000,30992=>1000,30993=>1000,30994=>1000,30995=>1000,30996=>1000,30997=>1000,30998=>1000,30999=>1000,31000=>1000,31001=>1000,31002=>1000,31003=>1000,31004=>1000,31005=>1000,31006=>1000,31007=>1000,31008=>1000,31009=>1000,31010=>1000,31011=>1000,31012=>1000,31013=>1000,31014=>1000,31015=>1000,31016=>1000,31017=>1000,31018=>1000,31019=>1000,31020=>1000,31021=>1000,31022=>1000,31023=>1000,31024=>1000,31025=>1000,31026=>1000,31027=>1000,31028=>1000,31029=>1000,31030=>1000,31031=>1000,31032=>1000,31033=>1000,31034=>1000,31035=>1000,31036=>1000,31037=>1000,31038=>1000,31039=>1000,31040=>1000,31041=>1000,31042=>1000,31043=>1000,31044=>1000,31045=>1000,31046=>1000,31047=>1000,31048=>1000,31049=>1000,31050=>1000,31051=>1000,31052=>1000,31053=>1000,31054=>1000,31055=>1000,31056=>1000,31057=>1000,31058=>1000,31059=>1000,31060=>1000,31061=>1000,31062=>1000,31063=>1000,31064=>1000,31065=>1000,31066=>1000,31067=>1000,31068=>1000,31069=>1000,31070=>1000,31071=>1000,31072=>1000,31073=>1000,31074=>1000,31075=>1000,31076=>1000,31077=>1000,31078=>1000,31079=>1000,31080=>1000,31081=>1000,31082=>1000,31083=>1000,31084=>1000,31085=>1000,31086=>1000,31087=>1000,31088=>1000,31089=>1000,31090=>1000,31091=>1000,31092=>1000,31093=>1000,31094=>1000,31095=>1000,31096=>1000,31097=>1000,31098=>1000,31099=>1000,31100=>1000,31101=>1000,31102=>1000,31103=>1000,31104=>1000,31105=>1000,31106=>1000,31107=>1000,31108=>1000,31109=>1000,31110=>1000,31111=>1000,31112=>1000,31113=>1000,31114=>1000,31115=>1000,31116=>1000,31117=>1000,31118=>1000,31119=>1000,31120=>1000,31121=>1000,31122=>1000,31123=>1000,31124=>1000,31125=>1000,31126=>1000,31127=>1000,31128=>1000,31129=>1000,31130=>1000,31131=>1000,31132=>1000,31133=>1000,31134=>1000,31135=>1000,31136=>1000,31137=>1000,31138=>1000,31139=>1000,31140=>1000,31141=>1000,31142=>1000,31143=>1000,31144=>1000,31145=>1000,31146=>1000,31147=>1000,31148=>1000,31149=>1000,31150=>1000,31151=>1000,31152=>1000,31153=>1000,31154=>1000,31155=>1000,31156=>1000,31157=>1000,31158=>1000,31159=>1000,31160=>1000,31161=>1000,31162=>1000,31163=>1000,31164=>1000,31165=>1000,31166=>1000,31167=>1000,31168=>1000,31169=>1000,31170=>1000,31171=>1000,31172=>1000,31173=>1000,31174=>1000,31175=>1000,31176=>1000,31177=>1000,31178=>1000,31179=>1000,31180=>1000,31181=>1000,31182=>1000,31183=>1000,31184=>1000,31185=>1000,31186=>1000,31187=>1000,31188=>1000,31189=>1000,31190=>1000,31191=>1000,31192=>1000,31193=>1000,31194=>1000,31195=>1000,31196=>1000,31197=>1000,31198=>1000,31199=>1000,31200=>1000,31201=>1000,31202=>1000,31203=>1000,31204=>1000,31205=>1000,31206=>1000,31207=>1000,31208=>1000,31209=>1000,31210=>1000,31211=>1000,31212=>1000,31213=>1000,31214=>1000,31215=>1000,31216=>1000,31217=>1000,31218=>1000,31219=>1000,31220=>1000,31221=>1000,31222=>1000,31223=>1000,31224=>1000,31225=>1000,31226=>1000,31227=>1000,31228=>1000,31229=>1000,31230=>1000,31231=>1000,31232=>1000,31233=>1000,31234=>1000,31235=>1000,31236=>1000,31237=>1000,31238=>1000,31239=>1000,31240=>1000,31241=>1000,31242=>1000,31243=>1000,31244=>1000,31245=>1000,31246=>1000,31247=>1000,31248=>1000,31249=>1000,31250=>1000,31251=>1000,31252=>1000,31253=>1000,31254=>1000,31255=>1000,31256=>1000,31257=>1000,31258=>1000,31259=>1000,31260=>1000,31261=>1000,31262=>1000,31263=>1000,31264=>1000,31265=>1000,31266=>1000,31267=>1000,31268=>1000,31269=>1000,31270=>1000,31271=>1000,31272=>1000,31273=>1000,31274=>1000,31275=>1000,31276=>1000,31277=>1000,31278=>1000,31279=>1000,31280=>1000,31281=>1000,31282=>1000,31283=>1000,31284=>1000,31285=>1000,31286=>1000,31287=>1000,31288=>1000,31289=>1000,31290=>1000,31291=>1000,31292=>1000,31293=>1000,31294=>1000,31295=>1000,31296=>1000,31297=>1000,31298=>1000,31299=>1000,31300=>1000,31301=>1000,31302=>1000,31303=>1000,31304=>1000,31305=>1000,31306=>1000,31307=>1000,31308=>1000,31309=>1000,31310=>1000,31311=>1000,31312=>1000,31313=>1000,31314=>1000,31315=>1000,31316=>1000,31317=>1000,31318=>1000,31319=>1000,31320=>1000,31321=>1000,31322=>1000,31323=>1000,31324=>1000,31325=>1000,31326=>1000,31327=>1000,31328=>1000,31329=>1000,31330=>1000,31331=>1000,31332=>1000,31333=>1000,31334=>1000,31335=>1000,31336=>1000,31337=>1000,31338=>1000,31339=>1000,31340=>1000,31341=>1000,31342=>1000,31343=>1000,31344=>1000,31345=>1000,31346=>1000,31347=>1000,31348=>1000,31349=>1000,31350=>1000,31351=>1000,31352=>1000,31353=>1000,31354=>1000,31355=>1000,31356=>1000,31357=>1000,31358=>1000,31359=>1000,31360=>1000,31361=>1000,31362=>1000,31363=>1000,31364=>1000,31365=>1000,31366=>1000,31367=>1000,31368=>1000,31369=>1000,31370=>1000,31371=>1000,31372=>1000,31373=>1000,31374=>1000,31375=>1000,31376=>1000,31377=>1000,31378=>1000,31379=>1000,31380=>1000,31381=>1000,31382=>1000,31383=>1000,31384=>1000,31385=>1000,31386=>1000,31387=>1000,31388=>1000,31389=>1000,31390=>1000,31391=>1000,31392=>1000,31393=>1000,31394=>1000,31395=>1000,31396=>1000,31397=>1000,31398=>1000,31399=>1000,31400=>1000,31401=>1000,31402=>1000,31403=>1000,31404=>1000,31405=>1000,31406=>1000,31407=>1000,31408=>1000,31409=>1000,31410=>1000,31411=>1000,31412=>1000,31413=>1000,31414=>1000,31415=>1000,31416=>1000,31417=>1000,31418=>1000,31419=>1000,31420=>1000,31421=>1000,31422=>1000,31423=>1000,31424=>1000,31425=>1000,31426=>1000,31427=>1000,31428=>1000,31429=>1000,31430=>1000,31431=>1000,31432=>1000,31433=>1000,31434=>1000,31435=>1000,31436=>1000,31437=>1000,31438=>1000,31439=>1000,31440=>1000,31441=>1000,31442=>1000,31443=>1000,31444=>1000,31445=>1000,31446=>1000,31447=>1000,31448=>1000,31449=>1000,31450=>1000,31451=>1000,31452=>1000,31453=>1000,31454=>1000,31455=>1000,31456=>1000,31457=>1000,31458=>1000,31459=>1000,31460=>1000,31461=>1000,31462=>1000,31463=>1000,31464=>1000,31465=>1000,31466=>1000,31467=>1000,31468=>1000,31469=>1000,31470=>1000,31471=>1000,31472=>1000,31473=>1000,31474=>1000,31475=>1000,31476=>1000,31477=>1000,31478=>1000,31479=>1000,31480=>1000,31481=>1000,31482=>1000,31483=>1000,31484=>1000,31485=>1000,31486=>1000,31487=>1000,31488=>1000,31489=>1000,31490=>1000,31491=>1000,31492=>1000,31493=>1000,31494=>1000,31495=>1000,31496=>1000,31497=>1000,31498=>1000,31499=>1000,31500=>1000,31501=>1000,31502=>1000,31503=>1000,31504=>1000,31505=>1000,31506=>1000,31507=>1000,31508=>1000,31509=>1000,31510=>1000,31511=>1000,31512=>1000,31513=>1000,31514=>1000,31515=>1000,31516=>1000,31517=>1000,31518=>1000,31519=>1000,31520=>1000,31521=>1000,31522=>1000,31523=>1000,31524=>1000,31525=>1000,31526=>1000,31527=>1000,31528=>1000,31529=>1000,31530=>1000,31531=>1000,31532=>1000,31533=>1000,31534=>1000,31535=>1000,31536=>1000,31537=>1000,31538=>1000,31539=>1000,31540=>1000,31541=>1000,31542=>1000,31543=>1000,31544=>1000,31545=>1000,31546=>1000,31547=>1000,31548=>1000,31549=>1000,31550=>1000,31551=>1000,31552=>1000,31553=>1000,31554=>1000,31555=>1000,31556=>1000,31557=>1000,31558=>1000,31559=>1000,31560=>1000,31561=>1000,31562=>1000,31563=>1000,31564=>1000,31565=>1000,31566=>1000,31567=>1000,31568=>1000,31569=>1000,31570=>1000,31571=>1000,31572=>1000,31573=>1000,31574=>1000,31575=>1000,31576=>1000,31577=>1000,31578=>1000,31579=>1000,31580=>1000,31581=>1000,31582=>1000,31583=>1000,31584=>1000,31585=>1000,31586=>1000,31587=>1000,31588=>1000,31589=>1000,31590=>1000,31591=>1000,31592=>1000,31593=>1000,31594=>1000,31595=>1000,31596=>1000,31597=>1000,31598=>1000,31599=>1000,31600=>1000,31601=>1000,31602=>1000,31603=>1000,31604=>1000,31605=>1000,31606=>1000,31607=>1000,31608=>1000,31609=>1000,31610=>1000,31611=>1000,31612=>1000,31613=>1000,31614=>1000,31615=>1000,31616=>1000,31617=>1000,31618=>1000,31619=>1000,31620=>1000,31621=>1000,31622=>1000,31623=>1000,31624=>1000,31625=>1000,31626=>1000,31627=>1000,31628=>1000,31629=>1000,31630=>1000,31631=>1000,31632=>1000,31633=>1000,31634=>1000,31635=>1000,31636=>1000,31637=>1000,31638=>1000,31639=>1000,31640=>1000,31641=>1000,31642=>1000,31643=>1000,31644=>1000,31645=>1000,31646=>1000,31647=>1000,31648=>1000,31649=>1000,31650=>1000,31651=>1000,31652=>1000,31653=>1000,31654=>1000,31655=>1000,31656=>1000,31657=>1000,31658=>1000,31659=>1000,31660=>1000,31661=>1000,31662=>1000,31663=>1000,31664=>1000,31665=>1000,31666=>1000,31667=>1000,31668=>1000,31669=>1000,31670=>1000,31671=>1000,31672=>1000,31673=>1000,31674=>1000,31675=>1000,31676=>1000,31677=>1000,31678=>1000,31679=>1000,31680=>1000,31681=>1000,31682=>1000,31683=>1000,31684=>1000,31685=>1000,31686=>1000,31687=>1000,31688=>1000,31689=>1000,31690=>1000,31691=>1000,31692=>1000,31693=>1000,31694=>1000,31695=>1000,31696=>1000,31697=>1000,31698=>1000,31699=>1000,31700=>1000,31701=>1000,31702=>1000,31703=>1000,31704=>1000,31705=>1000,31706=>1000,31707=>1000,31708=>1000,31709=>1000,31710=>1000,31711=>1000,31712=>1000,31713=>1000,31714=>1000,31715=>1000,31716=>1000,31717=>1000,31718=>1000,31719=>1000,31720=>1000,31721=>1000,31722=>1000,31723=>1000,31724=>1000,31725=>1000,31726=>1000,31727=>1000,31728=>1000,31729=>1000,31730=>1000,31731=>1000,31732=>1000,31733=>1000,31734=>1000,31735=>1000,31736=>1000,31737=>1000,31738=>1000,31739=>1000,31740=>1000,31741=>1000,31742=>1000,31743=>1000,31744=>1000,31745=>1000,31746=>1000,31747=>1000,31748=>1000,31749=>1000,31750=>1000,31751=>1000,31752=>1000,31753=>1000,31754=>1000,31755=>1000,31756=>1000,31757=>1000,31758=>1000,31759=>1000,31760=>1000,31761=>1000,31762=>1000,31763=>1000,31764=>1000,31765=>1000,31766=>1000,31767=>1000,31768=>1000,31769=>1000,31770=>1000,31771=>1000,31772=>1000,31773=>1000,31774=>1000,31775=>1000,31776=>1000,31777=>1000,31778=>1000,31779=>1000,31780=>1000,31781=>1000,31782=>1000,31783=>1000,31784=>1000,31785=>1000,31786=>1000,31787=>1000,31788=>1000,31789=>1000,31790=>1000,31791=>1000,31792=>1000,31793=>1000,31794=>1000,31795=>1000,31796=>1000,31797=>1000,31798=>1000,31799=>1000,31800=>1000,31801=>1000,31802=>1000,31803=>1000,31804=>1000,31805=>1000,31806=>1000,31807=>1000,31808=>1000,31809=>1000,31810=>1000,31811=>1000,31812=>1000,31813=>1000,31814=>1000,31815=>1000,31816=>1000,31817=>1000,31818=>1000,31819=>1000,31820=>1000,31821=>1000,31822=>1000,31823=>1000,31824=>1000,31825=>1000,31826=>1000,31827=>1000,31828=>1000,31829=>1000,31830=>1000,31831=>1000,31832=>1000,31833=>1000,31834=>1000,31835=>1000,31836=>1000,31837=>1000,31838=>1000,31839=>1000,31840=>1000,31841=>1000,31842=>1000,31843=>1000,31844=>1000,31845=>1000,31846=>1000,31847=>1000,31848=>1000,31849=>1000,31850=>1000,31851=>1000,31852=>1000,31853=>1000,31854=>1000,31855=>1000,31856=>1000,31857=>1000,31858=>1000,31859=>1000,31860=>1000,31861=>1000,31862=>1000,31863=>1000,31864=>1000,31865=>1000,31866=>1000,31867=>1000,31868=>1000,31869=>1000,31870=>1000,31871=>1000,31872=>1000,31873=>1000,31874=>1000,31875=>1000,31876=>1000,31877=>1000,31878=>1000,31879=>1000,31880=>1000,31881=>1000,31882=>1000,31883=>1000,31884=>1000,31885=>1000,31886=>1000,31887=>1000,31888=>1000,31889=>1000,31890=>1000,31891=>1000,31892=>1000,31893=>1000,31894=>1000,31895=>1000,31896=>1000,31897=>1000,31898=>1000,31899=>1000,31900=>1000,31901=>1000,31902=>1000,31903=>1000,31904=>1000,31905=>1000,31906=>1000,31907=>1000,31908=>1000,31909=>1000,31910=>1000,31911=>1000,31912=>1000,31913=>1000,31914=>1000,31915=>1000,31916=>1000,31917=>1000,31918=>1000,31919=>1000,31920=>1000,31921=>1000,31922=>1000,31923=>1000,31924=>1000,31925=>1000,31926=>1000,31927=>1000,31928=>1000,31929=>1000,31930=>1000,31931=>1000,31932=>1000,31933=>1000,31934=>1000,31935=>1000,31936=>1000,31937=>1000,31938=>1000,31939=>1000,31940=>1000,31941=>1000,31942=>1000,31943=>1000,31944=>1000,31945=>1000,31946=>1000,31947=>1000,31948=>1000,31949=>1000,31950=>1000,31951=>1000,31952=>1000,31953=>1000,31954=>1000,31955=>1000,31956=>1000,31957=>1000,31958=>1000,31959=>1000,31960=>1000,31961=>1000,31962=>1000,31963=>1000,31964=>1000,31965=>1000,31966=>1000,31967=>1000,31968=>1000,31969=>1000,31970=>1000,31971=>1000,31972=>1000,31973=>1000,31974=>1000,31975=>1000,31976=>1000,31977=>1000,31978=>1000,31979=>1000,31980=>1000,31981=>1000,31982=>1000,31983=>1000,31984=>1000,31985=>1000,31986=>1000,31987=>1000,31988=>1000,31989=>1000,31990=>1000,31991=>1000,31992=>1000,31993=>1000,31994=>1000,31995=>1000,31996=>1000,31997=>1000,31998=>1000,31999=>1000,32000=>1000,32001=>1000,32002=>1000,32003=>1000,32004=>1000,32005=>1000,32006=>1000,32007=>1000,32008=>1000,32009=>1000,32010=>1000,32011=>1000,32012=>1000,32013=>1000,32014=>1000,32015=>1000,32016=>1000,32017=>1000,32018=>1000,32019=>1000,32020=>1000,32021=>1000,32022=>1000,32023=>1000,32024=>1000,32025=>1000,32026=>1000,32027=>1000,32028=>1000,32029=>1000,32030=>1000,32031=>1000,32032=>1000,32033=>1000,32034=>1000,32035=>1000,32036=>1000,32037=>1000,32038=>1000,32039=>1000,32040=>1000,32041=>1000,32042=>1000,32043=>1000,32044=>1000,32045=>1000,32046=>1000,32047=>1000,32048=>1000,32049=>1000,32050=>1000,32051=>1000,32052=>1000,32053=>1000,32054=>1000,32055=>1000,32056=>1000,32057=>1000,32058=>1000,32059=>1000,32060=>1000,32061=>1000,32062=>1000,32063=>1000,32064=>1000,32065=>1000,32066=>1000,32067=>1000,32068=>1000,32069=>1000,32070=>1000,32071=>1000,32072=>1000,32073=>1000,32074=>1000,32075=>1000,32076=>1000,32077=>1000,32078=>1000,32079=>1000,32080=>1000,32081=>1000,32082=>1000,32083=>1000,32084=>1000,32085=>1000,32086=>1000,32087=>1000,32088=>1000,32089=>1000,32090=>1000,32091=>1000,32092=>1000,32093=>1000,32094=>1000,32095=>1000,32096=>1000,32097=>1000,32098=>1000,32099=>1000,32100=>1000,32101=>1000,32102=>1000,32103=>1000,32104=>1000,32105=>1000,32106=>1000,32107=>1000,32108=>1000,32109=>1000,32110=>1000,32111=>1000,32112=>1000,32113=>1000,32114=>1000,32115=>1000,32116=>1000,32117=>1000,32118=>1000,32119=>1000,32120=>1000,32121=>1000,32122=>1000,32123=>1000,32124=>1000,32125=>1000,32126=>1000,32127=>1000,32128=>1000,32129=>1000,32130=>1000,32131=>1000,32132=>1000,32133=>1000,32134=>1000,32135=>1000,32136=>1000,32137=>1000,32138=>1000,32139=>1000,32140=>1000,32141=>1000,32142=>1000,32143=>1000,32144=>1000,32145=>1000,32146=>1000,32147=>1000,32148=>1000,32149=>1000,32150=>1000,32151=>1000,32152=>1000,32153=>1000,32154=>1000,32155=>1000,32156=>1000,32157=>1000,32158=>1000,32159=>1000,32160=>1000,32161=>1000,32162=>1000,32163=>1000,32164=>1000,32165=>1000,32166=>1000,32167=>1000,32168=>1000,32169=>1000,32170=>1000,32171=>1000,32172=>1000,32173=>1000,32174=>1000,32175=>1000,32176=>1000,32177=>1000,32178=>1000,32179=>1000,32180=>1000,32181=>1000,32182=>1000,32183=>1000,32184=>1000,32185=>1000,32186=>1000,32187=>1000,32188=>1000,32189=>1000,32190=>1000,32191=>1000,32192=>1000,32193=>1000,32194=>1000,32195=>1000,32196=>1000,32197=>1000,32198=>1000,32199=>1000,32200=>1000,32201=>1000,32202=>1000,32203=>1000,32204=>1000,32205=>1000,32206=>1000,32207=>1000,32208=>1000,32209=>1000,32210=>1000,32211=>1000,32212=>1000,32213=>1000,32214=>1000,32215=>1000,32216=>1000,32217=>1000,32218=>1000,32219=>1000,32220=>1000,32221=>1000,32222=>1000,32223=>1000,32224=>1000,32225=>1000,32226=>1000,32227=>1000,32228=>1000,32229=>1000,32230=>1000,32231=>1000,32232=>1000,32233=>1000,32234=>1000,32235=>1000,32236=>1000,32237=>1000,32238=>1000,32239=>1000,32240=>1000,32241=>1000,32242=>1000,32243=>1000,32244=>1000,32245=>1000,32246=>1000,32247=>1000,32248=>1000,32249=>1000,32250=>1000,32251=>1000,32252=>1000,32253=>1000,32254=>1000,32255=>1000,32256=>1000,32257=>1000,32258=>1000,32259=>1000,32260=>1000,32261=>1000,32262=>1000,32263=>1000,32264=>1000,32265=>1000,32266=>1000,32267=>1000,32268=>1000,32269=>1000,32270=>1000,32271=>1000,32272=>1000,32273=>1000,32274=>1000,32275=>1000,32276=>1000,32277=>1000,32278=>1000,32279=>1000,32280=>1000,32281=>1000,32282=>1000,32283=>1000,32284=>1000,32285=>1000,32286=>1000,32287=>1000,32288=>1000,32289=>1000,32290=>1000,32291=>1000,32292=>1000,32293=>1000,32294=>1000,32295=>1000,32296=>1000,32297=>1000,32298=>1000,32299=>1000,32300=>1000,32301=>1000,32302=>1000,32303=>1000,32304=>1000,32305=>1000,32306=>1000,32307=>1000,32308=>1000,32309=>1000,32310=>1000,32311=>1000,32312=>1000,32313=>1000,32314=>1000,32315=>1000,32316=>1000,32317=>1000,32318=>1000,32319=>1000,32320=>1000,32321=>1000,32322=>1000,32323=>1000,32324=>1000,32325=>1000,32326=>1000,32327=>1000,32328=>1000,32329=>1000,32330=>1000,32331=>1000,32332=>1000,32333=>1000,32334=>1000,32335=>1000,32336=>1000,32337=>1000,32338=>1000,32339=>1000,32340=>1000,32341=>1000,32342=>1000,32343=>1000,32344=>1000,32345=>1000,32346=>1000,32347=>1000,32348=>1000,32349=>1000,32350=>1000,32351=>1000,32352=>1000,32353=>1000,32354=>1000,32355=>1000,32356=>1000,32357=>1000,32358=>1000,32359=>1000,32360=>1000,32361=>1000,32362=>1000,32363=>1000,32364=>1000,32365=>1000,32366=>1000,32367=>1000,32368=>1000,32369=>1000,32370=>1000,32371=>1000,32372=>1000,32373=>1000,32374=>1000,32375=>1000,32376=>1000,32377=>1000,32378=>1000,32379=>1000,32380=>1000,32381=>1000,32382=>1000,32383=>1000,32384=>1000,32385=>1000,32386=>1000,32387=>1000,32388=>1000,32389=>1000,32390=>1000,32391=>1000,32392=>1000,32393=>1000,32394=>1000,32395=>1000,32396=>1000,32397=>1000,32398=>1000,32399=>1000,32400=>1000,32401=>1000,32402=>1000,32403=>1000,32404=>1000,32405=>1000,32406=>1000,32407=>1000,32408=>1000,32409=>1000,32410=>1000,32411=>1000,32412=>1000,32413=>1000,32414=>1000,32415=>1000,32416=>1000,32417=>1000,32418=>1000,32419=>1000,32420=>1000,32421=>1000,32422=>1000,32423=>1000,32424=>1000,32425=>1000,32426=>1000,32427=>1000,32428=>1000,32429=>1000,32430=>1000,32431=>1000,32432=>1000,32433=>1000,32434=>1000,32435=>1000,32436=>1000,32437=>1000,32438=>1000,32439=>1000,32440=>1000,32441=>1000,32442=>1000,32443=>1000,32444=>1000,32445=>1000,32446=>1000,32447=>1000,32448=>1000,32449=>1000,32450=>1000,32451=>1000,32452=>1000,32453=>1000,32454=>1000,32455=>1000,32456=>1000,32457=>1000,32458=>1000,32459=>1000,32460=>1000,32461=>1000,32462=>1000,32463=>1000,32464=>1000,32465=>1000,32466=>1000,32467=>1000,32468=>1000,32469=>1000,32470=>1000,32471=>1000,32472=>1000,32473=>1000,32474=>1000,32475=>1000,32476=>1000,32477=>1000,32478=>1000,32479=>1000,32480=>1000,32481=>1000,32482=>1000,32483=>1000,32484=>1000,32485=>1000,32486=>1000,32487=>1000,32488=>1000,32489=>1000,32490=>1000,32491=>1000,32492=>1000,32493=>1000,32494=>1000,32495=>1000,32496=>1000,32497=>1000,32498=>1000,32499=>1000,32500=>1000,32501=>1000,32502=>1000,32503=>1000,32504=>1000,32505=>1000,32506=>1000,32507=>1000,32508=>1000,32509=>1000,32510=>1000,32511=>1000,32512=>1000,32513=>1000,32514=>1000,32515=>1000,32516=>1000,32517=>1000,32518=>1000,32519=>1000,32520=>1000,32521=>1000,32522=>1000,32523=>1000,32524=>1000,32525=>1000,32526=>1000,32527=>1000,32528=>1000,32529=>1000,32530=>1000,32531=>1000,32532=>1000,32533=>1000,32534=>1000,32535=>1000,32536=>1000,32537=>1000,32538=>1000,32539=>1000,32540=>1000,32541=>1000,32542=>1000,32543=>1000,32544=>1000,32545=>1000,32546=>1000,32547=>1000,32548=>1000,32549=>1000,32550=>1000,32551=>1000,32552=>1000,32553=>1000,32554=>1000,32555=>1000,32556=>1000,32557=>1000,32558=>1000,32559=>1000,32560=>1000,32561=>1000,32562=>1000,32563=>1000,32564=>1000,32565=>1000,32566=>1000,32567=>1000,32568=>1000,32569=>1000,32570=>1000,32571=>1000,32572=>1000,32573=>1000,32574=>1000,32575=>1000,32576=>1000,32577=>1000,32578=>1000,32579=>1000,32580=>1000,32581=>1000,32582=>1000,32583=>1000,32584=>1000,32585=>1000,32586=>1000,32587=>1000,32588=>1000,32589=>1000,32590=>1000,32591=>1000,32592=>1000,32593=>1000,32594=>1000,32595=>1000,32596=>1000,32597=>1000,32598=>1000,32599=>1000,32600=>1000,32601=>1000,32602=>1000,32603=>1000,32604=>1000,32605=>1000,32606=>1000,32607=>1000,32608=>1000,32609=>1000,32610=>1000,32611=>1000,32612=>1000,32613=>1000,32614=>1000,32615=>1000,32616=>1000,32617=>1000,32618=>1000,32619=>1000,32620=>1000,32621=>1000,32622=>1000,32623=>1000,32624=>1000,32625=>1000,32626=>1000,32627=>1000,32628=>1000,32629=>1000,32630=>1000,32631=>1000,32632=>1000,32633=>1000,32634=>1000,32635=>1000,32636=>1000,32637=>1000,32638=>1000,32639=>1000,32640=>1000,32641=>1000,32642=>1000,32643=>1000,32644=>1000,32645=>1000,32646=>1000,32647=>1000,32648=>1000,32649=>1000,32650=>1000,32651=>1000,32652=>1000,32653=>1000,32654=>1000,32655=>1000,32656=>1000,32657=>1000,32658=>1000,32659=>1000,32660=>1000,32661=>1000,32662=>1000,32663=>1000,32664=>1000,32665=>1000,32666=>1000,32667=>1000,32668=>1000,32669=>1000,32670=>1000,32671=>1000,32672=>1000,32673=>1000,32674=>1000,32675=>1000,32676=>1000,32677=>1000,32678=>1000,32679=>1000,32680=>1000,32681=>1000,32682=>1000,32683=>1000,32684=>1000,32685=>1000,32686=>1000,32687=>1000,32688=>1000,32689=>1000,32690=>1000,32691=>1000,32692=>1000,32693=>1000,32694=>1000,32695=>1000,32696=>1000,32697=>1000,32698=>1000,32699=>1000,32700=>1000,32701=>1000,32702=>1000,32703=>1000,32704=>1000,32705=>1000,32706=>1000,32707=>1000,32708=>1000,32709=>1000,32710=>1000,32711=>1000,32712=>1000,32713=>1000,32714=>1000,32715=>1000,32716=>1000,32717=>1000,32718=>1000,32719=>1000,32720=>1000,32721=>1000,32722=>1000,32723=>1000,32724=>1000,32725=>1000,32726=>1000,32727=>1000,32728=>1000,32729=>1000,32730=>1000,32731=>1000,32732=>1000,32733=>1000,32734=>1000,32735=>1000,32736=>1000,32737=>1000,32738=>1000,32739=>1000,32740=>1000,32741=>1000,32742=>1000,32743=>1000,32744=>1000,32745=>1000,32746=>1000,32747=>1000,32748=>1000,32749=>1000,32750=>1000,32751=>1000,32752=>1000,32753=>1000,32754=>1000,32755=>1000,32756=>1000,32757=>1000,32758=>1000,32759=>1000,32760=>1000,32761=>1000,32762=>1000,32763=>1000,32764=>1000,32765=>1000,32766=>1000,32767=>1000,32768=>1000,32769=>1000,32770=>1000,32771=>1000,32772=>1000,32773=>1000,32774=>1000,32775=>1000,32776=>1000,32777=>1000,32778=>1000,32779=>1000,32780=>1000,32781=>1000,32782=>1000,32783=>1000,32784=>1000,32785=>1000,32786=>1000,32787=>1000,32788=>1000,32789=>1000,32790=>1000,32791=>1000,32792=>1000,32793=>1000,32794=>1000,32795=>1000,32796=>1000,32797=>1000,32798=>1000,32799=>1000,32800=>1000,32801=>1000,32802=>1000,32803=>1000,32804=>1000,32805=>1000,32806=>1000,32807=>1000,32808=>1000,32809=>1000,32810=>1000,32811=>1000,32812=>1000,32813=>1000,32814=>1000,32815=>1000,32816=>1000,32817=>1000,32818=>1000,32819=>1000,32820=>1000,32821=>1000,32822=>1000,32823=>1000,32824=>1000,32825=>1000,32826=>1000,32827=>1000,32828=>1000,32829=>1000,32830=>1000,32831=>1000,32832=>1000,32833=>1000,32834=>1000,32835=>1000,32836=>1000,32837=>1000,32838=>1000,32839=>1000,32840=>1000,32841=>1000,32842=>1000,32843=>1000,32844=>1000,32845=>1000,32846=>1000,32847=>1000,32848=>1000,32849=>1000,32850=>1000,32851=>1000,32852=>1000,32853=>1000,32854=>1000,32855=>1000,32856=>1000,32857=>1000,32858=>1000,32859=>1000,32860=>1000,32861=>1000,32862=>1000,32863=>1000,32864=>1000,32865=>1000,32866=>1000,32867=>1000,32868=>1000,32869=>1000,32870=>1000,32871=>1000,32872=>1000,32873=>1000,32874=>1000,32875=>1000,32876=>1000,32877=>1000,32878=>1000,32879=>1000,32880=>1000,32881=>1000,32882=>1000,32883=>1000,32884=>1000,32885=>1000,32886=>1000,32887=>1000,32888=>1000,32889=>1000,32890=>1000,32891=>1000,32892=>1000,32893=>1000,32894=>1000,32895=>1000,32896=>1000,32897=>1000,32898=>1000,32899=>1000,32900=>1000,32901=>1000,32902=>1000,32903=>1000,32904=>1000,32905=>1000,32906=>1000,32907=>1000,32908=>1000,32909=>1000,32910=>1000,32911=>1000,32912=>1000,32913=>1000,32914=>1000,32915=>1000,32916=>1000,32917=>1000,32918=>1000,32919=>1000,32920=>1000,32921=>1000,32922=>1000,32923=>1000,32924=>1000,32925=>1000,32926=>1000,32927=>1000,32928=>1000,32929=>1000,32930=>1000,32931=>1000,32932=>1000,32933=>1000,32934=>1000,32935=>1000,32936=>1000,32937=>1000,32938=>1000,32939=>1000,32940=>1000,32941=>1000,32942=>1000,32943=>1000,32944=>1000,32945=>1000,32946=>1000,32947=>1000,32948=>1000,32949=>1000,32950=>1000,32951=>1000,32952=>1000,32953=>1000,32954=>1000,32955=>1000,32956=>1000,32957=>1000,32958=>1000,32959=>1000,32960=>1000,32961=>1000,32962=>1000,32963=>1000,32964=>1000,32965=>1000,32966=>1000,32967=>1000,32968=>1000,32969=>1000,32970=>1000,32971=>1000,32972=>1000,32973=>1000,32974=>1000,32975=>1000,32976=>1000,32977=>1000,32978=>1000,32979=>1000,32980=>1000,32981=>1000,32982=>1000,32983=>1000,32984=>1000,32985=>1000,32986=>1000,32987=>1000,32988=>1000,32989=>1000,32990=>1000,32991=>1000,32992=>1000,32993=>1000,32994=>1000,32995=>1000,32996=>1000,32997=>1000,32998=>1000,32999=>1000,33000=>1000,33001=>1000,33002=>1000,33003=>1000,33004=>1000,33005=>1000,33006=>1000,33007=>1000,33008=>1000,33009=>1000,33010=>1000,33011=>1000,33012=>1000,33013=>1000,33014=>1000,33015=>1000,33016=>1000,33017=>1000,33018=>1000,33019=>1000,33020=>1000,33021=>1000,33022=>1000,33023=>1000,33024=>1000,33025=>1000,33026=>1000,33027=>1000,33028=>1000,33029=>1000,33030=>1000,33031=>1000,33032=>1000,33033=>1000,33034=>1000,33035=>1000,33036=>1000,33037=>1000,33038=>1000,33039=>1000,33040=>1000,33041=>1000,33042=>1000,33043=>1000,33044=>1000,33045=>1000,33046=>1000,33047=>1000,33048=>1000,33049=>1000,33050=>1000,33051=>1000,33052=>1000,33053=>1000,33054=>1000,33055=>1000,33056=>1000,33057=>1000,33058=>1000,33059=>1000,33060=>1000,33061=>1000,33062=>1000,33063=>1000,33064=>1000,33065=>1000,33066=>1000,33067=>1000,33068=>1000,33069=>1000,33070=>1000,33071=>1000,33072=>1000,33073=>1000,33074=>1000,33075=>1000,33076=>1000,33077=>1000,33078=>1000,33079=>1000,33080=>1000,33081=>1000,33082=>1000,33083=>1000,33084=>1000,33085=>1000,33086=>1000,33087=>1000,33088=>1000,33089=>1000,33090=>1000,33091=>1000,33092=>1000,33093=>1000,33094=>1000,33095=>1000,33096=>1000,33097=>1000,33098=>1000,33099=>1000,33100=>1000,33101=>1000,33102=>1000,33103=>1000,33104=>1000,33105=>1000,33106=>1000,33107=>1000,33108=>1000,33109=>1000,33110=>1000,33111=>1000,33112=>1000,33113=>1000,33114=>1000,33115=>1000,33116=>1000,33117=>1000,33118=>1000,33119=>1000,33120=>1000,33121=>1000,33122=>1000,33123=>1000,33124=>1000,33125=>1000,33126=>1000,33127=>1000,33128=>1000,33129=>1000,33130=>1000,33131=>1000,33132=>1000,33133=>1000,33134=>1000,33135=>1000,33136=>1000,33137=>1000,33138=>1000,33139=>1000,33140=>1000,33141=>1000,33142=>1000,33143=>1000,33144=>1000,33145=>1000,33146=>1000,33147=>1000,33148=>1000,33149=>1000,33150=>1000,33151=>1000,33152=>1000,33153=>1000,33154=>1000,33155=>1000,33156=>1000,33157=>1000,33158=>1000,33159=>1000,33160=>1000,33161=>1000,33162=>1000,33163=>1000,33164=>1000,33165=>1000,33166=>1000,33167=>1000,33168=>1000,33169=>1000,33170=>1000,33171=>1000,33172=>1000,33173=>1000,33174=>1000,33175=>1000,33176=>1000,33177=>1000,33178=>1000,33179=>1000,33180=>1000,33181=>1000,33182=>1000,33183=>1000,33184=>1000,33185=>1000,33186=>1000,33187=>1000,33188=>1000,33189=>1000,33190=>1000,33191=>1000,33192=>1000,33193=>1000,33194=>1000,33195=>1000,33196=>1000,33197=>1000,33198=>1000,33199=>1000,33200=>1000,33201=>1000,33202=>1000,33203=>1000,33204=>1000,33205=>1000,33206=>1000,33207=>1000,33208=>1000,33209=>1000,33210=>1000,33211=>1000,33212=>1000,33213=>1000,33214=>1000,33215=>1000,33216=>1000,33217=>1000,33218=>1000,33219=>1000,33220=>1000,33221=>1000,33222=>1000,33223=>1000,33224=>1000,33225=>1000,33226=>1000,33227=>1000,33228=>1000,33229=>1000,33230=>1000,33231=>1000,33232=>1000,33233=>1000,33234=>1000,33235=>1000,33236=>1000,33237=>1000,33238=>1000,33239=>1000,33240=>1000,33241=>1000,33242=>1000,33243=>1000,33244=>1000,33245=>1000,33246=>1000,33247=>1000,33248=>1000,33249=>1000,33250=>1000,33251=>1000,33252=>1000,33253=>1000,33254=>1000,33255=>1000,33256=>1000,33257=>1000,33258=>1000,33259=>1000,33260=>1000,33261=>1000,33262=>1000,33263=>1000,33264=>1000,33265=>1000,33266=>1000,33267=>1000,33268=>1000,33269=>1000,33270=>1000,33271=>1000,33272=>1000,33273=>1000,33274=>1000,33275=>1000,33276=>1000,33277=>1000,33278=>1000,33279=>1000,33280=>1000,33281=>1000,33282=>1000,33283=>1000,33284=>1000,33285=>1000,33286=>1000,33287=>1000,33288=>1000,33289=>1000,33290=>1000,33291=>1000,33292=>1000,33293=>1000,33294=>1000,33295=>1000,33296=>1000,33297=>1000,33298=>1000,33299=>1000,33300=>1000,33301=>1000,33302=>1000,33303=>1000,33304=>1000,33305=>1000,33306=>1000,33307=>1000,33308=>1000,33309=>1000,33310=>1000,33311=>1000,33312=>1000,33313=>1000,33314=>1000,33315=>1000,33316=>1000,33317=>1000,33318=>1000,33319=>1000,33320=>1000,33321=>1000,33322=>1000,33323=>1000,33324=>1000,33325=>1000,33326=>1000,33327=>1000,33328=>1000,33329=>1000,33330=>1000,33331=>1000,33332=>1000,33333=>1000,33334=>1000,33335=>1000,33336=>1000,33337=>1000,33338=>1000,33339=>1000,33340=>1000,33341=>1000,33342=>1000,33343=>1000,33344=>1000,33345=>1000,33346=>1000,33347=>1000,33348=>1000,33349=>1000,33350=>1000,33351=>1000,33352=>1000,33353=>1000,33354=>1000,33355=>1000,33356=>1000,33357=>1000,33358=>1000,33359=>1000,33360=>1000,33361=>1000,33362=>1000,33363=>1000,33364=>1000,33365=>1000,33366=>1000,33367=>1000,33368=>1000,33369=>1000,33370=>1000,33371=>1000,33372=>1000,33373=>1000,33374=>1000,33375=>1000,33376=>1000,33377=>1000,33378=>1000,33379=>1000,33380=>1000,33381=>1000,33382=>1000,33383=>1000,33384=>1000,33385=>1000,33386=>1000,33387=>1000,33388=>1000,33389=>1000,33390=>1000,33391=>1000,33392=>1000,33393=>1000,33394=>1000,33395=>1000,33396=>1000,33397=>1000,33398=>1000,33399=>1000,33400=>1000,33401=>1000,33402=>1000,33403=>1000,33404=>1000,33405=>1000,33406=>1000,33407=>1000,33408=>1000,33409=>1000,33410=>1000,33411=>1000,33412=>1000,33413=>1000,33414=>1000,33415=>1000,33416=>1000,33417=>1000,33418=>1000,33419=>1000,33420=>1000,33421=>1000,33422=>1000,33423=>1000,33424=>1000,33425=>1000,33426=>1000,33427=>1000,33428=>1000,33429=>1000,33430=>1000,33431=>1000,33432=>1000,33433=>1000,33434=>1000,33435=>1000,33436=>1000,33437=>1000,33438=>1000,33439=>1000,33440=>1000,33441=>1000,33442=>1000,33443=>1000,33444=>1000,33445=>1000,33446=>1000,33447=>1000,33448=>1000,33449=>1000,33450=>1000,33451=>1000,33452=>1000,33453=>1000,33454=>1000,33455=>1000,33456=>1000,33457=>1000,33458=>1000,33459=>1000,33460=>1000,33461=>1000,33462=>1000,33463=>1000,33464=>1000,33465=>1000,33466=>1000,33467=>1000,33468=>1000,33469=>1000,33470=>1000,33471=>1000,33472=>1000,33473=>1000,33474=>1000,33475=>1000,33476=>1000,33477=>1000,33478=>1000,33479=>1000,33480=>1000,33481=>1000,33482=>1000,33483=>1000,33484=>1000,33485=>1000,33486=>1000,33487=>1000,33488=>1000,33489=>1000,33490=>1000,33491=>1000,33492=>1000,33493=>1000,33494=>1000,33495=>1000,33496=>1000,33497=>1000,33498=>1000,33499=>1000,33500=>1000,33501=>1000,33502=>1000,33503=>1000,33504=>1000,33505=>1000,33506=>1000,33507=>1000,33508=>1000,33509=>1000,33510=>1000,33511=>1000,33512=>1000,33513=>1000,33514=>1000,33515=>1000,33516=>1000,33517=>1000,33518=>1000,33519=>1000,33520=>1000,33521=>1000,33522=>1000,33523=>1000,33524=>1000,33525=>1000,33526=>1000,33527=>1000,33528=>1000,33529=>1000,33530=>1000,33531=>1000,33532=>1000,33533=>1000,33534=>1000,33535=>1000,33536=>1000,33537=>1000,33538=>1000,33539=>1000,33540=>1000,33541=>1000,33542=>1000,33543=>1000,33544=>1000,33545=>1000,33546=>1000,33547=>1000,33548=>1000,33549=>1000,33550=>1000,33551=>1000,33552=>1000,33553=>1000,33554=>1000,33555=>1000,33556=>1000,33557=>1000,33558=>1000,33559=>1000,33560=>1000,33561=>1000,33562=>1000,33563=>1000,33564=>1000,33565=>1000,33566=>1000,33567=>1000,33568=>1000,33569=>1000,33570=>1000,33571=>1000,33572=>1000,33573=>1000,33574=>1000,33575=>1000,33576=>1000,33577=>1000,33578=>1000,33579=>1000,33580=>1000,33581=>1000,33582=>1000,33583=>1000,33584=>1000,33585=>1000,33586=>1000,33587=>1000,33588=>1000,33589=>1000,33590=>1000,33591=>1000,33592=>1000,33593=>1000,33594=>1000,33595=>1000,33596=>1000,33597=>1000,33598=>1000,33599=>1000,33600=>1000,33601=>1000,33602=>1000,33603=>1000,33604=>1000,33605=>1000,33606=>1000,33607=>1000,33608=>1000,33609=>1000,33610=>1000,33611=>1000,33612=>1000,33613=>1000,33614=>1000,33615=>1000,33616=>1000,33617=>1000,33618=>1000,33619=>1000,33620=>1000,33621=>1000,33622=>1000,33623=>1000,33624=>1000,33625=>1000,33626=>1000,33627=>1000,33628=>1000,33629=>1000,33630=>1000,33631=>1000,33632=>1000,33633=>1000,33634=>1000,33635=>1000,33636=>1000,33637=>1000,33638=>1000,33639=>1000,33640=>1000,33641=>1000,33642=>1000,33643=>1000,33644=>1000,33645=>1000,33646=>1000,33647=>1000,33648=>1000,33649=>1000,33650=>1000,33651=>1000,33652=>1000,33653=>1000,33654=>1000,33655=>1000,33656=>1000,33657=>1000,33658=>1000,33659=>1000,33660=>1000,33661=>1000,33662=>1000,33663=>1000,33664=>1000,33665=>1000,33666=>1000,33667=>1000,33668=>1000,33669=>1000,33670=>1000,33671=>1000,33672=>1000,33673=>1000,33674=>1000,33675=>1000,33676=>1000,33677=>1000,33678=>1000,33679=>1000,33680=>1000,33681=>1000,33682=>1000,33683=>1000,33684=>1000,33685=>1000,33686=>1000,33687=>1000,33688=>1000,33689=>1000,33690=>1000,33691=>1000,33692=>1000,33693=>1000,33694=>1000,33695=>1000,33696=>1000,33697=>1000,33698=>1000,33699=>1000,33700=>1000,33701=>1000,33702=>1000,33703=>1000,33704=>1000,33705=>1000,33706=>1000,33707=>1000,33708=>1000,33709=>1000,33710=>1000,33711=>1000,33712=>1000,33713=>1000,33714=>1000,33715=>1000,33716=>1000,33717=>1000,33718=>1000,33719=>1000,33720=>1000,33721=>1000,33722=>1000,33723=>1000,33724=>1000,33725=>1000,33726=>1000,33727=>1000,33728=>1000,33729=>1000,33730=>1000,33731=>1000,33732=>1000,33733=>1000,33734=>1000,33735=>1000,33736=>1000,33737=>1000,33738=>1000,33739=>1000,33740=>1000,33741=>1000,33742=>1000,33743=>1000,33744=>1000,33745=>1000,33746=>1000,33747=>1000,33748=>1000,33749=>1000,33750=>1000,33751=>1000,33752=>1000,33753=>1000,33754=>1000,33755=>1000,33756=>1000,33757=>1000,33758=>1000,33759=>1000,33760=>1000,33761=>1000,33762=>1000,33763=>1000,33764=>1000,33765=>1000,33766=>1000,33767=>1000,33768=>1000,33769=>1000,33770=>1000,33771=>1000,33772=>1000,33773=>1000,33774=>1000,33775=>1000,33776=>1000,33777=>1000,33778=>1000,33779=>1000,33780=>1000,33781=>1000,33782=>1000,33783=>1000,33784=>1000,33785=>1000,33786=>1000,33787=>1000,33788=>1000,33789=>1000,33790=>1000,33791=>1000,33792=>1000,33793=>1000,33794=>1000,33795=>1000,33796=>1000,33797=>1000,33798=>1000,33799=>1000,33800=>1000,33801=>1000,33802=>1000,33803=>1000,33804=>1000,33805=>1000,33806=>1000,33807=>1000,33808=>1000,33809=>1000,33810=>1000,33811=>1000,33812=>1000,33813=>1000,33814=>1000,33815=>1000,33816=>1000,33817=>1000,33818=>1000,33819=>1000,33820=>1000,33821=>1000,33822=>1000,33823=>1000,33824=>1000,33825=>1000,33826=>1000,33827=>1000,33828=>1000,33829=>1000,33830=>1000,33831=>1000,33832=>1000,33833=>1000,33834=>1000,33835=>1000,33836=>1000,33837=>1000,33838=>1000,33839=>1000,33840=>1000,33841=>1000,33842=>1000,33843=>1000,33844=>1000,33845=>1000,33846=>1000,33847=>1000,33848=>1000,33849=>1000,33850=>1000,33851=>1000,33852=>1000,33853=>1000,33854=>1000,33855=>1000,33856=>1000,33857=>1000,33858=>1000,33859=>1000,33860=>1000,33861=>1000,33862=>1000,33863=>1000,33864=>1000,33865=>1000,33866=>1000,33867=>1000,33868=>1000,33869=>1000,33870=>1000,33871=>1000,33872=>1000,33873=>1000,33874=>1000,33875=>1000,33876=>1000,33877=>1000,33878=>1000,33879=>1000,33880=>1000,33881=>1000,33882=>1000,33883=>1000,33884=>1000,33885=>1000,33886=>1000,33887=>1000,33888=>1000,33889=>1000,33890=>1000,33891=>1000,33892=>1000,33893=>1000,33894=>1000,33895=>1000,33896=>1000,33897=>1000,33898=>1000,33899=>1000,33900=>1000,33901=>1000,33902=>1000,33903=>1000,33904=>1000,33905=>1000,33906=>1000,33907=>1000,33908=>1000,33909=>1000,33910=>1000,33911=>1000,33912=>1000,33913=>1000,33914=>1000,33915=>1000,33916=>1000,33917=>1000,33918=>1000,33919=>1000,33920=>1000,33921=>1000,33922=>1000,33923=>1000,33924=>1000,33925=>1000,33926=>1000,33927=>1000,33928=>1000,33929=>1000,33930=>1000,33931=>1000,33932=>1000,33933=>1000,33934=>1000,33935=>1000,33936=>1000,33937=>1000,33938=>1000,33939=>1000,33940=>1000,33941=>1000,33942=>1000,33943=>1000,33944=>1000,33945=>1000,33946=>1000,33947=>1000,33948=>1000,33949=>1000,33950=>1000,33951=>1000,33952=>1000,33953=>1000,33954=>1000,33955=>1000,33956=>1000,33957=>1000,33958=>1000,33959=>1000,33960=>1000,33961=>1000,33962=>1000,33963=>1000,33964=>1000,33965=>1000,33966=>1000,33967=>1000,33968=>1000,33969=>1000,33970=>1000,33971=>1000,33972=>1000,33973=>1000,33974=>1000,33975=>1000,33976=>1000,33977=>1000,33978=>1000,33979=>1000,33980=>1000,33981=>1000,33982=>1000,33983=>1000,33984=>1000,33985=>1000,33986=>1000,33987=>1000,33988=>1000,33989=>1000,33990=>1000,33991=>1000,33992=>1000,33993=>1000,33994=>1000,33995=>1000,33996=>1000,33997=>1000,33998=>1000,33999=>1000,34000=>1000,34001=>1000,34002=>1000,34003=>1000,34004=>1000,34005=>1000,34006=>1000,34007=>1000,34008=>1000,34009=>1000,34010=>1000,34011=>1000,34012=>1000,34013=>1000,34014=>1000,34015=>1000,34016=>1000,34017=>1000,34018=>1000,34019=>1000,34020=>1000,34021=>1000,34022=>1000,34023=>1000,34024=>1000,34025=>1000,34026=>1000,34027=>1000,34028=>1000,34029=>1000,34030=>1000,34031=>1000,34032=>1000,34033=>1000,34034=>1000,34035=>1000,34036=>1000,34037=>1000,34038=>1000,34039=>1000,34040=>1000,34041=>1000,34042=>1000,34043=>1000,34044=>1000,34045=>1000,34046=>1000,34047=>1000,34048=>1000,34049=>1000,34050=>1000,34051=>1000,34052=>1000,34053=>1000,34054=>1000,34055=>1000,34056=>1000,34057=>1000,34058=>1000,34059=>1000,34060=>1000,34061=>1000,34062=>1000,34063=>1000,34064=>1000,34065=>1000,34066=>1000,34067=>1000,34068=>1000,34069=>1000,34070=>1000,34071=>1000,34072=>1000,34073=>1000,34074=>1000,34075=>1000,34076=>1000,34077=>1000,34078=>1000,34079=>1000,34080=>1000,34081=>1000,34082=>1000,34083=>1000,34084=>1000,34085=>1000,34086=>1000,34087=>1000,34088=>1000,34089=>1000,34090=>1000,34091=>1000,34092=>1000,34093=>1000,34094=>1000,34095=>1000,34096=>1000,34097=>1000,34098=>1000,34099=>1000,34100=>1000,34101=>1000,34102=>1000,34103=>1000,34104=>1000,34105=>1000,34106=>1000,34107=>1000,34108=>1000,34109=>1000,34110=>1000,34111=>1000,34112=>1000,34113=>1000,34114=>1000,34115=>1000,34116=>1000,34117=>1000,34118=>1000,34119=>1000,34120=>1000,34121=>1000,34122=>1000,34123=>1000,34124=>1000,34125=>1000,34126=>1000,34127=>1000,34128=>1000,34129=>1000,34130=>1000,34131=>1000,34132=>1000,34133=>1000,34134=>1000,34135=>1000,34136=>1000,34137=>1000,34138=>1000,34139=>1000,34140=>1000,34141=>1000,34142=>1000,34143=>1000,34144=>1000,34145=>1000,34146=>1000,34147=>1000,34148=>1000,34149=>1000,34150=>1000,34151=>1000,34152=>1000,34153=>1000,34154=>1000,34155=>1000,34156=>1000,34157=>1000,34158=>1000,34159=>1000,34160=>1000,34161=>1000,34162=>1000,34163=>1000,34164=>1000,34165=>1000,34166=>1000,34167=>1000,34168=>1000,34169=>1000,34170=>1000,34171=>1000,34172=>1000,34173=>1000,34174=>1000,34175=>1000,34176=>1000,34177=>1000,34178=>1000,34179=>1000,34180=>1000,34181=>1000,34182=>1000,34183=>1000,34184=>1000,34185=>1000,34186=>1000,34187=>1000,34188=>1000,34189=>1000,34190=>1000,34191=>1000,34192=>1000,34193=>1000,34194=>1000,34195=>1000,34196=>1000,34197=>1000,34198=>1000,34199=>1000,34200=>1000,34201=>1000,34202=>1000,34203=>1000,34204=>1000,34205=>1000,34206=>1000,34207=>1000,34208=>1000,34209=>1000,34210=>1000,34211=>1000,34212=>1000,34213=>1000,34214=>1000,34215=>1000,34216=>1000,34217=>1000,34218=>1000,34219=>1000,34220=>1000,34221=>1000,34222=>1000,34223=>1000,34224=>1000,34225=>1000,34226=>1000,34227=>1000,34228=>1000,34229=>1000,34230=>1000,34231=>1000,34232=>1000,34233=>1000,34234=>1000,34235=>1000,34236=>1000,34237=>1000,34238=>1000,34239=>1000,34240=>1000,34241=>1000,34242=>1000,34243=>1000,34244=>1000,34245=>1000,34246=>1000,34247=>1000,34248=>1000,34249=>1000,34250=>1000,34251=>1000,34252=>1000,34253=>1000,34254=>1000,34255=>1000,34256=>1000,34257=>1000,34258=>1000,34259=>1000,34260=>1000,34261=>1000,34262=>1000,34263=>1000,34264=>1000,34265=>1000,34266=>1000,34267=>1000,34268=>1000,34269=>1000,34270=>1000,34271=>1000,34272=>1000,34273=>1000,34274=>1000,34275=>1000,34276=>1000,34277=>1000,34278=>1000,34279=>1000,34280=>1000,34281=>1000,34282=>1000,34283=>1000,34284=>1000,34285=>1000,34286=>1000,34287=>1000,34288=>1000,34289=>1000,34290=>1000,34291=>1000,34292=>1000,34293=>1000,34294=>1000,34295=>1000,34296=>1000,34297=>1000,34298=>1000,34299=>1000,34300=>1000,34301=>1000,34302=>1000,34303=>1000,34304=>1000,34305=>1000,34306=>1000,34307=>1000,34308=>1000,34309=>1000,34310=>1000,34311=>1000,34312=>1000,34313=>1000,34314=>1000,34315=>1000,34316=>1000,34317=>1000,34318=>1000,34319=>1000,34320=>1000,34321=>1000,34322=>1000,34323=>1000,34324=>1000,34325=>1000,34326=>1000,34327=>1000,34328=>1000,34329=>1000,34330=>1000,34331=>1000,34332=>1000,34333=>1000,34334=>1000,34335=>1000,34336=>1000,34337=>1000,34338=>1000,34339=>1000,34340=>1000,34341=>1000,34342=>1000,34343=>1000,34344=>1000,34345=>1000,34346=>1000,34347=>1000,34348=>1000,34349=>1000,34350=>1000,34351=>1000,34352=>1000,34353=>1000,34354=>1000,34355=>1000,34356=>1000,34357=>1000,34358=>1000,34359=>1000,34360=>1000,34361=>1000,34362=>1000,34363=>1000,34364=>1000,34365=>1000,34366=>1000,34367=>1000,34368=>1000,34369=>1000,34370=>1000,34371=>1000,34372=>1000,34373=>1000,34374=>1000,34375=>1000,34376=>1000,34377=>1000,34378=>1000,34379=>1000,34380=>1000,34381=>1000,34382=>1000,34383=>1000,34384=>1000,34385=>1000,34386=>1000,34387=>1000,34388=>1000,34389=>1000,34390=>1000,34391=>1000,34392=>1000,34393=>1000,34394=>1000,34395=>1000,34396=>1000,34397=>1000,34398=>1000,34399=>1000,34400=>1000,34401=>1000,34402=>1000,34403=>1000,34404=>1000,34405=>1000,34406=>1000,34407=>1000,34408=>1000,34409=>1000,34410=>1000,34411=>1000,34412=>1000,34413=>1000,34414=>1000,34415=>1000,34416=>1000,34417=>1000,34418=>1000,34419=>1000,34420=>1000,34421=>1000,34422=>1000,34423=>1000,34424=>1000,34425=>1000,34426=>1000,34427=>1000,34428=>1000,34429=>1000,34430=>1000,34431=>1000,34432=>1000,34433=>1000,34434=>1000,34435=>1000,34436=>1000,34437=>1000,34438=>1000,34439=>1000,34440=>1000,34441=>1000,34442=>1000,34443=>1000,34444=>1000,34445=>1000,34446=>1000,34447=>1000,34448=>1000,34449=>1000,34450=>1000,34451=>1000,34452=>1000,34453=>1000,34454=>1000,34455=>1000,34456=>1000,34457=>1000,34458=>1000,34459=>1000,34460=>1000,34461=>1000,34462=>1000,34463=>1000,34464=>1000,34465=>1000,34466=>1000,34467=>1000,34468=>1000,34469=>1000,34470=>1000,34471=>1000,34472=>1000,34473=>1000,34474=>1000,34475=>1000,34476=>1000,34477=>1000,34478=>1000,34479=>1000,34480=>1000,34481=>1000,34482=>1000,34483=>1000,34484=>1000,34485=>1000,34486=>1000,34487=>1000,34488=>1000,34489=>1000,34490=>1000,34491=>1000,34492=>1000,34493=>1000,34494=>1000,34495=>1000,34496=>1000,34497=>1000,34498=>1000,34499=>1000,34500=>1000,34501=>1000,34502=>1000,34503=>1000,34504=>1000,34505=>1000,34506=>1000,34507=>1000,34508=>1000,34509=>1000,34510=>1000,34511=>1000,34512=>1000,34513=>1000,34514=>1000,34515=>1000,34516=>1000,34517=>1000,34518=>1000,34519=>1000,34520=>1000,34521=>1000,34522=>1000,34523=>1000,34524=>1000,34525=>1000,34526=>1000,34527=>1000,34528=>1000,34529=>1000,34530=>1000,34531=>1000,34532=>1000,34533=>1000,34534=>1000,34535=>1000,34536=>1000,34537=>1000,34538=>1000,34539=>1000,34540=>1000,34541=>1000,34542=>1000,34543=>1000,34544=>1000,34545=>1000,34546=>1000,34547=>1000,34548=>1000,34549=>1000,34550=>1000,34551=>1000,34552=>1000,34553=>1000,34554=>1000,34555=>1000,34556=>1000,34557=>1000,34558=>1000,34559=>1000,34560=>1000,34561=>1000,34562=>1000,34563=>1000,34564=>1000,34565=>1000,34566=>1000,34567=>1000,34568=>1000,34569=>1000,34570=>1000,34571=>1000,34572=>1000,34573=>1000,34574=>1000,34575=>1000,34576=>1000,34577=>1000,34578=>1000,34579=>1000,34580=>1000,34581=>1000,34582=>1000,34583=>1000,34584=>1000,34585=>1000,34586=>1000,34587=>1000,34588=>1000,34589=>1000,34590=>1000,34591=>1000,34592=>1000,34593=>1000,34594=>1000,34595=>1000,34596=>1000,34597=>1000,34598=>1000,34599=>1000,34600=>1000,34601=>1000,34602=>1000,34603=>1000,34604=>1000,34605=>1000,34606=>1000,34607=>1000,34608=>1000,34609=>1000,34610=>1000,34611=>1000,34612=>1000,34613=>1000,34614=>1000,34615=>1000,34616=>1000,34617=>1000,34618=>1000,34619=>1000,34620=>1000,34621=>1000,34622=>1000,34623=>1000,34624=>1000,34625=>1000,34626=>1000,34627=>1000,34628=>1000,34629=>1000,34630=>1000,34631=>1000,34632=>1000,34633=>1000,34634=>1000,34635=>1000,34636=>1000,34637=>1000,34638=>1000,34639=>1000,34640=>1000,34641=>1000,34642=>1000,34643=>1000,34644=>1000,34645=>1000,34646=>1000,34647=>1000,34648=>1000,34649=>1000,34650=>1000,34651=>1000,34652=>1000,34653=>1000,34654=>1000,34655=>1000,34656=>1000,34657=>1000,34658=>1000,34659=>1000,34660=>1000,34661=>1000,34662=>1000,34663=>1000,34664=>1000,34665=>1000,34666=>1000,34667=>1000,34668=>1000,34669=>1000,34670=>1000,34671=>1000,34672=>1000,34673=>1000,34674=>1000,34675=>1000,34676=>1000,34677=>1000,34678=>1000,34679=>1000,34680=>1000,34681=>1000,34682=>1000,34683=>1000,34684=>1000,34685=>1000,34686=>1000,34687=>1000,34688=>1000,34689=>1000,34690=>1000,34691=>1000,34692=>1000,34693=>1000,34694=>1000,34695=>1000,34696=>1000,34697=>1000,34698=>1000,34699=>1000,34700=>1000,34701=>1000,34702=>1000,34703=>1000,34704=>1000,34705=>1000,34706=>1000,34707=>1000,34708=>1000,34709=>1000,34710=>1000,34711=>1000,34712=>1000,34713=>1000,34714=>1000,34715=>1000,34716=>1000,34717=>1000,34718=>1000,34719=>1000,34720=>1000,34721=>1000,34722=>1000,34723=>1000,34724=>1000,34725=>1000,34726=>1000,34727=>1000,34728=>1000,34729=>1000,34730=>1000,34731=>1000,34732=>1000,34733=>1000,34734=>1000,34735=>1000,34736=>1000,34737=>1000,34738=>1000,34739=>1000,34740=>1000,34741=>1000,34742=>1000,34743=>1000,34744=>1000,34745=>1000,34746=>1000,34747=>1000,34748=>1000,34749=>1000,34750=>1000,34751=>1000,34752=>1000,34753=>1000,34754=>1000,34755=>1000,34756=>1000,34757=>1000,34758=>1000,34759=>1000,34760=>1000,34761=>1000,34762=>1000,34763=>1000,34764=>1000,34765=>1000,34766=>1000,34767=>1000,34768=>1000,34769=>1000,34770=>1000,34771=>1000,34772=>1000,34773=>1000,34774=>1000,34775=>1000,34776=>1000,34777=>1000,34778=>1000,34779=>1000,34780=>1000,34781=>1000,34782=>1000,34783=>1000,34784=>1000,34785=>1000,34786=>1000,34787=>1000,34788=>1000,34789=>1000,34790=>1000,34791=>1000,34792=>1000,34793=>1000,34794=>1000,34795=>1000,34796=>1000,34797=>1000,34798=>1000,34799=>1000,34800=>1000,34801=>1000,34802=>1000,34803=>1000,34804=>1000,34805=>1000,34806=>1000,34807=>1000,34808=>1000,34809=>1000,34810=>1000,34811=>1000,34812=>1000,34813=>1000,34814=>1000,34815=>1000,34816=>1000,34817=>1000,34818=>1000,34819=>1000,34820=>1000,34821=>1000,34822=>1000,34823=>1000,34824=>1000,34825=>1000,34826=>1000,34827=>1000,34828=>1000,34829=>1000,34830=>1000,34831=>1000,34832=>1000,34833=>1000,34834=>1000,34835=>1000,34836=>1000,34837=>1000,34838=>1000,34839=>1000,34840=>1000,34841=>1000,34842=>1000,34843=>1000,34844=>1000,34845=>1000,34846=>1000,34847=>1000,34848=>1000,34849=>1000,34850=>1000,34851=>1000,34852=>1000,34853=>1000,34854=>1000,34855=>1000,34856=>1000,34857=>1000,34858=>1000,34859=>1000,34860=>1000,34861=>1000,34862=>1000,34863=>1000,34864=>1000,34865=>1000,34866=>1000,34867=>1000,34868=>1000,34869=>1000,34870=>1000,34871=>1000,34872=>1000,34873=>1000,34874=>1000,34875=>1000,34876=>1000,34877=>1000,34878=>1000,34879=>1000,34880=>1000,34881=>1000,34882=>1000,34883=>1000,34884=>1000,34885=>1000,34886=>1000,34887=>1000,34888=>1000,34889=>1000,34890=>1000,34891=>1000,34892=>1000,34893=>1000,34894=>1000,34895=>1000,34896=>1000,34897=>1000,34898=>1000,34899=>1000,34900=>1000,34901=>1000,34902=>1000,34903=>1000,34904=>1000,34905=>1000,34906=>1000,34907=>1000,34908=>1000,34909=>1000,34910=>1000,34911=>1000,34912=>1000,34913=>1000,34914=>1000,34915=>1000,34916=>1000,34917=>1000,34918=>1000,34919=>1000,34920=>1000,34921=>1000,34922=>1000,34923=>1000,34924=>1000,34925=>1000,34926=>1000,34927=>1000,34928=>1000,34929=>1000,34930=>1000,34931=>1000,34932=>1000,34933=>1000,34934=>1000,34935=>1000,34936=>1000,34937=>1000,34938=>1000,34939=>1000,34940=>1000,34941=>1000,34942=>1000,34943=>1000,34944=>1000,34945=>1000,34946=>1000,34947=>1000,34948=>1000,34949=>1000,34950=>1000,34951=>1000,34952=>1000,34953=>1000,34954=>1000,34955=>1000,34956=>1000,34957=>1000,34958=>1000,34959=>1000,34960=>1000,34961=>1000,34962=>1000,34963=>1000,34964=>1000,34965=>1000,34966=>1000,34967=>1000,34968=>1000,34969=>1000,34970=>1000,34971=>1000,34972=>1000,34973=>1000,34974=>1000,34975=>1000,34976=>1000,34977=>1000,34978=>1000,34979=>1000,34980=>1000,34981=>1000,34982=>1000,34983=>1000,34984=>1000,34985=>1000,34986=>1000,34987=>1000,34988=>1000,34989=>1000,34990=>1000,34991=>1000,34992=>1000,34993=>1000,34994=>1000,34995=>1000,34996=>1000,34997=>1000,34998=>1000,34999=>1000,35000=>1000,35001=>1000,35002=>1000,35003=>1000,35004=>1000,35005=>1000,35006=>1000,35007=>1000,35008=>1000,35009=>1000,35010=>1000,35011=>1000,35012=>1000,35013=>1000,35014=>1000,35015=>1000,35016=>1000,35017=>1000,35018=>1000,35019=>1000,35020=>1000,35021=>1000,35022=>1000,35023=>1000,35024=>1000,35025=>1000,35026=>1000,35027=>1000,35028=>1000,35029=>1000,35030=>1000,35031=>1000,35032=>1000,35033=>1000,35034=>1000,35035=>1000,35036=>1000,35037=>1000,35038=>1000,35039=>1000,35040=>1000,35041=>1000,35042=>1000,35043=>1000,35044=>1000,35045=>1000,35046=>1000,35047=>1000,35048=>1000,35049=>1000,35050=>1000,35051=>1000,35052=>1000,35053=>1000,35054=>1000,35055=>1000,35056=>1000,35057=>1000,35058=>1000,35059=>1000,35060=>1000,35061=>1000,35062=>1000,35063=>1000,35064=>1000,35065=>1000,35066=>1000,35067=>1000,35068=>1000,35069=>1000,35070=>1000,35071=>1000,35072=>1000,35073=>1000,35074=>1000,35075=>1000,35076=>1000,35077=>1000,35078=>1000,35079=>1000,35080=>1000,35081=>1000,35082=>1000,35083=>1000,35084=>1000,35085=>1000,35086=>1000,35087=>1000,35088=>1000,35089=>1000,35090=>1000,35091=>1000,35092=>1000,35093=>1000,35094=>1000,35095=>1000,35096=>1000,35097=>1000,35098=>1000,35099=>1000,35100=>1000,35101=>1000,35102=>1000,35103=>1000,35104=>1000,35105=>1000,35106=>1000,35107=>1000,35108=>1000,35109=>1000,35110=>1000,35111=>1000,35112=>1000,35113=>1000,35114=>1000,35115=>1000,35116=>1000,35117=>1000,35118=>1000,35119=>1000,35120=>1000,35121=>1000,35122=>1000,35123=>1000,35124=>1000,35125=>1000,35126=>1000,35127=>1000,35128=>1000,35129=>1000,35130=>1000,35131=>1000,35132=>1000,35133=>1000,35134=>1000,35135=>1000,35136=>1000,35137=>1000,35138=>1000,35139=>1000,35140=>1000,35141=>1000,35142=>1000,35143=>1000,35144=>1000,35145=>1000,35146=>1000,35147=>1000,35148=>1000,35149=>1000,35150=>1000,35151=>1000,35152=>1000,35153=>1000,35154=>1000,35155=>1000,35156=>1000,35157=>1000,35158=>1000,35159=>1000,35160=>1000,35161=>1000,35162=>1000,35163=>1000,35164=>1000,35165=>1000,35166=>1000,35167=>1000,35168=>1000,35169=>1000,35170=>1000,35171=>1000,35172=>1000,35173=>1000,35174=>1000,35175=>1000,35176=>1000,35177=>1000,35178=>1000,35179=>1000,35180=>1000,35181=>1000,35182=>1000,35183=>1000,35184=>1000,35185=>1000,35186=>1000,35187=>1000,35188=>1000,35189=>1000,35190=>1000,35191=>1000,35192=>1000,35193=>1000,35194=>1000,35195=>1000,35196=>1000,35197=>1000,35198=>1000,35199=>1000,35200=>1000,35201=>1000,35202=>1000,35203=>1000,35204=>1000,35205=>1000,35206=>1000,35207=>1000,35208=>1000,35209=>1000,35210=>1000,35211=>1000,35212=>1000,35213=>1000,35214=>1000,35215=>1000,35216=>1000,35217=>1000,35218=>1000,35219=>1000,35220=>1000,35221=>1000,35222=>1000,35223=>1000,35224=>1000,35225=>1000,35226=>1000,35227=>1000,35228=>1000,35229=>1000,35230=>1000,35231=>1000,35232=>1000,35233=>1000,35234=>1000,35235=>1000,35236=>1000,35237=>1000,35238=>1000,35239=>1000,35240=>1000,35241=>1000,35242=>1000,35243=>1000,35244=>1000,35245=>1000,35246=>1000,35247=>1000,35248=>1000,35249=>1000,35250=>1000,35251=>1000,35252=>1000,35253=>1000,35254=>1000,35255=>1000,35256=>1000,35257=>1000,35258=>1000,35259=>1000,35260=>1000,35261=>1000,35262=>1000,35263=>1000,35264=>1000,35265=>1000,35266=>1000,35267=>1000,35268=>1000,35269=>1000,35270=>1000,35271=>1000,35272=>1000,35273=>1000,35274=>1000,35275=>1000,35276=>1000,35277=>1000,35278=>1000,35279=>1000,35280=>1000,35281=>1000,35282=>1000,35283=>1000,35284=>1000,35285=>1000,35286=>1000,35287=>1000,35288=>1000,35289=>1000,35290=>1000,35291=>1000,35292=>1000,35293=>1000,35294=>1000,35295=>1000,35296=>1000,35297=>1000,35298=>1000,35299=>1000,35300=>1000,35301=>1000,35302=>1000,35303=>1000,35304=>1000,35305=>1000,35306=>1000,35307=>1000,35308=>1000,35309=>1000,35310=>1000,35311=>1000,35312=>1000,35313=>1000,35314=>1000,35315=>1000,35316=>1000,35317=>1000,35318=>1000,35319=>1000,35320=>1000,35321=>1000,35322=>1000,35323=>1000,35324=>1000,35325=>1000,35326=>1000,35327=>1000,35328=>1000,35329=>1000,35330=>1000,35331=>1000,35332=>1000,35333=>1000,35334=>1000,35335=>1000,35336=>1000,35337=>1000,35338=>1000,35339=>1000,35340=>1000,35341=>1000,35342=>1000,35343=>1000,35344=>1000,35345=>1000,35346=>1000,35347=>1000,35348=>1000,35349=>1000,35350=>1000,35351=>1000,35352=>1000,35353=>1000,35354=>1000,35355=>1000,35356=>1000,35357=>1000,35358=>1000,35359=>1000,35360=>1000,35361=>1000,35362=>1000,35363=>1000,35364=>1000,35365=>1000,35366=>1000,35367=>1000,35368=>1000,35369=>1000,35370=>1000,35371=>1000,35372=>1000,35373=>1000,35374=>1000,35375=>1000,35376=>1000,35377=>1000,35378=>1000,35379=>1000,35380=>1000,35381=>1000,35382=>1000,35383=>1000,35384=>1000,35385=>1000,35386=>1000,35387=>1000,35388=>1000,35389=>1000,35390=>1000,35391=>1000,35392=>1000,35393=>1000,35394=>1000,35395=>1000,35396=>1000,35397=>1000,35398=>1000,35399=>1000,35400=>1000,35401=>1000,35402=>1000,35403=>1000,35404=>1000,35405=>1000,35406=>1000,35407=>1000,35408=>1000,35409=>1000,35410=>1000,35411=>1000,35412=>1000,35413=>1000,35414=>1000,35415=>1000,35416=>1000,35417=>1000,35418=>1000,35419=>1000,35420=>1000,35421=>1000,35422=>1000,35423=>1000,35424=>1000,35425=>1000,35426=>1000,35427=>1000,35428=>1000,35429=>1000,35430=>1000,35431=>1000,35432=>1000,35433=>1000,35434=>1000,35435=>1000,35436=>1000,35437=>1000,35438=>1000,35439=>1000,35440=>1000,35441=>1000,35442=>1000,35443=>1000,35444=>1000,35445=>1000,35446=>1000,35447=>1000,35448=>1000,35449=>1000,35450=>1000,35451=>1000,35452=>1000,35453=>1000,35454=>1000,35455=>1000,35456=>1000,35457=>1000,35458=>1000,35459=>1000,35460=>1000,35461=>1000,35462=>1000,35463=>1000,35464=>1000,35465=>1000,35466=>1000,35467=>1000,35468=>1000,35469=>1000,35470=>1000,35471=>1000,35472=>1000,35473=>1000,35474=>1000,35475=>1000,35476=>1000,35477=>1000,35478=>1000,35479=>1000,35480=>1000,35481=>1000,35482=>1000,35483=>1000,35484=>1000,35485=>1000,35486=>1000,35487=>1000,35488=>1000,35489=>1000,35490=>1000,35491=>1000,35492=>1000,35493=>1000,35494=>1000,35495=>1000,35496=>1000,35497=>1000,35498=>1000,35499=>1000,35500=>1000,35501=>1000,35502=>1000,35503=>1000,35504=>1000,35505=>1000,35506=>1000,35507=>1000,35508=>1000,35509=>1000,35510=>1000,35511=>1000,35512=>1000,35513=>1000,35514=>1000,35515=>1000,35516=>1000,35517=>1000,35518=>1000,35519=>1000,35520=>1000,35521=>1000,35522=>1000,35523=>1000,35524=>1000,35525=>1000,35526=>1000,35527=>1000,35528=>1000,35529=>1000,35530=>1000,35531=>1000,35532=>1000,35533=>1000,35534=>1000,35535=>1000,35536=>1000,35537=>1000,35538=>1000,35539=>1000,35540=>1000,35541=>1000,35542=>1000,35543=>1000,35544=>1000,35545=>1000,35546=>1000,35547=>1000,35548=>1000,35549=>1000,35550=>1000,35551=>1000,35552=>1000,35553=>1000,35554=>1000,35555=>1000,35556=>1000,35557=>1000,35558=>1000,35559=>1000,35560=>1000,35561=>1000,35562=>1000,35563=>1000,35564=>1000,35565=>1000,35566=>1000,35567=>1000,35568=>1000,35569=>1000,35570=>1000,35571=>1000,35572=>1000,35573=>1000,35574=>1000,35575=>1000,35576=>1000,35577=>1000,35578=>1000,35579=>1000,35580=>1000,35581=>1000,35582=>1000,35583=>1000,35584=>1000,35585=>1000,35586=>1000,35587=>1000,35588=>1000,35589=>1000,35590=>1000,35591=>1000,35592=>1000,35593=>1000,35594=>1000,35595=>1000,35596=>1000,35597=>1000,35598=>1000,35599=>1000,35600=>1000,35601=>1000,35602=>1000,35603=>1000,35604=>1000,35605=>1000,35606=>1000,35607=>1000,35608=>1000,35609=>1000,35610=>1000,35611=>1000,35612=>1000,35613=>1000,35614=>1000,35615=>1000,35616=>1000,35617=>1000,35618=>1000,35619=>1000,35620=>1000,35621=>1000,35622=>1000,35623=>1000,35624=>1000,35625=>1000,35626=>1000,35627=>1000,35628=>1000,35629=>1000,35630=>1000,35631=>1000,35632=>1000,35633=>1000,35634=>1000,35635=>1000,35636=>1000,35637=>1000,35638=>1000,35639=>1000,35640=>1000,35641=>1000,35642=>1000,35643=>1000,35644=>1000,35645=>1000,35646=>1000,35647=>1000,35648=>1000,35649=>1000,35650=>1000,35651=>1000,35652=>1000,35653=>1000,35654=>1000,35655=>1000,35656=>1000,35657=>1000,35658=>1000,35659=>1000,35660=>1000,35661=>1000,35662=>1000,35663=>1000,35664=>1000,35665=>1000,35666=>1000,35667=>1000,35668=>1000,35669=>1000,35670=>1000,35671=>1000,35672=>1000,35673=>1000,35674=>1000,35675=>1000,35676=>1000,35677=>1000,35678=>1000,35679=>1000,35680=>1000,35681=>1000,35682=>1000,35683=>1000,35684=>1000,35685=>1000,35686=>1000,35687=>1000,35688=>1000,35689=>1000,35690=>1000,35691=>1000,35692=>1000,35693=>1000,35694=>1000,35695=>1000,35696=>1000,35697=>1000,35698=>1000,35699=>1000,35700=>1000,35701=>1000,35702=>1000,35703=>1000,35704=>1000,35705=>1000,35706=>1000,35707=>1000,35708=>1000,35709=>1000,35710=>1000,35711=>1000,35712=>1000,35713=>1000,35714=>1000,35715=>1000,35716=>1000,35717=>1000,35718=>1000,35719=>1000,35720=>1000,35721=>1000,35722=>1000,35723=>1000,35724=>1000,35725=>1000,35726=>1000,35727=>1000,35728=>1000,35729=>1000,35730=>1000,35731=>1000,35732=>1000,35733=>1000,35734=>1000,35735=>1000,35736=>1000,35737=>1000,35738=>1000,35739=>1000,35740=>1000,35741=>1000,35742=>1000,35743=>1000,35744=>1000,35745=>1000,35746=>1000,35747=>1000,35748=>1000,35749=>1000,35750=>1000,35751=>1000,35752=>1000,35753=>1000,35754=>1000,35755=>1000,35756=>1000,35757=>1000,35758=>1000,35759=>1000,35760=>1000,35761=>1000,35762=>1000,35763=>1000,35764=>1000,35765=>1000,35766=>1000,35767=>1000,35768=>1000,35769=>1000,35770=>1000,35771=>1000,35772=>1000,35773=>1000,35774=>1000,35775=>1000,35776=>1000,35777=>1000,35778=>1000,35779=>1000,35780=>1000,35781=>1000,35782=>1000,35783=>1000,35784=>1000,35785=>1000,35786=>1000,35787=>1000,35788=>1000,35789=>1000,35790=>1000,35791=>1000,35792=>1000,35793=>1000,35794=>1000,35795=>1000,35796=>1000,35797=>1000,35798=>1000,35799=>1000,35800=>1000,35801=>1000,35802=>1000,35803=>1000,35804=>1000,35805=>1000,35806=>1000,35807=>1000,35808=>1000,35809=>1000,35810=>1000,35811=>1000,35812=>1000,35813=>1000,35814=>1000,35815=>1000,35816=>1000,35817=>1000,35818=>1000,35819=>1000,35820=>1000,35821=>1000,35822=>1000,35823=>1000,35824=>1000,35825=>1000,35826=>1000,35827=>1000,35828=>1000,35829=>1000,35830=>1000,35831=>1000,35832=>1000,35833=>1000,35834=>1000,35835=>1000,35836=>1000,35837=>1000,35838=>1000,35839=>1000,35840=>1000,35841=>1000,35842=>1000,35843=>1000,35844=>1000,35845=>1000,35846=>1000,35847=>1000,35848=>1000,35849=>1000,35850=>1000,35851=>1000,35852=>1000,35853=>1000,35854=>1000,35855=>1000,35856=>1000,35857=>1000,35858=>1000,35859=>1000,35860=>1000,35861=>1000,35862=>1000,35863=>1000,35864=>1000,35865=>1000,35866=>1000,35867=>1000,35868=>1000,35869=>1000,35870=>1000,35871=>1000,35872=>1000,35873=>1000,35874=>1000,35875=>1000,35876=>1000,35877=>1000,35878=>1000,35879=>1000,35880=>1000,35881=>1000,35882=>1000,35883=>1000,35884=>1000,35885=>1000,35886=>1000,35887=>1000,35888=>1000,35889=>1000,35890=>1000,35891=>1000,35892=>1000,35893=>1000,35894=>1000,35895=>1000,35896=>1000,35897=>1000,35898=>1000,35899=>1000,35900=>1000,35901=>1000,35902=>1000,35903=>1000,35904=>1000,35905=>1000,35906=>1000,35907=>1000,35908=>1000,35909=>1000,35910=>1000,35911=>1000,35912=>1000,35913=>1000,35914=>1000,35915=>1000,35916=>1000,35917=>1000,35918=>1000,35919=>1000,35920=>1000,35921=>1000,35922=>1000,35923=>1000,35924=>1000,35925=>1000,35926=>1000,35927=>1000,35928=>1000,35929=>1000,35930=>1000,35931=>1000,35932=>1000,35933=>1000,35934=>1000,35935=>1000,35936=>1000,35937=>1000,35938=>1000,35939=>1000,35940=>1000,35941=>1000,35942=>1000,35943=>1000,35944=>1000,35945=>1000,35946=>1000,35947=>1000,35948=>1000,35949=>1000,35950=>1000,35951=>1000,35952=>1000,35953=>1000,35954=>1000,35955=>1000,35956=>1000,35957=>1000,35958=>1000,35959=>1000,35960=>1000,35961=>1000,35962=>1000,35963=>1000,35964=>1000,35965=>1000,35966=>1000,35967=>1000,35968=>1000,35969=>1000,35970=>1000,35971=>1000,35972=>1000,35973=>1000,35974=>1000,35975=>1000,35976=>1000,35977=>1000,35978=>1000,35979=>1000,35980=>1000,35981=>1000,35982=>1000,35983=>1000,35984=>1000,35985=>1000,35986=>1000,35987=>1000,35988=>1000,35989=>1000,35990=>1000,35991=>1000,35992=>1000,35993=>1000,35994=>1000,35995=>1000,35996=>1000,35997=>1000,35998=>1000,35999=>1000,36000=>1000,36001=>1000,36002=>1000,36003=>1000,36004=>1000,36005=>1000,36006=>1000,36007=>1000,36008=>1000,36009=>1000,36010=>1000,36011=>1000,36012=>1000,36013=>1000,36014=>1000,36015=>1000,36016=>1000,36017=>1000,36018=>1000,36019=>1000,36020=>1000,36021=>1000,36022=>1000,36023=>1000,36024=>1000,36025=>1000,36026=>1000,36027=>1000,36028=>1000,36029=>1000,36030=>1000,36031=>1000,36032=>1000,36033=>1000,36034=>1000,36035=>1000,36036=>1000,36037=>1000,36038=>1000,36039=>1000,36040=>1000,36041=>1000,36042=>1000,36043=>1000,36044=>1000,36045=>1000,36046=>1000,36047=>1000,36048=>1000,36049=>1000,36050=>1000,36051=>1000,36052=>1000,36053=>1000,36054=>1000,36055=>1000,36056=>1000,36057=>1000,36058=>1000,36059=>1000,36060=>1000,36061=>1000,36062=>1000,36063=>1000,36064=>1000,36065=>1000,36066=>1000,36067=>1000,36068=>1000,36069=>1000,36070=>1000,36071=>1000,36072=>1000,36073=>1000,36074=>1000,36075=>1000,36076=>1000,36077=>1000,36078=>1000,36079=>1000,36080=>1000,36081=>1000,36082=>1000,36083=>1000,36084=>1000,36085=>1000,36086=>1000,36087=>1000,36088=>1000,36089=>1000,36090=>1000,36091=>1000,36092=>1000,36093=>1000,36094=>1000,36095=>1000,36096=>1000,36097=>1000,36098=>1000,36099=>1000,36100=>1000,36101=>1000,36102=>1000,36103=>1000,36104=>1000,36105=>1000,36106=>1000,36107=>1000,36108=>1000,36109=>1000,36110=>1000,36111=>1000,36112=>1000,36113=>1000,36114=>1000,36115=>1000,36116=>1000,36117=>1000,36118=>1000,36119=>1000,36120=>1000,36121=>1000,36122=>1000,36123=>1000,36124=>1000,36125=>1000,36126=>1000,36127=>1000,36128=>1000,36129=>1000,36130=>1000,36131=>1000,36132=>1000,36133=>1000,36134=>1000,36135=>1000,36136=>1000,36137=>1000,36138=>1000,36139=>1000,36140=>1000,36141=>1000,36142=>1000,36143=>1000,36144=>1000,36145=>1000,36146=>1000,36147=>1000,36148=>1000,36149=>1000,36150=>1000,36151=>1000,36152=>1000,36153=>1000,36154=>1000,36155=>1000,36156=>1000,36157=>1000,36158=>1000,36159=>1000,36160=>1000,36161=>1000,36162=>1000,36163=>1000,36164=>1000,36165=>1000,36166=>1000,36167=>1000,36168=>1000,36169=>1000,36170=>1000,36171=>1000,36172=>1000,36173=>1000,36174=>1000,36175=>1000,36176=>1000,36177=>1000,36178=>1000,36179=>1000,36180=>1000,36181=>1000,36182=>1000,36183=>1000,36184=>1000,36185=>1000,36186=>1000,36187=>1000,36188=>1000,36189=>1000,36190=>1000,36191=>1000,36192=>1000,36193=>1000,36194=>1000,36195=>1000,36196=>1000,36197=>1000,36198=>1000,36199=>1000,36200=>1000,36201=>1000,36202=>1000,36203=>1000,36204=>1000,36205=>1000,36206=>1000,36207=>1000,36208=>1000,36209=>1000,36210=>1000,36211=>1000,36212=>1000,36213=>1000,36214=>1000,36215=>1000,36216=>1000,36217=>1000,36218=>1000,36219=>1000,36220=>1000,36221=>1000,36222=>1000,36223=>1000,36224=>1000,36225=>1000,36226=>1000,36227=>1000,36228=>1000,36229=>1000,36230=>1000,36231=>1000,36232=>1000,36233=>1000,36234=>1000,36235=>1000,36236=>1000,36237=>1000,36238=>1000,36239=>1000,36240=>1000,36241=>1000,36242=>1000,36243=>1000,36244=>1000,36245=>1000,36246=>1000,36247=>1000,36248=>1000,36249=>1000,36250=>1000,36251=>1000,36252=>1000,36253=>1000,36254=>1000,36255=>1000,36256=>1000,36257=>1000,36258=>1000,36259=>1000,36260=>1000,36261=>1000,36262=>1000,36263=>1000,36264=>1000,36265=>1000,36266=>1000,36267=>1000,36268=>1000,36269=>1000,36270=>1000,36271=>1000,36272=>1000,36273=>1000,36274=>1000,36275=>1000,36276=>1000,36277=>1000,36278=>1000,36279=>1000,36280=>1000,36281=>1000,36282=>1000,36283=>1000,36284=>1000,36285=>1000,36286=>1000,36287=>1000,36288=>1000,36289=>1000,36290=>1000,36291=>1000,36292=>1000,36293=>1000,36294=>1000,36295=>1000,36296=>1000,36297=>1000,36298=>1000,36299=>1000,36300=>1000,36301=>1000,36302=>1000,36303=>1000,36304=>1000,36305=>1000,36306=>1000,36307=>1000,36308=>1000,36309=>1000,36310=>1000,36311=>1000,36312=>1000,36313=>1000,36314=>1000,36315=>1000,36316=>1000,36317=>1000,36318=>1000,36319=>1000,36320=>1000,36321=>1000,36322=>1000,36323=>1000,36324=>1000,36325=>1000,36326=>1000,36327=>1000,36328=>1000,36329=>1000,36330=>1000,36331=>1000,36332=>1000,36333=>1000,36334=>1000,36335=>1000,36336=>1000,36337=>1000,36338=>1000,36339=>1000,36340=>1000,36341=>1000,36342=>1000,36343=>1000,36344=>1000,36345=>1000,36346=>1000,36347=>1000,36348=>1000,36349=>1000,36350=>1000,36351=>1000,36352=>1000,36353=>1000,36354=>1000,36355=>1000,36356=>1000,36357=>1000,36358=>1000,36359=>1000,36360=>1000,36361=>1000,36362=>1000,36363=>1000,36364=>1000,36365=>1000,36366=>1000,36367=>1000,36368=>1000,36369=>1000,36370=>1000,36371=>1000,36372=>1000,36373=>1000,36374=>1000,36375=>1000,36376=>1000,36377=>1000,36378=>1000,36379=>1000,36380=>1000,36381=>1000,36382=>1000,36383=>1000,36384=>1000,36385=>1000,36386=>1000,36387=>1000,36388=>1000,36389=>1000,36390=>1000,36391=>1000,36392=>1000,36393=>1000,36394=>1000,36395=>1000,36396=>1000,36397=>1000,36398=>1000,36399=>1000,36400=>1000,36401=>1000,36402=>1000,36403=>1000,36404=>1000,36405=>1000,36406=>1000,36407=>1000,36408=>1000,36409=>1000,36410=>1000,36411=>1000,36412=>1000,36413=>1000,36414=>1000,36415=>1000,36416=>1000,36417=>1000,36418=>1000,36419=>1000,36420=>1000,36421=>1000,36422=>1000,36423=>1000,36424=>1000,36425=>1000,36426=>1000,36427=>1000,36428=>1000,36429=>1000,36430=>1000,36431=>1000,36432=>1000,36433=>1000,36434=>1000,36435=>1000,36436=>1000,36437=>1000,36438=>1000,36439=>1000,36440=>1000,36441=>1000,36442=>1000,36443=>1000,36444=>1000,36445=>1000,36446=>1000,36447=>1000,36448=>1000,36449=>1000,36450=>1000,36451=>1000,36452=>1000,36453=>1000,36454=>1000,36455=>1000,36456=>1000,36457=>1000,36458=>1000,36459=>1000,36460=>1000,36461=>1000,36462=>1000,36463=>1000,36464=>1000,36465=>1000,36466=>1000,36467=>1000,36468=>1000,36469=>1000,36470=>1000,36471=>1000,36472=>1000,36473=>1000,36474=>1000,36475=>1000,36476=>1000,36477=>1000,36478=>1000,36479=>1000,36480=>1000,36481=>1000,36482=>1000,36483=>1000,36484=>1000,36485=>1000,36486=>1000,36487=>1000,36488=>1000,36489=>1000,36490=>1000,36491=>1000,36492=>1000,36493=>1000,36494=>1000,36495=>1000,36496=>1000,36497=>1000,36498=>1000,36499=>1000,36500=>1000,36501=>1000,36502=>1000,36503=>1000,36504=>1000,36505=>1000,36506=>1000,36507=>1000,36508=>1000,36509=>1000,36510=>1000,36511=>1000,36512=>1000,36513=>1000,36514=>1000,36515=>1000,36516=>1000,36517=>1000,36518=>1000,36519=>1000,36520=>1000,36521=>1000,36522=>1000,36523=>1000,36524=>1000,36525=>1000,36526=>1000,36527=>1000,36528=>1000,36529=>1000,36530=>1000,36531=>1000,36532=>1000,36533=>1000,36534=>1000,36535=>1000,36536=>1000,36537=>1000,36538=>1000,36539=>1000,36540=>1000,36541=>1000,36542=>1000,36543=>1000,36544=>1000,36545=>1000,36546=>1000,36547=>1000,36548=>1000,36549=>1000,36550=>1000,36551=>1000,36552=>1000,36553=>1000,36554=>1000,36555=>1000,36556=>1000,36557=>1000,36558=>1000,36559=>1000,36560=>1000,36561=>1000,36562=>1000,36563=>1000,36564=>1000,36565=>1000,36566=>1000,36567=>1000,36568=>1000,36569=>1000,36570=>1000,36571=>1000,36572=>1000,36573=>1000,36574=>1000,36575=>1000,36576=>1000,36577=>1000,36578=>1000,36579=>1000,36580=>1000,36581=>1000,36582=>1000,36583=>1000,36584=>1000,36585=>1000,36586=>1000,36587=>1000,36588=>1000,36589=>1000,36590=>1000,36591=>1000,36592=>1000,36593=>1000,36594=>1000,36595=>1000,36596=>1000,36597=>1000,36598=>1000,36599=>1000,36600=>1000,36601=>1000,36602=>1000,36603=>1000,36604=>1000,36605=>1000,36606=>1000,36607=>1000,36608=>1000,36609=>1000,36610=>1000,36611=>1000,36612=>1000,36613=>1000,36614=>1000,36615=>1000,36616=>1000,36617=>1000,36618=>1000,36619=>1000,36620=>1000,36621=>1000,36622=>1000,36623=>1000,36624=>1000,36625=>1000,36626=>1000,36627=>1000,36628=>1000,36629=>1000,36630=>1000,36631=>1000,36632=>1000,36633=>1000,36634=>1000,36635=>1000,36636=>1000,36637=>1000,36638=>1000,36639=>1000,36640=>1000,36641=>1000,36642=>1000,36643=>1000,36644=>1000,36645=>1000,36646=>1000,36647=>1000,36648=>1000,36649=>1000,36650=>1000,36651=>1000,36652=>1000,36653=>1000,36654=>1000,36655=>1000,36656=>1000,36657=>1000,36658=>1000,36659=>1000,36660=>1000,36661=>1000,36662=>1000,36663=>1000,36664=>1000,36665=>1000,36666=>1000,36667=>1000,36668=>1000,36669=>1000,36670=>1000,36671=>1000,36672=>1000,36673=>1000,36674=>1000,36675=>1000,36676=>1000,36677=>1000,36678=>1000,36679=>1000,36680=>1000,36681=>1000,36682=>1000,36683=>1000,36684=>1000,36685=>1000,36686=>1000,36687=>1000,36688=>1000,36689=>1000,36690=>1000,36691=>1000,36692=>1000,36693=>1000,36694=>1000,36695=>1000,36696=>1000,36697=>1000,36698=>1000,36699=>1000,36700=>1000,36701=>1000,36702=>1000,36703=>1000,36704=>1000,36705=>1000,36706=>1000,36707=>1000,36708=>1000,36709=>1000,36710=>1000,36711=>1000,36712=>1000,36713=>1000,36714=>1000,36715=>1000,36716=>1000,36717=>1000,36718=>1000,36719=>1000,36720=>1000,36721=>1000,36722=>1000,36723=>1000,36724=>1000,36725=>1000,36726=>1000,36727=>1000,36728=>1000,36729=>1000,36730=>1000,36731=>1000,36732=>1000,36733=>1000,36734=>1000,36735=>1000,36736=>1000,36737=>1000,36738=>1000,36739=>1000,36740=>1000,36741=>1000,36742=>1000,36743=>1000,36744=>1000,36745=>1000,36746=>1000,36747=>1000,36748=>1000,36749=>1000,36750=>1000,36751=>1000,36752=>1000,36753=>1000,36754=>1000,36755=>1000,36756=>1000,36757=>1000,36758=>1000,36759=>1000,36760=>1000,36761=>1000,36762=>1000,36763=>1000,36764=>1000,36765=>1000,36766=>1000,36767=>1000,36768=>1000,36769=>1000,36770=>1000,36771=>1000,36772=>1000,36773=>1000,36774=>1000,36775=>1000,36776=>1000,36777=>1000,36778=>1000,36779=>1000,36780=>1000,36781=>1000,36782=>1000,36783=>1000,36784=>1000,36785=>1000,36786=>1000,36787=>1000,36788=>1000,36789=>1000,36790=>1000,36791=>1000,36792=>1000,36793=>1000,36794=>1000,36795=>1000,36796=>1000,36797=>1000,36798=>1000,36799=>1000,36800=>1000,36801=>1000,36802=>1000,36803=>1000,36804=>1000,36805=>1000,36806=>1000,36807=>1000,36808=>1000,36809=>1000,36810=>1000,36811=>1000,36812=>1000,36813=>1000,36814=>1000,36815=>1000,36816=>1000,36817=>1000,36818=>1000,36819=>1000,36820=>1000,36821=>1000,36822=>1000,36823=>1000,36824=>1000,36825=>1000,36826=>1000,36827=>1000,36828=>1000,36829=>1000,36830=>1000,36831=>1000,36832=>1000,36833=>1000,36834=>1000,36835=>1000,36836=>1000,36837=>1000,36838=>1000,36839=>1000,36840=>1000,36841=>1000,36842=>1000,36843=>1000,36844=>1000,36845=>1000,36846=>1000,36847=>1000,36848=>1000,36849=>1000,36850=>1000,36851=>1000,36852=>1000,36853=>1000,36854=>1000,36855=>1000,36856=>1000,36857=>1000,36858=>1000,36859=>1000,36860=>1000,36861=>1000,36862=>1000,36863=>1000,36864=>1000,36865=>1000,36866=>1000,36867=>1000,36868=>1000,36869=>1000,36870=>1000,36871=>1000,36872=>1000,36873=>1000,36874=>1000,36875=>1000,36876=>1000,36877=>1000,36878=>1000,36879=>1000,36880=>1000,36881=>1000,36882=>1000,36883=>1000,36884=>1000,36885=>1000,36886=>1000,36887=>1000,36888=>1000,36889=>1000,36890=>1000,36891=>1000,36892=>1000,36893=>1000,36894=>1000,36895=>1000,36896=>1000,36897=>1000,36898=>1000,36899=>1000,36900=>1000,36901=>1000,36902=>1000,36903=>1000,36904=>1000,36905=>1000,36906=>1000,36907=>1000,36908=>1000,36909=>1000,36910=>1000,36911=>1000,36912=>1000,36913=>1000,36914=>1000,36915=>1000,36916=>1000,36917=>1000,36918=>1000,36919=>1000,36920=>1000,36921=>1000,36922=>1000,36923=>1000,36924=>1000,36925=>1000,36926=>1000,36927=>1000,36928=>1000,36929=>1000,36930=>1000,36931=>1000,36932=>1000,36933=>1000,36934=>1000,36935=>1000,36936=>1000,36937=>1000,36938=>1000,36939=>1000,36940=>1000,36941=>1000,36942=>1000,36943=>1000,36944=>1000,36945=>1000,36946=>1000,36947=>1000,36948=>1000,36949=>1000,36950=>1000,36951=>1000,36952=>1000,36953=>1000,36954=>1000,36955=>1000,36956=>1000,36957=>1000,36958=>1000,36959=>1000,36960=>1000,36961=>1000,36962=>1000,36963=>1000,36964=>1000,36965=>1000,36966=>1000,36967=>1000,36968=>1000,36969=>1000,36970=>1000,36971=>1000,36972=>1000,36973=>1000,36974=>1000,36975=>1000,36976=>1000,36977=>1000,36978=>1000,36979=>1000,36980=>1000,36981=>1000,36982=>1000,36983=>1000,36984=>1000,36985=>1000,36986=>1000,36987=>1000,36988=>1000,36989=>1000,36990=>1000,36991=>1000,36992=>1000,36993=>1000,36994=>1000,36995=>1000,36996=>1000,36997=>1000,36998=>1000,36999=>1000,37000=>1000,37001=>1000,37002=>1000,37003=>1000,37004=>1000,37005=>1000,37006=>1000,37007=>1000,37008=>1000,37009=>1000,37010=>1000,37011=>1000,37012=>1000,37013=>1000,37014=>1000,37015=>1000,37016=>1000,37017=>1000,37018=>1000,37019=>1000,37020=>1000,37021=>1000,37022=>1000,37023=>1000,37024=>1000,37025=>1000,37026=>1000,37027=>1000,37028=>1000,37029=>1000,37030=>1000,37031=>1000,37032=>1000,37033=>1000,37034=>1000,37035=>1000,37036=>1000,37037=>1000,37038=>1000,37039=>1000,37040=>1000,37041=>1000,37042=>1000,37043=>1000,37044=>1000,37045=>1000,37046=>1000,37047=>1000,37048=>1000,37049=>1000,37050=>1000,37051=>1000,37052=>1000,37053=>1000,37054=>1000,37055=>1000,37056=>1000,37057=>1000,37058=>1000,37059=>1000,37060=>1000,37061=>1000,37062=>1000,37063=>1000,37064=>1000,37065=>1000,37066=>1000,37067=>1000,37068=>1000,37069=>1000,37070=>1000,37071=>1000,37072=>1000,37073=>1000,37074=>1000,37075=>1000,37076=>1000,37077=>1000,37078=>1000,37079=>1000,37080=>1000,37081=>1000,37082=>1000,37083=>1000,37084=>1000,37085=>1000,37086=>1000,37087=>1000,37088=>1000,37089=>1000,37090=>1000,37091=>1000,37092=>1000,37093=>1000,37094=>1000,37095=>1000,37096=>1000,37097=>1000,37098=>1000,37099=>1000,37100=>1000,37101=>1000,37102=>1000,37103=>1000,37104=>1000,37105=>1000,37106=>1000,37107=>1000,37108=>1000,37109=>1000,37110=>1000,37111=>1000,37112=>1000,37113=>1000,37114=>1000,37115=>1000,37116=>1000,37117=>1000,37118=>1000,37119=>1000,37120=>1000,37121=>1000,37122=>1000,37123=>1000,37124=>1000,37125=>1000,37126=>1000,37127=>1000,37128=>1000,37129=>1000,37130=>1000,37131=>1000,37132=>1000,37133=>1000,37134=>1000,37135=>1000,37136=>1000,37137=>1000,37138=>1000,37139=>1000,37140=>1000,37141=>1000,37142=>1000,37143=>1000,37144=>1000,37145=>1000,37146=>1000,37147=>1000,37148=>1000,37149=>1000,37150=>1000,37151=>1000,37152=>1000,37153=>1000,37154=>1000,37155=>1000,37156=>1000,37157=>1000,37158=>1000,37159=>1000,37160=>1000,37161=>1000,37162=>1000,37163=>1000,37164=>1000,37165=>1000,37166=>1000,37167=>1000,37168=>1000,37169=>1000,37170=>1000,37171=>1000,37172=>1000,37173=>1000,37174=>1000,37175=>1000,37176=>1000,37177=>1000,37178=>1000,37179=>1000,37180=>1000,37181=>1000,37182=>1000,37183=>1000,37184=>1000,37185=>1000,37186=>1000,37187=>1000,37188=>1000,37189=>1000,37190=>1000,37191=>1000,37192=>1000,37193=>1000,37194=>1000,37195=>1000,37196=>1000,37197=>1000,37198=>1000,37199=>1000,37200=>1000,37201=>1000,37202=>1000,37203=>1000,37204=>1000,37205=>1000,37206=>1000,37207=>1000,37208=>1000,37209=>1000,37210=>1000,37211=>1000,37212=>1000,37213=>1000,37214=>1000,37215=>1000,37216=>1000,37217=>1000,37218=>1000,37219=>1000,37220=>1000,37221=>1000,37222=>1000,37223=>1000,37224=>1000,37225=>1000,37226=>1000,37227=>1000,37228=>1000,37229=>1000,37230=>1000,37231=>1000,37232=>1000,37233=>1000,37234=>1000,37235=>1000,37236=>1000,37237=>1000,37238=>1000,37239=>1000,37240=>1000,37241=>1000,37242=>1000,37243=>1000,37244=>1000,37245=>1000,37246=>1000,37247=>1000,37248=>1000,37249=>1000,37250=>1000,37251=>1000,37252=>1000,37253=>1000,37254=>1000,37255=>1000,37256=>1000,37257=>1000,37258=>1000,37259=>1000,37260=>1000,37261=>1000,37262=>1000,37263=>1000,37264=>1000,37265=>1000,37266=>1000,37267=>1000,37268=>1000,37269=>1000,37270=>1000,37271=>1000,37272=>1000,37273=>1000,37274=>1000,37275=>1000,37276=>1000,37277=>1000,37278=>1000,37279=>1000,37280=>1000,37281=>1000,37282=>1000,37283=>1000,37284=>1000,37285=>1000,37286=>1000,37287=>1000,37288=>1000,37289=>1000,37290=>1000,37291=>1000,37292=>1000,37293=>1000,37294=>1000,37295=>1000,37296=>1000,37297=>1000,37298=>1000,37299=>1000,37300=>1000,37301=>1000,37302=>1000,37303=>1000,37304=>1000,37305=>1000,37306=>1000,37307=>1000,37308=>1000,37309=>1000,37310=>1000,37311=>1000,37312=>1000,37313=>1000,37314=>1000,37315=>1000,37316=>1000,37317=>1000,37318=>1000,37319=>1000,37320=>1000,37321=>1000,37322=>1000,37323=>1000,37324=>1000,37325=>1000,37326=>1000,37327=>1000,37328=>1000,37329=>1000,37330=>1000,37331=>1000,37332=>1000,37333=>1000,37334=>1000,37335=>1000,37336=>1000,37337=>1000,37338=>1000,37339=>1000,37340=>1000,37341=>1000,37342=>1000,37343=>1000,37344=>1000,37345=>1000,37346=>1000,37347=>1000,37348=>1000,37349=>1000,37350=>1000,37351=>1000,37352=>1000,37353=>1000,37354=>1000,37355=>1000,37356=>1000,37357=>1000,37358=>1000,37359=>1000,37360=>1000,37361=>1000,37362=>1000,37363=>1000,37364=>1000,37365=>1000,37366=>1000,37367=>1000,37368=>1000,37369=>1000,37370=>1000,37371=>1000,37372=>1000,37373=>1000,37374=>1000,37375=>1000,37376=>1000,37377=>1000,37378=>1000,37379=>1000,37380=>1000,37381=>1000,37382=>1000,37383=>1000,37384=>1000,37385=>1000,37386=>1000,37387=>1000,37388=>1000,37389=>1000,37390=>1000,37391=>1000,37392=>1000,37393=>1000,37394=>1000,37395=>1000,37396=>1000,37397=>1000,37398=>1000,37399=>1000,37400=>1000,37401=>1000,37402=>1000,37403=>1000,37404=>1000,37405=>1000,37406=>1000,37407=>1000,37408=>1000,37409=>1000,37410=>1000,37411=>1000,37412=>1000,37413=>1000,37414=>1000,37415=>1000,37416=>1000,37417=>1000,37418=>1000,37419=>1000,37420=>1000,37421=>1000,37422=>1000,37423=>1000,37424=>1000,37425=>1000,37426=>1000,37427=>1000,37428=>1000,37429=>1000,37430=>1000,37431=>1000,37432=>1000,37433=>1000,37434=>1000,37435=>1000,37436=>1000,37437=>1000,37438=>1000,37439=>1000,37440=>1000,37441=>1000,37442=>1000,37443=>1000,37444=>1000,37445=>1000,37446=>1000,37447=>1000,37448=>1000,37449=>1000,37450=>1000,37451=>1000,37452=>1000,37453=>1000,37454=>1000,37455=>1000,37456=>1000,37457=>1000,37458=>1000,37459=>1000,37460=>1000,37461=>1000,37462=>1000,37463=>1000,37464=>1000,37465=>1000,37466=>1000,37467=>1000,37468=>1000,37469=>1000,37470=>1000,37471=>1000,37472=>1000,37473=>1000,37474=>1000,37475=>1000,37476=>1000,37477=>1000,37478=>1000,37479=>1000,37480=>1000,37481=>1000,37482=>1000,37483=>1000,37484=>1000,37485=>1000,37486=>1000,37487=>1000,37488=>1000,37489=>1000,37490=>1000,37491=>1000,37492=>1000,37493=>1000,37494=>1000,37495=>1000,37496=>1000,37497=>1000,37498=>1000,37499=>1000,37500=>1000,37501=>1000,37502=>1000,37503=>1000,37504=>1000,37505=>1000,37506=>1000,37507=>1000,37508=>1000,37509=>1000,37510=>1000,37511=>1000,37512=>1000,37513=>1000,37514=>1000,37515=>1000,37516=>1000,37517=>1000,37518=>1000,37519=>1000,37520=>1000,37521=>1000,37522=>1000,37523=>1000,37524=>1000,37525=>1000,37526=>1000,37527=>1000,37528=>1000,37529=>1000,37530=>1000,37531=>1000,37532=>1000,37533=>1000,37534=>1000,37535=>1000,37536=>1000,37537=>1000,37538=>1000,37539=>1000,37540=>1000,37541=>1000,37542=>1000,37543=>1000,37544=>1000,37545=>1000,37546=>1000,37547=>1000,37548=>1000,37549=>1000,37550=>1000,37551=>1000,37552=>1000,37553=>1000,37554=>1000,37555=>1000,37556=>1000,37557=>1000,37558=>1000,37559=>1000,37560=>1000,37561=>1000,37562=>1000,37563=>1000,37564=>1000,37565=>1000,37566=>1000,37567=>1000,37568=>1000,37569=>1000,37570=>1000,37571=>1000,37572=>1000,37573=>1000,37574=>1000,37575=>1000,37576=>1000,37577=>1000,37578=>1000,37579=>1000,37580=>1000,37581=>1000,37582=>1000,37583=>1000,37584=>1000,37585=>1000,37586=>1000,37587=>1000,37588=>1000,37589=>1000,37590=>1000,37591=>1000,37592=>1000,37593=>1000,37594=>1000,37595=>1000,37596=>1000,37597=>1000,37598=>1000,37599=>1000,37600=>1000,37601=>1000,37602=>1000,37603=>1000,37604=>1000,37605=>1000,37606=>1000,37607=>1000,37608=>1000,37609=>1000,37610=>1000,37611=>1000,37612=>1000,37613=>1000,37614=>1000,37615=>1000,37616=>1000,37617=>1000,37618=>1000,37619=>1000,37620=>1000,37621=>1000,37622=>1000,37623=>1000,37624=>1000,37625=>1000,37626=>1000,37627=>1000,37628=>1000,37629=>1000,37630=>1000,37631=>1000,37632=>1000,37633=>1000,37634=>1000,37635=>1000,37636=>1000,37637=>1000,37638=>1000,37639=>1000,37640=>1000,37641=>1000,37642=>1000,37643=>1000,37644=>1000,37645=>1000,37646=>1000,37647=>1000,37648=>1000,37649=>1000,37650=>1000,37651=>1000,37652=>1000,37653=>1000,37654=>1000,37655=>1000,37656=>1000,37657=>1000,37658=>1000,37659=>1000,37660=>1000,37661=>1000,37662=>1000,37663=>1000,37664=>1000,37665=>1000,37666=>1000,37667=>1000,37668=>1000,37669=>1000,37670=>1000,37671=>1000,37672=>1000,37673=>1000,37674=>1000,37675=>1000,37676=>1000,37677=>1000,37678=>1000,37679=>1000,37680=>1000,37681=>1000,37682=>1000,37683=>1000,37684=>1000,37685=>1000,37686=>1000,37687=>1000,37688=>1000,37689=>1000,37690=>1000,37691=>1000,37692=>1000,37693=>1000,37694=>1000,37695=>1000,37696=>1000,37697=>1000,37698=>1000,37699=>1000,37700=>1000,37701=>1000,37702=>1000,37703=>1000,37704=>1000,37705=>1000,37706=>1000,37707=>1000,37708=>1000,37709=>1000,37710=>1000,37711=>1000,37712=>1000,37713=>1000,37714=>1000,37715=>1000,37716=>1000,37717=>1000,37718=>1000,37719=>1000,37720=>1000,37721=>1000,37722=>1000,37723=>1000,37724=>1000,37725=>1000,37726=>1000,37727=>1000,37728=>1000,37729=>1000,37730=>1000,37731=>1000,37732=>1000,37733=>1000,37734=>1000,37735=>1000,37736=>1000,37737=>1000,37738=>1000,37739=>1000,37740=>1000,37741=>1000,37742=>1000,37743=>1000,37744=>1000,37745=>1000,37746=>1000,37747=>1000,37748=>1000,37749=>1000,37750=>1000,37751=>1000,37752=>1000,37753=>1000,37754=>1000,37755=>1000,37756=>1000,37757=>1000,37758=>1000,37759=>1000,37760=>1000,37761=>1000,37762=>1000,37763=>1000,37764=>1000,37765=>1000,37766=>1000,37767=>1000,37768=>1000,37769=>1000,37770=>1000,37771=>1000,37772=>1000,37773=>1000,37774=>1000,37775=>1000,37776=>1000,37777=>1000,37778=>1000,37779=>1000,37780=>1000,37781=>1000,37782=>1000,37783=>1000,37784=>1000,37785=>1000,37786=>1000,37787=>1000,37788=>1000,37789=>1000,37790=>1000,37791=>1000,37792=>1000,37793=>1000,37794=>1000,37795=>1000,37796=>1000,37797=>1000,37798=>1000,37799=>1000,37800=>1000,37801=>1000,37802=>1000,37803=>1000,37804=>1000,37805=>1000,37806=>1000,37807=>1000,37808=>1000,37809=>1000,37810=>1000,37811=>1000,37812=>1000,37813=>1000,37814=>1000,37815=>1000,37816=>1000,37817=>1000,37818=>1000,37819=>1000,37820=>1000,37821=>1000,37822=>1000,37823=>1000,37824=>1000,37825=>1000,37826=>1000,37827=>1000,37828=>1000,37829=>1000,37830=>1000,37831=>1000,37832=>1000,37833=>1000,37834=>1000,37835=>1000,37836=>1000,37837=>1000,37838=>1000,37839=>1000,37840=>1000,37841=>1000,37842=>1000,37843=>1000,37844=>1000,37845=>1000,37846=>1000,37847=>1000,37848=>1000,37849=>1000,37850=>1000,37851=>1000,37852=>1000,37853=>1000,37854=>1000,37855=>1000,37856=>1000,37857=>1000,37858=>1000,37859=>1000,37860=>1000,37861=>1000,37862=>1000,37863=>1000,37864=>1000,37865=>1000,37866=>1000,37867=>1000,37868=>1000,37869=>1000,37870=>1000,37871=>1000,37872=>1000,37873=>1000,37874=>1000,37875=>1000,37876=>1000,37877=>1000,37878=>1000,37879=>1000,37880=>1000,37881=>1000,37882=>1000,37883=>1000,37884=>1000,37885=>1000,37886=>1000,37887=>1000,37888=>1000,37889=>1000,37890=>1000,37891=>1000,37892=>1000,37893=>1000,37894=>1000,37895=>1000,37896=>1000,37897=>1000,37898=>1000,37899=>1000,37900=>1000,37901=>1000,37902=>1000,37903=>1000,37904=>1000,37905=>1000,37906=>1000,37907=>1000,37908=>1000,37909=>1000,37910=>1000,37911=>1000,37912=>1000,37913=>1000,37914=>1000,37915=>1000,37916=>1000,37917=>1000,37918=>1000,37919=>1000,37920=>1000,37921=>1000,37922=>1000,37923=>1000,37924=>1000,37925=>1000,37926=>1000,37927=>998,37928=>1000,37929=>1000,37930=>1000,37931=>1000,37932=>1000,37933=>1000,37934=>1000,37935=>1000,37936=>1000,37937=>1000,37938=>1000,37939=>1000,37940=>1000,37941=>1000,37942=>1000,37943=>1000,37944=>1000,37945=>1000,37946=>1000,37947=>1000,37948=>1000,37949=>1000,37950=>1000,37951=>1000,37952=>1000,37953=>1000,37954=>1000,37955=>1000,37956=>1000,37957=>1000,37958=>1000,37959=>1000,37960=>1000,37961=>1000,37962=>1000,37963=>1000,37964=>1000,37965=>1000,37966=>1000,37967=>1000,37968=>1000,37969=>1000,37970=>1000,37971=>1000,37972=>1000,37973=>1000,37974=>1000,37975=>1000,37976=>1000,37977=>1000,37978=>1000,37979=>1000,37980=>1000,37981=>1000,37982=>1000,37983=>1000,37984=>1000,37985=>1000,37986=>1000,37987=>1000,37988=>1000,37989=>1000,37990=>1000,37991=>1000,37992=>1000,37993=>1000,37994=>1000,37995=>1000,37996=>1000,37997=>1000,37998=>1000,37999=>1000,38000=>1000,38001=>1000,38002=>1000,38003=>1000,38004=>1000,38005=>1000,38006=>1000,38007=>1000,38008=>1000,38009=>1000,38010=>1000,38011=>1000,38012=>1000,38013=>1000,38014=>1000,38015=>1000,38016=>1000,38017=>1000,38018=>1000,38019=>1000,38020=>1000,38021=>1000,38022=>1000,38023=>1000,38024=>1000,38025=>1000,38026=>1000,38027=>1000,38028=>1000,38029=>1000,38030=>1000,38031=>1000,38032=>1000,38033=>1000,38034=>1000,38035=>1000,38036=>1000,38037=>1000,38038=>1000,38039=>1000,38040=>1000,38041=>1000,38042=>1000,38043=>1000,38044=>1000,38045=>1000,38046=>1000,38047=>1000,38048=>1000,38049=>1000,38050=>1000,38051=>1000,38052=>1000,38053=>1000,38054=>1000,38055=>1000,38056=>1000,38057=>1000,38058=>1000,38059=>1000,38060=>1000,38061=>1000,38062=>1000,38063=>1000,38064=>1000,38065=>1000,38066=>1000,38067=>1000,38068=>1000,38069=>1000,38070=>1000,38071=>1000,38072=>1000,38073=>1000,38074=>1000,38075=>1000,38076=>1000,38077=>1000,38078=>1000,38079=>1000,38080=>1000,38081=>1000,38082=>1000,38083=>1000,38084=>1000,38085=>1000,38086=>1000,38087=>1000,38088=>1000,38089=>1000,38090=>1000,38091=>1000,38092=>1000,38093=>1000,38094=>1000,38095=>1000,38096=>1000,38097=>1000,38098=>1000,38099=>1000,38100=>1000,38101=>1000,38102=>1000,38103=>1000,38104=>1000,38105=>1000,38106=>1000,38107=>1000,38108=>1000,38109=>1000,38110=>1000,38111=>1000,38112=>1000,38113=>1000,38114=>1000,38115=>1000,38116=>1000,38117=>1000,38118=>1000,38119=>1000,38120=>1000,38121=>1000,38122=>1000,38123=>1000,38124=>1000,38125=>1000,38126=>1000,38127=>1000,38128=>1000,38129=>1000,38130=>1000,38131=>1000,38132=>1000,38133=>1000,38134=>1000,38135=>1000,38136=>1000,38137=>1000,38138=>1000,38139=>1000,38140=>1000,38141=>1000,38142=>1000,38143=>1000,38144=>1000,38145=>1000,38146=>1000,38147=>1000,38148=>1000,38149=>1000,38150=>1000,38151=>1000,38152=>1000,38153=>1000,38154=>1000,38155=>1000,38156=>1000,38157=>1000,38158=>1000,38159=>1000,38160=>1000,38161=>1000,38162=>1000,38163=>1000,38164=>1000,38165=>1000,38166=>1000,38167=>1000,38168=>1000,38169=>1000,38170=>1000,38171=>1000,38172=>1000,38173=>1000,38174=>1000,38175=>1000,38176=>1000,38177=>1000,38178=>1000,38179=>1000,38180=>1000,38181=>1000,38182=>1000,38183=>1000,38184=>1000,38185=>1000,38186=>1000,38187=>1000,38188=>1000,38189=>1000,38190=>1000,38191=>1000,38192=>1000,38193=>1000,38194=>1000,38195=>1000,38196=>1000,38197=>1000,38198=>1000,38199=>1000,38200=>1000,38201=>1000,38202=>1000,38203=>1000,38204=>1000,38205=>1000,38206=>1000,38207=>1000,38208=>1000,38209=>1000,38210=>1000,38211=>1000,38212=>1000,38213=>1000,38214=>1000,38215=>1000,38216=>1000,38217=>1000,38218=>1000,38219=>1000,38220=>1000,38221=>1000,38222=>1000,38223=>1000,38224=>1000,38225=>1000,38226=>1000,38227=>1000,38228=>1000,38229=>1000,38230=>1000,38231=>1000,38232=>1000,38233=>1000,38234=>1000,38235=>1000,38236=>1000,38237=>1000,38238=>1000,38239=>1000,38240=>1000,38241=>1000,38242=>1000,38243=>1000,38244=>1000,38245=>1000,38246=>1000,38247=>1000,38248=>1000,38249=>1000,38250=>1000,38251=>1000,38252=>1000,38253=>1000,38254=>1000,38255=>1000,38256=>1000,38257=>1000,38258=>1000,38259=>1000,38260=>1000,38261=>1000,38262=>1000,38263=>1000,38264=>1000,38265=>1000,38266=>1000,38267=>1000,38268=>1000,38269=>1000,38270=>1000,38271=>1000,38272=>1000,38273=>1000,38274=>1000,38275=>1000,38276=>1000,38277=>1000,38278=>1000,38279=>1000,38280=>1000,38281=>1000,38282=>1000,38283=>1000,38284=>1000,38285=>1000,38286=>1000,38287=>1000,38288=>1000,38289=>1000,38290=>1000,38291=>1000,38292=>1000,38293=>1000,38294=>1000,38295=>1000,38296=>1000,38297=>1000,38298=>1000,38299=>1000,38300=>1000,38301=>1000,38302=>1000,38303=>1000,38304=>1000,38305=>1000,38306=>1000,38307=>1000,38308=>1000,38309=>1000,38310=>1000,38311=>1000,38312=>1000,38313=>1000,38314=>1000,38315=>1000,38316=>1000,38317=>1000,38318=>1000,38319=>1000,38320=>1000,38321=>1000,38322=>1000,38323=>1000,38324=>1000,38325=>1000,38326=>1000,38327=>1000,38328=>1000,38329=>1000,38330=>1000,38331=>1000,38332=>1000,38333=>1000,38334=>1000,38335=>1000,38336=>1000,38337=>1000,38338=>1000,38339=>1000,38340=>1000,38341=>1000,38342=>1000,38343=>1000,38344=>1000,38345=>1000,38346=>1000,38347=>1000,38348=>1000,38349=>1000,38350=>1000,38351=>1000,38352=>1000,38353=>1000,38354=>1000,38355=>1000,38356=>1000,38357=>1000,38358=>1000,38359=>1000,38360=>1000,38361=>1000,38362=>1000,38363=>1000,38364=>1000,38365=>1000,38366=>1000,38367=>1000,38368=>1000,38369=>1000,38370=>1000,38371=>1000,38372=>1000,38373=>1000,38374=>1000,38375=>1000,38376=>1000,38377=>1000,38378=>1000,38379=>1000,38380=>1000,38381=>1000,38382=>1000,38383=>1000,38384=>1000,38385=>1000,38386=>1000,38387=>1000,38388=>1000,38389=>1000,38390=>1000,38391=>1000,38392=>1000,38393=>1000,38394=>1000,38395=>1000,38396=>1000,38397=>1000,38398=>1000,38399=>1000,38400=>1000,38401=>1000,38402=>1000,38403=>1000,38404=>1000,38405=>1000,38406=>1000,38407=>1000,38408=>1000,38409=>1000,38410=>1000,38411=>1000,38412=>1000,38413=>1000,38414=>1000,38415=>1000,38416=>1000,38417=>1000,38418=>1000,38419=>1000,38420=>1000,38421=>1000,38422=>1000,38423=>1000,38424=>1000,38425=>1000,38426=>1000,38427=>1000,38428=>1000,38429=>1000,38430=>1000,38431=>1000,38432=>1000,38433=>1000,38434=>1000,38435=>1000,38436=>1000,38437=>1000,38438=>1000,38439=>1000,38440=>1000,38441=>1000,38442=>1000,38443=>1000,38444=>1000,38445=>1000,38446=>1000,38447=>1000,38448=>1000,38449=>1000,38450=>1000,38451=>1000,38452=>1000,38453=>1000,38454=>1000,38455=>1000,38456=>1000,38457=>1000,38458=>1000,38459=>1000,38460=>1000,38461=>1000,38462=>1000,38463=>1000,38464=>1000,38465=>1000,38466=>1000,38467=>1000,38468=>1000,38469=>1000,38470=>1000,38471=>1000,38472=>1000,38473=>1000,38474=>1000,38475=>1000,38476=>1000,38477=>1000,38478=>1000,38479=>1000,38480=>1000,38481=>1000,38482=>1000,38483=>1000,38484=>1000,38485=>1000,38486=>1000,38487=>1000,38488=>1000,38489=>1000,38490=>1000,38491=>1000,38492=>1000,38493=>1000,38494=>1000,38495=>1000,38496=>1000,38497=>1000,38498=>1000,38499=>1000,38500=>1000,38501=>1000,38502=>1000,38503=>1000,38504=>1000,38505=>1000,38506=>1000,38507=>1000,38508=>1000,38509=>1000,38510=>1000,38511=>1000,38512=>1000,38513=>1000,38514=>1000,38515=>1000,38516=>1000,38517=>1000,38518=>1000,38519=>1000,38520=>1000,38521=>1000,38522=>1000,38523=>1000,38524=>1000,38525=>1000,38526=>1000,38527=>1000,38528=>1000,38529=>1000,38530=>1000,38531=>1000,38532=>1000,38533=>1000,38534=>1000,38535=>1000,38536=>1000,38537=>1000,38538=>1000,38539=>1000,38540=>1000,38541=>1000,38542=>1000,38543=>1000,38544=>1000,38545=>1000,38546=>1000,38547=>1000,38548=>1000,38549=>1000,38550=>1000,38551=>1000,38552=>1000,38553=>1000,38554=>1000,38555=>1000,38556=>1000,38557=>1000,38558=>1000,38559=>1000,38560=>1000,38561=>1000,38562=>1000,38563=>1000,38564=>1000,38565=>1000,38566=>1000,38567=>1000,38568=>1000,38569=>1000,38570=>1000,38571=>1000,38572=>1000,38573=>1000,38574=>1000,38575=>1000,38576=>1000,38577=>1000,38578=>1000,38579=>1000,38580=>1000,38581=>1000,38582=>1000,38583=>1000,38584=>1000,38585=>1000,38586=>1000,38587=>1000,38588=>1000,38589=>1000,38590=>1000,38591=>1000,38592=>1000,38593=>1000,38594=>1000,38595=>1000,38596=>1000,38597=>1000,38598=>1000,38599=>1000,38600=>1000,38601=>1000,38602=>1000,38603=>1000,38604=>1000,38605=>1000,38606=>1000,38607=>1000,38608=>1000,38609=>1000,38610=>1000,38611=>1000,38612=>1000,38613=>1000,38614=>1000,38615=>1000,38616=>1000,38617=>1000,38618=>1000,38619=>1000,38620=>1000,38621=>1000,38622=>1000,38623=>1000,38624=>1000,38625=>1000,38626=>1000,38627=>1000,38628=>1000,38629=>1000,38630=>1000,38631=>1000,38632=>1000,38633=>1000,38634=>1000,38635=>1000,38636=>1000,38637=>1000,38638=>1000,38639=>1000,38640=>1000,38641=>1000,38642=>1000,38643=>1000,38644=>1000,38645=>1000,38646=>1000,38647=>1000,38648=>1000,38649=>1000,38650=>1000,38651=>1000,38652=>1000,38653=>1000,38654=>1000,38655=>1000,38656=>1000,38657=>1000,38658=>1000,38659=>1000,38660=>1000,38661=>1000,38662=>1000,38663=>1000,38664=>1000,38665=>1000,38666=>1000,38667=>1000,38668=>1000,38669=>1000,38670=>1000,38671=>1000,38672=>1000,38673=>1000,38674=>1000,38675=>1000,38676=>1000,38677=>1000,38678=>1000,38679=>1000,38680=>1000,38681=>1000,38682=>1000,38683=>1000,38684=>1000,38685=>1000,38686=>1000,38687=>1000,38688=>1000,38689=>1000,38690=>1000,38691=>1000,38692=>1000,38693=>1000,38694=>1000,38695=>1000,38696=>1000,38697=>1000,38698=>1000,38699=>1000,38700=>1000,38701=>1000,38702=>1000,38703=>1000,38704=>1000,38705=>1000,38706=>1000,38707=>1000,38708=>1000,38709=>1000,38710=>1000,38711=>1000,38712=>1000,38713=>1000,38714=>1000,38715=>1000,38716=>1000,38717=>1000,38718=>1000,38719=>1000,38720=>1000,38721=>1000,38722=>1000,38723=>1000,38724=>1000,38725=>1000,38726=>1000,38727=>1000,38728=>1000,38729=>1000,38730=>1000,38731=>1000,38732=>1000,38733=>1000,38734=>1000,38735=>1000,38736=>1000,38737=>1000,38738=>1000,38739=>1000,38740=>1000,38741=>1000,38742=>1000,38743=>1000,38744=>1000,38745=>1000,38746=>1000,38747=>1000,38748=>1000,38749=>1000,38750=>1000,38751=>1000,38752=>1000,38753=>1000,38754=>1000,38755=>1000,38756=>1000,38757=>1000,38758=>1000,38759=>1000,38760=>1000,38761=>1000,38762=>1000,38763=>1000,38764=>1000,38765=>1000,38766=>1000,38767=>1000,38768=>1000,38769=>1000,38770=>1000,38771=>1000,38772=>1000,38773=>1000,38774=>1000,38775=>1000,38776=>1000,38777=>1000,38778=>1000,38779=>1000,38780=>1000,38781=>1000,38782=>1000,38783=>1000,38784=>1000,38785=>1000,38786=>1000,38787=>1000,38788=>1000,38789=>1000,38790=>1000,38791=>1000,38792=>1000,38793=>1000,38794=>1000,38795=>1000,38796=>1000,38797=>1000,38798=>1000,38799=>1000,38800=>1000,38801=>1000,38802=>1000,38803=>1000,38804=>1000,38805=>1000,38806=>1000,38807=>1000,38808=>1000,38809=>1000,38810=>1000,38811=>1000,38812=>1000,38813=>1000,38814=>1000,38815=>1000,38816=>1000,38817=>1000,38818=>1000,38819=>1000,38820=>1000,38821=>1000,38822=>1000,38823=>1000,38824=>1000,38825=>1000,38826=>1000,38827=>1000,38828=>1000,38829=>1000,38830=>1000,38831=>1000,38832=>1000,38833=>1000,38834=>1000,38835=>1000,38836=>1000,38837=>1000,38838=>1000,38839=>1000,38840=>1000,38841=>1000,38842=>1000,38843=>1000,38844=>1000,38845=>1000,38846=>1000,38847=>1000,38848=>1000,38849=>1000,38850=>1000,38851=>1000,38852=>1000,38853=>1000,38854=>1000,38855=>1000,38856=>1000,38857=>1000,38858=>1000,38859=>1000,38860=>1000,38861=>1000,38862=>1000,38863=>1000,38864=>1000,38865=>1000,38866=>1000,38867=>1000,38868=>1000,38869=>1000,38870=>1000,38871=>1000,38872=>1000,38873=>1000,38874=>1000,38875=>1000,38876=>1000,38877=>1000,38878=>1000,38879=>1000,38880=>1000,38881=>1000,38882=>1000,38883=>1000,38884=>1000,38885=>1000,38886=>1000,38887=>1000,38888=>1000,38889=>1000,38890=>1000,38891=>1000,38892=>1000,38893=>1000,38894=>1000,38895=>1000,38896=>1000,38897=>1000,38898=>1000,38899=>1000,38900=>1000,38901=>1000,38902=>1000,38903=>1000,38904=>1000,38905=>1000,38906=>1000,38907=>1000,38908=>1000,38909=>1000,38910=>1000,38911=>1000,38912=>1000,38913=>1000,38914=>1000,38915=>1000,38916=>1000,38917=>1000,38918=>1000,38919=>1000,38920=>1000,38921=>1000,38922=>1000,38923=>1000,38924=>1000,38925=>1000,38926=>1000,38927=>1000,38928=>1000,38929=>1000,38930=>1000,38931=>1000,38932=>1000,38933=>1000,38934=>1000,38935=>1000,38936=>1000,38937=>1000,38938=>1000,38939=>1000,38940=>1000,38941=>1000,38942=>1000,38943=>1000,38944=>1000,38945=>1000,38946=>1000,38947=>1000,38948=>1000,38949=>1000,38950=>1000,38951=>1000,38952=>1000,38953=>1000,38954=>1000,38955=>1000,38956=>1000,38957=>1000,38958=>1000,38959=>1000,38960=>1000,38961=>1000,38962=>1000,38963=>1000,38964=>1000,38965=>1000,38966=>1000,38967=>1000,38968=>1000,38969=>1000,38970=>1000,38971=>1000,38972=>1000,38973=>1000,38974=>1000,38975=>1000,38976=>1000,38977=>1000,38978=>1000,38979=>1000,38980=>1000,38981=>1000,38982=>1000,38983=>1000,38984=>1000,38985=>1000,38986=>1000,38987=>1000,38988=>1000,38989=>1000,38990=>1000,38991=>1000,38992=>1000,38993=>1000,38994=>1000,38995=>1000,38996=>1000,38997=>1000,38998=>1000,38999=>1000,39000=>1000,39001=>1000,39002=>1000,39003=>1000,39004=>1000,39005=>1000,39006=>1000,39007=>1000,39008=>1000,39009=>1000,39010=>1000,39011=>1000,39012=>1000,39013=>1000,39014=>1000,39015=>1000,39016=>1000,39017=>1000,39018=>1000,39019=>1000,39020=>1000,39021=>1000,39022=>1000,39023=>1000,39024=>1000,39025=>1000,39026=>1000,39027=>1000,39028=>1000,39029=>1000,39030=>1000,39031=>1000,39032=>1000,39033=>1000,39034=>1000,39035=>1000,39036=>1000,39037=>1000,39038=>1000,39039=>1000,39040=>1000,39041=>1000,39042=>1000,39043=>1000,39044=>1000,39045=>1000,39046=>1000,39047=>1000,39048=>1000,39049=>1000,39050=>1000,39051=>1000,39052=>1000,39053=>1000,39054=>1000,39055=>1000,39056=>1000,39057=>1000,39058=>1000,39059=>1000,39060=>1000,39061=>1000,39062=>1000,39063=>1000,39064=>1000,39065=>1000,39066=>1000,39067=>1000,39068=>1000,39069=>1000,39070=>1000,39071=>1000,39072=>1000,39073=>1000,39074=>1000,39075=>1000,39076=>1000,39077=>1000,39078=>1000,39079=>1000,39080=>1000,39081=>1000,39082=>1000,39083=>1000,39084=>1000,39085=>1000,39086=>1000,39087=>1000,39088=>1000,39089=>1000,39090=>1000,39091=>1000,39092=>1000,39093=>1000,39094=>1000,39095=>1000,39096=>1000,39097=>1000,39098=>1000,39099=>1000,39100=>1000,39101=>1000,39102=>1000,39103=>1000,39104=>1000,39105=>1000,39106=>1000,39107=>1000,39108=>1000,39109=>1000,39110=>1000,39111=>1000,39112=>1000,39113=>1000,39114=>1000,39115=>1000,39116=>1000,39117=>1000,39118=>1000,39119=>1000,39120=>1000,39121=>1000,39122=>1000,39123=>1000,39124=>1000,39125=>1000,39126=>1000,39127=>1000,39128=>1000,39129=>1000,39130=>1000,39131=>1000,39132=>1000,39133=>1000,39134=>1000,39135=>1000,39136=>1000,39137=>1000,39138=>1000,39139=>1000,39140=>1000,39141=>1000,39142=>1000,39143=>1000,39144=>1000,39145=>1000,39146=>1000,39147=>1000,39148=>1000,39149=>1000,39150=>1000,39151=>1000,39152=>1000,39153=>1000,39154=>1000,39155=>1000,39156=>1000,39157=>1000,39158=>1000,39159=>1000,39160=>1000,39161=>1000,39162=>1000,39163=>1000,39164=>1000,39165=>1000,39166=>1000,39167=>1000,39168=>1000,39169=>1000,39170=>1000,39171=>1000,39172=>1000,39173=>1000,39174=>1000,39175=>1000,39176=>1000,39177=>1000,39178=>1000,39179=>1000,39180=>1000,39181=>1000,39182=>1000,39183=>1000,39184=>1000,39185=>1000,39186=>1000,39187=>1000,39188=>1000,39189=>1000,39190=>1000,39191=>1000,39192=>1000,39193=>1000,39194=>1000,39195=>1000,39196=>1000,39197=>1000,39198=>1000,39199=>1000,39200=>1000,39201=>1000,39202=>1000,39203=>1000,39204=>1000,39205=>1000,39206=>1000,39207=>1000,39208=>1000,39209=>1000,39210=>1000,39211=>1000,39212=>1000,39213=>1000,39214=>1000,39215=>1000,39216=>1000,39217=>1000,39218=>1000,39219=>1000,39220=>1000,39221=>1000,39222=>1000,39223=>1000,39224=>1000,39225=>1000,39226=>1000,39227=>1000,39228=>1000,39229=>1000,39230=>1000,39231=>1000,39232=>1000,39233=>1000,39234=>1000,39235=>1000,39236=>1000,39237=>1000,39238=>1000,39239=>1000,39240=>1000,39241=>1000,39242=>1000,39243=>1000,39244=>1000,39245=>1000,39246=>1000,39247=>1000,39248=>1000,39249=>1000,39250=>1000,39251=>1000,39252=>1000,39253=>1000,39254=>1000,39255=>1000,39256=>1000,39257=>1000,39258=>1000,39259=>1000,39260=>1000,39261=>1000,39262=>1000,39263=>1000,39264=>1000,39265=>1000,39266=>1000,39267=>1000,39268=>1000,39269=>1000,39270=>1000,39271=>1000,39272=>1000,39273=>1000,39274=>1000,39275=>1000,39276=>1000,39277=>1000,39278=>1000,39279=>1000,39280=>1000,39281=>1000,39282=>1000,39283=>1000,39284=>1000,39285=>1000,39286=>1000,39287=>1000,39288=>1000,39289=>1000,39290=>1000,39291=>1000,39292=>1000,39293=>1000,39294=>1000,39295=>1000,39296=>1000,39297=>1000,39298=>1000,39299=>1000,39300=>1000,39301=>1000,39302=>1000,39303=>1000,39304=>1000,39305=>1000,39306=>1000,39307=>1000,39308=>1000,39309=>1000,39310=>1000,39311=>1000,39312=>1000,39313=>1000,39314=>1000,39315=>1000,39316=>1000,39317=>1000,39318=>1000,39319=>1000,39320=>1000,39321=>1000,39322=>1000,39323=>1000,39324=>1000,39325=>1000,39326=>1000,39327=>1000,39328=>1000,39329=>1000,39330=>1000,39331=>1000,39332=>1000,39333=>1000,39334=>1000,39335=>1000,39336=>1000,39337=>1000,39338=>1000,39339=>1000,39340=>1000,39341=>1000,39342=>1000,39343=>1000,39344=>1000,39345=>1000,39346=>1000,39347=>1000,39348=>1000,39349=>1000,39350=>1000,39351=>1000,39352=>1000,39353=>1000,39354=>1000,39355=>1000,39356=>1000,39357=>1000,39358=>1000,39359=>1000,39360=>1000,39361=>1000,39362=>1000,39363=>1000,39364=>1000,39365=>1000,39366=>1000,39367=>1000,39368=>1000,39369=>1000,39370=>1000,39371=>1000,39372=>1000,39373=>1000,39374=>1000,39375=>1000,39376=>1000,39377=>1000,39378=>1000,39379=>1000,39380=>1000,39381=>1000,39382=>1000,39383=>1000,39384=>1000,39385=>1000,39386=>1000,39387=>1000,39388=>1000,39389=>1000,39390=>1000,39391=>1000,39392=>1000,39393=>1000,39394=>1000,39395=>1000,39396=>1000,39397=>1000,39398=>1000,39399=>1000,39400=>1000,39401=>1000,39402=>1000,39403=>1000,39404=>1000,39405=>1000,39406=>1000,39407=>1000,39408=>1000,39409=>1000,39410=>1000,39411=>1000,39412=>1000,39413=>1000,39414=>1000,39415=>1000,39416=>1000,39417=>1000,39418=>1000,39419=>1000,39420=>1000,39421=>1000,39422=>1000,39423=>1000,39424=>1000,39425=>1000,39426=>1000,39427=>1000,39428=>1000,39429=>1000,39430=>1000,39431=>1000,39432=>1000,39433=>1000,39434=>1000,39435=>1000,39436=>1000,39437=>1000,39438=>1000,39439=>1000,39440=>1000,39441=>1000,39442=>1000,39443=>1000,39444=>1000,39445=>1000,39446=>1000,39447=>1000,39448=>1000,39449=>1000,39450=>1000,39451=>1000,39452=>1000,39453=>1000,39454=>1000,39455=>1000,39456=>1000,39457=>1000,39458=>1000,39459=>1000,39460=>1000,39461=>1000,39462=>1000,39463=>1000,39464=>1000,39465=>1000,39466=>1000,39467=>1000,39468=>1000,39469=>1000,39470=>1000,39471=>1000,39472=>1000,39473=>1000,39474=>1000,39475=>1000,39476=>1000,39477=>1000,39478=>1000,39479=>1000,39480=>1000,39481=>1000,39482=>1000,39483=>1000,39484=>1000,39485=>1000,39486=>1000,39487=>1000,39488=>1000,39489=>1000,39490=>1000,39491=>1000,39492=>1000,39493=>1000,39494=>1000,39495=>1000,39496=>1000,39497=>1000,39498=>1000,39499=>1000,39500=>1000,39501=>1000,39502=>1000,39503=>1000,39504=>1000,39505=>1000,39506=>1000,39507=>1000,39508=>1000,39509=>1000,39510=>1000,39511=>1000,39512=>1000,39513=>1000,39514=>1000,39515=>1000,39516=>1000,39517=>1000,39518=>1000,39519=>1000,39520=>1000,39521=>1000,39522=>1000,39523=>1000,39524=>1000,39525=>1000,39526=>1000,39527=>1000,39528=>1000,39529=>1000,39530=>1000,39531=>1000,39532=>1000,39533=>1000,39534=>1000,39535=>1000,39536=>1000,39537=>1000,39538=>1000,39539=>1000,39540=>1000,39541=>1000,39542=>1000,39543=>1000,39544=>1000,39545=>1000,39546=>1000,39547=>1000,39548=>1000,39549=>1000,39550=>1000,39551=>1000,39552=>1000,39553=>1000,39554=>1000,39555=>1000,39556=>1000,39557=>1000,39558=>1000,39559=>1000,39560=>1000,39561=>1000,39562=>1000,39563=>1000,39564=>1000,39565=>1000,39566=>1000,39567=>1000,39568=>1000,39569=>1000,39570=>1000,39571=>1000,39572=>1000,39573=>1000,39574=>1000,39575=>1000,39576=>1000,39577=>1000,39578=>1000,39579=>1000,39580=>1000,39581=>1000,39582=>1000,39583=>1000,39584=>1000,39585=>1000,39586=>1000,39587=>1000,39588=>1000,39589=>1000,39590=>1000,39591=>1000,39592=>1000,39593=>1000,39594=>1000,39595=>1000,39596=>1000,39597=>1000,39598=>1000,39599=>1000,39600=>1000,39601=>1000,39602=>1000,39603=>1000,39604=>1000,39605=>1000,39606=>1000,39607=>1000,39608=>1000,39609=>1000,39610=>1000,39611=>1000,39612=>1000,39613=>1000,39614=>1000,39615=>1000,39616=>1000,39617=>1000,39618=>1000,39619=>1000,39620=>1000,39621=>1000,39622=>1000,39623=>1000,39624=>1000,39625=>1000,39626=>1000,39627=>1000,39628=>1000,39629=>1000,39630=>1000,39631=>1000,39632=>1000,39633=>1000,39634=>1000,39635=>1000,39636=>1000,39637=>1000,39638=>1000,39639=>1000,39640=>1000,39641=>1000,39642=>1000,39643=>1000,39644=>1000,39645=>1000,39646=>1000,39647=>1000,39648=>1000,39649=>1000,39650=>1000,39651=>1000,39652=>1000,39653=>1000,39654=>1000,39655=>1000,39656=>1000,39657=>1000,39658=>1000,39659=>1000,39660=>1000,39661=>1000,39662=>1000,39663=>1000,39664=>1000,39665=>1000,39666=>1000,39667=>1000,39668=>1000,39669=>1000,39670=>1000,39671=>1000,39672=>1000,39673=>1000,39674=>1000,39675=>1000,39676=>1000,39677=>1000,39678=>1000,39679=>1000,39680=>1000,39681=>1000,39682=>1000,39683=>1000,39684=>1000,39685=>1000,39686=>1000,39687=>1000,39688=>1000,39689=>1000,39690=>1000,39691=>1000,39692=>1000,39693=>1000,39694=>1000,39695=>1000,39696=>1000,39697=>1000,39698=>1000,39699=>1000,39700=>1000,39701=>1000,39702=>1000,39703=>1000,39704=>1000,39705=>1000,39706=>1000,39707=>1000,39708=>1000,39709=>1000,39710=>1000,39711=>1000,39712=>1000,39713=>1000,39714=>1000,39715=>1000,39716=>1000,39717=>1000,39718=>1000,39719=>1000,39720=>1000,39721=>1000,39722=>1000,39723=>1000,39724=>1000,39725=>1000,39726=>1000,39727=>1000,39728=>1000,39729=>1000,39730=>1000,39731=>1000,39732=>1000,39733=>1000,39734=>1000,39735=>1000,39736=>1000,39737=>1000,39738=>1000,39739=>1000,39740=>1000,39741=>1000,39742=>1000,39743=>1000,39744=>1000,39745=>1000,39746=>1000,39747=>1000,39748=>1000,39749=>1000,39750=>1000,39751=>1000,39752=>1000,39753=>1000,39754=>1000,39755=>1000,39756=>1000,39757=>1000,39758=>1000,39759=>1000,39760=>1000,39761=>1000,39762=>1000,39763=>1000,39764=>1000,39765=>1000,39766=>1000,39767=>1000,39768=>1000,39769=>1000,39770=>1000,39771=>1000,39772=>1000,39773=>1000,39774=>1000,39775=>1000,39776=>1000,39777=>1000,39778=>1000,39779=>1000,39780=>1000,39781=>1000,39782=>1000,39783=>1000,39784=>1000,39785=>1000,39786=>1000,39787=>1000,39788=>1000,39789=>1000,39790=>1000,39791=>1000,39792=>1000,39793=>1000,39794=>1000,39795=>1000,39796=>1000,39797=>1000,39798=>1000,39799=>1000,39800=>1000,39801=>1000,39802=>1000,39803=>1000,39804=>1000,39805=>1000,39806=>1000,39807=>1000,39808=>1000,39809=>1000,39810=>1000,39811=>1000,39812=>1000,39813=>1000,39814=>1000,39815=>1000,39816=>1000,39817=>1000,39818=>1000,39819=>1000,39820=>1000,39821=>1000,39822=>1000,39823=>1000,39824=>1000,39825=>1000,39826=>1000,39827=>1000,39828=>1000,39829=>1000,39830=>1000,39831=>1000,39832=>1000,39833=>1000,39834=>1000,39835=>1000,39836=>1000,39837=>1000,39838=>1000,39839=>1000,39840=>1000,39841=>1000,39842=>1000,39843=>1000,39844=>1000,39845=>1000,39846=>1000,39847=>1000,39848=>1000,39849=>1000,39850=>1000,39851=>1000,39852=>1000,39853=>1000,39854=>1000,39855=>1000,39856=>1000,39857=>1000,39858=>1000,39859=>1000,39860=>1000,39861=>1000,39862=>1000,39863=>1000,39864=>1000,39865=>1000,39866=>1000,39867=>1000,39868=>1000,39869=>1000,39870=>1000,39871=>1000,39872=>1000,39873=>1000,39874=>1000,39875=>1000,39876=>1000,39877=>1000,39878=>1000,39879=>1000,39880=>1000,39881=>1000,39882=>1000,39883=>1000,39884=>1000,39885=>1000,39886=>1000,39887=>1000,39888=>1000,39889=>1000,39890=>1000,39891=>1000,39892=>1000,39893=>1000,39894=>1000,39895=>1000,39896=>1000,39897=>1000,39898=>1000,39899=>1000,39900=>1000,39901=>1000,39902=>1000,39903=>1000,39904=>1000,39905=>1000,39906=>1000,39907=>1000,39908=>1000,39909=>1000,39910=>1000,39911=>1000,39912=>1000,39913=>1000,39914=>1000,39915=>1000,39916=>1000,39917=>1000,39918=>1000,39919=>1000,39920=>1000,39921=>1000,39922=>1000,39923=>1000,39924=>1000,39925=>1000,39926=>1000,39927=>1000,39928=>1000,39929=>1000,39930=>1000,39931=>1000,39932=>1000,39933=>1000,39934=>1000,39935=>1000,39936=>1000,39937=>1000,39938=>1000,39939=>1000,39940=>1000,39941=>1000,39942=>1000,39943=>1000,39944=>1000,39945=>1000,39946=>1000,39947=>1000,39948=>1000,39949=>1000,39950=>1000,39951=>1000,39952=>1000,39953=>1000,39954=>1000,39955=>1000,39956=>1000,39957=>1000,39958=>1000,39959=>1000,39960=>1000,39961=>1000,39962=>1000,39963=>1000,39964=>1000,39965=>1000,39966=>1000,39967=>1000,39968=>1000,39969=>1000,39970=>1000,39971=>1000,39972=>1000,39973=>1000,39974=>1000,39975=>1000,39976=>1000,39977=>1000,39978=>1000,39979=>1000,39980=>1000,39981=>1000,39982=>1000,39983=>1000,39984=>1000,39985=>1000,39986=>1000,39987=>1000,39988=>1000,39989=>1000,39990=>1000,39991=>1000,39992=>1000,39993=>1000,39994=>1000,39995=>1000,39996=>1000,39997=>1000,39998=>1000,39999=>1000,40000=>1000,40001=>1000,40002=>1000,40003=>1000,40004=>1000,40005=>1000,40006=>1000,40007=>1000,40008=>1000,40009=>1000,40010=>1000,40011=>1000,40012=>1000,40013=>1000,40014=>1000,40015=>1000,40016=>1000,40017=>1000,40018=>1000,40019=>1000,40020=>1000,40021=>1000,40022=>1000,40023=>1000,40024=>1000,40025=>1000,40026=>1000,40027=>1000,40028=>1000,40029=>1000,40030=>1000,40031=>1000,40032=>1000,40033=>1000,40034=>1000,40035=>1000,40036=>1000,40037=>1000,40038=>1000,40039=>1000,40040=>1000,40041=>1000,40042=>1000,40043=>1000,40044=>1000,40045=>1000,40046=>1000,40047=>1000,40048=>1000,40049=>1000,40050=>1000,40051=>1000,40052=>1000,40053=>1000,40054=>1000,40055=>1000,40056=>1000,40057=>1000,40058=>1000,40059=>1000,40060=>1000,40061=>1000,40062=>1000,40063=>1000,40064=>1000,40065=>1000,40066=>1000,40067=>1000,40068=>1000,40069=>1000,40070=>1000,40071=>1000,40072=>1000,40073=>1000,40074=>1000,40075=>1000,40076=>1000,40077=>1000,40078=>1000,40079=>1000,40080=>1000,40081=>1000,40082=>1000,40083=>1000,40084=>1000,40085=>1000,40086=>1000,40087=>1000,40088=>1000,40089=>1000,40090=>1000,40091=>1000,40092=>1000,40093=>1000,40094=>1000,40095=>1000,40096=>1000,40097=>1000,40098=>1000,40099=>1000,40100=>1000,40101=>1000,40102=>1000,40103=>1000,40104=>1000,40105=>1000,40106=>1000,40107=>1000,40108=>1000,40109=>1000,40110=>1000,40111=>1000,40112=>1000,40113=>1000,40114=>1000,40115=>1000,40116=>1000,40117=>1000,40118=>1000,40119=>1000,40120=>1000,40121=>1000,40122=>1000,40123=>1000,40124=>1000,40125=>1000,40126=>1000,40127=>1000,40128=>1000,40129=>1000,40130=>1000,40131=>1000,40132=>1000,40133=>1000,40134=>1000,40135=>1000,40136=>1000,40137=>1000,40138=>1000,40139=>1000,40140=>1000,40141=>1000,40142=>1000,40143=>1000,40144=>1000,40145=>1000,40146=>1000,40147=>1000,40148=>1000,40149=>1000,40150=>1000,40151=>1000,40152=>1000,40153=>1000,40154=>1000,40155=>1000,40156=>1000,40157=>1000,40158=>1000,40159=>1000,40160=>1000,40161=>1000,40162=>1000,40163=>1000,40164=>1000,40165=>1000,40166=>1000,40167=>1000,40168=>1000,40169=>1000,40170=>1000,40171=>1000,40172=>1000,40173=>1000,40174=>1000,40175=>1000,40176=>1000,40177=>1000,40178=>1000,40179=>1000,40180=>1000,40181=>1000,40182=>1000,40183=>1000,40184=>1000,40185=>1000,40186=>1000,40187=>1000,40188=>1000,40189=>1000,40190=>1000,40191=>1000,40192=>1000,40193=>1000,40194=>1000,40195=>1000,40196=>1000,40197=>1000,40198=>1000,40199=>1000,40200=>1000,40201=>1000,40202=>1000,40203=>1000,40204=>1000,40205=>1000,40206=>1000,40207=>1000,40208=>1000,40209=>1000,40210=>1000,40211=>1000,40212=>1000,40213=>1000,40214=>1000,40215=>1000,40216=>1000,40217=>1000,40218=>1000,40219=>1000,40220=>1000,40221=>1000,40222=>1000,40223=>1000,40224=>1000,40225=>1000,40226=>1000,40227=>1000,40228=>1000,40229=>1000,40230=>1000,40231=>1000,40232=>1000,40233=>1000,40234=>1000,40235=>1000,40236=>1000,40237=>1000,40238=>1000,40239=>1000,40240=>1000,40241=>1000,40242=>1000,40243=>1000,40244=>1000,40245=>1000,40246=>1000,40247=>1000,40248=>1000,40249=>1000,40250=>1000,40251=>1000,40252=>1000,40253=>1000,40254=>1000,40255=>1000,40256=>1000,40257=>1000,40258=>1000,40259=>1000,40260=>1000,40261=>1000,40262=>1000,40263=>1000,40264=>1000,40265=>1000,40266=>1000,40267=>1000,40268=>1000,40269=>1000,40270=>1000,40271=>1000,40272=>1000,40273=>1000,40274=>1000,40275=>1000,40276=>1000,40277=>1000,40278=>1000,40279=>1000,40280=>1000,40281=>1000,40282=>1000,40283=>1000,40284=>1000,40285=>1000,40286=>1000,40287=>1000,40288=>1000,40289=>1000,40290=>1000,40291=>1000,40292=>1000,40293=>1000,40294=>1000,40295=>1000,40296=>1000,40297=>1000,40298=>1000,40299=>1000,40300=>1000,40301=>1000,40302=>1000,40303=>1000,40304=>1000,40305=>1000,40306=>1000,40307=>1000,40308=>1000,40309=>1000,40310=>1000,40311=>1000,40312=>1000,40313=>1000,40314=>1000,40315=>1000,40316=>1000,40317=>1000,40318=>1000,40319=>1000,40320=>1000,40321=>1000,40322=>1000,40323=>1000,40324=>1000,40325=>1000,40326=>1000,40327=>1000,40328=>1000,40329=>1000,40330=>1000,40331=>1000,40332=>1000,40333=>1000,40334=>1000,40335=>1000,40336=>1000,40337=>1000,40338=>1000,40339=>1000,40340=>1000,40341=>1000,40342=>1000,40343=>1000,40344=>1000,40345=>1000,40346=>1000,40347=>1000,40348=>1000,40349=>1000,40350=>1000,40351=>1000,40352=>1000,40353=>1000,40354=>1000,40355=>1000,40356=>1000,40357=>1000,40358=>1000,40359=>1000,40360=>1000,40361=>1000,40362=>1000,40363=>1000,40364=>1000,40365=>1000,40366=>1000,40367=>1000,40368=>1000,40369=>1000,40370=>1000,40371=>1000,40372=>1000,40373=>1000,40374=>1000,40375=>1000,40376=>1000,40377=>1000,40378=>1000,40379=>1000,40380=>1000,40381=>1000,40382=>1000,40383=>1000,40384=>1000,40385=>1000,40386=>1000,40387=>1000,40388=>1000,40389=>1000,40390=>1000,40391=>1000,40392=>1000,40393=>1000,40394=>1000,40395=>1000,40396=>1000,40397=>1000,40398=>1000,40399=>1000,40400=>1000,40401=>1000,40402=>1000,40403=>1000,40404=>1000,40405=>1000,40406=>1000,40407=>1000,40408=>1000,40409=>1000,40410=>1000,40411=>1000,40412=>1000,40413=>1000,40414=>1000,40415=>1000,40416=>1000,40417=>1000,40418=>1000,40419=>1000,40420=>1000,40421=>1000,40422=>1000,40423=>1000,40424=>1000,40425=>1000,40426=>1000,40427=>1000,40428=>1000,40429=>1000,40430=>1000,40431=>1000,40432=>1000,40433=>1000,40434=>1000,40435=>1000,40436=>1000,40437=>1000,40438=>1000,40439=>1000,40440=>1000,40441=>1000,40442=>1000,40443=>1000,40444=>1000,40445=>1000,40446=>1000,40447=>1000,40448=>1000,40449=>1000,40450=>1000,40451=>1000,40452=>1000,40453=>1000,40454=>1000,40455=>1000,40456=>1000,40457=>1000,40458=>1000,40459=>1000,40460=>1000,40461=>1000,40462=>1000,40463=>1000,40464=>1000,40465=>1000,40466=>1000,40467=>1000,40468=>1000,40469=>1000,40470=>1000,40471=>1000,40472=>1000,40473=>1000,40474=>1000,40475=>1000,40476=>1000,40477=>1000,40478=>1000,40479=>1000,40480=>1000,40481=>1000,40482=>1000,40483=>1000,40484=>1000,40485=>1000,40486=>1000,40487=>1000,40488=>1000,40489=>1000,40490=>1000,40491=>1000,40492=>1000,40493=>1000,40494=>1000,40495=>1000,40496=>1000,40497=>1000,40498=>1000,40499=>1000,40500=>1000,40501=>1000,40502=>1000,40503=>1000,40504=>1000,40505=>1000,40506=>1000,40507=>1000,40508=>1000,40509=>1000,40510=>1000,40511=>1000,40512=>1000,40513=>1000,40514=>1000,40515=>1000,40516=>1000,40517=>1000,40518=>1000,40519=>1000,40520=>1000,40521=>1000,40522=>1000,40523=>1000,40524=>1000,40525=>1000,40526=>1000,40527=>1000,40528=>1000,40529=>1000,40530=>1000,40531=>1000,40532=>1000,40533=>1000,40534=>1000,40535=>1000,40536=>1000,40537=>1000,40538=>1000,40539=>1000,40540=>1000,40541=>1000,40542=>1000,40543=>1000,40544=>1000,40545=>1000,40546=>1000,40547=>1000,40548=>1000,40549=>1000,40550=>1000,40551=>1000,40552=>1000,40553=>1000,40554=>1000,40555=>1000,40556=>1000,40557=>1000,40558=>1000,40559=>1000,40560=>1000,40561=>1000,40562=>1000,40563=>1000,40564=>1000,40565=>1000,40566=>1000,40567=>1000,40568=>1000,40569=>1000,40570=>1000,40571=>1000,40572=>1000,40573=>1000,40574=>1000,40575=>1000,40576=>1000,40577=>1000,40578=>1000,40579=>1000,40580=>1000,40581=>1000,40582=>1000,40583=>1000,40584=>1000,40585=>1000,40586=>1000,40587=>1000,40588=>1000,40589=>1000,40590=>1000,40591=>1000,40592=>1000,40593=>1000,40594=>1000,40595=>1000,40596=>1000,40597=>1000,40598=>1000,40599=>1000,40600=>1000,40601=>1000,40602=>1000,40603=>1000,40604=>1000,40605=>1000,40606=>1000,40607=>1000,40608=>1000,40609=>1000,40610=>1000,40611=>1000,40612=>1000,40613=>1000,40614=>1000,40615=>1000,40616=>1000,40617=>1000,40618=>1000,40619=>1000,40620=>1000,40621=>1000,40622=>1000,40623=>1000,40624=>1000,40625=>1000,40626=>1000,40627=>1000,40628=>1000,40629=>1000,40630=>1000,40631=>1000,40632=>1000,40633=>1000,40634=>1000,40635=>1000,40636=>1000,40637=>1000,40638=>1000,40639=>1000,40640=>1000,40641=>1000,40642=>1000,40643=>1000,40644=>1000,40645=>1000,40646=>1000,40647=>1000,40648=>1000,40649=>1000,40650=>1000,40651=>1000,40652=>1000,40653=>1000,40654=>1000,40655=>1000,40656=>1000,40657=>1000,40658=>1000,40659=>1000,40660=>1000,40661=>1000,40662=>1000,40663=>1000,40664=>1000,40665=>1000,40666=>1000,40667=>1000,40668=>1000,40669=>1000,40670=>1000,40671=>1000,40672=>1000,40673=>1000,40674=>1000,40675=>1000,40676=>1000,40677=>1000,40678=>1000,40679=>1000,40680=>1000,40681=>1000,40682=>1000,40683=>1000,40684=>1000,40685=>1000,40686=>1000,40687=>1000,40688=>1000,40689=>1000,40690=>1000,40691=>1000,40692=>1000,40693=>1000,40694=>1000,40695=>1000,40696=>1000,40697=>1000,40698=>1000,40699=>1000,40700=>1000,40701=>1000,40702=>1000,40703=>1000,40704=>1000,40705=>1000,40706=>1000,40707=>1000,40708=>1000,40709=>1000,40710=>1000,40711=>1000,40712=>1000,40713=>1000,40714=>1000,40715=>1000,40716=>1000,40717=>1000,40718=>1000,40719=>1000,40720=>1000,40721=>1000,40722=>1000,40723=>1000,40724=>1000,40725=>1000,40726=>1000,40727=>1000,40728=>1000,40729=>1000,40730=>1000,40731=>1000,40732=>1000,40733=>1000,40734=>1000,40735=>1000,40736=>1000,40737=>1000,40738=>1000,40739=>1000,40740=>1000,40741=>1000,40742=>1000,40743=>1000,40744=>1000,40745=>1000,40746=>1000,40747=>1000,40748=>1000,40749=>1000,40750=>1000,40751=>1000,40752=>1000,40753=>1000,40754=>1000,40755=>1000,40756=>1000,40757=>1000,40758=>1000,40759=>1000,40760=>1000,40761=>1000,40762=>1000,40763=>1000,40764=>1000,40765=>1000,40766=>1000,40767=>1000,40768=>1000,40769=>1000,40770=>1000,40771=>1000,40772=>1000,40773=>1000,40774=>1000,40775=>1000,40776=>1000,40777=>1000,40778=>1000,40779=>1000,40780=>1000,40781=>1000,40782=>1000,40783=>1000,40784=>1000,40785=>1000,40786=>1000,40787=>1000,40788=>1000,40789=>1000,40790=>1000,40791=>1000,40792=>1000,40793=>1000,40794=>1000,40795=>1000,40796=>1000,40797=>1000,40798=>1000,40799=>1000,40800=>1000,40801=>1000,40802=>1000,40803=>1000,40804=>1000,40805=>1000,40806=>1000,40807=>1000,40808=>1000,40809=>1000,40810=>1000,40811=>1000,40812=>1000,40813=>1000,40814=>1000,40815=>1000,40816=>1000,40817=>1000,40818=>1000,40819=>1000,40820=>1000,40821=>1000,40822=>1000,40823=>1000,40824=>1000,40825=>1000,40826=>1000,40827=>1000,40828=>1000,40829=>1000,40830=>1000,40831=>1000,40832=>1000,40833=>1000,40834=>1000,40835=>1000,40836=>1000,40837=>1000,40838=>1000,40839=>1000,40840=>1000,40841=>1000,40842=>1000,40843=>1000,40844=>1000,40845=>1000,40846=>1000,40847=>1000,40848=>1000,40849=>1000,40850=>1000,40851=>1000,40852=>1000,40853=>1000,40854=>1000,40855=>1000,40856=>1000,40857=>1000,40858=>1000,40859=>1000,40860=>1000,40861=>1000,40862=>1000,40863=>1000,40864=>1000,40865=>1000,40866=>1000,40867=>1000,40868=>1000,40869=>1000,44032=>1000,44033=>1000,44034=>1000,44035=>1000,44036=>1000,44037=>1000,44038=>1000,44039=>1000,44040=>1000,44041=>1000,44042=>1000,44043=>1000,44044=>1000,44045=>1000,44046=>1000,44047=>1000,44048=>1000,44049=>1000,44050=>1000,44051=>1000,44052=>1000,44053=>1000,44054=>1000,44055=>1000,44056=>1000,44057=>1000,44058=>1000,44059=>1000,44060=>1000,44061=>1000,44062=>1000,44063=>1000,44064=>1000,44065=>1000,44066=>1000,44067=>1000,44068=>1000,44069=>1000,44070=>1000,44071=>1000,44072=>1000,44073=>1000,44074=>1000,44075=>1000,44076=>1000,44077=>1000,44078=>1000,44079=>1000,44080=>1000,44081=>1000,44082=>1000,44083=>1000,44084=>1000,44085=>1000,44086=>1000,44087=>1000,44088=>1000,44089=>1000,44090=>1000,44091=>1000,44092=>1000,44093=>1000,44094=>1000,44095=>1000,44096=>1000,44097=>1000,44098=>1000,44099=>1000,44100=>1000,44101=>1000,44102=>1000,44103=>1000,44104=>1000,44105=>1000,44106=>1000,44107=>1000,44108=>1000,44109=>1000,44110=>1000,44111=>1000,44112=>1000,44113=>1000,44114=>1000,44115=>1000,44116=>1000,44117=>1000,44118=>1000,44119=>1000,44120=>1000,44121=>1000,44122=>1000,44123=>1000,44124=>1000,44125=>1000,44126=>1000,44127=>1000,44128=>1000,44129=>1000,44130=>1000,44131=>1000,44132=>1000,44133=>1000,44134=>1000,44135=>1000,44136=>1000,44137=>1000,44138=>1000,44139=>1000,44140=>1000,44141=>1000,44142=>1000,44143=>1000,44144=>1000,44145=>1000,44146=>1000,44147=>1000,44148=>1000,44149=>1000,44150=>1000,44151=>1000,44152=>1000,44153=>1000,44154=>1000,44155=>1000,44156=>1000,44157=>1000,44158=>1000,44159=>1000,44160=>1000,44161=>1000,44162=>1000,44163=>1000,44164=>1000,44165=>1000,44166=>1000,44167=>1000,44168=>1000,44169=>1000,44170=>1000,44171=>1000,44172=>1000,44173=>1000,44174=>1000,44175=>1000,44176=>1000,44177=>1000,44178=>1000,44179=>1000,44180=>1000,44181=>1000,44182=>1000,44183=>1000,44184=>1000,44185=>1000,44186=>1000,44187=>1000,44188=>1000,44189=>1000,44190=>1000,44191=>1000,44192=>1000,44193=>1000,44194=>1000,44195=>1000,44196=>1000,44197=>1000,44198=>1000,44199=>1000,44200=>1000,44201=>1000,44202=>1000,44203=>1000,44204=>1000,44205=>1000,44206=>1000,44207=>1000,44208=>1000,44209=>1000,44210=>1000,44211=>1000,44212=>1000,44213=>1000,44214=>1000,44215=>1000,44216=>1000,44217=>1000,44218=>1000,44219=>1000,44220=>1000,44221=>1000,44222=>1000,44223=>1000,44224=>1000,44225=>1000,44226=>1000,44227=>1000,44228=>1000,44229=>1000,44230=>1000,44231=>1000,44232=>1000,44233=>1000,44234=>1000,44235=>1000,44236=>1000,44237=>1000,44238=>1000,44239=>1000,44240=>1000,44241=>1000,44242=>1000,44243=>1000,44244=>1000,44245=>1000,44246=>1000,44247=>1000,44248=>1000,44249=>1000,44250=>1000,44251=>1000,44252=>1000,44253=>1000,44254=>1000,44255=>1000,44256=>1000,44257=>1000,44258=>1000,44259=>1000,44260=>1000,44261=>1000,44262=>1000,44263=>1000,44264=>1000,44265=>1000,44266=>1000,44267=>1000,44268=>1000,44269=>1000,44270=>1000,44271=>1000,44272=>1000,44273=>1000,44274=>1000,44275=>1000,44276=>1000,44277=>1000,44278=>1000,44279=>1000,44280=>1000,44281=>1000,44282=>1000,44283=>1000,44284=>1000,44285=>1000,44286=>1000,44287=>1000,44288=>1000,44289=>1000,44290=>1000,44291=>1000,44292=>1000,44293=>1000,44294=>1000,44295=>1000,44296=>1000,44297=>1000,44298=>1000,44299=>1000,44300=>1000,44301=>1000,44302=>1000,44303=>1000,44304=>1000,44305=>1000,44306=>1000,44307=>1000,44308=>1000,44309=>1000,44310=>1000,44311=>1000,44312=>1000,44313=>1000,44314=>1000,44315=>1000,44316=>1000,44317=>1000,44318=>1000,44319=>1000,44320=>1000,44321=>1000,44322=>1000,44323=>1000,44324=>1000,44325=>1000,44326=>1000,44327=>1000,44328=>1000,44329=>1000,44330=>1000,44331=>1000,44332=>1000,44333=>1000,44334=>1000,44335=>1000,44336=>1000,44337=>1000,44338=>1000,44339=>1000,44340=>1000,44341=>1000,44342=>1000,44343=>1000,44344=>1000,44345=>1000,44346=>1000,44347=>1000,44348=>1000,44349=>1000,44350=>1000,44351=>1000,44352=>1000,44353=>1000,44354=>1000,44355=>1000,44356=>1000,44357=>1000,44358=>1000,44359=>1000,44360=>1000,44361=>1000,44362=>1000,44363=>1000,44364=>1000,44365=>1000,44366=>1000,44367=>1000,44368=>1000,44369=>1000,44370=>1000,44371=>1000,44372=>1000,44373=>1000,44374=>1000,44375=>1000,44376=>1000,44377=>1000,44378=>1000,44379=>1000,44380=>1000,44381=>1000,44382=>1000,44383=>1000,44384=>1000,44385=>1000,44386=>1000,44387=>1000,44388=>1000,44389=>1000,44390=>1000,44391=>1000,44392=>1000,44393=>1000,44394=>1000,44395=>1000,44396=>1000,44397=>1000,44398=>1000,44399=>1000,44400=>1000,44401=>1000,44402=>1000,44403=>1000,44404=>1000,44405=>1000,44406=>1000,44407=>1000,44408=>1000,44409=>1000,44410=>1000,44411=>1000,44412=>1000,44413=>1000,44414=>1000,44415=>1000,44416=>1000,44417=>1000,44418=>1000,44419=>1000,44420=>1000,44421=>1000,44422=>1000,44423=>1000,44424=>1000,44425=>1000,44426=>1000,44427=>1000,44428=>1000,44429=>1000,44430=>1000,44431=>1000,44432=>1000,44433=>1000,44434=>1000,44435=>1000,44436=>1000,44437=>1000,44438=>1000,44439=>1000,44440=>1000,44441=>1000,44442=>1000,44443=>1000,44444=>1000,44445=>1000,44446=>1000,44447=>1000,44448=>1000,44449=>1000,44450=>1000,44451=>1000,44452=>1000,44453=>1000,44454=>1000,44455=>1000,44456=>1000,44457=>1000,44458=>1000,44459=>1000,44460=>1000,44461=>1000,44462=>1000,44463=>1000,44464=>1000,44465=>1000,44466=>1000,44467=>1000,44468=>1000,44469=>1000,44470=>1000,44471=>1000,44472=>1000,44473=>1000,44474=>1000,44475=>1000,44476=>1000,44477=>1000,44478=>1000,44479=>1000,44480=>1000,44481=>1000,44482=>1000,44483=>1000,44484=>1000,44485=>1000,44486=>1000,44487=>1000,44488=>1000,44489=>1000,44490=>1000,44491=>1000,44492=>1000,44493=>1000,44494=>1000,44495=>1000,44496=>1000,44497=>1000,44498=>1000,44499=>1000,44500=>1000,44501=>1000,44502=>1000,44503=>1000,44504=>1000,44505=>1000,44506=>1000,44507=>1000,44508=>1000,44509=>1000,44510=>1000,44511=>1000,44512=>1000,44513=>1000,44514=>1000,44515=>1000,44516=>1000,44517=>1000,44518=>1000,44519=>1000,44520=>1000,44521=>1000,44522=>1000,44523=>1000,44524=>1000,44525=>1000,44526=>1000,44527=>1000,44528=>1000,44529=>1000,44530=>1000,44531=>1000,44532=>1000,44533=>1000,44534=>1000,44535=>1000,44536=>1000,44537=>1000,44538=>1000,44539=>1000,44540=>1000,44541=>1000,44542=>1000,44543=>1000,44544=>1000,44545=>1000,44546=>1000,44547=>1000,44548=>1000,44549=>1000,44550=>1000,44551=>1000,44552=>1000,44553=>1000,44554=>1000,44555=>1000,44556=>1000,44557=>1000,44558=>1000,44559=>1000,44560=>1000,44561=>1000,44562=>1000,44563=>1000,44564=>1000,44565=>1000,44566=>1000,44567=>1000,44568=>1000,44569=>1000,44570=>1000,44571=>1000,44572=>1000,44573=>1000,44574=>1000,44575=>1000,44576=>1000,44577=>1000,44578=>1000,44579=>1000,44580=>1000,44581=>1000,44582=>1000,44583=>1000,44584=>1000,44585=>1000,44586=>1000,44587=>1000,44588=>1000,44589=>1000,44590=>1000,44591=>1000,44592=>1000,44593=>1000,44594=>1000,44595=>1000,44596=>1000,44597=>1000,44598=>1000,44599=>1000,44600=>1000,44601=>1000,44602=>1000,44603=>1000,44604=>1000,44605=>1000,44606=>1000,44607=>1000,44608=>1000,44609=>1000,44610=>1000,44611=>1000,44612=>1000,44613=>1000,44614=>1000,44615=>1000,44616=>1000,44617=>1000,44618=>1000,44619=>1000,44620=>1000,44621=>1000,44622=>1000,44623=>1000,44624=>1000,44625=>1000,44626=>1000,44627=>1000,44628=>1000,44629=>1000,44630=>1000,44631=>1000,44632=>1000,44633=>1000,44634=>1000,44635=>1000,44636=>1000,44637=>1000,44638=>1000,44639=>1000,44640=>1000,44641=>1000,44642=>1000,44643=>1000,44644=>1000,44645=>1000,44646=>1000,44647=>1000,44648=>1000,44649=>1000,44650=>1000,44651=>1000,44652=>1000,44653=>1000,44654=>1000,44655=>1000,44656=>1000,44657=>1000,44658=>1000,44659=>1000,44660=>1000,44661=>1000,44662=>1000,44663=>1000,44664=>1000,44665=>1000,44666=>1000,44667=>1000,44668=>1000,44669=>1000,44670=>1000,44671=>1000,44672=>1000,44673=>1000,44674=>1000,44675=>1000,44676=>1000,44677=>1000,44678=>1000,44679=>1000,44680=>1000,44681=>1000,44682=>1000,44683=>1000,44684=>1000,44685=>1000,44686=>1000,44687=>1000,44688=>1000,44689=>1000,44690=>1000,44691=>1000,44692=>1000,44693=>1000,44694=>1000,44695=>1000,44696=>1000,44697=>1000,44698=>1000,44699=>1000,44700=>1000,44701=>1000,44702=>1000,44703=>1000,44704=>1000,44705=>1000,44706=>1000,44707=>1000,44708=>1000,44709=>1000,44710=>1000,44711=>1000,44712=>1000,44713=>1000,44714=>1000,44715=>1000,44716=>1000,44717=>1000,44718=>1000,44719=>1000,44720=>1000,44721=>1000,44722=>1000,44723=>1000,44724=>1000,44725=>1000,44726=>1000,44727=>1000,44728=>1000,44729=>1000,44730=>1000,44731=>1000,44732=>1000,44733=>1000,44734=>1000,44735=>1000,44736=>1000,44737=>1000,44738=>1000,44739=>1000,44740=>1000,44741=>1000,44742=>1000,44743=>1000,44744=>1000,44745=>1000,44746=>1000,44747=>1000,44748=>1000,44749=>1000,44750=>1000,44751=>1000,44752=>1000,44753=>1000,44754=>1000,44755=>1000,44756=>1000,44757=>1000,44758=>1000,44759=>1000,44760=>1000,44761=>1000,44762=>1000,44763=>1000,44764=>1000,44765=>1000,44766=>1000,44767=>1000,44768=>1000,44769=>1000,44770=>1000,44771=>1000,44772=>1000,44773=>1000,44774=>1000,44775=>1000,44776=>1000,44777=>1000,44778=>1000,44779=>1000,44780=>1000,44781=>1000,44782=>1000,44783=>1000,44784=>1000,44785=>1000,44786=>1000,44787=>1000,44788=>1000,44789=>1000,44790=>1000,44791=>1000,44792=>1000,44793=>1000,44794=>1000,44795=>1000,44796=>1000,44797=>1000,44798=>1000,44799=>1000,44800=>1000,44801=>1000,44802=>1000,44803=>1000,44804=>1000,44805=>1000,44806=>1000,44807=>1000,44808=>1000,44809=>1000,44810=>1000,44811=>1000,44812=>1000,44813=>1000,44814=>1000,44815=>1000,44816=>1000,44817=>1000,44818=>1000,44819=>1000,44820=>1000,44821=>1000,44822=>1000,44823=>1000,44824=>1000,44825=>1000,44826=>1000,44827=>1000,44828=>1000,44829=>1000,44830=>1000,44831=>1000,44832=>1000,44833=>1000,44834=>1000,44835=>1000,44836=>1000,44837=>1000,44838=>1000,44839=>1000,44840=>1000,44841=>1000,44842=>1000,44843=>1000,44844=>1000,44845=>1000,44846=>1000,44847=>1000,44848=>1000,44849=>1000,44850=>1000,44851=>1000,44852=>1000,44853=>1000,44854=>1000,44855=>1000,44856=>1000,44857=>1000,44858=>1000,44859=>1000,44860=>1000,44861=>1000,44862=>1000,44863=>1000,44864=>1000,44865=>1000,44866=>1000,44867=>1000,44868=>1000,44869=>1000,44870=>1000,44871=>1000,44872=>1000,44873=>1000,44874=>1000,44875=>1000,44876=>1000,44877=>1000,44878=>1000,44879=>1000,44880=>1000,44881=>1000,44882=>1000,44883=>1000,44884=>1000,44885=>1000,44886=>1000,44887=>1000,44888=>1000,44889=>1000,44890=>1000,44891=>1000,44892=>1000,44893=>1000,44894=>1000,44895=>1000,44896=>1000,44897=>1000,44898=>1000,44899=>1000,44900=>1000,44901=>1000,44902=>1000,44903=>1000,44904=>1000,44905=>1000,44906=>1000,44907=>1000,44908=>1000,44909=>1000,44910=>1000,44911=>1000,44912=>1000,44913=>1000,44914=>1000,44915=>1000,44916=>1000,44917=>1000,44918=>1000,44919=>1000,44920=>1000,44921=>1000,44922=>1000,44923=>1000,44924=>1000,44925=>1000,44926=>1000,44927=>1000,44928=>1000,44929=>1000,44930=>1000,44931=>1000,44932=>1000,44933=>1000,44934=>1000,44935=>1000,44936=>1000,44937=>1000,44938=>1000,44939=>1000,44940=>1000,44941=>1000,44942=>1000,44943=>1000,44944=>1000,44945=>1000,44946=>1000,44947=>1000,44948=>1000,44949=>1000,44950=>1000,44951=>1000,44952=>1000,44953=>1000,44954=>1000,44955=>1000,44956=>1000,44957=>1000,44958=>1000,44959=>1000,44960=>1000,44961=>1000,44962=>1000,44963=>1000,44964=>1000,44965=>1000,44966=>1000,44967=>1000,44968=>1000,44969=>1000,44970=>1000,44971=>1000,44972=>1000,44973=>1000,44974=>1000,44975=>1000,44976=>1000,44977=>1000,44978=>1000,44979=>1000,44980=>1000,44981=>1000,44982=>1000,44983=>1000,44984=>1000,44985=>1000,44986=>1000,44987=>1000,44988=>1000,44989=>1000,44990=>1000,44991=>1000,44992=>1000,44993=>1000,44994=>1000,44995=>1000,44996=>1000,44997=>1000,44998=>1000,44999=>1000,45000=>1000,45001=>1000,45002=>1000,45003=>1000,45004=>1000,45005=>1000,45006=>1000,45007=>1000,45008=>1000,45009=>1000,45010=>1000,45011=>1000,45012=>1000,45013=>1000,45014=>1000,45015=>1000,45016=>1000,45017=>1000,45018=>1000,45019=>1000,45020=>1000,45021=>1000,45022=>1000,45023=>1000,45024=>1000,45025=>1000,45026=>1000,45027=>1000,45028=>1000,45029=>1000,45030=>1000,45031=>1000,45032=>1000,45033=>1000,45034=>1000,45035=>1000,45036=>1000,45037=>1000,45038=>1000,45039=>1000,45040=>1000,45041=>1000,45042=>1000,45043=>1000,45044=>1000,45045=>1000,45046=>1000,45047=>1000,45048=>1000,45049=>1000,45050=>1000,45051=>1000,45052=>1000,45053=>1000,45054=>1000,45055=>1000,45056=>1000,45057=>1000,45058=>1000,45059=>1000,45060=>1000,45061=>1000,45062=>1000,45063=>1000,45064=>1000,45065=>1000,45066=>1000,45067=>1000,45068=>1000,45069=>1000,45070=>1000,45071=>1000,45072=>1000,45073=>1000,45074=>1000,45075=>1000,45076=>1000,45077=>1000,45078=>1000,45079=>1000,45080=>1000,45081=>1000,45082=>1000,45083=>1000,45084=>1000,45085=>1000,45086=>1000,45087=>1000,45088=>1000,45089=>1000,45090=>1000,45091=>1000,45092=>1000,45093=>1000,45094=>1000,45095=>1000,45096=>1000,45097=>1000,45098=>1000,45099=>1000,45100=>1000,45101=>1000,45102=>1000,45103=>1000,45104=>1000,45105=>1000,45106=>1000,45107=>1000,45108=>1000,45109=>1000,45110=>1000,45111=>1000,45112=>1000,45113=>1000,45114=>1000,45115=>1000,45116=>1000,45117=>1000,45118=>1000,45119=>1000,45120=>1000,45121=>1000,45122=>1000,45123=>1000,45124=>1000,45125=>1000,45126=>1000,45127=>1000,45128=>1000,45129=>1000,45130=>1000,45131=>1000,45132=>1000,45133=>1000,45134=>1000,45135=>1000,45136=>1000,45137=>1000,45138=>1000,45139=>1000,45140=>1000,45141=>1000,45142=>1000,45143=>1000,45144=>1000,45145=>1000,45146=>1000,45147=>1000,45148=>1000,45149=>1000,45150=>1000,45151=>1000,45152=>1000,45153=>1000,45154=>1000,45155=>1000,45156=>1000,45157=>1000,45158=>1000,45159=>1000,45160=>1000,45161=>1000,45162=>1000,45163=>1000,45164=>1000,45165=>1000,45166=>1000,45167=>1000,45168=>1000,45169=>1000,45170=>1000,45171=>1000,45172=>1000,45173=>1000,45174=>1000,45175=>1000,45176=>1000,45177=>1000,45178=>1000,45179=>1000,45180=>1000,45181=>1000,45182=>1000,45183=>1000,45184=>1000,45185=>1000,45186=>1000,45187=>1000,45188=>1000,45189=>1000,45190=>1000,45191=>1000,45192=>1000,45193=>1000,45194=>1000,45195=>1000,45196=>1000,45197=>1000,45198=>1000,45199=>1000,45200=>1000,45201=>1000,45202=>1000,45203=>1000,45204=>1000,45205=>1000,45206=>1000,45207=>1000,45208=>1000,45209=>1000,45210=>1000,45211=>1000,45212=>1000,45213=>1000,45214=>1000,45215=>1000,45216=>1000,45217=>1000,45218=>1000,45219=>1000,45220=>1000,45221=>1000,45222=>1000,45223=>1000,45224=>1000,45225=>1000,45226=>1000,45227=>1000,45228=>1000,45229=>1000,45230=>1000,45231=>1000,45232=>1000,45233=>1000,45234=>1000,45235=>1000,45236=>1000,45237=>1000,45238=>1000,45239=>1000,45240=>1000,45241=>1000,45242=>1000,45243=>1000,45244=>1000,45245=>1000,45246=>1000,45247=>1000,45248=>1000,45249=>1000,45250=>1000,45251=>1000,45252=>1000,45253=>1000,45254=>1000,45255=>1000,45256=>1000,45257=>1000,45258=>1000,45259=>1000,45260=>1000,45261=>1000,45262=>1000,45263=>1000,45264=>1000,45265=>1000,45266=>1000,45267=>1000,45268=>1000,45269=>1000,45270=>1000,45271=>1000,45272=>1000,45273=>1000,45274=>1000,45275=>1000,45276=>1000,45277=>1000,45278=>1000,45279=>1000,45280=>1000,45281=>1000,45282=>1000,45283=>1000,45284=>1000,45285=>1000,45286=>1000,45287=>1000,45288=>1000,45289=>1000,45290=>1000,45291=>1000,45292=>1000,45293=>1000,45294=>1000,45295=>1000,45296=>1000,45297=>1000,45298=>1000,45299=>1000,45300=>1000,45301=>1000,45302=>1000,45303=>1000,45304=>1000,45305=>1000,45306=>1000,45307=>1000,45308=>1000,45309=>1000,45310=>1000,45311=>1000,45312=>1000,45313=>1000,45314=>1000,45315=>1000,45316=>1000,45317=>1000,45318=>1000,45319=>1000,45320=>1000,45321=>1000,45322=>1000,45323=>1000,45324=>1000,45325=>1000,45326=>1000,45327=>1000,45328=>1000,45329=>1000,45330=>1000,45331=>1000,45332=>1000,45333=>1000,45334=>1000,45335=>1000,45336=>1000,45337=>1000,45338=>1000,45339=>1000,45340=>1000,45341=>1000,45342=>1000,45343=>1000,45344=>1000,45345=>1000,45346=>1000,45347=>1000,45348=>1000,45349=>1000,45350=>1000,45351=>1000,45352=>1000,45353=>1000,45354=>1000,45355=>1000,45356=>1000,45357=>1000,45358=>1000,45359=>1000,45360=>1000,45361=>1000,45362=>1000,45363=>1000,45364=>1000,45365=>1000,45366=>1000,45367=>1000,45368=>1000,45369=>1000,45370=>1000,45371=>1000,45372=>1000,45373=>1000,45374=>1000,45375=>1000,45376=>1000,45377=>1000,45378=>1000,45379=>1000,45380=>1000,45381=>1000,45382=>1000,45383=>1000,45384=>1000,45385=>1000,45386=>1000,45387=>1000,45388=>1000,45389=>1000,45390=>1000,45391=>1000,45392=>1000,45393=>1000,45394=>1000,45395=>1000,45396=>1000,45397=>1000,45398=>1000,45399=>1000,45400=>1000,45401=>1000,45402=>1000,45403=>1000,45404=>1000,45405=>1000,45406=>1000,45407=>1000,45408=>1000,45409=>1000,45410=>1000,45411=>1000,45412=>1000,45413=>1000,45414=>1000,45415=>1000,45416=>1000,45417=>1000,45418=>1000,45419=>1000,45420=>1000,45421=>1000,45422=>1000,45423=>1000,45424=>1000,45425=>1000,45426=>1000,45427=>1000,45428=>1000,45429=>1000,45430=>1000,45431=>1000,45432=>1000,45433=>1000,45434=>1000,45435=>1000,45436=>1000,45437=>1000,45438=>1000,45439=>1000,45440=>1000,45441=>1000,45442=>1000,45443=>1000,45444=>1000,45445=>1000,45446=>1000,45447=>1000,45448=>1000,45449=>1000,45450=>1000,45451=>1000,45452=>1000,45453=>1000,45454=>1000,45455=>1000,45456=>1000,45457=>1000,45458=>1000,45459=>1000,45460=>1000,45461=>1000,45462=>1000,45463=>1000,45464=>1000,45465=>1000,45466=>1000,45467=>1000,45468=>1000,45469=>1000,45470=>1000,45471=>1000,45472=>1000,45473=>1000,45474=>1000,45475=>1000,45476=>1000,45477=>1000,45478=>1000,45479=>1000,45480=>1000,45481=>1000,45482=>1000,45483=>1000,45484=>1000,45485=>1000,45486=>1000,45487=>1000,45488=>1000,45489=>1000,45490=>1000,45491=>1000,45492=>1000,45493=>1000,45494=>1000,45495=>1000,45496=>1000,45497=>1000,45498=>1000,45499=>1000,45500=>1000,45501=>1000,45502=>1000,45503=>1000,45504=>1000,45505=>1000,45506=>1000,45507=>1000,45508=>1000,45509=>1000,45510=>1000,45511=>1000,45512=>1000,45513=>1000,45514=>1000,45515=>1000,45516=>1000,45517=>1000,45518=>1000,45519=>1000,45520=>1000,45521=>1000,45522=>1000,45523=>1000,45524=>1000,45525=>1000,45526=>1000,45527=>1000,45528=>1000,45529=>1000,45530=>1000,45531=>1000,45532=>1000,45533=>1000,45534=>1000,45535=>1000,45536=>1000,45537=>1000,45538=>1000,45539=>1000,45540=>1000,45541=>1000,45542=>1000,45543=>1000,45544=>1000,45545=>1000,45546=>1000,45547=>1000,45548=>1000,45549=>1000,45550=>1000,45551=>1000,45552=>1000,45553=>1000,45554=>1000,45555=>1000,45556=>1000,45557=>1000,45558=>1000,45559=>1000,45560=>1000,45561=>1000,45562=>1000,45563=>1000,45564=>1000,45565=>1000,45566=>1000,45567=>1000,45568=>1000,45569=>1000,45570=>1000,45571=>1000,45572=>1000,45573=>1000,45574=>1000,45575=>1000,45576=>1000,45577=>1000,45578=>1000,45579=>1000,45580=>1000,45581=>1000,45582=>1000,45583=>1000,45584=>1000,45585=>1000,45586=>1000,45587=>1000,45588=>1000,45589=>1000,45590=>1000,45591=>1000,45592=>1000,45593=>1000,45594=>1000,45595=>1000,45596=>1000,45597=>1000,45598=>1000,45599=>1000,45600=>1000,45601=>1000,45602=>1000,45603=>1000,45604=>1000,45605=>1000,45606=>1000,45607=>1000,45608=>1000,45609=>1000,45610=>1000,45611=>1000,45612=>1000,45613=>1000,45614=>1000,45615=>1000,45616=>1000,45617=>1000,45618=>1000,45619=>1000,45620=>1000,45621=>1000,45622=>1000,45623=>1000,45624=>1000,45625=>1000,45626=>1000,45627=>1000,45628=>1000,45629=>1000,45630=>1000,45631=>1000,45632=>1000,45633=>1000,45634=>1000,45635=>1000,45636=>1000,45637=>1000,45638=>1000,45639=>1000,45640=>1000,45641=>1000,45642=>1000,45643=>1000,45644=>1000,45645=>1000,45646=>1000,45647=>1000,45648=>1000,45649=>1000,45650=>1000,45651=>1000,45652=>1000,45653=>1000,45654=>1000,45655=>1000,45656=>1000,45657=>1000,45658=>1000,45659=>1000,45660=>1000,45661=>1000,45662=>1000,45663=>1000,45664=>1000,45665=>1000,45666=>1000,45667=>1000,45668=>1000,45669=>1000,45670=>1000,45671=>1000,45672=>1000,45673=>1000,45674=>1000,45675=>1000,45676=>1000,45677=>1000,45678=>1000,45679=>1000,45680=>1000,45681=>1000,45682=>1000,45683=>1000,45684=>1000,45685=>1000,45686=>1000,45687=>1000,45688=>1000,45689=>1000,45690=>1000,45691=>1000,45692=>1000,45693=>1000,45694=>1000,45695=>1000,45696=>1000,45697=>1000,45698=>1000,45699=>1000,45700=>1000,45701=>1000,45702=>1000,45703=>1000,45704=>1000,45705=>1000,45706=>1000,45707=>1000,45708=>1000,45709=>1000,45710=>1000,45711=>1000,45712=>1000,45713=>1000,45714=>1000,45715=>1000,45716=>1000,45717=>1000,45718=>1000,45719=>1000,45720=>1000,45721=>1000,45722=>1000,45723=>1000,45724=>1000,45725=>1000,45726=>1000,45727=>1000,45728=>1000,45729=>1000,45730=>1000,45731=>1000,45732=>1000,45733=>1000,45734=>1000,45735=>1000,45736=>1000,45737=>1000,45738=>1000,45739=>1000,45740=>1000,45741=>1000,45742=>1000,45743=>1000,45744=>1000,45745=>1000,45746=>1000,45747=>1000,45748=>1000,45749=>1000,45750=>1000,45751=>1000,45752=>1000,45753=>1000,45754=>1000,45755=>1000,45756=>1000,45757=>1000,45758=>1000,45759=>1000,45760=>1000,45761=>1000,45762=>1000,45763=>1000,45764=>1000,45765=>1000,45766=>1000,45767=>1000,45768=>1000,45769=>1000,45770=>1000,45771=>1000,45772=>1000,45773=>1000,45774=>1000,45775=>1000,45776=>1000,45777=>1000,45778=>1000,45779=>1000,45780=>1000,45781=>1000,45782=>1000,45783=>1000,45784=>1000,45785=>1000,45786=>1000,45787=>1000,45788=>1000,45789=>1000,45790=>1000,45791=>1000,45792=>1000,45793=>1000,45794=>1000,45795=>1000,45796=>1000,45797=>1000,45798=>1000,45799=>1000,45800=>1000,45801=>1000,45802=>1000,45803=>1000,45804=>1000,45805=>1000,45806=>1000,45807=>1000,45808=>1000,45809=>1000,45810=>1000,45811=>1000,45812=>1000,45813=>1000,45814=>1000,45815=>1000,45816=>1000,45817=>1000,45818=>1000,45819=>1000,45820=>1000,45821=>1000,45822=>1000,45823=>1000,45824=>1000,45825=>1000,45826=>1000,45827=>1000,45828=>1000,45829=>1000,45830=>1000,45831=>1000,45832=>1000,45833=>1000,45834=>1000,45835=>1000,45836=>1000,45837=>1000,45838=>1000,45839=>1000,45840=>1000,45841=>1000,45842=>1000,45843=>1000,45844=>1000,45845=>1000,45846=>1000,45847=>1000,45848=>1000,45849=>1000,45850=>1000,45851=>1000,45852=>1000,45853=>1000,45854=>1000,45855=>1000,45856=>1000,45857=>1000,45858=>1000,45859=>1000,45860=>1000,45861=>1000,45862=>1000,45863=>1000,45864=>1000,45865=>1000,45866=>1000,45867=>1000,45868=>1000,45869=>1000,45870=>1000,45871=>1000,45872=>1000,45873=>1000,45874=>1000,45875=>1000,45876=>1000,45877=>1000,45878=>1000,45879=>1000,45880=>1000,45881=>1000,45882=>1000,45883=>1000,45884=>1000,45885=>1000,45886=>1000,45887=>1000,45888=>1000,45889=>1000,45890=>1000,45891=>1000,45892=>1000,45893=>1000,45894=>1000,45895=>1000,45896=>1000,45897=>1000,45898=>1000,45899=>1000,45900=>1000,45901=>1000,45902=>1000,45903=>1000,45904=>1000,45905=>1000,45906=>1000,45907=>1000,45908=>1000,45909=>1000,45910=>1000,45911=>1000,45912=>1000,45913=>1000,45914=>1000,45915=>1000,45916=>1000,45917=>1000,45918=>1000,45919=>1000,45920=>1000,45921=>1000,45922=>1000,45923=>1000,45924=>1000,45925=>1000,45926=>1000,45927=>1000,45928=>1000,45929=>1000,45930=>1000,45931=>1000,45932=>1000,45933=>1000,45934=>1000,45935=>1000,45936=>1000,45937=>1000,45938=>1000,45939=>1000,45940=>1000,45941=>1000,45942=>1000,45943=>1000,45944=>1000,45945=>1000,45946=>1000,45947=>1000,45948=>1000,45949=>1000,45950=>1000,45951=>1000,45952=>1000,45953=>1000,45954=>1000,45955=>1000,45956=>1000,45957=>1000,45958=>1000,45959=>1000,45960=>1000,45961=>1000,45962=>1000,45963=>1000,45964=>1000,45965=>1000,45966=>1000,45967=>1000,45968=>1000,45969=>1000,45970=>1000,45971=>1000,45972=>1000,45973=>1000,45974=>1000,45975=>1000,45976=>1000,45977=>1000,45978=>1000,45979=>1000,45980=>1000,45981=>1000,45982=>1000,45983=>1000,45984=>1000,45985=>1000,45986=>1000,45987=>1000,45988=>1000,45989=>1000,45990=>1000,45991=>1000,45992=>1000,45993=>1000,45994=>1000,45995=>1000,45996=>1000,45997=>1000,45998=>1000,45999=>1000,46000=>1000,46001=>1000,46002=>1000,46003=>1000,46004=>1000,46005=>1000,46006=>1000,46007=>1000,46008=>1000,46009=>1000,46010=>1000,46011=>1000,46012=>1000,46013=>1000,46014=>1000,46015=>1000,46016=>1000,46017=>1000,46018=>1000,46019=>1000,46020=>1000,46021=>1000,46022=>1000,46023=>1000,46024=>1000,46025=>1000,46026=>1000,46027=>1000,46028=>1000,46029=>1000,46030=>1000,46031=>1000,46032=>1000,46033=>1000,46034=>1000,46035=>1000,46036=>1000,46037=>1000,46038=>1000,46039=>1000,46040=>1000,46041=>1000,46042=>1000,46043=>1000,46044=>1000,46045=>1000,46046=>1000,46047=>1000,46048=>1000,46049=>1000,46050=>1000,46051=>1000,46052=>1000,46053=>1000,46054=>1000,46055=>1000,46056=>1000,46057=>1000,46058=>1000,46059=>1000,46060=>1000,46061=>1000,46062=>1000,46063=>1000,46064=>1000,46065=>1000,46066=>1000,46067=>1000,46068=>1000,46069=>1000,46070=>1000,46071=>1000,46072=>1000,46073=>1000,46074=>1000,46075=>1000,46076=>1000,46077=>1000,46078=>1000,46079=>1000,46080=>1000,46081=>1000,46082=>1000,46083=>1000,46084=>1000,46085=>1000,46086=>1000,46087=>1000,46088=>1000,46089=>1000,46090=>1000,46091=>1000,46092=>1000,46093=>1000,46094=>1000,46095=>1000,46096=>1000,46097=>1000,46098=>1000,46099=>1000,46100=>1000,46101=>1000,46102=>1000,46103=>1000,46104=>1000,46105=>1000,46106=>1000,46107=>1000,46108=>1000,46109=>1000,46110=>1000,46111=>1000,46112=>1000,46113=>1000,46114=>1000,46115=>1000,46116=>1000,46117=>1000,46118=>1000,46119=>1000,46120=>1000,46121=>1000,46122=>1000,46123=>1000,46124=>1000,46125=>1000,46126=>1000,46127=>1000,46128=>1000,46129=>1000,46130=>1000,46131=>1000,46132=>1000,46133=>1000,46134=>1000,46135=>1000,46136=>1000,46137=>1000,46138=>1000,46139=>1000,46140=>1000,46141=>1000,46142=>1000,46143=>1000,46144=>1000,46145=>1000,46146=>1000,46147=>1000,46148=>1000,46149=>1000,46150=>1000,46151=>1000,46152=>1000,46153=>1000,46154=>1000,46155=>1000,46156=>1000,46157=>1000,46158=>1000,46159=>1000,46160=>1000,46161=>1000,46162=>1000,46163=>1000,46164=>1000,46165=>1000,46166=>1000,46167=>1000,46168=>1000,46169=>1000,46170=>1000,46171=>1000,46172=>1000,46173=>1000,46174=>1000,46175=>1000,46176=>1000,46177=>1000,46178=>1000,46179=>1000,46180=>1000,46181=>1000,46182=>1000,46183=>1000,46184=>1000,46185=>1000,46186=>1000,46187=>1000,46188=>1000,46189=>1000,46190=>1000,46191=>1000,46192=>1000,46193=>1000,46194=>1000,46195=>1000,46196=>1000,46197=>1000,46198=>1000,46199=>1000,46200=>1000,46201=>1000,46202=>1000,46203=>1000,46204=>1000,46205=>1000,46206=>1000,46207=>1000,46208=>1000,46209=>1000,46210=>1000,46211=>1000,46212=>1000,46213=>1000,46214=>1000,46215=>1000,46216=>1000,46217=>1000,46218=>1000,46219=>1000,46220=>1000,46221=>1000,46222=>1000,46223=>1000,46224=>1000,46225=>1000,46226=>1000,46227=>1000,46228=>1000,46229=>1000,46230=>1000,46231=>1000,46232=>1000,46233=>1000,46234=>1000,46235=>1000,46236=>1000,46237=>1000,46238=>1000,46239=>1000,46240=>1000,46241=>1000,46242=>1000,46243=>1000,46244=>1000,46245=>1000,46246=>1000,46247=>1000,46248=>1000,46249=>1000,46250=>1000,46251=>1000,46252=>1000,46253=>1000,46254=>1000,46255=>1000,46256=>1000,46257=>1000,46258=>1000,46259=>1000,46260=>1000,46261=>1000,46262=>1000,46263=>1000,46264=>1000,46265=>1000,46266=>1000,46267=>1000,46268=>1000,46269=>1000,46270=>1000,46271=>1000,46272=>1000,46273=>1000,46274=>1000,46275=>1000,46276=>1000,46277=>1000,46278=>1000,46279=>1000,46280=>1000,46281=>1000,46282=>1000,46283=>1000,46284=>1000,46285=>1000,46286=>1000,46287=>1000,46288=>1000,46289=>1000,46290=>1000,46291=>1000,46292=>1000,46293=>1000,46294=>1000,46295=>1000,46296=>1000,46297=>1000,46298=>1000,46299=>1000,46300=>1000,46301=>1000,46302=>1000,46303=>1000,46304=>1000,46305=>1000,46306=>1000,46307=>1000,46308=>1000,46309=>1000,46310=>1000,46311=>1000,46312=>1000,46313=>1000,46314=>1000,46315=>1000,46316=>1000,46317=>1000,46318=>1000,46319=>1000,46320=>1000,46321=>1000,46322=>1000,46323=>1000,46324=>1000,46325=>1000,46326=>1000,46327=>1000,46328=>1000,46329=>1000,46330=>1000,46331=>1000,46332=>1000,46333=>1000,46334=>1000,46335=>1000,46336=>1000,46337=>1000,46338=>1000,46339=>1000,46340=>1000,46341=>1000,46342=>1000,46343=>1000,46344=>1000,46345=>1000,46346=>1000,46347=>1000,46348=>1000,46349=>1000,46350=>1000,46351=>1000,46352=>1000,46353=>1000,46354=>1000,46355=>1000,46356=>1000,46357=>1000,46358=>1000,46359=>1000,46360=>1000,46361=>1000,46362=>1000,46363=>1000,46364=>1000,46365=>1000,46366=>1000,46367=>1000,46368=>1000,46369=>1000,46370=>1000,46371=>1000,46372=>1000,46373=>1000,46374=>1000,46375=>1000,46376=>1000,46377=>1000,46378=>1000,46379=>1000,46380=>1000,46381=>1000,46382=>1000,46383=>1000,46384=>1000,46385=>1000,46386=>1000,46387=>1000,46388=>1000,46389=>1000,46390=>1000,46391=>1000,46392=>1000,46393=>1000,46394=>1000,46395=>1000,46396=>1000,46397=>1000,46398=>1000,46399=>1000,46400=>1000,46401=>1000,46402=>1000,46403=>1000,46404=>1000,46405=>1000,46406=>1000,46407=>1000,46408=>1000,46409=>1000,46410=>1000,46411=>1000,46412=>1000,46413=>1000,46414=>1000,46415=>1000,46416=>1000,46417=>1000,46418=>1000,46419=>1000,46420=>1000,46421=>1000,46422=>1000,46423=>1000,46424=>1000,46425=>1000,46426=>1000,46427=>1000,46428=>1000,46429=>1000,46430=>1000,46431=>1000,46432=>1000,46433=>1000,46434=>1000,46435=>1000,46436=>1000,46437=>1000,46438=>1000,46439=>1000,46440=>1000,46441=>1000,46442=>1000,46443=>1000,46444=>1000,46445=>1000,46446=>1000,46447=>1000,46448=>1000,46449=>1000,46450=>1000,46451=>1000,46452=>1000,46453=>1000,46454=>1000,46455=>1000,46456=>1000,46457=>1000,46458=>1000,46459=>1000,46460=>1000,46461=>1000,46462=>1000,46463=>1000,46464=>1000,46465=>1000,46466=>1000,46467=>1000,46468=>1000,46469=>1000,46470=>1000,46471=>1000,46472=>1000,46473=>1000,46474=>1000,46475=>1000,46476=>1000,46477=>1000,46478=>1000,46479=>1000,46480=>1000,46481=>1000,46482=>1000,46483=>1000,46484=>1000,46485=>1000,46486=>1000,46487=>1000,46488=>1000,46489=>1000,46490=>1000,46491=>1000,46492=>1000,46493=>1000,46494=>1000,46495=>1000,46496=>1000,46497=>1000,46498=>1000,46499=>1000,46500=>1000,46501=>1000,46502=>1000,46503=>1000,46504=>1000,46505=>1000,46506=>1000,46507=>1000,46508=>1000,46509=>1000,46510=>1000,46511=>1000,46512=>1000,46513=>1000,46514=>1000,46515=>1000,46516=>1000,46517=>1000,46518=>1000,46519=>1000,46520=>1000,46521=>1000,46522=>1000,46523=>1000,46524=>1000,46525=>1000,46526=>1000,46527=>1000,46528=>1000,46529=>1000,46530=>1000,46531=>1000,46532=>1000,46533=>1000,46534=>1000,46535=>1000,46536=>1000,46537=>1000,46538=>1000,46539=>1000,46540=>1000,46541=>1000,46542=>1000,46543=>1000,46544=>1000,46545=>1000,46546=>1000,46547=>1000,46548=>1000,46549=>1000,46550=>1000,46551=>1000,46552=>1000,46553=>1000,46554=>1000,46555=>1000,46556=>1000,46557=>1000,46558=>1000,46559=>1000,46560=>1000,46561=>1000,46562=>1000,46563=>1000,46564=>1000,46565=>1000,46566=>1000,46567=>1000,46568=>1000,46569=>1000,46570=>1000,46571=>1000,46572=>1000,46573=>1000,46574=>1000,46575=>1000,46576=>1000,46577=>1000,46578=>1000,46579=>1000,46580=>1000,46581=>1000,46582=>1000,46583=>1000,46584=>1000,46585=>1000,46586=>1000,46587=>1000,46588=>1000,46589=>1000,46590=>1000,46591=>1000,46592=>1000,46593=>1000,46594=>1000,46595=>1000,46596=>1000,46597=>1000,46598=>1000,46599=>1000,46600=>1000,46601=>1000,46602=>1000,46603=>1000,46604=>1000,46605=>1000,46606=>1000,46607=>1000,46608=>1000,46609=>1000,46610=>1000,46611=>1000,46612=>1000,46613=>1000,46614=>1000,46615=>1000,46616=>1000,46617=>1000,46618=>1000,46619=>1000,46620=>1000,46621=>1000,46622=>1000,46623=>1000,46624=>1000,46625=>1000,46626=>1000,46627=>1000,46628=>1000,46629=>1000,46630=>1000,46631=>1000,46632=>1000,46633=>1000,46634=>1000,46635=>1000,46636=>1000,46637=>1000,46638=>1000,46639=>1000,46640=>1000,46641=>1000,46642=>1000,46643=>1000,46644=>1000,46645=>1000,46646=>1000,46647=>1000,46648=>1000,46649=>1000,46650=>1000,46651=>1000,46652=>1000,46653=>1000,46654=>1000,46655=>1000,46656=>1000,46657=>1000,46658=>1000,46659=>1000,46660=>1000,46661=>1000,46662=>1000,46663=>1000,46664=>1000,46665=>1000,46666=>1000,46667=>1000,46668=>1000,46669=>1000,46670=>1000,46671=>1000,46672=>1000,46673=>1000,46674=>1000,46675=>1000,46676=>1000,46677=>1000,46678=>1000,46679=>1000,46680=>1000,46681=>1000,46682=>1000,46683=>1000,46684=>1000,46685=>1000,46686=>1000,46687=>1000,46688=>1000,46689=>1000,46690=>1000,46691=>1000,46692=>1000,46693=>1000,46694=>1000,46695=>1000,46696=>1000,46697=>1000,46698=>1000,46699=>1000,46700=>1000,46701=>1000,46702=>1000,46703=>1000,46704=>1000,46705=>1000,46706=>1000,46707=>1000,46708=>1000,46709=>1000,46710=>1000,46711=>1000,46712=>1000,46713=>1000,46714=>1000,46715=>1000,46716=>1000,46717=>1000,46718=>1000,46719=>1000,46720=>1000,46721=>1000,46722=>1000,46723=>1000,46724=>1000,46725=>1000,46726=>1000,46727=>1000,46728=>1000,46729=>1000,46730=>1000,46731=>1000,46732=>1000,46733=>1000,46734=>1000,46735=>1000,46736=>1000,46737=>1000,46738=>1000,46739=>1000,46740=>1000,46741=>1000,46742=>1000,46743=>1000,46744=>1000,46745=>1000,46746=>1000,46747=>1000,46748=>1000,46749=>1000,46750=>1000,46751=>1000,46752=>1000,46753=>1000,46754=>1000,46755=>1000,46756=>1000,46757=>1000,46758=>1000,46759=>1000,46760=>1000,46761=>1000,46762=>1000,46763=>1000,46764=>1000,46765=>1000,46766=>1000,46767=>1000,46768=>1000,46769=>1000,46770=>1000,46771=>1000,46772=>1000,46773=>1000,46774=>1000,46775=>1000,46776=>1000,46777=>1000,46778=>1000,46779=>1000,46780=>1000,46781=>1000,46782=>1000,46783=>1000,46784=>1000,46785=>1000,46786=>1000,46787=>1000,46788=>1000,46789=>1000,46790=>1000,46791=>1000,46792=>1000,46793=>1000,46794=>1000,46795=>1000,46796=>1000,46797=>1000,46798=>1000,46799=>1000,46800=>1000,46801=>1000,46802=>1000,46803=>1000,46804=>1000,46805=>1000,46806=>1000,46807=>1000,46808=>1000,46809=>1000,46810=>1000,46811=>1000,46812=>1000,46813=>1000,46814=>1000,46815=>1000,46816=>1000,46817=>1000,46818=>1000,46819=>1000,46820=>1000,46821=>1000,46822=>1000,46823=>1000,46824=>1000,46825=>1000,46826=>1000,46827=>1000,46828=>1000,46829=>1000,46830=>1000,46831=>1000,46832=>1000,46833=>1000,46834=>1000,46835=>1000,46836=>1000,46837=>1000,46838=>1000,46839=>1000,46840=>1000,46841=>1000,46842=>1000,46843=>1000,46844=>1000,46845=>1000,46846=>1000,46847=>1000,46848=>1000,46849=>1000,46850=>1000,46851=>1000,46852=>1000,46853=>1000,46854=>1000,46855=>1000,46856=>1000,46857=>1000,46858=>1000,46859=>1000,46860=>1000,46861=>1000,46862=>1000,46863=>1000,46864=>1000,46865=>1000,46866=>1000,46867=>1000,46868=>1000,46869=>1000,46870=>1000,46871=>1000,46872=>1000,46873=>1000,46874=>1000,46875=>1000,46876=>1000,46877=>1000,46878=>1000,46879=>1000,46880=>1000,46881=>1000,46882=>1000,46883=>1000,46884=>1000,46885=>1000,46886=>1000,46887=>1000,46888=>1000,46889=>1000,46890=>1000,46891=>1000,46892=>1000,46893=>1000,46894=>1000,46895=>1000,46896=>1000,46897=>1000,46898=>1000,46899=>1000,46900=>1000,46901=>1000,46902=>1000,46903=>1000,46904=>1000,46905=>1000,46906=>1000,46907=>1000,46908=>1000,46909=>1000,46910=>1000,46911=>1000,46912=>1000,46913=>1000,46914=>1000,46915=>1000,46916=>1000,46917=>1000,46918=>1000,46919=>1000,46920=>1000,46921=>1000,46922=>1000,46923=>1000,46924=>1000,46925=>1000,46926=>1000,46927=>1000,46928=>1000,46929=>1000,46930=>1000,46931=>1000,46932=>1000,46933=>1000,46934=>1000,46935=>1000,46936=>1000,46937=>1000,46938=>1000,46939=>1000,46940=>1000,46941=>1000,46942=>1000,46943=>1000,46944=>1000,46945=>1000,46946=>1000,46947=>1000,46948=>1000,46949=>1000,46950=>1000,46951=>1000,46952=>1000,46953=>1000,46954=>1000,46955=>1000,46956=>1000,46957=>1000,46958=>1000,46959=>1000,46960=>1000,46961=>1000,46962=>1000,46963=>1000,46964=>1000,46965=>1000,46966=>1000,46967=>1000,46968=>1000,46969=>1000,46970=>1000,46971=>1000,46972=>1000,46973=>1000,46974=>1000,46975=>1000,46976=>1000,46977=>1000,46978=>1000,46979=>1000,46980=>1000,46981=>1000,46982=>1000,46983=>1000,46984=>1000,46985=>1000,46986=>1000,46987=>1000,46988=>1000,46989=>1000,46990=>1000,46991=>1000,46992=>1000,46993=>1000,46994=>1000,46995=>1000,46996=>1000,46997=>1000,46998=>1000,46999=>1000,47000=>1000,47001=>1000,47002=>1000,47003=>1000,47004=>1000,47005=>1000,47006=>1000,47007=>1000,47008=>1000,47009=>1000,47010=>1000,47011=>1000,47012=>1000,47013=>1000,47014=>1000,47015=>1000,47016=>1000,47017=>1000,47018=>1000,47019=>1000,47020=>1000,47021=>1000,47022=>1000,47023=>1000,47024=>1000,47025=>1000,47026=>1000,47027=>1000,47028=>1000,47029=>1000,47030=>1000,47031=>1000,47032=>1000,47033=>1000,47034=>1000,47035=>1000,47036=>1000,47037=>1000,47038=>1000,47039=>1000,47040=>1000,47041=>1000,47042=>1000,47043=>1000,47044=>1000,47045=>1000,47046=>1000,47047=>1000,47048=>1000,47049=>1000,47050=>1000,47051=>1000,47052=>1000,47053=>1000,47054=>1000,47055=>1000,47056=>1000,47057=>1000,47058=>1000,47059=>1000,47060=>1000,47061=>1000,47062=>1000,47063=>1000,47064=>1000,47065=>1000,47066=>1000,47067=>1000,47068=>1000,47069=>1000,47070=>1000,47071=>1000,47072=>1000,47073=>1000,47074=>1000,47075=>1000,47076=>1000,47077=>1000,47078=>1000,47079=>1000,47080=>1000,47081=>1000,47082=>1000,47083=>1000,47084=>1000,47085=>1000,47086=>1000,47087=>1000,47088=>1000,47089=>1000,47090=>1000,47091=>1000,47092=>1000,47093=>1000,47094=>1000,47095=>1000,47096=>1000,47097=>1000,47098=>1000,47099=>1000,47100=>1000,47101=>1000,47102=>1000,47103=>1000,47104=>1000,47105=>1000,47106=>1000,47107=>1000,47108=>1000,47109=>1000,47110=>1000,47111=>1000,47112=>1000,47113=>1000,47114=>1000,47115=>1000,47116=>1000,47117=>1000,47118=>1000,47119=>1000,47120=>1000,47121=>1000,47122=>1000,47123=>1000,47124=>1000,47125=>1000,47126=>1000,47127=>1000,47128=>1000,47129=>1000,47130=>1000,47131=>1000,47132=>1000,47133=>1000,47134=>1000,47135=>1000,47136=>1000,47137=>1000,47138=>1000,47139=>1000,47140=>1000,47141=>1000,47142=>1000,47143=>1000,47144=>1000,47145=>1000,47146=>1000,47147=>1000,47148=>1000,47149=>1000,47150=>1000,47151=>1000,47152=>1000,47153=>1000,47154=>1000,47155=>1000,47156=>1000,47157=>1000,47158=>1000,47159=>1000,47160=>1000,47161=>1000,47162=>1000,47163=>1000,47164=>1000,47165=>1000,47166=>1000,47167=>1000,47168=>1000,47169=>1000,47170=>1000,47171=>1000,47172=>1000,47173=>1000,47174=>1000,47175=>1000,47176=>1000,47177=>1000,47178=>1000,47179=>1000,47180=>1000,47181=>1000,47182=>1000,47183=>1000,47184=>1000,47185=>1000,47186=>1000,47187=>1000,47188=>1000,47189=>1000,47190=>1000,47191=>1000,47192=>1000,47193=>1000,47194=>1000,47195=>1000,47196=>1000,47197=>1000,47198=>1000,47199=>1000,47200=>1000,47201=>1000,47202=>1000,47203=>1000,47204=>1000,47205=>1000,47206=>1000,47207=>1000,47208=>1000,47209=>1000,47210=>1000,47211=>1000,47212=>1000,47213=>1000,47214=>1000,47215=>1000,47216=>1000,47217=>1000,47218=>1000,47219=>1000,47220=>1000,47221=>1000,47222=>1000,47223=>1000,47224=>1000,47225=>1000,47226=>1000,47227=>1000,47228=>1000,47229=>1000,47230=>1000,47231=>1000,47232=>1000,47233=>1000,47234=>1000,47235=>1000,47236=>1000,47237=>1000,47238=>1000,47239=>1000,47240=>1000,47241=>1000,47242=>1000,47243=>1000,47244=>1000,47245=>1000,47246=>1000,47247=>1000,47248=>1000,47249=>1000,47250=>1000,47251=>1000,47252=>1000,47253=>1000,47254=>1000,47255=>1000,47256=>1000,47257=>1000,47258=>1000,47259=>1000,47260=>1000,47261=>1000,47262=>1000,47263=>1000,47264=>1000,47265=>1000,47266=>1000,47267=>1000,47268=>1000,47269=>1000,47270=>1000,47271=>1000,47272=>1000,47273=>1000,47274=>1000,47275=>1000,47276=>1000,47277=>1000,47278=>1000,47279=>1000,47280=>1000,47281=>1000,47282=>1000,47283=>1000,47284=>1000,47285=>1000,47286=>1000,47287=>1000,47288=>1000,47289=>1000,47290=>1000,47291=>1000,47292=>1000,47293=>1000,47294=>1000,47295=>1000,47296=>1000,47297=>1000,47298=>1000,47299=>1000,47300=>1000,47301=>1000,47302=>1000,47303=>1000,47304=>1000,47305=>1000,47306=>1000,47307=>1000,47308=>1000,47309=>1000,47310=>1000,47311=>1000,47312=>1000,47313=>1000,47314=>1000,47315=>1000,47316=>1000,47317=>1000,47318=>1000,47319=>1000,47320=>1000,47321=>1000,47322=>1000,47323=>1000,47324=>1000,47325=>1000,47326=>1000,47327=>1000,47328=>1000,47329=>1000,47330=>1000,47331=>1000,47332=>1000,47333=>1000,47334=>1000,47335=>1000,47336=>1000,47337=>1000,47338=>1000,47339=>1000,47340=>1000,47341=>1000,47342=>1000,47343=>1000,47344=>1000,47345=>1000,47346=>1000,47347=>1000,47348=>1000,47349=>1000,47350=>1000,47351=>1000,47352=>1000,47353=>1000,47354=>1000,47355=>1000,47356=>1000,47357=>1000,47358=>1000,47359=>1000,47360=>1000,47361=>1000,47362=>1000,47363=>1000,47364=>1000,47365=>1000,47366=>1000,47367=>1000,47368=>1000,47369=>1000,47370=>1000,47371=>1000,47372=>1000,47373=>1000,47374=>1000,47375=>1000,47376=>1000,47377=>1000,47378=>1000,47379=>1000,47380=>1000,47381=>1000,47382=>1000,47383=>1000,47384=>1000,47385=>1000,47386=>1000,47387=>1000,47388=>1000,47389=>1000,47390=>1000,47391=>1000,47392=>1000,47393=>1000,47394=>1000,47395=>1000,47396=>1000,47397=>1000,47398=>1000,47399=>1000,47400=>1000,47401=>1000,47402=>1000,47403=>1000,47404=>1000,47405=>1000,47406=>1000,47407=>1000,47408=>1000,47409=>1000,47410=>1000,47411=>1000,47412=>1000,47413=>1000,47414=>1000,47415=>1000,47416=>1000,47417=>1000,47418=>1000,47419=>1000,47420=>1000,47421=>1000,47422=>1000,47423=>1000,47424=>1000,47425=>1000,47426=>1000,47427=>1000,47428=>1000,47429=>1000,47430=>1000,47431=>1000,47432=>1000,47433=>1000,47434=>1000,47435=>1000,47436=>1000,47437=>1000,47438=>1000,47439=>1000,47440=>1000,47441=>1000,47442=>1000,47443=>1000,47444=>1000,47445=>1000,47446=>1000,47447=>1000,47448=>1000,47449=>1000,47450=>1000,47451=>1000,47452=>1000,47453=>1000,47454=>1000,47455=>1000,47456=>1000,47457=>1000,47458=>1000,47459=>1000,47460=>1000,47461=>1000,47462=>1000,47463=>1000,47464=>1000,47465=>1000,47466=>1000,47467=>1000,47468=>1000,47469=>1000,47470=>1000,47471=>1000,47472=>1000,47473=>1000,47474=>1000,47475=>1000,47476=>1000,47477=>1000,47478=>1000,47479=>1000,47480=>1000,47481=>1000,47482=>1000,47483=>1000,47484=>1000,47485=>1000,47486=>1000,47487=>1000,47488=>1000,47489=>1000,47490=>1000,47491=>1000,47492=>1000,47493=>1000,47494=>1000,47495=>1000,47496=>1000,47497=>1000,47498=>1000,47499=>1000,47500=>1000,47501=>1000,47502=>1000,47503=>1000,47504=>1000,47505=>1000,47506=>1000,47507=>1000,47508=>1000,47509=>1000,47510=>1000,47511=>1000,47512=>1000,47513=>1000,47514=>1000,47515=>1000,47516=>1000,47517=>1000,47518=>1000,47519=>1000,47520=>1000,47521=>1000,47522=>1000,47523=>1000,47524=>1000,47525=>1000,47526=>1000,47527=>1000,47528=>1000,47529=>1000,47530=>1000,47531=>1000,47532=>1000,47533=>1000,47534=>1000,47535=>1000,47536=>1000,47537=>1000,47538=>1000,47539=>1000,47540=>1000,47541=>1000,47542=>1000,47543=>1000,47544=>1000,47545=>1000,47546=>1000,47547=>1000,47548=>1000,47549=>1000,47550=>1000,47551=>1000,47552=>1000,47553=>1000,47554=>1000,47555=>1000,47556=>1000,47557=>1000,47558=>1000,47559=>1000,47560=>1000,47561=>1000,47562=>1000,47563=>1000,47564=>1000,47565=>1000,47566=>1000,47567=>1000,47568=>1000,47569=>1000,47570=>1000,47571=>1000,47572=>1000,47573=>1000,47574=>1000,47575=>1000,47576=>1000,47577=>1000,47578=>1000,47579=>1000,47580=>1000,47581=>1000,47582=>1000,47583=>1000,47584=>1000,47585=>1000,47586=>1000,47587=>1000,47588=>1000,47589=>1000,47590=>1000,47591=>1000,47592=>1000,47593=>1000,47594=>1000,47595=>1000,47596=>1000,47597=>1000,47598=>1000,47599=>1000,47600=>1000,47601=>1000,47602=>1000,47603=>1000,47604=>1000,47605=>1000,47606=>1000,47607=>1000,47608=>1000,47609=>1000,47610=>1000,47611=>1000,47612=>1000,47613=>1000,47614=>1000,47615=>1000,47616=>1000,47617=>1000,47618=>1000,47619=>1000,47620=>1000,47621=>1000,47622=>1000,47623=>1000,47624=>1000,47625=>1000,47626=>1000,47627=>1000,47628=>1000,47629=>1000,47630=>1000,47631=>1000,47632=>1000,47633=>1000,47634=>1000,47635=>1000,47636=>1000,47637=>1000,47638=>1000,47639=>1000,47640=>1000,47641=>1000,47642=>1000,47643=>1000,47644=>1000,47645=>1000,47646=>1000,47647=>1000,47648=>1000,47649=>1000,47650=>1000,47651=>1000,47652=>1000,47653=>1000,47654=>1000,47655=>1000,47656=>1000,47657=>1000,47658=>1000,47659=>1000,47660=>1000,47661=>1000,47662=>1000,47663=>1000,47664=>1000,47665=>1000,47666=>1000,47667=>1000,47668=>1000,47669=>1000,47670=>1000,47671=>1000,47672=>1000,47673=>1000,47674=>1000,47675=>1000,47676=>1000,47677=>1000,47678=>1000,47679=>1000,47680=>1000,47681=>1000,47682=>1000,47683=>1000,47684=>1000,47685=>1000,47686=>1000,47687=>1000,47688=>1000,47689=>1000,47690=>1000,47691=>1000,47692=>1000,47693=>1000,47694=>1000,47695=>1000,47696=>1000,47697=>1000,47698=>1000,47699=>1000,47700=>1000,47701=>1000,47702=>1000,47703=>1000,47704=>1000,47705=>1000,47706=>1000,47707=>1000,47708=>1000,47709=>1000,47710=>1000,47711=>1000,47712=>1000,47713=>1000,47714=>1000,47715=>1000,47716=>1000,47717=>1000,47718=>1000,47719=>1000,47720=>1000,47721=>1000,47722=>1000,47723=>1000,47724=>1000,47725=>1000,47726=>1000,47727=>1000,47728=>1000,47729=>1000,47730=>1000,47731=>1000,47732=>1000,47733=>1000,47734=>1000,47735=>1000,47736=>1000,47737=>1000,47738=>1000,47739=>1000,47740=>1000,47741=>1000,47742=>1000,47743=>1000,47744=>1000,47745=>1000,47746=>1000,47747=>1000,47748=>1000,47749=>1000,47750=>1000,47751=>1000,47752=>1000,47753=>1000,47754=>1000,47755=>1000,47756=>1000,47757=>1000,47758=>1000,47759=>1000,47760=>1000,47761=>1000,47762=>1000,47763=>1000,47764=>1000,47765=>1000,47766=>1000,47767=>1000,47768=>1000,47769=>1000,47770=>1000,47771=>1000,47772=>1000,47773=>1000,47774=>1000,47775=>1000,47776=>1000,47777=>1000,47778=>1000,47779=>1000,47780=>1000,47781=>1000,47782=>1000,47783=>1000,47784=>1000,47785=>1000,47786=>1000,47787=>1000,47788=>1000,47789=>1000,47790=>1000,47791=>1000,47792=>1000,47793=>1000,47794=>1000,47795=>1000,47796=>1000,47797=>1000,47798=>1000,47799=>1000,47800=>1000,47801=>1000,47802=>1000,47803=>1000,47804=>1000,47805=>1000,47806=>1000,47807=>1000,47808=>1000,47809=>1000,47810=>1000,47811=>1000,47812=>1000,47813=>1000,47814=>1000,47815=>1000,47816=>1000,47817=>1000,47818=>1000,47819=>1000,47820=>1000,47821=>1000,47822=>1000,47823=>1000,47824=>1000,47825=>1000,47826=>1000,47827=>1000,47828=>1000,47829=>1000,47830=>1000,47831=>1000,47832=>1000,47833=>1000,47834=>1000,47835=>1000,47836=>1000,47837=>1000,47838=>1000,47839=>1000,47840=>1000,47841=>1000,47842=>1000,47843=>1000,47844=>1000,47845=>1000,47846=>1000,47847=>1000,47848=>1000,47849=>1000,47850=>1000,47851=>1000,47852=>1000,47853=>1000,47854=>1000,47855=>1000,47856=>1000,47857=>1000,47858=>1000,47859=>1000,47860=>1000,47861=>1000,47862=>1000,47863=>1000,47864=>1000,47865=>1000,47866=>1000,47867=>1000,47868=>1000,47869=>1000,47870=>1000,47871=>1000,47872=>1000,47873=>1000,47874=>1000,47875=>1000,47876=>1000,47877=>1000,47878=>1000,47879=>1000,47880=>1000,47881=>1000,47882=>1000,47883=>1000,47884=>1000,47885=>1000,47886=>1000,47887=>1000,47888=>1000,47889=>1000,47890=>1000,47891=>1000,47892=>1000,47893=>1000,47894=>1000,47895=>1000,47896=>1000,47897=>1000,47898=>1000,47899=>1000,47900=>1000,47901=>1000,47902=>1000,47903=>1000,47904=>1000,47905=>1000,47906=>1000,47907=>1000,47908=>1000,47909=>1000,47910=>1000,47911=>1000,47912=>1000,47913=>1000,47914=>1000,47915=>1000,47916=>1000,47917=>1000,47918=>1000,47919=>1000,47920=>1000,47921=>1000,47922=>1000,47923=>1000,47924=>1000,47925=>1000,47926=>1000,47927=>1000,47928=>1000,47929=>1000,47930=>1000,47931=>1000,47932=>1000,47933=>1000,47934=>1000,47935=>1000,47936=>1000,47937=>1000,47938=>1000,47939=>1000,47940=>1000,47941=>1000,47942=>1000,47943=>1000,47944=>1000,47945=>1000,47946=>1000,47947=>1000,47948=>1000,47949=>1000,47950=>1000,47951=>1000,47952=>1000,47953=>1000,47954=>1000,47955=>1000,47956=>1000,47957=>1000,47958=>1000,47959=>1000,47960=>1000,47961=>1000,47962=>1000,47963=>1000,47964=>1000,47965=>1000,47966=>1000,47967=>1000,47968=>1000,47969=>1000,47970=>1000,47971=>1000,47972=>1000,47973=>1000,47974=>1000,47975=>1000,47976=>1000,47977=>1000,47978=>1000,47979=>1000,47980=>1000,47981=>1000,47982=>1000,47983=>1000,47984=>1000,47985=>1000,47986=>1000,47987=>1000,47988=>1000,47989=>1000,47990=>1000,47991=>1000,47992=>1000,47993=>1000,47994=>1000,47995=>1000,47996=>1000,47997=>1000,47998=>1000,47999=>1000,48000=>1000,48001=>1000,48002=>1000,48003=>1000,48004=>1000,48005=>1000,48006=>1000,48007=>1000,48008=>1000,48009=>1000,48010=>1000,48011=>1000,48012=>1000,48013=>1000,48014=>1000,48015=>1000,48016=>1000,48017=>1000,48018=>1000,48019=>1000,48020=>1000,48021=>1000,48022=>1000,48023=>1000,48024=>1000,48025=>1000,48026=>1000,48027=>1000,48028=>1000,48029=>1000,48030=>1000,48031=>1000,48032=>1000,48033=>1000,48034=>1000,48035=>1000,48036=>1000,48037=>1000,48038=>1000,48039=>1000,48040=>1000,48041=>1000,48042=>1000,48043=>1000,48044=>1000,48045=>1000,48046=>1000,48047=>1000,48048=>1000,48049=>1000,48050=>1000,48051=>1000,48052=>1000,48053=>1000,48054=>1000,48055=>1000,48056=>1000,48057=>1000,48058=>1000,48059=>1000,48060=>1000,48061=>1000,48062=>1000,48063=>1000,48064=>1000,48065=>1000,48066=>1000,48067=>1000,48068=>1000,48069=>1000,48070=>1000,48071=>1000,48072=>1000,48073=>1000,48074=>1000,48075=>1000,48076=>1000,48077=>1000,48078=>1000,48079=>1000,48080=>1000,48081=>1000,48082=>1000,48083=>1000,48084=>1000,48085=>1000,48086=>1000,48087=>1000,48088=>1000,48089=>1000,48090=>1000,48091=>1000,48092=>1000,48093=>1000,48094=>1000,48095=>1000,48096=>1000,48097=>1000,48098=>1000,48099=>1000,48100=>1000,48101=>1000,48102=>1000,48103=>1000,48104=>1000,48105=>1000,48106=>1000,48107=>1000,48108=>1000,48109=>1000,48110=>1000,48111=>1000,48112=>1000,48113=>1000,48114=>1000,48115=>1000,48116=>1000,48117=>1000,48118=>1000,48119=>1000,48120=>1000,48121=>1000,48122=>1000,48123=>1000,48124=>1000,48125=>1000,48126=>1000,48127=>1000,48128=>1000,48129=>1000,48130=>1000,48131=>1000,48132=>1000,48133=>1000,48134=>1000,48135=>1000,48136=>1000,48137=>1000,48138=>1000,48139=>1000,48140=>1000,48141=>1000,48142=>1000,48143=>1000,48144=>1000,48145=>1000,48146=>1000,48147=>1000,48148=>1000,48149=>1000,48150=>1000,48151=>1000,48152=>1000,48153=>1000,48154=>1000,48155=>1000,48156=>1000,48157=>1000,48158=>1000,48159=>1000,48160=>1000,48161=>1000,48162=>1000,48163=>1000,48164=>1000,48165=>1000,48166=>1000,48167=>1000,48168=>1000,48169=>1000,48170=>1000,48171=>1000,48172=>1000,48173=>1000,48174=>1000,48175=>1000,48176=>1000,48177=>1000,48178=>1000,48179=>1000,48180=>1000,48181=>1000,48182=>1000,48183=>1000,48184=>1000,48185=>1000,48186=>1000,48187=>1000,48188=>1000,48189=>1000,48190=>1000,48191=>1000,48192=>1000,48193=>1000,48194=>1000,48195=>1000,48196=>1000,48197=>1000,48198=>1000,48199=>1000,48200=>1000,48201=>1000,48202=>1000,48203=>1000,48204=>1000,48205=>1000,48206=>1000,48207=>1000,48208=>1000,48209=>1000,48210=>1000,48211=>1000,48212=>1000,48213=>1000,48214=>1000,48215=>1000,48216=>1000,48217=>1000,48218=>1000,48219=>1000,48220=>1000,48221=>1000,48222=>1000,48223=>1000,48224=>1000,48225=>1000,48226=>1000,48227=>1000,48228=>1000,48229=>1000,48230=>1000,48231=>1000,48232=>1000,48233=>1000,48234=>1000,48235=>1000,48236=>1000,48237=>1000,48238=>1000,48239=>1000,48240=>1000,48241=>1000,48242=>1000,48243=>1000,48244=>1000,48245=>1000,48246=>1000,48247=>1000,48248=>1000,48249=>1000,48250=>1000,48251=>1000,48252=>1000,48253=>1000,48254=>1000,48255=>1000,48256=>1000,48257=>1000,48258=>1000,48259=>1000,48260=>1000,48261=>1000,48262=>1000,48263=>1000,48264=>1000,48265=>1000,48266=>1000,48267=>1000,48268=>1000,48269=>1000,48270=>1000,48271=>1000,48272=>1000,48273=>1000,48274=>1000,48275=>1000,48276=>1000,48277=>1000,48278=>1000,48279=>1000,48280=>1000,48281=>1000,48282=>1000,48283=>1000,48284=>1000,48285=>1000,48286=>1000,48287=>1000,48288=>1000,48289=>1000,48290=>1000,48291=>1000,48292=>1000,48293=>1000,48294=>1000,48295=>1000,48296=>1000,48297=>1000,48298=>1000,48299=>1000,48300=>1000,48301=>1000,48302=>1000,48303=>1000,48304=>1000,48305=>1000,48306=>1000,48307=>1000,48308=>1000,48309=>1000,48310=>1000,48311=>1000,48312=>1000,48313=>1000,48314=>1000,48315=>1000,48316=>1000,48317=>1000,48318=>1000,48319=>1000,48320=>1000,48321=>1000,48322=>1000,48323=>1000,48324=>1000,48325=>1000,48326=>1000,48327=>1000,48328=>1000,48329=>1000,48330=>1000,48331=>1000,48332=>1000,48333=>1000,48334=>1000,48335=>1000,48336=>1000,48337=>1000,48338=>1000,48339=>1000,48340=>1000,48341=>1000,48342=>1000,48343=>1000,48344=>1000,48345=>1000,48346=>1000,48347=>1000,48348=>1000,48349=>1000,48350=>1000,48351=>1000,48352=>1000,48353=>1000,48354=>1000,48355=>1000,48356=>1000,48357=>1000,48358=>1000,48359=>1000,48360=>1000,48361=>1000,48362=>1000,48363=>1000,48364=>1000,48365=>1000,48366=>1000,48367=>1000,48368=>1000,48369=>1000,48370=>1000,48371=>1000,48372=>1000,48373=>1000,48374=>1000,48375=>1000,48376=>1000,48377=>1000,48378=>1000,48379=>1000,48380=>1000,48381=>1000,48382=>1000,48383=>1000,48384=>1000,48385=>1000,48386=>1000,48387=>1000,48388=>1000,48389=>1000,48390=>1000,48391=>1000,48392=>1000,48393=>1000,48394=>1000,48395=>1000,48396=>1000,48397=>1000,48398=>1000,48399=>1000,48400=>1000,48401=>1000,48402=>1000,48403=>1000,48404=>1000,48405=>1000,48406=>1000,48407=>1000,48408=>1000,48409=>1000,48410=>1000,48411=>1000,48412=>1000,48413=>1000,48414=>1000,48415=>1000,48416=>1000,48417=>1000,48418=>1000,48419=>1000,48420=>1000,48421=>1000,48422=>1000,48423=>1000,48424=>1000,48425=>1000,48426=>1000,48427=>1000,48428=>1000,48429=>1000,48430=>1000,48431=>1000,48432=>1000,48433=>1000,48434=>1000,48435=>1000,48436=>1000,48437=>1000,48438=>1000,48439=>1000,48440=>1000,48441=>1000,48442=>1000,48443=>1000,48444=>1000,48445=>1000,48446=>1000,48447=>1000,48448=>1000,48449=>1000,48450=>1000,48451=>1000,48452=>1000,48453=>1000,48454=>1000,48455=>1000,48456=>1000,48457=>1000,48458=>1000,48459=>1000,48460=>1000,48461=>1000,48462=>1000,48463=>1000,48464=>1000,48465=>1000,48466=>1000,48467=>1000,48468=>1000,48469=>1000,48470=>1000,48471=>1000,48472=>1000,48473=>1000,48474=>1000,48475=>1000,48476=>1000,48477=>1000,48478=>1000,48479=>1000,48480=>1000,48481=>1000,48482=>1000,48483=>1000,48484=>1000,48485=>1000,48486=>1000,48487=>1000,48488=>1000,48489=>1000,48490=>1000,48491=>1000,48492=>1000,48493=>1000,48494=>1000,48495=>1000,48496=>1000,48497=>1000,48498=>1000,48499=>1000,48500=>1000,48501=>1000,48502=>1000,48503=>1000,48504=>1000,48505=>1000,48506=>1000,48507=>1000,48508=>1000,48509=>1000,48510=>1000,48511=>1000,48512=>1000,48513=>1000,48514=>1000,48515=>1000,48516=>1000,48517=>1000,48518=>1000,48519=>1000,48520=>1000,48521=>1000,48522=>1000,48523=>1000,48524=>1000,48525=>1000,48526=>1000,48527=>1000,48528=>1000,48529=>1000,48530=>1000,48531=>1000,48532=>1000,48533=>1000,48534=>1000,48535=>1000,48536=>1000,48537=>1000,48538=>1000,48539=>1000,48540=>1000,48541=>1000,48542=>1000,48543=>1000,48544=>1000,48545=>1000,48546=>1000,48547=>1000,48548=>1000,48549=>1000,48550=>1000,48551=>1000,48552=>1000,48553=>1000,48554=>1000,48555=>1000,48556=>1000,48557=>1000,48558=>1000,48559=>1000,48560=>1000,48561=>1000,48562=>1000,48563=>1000,48564=>1000,48565=>1000,48566=>1000,48567=>1000,48568=>1000,48569=>1000,48570=>1000,48571=>1000,48572=>1000,48573=>1000,48574=>1000,48575=>1000,48576=>1000,48577=>1000,48578=>1000,48579=>1000,48580=>1000,48581=>1000,48582=>1000,48583=>1000,48584=>1000,48585=>1000,48586=>1000,48587=>1000,48588=>1000,48589=>1000,48590=>1000,48591=>1000,48592=>1000,48593=>1000,48594=>1000,48595=>1000,48596=>1000,48597=>1000,48598=>1000,48599=>1000,48600=>1000,48601=>1000,48602=>1000,48603=>1000,48604=>1000,48605=>1000,48606=>1000,48607=>1000,48608=>1000,48609=>1000,48610=>1000,48611=>1000,48612=>1000,48613=>1000,48614=>1000,48615=>1000,48616=>1000,48617=>1000,48618=>1000,48619=>1000,48620=>1000,48621=>1000,48622=>1000,48623=>1000,48624=>1000,48625=>1000,48626=>1000,48627=>1000,48628=>1000,48629=>1000,48630=>1000,48631=>1000,48632=>1000,48633=>1000,48634=>1000,48635=>1000,48636=>1000,48637=>1000,48638=>1000,48639=>1000,48640=>1000,48641=>1000,48642=>1000,48643=>1000,48644=>1000,48645=>1000,48646=>1000,48647=>1000,48648=>1000,48649=>1000,48650=>1000,48651=>1000,48652=>1000,48653=>1000,48654=>1000,48655=>1000,48656=>1000,48657=>1000,48658=>1000,48659=>1000,48660=>1000,48661=>1000,48662=>1000,48663=>1000,48664=>1000,48665=>1000,48666=>1000,48667=>1000,48668=>1000,48669=>1000,48670=>1000,48671=>1000,48672=>1000,48673=>1000,48674=>1000,48675=>1000,48676=>1000,48677=>1000,48678=>1000,48679=>1000,48680=>1000,48681=>1000,48682=>1000,48683=>1000,48684=>1000,48685=>1000,48686=>1000,48687=>1000,48688=>1000,48689=>1000,48690=>1000,48691=>1000,48692=>1000,48693=>1000,48694=>1000,48695=>1000,48696=>1000,48697=>1000,48698=>1000,48699=>1000,48700=>1000,48701=>1000,48702=>1000,48703=>1000,48704=>1000,48705=>1000,48706=>1000,48707=>1000,48708=>1000,48709=>1000,48710=>1000,48711=>1000,48712=>1000,48713=>1000,48714=>1000,48715=>1000,48716=>1000,48717=>1000,48718=>1000,48719=>1000,48720=>1000,48721=>1000,48722=>1000,48723=>1000,48724=>1000,48725=>1000,48726=>1000,48727=>1000,48728=>1000,48729=>1000,48730=>1000,48731=>1000,48732=>1000,48733=>1000,48734=>1000,48735=>1000,48736=>1000,48737=>1000,48738=>1000,48739=>1000,48740=>1000,48741=>1000,48742=>1000,48743=>1000,48744=>1000,48745=>1000,48746=>1000,48747=>1000,48748=>1000,48749=>1000,48750=>1000,48751=>1000,48752=>1000,48753=>1000,48754=>1000,48755=>1000,48756=>1000,48757=>1000,48758=>1000,48759=>1000,48760=>1000,48761=>1000,48762=>1000,48763=>1000,48764=>1000,48765=>1000,48766=>1000,48767=>1000,48768=>1000,48769=>1000,48770=>1000,48771=>1000,48772=>1000,48773=>1000,48774=>1000,48775=>1000,48776=>1000,48777=>1000,48778=>1000,48779=>1000,48780=>1000,48781=>1000,48782=>1000,48783=>1000,48784=>1000,48785=>1000,48786=>1000,48787=>1000,48788=>1000,48789=>1000,48790=>1000,48791=>1000,48792=>1000,48793=>1000,48794=>1000,48795=>1000,48796=>1000,48797=>1000,48798=>1000,48799=>1000,48800=>1000,48801=>1000,48802=>1000,48803=>1000,48804=>1000,48805=>1000,48806=>1000,48807=>1000,48808=>1000,48809=>1000,48810=>1000,48811=>1000,48812=>1000,48813=>1000,48814=>1000,48815=>1000,48816=>1000,48817=>1000,48818=>1000,48819=>1000,48820=>1000,48821=>1000,48822=>1000,48823=>1000,48824=>1000,48825=>1000,48826=>1000,48827=>1000,48828=>1000,48829=>1000,48830=>1000,48831=>1000,48832=>1000,48833=>1000,48834=>1000,48835=>1000,48836=>1000,48837=>1000,48838=>1000,48839=>1000,48840=>1000,48841=>1000,48842=>1000,48843=>1000,48844=>1000,48845=>1000,48846=>1000,48847=>1000,48848=>1000,48849=>1000,48850=>1000,48851=>1000,48852=>1000,48853=>1000,48854=>1000,48855=>1000,48856=>1000,48857=>1000,48858=>1000,48859=>1000,48860=>1000,48861=>1000,48862=>1000,48863=>1000,48864=>1000,48865=>1000,48866=>1000,48867=>1000,48868=>1000,48869=>1000,48870=>1000,48871=>1000,48872=>1000,48873=>1000,48874=>1000,48875=>1000,48876=>1000,48877=>1000,48878=>1000,48879=>1000,48880=>1000,48881=>1000,48882=>1000,48883=>1000,48884=>1000,48885=>1000,48886=>1000,48887=>1000,48888=>1000,48889=>1000,48890=>1000,48891=>1000,48892=>1000,48893=>1000,48894=>1000,48895=>1000,48896=>1000,48897=>1000,48898=>1000,48899=>1000,48900=>1000,48901=>1000,48902=>1000,48903=>1000,48904=>1000,48905=>1000,48906=>1000,48907=>1000,48908=>1000,48909=>1000,48910=>1000,48911=>1000,48912=>1000,48913=>1000,48914=>1000,48915=>1000,48916=>1000,48917=>1000,48918=>1000,48919=>1000,48920=>1000,48921=>1000,48922=>1000,48923=>1000,48924=>1000,48925=>1000,48926=>1000,48927=>1000,48928=>1000,48929=>1000,48930=>1000,48931=>1000,48932=>1000,48933=>1000,48934=>1000,48935=>1000,48936=>1000,48937=>1000,48938=>1000,48939=>1000,48940=>1000,48941=>1000,48942=>1000,48943=>1000,48944=>1000,48945=>1000,48946=>1000,48947=>1000,48948=>1000,48949=>1000,48950=>1000,48951=>1000,48952=>1000,48953=>1000,48954=>1000,48955=>1000,48956=>1000,48957=>1000,48958=>1000,48959=>1000,48960=>1000,48961=>1000,48962=>1000,48963=>1000,48964=>1000,48965=>1000,48966=>1000,48967=>1000,48968=>1000,48969=>1000,48970=>1000,48971=>1000,48972=>1000,48973=>1000,48974=>1000,48975=>1000,48976=>1000,48977=>1000,48978=>1000,48979=>1000,48980=>1000,48981=>1000,48982=>1000,48983=>1000,48984=>1000,48985=>1000,48986=>1000,48987=>1000,48988=>1000,48989=>1000,48990=>1000,48991=>1000,48992=>1000,48993=>1000,48994=>1000,48995=>1000,48996=>1000,48997=>1000,48998=>1000,48999=>1000,49000=>1000,49001=>1000,49002=>1000,49003=>1000,49004=>1000,49005=>1000,49006=>1000,49007=>1000,49008=>1000,49009=>1000,49010=>1000,49011=>1000,49012=>1000,49013=>1000,49014=>1000,49015=>1000,49016=>1000,49017=>1000,49018=>1000,49019=>1000,49020=>1000,49021=>1000,49022=>1000,49023=>1000,49024=>1000,49025=>1000,49026=>1000,49027=>1000,49028=>1000,49029=>1000,49030=>1000,49031=>1000,49032=>1000,49033=>1000,49034=>1000,49035=>1000,49036=>1000,49037=>1000,49038=>1000,49039=>1000,49040=>1000,49041=>1000,49042=>1000,49043=>1000,49044=>1000,49045=>1000,49046=>1000,49047=>1000,49048=>1000,49049=>1000,49050=>1000,49051=>1000,49052=>1000,49053=>1000,49054=>1000,49055=>1000,49056=>1000,49057=>1000,49058=>1000,49059=>1000,49060=>1000,49061=>1000,49062=>1000,49063=>1000,49064=>1000,49065=>1000,49066=>1000,49067=>1000,49068=>1000,49069=>1000,49070=>1000,49071=>1000,49072=>1000,49073=>1000,49074=>1000,49075=>1000,49076=>1000,49077=>1000,49078=>1000,49079=>1000,49080=>1000,49081=>1000,49082=>1000,49083=>1000,49084=>1000,49085=>1000,49086=>1000,49087=>1000,49088=>1000,49089=>1000,49090=>1000,49091=>1000,49092=>1000,49093=>1000,49094=>1000,49095=>1000,49096=>1000,49097=>1000,49098=>1000,49099=>1000,49100=>1000,49101=>1000,49102=>1000,49103=>1000,49104=>1000,49105=>1000,49106=>1000,49107=>1000,49108=>1000,49109=>1000,49110=>1000,49111=>1000,49112=>1000,49113=>1000,49114=>1000,49115=>1000,49116=>1000,49117=>1000,49118=>1000,49119=>1000,49120=>1000,49121=>1000,49122=>1000,49123=>1000,49124=>1000,49125=>1000,49126=>1000,49127=>1000,49128=>1000,49129=>1000,49130=>1000,49131=>1000,49132=>1000,49133=>1000,49134=>1000,49135=>1000,49136=>1000,49137=>1000,49138=>1000,49139=>1000,49140=>1000,49141=>1000,49142=>1000,49143=>1000,49144=>1000,49145=>1000,49146=>1000,49147=>1000,49148=>1000,49149=>1000,49150=>1000,49151=>1000,49152=>1000,49153=>1000,49154=>1000,49155=>1000,49156=>1000,49157=>1000,49158=>1000,49159=>1000,49160=>1000,49161=>1000,49162=>1000,49163=>1000,49164=>1000,49165=>1000,49166=>1000,49167=>1000,49168=>1000,49169=>1000,49170=>1000,49171=>1000,49172=>1000,49173=>1000,49174=>1000,49175=>1000,49176=>1000,49177=>1000,49178=>1000,49179=>1000,49180=>1000,49181=>1000,49182=>1000,49183=>1000,49184=>1000,49185=>1000,49186=>1000,49187=>1000,49188=>1000,49189=>1000,49190=>1000,49191=>1000,49192=>1000,49193=>1000,49194=>1000,49195=>1000,49196=>1000,49197=>1000,49198=>1000,49199=>1000,49200=>1000,49201=>1000,49202=>1000,49203=>1000,49204=>1000,49205=>1000,49206=>1000,49207=>1000,49208=>1000,49209=>1000,49210=>1000,49211=>1000,49212=>1000,49213=>1000,49214=>1000,49215=>1000,49216=>1000,49217=>1000,49218=>1000,49219=>1000,49220=>1000,49221=>1000,49222=>1000,49223=>1000,49224=>1000,49225=>1000,49226=>1000,49227=>1000,49228=>1000,49229=>1000,49230=>1000,49231=>1000,49232=>1000,49233=>1000,49234=>1000,49235=>1000,49236=>1000,49237=>1000,49238=>1000,49239=>1000,49240=>1000,49241=>1000,49242=>1000,49243=>1000,49244=>1000,49245=>1000,49246=>1000,49247=>1000,49248=>1000,49249=>1000,49250=>1000,49251=>1000,49252=>1000,49253=>1000,49254=>1000,49255=>1000,49256=>1000,49257=>1000,49258=>1000,49259=>1000,49260=>1000,49261=>1000,49262=>1000,49263=>1000,49264=>1000,49265=>1000,49266=>1000,49267=>1000,49268=>1000,49269=>1000,49270=>1000,49271=>1000,49272=>1000,49273=>1000,49274=>1000,49275=>1000,49276=>1000,49277=>1000,49278=>1000,49279=>1000,49280=>1000,49281=>1000,49282=>1000,49283=>1000,49284=>1000,49285=>1000,49286=>1000,49287=>1000,49288=>1000,49289=>1000,49290=>1000,49291=>1000,49292=>1000,49293=>1000,49294=>1000,49295=>1000,49296=>1000,49297=>1000,49298=>1000,49299=>1000,49300=>1000,49301=>1000,49302=>1000,49303=>1000,49304=>1000,49305=>1000,49306=>1000,49307=>1000,49308=>1000,49309=>1000,49310=>1000,49311=>1000,49312=>1000,49313=>1000,49314=>1000,49315=>1000,49316=>1000,49317=>1000,49318=>1000,49319=>1000,49320=>1000,49321=>1000,49322=>1000,49323=>1000,49324=>1000,49325=>1000,49326=>1000,49327=>1000,49328=>1000,49329=>1000,49330=>1000,49331=>1000,49332=>1000,49333=>1000,49334=>1000,49335=>1000,49336=>1000,49337=>1000,49338=>1000,49339=>1000,49340=>1000,49341=>1000,49342=>1000,49343=>1000,49344=>1000,49345=>1000,49346=>1000,49347=>1000,49348=>1000,49349=>1000,49350=>1000,49351=>1000,49352=>1000,49353=>1000,49354=>1000,49355=>1000,49356=>1000,49357=>1000,49358=>1000,49359=>1000,49360=>1000,49361=>1000,49362=>1000,49363=>1000,49364=>1000,49365=>1000,49366=>1000,49367=>1000,49368=>1000,49369=>1000,49370=>1000,49371=>1000,49372=>1000,49373=>1000,49374=>1000,49375=>1000,49376=>1000,49377=>1000,49378=>1000,49379=>1000,49380=>1000,49381=>1000,49382=>1000,49383=>1000,49384=>1000,49385=>1000,49386=>1000,49387=>1000,49388=>1000,49389=>1000,49390=>1000,49391=>1000,49392=>1000,49393=>1000,49394=>1000,49395=>1000,49396=>1000,49397=>1000,49398=>1000,49399=>1000,49400=>1000,49401=>1000,49402=>1000,49403=>1000,49404=>1000,49405=>1000,49406=>1000,49407=>1000,49408=>1000,49409=>1000,49410=>1000,49411=>1000,49412=>1000,49413=>1000,49414=>1000,49415=>1000,49416=>1000,49417=>1000,49418=>1000,49419=>1000,49420=>1000,49421=>1000,49422=>1000,49423=>1000,49424=>1000,49425=>1000,49426=>1000,49427=>1000,49428=>1000,49429=>1000,49430=>1000,49431=>1000,49432=>1000,49433=>1000,49434=>1000,49435=>1000,49436=>1000,49437=>1000,49438=>1000,49439=>1000,49440=>1000,49441=>1000,49442=>1000,49443=>1000,49444=>1000,49445=>1000,49446=>1000,49447=>1000,49448=>1000,49449=>1000,49450=>1000,49451=>1000,49452=>1000,49453=>1000,49454=>1000,49455=>1000,49456=>1000,49457=>1000,49458=>1000,49459=>1000,49460=>1000,49461=>1000,49462=>1000,49463=>1000,49464=>1000,49465=>1000,49466=>1000,49467=>1000,49468=>1000,49469=>1000,49470=>1000,49471=>1000,49472=>1000,49473=>1000,49474=>1000,49475=>1000,49476=>1000,49477=>1000,49478=>1000,49479=>1000,49480=>1000,49481=>1000,49482=>1000,49483=>1000,49484=>1000,49485=>1000,49486=>1000,49487=>1000,49488=>1000,49489=>1000,49490=>1000,49491=>1000,49492=>1000,49493=>1000,49494=>1000,49495=>1000,49496=>1000,49497=>1000,49498=>1000,49499=>1000,49500=>1000,49501=>1000,49502=>1000,49503=>1000,49504=>1000,49505=>1000,49506=>1000,49507=>1000,49508=>1000,49509=>1000,49510=>1000,49511=>1000,49512=>1000,49513=>1000,49514=>1000,49515=>1000,49516=>1000,49517=>1000,49518=>1000,49519=>1000,49520=>1000,49521=>1000,49522=>1000,49523=>1000,49524=>1000,49525=>1000,49526=>1000,49527=>1000,49528=>1000,49529=>1000,49530=>1000,49531=>1000,49532=>1000,49533=>1000,49534=>1000,49535=>1000,49536=>1000,49537=>1000,49538=>1000,49539=>1000,49540=>1000,49541=>1000,49542=>1000,49543=>1000,49544=>1000,49545=>1000,49546=>1000,49547=>1000,49548=>1000,49549=>1000,49550=>1000,49551=>1000,49552=>1000,49553=>1000,49554=>1000,49555=>1000,49556=>1000,49557=>1000,49558=>1000,49559=>1000,49560=>1000,49561=>1000,49562=>1000,49563=>1000,49564=>1000,49565=>1000,49566=>1000,49567=>1000,49568=>1000,49569=>1000,49570=>1000,49571=>1000,49572=>1000,49573=>1000,49574=>1000,49575=>1000,49576=>1000,49577=>1000,49578=>1000,49579=>1000,49580=>1000,49581=>1000,49582=>1000,49583=>1000,49584=>1000,49585=>1000,49586=>1000,49587=>1000,49588=>1000,49589=>1000,49590=>1000,49591=>1000,49592=>1000,49593=>1000,49594=>1000,49595=>1000,49596=>1000,49597=>1000,49598=>1000,49599=>1000,49600=>1000,49601=>1000,49602=>1000,49603=>1000,49604=>1000,49605=>1000,49606=>1000,49607=>1000,49608=>1000,49609=>1000,49610=>1000,49611=>1000,49612=>1000,49613=>1000,49614=>1000,49615=>1000,49616=>1000,49617=>1000,49618=>1000,49619=>1000,49620=>1000,49621=>1000,49622=>1000,49623=>1000,49624=>1000,49625=>1000,49626=>1000,49627=>1000,49628=>1000,49629=>1000,49630=>1000,49631=>1000,49632=>1000,49633=>1000,49634=>1000,49635=>1000,49636=>1000,49637=>1000,49638=>1000,49639=>1000,49640=>1000,49641=>1000,49642=>1000,49643=>1000,49644=>1000,49645=>1000,49646=>1000,49647=>1000,49648=>1000,49649=>1000,49650=>1000,49651=>1000,49652=>1000,49653=>1000,49654=>1000,49655=>1000,49656=>1000,49657=>1000,49658=>1000,49659=>1000,49660=>1000,49661=>1000,49662=>1000,49663=>1000,49664=>1000,49665=>1000,49666=>1000,49667=>1000,49668=>1000,49669=>1000,49670=>1000,49671=>1000,49672=>1000,49673=>1000,49674=>1000,49675=>1000,49676=>1000,49677=>1000,49678=>1000,49679=>1000,49680=>1000,49681=>1000,49682=>1000,49683=>1000,49684=>1000,49685=>1000,49686=>1000,49687=>1000,49688=>1000,49689=>1000,49690=>1000,49691=>1000,49692=>1000,49693=>1000,49694=>1000,49695=>1000,49696=>1000,49697=>1000,49698=>1000,49699=>1000,49700=>1000,49701=>1000,49702=>1000,49703=>1000,49704=>1000,49705=>1000,49706=>1000,49707=>1000,49708=>1000,49709=>1000,49710=>1000,49711=>1000,49712=>1000,49713=>1000,49714=>1000,49715=>1000,49716=>1000,49717=>1000,49718=>1000,49719=>1000,49720=>1000,49721=>1000,49722=>1000,49723=>1000,49724=>1000,49725=>1000,49726=>1000,49727=>1000,49728=>1000,49729=>1000,49730=>1000,49731=>1000,49732=>1000,49733=>1000,49734=>1000,49735=>1000,49736=>1000,49737=>1000,49738=>1000,49739=>1000,49740=>1000,49741=>1000,49742=>1000,49743=>1000,49744=>1000,49745=>1000,49746=>1000,49747=>1000,49748=>1000,49749=>1000,49750=>1000,49751=>1000,49752=>1000,49753=>1000,49754=>1000,49755=>1000,49756=>1000,49757=>1000,49758=>1000,49759=>1000,49760=>1000,49761=>1000,49762=>1000,49763=>1000,49764=>1000,49765=>1000,49766=>1000,49767=>1000,49768=>1000,49769=>1000,49770=>1000,49771=>1000,49772=>1000,49773=>1000,49774=>1000,49775=>1000,49776=>1000,49777=>1000,49778=>1000,49779=>1000,49780=>1000,49781=>1000,49782=>1000,49783=>1000,49784=>1000,49785=>1000,49786=>1000,49787=>1000,49788=>1000,49789=>1000,49790=>1000,49791=>1000,49792=>1000,49793=>1000,49794=>1000,49795=>1000,49796=>1000,49797=>1000,49798=>1000,49799=>1000,49800=>1000,49801=>1000,49802=>1000,49803=>1000,49804=>1000,49805=>1000,49806=>1000,49807=>1000,49808=>1000,49809=>1000,49810=>1000,49811=>1000,49812=>1000,49813=>1000,49814=>1000,49815=>1000,49816=>1000,49817=>1000,49818=>1000,49819=>1000,49820=>1000,49821=>1000,49822=>1000,49823=>1000,49824=>1000,49825=>1000,49826=>1000,49827=>1000,49828=>1000,49829=>1000,49830=>1000,49831=>1000,49832=>1000,49833=>1000,49834=>1000,49835=>1000,49836=>1000,49837=>1000,49838=>1000,49839=>1000,49840=>1000,49841=>1000,49842=>1000,49843=>1000,49844=>1000,49845=>1000,49846=>1000,49847=>1000,49848=>1000,49849=>1000,49850=>1000,49851=>1000,49852=>1000,49853=>1000,49854=>1000,49855=>1000,49856=>1000,49857=>1000,49858=>1000,49859=>1000,49860=>1000,49861=>1000,49862=>1000,49863=>1000,49864=>1000,49865=>1000,49866=>1000,49867=>1000,49868=>1000,49869=>1000,49870=>1000,49871=>1000,49872=>1000,49873=>1000,49874=>1000,49875=>1000,49876=>1000,49877=>1000,49878=>1000,49879=>1000,49880=>1000,49881=>1000,49882=>1000,49883=>1000,49884=>1000,49885=>1000,49886=>1000,49887=>1000,49888=>1000,49889=>1000,49890=>1000,49891=>1000,49892=>1000,49893=>1000,49894=>1000,49895=>1000,49896=>1000,49897=>1000,49898=>1000,49899=>1000,49900=>1000,49901=>1000,49902=>1000,49903=>1000,49904=>1000,49905=>1000,49906=>1000,49907=>1000,49908=>1000,49909=>1000,49910=>1000,49911=>1000,49912=>1000,49913=>1000,49914=>1000,49915=>1000,49916=>1000,49917=>1000,49918=>1000,49919=>1000,49920=>1000,49921=>1000,49922=>1000,49923=>1000,49924=>1000,49925=>1000,49926=>1000,49927=>1000,49928=>1000,49929=>1000,49930=>1000,49931=>1000,49932=>1000,49933=>1000,49934=>1000,49935=>1000,49936=>1000,49937=>1000,49938=>1000,49939=>1000,49940=>1000,49941=>1000,49942=>1000,49943=>1000,49944=>1000,49945=>1000,49946=>1000,49947=>1000,49948=>1000,49949=>1000,49950=>1000,49951=>1000,49952=>1000,49953=>1000,49954=>1000,49955=>1000,49956=>1000,49957=>1000,49958=>1000,49959=>1000,49960=>1000,49961=>1000,49962=>1000,49963=>1000,49964=>1000,49965=>1000,49966=>1000,49967=>1000,49968=>1000,49969=>1000,49970=>1000,49971=>1000,49972=>1000,49973=>1000,49974=>1000,49975=>1000,49976=>1000,49977=>1000,49978=>1000,49979=>1000,49980=>1000,49981=>1000,49982=>1000,49983=>1000,49984=>1000,49985=>1000,49986=>1000,49987=>1000,49988=>1000,49989=>1000,49990=>1000,49991=>1000,49992=>1000,49993=>1000,49994=>1000,49995=>1000,49996=>1000,49997=>1000,49998=>1000,49999=>1000,50000=>1000,50001=>1000,50002=>1000,50003=>1000,50004=>1000,50005=>1000,50006=>1000,50007=>1000,50008=>1000,50009=>1000,50010=>1000,50011=>1000,50012=>1000,50013=>1000,50014=>1000,50015=>1000,50016=>1000,50017=>1000,50018=>1000,50019=>1000,50020=>1000,50021=>1000,50022=>1000,50023=>1000,50024=>1000,50025=>1000,50026=>1000,50027=>1000,50028=>1000,50029=>1000,50030=>1000,50031=>1000,50032=>1000,50033=>1000,50034=>1000,50035=>1000,50036=>1000,50037=>1000,50038=>1000,50039=>1000,50040=>1000,50041=>1000,50042=>1000,50043=>1000,50044=>1000,50045=>1000,50046=>1000,50047=>1000,50048=>1000,50049=>1000,50050=>1000,50051=>1000,50052=>1000,50053=>1000,50054=>1000,50055=>1000,50056=>1000,50057=>1000,50058=>1000,50059=>1000,50060=>1000,50061=>1000,50062=>1000,50063=>1000,50064=>1000,50065=>1000,50066=>1000,50067=>1000,50068=>1000,50069=>1000,50070=>1000,50071=>1000,50072=>1000,50073=>1000,50074=>1000,50075=>1000,50076=>1000,50077=>1000,50078=>1000,50079=>1000,50080=>1000,50081=>1000,50082=>1000,50083=>1000,50084=>1000,50085=>1000,50086=>1000,50087=>1000,50088=>1000,50089=>1000,50090=>1000,50091=>1000,50092=>1000,50093=>1000,50094=>1000,50095=>1000,50096=>1000,50097=>1000,50098=>1000,50099=>1000,50100=>1000,50101=>1000,50102=>1000,50103=>1000,50104=>1000,50105=>1000,50106=>1000,50107=>1000,50108=>1000,50109=>1000,50110=>1000,50111=>1000,50112=>1000,50113=>1000,50114=>1000,50115=>1000,50116=>1000,50117=>1000,50118=>1000,50119=>1000,50120=>1000,50121=>1000,50122=>1000,50123=>1000,50124=>1000,50125=>1000,50126=>1000,50127=>1000,50128=>1000,50129=>1000,50130=>1000,50131=>1000,50132=>1000,50133=>1000,50134=>1000,50135=>1000,50136=>1000,50137=>1000,50138=>1000,50139=>1000,50140=>1000,50141=>1000,50142=>1000,50143=>1000,50144=>1000,50145=>1000,50146=>1000,50147=>1000,50148=>1000,50149=>1000,50150=>1000,50151=>1000,50152=>1000,50153=>1000,50154=>1000,50155=>1000,50156=>1000,50157=>1000,50158=>1000,50159=>1000,50160=>1000,50161=>1000,50162=>1000,50163=>1000,50164=>1000,50165=>1000,50166=>1000,50167=>1000,50168=>1000,50169=>1000,50170=>1000,50171=>1000,50172=>1000,50173=>1000,50174=>1000,50175=>1000,50176=>1000,50177=>1000,50178=>1000,50179=>1000,50180=>1000,50181=>1000,50182=>1000,50183=>1000,50184=>1000,50185=>1000,50186=>1000,50187=>1000,50188=>1000,50189=>1000,50190=>1000,50191=>1000,50192=>1000,50193=>1000,50194=>1000,50195=>1000,50196=>1000,50197=>1000,50198=>1000,50199=>1000,50200=>1000,50201=>1000,50202=>1000,50203=>1000,50204=>1000,50205=>1000,50206=>1000,50207=>1000,50208=>1000,50209=>1000,50210=>1000,50211=>1000,50212=>1000,50213=>1000,50214=>1000,50215=>1000,50216=>1000,50217=>1000,50218=>1000,50219=>1000,50220=>1000,50221=>1000,50222=>1000,50223=>1000,50224=>1000,50225=>1000,50226=>1000,50227=>1000,50228=>1000,50229=>1000,50230=>1000,50231=>1000,50232=>1000,50233=>1000,50234=>1000,50235=>1000,50236=>1000,50237=>1000,50238=>1000,50239=>1000,50240=>1000,50241=>1000,50242=>1000,50243=>1000,50244=>1000,50245=>1000,50246=>1000,50247=>1000,50248=>1000,50249=>1000,50250=>1000,50251=>1000,50252=>1000,50253=>1000,50254=>1000,50255=>1000,50256=>1000,50257=>1000,50258=>1000,50259=>1000,50260=>1000,50261=>1000,50262=>1000,50263=>1000,50264=>1000,50265=>1000,50266=>1000,50267=>1000,50268=>1000,50269=>1000,50270=>1000,50271=>1000,50272=>1000,50273=>1000,50274=>1000,50275=>1000,50276=>1000,50277=>1000,50278=>1000,50279=>1000,50280=>1000,50281=>1000,50282=>1000,50283=>1000,50284=>1000,50285=>1000,50286=>1000,50287=>1000,50288=>1000,50289=>1000,50290=>1000,50291=>1000,50292=>1000,50293=>1000,50294=>1000,50295=>1000,50296=>1000,50297=>1000,50298=>1000,50299=>1000,50300=>1000,50301=>1000,50302=>1000,50303=>1000,50304=>1000,50305=>1000,50306=>1000,50307=>1000,50308=>1000,50309=>1000,50310=>1000,50311=>1000,50312=>1000,50313=>1000,50314=>1000,50315=>1000,50316=>1000,50317=>1000,50318=>1000,50319=>1000,50320=>1000,50321=>1000,50322=>1000,50323=>1000,50324=>1000,50325=>1000,50326=>1000,50327=>1000,50328=>1000,50329=>1000,50330=>1000,50331=>1000,50332=>1000,50333=>1000,50334=>1000,50335=>1000,50336=>1000,50337=>1000,50338=>1000,50339=>1000,50340=>1000,50341=>1000,50342=>1000,50343=>1000,50344=>1000,50345=>1000,50346=>1000,50347=>1000,50348=>1000,50349=>1000,50350=>1000,50351=>1000,50352=>1000,50353=>1000,50354=>1000,50355=>1000,50356=>1000,50357=>1000,50358=>1000,50359=>1000,50360=>1000,50361=>1000,50362=>1000,50363=>1000,50364=>1000,50365=>1000,50366=>1000,50367=>1000,50368=>1000,50369=>1000,50370=>1000,50371=>1000,50372=>1000,50373=>1000,50374=>1000,50375=>1000,50376=>1000,50377=>1000,50378=>1000,50379=>1000,50380=>1000,50381=>1000,50382=>1000,50383=>1000,50384=>1000,50385=>1000,50386=>1000,50387=>1000,50388=>1000,50389=>1000,50390=>1000,50391=>1000,50392=>1000,50393=>1000,50394=>1000,50395=>1000,50396=>1000,50397=>1000,50398=>1000,50399=>1000,50400=>1000,50401=>1000,50402=>1000,50403=>1000,50404=>1000,50405=>1000,50406=>1000,50407=>1000,50408=>1000,50409=>1000,50410=>1000,50411=>1000,50412=>1000,50413=>1000,50414=>1000,50415=>1000,50416=>1000,50417=>1000,50418=>1000,50419=>1000,50420=>1000,50421=>1000,50422=>1000,50423=>1000,50424=>1000,50425=>1000,50426=>1000,50427=>1000,50428=>1000,50429=>1000,50430=>1000,50431=>1000,50432=>1000,50433=>1000,50434=>1000,50435=>1000,50436=>1000,50437=>1000,50438=>1000,50439=>1000,50440=>1000,50441=>1000,50442=>1000,50443=>1000,50444=>1000,50445=>1000,50446=>1000,50447=>1000,50448=>1000,50449=>1000,50450=>1000,50451=>1000,50452=>1000,50453=>1000,50454=>1000,50455=>1000,50456=>1000,50457=>1000,50458=>1000,50459=>1000,50460=>1000,50461=>1000,50462=>1000,50463=>1000,50464=>1000,50465=>1000,50466=>1000,50467=>1000,50468=>1000,50469=>1000,50470=>1000,50471=>1000,50472=>1000,50473=>1000,50474=>1000,50475=>1000,50476=>1000,50477=>1000,50478=>1000,50479=>1000,50480=>1000,50481=>1000,50482=>1000,50483=>1000,50484=>1000,50485=>1000,50486=>1000,50487=>1000,50488=>1000,50489=>1000,50490=>1000,50491=>1000,50492=>1000,50493=>1000,50494=>1000,50495=>1000,50496=>1000,50497=>1000,50498=>1000,50499=>1000,50500=>1000,50501=>1000,50502=>1000,50503=>1000,50504=>1000,50505=>1000,50506=>1000,50507=>1000,50508=>1000,50509=>1000,50510=>1000,50511=>1000,50512=>1000,50513=>1000,50514=>1000,50515=>1000,50516=>1000,50517=>1000,50518=>1000,50519=>1000,50520=>1000,50521=>1000,50522=>1000,50523=>1000,50524=>1000,50525=>1000,50526=>1000,50527=>1000,50528=>1000,50529=>1000,50530=>1000,50531=>1000,50532=>1000,50533=>1000,50534=>1000,50535=>1000,50536=>1000,50537=>1000,50538=>1000,50539=>1000,50540=>1000,50541=>1000,50542=>1000,50543=>1000,50544=>1000,50545=>1000,50546=>1000,50547=>1000,50548=>1000,50549=>1000,50550=>1000,50551=>1000,50552=>1000,50553=>1000,50554=>1000,50555=>1000,50556=>1000,50557=>1000,50558=>1000,50559=>1000,50560=>1000,50561=>1000,50562=>1000,50563=>1000,50564=>1000,50565=>1000,50566=>1000,50567=>1000,50568=>1000,50569=>1000,50570=>1000,50571=>1000,50572=>1000,50573=>1000,50574=>1000,50575=>1000,50576=>1000,50577=>1000,50578=>1000,50579=>1000,50580=>1000,50581=>1000,50582=>1000,50583=>1000,50584=>1000,50585=>1000,50586=>1000,50587=>1000,50588=>1000,50589=>1000,50590=>1000,50591=>1000,50592=>1000,50593=>1000,50594=>1000,50595=>1000,50596=>1000,50597=>1000,50598=>1000,50599=>1000,50600=>1000,50601=>1000,50602=>1000,50603=>1000,50604=>1000,50605=>1000,50606=>1000,50607=>1000,50608=>1000,50609=>1000,50610=>1000,50611=>1000,50612=>1000,50613=>1000,50614=>1000,50615=>1000,50616=>1000,50617=>1000,50618=>1000,50619=>1000,50620=>1000,50621=>1000,50622=>1000,50623=>1000,50624=>1000,50625=>1000,50626=>1000,50627=>1000,50628=>1000,50629=>1000,50630=>1000,50631=>1000,50632=>1000,50633=>1000,50634=>1000,50635=>1000,50636=>1000,50637=>1000,50638=>1000,50639=>1000,50640=>1000,50641=>1000,50642=>1000,50643=>1000,50644=>1000,50645=>1000,50646=>1000,50647=>1000,50648=>1000,50649=>1000,50650=>1000,50651=>1000,50652=>1000,50653=>1000,50654=>1000,50655=>1000,50656=>1000,50657=>1000,50658=>1000,50659=>1000,50660=>1000,50661=>1000,50662=>1000,50663=>1000,50664=>1000,50665=>1000,50666=>1000,50667=>1000,50668=>1000,50669=>1000,50670=>1000,50671=>1000,50672=>1000,50673=>1000,50674=>1000,50675=>1000,50676=>1000,50677=>1000,50678=>1000,50679=>1000,50680=>1000,50681=>1000,50682=>1000,50683=>1000,50684=>1000,50685=>1000,50686=>1000,50687=>1000,50688=>1000,50689=>1000,50690=>1000,50691=>1000,50692=>1000,50693=>1000,50694=>1000,50695=>1000,50696=>1000,50697=>1000,50698=>1000,50699=>1000,50700=>1000,50701=>1000,50702=>1000,50703=>1000,50704=>1000,50705=>1000,50706=>1000,50707=>1000,50708=>1000,50709=>1000,50710=>1000,50711=>1000,50712=>1000,50713=>1000,50714=>1000,50715=>1000,50716=>1000,50717=>1000,50718=>1000,50719=>1000,50720=>1000,50721=>1000,50722=>1000,50723=>1000,50724=>1000,50725=>1000,50726=>1000,50727=>1000,50728=>1000,50729=>1000,50730=>1000,50731=>1000,50732=>1000,50733=>1000,50734=>1000,50735=>1000,50736=>1000,50737=>1000,50738=>1000,50739=>1000,50740=>1000,50741=>1000,50742=>1000,50743=>1000,50744=>1000,50745=>1000,50746=>1000,50747=>1000,50748=>1000,50749=>1000,50750=>1000,50751=>1000,50752=>1000,50753=>1000,50754=>1000,50755=>1000,50756=>1000,50757=>1000,50758=>1000,50759=>1000,50760=>1000,50761=>1000,50762=>1000,50763=>1000,50764=>1000,50765=>1000,50766=>1000,50767=>1000,50768=>1000,50769=>1000,50770=>1000,50771=>1000,50772=>1000,50773=>1000,50774=>1000,50775=>1000,50776=>1000,50777=>1000,50778=>1000,50779=>1000,50780=>1000,50781=>1000,50782=>1000,50783=>1000,50784=>1000,50785=>1000,50786=>1000,50787=>1000,50788=>1000,50789=>1000,50790=>1000,50791=>1000,50792=>1000,50793=>1000,50794=>1000,50795=>1000,50796=>1000,50797=>1000,50798=>1000,50799=>1000,50800=>1000,50801=>1000,50802=>1000,50803=>1000,50804=>1000,50805=>1000,50806=>1000,50807=>1000,50808=>1000,50809=>1000,50810=>1000,50811=>1000,50812=>1000,50813=>1000,50814=>1000,50815=>1000,50816=>1000,50817=>1000,50818=>1000,50819=>1000,50820=>1000,50821=>1000,50822=>1000,50823=>1000,50824=>1000,50825=>1000,50826=>1000,50827=>1000,50828=>1000,50829=>1000,50830=>1000,50831=>1000,50832=>1000,50833=>1000,50834=>1000,50835=>1000,50836=>1000,50837=>1000,50838=>1000,50839=>1000,50840=>1000,50841=>1000,50842=>1000,50843=>1000,50844=>1000,50845=>1000,50846=>1000,50847=>1000,50848=>1000,50849=>1000,50850=>1000,50851=>1000,50852=>1000,50853=>1000,50854=>1000,50855=>1000,50856=>1000,50857=>1000,50858=>1000,50859=>1000,50860=>1000,50861=>1000,50862=>1000,50863=>1000,50864=>1000,50865=>1000,50866=>1000,50867=>1000,50868=>1000,50869=>1000,50870=>1000,50871=>1000,50872=>1000,50873=>1000,50874=>1000,50875=>1000,50876=>1000,50877=>1000,50878=>1000,50879=>1000,50880=>1000,50881=>1000,50882=>1000,50883=>1000,50884=>1000,50885=>1000,50886=>1000,50887=>1000,50888=>1000,50889=>1000,50890=>1000,50891=>1000,50892=>1000,50893=>1000,50894=>1000,50895=>1000,50896=>1000,50897=>1000,50898=>1000,50899=>1000,50900=>1000,50901=>1000,50902=>1000,50903=>1000,50904=>1000,50905=>1000,50906=>1000,50907=>1000,50908=>1000,50909=>1000,50910=>1000,50911=>1000,50912=>1000,50913=>1000,50914=>1000,50915=>1000,50916=>1000,50917=>1000,50918=>1000,50919=>1000,50920=>1000,50921=>1000,50922=>1000,50923=>1000,50924=>1000,50925=>1000,50926=>1000,50927=>1000,50928=>1000,50929=>1000,50930=>1000,50931=>1000,50932=>1000,50933=>1000,50934=>1000,50935=>1000,50936=>1000,50937=>1000,50938=>1000,50939=>1000,50940=>1000,50941=>1000,50942=>1000,50943=>1000,50944=>1000,50945=>1000,50946=>1000,50947=>1000,50948=>1000,50949=>1000,50950=>1000,50951=>1000,50952=>1000,50953=>1000,50954=>1000,50955=>1000,50956=>1000,50957=>1000,50958=>1000,50959=>1000,50960=>1000,50961=>1000,50962=>1000,50963=>1000,50964=>1000,50965=>1000,50966=>1000,50967=>1000,50968=>1000,50969=>1000,50970=>1000,50971=>1000,50972=>1000,50973=>1000,50974=>1000,50975=>1000,50976=>1000,50977=>1000,50978=>1000,50979=>1000,50980=>1000,50981=>1000,50982=>1000,50983=>1000,50984=>1000,50985=>1000,50986=>1000,50987=>1000,50988=>1000,50989=>1000,50990=>1000,50991=>1000,50992=>1000,50993=>1000,50994=>1000,50995=>1000,50996=>1000,50997=>1000,50998=>1000,50999=>1000,51000=>1000,51001=>1000,51002=>1000,51003=>1000,51004=>1000,51005=>1000,51006=>1000,51007=>1000,51008=>1000,51009=>1000,51010=>1000,51011=>1000,51012=>1000,51013=>1000,51014=>1000,51015=>1000,51016=>1000,51017=>1000,51018=>1000,51019=>1000,51020=>1000,51021=>1000,51022=>1000,51023=>1000,51024=>1000,51025=>1000,51026=>1000,51027=>1000,51028=>1000,51029=>1000,51030=>1000,51031=>1000,51032=>1000,51033=>1000,51034=>1000,51035=>1000,51036=>1000,51037=>1000,51038=>1000,51039=>1000,51040=>1000,51041=>1000,51042=>1000,51043=>1000,51044=>1000,51045=>1000,51046=>1000,51047=>1000,51048=>1000,51049=>1000,51050=>1000,51051=>1000,51052=>1000,51053=>1000,51054=>1000,51055=>1000,51056=>1000,51057=>1000,51058=>1000,51059=>1000,51060=>1000,51061=>1000,51062=>1000,51063=>1000,51064=>1000,51065=>1000,51066=>1000,51067=>1000,51068=>1000,51069=>1000,51070=>1000,51071=>1000,51072=>1000,51073=>1000,51074=>1000,51075=>1000,51076=>1000,51077=>1000,51078=>1000,51079=>1000,51080=>1000,51081=>1000,51082=>1000,51083=>1000,51084=>1000,51085=>1000,51086=>1000,51087=>1000,51088=>1000,51089=>1000,51090=>1000,51091=>1000,51092=>1000,51093=>1000,51094=>1000,51095=>1000,51096=>1000,51097=>1000,51098=>1000,51099=>1000,51100=>1000,51101=>1000,51102=>1000,51103=>1000,51104=>1000,51105=>1000,51106=>1000,51107=>1000,51108=>1000,51109=>1000,51110=>1000,51111=>1000,51112=>1000,51113=>1000,51114=>1000,51115=>1000,51116=>1000,51117=>1000,51118=>1000,51119=>1000,51120=>1000,51121=>1000,51122=>1000,51123=>1000,51124=>1000,51125=>1000,51126=>1000,51127=>1000,51128=>1000,51129=>1000,51130=>1000,51131=>1000,51132=>1000,51133=>1000,51134=>1000,51135=>1000,51136=>1000,51137=>1000,51138=>1000,51139=>1000,51140=>1000,51141=>1000,51142=>1000,51143=>1000,51144=>1000,51145=>1000,51146=>1000,51147=>1000,51148=>1000,51149=>1000,51150=>1000,51151=>1000,51152=>1000,51153=>1000,51154=>1000,51155=>1000,51156=>1000,51157=>1000,51158=>1000,51159=>1000,51160=>1000,51161=>1000,51162=>1000,51163=>1000,51164=>1000,51165=>1000,51166=>1000,51167=>1000,51168=>1000,51169=>1000,51170=>1000,51171=>1000,51172=>1000,51173=>1000,51174=>1000,51175=>1000,51176=>1000,51177=>1000,51178=>1000,51179=>1000,51180=>1000,51181=>1000,51182=>1000,51183=>1000,51184=>1000,51185=>1000,51186=>1000,51187=>1000,51188=>1000,51189=>1000,51190=>1000,51191=>1000,51192=>1000,51193=>1000,51194=>1000,51195=>1000,51196=>1000,51197=>1000,51198=>1000,51199=>1000,51200=>1000,51201=>1000,51202=>1000,51203=>1000,51204=>1000,51205=>1000,51206=>1000,51207=>1000,51208=>1000,51209=>1000,51210=>1000,51211=>1000,51212=>1000,51213=>1000,51214=>1000,51215=>1000,51216=>1000,51217=>1000,51218=>1000,51219=>1000,51220=>1000,51221=>1000,51222=>1000,51223=>1000,51224=>1000,51225=>1000,51226=>1000,51227=>1000,51228=>1000,51229=>1000,51230=>1000,51231=>1000,51232=>1000,51233=>1000,51234=>1000,51235=>1000,51236=>1000,51237=>1000,51238=>1000,51239=>1000,51240=>1000,51241=>1000,51242=>1000,51243=>1000,51244=>1000,51245=>1000,51246=>1000,51247=>1000,51248=>1000,51249=>1000,51250=>1000,51251=>1000,51252=>1000,51253=>1000,51254=>1000,51255=>1000,51256=>1000,51257=>1000,51258=>1000,51259=>1000,51260=>1000,51261=>1000,51262=>1000,51263=>1000,51264=>1000,51265=>1000,51266=>1000,51267=>1000,51268=>1000,51269=>1000,51270=>1000,51271=>1000,51272=>1000,51273=>1000,51274=>1000,51275=>1000,51276=>1000,51277=>1000,51278=>1000,51279=>1000,51280=>1000,51281=>1000,51282=>1000,51283=>1000,51284=>1000,51285=>1000,51286=>1000,51287=>1000,51288=>1000,51289=>1000,51290=>1000,51291=>1000,51292=>1000,51293=>1000,51294=>1000,51295=>1000,51296=>1000,51297=>1000,51298=>1000,51299=>1000,51300=>1000,51301=>1000,51302=>1000,51303=>1000,51304=>1000,51305=>1000,51306=>1000,51307=>1000,51308=>1000,51309=>1000,51310=>1000,51311=>1000,51312=>1000,51313=>1000,51314=>1000,51315=>1000,51316=>1000,51317=>1000,51318=>1000,51319=>1000,51320=>1000,51321=>1000,51322=>1000,51323=>1000,51324=>1000,51325=>1000,51326=>1000,51327=>1000,51328=>1000,51329=>1000,51330=>1000,51331=>1000,51332=>1000,51333=>1000,51334=>1000,51335=>1000,51336=>1000,51337=>1000,51338=>1000,51339=>1000,51340=>1000,51341=>1000,51342=>1000,51343=>1000,51344=>1000,51345=>1000,51346=>1000,51347=>1000,51348=>1000,51349=>1000,51350=>1000,51351=>1000,51352=>1000,51353=>1000,51354=>1000,51355=>1000,51356=>1000,51357=>1000,51358=>1000,51359=>1000,51360=>1000,51361=>1000,51362=>1000,51363=>1000,51364=>1000,51365=>1000,51366=>1000,51367=>1000,51368=>1000,51369=>1000,51370=>1000,51371=>1000,51372=>1000,51373=>1000,51374=>1000,51375=>1000,51376=>1000,51377=>1000,51378=>1000,51379=>1000,51380=>1000,51381=>1000,51382=>1000,51383=>1000,51384=>1000,51385=>1000,51386=>1000,51387=>1000,51388=>1000,51389=>1000,51390=>1000,51391=>1000,51392=>1000,51393=>1000,51394=>1000,51395=>1000,51396=>1000,51397=>1000,51398=>1000,51399=>1000,51400=>1000,51401=>1000,51402=>1000,51403=>1000,51404=>1000,51405=>1000,51406=>1000,51407=>1000,51408=>1000,51409=>1000,51410=>1000,51411=>1000,51412=>1000,51413=>1000,51414=>1000,51415=>1000,51416=>1000,51417=>1000,51418=>1000,51419=>1000,51420=>1000,51421=>1000,51422=>1000,51423=>1000,51424=>1000,51425=>1000,51426=>1000,51427=>1000,51428=>1000,51429=>1000,51430=>1000,51431=>1000,51432=>1000,51433=>1000,51434=>1000,51435=>1000,51436=>1000,51437=>1000,51438=>1000,51439=>1000,51440=>1000,51441=>1000,51442=>1000,51443=>1000,51444=>1000,51445=>1000,51446=>1000,51447=>1000,51448=>1000,51449=>1000,51450=>1000,51451=>1000,51452=>1000,51453=>1000,51454=>1000,51455=>1000,51456=>1000,51457=>1000,51458=>1000,51459=>1000,51460=>1000,51461=>1000,51462=>1000,51463=>1000,51464=>1000,51465=>1000,51466=>1000,51467=>1000,51468=>1000,51469=>1000,51470=>1000,51471=>1000,51472=>1000,51473=>1000,51474=>1000,51475=>1000,51476=>1000,51477=>1000,51478=>1000,51479=>1000,51480=>1000,51481=>1000,51482=>1000,51483=>1000,51484=>1000,51485=>1000,51486=>1000,51487=>1000,51488=>1000,51489=>1000,51490=>1000,51491=>1000,51492=>1000,51493=>1000,51494=>1000,51495=>1000,51496=>1000,51497=>1000,51498=>1000,51499=>1000,51500=>1000,51501=>1000,51502=>1000,51503=>1000,51504=>1000,51505=>1000,51506=>1000,51507=>1000,51508=>1000,51509=>1000,51510=>1000,51511=>1000,51512=>1000,51513=>1000,51514=>1000,51515=>1000,51516=>1000,51517=>1000,51518=>1000,51519=>1000,51520=>1000,51521=>1000,51522=>1000,51523=>1000,51524=>1000,51525=>1000,51526=>1000,51527=>1000,51528=>1000,51529=>1000,51530=>1000,51531=>1000,51532=>1000,51533=>1000,51534=>1000,51535=>1000,51536=>1000,51537=>1000,51538=>1000,51539=>1000,51540=>1000,51541=>1000,51542=>1000,51543=>1000,51544=>1000,51545=>1000,51546=>1000,51547=>1000,51548=>1000,51549=>1000,51550=>1000,51551=>1000,51552=>1000,51553=>1000,51554=>1000,51555=>1000,51556=>1000,51557=>1000,51558=>1000,51559=>1000,51560=>1000,51561=>1000,51562=>1000,51563=>1000,51564=>1000,51565=>1000,51566=>1000,51567=>1000,51568=>1000,51569=>1000,51570=>1000,51571=>1000,51572=>1000,51573=>1000,51574=>1000,51575=>1000,51576=>1000,51577=>1000,51578=>1000,51579=>1000,51580=>1000,51581=>1000,51582=>1000,51583=>1000,51584=>1000,51585=>1000,51586=>1000,51587=>1000,51588=>1000,51589=>1000,51590=>1000,51591=>1000,51592=>1000,51593=>1000,51594=>1000,51595=>1000,51596=>1000,51597=>1000,51598=>1000,51599=>1000,51600=>1000,51601=>1000,51602=>1000,51603=>1000,51604=>1000,51605=>1000,51606=>1000,51607=>1000,51608=>1000,51609=>1000,51610=>1000,51611=>1000,51612=>1000,51613=>1000,51614=>1000,51615=>1000,51616=>1000,51617=>1000,51618=>1000,51619=>1000,51620=>1000,51621=>1000,51622=>1000,51623=>1000,51624=>1000,51625=>1000,51626=>1000,51627=>1000,51628=>1000,51629=>1000,51630=>1000,51631=>1000,51632=>1000,51633=>1000,51634=>1000,51635=>1000,51636=>1000,51637=>1000,51638=>1000,51639=>1000,51640=>1000,51641=>1000,51642=>1000,51643=>1000,51644=>1000,51645=>1000,51646=>1000,51647=>1000,51648=>1000,51649=>1000,51650=>1000,51651=>1000,51652=>1000,51653=>1000,51654=>1000,51655=>1000,51656=>1000,51657=>1000,51658=>1000,51659=>1000,51660=>1000,51661=>1000,51662=>1000,51663=>1000,51664=>1000,51665=>1000,51666=>1000,51667=>1000,51668=>1000,51669=>1000,51670=>1000,51671=>1000,51672=>1000,51673=>1000,51674=>1000,51675=>1000,51676=>1000,51677=>1000,51678=>1000,51679=>1000,51680=>1000,51681=>1000,51682=>1000,51683=>1000,51684=>1000,51685=>1000,51686=>1000,51687=>1000,51688=>1000,51689=>1000,51690=>1000,51691=>1000,51692=>1000,51693=>1000,51694=>1000,51695=>1000,51696=>1000,51697=>1000,51698=>1000,51699=>1000,51700=>1000,51701=>1000,51702=>1000,51703=>1000,51704=>1000,51705=>1000,51706=>1000,51707=>1000,51708=>1000,51709=>1000,51710=>1000,51711=>1000,51712=>1000,51713=>1000,51714=>1000,51715=>1000,51716=>1000,51717=>1000,51718=>1000,51719=>1000,51720=>1000,51721=>1000,51722=>1000,51723=>1000,51724=>1000,51725=>1000,51726=>1000,51727=>1000,51728=>1000,51729=>1000,51730=>1000,51731=>1000,51732=>1000,51733=>1000,51734=>1000,51735=>1000,51736=>1000,51737=>1000,51738=>1000,51739=>1000,51740=>1000,51741=>1000,51742=>1000,51743=>1000,51744=>1000,51745=>1000,51746=>1000,51747=>1000,51748=>1000,51749=>1000,51750=>1000,51751=>1000,51752=>1000,51753=>1000,51754=>1000,51755=>1000,51756=>1000,51757=>1000,51758=>1000,51759=>1000,51760=>1000,51761=>1000,51762=>1000,51763=>1000,51764=>1000,51765=>1000,51766=>1000,51767=>1000,51768=>1000,51769=>1000,51770=>1000,51771=>1000,51772=>1000,51773=>1000,51774=>1000,51775=>1000,51776=>1000,51777=>1000,51778=>1000,51779=>1000,51780=>1000,51781=>1000,51782=>1000,51783=>1000,51784=>1000,51785=>1000,51786=>1000,51787=>1000,51788=>1000,51789=>1000,51790=>1000,51791=>1000,51792=>1000,51793=>1000,51794=>1000,51795=>1000,51796=>1000,51797=>1000,51798=>1000,51799=>1000,51800=>1000,51801=>1000,51802=>1000,51803=>1000,51804=>1000,51805=>1000,51806=>1000,51807=>1000,51808=>1000,51809=>1000,51810=>1000,51811=>1000,51812=>1000,51813=>1000,51814=>1000,51815=>1000,51816=>1000,51817=>1000,51818=>1000,51819=>1000,51820=>1000,51821=>1000,51822=>1000,51823=>1000,51824=>1000,51825=>1000,51826=>1000,51827=>1000,51828=>1000,51829=>1000,51830=>1000,51831=>1000,51832=>1000,51833=>1000,51834=>1000,51835=>1000,51836=>1000,51837=>1000,51838=>1000,51839=>1000,51840=>1000,51841=>1000,51842=>1000,51843=>1000,51844=>1000,51845=>1000,51846=>1000,51847=>1000,51848=>1000,51849=>1000,51850=>1000,51851=>1000,51852=>1000,51853=>1000,51854=>1000,51855=>1000,51856=>1000,51857=>1000,51858=>1000,51859=>1000,51860=>1000,51861=>1000,51862=>1000,51863=>1000,51864=>1000,51865=>1000,51866=>1000,51867=>1000,51868=>1000,51869=>1000,51870=>1000,51871=>1000,51872=>1000,51873=>1000,51874=>1000,51875=>1000,51876=>1000,51877=>1000,51878=>1000,51879=>1000,51880=>1000,51881=>1000,51882=>1000,51883=>1000,51884=>1000,51885=>1000,51886=>1000,51887=>1000,51888=>1000,51889=>1000,51890=>1000,51891=>1000,51892=>1000,51893=>1000,51894=>1000,51895=>1000,51896=>1000,51897=>1000,51898=>1000,51899=>1000,51900=>1000,51901=>1000,51902=>1000,51903=>1000,51904=>1000,51905=>1000,51906=>1000,51907=>1000,51908=>1000,51909=>1000,51910=>1000,51911=>1000,51912=>1000,51913=>1000,51914=>1000,51915=>1000,51916=>1000,51917=>1000,51918=>1000,51919=>1000,51920=>1000,51921=>1000,51922=>1000,51923=>1000,51924=>1000,51925=>1000,51926=>1000,51927=>1000,51928=>1000,51929=>1000,51930=>1000,51931=>1000,51932=>1000,51933=>1000,51934=>1000,51935=>1000,51936=>1000,51937=>1000,51938=>1000,51939=>1000,51940=>1000,51941=>1000,51942=>1000,51943=>1000,51944=>1000,51945=>1000,51946=>1000,51947=>1000,51948=>1000,51949=>1000,51950=>1000,51951=>1000,51952=>1000,51953=>1000,51954=>1000,51955=>1000,51956=>1000,51957=>1000,51958=>1000,51959=>1000,51960=>1000,51961=>1000,51962=>1000,51963=>1000,51964=>1000,51965=>1000,51966=>1000,51967=>1000,51968=>1000,51969=>1000,51970=>1000,51971=>1000,51972=>1000,51973=>1000,51974=>1000,51975=>1000,51976=>1000,51977=>1000,51978=>1000,51979=>1000,51980=>1000,51981=>1000,51982=>1000,51983=>1000,51984=>1000,51985=>1000,51986=>1000,51987=>1000,51988=>1000,51989=>1000,51990=>1000,51991=>1000,51992=>1000,51993=>1000,51994=>1000,51995=>1000,51996=>1000,51997=>1000,51998=>1000,51999=>1000,52000=>1000,52001=>1000,52002=>1000,52003=>1000,52004=>1000,52005=>1000,52006=>1000,52007=>1000,52008=>1000,52009=>1000,52010=>1000,52011=>1000,52012=>1000,52013=>1000,52014=>1000,52015=>1000,52016=>1000,52017=>1000,52018=>1000,52019=>1000,52020=>1000,52021=>1000,52022=>1000,52023=>1000,52024=>1000,52025=>1000,52026=>1000,52027=>1000,52028=>1000,52029=>1000,52030=>1000,52031=>1000,52032=>1000,52033=>1000,52034=>1000,52035=>1000,52036=>1000,52037=>1000,52038=>1000,52039=>1000,52040=>1000,52041=>1000,52042=>1000,52043=>1000,52044=>1000,52045=>1000,52046=>1000,52047=>1000,52048=>1000,52049=>1000,52050=>1000,52051=>1000,52052=>1000,52053=>1000,52054=>1000,52055=>1000,52056=>1000,52057=>1000,52058=>1000,52059=>1000,52060=>1000,52061=>1000,52062=>1000,52063=>1000,52064=>1000,52065=>1000,52066=>1000,52067=>1000,52068=>1000,52069=>1000,52070=>1000,52071=>1000,52072=>1000,52073=>1000,52074=>1000,52075=>1000,52076=>1000,52077=>1000,52078=>1000,52079=>1000,52080=>1000,52081=>1000,52082=>1000,52083=>1000,52084=>1000,52085=>1000,52086=>1000,52087=>1000,52088=>1000,52089=>1000,52090=>1000,52091=>1000,52092=>1000,52093=>1000,52094=>1000,52095=>1000,52096=>1000,52097=>1000,52098=>1000,52099=>1000,52100=>1000,52101=>1000,52102=>1000,52103=>1000,52104=>1000,52105=>1000,52106=>1000,52107=>1000,52108=>1000,52109=>1000,52110=>1000,52111=>1000,52112=>1000,52113=>1000,52114=>1000,52115=>1000,52116=>1000,52117=>1000,52118=>1000,52119=>1000,52120=>1000,52121=>1000,52122=>1000,52123=>1000,52124=>1000,52125=>1000,52126=>1000,52127=>1000,52128=>1000,52129=>1000,52130=>1000,52131=>1000,52132=>1000,52133=>1000,52134=>1000,52135=>1000,52136=>1000,52137=>1000,52138=>1000,52139=>1000,52140=>1000,52141=>1000,52142=>1000,52143=>1000,52144=>1000,52145=>1000,52146=>1000,52147=>1000,52148=>1000,52149=>1000,52150=>1000,52151=>1000,52152=>1000,52153=>1000,52154=>1000,52155=>1000,52156=>1000,52157=>1000,52158=>1000,52159=>1000,52160=>1000,52161=>1000,52162=>1000,52163=>1000,52164=>1000,52165=>1000,52166=>1000,52167=>1000,52168=>1000,52169=>1000,52170=>1000,52171=>1000,52172=>1000,52173=>1000,52174=>1000,52175=>1000,52176=>1000,52177=>1000,52178=>1000,52179=>1000,52180=>1000,52181=>1000,52182=>1000,52183=>1000,52184=>1000,52185=>1000,52186=>1000,52187=>1000,52188=>1000,52189=>1000,52190=>1000,52191=>1000,52192=>1000,52193=>1000,52194=>1000,52195=>1000,52196=>1000,52197=>1000,52198=>1000,52199=>1000,52200=>1000,52201=>1000,52202=>1000,52203=>1000,52204=>1000,52205=>1000,52206=>1000,52207=>1000,52208=>1000,52209=>1000,52210=>1000,52211=>1000,52212=>1000,52213=>1000,52214=>1000,52215=>1000,52216=>1000,52217=>1000,52218=>1000,52219=>1000,52220=>1000,52221=>1000,52222=>1000,52223=>1000,52224=>1000,52225=>1000,52226=>1000,52227=>1000,52228=>1000,52229=>1000,52230=>1000,52231=>1000,52232=>1000,52233=>1000,52234=>1000,52235=>1000,52236=>1000,52237=>1000,52238=>1000,52239=>1000,52240=>1000,52241=>1000,52242=>1000,52243=>1000,52244=>1000,52245=>1000,52246=>1000,52247=>1000,52248=>1000,52249=>1000,52250=>1000,52251=>1000,52252=>1000,52253=>1000,52254=>1000,52255=>1000,52256=>1000,52257=>1000,52258=>1000,52259=>1000,52260=>1000,52261=>1000,52262=>1000,52263=>1000,52264=>1000,52265=>1000,52266=>1000,52267=>1000,52268=>1000,52269=>1000,52270=>1000,52271=>1000,52272=>1000,52273=>1000,52274=>1000,52275=>1000,52276=>1000,52277=>1000,52278=>1000,52279=>1000,52280=>1000,52281=>1000,52282=>1000,52283=>1000,52284=>1000,52285=>1000,52286=>1000,52287=>1000,52288=>1000,52289=>1000,52290=>1000,52291=>1000,52292=>1000,52293=>1000,52294=>1000,52295=>1000,52296=>1000,52297=>1000,52298=>1000,52299=>1000,52300=>1000,52301=>1000,52302=>1000,52303=>1000,52304=>1000,52305=>1000,52306=>1000,52307=>1000,52308=>1000,52309=>1000,52310=>1000,52311=>1000,52312=>1000,52313=>1000,52314=>1000,52315=>1000,52316=>1000,52317=>1000,52318=>1000,52319=>1000,52320=>1000,52321=>1000,52322=>1000,52323=>1000,52324=>1000,52325=>1000,52326=>1000,52327=>1000,52328=>1000,52329=>1000,52330=>1000,52331=>1000,52332=>1000,52333=>1000,52334=>1000,52335=>1000,52336=>1000,52337=>1000,52338=>1000,52339=>1000,52340=>1000,52341=>1000,52342=>1000,52343=>1000,52344=>1000,52345=>1000,52346=>1000,52347=>1000,52348=>1000,52349=>1000,52350=>1000,52351=>1000,52352=>1000,52353=>1000,52354=>1000,52355=>1000,52356=>1000,52357=>1000,52358=>1000,52359=>1000,52360=>1000,52361=>1000,52362=>1000,52363=>1000,52364=>1000,52365=>1000,52366=>1000,52367=>1000,52368=>1000,52369=>1000,52370=>1000,52371=>1000,52372=>1000,52373=>1000,52374=>1000,52375=>1000,52376=>1000,52377=>1000,52378=>1000,52379=>1000,52380=>1000,52381=>1000,52382=>1000,52383=>1000,52384=>1000,52385=>1000,52386=>1000,52387=>1000,52388=>1000,52389=>1000,52390=>1000,52391=>1000,52392=>1000,52393=>1000,52394=>1000,52395=>1000,52396=>1000,52397=>1000,52398=>1000,52399=>1000,52400=>1000,52401=>1000,52402=>1000,52403=>1000,52404=>1000,52405=>1000,52406=>1000,52407=>1000,52408=>1000,52409=>1000,52410=>1000,52411=>1000,52412=>1000,52413=>1000,52414=>1000,52415=>1000,52416=>1000,52417=>1000,52418=>1000,52419=>1000,52420=>1000,52421=>1000,52422=>1000,52423=>1000,52424=>1000,52425=>1000,52426=>1000,52427=>1000,52428=>1000,52429=>1000,52430=>1000,52431=>1000,52432=>1000,52433=>1000,52434=>1000,52435=>1000,52436=>1000,52437=>1000,52438=>1000,52439=>1000,52440=>1000,52441=>1000,52442=>1000,52443=>1000,52444=>1000,52445=>1000,52446=>1000,52447=>1000,52448=>1000,52449=>1000,52450=>1000,52451=>1000,52452=>1000,52453=>1000,52454=>1000,52455=>1000,52456=>1000,52457=>1000,52458=>1000,52459=>1000,52460=>1000,52461=>1000,52462=>1000,52463=>1000,52464=>1000,52465=>1000,52466=>1000,52467=>1000,52468=>1000,52469=>1000,52470=>1000,52471=>1000,52472=>1000,52473=>1000,52474=>1000,52475=>1000,52476=>1000,52477=>1000,52478=>1000,52479=>1000,52480=>1000,52481=>1000,52482=>1000,52483=>1000,52484=>1000,52485=>1000,52486=>1000,52487=>1000,52488=>1000,52489=>1000,52490=>1000,52491=>1000,52492=>1000,52493=>1000,52494=>1000,52495=>1000,52496=>1000,52497=>1000,52498=>1000,52499=>1000,52500=>1000,52501=>1000,52502=>1000,52503=>1000,52504=>1000,52505=>1000,52506=>1000,52507=>1000,52508=>1000,52509=>1000,52510=>1000,52511=>1000,52512=>1000,52513=>1000,52514=>1000,52515=>1000,52516=>1000,52517=>1000,52518=>1000,52519=>1000,52520=>1000,52521=>1000,52522=>1000,52523=>1000,52524=>1000,52525=>1000,52526=>1000,52527=>1000,52528=>1000,52529=>1000,52530=>1000,52531=>1000,52532=>1000,52533=>1000,52534=>1000,52535=>1000,52536=>1000,52537=>1000,52538=>1000,52539=>1000,52540=>1000,52541=>1000,52542=>1000,52543=>1000,52544=>1000,52545=>1000,52546=>1000,52547=>1000,52548=>1000,52549=>1000,52550=>1000,52551=>1000,52552=>1000,52553=>1000,52554=>1000,52555=>1000,52556=>1000,52557=>1000,52558=>1000,52559=>1000,52560=>1000,52561=>1000,52562=>1000,52563=>1000,52564=>1000,52565=>1000,52566=>1000,52567=>1000,52568=>1000,52569=>1000,52570=>1000,52571=>1000,52572=>1000,52573=>1000,52574=>1000,52575=>1000,52576=>1000,52577=>1000,52578=>1000,52579=>1000,52580=>1000,52581=>1000,52582=>1000,52583=>1000,52584=>1000,52585=>1000,52586=>1000,52587=>1000,52588=>1000,52589=>1000,52590=>1000,52591=>1000,52592=>1000,52593=>1000,52594=>1000,52595=>1000,52596=>1000,52597=>1000,52598=>1000,52599=>1000,52600=>1000,52601=>1000,52602=>1000,52603=>1000,52604=>1000,52605=>1000,52606=>1000,52607=>1000,52608=>1000,52609=>1000,52610=>1000,52611=>1000,52612=>1000,52613=>1000,52614=>1000,52615=>1000,52616=>1000,52617=>1000,52618=>1000,52619=>1000,52620=>1000,52621=>1000,52622=>1000,52623=>1000,52624=>1000,52625=>1000,52626=>1000,52627=>1000,52628=>1000,52629=>1000,52630=>1000,52631=>1000,52632=>1000,52633=>1000,52634=>1000,52635=>1000,52636=>1000,52637=>1000,52638=>1000,52639=>1000,52640=>1000,52641=>1000,52642=>1000,52643=>1000,52644=>1000,52645=>1000,52646=>1000,52647=>1000,52648=>1000,52649=>1000,52650=>1000,52651=>1000,52652=>1000,52653=>1000,52654=>1000,52655=>1000,52656=>1000,52657=>1000,52658=>1000,52659=>1000,52660=>1000,52661=>1000,52662=>1000,52663=>1000,52664=>1000,52665=>1000,52666=>1000,52667=>1000,52668=>1000,52669=>1000,52670=>1000,52671=>1000,52672=>1000,52673=>1000,52674=>1000,52675=>1000,52676=>1000,52677=>1000,52678=>1000,52679=>1000,52680=>1000,52681=>1000,52682=>1000,52683=>1000,52684=>1000,52685=>1000,52686=>1000,52687=>1000,52688=>1000,52689=>1000,52690=>1000,52691=>1000,52692=>1000,52693=>1000,52694=>1000,52695=>1000,52696=>1000,52697=>1000,52698=>1000,52699=>1000,52700=>1000,52701=>1000,52702=>1000,52703=>1000,52704=>1000,52705=>1000,52706=>1000,52707=>1000,52708=>1000,52709=>1000,52710=>1000,52711=>1000,52712=>1000,52713=>1000,52714=>1000,52715=>1000,52716=>1000,52717=>1000,52718=>1000,52719=>1000,52720=>1000,52721=>1000,52722=>1000,52723=>1000,52724=>1000,52725=>1000,52726=>1000,52727=>1000,52728=>1000,52729=>1000,52730=>1000,52731=>1000,52732=>1000,52733=>1000,52734=>1000,52735=>1000,52736=>1000,52737=>1000,52738=>1000,52739=>1000,52740=>1000,52741=>1000,52742=>1000,52743=>1000,52744=>1000,52745=>1000,52746=>1000,52747=>1000,52748=>1000,52749=>1000,52750=>1000,52751=>1000,52752=>1000,52753=>1000,52754=>1000,52755=>1000,52756=>1000,52757=>1000,52758=>1000,52759=>1000,52760=>1000,52761=>1000,52762=>1000,52763=>1000,52764=>1000,52765=>1000,52766=>1000,52767=>1000,52768=>1000,52769=>1000,52770=>1000,52771=>1000,52772=>1000,52773=>1000,52774=>1000,52775=>1000,52776=>1000,52777=>1000,52778=>1000,52779=>1000,52780=>1000,52781=>1000,52782=>1000,52783=>1000,52784=>1000,52785=>1000,52786=>1000,52787=>1000,52788=>1000,52789=>1000,52790=>1000,52791=>1000,52792=>1000,52793=>1000,52794=>1000,52795=>1000,52796=>1000,52797=>1000,52798=>1000,52799=>1000,52800=>1000,52801=>1000,52802=>1000,52803=>1000,52804=>1000,52805=>1000,52806=>1000,52807=>1000,52808=>1000,52809=>1000,52810=>1000,52811=>1000,52812=>1000,52813=>1000,52814=>1000,52815=>1000,52816=>1000,52817=>1000,52818=>1000,52819=>1000,52820=>1000,52821=>1000,52822=>1000,52823=>1000,52824=>1000,52825=>1000,52826=>1000,52827=>1000,52828=>1000,52829=>1000,52830=>1000,52831=>1000,52832=>1000,52833=>1000,52834=>1000,52835=>1000,52836=>1000,52837=>1000,52838=>1000,52839=>1000,52840=>1000,52841=>1000,52842=>1000,52843=>1000,52844=>1000,52845=>1000,52846=>1000,52847=>1000,52848=>1000,52849=>1000,52850=>1000,52851=>1000,52852=>1000,52853=>1000,52854=>1000,52855=>1000,52856=>1000,52857=>1000,52858=>1000,52859=>1000,52860=>1000,52861=>1000,52862=>1000,52863=>1000,52864=>1000,52865=>1000,52866=>1000,52867=>1000,52868=>1000,52869=>1000,52870=>1000,52871=>1000,52872=>1000,52873=>1000,52874=>1000,52875=>1000,52876=>1000,52877=>1000,52878=>1000,52879=>1000,52880=>1000,52881=>1000,52882=>1000,52883=>1000,52884=>1000,52885=>1000,52886=>1000,52887=>1000,52888=>1000,52889=>1000,52890=>1000,52891=>1000,52892=>1000,52893=>1000,52894=>1000,52895=>1000,52896=>1000,52897=>1000,52898=>1000,52899=>1000,52900=>1000,52901=>1000,52902=>1000,52903=>1000,52904=>1000,52905=>1000,52906=>1000,52907=>1000,52908=>1000,52909=>1000,52910=>1000,52911=>1000,52912=>1000,52913=>1000,52914=>1000,52915=>1000,52916=>1000,52917=>1000,52918=>1000,52919=>1000,52920=>1000,52921=>1000,52922=>1000,52923=>1000,52924=>1000,52925=>1000,52926=>1000,52927=>1000,52928=>1000,52929=>1000,52930=>1000,52931=>1000,52932=>1000,52933=>1000,52934=>1000,52935=>1000,52936=>1000,52937=>1000,52938=>1000,52939=>1000,52940=>1000,52941=>1000,52942=>1000,52943=>1000,52944=>1000,52945=>1000,52946=>1000,52947=>1000,52948=>1000,52949=>1000,52950=>1000,52951=>1000,52952=>1000,52953=>1000,52954=>1000,52955=>1000,52956=>1000,52957=>1000,52958=>1000,52959=>1000,52960=>1000,52961=>1000,52962=>1000,52963=>1000,52964=>1000,52965=>1000,52966=>1000,52967=>1000,52968=>1000,52969=>1000,52970=>1000,52971=>1000,52972=>1000,52973=>1000,52974=>1000,52975=>1000,52976=>1000,52977=>1000,52978=>1000,52979=>1000,52980=>1000,52981=>1000,52982=>1000,52983=>1000,52984=>1000,52985=>1000,52986=>1000,52987=>1000,52988=>1000,52989=>1000,52990=>1000,52991=>1000,52992=>1000,52993=>1000,52994=>1000,52995=>1000,52996=>1000,52997=>1000,52998=>1000,52999=>1000,53000=>1000,53001=>1000,53002=>1000,53003=>1000,53004=>1000,53005=>1000,53006=>1000,53007=>1000,53008=>1000,53009=>1000,53010=>1000,53011=>1000,53012=>1000,53013=>1000,53014=>1000,53015=>1000,53016=>1000,53017=>1000,53018=>1000,53019=>1000,53020=>1000,53021=>1000,53022=>1000,53023=>1000,53024=>1000,53025=>1000,53026=>1000,53027=>1000,53028=>1000,53029=>1000,53030=>1000,53031=>1000,53032=>1000,53033=>1000,53034=>1000,53035=>1000,53036=>1000,53037=>1000,53038=>1000,53039=>1000,53040=>1000,53041=>1000,53042=>1000,53043=>1000,53044=>1000,53045=>1000,53046=>1000,53047=>1000,53048=>1000,53049=>1000,53050=>1000,53051=>1000,53052=>1000,53053=>1000,53054=>1000,53055=>1000,53056=>1000,53057=>1000,53058=>1000,53059=>1000,53060=>1000,53061=>1000,53062=>1000,53063=>1000,53064=>1000,53065=>1000,53066=>1000,53067=>1000,53068=>1000,53069=>1000,53070=>1000,53071=>1000,53072=>1000,53073=>1000,53074=>1000,53075=>1000,53076=>1000,53077=>1000,53078=>1000,53079=>1000,53080=>1000,53081=>1000,53082=>1000,53083=>1000,53084=>1000,53085=>1000,53086=>1000,53087=>1000,53088=>1000,53089=>1000,53090=>1000,53091=>1000,53092=>1000,53093=>1000,53094=>1000,53095=>1000,53096=>1000,53097=>1000,53098=>1000,53099=>1000,53100=>1000,53101=>1000,53102=>1000,53103=>1000,53104=>1000,53105=>1000,53106=>1000,53107=>1000,53108=>1000,53109=>1000,53110=>1000,53111=>1000,53112=>1000,53113=>1000,53114=>1000,53115=>1000,53116=>1000,53117=>1000,53118=>1000,53119=>1000,53120=>1000,53121=>1000,53122=>1000,53123=>1000,53124=>1000,53125=>1000,53126=>1000,53127=>1000,53128=>1000,53129=>1000,53130=>1000,53131=>1000,53132=>1000,53133=>1000,53134=>1000,53135=>1000,53136=>1000,53137=>1000,53138=>1000,53139=>1000,53140=>1000,53141=>1000,53142=>1000,53143=>1000,53144=>1000,53145=>1000,53146=>1000,53147=>1000,53148=>1000,53149=>1000,53150=>1000,53151=>1000,53152=>1000,53153=>1000,53154=>1000,53155=>1000,53156=>1000,53157=>1000,53158=>1000,53159=>1000,53160=>1000,53161=>1000,53162=>1000,53163=>1000,53164=>1000,53165=>1000,53166=>1000,53167=>1000,53168=>1000,53169=>1000,53170=>1000,53171=>1000,53172=>1000,53173=>1000,53174=>1000,53175=>1000,53176=>1000,53177=>1000,53178=>1000,53179=>1000,53180=>1000,53181=>1000,53182=>1000,53183=>1000,53184=>1000,53185=>1000,53186=>1000,53187=>1000,53188=>1000,53189=>1000,53190=>1000,53191=>1000,53192=>1000,53193=>1000,53194=>1000,53195=>1000,53196=>1000,53197=>1000,53198=>1000,53199=>1000,53200=>1000,53201=>1000,53202=>1000,53203=>1000,53204=>1000,53205=>1000,53206=>1000,53207=>1000,53208=>1000,53209=>1000,53210=>1000,53211=>1000,53212=>1000,53213=>1000,53214=>1000,53215=>1000,53216=>1000,53217=>1000,53218=>1000,53219=>1000,53220=>1000,53221=>1000,53222=>1000,53223=>1000,53224=>1000,53225=>1000,53226=>1000,53227=>1000,53228=>1000,53229=>1000,53230=>1000,53231=>1000,53232=>1000,53233=>1000,53234=>1000,53235=>1000,53236=>1000,53237=>1000,53238=>1000,53239=>1000,53240=>1000,53241=>1000,53242=>1000,53243=>1000,53244=>1000,53245=>1000,53246=>1000,53247=>1000,53248=>1000,53249=>1000,53250=>1000,53251=>1000,53252=>1000,53253=>1000,53254=>1000,53255=>1000,53256=>1000,53257=>1000,53258=>1000,53259=>1000,53260=>1000,53261=>1000,53262=>1000,53263=>1000,53264=>1000,53265=>1000,53266=>1000,53267=>1000,53268=>1000,53269=>1000,53270=>1000,53271=>1000,53272=>1000,53273=>1000,53274=>1000,53275=>1000,53276=>1000,53277=>1000,53278=>1000,53279=>1000,53280=>1000,53281=>1000,53282=>1000,53283=>1000,53284=>1000,53285=>1000,53286=>1000,53287=>1000,53288=>1000,53289=>1000,53290=>1000,53291=>1000,53292=>1000,53293=>1000,53294=>1000,53295=>1000,53296=>1000,53297=>1000,53298=>1000,53299=>1000,53300=>1000,53301=>1000,53302=>1000,53303=>1000,53304=>1000,53305=>1000,53306=>1000,53307=>1000,53308=>1000,53309=>1000,53310=>1000,53311=>1000,53312=>1000,53313=>1000,53314=>1000,53315=>1000,53316=>1000,53317=>1000,53318=>1000,53319=>1000,53320=>1000,53321=>1000,53322=>1000,53323=>1000,53324=>1000,53325=>1000,53326=>1000,53327=>1000,53328=>1000,53329=>1000,53330=>1000,53331=>1000,53332=>1000,53333=>1000,53334=>1000,53335=>1000,53336=>1000,53337=>1000,53338=>1000,53339=>1000,53340=>1000,53341=>1000,53342=>1000,53343=>1000,53344=>1000,53345=>1000,53346=>1000,53347=>1000,53348=>1000,53349=>1000,53350=>1000,53351=>1000,53352=>1000,53353=>1000,53354=>1000,53355=>1000,53356=>1000,53357=>1000,53358=>1000,53359=>1000,53360=>1000,53361=>1000,53362=>1000,53363=>1000,53364=>1000,53365=>1000,53366=>1000,53367=>1000,53368=>1000,53369=>1000,53370=>1000,53371=>1000,53372=>1000,53373=>1000,53374=>1000,53375=>1000,53376=>1000,53377=>1000,53378=>1000,53379=>1000,53380=>1000,53381=>1000,53382=>1000,53383=>1000,53384=>1000,53385=>1000,53386=>1000,53387=>1000,53388=>1000,53389=>1000,53390=>1000,53391=>1000,53392=>1000,53393=>1000,53394=>1000,53395=>1000,53396=>1000,53397=>1000,53398=>1000,53399=>1000,53400=>1000,53401=>1000,53402=>1000,53403=>1000,53404=>1000,53405=>1000,53406=>1000,53407=>1000,53408=>1000,53409=>1000,53410=>1000,53411=>1000,53412=>1000,53413=>1000,53414=>1000,53415=>1000,53416=>1000,53417=>1000,53418=>1000,53419=>1000,53420=>1000,53421=>1000,53422=>1000,53423=>1000,53424=>1000,53425=>1000,53426=>1000,53427=>1000,53428=>1000,53429=>1000,53430=>1000,53431=>1000,53432=>1000,53433=>1000,53434=>1000,53435=>1000,53436=>1000,53437=>1000,53438=>1000,53439=>1000,53440=>1000,53441=>1000,53442=>1000,53443=>1000,53444=>1000,53445=>1000,53446=>1000,53447=>1000,53448=>1000,53449=>1000,53450=>1000,53451=>1000,53452=>1000,53453=>1000,53454=>1000,53455=>1000,53456=>1000,53457=>1000,53458=>1000,53459=>1000,53460=>1000,53461=>1000,53462=>1000,53463=>1000,53464=>1000,53465=>1000,53466=>1000,53467=>1000,53468=>1000,53469=>1000,53470=>1000,53471=>1000,53472=>1000,53473=>1000,53474=>1000,53475=>1000,53476=>1000,53477=>1000,53478=>1000,53479=>1000,53480=>1000,53481=>1000,53482=>1000,53483=>1000,53484=>1000,53485=>1000,53486=>1000,53487=>1000,53488=>1000,53489=>1000,53490=>1000,53491=>1000,53492=>1000,53493=>1000,53494=>1000,53495=>1000,53496=>1000,53497=>1000,53498=>1000,53499=>1000,53500=>1000,53501=>1000,53502=>1000,53503=>1000,53504=>1000,53505=>1000,53506=>1000,53507=>1000,53508=>1000,53509=>1000,53510=>1000,53511=>1000,53512=>1000,53513=>1000,53514=>1000,53515=>1000,53516=>1000,53517=>1000,53518=>1000,53519=>1000,53520=>1000,53521=>1000,53522=>1000,53523=>1000,53524=>1000,53525=>1000,53526=>1000,53527=>1000,53528=>1000,53529=>1000,53530=>1000,53531=>1000,53532=>1000,53533=>1000,53534=>1000,53535=>1000,53536=>1000,53537=>1000,53538=>1000,53539=>1000,53540=>1000,53541=>1000,53542=>1000,53543=>1000,53544=>1000,53545=>1000,53546=>1000,53547=>1000,53548=>1000,53549=>1000,53550=>1000,53551=>1000,53552=>1000,53553=>1000,53554=>1000,53555=>1000,53556=>1000,53557=>1000,53558=>1000,53559=>1000,53560=>1000,53561=>1000,53562=>1000,53563=>1000,53564=>1000,53565=>1000,53566=>1000,53567=>1000,53568=>1000,53569=>1000,53570=>1000,53571=>1000,53572=>1000,53573=>1000,53574=>1000,53575=>1000,53576=>1000,53577=>1000,53578=>1000,53579=>1000,53580=>1000,53581=>1000,53582=>1000,53583=>1000,53584=>1000,53585=>1000,53586=>1000,53587=>1000,53588=>1000,53589=>1000,53590=>1000,53591=>1000,53592=>1000,53593=>1000,53594=>1000,53595=>1000,53596=>1000,53597=>1000,53598=>1000,53599=>1000,53600=>1000,53601=>1000,53602=>1000,53603=>1000,53604=>1000,53605=>1000,53606=>1000,53607=>1000,53608=>1000,53609=>1000,53610=>1000,53611=>1000,53612=>1000,53613=>1000,53614=>1000,53615=>1000,53616=>1000,53617=>1000,53618=>1000,53619=>1000,53620=>1000,53621=>1000,53622=>1000,53623=>1000,53624=>1000,53625=>1000,53626=>1000,53627=>1000,53628=>1000,53629=>1000,53630=>1000,53631=>1000,53632=>1000,53633=>1000,53634=>1000,53635=>1000,53636=>1000,53637=>1000,53638=>1000,53639=>1000,53640=>1000,53641=>1000,53642=>1000,53643=>1000,53644=>1000,53645=>1000,53646=>1000,53647=>1000,53648=>1000,53649=>1000,53650=>1000,53651=>1000,53652=>1000,53653=>1000,53654=>1000,53655=>1000,53656=>1000,53657=>1000,53658=>1000,53659=>1000,53660=>1000,53661=>1000,53662=>1000,53663=>1000,53664=>1000,53665=>1000,53666=>1000,53667=>1000,53668=>1000,53669=>1000,53670=>1000,53671=>1000,53672=>1000,53673=>1000,53674=>1000,53675=>1000,53676=>1000,53677=>1000,53678=>1000,53679=>1000,53680=>1000,53681=>1000,53682=>1000,53683=>1000,53684=>1000,53685=>1000,53686=>1000,53687=>1000,53688=>1000,53689=>1000,53690=>1000,53691=>1000,53692=>1000,53693=>1000,53694=>1000,53695=>1000,53696=>1000,53697=>1000,53698=>1000,53699=>1000,53700=>1000,53701=>1000,53702=>1000,53703=>1000,53704=>1000,53705=>1000,53706=>1000,53707=>1000,53708=>1000,53709=>1000,53710=>1000,53711=>1000,53712=>1000,53713=>1000,53714=>1000,53715=>1000,53716=>1000,53717=>1000,53718=>1000,53719=>1000,53720=>1000,53721=>1000,53722=>1000,53723=>1000,53724=>1000,53725=>1000,53726=>1000,53727=>1000,53728=>1000,53729=>1000,53730=>1000,53731=>1000,53732=>1000,53733=>1000,53734=>1000,53735=>1000,53736=>1000,53737=>1000,53738=>1000,53739=>1000,53740=>1000,53741=>1000,53742=>1000,53743=>1000,53744=>1000,53745=>1000,53746=>1000,53747=>1000,53748=>1000,53749=>1000,53750=>1000,53751=>1000,53752=>1000,53753=>1000,53754=>1000,53755=>1000,53756=>1000,53757=>1000,53758=>1000,53759=>1000,53760=>1000,53761=>1000,53762=>1000,53763=>1000,53764=>1000,53765=>1000,53766=>1000,53767=>1000,53768=>1000,53769=>1000,53770=>1000,53771=>1000,53772=>1000,53773=>1000,53774=>1000,53775=>1000,53776=>1000,53777=>1000,53778=>1000,53779=>1000,53780=>1000,53781=>1000,53782=>1000,53783=>1000,53784=>1000,53785=>1000,53786=>1000,53787=>1000,53788=>1000,53789=>1000,53790=>1000,53791=>1000,53792=>1000,53793=>1000,53794=>1000,53795=>1000,53796=>1000,53797=>1000,53798=>1000,53799=>1000,53800=>1000,53801=>1000,53802=>1000,53803=>1000,53804=>1000,53805=>1000,53806=>1000,53807=>1000,53808=>1000,53809=>1000,53810=>1000,53811=>1000,53812=>1000,53813=>1000,53814=>1000,53815=>1000,53816=>1000,53817=>1000,53818=>1000,53819=>1000,53820=>1000,53821=>1000,53822=>1000,53823=>1000,53824=>1000,53825=>1000,53826=>1000,53827=>1000,53828=>1000,53829=>1000,53830=>1000,53831=>1000,53832=>1000,53833=>1000,53834=>1000,53835=>1000,53836=>1000,53837=>1000,53838=>1000,53839=>1000,53840=>1000,53841=>1000,53842=>1000,53843=>1000,53844=>1000,53845=>1000,53846=>1000,53847=>1000,53848=>1000,53849=>1000,53850=>1000,53851=>1000,53852=>1000,53853=>1000,53854=>1000,53855=>1000,53856=>1000,53857=>1000,53858=>1000,53859=>1000,53860=>1000,53861=>1000,53862=>1000,53863=>1000,53864=>1000,53865=>1000,53866=>1000,53867=>1000,53868=>1000,53869=>1000,53870=>1000,53871=>1000,53872=>1000,53873=>1000,53874=>1000,53875=>1000,53876=>1000,53877=>1000,53878=>1000,53879=>1000,53880=>1000,53881=>1000,53882=>1000,53883=>1000,53884=>1000,53885=>1000,53886=>1000,53887=>1000,53888=>1000,53889=>1000,53890=>1000,53891=>1000,53892=>1000,53893=>1000,53894=>1000,53895=>1000,53896=>1000,53897=>1000,53898=>1000,53899=>1000,53900=>1000,53901=>1000,53902=>1000,53903=>1000,53904=>1000,53905=>1000,53906=>1000,53907=>1000,53908=>1000,53909=>1000,53910=>1000,53911=>1000,53912=>1000,53913=>1000,53914=>1000,53915=>1000,53916=>1000,53917=>1000,53918=>1000,53919=>1000,53920=>1000,53921=>1000,53922=>1000,53923=>1000,53924=>1000,53925=>1000,53926=>1000,53927=>1000,53928=>1000,53929=>1000,53930=>1000,53931=>1000,53932=>1000,53933=>1000,53934=>1000,53935=>1000,53936=>1000,53937=>1000,53938=>1000,53939=>1000,53940=>1000,53941=>1000,53942=>1000,53943=>1000,53944=>1000,53945=>1000,53946=>1000,53947=>1000,53948=>1000,53949=>1000,53950=>1000,53951=>1000,53952=>1000,53953=>1000,53954=>1000,53955=>1000,53956=>1000,53957=>1000,53958=>1000,53959=>1000,53960=>1000,53961=>1000,53962=>1000,53963=>1000,53964=>1000,53965=>1000,53966=>1000,53967=>1000,53968=>1000,53969=>1000,53970=>1000,53971=>1000,53972=>1000,53973=>1000,53974=>1000,53975=>1000,53976=>1000,53977=>1000,53978=>1000,53979=>1000,53980=>1000,53981=>1000,53982=>1000,53983=>1000,53984=>1000,53985=>1000,53986=>1000,53987=>1000,53988=>1000,53989=>1000,53990=>1000,53991=>1000,53992=>1000,53993=>1000,53994=>1000,53995=>1000,53996=>1000,53997=>1000,53998=>1000,53999=>1000,54000=>1000,54001=>1000,54002=>1000,54003=>1000,54004=>1000,54005=>1000,54006=>1000,54007=>1000,54008=>1000,54009=>1000,54010=>1000,54011=>1000,54012=>1000,54013=>1000,54014=>1000,54015=>1000,54016=>1000,54017=>1000,54018=>1000,54019=>1000,54020=>1000,54021=>1000,54022=>1000,54023=>1000,54024=>1000,54025=>1000,54026=>1000,54027=>1000,54028=>1000,54029=>1000,54030=>1000,54031=>1000,54032=>1000,54033=>1000,54034=>1000,54035=>1000,54036=>1000,54037=>1000,54038=>1000,54039=>1000,54040=>1000,54041=>1000,54042=>1000,54043=>1000,54044=>1000,54045=>1000,54046=>1000,54047=>1000,54048=>1000,54049=>1000,54050=>1000,54051=>1000,54052=>1000,54053=>1000,54054=>1000,54055=>1000,54056=>1000,54057=>1000,54058=>1000,54059=>1000,54060=>1000,54061=>1000,54062=>1000,54063=>1000,54064=>1000,54065=>1000,54066=>1000,54067=>1000,54068=>1000,54069=>1000,54070=>1000,54071=>1000,54072=>1000,54073=>1000,54074=>1000,54075=>1000,54076=>1000,54077=>1000,54078=>1000,54079=>1000,54080=>1000,54081=>1000,54082=>1000,54083=>1000,54084=>1000,54085=>1000,54086=>1000,54087=>1000,54088=>1000,54089=>1000,54090=>1000,54091=>1000,54092=>1000,54093=>1000,54094=>1000,54095=>1000,54096=>1000,54097=>1000,54098=>1000,54099=>1000,54100=>1000,54101=>1000,54102=>1000,54103=>1000,54104=>1000,54105=>1000,54106=>1000,54107=>1000,54108=>1000,54109=>1000,54110=>1000,54111=>1000,54112=>1000,54113=>1000,54114=>1000,54115=>1000,54116=>1000,54117=>1000,54118=>1000,54119=>1000,54120=>1000,54121=>1000,54122=>1000,54123=>1000,54124=>1000,54125=>1000,54126=>1000,54127=>1000,54128=>1000,54129=>1000,54130=>1000,54131=>1000,54132=>1000,54133=>1000,54134=>1000,54135=>1000,54136=>1000,54137=>1000,54138=>1000,54139=>1000,54140=>1000,54141=>1000,54142=>1000,54143=>1000,54144=>1000,54145=>1000,54146=>1000,54147=>1000,54148=>1000,54149=>1000,54150=>1000,54151=>1000,54152=>1000,54153=>1000,54154=>1000,54155=>1000,54156=>1000,54157=>1000,54158=>1000,54159=>1000,54160=>1000,54161=>1000,54162=>1000,54163=>1000,54164=>1000,54165=>1000,54166=>1000,54167=>1000,54168=>1000,54169=>1000,54170=>1000,54171=>1000,54172=>1000,54173=>1000,54174=>1000,54175=>1000,54176=>1000,54177=>1000,54178=>1000,54179=>1000,54180=>1000,54181=>1000,54182=>1000,54183=>1000,54184=>1000,54185=>1000,54186=>1000,54187=>1000,54188=>1000,54189=>1000,54190=>1000,54191=>1000,54192=>1000,54193=>1000,54194=>1000,54195=>1000,54196=>1000,54197=>1000,54198=>1000,54199=>1000,54200=>1000,54201=>1000,54202=>1000,54203=>1000,54204=>1000,54205=>1000,54206=>1000,54207=>1000,54208=>1000,54209=>1000,54210=>1000,54211=>1000,54212=>1000,54213=>1000,54214=>1000,54215=>1000,54216=>1000,54217=>1000,54218=>1000,54219=>1000,54220=>1000,54221=>1000,54222=>1000,54223=>1000,54224=>1000,54225=>1000,54226=>1000,54227=>1000,54228=>1000,54229=>1000,54230=>1000,54231=>1000,54232=>1000,54233=>1000,54234=>1000,54235=>1000,54236=>1000,54237=>1000,54238=>1000,54239=>1000,54240=>1000,54241=>1000,54242=>1000,54243=>1000,54244=>1000,54245=>1000,54246=>1000,54247=>1000,54248=>1000,54249=>1000,54250=>1000,54251=>1000,54252=>1000,54253=>1000,54254=>1000,54255=>1000,54256=>1000,54257=>1000,54258=>1000,54259=>1000,54260=>1000,54261=>1000,54262=>1000,54263=>1000,54264=>1000,54265=>1000,54266=>1000,54267=>1000,54268=>1000,54269=>1000,54270=>1000,54271=>1000,54272=>1000,54273=>1000,54274=>1000,54275=>1000,54276=>1000,54277=>1000,54278=>1000,54279=>1000,54280=>1000,54281=>1000,54282=>1000,54283=>1000,54284=>1000,54285=>1000,54286=>1000,54287=>1000,54288=>1000,54289=>1000,54290=>1000,54291=>1000,54292=>1000,54293=>1000,54294=>1000,54295=>1000,54296=>1000,54297=>1000,54298=>1000,54299=>1000,54300=>1000,54301=>1000,54302=>1000,54303=>1000,54304=>1000,54305=>1000,54306=>1000,54307=>1000,54308=>1000,54309=>1000,54310=>1000,54311=>1000,54312=>1000,54313=>1000,54314=>1000,54315=>1000,54316=>1000,54317=>1000,54318=>1000,54319=>1000,54320=>1000,54321=>1000,54322=>1000,54323=>1000,54324=>1000,54325=>1000,54326=>1000,54327=>1000,54328=>1000,54329=>1000,54330=>1000,54331=>1000,54332=>1000,54333=>1000,54334=>1000,54335=>1000,54336=>1000,54337=>1000,54338=>1000,54339=>1000,54340=>1000,54341=>1000,54342=>1000,54343=>1000,54344=>1000,54345=>1000,54346=>1000,54347=>1000,54348=>1000,54349=>1000,54350=>1000,54351=>1000,54352=>1000,54353=>1000,54354=>1000,54355=>1000,54356=>1000,54357=>1000,54358=>1000,54359=>1000,54360=>1000,54361=>1000,54362=>1000,54363=>1000,54364=>1000,54365=>1000,54366=>1000,54367=>1000,54368=>1000,54369=>1000,54370=>1000,54371=>1000,54372=>1000,54373=>1000,54374=>1000,54375=>1000,54376=>1000,54377=>1000,54378=>1000,54379=>1000,54380=>1000,54381=>1000,54382=>1000,54383=>1000,54384=>1000,54385=>1000,54386=>1000,54387=>1000,54388=>1000,54389=>1000,54390=>1000,54391=>1000,54392=>1000,54393=>1000,54394=>1000,54395=>1000,54396=>1000,54397=>1000,54398=>1000,54399=>1000,54400=>1000,54401=>1000,54402=>1000,54403=>1000,54404=>1000,54405=>1000,54406=>1000,54407=>1000,54408=>1000,54409=>1000,54410=>1000,54411=>1000,54412=>1000,54413=>1000,54414=>1000,54415=>1000,54416=>1000,54417=>1000,54418=>1000,54419=>1000,54420=>1000,54421=>1000,54422=>1000,54423=>1000,54424=>1000,54425=>1000,54426=>1000,54427=>1000,54428=>1000,54429=>1000,54430=>1000,54431=>1000,54432=>1000,54433=>1000,54434=>1000,54435=>1000,54436=>1000,54437=>1000,54438=>1000,54439=>1000,54440=>1000,54441=>1000,54442=>1000,54443=>1000,54444=>1000,54445=>1000,54446=>1000,54447=>1000,54448=>1000,54449=>1000,54450=>1000,54451=>1000,54452=>1000,54453=>1000,54454=>1000,54455=>1000,54456=>1000,54457=>1000,54458=>1000,54459=>1000,54460=>1000,54461=>1000,54462=>1000,54463=>1000,54464=>1000,54465=>1000,54466=>1000,54467=>1000,54468=>1000,54469=>1000,54470=>1000,54471=>1000,54472=>1000,54473=>1000,54474=>1000,54475=>1000,54476=>1000,54477=>1000,54478=>1000,54479=>1000,54480=>1000,54481=>1000,54482=>1000,54483=>1000,54484=>1000,54485=>1000,54486=>1000,54487=>1000,54488=>1000,54489=>1000,54490=>1000,54491=>1000,54492=>1000,54493=>1000,54494=>1000,54495=>1000,54496=>1000,54497=>1000,54498=>1000,54499=>1000,54500=>1000,54501=>1000,54502=>1000,54503=>1000,54504=>1000,54505=>1000,54506=>1000,54507=>1000,54508=>1000,54509=>1000,54510=>1000,54511=>1000,54512=>1000,54513=>1000,54514=>1000,54515=>1000,54516=>1000,54517=>1000,54518=>1000,54519=>1000,54520=>1000,54521=>1000,54522=>1000,54523=>1000,54524=>1000,54525=>1000,54526=>1000,54527=>1000,54528=>1000,54529=>1000,54530=>1000,54531=>1000,54532=>1000,54533=>1000,54534=>1000,54535=>1000,54536=>1000,54537=>1000,54538=>1000,54539=>1000,54540=>1000,54541=>1000,54542=>1000,54543=>1000,54544=>1000,54545=>1000,54546=>1000,54547=>1000,54548=>1000,54549=>1000,54550=>1000,54551=>1000,54552=>1000,54553=>1000,54554=>1000,54555=>1000,54556=>1000,54557=>1000,54558=>1000,54559=>1000,54560=>1000,54561=>1000,54562=>1000,54563=>1000,54564=>1000,54565=>1000,54566=>1000,54567=>1000,54568=>1000,54569=>1000,54570=>1000,54571=>1000,54572=>1000,54573=>1000,54574=>1000,54575=>1000,54576=>1000,54577=>1000,54578=>1000,54579=>1000,54580=>1000,54581=>1000,54582=>1000,54583=>1000,54584=>1000,54585=>1000,54586=>1000,54587=>1000,54588=>1000,54589=>1000,54590=>1000,54591=>1000,54592=>1000,54593=>1000,54594=>1000,54595=>1000,54596=>1000,54597=>1000,54598=>1000,54599=>1000,54600=>1000,54601=>1000,54602=>1000,54603=>1000,54604=>1000,54605=>1000,54606=>1000,54607=>1000,54608=>1000,54609=>1000,54610=>1000,54611=>1000,54612=>1000,54613=>1000,54614=>1000,54615=>1000,54616=>1000,54617=>1000,54618=>1000,54619=>1000,54620=>1000,54621=>1000,54622=>1000,54623=>1000,54624=>1000,54625=>1000,54626=>1000,54627=>1000,54628=>1000,54629=>1000,54630=>1000,54631=>1000,54632=>1000,54633=>1000,54634=>1000,54635=>1000,54636=>1000,54637=>1000,54638=>1000,54639=>1000,54640=>1000,54641=>1000,54642=>1000,54643=>1000,54644=>1000,54645=>1000,54646=>1000,54647=>1000,54648=>1000,54649=>1000,54650=>1000,54651=>1000,54652=>1000,54653=>1000,54654=>1000,54655=>1000,54656=>1000,54657=>1000,54658=>1000,54659=>1000,54660=>1000,54661=>1000,54662=>1000,54663=>1000,54664=>1000,54665=>1000,54666=>1000,54667=>1000,54668=>1000,54669=>1000,54670=>1000,54671=>1000,54672=>1000,54673=>1000,54674=>1000,54675=>1000,54676=>1000,54677=>1000,54678=>1000,54679=>1000,54680=>1000,54681=>1000,54682=>1000,54683=>1000,54684=>1000,54685=>1000,54686=>1000,54687=>1000,54688=>1000,54689=>1000,54690=>1000,54691=>1000,54692=>1000,54693=>1000,54694=>1000,54695=>1000,54696=>1000,54697=>1000,54698=>1000,54699=>1000,54700=>1000,54701=>1000,54702=>1000,54703=>1000,54704=>1000,54705=>1000,54706=>1000,54707=>1000,54708=>1000,54709=>1000,54710=>1000,54711=>1000,54712=>1000,54713=>1000,54714=>1000,54715=>1000,54716=>1000,54717=>1000,54718=>1000,54719=>1000,54720=>1000,54721=>1000,54722=>1000,54723=>1000,54724=>1000,54725=>1000,54726=>1000,54727=>1000,54728=>1000,54729=>1000,54730=>1000,54731=>1000,54732=>1000,54733=>1000,54734=>1000,54735=>1000,54736=>1000,54737=>1000,54738=>1000,54739=>1000,54740=>1000,54741=>1000,54742=>1000,54743=>1000,54744=>1000,54745=>1000,54746=>1000,54747=>1000,54748=>1000,54749=>1000,54750=>1000,54751=>1000,54752=>1000,54753=>1000,54754=>1000,54755=>1000,54756=>1000,54757=>1000,54758=>1000,54759=>1000,54760=>1000,54761=>1000,54762=>1000,54763=>1000,54764=>1000,54765=>1000,54766=>1000,54767=>1000,54768=>1000,54769=>1000,54770=>1000,54771=>1000,54772=>1000,54773=>1000,54774=>1000,54775=>1000,54776=>1000,54777=>1000,54778=>1000,54779=>1000,54780=>1000,54781=>1000,54782=>1000,54783=>1000,54784=>1000,54785=>1000,54786=>1000,54787=>1000,54788=>1000,54789=>1000,54790=>1000,54791=>1000,54792=>1000,54793=>1000,54794=>1000,54795=>1000,54796=>1000,54797=>1000,54798=>1000,54799=>1000,54800=>1000,54801=>1000,54802=>1000,54803=>1000,54804=>1000,54805=>1000,54806=>1000,54807=>1000,54808=>1000,54809=>1000,54810=>1000,54811=>1000,54812=>1000,54813=>1000,54814=>1000,54815=>1000,54816=>1000,54817=>1000,54818=>1000,54819=>1000,54820=>1000,54821=>1000,54822=>1000,54823=>1000,54824=>1000,54825=>1000,54826=>1000,54827=>1000,54828=>1000,54829=>1000,54830=>1000,54831=>1000,54832=>1000,54833=>1000,54834=>1000,54835=>1000,54836=>1000,54837=>1000,54838=>1000,54839=>1000,54840=>1000,54841=>1000,54842=>1000,54843=>1000,54844=>1000,54845=>1000,54846=>1000,54847=>1000,54848=>1000,54849=>1000,54850=>1000,54851=>1000,54852=>1000,54853=>1000,54854=>1000,54855=>1000,54856=>1000,54857=>1000,54858=>1000,54859=>1000,54860=>1000,54861=>1000,54862=>1000,54863=>1000,54864=>1000,54865=>1000,54866=>1000,54867=>1000,54868=>1000,54869=>1000,54870=>1000,54871=>1000,54872=>1000,54873=>1000,54874=>1000,54875=>1000,54876=>1000,54877=>1000,54878=>1000,54879=>1000,54880=>1000,54881=>1000,54882=>1000,54883=>1000,54884=>1000,54885=>1000,54886=>1000,54887=>1000,54888=>1000,54889=>1000,54890=>1000,54891=>1000,54892=>1000,54893=>1000,54894=>1000,54895=>1000,54896=>1000,54897=>1000,54898=>1000,54899=>1000,54900=>1000,54901=>1000,54902=>1000,54903=>1000,54904=>1000,54905=>1000,54906=>1000,54907=>1000,54908=>1000,54909=>1000,54910=>1000,54911=>1000,54912=>1000,54913=>1000,54914=>1000,54915=>1000,54916=>1000,54917=>1000,54918=>1000,54919=>1000,54920=>1000,54921=>1000,54922=>1000,54923=>1000,54924=>1000,54925=>1000,54926=>1000,54927=>1000,54928=>1000,54929=>1000,54930=>1000,54931=>1000,54932=>1000,54933=>1000,54934=>1000,54935=>1000,54936=>1000,54937=>1000,54938=>1000,54939=>1000,54940=>1000,54941=>1000,54942=>1000,54943=>1000,54944=>1000,54945=>1000,54946=>1000,54947=>1000,54948=>1000,54949=>1000,54950=>1000,54951=>1000,54952=>1000,54953=>1000,54954=>1000,54955=>1000,54956=>1000,54957=>1000,54958=>1000,54959=>1000,54960=>1000,54961=>1000,54962=>1000,54963=>1000,54964=>1000,54965=>1000,54966=>1000,54967=>1000,54968=>1000,54969=>1000,54970=>1000,54971=>1000,54972=>1000,54973=>1000,54974=>1000,54975=>1000,54976=>1000,54977=>1000,54978=>1000,54979=>1000,54980=>1000,54981=>1000,54982=>1000,54983=>1000,54984=>1000,54985=>1000,54986=>1000,54987=>1000,54988=>1000,54989=>1000,54990=>1000,54991=>1000,54992=>1000,54993=>1000,54994=>1000,54995=>1000,54996=>1000,54997=>1000,54998=>1000,54999=>1000,55000=>1000,55001=>1000,55002=>1000,55003=>1000,55004=>1000,55005=>1000,55006=>1000,55007=>1000,55008=>1000,55009=>1000,55010=>1000,55011=>1000,55012=>1000,55013=>1000,55014=>1000,55015=>1000,55016=>1000,55017=>1000,55018=>1000,55019=>1000,55020=>1000,55021=>1000,55022=>1000,55023=>1000,55024=>1000,55025=>1000,55026=>1000,55027=>1000,55028=>1000,55029=>1000,55030=>1000,55031=>1000,55032=>1000,55033=>1000,55034=>1000,55035=>1000,55036=>1000,55037=>1000,55038=>1000,55039=>1000,55040=>1000,55041=>1000,55042=>1000,55043=>1000,55044=>1000,55045=>1000,55046=>1000,55047=>1000,55048=>1000,55049=>1000,55050=>1000,55051=>1000,55052=>1000,55053=>1000,55054=>1000,55055=>1000,55056=>1000,55057=>1000,55058=>1000,55059=>1000,55060=>1000,55061=>1000,55062=>1000,55063=>1000,55064=>1000,55065=>1000,55066=>1000,55067=>1000,55068=>1000,55069=>1000,55070=>1000,55071=>1000,55072=>1000,55073=>1000,55074=>1000,55075=>1000,55076=>1000,55077=>1000,55078=>1000,55079=>1000,55080=>1000,55081=>1000,55082=>1000,55083=>1000,55084=>1000,55085=>1000,55086=>1000,55087=>1000,55088=>1000,55089=>1000,55090=>1000,55091=>1000,55092=>1000,55093=>1000,55094=>1000,55095=>1000,55096=>1000,55097=>1000,55098=>1000,55099=>1000,55100=>1000,55101=>1000,55102=>1000,55103=>1000,55104=>1000,55105=>1000,55106=>1000,55107=>1000,55108=>1000,55109=>1000,55110=>1000,55111=>1000,55112=>1000,55113=>1000,55114=>1000,55115=>1000,55116=>1000,55117=>1000,55118=>1000,55119=>1000,55120=>1000,55121=>1000,55122=>1000,55123=>1000,55124=>1000,55125=>1000,55126=>1000,55127=>1000,55128=>1000,55129=>1000,55130=>1000,55131=>1000,55132=>1000,55133=>1000,55134=>1000,55135=>1000,55136=>1000,55137=>1000,55138=>1000,55139=>1000,55140=>1000,55141=>1000,55142=>1000,55143=>1000,55144=>1000,55145=>1000,55146=>1000,55147=>1000,55148=>1000,55149=>1000,55150=>1000,55151=>1000,55152=>1000,55153=>1000,55154=>1000,55155=>1000,55156=>1000,55157=>1000,55158=>1000,55159=>1000,55160=>1000,55161=>1000,55162=>1000,55163=>1000,55164=>1000,55165=>1000,55166=>1000,55167=>1000,55168=>1000,55169=>1000,55170=>1000,55171=>1000,55172=>1000,55173=>1000,55174=>1000,55175=>1000,55176=>1000,55177=>1000,55178=>1000,55179=>1000,55180=>1000,55181=>1000,55182=>1000,55183=>1000,55184=>1000,55185=>1000,55186=>1000,55187=>1000,55188=>1000,55189=>1000,55190=>1000,55191=>1000,55192=>1000,55193=>1000,55194=>1000,55195=>1000,55196=>1000,55197=>1000,55198=>1000,55199=>1000,55200=>1000,55201=>1000,55202=>1000,55203=>1000,59393=>316,59394=>507,59395=>507,59396=>484,59397=>484,59416=>0,59492=>480,59495=>480,59536=>458,59557=>466,59558=>480,59559=>903,61441=>500,61442=>500,63232=>541,63233=>0,63234=>0,63235=>0,63236=>0,63237=>0,63238=>0,63239=>0,63240=>0,63241=>0,63242=>0,63243=>0,63244=>0,63245=>0,63246=>0,63247=>849,63248=>0,63249=>0,63250=>0,63251=>0,63252=>0,63253=>0,63254=>0,63255=>0,63256=>0,63257=>0,63258=>0,63260=>333,63261=>287,63744=>1000,63745=>1000,63746=>1000,63747=>1000,63748=>1000,63749=>1000,63750=>1000,63751=>1000,63752=>1000,63753=>1000,63754=>1000,63755=>1000,63756=>1000,63757=>1000,63758=>1000,63759=>1000,63760=>1000,63761=>1000,63762=>1000,63763=>1000,63764=>1000,63765=>1000,63766=>1000,63767=>1000,63768=>1000,63769=>1000,63770=>1000,63771=>1000,63772=>1000,63773=>1000,63774=>1000,63775=>1000,63776=>1000,63777=>1000,63778=>1000,63779=>1000,63780=>1000,63781=>1000,63782=>1000,63783=>1000,63784=>1000,63785=>1000,63786=>1000,63787=>1000,63788=>1000,63789=>1000,63790=>1000,63791=>1000,63792=>1000,63793=>1000,63794=>1000,63795=>1000,63796=>1000,63797=>1000,63798=>1000,63799=>1000,63800=>1000,63801=>1000,63802=>1000,63803=>1000,63804=>1000,63805=>1000,63806=>1000,63807=>1000,63808=>1000,63809=>1000,63810=>1000,63811=>1000,63812=>1000,63813=>1000,63814=>1000,63815=>1000,63816=>1000,63817=>1000,63818=>1000,63819=>1000,63820=>1000,63821=>1000,63822=>1000,63823=>1000,63824=>1000,63825=>1000,63826=>1000,63827=>1000,63828=>1000,63829=>1000,63830=>1000,63831=>1000,63832=>1000,63833=>1000,63834=>1000,63835=>1000,63836=>1000,63837=>1000,63838=>1000,63839=>1000,63840=>1000,63841=>1000,63842=>1000,63843=>1000,63844=>1000,63845=>1000,63846=>1000,63847=>1000,63848=>1000,63849=>1000,63850=>1000,63851=>1000,63852=>1000,63853=>1000,63854=>1000,63855=>1000,63856=>1000,63857=>1000,63858=>1000,63859=>1000,63860=>1000,63861=>1000,63862=>1000,63863=>1000,63864=>1000,63865=>1000,63866=>1000,63867=>1000,63868=>1000,63869=>1000,63870=>1000,63871=>1000,63872=>1000,63873=>1000,63874=>1000,63875=>1000,63876=>1000,63877=>1000,63878=>1000,63879=>1000,63880=>1000,63881=>1000,63882=>1000,63883=>1000,63884=>1000,63885=>1000,63886=>1000,63887=>1000,63888=>1000,63889=>1000,63890=>1000,63891=>1000,63892=>1000,63893=>1000,63894=>1000,63895=>1000,63896=>1000,63897=>1000,63898=>1000,63899=>1000,63900=>1000,63901=>1000,63902=>1000,63903=>1000,63904=>1000,63905=>1000,63906=>1000,63907=>1000,63908=>1000,63909=>1000,63910=>1000,63911=>1000,63912=>1000,63913=>1000,63914=>1000,63915=>1000,63916=>1000,63917=>1000,63918=>1000,63919=>1000,63920=>1000,63921=>1000,63922=>1000,63923=>1000,63924=>1000,63925=>1000,63926=>1000,63927=>1000,63928=>1000,63929=>1000,63930=>1000,63931=>1000,63932=>1000,63933=>1000,63934=>1000,63935=>1000,63936=>1000,63937=>1000,63938=>1000,63939=>1000,63940=>1000,63941=>1000,63942=>1000,63943=>1000,63944=>1000,63945=>1000,63946=>1000,63947=>1000,63948=>1000,63949=>1000,63950=>1000,63951=>1000,63952=>1000,63953=>1000,63954=>1000,63955=>1000,63956=>1000,63957=>1000,63958=>1000,63959=>1000,63960=>1000,63961=>1000,63962=>1000,63963=>1000,63964=>1000,63965=>1000,63966=>1000,63967=>1000,63968=>1000,63969=>1000,63970=>1000,63971=>1000,63972=>1000,63973=>1000,63974=>1000,63975=>1000,63976=>1000,63977=>1000,63978=>1000,63979=>1000,63980=>1000,63981=>1000,63982=>1000,63983=>1000,63984=>1000,63985=>1000,63986=>1000,63987=>1000,63988=>1000,63989=>1000,63990=>1000,63991=>1000,63992=>1000,63993=>1000,63994=>1000,63995=>1000,63996=>1000,63997=>1000,63998=>1000,63999=>1000,64000=>1000,64001=>1000,64002=>1000,64003=>1000,64004=>1000,64005=>1000,64006=>1000,64007=>1000,64008=>1000,64009=>1000,64010=>1000,64011=>1000,64012=>1000,64013=>1000,64014=>1000,64015=>1000,64016=>1000,64017=>1000,64018=>1000,64019=>1000,64020=>1000,64021=>1000,64022=>1000,64023=>1000,64024=>1000,64025=>1000,64026=>1000,64027=>1000,64028=>1000,64029=>1000,64030=>1000,64031=>1000,64032=>1000,64033=>1000,64034=>1000,64035=>1000,64036=>1000,64037=>1000,64038=>1000,64039=>1000,64040=>1000,64041=>1000,64042=>1000,64043=>1000,64044=>1000,64045=>1000,64256=>537,64257=>500,64258=>500,64259=>778,64260=>750,64261=>532,64262=>758,64275=>784,64276=>784,64277=>784,64278=>784,64279=>893,64286=>333,64287=>590,64288=>550,64289=>709,64290=>649,64291=>730,64292=>656,64293=>605,64294=>730,64295=>633,64296=>794,64297=>584,64298=>700,64299=>700,64300=>700,64301=>700,64302=>577,64303=>577,64304=>577,64305=>563,64306=>411,64307=>512,64308=>594,64309=>316,64310=>326,64312=>594,64313=>316,64314=>507,64315=>527,64316=>484,64318=>594,64320=>338,64321=>604,64323=>567,64324=>569,64326=>514,64327=>583,64328=>507,64329=>700,64330=>633,64331=>316,64332=>563,64333=>527,64334=>569,64335=>577,64336=>243,64337=>273,64338=>771,64339=>788,64340=>276,64341=>243,64342=>771,64343=>788,64344=>276,64345=>243,64346=>771,64347=>788,64348=>276,64349=>243,64350=>771,64351=>788,64352=>276,64353=>243,64354=>771,64355=>788,64356=>276,64357=>243,64358=>771,64359=>788,64360=>276,64361=>243,64362=>957,64363=>903,64364=>466,64365=>480,64366=>957,64367=>903,64368=>466,64369=>480,64370=>544,64371=>658,64372=>646,64373=>637,64374=>544,64375=>658,64376=>646,64377=>637,64378=>544,64379=>658,64380=>646,64381=>637,64382=>544,64383=>658,64384=>646,64385=>637,64386=>430,64387=>458,64388=>430,64389=>458,64390=>430,64391=>458,64392=>430,64393=>458,64394=>421,64395=>436,64396=>421,64397=>436,64398=>828,64399=>942,64400=>432,64401=>549,64402=>828,64403=>942,64404=>432,64405=>549,64406=>828,64407=>942,64408=>432,64409=>549,64410=>828,64411=>942,64412=>432,64413=>549,64414=>692,64415=>723,64416=>692,64417=>723,64418=>276,64419=>243,64420=>514,64421=>477,64422=>514,64423=>509,64424=>273,64425=>427,64426=>706,64427=>706,64428=>686,64429=>686,64430=>550,64431=>461,64432=>550,64433=>461,64467=>757,64468=>733,64469=>432,64470=>549,64471=>470,64472=>466,64473=>470,64474=>466,64475=>470,64476=>466,64477=>470,64478=>470,64479=>466,64480=>470,64481=>466,64482=>470,64483=>466,64484=>781,64485=>933,64486=>276,64487=>243,64488=>276,64489=>243,64490=>547,64491=>517,64492=>783,64493=>753,64494=>740,64495=>710,64496=>740,64497=>710,64498=>740,64499=>710,64500=>740,64501=>710,64502=>1207,64503=>1177,64504=>517,64505=>1067,64506=>1037,64507=>517,64508=>731,64509=>793,64510=>276,64511=>243,64512=>932,64513=>932,64514=>914,64515=>1067,64516=>1077,64517=>935,64518=>935,64519=>935,64520=>917,64521=>1070,64522=>1080,64523=>932,64524=>932,64525=>932,64526=>914,64527=>1067,64528=>1077,64529=>932,64530=>914,64531=>1067,64532=>1077,64533=>1305,64534=>1287,64535=>1305,64536=>1287,64537=>1305,64538=>1305,64539=>1287,64540=>1429,64541=>1429,64542=>1429,64543=>1411,64544=>1476,64545=>1458,64546=>1476,64547=>1476,64548=>1476,64549=>1458,64550=>1392,64551=>1374,64552=>1374,64553=>1245,64554=>1227,64555=>1245,64556=>1227,64557=>1125,64558=>1125,64559=>1125,64560=>1107,64561=>1260,64562=>1270,64563=>1125,64564=>1107,64565=>1260,64566=>1270,64567=>706,64568=>1091,64569=>1091,64570=>1091,64571=>1106,64572=>1073,64573=>1226,64574=>1236,64575=>932,64576=>932,64577=>932,64578=>914,64579=>1067,64580=>1077,64581=>1140,64582=>1140,64583=>1140,64584=>1122,64585=>1275,64586=>1285,64587=>932,64588=>932,64589=>932,64590=>914,64591=>1067,64592=>1077,64593=>1345,64594=>1327,64595=>1480,64596=>1490,64597=>932,64598=>932,64599=>932,64600=>914,64601=>1067,64602=>1077,64603=>430,64604=>421,64605=>731,64606=>296,64607=>300,64608=>300,64609=>300,64610=>300,64611=>300,64612=>680,64613=>680,64614=>884,64615=>967,64616=>1037,64617=>1047,64618=>680,64619=>680,64620=>884,64621=>967,64622=>1037,64623=>1047,64624=>680,64625=>680,64626=>884,64627=>967,64628=>1037,64629=>1047,64630=>680,64631=>680,64632=>884,64633=>967,64634=>1037,64635=>1047,64636=>1274,64637=>1284,64638=>1274,64639=>1284,64640=>821,64641=>1221,64642=>1188,64643=>1341,64644=>1351,64645=>884,64646=>1037,64647=>1047,64648=>806,64649=>1173,64650=>680,64651=>680,64652=>884,64653=>967,64654=>1037,64655=>1047,64656=>793,64657=>680,64658=>680,64659=>884,64660=>967,64661=>1037,64662=>1047,64663=>911,64664=>911,64665=>911,64666=>806,64667=>679,64668=>911,64669=>911,64670=>911,64671=>806,64672=>679,64673=>911,64674=>911,64675=>911,64676=>806,64677=>679,64678=>806,64679=>1284,64680=>1179,64681=>1284,64682=>1179,64683=>1284,64684=>1179,64685=>1408,64686=>1408,64687=>1408,64688=>1303,64689=>1455,64690=>1455,64691=>1350,64692=>1455,64693=>1455,64694=>1455,64695=>1350,64696=>1371,64697=>1266,64698=>1224,64699=>1119,64700=>1224,64701=>1119,64702=>1104,64703=>1104,64704=>1104,64705=>999,64706=>1104,64707=>999,64708=>1070,64709=>1070,64710=>1070,64711=>676,64712=>965,64713=>911,64714=>911,64715=>911,64716=>806,64717=>679,64718=>1119,64719=>1119,64720=>1119,64721=>1014,64722=>911,64723=>911,64724=>911,64725=>806,64726=>679,64727=>1324,64728=>1219,64729=>686,64730=>911,64731=>911,64732=>911,64733=>806,64734=>679,64735=>776,64736=>649,64737=>776,64738=>649,64739=>776,64740=>649,64741=>776,64742=>649,64743=>1303,64744=>1176,64745=>1303,64746=>1176,64747=>793,64748=>1082,64749=>776,64750=>776,64751=>649,64752=>776,64753=>649,64754=>306,64755=>302,64756=>298,64757=>1527,64758=>1537,64759=>1380,64760=>1390,64761=>1380,64762=>1390,64763=>1564,64764=>1574,64765=>1564,64766=>1574,64767=>1440,64768=>1450,64769=>1440,64770=>1450,64771=>1440,64772=>1450,64773=>1611,64774=>1621,64775=>1611,64776=>1621,64777=>1429,64778=>1429,64779=>1429,64780=>1411,64781=>1207,64782=>1207,64783=>1254,64784=>1254,64785=>1527,64786=>1537,64787=>1348,64788=>1358,64789=>1348,64790=>1358,64791=>1564,64792=>1574,64793=>1564,64794=>1574,64795=>1431,64796=>1441,64797=>1431,64798=>1441,64799=>1431,64800=>1441,64801=>1611,64802=>1621,64803=>1611,64804=>1621,64805=>1429,64806=>1429,64807=>1429,64808=>1411,64809=>1207,64810=>1207,64811=>1254,64812=>1254,64813=>1408,64814=>1408,64815=>1408,64816=>1303,64817=>1176,64818=>1176,64819=>1266,64820=>1408,64821=>1408,64822=>1408,64823=>1408,64824=>1408,64825=>1408,64826=>1266,64827=>1266,64828=>273,64829=>243,64830=>600,64831=>600,64848=>1444,64849=>1541,64850=>1549,64851=>1444,64852=>1444,64853=>1444,64854=>1444,64855=>1444,64856=>1830,64857=>1817,64858=>1975,64859=>1964,64860=>2046,64861=>2046,64862=>2202,64863=>1962,64864=>1941,64865=>1941,64866=>1944,64867=>1836,64868=>2114,64869=>2093,64870=>1991,64871=>2049,64872=>1941,64873=>2212,64874=>1962,64875=>1941,64876=>1944,64877=>1836,64878=>2249,64879=>2096,64880=>1988,64881=>1925,64882=>1904,64883=>1799,64884=>2070,64885=>1833,64886=>1729,64887=>1652,64888=>1881,64889=>1729,64890=>1892,64891=>1881,64892=>1759,64893=>1637,64894=>1670,64895=>1654,64896=>1522,64897=>1686,64898=>1675,64899=>1549,64900=>1541,64901=>1522,64902=>1444,64903=>1436,64904=>1444,64905=>1757,64906=>1652,64907=>1975,64908=>1757,64909=>1652,64910=>1757,64911=>1652,64914=>1757,64915=>1857,64916=>1752,64917=>1444,64918=>1675,64919=>1522,64920=>1444,64921=>1675,64922=>1581,64923=>1570,64924=>1417,64925=>1362,64926=>1686,64927=>1686,64928=>1675,64929=>1686,64930=>1675,64931=>1581,64932=>1570,64933=>1975,64934=>2069,64935=>1964,64936=>2202,64937=>2259,64938=>2212,64939=>2259,64940=>1686,64941=>1581,64942=>1686,64943=>1686,64944=>1581,64945=>1870,64946=>1817,64947=>1686,64948=>1637,64949=>1444,64950=>1892,64951=>1886,64952=>1549,64953=>1975,64954=>1444,64955=>1723,64956=>1522,64957=>1541,64958=>2080,64959=>2080,64960=>1975,64961=>1817,64962=>1686,64963=>1499,64964=>1757,64965=>1883,64966=>2212,64967=>1686,65008=>1523,65009=>1172,65010=>1159,65011=>1356,65012=>2111,65013=>2258,65014=>2130,65015=>1552,65016=>2046,65017=>1856,65018=>1930,65019=>1070,65056=>450,65057=>450,65058=>450,65059=>450,65072=>1000,65073=>1000,65074=>1000,65075=>1000,65076=>1000,65077=>1000,65078=>1000,65079=>1000,65080=>1000,65081=>1000,65082=>1000,65083=>1000,65084=>1000,65085=>1000,65086=>1000,65087=>1000,65088=>1000,65089=>1000,65090=>1000,65091=>1000,65092=>1000,65097=>1000,65098=>1000,65099=>1000,65100=>1000,65101=>1000,65102=>1000,65103=>1000,65104=>167,65105=>250,65106=>167,65108=>167,65109=>167,65110=>334,65111=>167,65112=>600,65113=>200,65114=>200,65115=>200,65116=>200,65117=>200,65118=>200,65119=>334,65120=>400,65121=>233,65122=>350,65123=>200,65124=>350,65125=>350,65126=>350,65128=>167,65129=>334,65130=>533,65131=>609,65136=>300,65137=>298,65138=>296,65140=>298,65142=>300,65143=>298,65144=>300,65145=>302,65146=>298,65147=>296,65148=>306,65149=>306,65150=>154,65151=>154,65152=>529,65153=>243,65154=>273,65155=>243,65156=>273,65157=>470,65158=>466,65159=>243,65160=>273,65161=>731,65162=>793,65163=>276,65164=>243,65165=>243,65166=>273,65167=>771,65168=>788,65169=>276,65170=>243,65171=>514,65172=>477,65173=>771,65174=>788,65175=>276,65176=>243,65177=>771,65178=>788,65179=>276,65180=>243,65181=>544,65182=>658,65183=>646,65184=>637,65185=>544,65186=>658,65187=>646,65188=>637,65189=>544,65190=>658,65191=>646,65192=>637,65193=>430,65194=>458,65195=>430,65196=>458,65197=>421,65198=>436,65199=>421,65200=>436,65201=>1194,65202=>1194,65203=>770,65204=>770,65205=>1194,65206=>1194,65207=>770,65208=>770,65209=>1291,65210=>1291,65211=>817,65212=>817,65213=>1291,65214=>1291,65215=>817,65216=>817,65217=>843,65218=>843,65219=>733,65220=>733,65221=>843,65222=>843,65223=>733,65224=>733,65225=>594,65226=>556,65227=>586,65228=>554,65229=>594,65230=>556,65231=>586,65232=>554,65233=>957,65234=>903,65235=>466,65236=>480,65237=>800,65238=>823,65239=>466,65240=>480,65241=>757,65242=>733,65243=>432,65244=>549,65245=>662,65246=>673,65247=>273,65248=>243,65249=>589,65250=>640,65251=>481,65252=>532,65253=>692,65254=>723,65255=>276,65256=>243,65257=>514,65258=>477,65259=>686,65260=>405,65261=>470,65262=>466,65263=>731,65264=>793,65265=>731,65266=>803,65267=>276,65268=>243,65269=>551,65270=>603,65271=>551,65272=>603,65273=>551,65274=>603,65275=>551,65276=>603,65281=>1000,65282=>1000,65283=>1000,65284=>1000,65285=>1000,65286=>1000,65287=>1000,65288=>1000,65289=>1000,65290=>1000,65291=>1000,65292=>1000,65293=>1000,65294=>1000,65295=>1000,65296=>1000,65297=>1000,65298=>1000,65299=>1000,65300=>1000,65301=>1000,65302=>1000,65303=>1000,65304=>1000,65305=>1000,65306=>1000,65307=>1000,65308=>1000,65309=>1000,65310=>1000,65311=>1000,65312=>1000,65313=>1000,65314=>1000,65315=>1000,65316=>1000,65317=>1000,65318=>1000,65319=>1000,65320=>1000,65321=>1000,65322=>1000,65323=>1000,65324=>1000,65325=>1000,65326=>1000,65327=>1000,65328=>1000,65329=>1000,65330=>1000,65331=>1000,65332=>1000,65333=>1000,65334=>1000,65335=>1000,65336=>1000,65337=>1000,65338=>1000,65339=>1000,65340=>1000,65341=>1000,65342=>1000,65343=>1000,65344=>1000,65345=>1000,65346=>1000,65347=>1000,65348=>1000,65349=>1000,65350=>1000,65351=>1000,65352=>1000,65353=>1000,65354=>1000,65355=>1000,65356=>1000,65357=>1000,65358=>1000,65359=>1000,65360=>1000,65361=>1000,65362=>1000,65363=>1000,65364=>1000,65365=>1000,65366=>1000,65367=>1000,65368=>1000,65369=>1000,65370=>1000,65371=>1000,65372=>1000,65373=>1000,65374=>1000,65377=>500,65378=>500,65379=>500,65380=>500,65381=>500,65382=>500,65383=>500,65384=>500,65385=>500,65386=>500,65387=>500,65388=>500,65389=>500,65390=>500,65391=>500,65392=>500,65393=>500,65394=>500,65395=>500,65396=>500,65397=>500,65398=>500,65399=>500,65400=>500,65401=>500,65402=>500,65403=>500,65404=>500,65405=>500,65406=>500,65407=>500,65408=>500,65409=>500,65410=>500,65411=>500,65412=>500,65413=>500,65414=>500,65415=>500,65416=>500,65417=>500,65418=>500,65419=>500,65420=>500,65421=>500,65422=>500,65423=>500,65424=>500,65425=>500,65426=>500,65427=>500,65428=>500,65429=>500,65430=>500,65431=>500,65432=>500,65433=>500,65434=>500,65435=>500,65436=>500,65437=>500,65438=>500,65439=>500,65440=>500,65441=>500,65442=>500,65443=>500,65444=>500,65445=>500,65446=>500,65447=>500,65448=>500,65449=>500,65450=>500,65451=>500,65452=>500,65453=>500,65454=>500,65455=>500,65456=>500,65457=>500,65458=>500,65459=>500,65460=>500,65461=>500,65462=>500,65463=>500,65464=>500,65465=>500,65466=>500,65467=>500,65468=>500,65469=>500,65470=>500,65474=>500,65475=>500,65476=>500,65477=>500,65478=>500,65479=>500,65482=>500,65483=>500,65484=>500,65485=>500,65486=>500,65487=>500,65490=>500,65491=>500,65492=>500,65493=>500,65494=>500,65495=>500,65498=>500,65499=>500,65500=>500,65504=>1000,65505=>1000,65506=>1000,65507=>1000,65508=>1000,65509=>1000,65510=>1000,65512=>500,65513=>500,65514=>500,65515=>500,65516=>500,65517=>500,65518=>500,65532=>1000,65533=>1000,65535=>1000);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/cid0ct.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/cid0ct.php
new file mode 100644
index 00000000..ee628883
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/cid0ct.php
@@ -0,0 +1,16 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='cidfont0';
+$name='ArialUnicodeMS';
+$up=-100;
+$ut=50;
+$dw=1000;
+$diff='';
+$originalsize=23275812;
+// Chinese Traditional
+$enc='UniCNS-UTF16-H';
+$cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'CNS1','Supplement'=>0);
+include(dirname(__FILE__).'/uni2cid_aj16.php');
+$desc=array('Flags'=>32,'FontBBox'=>'[-1011 -330 2260 1078]','ItalicAngle'=>0,'Ascent'=>1069,'Descent'=>-271,'Leading'=>0,'CapHeight'=>716,'XHeight'=>518,'StemV'=>34,'StemH'=>15,'AvgWidth'=>441,'MaxWidth'=>2259,'MissingWidth'=>1000);
+$cw=array(0=>1000,32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584,62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278,92=>278,93=>278,94=>469,95=>500,96=>333,97=>556,98=>556,99=>500,100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556,112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>500,176=>400,177=>584,178=>333,179=>333,180=>333,181=>556,182=>537,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834,190=>834,191=>611,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278,238=>278,239=>278,240=>556,241=>556,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>556,255=>500,256=>667,257=>556,258=>667,259=>556,260=>667,261=>556,262=>722,263=>500,264=>722,265=>500,266=>722,267=>500,268=>722,269=>500,270=>722,271=>627,272=>722,273=>556,274=>667,275=>556,276=>667,277=>556,278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>556,286=>778,287=>556,288=>778,289=>556,290=>778,291=>556,292=>722,293=>556,294=>722,295=>556,296=>278,297=>222,298=>278,299=>222,300=>278,301=>222,302=>278,303=>222,304=>278,305=>278,306=>751,307=>444,308=>500,309=>222,310=>667,311=>500,312=>437,313=>556,314=>222,315=>556,316=>222,317=>556,318=>222,319=>556,320=>318,321=>556,322=>222,323=>722,324=>556,325=>722,326=>556,327=>722,328=>556,329=>626,330=>723,331=>556,332=>778,333=>556,334=>778,335=>556,336=>778,337=>556,338=>1000,339=>944,340=>722,341=>333,342=>722,343=>333,344=>722,345=>333,346=>667,347=>500,348=>667,349=>500,350=>667,351=>500,352=>667,353=>500,354=>611,355=>278,356=>611,357=>406,358=>611,359=>278,360=>722,361=>556,362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556,372=>944,373=>722,374=>667,375=>500,376=>667,377=>611,378=>500,379=>611,380=>500,381=>611,382=>500,383=>222,384=>556,385=>740,386=>655,387=>556,388=>556,389=>556,390=>722,391=>766,392=>579,393=>722,394=>789,395=>655,396=>556,397=>557,398=>667,399=>729,400=>604,401=>611,402=>278,403=>791,404=>649,405=>806,406=>245,407=>322,408=>667,409=>500,410=>322,411=>500,412=>833,413=>722,414=>556,415=>778,416=>776,417=>556,418=>1019,419=>782,420=>735,421=>556,422=>722,423=>667,424=>500,425=>602,426=>366,427=>278,428=>571,429=>278,430=>611,431=>776,432=>620,433=>748,434=>667,435=>752,436=>615,437=>611,438=>500,439=>628,440=>628,441=>526,442=>480,443=>556,444=>556,445=>526,446=>556,447=>556,448=>278,449=>464,450=>474,451=>278,452=>1333,453=>1222,454=>1056,455=>1030,456=>778,457=>444,458=>1222,459=>944,460=>778,461=>667,462=>556,463=>278,464=>278,465=>778,466=>556,467=>722,468=>556,469=>722,470=>556,471=>722,472=>556,473=>722,474=>556,475=>722,476=>556,477=>556,478=>667,479=>556,480=>667,481=>556,482=>1000,483=>889,484=>778,485=>556,486=>778,487=>556,488=>667,489=>500,490=>778,491=>556,492=>778,493=>556,494=>534,495=>534,496=>222,497=>1333,498=>1222,499=>1056,500=>778,501=>556,506=>667,507=>556,508=>1000,509=>889,510=>778,511=>611,512=>667,513=>556,514=>667,515=>556,516=>667,517=>556,518=>667,519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>556,526=>778,527=>556,528=>722,529=>333,530=>722,531=>333,532=>722,533=>556,534=>722,535=>556,592=>556,593=>556,594=>556,595=>556,596=>500,597=>500,598=>556,599=>556,600=>556,601=>556,602=>777,603=>485,604=>485,605=>686,606=>519,607=>260,608=>556,609=>556,610=>557,611=>500,612=>500,613=>556,614=>556,615=>556,616=>242,617=>282,618=>356,619=>356,620=>425,621=>222,622=>635,623=>833,624=>833,625=>833,626=>556,627=>556,628=>558,629=>556,630=>715,631=>674,632=>558,633=>333,634=>333,635=>333,636=>333,637=>333,638=>312,639=>312,640=>530,641=>530,642=>500,643=>216,644=>276,645=>216,646=>222,647=>278,648=>278,649=>596,650=>558,651=>556,652=>500,653=>722,654=>500,655=>500,656=>500,657=>564,658=>530,659=>530,660=>464,661=>464,662=>464,663=>500,664=>614,665=>526,666=>519,667=>557,668=>558,669=>222,670=>500,671=>416,672=>556,673=>464,674=>464,675=>966,676=>966,677=>1030,678=>689,679=>484,680=>718,688=>326,689=>326,690=>153,691=>201,692=>201,693=>201,694=>304,695=>389,696=>278,697=>222,698=>372,699=>222,700=>222,701=>222,702=>222,703=>222,704=>250,705=>250,706=>320,707=>320,708=>320,709=>320,710=>333,711=>333,712=>192,713=>333,714=>333,715=>333,716=>192,717=>333,718=>333,719=>333,720=>300,721=>300,722=>222,723=>222,724=>340,725=>340,726=>280,727=>362,728=>333,729=>333,730=>333,731=>333,732=>333,733=>333,734=>333,736=>278,737=>153,738=>270,739=>274,740=>325,741=>360,742=>360,743=>360,744=>360,745=>360,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,864=>0,865=>0,884=>308,885=>308,890=>278,894=>278,900=>278,901=>278,902=>667,903=>278,904=>704,905=>759,906=>315,908=>778,910=>746,911=>758,912=>222,913=>667,914=>667,915=>550,916=>682,917=>667,918=>611,919=>722,920=>778,921=>278,922=>667,923=>667,924=>833,925=>722,926=>650,927=>778,928=>722,929=>667,931=>602,932=>611,933=>667,934=>808,935=>667,936=>804,937=>758,938=>278,939=>667,940=>576,941=>434,942=>556,943=>222,944=>551,945=>576,946=>563,947=>500,948=>557,949=>434,950=>440,951=>556,952=>556,953=>222,954=>498,955=>500,956=>553,957=>500,958=>432,959=>556,960=>678,961=>571,962=>472,963=>619,964=>382,965=>551,966=>649,967=>522,968=>729,969=>766,970=>222,971=>551,972=>556,973=>551,974=>766,976=>563,977=>616,978=>631,979=>726,980=>631,981=>644,982=>781,986=>722,988=>578,990=>570,992=>692,994=>880,995=>833,996=>684,997=>558,998=>680,999=>529,1000=>557,1001=>505,1002=>623,1003=>603,1004=>610,1005=>611,1006=>568,1007=>434,1008=>600,1009=>571,1010=>500,1011=>222,1025=>667,1026=>865,1027=>567,1028=>717,1029=>667,1030=>278,1031=>278,1032=>500,1033=>1105,1034=>1009,1035=>867,1036=>584,1038=>635,1039=>723,1040=>667,1041=>655,1042=>667,1043=>567,1044=>677,1045=>667,1046=>923,1047=>604,1048=>722,1049=>722,1050=>584,1051=>705,1052=>833,1053=>722,1054=>778,1055=>723,1056=>667,1057=>722,1058=>611,1059=>635,1060=>760,1061=>667,1062=>740,1063=>684,1064=>920,1065=>939,1066=>793,1067=>883,1068=>655,1069=>717,1070=>1006,1071=>722,1072=>556,1073=>573,1074=>531,1075=>383,1076=>583,1077=>556,1078=>669,1079=>458,1080=>559,1081=>559,1082=>437,1083=>571,1084=>683,1085=>552,1086=>556,1087=>542,1088=>556,1089=>500,1090=>458,1091=>500,1092=>823,1093=>500,1094=>562,1095=>533,1096=>802,1097=>823,1098=>620,1099=>717,1100=>523,1101=>510,1102=>744,1103=>542,1105=>556,1106=>556,1107=>383,1108=>510,1109=>500,1110=>222,1111=>278,1112=>222,1113=>873,1114=>811,1115=>556,1116=>437,1118=>500,1119=>542,1120=>976,1121=>766,1122=>656,1123=>521,1124=>950,1125=>694,1126=>667,1127=>597,1128=>952,1129=>817,1130=>654,1131=>600,1132=>932,1133=>817,1134=>604,1135=>458,1136=>804,1137=>729,1138=>778,1139=>556,1140=>667,1141=>500,1142=>667,1143=>500,1144=>1279,1145=>1060,1146=>778,1147=>556,1148=>976,1149=>766,1150=>976,1151=>766,1152=>722,1153=>514,1154=>686,1155=>334,1156=>382,1157=>334,1158=>334,1168=>435,1169=>339,1170=>567,1171=>383,1172=>656,1173=>556,1174=>923,1175=>669,1176=>604,1177=>458,1178=>584,1179=>437,1180=>584,1181=>437,1182=>584,1183=>437,1184=>764,1185=>537,1186=>741,1187=>573,1188=>900,1189=>670,1190=>736,1191=>560,1192=>778,1193=>560,1194=>722,1195=>500,1196=>611,1197=>458,1198=>667,1199=>500,1200=>667,1201=>500,1202=>667,1203=>500,1204=>916,1205=>661,1206=>684,1207=>533,1208=>684,1209=>533,1210=>684,1211=>556,1212=>829,1213=>667,1214=>829,1215=>667,1216=>278,1217=>923,1218=>669,1219=>584,1220=>437,1223=>735,1224=>570,1227=>684,1228=>533,1232=>667,1233=>556,1234=>667,1235=>556,1236=>1000,1237=>889,1238=>667,1239=>556,1240=>729,1241=>556,1242=>729,1243=>556,1244=>923,1245=>669,1246=>604,1247=>458,1248=>604,1249=>492,1250=>722,1251=>559,1252=>722,1253=>559,1254=>778,1255=>556,1256=>778,1257=>556,1258=>778,1259=>556,1262=>635,1263=>500,1264=>635,1265=>500,1266=>635,1267=>500,1268=>684,1269=>533,1272=>883,1273=>717,1329=>635,1330=>531,1331=>583,1332=>583,1333=>531,1334=>531,1335=>427,1336=>531,1337=>750,1338=>635,1339=>531,1340=>375,1341=>583,1342=>698,1343=>531,1344=>427,1345=>531,1346=>583,1347=>531,1348=>635,1349=>698,1350=>635,1351=>635,1352=>531,1353=>531,1354=>698,1355=>531,1356=>635,1357=>531,1358=>698,1359=>583,1360=>479,1361=>583,1362=>531,1363=>698,1364=>698,1365=>635,1366=>750,1369=>271,1370=>271,1371=>150,1372=>300,1373=>271,1374=>271,1375=>420,1377=>583,1378=>427,1379=>427,1380=>427,1381=>427,1382=>427,1383=>427,1384=>427,1385=>459,1386=>427,1387=>427,1388=>323,1389=>531,1390=>427,1391=>427,1392=>427,1393=>427,1394=>427,1395=>427,1396=>427,1397=>271,1398=>427,1399=>375,1400=>427,1401=>375,1402=>583,1403=>427,1404=>427,1405=>427,1406=>427,1407=>583,1408=>427,1409=>427,1410=>323,1411=>583,1412=>375,1413=>375,1414=>583,1415=>527,1417=>271,1425=>360,1426=>360,1427=>360,1428=>360,1429=>360,1430=>360,1431=>360,1432=>360,1433=>360,1434=>360,1435=>360,1436=>360,1437=>360,1438=>360,1439=>360,1440=>360,1441=>360,1443=>360,1444=>360,1445=>360,1446=>360,1447=>360,1448=>360,1449=>360,1450=>360,1451=>360,1452=>360,1453=>360,1454=>360,1455=>360,1456=>360,1457=>360,1458=>360,1459=>360,1460=>360,1461=>360,1462=>360,1463=>360,1464=>360,1465=>360,1467=>360,1468=>360,1469=>360,1470=>366,1471=>360,1472=>225,1473=>360,1474=>360,1475=>238,1476=>360,1488=>577,1489=>563,1490=>411,1491=>512,1492=>594,1493=>316,1494=>326,1495=>594,1496=>594,1497=>316,1498=>507,1499=>527,1500=>484,1501=>594,1502=>594,1503=>316,1504=>338,1505=>604,1506=>550,1507=>567,1508=>569,1509=>505,1510=>514,1511=>583,1512=>507,1513=>700,1514=>633,1520=>590,1521=>590,1522=>590,1523=>216,1524=>412,1548=>278,1563=>278,1567=>556,1569=>529,1570=>243,1571=>243,1572=>470,1573=>243,1574=>731,1575=>243,1576=>771,1577=>514,1578=>771,1579=>771,1580=>544,1581=>544,1582=>544,1583=>430,1584=>430,1585=>421,1586=>421,1587=>1194,1588=>1194,1589=>1291,1590=>1291,1591=>843,1592=>843,1593=>594,1594=>594,1600=>279,1601=>957,1602=>800,1603=>757,1604=>662,1605=>589,1606=>692,1607=>514,1608=>470,1609=>731,1610=>731,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1632=>480,1633=>480,1634=>480,1635=>480,1636=>480,1637=>480,1638=>480,1639=>480,1640=>480,1641=>480,1642=>547,1643=>278,1644=>278,1645=>438,1648=>0,1649=>243,1650=>243,1651=>243,1652=>0,1653=>380,1654=>470,1655=>548,1656=>772,1657=>771,1658=>771,1659=>771,1660=>771,1661=>771,1662=>771,1663=>771,1664=>771,1665=>544,1666=>544,1667=>544,1668=>544,1669=>544,1670=>544,1671=>544,1672=>430,1673=>430,1674=>430,1675=>430,1676=>430,1677=>430,1678=>430,1679=>430,1680=>430,1681=>421,1682=>421,1683=>421,1684=>421,1685=>421,1686=>419,1687=>421,1688=>421,1689=>421,1690=>1194,1691=>1194,1692=>1194,1693=>1291,1694=>1291,1695=>843,1696=>594,1697=>957,1698=>957,1699=>957,1700=>957,1701=>957,1702=>957,1703=>800,1704=>800,1705=>828,1706=>1058,1707=>828,1708=>757,1709=>757,1710=>757,1711=>828,1712=>828,1713=>828,1714=>828,1715=>828,1716=>828,1717=>662,1718=>662,1719=>662,1722=>692,1723=>692,1724=>692,1725=>692,1726=>706,1728=>514,1729=>509,1730=>509,1731=>509,1732=>470,1733=>470,1734=>470,1735=>470,1736=>470,1737=>470,1738=>470,1739=>470,1740=>731,1741=>841,1742=>731,1744=>731,1745=>731,1746=>550,1747=>550,1748=>279,1749=>514,1750=>726,1751=>558,1752=>321,1753=>318,1754=>342,1755=>373,1756=>716,1757=>688,1758=>852,1759=>288,1760=>288,1761=>388,1762=>350,1763=>716,1764=>146,1765=>282,1766=>339,1767=>339,1768=>415,1769=>514,1770=>220,1771=>220,1772=>220,1773=>350,1776=>480,1777=>480,1778=>480,1779=>480,1780=>480,1781=>480,1782=>480,1783=>480,1784=>480,1785=>480,2305=>0,2306=>0,2307=>294,2309=>693,2310=>910,2311=>533,2312=>533,2313=>590,2314=>713,2315=>920,2316=>677,2317=>611,2318=>611,2319=>611,2320=>611,2321=>910,2322=>910,2323=>910,2324=>910,2325=>667,2326=>732,2327=>593,2328=>639,2329=>624,2330=>688,2331=>713,2332=>688,2333=>712,2334=>697,2335=>502,2336=>533,2337=>583,2338=>523,2339=>693,2340=>585,2341=>638,2342=>533,2343=>640,2344=>585,2345=>585,2346=>565,2347=>699,2348=>592,2349=>689,2350=>633,2351=>600,2352=>486,2353=>486,2354=>680,2355=>730,2356=>730,2357=>592,2358=>684,2359=>608,2360=>646,2361=>546,2364=>0,2365=>373,2366=>319,2367=>319,2368=>319,2369=>0,2370=>0,2371=>0,2372=>0,2373=>0,2374=>0,2375=>0,2376=>0,2377=>319,2378=>319,2379=>319,2380=>319,2381=>0,2384=>884,2385=>0,2386=>0,2387=>0,2388=>0,2392=>667,2393=>732,2394=>593,2395=>688,2396=>583,2397=>523,2398=>699,2399=>600,2400=>920,2401=>677,2402=>0,2403=>0,2404=>331,2405=>513,2406=>639,2407=>639,2408=>639,2409=>639,2410=>639,2411=>639,2412=>639,2413=>639,2414=>639,2415=>639,2416=>362,2433=>0,2434=>430,2435=>430,2437=>786,2438=>1030,2439=>582,2440=>603,2441=>648,2442=>757,2443=>758,2444=>630,2447=>685,2448=>746,2451=>711,2452=>776,2453=>779,2454=>655,2455=>606,2456=>645,2457=>661,2458=>554,2459=>585,2460=>729,2461=>752,2462=>893,2463=>567,2464=>625,2465=>648,2466=>567,2467=>598,2468=>680,2469=>645,2470=>609,2471=>596,2472=>595,2474=>635,2475=>780,2476=>593,2477=>677,2478=>621,2479=>601,2480=>593,2482=>640,2486=>598,2487=>596,2488=>637,2489=>582,2492=>0,2494=>245,2495=>245,2496=>245,2497=>0,2498=>0,2499=>0,2500=>0,2503=>309,2504=>309,2507=>932,2508=>932,2509=>0,2519=>245,2524=>648,2525=>553,2527=>596,2528=>758,2529=>630,2530=>0,2531=>335,2534=>610,2535=>559,2536=>595,2537=>711,2538=>610,2539=>661,2540=>661,2541=>559,2542=>661,2543=>600,2544=>593,2545=>593,2546=>601,2547=>567,2548=>601,2549=>699,2550=>661,2551=>267,2552=>610,2553=>424,2554=>548,2562=>0,2565=>691,2566=>936,2567=>803,2568=>803,2569=>678,2570=>678,2575=>557,2576=>691,2579=>678,2580=>691,2581=>602,2582=>567,2583=>641,2584=>688,2585=>565,2586=>592,2587=>603,2588=>591,2589=>541,2590=>558,2591=>543,2592=>581,2593=>596,2594=>640,2595=>640,2596=>591,2597=>564,2598=>640,2599=>564,2600=>581,2602=>564,2603=>551,2604=>560,2605=>549,2606=>558,2607=>652,2608=>540,2610=>677,2611=>677,2613=>601,2614=>558,2616=>558,2617=>549,2620=>0,2622=>246,2623=>246,2624=>246,2625=>0,2626=>0,2631=>0,2632=>0,2635=>0,2636=>0,2637=>0,2649=>567,2650=>690,2651=>591,2652=>591,2654=>581,2662=>591,2663=>591,2664=>591,2665=>591,2666=>591,2667=>591,2668=>591,2669=>591,2670=>591,2671=>591,2672=>0,2673=>0,2674=>557,2675=>678,2676=>894,2689=>0,2690=>0,2691=>300,2693=>781,2694=>1044,2695=>589,2696=>589,2697=>560,2698=>758,2699=>806,2701=>781,2703=>781,2704=>781,2705=>1044,2707=>1044,2708=>1044,2709=>413,2710=>773,2711=>606,2712=>558,2713=>483,2714=>600,2715=>691,2716=>811,2717=>647,2718=>651,2719=>453,2720=>450,2721=>425,2722=>478,2723=>694,2724=>534,2725=>553,2726=>446,2727=>541,2728=>582,2730=>572,2731=>437,2732=>663,2733=>756,2734=>594,2735=>493,2736=>392,2738=>613,2739=>656,2741=>538,2742=>611,2743=>507,2744=>663,2745=>587,2748=>0,2749=>478,2750=>273,2751=>273,2752=>273,2753=>0,2754=>0,2755=>0,2756=>0,2757=>0,2759=>0,2760=>0,2761=>273,2763=>273,2764=>273,2765=>0,2768=>843,2784=>893,2790=>625,2791=>625,2792=>625,2793=>625,2794=>625,2795=>625,2796=>625,2797=>625,2798=>625,2799=>625,2817=>0,2818=>306,2819=>391,2821=>590,2822=>808,2823=>658,2824=>658,2825=>633,2826=>654,2827=>636,2828=>540,2831=>560,2832=>938,2835=>600,2836=>973,2837=>603,2838=>620,2839=>620,2840=>605,2841=>712,2842=>579,2843=>579,2844=>593,2845=>564,2846=>581,2847=>604,2848=>578,2849=>579,2850=>579,2851=>607,2852=>579,2853=>587,2854=>579,2855=>602,2856=>579,2858=>605,2859=>728,2860=>579,2861=>643,2862=>605,2863=>628,2864=>619,2866=>653,2867=>593,2870=>620,2871=>605,2872=>605,2873=>579,2876=>0,2877=>333,2878=>218,2879=>0,2880=>294,2881=>0,2882=>0,2883=>0,2887=>479,2888=>479,2891=>1026,2892=>1026,2893=>0,2902=>0,2903=>218,2908=>579,2909=>579,2911=>599,2912=>636,2913=>540,2918=>578,2919=>480,2920=>480,2921=>622,2922=>506,2923=>605,2924=>529,2925=>548,2926=>512,2927=>528,2928=>561,2946=>0,2947=>742,2949=>1002,2950=>1118,2951=>994,2952=>660,2953=>1012,2954=>1231,2958=>726,2959=>731,2960=>870,2962=>763,2963=>763,2964=>1636,2965=>667,2969=>830,2970=>584,2972=>876,2974=>986,2975=>802,2979=>1295,2980=>656,2984=>630,2985=>1012,2986=>694,2990=>727,2991=>790,2992=>545,2993=>718,2994=>821,2995=>871,2996=>724,2997=>873,2999=>1087,3000=>1098,3001=>1274,3006=>547,3007=>172,3008=>93,3009=>519,3010=>814,3014=>748,3015=>681,3016=>956,3018=>1666,3019=>1666,3020=>1994,3021=>0,3031=>871,3047=>667,3048=>1012,3049=>751,3050=>740,3051=>924,3052=>884,3053=>726,3054=>1002,3055=>825,3056=>717,3057=>719,3058=>774,3073=>365,3074=>601,3075=>346,3077=>720,3078=>786,3079=>567,3080=>1159,3081=>690,3082=>1047,3083=>1299,3084=>913,3086=>625,3087=>625,3088=>712,3090=>655,3091=>655,3092=>862,3093=>515,3094=>680,3095=>526,3096=>943,3097=>655,3098=>684,3099=>684,3100=>670,3101=>1205,3102=>732,3103=>888,3104=>597,3105=>709,3106=>709,3107=>809,3108=>715,3109=>702,3110=>702,3111=>702,3112=>607,3114=>623,3115=>623,3116=>681,3117=>681,3118=>932,3119=>1203,3120=>597,3121=>893,3122=>631,3123=>608,3125=>620,3126=>541,3127=>667,3128=>640,3129=>911,3134=>644,3135=>298,3136=>298,3137=>361,3138=>682,3139=>342,3140=>704,3142=>624,3143=>624,3144=>900,3146=>849,3147=>849,3148=>976,3149=>669,3157=>298,3158=>119,3168=>1620,3169=>1281,3174=>840,3175=>840,3176=>840,3177=>840,3178=>840,3179=>840,3180=>840,3181=>840,3182=>840,3183=>840,3202=>440,3203=>251,3205=>654,3206=>654,3207=>631,3208=>891,3209=>957,3210=>1293,3211=>1044,3212=>744,3214=>650,3215=>650,3216=>659,3218=>667,3219=>667,3220=>667,3221=>462,3222=>749,3223=>543,3224=>779,3225=>674,3226=>682,3227=>660,3228=>667,3229=>1171,3230=>926,3231=>671,3232=>557,3233=>669,3234=>669,3235=>728,3236=>544,3237=>672,3238=>672,3239=>672,3240=>560,3242=>668,3243=>668,3244=>681,3245=>687,3246=>972,3247=>1101,3248=>556,3249=>677,3250=>661,3251=>545,3253=>666,3254=>553,3255=>670,3256=>549,3257=>716,3262=>425,3263=>341,3264=>680,3265=>354,3266=>714,3267=>386,3268=>638,3270=>307,3271=>670,3272=>462,3274=>908,3275=>1251,3276=>434,3277=>336,3285=>344,3286=>404,3294=>673,3296=>1695,3297=>978,3302=>549,3303=>549,3304=>549,3305=>549,3306=>549,3307=>549,3308=>549,3309=>549,3310=>549,3311=>549,3330=>368,3331=>305,3333=>1201,3334=>1351,3335=>905,3336=>1459,3337=>635,3338=>1198,3339=>861,3340=>957,3342=>1211,3343=>1202,3344=>1839,3346=>642,3347=>1114,3348=>1195,3349=>861,3350=>982,3351=>874,3352=>1354,3353=>957,3354=>1016,3355=>1266,3356=>712,3357=>1454,3358=>1215,3359=>563,3360=>565,3361=>1192,3362=>1244,3363=>1268,3364=>878,3365=>966,3366=>545,3367=>879,3368=>879,3370=>1031,3371=>1175,3372=>1334,3373=>546,3374=>643,3375=>949,3376=>642,3377=>555,3378=>945,3379=>631,3380=>553,3381=>959,3382=>936,3383=>1122,3384=>1190,3385=>1112,3390=>475,3391=>418,3392=>442,3393=>340,3394=>340,3395=>473,3398=>640,3399=>530,3400=>1279,3402=>1368,3403=>1258,3404=>1447,3405=>0,3415=>553,3424=>861,3425=>1100,3430=>1095,3431=>929,3432=>854,3433=>1181,3434=>658,3435=>972,3436=>1210,3437=>650,3438=>959,3439=>896,3585=>595,3586=>648,3587=>665,3588=>608,3589=>608,3590=>665,3591=>471,3592=>556,3593=>652,3594=>664,3595=>681,3596=>816,3597=>849,3598=>620,3599=>620,3600=>541,3601=>785,3602=>826,3603=>887,3604=>598,3605=>605,3606=>595,3607=>650,3608=>541,3609=>652,3610=>608,3611=>608,3612=>630,3613=>630,3614=>695,3615=>695,3616=>620,3617=>581,3618=>588,3619=>501,3620=>595,3621=>569,3622=>620,3623=>519,3624=>592,3625=>659,3626=>574,3627=>654,3628=>695,3629=>566,3630=>574,3631=>517,3632=>452,3633=>0,3634=>496,3635=>496,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0,3647=>687,3648=>302,3649=>571,3650=>478,3651=>515,3652=>515,3653=>496,3654=>506,3655=>0,3656=>0,3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0,3663=>555,3664=>598,3665=>640,3666=>688,3667=>690,3668=>657,3669=>657,3670=>635,3671=>839,3672=>693,3673=>769,3674=>673,3675=>994,3713=>775,3714=>707,3716=>724,3719=>524,3720=>690,3722=>678,3725=>711,3732=>719,3733=>834,3734=>776,3735=>916,3737=>744,3738=>740,3739=>740,3740=>834,3741=>834,3742=>854,3743=>854,3745=>775,3746=>724,3747=>697,3749=>700,3751=>700,3754=>708,3755=>916,3757=>700,3758=>697,3759=>658,3760=>432,3761=>534,3762=>476,3763=>476,3764=>778,3765=>778,3766=>778,3767=>778,3768=>778,3769=>778,3771=>778,3772=>778,3773=>670,3776=>420,3777=>806,3778=>430,3779=>446,3780=>346,3782=>571,3784=>778,3785=>778,3786=>778,3787=>778,3788=>778,3789=>778,3792=>721,3793=>719,3794=>601,3795=>711,3796=>686,3797=>686,3798=>834,3799=>756,3800=>724,3801=>906,3804=>1272,3805=>1272,3840=>600,3841=>600,3842=>600,3843=>600,3844=>600,3845=>600,3846=>600,3847=>600,3848=>600,3849=>600,3850=>600,3851=>600,3852=>600,3853=>600,3854=>600,3855=>600,3856=>600,3857=>600,3858=>600,3859=>600,3860=>600,3861=>600,3862=>600,3863=>600,3864=>600,3865=>600,3866=>600,3867=>600,3868=>600,3869=>600,3870=>600,3871=>600,3872=>600,3873=>600,3874=>600,3875=>600,3876=>600,3877=>600,3878=>600,3879=>600,3880=>600,3881=>600,3882=>600,3883=>600,3884=>600,3885=>600,3886=>600,3887=>600,3888=>600,3889=>600,3890=>600,3891=>600,3892=>600,3893=>600,3894=>600,3895=>600,3896=>600,3897=>600,3898=>600,3899=>600,3900=>600,3901=>600,3902=>600,3903=>600,3904=>600,3905=>600,3906=>600,3907=>600,3908=>600,3909=>600,3910=>600,3911=>600,3913=>600,3914=>600,3915=>600,3916=>600,3917=>600,3918=>600,3919=>600,3920=>600,3921=>600,3922=>600,3923=>600,3924=>600,3925=>600,3926=>600,3927=>600,3928=>600,3929=>600,3930=>600,3931=>600,3932=>600,3933=>600,3934=>600,3935=>600,3936=>600,3937=>600,3938=>600,3939=>600,3940=>600,3941=>600,3942=>600,3943=>600,3944=>600,3945=>600,3953=>600,3954=>600,3955=>600,3956=>600,3957=>600,3958=>600,3959=>600,3960=>600,3961=>600,3962=>600,3963=>600,3964=>600,3965=>600,3966=>600,3967=>600,3968=>600,3969=>600,3970=>600,3971=>600,3972=>600,3973=>600,3974=>600,3975=>600,3976=>600,3977=>600,3978=>600,3979=>600,3984=>600,3985=>600,3986=>600,3987=>600,3988=>600,3989=>600,3991=>600,3993=>600,3994=>600,3995=>600,3996=>600,3997=>600,3998=>600,3999=>600,4000=>600,4001=>600,4002=>600,4003=>600,4004=>600,4005=>600,4006=>600,4007=>600,4008=>600,4009=>600,4010=>600,4011=>600,4012=>600,4013=>600,4017=>600,4018=>600,4019=>600,4020=>600,4021=>600,4022=>600,4023=>600,4025=>600,4256=>662,4257=>677,4258=>708,4259=>696,4260=>609,4261=>790,4262=>664,4263=>785,4264=>560,4265=>634,4266=>782,4267=>701,4268=>629,4269=>682,4270=>705,4271=>692,4272=>734,4273=>615,4274=>592,4275=>680,4276=>679,4277=>705,4278=>643,4279=>623,4280=>623,4281=>629,4282=>633,4283=>770,4284=>592,4285=>662,4286=>629,4287=>672,4288=>735,4289=>576,4290=>606,4291=>605,4292=>676,4293=>792,4304=>435,4305=>556,4306=>565,4307=>872,4308=>506,4309=>544,4310=>723,4311=>868,4312=>530,4313=>532,4314=>955,4315=>552,4316=>565,4317=>712,4318=>547,4319=>574,4320=>685,4321=>554,4322=>806,4323=>810,4324=>777,4325=>502,4326=>686,4327=>512,4328=>552,4329=>496,4330=>568,4331=>552,4332=>592,4333=>565,4334=>552,4335=>741,4336=>549,4337=>659,4338=>559,4339=>524,4340=>482,4341=>565,4342=>822,4347=>506,4352=>1000,4353=>1000,4354=>1000,4355=>1000,4356=>1000,4357=>1000,4358=>1000,4359=>1000,4360=>1000,4361=>1000,4362=>1000,4363=>1000,4364=>1000,4365=>1000,4366=>1000,4367=>1000,4368=>1000,4369=>1000,4370=>1000,4371=>1000,4372=>1000,4373=>1000,4374=>1000,4375=>1000,4376=>1000,4377=>1000,4378=>1000,4379=>1000,4380=>1000,4381=>1000,4382=>1000,4383=>1000,4384=>1000,4385=>1000,4386=>1000,4387=>1000,4388=>1000,4389=>1000,4390=>1000,4391=>1000,4392=>1000,4393=>1000,4394=>1000,4395=>1000,4396=>1000,4397=>1000,4398=>1000,4399=>1000,4400=>1000,4401=>1000,4402=>1000,4403=>1000,4404=>1000,4405=>1000,4406=>1000,4407=>1000,4408=>1000,4409=>1000,4410=>1000,4411=>1000,4412=>1000,4413=>1000,4414=>1000,4415=>1000,4416=>1000,4417=>1000,4418=>1000,4419=>1000,4420=>1000,4421=>1000,4422=>1000,4423=>1000,4424=>1000,4425=>1000,4426=>1000,4427=>1000,4428=>1000,4429=>1000,4430=>1000,4431=>1000,4432=>1000,4433=>1000,4434=>1000,4435=>1000,4436=>1000,4437=>1000,4438=>1000,4439=>1000,4440=>1000,4441=>1000,4447=>1000,4448=>1000,4449=>1000,4450=>1000,4451=>1000,4452=>1000,4453=>1000,4454=>1000,4455=>1000,4456=>1000,4457=>1000,4458=>1000,4459=>1000,4460=>1000,4461=>1000,4462=>1000,4463=>1000,4464=>1000,4465=>1000,4466=>1000,4467=>1000,4468=>1000,4469=>1000,4470=>1000,4471=>1000,4472=>1000,4473=>1000,4474=>1000,4475=>1000,4476=>1000,4477=>1000,4478=>1000,4479=>1000,4480=>1000,4481=>1000,4482=>1000,4483=>1000,4484=>1000,4485=>1000,4486=>1000,4487=>1000,4488=>1000,4489=>1000,4490=>1000,4491=>1000,4492=>1000,4493=>1000,4494=>1000,4495=>1000,4496=>1000,4497=>1000,4498=>1000,4499=>1000,4500=>1000,4501=>1000,4502=>1000,4503=>1000,4504=>1000,4505=>1000,4506=>1000,4507=>1000,4508=>1000,4509=>1000,4510=>1000,4511=>1000,4512=>1000,4513=>1000,4514=>1000,4520=>1000,4521=>1000,4522=>1000,4523=>1000,4524=>1000,4525=>1000,4526=>1000,4527=>1000,4528=>1000,4529=>1000,4530=>1000,4531=>1000,4532=>1000,4533=>1000,4534=>1000,4535=>1000,4536=>1000,4537=>1000,4538=>1000,4539=>1000,4540=>1000,4541=>1000,4542=>1000,4543=>1000,4544=>1000,4545=>1000,4546=>1000,4547=>1000,4548=>1000,4549=>1000,4550=>1000,4551=>1000,4552=>1000,4553=>1000,4554=>1000,4555=>1000,4556=>1000,4557=>1000,4558=>1000,4559=>1000,4560=>1000,4561=>1000,4562=>1000,4563=>1000,4564=>1000,4565=>1000,4566=>1000,4567=>1000,4568=>1000,4569=>1000,4570=>1000,4571=>1000,4572=>1000,4573=>1000,4574=>1000,4575=>1000,4576=>1000,4577=>1000,4578=>1000,4579=>1000,4580=>1000,4581=>1000,4582=>1000,4583=>1000,4584=>1000,4585=>1000,4586=>1000,4587=>1000,4588=>1000,4589=>1000,4590=>1000,4591=>1000,4592=>1000,4593=>1000,4594=>1000,4595=>1000,4596=>1000,4597=>1000,4598=>1000,4599=>1000,4600=>1000,4601=>1000,7680=>667,7681=>556,7682=>667,7683=>556,7684=>667,7685=>556,7686=>667,7687=>556,7688=>722,7689=>500,7690=>722,7691=>556,7692=>722,7693=>556,7694=>722,7695=>556,7696=>722,7697=>556,7698=>722,7699=>556,7700=>667,7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667,7707=>556,7708=>667,7709=>556,7710=>611,7711=>278,7712=>778,7713=>556,7714=>722,7715=>556,7716=>722,7717=>556,7718=>722,7719=>556,7720=>722,7721=>556,7722=>722,7723=>556,7724=>278,7725=>222,7726=>278,7727=>278,7728=>667,7729=>500,7730=>667,7731=>500,7732=>667,7733=>500,7734=>556,7735=>222,7736=>556,7737=>222,7738=>556,7739=>222,7740=>556,7741=>222,7742=>833,7743=>833,7744=>833,7745=>833,7746=>833,7747=>833,7748=>722,7749=>556,7750=>722,7751=>556,7752=>722,7753=>556,7754=>722,7755=>556,7756=>778,7757=>556,7758=>778,7759=>556,7760=>778,7761=>556,7762=>778,7763=>556,7764=>667,7765=>556,7766=>667,7767=>556,7768=>722,7769=>333,7770=>722,7771=>333,7772=>722,7773=>333,7774=>722,7775=>333,7776=>667,7777=>500,7778=>667,7779=>500,7780=>667,7781=>500,7782=>667,7783=>500,7784=>667,7785=>500,7786=>611,7787=>278,7788=>611,7789=>278,7790=>611,7791=>278,7792=>611,7793=>278,7794=>722,7795=>556,7796=>722,7797=>556,7798=>722,7799=>556,7800=>722,7801=>556,7802=>722,7803=>556,7804=>667,7805=>500,7806=>667,7807=>500,7808=>944,7809=>722,7810=>944,7811=>722,7812=>944,7813=>722,7814=>944,7815=>722,7816=>944,7817=>722,7818=>667,7819=>500,7820=>667,7821=>500,7822=>667,7823=>500,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500,7830=>556,7831=>278,7832=>722,7833=>500,7834=>556,7835=>278,7840=>667,7841=>556,7842=>667,7843=>556,7844=>667,7845=>556,7846=>667,7847=>556,7848=>667,7849=>556,7850=>667,7851=>556,7852=>667,7853=>556,7854=>667,7855=>556,7856=>667,7857=>556,7858=>667,7859=>556,7860=>667,7861=>556,7862=>667,7863=>556,7864=>667,7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667,7871=>556,7872=>667,7873=>556,7874=>667,7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278,7881=>278,7882=>278,7883=>222,7884=>778,7885=>556,7886=>778,7887=>556,7888=>778,7889=>556,7890=>778,7891=>556,7892=>778,7893=>556,7894=>778,7895=>556,7896=>778,7897=>556,7898=>776,7899=>556,7900=>776,7901=>556,7902=>776,7903=>556,7904=>776,7905=>556,7906=>776,7907=>556,7908=>722,7909=>556,7910=>722,7911=>556,7912=>776,7913=>620,7914=>776,7915=>620,7916=>776,7917=>620,7918=>776,7919=>620,7920=>776,7921=>620,7922=>667,7923=>500,7924=>667,7925=>500,7926=>667,7927=>500,7928=>667,7929=>500,7936=>576,7937=>576,7938=>576,7939=>576,7940=>576,7941=>576,7942=>576,7943=>576,7944=>667,7945=>667,7946=>680,7947=>680,7948=>680,7949=>680,7950=>718,7951=>718,7952=>434,7953=>434,7954=>434,7955=>434,7956=>434,7957=>434,7960=>692,7961=>692,7962=>823,7963=>823,7964=>823,7965=>823,7968=>556,7969=>556,7970=>556,7971=>556,7972=>556,7973=>556,7974=>556,7975=>556,7976=>747,7977=>747,7978=>878,7979=>878,7980=>878,7981=>878,7982=>923,7983=>923,7984=>222,7985=>222,7986=>222,7987=>222,7988=>222,7989=>222,7990=>222,7991=>222,7992=>303,7993=>303,7994=>434,7995=>434,7996=>434,7997=>434,7998=>479,7999=>479,8000=>556,8001=>556,8002=>556,8003=>556,8004=>556,8005=>556,8008=>778,8009=>778,8010=>894,8011=>894,8012=>894,8013=>894,8016=>551,8017=>551,8018=>551,8019=>551,8020=>551,8021=>551,8022=>551,8023=>551,8025=>777,8027=>893,8029=>885,8031=>940,8032=>766,8033=>766,8034=>766,8035=>766,8036=>766,8037=>766,8038=>766,8039=>766,8040=>758,8041=>758,8042=>874,8043=>874,8044=>868,8045=>867,8046=>911,8047=>911,8048=>576,8049=>576,8050=>434,8051=>434,8052=>556,8053=>556,8054=>222,8055=>222,8056=>556,8057=>556,8058=>551,8059=>551,8060=>766,8061=>766,8064=>576,8065=>576,8066=>576,8067=>576,8068=>576,8069=>576,8070=>576,8071=>576,8072=>667,8073=>667,8074=>680,8075=>680,8076=>680,8077=>680,8078=>718,8079=>718,8080=>556,8081=>556,8082=>556,8083=>556,8084=>556,8085=>556,8086=>556,8087=>556,8088=>747,8089=>747,8090=>878,8091=>878,8092=>878,8093=>878,8094=>923,8095=>923,8096=>766,8097=>766,8098=>766,8099=>766,8100=>766,8101=>766,8102=>766,8103=>766,8104=>758,8105=>758,8106=>874,8107=>874,8108=>868,8109=>867,8110=>911,8111=>911,8112=>576,8113=>576,8114=>576,8115=>576,8116=>576,8118=>576,8119=>576,8120=>667,8121=>667,8122=>667,8123=>667,8124=>667,8125=>278,8126=>278,8127=>278,8128=>278,8129=>278,8130=>556,8131=>556,8132=>556,8134=>556,8135=>556,8136=>693,8137=>704,8138=>748,8139=>759,8140=>722,8141=>278,8142=>278,8143=>278,8144=>222,8145=>222,8146=>222,8147=>222,8150=>222,8151=>222,8152=>278,8153=>278,8154=>304,8155=>304,8157=>278,8158=>278,8159=>278,8160=>551,8161=>551,8162=>551,8163=>551,8164=>571,8165=>571,8166=>551,8167=>551,8168=>667,8169=>667,8170=>742,8171=>746,8172=>693,8173=>278,8174=>278,8175=>278,8178=>766,8179=>766,8180=>766,8182=>766,8183=>766,8184=>778,8185=>778,8186=>758,8187=>758,8188=>758,8189=>278,8190=>278,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>100,8202=>50,8203=>0,8204=>0,8205=>0,8208=>333,8209=>333,8210=>556,8211=>500,8212=>1000,8213=>564,8214=>428,8215=>500,8216=>222,8217=>222,8218=>222,8219=>222,8220=>333,8221=>333,8222=>333,8223=>333,8224=>556,8225=>556,8226=>350,8227=>350,8228=>278,8229=>556,8230=>1000,8231=>278,8232=>0,8233=>0,8240=>1000,8241=>1330,8242=>222,8243=>372,8244=>522,8245=>206,8246=>356,8247=>506,8248=>312,8249=>333,8250=>333,8251=>1000,8252=>471,8253=>556,8254=>500,8255=>945,8256=>945,8257=>312,8258=>820,8259=>333,8260=>167,8261=>278,8262=>278,8304=>333,8308=>333,8309=>333,8310=>333,8311=>333,8312=>333,8313=>333,8314=>333,8315=>333,8316=>333,8317=>210,8318=>210,8319=>333,8320=>333,8321=>333,8322=>333,8323=>333,8324=>333,8325=>333,8326=>333,8327=>333,8328=>333,8329=>333,8330=>333,8331=>333,8332=>333,8333=>210,8334=>210,8352=>556,8353=>556,8354=>556,8355=>556,8356=>556,8357=>833,8358=>556,8359=>556,8360=>1024,8361=>940,8362=>784,8363=>556,8364=>556,8400=>600,8401=>600,8402=>600,8403=>600,8404=>700,8405=>700,8406=>600,8407=>600,8408=>600,8409=>600,8410=>600,8411=>600,8412=>600,8413=>900,8414=>900,8415=>900,8416=>900,8417=>700,8448=>889,8449=>889,8450=>667,8451=>1022,8452=>611,8453=>889,8454=>889,8455=>501,8456=>667,8457=>921,8458=>510,8459=>906,8460=>988,8461=>722,8462=>500,8463=>500,8464=>688,8465=>553,8466=>708,8467=>291,8468=>778,8469=>722,8470=>1073,8471=>737,8472=>740,8473=>556,8474=>722,8475=>927,8476=>795,8477=>667,8478=>667,8479=>667,8480=>1000,8481=>1174,8482=>1000,8483=>722,8484=>611,8485=>542,8486=>768,8487=>768,8488=>698,8489=>321,8490=>667,8491=>667,8492=>927,8493=>646,8494=>556,8495=>385,8496=>615,8497=>688,8498=>611,8499=>1115,8500=>406,8501=>688,8502=>688,8503=>344,8504=>688,8531=>834,8532=>834,8533=>834,8534=>834,8535=>834,8536=>834,8537=>834,8538=>834,8539=>834,8540=>834,8541=>834,8542=>834,8543=>834,8544=>278,8545=>555,8546=>832,8547=>933,8548=>667,8549=>934,8550=>1031,8551=>1268,8552=>944,8553=>667,8554=>944,8555=>1035,8556=>556,8557=>722,8558=>722,8559=>833,8560=>222,8561=>444,8562=>666,8563=>700,8564=>500,8565=>700,8566=>922,8567=>1144,8568=>712,8569=>500,8570=>712,8571=>934,8572=>222,8573=>500,8574=>556,8575=>833,8576=>983,8577=>722,8578=>983,8592=>713,8593=>713,8594=>713,8595=>713,8596=>713,8597=>713,8598=>713,8599=>713,8600=>713,8601=>713,8602=>713,8603=>713,8604=>713,8605=>713,8606=>713,8607=>713,8608=>713,8609=>713,8610=>713,8611=>713,8612=>713,8613=>713,8614=>713,8615=>713,8616=>713,8617=>713,8618=>713,8619=>713,8620=>713,8621=>813,8622=>813,8623=>713,8624=>713,8625=>713,8626=>713,8627=>713,8628=>713,8629=>713,8630=>713,8631=>713,8632=>713,8633=>713,8634=>800,8635=>800,8636=>713,8637=>713,8638=>713,8639=>713,8640=>713,8641=>713,8642=>713,8643=>713,8644=>713,8645=>713,8646=>713,8647=>713,8648=>713,8649=>713,8650=>713,8651=>713,8652=>713,8653=>713,8654=>950,8655=>713,8656=>713,8657=>713,8658=>713,8659=>713,8660=>863,8661=>713,8662=>713,8663=>713,8664=>713,8665=>713,8666=>713,8667=>713,8668=>813,8669=>813,8670=>713,8671=>713,8672=>713,8673=>713,8674=>713,8675=>713,8676=>713,8677=>713,8678=>713,8679=>713,8680=>713,8681=>713,8682=>713,8704=>600,8705=>600,8706=>494,8707=>600,8708=>600,8709=>800,8710=>612,8711=>612,8712=>549,8713=>549,8714=>549,8715=>549,8716=>549,8717=>549,8718=>549,8719=>823,8720=>823,8721=>713,8722=>584,8723=>584,8724=>584,8725=>167,8726=>278,8727=>389,8728=>400,8729=>400,8730=>600,8731=>600,8732=>600,8733=>549,8734=>549,8735=>584,8736=>584,8737=>584,8738=>584,8739=>260,8740=>444,8741=>418,8742=>602,8743=>561,8744=>561,8745=>561,8746=>561,8747=>506,8748=>806,8749=>1106,8750=>506,8751=>806,8752=>1106,8753=>506,8754=>506,8755=>506,8756=>561,8757=>561,8758=>422,8759=>561,8760=>584,8761=>584,8762=>584,8763=>584,8764=>584,8765=>584,8766=>584,8767=>584,8768=>422,8769=>584,8770=>584,8771=>584,8772=>584,8773=>584,8774=>584,8775=>584,8776=>584,8777=>584,8778=>584,8779=>584,8780=>584,8781=>584,8782=>584,8783=>584,8784=>584,8785=>584,8786=>584,8787=>584,8788=>737,8789=>737,8790=>584,8791=>584,8792=>584,8793=>584,8794=>584,8795=>584,8796=>584,8797=>584,8798=>584,8799=>584,8800=>584,8801=>584,8802=>584,8803=>584,8804=>584,8805=>584,8806=>584,8807=>584,8808=>584,8809=>584,8810=>969,8811=>969,8812=>584,8813=>584,8814=>584,8815=>584,8816=>584,8817=>584,8818=>584,8819=>584,8820=>584,8821=>584,8822=>584,8823=>584,8824=>584,8825=>584,8826=>584,8827=>584,8828=>584,8829=>584,8830=>584,8831=>584,8832=>584,8833=>584,8834=>678,8835=>678,8836=>678,8837=>678,8838=>678,8839=>678,8840=>678,8841=>678,8842=>678,8843=>678,8844=>561,8845=>561,8846=>561,8847=>678,8848=>678,8849=>673,8850=>673,8851=>561,8852=>561,8853=>800,8854=>800,8855=>800,8856=>800,8857=>800,8858=>800,8859=>800,8860=>800,8861=>800,8862=>800,8863=>800,8864=>800,8865=>800,8866=>549,8867=>549,8868=>549,8869=>549,8870=>399,8871=>399,8872=>549,8873=>549,8874=>549,8875=>672,8876=>549,8877=>549,8878=>549,8879=>672,8880=>549,8881=>549,8882=>549,8883=>549,8884=>549,8885=>549,8886=>713,8887=>713,8888=>713,8889=>549,8890=>549,8891=>584,8892=>584,8893=>584,8894=>584,8895=>584,8896=>561,8897=>561,8898=>561,8899=>561,8900=>549,8901=>250,8902=>549,8903=>649,8904=>630,8905=>630,8906=>630,8907=>630,8908=>630,8909=>584,8910=>561,8911=>561,8912=>668,8913=>668,8914=>668,8915=>668,8916=>561,8917=>602,8918=>584,8919=>584,8920=>1354,8921=>1354,8922=>584,8923=>584,8924=>584,8925=>584,8926=>584,8927=>584,8928=>584,8929=>584,8930=>673,8931=>673,8932=>673,8933=>673,8934=>584,8935=>584,8936=>584,8937=>584,8938=>584,8939=>584,8940=>584,8941=>584,8942=>278,8943=>1000,8944=>1000,8945=>1000,8960=>549,8962=>549,8963=>549,8964=>549,8965=>549,8966=>549,8967=>549,8968=>449,8969=>449,8970=>449,8971=>449,8972=>549,8973=>549,8974=>549,8975=>549,8976=>549,8977=>549,8978=>800,8979=>800,8980=>549,8981=>549,8982=>549,8983=>650,8984=>780,8985=>549,8986=>549,8987=>549,8988=>549,8989=>549,8990=>549,8991=>549,8992=>506,8993=>506,8994=>713,8995=>713,8996=>1000,8997=>1000,8998=>1000,8999=>1000,9000=>1000,9001=>329,9002=>329,9003=>1000,9004=>549,9005=>549,9006=>549,9007=>549,9008=>549,9009=>549,9010=>549,9011=>549,9012=>549,9013=>549,9014=>600,9015=>600,9016=>600,9017=>600,9018=>600,9019=>600,9020=>600,9021=>600,9022=>600,9023=>600,9024=>600,9025=>600,9026=>600,9027=>600,9028=>600,9029=>600,9030=>600,9031=>600,9032=>600,9033=>600,9034=>600,9035=>600,9036=>600,9037=>600,9038=>600,9039=>600,9040=>600,9041=>600,9042=>600,9043=>600,9044=>600,9045=>600,9046=>600,9047=>600,9048=>600,9049=>600,9050=>600,9051=>600,9052=>600,9053=>600,9054=>600,9055=>600,9056=>600,9057=>600,9058=>600,9059=>600,9060=>600,9061=>600,9062=>600,9063=>600,9064=>600,9065=>600,9066=>600,9067=>600,9068=>600,9069=>600,9070=>600,9071=>600,9072=>600,9073=>600,9074=>600,9075=>600,9076=>600,9077=>600,9078=>600,9079=>600,9080=>600,9081=>600,9082=>600,9109=>600,9216=>600,9217=>600,9218=>600,9219=>600,9220=>600,9221=>600,9222=>600,9223=>600,9224=>600,9225=>600,9226=>600,9227=>600,9228=>600,9229=>600,9230=>600,9231=>600,9232=>600,9233=>600,9234=>600,9235=>600,9236=>600,9237=>600,9238=>600,9239=>600,9240=>600,9241=>600,9242=>600,9243=>600,9244=>600,9245=>600,9246=>600,9247=>600,9248=>600,9249=>600,9250=>600,9251=>600,9252=>600,9280=>604,9281=>604,9282=>604,9283=>604,9284=>604,9285=>604,9286=>750,9287=>750,9288=>750,9289=>750,9290=>604,9312=>1000,9313=>1000,9314=>1000,9315=>1000,9316=>1000,9317=>1000,9318=>1000,9319=>1000,9320=>1000,9321=>1000,9322=>1000,9323=>1000,9324=>1000,9325=>1000,9326=>1000,9327=>1000,9328=>1000,9329=>1000,9330=>1000,9331=>1000,9332=>1000,9333=>1000,9334=>1000,9335=>1000,9336=>1000,9337=>1000,9338=>1000,9339=>1000,9340=>1000,9341=>1000,9342=>1000,9343=>1000,9344=>1000,9345=>1000,9346=>1000,9347=>1000,9348=>1000,9349=>1000,9350=>1000,9351=>1000,9352=>1000,9353=>1000,9354=>1000,9355=>1000,9356=>1000,9357=>1000,9358=>1000,9359=>1000,9360=>1000,9361=>1000,9362=>1000,9363=>1000,9364=>1000,9365=>1000,9366=>1000,9367=>1000,9368=>1000,9369=>1000,9370=>1000,9371=>1000,9372=>1000,9373=>1000,9374=>1000,9375=>1000,9376=>1000,9377=>1000,9378=>1000,9379=>1000,9380=>1000,9381=>1000,9382=>1000,9383=>1000,9384=>1000,9385=>1000,9386=>1000,9387=>1000,9388=>1000,9389=>1000,9390=>1000,9391=>1000,9392=>1000,9393=>1000,9394=>1000,9395=>1000,9396=>1000,9397=>1000,9398=>1000,9399=>1000,9400=>1000,9401=>1000,9402=>1000,9403=>1000,9404=>1000,9405=>1000,9406=>1000,9407=>1000,9408=>1000,9409=>1000,9410=>1000,9411=>1000,9412=>1000,9413=>1000,9414=>1000,9415=>1000,9416=>1000,9417=>1000,9418=>1000,9419=>1000,9420=>1000,9421=>1000,9422=>1000,9423=>1000,9424=>1000,9425=>1000,9426=>1000,9427=>1000,9428=>1000,9429=>1000,9430=>1000,9431=>1000,9432=>1000,9433=>1000,9434=>1000,9435=>1000,9436=>1000,9437=>1000,9438=>1000,9439=>1000,9440=>1000,9441=>1000,9442=>1000,9443=>1000,9444=>1000,9445=>1000,9446=>1000,9447=>1000,9448=>1000,9449=>1000,9450=>1000,9472=>600,9473=>600,9474=>600,9475=>600,9476=>600,9477=>600,9478=>600,9479=>600,9480=>600,9481=>600,9482=>600,9483=>600,9484=>600,9485=>600,9486=>600,9487=>600,9488=>600,9489=>600,9490=>600,9491=>600,9492=>600,9493=>600,9494=>600,9495=>600,9496=>600,9497=>600,9498=>600,9499=>600,9500=>600,9501=>600,9502=>600,9503=>600,9504=>600,9505=>600,9506=>600,9507=>600,9508=>600,9509=>600,9510=>600,9511=>600,9512=>600,9513=>600,9514=>600,9515=>600,9516=>600,9517=>600,9518=>600,9519=>600,9520=>600,9521=>600,9522=>600,9523=>600,9524=>600,9525=>600,9526=>600,9527=>600,9528=>600,9529=>600,9530=>600,9531=>600,9532=>600,9533=>600,9534=>600,9535=>600,9536=>600,9537=>600,9538=>600,9539=>600,9540=>600,9541=>600,9542=>600,9543=>600,9544=>600,9545=>600,9546=>600,9547=>600,9548=>600,9549=>600,9550=>600,9551=>600,9552=>600,9553=>600,9554=>600,9555=>600,9556=>600,9557=>600,9558=>600,9559=>600,9560=>600,9561=>600,9562=>600,9563=>600,9564=>600,9565=>600,9566=>600,9567=>600,9568=>600,9569=>600,9570=>600,9571=>600,9572=>600,9573=>600,9574=>600,9575=>600,9576=>600,9577=>600,9578=>600,9579=>600,9580=>600,9581=>600,9582=>600,9583=>600,9584=>600,9585=>600,9586=>600,9587=>600,9588=>600,9589=>600,9590=>600,9591=>600,9592=>600,9593=>600,9594=>600,9595=>600,9596=>600,9597=>600,9598=>600,9599=>600,9600=>600,9601=>600,9602=>600,9603=>600,9604=>600,9605=>600,9606=>600,9607=>600,9608=>600,9609=>600,9610=>600,9611=>600,9612=>600,9613=>600,9614=>600,9615=>600,9616=>600,9617=>600,9618=>600,9619=>600,9620=>600,9621=>600,9632=>600,9633=>600,9634=>600,9635=>600,9636=>600,9637=>600,9638=>600,9639=>600,9640=>600,9641=>600,9642=>600,9643=>600,9644=>600,9645=>600,9646=>600,9647=>600,9648=>600,9649=>600,9650=>600,9651=>600,9652=>600,9653=>600,9654=>600,9655=>600,9656=>600,9657=>600,9658=>600,9659=>600,9660=>600,9661=>600,9662=>600,9663=>600,9664=>600,9665=>600,9666=>600,9667=>600,9668=>600,9669=>600,9670=>600,9671=>600,9672=>600,9673=>600,9674=>600,9675=>600,9676=>600,9677=>600,9678=>600,9679=>600,9680=>600,9681=>600,9682=>600,9683=>600,9684=>600,9685=>600,9686=>600,9687=>600,9688=>600,9689=>600,9690=>600,9691=>600,9692=>600,9693=>600,9694=>600,9695=>600,9696=>600,9697=>600,9698=>600,9699=>600,9700=>600,9701=>600,9702=>600,9703=>600,9704=>600,9705=>600,9706=>600,9707=>600,9708=>600,9709=>600,9710=>600,9711=>600,9728=>750,9729=>1000,9730=>750,9731=>750,9732=>1000,9733=>816,9734=>823,9735=>500,9736=>500,9737=>800,9738=>800,9739=>800,9740=>800,9741=>800,9742=>719,9743=>719,9744=>734,9745=>734,9746=>734,9747=>762,9754=>960,9755=>960,9756=>939,9757=>939,9758=>939,9759=>939,9760=>750,9761=>600,9762=>750,9763=>750,9764=>580,9765=>460,9766=>444,9767=>650,9768=>444,9769=>768,9770=>800,9771=>850,9772=>675,9773=>800,9774=>750,9775=>750,9776=>900,9777=>900,9778=>900,9779=>900,9780=>900,9781=>900,9782=>900,9783=>900,9784=>750,9785=>750,9786=>750,9787=>750,9788=>750,9789=>750,9790=>750,9791=>740,9792=>740,9793=>740,9794=>740,9795=>653,9796=>490,9797=>632,9798=>780,9799=>560,9800=>838,9801=>780,9802=>734,9803=>887,9804=>780,9805=>1080,9806=>896,9807=>1080,9808=>804,9809=>868,9810=>922,9811=>696,9812=>1000,9813=>1000,9814=>1000,9815=>1000,9816=>1000,9817=>1000,9818=>1000,9819=>1000,9820=>1000,9821=>1000,9822=>1000,9823=>1000,9824=>722,9825=>734,9826=>674,9827=>804,9828=>722,9829=>734,9830=>674,9831=>804,9832=>860,9833=>423,9834=>592,9835=>750,9836=>750,9837=>439,9838=>439,9839=>439,9985=>974,9986=>961,9987=>974,9988=>980,9990=>789,9991=>790,9992=>791,9993=>690,9996=>549,9997=>855,9998=>911,9999=>933,10000=>911,10001=>945,10002=>974,10003=>755,10004=>846,10005=>762,10006=>761,10007=>571,10008=>677,10009=>763,10010=>760,10011=>759,10012=>754,10013=>494,10014=>552,10015=>537,10016=>577,10017=>692,10018=>786,10019=>788,10020=>788,10021=>790,10022=>793,10023=>794,10025=>823,10026=>789,10027=>841,10028=>823,10029=>833,10030=>816,10031=>831,10032=>923,10033=>744,10034=>723,10035=>749,10036=>790,10037=>792,10038=>695,10039=>776,10040=>768,10041=>792,10042=>759,10043=>707,10044=>708,10045=>682,10046=>701,10047=>826,10048=>815,10049=>789,10050=>789,10051=>707,10052=>687,10053=>696,10054=>689,10055=>786,10056=>787,10057=>713,10058=>791,10059=>785,10061=>873,10063=>762,10064=>762,10065=>759,10066=>759,10070=>784,10072=>138,10073=>277,10074=>415,10075=>392,10076=>392,10077=>668,10078=>668,10081=>732,10082=>544,10083=>544,10084=>910,10085=>667,10086=>760,10087=>760,10102=>788,10103=>788,10104=>788,10105=>788,10106=>788,10107=>788,10108=>788,10109=>788,10110=>788,10111=>788,10112=>788,10113=>788,10114=>788,10115=>788,10116=>788,10117=>788,10118=>788,10119=>788,10120=>788,10121=>788,10122=>788,10123=>788,10124=>788,10125=>788,10126=>788,10127=>788,10128=>788,10129=>788,10130=>788,10131=>788,10132=>894,10136=>748,10137=>924,10138=>748,10139=>918,10140=>927,10141=>928,10142=>928,10143=>834,10144=>873,10145=>828,10146=>924,10147=>924,10148=>917,10149=>930,10150=>931,10151=>463,10152=>883,10153=>836,10154=>836,10155=>867,10156=>867,10157=>696,10158=>696,10159=>874,10161=>874,10162=>760,10163=>946,10164=>771,10165=>865,10166=>771,10167=>888,10168=>967,10169=>888,10170=>831,10171=>873,10172=>927,10173=>970,10174=>918,12288=>1000,12289=>1000,12290=>1000,12291=>1000,12292=>1000,12293=>1000,12294=>1000,12295=>1000,12296=>1000,12297=>1000,12298=>1000,12299=>1000,12300=>1000,12301=>1000,12302=>1000,12303=>1000,12304=>1000,12305=>1000,12306=>1000,12307=>1000,12308=>1000,12309=>1000,12310=>1000,12311=>1000,12312=>1000,12313=>1000,12314=>1000,12315=>1000,12316=>1000,12317=>1000,12318=>1000,12319=>1000,12320=>1000,12321=>1000,12322=>1000,12323=>1000,12324=>1000,12325=>1000,12326=>1000,12327=>1000,12328=>1000,12329=>1000,12330=>1000,12331=>1000,12332=>1000,12333=>1000,12334=>1000,12335=>1000,12336=>1000,12337=>1000,12338=>1000,12339=>1000,12340=>1000,12341=>1000,12342=>1000,12343=>1000,12351=>1000,12353=>1000,12354=>1000,12355=>1000,12356=>1000,12357=>1000,12358=>1000,12359=>1000,12360=>1000,12361=>1000,12362=>1000,12363=>1000,12364=>1000,12365=>1000,12366=>1000,12367=>1000,12368=>1000,12369=>1000,12370=>1000,12371=>1000,12372=>1000,12373=>1000,12374=>1000,12375=>1000,12376=>1000,12377=>1000,12378=>1000,12379=>1000,12380=>1000,12381=>1000,12382=>1000,12383=>1000,12384=>1000,12385=>1000,12386=>1000,12387=>1000,12388=>1000,12389=>1000,12390=>1000,12391=>1000,12392=>1000,12393=>1000,12394=>1000,12395=>1000,12396=>1000,12397=>1000,12398=>1000,12399=>1000,12400=>1000,12401=>1000,12402=>1000,12403=>1000,12404=>1000,12405=>1000,12406=>1000,12407=>1000,12408=>1000,12409=>1000,12410=>1000,12411=>1000,12412=>1000,12413=>1000,12414=>1000,12415=>1000,12416=>1000,12417=>1000,12418=>1000,12419=>1000,12420=>1000,12421=>1000,12422=>1000,12423=>1000,12424=>1000,12425=>1000,12426=>1000,12427=>1000,12428=>1000,12429=>1000,12430=>1000,12431=>1000,12432=>1000,12433=>1000,12434=>1000,12435=>1000,12436=>1000,12441=>1000,12442=>1000,12443=>1000,12444=>1000,12445=>1000,12446=>1000,12449=>1000,12450=>1000,12451=>1000,12452=>1000,12453=>1000,12454=>1000,12455=>1000,12456=>1000,12457=>1000,12458=>1000,12459=>1000,12460=>1000,12461=>1000,12462=>1000,12463=>1000,12464=>1000,12465=>1000,12466=>1000,12467=>1000,12468=>1000,12469=>1000,12470=>1000,12471=>1000,12472=>1000,12473=>1000,12474=>1000,12475=>1000,12476=>1000,12477=>1000,12478=>1000,12479=>1000,12480=>1000,12481=>1000,12482=>1000,12483=>1000,12484=>1000,12485=>1000,12486=>1000,12487=>1000,12488=>1000,12489=>1000,12490=>1000,12491=>1000,12492=>1000,12493=>1000,12494=>1000,12495=>1000,12496=>1000,12497=>1000,12498=>1000,12499=>1000,12500=>1000,12501=>1000,12502=>1000,12503=>1000,12504=>1000,12505=>1000,12506=>1000,12507=>1000,12508=>1000,12509=>1000,12510=>1000,12511=>1000,12512=>1000,12513=>1000,12514=>1000,12515=>1000,12516=>1000,12517=>1000,12518=>1000,12519=>1000,12520=>1000,12521=>1000,12522=>1000,12523=>1000,12524=>1000,12525=>1000,12526=>1000,12527=>1000,12528=>1000,12529=>1000,12530=>1000,12531=>1000,12532=>1000,12533=>1000,12534=>1000,12535=>1000,12536=>1000,12537=>1000,12538=>1000,12539=>1000,12540=>1000,12541=>1000,12542=>1000,12549=>1000,12550=>1000,12551=>1000,12552=>1000,12553=>1000,12554=>1000,12555=>1000,12556=>1000,12557=>1000,12558=>1000,12559=>1000,12560=>1000,12561=>1000,12562=>1000,12563=>1000,12564=>1000,12565=>1000,12566=>1000,12567=>1000,12568=>1000,12569=>1000,12570=>1000,12571=>1000,12572=>1000,12573=>1000,12574=>1000,12575=>1000,12576=>1000,12577=>1000,12578=>1000,12579=>1000,12580=>1000,12581=>1000,12582=>1000,12583=>1000,12584=>1000,12585=>1000,12586=>1000,12587=>1000,12588=>1000,12593=>1000,12594=>1000,12595=>1000,12596=>1000,12597=>1000,12598=>1000,12599=>1000,12600=>1000,12601=>1000,12602=>1000,12603=>1000,12604=>1000,12605=>1000,12606=>1000,12607=>1000,12608=>1000,12609=>1000,12610=>1000,12611=>1000,12612=>1000,12613=>1000,12614=>1000,12615=>1000,12616=>1000,12617=>1000,12618=>1000,12619=>1000,12620=>1000,12621=>1000,12622=>1000,12623=>1000,12624=>1000,12625=>1000,12626=>1000,12627=>1000,12628=>1000,12629=>1000,12630=>1000,12631=>1000,12632=>1000,12633=>1000,12634=>1000,12635=>1000,12636=>1000,12637=>1000,12638=>1000,12639=>1000,12640=>1000,12641=>1000,12642=>1000,12643=>1000,12644=>1000,12645=>1000,12646=>1000,12647=>1000,12648=>1000,12649=>1000,12650=>1000,12651=>1000,12652=>1000,12653=>1000,12654=>1000,12655=>1000,12656=>1000,12657=>1000,12658=>1000,12659=>1000,12660=>1000,12661=>1000,12662=>1000,12663=>1000,12664=>1000,12665=>1000,12666=>1000,12667=>1000,12668=>1000,12669=>1000,12670=>1000,12671=>1000,12672=>1000,12673=>1000,12674=>1000,12675=>1000,12676=>1000,12677=>1000,12678=>1000,12679=>1000,12680=>1000,12681=>1000,12682=>1000,12683=>1000,12684=>1000,12685=>1000,12686=>1000,12688=>1000,12689=>1000,12690=>1000,12691=>1000,12692=>1000,12693=>1000,12694=>1000,12695=>1000,12696=>1000,12697=>1000,12698=>1000,12699=>1000,12700=>1000,12701=>1000,12702=>1000,12703=>1000,12800=>1000,12801=>1000,12802=>1000,12803=>1000,12804=>1000,12805=>1000,12806=>1000,12807=>1000,12808=>1000,12809=>1000,12810=>1000,12811=>1000,12812=>1000,12813=>1000,12814=>1000,12815=>1000,12816=>1000,12817=>1000,12818=>1000,12819=>1000,12820=>1000,12821=>1000,12822=>1000,12823=>1000,12824=>1000,12825=>1000,12826=>1000,12827=>1000,12828=>1000,12832=>1000,12833=>1000,12834=>1000,12835=>1000,12836=>1000,12837=>1000,12838=>1000,12839=>1000,12840=>1000,12841=>1000,12842=>1000,12843=>1000,12844=>1000,12845=>1000,12846=>1000,12847=>1000,12848=>1000,12849=>1000,12850=>1000,12851=>1000,12852=>1000,12853=>1000,12854=>1000,12855=>1000,12856=>1000,12857=>1000,12858=>1000,12859=>1000,12860=>1000,12861=>1000,12862=>1000,12863=>1000,12864=>1000,12865=>1000,12866=>1000,12867=>1000,12896=>1000,12897=>1000,12898=>1000,12899=>1000,12900=>1000,12901=>1000,12902=>1000,12903=>1000,12904=>1000,12905=>1000,12906=>1000,12907=>1000,12908=>1000,12909=>1000,12910=>1000,12911=>1000,12912=>1000,12913=>1000,12914=>1000,12915=>1000,12916=>1000,12917=>1000,12918=>1000,12919=>1000,12920=>1000,12921=>1000,12922=>1000,12923=>1000,12927=>1000,12928=>1000,12929=>1000,12930=>1000,12931=>1000,12932=>1000,12933=>1000,12934=>1000,12935=>1000,12936=>1000,12937=>1000,12938=>1000,12939=>1000,12940=>1000,12941=>1000,12942=>1000,12943=>1000,12944=>1000,12945=>1000,12946=>1000,12947=>1000,12948=>1000,12949=>1000,12950=>1000,12951=>1000,12952=>1000,12953=>1000,12954=>1000,12955=>1000,12956=>1000,12957=>1000,12958=>1000,12959=>1000,12960=>1000,12961=>1000,12962=>1000,12963=>1000,12964=>1000,12965=>1000,12966=>1000,12967=>1000,12968=>1000,12969=>1000,12970=>1000,12971=>1000,12972=>1000,12973=>1000,12974=>1000,12975=>1000,12976=>1000,12992=>1000,12993=>1000,12994=>1000,12995=>1000,12996=>1000,12997=>1000,12998=>1000,12999=>1000,13000=>1000,13001=>1000,13002=>1000,13003=>1000,13008=>1000,13009=>1000,13010=>1000,13011=>1000,13012=>1000,13013=>1000,13014=>1000,13015=>1000,13016=>1000,13017=>1000,13018=>1000,13019=>1000,13020=>1000,13021=>1000,13022=>1000,13023=>1000,13024=>1000,13025=>1000,13026=>1000,13027=>1000,13028=>1000,13029=>1000,13030=>1000,13031=>1000,13032=>1000,13033=>1000,13034=>1000,13035=>1000,13036=>1000,13037=>1000,13038=>1000,13039=>1000,13040=>1000,13041=>1000,13042=>1000,13043=>1000,13044=>1000,13045=>1000,13046=>1000,13047=>1000,13048=>1000,13049=>1000,13050=>1000,13051=>1000,13052=>1000,13053=>1000,13054=>1000,13056=>1000,13057=>1000,13058=>1000,13059=>1000,13060=>1000,13061=>1000,13062=>1000,13063=>1000,13064=>1000,13065=>1000,13066=>1000,13067=>1000,13068=>1000,13069=>1000,13070=>1000,13071=>1000,13072=>1000,13073=>1000,13074=>1000,13075=>1000,13076=>1000,13077=>1000,13078=>1000,13079=>1000,13080=>1000,13081=>1000,13082=>1000,13083=>1000,13084=>1000,13085=>1000,13086=>1000,13087=>1000,13088=>1000,13089=>1000,13090=>1000,13091=>1000,13092=>1000,13093=>1000,13094=>1000,13095=>1000,13096=>1000,13097=>1000,13098=>1000,13099=>1000,13100=>1000,13101=>1000,13102=>1000,13103=>1000,13104=>1000,13105=>1000,13106=>1000,13107=>1000,13108=>1000,13109=>1000,13110=>1000,13111=>1000,13112=>1000,13113=>1000,13114=>1000,13115=>1000,13116=>1000,13117=>1000,13118=>1000,13119=>1000,13120=>1000,13121=>1000,13122=>1000,13123=>1000,13124=>1000,13125=>1000,13126=>1000,13127=>1000,13128=>1000,13129=>1000,13130=>1000,13131=>1000,13132=>1000,13133=>1000,13134=>1000,13135=>1000,13136=>1000,13137=>1000,13138=>1000,13139=>1000,13140=>1000,13141=>1000,13142=>1000,13143=>1000,13144=>1000,13145=>1000,13146=>1000,13147=>1000,13148=>1000,13149=>1000,13150=>1000,13151=>1000,13152=>1000,13153=>1000,13154=>1000,13155=>1000,13156=>1000,13157=>1000,13158=>1000,13159=>1000,13160=>1000,13161=>1000,13162=>1000,13163=>1000,13164=>1000,13165=>1000,13166=>1000,13167=>1000,13168=>1000,13169=>1000,13170=>1000,13171=>1000,13172=>1000,13173=>1000,13174=>1000,13179=>1000,13180=>1000,13181=>1000,13182=>1000,13183=>1000,13184=>1000,13185=>1000,13186=>1000,13187=>1000,13188=>1000,13189=>1000,13190=>1000,13191=>1000,13192=>1000,13193=>1000,13194=>1000,13195=>1000,13196=>1000,13197=>1000,13198=>1000,13199=>1000,13200=>1000,13201=>1000,13202=>1000,13203=>1000,13204=>1000,13205=>1000,13206=>1000,13207=>1000,13208=>1000,13209=>1000,13210=>1000,13211=>1000,13212=>1000,13213=>1000,13214=>1000,13215=>1000,13216=>1000,13217=>1000,13218=>1000,13219=>1000,13220=>1000,13221=>1000,13222=>1000,13223=>1000,13224=>1000,13225=>1000,13226=>1000,13227=>1000,13228=>1000,13229=>1000,13230=>1000,13231=>1000,13232=>1000,13233=>1000,13234=>1000,13235=>1000,13236=>1000,13237=>1000,13238=>1000,13239=>1000,13240=>1000,13241=>1000,13242=>1000,13243=>1000,13244=>1000,13245=>1000,13246=>1000,13247=>1000,13248=>1000,13249=>1000,13250=>1000,13251=>1000,13252=>1000,13253=>1000,13254=>1000,13255=>1000,13256=>1000,13257=>1000,13258=>1000,13259=>1000,13260=>1000,13261=>1000,13262=>1000,13263=>1000,13264=>1000,13265=>1000,13266=>1000,13267=>1000,13268=>1000,13269=>1000,13270=>1000,13271=>1000,13272=>1000,13273=>1000,13274=>1000,13275=>1000,13276=>1000,13277=>1000,13280=>1000,13281=>1000,13282=>1000,13283=>1000,13284=>1000,13285=>1000,13286=>1000,13287=>1000,13288=>1000,13289=>1000,13290=>1000,13291=>1000,13292=>1000,13293=>1000,13294=>1000,13295=>1000,13296=>1000,13297=>1000,13298=>1000,13299=>1000,13300=>1000,13301=>1000,13302=>1000,13303=>1000,13304=>1000,13305=>1000,13306=>1000,13307=>1000,13308=>1000,13309=>1000,13310=>1000,19968=>1000,19969=>1000,19970=>1000,19971=>1000,19972=>1000,19973=>1000,19974=>1000,19975=>1000,19976=>1000,19977=>1000,19978=>1000,19979=>1000,19980=>1000,19981=>1000,19982=>1000,19983=>1000,19984=>1000,19985=>1000,19986=>1000,19987=>1000,19988=>1000,19989=>1000,19990=>1000,19991=>1000,19992=>1000,19993=>1000,19994=>1000,19995=>1000,19996=>1000,19997=>1000,19998=>1000,19999=>1000,20000=>1000,20001=>1000,20002=>1000,20003=>1000,20004=>1000,20005=>1000,20006=>1000,20007=>1000,20008=>1000,20009=>1000,20010=>1000,20011=>1000,20012=>1000,20013=>1000,20014=>1000,20015=>1000,20016=>1000,20017=>1000,20018=>1000,20019=>1000,20020=>1000,20021=>1000,20022=>1000,20023=>1000,20024=>1000,20025=>1000,20026=>1000,20027=>1000,20028=>1000,20029=>1000,20030=>1000,20031=>1000,20032=>1000,20033=>1000,20034=>1000,20035=>1000,20036=>1000,20037=>1000,20038=>1000,20039=>1000,20040=>1000,20041=>1000,20042=>1000,20043=>1000,20044=>1000,20045=>1000,20046=>1000,20047=>1000,20048=>1000,20049=>1000,20050=>1000,20051=>1000,20052=>1000,20053=>1000,20054=>1000,20055=>1000,20056=>1000,20057=>1000,20058=>1000,20059=>1000,20060=>1000,20061=>1000,20062=>1000,20063=>1000,20064=>1000,20065=>1000,20066=>1000,20067=>1000,20068=>1000,20069=>1000,20070=>1000,20071=>1000,20072=>1000,20073=>1000,20074=>1000,20075=>1000,20076=>1000,20077=>1000,20078=>1000,20079=>1000,20080=>1000,20081=>1000,20082=>1000,20083=>1000,20084=>1000,20085=>1000,20086=>1000,20087=>1000,20088=>1000,20089=>1000,20090=>1000,20091=>1000,20092=>1000,20093=>1000,20094=>1000,20095=>1000,20096=>1000,20097=>1000,20098=>1000,20099=>1000,20100=>1000,20101=>1000,20102=>1000,20103=>1000,20104=>1000,20105=>1000,20106=>1000,20107=>1000,20108=>1000,20109=>1000,20110=>1000,20111=>1000,20112=>1000,20113=>1000,20114=>1000,20115=>1000,20116=>1000,20117=>1000,20118=>1000,20119=>1000,20120=>1000,20121=>1000,20122=>1000,20123=>1000,20124=>1000,20125=>1000,20126=>1000,20127=>1000,20128=>1000,20129=>1000,20130=>1000,20131=>1000,20132=>1000,20133=>1000,20134=>1000,20135=>1000,20136=>1000,20137=>1000,20138=>1000,20139=>1000,20140=>1000,20141=>1000,20142=>1000,20143=>1000,20144=>1000,20145=>1000,20146=>1000,20147=>1000,20148=>1000,20149=>1000,20150=>1000,20151=>1000,20152=>1000,20153=>1000,20154=>1000,20155=>1000,20156=>1000,20157=>1000,20158=>1000,20159=>1000,20160=>1000,20161=>1000,20162=>1000,20163=>1000,20164=>1000,20165=>1000,20166=>1000,20167=>1000,20168=>1000,20169=>1000,20170=>1000,20171=>1000,20172=>1000,20173=>1000,20174=>1000,20175=>1000,20176=>1000,20177=>1000,20178=>1000,20179=>1000,20180=>1000,20181=>1000,20182=>1000,20183=>1000,20184=>1000,20185=>1000,20186=>1000,20187=>1000,20188=>1000,20189=>1000,20190=>1000,20191=>1000,20192=>1000,20193=>1000,20194=>1000,20195=>1000,20196=>1000,20197=>1000,20198=>1000,20199=>1000,20200=>1000,20201=>1000,20202=>1000,20203=>1000,20204=>1000,20205=>1000,20206=>1000,20207=>1000,20208=>1000,20209=>1000,20210=>1000,20211=>1000,20212=>1000,20213=>1000,20214=>1000,20215=>1000,20216=>1000,20217=>1000,20218=>1000,20219=>1000,20220=>1000,20221=>1000,20222=>1000,20223=>1000,20224=>1000,20225=>1000,20226=>1000,20227=>1000,20228=>1000,20229=>1000,20230=>1000,20231=>1000,20232=>1000,20233=>1000,20234=>1000,20235=>1000,20236=>1000,20237=>1000,20238=>1000,20239=>1000,20240=>1000,20241=>1000,20242=>1000,20243=>1000,20244=>1000,20245=>1000,20246=>1000,20247=>1000,20248=>1000,20249=>1000,20250=>1000,20251=>1000,20252=>1000,20253=>1000,20254=>1000,20255=>1000,20256=>1000,20257=>1000,20258=>1000,20259=>1000,20260=>1000,20261=>1000,20262=>1000,20263=>1000,20264=>1000,20265=>1000,20266=>1000,20267=>1000,20268=>1000,20269=>1000,20270=>1000,20271=>1000,20272=>1000,20273=>1000,20274=>1000,20275=>1000,20276=>1000,20277=>1000,20278=>1000,20279=>1000,20280=>1000,20281=>1000,20282=>1000,20283=>1000,20284=>1000,20285=>1000,20286=>1000,20287=>1000,20288=>1000,20289=>1000,20290=>1000,20291=>1000,20292=>1000,20293=>1000,20294=>1000,20295=>1000,20296=>1000,20297=>1000,20298=>1000,20299=>1000,20300=>1000,20301=>1000,20302=>1000,20303=>1000,20304=>1000,20305=>1000,20306=>1000,20307=>1000,20308=>1000,20309=>1000,20310=>1000,20311=>1000,20312=>1000,20313=>1000,20314=>1000,20315=>1000,20316=>1000,20317=>1000,20318=>1000,20319=>1000,20320=>1000,20321=>1000,20322=>1000,20323=>1000,20324=>1000,20325=>1000,20326=>1000,20327=>1000,20328=>1000,20329=>1000,20330=>1000,20331=>1000,20332=>1000,20333=>1000,20334=>1000,20335=>1000,20336=>1000,20337=>1000,20338=>1000,20339=>1000,20340=>1000,20341=>1000,20342=>1000,20343=>1000,20344=>1000,20345=>1000,20346=>1000,20347=>1000,20348=>1000,20349=>1000,20350=>1000,20351=>1000,20352=>1000,20353=>1000,20354=>1000,20355=>1000,20356=>1000,20357=>1000,20358=>1000,20359=>1000,20360=>1000,20361=>1000,20362=>1000,20363=>1000,20364=>1000,20365=>1000,20366=>1000,20367=>1000,20368=>1000,20369=>1000,20370=>1000,20371=>1000,20372=>1000,20373=>1000,20374=>1000,20375=>1000,20376=>1000,20377=>1000,20378=>1000,20379=>1000,20380=>1000,20381=>1000,20382=>1000,20383=>1000,20384=>1000,20385=>1000,20386=>1000,20387=>1000,20388=>1000,20389=>1000,20390=>1000,20391=>1000,20392=>1000,20393=>1000,20394=>1000,20395=>1000,20396=>1000,20397=>1000,20398=>1000,20399=>1000,20400=>1000,20401=>1000,20402=>1000,20403=>1000,20404=>1000,20405=>1000,20406=>1000,20407=>1000,20408=>1000,20409=>1000,20410=>1000,20411=>1000,20412=>1000,20413=>1000,20414=>1000,20415=>1000,20416=>1000,20417=>1000,20418=>1000,20419=>1000,20420=>1000,20421=>1000,20422=>1000,20423=>1000,20424=>1000,20425=>1000,20426=>1000,20427=>1000,20428=>1000,20429=>1000,20430=>1000,20431=>1000,20432=>1000,20433=>1000,20434=>1000,20435=>1000,20436=>1000,20437=>1000,20438=>1000,20439=>1000,20440=>1000,20441=>1000,20442=>1000,20443=>1000,20444=>1000,20445=>1000,20446=>1000,20447=>1000,20448=>1000,20449=>1000,20450=>1000,20451=>1000,20452=>1000,20453=>1000,20454=>1000,20455=>1000,20456=>1000,20457=>1000,20458=>1000,20459=>1000,20460=>1000,20461=>1000,20462=>1000,20463=>1000,20464=>1000,20465=>1000,20466=>1000,20467=>1000,20468=>1000,20469=>1000,20470=>1000,20471=>1000,20472=>1000,20473=>1000,20474=>1000,20475=>1000,20476=>1000,20477=>1000,20478=>1000,20479=>1000,20480=>1000,20481=>1000,20482=>1000,20483=>1000,20484=>1000,20485=>1000,20486=>1000,20487=>1000,20488=>1000,20489=>1000,20490=>1000,20491=>1000,20492=>1000,20493=>1000,20494=>1000,20495=>1000,20496=>1000,20497=>1000,20498=>1000,20499=>1000,20500=>1000,20501=>1000,20502=>1000,20503=>1000,20504=>1000,20505=>1000,20506=>1000,20507=>1000,20508=>1000,20509=>1000,20510=>1000,20511=>1000,20512=>1000,20513=>1000,20514=>1000,20515=>1000,20516=>1000,20517=>1000,20518=>1000,20519=>1000,20520=>1000,20521=>1000,20522=>1000,20523=>1000,20524=>1000,20525=>1000,20526=>1000,20527=>1000,20528=>1000,20529=>1000,20530=>1000,20531=>1000,20532=>1000,20533=>1000,20534=>1000,20535=>1000,20536=>1000,20537=>1000,20538=>1000,20539=>1000,20540=>1000,20541=>1000,20542=>1000,20543=>1000,20544=>1000,20545=>1000,20546=>1000,20547=>1000,20548=>1000,20549=>1000,20550=>1000,20551=>1000,20552=>1000,20553=>1000,20554=>1000,20555=>1000,20556=>1000,20557=>1000,20558=>1000,20559=>1000,20560=>1000,20561=>1000,20562=>1000,20563=>1000,20564=>1000,20565=>1000,20566=>1000,20567=>1000,20568=>1000,20569=>1000,20570=>1000,20571=>1000,20572=>1000,20573=>1000,20574=>1000,20575=>1000,20576=>1000,20577=>1000,20578=>1000,20579=>1000,20580=>1000,20581=>1000,20582=>1000,20583=>1000,20584=>1000,20585=>1000,20586=>1000,20587=>1000,20588=>1000,20589=>1000,20590=>1000,20591=>1000,20592=>1000,20593=>1000,20594=>1000,20595=>1000,20596=>1000,20597=>1000,20598=>1000,20599=>1000,20600=>1000,20601=>1000,20602=>1000,20603=>1000,20604=>1000,20605=>1000,20606=>1000,20607=>1000,20608=>1000,20609=>1000,20610=>1000,20611=>1000,20612=>1000,20613=>1000,20614=>1000,20615=>1000,20616=>1000,20617=>1000,20618=>1000,20619=>1000,20620=>1000,20621=>1000,20622=>1000,20623=>1000,20624=>1000,20625=>1000,20626=>1000,20627=>1000,20628=>1000,20629=>1000,20630=>1000,20631=>1000,20632=>1000,20633=>1000,20634=>1000,20635=>1000,20636=>1000,20637=>1000,20638=>1000,20639=>1000,20640=>1000,20641=>1000,20642=>1000,20643=>1000,20644=>1000,20645=>1000,20646=>1000,20647=>1000,20648=>1000,20649=>1000,20650=>1000,20651=>1000,20652=>1000,20653=>1000,20654=>1000,20655=>1000,20656=>1000,20657=>1000,20658=>1000,20659=>1000,20660=>1000,20661=>1000,20662=>1000,20663=>1000,20664=>1000,20665=>1000,20666=>1000,20667=>1000,20668=>1000,20669=>1000,20670=>1000,20671=>1000,20672=>1000,20673=>1000,20674=>1000,20675=>1000,20676=>1000,20677=>1000,20678=>1000,20679=>1000,20680=>1000,20681=>1000,20682=>1000,20683=>1000,20684=>1000,20685=>1000,20686=>1000,20687=>1000,20688=>1000,20689=>1000,20690=>1000,20691=>1000,20692=>1000,20693=>1000,20694=>1000,20695=>1000,20696=>1000,20697=>1000,20698=>1000,20699=>1000,20700=>1000,20701=>1000,20702=>1000,20703=>1000,20704=>1000,20705=>1000,20706=>1000,20707=>1000,20708=>1000,20709=>1000,20710=>1000,20711=>1000,20712=>1000,20713=>1000,20714=>1000,20715=>1000,20716=>1000,20717=>1000,20718=>1000,20719=>1000,20720=>1000,20721=>1000,20722=>1000,20723=>1000,20724=>1000,20725=>1000,20726=>1000,20727=>1000,20728=>1000,20729=>1000,20730=>1000,20731=>1000,20732=>1000,20733=>1000,20734=>1000,20735=>1000,20736=>1000,20737=>1000,20738=>1000,20739=>1000,20740=>1000,20741=>1000,20742=>1000,20743=>1000,20744=>1000,20745=>1000,20746=>1000,20747=>1000,20748=>1000,20749=>1000,20750=>1000,20751=>1000,20752=>1000,20753=>1000,20754=>1000,20755=>1000,20756=>1000,20757=>1000,20758=>1000,20759=>1000,20760=>1000,20761=>1000,20762=>1000,20763=>1000,20764=>1000,20765=>1000,20766=>1000,20767=>1000,20768=>1000,20769=>1000,20770=>1000,20771=>1000,20772=>1000,20773=>1000,20774=>1000,20775=>1000,20776=>1000,20777=>1000,20778=>1000,20779=>1000,20780=>1000,20781=>1000,20782=>1000,20783=>1000,20784=>1000,20785=>1000,20786=>1000,20787=>1000,20788=>1000,20789=>1000,20790=>1000,20791=>1000,20792=>1000,20793=>1000,20794=>1000,20795=>1000,20796=>1000,20797=>1000,20798=>1000,20799=>1000,20800=>1000,20801=>1000,20802=>1000,20803=>1000,20804=>1000,20805=>1000,20806=>1000,20807=>1000,20808=>1000,20809=>1000,20810=>1000,20811=>1000,20812=>1000,20813=>1000,20814=>1000,20815=>1000,20816=>1000,20817=>1000,20818=>1000,20819=>1000,20820=>1000,20821=>1000,20822=>1000,20823=>1000,20824=>1000,20825=>1000,20826=>1000,20827=>1000,20828=>1000,20829=>1000,20830=>1000,20831=>1000,20832=>1000,20833=>1000,20834=>1000,20835=>1000,20836=>1000,20837=>1000,20838=>1000,20839=>1000,20840=>1000,20841=>1000,20842=>1000,20843=>1000,20844=>1000,20845=>1000,20846=>1000,20847=>1000,20848=>1000,20849=>1000,20850=>1000,20851=>1000,20852=>1000,20853=>1000,20854=>1000,20855=>1000,20856=>1000,20857=>1000,20858=>1000,20859=>1000,20860=>1000,20861=>1000,20862=>1000,20863=>1000,20864=>1000,20865=>1000,20866=>1000,20867=>1000,20868=>1000,20869=>1000,20870=>1000,20871=>1000,20872=>1000,20873=>1000,20874=>1000,20875=>1000,20876=>1000,20877=>1000,20878=>1000,20879=>1000,20880=>1000,20881=>1000,20882=>1000,20883=>1000,20884=>1000,20885=>1000,20886=>1000,20887=>1000,20888=>1000,20889=>1000,20890=>1000,20891=>1000,20892=>1000,20893=>1000,20894=>1000,20895=>1000,20896=>1000,20897=>1000,20898=>1000,20899=>1000,20900=>1000,20901=>1000,20902=>1000,20903=>1000,20904=>1000,20905=>1000,20906=>1000,20907=>1000,20908=>1000,20909=>1000,20910=>1000,20911=>1000,20912=>1000,20913=>1000,20914=>1000,20915=>1000,20916=>1000,20917=>1000,20918=>1000,20919=>1000,20920=>1000,20921=>1000,20922=>1000,20923=>1000,20924=>1000,20925=>1000,20926=>1000,20927=>1000,20928=>1000,20929=>1000,20930=>1000,20931=>1000,20932=>1000,20933=>1000,20934=>1000,20935=>1000,20936=>1000,20937=>1000,20938=>1000,20939=>1000,20940=>1000,20941=>1000,20942=>1000,20943=>1000,20944=>1000,20945=>1000,20946=>1000,20947=>1000,20948=>1000,20949=>1000,20950=>1000,20951=>1000,20952=>1000,20953=>1000,20954=>1000,20955=>1000,20956=>1000,20957=>1000,20958=>1000,20959=>1000,20960=>1000,20961=>1000,20962=>1000,20963=>1000,20964=>1000,20965=>1000,20966=>1000,20967=>1000,20968=>1000,20969=>1000,20970=>1000,20971=>1000,20972=>1000,20973=>1000,20974=>1000,20975=>1000,20976=>1000,20977=>1000,20978=>1000,20979=>1000,20980=>1000,20981=>1000,20982=>1000,20983=>1000,20984=>1000,20985=>1000,20986=>1000,20987=>1000,20988=>1000,20989=>1000,20990=>1000,20991=>1000,20992=>1000,20993=>1000,20994=>1000,20995=>1000,20996=>1000,20997=>1000,20998=>1000,20999=>1000,21000=>1000,21001=>1000,21002=>1000,21003=>1000,21004=>1000,21005=>1000,21006=>1000,21007=>1000,21008=>1000,21009=>1000,21010=>1000,21011=>1000,21012=>1000,21013=>1000,21014=>1000,21015=>1000,21016=>1000,21017=>1000,21018=>1000,21019=>1000,21020=>1000,21021=>1000,21022=>1000,21023=>1000,21024=>1000,21025=>1000,21026=>1000,21027=>1000,21028=>1000,21029=>1000,21030=>1000,21031=>1000,21032=>1000,21033=>1000,21034=>1000,21035=>1000,21036=>1000,21037=>1000,21038=>1000,21039=>1000,21040=>1000,21041=>1000,21042=>1000,21043=>1000,21044=>1000,21045=>1000,21046=>1000,21047=>1000,21048=>1000,21049=>1000,21050=>1000,21051=>1000,21052=>1000,21053=>1000,21054=>1000,21055=>1000,21056=>1000,21057=>1000,21058=>1000,21059=>1000,21060=>1000,21061=>1000,21062=>1000,21063=>1000,21064=>1000,21065=>1000,21066=>1000,21067=>1000,21068=>1000,21069=>1000,21070=>1000,21071=>1000,21072=>1000,21073=>1000,21074=>1000,21075=>1000,21076=>1000,21077=>1000,21078=>1000,21079=>1000,21080=>1000,21081=>1000,21082=>1000,21083=>1000,21084=>1000,21085=>1000,21086=>1000,21087=>1000,21088=>1000,21089=>1000,21090=>1000,21091=>1000,21092=>1000,21093=>1000,21094=>1000,21095=>1000,21096=>1000,21097=>1000,21098=>1000,21099=>1000,21100=>1000,21101=>1000,21102=>1000,21103=>1000,21104=>1000,21105=>1000,21106=>1000,21107=>1000,21108=>1000,21109=>1000,21110=>1000,21111=>1000,21112=>1000,21113=>1000,21114=>1000,21115=>1000,21116=>1000,21117=>1000,21118=>1000,21119=>1000,21120=>1000,21121=>1000,21122=>1000,21123=>1000,21124=>1000,21125=>1000,21126=>1000,21127=>1000,21128=>1000,21129=>1000,21130=>1000,21131=>1000,21132=>1000,21133=>1000,21134=>1000,21135=>1000,21136=>1000,21137=>1000,21138=>1000,21139=>1000,21140=>1000,21141=>1000,21142=>1000,21143=>1000,21144=>1000,21145=>1000,21146=>1000,21147=>1000,21148=>1000,21149=>1000,21150=>1000,21151=>1000,21152=>1000,21153=>1000,21154=>1000,21155=>1000,21156=>1000,21157=>1000,21158=>1000,21159=>1000,21160=>1000,21161=>1000,21162=>1000,21163=>1000,21164=>1000,21165=>1000,21166=>1000,21167=>1000,21168=>1000,21169=>1000,21170=>1000,21171=>1000,21172=>1000,21173=>1000,21174=>1000,21175=>1000,21176=>1000,21177=>1000,21178=>1000,21179=>1000,21180=>1000,21181=>1000,21182=>1000,21183=>1000,21184=>1000,21185=>1000,21186=>1000,21187=>1000,21188=>1000,21189=>1000,21190=>1000,21191=>1000,21192=>1000,21193=>1000,21194=>1000,21195=>1000,21196=>1000,21197=>1000,21198=>1000,21199=>1000,21200=>1000,21201=>1000,21202=>1000,21203=>1000,21204=>1000,21205=>1000,21206=>1000,21207=>1000,21208=>1000,21209=>1000,21210=>1000,21211=>1000,21212=>1000,21213=>1000,21214=>1000,21215=>1000,21216=>1000,21217=>1000,21218=>1000,21219=>1000,21220=>1000,21221=>1000,21222=>1000,21223=>1000,21224=>1000,21225=>1000,21226=>1000,21227=>1000,21228=>1000,21229=>1000,21230=>1000,21231=>1000,21232=>1000,21233=>1000,21234=>1000,21235=>1000,21236=>1000,21237=>1000,21238=>1000,21239=>1000,21240=>1000,21241=>1000,21242=>1000,21243=>1000,21244=>1000,21245=>1000,21246=>1000,21247=>1000,21248=>1000,21249=>1000,21250=>1000,21251=>1000,21252=>1000,21253=>1000,21254=>1000,21255=>1000,21256=>1000,21257=>1000,21258=>1000,21259=>1000,21260=>1000,21261=>1000,21262=>1000,21263=>1000,21264=>1000,21265=>1000,21266=>1000,21267=>1000,21268=>1000,21269=>1000,21270=>1000,21271=>1000,21272=>1000,21273=>1000,21274=>1000,21275=>1000,21276=>1000,21277=>1000,21278=>1000,21279=>1000,21280=>1000,21281=>1000,21282=>1000,21283=>1000,21284=>1000,21285=>1000,21286=>1000,21287=>1000,21288=>1000,21289=>1000,21290=>1000,21291=>1000,21292=>1000,21293=>994,21294=>1000,21295=>1000,21296=>1000,21297=>1000,21298=>1000,21299=>1000,21300=>1000,21301=>1000,21302=>1000,21303=>1000,21304=>1000,21305=>1000,21306=>1000,21307=>1000,21308=>1000,21309=>1000,21310=>1000,21311=>1000,21312=>1000,21313=>1000,21314=>1000,21315=>1000,21316=>1000,21317=>1000,21318=>1000,21319=>1000,21320=>1000,21321=>1000,21322=>1000,21323=>1000,21324=>1000,21325=>1000,21326=>1000,21327=>1000,21328=>1000,21329=>1000,21330=>1000,21331=>1000,21332=>1000,21333=>1000,21334=>1000,21335=>1000,21336=>1000,21337=>1000,21338=>1000,21339=>1000,21340=>1000,21341=>1000,21342=>1000,21343=>1000,21344=>1000,21345=>1000,21346=>1000,21347=>1000,21348=>1000,21349=>1000,21350=>1000,21351=>1000,21352=>1000,21353=>1000,21354=>1000,21355=>1000,21356=>1000,21357=>1000,21358=>1000,21359=>1000,21360=>1000,21361=>1000,21362=>1000,21363=>1000,21364=>1000,21365=>1000,21366=>1000,21367=>1000,21368=>1000,21369=>1000,21370=>1000,21371=>1000,21372=>1000,21373=>1000,21374=>1000,21375=>1000,21376=>1000,21377=>1000,21378=>1000,21379=>1000,21380=>1000,21381=>1000,21382=>1000,21383=>1000,21384=>1000,21385=>1000,21386=>1000,21387=>1000,21388=>1000,21389=>1000,21390=>1000,21391=>1000,21392=>1000,21393=>1000,21394=>1000,21395=>1000,21396=>1000,21397=>1000,21398=>1000,21399=>1000,21400=>1000,21401=>1000,21402=>1000,21403=>1000,21404=>1000,21405=>1000,21406=>1000,21407=>1000,21408=>1000,21409=>1000,21410=>1000,21411=>1000,21412=>1000,21413=>1000,21414=>1000,21415=>1000,21416=>1000,21417=>1000,21418=>1000,21419=>1000,21420=>1000,21421=>1000,21422=>1000,21423=>1000,21424=>1000,21425=>1000,21426=>1000,21427=>1000,21428=>1000,21429=>1000,21430=>1000,21431=>1000,21432=>1000,21433=>1000,21434=>1000,21435=>1000,21436=>1000,21437=>1000,21438=>1000,21439=>1000,21440=>1000,21441=>1000,21442=>1000,21443=>1000,21444=>1000,21445=>1000,21446=>1000,21447=>1000,21448=>1000,21449=>1000,21450=>1000,21451=>1000,21452=>1000,21453=>1000,21454=>1000,21455=>1000,21456=>1000,21457=>1000,21458=>1000,21459=>1000,21460=>1000,21461=>1000,21462=>1000,21463=>1000,21464=>1000,21465=>1000,21466=>1000,21467=>1000,21468=>1000,21469=>1000,21470=>1000,21471=>1000,21472=>1000,21473=>1000,21474=>1000,21475=>1000,21476=>1000,21477=>1000,21478=>1000,21479=>1000,21480=>1000,21481=>1000,21482=>1000,21483=>1000,21484=>1000,21485=>1000,21486=>1000,21487=>1000,21488=>1000,21489=>1000,21490=>1000,21491=>1000,21492=>1000,21493=>1000,21494=>1000,21495=>1000,21496=>1000,21497=>1000,21498=>1000,21499=>1000,21500=>1000,21501=>1000,21502=>1000,21503=>1000,21504=>1000,21505=>1000,21506=>1000,21507=>1000,21508=>1000,21509=>1000,21510=>1000,21511=>1000,21512=>1000,21513=>1000,21514=>1000,21515=>1000,21516=>1000,21517=>1000,21518=>1000,21519=>1000,21520=>1000,21521=>1000,21522=>1000,21523=>1000,21524=>1000,21525=>1000,21526=>1000,21527=>1000,21528=>1000,21529=>1000,21530=>1000,21531=>1000,21532=>1000,21533=>1000,21534=>1000,21535=>1000,21536=>1000,21537=>1000,21538=>1000,21539=>1000,21540=>1000,21541=>1000,21542=>1000,21543=>1000,21544=>1000,21545=>1000,21546=>1000,21547=>1000,21548=>1000,21549=>1000,21550=>1000,21551=>1000,21552=>1000,21553=>1000,21554=>1000,21555=>1000,21556=>1000,21557=>1000,21558=>1000,21559=>1000,21560=>1000,21561=>1000,21562=>1000,21563=>1000,21564=>1000,21565=>1000,21566=>1000,21567=>1000,21568=>1000,21569=>1000,21570=>1000,21571=>1000,21572=>1000,21573=>1000,21574=>1000,21575=>1000,21576=>1000,21577=>1000,21578=>1000,21579=>1000,21580=>1000,21581=>1000,21582=>1000,21583=>1000,21584=>1000,21585=>1000,21586=>1000,21587=>1000,21588=>1000,21589=>1000,21590=>1000,21591=>1000,21592=>1000,21593=>1000,21594=>1000,21595=>1000,21596=>1000,21597=>1000,21598=>1000,21599=>1000,21600=>1000,21601=>1000,21602=>1000,21603=>1000,21604=>1000,21605=>1000,21606=>1000,21607=>1000,21608=>1000,21609=>1000,21610=>1000,21611=>1000,21612=>1000,21613=>1000,21614=>1000,21615=>1000,21616=>1000,21617=>1000,21618=>1000,21619=>1000,21620=>1000,21621=>1000,21622=>1000,21623=>1000,21624=>1000,21625=>1000,21626=>1000,21627=>1000,21628=>1000,21629=>1000,21630=>1000,21631=>1000,21632=>1000,21633=>1000,21634=>1000,21635=>1000,21636=>1000,21637=>1000,21638=>1000,21639=>1000,21640=>1000,21641=>1000,21642=>1000,21643=>1000,21644=>1000,21645=>1000,21646=>1000,21647=>1000,21648=>1000,21649=>1000,21650=>1000,21651=>1000,21652=>1000,21653=>1000,21654=>1000,21655=>1000,21656=>1000,21657=>1000,21658=>1000,21659=>1000,21660=>1000,21661=>1000,21662=>1000,21663=>1000,21664=>1000,21665=>1000,21666=>1000,21667=>1000,21668=>1000,21669=>1000,21670=>1000,21671=>1000,21672=>1000,21673=>1000,21674=>1000,21675=>1000,21676=>1000,21677=>1000,21678=>1000,21679=>1000,21680=>1000,21681=>1000,21682=>1000,21683=>1000,21684=>1000,21685=>1000,21686=>1000,21687=>1000,21688=>1000,21689=>1000,21690=>1000,21691=>1000,21692=>1000,21693=>1000,21694=>1000,21695=>1000,21696=>1000,21697=>1000,21698=>1000,21699=>1000,21700=>1000,21701=>1000,21702=>1000,21703=>1000,21704=>1000,21705=>1000,21706=>1000,21707=>1000,21708=>1000,21709=>1000,21710=>1000,21711=>1000,21712=>1000,21713=>1000,21714=>1000,21715=>1000,21716=>1000,21717=>1000,21718=>1000,21719=>1000,21720=>1000,21721=>1000,21722=>1000,21723=>1000,21724=>1000,21725=>1000,21726=>1000,21727=>1000,21728=>1000,21729=>1000,21730=>1000,21731=>1000,21732=>1000,21733=>1000,21734=>1000,21735=>1000,21736=>1000,21737=>1000,21738=>1000,21739=>1000,21740=>1000,21741=>1000,21742=>1000,21743=>1000,21744=>1000,21745=>1000,21746=>1000,21747=>1000,21748=>1000,21749=>1000,21750=>1000,21751=>1000,21752=>1000,21753=>1000,21754=>1000,21755=>1000,21756=>1000,21757=>1000,21758=>1000,21759=>1000,21760=>1000,21761=>1000,21762=>1000,21763=>1000,21764=>1000,21765=>1000,21766=>1000,21767=>1000,21768=>1000,21769=>1000,21770=>1000,21771=>1000,21772=>1000,21773=>1000,21774=>1000,21775=>1000,21776=>1000,21777=>1000,21778=>1000,21779=>1000,21780=>1000,21781=>1000,21782=>1000,21783=>1000,21784=>1000,21785=>1000,21786=>1000,21787=>1000,21788=>1000,21789=>1000,21790=>1000,21791=>1000,21792=>1000,21793=>1000,21794=>1000,21795=>1000,21796=>1000,21797=>1000,21798=>1000,21799=>1000,21800=>1000,21801=>1000,21802=>1000,21803=>1000,21804=>1000,21805=>1000,21806=>1000,21807=>1000,21808=>1000,21809=>1000,21810=>1000,21811=>1000,21812=>1000,21813=>1000,21814=>1000,21815=>1000,21816=>1000,21817=>1000,21818=>1000,21819=>1000,21820=>1000,21821=>1000,21822=>1000,21823=>1000,21824=>1000,21825=>1000,21826=>1000,21827=>1000,21828=>1000,21829=>1000,21830=>1000,21831=>1000,21832=>1000,21833=>1000,21834=>1000,21835=>1000,21836=>1000,21837=>1000,21838=>1000,21839=>1000,21840=>1000,21841=>1000,21842=>1000,21843=>1000,21844=>1000,21845=>1000,21846=>1000,21847=>1000,21848=>1000,21849=>1000,21850=>1000,21851=>1000,21852=>1000,21853=>1000,21854=>1000,21855=>1000,21856=>1000,21857=>1000,21858=>1000,21859=>1000,21860=>1000,21861=>1000,21862=>1000,21863=>1000,21864=>1000,21865=>1000,21866=>1000,21867=>1000,21868=>1000,21869=>1000,21870=>1000,21871=>1000,21872=>1000,21873=>1000,21874=>1000,21875=>1000,21876=>1000,21877=>1000,21878=>1000,21879=>1000,21880=>1000,21881=>1000,21882=>1000,21883=>1000,21884=>1000,21885=>1000,21886=>1000,21887=>1000,21888=>1000,21889=>1000,21890=>1000,21891=>1000,21892=>1000,21893=>1000,21894=>1000,21895=>1000,21896=>1000,21897=>1000,21898=>1000,21899=>1000,21900=>1000,21901=>1000,21902=>1000,21903=>1000,21904=>1000,21905=>1000,21906=>1000,21907=>1000,21908=>1000,21909=>1000,21910=>1000,21911=>1000,21912=>1000,21913=>1000,21914=>1000,21915=>1000,21916=>1000,21917=>1000,21918=>1000,21919=>1000,21920=>1000,21921=>1000,21922=>1000,21923=>1000,21924=>1000,21925=>1000,21926=>1000,21927=>1000,21928=>1000,21929=>1000,21930=>1000,21931=>1000,21932=>1000,21933=>1000,21934=>1000,21935=>1000,21936=>1000,21937=>1000,21938=>1000,21939=>1000,21940=>1000,21941=>1000,21942=>1000,21943=>1000,21944=>1000,21945=>1000,21946=>1000,21947=>1000,21948=>1000,21949=>1000,21950=>1000,21951=>1000,21952=>1000,21953=>1000,21954=>1000,21955=>1000,21956=>1000,21957=>1000,21958=>1000,21959=>1000,21960=>1000,21961=>1000,21962=>1000,21963=>1000,21964=>1000,21965=>1000,21966=>1000,21967=>1000,21968=>1000,21969=>1000,21970=>1000,21971=>1000,21972=>1000,21973=>1000,21974=>1000,21975=>1000,21976=>1000,21977=>1000,21978=>1000,21979=>1000,21980=>1000,21981=>1000,21982=>1000,21983=>1000,21984=>1000,21985=>1000,21986=>1000,21987=>1000,21988=>1000,21989=>1000,21990=>1000,21991=>1000,21992=>1000,21993=>1000,21994=>1000,21995=>1000,21996=>1000,21997=>1000,21998=>1000,21999=>1000,22000=>1000,22001=>1000,22002=>1000,22003=>1000,22004=>1000,22005=>1000,22006=>1000,22007=>1000,22008=>1000,22009=>1000,22010=>1000,22011=>1000,22012=>1000,22013=>1000,22014=>1000,22015=>1000,22016=>1000,22017=>1000,22018=>1000,22019=>1000,22020=>1000,22021=>1000,22022=>1000,22023=>1000,22024=>1000,22025=>1000,22026=>1000,22027=>1000,22028=>1000,22029=>1000,22030=>1000,22031=>1000,22032=>1000,22033=>1000,22034=>1000,22035=>1000,22036=>1000,22037=>1000,22038=>1000,22039=>1000,22040=>1000,22041=>1000,22042=>1000,22043=>1000,22044=>1000,22045=>1000,22046=>1000,22047=>1000,22048=>1000,22049=>1000,22050=>1000,22051=>1000,22052=>1000,22053=>1000,22054=>1000,22055=>1000,22056=>1000,22057=>1000,22058=>1000,22059=>1000,22060=>1000,22061=>1000,22062=>1000,22063=>1000,22064=>1000,22065=>1000,22066=>1000,22067=>1000,22068=>1000,22069=>1000,22070=>1000,22071=>1000,22072=>1000,22073=>1000,22074=>1000,22075=>1000,22076=>1000,22077=>1000,22078=>1000,22079=>1000,22080=>1000,22081=>1000,22082=>1000,22083=>1000,22084=>1000,22085=>1000,22086=>1000,22087=>1000,22088=>1000,22089=>1000,22090=>1000,22091=>1000,22092=>1000,22093=>1000,22094=>1000,22095=>1000,22096=>1000,22097=>1000,22098=>1000,22099=>1000,22100=>1000,22101=>1000,22102=>1000,22103=>1000,22104=>1000,22105=>1000,22106=>1000,22107=>1000,22108=>1000,22109=>1000,22110=>1000,22111=>1000,22112=>1000,22113=>1000,22114=>1000,22115=>1000,22116=>1000,22117=>1000,22118=>1000,22119=>1000,22120=>1000,22121=>1000,22122=>1000,22123=>1000,22124=>1000,22125=>1000,22126=>1000,22127=>1000,22128=>1000,22129=>1000,22130=>1000,22131=>1000,22132=>1000,22133=>1000,22134=>1000,22135=>1000,22136=>1000,22137=>1000,22138=>1000,22139=>1000,22140=>1000,22141=>1000,22142=>1000,22143=>1000,22144=>1000,22145=>1000,22146=>1000,22147=>1000,22148=>1000,22149=>1000,22150=>1000,22151=>1000,22152=>1000,22153=>1000,22154=>1000,22155=>1000,22156=>1000,22157=>1000,22158=>1000,22159=>1000,22160=>1000,22161=>1000,22162=>1000,22163=>1000,22164=>1000,22165=>1000,22166=>1000,22167=>1000,22168=>1000,22169=>1000,22170=>1000,22171=>1000,22172=>1000,22173=>1000,22174=>1000,22175=>1000,22176=>1000,22177=>1000,22178=>1000,22179=>1000,22180=>1000,22181=>1000,22182=>1000,22183=>1000,22184=>1000,22185=>1000,22186=>1000,22187=>1000,22188=>1000,22189=>1000,22190=>1000,22191=>1000,22192=>1000,22193=>1000,22194=>1000,22195=>1000,22196=>1000,22197=>1000,22198=>1000,22199=>1000,22200=>1000,22201=>1000,22202=>1000,22203=>1000,22204=>1000,22205=>1000,22206=>1000,22207=>1000,22208=>1000,22209=>1000,22210=>1000,22211=>1000,22212=>1000,22213=>1000,22214=>1000,22215=>1000,22216=>1000,22217=>1000,22218=>1000,22219=>1000,22220=>1000,22221=>1000,22222=>1000,22223=>1000,22224=>1000,22225=>1000,22226=>1000,22227=>1000,22228=>1000,22229=>1000,22230=>1000,22231=>1000,22232=>1000,22233=>1000,22234=>1000,22235=>1000,22236=>1000,22237=>1000,22238=>1000,22239=>1000,22240=>1000,22241=>1000,22242=>1000,22243=>1000,22244=>1000,22245=>1000,22246=>1000,22247=>1000,22248=>1000,22249=>1000,22250=>1000,22251=>1000,22252=>1000,22253=>1000,22254=>1000,22255=>1000,22256=>1000,22257=>1000,22258=>1000,22259=>1000,22260=>1000,22261=>1000,22262=>1000,22263=>1000,22264=>1000,22265=>1000,22266=>1000,22267=>1000,22268=>1000,22269=>1000,22270=>1000,22271=>1000,22272=>1000,22273=>1000,22274=>1000,22275=>1000,22276=>1000,22277=>1000,22278=>1000,22279=>1000,22280=>1000,22281=>1000,22282=>1000,22283=>1000,22284=>1000,22285=>1000,22286=>1000,22287=>1000,22288=>1000,22289=>1000,22290=>1000,22291=>1000,22292=>1000,22293=>1000,22294=>1000,22295=>1000,22296=>1000,22297=>1000,22298=>1000,22299=>1000,22300=>1000,22301=>1000,22302=>1000,22303=>1000,22304=>1000,22305=>1000,22306=>1000,22307=>1000,22308=>1000,22309=>1000,22310=>1000,22311=>1000,22312=>1000,22313=>1000,22314=>1000,22315=>1000,22316=>1000,22317=>1000,22318=>1000,22319=>1000,22320=>1000,22321=>1000,22322=>1000,22323=>1000,22324=>1000,22325=>1000,22326=>1000,22327=>1000,22328=>1000,22329=>1000,22330=>1000,22331=>1000,22332=>1000,22333=>1000,22334=>1000,22335=>1000,22336=>1000,22337=>1000,22338=>1000,22339=>1000,22340=>1000,22341=>1000,22342=>1000,22343=>1000,22344=>1000,22345=>1000,22346=>1000,22347=>1000,22348=>1000,22349=>1000,22350=>1000,22351=>1000,22352=>1000,22353=>1000,22354=>1000,22355=>1000,22356=>1000,22357=>1000,22358=>1000,22359=>1000,22360=>1000,22361=>1000,22362=>1000,22363=>1000,22364=>1000,22365=>1000,22366=>1000,22367=>1000,22368=>1000,22369=>1000,22370=>1000,22371=>1000,22372=>1000,22373=>1000,22374=>1000,22375=>1000,22376=>1000,22377=>1000,22378=>1000,22379=>1000,22380=>1000,22381=>1000,22382=>1000,22383=>1000,22384=>1000,22385=>1000,22386=>1000,22387=>1000,22388=>1000,22389=>1000,22390=>1000,22391=>1000,22392=>1000,22393=>1000,22394=>1000,22395=>1000,22396=>1000,22397=>1000,22398=>1000,22399=>1000,22400=>1000,22401=>1000,22402=>1000,22403=>1000,22404=>1000,22405=>1000,22406=>1000,22407=>1000,22408=>1000,22409=>1000,22410=>1000,22411=>1000,22412=>1000,22413=>1000,22414=>1000,22415=>1000,22416=>1000,22417=>1000,22418=>1000,22419=>1000,22420=>1000,22421=>1000,22422=>1000,22423=>1000,22424=>1000,22425=>1000,22426=>1000,22427=>1000,22428=>1000,22429=>1000,22430=>1000,22431=>1000,22432=>1000,22433=>1000,22434=>1000,22435=>1000,22436=>1000,22437=>1000,22438=>1000,22439=>1000,22440=>1000,22441=>1000,22442=>1000,22443=>1000,22444=>1000,22445=>1000,22446=>1000,22447=>1000,22448=>1000,22449=>1000,22450=>1000,22451=>1000,22452=>1000,22453=>1000,22454=>1000,22455=>1000,22456=>1000,22457=>1000,22458=>1000,22459=>1000,22460=>1000,22461=>1000,22462=>1000,22463=>1000,22464=>1000,22465=>1000,22466=>1000,22467=>1000,22468=>1000,22469=>1000,22470=>1000,22471=>1000,22472=>1000,22473=>1000,22474=>1000,22475=>1000,22476=>1000,22477=>1000,22478=>1000,22479=>1000,22480=>1000,22481=>1000,22482=>1000,22483=>1000,22484=>1000,22485=>1000,22486=>1000,22487=>1000,22488=>1000,22489=>1000,22490=>1000,22491=>1000,22492=>1000,22493=>1000,22494=>1000,22495=>1000,22496=>1000,22497=>1000,22498=>1000,22499=>1000,22500=>1000,22501=>1000,22502=>1000,22503=>1000,22504=>1000,22505=>1000,22506=>1000,22507=>1000,22508=>1000,22509=>1000,22510=>1000,22511=>1000,22512=>1000,22513=>1000,22514=>1000,22515=>1000,22516=>1000,22517=>1000,22518=>1000,22519=>1000,22520=>1000,22521=>1000,22522=>1000,22523=>1000,22524=>1000,22525=>1000,22526=>1000,22527=>1000,22528=>1000,22529=>1000,22530=>1000,22531=>1000,22532=>1000,22533=>1000,22534=>1000,22535=>1000,22536=>1000,22537=>1000,22538=>1000,22539=>1000,22540=>1000,22541=>1000,22542=>1000,22543=>1000,22544=>1000,22545=>1000,22546=>1000,22547=>1000,22548=>1000,22549=>1000,22550=>1000,22551=>1000,22552=>1000,22553=>1000,22554=>1000,22555=>1000,22556=>1000,22557=>1000,22558=>1000,22559=>1000,22560=>1000,22561=>1000,22562=>1000,22563=>1000,22564=>1000,22565=>1000,22566=>1000,22567=>1000,22568=>1000,22569=>1000,22570=>1000,22571=>1000,22572=>1000,22573=>1000,22574=>1000,22575=>1000,22576=>1000,22577=>1000,22578=>1000,22579=>1000,22580=>1000,22581=>1000,22582=>1000,22583=>1000,22584=>1000,22585=>1000,22586=>1000,22587=>1000,22588=>1000,22589=>1000,22590=>1000,22591=>1000,22592=>1000,22593=>1000,22594=>1000,22595=>1000,22596=>1000,22597=>1000,22598=>1000,22599=>1000,22600=>1000,22601=>1000,22602=>1000,22603=>1000,22604=>1000,22605=>1000,22606=>1000,22607=>1000,22608=>1000,22609=>1000,22610=>1000,22611=>1000,22612=>1000,22613=>1000,22614=>1000,22615=>1000,22616=>1000,22617=>1000,22618=>1000,22619=>1000,22620=>1000,22621=>1000,22622=>1000,22623=>1000,22624=>1000,22625=>1000,22626=>1000,22627=>1000,22628=>1000,22629=>1000,22630=>1000,22631=>1000,22632=>1000,22633=>1000,22634=>1000,22635=>1000,22636=>1000,22637=>1000,22638=>1000,22639=>1000,22640=>1000,22641=>1000,22642=>1000,22643=>1000,22644=>1000,22645=>1000,22646=>1000,22647=>1000,22648=>1000,22649=>1000,22650=>1000,22651=>1000,22652=>1000,22653=>1000,22654=>1000,22655=>1000,22656=>1000,22657=>1000,22658=>1000,22659=>1000,22660=>1000,22661=>1000,22662=>1000,22663=>1000,22664=>1000,22665=>1000,22666=>1000,22667=>1000,22668=>1000,22669=>1000,22670=>1000,22671=>1000,22672=>1000,22673=>1000,22674=>1000,22675=>1000,22676=>1000,22677=>1000,22678=>1000,22679=>1000,22680=>1000,22681=>1000,22682=>1000,22683=>1000,22684=>1000,22685=>1000,22686=>1000,22687=>1000,22688=>1000,22689=>1000,22690=>1000,22691=>1000,22692=>1000,22693=>1000,22694=>1000,22695=>1000,22696=>1000,22697=>1000,22698=>1000,22699=>1000,22700=>1000,22701=>1000,22702=>1000,22703=>1000,22704=>1000,22705=>1000,22706=>1000,22707=>1000,22708=>1000,22709=>1000,22710=>1000,22711=>1000,22712=>1000,22713=>1000,22714=>1000,22715=>1000,22716=>1000,22717=>1000,22718=>1000,22719=>1000,22720=>1000,22721=>1000,22722=>1000,22723=>1000,22724=>1000,22725=>1000,22726=>1000,22727=>1000,22728=>1000,22729=>1000,22730=>1000,22731=>1000,22732=>1000,22733=>1000,22734=>1000,22735=>1000,22736=>1000,22737=>1000,22738=>1000,22739=>1000,22740=>1000,22741=>1000,22742=>1000,22743=>1000,22744=>1000,22745=>1000,22746=>1000,22747=>1000,22748=>1000,22749=>1000,22750=>1000,22751=>1000,22752=>1000,22753=>1000,22754=>1000,22755=>1000,22756=>1000,22757=>1000,22758=>1000,22759=>1000,22760=>1000,22761=>1000,22762=>1000,22763=>1000,22764=>1000,22765=>1000,22766=>1000,22767=>1000,22768=>1000,22769=>1000,22770=>1000,22771=>1000,22772=>1000,22773=>1000,22774=>1000,22775=>1000,22776=>1000,22777=>1000,22778=>1000,22779=>1000,22780=>1000,22781=>1000,22782=>1000,22783=>1000,22784=>1000,22785=>1000,22786=>1000,22787=>1000,22788=>1000,22789=>1000,22790=>1000,22791=>1000,22792=>1000,22793=>1000,22794=>1000,22795=>1000,22796=>1000,22797=>1000,22798=>1000,22799=>1000,22800=>1000,22801=>1000,22802=>1000,22803=>1000,22804=>1000,22805=>1000,22806=>1000,22807=>1000,22808=>1000,22809=>1000,22810=>1000,22811=>1000,22812=>1000,22813=>1000,22814=>1000,22815=>1000,22816=>1000,22817=>1000,22818=>1000,22819=>1000,22820=>1000,22821=>1000,22822=>1000,22823=>1000,22824=>1000,22825=>1000,22826=>1000,22827=>1000,22828=>1000,22829=>1000,22830=>1000,22831=>1000,22832=>1000,22833=>1000,22834=>1000,22835=>1000,22836=>1000,22837=>1000,22838=>1000,22839=>1000,22840=>1000,22841=>1000,22842=>1000,22843=>1000,22844=>1000,22845=>1000,22846=>1000,22847=>1000,22848=>1000,22849=>1000,22850=>1000,22851=>1000,22852=>1000,22853=>1000,22854=>1000,22855=>1000,22856=>1000,22857=>1000,22858=>1000,22859=>1000,22860=>1000,22861=>1000,22862=>1000,22863=>1000,22864=>1000,22865=>1000,22866=>1000,22867=>1000,22868=>1000,22869=>1000,22870=>1000,22871=>1000,22872=>1000,22873=>1000,22874=>1000,22875=>1000,22876=>1000,22877=>1000,22878=>1000,22879=>1000,22880=>1000,22881=>1000,22882=>1000,22883=>1000,22884=>1000,22885=>1000,22886=>1000,22887=>1000,22888=>1000,22889=>1000,22890=>1000,22891=>1000,22892=>1000,22893=>1000,22894=>1000,22895=>1000,22896=>1000,22897=>1000,22898=>1000,22899=>1000,22900=>1000,22901=>1000,22902=>1000,22903=>1000,22904=>1000,22905=>1000,22906=>1000,22907=>1000,22908=>1000,22909=>1000,22910=>1000,22911=>1000,22912=>1000,22913=>1000,22914=>1000,22915=>1000,22916=>1000,22917=>1000,22918=>1000,22919=>1000,22920=>1000,22921=>1000,22922=>1000,22923=>1000,22924=>1000,22925=>1000,22926=>1000,22927=>1000,22928=>1000,22929=>1000,22930=>1000,22931=>1000,22932=>1000,22933=>1000,22934=>1000,22935=>1000,22936=>1000,22937=>1000,22938=>1000,22939=>1000,22940=>1000,22941=>1000,22942=>1000,22943=>1000,22944=>1000,22945=>1000,22946=>1000,22947=>1000,22948=>1000,22949=>1000,22950=>1000,22951=>1000,22952=>1000,22953=>1000,22954=>1000,22955=>1000,22956=>1000,22957=>1000,22958=>1000,22959=>1000,22960=>1000,22961=>1000,22962=>1000,22963=>1000,22964=>1000,22965=>1000,22966=>1000,22967=>1000,22968=>1000,22969=>1000,22970=>1000,22971=>1000,22972=>1000,22973=>1000,22974=>1000,22975=>1000,22976=>1000,22977=>1000,22978=>1000,22979=>1000,22980=>1000,22981=>1000,22982=>1000,22983=>1000,22984=>1000,22985=>1000,22986=>1000,22987=>1000,22988=>1000,22989=>1000,22990=>1000,22991=>1000,22992=>1000,22993=>1000,22994=>1000,22995=>1000,22996=>1000,22997=>1000,22998=>1000,22999=>1000,23000=>1000,23001=>1000,23002=>1000,23003=>1000,23004=>1000,23005=>1000,23006=>1000,23007=>1000,23008=>1000,23009=>1000,23010=>1000,23011=>1000,23012=>1000,23013=>1000,23014=>1000,23015=>1000,23016=>1000,23017=>1000,23018=>1000,23019=>1000,23020=>1000,23021=>1000,23022=>1000,23023=>1000,23024=>1000,23025=>1000,23026=>1000,23027=>1000,23028=>1000,23029=>1000,23030=>1000,23031=>1000,23032=>1000,23033=>1000,23034=>1000,23035=>1000,23036=>1000,23037=>1000,23038=>1000,23039=>1000,23040=>1000,23041=>1000,23042=>1000,23043=>1000,23044=>1000,23045=>1000,23046=>1000,23047=>1000,23048=>1000,23049=>1000,23050=>1000,23051=>1000,23052=>1000,23053=>1000,23054=>1000,23055=>1000,23056=>1000,23057=>1000,23058=>1000,23059=>1000,23060=>1000,23061=>1000,23062=>1000,23063=>1000,23064=>1000,23065=>1000,23066=>1000,23067=>1000,23068=>1000,23069=>1000,23070=>1000,23071=>1000,23072=>1000,23073=>1000,23074=>1000,23075=>1000,23076=>1000,23077=>1000,23078=>1000,23079=>1000,23080=>1000,23081=>1000,23082=>1000,23083=>1000,23084=>1000,23085=>1000,23086=>1000,23087=>1000,23088=>1000,23089=>1000,23090=>1000,23091=>1000,23092=>1000,23093=>1000,23094=>1000,23095=>1000,23096=>1000,23097=>1000,23098=>1000,23099=>1000,23100=>1000,23101=>1000,23102=>1000,23103=>1000,23104=>1000,23105=>1000,23106=>1000,23107=>1000,23108=>1000,23109=>1000,23110=>1000,23111=>1000,23112=>1000,23113=>1000,23114=>1000,23115=>1000,23116=>1000,23117=>1000,23118=>1000,23119=>1000,23120=>1000,23121=>1000,23122=>1000,23123=>1000,23124=>1000,23125=>1000,23126=>1000,23127=>1000,23128=>1000,23129=>1000,23130=>1000,23131=>1000,23132=>1000,23133=>1000,23134=>1000,23135=>1000,23136=>1000,23137=>1000,23138=>1000,23139=>1000,23140=>1000,23141=>1000,23142=>1000,23143=>1000,23144=>1000,23145=>1000,23146=>1000,23147=>1000,23148=>1000,23149=>1000,23150=>1000,23151=>1000,23152=>1000,23153=>1000,23154=>1000,23155=>1000,23156=>1000,23157=>1000,23158=>1000,23159=>1000,23160=>1000,23161=>1000,23162=>1000,23163=>1000,23164=>1000,23165=>1000,23166=>1000,23167=>1000,23168=>1000,23169=>1000,23170=>1000,23171=>1000,23172=>1000,23173=>1000,23174=>1000,23175=>1000,23176=>1000,23177=>1000,23178=>1000,23179=>1000,23180=>1000,23181=>1000,23182=>1000,23183=>1000,23184=>1000,23185=>1000,23186=>1000,23187=>1000,23188=>1000,23189=>1000,23190=>1000,23191=>1000,23192=>1000,23193=>1000,23194=>1000,23195=>1000,23196=>1000,23197=>1000,23198=>1000,23199=>1000,23200=>1000,23201=>1000,23202=>1000,23203=>1000,23204=>1000,23205=>1000,23206=>1000,23207=>1000,23208=>1000,23209=>1000,23210=>1000,23211=>1000,23212=>1000,23213=>1000,23214=>1000,23215=>1000,23216=>1000,23217=>1000,23218=>1000,23219=>1000,23220=>1000,23221=>1000,23222=>1000,23223=>1000,23224=>1000,23225=>1000,23226=>1000,23227=>1000,23228=>1000,23229=>1000,23230=>1000,23231=>1000,23232=>1000,23233=>1000,23234=>1000,23235=>1000,23236=>1000,23237=>1000,23238=>1000,23239=>1000,23240=>1000,23241=>1000,23242=>1000,23243=>1000,23244=>1000,23245=>1000,23246=>1000,23247=>1000,23248=>1000,23249=>1000,23250=>1000,23251=>1000,23252=>1000,23253=>1000,23254=>1000,23255=>1000,23256=>1000,23257=>1000,23258=>1000,23259=>1000,23260=>1000,23261=>1000,23262=>1000,23263=>1000,23264=>1000,23265=>1000,23266=>1000,23267=>1000,23268=>1000,23269=>1000,23270=>1000,23271=>1000,23272=>1000,23273=>1000,23274=>1000,23275=>1000,23276=>1000,23277=>1000,23278=>1000,23279=>1000,23280=>1000,23281=>1000,23282=>1000,23283=>1000,23284=>1000,23285=>1000,23286=>1000,23287=>1000,23288=>1000,23289=>1000,23290=>1000,23291=>1000,23292=>1000,23293=>1000,23294=>1000,23295=>1000,23296=>1000,23297=>1000,23298=>1000,23299=>1000,23300=>1000,23301=>1000,23302=>1000,23303=>1000,23304=>1000,23305=>1000,23306=>1000,23307=>1000,23308=>1000,23309=>1000,23310=>1000,23311=>1000,23312=>1000,23313=>1000,23314=>1000,23315=>1000,23316=>1000,23317=>1000,23318=>1000,23319=>1000,23320=>1000,23321=>1000,23322=>1000,23323=>1000,23324=>1000,23325=>1000,23326=>1000,23327=>1000,23328=>1000,23329=>1000,23330=>1000,23331=>1000,23332=>1000,23333=>1000,23334=>1000,23335=>1000,23336=>1000,23337=>1000,23338=>1000,23339=>1000,23340=>1000,23341=>1000,23342=>1000,23343=>1000,23344=>1000,23345=>1000,23346=>1000,23347=>1000,23348=>1000,23349=>1000,23350=>1000,23351=>1000,23352=>1000,23353=>1000,23354=>1000,23355=>1000,23356=>1000,23357=>1000,23358=>1000,23359=>1000,23360=>1000,23361=>1000,23362=>1000,23363=>1000,23364=>1000,23365=>1000,23366=>1000,23367=>1000,23368=>1000,23369=>1000,23370=>1000,23371=>1000,23372=>1000,23373=>1000,23374=>1000,23375=>1000,23376=>1000,23377=>1000,23378=>1000,23379=>1000,23380=>1000,23381=>1000,23382=>1000,23383=>1000,23384=>1000,23385=>1000,23386=>1000,23387=>1000,23388=>1000,23389=>1000,23390=>1000,23391=>1000,23392=>1000,23393=>1000,23394=>1000,23395=>1000,23396=>1000,23397=>1000,23398=>1000,23399=>1000,23400=>1000,23401=>1000,23402=>1000,23403=>1000,23404=>1000,23405=>1000,23406=>1000,23407=>1000,23408=>1000,23409=>1000,23410=>1000,23411=>1000,23412=>1000,23413=>1000,23414=>1000,23415=>1000,23416=>1000,23417=>1000,23418=>1000,23419=>1000,23420=>1000,23421=>1000,23422=>1000,23423=>1000,23424=>1000,23425=>1000,23426=>1000,23427=>1000,23428=>1000,23429=>1000,23430=>1000,23431=>1000,23432=>1000,23433=>1000,23434=>1000,23435=>1000,23436=>1000,23437=>1000,23438=>1000,23439=>1000,23440=>1000,23441=>1000,23442=>1000,23443=>1000,23444=>1000,23445=>1000,23446=>1000,23447=>1000,23448=>1000,23449=>1000,23450=>1000,23451=>1000,23452=>1000,23453=>1000,23454=>1000,23455=>1000,23456=>1000,23457=>1000,23458=>1000,23459=>1000,23460=>1000,23461=>1000,23462=>1000,23463=>1000,23464=>1000,23465=>1000,23466=>1000,23467=>1000,23468=>1000,23469=>1000,23470=>1000,23471=>1000,23472=>1000,23473=>1000,23474=>1000,23475=>1000,23476=>1000,23477=>1000,23478=>1000,23479=>1000,23480=>1000,23481=>1000,23482=>1000,23483=>1000,23484=>1000,23485=>1000,23486=>1000,23487=>1000,23488=>1000,23489=>1000,23490=>1000,23491=>1000,23492=>1000,23493=>1000,23494=>1000,23495=>1000,23496=>1000,23497=>1000,23498=>1000,23499=>1000,23500=>1000,23501=>1000,23502=>1000,23503=>1000,23504=>1000,23505=>1000,23506=>1000,23507=>1000,23508=>1000,23509=>1000,23510=>1000,23511=>1000,23512=>1000,23513=>1000,23514=>1000,23515=>1000,23516=>1000,23517=>1000,23518=>1000,23519=>1000,23520=>1000,23521=>1000,23522=>1000,23523=>1000,23524=>1000,23525=>1000,23526=>1000,23527=>1000,23528=>1000,23529=>1000,23530=>1000,23531=>1000,23532=>1000,23533=>1000,23534=>1000,23535=>1000,23536=>1000,23537=>1000,23538=>1000,23539=>1000,23540=>1000,23541=>1000,23542=>1000,23543=>1000,23544=>1000,23545=>1000,23546=>1000,23547=>1000,23548=>1000,23549=>1000,23550=>1000,23551=>1000,23552=>1000,23553=>1000,23554=>1000,23555=>1000,23556=>1000,23557=>1000,23558=>1000,23559=>1000,23560=>1000,23561=>1000,23562=>1000,23563=>1000,23564=>1000,23565=>1000,23566=>1000,23567=>1000,23568=>1000,23569=>1000,23570=>1000,23571=>1000,23572=>1000,23573=>1000,23574=>1000,23575=>1000,23576=>1000,23577=>1000,23578=>1000,23579=>1000,23580=>1000,23581=>1000,23582=>1000,23583=>1000,23584=>1000,23585=>1000,23586=>1000,23587=>1000,23588=>1000,23589=>1000,23590=>1000,23591=>1000,23592=>1000,23593=>1000,23594=>1000,23595=>1000,23596=>1000,23597=>1000,23598=>1000,23599=>1000,23600=>1000,23601=>1000,23602=>1000,23603=>1000,23604=>1000,23605=>1000,23606=>1000,23607=>1000,23608=>1000,23609=>1000,23610=>1000,23611=>1000,23612=>1000,23613=>1000,23614=>1000,23615=>1000,23616=>1000,23617=>1000,23618=>1000,23619=>1000,23620=>1000,23621=>1000,23622=>1000,23623=>1000,23624=>1000,23625=>1000,23626=>1000,23627=>1000,23628=>1000,23629=>1000,23630=>1000,23631=>1000,23632=>1000,23633=>1000,23634=>1000,23635=>1000,23636=>1000,23637=>1000,23638=>1000,23639=>1000,23640=>1000,23641=>1000,23642=>1000,23643=>1000,23644=>1000,23645=>1000,23646=>1000,23647=>1000,23648=>1000,23649=>1000,23650=>1000,23651=>1000,23652=>1000,23653=>1000,23654=>1000,23655=>1000,23656=>1000,23657=>1000,23658=>1000,23659=>1000,23660=>1000,23661=>1000,23662=>1000,23663=>1000,23664=>1000,23665=>1000,23666=>1000,23667=>1000,23668=>1000,23669=>1000,23670=>1000,23671=>1000,23672=>1000,23673=>1000,23674=>1000,23675=>1000,23676=>1000,23677=>1000,23678=>1000,23679=>1000,23680=>1000,23681=>1000,23682=>1000,23683=>1000,23684=>1000,23685=>1000,23686=>1000,23687=>1000,23688=>1000,23689=>1000,23690=>1000,23691=>1000,23692=>1000,23693=>1000,23694=>1000,23695=>1000,23696=>1000,23697=>1000,23698=>1000,23699=>1000,23700=>1000,23701=>1000,23702=>1000,23703=>1000,23704=>1000,23705=>1000,23706=>1000,23707=>1000,23708=>1000,23709=>1000,23710=>1000,23711=>1000,23712=>1000,23713=>1000,23714=>1000,23715=>1000,23716=>1000,23717=>1000,23718=>1000,23719=>1000,23720=>1000,23721=>1000,23722=>1000,23723=>1000,23724=>1000,23725=>1000,23726=>1000,23727=>1000,23728=>1000,23729=>1000,23730=>1000,23731=>1000,23732=>1000,23733=>1000,23734=>1000,23735=>1000,23736=>1000,23737=>1000,23738=>1000,23739=>1000,23740=>1000,23741=>1000,23742=>1000,23743=>1000,23744=>1000,23745=>1000,23746=>1000,23747=>1000,23748=>1000,23749=>1000,23750=>1000,23751=>1000,23752=>1000,23753=>1000,23754=>1000,23755=>1000,23756=>1000,23757=>1000,23758=>1000,23759=>1000,23760=>1000,23761=>1000,23762=>1000,23763=>1000,23764=>1000,23765=>1000,23766=>1000,23767=>1000,23768=>1000,23769=>1000,23770=>1000,23771=>1000,23772=>1000,23773=>1000,23774=>1000,23775=>1000,23776=>1000,23777=>1000,23778=>1000,23779=>1000,23780=>1000,23781=>1000,23782=>1000,23783=>1000,23784=>1000,23785=>1000,23786=>1000,23787=>1000,23788=>1000,23789=>1000,23790=>1000,23791=>1000,23792=>1000,23793=>1000,23794=>1000,23795=>1000,23796=>1000,23797=>1000,23798=>1000,23799=>1000,23800=>1000,23801=>1000,23802=>1000,23803=>1000,23804=>1000,23805=>1000,23806=>1000,23807=>1000,23808=>1000,23809=>1000,23810=>1000,23811=>1000,23812=>1000,23813=>1000,23814=>1000,23815=>1000,23816=>1000,23817=>1000,23818=>1000,23819=>1000,23820=>1000,23821=>1000,23822=>1000,23823=>1000,23824=>1000,23825=>1000,23826=>1000,23827=>1000,23828=>1000,23829=>1000,23830=>1000,23831=>1000,23832=>1000,23833=>1000,23834=>1000,23835=>1000,23836=>1000,23837=>1000,23838=>1000,23839=>1000,23840=>1000,23841=>1000,23842=>1000,23843=>1000,23844=>1000,23845=>1000,23846=>1000,23847=>1000,23848=>1000,23849=>1000,23850=>1000,23851=>1000,23852=>1000,23853=>1000,23854=>1000,23855=>1000,23856=>1000,23857=>1000,23858=>1000,23859=>1000,23860=>1000,23861=>1000,23862=>1000,23863=>1000,23864=>1000,23865=>1000,23866=>1000,23867=>1000,23868=>1000,23869=>1000,23870=>1000,23871=>1000,23872=>1000,23873=>1000,23874=>1000,23875=>1000,23876=>1000,23877=>1000,23878=>1000,23879=>1000,23880=>1000,23881=>1000,23882=>1000,23883=>1000,23884=>1000,23885=>1000,23886=>1000,23887=>1000,23888=>1000,23889=>1000,23890=>1000,23891=>1000,23892=>1000,23893=>1000,23894=>1000,23895=>1000,23896=>1000,23897=>1000,23898=>1000,23899=>1000,23900=>1000,23901=>1000,23902=>1000,23903=>1000,23904=>1000,23905=>1000,23906=>1000,23907=>1000,23908=>1000,23909=>1000,23910=>1000,23911=>1000,23912=>1000,23913=>1000,23914=>1000,23915=>1000,23916=>1000,23917=>1000,23918=>1000,23919=>1000,23920=>1000,23921=>1000,23922=>1000,23923=>1000,23924=>1000,23925=>1000,23926=>1000,23927=>1000,23928=>1000,23929=>1000,23930=>1000,23931=>1000,23932=>1000,23933=>1000,23934=>1000,23935=>1000,23936=>1000,23937=>1000,23938=>1000,23939=>1000,23940=>1000,23941=>1000,23942=>1000,23943=>1000,23944=>1000,23945=>1000,23946=>1000,23947=>1000,23948=>1000,23949=>1000,23950=>1000,23951=>1000,23952=>1000,23953=>1000,23954=>1000,23955=>1000,23956=>1000,23957=>1000,23958=>1000,23959=>1000,23960=>1000,23961=>1000,23962=>1000,23963=>1000,23964=>1000,23965=>1000,23966=>1000,23967=>1000,23968=>1000,23969=>1000,23970=>1000,23971=>1000,23972=>1000,23973=>1000,23974=>1000,23975=>1000,23976=>1000,23977=>1000,23978=>1000,23979=>1000,23980=>1000,23981=>1000,23982=>1000,23983=>1000,23984=>1000,23985=>1000,23986=>1000,23987=>1000,23988=>1000,23989=>1000,23990=>1000,23991=>1000,23992=>1000,23993=>1000,23994=>1000,23995=>1000,23996=>1000,23997=>1000,23998=>1000,23999=>1000,24000=>1000,24001=>1000,24002=>1000,24003=>1000,24004=>1000,24005=>1000,24006=>1000,24007=>1000,24008=>1000,24009=>1000,24010=>1000,24011=>1000,24012=>1000,24013=>1000,24014=>1000,24015=>1000,24016=>1000,24017=>1000,24018=>1000,24019=>1000,24020=>1000,24021=>1000,24022=>1000,24023=>1000,24024=>1000,24025=>1000,24026=>1000,24027=>1000,24028=>1000,24029=>1000,24030=>1000,24031=>1000,24032=>1000,24033=>1000,24034=>1000,24035=>1000,24036=>1000,24037=>1000,24038=>1000,24039=>1000,24040=>1000,24041=>1000,24042=>1000,24043=>1000,24044=>1000,24045=>1000,24046=>1000,24047=>1000,24048=>1000,24049=>1000,24050=>1000,24051=>1000,24052=>1000,24053=>1000,24054=>1000,24055=>1000,24056=>1000,24057=>1000,24058=>1000,24059=>1000,24060=>1000,24061=>1000,24062=>1000,24063=>1000,24064=>1000,24065=>1000,24066=>1000,24067=>1000,24068=>1000,24069=>1000,24070=>1000,24071=>1000,24072=>1000,24073=>1000,24074=>1000,24075=>1000,24076=>1000,24077=>1000,24078=>1000,24079=>1000,24080=>1000,24081=>1000,24082=>1000,24083=>1000,24084=>1000,24085=>1000,24086=>1000,24087=>1000,24088=>1000,24089=>1000,24090=>1000,24091=>1000,24092=>1000,24093=>1000,24094=>1000,24095=>1000,24096=>1000,24097=>1000,24098=>1000,24099=>1000,24100=>1000,24101=>1000,24102=>1000,24103=>1000,24104=>1000,24105=>1000,24106=>1000,24107=>1000,24108=>1000,24109=>1000,24110=>1000,24111=>1000,24112=>1000,24113=>1000,24114=>1000,24115=>1000,24116=>1000,24117=>1000,24118=>1000,24119=>1000,24120=>1000,24121=>1000,24122=>1000,24123=>1000,24124=>1000,24125=>1000,24126=>1000,24127=>1000,24128=>1000,24129=>1000,24130=>1000,24131=>1000,24132=>1000,24133=>1000,24134=>1000,24135=>1000,24136=>1000,24137=>1000,24138=>1000,24139=>1000,24140=>1000,24141=>1000,24142=>1000,24143=>1000,24144=>1000,24145=>1000,24146=>1000,24147=>1000,24148=>1000,24149=>1000,24150=>1000,24151=>1000,24152=>1000,24153=>1000,24154=>1000,24155=>1000,24156=>1000,24157=>1000,24158=>1000,24159=>1000,24160=>1000,24161=>1000,24162=>1000,24163=>1000,24164=>1000,24165=>1000,24166=>1000,24167=>1000,24168=>1000,24169=>1000,24170=>1000,24171=>1000,24172=>1000,24173=>1000,24174=>1000,24175=>1000,24176=>1000,24177=>1000,24178=>1000,24179=>1000,24180=>1000,24181=>1000,24182=>1000,24183=>1000,24184=>1000,24185=>1000,24186=>1000,24187=>1000,24188=>1000,24189=>1000,24190=>1000,24191=>1000,24192=>1000,24193=>1000,24194=>1000,24195=>1000,24196=>1000,24197=>1000,24198=>1000,24199=>1000,24200=>1000,24201=>1000,24202=>1000,24203=>1000,24204=>1000,24205=>1000,24206=>1000,24207=>1000,24208=>1000,24209=>1000,24210=>1000,24211=>1000,24212=>1000,24213=>1000,24214=>1000,24215=>1000,24216=>1000,24217=>1000,24218=>1000,24219=>1000,24220=>1000,24221=>1000,24222=>1000,24223=>1000,24224=>1000,24225=>1000,24226=>1000,24227=>1000,24228=>1000,24229=>1000,24230=>1000,24231=>1000,24232=>1000,24233=>1000,24234=>1000,24235=>1000,24236=>1000,24237=>1000,24238=>1000,24239=>1000,24240=>1000,24241=>1000,24242=>1000,24243=>1000,24244=>1000,24245=>1000,24246=>1000,24247=>1000,24248=>1000,24249=>1000,24250=>1000,24251=>1000,24252=>1000,24253=>1000,24254=>1000,24255=>1000,24256=>1000,24257=>1000,24258=>1000,24259=>1000,24260=>1000,24261=>1000,24262=>1000,24263=>1000,24264=>1000,24265=>1000,24266=>1000,24267=>1000,24268=>1000,24269=>1000,24270=>1000,24271=>1000,24272=>1000,24273=>1000,24274=>1000,24275=>1000,24276=>1000,24277=>1000,24278=>1000,24279=>1000,24280=>1000,24281=>1000,24282=>1000,24283=>1000,24284=>1000,24285=>1000,24286=>1000,24287=>1000,24288=>1000,24289=>1000,24290=>1000,24291=>1000,24292=>1000,24293=>1000,24294=>1000,24295=>1000,24296=>1000,24297=>1000,24298=>1000,24299=>1000,24300=>1000,24301=>1000,24302=>1000,24303=>1000,24304=>1000,24305=>1000,24306=>1000,24307=>1000,24308=>1000,24309=>1000,24310=>1000,24311=>1000,24312=>1000,24313=>1000,24314=>1000,24315=>1000,24316=>1000,24317=>1000,24318=>1000,24319=>1000,24320=>1000,24321=>1000,24322=>1000,24323=>1000,24324=>1000,24325=>1000,24326=>1000,24327=>1000,24328=>1000,24329=>1000,24330=>1000,24331=>1000,24332=>1000,24333=>1000,24334=>1000,24335=>1000,24336=>1000,24337=>1000,24338=>1000,24339=>1000,24340=>1000,24341=>1000,24342=>1000,24343=>1000,24344=>1000,24345=>1000,24346=>1000,24347=>1000,24348=>1000,24349=>1000,24350=>1000,24351=>1000,24352=>1000,24353=>1000,24354=>1000,24355=>1000,24356=>1000,24357=>1000,24358=>1000,24359=>1000,24360=>1000,24361=>1000,24362=>1000,24363=>1000,24364=>1000,24365=>1000,24366=>1000,24367=>1000,24368=>1000,24369=>1000,24370=>1000,24371=>1000,24372=>1000,24373=>1000,24374=>1000,24375=>1000,24376=>1000,24377=>1000,24378=>1000,24379=>1000,24380=>1000,24381=>1000,24382=>1000,24383=>1000,24384=>1000,24385=>1000,24386=>1000,24387=>1000,24388=>1000,24389=>1000,24390=>1000,24391=>1000,24392=>1000,24393=>1000,24394=>1000,24395=>1000,24396=>1000,24397=>1000,24398=>1000,24399=>1000,24400=>1000,24401=>1000,24402=>1000,24403=>1000,24404=>1000,24405=>1000,24406=>1000,24407=>1000,24408=>1000,24409=>1000,24410=>1000,24411=>1000,24412=>1000,24413=>1000,24414=>1000,24415=>1000,24416=>1000,24417=>1000,24418=>1000,24419=>1000,24420=>1000,24421=>1000,24422=>1000,24423=>1000,24424=>1000,24425=>1000,24426=>1000,24427=>1000,24428=>1000,24429=>1000,24430=>1000,24431=>1000,24432=>1000,24433=>1000,24434=>1000,24435=>1000,24436=>1000,24437=>1000,24438=>1000,24439=>1000,24440=>1000,24441=>1000,24442=>1000,24443=>1000,24444=>1000,24445=>1000,24446=>1000,24447=>1000,24448=>1000,24449=>1000,24450=>1000,24451=>1000,24452=>1000,24453=>1000,24454=>1000,24455=>1000,24456=>1000,24457=>1000,24458=>1000,24459=>1000,24460=>1000,24461=>1000,24462=>1000,24463=>1000,24464=>1000,24465=>1000,24466=>1000,24467=>1000,24468=>1000,24469=>1000,24470=>1000,24471=>1000,24472=>1000,24473=>1000,24474=>1000,24475=>1000,24476=>1000,24477=>1000,24478=>1000,24479=>1000,24480=>1000,24481=>1000,24482=>1000,24483=>1000,24484=>1000,24485=>1000,24486=>1000,24487=>1000,24488=>1000,24489=>1000,24490=>1000,24491=>1000,24492=>1000,24493=>1000,24494=>1000,24495=>1000,24496=>1000,24497=>1000,24498=>1000,24499=>1000,24500=>1000,24501=>1000,24502=>1000,24503=>1000,24504=>1000,24505=>1000,24506=>1000,24507=>1000,24508=>1000,24509=>1000,24510=>1000,24511=>1000,24512=>1000,24513=>1000,24514=>1000,24515=>1000,24516=>1000,24517=>1000,24518=>1000,24519=>1000,24520=>1000,24521=>1000,24522=>1000,24523=>1000,24524=>1000,24525=>1000,24526=>1000,24527=>1000,24528=>1000,24529=>1000,24530=>1000,24531=>1000,24532=>1000,24533=>1000,24534=>1000,24535=>1000,24536=>1000,24537=>1000,24538=>1000,24539=>1000,24540=>1000,24541=>1000,24542=>1000,24543=>1000,24544=>1000,24545=>1000,24546=>1000,24547=>1000,24548=>1000,24549=>1000,24550=>1000,24551=>1000,24552=>1000,24553=>1000,24554=>1000,24555=>1000,24556=>1000,24557=>1000,24558=>1000,24559=>1000,24560=>1000,24561=>1000,24562=>1000,24563=>1000,24564=>1000,24565=>1000,24566=>1000,24567=>1000,24568=>1000,24569=>1000,24570=>1000,24571=>1000,24572=>1000,24573=>1000,24574=>1000,24575=>1000,24576=>1000,24577=>1000,24578=>1000,24579=>1000,24580=>1000,24581=>1000,24582=>1000,24583=>1000,24584=>1000,24585=>1000,24586=>1000,24587=>1000,24588=>1000,24589=>1000,24590=>1000,24591=>1000,24592=>1000,24593=>1000,24594=>1000,24595=>1000,24596=>1000,24597=>1000,24598=>1000,24599=>1000,24600=>1000,24601=>1000,24602=>1000,24603=>1000,24604=>1000,24605=>1000,24606=>1000,24607=>1000,24608=>1000,24609=>1000,24610=>1000,24611=>1000,24612=>1000,24613=>1000,24614=>1000,24615=>1000,24616=>1000,24617=>1000,24618=>1000,24619=>1000,24620=>1000,24621=>1000,24622=>1000,24623=>1000,24624=>1000,24625=>1000,24626=>1000,24627=>1000,24628=>1000,24629=>1000,24630=>1000,24631=>1000,24632=>1000,24633=>1000,24634=>1000,24635=>1000,24636=>1000,24637=>1000,24638=>1000,24639=>1000,24640=>1000,24641=>1000,24642=>1000,24643=>1000,24644=>1000,24645=>1000,24646=>1000,24647=>1000,24648=>1000,24649=>1000,24650=>1000,24651=>1000,24652=>1000,24653=>1000,24654=>1000,24655=>1000,24656=>1000,24657=>1000,24658=>1000,24659=>1000,24660=>1000,24661=>1000,24662=>1000,24663=>1000,24664=>1000,24665=>1000,24666=>1000,24667=>1000,24668=>1000,24669=>1000,24670=>1000,24671=>1000,24672=>1000,24673=>1000,24674=>1000,24675=>1000,24676=>1000,24677=>1000,24678=>1000,24679=>1000,24680=>1000,24681=>1000,24682=>1000,24683=>1000,24684=>1000,24685=>1000,24686=>1000,24687=>1000,24688=>1000,24689=>1000,24690=>1000,24691=>1000,24692=>1000,24693=>1000,24694=>1000,24695=>1000,24696=>1000,24697=>1000,24698=>1000,24699=>1000,24700=>1000,24701=>1000,24702=>1000,24703=>1000,24704=>1000,24705=>1000,24706=>1000,24707=>1000,24708=>1000,24709=>1000,24710=>1000,24711=>1000,24712=>1000,24713=>1000,24714=>1000,24715=>1000,24716=>1000,24717=>1000,24718=>1000,24719=>1000,24720=>1000,24721=>1000,24722=>1000,24723=>1000,24724=>1000,24725=>1000,24726=>1000,24727=>1000,24728=>1000,24729=>1000,24730=>1000,24731=>1000,24732=>1000,24733=>1000,24734=>1000,24735=>1000,24736=>1000,24737=>1000,24738=>1000,24739=>1000,24740=>1000,24741=>1000,24742=>1000,24743=>1000,24744=>1000,24745=>1000,24746=>1000,24747=>1000,24748=>1000,24749=>1000,24750=>1000,24751=>1000,24752=>1000,24753=>1000,24754=>1000,24755=>1000,24756=>1000,24757=>1000,24758=>1000,24759=>1000,24760=>1000,24761=>1000,24762=>1000,24763=>1000,24764=>1000,24765=>1000,24766=>1000,24767=>1000,24768=>1000,24769=>1000,24770=>1000,24771=>1000,24772=>1000,24773=>1000,24774=>1000,24775=>1000,24776=>1000,24777=>1000,24778=>1000,24779=>1000,24780=>1000,24781=>1000,24782=>1000,24783=>1000,24784=>1000,24785=>1000,24786=>1000,24787=>1000,24788=>1000,24789=>1000,24790=>1000,24791=>1000,24792=>1000,24793=>1000,24794=>1000,24795=>1000,24796=>1000,24797=>1000,24798=>1000,24799=>1000,24800=>1000,24801=>1000,24802=>1000,24803=>1000,24804=>1000,24805=>1000,24806=>1000,24807=>1000,24808=>1000,24809=>1000,24810=>1000,24811=>1000,24812=>1000,24813=>1000,24814=>1000,24815=>1000,24816=>1000,24817=>1000,24818=>1000,24819=>1000,24820=>1000,24821=>1000,24822=>1000,24823=>1000,24824=>1000,24825=>1000,24826=>1000,24827=>1000,24828=>1000,24829=>1000,24830=>1000,24831=>1000,24832=>1000,24833=>1000,24834=>1000,24835=>1000,24836=>1000,24837=>1000,24838=>1000,24839=>1000,24840=>1000,24841=>1000,24842=>1000,24843=>1000,24844=>1000,24845=>1000,24846=>1000,24847=>1000,24848=>1000,24849=>1000,24850=>1000,24851=>1000,24852=>1000,24853=>1000,24854=>1000,24855=>1000,24856=>1000,24857=>1000,24858=>1000,24859=>1000,24860=>1000,24861=>1000,24862=>1000,24863=>1000,24864=>1000,24865=>1000,24866=>1000,24867=>1000,24868=>1000,24869=>1000,24870=>1000,24871=>1000,24872=>1000,24873=>1000,24874=>1000,24875=>1000,24876=>1000,24877=>1000,24878=>1000,24879=>1000,24880=>1000,24881=>1000,24882=>1000,24883=>1000,24884=>1000,24885=>1000,24886=>1000,24887=>1000,24888=>1000,24889=>1000,24890=>1000,24891=>1000,24892=>1000,24893=>1000,24894=>1000,24895=>1000,24896=>1000,24897=>1000,24898=>1000,24899=>1000,24900=>1000,24901=>1000,24902=>1000,24903=>1000,24904=>1000,24905=>1000,24906=>1000,24907=>1000,24908=>1000,24909=>1000,24910=>1000,24911=>1000,24912=>1000,24913=>1000,24914=>1000,24915=>1000,24916=>1000,24917=>1000,24918=>1000,24919=>1000,24920=>1000,24921=>1000,24922=>1000,24923=>1000,24924=>1000,24925=>1000,24926=>1000,24927=>1000,24928=>1000,24929=>1000,24930=>1000,24931=>1000,24932=>1000,24933=>1000,24934=>1000,24935=>1000,24936=>1000,24937=>1000,24938=>1000,24939=>1000,24940=>1000,24941=>1000,24942=>1000,24943=>1000,24944=>1000,24945=>1000,24946=>1000,24947=>1000,24948=>1000,24949=>1000,24950=>1000,24951=>1000,24952=>1000,24953=>1000,24954=>1000,24955=>1000,24956=>1000,24957=>1000,24958=>1000,24959=>1000,24960=>1000,24961=>1001,24962=>1000,24963=>1000,24964=>1000,24965=>1000,24966=>1000,24967=>1000,24968=>1000,24969=>1000,24970=>1000,24971=>1000,24972=>1000,24973=>1000,24974=>1000,24975=>1000,24976=>1000,24977=>1000,24978=>1000,24979=>1000,24980=>1000,24981=>1000,24982=>1000,24983=>1000,24984=>1000,24985=>1000,24986=>1000,24987=>1000,24988=>1000,24989=>1000,24990=>1000,24991=>1000,24992=>1000,24993=>1000,24994=>1000,24995=>1000,24996=>1000,24997=>1000,24998=>1000,24999=>1000,25000=>1000,25001=>1000,25002=>1000,25003=>1000,25004=>1000,25005=>1000,25006=>1000,25007=>1000,25008=>1000,25009=>1000,25010=>1000,25011=>1000,25012=>1000,25013=>1000,25014=>1000,25015=>1000,25016=>1000,25017=>1000,25018=>1000,25019=>1000,25020=>1000,25021=>1000,25022=>1000,25023=>1000,25024=>1000,25025=>1000,25026=>1000,25027=>1000,25028=>1000,25029=>1000,25030=>1000,25031=>1000,25032=>1000,25033=>1000,25034=>1000,25035=>1000,25036=>1000,25037=>1000,25038=>1000,25039=>1000,25040=>1000,25041=>1000,25042=>1000,25043=>1000,25044=>1000,25045=>1000,25046=>1000,25047=>1000,25048=>1000,25049=>1000,25050=>1000,25051=>1000,25052=>1000,25053=>1000,25054=>1000,25055=>1000,25056=>1000,25057=>1000,25058=>1000,25059=>1000,25060=>1000,25061=>1000,25062=>1000,25063=>1000,25064=>1000,25065=>1000,25066=>1000,25067=>1000,25068=>1000,25069=>1000,25070=>1000,25071=>1000,25072=>1000,25073=>1000,25074=>1000,25075=>1000,25076=>1000,25077=>1000,25078=>1000,25079=>1000,25080=>1000,25081=>1000,25082=>1000,25083=>1000,25084=>1000,25085=>1000,25086=>1000,25087=>1000,25088=>1000,25089=>1000,25090=>1000,25091=>1000,25092=>1000,25093=>1000,25094=>1000,25095=>1000,25096=>1000,25097=>1000,25098=>1000,25099=>1000,25100=>1000,25101=>1000,25102=>1000,25103=>1000,25104=>1000,25105=>1000,25106=>1000,25107=>1000,25108=>1000,25109=>1000,25110=>1000,25111=>1000,25112=>1000,25113=>1000,25114=>1000,25115=>1000,25116=>1000,25117=>1000,25118=>1000,25119=>1000,25120=>1000,25121=>1000,25122=>1000,25123=>1000,25124=>1000,25125=>1000,25126=>1000,25127=>1000,25128=>1000,25129=>1000,25130=>1000,25131=>1000,25132=>1000,25133=>1000,25134=>1000,25135=>1000,25136=>1000,25137=>1000,25138=>1000,25139=>1000,25140=>1000,25141=>1000,25142=>1000,25143=>1000,25144=>1000,25145=>1000,25146=>1000,25147=>1000,25148=>1000,25149=>1000,25150=>1000,25151=>1000,25152=>1000,25153=>1000,25154=>1000,25155=>1000,25156=>1000,25157=>1000,25158=>1000,25159=>1000,25160=>1000,25161=>1000,25162=>1000,25163=>1000,25164=>1000,25165=>1000,25166=>1000,25167=>1000,25168=>1000,25169=>1000,25170=>1000,25171=>1000,25172=>1000,25173=>1000,25174=>1000,25175=>1000,25176=>1000,25177=>1000,25178=>1000,25179=>1000,25180=>1000,25181=>1000,25182=>1000,25183=>1000,25184=>1000,25185=>1000,25186=>1000,25187=>1000,25188=>1000,25189=>1000,25190=>1000,25191=>1000,25192=>1000,25193=>1000,25194=>1000,25195=>1000,25196=>1000,25197=>1000,25198=>1000,25199=>1000,25200=>1000,25201=>1000,25202=>1000,25203=>1000,25204=>1000,25205=>1000,25206=>1000,25207=>1000,25208=>1000,25209=>1000,25210=>1000,25211=>1000,25212=>1000,25213=>1000,25214=>1000,25215=>1000,25216=>1000,25217=>1000,25218=>1000,25219=>1000,25220=>1000,25221=>1000,25222=>1000,25223=>1000,25224=>1000,25225=>1000,25226=>1000,25227=>1000,25228=>1000,25229=>1000,25230=>1000,25231=>1000,25232=>1000,25233=>1000,25234=>1000,25235=>1000,25236=>1000,25237=>1000,25238=>1000,25239=>1000,25240=>1000,25241=>1000,25242=>1000,25243=>1000,25244=>1000,25245=>1000,25246=>1000,25247=>1000,25248=>1000,25249=>1000,25250=>1000,25251=>1000,25252=>1000,25253=>1000,25254=>1000,25255=>1000,25256=>1000,25257=>1000,25258=>1000,25259=>1000,25260=>1000,25261=>1000,25262=>1000,25263=>1000,25264=>1000,25265=>1000,25266=>1000,25267=>1000,25268=>1000,25269=>1000,25270=>1000,25271=>1000,25272=>1000,25273=>1000,25274=>1000,25275=>1000,25276=>1000,25277=>1000,25278=>1000,25279=>1000,25280=>1000,25281=>1000,25282=>1000,25283=>1000,25284=>1000,25285=>1000,25286=>1000,25287=>1000,25288=>1000,25289=>1000,25290=>1000,25291=>1000,25292=>1000,25293=>1000,25294=>1000,25295=>1000,25296=>1000,25297=>1000,25298=>1000,25299=>1000,25300=>1000,25301=>1000,25302=>1000,25303=>1000,25304=>1000,25305=>1000,25306=>1000,25307=>1000,25308=>1000,25309=>1000,25310=>1000,25311=>1000,25312=>1000,25313=>1000,25314=>1000,25315=>1000,25316=>1000,25317=>1000,25318=>1000,25319=>1000,25320=>1000,25321=>1000,25322=>1000,25323=>1000,25324=>1000,25325=>1000,25326=>1000,25327=>1000,25328=>1000,25329=>1000,25330=>1000,25331=>1000,25332=>1000,25333=>1000,25334=>1000,25335=>1000,25336=>1000,25337=>1000,25338=>1000,25339=>1000,25340=>1000,25341=>1000,25342=>1000,25343=>1000,25344=>1000,25345=>1000,25346=>1000,25347=>1000,25348=>1000,25349=>1000,25350=>1000,25351=>1000,25352=>1000,25353=>1000,25354=>1000,25355=>1000,25356=>1000,25357=>1000,25358=>1000,25359=>1000,25360=>1000,25361=>1000,25362=>1000,25363=>1000,25364=>1000,25365=>1000,25366=>1000,25367=>1000,25368=>1000,25369=>1000,25370=>1000,25371=>1000,25372=>1000,25373=>1000,25374=>1000,25375=>1000,25376=>1000,25377=>1000,25378=>1000,25379=>1000,25380=>1000,25381=>1000,25382=>1000,25383=>1000,25384=>1000,25385=>1000,25386=>1000,25387=>1000,25388=>1000,25389=>1000,25390=>1000,25391=>1000,25392=>1000,25393=>1000,25394=>1000,25395=>1000,25396=>1000,25397=>1000,25398=>1000,25399=>1000,25400=>1000,25401=>1000,25402=>1000,25403=>1000,25404=>1000,25405=>1000,25406=>1000,25407=>1000,25408=>1000,25409=>1000,25410=>1000,25411=>1000,25412=>1000,25413=>1000,25414=>1000,25415=>1000,25416=>1000,25417=>1000,25418=>1000,25419=>1000,25420=>1000,25421=>1000,25422=>1000,25423=>1000,25424=>1000,25425=>1000,25426=>1000,25427=>1000,25428=>1000,25429=>1000,25430=>1000,25431=>1000,25432=>1000,25433=>1000,25434=>1000,25435=>1000,25436=>1000,25437=>1000,25438=>1000,25439=>1000,25440=>1000,25441=>1000,25442=>1000,25443=>1000,25444=>1000,25445=>1000,25446=>1000,25447=>1000,25448=>1000,25449=>1000,25450=>1000,25451=>1000,25452=>1000,25453=>1000,25454=>1000,25455=>1000,25456=>1000,25457=>1000,25458=>1000,25459=>1000,25460=>1000,25461=>1000,25462=>1000,25463=>1000,25464=>1000,25465=>1000,25466=>1000,25467=>1000,25468=>1000,25469=>1000,25470=>1000,25471=>1000,25472=>1000,25473=>1000,25474=>1000,25475=>1000,25476=>1000,25477=>1000,25478=>1000,25479=>1000,25480=>1000,25481=>1000,25482=>1000,25483=>1000,25484=>1000,25485=>1000,25486=>1000,25487=>1000,25488=>1000,25489=>1000,25490=>1000,25491=>1000,25492=>1000,25493=>1000,25494=>1000,25495=>1000,25496=>1000,25497=>1000,25498=>1000,25499=>1000,25500=>1000,25501=>1000,25502=>1000,25503=>1000,25504=>1000,25505=>1000,25506=>1000,25507=>1000,25508=>1000,25509=>1000,25510=>1000,25511=>1000,25512=>1000,25513=>1000,25514=>1000,25515=>1000,25516=>1000,25517=>1000,25518=>1000,25519=>1000,25520=>1000,25521=>1000,25522=>1000,25523=>1000,25524=>1000,25525=>1000,25526=>1000,25527=>1000,25528=>1000,25529=>1000,25530=>1000,25531=>1000,25532=>1000,25533=>1000,25534=>1000,25535=>1000,25536=>1000,25537=>1000,25538=>1000,25539=>1000,25540=>1000,25541=>1000,25542=>1000,25543=>1000,25544=>1000,25545=>1000,25546=>1000,25547=>1000,25548=>1000,25549=>1000,25550=>1000,25551=>1000,25552=>1000,25553=>1000,25554=>1000,25555=>1000,25556=>1000,25557=>1000,25558=>1000,25559=>1000,25560=>1000,25561=>1000,25562=>1000,25563=>1000,25564=>1000,25565=>1000,25566=>1000,25567=>1000,25568=>1000,25569=>1000,25570=>1000,25571=>1000,25572=>1000,25573=>1000,25574=>1000,25575=>1000,25576=>1000,25577=>1000,25578=>1000,25579=>1000,25580=>1000,25581=>1000,25582=>1000,25583=>1000,25584=>1000,25585=>1000,25586=>1000,25587=>1000,25588=>1000,25589=>1000,25590=>1000,25591=>1000,25592=>1000,25593=>1000,25594=>1000,25595=>1000,25596=>1000,25597=>1000,25598=>1000,25599=>1000,25600=>1000,25601=>1000,25602=>1000,25603=>1000,25604=>1000,25605=>1000,25606=>1000,25607=>1000,25608=>1000,25609=>1000,25610=>1000,25611=>1000,25612=>1000,25613=>1000,25614=>1000,25615=>1000,25616=>1000,25617=>1000,25618=>1000,25619=>1000,25620=>1000,25621=>1000,25622=>1000,25623=>1000,25624=>1000,25625=>1000,25626=>1000,25627=>1000,25628=>1000,25629=>1000,25630=>1000,25631=>1000,25632=>1000,25633=>1000,25634=>1000,25635=>1000,25636=>1000,25637=>1000,25638=>1000,25639=>1000,25640=>1000,25641=>1000,25642=>1000,25643=>1000,25644=>1000,25645=>1000,25646=>1000,25647=>1000,25648=>1000,25649=>1000,25650=>1000,25651=>1000,25652=>1000,25653=>1000,25654=>1000,25655=>1000,25656=>1000,25657=>1000,25658=>1000,25659=>1000,25660=>1000,25661=>1000,25662=>1000,25663=>1000,25664=>1000,25665=>1000,25666=>1000,25667=>1000,25668=>1000,25669=>1000,25670=>1000,25671=>1000,25672=>1000,25673=>1000,25674=>1000,25675=>1000,25676=>1000,25677=>1000,25678=>1000,25679=>1000,25680=>1000,25681=>1000,25682=>1000,25683=>1000,25684=>1000,25685=>1000,25686=>1000,25687=>1000,25688=>1000,25689=>1000,25690=>1000,25691=>1000,25692=>1000,25693=>1000,25694=>1000,25695=>1000,25696=>1000,25697=>1000,25698=>1000,25699=>1000,25700=>1000,25701=>1000,25702=>1000,25703=>1000,25704=>1000,25705=>1000,25706=>1000,25707=>1000,25708=>1000,25709=>1000,25710=>1000,25711=>1000,25712=>1000,25713=>1000,25714=>1000,25715=>1000,25716=>1000,25717=>1000,25718=>1000,25719=>1000,25720=>1000,25721=>1000,25722=>1000,25723=>1000,25724=>1000,25725=>1000,25726=>1000,25727=>1000,25728=>1000,25729=>1000,25730=>1000,25731=>1000,25732=>1000,25733=>1000,25734=>1000,25735=>1000,25736=>1000,25737=>1000,25738=>1000,25739=>1000,25740=>1000,25741=>1000,25742=>1000,25743=>1000,25744=>1000,25745=>1000,25746=>1000,25747=>1000,25748=>1000,25749=>1000,25750=>1000,25751=>1000,25752=>1000,25753=>1000,25754=>1000,25755=>1000,25756=>1000,25757=>1000,25758=>1000,25759=>1000,25760=>1000,25761=>1000,25762=>1000,25763=>1000,25764=>1000,25765=>1000,25766=>1000,25767=>1000,25768=>1000,25769=>1000,25770=>1000,25771=>1000,25772=>1000,25773=>1000,25774=>1000,25775=>1000,25776=>1000,25777=>1000,25778=>1000,25779=>1000,25780=>1000,25781=>1000,25782=>1000,25783=>1000,25784=>1000,25785=>1000,25786=>1000,25787=>1000,25788=>1000,25789=>1000,25790=>1000,25791=>1000,25792=>1000,25793=>1000,25794=>1000,25795=>1000,25796=>1000,25797=>1000,25798=>1000,25799=>1000,25800=>1000,25801=>1000,25802=>1000,25803=>1000,25804=>1000,25805=>1000,25806=>1000,25807=>1000,25808=>1000,25809=>1000,25810=>1000,25811=>1000,25812=>1000,25813=>1000,25814=>1000,25815=>1000,25816=>1000,25817=>1000,25818=>1000,25819=>1000,25820=>1000,25821=>1000,25822=>1000,25823=>1000,25824=>1000,25825=>1000,25826=>1000,25827=>1000,25828=>1000,25829=>1000,25830=>1000,25831=>1000,25832=>1000,25833=>1000,25834=>1000,25835=>1000,25836=>1000,25837=>1000,25838=>1000,25839=>1000,25840=>1000,25841=>1000,25842=>1000,25843=>1000,25844=>1000,25845=>1000,25846=>1000,25847=>1000,25848=>1000,25849=>1000,25850=>1000,25851=>1000,25852=>1000,25853=>1000,25854=>1000,25855=>1000,25856=>1000,25857=>1000,25858=>1000,25859=>1000,25860=>1000,25861=>1000,25862=>1000,25863=>1000,25864=>1000,25865=>1000,25866=>1000,25867=>1000,25868=>1000,25869=>1000,25870=>1000,25871=>1000,25872=>1000,25873=>1000,25874=>1000,25875=>1000,25876=>1000,25877=>1000,25878=>1000,25879=>1000,25880=>1000,25881=>1000,25882=>1000,25883=>1000,25884=>1000,25885=>1000,25886=>1000,25887=>1000,25888=>1000,25889=>1000,25890=>1000,25891=>1000,25892=>1000,25893=>1000,25894=>1000,25895=>1000,25896=>1000,25897=>1000,25898=>1000,25899=>1000,25900=>1000,25901=>1000,25902=>1000,25903=>1000,25904=>1000,25905=>1000,25906=>1000,25907=>1000,25908=>1000,25909=>1000,25910=>1000,25911=>1000,25912=>1000,25913=>1000,25914=>1000,25915=>1000,25916=>1000,25917=>1000,25918=>1000,25919=>1000,25920=>1000,25921=>1000,25922=>1000,25923=>1000,25924=>1000,25925=>1000,25926=>1000,25927=>1000,25928=>1000,25929=>1000,25930=>1000,25931=>1000,25932=>1000,25933=>1000,25934=>1000,25935=>1000,25936=>1000,25937=>1000,25938=>1000,25939=>1000,25940=>1000,25941=>1000,25942=>1000,25943=>1000,25944=>1000,25945=>1000,25946=>1000,25947=>1000,25948=>1000,25949=>1000,25950=>1000,25951=>1000,25952=>1000,25953=>1000,25954=>1000,25955=>1000,25956=>1000,25957=>1000,25958=>1000,25959=>1000,25960=>1000,25961=>1000,25962=>1000,25963=>1000,25964=>1000,25965=>1000,25966=>1000,25967=>1000,25968=>1000,25969=>1000,25970=>1000,25971=>1000,25972=>1000,25973=>1000,25974=>1000,25975=>1000,25976=>1000,25977=>1000,25978=>1000,25979=>1000,25980=>1000,25981=>1000,25982=>1000,25983=>1000,25984=>1000,25985=>1000,25986=>1000,25987=>1000,25988=>1000,25989=>1000,25990=>1000,25991=>1000,25992=>1000,25993=>1000,25994=>1000,25995=>1000,25996=>1000,25997=>1000,25998=>1000,25999=>1000,26000=>1000,26001=>1000,26002=>1000,26003=>1000,26004=>1000,26005=>1000,26006=>1000,26007=>1000,26008=>1000,26009=>1000,26010=>1000,26011=>1000,26012=>1000,26013=>1000,26014=>1000,26015=>1000,26016=>1000,26017=>1000,26018=>1000,26019=>1000,26020=>1000,26021=>1000,26022=>1000,26023=>1000,26024=>1000,26025=>1000,26026=>1000,26027=>1000,26028=>1000,26029=>1000,26030=>1000,26031=>1000,26032=>1000,26033=>1000,26034=>1000,26035=>1000,26036=>1000,26037=>1000,26038=>1000,26039=>1000,26040=>1000,26041=>1000,26042=>1000,26043=>1000,26044=>1000,26045=>1000,26046=>1000,26047=>1000,26048=>1000,26049=>1000,26050=>1000,26051=>1000,26052=>1000,26053=>1000,26054=>1000,26055=>1000,26056=>1000,26057=>1000,26058=>1000,26059=>1000,26060=>1000,26061=>1000,26062=>1000,26063=>1000,26064=>1000,26065=>1000,26066=>1000,26067=>1000,26068=>1000,26069=>1000,26070=>1000,26071=>1000,26072=>1000,26073=>1000,26074=>1000,26075=>1000,26076=>1000,26077=>1000,26078=>1000,26079=>1000,26080=>1000,26081=>1000,26082=>1000,26083=>1000,26084=>1000,26085=>1000,26086=>1000,26087=>1000,26088=>1000,26089=>1000,26090=>1000,26091=>1000,26092=>1000,26093=>1000,26094=>1000,26095=>1000,26096=>1000,26097=>1000,26098=>1000,26099=>1000,26100=>1000,26101=>1000,26102=>1000,26103=>1000,26104=>1000,26105=>1000,26106=>1000,26107=>1000,26108=>1000,26109=>1000,26110=>1000,26111=>1000,26112=>1000,26113=>1000,26114=>1000,26115=>1000,26116=>1000,26117=>1000,26118=>1000,26119=>1000,26120=>1000,26121=>1000,26122=>1000,26123=>1000,26124=>1000,26125=>1000,26126=>1000,26127=>1000,26128=>1000,26129=>1000,26130=>1000,26131=>1000,26132=>1000,26133=>1000,26134=>1000,26135=>1000,26136=>1000,26137=>1000,26138=>1000,26139=>1000,26140=>1000,26141=>1000,26142=>1000,26143=>1000,26144=>1000,26145=>1000,26146=>1000,26147=>1000,26148=>1000,26149=>1000,26150=>1000,26151=>1000,26152=>1000,26153=>1000,26154=>1000,26155=>1000,26156=>1000,26157=>1000,26158=>1000,26159=>1000,26160=>1000,26161=>1000,26162=>1000,26163=>1000,26164=>1000,26165=>1000,26166=>1000,26167=>1000,26168=>1000,26169=>1000,26170=>1000,26171=>1000,26172=>1000,26173=>1000,26174=>1000,26175=>1000,26176=>1000,26177=>1000,26178=>1000,26179=>1000,26180=>1000,26181=>1000,26182=>1000,26183=>1000,26184=>1000,26185=>1000,26186=>1000,26187=>1000,26188=>1000,26189=>1000,26190=>1000,26191=>1000,26192=>1000,26193=>1000,26194=>1000,26195=>1000,26196=>1000,26197=>1000,26198=>1000,26199=>1000,26200=>1000,26201=>1000,26202=>1000,26203=>1000,26204=>1000,26205=>1000,26206=>1000,26207=>1000,26208=>1000,26209=>1000,26210=>1000,26211=>1000,26212=>1000,26213=>1000,26214=>1000,26215=>1000,26216=>1000,26217=>1000,26218=>1000,26219=>1000,26220=>1000,26221=>1000,26222=>1000,26223=>1000,26224=>1000,26225=>1000,26226=>1000,26227=>1000,26228=>1000,26229=>1000,26230=>1000,26231=>1000,26232=>1000,26233=>1000,26234=>1000,26235=>1000,26236=>1000,26237=>1000,26238=>1000,26239=>1000,26240=>1000,26241=>1000,26242=>1000,26243=>1000,26244=>1000,26245=>1000,26246=>1000,26247=>1000,26248=>1000,26249=>1000,26250=>1000,26251=>1000,26252=>1000,26253=>1000,26254=>1000,26255=>1000,26256=>1000,26257=>1000,26258=>1000,26259=>1000,26260=>1000,26261=>1000,26262=>1000,26263=>1000,26264=>1000,26265=>1000,26266=>1000,26267=>1000,26268=>1000,26269=>1000,26270=>1000,26271=>1000,26272=>1000,26273=>1000,26274=>1000,26275=>1000,26276=>1000,26277=>1000,26278=>1000,26279=>1000,26280=>1000,26281=>1000,26282=>1000,26283=>1000,26284=>1000,26285=>1000,26286=>1000,26287=>1000,26288=>1000,26289=>1000,26290=>1000,26291=>1000,26292=>1000,26293=>1000,26294=>1000,26295=>1000,26296=>1000,26297=>1000,26298=>1000,26299=>1000,26300=>1000,26301=>1000,26302=>1000,26303=>1000,26304=>1000,26305=>1000,26306=>1000,26307=>1000,26308=>1000,26309=>1000,26310=>1000,26311=>1000,26312=>1000,26313=>1000,26314=>1000,26315=>1000,26316=>1000,26317=>1000,26318=>1000,26319=>1000,26320=>1000,26321=>1000,26322=>1000,26323=>1000,26324=>1000,26325=>1000,26326=>1000,26327=>1000,26328=>1000,26329=>1000,26330=>1000,26331=>1000,26332=>1000,26333=>1000,26334=>1000,26335=>1000,26336=>1000,26337=>1000,26338=>1000,26339=>1000,26340=>1000,26341=>1000,26342=>1000,26343=>1000,26344=>1000,26345=>1000,26346=>1000,26347=>1000,26348=>1000,26349=>1000,26350=>1000,26351=>1000,26352=>1000,26353=>1000,26354=>1000,26355=>1000,26356=>1000,26357=>1000,26358=>1000,26359=>1000,26360=>1000,26361=>1000,26362=>1000,26363=>1000,26364=>1000,26365=>1000,26366=>1000,26367=>1000,26368=>1000,26369=>1000,26370=>1000,26371=>1000,26372=>1000,26373=>1000,26374=>1000,26375=>1000,26376=>1000,26377=>1000,26378=>1000,26379=>1000,26380=>1000,26381=>1000,26382=>1000,26383=>1000,26384=>1000,26385=>1000,26386=>1000,26387=>1000,26388=>1000,26389=>1000,26390=>1000,26391=>1000,26392=>1000,26393=>1000,26394=>1000,26395=>1000,26396=>1000,26397=>1000,26398=>1000,26399=>1000,26400=>1000,26401=>1000,26402=>1000,26403=>1000,26404=>1000,26405=>1000,26406=>1000,26407=>1000,26408=>1000,26409=>1000,26410=>1000,26411=>1000,26412=>1000,26413=>1000,26414=>1000,26415=>1000,26416=>1000,26417=>1000,26418=>1000,26419=>1000,26420=>1000,26421=>1000,26422=>1000,26423=>1000,26424=>1000,26425=>1000,26426=>1000,26427=>1000,26428=>1000,26429=>1000,26430=>1000,26431=>1000,26432=>1000,26433=>1000,26434=>1000,26435=>1000,26436=>1000,26437=>1000,26438=>1000,26439=>1000,26440=>1000,26441=>1000,26442=>1000,26443=>1000,26444=>1000,26445=>1000,26446=>1000,26447=>1000,26448=>1000,26449=>1000,26450=>1000,26451=>1000,26452=>1000,26453=>1000,26454=>1000,26455=>1000,26456=>1000,26457=>1000,26458=>1000,26459=>1000,26460=>1000,26461=>1000,26462=>1000,26463=>1000,26464=>1000,26465=>1000,26466=>1000,26467=>1000,26468=>1000,26469=>1000,26470=>1000,26471=>1000,26472=>1000,26473=>1000,26474=>1000,26475=>1000,26476=>1000,26477=>1000,26478=>1000,26479=>1000,26480=>1000,26481=>1000,26482=>1000,26483=>1000,26484=>1000,26485=>1000,26486=>1000,26487=>1000,26488=>1000,26489=>1000,26490=>1000,26491=>1000,26492=>1000,26493=>1000,26494=>1000,26495=>1000,26496=>1000,26497=>1000,26498=>1000,26499=>1000,26500=>1000,26501=>1000,26502=>1000,26503=>1000,26504=>1000,26505=>1000,26506=>1000,26507=>1000,26508=>1000,26509=>1000,26510=>1000,26511=>1000,26512=>1000,26513=>1000,26514=>1000,26515=>1000,26516=>1000,26517=>1000,26518=>1000,26519=>1000,26520=>1000,26521=>1000,26522=>1000,26523=>1000,26524=>1000,26525=>1000,26526=>1000,26527=>1000,26528=>1000,26529=>1000,26530=>1000,26531=>1000,26532=>1000,26533=>1000,26534=>1000,26535=>1000,26536=>1000,26537=>1000,26538=>1000,26539=>1000,26540=>1000,26541=>1000,26542=>1000,26543=>1000,26544=>1000,26545=>1000,26546=>1000,26547=>1000,26548=>1000,26549=>1000,26550=>1000,26551=>1000,26552=>1000,26553=>1000,26554=>1000,26555=>1000,26556=>1000,26557=>1000,26558=>1000,26559=>1000,26560=>1000,26561=>1000,26562=>1000,26563=>1000,26564=>1000,26565=>1000,26566=>1000,26567=>1000,26568=>1000,26569=>1000,26570=>1000,26571=>1000,26572=>1000,26573=>1000,26574=>1000,26575=>1000,26576=>1000,26577=>1000,26578=>1000,26579=>1000,26580=>1000,26581=>1000,26582=>1000,26583=>1000,26584=>1000,26585=>1000,26586=>1000,26587=>1000,26588=>1000,26589=>1000,26590=>1000,26591=>1000,26592=>1000,26593=>1000,26594=>1000,26595=>1000,26596=>1000,26597=>1000,26598=>1000,26599=>1000,26600=>1000,26601=>1000,26602=>1000,26603=>1000,26604=>1000,26605=>1000,26606=>1000,26607=>1000,26608=>1000,26609=>1000,26610=>1000,26611=>1000,26612=>1000,26613=>1000,26614=>1000,26615=>1000,26616=>1000,26617=>1000,26618=>1000,26619=>1000,26620=>1000,26621=>1000,26622=>1000,26623=>1000,26624=>1000,26625=>1000,26626=>1000,26627=>1000,26628=>1000,26629=>1000,26630=>1000,26631=>1000,26632=>1000,26633=>1000,26634=>1000,26635=>1000,26636=>1000,26637=>1000,26638=>1000,26639=>1000,26640=>1000,26641=>1000,26642=>1000,26643=>1000,26644=>1000,26645=>1000,26646=>1000,26647=>1000,26648=>1000,26649=>1000,26650=>1000,26651=>1000,26652=>1000,26653=>1000,26654=>1000,26655=>1000,26656=>1000,26657=>1000,26658=>1000,26659=>1000,26660=>1000,26661=>1000,26662=>1000,26663=>1000,26664=>1000,26665=>1000,26666=>1000,26667=>1000,26668=>1000,26669=>1000,26670=>1000,26671=>1000,26672=>1000,26673=>1000,26674=>1000,26675=>1000,26676=>1000,26677=>1000,26678=>1000,26679=>1000,26680=>1000,26681=>1000,26682=>1000,26683=>1000,26684=>1000,26685=>1000,26686=>1000,26687=>1000,26688=>1000,26689=>1000,26690=>1000,26691=>1000,26692=>1000,26693=>1000,26694=>1000,26695=>1000,26696=>1000,26697=>1000,26698=>1000,26699=>1000,26700=>1000,26701=>1000,26702=>1000,26703=>1000,26704=>1000,26705=>1000,26706=>1000,26707=>1000,26708=>1000,26709=>1000,26710=>1000,26711=>1000,26712=>1000,26713=>1000,26714=>1000,26715=>1000,26716=>1000,26717=>1000,26718=>1000,26719=>1000,26720=>1000,26721=>1000,26722=>1000,26723=>1000,26724=>1000,26725=>1000,26726=>1000,26727=>1000,26728=>1000,26729=>1000,26730=>1000,26731=>1000,26732=>1000,26733=>1000,26734=>1000,26735=>1000,26736=>1000,26737=>1000,26738=>1000,26739=>1000,26740=>1000,26741=>1000,26742=>1000,26743=>1000,26744=>1000,26745=>1000,26746=>1000,26747=>1000,26748=>1000,26749=>1000,26750=>1000,26751=>1000,26752=>1000,26753=>1000,26754=>1000,26755=>1000,26756=>1000,26757=>1000,26758=>1000,26759=>1000,26760=>1000,26761=>1000,26762=>1000,26763=>1000,26764=>1000,26765=>1000,26766=>1000,26767=>1000,26768=>1000,26769=>1000,26770=>1000,26771=>1000,26772=>1000,26773=>1000,26774=>1000,26775=>1000,26776=>1000,26777=>1000,26778=>1000,26779=>1000,26780=>1000,26781=>1000,26782=>1000,26783=>1000,26784=>1000,26785=>1000,26786=>1000,26787=>1000,26788=>1000,26789=>1000,26790=>1000,26791=>1000,26792=>1000,26793=>1000,26794=>1000,26795=>1000,26796=>1000,26797=>1000,26798=>1000,26799=>1000,26800=>1000,26801=>1000,26802=>1000,26803=>1000,26804=>1000,26805=>1000,26806=>1000,26807=>1000,26808=>1000,26809=>1000,26810=>1000,26811=>1000,26812=>1000,26813=>1000,26814=>1000,26815=>1000,26816=>1000,26817=>1000,26818=>1000,26819=>1000,26820=>1000,26821=>1000,26822=>1000,26823=>1000,26824=>1000,26825=>1000,26826=>1000,26827=>1000,26828=>1000,26829=>1000,26830=>1000,26831=>1000,26832=>1000,26833=>1000,26834=>1000,26835=>1000,26836=>1000,26837=>1000,26838=>1000,26839=>1000,26840=>1000,26841=>1000,26842=>1000,26843=>1000,26844=>1000,26845=>1000,26846=>1000,26847=>1000,26848=>1000,26849=>1000,26850=>1000,26851=>1000,26852=>1000,26853=>1000,26854=>1000,26855=>1000,26856=>1000,26857=>1000,26858=>1000,26859=>1000,26860=>1000,26861=>1000,26862=>1000,26863=>1000,26864=>1000,26865=>1000,26866=>1000,26867=>1000,26868=>1000,26869=>1000,26870=>1000,26871=>1000,26872=>1000,26873=>1000,26874=>1000,26875=>1000,26876=>1000,26877=>1000,26878=>1000,26879=>1000,26880=>1000,26881=>1000,26882=>1000,26883=>1000,26884=>1000,26885=>1000,26886=>1000,26887=>1000,26888=>1000,26889=>1000,26890=>1000,26891=>1000,26892=>1000,26893=>1000,26894=>1000,26895=>1000,26896=>1000,26897=>1000,26898=>1000,26899=>1000,26900=>1000,26901=>1000,26902=>1000,26903=>1000,26904=>1000,26905=>1000,26906=>1000,26907=>1000,26908=>1000,26909=>1000,26910=>1000,26911=>1000,26912=>1000,26913=>1000,26914=>1000,26915=>1000,26916=>1000,26917=>1000,26918=>1000,26919=>1000,26920=>1000,26921=>1000,26922=>1000,26923=>1000,26924=>1000,26925=>1000,26926=>1000,26927=>1000,26928=>1000,26929=>1000,26930=>1000,26931=>1000,26932=>1000,26933=>1000,26934=>1000,26935=>1000,26936=>1000,26937=>1000,26938=>1000,26939=>1000,26940=>1000,26941=>1000,26942=>1000,26943=>1000,26944=>1000,26945=>1000,26946=>1000,26947=>1000,26948=>1000,26949=>1000,26950=>1000,26951=>1000,26952=>1000,26953=>1000,26954=>1000,26955=>1000,26956=>1000,26957=>1000,26958=>1000,26959=>1000,26960=>1000,26961=>1000,26962=>1000,26963=>1000,26964=>1000,26965=>1000,26966=>1000,26967=>1000,26968=>1000,26969=>1000,26970=>1000,26971=>1000,26972=>1000,26973=>1000,26974=>1000,26975=>1000,26976=>1000,26977=>1000,26978=>1000,26979=>1000,26980=>1000,26981=>1000,26982=>1000,26983=>1000,26984=>1000,26985=>1000,26986=>1000,26987=>1000,26988=>1000,26989=>1000,26990=>1000,26991=>1000,26992=>1000,26993=>1000,26994=>1000,26995=>1000,26996=>1000,26997=>1000,26998=>1000,26999=>1000,27000=>1000,27001=>1000,27002=>1000,27003=>1000,27004=>1000,27005=>1000,27006=>1000,27007=>1000,27008=>1000,27009=>1000,27010=>1000,27011=>1000,27012=>1000,27013=>1000,27014=>1000,27015=>1000,27016=>1000,27017=>1000,27018=>1000,27019=>1000,27020=>1000,27021=>1000,27022=>1000,27023=>1000,27024=>1000,27025=>1000,27026=>1000,27027=>1000,27028=>1000,27029=>1000,27030=>1000,27031=>1000,27032=>1000,27033=>1000,27034=>1000,27035=>1000,27036=>1000,27037=>1000,27038=>1000,27039=>1000,27040=>1000,27041=>1000,27042=>1000,27043=>1000,27044=>1000,27045=>1000,27046=>1000,27047=>1000,27048=>1000,27049=>1000,27050=>1000,27051=>1000,27052=>1000,27053=>1000,27054=>1000,27055=>1000,27056=>1000,27057=>1000,27058=>1000,27059=>1000,27060=>1000,27061=>1000,27062=>1000,27063=>1000,27064=>1000,27065=>1000,27066=>1000,27067=>1000,27068=>1000,27069=>1000,27070=>1000,27071=>1000,27072=>1000,27073=>1000,27074=>1000,27075=>1000,27076=>1000,27077=>1000,27078=>1000,27079=>1000,27080=>1000,27081=>1000,27082=>1000,27083=>1000,27084=>1000,27085=>1000,27086=>1000,27087=>1000,27088=>1000,27089=>1000,27090=>1000,27091=>1000,27092=>1000,27093=>1000,27094=>1000,27095=>1000,27096=>1000,27097=>1000,27098=>1000,27099=>1000,27100=>1000,27101=>1000,27102=>1000,27103=>1000,27104=>1000,27105=>1000,27106=>1000,27107=>1000,27108=>1000,27109=>1000,27110=>1000,27111=>1000,27112=>1000,27113=>1000,27114=>1000,27115=>1000,27116=>1000,27117=>1000,27118=>1000,27119=>1000,27120=>1000,27121=>1000,27122=>1000,27123=>1000,27124=>1000,27125=>1000,27126=>1000,27127=>1000,27128=>1000,27129=>1000,27130=>1000,27131=>1000,27132=>1000,27133=>1000,27134=>1000,27135=>1000,27136=>1000,27137=>1000,27138=>1000,27139=>1000,27140=>1000,27141=>1000,27142=>1000,27143=>1000,27144=>1000,27145=>1000,27146=>1000,27147=>1000,27148=>1000,27149=>1000,27150=>1000,27151=>1000,27152=>1000,27153=>1000,27154=>1000,27155=>1000,27156=>1000,27157=>1000,27158=>1000,27159=>1000,27160=>1000,27161=>1000,27162=>1000,27163=>1000,27164=>1000,27165=>1000,27166=>1000,27167=>1000,27168=>1000,27169=>1000,27170=>1000,27171=>1000,27172=>1000,27173=>1000,27174=>1000,27175=>1000,27176=>1000,27177=>1000,27178=>1000,27179=>1000,27180=>1000,27181=>1000,27182=>1000,27183=>1000,27184=>1000,27185=>1000,27186=>1000,27187=>1000,27188=>1000,27189=>1000,27190=>1000,27191=>1000,27192=>1000,27193=>1000,27194=>1000,27195=>1000,27196=>1000,27197=>1000,27198=>1000,27199=>1000,27200=>1000,27201=>1000,27202=>1000,27203=>1000,27204=>1000,27205=>1000,27206=>1000,27207=>1000,27208=>1000,27209=>1000,27210=>1000,27211=>1000,27212=>1000,27213=>1000,27214=>1000,27215=>1000,27216=>1000,27217=>1000,27218=>1000,27219=>1000,27220=>1000,27221=>1000,27222=>1000,27223=>1000,27224=>1000,27225=>1000,27226=>1000,27227=>1000,27228=>1000,27229=>1000,27230=>1000,27231=>1000,27232=>1000,27233=>1000,27234=>1000,27235=>1000,27236=>1000,27237=>1000,27238=>1000,27239=>1000,27240=>1000,27241=>1000,27242=>1000,27243=>1000,27244=>1000,27245=>1000,27246=>1000,27247=>1000,27248=>1000,27249=>1000,27250=>1000,27251=>1000,27252=>1000,27253=>1000,27254=>1000,27255=>1000,27256=>1000,27257=>1000,27258=>1000,27259=>1000,27260=>1000,27261=>1000,27262=>1000,27263=>1000,27264=>1000,27265=>1000,27266=>1000,27267=>1000,27268=>1000,27269=>1000,27270=>1000,27271=>1000,27272=>1000,27273=>1000,27274=>1000,27275=>1000,27276=>1000,27277=>1000,27278=>1000,27279=>1000,27280=>1000,27281=>1000,27282=>1000,27283=>1000,27284=>1000,27285=>1000,27286=>1000,27287=>1000,27288=>1000,27289=>1000,27290=>1000,27291=>1000,27292=>1000,27293=>1000,27294=>1000,27295=>1000,27296=>1000,27297=>1000,27298=>1000,27299=>1000,27300=>1000,27301=>1000,27302=>1000,27303=>1000,27304=>1000,27305=>1000,27306=>1000,27307=>1000,27308=>1000,27309=>1000,27310=>1000,27311=>1000,27312=>1000,27313=>1000,27314=>1000,27315=>1000,27316=>1000,27317=>1000,27318=>1000,27319=>1000,27320=>1000,27321=>1000,27322=>1000,27323=>1000,27324=>1000,27325=>1000,27326=>1000,27327=>1000,27328=>1000,27329=>1000,27330=>1000,27331=>1000,27332=>1000,27333=>1000,27334=>1000,27335=>1000,27336=>1000,27337=>1000,27338=>1000,27339=>1000,27340=>1000,27341=>1000,27342=>1000,27343=>1000,27344=>1000,27345=>1000,27346=>1000,27347=>1000,27348=>1000,27349=>1000,27350=>1000,27351=>1000,27352=>1000,27353=>1000,27354=>1000,27355=>1000,27356=>1000,27357=>1000,27358=>1000,27359=>1000,27360=>1000,27361=>1000,27362=>1000,27363=>1000,27364=>1000,27365=>1000,27366=>1000,27367=>1000,27368=>1000,27369=>1000,27370=>1000,27371=>1000,27372=>1000,27373=>1000,27374=>1000,27375=>1000,27376=>1000,27377=>1000,27378=>1000,27379=>1000,27380=>1000,27381=>1000,27382=>1000,27383=>1000,27384=>1000,27385=>1000,27386=>1000,27387=>1000,27388=>1000,27389=>1000,27390=>1000,27391=>1000,27392=>1000,27393=>1000,27394=>1000,27395=>1000,27396=>1000,27397=>1000,27398=>1000,27399=>1000,27400=>1000,27401=>1000,27402=>1000,27403=>1000,27404=>1000,27405=>1000,27406=>1000,27407=>1000,27408=>1000,27409=>1000,27410=>1000,27411=>1000,27412=>1000,27413=>1000,27414=>1000,27415=>1000,27416=>1000,27417=>1000,27418=>1000,27419=>1000,27420=>1000,27421=>1000,27422=>1000,27423=>1000,27424=>1000,27425=>1000,27426=>1000,27427=>1000,27428=>1000,27429=>1000,27430=>1000,27431=>1000,27432=>1000,27433=>1000,27434=>1000,27435=>1000,27436=>1000,27437=>1000,27438=>1000,27439=>1000,27440=>1000,27441=>1000,27442=>1000,27443=>1000,27444=>1000,27445=>1000,27446=>1000,27447=>1000,27448=>1000,27449=>1000,27450=>1000,27451=>1000,27452=>1000,27453=>1000,27454=>1000,27455=>1000,27456=>1000,27457=>1000,27458=>1000,27459=>1000,27460=>1000,27461=>1000,27462=>1000,27463=>1000,27464=>1000,27465=>1000,27466=>1000,27467=>1000,27468=>1000,27469=>1000,27470=>1000,27471=>1000,27472=>1000,27473=>1000,27474=>1000,27475=>1000,27476=>1000,27477=>1000,27478=>1000,27479=>1000,27480=>1000,27481=>1000,27482=>1000,27483=>1000,27484=>1000,27485=>1000,27486=>1000,27487=>1000,27488=>1000,27489=>1000,27490=>1000,27491=>1000,27492=>1000,27493=>1000,27494=>1000,27495=>1000,27496=>1000,27497=>1000,27498=>1000,27499=>1000,27500=>1000,27501=>1000,27502=>1000,27503=>1000,27504=>1000,27505=>1000,27506=>1000,27507=>1000,27508=>1000,27509=>1000,27510=>1000,27511=>1000,27512=>1000,27513=>1000,27514=>1000,27515=>1000,27516=>1000,27517=>1000,27518=>1000,27519=>1000,27520=>1000,27521=>1000,27522=>1000,27523=>1000,27524=>1000,27525=>1000,27526=>1000,27527=>1000,27528=>1000,27529=>1000,27530=>1000,27531=>1000,27532=>1000,27533=>1000,27534=>1000,27535=>1000,27536=>1000,27537=>1000,27538=>1000,27539=>1000,27540=>1000,27541=>1000,27542=>1000,27543=>1000,27544=>1000,27545=>1000,27546=>1000,27547=>1000,27548=>1000,27549=>1000,27550=>1000,27551=>1000,27552=>1000,27553=>1000,27554=>1000,27555=>1000,27556=>1000,27557=>1000,27558=>1000,27559=>1000,27560=>1000,27561=>1000,27562=>1000,27563=>1000,27564=>1000,27565=>1000,27566=>1000,27567=>1000,27568=>1000,27569=>1000,27570=>1000,27571=>1000,27572=>1000,27573=>1000,27574=>1000,27575=>1000,27576=>1000,27577=>1000,27578=>1000,27579=>1000,27580=>1000,27581=>1000,27582=>1000,27583=>1000,27584=>1000,27585=>1000,27586=>1000,27587=>1000,27588=>1000,27589=>1000,27590=>1000,27591=>1000,27592=>1000,27593=>1000,27594=>1000,27595=>1000,27596=>1000,27597=>1000,27598=>1000,27599=>1000,27600=>1000,27601=>1000,27602=>1000,27603=>1000,27604=>1000,27605=>1000,27606=>1000,27607=>1000,27608=>1000,27609=>1000,27610=>1000,27611=>1000,27612=>1000,27613=>1000,27614=>1000,27615=>1000,27616=>1000,27617=>1000,27618=>1000,27619=>1000,27620=>1000,27621=>1000,27622=>1000,27623=>1000,27624=>1000,27625=>1000,27626=>1000,27627=>1000,27628=>1000,27629=>1000,27630=>1000,27631=>1000,27632=>1000,27633=>1000,27634=>1000,27635=>1000,27636=>1000,27637=>1000,27638=>1000,27639=>1000,27640=>1000,27641=>1000,27642=>1000,27643=>1000,27644=>1000,27645=>1000,27646=>1000,27647=>1000,27648=>1000,27649=>1000,27650=>1000,27651=>1000,27652=>1000,27653=>1000,27654=>1000,27655=>1000,27656=>1000,27657=>1000,27658=>1000,27659=>1000,27660=>1000,27661=>1000,27662=>1000,27663=>1000,27664=>1000,27665=>1000,27666=>1000,27667=>1000,27668=>1000,27669=>1000,27670=>1000,27671=>1000,27672=>1000,27673=>1000,27674=>1000,27675=>1000,27676=>1000,27677=>1000,27678=>1000,27679=>1000,27680=>1000,27681=>1000,27682=>1000,27683=>1000,27684=>1000,27685=>1000,27686=>1000,27687=>1000,27688=>1000,27689=>1000,27690=>1000,27691=>1000,27692=>1000,27693=>1000,27694=>1000,27695=>1000,27696=>1000,27697=>1000,27698=>1000,27699=>1000,27700=>1000,27701=>1000,27702=>1000,27703=>1000,27704=>1000,27705=>1000,27706=>1000,27707=>1000,27708=>1000,27709=>1000,27710=>1000,27711=>1000,27712=>1000,27713=>1000,27714=>1000,27715=>1000,27716=>1000,27717=>1000,27718=>1000,27719=>1000,27720=>1000,27721=>1000,27722=>1000,27723=>1000,27724=>1000,27725=>1000,27726=>1000,27727=>1000,27728=>1000,27729=>1000,27730=>1000,27731=>1000,27732=>1000,27733=>1000,27734=>1000,27735=>1000,27736=>1000,27737=>1000,27738=>1000,27739=>1000,27740=>1000,27741=>1000,27742=>1000,27743=>1000,27744=>1000,27745=>1000,27746=>1000,27747=>1000,27748=>1000,27749=>1000,27750=>1000,27751=>1000,27752=>1000,27753=>1000,27754=>1000,27755=>1000,27756=>1000,27757=>1000,27758=>1000,27759=>1000,27760=>1000,27761=>1000,27762=>1000,27763=>1000,27764=>1000,27765=>1000,27766=>1000,27767=>1000,27768=>1000,27769=>1000,27770=>1000,27771=>1000,27772=>1000,27773=>1000,27774=>1000,27775=>1000,27776=>1000,27777=>1000,27778=>1000,27779=>1000,27780=>1000,27781=>1000,27782=>1000,27783=>1000,27784=>1000,27785=>1000,27786=>1000,27787=>1000,27788=>1000,27789=>1000,27790=>1000,27791=>1000,27792=>1000,27793=>1000,27794=>1000,27795=>1000,27796=>1000,27797=>1000,27798=>1000,27799=>1000,27800=>1000,27801=>1000,27802=>1000,27803=>1000,27804=>1000,27805=>1000,27806=>1000,27807=>1000,27808=>1000,27809=>1000,27810=>1000,27811=>1000,27812=>1000,27813=>1000,27814=>1000,27815=>1000,27816=>1000,27817=>1000,27818=>1000,27819=>1000,27820=>1000,27821=>1000,27822=>1000,27823=>1000,27824=>1000,27825=>1000,27826=>1000,27827=>1000,27828=>1000,27829=>1000,27830=>1000,27831=>1000,27832=>1000,27833=>1000,27834=>1000,27835=>1000,27836=>1000,27837=>1000,27838=>1000,27839=>1000,27840=>1000,27841=>1000,27842=>1000,27843=>1000,27844=>1000,27845=>1000,27846=>1000,27847=>1000,27848=>1000,27849=>1000,27850=>1000,27851=>1000,27852=>1000,27853=>1000,27854=>1000,27855=>1000,27856=>1000,27857=>1000,27858=>1000,27859=>1000,27860=>1000,27861=>1000,27862=>1000,27863=>1000,27864=>1000,27865=>1000,27866=>1000,27867=>1000,27868=>1000,27869=>1000,27870=>1000,27871=>1000,27872=>1000,27873=>1000,27874=>1000,27875=>1000,27876=>1000,27877=>1000,27878=>1000,27879=>1000,27880=>1000,27881=>1000,27882=>1000,27883=>1000,27884=>1000,27885=>1000,27886=>1000,27887=>1000,27888=>1000,27889=>1000,27890=>1000,27891=>1000,27892=>1000,27893=>1000,27894=>1000,27895=>1000,27896=>1000,27897=>1000,27898=>1000,27899=>1000,27900=>1000,27901=>1000,27902=>1000,27903=>1000,27904=>1000,27905=>1000,27906=>1000,27907=>1000,27908=>1000,27909=>1000,27910=>1000,27911=>1000,27912=>1000,27913=>1000,27914=>1000,27915=>1000,27916=>1000,27917=>1000,27918=>1000,27919=>1000,27920=>1000,27921=>1000,27922=>1000,27923=>1000,27924=>1000,27925=>1000,27926=>1000,27927=>1000,27928=>1000,27929=>1000,27930=>1000,27931=>1000,27932=>1000,27933=>1000,27934=>1000,27935=>1000,27936=>1000,27937=>1000,27938=>1000,27939=>1000,27940=>1000,27941=>1000,27942=>1000,27943=>1000,27944=>1000,27945=>1000,27946=>1000,27947=>1000,27948=>1000,27949=>1000,27950=>1000,27951=>1000,27952=>1000,27953=>1000,27954=>1000,27955=>1000,27956=>1000,27957=>1000,27958=>1000,27959=>1000,27960=>1000,27961=>1000,27962=>1000,27963=>1000,27964=>1000,27965=>1000,27966=>1000,27967=>1000,27968=>1000,27969=>1000,27970=>1000,27971=>1000,27972=>1000,27973=>1000,27974=>1000,27975=>1000,27976=>1000,27977=>1000,27978=>1000,27979=>1000,27980=>1000,27981=>1000,27982=>1000,27983=>1000,27984=>1000,27985=>1000,27986=>1000,27987=>1000,27988=>1000,27989=>1000,27990=>1000,27991=>1000,27992=>1000,27993=>1000,27994=>1000,27995=>1000,27996=>1000,27997=>1000,27998=>1000,27999=>1000,28000=>1000,28001=>1000,28002=>1000,28003=>1000,28004=>1000,28005=>1000,28006=>1000,28007=>1000,28008=>1000,28009=>1000,28010=>1000,28011=>1000,28012=>1000,28013=>1000,28014=>1000,28015=>1000,28016=>1000,28017=>1000,28018=>1000,28019=>1000,28020=>1000,28021=>1000,28022=>1000,28023=>1000,28024=>1000,28025=>1000,28026=>1000,28027=>1000,28028=>1000,28029=>1000,28030=>1000,28031=>1000,28032=>1000,28033=>1000,28034=>1000,28035=>1000,28036=>1000,28037=>1000,28038=>1000,28039=>1000,28040=>1000,28041=>1000,28042=>1000,28043=>1000,28044=>1000,28045=>1000,28046=>1000,28047=>1000,28048=>1000,28049=>1000,28050=>1000,28051=>1000,28052=>1000,28053=>1000,28054=>1000,28055=>1000,28056=>1000,28057=>1000,28058=>1000,28059=>1000,28060=>1000,28061=>1000,28062=>1000,28063=>1000,28064=>1000,28065=>1000,28066=>1000,28067=>1000,28068=>1000,28069=>1000,28070=>1000,28071=>1000,28072=>1000,28073=>1000,28074=>1000,28075=>1000,28076=>1000,28077=>1000,28078=>1000,28079=>1000,28080=>1000,28081=>1000,28082=>1000,28083=>1000,28084=>1000,28085=>1000,28086=>1000,28087=>1000,28088=>1000,28089=>1000,28090=>1000,28091=>1000,28092=>1000,28093=>1000,28094=>1000,28095=>1000,28096=>1000,28097=>1000,28098=>1000,28099=>1000,28100=>1000,28101=>1000,28102=>1000,28103=>1000,28104=>1000,28105=>1000,28106=>1000,28107=>1000,28108=>1000,28109=>1000,28110=>1000,28111=>1000,28112=>1000,28113=>1000,28114=>1000,28115=>1000,28116=>1000,28117=>1000,28118=>1000,28119=>1000,28120=>1000,28121=>1000,28122=>1000,28123=>1000,28124=>1000,28125=>1000,28126=>1000,28127=>1000,28128=>1000,28129=>1000,28130=>1000,28131=>1000,28132=>1000,28133=>1000,28134=>1000,28135=>1000,28136=>1000,28137=>1000,28138=>1000,28139=>1000,28140=>1000,28141=>1000,28142=>1000,28143=>1000,28144=>1000,28145=>1000,28146=>1000,28147=>1000,28148=>1000,28149=>1000,28150=>1000,28151=>1000,28152=>1000,28153=>1000,28154=>1000,28155=>1000,28156=>1000,28157=>1000,28158=>1000,28159=>1000,28160=>1000,28161=>1000,28162=>1000,28163=>1000,28164=>1000,28165=>1000,28166=>1000,28167=>1000,28168=>1000,28169=>1000,28170=>1000,28171=>1000,28172=>1000,28173=>1000,28174=>1000,28175=>1000,28176=>1000,28177=>1000,28178=>1000,28179=>1000,28180=>1000,28181=>1000,28182=>1000,28183=>1000,28184=>1000,28185=>1000,28186=>1000,28187=>1000,28188=>1000,28189=>1000,28190=>1000,28191=>1000,28192=>1000,28193=>1000,28194=>1000,28195=>1000,28196=>1000,28197=>1000,28198=>1000,28199=>1000,28200=>1000,28201=>1000,28202=>1000,28203=>1000,28204=>1000,28205=>1000,28206=>1000,28207=>1000,28208=>1000,28209=>1000,28210=>1000,28211=>1000,28212=>1000,28213=>1000,28214=>1000,28215=>1000,28216=>1000,28217=>1000,28218=>1000,28219=>1000,28220=>1000,28221=>1000,28222=>1000,28223=>1000,28224=>1000,28225=>1000,28226=>1000,28227=>1000,28228=>1000,28229=>1000,28230=>1000,28231=>1000,28232=>1000,28233=>1000,28234=>1000,28235=>1000,28236=>1000,28237=>1000,28238=>1000,28239=>1000,28240=>1000,28241=>1000,28242=>1000,28243=>1000,28244=>1000,28245=>1000,28246=>1000,28247=>1000,28248=>1000,28249=>1000,28250=>1000,28251=>1000,28252=>1000,28253=>1000,28254=>1000,28255=>1000,28256=>1000,28257=>1000,28258=>1000,28259=>1000,28260=>1000,28261=>1000,28262=>1000,28263=>1000,28264=>1000,28265=>1000,28266=>1000,28267=>1000,28268=>1000,28269=>1000,28270=>1000,28271=>1000,28272=>1000,28273=>1000,28274=>1000,28275=>1000,28276=>1000,28277=>1000,28278=>1000,28279=>1000,28280=>1000,28281=>1000,28282=>1000,28283=>1000,28284=>1000,28285=>1000,28286=>1000,28287=>1000,28288=>1000,28289=>1000,28290=>1000,28291=>1000,28292=>1000,28293=>1000,28294=>1000,28295=>1000,28296=>1000,28297=>1000,28298=>1000,28299=>1000,28300=>1000,28301=>1000,28302=>1000,28303=>1000,28304=>1000,28305=>1000,28306=>1000,28307=>1000,28308=>1000,28309=>1000,28310=>1000,28311=>1000,28312=>1000,28313=>1000,28314=>1000,28315=>1000,28316=>1000,28317=>1000,28318=>1000,28319=>1000,28320=>1000,28321=>1000,28322=>1000,28323=>1000,28324=>1000,28325=>1000,28326=>1000,28327=>1000,28328=>1000,28329=>1000,28330=>1000,28331=>1000,28332=>1000,28333=>1000,28334=>1000,28335=>1000,28336=>1000,28337=>1000,28338=>1000,28339=>1000,28340=>1000,28341=>1000,28342=>1000,28343=>1000,28344=>1000,28345=>1000,28346=>1000,28347=>1000,28348=>1000,28349=>1000,28350=>1000,28351=>1000,28352=>1000,28353=>1000,28354=>1000,28355=>1000,28356=>1000,28357=>1000,28358=>1000,28359=>1000,28360=>1000,28361=>1000,28362=>1000,28363=>1000,28364=>1000,28365=>1000,28366=>1000,28367=>1000,28368=>1000,28369=>1000,28370=>1000,28371=>1000,28372=>1000,28373=>1000,28374=>1000,28375=>1000,28376=>1000,28377=>1000,28378=>1000,28379=>1000,28380=>1000,28381=>1000,28382=>1000,28383=>1000,28384=>1000,28385=>1000,28386=>1000,28387=>1000,28388=>1000,28389=>1000,28390=>1000,28391=>1000,28392=>1000,28393=>1000,28394=>1000,28395=>1000,28396=>1000,28397=>1000,28398=>1000,28399=>1000,28400=>1000,28401=>1000,28402=>1000,28403=>1000,28404=>1000,28405=>1000,28406=>1000,28407=>1000,28408=>1000,28409=>1000,28410=>1000,28411=>1000,28412=>1000,28413=>1000,28414=>1000,28415=>1000,28416=>1000,28417=>1000,28418=>1000,28419=>1000,28420=>1000,28421=>1000,28422=>1000,28423=>1000,28424=>1000,28425=>1000,28426=>1000,28427=>1000,28428=>1000,28429=>1000,28430=>1000,28431=>1000,28432=>1000,28433=>1000,28434=>1000,28435=>1000,28436=>1000,28437=>1000,28438=>1000,28439=>1000,28440=>1000,28441=>1000,28442=>1000,28443=>1000,28444=>1000,28445=>1000,28446=>1000,28447=>1000,28448=>1000,28449=>1000,28450=>1000,28451=>1000,28452=>1000,28453=>1000,28454=>1000,28455=>1000,28456=>1000,28457=>1000,28458=>1000,28459=>1000,28460=>1000,28461=>1000,28462=>1000,28463=>1000,28464=>1000,28465=>1000,28466=>1000,28467=>1000,28468=>1000,28469=>1000,28470=>1000,28471=>1000,28472=>1000,28473=>1000,28474=>1000,28475=>1000,28476=>1000,28477=>1000,28478=>1000,28479=>1000,28480=>1000,28481=>1000,28482=>1000,28483=>1000,28484=>1000,28485=>1000,28486=>1000,28487=>1000,28488=>1000,28489=>1000,28490=>1000,28491=>1000,28492=>1000,28493=>1000,28494=>1000,28495=>1000,28496=>1000,28497=>1000,28498=>1000,28499=>1000,28500=>1000,28501=>1000,28502=>1000,28503=>1000,28504=>1000,28505=>1000,28506=>1000,28507=>1000,28508=>1000,28509=>1000,28510=>1000,28511=>1000,28512=>1000,28513=>1000,28514=>1000,28515=>1000,28516=>1000,28517=>1000,28518=>1000,28519=>1000,28520=>1000,28521=>1000,28522=>1000,28523=>1000,28524=>1000,28525=>1000,28526=>1000,28527=>1000,28528=>1000,28529=>1000,28530=>1000,28531=>1000,28532=>1000,28533=>1000,28534=>1000,28535=>1000,28536=>1000,28537=>1000,28538=>1000,28539=>1000,28540=>1000,28541=>1000,28542=>1000,28543=>1000,28544=>1000,28545=>1000,28546=>1000,28547=>1000,28548=>1000,28549=>1000,28550=>1000,28551=>1000,28552=>1000,28553=>1000,28554=>1000,28555=>1000,28556=>1000,28557=>1000,28558=>1000,28559=>1000,28560=>1000,28561=>1000,28562=>1000,28563=>1000,28564=>1000,28565=>1000,28566=>1000,28567=>1000,28568=>1000,28569=>1000,28570=>1000,28571=>1000,28572=>1000,28573=>1000,28574=>1000,28575=>1000,28576=>1000,28577=>1000,28578=>1000,28579=>1000,28580=>1000,28581=>1000,28582=>1000,28583=>1000,28584=>1000,28585=>1000,28586=>1000,28587=>1000,28588=>1000,28589=>1000,28590=>1000,28591=>1000,28592=>1000,28593=>1000,28594=>1000,28595=>1000,28596=>1000,28597=>1000,28598=>1000,28599=>1000,28600=>1000,28601=>1000,28602=>1000,28603=>1000,28604=>1000,28605=>1000,28606=>1000,28607=>1000,28608=>1000,28609=>1000,28610=>1000,28611=>1000,28612=>1000,28613=>1000,28614=>1000,28615=>1000,28616=>1000,28617=>1000,28618=>1000,28619=>1000,28620=>1000,28621=>1000,28622=>1000,28623=>1000,28624=>1000,28625=>1000,28626=>1000,28627=>1000,28628=>1000,28629=>1000,28630=>1000,28631=>1000,28632=>1000,28633=>1000,28634=>1000,28635=>1000,28636=>1000,28637=>1000,28638=>1000,28639=>1000,28640=>1000,28641=>1000,28642=>1000,28643=>1000,28644=>1000,28645=>1000,28646=>1000,28647=>1000,28648=>1000,28649=>1000,28650=>1000,28651=>1000,28652=>1000,28653=>1000,28654=>1000,28655=>1000,28656=>1000,28657=>1000,28658=>1000,28659=>1000,28660=>1000,28661=>1000,28662=>1000,28663=>1000,28664=>1000,28665=>1000,28666=>1000,28667=>1000,28668=>1000,28669=>1000,28670=>1000,28671=>1000,28672=>1000,28673=>1000,28674=>1000,28675=>1000,28676=>1000,28677=>1000,28678=>1000,28679=>1000,28680=>1000,28681=>1000,28682=>1000,28683=>1000,28684=>1000,28685=>1000,28686=>1000,28687=>1000,28688=>1000,28689=>1000,28690=>1000,28691=>1000,28692=>1000,28693=>1000,28694=>1000,28695=>1000,28696=>1000,28697=>1000,28698=>1000,28699=>1000,28700=>1000,28701=>1000,28702=>1000,28703=>1000,28704=>1000,28705=>1000,28706=>1000,28707=>1000,28708=>1000,28709=>1000,28710=>1000,28711=>1000,28712=>1000,28713=>1000,28714=>1000,28715=>1000,28716=>1000,28717=>1000,28718=>1000,28719=>1000,28720=>1000,28721=>1000,28722=>1000,28723=>1000,28724=>1000,28725=>1000,28726=>1000,28727=>1000,28728=>1000,28729=>1000,28730=>1000,28731=>1000,28732=>1000,28733=>1000,28734=>1000,28735=>1000,28736=>1000,28737=>1000,28738=>1000,28739=>1000,28740=>1000,28741=>1000,28742=>1000,28743=>1000,28744=>1000,28745=>1000,28746=>1000,28747=>1000,28748=>1000,28749=>1000,28750=>1000,28751=>1000,28752=>1000,28753=>1000,28754=>1000,28755=>1000,28756=>1000,28757=>1000,28758=>1000,28759=>1000,28760=>1000,28761=>1000,28762=>1000,28763=>1000,28764=>1000,28765=>1000,28766=>1000,28767=>1000,28768=>1000,28769=>1000,28770=>1000,28771=>1000,28772=>1000,28773=>1000,28774=>1000,28775=>1000,28776=>1000,28777=>1000,28778=>1000,28779=>1000,28780=>1000,28781=>1000,28782=>1000,28783=>1000,28784=>1000,28785=>1000,28786=>1000,28787=>1000,28788=>1000,28789=>1000,28790=>1000,28791=>1000,28792=>1000,28793=>1000,28794=>1000,28795=>1000,28796=>1000,28797=>1000,28798=>1000,28799=>1000,28800=>1000,28801=>1000,28802=>1000,28803=>1000,28804=>1000,28805=>1000,28806=>1000,28807=>1000,28808=>1000,28809=>1000,28810=>1000,28811=>1000,28812=>1000,28813=>1000,28814=>1000,28815=>1000,28816=>1000,28817=>1000,28818=>1000,28819=>1000,28820=>1000,28821=>1000,28822=>1000,28823=>1000,28824=>1000,28825=>1000,28826=>1000,28827=>1000,28828=>1000,28829=>1000,28830=>1000,28831=>1000,28832=>1000,28833=>1000,28834=>1000,28835=>1000,28836=>1000,28837=>1000,28838=>1000,28839=>1000,28840=>1000,28841=>1000,28842=>1000,28843=>1000,28844=>1000,28845=>1000,28846=>1000,28847=>1000,28848=>1000,28849=>1000,28850=>1000,28851=>1000,28852=>1000,28853=>1000,28854=>1000,28855=>1000,28856=>1000,28857=>1000,28858=>1000,28859=>1000,28860=>1000,28861=>1000,28862=>1000,28863=>1000,28864=>1000,28865=>1000,28866=>1000,28867=>1000,28868=>1000,28869=>1000,28870=>1000,28871=>1000,28872=>1000,28873=>1000,28874=>1000,28875=>1000,28876=>1000,28877=>1000,28878=>1000,28879=>1000,28880=>1000,28881=>1000,28882=>1000,28883=>1000,28884=>1000,28885=>1000,28886=>1000,28887=>1000,28888=>1000,28889=>1000,28890=>1000,28891=>1000,28892=>1000,28893=>1000,28894=>1000,28895=>1000,28896=>1000,28897=>1000,28898=>1000,28899=>1000,28900=>1000,28901=>1000,28902=>1000,28903=>1000,28904=>1000,28905=>1000,28906=>1000,28907=>1000,28908=>1000,28909=>1000,28910=>1000,28911=>1000,28912=>1000,28913=>1000,28914=>1000,28915=>1000,28916=>1000,28917=>1000,28918=>1000,28919=>1000,28920=>1000,28921=>1000,28922=>1000,28923=>1000,28924=>1000,28925=>1000,28926=>1000,28927=>1000,28928=>1000,28929=>1000,28930=>1000,28931=>1000,28932=>1000,28933=>1000,28934=>1000,28935=>1000,28936=>1000,28937=>1000,28938=>1000,28939=>1000,28940=>1000,28941=>1000,28942=>1000,28943=>1000,28944=>1000,28945=>1000,28946=>1000,28947=>1000,28948=>1000,28949=>1000,28950=>1000,28951=>1000,28952=>1000,28953=>1000,28954=>1000,28955=>1000,28956=>1000,28957=>1000,28958=>1000,28959=>1000,28960=>1000,28961=>1000,28962=>1000,28963=>1000,28964=>1000,28965=>1000,28966=>1000,28967=>1000,28968=>1000,28969=>1000,28970=>1000,28971=>1000,28972=>1000,28973=>1000,28974=>1000,28975=>1000,28976=>1000,28977=>1000,28978=>1000,28979=>1000,28980=>1000,28981=>1000,28982=>1000,28983=>1000,28984=>1000,28985=>1000,28986=>1000,28987=>1000,28988=>1000,28989=>1000,28990=>1000,28991=>1000,28992=>1000,28993=>1000,28994=>1000,28995=>1000,28996=>1000,28997=>1000,28998=>1000,28999=>1000,29000=>1000,29001=>1000,29002=>1000,29003=>1000,29004=>1000,29005=>1000,29006=>1000,29007=>1000,29008=>1000,29009=>1000,29010=>1000,29011=>1000,29012=>1000,29013=>1000,29014=>1000,29015=>1000,29016=>1000,29017=>1000,29018=>1000,29019=>1000,29020=>1000,29021=>1000,29022=>1000,29023=>1000,29024=>1000,29025=>1000,29026=>1000,29027=>1000,29028=>1000,29029=>1000,29030=>1000,29031=>1000,29032=>1000,29033=>1000,29034=>1000,29035=>1000,29036=>1000,29037=>1000,29038=>1000,29039=>1000,29040=>1000,29041=>1000,29042=>1000,29043=>1000,29044=>1000,29045=>1000,29046=>1000,29047=>1000,29048=>1000,29049=>1000,29050=>1000,29051=>1000,29052=>1000,29053=>1000,29054=>1000,29055=>1000,29056=>1000,29057=>1000,29058=>1000,29059=>1000,29060=>1000,29061=>1000,29062=>1000,29063=>1000,29064=>1000,29065=>1000,29066=>1000,29067=>1000,29068=>1000,29069=>1000,29070=>1000,29071=>1000,29072=>1000,29073=>1000,29074=>1000,29075=>1000,29076=>1000,29077=>1000,29078=>1000,29079=>1000,29080=>1000,29081=>1000,29082=>1000,29083=>1000,29084=>1000,29085=>1000,29086=>1000,29087=>1000,29088=>1000,29089=>1000,29090=>1000,29091=>1000,29092=>1000,29093=>1000,29094=>1000,29095=>1000,29096=>1000,29097=>1000,29098=>1000,29099=>1000,29100=>1000,29101=>1000,29102=>1000,29103=>1000,29104=>1000,29105=>1000,29106=>1000,29107=>1000,29108=>1000,29109=>1000,29110=>1000,29111=>1000,29112=>1000,29113=>1000,29114=>1000,29115=>1000,29116=>1000,29117=>1000,29118=>1000,29119=>1000,29120=>1000,29121=>1000,29122=>1000,29123=>1000,29124=>1000,29125=>1000,29126=>1000,29127=>1000,29128=>1000,29129=>1000,29130=>1000,29131=>1000,29132=>1000,29133=>1000,29134=>1000,29135=>1000,29136=>1000,29137=>1000,29138=>1000,29139=>1000,29140=>1000,29141=>1000,29142=>1000,29143=>1000,29144=>1000,29145=>1000,29146=>1000,29147=>1000,29148=>1000,29149=>1000,29150=>1000,29151=>1000,29152=>1000,29153=>1000,29154=>1000,29155=>1000,29156=>1000,29157=>1000,29158=>1000,29159=>1000,29160=>1000,29161=>1000,29162=>1000,29163=>1000,29164=>1000,29165=>1000,29166=>1000,29167=>1000,29168=>1000,29169=>1000,29170=>1000,29171=>1000,29172=>1000,29173=>1000,29174=>1000,29175=>1000,29176=>1000,29177=>1000,29178=>1000,29179=>1000,29180=>1000,29181=>1000,29182=>1000,29183=>1000,29184=>1000,29185=>1000,29186=>1000,29187=>1000,29188=>1000,29189=>1000,29190=>1000,29191=>1000,29192=>1000,29193=>1000,29194=>1000,29195=>1000,29196=>1000,29197=>1000,29198=>1000,29199=>1000,29200=>1000,29201=>1000,29202=>1000,29203=>1000,29204=>1000,29205=>1000,29206=>1000,29207=>1000,29208=>1000,29209=>1000,29210=>1000,29211=>1000,29212=>1000,29213=>1000,29214=>1000,29215=>1000,29216=>1000,29217=>1000,29218=>1000,29219=>1000,29220=>1000,29221=>1000,29222=>1000,29223=>1000,29224=>1000,29225=>1000,29226=>1000,29227=>1000,29228=>1000,29229=>1000,29230=>1000,29231=>1000,29232=>1000,29233=>1000,29234=>1000,29235=>1000,29236=>1000,29237=>1000,29238=>1000,29239=>1000,29240=>1000,29241=>1000,29242=>1000,29243=>1000,29244=>1000,29245=>1000,29246=>1000,29247=>1000,29248=>1000,29249=>1000,29250=>1000,29251=>1000,29252=>1000,29253=>1000,29254=>1000,29255=>1000,29256=>1000,29257=>1000,29258=>1000,29259=>1000,29260=>1000,29261=>1000,29262=>1000,29263=>1000,29264=>1000,29265=>1000,29266=>1000,29267=>1000,29268=>1000,29269=>1000,29270=>1000,29271=>1000,29272=>1000,29273=>1000,29274=>1000,29275=>1000,29276=>1000,29277=>1000,29278=>1000,29279=>1000,29280=>1000,29281=>1000,29282=>1000,29283=>1000,29284=>1000,29285=>1000,29286=>1000,29287=>1000,29288=>1000,29289=>1000,29290=>1000,29291=>1000,29292=>1000,29293=>1000,29294=>1000,29295=>1000,29296=>1000,29297=>1000,29298=>1000,29299=>1000,29300=>1000,29301=>1000,29302=>1000,29303=>1000,29304=>1000,29305=>1000,29306=>1000,29307=>1000,29308=>1000,29309=>1000,29310=>1000,29311=>1000,29312=>1000,29313=>1000,29314=>1000,29315=>1000,29316=>1000,29317=>1000,29318=>1000,29319=>1000,29320=>1000,29321=>1000,29322=>1000,29323=>1000,29324=>1000,29325=>1000,29326=>1000,29327=>1000,29328=>1000,29329=>1000,29330=>1000,29331=>1000,29332=>1000,29333=>1000,29334=>1000,29335=>1000,29336=>1000,29337=>1000,29338=>1000,29339=>1000,29340=>1000,29341=>1000,29342=>1000,29343=>1000,29344=>1000,29345=>1000,29346=>1000,29347=>1000,29348=>1000,29349=>1000,29350=>1000,29351=>1000,29352=>1000,29353=>1000,29354=>1000,29355=>1000,29356=>1000,29357=>1000,29358=>1000,29359=>1000,29360=>1000,29361=>1000,29362=>1000,29363=>1000,29364=>1000,29365=>1000,29366=>1000,29367=>1000,29368=>1000,29369=>1000,29370=>1000,29371=>1000,29372=>1000,29373=>1000,29374=>1000,29375=>1000,29376=>1000,29377=>1000,29378=>1000,29379=>1000,29380=>1000,29381=>1000,29382=>1000,29383=>1000,29384=>1000,29385=>1000,29386=>1000,29387=>1000,29388=>1000,29389=>1000,29390=>1000,29391=>1000,29392=>1000,29393=>1000,29394=>1000,29395=>1000,29396=>1000,29397=>1000,29398=>1000,29399=>1000,29400=>1000,29401=>1000,29402=>1000,29403=>1000,29404=>1000,29405=>1000,29406=>1000,29407=>1000,29408=>1000,29409=>1000,29410=>1000,29411=>1000,29412=>1000,29413=>1000,29414=>1000,29415=>1000,29416=>1000,29417=>1000,29418=>1000,29419=>1000,29420=>1000,29421=>1000,29422=>1000,29423=>1000,29424=>1000,29425=>1000,29426=>1000,29427=>1000,29428=>1000,29429=>1000,29430=>1000,29431=>1000,29432=>1000,29433=>1000,29434=>1000,29435=>1000,29436=>1000,29437=>1000,29438=>1000,29439=>1000,29440=>1000,29441=>1000,29442=>1000,29443=>1000,29444=>1000,29445=>1000,29446=>1000,29447=>1000,29448=>1000,29449=>1000,29450=>1000,29451=>1000,29452=>1000,29453=>1000,29454=>1000,29455=>1000,29456=>1000,29457=>1000,29458=>1000,29459=>1000,29460=>1000,29461=>1000,29462=>1000,29463=>1000,29464=>1000,29465=>1000,29466=>1000,29467=>1000,29468=>1000,29469=>1000,29470=>1000,29471=>1000,29472=>1000,29473=>1000,29474=>1000,29475=>1000,29476=>1000,29477=>1000,29478=>1000,29479=>1000,29480=>1000,29481=>1000,29482=>1000,29483=>1000,29484=>1000,29485=>1000,29486=>1000,29487=>1000,29488=>1000,29489=>1000,29490=>1000,29491=>1000,29492=>1000,29493=>1000,29494=>1000,29495=>1000,29496=>1000,29497=>1000,29498=>1000,29499=>1000,29500=>1000,29501=>1000,29502=>1000,29503=>1000,29504=>1000,29505=>1000,29506=>1000,29507=>1000,29508=>1000,29509=>1000,29510=>1000,29511=>1000,29512=>1000,29513=>1000,29514=>1000,29515=>1000,29516=>1000,29517=>1000,29518=>1000,29519=>1000,29520=>1000,29521=>1000,29522=>1000,29523=>1000,29524=>1000,29525=>1000,29526=>1000,29527=>1000,29528=>1000,29529=>1000,29530=>1000,29531=>1000,29532=>1000,29533=>1000,29534=>1000,29535=>1000,29536=>1000,29537=>1000,29538=>1000,29539=>1000,29540=>1000,29541=>1000,29542=>1000,29543=>1000,29544=>1000,29545=>1000,29546=>1000,29547=>1000,29548=>1000,29549=>1000,29550=>1000,29551=>1000,29552=>1000,29553=>1000,29554=>1000,29555=>1000,29556=>1000,29557=>1000,29558=>1000,29559=>1000,29560=>1000,29561=>1000,29562=>1000,29563=>1000,29564=>1000,29565=>1000,29566=>1000,29567=>1000,29568=>1000,29569=>1000,29570=>1000,29571=>1000,29572=>1000,29573=>1000,29574=>1000,29575=>1000,29576=>1000,29577=>1000,29578=>1000,29579=>1000,29580=>1000,29581=>1000,29582=>1000,29583=>1000,29584=>1000,29585=>1000,29586=>1000,29587=>1000,29588=>1000,29589=>1000,29590=>1000,29591=>1000,29592=>1000,29593=>1000,29594=>1000,29595=>1000,29596=>1000,29597=>1000,29598=>1000,29599=>1000,29600=>1000,29601=>1000,29602=>1000,29603=>1000,29604=>1000,29605=>1000,29606=>1000,29607=>1000,29608=>1000,29609=>1000,29610=>1000,29611=>1000,29612=>1000,29613=>1000,29614=>1000,29615=>1000,29616=>1000,29617=>1000,29618=>1000,29619=>1000,29620=>1000,29621=>1000,29622=>1000,29623=>1000,29624=>1000,29625=>1000,29626=>1000,29627=>1000,29628=>1000,29629=>1000,29630=>1000,29631=>1000,29632=>1000,29633=>1000,29634=>1000,29635=>1000,29636=>1000,29637=>1000,29638=>1000,29639=>1000,29640=>1000,29641=>1000,29642=>1000,29643=>1000,29644=>1000,29645=>1000,29646=>1000,29647=>1000,29648=>1000,29649=>1000,29650=>1000,29651=>1000,29652=>1000,29653=>1000,29654=>1000,29655=>1000,29656=>1000,29657=>1000,29658=>1000,29659=>1000,29660=>1000,29661=>1000,29662=>1000,29663=>1000,29664=>1000,29665=>1000,29666=>1000,29667=>1000,29668=>1000,29669=>1000,29670=>1000,29671=>1000,29672=>1000,29673=>1000,29674=>1000,29675=>1000,29676=>1000,29677=>1000,29678=>1000,29679=>1000,29680=>1000,29681=>1000,29682=>1000,29683=>1000,29684=>1000,29685=>1000,29686=>1000,29687=>1000,29688=>1000,29689=>1000,29690=>1000,29691=>1000,29692=>1000,29693=>1000,29694=>1000,29695=>1000,29696=>1000,29697=>1000,29698=>1000,29699=>1000,29700=>1000,29701=>1000,29702=>1000,29703=>1000,29704=>1000,29705=>1000,29706=>1000,29707=>1000,29708=>1000,29709=>1000,29710=>1000,29711=>1000,29712=>1000,29713=>1000,29714=>1000,29715=>1000,29716=>1000,29717=>1000,29718=>1000,29719=>1000,29720=>1000,29721=>1000,29722=>1000,29723=>1000,29724=>1000,29725=>1000,29726=>1000,29727=>1000,29728=>1000,29729=>1000,29730=>1000,29731=>1000,29732=>1000,29733=>1000,29734=>1000,29735=>1000,29736=>1000,29737=>1000,29738=>1000,29739=>1000,29740=>1000,29741=>1000,29742=>1000,29743=>1000,29744=>1000,29745=>1000,29746=>1000,29747=>1000,29748=>1000,29749=>1000,29750=>1000,29751=>1000,29752=>1000,29753=>1000,29754=>1000,29755=>1000,29756=>1000,29757=>1000,29758=>1000,29759=>1000,29760=>1000,29761=>1000,29762=>1000,29763=>1000,29764=>1000,29765=>1000,29766=>1000,29767=>1000,29768=>1000,29769=>1000,29770=>1000,29771=>1000,29772=>1000,29773=>1000,29774=>1000,29775=>1000,29776=>1000,29777=>1000,29778=>1000,29779=>1000,29780=>1000,29781=>1000,29782=>1000,29783=>1000,29784=>1000,29785=>1000,29786=>1000,29787=>1000,29788=>1000,29789=>1000,29790=>1000,29791=>1000,29792=>1000,29793=>1000,29794=>1000,29795=>1000,29796=>1000,29797=>1000,29798=>1000,29799=>1000,29800=>1000,29801=>1000,29802=>1000,29803=>1000,29804=>1000,29805=>1000,29806=>1000,29807=>1000,29808=>1000,29809=>1000,29810=>1000,29811=>1000,29812=>1000,29813=>1000,29814=>1000,29815=>1000,29816=>1000,29817=>1000,29818=>1000,29819=>1000,29820=>1000,29821=>1000,29822=>1000,29823=>1000,29824=>1000,29825=>1000,29826=>1000,29827=>1000,29828=>1000,29829=>1000,29830=>1000,29831=>1000,29832=>1000,29833=>1000,29834=>1000,29835=>1000,29836=>1000,29837=>1000,29838=>1000,29839=>1000,29840=>1000,29841=>1000,29842=>1000,29843=>1000,29844=>1000,29845=>1000,29846=>1000,29847=>1000,29848=>1000,29849=>1000,29850=>1000,29851=>1000,29852=>1000,29853=>1000,29854=>1000,29855=>1000,29856=>1000,29857=>1000,29858=>1000,29859=>1000,29860=>1000,29861=>1000,29862=>1000,29863=>1000,29864=>1000,29865=>1000,29866=>1000,29867=>1000,29868=>1000,29869=>1000,29870=>1000,29871=>1000,29872=>1000,29873=>1000,29874=>1000,29875=>1000,29876=>1000,29877=>1000,29878=>1000,29879=>1000,29880=>1000,29881=>1000,29882=>1000,29883=>1000,29884=>1000,29885=>1000,29886=>1000,29887=>1000,29888=>1000,29889=>1000,29890=>1000,29891=>1000,29892=>1000,29893=>1000,29894=>1000,29895=>1000,29896=>1000,29897=>1000,29898=>1000,29899=>1000,29900=>1000,29901=>1000,29902=>1000,29903=>1000,29904=>1000,29905=>1000,29906=>1000,29907=>1000,29908=>1000,29909=>1000,29910=>1000,29911=>1000,29912=>1000,29913=>1000,29914=>1000,29915=>1000,29916=>1000,29917=>1000,29918=>1000,29919=>1000,29920=>1000,29921=>1000,29922=>1000,29923=>1000,29924=>1000,29925=>1000,29926=>1000,29927=>1000,29928=>1000,29929=>1000,29930=>1000,29931=>1000,29932=>1000,29933=>1000,29934=>1000,29935=>1000,29936=>1000,29937=>1000,29938=>1000,29939=>1000,29940=>1000,29941=>1000,29942=>1000,29943=>1000,29944=>1000,29945=>1000,29946=>1000,29947=>1000,29948=>1000,29949=>1000,29950=>1000,29951=>1000,29952=>1000,29953=>1000,29954=>1000,29955=>1000,29956=>1000,29957=>1000,29958=>1000,29959=>1000,29960=>1000,29961=>1000,29962=>1000,29963=>1000,29964=>1000,29965=>1000,29966=>1000,29967=>1000,29968=>1000,29969=>1000,29970=>1000,29971=>1000,29972=>1000,29973=>1000,29974=>1000,29975=>1000,29976=>1000,29977=>1000,29978=>1000,29979=>1000,29980=>1000,29981=>1000,29982=>1000,29983=>1000,29984=>1000,29985=>1000,29986=>1000,29987=>1000,29988=>1000,29989=>1000,29990=>1000,29991=>1000,29992=>1000,29993=>1000,29994=>1000,29995=>1000,29996=>1000,29997=>1000,29998=>1000,29999=>1000,30000=>1000,30001=>1000,30002=>1000,30003=>1000,30004=>1000,30005=>1000,30006=>1000,30007=>1000,30008=>1000,30009=>1000,30010=>1000,30011=>1000,30012=>1000,30013=>1000,30014=>1000,30015=>1000,30016=>1000,30017=>1000,30018=>1000,30019=>1000,30020=>1000,30021=>1000,30022=>1000,30023=>1000,30024=>1000,30025=>1000,30026=>1000,30027=>1000,30028=>1000,30029=>1000,30030=>1000,30031=>1000,30032=>1000,30033=>1000,30034=>1000,30035=>1000,30036=>1000,30037=>1000,30038=>1000,30039=>1000,30040=>1000,30041=>1000,30042=>1000,30043=>1000,30044=>1000,30045=>1000,30046=>1000,30047=>1000,30048=>1000,30049=>1000,30050=>1000,30051=>1000,30052=>1000,30053=>1000,30054=>1000,30055=>1000,30056=>1000,30057=>1000,30058=>1000,30059=>1000,30060=>1000,30061=>1000,30062=>1000,30063=>1000,30064=>1000,30065=>1000,30066=>1000,30067=>1000,30068=>1000,30069=>1000,30070=>1000,30071=>1000,30072=>1000,30073=>1000,30074=>1000,30075=>1000,30076=>1000,30077=>1000,30078=>1000,30079=>1000,30080=>1000,30081=>1000,30082=>1000,30083=>1000,30084=>1000,30085=>1000,30086=>1000,30087=>1000,30088=>1000,30089=>1000,30090=>1000,30091=>1000,30092=>1000,30093=>1000,30094=>1000,30095=>1000,30096=>1000,30097=>1000,30098=>1000,30099=>1000,30100=>1000,30101=>1000,30102=>1000,30103=>1000,30104=>1000,30105=>1000,30106=>1000,30107=>1000,30108=>1000,30109=>1000,30110=>1000,30111=>1000,30112=>1000,30113=>1000,30114=>1000,30115=>1000,30116=>1000,30117=>1000,30118=>1000,30119=>1000,30120=>1000,30121=>1000,30122=>1000,30123=>1000,30124=>1000,30125=>1000,30126=>1000,30127=>1000,30128=>1000,30129=>1000,30130=>1000,30131=>1000,30132=>1000,30133=>1000,30134=>1000,30135=>1000,30136=>1000,30137=>1000,30138=>1000,30139=>1000,30140=>1000,30141=>1000,30142=>1000,30143=>1000,30144=>1000,30145=>1000,30146=>1000,30147=>1000,30148=>1000,30149=>1000,30150=>1000,30151=>1000,30152=>1000,30153=>1000,30154=>1000,30155=>1000,30156=>1000,30157=>1000,30158=>1000,30159=>1000,30160=>1000,30161=>1000,30162=>1000,30163=>1000,30164=>1000,30165=>1000,30166=>1000,30167=>1000,30168=>1000,30169=>1000,30170=>1000,30171=>1000,30172=>1000,30173=>1000,30174=>1000,30175=>1000,30176=>1000,30177=>1000,30178=>1000,30179=>1000,30180=>1000,30181=>1000,30182=>1000,30183=>1000,30184=>1000,30185=>1000,30186=>1000,30187=>1000,30188=>1000,30189=>1000,30190=>1000,30191=>1000,30192=>1000,30193=>1000,30194=>1000,30195=>1000,30196=>1000,30197=>1000,30198=>1000,30199=>1000,30200=>1000,30201=>1000,30202=>1000,30203=>1000,30204=>1000,30205=>1000,30206=>1000,30207=>1000,30208=>1000,30209=>1000,30210=>1000,30211=>1000,30212=>1000,30213=>1000,30214=>1000,30215=>1000,30216=>1000,30217=>1000,30218=>1000,30219=>1000,30220=>1000,30221=>1000,30222=>1000,30223=>1000,30224=>1000,30225=>1000,30226=>1000,30227=>1000,30228=>1000,30229=>1000,30230=>1000,30231=>1000,30232=>1000,30233=>1000,30234=>1000,30235=>1000,30236=>1000,30237=>1000,30238=>1000,30239=>1000,30240=>1000,30241=>1000,30242=>1000,30243=>1000,30244=>1000,30245=>1000,30246=>1000,30247=>1000,30248=>1000,30249=>1000,30250=>1000,30251=>1000,30252=>1000,30253=>1000,30254=>1000,30255=>1000,30256=>1000,30257=>1000,30258=>1000,30259=>1000,30260=>1000,30261=>1000,30262=>1000,30263=>1000,30264=>1000,30265=>1000,30266=>1000,30267=>1000,30268=>1000,30269=>1000,30270=>1000,30271=>1000,30272=>1000,30273=>1000,30274=>1000,30275=>1000,30276=>1000,30277=>1000,30278=>1000,30279=>1000,30280=>1000,30281=>1000,30282=>1000,30283=>1000,30284=>1000,30285=>1000,30286=>1000,30287=>1000,30288=>1000,30289=>1000,30290=>1000,30291=>1000,30292=>1000,30293=>1000,30294=>1000,30295=>1000,30296=>1000,30297=>1000,30298=>1000,30299=>1000,30300=>1000,30301=>1000,30302=>1000,30303=>1000,30304=>1000,30305=>1000,30306=>1000,30307=>1000,30308=>1000,30309=>1000,30310=>1000,30311=>1000,30312=>1000,30313=>1000,30314=>1000,30315=>1000,30316=>1000,30317=>1000,30318=>1000,30319=>1000,30320=>1000,30321=>1000,30322=>1000,30323=>1000,30324=>1000,30325=>1000,30326=>1000,30327=>1000,30328=>1000,30329=>1000,30330=>1000,30331=>1000,30332=>1000,30333=>1000,30334=>1000,30335=>1000,30336=>1000,30337=>1000,30338=>1000,30339=>1000,30340=>1000,30341=>1000,30342=>1000,30343=>1000,30344=>1000,30345=>1000,30346=>1000,30347=>1000,30348=>1000,30349=>1000,30350=>1000,30351=>1000,30352=>1000,30353=>1000,30354=>1000,30355=>1000,30356=>1000,30357=>1000,30358=>1000,30359=>1000,30360=>1000,30361=>1000,30362=>1000,30363=>1000,30364=>1000,30365=>1000,30366=>1000,30367=>1000,30368=>1000,30369=>1000,30370=>1000,30371=>1000,30372=>1000,30373=>1000,30374=>1000,30375=>1000,30376=>1000,30377=>1000,30378=>1000,30379=>1000,30380=>1000,30381=>1000,30382=>1000,30383=>1000,30384=>1000,30385=>1000,30386=>1000,30387=>1000,30388=>1000,30389=>1000,30390=>1000,30391=>1000,30392=>1000,30393=>1000,30394=>1000,30395=>1000,30396=>1000,30397=>1000,30398=>1000,30399=>1000,30400=>1000,30401=>1000,30402=>1000,30403=>1000,30404=>1000,30405=>1000,30406=>1000,30407=>1000,30408=>1000,30409=>1000,30410=>1000,30411=>1000,30412=>1000,30413=>1000,30414=>1000,30415=>1000,30416=>1000,30417=>1000,30418=>1000,30419=>1000,30420=>1000,30421=>1000,30422=>1000,30423=>1000,30424=>1000,30425=>1000,30426=>1000,30427=>1000,30428=>1000,30429=>1000,30430=>1000,30431=>1000,30432=>1000,30433=>1000,30434=>1000,30435=>1000,30436=>1000,30437=>1000,30438=>1000,30439=>1000,30440=>1000,30441=>1000,30442=>1000,30443=>1000,30444=>1000,30445=>1000,30446=>1000,30447=>1000,30448=>1000,30449=>1000,30450=>1000,30451=>1000,30452=>1000,30453=>1000,30454=>1000,30455=>1000,30456=>1000,30457=>1000,30458=>1000,30459=>1000,30460=>1000,30461=>1000,30462=>1000,30463=>1000,30464=>1000,30465=>1000,30466=>1000,30467=>1000,30468=>1000,30469=>1000,30470=>1000,30471=>1000,30472=>1000,30473=>1000,30474=>1000,30475=>1000,30476=>1000,30477=>1000,30478=>1000,30479=>1000,30480=>1000,30481=>1000,30482=>1000,30483=>1000,30484=>1000,30485=>1000,30486=>1000,30487=>1000,30488=>1000,30489=>1000,30490=>1000,30491=>1000,30492=>1000,30493=>1000,30494=>1000,30495=>1000,30496=>1000,30497=>1000,30498=>1000,30499=>1000,30500=>1000,30501=>1000,30502=>1000,30503=>1000,30504=>1000,30505=>1000,30506=>1000,30507=>1000,30508=>1000,30509=>1000,30510=>1000,30511=>1000,30512=>1000,30513=>1000,30514=>1000,30515=>1000,30516=>1000,30517=>1000,30518=>1000,30519=>1000,30520=>1000,30521=>1000,30522=>1000,30523=>1000,30524=>1000,30525=>1000,30526=>1000,30527=>1000,30528=>1000,30529=>1000,30530=>1000,30531=>1000,30532=>1000,30533=>1000,30534=>1000,30535=>1000,30536=>1000,30537=>1000,30538=>1000,30539=>1000,30540=>1000,30541=>1000,30542=>1000,30543=>1000,30544=>1000,30545=>1000,30546=>1000,30547=>1000,30548=>1000,30549=>1000,30550=>1000,30551=>1000,30552=>1000,30553=>1000,30554=>1000,30555=>1000,30556=>1000,30557=>1000,30558=>1000,30559=>1000,30560=>1000,30561=>1000,30562=>1000,30563=>1000,30564=>1000,30565=>1000,30566=>1000,30567=>1000,30568=>1000,30569=>1000,30570=>1000,30571=>1000,30572=>1000,30573=>1000,30574=>1000,30575=>1000,30576=>1000,30577=>1000,30578=>1000,30579=>1000,30580=>1000,30581=>1000,30582=>1000,30583=>1000,30584=>1000,30585=>1000,30586=>1000,30587=>1000,30588=>1000,30589=>1000,30590=>1000,30591=>1000,30592=>1000,30593=>1000,30594=>1000,30595=>1000,30596=>1000,30597=>1000,30598=>1000,30599=>1000,30600=>1000,30601=>1000,30602=>1000,30603=>1000,30604=>1000,30605=>1000,30606=>1000,30607=>1000,30608=>1000,30609=>1000,30610=>1000,30611=>1000,30612=>1000,30613=>1000,30614=>1000,30615=>1000,30616=>1000,30617=>1000,30618=>1000,30619=>1000,30620=>1000,30621=>1000,30622=>1000,30623=>1000,30624=>1000,30625=>1000,30626=>1000,30627=>1000,30628=>1000,30629=>1000,30630=>1000,30631=>1000,30632=>1000,30633=>1000,30634=>1000,30635=>1000,30636=>1000,30637=>1000,30638=>1000,30639=>1000,30640=>1000,30641=>1000,30642=>1000,30643=>1000,30644=>1000,30645=>1000,30646=>1000,30647=>1000,30648=>1000,30649=>1000,30650=>1000,30651=>1000,30652=>1000,30653=>1000,30654=>1000,30655=>1000,30656=>1000,30657=>1000,30658=>1000,30659=>1000,30660=>1000,30661=>1000,30662=>1000,30663=>1000,30664=>1000,30665=>1000,30666=>1000,30667=>1000,30668=>1000,30669=>1000,30670=>1000,30671=>1000,30672=>1000,30673=>1000,30674=>1000,30675=>1000,30676=>1000,30677=>1000,30678=>1000,30679=>1000,30680=>1000,30681=>1000,30682=>1000,30683=>1000,30684=>1000,30685=>1000,30686=>1000,30687=>1000,30688=>1000,30689=>1000,30690=>1000,30691=>1000,30692=>1000,30693=>1000,30694=>1000,30695=>1000,30696=>1000,30697=>1000,30698=>1000,30699=>1000,30700=>1000,30701=>1000,30702=>1000,30703=>1000,30704=>1000,30705=>1000,30706=>1000,30707=>1000,30708=>1000,30709=>1000,30710=>1000,30711=>1000,30712=>1000,30713=>1000,30714=>1000,30715=>1000,30716=>1000,30717=>1000,30718=>1000,30719=>1000,30720=>1000,30721=>1000,30722=>1000,30723=>1000,30724=>1000,30725=>1000,30726=>1000,30727=>1000,30728=>1000,30729=>1000,30730=>1000,30731=>1000,30732=>1000,30733=>1000,30734=>1000,30735=>1000,30736=>1000,30737=>1000,30738=>1000,30739=>1000,30740=>1000,30741=>1000,30742=>1000,30743=>1000,30744=>1000,30745=>1000,30746=>1000,30747=>1000,30748=>1000,30749=>1000,30750=>1000,30751=>1000,30752=>1000,30753=>1000,30754=>1000,30755=>1000,30756=>1000,30757=>1000,30758=>1000,30759=>1000,30760=>1000,30761=>1000,30762=>1000,30763=>1000,30764=>1000,30765=>1000,30766=>1000,30767=>1000,30768=>1000,30769=>1000,30770=>1000,30771=>1000,30772=>1000,30773=>1000,30774=>1000,30775=>1000,30776=>1000,30777=>1000,30778=>1000,30779=>1000,30780=>1000,30781=>1000,30782=>1000,30783=>1000,30784=>1000,30785=>1000,30786=>1000,30787=>1000,30788=>1000,30789=>1000,30790=>1000,30791=>1000,30792=>1000,30793=>1000,30794=>1000,30795=>1000,30796=>1000,30797=>1000,30798=>1000,30799=>1000,30800=>1000,30801=>1000,30802=>1000,30803=>1000,30804=>1000,30805=>1000,30806=>1000,30807=>1000,30808=>1000,30809=>1000,30810=>1000,30811=>1000,30812=>1000,30813=>1000,30814=>1000,30815=>1000,30816=>1000,30817=>1000,30818=>1000,30819=>1000,30820=>1000,30821=>1000,30822=>1000,30823=>1000,30824=>1000,30825=>1000,30826=>1000,30827=>1000,30828=>1000,30829=>1000,30830=>1000,30831=>1000,30832=>1000,30833=>1000,30834=>1000,30835=>1000,30836=>1000,30837=>1000,30838=>1000,30839=>1000,30840=>1000,30841=>1000,30842=>1000,30843=>1000,30844=>1000,30845=>1000,30846=>1000,30847=>1000,30848=>1000,30849=>1000,30850=>1000,30851=>1000,30852=>1000,30853=>1000,30854=>1000,30855=>1000,30856=>1000,30857=>1000,30858=>1000,30859=>1000,30860=>1000,30861=>1000,30862=>1000,30863=>1000,30864=>1000,30865=>1000,30866=>1000,30867=>1000,30868=>1000,30869=>1000,30870=>1000,30871=>1000,30872=>1000,30873=>1000,30874=>1000,30875=>1000,30876=>1000,30877=>1000,30878=>1000,30879=>1000,30880=>1000,30881=>1000,30882=>1000,30883=>1000,30884=>1000,30885=>1000,30886=>1000,30887=>1000,30888=>1000,30889=>1000,30890=>1000,30891=>1000,30892=>1000,30893=>1000,30894=>1000,30895=>1000,30896=>1000,30897=>1000,30898=>1000,30899=>1000,30900=>1000,30901=>1000,30902=>1000,30903=>1000,30904=>1000,30905=>1000,30906=>1000,30907=>1000,30908=>1000,30909=>1000,30910=>1000,30911=>1000,30912=>1000,30913=>1000,30914=>1000,30915=>1000,30916=>1000,30917=>1000,30918=>1000,30919=>1000,30920=>1000,30921=>1000,30922=>1000,30923=>1000,30924=>1000,30925=>1000,30926=>1000,30927=>1000,30928=>1000,30929=>1000,30930=>1000,30931=>1000,30932=>1000,30933=>1000,30934=>1000,30935=>1000,30936=>1000,30937=>1000,30938=>1000,30939=>1000,30940=>1000,30941=>1000,30942=>1000,30943=>1000,30944=>1000,30945=>1000,30946=>1000,30947=>1000,30948=>1000,30949=>1000,30950=>1000,30951=>1000,30952=>1000,30953=>1000,30954=>1000,30955=>1000,30956=>1000,30957=>1000,30958=>1000,30959=>1000,30960=>1000,30961=>1000,30962=>1000,30963=>1000,30964=>1000,30965=>1000,30966=>1000,30967=>1000,30968=>1000,30969=>1000,30970=>1000,30971=>1000,30972=>1000,30973=>1000,30974=>1000,30975=>1000,30976=>1000,30977=>1000,30978=>1000,30979=>1000,30980=>1000,30981=>1000,30982=>1000,30983=>1000,30984=>1000,30985=>1000,30986=>1000,30987=>1000,30988=>1000,30989=>1000,30990=>1000,30991=>1000,30992=>1000,30993=>1000,30994=>1000,30995=>1000,30996=>1000,30997=>1000,30998=>1000,30999=>1000,31000=>1000,31001=>1000,31002=>1000,31003=>1000,31004=>1000,31005=>1000,31006=>1000,31007=>1000,31008=>1000,31009=>1000,31010=>1000,31011=>1000,31012=>1000,31013=>1000,31014=>1000,31015=>1000,31016=>1000,31017=>1000,31018=>1000,31019=>1000,31020=>1000,31021=>1000,31022=>1000,31023=>1000,31024=>1000,31025=>1000,31026=>1000,31027=>1000,31028=>1000,31029=>1000,31030=>1000,31031=>1000,31032=>1000,31033=>1000,31034=>1000,31035=>1000,31036=>1000,31037=>1000,31038=>1000,31039=>1000,31040=>1000,31041=>1000,31042=>1000,31043=>1000,31044=>1000,31045=>1000,31046=>1000,31047=>1000,31048=>1000,31049=>1000,31050=>1000,31051=>1000,31052=>1000,31053=>1000,31054=>1000,31055=>1000,31056=>1000,31057=>1000,31058=>1000,31059=>1000,31060=>1000,31061=>1000,31062=>1000,31063=>1000,31064=>1000,31065=>1000,31066=>1000,31067=>1000,31068=>1000,31069=>1000,31070=>1000,31071=>1000,31072=>1000,31073=>1000,31074=>1000,31075=>1000,31076=>1000,31077=>1000,31078=>1000,31079=>1000,31080=>1000,31081=>1000,31082=>1000,31083=>1000,31084=>1000,31085=>1000,31086=>1000,31087=>1000,31088=>1000,31089=>1000,31090=>1000,31091=>1000,31092=>1000,31093=>1000,31094=>1000,31095=>1000,31096=>1000,31097=>1000,31098=>1000,31099=>1000,31100=>1000,31101=>1000,31102=>1000,31103=>1000,31104=>1000,31105=>1000,31106=>1000,31107=>1000,31108=>1000,31109=>1000,31110=>1000,31111=>1000,31112=>1000,31113=>1000,31114=>1000,31115=>1000,31116=>1000,31117=>1000,31118=>1000,31119=>1000,31120=>1000,31121=>1000,31122=>1000,31123=>1000,31124=>1000,31125=>1000,31126=>1000,31127=>1000,31128=>1000,31129=>1000,31130=>1000,31131=>1000,31132=>1000,31133=>1000,31134=>1000,31135=>1000,31136=>1000,31137=>1000,31138=>1000,31139=>1000,31140=>1000,31141=>1000,31142=>1000,31143=>1000,31144=>1000,31145=>1000,31146=>1000,31147=>1000,31148=>1000,31149=>1000,31150=>1000,31151=>1000,31152=>1000,31153=>1000,31154=>1000,31155=>1000,31156=>1000,31157=>1000,31158=>1000,31159=>1000,31160=>1000,31161=>1000,31162=>1000,31163=>1000,31164=>1000,31165=>1000,31166=>1000,31167=>1000,31168=>1000,31169=>1000,31170=>1000,31171=>1000,31172=>1000,31173=>1000,31174=>1000,31175=>1000,31176=>1000,31177=>1000,31178=>1000,31179=>1000,31180=>1000,31181=>1000,31182=>1000,31183=>1000,31184=>1000,31185=>1000,31186=>1000,31187=>1000,31188=>1000,31189=>1000,31190=>1000,31191=>1000,31192=>1000,31193=>1000,31194=>1000,31195=>1000,31196=>1000,31197=>1000,31198=>1000,31199=>1000,31200=>1000,31201=>1000,31202=>1000,31203=>1000,31204=>1000,31205=>1000,31206=>1000,31207=>1000,31208=>1000,31209=>1000,31210=>1000,31211=>1000,31212=>1000,31213=>1000,31214=>1000,31215=>1000,31216=>1000,31217=>1000,31218=>1000,31219=>1000,31220=>1000,31221=>1000,31222=>1000,31223=>1000,31224=>1000,31225=>1000,31226=>1000,31227=>1000,31228=>1000,31229=>1000,31230=>1000,31231=>1000,31232=>1000,31233=>1000,31234=>1000,31235=>1000,31236=>1000,31237=>1000,31238=>1000,31239=>1000,31240=>1000,31241=>1000,31242=>1000,31243=>1000,31244=>1000,31245=>1000,31246=>1000,31247=>1000,31248=>1000,31249=>1000,31250=>1000,31251=>1000,31252=>1000,31253=>1000,31254=>1000,31255=>1000,31256=>1000,31257=>1000,31258=>1000,31259=>1000,31260=>1000,31261=>1000,31262=>1000,31263=>1000,31264=>1000,31265=>1000,31266=>1000,31267=>1000,31268=>1000,31269=>1000,31270=>1000,31271=>1000,31272=>1000,31273=>1000,31274=>1000,31275=>1000,31276=>1000,31277=>1000,31278=>1000,31279=>1000,31280=>1000,31281=>1000,31282=>1000,31283=>1000,31284=>1000,31285=>1000,31286=>1000,31287=>1000,31288=>1000,31289=>1000,31290=>1000,31291=>1000,31292=>1000,31293=>1000,31294=>1000,31295=>1000,31296=>1000,31297=>1000,31298=>1000,31299=>1000,31300=>1000,31301=>1000,31302=>1000,31303=>1000,31304=>1000,31305=>1000,31306=>1000,31307=>1000,31308=>1000,31309=>1000,31310=>1000,31311=>1000,31312=>1000,31313=>1000,31314=>1000,31315=>1000,31316=>1000,31317=>1000,31318=>1000,31319=>1000,31320=>1000,31321=>1000,31322=>1000,31323=>1000,31324=>1000,31325=>1000,31326=>1000,31327=>1000,31328=>1000,31329=>1000,31330=>1000,31331=>1000,31332=>1000,31333=>1000,31334=>1000,31335=>1000,31336=>1000,31337=>1000,31338=>1000,31339=>1000,31340=>1000,31341=>1000,31342=>1000,31343=>1000,31344=>1000,31345=>1000,31346=>1000,31347=>1000,31348=>1000,31349=>1000,31350=>1000,31351=>1000,31352=>1000,31353=>1000,31354=>1000,31355=>1000,31356=>1000,31357=>1000,31358=>1000,31359=>1000,31360=>1000,31361=>1000,31362=>1000,31363=>1000,31364=>1000,31365=>1000,31366=>1000,31367=>1000,31368=>1000,31369=>1000,31370=>1000,31371=>1000,31372=>1000,31373=>1000,31374=>1000,31375=>1000,31376=>1000,31377=>1000,31378=>1000,31379=>1000,31380=>1000,31381=>1000,31382=>1000,31383=>1000,31384=>1000,31385=>1000,31386=>1000,31387=>1000,31388=>1000,31389=>1000,31390=>1000,31391=>1000,31392=>1000,31393=>1000,31394=>1000,31395=>1000,31396=>1000,31397=>1000,31398=>1000,31399=>1000,31400=>1000,31401=>1000,31402=>1000,31403=>1000,31404=>1000,31405=>1000,31406=>1000,31407=>1000,31408=>1000,31409=>1000,31410=>1000,31411=>1000,31412=>1000,31413=>1000,31414=>1000,31415=>1000,31416=>1000,31417=>1000,31418=>1000,31419=>1000,31420=>1000,31421=>1000,31422=>1000,31423=>1000,31424=>1000,31425=>1000,31426=>1000,31427=>1000,31428=>1000,31429=>1000,31430=>1000,31431=>1000,31432=>1000,31433=>1000,31434=>1000,31435=>1000,31436=>1000,31437=>1000,31438=>1000,31439=>1000,31440=>1000,31441=>1000,31442=>1000,31443=>1000,31444=>1000,31445=>1000,31446=>1000,31447=>1000,31448=>1000,31449=>1000,31450=>1000,31451=>1000,31452=>1000,31453=>1000,31454=>1000,31455=>1000,31456=>1000,31457=>1000,31458=>1000,31459=>1000,31460=>1000,31461=>1000,31462=>1000,31463=>1000,31464=>1000,31465=>1000,31466=>1000,31467=>1000,31468=>1000,31469=>1000,31470=>1000,31471=>1000,31472=>1000,31473=>1000,31474=>1000,31475=>1000,31476=>1000,31477=>1000,31478=>1000,31479=>1000,31480=>1000,31481=>1000,31482=>1000,31483=>1000,31484=>1000,31485=>1000,31486=>1000,31487=>1000,31488=>1000,31489=>1000,31490=>1000,31491=>1000,31492=>1000,31493=>1000,31494=>1000,31495=>1000,31496=>1000,31497=>1000,31498=>1000,31499=>1000,31500=>1000,31501=>1000,31502=>1000,31503=>1000,31504=>1000,31505=>1000,31506=>1000,31507=>1000,31508=>1000,31509=>1000,31510=>1000,31511=>1000,31512=>1000,31513=>1000,31514=>1000,31515=>1000,31516=>1000,31517=>1000,31518=>1000,31519=>1000,31520=>1000,31521=>1000,31522=>1000,31523=>1000,31524=>1000,31525=>1000,31526=>1000,31527=>1000,31528=>1000,31529=>1000,31530=>1000,31531=>1000,31532=>1000,31533=>1000,31534=>1000,31535=>1000,31536=>1000,31537=>1000,31538=>1000,31539=>1000,31540=>1000,31541=>1000,31542=>1000,31543=>1000,31544=>1000,31545=>1000,31546=>1000,31547=>1000,31548=>1000,31549=>1000,31550=>1000,31551=>1000,31552=>1000,31553=>1000,31554=>1000,31555=>1000,31556=>1000,31557=>1000,31558=>1000,31559=>1000,31560=>1000,31561=>1000,31562=>1000,31563=>1000,31564=>1000,31565=>1000,31566=>1000,31567=>1000,31568=>1000,31569=>1000,31570=>1000,31571=>1000,31572=>1000,31573=>1000,31574=>1000,31575=>1000,31576=>1000,31577=>1000,31578=>1000,31579=>1000,31580=>1000,31581=>1000,31582=>1000,31583=>1000,31584=>1000,31585=>1000,31586=>1000,31587=>1000,31588=>1000,31589=>1000,31590=>1000,31591=>1000,31592=>1000,31593=>1000,31594=>1000,31595=>1000,31596=>1000,31597=>1000,31598=>1000,31599=>1000,31600=>1000,31601=>1000,31602=>1000,31603=>1000,31604=>1000,31605=>1000,31606=>1000,31607=>1000,31608=>1000,31609=>1000,31610=>1000,31611=>1000,31612=>1000,31613=>1000,31614=>1000,31615=>1000,31616=>1000,31617=>1000,31618=>1000,31619=>1000,31620=>1000,31621=>1000,31622=>1000,31623=>1000,31624=>1000,31625=>1000,31626=>1000,31627=>1000,31628=>1000,31629=>1000,31630=>1000,31631=>1000,31632=>1000,31633=>1000,31634=>1000,31635=>1000,31636=>1000,31637=>1000,31638=>1000,31639=>1000,31640=>1000,31641=>1000,31642=>1000,31643=>1000,31644=>1000,31645=>1000,31646=>1000,31647=>1000,31648=>1000,31649=>1000,31650=>1000,31651=>1000,31652=>1000,31653=>1000,31654=>1000,31655=>1000,31656=>1000,31657=>1000,31658=>1000,31659=>1000,31660=>1000,31661=>1000,31662=>1000,31663=>1000,31664=>1000,31665=>1000,31666=>1000,31667=>1000,31668=>1000,31669=>1000,31670=>1000,31671=>1000,31672=>1000,31673=>1000,31674=>1000,31675=>1000,31676=>1000,31677=>1000,31678=>1000,31679=>1000,31680=>1000,31681=>1000,31682=>1000,31683=>1000,31684=>1000,31685=>1000,31686=>1000,31687=>1000,31688=>1000,31689=>1000,31690=>1000,31691=>1000,31692=>1000,31693=>1000,31694=>1000,31695=>1000,31696=>1000,31697=>1000,31698=>1000,31699=>1000,31700=>1000,31701=>1000,31702=>1000,31703=>1000,31704=>1000,31705=>1000,31706=>1000,31707=>1000,31708=>1000,31709=>1000,31710=>1000,31711=>1000,31712=>1000,31713=>1000,31714=>1000,31715=>1000,31716=>1000,31717=>1000,31718=>1000,31719=>1000,31720=>1000,31721=>1000,31722=>1000,31723=>1000,31724=>1000,31725=>1000,31726=>1000,31727=>1000,31728=>1000,31729=>1000,31730=>1000,31731=>1000,31732=>1000,31733=>1000,31734=>1000,31735=>1000,31736=>1000,31737=>1000,31738=>1000,31739=>1000,31740=>1000,31741=>1000,31742=>1000,31743=>1000,31744=>1000,31745=>1000,31746=>1000,31747=>1000,31748=>1000,31749=>1000,31750=>1000,31751=>1000,31752=>1000,31753=>1000,31754=>1000,31755=>1000,31756=>1000,31757=>1000,31758=>1000,31759=>1000,31760=>1000,31761=>1000,31762=>1000,31763=>1000,31764=>1000,31765=>1000,31766=>1000,31767=>1000,31768=>1000,31769=>1000,31770=>1000,31771=>1000,31772=>1000,31773=>1000,31774=>1000,31775=>1000,31776=>1000,31777=>1000,31778=>1000,31779=>1000,31780=>1000,31781=>1000,31782=>1000,31783=>1000,31784=>1000,31785=>1000,31786=>1000,31787=>1000,31788=>1000,31789=>1000,31790=>1000,31791=>1000,31792=>1000,31793=>1000,31794=>1000,31795=>1000,31796=>1000,31797=>1000,31798=>1000,31799=>1000,31800=>1000,31801=>1000,31802=>1000,31803=>1000,31804=>1000,31805=>1000,31806=>1000,31807=>1000,31808=>1000,31809=>1000,31810=>1000,31811=>1000,31812=>1000,31813=>1000,31814=>1000,31815=>1000,31816=>1000,31817=>1000,31818=>1000,31819=>1000,31820=>1000,31821=>1000,31822=>1000,31823=>1000,31824=>1000,31825=>1000,31826=>1000,31827=>1000,31828=>1000,31829=>1000,31830=>1000,31831=>1000,31832=>1000,31833=>1000,31834=>1000,31835=>1000,31836=>1000,31837=>1000,31838=>1000,31839=>1000,31840=>1000,31841=>1000,31842=>1000,31843=>1000,31844=>1000,31845=>1000,31846=>1000,31847=>1000,31848=>1000,31849=>1000,31850=>1000,31851=>1000,31852=>1000,31853=>1000,31854=>1000,31855=>1000,31856=>1000,31857=>1000,31858=>1000,31859=>1000,31860=>1000,31861=>1000,31862=>1000,31863=>1000,31864=>1000,31865=>1000,31866=>1000,31867=>1000,31868=>1000,31869=>1000,31870=>1000,31871=>1000,31872=>1000,31873=>1000,31874=>1000,31875=>1000,31876=>1000,31877=>1000,31878=>1000,31879=>1000,31880=>1000,31881=>1000,31882=>1000,31883=>1000,31884=>1000,31885=>1000,31886=>1000,31887=>1000,31888=>1000,31889=>1000,31890=>1000,31891=>1000,31892=>1000,31893=>1000,31894=>1000,31895=>1000,31896=>1000,31897=>1000,31898=>1000,31899=>1000,31900=>1000,31901=>1000,31902=>1000,31903=>1000,31904=>1000,31905=>1000,31906=>1000,31907=>1000,31908=>1000,31909=>1000,31910=>1000,31911=>1000,31912=>1000,31913=>1000,31914=>1000,31915=>1000,31916=>1000,31917=>1000,31918=>1000,31919=>1000,31920=>1000,31921=>1000,31922=>1000,31923=>1000,31924=>1000,31925=>1000,31926=>1000,31927=>1000,31928=>1000,31929=>1000,31930=>1000,31931=>1000,31932=>1000,31933=>1000,31934=>1000,31935=>1000,31936=>1000,31937=>1000,31938=>1000,31939=>1000,31940=>1000,31941=>1000,31942=>1000,31943=>1000,31944=>1000,31945=>1000,31946=>1000,31947=>1000,31948=>1000,31949=>1000,31950=>1000,31951=>1000,31952=>1000,31953=>1000,31954=>1000,31955=>1000,31956=>1000,31957=>1000,31958=>1000,31959=>1000,31960=>1000,31961=>1000,31962=>1000,31963=>1000,31964=>1000,31965=>1000,31966=>1000,31967=>1000,31968=>1000,31969=>1000,31970=>1000,31971=>1000,31972=>1000,31973=>1000,31974=>1000,31975=>1000,31976=>1000,31977=>1000,31978=>1000,31979=>1000,31980=>1000,31981=>1000,31982=>1000,31983=>1000,31984=>1000,31985=>1000,31986=>1000,31987=>1000,31988=>1000,31989=>1000,31990=>1000,31991=>1000,31992=>1000,31993=>1000,31994=>1000,31995=>1000,31996=>1000,31997=>1000,31998=>1000,31999=>1000,32000=>1000,32001=>1000,32002=>1000,32003=>1000,32004=>1000,32005=>1000,32006=>1000,32007=>1000,32008=>1000,32009=>1000,32010=>1000,32011=>1000,32012=>1000,32013=>1000,32014=>1000,32015=>1000,32016=>1000,32017=>1000,32018=>1000,32019=>1000,32020=>1000,32021=>1000,32022=>1000,32023=>1000,32024=>1000,32025=>1000,32026=>1000,32027=>1000,32028=>1000,32029=>1000,32030=>1000,32031=>1000,32032=>1000,32033=>1000,32034=>1000,32035=>1000,32036=>1000,32037=>1000,32038=>1000,32039=>1000,32040=>1000,32041=>1000,32042=>1000,32043=>1000,32044=>1000,32045=>1000,32046=>1000,32047=>1000,32048=>1000,32049=>1000,32050=>1000,32051=>1000,32052=>1000,32053=>1000,32054=>1000,32055=>1000,32056=>1000,32057=>1000,32058=>1000,32059=>1000,32060=>1000,32061=>1000,32062=>1000,32063=>1000,32064=>1000,32065=>1000,32066=>1000,32067=>1000,32068=>1000,32069=>1000,32070=>1000,32071=>1000,32072=>1000,32073=>1000,32074=>1000,32075=>1000,32076=>1000,32077=>1000,32078=>1000,32079=>1000,32080=>1000,32081=>1000,32082=>1000,32083=>1000,32084=>1000,32085=>1000,32086=>1000,32087=>1000,32088=>1000,32089=>1000,32090=>1000,32091=>1000,32092=>1000,32093=>1000,32094=>1000,32095=>1000,32096=>1000,32097=>1000,32098=>1000,32099=>1000,32100=>1000,32101=>1000,32102=>1000,32103=>1000,32104=>1000,32105=>1000,32106=>1000,32107=>1000,32108=>1000,32109=>1000,32110=>1000,32111=>1000,32112=>1000,32113=>1000,32114=>1000,32115=>1000,32116=>1000,32117=>1000,32118=>1000,32119=>1000,32120=>1000,32121=>1000,32122=>1000,32123=>1000,32124=>1000,32125=>1000,32126=>1000,32127=>1000,32128=>1000,32129=>1000,32130=>1000,32131=>1000,32132=>1000,32133=>1000,32134=>1000,32135=>1000,32136=>1000,32137=>1000,32138=>1000,32139=>1000,32140=>1000,32141=>1000,32142=>1000,32143=>1000,32144=>1000,32145=>1000,32146=>1000,32147=>1000,32148=>1000,32149=>1000,32150=>1000,32151=>1000,32152=>1000,32153=>1000,32154=>1000,32155=>1000,32156=>1000,32157=>1000,32158=>1000,32159=>1000,32160=>1000,32161=>1000,32162=>1000,32163=>1000,32164=>1000,32165=>1000,32166=>1000,32167=>1000,32168=>1000,32169=>1000,32170=>1000,32171=>1000,32172=>1000,32173=>1000,32174=>1000,32175=>1000,32176=>1000,32177=>1000,32178=>1000,32179=>1000,32180=>1000,32181=>1000,32182=>1000,32183=>1000,32184=>1000,32185=>1000,32186=>1000,32187=>1000,32188=>1000,32189=>1000,32190=>1000,32191=>1000,32192=>1000,32193=>1000,32194=>1000,32195=>1000,32196=>1000,32197=>1000,32198=>1000,32199=>1000,32200=>1000,32201=>1000,32202=>1000,32203=>1000,32204=>1000,32205=>1000,32206=>1000,32207=>1000,32208=>1000,32209=>1000,32210=>1000,32211=>1000,32212=>1000,32213=>1000,32214=>1000,32215=>1000,32216=>1000,32217=>1000,32218=>1000,32219=>1000,32220=>1000,32221=>1000,32222=>1000,32223=>1000,32224=>1000,32225=>1000,32226=>1000,32227=>1000,32228=>1000,32229=>1000,32230=>1000,32231=>1000,32232=>1000,32233=>1000,32234=>1000,32235=>1000,32236=>1000,32237=>1000,32238=>1000,32239=>1000,32240=>1000,32241=>1000,32242=>1000,32243=>1000,32244=>1000,32245=>1000,32246=>1000,32247=>1000,32248=>1000,32249=>1000,32250=>1000,32251=>1000,32252=>1000,32253=>1000,32254=>1000,32255=>1000,32256=>1000,32257=>1000,32258=>1000,32259=>1000,32260=>1000,32261=>1000,32262=>1000,32263=>1000,32264=>1000,32265=>1000,32266=>1000,32267=>1000,32268=>1000,32269=>1000,32270=>1000,32271=>1000,32272=>1000,32273=>1000,32274=>1000,32275=>1000,32276=>1000,32277=>1000,32278=>1000,32279=>1000,32280=>1000,32281=>1000,32282=>1000,32283=>1000,32284=>1000,32285=>1000,32286=>1000,32287=>1000,32288=>1000,32289=>1000,32290=>1000,32291=>1000,32292=>1000,32293=>1000,32294=>1000,32295=>1000,32296=>1000,32297=>1000,32298=>1000,32299=>1000,32300=>1000,32301=>1000,32302=>1000,32303=>1000,32304=>1000,32305=>1000,32306=>1000,32307=>1000,32308=>1000,32309=>1000,32310=>1000,32311=>1000,32312=>1000,32313=>1000,32314=>1000,32315=>1000,32316=>1000,32317=>1000,32318=>1000,32319=>1000,32320=>1000,32321=>1000,32322=>1000,32323=>1000,32324=>1000,32325=>1000,32326=>1000,32327=>1000,32328=>1000,32329=>1000,32330=>1000,32331=>1000,32332=>1000,32333=>1000,32334=>1000,32335=>1000,32336=>1000,32337=>1000,32338=>1000,32339=>1000,32340=>1000,32341=>1000,32342=>1000,32343=>1000,32344=>1000,32345=>1000,32346=>1000,32347=>1000,32348=>1000,32349=>1000,32350=>1000,32351=>1000,32352=>1000,32353=>1000,32354=>1000,32355=>1000,32356=>1000,32357=>1000,32358=>1000,32359=>1000,32360=>1000,32361=>1000,32362=>1000,32363=>1000,32364=>1000,32365=>1000,32366=>1000,32367=>1000,32368=>1000,32369=>1000,32370=>1000,32371=>1000,32372=>1000,32373=>1000,32374=>1000,32375=>1000,32376=>1000,32377=>1000,32378=>1000,32379=>1000,32380=>1000,32381=>1000,32382=>1000,32383=>1000,32384=>1000,32385=>1000,32386=>1000,32387=>1000,32388=>1000,32389=>1000,32390=>1000,32391=>1000,32392=>1000,32393=>1000,32394=>1000,32395=>1000,32396=>1000,32397=>1000,32398=>1000,32399=>1000,32400=>1000,32401=>1000,32402=>1000,32403=>1000,32404=>1000,32405=>1000,32406=>1000,32407=>1000,32408=>1000,32409=>1000,32410=>1000,32411=>1000,32412=>1000,32413=>1000,32414=>1000,32415=>1000,32416=>1000,32417=>1000,32418=>1000,32419=>1000,32420=>1000,32421=>1000,32422=>1000,32423=>1000,32424=>1000,32425=>1000,32426=>1000,32427=>1000,32428=>1000,32429=>1000,32430=>1000,32431=>1000,32432=>1000,32433=>1000,32434=>1000,32435=>1000,32436=>1000,32437=>1000,32438=>1000,32439=>1000,32440=>1000,32441=>1000,32442=>1000,32443=>1000,32444=>1000,32445=>1000,32446=>1000,32447=>1000,32448=>1000,32449=>1000,32450=>1000,32451=>1000,32452=>1000,32453=>1000,32454=>1000,32455=>1000,32456=>1000,32457=>1000,32458=>1000,32459=>1000,32460=>1000,32461=>1000,32462=>1000,32463=>1000,32464=>1000,32465=>1000,32466=>1000,32467=>1000,32468=>1000,32469=>1000,32470=>1000,32471=>1000,32472=>1000,32473=>1000,32474=>1000,32475=>1000,32476=>1000,32477=>1000,32478=>1000,32479=>1000,32480=>1000,32481=>1000,32482=>1000,32483=>1000,32484=>1000,32485=>1000,32486=>1000,32487=>1000,32488=>1000,32489=>1000,32490=>1000,32491=>1000,32492=>1000,32493=>1000,32494=>1000,32495=>1000,32496=>1000,32497=>1000,32498=>1000,32499=>1000,32500=>1000,32501=>1000,32502=>1000,32503=>1000,32504=>1000,32505=>1000,32506=>1000,32507=>1000,32508=>1000,32509=>1000,32510=>1000,32511=>1000,32512=>1000,32513=>1000,32514=>1000,32515=>1000,32516=>1000,32517=>1000,32518=>1000,32519=>1000,32520=>1000,32521=>1000,32522=>1000,32523=>1000,32524=>1000,32525=>1000,32526=>1000,32527=>1000,32528=>1000,32529=>1000,32530=>1000,32531=>1000,32532=>1000,32533=>1000,32534=>1000,32535=>1000,32536=>1000,32537=>1000,32538=>1000,32539=>1000,32540=>1000,32541=>1000,32542=>1000,32543=>1000,32544=>1000,32545=>1000,32546=>1000,32547=>1000,32548=>1000,32549=>1000,32550=>1000,32551=>1000,32552=>1000,32553=>1000,32554=>1000,32555=>1000,32556=>1000,32557=>1000,32558=>1000,32559=>1000,32560=>1000,32561=>1000,32562=>1000,32563=>1000,32564=>1000,32565=>1000,32566=>1000,32567=>1000,32568=>1000,32569=>1000,32570=>1000,32571=>1000,32572=>1000,32573=>1000,32574=>1000,32575=>1000,32576=>1000,32577=>1000,32578=>1000,32579=>1000,32580=>1000,32581=>1000,32582=>1000,32583=>1000,32584=>1000,32585=>1000,32586=>1000,32587=>1000,32588=>1000,32589=>1000,32590=>1000,32591=>1000,32592=>1000,32593=>1000,32594=>1000,32595=>1000,32596=>1000,32597=>1000,32598=>1000,32599=>1000,32600=>1000,32601=>1000,32602=>1000,32603=>1000,32604=>1000,32605=>1000,32606=>1000,32607=>1000,32608=>1000,32609=>1000,32610=>1000,32611=>1000,32612=>1000,32613=>1000,32614=>1000,32615=>1000,32616=>1000,32617=>1000,32618=>1000,32619=>1000,32620=>1000,32621=>1000,32622=>1000,32623=>1000,32624=>1000,32625=>1000,32626=>1000,32627=>1000,32628=>1000,32629=>1000,32630=>1000,32631=>1000,32632=>1000,32633=>1000,32634=>1000,32635=>1000,32636=>1000,32637=>1000,32638=>1000,32639=>1000,32640=>1000,32641=>1000,32642=>1000,32643=>1000,32644=>1000,32645=>1000,32646=>1000,32647=>1000,32648=>1000,32649=>1000,32650=>1000,32651=>1000,32652=>1000,32653=>1000,32654=>1000,32655=>1000,32656=>1000,32657=>1000,32658=>1000,32659=>1000,32660=>1000,32661=>1000,32662=>1000,32663=>1000,32664=>1000,32665=>1000,32666=>1000,32667=>1000,32668=>1000,32669=>1000,32670=>1000,32671=>1000,32672=>1000,32673=>1000,32674=>1000,32675=>1000,32676=>1000,32677=>1000,32678=>1000,32679=>1000,32680=>1000,32681=>1000,32682=>1000,32683=>1000,32684=>1000,32685=>1000,32686=>1000,32687=>1000,32688=>1000,32689=>1000,32690=>1000,32691=>1000,32692=>1000,32693=>1000,32694=>1000,32695=>1000,32696=>1000,32697=>1000,32698=>1000,32699=>1000,32700=>1000,32701=>1000,32702=>1000,32703=>1000,32704=>1000,32705=>1000,32706=>1000,32707=>1000,32708=>1000,32709=>1000,32710=>1000,32711=>1000,32712=>1000,32713=>1000,32714=>1000,32715=>1000,32716=>1000,32717=>1000,32718=>1000,32719=>1000,32720=>1000,32721=>1000,32722=>1000,32723=>1000,32724=>1000,32725=>1000,32726=>1000,32727=>1000,32728=>1000,32729=>1000,32730=>1000,32731=>1000,32732=>1000,32733=>1000,32734=>1000,32735=>1000,32736=>1000,32737=>1000,32738=>1000,32739=>1000,32740=>1000,32741=>1000,32742=>1000,32743=>1000,32744=>1000,32745=>1000,32746=>1000,32747=>1000,32748=>1000,32749=>1000,32750=>1000,32751=>1000,32752=>1000,32753=>1000,32754=>1000,32755=>1000,32756=>1000,32757=>1000,32758=>1000,32759=>1000,32760=>1000,32761=>1000,32762=>1000,32763=>1000,32764=>1000,32765=>1000,32766=>1000,32767=>1000,32768=>1000,32769=>1000,32770=>1000,32771=>1000,32772=>1000,32773=>1000,32774=>1000,32775=>1000,32776=>1000,32777=>1000,32778=>1000,32779=>1000,32780=>1000,32781=>1000,32782=>1000,32783=>1000,32784=>1000,32785=>1000,32786=>1000,32787=>1000,32788=>1000,32789=>1000,32790=>1000,32791=>1000,32792=>1000,32793=>1000,32794=>1000,32795=>1000,32796=>1000,32797=>1000,32798=>1000,32799=>1000,32800=>1000,32801=>1000,32802=>1000,32803=>1000,32804=>1000,32805=>1000,32806=>1000,32807=>1000,32808=>1000,32809=>1000,32810=>1000,32811=>1000,32812=>1000,32813=>1000,32814=>1000,32815=>1000,32816=>1000,32817=>1000,32818=>1000,32819=>1000,32820=>1000,32821=>1000,32822=>1000,32823=>1000,32824=>1000,32825=>1000,32826=>1000,32827=>1000,32828=>1000,32829=>1000,32830=>1000,32831=>1000,32832=>1000,32833=>1000,32834=>1000,32835=>1000,32836=>1000,32837=>1000,32838=>1000,32839=>1000,32840=>1000,32841=>1000,32842=>1000,32843=>1000,32844=>1000,32845=>1000,32846=>1000,32847=>1000,32848=>1000,32849=>1000,32850=>1000,32851=>1000,32852=>1000,32853=>1000,32854=>1000,32855=>1000,32856=>1000,32857=>1000,32858=>1000,32859=>1000,32860=>1000,32861=>1000,32862=>1000,32863=>1000,32864=>1000,32865=>1000,32866=>1000,32867=>1000,32868=>1000,32869=>1000,32870=>1000,32871=>1000,32872=>1000,32873=>1000,32874=>1000,32875=>1000,32876=>1000,32877=>1000,32878=>1000,32879=>1000,32880=>1000,32881=>1000,32882=>1000,32883=>1000,32884=>1000,32885=>1000,32886=>1000,32887=>1000,32888=>1000,32889=>1000,32890=>1000,32891=>1000,32892=>1000,32893=>1000,32894=>1000,32895=>1000,32896=>1000,32897=>1000,32898=>1000,32899=>1000,32900=>1000,32901=>1000,32902=>1000,32903=>1000,32904=>1000,32905=>1000,32906=>1000,32907=>1000,32908=>1000,32909=>1000,32910=>1000,32911=>1000,32912=>1000,32913=>1000,32914=>1000,32915=>1000,32916=>1000,32917=>1000,32918=>1000,32919=>1000,32920=>1000,32921=>1000,32922=>1000,32923=>1000,32924=>1000,32925=>1000,32926=>1000,32927=>1000,32928=>1000,32929=>1000,32930=>1000,32931=>1000,32932=>1000,32933=>1000,32934=>1000,32935=>1000,32936=>1000,32937=>1000,32938=>1000,32939=>1000,32940=>1000,32941=>1000,32942=>1000,32943=>1000,32944=>1000,32945=>1000,32946=>1000,32947=>1000,32948=>1000,32949=>1000,32950=>1000,32951=>1000,32952=>1000,32953=>1000,32954=>1000,32955=>1000,32956=>1000,32957=>1000,32958=>1000,32959=>1000,32960=>1000,32961=>1000,32962=>1000,32963=>1000,32964=>1000,32965=>1000,32966=>1000,32967=>1000,32968=>1000,32969=>1000,32970=>1000,32971=>1000,32972=>1000,32973=>1000,32974=>1000,32975=>1000,32976=>1000,32977=>1000,32978=>1000,32979=>1000,32980=>1000,32981=>1000,32982=>1000,32983=>1000,32984=>1000,32985=>1000,32986=>1000,32987=>1000,32988=>1000,32989=>1000,32990=>1000,32991=>1000,32992=>1000,32993=>1000,32994=>1000,32995=>1000,32996=>1000,32997=>1000,32998=>1000,32999=>1000,33000=>1000,33001=>1000,33002=>1000,33003=>1000,33004=>1000,33005=>1000,33006=>1000,33007=>1000,33008=>1000,33009=>1000,33010=>1000,33011=>1000,33012=>1000,33013=>1000,33014=>1000,33015=>1000,33016=>1000,33017=>1000,33018=>1000,33019=>1000,33020=>1000,33021=>1000,33022=>1000,33023=>1000,33024=>1000,33025=>1000,33026=>1000,33027=>1000,33028=>1000,33029=>1000,33030=>1000,33031=>1000,33032=>1000,33033=>1000,33034=>1000,33035=>1000,33036=>1000,33037=>1000,33038=>1000,33039=>1000,33040=>1000,33041=>1000,33042=>1000,33043=>1000,33044=>1000,33045=>1000,33046=>1000,33047=>1000,33048=>1000,33049=>1000,33050=>1000,33051=>1000,33052=>1000,33053=>1000,33054=>1000,33055=>1000,33056=>1000,33057=>1000,33058=>1000,33059=>1000,33060=>1000,33061=>1000,33062=>1000,33063=>1000,33064=>1000,33065=>1000,33066=>1000,33067=>1000,33068=>1000,33069=>1000,33070=>1000,33071=>1000,33072=>1000,33073=>1000,33074=>1000,33075=>1000,33076=>1000,33077=>1000,33078=>1000,33079=>1000,33080=>1000,33081=>1000,33082=>1000,33083=>1000,33084=>1000,33085=>1000,33086=>1000,33087=>1000,33088=>1000,33089=>1000,33090=>1000,33091=>1000,33092=>1000,33093=>1000,33094=>1000,33095=>1000,33096=>1000,33097=>1000,33098=>1000,33099=>1000,33100=>1000,33101=>1000,33102=>1000,33103=>1000,33104=>1000,33105=>1000,33106=>1000,33107=>1000,33108=>1000,33109=>1000,33110=>1000,33111=>1000,33112=>1000,33113=>1000,33114=>1000,33115=>1000,33116=>1000,33117=>1000,33118=>1000,33119=>1000,33120=>1000,33121=>1000,33122=>1000,33123=>1000,33124=>1000,33125=>1000,33126=>1000,33127=>1000,33128=>1000,33129=>1000,33130=>1000,33131=>1000,33132=>1000,33133=>1000,33134=>1000,33135=>1000,33136=>1000,33137=>1000,33138=>1000,33139=>1000,33140=>1000,33141=>1000,33142=>1000,33143=>1000,33144=>1000,33145=>1000,33146=>1000,33147=>1000,33148=>1000,33149=>1000,33150=>1000,33151=>1000,33152=>1000,33153=>1000,33154=>1000,33155=>1000,33156=>1000,33157=>1000,33158=>1000,33159=>1000,33160=>1000,33161=>1000,33162=>1000,33163=>1000,33164=>1000,33165=>1000,33166=>1000,33167=>1000,33168=>1000,33169=>1000,33170=>1000,33171=>1000,33172=>1000,33173=>1000,33174=>1000,33175=>1000,33176=>1000,33177=>1000,33178=>1000,33179=>1000,33180=>1000,33181=>1000,33182=>1000,33183=>1000,33184=>1000,33185=>1000,33186=>1000,33187=>1000,33188=>1000,33189=>1000,33190=>1000,33191=>1000,33192=>1000,33193=>1000,33194=>1000,33195=>1000,33196=>1000,33197=>1000,33198=>1000,33199=>1000,33200=>1000,33201=>1000,33202=>1000,33203=>1000,33204=>1000,33205=>1000,33206=>1000,33207=>1000,33208=>1000,33209=>1000,33210=>1000,33211=>1000,33212=>1000,33213=>1000,33214=>1000,33215=>1000,33216=>1000,33217=>1000,33218=>1000,33219=>1000,33220=>1000,33221=>1000,33222=>1000,33223=>1000,33224=>1000,33225=>1000,33226=>1000,33227=>1000,33228=>1000,33229=>1000,33230=>1000,33231=>1000,33232=>1000,33233=>1000,33234=>1000,33235=>1000,33236=>1000,33237=>1000,33238=>1000,33239=>1000,33240=>1000,33241=>1000,33242=>1000,33243=>1000,33244=>1000,33245=>1000,33246=>1000,33247=>1000,33248=>1000,33249=>1000,33250=>1000,33251=>1000,33252=>1000,33253=>1000,33254=>1000,33255=>1000,33256=>1000,33257=>1000,33258=>1000,33259=>1000,33260=>1000,33261=>1000,33262=>1000,33263=>1000,33264=>1000,33265=>1000,33266=>1000,33267=>1000,33268=>1000,33269=>1000,33270=>1000,33271=>1000,33272=>1000,33273=>1000,33274=>1000,33275=>1000,33276=>1000,33277=>1000,33278=>1000,33279=>1000,33280=>1000,33281=>1000,33282=>1000,33283=>1000,33284=>1000,33285=>1000,33286=>1000,33287=>1000,33288=>1000,33289=>1000,33290=>1000,33291=>1000,33292=>1000,33293=>1000,33294=>1000,33295=>1000,33296=>1000,33297=>1000,33298=>1000,33299=>1000,33300=>1000,33301=>1000,33302=>1000,33303=>1000,33304=>1000,33305=>1000,33306=>1000,33307=>1000,33308=>1000,33309=>1000,33310=>1000,33311=>1000,33312=>1000,33313=>1000,33314=>1000,33315=>1000,33316=>1000,33317=>1000,33318=>1000,33319=>1000,33320=>1000,33321=>1000,33322=>1000,33323=>1000,33324=>1000,33325=>1000,33326=>1000,33327=>1000,33328=>1000,33329=>1000,33330=>1000,33331=>1000,33332=>1000,33333=>1000,33334=>1000,33335=>1000,33336=>1000,33337=>1000,33338=>1000,33339=>1000,33340=>1000,33341=>1000,33342=>1000,33343=>1000,33344=>1000,33345=>1000,33346=>1000,33347=>1000,33348=>1000,33349=>1000,33350=>1000,33351=>1000,33352=>1000,33353=>1000,33354=>1000,33355=>1000,33356=>1000,33357=>1000,33358=>1000,33359=>1000,33360=>1000,33361=>1000,33362=>1000,33363=>1000,33364=>1000,33365=>1000,33366=>1000,33367=>1000,33368=>1000,33369=>1000,33370=>1000,33371=>1000,33372=>1000,33373=>1000,33374=>1000,33375=>1000,33376=>1000,33377=>1000,33378=>1000,33379=>1000,33380=>1000,33381=>1000,33382=>1000,33383=>1000,33384=>1000,33385=>1000,33386=>1000,33387=>1000,33388=>1000,33389=>1000,33390=>1000,33391=>1000,33392=>1000,33393=>1000,33394=>1000,33395=>1000,33396=>1000,33397=>1000,33398=>1000,33399=>1000,33400=>1000,33401=>1000,33402=>1000,33403=>1000,33404=>1000,33405=>1000,33406=>1000,33407=>1000,33408=>1000,33409=>1000,33410=>1000,33411=>1000,33412=>1000,33413=>1000,33414=>1000,33415=>1000,33416=>1000,33417=>1000,33418=>1000,33419=>1000,33420=>1000,33421=>1000,33422=>1000,33423=>1000,33424=>1000,33425=>1000,33426=>1000,33427=>1000,33428=>1000,33429=>1000,33430=>1000,33431=>1000,33432=>1000,33433=>1000,33434=>1000,33435=>1000,33436=>1000,33437=>1000,33438=>1000,33439=>1000,33440=>1000,33441=>1000,33442=>1000,33443=>1000,33444=>1000,33445=>1000,33446=>1000,33447=>1000,33448=>1000,33449=>1000,33450=>1000,33451=>1000,33452=>1000,33453=>1000,33454=>1000,33455=>1000,33456=>1000,33457=>1000,33458=>1000,33459=>1000,33460=>1000,33461=>1000,33462=>1000,33463=>1000,33464=>1000,33465=>1000,33466=>1000,33467=>1000,33468=>1000,33469=>1000,33470=>1000,33471=>1000,33472=>1000,33473=>1000,33474=>1000,33475=>1000,33476=>1000,33477=>1000,33478=>1000,33479=>1000,33480=>1000,33481=>1000,33482=>1000,33483=>1000,33484=>1000,33485=>1000,33486=>1000,33487=>1000,33488=>1000,33489=>1000,33490=>1000,33491=>1000,33492=>1000,33493=>1000,33494=>1000,33495=>1000,33496=>1000,33497=>1000,33498=>1000,33499=>1000,33500=>1000,33501=>1000,33502=>1000,33503=>1000,33504=>1000,33505=>1000,33506=>1000,33507=>1000,33508=>1000,33509=>1000,33510=>1000,33511=>1000,33512=>1000,33513=>1000,33514=>1000,33515=>1000,33516=>1000,33517=>1000,33518=>1000,33519=>1000,33520=>1000,33521=>1000,33522=>1000,33523=>1000,33524=>1000,33525=>1000,33526=>1000,33527=>1000,33528=>1000,33529=>1000,33530=>1000,33531=>1000,33532=>1000,33533=>1000,33534=>1000,33535=>1000,33536=>1000,33537=>1000,33538=>1000,33539=>1000,33540=>1000,33541=>1000,33542=>1000,33543=>1000,33544=>1000,33545=>1000,33546=>1000,33547=>1000,33548=>1000,33549=>1000,33550=>1000,33551=>1000,33552=>1000,33553=>1000,33554=>1000,33555=>1000,33556=>1000,33557=>1000,33558=>1000,33559=>1000,33560=>1000,33561=>1000,33562=>1000,33563=>1000,33564=>1000,33565=>1000,33566=>1000,33567=>1000,33568=>1000,33569=>1000,33570=>1000,33571=>1000,33572=>1000,33573=>1000,33574=>1000,33575=>1000,33576=>1000,33577=>1000,33578=>1000,33579=>1000,33580=>1000,33581=>1000,33582=>1000,33583=>1000,33584=>1000,33585=>1000,33586=>1000,33587=>1000,33588=>1000,33589=>1000,33590=>1000,33591=>1000,33592=>1000,33593=>1000,33594=>1000,33595=>1000,33596=>1000,33597=>1000,33598=>1000,33599=>1000,33600=>1000,33601=>1000,33602=>1000,33603=>1000,33604=>1000,33605=>1000,33606=>1000,33607=>1000,33608=>1000,33609=>1000,33610=>1000,33611=>1000,33612=>1000,33613=>1000,33614=>1000,33615=>1000,33616=>1000,33617=>1000,33618=>1000,33619=>1000,33620=>1000,33621=>1000,33622=>1000,33623=>1000,33624=>1000,33625=>1000,33626=>1000,33627=>1000,33628=>1000,33629=>1000,33630=>1000,33631=>1000,33632=>1000,33633=>1000,33634=>1000,33635=>1000,33636=>1000,33637=>1000,33638=>1000,33639=>1000,33640=>1000,33641=>1000,33642=>1000,33643=>1000,33644=>1000,33645=>1000,33646=>1000,33647=>1000,33648=>1000,33649=>1000,33650=>1000,33651=>1000,33652=>1000,33653=>1000,33654=>1000,33655=>1000,33656=>1000,33657=>1000,33658=>1000,33659=>1000,33660=>1000,33661=>1000,33662=>1000,33663=>1000,33664=>1000,33665=>1000,33666=>1000,33667=>1000,33668=>1000,33669=>1000,33670=>1000,33671=>1000,33672=>1000,33673=>1000,33674=>1000,33675=>1000,33676=>1000,33677=>1000,33678=>1000,33679=>1000,33680=>1000,33681=>1000,33682=>1000,33683=>1000,33684=>1000,33685=>1000,33686=>1000,33687=>1000,33688=>1000,33689=>1000,33690=>1000,33691=>1000,33692=>1000,33693=>1000,33694=>1000,33695=>1000,33696=>1000,33697=>1000,33698=>1000,33699=>1000,33700=>1000,33701=>1000,33702=>1000,33703=>1000,33704=>1000,33705=>1000,33706=>1000,33707=>1000,33708=>1000,33709=>1000,33710=>1000,33711=>1000,33712=>1000,33713=>1000,33714=>1000,33715=>1000,33716=>1000,33717=>1000,33718=>1000,33719=>1000,33720=>1000,33721=>1000,33722=>1000,33723=>1000,33724=>1000,33725=>1000,33726=>1000,33727=>1000,33728=>1000,33729=>1000,33730=>1000,33731=>1000,33732=>1000,33733=>1000,33734=>1000,33735=>1000,33736=>1000,33737=>1000,33738=>1000,33739=>1000,33740=>1000,33741=>1000,33742=>1000,33743=>1000,33744=>1000,33745=>1000,33746=>1000,33747=>1000,33748=>1000,33749=>1000,33750=>1000,33751=>1000,33752=>1000,33753=>1000,33754=>1000,33755=>1000,33756=>1000,33757=>1000,33758=>1000,33759=>1000,33760=>1000,33761=>1000,33762=>1000,33763=>1000,33764=>1000,33765=>1000,33766=>1000,33767=>1000,33768=>1000,33769=>1000,33770=>1000,33771=>1000,33772=>1000,33773=>1000,33774=>1000,33775=>1000,33776=>1000,33777=>1000,33778=>1000,33779=>1000,33780=>1000,33781=>1000,33782=>1000,33783=>1000,33784=>1000,33785=>1000,33786=>1000,33787=>1000,33788=>1000,33789=>1000,33790=>1000,33791=>1000,33792=>1000,33793=>1000,33794=>1000,33795=>1000,33796=>1000,33797=>1000,33798=>1000,33799=>1000,33800=>1000,33801=>1000,33802=>1000,33803=>1000,33804=>1000,33805=>1000,33806=>1000,33807=>1000,33808=>1000,33809=>1000,33810=>1000,33811=>1000,33812=>1000,33813=>1000,33814=>1000,33815=>1000,33816=>1000,33817=>1000,33818=>1000,33819=>1000,33820=>1000,33821=>1000,33822=>1000,33823=>1000,33824=>1000,33825=>1000,33826=>1000,33827=>1000,33828=>1000,33829=>1000,33830=>1000,33831=>1000,33832=>1000,33833=>1000,33834=>1000,33835=>1000,33836=>1000,33837=>1000,33838=>1000,33839=>1000,33840=>1000,33841=>1000,33842=>1000,33843=>1000,33844=>1000,33845=>1000,33846=>1000,33847=>1000,33848=>1000,33849=>1000,33850=>1000,33851=>1000,33852=>1000,33853=>1000,33854=>1000,33855=>1000,33856=>1000,33857=>1000,33858=>1000,33859=>1000,33860=>1000,33861=>1000,33862=>1000,33863=>1000,33864=>1000,33865=>1000,33866=>1000,33867=>1000,33868=>1000,33869=>1000,33870=>1000,33871=>1000,33872=>1000,33873=>1000,33874=>1000,33875=>1000,33876=>1000,33877=>1000,33878=>1000,33879=>1000,33880=>1000,33881=>1000,33882=>1000,33883=>1000,33884=>1000,33885=>1000,33886=>1000,33887=>1000,33888=>1000,33889=>1000,33890=>1000,33891=>1000,33892=>1000,33893=>1000,33894=>1000,33895=>1000,33896=>1000,33897=>1000,33898=>1000,33899=>1000,33900=>1000,33901=>1000,33902=>1000,33903=>1000,33904=>1000,33905=>1000,33906=>1000,33907=>1000,33908=>1000,33909=>1000,33910=>1000,33911=>1000,33912=>1000,33913=>1000,33914=>1000,33915=>1000,33916=>1000,33917=>1000,33918=>1000,33919=>1000,33920=>1000,33921=>1000,33922=>1000,33923=>1000,33924=>1000,33925=>1000,33926=>1000,33927=>1000,33928=>1000,33929=>1000,33930=>1000,33931=>1000,33932=>1000,33933=>1000,33934=>1000,33935=>1000,33936=>1000,33937=>1000,33938=>1000,33939=>1000,33940=>1000,33941=>1000,33942=>1000,33943=>1000,33944=>1000,33945=>1000,33946=>1000,33947=>1000,33948=>1000,33949=>1000,33950=>1000,33951=>1000,33952=>1000,33953=>1000,33954=>1000,33955=>1000,33956=>1000,33957=>1000,33958=>1000,33959=>1000,33960=>1000,33961=>1000,33962=>1000,33963=>1000,33964=>1000,33965=>1000,33966=>1000,33967=>1000,33968=>1000,33969=>1000,33970=>1000,33971=>1000,33972=>1000,33973=>1000,33974=>1000,33975=>1000,33976=>1000,33977=>1000,33978=>1000,33979=>1000,33980=>1000,33981=>1000,33982=>1000,33983=>1000,33984=>1000,33985=>1000,33986=>1000,33987=>1000,33988=>1000,33989=>1000,33990=>1000,33991=>1000,33992=>1000,33993=>1000,33994=>1000,33995=>1000,33996=>1000,33997=>1000,33998=>1000,33999=>1000,34000=>1000,34001=>1000,34002=>1000,34003=>1000,34004=>1000,34005=>1000,34006=>1000,34007=>1000,34008=>1000,34009=>1000,34010=>1000,34011=>1000,34012=>1000,34013=>1000,34014=>1000,34015=>1000,34016=>1000,34017=>1000,34018=>1000,34019=>1000,34020=>1000,34021=>1000,34022=>1000,34023=>1000,34024=>1000,34025=>1000,34026=>1000,34027=>1000,34028=>1000,34029=>1000,34030=>1000,34031=>1000,34032=>1000,34033=>1000,34034=>1000,34035=>1000,34036=>1000,34037=>1000,34038=>1000,34039=>1000,34040=>1000,34041=>1000,34042=>1000,34043=>1000,34044=>1000,34045=>1000,34046=>1000,34047=>1000,34048=>1000,34049=>1000,34050=>1000,34051=>1000,34052=>1000,34053=>1000,34054=>1000,34055=>1000,34056=>1000,34057=>1000,34058=>1000,34059=>1000,34060=>1000,34061=>1000,34062=>1000,34063=>1000,34064=>1000,34065=>1000,34066=>1000,34067=>1000,34068=>1000,34069=>1000,34070=>1000,34071=>1000,34072=>1000,34073=>1000,34074=>1000,34075=>1000,34076=>1000,34077=>1000,34078=>1000,34079=>1000,34080=>1000,34081=>1000,34082=>1000,34083=>1000,34084=>1000,34085=>1000,34086=>1000,34087=>1000,34088=>1000,34089=>1000,34090=>1000,34091=>1000,34092=>1000,34093=>1000,34094=>1000,34095=>1000,34096=>1000,34097=>1000,34098=>1000,34099=>1000,34100=>1000,34101=>1000,34102=>1000,34103=>1000,34104=>1000,34105=>1000,34106=>1000,34107=>1000,34108=>1000,34109=>1000,34110=>1000,34111=>1000,34112=>1000,34113=>1000,34114=>1000,34115=>1000,34116=>1000,34117=>1000,34118=>1000,34119=>1000,34120=>1000,34121=>1000,34122=>1000,34123=>1000,34124=>1000,34125=>1000,34126=>1000,34127=>1000,34128=>1000,34129=>1000,34130=>1000,34131=>1000,34132=>1000,34133=>1000,34134=>1000,34135=>1000,34136=>1000,34137=>1000,34138=>1000,34139=>1000,34140=>1000,34141=>1000,34142=>1000,34143=>1000,34144=>1000,34145=>1000,34146=>1000,34147=>1000,34148=>1000,34149=>1000,34150=>1000,34151=>1000,34152=>1000,34153=>1000,34154=>1000,34155=>1000,34156=>1000,34157=>1000,34158=>1000,34159=>1000,34160=>1000,34161=>1000,34162=>1000,34163=>1000,34164=>1000,34165=>1000,34166=>1000,34167=>1000,34168=>1000,34169=>1000,34170=>1000,34171=>1000,34172=>1000,34173=>1000,34174=>1000,34175=>1000,34176=>1000,34177=>1000,34178=>1000,34179=>1000,34180=>1000,34181=>1000,34182=>1000,34183=>1000,34184=>1000,34185=>1000,34186=>1000,34187=>1000,34188=>1000,34189=>1000,34190=>1000,34191=>1000,34192=>1000,34193=>1000,34194=>1000,34195=>1000,34196=>1000,34197=>1000,34198=>1000,34199=>1000,34200=>1000,34201=>1000,34202=>1000,34203=>1000,34204=>1000,34205=>1000,34206=>1000,34207=>1000,34208=>1000,34209=>1000,34210=>1000,34211=>1000,34212=>1000,34213=>1000,34214=>1000,34215=>1000,34216=>1000,34217=>1000,34218=>1000,34219=>1000,34220=>1000,34221=>1000,34222=>1000,34223=>1000,34224=>1000,34225=>1000,34226=>1000,34227=>1000,34228=>1000,34229=>1000,34230=>1000,34231=>1000,34232=>1000,34233=>1000,34234=>1000,34235=>1000,34236=>1000,34237=>1000,34238=>1000,34239=>1000,34240=>1000,34241=>1000,34242=>1000,34243=>1000,34244=>1000,34245=>1000,34246=>1000,34247=>1000,34248=>1000,34249=>1000,34250=>1000,34251=>1000,34252=>1000,34253=>1000,34254=>1000,34255=>1000,34256=>1000,34257=>1000,34258=>1000,34259=>1000,34260=>1000,34261=>1000,34262=>1000,34263=>1000,34264=>1000,34265=>1000,34266=>1000,34267=>1000,34268=>1000,34269=>1000,34270=>1000,34271=>1000,34272=>1000,34273=>1000,34274=>1000,34275=>1000,34276=>1000,34277=>1000,34278=>1000,34279=>1000,34280=>1000,34281=>1000,34282=>1000,34283=>1000,34284=>1000,34285=>1000,34286=>1000,34287=>1000,34288=>1000,34289=>1000,34290=>1000,34291=>1000,34292=>1000,34293=>1000,34294=>1000,34295=>1000,34296=>1000,34297=>1000,34298=>1000,34299=>1000,34300=>1000,34301=>1000,34302=>1000,34303=>1000,34304=>1000,34305=>1000,34306=>1000,34307=>1000,34308=>1000,34309=>1000,34310=>1000,34311=>1000,34312=>1000,34313=>1000,34314=>1000,34315=>1000,34316=>1000,34317=>1000,34318=>1000,34319=>1000,34320=>1000,34321=>1000,34322=>1000,34323=>1000,34324=>1000,34325=>1000,34326=>1000,34327=>1000,34328=>1000,34329=>1000,34330=>1000,34331=>1000,34332=>1000,34333=>1000,34334=>1000,34335=>1000,34336=>1000,34337=>1000,34338=>1000,34339=>1000,34340=>1000,34341=>1000,34342=>1000,34343=>1000,34344=>1000,34345=>1000,34346=>1000,34347=>1000,34348=>1000,34349=>1000,34350=>1000,34351=>1000,34352=>1000,34353=>1000,34354=>1000,34355=>1000,34356=>1000,34357=>1000,34358=>1000,34359=>1000,34360=>1000,34361=>1000,34362=>1000,34363=>1000,34364=>1000,34365=>1000,34366=>1000,34367=>1000,34368=>1000,34369=>1000,34370=>1000,34371=>1000,34372=>1000,34373=>1000,34374=>1000,34375=>1000,34376=>1000,34377=>1000,34378=>1000,34379=>1000,34380=>1000,34381=>1000,34382=>1000,34383=>1000,34384=>1000,34385=>1000,34386=>1000,34387=>1000,34388=>1000,34389=>1000,34390=>1000,34391=>1000,34392=>1000,34393=>1000,34394=>1000,34395=>1000,34396=>1000,34397=>1000,34398=>1000,34399=>1000,34400=>1000,34401=>1000,34402=>1000,34403=>1000,34404=>1000,34405=>1000,34406=>1000,34407=>1000,34408=>1000,34409=>1000,34410=>1000,34411=>1000,34412=>1000,34413=>1000,34414=>1000,34415=>1000,34416=>1000,34417=>1000,34418=>1000,34419=>1000,34420=>1000,34421=>1000,34422=>1000,34423=>1000,34424=>1000,34425=>1000,34426=>1000,34427=>1000,34428=>1000,34429=>1000,34430=>1000,34431=>1000,34432=>1000,34433=>1000,34434=>1000,34435=>1000,34436=>1000,34437=>1000,34438=>1000,34439=>1000,34440=>1000,34441=>1000,34442=>1000,34443=>1000,34444=>1000,34445=>1000,34446=>1000,34447=>1000,34448=>1000,34449=>1000,34450=>1000,34451=>1000,34452=>1000,34453=>1000,34454=>1000,34455=>1000,34456=>1000,34457=>1000,34458=>1000,34459=>1000,34460=>1000,34461=>1000,34462=>1000,34463=>1000,34464=>1000,34465=>1000,34466=>1000,34467=>1000,34468=>1000,34469=>1000,34470=>1000,34471=>1000,34472=>1000,34473=>1000,34474=>1000,34475=>1000,34476=>1000,34477=>1000,34478=>1000,34479=>1000,34480=>1000,34481=>1000,34482=>1000,34483=>1000,34484=>1000,34485=>1000,34486=>1000,34487=>1000,34488=>1000,34489=>1000,34490=>1000,34491=>1000,34492=>1000,34493=>1000,34494=>1000,34495=>1000,34496=>1000,34497=>1000,34498=>1000,34499=>1000,34500=>1000,34501=>1000,34502=>1000,34503=>1000,34504=>1000,34505=>1000,34506=>1000,34507=>1000,34508=>1000,34509=>1000,34510=>1000,34511=>1000,34512=>1000,34513=>1000,34514=>1000,34515=>1000,34516=>1000,34517=>1000,34518=>1000,34519=>1000,34520=>1000,34521=>1000,34522=>1000,34523=>1000,34524=>1000,34525=>1000,34526=>1000,34527=>1000,34528=>1000,34529=>1000,34530=>1000,34531=>1000,34532=>1000,34533=>1000,34534=>1000,34535=>1000,34536=>1000,34537=>1000,34538=>1000,34539=>1000,34540=>1000,34541=>1000,34542=>1000,34543=>1000,34544=>1000,34545=>1000,34546=>1000,34547=>1000,34548=>1000,34549=>1000,34550=>1000,34551=>1000,34552=>1000,34553=>1000,34554=>1000,34555=>1000,34556=>1000,34557=>1000,34558=>1000,34559=>1000,34560=>1000,34561=>1000,34562=>1000,34563=>1000,34564=>1000,34565=>1000,34566=>1000,34567=>1000,34568=>1000,34569=>1000,34570=>1000,34571=>1000,34572=>1000,34573=>1000,34574=>1000,34575=>1000,34576=>1000,34577=>1000,34578=>1000,34579=>1000,34580=>1000,34581=>1000,34582=>1000,34583=>1000,34584=>1000,34585=>1000,34586=>1000,34587=>1000,34588=>1000,34589=>1000,34590=>1000,34591=>1000,34592=>1000,34593=>1000,34594=>1000,34595=>1000,34596=>1000,34597=>1000,34598=>1000,34599=>1000,34600=>1000,34601=>1000,34602=>1000,34603=>1000,34604=>1000,34605=>1000,34606=>1000,34607=>1000,34608=>1000,34609=>1000,34610=>1000,34611=>1000,34612=>1000,34613=>1000,34614=>1000,34615=>1000,34616=>1000,34617=>1000,34618=>1000,34619=>1000,34620=>1000,34621=>1000,34622=>1000,34623=>1000,34624=>1000,34625=>1000,34626=>1000,34627=>1000,34628=>1000,34629=>1000,34630=>1000,34631=>1000,34632=>1000,34633=>1000,34634=>1000,34635=>1000,34636=>1000,34637=>1000,34638=>1000,34639=>1000,34640=>1000,34641=>1000,34642=>1000,34643=>1000,34644=>1000,34645=>1000,34646=>1000,34647=>1000,34648=>1000,34649=>1000,34650=>1000,34651=>1000,34652=>1000,34653=>1000,34654=>1000,34655=>1000,34656=>1000,34657=>1000,34658=>1000,34659=>1000,34660=>1000,34661=>1000,34662=>1000,34663=>1000,34664=>1000,34665=>1000,34666=>1000,34667=>1000,34668=>1000,34669=>1000,34670=>1000,34671=>1000,34672=>1000,34673=>1000,34674=>1000,34675=>1000,34676=>1000,34677=>1000,34678=>1000,34679=>1000,34680=>1000,34681=>1000,34682=>1000,34683=>1000,34684=>1000,34685=>1000,34686=>1000,34687=>1000,34688=>1000,34689=>1000,34690=>1000,34691=>1000,34692=>1000,34693=>1000,34694=>1000,34695=>1000,34696=>1000,34697=>1000,34698=>1000,34699=>1000,34700=>1000,34701=>1000,34702=>1000,34703=>1000,34704=>1000,34705=>1000,34706=>1000,34707=>1000,34708=>1000,34709=>1000,34710=>1000,34711=>1000,34712=>1000,34713=>1000,34714=>1000,34715=>1000,34716=>1000,34717=>1000,34718=>1000,34719=>1000,34720=>1000,34721=>1000,34722=>1000,34723=>1000,34724=>1000,34725=>1000,34726=>1000,34727=>1000,34728=>1000,34729=>1000,34730=>1000,34731=>1000,34732=>1000,34733=>1000,34734=>1000,34735=>1000,34736=>1000,34737=>1000,34738=>1000,34739=>1000,34740=>1000,34741=>1000,34742=>1000,34743=>1000,34744=>1000,34745=>1000,34746=>1000,34747=>1000,34748=>1000,34749=>1000,34750=>1000,34751=>1000,34752=>1000,34753=>1000,34754=>1000,34755=>1000,34756=>1000,34757=>1000,34758=>1000,34759=>1000,34760=>1000,34761=>1000,34762=>1000,34763=>1000,34764=>1000,34765=>1000,34766=>1000,34767=>1000,34768=>1000,34769=>1000,34770=>1000,34771=>1000,34772=>1000,34773=>1000,34774=>1000,34775=>1000,34776=>1000,34777=>1000,34778=>1000,34779=>1000,34780=>1000,34781=>1000,34782=>1000,34783=>1000,34784=>1000,34785=>1000,34786=>1000,34787=>1000,34788=>1000,34789=>1000,34790=>1000,34791=>1000,34792=>1000,34793=>1000,34794=>1000,34795=>1000,34796=>1000,34797=>1000,34798=>1000,34799=>1000,34800=>1000,34801=>1000,34802=>1000,34803=>1000,34804=>1000,34805=>1000,34806=>1000,34807=>1000,34808=>1000,34809=>1000,34810=>1000,34811=>1000,34812=>1000,34813=>1000,34814=>1000,34815=>1000,34816=>1000,34817=>1000,34818=>1000,34819=>1000,34820=>1000,34821=>1000,34822=>1000,34823=>1000,34824=>1000,34825=>1000,34826=>1000,34827=>1000,34828=>1000,34829=>1000,34830=>1000,34831=>1000,34832=>1000,34833=>1000,34834=>1000,34835=>1000,34836=>1000,34837=>1000,34838=>1000,34839=>1000,34840=>1000,34841=>1000,34842=>1000,34843=>1000,34844=>1000,34845=>1000,34846=>1000,34847=>1000,34848=>1000,34849=>1000,34850=>1000,34851=>1000,34852=>1000,34853=>1000,34854=>1000,34855=>1000,34856=>1000,34857=>1000,34858=>1000,34859=>1000,34860=>1000,34861=>1000,34862=>1000,34863=>1000,34864=>1000,34865=>1000,34866=>1000,34867=>1000,34868=>1000,34869=>1000,34870=>1000,34871=>1000,34872=>1000,34873=>1000,34874=>1000,34875=>1000,34876=>1000,34877=>1000,34878=>1000,34879=>1000,34880=>1000,34881=>1000,34882=>1000,34883=>1000,34884=>1000,34885=>1000,34886=>1000,34887=>1000,34888=>1000,34889=>1000,34890=>1000,34891=>1000,34892=>1000,34893=>1000,34894=>1000,34895=>1000,34896=>1000,34897=>1000,34898=>1000,34899=>1000,34900=>1000,34901=>1000,34902=>1000,34903=>1000,34904=>1000,34905=>1000,34906=>1000,34907=>1000,34908=>1000,34909=>1000,34910=>1000,34911=>1000,34912=>1000,34913=>1000,34914=>1000,34915=>1000,34916=>1000,34917=>1000,34918=>1000,34919=>1000,34920=>1000,34921=>1000,34922=>1000,34923=>1000,34924=>1000,34925=>1000,34926=>1000,34927=>1000,34928=>1000,34929=>1000,34930=>1000,34931=>1000,34932=>1000,34933=>1000,34934=>1000,34935=>1000,34936=>1000,34937=>1000,34938=>1000,34939=>1000,34940=>1000,34941=>1000,34942=>1000,34943=>1000,34944=>1000,34945=>1000,34946=>1000,34947=>1000,34948=>1000,34949=>1000,34950=>1000,34951=>1000,34952=>1000,34953=>1000,34954=>1000,34955=>1000,34956=>1000,34957=>1000,34958=>1000,34959=>1000,34960=>1000,34961=>1000,34962=>1000,34963=>1000,34964=>1000,34965=>1000,34966=>1000,34967=>1000,34968=>1000,34969=>1000,34970=>1000,34971=>1000,34972=>1000,34973=>1000,34974=>1000,34975=>1000,34976=>1000,34977=>1000,34978=>1000,34979=>1000,34980=>1000,34981=>1000,34982=>1000,34983=>1000,34984=>1000,34985=>1000,34986=>1000,34987=>1000,34988=>1000,34989=>1000,34990=>1000,34991=>1000,34992=>1000,34993=>1000,34994=>1000,34995=>1000,34996=>1000,34997=>1000,34998=>1000,34999=>1000,35000=>1000,35001=>1000,35002=>1000,35003=>1000,35004=>1000,35005=>1000,35006=>1000,35007=>1000,35008=>1000,35009=>1000,35010=>1000,35011=>1000,35012=>1000,35013=>1000,35014=>1000,35015=>1000,35016=>1000,35017=>1000,35018=>1000,35019=>1000,35020=>1000,35021=>1000,35022=>1000,35023=>1000,35024=>1000,35025=>1000,35026=>1000,35027=>1000,35028=>1000,35029=>1000,35030=>1000,35031=>1000,35032=>1000,35033=>1000,35034=>1000,35035=>1000,35036=>1000,35037=>1000,35038=>1000,35039=>1000,35040=>1000,35041=>1000,35042=>1000,35043=>1000,35044=>1000,35045=>1000,35046=>1000,35047=>1000,35048=>1000,35049=>1000,35050=>1000,35051=>1000,35052=>1000,35053=>1000,35054=>1000,35055=>1000,35056=>1000,35057=>1000,35058=>1000,35059=>1000,35060=>1000,35061=>1000,35062=>1000,35063=>1000,35064=>1000,35065=>1000,35066=>1000,35067=>1000,35068=>1000,35069=>1000,35070=>1000,35071=>1000,35072=>1000,35073=>1000,35074=>1000,35075=>1000,35076=>1000,35077=>1000,35078=>1000,35079=>1000,35080=>1000,35081=>1000,35082=>1000,35083=>1000,35084=>1000,35085=>1000,35086=>1000,35087=>1000,35088=>1000,35089=>1000,35090=>1000,35091=>1000,35092=>1000,35093=>1000,35094=>1000,35095=>1000,35096=>1000,35097=>1000,35098=>1000,35099=>1000,35100=>1000,35101=>1000,35102=>1000,35103=>1000,35104=>1000,35105=>1000,35106=>1000,35107=>1000,35108=>1000,35109=>1000,35110=>1000,35111=>1000,35112=>1000,35113=>1000,35114=>1000,35115=>1000,35116=>1000,35117=>1000,35118=>1000,35119=>1000,35120=>1000,35121=>1000,35122=>1000,35123=>1000,35124=>1000,35125=>1000,35126=>1000,35127=>1000,35128=>1000,35129=>1000,35130=>1000,35131=>1000,35132=>1000,35133=>1000,35134=>1000,35135=>1000,35136=>1000,35137=>1000,35138=>1000,35139=>1000,35140=>1000,35141=>1000,35142=>1000,35143=>1000,35144=>1000,35145=>1000,35146=>1000,35147=>1000,35148=>1000,35149=>1000,35150=>1000,35151=>1000,35152=>1000,35153=>1000,35154=>1000,35155=>1000,35156=>1000,35157=>1000,35158=>1000,35159=>1000,35160=>1000,35161=>1000,35162=>1000,35163=>1000,35164=>1000,35165=>1000,35166=>1000,35167=>1000,35168=>1000,35169=>1000,35170=>1000,35171=>1000,35172=>1000,35173=>1000,35174=>1000,35175=>1000,35176=>1000,35177=>1000,35178=>1000,35179=>1000,35180=>1000,35181=>1000,35182=>1000,35183=>1000,35184=>1000,35185=>1000,35186=>1000,35187=>1000,35188=>1000,35189=>1000,35190=>1000,35191=>1000,35192=>1000,35193=>1000,35194=>1000,35195=>1000,35196=>1000,35197=>1000,35198=>1000,35199=>1000,35200=>1000,35201=>1000,35202=>1000,35203=>1000,35204=>1000,35205=>1000,35206=>1000,35207=>1000,35208=>1000,35209=>1000,35210=>1000,35211=>1000,35212=>1000,35213=>1000,35214=>1000,35215=>1000,35216=>1000,35217=>1000,35218=>1000,35219=>1000,35220=>1000,35221=>1000,35222=>1000,35223=>1000,35224=>1000,35225=>1000,35226=>1000,35227=>1000,35228=>1000,35229=>1000,35230=>1000,35231=>1000,35232=>1000,35233=>1000,35234=>1000,35235=>1000,35236=>1000,35237=>1000,35238=>1000,35239=>1000,35240=>1000,35241=>1000,35242=>1000,35243=>1000,35244=>1000,35245=>1000,35246=>1000,35247=>1000,35248=>1000,35249=>1000,35250=>1000,35251=>1000,35252=>1000,35253=>1000,35254=>1000,35255=>1000,35256=>1000,35257=>1000,35258=>1000,35259=>1000,35260=>1000,35261=>1000,35262=>1000,35263=>1000,35264=>1000,35265=>1000,35266=>1000,35267=>1000,35268=>1000,35269=>1000,35270=>1000,35271=>1000,35272=>1000,35273=>1000,35274=>1000,35275=>1000,35276=>1000,35277=>1000,35278=>1000,35279=>1000,35280=>1000,35281=>1000,35282=>1000,35283=>1000,35284=>1000,35285=>1000,35286=>1000,35287=>1000,35288=>1000,35289=>1000,35290=>1000,35291=>1000,35292=>1000,35293=>1000,35294=>1000,35295=>1000,35296=>1000,35297=>1000,35298=>1000,35299=>1000,35300=>1000,35301=>1000,35302=>1000,35303=>1000,35304=>1000,35305=>1000,35306=>1000,35307=>1000,35308=>1000,35309=>1000,35310=>1000,35311=>1000,35312=>1000,35313=>1000,35314=>1000,35315=>1000,35316=>1000,35317=>1000,35318=>1000,35319=>1000,35320=>1000,35321=>1000,35322=>1000,35323=>1000,35324=>1000,35325=>1000,35326=>1000,35327=>1000,35328=>1000,35329=>1000,35330=>1000,35331=>1000,35332=>1000,35333=>1000,35334=>1000,35335=>1000,35336=>1000,35337=>1000,35338=>1000,35339=>1000,35340=>1000,35341=>1000,35342=>1000,35343=>1000,35344=>1000,35345=>1000,35346=>1000,35347=>1000,35348=>1000,35349=>1000,35350=>1000,35351=>1000,35352=>1000,35353=>1000,35354=>1000,35355=>1000,35356=>1000,35357=>1000,35358=>1000,35359=>1000,35360=>1000,35361=>1000,35362=>1000,35363=>1000,35364=>1000,35365=>1000,35366=>1000,35367=>1000,35368=>1000,35369=>1000,35370=>1000,35371=>1000,35372=>1000,35373=>1000,35374=>1000,35375=>1000,35376=>1000,35377=>1000,35378=>1000,35379=>1000,35380=>1000,35381=>1000,35382=>1000,35383=>1000,35384=>1000,35385=>1000,35386=>1000,35387=>1000,35388=>1000,35389=>1000,35390=>1000,35391=>1000,35392=>1000,35393=>1000,35394=>1000,35395=>1000,35396=>1000,35397=>1000,35398=>1000,35399=>1000,35400=>1000,35401=>1000,35402=>1000,35403=>1000,35404=>1000,35405=>1000,35406=>1000,35407=>1000,35408=>1000,35409=>1000,35410=>1000,35411=>1000,35412=>1000,35413=>1000,35414=>1000,35415=>1000,35416=>1000,35417=>1000,35418=>1000,35419=>1000,35420=>1000,35421=>1000,35422=>1000,35423=>1000,35424=>1000,35425=>1000,35426=>1000,35427=>1000,35428=>1000,35429=>1000,35430=>1000,35431=>1000,35432=>1000,35433=>1000,35434=>1000,35435=>1000,35436=>1000,35437=>1000,35438=>1000,35439=>1000,35440=>1000,35441=>1000,35442=>1000,35443=>1000,35444=>1000,35445=>1000,35446=>1000,35447=>1000,35448=>1000,35449=>1000,35450=>1000,35451=>1000,35452=>1000,35453=>1000,35454=>1000,35455=>1000,35456=>1000,35457=>1000,35458=>1000,35459=>1000,35460=>1000,35461=>1000,35462=>1000,35463=>1000,35464=>1000,35465=>1000,35466=>1000,35467=>1000,35468=>1000,35469=>1000,35470=>1000,35471=>1000,35472=>1000,35473=>1000,35474=>1000,35475=>1000,35476=>1000,35477=>1000,35478=>1000,35479=>1000,35480=>1000,35481=>1000,35482=>1000,35483=>1000,35484=>1000,35485=>1000,35486=>1000,35487=>1000,35488=>1000,35489=>1000,35490=>1000,35491=>1000,35492=>1000,35493=>1000,35494=>1000,35495=>1000,35496=>1000,35497=>1000,35498=>1000,35499=>1000,35500=>1000,35501=>1000,35502=>1000,35503=>1000,35504=>1000,35505=>1000,35506=>1000,35507=>1000,35508=>1000,35509=>1000,35510=>1000,35511=>1000,35512=>1000,35513=>1000,35514=>1000,35515=>1000,35516=>1000,35517=>1000,35518=>1000,35519=>1000,35520=>1000,35521=>1000,35522=>1000,35523=>1000,35524=>1000,35525=>1000,35526=>1000,35527=>1000,35528=>1000,35529=>1000,35530=>1000,35531=>1000,35532=>1000,35533=>1000,35534=>1000,35535=>1000,35536=>1000,35537=>1000,35538=>1000,35539=>1000,35540=>1000,35541=>1000,35542=>1000,35543=>1000,35544=>1000,35545=>1000,35546=>1000,35547=>1000,35548=>1000,35549=>1000,35550=>1000,35551=>1000,35552=>1000,35553=>1000,35554=>1000,35555=>1000,35556=>1000,35557=>1000,35558=>1000,35559=>1000,35560=>1000,35561=>1000,35562=>1000,35563=>1000,35564=>1000,35565=>1000,35566=>1000,35567=>1000,35568=>1000,35569=>1000,35570=>1000,35571=>1000,35572=>1000,35573=>1000,35574=>1000,35575=>1000,35576=>1000,35577=>1000,35578=>1000,35579=>1000,35580=>1000,35581=>1000,35582=>1000,35583=>1000,35584=>1000,35585=>1000,35586=>1000,35587=>1000,35588=>1000,35589=>1000,35590=>1000,35591=>1000,35592=>1000,35593=>1000,35594=>1000,35595=>1000,35596=>1000,35597=>1000,35598=>1000,35599=>1000,35600=>1000,35601=>1000,35602=>1000,35603=>1000,35604=>1000,35605=>1000,35606=>1000,35607=>1000,35608=>1000,35609=>1000,35610=>1000,35611=>1000,35612=>1000,35613=>1000,35614=>1000,35615=>1000,35616=>1000,35617=>1000,35618=>1000,35619=>1000,35620=>1000,35621=>1000,35622=>1000,35623=>1000,35624=>1000,35625=>1000,35626=>1000,35627=>1000,35628=>1000,35629=>1000,35630=>1000,35631=>1000,35632=>1000,35633=>1000,35634=>1000,35635=>1000,35636=>1000,35637=>1000,35638=>1000,35639=>1000,35640=>1000,35641=>1000,35642=>1000,35643=>1000,35644=>1000,35645=>1000,35646=>1000,35647=>1000,35648=>1000,35649=>1000,35650=>1000,35651=>1000,35652=>1000,35653=>1000,35654=>1000,35655=>1000,35656=>1000,35657=>1000,35658=>1000,35659=>1000,35660=>1000,35661=>1000,35662=>1000,35663=>1000,35664=>1000,35665=>1000,35666=>1000,35667=>1000,35668=>1000,35669=>1000,35670=>1000,35671=>1000,35672=>1000,35673=>1000,35674=>1000,35675=>1000,35676=>1000,35677=>1000,35678=>1000,35679=>1000,35680=>1000,35681=>1000,35682=>1000,35683=>1000,35684=>1000,35685=>1000,35686=>1000,35687=>1000,35688=>1000,35689=>1000,35690=>1000,35691=>1000,35692=>1000,35693=>1000,35694=>1000,35695=>1000,35696=>1000,35697=>1000,35698=>1000,35699=>1000,35700=>1000,35701=>1000,35702=>1000,35703=>1000,35704=>1000,35705=>1000,35706=>1000,35707=>1000,35708=>1000,35709=>1000,35710=>1000,35711=>1000,35712=>1000,35713=>1000,35714=>1000,35715=>1000,35716=>1000,35717=>1000,35718=>1000,35719=>1000,35720=>1000,35721=>1000,35722=>1000,35723=>1000,35724=>1000,35725=>1000,35726=>1000,35727=>1000,35728=>1000,35729=>1000,35730=>1000,35731=>1000,35732=>1000,35733=>1000,35734=>1000,35735=>1000,35736=>1000,35737=>1000,35738=>1000,35739=>1000,35740=>1000,35741=>1000,35742=>1000,35743=>1000,35744=>1000,35745=>1000,35746=>1000,35747=>1000,35748=>1000,35749=>1000,35750=>1000,35751=>1000,35752=>1000,35753=>1000,35754=>1000,35755=>1000,35756=>1000,35757=>1000,35758=>1000,35759=>1000,35760=>1000,35761=>1000,35762=>1000,35763=>1000,35764=>1000,35765=>1000,35766=>1000,35767=>1000,35768=>1000,35769=>1000,35770=>1000,35771=>1000,35772=>1000,35773=>1000,35774=>1000,35775=>1000,35776=>1000,35777=>1000,35778=>1000,35779=>1000,35780=>1000,35781=>1000,35782=>1000,35783=>1000,35784=>1000,35785=>1000,35786=>1000,35787=>1000,35788=>1000,35789=>1000,35790=>1000,35791=>1000,35792=>1000,35793=>1000,35794=>1000,35795=>1000,35796=>1000,35797=>1000,35798=>1000,35799=>1000,35800=>1000,35801=>1000,35802=>1000,35803=>1000,35804=>1000,35805=>1000,35806=>1000,35807=>1000,35808=>1000,35809=>1000,35810=>1000,35811=>1000,35812=>1000,35813=>1000,35814=>1000,35815=>1000,35816=>1000,35817=>1000,35818=>1000,35819=>1000,35820=>1000,35821=>1000,35822=>1000,35823=>1000,35824=>1000,35825=>1000,35826=>1000,35827=>1000,35828=>1000,35829=>1000,35830=>1000,35831=>1000,35832=>1000,35833=>1000,35834=>1000,35835=>1000,35836=>1000,35837=>1000,35838=>1000,35839=>1000,35840=>1000,35841=>1000,35842=>1000,35843=>1000,35844=>1000,35845=>1000,35846=>1000,35847=>1000,35848=>1000,35849=>1000,35850=>1000,35851=>1000,35852=>1000,35853=>1000,35854=>1000,35855=>1000,35856=>1000,35857=>1000,35858=>1000,35859=>1000,35860=>1000,35861=>1000,35862=>1000,35863=>1000,35864=>1000,35865=>1000,35866=>1000,35867=>1000,35868=>1000,35869=>1000,35870=>1000,35871=>1000,35872=>1000,35873=>1000,35874=>1000,35875=>1000,35876=>1000,35877=>1000,35878=>1000,35879=>1000,35880=>1000,35881=>1000,35882=>1000,35883=>1000,35884=>1000,35885=>1000,35886=>1000,35887=>1000,35888=>1000,35889=>1000,35890=>1000,35891=>1000,35892=>1000,35893=>1000,35894=>1000,35895=>1000,35896=>1000,35897=>1000,35898=>1000,35899=>1000,35900=>1000,35901=>1000,35902=>1000,35903=>1000,35904=>1000,35905=>1000,35906=>1000,35907=>1000,35908=>1000,35909=>1000,35910=>1000,35911=>1000,35912=>1000,35913=>1000,35914=>1000,35915=>1000,35916=>1000,35917=>1000,35918=>1000,35919=>1000,35920=>1000,35921=>1000,35922=>1000,35923=>1000,35924=>1000,35925=>1000,35926=>1000,35927=>1000,35928=>1000,35929=>1000,35930=>1000,35931=>1000,35932=>1000,35933=>1000,35934=>1000,35935=>1000,35936=>1000,35937=>1000,35938=>1000,35939=>1000,35940=>1000,35941=>1000,35942=>1000,35943=>1000,35944=>1000,35945=>1000,35946=>1000,35947=>1000,35948=>1000,35949=>1000,35950=>1000,35951=>1000,35952=>1000,35953=>1000,35954=>1000,35955=>1000,35956=>1000,35957=>1000,35958=>1000,35959=>1000,35960=>1000,35961=>1000,35962=>1000,35963=>1000,35964=>1000,35965=>1000,35966=>1000,35967=>1000,35968=>1000,35969=>1000,35970=>1000,35971=>1000,35972=>1000,35973=>1000,35974=>1000,35975=>1000,35976=>1000,35977=>1000,35978=>1000,35979=>1000,35980=>1000,35981=>1000,35982=>1000,35983=>1000,35984=>1000,35985=>1000,35986=>1000,35987=>1000,35988=>1000,35989=>1000,35990=>1000,35991=>1000,35992=>1000,35993=>1000,35994=>1000,35995=>1000,35996=>1000,35997=>1000,35998=>1000,35999=>1000,36000=>1000,36001=>1000,36002=>1000,36003=>1000,36004=>1000,36005=>1000,36006=>1000,36007=>1000,36008=>1000,36009=>1000,36010=>1000,36011=>1000,36012=>1000,36013=>1000,36014=>1000,36015=>1000,36016=>1000,36017=>1000,36018=>1000,36019=>1000,36020=>1000,36021=>1000,36022=>1000,36023=>1000,36024=>1000,36025=>1000,36026=>1000,36027=>1000,36028=>1000,36029=>1000,36030=>1000,36031=>1000,36032=>1000,36033=>1000,36034=>1000,36035=>1000,36036=>1000,36037=>1000,36038=>1000,36039=>1000,36040=>1000,36041=>1000,36042=>1000,36043=>1000,36044=>1000,36045=>1000,36046=>1000,36047=>1000,36048=>1000,36049=>1000,36050=>1000,36051=>1000,36052=>1000,36053=>1000,36054=>1000,36055=>1000,36056=>1000,36057=>1000,36058=>1000,36059=>1000,36060=>1000,36061=>1000,36062=>1000,36063=>1000,36064=>1000,36065=>1000,36066=>1000,36067=>1000,36068=>1000,36069=>1000,36070=>1000,36071=>1000,36072=>1000,36073=>1000,36074=>1000,36075=>1000,36076=>1000,36077=>1000,36078=>1000,36079=>1000,36080=>1000,36081=>1000,36082=>1000,36083=>1000,36084=>1000,36085=>1000,36086=>1000,36087=>1000,36088=>1000,36089=>1000,36090=>1000,36091=>1000,36092=>1000,36093=>1000,36094=>1000,36095=>1000,36096=>1000,36097=>1000,36098=>1000,36099=>1000,36100=>1000,36101=>1000,36102=>1000,36103=>1000,36104=>1000,36105=>1000,36106=>1000,36107=>1000,36108=>1000,36109=>1000,36110=>1000,36111=>1000,36112=>1000,36113=>1000,36114=>1000,36115=>1000,36116=>1000,36117=>1000,36118=>1000,36119=>1000,36120=>1000,36121=>1000,36122=>1000,36123=>1000,36124=>1000,36125=>1000,36126=>1000,36127=>1000,36128=>1000,36129=>1000,36130=>1000,36131=>1000,36132=>1000,36133=>1000,36134=>1000,36135=>1000,36136=>1000,36137=>1000,36138=>1000,36139=>1000,36140=>1000,36141=>1000,36142=>1000,36143=>1000,36144=>1000,36145=>1000,36146=>1000,36147=>1000,36148=>1000,36149=>1000,36150=>1000,36151=>1000,36152=>1000,36153=>1000,36154=>1000,36155=>1000,36156=>1000,36157=>1000,36158=>1000,36159=>1000,36160=>1000,36161=>1000,36162=>1000,36163=>1000,36164=>1000,36165=>1000,36166=>1000,36167=>1000,36168=>1000,36169=>1000,36170=>1000,36171=>1000,36172=>1000,36173=>1000,36174=>1000,36175=>1000,36176=>1000,36177=>1000,36178=>1000,36179=>1000,36180=>1000,36181=>1000,36182=>1000,36183=>1000,36184=>1000,36185=>1000,36186=>1000,36187=>1000,36188=>1000,36189=>1000,36190=>1000,36191=>1000,36192=>1000,36193=>1000,36194=>1000,36195=>1000,36196=>1000,36197=>1000,36198=>1000,36199=>1000,36200=>1000,36201=>1000,36202=>1000,36203=>1000,36204=>1000,36205=>1000,36206=>1000,36207=>1000,36208=>1000,36209=>1000,36210=>1000,36211=>1000,36212=>1000,36213=>1000,36214=>1000,36215=>1000,36216=>1000,36217=>1000,36218=>1000,36219=>1000,36220=>1000,36221=>1000,36222=>1000,36223=>1000,36224=>1000,36225=>1000,36226=>1000,36227=>1000,36228=>1000,36229=>1000,36230=>1000,36231=>1000,36232=>1000,36233=>1000,36234=>1000,36235=>1000,36236=>1000,36237=>1000,36238=>1000,36239=>1000,36240=>1000,36241=>1000,36242=>1000,36243=>1000,36244=>1000,36245=>1000,36246=>1000,36247=>1000,36248=>1000,36249=>1000,36250=>1000,36251=>1000,36252=>1000,36253=>1000,36254=>1000,36255=>1000,36256=>1000,36257=>1000,36258=>1000,36259=>1000,36260=>1000,36261=>1000,36262=>1000,36263=>1000,36264=>1000,36265=>1000,36266=>1000,36267=>1000,36268=>1000,36269=>1000,36270=>1000,36271=>1000,36272=>1000,36273=>1000,36274=>1000,36275=>1000,36276=>1000,36277=>1000,36278=>1000,36279=>1000,36280=>1000,36281=>1000,36282=>1000,36283=>1000,36284=>1000,36285=>1000,36286=>1000,36287=>1000,36288=>1000,36289=>1000,36290=>1000,36291=>1000,36292=>1000,36293=>1000,36294=>1000,36295=>1000,36296=>1000,36297=>1000,36298=>1000,36299=>1000,36300=>1000,36301=>1000,36302=>1000,36303=>1000,36304=>1000,36305=>1000,36306=>1000,36307=>1000,36308=>1000,36309=>1000,36310=>1000,36311=>1000,36312=>1000,36313=>1000,36314=>1000,36315=>1000,36316=>1000,36317=>1000,36318=>1000,36319=>1000,36320=>1000,36321=>1000,36322=>1000,36323=>1000,36324=>1000,36325=>1000,36326=>1000,36327=>1000,36328=>1000,36329=>1000,36330=>1000,36331=>1000,36332=>1000,36333=>1000,36334=>1000,36335=>1000,36336=>1000,36337=>1000,36338=>1000,36339=>1000,36340=>1000,36341=>1000,36342=>1000,36343=>1000,36344=>1000,36345=>1000,36346=>1000,36347=>1000,36348=>1000,36349=>1000,36350=>1000,36351=>1000,36352=>1000,36353=>1000,36354=>1000,36355=>1000,36356=>1000,36357=>1000,36358=>1000,36359=>1000,36360=>1000,36361=>1000,36362=>1000,36363=>1000,36364=>1000,36365=>1000,36366=>1000,36367=>1000,36368=>1000,36369=>1000,36370=>1000,36371=>1000,36372=>1000,36373=>1000,36374=>1000,36375=>1000,36376=>1000,36377=>1000,36378=>1000,36379=>1000,36380=>1000,36381=>1000,36382=>1000,36383=>1000,36384=>1000,36385=>1000,36386=>1000,36387=>1000,36388=>1000,36389=>1000,36390=>1000,36391=>1000,36392=>1000,36393=>1000,36394=>1000,36395=>1000,36396=>1000,36397=>1000,36398=>1000,36399=>1000,36400=>1000,36401=>1000,36402=>1000,36403=>1000,36404=>1000,36405=>1000,36406=>1000,36407=>1000,36408=>1000,36409=>1000,36410=>1000,36411=>1000,36412=>1000,36413=>1000,36414=>1000,36415=>1000,36416=>1000,36417=>1000,36418=>1000,36419=>1000,36420=>1000,36421=>1000,36422=>1000,36423=>1000,36424=>1000,36425=>1000,36426=>1000,36427=>1000,36428=>1000,36429=>1000,36430=>1000,36431=>1000,36432=>1000,36433=>1000,36434=>1000,36435=>1000,36436=>1000,36437=>1000,36438=>1000,36439=>1000,36440=>1000,36441=>1000,36442=>1000,36443=>1000,36444=>1000,36445=>1000,36446=>1000,36447=>1000,36448=>1000,36449=>1000,36450=>1000,36451=>1000,36452=>1000,36453=>1000,36454=>1000,36455=>1000,36456=>1000,36457=>1000,36458=>1000,36459=>1000,36460=>1000,36461=>1000,36462=>1000,36463=>1000,36464=>1000,36465=>1000,36466=>1000,36467=>1000,36468=>1000,36469=>1000,36470=>1000,36471=>1000,36472=>1000,36473=>1000,36474=>1000,36475=>1000,36476=>1000,36477=>1000,36478=>1000,36479=>1000,36480=>1000,36481=>1000,36482=>1000,36483=>1000,36484=>1000,36485=>1000,36486=>1000,36487=>1000,36488=>1000,36489=>1000,36490=>1000,36491=>1000,36492=>1000,36493=>1000,36494=>1000,36495=>1000,36496=>1000,36497=>1000,36498=>1000,36499=>1000,36500=>1000,36501=>1000,36502=>1000,36503=>1000,36504=>1000,36505=>1000,36506=>1000,36507=>1000,36508=>1000,36509=>1000,36510=>1000,36511=>1000,36512=>1000,36513=>1000,36514=>1000,36515=>1000,36516=>1000,36517=>1000,36518=>1000,36519=>1000,36520=>1000,36521=>1000,36522=>1000,36523=>1000,36524=>1000,36525=>1000,36526=>1000,36527=>1000,36528=>1000,36529=>1000,36530=>1000,36531=>1000,36532=>1000,36533=>1000,36534=>1000,36535=>1000,36536=>1000,36537=>1000,36538=>1000,36539=>1000,36540=>1000,36541=>1000,36542=>1000,36543=>1000,36544=>1000,36545=>1000,36546=>1000,36547=>1000,36548=>1000,36549=>1000,36550=>1000,36551=>1000,36552=>1000,36553=>1000,36554=>1000,36555=>1000,36556=>1000,36557=>1000,36558=>1000,36559=>1000,36560=>1000,36561=>1000,36562=>1000,36563=>1000,36564=>1000,36565=>1000,36566=>1000,36567=>1000,36568=>1000,36569=>1000,36570=>1000,36571=>1000,36572=>1000,36573=>1000,36574=>1000,36575=>1000,36576=>1000,36577=>1000,36578=>1000,36579=>1000,36580=>1000,36581=>1000,36582=>1000,36583=>1000,36584=>1000,36585=>1000,36586=>1000,36587=>1000,36588=>1000,36589=>1000,36590=>1000,36591=>1000,36592=>1000,36593=>1000,36594=>1000,36595=>1000,36596=>1000,36597=>1000,36598=>1000,36599=>1000,36600=>1000,36601=>1000,36602=>1000,36603=>1000,36604=>1000,36605=>1000,36606=>1000,36607=>1000,36608=>1000,36609=>1000,36610=>1000,36611=>1000,36612=>1000,36613=>1000,36614=>1000,36615=>1000,36616=>1000,36617=>1000,36618=>1000,36619=>1000,36620=>1000,36621=>1000,36622=>1000,36623=>1000,36624=>1000,36625=>1000,36626=>1000,36627=>1000,36628=>1000,36629=>1000,36630=>1000,36631=>1000,36632=>1000,36633=>1000,36634=>1000,36635=>1000,36636=>1000,36637=>1000,36638=>1000,36639=>1000,36640=>1000,36641=>1000,36642=>1000,36643=>1000,36644=>1000,36645=>1000,36646=>1000,36647=>1000,36648=>1000,36649=>1000,36650=>1000,36651=>1000,36652=>1000,36653=>1000,36654=>1000,36655=>1000,36656=>1000,36657=>1000,36658=>1000,36659=>1000,36660=>1000,36661=>1000,36662=>1000,36663=>1000,36664=>1000,36665=>1000,36666=>1000,36667=>1000,36668=>1000,36669=>1000,36670=>1000,36671=>1000,36672=>1000,36673=>1000,36674=>1000,36675=>1000,36676=>1000,36677=>1000,36678=>1000,36679=>1000,36680=>1000,36681=>1000,36682=>1000,36683=>1000,36684=>1000,36685=>1000,36686=>1000,36687=>1000,36688=>1000,36689=>1000,36690=>1000,36691=>1000,36692=>1000,36693=>1000,36694=>1000,36695=>1000,36696=>1000,36697=>1000,36698=>1000,36699=>1000,36700=>1000,36701=>1000,36702=>1000,36703=>1000,36704=>1000,36705=>1000,36706=>1000,36707=>1000,36708=>1000,36709=>1000,36710=>1000,36711=>1000,36712=>1000,36713=>1000,36714=>1000,36715=>1000,36716=>1000,36717=>1000,36718=>1000,36719=>1000,36720=>1000,36721=>1000,36722=>1000,36723=>1000,36724=>1000,36725=>1000,36726=>1000,36727=>1000,36728=>1000,36729=>1000,36730=>1000,36731=>1000,36732=>1000,36733=>1000,36734=>1000,36735=>1000,36736=>1000,36737=>1000,36738=>1000,36739=>1000,36740=>1000,36741=>1000,36742=>1000,36743=>1000,36744=>1000,36745=>1000,36746=>1000,36747=>1000,36748=>1000,36749=>1000,36750=>1000,36751=>1000,36752=>1000,36753=>1000,36754=>1000,36755=>1000,36756=>1000,36757=>1000,36758=>1000,36759=>1000,36760=>1000,36761=>1000,36762=>1000,36763=>1000,36764=>1000,36765=>1000,36766=>1000,36767=>1000,36768=>1000,36769=>1000,36770=>1000,36771=>1000,36772=>1000,36773=>1000,36774=>1000,36775=>1000,36776=>1000,36777=>1000,36778=>1000,36779=>1000,36780=>1000,36781=>1000,36782=>1000,36783=>1000,36784=>1000,36785=>1000,36786=>1000,36787=>1000,36788=>1000,36789=>1000,36790=>1000,36791=>1000,36792=>1000,36793=>1000,36794=>1000,36795=>1000,36796=>1000,36797=>1000,36798=>1000,36799=>1000,36800=>1000,36801=>1000,36802=>1000,36803=>1000,36804=>1000,36805=>1000,36806=>1000,36807=>1000,36808=>1000,36809=>1000,36810=>1000,36811=>1000,36812=>1000,36813=>1000,36814=>1000,36815=>1000,36816=>1000,36817=>1000,36818=>1000,36819=>1000,36820=>1000,36821=>1000,36822=>1000,36823=>1000,36824=>1000,36825=>1000,36826=>1000,36827=>1000,36828=>1000,36829=>1000,36830=>1000,36831=>1000,36832=>1000,36833=>1000,36834=>1000,36835=>1000,36836=>1000,36837=>1000,36838=>1000,36839=>1000,36840=>1000,36841=>1000,36842=>1000,36843=>1000,36844=>1000,36845=>1000,36846=>1000,36847=>1000,36848=>1000,36849=>1000,36850=>1000,36851=>1000,36852=>1000,36853=>1000,36854=>1000,36855=>1000,36856=>1000,36857=>1000,36858=>1000,36859=>1000,36860=>1000,36861=>1000,36862=>1000,36863=>1000,36864=>1000,36865=>1000,36866=>1000,36867=>1000,36868=>1000,36869=>1000,36870=>1000,36871=>1000,36872=>1000,36873=>1000,36874=>1000,36875=>1000,36876=>1000,36877=>1000,36878=>1000,36879=>1000,36880=>1000,36881=>1000,36882=>1000,36883=>1000,36884=>1000,36885=>1000,36886=>1000,36887=>1000,36888=>1000,36889=>1000,36890=>1000,36891=>1000,36892=>1000,36893=>1000,36894=>1000,36895=>1000,36896=>1000,36897=>1000,36898=>1000,36899=>1000,36900=>1000,36901=>1000,36902=>1000,36903=>1000,36904=>1000,36905=>1000,36906=>1000,36907=>1000,36908=>1000,36909=>1000,36910=>1000,36911=>1000,36912=>1000,36913=>1000,36914=>1000,36915=>1000,36916=>1000,36917=>1000,36918=>1000,36919=>1000,36920=>1000,36921=>1000,36922=>1000,36923=>1000,36924=>1000,36925=>1000,36926=>1000,36927=>1000,36928=>1000,36929=>1000,36930=>1000,36931=>1000,36932=>1000,36933=>1000,36934=>1000,36935=>1000,36936=>1000,36937=>1000,36938=>1000,36939=>1000,36940=>1000,36941=>1000,36942=>1000,36943=>1000,36944=>1000,36945=>1000,36946=>1000,36947=>1000,36948=>1000,36949=>1000,36950=>1000,36951=>1000,36952=>1000,36953=>1000,36954=>1000,36955=>1000,36956=>1000,36957=>1000,36958=>1000,36959=>1000,36960=>1000,36961=>1000,36962=>1000,36963=>1000,36964=>1000,36965=>1000,36966=>1000,36967=>1000,36968=>1000,36969=>1000,36970=>1000,36971=>1000,36972=>1000,36973=>1000,36974=>1000,36975=>1000,36976=>1000,36977=>1000,36978=>1000,36979=>1000,36980=>1000,36981=>1000,36982=>1000,36983=>1000,36984=>1000,36985=>1000,36986=>1000,36987=>1000,36988=>1000,36989=>1000,36990=>1000,36991=>1000,36992=>1000,36993=>1000,36994=>1000,36995=>1000,36996=>1000,36997=>1000,36998=>1000,36999=>1000,37000=>1000,37001=>1000,37002=>1000,37003=>1000,37004=>1000,37005=>1000,37006=>1000,37007=>1000,37008=>1000,37009=>1000,37010=>1000,37011=>1000,37012=>1000,37013=>1000,37014=>1000,37015=>1000,37016=>1000,37017=>1000,37018=>1000,37019=>1000,37020=>1000,37021=>1000,37022=>1000,37023=>1000,37024=>1000,37025=>1000,37026=>1000,37027=>1000,37028=>1000,37029=>1000,37030=>1000,37031=>1000,37032=>1000,37033=>1000,37034=>1000,37035=>1000,37036=>1000,37037=>1000,37038=>1000,37039=>1000,37040=>1000,37041=>1000,37042=>1000,37043=>1000,37044=>1000,37045=>1000,37046=>1000,37047=>1000,37048=>1000,37049=>1000,37050=>1000,37051=>1000,37052=>1000,37053=>1000,37054=>1000,37055=>1000,37056=>1000,37057=>1000,37058=>1000,37059=>1000,37060=>1000,37061=>1000,37062=>1000,37063=>1000,37064=>1000,37065=>1000,37066=>1000,37067=>1000,37068=>1000,37069=>1000,37070=>1000,37071=>1000,37072=>1000,37073=>1000,37074=>1000,37075=>1000,37076=>1000,37077=>1000,37078=>1000,37079=>1000,37080=>1000,37081=>1000,37082=>1000,37083=>1000,37084=>1000,37085=>1000,37086=>1000,37087=>1000,37088=>1000,37089=>1000,37090=>1000,37091=>1000,37092=>1000,37093=>1000,37094=>1000,37095=>1000,37096=>1000,37097=>1000,37098=>1000,37099=>1000,37100=>1000,37101=>1000,37102=>1000,37103=>1000,37104=>1000,37105=>1000,37106=>1000,37107=>1000,37108=>1000,37109=>1000,37110=>1000,37111=>1000,37112=>1000,37113=>1000,37114=>1000,37115=>1000,37116=>1000,37117=>1000,37118=>1000,37119=>1000,37120=>1000,37121=>1000,37122=>1000,37123=>1000,37124=>1000,37125=>1000,37126=>1000,37127=>1000,37128=>1000,37129=>1000,37130=>1000,37131=>1000,37132=>1000,37133=>1000,37134=>1000,37135=>1000,37136=>1000,37137=>1000,37138=>1000,37139=>1000,37140=>1000,37141=>1000,37142=>1000,37143=>1000,37144=>1000,37145=>1000,37146=>1000,37147=>1000,37148=>1000,37149=>1000,37150=>1000,37151=>1000,37152=>1000,37153=>1000,37154=>1000,37155=>1000,37156=>1000,37157=>1000,37158=>1000,37159=>1000,37160=>1000,37161=>1000,37162=>1000,37163=>1000,37164=>1000,37165=>1000,37166=>1000,37167=>1000,37168=>1000,37169=>1000,37170=>1000,37171=>1000,37172=>1000,37173=>1000,37174=>1000,37175=>1000,37176=>1000,37177=>1000,37178=>1000,37179=>1000,37180=>1000,37181=>1000,37182=>1000,37183=>1000,37184=>1000,37185=>1000,37186=>1000,37187=>1000,37188=>1000,37189=>1000,37190=>1000,37191=>1000,37192=>1000,37193=>1000,37194=>1000,37195=>1000,37196=>1000,37197=>1000,37198=>1000,37199=>1000,37200=>1000,37201=>1000,37202=>1000,37203=>1000,37204=>1000,37205=>1000,37206=>1000,37207=>1000,37208=>1000,37209=>1000,37210=>1000,37211=>1000,37212=>1000,37213=>1000,37214=>1000,37215=>1000,37216=>1000,37217=>1000,37218=>1000,37219=>1000,37220=>1000,37221=>1000,37222=>1000,37223=>1000,37224=>1000,37225=>1000,37226=>1000,37227=>1000,37228=>1000,37229=>1000,37230=>1000,37231=>1000,37232=>1000,37233=>1000,37234=>1000,37235=>1000,37236=>1000,37237=>1000,37238=>1000,37239=>1000,37240=>1000,37241=>1000,37242=>1000,37243=>1000,37244=>1000,37245=>1000,37246=>1000,37247=>1000,37248=>1000,37249=>1000,37250=>1000,37251=>1000,37252=>1000,37253=>1000,37254=>1000,37255=>1000,37256=>1000,37257=>1000,37258=>1000,37259=>1000,37260=>1000,37261=>1000,37262=>1000,37263=>1000,37264=>1000,37265=>1000,37266=>1000,37267=>1000,37268=>1000,37269=>1000,37270=>1000,37271=>1000,37272=>1000,37273=>1000,37274=>1000,37275=>1000,37276=>1000,37277=>1000,37278=>1000,37279=>1000,37280=>1000,37281=>1000,37282=>1000,37283=>1000,37284=>1000,37285=>1000,37286=>1000,37287=>1000,37288=>1000,37289=>1000,37290=>1000,37291=>1000,37292=>1000,37293=>1000,37294=>1000,37295=>1000,37296=>1000,37297=>1000,37298=>1000,37299=>1000,37300=>1000,37301=>1000,37302=>1000,37303=>1000,37304=>1000,37305=>1000,37306=>1000,37307=>1000,37308=>1000,37309=>1000,37310=>1000,37311=>1000,37312=>1000,37313=>1000,37314=>1000,37315=>1000,37316=>1000,37317=>1000,37318=>1000,37319=>1000,37320=>1000,37321=>1000,37322=>1000,37323=>1000,37324=>1000,37325=>1000,37326=>1000,37327=>1000,37328=>1000,37329=>1000,37330=>1000,37331=>1000,37332=>1000,37333=>1000,37334=>1000,37335=>1000,37336=>1000,37337=>1000,37338=>1000,37339=>1000,37340=>1000,37341=>1000,37342=>1000,37343=>1000,37344=>1000,37345=>1000,37346=>1000,37347=>1000,37348=>1000,37349=>1000,37350=>1000,37351=>1000,37352=>1000,37353=>1000,37354=>1000,37355=>1000,37356=>1000,37357=>1000,37358=>1000,37359=>1000,37360=>1000,37361=>1000,37362=>1000,37363=>1000,37364=>1000,37365=>1000,37366=>1000,37367=>1000,37368=>1000,37369=>1000,37370=>1000,37371=>1000,37372=>1000,37373=>1000,37374=>1000,37375=>1000,37376=>1000,37377=>1000,37378=>1000,37379=>1000,37380=>1000,37381=>1000,37382=>1000,37383=>1000,37384=>1000,37385=>1000,37386=>1000,37387=>1000,37388=>1000,37389=>1000,37390=>1000,37391=>1000,37392=>1000,37393=>1000,37394=>1000,37395=>1000,37396=>1000,37397=>1000,37398=>1000,37399=>1000,37400=>1000,37401=>1000,37402=>1000,37403=>1000,37404=>1000,37405=>1000,37406=>1000,37407=>1000,37408=>1000,37409=>1000,37410=>1000,37411=>1000,37412=>1000,37413=>1000,37414=>1000,37415=>1000,37416=>1000,37417=>1000,37418=>1000,37419=>1000,37420=>1000,37421=>1000,37422=>1000,37423=>1000,37424=>1000,37425=>1000,37426=>1000,37427=>1000,37428=>1000,37429=>1000,37430=>1000,37431=>1000,37432=>1000,37433=>1000,37434=>1000,37435=>1000,37436=>1000,37437=>1000,37438=>1000,37439=>1000,37440=>1000,37441=>1000,37442=>1000,37443=>1000,37444=>1000,37445=>1000,37446=>1000,37447=>1000,37448=>1000,37449=>1000,37450=>1000,37451=>1000,37452=>1000,37453=>1000,37454=>1000,37455=>1000,37456=>1000,37457=>1000,37458=>1000,37459=>1000,37460=>1000,37461=>1000,37462=>1000,37463=>1000,37464=>1000,37465=>1000,37466=>1000,37467=>1000,37468=>1000,37469=>1000,37470=>1000,37471=>1000,37472=>1000,37473=>1000,37474=>1000,37475=>1000,37476=>1000,37477=>1000,37478=>1000,37479=>1000,37480=>1000,37481=>1000,37482=>1000,37483=>1000,37484=>1000,37485=>1000,37486=>1000,37487=>1000,37488=>1000,37489=>1000,37490=>1000,37491=>1000,37492=>1000,37493=>1000,37494=>1000,37495=>1000,37496=>1000,37497=>1000,37498=>1000,37499=>1000,37500=>1000,37501=>1000,37502=>1000,37503=>1000,37504=>1000,37505=>1000,37506=>1000,37507=>1000,37508=>1000,37509=>1000,37510=>1000,37511=>1000,37512=>1000,37513=>1000,37514=>1000,37515=>1000,37516=>1000,37517=>1000,37518=>1000,37519=>1000,37520=>1000,37521=>1000,37522=>1000,37523=>1000,37524=>1000,37525=>1000,37526=>1000,37527=>1000,37528=>1000,37529=>1000,37530=>1000,37531=>1000,37532=>1000,37533=>1000,37534=>1000,37535=>1000,37536=>1000,37537=>1000,37538=>1000,37539=>1000,37540=>1000,37541=>1000,37542=>1000,37543=>1000,37544=>1000,37545=>1000,37546=>1000,37547=>1000,37548=>1000,37549=>1000,37550=>1000,37551=>1000,37552=>1000,37553=>1000,37554=>1000,37555=>1000,37556=>1000,37557=>1000,37558=>1000,37559=>1000,37560=>1000,37561=>1000,37562=>1000,37563=>1000,37564=>1000,37565=>1000,37566=>1000,37567=>1000,37568=>1000,37569=>1000,37570=>1000,37571=>1000,37572=>1000,37573=>1000,37574=>1000,37575=>1000,37576=>1000,37577=>1000,37578=>1000,37579=>1000,37580=>1000,37581=>1000,37582=>1000,37583=>1000,37584=>1000,37585=>1000,37586=>1000,37587=>1000,37588=>1000,37589=>1000,37590=>1000,37591=>1000,37592=>1000,37593=>1000,37594=>1000,37595=>1000,37596=>1000,37597=>1000,37598=>1000,37599=>1000,37600=>1000,37601=>1000,37602=>1000,37603=>1000,37604=>1000,37605=>1000,37606=>1000,37607=>1000,37608=>1000,37609=>1000,37610=>1000,37611=>1000,37612=>1000,37613=>1000,37614=>1000,37615=>1000,37616=>1000,37617=>1000,37618=>1000,37619=>1000,37620=>1000,37621=>1000,37622=>1000,37623=>1000,37624=>1000,37625=>1000,37626=>1000,37627=>1000,37628=>1000,37629=>1000,37630=>1000,37631=>1000,37632=>1000,37633=>1000,37634=>1000,37635=>1000,37636=>1000,37637=>1000,37638=>1000,37639=>1000,37640=>1000,37641=>1000,37642=>1000,37643=>1000,37644=>1000,37645=>1000,37646=>1000,37647=>1000,37648=>1000,37649=>1000,37650=>1000,37651=>1000,37652=>1000,37653=>1000,37654=>1000,37655=>1000,37656=>1000,37657=>1000,37658=>1000,37659=>1000,37660=>1000,37661=>1000,37662=>1000,37663=>1000,37664=>1000,37665=>1000,37666=>1000,37667=>1000,37668=>1000,37669=>1000,37670=>1000,37671=>1000,37672=>1000,37673=>1000,37674=>1000,37675=>1000,37676=>1000,37677=>1000,37678=>1000,37679=>1000,37680=>1000,37681=>1000,37682=>1000,37683=>1000,37684=>1000,37685=>1000,37686=>1000,37687=>1000,37688=>1000,37689=>1000,37690=>1000,37691=>1000,37692=>1000,37693=>1000,37694=>1000,37695=>1000,37696=>1000,37697=>1000,37698=>1000,37699=>1000,37700=>1000,37701=>1000,37702=>1000,37703=>1000,37704=>1000,37705=>1000,37706=>1000,37707=>1000,37708=>1000,37709=>1000,37710=>1000,37711=>1000,37712=>1000,37713=>1000,37714=>1000,37715=>1000,37716=>1000,37717=>1000,37718=>1000,37719=>1000,37720=>1000,37721=>1000,37722=>1000,37723=>1000,37724=>1000,37725=>1000,37726=>1000,37727=>1000,37728=>1000,37729=>1000,37730=>1000,37731=>1000,37732=>1000,37733=>1000,37734=>1000,37735=>1000,37736=>1000,37737=>1000,37738=>1000,37739=>1000,37740=>1000,37741=>1000,37742=>1000,37743=>1000,37744=>1000,37745=>1000,37746=>1000,37747=>1000,37748=>1000,37749=>1000,37750=>1000,37751=>1000,37752=>1000,37753=>1000,37754=>1000,37755=>1000,37756=>1000,37757=>1000,37758=>1000,37759=>1000,37760=>1000,37761=>1000,37762=>1000,37763=>1000,37764=>1000,37765=>1000,37766=>1000,37767=>1000,37768=>1000,37769=>1000,37770=>1000,37771=>1000,37772=>1000,37773=>1000,37774=>1000,37775=>1000,37776=>1000,37777=>1000,37778=>1000,37779=>1000,37780=>1000,37781=>1000,37782=>1000,37783=>1000,37784=>1000,37785=>1000,37786=>1000,37787=>1000,37788=>1000,37789=>1000,37790=>1000,37791=>1000,37792=>1000,37793=>1000,37794=>1000,37795=>1000,37796=>1000,37797=>1000,37798=>1000,37799=>1000,37800=>1000,37801=>1000,37802=>1000,37803=>1000,37804=>1000,37805=>1000,37806=>1000,37807=>1000,37808=>1000,37809=>1000,37810=>1000,37811=>1000,37812=>1000,37813=>1000,37814=>1000,37815=>1000,37816=>1000,37817=>1000,37818=>1000,37819=>1000,37820=>1000,37821=>1000,37822=>1000,37823=>1000,37824=>1000,37825=>1000,37826=>1000,37827=>1000,37828=>1000,37829=>1000,37830=>1000,37831=>1000,37832=>1000,37833=>1000,37834=>1000,37835=>1000,37836=>1000,37837=>1000,37838=>1000,37839=>1000,37840=>1000,37841=>1000,37842=>1000,37843=>1000,37844=>1000,37845=>1000,37846=>1000,37847=>1000,37848=>1000,37849=>1000,37850=>1000,37851=>1000,37852=>1000,37853=>1000,37854=>1000,37855=>1000,37856=>1000,37857=>1000,37858=>1000,37859=>1000,37860=>1000,37861=>1000,37862=>1000,37863=>1000,37864=>1000,37865=>1000,37866=>1000,37867=>1000,37868=>1000,37869=>1000,37870=>1000,37871=>1000,37872=>1000,37873=>1000,37874=>1000,37875=>1000,37876=>1000,37877=>1000,37878=>1000,37879=>1000,37880=>1000,37881=>1000,37882=>1000,37883=>1000,37884=>1000,37885=>1000,37886=>1000,37887=>1000,37888=>1000,37889=>1000,37890=>1000,37891=>1000,37892=>1000,37893=>1000,37894=>1000,37895=>1000,37896=>1000,37897=>1000,37898=>1000,37899=>1000,37900=>1000,37901=>1000,37902=>1000,37903=>1000,37904=>1000,37905=>1000,37906=>1000,37907=>1000,37908=>1000,37909=>1000,37910=>1000,37911=>1000,37912=>1000,37913=>1000,37914=>1000,37915=>1000,37916=>1000,37917=>1000,37918=>1000,37919=>1000,37920=>1000,37921=>1000,37922=>1000,37923=>1000,37924=>1000,37925=>1000,37926=>1000,37927=>998,37928=>1000,37929=>1000,37930=>1000,37931=>1000,37932=>1000,37933=>1000,37934=>1000,37935=>1000,37936=>1000,37937=>1000,37938=>1000,37939=>1000,37940=>1000,37941=>1000,37942=>1000,37943=>1000,37944=>1000,37945=>1000,37946=>1000,37947=>1000,37948=>1000,37949=>1000,37950=>1000,37951=>1000,37952=>1000,37953=>1000,37954=>1000,37955=>1000,37956=>1000,37957=>1000,37958=>1000,37959=>1000,37960=>1000,37961=>1000,37962=>1000,37963=>1000,37964=>1000,37965=>1000,37966=>1000,37967=>1000,37968=>1000,37969=>1000,37970=>1000,37971=>1000,37972=>1000,37973=>1000,37974=>1000,37975=>1000,37976=>1000,37977=>1000,37978=>1000,37979=>1000,37980=>1000,37981=>1000,37982=>1000,37983=>1000,37984=>1000,37985=>1000,37986=>1000,37987=>1000,37988=>1000,37989=>1000,37990=>1000,37991=>1000,37992=>1000,37993=>1000,37994=>1000,37995=>1000,37996=>1000,37997=>1000,37998=>1000,37999=>1000,38000=>1000,38001=>1000,38002=>1000,38003=>1000,38004=>1000,38005=>1000,38006=>1000,38007=>1000,38008=>1000,38009=>1000,38010=>1000,38011=>1000,38012=>1000,38013=>1000,38014=>1000,38015=>1000,38016=>1000,38017=>1000,38018=>1000,38019=>1000,38020=>1000,38021=>1000,38022=>1000,38023=>1000,38024=>1000,38025=>1000,38026=>1000,38027=>1000,38028=>1000,38029=>1000,38030=>1000,38031=>1000,38032=>1000,38033=>1000,38034=>1000,38035=>1000,38036=>1000,38037=>1000,38038=>1000,38039=>1000,38040=>1000,38041=>1000,38042=>1000,38043=>1000,38044=>1000,38045=>1000,38046=>1000,38047=>1000,38048=>1000,38049=>1000,38050=>1000,38051=>1000,38052=>1000,38053=>1000,38054=>1000,38055=>1000,38056=>1000,38057=>1000,38058=>1000,38059=>1000,38060=>1000,38061=>1000,38062=>1000,38063=>1000,38064=>1000,38065=>1000,38066=>1000,38067=>1000,38068=>1000,38069=>1000,38070=>1000,38071=>1000,38072=>1000,38073=>1000,38074=>1000,38075=>1000,38076=>1000,38077=>1000,38078=>1000,38079=>1000,38080=>1000,38081=>1000,38082=>1000,38083=>1000,38084=>1000,38085=>1000,38086=>1000,38087=>1000,38088=>1000,38089=>1000,38090=>1000,38091=>1000,38092=>1000,38093=>1000,38094=>1000,38095=>1000,38096=>1000,38097=>1000,38098=>1000,38099=>1000,38100=>1000,38101=>1000,38102=>1000,38103=>1000,38104=>1000,38105=>1000,38106=>1000,38107=>1000,38108=>1000,38109=>1000,38110=>1000,38111=>1000,38112=>1000,38113=>1000,38114=>1000,38115=>1000,38116=>1000,38117=>1000,38118=>1000,38119=>1000,38120=>1000,38121=>1000,38122=>1000,38123=>1000,38124=>1000,38125=>1000,38126=>1000,38127=>1000,38128=>1000,38129=>1000,38130=>1000,38131=>1000,38132=>1000,38133=>1000,38134=>1000,38135=>1000,38136=>1000,38137=>1000,38138=>1000,38139=>1000,38140=>1000,38141=>1000,38142=>1000,38143=>1000,38144=>1000,38145=>1000,38146=>1000,38147=>1000,38148=>1000,38149=>1000,38150=>1000,38151=>1000,38152=>1000,38153=>1000,38154=>1000,38155=>1000,38156=>1000,38157=>1000,38158=>1000,38159=>1000,38160=>1000,38161=>1000,38162=>1000,38163=>1000,38164=>1000,38165=>1000,38166=>1000,38167=>1000,38168=>1000,38169=>1000,38170=>1000,38171=>1000,38172=>1000,38173=>1000,38174=>1000,38175=>1000,38176=>1000,38177=>1000,38178=>1000,38179=>1000,38180=>1000,38181=>1000,38182=>1000,38183=>1000,38184=>1000,38185=>1000,38186=>1000,38187=>1000,38188=>1000,38189=>1000,38190=>1000,38191=>1000,38192=>1000,38193=>1000,38194=>1000,38195=>1000,38196=>1000,38197=>1000,38198=>1000,38199=>1000,38200=>1000,38201=>1000,38202=>1000,38203=>1000,38204=>1000,38205=>1000,38206=>1000,38207=>1000,38208=>1000,38209=>1000,38210=>1000,38211=>1000,38212=>1000,38213=>1000,38214=>1000,38215=>1000,38216=>1000,38217=>1000,38218=>1000,38219=>1000,38220=>1000,38221=>1000,38222=>1000,38223=>1000,38224=>1000,38225=>1000,38226=>1000,38227=>1000,38228=>1000,38229=>1000,38230=>1000,38231=>1000,38232=>1000,38233=>1000,38234=>1000,38235=>1000,38236=>1000,38237=>1000,38238=>1000,38239=>1000,38240=>1000,38241=>1000,38242=>1000,38243=>1000,38244=>1000,38245=>1000,38246=>1000,38247=>1000,38248=>1000,38249=>1000,38250=>1000,38251=>1000,38252=>1000,38253=>1000,38254=>1000,38255=>1000,38256=>1000,38257=>1000,38258=>1000,38259=>1000,38260=>1000,38261=>1000,38262=>1000,38263=>1000,38264=>1000,38265=>1000,38266=>1000,38267=>1000,38268=>1000,38269=>1000,38270=>1000,38271=>1000,38272=>1000,38273=>1000,38274=>1000,38275=>1000,38276=>1000,38277=>1000,38278=>1000,38279=>1000,38280=>1000,38281=>1000,38282=>1000,38283=>1000,38284=>1000,38285=>1000,38286=>1000,38287=>1000,38288=>1000,38289=>1000,38290=>1000,38291=>1000,38292=>1000,38293=>1000,38294=>1000,38295=>1000,38296=>1000,38297=>1000,38298=>1000,38299=>1000,38300=>1000,38301=>1000,38302=>1000,38303=>1000,38304=>1000,38305=>1000,38306=>1000,38307=>1000,38308=>1000,38309=>1000,38310=>1000,38311=>1000,38312=>1000,38313=>1000,38314=>1000,38315=>1000,38316=>1000,38317=>1000,38318=>1000,38319=>1000,38320=>1000,38321=>1000,38322=>1000,38323=>1000,38324=>1000,38325=>1000,38326=>1000,38327=>1000,38328=>1000,38329=>1000,38330=>1000,38331=>1000,38332=>1000,38333=>1000,38334=>1000,38335=>1000,38336=>1000,38337=>1000,38338=>1000,38339=>1000,38340=>1000,38341=>1000,38342=>1000,38343=>1000,38344=>1000,38345=>1000,38346=>1000,38347=>1000,38348=>1000,38349=>1000,38350=>1000,38351=>1000,38352=>1000,38353=>1000,38354=>1000,38355=>1000,38356=>1000,38357=>1000,38358=>1000,38359=>1000,38360=>1000,38361=>1000,38362=>1000,38363=>1000,38364=>1000,38365=>1000,38366=>1000,38367=>1000,38368=>1000,38369=>1000,38370=>1000,38371=>1000,38372=>1000,38373=>1000,38374=>1000,38375=>1000,38376=>1000,38377=>1000,38378=>1000,38379=>1000,38380=>1000,38381=>1000,38382=>1000,38383=>1000,38384=>1000,38385=>1000,38386=>1000,38387=>1000,38388=>1000,38389=>1000,38390=>1000,38391=>1000,38392=>1000,38393=>1000,38394=>1000,38395=>1000,38396=>1000,38397=>1000,38398=>1000,38399=>1000,38400=>1000,38401=>1000,38402=>1000,38403=>1000,38404=>1000,38405=>1000,38406=>1000,38407=>1000,38408=>1000,38409=>1000,38410=>1000,38411=>1000,38412=>1000,38413=>1000,38414=>1000,38415=>1000,38416=>1000,38417=>1000,38418=>1000,38419=>1000,38420=>1000,38421=>1000,38422=>1000,38423=>1000,38424=>1000,38425=>1000,38426=>1000,38427=>1000,38428=>1000,38429=>1000,38430=>1000,38431=>1000,38432=>1000,38433=>1000,38434=>1000,38435=>1000,38436=>1000,38437=>1000,38438=>1000,38439=>1000,38440=>1000,38441=>1000,38442=>1000,38443=>1000,38444=>1000,38445=>1000,38446=>1000,38447=>1000,38448=>1000,38449=>1000,38450=>1000,38451=>1000,38452=>1000,38453=>1000,38454=>1000,38455=>1000,38456=>1000,38457=>1000,38458=>1000,38459=>1000,38460=>1000,38461=>1000,38462=>1000,38463=>1000,38464=>1000,38465=>1000,38466=>1000,38467=>1000,38468=>1000,38469=>1000,38470=>1000,38471=>1000,38472=>1000,38473=>1000,38474=>1000,38475=>1000,38476=>1000,38477=>1000,38478=>1000,38479=>1000,38480=>1000,38481=>1000,38482=>1000,38483=>1000,38484=>1000,38485=>1000,38486=>1000,38487=>1000,38488=>1000,38489=>1000,38490=>1000,38491=>1000,38492=>1000,38493=>1000,38494=>1000,38495=>1000,38496=>1000,38497=>1000,38498=>1000,38499=>1000,38500=>1000,38501=>1000,38502=>1000,38503=>1000,38504=>1000,38505=>1000,38506=>1000,38507=>1000,38508=>1000,38509=>1000,38510=>1000,38511=>1000,38512=>1000,38513=>1000,38514=>1000,38515=>1000,38516=>1000,38517=>1000,38518=>1000,38519=>1000,38520=>1000,38521=>1000,38522=>1000,38523=>1000,38524=>1000,38525=>1000,38526=>1000,38527=>1000,38528=>1000,38529=>1000,38530=>1000,38531=>1000,38532=>1000,38533=>1000,38534=>1000,38535=>1000,38536=>1000,38537=>1000,38538=>1000,38539=>1000,38540=>1000,38541=>1000,38542=>1000,38543=>1000,38544=>1000,38545=>1000,38546=>1000,38547=>1000,38548=>1000,38549=>1000,38550=>1000,38551=>1000,38552=>1000,38553=>1000,38554=>1000,38555=>1000,38556=>1000,38557=>1000,38558=>1000,38559=>1000,38560=>1000,38561=>1000,38562=>1000,38563=>1000,38564=>1000,38565=>1000,38566=>1000,38567=>1000,38568=>1000,38569=>1000,38570=>1000,38571=>1000,38572=>1000,38573=>1000,38574=>1000,38575=>1000,38576=>1000,38577=>1000,38578=>1000,38579=>1000,38580=>1000,38581=>1000,38582=>1000,38583=>1000,38584=>1000,38585=>1000,38586=>1000,38587=>1000,38588=>1000,38589=>1000,38590=>1000,38591=>1000,38592=>1000,38593=>1000,38594=>1000,38595=>1000,38596=>1000,38597=>1000,38598=>1000,38599=>1000,38600=>1000,38601=>1000,38602=>1000,38603=>1000,38604=>1000,38605=>1000,38606=>1000,38607=>1000,38608=>1000,38609=>1000,38610=>1000,38611=>1000,38612=>1000,38613=>1000,38614=>1000,38615=>1000,38616=>1000,38617=>1000,38618=>1000,38619=>1000,38620=>1000,38621=>1000,38622=>1000,38623=>1000,38624=>1000,38625=>1000,38626=>1000,38627=>1000,38628=>1000,38629=>1000,38630=>1000,38631=>1000,38632=>1000,38633=>1000,38634=>1000,38635=>1000,38636=>1000,38637=>1000,38638=>1000,38639=>1000,38640=>1000,38641=>1000,38642=>1000,38643=>1000,38644=>1000,38645=>1000,38646=>1000,38647=>1000,38648=>1000,38649=>1000,38650=>1000,38651=>1000,38652=>1000,38653=>1000,38654=>1000,38655=>1000,38656=>1000,38657=>1000,38658=>1000,38659=>1000,38660=>1000,38661=>1000,38662=>1000,38663=>1000,38664=>1000,38665=>1000,38666=>1000,38667=>1000,38668=>1000,38669=>1000,38670=>1000,38671=>1000,38672=>1000,38673=>1000,38674=>1000,38675=>1000,38676=>1000,38677=>1000,38678=>1000,38679=>1000,38680=>1000,38681=>1000,38682=>1000,38683=>1000,38684=>1000,38685=>1000,38686=>1000,38687=>1000,38688=>1000,38689=>1000,38690=>1000,38691=>1000,38692=>1000,38693=>1000,38694=>1000,38695=>1000,38696=>1000,38697=>1000,38698=>1000,38699=>1000,38700=>1000,38701=>1000,38702=>1000,38703=>1000,38704=>1000,38705=>1000,38706=>1000,38707=>1000,38708=>1000,38709=>1000,38710=>1000,38711=>1000,38712=>1000,38713=>1000,38714=>1000,38715=>1000,38716=>1000,38717=>1000,38718=>1000,38719=>1000,38720=>1000,38721=>1000,38722=>1000,38723=>1000,38724=>1000,38725=>1000,38726=>1000,38727=>1000,38728=>1000,38729=>1000,38730=>1000,38731=>1000,38732=>1000,38733=>1000,38734=>1000,38735=>1000,38736=>1000,38737=>1000,38738=>1000,38739=>1000,38740=>1000,38741=>1000,38742=>1000,38743=>1000,38744=>1000,38745=>1000,38746=>1000,38747=>1000,38748=>1000,38749=>1000,38750=>1000,38751=>1000,38752=>1000,38753=>1000,38754=>1000,38755=>1000,38756=>1000,38757=>1000,38758=>1000,38759=>1000,38760=>1000,38761=>1000,38762=>1000,38763=>1000,38764=>1000,38765=>1000,38766=>1000,38767=>1000,38768=>1000,38769=>1000,38770=>1000,38771=>1000,38772=>1000,38773=>1000,38774=>1000,38775=>1000,38776=>1000,38777=>1000,38778=>1000,38779=>1000,38780=>1000,38781=>1000,38782=>1000,38783=>1000,38784=>1000,38785=>1000,38786=>1000,38787=>1000,38788=>1000,38789=>1000,38790=>1000,38791=>1000,38792=>1000,38793=>1000,38794=>1000,38795=>1000,38796=>1000,38797=>1000,38798=>1000,38799=>1000,38800=>1000,38801=>1000,38802=>1000,38803=>1000,38804=>1000,38805=>1000,38806=>1000,38807=>1000,38808=>1000,38809=>1000,38810=>1000,38811=>1000,38812=>1000,38813=>1000,38814=>1000,38815=>1000,38816=>1000,38817=>1000,38818=>1000,38819=>1000,38820=>1000,38821=>1000,38822=>1000,38823=>1000,38824=>1000,38825=>1000,38826=>1000,38827=>1000,38828=>1000,38829=>1000,38830=>1000,38831=>1000,38832=>1000,38833=>1000,38834=>1000,38835=>1000,38836=>1000,38837=>1000,38838=>1000,38839=>1000,38840=>1000,38841=>1000,38842=>1000,38843=>1000,38844=>1000,38845=>1000,38846=>1000,38847=>1000,38848=>1000,38849=>1000,38850=>1000,38851=>1000,38852=>1000,38853=>1000,38854=>1000,38855=>1000,38856=>1000,38857=>1000,38858=>1000,38859=>1000,38860=>1000,38861=>1000,38862=>1000,38863=>1000,38864=>1000,38865=>1000,38866=>1000,38867=>1000,38868=>1000,38869=>1000,38870=>1000,38871=>1000,38872=>1000,38873=>1000,38874=>1000,38875=>1000,38876=>1000,38877=>1000,38878=>1000,38879=>1000,38880=>1000,38881=>1000,38882=>1000,38883=>1000,38884=>1000,38885=>1000,38886=>1000,38887=>1000,38888=>1000,38889=>1000,38890=>1000,38891=>1000,38892=>1000,38893=>1000,38894=>1000,38895=>1000,38896=>1000,38897=>1000,38898=>1000,38899=>1000,38900=>1000,38901=>1000,38902=>1000,38903=>1000,38904=>1000,38905=>1000,38906=>1000,38907=>1000,38908=>1000,38909=>1000,38910=>1000,38911=>1000,38912=>1000,38913=>1000,38914=>1000,38915=>1000,38916=>1000,38917=>1000,38918=>1000,38919=>1000,38920=>1000,38921=>1000,38922=>1000,38923=>1000,38924=>1000,38925=>1000,38926=>1000,38927=>1000,38928=>1000,38929=>1000,38930=>1000,38931=>1000,38932=>1000,38933=>1000,38934=>1000,38935=>1000,38936=>1000,38937=>1000,38938=>1000,38939=>1000,38940=>1000,38941=>1000,38942=>1000,38943=>1000,38944=>1000,38945=>1000,38946=>1000,38947=>1000,38948=>1000,38949=>1000,38950=>1000,38951=>1000,38952=>1000,38953=>1000,38954=>1000,38955=>1000,38956=>1000,38957=>1000,38958=>1000,38959=>1000,38960=>1000,38961=>1000,38962=>1000,38963=>1000,38964=>1000,38965=>1000,38966=>1000,38967=>1000,38968=>1000,38969=>1000,38970=>1000,38971=>1000,38972=>1000,38973=>1000,38974=>1000,38975=>1000,38976=>1000,38977=>1000,38978=>1000,38979=>1000,38980=>1000,38981=>1000,38982=>1000,38983=>1000,38984=>1000,38985=>1000,38986=>1000,38987=>1000,38988=>1000,38989=>1000,38990=>1000,38991=>1000,38992=>1000,38993=>1000,38994=>1000,38995=>1000,38996=>1000,38997=>1000,38998=>1000,38999=>1000,39000=>1000,39001=>1000,39002=>1000,39003=>1000,39004=>1000,39005=>1000,39006=>1000,39007=>1000,39008=>1000,39009=>1000,39010=>1000,39011=>1000,39012=>1000,39013=>1000,39014=>1000,39015=>1000,39016=>1000,39017=>1000,39018=>1000,39019=>1000,39020=>1000,39021=>1000,39022=>1000,39023=>1000,39024=>1000,39025=>1000,39026=>1000,39027=>1000,39028=>1000,39029=>1000,39030=>1000,39031=>1000,39032=>1000,39033=>1000,39034=>1000,39035=>1000,39036=>1000,39037=>1000,39038=>1000,39039=>1000,39040=>1000,39041=>1000,39042=>1000,39043=>1000,39044=>1000,39045=>1000,39046=>1000,39047=>1000,39048=>1000,39049=>1000,39050=>1000,39051=>1000,39052=>1000,39053=>1000,39054=>1000,39055=>1000,39056=>1000,39057=>1000,39058=>1000,39059=>1000,39060=>1000,39061=>1000,39062=>1000,39063=>1000,39064=>1000,39065=>1000,39066=>1000,39067=>1000,39068=>1000,39069=>1000,39070=>1000,39071=>1000,39072=>1000,39073=>1000,39074=>1000,39075=>1000,39076=>1000,39077=>1000,39078=>1000,39079=>1000,39080=>1000,39081=>1000,39082=>1000,39083=>1000,39084=>1000,39085=>1000,39086=>1000,39087=>1000,39088=>1000,39089=>1000,39090=>1000,39091=>1000,39092=>1000,39093=>1000,39094=>1000,39095=>1000,39096=>1000,39097=>1000,39098=>1000,39099=>1000,39100=>1000,39101=>1000,39102=>1000,39103=>1000,39104=>1000,39105=>1000,39106=>1000,39107=>1000,39108=>1000,39109=>1000,39110=>1000,39111=>1000,39112=>1000,39113=>1000,39114=>1000,39115=>1000,39116=>1000,39117=>1000,39118=>1000,39119=>1000,39120=>1000,39121=>1000,39122=>1000,39123=>1000,39124=>1000,39125=>1000,39126=>1000,39127=>1000,39128=>1000,39129=>1000,39130=>1000,39131=>1000,39132=>1000,39133=>1000,39134=>1000,39135=>1000,39136=>1000,39137=>1000,39138=>1000,39139=>1000,39140=>1000,39141=>1000,39142=>1000,39143=>1000,39144=>1000,39145=>1000,39146=>1000,39147=>1000,39148=>1000,39149=>1000,39150=>1000,39151=>1000,39152=>1000,39153=>1000,39154=>1000,39155=>1000,39156=>1000,39157=>1000,39158=>1000,39159=>1000,39160=>1000,39161=>1000,39162=>1000,39163=>1000,39164=>1000,39165=>1000,39166=>1000,39167=>1000,39168=>1000,39169=>1000,39170=>1000,39171=>1000,39172=>1000,39173=>1000,39174=>1000,39175=>1000,39176=>1000,39177=>1000,39178=>1000,39179=>1000,39180=>1000,39181=>1000,39182=>1000,39183=>1000,39184=>1000,39185=>1000,39186=>1000,39187=>1000,39188=>1000,39189=>1000,39190=>1000,39191=>1000,39192=>1000,39193=>1000,39194=>1000,39195=>1000,39196=>1000,39197=>1000,39198=>1000,39199=>1000,39200=>1000,39201=>1000,39202=>1000,39203=>1000,39204=>1000,39205=>1000,39206=>1000,39207=>1000,39208=>1000,39209=>1000,39210=>1000,39211=>1000,39212=>1000,39213=>1000,39214=>1000,39215=>1000,39216=>1000,39217=>1000,39218=>1000,39219=>1000,39220=>1000,39221=>1000,39222=>1000,39223=>1000,39224=>1000,39225=>1000,39226=>1000,39227=>1000,39228=>1000,39229=>1000,39230=>1000,39231=>1000,39232=>1000,39233=>1000,39234=>1000,39235=>1000,39236=>1000,39237=>1000,39238=>1000,39239=>1000,39240=>1000,39241=>1000,39242=>1000,39243=>1000,39244=>1000,39245=>1000,39246=>1000,39247=>1000,39248=>1000,39249=>1000,39250=>1000,39251=>1000,39252=>1000,39253=>1000,39254=>1000,39255=>1000,39256=>1000,39257=>1000,39258=>1000,39259=>1000,39260=>1000,39261=>1000,39262=>1000,39263=>1000,39264=>1000,39265=>1000,39266=>1000,39267=>1000,39268=>1000,39269=>1000,39270=>1000,39271=>1000,39272=>1000,39273=>1000,39274=>1000,39275=>1000,39276=>1000,39277=>1000,39278=>1000,39279=>1000,39280=>1000,39281=>1000,39282=>1000,39283=>1000,39284=>1000,39285=>1000,39286=>1000,39287=>1000,39288=>1000,39289=>1000,39290=>1000,39291=>1000,39292=>1000,39293=>1000,39294=>1000,39295=>1000,39296=>1000,39297=>1000,39298=>1000,39299=>1000,39300=>1000,39301=>1000,39302=>1000,39303=>1000,39304=>1000,39305=>1000,39306=>1000,39307=>1000,39308=>1000,39309=>1000,39310=>1000,39311=>1000,39312=>1000,39313=>1000,39314=>1000,39315=>1000,39316=>1000,39317=>1000,39318=>1000,39319=>1000,39320=>1000,39321=>1000,39322=>1000,39323=>1000,39324=>1000,39325=>1000,39326=>1000,39327=>1000,39328=>1000,39329=>1000,39330=>1000,39331=>1000,39332=>1000,39333=>1000,39334=>1000,39335=>1000,39336=>1000,39337=>1000,39338=>1000,39339=>1000,39340=>1000,39341=>1000,39342=>1000,39343=>1000,39344=>1000,39345=>1000,39346=>1000,39347=>1000,39348=>1000,39349=>1000,39350=>1000,39351=>1000,39352=>1000,39353=>1000,39354=>1000,39355=>1000,39356=>1000,39357=>1000,39358=>1000,39359=>1000,39360=>1000,39361=>1000,39362=>1000,39363=>1000,39364=>1000,39365=>1000,39366=>1000,39367=>1000,39368=>1000,39369=>1000,39370=>1000,39371=>1000,39372=>1000,39373=>1000,39374=>1000,39375=>1000,39376=>1000,39377=>1000,39378=>1000,39379=>1000,39380=>1000,39381=>1000,39382=>1000,39383=>1000,39384=>1000,39385=>1000,39386=>1000,39387=>1000,39388=>1000,39389=>1000,39390=>1000,39391=>1000,39392=>1000,39393=>1000,39394=>1000,39395=>1000,39396=>1000,39397=>1000,39398=>1000,39399=>1000,39400=>1000,39401=>1000,39402=>1000,39403=>1000,39404=>1000,39405=>1000,39406=>1000,39407=>1000,39408=>1000,39409=>1000,39410=>1000,39411=>1000,39412=>1000,39413=>1000,39414=>1000,39415=>1000,39416=>1000,39417=>1000,39418=>1000,39419=>1000,39420=>1000,39421=>1000,39422=>1000,39423=>1000,39424=>1000,39425=>1000,39426=>1000,39427=>1000,39428=>1000,39429=>1000,39430=>1000,39431=>1000,39432=>1000,39433=>1000,39434=>1000,39435=>1000,39436=>1000,39437=>1000,39438=>1000,39439=>1000,39440=>1000,39441=>1000,39442=>1000,39443=>1000,39444=>1000,39445=>1000,39446=>1000,39447=>1000,39448=>1000,39449=>1000,39450=>1000,39451=>1000,39452=>1000,39453=>1000,39454=>1000,39455=>1000,39456=>1000,39457=>1000,39458=>1000,39459=>1000,39460=>1000,39461=>1000,39462=>1000,39463=>1000,39464=>1000,39465=>1000,39466=>1000,39467=>1000,39468=>1000,39469=>1000,39470=>1000,39471=>1000,39472=>1000,39473=>1000,39474=>1000,39475=>1000,39476=>1000,39477=>1000,39478=>1000,39479=>1000,39480=>1000,39481=>1000,39482=>1000,39483=>1000,39484=>1000,39485=>1000,39486=>1000,39487=>1000,39488=>1000,39489=>1000,39490=>1000,39491=>1000,39492=>1000,39493=>1000,39494=>1000,39495=>1000,39496=>1000,39497=>1000,39498=>1000,39499=>1000,39500=>1000,39501=>1000,39502=>1000,39503=>1000,39504=>1000,39505=>1000,39506=>1000,39507=>1000,39508=>1000,39509=>1000,39510=>1000,39511=>1000,39512=>1000,39513=>1000,39514=>1000,39515=>1000,39516=>1000,39517=>1000,39518=>1000,39519=>1000,39520=>1000,39521=>1000,39522=>1000,39523=>1000,39524=>1000,39525=>1000,39526=>1000,39527=>1000,39528=>1000,39529=>1000,39530=>1000,39531=>1000,39532=>1000,39533=>1000,39534=>1000,39535=>1000,39536=>1000,39537=>1000,39538=>1000,39539=>1000,39540=>1000,39541=>1000,39542=>1000,39543=>1000,39544=>1000,39545=>1000,39546=>1000,39547=>1000,39548=>1000,39549=>1000,39550=>1000,39551=>1000,39552=>1000,39553=>1000,39554=>1000,39555=>1000,39556=>1000,39557=>1000,39558=>1000,39559=>1000,39560=>1000,39561=>1000,39562=>1000,39563=>1000,39564=>1000,39565=>1000,39566=>1000,39567=>1000,39568=>1000,39569=>1000,39570=>1000,39571=>1000,39572=>1000,39573=>1000,39574=>1000,39575=>1000,39576=>1000,39577=>1000,39578=>1000,39579=>1000,39580=>1000,39581=>1000,39582=>1000,39583=>1000,39584=>1000,39585=>1000,39586=>1000,39587=>1000,39588=>1000,39589=>1000,39590=>1000,39591=>1000,39592=>1000,39593=>1000,39594=>1000,39595=>1000,39596=>1000,39597=>1000,39598=>1000,39599=>1000,39600=>1000,39601=>1000,39602=>1000,39603=>1000,39604=>1000,39605=>1000,39606=>1000,39607=>1000,39608=>1000,39609=>1000,39610=>1000,39611=>1000,39612=>1000,39613=>1000,39614=>1000,39615=>1000,39616=>1000,39617=>1000,39618=>1000,39619=>1000,39620=>1000,39621=>1000,39622=>1000,39623=>1000,39624=>1000,39625=>1000,39626=>1000,39627=>1000,39628=>1000,39629=>1000,39630=>1000,39631=>1000,39632=>1000,39633=>1000,39634=>1000,39635=>1000,39636=>1000,39637=>1000,39638=>1000,39639=>1000,39640=>1000,39641=>1000,39642=>1000,39643=>1000,39644=>1000,39645=>1000,39646=>1000,39647=>1000,39648=>1000,39649=>1000,39650=>1000,39651=>1000,39652=>1000,39653=>1000,39654=>1000,39655=>1000,39656=>1000,39657=>1000,39658=>1000,39659=>1000,39660=>1000,39661=>1000,39662=>1000,39663=>1000,39664=>1000,39665=>1000,39666=>1000,39667=>1000,39668=>1000,39669=>1000,39670=>1000,39671=>1000,39672=>1000,39673=>1000,39674=>1000,39675=>1000,39676=>1000,39677=>1000,39678=>1000,39679=>1000,39680=>1000,39681=>1000,39682=>1000,39683=>1000,39684=>1000,39685=>1000,39686=>1000,39687=>1000,39688=>1000,39689=>1000,39690=>1000,39691=>1000,39692=>1000,39693=>1000,39694=>1000,39695=>1000,39696=>1000,39697=>1000,39698=>1000,39699=>1000,39700=>1000,39701=>1000,39702=>1000,39703=>1000,39704=>1000,39705=>1000,39706=>1000,39707=>1000,39708=>1000,39709=>1000,39710=>1000,39711=>1000,39712=>1000,39713=>1000,39714=>1000,39715=>1000,39716=>1000,39717=>1000,39718=>1000,39719=>1000,39720=>1000,39721=>1000,39722=>1000,39723=>1000,39724=>1000,39725=>1000,39726=>1000,39727=>1000,39728=>1000,39729=>1000,39730=>1000,39731=>1000,39732=>1000,39733=>1000,39734=>1000,39735=>1000,39736=>1000,39737=>1000,39738=>1000,39739=>1000,39740=>1000,39741=>1000,39742=>1000,39743=>1000,39744=>1000,39745=>1000,39746=>1000,39747=>1000,39748=>1000,39749=>1000,39750=>1000,39751=>1000,39752=>1000,39753=>1000,39754=>1000,39755=>1000,39756=>1000,39757=>1000,39758=>1000,39759=>1000,39760=>1000,39761=>1000,39762=>1000,39763=>1000,39764=>1000,39765=>1000,39766=>1000,39767=>1000,39768=>1000,39769=>1000,39770=>1000,39771=>1000,39772=>1000,39773=>1000,39774=>1000,39775=>1000,39776=>1000,39777=>1000,39778=>1000,39779=>1000,39780=>1000,39781=>1000,39782=>1000,39783=>1000,39784=>1000,39785=>1000,39786=>1000,39787=>1000,39788=>1000,39789=>1000,39790=>1000,39791=>1000,39792=>1000,39793=>1000,39794=>1000,39795=>1000,39796=>1000,39797=>1000,39798=>1000,39799=>1000,39800=>1000,39801=>1000,39802=>1000,39803=>1000,39804=>1000,39805=>1000,39806=>1000,39807=>1000,39808=>1000,39809=>1000,39810=>1000,39811=>1000,39812=>1000,39813=>1000,39814=>1000,39815=>1000,39816=>1000,39817=>1000,39818=>1000,39819=>1000,39820=>1000,39821=>1000,39822=>1000,39823=>1000,39824=>1000,39825=>1000,39826=>1000,39827=>1000,39828=>1000,39829=>1000,39830=>1000,39831=>1000,39832=>1000,39833=>1000,39834=>1000,39835=>1000,39836=>1000,39837=>1000,39838=>1000,39839=>1000,39840=>1000,39841=>1000,39842=>1000,39843=>1000,39844=>1000,39845=>1000,39846=>1000,39847=>1000,39848=>1000,39849=>1000,39850=>1000,39851=>1000,39852=>1000,39853=>1000,39854=>1000,39855=>1000,39856=>1000,39857=>1000,39858=>1000,39859=>1000,39860=>1000,39861=>1000,39862=>1000,39863=>1000,39864=>1000,39865=>1000,39866=>1000,39867=>1000,39868=>1000,39869=>1000,39870=>1000,39871=>1000,39872=>1000,39873=>1000,39874=>1000,39875=>1000,39876=>1000,39877=>1000,39878=>1000,39879=>1000,39880=>1000,39881=>1000,39882=>1000,39883=>1000,39884=>1000,39885=>1000,39886=>1000,39887=>1000,39888=>1000,39889=>1000,39890=>1000,39891=>1000,39892=>1000,39893=>1000,39894=>1000,39895=>1000,39896=>1000,39897=>1000,39898=>1000,39899=>1000,39900=>1000,39901=>1000,39902=>1000,39903=>1000,39904=>1000,39905=>1000,39906=>1000,39907=>1000,39908=>1000,39909=>1000,39910=>1000,39911=>1000,39912=>1000,39913=>1000,39914=>1000,39915=>1000,39916=>1000,39917=>1000,39918=>1000,39919=>1000,39920=>1000,39921=>1000,39922=>1000,39923=>1000,39924=>1000,39925=>1000,39926=>1000,39927=>1000,39928=>1000,39929=>1000,39930=>1000,39931=>1000,39932=>1000,39933=>1000,39934=>1000,39935=>1000,39936=>1000,39937=>1000,39938=>1000,39939=>1000,39940=>1000,39941=>1000,39942=>1000,39943=>1000,39944=>1000,39945=>1000,39946=>1000,39947=>1000,39948=>1000,39949=>1000,39950=>1000,39951=>1000,39952=>1000,39953=>1000,39954=>1000,39955=>1000,39956=>1000,39957=>1000,39958=>1000,39959=>1000,39960=>1000,39961=>1000,39962=>1000,39963=>1000,39964=>1000,39965=>1000,39966=>1000,39967=>1000,39968=>1000,39969=>1000,39970=>1000,39971=>1000,39972=>1000,39973=>1000,39974=>1000,39975=>1000,39976=>1000,39977=>1000,39978=>1000,39979=>1000,39980=>1000,39981=>1000,39982=>1000,39983=>1000,39984=>1000,39985=>1000,39986=>1000,39987=>1000,39988=>1000,39989=>1000,39990=>1000,39991=>1000,39992=>1000,39993=>1000,39994=>1000,39995=>1000,39996=>1000,39997=>1000,39998=>1000,39999=>1000,40000=>1000,40001=>1000,40002=>1000,40003=>1000,40004=>1000,40005=>1000,40006=>1000,40007=>1000,40008=>1000,40009=>1000,40010=>1000,40011=>1000,40012=>1000,40013=>1000,40014=>1000,40015=>1000,40016=>1000,40017=>1000,40018=>1000,40019=>1000,40020=>1000,40021=>1000,40022=>1000,40023=>1000,40024=>1000,40025=>1000,40026=>1000,40027=>1000,40028=>1000,40029=>1000,40030=>1000,40031=>1000,40032=>1000,40033=>1000,40034=>1000,40035=>1000,40036=>1000,40037=>1000,40038=>1000,40039=>1000,40040=>1000,40041=>1000,40042=>1000,40043=>1000,40044=>1000,40045=>1000,40046=>1000,40047=>1000,40048=>1000,40049=>1000,40050=>1000,40051=>1000,40052=>1000,40053=>1000,40054=>1000,40055=>1000,40056=>1000,40057=>1000,40058=>1000,40059=>1000,40060=>1000,40061=>1000,40062=>1000,40063=>1000,40064=>1000,40065=>1000,40066=>1000,40067=>1000,40068=>1000,40069=>1000,40070=>1000,40071=>1000,40072=>1000,40073=>1000,40074=>1000,40075=>1000,40076=>1000,40077=>1000,40078=>1000,40079=>1000,40080=>1000,40081=>1000,40082=>1000,40083=>1000,40084=>1000,40085=>1000,40086=>1000,40087=>1000,40088=>1000,40089=>1000,40090=>1000,40091=>1000,40092=>1000,40093=>1000,40094=>1000,40095=>1000,40096=>1000,40097=>1000,40098=>1000,40099=>1000,40100=>1000,40101=>1000,40102=>1000,40103=>1000,40104=>1000,40105=>1000,40106=>1000,40107=>1000,40108=>1000,40109=>1000,40110=>1000,40111=>1000,40112=>1000,40113=>1000,40114=>1000,40115=>1000,40116=>1000,40117=>1000,40118=>1000,40119=>1000,40120=>1000,40121=>1000,40122=>1000,40123=>1000,40124=>1000,40125=>1000,40126=>1000,40127=>1000,40128=>1000,40129=>1000,40130=>1000,40131=>1000,40132=>1000,40133=>1000,40134=>1000,40135=>1000,40136=>1000,40137=>1000,40138=>1000,40139=>1000,40140=>1000,40141=>1000,40142=>1000,40143=>1000,40144=>1000,40145=>1000,40146=>1000,40147=>1000,40148=>1000,40149=>1000,40150=>1000,40151=>1000,40152=>1000,40153=>1000,40154=>1000,40155=>1000,40156=>1000,40157=>1000,40158=>1000,40159=>1000,40160=>1000,40161=>1000,40162=>1000,40163=>1000,40164=>1000,40165=>1000,40166=>1000,40167=>1000,40168=>1000,40169=>1000,40170=>1000,40171=>1000,40172=>1000,40173=>1000,40174=>1000,40175=>1000,40176=>1000,40177=>1000,40178=>1000,40179=>1000,40180=>1000,40181=>1000,40182=>1000,40183=>1000,40184=>1000,40185=>1000,40186=>1000,40187=>1000,40188=>1000,40189=>1000,40190=>1000,40191=>1000,40192=>1000,40193=>1000,40194=>1000,40195=>1000,40196=>1000,40197=>1000,40198=>1000,40199=>1000,40200=>1000,40201=>1000,40202=>1000,40203=>1000,40204=>1000,40205=>1000,40206=>1000,40207=>1000,40208=>1000,40209=>1000,40210=>1000,40211=>1000,40212=>1000,40213=>1000,40214=>1000,40215=>1000,40216=>1000,40217=>1000,40218=>1000,40219=>1000,40220=>1000,40221=>1000,40222=>1000,40223=>1000,40224=>1000,40225=>1000,40226=>1000,40227=>1000,40228=>1000,40229=>1000,40230=>1000,40231=>1000,40232=>1000,40233=>1000,40234=>1000,40235=>1000,40236=>1000,40237=>1000,40238=>1000,40239=>1000,40240=>1000,40241=>1000,40242=>1000,40243=>1000,40244=>1000,40245=>1000,40246=>1000,40247=>1000,40248=>1000,40249=>1000,40250=>1000,40251=>1000,40252=>1000,40253=>1000,40254=>1000,40255=>1000,40256=>1000,40257=>1000,40258=>1000,40259=>1000,40260=>1000,40261=>1000,40262=>1000,40263=>1000,40264=>1000,40265=>1000,40266=>1000,40267=>1000,40268=>1000,40269=>1000,40270=>1000,40271=>1000,40272=>1000,40273=>1000,40274=>1000,40275=>1000,40276=>1000,40277=>1000,40278=>1000,40279=>1000,40280=>1000,40281=>1000,40282=>1000,40283=>1000,40284=>1000,40285=>1000,40286=>1000,40287=>1000,40288=>1000,40289=>1000,40290=>1000,40291=>1000,40292=>1000,40293=>1000,40294=>1000,40295=>1000,40296=>1000,40297=>1000,40298=>1000,40299=>1000,40300=>1000,40301=>1000,40302=>1000,40303=>1000,40304=>1000,40305=>1000,40306=>1000,40307=>1000,40308=>1000,40309=>1000,40310=>1000,40311=>1000,40312=>1000,40313=>1000,40314=>1000,40315=>1000,40316=>1000,40317=>1000,40318=>1000,40319=>1000,40320=>1000,40321=>1000,40322=>1000,40323=>1000,40324=>1000,40325=>1000,40326=>1000,40327=>1000,40328=>1000,40329=>1000,40330=>1000,40331=>1000,40332=>1000,40333=>1000,40334=>1000,40335=>1000,40336=>1000,40337=>1000,40338=>1000,40339=>1000,40340=>1000,40341=>1000,40342=>1000,40343=>1000,40344=>1000,40345=>1000,40346=>1000,40347=>1000,40348=>1000,40349=>1000,40350=>1000,40351=>1000,40352=>1000,40353=>1000,40354=>1000,40355=>1000,40356=>1000,40357=>1000,40358=>1000,40359=>1000,40360=>1000,40361=>1000,40362=>1000,40363=>1000,40364=>1000,40365=>1000,40366=>1000,40367=>1000,40368=>1000,40369=>1000,40370=>1000,40371=>1000,40372=>1000,40373=>1000,40374=>1000,40375=>1000,40376=>1000,40377=>1000,40378=>1000,40379=>1000,40380=>1000,40381=>1000,40382=>1000,40383=>1000,40384=>1000,40385=>1000,40386=>1000,40387=>1000,40388=>1000,40389=>1000,40390=>1000,40391=>1000,40392=>1000,40393=>1000,40394=>1000,40395=>1000,40396=>1000,40397=>1000,40398=>1000,40399=>1000,40400=>1000,40401=>1000,40402=>1000,40403=>1000,40404=>1000,40405=>1000,40406=>1000,40407=>1000,40408=>1000,40409=>1000,40410=>1000,40411=>1000,40412=>1000,40413=>1000,40414=>1000,40415=>1000,40416=>1000,40417=>1000,40418=>1000,40419=>1000,40420=>1000,40421=>1000,40422=>1000,40423=>1000,40424=>1000,40425=>1000,40426=>1000,40427=>1000,40428=>1000,40429=>1000,40430=>1000,40431=>1000,40432=>1000,40433=>1000,40434=>1000,40435=>1000,40436=>1000,40437=>1000,40438=>1000,40439=>1000,40440=>1000,40441=>1000,40442=>1000,40443=>1000,40444=>1000,40445=>1000,40446=>1000,40447=>1000,40448=>1000,40449=>1000,40450=>1000,40451=>1000,40452=>1000,40453=>1000,40454=>1000,40455=>1000,40456=>1000,40457=>1000,40458=>1000,40459=>1000,40460=>1000,40461=>1000,40462=>1000,40463=>1000,40464=>1000,40465=>1000,40466=>1000,40467=>1000,40468=>1000,40469=>1000,40470=>1000,40471=>1000,40472=>1000,40473=>1000,40474=>1000,40475=>1000,40476=>1000,40477=>1000,40478=>1000,40479=>1000,40480=>1000,40481=>1000,40482=>1000,40483=>1000,40484=>1000,40485=>1000,40486=>1000,40487=>1000,40488=>1000,40489=>1000,40490=>1000,40491=>1000,40492=>1000,40493=>1000,40494=>1000,40495=>1000,40496=>1000,40497=>1000,40498=>1000,40499=>1000,40500=>1000,40501=>1000,40502=>1000,40503=>1000,40504=>1000,40505=>1000,40506=>1000,40507=>1000,40508=>1000,40509=>1000,40510=>1000,40511=>1000,40512=>1000,40513=>1000,40514=>1000,40515=>1000,40516=>1000,40517=>1000,40518=>1000,40519=>1000,40520=>1000,40521=>1000,40522=>1000,40523=>1000,40524=>1000,40525=>1000,40526=>1000,40527=>1000,40528=>1000,40529=>1000,40530=>1000,40531=>1000,40532=>1000,40533=>1000,40534=>1000,40535=>1000,40536=>1000,40537=>1000,40538=>1000,40539=>1000,40540=>1000,40541=>1000,40542=>1000,40543=>1000,40544=>1000,40545=>1000,40546=>1000,40547=>1000,40548=>1000,40549=>1000,40550=>1000,40551=>1000,40552=>1000,40553=>1000,40554=>1000,40555=>1000,40556=>1000,40557=>1000,40558=>1000,40559=>1000,40560=>1000,40561=>1000,40562=>1000,40563=>1000,40564=>1000,40565=>1000,40566=>1000,40567=>1000,40568=>1000,40569=>1000,40570=>1000,40571=>1000,40572=>1000,40573=>1000,40574=>1000,40575=>1000,40576=>1000,40577=>1000,40578=>1000,40579=>1000,40580=>1000,40581=>1000,40582=>1000,40583=>1000,40584=>1000,40585=>1000,40586=>1000,40587=>1000,40588=>1000,40589=>1000,40590=>1000,40591=>1000,40592=>1000,40593=>1000,40594=>1000,40595=>1000,40596=>1000,40597=>1000,40598=>1000,40599=>1000,40600=>1000,40601=>1000,40602=>1000,40603=>1000,40604=>1000,40605=>1000,40606=>1000,40607=>1000,40608=>1000,40609=>1000,40610=>1000,40611=>1000,40612=>1000,40613=>1000,40614=>1000,40615=>1000,40616=>1000,40617=>1000,40618=>1000,40619=>1000,40620=>1000,40621=>1000,40622=>1000,40623=>1000,40624=>1000,40625=>1000,40626=>1000,40627=>1000,40628=>1000,40629=>1000,40630=>1000,40631=>1000,40632=>1000,40633=>1000,40634=>1000,40635=>1000,40636=>1000,40637=>1000,40638=>1000,40639=>1000,40640=>1000,40641=>1000,40642=>1000,40643=>1000,40644=>1000,40645=>1000,40646=>1000,40647=>1000,40648=>1000,40649=>1000,40650=>1000,40651=>1000,40652=>1000,40653=>1000,40654=>1000,40655=>1000,40656=>1000,40657=>1000,40658=>1000,40659=>1000,40660=>1000,40661=>1000,40662=>1000,40663=>1000,40664=>1000,40665=>1000,40666=>1000,40667=>1000,40668=>1000,40669=>1000,40670=>1000,40671=>1000,40672=>1000,40673=>1000,40674=>1000,40675=>1000,40676=>1000,40677=>1000,40678=>1000,40679=>1000,40680=>1000,40681=>1000,40682=>1000,40683=>1000,40684=>1000,40685=>1000,40686=>1000,40687=>1000,40688=>1000,40689=>1000,40690=>1000,40691=>1000,40692=>1000,40693=>1000,40694=>1000,40695=>1000,40696=>1000,40697=>1000,40698=>1000,40699=>1000,40700=>1000,40701=>1000,40702=>1000,40703=>1000,40704=>1000,40705=>1000,40706=>1000,40707=>1000,40708=>1000,40709=>1000,40710=>1000,40711=>1000,40712=>1000,40713=>1000,40714=>1000,40715=>1000,40716=>1000,40717=>1000,40718=>1000,40719=>1000,40720=>1000,40721=>1000,40722=>1000,40723=>1000,40724=>1000,40725=>1000,40726=>1000,40727=>1000,40728=>1000,40729=>1000,40730=>1000,40731=>1000,40732=>1000,40733=>1000,40734=>1000,40735=>1000,40736=>1000,40737=>1000,40738=>1000,40739=>1000,40740=>1000,40741=>1000,40742=>1000,40743=>1000,40744=>1000,40745=>1000,40746=>1000,40747=>1000,40748=>1000,40749=>1000,40750=>1000,40751=>1000,40752=>1000,40753=>1000,40754=>1000,40755=>1000,40756=>1000,40757=>1000,40758=>1000,40759=>1000,40760=>1000,40761=>1000,40762=>1000,40763=>1000,40764=>1000,40765=>1000,40766=>1000,40767=>1000,40768=>1000,40769=>1000,40770=>1000,40771=>1000,40772=>1000,40773=>1000,40774=>1000,40775=>1000,40776=>1000,40777=>1000,40778=>1000,40779=>1000,40780=>1000,40781=>1000,40782=>1000,40783=>1000,40784=>1000,40785=>1000,40786=>1000,40787=>1000,40788=>1000,40789=>1000,40790=>1000,40791=>1000,40792=>1000,40793=>1000,40794=>1000,40795=>1000,40796=>1000,40797=>1000,40798=>1000,40799=>1000,40800=>1000,40801=>1000,40802=>1000,40803=>1000,40804=>1000,40805=>1000,40806=>1000,40807=>1000,40808=>1000,40809=>1000,40810=>1000,40811=>1000,40812=>1000,40813=>1000,40814=>1000,40815=>1000,40816=>1000,40817=>1000,40818=>1000,40819=>1000,40820=>1000,40821=>1000,40822=>1000,40823=>1000,40824=>1000,40825=>1000,40826=>1000,40827=>1000,40828=>1000,40829=>1000,40830=>1000,40831=>1000,40832=>1000,40833=>1000,40834=>1000,40835=>1000,40836=>1000,40837=>1000,40838=>1000,40839=>1000,40840=>1000,40841=>1000,40842=>1000,40843=>1000,40844=>1000,40845=>1000,40846=>1000,40847=>1000,40848=>1000,40849=>1000,40850=>1000,40851=>1000,40852=>1000,40853=>1000,40854=>1000,40855=>1000,40856=>1000,40857=>1000,40858=>1000,40859=>1000,40860=>1000,40861=>1000,40862=>1000,40863=>1000,40864=>1000,40865=>1000,40866=>1000,40867=>1000,40868=>1000,40869=>1000,44032=>1000,44033=>1000,44034=>1000,44035=>1000,44036=>1000,44037=>1000,44038=>1000,44039=>1000,44040=>1000,44041=>1000,44042=>1000,44043=>1000,44044=>1000,44045=>1000,44046=>1000,44047=>1000,44048=>1000,44049=>1000,44050=>1000,44051=>1000,44052=>1000,44053=>1000,44054=>1000,44055=>1000,44056=>1000,44057=>1000,44058=>1000,44059=>1000,44060=>1000,44061=>1000,44062=>1000,44063=>1000,44064=>1000,44065=>1000,44066=>1000,44067=>1000,44068=>1000,44069=>1000,44070=>1000,44071=>1000,44072=>1000,44073=>1000,44074=>1000,44075=>1000,44076=>1000,44077=>1000,44078=>1000,44079=>1000,44080=>1000,44081=>1000,44082=>1000,44083=>1000,44084=>1000,44085=>1000,44086=>1000,44087=>1000,44088=>1000,44089=>1000,44090=>1000,44091=>1000,44092=>1000,44093=>1000,44094=>1000,44095=>1000,44096=>1000,44097=>1000,44098=>1000,44099=>1000,44100=>1000,44101=>1000,44102=>1000,44103=>1000,44104=>1000,44105=>1000,44106=>1000,44107=>1000,44108=>1000,44109=>1000,44110=>1000,44111=>1000,44112=>1000,44113=>1000,44114=>1000,44115=>1000,44116=>1000,44117=>1000,44118=>1000,44119=>1000,44120=>1000,44121=>1000,44122=>1000,44123=>1000,44124=>1000,44125=>1000,44126=>1000,44127=>1000,44128=>1000,44129=>1000,44130=>1000,44131=>1000,44132=>1000,44133=>1000,44134=>1000,44135=>1000,44136=>1000,44137=>1000,44138=>1000,44139=>1000,44140=>1000,44141=>1000,44142=>1000,44143=>1000,44144=>1000,44145=>1000,44146=>1000,44147=>1000,44148=>1000,44149=>1000,44150=>1000,44151=>1000,44152=>1000,44153=>1000,44154=>1000,44155=>1000,44156=>1000,44157=>1000,44158=>1000,44159=>1000,44160=>1000,44161=>1000,44162=>1000,44163=>1000,44164=>1000,44165=>1000,44166=>1000,44167=>1000,44168=>1000,44169=>1000,44170=>1000,44171=>1000,44172=>1000,44173=>1000,44174=>1000,44175=>1000,44176=>1000,44177=>1000,44178=>1000,44179=>1000,44180=>1000,44181=>1000,44182=>1000,44183=>1000,44184=>1000,44185=>1000,44186=>1000,44187=>1000,44188=>1000,44189=>1000,44190=>1000,44191=>1000,44192=>1000,44193=>1000,44194=>1000,44195=>1000,44196=>1000,44197=>1000,44198=>1000,44199=>1000,44200=>1000,44201=>1000,44202=>1000,44203=>1000,44204=>1000,44205=>1000,44206=>1000,44207=>1000,44208=>1000,44209=>1000,44210=>1000,44211=>1000,44212=>1000,44213=>1000,44214=>1000,44215=>1000,44216=>1000,44217=>1000,44218=>1000,44219=>1000,44220=>1000,44221=>1000,44222=>1000,44223=>1000,44224=>1000,44225=>1000,44226=>1000,44227=>1000,44228=>1000,44229=>1000,44230=>1000,44231=>1000,44232=>1000,44233=>1000,44234=>1000,44235=>1000,44236=>1000,44237=>1000,44238=>1000,44239=>1000,44240=>1000,44241=>1000,44242=>1000,44243=>1000,44244=>1000,44245=>1000,44246=>1000,44247=>1000,44248=>1000,44249=>1000,44250=>1000,44251=>1000,44252=>1000,44253=>1000,44254=>1000,44255=>1000,44256=>1000,44257=>1000,44258=>1000,44259=>1000,44260=>1000,44261=>1000,44262=>1000,44263=>1000,44264=>1000,44265=>1000,44266=>1000,44267=>1000,44268=>1000,44269=>1000,44270=>1000,44271=>1000,44272=>1000,44273=>1000,44274=>1000,44275=>1000,44276=>1000,44277=>1000,44278=>1000,44279=>1000,44280=>1000,44281=>1000,44282=>1000,44283=>1000,44284=>1000,44285=>1000,44286=>1000,44287=>1000,44288=>1000,44289=>1000,44290=>1000,44291=>1000,44292=>1000,44293=>1000,44294=>1000,44295=>1000,44296=>1000,44297=>1000,44298=>1000,44299=>1000,44300=>1000,44301=>1000,44302=>1000,44303=>1000,44304=>1000,44305=>1000,44306=>1000,44307=>1000,44308=>1000,44309=>1000,44310=>1000,44311=>1000,44312=>1000,44313=>1000,44314=>1000,44315=>1000,44316=>1000,44317=>1000,44318=>1000,44319=>1000,44320=>1000,44321=>1000,44322=>1000,44323=>1000,44324=>1000,44325=>1000,44326=>1000,44327=>1000,44328=>1000,44329=>1000,44330=>1000,44331=>1000,44332=>1000,44333=>1000,44334=>1000,44335=>1000,44336=>1000,44337=>1000,44338=>1000,44339=>1000,44340=>1000,44341=>1000,44342=>1000,44343=>1000,44344=>1000,44345=>1000,44346=>1000,44347=>1000,44348=>1000,44349=>1000,44350=>1000,44351=>1000,44352=>1000,44353=>1000,44354=>1000,44355=>1000,44356=>1000,44357=>1000,44358=>1000,44359=>1000,44360=>1000,44361=>1000,44362=>1000,44363=>1000,44364=>1000,44365=>1000,44366=>1000,44367=>1000,44368=>1000,44369=>1000,44370=>1000,44371=>1000,44372=>1000,44373=>1000,44374=>1000,44375=>1000,44376=>1000,44377=>1000,44378=>1000,44379=>1000,44380=>1000,44381=>1000,44382=>1000,44383=>1000,44384=>1000,44385=>1000,44386=>1000,44387=>1000,44388=>1000,44389=>1000,44390=>1000,44391=>1000,44392=>1000,44393=>1000,44394=>1000,44395=>1000,44396=>1000,44397=>1000,44398=>1000,44399=>1000,44400=>1000,44401=>1000,44402=>1000,44403=>1000,44404=>1000,44405=>1000,44406=>1000,44407=>1000,44408=>1000,44409=>1000,44410=>1000,44411=>1000,44412=>1000,44413=>1000,44414=>1000,44415=>1000,44416=>1000,44417=>1000,44418=>1000,44419=>1000,44420=>1000,44421=>1000,44422=>1000,44423=>1000,44424=>1000,44425=>1000,44426=>1000,44427=>1000,44428=>1000,44429=>1000,44430=>1000,44431=>1000,44432=>1000,44433=>1000,44434=>1000,44435=>1000,44436=>1000,44437=>1000,44438=>1000,44439=>1000,44440=>1000,44441=>1000,44442=>1000,44443=>1000,44444=>1000,44445=>1000,44446=>1000,44447=>1000,44448=>1000,44449=>1000,44450=>1000,44451=>1000,44452=>1000,44453=>1000,44454=>1000,44455=>1000,44456=>1000,44457=>1000,44458=>1000,44459=>1000,44460=>1000,44461=>1000,44462=>1000,44463=>1000,44464=>1000,44465=>1000,44466=>1000,44467=>1000,44468=>1000,44469=>1000,44470=>1000,44471=>1000,44472=>1000,44473=>1000,44474=>1000,44475=>1000,44476=>1000,44477=>1000,44478=>1000,44479=>1000,44480=>1000,44481=>1000,44482=>1000,44483=>1000,44484=>1000,44485=>1000,44486=>1000,44487=>1000,44488=>1000,44489=>1000,44490=>1000,44491=>1000,44492=>1000,44493=>1000,44494=>1000,44495=>1000,44496=>1000,44497=>1000,44498=>1000,44499=>1000,44500=>1000,44501=>1000,44502=>1000,44503=>1000,44504=>1000,44505=>1000,44506=>1000,44507=>1000,44508=>1000,44509=>1000,44510=>1000,44511=>1000,44512=>1000,44513=>1000,44514=>1000,44515=>1000,44516=>1000,44517=>1000,44518=>1000,44519=>1000,44520=>1000,44521=>1000,44522=>1000,44523=>1000,44524=>1000,44525=>1000,44526=>1000,44527=>1000,44528=>1000,44529=>1000,44530=>1000,44531=>1000,44532=>1000,44533=>1000,44534=>1000,44535=>1000,44536=>1000,44537=>1000,44538=>1000,44539=>1000,44540=>1000,44541=>1000,44542=>1000,44543=>1000,44544=>1000,44545=>1000,44546=>1000,44547=>1000,44548=>1000,44549=>1000,44550=>1000,44551=>1000,44552=>1000,44553=>1000,44554=>1000,44555=>1000,44556=>1000,44557=>1000,44558=>1000,44559=>1000,44560=>1000,44561=>1000,44562=>1000,44563=>1000,44564=>1000,44565=>1000,44566=>1000,44567=>1000,44568=>1000,44569=>1000,44570=>1000,44571=>1000,44572=>1000,44573=>1000,44574=>1000,44575=>1000,44576=>1000,44577=>1000,44578=>1000,44579=>1000,44580=>1000,44581=>1000,44582=>1000,44583=>1000,44584=>1000,44585=>1000,44586=>1000,44587=>1000,44588=>1000,44589=>1000,44590=>1000,44591=>1000,44592=>1000,44593=>1000,44594=>1000,44595=>1000,44596=>1000,44597=>1000,44598=>1000,44599=>1000,44600=>1000,44601=>1000,44602=>1000,44603=>1000,44604=>1000,44605=>1000,44606=>1000,44607=>1000,44608=>1000,44609=>1000,44610=>1000,44611=>1000,44612=>1000,44613=>1000,44614=>1000,44615=>1000,44616=>1000,44617=>1000,44618=>1000,44619=>1000,44620=>1000,44621=>1000,44622=>1000,44623=>1000,44624=>1000,44625=>1000,44626=>1000,44627=>1000,44628=>1000,44629=>1000,44630=>1000,44631=>1000,44632=>1000,44633=>1000,44634=>1000,44635=>1000,44636=>1000,44637=>1000,44638=>1000,44639=>1000,44640=>1000,44641=>1000,44642=>1000,44643=>1000,44644=>1000,44645=>1000,44646=>1000,44647=>1000,44648=>1000,44649=>1000,44650=>1000,44651=>1000,44652=>1000,44653=>1000,44654=>1000,44655=>1000,44656=>1000,44657=>1000,44658=>1000,44659=>1000,44660=>1000,44661=>1000,44662=>1000,44663=>1000,44664=>1000,44665=>1000,44666=>1000,44667=>1000,44668=>1000,44669=>1000,44670=>1000,44671=>1000,44672=>1000,44673=>1000,44674=>1000,44675=>1000,44676=>1000,44677=>1000,44678=>1000,44679=>1000,44680=>1000,44681=>1000,44682=>1000,44683=>1000,44684=>1000,44685=>1000,44686=>1000,44687=>1000,44688=>1000,44689=>1000,44690=>1000,44691=>1000,44692=>1000,44693=>1000,44694=>1000,44695=>1000,44696=>1000,44697=>1000,44698=>1000,44699=>1000,44700=>1000,44701=>1000,44702=>1000,44703=>1000,44704=>1000,44705=>1000,44706=>1000,44707=>1000,44708=>1000,44709=>1000,44710=>1000,44711=>1000,44712=>1000,44713=>1000,44714=>1000,44715=>1000,44716=>1000,44717=>1000,44718=>1000,44719=>1000,44720=>1000,44721=>1000,44722=>1000,44723=>1000,44724=>1000,44725=>1000,44726=>1000,44727=>1000,44728=>1000,44729=>1000,44730=>1000,44731=>1000,44732=>1000,44733=>1000,44734=>1000,44735=>1000,44736=>1000,44737=>1000,44738=>1000,44739=>1000,44740=>1000,44741=>1000,44742=>1000,44743=>1000,44744=>1000,44745=>1000,44746=>1000,44747=>1000,44748=>1000,44749=>1000,44750=>1000,44751=>1000,44752=>1000,44753=>1000,44754=>1000,44755=>1000,44756=>1000,44757=>1000,44758=>1000,44759=>1000,44760=>1000,44761=>1000,44762=>1000,44763=>1000,44764=>1000,44765=>1000,44766=>1000,44767=>1000,44768=>1000,44769=>1000,44770=>1000,44771=>1000,44772=>1000,44773=>1000,44774=>1000,44775=>1000,44776=>1000,44777=>1000,44778=>1000,44779=>1000,44780=>1000,44781=>1000,44782=>1000,44783=>1000,44784=>1000,44785=>1000,44786=>1000,44787=>1000,44788=>1000,44789=>1000,44790=>1000,44791=>1000,44792=>1000,44793=>1000,44794=>1000,44795=>1000,44796=>1000,44797=>1000,44798=>1000,44799=>1000,44800=>1000,44801=>1000,44802=>1000,44803=>1000,44804=>1000,44805=>1000,44806=>1000,44807=>1000,44808=>1000,44809=>1000,44810=>1000,44811=>1000,44812=>1000,44813=>1000,44814=>1000,44815=>1000,44816=>1000,44817=>1000,44818=>1000,44819=>1000,44820=>1000,44821=>1000,44822=>1000,44823=>1000,44824=>1000,44825=>1000,44826=>1000,44827=>1000,44828=>1000,44829=>1000,44830=>1000,44831=>1000,44832=>1000,44833=>1000,44834=>1000,44835=>1000,44836=>1000,44837=>1000,44838=>1000,44839=>1000,44840=>1000,44841=>1000,44842=>1000,44843=>1000,44844=>1000,44845=>1000,44846=>1000,44847=>1000,44848=>1000,44849=>1000,44850=>1000,44851=>1000,44852=>1000,44853=>1000,44854=>1000,44855=>1000,44856=>1000,44857=>1000,44858=>1000,44859=>1000,44860=>1000,44861=>1000,44862=>1000,44863=>1000,44864=>1000,44865=>1000,44866=>1000,44867=>1000,44868=>1000,44869=>1000,44870=>1000,44871=>1000,44872=>1000,44873=>1000,44874=>1000,44875=>1000,44876=>1000,44877=>1000,44878=>1000,44879=>1000,44880=>1000,44881=>1000,44882=>1000,44883=>1000,44884=>1000,44885=>1000,44886=>1000,44887=>1000,44888=>1000,44889=>1000,44890=>1000,44891=>1000,44892=>1000,44893=>1000,44894=>1000,44895=>1000,44896=>1000,44897=>1000,44898=>1000,44899=>1000,44900=>1000,44901=>1000,44902=>1000,44903=>1000,44904=>1000,44905=>1000,44906=>1000,44907=>1000,44908=>1000,44909=>1000,44910=>1000,44911=>1000,44912=>1000,44913=>1000,44914=>1000,44915=>1000,44916=>1000,44917=>1000,44918=>1000,44919=>1000,44920=>1000,44921=>1000,44922=>1000,44923=>1000,44924=>1000,44925=>1000,44926=>1000,44927=>1000,44928=>1000,44929=>1000,44930=>1000,44931=>1000,44932=>1000,44933=>1000,44934=>1000,44935=>1000,44936=>1000,44937=>1000,44938=>1000,44939=>1000,44940=>1000,44941=>1000,44942=>1000,44943=>1000,44944=>1000,44945=>1000,44946=>1000,44947=>1000,44948=>1000,44949=>1000,44950=>1000,44951=>1000,44952=>1000,44953=>1000,44954=>1000,44955=>1000,44956=>1000,44957=>1000,44958=>1000,44959=>1000,44960=>1000,44961=>1000,44962=>1000,44963=>1000,44964=>1000,44965=>1000,44966=>1000,44967=>1000,44968=>1000,44969=>1000,44970=>1000,44971=>1000,44972=>1000,44973=>1000,44974=>1000,44975=>1000,44976=>1000,44977=>1000,44978=>1000,44979=>1000,44980=>1000,44981=>1000,44982=>1000,44983=>1000,44984=>1000,44985=>1000,44986=>1000,44987=>1000,44988=>1000,44989=>1000,44990=>1000,44991=>1000,44992=>1000,44993=>1000,44994=>1000,44995=>1000,44996=>1000,44997=>1000,44998=>1000,44999=>1000,45000=>1000,45001=>1000,45002=>1000,45003=>1000,45004=>1000,45005=>1000,45006=>1000,45007=>1000,45008=>1000,45009=>1000,45010=>1000,45011=>1000,45012=>1000,45013=>1000,45014=>1000,45015=>1000,45016=>1000,45017=>1000,45018=>1000,45019=>1000,45020=>1000,45021=>1000,45022=>1000,45023=>1000,45024=>1000,45025=>1000,45026=>1000,45027=>1000,45028=>1000,45029=>1000,45030=>1000,45031=>1000,45032=>1000,45033=>1000,45034=>1000,45035=>1000,45036=>1000,45037=>1000,45038=>1000,45039=>1000,45040=>1000,45041=>1000,45042=>1000,45043=>1000,45044=>1000,45045=>1000,45046=>1000,45047=>1000,45048=>1000,45049=>1000,45050=>1000,45051=>1000,45052=>1000,45053=>1000,45054=>1000,45055=>1000,45056=>1000,45057=>1000,45058=>1000,45059=>1000,45060=>1000,45061=>1000,45062=>1000,45063=>1000,45064=>1000,45065=>1000,45066=>1000,45067=>1000,45068=>1000,45069=>1000,45070=>1000,45071=>1000,45072=>1000,45073=>1000,45074=>1000,45075=>1000,45076=>1000,45077=>1000,45078=>1000,45079=>1000,45080=>1000,45081=>1000,45082=>1000,45083=>1000,45084=>1000,45085=>1000,45086=>1000,45087=>1000,45088=>1000,45089=>1000,45090=>1000,45091=>1000,45092=>1000,45093=>1000,45094=>1000,45095=>1000,45096=>1000,45097=>1000,45098=>1000,45099=>1000,45100=>1000,45101=>1000,45102=>1000,45103=>1000,45104=>1000,45105=>1000,45106=>1000,45107=>1000,45108=>1000,45109=>1000,45110=>1000,45111=>1000,45112=>1000,45113=>1000,45114=>1000,45115=>1000,45116=>1000,45117=>1000,45118=>1000,45119=>1000,45120=>1000,45121=>1000,45122=>1000,45123=>1000,45124=>1000,45125=>1000,45126=>1000,45127=>1000,45128=>1000,45129=>1000,45130=>1000,45131=>1000,45132=>1000,45133=>1000,45134=>1000,45135=>1000,45136=>1000,45137=>1000,45138=>1000,45139=>1000,45140=>1000,45141=>1000,45142=>1000,45143=>1000,45144=>1000,45145=>1000,45146=>1000,45147=>1000,45148=>1000,45149=>1000,45150=>1000,45151=>1000,45152=>1000,45153=>1000,45154=>1000,45155=>1000,45156=>1000,45157=>1000,45158=>1000,45159=>1000,45160=>1000,45161=>1000,45162=>1000,45163=>1000,45164=>1000,45165=>1000,45166=>1000,45167=>1000,45168=>1000,45169=>1000,45170=>1000,45171=>1000,45172=>1000,45173=>1000,45174=>1000,45175=>1000,45176=>1000,45177=>1000,45178=>1000,45179=>1000,45180=>1000,45181=>1000,45182=>1000,45183=>1000,45184=>1000,45185=>1000,45186=>1000,45187=>1000,45188=>1000,45189=>1000,45190=>1000,45191=>1000,45192=>1000,45193=>1000,45194=>1000,45195=>1000,45196=>1000,45197=>1000,45198=>1000,45199=>1000,45200=>1000,45201=>1000,45202=>1000,45203=>1000,45204=>1000,45205=>1000,45206=>1000,45207=>1000,45208=>1000,45209=>1000,45210=>1000,45211=>1000,45212=>1000,45213=>1000,45214=>1000,45215=>1000,45216=>1000,45217=>1000,45218=>1000,45219=>1000,45220=>1000,45221=>1000,45222=>1000,45223=>1000,45224=>1000,45225=>1000,45226=>1000,45227=>1000,45228=>1000,45229=>1000,45230=>1000,45231=>1000,45232=>1000,45233=>1000,45234=>1000,45235=>1000,45236=>1000,45237=>1000,45238=>1000,45239=>1000,45240=>1000,45241=>1000,45242=>1000,45243=>1000,45244=>1000,45245=>1000,45246=>1000,45247=>1000,45248=>1000,45249=>1000,45250=>1000,45251=>1000,45252=>1000,45253=>1000,45254=>1000,45255=>1000,45256=>1000,45257=>1000,45258=>1000,45259=>1000,45260=>1000,45261=>1000,45262=>1000,45263=>1000,45264=>1000,45265=>1000,45266=>1000,45267=>1000,45268=>1000,45269=>1000,45270=>1000,45271=>1000,45272=>1000,45273=>1000,45274=>1000,45275=>1000,45276=>1000,45277=>1000,45278=>1000,45279=>1000,45280=>1000,45281=>1000,45282=>1000,45283=>1000,45284=>1000,45285=>1000,45286=>1000,45287=>1000,45288=>1000,45289=>1000,45290=>1000,45291=>1000,45292=>1000,45293=>1000,45294=>1000,45295=>1000,45296=>1000,45297=>1000,45298=>1000,45299=>1000,45300=>1000,45301=>1000,45302=>1000,45303=>1000,45304=>1000,45305=>1000,45306=>1000,45307=>1000,45308=>1000,45309=>1000,45310=>1000,45311=>1000,45312=>1000,45313=>1000,45314=>1000,45315=>1000,45316=>1000,45317=>1000,45318=>1000,45319=>1000,45320=>1000,45321=>1000,45322=>1000,45323=>1000,45324=>1000,45325=>1000,45326=>1000,45327=>1000,45328=>1000,45329=>1000,45330=>1000,45331=>1000,45332=>1000,45333=>1000,45334=>1000,45335=>1000,45336=>1000,45337=>1000,45338=>1000,45339=>1000,45340=>1000,45341=>1000,45342=>1000,45343=>1000,45344=>1000,45345=>1000,45346=>1000,45347=>1000,45348=>1000,45349=>1000,45350=>1000,45351=>1000,45352=>1000,45353=>1000,45354=>1000,45355=>1000,45356=>1000,45357=>1000,45358=>1000,45359=>1000,45360=>1000,45361=>1000,45362=>1000,45363=>1000,45364=>1000,45365=>1000,45366=>1000,45367=>1000,45368=>1000,45369=>1000,45370=>1000,45371=>1000,45372=>1000,45373=>1000,45374=>1000,45375=>1000,45376=>1000,45377=>1000,45378=>1000,45379=>1000,45380=>1000,45381=>1000,45382=>1000,45383=>1000,45384=>1000,45385=>1000,45386=>1000,45387=>1000,45388=>1000,45389=>1000,45390=>1000,45391=>1000,45392=>1000,45393=>1000,45394=>1000,45395=>1000,45396=>1000,45397=>1000,45398=>1000,45399=>1000,45400=>1000,45401=>1000,45402=>1000,45403=>1000,45404=>1000,45405=>1000,45406=>1000,45407=>1000,45408=>1000,45409=>1000,45410=>1000,45411=>1000,45412=>1000,45413=>1000,45414=>1000,45415=>1000,45416=>1000,45417=>1000,45418=>1000,45419=>1000,45420=>1000,45421=>1000,45422=>1000,45423=>1000,45424=>1000,45425=>1000,45426=>1000,45427=>1000,45428=>1000,45429=>1000,45430=>1000,45431=>1000,45432=>1000,45433=>1000,45434=>1000,45435=>1000,45436=>1000,45437=>1000,45438=>1000,45439=>1000,45440=>1000,45441=>1000,45442=>1000,45443=>1000,45444=>1000,45445=>1000,45446=>1000,45447=>1000,45448=>1000,45449=>1000,45450=>1000,45451=>1000,45452=>1000,45453=>1000,45454=>1000,45455=>1000,45456=>1000,45457=>1000,45458=>1000,45459=>1000,45460=>1000,45461=>1000,45462=>1000,45463=>1000,45464=>1000,45465=>1000,45466=>1000,45467=>1000,45468=>1000,45469=>1000,45470=>1000,45471=>1000,45472=>1000,45473=>1000,45474=>1000,45475=>1000,45476=>1000,45477=>1000,45478=>1000,45479=>1000,45480=>1000,45481=>1000,45482=>1000,45483=>1000,45484=>1000,45485=>1000,45486=>1000,45487=>1000,45488=>1000,45489=>1000,45490=>1000,45491=>1000,45492=>1000,45493=>1000,45494=>1000,45495=>1000,45496=>1000,45497=>1000,45498=>1000,45499=>1000,45500=>1000,45501=>1000,45502=>1000,45503=>1000,45504=>1000,45505=>1000,45506=>1000,45507=>1000,45508=>1000,45509=>1000,45510=>1000,45511=>1000,45512=>1000,45513=>1000,45514=>1000,45515=>1000,45516=>1000,45517=>1000,45518=>1000,45519=>1000,45520=>1000,45521=>1000,45522=>1000,45523=>1000,45524=>1000,45525=>1000,45526=>1000,45527=>1000,45528=>1000,45529=>1000,45530=>1000,45531=>1000,45532=>1000,45533=>1000,45534=>1000,45535=>1000,45536=>1000,45537=>1000,45538=>1000,45539=>1000,45540=>1000,45541=>1000,45542=>1000,45543=>1000,45544=>1000,45545=>1000,45546=>1000,45547=>1000,45548=>1000,45549=>1000,45550=>1000,45551=>1000,45552=>1000,45553=>1000,45554=>1000,45555=>1000,45556=>1000,45557=>1000,45558=>1000,45559=>1000,45560=>1000,45561=>1000,45562=>1000,45563=>1000,45564=>1000,45565=>1000,45566=>1000,45567=>1000,45568=>1000,45569=>1000,45570=>1000,45571=>1000,45572=>1000,45573=>1000,45574=>1000,45575=>1000,45576=>1000,45577=>1000,45578=>1000,45579=>1000,45580=>1000,45581=>1000,45582=>1000,45583=>1000,45584=>1000,45585=>1000,45586=>1000,45587=>1000,45588=>1000,45589=>1000,45590=>1000,45591=>1000,45592=>1000,45593=>1000,45594=>1000,45595=>1000,45596=>1000,45597=>1000,45598=>1000,45599=>1000,45600=>1000,45601=>1000,45602=>1000,45603=>1000,45604=>1000,45605=>1000,45606=>1000,45607=>1000,45608=>1000,45609=>1000,45610=>1000,45611=>1000,45612=>1000,45613=>1000,45614=>1000,45615=>1000,45616=>1000,45617=>1000,45618=>1000,45619=>1000,45620=>1000,45621=>1000,45622=>1000,45623=>1000,45624=>1000,45625=>1000,45626=>1000,45627=>1000,45628=>1000,45629=>1000,45630=>1000,45631=>1000,45632=>1000,45633=>1000,45634=>1000,45635=>1000,45636=>1000,45637=>1000,45638=>1000,45639=>1000,45640=>1000,45641=>1000,45642=>1000,45643=>1000,45644=>1000,45645=>1000,45646=>1000,45647=>1000,45648=>1000,45649=>1000,45650=>1000,45651=>1000,45652=>1000,45653=>1000,45654=>1000,45655=>1000,45656=>1000,45657=>1000,45658=>1000,45659=>1000,45660=>1000,45661=>1000,45662=>1000,45663=>1000,45664=>1000,45665=>1000,45666=>1000,45667=>1000,45668=>1000,45669=>1000,45670=>1000,45671=>1000,45672=>1000,45673=>1000,45674=>1000,45675=>1000,45676=>1000,45677=>1000,45678=>1000,45679=>1000,45680=>1000,45681=>1000,45682=>1000,45683=>1000,45684=>1000,45685=>1000,45686=>1000,45687=>1000,45688=>1000,45689=>1000,45690=>1000,45691=>1000,45692=>1000,45693=>1000,45694=>1000,45695=>1000,45696=>1000,45697=>1000,45698=>1000,45699=>1000,45700=>1000,45701=>1000,45702=>1000,45703=>1000,45704=>1000,45705=>1000,45706=>1000,45707=>1000,45708=>1000,45709=>1000,45710=>1000,45711=>1000,45712=>1000,45713=>1000,45714=>1000,45715=>1000,45716=>1000,45717=>1000,45718=>1000,45719=>1000,45720=>1000,45721=>1000,45722=>1000,45723=>1000,45724=>1000,45725=>1000,45726=>1000,45727=>1000,45728=>1000,45729=>1000,45730=>1000,45731=>1000,45732=>1000,45733=>1000,45734=>1000,45735=>1000,45736=>1000,45737=>1000,45738=>1000,45739=>1000,45740=>1000,45741=>1000,45742=>1000,45743=>1000,45744=>1000,45745=>1000,45746=>1000,45747=>1000,45748=>1000,45749=>1000,45750=>1000,45751=>1000,45752=>1000,45753=>1000,45754=>1000,45755=>1000,45756=>1000,45757=>1000,45758=>1000,45759=>1000,45760=>1000,45761=>1000,45762=>1000,45763=>1000,45764=>1000,45765=>1000,45766=>1000,45767=>1000,45768=>1000,45769=>1000,45770=>1000,45771=>1000,45772=>1000,45773=>1000,45774=>1000,45775=>1000,45776=>1000,45777=>1000,45778=>1000,45779=>1000,45780=>1000,45781=>1000,45782=>1000,45783=>1000,45784=>1000,45785=>1000,45786=>1000,45787=>1000,45788=>1000,45789=>1000,45790=>1000,45791=>1000,45792=>1000,45793=>1000,45794=>1000,45795=>1000,45796=>1000,45797=>1000,45798=>1000,45799=>1000,45800=>1000,45801=>1000,45802=>1000,45803=>1000,45804=>1000,45805=>1000,45806=>1000,45807=>1000,45808=>1000,45809=>1000,45810=>1000,45811=>1000,45812=>1000,45813=>1000,45814=>1000,45815=>1000,45816=>1000,45817=>1000,45818=>1000,45819=>1000,45820=>1000,45821=>1000,45822=>1000,45823=>1000,45824=>1000,45825=>1000,45826=>1000,45827=>1000,45828=>1000,45829=>1000,45830=>1000,45831=>1000,45832=>1000,45833=>1000,45834=>1000,45835=>1000,45836=>1000,45837=>1000,45838=>1000,45839=>1000,45840=>1000,45841=>1000,45842=>1000,45843=>1000,45844=>1000,45845=>1000,45846=>1000,45847=>1000,45848=>1000,45849=>1000,45850=>1000,45851=>1000,45852=>1000,45853=>1000,45854=>1000,45855=>1000,45856=>1000,45857=>1000,45858=>1000,45859=>1000,45860=>1000,45861=>1000,45862=>1000,45863=>1000,45864=>1000,45865=>1000,45866=>1000,45867=>1000,45868=>1000,45869=>1000,45870=>1000,45871=>1000,45872=>1000,45873=>1000,45874=>1000,45875=>1000,45876=>1000,45877=>1000,45878=>1000,45879=>1000,45880=>1000,45881=>1000,45882=>1000,45883=>1000,45884=>1000,45885=>1000,45886=>1000,45887=>1000,45888=>1000,45889=>1000,45890=>1000,45891=>1000,45892=>1000,45893=>1000,45894=>1000,45895=>1000,45896=>1000,45897=>1000,45898=>1000,45899=>1000,45900=>1000,45901=>1000,45902=>1000,45903=>1000,45904=>1000,45905=>1000,45906=>1000,45907=>1000,45908=>1000,45909=>1000,45910=>1000,45911=>1000,45912=>1000,45913=>1000,45914=>1000,45915=>1000,45916=>1000,45917=>1000,45918=>1000,45919=>1000,45920=>1000,45921=>1000,45922=>1000,45923=>1000,45924=>1000,45925=>1000,45926=>1000,45927=>1000,45928=>1000,45929=>1000,45930=>1000,45931=>1000,45932=>1000,45933=>1000,45934=>1000,45935=>1000,45936=>1000,45937=>1000,45938=>1000,45939=>1000,45940=>1000,45941=>1000,45942=>1000,45943=>1000,45944=>1000,45945=>1000,45946=>1000,45947=>1000,45948=>1000,45949=>1000,45950=>1000,45951=>1000,45952=>1000,45953=>1000,45954=>1000,45955=>1000,45956=>1000,45957=>1000,45958=>1000,45959=>1000,45960=>1000,45961=>1000,45962=>1000,45963=>1000,45964=>1000,45965=>1000,45966=>1000,45967=>1000,45968=>1000,45969=>1000,45970=>1000,45971=>1000,45972=>1000,45973=>1000,45974=>1000,45975=>1000,45976=>1000,45977=>1000,45978=>1000,45979=>1000,45980=>1000,45981=>1000,45982=>1000,45983=>1000,45984=>1000,45985=>1000,45986=>1000,45987=>1000,45988=>1000,45989=>1000,45990=>1000,45991=>1000,45992=>1000,45993=>1000,45994=>1000,45995=>1000,45996=>1000,45997=>1000,45998=>1000,45999=>1000,46000=>1000,46001=>1000,46002=>1000,46003=>1000,46004=>1000,46005=>1000,46006=>1000,46007=>1000,46008=>1000,46009=>1000,46010=>1000,46011=>1000,46012=>1000,46013=>1000,46014=>1000,46015=>1000,46016=>1000,46017=>1000,46018=>1000,46019=>1000,46020=>1000,46021=>1000,46022=>1000,46023=>1000,46024=>1000,46025=>1000,46026=>1000,46027=>1000,46028=>1000,46029=>1000,46030=>1000,46031=>1000,46032=>1000,46033=>1000,46034=>1000,46035=>1000,46036=>1000,46037=>1000,46038=>1000,46039=>1000,46040=>1000,46041=>1000,46042=>1000,46043=>1000,46044=>1000,46045=>1000,46046=>1000,46047=>1000,46048=>1000,46049=>1000,46050=>1000,46051=>1000,46052=>1000,46053=>1000,46054=>1000,46055=>1000,46056=>1000,46057=>1000,46058=>1000,46059=>1000,46060=>1000,46061=>1000,46062=>1000,46063=>1000,46064=>1000,46065=>1000,46066=>1000,46067=>1000,46068=>1000,46069=>1000,46070=>1000,46071=>1000,46072=>1000,46073=>1000,46074=>1000,46075=>1000,46076=>1000,46077=>1000,46078=>1000,46079=>1000,46080=>1000,46081=>1000,46082=>1000,46083=>1000,46084=>1000,46085=>1000,46086=>1000,46087=>1000,46088=>1000,46089=>1000,46090=>1000,46091=>1000,46092=>1000,46093=>1000,46094=>1000,46095=>1000,46096=>1000,46097=>1000,46098=>1000,46099=>1000,46100=>1000,46101=>1000,46102=>1000,46103=>1000,46104=>1000,46105=>1000,46106=>1000,46107=>1000,46108=>1000,46109=>1000,46110=>1000,46111=>1000,46112=>1000,46113=>1000,46114=>1000,46115=>1000,46116=>1000,46117=>1000,46118=>1000,46119=>1000,46120=>1000,46121=>1000,46122=>1000,46123=>1000,46124=>1000,46125=>1000,46126=>1000,46127=>1000,46128=>1000,46129=>1000,46130=>1000,46131=>1000,46132=>1000,46133=>1000,46134=>1000,46135=>1000,46136=>1000,46137=>1000,46138=>1000,46139=>1000,46140=>1000,46141=>1000,46142=>1000,46143=>1000,46144=>1000,46145=>1000,46146=>1000,46147=>1000,46148=>1000,46149=>1000,46150=>1000,46151=>1000,46152=>1000,46153=>1000,46154=>1000,46155=>1000,46156=>1000,46157=>1000,46158=>1000,46159=>1000,46160=>1000,46161=>1000,46162=>1000,46163=>1000,46164=>1000,46165=>1000,46166=>1000,46167=>1000,46168=>1000,46169=>1000,46170=>1000,46171=>1000,46172=>1000,46173=>1000,46174=>1000,46175=>1000,46176=>1000,46177=>1000,46178=>1000,46179=>1000,46180=>1000,46181=>1000,46182=>1000,46183=>1000,46184=>1000,46185=>1000,46186=>1000,46187=>1000,46188=>1000,46189=>1000,46190=>1000,46191=>1000,46192=>1000,46193=>1000,46194=>1000,46195=>1000,46196=>1000,46197=>1000,46198=>1000,46199=>1000,46200=>1000,46201=>1000,46202=>1000,46203=>1000,46204=>1000,46205=>1000,46206=>1000,46207=>1000,46208=>1000,46209=>1000,46210=>1000,46211=>1000,46212=>1000,46213=>1000,46214=>1000,46215=>1000,46216=>1000,46217=>1000,46218=>1000,46219=>1000,46220=>1000,46221=>1000,46222=>1000,46223=>1000,46224=>1000,46225=>1000,46226=>1000,46227=>1000,46228=>1000,46229=>1000,46230=>1000,46231=>1000,46232=>1000,46233=>1000,46234=>1000,46235=>1000,46236=>1000,46237=>1000,46238=>1000,46239=>1000,46240=>1000,46241=>1000,46242=>1000,46243=>1000,46244=>1000,46245=>1000,46246=>1000,46247=>1000,46248=>1000,46249=>1000,46250=>1000,46251=>1000,46252=>1000,46253=>1000,46254=>1000,46255=>1000,46256=>1000,46257=>1000,46258=>1000,46259=>1000,46260=>1000,46261=>1000,46262=>1000,46263=>1000,46264=>1000,46265=>1000,46266=>1000,46267=>1000,46268=>1000,46269=>1000,46270=>1000,46271=>1000,46272=>1000,46273=>1000,46274=>1000,46275=>1000,46276=>1000,46277=>1000,46278=>1000,46279=>1000,46280=>1000,46281=>1000,46282=>1000,46283=>1000,46284=>1000,46285=>1000,46286=>1000,46287=>1000,46288=>1000,46289=>1000,46290=>1000,46291=>1000,46292=>1000,46293=>1000,46294=>1000,46295=>1000,46296=>1000,46297=>1000,46298=>1000,46299=>1000,46300=>1000,46301=>1000,46302=>1000,46303=>1000,46304=>1000,46305=>1000,46306=>1000,46307=>1000,46308=>1000,46309=>1000,46310=>1000,46311=>1000,46312=>1000,46313=>1000,46314=>1000,46315=>1000,46316=>1000,46317=>1000,46318=>1000,46319=>1000,46320=>1000,46321=>1000,46322=>1000,46323=>1000,46324=>1000,46325=>1000,46326=>1000,46327=>1000,46328=>1000,46329=>1000,46330=>1000,46331=>1000,46332=>1000,46333=>1000,46334=>1000,46335=>1000,46336=>1000,46337=>1000,46338=>1000,46339=>1000,46340=>1000,46341=>1000,46342=>1000,46343=>1000,46344=>1000,46345=>1000,46346=>1000,46347=>1000,46348=>1000,46349=>1000,46350=>1000,46351=>1000,46352=>1000,46353=>1000,46354=>1000,46355=>1000,46356=>1000,46357=>1000,46358=>1000,46359=>1000,46360=>1000,46361=>1000,46362=>1000,46363=>1000,46364=>1000,46365=>1000,46366=>1000,46367=>1000,46368=>1000,46369=>1000,46370=>1000,46371=>1000,46372=>1000,46373=>1000,46374=>1000,46375=>1000,46376=>1000,46377=>1000,46378=>1000,46379=>1000,46380=>1000,46381=>1000,46382=>1000,46383=>1000,46384=>1000,46385=>1000,46386=>1000,46387=>1000,46388=>1000,46389=>1000,46390=>1000,46391=>1000,46392=>1000,46393=>1000,46394=>1000,46395=>1000,46396=>1000,46397=>1000,46398=>1000,46399=>1000,46400=>1000,46401=>1000,46402=>1000,46403=>1000,46404=>1000,46405=>1000,46406=>1000,46407=>1000,46408=>1000,46409=>1000,46410=>1000,46411=>1000,46412=>1000,46413=>1000,46414=>1000,46415=>1000,46416=>1000,46417=>1000,46418=>1000,46419=>1000,46420=>1000,46421=>1000,46422=>1000,46423=>1000,46424=>1000,46425=>1000,46426=>1000,46427=>1000,46428=>1000,46429=>1000,46430=>1000,46431=>1000,46432=>1000,46433=>1000,46434=>1000,46435=>1000,46436=>1000,46437=>1000,46438=>1000,46439=>1000,46440=>1000,46441=>1000,46442=>1000,46443=>1000,46444=>1000,46445=>1000,46446=>1000,46447=>1000,46448=>1000,46449=>1000,46450=>1000,46451=>1000,46452=>1000,46453=>1000,46454=>1000,46455=>1000,46456=>1000,46457=>1000,46458=>1000,46459=>1000,46460=>1000,46461=>1000,46462=>1000,46463=>1000,46464=>1000,46465=>1000,46466=>1000,46467=>1000,46468=>1000,46469=>1000,46470=>1000,46471=>1000,46472=>1000,46473=>1000,46474=>1000,46475=>1000,46476=>1000,46477=>1000,46478=>1000,46479=>1000,46480=>1000,46481=>1000,46482=>1000,46483=>1000,46484=>1000,46485=>1000,46486=>1000,46487=>1000,46488=>1000,46489=>1000,46490=>1000,46491=>1000,46492=>1000,46493=>1000,46494=>1000,46495=>1000,46496=>1000,46497=>1000,46498=>1000,46499=>1000,46500=>1000,46501=>1000,46502=>1000,46503=>1000,46504=>1000,46505=>1000,46506=>1000,46507=>1000,46508=>1000,46509=>1000,46510=>1000,46511=>1000,46512=>1000,46513=>1000,46514=>1000,46515=>1000,46516=>1000,46517=>1000,46518=>1000,46519=>1000,46520=>1000,46521=>1000,46522=>1000,46523=>1000,46524=>1000,46525=>1000,46526=>1000,46527=>1000,46528=>1000,46529=>1000,46530=>1000,46531=>1000,46532=>1000,46533=>1000,46534=>1000,46535=>1000,46536=>1000,46537=>1000,46538=>1000,46539=>1000,46540=>1000,46541=>1000,46542=>1000,46543=>1000,46544=>1000,46545=>1000,46546=>1000,46547=>1000,46548=>1000,46549=>1000,46550=>1000,46551=>1000,46552=>1000,46553=>1000,46554=>1000,46555=>1000,46556=>1000,46557=>1000,46558=>1000,46559=>1000,46560=>1000,46561=>1000,46562=>1000,46563=>1000,46564=>1000,46565=>1000,46566=>1000,46567=>1000,46568=>1000,46569=>1000,46570=>1000,46571=>1000,46572=>1000,46573=>1000,46574=>1000,46575=>1000,46576=>1000,46577=>1000,46578=>1000,46579=>1000,46580=>1000,46581=>1000,46582=>1000,46583=>1000,46584=>1000,46585=>1000,46586=>1000,46587=>1000,46588=>1000,46589=>1000,46590=>1000,46591=>1000,46592=>1000,46593=>1000,46594=>1000,46595=>1000,46596=>1000,46597=>1000,46598=>1000,46599=>1000,46600=>1000,46601=>1000,46602=>1000,46603=>1000,46604=>1000,46605=>1000,46606=>1000,46607=>1000,46608=>1000,46609=>1000,46610=>1000,46611=>1000,46612=>1000,46613=>1000,46614=>1000,46615=>1000,46616=>1000,46617=>1000,46618=>1000,46619=>1000,46620=>1000,46621=>1000,46622=>1000,46623=>1000,46624=>1000,46625=>1000,46626=>1000,46627=>1000,46628=>1000,46629=>1000,46630=>1000,46631=>1000,46632=>1000,46633=>1000,46634=>1000,46635=>1000,46636=>1000,46637=>1000,46638=>1000,46639=>1000,46640=>1000,46641=>1000,46642=>1000,46643=>1000,46644=>1000,46645=>1000,46646=>1000,46647=>1000,46648=>1000,46649=>1000,46650=>1000,46651=>1000,46652=>1000,46653=>1000,46654=>1000,46655=>1000,46656=>1000,46657=>1000,46658=>1000,46659=>1000,46660=>1000,46661=>1000,46662=>1000,46663=>1000,46664=>1000,46665=>1000,46666=>1000,46667=>1000,46668=>1000,46669=>1000,46670=>1000,46671=>1000,46672=>1000,46673=>1000,46674=>1000,46675=>1000,46676=>1000,46677=>1000,46678=>1000,46679=>1000,46680=>1000,46681=>1000,46682=>1000,46683=>1000,46684=>1000,46685=>1000,46686=>1000,46687=>1000,46688=>1000,46689=>1000,46690=>1000,46691=>1000,46692=>1000,46693=>1000,46694=>1000,46695=>1000,46696=>1000,46697=>1000,46698=>1000,46699=>1000,46700=>1000,46701=>1000,46702=>1000,46703=>1000,46704=>1000,46705=>1000,46706=>1000,46707=>1000,46708=>1000,46709=>1000,46710=>1000,46711=>1000,46712=>1000,46713=>1000,46714=>1000,46715=>1000,46716=>1000,46717=>1000,46718=>1000,46719=>1000,46720=>1000,46721=>1000,46722=>1000,46723=>1000,46724=>1000,46725=>1000,46726=>1000,46727=>1000,46728=>1000,46729=>1000,46730=>1000,46731=>1000,46732=>1000,46733=>1000,46734=>1000,46735=>1000,46736=>1000,46737=>1000,46738=>1000,46739=>1000,46740=>1000,46741=>1000,46742=>1000,46743=>1000,46744=>1000,46745=>1000,46746=>1000,46747=>1000,46748=>1000,46749=>1000,46750=>1000,46751=>1000,46752=>1000,46753=>1000,46754=>1000,46755=>1000,46756=>1000,46757=>1000,46758=>1000,46759=>1000,46760=>1000,46761=>1000,46762=>1000,46763=>1000,46764=>1000,46765=>1000,46766=>1000,46767=>1000,46768=>1000,46769=>1000,46770=>1000,46771=>1000,46772=>1000,46773=>1000,46774=>1000,46775=>1000,46776=>1000,46777=>1000,46778=>1000,46779=>1000,46780=>1000,46781=>1000,46782=>1000,46783=>1000,46784=>1000,46785=>1000,46786=>1000,46787=>1000,46788=>1000,46789=>1000,46790=>1000,46791=>1000,46792=>1000,46793=>1000,46794=>1000,46795=>1000,46796=>1000,46797=>1000,46798=>1000,46799=>1000,46800=>1000,46801=>1000,46802=>1000,46803=>1000,46804=>1000,46805=>1000,46806=>1000,46807=>1000,46808=>1000,46809=>1000,46810=>1000,46811=>1000,46812=>1000,46813=>1000,46814=>1000,46815=>1000,46816=>1000,46817=>1000,46818=>1000,46819=>1000,46820=>1000,46821=>1000,46822=>1000,46823=>1000,46824=>1000,46825=>1000,46826=>1000,46827=>1000,46828=>1000,46829=>1000,46830=>1000,46831=>1000,46832=>1000,46833=>1000,46834=>1000,46835=>1000,46836=>1000,46837=>1000,46838=>1000,46839=>1000,46840=>1000,46841=>1000,46842=>1000,46843=>1000,46844=>1000,46845=>1000,46846=>1000,46847=>1000,46848=>1000,46849=>1000,46850=>1000,46851=>1000,46852=>1000,46853=>1000,46854=>1000,46855=>1000,46856=>1000,46857=>1000,46858=>1000,46859=>1000,46860=>1000,46861=>1000,46862=>1000,46863=>1000,46864=>1000,46865=>1000,46866=>1000,46867=>1000,46868=>1000,46869=>1000,46870=>1000,46871=>1000,46872=>1000,46873=>1000,46874=>1000,46875=>1000,46876=>1000,46877=>1000,46878=>1000,46879=>1000,46880=>1000,46881=>1000,46882=>1000,46883=>1000,46884=>1000,46885=>1000,46886=>1000,46887=>1000,46888=>1000,46889=>1000,46890=>1000,46891=>1000,46892=>1000,46893=>1000,46894=>1000,46895=>1000,46896=>1000,46897=>1000,46898=>1000,46899=>1000,46900=>1000,46901=>1000,46902=>1000,46903=>1000,46904=>1000,46905=>1000,46906=>1000,46907=>1000,46908=>1000,46909=>1000,46910=>1000,46911=>1000,46912=>1000,46913=>1000,46914=>1000,46915=>1000,46916=>1000,46917=>1000,46918=>1000,46919=>1000,46920=>1000,46921=>1000,46922=>1000,46923=>1000,46924=>1000,46925=>1000,46926=>1000,46927=>1000,46928=>1000,46929=>1000,46930=>1000,46931=>1000,46932=>1000,46933=>1000,46934=>1000,46935=>1000,46936=>1000,46937=>1000,46938=>1000,46939=>1000,46940=>1000,46941=>1000,46942=>1000,46943=>1000,46944=>1000,46945=>1000,46946=>1000,46947=>1000,46948=>1000,46949=>1000,46950=>1000,46951=>1000,46952=>1000,46953=>1000,46954=>1000,46955=>1000,46956=>1000,46957=>1000,46958=>1000,46959=>1000,46960=>1000,46961=>1000,46962=>1000,46963=>1000,46964=>1000,46965=>1000,46966=>1000,46967=>1000,46968=>1000,46969=>1000,46970=>1000,46971=>1000,46972=>1000,46973=>1000,46974=>1000,46975=>1000,46976=>1000,46977=>1000,46978=>1000,46979=>1000,46980=>1000,46981=>1000,46982=>1000,46983=>1000,46984=>1000,46985=>1000,46986=>1000,46987=>1000,46988=>1000,46989=>1000,46990=>1000,46991=>1000,46992=>1000,46993=>1000,46994=>1000,46995=>1000,46996=>1000,46997=>1000,46998=>1000,46999=>1000,47000=>1000,47001=>1000,47002=>1000,47003=>1000,47004=>1000,47005=>1000,47006=>1000,47007=>1000,47008=>1000,47009=>1000,47010=>1000,47011=>1000,47012=>1000,47013=>1000,47014=>1000,47015=>1000,47016=>1000,47017=>1000,47018=>1000,47019=>1000,47020=>1000,47021=>1000,47022=>1000,47023=>1000,47024=>1000,47025=>1000,47026=>1000,47027=>1000,47028=>1000,47029=>1000,47030=>1000,47031=>1000,47032=>1000,47033=>1000,47034=>1000,47035=>1000,47036=>1000,47037=>1000,47038=>1000,47039=>1000,47040=>1000,47041=>1000,47042=>1000,47043=>1000,47044=>1000,47045=>1000,47046=>1000,47047=>1000,47048=>1000,47049=>1000,47050=>1000,47051=>1000,47052=>1000,47053=>1000,47054=>1000,47055=>1000,47056=>1000,47057=>1000,47058=>1000,47059=>1000,47060=>1000,47061=>1000,47062=>1000,47063=>1000,47064=>1000,47065=>1000,47066=>1000,47067=>1000,47068=>1000,47069=>1000,47070=>1000,47071=>1000,47072=>1000,47073=>1000,47074=>1000,47075=>1000,47076=>1000,47077=>1000,47078=>1000,47079=>1000,47080=>1000,47081=>1000,47082=>1000,47083=>1000,47084=>1000,47085=>1000,47086=>1000,47087=>1000,47088=>1000,47089=>1000,47090=>1000,47091=>1000,47092=>1000,47093=>1000,47094=>1000,47095=>1000,47096=>1000,47097=>1000,47098=>1000,47099=>1000,47100=>1000,47101=>1000,47102=>1000,47103=>1000,47104=>1000,47105=>1000,47106=>1000,47107=>1000,47108=>1000,47109=>1000,47110=>1000,47111=>1000,47112=>1000,47113=>1000,47114=>1000,47115=>1000,47116=>1000,47117=>1000,47118=>1000,47119=>1000,47120=>1000,47121=>1000,47122=>1000,47123=>1000,47124=>1000,47125=>1000,47126=>1000,47127=>1000,47128=>1000,47129=>1000,47130=>1000,47131=>1000,47132=>1000,47133=>1000,47134=>1000,47135=>1000,47136=>1000,47137=>1000,47138=>1000,47139=>1000,47140=>1000,47141=>1000,47142=>1000,47143=>1000,47144=>1000,47145=>1000,47146=>1000,47147=>1000,47148=>1000,47149=>1000,47150=>1000,47151=>1000,47152=>1000,47153=>1000,47154=>1000,47155=>1000,47156=>1000,47157=>1000,47158=>1000,47159=>1000,47160=>1000,47161=>1000,47162=>1000,47163=>1000,47164=>1000,47165=>1000,47166=>1000,47167=>1000,47168=>1000,47169=>1000,47170=>1000,47171=>1000,47172=>1000,47173=>1000,47174=>1000,47175=>1000,47176=>1000,47177=>1000,47178=>1000,47179=>1000,47180=>1000,47181=>1000,47182=>1000,47183=>1000,47184=>1000,47185=>1000,47186=>1000,47187=>1000,47188=>1000,47189=>1000,47190=>1000,47191=>1000,47192=>1000,47193=>1000,47194=>1000,47195=>1000,47196=>1000,47197=>1000,47198=>1000,47199=>1000,47200=>1000,47201=>1000,47202=>1000,47203=>1000,47204=>1000,47205=>1000,47206=>1000,47207=>1000,47208=>1000,47209=>1000,47210=>1000,47211=>1000,47212=>1000,47213=>1000,47214=>1000,47215=>1000,47216=>1000,47217=>1000,47218=>1000,47219=>1000,47220=>1000,47221=>1000,47222=>1000,47223=>1000,47224=>1000,47225=>1000,47226=>1000,47227=>1000,47228=>1000,47229=>1000,47230=>1000,47231=>1000,47232=>1000,47233=>1000,47234=>1000,47235=>1000,47236=>1000,47237=>1000,47238=>1000,47239=>1000,47240=>1000,47241=>1000,47242=>1000,47243=>1000,47244=>1000,47245=>1000,47246=>1000,47247=>1000,47248=>1000,47249=>1000,47250=>1000,47251=>1000,47252=>1000,47253=>1000,47254=>1000,47255=>1000,47256=>1000,47257=>1000,47258=>1000,47259=>1000,47260=>1000,47261=>1000,47262=>1000,47263=>1000,47264=>1000,47265=>1000,47266=>1000,47267=>1000,47268=>1000,47269=>1000,47270=>1000,47271=>1000,47272=>1000,47273=>1000,47274=>1000,47275=>1000,47276=>1000,47277=>1000,47278=>1000,47279=>1000,47280=>1000,47281=>1000,47282=>1000,47283=>1000,47284=>1000,47285=>1000,47286=>1000,47287=>1000,47288=>1000,47289=>1000,47290=>1000,47291=>1000,47292=>1000,47293=>1000,47294=>1000,47295=>1000,47296=>1000,47297=>1000,47298=>1000,47299=>1000,47300=>1000,47301=>1000,47302=>1000,47303=>1000,47304=>1000,47305=>1000,47306=>1000,47307=>1000,47308=>1000,47309=>1000,47310=>1000,47311=>1000,47312=>1000,47313=>1000,47314=>1000,47315=>1000,47316=>1000,47317=>1000,47318=>1000,47319=>1000,47320=>1000,47321=>1000,47322=>1000,47323=>1000,47324=>1000,47325=>1000,47326=>1000,47327=>1000,47328=>1000,47329=>1000,47330=>1000,47331=>1000,47332=>1000,47333=>1000,47334=>1000,47335=>1000,47336=>1000,47337=>1000,47338=>1000,47339=>1000,47340=>1000,47341=>1000,47342=>1000,47343=>1000,47344=>1000,47345=>1000,47346=>1000,47347=>1000,47348=>1000,47349=>1000,47350=>1000,47351=>1000,47352=>1000,47353=>1000,47354=>1000,47355=>1000,47356=>1000,47357=>1000,47358=>1000,47359=>1000,47360=>1000,47361=>1000,47362=>1000,47363=>1000,47364=>1000,47365=>1000,47366=>1000,47367=>1000,47368=>1000,47369=>1000,47370=>1000,47371=>1000,47372=>1000,47373=>1000,47374=>1000,47375=>1000,47376=>1000,47377=>1000,47378=>1000,47379=>1000,47380=>1000,47381=>1000,47382=>1000,47383=>1000,47384=>1000,47385=>1000,47386=>1000,47387=>1000,47388=>1000,47389=>1000,47390=>1000,47391=>1000,47392=>1000,47393=>1000,47394=>1000,47395=>1000,47396=>1000,47397=>1000,47398=>1000,47399=>1000,47400=>1000,47401=>1000,47402=>1000,47403=>1000,47404=>1000,47405=>1000,47406=>1000,47407=>1000,47408=>1000,47409=>1000,47410=>1000,47411=>1000,47412=>1000,47413=>1000,47414=>1000,47415=>1000,47416=>1000,47417=>1000,47418=>1000,47419=>1000,47420=>1000,47421=>1000,47422=>1000,47423=>1000,47424=>1000,47425=>1000,47426=>1000,47427=>1000,47428=>1000,47429=>1000,47430=>1000,47431=>1000,47432=>1000,47433=>1000,47434=>1000,47435=>1000,47436=>1000,47437=>1000,47438=>1000,47439=>1000,47440=>1000,47441=>1000,47442=>1000,47443=>1000,47444=>1000,47445=>1000,47446=>1000,47447=>1000,47448=>1000,47449=>1000,47450=>1000,47451=>1000,47452=>1000,47453=>1000,47454=>1000,47455=>1000,47456=>1000,47457=>1000,47458=>1000,47459=>1000,47460=>1000,47461=>1000,47462=>1000,47463=>1000,47464=>1000,47465=>1000,47466=>1000,47467=>1000,47468=>1000,47469=>1000,47470=>1000,47471=>1000,47472=>1000,47473=>1000,47474=>1000,47475=>1000,47476=>1000,47477=>1000,47478=>1000,47479=>1000,47480=>1000,47481=>1000,47482=>1000,47483=>1000,47484=>1000,47485=>1000,47486=>1000,47487=>1000,47488=>1000,47489=>1000,47490=>1000,47491=>1000,47492=>1000,47493=>1000,47494=>1000,47495=>1000,47496=>1000,47497=>1000,47498=>1000,47499=>1000,47500=>1000,47501=>1000,47502=>1000,47503=>1000,47504=>1000,47505=>1000,47506=>1000,47507=>1000,47508=>1000,47509=>1000,47510=>1000,47511=>1000,47512=>1000,47513=>1000,47514=>1000,47515=>1000,47516=>1000,47517=>1000,47518=>1000,47519=>1000,47520=>1000,47521=>1000,47522=>1000,47523=>1000,47524=>1000,47525=>1000,47526=>1000,47527=>1000,47528=>1000,47529=>1000,47530=>1000,47531=>1000,47532=>1000,47533=>1000,47534=>1000,47535=>1000,47536=>1000,47537=>1000,47538=>1000,47539=>1000,47540=>1000,47541=>1000,47542=>1000,47543=>1000,47544=>1000,47545=>1000,47546=>1000,47547=>1000,47548=>1000,47549=>1000,47550=>1000,47551=>1000,47552=>1000,47553=>1000,47554=>1000,47555=>1000,47556=>1000,47557=>1000,47558=>1000,47559=>1000,47560=>1000,47561=>1000,47562=>1000,47563=>1000,47564=>1000,47565=>1000,47566=>1000,47567=>1000,47568=>1000,47569=>1000,47570=>1000,47571=>1000,47572=>1000,47573=>1000,47574=>1000,47575=>1000,47576=>1000,47577=>1000,47578=>1000,47579=>1000,47580=>1000,47581=>1000,47582=>1000,47583=>1000,47584=>1000,47585=>1000,47586=>1000,47587=>1000,47588=>1000,47589=>1000,47590=>1000,47591=>1000,47592=>1000,47593=>1000,47594=>1000,47595=>1000,47596=>1000,47597=>1000,47598=>1000,47599=>1000,47600=>1000,47601=>1000,47602=>1000,47603=>1000,47604=>1000,47605=>1000,47606=>1000,47607=>1000,47608=>1000,47609=>1000,47610=>1000,47611=>1000,47612=>1000,47613=>1000,47614=>1000,47615=>1000,47616=>1000,47617=>1000,47618=>1000,47619=>1000,47620=>1000,47621=>1000,47622=>1000,47623=>1000,47624=>1000,47625=>1000,47626=>1000,47627=>1000,47628=>1000,47629=>1000,47630=>1000,47631=>1000,47632=>1000,47633=>1000,47634=>1000,47635=>1000,47636=>1000,47637=>1000,47638=>1000,47639=>1000,47640=>1000,47641=>1000,47642=>1000,47643=>1000,47644=>1000,47645=>1000,47646=>1000,47647=>1000,47648=>1000,47649=>1000,47650=>1000,47651=>1000,47652=>1000,47653=>1000,47654=>1000,47655=>1000,47656=>1000,47657=>1000,47658=>1000,47659=>1000,47660=>1000,47661=>1000,47662=>1000,47663=>1000,47664=>1000,47665=>1000,47666=>1000,47667=>1000,47668=>1000,47669=>1000,47670=>1000,47671=>1000,47672=>1000,47673=>1000,47674=>1000,47675=>1000,47676=>1000,47677=>1000,47678=>1000,47679=>1000,47680=>1000,47681=>1000,47682=>1000,47683=>1000,47684=>1000,47685=>1000,47686=>1000,47687=>1000,47688=>1000,47689=>1000,47690=>1000,47691=>1000,47692=>1000,47693=>1000,47694=>1000,47695=>1000,47696=>1000,47697=>1000,47698=>1000,47699=>1000,47700=>1000,47701=>1000,47702=>1000,47703=>1000,47704=>1000,47705=>1000,47706=>1000,47707=>1000,47708=>1000,47709=>1000,47710=>1000,47711=>1000,47712=>1000,47713=>1000,47714=>1000,47715=>1000,47716=>1000,47717=>1000,47718=>1000,47719=>1000,47720=>1000,47721=>1000,47722=>1000,47723=>1000,47724=>1000,47725=>1000,47726=>1000,47727=>1000,47728=>1000,47729=>1000,47730=>1000,47731=>1000,47732=>1000,47733=>1000,47734=>1000,47735=>1000,47736=>1000,47737=>1000,47738=>1000,47739=>1000,47740=>1000,47741=>1000,47742=>1000,47743=>1000,47744=>1000,47745=>1000,47746=>1000,47747=>1000,47748=>1000,47749=>1000,47750=>1000,47751=>1000,47752=>1000,47753=>1000,47754=>1000,47755=>1000,47756=>1000,47757=>1000,47758=>1000,47759=>1000,47760=>1000,47761=>1000,47762=>1000,47763=>1000,47764=>1000,47765=>1000,47766=>1000,47767=>1000,47768=>1000,47769=>1000,47770=>1000,47771=>1000,47772=>1000,47773=>1000,47774=>1000,47775=>1000,47776=>1000,47777=>1000,47778=>1000,47779=>1000,47780=>1000,47781=>1000,47782=>1000,47783=>1000,47784=>1000,47785=>1000,47786=>1000,47787=>1000,47788=>1000,47789=>1000,47790=>1000,47791=>1000,47792=>1000,47793=>1000,47794=>1000,47795=>1000,47796=>1000,47797=>1000,47798=>1000,47799=>1000,47800=>1000,47801=>1000,47802=>1000,47803=>1000,47804=>1000,47805=>1000,47806=>1000,47807=>1000,47808=>1000,47809=>1000,47810=>1000,47811=>1000,47812=>1000,47813=>1000,47814=>1000,47815=>1000,47816=>1000,47817=>1000,47818=>1000,47819=>1000,47820=>1000,47821=>1000,47822=>1000,47823=>1000,47824=>1000,47825=>1000,47826=>1000,47827=>1000,47828=>1000,47829=>1000,47830=>1000,47831=>1000,47832=>1000,47833=>1000,47834=>1000,47835=>1000,47836=>1000,47837=>1000,47838=>1000,47839=>1000,47840=>1000,47841=>1000,47842=>1000,47843=>1000,47844=>1000,47845=>1000,47846=>1000,47847=>1000,47848=>1000,47849=>1000,47850=>1000,47851=>1000,47852=>1000,47853=>1000,47854=>1000,47855=>1000,47856=>1000,47857=>1000,47858=>1000,47859=>1000,47860=>1000,47861=>1000,47862=>1000,47863=>1000,47864=>1000,47865=>1000,47866=>1000,47867=>1000,47868=>1000,47869=>1000,47870=>1000,47871=>1000,47872=>1000,47873=>1000,47874=>1000,47875=>1000,47876=>1000,47877=>1000,47878=>1000,47879=>1000,47880=>1000,47881=>1000,47882=>1000,47883=>1000,47884=>1000,47885=>1000,47886=>1000,47887=>1000,47888=>1000,47889=>1000,47890=>1000,47891=>1000,47892=>1000,47893=>1000,47894=>1000,47895=>1000,47896=>1000,47897=>1000,47898=>1000,47899=>1000,47900=>1000,47901=>1000,47902=>1000,47903=>1000,47904=>1000,47905=>1000,47906=>1000,47907=>1000,47908=>1000,47909=>1000,47910=>1000,47911=>1000,47912=>1000,47913=>1000,47914=>1000,47915=>1000,47916=>1000,47917=>1000,47918=>1000,47919=>1000,47920=>1000,47921=>1000,47922=>1000,47923=>1000,47924=>1000,47925=>1000,47926=>1000,47927=>1000,47928=>1000,47929=>1000,47930=>1000,47931=>1000,47932=>1000,47933=>1000,47934=>1000,47935=>1000,47936=>1000,47937=>1000,47938=>1000,47939=>1000,47940=>1000,47941=>1000,47942=>1000,47943=>1000,47944=>1000,47945=>1000,47946=>1000,47947=>1000,47948=>1000,47949=>1000,47950=>1000,47951=>1000,47952=>1000,47953=>1000,47954=>1000,47955=>1000,47956=>1000,47957=>1000,47958=>1000,47959=>1000,47960=>1000,47961=>1000,47962=>1000,47963=>1000,47964=>1000,47965=>1000,47966=>1000,47967=>1000,47968=>1000,47969=>1000,47970=>1000,47971=>1000,47972=>1000,47973=>1000,47974=>1000,47975=>1000,47976=>1000,47977=>1000,47978=>1000,47979=>1000,47980=>1000,47981=>1000,47982=>1000,47983=>1000,47984=>1000,47985=>1000,47986=>1000,47987=>1000,47988=>1000,47989=>1000,47990=>1000,47991=>1000,47992=>1000,47993=>1000,47994=>1000,47995=>1000,47996=>1000,47997=>1000,47998=>1000,47999=>1000,48000=>1000,48001=>1000,48002=>1000,48003=>1000,48004=>1000,48005=>1000,48006=>1000,48007=>1000,48008=>1000,48009=>1000,48010=>1000,48011=>1000,48012=>1000,48013=>1000,48014=>1000,48015=>1000,48016=>1000,48017=>1000,48018=>1000,48019=>1000,48020=>1000,48021=>1000,48022=>1000,48023=>1000,48024=>1000,48025=>1000,48026=>1000,48027=>1000,48028=>1000,48029=>1000,48030=>1000,48031=>1000,48032=>1000,48033=>1000,48034=>1000,48035=>1000,48036=>1000,48037=>1000,48038=>1000,48039=>1000,48040=>1000,48041=>1000,48042=>1000,48043=>1000,48044=>1000,48045=>1000,48046=>1000,48047=>1000,48048=>1000,48049=>1000,48050=>1000,48051=>1000,48052=>1000,48053=>1000,48054=>1000,48055=>1000,48056=>1000,48057=>1000,48058=>1000,48059=>1000,48060=>1000,48061=>1000,48062=>1000,48063=>1000,48064=>1000,48065=>1000,48066=>1000,48067=>1000,48068=>1000,48069=>1000,48070=>1000,48071=>1000,48072=>1000,48073=>1000,48074=>1000,48075=>1000,48076=>1000,48077=>1000,48078=>1000,48079=>1000,48080=>1000,48081=>1000,48082=>1000,48083=>1000,48084=>1000,48085=>1000,48086=>1000,48087=>1000,48088=>1000,48089=>1000,48090=>1000,48091=>1000,48092=>1000,48093=>1000,48094=>1000,48095=>1000,48096=>1000,48097=>1000,48098=>1000,48099=>1000,48100=>1000,48101=>1000,48102=>1000,48103=>1000,48104=>1000,48105=>1000,48106=>1000,48107=>1000,48108=>1000,48109=>1000,48110=>1000,48111=>1000,48112=>1000,48113=>1000,48114=>1000,48115=>1000,48116=>1000,48117=>1000,48118=>1000,48119=>1000,48120=>1000,48121=>1000,48122=>1000,48123=>1000,48124=>1000,48125=>1000,48126=>1000,48127=>1000,48128=>1000,48129=>1000,48130=>1000,48131=>1000,48132=>1000,48133=>1000,48134=>1000,48135=>1000,48136=>1000,48137=>1000,48138=>1000,48139=>1000,48140=>1000,48141=>1000,48142=>1000,48143=>1000,48144=>1000,48145=>1000,48146=>1000,48147=>1000,48148=>1000,48149=>1000,48150=>1000,48151=>1000,48152=>1000,48153=>1000,48154=>1000,48155=>1000,48156=>1000,48157=>1000,48158=>1000,48159=>1000,48160=>1000,48161=>1000,48162=>1000,48163=>1000,48164=>1000,48165=>1000,48166=>1000,48167=>1000,48168=>1000,48169=>1000,48170=>1000,48171=>1000,48172=>1000,48173=>1000,48174=>1000,48175=>1000,48176=>1000,48177=>1000,48178=>1000,48179=>1000,48180=>1000,48181=>1000,48182=>1000,48183=>1000,48184=>1000,48185=>1000,48186=>1000,48187=>1000,48188=>1000,48189=>1000,48190=>1000,48191=>1000,48192=>1000,48193=>1000,48194=>1000,48195=>1000,48196=>1000,48197=>1000,48198=>1000,48199=>1000,48200=>1000,48201=>1000,48202=>1000,48203=>1000,48204=>1000,48205=>1000,48206=>1000,48207=>1000,48208=>1000,48209=>1000,48210=>1000,48211=>1000,48212=>1000,48213=>1000,48214=>1000,48215=>1000,48216=>1000,48217=>1000,48218=>1000,48219=>1000,48220=>1000,48221=>1000,48222=>1000,48223=>1000,48224=>1000,48225=>1000,48226=>1000,48227=>1000,48228=>1000,48229=>1000,48230=>1000,48231=>1000,48232=>1000,48233=>1000,48234=>1000,48235=>1000,48236=>1000,48237=>1000,48238=>1000,48239=>1000,48240=>1000,48241=>1000,48242=>1000,48243=>1000,48244=>1000,48245=>1000,48246=>1000,48247=>1000,48248=>1000,48249=>1000,48250=>1000,48251=>1000,48252=>1000,48253=>1000,48254=>1000,48255=>1000,48256=>1000,48257=>1000,48258=>1000,48259=>1000,48260=>1000,48261=>1000,48262=>1000,48263=>1000,48264=>1000,48265=>1000,48266=>1000,48267=>1000,48268=>1000,48269=>1000,48270=>1000,48271=>1000,48272=>1000,48273=>1000,48274=>1000,48275=>1000,48276=>1000,48277=>1000,48278=>1000,48279=>1000,48280=>1000,48281=>1000,48282=>1000,48283=>1000,48284=>1000,48285=>1000,48286=>1000,48287=>1000,48288=>1000,48289=>1000,48290=>1000,48291=>1000,48292=>1000,48293=>1000,48294=>1000,48295=>1000,48296=>1000,48297=>1000,48298=>1000,48299=>1000,48300=>1000,48301=>1000,48302=>1000,48303=>1000,48304=>1000,48305=>1000,48306=>1000,48307=>1000,48308=>1000,48309=>1000,48310=>1000,48311=>1000,48312=>1000,48313=>1000,48314=>1000,48315=>1000,48316=>1000,48317=>1000,48318=>1000,48319=>1000,48320=>1000,48321=>1000,48322=>1000,48323=>1000,48324=>1000,48325=>1000,48326=>1000,48327=>1000,48328=>1000,48329=>1000,48330=>1000,48331=>1000,48332=>1000,48333=>1000,48334=>1000,48335=>1000,48336=>1000,48337=>1000,48338=>1000,48339=>1000,48340=>1000,48341=>1000,48342=>1000,48343=>1000,48344=>1000,48345=>1000,48346=>1000,48347=>1000,48348=>1000,48349=>1000,48350=>1000,48351=>1000,48352=>1000,48353=>1000,48354=>1000,48355=>1000,48356=>1000,48357=>1000,48358=>1000,48359=>1000,48360=>1000,48361=>1000,48362=>1000,48363=>1000,48364=>1000,48365=>1000,48366=>1000,48367=>1000,48368=>1000,48369=>1000,48370=>1000,48371=>1000,48372=>1000,48373=>1000,48374=>1000,48375=>1000,48376=>1000,48377=>1000,48378=>1000,48379=>1000,48380=>1000,48381=>1000,48382=>1000,48383=>1000,48384=>1000,48385=>1000,48386=>1000,48387=>1000,48388=>1000,48389=>1000,48390=>1000,48391=>1000,48392=>1000,48393=>1000,48394=>1000,48395=>1000,48396=>1000,48397=>1000,48398=>1000,48399=>1000,48400=>1000,48401=>1000,48402=>1000,48403=>1000,48404=>1000,48405=>1000,48406=>1000,48407=>1000,48408=>1000,48409=>1000,48410=>1000,48411=>1000,48412=>1000,48413=>1000,48414=>1000,48415=>1000,48416=>1000,48417=>1000,48418=>1000,48419=>1000,48420=>1000,48421=>1000,48422=>1000,48423=>1000,48424=>1000,48425=>1000,48426=>1000,48427=>1000,48428=>1000,48429=>1000,48430=>1000,48431=>1000,48432=>1000,48433=>1000,48434=>1000,48435=>1000,48436=>1000,48437=>1000,48438=>1000,48439=>1000,48440=>1000,48441=>1000,48442=>1000,48443=>1000,48444=>1000,48445=>1000,48446=>1000,48447=>1000,48448=>1000,48449=>1000,48450=>1000,48451=>1000,48452=>1000,48453=>1000,48454=>1000,48455=>1000,48456=>1000,48457=>1000,48458=>1000,48459=>1000,48460=>1000,48461=>1000,48462=>1000,48463=>1000,48464=>1000,48465=>1000,48466=>1000,48467=>1000,48468=>1000,48469=>1000,48470=>1000,48471=>1000,48472=>1000,48473=>1000,48474=>1000,48475=>1000,48476=>1000,48477=>1000,48478=>1000,48479=>1000,48480=>1000,48481=>1000,48482=>1000,48483=>1000,48484=>1000,48485=>1000,48486=>1000,48487=>1000,48488=>1000,48489=>1000,48490=>1000,48491=>1000,48492=>1000,48493=>1000,48494=>1000,48495=>1000,48496=>1000,48497=>1000,48498=>1000,48499=>1000,48500=>1000,48501=>1000,48502=>1000,48503=>1000,48504=>1000,48505=>1000,48506=>1000,48507=>1000,48508=>1000,48509=>1000,48510=>1000,48511=>1000,48512=>1000,48513=>1000,48514=>1000,48515=>1000,48516=>1000,48517=>1000,48518=>1000,48519=>1000,48520=>1000,48521=>1000,48522=>1000,48523=>1000,48524=>1000,48525=>1000,48526=>1000,48527=>1000,48528=>1000,48529=>1000,48530=>1000,48531=>1000,48532=>1000,48533=>1000,48534=>1000,48535=>1000,48536=>1000,48537=>1000,48538=>1000,48539=>1000,48540=>1000,48541=>1000,48542=>1000,48543=>1000,48544=>1000,48545=>1000,48546=>1000,48547=>1000,48548=>1000,48549=>1000,48550=>1000,48551=>1000,48552=>1000,48553=>1000,48554=>1000,48555=>1000,48556=>1000,48557=>1000,48558=>1000,48559=>1000,48560=>1000,48561=>1000,48562=>1000,48563=>1000,48564=>1000,48565=>1000,48566=>1000,48567=>1000,48568=>1000,48569=>1000,48570=>1000,48571=>1000,48572=>1000,48573=>1000,48574=>1000,48575=>1000,48576=>1000,48577=>1000,48578=>1000,48579=>1000,48580=>1000,48581=>1000,48582=>1000,48583=>1000,48584=>1000,48585=>1000,48586=>1000,48587=>1000,48588=>1000,48589=>1000,48590=>1000,48591=>1000,48592=>1000,48593=>1000,48594=>1000,48595=>1000,48596=>1000,48597=>1000,48598=>1000,48599=>1000,48600=>1000,48601=>1000,48602=>1000,48603=>1000,48604=>1000,48605=>1000,48606=>1000,48607=>1000,48608=>1000,48609=>1000,48610=>1000,48611=>1000,48612=>1000,48613=>1000,48614=>1000,48615=>1000,48616=>1000,48617=>1000,48618=>1000,48619=>1000,48620=>1000,48621=>1000,48622=>1000,48623=>1000,48624=>1000,48625=>1000,48626=>1000,48627=>1000,48628=>1000,48629=>1000,48630=>1000,48631=>1000,48632=>1000,48633=>1000,48634=>1000,48635=>1000,48636=>1000,48637=>1000,48638=>1000,48639=>1000,48640=>1000,48641=>1000,48642=>1000,48643=>1000,48644=>1000,48645=>1000,48646=>1000,48647=>1000,48648=>1000,48649=>1000,48650=>1000,48651=>1000,48652=>1000,48653=>1000,48654=>1000,48655=>1000,48656=>1000,48657=>1000,48658=>1000,48659=>1000,48660=>1000,48661=>1000,48662=>1000,48663=>1000,48664=>1000,48665=>1000,48666=>1000,48667=>1000,48668=>1000,48669=>1000,48670=>1000,48671=>1000,48672=>1000,48673=>1000,48674=>1000,48675=>1000,48676=>1000,48677=>1000,48678=>1000,48679=>1000,48680=>1000,48681=>1000,48682=>1000,48683=>1000,48684=>1000,48685=>1000,48686=>1000,48687=>1000,48688=>1000,48689=>1000,48690=>1000,48691=>1000,48692=>1000,48693=>1000,48694=>1000,48695=>1000,48696=>1000,48697=>1000,48698=>1000,48699=>1000,48700=>1000,48701=>1000,48702=>1000,48703=>1000,48704=>1000,48705=>1000,48706=>1000,48707=>1000,48708=>1000,48709=>1000,48710=>1000,48711=>1000,48712=>1000,48713=>1000,48714=>1000,48715=>1000,48716=>1000,48717=>1000,48718=>1000,48719=>1000,48720=>1000,48721=>1000,48722=>1000,48723=>1000,48724=>1000,48725=>1000,48726=>1000,48727=>1000,48728=>1000,48729=>1000,48730=>1000,48731=>1000,48732=>1000,48733=>1000,48734=>1000,48735=>1000,48736=>1000,48737=>1000,48738=>1000,48739=>1000,48740=>1000,48741=>1000,48742=>1000,48743=>1000,48744=>1000,48745=>1000,48746=>1000,48747=>1000,48748=>1000,48749=>1000,48750=>1000,48751=>1000,48752=>1000,48753=>1000,48754=>1000,48755=>1000,48756=>1000,48757=>1000,48758=>1000,48759=>1000,48760=>1000,48761=>1000,48762=>1000,48763=>1000,48764=>1000,48765=>1000,48766=>1000,48767=>1000,48768=>1000,48769=>1000,48770=>1000,48771=>1000,48772=>1000,48773=>1000,48774=>1000,48775=>1000,48776=>1000,48777=>1000,48778=>1000,48779=>1000,48780=>1000,48781=>1000,48782=>1000,48783=>1000,48784=>1000,48785=>1000,48786=>1000,48787=>1000,48788=>1000,48789=>1000,48790=>1000,48791=>1000,48792=>1000,48793=>1000,48794=>1000,48795=>1000,48796=>1000,48797=>1000,48798=>1000,48799=>1000,48800=>1000,48801=>1000,48802=>1000,48803=>1000,48804=>1000,48805=>1000,48806=>1000,48807=>1000,48808=>1000,48809=>1000,48810=>1000,48811=>1000,48812=>1000,48813=>1000,48814=>1000,48815=>1000,48816=>1000,48817=>1000,48818=>1000,48819=>1000,48820=>1000,48821=>1000,48822=>1000,48823=>1000,48824=>1000,48825=>1000,48826=>1000,48827=>1000,48828=>1000,48829=>1000,48830=>1000,48831=>1000,48832=>1000,48833=>1000,48834=>1000,48835=>1000,48836=>1000,48837=>1000,48838=>1000,48839=>1000,48840=>1000,48841=>1000,48842=>1000,48843=>1000,48844=>1000,48845=>1000,48846=>1000,48847=>1000,48848=>1000,48849=>1000,48850=>1000,48851=>1000,48852=>1000,48853=>1000,48854=>1000,48855=>1000,48856=>1000,48857=>1000,48858=>1000,48859=>1000,48860=>1000,48861=>1000,48862=>1000,48863=>1000,48864=>1000,48865=>1000,48866=>1000,48867=>1000,48868=>1000,48869=>1000,48870=>1000,48871=>1000,48872=>1000,48873=>1000,48874=>1000,48875=>1000,48876=>1000,48877=>1000,48878=>1000,48879=>1000,48880=>1000,48881=>1000,48882=>1000,48883=>1000,48884=>1000,48885=>1000,48886=>1000,48887=>1000,48888=>1000,48889=>1000,48890=>1000,48891=>1000,48892=>1000,48893=>1000,48894=>1000,48895=>1000,48896=>1000,48897=>1000,48898=>1000,48899=>1000,48900=>1000,48901=>1000,48902=>1000,48903=>1000,48904=>1000,48905=>1000,48906=>1000,48907=>1000,48908=>1000,48909=>1000,48910=>1000,48911=>1000,48912=>1000,48913=>1000,48914=>1000,48915=>1000,48916=>1000,48917=>1000,48918=>1000,48919=>1000,48920=>1000,48921=>1000,48922=>1000,48923=>1000,48924=>1000,48925=>1000,48926=>1000,48927=>1000,48928=>1000,48929=>1000,48930=>1000,48931=>1000,48932=>1000,48933=>1000,48934=>1000,48935=>1000,48936=>1000,48937=>1000,48938=>1000,48939=>1000,48940=>1000,48941=>1000,48942=>1000,48943=>1000,48944=>1000,48945=>1000,48946=>1000,48947=>1000,48948=>1000,48949=>1000,48950=>1000,48951=>1000,48952=>1000,48953=>1000,48954=>1000,48955=>1000,48956=>1000,48957=>1000,48958=>1000,48959=>1000,48960=>1000,48961=>1000,48962=>1000,48963=>1000,48964=>1000,48965=>1000,48966=>1000,48967=>1000,48968=>1000,48969=>1000,48970=>1000,48971=>1000,48972=>1000,48973=>1000,48974=>1000,48975=>1000,48976=>1000,48977=>1000,48978=>1000,48979=>1000,48980=>1000,48981=>1000,48982=>1000,48983=>1000,48984=>1000,48985=>1000,48986=>1000,48987=>1000,48988=>1000,48989=>1000,48990=>1000,48991=>1000,48992=>1000,48993=>1000,48994=>1000,48995=>1000,48996=>1000,48997=>1000,48998=>1000,48999=>1000,49000=>1000,49001=>1000,49002=>1000,49003=>1000,49004=>1000,49005=>1000,49006=>1000,49007=>1000,49008=>1000,49009=>1000,49010=>1000,49011=>1000,49012=>1000,49013=>1000,49014=>1000,49015=>1000,49016=>1000,49017=>1000,49018=>1000,49019=>1000,49020=>1000,49021=>1000,49022=>1000,49023=>1000,49024=>1000,49025=>1000,49026=>1000,49027=>1000,49028=>1000,49029=>1000,49030=>1000,49031=>1000,49032=>1000,49033=>1000,49034=>1000,49035=>1000,49036=>1000,49037=>1000,49038=>1000,49039=>1000,49040=>1000,49041=>1000,49042=>1000,49043=>1000,49044=>1000,49045=>1000,49046=>1000,49047=>1000,49048=>1000,49049=>1000,49050=>1000,49051=>1000,49052=>1000,49053=>1000,49054=>1000,49055=>1000,49056=>1000,49057=>1000,49058=>1000,49059=>1000,49060=>1000,49061=>1000,49062=>1000,49063=>1000,49064=>1000,49065=>1000,49066=>1000,49067=>1000,49068=>1000,49069=>1000,49070=>1000,49071=>1000,49072=>1000,49073=>1000,49074=>1000,49075=>1000,49076=>1000,49077=>1000,49078=>1000,49079=>1000,49080=>1000,49081=>1000,49082=>1000,49083=>1000,49084=>1000,49085=>1000,49086=>1000,49087=>1000,49088=>1000,49089=>1000,49090=>1000,49091=>1000,49092=>1000,49093=>1000,49094=>1000,49095=>1000,49096=>1000,49097=>1000,49098=>1000,49099=>1000,49100=>1000,49101=>1000,49102=>1000,49103=>1000,49104=>1000,49105=>1000,49106=>1000,49107=>1000,49108=>1000,49109=>1000,49110=>1000,49111=>1000,49112=>1000,49113=>1000,49114=>1000,49115=>1000,49116=>1000,49117=>1000,49118=>1000,49119=>1000,49120=>1000,49121=>1000,49122=>1000,49123=>1000,49124=>1000,49125=>1000,49126=>1000,49127=>1000,49128=>1000,49129=>1000,49130=>1000,49131=>1000,49132=>1000,49133=>1000,49134=>1000,49135=>1000,49136=>1000,49137=>1000,49138=>1000,49139=>1000,49140=>1000,49141=>1000,49142=>1000,49143=>1000,49144=>1000,49145=>1000,49146=>1000,49147=>1000,49148=>1000,49149=>1000,49150=>1000,49151=>1000,49152=>1000,49153=>1000,49154=>1000,49155=>1000,49156=>1000,49157=>1000,49158=>1000,49159=>1000,49160=>1000,49161=>1000,49162=>1000,49163=>1000,49164=>1000,49165=>1000,49166=>1000,49167=>1000,49168=>1000,49169=>1000,49170=>1000,49171=>1000,49172=>1000,49173=>1000,49174=>1000,49175=>1000,49176=>1000,49177=>1000,49178=>1000,49179=>1000,49180=>1000,49181=>1000,49182=>1000,49183=>1000,49184=>1000,49185=>1000,49186=>1000,49187=>1000,49188=>1000,49189=>1000,49190=>1000,49191=>1000,49192=>1000,49193=>1000,49194=>1000,49195=>1000,49196=>1000,49197=>1000,49198=>1000,49199=>1000,49200=>1000,49201=>1000,49202=>1000,49203=>1000,49204=>1000,49205=>1000,49206=>1000,49207=>1000,49208=>1000,49209=>1000,49210=>1000,49211=>1000,49212=>1000,49213=>1000,49214=>1000,49215=>1000,49216=>1000,49217=>1000,49218=>1000,49219=>1000,49220=>1000,49221=>1000,49222=>1000,49223=>1000,49224=>1000,49225=>1000,49226=>1000,49227=>1000,49228=>1000,49229=>1000,49230=>1000,49231=>1000,49232=>1000,49233=>1000,49234=>1000,49235=>1000,49236=>1000,49237=>1000,49238=>1000,49239=>1000,49240=>1000,49241=>1000,49242=>1000,49243=>1000,49244=>1000,49245=>1000,49246=>1000,49247=>1000,49248=>1000,49249=>1000,49250=>1000,49251=>1000,49252=>1000,49253=>1000,49254=>1000,49255=>1000,49256=>1000,49257=>1000,49258=>1000,49259=>1000,49260=>1000,49261=>1000,49262=>1000,49263=>1000,49264=>1000,49265=>1000,49266=>1000,49267=>1000,49268=>1000,49269=>1000,49270=>1000,49271=>1000,49272=>1000,49273=>1000,49274=>1000,49275=>1000,49276=>1000,49277=>1000,49278=>1000,49279=>1000,49280=>1000,49281=>1000,49282=>1000,49283=>1000,49284=>1000,49285=>1000,49286=>1000,49287=>1000,49288=>1000,49289=>1000,49290=>1000,49291=>1000,49292=>1000,49293=>1000,49294=>1000,49295=>1000,49296=>1000,49297=>1000,49298=>1000,49299=>1000,49300=>1000,49301=>1000,49302=>1000,49303=>1000,49304=>1000,49305=>1000,49306=>1000,49307=>1000,49308=>1000,49309=>1000,49310=>1000,49311=>1000,49312=>1000,49313=>1000,49314=>1000,49315=>1000,49316=>1000,49317=>1000,49318=>1000,49319=>1000,49320=>1000,49321=>1000,49322=>1000,49323=>1000,49324=>1000,49325=>1000,49326=>1000,49327=>1000,49328=>1000,49329=>1000,49330=>1000,49331=>1000,49332=>1000,49333=>1000,49334=>1000,49335=>1000,49336=>1000,49337=>1000,49338=>1000,49339=>1000,49340=>1000,49341=>1000,49342=>1000,49343=>1000,49344=>1000,49345=>1000,49346=>1000,49347=>1000,49348=>1000,49349=>1000,49350=>1000,49351=>1000,49352=>1000,49353=>1000,49354=>1000,49355=>1000,49356=>1000,49357=>1000,49358=>1000,49359=>1000,49360=>1000,49361=>1000,49362=>1000,49363=>1000,49364=>1000,49365=>1000,49366=>1000,49367=>1000,49368=>1000,49369=>1000,49370=>1000,49371=>1000,49372=>1000,49373=>1000,49374=>1000,49375=>1000,49376=>1000,49377=>1000,49378=>1000,49379=>1000,49380=>1000,49381=>1000,49382=>1000,49383=>1000,49384=>1000,49385=>1000,49386=>1000,49387=>1000,49388=>1000,49389=>1000,49390=>1000,49391=>1000,49392=>1000,49393=>1000,49394=>1000,49395=>1000,49396=>1000,49397=>1000,49398=>1000,49399=>1000,49400=>1000,49401=>1000,49402=>1000,49403=>1000,49404=>1000,49405=>1000,49406=>1000,49407=>1000,49408=>1000,49409=>1000,49410=>1000,49411=>1000,49412=>1000,49413=>1000,49414=>1000,49415=>1000,49416=>1000,49417=>1000,49418=>1000,49419=>1000,49420=>1000,49421=>1000,49422=>1000,49423=>1000,49424=>1000,49425=>1000,49426=>1000,49427=>1000,49428=>1000,49429=>1000,49430=>1000,49431=>1000,49432=>1000,49433=>1000,49434=>1000,49435=>1000,49436=>1000,49437=>1000,49438=>1000,49439=>1000,49440=>1000,49441=>1000,49442=>1000,49443=>1000,49444=>1000,49445=>1000,49446=>1000,49447=>1000,49448=>1000,49449=>1000,49450=>1000,49451=>1000,49452=>1000,49453=>1000,49454=>1000,49455=>1000,49456=>1000,49457=>1000,49458=>1000,49459=>1000,49460=>1000,49461=>1000,49462=>1000,49463=>1000,49464=>1000,49465=>1000,49466=>1000,49467=>1000,49468=>1000,49469=>1000,49470=>1000,49471=>1000,49472=>1000,49473=>1000,49474=>1000,49475=>1000,49476=>1000,49477=>1000,49478=>1000,49479=>1000,49480=>1000,49481=>1000,49482=>1000,49483=>1000,49484=>1000,49485=>1000,49486=>1000,49487=>1000,49488=>1000,49489=>1000,49490=>1000,49491=>1000,49492=>1000,49493=>1000,49494=>1000,49495=>1000,49496=>1000,49497=>1000,49498=>1000,49499=>1000,49500=>1000,49501=>1000,49502=>1000,49503=>1000,49504=>1000,49505=>1000,49506=>1000,49507=>1000,49508=>1000,49509=>1000,49510=>1000,49511=>1000,49512=>1000,49513=>1000,49514=>1000,49515=>1000,49516=>1000,49517=>1000,49518=>1000,49519=>1000,49520=>1000,49521=>1000,49522=>1000,49523=>1000,49524=>1000,49525=>1000,49526=>1000,49527=>1000,49528=>1000,49529=>1000,49530=>1000,49531=>1000,49532=>1000,49533=>1000,49534=>1000,49535=>1000,49536=>1000,49537=>1000,49538=>1000,49539=>1000,49540=>1000,49541=>1000,49542=>1000,49543=>1000,49544=>1000,49545=>1000,49546=>1000,49547=>1000,49548=>1000,49549=>1000,49550=>1000,49551=>1000,49552=>1000,49553=>1000,49554=>1000,49555=>1000,49556=>1000,49557=>1000,49558=>1000,49559=>1000,49560=>1000,49561=>1000,49562=>1000,49563=>1000,49564=>1000,49565=>1000,49566=>1000,49567=>1000,49568=>1000,49569=>1000,49570=>1000,49571=>1000,49572=>1000,49573=>1000,49574=>1000,49575=>1000,49576=>1000,49577=>1000,49578=>1000,49579=>1000,49580=>1000,49581=>1000,49582=>1000,49583=>1000,49584=>1000,49585=>1000,49586=>1000,49587=>1000,49588=>1000,49589=>1000,49590=>1000,49591=>1000,49592=>1000,49593=>1000,49594=>1000,49595=>1000,49596=>1000,49597=>1000,49598=>1000,49599=>1000,49600=>1000,49601=>1000,49602=>1000,49603=>1000,49604=>1000,49605=>1000,49606=>1000,49607=>1000,49608=>1000,49609=>1000,49610=>1000,49611=>1000,49612=>1000,49613=>1000,49614=>1000,49615=>1000,49616=>1000,49617=>1000,49618=>1000,49619=>1000,49620=>1000,49621=>1000,49622=>1000,49623=>1000,49624=>1000,49625=>1000,49626=>1000,49627=>1000,49628=>1000,49629=>1000,49630=>1000,49631=>1000,49632=>1000,49633=>1000,49634=>1000,49635=>1000,49636=>1000,49637=>1000,49638=>1000,49639=>1000,49640=>1000,49641=>1000,49642=>1000,49643=>1000,49644=>1000,49645=>1000,49646=>1000,49647=>1000,49648=>1000,49649=>1000,49650=>1000,49651=>1000,49652=>1000,49653=>1000,49654=>1000,49655=>1000,49656=>1000,49657=>1000,49658=>1000,49659=>1000,49660=>1000,49661=>1000,49662=>1000,49663=>1000,49664=>1000,49665=>1000,49666=>1000,49667=>1000,49668=>1000,49669=>1000,49670=>1000,49671=>1000,49672=>1000,49673=>1000,49674=>1000,49675=>1000,49676=>1000,49677=>1000,49678=>1000,49679=>1000,49680=>1000,49681=>1000,49682=>1000,49683=>1000,49684=>1000,49685=>1000,49686=>1000,49687=>1000,49688=>1000,49689=>1000,49690=>1000,49691=>1000,49692=>1000,49693=>1000,49694=>1000,49695=>1000,49696=>1000,49697=>1000,49698=>1000,49699=>1000,49700=>1000,49701=>1000,49702=>1000,49703=>1000,49704=>1000,49705=>1000,49706=>1000,49707=>1000,49708=>1000,49709=>1000,49710=>1000,49711=>1000,49712=>1000,49713=>1000,49714=>1000,49715=>1000,49716=>1000,49717=>1000,49718=>1000,49719=>1000,49720=>1000,49721=>1000,49722=>1000,49723=>1000,49724=>1000,49725=>1000,49726=>1000,49727=>1000,49728=>1000,49729=>1000,49730=>1000,49731=>1000,49732=>1000,49733=>1000,49734=>1000,49735=>1000,49736=>1000,49737=>1000,49738=>1000,49739=>1000,49740=>1000,49741=>1000,49742=>1000,49743=>1000,49744=>1000,49745=>1000,49746=>1000,49747=>1000,49748=>1000,49749=>1000,49750=>1000,49751=>1000,49752=>1000,49753=>1000,49754=>1000,49755=>1000,49756=>1000,49757=>1000,49758=>1000,49759=>1000,49760=>1000,49761=>1000,49762=>1000,49763=>1000,49764=>1000,49765=>1000,49766=>1000,49767=>1000,49768=>1000,49769=>1000,49770=>1000,49771=>1000,49772=>1000,49773=>1000,49774=>1000,49775=>1000,49776=>1000,49777=>1000,49778=>1000,49779=>1000,49780=>1000,49781=>1000,49782=>1000,49783=>1000,49784=>1000,49785=>1000,49786=>1000,49787=>1000,49788=>1000,49789=>1000,49790=>1000,49791=>1000,49792=>1000,49793=>1000,49794=>1000,49795=>1000,49796=>1000,49797=>1000,49798=>1000,49799=>1000,49800=>1000,49801=>1000,49802=>1000,49803=>1000,49804=>1000,49805=>1000,49806=>1000,49807=>1000,49808=>1000,49809=>1000,49810=>1000,49811=>1000,49812=>1000,49813=>1000,49814=>1000,49815=>1000,49816=>1000,49817=>1000,49818=>1000,49819=>1000,49820=>1000,49821=>1000,49822=>1000,49823=>1000,49824=>1000,49825=>1000,49826=>1000,49827=>1000,49828=>1000,49829=>1000,49830=>1000,49831=>1000,49832=>1000,49833=>1000,49834=>1000,49835=>1000,49836=>1000,49837=>1000,49838=>1000,49839=>1000,49840=>1000,49841=>1000,49842=>1000,49843=>1000,49844=>1000,49845=>1000,49846=>1000,49847=>1000,49848=>1000,49849=>1000,49850=>1000,49851=>1000,49852=>1000,49853=>1000,49854=>1000,49855=>1000,49856=>1000,49857=>1000,49858=>1000,49859=>1000,49860=>1000,49861=>1000,49862=>1000,49863=>1000,49864=>1000,49865=>1000,49866=>1000,49867=>1000,49868=>1000,49869=>1000,49870=>1000,49871=>1000,49872=>1000,49873=>1000,49874=>1000,49875=>1000,49876=>1000,49877=>1000,49878=>1000,49879=>1000,49880=>1000,49881=>1000,49882=>1000,49883=>1000,49884=>1000,49885=>1000,49886=>1000,49887=>1000,49888=>1000,49889=>1000,49890=>1000,49891=>1000,49892=>1000,49893=>1000,49894=>1000,49895=>1000,49896=>1000,49897=>1000,49898=>1000,49899=>1000,49900=>1000,49901=>1000,49902=>1000,49903=>1000,49904=>1000,49905=>1000,49906=>1000,49907=>1000,49908=>1000,49909=>1000,49910=>1000,49911=>1000,49912=>1000,49913=>1000,49914=>1000,49915=>1000,49916=>1000,49917=>1000,49918=>1000,49919=>1000,49920=>1000,49921=>1000,49922=>1000,49923=>1000,49924=>1000,49925=>1000,49926=>1000,49927=>1000,49928=>1000,49929=>1000,49930=>1000,49931=>1000,49932=>1000,49933=>1000,49934=>1000,49935=>1000,49936=>1000,49937=>1000,49938=>1000,49939=>1000,49940=>1000,49941=>1000,49942=>1000,49943=>1000,49944=>1000,49945=>1000,49946=>1000,49947=>1000,49948=>1000,49949=>1000,49950=>1000,49951=>1000,49952=>1000,49953=>1000,49954=>1000,49955=>1000,49956=>1000,49957=>1000,49958=>1000,49959=>1000,49960=>1000,49961=>1000,49962=>1000,49963=>1000,49964=>1000,49965=>1000,49966=>1000,49967=>1000,49968=>1000,49969=>1000,49970=>1000,49971=>1000,49972=>1000,49973=>1000,49974=>1000,49975=>1000,49976=>1000,49977=>1000,49978=>1000,49979=>1000,49980=>1000,49981=>1000,49982=>1000,49983=>1000,49984=>1000,49985=>1000,49986=>1000,49987=>1000,49988=>1000,49989=>1000,49990=>1000,49991=>1000,49992=>1000,49993=>1000,49994=>1000,49995=>1000,49996=>1000,49997=>1000,49998=>1000,49999=>1000,50000=>1000,50001=>1000,50002=>1000,50003=>1000,50004=>1000,50005=>1000,50006=>1000,50007=>1000,50008=>1000,50009=>1000,50010=>1000,50011=>1000,50012=>1000,50013=>1000,50014=>1000,50015=>1000,50016=>1000,50017=>1000,50018=>1000,50019=>1000,50020=>1000,50021=>1000,50022=>1000,50023=>1000,50024=>1000,50025=>1000,50026=>1000,50027=>1000,50028=>1000,50029=>1000,50030=>1000,50031=>1000,50032=>1000,50033=>1000,50034=>1000,50035=>1000,50036=>1000,50037=>1000,50038=>1000,50039=>1000,50040=>1000,50041=>1000,50042=>1000,50043=>1000,50044=>1000,50045=>1000,50046=>1000,50047=>1000,50048=>1000,50049=>1000,50050=>1000,50051=>1000,50052=>1000,50053=>1000,50054=>1000,50055=>1000,50056=>1000,50057=>1000,50058=>1000,50059=>1000,50060=>1000,50061=>1000,50062=>1000,50063=>1000,50064=>1000,50065=>1000,50066=>1000,50067=>1000,50068=>1000,50069=>1000,50070=>1000,50071=>1000,50072=>1000,50073=>1000,50074=>1000,50075=>1000,50076=>1000,50077=>1000,50078=>1000,50079=>1000,50080=>1000,50081=>1000,50082=>1000,50083=>1000,50084=>1000,50085=>1000,50086=>1000,50087=>1000,50088=>1000,50089=>1000,50090=>1000,50091=>1000,50092=>1000,50093=>1000,50094=>1000,50095=>1000,50096=>1000,50097=>1000,50098=>1000,50099=>1000,50100=>1000,50101=>1000,50102=>1000,50103=>1000,50104=>1000,50105=>1000,50106=>1000,50107=>1000,50108=>1000,50109=>1000,50110=>1000,50111=>1000,50112=>1000,50113=>1000,50114=>1000,50115=>1000,50116=>1000,50117=>1000,50118=>1000,50119=>1000,50120=>1000,50121=>1000,50122=>1000,50123=>1000,50124=>1000,50125=>1000,50126=>1000,50127=>1000,50128=>1000,50129=>1000,50130=>1000,50131=>1000,50132=>1000,50133=>1000,50134=>1000,50135=>1000,50136=>1000,50137=>1000,50138=>1000,50139=>1000,50140=>1000,50141=>1000,50142=>1000,50143=>1000,50144=>1000,50145=>1000,50146=>1000,50147=>1000,50148=>1000,50149=>1000,50150=>1000,50151=>1000,50152=>1000,50153=>1000,50154=>1000,50155=>1000,50156=>1000,50157=>1000,50158=>1000,50159=>1000,50160=>1000,50161=>1000,50162=>1000,50163=>1000,50164=>1000,50165=>1000,50166=>1000,50167=>1000,50168=>1000,50169=>1000,50170=>1000,50171=>1000,50172=>1000,50173=>1000,50174=>1000,50175=>1000,50176=>1000,50177=>1000,50178=>1000,50179=>1000,50180=>1000,50181=>1000,50182=>1000,50183=>1000,50184=>1000,50185=>1000,50186=>1000,50187=>1000,50188=>1000,50189=>1000,50190=>1000,50191=>1000,50192=>1000,50193=>1000,50194=>1000,50195=>1000,50196=>1000,50197=>1000,50198=>1000,50199=>1000,50200=>1000,50201=>1000,50202=>1000,50203=>1000,50204=>1000,50205=>1000,50206=>1000,50207=>1000,50208=>1000,50209=>1000,50210=>1000,50211=>1000,50212=>1000,50213=>1000,50214=>1000,50215=>1000,50216=>1000,50217=>1000,50218=>1000,50219=>1000,50220=>1000,50221=>1000,50222=>1000,50223=>1000,50224=>1000,50225=>1000,50226=>1000,50227=>1000,50228=>1000,50229=>1000,50230=>1000,50231=>1000,50232=>1000,50233=>1000,50234=>1000,50235=>1000,50236=>1000,50237=>1000,50238=>1000,50239=>1000,50240=>1000,50241=>1000,50242=>1000,50243=>1000,50244=>1000,50245=>1000,50246=>1000,50247=>1000,50248=>1000,50249=>1000,50250=>1000,50251=>1000,50252=>1000,50253=>1000,50254=>1000,50255=>1000,50256=>1000,50257=>1000,50258=>1000,50259=>1000,50260=>1000,50261=>1000,50262=>1000,50263=>1000,50264=>1000,50265=>1000,50266=>1000,50267=>1000,50268=>1000,50269=>1000,50270=>1000,50271=>1000,50272=>1000,50273=>1000,50274=>1000,50275=>1000,50276=>1000,50277=>1000,50278=>1000,50279=>1000,50280=>1000,50281=>1000,50282=>1000,50283=>1000,50284=>1000,50285=>1000,50286=>1000,50287=>1000,50288=>1000,50289=>1000,50290=>1000,50291=>1000,50292=>1000,50293=>1000,50294=>1000,50295=>1000,50296=>1000,50297=>1000,50298=>1000,50299=>1000,50300=>1000,50301=>1000,50302=>1000,50303=>1000,50304=>1000,50305=>1000,50306=>1000,50307=>1000,50308=>1000,50309=>1000,50310=>1000,50311=>1000,50312=>1000,50313=>1000,50314=>1000,50315=>1000,50316=>1000,50317=>1000,50318=>1000,50319=>1000,50320=>1000,50321=>1000,50322=>1000,50323=>1000,50324=>1000,50325=>1000,50326=>1000,50327=>1000,50328=>1000,50329=>1000,50330=>1000,50331=>1000,50332=>1000,50333=>1000,50334=>1000,50335=>1000,50336=>1000,50337=>1000,50338=>1000,50339=>1000,50340=>1000,50341=>1000,50342=>1000,50343=>1000,50344=>1000,50345=>1000,50346=>1000,50347=>1000,50348=>1000,50349=>1000,50350=>1000,50351=>1000,50352=>1000,50353=>1000,50354=>1000,50355=>1000,50356=>1000,50357=>1000,50358=>1000,50359=>1000,50360=>1000,50361=>1000,50362=>1000,50363=>1000,50364=>1000,50365=>1000,50366=>1000,50367=>1000,50368=>1000,50369=>1000,50370=>1000,50371=>1000,50372=>1000,50373=>1000,50374=>1000,50375=>1000,50376=>1000,50377=>1000,50378=>1000,50379=>1000,50380=>1000,50381=>1000,50382=>1000,50383=>1000,50384=>1000,50385=>1000,50386=>1000,50387=>1000,50388=>1000,50389=>1000,50390=>1000,50391=>1000,50392=>1000,50393=>1000,50394=>1000,50395=>1000,50396=>1000,50397=>1000,50398=>1000,50399=>1000,50400=>1000,50401=>1000,50402=>1000,50403=>1000,50404=>1000,50405=>1000,50406=>1000,50407=>1000,50408=>1000,50409=>1000,50410=>1000,50411=>1000,50412=>1000,50413=>1000,50414=>1000,50415=>1000,50416=>1000,50417=>1000,50418=>1000,50419=>1000,50420=>1000,50421=>1000,50422=>1000,50423=>1000,50424=>1000,50425=>1000,50426=>1000,50427=>1000,50428=>1000,50429=>1000,50430=>1000,50431=>1000,50432=>1000,50433=>1000,50434=>1000,50435=>1000,50436=>1000,50437=>1000,50438=>1000,50439=>1000,50440=>1000,50441=>1000,50442=>1000,50443=>1000,50444=>1000,50445=>1000,50446=>1000,50447=>1000,50448=>1000,50449=>1000,50450=>1000,50451=>1000,50452=>1000,50453=>1000,50454=>1000,50455=>1000,50456=>1000,50457=>1000,50458=>1000,50459=>1000,50460=>1000,50461=>1000,50462=>1000,50463=>1000,50464=>1000,50465=>1000,50466=>1000,50467=>1000,50468=>1000,50469=>1000,50470=>1000,50471=>1000,50472=>1000,50473=>1000,50474=>1000,50475=>1000,50476=>1000,50477=>1000,50478=>1000,50479=>1000,50480=>1000,50481=>1000,50482=>1000,50483=>1000,50484=>1000,50485=>1000,50486=>1000,50487=>1000,50488=>1000,50489=>1000,50490=>1000,50491=>1000,50492=>1000,50493=>1000,50494=>1000,50495=>1000,50496=>1000,50497=>1000,50498=>1000,50499=>1000,50500=>1000,50501=>1000,50502=>1000,50503=>1000,50504=>1000,50505=>1000,50506=>1000,50507=>1000,50508=>1000,50509=>1000,50510=>1000,50511=>1000,50512=>1000,50513=>1000,50514=>1000,50515=>1000,50516=>1000,50517=>1000,50518=>1000,50519=>1000,50520=>1000,50521=>1000,50522=>1000,50523=>1000,50524=>1000,50525=>1000,50526=>1000,50527=>1000,50528=>1000,50529=>1000,50530=>1000,50531=>1000,50532=>1000,50533=>1000,50534=>1000,50535=>1000,50536=>1000,50537=>1000,50538=>1000,50539=>1000,50540=>1000,50541=>1000,50542=>1000,50543=>1000,50544=>1000,50545=>1000,50546=>1000,50547=>1000,50548=>1000,50549=>1000,50550=>1000,50551=>1000,50552=>1000,50553=>1000,50554=>1000,50555=>1000,50556=>1000,50557=>1000,50558=>1000,50559=>1000,50560=>1000,50561=>1000,50562=>1000,50563=>1000,50564=>1000,50565=>1000,50566=>1000,50567=>1000,50568=>1000,50569=>1000,50570=>1000,50571=>1000,50572=>1000,50573=>1000,50574=>1000,50575=>1000,50576=>1000,50577=>1000,50578=>1000,50579=>1000,50580=>1000,50581=>1000,50582=>1000,50583=>1000,50584=>1000,50585=>1000,50586=>1000,50587=>1000,50588=>1000,50589=>1000,50590=>1000,50591=>1000,50592=>1000,50593=>1000,50594=>1000,50595=>1000,50596=>1000,50597=>1000,50598=>1000,50599=>1000,50600=>1000,50601=>1000,50602=>1000,50603=>1000,50604=>1000,50605=>1000,50606=>1000,50607=>1000,50608=>1000,50609=>1000,50610=>1000,50611=>1000,50612=>1000,50613=>1000,50614=>1000,50615=>1000,50616=>1000,50617=>1000,50618=>1000,50619=>1000,50620=>1000,50621=>1000,50622=>1000,50623=>1000,50624=>1000,50625=>1000,50626=>1000,50627=>1000,50628=>1000,50629=>1000,50630=>1000,50631=>1000,50632=>1000,50633=>1000,50634=>1000,50635=>1000,50636=>1000,50637=>1000,50638=>1000,50639=>1000,50640=>1000,50641=>1000,50642=>1000,50643=>1000,50644=>1000,50645=>1000,50646=>1000,50647=>1000,50648=>1000,50649=>1000,50650=>1000,50651=>1000,50652=>1000,50653=>1000,50654=>1000,50655=>1000,50656=>1000,50657=>1000,50658=>1000,50659=>1000,50660=>1000,50661=>1000,50662=>1000,50663=>1000,50664=>1000,50665=>1000,50666=>1000,50667=>1000,50668=>1000,50669=>1000,50670=>1000,50671=>1000,50672=>1000,50673=>1000,50674=>1000,50675=>1000,50676=>1000,50677=>1000,50678=>1000,50679=>1000,50680=>1000,50681=>1000,50682=>1000,50683=>1000,50684=>1000,50685=>1000,50686=>1000,50687=>1000,50688=>1000,50689=>1000,50690=>1000,50691=>1000,50692=>1000,50693=>1000,50694=>1000,50695=>1000,50696=>1000,50697=>1000,50698=>1000,50699=>1000,50700=>1000,50701=>1000,50702=>1000,50703=>1000,50704=>1000,50705=>1000,50706=>1000,50707=>1000,50708=>1000,50709=>1000,50710=>1000,50711=>1000,50712=>1000,50713=>1000,50714=>1000,50715=>1000,50716=>1000,50717=>1000,50718=>1000,50719=>1000,50720=>1000,50721=>1000,50722=>1000,50723=>1000,50724=>1000,50725=>1000,50726=>1000,50727=>1000,50728=>1000,50729=>1000,50730=>1000,50731=>1000,50732=>1000,50733=>1000,50734=>1000,50735=>1000,50736=>1000,50737=>1000,50738=>1000,50739=>1000,50740=>1000,50741=>1000,50742=>1000,50743=>1000,50744=>1000,50745=>1000,50746=>1000,50747=>1000,50748=>1000,50749=>1000,50750=>1000,50751=>1000,50752=>1000,50753=>1000,50754=>1000,50755=>1000,50756=>1000,50757=>1000,50758=>1000,50759=>1000,50760=>1000,50761=>1000,50762=>1000,50763=>1000,50764=>1000,50765=>1000,50766=>1000,50767=>1000,50768=>1000,50769=>1000,50770=>1000,50771=>1000,50772=>1000,50773=>1000,50774=>1000,50775=>1000,50776=>1000,50777=>1000,50778=>1000,50779=>1000,50780=>1000,50781=>1000,50782=>1000,50783=>1000,50784=>1000,50785=>1000,50786=>1000,50787=>1000,50788=>1000,50789=>1000,50790=>1000,50791=>1000,50792=>1000,50793=>1000,50794=>1000,50795=>1000,50796=>1000,50797=>1000,50798=>1000,50799=>1000,50800=>1000,50801=>1000,50802=>1000,50803=>1000,50804=>1000,50805=>1000,50806=>1000,50807=>1000,50808=>1000,50809=>1000,50810=>1000,50811=>1000,50812=>1000,50813=>1000,50814=>1000,50815=>1000,50816=>1000,50817=>1000,50818=>1000,50819=>1000,50820=>1000,50821=>1000,50822=>1000,50823=>1000,50824=>1000,50825=>1000,50826=>1000,50827=>1000,50828=>1000,50829=>1000,50830=>1000,50831=>1000,50832=>1000,50833=>1000,50834=>1000,50835=>1000,50836=>1000,50837=>1000,50838=>1000,50839=>1000,50840=>1000,50841=>1000,50842=>1000,50843=>1000,50844=>1000,50845=>1000,50846=>1000,50847=>1000,50848=>1000,50849=>1000,50850=>1000,50851=>1000,50852=>1000,50853=>1000,50854=>1000,50855=>1000,50856=>1000,50857=>1000,50858=>1000,50859=>1000,50860=>1000,50861=>1000,50862=>1000,50863=>1000,50864=>1000,50865=>1000,50866=>1000,50867=>1000,50868=>1000,50869=>1000,50870=>1000,50871=>1000,50872=>1000,50873=>1000,50874=>1000,50875=>1000,50876=>1000,50877=>1000,50878=>1000,50879=>1000,50880=>1000,50881=>1000,50882=>1000,50883=>1000,50884=>1000,50885=>1000,50886=>1000,50887=>1000,50888=>1000,50889=>1000,50890=>1000,50891=>1000,50892=>1000,50893=>1000,50894=>1000,50895=>1000,50896=>1000,50897=>1000,50898=>1000,50899=>1000,50900=>1000,50901=>1000,50902=>1000,50903=>1000,50904=>1000,50905=>1000,50906=>1000,50907=>1000,50908=>1000,50909=>1000,50910=>1000,50911=>1000,50912=>1000,50913=>1000,50914=>1000,50915=>1000,50916=>1000,50917=>1000,50918=>1000,50919=>1000,50920=>1000,50921=>1000,50922=>1000,50923=>1000,50924=>1000,50925=>1000,50926=>1000,50927=>1000,50928=>1000,50929=>1000,50930=>1000,50931=>1000,50932=>1000,50933=>1000,50934=>1000,50935=>1000,50936=>1000,50937=>1000,50938=>1000,50939=>1000,50940=>1000,50941=>1000,50942=>1000,50943=>1000,50944=>1000,50945=>1000,50946=>1000,50947=>1000,50948=>1000,50949=>1000,50950=>1000,50951=>1000,50952=>1000,50953=>1000,50954=>1000,50955=>1000,50956=>1000,50957=>1000,50958=>1000,50959=>1000,50960=>1000,50961=>1000,50962=>1000,50963=>1000,50964=>1000,50965=>1000,50966=>1000,50967=>1000,50968=>1000,50969=>1000,50970=>1000,50971=>1000,50972=>1000,50973=>1000,50974=>1000,50975=>1000,50976=>1000,50977=>1000,50978=>1000,50979=>1000,50980=>1000,50981=>1000,50982=>1000,50983=>1000,50984=>1000,50985=>1000,50986=>1000,50987=>1000,50988=>1000,50989=>1000,50990=>1000,50991=>1000,50992=>1000,50993=>1000,50994=>1000,50995=>1000,50996=>1000,50997=>1000,50998=>1000,50999=>1000,51000=>1000,51001=>1000,51002=>1000,51003=>1000,51004=>1000,51005=>1000,51006=>1000,51007=>1000,51008=>1000,51009=>1000,51010=>1000,51011=>1000,51012=>1000,51013=>1000,51014=>1000,51015=>1000,51016=>1000,51017=>1000,51018=>1000,51019=>1000,51020=>1000,51021=>1000,51022=>1000,51023=>1000,51024=>1000,51025=>1000,51026=>1000,51027=>1000,51028=>1000,51029=>1000,51030=>1000,51031=>1000,51032=>1000,51033=>1000,51034=>1000,51035=>1000,51036=>1000,51037=>1000,51038=>1000,51039=>1000,51040=>1000,51041=>1000,51042=>1000,51043=>1000,51044=>1000,51045=>1000,51046=>1000,51047=>1000,51048=>1000,51049=>1000,51050=>1000,51051=>1000,51052=>1000,51053=>1000,51054=>1000,51055=>1000,51056=>1000,51057=>1000,51058=>1000,51059=>1000,51060=>1000,51061=>1000,51062=>1000,51063=>1000,51064=>1000,51065=>1000,51066=>1000,51067=>1000,51068=>1000,51069=>1000,51070=>1000,51071=>1000,51072=>1000,51073=>1000,51074=>1000,51075=>1000,51076=>1000,51077=>1000,51078=>1000,51079=>1000,51080=>1000,51081=>1000,51082=>1000,51083=>1000,51084=>1000,51085=>1000,51086=>1000,51087=>1000,51088=>1000,51089=>1000,51090=>1000,51091=>1000,51092=>1000,51093=>1000,51094=>1000,51095=>1000,51096=>1000,51097=>1000,51098=>1000,51099=>1000,51100=>1000,51101=>1000,51102=>1000,51103=>1000,51104=>1000,51105=>1000,51106=>1000,51107=>1000,51108=>1000,51109=>1000,51110=>1000,51111=>1000,51112=>1000,51113=>1000,51114=>1000,51115=>1000,51116=>1000,51117=>1000,51118=>1000,51119=>1000,51120=>1000,51121=>1000,51122=>1000,51123=>1000,51124=>1000,51125=>1000,51126=>1000,51127=>1000,51128=>1000,51129=>1000,51130=>1000,51131=>1000,51132=>1000,51133=>1000,51134=>1000,51135=>1000,51136=>1000,51137=>1000,51138=>1000,51139=>1000,51140=>1000,51141=>1000,51142=>1000,51143=>1000,51144=>1000,51145=>1000,51146=>1000,51147=>1000,51148=>1000,51149=>1000,51150=>1000,51151=>1000,51152=>1000,51153=>1000,51154=>1000,51155=>1000,51156=>1000,51157=>1000,51158=>1000,51159=>1000,51160=>1000,51161=>1000,51162=>1000,51163=>1000,51164=>1000,51165=>1000,51166=>1000,51167=>1000,51168=>1000,51169=>1000,51170=>1000,51171=>1000,51172=>1000,51173=>1000,51174=>1000,51175=>1000,51176=>1000,51177=>1000,51178=>1000,51179=>1000,51180=>1000,51181=>1000,51182=>1000,51183=>1000,51184=>1000,51185=>1000,51186=>1000,51187=>1000,51188=>1000,51189=>1000,51190=>1000,51191=>1000,51192=>1000,51193=>1000,51194=>1000,51195=>1000,51196=>1000,51197=>1000,51198=>1000,51199=>1000,51200=>1000,51201=>1000,51202=>1000,51203=>1000,51204=>1000,51205=>1000,51206=>1000,51207=>1000,51208=>1000,51209=>1000,51210=>1000,51211=>1000,51212=>1000,51213=>1000,51214=>1000,51215=>1000,51216=>1000,51217=>1000,51218=>1000,51219=>1000,51220=>1000,51221=>1000,51222=>1000,51223=>1000,51224=>1000,51225=>1000,51226=>1000,51227=>1000,51228=>1000,51229=>1000,51230=>1000,51231=>1000,51232=>1000,51233=>1000,51234=>1000,51235=>1000,51236=>1000,51237=>1000,51238=>1000,51239=>1000,51240=>1000,51241=>1000,51242=>1000,51243=>1000,51244=>1000,51245=>1000,51246=>1000,51247=>1000,51248=>1000,51249=>1000,51250=>1000,51251=>1000,51252=>1000,51253=>1000,51254=>1000,51255=>1000,51256=>1000,51257=>1000,51258=>1000,51259=>1000,51260=>1000,51261=>1000,51262=>1000,51263=>1000,51264=>1000,51265=>1000,51266=>1000,51267=>1000,51268=>1000,51269=>1000,51270=>1000,51271=>1000,51272=>1000,51273=>1000,51274=>1000,51275=>1000,51276=>1000,51277=>1000,51278=>1000,51279=>1000,51280=>1000,51281=>1000,51282=>1000,51283=>1000,51284=>1000,51285=>1000,51286=>1000,51287=>1000,51288=>1000,51289=>1000,51290=>1000,51291=>1000,51292=>1000,51293=>1000,51294=>1000,51295=>1000,51296=>1000,51297=>1000,51298=>1000,51299=>1000,51300=>1000,51301=>1000,51302=>1000,51303=>1000,51304=>1000,51305=>1000,51306=>1000,51307=>1000,51308=>1000,51309=>1000,51310=>1000,51311=>1000,51312=>1000,51313=>1000,51314=>1000,51315=>1000,51316=>1000,51317=>1000,51318=>1000,51319=>1000,51320=>1000,51321=>1000,51322=>1000,51323=>1000,51324=>1000,51325=>1000,51326=>1000,51327=>1000,51328=>1000,51329=>1000,51330=>1000,51331=>1000,51332=>1000,51333=>1000,51334=>1000,51335=>1000,51336=>1000,51337=>1000,51338=>1000,51339=>1000,51340=>1000,51341=>1000,51342=>1000,51343=>1000,51344=>1000,51345=>1000,51346=>1000,51347=>1000,51348=>1000,51349=>1000,51350=>1000,51351=>1000,51352=>1000,51353=>1000,51354=>1000,51355=>1000,51356=>1000,51357=>1000,51358=>1000,51359=>1000,51360=>1000,51361=>1000,51362=>1000,51363=>1000,51364=>1000,51365=>1000,51366=>1000,51367=>1000,51368=>1000,51369=>1000,51370=>1000,51371=>1000,51372=>1000,51373=>1000,51374=>1000,51375=>1000,51376=>1000,51377=>1000,51378=>1000,51379=>1000,51380=>1000,51381=>1000,51382=>1000,51383=>1000,51384=>1000,51385=>1000,51386=>1000,51387=>1000,51388=>1000,51389=>1000,51390=>1000,51391=>1000,51392=>1000,51393=>1000,51394=>1000,51395=>1000,51396=>1000,51397=>1000,51398=>1000,51399=>1000,51400=>1000,51401=>1000,51402=>1000,51403=>1000,51404=>1000,51405=>1000,51406=>1000,51407=>1000,51408=>1000,51409=>1000,51410=>1000,51411=>1000,51412=>1000,51413=>1000,51414=>1000,51415=>1000,51416=>1000,51417=>1000,51418=>1000,51419=>1000,51420=>1000,51421=>1000,51422=>1000,51423=>1000,51424=>1000,51425=>1000,51426=>1000,51427=>1000,51428=>1000,51429=>1000,51430=>1000,51431=>1000,51432=>1000,51433=>1000,51434=>1000,51435=>1000,51436=>1000,51437=>1000,51438=>1000,51439=>1000,51440=>1000,51441=>1000,51442=>1000,51443=>1000,51444=>1000,51445=>1000,51446=>1000,51447=>1000,51448=>1000,51449=>1000,51450=>1000,51451=>1000,51452=>1000,51453=>1000,51454=>1000,51455=>1000,51456=>1000,51457=>1000,51458=>1000,51459=>1000,51460=>1000,51461=>1000,51462=>1000,51463=>1000,51464=>1000,51465=>1000,51466=>1000,51467=>1000,51468=>1000,51469=>1000,51470=>1000,51471=>1000,51472=>1000,51473=>1000,51474=>1000,51475=>1000,51476=>1000,51477=>1000,51478=>1000,51479=>1000,51480=>1000,51481=>1000,51482=>1000,51483=>1000,51484=>1000,51485=>1000,51486=>1000,51487=>1000,51488=>1000,51489=>1000,51490=>1000,51491=>1000,51492=>1000,51493=>1000,51494=>1000,51495=>1000,51496=>1000,51497=>1000,51498=>1000,51499=>1000,51500=>1000,51501=>1000,51502=>1000,51503=>1000,51504=>1000,51505=>1000,51506=>1000,51507=>1000,51508=>1000,51509=>1000,51510=>1000,51511=>1000,51512=>1000,51513=>1000,51514=>1000,51515=>1000,51516=>1000,51517=>1000,51518=>1000,51519=>1000,51520=>1000,51521=>1000,51522=>1000,51523=>1000,51524=>1000,51525=>1000,51526=>1000,51527=>1000,51528=>1000,51529=>1000,51530=>1000,51531=>1000,51532=>1000,51533=>1000,51534=>1000,51535=>1000,51536=>1000,51537=>1000,51538=>1000,51539=>1000,51540=>1000,51541=>1000,51542=>1000,51543=>1000,51544=>1000,51545=>1000,51546=>1000,51547=>1000,51548=>1000,51549=>1000,51550=>1000,51551=>1000,51552=>1000,51553=>1000,51554=>1000,51555=>1000,51556=>1000,51557=>1000,51558=>1000,51559=>1000,51560=>1000,51561=>1000,51562=>1000,51563=>1000,51564=>1000,51565=>1000,51566=>1000,51567=>1000,51568=>1000,51569=>1000,51570=>1000,51571=>1000,51572=>1000,51573=>1000,51574=>1000,51575=>1000,51576=>1000,51577=>1000,51578=>1000,51579=>1000,51580=>1000,51581=>1000,51582=>1000,51583=>1000,51584=>1000,51585=>1000,51586=>1000,51587=>1000,51588=>1000,51589=>1000,51590=>1000,51591=>1000,51592=>1000,51593=>1000,51594=>1000,51595=>1000,51596=>1000,51597=>1000,51598=>1000,51599=>1000,51600=>1000,51601=>1000,51602=>1000,51603=>1000,51604=>1000,51605=>1000,51606=>1000,51607=>1000,51608=>1000,51609=>1000,51610=>1000,51611=>1000,51612=>1000,51613=>1000,51614=>1000,51615=>1000,51616=>1000,51617=>1000,51618=>1000,51619=>1000,51620=>1000,51621=>1000,51622=>1000,51623=>1000,51624=>1000,51625=>1000,51626=>1000,51627=>1000,51628=>1000,51629=>1000,51630=>1000,51631=>1000,51632=>1000,51633=>1000,51634=>1000,51635=>1000,51636=>1000,51637=>1000,51638=>1000,51639=>1000,51640=>1000,51641=>1000,51642=>1000,51643=>1000,51644=>1000,51645=>1000,51646=>1000,51647=>1000,51648=>1000,51649=>1000,51650=>1000,51651=>1000,51652=>1000,51653=>1000,51654=>1000,51655=>1000,51656=>1000,51657=>1000,51658=>1000,51659=>1000,51660=>1000,51661=>1000,51662=>1000,51663=>1000,51664=>1000,51665=>1000,51666=>1000,51667=>1000,51668=>1000,51669=>1000,51670=>1000,51671=>1000,51672=>1000,51673=>1000,51674=>1000,51675=>1000,51676=>1000,51677=>1000,51678=>1000,51679=>1000,51680=>1000,51681=>1000,51682=>1000,51683=>1000,51684=>1000,51685=>1000,51686=>1000,51687=>1000,51688=>1000,51689=>1000,51690=>1000,51691=>1000,51692=>1000,51693=>1000,51694=>1000,51695=>1000,51696=>1000,51697=>1000,51698=>1000,51699=>1000,51700=>1000,51701=>1000,51702=>1000,51703=>1000,51704=>1000,51705=>1000,51706=>1000,51707=>1000,51708=>1000,51709=>1000,51710=>1000,51711=>1000,51712=>1000,51713=>1000,51714=>1000,51715=>1000,51716=>1000,51717=>1000,51718=>1000,51719=>1000,51720=>1000,51721=>1000,51722=>1000,51723=>1000,51724=>1000,51725=>1000,51726=>1000,51727=>1000,51728=>1000,51729=>1000,51730=>1000,51731=>1000,51732=>1000,51733=>1000,51734=>1000,51735=>1000,51736=>1000,51737=>1000,51738=>1000,51739=>1000,51740=>1000,51741=>1000,51742=>1000,51743=>1000,51744=>1000,51745=>1000,51746=>1000,51747=>1000,51748=>1000,51749=>1000,51750=>1000,51751=>1000,51752=>1000,51753=>1000,51754=>1000,51755=>1000,51756=>1000,51757=>1000,51758=>1000,51759=>1000,51760=>1000,51761=>1000,51762=>1000,51763=>1000,51764=>1000,51765=>1000,51766=>1000,51767=>1000,51768=>1000,51769=>1000,51770=>1000,51771=>1000,51772=>1000,51773=>1000,51774=>1000,51775=>1000,51776=>1000,51777=>1000,51778=>1000,51779=>1000,51780=>1000,51781=>1000,51782=>1000,51783=>1000,51784=>1000,51785=>1000,51786=>1000,51787=>1000,51788=>1000,51789=>1000,51790=>1000,51791=>1000,51792=>1000,51793=>1000,51794=>1000,51795=>1000,51796=>1000,51797=>1000,51798=>1000,51799=>1000,51800=>1000,51801=>1000,51802=>1000,51803=>1000,51804=>1000,51805=>1000,51806=>1000,51807=>1000,51808=>1000,51809=>1000,51810=>1000,51811=>1000,51812=>1000,51813=>1000,51814=>1000,51815=>1000,51816=>1000,51817=>1000,51818=>1000,51819=>1000,51820=>1000,51821=>1000,51822=>1000,51823=>1000,51824=>1000,51825=>1000,51826=>1000,51827=>1000,51828=>1000,51829=>1000,51830=>1000,51831=>1000,51832=>1000,51833=>1000,51834=>1000,51835=>1000,51836=>1000,51837=>1000,51838=>1000,51839=>1000,51840=>1000,51841=>1000,51842=>1000,51843=>1000,51844=>1000,51845=>1000,51846=>1000,51847=>1000,51848=>1000,51849=>1000,51850=>1000,51851=>1000,51852=>1000,51853=>1000,51854=>1000,51855=>1000,51856=>1000,51857=>1000,51858=>1000,51859=>1000,51860=>1000,51861=>1000,51862=>1000,51863=>1000,51864=>1000,51865=>1000,51866=>1000,51867=>1000,51868=>1000,51869=>1000,51870=>1000,51871=>1000,51872=>1000,51873=>1000,51874=>1000,51875=>1000,51876=>1000,51877=>1000,51878=>1000,51879=>1000,51880=>1000,51881=>1000,51882=>1000,51883=>1000,51884=>1000,51885=>1000,51886=>1000,51887=>1000,51888=>1000,51889=>1000,51890=>1000,51891=>1000,51892=>1000,51893=>1000,51894=>1000,51895=>1000,51896=>1000,51897=>1000,51898=>1000,51899=>1000,51900=>1000,51901=>1000,51902=>1000,51903=>1000,51904=>1000,51905=>1000,51906=>1000,51907=>1000,51908=>1000,51909=>1000,51910=>1000,51911=>1000,51912=>1000,51913=>1000,51914=>1000,51915=>1000,51916=>1000,51917=>1000,51918=>1000,51919=>1000,51920=>1000,51921=>1000,51922=>1000,51923=>1000,51924=>1000,51925=>1000,51926=>1000,51927=>1000,51928=>1000,51929=>1000,51930=>1000,51931=>1000,51932=>1000,51933=>1000,51934=>1000,51935=>1000,51936=>1000,51937=>1000,51938=>1000,51939=>1000,51940=>1000,51941=>1000,51942=>1000,51943=>1000,51944=>1000,51945=>1000,51946=>1000,51947=>1000,51948=>1000,51949=>1000,51950=>1000,51951=>1000,51952=>1000,51953=>1000,51954=>1000,51955=>1000,51956=>1000,51957=>1000,51958=>1000,51959=>1000,51960=>1000,51961=>1000,51962=>1000,51963=>1000,51964=>1000,51965=>1000,51966=>1000,51967=>1000,51968=>1000,51969=>1000,51970=>1000,51971=>1000,51972=>1000,51973=>1000,51974=>1000,51975=>1000,51976=>1000,51977=>1000,51978=>1000,51979=>1000,51980=>1000,51981=>1000,51982=>1000,51983=>1000,51984=>1000,51985=>1000,51986=>1000,51987=>1000,51988=>1000,51989=>1000,51990=>1000,51991=>1000,51992=>1000,51993=>1000,51994=>1000,51995=>1000,51996=>1000,51997=>1000,51998=>1000,51999=>1000,52000=>1000,52001=>1000,52002=>1000,52003=>1000,52004=>1000,52005=>1000,52006=>1000,52007=>1000,52008=>1000,52009=>1000,52010=>1000,52011=>1000,52012=>1000,52013=>1000,52014=>1000,52015=>1000,52016=>1000,52017=>1000,52018=>1000,52019=>1000,52020=>1000,52021=>1000,52022=>1000,52023=>1000,52024=>1000,52025=>1000,52026=>1000,52027=>1000,52028=>1000,52029=>1000,52030=>1000,52031=>1000,52032=>1000,52033=>1000,52034=>1000,52035=>1000,52036=>1000,52037=>1000,52038=>1000,52039=>1000,52040=>1000,52041=>1000,52042=>1000,52043=>1000,52044=>1000,52045=>1000,52046=>1000,52047=>1000,52048=>1000,52049=>1000,52050=>1000,52051=>1000,52052=>1000,52053=>1000,52054=>1000,52055=>1000,52056=>1000,52057=>1000,52058=>1000,52059=>1000,52060=>1000,52061=>1000,52062=>1000,52063=>1000,52064=>1000,52065=>1000,52066=>1000,52067=>1000,52068=>1000,52069=>1000,52070=>1000,52071=>1000,52072=>1000,52073=>1000,52074=>1000,52075=>1000,52076=>1000,52077=>1000,52078=>1000,52079=>1000,52080=>1000,52081=>1000,52082=>1000,52083=>1000,52084=>1000,52085=>1000,52086=>1000,52087=>1000,52088=>1000,52089=>1000,52090=>1000,52091=>1000,52092=>1000,52093=>1000,52094=>1000,52095=>1000,52096=>1000,52097=>1000,52098=>1000,52099=>1000,52100=>1000,52101=>1000,52102=>1000,52103=>1000,52104=>1000,52105=>1000,52106=>1000,52107=>1000,52108=>1000,52109=>1000,52110=>1000,52111=>1000,52112=>1000,52113=>1000,52114=>1000,52115=>1000,52116=>1000,52117=>1000,52118=>1000,52119=>1000,52120=>1000,52121=>1000,52122=>1000,52123=>1000,52124=>1000,52125=>1000,52126=>1000,52127=>1000,52128=>1000,52129=>1000,52130=>1000,52131=>1000,52132=>1000,52133=>1000,52134=>1000,52135=>1000,52136=>1000,52137=>1000,52138=>1000,52139=>1000,52140=>1000,52141=>1000,52142=>1000,52143=>1000,52144=>1000,52145=>1000,52146=>1000,52147=>1000,52148=>1000,52149=>1000,52150=>1000,52151=>1000,52152=>1000,52153=>1000,52154=>1000,52155=>1000,52156=>1000,52157=>1000,52158=>1000,52159=>1000,52160=>1000,52161=>1000,52162=>1000,52163=>1000,52164=>1000,52165=>1000,52166=>1000,52167=>1000,52168=>1000,52169=>1000,52170=>1000,52171=>1000,52172=>1000,52173=>1000,52174=>1000,52175=>1000,52176=>1000,52177=>1000,52178=>1000,52179=>1000,52180=>1000,52181=>1000,52182=>1000,52183=>1000,52184=>1000,52185=>1000,52186=>1000,52187=>1000,52188=>1000,52189=>1000,52190=>1000,52191=>1000,52192=>1000,52193=>1000,52194=>1000,52195=>1000,52196=>1000,52197=>1000,52198=>1000,52199=>1000,52200=>1000,52201=>1000,52202=>1000,52203=>1000,52204=>1000,52205=>1000,52206=>1000,52207=>1000,52208=>1000,52209=>1000,52210=>1000,52211=>1000,52212=>1000,52213=>1000,52214=>1000,52215=>1000,52216=>1000,52217=>1000,52218=>1000,52219=>1000,52220=>1000,52221=>1000,52222=>1000,52223=>1000,52224=>1000,52225=>1000,52226=>1000,52227=>1000,52228=>1000,52229=>1000,52230=>1000,52231=>1000,52232=>1000,52233=>1000,52234=>1000,52235=>1000,52236=>1000,52237=>1000,52238=>1000,52239=>1000,52240=>1000,52241=>1000,52242=>1000,52243=>1000,52244=>1000,52245=>1000,52246=>1000,52247=>1000,52248=>1000,52249=>1000,52250=>1000,52251=>1000,52252=>1000,52253=>1000,52254=>1000,52255=>1000,52256=>1000,52257=>1000,52258=>1000,52259=>1000,52260=>1000,52261=>1000,52262=>1000,52263=>1000,52264=>1000,52265=>1000,52266=>1000,52267=>1000,52268=>1000,52269=>1000,52270=>1000,52271=>1000,52272=>1000,52273=>1000,52274=>1000,52275=>1000,52276=>1000,52277=>1000,52278=>1000,52279=>1000,52280=>1000,52281=>1000,52282=>1000,52283=>1000,52284=>1000,52285=>1000,52286=>1000,52287=>1000,52288=>1000,52289=>1000,52290=>1000,52291=>1000,52292=>1000,52293=>1000,52294=>1000,52295=>1000,52296=>1000,52297=>1000,52298=>1000,52299=>1000,52300=>1000,52301=>1000,52302=>1000,52303=>1000,52304=>1000,52305=>1000,52306=>1000,52307=>1000,52308=>1000,52309=>1000,52310=>1000,52311=>1000,52312=>1000,52313=>1000,52314=>1000,52315=>1000,52316=>1000,52317=>1000,52318=>1000,52319=>1000,52320=>1000,52321=>1000,52322=>1000,52323=>1000,52324=>1000,52325=>1000,52326=>1000,52327=>1000,52328=>1000,52329=>1000,52330=>1000,52331=>1000,52332=>1000,52333=>1000,52334=>1000,52335=>1000,52336=>1000,52337=>1000,52338=>1000,52339=>1000,52340=>1000,52341=>1000,52342=>1000,52343=>1000,52344=>1000,52345=>1000,52346=>1000,52347=>1000,52348=>1000,52349=>1000,52350=>1000,52351=>1000,52352=>1000,52353=>1000,52354=>1000,52355=>1000,52356=>1000,52357=>1000,52358=>1000,52359=>1000,52360=>1000,52361=>1000,52362=>1000,52363=>1000,52364=>1000,52365=>1000,52366=>1000,52367=>1000,52368=>1000,52369=>1000,52370=>1000,52371=>1000,52372=>1000,52373=>1000,52374=>1000,52375=>1000,52376=>1000,52377=>1000,52378=>1000,52379=>1000,52380=>1000,52381=>1000,52382=>1000,52383=>1000,52384=>1000,52385=>1000,52386=>1000,52387=>1000,52388=>1000,52389=>1000,52390=>1000,52391=>1000,52392=>1000,52393=>1000,52394=>1000,52395=>1000,52396=>1000,52397=>1000,52398=>1000,52399=>1000,52400=>1000,52401=>1000,52402=>1000,52403=>1000,52404=>1000,52405=>1000,52406=>1000,52407=>1000,52408=>1000,52409=>1000,52410=>1000,52411=>1000,52412=>1000,52413=>1000,52414=>1000,52415=>1000,52416=>1000,52417=>1000,52418=>1000,52419=>1000,52420=>1000,52421=>1000,52422=>1000,52423=>1000,52424=>1000,52425=>1000,52426=>1000,52427=>1000,52428=>1000,52429=>1000,52430=>1000,52431=>1000,52432=>1000,52433=>1000,52434=>1000,52435=>1000,52436=>1000,52437=>1000,52438=>1000,52439=>1000,52440=>1000,52441=>1000,52442=>1000,52443=>1000,52444=>1000,52445=>1000,52446=>1000,52447=>1000,52448=>1000,52449=>1000,52450=>1000,52451=>1000,52452=>1000,52453=>1000,52454=>1000,52455=>1000,52456=>1000,52457=>1000,52458=>1000,52459=>1000,52460=>1000,52461=>1000,52462=>1000,52463=>1000,52464=>1000,52465=>1000,52466=>1000,52467=>1000,52468=>1000,52469=>1000,52470=>1000,52471=>1000,52472=>1000,52473=>1000,52474=>1000,52475=>1000,52476=>1000,52477=>1000,52478=>1000,52479=>1000,52480=>1000,52481=>1000,52482=>1000,52483=>1000,52484=>1000,52485=>1000,52486=>1000,52487=>1000,52488=>1000,52489=>1000,52490=>1000,52491=>1000,52492=>1000,52493=>1000,52494=>1000,52495=>1000,52496=>1000,52497=>1000,52498=>1000,52499=>1000,52500=>1000,52501=>1000,52502=>1000,52503=>1000,52504=>1000,52505=>1000,52506=>1000,52507=>1000,52508=>1000,52509=>1000,52510=>1000,52511=>1000,52512=>1000,52513=>1000,52514=>1000,52515=>1000,52516=>1000,52517=>1000,52518=>1000,52519=>1000,52520=>1000,52521=>1000,52522=>1000,52523=>1000,52524=>1000,52525=>1000,52526=>1000,52527=>1000,52528=>1000,52529=>1000,52530=>1000,52531=>1000,52532=>1000,52533=>1000,52534=>1000,52535=>1000,52536=>1000,52537=>1000,52538=>1000,52539=>1000,52540=>1000,52541=>1000,52542=>1000,52543=>1000,52544=>1000,52545=>1000,52546=>1000,52547=>1000,52548=>1000,52549=>1000,52550=>1000,52551=>1000,52552=>1000,52553=>1000,52554=>1000,52555=>1000,52556=>1000,52557=>1000,52558=>1000,52559=>1000,52560=>1000,52561=>1000,52562=>1000,52563=>1000,52564=>1000,52565=>1000,52566=>1000,52567=>1000,52568=>1000,52569=>1000,52570=>1000,52571=>1000,52572=>1000,52573=>1000,52574=>1000,52575=>1000,52576=>1000,52577=>1000,52578=>1000,52579=>1000,52580=>1000,52581=>1000,52582=>1000,52583=>1000,52584=>1000,52585=>1000,52586=>1000,52587=>1000,52588=>1000,52589=>1000,52590=>1000,52591=>1000,52592=>1000,52593=>1000,52594=>1000,52595=>1000,52596=>1000,52597=>1000,52598=>1000,52599=>1000,52600=>1000,52601=>1000,52602=>1000,52603=>1000,52604=>1000,52605=>1000,52606=>1000,52607=>1000,52608=>1000,52609=>1000,52610=>1000,52611=>1000,52612=>1000,52613=>1000,52614=>1000,52615=>1000,52616=>1000,52617=>1000,52618=>1000,52619=>1000,52620=>1000,52621=>1000,52622=>1000,52623=>1000,52624=>1000,52625=>1000,52626=>1000,52627=>1000,52628=>1000,52629=>1000,52630=>1000,52631=>1000,52632=>1000,52633=>1000,52634=>1000,52635=>1000,52636=>1000,52637=>1000,52638=>1000,52639=>1000,52640=>1000,52641=>1000,52642=>1000,52643=>1000,52644=>1000,52645=>1000,52646=>1000,52647=>1000,52648=>1000,52649=>1000,52650=>1000,52651=>1000,52652=>1000,52653=>1000,52654=>1000,52655=>1000,52656=>1000,52657=>1000,52658=>1000,52659=>1000,52660=>1000,52661=>1000,52662=>1000,52663=>1000,52664=>1000,52665=>1000,52666=>1000,52667=>1000,52668=>1000,52669=>1000,52670=>1000,52671=>1000,52672=>1000,52673=>1000,52674=>1000,52675=>1000,52676=>1000,52677=>1000,52678=>1000,52679=>1000,52680=>1000,52681=>1000,52682=>1000,52683=>1000,52684=>1000,52685=>1000,52686=>1000,52687=>1000,52688=>1000,52689=>1000,52690=>1000,52691=>1000,52692=>1000,52693=>1000,52694=>1000,52695=>1000,52696=>1000,52697=>1000,52698=>1000,52699=>1000,52700=>1000,52701=>1000,52702=>1000,52703=>1000,52704=>1000,52705=>1000,52706=>1000,52707=>1000,52708=>1000,52709=>1000,52710=>1000,52711=>1000,52712=>1000,52713=>1000,52714=>1000,52715=>1000,52716=>1000,52717=>1000,52718=>1000,52719=>1000,52720=>1000,52721=>1000,52722=>1000,52723=>1000,52724=>1000,52725=>1000,52726=>1000,52727=>1000,52728=>1000,52729=>1000,52730=>1000,52731=>1000,52732=>1000,52733=>1000,52734=>1000,52735=>1000,52736=>1000,52737=>1000,52738=>1000,52739=>1000,52740=>1000,52741=>1000,52742=>1000,52743=>1000,52744=>1000,52745=>1000,52746=>1000,52747=>1000,52748=>1000,52749=>1000,52750=>1000,52751=>1000,52752=>1000,52753=>1000,52754=>1000,52755=>1000,52756=>1000,52757=>1000,52758=>1000,52759=>1000,52760=>1000,52761=>1000,52762=>1000,52763=>1000,52764=>1000,52765=>1000,52766=>1000,52767=>1000,52768=>1000,52769=>1000,52770=>1000,52771=>1000,52772=>1000,52773=>1000,52774=>1000,52775=>1000,52776=>1000,52777=>1000,52778=>1000,52779=>1000,52780=>1000,52781=>1000,52782=>1000,52783=>1000,52784=>1000,52785=>1000,52786=>1000,52787=>1000,52788=>1000,52789=>1000,52790=>1000,52791=>1000,52792=>1000,52793=>1000,52794=>1000,52795=>1000,52796=>1000,52797=>1000,52798=>1000,52799=>1000,52800=>1000,52801=>1000,52802=>1000,52803=>1000,52804=>1000,52805=>1000,52806=>1000,52807=>1000,52808=>1000,52809=>1000,52810=>1000,52811=>1000,52812=>1000,52813=>1000,52814=>1000,52815=>1000,52816=>1000,52817=>1000,52818=>1000,52819=>1000,52820=>1000,52821=>1000,52822=>1000,52823=>1000,52824=>1000,52825=>1000,52826=>1000,52827=>1000,52828=>1000,52829=>1000,52830=>1000,52831=>1000,52832=>1000,52833=>1000,52834=>1000,52835=>1000,52836=>1000,52837=>1000,52838=>1000,52839=>1000,52840=>1000,52841=>1000,52842=>1000,52843=>1000,52844=>1000,52845=>1000,52846=>1000,52847=>1000,52848=>1000,52849=>1000,52850=>1000,52851=>1000,52852=>1000,52853=>1000,52854=>1000,52855=>1000,52856=>1000,52857=>1000,52858=>1000,52859=>1000,52860=>1000,52861=>1000,52862=>1000,52863=>1000,52864=>1000,52865=>1000,52866=>1000,52867=>1000,52868=>1000,52869=>1000,52870=>1000,52871=>1000,52872=>1000,52873=>1000,52874=>1000,52875=>1000,52876=>1000,52877=>1000,52878=>1000,52879=>1000,52880=>1000,52881=>1000,52882=>1000,52883=>1000,52884=>1000,52885=>1000,52886=>1000,52887=>1000,52888=>1000,52889=>1000,52890=>1000,52891=>1000,52892=>1000,52893=>1000,52894=>1000,52895=>1000,52896=>1000,52897=>1000,52898=>1000,52899=>1000,52900=>1000,52901=>1000,52902=>1000,52903=>1000,52904=>1000,52905=>1000,52906=>1000,52907=>1000,52908=>1000,52909=>1000,52910=>1000,52911=>1000,52912=>1000,52913=>1000,52914=>1000,52915=>1000,52916=>1000,52917=>1000,52918=>1000,52919=>1000,52920=>1000,52921=>1000,52922=>1000,52923=>1000,52924=>1000,52925=>1000,52926=>1000,52927=>1000,52928=>1000,52929=>1000,52930=>1000,52931=>1000,52932=>1000,52933=>1000,52934=>1000,52935=>1000,52936=>1000,52937=>1000,52938=>1000,52939=>1000,52940=>1000,52941=>1000,52942=>1000,52943=>1000,52944=>1000,52945=>1000,52946=>1000,52947=>1000,52948=>1000,52949=>1000,52950=>1000,52951=>1000,52952=>1000,52953=>1000,52954=>1000,52955=>1000,52956=>1000,52957=>1000,52958=>1000,52959=>1000,52960=>1000,52961=>1000,52962=>1000,52963=>1000,52964=>1000,52965=>1000,52966=>1000,52967=>1000,52968=>1000,52969=>1000,52970=>1000,52971=>1000,52972=>1000,52973=>1000,52974=>1000,52975=>1000,52976=>1000,52977=>1000,52978=>1000,52979=>1000,52980=>1000,52981=>1000,52982=>1000,52983=>1000,52984=>1000,52985=>1000,52986=>1000,52987=>1000,52988=>1000,52989=>1000,52990=>1000,52991=>1000,52992=>1000,52993=>1000,52994=>1000,52995=>1000,52996=>1000,52997=>1000,52998=>1000,52999=>1000,53000=>1000,53001=>1000,53002=>1000,53003=>1000,53004=>1000,53005=>1000,53006=>1000,53007=>1000,53008=>1000,53009=>1000,53010=>1000,53011=>1000,53012=>1000,53013=>1000,53014=>1000,53015=>1000,53016=>1000,53017=>1000,53018=>1000,53019=>1000,53020=>1000,53021=>1000,53022=>1000,53023=>1000,53024=>1000,53025=>1000,53026=>1000,53027=>1000,53028=>1000,53029=>1000,53030=>1000,53031=>1000,53032=>1000,53033=>1000,53034=>1000,53035=>1000,53036=>1000,53037=>1000,53038=>1000,53039=>1000,53040=>1000,53041=>1000,53042=>1000,53043=>1000,53044=>1000,53045=>1000,53046=>1000,53047=>1000,53048=>1000,53049=>1000,53050=>1000,53051=>1000,53052=>1000,53053=>1000,53054=>1000,53055=>1000,53056=>1000,53057=>1000,53058=>1000,53059=>1000,53060=>1000,53061=>1000,53062=>1000,53063=>1000,53064=>1000,53065=>1000,53066=>1000,53067=>1000,53068=>1000,53069=>1000,53070=>1000,53071=>1000,53072=>1000,53073=>1000,53074=>1000,53075=>1000,53076=>1000,53077=>1000,53078=>1000,53079=>1000,53080=>1000,53081=>1000,53082=>1000,53083=>1000,53084=>1000,53085=>1000,53086=>1000,53087=>1000,53088=>1000,53089=>1000,53090=>1000,53091=>1000,53092=>1000,53093=>1000,53094=>1000,53095=>1000,53096=>1000,53097=>1000,53098=>1000,53099=>1000,53100=>1000,53101=>1000,53102=>1000,53103=>1000,53104=>1000,53105=>1000,53106=>1000,53107=>1000,53108=>1000,53109=>1000,53110=>1000,53111=>1000,53112=>1000,53113=>1000,53114=>1000,53115=>1000,53116=>1000,53117=>1000,53118=>1000,53119=>1000,53120=>1000,53121=>1000,53122=>1000,53123=>1000,53124=>1000,53125=>1000,53126=>1000,53127=>1000,53128=>1000,53129=>1000,53130=>1000,53131=>1000,53132=>1000,53133=>1000,53134=>1000,53135=>1000,53136=>1000,53137=>1000,53138=>1000,53139=>1000,53140=>1000,53141=>1000,53142=>1000,53143=>1000,53144=>1000,53145=>1000,53146=>1000,53147=>1000,53148=>1000,53149=>1000,53150=>1000,53151=>1000,53152=>1000,53153=>1000,53154=>1000,53155=>1000,53156=>1000,53157=>1000,53158=>1000,53159=>1000,53160=>1000,53161=>1000,53162=>1000,53163=>1000,53164=>1000,53165=>1000,53166=>1000,53167=>1000,53168=>1000,53169=>1000,53170=>1000,53171=>1000,53172=>1000,53173=>1000,53174=>1000,53175=>1000,53176=>1000,53177=>1000,53178=>1000,53179=>1000,53180=>1000,53181=>1000,53182=>1000,53183=>1000,53184=>1000,53185=>1000,53186=>1000,53187=>1000,53188=>1000,53189=>1000,53190=>1000,53191=>1000,53192=>1000,53193=>1000,53194=>1000,53195=>1000,53196=>1000,53197=>1000,53198=>1000,53199=>1000,53200=>1000,53201=>1000,53202=>1000,53203=>1000,53204=>1000,53205=>1000,53206=>1000,53207=>1000,53208=>1000,53209=>1000,53210=>1000,53211=>1000,53212=>1000,53213=>1000,53214=>1000,53215=>1000,53216=>1000,53217=>1000,53218=>1000,53219=>1000,53220=>1000,53221=>1000,53222=>1000,53223=>1000,53224=>1000,53225=>1000,53226=>1000,53227=>1000,53228=>1000,53229=>1000,53230=>1000,53231=>1000,53232=>1000,53233=>1000,53234=>1000,53235=>1000,53236=>1000,53237=>1000,53238=>1000,53239=>1000,53240=>1000,53241=>1000,53242=>1000,53243=>1000,53244=>1000,53245=>1000,53246=>1000,53247=>1000,53248=>1000,53249=>1000,53250=>1000,53251=>1000,53252=>1000,53253=>1000,53254=>1000,53255=>1000,53256=>1000,53257=>1000,53258=>1000,53259=>1000,53260=>1000,53261=>1000,53262=>1000,53263=>1000,53264=>1000,53265=>1000,53266=>1000,53267=>1000,53268=>1000,53269=>1000,53270=>1000,53271=>1000,53272=>1000,53273=>1000,53274=>1000,53275=>1000,53276=>1000,53277=>1000,53278=>1000,53279=>1000,53280=>1000,53281=>1000,53282=>1000,53283=>1000,53284=>1000,53285=>1000,53286=>1000,53287=>1000,53288=>1000,53289=>1000,53290=>1000,53291=>1000,53292=>1000,53293=>1000,53294=>1000,53295=>1000,53296=>1000,53297=>1000,53298=>1000,53299=>1000,53300=>1000,53301=>1000,53302=>1000,53303=>1000,53304=>1000,53305=>1000,53306=>1000,53307=>1000,53308=>1000,53309=>1000,53310=>1000,53311=>1000,53312=>1000,53313=>1000,53314=>1000,53315=>1000,53316=>1000,53317=>1000,53318=>1000,53319=>1000,53320=>1000,53321=>1000,53322=>1000,53323=>1000,53324=>1000,53325=>1000,53326=>1000,53327=>1000,53328=>1000,53329=>1000,53330=>1000,53331=>1000,53332=>1000,53333=>1000,53334=>1000,53335=>1000,53336=>1000,53337=>1000,53338=>1000,53339=>1000,53340=>1000,53341=>1000,53342=>1000,53343=>1000,53344=>1000,53345=>1000,53346=>1000,53347=>1000,53348=>1000,53349=>1000,53350=>1000,53351=>1000,53352=>1000,53353=>1000,53354=>1000,53355=>1000,53356=>1000,53357=>1000,53358=>1000,53359=>1000,53360=>1000,53361=>1000,53362=>1000,53363=>1000,53364=>1000,53365=>1000,53366=>1000,53367=>1000,53368=>1000,53369=>1000,53370=>1000,53371=>1000,53372=>1000,53373=>1000,53374=>1000,53375=>1000,53376=>1000,53377=>1000,53378=>1000,53379=>1000,53380=>1000,53381=>1000,53382=>1000,53383=>1000,53384=>1000,53385=>1000,53386=>1000,53387=>1000,53388=>1000,53389=>1000,53390=>1000,53391=>1000,53392=>1000,53393=>1000,53394=>1000,53395=>1000,53396=>1000,53397=>1000,53398=>1000,53399=>1000,53400=>1000,53401=>1000,53402=>1000,53403=>1000,53404=>1000,53405=>1000,53406=>1000,53407=>1000,53408=>1000,53409=>1000,53410=>1000,53411=>1000,53412=>1000,53413=>1000,53414=>1000,53415=>1000,53416=>1000,53417=>1000,53418=>1000,53419=>1000,53420=>1000,53421=>1000,53422=>1000,53423=>1000,53424=>1000,53425=>1000,53426=>1000,53427=>1000,53428=>1000,53429=>1000,53430=>1000,53431=>1000,53432=>1000,53433=>1000,53434=>1000,53435=>1000,53436=>1000,53437=>1000,53438=>1000,53439=>1000,53440=>1000,53441=>1000,53442=>1000,53443=>1000,53444=>1000,53445=>1000,53446=>1000,53447=>1000,53448=>1000,53449=>1000,53450=>1000,53451=>1000,53452=>1000,53453=>1000,53454=>1000,53455=>1000,53456=>1000,53457=>1000,53458=>1000,53459=>1000,53460=>1000,53461=>1000,53462=>1000,53463=>1000,53464=>1000,53465=>1000,53466=>1000,53467=>1000,53468=>1000,53469=>1000,53470=>1000,53471=>1000,53472=>1000,53473=>1000,53474=>1000,53475=>1000,53476=>1000,53477=>1000,53478=>1000,53479=>1000,53480=>1000,53481=>1000,53482=>1000,53483=>1000,53484=>1000,53485=>1000,53486=>1000,53487=>1000,53488=>1000,53489=>1000,53490=>1000,53491=>1000,53492=>1000,53493=>1000,53494=>1000,53495=>1000,53496=>1000,53497=>1000,53498=>1000,53499=>1000,53500=>1000,53501=>1000,53502=>1000,53503=>1000,53504=>1000,53505=>1000,53506=>1000,53507=>1000,53508=>1000,53509=>1000,53510=>1000,53511=>1000,53512=>1000,53513=>1000,53514=>1000,53515=>1000,53516=>1000,53517=>1000,53518=>1000,53519=>1000,53520=>1000,53521=>1000,53522=>1000,53523=>1000,53524=>1000,53525=>1000,53526=>1000,53527=>1000,53528=>1000,53529=>1000,53530=>1000,53531=>1000,53532=>1000,53533=>1000,53534=>1000,53535=>1000,53536=>1000,53537=>1000,53538=>1000,53539=>1000,53540=>1000,53541=>1000,53542=>1000,53543=>1000,53544=>1000,53545=>1000,53546=>1000,53547=>1000,53548=>1000,53549=>1000,53550=>1000,53551=>1000,53552=>1000,53553=>1000,53554=>1000,53555=>1000,53556=>1000,53557=>1000,53558=>1000,53559=>1000,53560=>1000,53561=>1000,53562=>1000,53563=>1000,53564=>1000,53565=>1000,53566=>1000,53567=>1000,53568=>1000,53569=>1000,53570=>1000,53571=>1000,53572=>1000,53573=>1000,53574=>1000,53575=>1000,53576=>1000,53577=>1000,53578=>1000,53579=>1000,53580=>1000,53581=>1000,53582=>1000,53583=>1000,53584=>1000,53585=>1000,53586=>1000,53587=>1000,53588=>1000,53589=>1000,53590=>1000,53591=>1000,53592=>1000,53593=>1000,53594=>1000,53595=>1000,53596=>1000,53597=>1000,53598=>1000,53599=>1000,53600=>1000,53601=>1000,53602=>1000,53603=>1000,53604=>1000,53605=>1000,53606=>1000,53607=>1000,53608=>1000,53609=>1000,53610=>1000,53611=>1000,53612=>1000,53613=>1000,53614=>1000,53615=>1000,53616=>1000,53617=>1000,53618=>1000,53619=>1000,53620=>1000,53621=>1000,53622=>1000,53623=>1000,53624=>1000,53625=>1000,53626=>1000,53627=>1000,53628=>1000,53629=>1000,53630=>1000,53631=>1000,53632=>1000,53633=>1000,53634=>1000,53635=>1000,53636=>1000,53637=>1000,53638=>1000,53639=>1000,53640=>1000,53641=>1000,53642=>1000,53643=>1000,53644=>1000,53645=>1000,53646=>1000,53647=>1000,53648=>1000,53649=>1000,53650=>1000,53651=>1000,53652=>1000,53653=>1000,53654=>1000,53655=>1000,53656=>1000,53657=>1000,53658=>1000,53659=>1000,53660=>1000,53661=>1000,53662=>1000,53663=>1000,53664=>1000,53665=>1000,53666=>1000,53667=>1000,53668=>1000,53669=>1000,53670=>1000,53671=>1000,53672=>1000,53673=>1000,53674=>1000,53675=>1000,53676=>1000,53677=>1000,53678=>1000,53679=>1000,53680=>1000,53681=>1000,53682=>1000,53683=>1000,53684=>1000,53685=>1000,53686=>1000,53687=>1000,53688=>1000,53689=>1000,53690=>1000,53691=>1000,53692=>1000,53693=>1000,53694=>1000,53695=>1000,53696=>1000,53697=>1000,53698=>1000,53699=>1000,53700=>1000,53701=>1000,53702=>1000,53703=>1000,53704=>1000,53705=>1000,53706=>1000,53707=>1000,53708=>1000,53709=>1000,53710=>1000,53711=>1000,53712=>1000,53713=>1000,53714=>1000,53715=>1000,53716=>1000,53717=>1000,53718=>1000,53719=>1000,53720=>1000,53721=>1000,53722=>1000,53723=>1000,53724=>1000,53725=>1000,53726=>1000,53727=>1000,53728=>1000,53729=>1000,53730=>1000,53731=>1000,53732=>1000,53733=>1000,53734=>1000,53735=>1000,53736=>1000,53737=>1000,53738=>1000,53739=>1000,53740=>1000,53741=>1000,53742=>1000,53743=>1000,53744=>1000,53745=>1000,53746=>1000,53747=>1000,53748=>1000,53749=>1000,53750=>1000,53751=>1000,53752=>1000,53753=>1000,53754=>1000,53755=>1000,53756=>1000,53757=>1000,53758=>1000,53759=>1000,53760=>1000,53761=>1000,53762=>1000,53763=>1000,53764=>1000,53765=>1000,53766=>1000,53767=>1000,53768=>1000,53769=>1000,53770=>1000,53771=>1000,53772=>1000,53773=>1000,53774=>1000,53775=>1000,53776=>1000,53777=>1000,53778=>1000,53779=>1000,53780=>1000,53781=>1000,53782=>1000,53783=>1000,53784=>1000,53785=>1000,53786=>1000,53787=>1000,53788=>1000,53789=>1000,53790=>1000,53791=>1000,53792=>1000,53793=>1000,53794=>1000,53795=>1000,53796=>1000,53797=>1000,53798=>1000,53799=>1000,53800=>1000,53801=>1000,53802=>1000,53803=>1000,53804=>1000,53805=>1000,53806=>1000,53807=>1000,53808=>1000,53809=>1000,53810=>1000,53811=>1000,53812=>1000,53813=>1000,53814=>1000,53815=>1000,53816=>1000,53817=>1000,53818=>1000,53819=>1000,53820=>1000,53821=>1000,53822=>1000,53823=>1000,53824=>1000,53825=>1000,53826=>1000,53827=>1000,53828=>1000,53829=>1000,53830=>1000,53831=>1000,53832=>1000,53833=>1000,53834=>1000,53835=>1000,53836=>1000,53837=>1000,53838=>1000,53839=>1000,53840=>1000,53841=>1000,53842=>1000,53843=>1000,53844=>1000,53845=>1000,53846=>1000,53847=>1000,53848=>1000,53849=>1000,53850=>1000,53851=>1000,53852=>1000,53853=>1000,53854=>1000,53855=>1000,53856=>1000,53857=>1000,53858=>1000,53859=>1000,53860=>1000,53861=>1000,53862=>1000,53863=>1000,53864=>1000,53865=>1000,53866=>1000,53867=>1000,53868=>1000,53869=>1000,53870=>1000,53871=>1000,53872=>1000,53873=>1000,53874=>1000,53875=>1000,53876=>1000,53877=>1000,53878=>1000,53879=>1000,53880=>1000,53881=>1000,53882=>1000,53883=>1000,53884=>1000,53885=>1000,53886=>1000,53887=>1000,53888=>1000,53889=>1000,53890=>1000,53891=>1000,53892=>1000,53893=>1000,53894=>1000,53895=>1000,53896=>1000,53897=>1000,53898=>1000,53899=>1000,53900=>1000,53901=>1000,53902=>1000,53903=>1000,53904=>1000,53905=>1000,53906=>1000,53907=>1000,53908=>1000,53909=>1000,53910=>1000,53911=>1000,53912=>1000,53913=>1000,53914=>1000,53915=>1000,53916=>1000,53917=>1000,53918=>1000,53919=>1000,53920=>1000,53921=>1000,53922=>1000,53923=>1000,53924=>1000,53925=>1000,53926=>1000,53927=>1000,53928=>1000,53929=>1000,53930=>1000,53931=>1000,53932=>1000,53933=>1000,53934=>1000,53935=>1000,53936=>1000,53937=>1000,53938=>1000,53939=>1000,53940=>1000,53941=>1000,53942=>1000,53943=>1000,53944=>1000,53945=>1000,53946=>1000,53947=>1000,53948=>1000,53949=>1000,53950=>1000,53951=>1000,53952=>1000,53953=>1000,53954=>1000,53955=>1000,53956=>1000,53957=>1000,53958=>1000,53959=>1000,53960=>1000,53961=>1000,53962=>1000,53963=>1000,53964=>1000,53965=>1000,53966=>1000,53967=>1000,53968=>1000,53969=>1000,53970=>1000,53971=>1000,53972=>1000,53973=>1000,53974=>1000,53975=>1000,53976=>1000,53977=>1000,53978=>1000,53979=>1000,53980=>1000,53981=>1000,53982=>1000,53983=>1000,53984=>1000,53985=>1000,53986=>1000,53987=>1000,53988=>1000,53989=>1000,53990=>1000,53991=>1000,53992=>1000,53993=>1000,53994=>1000,53995=>1000,53996=>1000,53997=>1000,53998=>1000,53999=>1000,54000=>1000,54001=>1000,54002=>1000,54003=>1000,54004=>1000,54005=>1000,54006=>1000,54007=>1000,54008=>1000,54009=>1000,54010=>1000,54011=>1000,54012=>1000,54013=>1000,54014=>1000,54015=>1000,54016=>1000,54017=>1000,54018=>1000,54019=>1000,54020=>1000,54021=>1000,54022=>1000,54023=>1000,54024=>1000,54025=>1000,54026=>1000,54027=>1000,54028=>1000,54029=>1000,54030=>1000,54031=>1000,54032=>1000,54033=>1000,54034=>1000,54035=>1000,54036=>1000,54037=>1000,54038=>1000,54039=>1000,54040=>1000,54041=>1000,54042=>1000,54043=>1000,54044=>1000,54045=>1000,54046=>1000,54047=>1000,54048=>1000,54049=>1000,54050=>1000,54051=>1000,54052=>1000,54053=>1000,54054=>1000,54055=>1000,54056=>1000,54057=>1000,54058=>1000,54059=>1000,54060=>1000,54061=>1000,54062=>1000,54063=>1000,54064=>1000,54065=>1000,54066=>1000,54067=>1000,54068=>1000,54069=>1000,54070=>1000,54071=>1000,54072=>1000,54073=>1000,54074=>1000,54075=>1000,54076=>1000,54077=>1000,54078=>1000,54079=>1000,54080=>1000,54081=>1000,54082=>1000,54083=>1000,54084=>1000,54085=>1000,54086=>1000,54087=>1000,54088=>1000,54089=>1000,54090=>1000,54091=>1000,54092=>1000,54093=>1000,54094=>1000,54095=>1000,54096=>1000,54097=>1000,54098=>1000,54099=>1000,54100=>1000,54101=>1000,54102=>1000,54103=>1000,54104=>1000,54105=>1000,54106=>1000,54107=>1000,54108=>1000,54109=>1000,54110=>1000,54111=>1000,54112=>1000,54113=>1000,54114=>1000,54115=>1000,54116=>1000,54117=>1000,54118=>1000,54119=>1000,54120=>1000,54121=>1000,54122=>1000,54123=>1000,54124=>1000,54125=>1000,54126=>1000,54127=>1000,54128=>1000,54129=>1000,54130=>1000,54131=>1000,54132=>1000,54133=>1000,54134=>1000,54135=>1000,54136=>1000,54137=>1000,54138=>1000,54139=>1000,54140=>1000,54141=>1000,54142=>1000,54143=>1000,54144=>1000,54145=>1000,54146=>1000,54147=>1000,54148=>1000,54149=>1000,54150=>1000,54151=>1000,54152=>1000,54153=>1000,54154=>1000,54155=>1000,54156=>1000,54157=>1000,54158=>1000,54159=>1000,54160=>1000,54161=>1000,54162=>1000,54163=>1000,54164=>1000,54165=>1000,54166=>1000,54167=>1000,54168=>1000,54169=>1000,54170=>1000,54171=>1000,54172=>1000,54173=>1000,54174=>1000,54175=>1000,54176=>1000,54177=>1000,54178=>1000,54179=>1000,54180=>1000,54181=>1000,54182=>1000,54183=>1000,54184=>1000,54185=>1000,54186=>1000,54187=>1000,54188=>1000,54189=>1000,54190=>1000,54191=>1000,54192=>1000,54193=>1000,54194=>1000,54195=>1000,54196=>1000,54197=>1000,54198=>1000,54199=>1000,54200=>1000,54201=>1000,54202=>1000,54203=>1000,54204=>1000,54205=>1000,54206=>1000,54207=>1000,54208=>1000,54209=>1000,54210=>1000,54211=>1000,54212=>1000,54213=>1000,54214=>1000,54215=>1000,54216=>1000,54217=>1000,54218=>1000,54219=>1000,54220=>1000,54221=>1000,54222=>1000,54223=>1000,54224=>1000,54225=>1000,54226=>1000,54227=>1000,54228=>1000,54229=>1000,54230=>1000,54231=>1000,54232=>1000,54233=>1000,54234=>1000,54235=>1000,54236=>1000,54237=>1000,54238=>1000,54239=>1000,54240=>1000,54241=>1000,54242=>1000,54243=>1000,54244=>1000,54245=>1000,54246=>1000,54247=>1000,54248=>1000,54249=>1000,54250=>1000,54251=>1000,54252=>1000,54253=>1000,54254=>1000,54255=>1000,54256=>1000,54257=>1000,54258=>1000,54259=>1000,54260=>1000,54261=>1000,54262=>1000,54263=>1000,54264=>1000,54265=>1000,54266=>1000,54267=>1000,54268=>1000,54269=>1000,54270=>1000,54271=>1000,54272=>1000,54273=>1000,54274=>1000,54275=>1000,54276=>1000,54277=>1000,54278=>1000,54279=>1000,54280=>1000,54281=>1000,54282=>1000,54283=>1000,54284=>1000,54285=>1000,54286=>1000,54287=>1000,54288=>1000,54289=>1000,54290=>1000,54291=>1000,54292=>1000,54293=>1000,54294=>1000,54295=>1000,54296=>1000,54297=>1000,54298=>1000,54299=>1000,54300=>1000,54301=>1000,54302=>1000,54303=>1000,54304=>1000,54305=>1000,54306=>1000,54307=>1000,54308=>1000,54309=>1000,54310=>1000,54311=>1000,54312=>1000,54313=>1000,54314=>1000,54315=>1000,54316=>1000,54317=>1000,54318=>1000,54319=>1000,54320=>1000,54321=>1000,54322=>1000,54323=>1000,54324=>1000,54325=>1000,54326=>1000,54327=>1000,54328=>1000,54329=>1000,54330=>1000,54331=>1000,54332=>1000,54333=>1000,54334=>1000,54335=>1000,54336=>1000,54337=>1000,54338=>1000,54339=>1000,54340=>1000,54341=>1000,54342=>1000,54343=>1000,54344=>1000,54345=>1000,54346=>1000,54347=>1000,54348=>1000,54349=>1000,54350=>1000,54351=>1000,54352=>1000,54353=>1000,54354=>1000,54355=>1000,54356=>1000,54357=>1000,54358=>1000,54359=>1000,54360=>1000,54361=>1000,54362=>1000,54363=>1000,54364=>1000,54365=>1000,54366=>1000,54367=>1000,54368=>1000,54369=>1000,54370=>1000,54371=>1000,54372=>1000,54373=>1000,54374=>1000,54375=>1000,54376=>1000,54377=>1000,54378=>1000,54379=>1000,54380=>1000,54381=>1000,54382=>1000,54383=>1000,54384=>1000,54385=>1000,54386=>1000,54387=>1000,54388=>1000,54389=>1000,54390=>1000,54391=>1000,54392=>1000,54393=>1000,54394=>1000,54395=>1000,54396=>1000,54397=>1000,54398=>1000,54399=>1000,54400=>1000,54401=>1000,54402=>1000,54403=>1000,54404=>1000,54405=>1000,54406=>1000,54407=>1000,54408=>1000,54409=>1000,54410=>1000,54411=>1000,54412=>1000,54413=>1000,54414=>1000,54415=>1000,54416=>1000,54417=>1000,54418=>1000,54419=>1000,54420=>1000,54421=>1000,54422=>1000,54423=>1000,54424=>1000,54425=>1000,54426=>1000,54427=>1000,54428=>1000,54429=>1000,54430=>1000,54431=>1000,54432=>1000,54433=>1000,54434=>1000,54435=>1000,54436=>1000,54437=>1000,54438=>1000,54439=>1000,54440=>1000,54441=>1000,54442=>1000,54443=>1000,54444=>1000,54445=>1000,54446=>1000,54447=>1000,54448=>1000,54449=>1000,54450=>1000,54451=>1000,54452=>1000,54453=>1000,54454=>1000,54455=>1000,54456=>1000,54457=>1000,54458=>1000,54459=>1000,54460=>1000,54461=>1000,54462=>1000,54463=>1000,54464=>1000,54465=>1000,54466=>1000,54467=>1000,54468=>1000,54469=>1000,54470=>1000,54471=>1000,54472=>1000,54473=>1000,54474=>1000,54475=>1000,54476=>1000,54477=>1000,54478=>1000,54479=>1000,54480=>1000,54481=>1000,54482=>1000,54483=>1000,54484=>1000,54485=>1000,54486=>1000,54487=>1000,54488=>1000,54489=>1000,54490=>1000,54491=>1000,54492=>1000,54493=>1000,54494=>1000,54495=>1000,54496=>1000,54497=>1000,54498=>1000,54499=>1000,54500=>1000,54501=>1000,54502=>1000,54503=>1000,54504=>1000,54505=>1000,54506=>1000,54507=>1000,54508=>1000,54509=>1000,54510=>1000,54511=>1000,54512=>1000,54513=>1000,54514=>1000,54515=>1000,54516=>1000,54517=>1000,54518=>1000,54519=>1000,54520=>1000,54521=>1000,54522=>1000,54523=>1000,54524=>1000,54525=>1000,54526=>1000,54527=>1000,54528=>1000,54529=>1000,54530=>1000,54531=>1000,54532=>1000,54533=>1000,54534=>1000,54535=>1000,54536=>1000,54537=>1000,54538=>1000,54539=>1000,54540=>1000,54541=>1000,54542=>1000,54543=>1000,54544=>1000,54545=>1000,54546=>1000,54547=>1000,54548=>1000,54549=>1000,54550=>1000,54551=>1000,54552=>1000,54553=>1000,54554=>1000,54555=>1000,54556=>1000,54557=>1000,54558=>1000,54559=>1000,54560=>1000,54561=>1000,54562=>1000,54563=>1000,54564=>1000,54565=>1000,54566=>1000,54567=>1000,54568=>1000,54569=>1000,54570=>1000,54571=>1000,54572=>1000,54573=>1000,54574=>1000,54575=>1000,54576=>1000,54577=>1000,54578=>1000,54579=>1000,54580=>1000,54581=>1000,54582=>1000,54583=>1000,54584=>1000,54585=>1000,54586=>1000,54587=>1000,54588=>1000,54589=>1000,54590=>1000,54591=>1000,54592=>1000,54593=>1000,54594=>1000,54595=>1000,54596=>1000,54597=>1000,54598=>1000,54599=>1000,54600=>1000,54601=>1000,54602=>1000,54603=>1000,54604=>1000,54605=>1000,54606=>1000,54607=>1000,54608=>1000,54609=>1000,54610=>1000,54611=>1000,54612=>1000,54613=>1000,54614=>1000,54615=>1000,54616=>1000,54617=>1000,54618=>1000,54619=>1000,54620=>1000,54621=>1000,54622=>1000,54623=>1000,54624=>1000,54625=>1000,54626=>1000,54627=>1000,54628=>1000,54629=>1000,54630=>1000,54631=>1000,54632=>1000,54633=>1000,54634=>1000,54635=>1000,54636=>1000,54637=>1000,54638=>1000,54639=>1000,54640=>1000,54641=>1000,54642=>1000,54643=>1000,54644=>1000,54645=>1000,54646=>1000,54647=>1000,54648=>1000,54649=>1000,54650=>1000,54651=>1000,54652=>1000,54653=>1000,54654=>1000,54655=>1000,54656=>1000,54657=>1000,54658=>1000,54659=>1000,54660=>1000,54661=>1000,54662=>1000,54663=>1000,54664=>1000,54665=>1000,54666=>1000,54667=>1000,54668=>1000,54669=>1000,54670=>1000,54671=>1000,54672=>1000,54673=>1000,54674=>1000,54675=>1000,54676=>1000,54677=>1000,54678=>1000,54679=>1000,54680=>1000,54681=>1000,54682=>1000,54683=>1000,54684=>1000,54685=>1000,54686=>1000,54687=>1000,54688=>1000,54689=>1000,54690=>1000,54691=>1000,54692=>1000,54693=>1000,54694=>1000,54695=>1000,54696=>1000,54697=>1000,54698=>1000,54699=>1000,54700=>1000,54701=>1000,54702=>1000,54703=>1000,54704=>1000,54705=>1000,54706=>1000,54707=>1000,54708=>1000,54709=>1000,54710=>1000,54711=>1000,54712=>1000,54713=>1000,54714=>1000,54715=>1000,54716=>1000,54717=>1000,54718=>1000,54719=>1000,54720=>1000,54721=>1000,54722=>1000,54723=>1000,54724=>1000,54725=>1000,54726=>1000,54727=>1000,54728=>1000,54729=>1000,54730=>1000,54731=>1000,54732=>1000,54733=>1000,54734=>1000,54735=>1000,54736=>1000,54737=>1000,54738=>1000,54739=>1000,54740=>1000,54741=>1000,54742=>1000,54743=>1000,54744=>1000,54745=>1000,54746=>1000,54747=>1000,54748=>1000,54749=>1000,54750=>1000,54751=>1000,54752=>1000,54753=>1000,54754=>1000,54755=>1000,54756=>1000,54757=>1000,54758=>1000,54759=>1000,54760=>1000,54761=>1000,54762=>1000,54763=>1000,54764=>1000,54765=>1000,54766=>1000,54767=>1000,54768=>1000,54769=>1000,54770=>1000,54771=>1000,54772=>1000,54773=>1000,54774=>1000,54775=>1000,54776=>1000,54777=>1000,54778=>1000,54779=>1000,54780=>1000,54781=>1000,54782=>1000,54783=>1000,54784=>1000,54785=>1000,54786=>1000,54787=>1000,54788=>1000,54789=>1000,54790=>1000,54791=>1000,54792=>1000,54793=>1000,54794=>1000,54795=>1000,54796=>1000,54797=>1000,54798=>1000,54799=>1000,54800=>1000,54801=>1000,54802=>1000,54803=>1000,54804=>1000,54805=>1000,54806=>1000,54807=>1000,54808=>1000,54809=>1000,54810=>1000,54811=>1000,54812=>1000,54813=>1000,54814=>1000,54815=>1000,54816=>1000,54817=>1000,54818=>1000,54819=>1000,54820=>1000,54821=>1000,54822=>1000,54823=>1000,54824=>1000,54825=>1000,54826=>1000,54827=>1000,54828=>1000,54829=>1000,54830=>1000,54831=>1000,54832=>1000,54833=>1000,54834=>1000,54835=>1000,54836=>1000,54837=>1000,54838=>1000,54839=>1000,54840=>1000,54841=>1000,54842=>1000,54843=>1000,54844=>1000,54845=>1000,54846=>1000,54847=>1000,54848=>1000,54849=>1000,54850=>1000,54851=>1000,54852=>1000,54853=>1000,54854=>1000,54855=>1000,54856=>1000,54857=>1000,54858=>1000,54859=>1000,54860=>1000,54861=>1000,54862=>1000,54863=>1000,54864=>1000,54865=>1000,54866=>1000,54867=>1000,54868=>1000,54869=>1000,54870=>1000,54871=>1000,54872=>1000,54873=>1000,54874=>1000,54875=>1000,54876=>1000,54877=>1000,54878=>1000,54879=>1000,54880=>1000,54881=>1000,54882=>1000,54883=>1000,54884=>1000,54885=>1000,54886=>1000,54887=>1000,54888=>1000,54889=>1000,54890=>1000,54891=>1000,54892=>1000,54893=>1000,54894=>1000,54895=>1000,54896=>1000,54897=>1000,54898=>1000,54899=>1000,54900=>1000,54901=>1000,54902=>1000,54903=>1000,54904=>1000,54905=>1000,54906=>1000,54907=>1000,54908=>1000,54909=>1000,54910=>1000,54911=>1000,54912=>1000,54913=>1000,54914=>1000,54915=>1000,54916=>1000,54917=>1000,54918=>1000,54919=>1000,54920=>1000,54921=>1000,54922=>1000,54923=>1000,54924=>1000,54925=>1000,54926=>1000,54927=>1000,54928=>1000,54929=>1000,54930=>1000,54931=>1000,54932=>1000,54933=>1000,54934=>1000,54935=>1000,54936=>1000,54937=>1000,54938=>1000,54939=>1000,54940=>1000,54941=>1000,54942=>1000,54943=>1000,54944=>1000,54945=>1000,54946=>1000,54947=>1000,54948=>1000,54949=>1000,54950=>1000,54951=>1000,54952=>1000,54953=>1000,54954=>1000,54955=>1000,54956=>1000,54957=>1000,54958=>1000,54959=>1000,54960=>1000,54961=>1000,54962=>1000,54963=>1000,54964=>1000,54965=>1000,54966=>1000,54967=>1000,54968=>1000,54969=>1000,54970=>1000,54971=>1000,54972=>1000,54973=>1000,54974=>1000,54975=>1000,54976=>1000,54977=>1000,54978=>1000,54979=>1000,54980=>1000,54981=>1000,54982=>1000,54983=>1000,54984=>1000,54985=>1000,54986=>1000,54987=>1000,54988=>1000,54989=>1000,54990=>1000,54991=>1000,54992=>1000,54993=>1000,54994=>1000,54995=>1000,54996=>1000,54997=>1000,54998=>1000,54999=>1000,55000=>1000,55001=>1000,55002=>1000,55003=>1000,55004=>1000,55005=>1000,55006=>1000,55007=>1000,55008=>1000,55009=>1000,55010=>1000,55011=>1000,55012=>1000,55013=>1000,55014=>1000,55015=>1000,55016=>1000,55017=>1000,55018=>1000,55019=>1000,55020=>1000,55021=>1000,55022=>1000,55023=>1000,55024=>1000,55025=>1000,55026=>1000,55027=>1000,55028=>1000,55029=>1000,55030=>1000,55031=>1000,55032=>1000,55033=>1000,55034=>1000,55035=>1000,55036=>1000,55037=>1000,55038=>1000,55039=>1000,55040=>1000,55041=>1000,55042=>1000,55043=>1000,55044=>1000,55045=>1000,55046=>1000,55047=>1000,55048=>1000,55049=>1000,55050=>1000,55051=>1000,55052=>1000,55053=>1000,55054=>1000,55055=>1000,55056=>1000,55057=>1000,55058=>1000,55059=>1000,55060=>1000,55061=>1000,55062=>1000,55063=>1000,55064=>1000,55065=>1000,55066=>1000,55067=>1000,55068=>1000,55069=>1000,55070=>1000,55071=>1000,55072=>1000,55073=>1000,55074=>1000,55075=>1000,55076=>1000,55077=>1000,55078=>1000,55079=>1000,55080=>1000,55081=>1000,55082=>1000,55083=>1000,55084=>1000,55085=>1000,55086=>1000,55087=>1000,55088=>1000,55089=>1000,55090=>1000,55091=>1000,55092=>1000,55093=>1000,55094=>1000,55095=>1000,55096=>1000,55097=>1000,55098=>1000,55099=>1000,55100=>1000,55101=>1000,55102=>1000,55103=>1000,55104=>1000,55105=>1000,55106=>1000,55107=>1000,55108=>1000,55109=>1000,55110=>1000,55111=>1000,55112=>1000,55113=>1000,55114=>1000,55115=>1000,55116=>1000,55117=>1000,55118=>1000,55119=>1000,55120=>1000,55121=>1000,55122=>1000,55123=>1000,55124=>1000,55125=>1000,55126=>1000,55127=>1000,55128=>1000,55129=>1000,55130=>1000,55131=>1000,55132=>1000,55133=>1000,55134=>1000,55135=>1000,55136=>1000,55137=>1000,55138=>1000,55139=>1000,55140=>1000,55141=>1000,55142=>1000,55143=>1000,55144=>1000,55145=>1000,55146=>1000,55147=>1000,55148=>1000,55149=>1000,55150=>1000,55151=>1000,55152=>1000,55153=>1000,55154=>1000,55155=>1000,55156=>1000,55157=>1000,55158=>1000,55159=>1000,55160=>1000,55161=>1000,55162=>1000,55163=>1000,55164=>1000,55165=>1000,55166=>1000,55167=>1000,55168=>1000,55169=>1000,55170=>1000,55171=>1000,55172=>1000,55173=>1000,55174=>1000,55175=>1000,55176=>1000,55177=>1000,55178=>1000,55179=>1000,55180=>1000,55181=>1000,55182=>1000,55183=>1000,55184=>1000,55185=>1000,55186=>1000,55187=>1000,55188=>1000,55189=>1000,55190=>1000,55191=>1000,55192=>1000,55193=>1000,55194=>1000,55195=>1000,55196=>1000,55197=>1000,55198=>1000,55199=>1000,55200=>1000,55201=>1000,55202=>1000,55203=>1000,59393=>316,59394=>507,59395=>507,59396=>484,59397=>484,59416=>0,59492=>480,59495=>480,59536=>458,59557=>466,59558=>480,59559=>903,61441=>500,61442=>500,63232=>541,63233=>0,63234=>0,63235=>0,63236=>0,63237=>0,63238=>0,63239=>0,63240=>0,63241=>0,63242=>0,63243=>0,63244=>0,63245=>0,63246=>0,63247=>849,63248=>0,63249=>0,63250=>0,63251=>0,63252=>0,63253=>0,63254=>0,63255=>0,63256=>0,63257=>0,63258=>0,63260=>333,63261=>287,63744=>1000,63745=>1000,63746=>1000,63747=>1000,63748=>1000,63749=>1000,63750=>1000,63751=>1000,63752=>1000,63753=>1000,63754=>1000,63755=>1000,63756=>1000,63757=>1000,63758=>1000,63759=>1000,63760=>1000,63761=>1000,63762=>1000,63763=>1000,63764=>1000,63765=>1000,63766=>1000,63767=>1000,63768=>1000,63769=>1000,63770=>1000,63771=>1000,63772=>1000,63773=>1000,63774=>1000,63775=>1000,63776=>1000,63777=>1000,63778=>1000,63779=>1000,63780=>1000,63781=>1000,63782=>1000,63783=>1000,63784=>1000,63785=>1000,63786=>1000,63787=>1000,63788=>1000,63789=>1000,63790=>1000,63791=>1000,63792=>1000,63793=>1000,63794=>1000,63795=>1000,63796=>1000,63797=>1000,63798=>1000,63799=>1000,63800=>1000,63801=>1000,63802=>1000,63803=>1000,63804=>1000,63805=>1000,63806=>1000,63807=>1000,63808=>1000,63809=>1000,63810=>1000,63811=>1000,63812=>1000,63813=>1000,63814=>1000,63815=>1000,63816=>1000,63817=>1000,63818=>1000,63819=>1000,63820=>1000,63821=>1000,63822=>1000,63823=>1000,63824=>1000,63825=>1000,63826=>1000,63827=>1000,63828=>1000,63829=>1000,63830=>1000,63831=>1000,63832=>1000,63833=>1000,63834=>1000,63835=>1000,63836=>1000,63837=>1000,63838=>1000,63839=>1000,63840=>1000,63841=>1000,63842=>1000,63843=>1000,63844=>1000,63845=>1000,63846=>1000,63847=>1000,63848=>1000,63849=>1000,63850=>1000,63851=>1000,63852=>1000,63853=>1000,63854=>1000,63855=>1000,63856=>1000,63857=>1000,63858=>1000,63859=>1000,63860=>1000,63861=>1000,63862=>1000,63863=>1000,63864=>1000,63865=>1000,63866=>1000,63867=>1000,63868=>1000,63869=>1000,63870=>1000,63871=>1000,63872=>1000,63873=>1000,63874=>1000,63875=>1000,63876=>1000,63877=>1000,63878=>1000,63879=>1000,63880=>1000,63881=>1000,63882=>1000,63883=>1000,63884=>1000,63885=>1000,63886=>1000,63887=>1000,63888=>1000,63889=>1000,63890=>1000,63891=>1000,63892=>1000,63893=>1000,63894=>1000,63895=>1000,63896=>1000,63897=>1000,63898=>1000,63899=>1000,63900=>1000,63901=>1000,63902=>1000,63903=>1000,63904=>1000,63905=>1000,63906=>1000,63907=>1000,63908=>1000,63909=>1000,63910=>1000,63911=>1000,63912=>1000,63913=>1000,63914=>1000,63915=>1000,63916=>1000,63917=>1000,63918=>1000,63919=>1000,63920=>1000,63921=>1000,63922=>1000,63923=>1000,63924=>1000,63925=>1000,63926=>1000,63927=>1000,63928=>1000,63929=>1000,63930=>1000,63931=>1000,63932=>1000,63933=>1000,63934=>1000,63935=>1000,63936=>1000,63937=>1000,63938=>1000,63939=>1000,63940=>1000,63941=>1000,63942=>1000,63943=>1000,63944=>1000,63945=>1000,63946=>1000,63947=>1000,63948=>1000,63949=>1000,63950=>1000,63951=>1000,63952=>1000,63953=>1000,63954=>1000,63955=>1000,63956=>1000,63957=>1000,63958=>1000,63959=>1000,63960=>1000,63961=>1000,63962=>1000,63963=>1000,63964=>1000,63965=>1000,63966=>1000,63967=>1000,63968=>1000,63969=>1000,63970=>1000,63971=>1000,63972=>1000,63973=>1000,63974=>1000,63975=>1000,63976=>1000,63977=>1000,63978=>1000,63979=>1000,63980=>1000,63981=>1000,63982=>1000,63983=>1000,63984=>1000,63985=>1000,63986=>1000,63987=>1000,63988=>1000,63989=>1000,63990=>1000,63991=>1000,63992=>1000,63993=>1000,63994=>1000,63995=>1000,63996=>1000,63997=>1000,63998=>1000,63999=>1000,64000=>1000,64001=>1000,64002=>1000,64003=>1000,64004=>1000,64005=>1000,64006=>1000,64007=>1000,64008=>1000,64009=>1000,64010=>1000,64011=>1000,64012=>1000,64013=>1000,64014=>1000,64015=>1000,64016=>1000,64017=>1000,64018=>1000,64019=>1000,64020=>1000,64021=>1000,64022=>1000,64023=>1000,64024=>1000,64025=>1000,64026=>1000,64027=>1000,64028=>1000,64029=>1000,64030=>1000,64031=>1000,64032=>1000,64033=>1000,64034=>1000,64035=>1000,64036=>1000,64037=>1000,64038=>1000,64039=>1000,64040=>1000,64041=>1000,64042=>1000,64043=>1000,64044=>1000,64045=>1000,64256=>537,64257=>500,64258=>500,64259=>778,64260=>750,64261=>532,64262=>758,64275=>784,64276=>784,64277=>784,64278=>784,64279=>893,64286=>333,64287=>590,64288=>550,64289=>709,64290=>649,64291=>730,64292=>656,64293=>605,64294=>730,64295=>633,64296=>794,64297=>584,64298=>700,64299=>700,64300=>700,64301=>700,64302=>577,64303=>577,64304=>577,64305=>563,64306=>411,64307=>512,64308=>594,64309=>316,64310=>326,64312=>594,64313=>316,64314=>507,64315=>527,64316=>484,64318=>594,64320=>338,64321=>604,64323=>567,64324=>569,64326=>514,64327=>583,64328=>507,64329=>700,64330=>633,64331=>316,64332=>563,64333=>527,64334=>569,64335=>577,64336=>243,64337=>273,64338=>771,64339=>788,64340=>276,64341=>243,64342=>771,64343=>788,64344=>276,64345=>243,64346=>771,64347=>788,64348=>276,64349=>243,64350=>771,64351=>788,64352=>276,64353=>243,64354=>771,64355=>788,64356=>276,64357=>243,64358=>771,64359=>788,64360=>276,64361=>243,64362=>957,64363=>903,64364=>466,64365=>480,64366=>957,64367=>903,64368=>466,64369=>480,64370=>544,64371=>658,64372=>646,64373=>637,64374=>544,64375=>658,64376=>646,64377=>637,64378=>544,64379=>658,64380=>646,64381=>637,64382=>544,64383=>658,64384=>646,64385=>637,64386=>430,64387=>458,64388=>430,64389=>458,64390=>430,64391=>458,64392=>430,64393=>458,64394=>421,64395=>436,64396=>421,64397=>436,64398=>828,64399=>942,64400=>432,64401=>549,64402=>828,64403=>942,64404=>432,64405=>549,64406=>828,64407=>942,64408=>432,64409=>549,64410=>828,64411=>942,64412=>432,64413=>549,64414=>692,64415=>723,64416=>692,64417=>723,64418=>276,64419=>243,64420=>514,64421=>477,64422=>514,64423=>509,64424=>273,64425=>427,64426=>706,64427=>706,64428=>686,64429=>686,64430=>550,64431=>461,64432=>550,64433=>461,64467=>757,64468=>733,64469=>432,64470=>549,64471=>470,64472=>466,64473=>470,64474=>466,64475=>470,64476=>466,64477=>470,64478=>470,64479=>466,64480=>470,64481=>466,64482=>470,64483=>466,64484=>781,64485=>933,64486=>276,64487=>243,64488=>276,64489=>243,64490=>547,64491=>517,64492=>783,64493=>753,64494=>740,64495=>710,64496=>740,64497=>710,64498=>740,64499=>710,64500=>740,64501=>710,64502=>1207,64503=>1177,64504=>517,64505=>1067,64506=>1037,64507=>517,64508=>731,64509=>793,64510=>276,64511=>243,64512=>932,64513=>932,64514=>914,64515=>1067,64516=>1077,64517=>935,64518=>935,64519=>935,64520=>917,64521=>1070,64522=>1080,64523=>932,64524=>932,64525=>932,64526=>914,64527=>1067,64528=>1077,64529=>932,64530=>914,64531=>1067,64532=>1077,64533=>1305,64534=>1287,64535=>1305,64536=>1287,64537=>1305,64538=>1305,64539=>1287,64540=>1429,64541=>1429,64542=>1429,64543=>1411,64544=>1476,64545=>1458,64546=>1476,64547=>1476,64548=>1476,64549=>1458,64550=>1392,64551=>1374,64552=>1374,64553=>1245,64554=>1227,64555=>1245,64556=>1227,64557=>1125,64558=>1125,64559=>1125,64560=>1107,64561=>1260,64562=>1270,64563=>1125,64564=>1107,64565=>1260,64566=>1270,64567=>706,64568=>1091,64569=>1091,64570=>1091,64571=>1106,64572=>1073,64573=>1226,64574=>1236,64575=>932,64576=>932,64577=>932,64578=>914,64579=>1067,64580=>1077,64581=>1140,64582=>1140,64583=>1140,64584=>1122,64585=>1275,64586=>1285,64587=>932,64588=>932,64589=>932,64590=>914,64591=>1067,64592=>1077,64593=>1345,64594=>1327,64595=>1480,64596=>1490,64597=>932,64598=>932,64599=>932,64600=>914,64601=>1067,64602=>1077,64603=>430,64604=>421,64605=>731,64606=>296,64607=>300,64608=>300,64609=>300,64610=>300,64611=>300,64612=>680,64613=>680,64614=>884,64615=>967,64616=>1037,64617=>1047,64618=>680,64619=>680,64620=>884,64621=>967,64622=>1037,64623=>1047,64624=>680,64625=>680,64626=>884,64627=>967,64628=>1037,64629=>1047,64630=>680,64631=>680,64632=>884,64633=>967,64634=>1037,64635=>1047,64636=>1274,64637=>1284,64638=>1274,64639=>1284,64640=>821,64641=>1221,64642=>1188,64643=>1341,64644=>1351,64645=>884,64646=>1037,64647=>1047,64648=>806,64649=>1173,64650=>680,64651=>680,64652=>884,64653=>967,64654=>1037,64655=>1047,64656=>793,64657=>680,64658=>680,64659=>884,64660=>967,64661=>1037,64662=>1047,64663=>911,64664=>911,64665=>911,64666=>806,64667=>679,64668=>911,64669=>911,64670=>911,64671=>806,64672=>679,64673=>911,64674=>911,64675=>911,64676=>806,64677=>679,64678=>806,64679=>1284,64680=>1179,64681=>1284,64682=>1179,64683=>1284,64684=>1179,64685=>1408,64686=>1408,64687=>1408,64688=>1303,64689=>1455,64690=>1455,64691=>1350,64692=>1455,64693=>1455,64694=>1455,64695=>1350,64696=>1371,64697=>1266,64698=>1224,64699=>1119,64700=>1224,64701=>1119,64702=>1104,64703=>1104,64704=>1104,64705=>999,64706=>1104,64707=>999,64708=>1070,64709=>1070,64710=>1070,64711=>676,64712=>965,64713=>911,64714=>911,64715=>911,64716=>806,64717=>679,64718=>1119,64719=>1119,64720=>1119,64721=>1014,64722=>911,64723=>911,64724=>911,64725=>806,64726=>679,64727=>1324,64728=>1219,64729=>686,64730=>911,64731=>911,64732=>911,64733=>806,64734=>679,64735=>776,64736=>649,64737=>776,64738=>649,64739=>776,64740=>649,64741=>776,64742=>649,64743=>1303,64744=>1176,64745=>1303,64746=>1176,64747=>793,64748=>1082,64749=>776,64750=>776,64751=>649,64752=>776,64753=>649,64754=>306,64755=>302,64756=>298,64757=>1527,64758=>1537,64759=>1380,64760=>1390,64761=>1380,64762=>1390,64763=>1564,64764=>1574,64765=>1564,64766=>1574,64767=>1440,64768=>1450,64769=>1440,64770=>1450,64771=>1440,64772=>1450,64773=>1611,64774=>1621,64775=>1611,64776=>1621,64777=>1429,64778=>1429,64779=>1429,64780=>1411,64781=>1207,64782=>1207,64783=>1254,64784=>1254,64785=>1527,64786=>1537,64787=>1348,64788=>1358,64789=>1348,64790=>1358,64791=>1564,64792=>1574,64793=>1564,64794=>1574,64795=>1431,64796=>1441,64797=>1431,64798=>1441,64799=>1431,64800=>1441,64801=>1611,64802=>1621,64803=>1611,64804=>1621,64805=>1429,64806=>1429,64807=>1429,64808=>1411,64809=>1207,64810=>1207,64811=>1254,64812=>1254,64813=>1408,64814=>1408,64815=>1408,64816=>1303,64817=>1176,64818=>1176,64819=>1266,64820=>1408,64821=>1408,64822=>1408,64823=>1408,64824=>1408,64825=>1408,64826=>1266,64827=>1266,64828=>273,64829=>243,64830=>600,64831=>600,64848=>1444,64849=>1541,64850=>1549,64851=>1444,64852=>1444,64853=>1444,64854=>1444,64855=>1444,64856=>1830,64857=>1817,64858=>1975,64859=>1964,64860=>2046,64861=>2046,64862=>2202,64863=>1962,64864=>1941,64865=>1941,64866=>1944,64867=>1836,64868=>2114,64869=>2093,64870=>1991,64871=>2049,64872=>1941,64873=>2212,64874=>1962,64875=>1941,64876=>1944,64877=>1836,64878=>2249,64879=>2096,64880=>1988,64881=>1925,64882=>1904,64883=>1799,64884=>2070,64885=>1833,64886=>1729,64887=>1652,64888=>1881,64889=>1729,64890=>1892,64891=>1881,64892=>1759,64893=>1637,64894=>1670,64895=>1654,64896=>1522,64897=>1686,64898=>1675,64899=>1549,64900=>1541,64901=>1522,64902=>1444,64903=>1436,64904=>1444,64905=>1757,64906=>1652,64907=>1975,64908=>1757,64909=>1652,64910=>1757,64911=>1652,64914=>1757,64915=>1857,64916=>1752,64917=>1444,64918=>1675,64919=>1522,64920=>1444,64921=>1675,64922=>1581,64923=>1570,64924=>1417,64925=>1362,64926=>1686,64927=>1686,64928=>1675,64929=>1686,64930=>1675,64931=>1581,64932=>1570,64933=>1975,64934=>2069,64935=>1964,64936=>2202,64937=>2259,64938=>2212,64939=>2259,64940=>1686,64941=>1581,64942=>1686,64943=>1686,64944=>1581,64945=>1870,64946=>1817,64947=>1686,64948=>1637,64949=>1444,64950=>1892,64951=>1886,64952=>1549,64953=>1975,64954=>1444,64955=>1723,64956=>1522,64957=>1541,64958=>2080,64959=>2080,64960=>1975,64961=>1817,64962=>1686,64963=>1499,64964=>1757,64965=>1883,64966=>2212,64967=>1686,65008=>1523,65009=>1172,65010=>1159,65011=>1356,65012=>2111,65013=>2258,65014=>2130,65015=>1552,65016=>2046,65017=>1856,65018=>1930,65019=>1070,65056=>450,65057=>450,65058=>450,65059=>450,65072=>1000,65073=>1000,65074=>1000,65075=>1000,65076=>1000,65077=>1000,65078=>1000,65079=>1000,65080=>1000,65081=>1000,65082=>1000,65083=>1000,65084=>1000,65085=>1000,65086=>1000,65087=>1000,65088=>1000,65089=>1000,65090=>1000,65091=>1000,65092=>1000,65097=>1000,65098=>1000,65099=>1000,65100=>1000,65101=>1000,65102=>1000,65103=>1000,65104=>167,65105=>250,65106=>167,65108=>167,65109=>167,65110=>334,65111=>167,65112=>600,65113=>200,65114=>200,65115=>200,65116=>200,65117=>200,65118=>200,65119=>334,65120=>400,65121=>233,65122=>350,65123=>200,65124=>350,65125=>350,65126=>350,65128=>167,65129=>334,65130=>533,65131=>609,65136=>300,65137=>298,65138=>296,65140=>298,65142=>300,65143=>298,65144=>300,65145=>302,65146=>298,65147=>296,65148=>306,65149=>306,65150=>154,65151=>154,65152=>529,65153=>243,65154=>273,65155=>243,65156=>273,65157=>470,65158=>466,65159=>243,65160=>273,65161=>731,65162=>793,65163=>276,65164=>243,65165=>243,65166=>273,65167=>771,65168=>788,65169=>276,65170=>243,65171=>514,65172=>477,65173=>771,65174=>788,65175=>276,65176=>243,65177=>771,65178=>788,65179=>276,65180=>243,65181=>544,65182=>658,65183=>646,65184=>637,65185=>544,65186=>658,65187=>646,65188=>637,65189=>544,65190=>658,65191=>646,65192=>637,65193=>430,65194=>458,65195=>430,65196=>458,65197=>421,65198=>436,65199=>421,65200=>436,65201=>1194,65202=>1194,65203=>770,65204=>770,65205=>1194,65206=>1194,65207=>770,65208=>770,65209=>1291,65210=>1291,65211=>817,65212=>817,65213=>1291,65214=>1291,65215=>817,65216=>817,65217=>843,65218=>843,65219=>733,65220=>733,65221=>843,65222=>843,65223=>733,65224=>733,65225=>594,65226=>556,65227=>586,65228=>554,65229=>594,65230=>556,65231=>586,65232=>554,65233=>957,65234=>903,65235=>466,65236=>480,65237=>800,65238=>823,65239=>466,65240=>480,65241=>757,65242=>733,65243=>432,65244=>549,65245=>662,65246=>673,65247=>273,65248=>243,65249=>589,65250=>640,65251=>481,65252=>532,65253=>692,65254=>723,65255=>276,65256=>243,65257=>514,65258=>477,65259=>686,65260=>405,65261=>470,65262=>466,65263=>731,65264=>793,65265=>731,65266=>803,65267=>276,65268=>243,65269=>551,65270=>603,65271=>551,65272=>603,65273=>551,65274=>603,65275=>551,65276=>603,65281=>1000,65282=>1000,65283=>1000,65284=>1000,65285=>1000,65286=>1000,65287=>1000,65288=>1000,65289=>1000,65290=>1000,65291=>1000,65292=>1000,65293=>1000,65294=>1000,65295=>1000,65296=>1000,65297=>1000,65298=>1000,65299=>1000,65300=>1000,65301=>1000,65302=>1000,65303=>1000,65304=>1000,65305=>1000,65306=>1000,65307=>1000,65308=>1000,65309=>1000,65310=>1000,65311=>1000,65312=>1000,65313=>1000,65314=>1000,65315=>1000,65316=>1000,65317=>1000,65318=>1000,65319=>1000,65320=>1000,65321=>1000,65322=>1000,65323=>1000,65324=>1000,65325=>1000,65326=>1000,65327=>1000,65328=>1000,65329=>1000,65330=>1000,65331=>1000,65332=>1000,65333=>1000,65334=>1000,65335=>1000,65336=>1000,65337=>1000,65338=>1000,65339=>1000,65340=>1000,65341=>1000,65342=>1000,65343=>1000,65344=>1000,65345=>1000,65346=>1000,65347=>1000,65348=>1000,65349=>1000,65350=>1000,65351=>1000,65352=>1000,65353=>1000,65354=>1000,65355=>1000,65356=>1000,65357=>1000,65358=>1000,65359=>1000,65360=>1000,65361=>1000,65362=>1000,65363=>1000,65364=>1000,65365=>1000,65366=>1000,65367=>1000,65368=>1000,65369=>1000,65370=>1000,65371=>1000,65372=>1000,65373=>1000,65374=>1000,65377=>500,65378=>500,65379=>500,65380=>500,65381=>500,65382=>500,65383=>500,65384=>500,65385=>500,65386=>500,65387=>500,65388=>500,65389=>500,65390=>500,65391=>500,65392=>500,65393=>500,65394=>500,65395=>500,65396=>500,65397=>500,65398=>500,65399=>500,65400=>500,65401=>500,65402=>500,65403=>500,65404=>500,65405=>500,65406=>500,65407=>500,65408=>500,65409=>500,65410=>500,65411=>500,65412=>500,65413=>500,65414=>500,65415=>500,65416=>500,65417=>500,65418=>500,65419=>500,65420=>500,65421=>500,65422=>500,65423=>500,65424=>500,65425=>500,65426=>500,65427=>500,65428=>500,65429=>500,65430=>500,65431=>500,65432=>500,65433=>500,65434=>500,65435=>500,65436=>500,65437=>500,65438=>500,65439=>500,65440=>500,65441=>500,65442=>500,65443=>500,65444=>500,65445=>500,65446=>500,65447=>500,65448=>500,65449=>500,65450=>500,65451=>500,65452=>500,65453=>500,65454=>500,65455=>500,65456=>500,65457=>500,65458=>500,65459=>500,65460=>500,65461=>500,65462=>500,65463=>500,65464=>500,65465=>500,65466=>500,65467=>500,65468=>500,65469=>500,65470=>500,65474=>500,65475=>500,65476=>500,65477=>500,65478=>500,65479=>500,65482=>500,65483=>500,65484=>500,65485=>500,65486=>500,65487=>500,65490=>500,65491=>500,65492=>500,65493=>500,65494=>500,65495=>500,65498=>500,65499=>500,65500=>500,65504=>1000,65505=>1000,65506=>1000,65507=>1000,65508=>1000,65509=>1000,65510=>1000,65512=>500,65513=>500,65514=>500,65515=>500,65516=>500,65517=>500,65518=>500,65532=>1000,65533=>1000,65535=>1000);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/cid0jp.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/cid0jp.php
new file mode 100644
index 00000000..010e25a6
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/cid0jp.php
@@ -0,0 +1,16 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='cidfont0';
+$name='ArialUnicodeMS';
+$up=-100;
+$ut=50;
+$dw=1000;
+$diff='';
+$originalsize=23275812;
+// Japanese
+$enc='UniJIS-UTF16-H';
+$cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'Japan1','Supplement'=>5);
+include(dirname(__FILE__).'/uni2cid_aj16.php');
+$desc=array('Flags'=>32,'FontBBox'=>'[-1011 -330 2260 1078]','ItalicAngle'=>0,'Ascent'=>1069,'Descent'=>-271,'Leading'=>0,'CapHeight'=>716,'XHeight'=>518,'StemV'=>34,'StemH'=>15,'AvgWidth'=>441,'MaxWidth'=>2259,'MissingWidth'=>1000);
+$cw=array(0=>1000,32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584,62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278,92=>278,93=>278,94=>469,95=>500,96=>333,97=>556,98=>556,99=>500,100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556,112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>500,176=>400,177=>584,178=>333,179=>333,180=>333,181=>556,182=>537,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834,190=>834,191=>611,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278,238=>278,239=>278,240=>556,241=>556,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>556,255=>500,256=>667,257=>556,258=>667,259=>556,260=>667,261=>556,262=>722,263=>500,264=>722,265=>500,266=>722,267=>500,268=>722,269=>500,270=>722,271=>627,272=>722,273=>556,274=>667,275=>556,276=>667,277=>556,278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>556,286=>778,287=>556,288=>778,289=>556,290=>778,291=>556,292=>722,293=>556,294=>722,295=>556,296=>278,297=>222,298=>278,299=>222,300=>278,301=>222,302=>278,303=>222,304=>278,305=>278,306=>751,307=>444,308=>500,309=>222,310=>667,311=>500,312=>437,313=>556,314=>222,315=>556,316=>222,317=>556,318=>222,319=>556,320=>318,321=>556,322=>222,323=>722,324=>556,325=>722,326=>556,327=>722,328=>556,329=>626,330=>723,331=>556,332=>778,333=>556,334=>778,335=>556,336=>778,337=>556,338=>1000,339=>944,340=>722,341=>333,342=>722,343=>333,344=>722,345=>333,346=>667,347=>500,348=>667,349=>500,350=>667,351=>500,352=>667,353=>500,354=>611,355=>278,356=>611,357=>406,358=>611,359=>278,360=>722,361=>556,362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556,372=>944,373=>722,374=>667,375=>500,376=>667,377=>611,378=>500,379=>611,380=>500,381=>611,382=>500,383=>222,384=>556,385=>740,386=>655,387=>556,388=>556,389=>556,390=>722,391=>766,392=>579,393=>722,394=>789,395=>655,396=>556,397=>557,398=>667,399=>729,400=>604,401=>611,402=>278,403=>791,404=>649,405=>806,406=>245,407=>322,408=>667,409=>500,410=>322,411=>500,412=>833,413=>722,414=>556,415=>778,416=>776,417=>556,418=>1019,419=>782,420=>735,421=>556,422=>722,423=>667,424=>500,425=>602,426=>366,427=>278,428=>571,429=>278,430=>611,431=>776,432=>620,433=>748,434=>667,435=>752,436=>615,437=>611,438=>500,439=>628,440=>628,441=>526,442=>480,443=>556,444=>556,445=>526,446=>556,447=>556,448=>278,449=>464,450=>474,451=>278,452=>1333,453=>1222,454=>1056,455=>1030,456=>778,457=>444,458=>1222,459=>944,460=>778,461=>667,462=>556,463=>278,464=>278,465=>778,466=>556,467=>722,468=>556,469=>722,470=>556,471=>722,472=>556,473=>722,474=>556,475=>722,476=>556,477=>556,478=>667,479=>556,480=>667,481=>556,482=>1000,483=>889,484=>778,485=>556,486=>778,487=>556,488=>667,489=>500,490=>778,491=>556,492=>778,493=>556,494=>534,495=>534,496=>222,497=>1333,498=>1222,499=>1056,500=>778,501=>556,506=>667,507=>556,508=>1000,509=>889,510=>778,511=>611,512=>667,513=>556,514=>667,515=>556,516=>667,517=>556,518=>667,519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>556,526=>778,527=>556,528=>722,529=>333,530=>722,531=>333,532=>722,533=>556,534=>722,535=>556,592=>556,593=>556,594=>556,595=>556,596=>500,597=>500,598=>556,599=>556,600=>556,601=>556,602=>777,603=>485,604=>485,605=>686,606=>519,607=>260,608=>556,609=>556,610=>557,611=>500,612=>500,613=>556,614=>556,615=>556,616=>242,617=>282,618=>356,619=>356,620=>425,621=>222,622=>635,623=>833,624=>833,625=>833,626=>556,627=>556,628=>558,629=>556,630=>715,631=>674,632=>558,633=>333,634=>333,635=>333,636=>333,637=>333,638=>312,639=>312,640=>530,641=>530,642=>500,643=>216,644=>276,645=>216,646=>222,647=>278,648=>278,649=>596,650=>558,651=>556,652=>500,653=>722,654=>500,655=>500,656=>500,657=>564,658=>530,659=>530,660=>464,661=>464,662=>464,663=>500,664=>614,665=>526,666=>519,667=>557,668=>558,669=>222,670=>500,671=>416,672=>556,673=>464,674=>464,675=>966,676=>966,677=>1030,678=>689,679=>484,680=>718,688=>326,689=>326,690=>153,691=>201,692=>201,693=>201,694=>304,695=>389,696=>278,697=>222,698=>372,699=>222,700=>222,701=>222,702=>222,703=>222,704=>250,705=>250,706=>320,707=>320,708=>320,709=>320,710=>333,711=>333,712=>192,713=>333,714=>333,715=>333,716=>192,717=>333,718=>333,719=>333,720=>300,721=>300,722=>222,723=>222,724=>340,725=>340,726=>280,727=>362,728=>333,729=>333,730=>333,731=>333,732=>333,733=>333,734=>333,736=>278,737=>153,738=>270,739=>274,740=>325,741=>360,742=>360,743=>360,744=>360,745=>360,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,864=>0,865=>0,884=>308,885=>308,890=>278,894=>278,900=>278,901=>278,902=>667,903=>278,904=>704,905=>759,906=>315,908=>778,910=>746,911=>758,912=>222,913=>667,914=>667,915=>550,916=>682,917=>667,918=>611,919=>722,920=>778,921=>278,922=>667,923=>667,924=>833,925=>722,926=>650,927=>778,928=>722,929=>667,931=>602,932=>611,933=>667,934=>808,935=>667,936=>804,937=>758,938=>278,939=>667,940=>576,941=>434,942=>556,943=>222,944=>551,945=>576,946=>563,947=>500,948=>557,949=>434,950=>440,951=>556,952=>556,953=>222,954=>498,955=>500,956=>553,957=>500,958=>432,959=>556,960=>678,961=>571,962=>472,963=>619,964=>382,965=>551,966=>649,967=>522,968=>729,969=>766,970=>222,971=>551,972=>556,973=>551,974=>766,976=>563,977=>616,978=>631,979=>726,980=>631,981=>644,982=>781,986=>722,988=>578,990=>570,992=>692,994=>880,995=>833,996=>684,997=>558,998=>680,999=>529,1000=>557,1001=>505,1002=>623,1003=>603,1004=>610,1005=>611,1006=>568,1007=>434,1008=>600,1009=>571,1010=>500,1011=>222,1025=>667,1026=>865,1027=>567,1028=>717,1029=>667,1030=>278,1031=>278,1032=>500,1033=>1105,1034=>1009,1035=>867,1036=>584,1038=>635,1039=>723,1040=>667,1041=>655,1042=>667,1043=>567,1044=>677,1045=>667,1046=>923,1047=>604,1048=>722,1049=>722,1050=>584,1051=>705,1052=>833,1053=>722,1054=>778,1055=>723,1056=>667,1057=>722,1058=>611,1059=>635,1060=>760,1061=>667,1062=>740,1063=>684,1064=>920,1065=>939,1066=>793,1067=>883,1068=>655,1069=>717,1070=>1006,1071=>722,1072=>556,1073=>573,1074=>531,1075=>383,1076=>583,1077=>556,1078=>669,1079=>458,1080=>559,1081=>559,1082=>437,1083=>571,1084=>683,1085=>552,1086=>556,1087=>542,1088=>556,1089=>500,1090=>458,1091=>500,1092=>823,1093=>500,1094=>562,1095=>533,1096=>802,1097=>823,1098=>620,1099=>717,1100=>523,1101=>510,1102=>744,1103=>542,1105=>556,1106=>556,1107=>383,1108=>510,1109=>500,1110=>222,1111=>278,1112=>222,1113=>873,1114=>811,1115=>556,1116=>437,1118=>500,1119=>542,1120=>976,1121=>766,1122=>656,1123=>521,1124=>950,1125=>694,1126=>667,1127=>597,1128=>952,1129=>817,1130=>654,1131=>600,1132=>932,1133=>817,1134=>604,1135=>458,1136=>804,1137=>729,1138=>778,1139=>556,1140=>667,1141=>500,1142=>667,1143=>500,1144=>1279,1145=>1060,1146=>778,1147=>556,1148=>976,1149=>766,1150=>976,1151=>766,1152=>722,1153=>514,1154=>686,1155=>334,1156=>382,1157=>334,1158=>334,1168=>435,1169=>339,1170=>567,1171=>383,1172=>656,1173=>556,1174=>923,1175=>669,1176=>604,1177=>458,1178=>584,1179=>437,1180=>584,1181=>437,1182=>584,1183=>437,1184=>764,1185=>537,1186=>741,1187=>573,1188=>900,1189=>670,1190=>736,1191=>560,1192=>778,1193=>560,1194=>722,1195=>500,1196=>611,1197=>458,1198=>667,1199=>500,1200=>667,1201=>500,1202=>667,1203=>500,1204=>916,1205=>661,1206=>684,1207=>533,1208=>684,1209=>533,1210=>684,1211=>556,1212=>829,1213=>667,1214=>829,1215=>667,1216=>278,1217=>923,1218=>669,1219=>584,1220=>437,1223=>735,1224=>570,1227=>684,1228=>533,1232=>667,1233=>556,1234=>667,1235=>556,1236=>1000,1237=>889,1238=>667,1239=>556,1240=>729,1241=>556,1242=>729,1243=>556,1244=>923,1245=>669,1246=>604,1247=>458,1248=>604,1249=>492,1250=>722,1251=>559,1252=>722,1253=>559,1254=>778,1255=>556,1256=>778,1257=>556,1258=>778,1259=>556,1262=>635,1263=>500,1264=>635,1265=>500,1266=>635,1267=>500,1268=>684,1269=>533,1272=>883,1273=>717,1329=>635,1330=>531,1331=>583,1332=>583,1333=>531,1334=>531,1335=>427,1336=>531,1337=>750,1338=>635,1339=>531,1340=>375,1341=>583,1342=>698,1343=>531,1344=>427,1345=>531,1346=>583,1347=>531,1348=>635,1349=>698,1350=>635,1351=>635,1352=>531,1353=>531,1354=>698,1355=>531,1356=>635,1357=>531,1358=>698,1359=>583,1360=>479,1361=>583,1362=>531,1363=>698,1364=>698,1365=>635,1366=>750,1369=>271,1370=>271,1371=>150,1372=>300,1373=>271,1374=>271,1375=>420,1377=>583,1378=>427,1379=>427,1380=>427,1381=>427,1382=>427,1383=>427,1384=>427,1385=>459,1386=>427,1387=>427,1388=>323,1389=>531,1390=>427,1391=>427,1392=>427,1393=>427,1394=>427,1395=>427,1396=>427,1397=>271,1398=>427,1399=>375,1400=>427,1401=>375,1402=>583,1403=>427,1404=>427,1405=>427,1406=>427,1407=>583,1408=>427,1409=>427,1410=>323,1411=>583,1412=>375,1413=>375,1414=>583,1415=>527,1417=>271,1425=>360,1426=>360,1427=>360,1428=>360,1429=>360,1430=>360,1431=>360,1432=>360,1433=>360,1434=>360,1435=>360,1436=>360,1437=>360,1438=>360,1439=>360,1440=>360,1441=>360,1443=>360,1444=>360,1445=>360,1446=>360,1447=>360,1448=>360,1449=>360,1450=>360,1451=>360,1452=>360,1453=>360,1454=>360,1455=>360,1456=>360,1457=>360,1458=>360,1459=>360,1460=>360,1461=>360,1462=>360,1463=>360,1464=>360,1465=>360,1467=>360,1468=>360,1469=>360,1470=>366,1471=>360,1472=>225,1473=>360,1474=>360,1475=>238,1476=>360,1488=>577,1489=>563,1490=>411,1491=>512,1492=>594,1493=>316,1494=>326,1495=>594,1496=>594,1497=>316,1498=>507,1499=>527,1500=>484,1501=>594,1502=>594,1503=>316,1504=>338,1505=>604,1506=>550,1507=>567,1508=>569,1509=>505,1510=>514,1511=>583,1512=>507,1513=>700,1514=>633,1520=>590,1521=>590,1522=>590,1523=>216,1524=>412,1548=>278,1563=>278,1567=>556,1569=>529,1570=>243,1571=>243,1572=>470,1573=>243,1574=>731,1575=>243,1576=>771,1577=>514,1578=>771,1579=>771,1580=>544,1581=>544,1582=>544,1583=>430,1584=>430,1585=>421,1586=>421,1587=>1194,1588=>1194,1589=>1291,1590=>1291,1591=>843,1592=>843,1593=>594,1594=>594,1600=>279,1601=>957,1602=>800,1603=>757,1604=>662,1605=>589,1606=>692,1607=>514,1608=>470,1609=>731,1610=>731,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1632=>480,1633=>480,1634=>480,1635=>480,1636=>480,1637=>480,1638=>480,1639=>480,1640=>480,1641=>480,1642=>547,1643=>278,1644=>278,1645=>438,1648=>0,1649=>243,1650=>243,1651=>243,1652=>0,1653=>380,1654=>470,1655=>548,1656=>772,1657=>771,1658=>771,1659=>771,1660=>771,1661=>771,1662=>771,1663=>771,1664=>771,1665=>544,1666=>544,1667=>544,1668=>544,1669=>544,1670=>544,1671=>544,1672=>430,1673=>430,1674=>430,1675=>430,1676=>430,1677=>430,1678=>430,1679=>430,1680=>430,1681=>421,1682=>421,1683=>421,1684=>421,1685=>421,1686=>419,1687=>421,1688=>421,1689=>421,1690=>1194,1691=>1194,1692=>1194,1693=>1291,1694=>1291,1695=>843,1696=>594,1697=>957,1698=>957,1699=>957,1700=>957,1701=>957,1702=>957,1703=>800,1704=>800,1705=>828,1706=>1058,1707=>828,1708=>757,1709=>757,1710=>757,1711=>828,1712=>828,1713=>828,1714=>828,1715=>828,1716=>828,1717=>662,1718=>662,1719=>662,1722=>692,1723=>692,1724=>692,1725=>692,1726=>706,1728=>514,1729=>509,1730=>509,1731=>509,1732=>470,1733=>470,1734=>470,1735=>470,1736=>470,1737=>470,1738=>470,1739=>470,1740=>731,1741=>841,1742=>731,1744=>731,1745=>731,1746=>550,1747=>550,1748=>279,1749=>514,1750=>726,1751=>558,1752=>321,1753=>318,1754=>342,1755=>373,1756=>716,1757=>688,1758=>852,1759=>288,1760=>288,1761=>388,1762=>350,1763=>716,1764=>146,1765=>282,1766=>339,1767=>339,1768=>415,1769=>514,1770=>220,1771=>220,1772=>220,1773=>350,1776=>480,1777=>480,1778=>480,1779=>480,1780=>480,1781=>480,1782=>480,1783=>480,1784=>480,1785=>480,2305=>0,2306=>0,2307=>294,2309=>693,2310=>910,2311=>533,2312=>533,2313=>590,2314=>713,2315=>920,2316=>677,2317=>611,2318=>611,2319=>611,2320=>611,2321=>910,2322=>910,2323=>910,2324=>910,2325=>667,2326=>732,2327=>593,2328=>639,2329=>624,2330=>688,2331=>713,2332=>688,2333=>712,2334=>697,2335=>502,2336=>533,2337=>583,2338=>523,2339=>693,2340=>585,2341=>638,2342=>533,2343=>640,2344=>585,2345=>585,2346=>565,2347=>699,2348=>592,2349=>689,2350=>633,2351=>600,2352=>486,2353=>486,2354=>680,2355=>730,2356=>730,2357=>592,2358=>684,2359=>608,2360=>646,2361=>546,2364=>0,2365=>373,2366=>319,2367=>319,2368=>319,2369=>0,2370=>0,2371=>0,2372=>0,2373=>0,2374=>0,2375=>0,2376=>0,2377=>319,2378=>319,2379=>319,2380=>319,2381=>0,2384=>884,2385=>0,2386=>0,2387=>0,2388=>0,2392=>667,2393=>732,2394=>593,2395=>688,2396=>583,2397=>523,2398=>699,2399=>600,2400=>920,2401=>677,2402=>0,2403=>0,2404=>331,2405=>513,2406=>639,2407=>639,2408=>639,2409=>639,2410=>639,2411=>639,2412=>639,2413=>639,2414=>639,2415=>639,2416=>362,2433=>0,2434=>430,2435=>430,2437=>786,2438=>1030,2439=>582,2440=>603,2441=>648,2442=>757,2443=>758,2444=>630,2447=>685,2448=>746,2451=>711,2452=>776,2453=>779,2454=>655,2455=>606,2456=>645,2457=>661,2458=>554,2459=>585,2460=>729,2461=>752,2462=>893,2463=>567,2464=>625,2465=>648,2466=>567,2467=>598,2468=>680,2469=>645,2470=>609,2471=>596,2472=>595,2474=>635,2475=>780,2476=>593,2477=>677,2478=>621,2479=>601,2480=>593,2482=>640,2486=>598,2487=>596,2488=>637,2489=>582,2492=>0,2494=>245,2495=>245,2496=>245,2497=>0,2498=>0,2499=>0,2500=>0,2503=>309,2504=>309,2507=>932,2508=>932,2509=>0,2519=>245,2524=>648,2525=>553,2527=>596,2528=>758,2529=>630,2530=>0,2531=>335,2534=>610,2535=>559,2536=>595,2537=>711,2538=>610,2539=>661,2540=>661,2541=>559,2542=>661,2543=>600,2544=>593,2545=>593,2546=>601,2547=>567,2548=>601,2549=>699,2550=>661,2551=>267,2552=>610,2553=>424,2554=>548,2562=>0,2565=>691,2566=>936,2567=>803,2568=>803,2569=>678,2570=>678,2575=>557,2576=>691,2579=>678,2580=>691,2581=>602,2582=>567,2583=>641,2584=>688,2585=>565,2586=>592,2587=>603,2588=>591,2589=>541,2590=>558,2591=>543,2592=>581,2593=>596,2594=>640,2595=>640,2596=>591,2597=>564,2598=>640,2599=>564,2600=>581,2602=>564,2603=>551,2604=>560,2605=>549,2606=>558,2607=>652,2608=>540,2610=>677,2611=>677,2613=>601,2614=>558,2616=>558,2617=>549,2620=>0,2622=>246,2623=>246,2624=>246,2625=>0,2626=>0,2631=>0,2632=>0,2635=>0,2636=>0,2637=>0,2649=>567,2650=>690,2651=>591,2652=>591,2654=>581,2662=>591,2663=>591,2664=>591,2665=>591,2666=>591,2667=>591,2668=>591,2669=>591,2670=>591,2671=>591,2672=>0,2673=>0,2674=>557,2675=>678,2676=>894,2689=>0,2690=>0,2691=>300,2693=>781,2694=>1044,2695=>589,2696=>589,2697=>560,2698=>758,2699=>806,2701=>781,2703=>781,2704=>781,2705=>1044,2707=>1044,2708=>1044,2709=>413,2710=>773,2711=>606,2712=>558,2713=>483,2714=>600,2715=>691,2716=>811,2717=>647,2718=>651,2719=>453,2720=>450,2721=>425,2722=>478,2723=>694,2724=>534,2725=>553,2726=>446,2727=>541,2728=>582,2730=>572,2731=>437,2732=>663,2733=>756,2734=>594,2735=>493,2736=>392,2738=>613,2739=>656,2741=>538,2742=>611,2743=>507,2744=>663,2745=>587,2748=>0,2749=>478,2750=>273,2751=>273,2752=>273,2753=>0,2754=>0,2755=>0,2756=>0,2757=>0,2759=>0,2760=>0,2761=>273,2763=>273,2764=>273,2765=>0,2768=>843,2784=>893,2790=>625,2791=>625,2792=>625,2793=>625,2794=>625,2795=>625,2796=>625,2797=>625,2798=>625,2799=>625,2817=>0,2818=>306,2819=>391,2821=>590,2822=>808,2823=>658,2824=>658,2825=>633,2826=>654,2827=>636,2828=>540,2831=>560,2832=>938,2835=>600,2836=>973,2837=>603,2838=>620,2839=>620,2840=>605,2841=>712,2842=>579,2843=>579,2844=>593,2845=>564,2846=>581,2847=>604,2848=>578,2849=>579,2850=>579,2851=>607,2852=>579,2853=>587,2854=>579,2855=>602,2856=>579,2858=>605,2859=>728,2860=>579,2861=>643,2862=>605,2863=>628,2864=>619,2866=>653,2867=>593,2870=>620,2871=>605,2872=>605,2873=>579,2876=>0,2877=>333,2878=>218,2879=>0,2880=>294,2881=>0,2882=>0,2883=>0,2887=>479,2888=>479,2891=>1026,2892=>1026,2893=>0,2902=>0,2903=>218,2908=>579,2909=>579,2911=>599,2912=>636,2913=>540,2918=>578,2919=>480,2920=>480,2921=>622,2922=>506,2923=>605,2924=>529,2925=>548,2926=>512,2927=>528,2928=>561,2946=>0,2947=>742,2949=>1002,2950=>1118,2951=>994,2952=>660,2953=>1012,2954=>1231,2958=>726,2959=>731,2960=>870,2962=>763,2963=>763,2964=>1636,2965=>667,2969=>830,2970=>584,2972=>876,2974=>986,2975=>802,2979=>1295,2980=>656,2984=>630,2985=>1012,2986=>694,2990=>727,2991=>790,2992=>545,2993=>718,2994=>821,2995=>871,2996=>724,2997=>873,2999=>1087,3000=>1098,3001=>1274,3006=>547,3007=>172,3008=>93,3009=>519,3010=>814,3014=>748,3015=>681,3016=>956,3018=>1666,3019=>1666,3020=>1994,3021=>0,3031=>871,3047=>667,3048=>1012,3049=>751,3050=>740,3051=>924,3052=>884,3053=>726,3054=>1002,3055=>825,3056=>717,3057=>719,3058=>774,3073=>365,3074=>601,3075=>346,3077=>720,3078=>786,3079=>567,3080=>1159,3081=>690,3082=>1047,3083=>1299,3084=>913,3086=>625,3087=>625,3088=>712,3090=>655,3091=>655,3092=>862,3093=>515,3094=>680,3095=>526,3096=>943,3097=>655,3098=>684,3099=>684,3100=>670,3101=>1205,3102=>732,3103=>888,3104=>597,3105=>709,3106=>709,3107=>809,3108=>715,3109=>702,3110=>702,3111=>702,3112=>607,3114=>623,3115=>623,3116=>681,3117=>681,3118=>932,3119=>1203,3120=>597,3121=>893,3122=>631,3123=>608,3125=>620,3126=>541,3127=>667,3128=>640,3129=>911,3134=>644,3135=>298,3136=>298,3137=>361,3138=>682,3139=>342,3140=>704,3142=>624,3143=>624,3144=>900,3146=>849,3147=>849,3148=>976,3149=>669,3157=>298,3158=>119,3168=>1620,3169=>1281,3174=>840,3175=>840,3176=>840,3177=>840,3178=>840,3179=>840,3180=>840,3181=>840,3182=>840,3183=>840,3202=>440,3203=>251,3205=>654,3206=>654,3207=>631,3208=>891,3209=>957,3210=>1293,3211=>1044,3212=>744,3214=>650,3215=>650,3216=>659,3218=>667,3219=>667,3220=>667,3221=>462,3222=>749,3223=>543,3224=>779,3225=>674,3226=>682,3227=>660,3228=>667,3229=>1171,3230=>926,3231=>671,3232=>557,3233=>669,3234=>669,3235=>728,3236=>544,3237=>672,3238=>672,3239=>672,3240=>560,3242=>668,3243=>668,3244=>681,3245=>687,3246=>972,3247=>1101,3248=>556,3249=>677,3250=>661,3251=>545,3253=>666,3254=>553,3255=>670,3256=>549,3257=>716,3262=>425,3263=>341,3264=>680,3265=>354,3266=>714,3267=>386,3268=>638,3270=>307,3271=>670,3272=>462,3274=>908,3275=>1251,3276=>434,3277=>336,3285=>344,3286=>404,3294=>673,3296=>1695,3297=>978,3302=>549,3303=>549,3304=>549,3305=>549,3306=>549,3307=>549,3308=>549,3309=>549,3310=>549,3311=>549,3330=>368,3331=>305,3333=>1201,3334=>1351,3335=>905,3336=>1459,3337=>635,3338=>1198,3339=>861,3340=>957,3342=>1211,3343=>1202,3344=>1839,3346=>642,3347=>1114,3348=>1195,3349=>861,3350=>982,3351=>874,3352=>1354,3353=>957,3354=>1016,3355=>1266,3356=>712,3357=>1454,3358=>1215,3359=>563,3360=>565,3361=>1192,3362=>1244,3363=>1268,3364=>878,3365=>966,3366=>545,3367=>879,3368=>879,3370=>1031,3371=>1175,3372=>1334,3373=>546,3374=>643,3375=>949,3376=>642,3377=>555,3378=>945,3379=>631,3380=>553,3381=>959,3382=>936,3383=>1122,3384=>1190,3385=>1112,3390=>475,3391=>418,3392=>442,3393=>340,3394=>340,3395=>473,3398=>640,3399=>530,3400=>1279,3402=>1368,3403=>1258,3404=>1447,3405=>0,3415=>553,3424=>861,3425=>1100,3430=>1095,3431=>929,3432=>854,3433=>1181,3434=>658,3435=>972,3436=>1210,3437=>650,3438=>959,3439=>896,3585=>595,3586=>648,3587=>665,3588=>608,3589=>608,3590=>665,3591=>471,3592=>556,3593=>652,3594=>664,3595=>681,3596=>816,3597=>849,3598=>620,3599=>620,3600=>541,3601=>785,3602=>826,3603=>887,3604=>598,3605=>605,3606=>595,3607=>650,3608=>541,3609=>652,3610=>608,3611=>608,3612=>630,3613=>630,3614=>695,3615=>695,3616=>620,3617=>581,3618=>588,3619=>501,3620=>595,3621=>569,3622=>620,3623=>519,3624=>592,3625=>659,3626=>574,3627=>654,3628=>695,3629=>566,3630=>574,3631=>517,3632=>452,3633=>0,3634=>496,3635=>496,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0,3647=>687,3648=>302,3649=>571,3650=>478,3651=>515,3652=>515,3653=>496,3654=>506,3655=>0,3656=>0,3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0,3663=>555,3664=>598,3665=>640,3666=>688,3667=>690,3668=>657,3669=>657,3670=>635,3671=>839,3672=>693,3673=>769,3674=>673,3675=>994,3713=>775,3714=>707,3716=>724,3719=>524,3720=>690,3722=>678,3725=>711,3732=>719,3733=>834,3734=>776,3735=>916,3737=>744,3738=>740,3739=>740,3740=>834,3741=>834,3742=>854,3743=>854,3745=>775,3746=>724,3747=>697,3749=>700,3751=>700,3754=>708,3755=>916,3757=>700,3758=>697,3759=>658,3760=>432,3761=>534,3762=>476,3763=>476,3764=>778,3765=>778,3766=>778,3767=>778,3768=>778,3769=>778,3771=>778,3772=>778,3773=>670,3776=>420,3777=>806,3778=>430,3779=>446,3780=>346,3782=>571,3784=>778,3785=>778,3786=>778,3787=>778,3788=>778,3789=>778,3792=>721,3793=>719,3794=>601,3795=>711,3796=>686,3797=>686,3798=>834,3799=>756,3800=>724,3801=>906,3804=>1272,3805=>1272,3840=>600,3841=>600,3842=>600,3843=>600,3844=>600,3845=>600,3846=>600,3847=>600,3848=>600,3849=>600,3850=>600,3851=>600,3852=>600,3853=>600,3854=>600,3855=>600,3856=>600,3857=>600,3858=>600,3859=>600,3860=>600,3861=>600,3862=>600,3863=>600,3864=>600,3865=>600,3866=>600,3867=>600,3868=>600,3869=>600,3870=>600,3871=>600,3872=>600,3873=>600,3874=>600,3875=>600,3876=>600,3877=>600,3878=>600,3879=>600,3880=>600,3881=>600,3882=>600,3883=>600,3884=>600,3885=>600,3886=>600,3887=>600,3888=>600,3889=>600,3890=>600,3891=>600,3892=>600,3893=>600,3894=>600,3895=>600,3896=>600,3897=>600,3898=>600,3899=>600,3900=>600,3901=>600,3902=>600,3903=>600,3904=>600,3905=>600,3906=>600,3907=>600,3908=>600,3909=>600,3910=>600,3911=>600,3913=>600,3914=>600,3915=>600,3916=>600,3917=>600,3918=>600,3919=>600,3920=>600,3921=>600,3922=>600,3923=>600,3924=>600,3925=>600,3926=>600,3927=>600,3928=>600,3929=>600,3930=>600,3931=>600,3932=>600,3933=>600,3934=>600,3935=>600,3936=>600,3937=>600,3938=>600,3939=>600,3940=>600,3941=>600,3942=>600,3943=>600,3944=>600,3945=>600,3953=>600,3954=>600,3955=>600,3956=>600,3957=>600,3958=>600,3959=>600,3960=>600,3961=>600,3962=>600,3963=>600,3964=>600,3965=>600,3966=>600,3967=>600,3968=>600,3969=>600,3970=>600,3971=>600,3972=>600,3973=>600,3974=>600,3975=>600,3976=>600,3977=>600,3978=>600,3979=>600,3984=>600,3985=>600,3986=>600,3987=>600,3988=>600,3989=>600,3991=>600,3993=>600,3994=>600,3995=>600,3996=>600,3997=>600,3998=>600,3999=>600,4000=>600,4001=>600,4002=>600,4003=>600,4004=>600,4005=>600,4006=>600,4007=>600,4008=>600,4009=>600,4010=>600,4011=>600,4012=>600,4013=>600,4017=>600,4018=>600,4019=>600,4020=>600,4021=>600,4022=>600,4023=>600,4025=>600,4256=>662,4257=>677,4258=>708,4259=>696,4260=>609,4261=>790,4262=>664,4263=>785,4264=>560,4265=>634,4266=>782,4267=>701,4268=>629,4269=>682,4270=>705,4271=>692,4272=>734,4273=>615,4274=>592,4275=>680,4276=>679,4277=>705,4278=>643,4279=>623,4280=>623,4281=>629,4282=>633,4283=>770,4284=>592,4285=>662,4286=>629,4287=>672,4288=>735,4289=>576,4290=>606,4291=>605,4292=>676,4293=>792,4304=>435,4305=>556,4306=>565,4307=>872,4308=>506,4309=>544,4310=>723,4311=>868,4312=>530,4313=>532,4314=>955,4315=>552,4316=>565,4317=>712,4318=>547,4319=>574,4320=>685,4321=>554,4322=>806,4323=>810,4324=>777,4325=>502,4326=>686,4327=>512,4328=>552,4329=>496,4330=>568,4331=>552,4332=>592,4333=>565,4334=>552,4335=>741,4336=>549,4337=>659,4338=>559,4339=>524,4340=>482,4341=>565,4342=>822,4347=>506,4352=>1000,4353=>1000,4354=>1000,4355=>1000,4356=>1000,4357=>1000,4358=>1000,4359=>1000,4360=>1000,4361=>1000,4362=>1000,4363=>1000,4364=>1000,4365=>1000,4366=>1000,4367=>1000,4368=>1000,4369=>1000,4370=>1000,4371=>1000,4372=>1000,4373=>1000,4374=>1000,4375=>1000,4376=>1000,4377=>1000,4378=>1000,4379=>1000,4380=>1000,4381=>1000,4382=>1000,4383=>1000,4384=>1000,4385=>1000,4386=>1000,4387=>1000,4388=>1000,4389=>1000,4390=>1000,4391=>1000,4392=>1000,4393=>1000,4394=>1000,4395=>1000,4396=>1000,4397=>1000,4398=>1000,4399=>1000,4400=>1000,4401=>1000,4402=>1000,4403=>1000,4404=>1000,4405=>1000,4406=>1000,4407=>1000,4408=>1000,4409=>1000,4410=>1000,4411=>1000,4412=>1000,4413=>1000,4414=>1000,4415=>1000,4416=>1000,4417=>1000,4418=>1000,4419=>1000,4420=>1000,4421=>1000,4422=>1000,4423=>1000,4424=>1000,4425=>1000,4426=>1000,4427=>1000,4428=>1000,4429=>1000,4430=>1000,4431=>1000,4432=>1000,4433=>1000,4434=>1000,4435=>1000,4436=>1000,4437=>1000,4438=>1000,4439=>1000,4440=>1000,4441=>1000,4447=>1000,4448=>1000,4449=>1000,4450=>1000,4451=>1000,4452=>1000,4453=>1000,4454=>1000,4455=>1000,4456=>1000,4457=>1000,4458=>1000,4459=>1000,4460=>1000,4461=>1000,4462=>1000,4463=>1000,4464=>1000,4465=>1000,4466=>1000,4467=>1000,4468=>1000,4469=>1000,4470=>1000,4471=>1000,4472=>1000,4473=>1000,4474=>1000,4475=>1000,4476=>1000,4477=>1000,4478=>1000,4479=>1000,4480=>1000,4481=>1000,4482=>1000,4483=>1000,4484=>1000,4485=>1000,4486=>1000,4487=>1000,4488=>1000,4489=>1000,4490=>1000,4491=>1000,4492=>1000,4493=>1000,4494=>1000,4495=>1000,4496=>1000,4497=>1000,4498=>1000,4499=>1000,4500=>1000,4501=>1000,4502=>1000,4503=>1000,4504=>1000,4505=>1000,4506=>1000,4507=>1000,4508=>1000,4509=>1000,4510=>1000,4511=>1000,4512=>1000,4513=>1000,4514=>1000,4520=>1000,4521=>1000,4522=>1000,4523=>1000,4524=>1000,4525=>1000,4526=>1000,4527=>1000,4528=>1000,4529=>1000,4530=>1000,4531=>1000,4532=>1000,4533=>1000,4534=>1000,4535=>1000,4536=>1000,4537=>1000,4538=>1000,4539=>1000,4540=>1000,4541=>1000,4542=>1000,4543=>1000,4544=>1000,4545=>1000,4546=>1000,4547=>1000,4548=>1000,4549=>1000,4550=>1000,4551=>1000,4552=>1000,4553=>1000,4554=>1000,4555=>1000,4556=>1000,4557=>1000,4558=>1000,4559=>1000,4560=>1000,4561=>1000,4562=>1000,4563=>1000,4564=>1000,4565=>1000,4566=>1000,4567=>1000,4568=>1000,4569=>1000,4570=>1000,4571=>1000,4572=>1000,4573=>1000,4574=>1000,4575=>1000,4576=>1000,4577=>1000,4578=>1000,4579=>1000,4580=>1000,4581=>1000,4582=>1000,4583=>1000,4584=>1000,4585=>1000,4586=>1000,4587=>1000,4588=>1000,4589=>1000,4590=>1000,4591=>1000,4592=>1000,4593=>1000,4594=>1000,4595=>1000,4596=>1000,4597=>1000,4598=>1000,4599=>1000,4600=>1000,4601=>1000,7680=>667,7681=>556,7682=>667,7683=>556,7684=>667,7685=>556,7686=>667,7687=>556,7688=>722,7689=>500,7690=>722,7691=>556,7692=>722,7693=>556,7694=>722,7695=>556,7696=>722,7697=>556,7698=>722,7699=>556,7700=>667,7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667,7707=>556,7708=>667,7709=>556,7710=>611,7711=>278,7712=>778,7713=>556,7714=>722,7715=>556,7716=>722,7717=>556,7718=>722,7719=>556,7720=>722,7721=>556,7722=>722,7723=>556,7724=>278,7725=>222,7726=>278,7727=>278,7728=>667,7729=>500,7730=>667,7731=>500,7732=>667,7733=>500,7734=>556,7735=>222,7736=>556,7737=>222,7738=>556,7739=>222,7740=>556,7741=>222,7742=>833,7743=>833,7744=>833,7745=>833,7746=>833,7747=>833,7748=>722,7749=>556,7750=>722,7751=>556,7752=>722,7753=>556,7754=>722,7755=>556,7756=>778,7757=>556,7758=>778,7759=>556,7760=>778,7761=>556,7762=>778,7763=>556,7764=>667,7765=>556,7766=>667,7767=>556,7768=>722,7769=>333,7770=>722,7771=>333,7772=>722,7773=>333,7774=>722,7775=>333,7776=>667,7777=>500,7778=>667,7779=>500,7780=>667,7781=>500,7782=>667,7783=>500,7784=>667,7785=>500,7786=>611,7787=>278,7788=>611,7789=>278,7790=>611,7791=>278,7792=>611,7793=>278,7794=>722,7795=>556,7796=>722,7797=>556,7798=>722,7799=>556,7800=>722,7801=>556,7802=>722,7803=>556,7804=>667,7805=>500,7806=>667,7807=>500,7808=>944,7809=>722,7810=>944,7811=>722,7812=>944,7813=>722,7814=>944,7815=>722,7816=>944,7817=>722,7818=>667,7819=>500,7820=>667,7821=>500,7822=>667,7823=>500,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500,7830=>556,7831=>278,7832=>722,7833=>500,7834=>556,7835=>278,7840=>667,7841=>556,7842=>667,7843=>556,7844=>667,7845=>556,7846=>667,7847=>556,7848=>667,7849=>556,7850=>667,7851=>556,7852=>667,7853=>556,7854=>667,7855=>556,7856=>667,7857=>556,7858=>667,7859=>556,7860=>667,7861=>556,7862=>667,7863=>556,7864=>667,7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667,7871=>556,7872=>667,7873=>556,7874=>667,7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278,7881=>278,7882=>278,7883=>222,7884=>778,7885=>556,7886=>778,7887=>556,7888=>778,7889=>556,7890=>778,7891=>556,7892=>778,7893=>556,7894=>778,7895=>556,7896=>778,7897=>556,7898=>776,7899=>556,7900=>776,7901=>556,7902=>776,7903=>556,7904=>776,7905=>556,7906=>776,7907=>556,7908=>722,7909=>556,7910=>722,7911=>556,7912=>776,7913=>620,7914=>776,7915=>620,7916=>776,7917=>620,7918=>776,7919=>620,7920=>776,7921=>620,7922=>667,7923=>500,7924=>667,7925=>500,7926=>667,7927=>500,7928=>667,7929=>500,7936=>576,7937=>576,7938=>576,7939=>576,7940=>576,7941=>576,7942=>576,7943=>576,7944=>667,7945=>667,7946=>680,7947=>680,7948=>680,7949=>680,7950=>718,7951=>718,7952=>434,7953=>434,7954=>434,7955=>434,7956=>434,7957=>434,7960=>692,7961=>692,7962=>823,7963=>823,7964=>823,7965=>823,7968=>556,7969=>556,7970=>556,7971=>556,7972=>556,7973=>556,7974=>556,7975=>556,7976=>747,7977=>747,7978=>878,7979=>878,7980=>878,7981=>878,7982=>923,7983=>923,7984=>222,7985=>222,7986=>222,7987=>222,7988=>222,7989=>222,7990=>222,7991=>222,7992=>303,7993=>303,7994=>434,7995=>434,7996=>434,7997=>434,7998=>479,7999=>479,8000=>556,8001=>556,8002=>556,8003=>556,8004=>556,8005=>556,8008=>778,8009=>778,8010=>894,8011=>894,8012=>894,8013=>894,8016=>551,8017=>551,8018=>551,8019=>551,8020=>551,8021=>551,8022=>551,8023=>551,8025=>777,8027=>893,8029=>885,8031=>940,8032=>766,8033=>766,8034=>766,8035=>766,8036=>766,8037=>766,8038=>766,8039=>766,8040=>758,8041=>758,8042=>874,8043=>874,8044=>868,8045=>867,8046=>911,8047=>911,8048=>576,8049=>576,8050=>434,8051=>434,8052=>556,8053=>556,8054=>222,8055=>222,8056=>556,8057=>556,8058=>551,8059=>551,8060=>766,8061=>766,8064=>576,8065=>576,8066=>576,8067=>576,8068=>576,8069=>576,8070=>576,8071=>576,8072=>667,8073=>667,8074=>680,8075=>680,8076=>680,8077=>680,8078=>718,8079=>718,8080=>556,8081=>556,8082=>556,8083=>556,8084=>556,8085=>556,8086=>556,8087=>556,8088=>747,8089=>747,8090=>878,8091=>878,8092=>878,8093=>878,8094=>923,8095=>923,8096=>766,8097=>766,8098=>766,8099=>766,8100=>766,8101=>766,8102=>766,8103=>766,8104=>758,8105=>758,8106=>874,8107=>874,8108=>868,8109=>867,8110=>911,8111=>911,8112=>576,8113=>576,8114=>576,8115=>576,8116=>576,8118=>576,8119=>576,8120=>667,8121=>667,8122=>667,8123=>667,8124=>667,8125=>278,8126=>278,8127=>278,8128=>278,8129=>278,8130=>556,8131=>556,8132=>556,8134=>556,8135=>556,8136=>693,8137=>704,8138=>748,8139=>759,8140=>722,8141=>278,8142=>278,8143=>278,8144=>222,8145=>222,8146=>222,8147=>222,8150=>222,8151=>222,8152=>278,8153=>278,8154=>304,8155=>304,8157=>278,8158=>278,8159=>278,8160=>551,8161=>551,8162=>551,8163=>551,8164=>571,8165=>571,8166=>551,8167=>551,8168=>667,8169=>667,8170=>742,8171=>746,8172=>693,8173=>278,8174=>278,8175=>278,8178=>766,8179=>766,8180=>766,8182=>766,8183=>766,8184=>778,8185=>778,8186=>758,8187=>758,8188=>758,8189=>278,8190=>278,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>100,8202=>50,8203=>0,8204=>0,8205=>0,8208=>333,8209=>333,8210=>556,8211=>500,8212=>1000,8213=>564,8214=>428,8215=>500,8216=>222,8217=>222,8218=>222,8219=>222,8220=>333,8221=>333,8222=>333,8223=>333,8224=>556,8225=>556,8226=>350,8227=>350,8228=>278,8229=>556,8230=>1000,8231=>278,8232=>0,8233=>0,8240=>1000,8241=>1330,8242=>222,8243=>372,8244=>522,8245=>206,8246=>356,8247=>506,8248=>312,8249=>333,8250=>333,8251=>1000,8252=>471,8253=>556,8254=>500,8255=>945,8256=>945,8257=>312,8258=>820,8259=>333,8260=>167,8261=>278,8262=>278,8304=>333,8308=>333,8309=>333,8310=>333,8311=>333,8312=>333,8313=>333,8314=>333,8315=>333,8316=>333,8317=>210,8318=>210,8319=>333,8320=>333,8321=>333,8322=>333,8323=>333,8324=>333,8325=>333,8326=>333,8327=>333,8328=>333,8329=>333,8330=>333,8331=>333,8332=>333,8333=>210,8334=>210,8352=>556,8353=>556,8354=>556,8355=>556,8356=>556,8357=>833,8358=>556,8359=>556,8360=>1024,8361=>940,8362=>784,8363=>556,8364=>556,8400=>600,8401=>600,8402=>600,8403=>600,8404=>700,8405=>700,8406=>600,8407=>600,8408=>600,8409=>600,8410=>600,8411=>600,8412=>600,8413=>900,8414=>900,8415=>900,8416=>900,8417=>700,8448=>889,8449=>889,8450=>667,8451=>1022,8452=>611,8453=>889,8454=>889,8455=>501,8456=>667,8457=>921,8458=>510,8459=>906,8460=>988,8461=>722,8462=>500,8463=>500,8464=>688,8465=>553,8466=>708,8467=>291,8468=>778,8469=>722,8470=>1073,8471=>737,8472=>740,8473=>556,8474=>722,8475=>927,8476=>795,8477=>667,8478=>667,8479=>667,8480=>1000,8481=>1174,8482=>1000,8483=>722,8484=>611,8485=>542,8486=>768,8487=>768,8488=>698,8489=>321,8490=>667,8491=>667,8492=>927,8493=>646,8494=>556,8495=>385,8496=>615,8497=>688,8498=>611,8499=>1115,8500=>406,8501=>688,8502=>688,8503=>344,8504=>688,8531=>834,8532=>834,8533=>834,8534=>834,8535=>834,8536=>834,8537=>834,8538=>834,8539=>834,8540=>834,8541=>834,8542=>834,8543=>834,8544=>278,8545=>555,8546=>832,8547=>933,8548=>667,8549=>934,8550=>1031,8551=>1268,8552=>944,8553=>667,8554=>944,8555=>1035,8556=>556,8557=>722,8558=>722,8559=>833,8560=>222,8561=>444,8562=>666,8563=>700,8564=>500,8565=>700,8566=>922,8567=>1144,8568=>712,8569=>500,8570=>712,8571=>934,8572=>222,8573=>500,8574=>556,8575=>833,8576=>983,8577=>722,8578=>983,8592=>713,8593=>713,8594=>713,8595=>713,8596=>713,8597=>713,8598=>713,8599=>713,8600=>713,8601=>713,8602=>713,8603=>713,8604=>713,8605=>713,8606=>713,8607=>713,8608=>713,8609=>713,8610=>713,8611=>713,8612=>713,8613=>713,8614=>713,8615=>713,8616=>713,8617=>713,8618=>713,8619=>713,8620=>713,8621=>813,8622=>813,8623=>713,8624=>713,8625=>713,8626=>713,8627=>713,8628=>713,8629=>713,8630=>713,8631=>713,8632=>713,8633=>713,8634=>800,8635=>800,8636=>713,8637=>713,8638=>713,8639=>713,8640=>713,8641=>713,8642=>713,8643=>713,8644=>713,8645=>713,8646=>713,8647=>713,8648=>713,8649=>713,8650=>713,8651=>713,8652=>713,8653=>713,8654=>950,8655=>713,8656=>713,8657=>713,8658=>713,8659=>713,8660=>863,8661=>713,8662=>713,8663=>713,8664=>713,8665=>713,8666=>713,8667=>713,8668=>813,8669=>813,8670=>713,8671=>713,8672=>713,8673=>713,8674=>713,8675=>713,8676=>713,8677=>713,8678=>713,8679=>713,8680=>713,8681=>713,8682=>713,8704=>600,8705=>600,8706=>494,8707=>600,8708=>600,8709=>800,8710=>612,8711=>612,8712=>549,8713=>549,8714=>549,8715=>549,8716=>549,8717=>549,8718=>549,8719=>823,8720=>823,8721=>713,8722=>584,8723=>584,8724=>584,8725=>167,8726=>278,8727=>389,8728=>400,8729=>400,8730=>600,8731=>600,8732=>600,8733=>549,8734=>549,8735=>584,8736=>584,8737=>584,8738=>584,8739=>260,8740=>444,8741=>418,8742=>602,8743=>561,8744=>561,8745=>561,8746=>561,8747=>506,8748=>806,8749=>1106,8750=>506,8751=>806,8752=>1106,8753=>506,8754=>506,8755=>506,8756=>561,8757=>561,8758=>422,8759=>561,8760=>584,8761=>584,8762=>584,8763=>584,8764=>584,8765=>584,8766=>584,8767=>584,8768=>422,8769=>584,8770=>584,8771=>584,8772=>584,8773=>584,8774=>584,8775=>584,8776=>584,8777=>584,8778=>584,8779=>584,8780=>584,8781=>584,8782=>584,8783=>584,8784=>584,8785=>584,8786=>584,8787=>584,8788=>737,8789=>737,8790=>584,8791=>584,8792=>584,8793=>584,8794=>584,8795=>584,8796=>584,8797=>584,8798=>584,8799=>584,8800=>584,8801=>584,8802=>584,8803=>584,8804=>584,8805=>584,8806=>584,8807=>584,8808=>584,8809=>584,8810=>969,8811=>969,8812=>584,8813=>584,8814=>584,8815=>584,8816=>584,8817=>584,8818=>584,8819=>584,8820=>584,8821=>584,8822=>584,8823=>584,8824=>584,8825=>584,8826=>584,8827=>584,8828=>584,8829=>584,8830=>584,8831=>584,8832=>584,8833=>584,8834=>678,8835=>678,8836=>678,8837=>678,8838=>678,8839=>678,8840=>678,8841=>678,8842=>678,8843=>678,8844=>561,8845=>561,8846=>561,8847=>678,8848=>678,8849=>673,8850=>673,8851=>561,8852=>561,8853=>800,8854=>800,8855=>800,8856=>800,8857=>800,8858=>800,8859=>800,8860=>800,8861=>800,8862=>800,8863=>800,8864=>800,8865=>800,8866=>549,8867=>549,8868=>549,8869=>549,8870=>399,8871=>399,8872=>549,8873=>549,8874=>549,8875=>672,8876=>549,8877=>549,8878=>549,8879=>672,8880=>549,8881=>549,8882=>549,8883=>549,8884=>549,8885=>549,8886=>713,8887=>713,8888=>713,8889=>549,8890=>549,8891=>584,8892=>584,8893=>584,8894=>584,8895=>584,8896=>561,8897=>561,8898=>561,8899=>561,8900=>549,8901=>250,8902=>549,8903=>649,8904=>630,8905=>630,8906=>630,8907=>630,8908=>630,8909=>584,8910=>561,8911=>561,8912=>668,8913=>668,8914=>668,8915=>668,8916=>561,8917=>602,8918=>584,8919=>584,8920=>1354,8921=>1354,8922=>584,8923=>584,8924=>584,8925=>584,8926=>584,8927=>584,8928=>584,8929=>584,8930=>673,8931=>673,8932=>673,8933=>673,8934=>584,8935=>584,8936=>584,8937=>584,8938=>584,8939=>584,8940=>584,8941=>584,8942=>278,8943=>1000,8944=>1000,8945=>1000,8960=>549,8962=>549,8963=>549,8964=>549,8965=>549,8966=>549,8967=>549,8968=>449,8969=>449,8970=>449,8971=>449,8972=>549,8973=>549,8974=>549,8975=>549,8976=>549,8977=>549,8978=>800,8979=>800,8980=>549,8981=>549,8982=>549,8983=>650,8984=>780,8985=>549,8986=>549,8987=>549,8988=>549,8989=>549,8990=>549,8991=>549,8992=>506,8993=>506,8994=>713,8995=>713,8996=>1000,8997=>1000,8998=>1000,8999=>1000,9000=>1000,9001=>329,9002=>329,9003=>1000,9004=>549,9005=>549,9006=>549,9007=>549,9008=>549,9009=>549,9010=>549,9011=>549,9012=>549,9013=>549,9014=>600,9015=>600,9016=>600,9017=>600,9018=>600,9019=>600,9020=>600,9021=>600,9022=>600,9023=>600,9024=>600,9025=>600,9026=>600,9027=>600,9028=>600,9029=>600,9030=>600,9031=>600,9032=>600,9033=>600,9034=>600,9035=>600,9036=>600,9037=>600,9038=>600,9039=>600,9040=>600,9041=>600,9042=>600,9043=>600,9044=>600,9045=>600,9046=>600,9047=>600,9048=>600,9049=>600,9050=>600,9051=>600,9052=>600,9053=>600,9054=>600,9055=>600,9056=>600,9057=>600,9058=>600,9059=>600,9060=>600,9061=>600,9062=>600,9063=>600,9064=>600,9065=>600,9066=>600,9067=>600,9068=>600,9069=>600,9070=>600,9071=>600,9072=>600,9073=>600,9074=>600,9075=>600,9076=>600,9077=>600,9078=>600,9079=>600,9080=>600,9081=>600,9082=>600,9109=>600,9216=>600,9217=>600,9218=>600,9219=>600,9220=>600,9221=>600,9222=>600,9223=>600,9224=>600,9225=>600,9226=>600,9227=>600,9228=>600,9229=>600,9230=>600,9231=>600,9232=>600,9233=>600,9234=>600,9235=>600,9236=>600,9237=>600,9238=>600,9239=>600,9240=>600,9241=>600,9242=>600,9243=>600,9244=>600,9245=>600,9246=>600,9247=>600,9248=>600,9249=>600,9250=>600,9251=>600,9252=>600,9280=>604,9281=>604,9282=>604,9283=>604,9284=>604,9285=>604,9286=>750,9287=>750,9288=>750,9289=>750,9290=>604,9312=>1000,9313=>1000,9314=>1000,9315=>1000,9316=>1000,9317=>1000,9318=>1000,9319=>1000,9320=>1000,9321=>1000,9322=>1000,9323=>1000,9324=>1000,9325=>1000,9326=>1000,9327=>1000,9328=>1000,9329=>1000,9330=>1000,9331=>1000,9332=>1000,9333=>1000,9334=>1000,9335=>1000,9336=>1000,9337=>1000,9338=>1000,9339=>1000,9340=>1000,9341=>1000,9342=>1000,9343=>1000,9344=>1000,9345=>1000,9346=>1000,9347=>1000,9348=>1000,9349=>1000,9350=>1000,9351=>1000,9352=>1000,9353=>1000,9354=>1000,9355=>1000,9356=>1000,9357=>1000,9358=>1000,9359=>1000,9360=>1000,9361=>1000,9362=>1000,9363=>1000,9364=>1000,9365=>1000,9366=>1000,9367=>1000,9368=>1000,9369=>1000,9370=>1000,9371=>1000,9372=>1000,9373=>1000,9374=>1000,9375=>1000,9376=>1000,9377=>1000,9378=>1000,9379=>1000,9380=>1000,9381=>1000,9382=>1000,9383=>1000,9384=>1000,9385=>1000,9386=>1000,9387=>1000,9388=>1000,9389=>1000,9390=>1000,9391=>1000,9392=>1000,9393=>1000,9394=>1000,9395=>1000,9396=>1000,9397=>1000,9398=>1000,9399=>1000,9400=>1000,9401=>1000,9402=>1000,9403=>1000,9404=>1000,9405=>1000,9406=>1000,9407=>1000,9408=>1000,9409=>1000,9410=>1000,9411=>1000,9412=>1000,9413=>1000,9414=>1000,9415=>1000,9416=>1000,9417=>1000,9418=>1000,9419=>1000,9420=>1000,9421=>1000,9422=>1000,9423=>1000,9424=>1000,9425=>1000,9426=>1000,9427=>1000,9428=>1000,9429=>1000,9430=>1000,9431=>1000,9432=>1000,9433=>1000,9434=>1000,9435=>1000,9436=>1000,9437=>1000,9438=>1000,9439=>1000,9440=>1000,9441=>1000,9442=>1000,9443=>1000,9444=>1000,9445=>1000,9446=>1000,9447=>1000,9448=>1000,9449=>1000,9450=>1000,9472=>600,9473=>600,9474=>600,9475=>600,9476=>600,9477=>600,9478=>600,9479=>600,9480=>600,9481=>600,9482=>600,9483=>600,9484=>600,9485=>600,9486=>600,9487=>600,9488=>600,9489=>600,9490=>600,9491=>600,9492=>600,9493=>600,9494=>600,9495=>600,9496=>600,9497=>600,9498=>600,9499=>600,9500=>600,9501=>600,9502=>600,9503=>600,9504=>600,9505=>600,9506=>600,9507=>600,9508=>600,9509=>600,9510=>600,9511=>600,9512=>600,9513=>600,9514=>600,9515=>600,9516=>600,9517=>600,9518=>600,9519=>600,9520=>600,9521=>600,9522=>600,9523=>600,9524=>600,9525=>600,9526=>600,9527=>600,9528=>600,9529=>600,9530=>600,9531=>600,9532=>600,9533=>600,9534=>600,9535=>600,9536=>600,9537=>600,9538=>600,9539=>600,9540=>600,9541=>600,9542=>600,9543=>600,9544=>600,9545=>600,9546=>600,9547=>600,9548=>600,9549=>600,9550=>600,9551=>600,9552=>600,9553=>600,9554=>600,9555=>600,9556=>600,9557=>600,9558=>600,9559=>600,9560=>600,9561=>600,9562=>600,9563=>600,9564=>600,9565=>600,9566=>600,9567=>600,9568=>600,9569=>600,9570=>600,9571=>600,9572=>600,9573=>600,9574=>600,9575=>600,9576=>600,9577=>600,9578=>600,9579=>600,9580=>600,9581=>600,9582=>600,9583=>600,9584=>600,9585=>600,9586=>600,9587=>600,9588=>600,9589=>600,9590=>600,9591=>600,9592=>600,9593=>600,9594=>600,9595=>600,9596=>600,9597=>600,9598=>600,9599=>600,9600=>600,9601=>600,9602=>600,9603=>600,9604=>600,9605=>600,9606=>600,9607=>600,9608=>600,9609=>600,9610=>600,9611=>600,9612=>600,9613=>600,9614=>600,9615=>600,9616=>600,9617=>600,9618=>600,9619=>600,9620=>600,9621=>600,9632=>600,9633=>600,9634=>600,9635=>600,9636=>600,9637=>600,9638=>600,9639=>600,9640=>600,9641=>600,9642=>600,9643=>600,9644=>600,9645=>600,9646=>600,9647=>600,9648=>600,9649=>600,9650=>600,9651=>600,9652=>600,9653=>600,9654=>600,9655=>600,9656=>600,9657=>600,9658=>600,9659=>600,9660=>600,9661=>600,9662=>600,9663=>600,9664=>600,9665=>600,9666=>600,9667=>600,9668=>600,9669=>600,9670=>600,9671=>600,9672=>600,9673=>600,9674=>600,9675=>600,9676=>600,9677=>600,9678=>600,9679=>600,9680=>600,9681=>600,9682=>600,9683=>600,9684=>600,9685=>600,9686=>600,9687=>600,9688=>600,9689=>600,9690=>600,9691=>600,9692=>600,9693=>600,9694=>600,9695=>600,9696=>600,9697=>600,9698=>600,9699=>600,9700=>600,9701=>600,9702=>600,9703=>600,9704=>600,9705=>600,9706=>600,9707=>600,9708=>600,9709=>600,9710=>600,9711=>600,9728=>750,9729=>1000,9730=>750,9731=>750,9732=>1000,9733=>816,9734=>823,9735=>500,9736=>500,9737=>800,9738=>800,9739=>800,9740=>800,9741=>800,9742=>719,9743=>719,9744=>734,9745=>734,9746=>734,9747=>762,9754=>960,9755=>960,9756=>939,9757=>939,9758=>939,9759=>939,9760=>750,9761=>600,9762=>750,9763=>750,9764=>580,9765=>460,9766=>444,9767=>650,9768=>444,9769=>768,9770=>800,9771=>850,9772=>675,9773=>800,9774=>750,9775=>750,9776=>900,9777=>900,9778=>900,9779=>900,9780=>900,9781=>900,9782=>900,9783=>900,9784=>750,9785=>750,9786=>750,9787=>750,9788=>750,9789=>750,9790=>750,9791=>740,9792=>740,9793=>740,9794=>740,9795=>653,9796=>490,9797=>632,9798=>780,9799=>560,9800=>838,9801=>780,9802=>734,9803=>887,9804=>780,9805=>1080,9806=>896,9807=>1080,9808=>804,9809=>868,9810=>922,9811=>696,9812=>1000,9813=>1000,9814=>1000,9815=>1000,9816=>1000,9817=>1000,9818=>1000,9819=>1000,9820=>1000,9821=>1000,9822=>1000,9823=>1000,9824=>722,9825=>734,9826=>674,9827=>804,9828=>722,9829=>734,9830=>674,9831=>804,9832=>860,9833=>423,9834=>592,9835=>750,9836=>750,9837=>439,9838=>439,9839=>439,9985=>974,9986=>961,9987=>974,9988=>980,9990=>789,9991=>790,9992=>791,9993=>690,9996=>549,9997=>855,9998=>911,9999=>933,10000=>911,10001=>945,10002=>974,10003=>755,10004=>846,10005=>762,10006=>761,10007=>571,10008=>677,10009=>763,10010=>760,10011=>759,10012=>754,10013=>494,10014=>552,10015=>537,10016=>577,10017=>692,10018=>786,10019=>788,10020=>788,10021=>790,10022=>793,10023=>794,10025=>823,10026=>789,10027=>841,10028=>823,10029=>833,10030=>816,10031=>831,10032=>923,10033=>744,10034=>723,10035=>749,10036=>790,10037=>792,10038=>695,10039=>776,10040=>768,10041=>792,10042=>759,10043=>707,10044=>708,10045=>682,10046=>701,10047=>826,10048=>815,10049=>789,10050=>789,10051=>707,10052=>687,10053=>696,10054=>689,10055=>786,10056=>787,10057=>713,10058=>791,10059=>785,10061=>873,10063=>762,10064=>762,10065=>759,10066=>759,10070=>784,10072=>138,10073=>277,10074=>415,10075=>392,10076=>392,10077=>668,10078=>668,10081=>732,10082=>544,10083=>544,10084=>910,10085=>667,10086=>760,10087=>760,10102=>788,10103=>788,10104=>788,10105=>788,10106=>788,10107=>788,10108=>788,10109=>788,10110=>788,10111=>788,10112=>788,10113=>788,10114=>788,10115=>788,10116=>788,10117=>788,10118=>788,10119=>788,10120=>788,10121=>788,10122=>788,10123=>788,10124=>788,10125=>788,10126=>788,10127=>788,10128=>788,10129=>788,10130=>788,10131=>788,10132=>894,10136=>748,10137=>924,10138=>748,10139=>918,10140=>927,10141=>928,10142=>928,10143=>834,10144=>873,10145=>828,10146=>924,10147=>924,10148=>917,10149=>930,10150=>931,10151=>463,10152=>883,10153=>836,10154=>836,10155=>867,10156=>867,10157=>696,10158=>696,10159=>874,10161=>874,10162=>760,10163=>946,10164=>771,10165=>865,10166=>771,10167=>888,10168=>967,10169=>888,10170=>831,10171=>873,10172=>927,10173=>970,10174=>918,12288=>1000,12289=>1000,12290=>1000,12291=>1000,12292=>1000,12293=>1000,12294=>1000,12295=>1000,12296=>1000,12297=>1000,12298=>1000,12299=>1000,12300=>1000,12301=>1000,12302=>1000,12303=>1000,12304=>1000,12305=>1000,12306=>1000,12307=>1000,12308=>1000,12309=>1000,12310=>1000,12311=>1000,12312=>1000,12313=>1000,12314=>1000,12315=>1000,12316=>1000,12317=>1000,12318=>1000,12319=>1000,12320=>1000,12321=>1000,12322=>1000,12323=>1000,12324=>1000,12325=>1000,12326=>1000,12327=>1000,12328=>1000,12329=>1000,12330=>1000,12331=>1000,12332=>1000,12333=>1000,12334=>1000,12335=>1000,12336=>1000,12337=>1000,12338=>1000,12339=>1000,12340=>1000,12341=>1000,12342=>1000,12343=>1000,12351=>1000,12353=>1000,12354=>1000,12355=>1000,12356=>1000,12357=>1000,12358=>1000,12359=>1000,12360=>1000,12361=>1000,12362=>1000,12363=>1000,12364=>1000,12365=>1000,12366=>1000,12367=>1000,12368=>1000,12369=>1000,12370=>1000,12371=>1000,12372=>1000,12373=>1000,12374=>1000,12375=>1000,12376=>1000,12377=>1000,12378=>1000,12379=>1000,12380=>1000,12381=>1000,12382=>1000,12383=>1000,12384=>1000,12385=>1000,12386=>1000,12387=>1000,12388=>1000,12389=>1000,12390=>1000,12391=>1000,12392=>1000,12393=>1000,12394=>1000,12395=>1000,12396=>1000,12397=>1000,12398=>1000,12399=>1000,12400=>1000,12401=>1000,12402=>1000,12403=>1000,12404=>1000,12405=>1000,12406=>1000,12407=>1000,12408=>1000,12409=>1000,12410=>1000,12411=>1000,12412=>1000,12413=>1000,12414=>1000,12415=>1000,12416=>1000,12417=>1000,12418=>1000,12419=>1000,12420=>1000,12421=>1000,12422=>1000,12423=>1000,12424=>1000,12425=>1000,12426=>1000,12427=>1000,12428=>1000,12429=>1000,12430=>1000,12431=>1000,12432=>1000,12433=>1000,12434=>1000,12435=>1000,12436=>1000,12441=>1000,12442=>1000,12443=>1000,12444=>1000,12445=>1000,12446=>1000,12449=>1000,12450=>1000,12451=>1000,12452=>1000,12453=>1000,12454=>1000,12455=>1000,12456=>1000,12457=>1000,12458=>1000,12459=>1000,12460=>1000,12461=>1000,12462=>1000,12463=>1000,12464=>1000,12465=>1000,12466=>1000,12467=>1000,12468=>1000,12469=>1000,12470=>1000,12471=>1000,12472=>1000,12473=>1000,12474=>1000,12475=>1000,12476=>1000,12477=>1000,12478=>1000,12479=>1000,12480=>1000,12481=>1000,12482=>1000,12483=>1000,12484=>1000,12485=>1000,12486=>1000,12487=>1000,12488=>1000,12489=>1000,12490=>1000,12491=>1000,12492=>1000,12493=>1000,12494=>1000,12495=>1000,12496=>1000,12497=>1000,12498=>1000,12499=>1000,12500=>1000,12501=>1000,12502=>1000,12503=>1000,12504=>1000,12505=>1000,12506=>1000,12507=>1000,12508=>1000,12509=>1000,12510=>1000,12511=>1000,12512=>1000,12513=>1000,12514=>1000,12515=>1000,12516=>1000,12517=>1000,12518=>1000,12519=>1000,12520=>1000,12521=>1000,12522=>1000,12523=>1000,12524=>1000,12525=>1000,12526=>1000,12527=>1000,12528=>1000,12529=>1000,12530=>1000,12531=>1000,12532=>1000,12533=>1000,12534=>1000,12535=>1000,12536=>1000,12537=>1000,12538=>1000,12539=>1000,12540=>1000,12541=>1000,12542=>1000,12549=>1000,12550=>1000,12551=>1000,12552=>1000,12553=>1000,12554=>1000,12555=>1000,12556=>1000,12557=>1000,12558=>1000,12559=>1000,12560=>1000,12561=>1000,12562=>1000,12563=>1000,12564=>1000,12565=>1000,12566=>1000,12567=>1000,12568=>1000,12569=>1000,12570=>1000,12571=>1000,12572=>1000,12573=>1000,12574=>1000,12575=>1000,12576=>1000,12577=>1000,12578=>1000,12579=>1000,12580=>1000,12581=>1000,12582=>1000,12583=>1000,12584=>1000,12585=>1000,12586=>1000,12587=>1000,12588=>1000,12593=>1000,12594=>1000,12595=>1000,12596=>1000,12597=>1000,12598=>1000,12599=>1000,12600=>1000,12601=>1000,12602=>1000,12603=>1000,12604=>1000,12605=>1000,12606=>1000,12607=>1000,12608=>1000,12609=>1000,12610=>1000,12611=>1000,12612=>1000,12613=>1000,12614=>1000,12615=>1000,12616=>1000,12617=>1000,12618=>1000,12619=>1000,12620=>1000,12621=>1000,12622=>1000,12623=>1000,12624=>1000,12625=>1000,12626=>1000,12627=>1000,12628=>1000,12629=>1000,12630=>1000,12631=>1000,12632=>1000,12633=>1000,12634=>1000,12635=>1000,12636=>1000,12637=>1000,12638=>1000,12639=>1000,12640=>1000,12641=>1000,12642=>1000,12643=>1000,12644=>1000,12645=>1000,12646=>1000,12647=>1000,12648=>1000,12649=>1000,12650=>1000,12651=>1000,12652=>1000,12653=>1000,12654=>1000,12655=>1000,12656=>1000,12657=>1000,12658=>1000,12659=>1000,12660=>1000,12661=>1000,12662=>1000,12663=>1000,12664=>1000,12665=>1000,12666=>1000,12667=>1000,12668=>1000,12669=>1000,12670=>1000,12671=>1000,12672=>1000,12673=>1000,12674=>1000,12675=>1000,12676=>1000,12677=>1000,12678=>1000,12679=>1000,12680=>1000,12681=>1000,12682=>1000,12683=>1000,12684=>1000,12685=>1000,12686=>1000,12688=>1000,12689=>1000,12690=>1000,12691=>1000,12692=>1000,12693=>1000,12694=>1000,12695=>1000,12696=>1000,12697=>1000,12698=>1000,12699=>1000,12700=>1000,12701=>1000,12702=>1000,12703=>1000,12800=>1000,12801=>1000,12802=>1000,12803=>1000,12804=>1000,12805=>1000,12806=>1000,12807=>1000,12808=>1000,12809=>1000,12810=>1000,12811=>1000,12812=>1000,12813=>1000,12814=>1000,12815=>1000,12816=>1000,12817=>1000,12818=>1000,12819=>1000,12820=>1000,12821=>1000,12822=>1000,12823=>1000,12824=>1000,12825=>1000,12826=>1000,12827=>1000,12828=>1000,12832=>1000,12833=>1000,12834=>1000,12835=>1000,12836=>1000,12837=>1000,12838=>1000,12839=>1000,12840=>1000,12841=>1000,12842=>1000,12843=>1000,12844=>1000,12845=>1000,12846=>1000,12847=>1000,12848=>1000,12849=>1000,12850=>1000,12851=>1000,12852=>1000,12853=>1000,12854=>1000,12855=>1000,12856=>1000,12857=>1000,12858=>1000,12859=>1000,12860=>1000,12861=>1000,12862=>1000,12863=>1000,12864=>1000,12865=>1000,12866=>1000,12867=>1000,12896=>1000,12897=>1000,12898=>1000,12899=>1000,12900=>1000,12901=>1000,12902=>1000,12903=>1000,12904=>1000,12905=>1000,12906=>1000,12907=>1000,12908=>1000,12909=>1000,12910=>1000,12911=>1000,12912=>1000,12913=>1000,12914=>1000,12915=>1000,12916=>1000,12917=>1000,12918=>1000,12919=>1000,12920=>1000,12921=>1000,12922=>1000,12923=>1000,12927=>1000,12928=>1000,12929=>1000,12930=>1000,12931=>1000,12932=>1000,12933=>1000,12934=>1000,12935=>1000,12936=>1000,12937=>1000,12938=>1000,12939=>1000,12940=>1000,12941=>1000,12942=>1000,12943=>1000,12944=>1000,12945=>1000,12946=>1000,12947=>1000,12948=>1000,12949=>1000,12950=>1000,12951=>1000,12952=>1000,12953=>1000,12954=>1000,12955=>1000,12956=>1000,12957=>1000,12958=>1000,12959=>1000,12960=>1000,12961=>1000,12962=>1000,12963=>1000,12964=>1000,12965=>1000,12966=>1000,12967=>1000,12968=>1000,12969=>1000,12970=>1000,12971=>1000,12972=>1000,12973=>1000,12974=>1000,12975=>1000,12976=>1000,12992=>1000,12993=>1000,12994=>1000,12995=>1000,12996=>1000,12997=>1000,12998=>1000,12999=>1000,13000=>1000,13001=>1000,13002=>1000,13003=>1000,13008=>1000,13009=>1000,13010=>1000,13011=>1000,13012=>1000,13013=>1000,13014=>1000,13015=>1000,13016=>1000,13017=>1000,13018=>1000,13019=>1000,13020=>1000,13021=>1000,13022=>1000,13023=>1000,13024=>1000,13025=>1000,13026=>1000,13027=>1000,13028=>1000,13029=>1000,13030=>1000,13031=>1000,13032=>1000,13033=>1000,13034=>1000,13035=>1000,13036=>1000,13037=>1000,13038=>1000,13039=>1000,13040=>1000,13041=>1000,13042=>1000,13043=>1000,13044=>1000,13045=>1000,13046=>1000,13047=>1000,13048=>1000,13049=>1000,13050=>1000,13051=>1000,13052=>1000,13053=>1000,13054=>1000,13056=>1000,13057=>1000,13058=>1000,13059=>1000,13060=>1000,13061=>1000,13062=>1000,13063=>1000,13064=>1000,13065=>1000,13066=>1000,13067=>1000,13068=>1000,13069=>1000,13070=>1000,13071=>1000,13072=>1000,13073=>1000,13074=>1000,13075=>1000,13076=>1000,13077=>1000,13078=>1000,13079=>1000,13080=>1000,13081=>1000,13082=>1000,13083=>1000,13084=>1000,13085=>1000,13086=>1000,13087=>1000,13088=>1000,13089=>1000,13090=>1000,13091=>1000,13092=>1000,13093=>1000,13094=>1000,13095=>1000,13096=>1000,13097=>1000,13098=>1000,13099=>1000,13100=>1000,13101=>1000,13102=>1000,13103=>1000,13104=>1000,13105=>1000,13106=>1000,13107=>1000,13108=>1000,13109=>1000,13110=>1000,13111=>1000,13112=>1000,13113=>1000,13114=>1000,13115=>1000,13116=>1000,13117=>1000,13118=>1000,13119=>1000,13120=>1000,13121=>1000,13122=>1000,13123=>1000,13124=>1000,13125=>1000,13126=>1000,13127=>1000,13128=>1000,13129=>1000,13130=>1000,13131=>1000,13132=>1000,13133=>1000,13134=>1000,13135=>1000,13136=>1000,13137=>1000,13138=>1000,13139=>1000,13140=>1000,13141=>1000,13142=>1000,13143=>1000,13144=>1000,13145=>1000,13146=>1000,13147=>1000,13148=>1000,13149=>1000,13150=>1000,13151=>1000,13152=>1000,13153=>1000,13154=>1000,13155=>1000,13156=>1000,13157=>1000,13158=>1000,13159=>1000,13160=>1000,13161=>1000,13162=>1000,13163=>1000,13164=>1000,13165=>1000,13166=>1000,13167=>1000,13168=>1000,13169=>1000,13170=>1000,13171=>1000,13172=>1000,13173=>1000,13174=>1000,13179=>1000,13180=>1000,13181=>1000,13182=>1000,13183=>1000,13184=>1000,13185=>1000,13186=>1000,13187=>1000,13188=>1000,13189=>1000,13190=>1000,13191=>1000,13192=>1000,13193=>1000,13194=>1000,13195=>1000,13196=>1000,13197=>1000,13198=>1000,13199=>1000,13200=>1000,13201=>1000,13202=>1000,13203=>1000,13204=>1000,13205=>1000,13206=>1000,13207=>1000,13208=>1000,13209=>1000,13210=>1000,13211=>1000,13212=>1000,13213=>1000,13214=>1000,13215=>1000,13216=>1000,13217=>1000,13218=>1000,13219=>1000,13220=>1000,13221=>1000,13222=>1000,13223=>1000,13224=>1000,13225=>1000,13226=>1000,13227=>1000,13228=>1000,13229=>1000,13230=>1000,13231=>1000,13232=>1000,13233=>1000,13234=>1000,13235=>1000,13236=>1000,13237=>1000,13238=>1000,13239=>1000,13240=>1000,13241=>1000,13242=>1000,13243=>1000,13244=>1000,13245=>1000,13246=>1000,13247=>1000,13248=>1000,13249=>1000,13250=>1000,13251=>1000,13252=>1000,13253=>1000,13254=>1000,13255=>1000,13256=>1000,13257=>1000,13258=>1000,13259=>1000,13260=>1000,13261=>1000,13262=>1000,13263=>1000,13264=>1000,13265=>1000,13266=>1000,13267=>1000,13268=>1000,13269=>1000,13270=>1000,13271=>1000,13272=>1000,13273=>1000,13274=>1000,13275=>1000,13276=>1000,13277=>1000,13280=>1000,13281=>1000,13282=>1000,13283=>1000,13284=>1000,13285=>1000,13286=>1000,13287=>1000,13288=>1000,13289=>1000,13290=>1000,13291=>1000,13292=>1000,13293=>1000,13294=>1000,13295=>1000,13296=>1000,13297=>1000,13298=>1000,13299=>1000,13300=>1000,13301=>1000,13302=>1000,13303=>1000,13304=>1000,13305=>1000,13306=>1000,13307=>1000,13308=>1000,13309=>1000,13310=>1000,19968=>1000,19969=>1000,19970=>1000,19971=>1000,19972=>1000,19973=>1000,19974=>1000,19975=>1000,19976=>1000,19977=>1000,19978=>1000,19979=>1000,19980=>1000,19981=>1000,19982=>1000,19983=>1000,19984=>1000,19985=>1000,19986=>1000,19987=>1000,19988=>1000,19989=>1000,19990=>1000,19991=>1000,19992=>1000,19993=>1000,19994=>1000,19995=>1000,19996=>1000,19997=>1000,19998=>1000,19999=>1000,20000=>1000,20001=>1000,20002=>1000,20003=>1000,20004=>1000,20005=>1000,20006=>1000,20007=>1000,20008=>1000,20009=>1000,20010=>1000,20011=>1000,20012=>1000,20013=>1000,20014=>1000,20015=>1000,20016=>1000,20017=>1000,20018=>1000,20019=>1000,20020=>1000,20021=>1000,20022=>1000,20023=>1000,20024=>1000,20025=>1000,20026=>1000,20027=>1000,20028=>1000,20029=>1000,20030=>1000,20031=>1000,20032=>1000,20033=>1000,20034=>1000,20035=>1000,20036=>1000,20037=>1000,20038=>1000,20039=>1000,20040=>1000,20041=>1000,20042=>1000,20043=>1000,20044=>1000,20045=>1000,20046=>1000,20047=>1000,20048=>1000,20049=>1000,20050=>1000,20051=>1000,20052=>1000,20053=>1000,20054=>1000,20055=>1000,20056=>1000,20057=>1000,20058=>1000,20059=>1000,20060=>1000,20061=>1000,20062=>1000,20063=>1000,20064=>1000,20065=>1000,20066=>1000,20067=>1000,20068=>1000,20069=>1000,20070=>1000,20071=>1000,20072=>1000,20073=>1000,20074=>1000,20075=>1000,20076=>1000,20077=>1000,20078=>1000,20079=>1000,20080=>1000,20081=>1000,20082=>1000,20083=>1000,20084=>1000,20085=>1000,20086=>1000,20087=>1000,20088=>1000,20089=>1000,20090=>1000,20091=>1000,20092=>1000,20093=>1000,20094=>1000,20095=>1000,20096=>1000,20097=>1000,20098=>1000,20099=>1000,20100=>1000,20101=>1000,20102=>1000,20103=>1000,20104=>1000,20105=>1000,20106=>1000,20107=>1000,20108=>1000,20109=>1000,20110=>1000,20111=>1000,20112=>1000,20113=>1000,20114=>1000,20115=>1000,20116=>1000,20117=>1000,20118=>1000,20119=>1000,20120=>1000,20121=>1000,20122=>1000,20123=>1000,20124=>1000,20125=>1000,20126=>1000,20127=>1000,20128=>1000,20129=>1000,20130=>1000,20131=>1000,20132=>1000,20133=>1000,20134=>1000,20135=>1000,20136=>1000,20137=>1000,20138=>1000,20139=>1000,20140=>1000,20141=>1000,20142=>1000,20143=>1000,20144=>1000,20145=>1000,20146=>1000,20147=>1000,20148=>1000,20149=>1000,20150=>1000,20151=>1000,20152=>1000,20153=>1000,20154=>1000,20155=>1000,20156=>1000,20157=>1000,20158=>1000,20159=>1000,20160=>1000,20161=>1000,20162=>1000,20163=>1000,20164=>1000,20165=>1000,20166=>1000,20167=>1000,20168=>1000,20169=>1000,20170=>1000,20171=>1000,20172=>1000,20173=>1000,20174=>1000,20175=>1000,20176=>1000,20177=>1000,20178=>1000,20179=>1000,20180=>1000,20181=>1000,20182=>1000,20183=>1000,20184=>1000,20185=>1000,20186=>1000,20187=>1000,20188=>1000,20189=>1000,20190=>1000,20191=>1000,20192=>1000,20193=>1000,20194=>1000,20195=>1000,20196=>1000,20197=>1000,20198=>1000,20199=>1000,20200=>1000,20201=>1000,20202=>1000,20203=>1000,20204=>1000,20205=>1000,20206=>1000,20207=>1000,20208=>1000,20209=>1000,20210=>1000,20211=>1000,20212=>1000,20213=>1000,20214=>1000,20215=>1000,20216=>1000,20217=>1000,20218=>1000,20219=>1000,20220=>1000,20221=>1000,20222=>1000,20223=>1000,20224=>1000,20225=>1000,20226=>1000,20227=>1000,20228=>1000,20229=>1000,20230=>1000,20231=>1000,20232=>1000,20233=>1000,20234=>1000,20235=>1000,20236=>1000,20237=>1000,20238=>1000,20239=>1000,20240=>1000,20241=>1000,20242=>1000,20243=>1000,20244=>1000,20245=>1000,20246=>1000,20247=>1000,20248=>1000,20249=>1000,20250=>1000,20251=>1000,20252=>1000,20253=>1000,20254=>1000,20255=>1000,20256=>1000,20257=>1000,20258=>1000,20259=>1000,20260=>1000,20261=>1000,20262=>1000,20263=>1000,20264=>1000,20265=>1000,20266=>1000,20267=>1000,20268=>1000,20269=>1000,20270=>1000,20271=>1000,20272=>1000,20273=>1000,20274=>1000,20275=>1000,20276=>1000,20277=>1000,20278=>1000,20279=>1000,20280=>1000,20281=>1000,20282=>1000,20283=>1000,20284=>1000,20285=>1000,20286=>1000,20287=>1000,20288=>1000,20289=>1000,20290=>1000,20291=>1000,20292=>1000,20293=>1000,20294=>1000,20295=>1000,20296=>1000,20297=>1000,20298=>1000,20299=>1000,20300=>1000,20301=>1000,20302=>1000,20303=>1000,20304=>1000,20305=>1000,20306=>1000,20307=>1000,20308=>1000,20309=>1000,20310=>1000,20311=>1000,20312=>1000,20313=>1000,20314=>1000,20315=>1000,20316=>1000,20317=>1000,20318=>1000,20319=>1000,20320=>1000,20321=>1000,20322=>1000,20323=>1000,20324=>1000,20325=>1000,20326=>1000,20327=>1000,20328=>1000,20329=>1000,20330=>1000,20331=>1000,20332=>1000,20333=>1000,20334=>1000,20335=>1000,20336=>1000,20337=>1000,20338=>1000,20339=>1000,20340=>1000,20341=>1000,20342=>1000,20343=>1000,20344=>1000,20345=>1000,20346=>1000,20347=>1000,20348=>1000,20349=>1000,20350=>1000,20351=>1000,20352=>1000,20353=>1000,20354=>1000,20355=>1000,20356=>1000,20357=>1000,20358=>1000,20359=>1000,20360=>1000,20361=>1000,20362=>1000,20363=>1000,20364=>1000,20365=>1000,20366=>1000,20367=>1000,20368=>1000,20369=>1000,20370=>1000,20371=>1000,20372=>1000,20373=>1000,20374=>1000,20375=>1000,20376=>1000,20377=>1000,20378=>1000,20379=>1000,20380=>1000,20381=>1000,20382=>1000,20383=>1000,20384=>1000,20385=>1000,20386=>1000,20387=>1000,20388=>1000,20389=>1000,20390=>1000,20391=>1000,20392=>1000,20393=>1000,20394=>1000,20395=>1000,20396=>1000,20397=>1000,20398=>1000,20399=>1000,20400=>1000,20401=>1000,20402=>1000,20403=>1000,20404=>1000,20405=>1000,20406=>1000,20407=>1000,20408=>1000,20409=>1000,20410=>1000,20411=>1000,20412=>1000,20413=>1000,20414=>1000,20415=>1000,20416=>1000,20417=>1000,20418=>1000,20419=>1000,20420=>1000,20421=>1000,20422=>1000,20423=>1000,20424=>1000,20425=>1000,20426=>1000,20427=>1000,20428=>1000,20429=>1000,20430=>1000,20431=>1000,20432=>1000,20433=>1000,20434=>1000,20435=>1000,20436=>1000,20437=>1000,20438=>1000,20439=>1000,20440=>1000,20441=>1000,20442=>1000,20443=>1000,20444=>1000,20445=>1000,20446=>1000,20447=>1000,20448=>1000,20449=>1000,20450=>1000,20451=>1000,20452=>1000,20453=>1000,20454=>1000,20455=>1000,20456=>1000,20457=>1000,20458=>1000,20459=>1000,20460=>1000,20461=>1000,20462=>1000,20463=>1000,20464=>1000,20465=>1000,20466=>1000,20467=>1000,20468=>1000,20469=>1000,20470=>1000,20471=>1000,20472=>1000,20473=>1000,20474=>1000,20475=>1000,20476=>1000,20477=>1000,20478=>1000,20479=>1000,20480=>1000,20481=>1000,20482=>1000,20483=>1000,20484=>1000,20485=>1000,20486=>1000,20487=>1000,20488=>1000,20489=>1000,20490=>1000,20491=>1000,20492=>1000,20493=>1000,20494=>1000,20495=>1000,20496=>1000,20497=>1000,20498=>1000,20499=>1000,20500=>1000,20501=>1000,20502=>1000,20503=>1000,20504=>1000,20505=>1000,20506=>1000,20507=>1000,20508=>1000,20509=>1000,20510=>1000,20511=>1000,20512=>1000,20513=>1000,20514=>1000,20515=>1000,20516=>1000,20517=>1000,20518=>1000,20519=>1000,20520=>1000,20521=>1000,20522=>1000,20523=>1000,20524=>1000,20525=>1000,20526=>1000,20527=>1000,20528=>1000,20529=>1000,20530=>1000,20531=>1000,20532=>1000,20533=>1000,20534=>1000,20535=>1000,20536=>1000,20537=>1000,20538=>1000,20539=>1000,20540=>1000,20541=>1000,20542=>1000,20543=>1000,20544=>1000,20545=>1000,20546=>1000,20547=>1000,20548=>1000,20549=>1000,20550=>1000,20551=>1000,20552=>1000,20553=>1000,20554=>1000,20555=>1000,20556=>1000,20557=>1000,20558=>1000,20559=>1000,20560=>1000,20561=>1000,20562=>1000,20563=>1000,20564=>1000,20565=>1000,20566=>1000,20567=>1000,20568=>1000,20569=>1000,20570=>1000,20571=>1000,20572=>1000,20573=>1000,20574=>1000,20575=>1000,20576=>1000,20577=>1000,20578=>1000,20579=>1000,20580=>1000,20581=>1000,20582=>1000,20583=>1000,20584=>1000,20585=>1000,20586=>1000,20587=>1000,20588=>1000,20589=>1000,20590=>1000,20591=>1000,20592=>1000,20593=>1000,20594=>1000,20595=>1000,20596=>1000,20597=>1000,20598=>1000,20599=>1000,20600=>1000,20601=>1000,20602=>1000,20603=>1000,20604=>1000,20605=>1000,20606=>1000,20607=>1000,20608=>1000,20609=>1000,20610=>1000,20611=>1000,20612=>1000,20613=>1000,20614=>1000,20615=>1000,20616=>1000,20617=>1000,20618=>1000,20619=>1000,20620=>1000,20621=>1000,20622=>1000,20623=>1000,20624=>1000,20625=>1000,20626=>1000,20627=>1000,20628=>1000,20629=>1000,20630=>1000,20631=>1000,20632=>1000,20633=>1000,20634=>1000,20635=>1000,20636=>1000,20637=>1000,20638=>1000,20639=>1000,20640=>1000,20641=>1000,20642=>1000,20643=>1000,20644=>1000,20645=>1000,20646=>1000,20647=>1000,20648=>1000,20649=>1000,20650=>1000,20651=>1000,20652=>1000,20653=>1000,20654=>1000,20655=>1000,20656=>1000,20657=>1000,20658=>1000,20659=>1000,20660=>1000,20661=>1000,20662=>1000,20663=>1000,20664=>1000,20665=>1000,20666=>1000,20667=>1000,20668=>1000,20669=>1000,20670=>1000,20671=>1000,20672=>1000,20673=>1000,20674=>1000,20675=>1000,20676=>1000,20677=>1000,20678=>1000,20679=>1000,20680=>1000,20681=>1000,20682=>1000,20683=>1000,20684=>1000,20685=>1000,20686=>1000,20687=>1000,20688=>1000,20689=>1000,20690=>1000,20691=>1000,20692=>1000,20693=>1000,20694=>1000,20695=>1000,20696=>1000,20697=>1000,20698=>1000,20699=>1000,20700=>1000,20701=>1000,20702=>1000,20703=>1000,20704=>1000,20705=>1000,20706=>1000,20707=>1000,20708=>1000,20709=>1000,20710=>1000,20711=>1000,20712=>1000,20713=>1000,20714=>1000,20715=>1000,20716=>1000,20717=>1000,20718=>1000,20719=>1000,20720=>1000,20721=>1000,20722=>1000,20723=>1000,20724=>1000,20725=>1000,20726=>1000,20727=>1000,20728=>1000,20729=>1000,20730=>1000,20731=>1000,20732=>1000,20733=>1000,20734=>1000,20735=>1000,20736=>1000,20737=>1000,20738=>1000,20739=>1000,20740=>1000,20741=>1000,20742=>1000,20743=>1000,20744=>1000,20745=>1000,20746=>1000,20747=>1000,20748=>1000,20749=>1000,20750=>1000,20751=>1000,20752=>1000,20753=>1000,20754=>1000,20755=>1000,20756=>1000,20757=>1000,20758=>1000,20759=>1000,20760=>1000,20761=>1000,20762=>1000,20763=>1000,20764=>1000,20765=>1000,20766=>1000,20767=>1000,20768=>1000,20769=>1000,20770=>1000,20771=>1000,20772=>1000,20773=>1000,20774=>1000,20775=>1000,20776=>1000,20777=>1000,20778=>1000,20779=>1000,20780=>1000,20781=>1000,20782=>1000,20783=>1000,20784=>1000,20785=>1000,20786=>1000,20787=>1000,20788=>1000,20789=>1000,20790=>1000,20791=>1000,20792=>1000,20793=>1000,20794=>1000,20795=>1000,20796=>1000,20797=>1000,20798=>1000,20799=>1000,20800=>1000,20801=>1000,20802=>1000,20803=>1000,20804=>1000,20805=>1000,20806=>1000,20807=>1000,20808=>1000,20809=>1000,20810=>1000,20811=>1000,20812=>1000,20813=>1000,20814=>1000,20815=>1000,20816=>1000,20817=>1000,20818=>1000,20819=>1000,20820=>1000,20821=>1000,20822=>1000,20823=>1000,20824=>1000,20825=>1000,20826=>1000,20827=>1000,20828=>1000,20829=>1000,20830=>1000,20831=>1000,20832=>1000,20833=>1000,20834=>1000,20835=>1000,20836=>1000,20837=>1000,20838=>1000,20839=>1000,20840=>1000,20841=>1000,20842=>1000,20843=>1000,20844=>1000,20845=>1000,20846=>1000,20847=>1000,20848=>1000,20849=>1000,20850=>1000,20851=>1000,20852=>1000,20853=>1000,20854=>1000,20855=>1000,20856=>1000,20857=>1000,20858=>1000,20859=>1000,20860=>1000,20861=>1000,20862=>1000,20863=>1000,20864=>1000,20865=>1000,20866=>1000,20867=>1000,20868=>1000,20869=>1000,20870=>1000,20871=>1000,20872=>1000,20873=>1000,20874=>1000,20875=>1000,20876=>1000,20877=>1000,20878=>1000,20879=>1000,20880=>1000,20881=>1000,20882=>1000,20883=>1000,20884=>1000,20885=>1000,20886=>1000,20887=>1000,20888=>1000,20889=>1000,20890=>1000,20891=>1000,20892=>1000,20893=>1000,20894=>1000,20895=>1000,20896=>1000,20897=>1000,20898=>1000,20899=>1000,20900=>1000,20901=>1000,20902=>1000,20903=>1000,20904=>1000,20905=>1000,20906=>1000,20907=>1000,20908=>1000,20909=>1000,20910=>1000,20911=>1000,20912=>1000,20913=>1000,20914=>1000,20915=>1000,20916=>1000,20917=>1000,20918=>1000,20919=>1000,20920=>1000,20921=>1000,20922=>1000,20923=>1000,20924=>1000,20925=>1000,20926=>1000,20927=>1000,20928=>1000,20929=>1000,20930=>1000,20931=>1000,20932=>1000,20933=>1000,20934=>1000,20935=>1000,20936=>1000,20937=>1000,20938=>1000,20939=>1000,20940=>1000,20941=>1000,20942=>1000,20943=>1000,20944=>1000,20945=>1000,20946=>1000,20947=>1000,20948=>1000,20949=>1000,20950=>1000,20951=>1000,20952=>1000,20953=>1000,20954=>1000,20955=>1000,20956=>1000,20957=>1000,20958=>1000,20959=>1000,20960=>1000,20961=>1000,20962=>1000,20963=>1000,20964=>1000,20965=>1000,20966=>1000,20967=>1000,20968=>1000,20969=>1000,20970=>1000,20971=>1000,20972=>1000,20973=>1000,20974=>1000,20975=>1000,20976=>1000,20977=>1000,20978=>1000,20979=>1000,20980=>1000,20981=>1000,20982=>1000,20983=>1000,20984=>1000,20985=>1000,20986=>1000,20987=>1000,20988=>1000,20989=>1000,20990=>1000,20991=>1000,20992=>1000,20993=>1000,20994=>1000,20995=>1000,20996=>1000,20997=>1000,20998=>1000,20999=>1000,21000=>1000,21001=>1000,21002=>1000,21003=>1000,21004=>1000,21005=>1000,21006=>1000,21007=>1000,21008=>1000,21009=>1000,21010=>1000,21011=>1000,21012=>1000,21013=>1000,21014=>1000,21015=>1000,21016=>1000,21017=>1000,21018=>1000,21019=>1000,21020=>1000,21021=>1000,21022=>1000,21023=>1000,21024=>1000,21025=>1000,21026=>1000,21027=>1000,21028=>1000,21029=>1000,21030=>1000,21031=>1000,21032=>1000,21033=>1000,21034=>1000,21035=>1000,21036=>1000,21037=>1000,21038=>1000,21039=>1000,21040=>1000,21041=>1000,21042=>1000,21043=>1000,21044=>1000,21045=>1000,21046=>1000,21047=>1000,21048=>1000,21049=>1000,21050=>1000,21051=>1000,21052=>1000,21053=>1000,21054=>1000,21055=>1000,21056=>1000,21057=>1000,21058=>1000,21059=>1000,21060=>1000,21061=>1000,21062=>1000,21063=>1000,21064=>1000,21065=>1000,21066=>1000,21067=>1000,21068=>1000,21069=>1000,21070=>1000,21071=>1000,21072=>1000,21073=>1000,21074=>1000,21075=>1000,21076=>1000,21077=>1000,21078=>1000,21079=>1000,21080=>1000,21081=>1000,21082=>1000,21083=>1000,21084=>1000,21085=>1000,21086=>1000,21087=>1000,21088=>1000,21089=>1000,21090=>1000,21091=>1000,21092=>1000,21093=>1000,21094=>1000,21095=>1000,21096=>1000,21097=>1000,21098=>1000,21099=>1000,21100=>1000,21101=>1000,21102=>1000,21103=>1000,21104=>1000,21105=>1000,21106=>1000,21107=>1000,21108=>1000,21109=>1000,21110=>1000,21111=>1000,21112=>1000,21113=>1000,21114=>1000,21115=>1000,21116=>1000,21117=>1000,21118=>1000,21119=>1000,21120=>1000,21121=>1000,21122=>1000,21123=>1000,21124=>1000,21125=>1000,21126=>1000,21127=>1000,21128=>1000,21129=>1000,21130=>1000,21131=>1000,21132=>1000,21133=>1000,21134=>1000,21135=>1000,21136=>1000,21137=>1000,21138=>1000,21139=>1000,21140=>1000,21141=>1000,21142=>1000,21143=>1000,21144=>1000,21145=>1000,21146=>1000,21147=>1000,21148=>1000,21149=>1000,21150=>1000,21151=>1000,21152=>1000,21153=>1000,21154=>1000,21155=>1000,21156=>1000,21157=>1000,21158=>1000,21159=>1000,21160=>1000,21161=>1000,21162=>1000,21163=>1000,21164=>1000,21165=>1000,21166=>1000,21167=>1000,21168=>1000,21169=>1000,21170=>1000,21171=>1000,21172=>1000,21173=>1000,21174=>1000,21175=>1000,21176=>1000,21177=>1000,21178=>1000,21179=>1000,21180=>1000,21181=>1000,21182=>1000,21183=>1000,21184=>1000,21185=>1000,21186=>1000,21187=>1000,21188=>1000,21189=>1000,21190=>1000,21191=>1000,21192=>1000,21193=>1000,21194=>1000,21195=>1000,21196=>1000,21197=>1000,21198=>1000,21199=>1000,21200=>1000,21201=>1000,21202=>1000,21203=>1000,21204=>1000,21205=>1000,21206=>1000,21207=>1000,21208=>1000,21209=>1000,21210=>1000,21211=>1000,21212=>1000,21213=>1000,21214=>1000,21215=>1000,21216=>1000,21217=>1000,21218=>1000,21219=>1000,21220=>1000,21221=>1000,21222=>1000,21223=>1000,21224=>1000,21225=>1000,21226=>1000,21227=>1000,21228=>1000,21229=>1000,21230=>1000,21231=>1000,21232=>1000,21233=>1000,21234=>1000,21235=>1000,21236=>1000,21237=>1000,21238=>1000,21239=>1000,21240=>1000,21241=>1000,21242=>1000,21243=>1000,21244=>1000,21245=>1000,21246=>1000,21247=>1000,21248=>1000,21249=>1000,21250=>1000,21251=>1000,21252=>1000,21253=>1000,21254=>1000,21255=>1000,21256=>1000,21257=>1000,21258=>1000,21259=>1000,21260=>1000,21261=>1000,21262=>1000,21263=>1000,21264=>1000,21265=>1000,21266=>1000,21267=>1000,21268=>1000,21269=>1000,21270=>1000,21271=>1000,21272=>1000,21273=>1000,21274=>1000,21275=>1000,21276=>1000,21277=>1000,21278=>1000,21279=>1000,21280=>1000,21281=>1000,21282=>1000,21283=>1000,21284=>1000,21285=>1000,21286=>1000,21287=>1000,21288=>1000,21289=>1000,21290=>1000,21291=>1000,21292=>1000,21293=>994,21294=>1000,21295=>1000,21296=>1000,21297=>1000,21298=>1000,21299=>1000,21300=>1000,21301=>1000,21302=>1000,21303=>1000,21304=>1000,21305=>1000,21306=>1000,21307=>1000,21308=>1000,21309=>1000,21310=>1000,21311=>1000,21312=>1000,21313=>1000,21314=>1000,21315=>1000,21316=>1000,21317=>1000,21318=>1000,21319=>1000,21320=>1000,21321=>1000,21322=>1000,21323=>1000,21324=>1000,21325=>1000,21326=>1000,21327=>1000,21328=>1000,21329=>1000,21330=>1000,21331=>1000,21332=>1000,21333=>1000,21334=>1000,21335=>1000,21336=>1000,21337=>1000,21338=>1000,21339=>1000,21340=>1000,21341=>1000,21342=>1000,21343=>1000,21344=>1000,21345=>1000,21346=>1000,21347=>1000,21348=>1000,21349=>1000,21350=>1000,21351=>1000,21352=>1000,21353=>1000,21354=>1000,21355=>1000,21356=>1000,21357=>1000,21358=>1000,21359=>1000,21360=>1000,21361=>1000,21362=>1000,21363=>1000,21364=>1000,21365=>1000,21366=>1000,21367=>1000,21368=>1000,21369=>1000,21370=>1000,21371=>1000,21372=>1000,21373=>1000,21374=>1000,21375=>1000,21376=>1000,21377=>1000,21378=>1000,21379=>1000,21380=>1000,21381=>1000,21382=>1000,21383=>1000,21384=>1000,21385=>1000,21386=>1000,21387=>1000,21388=>1000,21389=>1000,21390=>1000,21391=>1000,21392=>1000,21393=>1000,21394=>1000,21395=>1000,21396=>1000,21397=>1000,21398=>1000,21399=>1000,21400=>1000,21401=>1000,21402=>1000,21403=>1000,21404=>1000,21405=>1000,21406=>1000,21407=>1000,21408=>1000,21409=>1000,21410=>1000,21411=>1000,21412=>1000,21413=>1000,21414=>1000,21415=>1000,21416=>1000,21417=>1000,21418=>1000,21419=>1000,21420=>1000,21421=>1000,21422=>1000,21423=>1000,21424=>1000,21425=>1000,21426=>1000,21427=>1000,21428=>1000,21429=>1000,21430=>1000,21431=>1000,21432=>1000,21433=>1000,21434=>1000,21435=>1000,21436=>1000,21437=>1000,21438=>1000,21439=>1000,21440=>1000,21441=>1000,21442=>1000,21443=>1000,21444=>1000,21445=>1000,21446=>1000,21447=>1000,21448=>1000,21449=>1000,21450=>1000,21451=>1000,21452=>1000,21453=>1000,21454=>1000,21455=>1000,21456=>1000,21457=>1000,21458=>1000,21459=>1000,21460=>1000,21461=>1000,21462=>1000,21463=>1000,21464=>1000,21465=>1000,21466=>1000,21467=>1000,21468=>1000,21469=>1000,21470=>1000,21471=>1000,21472=>1000,21473=>1000,21474=>1000,21475=>1000,21476=>1000,21477=>1000,21478=>1000,21479=>1000,21480=>1000,21481=>1000,21482=>1000,21483=>1000,21484=>1000,21485=>1000,21486=>1000,21487=>1000,21488=>1000,21489=>1000,21490=>1000,21491=>1000,21492=>1000,21493=>1000,21494=>1000,21495=>1000,21496=>1000,21497=>1000,21498=>1000,21499=>1000,21500=>1000,21501=>1000,21502=>1000,21503=>1000,21504=>1000,21505=>1000,21506=>1000,21507=>1000,21508=>1000,21509=>1000,21510=>1000,21511=>1000,21512=>1000,21513=>1000,21514=>1000,21515=>1000,21516=>1000,21517=>1000,21518=>1000,21519=>1000,21520=>1000,21521=>1000,21522=>1000,21523=>1000,21524=>1000,21525=>1000,21526=>1000,21527=>1000,21528=>1000,21529=>1000,21530=>1000,21531=>1000,21532=>1000,21533=>1000,21534=>1000,21535=>1000,21536=>1000,21537=>1000,21538=>1000,21539=>1000,21540=>1000,21541=>1000,21542=>1000,21543=>1000,21544=>1000,21545=>1000,21546=>1000,21547=>1000,21548=>1000,21549=>1000,21550=>1000,21551=>1000,21552=>1000,21553=>1000,21554=>1000,21555=>1000,21556=>1000,21557=>1000,21558=>1000,21559=>1000,21560=>1000,21561=>1000,21562=>1000,21563=>1000,21564=>1000,21565=>1000,21566=>1000,21567=>1000,21568=>1000,21569=>1000,21570=>1000,21571=>1000,21572=>1000,21573=>1000,21574=>1000,21575=>1000,21576=>1000,21577=>1000,21578=>1000,21579=>1000,21580=>1000,21581=>1000,21582=>1000,21583=>1000,21584=>1000,21585=>1000,21586=>1000,21587=>1000,21588=>1000,21589=>1000,21590=>1000,21591=>1000,21592=>1000,21593=>1000,21594=>1000,21595=>1000,21596=>1000,21597=>1000,21598=>1000,21599=>1000,21600=>1000,21601=>1000,21602=>1000,21603=>1000,21604=>1000,21605=>1000,21606=>1000,21607=>1000,21608=>1000,21609=>1000,21610=>1000,21611=>1000,21612=>1000,21613=>1000,21614=>1000,21615=>1000,21616=>1000,21617=>1000,21618=>1000,21619=>1000,21620=>1000,21621=>1000,21622=>1000,21623=>1000,21624=>1000,21625=>1000,21626=>1000,21627=>1000,21628=>1000,21629=>1000,21630=>1000,21631=>1000,21632=>1000,21633=>1000,21634=>1000,21635=>1000,21636=>1000,21637=>1000,21638=>1000,21639=>1000,21640=>1000,21641=>1000,21642=>1000,21643=>1000,21644=>1000,21645=>1000,21646=>1000,21647=>1000,21648=>1000,21649=>1000,21650=>1000,21651=>1000,21652=>1000,21653=>1000,21654=>1000,21655=>1000,21656=>1000,21657=>1000,21658=>1000,21659=>1000,21660=>1000,21661=>1000,21662=>1000,21663=>1000,21664=>1000,21665=>1000,21666=>1000,21667=>1000,21668=>1000,21669=>1000,21670=>1000,21671=>1000,21672=>1000,21673=>1000,21674=>1000,21675=>1000,21676=>1000,21677=>1000,21678=>1000,21679=>1000,21680=>1000,21681=>1000,21682=>1000,21683=>1000,21684=>1000,21685=>1000,21686=>1000,21687=>1000,21688=>1000,21689=>1000,21690=>1000,21691=>1000,21692=>1000,21693=>1000,21694=>1000,21695=>1000,21696=>1000,21697=>1000,21698=>1000,21699=>1000,21700=>1000,21701=>1000,21702=>1000,21703=>1000,21704=>1000,21705=>1000,21706=>1000,21707=>1000,21708=>1000,21709=>1000,21710=>1000,21711=>1000,21712=>1000,21713=>1000,21714=>1000,21715=>1000,21716=>1000,21717=>1000,21718=>1000,21719=>1000,21720=>1000,21721=>1000,21722=>1000,21723=>1000,21724=>1000,21725=>1000,21726=>1000,21727=>1000,21728=>1000,21729=>1000,21730=>1000,21731=>1000,21732=>1000,21733=>1000,21734=>1000,21735=>1000,21736=>1000,21737=>1000,21738=>1000,21739=>1000,21740=>1000,21741=>1000,21742=>1000,21743=>1000,21744=>1000,21745=>1000,21746=>1000,21747=>1000,21748=>1000,21749=>1000,21750=>1000,21751=>1000,21752=>1000,21753=>1000,21754=>1000,21755=>1000,21756=>1000,21757=>1000,21758=>1000,21759=>1000,21760=>1000,21761=>1000,21762=>1000,21763=>1000,21764=>1000,21765=>1000,21766=>1000,21767=>1000,21768=>1000,21769=>1000,21770=>1000,21771=>1000,21772=>1000,21773=>1000,21774=>1000,21775=>1000,21776=>1000,21777=>1000,21778=>1000,21779=>1000,21780=>1000,21781=>1000,21782=>1000,21783=>1000,21784=>1000,21785=>1000,21786=>1000,21787=>1000,21788=>1000,21789=>1000,21790=>1000,21791=>1000,21792=>1000,21793=>1000,21794=>1000,21795=>1000,21796=>1000,21797=>1000,21798=>1000,21799=>1000,21800=>1000,21801=>1000,21802=>1000,21803=>1000,21804=>1000,21805=>1000,21806=>1000,21807=>1000,21808=>1000,21809=>1000,21810=>1000,21811=>1000,21812=>1000,21813=>1000,21814=>1000,21815=>1000,21816=>1000,21817=>1000,21818=>1000,21819=>1000,21820=>1000,21821=>1000,21822=>1000,21823=>1000,21824=>1000,21825=>1000,21826=>1000,21827=>1000,21828=>1000,21829=>1000,21830=>1000,21831=>1000,21832=>1000,21833=>1000,21834=>1000,21835=>1000,21836=>1000,21837=>1000,21838=>1000,21839=>1000,21840=>1000,21841=>1000,21842=>1000,21843=>1000,21844=>1000,21845=>1000,21846=>1000,21847=>1000,21848=>1000,21849=>1000,21850=>1000,21851=>1000,21852=>1000,21853=>1000,21854=>1000,21855=>1000,21856=>1000,21857=>1000,21858=>1000,21859=>1000,21860=>1000,21861=>1000,21862=>1000,21863=>1000,21864=>1000,21865=>1000,21866=>1000,21867=>1000,21868=>1000,21869=>1000,21870=>1000,21871=>1000,21872=>1000,21873=>1000,21874=>1000,21875=>1000,21876=>1000,21877=>1000,21878=>1000,21879=>1000,21880=>1000,21881=>1000,21882=>1000,21883=>1000,21884=>1000,21885=>1000,21886=>1000,21887=>1000,21888=>1000,21889=>1000,21890=>1000,21891=>1000,21892=>1000,21893=>1000,21894=>1000,21895=>1000,21896=>1000,21897=>1000,21898=>1000,21899=>1000,21900=>1000,21901=>1000,21902=>1000,21903=>1000,21904=>1000,21905=>1000,21906=>1000,21907=>1000,21908=>1000,21909=>1000,21910=>1000,21911=>1000,21912=>1000,21913=>1000,21914=>1000,21915=>1000,21916=>1000,21917=>1000,21918=>1000,21919=>1000,21920=>1000,21921=>1000,21922=>1000,21923=>1000,21924=>1000,21925=>1000,21926=>1000,21927=>1000,21928=>1000,21929=>1000,21930=>1000,21931=>1000,21932=>1000,21933=>1000,21934=>1000,21935=>1000,21936=>1000,21937=>1000,21938=>1000,21939=>1000,21940=>1000,21941=>1000,21942=>1000,21943=>1000,21944=>1000,21945=>1000,21946=>1000,21947=>1000,21948=>1000,21949=>1000,21950=>1000,21951=>1000,21952=>1000,21953=>1000,21954=>1000,21955=>1000,21956=>1000,21957=>1000,21958=>1000,21959=>1000,21960=>1000,21961=>1000,21962=>1000,21963=>1000,21964=>1000,21965=>1000,21966=>1000,21967=>1000,21968=>1000,21969=>1000,21970=>1000,21971=>1000,21972=>1000,21973=>1000,21974=>1000,21975=>1000,21976=>1000,21977=>1000,21978=>1000,21979=>1000,21980=>1000,21981=>1000,21982=>1000,21983=>1000,21984=>1000,21985=>1000,21986=>1000,21987=>1000,21988=>1000,21989=>1000,21990=>1000,21991=>1000,21992=>1000,21993=>1000,21994=>1000,21995=>1000,21996=>1000,21997=>1000,21998=>1000,21999=>1000,22000=>1000,22001=>1000,22002=>1000,22003=>1000,22004=>1000,22005=>1000,22006=>1000,22007=>1000,22008=>1000,22009=>1000,22010=>1000,22011=>1000,22012=>1000,22013=>1000,22014=>1000,22015=>1000,22016=>1000,22017=>1000,22018=>1000,22019=>1000,22020=>1000,22021=>1000,22022=>1000,22023=>1000,22024=>1000,22025=>1000,22026=>1000,22027=>1000,22028=>1000,22029=>1000,22030=>1000,22031=>1000,22032=>1000,22033=>1000,22034=>1000,22035=>1000,22036=>1000,22037=>1000,22038=>1000,22039=>1000,22040=>1000,22041=>1000,22042=>1000,22043=>1000,22044=>1000,22045=>1000,22046=>1000,22047=>1000,22048=>1000,22049=>1000,22050=>1000,22051=>1000,22052=>1000,22053=>1000,22054=>1000,22055=>1000,22056=>1000,22057=>1000,22058=>1000,22059=>1000,22060=>1000,22061=>1000,22062=>1000,22063=>1000,22064=>1000,22065=>1000,22066=>1000,22067=>1000,22068=>1000,22069=>1000,22070=>1000,22071=>1000,22072=>1000,22073=>1000,22074=>1000,22075=>1000,22076=>1000,22077=>1000,22078=>1000,22079=>1000,22080=>1000,22081=>1000,22082=>1000,22083=>1000,22084=>1000,22085=>1000,22086=>1000,22087=>1000,22088=>1000,22089=>1000,22090=>1000,22091=>1000,22092=>1000,22093=>1000,22094=>1000,22095=>1000,22096=>1000,22097=>1000,22098=>1000,22099=>1000,22100=>1000,22101=>1000,22102=>1000,22103=>1000,22104=>1000,22105=>1000,22106=>1000,22107=>1000,22108=>1000,22109=>1000,22110=>1000,22111=>1000,22112=>1000,22113=>1000,22114=>1000,22115=>1000,22116=>1000,22117=>1000,22118=>1000,22119=>1000,22120=>1000,22121=>1000,22122=>1000,22123=>1000,22124=>1000,22125=>1000,22126=>1000,22127=>1000,22128=>1000,22129=>1000,22130=>1000,22131=>1000,22132=>1000,22133=>1000,22134=>1000,22135=>1000,22136=>1000,22137=>1000,22138=>1000,22139=>1000,22140=>1000,22141=>1000,22142=>1000,22143=>1000,22144=>1000,22145=>1000,22146=>1000,22147=>1000,22148=>1000,22149=>1000,22150=>1000,22151=>1000,22152=>1000,22153=>1000,22154=>1000,22155=>1000,22156=>1000,22157=>1000,22158=>1000,22159=>1000,22160=>1000,22161=>1000,22162=>1000,22163=>1000,22164=>1000,22165=>1000,22166=>1000,22167=>1000,22168=>1000,22169=>1000,22170=>1000,22171=>1000,22172=>1000,22173=>1000,22174=>1000,22175=>1000,22176=>1000,22177=>1000,22178=>1000,22179=>1000,22180=>1000,22181=>1000,22182=>1000,22183=>1000,22184=>1000,22185=>1000,22186=>1000,22187=>1000,22188=>1000,22189=>1000,22190=>1000,22191=>1000,22192=>1000,22193=>1000,22194=>1000,22195=>1000,22196=>1000,22197=>1000,22198=>1000,22199=>1000,22200=>1000,22201=>1000,22202=>1000,22203=>1000,22204=>1000,22205=>1000,22206=>1000,22207=>1000,22208=>1000,22209=>1000,22210=>1000,22211=>1000,22212=>1000,22213=>1000,22214=>1000,22215=>1000,22216=>1000,22217=>1000,22218=>1000,22219=>1000,22220=>1000,22221=>1000,22222=>1000,22223=>1000,22224=>1000,22225=>1000,22226=>1000,22227=>1000,22228=>1000,22229=>1000,22230=>1000,22231=>1000,22232=>1000,22233=>1000,22234=>1000,22235=>1000,22236=>1000,22237=>1000,22238=>1000,22239=>1000,22240=>1000,22241=>1000,22242=>1000,22243=>1000,22244=>1000,22245=>1000,22246=>1000,22247=>1000,22248=>1000,22249=>1000,22250=>1000,22251=>1000,22252=>1000,22253=>1000,22254=>1000,22255=>1000,22256=>1000,22257=>1000,22258=>1000,22259=>1000,22260=>1000,22261=>1000,22262=>1000,22263=>1000,22264=>1000,22265=>1000,22266=>1000,22267=>1000,22268=>1000,22269=>1000,22270=>1000,22271=>1000,22272=>1000,22273=>1000,22274=>1000,22275=>1000,22276=>1000,22277=>1000,22278=>1000,22279=>1000,22280=>1000,22281=>1000,22282=>1000,22283=>1000,22284=>1000,22285=>1000,22286=>1000,22287=>1000,22288=>1000,22289=>1000,22290=>1000,22291=>1000,22292=>1000,22293=>1000,22294=>1000,22295=>1000,22296=>1000,22297=>1000,22298=>1000,22299=>1000,22300=>1000,22301=>1000,22302=>1000,22303=>1000,22304=>1000,22305=>1000,22306=>1000,22307=>1000,22308=>1000,22309=>1000,22310=>1000,22311=>1000,22312=>1000,22313=>1000,22314=>1000,22315=>1000,22316=>1000,22317=>1000,22318=>1000,22319=>1000,22320=>1000,22321=>1000,22322=>1000,22323=>1000,22324=>1000,22325=>1000,22326=>1000,22327=>1000,22328=>1000,22329=>1000,22330=>1000,22331=>1000,22332=>1000,22333=>1000,22334=>1000,22335=>1000,22336=>1000,22337=>1000,22338=>1000,22339=>1000,22340=>1000,22341=>1000,22342=>1000,22343=>1000,22344=>1000,22345=>1000,22346=>1000,22347=>1000,22348=>1000,22349=>1000,22350=>1000,22351=>1000,22352=>1000,22353=>1000,22354=>1000,22355=>1000,22356=>1000,22357=>1000,22358=>1000,22359=>1000,22360=>1000,22361=>1000,22362=>1000,22363=>1000,22364=>1000,22365=>1000,22366=>1000,22367=>1000,22368=>1000,22369=>1000,22370=>1000,22371=>1000,22372=>1000,22373=>1000,22374=>1000,22375=>1000,22376=>1000,22377=>1000,22378=>1000,22379=>1000,22380=>1000,22381=>1000,22382=>1000,22383=>1000,22384=>1000,22385=>1000,22386=>1000,22387=>1000,22388=>1000,22389=>1000,22390=>1000,22391=>1000,22392=>1000,22393=>1000,22394=>1000,22395=>1000,22396=>1000,22397=>1000,22398=>1000,22399=>1000,22400=>1000,22401=>1000,22402=>1000,22403=>1000,22404=>1000,22405=>1000,22406=>1000,22407=>1000,22408=>1000,22409=>1000,22410=>1000,22411=>1000,22412=>1000,22413=>1000,22414=>1000,22415=>1000,22416=>1000,22417=>1000,22418=>1000,22419=>1000,22420=>1000,22421=>1000,22422=>1000,22423=>1000,22424=>1000,22425=>1000,22426=>1000,22427=>1000,22428=>1000,22429=>1000,22430=>1000,22431=>1000,22432=>1000,22433=>1000,22434=>1000,22435=>1000,22436=>1000,22437=>1000,22438=>1000,22439=>1000,22440=>1000,22441=>1000,22442=>1000,22443=>1000,22444=>1000,22445=>1000,22446=>1000,22447=>1000,22448=>1000,22449=>1000,22450=>1000,22451=>1000,22452=>1000,22453=>1000,22454=>1000,22455=>1000,22456=>1000,22457=>1000,22458=>1000,22459=>1000,22460=>1000,22461=>1000,22462=>1000,22463=>1000,22464=>1000,22465=>1000,22466=>1000,22467=>1000,22468=>1000,22469=>1000,22470=>1000,22471=>1000,22472=>1000,22473=>1000,22474=>1000,22475=>1000,22476=>1000,22477=>1000,22478=>1000,22479=>1000,22480=>1000,22481=>1000,22482=>1000,22483=>1000,22484=>1000,22485=>1000,22486=>1000,22487=>1000,22488=>1000,22489=>1000,22490=>1000,22491=>1000,22492=>1000,22493=>1000,22494=>1000,22495=>1000,22496=>1000,22497=>1000,22498=>1000,22499=>1000,22500=>1000,22501=>1000,22502=>1000,22503=>1000,22504=>1000,22505=>1000,22506=>1000,22507=>1000,22508=>1000,22509=>1000,22510=>1000,22511=>1000,22512=>1000,22513=>1000,22514=>1000,22515=>1000,22516=>1000,22517=>1000,22518=>1000,22519=>1000,22520=>1000,22521=>1000,22522=>1000,22523=>1000,22524=>1000,22525=>1000,22526=>1000,22527=>1000,22528=>1000,22529=>1000,22530=>1000,22531=>1000,22532=>1000,22533=>1000,22534=>1000,22535=>1000,22536=>1000,22537=>1000,22538=>1000,22539=>1000,22540=>1000,22541=>1000,22542=>1000,22543=>1000,22544=>1000,22545=>1000,22546=>1000,22547=>1000,22548=>1000,22549=>1000,22550=>1000,22551=>1000,22552=>1000,22553=>1000,22554=>1000,22555=>1000,22556=>1000,22557=>1000,22558=>1000,22559=>1000,22560=>1000,22561=>1000,22562=>1000,22563=>1000,22564=>1000,22565=>1000,22566=>1000,22567=>1000,22568=>1000,22569=>1000,22570=>1000,22571=>1000,22572=>1000,22573=>1000,22574=>1000,22575=>1000,22576=>1000,22577=>1000,22578=>1000,22579=>1000,22580=>1000,22581=>1000,22582=>1000,22583=>1000,22584=>1000,22585=>1000,22586=>1000,22587=>1000,22588=>1000,22589=>1000,22590=>1000,22591=>1000,22592=>1000,22593=>1000,22594=>1000,22595=>1000,22596=>1000,22597=>1000,22598=>1000,22599=>1000,22600=>1000,22601=>1000,22602=>1000,22603=>1000,22604=>1000,22605=>1000,22606=>1000,22607=>1000,22608=>1000,22609=>1000,22610=>1000,22611=>1000,22612=>1000,22613=>1000,22614=>1000,22615=>1000,22616=>1000,22617=>1000,22618=>1000,22619=>1000,22620=>1000,22621=>1000,22622=>1000,22623=>1000,22624=>1000,22625=>1000,22626=>1000,22627=>1000,22628=>1000,22629=>1000,22630=>1000,22631=>1000,22632=>1000,22633=>1000,22634=>1000,22635=>1000,22636=>1000,22637=>1000,22638=>1000,22639=>1000,22640=>1000,22641=>1000,22642=>1000,22643=>1000,22644=>1000,22645=>1000,22646=>1000,22647=>1000,22648=>1000,22649=>1000,22650=>1000,22651=>1000,22652=>1000,22653=>1000,22654=>1000,22655=>1000,22656=>1000,22657=>1000,22658=>1000,22659=>1000,22660=>1000,22661=>1000,22662=>1000,22663=>1000,22664=>1000,22665=>1000,22666=>1000,22667=>1000,22668=>1000,22669=>1000,22670=>1000,22671=>1000,22672=>1000,22673=>1000,22674=>1000,22675=>1000,22676=>1000,22677=>1000,22678=>1000,22679=>1000,22680=>1000,22681=>1000,22682=>1000,22683=>1000,22684=>1000,22685=>1000,22686=>1000,22687=>1000,22688=>1000,22689=>1000,22690=>1000,22691=>1000,22692=>1000,22693=>1000,22694=>1000,22695=>1000,22696=>1000,22697=>1000,22698=>1000,22699=>1000,22700=>1000,22701=>1000,22702=>1000,22703=>1000,22704=>1000,22705=>1000,22706=>1000,22707=>1000,22708=>1000,22709=>1000,22710=>1000,22711=>1000,22712=>1000,22713=>1000,22714=>1000,22715=>1000,22716=>1000,22717=>1000,22718=>1000,22719=>1000,22720=>1000,22721=>1000,22722=>1000,22723=>1000,22724=>1000,22725=>1000,22726=>1000,22727=>1000,22728=>1000,22729=>1000,22730=>1000,22731=>1000,22732=>1000,22733=>1000,22734=>1000,22735=>1000,22736=>1000,22737=>1000,22738=>1000,22739=>1000,22740=>1000,22741=>1000,22742=>1000,22743=>1000,22744=>1000,22745=>1000,22746=>1000,22747=>1000,22748=>1000,22749=>1000,22750=>1000,22751=>1000,22752=>1000,22753=>1000,22754=>1000,22755=>1000,22756=>1000,22757=>1000,22758=>1000,22759=>1000,22760=>1000,22761=>1000,22762=>1000,22763=>1000,22764=>1000,22765=>1000,22766=>1000,22767=>1000,22768=>1000,22769=>1000,22770=>1000,22771=>1000,22772=>1000,22773=>1000,22774=>1000,22775=>1000,22776=>1000,22777=>1000,22778=>1000,22779=>1000,22780=>1000,22781=>1000,22782=>1000,22783=>1000,22784=>1000,22785=>1000,22786=>1000,22787=>1000,22788=>1000,22789=>1000,22790=>1000,22791=>1000,22792=>1000,22793=>1000,22794=>1000,22795=>1000,22796=>1000,22797=>1000,22798=>1000,22799=>1000,22800=>1000,22801=>1000,22802=>1000,22803=>1000,22804=>1000,22805=>1000,22806=>1000,22807=>1000,22808=>1000,22809=>1000,22810=>1000,22811=>1000,22812=>1000,22813=>1000,22814=>1000,22815=>1000,22816=>1000,22817=>1000,22818=>1000,22819=>1000,22820=>1000,22821=>1000,22822=>1000,22823=>1000,22824=>1000,22825=>1000,22826=>1000,22827=>1000,22828=>1000,22829=>1000,22830=>1000,22831=>1000,22832=>1000,22833=>1000,22834=>1000,22835=>1000,22836=>1000,22837=>1000,22838=>1000,22839=>1000,22840=>1000,22841=>1000,22842=>1000,22843=>1000,22844=>1000,22845=>1000,22846=>1000,22847=>1000,22848=>1000,22849=>1000,22850=>1000,22851=>1000,22852=>1000,22853=>1000,22854=>1000,22855=>1000,22856=>1000,22857=>1000,22858=>1000,22859=>1000,22860=>1000,22861=>1000,22862=>1000,22863=>1000,22864=>1000,22865=>1000,22866=>1000,22867=>1000,22868=>1000,22869=>1000,22870=>1000,22871=>1000,22872=>1000,22873=>1000,22874=>1000,22875=>1000,22876=>1000,22877=>1000,22878=>1000,22879=>1000,22880=>1000,22881=>1000,22882=>1000,22883=>1000,22884=>1000,22885=>1000,22886=>1000,22887=>1000,22888=>1000,22889=>1000,22890=>1000,22891=>1000,22892=>1000,22893=>1000,22894=>1000,22895=>1000,22896=>1000,22897=>1000,22898=>1000,22899=>1000,22900=>1000,22901=>1000,22902=>1000,22903=>1000,22904=>1000,22905=>1000,22906=>1000,22907=>1000,22908=>1000,22909=>1000,22910=>1000,22911=>1000,22912=>1000,22913=>1000,22914=>1000,22915=>1000,22916=>1000,22917=>1000,22918=>1000,22919=>1000,22920=>1000,22921=>1000,22922=>1000,22923=>1000,22924=>1000,22925=>1000,22926=>1000,22927=>1000,22928=>1000,22929=>1000,22930=>1000,22931=>1000,22932=>1000,22933=>1000,22934=>1000,22935=>1000,22936=>1000,22937=>1000,22938=>1000,22939=>1000,22940=>1000,22941=>1000,22942=>1000,22943=>1000,22944=>1000,22945=>1000,22946=>1000,22947=>1000,22948=>1000,22949=>1000,22950=>1000,22951=>1000,22952=>1000,22953=>1000,22954=>1000,22955=>1000,22956=>1000,22957=>1000,22958=>1000,22959=>1000,22960=>1000,22961=>1000,22962=>1000,22963=>1000,22964=>1000,22965=>1000,22966=>1000,22967=>1000,22968=>1000,22969=>1000,22970=>1000,22971=>1000,22972=>1000,22973=>1000,22974=>1000,22975=>1000,22976=>1000,22977=>1000,22978=>1000,22979=>1000,22980=>1000,22981=>1000,22982=>1000,22983=>1000,22984=>1000,22985=>1000,22986=>1000,22987=>1000,22988=>1000,22989=>1000,22990=>1000,22991=>1000,22992=>1000,22993=>1000,22994=>1000,22995=>1000,22996=>1000,22997=>1000,22998=>1000,22999=>1000,23000=>1000,23001=>1000,23002=>1000,23003=>1000,23004=>1000,23005=>1000,23006=>1000,23007=>1000,23008=>1000,23009=>1000,23010=>1000,23011=>1000,23012=>1000,23013=>1000,23014=>1000,23015=>1000,23016=>1000,23017=>1000,23018=>1000,23019=>1000,23020=>1000,23021=>1000,23022=>1000,23023=>1000,23024=>1000,23025=>1000,23026=>1000,23027=>1000,23028=>1000,23029=>1000,23030=>1000,23031=>1000,23032=>1000,23033=>1000,23034=>1000,23035=>1000,23036=>1000,23037=>1000,23038=>1000,23039=>1000,23040=>1000,23041=>1000,23042=>1000,23043=>1000,23044=>1000,23045=>1000,23046=>1000,23047=>1000,23048=>1000,23049=>1000,23050=>1000,23051=>1000,23052=>1000,23053=>1000,23054=>1000,23055=>1000,23056=>1000,23057=>1000,23058=>1000,23059=>1000,23060=>1000,23061=>1000,23062=>1000,23063=>1000,23064=>1000,23065=>1000,23066=>1000,23067=>1000,23068=>1000,23069=>1000,23070=>1000,23071=>1000,23072=>1000,23073=>1000,23074=>1000,23075=>1000,23076=>1000,23077=>1000,23078=>1000,23079=>1000,23080=>1000,23081=>1000,23082=>1000,23083=>1000,23084=>1000,23085=>1000,23086=>1000,23087=>1000,23088=>1000,23089=>1000,23090=>1000,23091=>1000,23092=>1000,23093=>1000,23094=>1000,23095=>1000,23096=>1000,23097=>1000,23098=>1000,23099=>1000,23100=>1000,23101=>1000,23102=>1000,23103=>1000,23104=>1000,23105=>1000,23106=>1000,23107=>1000,23108=>1000,23109=>1000,23110=>1000,23111=>1000,23112=>1000,23113=>1000,23114=>1000,23115=>1000,23116=>1000,23117=>1000,23118=>1000,23119=>1000,23120=>1000,23121=>1000,23122=>1000,23123=>1000,23124=>1000,23125=>1000,23126=>1000,23127=>1000,23128=>1000,23129=>1000,23130=>1000,23131=>1000,23132=>1000,23133=>1000,23134=>1000,23135=>1000,23136=>1000,23137=>1000,23138=>1000,23139=>1000,23140=>1000,23141=>1000,23142=>1000,23143=>1000,23144=>1000,23145=>1000,23146=>1000,23147=>1000,23148=>1000,23149=>1000,23150=>1000,23151=>1000,23152=>1000,23153=>1000,23154=>1000,23155=>1000,23156=>1000,23157=>1000,23158=>1000,23159=>1000,23160=>1000,23161=>1000,23162=>1000,23163=>1000,23164=>1000,23165=>1000,23166=>1000,23167=>1000,23168=>1000,23169=>1000,23170=>1000,23171=>1000,23172=>1000,23173=>1000,23174=>1000,23175=>1000,23176=>1000,23177=>1000,23178=>1000,23179=>1000,23180=>1000,23181=>1000,23182=>1000,23183=>1000,23184=>1000,23185=>1000,23186=>1000,23187=>1000,23188=>1000,23189=>1000,23190=>1000,23191=>1000,23192=>1000,23193=>1000,23194=>1000,23195=>1000,23196=>1000,23197=>1000,23198=>1000,23199=>1000,23200=>1000,23201=>1000,23202=>1000,23203=>1000,23204=>1000,23205=>1000,23206=>1000,23207=>1000,23208=>1000,23209=>1000,23210=>1000,23211=>1000,23212=>1000,23213=>1000,23214=>1000,23215=>1000,23216=>1000,23217=>1000,23218=>1000,23219=>1000,23220=>1000,23221=>1000,23222=>1000,23223=>1000,23224=>1000,23225=>1000,23226=>1000,23227=>1000,23228=>1000,23229=>1000,23230=>1000,23231=>1000,23232=>1000,23233=>1000,23234=>1000,23235=>1000,23236=>1000,23237=>1000,23238=>1000,23239=>1000,23240=>1000,23241=>1000,23242=>1000,23243=>1000,23244=>1000,23245=>1000,23246=>1000,23247=>1000,23248=>1000,23249=>1000,23250=>1000,23251=>1000,23252=>1000,23253=>1000,23254=>1000,23255=>1000,23256=>1000,23257=>1000,23258=>1000,23259=>1000,23260=>1000,23261=>1000,23262=>1000,23263=>1000,23264=>1000,23265=>1000,23266=>1000,23267=>1000,23268=>1000,23269=>1000,23270=>1000,23271=>1000,23272=>1000,23273=>1000,23274=>1000,23275=>1000,23276=>1000,23277=>1000,23278=>1000,23279=>1000,23280=>1000,23281=>1000,23282=>1000,23283=>1000,23284=>1000,23285=>1000,23286=>1000,23287=>1000,23288=>1000,23289=>1000,23290=>1000,23291=>1000,23292=>1000,23293=>1000,23294=>1000,23295=>1000,23296=>1000,23297=>1000,23298=>1000,23299=>1000,23300=>1000,23301=>1000,23302=>1000,23303=>1000,23304=>1000,23305=>1000,23306=>1000,23307=>1000,23308=>1000,23309=>1000,23310=>1000,23311=>1000,23312=>1000,23313=>1000,23314=>1000,23315=>1000,23316=>1000,23317=>1000,23318=>1000,23319=>1000,23320=>1000,23321=>1000,23322=>1000,23323=>1000,23324=>1000,23325=>1000,23326=>1000,23327=>1000,23328=>1000,23329=>1000,23330=>1000,23331=>1000,23332=>1000,23333=>1000,23334=>1000,23335=>1000,23336=>1000,23337=>1000,23338=>1000,23339=>1000,23340=>1000,23341=>1000,23342=>1000,23343=>1000,23344=>1000,23345=>1000,23346=>1000,23347=>1000,23348=>1000,23349=>1000,23350=>1000,23351=>1000,23352=>1000,23353=>1000,23354=>1000,23355=>1000,23356=>1000,23357=>1000,23358=>1000,23359=>1000,23360=>1000,23361=>1000,23362=>1000,23363=>1000,23364=>1000,23365=>1000,23366=>1000,23367=>1000,23368=>1000,23369=>1000,23370=>1000,23371=>1000,23372=>1000,23373=>1000,23374=>1000,23375=>1000,23376=>1000,23377=>1000,23378=>1000,23379=>1000,23380=>1000,23381=>1000,23382=>1000,23383=>1000,23384=>1000,23385=>1000,23386=>1000,23387=>1000,23388=>1000,23389=>1000,23390=>1000,23391=>1000,23392=>1000,23393=>1000,23394=>1000,23395=>1000,23396=>1000,23397=>1000,23398=>1000,23399=>1000,23400=>1000,23401=>1000,23402=>1000,23403=>1000,23404=>1000,23405=>1000,23406=>1000,23407=>1000,23408=>1000,23409=>1000,23410=>1000,23411=>1000,23412=>1000,23413=>1000,23414=>1000,23415=>1000,23416=>1000,23417=>1000,23418=>1000,23419=>1000,23420=>1000,23421=>1000,23422=>1000,23423=>1000,23424=>1000,23425=>1000,23426=>1000,23427=>1000,23428=>1000,23429=>1000,23430=>1000,23431=>1000,23432=>1000,23433=>1000,23434=>1000,23435=>1000,23436=>1000,23437=>1000,23438=>1000,23439=>1000,23440=>1000,23441=>1000,23442=>1000,23443=>1000,23444=>1000,23445=>1000,23446=>1000,23447=>1000,23448=>1000,23449=>1000,23450=>1000,23451=>1000,23452=>1000,23453=>1000,23454=>1000,23455=>1000,23456=>1000,23457=>1000,23458=>1000,23459=>1000,23460=>1000,23461=>1000,23462=>1000,23463=>1000,23464=>1000,23465=>1000,23466=>1000,23467=>1000,23468=>1000,23469=>1000,23470=>1000,23471=>1000,23472=>1000,23473=>1000,23474=>1000,23475=>1000,23476=>1000,23477=>1000,23478=>1000,23479=>1000,23480=>1000,23481=>1000,23482=>1000,23483=>1000,23484=>1000,23485=>1000,23486=>1000,23487=>1000,23488=>1000,23489=>1000,23490=>1000,23491=>1000,23492=>1000,23493=>1000,23494=>1000,23495=>1000,23496=>1000,23497=>1000,23498=>1000,23499=>1000,23500=>1000,23501=>1000,23502=>1000,23503=>1000,23504=>1000,23505=>1000,23506=>1000,23507=>1000,23508=>1000,23509=>1000,23510=>1000,23511=>1000,23512=>1000,23513=>1000,23514=>1000,23515=>1000,23516=>1000,23517=>1000,23518=>1000,23519=>1000,23520=>1000,23521=>1000,23522=>1000,23523=>1000,23524=>1000,23525=>1000,23526=>1000,23527=>1000,23528=>1000,23529=>1000,23530=>1000,23531=>1000,23532=>1000,23533=>1000,23534=>1000,23535=>1000,23536=>1000,23537=>1000,23538=>1000,23539=>1000,23540=>1000,23541=>1000,23542=>1000,23543=>1000,23544=>1000,23545=>1000,23546=>1000,23547=>1000,23548=>1000,23549=>1000,23550=>1000,23551=>1000,23552=>1000,23553=>1000,23554=>1000,23555=>1000,23556=>1000,23557=>1000,23558=>1000,23559=>1000,23560=>1000,23561=>1000,23562=>1000,23563=>1000,23564=>1000,23565=>1000,23566=>1000,23567=>1000,23568=>1000,23569=>1000,23570=>1000,23571=>1000,23572=>1000,23573=>1000,23574=>1000,23575=>1000,23576=>1000,23577=>1000,23578=>1000,23579=>1000,23580=>1000,23581=>1000,23582=>1000,23583=>1000,23584=>1000,23585=>1000,23586=>1000,23587=>1000,23588=>1000,23589=>1000,23590=>1000,23591=>1000,23592=>1000,23593=>1000,23594=>1000,23595=>1000,23596=>1000,23597=>1000,23598=>1000,23599=>1000,23600=>1000,23601=>1000,23602=>1000,23603=>1000,23604=>1000,23605=>1000,23606=>1000,23607=>1000,23608=>1000,23609=>1000,23610=>1000,23611=>1000,23612=>1000,23613=>1000,23614=>1000,23615=>1000,23616=>1000,23617=>1000,23618=>1000,23619=>1000,23620=>1000,23621=>1000,23622=>1000,23623=>1000,23624=>1000,23625=>1000,23626=>1000,23627=>1000,23628=>1000,23629=>1000,23630=>1000,23631=>1000,23632=>1000,23633=>1000,23634=>1000,23635=>1000,23636=>1000,23637=>1000,23638=>1000,23639=>1000,23640=>1000,23641=>1000,23642=>1000,23643=>1000,23644=>1000,23645=>1000,23646=>1000,23647=>1000,23648=>1000,23649=>1000,23650=>1000,23651=>1000,23652=>1000,23653=>1000,23654=>1000,23655=>1000,23656=>1000,23657=>1000,23658=>1000,23659=>1000,23660=>1000,23661=>1000,23662=>1000,23663=>1000,23664=>1000,23665=>1000,23666=>1000,23667=>1000,23668=>1000,23669=>1000,23670=>1000,23671=>1000,23672=>1000,23673=>1000,23674=>1000,23675=>1000,23676=>1000,23677=>1000,23678=>1000,23679=>1000,23680=>1000,23681=>1000,23682=>1000,23683=>1000,23684=>1000,23685=>1000,23686=>1000,23687=>1000,23688=>1000,23689=>1000,23690=>1000,23691=>1000,23692=>1000,23693=>1000,23694=>1000,23695=>1000,23696=>1000,23697=>1000,23698=>1000,23699=>1000,23700=>1000,23701=>1000,23702=>1000,23703=>1000,23704=>1000,23705=>1000,23706=>1000,23707=>1000,23708=>1000,23709=>1000,23710=>1000,23711=>1000,23712=>1000,23713=>1000,23714=>1000,23715=>1000,23716=>1000,23717=>1000,23718=>1000,23719=>1000,23720=>1000,23721=>1000,23722=>1000,23723=>1000,23724=>1000,23725=>1000,23726=>1000,23727=>1000,23728=>1000,23729=>1000,23730=>1000,23731=>1000,23732=>1000,23733=>1000,23734=>1000,23735=>1000,23736=>1000,23737=>1000,23738=>1000,23739=>1000,23740=>1000,23741=>1000,23742=>1000,23743=>1000,23744=>1000,23745=>1000,23746=>1000,23747=>1000,23748=>1000,23749=>1000,23750=>1000,23751=>1000,23752=>1000,23753=>1000,23754=>1000,23755=>1000,23756=>1000,23757=>1000,23758=>1000,23759=>1000,23760=>1000,23761=>1000,23762=>1000,23763=>1000,23764=>1000,23765=>1000,23766=>1000,23767=>1000,23768=>1000,23769=>1000,23770=>1000,23771=>1000,23772=>1000,23773=>1000,23774=>1000,23775=>1000,23776=>1000,23777=>1000,23778=>1000,23779=>1000,23780=>1000,23781=>1000,23782=>1000,23783=>1000,23784=>1000,23785=>1000,23786=>1000,23787=>1000,23788=>1000,23789=>1000,23790=>1000,23791=>1000,23792=>1000,23793=>1000,23794=>1000,23795=>1000,23796=>1000,23797=>1000,23798=>1000,23799=>1000,23800=>1000,23801=>1000,23802=>1000,23803=>1000,23804=>1000,23805=>1000,23806=>1000,23807=>1000,23808=>1000,23809=>1000,23810=>1000,23811=>1000,23812=>1000,23813=>1000,23814=>1000,23815=>1000,23816=>1000,23817=>1000,23818=>1000,23819=>1000,23820=>1000,23821=>1000,23822=>1000,23823=>1000,23824=>1000,23825=>1000,23826=>1000,23827=>1000,23828=>1000,23829=>1000,23830=>1000,23831=>1000,23832=>1000,23833=>1000,23834=>1000,23835=>1000,23836=>1000,23837=>1000,23838=>1000,23839=>1000,23840=>1000,23841=>1000,23842=>1000,23843=>1000,23844=>1000,23845=>1000,23846=>1000,23847=>1000,23848=>1000,23849=>1000,23850=>1000,23851=>1000,23852=>1000,23853=>1000,23854=>1000,23855=>1000,23856=>1000,23857=>1000,23858=>1000,23859=>1000,23860=>1000,23861=>1000,23862=>1000,23863=>1000,23864=>1000,23865=>1000,23866=>1000,23867=>1000,23868=>1000,23869=>1000,23870=>1000,23871=>1000,23872=>1000,23873=>1000,23874=>1000,23875=>1000,23876=>1000,23877=>1000,23878=>1000,23879=>1000,23880=>1000,23881=>1000,23882=>1000,23883=>1000,23884=>1000,23885=>1000,23886=>1000,23887=>1000,23888=>1000,23889=>1000,23890=>1000,23891=>1000,23892=>1000,23893=>1000,23894=>1000,23895=>1000,23896=>1000,23897=>1000,23898=>1000,23899=>1000,23900=>1000,23901=>1000,23902=>1000,23903=>1000,23904=>1000,23905=>1000,23906=>1000,23907=>1000,23908=>1000,23909=>1000,23910=>1000,23911=>1000,23912=>1000,23913=>1000,23914=>1000,23915=>1000,23916=>1000,23917=>1000,23918=>1000,23919=>1000,23920=>1000,23921=>1000,23922=>1000,23923=>1000,23924=>1000,23925=>1000,23926=>1000,23927=>1000,23928=>1000,23929=>1000,23930=>1000,23931=>1000,23932=>1000,23933=>1000,23934=>1000,23935=>1000,23936=>1000,23937=>1000,23938=>1000,23939=>1000,23940=>1000,23941=>1000,23942=>1000,23943=>1000,23944=>1000,23945=>1000,23946=>1000,23947=>1000,23948=>1000,23949=>1000,23950=>1000,23951=>1000,23952=>1000,23953=>1000,23954=>1000,23955=>1000,23956=>1000,23957=>1000,23958=>1000,23959=>1000,23960=>1000,23961=>1000,23962=>1000,23963=>1000,23964=>1000,23965=>1000,23966=>1000,23967=>1000,23968=>1000,23969=>1000,23970=>1000,23971=>1000,23972=>1000,23973=>1000,23974=>1000,23975=>1000,23976=>1000,23977=>1000,23978=>1000,23979=>1000,23980=>1000,23981=>1000,23982=>1000,23983=>1000,23984=>1000,23985=>1000,23986=>1000,23987=>1000,23988=>1000,23989=>1000,23990=>1000,23991=>1000,23992=>1000,23993=>1000,23994=>1000,23995=>1000,23996=>1000,23997=>1000,23998=>1000,23999=>1000,24000=>1000,24001=>1000,24002=>1000,24003=>1000,24004=>1000,24005=>1000,24006=>1000,24007=>1000,24008=>1000,24009=>1000,24010=>1000,24011=>1000,24012=>1000,24013=>1000,24014=>1000,24015=>1000,24016=>1000,24017=>1000,24018=>1000,24019=>1000,24020=>1000,24021=>1000,24022=>1000,24023=>1000,24024=>1000,24025=>1000,24026=>1000,24027=>1000,24028=>1000,24029=>1000,24030=>1000,24031=>1000,24032=>1000,24033=>1000,24034=>1000,24035=>1000,24036=>1000,24037=>1000,24038=>1000,24039=>1000,24040=>1000,24041=>1000,24042=>1000,24043=>1000,24044=>1000,24045=>1000,24046=>1000,24047=>1000,24048=>1000,24049=>1000,24050=>1000,24051=>1000,24052=>1000,24053=>1000,24054=>1000,24055=>1000,24056=>1000,24057=>1000,24058=>1000,24059=>1000,24060=>1000,24061=>1000,24062=>1000,24063=>1000,24064=>1000,24065=>1000,24066=>1000,24067=>1000,24068=>1000,24069=>1000,24070=>1000,24071=>1000,24072=>1000,24073=>1000,24074=>1000,24075=>1000,24076=>1000,24077=>1000,24078=>1000,24079=>1000,24080=>1000,24081=>1000,24082=>1000,24083=>1000,24084=>1000,24085=>1000,24086=>1000,24087=>1000,24088=>1000,24089=>1000,24090=>1000,24091=>1000,24092=>1000,24093=>1000,24094=>1000,24095=>1000,24096=>1000,24097=>1000,24098=>1000,24099=>1000,24100=>1000,24101=>1000,24102=>1000,24103=>1000,24104=>1000,24105=>1000,24106=>1000,24107=>1000,24108=>1000,24109=>1000,24110=>1000,24111=>1000,24112=>1000,24113=>1000,24114=>1000,24115=>1000,24116=>1000,24117=>1000,24118=>1000,24119=>1000,24120=>1000,24121=>1000,24122=>1000,24123=>1000,24124=>1000,24125=>1000,24126=>1000,24127=>1000,24128=>1000,24129=>1000,24130=>1000,24131=>1000,24132=>1000,24133=>1000,24134=>1000,24135=>1000,24136=>1000,24137=>1000,24138=>1000,24139=>1000,24140=>1000,24141=>1000,24142=>1000,24143=>1000,24144=>1000,24145=>1000,24146=>1000,24147=>1000,24148=>1000,24149=>1000,24150=>1000,24151=>1000,24152=>1000,24153=>1000,24154=>1000,24155=>1000,24156=>1000,24157=>1000,24158=>1000,24159=>1000,24160=>1000,24161=>1000,24162=>1000,24163=>1000,24164=>1000,24165=>1000,24166=>1000,24167=>1000,24168=>1000,24169=>1000,24170=>1000,24171=>1000,24172=>1000,24173=>1000,24174=>1000,24175=>1000,24176=>1000,24177=>1000,24178=>1000,24179=>1000,24180=>1000,24181=>1000,24182=>1000,24183=>1000,24184=>1000,24185=>1000,24186=>1000,24187=>1000,24188=>1000,24189=>1000,24190=>1000,24191=>1000,24192=>1000,24193=>1000,24194=>1000,24195=>1000,24196=>1000,24197=>1000,24198=>1000,24199=>1000,24200=>1000,24201=>1000,24202=>1000,24203=>1000,24204=>1000,24205=>1000,24206=>1000,24207=>1000,24208=>1000,24209=>1000,24210=>1000,24211=>1000,24212=>1000,24213=>1000,24214=>1000,24215=>1000,24216=>1000,24217=>1000,24218=>1000,24219=>1000,24220=>1000,24221=>1000,24222=>1000,24223=>1000,24224=>1000,24225=>1000,24226=>1000,24227=>1000,24228=>1000,24229=>1000,24230=>1000,24231=>1000,24232=>1000,24233=>1000,24234=>1000,24235=>1000,24236=>1000,24237=>1000,24238=>1000,24239=>1000,24240=>1000,24241=>1000,24242=>1000,24243=>1000,24244=>1000,24245=>1000,24246=>1000,24247=>1000,24248=>1000,24249=>1000,24250=>1000,24251=>1000,24252=>1000,24253=>1000,24254=>1000,24255=>1000,24256=>1000,24257=>1000,24258=>1000,24259=>1000,24260=>1000,24261=>1000,24262=>1000,24263=>1000,24264=>1000,24265=>1000,24266=>1000,24267=>1000,24268=>1000,24269=>1000,24270=>1000,24271=>1000,24272=>1000,24273=>1000,24274=>1000,24275=>1000,24276=>1000,24277=>1000,24278=>1000,24279=>1000,24280=>1000,24281=>1000,24282=>1000,24283=>1000,24284=>1000,24285=>1000,24286=>1000,24287=>1000,24288=>1000,24289=>1000,24290=>1000,24291=>1000,24292=>1000,24293=>1000,24294=>1000,24295=>1000,24296=>1000,24297=>1000,24298=>1000,24299=>1000,24300=>1000,24301=>1000,24302=>1000,24303=>1000,24304=>1000,24305=>1000,24306=>1000,24307=>1000,24308=>1000,24309=>1000,24310=>1000,24311=>1000,24312=>1000,24313=>1000,24314=>1000,24315=>1000,24316=>1000,24317=>1000,24318=>1000,24319=>1000,24320=>1000,24321=>1000,24322=>1000,24323=>1000,24324=>1000,24325=>1000,24326=>1000,24327=>1000,24328=>1000,24329=>1000,24330=>1000,24331=>1000,24332=>1000,24333=>1000,24334=>1000,24335=>1000,24336=>1000,24337=>1000,24338=>1000,24339=>1000,24340=>1000,24341=>1000,24342=>1000,24343=>1000,24344=>1000,24345=>1000,24346=>1000,24347=>1000,24348=>1000,24349=>1000,24350=>1000,24351=>1000,24352=>1000,24353=>1000,24354=>1000,24355=>1000,24356=>1000,24357=>1000,24358=>1000,24359=>1000,24360=>1000,24361=>1000,24362=>1000,24363=>1000,24364=>1000,24365=>1000,24366=>1000,24367=>1000,24368=>1000,24369=>1000,24370=>1000,24371=>1000,24372=>1000,24373=>1000,24374=>1000,24375=>1000,24376=>1000,24377=>1000,24378=>1000,24379=>1000,24380=>1000,24381=>1000,24382=>1000,24383=>1000,24384=>1000,24385=>1000,24386=>1000,24387=>1000,24388=>1000,24389=>1000,24390=>1000,24391=>1000,24392=>1000,24393=>1000,24394=>1000,24395=>1000,24396=>1000,24397=>1000,24398=>1000,24399=>1000,24400=>1000,24401=>1000,24402=>1000,24403=>1000,24404=>1000,24405=>1000,24406=>1000,24407=>1000,24408=>1000,24409=>1000,24410=>1000,24411=>1000,24412=>1000,24413=>1000,24414=>1000,24415=>1000,24416=>1000,24417=>1000,24418=>1000,24419=>1000,24420=>1000,24421=>1000,24422=>1000,24423=>1000,24424=>1000,24425=>1000,24426=>1000,24427=>1000,24428=>1000,24429=>1000,24430=>1000,24431=>1000,24432=>1000,24433=>1000,24434=>1000,24435=>1000,24436=>1000,24437=>1000,24438=>1000,24439=>1000,24440=>1000,24441=>1000,24442=>1000,24443=>1000,24444=>1000,24445=>1000,24446=>1000,24447=>1000,24448=>1000,24449=>1000,24450=>1000,24451=>1000,24452=>1000,24453=>1000,24454=>1000,24455=>1000,24456=>1000,24457=>1000,24458=>1000,24459=>1000,24460=>1000,24461=>1000,24462=>1000,24463=>1000,24464=>1000,24465=>1000,24466=>1000,24467=>1000,24468=>1000,24469=>1000,24470=>1000,24471=>1000,24472=>1000,24473=>1000,24474=>1000,24475=>1000,24476=>1000,24477=>1000,24478=>1000,24479=>1000,24480=>1000,24481=>1000,24482=>1000,24483=>1000,24484=>1000,24485=>1000,24486=>1000,24487=>1000,24488=>1000,24489=>1000,24490=>1000,24491=>1000,24492=>1000,24493=>1000,24494=>1000,24495=>1000,24496=>1000,24497=>1000,24498=>1000,24499=>1000,24500=>1000,24501=>1000,24502=>1000,24503=>1000,24504=>1000,24505=>1000,24506=>1000,24507=>1000,24508=>1000,24509=>1000,24510=>1000,24511=>1000,24512=>1000,24513=>1000,24514=>1000,24515=>1000,24516=>1000,24517=>1000,24518=>1000,24519=>1000,24520=>1000,24521=>1000,24522=>1000,24523=>1000,24524=>1000,24525=>1000,24526=>1000,24527=>1000,24528=>1000,24529=>1000,24530=>1000,24531=>1000,24532=>1000,24533=>1000,24534=>1000,24535=>1000,24536=>1000,24537=>1000,24538=>1000,24539=>1000,24540=>1000,24541=>1000,24542=>1000,24543=>1000,24544=>1000,24545=>1000,24546=>1000,24547=>1000,24548=>1000,24549=>1000,24550=>1000,24551=>1000,24552=>1000,24553=>1000,24554=>1000,24555=>1000,24556=>1000,24557=>1000,24558=>1000,24559=>1000,24560=>1000,24561=>1000,24562=>1000,24563=>1000,24564=>1000,24565=>1000,24566=>1000,24567=>1000,24568=>1000,24569=>1000,24570=>1000,24571=>1000,24572=>1000,24573=>1000,24574=>1000,24575=>1000,24576=>1000,24577=>1000,24578=>1000,24579=>1000,24580=>1000,24581=>1000,24582=>1000,24583=>1000,24584=>1000,24585=>1000,24586=>1000,24587=>1000,24588=>1000,24589=>1000,24590=>1000,24591=>1000,24592=>1000,24593=>1000,24594=>1000,24595=>1000,24596=>1000,24597=>1000,24598=>1000,24599=>1000,24600=>1000,24601=>1000,24602=>1000,24603=>1000,24604=>1000,24605=>1000,24606=>1000,24607=>1000,24608=>1000,24609=>1000,24610=>1000,24611=>1000,24612=>1000,24613=>1000,24614=>1000,24615=>1000,24616=>1000,24617=>1000,24618=>1000,24619=>1000,24620=>1000,24621=>1000,24622=>1000,24623=>1000,24624=>1000,24625=>1000,24626=>1000,24627=>1000,24628=>1000,24629=>1000,24630=>1000,24631=>1000,24632=>1000,24633=>1000,24634=>1000,24635=>1000,24636=>1000,24637=>1000,24638=>1000,24639=>1000,24640=>1000,24641=>1000,24642=>1000,24643=>1000,24644=>1000,24645=>1000,24646=>1000,24647=>1000,24648=>1000,24649=>1000,24650=>1000,24651=>1000,24652=>1000,24653=>1000,24654=>1000,24655=>1000,24656=>1000,24657=>1000,24658=>1000,24659=>1000,24660=>1000,24661=>1000,24662=>1000,24663=>1000,24664=>1000,24665=>1000,24666=>1000,24667=>1000,24668=>1000,24669=>1000,24670=>1000,24671=>1000,24672=>1000,24673=>1000,24674=>1000,24675=>1000,24676=>1000,24677=>1000,24678=>1000,24679=>1000,24680=>1000,24681=>1000,24682=>1000,24683=>1000,24684=>1000,24685=>1000,24686=>1000,24687=>1000,24688=>1000,24689=>1000,24690=>1000,24691=>1000,24692=>1000,24693=>1000,24694=>1000,24695=>1000,24696=>1000,24697=>1000,24698=>1000,24699=>1000,24700=>1000,24701=>1000,24702=>1000,24703=>1000,24704=>1000,24705=>1000,24706=>1000,24707=>1000,24708=>1000,24709=>1000,24710=>1000,24711=>1000,24712=>1000,24713=>1000,24714=>1000,24715=>1000,24716=>1000,24717=>1000,24718=>1000,24719=>1000,24720=>1000,24721=>1000,24722=>1000,24723=>1000,24724=>1000,24725=>1000,24726=>1000,24727=>1000,24728=>1000,24729=>1000,24730=>1000,24731=>1000,24732=>1000,24733=>1000,24734=>1000,24735=>1000,24736=>1000,24737=>1000,24738=>1000,24739=>1000,24740=>1000,24741=>1000,24742=>1000,24743=>1000,24744=>1000,24745=>1000,24746=>1000,24747=>1000,24748=>1000,24749=>1000,24750=>1000,24751=>1000,24752=>1000,24753=>1000,24754=>1000,24755=>1000,24756=>1000,24757=>1000,24758=>1000,24759=>1000,24760=>1000,24761=>1000,24762=>1000,24763=>1000,24764=>1000,24765=>1000,24766=>1000,24767=>1000,24768=>1000,24769=>1000,24770=>1000,24771=>1000,24772=>1000,24773=>1000,24774=>1000,24775=>1000,24776=>1000,24777=>1000,24778=>1000,24779=>1000,24780=>1000,24781=>1000,24782=>1000,24783=>1000,24784=>1000,24785=>1000,24786=>1000,24787=>1000,24788=>1000,24789=>1000,24790=>1000,24791=>1000,24792=>1000,24793=>1000,24794=>1000,24795=>1000,24796=>1000,24797=>1000,24798=>1000,24799=>1000,24800=>1000,24801=>1000,24802=>1000,24803=>1000,24804=>1000,24805=>1000,24806=>1000,24807=>1000,24808=>1000,24809=>1000,24810=>1000,24811=>1000,24812=>1000,24813=>1000,24814=>1000,24815=>1000,24816=>1000,24817=>1000,24818=>1000,24819=>1000,24820=>1000,24821=>1000,24822=>1000,24823=>1000,24824=>1000,24825=>1000,24826=>1000,24827=>1000,24828=>1000,24829=>1000,24830=>1000,24831=>1000,24832=>1000,24833=>1000,24834=>1000,24835=>1000,24836=>1000,24837=>1000,24838=>1000,24839=>1000,24840=>1000,24841=>1000,24842=>1000,24843=>1000,24844=>1000,24845=>1000,24846=>1000,24847=>1000,24848=>1000,24849=>1000,24850=>1000,24851=>1000,24852=>1000,24853=>1000,24854=>1000,24855=>1000,24856=>1000,24857=>1000,24858=>1000,24859=>1000,24860=>1000,24861=>1000,24862=>1000,24863=>1000,24864=>1000,24865=>1000,24866=>1000,24867=>1000,24868=>1000,24869=>1000,24870=>1000,24871=>1000,24872=>1000,24873=>1000,24874=>1000,24875=>1000,24876=>1000,24877=>1000,24878=>1000,24879=>1000,24880=>1000,24881=>1000,24882=>1000,24883=>1000,24884=>1000,24885=>1000,24886=>1000,24887=>1000,24888=>1000,24889=>1000,24890=>1000,24891=>1000,24892=>1000,24893=>1000,24894=>1000,24895=>1000,24896=>1000,24897=>1000,24898=>1000,24899=>1000,24900=>1000,24901=>1000,24902=>1000,24903=>1000,24904=>1000,24905=>1000,24906=>1000,24907=>1000,24908=>1000,24909=>1000,24910=>1000,24911=>1000,24912=>1000,24913=>1000,24914=>1000,24915=>1000,24916=>1000,24917=>1000,24918=>1000,24919=>1000,24920=>1000,24921=>1000,24922=>1000,24923=>1000,24924=>1000,24925=>1000,24926=>1000,24927=>1000,24928=>1000,24929=>1000,24930=>1000,24931=>1000,24932=>1000,24933=>1000,24934=>1000,24935=>1000,24936=>1000,24937=>1000,24938=>1000,24939=>1000,24940=>1000,24941=>1000,24942=>1000,24943=>1000,24944=>1000,24945=>1000,24946=>1000,24947=>1000,24948=>1000,24949=>1000,24950=>1000,24951=>1000,24952=>1000,24953=>1000,24954=>1000,24955=>1000,24956=>1000,24957=>1000,24958=>1000,24959=>1000,24960=>1000,24961=>1001,24962=>1000,24963=>1000,24964=>1000,24965=>1000,24966=>1000,24967=>1000,24968=>1000,24969=>1000,24970=>1000,24971=>1000,24972=>1000,24973=>1000,24974=>1000,24975=>1000,24976=>1000,24977=>1000,24978=>1000,24979=>1000,24980=>1000,24981=>1000,24982=>1000,24983=>1000,24984=>1000,24985=>1000,24986=>1000,24987=>1000,24988=>1000,24989=>1000,24990=>1000,24991=>1000,24992=>1000,24993=>1000,24994=>1000,24995=>1000,24996=>1000,24997=>1000,24998=>1000,24999=>1000,25000=>1000,25001=>1000,25002=>1000,25003=>1000,25004=>1000,25005=>1000,25006=>1000,25007=>1000,25008=>1000,25009=>1000,25010=>1000,25011=>1000,25012=>1000,25013=>1000,25014=>1000,25015=>1000,25016=>1000,25017=>1000,25018=>1000,25019=>1000,25020=>1000,25021=>1000,25022=>1000,25023=>1000,25024=>1000,25025=>1000,25026=>1000,25027=>1000,25028=>1000,25029=>1000,25030=>1000,25031=>1000,25032=>1000,25033=>1000,25034=>1000,25035=>1000,25036=>1000,25037=>1000,25038=>1000,25039=>1000,25040=>1000,25041=>1000,25042=>1000,25043=>1000,25044=>1000,25045=>1000,25046=>1000,25047=>1000,25048=>1000,25049=>1000,25050=>1000,25051=>1000,25052=>1000,25053=>1000,25054=>1000,25055=>1000,25056=>1000,25057=>1000,25058=>1000,25059=>1000,25060=>1000,25061=>1000,25062=>1000,25063=>1000,25064=>1000,25065=>1000,25066=>1000,25067=>1000,25068=>1000,25069=>1000,25070=>1000,25071=>1000,25072=>1000,25073=>1000,25074=>1000,25075=>1000,25076=>1000,25077=>1000,25078=>1000,25079=>1000,25080=>1000,25081=>1000,25082=>1000,25083=>1000,25084=>1000,25085=>1000,25086=>1000,25087=>1000,25088=>1000,25089=>1000,25090=>1000,25091=>1000,25092=>1000,25093=>1000,25094=>1000,25095=>1000,25096=>1000,25097=>1000,25098=>1000,25099=>1000,25100=>1000,25101=>1000,25102=>1000,25103=>1000,25104=>1000,25105=>1000,25106=>1000,25107=>1000,25108=>1000,25109=>1000,25110=>1000,25111=>1000,25112=>1000,25113=>1000,25114=>1000,25115=>1000,25116=>1000,25117=>1000,25118=>1000,25119=>1000,25120=>1000,25121=>1000,25122=>1000,25123=>1000,25124=>1000,25125=>1000,25126=>1000,25127=>1000,25128=>1000,25129=>1000,25130=>1000,25131=>1000,25132=>1000,25133=>1000,25134=>1000,25135=>1000,25136=>1000,25137=>1000,25138=>1000,25139=>1000,25140=>1000,25141=>1000,25142=>1000,25143=>1000,25144=>1000,25145=>1000,25146=>1000,25147=>1000,25148=>1000,25149=>1000,25150=>1000,25151=>1000,25152=>1000,25153=>1000,25154=>1000,25155=>1000,25156=>1000,25157=>1000,25158=>1000,25159=>1000,25160=>1000,25161=>1000,25162=>1000,25163=>1000,25164=>1000,25165=>1000,25166=>1000,25167=>1000,25168=>1000,25169=>1000,25170=>1000,25171=>1000,25172=>1000,25173=>1000,25174=>1000,25175=>1000,25176=>1000,25177=>1000,25178=>1000,25179=>1000,25180=>1000,25181=>1000,25182=>1000,25183=>1000,25184=>1000,25185=>1000,25186=>1000,25187=>1000,25188=>1000,25189=>1000,25190=>1000,25191=>1000,25192=>1000,25193=>1000,25194=>1000,25195=>1000,25196=>1000,25197=>1000,25198=>1000,25199=>1000,25200=>1000,25201=>1000,25202=>1000,25203=>1000,25204=>1000,25205=>1000,25206=>1000,25207=>1000,25208=>1000,25209=>1000,25210=>1000,25211=>1000,25212=>1000,25213=>1000,25214=>1000,25215=>1000,25216=>1000,25217=>1000,25218=>1000,25219=>1000,25220=>1000,25221=>1000,25222=>1000,25223=>1000,25224=>1000,25225=>1000,25226=>1000,25227=>1000,25228=>1000,25229=>1000,25230=>1000,25231=>1000,25232=>1000,25233=>1000,25234=>1000,25235=>1000,25236=>1000,25237=>1000,25238=>1000,25239=>1000,25240=>1000,25241=>1000,25242=>1000,25243=>1000,25244=>1000,25245=>1000,25246=>1000,25247=>1000,25248=>1000,25249=>1000,25250=>1000,25251=>1000,25252=>1000,25253=>1000,25254=>1000,25255=>1000,25256=>1000,25257=>1000,25258=>1000,25259=>1000,25260=>1000,25261=>1000,25262=>1000,25263=>1000,25264=>1000,25265=>1000,25266=>1000,25267=>1000,25268=>1000,25269=>1000,25270=>1000,25271=>1000,25272=>1000,25273=>1000,25274=>1000,25275=>1000,25276=>1000,25277=>1000,25278=>1000,25279=>1000,25280=>1000,25281=>1000,25282=>1000,25283=>1000,25284=>1000,25285=>1000,25286=>1000,25287=>1000,25288=>1000,25289=>1000,25290=>1000,25291=>1000,25292=>1000,25293=>1000,25294=>1000,25295=>1000,25296=>1000,25297=>1000,25298=>1000,25299=>1000,25300=>1000,25301=>1000,25302=>1000,25303=>1000,25304=>1000,25305=>1000,25306=>1000,25307=>1000,25308=>1000,25309=>1000,25310=>1000,25311=>1000,25312=>1000,25313=>1000,25314=>1000,25315=>1000,25316=>1000,25317=>1000,25318=>1000,25319=>1000,25320=>1000,25321=>1000,25322=>1000,25323=>1000,25324=>1000,25325=>1000,25326=>1000,25327=>1000,25328=>1000,25329=>1000,25330=>1000,25331=>1000,25332=>1000,25333=>1000,25334=>1000,25335=>1000,25336=>1000,25337=>1000,25338=>1000,25339=>1000,25340=>1000,25341=>1000,25342=>1000,25343=>1000,25344=>1000,25345=>1000,25346=>1000,25347=>1000,25348=>1000,25349=>1000,25350=>1000,25351=>1000,25352=>1000,25353=>1000,25354=>1000,25355=>1000,25356=>1000,25357=>1000,25358=>1000,25359=>1000,25360=>1000,25361=>1000,25362=>1000,25363=>1000,25364=>1000,25365=>1000,25366=>1000,25367=>1000,25368=>1000,25369=>1000,25370=>1000,25371=>1000,25372=>1000,25373=>1000,25374=>1000,25375=>1000,25376=>1000,25377=>1000,25378=>1000,25379=>1000,25380=>1000,25381=>1000,25382=>1000,25383=>1000,25384=>1000,25385=>1000,25386=>1000,25387=>1000,25388=>1000,25389=>1000,25390=>1000,25391=>1000,25392=>1000,25393=>1000,25394=>1000,25395=>1000,25396=>1000,25397=>1000,25398=>1000,25399=>1000,25400=>1000,25401=>1000,25402=>1000,25403=>1000,25404=>1000,25405=>1000,25406=>1000,25407=>1000,25408=>1000,25409=>1000,25410=>1000,25411=>1000,25412=>1000,25413=>1000,25414=>1000,25415=>1000,25416=>1000,25417=>1000,25418=>1000,25419=>1000,25420=>1000,25421=>1000,25422=>1000,25423=>1000,25424=>1000,25425=>1000,25426=>1000,25427=>1000,25428=>1000,25429=>1000,25430=>1000,25431=>1000,25432=>1000,25433=>1000,25434=>1000,25435=>1000,25436=>1000,25437=>1000,25438=>1000,25439=>1000,25440=>1000,25441=>1000,25442=>1000,25443=>1000,25444=>1000,25445=>1000,25446=>1000,25447=>1000,25448=>1000,25449=>1000,25450=>1000,25451=>1000,25452=>1000,25453=>1000,25454=>1000,25455=>1000,25456=>1000,25457=>1000,25458=>1000,25459=>1000,25460=>1000,25461=>1000,25462=>1000,25463=>1000,25464=>1000,25465=>1000,25466=>1000,25467=>1000,25468=>1000,25469=>1000,25470=>1000,25471=>1000,25472=>1000,25473=>1000,25474=>1000,25475=>1000,25476=>1000,25477=>1000,25478=>1000,25479=>1000,25480=>1000,25481=>1000,25482=>1000,25483=>1000,25484=>1000,25485=>1000,25486=>1000,25487=>1000,25488=>1000,25489=>1000,25490=>1000,25491=>1000,25492=>1000,25493=>1000,25494=>1000,25495=>1000,25496=>1000,25497=>1000,25498=>1000,25499=>1000,25500=>1000,25501=>1000,25502=>1000,25503=>1000,25504=>1000,25505=>1000,25506=>1000,25507=>1000,25508=>1000,25509=>1000,25510=>1000,25511=>1000,25512=>1000,25513=>1000,25514=>1000,25515=>1000,25516=>1000,25517=>1000,25518=>1000,25519=>1000,25520=>1000,25521=>1000,25522=>1000,25523=>1000,25524=>1000,25525=>1000,25526=>1000,25527=>1000,25528=>1000,25529=>1000,25530=>1000,25531=>1000,25532=>1000,25533=>1000,25534=>1000,25535=>1000,25536=>1000,25537=>1000,25538=>1000,25539=>1000,25540=>1000,25541=>1000,25542=>1000,25543=>1000,25544=>1000,25545=>1000,25546=>1000,25547=>1000,25548=>1000,25549=>1000,25550=>1000,25551=>1000,25552=>1000,25553=>1000,25554=>1000,25555=>1000,25556=>1000,25557=>1000,25558=>1000,25559=>1000,25560=>1000,25561=>1000,25562=>1000,25563=>1000,25564=>1000,25565=>1000,25566=>1000,25567=>1000,25568=>1000,25569=>1000,25570=>1000,25571=>1000,25572=>1000,25573=>1000,25574=>1000,25575=>1000,25576=>1000,25577=>1000,25578=>1000,25579=>1000,25580=>1000,25581=>1000,25582=>1000,25583=>1000,25584=>1000,25585=>1000,25586=>1000,25587=>1000,25588=>1000,25589=>1000,25590=>1000,25591=>1000,25592=>1000,25593=>1000,25594=>1000,25595=>1000,25596=>1000,25597=>1000,25598=>1000,25599=>1000,25600=>1000,25601=>1000,25602=>1000,25603=>1000,25604=>1000,25605=>1000,25606=>1000,25607=>1000,25608=>1000,25609=>1000,25610=>1000,25611=>1000,25612=>1000,25613=>1000,25614=>1000,25615=>1000,25616=>1000,25617=>1000,25618=>1000,25619=>1000,25620=>1000,25621=>1000,25622=>1000,25623=>1000,25624=>1000,25625=>1000,25626=>1000,25627=>1000,25628=>1000,25629=>1000,25630=>1000,25631=>1000,25632=>1000,25633=>1000,25634=>1000,25635=>1000,25636=>1000,25637=>1000,25638=>1000,25639=>1000,25640=>1000,25641=>1000,25642=>1000,25643=>1000,25644=>1000,25645=>1000,25646=>1000,25647=>1000,25648=>1000,25649=>1000,25650=>1000,25651=>1000,25652=>1000,25653=>1000,25654=>1000,25655=>1000,25656=>1000,25657=>1000,25658=>1000,25659=>1000,25660=>1000,25661=>1000,25662=>1000,25663=>1000,25664=>1000,25665=>1000,25666=>1000,25667=>1000,25668=>1000,25669=>1000,25670=>1000,25671=>1000,25672=>1000,25673=>1000,25674=>1000,25675=>1000,25676=>1000,25677=>1000,25678=>1000,25679=>1000,25680=>1000,25681=>1000,25682=>1000,25683=>1000,25684=>1000,25685=>1000,25686=>1000,25687=>1000,25688=>1000,25689=>1000,25690=>1000,25691=>1000,25692=>1000,25693=>1000,25694=>1000,25695=>1000,25696=>1000,25697=>1000,25698=>1000,25699=>1000,25700=>1000,25701=>1000,25702=>1000,25703=>1000,25704=>1000,25705=>1000,25706=>1000,25707=>1000,25708=>1000,25709=>1000,25710=>1000,25711=>1000,25712=>1000,25713=>1000,25714=>1000,25715=>1000,25716=>1000,25717=>1000,25718=>1000,25719=>1000,25720=>1000,25721=>1000,25722=>1000,25723=>1000,25724=>1000,25725=>1000,25726=>1000,25727=>1000,25728=>1000,25729=>1000,25730=>1000,25731=>1000,25732=>1000,25733=>1000,25734=>1000,25735=>1000,25736=>1000,25737=>1000,25738=>1000,25739=>1000,25740=>1000,25741=>1000,25742=>1000,25743=>1000,25744=>1000,25745=>1000,25746=>1000,25747=>1000,25748=>1000,25749=>1000,25750=>1000,25751=>1000,25752=>1000,25753=>1000,25754=>1000,25755=>1000,25756=>1000,25757=>1000,25758=>1000,25759=>1000,25760=>1000,25761=>1000,25762=>1000,25763=>1000,25764=>1000,25765=>1000,25766=>1000,25767=>1000,25768=>1000,25769=>1000,25770=>1000,25771=>1000,25772=>1000,25773=>1000,25774=>1000,25775=>1000,25776=>1000,25777=>1000,25778=>1000,25779=>1000,25780=>1000,25781=>1000,25782=>1000,25783=>1000,25784=>1000,25785=>1000,25786=>1000,25787=>1000,25788=>1000,25789=>1000,25790=>1000,25791=>1000,25792=>1000,25793=>1000,25794=>1000,25795=>1000,25796=>1000,25797=>1000,25798=>1000,25799=>1000,25800=>1000,25801=>1000,25802=>1000,25803=>1000,25804=>1000,25805=>1000,25806=>1000,25807=>1000,25808=>1000,25809=>1000,25810=>1000,25811=>1000,25812=>1000,25813=>1000,25814=>1000,25815=>1000,25816=>1000,25817=>1000,25818=>1000,25819=>1000,25820=>1000,25821=>1000,25822=>1000,25823=>1000,25824=>1000,25825=>1000,25826=>1000,25827=>1000,25828=>1000,25829=>1000,25830=>1000,25831=>1000,25832=>1000,25833=>1000,25834=>1000,25835=>1000,25836=>1000,25837=>1000,25838=>1000,25839=>1000,25840=>1000,25841=>1000,25842=>1000,25843=>1000,25844=>1000,25845=>1000,25846=>1000,25847=>1000,25848=>1000,25849=>1000,25850=>1000,25851=>1000,25852=>1000,25853=>1000,25854=>1000,25855=>1000,25856=>1000,25857=>1000,25858=>1000,25859=>1000,25860=>1000,25861=>1000,25862=>1000,25863=>1000,25864=>1000,25865=>1000,25866=>1000,25867=>1000,25868=>1000,25869=>1000,25870=>1000,25871=>1000,25872=>1000,25873=>1000,25874=>1000,25875=>1000,25876=>1000,25877=>1000,25878=>1000,25879=>1000,25880=>1000,25881=>1000,25882=>1000,25883=>1000,25884=>1000,25885=>1000,25886=>1000,25887=>1000,25888=>1000,25889=>1000,25890=>1000,25891=>1000,25892=>1000,25893=>1000,25894=>1000,25895=>1000,25896=>1000,25897=>1000,25898=>1000,25899=>1000,25900=>1000,25901=>1000,25902=>1000,25903=>1000,25904=>1000,25905=>1000,25906=>1000,25907=>1000,25908=>1000,25909=>1000,25910=>1000,25911=>1000,25912=>1000,25913=>1000,25914=>1000,25915=>1000,25916=>1000,25917=>1000,25918=>1000,25919=>1000,25920=>1000,25921=>1000,25922=>1000,25923=>1000,25924=>1000,25925=>1000,25926=>1000,25927=>1000,25928=>1000,25929=>1000,25930=>1000,25931=>1000,25932=>1000,25933=>1000,25934=>1000,25935=>1000,25936=>1000,25937=>1000,25938=>1000,25939=>1000,25940=>1000,25941=>1000,25942=>1000,25943=>1000,25944=>1000,25945=>1000,25946=>1000,25947=>1000,25948=>1000,25949=>1000,25950=>1000,25951=>1000,25952=>1000,25953=>1000,25954=>1000,25955=>1000,25956=>1000,25957=>1000,25958=>1000,25959=>1000,25960=>1000,25961=>1000,25962=>1000,25963=>1000,25964=>1000,25965=>1000,25966=>1000,25967=>1000,25968=>1000,25969=>1000,25970=>1000,25971=>1000,25972=>1000,25973=>1000,25974=>1000,25975=>1000,25976=>1000,25977=>1000,25978=>1000,25979=>1000,25980=>1000,25981=>1000,25982=>1000,25983=>1000,25984=>1000,25985=>1000,25986=>1000,25987=>1000,25988=>1000,25989=>1000,25990=>1000,25991=>1000,25992=>1000,25993=>1000,25994=>1000,25995=>1000,25996=>1000,25997=>1000,25998=>1000,25999=>1000,26000=>1000,26001=>1000,26002=>1000,26003=>1000,26004=>1000,26005=>1000,26006=>1000,26007=>1000,26008=>1000,26009=>1000,26010=>1000,26011=>1000,26012=>1000,26013=>1000,26014=>1000,26015=>1000,26016=>1000,26017=>1000,26018=>1000,26019=>1000,26020=>1000,26021=>1000,26022=>1000,26023=>1000,26024=>1000,26025=>1000,26026=>1000,26027=>1000,26028=>1000,26029=>1000,26030=>1000,26031=>1000,26032=>1000,26033=>1000,26034=>1000,26035=>1000,26036=>1000,26037=>1000,26038=>1000,26039=>1000,26040=>1000,26041=>1000,26042=>1000,26043=>1000,26044=>1000,26045=>1000,26046=>1000,26047=>1000,26048=>1000,26049=>1000,26050=>1000,26051=>1000,26052=>1000,26053=>1000,26054=>1000,26055=>1000,26056=>1000,26057=>1000,26058=>1000,26059=>1000,26060=>1000,26061=>1000,26062=>1000,26063=>1000,26064=>1000,26065=>1000,26066=>1000,26067=>1000,26068=>1000,26069=>1000,26070=>1000,26071=>1000,26072=>1000,26073=>1000,26074=>1000,26075=>1000,26076=>1000,26077=>1000,26078=>1000,26079=>1000,26080=>1000,26081=>1000,26082=>1000,26083=>1000,26084=>1000,26085=>1000,26086=>1000,26087=>1000,26088=>1000,26089=>1000,26090=>1000,26091=>1000,26092=>1000,26093=>1000,26094=>1000,26095=>1000,26096=>1000,26097=>1000,26098=>1000,26099=>1000,26100=>1000,26101=>1000,26102=>1000,26103=>1000,26104=>1000,26105=>1000,26106=>1000,26107=>1000,26108=>1000,26109=>1000,26110=>1000,26111=>1000,26112=>1000,26113=>1000,26114=>1000,26115=>1000,26116=>1000,26117=>1000,26118=>1000,26119=>1000,26120=>1000,26121=>1000,26122=>1000,26123=>1000,26124=>1000,26125=>1000,26126=>1000,26127=>1000,26128=>1000,26129=>1000,26130=>1000,26131=>1000,26132=>1000,26133=>1000,26134=>1000,26135=>1000,26136=>1000,26137=>1000,26138=>1000,26139=>1000,26140=>1000,26141=>1000,26142=>1000,26143=>1000,26144=>1000,26145=>1000,26146=>1000,26147=>1000,26148=>1000,26149=>1000,26150=>1000,26151=>1000,26152=>1000,26153=>1000,26154=>1000,26155=>1000,26156=>1000,26157=>1000,26158=>1000,26159=>1000,26160=>1000,26161=>1000,26162=>1000,26163=>1000,26164=>1000,26165=>1000,26166=>1000,26167=>1000,26168=>1000,26169=>1000,26170=>1000,26171=>1000,26172=>1000,26173=>1000,26174=>1000,26175=>1000,26176=>1000,26177=>1000,26178=>1000,26179=>1000,26180=>1000,26181=>1000,26182=>1000,26183=>1000,26184=>1000,26185=>1000,26186=>1000,26187=>1000,26188=>1000,26189=>1000,26190=>1000,26191=>1000,26192=>1000,26193=>1000,26194=>1000,26195=>1000,26196=>1000,26197=>1000,26198=>1000,26199=>1000,26200=>1000,26201=>1000,26202=>1000,26203=>1000,26204=>1000,26205=>1000,26206=>1000,26207=>1000,26208=>1000,26209=>1000,26210=>1000,26211=>1000,26212=>1000,26213=>1000,26214=>1000,26215=>1000,26216=>1000,26217=>1000,26218=>1000,26219=>1000,26220=>1000,26221=>1000,26222=>1000,26223=>1000,26224=>1000,26225=>1000,26226=>1000,26227=>1000,26228=>1000,26229=>1000,26230=>1000,26231=>1000,26232=>1000,26233=>1000,26234=>1000,26235=>1000,26236=>1000,26237=>1000,26238=>1000,26239=>1000,26240=>1000,26241=>1000,26242=>1000,26243=>1000,26244=>1000,26245=>1000,26246=>1000,26247=>1000,26248=>1000,26249=>1000,26250=>1000,26251=>1000,26252=>1000,26253=>1000,26254=>1000,26255=>1000,26256=>1000,26257=>1000,26258=>1000,26259=>1000,26260=>1000,26261=>1000,26262=>1000,26263=>1000,26264=>1000,26265=>1000,26266=>1000,26267=>1000,26268=>1000,26269=>1000,26270=>1000,26271=>1000,26272=>1000,26273=>1000,26274=>1000,26275=>1000,26276=>1000,26277=>1000,26278=>1000,26279=>1000,26280=>1000,26281=>1000,26282=>1000,26283=>1000,26284=>1000,26285=>1000,26286=>1000,26287=>1000,26288=>1000,26289=>1000,26290=>1000,26291=>1000,26292=>1000,26293=>1000,26294=>1000,26295=>1000,26296=>1000,26297=>1000,26298=>1000,26299=>1000,26300=>1000,26301=>1000,26302=>1000,26303=>1000,26304=>1000,26305=>1000,26306=>1000,26307=>1000,26308=>1000,26309=>1000,26310=>1000,26311=>1000,26312=>1000,26313=>1000,26314=>1000,26315=>1000,26316=>1000,26317=>1000,26318=>1000,26319=>1000,26320=>1000,26321=>1000,26322=>1000,26323=>1000,26324=>1000,26325=>1000,26326=>1000,26327=>1000,26328=>1000,26329=>1000,26330=>1000,26331=>1000,26332=>1000,26333=>1000,26334=>1000,26335=>1000,26336=>1000,26337=>1000,26338=>1000,26339=>1000,26340=>1000,26341=>1000,26342=>1000,26343=>1000,26344=>1000,26345=>1000,26346=>1000,26347=>1000,26348=>1000,26349=>1000,26350=>1000,26351=>1000,26352=>1000,26353=>1000,26354=>1000,26355=>1000,26356=>1000,26357=>1000,26358=>1000,26359=>1000,26360=>1000,26361=>1000,26362=>1000,26363=>1000,26364=>1000,26365=>1000,26366=>1000,26367=>1000,26368=>1000,26369=>1000,26370=>1000,26371=>1000,26372=>1000,26373=>1000,26374=>1000,26375=>1000,26376=>1000,26377=>1000,26378=>1000,26379=>1000,26380=>1000,26381=>1000,26382=>1000,26383=>1000,26384=>1000,26385=>1000,26386=>1000,26387=>1000,26388=>1000,26389=>1000,26390=>1000,26391=>1000,26392=>1000,26393=>1000,26394=>1000,26395=>1000,26396=>1000,26397=>1000,26398=>1000,26399=>1000,26400=>1000,26401=>1000,26402=>1000,26403=>1000,26404=>1000,26405=>1000,26406=>1000,26407=>1000,26408=>1000,26409=>1000,26410=>1000,26411=>1000,26412=>1000,26413=>1000,26414=>1000,26415=>1000,26416=>1000,26417=>1000,26418=>1000,26419=>1000,26420=>1000,26421=>1000,26422=>1000,26423=>1000,26424=>1000,26425=>1000,26426=>1000,26427=>1000,26428=>1000,26429=>1000,26430=>1000,26431=>1000,26432=>1000,26433=>1000,26434=>1000,26435=>1000,26436=>1000,26437=>1000,26438=>1000,26439=>1000,26440=>1000,26441=>1000,26442=>1000,26443=>1000,26444=>1000,26445=>1000,26446=>1000,26447=>1000,26448=>1000,26449=>1000,26450=>1000,26451=>1000,26452=>1000,26453=>1000,26454=>1000,26455=>1000,26456=>1000,26457=>1000,26458=>1000,26459=>1000,26460=>1000,26461=>1000,26462=>1000,26463=>1000,26464=>1000,26465=>1000,26466=>1000,26467=>1000,26468=>1000,26469=>1000,26470=>1000,26471=>1000,26472=>1000,26473=>1000,26474=>1000,26475=>1000,26476=>1000,26477=>1000,26478=>1000,26479=>1000,26480=>1000,26481=>1000,26482=>1000,26483=>1000,26484=>1000,26485=>1000,26486=>1000,26487=>1000,26488=>1000,26489=>1000,26490=>1000,26491=>1000,26492=>1000,26493=>1000,26494=>1000,26495=>1000,26496=>1000,26497=>1000,26498=>1000,26499=>1000,26500=>1000,26501=>1000,26502=>1000,26503=>1000,26504=>1000,26505=>1000,26506=>1000,26507=>1000,26508=>1000,26509=>1000,26510=>1000,26511=>1000,26512=>1000,26513=>1000,26514=>1000,26515=>1000,26516=>1000,26517=>1000,26518=>1000,26519=>1000,26520=>1000,26521=>1000,26522=>1000,26523=>1000,26524=>1000,26525=>1000,26526=>1000,26527=>1000,26528=>1000,26529=>1000,26530=>1000,26531=>1000,26532=>1000,26533=>1000,26534=>1000,26535=>1000,26536=>1000,26537=>1000,26538=>1000,26539=>1000,26540=>1000,26541=>1000,26542=>1000,26543=>1000,26544=>1000,26545=>1000,26546=>1000,26547=>1000,26548=>1000,26549=>1000,26550=>1000,26551=>1000,26552=>1000,26553=>1000,26554=>1000,26555=>1000,26556=>1000,26557=>1000,26558=>1000,26559=>1000,26560=>1000,26561=>1000,26562=>1000,26563=>1000,26564=>1000,26565=>1000,26566=>1000,26567=>1000,26568=>1000,26569=>1000,26570=>1000,26571=>1000,26572=>1000,26573=>1000,26574=>1000,26575=>1000,26576=>1000,26577=>1000,26578=>1000,26579=>1000,26580=>1000,26581=>1000,26582=>1000,26583=>1000,26584=>1000,26585=>1000,26586=>1000,26587=>1000,26588=>1000,26589=>1000,26590=>1000,26591=>1000,26592=>1000,26593=>1000,26594=>1000,26595=>1000,26596=>1000,26597=>1000,26598=>1000,26599=>1000,26600=>1000,26601=>1000,26602=>1000,26603=>1000,26604=>1000,26605=>1000,26606=>1000,26607=>1000,26608=>1000,26609=>1000,26610=>1000,26611=>1000,26612=>1000,26613=>1000,26614=>1000,26615=>1000,26616=>1000,26617=>1000,26618=>1000,26619=>1000,26620=>1000,26621=>1000,26622=>1000,26623=>1000,26624=>1000,26625=>1000,26626=>1000,26627=>1000,26628=>1000,26629=>1000,26630=>1000,26631=>1000,26632=>1000,26633=>1000,26634=>1000,26635=>1000,26636=>1000,26637=>1000,26638=>1000,26639=>1000,26640=>1000,26641=>1000,26642=>1000,26643=>1000,26644=>1000,26645=>1000,26646=>1000,26647=>1000,26648=>1000,26649=>1000,26650=>1000,26651=>1000,26652=>1000,26653=>1000,26654=>1000,26655=>1000,26656=>1000,26657=>1000,26658=>1000,26659=>1000,26660=>1000,26661=>1000,26662=>1000,26663=>1000,26664=>1000,26665=>1000,26666=>1000,26667=>1000,26668=>1000,26669=>1000,26670=>1000,26671=>1000,26672=>1000,26673=>1000,26674=>1000,26675=>1000,26676=>1000,26677=>1000,26678=>1000,26679=>1000,26680=>1000,26681=>1000,26682=>1000,26683=>1000,26684=>1000,26685=>1000,26686=>1000,26687=>1000,26688=>1000,26689=>1000,26690=>1000,26691=>1000,26692=>1000,26693=>1000,26694=>1000,26695=>1000,26696=>1000,26697=>1000,26698=>1000,26699=>1000,26700=>1000,26701=>1000,26702=>1000,26703=>1000,26704=>1000,26705=>1000,26706=>1000,26707=>1000,26708=>1000,26709=>1000,26710=>1000,26711=>1000,26712=>1000,26713=>1000,26714=>1000,26715=>1000,26716=>1000,26717=>1000,26718=>1000,26719=>1000,26720=>1000,26721=>1000,26722=>1000,26723=>1000,26724=>1000,26725=>1000,26726=>1000,26727=>1000,26728=>1000,26729=>1000,26730=>1000,26731=>1000,26732=>1000,26733=>1000,26734=>1000,26735=>1000,26736=>1000,26737=>1000,26738=>1000,26739=>1000,26740=>1000,26741=>1000,26742=>1000,26743=>1000,26744=>1000,26745=>1000,26746=>1000,26747=>1000,26748=>1000,26749=>1000,26750=>1000,26751=>1000,26752=>1000,26753=>1000,26754=>1000,26755=>1000,26756=>1000,26757=>1000,26758=>1000,26759=>1000,26760=>1000,26761=>1000,26762=>1000,26763=>1000,26764=>1000,26765=>1000,26766=>1000,26767=>1000,26768=>1000,26769=>1000,26770=>1000,26771=>1000,26772=>1000,26773=>1000,26774=>1000,26775=>1000,26776=>1000,26777=>1000,26778=>1000,26779=>1000,26780=>1000,26781=>1000,26782=>1000,26783=>1000,26784=>1000,26785=>1000,26786=>1000,26787=>1000,26788=>1000,26789=>1000,26790=>1000,26791=>1000,26792=>1000,26793=>1000,26794=>1000,26795=>1000,26796=>1000,26797=>1000,26798=>1000,26799=>1000,26800=>1000,26801=>1000,26802=>1000,26803=>1000,26804=>1000,26805=>1000,26806=>1000,26807=>1000,26808=>1000,26809=>1000,26810=>1000,26811=>1000,26812=>1000,26813=>1000,26814=>1000,26815=>1000,26816=>1000,26817=>1000,26818=>1000,26819=>1000,26820=>1000,26821=>1000,26822=>1000,26823=>1000,26824=>1000,26825=>1000,26826=>1000,26827=>1000,26828=>1000,26829=>1000,26830=>1000,26831=>1000,26832=>1000,26833=>1000,26834=>1000,26835=>1000,26836=>1000,26837=>1000,26838=>1000,26839=>1000,26840=>1000,26841=>1000,26842=>1000,26843=>1000,26844=>1000,26845=>1000,26846=>1000,26847=>1000,26848=>1000,26849=>1000,26850=>1000,26851=>1000,26852=>1000,26853=>1000,26854=>1000,26855=>1000,26856=>1000,26857=>1000,26858=>1000,26859=>1000,26860=>1000,26861=>1000,26862=>1000,26863=>1000,26864=>1000,26865=>1000,26866=>1000,26867=>1000,26868=>1000,26869=>1000,26870=>1000,26871=>1000,26872=>1000,26873=>1000,26874=>1000,26875=>1000,26876=>1000,26877=>1000,26878=>1000,26879=>1000,26880=>1000,26881=>1000,26882=>1000,26883=>1000,26884=>1000,26885=>1000,26886=>1000,26887=>1000,26888=>1000,26889=>1000,26890=>1000,26891=>1000,26892=>1000,26893=>1000,26894=>1000,26895=>1000,26896=>1000,26897=>1000,26898=>1000,26899=>1000,26900=>1000,26901=>1000,26902=>1000,26903=>1000,26904=>1000,26905=>1000,26906=>1000,26907=>1000,26908=>1000,26909=>1000,26910=>1000,26911=>1000,26912=>1000,26913=>1000,26914=>1000,26915=>1000,26916=>1000,26917=>1000,26918=>1000,26919=>1000,26920=>1000,26921=>1000,26922=>1000,26923=>1000,26924=>1000,26925=>1000,26926=>1000,26927=>1000,26928=>1000,26929=>1000,26930=>1000,26931=>1000,26932=>1000,26933=>1000,26934=>1000,26935=>1000,26936=>1000,26937=>1000,26938=>1000,26939=>1000,26940=>1000,26941=>1000,26942=>1000,26943=>1000,26944=>1000,26945=>1000,26946=>1000,26947=>1000,26948=>1000,26949=>1000,26950=>1000,26951=>1000,26952=>1000,26953=>1000,26954=>1000,26955=>1000,26956=>1000,26957=>1000,26958=>1000,26959=>1000,26960=>1000,26961=>1000,26962=>1000,26963=>1000,26964=>1000,26965=>1000,26966=>1000,26967=>1000,26968=>1000,26969=>1000,26970=>1000,26971=>1000,26972=>1000,26973=>1000,26974=>1000,26975=>1000,26976=>1000,26977=>1000,26978=>1000,26979=>1000,26980=>1000,26981=>1000,26982=>1000,26983=>1000,26984=>1000,26985=>1000,26986=>1000,26987=>1000,26988=>1000,26989=>1000,26990=>1000,26991=>1000,26992=>1000,26993=>1000,26994=>1000,26995=>1000,26996=>1000,26997=>1000,26998=>1000,26999=>1000,27000=>1000,27001=>1000,27002=>1000,27003=>1000,27004=>1000,27005=>1000,27006=>1000,27007=>1000,27008=>1000,27009=>1000,27010=>1000,27011=>1000,27012=>1000,27013=>1000,27014=>1000,27015=>1000,27016=>1000,27017=>1000,27018=>1000,27019=>1000,27020=>1000,27021=>1000,27022=>1000,27023=>1000,27024=>1000,27025=>1000,27026=>1000,27027=>1000,27028=>1000,27029=>1000,27030=>1000,27031=>1000,27032=>1000,27033=>1000,27034=>1000,27035=>1000,27036=>1000,27037=>1000,27038=>1000,27039=>1000,27040=>1000,27041=>1000,27042=>1000,27043=>1000,27044=>1000,27045=>1000,27046=>1000,27047=>1000,27048=>1000,27049=>1000,27050=>1000,27051=>1000,27052=>1000,27053=>1000,27054=>1000,27055=>1000,27056=>1000,27057=>1000,27058=>1000,27059=>1000,27060=>1000,27061=>1000,27062=>1000,27063=>1000,27064=>1000,27065=>1000,27066=>1000,27067=>1000,27068=>1000,27069=>1000,27070=>1000,27071=>1000,27072=>1000,27073=>1000,27074=>1000,27075=>1000,27076=>1000,27077=>1000,27078=>1000,27079=>1000,27080=>1000,27081=>1000,27082=>1000,27083=>1000,27084=>1000,27085=>1000,27086=>1000,27087=>1000,27088=>1000,27089=>1000,27090=>1000,27091=>1000,27092=>1000,27093=>1000,27094=>1000,27095=>1000,27096=>1000,27097=>1000,27098=>1000,27099=>1000,27100=>1000,27101=>1000,27102=>1000,27103=>1000,27104=>1000,27105=>1000,27106=>1000,27107=>1000,27108=>1000,27109=>1000,27110=>1000,27111=>1000,27112=>1000,27113=>1000,27114=>1000,27115=>1000,27116=>1000,27117=>1000,27118=>1000,27119=>1000,27120=>1000,27121=>1000,27122=>1000,27123=>1000,27124=>1000,27125=>1000,27126=>1000,27127=>1000,27128=>1000,27129=>1000,27130=>1000,27131=>1000,27132=>1000,27133=>1000,27134=>1000,27135=>1000,27136=>1000,27137=>1000,27138=>1000,27139=>1000,27140=>1000,27141=>1000,27142=>1000,27143=>1000,27144=>1000,27145=>1000,27146=>1000,27147=>1000,27148=>1000,27149=>1000,27150=>1000,27151=>1000,27152=>1000,27153=>1000,27154=>1000,27155=>1000,27156=>1000,27157=>1000,27158=>1000,27159=>1000,27160=>1000,27161=>1000,27162=>1000,27163=>1000,27164=>1000,27165=>1000,27166=>1000,27167=>1000,27168=>1000,27169=>1000,27170=>1000,27171=>1000,27172=>1000,27173=>1000,27174=>1000,27175=>1000,27176=>1000,27177=>1000,27178=>1000,27179=>1000,27180=>1000,27181=>1000,27182=>1000,27183=>1000,27184=>1000,27185=>1000,27186=>1000,27187=>1000,27188=>1000,27189=>1000,27190=>1000,27191=>1000,27192=>1000,27193=>1000,27194=>1000,27195=>1000,27196=>1000,27197=>1000,27198=>1000,27199=>1000,27200=>1000,27201=>1000,27202=>1000,27203=>1000,27204=>1000,27205=>1000,27206=>1000,27207=>1000,27208=>1000,27209=>1000,27210=>1000,27211=>1000,27212=>1000,27213=>1000,27214=>1000,27215=>1000,27216=>1000,27217=>1000,27218=>1000,27219=>1000,27220=>1000,27221=>1000,27222=>1000,27223=>1000,27224=>1000,27225=>1000,27226=>1000,27227=>1000,27228=>1000,27229=>1000,27230=>1000,27231=>1000,27232=>1000,27233=>1000,27234=>1000,27235=>1000,27236=>1000,27237=>1000,27238=>1000,27239=>1000,27240=>1000,27241=>1000,27242=>1000,27243=>1000,27244=>1000,27245=>1000,27246=>1000,27247=>1000,27248=>1000,27249=>1000,27250=>1000,27251=>1000,27252=>1000,27253=>1000,27254=>1000,27255=>1000,27256=>1000,27257=>1000,27258=>1000,27259=>1000,27260=>1000,27261=>1000,27262=>1000,27263=>1000,27264=>1000,27265=>1000,27266=>1000,27267=>1000,27268=>1000,27269=>1000,27270=>1000,27271=>1000,27272=>1000,27273=>1000,27274=>1000,27275=>1000,27276=>1000,27277=>1000,27278=>1000,27279=>1000,27280=>1000,27281=>1000,27282=>1000,27283=>1000,27284=>1000,27285=>1000,27286=>1000,27287=>1000,27288=>1000,27289=>1000,27290=>1000,27291=>1000,27292=>1000,27293=>1000,27294=>1000,27295=>1000,27296=>1000,27297=>1000,27298=>1000,27299=>1000,27300=>1000,27301=>1000,27302=>1000,27303=>1000,27304=>1000,27305=>1000,27306=>1000,27307=>1000,27308=>1000,27309=>1000,27310=>1000,27311=>1000,27312=>1000,27313=>1000,27314=>1000,27315=>1000,27316=>1000,27317=>1000,27318=>1000,27319=>1000,27320=>1000,27321=>1000,27322=>1000,27323=>1000,27324=>1000,27325=>1000,27326=>1000,27327=>1000,27328=>1000,27329=>1000,27330=>1000,27331=>1000,27332=>1000,27333=>1000,27334=>1000,27335=>1000,27336=>1000,27337=>1000,27338=>1000,27339=>1000,27340=>1000,27341=>1000,27342=>1000,27343=>1000,27344=>1000,27345=>1000,27346=>1000,27347=>1000,27348=>1000,27349=>1000,27350=>1000,27351=>1000,27352=>1000,27353=>1000,27354=>1000,27355=>1000,27356=>1000,27357=>1000,27358=>1000,27359=>1000,27360=>1000,27361=>1000,27362=>1000,27363=>1000,27364=>1000,27365=>1000,27366=>1000,27367=>1000,27368=>1000,27369=>1000,27370=>1000,27371=>1000,27372=>1000,27373=>1000,27374=>1000,27375=>1000,27376=>1000,27377=>1000,27378=>1000,27379=>1000,27380=>1000,27381=>1000,27382=>1000,27383=>1000,27384=>1000,27385=>1000,27386=>1000,27387=>1000,27388=>1000,27389=>1000,27390=>1000,27391=>1000,27392=>1000,27393=>1000,27394=>1000,27395=>1000,27396=>1000,27397=>1000,27398=>1000,27399=>1000,27400=>1000,27401=>1000,27402=>1000,27403=>1000,27404=>1000,27405=>1000,27406=>1000,27407=>1000,27408=>1000,27409=>1000,27410=>1000,27411=>1000,27412=>1000,27413=>1000,27414=>1000,27415=>1000,27416=>1000,27417=>1000,27418=>1000,27419=>1000,27420=>1000,27421=>1000,27422=>1000,27423=>1000,27424=>1000,27425=>1000,27426=>1000,27427=>1000,27428=>1000,27429=>1000,27430=>1000,27431=>1000,27432=>1000,27433=>1000,27434=>1000,27435=>1000,27436=>1000,27437=>1000,27438=>1000,27439=>1000,27440=>1000,27441=>1000,27442=>1000,27443=>1000,27444=>1000,27445=>1000,27446=>1000,27447=>1000,27448=>1000,27449=>1000,27450=>1000,27451=>1000,27452=>1000,27453=>1000,27454=>1000,27455=>1000,27456=>1000,27457=>1000,27458=>1000,27459=>1000,27460=>1000,27461=>1000,27462=>1000,27463=>1000,27464=>1000,27465=>1000,27466=>1000,27467=>1000,27468=>1000,27469=>1000,27470=>1000,27471=>1000,27472=>1000,27473=>1000,27474=>1000,27475=>1000,27476=>1000,27477=>1000,27478=>1000,27479=>1000,27480=>1000,27481=>1000,27482=>1000,27483=>1000,27484=>1000,27485=>1000,27486=>1000,27487=>1000,27488=>1000,27489=>1000,27490=>1000,27491=>1000,27492=>1000,27493=>1000,27494=>1000,27495=>1000,27496=>1000,27497=>1000,27498=>1000,27499=>1000,27500=>1000,27501=>1000,27502=>1000,27503=>1000,27504=>1000,27505=>1000,27506=>1000,27507=>1000,27508=>1000,27509=>1000,27510=>1000,27511=>1000,27512=>1000,27513=>1000,27514=>1000,27515=>1000,27516=>1000,27517=>1000,27518=>1000,27519=>1000,27520=>1000,27521=>1000,27522=>1000,27523=>1000,27524=>1000,27525=>1000,27526=>1000,27527=>1000,27528=>1000,27529=>1000,27530=>1000,27531=>1000,27532=>1000,27533=>1000,27534=>1000,27535=>1000,27536=>1000,27537=>1000,27538=>1000,27539=>1000,27540=>1000,27541=>1000,27542=>1000,27543=>1000,27544=>1000,27545=>1000,27546=>1000,27547=>1000,27548=>1000,27549=>1000,27550=>1000,27551=>1000,27552=>1000,27553=>1000,27554=>1000,27555=>1000,27556=>1000,27557=>1000,27558=>1000,27559=>1000,27560=>1000,27561=>1000,27562=>1000,27563=>1000,27564=>1000,27565=>1000,27566=>1000,27567=>1000,27568=>1000,27569=>1000,27570=>1000,27571=>1000,27572=>1000,27573=>1000,27574=>1000,27575=>1000,27576=>1000,27577=>1000,27578=>1000,27579=>1000,27580=>1000,27581=>1000,27582=>1000,27583=>1000,27584=>1000,27585=>1000,27586=>1000,27587=>1000,27588=>1000,27589=>1000,27590=>1000,27591=>1000,27592=>1000,27593=>1000,27594=>1000,27595=>1000,27596=>1000,27597=>1000,27598=>1000,27599=>1000,27600=>1000,27601=>1000,27602=>1000,27603=>1000,27604=>1000,27605=>1000,27606=>1000,27607=>1000,27608=>1000,27609=>1000,27610=>1000,27611=>1000,27612=>1000,27613=>1000,27614=>1000,27615=>1000,27616=>1000,27617=>1000,27618=>1000,27619=>1000,27620=>1000,27621=>1000,27622=>1000,27623=>1000,27624=>1000,27625=>1000,27626=>1000,27627=>1000,27628=>1000,27629=>1000,27630=>1000,27631=>1000,27632=>1000,27633=>1000,27634=>1000,27635=>1000,27636=>1000,27637=>1000,27638=>1000,27639=>1000,27640=>1000,27641=>1000,27642=>1000,27643=>1000,27644=>1000,27645=>1000,27646=>1000,27647=>1000,27648=>1000,27649=>1000,27650=>1000,27651=>1000,27652=>1000,27653=>1000,27654=>1000,27655=>1000,27656=>1000,27657=>1000,27658=>1000,27659=>1000,27660=>1000,27661=>1000,27662=>1000,27663=>1000,27664=>1000,27665=>1000,27666=>1000,27667=>1000,27668=>1000,27669=>1000,27670=>1000,27671=>1000,27672=>1000,27673=>1000,27674=>1000,27675=>1000,27676=>1000,27677=>1000,27678=>1000,27679=>1000,27680=>1000,27681=>1000,27682=>1000,27683=>1000,27684=>1000,27685=>1000,27686=>1000,27687=>1000,27688=>1000,27689=>1000,27690=>1000,27691=>1000,27692=>1000,27693=>1000,27694=>1000,27695=>1000,27696=>1000,27697=>1000,27698=>1000,27699=>1000,27700=>1000,27701=>1000,27702=>1000,27703=>1000,27704=>1000,27705=>1000,27706=>1000,27707=>1000,27708=>1000,27709=>1000,27710=>1000,27711=>1000,27712=>1000,27713=>1000,27714=>1000,27715=>1000,27716=>1000,27717=>1000,27718=>1000,27719=>1000,27720=>1000,27721=>1000,27722=>1000,27723=>1000,27724=>1000,27725=>1000,27726=>1000,27727=>1000,27728=>1000,27729=>1000,27730=>1000,27731=>1000,27732=>1000,27733=>1000,27734=>1000,27735=>1000,27736=>1000,27737=>1000,27738=>1000,27739=>1000,27740=>1000,27741=>1000,27742=>1000,27743=>1000,27744=>1000,27745=>1000,27746=>1000,27747=>1000,27748=>1000,27749=>1000,27750=>1000,27751=>1000,27752=>1000,27753=>1000,27754=>1000,27755=>1000,27756=>1000,27757=>1000,27758=>1000,27759=>1000,27760=>1000,27761=>1000,27762=>1000,27763=>1000,27764=>1000,27765=>1000,27766=>1000,27767=>1000,27768=>1000,27769=>1000,27770=>1000,27771=>1000,27772=>1000,27773=>1000,27774=>1000,27775=>1000,27776=>1000,27777=>1000,27778=>1000,27779=>1000,27780=>1000,27781=>1000,27782=>1000,27783=>1000,27784=>1000,27785=>1000,27786=>1000,27787=>1000,27788=>1000,27789=>1000,27790=>1000,27791=>1000,27792=>1000,27793=>1000,27794=>1000,27795=>1000,27796=>1000,27797=>1000,27798=>1000,27799=>1000,27800=>1000,27801=>1000,27802=>1000,27803=>1000,27804=>1000,27805=>1000,27806=>1000,27807=>1000,27808=>1000,27809=>1000,27810=>1000,27811=>1000,27812=>1000,27813=>1000,27814=>1000,27815=>1000,27816=>1000,27817=>1000,27818=>1000,27819=>1000,27820=>1000,27821=>1000,27822=>1000,27823=>1000,27824=>1000,27825=>1000,27826=>1000,27827=>1000,27828=>1000,27829=>1000,27830=>1000,27831=>1000,27832=>1000,27833=>1000,27834=>1000,27835=>1000,27836=>1000,27837=>1000,27838=>1000,27839=>1000,27840=>1000,27841=>1000,27842=>1000,27843=>1000,27844=>1000,27845=>1000,27846=>1000,27847=>1000,27848=>1000,27849=>1000,27850=>1000,27851=>1000,27852=>1000,27853=>1000,27854=>1000,27855=>1000,27856=>1000,27857=>1000,27858=>1000,27859=>1000,27860=>1000,27861=>1000,27862=>1000,27863=>1000,27864=>1000,27865=>1000,27866=>1000,27867=>1000,27868=>1000,27869=>1000,27870=>1000,27871=>1000,27872=>1000,27873=>1000,27874=>1000,27875=>1000,27876=>1000,27877=>1000,27878=>1000,27879=>1000,27880=>1000,27881=>1000,27882=>1000,27883=>1000,27884=>1000,27885=>1000,27886=>1000,27887=>1000,27888=>1000,27889=>1000,27890=>1000,27891=>1000,27892=>1000,27893=>1000,27894=>1000,27895=>1000,27896=>1000,27897=>1000,27898=>1000,27899=>1000,27900=>1000,27901=>1000,27902=>1000,27903=>1000,27904=>1000,27905=>1000,27906=>1000,27907=>1000,27908=>1000,27909=>1000,27910=>1000,27911=>1000,27912=>1000,27913=>1000,27914=>1000,27915=>1000,27916=>1000,27917=>1000,27918=>1000,27919=>1000,27920=>1000,27921=>1000,27922=>1000,27923=>1000,27924=>1000,27925=>1000,27926=>1000,27927=>1000,27928=>1000,27929=>1000,27930=>1000,27931=>1000,27932=>1000,27933=>1000,27934=>1000,27935=>1000,27936=>1000,27937=>1000,27938=>1000,27939=>1000,27940=>1000,27941=>1000,27942=>1000,27943=>1000,27944=>1000,27945=>1000,27946=>1000,27947=>1000,27948=>1000,27949=>1000,27950=>1000,27951=>1000,27952=>1000,27953=>1000,27954=>1000,27955=>1000,27956=>1000,27957=>1000,27958=>1000,27959=>1000,27960=>1000,27961=>1000,27962=>1000,27963=>1000,27964=>1000,27965=>1000,27966=>1000,27967=>1000,27968=>1000,27969=>1000,27970=>1000,27971=>1000,27972=>1000,27973=>1000,27974=>1000,27975=>1000,27976=>1000,27977=>1000,27978=>1000,27979=>1000,27980=>1000,27981=>1000,27982=>1000,27983=>1000,27984=>1000,27985=>1000,27986=>1000,27987=>1000,27988=>1000,27989=>1000,27990=>1000,27991=>1000,27992=>1000,27993=>1000,27994=>1000,27995=>1000,27996=>1000,27997=>1000,27998=>1000,27999=>1000,28000=>1000,28001=>1000,28002=>1000,28003=>1000,28004=>1000,28005=>1000,28006=>1000,28007=>1000,28008=>1000,28009=>1000,28010=>1000,28011=>1000,28012=>1000,28013=>1000,28014=>1000,28015=>1000,28016=>1000,28017=>1000,28018=>1000,28019=>1000,28020=>1000,28021=>1000,28022=>1000,28023=>1000,28024=>1000,28025=>1000,28026=>1000,28027=>1000,28028=>1000,28029=>1000,28030=>1000,28031=>1000,28032=>1000,28033=>1000,28034=>1000,28035=>1000,28036=>1000,28037=>1000,28038=>1000,28039=>1000,28040=>1000,28041=>1000,28042=>1000,28043=>1000,28044=>1000,28045=>1000,28046=>1000,28047=>1000,28048=>1000,28049=>1000,28050=>1000,28051=>1000,28052=>1000,28053=>1000,28054=>1000,28055=>1000,28056=>1000,28057=>1000,28058=>1000,28059=>1000,28060=>1000,28061=>1000,28062=>1000,28063=>1000,28064=>1000,28065=>1000,28066=>1000,28067=>1000,28068=>1000,28069=>1000,28070=>1000,28071=>1000,28072=>1000,28073=>1000,28074=>1000,28075=>1000,28076=>1000,28077=>1000,28078=>1000,28079=>1000,28080=>1000,28081=>1000,28082=>1000,28083=>1000,28084=>1000,28085=>1000,28086=>1000,28087=>1000,28088=>1000,28089=>1000,28090=>1000,28091=>1000,28092=>1000,28093=>1000,28094=>1000,28095=>1000,28096=>1000,28097=>1000,28098=>1000,28099=>1000,28100=>1000,28101=>1000,28102=>1000,28103=>1000,28104=>1000,28105=>1000,28106=>1000,28107=>1000,28108=>1000,28109=>1000,28110=>1000,28111=>1000,28112=>1000,28113=>1000,28114=>1000,28115=>1000,28116=>1000,28117=>1000,28118=>1000,28119=>1000,28120=>1000,28121=>1000,28122=>1000,28123=>1000,28124=>1000,28125=>1000,28126=>1000,28127=>1000,28128=>1000,28129=>1000,28130=>1000,28131=>1000,28132=>1000,28133=>1000,28134=>1000,28135=>1000,28136=>1000,28137=>1000,28138=>1000,28139=>1000,28140=>1000,28141=>1000,28142=>1000,28143=>1000,28144=>1000,28145=>1000,28146=>1000,28147=>1000,28148=>1000,28149=>1000,28150=>1000,28151=>1000,28152=>1000,28153=>1000,28154=>1000,28155=>1000,28156=>1000,28157=>1000,28158=>1000,28159=>1000,28160=>1000,28161=>1000,28162=>1000,28163=>1000,28164=>1000,28165=>1000,28166=>1000,28167=>1000,28168=>1000,28169=>1000,28170=>1000,28171=>1000,28172=>1000,28173=>1000,28174=>1000,28175=>1000,28176=>1000,28177=>1000,28178=>1000,28179=>1000,28180=>1000,28181=>1000,28182=>1000,28183=>1000,28184=>1000,28185=>1000,28186=>1000,28187=>1000,28188=>1000,28189=>1000,28190=>1000,28191=>1000,28192=>1000,28193=>1000,28194=>1000,28195=>1000,28196=>1000,28197=>1000,28198=>1000,28199=>1000,28200=>1000,28201=>1000,28202=>1000,28203=>1000,28204=>1000,28205=>1000,28206=>1000,28207=>1000,28208=>1000,28209=>1000,28210=>1000,28211=>1000,28212=>1000,28213=>1000,28214=>1000,28215=>1000,28216=>1000,28217=>1000,28218=>1000,28219=>1000,28220=>1000,28221=>1000,28222=>1000,28223=>1000,28224=>1000,28225=>1000,28226=>1000,28227=>1000,28228=>1000,28229=>1000,28230=>1000,28231=>1000,28232=>1000,28233=>1000,28234=>1000,28235=>1000,28236=>1000,28237=>1000,28238=>1000,28239=>1000,28240=>1000,28241=>1000,28242=>1000,28243=>1000,28244=>1000,28245=>1000,28246=>1000,28247=>1000,28248=>1000,28249=>1000,28250=>1000,28251=>1000,28252=>1000,28253=>1000,28254=>1000,28255=>1000,28256=>1000,28257=>1000,28258=>1000,28259=>1000,28260=>1000,28261=>1000,28262=>1000,28263=>1000,28264=>1000,28265=>1000,28266=>1000,28267=>1000,28268=>1000,28269=>1000,28270=>1000,28271=>1000,28272=>1000,28273=>1000,28274=>1000,28275=>1000,28276=>1000,28277=>1000,28278=>1000,28279=>1000,28280=>1000,28281=>1000,28282=>1000,28283=>1000,28284=>1000,28285=>1000,28286=>1000,28287=>1000,28288=>1000,28289=>1000,28290=>1000,28291=>1000,28292=>1000,28293=>1000,28294=>1000,28295=>1000,28296=>1000,28297=>1000,28298=>1000,28299=>1000,28300=>1000,28301=>1000,28302=>1000,28303=>1000,28304=>1000,28305=>1000,28306=>1000,28307=>1000,28308=>1000,28309=>1000,28310=>1000,28311=>1000,28312=>1000,28313=>1000,28314=>1000,28315=>1000,28316=>1000,28317=>1000,28318=>1000,28319=>1000,28320=>1000,28321=>1000,28322=>1000,28323=>1000,28324=>1000,28325=>1000,28326=>1000,28327=>1000,28328=>1000,28329=>1000,28330=>1000,28331=>1000,28332=>1000,28333=>1000,28334=>1000,28335=>1000,28336=>1000,28337=>1000,28338=>1000,28339=>1000,28340=>1000,28341=>1000,28342=>1000,28343=>1000,28344=>1000,28345=>1000,28346=>1000,28347=>1000,28348=>1000,28349=>1000,28350=>1000,28351=>1000,28352=>1000,28353=>1000,28354=>1000,28355=>1000,28356=>1000,28357=>1000,28358=>1000,28359=>1000,28360=>1000,28361=>1000,28362=>1000,28363=>1000,28364=>1000,28365=>1000,28366=>1000,28367=>1000,28368=>1000,28369=>1000,28370=>1000,28371=>1000,28372=>1000,28373=>1000,28374=>1000,28375=>1000,28376=>1000,28377=>1000,28378=>1000,28379=>1000,28380=>1000,28381=>1000,28382=>1000,28383=>1000,28384=>1000,28385=>1000,28386=>1000,28387=>1000,28388=>1000,28389=>1000,28390=>1000,28391=>1000,28392=>1000,28393=>1000,28394=>1000,28395=>1000,28396=>1000,28397=>1000,28398=>1000,28399=>1000,28400=>1000,28401=>1000,28402=>1000,28403=>1000,28404=>1000,28405=>1000,28406=>1000,28407=>1000,28408=>1000,28409=>1000,28410=>1000,28411=>1000,28412=>1000,28413=>1000,28414=>1000,28415=>1000,28416=>1000,28417=>1000,28418=>1000,28419=>1000,28420=>1000,28421=>1000,28422=>1000,28423=>1000,28424=>1000,28425=>1000,28426=>1000,28427=>1000,28428=>1000,28429=>1000,28430=>1000,28431=>1000,28432=>1000,28433=>1000,28434=>1000,28435=>1000,28436=>1000,28437=>1000,28438=>1000,28439=>1000,28440=>1000,28441=>1000,28442=>1000,28443=>1000,28444=>1000,28445=>1000,28446=>1000,28447=>1000,28448=>1000,28449=>1000,28450=>1000,28451=>1000,28452=>1000,28453=>1000,28454=>1000,28455=>1000,28456=>1000,28457=>1000,28458=>1000,28459=>1000,28460=>1000,28461=>1000,28462=>1000,28463=>1000,28464=>1000,28465=>1000,28466=>1000,28467=>1000,28468=>1000,28469=>1000,28470=>1000,28471=>1000,28472=>1000,28473=>1000,28474=>1000,28475=>1000,28476=>1000,28477=>1000,28478=>1000,28479=>1000,28480=>1000,28481=>1000,28482=>1000,28483=>1000,28484=>1000,28485=>1000,28486=>1000,28487=>1000,28488=>1000,28489=>1000,28490=>1000,28491=>1000,28492=>1000,28493=>1000,28494=>1000,28495=>1000,28496=>1000,28497=>1000,28498=>1000,28499=>1000,28500=>1000,28501=>1000,28502=>1000,28503=>1000,28504=>1000,28505=>1000,28506=>1000,28507=>1000,28508=>1000,28509=>1000,28510=>1000,28511=>1000,28512=>1000,28513=>1000,28514=>1000,28515=>1000,28516=>1000,28517=>1000,28518=>1000,28519=>1000,28520=>1000,28521=>1000,28522=>1000,28523=>1000,28524=>1000,28525=>1000,28526=>1000,28527=>1000,28528=>1000,28529=>1000,28530=>1000,28531=>1000,28532=>1000,28533=>1000,28534=>1000,28535=>1000,28536=>1000,28537=>1000,28538=>1000,28539=>1000,28540=>1000,28541=>1000,28542=>1000,28543=>1000,28544=>1000,28545=>1000,28546=>1000,28547=>1000,28548=>1000,28549=>1000,28550=>1000,28551=>1000,28552=>1000,28553=>1000,28554=>1000,28555=>1000,28556=>1000,28557=>1000,28558=>1000,28559=>1000,28560=>1000,28561=>1000,28562=>1000,28563=>1000,28564=>1000,28565=>1000,28566=>1000,28567=>1000,28568=>1000,28569=>1000,28570=>1000,28571=>1000,28572=>1000,28573=>1000,28574=>1000,28575=>1000,28576=>1000,28577=>1000,28578=>1000,28579=>1000,28580=>1000,28581=>1000,28582=>1000,28583=>1000,28584=>1000,28585=>1000,28586=>1000,28587=>1000,28588=>1000,28589=>1000,28590=>1000,28591=>1000,28592=>1000,28593=>1000,28594=>1000,28595=>1000,28596=>1000,28597=>1000,28598=>1000,28599=>1000,28600=>1000,28601=>1000,28602=>1000,28603=>1000,28604=>1000,28605=>1000,28606=>1000,28607=>1000,28608=>1000,28609=>1000,28610=>1000,28611=>1000,28612=>1000,28613=>1000,28614=>1000,28615=>1000,28616=>1000,28617=>1000,28618=>1000,28619=>1000,28620=>1000,28621=>1000,28622=>1000,28623=>1000,28624=>1000,28625=>1000,28626=>1000,28627=>1000,28628=>1000,28629=>1000,28630=>1000,28631=>1000,28632=>1000,28633=>1000,28634=>1000,28635=>1000,28636=>1000,28637=>1000,28638=>1000,28639=>1000,28640=>1000,28641=>1000,28642=>1000,28643=>1000,28644=>1000,28645=>1000,28646=>1000,28647=>1000,28648=>1000,28649=>1000,28650=>1000,28651=>1000,28652=>1000,28653=>1000,28654=>1000,28655=>1000,28656=>1000,28657=>1000,28658=>1000,28659=>1000,28660=>1000,28661=>1000,28662=>1000,28663=>1000,28664=>1000,28665=>1000,28666=>1000,28667=>1000,28668=>1000,28669=>1000,28670=>1000,28671=>1000,28672=>1000,28673=>1000,28674=>1000,28675=>1000,28676=>1000,28677=>1000,28678=>1000,28679=>1000,28680=>1000,28681=>1000,28682=>1000,28683=>1000,28684=>1000,28685=>1000,28686=>1000,28687=>1000,28688=>1000,28689=>1000,28690=>1000,28691=>1000,28692=>1000,28693=>1000,28694=>1000,28695=>1000,28696=>1000,28697=>1000,28698=>1000,28699=>1000,28700=>1000,28701=>1000,28702=>1000,28703=>1000,28704=>1000,28705=>1000,28706=>1000,28707=>1000,28708=>1000,28709=>1000,28710=>1000,28711=>1000,28712=>1000,28713=>1000,28714=>1000,28715=>1000,28716=>1000,28717=>1000,28718=>1000,28719=>1000,28720=>1000,28721=>1000,28722=>1000,28723=>1000,28724=>1000,28725=>1000,28726=>1000,28727=>1000,28728=>1000,28729=>1000,28730=>1000,28731=>1000,28732=>1000,28733=>1000,28734=>1000,28735=>1000,28736=>1000,28737=>1000,28738=>1000,28739=>1000,28740=>1000,28741=>1000,28742=>1000,28743=>1000,28744=>1000,28745=>1000,28746=>1000,28747=>1000,28748=>1000,28749=>1000,28750=>1000,28751=>1000,28752=>1000,28753=>1000,28754=>1000,28755=>1000,28756=>1000,28757=>1000,28758=>1000,28759=>1000,28760=>1000,28761=>1000,28762=>1000,28763=>1000,28764=>1000,28765=>1000,28766=>1000,28767=>1000,28768=>1000,28769=>1000,28770=>1000,28771=>1000,28772=>1000,28773=>1000,28774=>1000,28775=>1000,28776=>1000,28777=>1000,28778=>1000,28779=>1000,28780=>1000,28781=>1000,28782=>1000,28783=>1000,28784=>1000,28785=>1000,28786=>1000,28787=>1000,28788=>1000,28789=>1000,28790=>1000,28791=>1000,28792=>1000,28793=>1000,28794=>1000,28795=>1000,28796=>1000,28797=>1000,28798=>1000,28799=>1000,28800=>1000,28801=>1000,28802=>1000,28803=>1000,28804=>1000,28805=>1000,28806=>1000,28807=>1000,28808=>1000,28809=>1000,28810=>1000,28811=>1000,28812=>1000,28813=>1000,28814=>1000,28815=>1000,28816=>1000,28817=>1000,28818=>1000,28819=>1000,28820=>1000,28821=>1000,28822=>1000,28823=>1000,28824=>1000,28825=>1000,28826=>1000,28827=>1000,28828=>1000,28829=>1000,28830=>1000,28831=>1000,28832=>1000,28833=>1000,28834=>1000,28835=>1000,28836=>1000,28837=>1000,28838=>1000,28839=>1000,28840=>1000,28841=>1000,28842=>1000,28843=>1000,28844=>1000,28845=>1000,28846=>1000,28847=>1000,28848=>1000,28849=>1000,28850=>1000,28851=>1000,28852=>1000,28853=>1000,28854=>1000,28855=>1000,28856=>1000,28857=>1000,28858=>1000,28859=>1000,28860=>1000,28861=>1000,28862=>1000,28863=>1000,28864=>1000,28865=>1000,28866=>1000,28867=>1000,28868=>1000,28869=>1000,28870=>1000,28871=>1000,28872=>1000,28873=>1000,28874=>1000,28875=>1000,28876=>1000,28877=>1000,28878=>1000,28879=>1000,28880=>1000,28881=>1000,28882=>1000,28883=>1000,28884=>1000,28885=>1000,28886=>1000,28887=>1000,28888=>1000,28889=>1000,28890=>1000,28891=>1000,28892=>1000,28893=>1000,28894=>1000,28895=>1000,28896=>1000,28897=>1000,28898=>1000,28899=>1000,28900=>1000,28901=>1000,28902=>1000,28903=>1000,28904=>1000,28905=>1000,28906=>1000,28907=>1000,28908=>1000,28909=>1000,28910=>1000,28911=>1000,28912=>1000,28913=>1000,28914=>1000,28915=>1000,28916=>1000,28917=>1000,28918=>1000,28919=>1000,28920=>1000,28921=>1000,28922=>1000,28923=>1000,28924=>1000,28925=>1000,28926=>1000,28927=>1000,28928=>1000,28929=>1000,28930=>1000,28931=>1000,28932=>1000,28933=>1000,28934=>1000,28935=>1000,28936=>1000,28937=>1000,28938=>1000,28939=>1000,28940=>1000,28941=>1000,28942=>1000,28943=>1000,28944=>1000,28945=>1000,28946=>1000,28947=>1000,28948=>1000,28949=>1000,28950=>1000,28951=>1000,28952=>1000,28953=>1000,28954=>1000,28955=>1000,28956=>1000,28957=>1000,28958=>1000,28959=>1000,28960=>1000,28961=>1000,28962=>1000,28963=>1000,28964=>1000,28965=>1000,28966=>1000,28967=>1000,28968=>1000,28969=>1000,28970=>1000,28971=>1000,28972=>1000,28973=>1000,28974=>1000,28975=>1000,28976=>1000,28977=>1000,28978=>1000,28979=>1000,28980=>1000,28981=>1000,28982=>1000,28983=>1000,28984=>1000,28985=>1000,28986=>1000,28987=>1000,28988=>1000,28989=>1000,28990=>1000,28991=>1000,28992=>1000,28993=>1000,28994=>1000,28995=>1000,28996=>1000,28997=>1000,28998=>1000,28999=>1000,29000=>1000,29001=>1000,29002=>1000,29003=>1000,29004=>1000,29005=>1000,29006=>1000,29007=>1000,29008=>1000,29009=>1000,29010=>1000,29011=>1000,29012=>1000,29013=>1000,29014=>1000,29015=>1000,29016=>1000,29017=>1000,29018=>1000,29019=>1000,29020=>1000,29021=>1000,29022=>1000,29023=>1000,29024=>1000,29025=>1000,29026=>1000,29027=>1000,29028=>1000,29029=>1000,29030=>1000,29031=>1000,29032=>1000,29033=>1000,29034=>1000,29035=>1000,29036=>1000,29037=>1000,29038=>1000,29039=>1000,29040=>1000,29041=>1000,29042=>1000,29043=>1000,29044=>1000,29045=>1000,29046=>1000,29047=>1000,29048=>1000,29049=>1000,29050=>1000,29051=>1000,29052=>1000,29053=>1000,29054=>1000,29055=>1000,29056=>1000,29057=>1000,29058=>1000,29059=>1000,29060=>1000,29061=>1000,29062=>1000,29063=>1000,29064=>1000,29065=>1000,29066=>1000,29067=>1000,29068=>1000,29069=>1000,29070=>1000,29071=>1000,29072=>1000,29073=>1000,29074=>1000,29075=>1000,29076=>1000,29077=>1000,29078=>1000,29079=>1000,29080=>1000,29081=>1000,29082=>1000,29083=>1000,29084=>1000,29085=>1000,29086=>1000,29087=>1000,29088=>1000,29089=>1000,29090=>1000,29091=>1000,29092=>1000,29093=>1000,29094=>1000,29095=>1000,29096=>1000,29097=>1000,29098=>1000,29099=>1000,29100=>1000,29101=>1000,29102=>1000,29103=>1000,29104=>1000,29105=>1000,29106=>1000,29107=>1000,29108=>1000,29109=>1000,29110=>1000,29111=>1000,29112=>1000,29113=>1000,29114=>1000,29115=>1000,29116=>1000,29117=>1000,29118=>1000,29119=>1000,29120=>1000,29121=>1000,29122=>1000,29123=>1000,29124=>1000,29125=>1000,29126=>1000,29127=>1000,29128=>1000,29129=>1000,29130=>1000,29131=>1000,29132=>1000,29133=>1000,29134=>1000,29135=>1000,29136=>1000,29137=>1000,29138=>1000,29139=>1000,29140=>1000,29141=>1000,29142=>1000,29143=>1000,29144=>1000,29145=>1000,29146=>1000,29147=>1000,29148=>1000,29149=>1000,29150=>1000,29151=>1000,29152=>1000,29153=>1000,29154=>1000,29155=>1000,29156=>1000,29157=>1000,29158=>1000,29159=>1000,29160=>1000,29161=>1000,29162=>1000,29163=>1000,29164=>1000,29165=>1000,29166=>1000,29167=>1000,29168=>1000,29169=>1000,29170=>1000,29171=>1000,29172=>1000,29173=>1000,29174=>1000,29175=>1000,29176=>1000,29177=>1000,29178=>1000,29179=>1000,29180=>1000,29181=>1000,29182=>1000,29183=>1000,29184=>1000,29185=>1000,29186=>1000,29187=>1000,29188=>1000,29189=>1000,29190=>1000,29191=>1000,29192=>1000,29193=>1000,29194=>1000,29195=>1000,29196=>1000,29197=>1000,29198=>1000,29199=>1000,29200=>1000,29201=>1000,29202=>1000,29203=>1000,29204=>1000,29205=>1000,29206=>1000,29207=>1000,29208=>1000,29209=>1000,29210=>1000,29211=>1000,29212=>1000,29213=>1000,29214=>1000,29215=>1000,29216=>1000,29217=>1000,29218=>1000,29219=>1000,29220=>1000,29221=>1000,29222=>1000,29223=>1000,29224=>1000,29225=>1000,29226=>1000,29227=>1000,29228=>1000,29229=>1000,29230=>1000,29231=>1000,29232=>1000,29233=>1000,29234=>1000,29235=>1000,29236=>1000,29237=>1000,29238=>1000,29239=>1000,29240=>1000,29241=>1000,29242=>1000,29243=>1000,29244=>1000,29245=>1000,29246=>1000,29247=>1000,29248=>1000,29249=>1000,29250=>1000,29251=>1000,29252=>1000,29253=>1000,29254=>1000,29255=>1000,29256=>1000,29257=>1000,29258=>1000,29259=>1000,29260=>1000,29261=>1000,29262=>1000,29263=>1000,29264=>1000,29265=>1000,29266=>1000,29267=>1000,29268=>1000,29269=>1000,29270=>1000,29271=>1000,29272=>1000,29273=>1000,29274=>1000,29275=>1000,29276=>1000,29277=>1000,29278=>1000,29279=>1000,29280=>1000,29281=>1000,29282=>1000,29283=>1000,29284=>1000,29285=>1000,29286=>1000,29287=>1000,29288=>1000,29289=>1000,29290=>1000,29291=>1000,29292=>1000,29293=>1000,29294=>1000,29295=>1000,29296=>1000,29297=>1000,29298=>1000,29299=>1000,29300=>1000,29301=>1000,29302=>1000,29303=>1000,29304=>1000,29305=>1000,29306=>1000,29307=>1000,29308=>1000,29309=>1000,29310=>1000,29311=>1000,29312=>1000,29313=>1000,29314=>1000,29315=>1000,29316=>1000,29317=>1000,29318=>1000,29319=>1000,29320=>1000,29321=>1000,29322=>1000,29323=>1000,29324=>1000,29325=>1000,29326=>1000,29327=>1000,29328=>1000,29329=>1000,29330=>1000,29331=>1000,29332=>1000,29333=>1000,29334=>1000,29335=>1000,29336=>1000,29337=>1000,29338=>1000,29339=>1000,29340=>1000,29341=>1000,29342=>1000,29343=>1000,29344=>1000,29345=>1000,29346=>1000,29347=>1000,29348=>1000,29349=>1000,29350=>1000,29351=>1000,29352=>1000,29353=>1000,29354=>1000,29355=>1000,29356=>1000,29357=>1000,29358=>1000,29359=>1000,29360=>1000,29361=>1000,29362=>1000,29363=>1000,29364=>1000,29365=>1000,29366=>1000,29367=>1000,29368=>1000,29369=>1000,29370=>1000,29371=>1000,29372=>1000,29373=>1000,29374=>1000,29375=>1000,29376=>1000,29377=>1000,29378=>1000,29379=>1000,29380=>1000,29381=>1000,29382=>1000,29383=>1000,29384=>1000,29385=>1000,29386=>1000,29387=>1000,29388=>1000,29389=>1000,29390=>1000,29391=>1000,29392=>1000,29393=>1000,29394=>1000,29395=>1000,29396=>1000,29397=>1000,29398=>1000,29399=>1000,29400=>1000,29401=>1000,29402=>1000,29403=>1000,29404=>1000,29405=>1000,29406=>1000,29407=>1000,29408=>1000,29409=>1000,29410=>1000,29411=>1000,29412=>1000,29413=>1000,29414=>1000,29415=>1000,29416=>1000,29417=>1000,29418=>1000,29419=>1000,29420=>1000,29421=>1000,29422=>1000,29423=>1000,29424=>1000,29425=>1000,29426=>1000,29427=>1000,29428=>1000,29429=>1000,29430=>1000,29431=>1000,29432=>1000,29433=>1000,29434=>1000,29435=>1000,29436=>1000,29437=>1000,29438=>1000,29439=>1000,29440=>1000,29441=>1000,29442=>1000,29443=>1000,29444=>1000,29445=>1000,29446=>1000,29447=>1000,29448=>1000,29449=>1000,29450=>1000,29451=>1000,29452=>1000,29453=>1000,29454=>1000,29455=>1000,29456=>1000,29457=>1000,29458=>1000,29459=>1000,29460=>1000,29461=>1000,29462=>1000,29463=>1000,29464=>1000,29465=>1000,29466=>1000,29467=>1000,29468=>1000,29469=>1000,29470=>1000,29471=>1000,29472=>1000,29473=>1000,29474=>1000,29475=>1000,29476=>1000,29477=>1000,29478=>1000,29479=>1000,29480=>1000,29481=>1000,29482=>1000,29483=>1000,29484=>1000,29485=>1000,29486=>1000,29487=>1000,29488=>1000,29489=>1000,29490=>1000,29491=>1000,29492=>1000,29493=>1000,29494=>1000,29495=>1000,29496=>1000,29497=>1000,29498=>1000,29499=>1000,29500=>1000,29501=>1000,29502=>1000,29503=>1000,29504=>1000,29505=>1000,29506=>1000,29507=>1000,29508=>1000,29509=>1000,29510=>1000,29511=>1000,29512=>1000,29513=>1000,29514=>1000,29515=>1000,29516=>1000,29517=>1000,29518=>1000,29519=>1000,29520=>1000,29521=>1000,29522=>1000,29523=>1000,29524=>1000,29525=>1000,29526=>1000,29527=>1000,29528=>1000,29529=>1000,29530=>1000,29531=>1000,29532=>1000,29533=>1000,29534=>1000,29535=>1000,29536=>1000,29537=>1000,29538=>1000,29539=>1000,29540=>1000,29541=>1000,29542=>1000,29543=>1000,29544=>1000,29545=>1000,29546=>1000,29547=>1000,29548=>1000,29549=>1000,29550=>1000,29551=>1000,29552=>1000,29553=>1000,29554=>1000,29555=>1000,29556=>1000,29557=>1000,29558=>1000,29559=>1000,29560=>1000,29561=>1000,29562=>1000,29563=>1000,29564=>1000,29565=>1000,29566=>1000,29567=>1000,29568=>1000,29569=>1000,29570=>1000,29571=>1000,29572=>1000,29573=>1000,29574=>1000,29575=>1000,29576=>1000,29577=>1000,29578=>1000,29579=>1000,29580=>1000,29581=>1000,29582=>1000,29583=>1000,29584=>1000,29585=>1000,29586=>1000,29587=>1000,29588=>1000,29589=>1000,29590=>1000,29591=>1000,29592=>1000,29593=>1000,29594=>1000,29595=>1000,29596=>1000,29597=>1000,29598=>1000,29599=>1000,29600=>1000,29601=>1000,29602=>1000,29603=>1000,29604=>1000,29605=>1000,29606=>1000,29607=>1000,29608=>1000,29609=>1000,29610=>1000,29611=>1000,29612=>1000,29613=>1000,29614=>1000,29615=>1000,29616=>1000,29617=>1000,29618=>1000,29619=>1000,29620=>1000,29621=>1000,29622=>1000,29623=>1000,29624=>1000,29625=>1000,29626=>1000,29627=>1000,29628=>1000,29629=>1000,29630=>1000,29631=>1000,29632=>1000,29633=>1000,29634=>1000,29635=>1000,29636=>1000,29637=>1000,29638=>1000,29639=>1000,29640=>1000,29641=>1000,29642=>1000,29643=>1000,29644=>1000,29645=>1000,29646=>1000,29647=>1000,29648=>1000,29649=>1000,29650=>1000,29651=>1000,29652=>1000,29653=>1000,29654=>1000,29655=>1000,29656=>1000,29657=>1000,29658=>1000,29659=>1000,29660=>1000,29661=>1000,29662=>1000,29663=>1000,29664=>1000,29665=>1000,29666=>1000,29667=>1000,29668=>1000,29669=>1000,29670=>1000,29671=>1000,29672=>1000,29673=>1000,29674=>1000,29675=>1000,29676=>1000,29677=>1000,29678=>1000,29679=>1000,29680=>1000,29681=>1000,29682=>1000,29683=>1000,29684=>1000,29685=>1000,29686=>1000,29687=>1000,29688=>1000,29689=>1000,29690=>1000,29691=>1000,29692=>1000,29693=>1000,29694=>1000,29695=>1000,29696=>1000,29697=>1000,29698=>1000,29699=>1000,29700=>1000,29701=>1000,29702=>1000,29703=>1000,29704=>1000,29705=>1000,29706=>1000,29707=>1000,29708=>1000,29709=>1000,29710=>1000,29711=>1000,29712=>1000,29713=>1000,29714=>1000,29715=>1000,29716=>1000,29717=>1000,29718=>1000,29719=>1000,29720=>1000,29721=>1000,29722=>1000,29723=>1000,29724=>1000,29725=>1000,29726=>1000,29727=>1000,29728=>1000,29729=>1000,29730=>1000,29731=>1000,29732=>1000,29733=>1000,29734=>1000,29735=>1000,29736=>1000,29737=>1000,29738=>1000,29739=>1000,29740=>1000,29741=>1000,29742=>1000,29743=>1000,29744=>1000,29745=>1000,29746=>1000,29747=>1000,29748=>1000,29749=>1000,29750=>1000,29751=>1000,29752=>1000,29753=>1000,29754=>1000,29755=>1000,29756=>1000,29757=>1000,29758=>1000,29759=>1000,29760=>1000,29761=>1000,29762=>1000,29763=>1000,29764=>1000,29765=>1000,29766=>1000,29767=>1000,29768=>1000,29769=>1000,29770=>1000,29771=>1000,29772=>1000,29773=>1000,29774=>1000,29775=>1000,29776=>1000,29777=>1000,29778=>1000,29779=>1000,29780=>1000,29781=>1000,29782=>1000,29783=>1000,29784=>1000,29785=>1000,29786=>1000,29787=>1000,29788=>1000,29789=>1000,29790=>1000,29791=>1000,29792=>1000,29793=>1000,29794=>1000,29795=>1000,29796=>1000,29797=>1000,29798=>1000,29799=>1000,29800=>1000,29801=>1000,29802=>1000,29803=>1000,29804=>1000,29805=>1000,29806=>1000,29807=>1000,29808=>1000,29809=>1000,29810=>1000,29811=>1000,29812=>1000,29813=>1000,29814=>1000,29815=>1000,29816=>1000,29817=>1000,29818=>1000,29819=>1000,29820=>1000,29821=>1000,29822=>1000,29823=>1000,29824=>1000,29825=>1000,29826=>1000,29827=>1000,29828=>1000,29829=>1000,29830=>1000,29831=>1000,29832=>1000,29833=>1000,29834=>1000,29835=>1000,29836=>1000,29837=>1000,29838=>1000,29839=>1000,29840=>1000,29841=>1000,29842=>1000,29843=>1000,29844=>1000,29845=>1000,29846=>1000,29847=>1000,29848=>1000,29849=>1000,29850=>1000,29851=>1000,29852=>1000,29853=>1000,29854=>1000,29855=>1000,29856=>1000,29857=>1000,29858=>1000,29859=>1000,29860=>1000,29861=>1000,29862=>1000,29863=>1000,29864=>1000,29865=>1000,29866=>1000,29867=>1000,29868=>1000,29869=>1000,29870=>1000,29871=>1000,29872=>1000,29873=>1000,29874=>1000,29875=>1000,29876=>1000,29877=>1000,29878=>1000,29879=>1000,29880=>1000,29881=>1000,29882=>1000,29883=>1000,29884=>1000,29885=>1000,29886=>1000,29887=>1000,29888=>1000,29889=>1000,29890=>1000,29891=>1000,29892=>1000,29893=>1000,29894=>1000,29895=>1000,29896=>1000,29897=>1000,29898=>1000,29899=>1000,29900=>1000,29901=>1000,29902=>1000,29903=>1000,29904=>1000,29905=>1000,29906=>1000,29907=>1000,29908=>1000,29909=>1000,29910=>1000,29911=>1000,29912=>1000,29913=>1000,29914=>1000,29915=>1000,29916=>1000,29917=>1000,29918=>1000,29919=>1000,29920=>1000,29921=>1000,29922=>1000,29923=>1000,29924=>1000,29925=>1000,29926=>1000,29927=>1000,29928=>1000,29929=>1000,29930=>1000,29931=>1000,29932=>1000,29933=>1000,29934=>1000,29935=>1000,29936=>1000,29937=>1000,29938=>1000,29939=>1000,29940=>1000,29941=>1000,29942=>1000,29943=>1000,29944=>1000,29945=>1000,29946=>1000,29947=>1000,29948=>1000,29949=>1000,29950=>1000,29951=>1000,29952=>1000,29953=>1000,29954=>1000,29955=>1000,29956=>1000,29957=>1000,29958=>1000,29959=>1000,29960=>1000,29961=>1000,29962=>1000,29963=>1000,29964=>1000,29965=>1000,29966=>1000,29967=>1000,29968=>1000,29969=>1000,29970=>1000,29971=>1000,29972=>1000,29973=>1000,29974=>1000,29975=>1000,29976=>1000,29977=>1000,29978=>1000,29979=>1000,29980=>1000,29981=>1000,29982=>1000,29983=>1000,29984=>1000,29985=>1000,29986=>1000,29987=>1000,29988=>1000,29989=>1000,29990=>1000,29991=>1000,29992=>1000,29993=>1000,29994=>1000,29995=>1000,29996=>1000,29997=>1000,29998=>1000,29999=>1000,30000=>1000,30001=>1000,30002=>1000,30003=>1000,30004=>1000,30005=>1000,30006=>1000,30007=>1000,30008=>1000,30009=>1000,30010=>1000,30011=>1000,30012=>1000,30013=>1000,30014=>1000,30015=>1000,30016=>1000,30017=>1000,30018=>1000,30019=>1000,30020=>1000,30021=>1000,30022=>1000,30023=>1000,30024=>1000,30025=>1000,30026=>1000,30027=>1000,30028=>1000,30029=>1000,30030=>1000,30031=>1000,30032=>1000,30033=>1000,30034=>1000,30035=>1000,30036=>1000,30037=>1000,30038=>1000,30039=>1000,30040=>1000,30041=>1000,30042=>1000,30043=>1000,30044=>1000,30045=>1000,30046=>1000,30047=>1000,30048=>1000,30049=>1000,30050=>1000,30051=>1000,30052=>1000,30053=>1000,30054=>1000,30055=>1000,30056=>1000,30057=>1000,30058=>1000,30059=>1000,30060=>1000,30061=>1000,30062=>1000,30063=>1000,30064=>1000,30065=>1000,30066=>1000,30067=>1000,30068=>1000,30069=>1000,30070=>1000,30071=>1000,30072=>1000,30073=>1000,30074=>1000,30075=>1000,30076=>1000,30077=>1000,30078=>1000,30079=>1000,30080=>1000,30081=>1000,30082=>1000,30083=>1000,30084=>1000,30085=>1000,30086=>1000,30087=>1000,30088=>1000,30089=>1000,30090=>1000,30091=>1000,30092=>1000,30093=>1000,30094=>1000,30095=>1000,30096=>1000,30097=>1000,30098=>1000,30099=>1000,30100=>1000,30101=>1000,30102=>1000,30103=>1000,30104=>1000,30105=>1000,30106=>1000,30107=>1000,30108=>1000,30109=>1000,30110=>1000,30111=>1000,30112=>1000,30113=>1000,30114=>1000,30115=>1000,30116=>1000,30117=>1000,30118=>1000,30119=>1000,30120=>1000,30121=>1000,30122=>1000,30123=>1000,30124=>1000,30125=>1000,30126=>1000,30127=>1000,30128=>1000,30129=>1000,30130=>1000,30131=>1000,30132=>1000,30133=>1000,30134=>1000,30135=>1000,30136=>1000,30137=>1000,30138=>1000,30139=>1000,30140=>1000,30141=>1000,30142=>1000,30143=>1000,30144=>1000,30145=>1000,30146=>1000,30147=>1000,30148=>1000,30149=>1000,30150=>1000,30151=>1000,30152=>1000,30153=>1000,30154=>1000,30155=>1000,30156=>1000,30157=>1000,30158=>1000,30159=>1000,30160=>1000,30161=>1000,30162=>1000,30163=>1000,30164=>1000,30165=>1000,30166=>1000,30167=>1000,30168=>1000,30169=>1000,30170=>1000,30171=>1000,30172=>1000,30173=>1000,30174=>1000,30175=>1000,30176=>1000,30177=>1000,30178=>1000,30179=>1000,30180=>1000,30181=>1000,30182=>1000,30183=>1000,30184=>1000,30185=>1000,30186=>1000,30187=>1000,30188=>1000,30189=>1000,30190=>1000,30191=>1000,30192=>1000,30193=>1000,30194=>1000,30195=>1000,30196=>1000,30197=>1000,30198=>1000,30199=>1000,30200=>1000,30201=>1000,30202=>1000,30203=>1000,30204=>1000,30205=>1000,30206=>1000,30207=>1000,30208=>1000,30209=>1000,30210=>1000,30211=>1000,30212=>1000,30213=>1000,30214=>1000,30215=>1000,30216=>1000,30217=>1000,30218=>1000,30219=>1000,30220=>1000,30221=>1000,30222=>1000,30223=>1000,30224=>1000,30225=>1000,30226=>1000,30227=>1000,30228=>1000,30229=>1000,30230=>1000,30231=>1000,30232=>1000,30233=>1000,30234=>1000,30235=>1000,30236=>1000,30237=>1000,30238=>1000,30239=>1000,30240=>1000,30241=>1000,30242=>1000,30243=>1000,30244=>1000,30245=>1000,30246=>1000,30247=>1000,30248=>1000,30249=>1000,30250=>1000,30251=>1000,30252=>1000,30253=>1000,30254=>1000,30255=>1000,30256=>1000,30257=>1000,30258=>1000,30259=>1000,30260=>1000,30261=>1000,30262=>1000,30263=>1000,30264=>1000,30265=>1000,30266=>1000,30267=>1000,30268=>1000,30269=>1000,30270=>1000,30271=>1000,30272=>1000,30273=>1000,30274=>1000,30275=>1000,30276=>1000,30277=>1000,30278=>1000,30279=>1000,30280=>1000,30281=>1000,30282=>1000,30283=>1000,30284=>1000,30285=>1000,30286=>1000,30287=>1000,30288=>1000,30289=>1000,30290=>1000,30291=>1000,30292=>1000,30293=>1000,30294=>1000,30295=>1000,30296=>1000,30297=>1000,30298=>1000,30299=>1000,30300=>1000,30301=>1000,30302=>1000,30303=>1000,30304=>1000,30305=>1000,30306=>1000,30307=>1000,30308=>1000,30309=>1000,30310=>1000,30311=>1000,30312=>1000,30313=>1000,30314=>1000,30315=>1000,30316=>1000,30317=>1000,30318=>1000,30319=>1000,30320=>1000,30321=>1000,30322=>1000,30323=>1000,30324=>1000,30325=>1000,30326=>1000,30327=>1000,30328=>1000,30329=>1000,30330=>1000,30331=>1000,30332=>1000,30333=>1000,30334=>1000,30335=>1000,30336=>1000,30337=>1000,30338=>1000,30339=>1000,30340=>1000,30341=>1000,30342=>1000,30343=>1000,30344=>1000,30345=>1000,30346=>1000,30347=>1000,30348=>1000,30349=>1000,30350=>1000,30351=>1000,30352=>1000,30353=>1000,30354=>1000,30355=>1000,30356=>1000,30357=>1000,30358=>1000,30359=>1000,30360=>1000,30361=>1000,30362=>1000,30363=>1000,30364=>1000,30365=>1000,30366=>1000,30367=>1000,30368=>1000,30369=>1000,30370=>1000,30371=>1000,30372=>1000,30373=>1000,30374=>1000,30375=>1000,30376=>1000,30377=>1000,30378=>1000,30379=>1000,30380=>1000,30381=>1000,30382=>1000,30383=>1000,30384=>1000,30385=>1000,30386=>1000,30387=>1000,30388=>1000,30389=>1000,30390=>1000,30391=>1000,30392=>1000,30393=>1000,30394=>1000,30395=>1000,30396=>1000,30397=>1000,30398=>1000,30399=>1000,30400=>1000,30401=>1000,30402=>1000,30403=>1000,30404=>1000,30405=>1000,30406=>1000,30407=>1000,30408=>1000,30409=>1000,30410=>1000,30411=>1000,30412=>1000,30413=>1000,30414=>1000,30415=>1000,30416=>1000,30417=>1000,30418=>1000,30419=>1000,30420=>1000,30421=>1000,30422=>1000,30423=>1000,30424=>1000,30425=>1000,30426=>1000,30427=>1000,30428=>1000,30429=>1000,30430=>1000,30431=>1000,30432=>1000,30433=>1000,30434=>1000,30435=>1000,30436=>1000,30437=>1000,30438=>1000,30439=>1000,30440=>1000,30441=>1000,30442=>1000,30443=>1000,30444=>1000,30445=>1000,30446=>1000,30447=>1000,30448=>1000,30449=>1000,30450=>1000,30451=>1000,30452=>1000,30453=>1000,30454=>1000,30455=>1000,30456=>1000,30457=>1000,30458=>1000,30459=>1000,30460=>1000,30461=>1000,30462=>1000,30463=>1000,30464=>1000,30465=>1000,30466=>1000,30467=>1000,30468=>1000,30469=>1000,30470=>1000,30471=>1000,30472=>1000,30473=>1000,30474=>1000,30475=>1000,30476=>1000,30477=>1000,30478=>1000,30479=>1000,30480=>1000,30481=>1000,30482=>1000,30483=>1000,30484=>1000,30485=>1000,30486=>1000,30487=>1000,30488=>1000,30489=>1000,30490=>1000,30491=>1000,30492=>1000,30493=>1000,30494=>1000,30495=>1000,30496=>1000,30497=>1000,30498=>1000,30499=>1000,30500=>1000,30501=>1000,30502=>1000,30503=>1000,30504=>1000,30505=>1000,30506=>1000,30507=>1000,30508=>1000,30509=>1000,30510=>1000,30511=>1000,30512=>1000,30513=>1000,30514=>1000,30515=>1000,30516=>1000,30517=>1000,30518=>1000,30519=>1000,30520=>1000,30521=>1000,30522=>1000,30523=>1000,30524=>1000,30525=>1000,30526=>1000,30527=>1000,30528=>1000,30529=>1000,30530=>1000,30531=>1000,30532=>1000,30533=>1000,30534=>1000,30535=>1000,30536=>1000,30537=>1000,30538=>1000,30539=>1000,30540=>1000,30541=>1000,30542=>1000,30543=>1000,30544=>1000,30545=>1000,30546=>1000,30547=>1000,30548=>1000,30549=>1000,30550=>1000,30551=>1000,30552=>1000,30553=>1000,30554=>1000,30555=>1000,30556=>1000,30557=>1000,30558=>1000,30559=>1000,30560=>1000,30561=>1000,30562=>1000,30563=>1000,30564=>1000,30565=>1000,30566=>1000,30567=>1000,30568=>1000,30569=>1000,30570=>1000,30571=>1000,30572=>1000,30573=>1000,30574=>1000,30575=>1000,30576=>1000,30577=>1000,30578=>1000,30579=>1000,30580=>1000,30581=>1000,30582=>1000,30583=>1000,30584=>1000,30585=>1000,30586=>1000,30587=>1000,30588=>1000,30589=>1000,30590=>1000,30591=>1000,30592=>1000,30593=>1000,30594=>1000,30595=>1000,30596=>1000,30597=>1000,30598=>1000,30599=>1000,30600=>1000,30601=>1000,30602=>1000,30603=>1000,30604=>1000,30605=>1000,30606=>1000,30607=>1000,30608=>1000,30609=>1000,30610=>1000,30611=>1000,30612=>1000,30613=>1000,30614=>1000,30615=>1000,30616=>1000,30617=>1000,30618=>1000,30619=>1000,30620=>1000,30621=>1000,30622=>1000,30623=>1000,30624=>1000,30625=>1000,30626=>1000,30627=>1000,30628=>1000,30629=>1000,30630=>1000,30631=>1000,30632=>1000,30633=>1000,30634=>1000,30635=>1000,30636=>1000,30637=>1000,30638=>1000,30639=>1000,30640=>1000,30641=>1000,30642=>1000,30643=>1000,30644=>1000,30645=>1000,30646=>1000,30647=>1000,30648=>1000,30649=>1000,30650=>1000,30651=>1000,30652=>1000,30653=>1000,30654=>1000,30655=>1000,30656=>1000,30657=>1000,30658=>1000,30659=>1000,30660=>1000,30661=>1000,30662=>1000,30663=>1000,30664=>1000,30665=>1000,30666=>1000,30667=>1000,30668=>1000,30669=>1000,30670=>1000,30671=>1000,30672=>1000,30673=>1000,30674=>1000,30675=>1000,30676=>1000,30677=>1000,30678=>1000,30679=>1000,30680=>1000,30681=>1000,30682=>1000,30683=>1000,30684=>1000,30685=>1000,30686=>1000,30687=>1000,30688=>1000,30689=>1000,30690=>1000,30691=>1000,30692=>1000,30693=>1000,30694=>1000,30695=>1000,30696=>1000,30697=>1000,30698=>1000,30699=>1000,30700=>1000,30701=>1000,30702=>1000,30703=>1000,30704=>1000,30705=>1000,30706=>1000,30707=>1000,30708=>1000,30709=>1000,30710=>1000,30711=>1000,30712=>1000,30713=>1000,30714=>1000,30715=>1000,30716=>1000,30717=>1000,30718=>1000,30719=>1000,30720=>1000,30721=>1000,30722=>1000,30723=>1000,30724=>1000,30725=>1000,30726=>1000,30727=>1000,30728=>1000,30729=>1000,30730=>1000,30731=>1000,30732=>1000,30733=>1000,30734=>1000,30735=>1000,30736=>1000,30737=>1000,30738=>1000,30739=>1000,30740=>1000,30741=>1000,30742=>1000,30743=>1000,30744=>1000,30745=>1000,30746=>1000,30747=>1000,30748=>1000,30749=>1000,30750=>1000,30751=>1000,30752=>1000,30753=>1000,30754=>1000,30755=>1000,30756=>1000,30757=>1000,30758=>1000,30759=>1000,30760=>1000,30761=>1000,30762=>1000,30763=>1000,30764=>1000,30765=>1000,30766=>1000,30767=>1000,30768=>1000,30769=>1000,30770=>1000,30771=>1000,30772=>1000,30773=>1000,30774=>1000,30775=>1000,30776=>1000,30777=>1000,30778=>1000,30779=>1000,30780=>1000,30781=>1000,30782=>1000,30783=>1000,30784=>1000,30785=>1000,30786=>1000,30787=>1000,30788=>1000,30789=>1000,30790=>1000,30791=>1000,30792=>1000,30793=>1000,30794=>1000,30795=>1000,30796=>1000,30797=>1000,30798=>1000,30799=>1000,30800=>1000,30801=>1000,30802=>1000,30803=>1000,30804=>1000,30805=>1000,30806=>1000,30807=>1000,30808=>1000,30809=>1000,30810=>1000,30811=>1000,30812=>1000,30813=>1000,30814=>1000,30815=>1000,30816=>1000,30817=>1000,30818=>1000,30819=>1000,30820=>1000,30821=>1000,30822=>1000,30823=>1000,30824=>1000,30825=>1000,30826=>1000,30827=>1000,30828=>1000,30829=>1000,30830=>1000,30831=>1000,30832=>1000,30833=>1000,30834=>1000,30835=>1000,30836=>1000,30837=>1000,30838=>1000,30839=>1000,30840=>1000,30841=>1000,30842=>1000,30843=>1000,30844=>1000,30845=>1000,30846=>1000,30847=>1000,30848=>1000,30849=>1000,30850=>1000,30851=>1000,30852=>1000,30853=>1000,30854=>1000,30855=>1000,30856=>1000,30857=>1000,30858=>1000,30859=>1000,30860=>1000,30861=>1000,30862=>1000,30863=>1000,30864=>1000,30865=>1000,30866=>1000,30867=>1000,30868=>1000,30869=>1000,30870=>1000,30871=>1000,30872=>1000,30873=>1000,30874=>1000,30875=>1000,30876=>1000,30877=>1000,30878=>1000,30879=>1000,30880=>1000,30881=>1000,30882=>1000,30883=>1000,30884=>1000,30885=>1000,30886=>1000,30887=>1000,30888=>1000,30889=>1000,30890=>1000,30891=>1000,30892=>1000,30893=>1000,30894=>1000,30895=>1000,30896=>1000,30897=>1000,30898=>1000,30899=>1000,30900=>1000,30901=>1000,30902=>1000,30903=>1000,30904=>1000,30905=>1000,30906=>1000,30907=>1000,30908=>1000,30909=>1000,30910=>1000,30911=>1000,30912=>1000,30913=>1000,30914=>1000,30915=>1000,30916=>1000,30917=>1000,30918=>1000,30919=>1000,30920=>1000,30921=>1000,30922=>1000,30923=>1000,30924=>1000,30925=>1000,30926=>1000,30927=>1000,30928=>1000,30929=>1000,30930=>1000,30931=>1000,30932=>1000,30933=>1000,30934=>1000,30935=>1000,30936=>1000,30937=>1000,30938=>1000,30939=>1000,30940=>1000,30941=>1000,30942=>1000,30943=>1000,30944=>1000,30945=>1000,30946=>1000,30947=>1000,30948=>1000,30949=>1000,30950=>1000,30951=>1000,30952=>1000,30953=>1000,30954=>1000,30955=>1000,30956=>1000,30957=>1000,30958=>1000,30959=>1000,30960=>1000,30961=>1000,30962=>1000,30963=>1000,30964=>1000,30965=>1000,30966=>1000,30967=>1000,30968=>1000,30969=>1000,30970=>1000,30971=>1000,30972=>1000,30973=>1000,30974=>1000,30975=>1000,30976=>1000,30977=>1000,30978=>1000,30979=>1000,30980=>1000,30981=>1000,30982=>1000,30983=>1000,30984=>1000,30985=>1000,30986=>1000,30987=>1000,30988=>1000,30989=>1000,30990=>1000,30991=>1000,30992=>1000,30993=>1000,30994=>1000,30995=>1000,30996=>1000,30997=>1000,30998=>1000,30999=>1000,31000=>1000,31001=>1000,31002=>1000,31003=>1000,31004=>1000,31005=>1000,31006=>1000,31007=>1000,31008=>1000,31009=>1000,31010=>1000,31011=>1000,31012=>1000,31013=>1000,31014=>1000,31015=>1000,31016=>1000,31017=>1000,31018=>1000,31019=>1000,31020=>1000,31021=>1000,31022=>1000,31023=>1000,31024=>1000,31025=>1000,31026=>1000,31027=>1000,31028=>1000,31029=>1000,31030=>1000,31031=>1000,31032=>1000,31033=>1000,31034=>1000,31035=>1000,31036=>1000,31037=>1000,31038=>1000,31039=>1000,31040=>1000,31041=>1000,31042=>1000,31043=>1000,31044=>1000,31045=>1000,31046=>1000,31047=>1000,31048=>1000,31049=>1000,31050=>1000,31051=>1000,31052=>1000,31053=>1000,31054=>1000,31055=>1000,31056=>1000,31057=>1000,31058=>1000,31059=>1000,31060=>1000,31061=>1000,31062=>1000,31063=>1000,31064=>1000,31065=>1000,31066=>1000,31067=>1000,31068=>1000,31069=>1000,31070=>1000,31071=>1000,31072=>1000,31073=>1000,31074=>1000,31075=>1000,31076=>1000,31077=>1000,31078=>1000,31079=>1000,31080=>1000,31081=>1000,31082=>1000,31083=>1000,31084=>1000,31085=>1000,31086=>1000,31087=>1000,31088=>1000,31089=>1000,31090=>1000,31091=>1000,31092=>1000,31093=>1000,31094=>1000,31095=>1000,31096=>1000,31097=>1000,31098=>1000,31099=>1000,31100=>1000,31101=>1000,31102=>1000,31103=>1000,31104=>1000,31105=>1000,31106=>1000,31107=>1000,31108=>1000,31109=>1000,31110=>1000,31111=>1000,31112=>1000,31113=>1000,31114=>1000,31115=>1000,31116=>1000,31117=>1000,31118=>1000,31119=>1000,31120=>1000,31121=>1000,31122=>1000,31123=>1000,31124=>1000,31125=>1000,31126=>1000,31127=>1000,31128=>1000,31129=>1000,31130=>1000,31131=>1000,31132=>1000,31133=>1000,31134=>1000,31135=>1000,31136=>1000,31137=>1000,31138=>1000,31139=>1000,31140=>1000,31141=>1000,31142=>1000,31143=>1000,31144=>1000,31145=>1000,31146=>1000,31147=>1000,31148=>1000,31149=>1000,31150=>1000,31151=>1000,31152=>1000,31153=>1000,31154=>1000,31155=>1000,31156=>1000,31157=>1000,31158=>1000,31159=>1000,31160=>1000,31161=>1000,31162=>1000,31163=>1000,31164=>1000,31165=>1000,31166=>1000,31167=>1000,31168=>1000,31169=>1000,31170=>1000,31171=>1000,31172=>1000,31173=>1000,31174=>1000,31175=>1000,31176=>1000,31177=>1000,31178=>1000,31179=>1000,31180=>1000,31181=>1000,31182=>1000,31183=>1000,31184=>1000,31185=>1000,31186=>1000,31187=>1000,31188=>1000,31189=>1000,31190=>1000,31191=>1000,31192=>1000,31193=>1000,31194=>1000,31195=>1000,31196=>1000,31197=>1000,31198=>1000,31199=>1000,31200=>1000,31201=>1000,31202=>1000,31203=>1000,31204=>1000,31205=>1000,31206=>1000,31207=>1000,31208=>1000,31209=>1000,31210=>1000,31211=>1000,31212=>1000,31213=>1000,31214=>1000,31215=>1000,31216=>1000,31217=>1000,31218=>1000,31219=>1000,31220=>1000,31221=>1000,31222=>1000,31223=>1000,31224=>1000,31225=>1000,31226=>1000,31227=>1000,31228=>1000,31229=>1000,31230=>1000,31231=>1000,31232=>1000,31233=>1000,31234=>1000,31235=>1000,31236=>1000,31237=>1000,31238=>1000,31239=>1000,31240=>1000,31241=>1000,31242=>1000,31243=>1000,31244=>1000,31245=>1000,31246=>1000,31247=>1000,31248=>1000,31249=>1000,31250=>1000,31251=>1000,31252=>1000,31253=>1000,31254=>1000,31255=>1000,31256=>1000,31257=>1000,31258=>1000,31259=>1000,31260=>1000,31261=>1000,31262=>1000,31263=>1000,31264=>1000,31265=>1000,31266=>1000,31267=>1000,31268=>1000,31269=>1000,31270=>1000,31271=>1000,31272=>1000,31273=>1000,31274=>1000,31275=>1000,31276=>1000,31277=>1000,31278=>1000,31279=>1000,31280=>1000,31281=>1000,31282=>1000,31283=>1000,31284=>1000,31285=>1000,31286=>1000,31287=>1000,31288=>1000,31289=>1000,31290=>1000,31291=>1000,31292=>1000,31293=>1000,31294=>1000,31295=>1000,31296=>1000,31297=>1000,31298=>1000,31299=>1000,31300=>1000,31301=>1000,31302=>1000,31303=>1000,31304=>1000,31305=>1000,31306=>1000,31307=>1000,31308=>1000,31309=>1000,31310=>1000,31311=>1000,31312=>1000,31313=>1000,31314=>1000,31315=>1000,31316=>1000,31317=>1000,31318=>1000,31319=>1000,31320=>1000,31321=>1000,31322=>1000,31323=>1000,31324=>1000,31325=>1000,31326=>1000,31327=>1000,31328=>1000,31329=>1000,31330=>1000,31331=>1000,31332=>1000,31333=>1000,31334=>1000,31335=>1000,31336=>1000,31337=>1000,31338=>1000,31339=>1000,31340=>1000,31341=>1000,31342=>1000,31343=>1000,31344=>1000,31345=>1000,31346=>1000,31347=>1000,31348=>1000,31349=>1000,31350=>1000,31351=>1000,31352=>1000,31353=>1000,31354=>1000,31355=>1000,31356=>1000,31357=>1000,31358=>1000,31359=>1000,31360=>1000,31361=>1000,31362=>1000,31363=>1000,31364=>1000,31365=>1000,31366=>1000,31367=>1000,31368=>1000,31369=>1000,31370=>1000,31371=>1000,31372=>1000,31373=>1000,31374=>1000,31375=>1000,31376=>1000,31377=>1000,31378=>1000,31379=>1000,31380=>1000,31381=>1000,31382=>1000,31383=>1000,31384=>1000,31385=>1000,31386=>1000,31387=>1000,31388=>1000,31389=>1000,31390=>1000,31391=>1000,31392=>1000,31393=>1000,31394=>1000,31395=>1000,31396=>1000,31397=>1000,31398=>1000,31399=>1000,31400=>1000,31401=>1000,31402=>1000,31403=>1000,31404=>1000,31405=>1000,31406=>1000,31407=>1000,31408=>1000,31409=>1000,31410=>1000,31411=>1000,31412=>1000,31413=>1000,31414=>1000,31415=>1000,31416=>1000,31417=>1000,31418=>1000,31419=>1000,31420=>1000,31421=>1000,31422=>1000,31423=>1000,31424=>1000,31425=>1000,31426=>1000,31427=>1000,31428=>1000,31429=>1000,31430=>1000,31431=>1000,31432=>1000,31433=>1000,31434=>1000,31435=>1000,31436=>1000,31437=>1000,31438=>1000,31439=>1000,31440=>1000,31441=>1000,31442=>1000,31443=>1000,31444=>1000,31445=>1000,31446=>1000,31447=>1000,31448=>1000,31449=>1000,31450=>1000,31451=>1000,31452=>1000,31453=>1000,31454=>1000,31455=>1000,31456=>1000,31457=>1000,31458=>1000,31459=>1000,31460=>1000,31461=>1000,31462=>1000,31463=>1000,31464=>1000,31465=>1000,31466=>1000,31467=>1000,31468=>1000,31469=>1000,31470=>1000,31471=>1000,31472=>1000,31473=>1000,31474=>1000,31475=>1000,31476=>1000,31477=>1000,31478=>1000,31479=>1000,31480=>1000,31481=>1000,31482=>1000,31483=>1000,31484=>1000,31485=>1000,31486=>1000,31487=>1000,31488=>1000,31489=>1000,31490=>1000,31491=>1000,31492=>1000,31493=>1000,31494=>1000,31495=>1000,31496=>1000,31497=>1000,31498=>1000,31499=>1000,31500=>1000,31501=>1000,31502=>1000,31503=>1000,31504=>1000,31505=>1000,31506=>1000,31507=>1000,31508=>1000,31509=>1000,31510=>1000,31511=>1000,31512=>1000,31513=>1000,31514=>1000,31515=>1000,31516=>1000,31517=>1000,31518=>1000,31519=>1000,31520=>1000,31521=>1000,31522=>1000,31523=>1000,31524=>1000,31525=>1000,31526=>1000,31527=>1000,31528=>1000,31529=>1000,31530=>1000,31531=>1000,31532=>1000,31533=>1000,31534=>1000,31535=>1000,31536=>1000,31537=>1000,31538=>1000,31539=>1000,31540=>1000,31541=>1000,31542=>1000,31543=>1000,31544=>1000,31545=>1000,31546=>1000,31547=>1000,31548=>1000,31549=>1000,31550=>1000,31551=>1000,31552=>1000,31553=>1000,31554=>1000,31555=>1000,31556=>1000,31557=>1000,31558=>1000,31559=>1000,31560=>1000,31561=>1000,31562=>1000,31563=>1000,31564=>1000,31565=>1000,31566=>1000,31567=>1000,31568=>1000,31569=>1000,31570=>1000,31571=>1000,31572=>1000,31573=>1000,31574=>1000,31575=>1000,31576=>1000,31577=>1000,31578=>1000,31579=>1000,31580=>1000,31581=>1000,31582=>1000,31583=>1000,31584=>1000,31585=>1000,31586=>1000,31587=>1000,31588=>1000,31589=>1000,31590=>1000,31591=>1000,31592=>1000,31593=>1000,31594=>1000,31595=>1000,31596=>1000,31597=>1000,31598=>1000,31599=>1000,31600=>1000,31601=>1000,31602=>1000,31603=>1000,31604=>1000,31605=>1000,31606=>1000,31607=>1000,31608=>1000,31609=>1000,31610=>1000,31611=>1000,31612=>1000,31613=>1000,31614=>1000,31615=>1000,31616=>1000,31617=>1000,31618=>1000,31619=>1000,31620=>1000,31621=>1000,31622=>1000,31623=>1000,31624=>1000,31625=>1000,31626=>1000,31627=>1000,31628=>1000,31629=>1000,31630=>1000,31631=>1000,31632=>1000,31633=>1000,31634=>1000,31635=>1000,31636=>1000,31637=>1000,31638=>1000,31639=>1000,31640=>1000,31641=>1000,31642=>1000,31643=>1000,31644=>1000,31645=>1000,31646=>1000,31647=>1000,31648=>1000,31649=>1000,31650=>1000,31651=>1000,31652=>1000,31653=>1000,31654=>1000,31655=>1000,31656=>1000,31657=>1000,31658=>1000,31659=>1000,31660=>1000,31661=>1000,31662=>1000,31663=>1000,31664=>1000,31665=>1000,31666=>1000,31667=>1000,31668=>1000,31669=>1000,31670=>1000,31671=>1000,31672=>1000,31673=>1000,31674=>1000,31675=>1000,31676=>1000,31677=>1000,31678=>1000,31679=>1000,31680=>1000,31681=>1000,31682=>1000,31683=>1000,31684=>1000,31685=>1000,31686=>1000,31687=>1000,31688=>1000,31689=>1000,31690=>1000,31691=>1000,31692=>1000,31693=>1000,31694=>1000,31695=>1000,31696=>1000,31697=>1000,31698=>1000,31699=>1000,31700=>1000,31701=>1000,31702=>1000,31703=>1000,31704=>1000,31705=>1000,31706=>1000,31707=>1000,31708=>1000,31709=>1000,31710=>1000,31711=>1000,31712=>1000,31713=>1000,31714=>1000,31715=>1000,31716=>1000,31717=>1000,31718=>1000,31719=>1000,31720=>1000,31721=>1000,31722=>1000,31723=>1000,31724=>1000,31725=>1000,31726=>1000,31727=>1000,31728=>1000,31729=>1000,31730=>1000,31731=>1000,31732=>1000,31733=>1000,31734=>1000,31735=>1000,31736=>1000,31737=>1000,31738=>1000,31739=>1000,31740=>1000,31741=>1000,31742=>1000,31743=>1000,31744=>1000,31745=>1000,31746=>1000,31747=>1000,31748=>1000,31749=>1000,31750=>1000,31751=>1000,31752=>1000,31753=>1000,31754=>1000,31755=>1000,31756=>1000,31757=>1000,31758=>1000,31759=>1000,31760=>1000,31761=>1000,31762=>1000,31763=>1000,31764=>1000,31765=>1000,31766=>1000,31767=>1000,31768=>1000,31769=>1000,31770=>1000,31771=>1000,31772=>1000,31773=>1000,31774=>1000,31775=>1000,31776=>1000,31777=>1000,31778=>1000,31779=>1000,31780=>1000,31781=>1000,31782=>1000,31783=>1000,31784=>1000,31785=>1000,31786=>1000,31787=>1000,31788=>1000,31789=>1000,31790=>1000,31791=>1000,31792=>1000,31793=>1000,31794=>1000,31795=>1000,31796=>1000,31797=>1000,31798=>1000,31799=>1000,31800=>1000,31801=>1000,31802=>1000,31803=>1000,31804=>1000,31805=>1000,31806=>1000,31807=>1000,31808=>1000,31809=>1000,31810=>1000,31811=>1000,31812=>1000,31813=>1000,31814=>1000,31815=>1000,31816=>1000,31817=>1000,31818=>1000,31819=>1000,31820=>1000,31821=>1000,31822=>1000,31823=>1000,31824=>1000,31825=>1000,31826=>1000,31827=>1000,31828=>1000,31829=>1000,31830=>1000,31831=>1000,31832=>1000,31833=>1000,31834=>1000,31835=>1000,31836=>1000,31837=>1000,31838=>1000,31839=>1000,31840=>1000,31841=>1000,31842=>1000,31843=>1000,31844=>1000,31845=>1000,31846=>1000,31847=>1000,31848=>1000,31849=>1000,31850=>1000,31851=>1000,31852=>1000,31853=>1000,31854=>1000,31855=>1000,31856=>1000,31857=>1000,31858=>1000,31859=>1000,31860=>1000,31861=>1000,31862=>1000,31863=>1000,31864=>1000,31865=>1000,31866=>1000,31867=>1000,31868=>1000,31869=>1000,31870=>1000,31871=>1000,31872=>1000,31873=>1000,31874=>1000,31875=>1000,31876=>1000,31877=>1000,31878=>1000,31879=>1000,31880=>1000,31881=>1000,31882=>1000,31883=>1000,31884=>1000,31885=>1000,31886=>1000,31887=>1000,31888=>1000,31889=>1000,31890=>1000,31891=>1000,31892=>1000,31893=>1000,31894=>1000,31895=>1000,31896=>1000,31897=>1000,31898=>1000,31899=>1000,31900=>1000,31901=>1000,31902=>1000,31903=>1000,31904=>1000,31905=>1000,31906=>1000,31907=>1000,31908=>1000,31909=>1000,31910=>1000,31911=>1000,31912=>1000,31913=>1000,31914=>1000,31915=>1000,31916=>1000,31917=>1000,31918=>1000,31919=>1000,31920=>1000,31921=>1000,31922=>1000,31923=>1000,31924=>1000,31925=>1000,31926=>1000,31927=>1000,31928=>1000,31929=>1000,31930=>1000,31931=>1000,31932=>1000,31933=>1000,31934=>1000,31935=>1000,31936=>1000,31937=>1000,31938=>1000,31939=>1000,31940=>1000,31941=>1000,31942=>1000,31943=>1000,31944=>1000,31945=>1000,31946=>1000,31947=>1000,31948=>1000,31949=>1000,31950=>1000,31951=>1000,31952=>1000,31953=>1000,31954=>1000,31955=>1000,31956=>1000,31957=>1000,31958=>1000,31959=>1000,31960=>1000,31961=>1000,31962=>1000,31963=>1000,31964=>1000,31965=>1000,31966=>1000,31967=>1000,31968=>1000,31969=>1000,31970=>1000,31971=>1000,31972=>1000,31973=>1000,31974=>1000,31975=>1000,31976=>1000,31977=>1000,31978=>1000,31979=>1000,31980=>1000,31981=>1000,31982=>1000,31983=>1000,31984=>1000,31985=>1000,31986=>1000,31987=>1000,31988=>1000,31989=>1000,31990=>1000,31991=>1000,31992=>1000,31993=>1000,31994=>1000,31995=>1000,31996=>1000,31997=>1000,31998=>1000,31999=>1000,32000=>1000,32001=>1000,32002=>1000,32003=>1000,32004=>1000,32005=>1000,32006=>1000,32007=>1000,32008=>1000,32009=>1000,32010=>1000,32011=>1000,32012=>1000,32013=>1000,32014=>1000,32015=>1000,32016=>1000,32017=>1000,32018=>1000,32019=>1000,32020=>1000,32021=>1000,32022=>1000,32023=>1000,32024=>1000,32025=>1000,32026=>1000,32027=>1000,32028=>1000,32029=>1000,32030=>1000,32031=>1000,32032=>1000,32033=>1000,32034=>1000,32035=>1000,32036=>1000,32037=>1000,32038=>1000,32039=>1000,32040=>1000,32041=>1000,32042=>1000,32043=>1000,32044=>1000,32045=>1000,32046=>1000,32047=>1000,32048=>1000,32049=>1000,32050=>1000,32051=>1000,32052=>1000,32053=>1000,32054=>1000,32055=>1000,32056=>1000,32057=>1000,32058=>1000,32059=>1000,32060=>1000,32061=>1000,32062=>1000,32063=>1000,32064=>1000,32065=>1000,32066=>1000,32067=>1000,32068=>1000,32069=>1000,32070=>1000,32071=>1000,32072=>1000,32073=>1000,32074=>1000,32075=>1000,32076=>1000,32077=>1000,32078=>1000,32079=>1000,32080=>1000,32081=>1000,32082=>1000,32083=>1000,32084=>1000,32085=>1000,32086=>1000,32087=>1000,32088=>1000,32089=>1000,32090=>1000,32091=>1000,32092=>1000,32093=>1000,32094=>1000,32095=>1000,32096=>1000,32097=>1000,32098=>1000,32099=>1000,32100=>1000,32101=>1000,32102=>1000,32103=>1000,32104=>1000,32105=>1000,32106=>1000,32107=>1000,32108=>1000,32109=>1000,32110=>1000,32111=>1000,32112=>1000,32113=>1000,32114=>1000,32115=>1000,32116=>1000,32117=>1000,32118=>1000,32119=>1000,32120=>1000,32121=>1000,32122=>1000,32123=>1000,32124=>1000,32125=>1000,32126=>1000,32127=>1000,32128=>1000,32129=>1000,32130=>1000,32131=>1000,32132=>1000,32133=>1000,32134=>1000,32135=>1000,32136=>1000,32137=>1000,32138=>1000,32139=>1000,32140=>1000,32141=>1000,32142=>1000,32143=>1000,32144=>1000,32145=>1000,32146=>1000,32147=>1000,32148=>1000,32149=>1000,32150=>1000,32151=>1000,32152=>1000,32153=>1000,32154=>1000,32155=>1000,32156=>1000,32157=>1000,32158=>1000,32159=>1000,32160=>1000,32161=>1000,32162=>1000,32163=>1000,32164=>1000,32165=>1000,32166=>1000,32167=>1000,32168=>1000,32169=>1000,32170=>1000,32171=>1000,32172=>1000,32173=>1000,32174=>1000,32175=>1000,32176=>1000,32177=>1000,32178=>1000,32179=>1000,32180=>1000,32181=>1000,32182=>1000,32183=>1000,32184=>1000,32185=>1000,32186=>1000,32187=>1000,32188=>1000,32189=>1000,32190=>1000,32191=>1000,32192=>1000,32193=>1000,32194=>1000,32195=>1000,32196=>1000,32197=>1000,32198=>1000,32199=>1000,32200=>1000,32201=>1000,32202=>1000,32203=>1000,32204=>1000,32205=>1000,32206=>1000,32207=>1000,32208=>1000,32209=>1000,32210=>1000,32211=>1000,32212=>1000,32213=>1000,32214=>1000,32215=>1000,32216=>1000,32217=>1000,32218=>1000,32219=>1000,32220=>1000,32221=>1000,32222=>1000,32223=>1000,32224=>1000,32225=>1000,32226=>1000,32227=>1000,32228=>1000,32229=>1000,32230=>1000,32231=>1000,32232=>1000,32233=>1000,32234=>1000,32235=>1000,32236=>1000,32237=>1000,32238=>1000,32239=>1000,32240=>1000,32241=>1000,32242=>1000,32243=>1000,32244=>1000,32245=>1000,32246=>1000,32247=>1000,32248=>1000,32249=>1000,32250=>1000,32251=>1000,32252=>1000,32253=>1000,32254=>1000,32255=>1000,32256=>1000,32257=>1000,32258=>1000,32259=>1000,32260=>1000,32261=>1000,32262=>1000,32263=>1000,32264=>1000,32265=>1000,32266=>1000,32267=>1000,32268=>1000,32269=>1000,32270=>1000,32271=>1000,32272=>1000,32273=>1000,32274=>1000,32275=>1000,32276=>1000,32277=>1000,32278=>1000,32279=>1000,32280=>1000,32281=>1000,32282=>1000,32283=>1000,32284=>1000,32285=>1000,32286=>1000,32287=>1000,32288=>1000,32289=>1000,32290=>1000,32291=>1000,32292=>1000,32293=>1000,32294=>1000,32295=>1000,32296=>1000,32297=>1000,32298=>1000,32299=>1000,32300=>1000,32301=>1000,32302=>1000,32303=>1000,32304=>1000,32305=>1000,32306=>1000,32307=>1000,32308=>1000,32309=>1000,32310=>1000,32311=>1000,32312=>1000,32313=>1000,32314=>1000,32315=>1000,32316=>1000,32317=>1000,32318=>1000,32319=>1000,32320=>1000,32321=>1000,32322=>1000,32323=>1000,32324=>1000,32325=>1000,32326=>1000,32327=>1000,32328=>1000,32329=>1000,32330=>1000,32331=>1000,32332=>1000,32333=>1000,32334=>1000,32335=>1000,32336=>1000,32337=>1000,32338=>1000,32339=>1000,32340=>1000,32341=>1000,32342=>1000,32343=>1000,32344=>1000,32345=>1000,32346=>1000,32347=>1000,32348=>1000,32349=>1000,32350=>1000,32351=>1000,32352=>1000,32353=>1000,32354=>1000,32355=>1000,32356=>1000,32357=>1000,32358=>1000,32359=>1000,32360=>1000,32361=>1000,32362=>1000,32363=>1000,32364=>1000,32365=>1000,32366=>1000,32367=>1000,32368=>1000,32369=>1000,32370=>1000,32371=>1000,32372=>1000,32373=>1000,32374=>1000,32375=>1000,32376=>1000,32377=>1000,32378=>1000,32379=>1000,32380=>1000,32381=>1000,32382=>1000,32383=>1000,32384=>1000,32385=>1000,32386=>1000,32387=>1000,32388=>1000,32389=>1000,32390=>1000,32391=>1000,32392=>1000,32393=>1000,32394=>1000,32395=>1000,32396=>1000,32397=>1000,32398=>1000,32399=>1000,32400=>1000,32401=>1000,32402=>1000,32403=>1000,32404=>1000,32405=>1000,32406=>1000,32407=>1000,32408=>1000,32409=>1000,32410=>1000,32411=>1000,32412=>1000,32413=>1000,32414=>1000,32415=>1000,32416=>1000,32417=>1000,32418=>1000,32419=>1000,32420=>1000,32421=>1000,32422=>1000,32423=>1000,32424=>1000,32425=>1000,32426=>1000,32427=>1000,32428=>1000,32429=>1000,32430=>1000,32431=>1000,32432=>1000,32433=>1000,32434=>1000,32435=>1000,32436=>1000,32437=>1000,32438=>1000,32439=>1000,32440=>1000,32441=>1000,32442=>1000,32443=>1000,32444=>1000,32445=>1000,32446=>1000,32447=>1000,32448=>1000,32449=>1000,32450=>1000,32451=>1000,32452=>1000,32453=>1000,32454=>1000,32455=>1000,32456=>1000,32457=>1000,32458=>1000,32459=>1000,32460=>1000,32461=>1000,32462=>1000,32463=>1000,32464=>1000,32465=>1000,32466=>1000,32467=>1000,32468=>1000,32469=>1000,32470=>1000,32471=>1000,32472=>1000,32473=>1000,32474=>1000,32475=>1000,32476=>1000,32477=>1000,32478=>1000,32479=>1000,32480=>1000,32481=>1000,32482=>1000,32483=>1000,32484=>1000,32485=>1000,32486=>1000,32487=>1000,32488=>1000,32489=>1000,32490=>1000,32491=>1000,32492=>1000,32493=>1000,32494=>1000,32495=>1000,32496=>1000,32497=>1000,32498=>1000,32499=>1000,32500=>1000,32501=>1000,32502=>1000,32503=>1000,32504=>1000,32505=>1000,32506=>1000,32507=>1000,32508=>1000,32509=>1000,32510=>1000,32511=>1000,32512=>1000,32513=>1000,32514=>1000,32515=>1000,32516=>1000,32517=>1000,32518=>1000,32519=>1000,32520=>1000,32521=>1000,32522=>1000,32523=>1000,32524=>1000,32525=>1000,32526=>1000,32527=>1000,32528=>1000,32529=>1000,32530=>1000,32531=>1000,32532=>1000,32533=>1000,32534=>1000,32535=>1000,32536=>1000,32537=>1000,32538=>1000,32539=>1000,32540=>1000,32541=>1000,32542=>1000,32543=>1000,32544=>1000,32545=>1000,32546=>1000,32547=>1000,32548=>1000,32549=>1000,32550=>1000,32551=>1000,32552=>1000,32553=>1000,32554=>1000,32555=>1000,32556=>1000,32557=>1000,32558=>1000,32559=>1000,32560=>1000,32561=>1000,32562=>1000,32563=>1000,32564=>1000,32565=>1000,32566=>1000,32567=>1000,32568=>1000,32569=>1000,32570=>1000,32571=>1000,32572=>1000,32573=>1000,32574=>1000,32575=>1000,32576=>1000,32577=>1000,32578=>1000,32579=>1000,32580=>1000,32581=>1000,32582=>1000,32583=>1000,32584=>1000,32585=>1000,32586=>1000,32587=>1000,32588=>1000,32589=>1000,32590=>1000,32591=>1000,32592=>1000,32593=>1000,32594=>1000,32595=>1000,32596=>1000,32597=>1000,32598=>1000,32599=>1000,32600=>1000,32601=>1000,32602=>1000,32603=>1000,32604=>1000,32605=>1000,32606=>1000,32607=>1000,32608=>1000,32609=>1000,32610=>1000,32611=>1000,32612=>1000,32613=>1000,32614=>1000,32615=>1000,32616=>1000,32617=>1000,32618=>1000,32619=>1000,32620=>1000,32621=>1000,32622=>1000,32623=>1000,32624=>1000,32625=>1000,32626=>1000,32627=>1000,32628=>1000,32629=>1000,32630=>1000,32631=>1000,32632=>1000,32633=>1000,32634=>1000,32635=>1000,32636=>1000,32637=>1000,32638=>1000,32639=>1000,32640=>1000,32641=>1000,32642=>1000,32643=>1000,32644=>1000,32645=>1000,32646=>1000,32647=>1000,32648=>1000,32649=>1000,32650=>1000,32651=>1000,32652=>1000,32653=>1000,32654=>1000,32655=>1000,32656=>1000,32657=>1000,32658=>1000,32659=>1000,32660=>1000,32661=>1000,32662=>1000,32663=>1000,32664=>1000,32665=>1000,32666=>1000,32667=>1000,32668=>1000,32669=>1000,32670=>1000,32671=>1000,32672=>1000,32673=>1000,32674=>1000,32675=>1000,32676=>1000,32677=>1000,32678=>1000,32679=>1000,32680=>1000,32681=>1000,32682=>1000,32683=>1000,32684=>1000,32685=>1000,32686=>1000,32687=>1000,32688=>1000,32689=>1000,32690=>1000,32691=>1000,32692=>1000,32693=>1000,32694=>1000,32695=>1000,32696=>1000,32697=>1000,32698=>1000,32699=>1000,32700=>1000,32701=>1000,32702=>1000,32703=>1000,32704=>1000,32705=>1000,32706=>1000,32707=>1000,32708=>1000,32709=>1000,32710=>1000,32711=>1000,32712=>1000,32713=>1000,32714=>1000,32715=>1000,32716=>1000,32717=>1000,32718=>1000,32719=>1000,32720=>1000,32721=>1000,32722=>1000,32723=>1000,32724=>1000,32725=>1000,32726=>1000,32727=>1000,32728=>1000,32729=>1000,32730=>1000,32731=>1000,32732=>1000,32733=>1000,32734=>1000,32735=>1000,32736=>1000,32737=>1000,32738=>1000,32739=>1000,32740=>1000,32741=>1000,32742=>1000,32743=>1000,32744=>1000,32745=>1000,32746=>1000,32747=>1000,32748=>1000,32749=>1000,32750=>1000,32751=>1000,32752=>1000,32753=>1000,32754=>1000,32755=>1000,32756=>1000,32757=>1000,32758=>1000,32759=>1000,32760=>1000,32761=>1000,32762=>1000,32763=>1000,32764=>1000,32765=>1000,32766=>1000,32767=>1000,32768=>1000,32769=>1000,32770=>1000,32771=>1000,32772=>1000,32773=>1000,32774=>1000,32775=>1000,32776=>1000,32777=>1000,32778=>1000,32779=>1000,32780=>1000,32781=>1000,32782=>1000,32783=>1000,32784=>1000,32785=>1000,32786=>1000,32787=>1000,32788=>1000,32789=>1000,32790=>1000,32791=>1000,32792=>1000,32793=>1000,32794=>1000,32795=>1000,32796=>1000,32797=>1000,32798=>1000,32799=>1000,32800=>1000,32801=>1000,32802=>1000,32803=>1000,32804=>1000,32805=>1000,32806=>1000,32807=>1000,32808=>1000,32809=>1000,32810=>1000,32811=>1000,32812=>1000,32813=>1000,32814=>1000,32815=>1000,32816=>1000,32817=>1000,32818=>1000,32819=>1000,32820=>1000,32821=>1000,32822=>1000,32823=>1000,32824=>1000,32825=>1000,32826=>1000,32827=>1000,32828=>1000,32829=>1000,32830=>1000,32831=>1000,32832=>1000,32833=>1000,32834=>1000,32835=>1000,32836=>1000,32837=>1000,32838=>1000,32839=>1000,32840=>1000,32841=>1000,32842=>1000,32843=>1000,32844=>1000,32845=>1000,32846=>1000,32847=>1000,32848=>1000,32849=>1000,32850=>1000,32851=>1000,32852=>1000,32853=>1000,32854=>1000,32855=>1000,32856=>1000,32857=>1000,32858=>1000,32859=>1000,32860=>1000,32861=>1000,32862=>1000,32863=>1000,32864=>1000,32865=>1000,32866=>1000,32867=>1000,32868=>1000,32869=>1000,32870=>1000,32871=>1000,32872=>1000,32873=>1000,32874=>1000,32875=>1000,32876=>1000,32877=>1000,32878=>1000,32879=>1000,32880=>1000,32881=>1000,32882=>1000,32883=>1000,32884=>1000,32885=>1000,32886=>1000,32887=>1000,32888=>1000,32889=>1000,32890=>1000,32891=>1000,32892=>1000,32893=>1000,32894=>1000,32895=>1000,32896=>1000,32897=>1000,32898=>1000,32899=>1000,32900=>1000,32901=>1000,32902=>1000,32903=>1000,32904=>1000,32905=>1000,32906=>1000,32907=>1000,32908=>1000,32909=>1000,32910=>1000,32911=>1000,32912=>1000,32913=>1000,32914=>1000,32915=>1000,32916=>1000,32917=>1000,32918=>1000,32919=>1000,32920=>1000,32921=>1000,32922=>1000,32923=>1000,32924=>1000,32925=>1000,32926=>1000,32927=>1000,32928=>1000,32929=>1000,32930=>1000,32931=>1000,32932=>1000,32933=>1000,32934=>1000,32935=>1000,32936=>1000,32937=>1000,32938=>1000,32939=>1000,32940=>1000,32941=>1000,32942=>1000,32943=>1000,32944=>1000,32945=>1000,32946=>1000,32947=>1000,32948=>1000,32949=>1000,32950=>1000,32951=>1000,32952=>1000,32953=>1000,32954=>1000,32955=>1000,32956=>1000,32957=>1000,32958=>1000,32959=>1000,32960=>1000,32961=>1000,32962=>1000,32963=>1000,32964=>1000,32965=>1000,32966=>1000,32967=>1000,32968=>1000,32969=>1000,32970=>1000,32971=>1000,32972=>1000,32973=>1000,32974=>1000,32975=>1000,32976=>1000,32977=>1000,32978=>1000,32979=>1000,32980=>1000,32981=>1000,32982=>1000,32983=>1000,32984=>1000,32985=>1000,32986=>1000,32987=>1000,32988=>1000,32989=>1000,32990=>1000,32991=>1000,32992=>1000,32993=>1000,32994=>1000,32995=>1000,32996=>1000,32997=>1000,32998=>1000,32999=>1000,33000=>1000,33001=>1000,33002=>1000,33003=>1000,33004=>1000,33005=>1000,33006=>1000,33007=>1000,33008=>1000,33009=>1000,33010=>1000,33011=>1000,33012=>1000,33013=>1000,33014=>1000,33015=>1000,33016=>1000,33017=>1000,33018=>1000,33019=>1000,33020=>1000,33021=>1000,33022=>1000,33023=>1000,33024=>1000,33025=>1000,33026=>1000,33027=>1000,33028=>1000,33029=>1000,33030=>1000,33031=>1000,33032=>1000,33033=>1000,33034=>1000,33035=>1000,33036=>1000,33037=>1000,33038=>1000,33039=>1000,33040=>1000,33041=>1000,33042=>1000,33043=>1000,33044=>1000,33045=>1000,33046=>1000,33047=>1000,33048=>1000,33049=>1000,33050=>1000,33051=>1000,33052=>1000,33053=>1000,33054=>1000,33055=>1000,33056=>1000,33057=>1000,33058=>1000,33059=>1000,33060=>1000,33061=>1000,33062=>1000,33063=>1000,33064=>1000,33065=>1000,33066=>1000,33067=>1000,33068=>1000,33069=>1000,33070=>1000,33071=>1000,33072=>1000,33073=>1000,33074=>1000,33075=>1000,33076=>1000,33077=>1000,33078=>1000,33079=>1000,33080=>1000,33081=>1000,33082=>1000,33083=>1000,33084=>1000,33085=>1000,33086=>1000,33087=>1000,33088=>1000,33089=>1000,33090=>1000,33091=>1000,33092=>1000,33093=>1000,33094=>1000,33095=>1000,33096=>1000,33097=>1000,33098=>1000,33099=>1000,33100=>1000,33101=>1000,33102=>1000,33103=>1000,33104=>1000,33105=>1000,33106=>1000,33107=>1000,33108=>1000,33109=>1000,33110=>1000,33111=>1000,33112=>1000,33113=>1000,33114=>1000,33115=>1000,33116=>1000,33117=>1000,33118=>1000,33119=>1000,33120=>1000,33121=>1000,33122=>1000,33123=>1000,33124=>1000,33125=>1000,33126=>1000,33127=>1000,33128=>1000,33129=>1000,33130=>1000,33131=>1000,33132=>1000,33133=>1000,33134=>1000,33135=>1000,33136=>1000,33137=>1000,33138=>1000,33139=>1000,33140=>1000,33141=>1000,33142=>1000,33143=>1000,33144=>1000,33145=>1000,33146=>1000,33147=>1000,33148=>1000,33149=>1000,33150=>1000,33151=>1000,33152=>1000,33153=>1000,33154=>1000,33155=>1000,33156=>1000,33157=>1000,33158=>1000,33159=>1000,33160=>1000,33161=>1000,33162=>1000,33163=>1000,33164=>1000,33165=>1000,33166=>1000,33167=>1000,33168=>1000,33169=>1000,33170=>1000,33171=>1000,33172=>1000,33173=>1000,33174=>1000,33175=>1000,33176=>1000,33177=>1000,33178=>1000,33179=>1000,33180=>1000,33181=>1000,33182=>1000,33183=>1000,33184=>1000,33185=>1000,33186=>1000,33187=>1000,33188=>1000,33189=>1000,33190=>1000,33191=>1000,33192=>1000,33193=>1000,33194=>1000,33195=>1000,33196=>1000,33197=>1000,33198=>1000,33199=>1000,33200=>1000,33201=>1000,33202=>1000,33203=>1000,33204=>1000,33205=>1000,33206=>1000,33207=>1000,33208=>1000,33209=>1000,33210=>1000,33211=>1000,33212=>1000,33213=>1000,33214=>1000,33215=>1000,33216=>1000,33217=>1000,33218=>1000,33219=>1000,33220=>1000,33221=>1000,33222=>1000,33223=>1000,33224=>1000,33225=>1000,33226=>1000,33227=>1000,33228=>1000,33229=>1000,33230=>1000,33231=>1000,33232=>1000,33233=>1000,33234=>1000,33235=>1000,33236=>1000,33237=>1000,33238=>1000,33239=>1000,33240=>1000,33241=>1000,33242=>1000,33243=>1000,33244=>1000,33245=>1000,33246=>1000,33247=>1000,33248=>1000,33249=>1000,33250=>1000,33251=>1000,33252=>1000,33253=>1000,33254=>1000,33255=>1000,33256=>1000,33257=>1000,33258=>1000,33259=>1000,33260=>1000,33261=>1000,33262=>1000,33263=>1000,33264=>1000,33265=>1000,33266=>1000,33267=>1000,33268=>1000,33269=>1000,33270=>1000,33271=>1000,33272=>1000,33273=>1000,33274=>1000,33275=>1000,33276=>1000,33277=>1000,33278=>1000,33279=>1000,33280=>1000,33281=>1000,33282=>1000,33283=>1000,33284=>1000,33285=>1000,33286=>1000,33287=>1000,33288=>1000,33289=>1000,33290=>1000,33291=>1000,33292=>1000,33293=>1000,33294=>1000,33295=>1000,33296=>1000,33297=>1000,33298=>1000,33299=>1000,33300=>1000,33301=>1000,33302=>1000,33303=>1000,33304=>1000,33305=>1000,33306=>1000,33307=>1000,33308=>1000,33309=>1000,33310=>1000,33311=>1000,33312=>1000,33313=>1000,33314=>1000,33315=>1000,33316=>1000,33317=>1000,33318=>1000,33319=>1000,33320=>1000,33321=>1000,33322=>1000,33323=>1000,33324=>1000,33325=>1000,33326=>1000,33327=>1000,33328=>1000,33329=>1000,33330=>1000,33331=>1000,33332=>1000,33333=>1000,33334=>1000,33335=>1000,33336=>1000,33337=>1000,33338=>1000,33339=>1000,33340=>1000,33341=>1000,33342=>1000,33343=>1000,33344=>1000,33345=>1000,33346=>1000,33347=>1000,33348=>1000,33349=>1000,33350=>1000,33351=>1000,33352=>1000,33353=>1000,33354=>1000,33355=>1000,33356=>1000,33357=>1000,33358=>1000,33359=>1000,33360=>1000,33361=>1000,33362=>1000,33363=>1000,33364=>1000,33365=>1000,33366=>1000,33367=>1000,33368=>1000,33369=>1000,33370=>1000,33371=>1000,33372=>1000,33373=>1000,33374=>1000,33375=>1000,33376=>1000,33377=>1000,33378=>1000,33379=>1000,33380=>1000,33381=>1000,33382=>1000,33383=>1000,33384=>1000,33385=>1000,33386=>1000,33387=>1000,33388=>1000,33389=>1000,33390=>1000,33391=>1000,33392=>1000,33393=>1000,33394=>1000,33395=>1000,33396=>1000,33397=>1000,33398=>1000,33399=>1000,33400=>1000,33401=>1000,33402=>1000,33403=>1000,33404=>1000,33405=>1000,33406=>1000,33407=>1000,33408=>1000,33409=>1000,33410=>1000,33411=>1000,33412=>1000,33413=>1000,33414=>1000,33415=>1000,33416=>1000,33417=>1000,33418=>1000,33419=>1000,33420=>1000,33421=>1000,33422=>1000,33423=>1000,33424=>1000,33425=>1000,33426=>1000,33427=>1000,33428=>1000,33429=>1000,33430=>1000,33431=>1000,33432=>1000,33433=>1000,33434=>1000,33435=>1000,33436=>1000,33437=>1000,33438=>1000,33439=>1000,33440=>1000,33441=>1000,33442=>1000,33443=>1000,33444=>1000,33445=>1000,33446=>1000,33447=>1000,33448=>1000,33449=>1000,33450=>1000,33451=>1000,33452=>1000,33453=>1000,33454=>1000,33455=>1000,33456=>1000,33457=>1000,33458=>1000,33459=>1000,33460=>1000,33461=>1000,33462=>1000,33463=>1000,33464=>1000,33465=>1000,33466=>1000,33467=>1000,33468=>1000,33469=>1000,33470=>1000,33471=>1000,33472=>1000,33473=>1000,33474=>1000,33475=>1000,33476=>1000,33477=>1000,33478=>1000,33479=>1000,33480=>1000,33481=>1000,33482=>1000,33483=>1000,33484=>1000,33485=>1000,33486=>1000,33487=>1000,33488=>1000,33489=>1000,33490=>1000,33491=>1000,33492=>1000,33493=>1000,33494=>1000,33495=>1000,33496=>1000,33497=>1000,33498=>1000,33499=>1000,33500=>1000,33501=>1000,33502=>1000,33503=>1000,33504=>1000,33505=>1000,33506=>1000,33507=>1000,33508=>1000,33509=>1000,33510=>1000,33511=>1000,33512=>1000,33513=>1000,33514=>1000,33515=>1000,33516=>1000,33517=>1000,33518=>1000,33519=>1000,33520=>1000,33521=>1000,33522=>1000,33523=>1000,33524=>1000,33525=>1000,33526=>1000,33527=>1000,33528=>1000,33529=>1000,33530=>1000,33531=>1000,33532=>1000,33533=>1000,33534=>1000,33535=>1000,33536=>1000,33537=>1000,33538=>1000,33539=>1000,33540=>1000,33541=>1000,33542=>1000,33543=>1000,33544=>1000,33545=>1000,33546=>1000,33547=>1000,33548=>1000,33549=>1000,33550=>1000,33551=>1000,33552=>1000,33553=>1000,33554=>1000,33555=>1000,33556=>1000,33557=>1000,33558=>1000,33559=>1000,33560=>1000,33561=>1000,33562=>1000,33563=>1000,33564=>1000,33565=>1000,33566=>1000,33567=>1000,33568=>1000,33569=>1000,33570=>1000,33571=>1000,33572=>1000,33573=>1000,33574=>1000,33575=>1000,33576=>1000,33577=>1000,33578=>1000,33579=>1000,33580=>1000,33581=>1000,33582=>1000,33583=>1000,33584=>1000,33585=>1000,33586=>1000,33587=>1000,33588=>1000,33589=>1000,33590=>1000,33591=>1000,33592=>1000,33593=>1000,33594=>1000,33595=>1000,33596=>1000,33597=>1000,33598=>1000,33599=>1000,33600=>1000,33601=>1000,33602=>1000,33603=>1000,33604=>1000,33605=>1000,33606=>1000,33607=>1000,33608=>1000,33609=>1000,33610=>1000,33611=>1000,33612=>1000,33613=>1000,33614=>1000,33615=>1000,33616=>1000,33617=>1000,33618=>1000,33619=>1000,33620=>1000,33621=>1000,33622=>1000,33623=>1000,33624=>1000,33625=>1000,33626=>1000,33627=>1000,33628=>1000,33629=>1000,33630=>1000,33631=>1000,33632=>1000,33633=>1000,33634=>1000,33635=>1000,33636=>1000,33637=>1000,33638=>1000,33639=>1000,33640=>1000,33641=>1000,33642=>1000,33643=>1000,33644=>1000,33645=>1000,33646=>1000,33647=>1000,33648=>1000,33649=>1000,33650=>1000,33651=>1000,33652=>1000,33653=>1000,33654=>1000,33655=>1000,33656=>1000,33657=>1000,33658=>1000,33659=>1000,33660=>1000,33661=>1000,33662=>1000,33663=>1000,33664=>1000,33665=>1000,33666=>1000,33667=>1000,33668=>1000,33669=>1000,33670=>1000,33671=>1000,33672=>1000,33673=>1000,33674=>1000,33675=>1000,33676=>1000,33677=>1000,33678=>1000,33679=>1000,33680=>1000,33681=>1000,33682=>1000,33683=>1000,33684=>1000,33685=>1000,33686=>1000,33687=>1000,33688=>1000,33689=>1000,33690=>1000,33691=>1000,33692=>1000,33693=>1000,33694=>1000,33695=>1000,33696=>1000,33697=>1000,33698=>1000,33699=>1000,33700=>1000,33701=>1000,33702=>1000,33703=>1000,33704=>1000,33705=>1000,33706=>1000,33707=>1000,33708=>1000,33709=>1000,33710=>1000,33711=>1000,33712=>1000,33713=>1000,33714=>1000,33715=>1000,33716=>1000,33717=>1000,33718=>1000,33719=>1000,33720=>1000,33721=>1000,33722=>1000,33723=>1000,33724=>1000,33725=>1000,33726=>1000,33727=>1000,33728=>1000,33729=>1000,33730=>1000,33731=>1000,33732=>1000,33733=>1000,33734=>1000,33735=>1000,33736=>1000,33737=>1000,33738=>1000,33739=>1000,33740=>1000,33741=>1000,33742=>1000,33743=>1000,33744=>1000,33745=>1000,33746=>1000,33747=>1000,33748=>1000,33749=>1000,33750=>1000,33751=>1000,33752=>1000,33753=>1000,33754=>1000,33755=>1000,33756=>1000,33757=>1000,33758=>1000,33759=>1000,33760=>1000,33761=>1000,33762=>1000,33763=>1000,33764=>1000,33765=>1000,33766=>1000,33767=>1000,33768=>1000,33769=>1000,33770=>1000,33771=>1000,33772=>1000,33773=>1000,33774=>1000,33775=>1000,33776=>1000,33777=>1000,33778=>1000,33779=>1000,33780=>1000,33781=>1000,33782=>1000,33783=>1000,33784=>1000,33785=>1000,33786=>1000,33787=>1000,33788=>1000,33789=>1000,33790=>1000,33791=>1000,33792=>1000,33793=>1000,33794=>1000,33795=>1000,33796=>1000,33797=>1000,33798=>1000,33799=>1000,33800=>1000,33801=>1000,33802=>1000,33803=>1000,33804=>1000,33805=>1000,33806=>1000,33807=>1000,33808=>1000,33809=>1000,33810=>1000,33811=>1000,33812=>1000,33813=>1000,33814=>1000,33815=>1000,33816=>1000,33817=>1000,33818=>1000,33819=>1000,33820=>1000,33821=>1000,33822=>1000,33823=>1000,33824=>1000,33825=>1000,33826=>1000,33827=>1000,33828=>1000,33829=>1000,33830=>1000,33831=>1000,33832=>1000,33833=>1000,33834=>1000,33835=>1000,33836=>1000,33837=>1000,33838=>1000,33839=>1000,33840=>1000,33841=>1000,33842=>1000,33843=>1000,33844=>1000,33845=>1000,33846=>1000,33847=>1000,33848=>1000,33849=>1000,33850=>1000,33851=>1000,33852=>1000,33853=>1000,33854=>1000,33855=>1000,33856=>1000,33857=>1000,33858=>1000,33859=>1000,33860=>1000,33861=>1000,33862=>1000,33863=>1000,33864=>1000,33865=>1000,33866=>1000,33867=>1000,33868=>1000,33869=>1000,33870=>1000,33871=>1000,33872=>1000,33873=>1000,33874=>1000,33875=>1000,33876=>1000,33877=>1000,33878=>1000,33879=>1000,33880=>1000,33881=>1000,33882=>1000,33883=>1000,33884=>1000,33885=>1000,33886=>1000,33887=>1000,33888=>1000,33889=>1000,33890=>1000,33891=>1000,33892=>1000,33893=>1000,33894=>1000,33895=>1000,33896=>1000,33897=>1000,33898=>1000,33899=>1000,33900=>1000,33901=>1000,33902=>1000,33903=>1000,33904=>1000,33905=>1000,33906=>1000,33907=>1000,33908=>1000,33909=>1000,33910=>1000,33911=>1000,33912=>1000,33913=>1000,33914=>1000,33915=>1000,33916=>1000,33917=>1000,33918=>1000,33919=>1000,33920=>1000,33921=>1000,33922=>1000,33923=>1000,33924=>1000,33925=>1000,33926=>1000,33927=>1000,33928=>1000,33929=>1000,33930=>1000,33931=>1000,33932=>1000,33933=>1000,33934=>1000,33935=>1000,33936=>1000,33937=>1000,33938=>1000,33939=>1000,33940=>1000,33941=>1000,33942=>1000,33943=>1000,33944=>1000,33945=>1000,33946=>1000,33947=>1000,33948=>1000,33949=>1000,33950=>1000,33951=>1000,33952=>1000,33953=>1000,33954=>1000,33955=>1000,33956=>1000,33957=>1000,33958=>1000,33959=>1000,33960=>1000,33961=>1000,33962=>1000,33963=>1000,33964=>1000,33965=>1000,33966=>1000,33967=>1000,33968=>1000,33969=>1000,33970=>1000,33971=>1000,33972=>1000,33973=>1000,33974=>1000,33975=>1000,33976=>1000,33977=>1000,33978=>1000,33979=>1000,33980=>1000,33981=>1000,33982=>1000,33983=>1000,33984=>1000,33985=>1000,33986=>1000,33987=>1000,33988=>1000,33989=>1000,33990=>1000,33991=>1000,33992=>1000,33993=>1000,33994=>1000,33995=>1000,33996=>1000,33997=>1000,33998=>1000,33999=>1000,34000=>1000,34001=>1000,34002=>1000,34003=>1000,34004=>1000,34005=>1000,34006=>1000,34007=>1000,34008=>1000,34009=>1000,34010=>1000,34011=>1000,34012=>1000,34013=>1000,34014=>1000,34015=>1000,34016=>1000,34017=>1000,34018=>1000,34019=>1000,34020=>1000,34021=>1000,34022=>1000,34023=>1000,34024=>1000,34025=>1000,34026=>1000,34027=>1000,34028=>1000,34029=>1000,34030=>1000,34031=>1000,34032=>1000,34033=>1000,34034=>1000,34035=>1000,34036=>1000,34037=>1000,34038=>1000,34039=>1000,34040=>1000,34041=>1000,34042=>1000,34043=>1000,34044=>1000,34045=>1000,34046=>1000,34047=>1000,34048=>1000,34049=>1000,34050=>1000,34051=>1000,34052=>1000,34053=>1000,34054=>1000,34055=>1000,34056=>1000,34057=>1000,34058=>1000,34059=>1000,34060=>1000,34061=>1000,34062=>1000,34063=>1000,34064=>1000,34065=>1000,34066=>1000,34067=>1000,34068=>1000,34069=>1000,34070=>1000,34071=>1000,34072=>1000,34073=>1000,34074=>1000,34075=>1000,34076=>1000,34077=>1000,34078=>1000,34079=>1000,34080=>1000,34081=>1000,34082=>1000,34083=>1000,34084=>1000,34085=>1000,34086=>1000,34087=>1000,34088=>1000,34089=>1000,34090=>1000,34091=>1000,34092=>1000,34093=>1000,34094=>1000,34095=>1000,34096=>1000,34097=>1000,34098=>1000,34099=>1000,34100=>1000,34101=>1000,34102=>1000,34103=>1000,34104=>1000,34105=>1000,34106=>1000,34107=>1000,34108=>1000,34109=>1000,34110=>1000,34111=>1000,34112=>1000,34113=>1000,34114=>1000,34115=>1000,34116=>1000,34117=>1000,34118=>1000,34119=>1000,34120=>1000,34121=>1000,34122=>1000,34123=>1000,34124=>1000,34125=>1000,34126=>1000,34127=>1000,34128=>1000,34129=>1000,34130=>1000,34131=>1000,34132=>1000,34133=>1000,34134=>1000,34135=>1000,34136=>1000,34137=>1000,34138=>1000,34139=>1000,34140=>1000,34141=>1000,34142=>1000,34143=>1000,34144=>1000,34145=>1000,34146=>1000,34147=>1000,34148=>1000,34149=>1000,34150=>1000,34151=>1000,34152=>1000,34153=>1000,34154=>1000,34155=>1000,34156=>1000,34157=>1000,34158=>1000,34159=>1000,34160=>1000,34161=>1000,34162=>1000,34163=>1000,34164=>1000,34165=>1000,34166=>1000,34167=>1000,34168=>1000,34169=>1000,34170=>1000,34171=>1000,34172=>1000,34173=>1000,34174=>1000,34175=>1000,34176=>1000,34177=>1000,34178=>1000,34179=>1000,34180=>1000,34181=>1000,34182=>1000,34183=>1000,34184=>1000,34185=>1000,34186=>1000,34187=>1000,34188=>1000,34189=>1000,34190=>1000,34191=>1000,34192=>1000,34193=>1000,34194=>1000,34195=>1000,34196=>1000,34197=>1000,34198=>1000,34199=>1000,34200=>1000,34201=>1000,34202=>1000,34203=>1000,34204=>1000,34205=>1000,34206=>1000,34207=>1000,34208=>1000,34209=>1000,34210=>1000,34211=>1000,34212=>1000,34213=>1000,34214=>1000,34215=>1000,34216=>1000,34217=>1000,34218=>1000,34219=>1000,34220=>1000,34221=>1000,34222=>1000,34223=>1000,34224=>1000,34225=>1000,34226=>1000,34227=>1000,34228=>1000,34229=>1000,34230=>1000,34231=>1000,34232=>1000,34233=>1000,34234=>1000,34235=>1000,34236=>1000,34237=>1000,34238=>1000,34239=>1000,34240=>1000,34241=>1000,34242=>1000,34243=>1000,34244=>1000,34245=>1000,34246=>1000,34247=>1000,34248=>1000,34249=>1000,34250=>1000,34251=>1000,34252=>1000,34253=>1000,34254=>1000,34255=>1000,34256=>1000,34257=>1000,34258=>1000,34259=>1000,34260=>1000,34261=>1000,34262=>1000,34263=>1000,34264=>1000,34265=>1000,34266=>1000,34267=>1000,34268=>1000,34269=>1000,34270=>1000,34271=>1000,34272=>1000,34273=>1000,34274=>1000,34275=>1000,34276=>1000,34277=>1000,34278=>1000,34279=>1000,34280=>1000,34281=>1000,34282=>1000,34283=>1000,34284=>1000,34285=>1000,34286=>1000,34287=>1000,34288=>1000,34289=>1000,34290=>1000,34291=>1000,34292=>1000,34293=>1000,34294=>1000,34295=>1000,34296=>1000,34297=>1000,34298=>1000,34299=>1000,34300=>1000,34301=>1000,34302=>1000,34303=>1000,34304=>1000,34305=>1000,34306=>1000,34307=>1000,34308=>1000,34309=>1000,34310=>1000,34311=>1000,34312=>1000,34313=>1000,34314=>1000,34315=>1000,34316=>1000,34317=>1000,34318=>1000,34319=>1000,34320=>1000,34321=>1000,34322=>1000,34323=>1000,34324=>1000,34325=>1000,34326=>1000,34327=>1000,34328=>1000,34329=>1000,34330=>1000,34331=>1000,34332=>1000,34333=>1000,34334=>1000,34335=>1000,34336=>1000,34337=>1000,34338=>1000,34339=>1000,34340=>1000,34341=>1000,34342=>1000,34343=>1000,34344=>1000,34345=>1000,34346=>1000,34347=>1000,34348=>1000,34349=>1000,34350=>1000,34351=>1000,34352=>1000,34353=>1000,34354=>1000,34355=>1000,34356=>1000,34357=>1000,34358=>1000,34359=>1000,34360=>1000,34361=>1000,34362=>1000,34363=>1000,34364=>1000,34365=>1000,34366=>1000,34367=>1000,34368=>1000,34369=>1000,34370=>1000,34371=>1000,34372=>1000,34373=>1000,34374=>1000,34375=>1000,34376=>1000,34377=>1000,34378=>1000,34379=>1000,34380=>1000,34381=>1000,34382=>1000,34383=>1000,34384=>1000,34385=>1000,34386=>1000,34387=>1000,34388=>1000,34389=>1000,34390=>1000,34391=>1000,34392=>1000,34393=>1000,34394=>1000,34395=>1000,34396=>1000,34397=>1000,34398=>1000,34399=>1000,34400=>1000,34401=>1000,34402=>1000,34403=>1000,34404=>1000,34405=>1000,34406=>1000,34407=>1000,34408=>1000,34409=>1000,34410=>1000,34411=>1000,34412=>1000,34413=>1000,34414=>1000,34415=>1000,34416=>1000,34417=>1000,34418=>1000,34419=>1000,34420=>1000,34421=>1000,34422=>1000,34423=>1000,34424=>1000,34425=>1000,34426=>1000,34427=>1000,34428=>1000,34429=>1000,34430=>1000,34431=>1000,34432=>1000,34433=>1000,34434=>1000,34435=>1000,34436=>1000,34437=>1000,34438=>1000,34439=>1000,34440=>1000,34441=>1000,34442=>1000,34443=>1000,34444=>1000,34445=>1000,34446=>1000,34447=>1000,34448=>1000,34449=>1000,34450=>1000,34451=>1000,34452=>1000,34453=>1000,34454=>1000,34455=>1000,34456=>1000,34457=>1000,34458=>1000,34459=>1000,34460=>1000,34461=>1000,34462=>1000,34463=>1000,34464=>1000,34465=>1000,34466=>1000,34467=>1000,34468=>1000,34469=>1000,34470=>1000,34471=>1000,34472=>1000,34473=>1000,34474=>1000,34475=>1000,34476=>1000,34477=>1000,34478=>1000,34479=>1000,34480=>1000,34481=>1000,34482=>1000,34483=>1000,34484=>1000,34485=>1000,34486=>1000,34487=>1000,34488=>1000,34489=>1000,34490=>1000,34491=>1000,34492=>1000,34493=>1000,34494=>1000,34495=>1000,34496=>1000,34497=>1000,34498=>1000,34499=>1000,34500=>1000,34501=>1000,34502=>1000,34503=>1000,34504=>1000,34505=>1000,34506=>1000,34507=>1000,34508=>1000,34509=>1000,34510=>1000,34511=>1000,34512=>1000,34513=>1000,34514=>1000,34515=>1000,34516=>1000,34517=>1000,34518=>1000,34519=>1000,34520=>1000,34521=>1000,34522=>1000,34523=>1000,34524=>1000,34525=>1000,34526=>1000,34527=>1000,34528=>1000,34529=>1000,34530=>1000,34531=>1000,34532=>1000,34533=>1000,34534=>1000,34535=>1000,34536=>1000,34537=>1000,34538=>1000,34539=>1000,34540=>1000,34541=>1000,34542=>1000,34543=>1000,34544=>1000,34545=>1000,34546=>1000,34547=>1000,34548=>1000,34549=>1000,34550=>1000,34551=>1000,34552=>1000,34553=>1000,34554=>1000,34555=>1000,34556=>1000,34557=>1000,34558=>1000,34559=>1000,34560=>1000,34561=>1000,34562=>1000,34563=>1000,34564=>1000,34565=>1000,34566=>1000,34567=>1000,34568=>1000,34569=>1000,34570=>1000,34571=>1000,34572=>1000,34573=>1000,34574=>1000,34575=>1000,34576=>1000,34577=>1000,34578=>1000,34579=>1000,34580=>1000,34581=>1000,34582=>1000,34583=>1000,34584=>1000,34585=>1000,34586=>1000,34587=>1000,34588=>1000,34589=>1000,34590=>1000,34591=>1000,34592=>1000,34593=>1000,34594=>1000,34595=>1000,34596=>1000,34597=>1000,34598=>1000,34599=>1000,34600=>1000,34601=>1000,34602=>1000,34603=>1000,34604=>1000,34605=>1000,34606=>1000,34607=>1000,34608=>1000,34609=>1000,34610=>1000,34611=>1000,34612=>1000,34613=>1000,34614=>1000,34615=>1000,34616=>1000,34617=>1000,34618=>1000,34619=>1000,34620=>1000,34621=>1000,34622=>1000,34623=>1000,34624=>1000,34625=>1000,34626=>1000,34627=>1000,34628=>1000,34629=>1000,34630=>1000,34631=>1000,34632=>1000,34633=>1000,34634=>1000,34635=>1000,34636=>1000,34637=>1000,34638=>1000,34639=>1000,34640=>1000,34641=>1000,34642=>1000,34643=>1000,34644=>1000,34645=>1000,34646=>1000,34647=>1000,34648=>1000,34649=>1000,34650=>1000,34651=>1000,34652=>1000,34653=>1000,34654=>1000,34655=>1000,34656=>1000,34657=>1000,34658=>1000,34659=>1000,34660=>1000,34661=>1000,34662=>1000,34663=>1000,34664=>1000,34665=>1000,34666=>1000,34667=>1000,34668=>1000,34669=>1000,34670=>1000,34671=>1000,34672=>1000,34673=>1000,34674=>1000,34675=>1000,34676=>1000,34677=>1000,34678=>1000,34679=>1000,34680=>1000,34681=>1000,34682=>1000,34683=>1000,34684=>1000,34685=>1000,34686=>1000,34687=>1000,34688=>1000,34689=>1000,34690=>1000,34691=>1000,34692=>1000,34693=>1000,34694=>1000,34695=>1000,34696=>1000,34697=>1000,34698=>1000,34699=>1000,34700=>1000,34701=>1000,34702=>1000,34703=>1000,34704=>1000,34705=>1000,34706=>1000,34707=>1000,34708=>1000,34709=>1000,34710=>1000,34711=>1000,34712=>1000,34713=>1000,34714=>1000,34715=>1000,34716=>1000,34717=>1000,34718=>1000,34719=>1000,34720=>1000,34721=>1000,34722=>1000,34723=>1000,34724=>1000,34725=>1000,34726=>1000,34727=>1000,34728=>1000,34729=>1000,34730=>1000,34731=>1000,34732=>1000,34733=>1000,34734=>1000,34735=>1000,34736=>1000,34737=>1000,34738=>1000,34739=>1000,34740=>1000,34741=>1000,34742=>1000,34743=>1000,34744=>1000,34745=>1000,34746=>1000,34747=>1000,34748=>1000,34749=>1000,34750=>1000,34751=>1000,34752=>1000,34753=>1000,34754=>1000,34755=>1000,34756=>1000,34757=>1000,34758=>1000,34759=>1000,34760=>1000,34761=>1000,34762=>1000,34763=>1000,34764=>1000,34765=>1000,34766=>1000,34767=>1000,34768=>1000,34769=>1000,34770=>1000,34771=>1000,34772=>1000,34773=>1000,34774=>1000,34775=>1000,34776=>1000,34777=>1000,34778=>1000,34779=>1000,34780=>1000,34781=>1000,34782=>1000,34783=>1000,34784=>1000,34785=>1000,34786=>1000,34787=>1000,34788=>1000,34789=>1000,34790=>1000,34791=>1000,34792=>1000,34793=>1000,34794=>1000,34795=>1000,34796=>1000,34797=>1000,34798=>1000,34799=>1000,34800=>1000,34801=>1000,34802=>1000,34803=>1000,34804=>1000,34805=>1000,34806=>1000,34807=>1000,34808=>1000,34809=>1000,34810=>1000,34811=>1000,34812=>1000,34813=>1000,34814=>1000,34815=>1000,34816=>1000,34817=>1000,34818=>1000,34819=>1000,34820=>1000,34821=>1000,34822=>1000,34823=>1000,34824=>1000,34825=>1000,34826=>1000,34827=>1000,34828=>1000,34829=>1000,34830=>1000,34831=>1000,34832=>1000,34833=>1000,34834=>1000,34835=>1000,34836=>1000,34837=>1000,34838=>1000,34839=>1000,34840=>1000,34841=>1000,34842=>1000,34843=>1000,34844=>1000,34845=>1000,34846=>1000,34847=>1000,34848=>1000,34849=>1000,34850=>1000,34851=>1000,34852=>1000,34853=>1000,34854=>1000,34855=>1000,34856=>1000,34857=>1000,34858=>1000,34859=>1000,34860=>1000,34861=>1000,34862=>1000,34863=>1000,34864=>1000,34865=>1000,34866=>1000,34867=>1000,34868=>1000,34869=>1000,34870=>1000,34871=>1000,34872=>1000,34873=>1000,34874=>1000,34875=>1000,34876=>1000,34877=>1000,34878=>1000,34879=>1000,34880=>1000,34881=>1000,34882=>1000,34883=>1000,34884=>1000,34885=>1000,34886=>1000,34887=>1000,34888=>1000,34889=>1000,34890=>1000,34891=>1000,34892=>1000,34893=>1000,34894=>1000,34895=>1000,34896=>1000,34897=>1000,34898=>1000,34899=>1000,34900=>1000,34901=>1000,34902=>1000,34903=>1000,34904=>1000,34905=>1000,34906=>1000,34907=>1000,34908=>1000,34909=>1000,34910=>1000,34911=>1000,34912=>1000,34913=>1000,34914=>1000,34915=>1000,34916=>1000,34917=>1000,34918=>1000,34919=>1000,34920=>1000,34921=>1000,34922=>1000,34923=>1000,34924=>1000,34925=>1000,34926=>1000,34927=>1000,34928=>1000,34929=>1000,34930=>1000,34931=>1000,34932=>1000,34933=>1000,34934=>1000,34935=>1000,34936=>1000,34937=>1000,34938=>1000,34939=>1000,34940=>1000,34941=>1000,34942=>1000,34943=>1000,34944=>1000,34945=>1000,34946=>1000,34947=>1000,34948=>1000,34949=>1000,34950=>1000,34951=>1000,34952=>1000,34953=>1000,34954=>1000,34955=>1000,34956=>1000,34957=>1000,34958=>1000,34959=>1000,34960=>1000,34961=>1000,34962=>1000,34963=>1000,34964=>1000,34965=>1000,34966=>1000,34967=>1000,34968=>1000,34969=>1000,34970=>1000,34971=>1000,34972=>1000,34973=>1000,34974=>1000,34975=>1000,34976=>1000,34977=>1000,34978=>1000,34979=>1000,34980=>1000,34981=>1000,34982=>1000,34983=>1000,34984=>1000,34985=>1000,34986=>1000,34987=>1000,34988=>1000,34989=>1000,34990=>1000,34991=>1000,34992=>1000,34993=>1000,34994=>1000,34995=>1000,34996=>1000,34997=>1000,34998=>1000,34999=>1000,35000=>1000,35001=>1000,35002=>1000,35003=>1000,35004=>1000,35005=>1000,35006=>1000,35007=>1000,35008=>1000,35009=>1000,35010=>1000,35011=>1000,35012=>1000,35013=>1000,35014=>1000,35015=>1000,35016=>1000,35017=>1000,35018=>1000,35019=>1000,35020=>1000,35021=>1000,35022=>1000,35023=>1000,35024=>1000,35025=>1000,35026=>1000,35027=>1000,35028=>1000,35029=>1000,35030=>1000,35031=>1000,35032=>1000,35033=>1000,35034=>1000,35035=>1000,35036=>1000,35037=>1000,35038=>1000,35039=>1000,35040=>1000,35041=>1000,35042=>1000,35043=>1000,35044=>1000,35045=>1000,35046=>1000,35047=>1000,35048=>1000,35049=>1000,35050=>1000,35051=>1000,35052=>1000,35053=>1000,35054=>1000,35055=>1000,35056=>1000,35057=>1000,35058=>1000,35059=>1000,35060=>1000,35061=>1000,35062=>1000,35063=>1000,35064=>1000,35065=>1000,35066=>1000,35067=>1000,35068=>1000,35069=>1000,35070=>1000,35071=>1000,35072=>1000,35073=>1000,35074=>1000,35075=>1000,35076=>1000,35077=>1000,35078=>1000,35079=>1000,35080=>1000,35081=>1000,35082=>1000,35083=>1000,35084=>1000,35085=>1000,35086=>1000,35087=>1000,35088=>1000,35089=>1000,35090=>1000,35091=>1000,35092=>1000,35093=>1000,35094=>1000,35095=>1000,35096=>1000,35097=>1000,35098=>1000,35099=>1000,35100=>1000,35101=>1000,35102=>1000,35103=>1000,35104=>1000,35105=>1000,35106=>1000,35107=>1000,35108=>1000,35109=>1000,35110=>1000,35111=>1000,35112=>1000,35113=>1000,35114=>1000,35115=>1000,35116=>1000,35117=>1000,35118=>1000,35119=>1000,35120=>1000,35121=>1000,35122=>1000,35123=>1000,35124=>1000,35125=>1000,35126=>1000,35127=>1000,35128=>1000,35129=>1000,35130=>1000,35131=>1000,35132=>1000,35133=>1000,35134=>1000,35135=>1000,35136=>1000,35137=>1000,35138=>1000,35139=>1000,35140=>1000,35141=>1000,35142=>1000,35143=>1000,35144=>1000,35145=>1000,35146=>1000,35147=>1000,35148=>1000,35149=>1000,35150=>1000,35151=>1000,35152=>1000,35153=>1000,35154=>1000,35155=>1000,35156=>1000,35157=>1000,35158=>1000,35159=>1000,35160=>1000,35161=>1000,35162=>1000,35163=>1000,35164=>1000,35165=>1000,35166=>1000,35167=>1000,35168=>1000,35169=>1000,35170=>1000,35171=>1000,35172=>1000,35173=>1000,35174=>1000,35175=>1000,35176=>1000,35177=>1000,35178=>1000,35179=>1000,35180=>1000,35181=>1000,35182=>1000,35183=>1000,35184=>1000,35185=>1000,35186=>1000,35187=>1000,35188=>1000,35189=>1000,35190=>1000,35191=>1000,35192=>1000,35193=>1000,35194=>1000,35195=>1000,35196=>1000,35197=>1000,35198=>1000,35199=>1000,35200=>1000,35201=>1000,35202=>1000,35203=>1000,35204=>1000,35205=>1000,35206=>1000,35207=>1000,35208=>1000,35209=>1000,35210=>1000,35211=>1000,35212=>1000,35213=>1000,35214=>1000,35215=>1000,35216=>1000,35217=>1000,35218=>1000,35219=>1000,35220=>1000,35221=>1000,35222=>1000,35223=>1000,35224=>1000,35225=>1000,35226=>1000,35227=>1000,35228=>1000,35229=>1000,35230=>1000,35231=>1000,35232=>1000,35233=>1000,35234=>1000,35235=>1000,35236=>1000,35237=>1000,35238=>1000,35239=>1000,35240=>1000,35241=>1000,35242=>1000,35243=>1000,35244=>1000,35245=>1000,35246=>1000,35247=>1000,35248=>1000,35249=>1000,35250=>1000,35251=>1000,35252=>1000,35253=>1000,35254=>1000,35255=>1000,35256=>1000,35257=>1000,35258=>1000,35259=>1000,35260=>1000,35261=>1000,35262=>1000,35263=>1000,35264=>1000,35265=>1000,35266=>1000,35267=>1000,35268=>1000,35269=>1000,35270=>1000,35271=>1000,35272=>1000,35273=>1000,35274=>1000,35275=>1000,35276=>1000,35277=>1000,35278=>1000,35279=>1000,35280=>1000,35281=>1000,35282=>1000,35283=>1000,35284=>1000,35285=>1000,35286=>1000,35287=>1000,35288=>1000,35289=>1000,35290=>1000,35291=>1000,35292=>1000,35293=>1000,35294=>1000,35295=>1000,35296=>1000,35297=>1000,35298=>1000,35299=>1000,35300=>1000,35301=>1000,35302=>1000,35303=>1000,35304=>1000,35305=>1000,35306=>1000,35307=>1000,35308=>1000,35309=>1000,35310=>1000,35311=>1000,35312=>1000,35313=>1000,35314=>1000,35315=>1000,35316=>1000,35317=>1000,35318=>1000,35319=>1000,35320=>1000,35321=>1000,35322=>1000,35323=>1000,35324=>1000,35325=>1000,35326=>1000,35327=>1000,35328=>1000,35329=>1000,35330=>1000,35331=>1000,35332=>1000,35333=>1000,35334=>1000,35335=>1000,35336=>1000,35337=>1000,35338=>1000,35339=>1000,35340=>1000,35341=>1000,35342=>1000,35343=>1000,35344=>1000,35345=>1000,35346=>1000,35347=>1000,35348=>1000,35349=>1000,35350=>1000,35351=>1000,35352=>1000,35353=>1000,35354=>1000,35355=>1000,35356=>1000,35357=>1000,35358=>1000,35359=>1000,35360=>1000,35361=>1000,35362=>1000,35363=>1000,35364=>1000,35365=>1000,35366=>1000,35367=>1000,35368=>1000,35369=>1000,35370=>1000,35371=>1000,35372=>1000,35373=>1000,35374=>1000,35375=>1000,35376=>1000,35377=>1000,35378=>1000,35379=>1000,35380=>1000,35381=>1000,35382=>1000,35383=>1000,35384=>1000,35385=>1000,35386=>1000,35387=>1000,35388=>1000,35389=>1000,35390=>1000,35391=>1000,35392=>1000,35393=>1000,35394=>1000,35395=>1000,35396=>1000,35397=>1000,35398=>1000,35399=>1000,35400=>1000,35401=>1000,35402=>1000,35403=>1000,35404=>1000,35405=>1000,35406=>1000,35407=>1000,35408=>1000,35409=>1000,35410=>1000,35411=>1000,35412=>1000,35413=>1000,35414=>1000,35415=>1000,35416=>1000,35417=>1000,35418=>1000,35419=>1000,35420=>1000,35421=>1000,35422=>1000,35423=>1000,35424=>1000,35425=>1000,35426=>1000,35427=>1000,35428=>1000,35429=>1000,35430=>1000,35431=>1000,35432=>1000,35433=>1000,35434=>1000,35435=>1000,35436=>1000,35437=>1000,35438=>1000,35439=>1000,35440=>1000,35441=>1000,35442=>1000,35443=>1000,35444=>1000,35445=>1000,35446=>1000,35447=>1000,35448=>1000,35449=>1000,35450=>1000,35451=>1000,35452=>1000,35453=>1000,35454=>1000,35455=>1000,35456=>1000,35457=>1000,35458=>1000,35459=>1000,35460=>1000,35461=>1000,35462=>1000,35463=>1000,35464=>1000,35465=>1000,35466=>1000,35467=>1000,35468=>1000,35469=>1000,35470=>1000,35471=>1000,35472=>1000,35473=>1000,35474=>1000,35475=>1000,35476=>1000,35477=>1000,35478=>1000,35479=>1000,35480=>1000,35481=>1000,35482=>1000,35483=>1000,35484=>1000,35485=>1000,35486=>1000,35487=>1000,35488=>1000,35489=>1000,35490=>1000,35491=>1000,35492=>1000,35493=>1000,35494=>1000,35495=>1000,35496=>1000,35497=>1000,35498=>1000,35499=>1000,35500=>1000,35501=>1000,35502=>1000,35503=>1000,35504=>1000,35505=>1000,35506=>1000,35507=>1000,35508=>1000,35509=>1000,35510=>1000,35511=>1000,35512=>1000,35513=>1000,35514=>1000,35515=>1000,35516=>1000,35517=>1000,35518=>1000,35519=>1000,35520=>1000,35521=>1000,35522=>1000,35523=>1000,35524=>1000,35525=>1000,35526=>1000,35527=>1000,35528=>1000,35529=>1000,35530=>1000,35531=>1000,35532=>1000,35533=>1000,35534=>1000,35535=>1000,35536=>1000,35537=>1000,35538=>1000,35539=>1000,35540=>1000,35541=>1000,35542=>1000,35543=>1000,35544=>1000,35545=>1000,35546=>1000,35547=>1000,35548=>1000,35549=>1000,35550=>1000,35551=>1000,35552=>1000,35553=>1000,35554=>1000,35555=>1000,35556=>1000,35557=>1000,35558=>1000,35559=>1000,35560=>1000,35561=>1000,35562=>1000,35563=>1000,35564=>1000,35565=>1000,35566=>1000,35567=>1000,35568=>1000,35569=>1000,35570=>1000,35571=>1000,35572=>1000,35573=>1000,35574=>1000,35575=>1000,35576=>1000,35577=>1000,35578=>1000,35579=>1000,35580=>1000,35581=>1000,35582=>1000,35583=>1000,35584=>1000,35585=>1000,35586=>1000,35587=>1000,35588=>1000,35589=>1000,35590=>1000,35591=>1000,35592=>1000,35593=>1000,35594=>1000,35595=>1000,35596=>1000,35597=>1000,35598=>1000,35599=>1000,35600=>1000,35601=>1000,35602=>1000,35603=>1000,35604=>1000,35605=>1000,35606=>1000,35607=>1000,35608=>1000,35609=>1000,35610=>1000,35611=>1000,35612=>1000,35613=>1000,35614=>1000,35615=>1000,35616=>1000,35617=>1000,35618=>1000,35619=>1000,35620=>1000,35621=>1000,35622=>1000,35623=>1000,35624=>1000,35625=>1000,35626=>1000,35627=>1000,35628=>1000,35629=>1000,35630=>1000,35631=>1000,35632=>1000,35633=>1000,35634=>1000,35635=>1000,35636=>1000,35637=>1000,35638=>1000,35639=>1000,35640=>1000,35641=>1000,35642=>1000,35643=>1000,35644=>1000,35645=>1000,35646=>1000,35647=>1000,35648=>1000,35649=>1000,35650=>1000,35651=>1000,35652=>1000,35653=>1000,35654=>1000,35655=>1000,35656=>1000,35657=>1000,35658=>1000,35659=>1000,35660=>1000,35661=>1000,35662=>1000,35663=>1000,35664=>1000,35665=>1000,35666=>1000,35667=>1000,35668=>1000,35669=>1000,35670=>1000,35671=>1000,35672=>1000,35673=>1000,35674=>1000,35675=>1000,35676=>1000,35677=>1000,35678=>1000,35679=>1000,35680=>1000,35681=>1000,35682=>1000,35683=>1000,35684=>1000,35685=>1000,35686=>1000,35687=>1000,35688=>1000,35689=>1000,35690=>1000,35691=>1000,35692=>1000,35693=>1000,35694=>1000,35695=>1000,35696=>1000,35697=>1000,35698=>1000,35699=>1000,35700=>1000,35701=>1000,35702=>1000,35703=>1000,35704=>1000,35705=>1000,35706=>1000,35707=>1000,35708=>1000,35709=>1000,35710=>1000,35711=>1000,35712=>1000,35713=>1000,35714=>1000,35715=>1000,35716=>1000,35717=>1000,35718=>1000,35719=>1000,35720=>1000,35721=>1000,35722=>1000,35723=>1000,35724=>1000,35725=>1000,35726=>1000,35727=>1000,35728=>1000,35729=>1000,35730=>1000,35731=>1000,35732=>1000,35733=>1000,35734=>1000,35735=>1000,35736=>1000,35737=>1000,35738=>1000,35739=>1000,35740=>1000,35741=>1000,35742=>1000,35743=>1000,35744=>1000,35745=>1000,35746=>1000,35747=>1000,35748=>1000,35749=>1000,35750=>1000,35751=>1000,35752=>1000,35753=>1000,35754=>1000,35755=>1000,35756=>1000,35757=>1000,35758=>1000,35759=>1000,35760=>1000,35761=>1000,35762=>1000,35763=>1000,35764=>1000,35765=>1000,35766=>1000,35767=>1000,35768=>1000,35769=>1000,35770=>1000,35771=>1000,35772=>1000,35773=>1000,35774=>1000,35775=>1000,35776=>1000,35777=>1000,35778=>1000,35779=>1000,35780=>1000,35781=>1000,35782=>1000,35783=>1000,35784=>1000,35785=>1000,35786=>1000,35787=>1000,35788=>1000,35789=>1000,35790=>1000,35791=>1000,35792=>1000,35793=>1000,35794=>1000,35795=>1000,35796=>1000,35797=>1000,35798=>1000,35799=>1000,35800=>1000,35801=>1000,35802=>1000,35803=>1000,35804=>1000,35805=>1000,35806=>1000,35807=>1000,35808=>1000,35809=>1000,35810=>1000,35811=>1000,35812=>1000,35813=>1000,35814=>1000,35815=>1000,35816=>1000,35817=>1000,35818=>1000,35819=>1000,35820=>1000,35821=>1000,35822=>1000,35823=>1000,35824=>1000,35825=>1000,35826=>1000,35827=>1000,35828=>1000,35829=>1000,35830=>1000,35831=>1000,35832=>1000,35833=>1000,35834=>1000,35835=>1000,35836=>1000,35837=>1000,35838=>1000,35839=>1000,35840=>1000,35841=>1000,35842=>1000,35843=>1000,35844=>1000,35845=>1000,35846=>1000,35847=>1000,35848=>1000,35849=>1000,35850=>1000,35851=>1000,35852=>1000,35853=>1000,35854=>1000,35855=>1000,35856=>1000,35857=>1000,35858=>1000,35859=>1000,35860=>1000,35861=>1000,35862=>1000,35863=>1000,35864=>1000,35865=>1000,35866=>1000,35867=>1000,35868=>1000,35869=>1000,35870=>1000,35871=>1000,35872=>1000,35873=>1000,35874=>1000,35875=>1000,35876=>1000,35877=>1000,35878=>1000,35879=>1000,35880=>1000,35881=>1000,35882=>1000,35883=>1000,35884=>1000,35885=>1000,35886=>1000,35887=>1000,35888=>1000,35889=>1000,35890=>1000,35891=>1000,35892=>1000,35893=>1000,35894=>1000,35895=>1000,35896=>1000,35897=>1000,35898=>1000,35899=>1000,35900=>1000,35901=>1000,35902=>1000,35903=>1000,35904=>1000,35905=>1000,35906=>1000,35907=>1000,35908=>1000,35909=>1000,35910=>1000,35911=>1000,35912=>1000,35913=>1000,35914=>1000,35915=>1000,35916=>1000,35917=>1000,35918=>1000,35919=>1000,35920=>1000,35921=>1000,35922=>1000,35923=>1000,35924=>1000,35925=>1000,35926=>1000,35927=>1000,35928=>1000,35929=>1000,35930=>1000,35931=>1000,35932=>1000,35933=>1000,35934=>1000,35935=>1000,35936=>1000,35937=>1000,35938=>1000,35939=>1000,35940=>1000,35941=>1000,35942=>1000,35943=>1000,35944=>1000,35945=>1000,35946=>1000,35947=>1000,35948=>1000,35949=>1000,35950=>1000,35951=>1000,35952=>1000,35953=>1000,35954=>1000,35955=>1000,35956=>1000,35957=>1000,35958=>1000,35959=>1000,35960=>1000,35961=>1000,35962=>1000,35963=>1000,35964=>1000,35965=>1000,35966=>1000,35967=>1000,35968=>1000,35969=>1000,35970=>1000,35971=>1000,35972=>1000,35973=>1000,35974=>1000,35975=>1000,35976=>1000,35977=>1000,35978=>1000,35979=>1000,35980=>1000,35981=>1000,35982=>1000,35983=>1000,35984=>1000,35985=>1000,35986=>1000,35987=>1000,35988=>1000,35989=>1000,35990=>1000,35991=>1000,35992=>1000,35993=>1000,35994=>1000,35995=>1000,35996=>1000,35997=>1000,35998=>1000,35999=>1000,36000=>1000,36001=>1000,36002=>1000,36003=>1000,36004=>1000,36005=>1000,36006=>1000,36007=>1000,36008=>1000,36009=>1000,36010=>1000,36011=>1000,36012=>1000,36013=>1000,36014=>1000,36015=>1000,36016=>1000,36017=>1000,36018=>1000,36019=>1000,36020=>1000,36021=>1000,36022=>1000,36023=>1000,36024=>1000,36025=>1000,36026=>1000,36027=>1000,36028=>1000,36029=>1000,36030=>1000,36031=>1000,36032=>1000,36033=>1000,36034=>1000,36035=>1000,36036=>1000,36037=>1000,36038=>1000,36039=>1000,36040=>1000,36041=>1000,36042=>1000,36043=>1000,36044=>1000,36045=>1000,36046=>1000,36047=>1000,36048=>1000,36049=>1000,36050=>1000,36051=>1000,36052=>1000,36053=>1000,36054=>1000,36055=>1000,36056=>1000,36057=>1000,36058=>1000,36059=>1000,36060=>1000,36061=>1000,36062=>1000,36063=>1000,36064=>1000,36065=>1000,36066=>1000,36067=>1000,36068=>1000,36069=>1000,36070=>1000,36071=>1000,36072=>1000,36073=>1000,36074=>1000,36075=>1000,36076=>1000,36077=>1000,36078=>1000,36079=>1000,36080=>1000,36081=>1000,36082=>1000,36083=>1000,36084=>1000,36085=>1000,36086=>1000,36087=>1000,36088=>1000,36089=>1000,36090=>1000,36091=>1000,36092=>1000,36093=>1000,36094=>1000,36095=>1000,36096=>1000,36097=>1000,36098=>1000,36099=>1000,36100=>1000,36101=>1000,36102=>1000,36103=>1000,36104=>1000,36105=>1000,36106=>1000,36107=>1000,36108=>1000,36109=>1000,36110=>1000,36111=>1000,36112=>1000,36113=>1000,36114=>1000,36115=>1000,36116=>1000,36117=>1000,36118=>1000,36119=>1000,36120=>1000,36121=>1000,36122=>1000,36123=>1000,36124=>1000,36125=>1000,36126=>1000,36127=>1000,36128=>1000,36129=>1000,36130=>1000,36131=>1000,36132=>1000,36133=>1000,36134=>1000,36135=>1000,36136=>1000,36137=>1000,36138=>1000,36139=>1000,36140=>1000,36141=>1000,36142=>1000,36143=>1000,36144=>1000,36145=>1000,36146=>1000,36147=>1000,36148=>1000,36149=>1000,36150=>1000,36151=>1000,36152=>1000,36153=>1000,36154=>1000,36155=>1000,36156=>1000,36157=>1000,36158=>1000,36159=>1000,36160=>1000,36161=>1000,36162=>1000,36163=>1000,36164=>1000,36165=>1000,36166=>1000,36167=>1000,36168=>1000,36169=>1000,36170=>1000,36171=>1000,36172=>1000,36173=>1000,36174=>1000,36175=>1000,36176=>1000,36177=>1000,36178=>1000,36179=>1000,36180=>1000,36181=>1000,36182=>1000,36183=>1000,36184=>1000,36185=>1000,36186=>1000,36187=>1000,36188=>1000,36189=>1000,36190=>1000,36191=>1000,36192=>1000,36193=>1000,36194=>1000,36195=>1000,36196=>1000,36197=>1000,36198=>1000,36199=>1000,36200=>1000,36201=>1000,36202=>1000,36203=>1000,36204=>1000,36205=>1000,36206=>1000,36207=>1000,36208=>1000,36209=>1000,36210=>1000,36211=>1000,36212=>1000,36213=>1000,36214=>1000,36215=>1000,36216=>1000,36217=>1000,36218=>1000,36219=>1000,36220=>1000,36221=>1000,36222=>1000,36223=>1000,36224=>1000,36225=>1000,36226=>1000,36227=>1000,36228=>1000,36229=>1000,36230=>1000,36231=>1000,36232=>1000,36233=>1000,36234=>1000,36235=>1000,36236=>1000,36237=>1000,36238=>1000,36239=>1000,36240=>1000,36241=>1000,36242=>1000,36243=>1000,36244=>1000,36245=>1000,36246=>1000,36247=>1000,36248=>1000,36249=>1000,36250=>1000,36251=>1000,36252=>1000,36253=>1000,36254=>1000,36255=>1000,36256=>1000,36257=>1000,36258=>1000,36259=>1000,36260=>1000,36261=>1000,36262=>1000,36263=>1000,36264=>1000,36265=>1000,36266=>1000,36267=>1000,36268=>1000,36269=>1000,36270=>1000,36271=>1000,36272=>1000,36273=>1000,36274=>1000,36275=>1000,36276=>1000,36277=>1000,36278=>1000,36279=>1000,36280=>1000,36281=>1000,36282=>1000,36283=>1000,36284=>1000,36285=>1000,36286=>1000,36287=>1000,36288=>1000,36289=>1000,36290=>1000,36291=>1000,36292=>1000,36293=>1000,36294=>1000,36295=>1000,36296=>1000,36297=>1000,36298=>1000,36299=>1000,36300=>1000,36301=>1000,36302=>1000,36303=>1000,36304=>1000,36305=>1000,36306=>1000,36307=>1000,36308=>1000,36309=>1000,36310=>1000,36311=>1000,36312=>1000,36313=>1000,36314=>1000,36315=>1000,36316=>1000,36317=>1000,36318=>1000,36319=>1000,36320=>1000,36321=>1000,36322=>1000,36323=>1000,36324=>1000,36325=>1000,36326=>1000,36327=>1000,36328=>1000,36329=>1000,36330=>1000,36331=>1000,36332=>1000,36333=>1000,36334=>1000,36335=>1000,36336=>1000,36337=>1000,36338=>1000,36339=>1000,36340=>1000,36341=>1000,36342=>1000,36343=>1000,36344=>1000,36345=>1000,36346=>1000,36347=>1000,36348=>1000,36349=>1000,36350=>1000,36351=>1000,36352=>1000,36353=>1000,36354=>1000,36355=>1000,36356=>1000,36357=>1000,36358=>1000,36359=>1000,36360=>1000,36361=>1000,36362=>1000,36363=>1000,36364=>1000,36365=>1000,36366=>1000,36367=>1000,36368=>1000,36369=>1000,36370=>1000,36371=>1000,36372=>1000,36373=>1000,36374=>1000,36375=>1000,36376=>1000,36377=>1000,36378=>1000,36379=>1000,36380=>1000,36381=>1000,36382=>1000,36383=>1000,36384=>1000,36385=>1000,36386=>1000,36387=>1000,36388=>1000,36389=>1000,36390=>1000,36391=>1000,36392=>1000,36393=>1000,36394=>1000,36395=>1000,36396=>1000,36397=>1000,36398=>1000,36399=>1000,36400=>1000,36401=>1000,36402=>1000,36403=>1000,36404=>1000,36405=>1000,36406=>1000,36407=>1000,36408=>1000,36409=>1000,36410=>1000,36411=>1000,36412=>1000,36413=>1000,36414=>1000,36415=>1000,36416=>1000,36417=>1000,36418=>1000,36419=>1000,36420=>1000,36421=>1000,36422=>1000,36423=>1000,36424=>1000,36425=>1000,36426=>1000,36427=>1000,36428=>1000,36429=>1000,36430=>1000,36431=>1000,36432=>1000,36433=>1000,36434=>1000,36435=>1000,36436=>1000,36437=>1000,36438=>1000,36439=>1000,36440=>1000,36441=>1000,36442=>1000,36443=>1000,36444=>1000,36445=>1000,36446=>1000,36447=>1000,36448=>1000,36449=>1000,36450=>1000,36451=>1000,36452=>1000,36453=>1000,36454=>1000,36455=>1000,36456=>1000,36457=>1000,36458=>1000,36459=>1000,36460=>1000,36461=>1000,36462=>1000,36463=>1000,36464=>1000,36465=>1000,36466=>1000,36467=>1000,36468=>1000,36469=>1000,36470=>1000,36471=>1000,36472=>1000,36473=>1000,36474=>1000,36475=>1000,36476=>1000,36477=>1000,36478=>1000,36479=>1000,36480=>1000,36481=>1000,36482=>1000,36483=>1000,36484=>1000,36485=>1000,36486=>1000,36487=>1000,36488=>1000,36489=>1000,36490=>1000,36491=>1000,36492=>1000,36493=>1000,36494=>1000,36495=>1000,36496=>1000,36497=>1000,36498=>1000,36499=>1000,36500=>1000,36501=>1000,36502=>1000,36503=>1000,36504=>1000,36505=>1000,36506=>1000,36507=>1000,36508=>1000,36509=>1000,36510=>1000,36511=>1000,36512=>1000,36513=>1000,36514=>1000,36515=>1000,36516=>1000,36517=>1000,36518=>1000,36519=>1000,36520=>1000,36521=>1000,36522=>1000,36523=>1000,36524=>1000,36525=>1000,36526=>1000,36527=>1000,36528=>1000,36529=>1000,36530=>1000,36531=>1000,36532=>1000,36533=>1000,36534=>1000,36535=>1000,36536=>1000,36537=>1000,36538=>1000,36539=>1000,36540=>1000,36541=>1000,36542=>1000,36543=>1000,36544=>1000,36545=>1000,36546=>1000,36547=>1000,36548=>1000,36549=>1000,36550=>1000,36551=>1000,36552=>1000,36553=>1000,36554=>1000,36555=>1000,36556=>1000,36557=>1000,36558=>1000,36559=>1000,36560=>1000,36561=>1000,36562=>1000,36563=>1000,36564=>1000,36565=>1000,36566=>1000,36567=>1000,36568=>1000,36569=>1000,36570=>1000,36571=>1000,36572=>1000,36573=>1000,36574=>1000,36575=>1000,36576=>1000,36577=>1000,36578=>1000,36579=>1000,36580=>1000,36581=>1000,36582=>1000,36583=>1000,36584=>1000,36585=>1000,36586=>1000,36587=>1000,36588=>1000,36589=>1000,36590=>1000,36591=>1000,36592=>1000,36593=>1000,36594=>1000,36595=>1000,36596=>1000,36597=>1000,36598=>1000,36599=>1000,36600=>1000,36601=>1000,36602=>1000,36603=>1000,36604=>1000,36605=>1000,36606=>1000,36607=>1000,36608=>1000,36609=>1000,36610=>1000,36611=>1000,36612=>1000,36613=>1000,36614=>1000,36615=>1000,36616=>1000,36617=>1000,36618=>1000,36619=>1000,36620=>1000,36621=>1000,36622=>1000,36623=>1000,36624=>1000,36625=>1000,36626=>1000,36627=>1000,36628=>1000,36629=>1000,36630=>1000,36631=>1000,36632=>1000,36633=>1000,36634=>1000,36635=>1000,36636=>1000,36637=>1000,36638=>1000,36639=>1000,36640=>1000,36641=>1000,36642=>1000,36643=>1000,36644=>1000,36645=>1000,36646=>1000,36647=>1000,36648=>1000,36649=>1000,36650=>1000,36651=>1000,36652=>1000,36653=>1000,36654=>1000,36655=>1000,36656=>1000,36657=>1000,36658=>1000,36659=>1000,36660=>1000,36661=>1000,36662=>1000,36663=>1000,36664=>1000,36665=>1000,36666=>1000,36667=>1000,36668=>1000,36669=>1000,36670=>1000,36671=>1000,36672=>1000,36673=>1000,36674=>1000,36675=>1000,36676=>1000,36677=>1000,36678=>1000,36679=>1000,36680=>1000,36681=>1000,36682=>1000,36683=>1000,36684=>1000,36685=>1000,36686=>1000,36687=>1000,36688=>1000,36689=>1000,36690=>1000,36691=>1000,36692=>1000,36693=>1000,36694=>1000,36695=>1000,36696=>1000,36697=>1000,36698=>1000,36699=>1000,36700=>1000,36701=>1000,36702=>1000,36703=>1000,36704=>1000,36705=>1000,36706=>1000,36707=>1000,36708=>1000,36709=>1000,36710=>1000,36711=>1000,36712=>1000,36713=>1000,36714=>1000,36715=>1000,36716=>1000,36717=>1000,36718=>1000,36719=>1000,36720=>1000,36721=>1000,36722=>1000,36723=>1000,36724=>1000,36725=>1000,36726=>1000,36727=>1000,36728=>1000,36729=>1000,36730=>1000,36731=>1000,36732=>1000,36733=>1000,36734=>1000,36735=>1000,36736=>1000,36737=>1000,36738=>1000,36739=>1000,36740=>1000,36741=>1000,36742=>1000,36743=>1000,36744=>1000,36745=>1000,36746=>1000,36747=>1000,36748=>1000,36749=>1000,36750=>1000,36751=>1000,36752=>1000,36753=>1000,36754=>1000,36755=>1000,36756=>1000,36757=>1000,36758=>1000,36759=>1000,36760=>1000,36761=>1000,36762=>1000,36763=>1000,36764=>1000,36765=>1000,36766=>1000,36767=>1000,36768=>1000,36769=>1000,36770=>1000,36771=>1000,36772=>1000,36773=>1000,36774=>1000,36775=>1000,36776=>1000,36777=>1000,36778=>1000,36779=>1000,36780=>1000,36781=>1000,36782=>1000,36783=>1000,36784=>1000,36785=>1000,36786=>1000,36787=>1000,36788=>1000,36789=>1000,36790=>1000,36791=>1000,36792=>1000,36793=>1000,36794=>1000,36795=>1000,36796=>1000,36797=>1000,36798=>1000,36799=>1000,36800=>1000,36801=>1000,36802=>1000,36803=>1000,36804=>1000,36805=>1000,36806=>1000,36807=>1000,36808=>1000,36809=>1000,36810=>1000,36811=>1000,36812=>1000,36813=>1000,36814=>1000,36815=>1000,36816=>1000,36817=>1000,36818=>1000,36819=>1000,36820=>1000,36821=>1000,36822=>1000,36823=>1000,36824=>1000,36825=>1000,36826=>1000,36827=>1000,36828=>1000,36829=>1000,36830=>1000,36831=>1000,36832=>1000,36833=>1000,36834=>1000,36835=>1000,36836=>1000,36837=>1000,36838=>1000,36839=>1000,36840=>1000,36841=>1000,36842=>1000,36843=>1000,36844=>1000,36845=>1000,36846=>1000,36847=>1000,36848=>1000,36849=>1000,36850=>1000,36851=>1000,36852=>1000,36853=>1000,36854=>1000,36855=>1000,36856=>1000,36857=>1000,36858=>1000,36859=>1000,36860=>1000,36861=>1000,36862=>1000,36863=>1000,36864=>1000,36865=>1000,36866=>1000,36867=>1000,36868=>1000,36869=>1000,36870=>1000,36871=>1000,36872=>1000,36873=>1000,36874=>1000,36875=>1000,36876=>1000,36877=>1000,36878=>1000,36879=>1000,36880=>1000,36881=>1000,36882=>1000,36883=>1000,36884=>1000,36885=>1000,36886=>1000,36887=>1000,36888=>1000,36889=>1000,36890=>1000,36891=>1000,36892=>1000,36893=>1000,36894=>1000,36895=>1000,36896=>1000,36897=>1000,36898=>1000,36899=>1000,36900=>1000,36901=>1000,36902=>1000,36903=>1000,36904=>1000,36905=>1000,36906=>1000,36907=>1000,36908=>1000,36909=>1000,36910=>1000,36911=>1000,36912=>1000,36913=>1000,36914=>1000,36915=>1000,36916=>1000,36917=>1000,36918=>1000,36919=>1000,36920=>1000,36921=>1000,36922=>1000,36923=>1000,36924=>1000,36925=>1000,36926=>1000,36927=>1000,36928=>1000,36929=>1000,36930=>1000,36931=>1000,36932=>1000,36933=>1000,36934=>1000,36935=>1000,36936=>1000,36937=>1000,36938=>1000,36939=>1000,36940=>1000,36941=>1000,36942=>1000,36943=>1000,36944=>1000,36945=>1000,36946=>1000,36947=>1000,36948=>1000,36949=>1000,36950=>1000,36951=>1000,36952=>1000,36953=>1000,36954=>1000,36955=>1000,36956=>1000,36957=>1000,36958=>1000,36959=>1000,36960=>1000,36961=>1000,36962=>1000,36963=>1000,36964=>1000,36965=>1000,36966=>1000,36967=>1000,36968=>1000,36969=>1000,36970=>1000,36971=>1000,36972=>1000,36973=>1000,36974=>1000,36975=>1000,36976=>1000,36977=>1000,36978=>1000,36979=>1000,36980=>1000,36981=>1000,36982=>1000,36983=>1000,36984=>1000,36985=>1000,36986=>1000,36987=>1000,36988=>1000,36989=>1000,36990=>1000,36991=>1000,36992=>1000,36993=>1000,36994=>1000,36995=>1000,36996=>1000,36997=>1000,36998=>1000,36999=>1000,37000=>1000,37001=>1000,37002=>1000,37003=>1000,37004=>1000,37005=>1000,37006=>1000,37007=>1000,37008=>1000,37009=>1000,37010=>1000,37011=>1000,37012=>1000,37013=>1000,37014=>1000,37015=>1000,37016=>1000,37017=>1000,37018=>1000,37019=>1000,37020=>1000,37021=>1000,37022=>1000,37023=>1000,37024=>1000,37025=>1000,37026=>1000,37027=>1000,37028=>1000,37029=>1000,37030=>1000,37031=>1000,37032=>1000,37033=>1000,37034=>1000,37035=>1000,37036=>1000,37037=>1000,37038=>1000,37039=>1000,37040=>1000,37041=>1000,37042=>1000,37043=>1000,37044=>1000,37045=>1000,37046=>1000,37047=>1000,37048=>1000,37049=>1000,37050=>1000,37051=>1000,37052=>1000,37053=>1000,37054=>1000,37055=>1000,37056=>1000,37057=>1000,37058=>1000,37059=>1000,37060=>1000,37061=>1000,37062=>1000,37063=>1000,37064=>1000,37065=>1000,37066=>1000,37067=>1000,37068=>1000,37069=>1000,37070=>1000,37071=>1000,37072=>1000,37073=>1000,37074=>1000,37075=>1000,37076=>1000,37077=>1000,37078=>1000,37079=>1000,37080=>1000,37081=>1000,37082=>1000,37083=>1000,37084=>1000,37085=>1000,37086=>1000,37087=>1000,37088=>1000,37089=>1000,37090=>1000,37091=>1000,37092=>1000,37093=>1000,37094=>1000,37095=>1000,37096=>1000,37097=>1000,37098=>1000,37099=>1000,37100=>1000,37101=>1000,37102=>1000,37103=>1000,37104=>1000,37105=>1000,37106=>1000,37107=>1000,37108=>1000,37109=>1000,37110=>1000,37111=>1000,37112=>1000,37113=>1000,37114=>1000,37115=>1000,37116=>1000,37117=>1000,37118=>1000,37119=>1000,37120=>1000,37121=>1000,37122=>1000,37123=>1000,37124=>1000,37125=>1000,37126=>1000,37127=>1000,37128=>1000,37129=>1000,37130=>1000,37131=>1000,37132=>1000,37133=>1000,37134=>1000,37135=>1000,37136=>1000,37137=>1000,37138=>1000,37139=>1000,37140=>1000,37141=>1000,37142=>1000,37143=>1000,37144=>1000,37145=>1000,37146=>1000,37147=>1000,37148=>1000,37149=>1000,37150=>1000,37151=>1000,37152=>1000,37153=>1000,37154=>1000,37155=>1000,37156=>1000,37157=>1000,37158=>1000,37159=>1000,37160=>1000,37161=>1000,37162=>1000,37163=>1000,37164=>1000,37165=>1000,37166=>1000,37167=>1000,37168=>1000,37169=>1000,37170=>1000,37171=>1000,37172=>1000,37173=>1000,37174=>1000,37175=>1000,37176=>1000,37177=>1000,37178=>1000,37179=>1000,37180=>1000,37181=>1000,37182=>1000,37183=>1000,37184=>1000,37185=>1000,37186=>1000,37187=>1000,37188=>1000,37189=>1000,37190=>1000,37191=>1000,37192=>1000,37193=>1000,37194=>1000,37195=>1000,37196=>1000,37197=>1000,37198=>1000,37199=>1000,37200=>1000,37201=>1000,37202=>1000,37203=>1000,37204=>1000,37205=>1000,37206=>1000,37207=>1000,37208=>1000,37209=>1000,37210=>1000,37211=>1000,37212=>1000,37213=>1000,37214=>1000,37215=>1000,37216=>1000,37217=>1000,37218=>1000,37219=>1000,37220=>1000,37221=>1000,37222=>1000,37223=>1000,37224=>1000,37225=>1000,37226=>1000,37227=>1000,37228=>1000,37229=>1000,37230=>1000,37231=>1000,37232=>1000,37233=>1000,37234=>1000,37235=>1000,37236=>1000,37237=>1000,37238=>1000,37239=>1000,37240=>1000,37241=>1000,37242=>1000,37243=>1000,37244=>1000,37245=>1000,37246=>1000,37247=>1000,37248=>1000,37249=>1000,37250=>1000,37251=>1000,37252=>1000,37253=>1000,37254=>1000,37255=>1000,37256=>1000,37257=>1000,37258=>1000,37259=>1000,37260=>1000,37261=>1000,37262=>1000,37263=>1000,37264=>1000,37265=>1000,37266=>1000,37267=>1000,37268=>1000,37269=>1000,37270=>1000,37271=>1000,37272=>1000,37273=>1000,37274=>1000,37275=>1000,37276=>1000,37277=>1000,37278=>1000,37279=>1000,37280=>1000,37281=>1000,37282=>1000,37283=>1000,37284=>1000,37285=>1000,37286=>1000,37287=>1000,37288=>1000,37289=>1000,37290=>1000,37291=>1000,37292=>1000,37293=>1000,37294=>1000,37295=>1000,37296=>1000,37297=>1000,37298=>1000,37299=>1000,37300=>1000,37301=>1000,37302=>1000,37303=>1000,37304=>1000,37305=>1000,37306=>1000,37307=>1000,37308=>1000,37309=>1000,37310=>1000,37311=>1000,37312=>1000,37313=>1000,37314=>1000,37315=>1000,37316=>1000,37317=>1000,37318=>1000,37319=>1000,37320=>1000,37321=>1000,37322=>1000,37323=>1000,37324=>1000,37325=>1000,37326=>1000,37327=>1000,37328=>1000,37329=>1000,37330=>1000,37331=>1000,37332=>1000,37333=>1000,37334=>1000,37335=>1000,37336=>1000,37337=>1000,37338=>1000,37339=>1000,37340=>1000,37341=>1000,37342=>1000,37343=>1000,37344=>1000,37345=>1000,37346=>1000,37347=>1000,37348=>1000,37349=>1000,37350=>1000,37351=>1000,37352=>1000,37353=>1000,37354=>1000,37355=>1000,37356=>1000,37357=>1000,37358=>1000,37359=>1000,37360=>1000,37361=>1000,37362=>1000,37363=>1000,37364=>1000,37365=>1000,37366=>1000,37367=>1000,37368=>1000,37369=>1000,37370=>1000,37371=>1000,37372=>1000,37373=>1000,37374=>1000,37375=>1000,37376=>1000,37377=>1000,37378=>1000,37379=>1000,37380=>1000,37381=>1000,37382=>1000,37383=>1000,37384=>1000,37385=>1000,37386=>1000,37387=>1000,37388=>1000,37389=>1000,37390=>1000,37391=>1000,37392=>1000,37393=>1000,37394=>1000,37395=>1000,37396=>1000,37397=>1000,37398=>1000,37399=>1000,37400=>1000,37401=>1000,37402=>1000,37403=>1000,37404=>1000,37405=>1000,37406=>1000,37407=>1000,37408=>1000,37409=>1000,37410=>1000,37411=>1000,37412=>1000,37413=>1000,37414=>1000,37415=>1000,37416=>1000,37417=>1000,37418=>1000,37419=>1000,37420=>1000,37421=>1000,37422=>1000,37423=>1000,37424=>1000,37425=>1000,37426=>1000,37427=>1000,37428=>1000,37429=>1000,37430=>1000,37431=>1000,37432=>1000,37433=>1000,37434=>1000,37435=>1000,37436=>1000,37437=>1000,37438=>1000,37439=>1000,37440=>1000,37441=>1000,37442=>1000,37443=>1000,37444=>1000,37445=>1000,37446=>1000,37447=>1000,37448=>1000,37449=>1000,37450=>1000,37451=>1000,37452=>1000,37453=>1000,37454=>1000,37455=>1000,37456=>1000,37457=>1000,37458=>1000,37459=>1000,37460=>1000,37461=>1000,37462=>1000,37463=>1000,37464=>1000,37465=>1000,37466=>1000,37467=>1000,37468=>1000,37469=>1000,37470=>1000,37471=>1000,37472=>1000,37473=>1000,37474=>1000,37475=>1000,37476=>1000,37477=>1000,37478=>1000,37479=>1000,37480=>1000,37481=>1000,37482=>1000,37483=>1000,37484=>1000,37485=>1000,37486=>1000,37487=>1000,37488=>1000,37489=>1000,37490=>1000,37491=>1000,37492=>1000,37493=>1000,37494=>1000,37495=>1000,37496=>1000,37497=>1000,37498=>1000,37499=>1000,37500=>1000,37501=>1000,37502=>1000,37503=>1000,37504=>1000,37505=>1000,37506=>1000,37507=>1000,37508=>1000,37509=>1000,37510=>1000,37511=>1000,37512=>1000,37513=>1000,37514=>1000,37515=>1000,37516=>1000,37517=>1000,37518=>1000,37519=>1000,37520=>1000,37521=>1000,37522=>1000,37523=>1000,37524=>1000,37525=>1000,37526=>1000,37527=>1000,37528=>1000,37529=>1000,37530=>1000,37531=>1000,37532=>1000,37533=>1000,37534=>1000,37535=>1000,37536=>1000,37537=>1000,37538=>1000,37539=>1000,37540=>1000,37541=>1000,37542=>1000,37543=>1000,37544=>1000,37545=>1000,37546=>1000,37547=>1000,37548=>1000,37549=>1000,37550=>1000,37551=>1000,37552=>1000,37553=>1000,37554=>1000,37555=>1000,37556=>1000,37557=>1000,37558=>1000,37559=>1000,37560=>1000,37561=>1000,37562=>1000,37563=>1000,37564=>1000,37565=>1000,37566=>1000,37567=>1000,37568=>1000,37569=>1000,37570=>1000,37571=>1000,37572=>1000,37573=>1000,37574=>1000,37575=>1000,37576=>1000,37577=>1000,37578=>1000,37579=>1000,37580=>1000,37581=>1000,37582=>1000,37583=>1000,37584=>1000,37585=>1000,37586=>1000,37587=>1000,37588=>1000,37589=>1000,37590=>1000,37591=>1000,37592=>1000,37593=>1000,37594=>1000,37595=>1000,37596=>1000,37597=>1000,37598=>1000,37599=>1000,37600=>1000,37601=>1000,37602=>1000,37603=>1000,37604=>1000,37605=>1000,37606=>1000,37607=>1000,37608=>1000,37609=>1000,37610=>1000,37611=>1000,37612=>1000,37613=>1000,37614=>1000,37615=>1000,37616=>1000,37617=>1000,37618=>1000,37619=>1000,37620=>1000,37621=>1000,37622=>1000,37623=>1000,37624=>1000,37625=>1000,37626=>1000,37627=>1000,37628=>1000,37629=>1000,37630=>1000,37631=>1000,37632=>1000,37633=>1000,37634=>1000,37635=>1000,37636=>1000,37637=>1000,37638=>1000,37639=>1000,37640=>1000,37641=>1000,37642=>1000,37643=>1000,37644=>1000,37645=>1000,37646=>1000,37647=>1000,37648=>1000,37649=>1000,37650=>1000,37651=>1000,37652=>1000,37653=>1000,37654=>1000,37655=>1000,37656=>1000,37657=>1000,37658=>1000,37659=>1000,37660=>1000,37661=>1000,37662=>1000,37663=>1000,37664=>1000,37665=>1000,37666=>1000,37667=>1000,37668=>1000,37669=>1000,37670=>1000,37671=>1000,37672=>1000,37673=>1000,37674=>1000,37675=>1000,37676=>1000,37677=>1000,37678=>1000,37679=>1000,37680=>1000,37681=>1000,37682=>1000,37683=>1000,37684=>1000,37685=>1000,37686=>1000,37687=>1000,37688=>1000,37689=>1000,37690=>1000,37691=>1000,37692=>1000,37693=>1000,37694=>1000,37695=>1000,37696=>1000,37697=>1000,37698=>1000,37699=>1000,37700=>1000,37701=>1000,37702=>1000,37703=>1000,37704=>1000,37705=>1000,37706=>1000,37707=>1000,37708=>1000,37709=>1000,37710=>1000,37711=>1000,37712=>1000,37713=>1000,37714=>1000,37715=>1000,37716=>1000,37717=>1000,37718=>1000,37719=>1000,37720=>1000,37721=>1000,37722=>1000,37723=>1000,37724=>1000,37725=>1000,37726=>1000,37727=>1000,37728=>1000,37729=>1000,37730=>1000,37731=>1000,37732=>1000,37733=>1000,37734=>1000,37735=>1000,37736=>1000,37737=>1000,37738=>1000,37739=>1000,37740=>1000,37741=>1000,37742=>1000,37743=>1000,37744=>1000,37745=>1000,37746=>1000,37747=>1000,37748=>1000,37749=>1000,37750=>1000,37751=>1000,37752=>1000,37753=>1000,37754=>1000,37755=>1000,37756=>1000,37757=>1000,37758=>1000,37759=>1000,37760=>1000,37761=>1000,37762=>1000,37763=>1000,37764=>1000,37765=>1000,37766=>1000,37767=>1000,37768=>1000,37769=>1000,37770=>1000,37771=>1000,37772=>1000,37773=>1000,37774=>1000,37775=>1000,37776=>1000,37777=>1000,37778=>1000,37779=>1000,37780=>1000,37781=>1000,37782=>1000,37783=>1000,37784=>1000,37785=>1000,37786=>1000,37787=>1000,37788=>1000,37789=>1000,37790=>1000,37791=>1000,37792=>1000,37793=>1000,37794=>1000,37795=>1000,37796=>1000,37797=>1000,37798=>1000,37799=>1000,37800=>1000,37801=>1000,37802=>1000,37803=>1000,37804=>1000,37805=>1000,37806=>1000,37807=>1000,37808=>1000,37809=>1000,37810=>1000,37811=>1000,37812=>1000,37813=>1000,37814=>1000,37815=>1000,37816=>1000,37817=>1000,37818=>1000,37819=>1000,37820=>1000,37821=>1000,37822=>1000,37823=>1000,37824=>1000,37825=>1000,37826=>1000,37827=>1000,37828=>1000,37829=>1000,37830=>1000,37831=>1000,37832=>1000,37833=>1000,37834=>1000,37835=>1000,37836=>1000,37837=>1000,37838=>1000,37839=>1000,37840=>1000,37841=>1000,37842=>1000,37843=>1000,37844=>1000,37845=>1000,37846=>1000,37847=>1000,37848=>1000,37849=>1000,37850=>1000,37851=>1000,37852=>1000,37853=>1000,37854=>1000,37855=>1000,37856=>1000,37857=>1000,37858=>1000,37859=>1000,37860=>1000,37861=>1000,37862=>1000,37863=>1000,37864=>1000,37865=>1000,37866=>1000,37867=>1000,37868=>1000,37869=>1000,37870=>1000,37871=>1000,37872=>1000,37873=>1000,37874=>1000,37875=>1000,37876=>1000,37877=>1000,37878=>1000,37879=>1000,37880=>1000,37881=>1000,37882=>1000,37883=>1000,37884=>1000,37885=>1000,37886=>1000,37887=>1000,37888=>1000,37889=>1000,37890=>1000,37891=>1000,37892=>1000,37893=>1000,37894=>1000,37895=>1000,37896=>1000,37897=>1000,37898=>1000,37899=>1000,37900=>1000,37901=>1000,37902=>1000,37903=>1000,37904=>1000,37905=>1000,37906=>1000,37907=>1000,37908=>1000,37909=>1000,37910=>1000,37911=>1000,37912=>1000,37913=>1000,37914=>1000,37915=>1000,37916=>1000,37917=>1000,37918=>1000,37919=>1000,37920=>1000,37921=>1000,37922=>1000,37923=>1000,37924=>1000,37925=>1000,37926=>1000,37927=>998,37928=>1000,37929=>1000,37930=>1000,37931=>1000,37932=>1000,37933=>1000,37934=>1000,37935=>1000,37936=>1000,37937=>1000,37938=>1000,37939=>1000,37940=>1000,37941=>1000,37942=>1000,37943=>1000,37944=>1000,37945=>1000,37946=>1000,37947=>1000,37948=>1000,37949=>1000,37950=>1000,37951=>1000,37952=>1000,37953=>1000,37954=>1000,37955=>1000,37956=>1000,37957=>1000,37958=>1000,37959=>1000,37960=>1000,37961=>1000,37962=>1000,37963=>1000,37964=>1000,37965=>1000,37966=>1000,37967=>1000,37968=>1000,37969=>1000,37970=>1000,37971=>1000,37972=>1000,37973=>1000,37974=>1000,37975=>1000,37976=>1000,37977=>1000,37978=>1000,37979=>1000,37980=>1000,37981=>1000,37982=>1000,37983=>1000,37984=>1000,37985=>1000,37986=>1000,37987=>1000,37988=>1000,37989=>1000,37990=>1000,37991=>1000,37992=>1000,37993=>1000,37994=>1000,37995=>1000,37996=>1000,37997=>1000,37998=>1000,37999=>1000,38000=>1000,38001=>1000,38002=>1000,38003=>1000,38004=>1000,38005=>1000,38006=>1000,38007=>1000,38008=>1000,38009=>1000,38010=>1000,38011=>1000,38012=>1000,38013=>1000,38014=>1000,38015=>1000,38016=>1000,38017=>1000,38018=>1000,38019=>1000,38020=>1000,38021=>1000,38022=>1000,38023=>1000,38024=>1000,38025=>1000,38026=>1000,38027=>1000,38028=>1000,38029=>1000,38030=>1000,38031=>1000,38032=>1000,38033=>1000,38034=>1000,38035=>1000,38036=>1000,38037=>1000,38038=>1000,38039=>1000,38040=>1000,38041=>1000,38042=>1000,38043=>1000,38044=>1000,38045=>1000,38046=>1000,38047=>1000,38048=>1000,38049=>1000,38050=>1000,38051=>1000,38052=>1000,38053=>1000,38054=>1000,38055=>1000,38056=>1000,38057=>1000,38058=>1000,38059=>1000,38060=>1000,38061=>1000,38062=>1000,38063=>1000,38064=>1000,38065=>1000,38066=>1000,38067=>1000,38068=>1000,38069=>1000,38070=>1000,38071=>1000,38072=>1000,38073=>1000,38074=>1000,38075=>1000,38076=>1000,38077=>1000,38078=>1000,38079=>1000,38080=>1000,38081=>1000,38082=>1000,38083=>1000,38084=>1000,38085=>1000,38086=>1000,38087=>1000,38088=>1000,38089=>1000,38090=>1000,38091=>1000,38092=>1000,38093=>1000,38094=>1000,38095=>1000,38096=>1000,38097=>1000,38098=>1000,38099=>1000,38100=>1000,38101=>1000,38102=>1000,38103=>1000,38104=>1000,38105=>1000,38106=>1000,38107=>1000,38108=>1000,38109=>1000,38110=>1000,38111=>1000,38112=>1000,38113=>1000,38114=>1000,38115=>1000,38116=>1000,38117=>1000,38118=>1000,38119=>1000,38120=>1000,38121=>1000,38122=>1000,38123=>1000,38124=>1000,38125=>1000,38126=>1000,38127=>1000,38128=>1000,38129=>1000,38130=>1000,38131=>1000,38132=>1000,38133=>1000,38134=>1000,38135=>1000,38136=>1000,38137=>1000,38138=>1000,38139=>1000,38140=>1000,38141=>1000,38142=>1000,38143=>1000,38144=>1000,38145=>1000,38146=>1000,38147=>1000,38148=>1000,38149=>1000,38150=>1000,38151=>1000,38152=>1000,38153=>1000,38154=>1000,38155=>1000,38156=>1000,38157=>1000,38158=>1000,38159=>1000,38160=>1000,38161=>1000,38162=>1000,38163=>1000,38164=>1000,38165=>1000,38166=>1000,38167=>1000,38168=>1000,38169=>1000,38170=>1000,38171=>1000,38172=>1000,38173=>1000,38174=>1000,38175=>1000,38176=>1000,38177=>1000,38178=>1000,38179=>1000,38180=>1000,38181=>1000,38182=>1000,38183=>1000,38184=>1000,38185=>1000,38186=>1000,38187=>1000,38188=>1000,38189=>1000,38190=>1000,38191=>1000,38192=>1000,38193=>1000,38194=>1000,38195=>1000,38196=>1000,38197=>1000,38198=>1000,38199=>1000,38200=>1000,38201=>1000,38202=>1000,38203=>1000,38204=>1000,38205=>1000,38206=>1000,38207=>1000,38208=>1000,38209=>1000,38210=>1000,38211=>1000,38212=>1000,38213=>1000,38214=>1000,38215=>1000,38216=>1000,38217=>1000,38218=>1000,38219=>1000,38220=>1000,38221=>1000,38222=>1000,38223=>1000,38224=>1000,38225=>1000,38226=>1000,38227=>1000,38228=>1000,38229=>1000,38230=>1000,38231=>1000,38232=>1000,38233=>1000,38234=>1000,38235=>1000,38236=>1000,38237=>1000,38238=>1000,38239=>1000,38240=>1000,38241=>1000,38242=>1000,38243=>1000,38244=>1000,38245=>1000,38246=>1000,38247=>1000,38248=>1000,38249=>1000,38250=>1000,38251=>1000,38252=>1000,38253=>1000,38254=>1000,38255=>1000,38256=>1000,38257=>1000,38258=>1000,38259=>1000,38260=>1000,38261=>1000,38262=>1000,38263=>1000,38264=>1000,38265=>1000,38266=>1000,38267=>1000,38268=>1000,38269=>1000,38270=>1000,38271=>1000,38272=>1000,38273=>1000,38274=>1000,38275=>1000,38276=>1000,38277=>1000,38278=>1000,38279=>1000,38280=>1000,38281=>1000,38282=>1000,38283=>1000,38284=>1000,38285=>1000,38286=>1000,38287=>1000,38288=>1000,38289=>1000,38290=>1000,38291=>1000,38292=>1000,38293=>1000,38294=>1000,38295=>1000,38296=>1000,38297=>1000,38298=>1000,38299=>1000,38300=>1000,38301=>1000,38302=>1000,38303=>1000,38304=>1000,38305=>1000,38306=>1000,38307=>1000,38308=>1000,38309=>1000,38310=>1000,38311=>1000,38312=>1000,38313=>1000,38314=>1000,38315=>1000,38316=>1000,38317=>1000,38318=>1000,38319=>1000,38320=>1000,38321=>1000,38322=>1000,38323=>1000,38324=>1000,38325=>1000,38326=>1000,38327=>1000,38328=>1000,38329=>1000,38330=>1000,38331=>1000,38332=>1000,38333=>1000,38334=>1000,38335=>1000,38336=>1000,38337=>1000,38338=>1000,38339=>1000,38340=>1000,38341=>1000,38342=>1000,38343=>1000,38344=>1000,38345=>1000,38346=>1000,38347=>1000,38348=>1000,38349=>1000,38350=>1000,38351=>1000,38352=>1000,38353=>1000,38354=>1000,38355=>1000,38356=>1000,38357=>1000,38358=>1000,38359=>1000,38360=>1000,38361=>1000,38362=>1000,38363=>1000,38364=>1000,38365=>1000,38366=>1000,38367=>1000,38368=>1000,38369=>1000,38370=>1000,38371=>1000,38372=>1000,38373=>1000,38374=>1000,38375=>1000,38376=>1000,38377=>1000,38378=>1000,38379=>1000,38380=>1000,38381=>1000,38382=>1000,38383=>1000,38384=>1000,38385=>1000,38386=>1000,38387=>1000,38388=>1000,38389=>1000,38390=>1000,38391=>1000,38392=>1000,38393=>1000,38394=>1000,38395=>1000,38396=>1000,38397=>1000,38398=>1000,38399=>1000,38400=>1000,38401=>1000,38402=>1000,38403=>1000,38404=>1000,38405=>1000,38406=>1000,38407=>1000,38408=>1000,38409=>1000,38410=>1000,38411=>1000,38412=>1000,38413=>1000,38414=>1000,38415=>1000,38416=>1000,38417=>1000,38418=>1000,38419=>1000,38420=>1000,38421=>1000,38422=>1000,38423=>1000,38424=>1000,38425=>1000,38426=>1000,38427=>1000,38428=>1000,38429=>1000,38430=>1000,38431=>1000,38432=>1000,38433=>1000,38434=>1000,38435=>1000,38436=>1000,38437=>1000,38438=>1000,38439=>1000,38440=>1000,38441=>1000,38442=>1000,38443=>1000,38444=>1000,38445=>1000,38446=>1000,38447=>1000,38448=>1000,38449=>1000,38450=>1000,38451=>1000,38452=>1000,38453=>1000,38454=>1000,38455=>1000,38456=>1000,38457=>1000,38458=>1000,38459=>1000,38460=>1000,38461=>1000,38462=>1000,38463=>1000,38464=>1000,38465=>1000,38466=>1000,38467=>1000,38468=>1000,38469=>1000,38470=>1000,38471=>1000,38472=>1000,38473=>1000,38474=>1000,38475=>1000,38476=>1000,38477=>1000,38478=>1000,38479=>1000,38480=>1000,38481=>1000,38482=>1000,38483=>1000,38484=>1000,38485=>1000,38486=>1000,38487=>1000,38488=>1000,38489=>1000,38490=>1000,38491=>1000,38492=>1000,38493=>1000,38494=>1000,38495=>1000,38496=>1000,38497=>1000,38498=>1000,38499=>1000,38500=>1000,38501=>1000,38502=>1000,38503=>1000,38504=>1000,38505=>1000,38506=>1000,38507=>1000,38508=>1000,38509=>1000,38510=>1000,38511=>1000,38512=>1000,38513=>1000,38514=>1000,38515=>1000,38516=>1000,38517=>1000,38518=>1000,38519=>1000,38520=>1000,38521=>1000,38522=>1000,38523=>1000,38524=>1000,38525=>1000,38526=>1000,38527=>1000,38528=>1000,38529=>1000,38530=>1000,38531=>1000,38532=>1000,38533=>1000,38534=>1000,38535=>1000,38536=>1000,38537=>1000,38538=>1000,38539=>1000,38540=>1000,38541=>1000,38542=>1000,38543=>1000,38544=>1000,38545=>1000,38546=>1000,38547=>1000,38548=>1000,38549=>1000,38550=>1000,38551=>1000,38552=>1000,38553=>1000,38554=>1000,38555=>1000,38556=>1000,38557=>1000,38558=>1000,38559=>1000,38560=>1000,38561=>1000,38562=>1000,38563=>1000,38564=>1000,38565=>1000,38566=>1000,38567=>1000,38568=>1000,38569=>1000,38570=>1000,38571=>1000,38572=>1000,38573=>1000,38574=>1000,38575=>1000,38576=>1000,38577=>1000,38578=>1000,38579=>1000,38580=>1000,38581=>1000,38582=>1000,38583=>1000,38584=>1000,38585=>1000,38586=>1000,38587=>1000,38588=>1000,38589=>1000,38590=>1000,38591=>1000,38592=>1000,38593=>1000,38594=>1000,38595=>1000,38596=>1000,38597=>1000,38598=>1000,38599=>1000,38600=>1000,38601=>1000,38602=>1000,38603=>1000,38604=>1000,38605=>1000,38606=>1000,38607=>1000,38608=>1000,38609=>1000,38610=>1000,38611=>1000,38612=>1000,38613=>1000,38614=>1000,38615=>1000,38616=>1000,38617=>1000,38618=>1000,38619=>1000,38620=>1000,38621=>1000,38622=>1000,38623=>1000,38624=>1000,38625=>1000,38626=>1000,38627=>1000,38628=>1000,38629=>1000,38630=>1000,38631=>1000,38632=>1000,38633=>1000,38634=>1000,38635=>1000,38636=>1000,38637=>1000,38638=>1000,38639=>1000,38640=>1000,38641=>1000,38642=>1000,38643=>1000,38644=>1000,38645=>1000,38646=>1000,38647=>1000,38648=>1000,38649=>1000,38650=>1000,38651=>1000,38652=>1000,38653=>1000,38654=>1000,38655=>1000,38656=>1000,38657=>1000,38658=>1000,38659=>1000,38660=>1000,38661=>1000,38662=>1000,38663=>1000,38664=>1000,38665=>1000,38666=>1000,38667=>1000,38668=>1000,38669=>1000,38670=>1000,38671=>1000,38672=>1000,38673=>1000,38674=>1000,38675=>1000,38676=>1000,38677=>1000,38678=>1000,38679=>1000,38680=>1000,38681=>1000,38682=>1000,38683=>1000,38684=>1000,38685=>1000,38686=>1000,38687=>1000,38688=>1000,38689=>1000,38690=>1000,38691=>1000,38692=>1000,38693=>1000,38694=>1000,38695=>1000,38696=>1000,38697=>1000,38698=>1000,38699=>1000,38700=>1000,38701=>1000,38702=>1000,38703=>1000,38704=>1000,38705=>1000,38706=>1000,38707=>1000,38708=>1000,38709=>1000,38710=>1000,38711=>1000,38712=>1000,38713=>1000,38714=>1000,38715=>1000,38716=>1000,38717=>1000,38718=>1000,38719=>1000,38720=>1000,38721=>1000,38722=>1000,38723=>1000,38724=>1000,38725=>1000,38726=>1000,38727=>1000,38728=>1000,38729=>1000,38730=>1000,38731=>1000,38732=>1000,38733=>1000,38734=>1000,38735=>1000,38736=>1000,38737=>1000,38738=>1000,38739=>1000,38740=>1000,38741=>1000,38742=>1000,38743=>1000,38744=>1000,38745=>1000,38746=>1000,38747=>1000,38748=>1000,38749=>1000,38750=>1000,38751=>1000,38752=>1000,38753=>1000,38754=>1000,38755=>1000,38756=>1000,38757=>1000,38758=>1000,38759=>1000,38760=>1000,38761=>1000,38762=>1000,38763=>1000,38764=>1000,38765=>1000,38766=>1000,38767=>1000,38768=>1000,38769=>1000,38770=>1000,38771=>1000,38772=>1000,38773=>1000,38774=>1000,38775=>1000,38776=>1000,38777=>1000,38778=>1000,38779=>1000,38780=>1000,38781=>1000,38782=>1000,38783=>1000,38784=>1000,38785=>1000,38786=>1000,38787=>1000,38788=>1000,38789=>1000,38790=>1000,38791=>1000,38792=>1000,38793=>1000,38794=>1000,38795=>1000,38796=>1000,38797=>1000,38798=>1000,38799=>1000,38800=>1000,38801=>1000,38802=>1000,38803=>1000,38804=>1000,38805=>1000,38806=>1000,38807=>1000,38808=>1000,38809=>1000,38810=>1000,38811=>1000,38812=>1000,38813=>1000,38814=>1000,38815=>1000,38816=>1000,38817=>1000,38818=>1000,38819=>1000,38820=>1000,38821=>1000,38822=>1000,38823=>1000,38824=>1000,38825=>1000,38826=>1000,38827=>1000,38828=>1000,38829=>1000,38830=>1000,38831=>1000,38832=>1000,38833=>1000,38834=>1000,38835=>1000,38836=>1000,38837=>1000,38838=>1000,38839=>1000,38840=>1000,38841=>1000,38842=>1000,38843=>1000,38844=>1000,38845=>1000,38846=>1000,38847=>1000,38848=>1000,38849=>1000,38850=>1000,38851=>1000,38852=>1000,38853=>1000,38854=>1000,38855=>1000,38856=>1000,38857=>1000,38858=>1000,38859=>1000,38860=>1000,38861=>1000,38862=>1000,38863=>1000,38864=>1000,38865=>1000,38866=>1000,38867=>1000,38868=>1000,38869=>1000,38870=>1000,38871=>1000,38872=>1000,38873=>1000,38874=>1000,38875=>1000,38876=>1000,38877=>1000,38878=>1000,38879=>1000,38880=>1000,38881=>1000,38882=>1000,38883=>1000,38884=>1000,38885=>1000,38886=>1000,38887=>1000,38888=>1000,38889=>1000,38890=>1000,38891=>1000,38892=>1000,38893=>1000,38894=>1000,38895=>1000,38896=>1000,38897=>1000,38898=>1000,38899=>1000,38900=>1000,38901=>1000,38902=>1000,38903=>1000,38904=>1000,38905=>1000,38906=>1000,38907=>1000,38908=>1000,38909=>1000,38910=>1000,38911=>1000,38912=>1000,38913=>1000,38914=>1000,38915=>1000,38916=>1000,38917=>1000,38918=>1000,38919=>1000,38920=>1000,38921=>1000,38922=>1000,38923=>1000,38924=>1000,38925=>1000,38926=>1000,38927=>1000,38928=>1000,38929=>1000,38930=>1000,38931=>1000,38932=>1000,38933=>1000,38934=>1000,38935=>1000,38936=>1000,38937=>1000,38938=>1000,38939=>1000,38940=>1000,38941=>1000,38942=>1000,38943=>1000,38944=>1000,38945=>1000,38946=>1000,38947=>1000,38948=>1000,38949=>1000,38950=>1000,38951=>1000,38952=>1000,38953=>1000,38954=>1000,38955=>1000,38956=>1000,38957=>1000,38958=>1000,38959=>1000,38960=>1000,38961=>1000,38962=>1000,38963=>1000,38964=>1000,38965=>1000,38966=>1000,38967=>1000,38968=>1000,38969=>1000,38970=>1000,38971=>1000,38972=>1000,38973=>1000,38974=>1000,38975=>1000,38976=>1000,38977=>1000,38978=>1000,38979=>1000,38980=>1000,38981=>1000,38982=>1000,38983=>1000,38984=>1000,38985=>1000,38986=>1000,38987=>1000,38988=>1000,38989=>1000,38990=>1000,38991=>1000,38992=>1000,38993=>1000,38994=>1000,38995=>1000,38996=>1000,38997=>1000,38998=>1000,38999=>1000,39000=>1000,39001=>1000,39002=>1000,39003=>1000,39004=>1000,39005=>1000,39006=>1000,39007=>1000,39008=>1000,39009=>1000,39010=>1000,39011=>1000,39012=>1000,39013=>1000,39014=>1000,39015=>1000,39016=>1000,39017=>1000,39018=>1000,39019=>1000,39020=>1000,39021=>1000,39022=>1000,39023=>1000,39024=>1000,39025=>1000,39026=>1000,39027=>1000,39028=>1000,39029=>1000,39030=>1000,39031=>1000,39032=>1000,39033=>1000,39034=>1000,39035=>1000,39036=>1000,39037=>1000,39038=>1000,39039=>1000,39040=>1000,39041=>1000,39042=>1000,39043=>1000,39044=>1000,39045=>1000,39046=>1000,39047=>1000,39048=>1000,39049=>1000,39050=>1000,39051=>1000,39052=>1000,39053=>1000,39054=>1000,39055=>1000,39056=>1000,39057=>1000,39058=>1000,39059=>1000,39060=>1000,39061=>1000,39062=>1000,39063=>1000,39064=>1000,39065=>1000,39066=>1000,39067=>1000,39068=>1000,39069=>1000,39070=>1000,39071=>1000,39072=>1000,39073=>1000,39074=>1000,39075=>1000,39076=>1000,39077=>1000,39078=>1000,39079=>1000,39080=>1000,39081=>1000,39082=>1000,39083=>1000,39084=>1000,39085=>1000,39086=>1000,39087=>1000,39088=>1000,39089=>1000,39090=>1000,39091=>1000,39092=>1000,39093=>1000,39094=>1000,39095=>1000,39096=>1000,39097=>1000,39098=>1000,39099=>1000,39100=>1000,39101=>1000,39102=>1000,39103=>1000,39104=>1000,39105=>1000,39106=>1000,39107=>1000,39108=>1000,39109=>1000,39110=>1000,39111=>1000,39112=>1000,39113=>1000,39114=>1000,39115=>1000,39116=>1000,39117=>1000,39118=>1000,39119=>1000,39120=>1000,39121=>1000,39122=>1000,39123=>1000,39124=>1000,39125=>1000,39126=>1000,39127=>1000,39128=>1000,39129=>1000,39130=>1000,39131=>1000,39132=>1000,39133=>1000,39134=>1000,39135=>1000,39136=>1000,39137=>1000,39138=>1000,39139=>1000,39140=>1000,39141=>1000,39142=>1000,39143=>1000,39144=>1000,39145=>1000,39146=>1000,39147=>1000,39148=>1000,39149=>1000,39150=>1000,39151=>1000,39152=>1000,39153=>1000,39154=>1000,39155=>1000,39156=>1000,39157=>1000,39158=>1000,39159=>1000,39160=>1000,39161=>1000,39162=>1000,39163=>1000,39164=>1000,39165=>1000,39166=>1000,39167=>1000,39168=>1000,39169=>1000,39170=>1000,39171=>1000,39172=>1000,39173=>1000,39174=>1000,39175=>1000,39176=>1000,39177=>1000,39178=>1000,39179=>1000,39180=>1000,39181=>1000,39182=>1000,39183=>1000,39184=>1000,39185=>1000,39186=>1000,39187=>1000,39188=>1000,39189=>1000,39190=>1000,39191=>1000,39192=>1000,39193=>1000,39194=>1000,39195=>1000,39196=>1000,39197=>1000,39198=>1000,39199=>1000,39200=>1000,39201=>1000,39202=>1000,39203=>1000,39204=>1000,39205=>1000,39206=>1000,39207=>1000,39208=>1000,39209=>1000,39210=>1000,39211=>1000,39212=>1000,39213=>1000,39214=>1000,39215=>1000,39216=>1000,39217=>1000,39218=>1000,39219=>1000,39220=>1000,39221=>1000,39222=>1000,39223=>1000,39224=>1000,39225=>1000,39226=>1000,39227=>1000,39228=>1000,39229=>1000,39230=>1000,39231=>1000,39232=>1000,39233=>1000,39234=>1000,39235=>1000,39236=>1000,39237=>1000,39238=>1000,39239=>1000,39240=>1000,39241=>1000,39242=>1000,39243=>1000,39244=>1000,39245=>1000,39246=>1000,39247=>1000,39248=>1000,39249=>1000,39250=>1000,39251=>1000,39252=>1000,39253=>1000,39254=>1000,39255=>1000,39256=>1000,39257=>1000,39258=>1000,39259=>1000,39260=>1000,39261=>1000,39262=>1000,39263=>1000,39264=>1000,39265=>1000,39266=>1000,39267=>1000,39268=>1000,39269=>1000,39270=>1000,39271=>1000,39272=>1000,39273=>1000,39274=>1000,39275=>1000,39276=>1000,39277=>1000,39278=>1000,39279=>1000,39280=>1000,39281=>1000,39282=>1000,39283=>1000,39284=>1000,39285=>1000,39286=>1000,39287=>1000,39288=>1000,39289=>1000,39290=>1000,39291=>1000,39292=>1000,39293=>1000,39294=>1000,39295=>1000,39296=>1000,39297=>1000,39298=>1000,39299=>1000,39300=>1000,39301=>1000,39302=>1000,39303=>1000,39304=>1000,39305=>1000,39306=>1000,39307=>1000,39308=>1000,39309=>1000,39310=>1000,39311=>1000,39312=>1000,39313=>1000,39314=>1000,39315=>1000,39316=>1000,39317=>1000,39318=>1000,39319=>1000,39320=>1000,39321=>1000,39322=>1000,39323=>1000,39324=>1000,39325=>1000,39326=>1000,39327=>1000,39328=>1000,39329=>1000,39330=>1000,39331=>1000,39332=>1000,39333=>1000,39334=>1000,39335=>1000,39336=>1000,39337=>1000,39338=>1000,39339=>1000,39340=>1000,39341=>1000,39342=>1000,39343=>1000,39344=>1000,39345=>1000,39346=>1000,39347=>1000,39348=>1000,39349=>1000,39350=>1000,39351=>1000,39352=>1000,39353=>1000,39354=>1000,39355=>1000,39356=>1000,39357=>1000,39358=>1000,39359=>1000,39360=>1000,39361=>1000,39362=>1000,39363=>1000,39364=>1000,39365=>1000,39366=>1000,39367=>1000,39368=>1000,39369=>1000,39370=>1000,39371=>1000,39372=>1000,39373=>1000,39374=>1000,39375=>1000,39376=>1000,39377=>1000,39378=>1000,39379=>1000,39380=>1000,39381=>1000,39382=>1000,39383=>1000,39384=>1000,39385=>1000,39386=>1000,39387=>1000,39388=>1000,39389=>1000,39390=>1000,39391=>1000,39392=>1000,39393=>1000,39394=>1000,39395=>1000,39396=>1000,39397=>1000,39398=>1000,39399=>1000,39400=>1000,39401=>1000,39402=>1000,39403=>1000,39404=>1000,39405=>1000,39406=>1000,39407=>1000,39408=>1000,39409=>1000,39410=>1000,39411=>1000,39412=>1000,39413=>1000,39414=>1000,39415=>1000,39416=>1000,39417=>1000,39418=>1000,39419=>1000,39420=>1000,39421=>1000,39422=>1000,39423=>1000,39424=>1000,39425=>1000,39426=>1000,39427=>1000,39428=>1000,39429=>1000,39430=>1000,39431=>1000,39432=>1000,39433=>1000,39434=>1000,39435=>1000,39436=>1000,39437=>1000,39438=>1000,39439=>1000,39440=>1000,39441=>1000,39442=>1000,39443=>1000,39444=>1000,39445=>1000,39446=>1000,39447=>1000,39448=>1000,39449=>1000,39450=>1000,39451=>1000,39452=>1000,39453=>1000,39454=>1000,39455=>1000,39456=>1000,39457=>1000,39458=>1000,39459=>1000,39460=>1000,39461=>1000,39462=>1000,39463=>1000,39464=>1000,39465=>1000,39466=>1000,39467=>1000,39468=>1000,39469=>1000,39470=>1000,39471=>1000,39472=>1000,39473=>1000,39474=>1000,39475=>1000,39476=>1000,39477=>1000,39478=>1000,39479=>1000,39480=>1000,39481=>1000,39482=>1000,39483=>1000,39484=>1000,39485=>1000,39486=>1000,39487=>1000,39488=>1000,39489=>1000,39490=>1000,39491=>1000,39492=>1000,39493=>1000,39494=>1000,39495=>1000,39496=>1000,39497=>1000,39498=>1000,39499=>1000,39500=>1000,39501=>1000,39502=>1000,39503=>1000,39504=>1000,39505=>1000,39506=>1000,39507=>1000,39508=>1000,39509=>1000,39510=>1000,39511=>1000,39512=>1000,39513=>1000,39514=>1000,39515=>1000,39516=>1000,39517=>1000,39518=>1000,39519=>1000,39520=>1000,39521=>1000,39522=>1000,39523=>1000,39524=>1000,39525=>1000,39526=>1000,39527=>1000,39528=>1000,39529=>1000,39530=>1000,39531=>1000,39532=>1000,39533=>1000,39534=>1000,39535=>1000,39536=>1000,39537=>1000,39538=>1000,39539=>1000,39540=>1000,39541=>1000,39542=>1000,39543=>1000,39544=>1000,39545=>1000,39546=>1000,39547=>1000,39548=>1000,39549=>1000,39550=>1000,39551=>1000,39552=>1000,39553=>1000,39554=>1000,39555=>1000,39556=>1000,39557=>1000,39558=>1000,39559=>1000,39560=>1000,39561=>1000,39562=>1000,39563=>1000,39564=>1000,39565=>1000,39566=>1000,39567=>1000,39568=>1000,39569=>1000,39570=>1000,39571=>1000,39572=>1000,39573=>1000,39574=>1000,39575=>1000,39576=>1000,39577=>1000,39578=>1000,39579=>1000,39580=>1000,39581=>1000,39582=>1000,39583=>1000,39584=>1000,39585=>1000,39586=>1000,39587=>1000,39588=>1000,39589=>1000,39590=>1000,39591=>1000,39592=>1000,39593=>1000,39594=>1000,39595=>1000,39596=>1000,39597=>1000,39598=>1000,39599=>1000,39600=>1000,39601=>1000,39602=>1000,39603=>1000,39604=>1000,39605=>1000,39606=>1000,39607=>1000,39608=>1000,39609=>1000,39610=>1000,39611=>1000,39612=>1000,39613=>1000,39614=>1000,39615=>1000,39616=>1000,39617=>1000,39618=>1000,39619=>1000,39620=>1000,39621=>1000,39622=>1000,39623=>1000,39624=>1000,39625=>1000,39626=>1000,39627=>1000,39628=>1000,39629=>1000,39630=>1000,39631=>1000,39632=>1000,39633=>1000,39634=>1000,39635=>1000,39636=>1000,39637=>1000,39638=>1000,39639=>1000,39640=>1000,39641=>1000,39642=>1000,39643=>1000,39644=>1000,39645=>1000,39646=>1000,39647=>1000,39648=>1000,39649=>1000,39650=>1000,39651=>1000,39652=>1000,39653=>1000,39654=>1000,39655=>1000,39656=>1000,39657=>1000,39658=>1000,39659=>1000,39660=>1000,39661=>1000,39662=>1000,39663=>1000,39664=>1000,39665=>1000,39666=>1000,39667=>1000,39668=>1000,39669=>1000,39670=>1000,39671=>1000,39672=>1000,39673=>1000,39674=>1000,39675=>1000,39676=>1000,39677=>1000,39678=>1000,39679=>1000,39680=>1000,39681=>1000,39682=>1000,39683=>1000,39684=>1000,39685=>1000,39686=>1000,39687=>1000,39688=>1000,39689=>1000,39690=>1000,39691=>1000,39692=>1000,39693=>1000,39694=>1000,39695=>1000,39696=>1000,39697=>1000,39698=>1000,39699=>1000,39700=>1000,39701=>1000,39702=>1000,39703=>1000,39704=>1000,39705=>1000,39706=>1000,39707=>1000,39708=>1000,39709=>1000,39710=>1000,39711=>1000,39712=>1000,39713=>1000,39714=>1000,39715=>1000,39716=>1000,39717=>1000,39718=>1000,39719=>1000,39720=>1000,39721=>1000,39722=>1000,39723=>1000,39724=>1000,39725=>1000,39726=>1000,39727=>1000,39728=>1000,39729=>1000,39730=>1000,39731=>1000,39732=>1000,39733=>1000,39734=>1000,39735=>1000,39736=>1000,39737=>1000,39738=>1000,39739=>1000,39740=>1000,39741=>1000,39742=>1000,39743=>1000,39744=>1000,39745=>1000,39746=>1000,39747=>1000,39748=>1000,39749=>1000,39750=>1000,39751=>1000,39752=>1000,39753=>1000,39754=>1000,39755=>1000,39756=>1000,39757=>1000,39758=>1000,39759=>1000,39760=>1000,39761=>1000,39762=>1000,39763=>1000,39764=>1000,39765=>1000,39766=>1000,39767=>1000,39768=>1000,39769=>1000,39770=>1000,39771=>1000,39772=>1000,39773=>1000,39774=>1000,39775=>1000,39776=>1000,39777=>1000,39778=>1000,39779=>1000,39780=>1000,39781=>1000,39782=>1000,39783=>1000,39784=>1000,39785=>1000,39786=>1000,39787=>1000,39788=>1000,39789=>1000,39790=>1000,39791=>1000,39792=>1000,39793=>1000,39794=>1000,39795=>1000,39796=>1000,39797=>1000,39798=>1000,39799=>1000,39800=>1000,39801=>1000,39802=>1000,39803=>1000,39804=>1000,39805=>1000,39806=>1000,39807=>1000,39808=>1000,39809=>1000,39810=>1000,39811=>1000,39812=>1000,39813=>1000,39814=>1000,39815=>1000,39816=>1000,39817=>1000,39818=>1000,39819=>1000,39820=>1000,39821=>1000,39822=>1000,39823=>1000,39824=>1000,39825=>1000,39826=>1000,39827=>1000,39828=>1000,39829=>1000,39830=>1000,39831=>1000,39832=>1000,39833=>1000,39834=>1000,39835=>1000,39836=>1000,39837=>1000,39838=>1000,39839=>1000,39840=>1000,39841=>1000,39842=>1000,39843=>1000,39844=>1000,39845=>1000,39846=>1000,39847=>1000,39848=>1000,39849=>1000,39850=>1000,39851=>1000,39852=>1000,39853=>1000,39854=>1000,39855=>1000,39856=>1000,39857=>1000,39858=>1000,39859=>1000,39860=>1000,39861=>1000,39862=>1000,39863=>1000,39864=>1000,39865=>1000,39866=>1000,39867=>1000,39868=>1000,39869=>1000,39870=>1000,39871=>1000,39872=>1000,39873=>1000,39874=>1000,39875=>1000,39876=>1000,39877=>1000,39878=>1000,39879=>1000,39880=>1000,39881=>1000,39882=>1000,39883=>1000,39884=>1000,39885=>1000,39886=>1000,39887=>1000,39888=>1000,39889=>1000,39890=>1000,39891=>1000,39892=>1000,39893=>1000,39894=>1000,39895=>1000,39896=>1000,39897=>1000,39898=>1000,39899=>1000,39900=>1000,39901=>1000,39902=>1000,39903=>1000,39904=>1000,39905=>1000,39906=>1000,39907=>1000,39908=>1000,39909=>1000,39910=>1000,39911=>1000,39912=>1000,39913=>1000,39914=>1000,39915=>1000,39916=>1000,39917=>1000,39918=>1000,39919=>1000,39920=>1000,39921=>1000,39922=>1000,39923=>1000,39924=>1000,39925=>1000,39926=>1000,39927=>1000,39928=>1000,39929=>1000,39930=>1000,39931=>1000,39932=>1000,39933=>1000,39934=>1000,39935=>1000,39936=>1000,39937=>1000,39938=>1000,39939=>1000,39940=>1000,39941=>1000,39942=>1000,39943=>1000,39944=>1000,39945=>1000,39946=>1000,39947=>1000,39948=>1000,39949=>1000,39950=>1000,39951=>1000,39952=>1000,39953=>1000,39954=>1000,39955=>1000,39956=>1000,39957=>1000,39958=>1000,39959=>1000,39960=>1000,39961=>1000,39962=>1000,39963=>1000,39964=>1000,39965=>1000,39966=>1000,39967=>1000,39968=>1000,39969=>1000,39970=>1000,39971=>1000,39972=>1000,39973=>1000,39974=>1000,39975=>1000,39976=>1000,39977=>1000,39978=>1000,39979=>1000,39980=>1000,39981=>1000,39982=>1000,39983=>1000,39984=>1000,39985=>1000,39986=>1000,39987=>1000,39988=>1000,39989=>1000,39990=>1000,39991=>1000,39992=>1000,39993=>1000,39994=>1000,39995=>1000,39996=>1000,39997=>1000,39998=>1000,39999=>1000,40000=>1000,40001=>1000,40002=>1000,40003=>1000,40004=>1000,40005=>1000,40006=>1000,40007=>1000,40008=>1000,40009=>1000,40010=>1000,40011=>1000,40012=>1000,40013=>1000,40014=>1000,40015=>1000,40016=>1000,40017=>1000,40018=>1000,40019=>1000,40020=>1000,40021=>1000,40022=>1000,40023=>1000,40024=>1000,40025=>1000,40026=>1000,40027=>1000,40028=>1000,40029=>1000,40030=>1000,40031=>1000,40032=>1000,40033=>1000,40034=>1000,40035=>1000,40036=>1000,40037=>1000,40038=>1000,40039=>1000,40040=>1000,40041=>1000,40042=>1000,40043=>1000,40044=>1000,40045=>1000,40046=>1000,40047=>1000,40048=>1000,40049=>1000,40050=>1000,40051=>1000,40052=>1000,40053=>1000,40054=>1000,40055=>1000,40056=>1000,40057=>1000,40058=>1000,40059=>1000,40060=>1000,40061=>1000,40062=>1000,40063=>1000,40064=>1000,40065=>1000,40066=>1000,40067=>1000,40068=>1000,40069=>1000,40070=>1000,40071=>1000,40072=>1000,40073=>1000,40074=>1000,40075=>1000,40076=>1000,40077=>1000,40078=>1000,40079=>1000,40080=>1000,40081=>1000,40082=>1000,40083=>1000,40084=>1000,40085=>1000,40086=>1000,40087=>1000,40088=>1000,40089=>1000,40090=>1000,40091=>1000,40092=>1000,40093=>1000,40094=>1000,40095=>1000,40096=>1000,40097=>1000,40098=>1000,40099=>1000,40100=>1000,40101=>1000,40102=>1000,40103=>1000,40104=>1000,40105=>1000,40106=>1000,40107=>1000,40108=>1000,40109=>1000,40110=>1000,40111=>1000,40112=>1000,40113=>1000,40114=>1000,40115=>1000,40116=>1000,40117=>1000,40118=>1000,40119=>1000,40120=>1000,40121=>1000,40122=>1000,40123=>1000,40124=>1000,40125=>1000,40126=>1000,40127=>1000,40128=>1000,40129=>1000,40130=>1000,40131=>1000,40132=>1000,40133=>1000,40134=>1000,40135=>1000,40136=>1000,40137=>1000,40138=>1000,40139=>1000,40140=>1000,40141=>1000,40142=>1000,40143=>1000,40144=>1000,40145=>1000,40146=>1000,40147=>1000,40148=>1000,40149=>1000,40150=>1000,40151=>1000,40152=>1000,40153=>1000,40154=>1000,40155=>1000,40156=>1000,40157=>1000,40158=>1000,40159=>1000,40160=>1000,40161=>1000,40162=>1000,40163=>1000,40164=>1000,40165=>1000,40166=>1000,40167=>1000,40168=>1000,40169=>1000,40170=>1000,40171=>1000,40172=>1000,40173=>1000,40174=>1000,40175=>1000,40176=>1000,40177=>1000,40178=>1000,40179=>1000,40180=>1000,40181=>1000,40182=>1000,40183=>1000,40184=>1000,40185=>1000,40186=>1000,40187=>1000,40188=>1000,40189=>1000,40190=>1000,40191=>1000,40192=>1000,40193=>1000,40194=>1000,40195=>1000,40196=>1000,40197=>1000,40198=>1000,40199=>1000,40200=>1000,40201=>1000,40202=>1000,40203=>1000,40204=>1000,40205=>1000,40206=>1000,40207=>1000,40208=>1000,40209=>1000,40210=>1000,40211=>1000,40212=>1000,40213=>1000,40214=>1000,40215=>1000,40216=>1000,40217=>1000,40218=>1000,40219=>1000,40220=>1000,40221=>1000,40222=>1000,40223=>1000,40224=>1000,40225=>1000,40226=>1000,40227=>1000,40228=>1000,40229=>1000,40230=>1000,40231=>1000,40232=>1000,40233=>1000,40234=>1000,40235=>1000,40236=>1000,40237=>1000,40238=>1000,40239=>1000,40240=>1000,40241=>1000,40242=>1000,40243=>1000,40244=>1000,40245=>1000,40246=>1000,40247=>1000,40248=>1000,40249=>1000,40250=>1000,40251=>1000,40252=>1000,40253=>1000,40254=>1000,40255=>1000,40256=>1000,40257=>1000,40258=>1000,40259=>1000,40260=>1000,40261=>1000,40262=>1000,40263=>1000,40264=>1000,40265=>1000,40266=>1000,40267=>1000,40268=>1000,40269=>1000,40270=>1000,40271=>1000,40272=>1000,40273=>1000,40274=>1000,40275=>1000,40276=>1000,40277=>1000,40278=>1000,40279=>1000,40280=>1000,40281=>1000,40282=>1000,40283=>1000,40284=>1000,40285=>1000,40286=>1000,40287=>1000,40288=>1000,40289=>1000,40290=>1000,40291=>1000,40292=>1000,40293=>1000,40294=>1000,40295=>1000,40296=>1000,40297=>1000,40298=>1000,40299=>1000,40300=>1000,40301=>1000,40302=>1000,40303=>1000,40304=>1000,40305=>1000,40306=>1000,40307=>1000,40308=>1000,40309=>1000,40310=>1000,40311=>1000,40312=>1000,40313=>1000,40314=>1000,40315=>1000,40316=>1000,40317=>1000,40318=>1000,40319=>1000,40320=>1000,40321=>1000,40322=>1000,40323=>1000,40324=>1000,40325=>1000,40326=>1000,40327=>1000,40328=>1000,40329=>1000,40330=>1000,40331=>1000,40332=>1000,40333=>1000,40334=>1000,40335=>1000,40336=>1000,40337=>1000,40338=>1000,40339=>1000,40340=>1000,40341=>1000,40342=>1000,40343=>1000,40344=>1000,40345=>1000,40346=>1000,40347=>1000,40348=>1000,40349=>1000,40350=>1000,40351=>1000,40352=>1000,40353=>1000,40354=>1000,40355=>1000,40356=>1000,40357=>1000,40358=>1000,40359=>1000,40360=>1000,40361=>1000,40362=>1000,40363=>1000,40364=>1000,40365=>1000,40366=>1000,40367=>1000,40368=>1000,40369=>1000,40370=>1000,40371=>1000,40372=>1000,40373=>1000,40374=>1000,40375=>1000,40376=>1000,40377=>1000,40378=>1000,40379=>1000,40380=>1000,40381=>1000,40382=>1000,40383=>1000,40384=>1000,40385=>1000,40386=>1000,40387=>1000,40388=>1000,40389=>1000,40390=>1000,40391=>1000,40392=>1000,40393=>1000,40394=>1000,40395=>1000,40396=>1000,40397=>1000,40398=>1000,40399=>1000,40400=>1000,40401=>1000,40402=>1000,40403=>1000,40404=>1000,40405=>1000,40406=>1000,40407=>1000,40408=>1000,40409=>1000,40410=>1000,40411=>1000,40412=>1000,40413=>1000,40414=>1000,40415=>1000,40416=>1000,40417=>1000,40418=>1000,40419=>1000,40420=>1000,40421=>1000,40422=>1000,40423=>1000,40424=>1000,40425=>1000,40426=>1000,40427=>1000,40428=>1000,40429=>1000,40430=>1000,40431=>1000,40432=>1000,40433=>1000,40434=>1000,40435=>1000,40436=>1000,40437=>1000,40438=>1000,40439=>1000,40440=>1000,40441=>1000,40442=>1000,40443=>1000,40444=>1000,40445=>1000,40446=>1000,40447=>1000,40448=>1000,40449=>1000,40450=>1000,40451=>1000,40452=>1000,40453=>1000,40454=>1000,40455=>1000,40456=>1000,40457=>1000,40458=>1000,40459=>1000,40460=>1000,40461=>1000,40462=>1000,40463=>1000,40464=>1000,40465=>1000,40466=>1000,40467=>1000,40468=>1000,40469=>1000,40470=>1000,40471=>1000,40472=>1000,40473=>1000,40474=>1000,40475=>1000,40476=>1000,40477=>1000,40478=>1000,40479=>1000,40480=>1000,40481=>1000,40482=>1000,40483=>1000,40484=>1000,40485=>1000,40486=>1000,40487=>1000,40488=>1000,40489=>1000,40490=>1000,40491=>1000,40492=>1000,40493=>1000,40494=>1000,40495=>1000,40496=>1000,40497=>1000,40498=>1000,40499=>1000,40500=>1000,40501=>1000,40502=>1000,40503=>1000,40504=>1000,40505=>1000,40506=>1000,40507=>1000,40508=>1000,40509=>1000,40510=>1000,40511=>1000,40512=>1000,40513=>1000,40514=>1000,40515=>1000,40516=>1000,40517=>1000,40518=>1000,40519=>1000,40520=>1000,40521=>1000,40522=>1000,40523=>1000,40524=>1000,40525=>1000,40526=>1000,40527=>1000,40528=>1000,40529=>1000,40530=>1000,40531=>1000,40532=>1000,40533=>1000,40534=>1000,40535=>1000,40536=>1000,40537=>1000,40538=>1000,40539=>1000,40540=>1000,40541=>1000,40542=>1000,40543=>1000,40544=>1000,40545=>1000,40546=>1000,40547=>1000,40548=>1000,40549=>1000,40550=>1000,40551=>1000,40552=>1000,40553=>1000,40554=>1000,40555=>1000,40556=>1000,40557=>1000,40558=>1000,40559=>1000,40560=>1000,40561=>1000,40562=>1000,40563=>1000,40564=>1000,40565=>1000,40566=>1000,40567=>1000,40568=>1000,40569=>1000,40570=>1000,40571=>1000,40572=>1000,40573=>1000,40574=>1000,40575=>1000,40576=>1000,40577=>1000,40578=>1000,40579=>1000,40580=>1000,40581=>1000,40582=>1000,40583=>1000,40584=>1000,40585=>1000,40586=>1000,40587=>1000,40588=>1000,40589=>1000,40590=>1000,40591=>1000,40592=>1000,40593=>1000,40594=>1000,40595=>1000,40596=>1000,40597=>1000,40598=>1000,40599=>1000,40600=>1000,40601=>1000,40602=>1000,40603=>1000,40604=>1000,40605=>1000,40606=>1000,40607=>1000,40608=>1000,40609=>1000,40610=>1000,40611=>1000,40612=>1000,40613=>1000,40614=>1000,40615=>1000,40616=>1000,40617=>1000,40618=>1000,40619=>1000,40620=>1000,40621=>1000,40622=>1000,40623=>1000,40624=>1000,40625=>1000,40626=>1000,40627=>1000,40628=>1000,40629=>1000,40630=>1000,40631=>1000,40632=>1000,40633=>1000,40634=>1000,40635=>1000,40636=>1000,40637=>1000,40638=>1000,40639=>1000,40640=>1000,40641=>1000,40642=>1000,40643=>1000,40644=>1000,40645=>1000,40646=>1000,40647=>1000,40648=>1000,40649=>1000,40650=>1000,40651=>1000,40652=>1000,40653=>1000,40654=>1000,40655=>1000,40656=>1000,40657=>1000,40658=>1000,40659=>1000,40660=>1000,40661=>1000,40662=>1000,40663=>1000,40664=>1000,40665=>1000,40666=>1000,40667=>1000,40668=>1000,40669=>1000,40670=>1000,40671=>1000,40672=>1000,40673=>1000,40674=>1000,40675=>1000,40676=>1000,40677=>1000,40678=>1000,40679=>1000,40680=>1000,40681=>1000,40682=>1000,40683=>1000,40684=>1000,40685=>1000,40686=>1000,40687=>1000,40688=>1000,40689=>1000,40690=>1000,40691=>1000,40692=>1000,40693=>1000,40694=>1000,40695=>1000,40696=>1000,40697=>1000,40698=>1000,40699=>1000,40700=>1000,40701=>1000,40702=>1000,40703=>1000,40704=>1000,40705=>1000,40706=>1000,40707=>1000,40708=>1000,40709=>1000,40710=>1000,40711=>1000,40712=>1000,40713=>1000,40714=>1000,40715=>1000,40716=>1000,40717=>1000,40718=>1000,40719=>1000,40720=>1000,40721=>1000,40722=>1000,40723=>1000,40724=>1000,40725=>1000,40726=>1000,40727=>1000,40728=>1000,40729=>1000,40730=>1000,40731=>1000,40732=>1000,40733=>1000,40734=>1000,40735=>1000,40736=>1000,40737=>1000,40738=>1000,40739=>1000,40740=>1000,40741=>1000,40742=>1000,40743=>1000,40744=>1000,40745=>1000,40746=>1000,40747=>1000,40748=>1000,40749=>1000,40750=>1000,40751=>1000,40752=>1000,40753=>1000,40754=>1000,40755=>1000,40756=>1000,40757=>1000,40758=>1000,40759=>1000,40760=>1000,40761=>1000,40762=>1000,40763=>1000,40764=>1000,40765=>1000,40766=>1000,40767=>1000,40768=>1000,40769=>1000,40770=>1000,40771=>1000,40772=>1000,40773=>1000,40774=>1000,40775=>1000,40776=>1000,40777=>1000,40778=>1000,40779=>1000,40780=>1000,40781=>1000,40782=>1000,40783=>1000,40784=>1000,40785=>1000,40786=>1000,40787=>1000,40788=>1000,40789=>1000,40790=>1000,40791=>1000,40792=>1000,40793=>1000,40794=>1000,40795=>1000,40796=>1000,40797=>1000,40798=>1000,40799=>1000,40800=>1000,40801=>1000,40802=>1000,40803=>1000,40804=>1000,40805=>1000,40806=>1000,40807=>1000,40808=>1000,40809=>1000,40810=>1000,40811=>1000,40812=>1000,40813=>1000,40814=>1000,40815=>1000,40816=>1000,40817=>1000,40818=>1000,40819=>1000,40820=>1000,40821=>1000,40822=>1000,40823=>1000,40824=>1000,40825=>1000,40826=>1000,40827=>1000,40828=>1000,40829=>1000,40830=>1000,40831=>1000,40832=>1000,40833=>1000,40834=>1000,40835=>1000,40836=>1000,40837=>1000,40838=>1000,40839=>1000,40840=>1000,40841=>1000,40842=>1000,40843=>1000,40844=>1000,40845=>1000,40846=>1000,40847=>1000,40848=>1000,40849=>1000,40850=>1000,40851=>1000,40852=>1000,40853=>1000,40854=>1000,40855=>1000,40856=>1000,40857=>1000,40858=>1000,40859=>1000,40860=>1000,40861=>1000,40862=>1000,40863=>1000,40864=>1000,40865=>1000,40866=>1000,40867=>1000,40868=>1000,40869=>1000,44032=>1000,44033=>1000,44034=>1000,44035=>1000,44036=>1000,44037=>1000,44038=>1000,44039=>1000,44040=>1000,44041=>1000,44042=>1000,44043=>1000,44044=>1000,44045=>1000,44046=>1000,44047=>1000,44048=>1000,44049=>1000,44050=>1000,44051=>1000,44052=>1000,44053=>1000,44054=>1000,44055=>1000,44056=>1000,44057=>1000,44058=>1000,44059=>1000,44060=>1000,44061=>1000,44062=>1000,44063=>1000,44064=>1000,44065=>1000,44066=>1000,44067=>1000,44068=>1000,44069=>1000,44070=>1000,44071=>1000,44072=>1000,44073=>1000,44074=>1000,44075=>1000,44076=>1000,44077=>1000,44078=>1000,44079=>1000,44080=>1000,44081=>1000,44082=>1000,44083=>1000,44084=>1000,44085=>1000,44086=>1000,44087=>1000,44088=>1000,44089=>1000,44090=>1000,44091=>1000,44092=>1000,44093=>1000,44094=>1000,44095=>1000,44096=>1000,44097=>1000,44098=>1000,44099=>1000,44100=>1000,44101=>1000,44102=>1000,44103=>1000,44104=>1000,44105=>1000,44106=>1000,44107=>1000,44108=>1000,44109=>1000,44110=>1000,44111=>1000,44112=>1000,44113=>1000,44114=>1000,44115=>1000,44116=>1000,44117=>1000,44118=>1000,44119=>1000,44120=>1000,44121=>1000,44122=>1000,44123=>1000,44124=>1000,44125=>1000,44126=>1000,44127=>1000,44128=>1000,44129=>1000,44130=>1000,44131=>1000,44132=>1000,44133=>1000,44134=>1000,44135=>1000,44136=>1000,44137=>1000,44138=>1000,44139=>1000,44140=>1000,44141=>1000,44142=>1000,44143=>1000,44144=>1000,44145=>1000,44146=>1000,44147=>1000,44148=>1000,44149=>1000,44150=>1000,44151=>1000,44152=>1000,44153=>1000,44154=>1000,44155=>1000,44156=>1000,44157=>1000,44158=>1000,44159=>1000,44160=>1000,44161=>1000,44162=>1000,44163=>1000,44164=>1000,44165=>1000,44166=>1000,44167=>1000,44168=>1000,44169=>1000,44170=>1000,44171=>1000,44172=>1000,44173=>1000,44174=>1000,44175=>1000,44176=>1000,44177=>1000,44178=>1000,44179=>1000,44180=>1000,44181=>1000,44182=>1000,44183=>1000,44184=>1000,44185=>1000,44186=>1000,44187=>1000,44188=>1000,44189=>1000,44190=>1000,44191=>1000,44192=>1000,44193=>1000,44194=>1000,44195=>1000,44196=>1000,44197=>1000,44198=>1000,44199=>1000,44200=>1000,44201=>1000,44202=>1000,44203=>1000,44204=>1000,44205=>1000,44206=>1000,44207=>1000,44208=>1000,44209=>1000,44210=>1000,44211=>1000,44212=>1000,44213=>1000,44214=>1000,44215=>1000,44216=>1000,44217=>1000,44218=>1000,44219=>1000,44220=>1000,44221=>1000,44222=>1000,44223=>1000,44224=>1000,44225=>1000,44226=>1000,44227=>1000,44228=>1000,44229=>1000,44230=>1000,44231=>1000,44232=>1000,44233=>1000,44234=>1000,44235=>1000,44236=>1000,44237=>1000,44238=>1000,44239=>1000,44240=>1000,44241=>1000,44242=>1000,44243=>1000,44244=>1000,44245=>1000,44246=>1000,44247=>1000,44248=>1000,44249=>1000,44250=>1000,44251=>1000,44252=>1000,44253=>1000,44254=>1000,44255=>1000,44256=>1000,44257=>1000,44258=>1000,44259=>1000,44260=>1000,44261=>1000,44262=>1000,44263=>1000,44264=>1000,44265=>1000,44266=>1000,44267=>1000,44268=>1000,44269=>1000,44270=>1000,44271=>1000,44272=>1000,44273=>1000,44274=>1000,44275=>1000,44276=>1000,44277=>1000,44278=>1000,44279=>1000,44280=>1000,44281=>1000,44282=>1000,44283=>1000,44284=>1000,44285=>1000,44286=>1000,44287=>1000,44288=>1000,44289=>1000,44290=>1000,44291=>1000,44292=>1000,44293=>1000,44294=>1000,44295=>1000,44296=>1000,44297=>1000,44298=>1000,44299=>1000,44300=>1000,44301=>1000,44302=>1000,44303=>1000,44304=>1000,44305=>1000,44306=>1000,44307=>1000,44308=>1000,44309=>1000,44310=>1000,44311=>1000,44312=>1000,44313=>1000,44314=>1000,44315=>1000,44316=>1000,44317=>1000,44318=>1000,44319=>1000,44320=>1000,44321=>1000,44322=>1000,44323=>1000,44324=>1000,44325=>1000,44326=>1000,44327=>1000,44328=>1000,44329=>1000,44330=>1000,44331=>1000,44332=>1000,44333=>1000,44334=>1000,44335=>1000,44336=>1000,44337=>1000,44338=>1000,44339=>1000,44340=>1000,44341=>1000,44342=>1000,44343=>1000,44344=>1000,44345=>1000,44346=>1000,44347=>1000,44348=>1000,44349=>1000,44350=>1000,44351=>1000,44352=>1000,44353=>1000,44354=>1000,44355=>1000,44356=>1000,44357=>1000,44358=>1000,44359=>1000,44360=>1000,44361=>1000,44362=>1000,44363=>1000,44364=>1000,44365=>1000,44366=>1000,44367=>1000,44368=>1000,44369=>1000,44370=>1000,44371=>1000,44372=>1000,44373=>1000,44374=>1000,44375=>1000,44376=>1000,44377=>1000,44378=>1000,44379=>1000,44380=>1000,44381=>1000,44382=>1000,44383=>1000,44384=>1000,44385=>1000,44386=>1000,44387=>1000,44388=>1000,44389=>1000,44390=>1000,44391=>1000,44392=>1000,44393=>1000,44394=>1000,44395=>1000,44396=>1000,44397=>1000,44398=>1000,44399=>1000,44400=>1000,44401=>1000,44402=>1000,44403=>1000,44404=>1000,44405=>1000,44406=>1000,44407=>1000,44408=>1000,44409=>1000,44410=>1000,44411=>1000,44412=>1000,44413=>1000,44414=>1000,44415=>1000,44416=>1000,44417=>1000,44418=>1000,44419=>1000,44420=>1000,44421=>1000,44422=>1000,44423=>1000,44424=>1000,44425=>1000,44426=>1000,44427=>1000,44428=>1000,44429=>1000,44430=>1000,44431=>1000,44432=>1000,44433=>1000,44434=>1000,44435=>1000,44436=>1000,44437=>1000,44438=>1000,44439=>1000,44440=>1000,44441=>1000,44442=>1000,44443=>1000,44444=>1000,44445=>1000,44446=>1000,44447=>1000,44448=>1000,44449=>1000,44450=>1000,44451=>1000,44452=>1000,44453=>1000,44454=>1000,44455=>1000,44456=>1000,44457=>1000,44458=>1000,44459=>1000,44460=>1000,44461=>1000,44462=>1000,44463=>1000,44464=>1000,44465=>1000,44466=>1000,44467=>1000,44468=>1000,44469=>1000,44470=>1000,44471=>1000,44472=>1000,44473=>1000,44474=>1000,44475=>1000,44476=>1000,44477=>1000,44478=>1000,44479=>1000,44480=>1000,44481=>1000,44482=>1000,44483=>1000,44484=>1000,44485=>1000,44486=>1000,44487=>1000,44488=>1000,44489=>1000,44490=>1000,44491=>1000,44492=>1000,44493=>1000,44494=>1000,44495=>1000,44496=>1000,44497=>1000,44498=>1000,44499=>1000,44500=>1000,44501=>1000,44502=>1000,44503=>1000,44504=>1000,44505=>1000,44506=>1000,44507=>1000,44508=>1000,44509=>1000,44510=>1000,44511=>1000,44512=>1000,44513=>1000,44514=>1000,44515=>1000,44516=>1000,44517=>1000,44518=>1000,44519=>1000,44520=>1000,44521=>1000,44522=>1000,44523=>1000,44524=>1000,44525=>1000,44526=>1000,44527=>1000,44528=>1000,44529=>1000,44530=>1000,44531=>1000,44532=>1000,44533=>1000,44534=>1000,44535=>1000,44536=>1000,44537=>1000,44538=>1000,44539=>1000,44540=>1000,44541=>1000,44542=>1000,44543=>1000,44544=>1000,44545=>1000,44546=>1000,44547=>1000,44548=>1000,44549=>1000,44550=>1000,44551=>1000,44552=>1000,44553=>1000,44554=>1000,44555=>1000,44556=>1000,44557=>1000,44558=>1000,44559=>1000,44560=>1000,44561=>1000,44562=>1000,44563=>1000,44564=>1000,44565=>1000,44566=>1000,44567=>1000,44568=>1000,44569=>1000,44570=>1000,44571=>1000,44572=>1000,44573=>1000,44574=>1000,44575=>1000,44576=>1000,44577=>1000,44578=>1000,44579=>1000,44580=>1000,44581=>1000,44582=>1000,44583=>1000,44584=>1000,44585=>1000,44586=>1000,44587=>1000,44588=>1000,44589=>1000,44590=>1000,44591=>1000,44592=>1000,44593=>1000,44594=>1000,44595=>1000,44596=>1000,44597=>1000,44598=>1000,44599=>1000,44600=>1000,44601=>1000,44602=>1000,44603=>1000,44604=>1000,44605=>1000,44606=>1000,44607=>1000,44608=>1000,44609=>1000,44610=>1000,44611=>1000,44612=>1000,44613=>1000,44614=>1000,44615=>1000,44616=>1000,44617=>1000,44618=>1000,44619=>1000,44620=>1000,44621=>1000,44622=>1000,44623=>1000,44624=>1000,44625=>1000,44626=>1000,44627=>1000,44628=>1000,44629=>1000,44630=>1000,44631=>1000,44632=>1000,44633=>1000,44634=>1000,44635=>1000,44636=>1000,44637=>1000,44638=>1000,44639=>1000,44640=>1000,44641=>1000,44642=>1000,44643=>1000,44644=>1000,44645=>1000,44646=>1000,44647=>1000,44648=>1000,44649=>1000,44650=>1000,44651=>1000,44652=>1000,44653=>1000,44654=>1000,44655=>1000,44656=>1000,44657=>1000,44658=>1000,44659=>1000,44660=>1000,44661=>1000,44662=>1000,44663=>1000,44664=>1000,44665=>1000,44666=>1000,44667=>1000,44668=>1000,44669=>1000,44670=>1000,44671=>1000,44672=>1000,44673=>1000,44674=>1000,44675=>1000,44676=>1000,44677=>1000,44678=>1000,44679=>1000,44680=>1000,44681=>1000,44682=>1000,44683=>1000,44684=>1000,44685=>1000,44686=>1000,44687=>1000,44688=>1000,44689=>1000,44690=>1000,44691=>1000,44692=>1000,44693=>1000,44694=>1000,44695=>1000,44696=>1000,44697=>1000,44698=>1000,44699=>1000,44700=>1000,44701=>1000,44702=>1000,44703=>1000,44704=>1000,44705=>1000,44706=>1000,44707=>1000,44708=>1000,44709=>1000,44710=>1000,44711=>1000,44712=>1000,44713=>1000,44714=>1000,44715=>1000,44716=>1000,44717=>1000,44718=>1000,44719=>1000,44720=>1000,44721=>1000,44722=>1000,44723=>1000,44724=>1000,44725=>1000,44726=>1000,44727=>1000,44728=>1000,44729=>1000,44730=>1000,44731=>1000,44732=>1000,44733=>1000,44734=>1000,44735=>1000,44736=>1000,44737=>1000,44738=>1000,44739=>1000,44740=>1000,44741=>1000,44742=>1000,44743=>1000,44744=>1000,44745=>1000,44746=>1000,44747=>1000,44748=>1000,44749=>1000,44750=>1000,44751=>1000,44752=>1000,44753=>1000,44754=>1000,44755=>1000,44756=>1000,44757=>1000,44758=>1000,44759=>1000,44760=>1000,44761=>1000,44762=>1000,44763=>1000,44764=>1000,44765=>1000,44766=>1000,44767=>1000,44768=>1000,44769=>1000,44770=>1000,44771=>1000,44772=>1000,44773=>1000,44774=>1000,44775=>1000,44776=>1000,44777=>1000,44778=>1000,44779=>1000,44780=>1000,44781=>1000,44782=>1000,44783=>1000,44784=>1000,44785=>1000,44786=>1000,44787=>1000,44788=>1000,44789=>1000,44790=>1000,44791=>1000,44792=>1000,44793=>1000,44794=>1000,44795=>1000,44796=>1000,44797=>1000,44798=>1000,44799=>1000,44800=>1000,44801=>1000,44802=>1000,44803=>1000,44804=>1000,44805=>1000,44806=>1000,44807=>1000,44808=>1000,44809=>1000,44810=>1000,44811=>1000,44812=>1000,44813=>1000,44814=>1000,44815=>1000,44816=>1000,44817=>1000,44818=>1000,44819=>1000,44820=>1000,44821=>1000,44822=>1000,44823=>1000,44824=>1000,44825=>1000,44826=>1000,44827=>1000,44828=>1000,44829=>1000,44830=>1000,44831=>1000,44832=>1000,44833=>1000,44834=>1000,44835=>1000,44836=>1000,44837=>1000,44838=>1000,44839=>1000,44840=>1000,44841=>1000,44842=>1000,44843=>1000,44844=>1000,44845=>1000,44846=>1000,44847=>1000,44848=>1000,44849=>1000,44850=>1000,44851=>1000,44852=>1000,44853=>1000,44854=>1000,44855=>1000,44856=>1000,44857=>1000,44858=>1000,44859=>1000,44860=>1000,44861=>1000,44862=>1000,44863=>1000,44864=>1000,44865=>1000,44866=>1000,44867=>1000,44868=>1000,44869=>1000,44870=>1000,44871=>1000,44872=>1000,44873=>1000,44874=>1000,44875=>1000,44876=>1000,44877=>1000,44878=>1000,44879=>1000,44880=>1000,44881=>1000,44882=>1000,44883=>1000,44884=>1000,44885=>1000,44886=>1000,44887=>1000,44888=>1000,44889=>1000,44890=>1000,44891=>1000,44892=>1000,44893=>1000,44894=>1000,44895=>1000,44896=>1000,44897=>1000,44898=>1000,44899=>1000,44900=>1000,44901=>1000,44902=>1000,44903=>1000,44904=>1000,44905=>1000,44906=>1000,44907=>1000,44908=>1000,44909=>1000,44910=>1000,44911=>1000,44912=>1000,44913=>1000,44914=>1000,44915=>1000,44916=>1000,44917=>1000,44918=>1000,44919=>1000,44920=>1000,44921=>1000,44922=>1000,44923=>1000,44924=>1000,44925=>1000,44926=>1000,44927=>1000,44928=>1000,44929=>1000,44930=>1000,44931=>1000,44932=>1000,44933=>1000,44934=>1000,44935=>1000,44936=>1000,44937=>1000,44938=>1000,44939=>1000,44940=>1000,44941=>1000,44942=>1000,44943=>1000,44944=>1000,44945=>1000,44946=>1000,44947=>1000,44948=>1000,44949=>1000,44950=>1000,44951=>1000,44952=>1000,44953=>1000,44954=>1000,44955=>1000,44956=>1000,44957=>1000,44958=>1000,44959=>1000,44960=>1000,44961=>1000,44962=>1000,44963=>1000,44964=>1000,44965=>1000,44966=>1000,44967=>1000,44968=>1000,44969=>1000,44970=>1000,44971=>1000,44972=>1000,44973=>1000,44974=>1000,44975=>1000,44976=>1000,44977=>1000,44978=>1000,44979=>1000,44980=>1000,44981=>1000,44982=>1000,44983=>1000,44984=>1000,44985=>1000,44986=>1000,44987=>1000,44988=>1000,44989=>1000,44990=>1000,44991=>1000,44992=>1000,44993=>1000,44994=>1000,44995=>1000,44996=>1000,44997=>1000,44998=>1000,44999=>1000,45000=>1000,45001=>1000,45002=>1000,45003=>1000,45004=>1000,45005=>1000,45006=>1000,45007=>1000,45008=>1000,45009=>1000,45010=>1000,45011=>1000,45012=>1000,45013=>1000,45014=>1000,45015=>1000,45016=>1000,45017=>1000,45018=>1000,45019=>1000,45020=>1000,45021=>1000,45022=>1000,45023=>1000,45024=>1000,45025=>1000,45026=>1000,45027=>1000,45028=>1000,45029=>1000,45030=>1000,45031=>1000,45032=>1000,45033=>1000,45034=>1000,45035=>1000,45036=>1000,45037=>1000,45038=>1000,45039=>1000,45040=>1000,45041=>1000,45042=>1000,45043=>1000,45044=>1000,45045=>1000,45046=>1000,45047=>1000,45048=>1000,45049=>1000,45050=>1000,45051=>1000,45052=>1000,45053=>1000,45054=>1000,45055=>1000,45056=>1000,45057=>1000,45058=>1000,45059=>1000,45060=>1000,45061=>1000,45062=>1000,45063=>1000,45064=>1000,45065=>1000,45066=>1000,45067=>1000,45068=>1000,45069=>1000,45070=>1000,45071=>1000,45072=>1000,45073=>1000,45074=>1000,45075=>1000,45076=>1000,45077=>1000,45078=>1000,45079=>1000,45080=>1000,45081=>1000,45082=>1000,45083=>1000,45084=>1000,45085=>1000,45086=>1000,45087=>1000,45088=>1000,45089=>1000,45090=>1000,45091=>1000,45092=>1000,45093=>1000,45094=>1000,45095=>1000,45096=>1000,45097=>1000,45098=>1000,45099=>1000,45100=>1000,45101=>1000,45102=>1000,45103=>1000,45104=>1000,45105=>1000,45106=>1000,45107=>1000,45108=>1000,45109=>1000,45110=>1000,45111=>1000,45112=>1000,45113=>1000,45114=>1000,45115=>1000,45116=>1000,45117=>1000,45118=>1000,45119=>1000,45120=>1000,45121=>1000,45122=>1000,45123=>1000,45124=>1000,45125=>1000,45126=>1000,45127=>1000,45128=>1000,45129=>1000,45130=>1000,45131=>1000,45132=>1000,45133=>1000,45134=>1000,45135=>1000,45136=>1000,45137=>1000,45138=>1000,45139=>1000,45140=>1000,45141=>1000,45142=>1000,45143=>1000,45144=>1000,45145=>1000,45146=>1000,45147=>1000,45148=>1000,45149=>1000,45150=>1000,45151=>1000,45152=>1000,45153=>1000,45154=>1000,45155=>1000,45156=>1000,45157=>1000,45158=>1000,45159=>1000,45160=>1000,45161=>1000,45162=>1000,45163=>1000,45164=>1000,45165=>1000,45166=>1000,45167=>1000,45168=>1000,45169=>1000,45170=>1000,45171=>1000,45172=>1000,45173=>1000,45174=>1000,45175=>1000,45176=>1000,45177=>1000,45178=>1000,45179=>1000,45180=>1000,45181=>1000,45182=>1000,45183=>1000,45184=>1000,45185=>1000,45186=>1000,45187=>1000,45188=>1000,45189=>1000,45190=>1000,45191=>1000,45192=>1000,45193=>1000,45194=>1000,45195=>1000,45196=>1000,45197=>1000,45198=>1000,45199=>1000,45200=>1000,45201=>1000,45202=>1000,45203=>1000,45204=>1000,45205=>1000,45206=>1000,45207=>1000,45208=>1000,45209=>1000,45210=>1000,45211=>1000,45212=>1000,45213=>1000,45214=>1000,45215=>1000,45216=>1000,45217=>1000,45218=>1000,45219=>1000,45220=>1000,45221=>1000,45222=>1000,45223=>1000,45224=>1000,45225=>1000,45226=>1000,45227=>1000,45228=>1000,45229=>1000,45230=>1000,45231=>1000,45232=>1000,45233=>1000,45234=>1000,45235=>1000,45236=>1000,45237=>1000,45238=>1000,45239=>1000,45240=>1000,45241=>1000,45242=>1000,45243=>1000,45244=>1000,45245=>1000,45246=>1000,45247=>1000,45248=>1000,45249=>1000,45250=>1000,45251=>1000,45252=>1000,45253=>1000,45254=>1000,45255=>1000,45256=>1000,45257=>1000,45258=>1000,45259=>1000,45260=>1000,45261=>1000,45262=>1000,45263=>1000,45264=>1000,45265=>1000,45266=>1000,45267=>1000,45268=>1000,45269=>1000,45270=>1000,45271=>1000,45272=>1000,45273=>1000,45274=>1000,45275=>1000,45276=>1000,45277=>1000,45278=>1000,45279=>1000,45280=>1000,45281=>1000,45282=>1000,45283=>1000,45284=>1000,45285=>1000,45286=>1000,45287=>1000,45288=>1000,45289=>1000,45290=>1000,45291=>1000,45292=>1000,45293=>1000,45294=>1000,45295=>1000,45296=>1000,45297=>1000,45298=>1000,45299=>1000,45300=>1000,45301=>1000,45302=>1000,45303=>1000,45304=>1000,45305=>1000,45306=>1000,45307=>1000,45308=>1000,45309=>1000,45310=>1000,45311=>1000,45312=>1000,45313=>1000,45314=>1000,45315=>1000,45316=>1000,45317=>1000,45318=>1000,45319=>1000,45320=>1000,45321=>1000,45322=>1000,45323=>1000,45324=>1000,45325=>1000,45326=>1000,45327=>1000,45328=>1000,45329=>1000,45330=>1000,45331=>1000,45332=>1000,45333=>1000,45334=>1000,45335=>1000,45336=>1000,45337=>1000,45338=>1000,45339=>1000,45340=>1000,45341=>1000,45342=>1000,45343=>1000,45344=>1000,45345=>1000,45346=>1000,45347=>1000,45348=>1000,45349=>1000,45350=>1000,45351=>1000,45352=>1000,45353=>1000,45354=>1000,45355=>1000,45356=>1000,45357=>1000,45358=>1000,45359=>1000,45360=>1000,45361=>1000,45362=>1000,45363=>1000,45364=>1000,45365=>1000,45366=>1000,45367=>1000,45368=>1000,45369=>1000,45370=>1000,45371=>1000,45372=>1000,45373=>1000,45374=>1000,45375=>1000,45376=>1000,45377=>1000,45378=>1000,45379=>1000,45380=>1000,45381=>1000,45382=>1000,45383=>1000,45384=>1000,45385=>1000,45386=>1000,45387=>1000,45388=>1000,45389=>1000,45390=>1000,45391=>1000,45392=>1000,45393=>1000,45394=>1000,45395=>1000,45396=>1000,45397=>1000,45398=>1000,45399=>1000,45400=>1000,45401=>1000,45402=>1000,45403=>1000,45404=>1000,45405=>1000,45406=>1000,45407=>1000,45408=>1000,45409=>1000,45410=>1000,45411=>1000,45412=>1000,45413=>1000,45414=>1000,45415=>1000,45416=>1000,45417=>1000,45418=>1000,45419=>1000,45420=>1000,45421=>1000,45422=>1000,45423=>1000,45424=>1000,45425=>1000,45426=>1000,45427=>1000,45428=>1000,45429=>1000,45430=>1000,45431=>1000,45432=>1000,45433=>1000,45434=>1000,45435=>1000,45436=>1000,45437=>1000,45438=>1000,45439=>1000,45440=>1000,45441=>1000,45442=>1000,45443=>1000,45444=>1000,45445=>1000,45446=>1000,45447=>1000,45448=>1000,45449=>1000,45450=>1000,45451=>1000,45452=>1000,45453=>1000,45454=>1000,45455=>1000,45456=>1000,45457=>1000,45458=>1000,45459=>1000,45460=>1000,45461=>1000,45462=>1000,45463=>1000,45464=>1000,45465=>1000,45466=>1000,45467=>1000,45468=>1000,45469=>1000,45470=>1000,45471=>1000,45472=>1000,45473=>1000,45474=>1000,45475=>1000,45476=>1000,45477=>1000,45478=>1000,45479=>1000,45480=>1000,45481=>1000,45482=>1000,45483=>1000,45484=>1000,45485=>1000,45486=>1000,45487=>1000,45488=>1000,45489=>1000,45490=>1000,45491=>1000,45492=>1000,45493=>1000,45494=>1000,45495=>1000,45496=>1000,45497=>1000,45498=>1000,45499=>1000,45500=>1000,45501=>1000,45502=>1000,45503=>1000,45504=>1000,45505=>1000,45506=>1000,45507=>1000,45508=>1000,45509=>1000,45510=>1000,45511=>1000,45512=>1000,45513=>1000,45514=>1000,45515=>1000,45516=>1000,45517=>1000,45518=>1000,45519=>1000,45520=>1000,45521=>1000,45522=>1000,45523=>1000,45524=>1000,45525=>1000,45526=>1000,45527=>1000,45528=>1000,45529=>1000,45530=>1000,45531=>1000,45532=>1000,45533=>1000,45534=>1000,45535=>1000,45536=>1000,45537=>1000,45538=>1000,45539=>1000,45540=>1000,45541=>1000,45542=>1000,45543=>1000,45544=>1000,45545=>1000,45546=>1000,45547=>1000,45548=>1000,45549=>1000,45550=>1000,45551=>1000,45552=>1000,45553=>1000,45554=>1000,45555=>1000,45556=>1000,45557=>1000,45558=>1000,45559=>1000,45560=>1000,45561=>1000,45562=>1000,45563=>1000,45564=>1000,45565=>1000,45566=>1000,45567=>1000,45568=>1000,45569=>1000,45570=>1000,45571=>1000,45572=>1000,45573=>1000,45574=>1000,45575=>1000,45576=>1000,45577=>1000,45578=>1000,45579=>1000,45580=>1000,45581=>1000,45582=>1000,45583=>1000,45584=>1000,45585=>1000,45586=>1000,45587=>1000,45588=>1000,45589=>1000,45590=>1000,45591=>1000,45592=>1000,45593=>1000,45594=>1000,45595=>1000,45596=>1000,45597=>1000,45598=>1000,45599=>1000,45600=>1000,45601=>1000,45602=>1000,45603=>1000,45604=>1000,45605=>1000,45606=>1000,45607=>1000,45608=>1000,45609=>1000,45610=>1000,45611=>1000,45612=>1000,45613=>1000,45614=>1000,45615=>1000,45616=>1000,45617=>1000,45618=>1000,45619=>1000,45620=>1000,45621=>1000,45622=>1000,45623=>1000,45624=>1000,45625=>1000,45626=>1000,45627=>1000,45628=>1000,45629=>1000,45630=>1000,45631=>1000,45632=>1000,45633=>1000,45634=>1000,45635=>1000,45636=>1000,45637=>1000,45638=>1000,45639=>1000,45640=>1000,45641=>1000,45642=>1000,45643=>1000,45644=>1000,45645=>1000,45646=>1000,45647=>1000,45648=>1000,45649=>1000,45650=>1000,45651=>1000,45652=>1000,45653=>1000,45654=>1000,45655=>1000,45656=>1000,45657=>1000,45658=>1000,45659=>1000,45660=>1000,45661=>1000,45662=>1000,45663=>1000,45664=>1000,45665=>1000,45666=>1000,45667=>1000,45668=>1000,45669=>1000,45670=>1000,45671=>1000,45672=>1000,45673=>1000,45674=>1000,45675=>1000,45676=>1000,45677=>1000,45678=>1000,45679=>1000,45680=>1000,45681=>1000,45682=>1000,45683=>1000,45684=>1000,45685=>1000,45686=>1000,45687=>1000,45688=>1000,45689=>1000,45690=>1000,45691=>1000,45692=>1000,45693=>1000,45694=>1000,45695=>1000,45696=>1000,45697=>1000,45698=>1000,45699=>1000,45700=>1000,45701=>1000,45702=>1000,45703=>1000,45704=>1000,45705=>1000,45706=>1000,45707=>1000,45708=>1000,45709=>1000,45710=>1000,45711=>1000,45712=>1000,45713=>1000,45714=>1000,45715=>1000,45716=>1000,45717=>1000,45718=>1000,45719=>1000,45720=>1000,45721=>1000,45722=>1000,45723=>1000,45724=>1000,45725=>1000,45726=>1000,45727=>1000,45728=>1000,45729=>1000,45730=>1000,45731=>1000,45732=>1000,45733=>1000,45734=>1000,45735=>1000,45736=>1000,45737=>1000,45738=>1000,45739=>1000,45740=>1000,45741=>1000,45742=>1000,45743=>1000,45744=>1000,45745=>1000,45746=>1000,45747=>1000,45748=>1000,45749=>1000,45750=>1000,45751=>1000,45752=>1000,45753=>1000,45754=>1000,45755=>1000,45756=>1000,45757=>1000,45758=>1000,45759=>1000,45760=>1000,45761=>1000,45762=>1000,45763=>1000,45764=>1000,45765=>1000,45766=>1000,45767=>1000,45768=>1000,45769=>1000,45770=>1000,45771=>1000,45772=>1000,45773=>1000,45774=>1000,45775=>1000,45776=>1000,45777=>1000,45778=>1000,45779=>1000,45780=>1000,45781=>1000,45782=>1000,45783=>1000,45784=>1000,45785=>1000,45786=>1000,45787=>1000,45788=>1000,45789=>1000,45790=>1000,45791=>1000,45792=>1000,45793=>1000,45794=>1000,45795=>1000,45796=>1000,45797=>1000,45798=>1000,45799=>1000,45800=>1000,45801=>1000,45802=>1000,45803=>1000,45804=>1000,45805=>1000,45806=>1000,45807=>1000,45808=>1000,45809=>1000,45810=>1000,45811=>1000,45812=>1000,45813=>1000,45814=>1000,45815=>1000,45816=>1000,45817=>1000,45818=>1000,45819=>1000,45820=>1000,45821=>1000,45822=>1000,45823=>1000,45824=>1000,45825=>1000,45826=>1000,45827=>1000,45828=>1000,45829=>1000,45830=>1000,45831=>1000,45832=>1000,45833=>1000,45834=>1000,45835=>1000,45836=>1000,45837=>1000,45838=>1000,45839=>1000,45840=>1000,45841=>1000,45842=>1000,45843=>1000,45844=>1000,45845=>1000,45846=>1000,45847=>1000,45848=>1000,45849=>1000,45850=>1000,45851=>1000,45852=>1000,45853=>1000,45854=>1000,45855=>1000,45856=>1000,45857=>1000,45858=>1000,45859=>1000,45860=>1000,45861=>1000,45862=>1000,45863=>1000,45864=>1000,45865=>1000,45866=>1000,45867=>1000,45868=>1000,45869=>1000,45870=>1000,45871=>1000,45872=>1000,45873=>1000,45874=>1000,45875=>1000,45876=>1000,45877=>1000,45878=>1000,45879=>1000,45880=>1000,45881=>1000,45882=>1000,45883=>1000,45884=>1000,45885=>1000,45886=>1000,45887=>1000,45888=>1000,45889=>1000,45890=>1000,45891=>1000,45892=>1000,45893=>1000,45894=>1000,45895=>1000,45896=>1000,45897=>1000,45898=>1000,45899=>1000,45900=>1000,45901=>1000,45902=>1000,45903=>1000,45904=>1000,45905=>1000,45906=>1000,45907=>1000,45908=>1000,45909=>1000,45910=>1000,45911=>1000,45912=>1000,45913=>1000,45914=>1000,45915=>1000,45916=>1000,45917=>1000,45918=>1000,45919=>1000,45920=>1000,45921=>1000,45922=>1000,45923=>1000,45924=>1000,45925=>1000,45926=>1000,45927=>1000,45928=>1000,45929=>1000,45930=>1000,45931=>1000,45932=>1000,45933=>1000,45934=>1000,45935=>1000,45936=>1000,45937=>1000,45938=>1000,45939=>1000,45940=>1000,45941=>1000,45942=>1000,45943=>1000,45944=>1000,45945=>1000,45946=>1000,45947=>1000,45948=>1000,45949=>1000,45950=>1000,45951=>1000,45952=>1000,45953=>1000,45954=>1000,45955=>1000,45956=>1000,45957=>1000,45958=>1000,45959=>1000,45960=>1000,45961=>1000,45962=>1000,45963=>1000,45964=>1000,45965=>1000,45966=>1000,45967=>1000,45968=>1000,45969=>1000,45970=>1000,45971=>1000,45972=>1000,45973=>1000,45974=>1000,45975=>1000,45976=>1000,45977=>1000,45978=>1000,45979=>1000,45980=>1000,45981=>1000,45982=>1000,45983=>1000,45984=>1000,45985=>1000,45986=>1000,45987=>1000,45988=>1000,45989=>1000,45990=>1000,45991=>1000,45992=>1000,45993=>1000,45994=>1000,45995=>1000,45996=>1000,45997=>1000,45998=>1000,45999=>1000,46000=>1000,46001=>1000,46002=>1000,46003=>1000,46004=>1000,46005=>1000,46006=>1000,46007=>1000,46008=>1000,46009=>1000,46010=>1000,46011=>1000,46012=>1000,46013=>1000,46014=>1000,46015=>1000,46016=>1000,46017=>1000,46018=>1000,46019=>1000,46020=>1000,46021=>1000,46022=>1000,46023=>1000,46024=>1000,46025=>1000,46026=>1000,46027=>1000,46028=>1000,46029=>1000,46030=>1000,46031=>1000,46032=>1000,46033=>1000,46034=>1000,46035=>1000,46036=>1000,46037=>1000,46038=>1000,46039=>1000,46040=>1000,46041=>1000,46042=>1000,46043=>1000,46044=>1000,46045=>1000,46046=>1000,46047=>1000,46048=>1000,46049=>1000,46050=>1000,46051=>1000,46052=>1000,46053=>1000,46054=>1000,46055=>1000,46056=>1000,46057=>1000,46058=>1000,46059=>1000,46060=>1000,46061=>1000,46062=>1000,46063=>1000,46064=>1000,46065=>1000,46066=>1000,46067=>1000,46068=>1000,46069=>1000,46070=>1000,46071=>1000,46072=>1000,46073=>1000,46074=>1000,46075=>1000,46076=>1000,46077=>1000,46078=>1000,46079=>1000,46080=>1000,46081=>1000,46082=>1000,46083=>1000,46084=>1000,46085=>1000,46086=>1000,46087=>1000,46088=>1000,46089=>1000,46090=>1000,46091=>1000,46092=>1000,46093=>1000,46094=>1000,46095=>1000,46096=>1000,46097=>1000,46098=>1000,46099=>1000,46100=>1000,46101=>1000,46102=>1000,46103=>1000,46104=>1000,46105=>1000,46106=>1000,46107=>1000,46108=>1000,46109=>1000,46110=>1000,46111=>1000,46112=>1000,46113=>1000,46114=>1000,46115=>1000,46116=>1000,46117=>1000,46118=>1000,46119=>1000,46120=>1000,46121=>1000,46122=>1000,46123=>1000,46124=>1000,46125=>1000,46126=>1000,46127=>1000,46128=>1000,46129=>1000,46130=>1000,46131=>1000,46132=>1000,46133=>1000,46134=>1000,46135=>1000,46136=>1000,46137=>1000,46138=>1000,46139=>1000,46140=>1000,46141=>1000,46142=>1000,46143=>1000,46144=>1000,46145=>1000,46146=>1000,46147=>1000,46148=>1000,46149=>1000,46150=>1000,46151=>1000,46152=>1000,46153=>1000,46154=>1000,46155=>1000,46156=>1000,46157=>1000,46158=>1000,46159=>1000,46160=>1000,46161=>1000,46162=>1000,46163=>1000,46164=>1000,46165=>1000,46166=>1000,46167=>1000,46168=>1000,46169=>1000,46170=>1000,46171=>1000,46172=>1000,46173=>1000,46174=>1000,46175=>1000,46176=>1000,46177=>1000,46178=>1000,46179=>1000,46180=>1000,46181=>1000,46182=>1000,46183=>1000,46184=>1000,46185=>1000,46186=>1000,46187=>1000,46188=>1000,46189=>1000,46190=>1000,46191=>1000,46192=>1000,46193=>1000,46194=>1000,46195=>1000,46196=>1000,46197=>1000,46198=>1000,46199=>1000,46200=>1000,46201=>1000,46202=>1000,46203=>1000,46204=>1000,46205=>1000,46206=>1000,46207=>1000,46208=>1000,46209=>1000,46210=>1000,46211=>1000,46212=>1000,46213=>1000,46214=>1000,46215=>1000,46216=>1000,46217=>1000,46218=>1000,46219=>1000,46220=>1000,46221=>1000,46222=>1000,46223=>1000,46224=>1000,46225=>1000,46226=>1000,46227=>1000,46228=>1000,46229=>1000,46230=>1000,46231=>1000,46232=>1000,46233=>1000,46234=>1000,46235=>1000,46236=>1000,46237=>1000,46238=>1000,46239=>1000,46240=>1000,46241=>1000,46242=>1000,46243=>1000,46244=>1000,46245=>1000,46246=>1000,46247=>1000,46248=>1000,46249=>1000,46250=>1000,46251=>1000,46252=>1000,46253=>1000,46254=>1000,46255=>1000,46256=>1000,46257=>1000,46258=>1000,46259=>1000,46260=>1000,46261=>1000,46262=>1000,46263=>1000,46264=>1000,46265=>1000,46266=>1000,46267=>1000,46268=>1000,46269=>1000,46270=>1000,46271=>1000,46272=>1000,46273=>1000,46274=>1000,46275=>1000,46276=>1000,46277=>1000,46278=>1000,46279=>1000,46280=>1000,46281=>1000,46282=>1000,46283=>1000,46284=>1000,46285=>1000,46286=>1000,46287=>1000,46288=>1000,46289=>1000,46290=>1000,46291=>1000,46292=>1000,46293=>1000,46294=>1000,46295=>1000,46296=>1000,46297=>1000,46298=>1000,46299=>1000,46300=>1000,46301=>1000,46302=>1000,46303=>1000,46304=>1000,46305=>1000,46306=>1000,46307=>1000,46308=>1000,46309=>1000,46310=>1000,46311=>1000,46312=>1000,46313=>1000,46314=>1000,46315=>1000,46316=>1000,46317=>1000,46318=>1000,46319=>1000,46320=>1000,46321=>1000,46322=>1000,46323=>1000,46324=>1000,46325=>1000,46326=>1000,46327=>1000,46328=>1000,46329=>1000,46330=>1000,46331=>1000,46332=>1000,46333=>1000,46334=>1000,46335=>1000,46336=>1000,46337=>1000,46338=>1000,46339=>1000,46340=>1000,46341=>1000,46342=>1000,46343=>1000,46344=>1000,46345=>1000,46346=>1000,46347=>1000,46348=>1000,46349=>1000,46350=>1000,46351=>1000,46352=>1000,46353=>1000,46354=>1000,46355=>1000,46356=>1000,46357=>1000,46358=>1000,46359=>1000,46360=>1000,46361=>1000,46362=>1000,46363=>1000,46364=>1000,46365=>1000,46366=>1000,46367=>1000,46368=>1000,46369=>1000,46370=>1000,46371=>1000,46372=>1000,46373=>1000,46374=>1000,46375=>1000,46376=>1000,46377=>1000,46378=>1000,46379=>1000,46380=>1000,46381=>1000,46382=>1000,46383=>1000,46384=>1000,46385=>1000,46386=>1000,46387=>1000,46388=>1000,46389=>1000,46390=>1000,46391=>1000,46392=>1000,46393=>1000,46394=>1000,46395=>1000,46396=>1000,46397=>1000,46398=>1000,46399=>1000,46400=>1000,46401=>1000,46402=>1000,46403=>1000,46404=>1000,46405=>1000,46406=>1000,46407=>1000,46408=>1000,46409=>1000,46410=>1000,46411=>1000,46412=>1000,46413=>1000,46414=>1000,46415=>1000,46416=>1000,46417=>1000,46418=>1000,46419=>1000,46420=>1000,46421=>1000,46422=>1000,46423=>1000,46424=>1000,46425=>1000,46426=>1000,46427=>1000,46428=>1000,46429=>1000,46430=>1000,46431=>1000,46432=>1000,46433=>1000,46434=>1000,46435=>1000,46436=>1000,46437=>1000,46438=>1000,46439=>1000,46440=>1000,46441=>1000,46442=>1000,46443=>1000,46444=>1000,46445=>1000,46446=>1000,46447=>1000,46448=>1000,46449=>1000,46450=>1000,46451=>1000,46452=>1000,46453=>1000,46454=>1000,46455=>1000,46456=>1000,46457=>1000,46458=>1000,46459=>1000,46460=>1000,46461=>1000,46462=>1000,46463=>1000,46464=>1000,46465=>1000,46466=>1000,46467=>1000,46468=>1000,46469=>1000,46470=>1000,46471=>1000,46472=>1000,46473=>1000,46474=>1000,46475=>1000,46476=>1000,46477=>1000,46478=>1000,46479=>1000,46480=>1000,46481=>1000,46482=>1000,46483=>1000,46484=>1000,46485=>1000,46486=>1000,46487=>1000,46488=>1000,46489=>1000,46490=>1000,46491=>1000,46492=>1000,46493=>1000,46494=>1000,46495=>1000,46496=>1000,46497=>1000,46498=>1000,46499=>1000,46500=>1000,46501=>1000,46502=>1000,46503=>1000,46504=>1000,46505=>1000,46506=>1000,46507=>1000,46508=>1000,46509=>1000,46510=>1000,46511=>1000,46512=>1000,46513=>1000,46514=>1000,46515=>1000,46516=>1000,46517=>1000,46518=>1000,46519=>1000,46520=>1000,46521=>1000,46522=>1000,46523=>1000,46524=>1000,46525=>1000,46526=>1000,46527=>1000,46528=>1000,46529=>1000,46530=>1000,46531=>1000,46532=>1000,46533=>1000,46534=>1000,46535=>1000,46536=>1000,46537=>1000,46538=>1000,46539=>1000,46540=>1000,46541=>1000,46542=>1000,46543=>1000,46544=>1000,46545=>1000,46546=>1000,46547=>1000,46548=>1000,46549=>1000,46550=>1000,46551=>1000,46552=>1000,46553=>1000,46554=>1000,46555=>1000,46556=>1000,46557=>1000,46558=>1000,46559=>1000,46560=>1000,46561=>1000,46562=>1000,46563=>1000,46564=>1000,46565=>1000,46566=>1000,46567=>1000,46568=>1000,46569=>1000,46570=>1000,46571=>1000,46572=>1000,46573=>1000,46574=>1000,46575=>1000,46576=>1000,46577=>1000,46578=>1000,46579=>1000,46580=>1000,46581=>1000,46582=>1000,46583=>1000,46584=>1000,46585=>1000,46586=>1000,46587=>1000,46588=>1000,46589=>1000,46590=>1000,46591=>1000,46592=>1000,46593=>1000,46594=>1000,46595=>1000,46596=>1000,46597=>1000,46598=>1000,46599=>1000,46600=>1000,46601=>1000,46602=>1000,46603=>1000,46604=>1000,46605=>1000,46606=>1000,46607=>1000,46608=>1000,46609=>1000,46610=>1000,46611=>1000,46612=>1000,46613=>1000,46614=>1000,46615=>1000,46616=>1000,46617=>1000,46618=>1000,46619=>1000,46620=>1000,46621=>1000,46622=>1000,46623=>1000,46624=>1000,46625=>1000,46626=>1000,46627=>1000,46628=>1000,46629=>1000,46630=>1000,46631=>1000,46632=>1000,46633=>1000,46634=>1000,46635=>1000,46636=>1000,46637=>1000,46638=>1000,46639=>1000,46640=>1000,46641=>1000,46642=>1000,46643=>1000,46644=>1000,46645=>1000,46646=>1000,46647=>1000,46648=>1000,46649=>1000,46650=>1000,46651=>1000,46652=>1000,46653=>1000,46654=>1000,46655=>1000,46656=>1000,46657=>1000,46658=>1000,46659=>1000,46660=>1000,46661=>1000,46662=>1000,46663=>1000,46664=>1000,46665=>1000,46666=>1000,46667=>1000,46668=>1000,46669=>1000,46670=>1000,46671=>1000,46672=>1000,46673=>1000,46674=>1000,46675=>1000,46676=>1000,46677=>1000,46678=>1000,46679=>1000,46680=>1000,46681=>1000,46682=>1000,46683=>1000,46684=>1000,46685=>1000,46686=>1000,46687=>1000,46688=>1000,46689=>1000,46690=>1000,46691=>1000,46692=>1000,46693=>1000,46694=>1000,46695=>1000,46696=>1000,46697=>1000,46698=>1000,46699=>1000,46700=>1000,46701=>1000,46702=>1000,46703=>1000,46704=>1000,46705=>1000,46706=>1000,46707=>1000,46708=>1000,46709=>1000,46710=>1000,46711=>1000,46712=>1000,46713=>1000,46714=>1000,46715=>1000,46716=>1000,46717=>1000,46718=>1000,46719=>1000,46720=>1000,46721=>1000,46722=>1000,46723=>1000,46724=>1000,46725=>1000,46726=>1000,46727=>1000,46728=>1000,46729=>1000,46730=>1000,46731=>1000,46732=>1000,46733=>1000,46734=>1000,46735=>1000,46736=>1000,46737=>1000,46738=>1000,46739=>1000,46740=>1000,46741=>1000,46742=>1000,46743=>1000,46744=>1000,46745=>1000,46746=>1000,46747=>1000,46748=>1000,46749=>1000,46750=>1000,46751=>1000,46752=>1000,46753=>1000,46754=>1000,46755=>1000,46756=>1000,46757=>1000,46758=>1000,46759=>1000,46760=>1000,46761=>1000,46762=>1000,46763=>1000,46764=>1000,46765=>1000,46766=>1000,46767=>1000,46768=>1000,46769=>1000,46770=>1000,46771=>1000,46772=>1000,46773=>1000,46774=>1000,46775=>1000,46776=>1000,46777=>1000,46778=>1000,46779=>1000,46780=>1000,46781=>1000,46782=>1000,46783=>1000,46784=>1000,46785=>1000,46786=>1000,46787=>1000,46788=>1000,46789=>1000,46790=>1000,46791=>1000,46792=>1000,46793=>1000,46794=>1000,46795=>1000,46796=>1000,46797=>1000,46798=>1000,46799=>1000,46800=>1000,46801=>1000,46802=>1000,46803=>1000,46804=>1000,46805=>1000,46806=>1000,46807=>1000,46808=>1000,46809=>1000,46810=>1000,46811=>1000,46812=>1000,46813=>1000,46814=>1000,46815=>1000,46816=>1000,46817=>1000,46818=>1000,46819=>1000,46820=>1000,46821=>1000,46822=>1000,46823=>1000,46824=>1000,46825=>1000,46826=>1000,46827=>1000,46828=>1000,46829=>1000,46830=>1000,46831=>1000,46832=>1000,46833=>1000,46834=>1000,46835=>1000,46836=>1000,46837=>1000,46838=>1000,46839=>1000,46840=>1000,46841=>1000,46842=>1000,46843=>1000,46844=>1000,46845=>1000,46846=>1000,46847=>1000,46848=>1000,46849=>1000,46850=>1000,46851=>1000,46852=>1000,46853=>1000,46854=>1000,46855=>1000,46856=>1000,46857=>1000,46858=>1000,46859=>1000,46860=>1000,46861=>1000,46862=>1000,46863=>1000,46864=>1000,46865=>1000,46866=>1000,46867=>1000,46868=>1000,46869=>1000,46870=>1000,46871=>1000,46872=>1000,46873=>1000,46874=>1000,46875=>1000,46876=>1000,46877=>1000,46878=>1000,46879=>1000,46880=>1000,46881=>1000,46882=>1000,46883=>1000,46884=>1000,46885=>1000,46886=>1000,46887=>1000,46888=>1000,46889=>1000,46890=>1000,46891=>1000,46892=>1000,46893=>1000,46894=>1000,46895=>1000,46896=>1000,46897=>1000,46898=>1000,46899=>1000,46900=>1000,46901=>1000,46902=>1000,46903=>1000,46904=>1000,46905=>1000,46906=>1000,46907=>1000,46908=>1000,46909=>1000,46910=>1000,46911=>1000,46912=>1000,46913=>1000,46914=>1000,46915=>1000,46916=>1000,46917=>1000,46918=>1000,46919=>1000,46920=>1000,46921=>1000,46922=>1000,46923=>1000,46924=>1000,46925=>1000,46926=>1000,46927=>1000,46928=>1000,46929=>1000,46930=>1000,46931=>1000,46932=>1000,46933=>1000,46934=>1000,46935=>1000,46936=>1000,46937=>1000,46938=>1000,46939=>1000,46940=>1000,46941=>1000,46942=>1000,46943=>1000,46944=>1000,46945=>1000,46946=>1000,46947=>1000,46948=>1000,46949=>1000,46950=>1000,46951=>1000,46952=>1000,46953=>1000,46954=>1000,46955=>1000,46956=>1000,46957=>1000,46958=>1000,46959=>1000,46960=>1000,46961=>1000,46962=>1000,46963=>1000,46964=>1000,46965=>1000,46966=>1000,46967=>1000,46968=>1000,46969=>1000,46970=>1000,46971=>1000,46972=>1000,46973=>1000,46974=>1000,46975=>1000,46976=>1000,46977=>1000,46978=>1000,46979=>1000,46980=>1000,46981=>1000,46982=>1000,46983=>1000,46984=>1000,46985=>1000,46986=>1000,46987=>1000,46988=>1000,46989=>1000,46990=>1000,46991=>1000,46992=>1000,46993=>1000,46994=>1000,46995=>1000,46996=>1000,46997=>1000,46998=>1000,46999=>1000,47000=>1000,47001=>1000,47002=>1000,47003=>1000,47004=>1000,47005=>1000,47006=>1000,47007=>1000,47008=>1000,47009=>1000,47010=>1000,47011=>1000,47012=>1000,47013=>1000,47014=>1000,47015=>1000,47016=>1000,47017=>1000,47018=>1000,47019=>1000,47020=>1000,47021=>1000,47022=>1000,47023=>1000,47024=>1000,47025=>1000,47026=>1000,47027=>1000,47028=>1000,47029=>1000,47030=>1000,47031=>1000,47032=>1000,47033=>1000,47034=>1000,47035=>1000,47036=>1000,47037=>1000,47038=>1000,47039=>1000,47040=>1000,47041=>1000,47042=>1000,47043=>1000,47044=>1000,47045=>1000,47046=>1000,47047=>1000,47048=>1000,47049=>1000,47050=>1000,47051=>1000,47052=>1000,47053=>1000,47054=>1000,47055=>1000,47056=>1000,47057=>1000,47058=>1000,47059=>1000,47060=>1000,47061=>1000,47062=>1000,47063=>1000,47064=>1000,47065=>1000,47066=>1000,47067=>1000,47068=>1000,47069=>1000,47070=>1000,47071=>1000,47072=>1000,47073=>1000,47074=>1000,47075=>1000,47076=>1000,47077=>1000,47078=>1000,47079=>1000,47080=>1000,47081=>1000,47082=>1000,47083=>1000,47084=>1000,47085=>1000,47086=>1000,47087=>1000,47088=>1000,47089=>1000,47090=>1000,47091=>1000,47092=>1000,47093=>1000,47094=>1000,47095=>1000,47096=>1000,47097=>1000,47098=>1000,47099=>1000,47100=>1000,47101=>1000,47102=>1000,47103=>1000,47104=>1000,47105=>1000,47106=>1000,47107=>1000,47108=>1000,47109=>1000,47110=>1000,47111=>1000,47112=>1000,47113=>1000,47114=>1000,47115=>1000,47116=>1000,47117=>1000,47118=>1000,47119=>1000,47120=>1000,47121=>1000,47122=>1000,47123=>1000,47124=>1000,47125=>1000,47126=>1000,47127=>1000,47128=>1000,47129=>1000,47130=>1000,47131=>1000,47132=>1000,47133=>1000,47134=>1000,47135=>1000,47136=>1000,47137=>1000,47138=>1000,47139=>1000,47140=>1000,47141=>1000,47142=>1000,47143=>1000,47144=>1000,47145=>1000,47146=>1000,47147=>1000,47148=>1000,47149=>1000,47150=>1000,47151=>1000,47152=>1000,47153=>1000,47154=>1000,47155=>1000,47156=>1000,47157=>1000,47158=>1000,47159=>1000,47160=>1000,47161=>1000,47162=>1000,47163=>1000,47164=>1000,47165=>1000,47166=>1000,47167=>1000,47168=>1000,47169=>1000,47170=>1000,47171=>1000,47172=>1000,47173=>1000,47174=>1000,47175=>1000,47176=>1000,47177=>1000,47178=>1000,47179=>1000,47180=>1000,47181=>1000,47182=>1000,47183=>1000,47184=>1000,47185=>1000,47186=>1000,47187=>1000,47188=>1000,47189=>1000,47190=>1000,47191=>1000,47192=>1000,47193=>1000,47194=>1000,47195=>1000,47196=>1000,47197=>1000,47198=>1000,47199=>1000,47200=>1000,47201=>1000,47202=>1000,47203=>1000,47204=>1000,47205=>1000,47206=>1000,47207=>1000,47208=>1000,47209=>1000,47210=>1000,47211=>1000,47212=>1000,47213=>1000,47214=>1000,47215=>1000,47216=>1000,47217=>1000,47218=>1000,47219=>1000,47220=>1000,47221=>1000,47222=>1000,47223=>1000,47224=>1000,47225=>1000,47226=>1000,47227=>1000,47228=>1000,47229=>1000,47230=>1000,47231=>1000,47232=>1000,47233=>1000,47234=>1000,47235=>1000,47236=>1000,47237=>1000,47238=>1000,47239=>1000,47240=>1000,47241=>1000,47242=>1000,47243=>1000,47244=>1000,47245=>1000,47246=>1000,47247=>1000,47248=>1000,47249=>1000,47250=>1000,47251=>1000,47252=>1000,47253=>1000,47254=>1000,47255=>1000,47256=>1000,47257=>1000,47258=>1000,47259=>1000,47260=>1000,47261=>1000,47262=>1000,47263=>1000,47264=>1000,47265=>1000,47266=>1000,47267=>1000,47268=>1000,47269=>1000,47270=>1000,47271=>1000,47272=>1000,47273=>1000,47274=>1000,47275=>1000,47276=>1000,47277=>1000,47278=>1000,47279=>1000,47280=>1000,47281=>1000,47282=>1000,47283=>1000,47284=>1000,47285=>1000,47286=>1000,47287=>1000,47288=>1000,47289=>1000,47290=>1000,47291=>1000,47292=>1000,47293=>1000,47294=>1000,47295=>1000,47296=>1000,47297=>1000,47298=>1000,47299=>1000,47300=>1000,47301=>1000,47302=>1000,47303=>1000,47304=>1000,47305=>1000,47306=>1000,47307=>1000,47308=>1000,47309=>1000,47310=>1000,47311=>1000,47312=>1000,47313=>1000,47314=>1000,47315=>1000,47316=>1000,47317=>1000,47318=>1000,47319=>1000,47320=>1000,47321=>1000,47322=>1000,47323=>1000,47324=>1000,47325=>1000,47326=>1000,47327=>1000,47328=>1000,47329=>1000,47330=>1000,47331=>1000,47332=>1000,47333=>1000,47334=>1000,47335=>1000,47336=>1000,47337=>1000,47338=>1000,47339=>1000,47340=>1000,47341=>1000,47342=>1000,47343=>1000,47344=>1000,47345=>1000,47346=>1000,47347=>1000,47348=>1000,47349=>1000,47350=>1000,47351=>1000,47352=>1000,47353=>1000,47354=>1000,47355=>1000,47356=>1000,47357=>1000,47358=>1000,47359=>1000,47360=>1000,47361=>1000,47362=>1000,47363=>1000,47364=>1000,47365=>1000,47366=>1000,47367=>1000,47368=>1000,47369=>1000,47370=>1000,47371=>1000,47372=>1000,47373=>1000,47374=>1000,47375=>1000,47376=>1000,47377=>1000,47378=>1000,47379=>1000,47380=>1000,47381=>1000,47382=>1000,47383=>1000,47384=>1000,47385=>1000,47386=>1000,47387=>1000,47388=>1000,47389=>1000,47390=>1000,47391=>1000,47392=>1000,47393=>1000,47394=>1000,47395=>1000,47396=>1000,47397=>1000,47398=>1000,47399=>1000,47400=>1000,47401=>1000,47402=>1000,47403=>1000,47404=>1000,47405=>1000,47406=>1000,47407=>1000,47408=>1000,47409=>1000,47410=>1000,47411=>1000,47412=>1000,47413=>1000,47414=>1000,47415=>1000,47416=>1000,47417=>1000,47418=>1000,47419=>1000,47420=>1000,47421=>1000,47422=>1000,47423=>1000,47424=>1000,47425=>1000,47426=>1000,47427=>1000,47428=>1000,47429=>1000,47430=>1000,47431=>1000,47432=>1000,47433=>1000,47434=>1000,47435=>1000,47436=>1000,47437=>1000,47438=>1000,47439=>1000,47440=>1000,47441=>1000,47442=>1000,47443=>1000,47444=>1000,47445=>1000,47446=>1000,47447=>1000,47448=>1000,47449=>1000,47450=>1000,47451=>1000,47452=>1000,47453=>1000,47454=>1000,47455=>1000,47456=>1000,47457=>1000,47458=>1000,47459=>1000,47460=>1000,47461=>1000,47462=>1000,47463=>1000,47464=>1000,47465=>1000,47466=>1000,47467=>1000,47468=>1000,47469=>1000,47470=>1000,47471=>1000,47472=>1000,47473=>1000,47474=>1000,47475=>1000,47476=>1000,47477=>1000,47478=>1000,47479=>1000,47480=>1000,47481=>1000,47482=>1000,47483=>1000,47484=>1000,47485=>1000,47486=>1000,47487=>1000,47488=>1000,47489=>1000,47490=>1000,47491=>1000,47492=>1000,47493=>1000,47494=>1000,47495=>1000,47496=>1000,47497=>1000,47498=>1000,47499=>1000,47500=>1000,47501=>1000,47502=>1000,47503=>1000,47504=>1000,47505=>1000,47506=>1000,47507=>1000,47508=>1000,47509=>1000,47510=>1000,47511=>1000,47512=>1000,47513=>1000,47514=>1000,47515=>1000,47516=>1000,47517=>1000,47518=>1000,47519=>1000,47520=>1000,47521=>1000,47522=>1000,47523=>1000,47524=>1000,47525=>1000,47526=>1000,47527=>1000,47528=>1000,47529=>1000,47530=>1000,47531=>1000,47532=>1000,47533=>1000,47534=>1000,47535=>1000,47536=>1000,47537=>1000,47538=>1000,47539=>1000,47540=>1000,47541=>1000,47542=>1000,47543=>1000,47544=>1000,47545=>1000,47546=>1000,47547=>1000,47548=>1000,47549=>1000,47550=>1000,47551=>1000,47552=>1000,47553=>1000,47554=>1000,47555=>1000,47556=>1000,47557=>1000,47558=>1000,47559=>1000,47560=>1000,47561=>1000,47562=>1000,47563=>1000,47564=>1000,47565=>1000,47566=>1000,47567=>1000,47568=>1000,47569=>1000,47570=>1000,47571=>1000,47572=>1000,47573=>1000,47574=>1000,47575=>1000,47576=>1000,47577=>1000,47578=>1000,47579=>1000,47580=>1000,47581=>1000,47582=>1000,47583=>1000,47584=>1000,47585=>1000,47586=>1000,47587=>1000,47588=>1000,47589=>1000,47590=>1000,47591=>1000,47592=>1000,47593=>1000,47594=>1000,47595=>1000,47596=>1000,47597=>1000,47598=>1000,47599=>1000,47600=>1000,47601=>1000,47602=>1000,47603=>1000,47604=>1000,47605=>1000,47606=>1000,47607=>1000,47608=>1000,47609=>1000,47610=>1000,47611=>1000,47612=>1000,47613=>1000,47614=>1000,47615=>1000,47616=>1000,47617=>1000,47618=>1000,47619=>1000,47620=>1000,47621=>1000,47622=>1000,47623=>1000,47624=>1000,47625=>1000,47626=>1000,47627=>1000,47628=>1000,47629=>1000,47630=>1000,47631=>1000,47632=>1000,47633=>1000,47634=>1000,47635=>1000,47636=>1000,47637=>1000,47638=>1000,47639=>1000,47640=>1000,47641=>1000,47642=>1000,47643=>1000,47644=>1000,47645=>1000,47646=>1000,47647=>1000,47648=>1000,47649=>1000,47650=>1000,47651=>1000,47652=>1000,47653=>1000,47654=>1000,47655=>1000,47656=>1000,47657=>1000,47658=>1000,47659=>1000,47660=>1000,47661=>1000,47662=>1000,47663=>1000,47664=>1000,47665=>1000,47666=>1000,47667=>1000,47668=>1000,47669=>1000,47670=>1000,47671=>1000,47672=>1000,47673=>1000,47674=>1000,47675=>1000,47676=>1000,47677=>1000,47678=>1000,47679=>1000,47680=>1000,47681=>1000,47682=>1000,47683=>1000,47684=>1000,47685=>1000,47686=>1000,47687=>1000,47688=>1000,47689=>1000,47690=>1000,47691=>1000,47692=>1000,47693=>1000,47694=>1000,47695=>1000,47696=>1000,47697=>1000,47698=>1000,47699=>1000,47700=>1000,47701=>1000,47702=>1000,47703=>1000,47704=>1000,47705=>1000,47706=>1000,47707=>1000,47708=>1000,47709=>1000,47710=>1000,47711=>1000,47712=>1000,47713=>1000,47714=>1000,47715=>1000,47716=>1000,47717=>1000,47718=>1000,47719=>1000,47720=>1000,47721=>1000,47722=>1000,47723=>1000,47724=>1000,47725=>1000,47726=>1000,47727=>1000,47728=>1000,47729=>1000,47730=>1000,47731=>1000,47732=>1000,47733=>1000,47734=>1000,47735=>1000,47736=>1000,47737=>1000,47738=>1000,47739=>1000,47740=>1000,47741=>1000,47742=>1000,47743=>1000,47744=>1000,47745=>1000,47746=>1000,47747=>1000,47748=>1000,47749=>1000,47750=>1000,47751=>1000,47752=>1000,47753=>1000,47754=>1000,47755=>1000,47756=>1000,47757=>1000,47758=>1000,47759=>1000,47760=>1000,47761=>1000,47762=>1000,47763=>1000,47764=>1000,47765=>1000,47766=>1000,47767=>1000,47768=>1000,47769=>1000,47770=>1000,47771=>1000,47772=>1000,47773=>1000,47774=>1000,47775=>1000,47776=>1000,47777=>1000,47778=>1000,47779=>1000,47780=>1000,47781=>1000,47782=>1000,47783=>1000,47784=>1000,47785=>1000,47786=>1000,47787=>1000,47788=>1000,47789=>1000,47790=>1000,47791=>1000,47792=>1000,47793=>1000,47794=>1000,47795=>1000,47796=>1000,47797=>1000,47798=>1000,47799=>1000,47800=>1000,47801=>1000,47802=>1000,47803=>1000,47804=>1000,47805=>1000,47806=>1000,47807=>1000,47808=>1000,47809=>1000,47810=>1000,47811=>1000,47812=>1000,47813=>1000,47814=>1000,47815=>1000,47816=>1000,47817=>1000,47818=>1000,47819=>1000,47820=>1000,47821=>1000,47822=>1000,47823=>1000,47824=>1000,47825=>1000,47826=>1000,47827=>1000,47828=>1000,47829=>1000,47830=>1000,47831=>1000,47832=>1000,47833=>1000,47834=>1000,47835=>1000,47836=>1000,47837=>1000,47838=>1000,47839=>1000,47840=>1000,47841=>1000,47842=>1000,47843=>1000,47844=>1000,47845=>1000,47846=>1000,47847=>1000,47848=>1000,47849=>1000,47850=>1000,47851=>1000,47852=>1000,47853=>1000,47854=>1000,47855=>1000,47856=>1000,47857=>1000,47858=>1000,47859=>1000,47860=>1000,47861=>1000,47862=>1000,47863=>1000,47864=>1000,47865=>1000,47866=>1000,47867=>1000,47868=>1000,47869=>1000,47870=>1000,47871=>1000,47872=>1000,47873=>1000,47874=>1000,47875=>1000,47876=>1000,47877=>1000,47878=>1000,47879=>1000,47880=>1000,47881=>1000,47882=>1000,47883=>1000,47884=>1000,47885=>1000,47886=>1000,47887=>1000,47888=>1000,47889=>1000,47890=>1000,47891=>1000,47892=>1000,47893=>1000,47894=>1000,47895=>1000,47896=>1000,47897=>1000,47898=>1000,47899=>1000,47900=>1000,47901=>1000,47902=>1000,47903=>1000,47904=>1000,47905=>1000,47906=>1000,47907=>1000,47908=>1000,47909=>1000,47910=>1000,47911=>1000,47912=>1000,47913=>1000,47914=>1000,47915=>1000,47916=>1000,47917=>1000,47918=>1000,47919=>1000,47920=>1000,47921=>1000,47922=>1000,47923=>1000,47924=>1000,47925=>1000,47926=>1000,47927=>1000,47928=>1000,47929=>1000,47930=>1000,47931=>1000,47932=>1000,47933=>1000,47934=>1000,47935=>1000,47936=>1000,47937=>1000,47938=>1000,47939=>1000,47940=>1000,47941=>1000,47942=>1000,47943=>1000,47944=>1000,47945=>1000,47946=>1000,47947=>1000,47948=>1000,47949=>1000,47950=>1000,47951=>1000,47952=>1000,47953=>1000,47954=>1000,47955=>1000,47956=>1000,47957=>1000,47958=>1000,47959=>1000,47960=>1000,47961=>1000,47962=>1000,47963=>1000,47964=>1000,47965=>1000,47966=>1000,47967=>1000,47968=>1000,47969=>1000,47970=>1000,47971=>1000,47972=>1000,47973=>1000,47974=>1000,47975=>1000,47976=>1000,47977=>1000,47978=>1000,47979=>1000,47980=>1000,47981=>1000,47982=>1000,47983=>1000,47984=>1000,47985=>1000,47986=>1000,47987=>1000,47988=>1000,47989=>1000,47990=>1000,47991=>1000,47992=>1000,47993=>1000,47994=>1000,47995=>1000,47996=>1000,47997=>1000,47998=>1000,47999=>1000,48000=>1000,48001=>1000,48002=>1000,48003=>1000,48004=>1000,48005=>1000,48006=>1000,48007=>1000,48008=>1000,48009=>1000,48010=>1000,48011=>1000,48012=>1000,48013=>1000,48014=>1000,48015=>1000,48016=>1000,48017=>1000,48018=>1000,48019=>1000,48020=>1000,48021=>1000,48022=>1000,48023=>1000,48024=>1000,48025=>1000,48026=>1000,48027=>1000,48028=>1000,48029=>1000,48030=>1000,48031=>1000,48032=>1000,48033=>1000,48034=>1000,48035=>1000,48036=>1000,48037=>1000,48038=>1000,48039=>1000,48040=>1000,48041=>1000,48042=>1000,48043=>1000,48044=>1000,48045=>1000,48046=>1000,48047=>1000,48048=>1000,48049=>1000,48050=>1000,48051=>1000,48052=>1000,48053=>1000,48054=>1000,48055=>1000,48056=>1000,48057=>1000,48058=>1000,48059=>1000,48060=>1000,48061=>1000,48062=>1000,48063=>1000,48064=>1000,48065=>1000,48066=>1000,48067=>1000,48068=>1000,48069=>1000,48070=>1000,48071=>1000,48072=>1000,48073=>1000,48074=>1000,48075=>1000,48076=>1000,48077=>1000,48078=>1000,48079=>1000,48080=>1000,48081=>1000,48082=>1000,48083=>1000,48084=>1000,48085=>1000,48086=>1000,48087=>1000,48088=>1000,48089=>1000,48090=>1000,48091=>1000,48092=>1000,48093=>1000,48094=>1000,48095=>1000,48096=>1000,48097=>1000,48098=>1000,48099=>1000,48100=>1000,48101=>1000,48102=>1000,48103=>1000,48104=>1000,48105=>1000,48106=>1000,48107=>1000,48108=>1000,48109=>1000,48110=>1000,48111=>1000,48112=>1000,48113=>1000,48114=>1000,48115=>1000,48116=>1000,48117=>1000,48118=>1000,48119=>1000,48120=>1000,48121=>1000,48122=>1000,48123=>1000,48124=>1000,48125=>1000,48126=>1000,48127=>1000,48128=>1000,48129=>1000,48130=>1000,48131=>1000,48132=>1000,48133=>1000,48134=>1000,48135=>1000,48136=>1000,48137=>1000,48138=>1000,48139=>1000,48140=>1000,48141=>1000,48142=>1000,48143=>1000,48144=>1000,48145=>1000,48146=>1000,48147=>1000,48148=>1000,48149=>1000,48150=>1000,48151=>1000,48152=>1000,48153=>1000,48154=>1000,48155=>1000,48156=>1000,48157=>1000,48158=>1000,48159=>1000,48160=>1000,48161=>1000,48162=>1000,48163=>1000,48164=>1000,48165=>1000,48166=>1000,48167=>1000,48168=>1000,48169=>1000,48170=>1000,48171=>1000,48172=>1000,48173=>1000,48174=>1000,48175=>1000,48176=>1000,48177=>1000,48178=>1000,48179=>1000,48180=>1000,48181=>1000,48182=>1000,48183=>1000,48184=>1000,48185=>1000,48186=>1000,48187=>1000,48188=>1000,48189=>1000,48190=>1000,48191=>1000,48192=>1000,48193=>1000,48194=>1000,48195=>1000,48196=>1000,48197=>1000,48198=>1000,48199=>1000,48200=>1000,48201=>1000,48202=>1000,48203=>1000,48204=>1000,48205=>1000,48206=>1000,48207=>1000,48208=>1000,48209=>1000,48210=>1000,48211=>1000,48212=>1000,48213=>1000,48214=>1000,48215=>1000,48216=>1000,48217=>1000,48218=>1000,48219=>1000,48220=>1000,48221=>1000,48222=>1000,48223=>1000,48224=>1000,48225=>1000,48226=>1000,48227=>1000,48228=>1000,48229=>1000,48230=>1000,48231=>1000,48232=>1000,48233=>1000,48234=>1000,48235=>1000,48236=>1000,48237=>1000,48238=>1000,48239=>1000,48240=>1000,48241=>1000,48242=>1000,48243=>1000,48244=>1000,48245=>1000,48246=>1000,48247=>1000,48248=>1000,48249=>1000,48250=>1000,48251=>1000,48252=>1000,48253=>1000,48254=>1000,48255=>1000,48256=>1000,48257=>1000,48258=>1000,48259=>1000,48260=>1000,48261=>1000,48262=>1000,48263=>1000,48264=>1000,48265=>1000,48266=>1000,48267=>1000,48268=>1000,48269=>1000,48270=>1000,48271=>1000,48272=>1000,48273=>1000,48274=>1000,48275=>1000,48276=>1000,48277=>1000,48278=>1000,48279=>1000,48280=>1000,48281=>1000,48282=>1000,48283=>1000,48284=>1000,48285=>1000,48286=>1000,48287=>1000,48288=>1000,48289=>1000,48290=>1000,48291=>1000,48292=>1000,48293=>1000,48294=>1000,48295=>1000,48296=>1000,48297=>1000,48298=>1000,48299=>1000,48300=>1000,48301=>1000,48302=>1000,48303=>1000,48304=>1000,48305=>1000,48306=>1000,48307=>1000,48308=>1000,48309=>1000,48310=>1000,48311=>1000,48312=>1000,48313=>1000,48314=>1000,48315=>1000,48316=>1000,48317=>1000,48318=>1000,48319=>1000,48320=>1000,48321=>1000,48322=>1000,48323=>1000,48324=>1000,48325=>1000,48326=>1000,48327=>1000,48328=>1000,48329=>1000,48330=>1000,48331=>1000,48332=>1000,48333=>1000,48334=>1000,48335=>1000,48336=>1000,48337=>1000,48338=>1000,48339=>1000,48340=>1000,48341=>1000,48342=>1000,48343=>1000,48344=>1000,48345=>1000,48346=>1000,48347=>1000,48348=>1000,48349=>1000,48350=>1000,48351=>1000,48352=>1000,48353=>1000,48354=>1000,48355=>1000,48356=>1000,48357=>1000,48358=>1000,48359=>1000,48360=>1000,48361=>1000,48362=>1000,48363=>1000,48364=>1000,48365=>1000,48366=>1000,48367=>1000,48368=>1000,48369=>1000,48370=>1000,48371=>1000,48372=>1000,48373=>1000,48374=>1000,48375=>1000,48376=>1000,48377=>1000,48378=>1000,48379=>1000,48380=>1000,48381=>1000,48382=>1000,48383=>1000,48384=>1000,48385=>1000,48386=>1000,48387=>1000,48388=>1000,48389=>1000,48390=>1000,48391=>1000,48392=>1000,48393=>1000,48394=>1000,48395=>1000,48396=>1000,48397=>1000,48398=>1000,48399=>1000,48400=>1000,48401=>1000,48402=>1000,48403=>1000,48404=>1000,48405=>1000,48406=>1000,48407=>1000,48408=>1000,48409=>1000,48410=>1000,48411=>1000,48412=>1000,48413=>1000,48414=>1000,48415=>1000,48416=>1000,48417=>1000,48418=>1000,48419=>1000,48420=>1000,48421=>1000,48422=>1000,48423=>1000,48424=>1000,48425=>1000,48426=>1000,48427=>1000,48428=>1000,48429=>1000,48430=>1000,48431=>1000,48432=>1000,48433=>1000,48434=>1000,48435=>1000,48436=>1000,48437=>1000,48438=>1000,48439=>1000,48440=>1000,48441=>1000,48442=>1000,48443=>1000,48444=>1000,48445=>1000,48446=>1000,48447=>1000,48448=>1000,48449=>1000,48450=>1000,48451=>1000,48452=>1000,48453=>1000,48454=>1000,48455=>1000,48456=>1000,48457=>1000,48458=>1000,48459=>1000,48460=>1000,48461=>1000,48462=>1000,48463=>1000,48464=>1000,48465=>1000,48466=>1000,48467=>1000,48468=>1000,48469=>1000,48470=>1000,48471=>1000,48472=>1000,48473=>1000,48474=>1000,48475=>1000,48476=>1000,48477=>1000,48478=>1000,48479=>1000,48480=>1000,48481=>1000,48482=>1000,48483=>1000,48484=>1000,48485=>1000,48486=>1000,48487=>1000,48488=>1000,48489=>1000,48490=>1000,48491=>1000,48492=>1000,48493=>1000,48494=>1000,48495=>1000,48496=>1000,48497=>1000,48498=>1000,48499=>1000,48500=>1000,48501=>1000,48502=>1000,48503=>1000,48504=>1000,48505=>1000,48506=>1000,48507=>1000,48508=>1000,48509=>1000,48510=>1000,48511=>1000,48512=>1000,48513=>1000,48514=>1000,48515=>1000,48516=>1000,48517=>1000,48518=>1000,48519=>1000,48520=>1000,48521=>1000,48522=>1000,48523=>1000,48524=>1000,48525=>1000,48526=>1000,48527=>1000,48528=>1000,48529=>1000,48530=>1000,48531=>1000,48532=>1000,48533=>1000,48534=>1000,48535=>1000,48536=>1000,48537=>1000,48538=>1000,48539=>1000,48540=>1000,48541=>1000,48542=>1000,48543=>1000,48544=>1000,48545=>1000,48546=>1000,48547=>1000,48548=>1000,48549=>1000,48550=>1000,48551=>1000,48552=>1000,48553=>1000,48554=>1000,48555=>1000,48556=>1000,48557=>1000,48558=>1000,48559=>1000,48560=>1000,48561=>1000,48562=>1000,48563=>1000,48564=>1000,48565=>1000,48566=>1000,48567=>1000,48568=>1000,48569=>1000,48570=>1000,48571=>1000,48572=>1000,48573=>1000,48574=>1000,48575=>1000,48576=>1000,48577=>1000,48578=>1000,48579=>1000,48580=>1000,48581=>1000,48582=>1000,48583=>1000,48584=>1000,48585=>1000,48586=>1000,48587=>1000,48588=>1000,48589=>1000,48590=>1000,48591=>1000,48592=>1000,48593=>1000,48594=>1000,48595=>1000,48596=>1000,48597=>1000,48598=>1000,48599=>1000,48600=>1000,48601=>1000,48602=>1000,48603=>1000,48604=>1000,48605=>1000,48606=>1000,48607=>1000,48608=>1000,48609=>1000,48610=>1000,48611=>1000,48612=>1000,48613=>1000,48614=>1000,48615=>1000,48616=>1000,48617=>1000,48618=>1000,48619=>1000,48620=>1000,48621=>1000,48622=>1000,48623=>1000,48624=>1000,48625=>1000,48626=>1000,48627=>1000,48628=>1000,48629=>1000,48630=>1000,48631=>1000,48632=>1000,48633=>1000,48634=>1000,48635=>1000,48636=>1000,48637=>1000,48638=>1000,48639=>1000,48640=>1000,48641=>1000,48642=>1000,48643=>1000,48644=>1000,48645=>1000,48646=>1000,48647=>1000,48648=>1000,48649=>1000,48650=>1000,48651=>1000,48652=>1000,48653=>1000,48654=>1000,48655=>1000,48656=>1000,48657=>1000,48658=>1000,48659=>1000,48660=>1000,48661=>1000,48662=>1000,48663=>1000,48664=>1000,48665=>1000,48666=>1000,48667=>1000,48668=>1000,48669=>1000,48670=>1000,48671=>1000,48672=>1000,48673=>1000,48674=>1000,48675=>1000,48676=>1000,48677=>1000,48678=>1000,48679=>1000,48680=>1000,48681=>1000,48682=>1000,48683=>1000,48684=>1000,48685=>1000,48686=>1000,48687=>1000,48688=>1000,48689=>1000,48690=>1000,48691=>1000,48692=>1000,48693=>1000,48694=>1000,48695=>1000,48696=>1000,48697=>1000,48698=>1000,48699=>1000,48700=>1000,48701=>1000,48702=>1000,48703=>1000,48704=>1000,48705=>1000,48706=>1000,48707=>1000,48708=>1000,48709=>1000,48710=>1000,48711=>1000,48712=>1000,48713=>1000,48714=>1000,48715=>1000,48716=>1000,48717=>1000,48718=>1000,48719=>1000,48720=>1000,48721=>1000,48722=>1000,48723=>1000,48724=>1000,48725=>1000,48726=>1000,48727=>1000,48728=>1000,48729=>1000,48730=>1000,48731=>1000,48732=>1000,48733=>1000,48734=>1000,48735=>1000,48736=>1000,48737=>1000,48738=>1000,48739=>1000,48740=>1000,48741=>1000,48742=>1000,48743=>1000,48744=>1000,48745=>1000,48746=>1000,48747=>1000,48748=>1000,48749=>1000,48750=>1000,48751=>1000,48752=>1000,48753=>1000,48754=>1000,48755=>1000,48756=>1000,48757=>1000,48758=>1000,48759=>1000,48760=>1000,48761=>1000,48762=>1000,48763=>1000,48764=>1000,48765=>1000,48766=>1000,48767=>1000,48768=>1000,48769=>1000,48770=>1000,48771=>1000,48772=>1000,48773=>1000,48774=>1000,48775=>1000,48776=>1000,48777=>1000,48778=>1000,48779=>1000,48780=>1000,48781=>1000,48782=>1000,48783=>1000,48784=>1000,48785=>1000,48786=>1000,48787=>1000,48788=>1000,48789=>1000,48790=>1000,48791=>1000,48792=>1000,48793=>1000,48794=>1000,48795=>1000,48796=>1000,48797=>1000,48798=>1000,48799=>1000,48800=>1000,48801=>1000,48802=>1000,48803=>1000,48804=>1000,48805=>1000,48806=>1000,48807=>1000,48808=>1000,48809=>1000,48810=>1000,48811=>1000,48812=>1000,48813=>1000,48814=>1000,48815=>1000,48816=>1000,48817=>1000,48818=>1000,48819=>1000,48820=>1000,48821=>1000,48822=>1000,48823=>1000,48824=>1000,48825=>1000,48826=>1000,48827=>1000,48828=>1000,48829=>1000,48830=>1000,48831=>1000,48832=>1000,48833=>1000,48834=>1000,48835=>1000,48836=>1000,48837=>1000,48838=>1000,48839=>1000,48840=>1000,48841=>1000,48842=>1000,48843=>1000,48844=>1000,48845=>1000,48846=>1000,48847=>1000,48848=>1000,48849=>1000,48850=>1000,48851=>1000,48852=>1000,48853=>1000,48854=>1000,48855=>1000,48856=>1000,48857=>1000,48858=>1000,48859=>1000,48860=>1000,48861=>1000,48862=>1000,48863=>1000,48864=>1000,48865=>1000,48866=>1000,48867=>1000,48868=>1000,48869=>1000,48870=>1000,48871=>1000,48872=>1000,48873=>1000,48874=>1000,48875=>1000,48876=>1000,48877=>1000,48878=>1000,48879=>1000,48880=>1000,48881=>1000,48882=>1000,48883=>1000,48884=>1000,48885=>1000,48886=>1000,48887=>1000,48888=>1000,48889=>1000,48890=>1000,48891=>1000,48892=>1000,48893=>1000,48894=>1000,48895=>1000,48896=>1000,48897=>1000,48898=>1000,48899=>1000,48900=>1000,48901=>1000,48902=>1000,48903=>1000,48904=>1000,48905=>1000,48906=>1000,48907=>1000,48908=>1000,48909=>1000,48910=>1000,48911=>1000,48912=>1000,48913=>1000,48914=>1000,48915=>1000,48916=>1000,48917=>1000,48918=>1000,48919=>1000,48920=>1000,48921=>1000,48922=>1000,48923=>1000,48924=>1000,48925=>1000,48926=>1000,48927=>1000,48928=>1000,48929=>1000,48930=>1000,48931=>1000,48932=>1000,48933=>1000,48934=>1000,48935=>1000,48936=>1000,48937=>1000,48938=>1000,48939=>1000,48940=>1000,48941=>1000,48942=>1000,48943=>1000,48944=>1000,48945=>1000,48946=>1000,48947=>1000,48948=>1000,48949=>1000,48950=>1000,48951=>1000,48952=>1000,48953=>1000,48954=>1000,48955=>1000,48956=>1000,48957=>1000,48958=>1000,48959=>1000,48960=>1000,48961=>1000,48962=>1000,48963=>1000,48964=>1000,48965=>1000,48966=>1000,48967=>1000,48968=>1000,48969=>1000,48970=>1000,48971=>1000,48972=>1000,48973=>1000,48974=>1000,48975=>1000,48976=>1000,48977=>1000,48978=>1000,48979=>1000,48980=>1000,48981=>1000,48982=>1000,48983=>1000,48984=>1000,48985=>1000,48986=>1000,48987=>1000,48988=>1000,48989=>1000,48990=>1000,48991=>1000,48992=>1000,48993=>1000,48994=>1000,48995=>1000,48996=>1000,48997=>1000,48998=>1000,48999=>1000,49000=>1000,49001=>1000,49002=>1000,49003=>1000,49004=>1000,49005=>1000,49006=>1000,49007=>1000,49008=>1000,49009=>1000,49010=>1000,49011=>1000,49012=>1000,49013=>1000,49014=>1000,49015=>1000,49016=>1000,49017=>1000,49018=>1000,49019=>1000,49020=>1000,49021=>1000,49022=>1000,49023=>1000,49024=>1000,49025=>1000,49026=>1000,49027=>1000,49028=>1000,49029=>1000,49030=>1000,49031=>1000,49032=>1000,49033=>1000,49034=>1000,49035=>1000,49036=>1000,49037=>1000,49038=>1000,49039=>1000,49040=>1000,49041=>1000,49042=>1000,49043=>1000,49044=>1000,49045=>1000,49046=>1000,49047=>1000,49048=>1000,49049=>1000,49050=>1000,49051=>1000,49052=>1000,49053=>1000,49054=>1000,49055=>1000,49056=>1000,49057=>1000,49058=>1000,49059=>1000,49060=>1000,49061=>1000,49062=>1000,49063=>1000,49064=>1000,49065=>1000,49066=>1000,49067=>1000,49068=>1000,49069=>1000,49070=>1000,49071=>1000,49072=>1000,49073=>1000,49074=>1000,49075=>1000,49076=>1000,49077=>1000,49078=>1000,49079=>1000,49080=>1000,49081=>1000,49082=>1000,49083=>1000,49084=>1000,49085=>1000,49086=>1000,49087=>1000,49088=>1000,49089=>1000,49090=>1000,49091=>1000,49092=>1000,49093=>1000,49094=>1000,49095=>1000,49096=>1000,49097=>1000,49098=>1000,49099=>1000,49100=>1000,49101=>1000,49102=>1000,49103=>1000,49104=>1000,49105=>1000,49106=>1000,49107=>1000,49108=>1000,49109=>1000,49110=>1000,49111=>1000,49112=>1000,49113=>1000,49114=>1000,49115=>1000,49116=>1000,49117=>1000,49118=>1000,49119=>1000,49120=>1000,49121=>1000,49122=>1000,49123=>1000,49124=>1000,49125=>1000,49126=>1000,49127=>1000,49128=>1000,49129=>1000,49130=>1000,49131=>1000,49132=>1000,49133=>1000,49134=>1000,49135=>1000,49136=>1000,49137=>1000,49138=>1000,49139=>1000,49140=>1000,49141=>1000,49142=>1000,49143=>1000,49144=>1000,49145=>1000,49146=>1000,49147=>1000,49148=>1000,49149=>1000,49150=>1000,49151=>1000,49152=>1000,49153=>1000,49154=>1000,49155=>1000,49156=>1000,49157=>1000,49158=>1000,49159=>1000,49160=>1000,49161=>1000,49162=>1000,49163=>1000,49164=>1000,49165=>1000,49166=>1000,49167=>1000,49168=>1000,49169=>1000,49170=>1000,49171=>1000,49172=>1000,49173=>1000,49174=>1000,49175=>1000,49176=>1000,49177=>1000,49178=>1000,49179=>1000,49180=>1000,49181=>1000,49182=>1000,49183=>1000,49184=>1000,49185=>1000,49186=>1000,49187=>1000,49188=>1000,49189=>1000,49190=>1000,49191=>1000,49192=>1000,49193=>1000,49194=>1000,49195=>1000,49196=>1000,49197=>1000,49198=>1000,49199=>1000,49200=>1000,49201=>1000,49202=>1000,49203=>1000,49204=>1000,49205=>1000,49206=>1000,49207=>1000,49208=>1000,49209=>1000,49210=>1000,49211=>1000,49212=>1000,49213=>1000,49214=>1000,49215=>1000,49216=>1000,49217=>1000,49218=>1000,49219=>1000,49220=>1000,49221=>1000,49222=>1000,49223=>1000,49224=>1000,49225=>1000,49226=>1000,49227=>1000,49228=>1000,49229=>1000,49230=>1000,49231=>1000,49232=>1000,49233=>1000,49234=>1000,49235=>1000,49236=>1000,49237=>1000,49238=>1000,49239=>1000,49240=>1000,49241=>1000,49242=>1000,49243=>1000,49244=>1000,49245=>1000,49246=>1000,49247=>1000,49248=>1000,49249=>1000,49250=>1000,49251=>1000,49252=>1000,49253=>1000,49254=>1000,49255=>1000,49256=>1000,49257=>1000,49258=>1000,49259=>1000,49260=>1000,49261=>1000,49262=>1000,49263=>1000,49264=>1000,49265=>1000,49266=>1000,49267=>1000,49268=>1000,49269=>1000,49270=>1000,49271=>1000,49272=>1000,49273=>1000,49274=>1000,49275=>1000,49276=>1000,49277=>1000,49278=>1000,49279=>1000,49280=>1000,49281=>1000,49282=>1000,49283=>1000,49284=>1000,49285=>1000,49286=>1000,49287=>1000,49288=>1000,49289=>1000,49290=>1000,49291=>1000,49292=>1000,49293=>1000,49294=>1000,49295=>1000,49296=>1000,49297=>1000,49298=>1000,49299=>1000,49300=>1000,49301=>1000,49302=>1000,49303=>1000,49304=>1000,49305=>1000,49306=>1000,49307=>1000,49308=>1000,49309=>1000,49310=>1000,49311=>1000,49312=>1000,49313=>1000,49314=>1000,49315=>1000,49316=>1000,49317=>1000,49318=>1000,49319=>1000,49320=>1000,49321=>1000,49322=>1000,49323=>1000,49324=>1000,49325=>1000,49326=>1000,49327=>1000,49328=>1000,49329=>1000,49330=>1000,49331=>1000,49332=>1000,49333=>1000,49334=>1000,49335=>1000,49336=>1000,49337=>1000,49338=>1000,49339=>1000,49340=>1000,49341=>1000,49342=>1000,49343=>1000,49344=>1000,49345=>1000,49346=>1000,49347=>1000,49348=>1000,49349=>1000,49350=>1000,49351=>1000,49352=>1000,49353=>1000,49354=>1000,49355=>1000,49356=>1000,49357=>1000,49358=>1000,49359=>1000,49360=>1000,49361=>1000,49362=>1000,49363=>1000,49364=>1000,49365=>1000,49366=>1000,49367=>1000,49368=>1000,49369=>1000,49370=>1000,49371=>1000,49372=>1000,49373=>1000,49374=>1000,49375=>1000,49376=>1000,49377=>1000,49378=>1000,49379=>1000,49380=>1000,49381=>1000,49382=>1000,49383=>1000,49384=>1000,49385=>1000,49386=>1000,49387=>1000,49388=>1000,49389=>1000,49390=>1000,49391=>1000,49392=>1000,49393=>1000,49394=>1000,49395=>1000,49396=>1000,49397=>1000,49398=>1000,49399=>1000,49400=>1000,49401=>1000,49402=>1000,49403=>1000,49404=>1000,49405=>1000,49406=>1000,49407=>1000,49408=>1000,49409=>1000,49410=>1000,49411=>1000,49412=>1000,49413=>1000,49414=>1000,49415=>1000,49416=>1000,49417=>1000,49418=>1000,49419=>1000,49420=>1000,49421=>1000,49422=>1000,49423=>1000,49424=>1000,49425=>1000,49426=>1000,49427=>1000,49428=>1000,49429=>1000,49430=>1000,49431=>1000,49432=>1000,49433=>1000,49434=>1000,49435=>1000,49436=>1000,49437=>1000,49438=>1000,49439=>1000,49440=>1000,49441=>1000,49442=>1000,49443=>1000,49444=>1000,49445=>1000,49446=>1000,49447=>1000,49448=>1000,49449=>1000,49450=>1000,49451=>1000,49452=>1000,49453=>1000,49454=>1000,49455=>1000,49456=>1000,49457=>1000,49458=>1000,49459=>1000,49460=>1000,49461=>1000,49462=>1000,49463=>1000,49464=>1000,49465=>1000,49466=>1000,49467=>1000,49468=>1000,49469=>1000,49470=>1000,49471=>1000,49472=>1000,49473=>1000,49474=>1000,49475=>1000,49476=>1000,49477=>1000,49478=>1000,49479=>1000,49480=>1000,49481=>1000,49482=>1000,49483=>1000,49484=>1000,49485=>1000,49486=>1000,49487=>1000,49488=>1000,49489=>1000,49490=>1000,49491=>1000,49492=>1000,49493=>1000,49494=>1000,49495=>1000,49496=>1000,49497=>1000,49498=>1000,49499=>1000,49500=>1000,49501=>1000,49502=>1000,49503=>1000,49504=>1000,49505=>1000,49506=>1000,49507=>1000,49508=>1000,49509=>1000,49510=>1000,49511=>1000,49512=>1000,49513=>1000,49514=>1000,49515=>1000,49516=>1000,49517=>1000,49518=>1000,49519=>1000,49520=>1000,49521=>1000,49522=>1000,49523=>1000,49524=>1000,49525=>1000,49526=>1000,49527=>1000,49528=>1000,49529=>1000,49530=>1000,49531=>1000,49532=>1000,49533=>1000,49534=>1000,49535=>1000,49536=>1000,49537=>1000,49538=>1000,49539=>1000,49540=>1000,49541=>1000,49542=>1000,49543=>1000,49544=>1000,49545=>1000,49546=>1000,49547=>1000,49548=>1000,49549=>1000,49550=>1000,49551=>1000,49552=>1000,49553=>1000,49554=>1000,49555=>1000,49556=>1000,49557=>1000,49558=>1000,49559=>1000,49560=>1000,49561=>1000,49562=>1000,49563=>1000,49564=>1000,49565=>1000,49566=>1000,49567=>1000,49568=>1000,49569=>1000,49570=>1000,49571=>1000,49572=>1000,49573=>1000,49574=>1000,49575=>1000,49576=>1000,49577=>1000,49578=>1000,49579=>1000,49580=>1000,49581=>1000,49582=>1000,49583=>1000,49584=>1000,49585=>1000,49586=>1000,49587=>1000,49588=>1000,49589=>1000,49590=>1000,49591=>1000,49592=>1000,49593=>1000,49594=>1000,49595=>1000,49596=>1000,49597=>1000,49598=>1000,49599=>1000,49600=>1000,49601=>1000,49602=>1000,49603=>1000,49604=>1000,49605=>1000,49606=>1000,49607=>1000,49608=>1000,49609=>1000,49610=>1000,49611=>1000,49612=>1000,49613=>1000,49614=>1000,49615=>1000,49616=>1000,49617=>1000,49618=>1000,49619=>1000,49620=>1000,49621=>1000,49622=>1000,49623=>1000,49624=>1000,49625=>1000,49626=>1000,49627=>1000,49628=>1000,49629=>1000,49630=>1000,49631=>1000,49632=>1000,49633=>1000,49634=>1000,49635=>1000,49636=>1000,49637=>1000,49638=>1000,49639=>1000,49640=>1000,49641=>1000,49642=>1000,49643=>1000,49644=>1000,49645=>1000,49646=>1000,49647=>1000,49648=>1000,49649=>1000,49650=>1000,49651=>1000,49652=>1000,49653=>1000,49654=>1000,49655=>1000,49656=>1000,49657=>1000,49658=>1000,49659=>1000,49660=>1000,49661=>1000,49662=>1000,49663=>1000,49664=>1000,49665=>1000,49666=>1000,49667=>1000,49668=>1000,49669=>1000,49670=>1000,49671=>1000,49672=>1000,49673=>1000,49674=>1000,49675=>1000,49676=>1000,49677=>1000,49678=>1000,49679=>1000,49680=>1000,49681=>1000,49682=>1000,49683=>1000,49684=>1000,49685=>1000,49686=>1000,49687=>1000,49688=>1000,49689=>1000,49690=>1000,49691=>1000,49692=>1000,49693=>1000,49694=>1000,49695=>1000,49696=>1000,49697=>1000,49698=>1000,49699=>1000,49700=>1000,49701=>1000,49702=>1000,49703=>1000,49704=>1000,49705=>1000,49706=>1000,49707=>1000,49708=>1000,49709=>1000,49710=>1000,49711=>1000,49712=>1000,49713=>1000,49714=>1000,49715=>1000,49716=>1000,49717=>1000,49718=>1000,49719=>1000,49720=>1000,49721=>1000,49722=>1000,49723=>1000,49724=>1000,49725=>1000,49726=>1000,49727=>1000,49728=>1000,49729=>1000,49730=>1000,49731=>1000,49732=>1000,49733=>1000,49734=>1000,49735=>1000,49736=>1000,49737=>1000,49738=>1000,49739=>1000,49740=>1000,49741=>1000,49742=>1000,49743=>1000,49744=>1000,49745=>1000,49746=>1000,49747=>1000,49748=>1000,49749=>1000,49750=>1000,49751=>1000,49752=>1000,49753=>1000,49754=>1000,49755=>1000,49756=>1000,49757=>1000,49758=>1000,49759=>1000,49760=>1000,49761=>1000,49762=>1000,49763=>1000,49764=>1000,49765=>1000,49766=>1000,49767=>1000,49768=>1000,49769=>1000,49770=>1000,49771=>1000,49772=>1000,49773=>1000,49774=>1000,49775=>1000,49776=>1000,49777=>1000,49778=>1000,49779=>1000,49780=>1000,49781=>1000,49782=>1000,49783=>1000,49784=>1000,49785=>1000,49786=>1000,49787=>1000,49788=>1000,49789=>1000,49790=>1000,49791=>1000,49792=>1000,49793=>1000,49794=>1000,49795=>1000,49796=>1000,49797=>1000,49798=>1000,49799=>1000,49800=>1000,49801=>1000,49802=>1000,49803=>1000,49804=>1000,49805=>1000,49806=>1000,49807=>1000,49808=>1000,49809=>1000,49810=>1000,49811=>1000,49812=>1000,49813=>1000,49814=>1000,49815=>1000,49816=>1000,49817=>1000,49818=>1000,49819=>1000,49820=>1000,49821=>1000,49822=>1000,49823=>1000,49824=>1000,49825=>1000,49826=>1000,49827=>1000,49828=>1000,49829=>1000,49830=>1000,49831=>1000,49832=>1000,49833=>1000,49834=>1000,49835=>1000,49836=>1000,49837=>1000,49838=>1000,49839=>1000,49840=>1000,49841=>1000,49842=>1000,49843=>1000,49844=>1000,49845=>1000,49846=>1000,49847=>1000,49848=>1000,49849=>1000,49850=>1000,49851=>1000,49852=>1000,49853=>1000,49854=>1000,49855=>1000,49856=>1000,49857=>1000,49858=>1000,49859=>1000,49860=>1000,49861=>1000,49862=>1000,49863=>1000,49864=>1000,49865=>1000,49866=>1000,49867=>1000,49868=>1000,49869=>1000,49870=>1000,49871=>1000,49872=>1000,49873=>1000,49874=>1000,49875=>1000,49876=>1000,49877=>1000,49878=>1000,49879=>1000,49880=>1000,49881=>1000,49882=>1000,49883=>1000,49884=>1000,49885=>1000,49886=>1000,49887=>1000,49888=>1000,49889=>1000,49890=>1000,49891=>1000,49892=>1000,49893=>1000,49894=>1000,49895=>1000,49896=>1000,49897=>1000,49898=>1000,49899=>1000,49900=>1000,49901=>1000,49902=>1000,49903=>1000,49904=>1000,49905=>1000,49906=>1000,49907=>1000,49908=>1000,49909=>1000,49910=>1000,49911=>1000,49912=>1000,49913=>1000,49914=>1000,49915=>1000,49916=>1000,49917=>1000,49918=>1000,49919=>1000,49920=>1000,49921=>1000,49922=>1000,49923=>1000,49924=>1000,49925=>1000,49926=>1000,49927=>1000,49928=>1000,49929=>1000,49930=>1000,49931=>1000,49932=>1000,49933=>1000,49934=>1000,49935=>1000,49936=>1000,49937=>1000,49938=>1000,49939=>1000,49940=>1000,49941=>1000,49942=>1000,49943=>1000,49944=>1000,49945=>1000,49946=>1000,49947=>1000,49948=>1000,49949=>1000,49950=>1000,49951=>1000,49952=>1000,49953=>1000,49954=>1000,49955=>1000,49956=>1000,49957=>1000,49958=>1000,49959=>1000,49960=>1000,49961=>1000,49962=>1000,49963=>1000,49964=>1000,49965=>1000,49966=>1000,49967=>1000,49968=>1000,49969=>1000,49970=>1000,49971=>1000,49972=>1000,49973=>1000,49974=>1000,49975=>1000,49976=>1000,49977=>1000,49978=>1000,49979=>1000,49980=>1000,49981=>1000,49982=>1000,49983=>1000,49984=>1000,49985=>1000,49986=>1000,49987=>1000,49988=>1000,49989=>1000,49990=>1000,49991=>1000,49992=>1000,49993=>1000,49994=>1000,49995=>1000,49996=>1000,49997=>1000,49998=>1000,49999=>1000,50000=>1000,50001=>1000,50002=>1000,50003=>1000,50004=>1000,50005=>1000,50006=>1000,50007=>1000,50008=>1000,50009=>1000,50010=>1000,50011=>1000,50012=>1000,50013=>1000,50014=>1000,50015=>1000,50016=>1000,50017=>1000,50018=>1000,50019=>1000,50020=>1000,50021=>1000,50022=>1000,50023=>1000,50024=>1000,50025=>1000,50026=>1000,50027=>1000,50028=>1000,50029=>1000,50030=>1000,50031=>1000,50032=>1000,50033=>1000,50034=>1000,50035=>1000,50036=>1000,50037=>1000,50038=>1000,50039=>1000,50040=>1000,50041=>1000,50042=>1000,50043=>1000,50044=>1000,50045=>1000,50046=>1000,50047=>1000,50048=>1000,50049=>1000,50050=>1000,50051=>1000,50052=>1000,50053=>1000,50054=>1000,50055=>1000,50056=>1000,50057=>1000,50058=>1000,50059=>1000,50060=>1000,50061=>1000,50062=>1000,50063=>1000,50064=>1000,50065=>1000,50066=>1000,50067=>1000,50068=>1000,50069=>1000,50070=>1000,50071=>1000,50072=>1000,50073=>1000,50074=>1000,50075=>1000,50076=>1000,50077=>1000,50078=>1000,50079=>1000,50080=>1000,50081=>1000,50082=>1000,50083=>1000,50084=>1000,50085=>1000,50086=>1000,50087=>1000,50088=>1000,50089=>1000,50090=>1000,50091=>1000,50092=>1000,50093=>1000,50094=>1000,50095=>1000,50096=>1000,50097=>1000,50098=>1000,50099=>1000,50100=>1000,50101=>1000,50102=>1000,50103=>1000,50104=>1000,50105=>1000,50106=>1000,50107=>1000,50108=>1000,50109=>1000,50110=>1000,50111=>1000,50112=>1000,50113=>1000,50114=>1000,50115=>1000,50116=>1000,50117=>1000,50118=>1000,50119=>1000,50120=>1000,50121=>1000,50122=>1000,50123=>1000,50124=>1000,50125=>1000,50126=>1000,50127=>1000,50128=>1000,50129=>1000,50130=>1000,50131=>1000,50132=>1000,50133=>1000,50134=>1000,50135=>1000,50136=>1000,50137=>1000,50138=>1000,50139=>1000,50140=>1000,50141=>1000,50142=>1000,50143=>1000,50144=>1000,50145=>1000,50146=>1000,50147=>1000,50148=>1000,50149=>1000,50150=>1000,50151=>1000,50152=>1000,50153=>1000,50154=>1000,50155=>1000,50156=>1000,50157=>1000,50158=>1000,50159=>1000,50160=>1000,50161=>1000,50162=>1000,50163=>1000,50164=>1000,50165=>1000,50166=>1000,50167=>1000,50168=>1000,50169=>1000,50170=>1000,50171=>1000,50172=>1000,50173=>1000,50174=>1000,50175=>1000,50176=>1000,50177=>1000,50178=>1000,50179=>1000,50180=>1000,50181=>1000,50182=>1000,50183=>1000,50184=>1000,50185=>1000,50186=>1000,50187=>1000,50188=>1000,50189=>1000,50190=>1000,50191=>1000,50192=>1000,50193=>1000,50194=>1000,50195=>1000,50196=>1000,50197=>1000,50198=>1000,50199=>1000,50200=>1000,50201=>1000,50202=>1000,50203=>1000,50204=>1000,50205=>1000,50206=>1000,50207=>1000,50208=>1000,50209=>1000,50210=>1000,50211=>1000,50212=>1000,50213=>1000,50214=>1000,50215=>1000,50216=>1000,50217=>1000,50218=>1000,50219=>1000,50220=>1000,50221=>1000,50222=>1000,50223=>1000,50224=>1000,50225=>1000,50226=>1000,50227=>1000,50228=>1000,50229=>1000,50230=>1000,50231=>1000,50232=>1000,50233=>1000,50234=>1000,50235=>1000,50236=>1000,50237=>1000,50238=>1000,50239=>1000,50240=>1000,50241=>1000,50242=>1000,50243=>1000,50244=>1000,50245=>1000,50246=>1000,50247=>1000,50248=>1000,50249=>1000,50250=>1000,50251=>1000,50252=>1000,50253=>1000,50254=>1000,50255=>1000,50256=>1000,50257=>1000,50258=>1000,50259=>1000,50260=>1000,50261=>1000,50262=>1000,50263=>1000,50264=>1000,50265=>1000,50266=>1000,50267=>1000,50268=>1000,50269=>1000,50270=>1000,50271=>1000,50272=>1000,50273=>1000,50274=>1000,50275=>1000,50276=>1000,50277=>1000,50278=>1000,50279=>1000,50280=>1000,50281=>1000,50282=>1000,50283=>1000,50284=>1000,50285=>1000,50286=>1000,50287=>1000,50288=>1000,50289=>1000,50290=>1000,50291=>1000,50292=>1000,50293=>1000,50294=>1000,50295=>1000,50296=>1000,50297=>1000,50298=>1000,50299=>1000,50300=>1000,50301=>1000,50302=>1000,50303=>1000,50304=>1000,50305=>1000,50306=>1000,50307=>1000,50308=>1000,50309=>1000,50310=>1000,50311=>1000,50312=>1000,50313=>1000,50314=>1000,50315=>1000,50316=>1000,50317=>1000,50318=>1000,50319=>1000,50320=>1000,50321=>1000,50322=>1000,50323=>1000,50324=>1000,50325=>1000,50326=>1000,50327=>1000,50328=>1000,50329=>1000,50330=>1000,50331=>1000,50332=>1000,50333=>1000,50334=>1000,50335=>1000,50336=>1000,50337=>1000,50338=>1000,50339=>1000,50340=>1000,50341=>1000,50342=>1000,50343=>1000,50344=>1000,50345=>1000,50346=>1000,50347=>1000,50348=>1000,50349=>1000,50350=>1000,50351=>1000,50352=>1000,50353=>1000,50354=>1000,50355=>1000,50356=>1000,50357=>1000,50358=>1000,50359=>1000,50360=>1000,50361=>1000,50362=>1000,50363=>1000,50364=>1000,50365=>1000,50366=>1000,50367=>1000,50368=>1000,50369=>1000,50370=>1000,50371=>1000,50372=>1000,50373=>1000,50374=>1000,50375=>1000,50376=>1000,50377=>1000,50378=>1000,50379=>1000,50380=>1000,50381=>1000,50382=>1000,50383=>1000,50384=>1000,50385=>1000,50386=>1000,50387=>1000,50388=>1000,50389=>1000,50390=>1000,50391=>1000,50392=>1000,50393=>1000,50394=>1000,50395=>1000,50396=>1000,50397=>1000,50398=>1000,50399=>1000,50400=>1000,50401=>1000,50402=>1000,50403=>1000,50404=>1000,50405=>1000,50406=>1000,50407=>1000,50408=>1000,50409=>1000,50410=>1000,50411=>1000,50412=>1000,50413=>1000,50414=>1000,50415=>1000,50416=>1000,50417=>1000,50418=>1000,50419=>1000,50420=>1000,50421=>1000,50422=>1000,50423=>1000,50424=>1000,50425=>1000,50426=>1000,50427=>1000,50428=>1000,50429=>1000,50430=>1000,50431=>1000,50432=>1000,50433=>1000,50434=>1000,50435=>1000,50436=>1000,50437=>1000,50438=>1000,50439=>1000,50440=>1000,50441=>1000,50442=>1000,50443=>1000,50444=>1000,50445=>1000,50446=>1000,50447=>1000,50448=>1000,50449=>1000,50450=>1000,50451=>1000,50452=>1000,50453=>1000,50454=>1000,50455=>1000,50456=>1000,50457=>1000,50458=>1000,50459=>1000,50460=>1000,50461=>1000,50462=>1000,50463=>1000,50464=>1000,50465=>1000,50466=>1000,50467=>1000,50468=>1000,50469=>1000,50470=>1000,50471=>1000,50472=>1000,50473=>1000,50474=>1000,50475=>1000,50476=>1000,50477=>1000,50478=>1000,50479=>1000,50480=>1000,50481=>1000,50482=>1000,50483=>1000,50484=>1000,50485=>1000,50486=>1000,50487=>1000,50488=>1000,50489=>1000,50490=>1000,50491=>1000,50492=>1000,50493=>1000,50494=>1000,50495=>1000,50496=>1000,50497=>1000,50498=>1000,50499=>1000,50500=>1000,50501=>1000,50502=>1000,50503=>1000,50504=>1000,50505=>1000,50506=>1000,50507=>1000,50508=>1000,50509=>1000,50510=>1000,50511=>1000,50512=>1000,50513=>1000,50514=>1000,50515=>1000,50516=>1000,50517=>1000,50518=>1000,50519=>1000,50520=>1000,50521=>1000,50522=>1000,50523=>1000,50524=>1000,50525=>1000,50526=>1000,50527=>1000,50528=>1000,50529=>1000,50530=>1000,50531=>1000,50532=>1000,50533=>1000,50534=>1000,50535=>1000,50536=>1000,50537=>1000,50538=>1000,50539=>1000,50540=>1000,50541=>1000,50542=>1000,50543=>1000,50544=>1000,50545=>1000,50546=>1000,50547=>1000,50548=>1000,50549=>1000,50550=>1000,50551=>1000,50552=>1000,50553=>1000,50554=>1000,50555=>1000,50556=>1000,50557=>1000,50558=>1000,50559=>1000,50560=>1000,50561=>1000,50562=>1000,50563=>1000,50564=>1000,50565=>1000,50566=>1000,50567=>1000,50568=>1000,50569=>1000,50570=>1000,50571=>1000,50572=>1000,50573=>1000,50574=>1000,50575=>1000,50576=>1000,50577=>1000,50578=>1000,50579=>1000,50580=>1000,50581=>1000,50582=>1000,50583=>1000,50584=>1000,50585=>1000,50586=>1000,50587=>1000,50588=>1000,50589=>1000,50590=>1000,50591=>1000,50592=>1000,50593=>1000,50594=>1000,50595=>1000,50596=>1000,50597=>1000,50598=>1000,50599=>1000,50600=>1000,50601=>1000,50602=>1000,50603=>1000,50604=>1000,50605=>1000,50606=>1000,50607=>1000,50608=>1000,50609=>1000,50610=>1000,50611=>1000,50612=>1000,50613=>1000,50614=>1000,50615=>1000,50616=>1000,50617=>1000,50618=>1000,50619=>1000,50620=>1000,50621=>1000,50622=>1000,50623=>1000,50624=>1000,50625=>1000,50626=>1000,50627=>1000,50628=>1000,50629=>1000,50630=>1000,50631=>1000,50632=>1000,50633=>1000,50634=>1000,50635=>1000,50636=>1000,50637=>1000,50638=>1000,50639=>1000,50640=>1000,50641=>1000,50642=>1000,50643=>1000,50644=>1000,50645=>1000,50646=>1000,50647=>1000,50648=>1000,50649=>1000,50650=>1000,50651=>1000,50652=>1000,50653=>1000,50654=>1000,50655=>1000,50656=>1000,50657=>1000,50658=>1000,50659=>1000,50660=>1000,50661=>1000,50662=>1000,50663=>1000,50664=>1000,50665=>1000,50666=>1000,50667=>1000,50668=>1000,50669=>1000,50670=>1000,50671=>1000,50672=>1000,50673=>1000,50674=>1000,50675=>1000,50676=>1000,50677=>1000,50678=>1000,50679=>1000,50680=>1000,50681=>1000,50682=>1000,50683=>1000,50684=>1000,50685=>1000,50686=>1000,50687=>1000,50688=>1000,50689=>1000,50690=>1000,50691=>1000,50692=>1000,50693=>1000,50694=>1000,50695=>1000,50696=>1000,50697=>1000,50698=>1000,50699=>1000,50700=>1000,50701=>1000,50702=>1000,50703=>1000,50704=>1000,50705=>1000,50706=>1000,50707=>1000,50708=>1000,50709=>1000,50710=>1000,50711=>1000,50712=>1000,50713=>1000,50714=>1000,50715=>1000,50716=>1000,50717=>1000,50718=>1000,50719=>1000,50720=>1000,50721=>1000,50722=>1000,50723=>1000,50724=>1000,50725=>1000,50726=>1000,50727=>1000,50728=>1000,50729=>1000,50730=>1000,50731=>1000,50732=>1000,50733=>1000,50734=>1000,50735=>1000,50736=>1000,50737=>1000,50738=>1000,50739=>1000,50740=>1000,50741=>1000,50742=>1000,50743=>1000,50744=>1000,50745=>1000,50746=>1000,50747=>1000,50748=>1000,50749=>1000,50750=>1000,50751=>1000,50752=>1000,50753=>1000,50754=>1000,50755=>1000,50756=>1000,50757=>1000,50758=>1000,50759=>1000,50760=>1000,50761=>1000,50762=>1000,50763=>1000,50764=>1000,50765=>1000,50766=>1000,50767=>1000,50768=>1000,50769=>1000,50770=>1000,50771=>1000,50772=>1000,50773=>1000,50774=>1000,50775=>1000,50776=>1000,50777=>1000,50778=>1000,50779=>1000,50780=>1000,50781=>1000,50782=>1000,50783=>1000,50784=>1000,50785=>1000,50786=>1000,50787=>1000,50788=>1000,50789=>1000,50790=>1000,50791=>1000,50792=>1000,50793=>1000,50794=>1000,50795=>1000,50796=>1000,50797=>1000,50798=>1000,50799=>1000,50800=>1000,50801=>1000,50802=>1000,50803=>1000,50804=>1000,50805=>1000,50806=>1000,50807=>1000,50808=>1000,50809=>1000,50810=>1000,50811=>1000,50812=>1000,50813=>1000,50814=>1000,50815=>1000,50816=>1000,50817=>1000,50818=>1000,50819=>1000,50820=>1000,50821=>1000,50822=>1000,50823=>1000,50824=>1000,50825=>1000,50826=>1000,50827=>1000,50828=>1000,50829=>1000,50830=>1000,50831=>1000,50832=>1000,50833=>1000,50834=>1000,50835=>1000,50836=>1000,50837=>1000,50838=>1000,50839=>1000,50840=>1000,50841=>1000,50842=>1000,50843=>1000,50844=>1000,50845=>1000,50846=>1000,50847=>1000,50848=>1000,50849=>1000,50850=>1000,50851=>1000,50852=>1000,50853=>1000,50854=>1000,50855=>1000,50856=>1000,50857=>1000,50858=>1000,50859=>1000,50860=>1000,50861=>1000,50862=>1000,50863=>1000,50864=>1000,50865=>1000,50866=>1000,50867=>1000,50868=>1000,50869=>1000,50870=>1000,50871=>1000,50872=>1000,50873=>1000,50874=>1000,50875=>1000,50876=>1000,50877=>1000,50878=>1000,50879=>1000,50880=>1000,50881=>1000,50882=>1000,50883=>1000,50884=>1000,50885=>1000,50886=>1000,50887=>1000,50888=>1000,50889=>1000,50890=>1000,50891=>1000,50892=>1000,50893=>1000,50894=>1000,50895=>1000,50896=>1000,50897=>1000,50898=>1000,50899=>1000,50900=>1000,50901=>1000,50902=>1000,50903=>1000,50904=>1000,50905=>1000,50906=>1000,50907=>1000,50908=>1000,50909=>1000,50910=>1000,50911=>1000,50912=>1000,50913=>1000,50914=>1000,50915=>1000,50916=>1000,50917=>1000,50918=>1000,50919=>1000,50920=>1000,50921=>1000,50922=>1000,50923=>1000,50924=>1000,50925=>1000,50926=>1000,50927=>1000,50928=>1000,50929=>1000,50930=>1000,50931=>1000,50932=>1000,50933=>1000,50934=>1000,50935=>1000,50936=>1000,50937=>1000,50938=>1000,50939=>1000,50940=>1000,50941=>1000,50942=>1000,50943=>1000,50944=>1000,50945=>1000,50946=>1000,50947=>1000,50948=>1000,50949=>1000,50950=>1000,50951=>1000,50952=>1000,50953=>1000,50954=>1000,50955=>1000,50956=>1000,50957=>1000,50958=>1000,50959=>1000,50960=>1000,50961=>1000,50962=>1000,50963=>1000,50964=>1000,50965=>1000,50966=>1000,50967=>1000,50968=>1000,50969=>1000,50970=>1000,50971=>1000,50972=>1000,50973=>1000,50974=>1000,50975=>1000,50976=>1000,50977=>1000,50978=>1000,50979=>1000,50980=>1000,50981=>1000,50982=>1000,50983=>1000,50984=>1000,50985=>1000,50986=>1000,50987=>1000,50988=>1000,50989=>1000,50990=>1000,50991=>1000,50992=>1000,50993=>1000,50994=>1000,50995=>1000,50996=>1000,50997=>1000,50998=>1000,50999=>1000,51000=>1000,51001=>1000,51002=>1000,51003=>1000,51004=>1000,51005=>1000,51006=>1000,51007=>1000,51008=>1000,51009=>1000,51010=>1000,51011=>1000,51012=>1000,51013=>1000,51014=>1000,51015=>1000,51016=>1000,51017=>1000,51018=>1000,51019=>1000,51020=>1000,51021=>1000,51022=>1000,51023=>1000,51024=>1000,51025=>1000,51026=>1000,51027=>1000,51028=>1000,51029=>1000,51030=>1000,51031=>1000,51032=>1000,51033=>1000,51034=>1000,51035=>1000,51036=>1000,51037=>1000,51038=>1000,51039=>1000,51040=>1000,51041=>1000,51042=>1000,51043=>1000,51044=>1000,51045=>1000,51046=>1000,51047=>1000,51048=>1000,51049=>1000,51050=>1000,51051=>1000,51052=>1000,51053=>1000,51054=>1000,51055=>1000,51056=>1000,51057=>1000,51058=>1000,51059=>1000,51060=>1000,51061=>1000,51062=>1000,51063=>1000,51064=>1000,51065=>1000,51066=>1000,51067=>1000,51068=>1000,51069=>1000,51070=>1000,51071=>1000,51072=>1000,51073=>1000,51074=>1000,51075=>1000,51076=>1000,51077=>1000,51078=>1000,51079=>1000,51080=>1000,51081=>1000,51082=>1000,51083=>1000,51084=>1000,51085=>1000,51086=>1000,51087=>1000,51088=>1000,51089=>1000,51090=>1000,51091=>1000,51092=>1000,51093=>1000,51094=>1000,51095=>1000,51096=>1000,51097=>1000,51098=>1000,51099=>1000,51100=>1000,51101=>1000,51102=>1000,51103=>1000,51104=>1000,51105=>1000,51106=>1000,51107=>1000,51108=>1000,51109=>1000,51110=>1000,51111=>1000,51112=>1000,51113=>1000,51114=>1000,51115=>1000,51116=>1000,51117=>1000,51118=>1000,51119=>1000,51120=>1000,51121=>1000,51122=>1000,51123=>1000,51124=>1000,51125=>1000,51126=>1000,51127=>1000,51128=>1000,51129=>1000,51130=>1000,51131=>1000,51132=>1000,51133=>1000,51134=>1000,51135=>1000,51136=>1000,51137=>1000,51138=>1000,51139=>1000,51140=>1000,51141=>1000,51142=>1000,51143=>1000,51144=>1000,51145=>1000,51146=>1000,51147=>1000,51148=>1000,51149=>1000,51150=>1000,51151=>1000,51152=>1000,51153=>1000,51154=>1000,51155=>1000,51156=>1000,51157=>1000,51158=>1000,51159=>1000,51160=>1000,51161=>1000,51162=>1000,51163=>1000,51164=>1000,51165=>1000,51166=>1000,51167=>1000,51168=>1000,51169=>1000,51170=>1000,51171=>1000,51172=>1000,51173=>1000,51174=>1000,51175=>1000,51176=>1000,51177=>1000,51178=>1000,51179=>1000,51180=>1000,51181=>1000,51182=>1000,51183=>1000,51184=>1000,51185=>1000,51186=>1000,51187=>1000,51188=>1000,51189=>1000,51190=>1000,51191=>1000,51192=>1000,51193=>1000,51194=>1000,51195=>1000,51196=>1000,51197=>1000,51198=>1000,51199=>1000,51200=>1000,51201=>1000,51202=>1000,51203=>1000,51204=>1000,51205=>1000,51206=>1000,51207=>1000,51208=>1000,51209=>1000,51210=>1000,51211=>1000,51212=>1000,51213=>1000,51214=>1000,51215=>1000,51216=>1000,51217=>1000,51218=>1000,51219=>1000,51220=>1000,51221=>1000,51222=>1000,51223=>1000,51224=>1000,51225=>1000,51226=>1000,51227=>1000,51228=>1000,51229=>1000,51230=>1000,51231=>1000,51232=>1000,51233=>1000,51234=>1000,51235=>1000,51236=>1000,51237=>1000,51238=>1000,51239=>1000,51240=>1000,51241=>1000,51242=>1000,51243=>1000,51244=>1000,51245=>1000,51246=>1000,51247=>1000,51248=>1000,51249=>1000,51250=>1000,51251=>1000,51252=>1000,51253=>1000,51254=>1000,51255=>1000,51256=>1000,51257=>1000,51258=>1000,51259=>1000,51260=>1000,51261=>1000,51262=>1000,51263=>1000,51264=>1000,51265=>1000,51266=>1000,51267=>1000,51268=>1000,51269=>1000,51270=>1000,51271=>1000,51272=>1000,51273=>1000,51274=>1000,51275=>1000,51276=>1000,51277=>1000,51278=>1000,51279=>1000,51280=>1000,51281=>1000,51282=>1000,51283=>1000,51284=>1000,51285=>1000,51286=>1000,51287=>1000,51288=>1000,51289=>1000,51290=>1000,51291=>1000,51292=>1000,51293=>1000,51294=>1000,51295=>1000,51296=>1000,51297=>1000,51298=>1000,51299=>1000,51300=>1000,51301=>1000,51302=>1000,51303=>1000,51304=>1000,51305=>1000,51306=>1000,51307=>1000,51308=>1000,51309=>1000,51310=>1000,51311=>1000,51312=>1000,51313=>1000,51314=>1000,51315=>1000,51316=>1000,51317=>1000,51318=>1000,51319=>1000,51320=>1000,51321=>1000,51322=>1000,51323=>1000,51324=>1000,51325=>1000,51326=>1000,51327=>1000,51328=>1000,51329=>1000,51330=>1000,51331=>1000,51332=>1000,51333=>1000,51334=>1000,51335=>1000,51336=>1000,51337=>1000,51338=>1000,51339=>1000,51340=>1000,51341=>1000,51342=>1000,51343=>1000,51344=>1000,51345=>1000,51346=>1000,51347=>1000,51348=>1000,51349=>1000,51350=>1000,51351=>1000,51352=>1000,51353=>1000,51354=>1000,51355=>1000,51356=>1000,51357=>1000,51358=>1000,51359=>1000,51360=>1000,51361=>1000,51362=>1000,51363=>1000,51364=>1000,51365=>1000,51366=>1000,51367=>1000,51368=>1000,51369=>1000,51370=>1000,51371=>1000,51372=>1000,51373=>1000,51374=>1000,51375=>1000,51376=>1000,51377=>1000,51378=>1000,51379=>1000,51380=>1000,51381=>1000,51382=>1000,51383=>1000,51384=>1000,51385=>1000,51386=>1000,51387=>1000,51388=>1000,51389=>1000,51390=>1000,51391=>1000,51392=>1000,51393=>1000,51394=>1000,51395=>1000,51396=>1000,51397=>1000,51398=>1000,51399=>1000,51400=>1000,51401=>1000,51402=>1000,51403=>1000,51404=>1000,51405=>1000,51406=>1000,51407=>1000,51408=>1000,51409=>1000,51410=>1000,51411=>1000,51412=>1000,51413=>1000,51414=>1000,51415=>1000,51416=>1000,51417=>1000,51418=>1000,51419=>1000,51420=>1000,51421=>1000,51422=>1000,51423=>1000,51424=>1000,51425=>1000,51426=>1000,51427=>1000,51428=>1000,51429=>1000,51430=>1000,51431=>1000,51432=>1000,51433=>1000,51434=>1000,51435=>1000,51436=>1000,51437=>1000,51438=>1000,51439=>1000,51440=>1000,51441=>1000,51442=>1000,51443=>1000,51444=>1000,51445=>1000,51446=>1000,51447=>1000,51448=>1000,51449=>1000,51450=>1000,51451=>1000,51452=>1000,51453=>1000,51454=>1000,51455=>1000,51456=>1000,51457=>1000,51458=>1000,51459=>1000,51460=>1000,51461=>1000,51462=>1000,51463=>1000,51464=>1000,51465=>1000,51466=>1000,51467=>1000,51468=>1000,51469=>1000,51470=>1000,51471=>1000,51472=>1000,51473=>1000,51474=>1000,51475=>1000,51476=>1000,51477=>1000,51478=>1000,51479=>1000,51480=>1000,51481=>1000,51482=>1000,51483=>1000,51484=>1000,51485=>1000,51486=>1000,51487=>1000,51488=>1000,51489=>1000,51490=>1000,51491=>1000,51492=>1000,51493=>1000,51494=>1000,51495=>1000,51496=>1000,51497=>1000,51498=>1000,51499=>1000,51500=>1000,51501=>1000,51502=>1000,51503=>1000,51504=>1000,51505=>1000,51506=>1000,51507=>1000,51508=>1000,51509=>1000,51510=>1000,51511=>1000,51512=>1000,51513=>1000,51514=>1000,51515=>1000,51516=>1000,51517=>1000,51518=>1000,51519=>1000,51520=>1000,51521=>1000,51522=>1000,51523=>1000,51524=>1000,51525=>1000,51526=>1000,51527=>1000,51528=>1000,51529=>1000,51530=>1000,51531=>1000,51532=>1000,51533=>1000,51534=>1000,51535=>1000,51536=>1000,51537=>1000,51538=>1000,51539=>1000,51540=>1000,51541=>1000,51542=>1000,51543=>1000,51544=>1000,51545=>1000,51546=>1000,51547=>1000,51548=>1000,51549=>1000,51550=>1000,51551=>1000,51552=>1000,51553=>1000,51554=>1000,51555=>1000,51556=>1000,51557=>1000,51558=>1000,51559=>1000,51560=>1000,51561=>1000,51562=>1000,51563=>1000,51564=>1000,51565=>1000,51566=>1000,51567=>1000,51568=>1000,51569=>1000,51570=>1000,51571=>1000,51572=>1000,51573=>1000,51574=>1000,51575=>1000,51576=>1000,51577=>1000,51578=>1000,51579=>1000,51580=>1000,51581=>1000,51582=>1000,51583=>1000,51584=>1000,51585=>1000,51586=>1000,51587=>1000,51588=>1000,51589=>1000,51590=>1000,51591=>1000,51592=>1000,51593=>1000,51594=>1000,51595=>1000,51596=>1000,51597=>1000,51598=>1000,51599=>1000,51600=>1000,51601=>1000,51602=>1000,51603=>1000,51604=>1000,51605=>1000,51606=>1000,51607=>1000,51608=>1000,51609=>1000,51610=>1000,51611=>1000,51612=>1000,51613=>1000,51614=>1000,51615=>1000,51616=>1000,51617=>1000,51618=>1000,51619=>1000,51620=>1000,51621=>1000,51622=>1000,51623=>1000,51624=>1000,51625=>1000,51626=>1000,51627=>1000,51628=>1000,51629=>1000,51630=>1000,51631=>1000,51632=>1000,51633=>1000,51634=>1000,51635=>1000,51636=>1000,51637=>1000,51638=>1000,51639=>1000,51640=>1000,51641=>1000,51642=>1000,51643=>1000,51644=>1000,51645=>1000,51646=>1000,51647=>1000,51648=>1000,51649=>1000,51650=>1000,51651=>1000,51652=>1000,51653=>1000,51654=>1000,51655=>1000,51656=>1000,51657=>1000,51658=>1000,51659=>1000,51660=>1000,51661=>1000,51662=>1000,51663=>1000,51664=>1000,51665=>1000,51666=>1000,51667=>1000,51668=>1000,51669=>1000,51670=>1000,51671=>1000,51672=>1000,51673=>1000,51674=>1000,51675=>1000,51676=>1000,51677=>1000,51678=>1000,51679=>1000,51680=>1000,51681=>1000,51682=>1000,51683=>1000,51684=>1000,51685=>1000,51686=>1000,51687=>1000,51688=>1000,51689=>1000,51690=>1000,51691=>1000,51692=>1000,51693=>1000,51694=>1000,51695=>1000,51696=>1000,51697=>1000,51698=>1000,51699=>1000,51700=>1000,51701=>1000,51702=>1000,51703=>1000,51704=>1000,51705=>1000,51706=>1000,51707=>1000,51708=>1000,51709=>1000,51710=>1000,51711=>1000,51712=>1000,51713=>1000,51714=>1000,51715=>1000,51716=>1000,51717=>1000,51718=>1000,51719=>1000,51720=>1000,51721=>1000,51722=>1000,51723=>1000,51724=>1000,51725=>1000,51726=>1000,51727=>1000,51728=>1000,51729=>1000,51730=>1000,51731=>1000,51732=>1000,51733=>1000,51734=>1000,51735=>1000,51736=>1000,51737=>1000,51738=>1000,51739=>1000,51740=>1000,51741=>1000,51742=>1000,51743=>1000,51744=>1000,51745=>1000,51746=>1000,51747=>1000,51748=>1000,51749=>1000,51750=>1000,51751=>1000,51752=>1000,51753=>1000,51754=>1000,51755=>1000,51756=>1000,51757=>1000,51758=>1000,51759=>1000,51760=>1000,51761=>1000,51762=>1000,51763=>1000,51764=>1000,51765=>1000,51766=>1000,51767=>1000,51768=>1000,51769=>1000,51770=>1000,51771=>1000,51772=>1000,51773=>1000,51774=>1000,51775=>1000,51776=>1000,51777=>1000,51778=>1000,51779=>1000,51780=>1000,51781=>1000,51782=>1000,51783=>1000,51784=>1000,51785=>1000,51786=>1000,51787=>1000,51788=>1000,51789=>1000,51790=>1000,51791=>1000,51792=>1000,51793=>1000,51794=>1000,51795=>1000,51796=>1000,51797=>1000,51798=>1000,51799=>1000,51800=>1000,51801=>1000,51802=>1000,51803=>1000,51804=>1000,51805=>1000,51806=>1000,51807=>1000,51808=>1000,51809=>1000,51810=>1000,51811=>1000,51812=>1000,51813=>1000,51814=>1000,51815=>1000,51816=>1000,51817=>1000,51818=>1000,51819=>1000,51820=>1000,51821=>1000,51822=>1000,51823=>1000,51824=>1000,51825=>1000,51826=>1000,51827=>1000,51828=>1000,51829=>1000,51830=>1000,51831=>1000,51832=>1000,51833=>1000,51834=>1000,51835=>1000,51836=>1000,51837=>1000,51838=>1000,51839=>1000,51840=>1000,51841=>1000,51842=>1000,51843=>1000,51844=>1000,51845=>1000,51846=>1000,51847=>1000,51848=>1000,51849=>1000,51850=>1000,51851=>1000,51852=>1000,51853=>1000,51854=>1000,51855=>1000,51856=>1000,51857=>1000,51858=>1000,51859=>1000,51860=>1000,51861=>1000,51862=>1000,51863=>1000,51864=>1000,51865=>1000,51866=>1000,51867=>1000,51868=>1000,51869=>1000,51870=>1000,51871=>1000,51872=>1000,51873=>1000,51874=>1000,51875=>1000,51876=>1000,51877=>1000,51878=>1000,51879=>1000,51880=>1000,51881=>1000,51882=>1000,51883=>1000,51884=>1000,51885=>1000,51886=>1000,51887=>1000,51888=>1000,51889=>1000,51890=>1000,51891=>1000,51892=>1000,51893=>1000,51894=>1000,51895=>1000,51896=>1000,51897=>1000,51898=>1000,51899=>1000,51900=>1000,51901=>1000,51902=>1000,51903=>1000,51904=>1000,51905=>1000,51906=>1000,51907=>1000,51908=>1000,51909=>1000,51910=>1000,51911=>1000,51912=>1000,51913=>1000,51914=>1000,51915=>1000,51916=>1000,51917=>1000,51918=>1000,51919=>1000,51920=>1000,51921=>1000,51922=>1000,51923=>1000,51924=>1000,51925=>1000,51926=>1000,51927=>1000,51928=>1000,51929=>1000,51930=>1000,51931=>1000,51932=>1000,51933=>1000,51934=>1000,51935=>1000,51936=>1000,51937=>1000,51938=>1000,51939=>1000,51940=>1000,51941=>1000,51942=>1000,51943=>1000,51944=>1000,51945=>1000,51946=>1000,51947=>1000,51948=>1000,51949=>1000,51950=>1000,51951=>1000,51952=>1000,51953=>1000,51954=>1000,51955=>1000,51956=>1000,51957=>1000,51958=>1000,51959=>1000,51960=>1000,51961=>1000,51962=>1000,51963=>1000,51964=>1000,51965=>1000,51966=>1000,51967=>1000,51968=>1000,51969=>1000,51970=>1000,51971=>1000,51972=>1000,51973=>1000,51974=>1000,51975=>1000,51976=>1000,51977=>1000,51978=>1000,51979=>1000,51980=>1000,51981=>1000,51982=>1000,51983=>1000,51984=>1000,51985=>1000,51986=>1000,51987=>1000,51988=>1000,51989=>1000,51990=>1000,51991=>1000,51992=>1000,51993=>1000,51994=>1000,51995=>1000,51996=>1000,51997=>1000,51998=>1000,51999=>1000,52000=>1000,52001=>1000,52002=>1000,52003=>1000,52004=>1000,52005=>1000,52006=>1000,52007=>1000,52008=>1000,52009=>1000,52010=>1000,52011=>1000,52012=>1000,52013=>1000,52014=>1000,52015=>1000,52016=>1000,52017=>1000,52018=>1000,52019=>1000,52020=>1000,52021=>1000,52022=>1000,52023=>1000,52024=>1000,52025=>1000,52026=>1000,52027=>1000,52028=>1000,52029=>1000,52030=>1000,52031=>1000,52032=>1000,52033=>1000,52034=>1000,52035=>1000,52036=>1000,52037=>1000,52038=>1000,52039=>1000,52040=>1000,52041=>1000,52042=>1000,52043=>1000,52044=>1000,52045=>1000,52046=>1000,52047=>1000,52048=>1000,52049=>1000,52050=>1000,52051=>1000,52052=>1000,52053=>1000,52054=>1000,52055=>1000,52056=>1000,52057=>1000,52058=>1000,52059=>1000,52060=>1000,52061=>1000,52062=>1000,52063=>1000,52064=>1000,52065=>1000,52066=>1000,52067=>1000,52068=>1000,52069=>1000,52070=>1000,52071=>1000,52072=>1000,52073=>1000,52074=>1000,52075=>1000,52076=>1000,52077=>1000,52078=>1000,52079=>1000,52080=>1000,52081=>1000,52082=>1000,52083=>1000,52084=>1000,52085=>1000,52086=>1000,52087=>1000,52088=>1000,52089=>1000,52090=>1000,52091=>1000,52092=>1000,52093=>1000,52094=>1000,52095=>1000,52096=>1000,52097=>1000,52098=>1000,52099=>1000,52100=>1000,52101=>1000,52102=>1000,52103=>1000,52104=>1000,52105=>1000,52106=>1000,52107=>1000,52108=>1000,52109=>1000,52110=>1000,52111=>1000,52112=>1000,52113=>1000,52114=>1000,52115=>1000,52116=>1000,52117=>1000,52118=>1000,52119=>1000,52120=>1000,52121=>1000,52122=>1000,52123=>1000,52124=>1000,52125=>1000,52126=>1000,52127=>1000,52128=>1000,52129=>1000,52130=>1000,52131=>1000,52132=>1000,52133=>1000,52134=>1000,52135=>1000,52136=>1000,52137=>1000,52138=>1000,52139=>1000,52140=>1000,52141=>1000,52142=>1000,52143=>1000,52144=>1000,52145=>1000,52146=>1000,52147=>1000,52148=>1000,52149=>1000,52150=>1000,52151=>1000,52152=>1000,52153=>1000,52154=>1000,52155=>1000,52156=>1000,52157=>1000,52158=>1000,52159=>1000,52160=>1000,52161=>1000,52162=>1000,52163=>1000,52164=>1000,52165=>1000,52166=>1000,52167=>1000,52168=>1000,52169=>1000,52170=>1000,52171=>1000,52172=>1000,52173=>1000,52174=>1000,52175=>1000,52176=>1000,52177=>1000,52178=>1000,52179=>1000,52180=>1000,52181=>1000,52182=>1000,52183=>1000,52184=>1000,52185=>1000,52186=>1000,52187=>1000,52188=>1000,52189=>1000,52190=>1000,52191=>1000,52192=>1000,52193=>1000,52194=>1000,52195=>1000,52196=>1000,52197=>1000,52198=>1000,52199=>1000,52200=>1000,52201=>1000,52202=>1000,52203=>1000,52204=>1000,52205=>1000,52206=>1000,52207=>1000,52208=>1000,52209=>1000,52210=>1000,52211=>1000,52212=>1000,52213=>1000,52214=>1000,52215=>1000,52216=>1000,52217=>1000,52218=>1000,52219=>1000,52220=>1000,52221=>1000,52222=>1000,52223=>1000,52224=>1000,52225=>1000,52226=>1000,52227=>1000,52228=>1000,52229=>1000,52230=>1000,52231=>1000,52232=>1000,52233=>1000,52234=>1000,52235=>1000,52236=>1000,52237=>1000,52238=>1000,52239=>1000,52240=>1000,52241=>1000,52242=>1000,52243=>1000,52244=>1000,52245=>1000,52246=>1000,52247=>1000,52248=>1000,52249=>1000,52250=>1000,52251=>1000,52252=>1000,52253=>1000,52254=>1000,52255=>1000,52256=>1000,52257=>1000,52258=>1000,52259=>1000,52260=>1000,52261=>1000,52262=>1000,52263=>1000,52264=>1000,52265=>1000,52266=>1000,52267=>1000,52268=>1000,52269=>1000,52270=>1000,52271=>1000,52272=>1000,52273=>1000,52274=>1000,52275=>1000,52276=>1000,52277=>1000,52278=>1000,52279=>1000,52280=>1000,52281=>1000,52282=>1000,52283=>1000,52284=>1000,52285=>1000,52286=>1000,52287=>1000,52288=>1000,52289=>1000,52290=>1000,52291=>1000,52292=>1000,52293=>1000,52294=>1000,52295=>1000,52296=>1000,52297=>1000,52298=>1000,52299=>1000,52300=>1000,52301=>1000,52302=>1000,52303=>1000,52304=>1000,52305=>1000,52306=>1000,52307=>1000,52308=>1000,52309=>1000,52310=>1000,52311=>1000,52312=>1000,52313=>1000,52314=>1000,52315=>1000,52316=>1000,52317=>1000,52318=>1000,52319=>1000,52320=>1000,52321=>1000,52322=>1000,52323=>1000,52324=>1000,52325=>1000,52326=>1000,52327=>1000,52328=>1000,52329=>1000,52330=>1000,52331=>1000,52332=>1000,52333=>1000,52334=>1000,52335=>1000,52336=>1000,52337=>1000,52338=>1000,52339=>1000,52340=>1000,52341=>1000,52342=>1000,52343=>1000,52344=>1000,52345=>1000,52346=>1000,52347=>1000,52348=>1000,52349=>1000,52350=>1000,52351=>1000,52352=>1000,52353=>1000,52354=>1000,52355=>1000,52356=>1000,52357=>1000,52358=>1000,52359=>1000,52360=>1000,52361=>1000,52362=>1000,52363=>1000,52364=>1000,52365=>1000,52366=>1000,52367=>1000,52368=>1000,52369=>1000,52370=>1000,52371=>1000,52372=>1000,52373=>1000,52374=>1000,52375=>1000,52376=>1000,52377=>1000,52378=>1000,52379=>1000,52380=>1000,52381=>1000,52382=>1000,52383=>1000,52384=>1000,52385=>1000,52386=>1000,52387=>1000,52388=>1000,52389=>1000,52390=>1000,52391=>1000,52392=>1000,52393=>1000,52394=>1000,52395=>1000,52396=>1000,52397=>1000,52398=>1000,52399=>1000,52400=>1000,52401=>1000,52402=>1000,52403=>1000,52404=>1000,52405=>1000,52406=>1000,52407=>1000,52408=>1000,52409=>1000,52410=>1000,52411=>1000,52412=>1000,52413=>1000,52414=>1000,52415=>1000,52416=>1000,52417=>1000,52418=>1000,52419=>1000,52420=>1000,52421=>1000,52422=>1000,52423=>1000,52424=>1000,52425=>1000,52426=>1000,52427=>1000,52428=>1000,52429=>1000,52430=>1000,52431=>1000,52432=>1000,52433=>1000,52434=>1000,52435=>1000,52436=>1000,52437=>1000,52438=>1000,52439=>1000,52440=>1000,52441=>1000,52442=>1000,52443=>1000,52444=>1000,52445=>1000,52446=>1000,52447=>1000,52448=>1000,52449=>1000,52450=>1000,52451=>1000,52452=>1000,52453=>1000,52454=>1000,52455=>1000,52456=>1000,52457=>1000,52458=>1000,52459=>1000,52460=>1000,52461=>1000,52462=>1000,52463=>1000,52464=>1000,52465=>1000,52466=>1000,52467=>1000,52468=>1000,52469=>1000,52470=>1000,52471=>1000,52472=>1000,52473=>1000,52474=>1000,52475=>1000,52476=>1000,52477=>1000,52478=>1000,52479=>1000,52480=>1000,52481=>1000,52482=>1000,52483=>1000,52484=>1000,52485=>1000,52486=>1000,52487=>1000,52488=>1000,52489=>1000,52490=>1000,52491=>1000,52492=>1000,52493=>1000,52494=>1000,52495=>1000,52496=>1000,52497=>1000,52498=>1000,52499=>1000,52500=>1000,52501=>1000,52502=>1000,52503=>1000,52504=>1000,52505=>1000,52506=>1000,52507=>1000,52508=>1000,52509=>1000,52510=>1000,52511=>1000,52512=>1000,52513=>1000,52514=>1000,52515=>1000,52516=>1000,52517=>1000,52518=>1000,52519=>1000,52520=>1000,52521=>1000,52522=>1000,52523=>1000,52524=>1000,52525=>1000,52526=>1000,52527=>1000,52528=>1000,52529=>1000,52530=>1000,52531=>1000,52532=>1000,52533=>1000,52534=>1000,52535=>1000,52536=>1000,52537=>1000,52538=>1000,52539=>1000,52540=>1000,52541=>1000,52542=>1000,52543=>1000,52544=>1000,52545=>1000,52546=>1000,52547=>1000,52548=>1000,52549=>1000,52550=>1000,52551=>1000,52552=>1000,52553=>1000,52554=>1000,52555=>1000,52556=>1000,52557=>1000,52558=>1000,52559=>1000,52560=>1000,52561=>1000,52562=>1000,52563=>1000,52564=>1000,52565=>1000,52566=>1000,52567=>1000,52568=>1000,52569=>1000,52570=>1000,52571=>1000,52572=>1000,52573=>1000,52574=>1000,52575=>1000,52576=>1000,52577=>1000,52578=>1000,52579=>1000,52580=>1000,52581=>1000,52582=>1000,52583=>1000,52584=>1000,52585=>1000,52586=>1000,52587=>1000,52588=>1000,52589=>1000,52590=>1000,52591=>1000,52592=>1000,52593=>1000,52594=>1000,52595=>1000,52596=>1000,52597=>1000,52598=>1000,52599=>1000,52600=>1000,52601=>1000,52602=>1000,52603=>1000,52604=>1000,52605=>1000,52606=>1000,52607=>1000,52608=>1000,52609=>1000,52610=>1000,52611=>1000,52612=>1000,52613=>1000,52614=>1000,52615=>1000,52616=>1000,52617=>1000,52618=>1000,52619=>1000,52620=>1000,52621=>1000,52622=>1000,52623=>1000,52624=>1000,52625=>1000,52626=>1000,52627=>1000,52628=>1000,52629=>1000,52630=>1000,52631=>1000,52632=>1000,52633=>1000,52634=>1000,52635=>1000,52636=>1000,52637=>1000,52638=>1000,52639=>1000,52640=>1000,52641=>1000,52642=>1000,52643=>1000,52644=>1000,52645=>1000,52646=>1000,52647=>1000,52648=>1000,52649=>1000,52650=>1000,52651=>1000,52652=>1000,52653=>1000,52654=>1000,52655=>1000,52656=>1000,52657=>1000,52658=>1000,52659=>1000,52660=>1000,52661=>1000,52662=>1000,52663=>1000,52664=>1000,52665=>1000,52666=>1000,52667=>1000,52668=>1000,52669=>1000,52670=>1000,52671=>1000,52672=>1000,52673=>1000,52674=>1000,52675=>1000,52676=>1000,52677=>1000,52678=>1000,52679=>1000,52680=>1000,52681=>1000,52682=>1000,52683=>1000,52684=>1000,52685=>1000,52686=>1000,52687=>1000,52688=>1000,52689=>1000,52690=>1000,52691=>1000,52692=>1000,52693=>1000,52694=>1000,52695=>1000,52696=>1000,52697=>1000,52698=>1000,52699=>1000,52700=>1000,52701=>1000,52702=>1000,52703=>1000,52704=>1000,52705=>1000,52706=>1000,52707=>1000,52708=>1000,52709=>1000,52710=>1000,52711=>1000,52712=>1000,52713=>1000,52714=>1000,52715=>1000,52716=>1000,52717=>1000,52718=>1000,52719=>1000,52720=>1000,52721=>1000,52722=>1000,52723=>1000,52724=>1000,52725=>1000,52726=>1000,52727=>1000,52728=>1000,52729=>1000,52730=>1000,52731=>1000,52732=>1000,52733=>1000,52734=>1000,52735=>1000,52736=>1000,52737=>1000,52738=>1000,52739=>1000,52740=>1000,52741=>1000,52742=>1000,52743=>1000,52744=>1000,52745=>1000,52746=>1000,52747=>1000,52748=>1000,52749=>1000,52750=>1000,52751=>1000,52752=>1000,52753=>1000,52754=>1000,52755=>1000,52756=>1000,52757=>1000,52758=>1000,52759=>1000,52760=>1000,52761=>1000,52762=>1000,52763=>1000,52764=>1000,52765=>1000,52766=>1000,52767=>1000,52768=>1000,52769=>1000,52770=>1000,52771=>1000,52772=>1000,52773=>1000,52774=>1000,52775=>1000,52776=>1000,52777=>1000,52778=>1000,52779=>1000,52780=>1000,52781=>1000,52782=>1000,52783=>1000,52784=>1000,52785=>1000,52786=>1000,52787=>1000,52788=>1000,52789=>1000,52790=>1000,52791=>1000,52792=>1000,52793=>1000,52794=>1000,52795=>1000,52796=>1000,52797=>1000,52798=>1000,52799=>1000,52800=>1000,52801=>1000,52802=>1000,52803=>1000,52804=>1000,52805=>1000,52806=>1000,52807=>1000,52808=>1000,52809=>1000,52810=>1000,52811=>1000,52812=>1000,52813=>1000,52814=>1000,52815=>1000,52816=>1000,52817=>1000,52818=>1000,52819=>1000,52820=>1000,52821=>1000,52822=>1000,52823=>1000,52824=>1000,52825=>1000,52826=>1000,52827=>1000,52828=>1000,52829=>1000,52830=>1000,52831=>1000,52832=>1000,52833=>1000,52834=>1000,52835=>1000,52836=>1000,52837=>1000,52838=>1000,52839=>1000,52840=>1000,52841=>1000,52842=>1000,52843=>1000,52844=>1000,52845=>1000,52846=>1000,52847=>1000,52848=>1000,52849=>1000,52850=>1000,52851=>1000,52852=>1000,52853=>1000,52854=>1000,52855=>1000,52856=>1000,52857=>1000,52858=>1000,52859=>1000,52860=>1000,52861=>1000,52862=>1000,52863=>1000,52864=>1000,52865=>1000,52866=>1000,52867=>1000,52868=>1000,52869=>1000,52870=>1000,52871=>1000,52872=>1000,52873=>1000,52874=>1000,52875=>1000,52876=>1000,52877=>1000,52878=>1000,52879=>1000,52880=>1000,52881=>1000,52882=>1000,52883=>1000,52884=>1000,52885=>1000,52886=>1000,52887=>1000,52888=>1000,52889=>1000,52890=>1000,52891=>1000,52892=>1000,52893=>1000,52894=>1000,52895=>1000,52896=>1000,52897=>1000,52898=>1000,52899=>1000,52900=>1000,52901=>1000,52902=>1000,52903=>1000,52904=>1000,52905=>1000,52906=>1000,52907=>1000,52908=>1000,52909=>1000,52910=>1000,52911=>1000,52912=>1000,52913=>1000,52914=>1000,52915=>1000,52916=>1000,52917=>1000,52918=>1000,52919=>1000,52920=>1000,52921=>1000,52922=>1000,52923=>1000,52924=>1000,52925=>1000,52926=>1000,52927=>1000,52928=>1000,52929=>1000,52930=>1000,52931=>1000,52932=>1000,52933=>1000,52934=>1000,52935=>1000,52936=>1000,52937=>1000,52938=>1000,52939=>1000,52940=>1000,52941=>1000,52942=>1000,52943=>1000,52944=>1000,52945=>1000,52946=>1000,52947=>1000,52948=>1000,52949=>1000,52950=>1000,52951=>1000,52952=>1000,52953=>1000,52954=>1000,52955=>1000,52956=>1000,52957=>1000,52958=>1000,52959=>1000,52960=>1000,52961=>1000,52962=>1000,52963=>1000,52964=>1000,52965=>1000,52966=>1000,52967=>1000,52968=>1000,52969=>1000,52970=>1000,52971=>1000,52972=>1000,52973=>1000,52974=>1000,52975=>1000,52976=>1000,52977=>1000,52978=>1000,52979=>1000,52980=>1000,52981=>1000,52982=>1000,52983=>1000,52984=>1000,52985=>1000,52986=>1000,52987=>1000,52988=>1000,52989=>1000,52990=>1000,52991=>1000,52992=>1000,52993=>1000,52994=>1000,52995=>1000,52996=>1000,52997=>1000,52998=>1000,52999=>1000,53000=>1000,53001=>1000,53002=>1000,53003=>1000,53004=>1000,53005=>1000,53006=>1000,53007=>1000,53008=>1000,53009=>1000,53010=>1000,53011=>1000,53012=>1000,53013=>1000,53014=>1000,53015=>1000,53016=>1000,53017=>1000,53018=>1000,53019=>1000,53020=>1000,53021=>1000,53022=>1000,53023=>1000,53024=>1000,53025=>1000,53026=>1000,53027=>1000,53028=>1000,53029=>1000,53030=>1000,53031=>1000,53032=>1000,53033=>1000,53034=>1000,53035=>1000,53036=>1000,53037=>1000,53038=>1000,53039=>1000,53040=>1000,53041=>1000,53042=>1000,53043=>1000,53044=>1000,53045=>1000,53046=>1000,53047=>1000,53048=>1000,53049=>1000,53050=>1000,53051=>1000,53052=>1000,53053=>1000,53054=>1000,53055=>1000,53056=>1000,53057=>1000,53058=>1000,53059=>1000,53060=>1000,53061=>1000,53062=>1000,53063=>1000,53064=>1000,53065=>1000,53066=>1000,53067=>1000,53068=>1000,53069=>1000,53070=>1000,53071=>1000,53072=>1000,53073=>1000,53074=>1000,53075=>1000,53076=>1000,53077=>1000,53078=>1000,53079=>1000,53080=>1000,53081=>1000,53082=>1000,53083=>1000,53084=>1000,53085=>1000,53086=>1000,53087=>1000,53088=>1000,53089=>1000,53090=>1000,53091=>1000,53092=>1000,53093=>1000,53094=>1000,53095=>1000,53096=>1000,53097=>1000,53098=>1000,53099=>1000,53100=>1000,53101=>1000,53102=>1000,53103=>1000,53104=>1000,53105=>1000,53106=>1000,53107=>1000,53108=>1000,53109=>1000,53110=>1000,53111=>1000,53112=>1000,53113=>1000,53114=>1000,53115=>1000,53116=>1000,53117=>1000,53118=>1000,53119=>1000,53120=>1000,53121=>1000,53122=>1000,53123=>1000,53124=>1000,53125=>1000,53126=>1000,53127=>1000,53128=>1000,53129=>1000,53130=>1000,53131=>1000,53132=>1000,53133=>1000,53134=>1000,53135=>1000,53136=>1000,53137=>1000,53138=>1000,53139=>1000,53140=>1000,53141=>1000,53142=>1000,53143=>1000,53144=>1000,53145=>1000,53146=>1000,53147=>1000,53148=>1000,53149=>1000,53150=>1000,53151=>1000,53152=>1000,53153=>1000,53154=>1000,53155=>1000,53156=>1000,53157=>1000,53158=>1000,53159=>1000,53160=>1000,53161=>1000,53162=>1000,53163=>1000,53164=>1000,53165=>1000,53166=>1000,53167=>1000,53168=>1000,53169=>1000,53170=>1000,53171=>1000,53172=>1000,53173=>1000,53174=>1000,53175=>1000,53176=>1000,53177=>1000,53178=>1000,53179=>1000,53180=>1000,53181=>1000,53182=>1000,53183=>1000,53184=>1000,53185=>1000,53186=>1000,53187=>1000,53188=>1000,53189=>1000,53190=>1000,53191=>1000,53192=>1000,53193=>1000,53194=>1000,53195=>1000,53196=>1000,53197=>1000,53198=>1000,53199=>1000,53200=>1000,53201=>1000,53202=>1000,53203=>1000,53204=>1000,53205=>1000,53206=>1000,53207=>1000,53208=>1000,53209=>1000,53210=>1000,53211=>1000,53212=>1000,53213=>1000,53214=>1000,53215=>1000,53216=>1000,53217=>1000,53218=>1000,53219=>1000,53220=>1000,53221=>1000,53222=>1000,53223=>1000,53224=>1000,53225=>1000,53226=>1000,53227=>1000,53228=>1000,53229=>1000,53230=>1000,53231=>1000,53232=>1000,53233=>1000,53234=>1000,53235=>1000,53236=>1000,53237=>1000,53238=>1000,53239=>1000,53240=>1000,53241=>1000,53242=>1000,53243=>1000,53244=>1000,53245=>1000,53246=>1000,53247=>1000,53248=>1000,53249=>1000,53250=>1000,53251=>1000,53252=>1000,53253=>1000,53254=>1000,53255=>1000,53256=>1000,53257=>1000,53258=>1000,53259=>1000,53260=>1000,53261=>1000,53262=>1000,53263=>1000,53264=>1000,53265=>1000,53266=>1000,53267=>1000,53268=>1000,53269=>1000,53270=>1000,53271=>1000,53272=>1000,53273=>1000,53274=>1000,53275=>1000,53276=>1000,53277=>1000,53278=>1000,53279=>1000,53280=>1000,53281=>1000,53282=>1000,53283=>1000,53284=>1000,53285=>1000,53286=>1000,53287=>1000,53288=>1000,53289=>1000,53290=>1000,53291=>1000,53292=>1000,53293=>1000,53294=>1000,53295=>1000,53296=>1000,53297=>1000,53298=>1000,53299=>1000,53300=>1000,53301=>1000,53302=>1000,53303=>1000,53304=>1000,53305=>1000,53306=>1000,53307=>1000,53308=>1000,53309=>1000,53310=>1000,53311=>1000,53312=>1000,53313=>1000,53314=>1000,53315=>1000,53316=>1000,53317=>1000,53318=>1000,53319=>1000,53320=>1000,53321=>1000,53322=>1000,53323=>1000,53324=>1000,53325=>1000,53326=>1000,53327=>1000,53328=>1000,53329=>1000,53330=>1000,53331=>1000,53332=>1000,53333=>1000,53334=>1000,53335=>1000,53336=>1000,53337=>1000,53338=>1000,53339=>1000,53340=>1000,53341=>1000,53342=>1000,53343=>1000,53344=>1000,53345=>1000,53346=>1000,53347=>1000,53348=>1000,53349=>1000,53350=>1000,53351=>1000,53352=>1000,53353=>1000,53354=>1000,53355=>1000,53356=>1000,53357=>1000,53358=>1000,53359=>1000,53360=>1000,53361=>1000,53362=>1000,53363=>1000,53364=>1000,53365=>1000,53366=>1000,53367=>1000,53368=>1000,53369=>1000,53370=>1000,53371=>1000,53372=>1000,53373=>1000,53374=>1000,53375=>1000,53376=>1000,53377=>1000,53378=>1000,53379=>1000,53380=>1000,53381=>1000,53382=>1000,53383=>1000,53384=>1000,53385=>1000,53386=>1000,53387=>1000,53388=>1000,53389=>1000,53390=>1000,53391=>1000,53392=>1000,53393=>1000,53394=>1000,53395=>1000,53396=>1000,53397=>1000,53398=>1000,53399=>1000,53400=>1000,53401=>1000,53402=>1000,53403=>1000,53404=>1000,53405=>1000,53406=>1000,53407=>1000,53408=>1000,53409=>1000,53410=>1000,53411=>1000,53412=>1000,53413=>1000,53414=>1000,53415=>1000,53416=>1000,53417=>1000,53418=>1000,53419=>1000,53420=>1000,53421=>1000,53422=>1000,53423=>1000,53424=>1000,53425=>1000,53426=>1000,53427=>1000,53428=>1000,53429=>1000,53430=>1000,53431=>1000,53432=>1000,53433=>1000,53434=>1000,53435=>1000,53436=>1000,53437=>1000,53438=>1000,53439=>1000,53440=>1000,53441=>1000,53442=>1000,53443=>1000,53444=>1000,53445=>1000,53446=>1000,53447=>1000,53448=>1000,53449=>1000,53450=>1000,53451=>1000,53452=>1000,53453=>1000,53454=>1000,53455=>1000,53456=>1000,53457=>1000,53458=>1000,53459=>1000,53460=>1000,53461=>1000,53462=>1000,53463=>1000,53464=>1000,53465=>1000,53466=>1000,53467=>1000,53468=>1000,53469=>1000,53470=>1000,53471=>1000,53472=>1000,53473=>1000,53474=>1000,53475=>1000,53476=>1000,53477=>1000,53478=>1000,53479=>1000,53480=>1000,53481=>1000,53482=>1000,53483=>1000,53484=>1000,53485=>1000,53486=>1000,53487=>1000,53488=>1000,53489=>1000,53490=>1000,53491=>1000,53492=>1000,53493=>1000,53494=>1000,53495=>1000,53496=>1000,53497=>1000,53498=>1000,53499=>1000,53500=>1000,53501=>1000,53502=>1000,53503=>1000,53504=>1000,53505=>1000,53506=>1000,53507=>1000,53508=>1000,53509=>1000,53510=>1000,53511=>1000,53512=>1000,53513=>1000,53514=>1000,53515=>1000,53516=>1000,53517=>1000,53518=>1000,53519=>1000,53520=>1000,53521=>1000,53522=>1000,53523=>1000,53524=>1000,53525=>1000,53526=>1000,53527=>1000,53528=>1000,53529=>1000,53530=>1000,53531=>1000,53532=>1000,53533=>1000,53534=>1000,53535=>1000,53536=>1000,53537=>1000,53538=>1000,53539=>1000,53540=>1000,53541=>1000,53542=>1000,53543=>1000,53544=>1000,53545=>1000,53546=>1000,53547=>1000,53548=>1000,53549=>1000,53550=>1000,53551=>1000,53552=>1000,53553=>1000,53554=>1000,53555=>1000,53556=>1000,53557=>1000,53558=>1000,53559=>1000,53560=>1000,53561=>1000,53562=>1000,53563=>1000,53564=>1000,53565=>1000,53566=>1000,53567=>1000,53568=>1000,53569=>1000,53570=>1000,53571=>1000,53572=>1000,53573=>1000,53574=>1000,53575=>1000,53576=>1000,53577=>1000,53578=>1000,53579=>1000,53580=>1000,53581=>1000,53582=>1000,53583=>1000,53584=>1000,53585=>1000,53586=>1000,53587=>1000,53588=>1000,53589=>1000,53590=>1000,53591=>1000,53592=>1000,53593=>1000,53594=>1000,53595=>1000,53596=>1000,53597=>1000,53598=>1000,53599=>1000,53600=>1000,53601=>1000,53602=>1000,53603=>1000,53604=>1000,53605=>1000,53606=>1000,53607=>1000,53608=>1000,53609=>1000,53610=>1000,53611=>1000,53612=>1000,53613=>1000,53614=>1000,53615=>1000,53616=>1000,53617=>1000,53618=>1000,53619=>1000,53620=>1000,53621=>1000,53622=>1000,53623=>1000,53624=>1000,53625=>1000,53626=>1000,53627=>1000,53628=>1000,53629=>1000,53630=>1000,53631=>1000,53632=>1000,53633=>1000,53634=>1000,53635=>1000,53636=>1000,53637=>1000,53638=>1000,53639=>1000,53640=>1000,53641=>1000,53642=>1000,53643=>1000,53644=>1000,53645=>1000,53646=>1000,53647=>1000,53648=>1000,53649=>1000,53650=>1000,53651=>1000,53652=>1000,53653=>1000,53654=>1000,53655=>1000,53656=>1000,53657=>1000,53658=>1000,53659=>1000,53660=>1000,53661=>1000,53662=>1000,53663=>1000,53664=>1000,53665=>1000,53666=>1000,53667=>1000,53668=>1000,53669=>1000,53670=>1000,53671=>1000,53672=>1000,53673=>1000,53674=>1000,53675=>1000,53676=>1000,53677=>1000,53678=>1000,53679=>1000,53680=>1000,53681=>1000,53682=>1000,53683=>1000,53684=>1000,53685=>1000,53686=>1000,53687=>1000,53688=>1000,53689=>1000,53690=>1000,53691=>1000,53692=>1000,53693=>1000,53694=>1000,53695=>1000,53696=>1000,53697=>1000,53698=>1000,53699=>1000,53700=>1000,53701=>1000,53702=>1000,53703=>1000,53704=>1000,53705=>1000,53706=>1000,53707=>1000,53708=>1000,53709=>1000,53710=>1000,53711=>1000,53712=>1000,53713=>1000,53714=>1000,53715=>1000,53716=>1000,53717=>1000,53718=>1000,53719=>1000,53720=>1000,53721=>1000,53722=>1000,53723=>1000,53724=>1000,53725=>1000,53726=>1000,53727=>1000,53728=>1000,53729=>1000,53730=>1000,53731=>1000,53732=>1000,53733=>1000,53734=>1000,53735=>1000,53736=>1000,53737=>1000,53738=>1000,53739=>1000,53740=>1000,53741=>1000,53742=>1000,53743=>1000,53744=>1000,53745=>1000,53746=>1000,53747=>1000,53748=>1000,53749=>1000,53750=>1000,53751=>1000,53752=>1000,53753=>1000,53754=>1000,53755=>1000,53756=>1000,53757=>1000,53758=>1000,53759=>1000,53760=>1000,53761=>1000,53762=>1000,53763=>1000,53764=>1000,53765=>1000,53766=>1000,53767=>1000,53768=>1000,53769=>1000,53770=>1000,53771=>1000,53772=>1000,53773=>1000,53774=>1000,53775=>1000,53776=>1000,53777=>1000,53778=>1000,53779=>1000,53780=>1000,53781=>1000,53782=>1000,53783=>1000,53784=>1000,53785=>1000,53786=>1000,53787=>1000,53788=>1000,53789=>1000,53790=>1000,53791=>1000,53792=>1000,53793=>1000,53794=>1000,53795=>1000,53796=>1000,53797=>1000,53798=>1000,53799=>1000,53800=>1000,53801=>1000,53802=>1000,53803=>1000,53804=>1000,53805=>1000,53806=>1000,53807=>1000,53808=>1000,53809=>1000,53810=>1000,53811=>1000,53812=>1000,53813=>1000,53814=>1000,53815=>1000,53816=>1000,53817=>1000,53818=>1000,53819=>1000,53820=>1000,53821=>1000,53822=>1000,53823=>1000,53824=>1000,53825=>1000,53826=>1000,53827=>1000,53828=>1000,53829=>1000,53830=>1000,53831=>1000,53832=>1000,53833=>1000,53834=>1000,53835=>1000,53836=>1000,53837=>1000,53838=>1000,53839=>1000,53840=>1000,53841=>1000,53842=>1000,53843=>1000,53844=>1000,53845=>1000,53846=>1000,53847=>1000,53848=>1000,53849=>1000,53850=>1000,53851=>1000,53852=>1000,53853=>1000,53854=>1000,53855=>1000,53856=>1000,53857=>1000,53858=>1000,53859=>1000,53860=>1000,53861=>1000,53862=>1000,53863=>1000,53864=>1000,53865=>1000,53866=>1000,53867=>1000,53868=>1000,53869=>1000,53870=>1000,53871=>1000,53872=>1000,53873=>1000,53874=>1000,53875=>1000,53876=>1000,53877=>1000,53878=>1000,53879=>1000,53880=>1000,53881=>1000,53882=>1000,53883=>1000,53884=>1000,53885=>1000,53886=>1000,53887=>1000,53888=>1000,53889=>1000,53890=>1000,53891=>1000,53892=>1000,53893=>1000,53894=>1000,53895=>1000,53896=>1000,53897=>1000,53898=>1000,53899=>1000,53900=>1000,53901=>1000,53902=>1000,53903=>1000,53904=>1000,53905=>1000,53906=>1000,53907=>1000,53908=>1000,53909=>1000,53910=>1000,53911=>1000,53912=>1000,53913=>1000,53914=>1000,53915=>1000,53916=>1000,53917=>1000,53918=>1000,53919=>1000,53920=>1000,53921=>1000,53922=>1000,53923=>1000,53924=>1000,53925=>1000,53926=>1000,53927=>1000,53928=>1000,53929=>1000,53930=>1000,53931=>1000,53932=>1000,53933=>1000,53934=>1000,53935=>1000,53936=>1000,53937=>1000,53938=>1000,53939=>1000,53940=>1000,53941=>1000,53942=>1000,53943=>1000,53944=>1000,53945=>1000,53946=>1000,53947=>1000,53948=>1000,53949=>1000,53950=>1000,53951=>1000,53952=>1000,53953=>1000,53954=>1000,53955=>1000,53956=>1000,53957=>1000,53958=>1000,53959=>1000,53960=>1000,53961=>1000,53962=>1000,53963=>1000,53964=>1000,53965=>1000,53966=>1000,53967=>1000,53968=>1000,53969=>1000,53970=>1000,53971=>1000,53972=>1000,53973=>1000,53974=>1000,53975=>1000,53976=>1000,53977=>1000,53978=>1000,53979=>1000,53980=>1000,53981=>1000,53982=>1000,53983=>1000,53984=>1000,53985=>1000,53986=>1000,53987=>1000,53988=>1000,53989=>1000,53990=>1000,53991=>1000,53992=>1000,53993=>1000,53994=>1000,53995=>1000,53996=>1000,53997=>1000,53998=>1000,53999=>1000,54000=>1000,54001=>1000,54002=>1000,54003=>1000,54004=>1000,54005=>1000,54006=>1000,54007=>1000,54008=>1000,54009=>1000,54010=>1000,54011=>1000,54012=>1000,54013=>1000,54014=>1000,54015=>1000,54016=>1000,54017=>1000,54018=>1000,54019=>1000,54020=>1000,54021=>1000,54022=>1000,54023=>1000,54024=>1000,54025=>1000,54026=>1000,54027=>1000,54028=>1000,54029=>1000,54030=>1000,54031=>1000,54032=>1000,54033=>1000,54034=>1000,54035=>1000,54036=>1000,54037=>1000,54038=>1000,54039=>1000,54040=>1000,54041=>1000,54042=>1000,54043=>1000,54044=>1000,54045=>1000,54046=>1000,54047=>1000,54048=>1000,54049=>1000,54050=>1000,54051=>1000,54052=>1000,54053=>1000,54054=>1000,54055=>1000,54056=>1000,54057=>1000,54058=>1000,54059=>1000,54060=>1000,54061=>1000,54062=>1000,54063=>1000,54064=>1000,54065=>1000,54066=>1000,54067=>1000,54068=>1000,54069=>1000,54070=>1000,54071=>1000,54072=>1000,54073=>1000,54074=>1000,54075=>1000,54076=>1000,54077=>1000,54078=>1000,54079=>1000,54080=>1000,54081=>1000,54082=>1000,54083=>1000,54084=>1000,54085=>1000,54086=>1000,54087=>1000,54088=>1000,54089=>1000,54090=>1000,54091=>1000,54092=>1000,54093=>1000,54094=>1000,54095=>1000,54096=>1000,54097=>1000,54098=>1000,54099=>1000,54100=>1000,54101=>1000,54102=>1000,54103=>1000,54104=>1000,54105=>1000,54106=>1000,54107=>1000,54108=>1000,54109=>1000,54110=>1000,54111=>1000,54112=>1000,54113=>1000,54114=>1000,54115=>1000,54116=>1000,54117=>1000,54118=>1000,54119=>1000,54120=>1000,54121=>1000,54122=>1000,54123=>1000,54124=>1000,54125=>1000,54126=>1000,54127=>1000,54128=>1000,54129=>1000,54130=>1000,54131=>1000,54132=>1000,54133=>1000,54134=>1000,54135=>1000,54136=>1000,54137=>1000,54138=>1000,54139=>1000,54140=>1000,54141=>1000,54142=>1000,54143=>1000,54144=>1000,54145=>1000,54146=>1000,54147=>1000,54148=>1000,54149=>1000,54150=>1000,54151=>1000,54152=>1000,54153=>1000,54154=>1000,54155=>1000,54156=>1000,54157=>1000,54158=>1000,54159=>1000,54160=>1000,54161=>1000,54162=>1000,54163=>1000,54164=>1000,54165=>1000,54166=>1000,54167=>1000,54168=>1000,54169=>1000,54170=>1000,54171=>1000,54172=>1000,54173=>1000,54174=>1000,54175=>1000,54176=>1000,54177=>1000,54178=>1000,54179=>1000,54180=>1000,54181=>1000,54182=>1000,54183=>1000,54184=>1000,54185=>1000,54186=>1000,54187=>1000,54188=>1000,54189=>1000,54190=>1000,54191=>1000,54192=>1000,54193=>1000,54194=>1000,54195=>1000,54196=>1000,54197=>1000,54198=>1000,54199=>1000,54200=>1000,54201=>1000,54202=>1000,54203=>1000,54204=>1000,54205=>1000,54206=>1000,54207=>1000,54208=>1000,54209=>1000,54210=>1000,54211=>1000,54212=>1000,54213=>1000,54214=>1000,54215=>1000,54216=>1000,54217=>1000,54218=>1000,54219=>1000,54220=>1000,54221=>1000,54222=>1000,54223=>1000,54224=>1000,54225=>1000,54226=>1000,54227=>1000,54228=>1000,54229=>1000,54230=>1000,54231=>1000,54232=>1000,54233=>1000,54234=>1000,54235=>1000,54236=>1000,54237=>1000,54238=>1000,54239=>1000,54240=>1000,54241=>1000,54242=>1000,54243=>1000,54244=>1000,54245=>1000,54246=>1000,54247=>1000,54248=>1000,54249=>1000,54250=>1000,54251=>1000,54252=>1000,54253=>1000,54254=>1000,54255=>1000,54256=>1000,54257=>1000,54258=>1000,54259=>1000,54260=>1000,54261=>1000,54262=>1000,54263=>1000,54264=>1000,54265=>1000,54266=>1000,54267=>1000,54268=>1000,54269=>1000,54270=>1000,54271=>1000,54272=>1000,54273=>1000,54274=>1000,54275=>1000,54276=>1000,54277=>1000,54278=>1000,54279=>1000,54280=>1000,54281=>1000,54282=>1000,54283=>1000,54284=>1000,54285=>1000,54286=>1000,54287=>1000,54288=>1000,54289=>1000,54290=>1000,54291=>1000,54292=>1000,54293=>1000,54294=>1000,54295=>1000,54296=>1000,54297=>1000,54298=>1000,54299=>1000,54300=>1000,54301=>1000,54302=>1000,54303=>1000,54304=>1000,54305=>1000,54306=>1000,54307=>1000,54308=>1000,54309=>1000,54310=>1000,54311=>1000,54312=>1000,54313=>1000,54314=>1000,54315=>1000,54316=>1000,54317=>1000,54318=>1000,54319=>1000,54320=>1000,54321=>1000,54322=>1000,54323=>1000,54324=>1000,54325=>1000,54326=>1000,54327=>1000,54328=>1000,54329=>1000,54330=>1000,54331=>1000,54332=>1000,54333=>1000,54334=>1000,54335=>1000,54336=>1000,54337=>1000,54338=>1000,54339=>1000,54340=>1000,54341=>1000,54342=>1000,54343=>1000,54344=>1000,54345=>1000,54346=>1000,54347=>1000,54348=>1000,54349=>1000,54350=>1000,54351=>1000,54352=>1000,54353=>1000,54354=>1000,54355=>1000,54356=>1000,54357=>1000,54358=>1000,54359=>1000,54360=>1000,54361=>1000,54362=>1000,54363=>1000,54364=>1000,54365=>1000,54366=>1000,54367=>1000,54368=>1000,54369=>1000,54370=>1000,54371=>1000,54372=>1000,54373=>1000,54374=>1000,54375=>1000,54376=>1000,54377=>1000,54378=>1000,54379=>1000,54380=>1000,54381=>1000,54382=>1000,54383=>1000,54384=>1000,54385=>1000,54386=>1000,54387=>1000,54388=>1000,54389=>1000,54390=>1000,54391=>1000,54392=>1000,54393=>1000,54394=>1000,54395=>1000,54396=>1000,54397=>1000,54398=>1000,54399=>1000,54400=>1000,54401=>1000,54402=>1000,54403=>1000,54404=>1000,54405=>1000,54406=>1000,54407=>1000,54408=>1000,54409=>1000,54410=>1000,54411=>1000,54412=>1000,54413=>1000,54414=>1000,54415=>1000,54416=>1000,54417=>1000,54418=>1000,54419=>1000,54420=>1000,54421=>1000,54422=>1000,54423=>1000,54424=>1000,54425=>1000,54426=>1000,54427=>1000,54428=>1000,54429=>1000,54430=>1000,54431=>1000,54432=>1000,54433=>1000,54434=>1000,54435=>1000,54436=>1000,54437=>1000,54438=>1000,54439=>1000,54440=>1000,54441=>1000,54442=>1000,54443=>1000,54444=>1000,54445=>1000,54446=>1000,54447=>1000,54448=>1000,54449=>1000,54450=>1000,54451=>1000,54452=>1000,54453=>1000,54454=>1000,54455=>1000,54456=>1000,54457=>1000,54458=>1000,54459=>1000,54460=>1000,54461=>1000,54462=>1000,54463=>1000,54464=>1000,54465=>1000,54466=>1000,54467=>1000,54468=>1000,54469=>1000,54470=>1000,54471=>1000,54472=>1000,54473=>1000,54474=>1000,54475=>1000,54476=>1000,54477=>1000,54478=>1000,54479=>1000,54480=>1000,54481=>1000,54482=>1000,54483=>1000,54484=>1000,54485=>1000,54486=>1000,54487=>1000,54488=>1000,54489=>1000,54490=>1000,54491=>1000,54492=>1000,54493=>1000,54494=>1000,54495=>1000,54496=>1000,54497=>1000,54498=>1000,54499=>1000,54500=>1000,54501=>1000,54502=>1000,54503=>1000,54504=>1000,54505=>1000,54506=>1000,54507=>1000,54508=>1000,54509=>1000,54510=>1000,54511=>1000,54512=>1000,54513=>1000,54514=>1000,54515=>1000,54516=>1000,54517=>1000,54518=>1000,54519=>1000,54520=>1000,54521=>1000,54522=>1000,54523=>1000,54524=>1000,54525=>1000,54526=>1000,54527=>1000,54528=>1000,54529=>1000,54530=>1000,54531=>1000,54532=>1000,54533=>1000,54534=>1000,54535=>1000,54536=>1000,54537=>1000,54538=>1000,54539=>1000,54540=>1000,54541=>1000,54542=>1000,54543=>1000,54544=>1000,54545=>1000,54546=>1000,54547=>1000,54548=>1000,54549=>1000,54550=>1000,54551=>1000,54552=>1000,54553=>1000,54554=>1000,54555=>1000,54556=>1000,54557=>1000,54558=>1000,54559=>1000,54560=>1000,54561=>1000,54562=>1000,54563=>1000,54564=>1000,54565=>1000,54566=>1000,54567=>1000,54568=>1000,54569=>1000,54570=>1000,54571=>1000,54572=>1000,54573=>1000,54574=>1000,54575=>1000,54576=>1000,54577=>1000,54578=>1000,54579=>1000,54580=>1000,54581=>1000,54582=>1000,54583=>1000,54584=>1000,54585=>1000,54586=>1000,54587=>1000,54588=>1000,54589=>1000,54590=>1000,54591=>1000,54592=>1000,54593=>1000,54594=>1000,54595=>1000,54596=>1000,54597=>1000,54598=>1000,54599=>1000,54600=>1000,54601=>1000,54602=>1000,54603=>1000,54604=>1000,54605=>1000,54606=>1000,54607=>1000,54608=>1000,54609=>1000,54610=>1000,54611=>1000,54612=>1000,54613=>1000,54614=>1000,54615=>1000,54616=>1000,54617=>1000,54618=>1000,54619=>1000,54620=>1000,54621=>1000,54622=>1000,54623=>1000,54624=>1000,54625=>1000,54626=>1000,54627=>1000,54628=>1000,54629=>1000,54630=>1000,54631=>1000,54632=>1000,54633=>1000,54634=>1000,54635=>1000,54636=>1000,54637=>1000,54638=>1000,54639=>1000,54640=>1000,54641=>1000,54642=>1000,54643=>1000,54644=>1000,54645=>1000,54646=>1000,54647=>1000,54648=>1000,54649=>1000,54650=>1000,54651=>1000,54652=>1000,54653=>1000,54654=>1000,54655=>1000,54656=>1000,54657=>1000,54658=>1000,54659=>1000,54660=>1000,54661=>1000,54662=>1000,54663=>1000,54664=>1000,54665=>1000,54666=>1000,54667=>1000,54668=>1000,54669=>1000,54670=>1000,54671=>1000,54672=>1000,54673=>1000,54674=>1000,54675=>1000,54676=>1000,54677=>1000,54678=>1000,54679=>1000,54680=>1000,54681=>1000,54682=>1000,54683=>1000,54684=>1000,54685=>1000,54686=>1000,54687=>1000,54688=>1000,54689=>1000,54690=>1000,54691=>1000,54692=>1000,54693=>1000,54694=>1000,54695=>1000,54696=>1000,54697=>1000,54698=>1000,54699=>1000,54700=>1000,54701=>1000,54702=>1000,54703=>1000,54704=>1000,54705=>1000,54706=>1000,54707=>1000,54708=>1000,54709=>1000,54710=>1000,54711=>1000,54712=>1000,54713=>1000,54714=>1000,54715=>1000,54716=>1000,54717=>1000,54718=>1000,54719=>1000,54720=>1000,54721=>1000,54722=>1000,54723=>1000,54724=>1000,54725=>1000,54726=>1000,54727=>1000,54728=>1000,54729=>1000,54730=>1000,54731=>1000,54732=>1000,54733=>1000,54734=>1000,54735=>1000,54736=>1000,54737=>1000,54738=>1000,54739=>1000,54740=>1000,54741=>1000,54742=>1000,54743=>1000,54744=>1000,54745=>1000,54746=>1000,54747=>1000,54748=>1000,54749=>1000,54750=>1000,54751=>1000,54752=>1000,54753=>1000,54754=>1000,54755=>1000,54756=>1000,54757=>1000,54758=>1000,54759=>1000,54760=>1000,54761=>1000,54762=>1000,54763=>1000,54764=>1000,54765=>1000,54766=>1000,54767=>1000,54768=>1000,54769=>1000,54770=>1000,54771=>1000,54772=>1000,54773=>1000,54774=>1000,54775=>1000,54776=>1000,54777=>1000,54778=>1000,54779=>1000,54780=>1000,54781=>1000,54782=>1000,54783=>1000,54784=>1000,54785=>1000,54786=>1000,54787=>1000,54788=>1000,54789=>1000,54790=>1000,54791=>1000,54792=>1000,54793=>1000,54794=>1000,54795=>1000,54796=>1000,54797=>1000,54798=>1000,54799=>1000,54800=>1000,54801=>1000,54802=>1000,54803=>1000,54804=>1000,54805=>1000,54806=>1000,54807=>1000,54808=>1000,54809=>1000,54810=>1000,54811=>1000,54812=>1000,54813=>1000,54814=>1000,54815=>1000,54816=>1000,54817=>1000,54818=>1000,54819=>1000,54820=>1000,54821=>1000,54822=>1000,54823=>1000,54824=>1000,54825=>1000,54826=>1000,54827=>1000,54828=>1000,54829=>1000,54830=>1000,54831=>1000,54832=>1000,54833=>1000,54834=>1000,54835=>1000,54836=>1000,54837=>1000,54838=>1000,54839=>1000,54840=>1000,54841=>1000,54842=>1000,54843=>1000,54844=>1000,54845=>1000,54846=>1000,54847=>1000,54848=>1000,54849=>1000,54850=>1000,54851=>1000,54852=>1000,54853=>1000,54854=>1000,54855=>1000,54856=>1000,54857=>1000,54858=>1000,54859=>1000,54860=>1000,54861=>1000,54862=>1000,54863=>1000,54864=>1000,54865=>1000,54866=>1000,54867=>1000,54868=>1000,54869=>1000,54870=>1000,54871=>1000,54872=>1000,54873=>1000,54874=>1000,54875=>1000,54876=>1000,54877=>1000,54878=>1000,54879=>1000,54880=>1000,54881=>1000,54882=>1000,54883=>1000,54884=>1000,54885=>1000,54886=>1000,54887=>1000,54888=>1000,54889=>1000,54890=>1000,54891=>1000,54892=>1000,54893=>1000,54894=>1000,54895=>1000,54896=>1000,54897=>1000,54898=>1000,54899=>1000,54900=>1000,54901=>1000,54902=>1000,54903=>1000,54904=>1000,54905=>1000,54906=>1000,54907=>1000,54908=>1000,54909=>1000,54910=>1000,54911=>1000,54912=>1000,54913=>1000,54914=>1000,54915=>1000,54916=>1000,54917=>1000,54918=>1000,54919=>1000,54920=>1000,54921=>1000,54922=>1000,54923=>1000,54924=>1000,54925=>1000,54926=>1000,54927=>1000,54928=>1000,54929=>1000,54930=>1000,54931=>1000,54932=>1000,54933=>1000,54934=>1000,54935=>1000,54936=>1000,54937=>1000,54938=>1000,54939=>1000,54940=>1000,54941=>1000,54942=>1000,54943=>1000,54944=>1000,54945=>1000,54946=>1000,54947=>1000,54948=>1000,54949=>1000,54950=>1000,54951=>1000,54952=>1000,54953=>1000,54954=>1000,54955=>1000,54956=>1000,54957=>1000,54958=>1000,54959=>1000,54960=>1000,54961=>1000,54962=>1000,54963=>1000,54964=>1000,54965=>1000,54966=>1000,54967=>1000,54968=>1000,54969=>1000,54970=>1000,54971=>1000,54972=>1000,54973=>1000,54974=>1000,54975=>1000,54976=>1000,54977=>1000,54978=>1000,54979=>1000,54980=>1000,54981=>1000,54982=>1000,54983=>1000,54984=>1000,54985=>1000,54986=>1000,54987=>1000,54988=>1000,54989=>1000,54990=>1000,54991=>1000,54992=>1000,54993=>1000,54994=>1000,54995=>1000,54996=>1000,54997=>1000,54998=>1000,54999=>1000,55000=>1000,55001=>1000,55002=>1000,55003=>1000,55004=>1000,55005=>1000,55006=>1000,55007=>1000,55008=>1000,55009=>1000,55010=>1000,55011=>1000,55012=>1000,55013=>1000,55014=>1000,55015=>1000,55016=>1000,55017=>1000,55018=>1000,55019=>1000,55020=>1000,55021=>1000,55022=>1000,55023=>1000,55024=>1000,55025=>1000,55026=>1000,55027=>1000,55028=>1000,55029=>1000,55030=>1000,55031=>1000,55032=>1000,55033=>1000,55034=>1000,55035=>1000,55036=>1000,55037=>1000,55038=>1000,55039=>1000,55040=>1000,55041=>1000,55042=>1000,55043=>1000,55044=>1000,55045=>1000,55046=>1000,55047=>1000,55048=>1000,55049=>1000,55050=>1000,55051=>1000,55052=>1000,55053=>1000,55054=>1000,55055=>1000,55056=>1000,55057=>1000,55058=>1000,55059=>1000,55060=>1000,55061=>1000,55062=>1000,55063=>1000,55064=>1000,55065=>1000,55066=>1000,55067=>1000,55068=>1000,55069=>1000,55070=>1000,55071=>1000,55072=>1000,55073=>1000,55074=>1000,55075=>1000,55076=>1000,55077=>1000,55078=>1000,55079=>1000,55080=>1000,55081=>1000,55082=>1000,55083=>1000,55084=>1000,55085=>1000,55086=>1000,55087=>1000,55088=>1000,55089=>1000,55090=>1000,55091=>1000,55092=>1000,55093=>1000,55094=>1000,55095=>1000,55096=>1000,55097=>1000,55098=>1000,55099=>1000,55100=>1000,55101=>1000,55102=>1000,55103=>1000,55104=>1000,55105=>1000,55106=>1000,55107=>1000,55108=>1000,55109=>1000,55110=>1000,55111=>1000,55112=>1000,55113=>1000,55114=>1000,55115=>1000,55116=>1000,55117=>1000,55118=>1000,55119=>1000,55120=>1000,55121=>1000,55122=>1000,55123=>1000,55124=>1000,55125=>1000,55126=>1000,55127=>1000,55128=>1000,55129=>1000,55130=>1000,55131=>1000,55132=>1000,55133=>1000,55134=>1000,55135=>1000,55136=>1000,55137=>1000,55138=>1000,55139=>1000,55140=>1000,55141=>1000,55142=>1000,55143=>1000,55144=>1000,55145=>1000,55146=>1000,55147=>1000,55148=>1000,55149=>1000,55150=>1000,55151=>1000,55152=>1000,55153=>1000,55154=>1000,55155=>1000,55156=>1000,55157=>1000,55158=>1000,55159=>1000,55160=>1000,55161=>1000,55162=>1000,55163=>1000,55164=>1000,55165=>1000,55166=>1000,55167=>1000,55168=>1000,55169=>1000,55170=>1000,55171=>1000,55172=>1000,55173=>1000,55174=>1000,55175=>1000,55176=>1000,55177=>1000,55178=>1000,55179=>1000,55180=>1000,55181=>1000,55182=>1000,55183=>1000,55184=>1000,55185=>1000,55186=>1000,55187=>1000,55188=>1000,55189=>1000,55190=>1000,55191=>1000,55192=>1000,55193=>1000,55194=>1000,55195=>1000,55196=>1000,55197=>1000,55198=>1000,55199=>1000,55200=>1000,55201=>1000,55202=>1000,55203=>1000,59393=>316,59394=>507,59395=>507,59396=>484,59397=>484,59416=>0,59492=>480,59495=>480,59536=>458,59557=>466,59558=>480,59559=>903,61441=>500,61442=>500,63232=>541,63233=>0,63234=>0,63235=>0,63236=>0,63237=>0,63238=>0,63239=>0,63240=>0,63241=>0,63242=>0,63243=>0,63244=>0,63245=>0,63246=>0,63247=>849,63248=>0,63249=>0,63250=>0,63251=>0,63252=>0,63253=>0,63254=>0,63255=>0,63256=>0,63257=>0,63258=>0,63260=>333,63261=>287,63744=>1000,63745=>1000,63746=>1000,63747=>1000,63748=>1000,63749=>1000,63750=>1000,63751=>1000,63752=>1000,63753=>1000,63754=>1000,63755=>1000,63756=>1000,63757=>1000,63758=>1000,63759=>1000,63760=>1000,63761=>1000,63762=>1000,63763=>1000,63764=>1000,63765=>1000,63766=>1000,63767=>1000,63768=>1000,63769=>1000,63770=>1000,63771=>1000,63772=>1000,63773=>1000,63774=>1000,63775=>1000,63776=>1000,63777=>1000,63778=>1000,63779=>1000,63780=>1000,63781=>1000,63782=>1000,63783=>1000,63784=>1000,63785=>1000,63786=>1000,63787=>1000,63788=>1000,63789=>1000,63790=>1000,63791=>1000,63792=>1000,63793=>1000,63794=>1000,63795=>1000,63796=>1000,63797=>1000,63798=>1000,63799=>1000,63800=>1000,63801=>1000,63802=>1000,63803=>1000,63804=>1000,63805=>1000,63806=>1000,63807=>1000,63808=>1000,63809=>1000,63810=>1000,63811=>1000,63812=>1000,63813=>1000,63814=>1000,63815=>1000,63816=>1000,63817=>1000,63818=>1000,63819=>1000,63820=>1000,63821=>1000,63822=>1000,63823=>1000,63824=>1000,63825=>1000,63826=>1000,63827=>1000,63828=>1000,63829=>1000,63830=>1000,63831=>1000,63832=>1000,63833=>1000,63834=>1000,63835=>1000,63836=>1000,63837=>1000,63838=>1000,63839=>1000,63840=>1000,63841=>1000,63842=>1000,63843=>1000,63844=>1000,63845=>1000,63846=>1000,63847=>1000,63848=>1000,63849=>1000,63850=>1000,63851=>1000,63852=>1000,63853=>1000,63854=>1000,63855=>1000,63856=>1000,63857=>1000,63858=>1000,63859=>1000,63860=>1000,63861=>1000,63862=>1000,63863=>1000,63864=>1000,63865=>1000,63866=>1000,63867=>1000,63868=>1000,63869=>1000,63870=>1000,63871=>1000,63872=>1000,63873=>1000,63874=>1000,63875=>1000,63876=>1000,63877=>1000,63878=>1000,63879=>1000,63880=>1000,63881=>1000,63882=>1000,63883=>1000,63884=>1000,63885=>1000,63886=>1000,63887=>1000,63888=>1000,63889=>1000,63890=>1000,63891=>1000,63892=>1000,63893=>1000,63894=>1000,63895=>1000,63896=>1000,63897=>1000,63898=>1000,63899=>1000,63900=>1000,63901=>1000,63902=>1000,63903=>1000,63904=>1000,63905=>1000,63906=>1000,63907=>1000,63908=>1000,63909=>1000,63910=>1000,63911=>1000,63912=>1000,63913=>1000,63914=>1000,63915=>1000,63916=>1000,63917=>1000,63918=>1000,63919=>1000,63920=>1000,63921=>1000,63922=>1000,63923=>1000,63924=>1000,63925=>1000,63926=>1000,63927=>1000,63928=>1000,63929=>1000,63930=>1000,63931=>1000,63932=>1000,63933=>1000,63934=>1000,63935=>1000,63936=>1000,63937=>1000,63938=>1000,63939=>1000,63940=>1000,63941=>1000,63942=>1000,63943=>1000,63944=>1000,63945=>1000,63946=>1000,63947=>1000,63948=>1000,63949=>1000,63950=>1000,63951=>1000,63952=>1000,63953=>1000,63954=>1000,63955=>1000,63956=>1000,63957=>1000,63958=>1000,63959=>1000,63960=>1000,63961=>1000,63962=>1000,63963=>1000,63964=>1000,63965=>1000,63966=>1000,63967=>1000,63968=>1000,63969=>1000,63970=>1000,63971=>1000,63972=>1000,63973=>1000,63974=>1000,63975=>1000,63976=>1000,63977=>1000,63978=>1000,63979=>1000,63980=>1000,63981=>1000,63982=>1000,63983=>1000,63984=>1000,63985=>1000,63986=>1000,63987=>1000,63988=>1000,63989=>1000,63990=>1000,63991=>1000,63992=>1000,63993=>1000,63994=>1000,63995=>1000,63996=>1000,63997=>1000,63998=>1000,63999=>1000,64000=>1000,64001=>1000,64002=>1000,64003=>1000,64004=>1000,64005=>1000,64006=>1000,64007=>1000,64008=>1000,64009=>1000,64010=>1000,64011=>1000,64012=>1000,64013=>1000,64014=>1000,64015=>1000,64016=>1000,64017=>1000,64018=>1000,64019=>1000,64020=>1000,64021=>1000,64022=>1000,64023=>1000,64024=>1000,64025=>1000,64026=>1000,64027=>1000,64028=>1000,64029=>1000,64030=>1000,64031=>1000,64032=>1000,64033=>1000,64034=>1000,64035=>1000,64036=>1000,64037=>1000,64038=>1000,64039=>1000,64040=>1000,64041=>1000,64042=>1000,64043=>1000,64044=>1000,64045=>1000,64256=>537,64257=>500,64258=>500,64259=>778,64260=>750,64261=>532,64262=>758,64275=>784,64276=>784,64277=>784,64278=>784,64279=>893,64286=>333,64287=>590,64288=>550,64289=>709,64290=>649,64291=>730,64292=>656,64293=>605,64294=>730,64295=>633,64296=>794,64297=>584,64298=>700,64299=>700,64300=>700,64301=>700,64302=>577,64303=>577,64304=>577,64305=>563,64306=>411,64307=>512,64308=>594,64309=>316,64310=>326,64312=>594,64313=>316,64314=>507,64315=>527,64316=>484,64318=>594,64320=>338,64321=>604,64323=>567,64324=>569,64326=>514,64327=>583,64328=>507,64329=>700,64330=>633,64331=>316,64332=>563,64333=>527,64334=>569,64335=>577,64336=>243,64337=>273,64338=>771,64339=>788,64340=>276,64341=>243,64342=>771,64343=>788,64344=>276,64345=>243,64346=>771,64347=>788,64348=>276,64349=>243,64350=>771,64351=>788,64352=>276,64353=>243,64354=>771,64355=>788,64356=>276,64357=>243,64358=>771,64359=>788,64360=>276,64361=>243,64362=>957,64363=>903,64364=>466,64365=>480,64366=>957,64367=>903,64368=>466,64369=>480,64370=>544,64371=>658,64372=>646,64373=>637,64374=>544,64375=>658,64376=>646,64377=>637,64378=>544,64379=>658,64380=>646,64381=>637,64382=>544,64383=>658,64384=>646,64385=>637,64386=>430,64387=>458,64388=>430,64389=>458,64390=>430,64391=>458,64392=>430,64393=>458,64394=>421,64395=>436,64396=>421,64397=>436,64398=>828,64399=>942,64400=>432,64401=>549,64402=>828,64403=>942,64404=>432,64405=>549,64406=>828,64407=>942,64408=>432,64409=>549,64410=>828,64411=>942,64412=>432,64413=>549,64414=>692,64415=>723,64416=>692,64417=>723,64418=>276,64419=>243,64420=>514,64421=>477,64422=>514,64423=>509,64424=>273,64425=>427,64426=>706,64427=>706,64428=>686,64429=>686,64430=>550,64431=>461,64432=>550,64433=>461,64467=>757,64468=>733,64469=>432,64470=>549,64471=>470,64472=>466,64473=>470,64474=>466,64475=>470,64476=>466,64477=>470,64478=>470,64479=>466,64480=>470,64481=>466,64482=>470,64483=>466,64484=>781,64485=>933,64486=>276,64487=>243,64488=>276,64489=>243,64490=>547,64491=>517,64492=>783,64493=>753,64494=>740,64495=>710,64496=>740,64497=>710,64498=>740,64499=>710,64500=>740,64501=>710,64502=>1207,64503=>1177,64504=>517,64505=>1067,64506=>1037,64507=>517,64508=>731,64509=>793,64510=>276,64511=>243,64512=>932,64513=>932,64514=>914,64515=>1067,64516=>1077,64517=>935,64518=>935,64519=>935,64520=>917,64521=>1070,64522=>1080,64523=>932,64524=>932,64525=>932,64526=>914,64527=>1067,64528=>1077,64529=>932,64530=>914,64531=>1067,64532=>1077,64533=>1305,64534=>1287,64535=>1305,64536=>1287,64537=>1305,64538=>1305,64539=>1287,64540=>1429,64541=>1429,64542=>1429,64543=>1411,64544=>1476,64545=>1458,64546=>1476,64547=>1476,64548=>1476,64549=>1458,64550=>1392,64551=>1374,64552=>1374,64553=>1245,64554=>1227,64555=>1245,64556=>1227,64557=>1125,64558=>1125,64559=>1125,64560=>1107,64561=>1260,64562=>1270,64563=>1125,64564=>1107,64565=>1260,64566=>1270,64567=>706,64568=>1091,64569=>1091,64570=>1091,64571=>1106,64572=>1073,64573=>1226,64574=>1236,64575=>932,64576=>932,64577=>932,64578=>914,64579=>1067,64580=>1077,64581=>1140,64582=>1140,64583=>1140,64584=>1122,64585=>1275,64586=>1285,64587=>932,64588=>932,64589=>932,64590=>914,64591=>1067,64592=>1077,64593=>1345,64594=>1327,64595=>1480,64596=>1490,64597=>932,64598=>932,64599=>932,64600=>914,64601=>1067,64602=>1077,64603=>430,64604=>421,64605=>731,64606=>296,64607=>300,64608=>300,64609=>300,64610=>300,64611=>300,64612=>680,64613=>680,64614=>884,64615=>967,64616=>1037,64617=>1047,64618=>680,64619=>680,64620=>884,64621=>967,64622=>1037,64623=>1047,64624=>680,64625=>680,64626=>884,64627=>967,64628=>1037,64629=>1047,64630=>680,64631=>680,64632=>884,64633=>967,64634=>1037,64635=>1047,64636=>1274,64637=>1284,64638=>1274,64639=>1284,64640=>821,64641=>1221,64642=>1188,64643=>1341,64644=>1351,64645=>884,64646=>1037,64647=>1047,64648=>806,64649=>1173,64650=>680,64651=>680,64652=>884,64653=>967,64654=>1037,64655=>1047,64656=>793,64657=>680,64658=>680,64659=>884,64660=>967,64661=>1037,64662=>1047,64663=>911,64664=>911,64665=>911,64666=>806,64667=>679,64668=>911,64669=>911,64670=>911,64671=>806,64672=>679,64673=>911,64674=>911,64675=>911,64676=>806,64677=>679,64678=>806,64679=>1284,64680=>1179,64681=>1284,64682=>1179,64683=>1284,64684=>1179,64685=>1408,64686=>1408,64687=>1408,64688=>1303,64689=>1455,64690=>1455,64691=>1350,64692=>1455,64693=>1455,64694=>1455,64695=>1350,64696=>1371,64697=>1266,64698=>1224,64699=>1119,64700=>1224,64701=>1119,64702=>1104,64703=>1104,64704=>1104,64705=>999,64706=>1104,64707=>999,64708=>1070,64709=>1070,64710=>1070,64711=>676,64712=>965,64713=>911,64714=>911,64715=>911,64716=>806,64717=>679,64718=>1119,64719=>1119,64720=>1119,64721=>1014,64722=>911,64723=>911,64724=>911,64725=>806,64726=>679,64727=>1324,64728=>1219,64729=>686,64730=>911,64731=>911,64732=>911,64733=>806,64734=>679,64735=>776,64736=>649,64737=>776,64738=>649,64739=>776,64740=>649,64741=>776,64742=>649,64743=>1303,64744=>1176,64745=>1303,64746=>1176,64747=>793,64748=>1082,64749=>776,64750=>776,64751=>649,64752=>776,64753=>649,64754=>306,64755=>302,64756=>298,64757=>1527,64758=>1537,64759=>1380,64760=>1390,64761=>1380,64762=>1390,64763=>1564,64764=>1574,64765=>1564,64766=>1574,64767=>1440,64768=>1450,64769=>1440,64770=>1450,64771=>1440,64772=>1450,64773=>1611,64774=>1621,64775=>1611,64776=>1621,64777=>1429,64778=>1429,64779=>1429,64780=>1411,64781=>1207,64782=>1207,64783=>1254,64784=>1254,64785=>1527,64786=>1537,64787=>1348,64788=>1358,64789=>1348,64790=>1358,64791=>1564,64792=>1574,64793=>1564,64794=>1574,64795=>1431,64796=>1441,64797=>1431,64798=>1441,64799=>1431,64800=>1441,64801=>1611,64802=>1621,64803=>1611,64804=>1621,64805=>1429,64806=>1429,64807=>1429,64808=>1411,64809=>1207,64810=>1207,64811=>1254,64812=>1254,64813=>1408,64814=>1408,64815=>1408,64816=>1303,64817=>1176,64818=>1176,64819=>1266,64820=>1408,64821=>1408,64822=>1408,64823=>1408,64824=>1408,64825=>1408,64826=>1266,64827=>1266,64828=>273,64829=>243,64830=>600,64831=>600,64848=>1444,64849=>1541,64850=>1549,64851=>1444,64852=>1444,64853=>1444,64854=>1444,64855=>1444,64856=>1830,64857=>1817,64858=>1975,64859=>1964,64860=>2046,64861=>2046,64862=>2202,64863=>1962,64864=>1941,64865=>1941,64866=>1944,64867=>1836,64868=>2114,64869=>2093,64870=>1991,64871=>2049,64872=>1941,64873=>2212,64874=>1962,64875=>1941,64876=>1944,64877=>1836,64878=>2249,64879=>2096,64880=>1988,64881=>1925,64882=>1904,64883=>1799,64884=>2070,64885=>1833,64886=>1729,64887=>1652,64888=>1881,64889=>1729,64890=>1892,64891=>1881,64892=>1759,64893=>1637,64894=>1670,64895=>1654,64896=>1522,64897=>1686,64898=>1675,64899=>1549,64900=>1541,64901=>1522,64902=>1444,64903=>1436,64904=>1444,64905=>1757,64906=>1652,64907=>1975,64908=>1757,64909=>1652,64910=>1757,64911=>1652,64914=>1757,64915=>1857,64916=>1752,64917=>1444,64918=>1675,64919=>1522,64920=>1444,64921=>1675,64922=>1581,64923=>1570,64924=>1417,64925=>1362,64926=>1686,64927=>1686,64928=>1675,64929=>1686,64930=>1675,64931=>1581,64932=>1570,64933=>1975,64934=>2069,64935=>1964,64936=>2202,64937=>2259,64938=>2212,64939=>2259,64940=>1686,64941=>1581,64942=>1686,64943=>1686,64944=>1581,64945=>1870,64946=>1817,64947=>1686,64948=>1637,64949=>1444,64950=>1892,64951=>1886,64952=>1549,64953=>1975,64954=>1444,64955=>1723,64956=>1522,64957=>1541,64958=>2080,64959=>2080,64960=>1975,64961=>1817,64962=>1686,64963=>1499,64964=>1757,64965=>1883,64966=>2212,64967=>1686,65008=>1523,65009=>1172,65010=>1159,65011=>1356,65012=>2111,65013=>2258,65014=>2130,65015=>1552,65016=>2046,65017=>1856,65018=>1930,65019=>1070,65056=>450,65057=>450,65058=>450,65059=>450,65072=>1000,65073=>1000,65074=>1000,65075=>1000,65076=>1000,65077=>1000,65078=>1000,65079=>1000,65080=>1000,65081=>1000,65082=>1000,65083=>1000,65084=>1000,65085=>1000,65086=>1000,65087=>1000,65088=>1000,65089=>1000,65090=>1000,65091=>1000,65092=>1000,65097=>1000,65098=>1000,65099=>1000,65100=>1000,65101=>1000,65102=>1000,65103=>1000,65104=>167,65105=>250,65106=>167,65108=>167,65109=>167,65110=>334,65111=>167,65112=>600,65113=>200,65114=>200,65115=>200,65116=>200,65117=>200,65118=>200,65119=>334,65120=>400,65121=>233,65122=>350,65123=>200,65124=>350,65125=>350,65126=>350,65128=>167,65129=>334,65130=>533,65131=>609,65136=>300,65137=>298,65138=>296,65140=>298,65142=>300,65143=>298,65144=>300,65145=>302,65146=>298,65147=>296,65148=>306,65149=>306,65150=>154,65151=>154,65152=>529,65153=>243,65154=>273,65155=>243,65156=>273,65157=>470,65158=>466,65159=>243,65160=>273,65161=>731,65162=>793,65163=>276,65164=>243,65165=>243,65166=>273,65167=>771,65168=>788,65169=>276,65170=>243,65171=>514,65172=>477,65173=>771,65174=>788,65175=>276,65176=>243,65177=>771,65178=>788,65179=>276,65180=>243,65181=>544,65182=>658,65183=>646,65184=>637,65185=>544,65186=>658,65187=>646,65188=>637,65189=>544,65190=>658,65191=>646,65192=>637,65193=>430,65194=>458,65195=>430,65196=>458,65197=>421,65198=>436,65199=>421,65200=>436,65201=>1194,65202=>1194,65203=>770,65204=>770,65205=>1194,65206=>1194,65207=>770,65208=>770,65209=>1291,65210=>1291,65211=>817,65212=>817,65213=>1291,65214=>1291,65215=>817,65216=>817,65217=>843,65218=>843,65219=>733,65220=>733,65221=>843,65222=>843,65223=>733,65224=>733,65225=>594,65226=>556,65227=>586,65228=>554,65229=>594,65230=>556,65231=>586,65232=>554,65233=>957,65234=>903,65235=>466,65236=>480,65237=>800,65238=>823,65239=>466,65240=>480,65241=>757,65242=>733,65243=>432,65244=>549,65245=>662,65246=>673,65247=>273,65248=>243,65249=>589,65250=>640,65251=>481,65252=>532,65253=>692,65254=>723,65255=>276,65256=>243,65257=>514,65258=>477,65259=>686,65260=>405,65261=>470,65262=>466,65263=>731,65264=>793,65265=>731,65266=>803,65267=>276,65268=>243,65269=>551,65270=>603,65271=>551,65272=>603,65273=>551,65274=>603,65275=>551,65276=>603,65281=>1000,65282=>1000,65283=>1000,65284=>1000,65285=>1000,65286=>1000,65287=>1000,65288=>1000,65289=>1000,65290=>1000,65291=>1000,65292=>1000,65293=>1000,65294=>1000,65295=>1000,65296=>1000,65297=>1000,65298=>1000,65299=>1000,65300=>1000,65301=>1000,65302=>1000,65303=>1000,65304=>1000,65305=>1000,65306=>1000,65307=>1000,65308=>1000,65309=>1000,65310=>1000,65311=>1000,65312=>1000,65313=>1000,65314=>1000,65315=>1000,65316=>1000,65317=>1000,65318=>1000,65319=>1000,65320=>1000,65321=>1000,65322=>1000,65323=>1000,65324=>1000,65325=>1000,65326=>1000,65327=>1000,65328=>1000,65329=>1000,65330=>1000,65331=>1000,65332=>1000,65333=>1000,65334=>1000,65335=>1000,65336=>1000,65337=>1000,65338=>1000,65339=>1000,65340=>1000,65341=>1000,65342=>1000,65343=>1000,65344=>1000,65345=>1000,65346=>1000,65347=>1000,65348=>1000,65349=>1000,65350=>1000,65351=>1000,65352=>1000,65353=>1000,65354=>1000,65355=>1000,65356=>1000,65357=>1000,65358=>1000,65359=>1000,65360=>1000,65361=>1000,65362=>1000,65363=>1000,65364=>1000,65365=>1000,65366=>1000,65367=>1000,65368=>1000,65369=>1000,65370=>1000,65371=>1000,65372=>1000,65373=>1000,65374=>1000,65377=>500,65378=>500,65379=>500,65380=>500,65381=>500,65382=>500,65383=>500,65384=>500,65385=>500,65386=>500,65387=>500,65388=>500,65389=>500,65390=>500,65391=>500,65392=>500,65393=>500,65394=>500,65395=>500,65396=>500,65397=>500,65398=>500,65399=>500,65400=>500,65401=>500,65402=>500,65403=>500,65404=>500,65405=>500,65406=>500,65407=>500,65408=>500,65409=>500,65410=>500,65411=>500,65412=>500,65413=>500,65414=>500,65415=>500,65416=>500,65417=>500,65418=>500,65419=>500,65420=>500,65421=>500,65422=>500,65423=>500,65424=>500,65425=>500,65426=>500,65427=>500,65428=>500,65429=>500,65430=>500,65431=>500,65432=>500,65433=>500,65434=>500,65435=>500,65436=>500,65437=>500,65438=>500,65439=>500,65440=>500,65441=>500,65442=>500,65443=>500,65444=>500,65445=>500,65446=>500,65447=>500,65448=>500,65449=>500,65450=>500,65451=>500,65452=>500,65453=>500,65454=>500,65455=>500,65456=>500,65457=>500,65458=>500,65459=>500,65460=>500,65461=>500,65462=>500,65463=>500,65464=>500,65465=>500,65466=>500,65467=>500,65468=>500,65469=>500,65470=>500,65474=>500,65475=>500,65476=>500,65477=>500,65478=>500,65479=>500,65482=>500,65483=>500,65484=>500,65485=>500,65486=>500,65487=>500,65490=>500,65491=>500,65492=>500,65493=>500,65494=>500,65495=>500,65498=>500,65499=>500,65500=>500,65504=>1000,65505=>1000,65506=>1000,65507=>1000,65508=>1000,65509=>1000,65510=>1000,65512=>500,65513=>500,65514=>500,65515=>500,65516=>500,65517=>500,65518=>500,65532=>1000,65533=>1000,65535=>1000);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/cid0kr.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/cid0kr.php
new file mode 100644
index 00000000..2e850645
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/cid0kr.php
@@ -0,0 +1,16 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='cidfont0';
+$name='ArialUnicodeMS';
+$up=-100;
+$ut=50;
+$dw=1000;
+$diff='';
+$originalsize=23275812;
+// Korean
+$enc='UniKS-UTF16-H';
+$cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'Korea1','Supplement'=>0);
+include(dirname(__FILE__).'/uni2cid_ak12.php');
+$desc=array('Flags'=>32,'FontBBox'=>'[-1011 -330 2260 1078]','ItalicAngle'=>0,'Ascent'=>1069,'Descent'=>-271,'Leading'=>0,'CapHeight'=>716,'XHeight'=>518,'StemV'=>34,'StemH'=>15,'AvgWidth'=>441,'MaxWidth'=>2259,'MissingWidth'=>1000);
+$cw=array(0=>1000,32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584,62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278,92=>278,93=>278,94=>469,95=>500,96=>333,97=>556,98=>556,99=>500,100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556,112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>500,176=>400,177=>584,178=>333,179=>333,180=>333,181=>556,182=>537,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834,190=>834,191=>611,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278,238=>278,239=>278,240=>556,241=>556,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>556,255=>500,256=>667,257=>556,258=>667,259=>556,260=>667,261=>556,262=>722,263=>500,264=>722,265=>500,266=>722,267=>500,268=>722,269=>500,270=>722,271=>627,272=>722,273=>556,274=>667,275=>556,276=>667,277=>556,278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>556,286=>778,287=>556,288=>778,289=>556,290=>778,291=>556,292=>722,293=>556,294=>722,295=>556,296=>278,297=>222,298=>278,299=>222,300=>278,301=>222,302=>278,303=>222,304=>278,305=>278,306=>751,307=>444,308=>500,309=>222,310=>667,311=>500,312=>437,313=>556,314=>222,315=>556,316=>222,317=>556,318=>222,319=>556,320=>318,321=>556,322=>222,323=>722,324=>556,325=>722,326=>556,327=>722,328=>556,329=>626,330=>723,331=>556,332=>778,333=>556,334=>778,335=>556,336=>778,337=>556,338=>1000,339=>944,340=>722,341=>333,342=>722,343=>333,344=>722,345=>333,346=>667,347=>500,348=>667,349=>500,350=>667,351=>500,352=>667,353=>500,354=>611,355=>278,356=>611,357=>406,358=>611,359=>278,360=>722,361=>556,362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556,372=>944,373=>722,374=>667,375=>500,376=>667,377=>611,378=>500,379=>611,380=>500,381=>611,382=>500,383=>222,384=>556,385=>740,386=>655,387=>556,388=>556,389=>556,390=>722,391=>766,392=>579,393=>722,394=>789,395=>655,396=>556,397=>557,398=>667,399=>729,400=>604,401=>611,402=>278,403=>791,404=>649,405=>806,406=>245,407=>322,408=>667,409=>500,410=>322,411=>500,412=>833,413=>722,414=>556,415=>778,416=>776,417=>556,418=>1019,419=>782,420=>735,421=>556,422=>722,423=>667,424=>500,425=>602,426=>366,427=>278,428=>571,429=>278,430=>611,431=>776,432=>620,433=>748,434=>667,435=>752,436=>615,437=>611,438=>500,439=>628,440=>628,441=>526,442=>480,443=>556,444=>556,445=>526,446=>556,447=>556,448=>278,449=>464,450=>474,451=>278,452=>1333,453=>1222,454=>1056,455=>1030,456=>778,457=>444,458=>1222,459=>944,460=>778,461=>667,462=>556,463=>278,464=>278,465=>778,466=>556,467=>722,468=>556,469=>722,470=>556,471=>722,472=>556,473=>722,474=>556,475=>722,476=>556,477=>556,478=>667,479=>556,480=>667,481=>556,482=>1000,483=>889,484=>778,485=>556,486=>778,487=>556,488=>667,489=>500,490=>778,491=>556,492=>778,493=>556,494=>534,495=>534,496=>222,497=>1333,498=>1222,499=>1056,500=>778,501=>556,506=>667,507=>556,508=>1000,509=>889,510=>778,511=>611,512=>667,513=>556,514=>667,515=>556,516=>667,517=>556,518=>667,519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>556,526=>778,527=>556,528=>722,529=>333,530=>722,531=>333,532=>722,533=>556,534=>722,535=>556,592=>556,593=>556,594=>556,595=>556,596=>500,597=>500,598=>556,599=>556,600=>556,601=>556,602=>777,603=>485,604=>485,605=>686,606=>519,607=>260,608=>556,609=>556,610=>557,611=>500,612=>500,613=>556,614=>556,615=>556,616=>242,617=>282,618=>356,619=>356,620=>425,621=>222,622=>635,623=>833,624=>833,625=>833,626=>556,627=>556,628=>558,629=>556,630=>715,631=>674,632=>558,633=>333,634=>333,635=>333,636=>333,637=>333,638=>312,639=>312,640=>530,641=>530,642=>500,643=>216,644=>276,645=>216,646=>222,647=>278,648=>278,649=>596,650=>558,651=>556,652=>500,653=>722,654=>500,655=>500,656=>500,657=>564,658=>530,659=>530,660=>464,661=>464,662=>464,663=>500,664=>614,665=>526,666=>519,667=>557,668=>558,669=>222,670=>500,671=>416,672=>556,673=>464,674=>464,675=>966,676=>966,677=>1030,678=>689,679=>484,680=>718,688=>326,689=>326,690=>153,691=>201,692=>201,693=>201,694=>304,695=>389,696=>278,697=>222,698=>372,699=>222,700=>222,701=>222,702=>222,703=>222,704=>250,705=>250,706=>320,707=>320,708=>320,709=>320,710=>333,711=>333,712=>192,713=>333,714=>333,715=>333,716=>192,717=>333,718=>333,719=>333,720=>300,721=>300,722=>222,723=>222,724=>340,725=>340,726=>280,727=>362,728=>333,729=>333,730=>333,731=>333,732=>333,733=>333,734=>333,736=>278,737=>153,738=>270,739=>274,740=>325,741=>360,742=>360,743=>360,744=>360,745=>360,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,864=>0,865=>0,884=>308,885=>308,890=>278,894=>278,900=>278,901=>278,902=>667,903=>278,904=>704,905=>759,906=>315,908=>778,910=>746,911=>758,912=>222,913=>667,914=>667,915=>550,916=>682,917=>667,918=>611,919=>722,920=>778,921=>278,922=>667,923=>667,924=>833,925=>722,926=>650,927=>778,928=>722,929=>667,931=>602,932=>611,933=>667,934=>808,935=>667,936=>804,937=>758,938=>278,939=>667,940=>576,941=>434,942=>556,943=>222,944=>551,945=>576,946=>563,947=>500,948=>557,949=>434,950=>440,951=>556,952=>556,953=>222,954=>498,955=>500,956=>553,957=>500,958=>432,959=>556,960=>678,961=>571,962=>472,963=>619,964=>382,965=>551,966=>649,967=>522,968=>729,969=>766,970=>222,971=>551,972=>556,973=>551,974=>766,976=>563,977=>616,978=>631,979=>726,980=>631,981=>644,982=>781,986=>722,988=>578,990=>570,992=>692,994=>880,995=>833,996=>684,997=>558,998=>680,999=>529,1000=>557,1001=>505,1002=>623,1003=>603,1004=>610,1005=>611,1006=>568,1007=>434,1008=>600,1009=>571,1010=>500,1011=>222,1025=>667,1026=>865,1027=>567,1028=>717,1029=>667,1030=>278,1031=>278,1032=>500,1033=>1105,1034=>1009,1035=>867,1036=>584,1038=>635,1039=>723,1040=>667,1041=>655,1042=>667,1043=>567,1044=>677,1045=>667,1046=>923,1047=>604,1048=>722,1049=>722,1050=>584,1051=>705,1052=>833,1053=>722,1054=>778,1055=>723,1056=>667,1057=>722,1058=>611,1059=>635,1060=>760,1061=>667,1062=>740,1063=>684,1064=>920,1065=>939,1066=>793,1067=>883,1068=>655,1069=>717,1070=>1006,1071=>722,1072=>556,1073=>573,1074=>531,1075=>383,1076=>583,1077=>556,1078=>669,1079=>458,1080=>559,1081=>559,1082=>437,1083=>571,1084=>683,1085=>552,1086=>556,1087=>542,1088=>556,1089=>500,1090=>458,1091=>500,1092=>823,1093=>500,1094=>562,1095=>533,1096=>802,1097=>823,1098=>620,1099=>717,1100=>523,1101=>510,1102=>744,1103=>542,1105=>556,1106=>556,1107=>383,1108=>510,1109=>500,1110=>222,1111=>278,1112=>222,1113=>873,1114=>811,1115=>556,1116=>437,1118=>500,1119=>542,1120=>976,1121=>766,1122=>656,1123=>521,1124=>950,1125=>694,1126=>667,1127=>597,1128=>952,1129=>817,1130=>654,1131=>600,1132=>932,1133=>817,1134=>604,1135=>458,1136=>804,1137=>729,1138=>778,1139=>556,1140=>667,1141=>500,1142=>667,1143=>500,1144=>1279,1145=>1060,1146=>778,1147=>556,1148=>976,1149=>766,1150=>976,1151=>766,1152=>722,1153=>514,1154=>686,1155=>334,1156=>382,1157=>334,1158=>334,1168=>435,1169=>339,1170=>567,1171=>383,1172=>656,1173=>556,1174=>923,1175=>669,1176=>604,1177=>458,1178=>584,1179=>437,1180=>584,1181=>437,1182=>584,1183=>437,1184=>764,1185=>537,1186=>741,1187=>573,1188=>900,1189=>670,1190=>736,1191=>560,1192=>778,1193=>560,1194=>722,1195=>500,1196=>611,1197=>458,1198=>667,1199=>500,1200=>667,1201=>500,1202=>667,1203=>500,1204=>916,1205=>661,1206=>684,1207=>533,1208=>684,1209=>533,1210=>684,1211=>556,1212=>829,1213=>667,1214=>829,1215=>667,1216=>278,1217=>923,1218=>669,1219=>584,1220=>437,1223=>735,1224=>570,1227=>684,1228=>533,1232=>667,1233=>556,1234=>667,1235=>556,1236=>1000,1237=>889,1238=>667,1239=>556,1240=>729,1241=>556,1242=>729,1243=>556,1244=>923,1245=>669,1246=>604,1247=>458,1248=>604,1249=>492,1250=>722,1251=>559,1252=>722,1253=>559,1254=>778,1255=>556,1256=>778,1257=>556,1258=>778,1259=>556,1262=>635,1263=>500,1264=>635,1265=>500,1266=>635,1267=>500,1268=>684,1269=>533,1272=>883,1273=>717,1329=>635,1330=>531,1331=>583,1332=>583,1333=>531,1334=>531,1335=>427,1336=>531,1337=>750,1338=>635,1339=>531,1340=>375,1341=>583,1342=>698,1343=>531,1344=>427,1345=>531,1346=>583,1347=>531,1348=>635,1349=>698,1350=>635,1351=>635,1352=>531,1353=>531,1354=>698,1355=>531,1356=>635,1357=>531,1358=>698,1359=>583,1360=>479,1361=>583,1362=>531,1363=>698,1364=>698,1365=>635,1366=>750,1369=>271,1370=>271,1371=>150,1372=>300,1373=>271,1374=>271,1375=>420,1377=>583,1378=>427,1379=>427,1380=>427,1381=>427,1382=>427,1383=>427,1384=>427,1385=>459,1386=>427,1387=>427,1388=>323,1389=>531,1390=>427,1391=>427,1392=>427,1393=>427,1394=>427,1395=>427,1396=>427,1397=>271,1398=>427,1399=>375,1400=>427,1401=>375,1402=>583,1403=>427,1404=>427,1405=>427,1406=>427,1407=>583,1408=>427,1409=>427,1410=>323,1411=>583,1412=>375,1413=>375,1414=>583,1415=>527,1417=>271,1425=>360,1426=>360,1427=>360,1428=>360,1429=>360,1430=>360,1431=>360,1432=>360,1433=>360,1434=>360,1435=>360,1436=>360,1437=>360,1438=>360,1439=>360,1440=>360,1441=>360,1443=>360,1444=>360,1445=>360,1446=>360,1447=>360,1448=>360,1449=>360,1450=>360,1451=>360,1452=>360,1453=>360,1454=>360,1455=>360,1456=>360,1457=>360,1458=>360,1459=>360,1460=>360,1461=>360,1462=>360,1463=>360,1464=>360,1465=>360,1467=>360,1468=>360,1469=>360,1470=>366,1471=>360,1472=>225,1473=>360,1474=>360,1475=>238,1476=>360,1488=>577,1489=>563,1490=>411,1491=>512,1492=>594,1493=>316,1494=>326,1495=>594,1496=>594,1497=>316,1498=>507,1499=>527,1500=>484,1501=>594,1502=>594,1503=>316,1504=>338,1505=>604,1506=>550,1507=>567,1508=>569,1509=>505,1510=>514,1511=>583,1512=>507,1513=>700,1514=>633,1520=>590,1521=>590,1522=>590,1523=>216,1524=>412,1548=>278,1563=>278,1567=>556,1569=>529,1570=>243,1571=>243,1572=>470,1573=>243,1574=>731,1575=>243,1576=>771,1577=>514,1578=>771,1579=>771,1580=>544,1581=>544,1582=>544,1583=>430,1584=>430,1585=>421,1586=>421,1587=>1194,1588=>1194,1589=>1291,1590=>1291,1591=>843,1592=>843,1593=>594,1594=>594,1600=>279,1601=>957,1602=>800,1603=>757,1604=>662,1605=>589,1606=>692,1607=>514,1608=>470,1609=>731,1610=>731,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1632=>480,1633=>480,1634=>480,1635=>480,1636=>480,1637=>480,1638=>480,1639=>480,1640=>480,1641=>480,1642=>547,1643=>278,1644=>278,1645=>438,1648=>0,1649=>243,1650=>243,1651=>243,1652=>0,1653=>380,1654=>470,1655=>548,1656=>772,1657=>771,1658=>771,1659=>771,1660=>771,1661=>771,1662=>771,1663=>771,1664=>771,1665=>544,1666=>544,1667=>544,1668=>544,1669=>544,1670=>544,1671=>544,1672=>430,1673=>430,1674=>430,1675=>430,1676=>430,1677=>430,1678=>430,1679=>430,1680=>430,1681=>421,1682=>421,1683=>421,1684=>421,1685=>421,1686=>419,1687=>421,1688=>421,1689=>421,1690=>1194,1691=>1194,1692=>1194,1693=>1291,1694=>1291,1695=>843,1696=>594,1697=>957,1698=>957,1699=>957,1700=>957,1701=>957,1702=>957,1703=>800,1704=>800,1705=>828,1706=>1058,1707=>828,1708=>757,1709=>757,1710=>757,1711=>828,1712=>828,1713=>828,1714=>828,1715=>828,1716=>828,1717=>662,1718=>662,1719=>662,1722=>692,1723=>692,1724=>692,1725=>692,1726=>706,1728=>514,1729=>509,1730=>509,1731=>509,1732=>470,1733=>470,1734=>470,1735=>470,1736=>470,1737=>470,1738=>470,1739=>470,1740=>731,1741=>841,1742=>731,1744=>731,1745=>731,1746=>550,1747=>550,1748=>279,1749=>514,1750=>726,1751=>558,1752=>321,1753=>318,1754=>342,1755=>373,1756=>716,1757=>688,1758=>852,1759=>288,1760=>288,1761=>388,1762=>350,1763=>716,1764=>146,1765=>282,1766=>339,1767=>339,1768=>415,1769=>514,1770=>220,1771=>220,1772=>220,1773=>350,1776=>480,1777=>480,1778=>480,1779=>480,1780=>480,1781=>480,1782=>480,1783=>480,1784=>480,1785=>480,2305=>0,2306=>0,2307=>294,2309=>693,2310=>910,2311=>533,2312=>533,2313=>590,2314=>713,2315=>920,2316=>677,2317=>611,2318=>611,2319=>611,2320=>611,2321=>910,2322=>910,2323=>910,2324=>910,2325=>667,2326=>732,2327=>593,2328=>639,2329=>624,2330=>688,2331=>713,2332=>688,2333=>712,2334=>697,2335=>502,2336=>533,2337=>583,2338=>523,2339=>693,2340=>585,2341=>638,2342=>533,2343=>640,2344=>585,2345=>585,2346=>565,2347=>699,2348=>592,2349=>689,2350=>633,2351=>600,2352=>486,2353=>486,2354=>680,2355=>730,2356=>730,2357=>592,2358=>684,2359=>608,2360=>646,2361=>546,2364=>0,2365=>373,2366=>319,2367=>319,2368=>319,2369=>0,2370=>0,2371=>0,2372=>0,2373=>0,2374=>0,2375=>0,2376=>0,2377=>319,2378=>319,2379=>319,2380=>319,2381=>0,2384=>884,2385=>0,2386=>0,2387=>0,2388=>0,2392=>667,2393=>732,2394=>593,2395=>688,2396=>583,2397=>523,2398=>699,2399=>600,2400=>920,2401=>677,2402=>0,2403=>0,2404=>331,2405=>513,2406=>639,2407=>639,2408=>639,2409=>639,2410=>639,2411=>639,2412=>639,2413=>639,2414=>639,2415=>639,2416=>362,2433=>0,2434=>430,2435=>430,2437=>786,2438=>1030,2439=>582,2440=>603,2441=>648,2442=>757,2443=>758,2444=>630,2447=>685,2448=>746,2451=>711,2452=>776,2453=>779,2454=>655,2455=>606,2456=>645,2457=>661,2458=>554,2459=>585,2460=>729,2461=>752,2462=>893,2463=>567,2464=>625,2465=>648,2466=>567,2467=>598,2468=>680,2469=>645,2470=>609,2471=>596,2472=>595,2474=>635,2475=>780,2476=>593,2477=>677,2478=>621,2479=>601,2480=>593,2482=>640,2486=>598,2487=>596,2488=>637,2489=>582,2492=>0,2494=>245,2495=>245,2496=>245,2497=>0,2498=>0,2499=>0,2500=>0,2503=>309,2504=>309,2507=>932,2508=>932,2509=>0,2519=>245,2524=>648,2525=>553,2527=>596,2528=>758,2529=>630,2530=>0,2531=>335,2534=>610,2535=>559,2536=>595,2537=>711,2538=>610,2539=>661,2540=>661,2541=>559,2542=>661,2543=>600,2544=>593,2545=>593,2546=>601,2547=>567,2548=>601,2549=>699,2550=>661,2551=>267,2552=>610,2553=>424,2554=>548,2562=>0,2565=>691,2566=>936,2567=>803,2568=>803,2569=>678,2570=>678,2575=>557,2576=>691,2579=>678,2580=>691,2581=>602,2582=>567,2583=>641,2584=>688,2585=>565,2586=>592,2587=>603,2588=>591,2589=>541,2590=>558,2591=>543,2592=>581,2593=>596,2594=>640,2595=>640,2596=>591,2597=>564,2598=>640,2599=>564,2600=>581,2602=>564,2603=>551,2604=>560,2605=>549,2606=>558,2607=>652,2608=>540,2610=>677,2611=>677,2613=>601,2614=>558,2616=>558,2617=>549,2620=>0,2622=>246,2623=>246,2624=>246,2625=>0,2626=>0,2631=>0,2632=>0,2635=>0,2636=>0,2637=>0,2649=>567,2650=>690,2651=>591,2652=>591,2654=>581,2662=>591,2663=>591,2664=>591,2665=>591,2666=>591,2667=>591,2668=>591,2669=>591,2670=>591,2671=>591,2672=>0,2673=>0,2674=>557,2675=>678,2676=>894,2689=>0,2690=>0,2691=>300,2693=>781,2694=>1044,2695=>589,2696=>589,2697=>560,2698=>758,2699=>806,2701=>781,2703=>781,2704=>781,2705=>1044,2707=>1044,2708=>1044,2709=>413,2710=>773,2711=>606,2712=>558,2713=>483,2714=>600,2715=>691,2716=>811,2717=>647,2718=>651,2719=>453,2720=>450,2721=>425,2722=>478,2723=>694,2724=>534,2725=>553,2726=>446,2727=>541,2728=>582,2730=>572,2731=>437,2732=>663,2733=>756,2734=>594,2735=>493,2736=>392,2738=>613,2739=>656,2741=>538,2742=>611,2743=>507,2744=>663,2745=>587,2748=>0,2749=>478,2750=>273,2751=>273,2752=>273,2753=>0,2754=>0,2755=>0,2756=>0,2757=>0,2759=>0,2760=>0,2761=>273,2763=>273,2764=>273,2765=>0,2768=>843,2784=>893,2790=>625,2791=>625,2792=>625,2793=>625,2794=>625,2795=>625,2796=>625,2797=>625,2798=>625,2799=>625,2817=>0,2818=>306,2819=>391,2821=>590,2822=>808,2823=>658,2824=>658,2825=>633,2826=>654,2827=>636,2828=>540,2831=>560,2832=>938,2835=>600,2836=>973,2837=>603,2838=>620,2839=>620,2840=>605,2841=>712,2842=>579,2843=>579,2844=>593,2845=>564,2846=>581,2847=>604,2848=>578,2849=>579,2850=>579,2851=>607,2852=>579,2853=>587,2854=>579,2855=>602,2856=>579,2858=>605,2859=>728,2860=>579,2861=>643,2862=>605,2863=>628,2864=>619,2866=>653,2867=>593,2870=>620,2871=>605,2872=>605,2873=>579,2876=>0,2877=>333,2878=>218,2879=>0,2880=>294,2881=>0,2882=>0,2883=>0,2887=>479,2888=>479,2891=>1026,2892=>1026,2893=>0,2902=>0,2903=>218,2908=>579,2909=>579,2911=>599,2912=>636,2913=>540,2918=>578,2919=>480,2920=>480,2921=>622,2922=>506,2923=>605,2924=>529,2925=>548,2926=>512,2927=>528,2928=>561,2946=>0,2947=>742,2949=>1002,2950=>1118,2951=>994,2952=>660,2953=>1012,2954=>1231,2958=>726,2959=>731,2960=>870,2962=>763,2963=>763,2964=>1636,2965=>667,2969=>830,2970=>584,2972=>876,2974=>986,2975=>802,2979=>1295,2980=>656,2984=>630,2985=>1012,2986=>694,2990=>727,2991=>790,2992=>545,2993=>718,2994=>821,2995=>871,2996=>724,2997=>873,2999=>1087,3000=>1098,3001=>1274,3006=>547,3007=>172,3008=>93,3009=>519,3010=>814,3014=>748,3015=>681,3016=>956,3018=>1666,3019=>1666,3020=>1994,3021=>0,3031=>871,3047=>667,3048=>1012,3049=>751,3050=>740,3051=>924,3052=>884,3053=>726,3054=>1002,3055=>825,3056=>717,3057=>719,3058=>774,3073=>365,3074=>601,3075=>346,3077=>720,3078=>786,3079=>567,3080=>1159,3081=>690,3082=>1047,3083=>1299,3084=>913,3086=>625,3087=>625,3088=>712,3090=>655,3091=>655,3092=>862,3093=>515,3094=>680,3095=>526,3096=>943,3097=>655,3098=>684,3099=>684,3100=>670,3101=>1205,3102=>732,3103=>888,3104=>597,3105=>709,3106=>709,3107=>809,3108=>715,3109=>702,3110=>702,3111=>702,3112=>607,3114=>623,3115=>623,3116=>681,3117=>681,3118=>932,3119=>1203,3120=>597,3121=>893,3122=>631,3123=>608,3125=>620,3126=>541,3127=>667,3128=>640,3129=>911,3134=>644,3135=>298,3136=>298,3137=>361,3138=>682,3139=>342,3140=>704,3142=>624,3143=>624,3144=>900,3146=>849,3147=>849,3148=>976,3149=>669,3157=>298,3158=>119,3168=>1620,3169=>1281,3174=>840,3175=>840,3176=>840,3177=>840,3178=>840,3179=>840,3180=>840,3181=>840,3182=>840,3183=>840,3202=>440,3203=>251,3205=>654,3206=>654,3207=>631,3208=>891,3209=>957,3210=>1293,3211=>1044,3212=>744,3214=>650,3215=>650,3216=>659,3218=>667,3219=>667,3220=>667,3221=>462,3222=>749,3223=>543,3224=>779,3225=>674,3226=>682,3227=>660,3228=>667,3229=>1171,3230=>926,3231=>671,3232=>557,3233=>669,3234=>669,3235=>728,3236=>544,3237=>672,3238=>672,3239=>672,3240=>560,3242=>668,3243=>668,3244=>681,3245=>687,3246=>972,3247=>1101,3248=>556,3249=>677,3250=>661,3251=>545,3253=>666,3254=>553,3255=>670,3256=>549,3257=>716,3262=>425,3263=>341,3264=>680,3265=>354,3266=>714,3267=>386,3268=>638,3270=>307,3271=>670,3272=>462,3274=>908,3275=>1251,3276=>434,3277=>336,3285=>344,3286=>404,3294=>673,3296=>1695,3297=>978,3302=>549,3303=>549,3304=>549,3305=>549,3306=>549,3307=>549,3308=>549,3309=>549,3310=>549,3311=>549,3330=>368,3331=>305,3333=>1201,3334=>1351,3335=>905,3336=>1459,3337=>635,3338=>1198,3339=>861,3340=>957,3342=>1211,3343=>1202,3344=>1839,3346=>642,3347=>1114,3348=>1195,3349=>861,3350=>982,3351=>874,3352=>1354,3353=>957,3354=>1016,3355=>1266,3356=>712,3357=>1454,3358=>1215,3359=>563,3360=>565,3361=>1192,3362=>1244,3363=>1268,3364=>878,3365=>966,3366=>545,3367=>879,3368=>879,3370=>1031,3371=>1175,3372=>1334,3373=>546,3374=>643,3375=>949,3376=>642,3377=>555,3378=>945,3379=>631,3380=>553,3381=>959,3382=>936,3383=>1122,3384=>1190,3385=>1112,3390=>475,3391=>418,3392=>442,3393=>340,3394=>340,3395=>473,3398=>640,3399=>530,3400=>1279,3402=>1368,3403=>1258,3404=>1447,3405=>0,3415=>553,3424=>861,3425=>1100,3430=>1095,3431=>929,3432=>854,3433=>1181,3434=>658,3435=>972,3436=>1210,3437=>650,3438=>959,3439=>896,3585=>595,3586=>648,3587=>665,3588=>608,3589=>608,3590=>665,3591=>471,3592=>556,3593=>652,3594=>664,3595=>681,3596=>816,3597=>849,3598=>620,3599=>620,3600=>541,3601=>785,3602=>826,3603=>887,3604=>598,3605=>605,3606=>595,3607=>650,3608=>541,3609=>652,3610=>608,3611=>608,3612=>630,3613=>630,3614=>695,3615=>695,3616=>620,3617=>581,3618=>588,3619=>501,3620=>595,3621=>569,3622=>620,3623=>519,3624=>592,3625=>659,3626=>574,3627=>654,3628=>695,3629=>566,3630=>574,3631=>517,3632=>452,3633=>0,3634=>496,3635=>496,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0,3647=>687,3648=>302,3649=>571,3650=>478,3651=>515,3652=>515,3653=>496,3654=>506,3655=>0,3656=>0,3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0,3663=>555,3664=>598,3665=>640,3666=>688,3667=>690,3668=>657,3669=>657,3670=>635,3671=>839,3672=>693,3673=>769,3674=>673,3675=>994,3713=>775,3714=>707,3716=>724,3719=>524,3720=>690,3722=>678,3725=>711,3732=>719,3733=>834,3734=>776,3735=>916,3737=>744,3738=>740,3739=>740,3740=>834,3741=>834,3742=>854,3743=>854,3745=>775,3746=>724,3747=>697,3749=>700,3751=>700,3754=>708,3755=>916,3757=>700,3758=>697,3759=>658,3760=>432,3761=>534,3762=>476,3763=>476,3764=>778,3765=>778,3766=>778,3767=>778,3768=>778,3769=>778,3771=>778,3772=>778,3773=>670,3776=>420,3777=>806,3778=>430,3779=>446,3780=>346,3782=>571,3784=>778,3785=>778,3786=>778,3787=>778,3788=>778,3789=>778,3792=>721,3793=>719,3794=>601,3795=>711,3796=>686,3797=>686,3798=>834,3799=>756,3800=>724,3801=>906,3804=>1272,3805=>1272,3840=>600,3841=>600,3842=>600,3843=>600,3844=>600,3845=>600,3846=>600,3847=>600,3848=>600,3849=>600,3850=>600,3851=>600,3852=>600,3853=>600,3854=>600,3855=>600,3856=>600,3857=>600,3858=>600,3859=>600,3860=>600,3861=>600,3862=>600,3863=>600,3864=>600,3865=>600,3866=>600,3867=>600,3868=>600,3869=>600,3870=>600,3871=>600,3872=>600,3873=>600,3874=>600,3875=>600,3876=>600,3877=>600,3878=>600,3879=>600,3880=>600,3881=>600,3882=>600,3883=>600,3884=>600,3885=>600,3886=>600,3887=>600,3888=>600,3889=>600,3890=>600,3891=>600,3892=>600,3893=>600,3894=>600,3895=>600,3896=>600,3897=>600,3898=>600,3899=>600,3900=>600,3901=>600,3902=>600,3903=>600,3904=>600,3905=>600,3906=>600,3907=>600,3908=>600,3909=>600,3910=>600,3911=>600,3913=>600,3914=>600,3915=>600,3916=>600,3917=>600,3918=>600,3919=>600,3920=>600,3921=>600,3922=>600,3923=>600,3924=>600,3925=>600,3926=>600,3927=>600,3928=>600,3929=>600,3930=>600,3931=>600,3932=>600,3933=>600,3934=>600,3935=>600,3936=>600,3937=>600,3938=>600,3939=>600,3940=>600,3941=>600,3942=>600,3943=>600,3944=>600,3945=>600,3953=>600,3954=>600,3955=>600,3956=>600,3957=>600,3958=>600,3959=>600,3960=>600,3961=>600,3962=>600,3963=>600,3964=>600,3965=>600,3966=>600,3967=>600,3968=>600,3969=>600,3970=>600,3971=>600,3972=>600,3973=>600,3974=>600,3975=>600,3976=>600,3977=>600,3978=>600,3979=>600,3984=>600,3985=>600,3986=>600,3987=>600,3988=>600,3989=>600,3991=>600,3993=>600,3994=>600,3995=>600,3996=>600,3997=>600,3998=>600,3999=>600,4000=>600,4001=>600,4002=>600,4003=>600,4004=>600,4005=>600,4006=>600,4007=>600,4008=>600,4009=>600,4010=>600,4011=>600,4012=>600,4013=>600,4017=>600,4018=>600,4019=>600,4020=>600,4021=>600,4022=>600,4023=>600,4025=>600,4256=>662,4257=>677,4258=>708,4259=>696,4260=>609,4261=>790,4262=>664,4263=>785,4264=>560,4265=>634,4266=>782,4267=>701,4268=>629,4269=>682,4270=>705,4271=>692,4272=>734,4273=>615,4274=>592,4275=>680,4276=>679,4277=>705,4278=>643,4279=>623,4280=>623,4281=>629,4282=>633,4283=>770,4284=>592,4285=>662,4286=>629,4287=>672,4288=>735,4289=>576,4290=>606,4291=>605,4292=>676,4293=>792,4304=>435,4305=>556,4306=>565,4307=>872,4308=>506,4309=>544,4310=>723,4311=>868,4312=>530,4313=>532,4314=>955,4315=>552,4316=>565,4317=>712,4318=>547,4319=>574,4320=>685,4321=>554,4322=>806,4323=>810,4324=>777,4325=>502,4326=>686,4327=>512,4328=>552,4329=>496,4330=>568,4331=>552,4332=>592,4333=>565,4334=>552,4335=>741,4336=>549,4337=>659,4338=>559,4339=>524,4340=>482,4341=>565,4342=>822,4347=>506,4352=>1000,4353=>1000,4354=>1000,4355=>1000,4356=>1000,4357=>1000,4358=>1000,4359=>1000,4360=>1000,4361=>1000,4362=>1000,4363=>1000,4364=>1000,4365=>1000,4366=>1000,4367=>1000,4368=>1000,4369=>1000,4370=>1000,4371=>1000,4372=>1000,4373=>1000,4374=>1000,4375=>1000,4376=>1000,4377=>1000,4378=>1000,4379=>1000,4380=>1000,4381=>1000,4382=>1000,4383=>1000,4384=>1000,4385=>1000,4386=>1000,4387=>1000,4388=>1000,4389=>1000,4390=>1000,4391=>1000,4392=>1000,4393=>1000,4394=>1000,4395=>1000,4396=>1000,4397=>1000,4398=>1000,4399=>1000,4400=>1000,4401=>1000,4402=>1000,4403=>1000,4404=>1000,4405=>1000,4406=>1000,4407=>1000,4408=>1000,4409=>1000,4410=>1000,4411=>1000,4412=>1000,4413=>1000,4414=>1000,4415=>1000,4416=>1000,4417=>1000,4418=>1000,4419=>1000,4420=>1000,4421=>1000,4422=>1000,4423=>1000,4424=>1000,4425=>1000,4426=>1000,4427=>1000,4428=>1000,4429=>1000,4430=>1000,4431=>1000,4432=>1000,4433=>1000,4434=>1000,4435=>1000,4436=>1000,4437=>1000,4438=>1000,4439=>1000,4440=>1000,4441=>1000,4447=>1000,4448=>1000,4449=>1000,4450=>1000,4451=>1000,4452=>1000,4453=>1000,4454=>1000,4455=>1000,4456=>1000,4457=>1000,4458=>1000,4459=>1000,4460=>1000,4461=>1000,4462=>1000,4463=>1000,4464=>1000,4465=>1000,4466=>1000,4467=>1000,4468=>1000,4469=>1000,4470=>1000,4471=>1000,4472=>1000,4473=>1000,4474=>1000,4475=>1000,4476=>1000,4477=>1000,4478=>1000,4479=>1000,4480=>1000,4481=>1000,4482=>1000,4483=>1000,4484=>1000,4485=>1000,4486=>1000,4487=>1000,4488=>1000,4489=>1000,4490=>1000,4491=>1000,4492=>1000,4493=>1000,4494=>1000,4495=>1000,4496=>1000,4497=>1000,4498=>1000,4499=>1000,4500=>1000,4501=>1000,4502=>1000,4503=>1000,4504=>1000,4505=>1000,4506=>1000,4507=>1000,4508=>1000,4509=>1000,4510=>1000,4511=>1000,4512=>1000,4513=>1000,4514=>1000,4520=>1000,4521=>1000,4522=>1000,4523=>1000,4524=>1000,4525=>1000,4526=>1000,4527=>1000,4528=>1000,4529=>1000,4530=>1000,4531=>1000,4532=>1000,4533=>1000,4534=>1000,4535=>1000,4536=>1000,4537=>1000,4538=>1000,4539=>1000,4540=>1000,4541=>1000,4542=>1000,4543=>1000,4544=>1000,4545=>1000,4546=>1000,4547=>1000,4548=>1000,4549=>1000,4550=>1000,4551=>1000,4552=>1000,4553=>1000,4554=>1000,4555=>1000,4556=>1000,4557=>1000,4558=>1000,4559=>1000,4560=>1000,4561=>1000,4562=>1000,4563=>1000,4564=>1000,4565=>1000,4566=>1000,4567=>1000,4568=>1000,4569=>1000,4570=>1000,4571=>1000,4572=>1000,4573=>1000,4574=>1000,4575=>1000,4576=>1000,4577=>1000,4578=>1000,4579=>1000,4580=>1000,4581=>1000,4582=>1000,4583=>1000,4584=>1000,4585=>1000,4586=>1000,4587=>1000,4588=>1000,4589=>1000,4590=>1000,4591=>1000,4592=>1000,4593=>1000,4594=>1000,4595=>1000,4596=>1000,4597=>1000,4598=>1000,4599=>1000,4600=>1000,4601=>1000,7680=>667,7681=>556,7682=>667,7683=>556,7684=>667,7685=>556,7686=>667,7687=>556,7688=>722,7689=>500,7690=>722,7691=>556,7692=>722,7693=>556,7694=>722,7695=>556,7696=>722,7697=>556,7698=>722,7699=>556,7700=>667,7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667,7707=>556,7708=>667,7709=>556,7710=>611,7711=>278,7712=>778,7713=>556,7714=>722,7715=>556,7716=>722,7717=>556,7718=>722,7719=>556,7720=>722,7721=>556,7722=>722,7723=>556,7724=>278,7725=>222,7726=>278,7727=>278,7728=>667,7729=>500,7730=>667,7731=>500,7732=>667,7733=>500,7734=>556,7735=>222,7736=>556,7737=>222,7738=>556,7739=>222,7740=>556,7741=>222,7742=>833,7743=>833,7744=>833,7745=>833,7746=>833,7747=>833,7748=>722,7749=>556,7750=>722,7751=>556,7752=>722,7753=>556,7754=>722,7755=>556,7756=>778,7757=>556,7758=>778,7759=>556,7760=>778,7761=>556,7762=>778,7763=>556,7764=>667,7765=>556,7766=>667,7767=>556,7768=>722,7769=>333,7770=>722,7771=>333,7772=>722,7773=>333,7774=>722,7775=>333,7776=>667,7777=>500,7778=>667,7779=>500,7780=>667,7781=>500,7782=>667,7783=>500,7784=>667,7785=>500,7786=>611,7787=>278,7788=>611,7789=>278,7790=>611,7791=>278,7792=>611,7793=>278,7794=>722,7795=>556,7796=>722,7797=>556,7798=>722,7799=>556,7800=>722,7801=>556,7802=>722,7803=>556,7804=>667,7805=>500,7806=>667,7807=>500,7808=>944,7809=>722,7810=>944,7811=>722,7812=>944,7813=>722,7814=>944,7815=>722,7816=>944,7817=>722,7818=>667,7819=>500,7820=>667,7821=>500,7822=>667,7823=>500,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500,7830=>556,7831=>278,7832=>722,7833=>500,7834=>556,7835=>278,7840=>667,7841=>556,7842=>667,7843=>556,7844=>667,7845=>556,7846=>667,7847=>556,7848=>667,7849=>556,7850=>667,7851=>556,7852=>667,7853=>556,7854=>667,7855=>556,7856=>667,7857=>556,7858=>667,7859=>556,7860=>667,7861=>556,7862=>667,7863=>556,7864=>667,7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667,7871=>556,7872=>667,7873=>556,7874=>667,7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278,7881=>278,7882=>278,7883=>222,7884=>778,7885=>556,7886=>778,7887=>556,7888=>778,7889=>556,7890=>778,7891=>556,7892=>778,7893=>556,7894=>778,7895=>556,7896=>778,7897=>556,7898=>776,7899=>556,7900=>776,7901=>556,7902=>776,7903=>556,7904=>776,7905=>556,7906=>776,7907=>556,7908=>722,7909=>556,7910=>722,7911=>556,7912=>776,7913=>620,7914=>776,7915=>620,7916=>776,7917=>620,7918=>776,7919=>620,7920=>776,7921=>620,7922=>667,7923=>500,7924=>667,7925=>500,7926=>667,7927=>500,7928=>667,7929=>500,7936=>576,7937=>576,7938=>576,7939=>576,7940=>576,7941=>576,7942=>576,7943=>576,7944=>667,7945=>667,7946=>680,7947=>680,7948=>680,7949=>680,7950=>718,7951=>718,7952=>434,7953=>434,7954=>434,7955=>434,7956=>434,7957=>434,7960=>692,7961=>692,7962=>823,7963=>823,7964=>823,7965=>823,7968=>556,7969=>556,7970=>556,7971=>556,7972=>556,7973=>556,7974=>556,7975=>556,7976=>747,7977=>747,7978=>878,7979=>878,7980=>878,7981=>878,7982=>923,7983=>923,7984=>222,7985=>222,7986=>222,7987=>222,7988=>222,7989=>222,7990=>222,7991=>222,7992=>303,7993=>303,7994=>434,7995=>434,7996=>434,7997=>434,7998=>479,7999=>479,8000=>556,8001=>556,8002=>556,8003=>556,8004=>556,8005=>556,8008=>778,8009=>778,8010=>894,8011=>894,8012=>894,8013=>894,8016=>551,8017=>551,8018=>551,8019=>551,8020=>551,8021=>551,8022=>551,8023=>551,8025=>777,8027=>893,8029=>885,8031=>940,8032=>766,8033=>766,8034=>766,8035=>766,8036=>766,8037=>766,8038=>766,8039=>766,8040=>758,8041=>758,8042=>874,8043=>874,8044=>868,8045=>867,8046=>911,8047=>911,8048=>576,8049=>576,8050=>434,8051=>434,8052=>556,8053=>556,8054=>222,8055=>222,8056=>556,8057=>556,8058=>551,8059=>551,8060=>766,8061=>766,8064=>576,8065=>576,8066=>576,8067=>576,8068=>576,8069=>576,8070=>576,8071=>576,8072=>667,8073=>667,8074=>680,8075=>680,8076=>680,8077=>680,8078=>718,8079=>718,8080=>556,8081=>556,8082=>556,8083=>556,8084=>556,8085=>556,8086=>556,8087=>556,8088=>747,8089=>747,8090=>878,8091=>878,8092=>878,8093=>878,8094=>923,8095=>923,8096=>766,8097=>766,8098=>766,8099=>766,8100=>766,8101=>766,8102=>766,8103=>766,8104=>758,8105=>758,8106=>874,8107=>874,8108=>868,8109=>867,8110=>911,8111=>911,8112=>576,8113=>576,8114=>576,8115=>576,8116=>576,8118=>576,8119=>576,8120=>667,8121=>667,8122=>667,8123=>667,8124=>667,8125=>278,8126=>278,8127=>278,8128=>278,8129=>278,8130=>556,8131=>556,8132=>556,8134=>556,8135=>556,8136=>693,8137=>704,8138=>748,8139=>759,8140=>722,8141=>278,8142=>278,8143=>278,8144=>222,8145=>222,8146=>222,8147=>222,8150=>222,8151=>222,8152=>278,8153=>278,8154=>304,8155=>304,8157=>278,8158=>278,8159=>278,8160=>551,8161=>551,8162=>551,8163=>551,8164=>571,8165=>571,8166=>551,8167=>551,8168=>667,8169=>667,8170=>742,8171=>746,8172=>693,8173=>278,8174=>278,8175=>278,8178=>766,8179=>766,8180=>766,8182=>766,8183=>766,8184=>778,8185=>778,8186=>758,8187=>758,8188=>758,8189=>278,8190=>278,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>100,8202=>50,8203=>0,8204=>0,8205=>0,8208=>333,8209=>333,8210=>556,8211=>500,8212=>1000,8213=>564,8214=>428,8215=>500,8216=>222,8217=>222,8218=>222,8219=>222,8220=>333,8221=>333,8222=>333,8223=>333,8224=>556,8225=>556,8226=>350,8227=>350,8228=>278,8229=>556,8230=>1000,8231=>278,8232=>0,8233=>0,8240=>1000,8241=>1330,8242=>222,8243=>372,8244=>522,8245=>206,8246=>356,8247=>506,8248=>312,8249=>333,8250=>333,8251=>1000,8252=>471,8253=>556,8254=>500,8255=>945,8256=>945,8257=>312,8258=>820,8259=>333,8260=>167,8261=>278,8262=>278,8304=>333,8308=>333,8309=>333,8310=>333,8311=>333,8312=>333,8313=>333,8314=>333,8315=>333,8316=>333,8317=>210,8318=>210,8319=>333,8320=>333,8321=>333,8322=>333,8323=>333,8324=>333,8325=>333,8326=>333,8327=>333,8328=>333,8329=>333,8330=>333,8331=>333,8332=>333,8333=>210,8334=>210,8352=>556,8353=>556,8354=>556,8355=>556,8356=>556,8357=>833,8358=>556,8359=>556,8360=>1024,8361=>940,8362=>784,8363=>556,8364=>556,8400=>600,8401=>600,8402=>600,8403=>600,8404=>700,8405=>700,8406=>600,8407=>600,8408=>600,8409=>600,8410=>600,8411=>600,8412=>600,8413=>900,8414=>900,8415=>900,8416=>900,8417=>700,8448=>889,8449=>889,8450=>667,8451=>1022,8452=>611,8453=>889,8454=>889,8455=>501,8456=>667,8457=>921,8458=>510,8459=>906,8460=>988,8461=>722,8462=>500,8463=>500,8464=>688,8465=>553,8466=>708,8467=>291,8468=>778,8469=>722,8470=>1073,8471=>737,8472=>740,8473=>556,8474=>722,8475=>927,8476=>795,8477=>667,8478=>667,8479=>667,8480=>1000,8481=>1174,8482=>1000,8483=>722,8484=>611,8485=>542,8486=>768,8487=>768,8488=>698,8489=>321,8490=>667,8491=>667,8492=>927,8493=>646,8494=>556,8495=>385,8496=>615,8497=>688,8498=>611,8499=>1115,8500=>406,8501=>688,8502=>688,8503=>344,8504=>688,8531=>834,8532=>834,8533=>834,8534=>834,8535=>834,8536=>834,8537=>834,8538=>834,8539=>834,8540=>834,8541=>834,8542=>834,8543=>834,8544=>278,8545=>555,8546=>832,8547=>933,8548=>667,8549=>934,8550=>1031,8551=>1268,8552=>944,8553=>667,8554=>944,8555=>1035,8556=>556,8557=>722,8558=>722,8559=>833,8560=>222,8561=>444,8562=>666,8563=>700,8564=>500,8565=>700,8566=>922,8567=>1144,8568=>712,8569=>500,8570=>712,8571=>934,8572=>222,8573=>500,8574=>556,8575=>833,8576=>983,8577=>722,8578=>983,8592=>713,8593=>713,8594=>713,8595=>713,8596=>713,8597=>713,8598=>713,8599=>713,8600=>713,8601=>713,8602=>713,8603=>713,8604=>713,8605=>713,8606=>713,8607=>713,8608=>713,8609=>713,8610=>713,8611=>713,8612=>713,8613=>713,8614=>713,8615=>713,8616=>713,8617=>713,8618=>713,8619=>713,8620=>713,8621=>813,8622=>813,8623=>713,8624=>713,8625=>713,8626=>713,8627=>713,8628=>713,8629=>713,8630=>713,8631=>713,8632=>713,8633=>713,8634=>800,8635=>800,8636=>713,8637=>713,8638=>713,8639=>713,8640=>713,8641=>713,8642=>713,8643=>713,8644=>713,8645=>713,8646=>713,8647=>713,8648=>713,8649=>713,8650=>713,8651=>713,8652=>713,8653=>713,8654=>950,8655=>713,8656=>713,8657=>713,8658=>713,8659=>713,8660=>863,8661=>713,8662=>713,8663=>713,8664=>713,8665=>713,8666=>713,8667=>713,8668=>813,8669=>813,8670=>713,8671=>713,8672=>713,8673=>713,8674=>713,8675=>713,8676=>713,8677=>713,8678=>713,8679=>713,8680=>713,8681=>713,8682=>713,8704=>600,8705=>600,8706=>494,8707=>600,8708=>600,8709=>800,8710=>612,8711=>612,8712=>549,8713=>549,8714=>549,8715=>549,8716=>549,8717=>549,8718=>549,8719=>823,8720=>823,8721=>713,8722=>584,8723=>584,8724=>584,8725=>167,8726=>278,8727=>389,8728=>400,8729=>400,8730=>600,8731=>600,8732=>600,8733=>549,8734=>549,8735=>584,8736=>584,8737=>584,8738=>584,8739=>260,8740=>444,8741=>418,8742=>602,8743=>561,8744=>561,8745=>561,8746=>561,8747=>506,8748=>806,8749=>1106,8750=>506,8751=>806,8752=>1106,8753=>506,8754=>506,8755=>506,8756=>561,8757=>561,8758=>422,8759=>561,8760=>584,8761=>584,8762=>584,8763=>584,8764=>584,8765=>584,8766=>584,8767=>584,8768=>422,8769=>584,8770=>584,8771=>584,8772=>584,8773=>584,8774=>584,8775=>584,8776=>584,8777=>584,8778=>584,8779=>584,8780=>584,8781=>584,8782=>584,8783=>584,8784=>584,8785=>584,8786=>584,8787=>584,8788=>737,8789=>737,8790=>584,8791=>584,8792=>584,8793=>584,8794=>584,8795=>584,8796=>584,8797=>584,8798=>584,8799=>584,8800=>584,8801=>584,8802=>584,8803=>584,8804=>584,8805=>584,8806=>584,8807=>584,8808=>584,8809=>584,8810=>969,8811=>969,8812=>584,8813=>584,8814=>584,8815=>584,8816=>584,8817=>584,8818=>584,8819=>584,8820=>584,8821=>584,8822=>584,8823=>584,8824=>584,8825=>584,8826=>584,8827=>584,8828=>584,8829=>584,8830=>584,8831=>584,8832=>584,8833=>584,8834=>678,8835=>678,8836=>678,8837=>678,8838=>678,8839=>678,8840=>678,8841=>678,8842=>678,8843=>678,8844=>561,8845=>561,8846=>561,8847=>678,8848=>678,8849=>673,8850=>673,8851=>561,8852=>561,8853=>800,8854=>800,8855=>800,8856=>800,8857=>800,8858=>800,8859=>800,8860=>800,8861=>800,8862=>800,8863=>800,8864=>800,8865=>800,8866=>549,8867=>549,8868=>549,8869=>549,8870=>399,8871=>399,8872=>549,8873=>549,8874=>549,8875=>672,8876=>549,8877=>549,8878=>549,8879=>672,8880=>549,8881=>549,8882=>549,8883=>549,8884=>549,8885=>549,8886=>713,8887=>713,8888=>713,8889=>549,8890=>549,8891=>584,8892=>584,8893=>584,8894=>584,8895=>584,8896=>561,8897=>561,8898=>561,8899=>561,8900=>549,8901=>250,8902=>549,8903=>649,8904=>630,8905=>630,8906=>630,8907=>630,8908=>630,8909=>584,8910=>561,8911=>561,8912=>668,8913=>668,8914=>668,8915=>668,8916=>561,8917=>602,8918=>584,8919=>584,8920=>1354,8921=>1354,8922=>584,8923=>584,8924=>584,8925=>584,8926=>584,8927=>584,8928=>584,8929=>584,8930=>673,8931=>673,8932=>673,8933=>673,8934=>584,8935=>584,8936=>584,8937=>584,8938=>584,8939=>584,8940=>584,8941=>584,8942=>278,8943=>1000,8944=>1000,8945=>1000,8960=>549,8962=>549,8963=>549,8964=>549,8965=>549,8966=>549,8967=>549,8968=>449,8969=>449,8970=>449,8971=>449,8972=>549,8973=>549,8974=>549,8975=>549,8976=>549,8977=>549,8978=>800,8979=>800,8980=>549,8981=>549,8982=>549,8983=>650,8984=>780,8985=>549,8986=>549,8987=>549,8988=>549,8989=>549,8990=>549,8991=>549,8992=>506,8993=>506,8994=>713,8995=>713,8996=>1000,8997=>1000,8998=>1000,8999=>1000,9000=>1000,9001=>329,9002=>329,9003=>1000,9004=>549,9005=>549,9006=>549,9007=>549,9008=>549,9009=>549,9010=>549,9011=>549,9012=>549,9013=>549,9014=>600,9015=>600,9016=>600,9017=>600,9018=>600,9019=>600,9020=>600,9021=>600,9022=>600,9023=>600,9024=>600,9025=>600,9026=>600,9027=>600,9028=>600,9029=>600,9030=>600,9031=>600,9032=>600,9033=>600,9034=>600,9035=>600,9036=>600,9037=>600,9038=>600,9039=>600,9040=>600,9041=>600,9042=>600,9043=>600,9044=>600,9045=>600,9046=>600,9047=>600,9048=>600,9049=>600,9050=>600,9051=>600,9052=>600,9053=>600,9054=>600,9055=>600,9056=>600,9057=>600,9058=>600,9059=>600,9060=>600,9061=>600,9062=>600,9063=>600,9064=>600,9065=>600,9066=>600,9067=>600,9068=>600,9069=>600,9070=>600,9071=>600,9072=>600,9073=>600,9074=>600,9075=>600,9076=>600,9077=>600,9078=>600,9079=>600,9080=>600,9081=>600,9082=>600,9109=>600,9216=>600,9217=>600,9218=>600,9219=>600,9220=>600,9221=>600,9222=>600,9223=>600,9224=>600,9225=>600,9226=>600,9227=>600,9228=>600,9229=>600,9230=>600,9231=>600,9232=>600,9233=>600,9234=>600,9235=>600,9236=>600,9237=>600,9238=>600,9239=>600,9240=>600,9241=>600,9242=>600,9243=>600,9244=>600,9245=>600,9246=>600,9247=>600,9248=>600,9249=>600,9250=>600,9251=>600,9252=>600,9280=>604,9281=>604,9282=>604,9283=>604,9284=>604,9285=>604,9286=>750,9287=>750,9288=>750,9289=>750,9290=>604,9312=>1000,9313=>1000,9314=>1000,9315=>1000,9316=>1000,9317=>1000,9318=>1000,9319=>1000,9320=>1000,9321=>1000,9322=>1000,9323=>1000,9324=>1000,9325=>1000,9326=>1000,9327=>1000,9328=>1000,9329=>1000,9330=>1000,9331=>1000,9332=>1000,9333=>1000,9334=>1000,9335=>1000,9336=>1000,9337=>1000,9338=>1000,9339=>1000,9340=>1000,9341=>1000,9342=>1000,9343=>1000,9344=>1000,9345=>1000,9346=>1000,9347=>1000,9348=>1000,9349=>1000,9350=>1000,9351=>1000,9352=>1000,9353=>1000,9354=>1000,9355=>1000,9356=>1000,9357=>1000,9358=>1000,9359=>1000,9360=>1000,9361=>1000,9362=>1000,9363=>1000,9364=>1000,9365=>1000,9366=>1000,9367=>1000,9368=>1000,9369=>1000,9370=>1000,9371=>1000,9372=>1000,9373=>1000,9374=>1000,9375=>1000,9376=>1000,9377=>1000,9378=>1000,9379=>1000,9380=>1000,9381=>1000,9382=>1000,9383=>1000,9384=>1000,9385=>1000,9386=>1000,9387=>1000,9388=>1000,9389=>1000,9390=>1000,9391=>1000,9392=>1000,9393=>1000,9394=>1000,9395=>1000,9396=>1000,9397=>1000,9398=>1000,9399=>1000,9400=>1000,9401=>1000,9402=>1000,9403=>1000,9404=>1000,9405=>1000,9406=>1000,9407=>1000,9408=>1000,9409=>1000,9410=>1000,9411=>1000,9412=>1000,9413=>1000,9414=>1000,9415=>1000,9416=>1000,9417=>1000,9418=>1000,9419=>1000,9420=>1000,9421=>1000,9422=>1000,9423=>1000,9424=>1000,9425=>1000,9426=>1000,9427=>1000,9428=>1000,9429=>1000,9430=>1000,9431=>1000,9432=>1000,9433=>1000,9434=>1000,9435=>1000,9436=>1000,9437=>1000,9438=>1000,9439=>1000,9440=>1000,9441=>1000,9442=>1000,9443=>1000,9444=>1000,9445=>1000,9446=>1000,9447=>1000,9448=>1000,9449=>1000,9450=>1000,9472=>600,9473=>600,9474=>600,9475=>600,9476=>600,9477=>600,9478=>600,9479=>600,9480=>600,9481=>600,9482=>600,9483=>600,9484=>600,9485=>600,9486=>600,9487=>600,9488=>600,9489=>600,9490=>600,9491=>600,9492=>600,9493=>600,9494=>600,9495=>600,9496=>600,9497=>600,9498=>600,9499=>600,9500=>600,9501=>600,9502=>600,9503=>600,9504=>600,9505=>600,9506=>600,9507=>600,9508=>600,9509=>600,9510=>600,9511=>600,9512=>600,9513=>600,9514=>600,9515=>600,9516=>600,9517=>600,9518=>600,9519=>600,9520=>600,9521=>600,9522=>600,9523=>600,9524=>600,9525=>600,9526=>600,9527=>600,9528=>600,9529=>600,9530=>600,9531=>600,9532=>600,9533=>600,9534=>600,9535=>600,9536=>600,9537=>600,9538=>600,9539=>600,9540=>600,9541=>600,9542=>600,9543=>600,9544=>600,9545=>600,9546=>600,9547=>600,9548=>600,9549=>600,9550=>600,9551=>600,9552=>600,9553=>600,9554=>600,9555=>600,9556=>600,9557=>600,9558=>600,9559=>600,9560=>600,9561=>600,9562=>600,9563=>600,9564=>600,9565=>600,9566=>600,9567=>600,9568=>600,9569=>600,9570=>600,9571=>600,9572=>600,9573=>600,9574=>600,9575=>600,9576=>600,9577=>600,9578=>600,9579=>600,9580=>600,9581=>600,9582=>600,9583=>600,9584=>600,9585=>600,9586=>600,9587=>600,9588=>600,9589=>600,9590=>600,9591=>600,9592=>600,9593=>600,9594=>600,9595=>600,9596=>600,9597=>600,9598=>600,9599=>600,9600=>600,9601=>600,9602=>600,9603=>600,9604=>600,9605=>600,9606=>600,9607=>600,9608=>600,9609=>600,9610=>600,9611=>600,9612=>600,9613=>600,9614=>600,9615=>600,9616=>600,9617=>600,9618=>600,9619=>600,9620=>600,9621=>600,9632=>600,9633=>600,9634=>600,9635=>600,9636=>600,9637=>600,9638=>600,9639=>600,9640=>600,9641=>600,9642=>600,9643=>600,9644=>600,9645=>600,9646=>600,9647=>600,9648=>600,9649=>600,9650=>600,9651=>600,9652=>600,9653=>600,9654=>600,9655=>600,9656=>600,9657=>600,9658=>600,9659=>600,9660=>600,9661=>600,9662=>600,9663=>600,9664=>600,9665=>600,9666=>600,9667=>600,9668=>600,9669=>600,9670=>600,9671=>600,9672=>600,9673=>600,9674=>600,9675=>600,9676=>600,9677=>600,9678=>600,9679=>600,9680=>600,9681=>600,9682=>600,9683=>600,9684=>600,9685=>600,9686=>600,9687=>600,9688=>600,9689=>600,9690=>600,9691=>600,9692=>600,9693=>600,9694=>600,9695=>600,9696=>600,9697=>600,9698=>600,9699=>600,9700=>600,9701=>600,9702=>600,9703=>600,9704=>600,9705=>600,9706=>600,9707=>600,9708=>600,9709=>600,9710=>600,9711=>600,9728=>750,9729=>1000,9730=>750,9731=>750,9732=>1000,9733=>816,9734=>823,9735=>500,9736=>500,9737=>800,9738=>800,9739=>800,9740=>800,9741=>800,9742=>719,9743=>719,9744=>734,9745=>734,9746=>734,9747=>762,9754=>960,9755=>960,9756=>939,9757=>939,9758=>939,9759=>939,9760=>750,9761=>600,9762=>750,9763=>750,9764=>580,9765=>460,9766=>444,9767=>650,9768=>444,9769=>768,9770=>800,9771=>850,9772=>675,9773=>800,9774=>750,9775=>750,9776=>900,9777=>900,9778=>900,9779=>900,9780=>900,9781=>900,9782=>900,9783=>900,9784=>750,9785=>750,9786=>750,9787=>750,9788=>750,9789=>750,9790=>750,9791=>740,9792=>740,9793=>740,9794=>740,9795=>653,9796=>490,9797=>632,9798=>780,9799=>560,9800=>838,9801=>780,9802=>734,9803=>887,9804=>780,9805=>1080,9806=>896,9807=>1080,9808=>804,9809=>868,9810=>922,9811=>696,9812=>1000,9813=>1000,9814=>1000,9815=>1000,9816=>1000,9817=>1000,9818=>1000,9819=>1000,9820=>1000,9821=>1000,9822=>1000,9823=>1000,9824=>722,9825=>734,9826=>674,9827=>804,9828=>722,9829=>734,9830=>674,9831=>804,9832=>860,9833=>423,9834=>592,9835=>750,9836=>750,9837=>439,9838=>439,9839=>439,9985=>974,9986=>961,9987=>974,9988=>980,9990=>789,9991=>790,9992=>791,9993=>690,9996=>549,9997=>855,9998=>911,9999=>933,10000=>911,10001=>945,10002=>974,10003=>755,10004=>846,10005=>762,10006=>761,10007=>571,10008=>677,10009=>763,10010=>760,10011=>759,10012=>754,10013=>494,10014=>552,10015=>537,10016=>577,10017=>692,10018=>786,10019=>788,10020=>788,10021=>790,10022=>793,10023=>794,10025=>823,10026=>789,10027=>841,10028=>823,10029=>833,10030=>816,10031=>831,10032=>923,10033=>744,10034=>723,10035=>749,10036=>790,10037=>792,10038=>695,10039=>776,10040=>768,10041=>792,10042=>759,10043=>707,10044=>708,10045=>682,10046=>701,10047=>826,10048=>815,10049=>789,10050=>789,10051=>707,10052=>687,10053=>696,10054=>689,10055=>786,10056=>787,10057=>713,10058=>791,10059=>785,10061=>873,10063=>762,10064=>762,10065=>759,10066=>759,10070=>784,10072=>138,10073=>277,10074=>415,10075=>392,10076=>392,10077=>668,10078=>668,10081=>732,10082=>544,10083=>544,10084=>910,10085=>667,10086=>760,10087=>760,10102=>788,10103=>788,10104=>788,10105=>788,10106=>788,10107=>788,10108=>788,10109=>788,10110=>788,10111=>788,10112=>788,10113=>788,10114=>788,10115=>788,10116=>788,10117=>788,10118=>788,10119=>788,10120=>788,10121=>788,10122=>788,10123=>788,10124=>788,10125=>788,10126=>788,10127=>788,10128=>788,10129=>788,10130=>788,10131=>788,10132=>894,10136=>748,10137=>924,10138=>748,10139=>918,10140=>927,10141=>928,10142=>928,10143=>834,10144=>873,10145=>828,10146=>924,10147=>924,10148=>917,10149=>930,10150=>931,10151=>463,10152=>883,10153=>836,10154=>836,10155=>867,10156=>867,10157=>696,10158=>696,10159=>874,10161=>874,10162=>760,10163=>946,10164=>771,10165=>865,10166=>771,10167=>888,10168=>967,10169=>888,10170=>831,10171=>873,10172=>927,10173=>970,10174=>918,12288=>1000,12289=>1000,12290=>1000,12291=>1000,12292=>1000,12293=>1000,12294=>1000,12295=>1000,12296=>1000,12297=>1000,12298=>1000,12299=>1000,12300=>1000,12301=>1000,12302=>1000,12303=>1000,12304=>1000,12305=>1000,12306=>1000,12307=>1000,12308=>1000,12309=>1000,12310=>1000,12311=>1000,12312=>1000,12313=>1000,12314=>1000,12315=>1000,12316=>1000,12317=>1000,12318=>1000,12319=>1000,12320=>1000,12321=>1000,12322=>1000,12323=>1000,12324=>1000,12325=>1000,12326=>1000,12327=>1000,12328=>1000,12329=>1000,12330=>1000,12331=>1000,12332=>1000,12333=>1000,12334=>1000,12335=>1000,12336=>1000,12337=>1000,12338=>1000,12339=>1000,12340=>1000,12341=>1000,12342=>1000,12343=>1000,12351=>1000,12353=>1000,12354=>1000,12355=>1000,12356=>1000,12357=>1000,12358=>1000,12359=>1000,12360=>1000,12361=>1000,12362=>1000,12363=>1000,12364=>1000,12365=>1000,12366=>1000,12367=>1000,12368=>1000,12369=>1000,12370=>1000,12371=>1000,12372=>1000,12373=>1000,12374=>1000,12375=>1000,12376=>1000,12377=>1000,12378=>1000,12379=>1000,12380=>1000,12381=>1000,12382=>1000,12383=>1000,12384=>1000,12385=>1000,12386=>1000,12387=>1000,12388=>1000,12389=>1000,12390=>1000,12391=>1000,12392=>1000,12393=>1000,12394=>1000,12395=>1000,12396=>1000,12397=>1000,12398=>1000,12399=>1000,12400=>1000,12401=>1000,12402=>1000,12403=>1000,12404=>1000,12405=>1000,12406=>1000,12407=>1000,12408=>1000,12409=>1000,12410=>1000,12411=>1000,12412=>1000,12413=>1000,12414=>1000,12415=>1000,12416=>1000,12417=>1000,12418=>1000,12419=>1000,12420=>1000,12421=>1000,12422=>1000,12423=>1000,12424=>1000,12425=>1000,12426=>1000,12427=>1000,12428=>1000,12429=>1000,12430=>1000,12431=>1000,12432=>1000,12433=>1000,12434=>1000,12435=>1000,12436=>1000,12441=>1000,12442=>1000,12443=>1000,12444=>1000,12445=>1000,12446=>1000,12449=>1000,12450=>1000,12451=>1000,12452=>1000,12453=>1000,12454=>1000,12455=>1000,12456=>1000,12457=>1000,12458=>1000,12459=>1000,12460=>1000,12461=>1000,12462=>1000,12463=>1000,12464=>1000,12465=>1000,12466=>1000,12467=>1000,12468=>1000,12469=>1000,12470=>1000,12471=>1000,12472=>1000,12473=>1000,12474=>1000,12475=>1000,12476=>1000,12477=>1000,12478=>1000,12479=>1000,12480=>1000,12481=>1000,12482=>1000,12483=>1000,12484=>1000,12485=>1000,12486=>1000,12487=>1000,12488=>1000,12489=>1000,12490=>1000,12491=>1000,12492=>1000,12493=>1000,12494=>1000,12495=>1000,12496=>1000,12497=>1000,12498=>1000,12499=>1000,12500=>1000,12501=>1000,12502=>1000,12503=>1000,12504=>1000,12505=>1000,12506=>1000,12507=>1000,12508=>1000,12509=>1000,12510=>1000,12511=>1000,12512=>1000,12513=>1000,12514=>1000,12515=>1000,12516=>1000,12517=>1000,12518=>1000,12519=>1000,12520=>1000,12521=>1000,12522=>1000,12523=>1000,12524=>1000,12525=>1000,12526=>1000,12527=>1000,12528=>1000,12529=>1000,12530=>1000,12531=>1000,12532=>1000,12533=>1000,12534=>1000,12535=>1000,12536=>1000,12537=>1000,12538=>1000,12539=>1000,12540=>1000,12541=>1000,12542=>1000,12549=>1000,12550=>1000,12551=>1000,12552=>1000,12553=>1000,12554=>1000,12555=>1000,12556=>1000,12557=>1000,12558=>1000,12559=>1000,12560=>1000,12561=>1000,12562=>1000,12563=>1000,12564=>1000,12565=>1000,12566=>1000,12567=>1000,12568=>1000,12569=>1000,12570=>1000,12571=>1000,12572=>1000,12573=>1000,12574=>1000,12575=>1000,12576=>1000,12577=>1000,12578=>1000,12579=>1000,12580=>1000,12581=>1000,12582=>1000,12583=>1000,12584=>1000,12585=>1000,12586=>1000,12587=>1000,12588=>1000,12593=>1000,12594=>1000,12595=>1000,12596=>1000,12597=>1000,12598=>1000,12599=>1000,12600=>1000,12601=>1000,12602=>1000,12603=>1000,12604=>1000,12605=>1000,12606=>1000,12607=>1000,12608=>1000,12609=>1000,12610=>1000,12611=>1000,12612=>1000,12613=>1000,12614=>1000,12615=>1000,12616=>1000,12617=>1000,12618=>1000,12619=>1000,12620=>1000,12621=>1000,12622=>1000,12623=>1000,12624=>1000,12625=>1000,12626=>1000,12627=>1000,12628=>1000,12629=>1000,12630=>1000,12631=>1000,12632=>1000,12633=>1000,12634=>1000,12635=>1000,12636=>1000,12637=>1000,12638=>1000,12639=>1000,12640=>1000,12641=>1000,12642=>1000,12643=>1000,12644=>1000,12645=>1000,12646=>1000,12647=>1000,12648=>1000,12649=>1000,12650=>1000,12651=>1000,12652=>1000,12653=>1000,12654=>1000,12655=>1000,12656=>1000,12657=>1000,12658=>1000,12659=>1000,12660=>1000,12661=>1000,12662=>1000,12663=>1000,12664=>1000,12665=>1000,12666=>1000,12667=>1000,12668=>1000,12669=>1000,12670=>1000,12671=>1000,12672=>1000,12673=>1000,12674=>1000,12675=>1000,12676=>1000,12677=>1000,12678=>1000,12679=>1000,12680=>1000,12681=>1000,12682=>1000,12683=>1000,12684=>1000,12685=>1000,12686=>1000,12688=>1000,12689=>1000,12690=>1000,12691=>1000,12692=>1000,12693=>1000,12694=>1000,12695=>1000,12696=>1000,12697=>1000,12698=>1000,12699=>1000,12700=>1000,12701=>1000,12702=>1000,12703=>1000,12800=>1000,12801=>1000,12802=>1000,12803=>1000,12804=>1000,12805=>1000,12806=>1000,12807=>1000,12808=>1000,12809=>1000,12810=>1000,12811=>1000,12812=>1000,12813=>1000,12814=>1000,12815=>1000,12816=>1000,12817=>1000,12818=>1000,12819=>1000,12820=>1000,12821=>1000,12822=>1000,12823=>1000,12824=>1000,12825=>1000,12826=>1000,12827=>1000,12828=>1000,12832=>1000,12833=>1000,12834=>1000,12835=>1000,12836=>1000,12837=>1000,12838=>1000,12839=>1000,12840=>1000,12841=>1000,12842=>1000,12843=>1000,12844=>1000,12845=>1000,12846=>1000,12847=>1000,12848=>1000,12849=>1000,12850=>1000,12851=>1000,12852=>1000,12853=>1000,12854=>1000,12855=>1000,12856=>1000,12857=>1000,12858=>1000,12859=>1000,12860=>1000,12861=>1000,12862=>1000,12863=>1000,12864=>1000,12865=>1000,12866=>1000,12867=>1000,12896=>1000,12897=>1000,12898=>1000,12899=>1000,12900=>1000,12901=>1000,12902=>1000,12903=>1000,12904=>1000,12905=>1000,12906=>1000,12907=>1000,12908=>1000,12909=>1000,12910=>1000,12911=>1000,12912=>1000,12913=>1000,12914=>1000,12915=>1000,12916=>1000,12917=>1000,12918=>1000,12919=>1000,12920=>1000,12921=>1000,12922=>1000,12923=>1000,12927=>1000,12928=>1000,12929=>1000,12930=>1000,12931=>1000,12932=>1000,12933=>1000,12934=>1000,12935=>1000,12936=>1000,12937=>1000,12938=>1000,12939=>1000,12940=>1000,12941=>1000,12942=>1000,12943=>1000,12944=>1000,12945=>1000,12946=>1000,12947=>1000,12948=>1000,12949=>1000,12950=>1000,12951=>1000,12952=>1000,12953=>1000,12954=>1000,12955=>1000,12956=>1000,12957=>1000,12958=>1000,12959=>1000,12960=>1000,12961=>1000,12962=>1000,12963=>1000,12964=>1000,12965=>1000,12966=>1000,12967=>1000,12968=>1000,12969=>1000,12970=>1000,12971=>1000,12972=>1000,12973=>1000,12974=>1000,12975=>1000,12976=>1000,12992=>1000,12993=>1000,12994=>1000,12995=>1000,12996=>1000,12997=>1000,12998=>1000,12999=>1000,13000=>1000,13001=>1000,13002=>1000,13003=>1000,13008=>1000,13009=>1000,13010=>1000,13011=>1000,13012=>1000,13013=>1000,13014=>1000,13015=>1000,13016=>1000,13017=>1000,13018=>1000,13019=>1000,13020=>1000,13021=>1000,13022=>1000,13023=>1000,13024=>1000,13025=>1000,13026=>1000,13027=>1000,13028=>1000,13029=>1000,13030=>1000,13031=>1000,13032=>1000,13033=>1000,13034=>1000,13035=>1000,13036=>1000,13037=>1000,13038=>1000,13039=>1000,13040=>1000,13041=>1000,13042=>1000,13043=>1000,13044=>1000,13045=>1000,13046=>1000,13047=>1000,13048=>1000,13049=>1000,13050=>1000,13051=>1000,13052=>1000,13053=>1000,13054=>1000,13056=>1000,13057=>1000,13058=>1000,13059=>1000,13060=>1000,13061=>1000,13062=>1000,13063=>1000,13064=>1000,13065=>1000,13066=>1000,13067=>1000,13068=>1000,13069=>1000,13070=>1000,13071=>1000,13072=>1000,13073=>1000,13074=>1000,13075=>1000,13076=>1000,13077=>1000,13078=>1000,13079=>1000,13080=>1000,13081=>1000,13082=>1000,13083=>1000,13084=>1000,13085=>1000,13086=>1000,13087=>1000,13088=>1000,13089=>1000,13090=>1000,13091=>1000,13092=>1000,13093=>1000,13094=>1000,13095=>1000,13096=>1000,13097=>1000,13098=>1000,13099=>1000,13100=>1000,13101=>1000,13102=>1000,13103=>1000,13104=>1000,13105=>1000,13106=>1000,13107=>1000,13108=>1000,13109=>1000,13110=>1000,13111=>1000,13112=>1000,13113=>1000,13114=>1000,13115=>1000,13116=>1000,13117=>1000,13118=>1000,13119=>1000,13120=>1000,13121=>1000,13122=>1000,13123=>1000,13124=>1000,13125=>1000,13126=>1000,13127=>1000,13128=>1000,13129=>1000,13130=>1000,13131=>1000,13132=>1000,13133=>1000,13134=>1000,13135=>1000,13136=>1000,13137=>1000,13138=>1000,13139=>1000,13140=>1000,13141=>1000,13142=>1000,13143=>1000,13144=>1000,13145=>1000,13146=>1000,13147=>1000,13148=>1000,13149=>1000,13150=>1000,13151=>1000,13152=>1000,13153=>1000,13154=>1000,13155=>1000,13156=>1000,13157=>1000,13158=>1000,13159=>1000,13160=>1000,13161=>1000,13162=>1000,13163=>1000,13164=>1000,13165=>1000,13166=>1000,13167=>1000,13168=>1000,13169=>1000,13170=>1000,13171=>1000,13172=>1000,13173=>1000,13174=>1000,13179=>1000,13180=>1000,13181=>1000,13182=>1000,13183=>1000,13184=>1000,13185=>1000,13186=>1000,13187=>1000,13188=>1000,13189=>1000,13190=>1000,13191=>1000,13192=>1000,13193=>1000,13194=>1000,13195=>1000,13196=>1000,13197=>1000,13198=>1000,13199=>1000,13200=>1000,13201=>1000,13202=>1000,13203=>1000,13204=>1000,13205=>1000,13206=>1000,13207=>1000,13208=>1000,13209=>1000,13210=>1000,13211=>1000,13212=>1000,13213=>1000,13214=>1000,13215=>1000,13216=>1000,13217=>1000,13218=>1000,13219=>1000,13220=>1000,13221=>1000,13222=>1000,13223=>1000,13224=>1000,13225=>1000,13226=>1000,13227=>1000,13228=>1000,13229=>1000,13230=>1000,13231=>1000,13232=>1000,13233=>1000,13234=>1000,13235=>1000,13236=>1000,13237=>1000,13238=>1000,13239=>1000,13240=>1000,13241=>1000,13242=>1000,13243=>1000,13244=>1000,13245=>1000,13246=>1000,13247=>1000,13248=>1000,13249=>1000,13250=>1000,13251=>1000,13252=>1000,13253=>1000,13254=>1000,13255=>1000,13256=>1000,13257=>1000,13258=>1000,13259=>1000,13260=>1000,13261=>1000,13262=>1000,13263=>1000,13264=>1000,13265=>1000,13266=>1000,13267=>1000,13268=>1000,13269=>1000,13270=>1000,13271=>1000,13272=>1000,13273=>1000,13274=>1000,13275=>1000,13276=>1000,13277=>1000,13280=>1000,13281=>1000,13282=>1000,13283=>1000,13284=>1000,13285=>1000,13286=>1000,13287=>1000,13288=>1000,13289=>1000,13290=>1000,13291=>1000,13292=>1000,13293=>1000,13294=>1000,13295=>1000,13296=>1000,13297=>1000,13298=>1000,13299=>1000,13300=>1000,13301=>1000,13302=>1000,13303=>1000,13304=>1000,13305=>1000,13306=>1000,13307=>1000,13308=>1000,13309=>1000,13310=>1000,19968=>1000,19969=>1000,19970=>1000,19971=>1000,19972=>1000,19973=>1000,19974=>1000,19975=>1000,19976=>1000,19977=>1000,19978=>1000,19979=>1000,19980=>1000,19981=>1000,19982=>1000,19983=>1000,19984=>1000,19985=>1000,19986=>1000,19987=>1000,19988=>1000,19989=>1000,19990=>1000,19991=>1000,19992=>1000,19993=>1000,19994=>1000,19995=>1000,19996=>1000,19997=>1000,19998=>1000,19999=>1000,20000=>1000,20001=>1000,20002=>1000,20003=>1000,20004=>1000,20005=>1000,20006=>1000,20007=>1000,20008=>1000,20009=>1000,20010=>1000,20011=>1000,20012=>1000,20013=>1000,20014=>1000,20015=>1000,20016=>1000,20017=>1000,20018=>1000,20019=>1000,20020=>1000,20021=>1000,20022=>1000,20023=>1000,20024=>1000,20025=>1000,20026=>1000,20027=>1000,20028=>1000,20029=>1000,20030=>1000,20031=>1000,20032=>1000,20033=>1000,20034=>1000,20035=>1000,20036=>1000,20037=>1000,20038=>1000,20039=>1000,20040=>1000,20041=>1000,20042=>1000,20043=>1000,20044=>1000,20045=>1000,20046=>1000,20047=>1000,20048=>1000,20049=>1000,20050=>1000,20051=>1000,20052=>1000,20053=>1000,20054=>1000,20055=>1000,20056=>1000,20057=>1000,20058=>1000,20059=>1000,20060=>1000,20061=>1000,20062=>1000,20063=>1000,20064=>1000,20065=>1000,20066=>1000,20067=>1000,20068=>1000,20069=>1000,20070=>1000,20071=>1000,20072=>1000,20073=>1000,20074=>1000,20075=>1000,20076=>1000,20077=>1000,20078=>1000,20079=>1000,20080=>1000,20081=>1000,20082=>1000,20083=>1000,20084=>1000,20085=>1000,20086=>1000,20087=>1000,20088=>1000,20089=>1000,20090=>1000,20091=>1000,20092=>1000,20093=>1000,20094=>1000,20095=>1000,20096=>1000,20097=>1000,20098=>1000,20099=>1000,20100=>1000,20101=>1000,20102=>1000,20103=>1000,20104=>1000,20105=>1000,20106=>1000,20107=>1000,20108=>1000,20109=>1000,20110=>1000,20111=>1000,20112=>1000,20113=>1000,20114=>1000,20115=>1000,20116=>1000,20117=>1000,20118=>1000,20119=>1000,20120=>1000,20121=>1000,20122=>1000,20123=>1000,20124=>1000,20125=>1000,20126=>1000,20127=>1000,20128=>1000,20129=>1000,20130=>1000,20131=>1000,20132=>1000,20133=>1000,20134=>1000,20135=>1000,20136=>1000,20137=>1000,20138=>1000,20139=>1000,20140=>1000,20141=>1000,20142=>1000,20143=>1000,20144=>1000,20145=>1000,20146=>1000,20147=>1000,20148=>1000,20149=>1000,20150=>1000,20151=>1000,20152=>1000,20153=>1000,20154=>1000,20155=>1000,20156=>1000,20157=>1000,20158=>1000,20159=>1000,20160=>1000,20161=>1000,20162=>1000,20163=>1000,20164=>1000,20165=>1000,20166=>1000,20167=>1000,20168=>1000,20169=>1000,20170=>1000,20171=>1000,20172=>1000,20173=>1000,20174=>1000,20175=>1000,20176=>1000,20177=>1000,20178=>1000,20179=>1000,20180=>1000,20181=>1000,20182=>1000,20183=>1000,20184=>1000,20185=>1000,20186=>1000,20187=>1000,20188=>1000,20189=>1000,20190=>1000,20191=>1000,20192=>1000,20193=>1000,20194=>1000,20195=>1000,20196=>1000,20197=>1000,20198=>1000,20199=>1000,20200=>1000,20201=>1000,20202=>1000,20203=>1000,20204=>1000,20205=>1000,20206=>1000,20207=>1000,20208=>1000,20209=>1000,20210=>1000,20211=>1000,20212=>1000,20213=>1000,20214=>1000,20215=>1000,20216=>1000,20217=>1000,20218=>1000,20219=>1000,20220=>1000,20221=>1000,20222=>1000,20223=>1000,20224=>1000,20225=>1000,20226=>1000,20227=>1000,20228=>1000,20229=>1000,20230=>1000,20231=>1000,20232=>1000,20233=>1000,20234=>1000,20235=>1000,20236=>1000,20237=>1000,20238=>1000,20239=>1000,20240=>1000,20241=>1000,20242=>1000,20243=>1000,20244=>1000,20245=>1000,20246=>1000,20247=>1000,20248=>1000,20249=>1000,20250=>1000,20251=>1000,20252=>1000,20253=>1000,20254=>1000,20255=>1000,20256=>1000,20257=>1000,20258=>1000,20259=>1000,20260=>1000,20261=>1000,20262=>1000,20263=>1000,20264=>1000,20265=>1000,20266=>1000,20267=>1000,20268=>1000,20269=>1000,20270=>1000,20271=>1000,20272=>1000,20273=>1000,20274=>1000,20275=>1000,20276=>1000,20277=>1000,20278=>1000,20279=>1000,20280=>1000,20281=>1000,20282=>1000,20283=>1000,20284=>1000,20285=>1000,20286=>1000,20287=>1000,20288=>1000,20289=>1000,20290=>1000,20291=>1000,20292=>1000,20293=>1000,20294=>1000,20295=>1000,20296=>1000,20297=>1000,20298=>1000,20299=>1000,20300=>1000,20301=>1000,20302=>1000,20303=>1000,20304=>1000,20305=>1000,20306=>1000,20307=>1000,20308=>1000,20309=>1000,20310=>1000,20311=>1000,20312=>1000,20313=>1000,20314=>1000,20315=>1000,20316=>1000,20317=>1000,20318=>1000,20319=>1000,20320=>1000,20321=>1000,20322=>1000,20323=>1000,20324=>1000,20325=>1000,20326=>1000,20327=>1000,20328=>1000,20329=>1000,20330=>1000,20331=>1000,20332=>1000,20333=>1000,20334=>1000,20335=>1000,20336=>1000,20337=>1000,20338=>1000,20339=>1000,20340=>1000,20341=>1000,20342=>1000,20343=>1000,20344=>1000,20345=>1000,20346=>1000,20347=>1000,20348=>1000,20349=>1000,20350=>1000,20351=>1000,20352=>1000,20353=>1000,20354=>1000,20355=>1000,20356=>1000,20357=>1000,20358=>1000,20359=>1000,20360=>1000,20361=>1000,20362=>1000,20363=>1000,20364=>1000,20365=>1000,20366=>1000,20367=>1000,20368=>1000,20369=>1000,20370=>1000,20371=>1000,20372=>1000,20373=>1000,20374=>1000,20375=>1000,20376=>1000,20377=>1000,20378=>1000,20379=>1000,20380=>1000,20381=>1000,20382=>1000,20383=>1000,20384=>1000,20385=>1000,20386=>1000,20387=>1000,20388=>1000,20389=>1000,20390=>1000,20391=>1000,20392=>1000,20393=>1000,20394=>1000,20395=>1000,20396=>1000,20397=>1000,20398=>1000,20399=>1000,20400=>1000,20401=>1000,20402=>1000,20403=>1000,20404=>1000,20405=>1000,20406=>1000,20407=>1000,20408=>1000,20409=>1000,20410=>1000,20411=>1000,20412=>1000,20413=>1000,20414=>1000,20415=>1000,20416=>1000,20417=>1000,20418=>1000,20419=>1000,20420=>1000,20421=>1000,20422=>1000,20423=>1000,20424=>1000,20425=>1000,20426=>1000,20427=>1000,20428=>1000,20429=>1000,20430=>1000,20431=>1000,20432=>1000,20433=>1000,20434=>1000,20435=>1000,20436=>1000,20437=>1000,20438=>1000,20439=>1000,20440=>1000,20441=>1000,20442=>1000,20443=>1000,20444=>1000,20445=>1000,20446=>1000,20447=>1000,20448=>1000,20449=>1000,20450=>1000,20451=>1000,20452=>1000,20453=>1000,20454=>1000,20455=>1000,20456=>1000,20457=>1000,20458=>1000,20459=>1000,20460=>1000,20461=>1000,20462=>1000,20463=>1000,20464=>1000,20465=>1000,20466=>1000,20467=>1000,20468=>1000,20469=>1000,20470=>1000,20471=>1000,20472=>1000,20473=>1000,20474=>1000,20475=>1000,20476=>1000,20477=>1000,20478=>1000,20479=>1000,20480=>1000,20481=>1000,20482=>1000,20483=>1000,20484=>1000,20485=>1000,20486=>1000,20487=>1000,20488=>1000,20489=>1000,20490=>1000,20491=>1000,20492=>1000,20493=>1000,20494=>1000,20495=>1000,20496=>1000,20497=>1000,20498=>1000,20499=>1000,20500=>1000,20501=>1000,20502=>1000,20503=>1000,20504=>1000,20505=>1000,20506=>1000,20507=>1000,20508=>1000,20509=>1000,20510=>1000,20511=>1000,20512=>1000,20513=>1000,20514=>1000,20515=>1000,20516=>1000,20517=>1000,20518=>1000,20519=>1000,20520=>1000,20521=>1000,20522=>1000,20523=>1000,20524=>1000,20525=>1000,20526=>1000,20527=>1000,20528=>1000,20529=>1000,20530=>1000,20531=>1000,20532=>1000,20533=>1000,20534=>1000,20535=>1000,20536=>1000,20537=>1000,20538=>1000,20539=>1000,20540=>1000,20541=>1000,20542=>1000,20543=>1000,20544=>1000,20545=>1000,20546=>1000,20547=>1000,20548=>1000,20549=>1000,20550=>1000,20551=>1000,20552=>1000,20553=>1000,20554=>1000,20555=>1000,20556=>1000,20557=>1000,20558=>1000,20559=>1000,20560=>1000,20561=>1000,20562=>1000,20563=>1000,20564=>1000,20565=>1000,20566=>1000,20567=>1000,20568=>1000,20569=>1000,20570=>1000,20571=>1000,20572=>1000,20573=>1000,20574=>1000,20575=>1000,20576=>1000,20577=>1000,20578=>1000,20579=>1000,20580=>1000,20581=>1000,20582=>1000,20583=>1000,20584=>1000,20585=>1000,20586=>1000,20587=>1000,20588=>1000,20589=>1000,20590=>1000,20591=>1000,20592=>1000,20593=>1000,20594=>1000,20595=>1000,20596=>1000,20597=>1000,20598=>1000,20599=>1000,20600=>1000,20601=>1000,20602=>1000,20603=>1000,20604=>1000,20605=>1000,20606=>1000,20607=>1000,20608=>1000,20609=>1000,20610=>1000,20611=>1000,20612=>1000,20613=>1000,20614=>1000,20615=>1000,20616=>1000,20617=>1000,20618=>1000,20619=>1000,20620=>1000,20621=>1000,20622=>1000,20623=>1000,20624=>1000,20625=>1000,20626=>1000,20627=>1000,20628=>1000,20629=>1000,20630=>1000,20631=>1000,20632=>1000,20633=>1000,20634=>1000,20635=>1000,20636=>1000,20637=>1000,20638=>1000,20639=>1000,20640=>1000,20641=>1000,20642=>1000,20643=>1000,20644=>1000,20645=>1000,20646=>1000,20647=>1000,20648=>1000,20649=>1000,20650=>1000,20651=>1000,20652=>1000,20653=>1000,20654=>1000,20655=>1000,20656=>1000,20657=>1000,20658=>1000,20659=>1000,20660=>1000,20661=>1000,20662=>1000,20663=>1000,20664=>1000,20665=>1000,20666=>1000,20667=>1000,20668=>1000,20669=>1000,20670=>1000,20671=>1000,20672=>1000,20673=>1000,20674=>1000,20675=>1000,20676=>1000,20677=>1000,20678=>1000,20679=>1000,20680=>1000,20681=>1000,20682=>1000,20683=>1000,20684=>1000,20685=>1000,20686=>1000,20687=>1000,20688=>1000,20689=>1000,20690=>1000,20691=>1000,20692=>1000,20693=>1000,20694=>1000,20695=>1000,20696=>1000,20697=>1000,20698=>1000,20699=>1000,20700=>1000,20701=>1000,20702=>1000,20703=>1000,20704=>1000,20705=>1000,20706=>1000,20707=>1000,20708=>1000,20709=>1000,20710=>1000,20711=>1000,20712=>1000,20713=>1000,20714=>1000,20715=>1000,20716=>1000,20717=>1000,20718=>1000,20719=>1000,20720=>1000,20721=>1000,20722=>1000,20723=>1000,20724=>1000,20725=>1000,20726=>1000,20727=>1000,20728=>1000,20729=>1000,20730=>1000,20731=>1000,20732=>1000,20733=>1000,20734=>1000,20735=>1000,20736=>1000,20737=>1000,20738=>1000,20739=>1000,20740=>1000,20741=>1000,20742=>1000,20743=>1000,20744=>1000,20745=>1000,20746=>1000,20747=>1000,20748=>1000,20749=>1000,20750=>1000,20751=>1000,20752=>1000,20753=>1000,20754=>1000,20755=>1000,20756=>1000,20757=>1000,20758=>1000,20759=>1000,20760=>1000,20761=>1000,20762=>1000,20763=>1000,20764=>1000,20765=>1000,20766=>1000,20767=>1000,20768=>1000,20769=>1000,20770=>1000,20771=>1000,20772=>1000,20773=>1000,20774=>1000,20775=>1000,20776=>1000,20777=>1000,20778=>1000,20779=>1000,20780=>1000,20781=>1000,20782=>1000,20783=>1000,20784=>1000,20785=>1000,20786=>1000,20787=>1000,20788=>1000,20789=>1000,20790=>1000,20791=>1000,20792=>1000,20793=>1000,20794=>1000,20795=>1000,20796=>1000,20797=>1000,20798=>1000,20799=>1000,20800=>1000,20801=>1000,20802=>1000,20803=>1000,20804=>1000,20805=>1000,20806=>1000,20807=>1000,20808=>1000,20809=>1000,20810=>1000,20811=>1000,20812=>1000,20813=>1000,20814=>1000,20815=>1000,20816=>1000,20817=>1000,20818=>1000,20819=>1000,20820=>1000,20821=>1000,20822=>1000,20823=>1000,20824=>1000,20825=>1000,20826=>1000,20827=>1000,20828=>1000,20829=>1000,20830=>1000,20831=>1000,20832=>1000,20833=>1000,20834=>1000,20835=>1000,20836=>1000,20837=>1000,20838=>1000,20839=>1000,20840=>1000,20841=>1000,20842=>1000,20843=>1000,20844=>1000,20845=>1000,20846=>1000,20847=>1000,20848=>1000,20849=>1000,20850=>1000,20851=>1000,20852=>1000,20853=>1000,20854=>1000,20855=>1000,20856=>1000,20857=>1000,20858=>1000,20859=>1000,20860=>1000,20861=>1000,20862=>1000,20863=>1000,20864=>1000,20865=>1000,20866=>1000,20867=>1000,20868=>1000,20869=>1000,20870=>1000,20871=>1000,20872=>1000,20873=>1000,20874=>1000,20875=>1000,20876=>1000,20877=>1000,20878=>1000,20879=>1000,20880=>1000,20881=>1000,20882=>1000,20883=>1000,20884=>1000,20885=>1000,20886=>1000,20887=>1000,20888=>1000,20889=>1000,20890=>1000,20891=>1000,20892=>1000,20893=>1000,20894=>1000,20895=>1000,20896=>1000,20897=>1000,20898=>1000,20899=>1000,20900=>1000,20901=>1000,20902=>1000,20903=>1000,20904=>1000,20905=>1000,20906=>1000,20907=>1000,20908=>1000,20909=>1000,20910=>1000,20911=>1000,20912=>1000,20913=>1000,20914=>1000,20915=>1000,20916=>1000,20917=>1000,20918=>1000,20919=>1000,20920=>1000,20921=>1000,20922=>1000,20923=>1000,20924=>1000,20925=>1000,20926=>1000,20927=>1000,20928=>1000,20929=>1000,20930=>1000,20931=>1000,20932=>1000,20933=>1000,20934=>1000,20935=>1000,20936=>1000,20937=>1000,20938=>1000,20939=>1000,20940=>1000,20941=>1000,20942=>1000,20943=>1000,20944=>1000,20945=>1000,20946=>1000,20947=>1000,20948=>1000,20949=>1000,20950=>1000,20951=>1000,20952=>1000,20953=>1000,20954=>1000,20955=>1000,20956=>1000,20957=>1000,20958=>1000,20959=>1000,20960=>1000,20961=>1000,20962=>1000,20963=>1000,20964=>1000,20965=>1000,20966=>1000,20967=>1000,20968=>1000,20969=>1000,20970=>1000,20971=>1000,20972=>1000,20973=>1000,20974=>1000,20975=>1000,20976=>1000,20977=>1000,20978=>1000,20979=>1000,20980=>1000,20981=>1000,20982=>1000,20983=>1000,20984=>1000,20985=>1000,20986=>1000,20987=>1000,20988=>1000,20989=>1000,20990=>1000,20991=>1000,20992=>1000,20993=>1000,20994=>1000,20995=>1000,20996=>1000,20997=>1000,20998=>1000,20999=>1000,21000=>1000,21001=>1000,21002=>1000,21003=>1000,21004=>1000,21005=>1000,21006=>1000,21007=>1000,21008=>1000,21009=>1000,21010=>1000,21011=>1000,21012=>1000,21013=>1000,21014=>1000,21015=>1000,21016=>1000,21017=>1000,21018=>1000,21019=>1000,21020=>1000,21021=>1000,21022=>1000,21023=>1000,21024=>1000,21025=>1000,21026=>1000,21027=>1000,21028=>1000,21029=>1000,21030=>1000,21031=>1000,21032=>1000,21033=>1000,21034=>1000,21035=>1000,21036=>1000,21037=>1000,21038=>1000,21039=>1000,21040=>1000,21041=>1000,21042=>1000,21043=>1000,21044=>1000,21045=>1000,21046=>1000,21047=>1000,21048=>1000,21049=>1000,21050=>1000,21051=>1000,21052=>1000,21053=>1000,21054=>1000,21055=>1000,21056=>1000,21057=>1000,21058=>1000,21059=>1000,21060=>1000,21061=>1000,21062=>1000,21063=>1000,21064=>1000,21065=>1000,21066=>1000,21067=>1000,21068=>1000,21069=>1000,21070=>1000,21071=>1000,21072=>1000,21073=>1000,21074=>1000,21075=>1000,21076=>1000,21077=>1000,21078=>1000,21079=>1000,21080=>1000,21081=>1000,21082=>1000,21083=>1000,21084=>1000,21085=>1000,21086=>1000,21087=>1000,21088=>1000,21089=>1000,21090=>1000,21091=>1000,21092=>1000,21093=>1000,21094=>1000,21095=>1000,21096=>1000,21097=>1000,21098=>1000,21099=>1000,21100=>1000,21101=>1000,21102=>1000,21103=>1000,21104=>1000,21105=>1000,21106=>1000,21107=>1000,21108=>1000,21109=>1000,21110=>1000,21111=>1000,21112=>1000,21113=>1000,21114=>1000,21115=>1000,21116=>1000,21117=>1000,21118=>1000,21119=>1000,21120=>1000,21121=>1000,21122=>1000,21123=>1000,21124=>1000,21125=>1000,21126=>1000,21127=>1000,21128=>1000,21129=>1000,21130=>1000,21131=>1000,21132=>1000,21133=>1000,21134=>1000,21135=>1000,21136=>1000,21137=>1000,21138=>1000,21139=>1000,21140=>1000,21141=>1000,21142=>1000,21143=>1000,21144=>1000,21145=>1000,21146=>1000,21147=>1000,21148=>1000,21149=>1000,21150=>1000,21151=>1000,21152=>1000,21153=>1000,21154=>1000,21155=>1000,21156=>1000,21157=>1000,21158=>1000,21159=>1000,21160=>1000,21161=>1000,21162=>1000,21163=>1000,21164=>1000,21165=>1000,21166=>1000,21167=>1000,21168=>1000,21169=>1000,21170=>1000,21171=>1000,21172=>1000,21173=>1000,21174=>1000,21175=>1000,21176=>1000,21177=>1000,21178=>1000,21179=>1000,21180=>1000,21181=>1000,21182=>1000,21183=>1000,21184=>1000,21185=>1000,21186=>1000,21187=>1000,21188=>1000,21189=>1000,21190=>1000,21191=>1000,21192=>1000,21193=>1000,21194=>1000,21195=>1000,21196=>1000,21197=>1000,21198=>1000,21199=>1000,21200=>1000,21201=>1000,21202=>1000,21203=>1000,21204=>1000,21205=>1000,21206=>1000,21207=>1000,21208=>1000,21209=>1000,21210=>1000,21211=>1000,21212=>1000,21213=>1000,21214=>1000,21215=>1000,21216=>1000,21217=>1000,21218=>1000,21219=>1000,21220=>1000,21221=>1000,21222=>1000,21223=>1000,21224=>1000,21225=>1000,21226=>1000,21227=>1000,21228=>1000,21229=>1000,21230=>1000,21231=>1000,21232=>1000,21233=>1000,21234=>1000,21235=>1000,21236=>1000,21237=>1000,21238=>1000,21239=>1000,21240=>1000,21241=>1000,21242=>1000,21243=>1000,21244=>1000,21245=>1000,21246=>1000,21247=>1000,21248=>1000,21249=>1000,21250=>1000,21251=>1000,21252=>1000,21253=>1000,21254=>1000,21255=>1000,21256=>1000,21257=>1000,21258=>1000,21259=>1000,21260=>1000,21261=>1000,21262=>1000,21263=>1000,21264=>1000,21265=>1000,21266=>1000,21267=>1000,21268=>1000,21269=>1000,21270=>1000,21271=>1000,21272=>1000,21273=>1000,21274=>1000,21275=>1000,21276=>1000,21277=>1000,21278=>1000,21279=>1000,21280=>1000,21281=>1000,21282=>1000,21283=>1000,21284=>1000,21285=>1000,21286=>1000,21287=>1000,21288=>1000,21289=>1000,21290=>1000,21291=>1000,21292=>1000,21293=>994,21294=>1000,21295=>1000,21296=>1000,21297=>1000,21298=>1000,21299=>1000,21300=>1000,21301=>1000,21302=>1000,21303=>1000,21304=>1000,21305=>1000,21306=>1000,21307=>1000,21308=>1000,21309=>1000,21310=>1000,21311=>1000,21312=>1000,21313=>1000,21314=>1000,21315=>1000,21316=>1000,21317=>1000,21318=>1000,21319=>1000,21320=>1000,21321=>1000,21322=>1000,21323=>1000,21324=>1000,21325=>1000,21326=>1000,21327=>1000,21328=>1000,21329=>1000,21330=>1000,21331=>1000,21332=>1000,21333=>1000,21334=>1000,21335=>1000,21336=>1000,21337=>1000,21338=>1000,21339=>1000,21340=>1000,21341=>1000,21342=>1000,21343=>1000,21344=>1000,21345=>1000,21346=>1000,21347=>1000,21348=>1000,21349=>1000,21350=>1000,21351=>1000,21352=>1000,21353=>1000,21354=>1000,21355=>1000,21356=>1000,21357=>1000,21358=>1000,21359=>1000,21360=>1000,21361=>1000,21362=>1000,21363=>1000,21364=>1000,21365=>1000,21366=>1000,21367=>1000,21368=>1000,21369=>1000,21370=>1000,21371=>1000,21372=>1000,21373=>1000,21374=>1000,21375=>1000,21376=>1000,21377=>1000,21378=>1000,21379=>1000,21380=>1000,21381=>1000,21382=>1000,21383=>1000,21384=>1000,21385=>1000,21386=>1000,21387=>1000,21388=>1000,21389=>1000,21390=>1000,21391=>1000,21392=>1000,21393=>1000,21394=>1000,21395=>1000,21396=>1000,21397=>1000,21398=>1000,21399=>1000,21400=>1000,21401=>1000,21402=>1000,21403=>1000,21404=>1000,21405=>1000,21406=>1000,21407=>1000,21408=>1000,21409=>1000,21410=>1000,21411=>1000,21412=>1000,21413=>1000,21414=>1000,21415=>1000,21416=>1000,21417=>1000,21418=>1000,21419=>1000,21420=>1000,21421=>1000,21422=>1000,21423=>1000,21424=>1000,21425=>1000,21426=>1000,21427=>1000,21428=>1000,21429=>1000,21430=>1000,21431=>1000,21432=>1000,21433=>1000,21434=>1000,21435=>1000,21436=>1000,21437=>1000,21438=>1000,21439=>1000,21440=>1000,21441=>1000,21442=>1000,21443=>1000,21444=>1000,21445=>1000,21446=>1000,21447=>1000,21448=>1000,21449=>1000,21450=>1000,21451=>1000,21452=>1000,21453=>1000,21454=>1000,21455=>1000,21456=>1000,21457=>1000,21458=>1000,21459=>1000,21460=>1000,21461=>1000,21462=>1000,21463=>1000,21464=>1000,21465=>1000,21466=>1000,21467=>1000,21468=>1000,21469=>1000,21470=>1000,21471=>1000,21472=>1000,21473=>1000,21474=>1000,21475=>1000,21476=>1000,21477=>1000,21478=>1000,21479=>1000,21480=>1000,21481=>1000,21482=>1000,21483=>1000,21484=>1000,21485=>1000,21486=>1000,21487=>1000,21488=>1000,21489=>1000,21490=>1000,21491=>1000,21492=>1000,21493=>1000,21494=>1000,21495=>1000,21496=>1000,21497=>1000,21498=>1000,21499=>1000,21500=>1000,21501=>1000,21502=>1000,21503=>1000,21504=>1000,21505=>1000,21506=>1000,21507=>1000,21508=>1000,21509=>1000,21510=>1000,21511=>1000,21512=>1000,21513=>1000,21514=>1000,21515=>1000,21516=>1000,21517=>1000,21518=>1000,21519=>1000,21520=>1000,21521=>1000,21522=>1000,21523=>1000,21524=>1000,21525=>1000,21526=>1000,21527=>1000,21528=>1000,21529=>1000,21530=>1000,21531=>1000,21532=>1000,21533=>1000,21534=>1000,21535=>1000,21536=>1000,21537=>1000,21538=>1000,21539=>1000,21540=>1000,21541=>1000,21542=>1000,21543=>1000,21544=>1000,21545=>1000,21546=>1000,21547=>1000,21548=>1000,21549=>1000,21550=>1000,21551=>1000,21552=>1000,21553=>1000,21554=>1000,21555=>1000,21556=>1000,21557=>1000,21558=>1000,21559=>1000,21560=>1000,21561=>1000,21562=>1000,21563=>1000,21564=>1000,21565=>1000,21566=>1000,21567=>1000,21568=>1000,21569=>1000,21570=>1000,21571=>1000,21572=>1000,21573=>1000,21574=>1000,21575=>1000,21576=>1000,21577=>1000,21578=>1000,21579=>1000,21580=>1000,21581=>1000,21582=>1000,21583=>1000,21584=>1000,21585=>1000,21586=>1000,21587=>1000,21588=>1000,21589=>1000,21590=>1000,21591=>1000,21592=>1000,21593=>1000,21594=>1000,21595=>1000,21596=>1000,21597=>1000,21598=>1000,21599=>1000,21600=>1000,21601=>1000,21602=>1000,21603=>1000,21604=>1000,21605=>1000,21606=>1000,21607=>1000,21608=>1000,21609=>1000,21610=>1000,21611=>1000,21612=>1000,21613=>1000,21614=>1000,21615=>1000,21616=>1000,21617=>1000,21618=>1000,21619=>1000,21620=>1000,21621=>1000,21622=>1000,21623=>1000,21624=>1000,21625=>1000,21626=>1000,21627=>1000,21628=>1000,21629=>1000,21630=>1000,21631=>1000,21632=>1000,21633=>1000,21634=>1000,21635=>1000,21636=>1000,21637=>1000,21638=>1000,21639=>1000,21640=>1000,21641=>1000,21642=>1000,21643=>1000,21644=>1000,21645=>1000,21646=>1000,21647=>1000,21648=>1000,21649=>1000,21650=>1000,21651=>1000,21652=>1000,21653=>1000,21654=>1000,21655=>1000,21656=>1000,21657=>1000,21658=>1000,21659=>1000,21660=>1000,21661=>1000,21662=>1000,21663=>1000,21664=>1000,21665=>1000,21666=>1000,21667=>1000,21668=>1000,21669=>1000,21670=>1000,21671=>1000,21672=>1000,21673=>1000,21674=>1000,21675=>1000,21676=>1000,21677=>1000,21678=>1000,21679=>1000,21680=>1000,21681=>1000,21682=>1000,21683=>1000,21684=>1000,21685=>1000,21686=>1000,21687=>1000,21688=>1000,21689=>1000,21690=>1000,21691=>1000,21692=>1000,21693=>1000,21694=>1000,21695=>1000,21696=>1000,21697=>1000,21698=>1000,21699=>1000,21700=>1000,21701=>1000,21702=>1000,21703=>1000,21704=>1000,21705=>1000,21706=>1000,21707=>1000,21708=>1000,21709=>1000,21710=>1000,21711=>1000,21712=>1000,21713=>1000,21714=>1000,21715=>1000,21716=>1000,21717=>1000,21718=>1000,21719=>1000,21720=>1000,21721=>1000,21722=>1000,21723=>1000,21724=>1000,21725=>1000,21726=>1000,21727=>1000,21728=>1000,21729=>1000,21730=>1000,21731=>1000,21732=>1000,21733=>1000,21734=>1000,21735=>1000,21736=>1000,21737=>1000,21738=>1000,21739=>1000,21740=>1000,21741=>1000,21742=>1000,21743=>1000,21744=>1000,21745=>1000,21746=>1000,21747=>1000,21748=>1000,21749=>1000,21750=>1000,21751=>1000,21752=>1000,21753=>1000,21754=>1000,21755=>1000,21756=>1000,21757=>1000,21758=>1000,21759=>1000,21760=>1000,21761=>1000,21762=>1000,21763=>1000,21764=>1000,21765=>1000,21766=>1000,21767=>1000,21768=>1000,21769=>1000,21770=>1000,21771=>1000,21772=>1000,21773=>1000,21774=>1000,21775=>1000,21776=>1000,21777=>1000,21778=>1000,21779=>1000,21780=>1000,21781=>1000,21782=>1000,21783=>1000,21784=>1000,21785=>1000,21786=>1000,21787=>1000,21788=>1000,21789=>1000,21790=>1000,21791=>1000,21792=>1000,21793=>1000,21794=>1000,21795=>1000,21796=>1000,21797=>1000,21798=>1000,21799=>1000,21800=>1000,21801=>1000,21802=>1000,21803=>1000,21804=>1000,21805=>1000,21806=>1000,21807=>1000,21808=>1000,21809=>1000,21810=>1000,21811=>1000,21812=>1000,21813=>1000,21814=>1000,21815=>1000,21816=>1000,21817=>1000,21818=>1000,21819=>1000,21820=>1000,21821=>1000,21822=>1000,21823=>1000,21824=>1000,21825=>1000,21826=>1000,21827=>1000,21828=>1000,21829=>1000,21830=>1000,21831=>1000,21832=>1000,21833=>1000,21834=>1000,21835=>1000,21836=>1000,21837=>1000,21838=>1000,21839=>1000,21840=>1000,21841=>1000,21842=>1000,21843=>1000,21844=>1000,21845=>1000,21846=>1000,21847=>1000,21848=>1000,21849=>1000,21850=>1000,21851=>1000,21852=>1000,21853=>1000,21854=>1000,21855=>1000,21856=>1000,21857=>1000,21858=>1000,21859=>1000,21860=>1000,21861=>1000,21862=>1000,21863=>1000,21864=>1000,21865=>1000,21866=>1000,21867=>1000,21868=>1000,21869=>1000,21870=>1000,21871=>1000,21872=>1000,21873=>1000,21874=>1000,21875=>1000,21876=>1000,21877=>1000,21878=>1000,21879=>1000,21880=>1000,21881=>1000,21882=>1000,21883=>1000,21884=>1000,21885=>1000,21886=>1000,21887=>1000,21888=>1000,21889=>1000,21890=>1000,21891=>1000,21892=>1000,21893=>1000,21894=>1000,21895=>1000,21896=>1000,21897=>1000,21898=>1000,21899=>1000,21900=>1000,21901=>1000,21902=>1000,21903=>1000,21904=>1000,21905=>1000,21906=>1000,21907=>1000,21908=>1000,21909=>1000,21910=>1000,21911=>1000,21912=>1000,21913=>1000,21914=>1000,21915=>1000,21916=>1000,21917=>1000,21918=>1000,21919=>1000,21920=>1000,21921=>1000,21922=>1000,21923=>1000,21924=>1000,21925=>1000,21926=>1000,21927=>1000,21928=>1000,21929=>1000,21930=>1000,21931=>1000,21932=>1000,21933=>1000,21934=>1000,21935=>1000,21936=>1000,21937=>1000,21938=>1000,21939=>1000,21940=>1000,21941=>1000,21942=>1000,21943=>1000,21944=>1000,21945=>1000,21946=>1000,21947=>1000,21948=>1000,21949=>1000,21950=>1000,21951=>1000,21952=>1000,21953=>1000,21954=>1000,21955=>1000,21956=>1000,21957=>1000,21958=>1000,21959=>1000,21960=>1000,21961=>1000,21962=>1000,21963=>1000,21964=>1000,21965=>1000,21966=>1000,21967=>1000,21968=>1000,21969=>1000,21970=>1000,21971=>1000,21972=>1000,21973=>1000,21974=>1000,21975=>1000,21976=>1000,21977=>1000,21978=>1000,21979=>1000,21980=>1000,21981=>1000,21982=>1000,21983=>1000,21984=>1000,21985=>1000,21986=>1000,21987=>1000,21988=>1000,21989=>1000,21990=>1000,21991=>1000,21992=>1000,21993=>1000,21994=>1000,21995=>1000,21996=>1000,21997=>1000,21998=>1000,21999=>1000,22000=>1000,22001=>1000,22002=>1000,22003=>1000,22004=>1000,22005=>1000,22006=>1000,22007=>1000,22008=>1000,22009=>1000,22010=>1000,22011=>1000,22012=>1000,22013=>1000,22014=>1000,22015=>1000,22016=>1000,22017=>1000,22018=>1000,22019=>1000,22020=>1000,22021=>1000,22022=>1000,22023=>1000,22024=>1000,22025=>1000,22026=>1000,22027=>1000,22028=>1000,22029=>1000,22030=>1000,22031=>1000,22032=>1000,22033=>1000,22034=>1000,22035=>1000,22036=>1000,22037=>1000,22038=>1000,22039=>1000,22040=>1000,22041=>1000,22042=>1000,22043=>1000,22044=>1000,22045=>1000,22046=>1000,22047=>1000,22048=>1000,22049=>1000,22050=>1000,22051=>1000,22052=>1000,22053=>1000,22054=>1000,22055=>1000,22056=>1000,22057=>1000,22058=>1000,22059=>1000,22060=>1000,22061=>1000,22062=>1000,22063=>1000,22064=>1000,22065=>1000,22066=>1000,22067=>1000,22068=>1000,22069=>1000,22070=>1000,22071=>1000,22072=>1000,22073=>1000,22074=>1000,22075=>1000,22076=>1000,22077=>1000,22078=>1000,22079=>1000,22080=>1000,22081=>1000,22082=>1000,22083=>1000,22084=>1000,22085=>1000,22086=>1000,22087=>1000,22088=>1000,22089=>1000,22090=>1000,22091=>1000,22092=>1000,22093=>1000,22094=>1000,22095=>1000,22096=>1000,22097=>1000,22098=>1000,22099=>1000,22100=>1000,22101=>1000,22102=>1000,22103=>1000,22104=>1000,22105=>1000,22106=>1000,22107=>1000,22108=>1000,22109=>1000,22110=>1000,22111=>1000,22112=>1000,22113=>1000,22114=>1000,22115=>1000,22116=>1000,22117=>1000,22118=>1000,22119=>1000,22120=>1000,22121=>1000,22122=>1000,22123=>1000,22124=>1000,22125=>1000,22126=>1000,22127=>1000,22128=>1000,22129=>1000,22130=>1000,22131=>1000,22132=>1000,22133=>1000,22134=>1000,22135=>1000,22136=>1000,22137=>1000,22138=>1000,22139=>1000,22140=>1000,22141=>1000,22142=>1000,22143=>1000,22144=>1000,22145=>1000,22146=>1000,22147=>1000,22148=>1000,22149=>1000,22150=>1000,22151=>1000,22152=>1000,22153=>1000,22154=>1000,22155=>1000,22156=>1000,22157=>1000,22158=>1000,22159=>1000,22160=>1000,22161=>1000,22162=>1000,22163=>1000,22164=>1000,22165=>1000,22166=>1000,22167=>1000,22168=>1000,22169=>1000,22170=>1000,22171=>1000,22172=>1000,22173=>1000,22174=>1000,22175=>1000,22176=>1000,22177=>1000,22178=>1000,22179=>1000,22180=>1000,22181=>1000,22182=>1000,22183=>1000,22184=>1000,22185=>1000,22186=>1000,22187=>1000,22188=>1000,22189=>1000,22190=>1000,22191=>1000,22192=>1000,22193=>1000,22194=>1000,22195=>1000,22196=>1000,22197=>1000,22198=>1000,22199=>1000,22200=>1000,22201=>1000,22202=>1000,22203=>1000,22204=>1000,22205=>1000,22206=>1000,22207=>1000,22208=>1000,22209=>1000,22210=>1000,22211=>1000,22212=>1000,22213=>1000,22214=>1000,22215=>1000,22216=>1000,22217=>1000,22218=>1000,22219=>1000,22220=>1000,22221=>1000,22222=>1000,22223=>1000,22224=>1000,22225=>1000,22226=>1000,22227=>1000,22228=>1000,22229=>1000,22230=>1000,22231=>1000,22232=>1000,22233=>1000,22234=>1000,22235=>1000,22236=>1000,22237=>1000,22238=>1000,22239=>1000,22240=>1000,22241=>1000,22242=>1000,22243=>1000,22244=>1000,22245=>1000,22246=>1000,22247=>1000,22248=>1000,22249=>1000,22250=>1000,22251=>1000,22252=>1000,22253=>1000,22254=>1000,22255=>1000,22256=>1000,22257=>1000,22258=>1000,22259=>1000,22260=>1000,22261=>1000,22262=>1000,22263=>1000,22264=>1000,22265=>1000,22266=>1000,22267=>1000,22268=>1000,22269=>1000,22270=>1000,22271=>1000,22272=>1000,22273=>1000,22274=>1000,22275=>1000,22276=>1000,22277=>1000,22278=>1000,22279=>1000,22280=>1000,22281=>1000,22282=>1000,22283=>1000,22284=>1000,22285=>1000,22286=>1000,22287=>1000,22288=>1000,22289=>1000,22290=>1000,22291=>1000,22292=>1000,22293=>1000,22294=>1000,22295=>1000,22296=>1000,22297=>1000,22298=>1000,22299=>1000,22300=>1000,22301=>1000,22302=>1000,22303=>1000,22304=>1000,22305=>1000,22306=>1000,22307=>1000,22308=>1000,22309=>1000,22310=>1000,22311=>1000,22312=>1000,22313=>1000,22314=>1000,22315=>1000,22316=>1000,22317=>1000,22318=>1000,22319=>1000,22320=>1000,22321=>1000,22322=>1000,22323=>1000,22324=>1000,22325=>1000,22326=>1000,22327=>1000,22328=>1000,22329=>1000,22330=>1000,22331=>1000,22332=>1000,22333=>1000,22334=>1000,22335=>1000,22336=>1000,22337=>1000,22338=>1000,22339=>1000,22340=>1000,22341=>1000,22342=>1000,22343=>1000,22344=>1000,22345=>1000,22346=>1000,22347=>1000,22348=>1000,22349=>1000,22350=>1000,22351=>1000,22352=>1000,22353=>1000,22354=>1000,22355=>1000,22356=>1000,22357=>1000,22358=>1000,22359=>1000,22360=>1000,22361=>1000,22362=>1000,22363=>1000,22364=>1000,22365=>1000,22366=>1000,22367=>1000,22368=>1000,22369=>1000,22370=>1000,22371=>1000,22372=>1000,22373=>1000,22374=>1000,22375=>1000,22376=>1000,22377=>1000,22378=>1000,22379=>1000,22380=>1000,22381=>1000,22382=>1000,22383=>1000,22384=>1000,22385=>1000,22386=>1000,22387=>1000,22388=>1000,22389=>1000,22390=>1000,22391=>1000,22392=>1000,22393=>1000,22394=>1000,22395=>1000,22396=>1000,22397=>1000,22398=>1000,22399=>1000,22400=>1000,22401=>1000,22402=>1000,22403=>1000,22404=>1000,22405=>1000,22406=>1000,22407=>1000,22408=>1000,22409=>1000,22410=>1000,22411=>1000,22412=>1000,22413=>1000,22414=>1000,22415=>1000,22416=>1000,22417=>1000,22418=>1000,22419=>1000,22420=>1000,22421=>1000,22422=>1000,22423=>1000,22424=>1000,22425=>1000,22426=>1000,22427=>1000,22428=>1000,22429=>1000,22430=>1000,22431=>1000,22432=>1000,22433=>1000,22434=>1000,22435=>1000,22436=>1000,22437=>1000,22438=>1000,22439=>1000,22440=>1000,22441=>1000,22442=>1000,22443=>1000,22444=>1000,22445=>1000,22446=>1000,22447=>1000,22448=>1000,22449=>1000,22450=>1000,22451=>1000,22452=>1000,22453=>1000,22454=>1000,22455=>1000,22456=>1000,22457=>1000,22458=>1000,22459=>1000,22460=>1000,22461=>1000,22462=>1000,22463=>1000,22464=>1000,22465=>1000,22466=>1000,22467=>1000,22468=>1000,22469=>1000,22470=>1000,22471=>1000,22472=>1000,22473=>1000,22474=>1000,22475=>1000,22476=>1000,22477=>1000,22478=>1000,22479=>1000,22480=>1000,22481=>1000,22482=>1000,22483=>1000,22484=>1000,22485=>1000,22486=>1000,22487=>1000,22488=>1000,22489=>1000,22490=>1000,22491=>1000,22492=>1000,22493=>1000,22494=>1000,22495=>1000,22496=>1000,22497=>1000,22498=>1000,22499=>1000,22500=>1000,22501=>1000,22502=>1000,22503=>1000,22504=>1000,22505=>1000,22506=>1000,22507=>1000,22508=>1000,22509=>1000,22510=>1000,22511=>1000,22512=>1000,22513=>1000,22514=>1000,22515=>1000,22516=>1000,22517=>1000,22518=>1000,22519=>1000,22520=>1000,22521=>1000,22522=>1000,22523=>1000,22524=>1000,22525=>1000,22526=>1000,22527=>1000,22528=>1000,22529=>1000,22530=>1000,22531=>1000,22532=>1000,22533=>1000,22534=>1000,22535=>1000,22536=>1000,22537=>1000,22538=>1000,22539=>1000,22540=>1000,22541=>1000,22542=>1000,22543=>1000,22544=>1000,22545=>1000,22546=>1000,22547=>1000,22548=>1000,22549=>1000,22550=>1000,22551=>1000,22552=>1000,22553=>1000,22554=>1000,22555=>1000,22556=>1000,22557=>1000,22558=>1000,22559=>1000,22560=>1000,22561=>1000,22562=>1000,22563=>1000,22564=>1000,22565=>1000,22566=>1000,22567=>1000,22568=>1000,22569=>1000,22570=>1000,22571=>1000,22572=>1000,22573=>1000,22574=>1000,22575=>1000,22576=>1000,22577=>1000,22578=>1000,22579=>1000,22580=>1000,22581=>1000,22582=>1000,22583=>1000,22584=>1000,22585=>1000,22586=>1000,22587=>1000,22588=>1000,22589=>1000,22590=>1000,22591=>1000,22592=>1000,22593=>1000,22594=>1000,22595=>1000,22596=>1000,22597=>1000,22598=>1000,22599=>1000,22600=>1000,22601=>1000,22602=>1000,22603=>1000,22604=>1000,22605=>1000,22606=>1000,22607=>1000,22608=>1000,22609=>1000,22610=>1000,22611=>1000,22612=>1000,22613=>1000,22614=>1000,22615=>1000,22616=>1000,22617=>1000,22618=>1000,22619=>1000,22620=>1000,22621=>1000,22622=>1000,22623=>1000,22624=>1000,22625=>1000,22626=>1000,22627=>1000,22628=>1000,22629=>1000,22630=>1000,22631=>1000,22632=>1000,22633=>1000,22634=>1000,22635=>1000,22636=>1000,22637=>1000,22638=>1000,22639=>1000,22640=>1000,22641=>1000,22642=>1000,22643=>1000,22644=>1000,22645=>1000,22646=>1000,22647=>1000,22648=>1000,22649=>1000,22650=>1000,22651=>1000,22652=>1000,22653=>1000,22654=>1000,22655=>1000,22656=>1000,22657=>1000,22658=>1000,22659=>1000,22660=>1000,22661=>1000,22662=>1000,22663=>1000,22664=>1000,22665=>1000,22666=>1000,22667=>1000,22668=>1000,22669=>1000,22670=>1000,22671=>1000,22672=>1000,22673=>1000,22674=>1000,22675=>1000,22676=>1000,22677=>1000,22678=>1000,22679=>1000,22680=>1000,22681=>1000,22682=>1000,22683=>1000,22684=>1000,22685=>1000,22686=>1000,22687=>1000,22688=>1000,22689=>1000,22690=>1000,22691=>1000,22692=>1000,22693=>1000,22694=>1000,22695=>1000,22696=>1000,22697=>1000,22698=>1000,22699=>1000,22700=>1000,22701=>1000,22702=>1000,22703=>1000,22704=>1000,22705=>1000,22706=>1000,22707=>1000,22708=>1000,22709=>1000,22710=>1000,22711=>1000,22712=>1000,22713=>1000,22714=>1000,22715=>1000,22716=>1000,22717=>1000,22718=>1000,22719=>1000,22720=>1000,22721=>1000,22722=>1000,22723=>1000,22724=>1000,22725=>1000,22726=>1000,22727=>1000,22728=>1000,22729=>1000,22730=>1000,22731=>1000,22732=>1000,22733=>1000,22734=>1000,22735=>1000,22736=>1000,22737=>1000,22738=>1000,22739=>1000,22740=>1000,22741=>1000,22742=>1000,22743=>1000,22744=>1000,22745=>1000,22746=>1000,22747=>1000,22748=>1000,22749=>1000,22750=>1000,22751=>1000,22752=>1000,22753=>1000,22754=>1000,22755=>1000,22756=>1000,22757=>1000,22758=>1000,22759=>1000,22760=>1000,22761=>1000,22762=>1000,22763=>1000,22764=>1000,22765=>1000,22766=>1000,22767=>1000,22768=>1000,22769=>1000,22770=>1000,22771=>1000,22772=>1000,22773=>1000,22774=>1000,22775=>1000,22776=>1000,22777=>1000,22778=>1000,22779=>1000,22780=>1000,22781=>1000,22782=>1000,22783=>1000,22784=>1000,22785=>1000,22786=>1000,22787=>1000,22788=>1000,22789=>1000,22790=>1000,22791=>1000,22792=>1000,22793=>1000,22794=>1000,22795=>1000,22796=>1000,22797=>1000,22798=>1000,22799=>1000,22800=>1000,22801=>1000,22802=>1000,22803=>1000,22804=>1000,22805=>1000,22806=>1000,22807=>1000,22808=>1000,22809=>1000,22810=>1000,22811=>1000,22812=>1000,22813=>1000,22814=>1000,22815=>1000,22816=>1000,22817=>1000,22818=>1000,22819=>1000,22820=>1000,22821=>1000,22822=>1000,22823=>1000,22824=>1000,22825=>1000,22826=>1000,22827=>1000,22828=>1000,22829=>1000,22830=>1000,22831=>1000,22832=>1000,22833=>1000,22834=>1000,22835=>1000,22836=>1000,22837=>1000,22838=>1000,22839=>1000,22840=>1000,22841=>1000,22842=>1000,22843=>1000,22844=>1000,22845=>1000,22846=>1000,22847=>1000,22848=>1000,22849=>1000,22850=>1000,22851=>1000,22852=>1000,22853=>1000,22854=>1000,22855=>1000,22856=>1000,22857=>1000,22858=>1000,22859=>1000,22860=>1000,22861=>1000,22862=>1000,22863=>1000,22864=>1000,22865=>1000,22866=>1000,22867=>1000,22868=>1000,22869=>1000,22870=>1000,22871=>1000,22872=>1000,22873=>1000,22874=>1000,22875=>1000,22876=>1000,22877=>1000,22878=>1000,22879=>1000,22880=>1000,22881=>1000,22882=>1000,22883=>1000,22884=>1000,22885=>1000,22886=>1000,22887=>1000,22888=>1000,22889=>1000,22890=>1000,22891=>1000,22892=>1000,22893=>1000,22894=>1000,22895=>1000,22896=>1000,22897=>1000,22898=>1000,22899=>1000,22900=>1000,22901=>1000,22902=>1000,22903=>1000,22904=>1000,22905=>1000,22906=>1000,22907=>1000,22908=>1000,22909=>1000,22910=>1000,22911=>1000,22912=>1000,22913=>1000,22914=>1000,22915=>1000,22916=>1000,22917=>1000,22918=>1000,22919=>1000,22920=>1000,22921=>1000,22922=>1000,22923=>1000,22924=>1000,22925=>1000,22926=>1000,22927=>1000,22928=>1000,22929=>1000,22930=>1000,22931=>1000,22932=>1000,22933=>1000,22934=>1000,22935=>1000,22936=>1000,22937=>1000,22938=>1000,22939=>1000,22940=>1000,22941=>1000,22942=>1000,22943=>1000,22944=>1000,22945=>1000,22946=>1000,22947=>1000,22948=>1000,22949=>1000,22950=>1000,22951=>1000,22952=>1000,22953=>1000,22954=>1000,22955=>1000,22956=>1000,22957=>1000,22958=>1000,22959=>1000,22960=>1000,22961=>1000,22962=>1000,22963=>1000,22964=>1000,22965=>1000,22966=>1000,22967=>1000,22968=>1000,22969=>1000,22970=>1000,22971=>1000,22972=>1000,22973=>1000,22974=>1000,22975=>1000,22976=>1000,22977=>1000,22978=>1000,22979=>1000,22980=>1000,22981=>1000,22982=>1000,22983=>1000,22984=>1000,22985=>1000,22986=>1000,22987=>1000,22988=>1000,22989=>1000,22990=>1000,22991=>1000,22992=>1000,22993=>1000,22994=>1000,22995=>1000,22996=>1000,22997=>1000,22998=>1000,22999=>1000,23000=>1000,23001=>1000,23002=>1000,23003=>1000,23004=>1000,23005=>1000,23006=>1000,23007=>1000,23008=>1000,23009=>1000,23010=>1000,23011=>1000,23012=>1000,23013=>1000,23014=>1000,23015=>1000,23016=>1000,23017=>1000,23018=>1000,23019=>1000,23020=>1000,23021=>1000,23022=>1000,23023=>1000,23024=>1000,23025=>1000,23026=>1000,23027=>1000,23028=>1000,23029=>1000,23030=>1000,23031=>1000,23032=>1000,23033=>1000,23034=>1000,23035=>1000,23036=>1000,23037=>1000,23038=>1000,23039=>1000,23040=>1000,23041=>1000,23042=>1000,23043=>1000,23044=>1000,23045=>1000,23046=>1000,23047=>1000,23048=>1000,23049=>1000,23050=>1000,23051=>1000,23052=>1000,23053=>1000,23054=>1000,23055=>1000,23056=>1000,23057=>1000,23058=>1000,23059=>1000,23060=>1000,23061=>1000,23062=>1000,23063=>1000,23064=>1000,23065=>1000,23066=>1000,23067=>1000,23068=>1000,23069=>1000,23070=>1000,23071=>1000,23072=>1000,23073=>1000,23074=>1000,23075=>1000,23076=>1000,23077=>1000,23078=>1000,23079=>1000,23080=>1000,23081=>1000,23082=>1000,23083=>1000,23084=>1000,23085=>1000,23086=>1000,23087=>1000,23088=>1000,23089=>1000,23090=>1000,23091=>1000,23092=>1000,23093=>1000,23094=>1000,23095=>1000,23096=>1000,23097=>1000,23098=>1000,23099=>1000,23100=>1000,23101=>1000,23102=>1000,23103=>1000,23104=>1000,23105=>1000,23106=>1000,23107=>1000,23108=>1000,23109=>1000,23110=>1000,23111=>1000,23112=>1000,23113=>1000,23114=>1000,23115=>1000,23116=>1000,23117=>1000,23118=>1000,23119=>1000,23120=>1000,23121=>1000,23122=>1000,23123=>1000,23124=>1000,23125=>1000,23126=>1000,23127=>1000,23128=>1000,23129=>1000,23130=>1000,23131=>1000,23132=>1000,23133=>1000,23134=>1000,23135=>1000,23136=>1000,23137=>1000,23138=>1000,23139=>1000,23140=>1000,23141=>1000,23142=>1000,23143=>1000,23144=>1000,23145=>1000,23146=>1000,23147=>1000,23148=>1000,23149=>1000,23150=>1000,23151=>1000,23152=>1000,23153=>1000,23154=>1000,23155=>1000,23156=>1000,23157=>1000,23158=>1000,23159=>1000,23160=>1000,23161=>1000,23162=>1000,23163=>1000,23164=>1000,23165=>1000,23166=>1000,23167=>1000,23168=>1000,23169=>1000,23170=>1000,23171=>1000,23172=>1000,23173=>1000,23174=>1000,23175=>1000,23176=>1000,23177=>1000,23178=>1000,23179=>1000,23180=>1000,23181=>1000,23182=>1000,23183=>1000,23184=>1000,23185=>1000,23186=>1000,23187=>1000,23188=>1000,23189=>1000,23190=>1000,23191=>1000,23192=>1000,23193=>1000,23194=>1000,23195=>1000,23196=>1000,23197=>1000,23198=>1000,23199=>1000,23200=>1000,23201=>1000,23202=>1000,23203=>1000,23204=>1000,23205=>1000,23206=>1000,23207=>1000,23208=>1000,23209=>1000,23210=>1000,23211=>1000,23212=>1000,23213=>1000,23214=>1000,23215=>1000,23216=>1000,23217=>1000,23218=>1000,23219=>1000,23220=>1000,23221=>1000,23222=>1000,23223=>1000,23224=>1000,23225=>1000,23226=>1000,23227=>1000,23228=>1000,23229=>1000,23230=>1000,23231=>1000,23232=>1000,23233=>1000,23234=>1000,23235=>1000,23236=>1000,23237=>1000,23238=>1000,23239=>1000,23240=>1000,23241=>1000,23242=>1000,23243=>1000,23244=>1000,23245=>1000,23246=>1000,23247=>1000,23248=>1000,23249=>1000,23250=>1000,23251=>1000,23252=>1000,23253=>1000,23254=>1000,23255=>1000,23256=>1000,23257=>1000,23258=>1000,23259=>1000,23260=>1000,23261=>1000,23262=>1000,23263=>1000,23264=>1000,23265=>1000,23266=>1000,23267=>1000,23268=>1000,23269=>1000,23270=>1000,23271=>1000,23272=>1000,23273=>1000,23274=>1000,23275=>1000,23276=>1000,23277=>1000,23278=>1000,23279=>1000,23280=>1000,23281=>1000,23282=>1000,23283=>1000,23284=>1000,23285=>1000,23286=>1000,23287=>1000,23288=>1000,23289=>1000,23290=>1000,23291=>1000,23292=>1000,23293=>1000,23294=>1000,23295=>1000,23296=>1000,23297=>1000,23298=>1000,23299=>1000,23300=>1000,23301=>1000,23302=>1000,23303=>1000,23304=>1000,23305=>1000,23306=>1000,23307=>1000,23308=>1000,23309=>1000,23310=>1000,23311=>1000,23312=>1000,23313=>1000,23314=>1000,23315=>1000,23316=>1000,23317=>1000,23318=>1000,23319=>1000,23320=>1000,23321=>1000,23322=>1000,23323=>1000,23324=>1000,23325=>1000,23326=>1000,23327=>1000,23328=>1000,23329=>1000,23330=>1000,23331=>1000,23332=>1000,23333=>1000,23334=>1000,23335=>1000,23336=>1000,23337=>1000,23338=>1000,23339=>1000,23340=>1000,23341=>1000,23342=>1000,23343=>1000,23344=>1000,23345=>1000,23346=>1000,23347=>1000,23348=>1000,23349=>1000,23350=>1000,23351=>1000,23352=>1000,23353=>1000,23354=>1000,23355=>1000,23356=>1000,23357=>1000,23358=>1000,23359=>1000,23360=>1000,23361=>1000,23362=>1000,23363=>1000,23364=>1000,23365=>1000,23366=>1000,23367=>1000,23368=>1000,23369=>1000,23370=>1000,23371=>1000,23372=>1000,23373=>1000,23374=>1000,23375=>1000,23376=>1000,23377=>1000,23378=>1000,23379=>1000,23380=>1000,23381=>1000,23382=>1000,23383=>1000,23384=>1000,23385=>1000,23386=>1000,23387=>1000,23388=>1000,23389=>1000,23390=>1000,23391=>1000,23392=>1000,23393=>1000,23394=>1000,23395=>1000,23396=>1000,23397=>1000,23398=>1000,23399=>1000,23400=>1000,23401=>1000,23402=>1000,23403=>1000,23404=>1000,23405=>1000,23406=>1000,23407=>1000,23408=>1000,23409=>1000,23410=>1000,23411=>1000,23412=>1000,23413=>1000,23414=>1000,23415=>1000,23416=>1000,23417=>1000,23418=>1000,23419=>1000,23420=>1000,23421=>1000,23422=>1000,23423=>1000,23424=>1000,23425=>1000,23426=>1000,23427=>1000,23428=>1000,23429=>1000,23430=>1000,23431=>1000,23432=>1000,23433=>1000,23434=>1000,23435=>1000,23436=>1000,23437=>1000,23438=>1000,23439=>1000,23440=>1000,23441=>1000,23442=>1000,23443=>1000,23444=>1000,23445=>1000,23446=>1000,23447=>1000,23448=>1000,23449=>1000,23450=>1000,23451=>1000,23452=>1000,23453=>1000,23454=>1000,23455=>1000,23456=>1000,23457=>1000,23458=>1000,23459=>1000,23460=>1000,23461=>1000,23462=>1000,23463=>1000,23464=>1000,23465=>1000,23466=>1000,23467=>1000,23468=>1000,23469=>1000,23470=>1000,23471=>1000,23472=>1000,23473=>1000,23474=>1000,23475=>1000,23476=>1000,23477=>1000,23478=>1000,23479=>1000,23480=>1000,23481=>1000,23482=>1000,23483=>1000,23484=>1000,23485=>1000,23486=>1000,23487=>1000,23488=>1000,23489=>1000,23490=>1000,23491=>1000,23492=>1000,23493=>1000,23494=>1000,23495=>1000,23496=>1000,23497=>1000,23498=>1000,23499=>1000,23500=>1000,23501=>1000,23502=>1000,23503=>1000,23504=>1000,23505=>1000,23506=>1000,23507=>1000,23508=>1000,23509=>1000,23510=>1000,23511=>1000,23512=>1000,23513=>1000,23514=>1000,23515=>1000,23516=>1000,23517=>1000,23518=>1000,23519=>1000,23520=>1000,23521=>1000,23522=>1000,23523=>1000,23524=>1000,23525=>1000,23526=>1000,23527=>1000,23528=>1000,23529=>1000,23530=>1000,23531=>1000,23532=>1000,23533=>1000,23534=>1000,23535=>1000,23536=>1000,23537=>1000,23538=>1000,23539=>1000,23540=>1000,23541=>1000,23542=>1000,23543=>1000,23544=>1000,23545=>1000,23546=>1000,23547=>1000,23548=>1000,23549=>1000,23550=>1000,23551=>1000,23552=>1000,23553=>1000,23554=>1000,23555=>1000,23556=>1000,23557=>1000,23558=>1000,23559=>1000,23560=>1000,23561=>1000,23562=>1000,23563=>1000,23564=>1000,23565=>1000,23566=>1000,23567=>1000,23568=>1000,23569=>1000,23570=>1000,23571=>1000,23572=>1000,23573=>1000,23574=>1000,23575=>1000,23576=>1000,23577=>1000,23578=>1000,23579=>1000,23580=>1000,23581=>1000,23582=>1000,23583=>1000,23584=>1000,23585=>1000,23586=>1000,23587=>1000,23588=>1000,23589=>1000,23590=>1000,23591=>1000,23592=>1000,23593=>1000,23594=>1000,23595=>1000,23596=>1000,23597=>1000,23598=>1000,23599=>1000,23600=>1000,23601=>1000,23602=>1000,23603=>1000,23604=>1000,23605=>1000,23606=>1000,23607=>1000,23608=>1000,23609=>1000,23610=>1000,23611=>1000,23612=>1000,23613=>1000,23614=>1000,23615=>1000,23616=>1000,23617=>1000,23618=>1000,23619=>1000,23620=>1000,23621=>1000,23622=>1000,23623=>1000,23624=>1000,23625=>1000,23626=>1000,23627=>1000,23628=>1000,23629=>1000,23630=>1000,23631=>1000,23632=>1000,23633=>1000,23634=>1000,23635=>1000,23636=>1000,23637=>1000,23638=>1000,23639=>1000,23640=>1000,23641=>1000,23642=>1000,23643=>1000,23644=>1000,23645=>1000,23646=>1000,23647=>1000,23648=>1000,23649=>1000,23650=>1000,23651=>1000,23652=>1000,23653=>1000,23654=>1000,23655=>1000,23656=>1000,23657=>1000,23658=>1000,23659=>1000,23660=>1000,23661=>1000,23662=>1000,23663=>1000,23664=>1000,23665=>1000,23666=>1000,23667=>1000,23668=>1000,23669=>1000,23670=>1000,23671=>1000,23672=>1000,23673=>1000,23674=>1000,23675=>1000,23676=>1000,23677=>1000,23678=>1000,23679=>1000,23680=>1000,23681=>1000,23682=>1000,23683=>1000,23684=>1000,23685=>1000,23686=>1000,23687=>1000,23688=>1000,23689=>1000,23690=>1000,23691=>1000,23692=>1000,23693=>1000,23694=>1000,23695=>1000,23696=>1000,23697=>1000,23698=>1000,23699=>1000,23700=>1000,23701=>1000,23702=>1000,23703=>1000,23704=>1000,23705=>1000,23706=>1000,23707=>1000,23708=>1000,23709=>1000,23710=>1000,23711=>1000,23712=>1000,23713=>1000,23714=>1000,23715=>1000,23716=>1000,23717=>1000,23718=>1000,23719=>1000,23720=>1000,23721=>1000,23722=>1000,23723=>1000,23724=>1000,23725=>1000,23726=>1000,23727=>1000,23728=>1000,23729=>1000,23730=>1000,23731=>1000,23732=>1000,23733=>1000,23734=>1000,23735=>1000,23736=>1000,23737=>1000,23738=>1000,23739=>1000,23740=>1000,23741=>1000,23742=>1000,23743=>1000,23744=>1000,23745=>1000,23746=>1000,23747=>1000,23748=>1000,23749=>1000,23750=>1000,23751=>1000,23752=>1000,23753=>1000,23754=>1000,23755=>1000,23756=>1000,23757=>1000,23758=>1000,23759=>1000,23760=>1000,23761=>1000,23762=>1000,23763=>1000,23764=>1000,23765=>1000,23766=>1000,23767=>1000,23768=>1000,23769=>1000,23770=>1000,23771=>1000,23772=>1000,23773=>1000,23774=>1000,23775=>1000,23776=>1000,23777=>1000,23778=>1000,23779=>1000,23780=>1000,23781=>1000,23782=>1000,23783=>1000,23784=>1000,23785=>1000,23786=>1000,23787=>1000,23788=>1000,23789=>1000,23790=>1000,23791=>1000,23792=>1000,23793=>1000,23794=>1000,23795=>1000,23796=>1000,23797=>1000,23798=>1000,23799=>1000,23800=>1000,23801=>1000,23802=>1000,23803=>1000,23804=>1000,23805=>1000,23806=>1000,23807=>1000,23808=>1000,23809=>1000,23810=>1000,23811=>1000,23812=>1000,23813=>1000,23814=>1000,23815=>1000,23816=>1000,23817=>1000,23818=>1000,23819=>1000,23820=>1000,23821=>1000,23822=>1000,23823=>1000,23824=>1000,23825=>1000,23826=>1000,23827=>1000,23828=>1000,23829=>1000,23830=>1000,23831=>1000,23832=>1000,23833=>1000,23834=>1000,23835=>1000,23836=>1000,23837=>1000,23838=>1000,23839=>1000,23840=>1000,23841=>1000,23842=>1000,23843=>1000,23844=>1000,23845=>1000,23846=>1000,23847=>1000,23848=>1000,23849=>1000,23850=>1000,23851=>1000,23852=>1000,23853=>1000,23854=>1000,23855=>1000,23856=>1000,23857=>1000,23858=>1000,23859=>1000,23860=>1000,23861=>1000,23862=>1000,23863=>1000,23864=>1000,23865=>1000,23866=>1000,23867=>1000,23868=>1000,23869=>1000,23870=>1000,23871=>1000,23872=>1000,23873=>1000,23874=>1000,23875=>1000,23876=>1000,23877=>1000,23878=>1000,23879=>1000,23880=>1000,23881=>1000,23882=>1000,23883=>1000,23884=>1000,23885=>1000,23886=>1000,23887=>1000,23888=>1000,23889=>1000,23890=>1000,23891=>1000,23892=>1000,23893=>1000,23894=>1000,23895=>1000,23896=>1000,23897=>1000,23898=>1000,23899=>1000,23900=>1000,23901=>1000,23902=>1000,23903=>1000,23904=>1000,23905=>1000,23906=>1000,23907=>1000,23908=>1000,23909=>1000,23910=>1000,23911=>1000,23912=>1000,23913=>1000,23914=>1000,23915=>1000,23916=>1000,23917=>1000,23918=>1000,23919=>1000,23920=>1000,23921=>1000,23922=>1000,23923=>1000,23924=>1000,23925=>1000,23926=>1000,23927=>1000,23928=>1000,23929=>1000,23930=>1000,23931=>1000,23932=>1000,23933=>1000,23934=>1000,23935=>1000,23936=>1000,23937=>1000,23938=>1000,23939=>1000,23940=>1000,23941=>1000,23942=>1000,23943=>1000,23944=>1000,23945=>1000,23946=>1000,23947=>1000,23948=>1000,23949=>1000,23950=>1000,23951=>1000,23952=>1000,23953=>1000,23954=>1000,23955=>1000,23956=>1000,23957=>1000,23958=>1000,23959=>1000,23960=>1000,23961=>1000,23962=>1000,23963=>1000,23964=>1000,23965=>1000,23966=>1000,23967=>1000,23968=>1000,23969=>1000,23970=>1000,23971=>1000,23972=>1000,23973=>1000,23974=>1000,23975=>1000,23976=>1000,23977=>1000,23978=>1000,23979=>1000,23980=>1000,23981=>1000,23982=>1000,23983=>1000,23984=>1000,23985=>1000,23986=>1000,23987=>1000,23988=>1000,23989=>1000,23990=>1000,23991=>1000,23992=>1000,23993=>1000,23994=>1000,23995=>1000,23996=>1000,23997=>1000,23998=>1000,23999=>1000,24000=>1000,24001=>1000,24002=>1000,24003=>1000,24004=>1000,24005=>1000,24006=>1000,24007=>1000,24008=>1000,24009=>1000,24010=>1000,24011=>1000,24012=>1000,24013=>1000,24014=>1000,24015=>1000,24016=>1000,24017=>1000,24018=>1000,24019=>1000,24020=>1000,24021=>1000,24022=>1000,24023=>1000,24024=>1000,24025=>1000,24026=>1000,24027=>1000,24028=>1000,24029=>1000,24030=>1000,24031=>1000,24032=>1000,24033=>1000,24034=>1000,24035=>1000,24036=>1000,24037=>1000,24038=>1000,24039=>1000,24040=>1000,24041=>1000,24042=>1000,24043=>1000,24044=>1000,24045=>1000,24046=>1000,24047=>1000,24048=>1000,24049=>1000,24050=>1000,24051=>1000,24052=>1000,24053=>1000,24054=>1000,24055=>1000,24056=>1000,24057=>1000,24058=>1000,24059=>1000,24060=>1000,24061=>1000,24062=>1000,24063=>1000,24064=>1000,24065=>1000,24066=>1000,24067=>1000,24068=>1000,24069=>1000,24070=>1000,24071=>1000,24072=>1000,24073=>1000,24074=>1000,24075=>1000,24076=>1000,24077=>1000,24078=>1000,24079=>1000,24080=>1000,24081=>1000,24082=>1000,24083=>1000,24084=>1000,24085=>1000,24086=>1000,24087=>1000,24088=>1000,24089=>1000,24090=>1000,24091=>1000,24092=>1000,24093=>1000,24094=>1000,24095=>1000,24096=>1000,24097=>1000,24098=>1000,24099=>1000,24100=>1000,24101=>1000,24102=>1000,24103=>1000,24104=>1000,24105=>1000,24106=>1000,24107=>1000,24108=>1000,24109=>1000,24110=>1000,24111=>1000,24112=>1000,24113=>1000,24114=>1000,24115=>1000,24116=>1000,24117=>1000,24118=>1000,24119=>1000,24120=>1000,24121=>1000,24122=>1000,24123=>1000,24124=>1000,24125=>1000,24126=>1000,24127=>1000,24128=>1000,24129=>1000,24130=>1000,24131=>1000,24132=>1000,24133=>1000,24134=>1000,24135=>1000,24136=>1000,24137=>1000,24138=>1000,24139=>1000,24140=>1000,24141=>1000,24142=>1000,24143=>1000,24144=>1000,24145=>1000,24146=>1000,24147=>1000,24148=>1000,24149=>1000,24150=>1000,24151=>1000,24152=>1000,24153=>1000,24154=>1000,24155=>1000,24156=>1000,24157=>1000,24158=>1000,24159=>1000,24160=>1000,24161=>1000,24162=>1000,24163=>1000,24164=>1000,24165=>1000,24166=>1000,24167=>1000,24168=>1000,24169=>1000,24170=>1000,24171=>1000,24172=>1000,24173=>1000,24174=>1000,24175=>1000,24176=>1000,24177=>1000,24178=>1000,24179=>1000,24180=>1000,24181=>1000,24182=>1000,24183=>1000,24184=>1000,24185=>1000,24186=>1000,24187=>1000,24188=>1000,24189=>1000,24190=>1000,24191=>1000,24192=>1000,24193=>1000,24194=>1000,24195=>1000,24196=>1000,24197=>1000,24198=>1000,24199=>1000,24200=>1000,24201=>1000,24202=>1000,24203=>1000,24204=>1000,24205=>1000,24206=>1000,24207=>1000,24208=>1000,24209=>1000,24210=>1000,24211=>1000,24212=>1000,24213=>1000,24214=>1000,24215=>1000,24216=>1000,24217=>1000,24218=>1000,24219=>1000,24220=>1000,24221=>1000,24222=>1000,24223=>1000,24224=>1000,24225=>1000,24226=>1000,24227=>1000,24228=>1000,24229=>1000,24230=>1000,24231=>1000,24232=>1000,24233=>1000,24234=>1000,24235=>1000,24236=>1000,24237=>1000,24238=>1000,24239=>1000,24240=>1000,24241=>1000,24242=>1000,24243=>1000,24244=>1000,24245=>1000,24246=>1000,24247=>1000,24248=>1000,24249=>1000,24250=>1000,24251=>1000,24252=>1000,24253=>1000,24254=>1000,24255=>1000,24256=>1000,24257=>1000,24258=>1000,24259=>1000,24260=>1000,24261=>1000,24262=>1000,24263=>1000,24264=>1000,24265=>1000,24266=>1000,24267=>1000,24268=>1000,24269=>1000,24270=>1000,24271=>1000,24272=>1000,24273=>1000,24274=>1000,24275=>1000,24276=>1000,24277=>1000,24278=>1000,24279=>1000,24280=>1000,24281=>1000,24282=>1000,24283=>1000,24284=>1000,24285=>1000,24286=>1000,24287=>1000,24288=>1000,24289=>1000,24290=>1000,24291=>1000,24292=>1000,24293=>1000,24294=>1000,24295=>1000,24296=>1000,24297=>1000,24298=>1000,24299=>1000,24300=>1000,24301=>1000,24302=>1000,24303=>1000,24304=>1000,24305=>1000,24306=>1000,24307=>1000,24308=>1000,24309=>1000,24310=>1000,24311=>1000,24312=>1000,24313=>1000,24314=>1000,24315=>1000,24316=>1000,24317=>1000,24318=>1000,24319=>1000,24320=>1000,24321=>1000,24322=>1000,24323=>1000,24324=>1000,24325=>1000,24326=>1000,24327=>1000,24328=>1000,24329=>1000,24330=>1000,24331=>1000,24332=>1000,24333=>1000,24334=>1000,24335=>1000,24336=>1000,24337=>1000,24338=>1000,24339=>1000,24340=>1000,24341=>1000,24342=>1000,24343=>1000,24344=>1000,24345=>1000,24346=>1000,24347=>1000,24348=>1000,24349=>1000,24350=>1000,24351=>1000,24352=>1000,24353=>1000,24354=>1000,24355=>1000,24356=>1000,24357=>1000,24358=>1000,24359=>1000,24360=>1000,24361=>1000,24362=>1000,24363=>1000,24364=>1000,24365=>1000,24366=>1000,24367=>1000,24368=>1000,24369=>1000,24370=>1000,24371=>1000,24372=>1000,24373=>1000,24374=>1000,24375=>1000,24376=>1000,24377=>1000,24378=>1000,24379=>1000,24380=>1000,24381=>1000,24382=>1000,24383=>1000,24384=>1000,24385=>1000,24386=>1000,24387=>1000,24388=>1000,24389=>1000,24390=>1000,24391=>1000,24392=>1000,24393=>1000,24394=>1000,24395=>1000,24396=>1000,24397=>1000,24398=>1000,24399=>1000,24400=>1000,24401=>1000,24402=>1000,24403=>1000,24404=>1000,24405=>1000,24406=>1000,24407=>1000,24408=>1000,24409=>1000,24410=>1000,24411=>1000,24412=>1000,24413=>1000,24414=>1000,24415=>1000,24416=>1000,24417=>1000,24418=>1000,24419=>1000,24420=>1000,24421=>1000,24422=>1000,24423=>1000,24424=>1000,24425=>1000,24426=>1000,24427=>1000,24428=>1000,24429=>1000,24430=>1000,24431=>1000,24432=>1000,24433=>1000,24434=>1000,24435=>1000,24436=>1000,24437=>1000,24438=>1000,24439=>1000,24440=>1000,24441=>1000,24442=>1000,24443=>1000,24444=>1000,24445=>1000,24446=>1000,24447=>1000,24448=>1000,24449=>1000,24450=>1000,24451=>1000,24452=>1000,24453=>1000,24454=>1000,24455=>1000,24456=>1000,24457=>1000,24458=>1000,24459=>1000,24460=>1000,24461=>1000,24462=>1000,24463=>1000,24464=>1000,24465=>1000,24466=>1000,24467=>1000,24468=>1000,24469=>1000,24470=>1000,24471=>1000,24472=>1000,24473=>1000,24474=>1000,24475=>1000,24476=>1000,24477=>1000,24478=>1000,24479=>1000,24480=>1000,24481=>1000,24482=>1000,24483=>1000,24484=>1000,24485=>1000,24486=>1000,24487=>1000,24488=>1000,24489=>1000,24490=>1000,24491=>1000,24492=>1000,24493=>1000,24494=>1000,24495=>1000,24496=>1000,24497=>1000,24498=>1000,24499=>1000,24500=>1000,24501=>1000,24502=>1000,24503=>1000,24504=>1000,24505=>1000,24506=>1000,24507=>1000,24508=>1000,24509=>1000,24510=>1000,24511=>1000,24512=>1000,24513=>1000,24514=>1000,24515=>1000,24516=>1000,24517=>1000,24518=>1000,24519=>1000,24520=>1000,24521=>1000,24522=>1000,24523=>1000,24524=>1000,24525=>1000,24526=>1000,24527=>1000,24528=>1000,24529=>1000,24530=>1000,24531=>1000,24532=>1000,24533=>1000,24534=>1000,24535=>1000,24536=>1000,24537=>1000,24538=>1000,24539=>1000,24540=>1000,24541=>1000,24542=>1000,24543=>1000,24544=>1000,24545=>1000,24546=>1000,24547=>1000,24548=>1000,24549=>1000,24550=>1000,24551=>1000,24552=>1000,24553=>1000,24554=>1000,24555=>1000,24556=>1000,24557=>1000,24558=>1000,24559=>1000,24560=>1000,24561=>1000,24562=>1000,24563=>1000,24564=>1000,24565=>1000,24566=>1000,24567=>1000,24568=>1000,24569=>1000,24570=>1000,24571=>1000,24572=>1000,24573=>1000,24574=>1000,24575=>1000,24576=>1000,24577=>1000,24578=>1000,24579=>1000,24580=>1000,24581=>1000,24582=>1000,24583=>1000,24584=>1000,24585=>1000,24586=>1000,24587=>1000,24588=>1000,24589=>1000,24590=>1000,24591=>1000,24592=>1000,24593=>1000,24594=>1000,24595=>1000,24596=>1000,24597=>1000,24598=>1000,24599=>1000,24600=>1000,24601=>1000,24602=>1000,24603=>1000,24604=>1000,24605=>1000,24606=>1000,24607=>1000,24608=>1000,24609=>1000,24610=>1000,24611=>1000,24612=>1000,24613=>1000,24614=>1000,24615=>1000,24616=>1000,24617=>1000,24618=>1000,24619=>1000,24620=>1000,24621=>1000,24622=>1000,24623=>1000,24624=>1000,24625=>1000,24626=>1000,24627=>1000,24628=>1000,24629=>1000,24630=>1000,24631=>1000,24632=>1000,24633=>1000,24634=>1000,24635=>1000,24636=>1000,24637=>1000,24638=>1000,24639=>1000,24640=>1000,24641=>1000,24642=>1000,24643=>1000,24644=>1000,24645=>1000,24646=>1000,24647=>1000,24648=>1000,24649=>1000,24650=>1000,24651=>1000,24652=>1000,24653=>1000,24654=>1000,24655=>1000,24656=>1000,24657=>1000,24658=>1000,24659=>1000,24660=>1000,24661=>1000,24662=>1000,24663=>1000,24664=>1000,24665=>1000,24666=>1000,24667=>1000,24668=>1000,24669=>1000,24670=>1000,24671=>1000,24672=>1000,24673=>1000,24674=>1000,24675=>1000,24676=>1000,24677=>1000,24678=>1000,24679=>1000,24680=>1000,24681=>1000,24682=>1000,24683=>1000,24684=>1000,24685=>1000,24686=>1000,24687=>1000,24688=>1000,24689=>1000,24690=>1000,24691=>1000,24692=>1000,24693=>1000,24694=>1000,24695=>1000,24696=>1000,24697=>1000,24698=>1000,24699=>1000,24700=>1000,24701=>1000,24702=>1000,24703=>1000,24704=>1000,24705=>1000,24706=>1000,24707=>1000,24708=>1000,24709=>1000,24710=>1000,24711=>1000,24712=>1000,24713=>1000,24714=>1000,24715=>1000,24716=>1000,24717=>1000,24718=>1000,24719=>1000,24720=>1000,24721=>1000,24722=>1000,24723=>1000,24724=>1000,24725=>1000,24726=>1000,24727=>1000,24728=>1000,24729=>1000,24730=>1000,24731=>1000,24732=>1000,24733=>1000,24734=>1000,24735=>1000,24736=>1000,24737=>1000,24738=>1000,24739=>1000,24740=>1000,24741=>1000,24742=>1000,24743=>1000,24744=>1000,24745=>1000,24746=>1000,24747=>1000,24748=>1000,24749=>1000,24750=>1000,24751=>1000,24752=>1000,24753=>1000,24754=>1000,24755=>1000,24756=>1000,24757=>1000,24758=>1000,24759=>1000,24760=>1000,24761=>1000,24762=>1000,24763=>1000,24764=>1000,24765=>1000,24766=>1000,24767=>1000,24768=>1000,24769=>1000,24770=>1000,24771=>1000,24772=>1000,24773=>1000,24774=>1000,24775=>1000,24776=>1000,24777=>1000,24778=>1000,24779=>1000,24780=>1000,24781=>1000,24782=>1000,24783=>1000,24784=>1000,24785=>1000,24786=>1000,24787=>1000,24788=>1000,24789=>1000,24790=>1000,24791=>1000,24792=>1000,24793=>1000,24794=>1000,24795=>1000,24796=>1000,24797=>1000,24798=>1000,24799=>1000,24800=>1000,24801=>1000,24802=>1000,24803=>1000,24804=>1000,24805=>1000,24806=>1000,24807=>1000,24808=>1000,24809=>1000,24810=>1000,24811=>1000,24812=>1000,24813=>1000,24814=>1000,24815=>1000,24816=>1000,24817=>1000,24818=>1000,24819=>1000,24820=>1000,24821=>1000,24822=>1000,24823=>1000,24824=>1000,24825=>1000,24826=>1000,24827=>1000,24828=>1000,24829=>1000,24830=>1000,24831=>1000,24832=>1000,24833=>1000,24834=>1000,24835=>1000,24836=>1000,24837=>1000,24838=>1000,24839=>1000,24840=>1000,24841=>1000,24842=>1000,24843=>1000,24844=>1000,24845=>1000,24846=>1000,24847=>1000,24848=>1000,24849=>1000,24850=>1000,24851=>1000,24852=>1000,24853=>1000,24854=>1000,24855=>1000,24856=>1000,24857=>1000,24858=>1000,24859=>1000,24860=>1000,24861=>1000,24862=>1000,24863=>1000,24864=>1000,24865=>1000,24866=>1000,24867=>1000,24868=>1000,24869=>1000,24870=>1000,24871=>1000,24872=>1000,24873=>1000,24874=>1000,24875=>1000,24876=>1000,24877=>1000,24878=>1000,24879=>1000,24880=>1000,24881=>1000,24882=>1000,24883=>1000,24884=>1000,24885=>1000,24886=>1000,24887=>1000,24888=>1000,24889=>1000,24890=>1000,24891=>1000,24892=>1000,24893=>1000,24894=>1000,24895=>1000,24896=>1000,24897=>1000,24898=>1000,24899=>1000,24900=>1000,24901=>1000,24902=>1000,24903=>1000,24904=>1000,24905=>1000,24906=>1000,24907=>1000,24908=>1000,24909=>1000,24910=>1000,24911=>1000,24912=>1000,24913=>1000,24914=>1000,24915=>1000,24916=>1000,24917=>1000,24918=>1000,24919=>1000,24920=>1000,24921=>1000,24922=>1000,24923=>1000,24924=>1000,24925=>1000,24926=>1000,24927=>1000,24928=>1000,24929=>1000,24930=>1000,24931=>1000,24932=>1000,24933=>1000,24934=>1000,24935=>1000,24936=>1000,24937=>1000,24938=>1000,24939=>1000,24940=>1000,24941=>1000,24942=>1000,24943=>1000,24944=>1000,24945=>1000,24946=>1000,24947=>1000,24948=>1000,24949=>1000,24950=>1000,24951=>1000,24952=>1000,24953=>1000,24954=>1000,24955=>1000,24956=>1000,24957=>1000,24958=>1000,24959=>1000,24960=>1000,24961=>1001,24962=>1000,24963=>1000,24964=>1000,24965=>1000,24966=>1000,24967=>1000,24968=>1000,24969=>1000,24970=>1000,24971=>1000,24972=>1000,24973=>1000,24974=>1000,24975=>1000,24976=>1000,24977=>1000,24978=>1000,24979=>1000,24980=>1000,24981=>1000,24982=>1000,24983=>1000,24984=>1000,24985=>1000,24986=>1000,24987=>1000,24988=>1000,24989=>1000,24990=>1000,24991=>1000,24992=>1000,24993=>1000,24994=>1000,24995=>1000,24996=>1000,24997=>1000,24998=>1000,24999=>1000,25000=>1000,25001=>1000,25002=>1000,25003=>1000,25004=>1000,25005=>1000,25006=>1000,25007=>1000,25008=>1000,25009=>1000,25010=>1000,25011=>1000,25012=>1000,25013=>1000,25014=>1000,25015=>1000,25016=>1000,25017=>1000,25018=>1000,25019=>1000,25020=>1000,25021=>1000,25022=>1000,25023=>1000,25024=>1000,25025=>1000,25026=>1000,25027=>1000,25028=>1000,25029=>1000,25030=>1000,25031=>1000,25032=>1000,25033=>1000,25034=>1000,25035=>1000,25036=>1000,25037=>1000,25038=>1000,25039=>1000,25040=>1000,25041=>1000,25042=>1000,25043=>1000,25044=>1000,25045=>1000,25046=>1000,25047=>1000,25048=>1000,25049=>1000,25050=>1000,25051=>1000,25052=>1000,25053=>1000,25054=>1000,25055=>1000,25056=>1000,25057=>1000,25058=>1000,25059=>1000,25060=>1000,25061=>1000,25062=>1000,25063=>1000,25064=>1000,25065=>1000,25066=>1000,25067=>1000,25068=>1000,25069=>1000,25070=>1000,25071=>1000,25072=>1000,25073=>1000,25074=>1000,25075=>1000,25076=>1000,25077=>1000,25078=>1000,25079=>1000,25080=>1000,25081=>1000,25082=>1000,25083=>1000,25084=>1000,25085=>1000,25086=>1000,25087=>1000,25088=>1000,25089=>1000,25090=>1000,25091=>1000,25092=>1000,25093=>1000,25094=>1000,25095=>1000,25096=>1000,25097=>1000,25098=>1000,25099=>1000,25100=>1000,25101=>1000,25102=>1000,25103=>1000,25104=>1000,25105=>1000,25106=>1000,25107=>1000,25108=>1000,25109=>1000,25110=>1000,25111=>1000,25112=>1000,25113=>1000,25114=>1000,25115=>1000,25116=>1000,25117=>1000,25118=>1000,25119=>1000,25120=>1000,25121=>1000,25122=>1000,25123=>1000,25124=>1000,25125=>1000,25126=>1000,25127=>1000,25128=>1000,25129=>1000,25130=>1000,25131=>1000,25132=>1000,25133=>1000,25134=>1000,25135=>1000,25136=>1000,25137=>1000,25138=>1000,25139=>1000,25140=>1000,25141=>1000,25142=>1000,25143=>1000,25144=>1000,25145=>1000,25146=>1000,25147=>1000,25148=>1000,25149=>1000,25150=>1000,25151=>1000,25152=>1000,25153=>1000,25154=>1000,25155=>1000,25156=>1000,25157=>1000,25158=>1000,25159=>1000,25160=>1000,25161=>1000,25162=>1000,25163=>1000,25164=>1000,25165=>1000,25166=>1000,25167=>1000,25168=>1000,25169=>1000,25170=>1000,25171=>1000,25172=>1000,25173=>1000,25174=>1000,25175=>1000,25176=>1000,25177=>1000,25178=>1000,25179=>1000,25180=>1000,25181=>1000,25182=>1000,25183=>1000,25184=>1000,25185=>1000,25186=>1000,25187=>1000,25188=>1000,25189=>1000,25190=>1000,25191=>1000,25192=>1000,25193=>1000,25194=>1000,25195=>1000,25196=>1000,25197=>1000,25198=>1000,25199=>1000,25200=>1000,25201=>1000,25202=>1000,25203=>1000,25204=>1000,25205=>1000,25206=>1000,25207=>1000,25208=>1000,25209=>1000,25210=>1000,25211=>1000,25212=>1000,25213=>1000,25214=>1000,25215=>1000,25216=>1000,25217=>1000,25218=>1000,25219=>1000,25220=>1000,25221=>1000,25222=>1000,25223=>1000,25224=>1000,25225=>1000,25226=>1000,25227=>1000,25228=>1000,25229=>1000,25230=>1000,25231=>1000,25232=>1000,25233=>1000,25234=>1000,25235=>1000,25236=>1000,25237=>1000,25238=>1000,25239=>1000,25240=>1000,25241=>1000,25242=>1000,25243=>1000,25244=>1000,25245=>1000,25246=>1000,25247=>1000,25248=>1000,25249=>1000,25250=>1000,25251=>1000,25252=>1000,25253=>1000,25254=>1000,25255=>1000,25256=>1000,25257=>1000,25258=>1000,25259=>1000,25260=>1000,25261=>1000,25262=>1000,25263=>1000,25264=>1000,25265=>1000,25266=>1000,25267=>1000,25268=>1000,25269=>1000,25270=>1000,25271=>1000,25272=>1000,25273=>1000,25274=>1000,25275=>1000,25276=>1000,25277=>1000,25278=>1000,25279=>1000,25280=>1000,25281=>1000,25282=>1000,25283=>1000,25284=>1000,25285=>1000,25286=>1000,25287=>1000,25288=>1000,25289=>1000,25290=>1000,25291=>1000,25292=>1000,25293=>1000,25294=>1000,25295=>1000,25296=>1000,25297=>1000,25298=>1000,25299=>1000,25300=>1000,25301=>1000,25302=>1000,25303=>1000,25304=>1000,25305=>1000,25306=>1000,25307=>1000,25308=>1000,25309=>1000,25310=>1000,25311=>1000,25312=>1000,25313=>1000,25314=>1000,25315=>1000,25316=>1000,25317=>1000,25318=>1000,25319=>1000,25320=>1000,25321=>1000,25322=>1000,25323=>1000,25324=>1000,25325=>1000,25326=>1000,25327=>1000,25328=>1000,25329=>1000,25330=>1000,25331=>1000,25332=>1000,25333=>1000,25334=>1000,25335=>1000,25336=>1000,25337=>1000,25338=>1000,25339=>1000,25340=>1000,25341=>1000,25342=>1000,25343=>1000,25344=>1000,25345=>1000,25346=>1000,25347=>1000,25348=>1000,25349=>1000,25350=>1000,25351=>1000,25352=>1000,25353=>1000,25354=>1000,25355=>1000,25356=>1000,25357=>1000,25358=>1000,25359=>1000,25360=>1000,25361=>1000,25362=>1000,25363=>1000,25364=>1000,25365=>1000,25366=>1000,25367=>1000,25368=>1000,25369=>1000,25370=>1000,25371=>1000,25372=>1000,25373=>1000,25374=>1000,25375=>1000,25376=>1000,25377=>1000,25378=>1000,25379=>1000,25380=>1000,25381=>1000,25382=>1000,25383=>1000,25384=>1000,25385=>1000,25386=>1000,25387=>1000,25388=>1000,25389=>1000,25390=>1000,25391=>1000,25392=>1000,25393=>1000,25394=>1000,25395=>1000,25396=>1000,25397=>1000,25398=>1000,25399=>1000,25400=>1000,25401=>1000,25402=>1000,25403=>1000,25404=>1000,25405=>1000,25406=>1000,25407=>1000,25408=>1000,25409=>1000,25410=>1000,25411=>1000,25412=>1000,25413=>1000,25414=>1000,25415=>1000,25416=>1000,25417=>1000,25418=>1000,25419=>1000,25420=>1000,25421=>1000,25422=>1000,25423=>1000,25424=>1000,25425=>1000,25426=>1000,25427=>1000,25428=>1000,25429=>1000,25430=>1000,25431=>1000,25432=>1000,25433=>1000,25434=>1000,25435=>1000,25436=>1000,25437=>1000,25438=>1000,25439=>1000,25440=>1000,25441=>1000,25442=>1000,25443=>1000,25444=>1000,25445=>1000,25446=>1000,25447=>1000,25448=>1000,25449=>1000,25450=>1000,25451=>1000,25452=>1000,25453=>1000,25454=>1000,25455=>1000,25456=>1000,25457=>1000,25458=>1000,25459=>1000,25460=>1000,25461=>1000,25462=>1000,25463=>1000,25464=>1000,25465=>1000,25466=>1000,25467=>1000,25468=>1000,25469=>1000,25470=>1000,25471=>1000,25472=>1000,25473=>1000,25474=>1000,25475=>1000,25476=>1000,25477=>1000,25478=>1000,25479=>1000,25480=>1000,25481=>1000,25482=>1000,25483=>1000,25484=>1000,25485=>1000,25486=>1000,25487=>1000,25488=>1000,25489=>1000,25490=>1000,25491=>1000,25492=>1000,25493=>1000,25494=>1000,25495=>1000,25496=>1000,25497=>1000,25498=>1000,25499=>1000,25500=>1000,25501=>1000,25502=>1000,25503=>1000,25504=>1000,25505=>1000,25506=>1000,25507=>1000,25508=>1000,25509=>1000,25510=>1000,25511=>1000,25512=>1000,25513=>1000,25514=>1000,25515=>1000,25516=>1000,25517=>1000,25518=>1000,25519=>1000,25520=>1000,25521=>1000,25522=>1000,25523=>1000,25524=>1000,25525=>1000,25526=>1000,25527=>1000,25528=>1000,25529=>1000,25530=>1000,25531=>1000,25532=>1000,25533=>1000,25534=>1000,25535=>1000,25536=>1000,25537=>1000,25538=>1000,25539=>1000,25540=>1000,25541=>1000,25542=>1000,25543=>1000,25544=>1000,25545=>1000,25546=>1000,25547=>1000,25548=>1000,25549=>1000,25550=>1000,25551=>1000,25552=>1000,25553=>1000,25554=>1000,25555=>1000,25556=>1000,25557=>1000,25558=>1000,25559=>1000,25560=>1000,25561=>1000,25562=>1000,25563=>1000,25564=>1000,25565=>1000,25566=>1000,25567=>1000,25568=>1000,25569=>1000,25570=>1000,25571=>1000,25572=>1000,25573=>1000,25574=>1000,25575=>1000,25576=>1000,25577=>1000,25578=>1000,25579=>1000,25580=>1000,25581=>1000,25582=>1000,25583=>1000,25584=>1000,25585=>1000,25586=>1000,25587=>1000,25588=>1000,25589=>1000,25590=>1000,25591=>1000,25592=>1000,25593=>1000,25594=>1000,25595=>1000,25596=>1000,25597=>1000,25598=>1000,25599=>1000,25600=>1000,25601=>1000,25602=>1000,25603=>1000,25604=>1000,25605=>1000,25606=>1000,25607=>1000,25608=>1000,25609=>1000,25610=>1000,25611=>1000,25612=>1000,25613=>1000,25614=>1000,25615=>1000,25616=>1000,25617=>1000,25618=>1000,25619=>1000,25620=>1000,25621=>1000,25622=>1000,25623=>1000,25624=>1000,25625=>1000,25626=>1000,25627=>1000,25628=>1000,25629=>1000,25630=>1000,25631=>1000,25632=>1000,25633=>1000,25634=>1000,25635=>1000,25636=>1000,25637=>1000,25638=>1000,25639=>1000,25640=>1000,25641=>1000,25642=>1000,25643=>1000,25644=>1000,25645=>1000,25646=>1000,25647=>1000,25648=>1000,25649=>1000,25650=>1000,25651=>1000,25652=>1000,25653=>1000,25654=>1000,25655=>1000,25656=>1000,25657=>1000,25658=>1000,25659=>1000,25660=>1000,25661=>1000,25662=>1000,25663=>1000,25664=>1000,25665=>1000,25666=>1000,25667=>1000,25668=>1000,25669=>1000,25670=>1000,25671=>1000,25672=>1000,25673=>1000,25674=>1000,25675=>1000,25676=>1000,25677=>1000,25678=>1000,25679=>1000,25680=>1000,25681=>1000,25682=>1000,25683=>1000,25684=>1000,25685=>1000,25686=>1000,25687=>1000,25688=>1000,25689=>1000,25690=>1000,25691=>1000,25692=>1000,25693=>1000,25694=>1000,25695=>1000,25696=>1000,25697=>1000,25698=>1000,25699=>1000,25700=>1000,25701=>1000,25702=>1000,25703=>1000,25704=>1000,25705=>1000,25706=>1000,25707=>1000,25708=>1000,25709=>1000,25710=>1000,25711=>1000,25712=>1000,25713=>1000,25714=>1000,25715=>1000,25716=>1000,25717=>1000,25718=>1000,25719=>1000,25720=>1000,25721=>1000,25722=>1000,25723=>1000,25724=>1000,25725=>1000,25726=>1000,25727=>1000,25728=>1000,25729=>1000,25730=>1000,25731=>1000,25732=>1000,25733=>1000,25734=>1000,25735=>1000,25736=>1000,25737=>1000,25738=>1000,25739=>1000,25740=>1000,25741=>1000,25742=>1000,25743=>1000,25744=>1000,25745=>1000,25746=>1000,25747=>1000,25748=>1000,25749=>1000,25750=>1000,25751=>1000,25752=>1000,25753=>1000,25754=>1000,25755=>1000,25756=>1000,25757=>1000,25758=>1000,25759=>1000,25760=>1000,25761=>1000,25762=>1000,25763=>1000,25764=>1000,25765=>1000,25766=>1000,25767=>1000,25768=>1000,25769=>1000,25770=>1000,25771=>1000,25772=>1000,25773=>1000,25774=>1000,25775=>1000,25776=>1000,25777=>1000,25778=>1000,25779=>1000,25780=>1000,25781=>1000,25782=>1000,25783=>1000,25784=>1000,25785=>1000,25786=>1000,25787=>1000,25788=>1000,25789=>1000,25790=>1000,25791=>1000,25792=>1000,25793=>1000,25794=>1000,25795=>1000,25796=>1000,25797=>1000,25798=>1000,25799=>1000,25800=>1000,25801=>1000,25802=>1000,25803=>1000,25804=>1000,25805=>1000,25806=>1000,25807=>1000,25808=>1000,25809=>1000,25810=>1000,25811=>1000,25812=>1000,25813=>1000,25814=>1000,25815=>1000,25816=>1000,25817=>1000,25818=>1000,25819=>1000,25820=>1000,25821=>1000,25822=>1000,25823=>1000,25824=>1000,25825=>1000,25826=>1000,25827=>1000,25828=>1000,25829=>1000,25830=>1000,25831=>1000,25832=>1000,25833=>1000,25834=>1000,25835=>1000,25836=>1000,25837=>1000,25838=>1000,25839=>1000,25840=>1000,25841=>1000,25842=>1000,25843=>1000,25844=>1000,25845=>1000,25846=>1000,25847=>1000,25848=>1000,25849=>1000,25850=>1000,25851=>1000,25852=>1000,25853=>1000,25854=>1000,25855=>1000,25856=>1000,25857=>1000,25858=>1000,25859=>1000,25860=>1000,25861=>1000,25862=>1000,25863=>1000,25864=>1000,25865=>1000,25866=>1000,25867=>1000,25868=>1000,25869=>1000,25870=>1000,25871=>1000,25872=>1000,25873=>1000,25874=>1000,25875=>1000,25876=>1000,25877=>1000,25878=>1000,25879=>1000,25880=>1000,25881=>1000,25882=>1000,25883=>1000,25884=>1000,25885=>1000,25886=>1000,25887=>1000,25888=>1000,25889=>1000,25890=>1000,25891=>1000,25892=>1000,25893=>1000,25894=>1000,25895=>1000,25896=>1000,25897=>1000,25898=>1000,25899=>1000,25900=>1000,25901=>1000,25902=>1000,25903=>1000,25904=>1000,25905=>1000,25906=>1000,25907=>1000,25908=>1000,25909=>1000,25910=>1000,25911=>1000,25912=>1000,25913=>1000,25914=>1000,25915=>1000,25916=>1000,25917=>1000,25918=>1000,25919=>1000,25920=>1000,25921=>1000,25922=>1000,25923=>1000,25924=>1000,25925=>1000,25926=>1000,25927=>1000,25928=>1000,25929=>1000,25930=>1000,25931=>1000,25932=>1000,25933=>1000,25934=>1000,25935=>1000,25936=>1000,25937=>1000,25938=>1000,25939=>1000,25940=>1000,25941=>1000,25942=>1000,25943=>1000,25944=>1000,25945=>1000,25946=>1000,25947=>1000,25948=>1000,25949=>1000,25950=>1000,25951=>1000,25952=>1000,25953=>1000,25954=>1000,25955=>1000,25956=>1000,25957=>1000,25958=>1000,25959=>1000,25960=>1000,25961=>1000,25962=>1000,25963=>1000,25964=>1000,25965=>1000,25966=>1000,25967=>1000,25968=>1000,25969=>1000,25970=>1000,25971=>1000,25972=>1000,25973=>1000,25974=>1000,25975=>1000,25976=>1000,25977=>1000,25978=>1000,25979=>1000,25980=>1000,25981=>1000,25982=>1000,25983=>1000,25984=>1000,25985=>1000,25986=>1000,25987=>1000,25988=>1000,25989=>1000,25990=>1000,25991=>1000,25992=>1000,25993=>1000,25994=>1000,25995=>1000,25996=>1000,25997=>1000,25998=>1000,25999=>1000,26000=>1000,26001=>1000,26002=>1000,26003=>1000,26004=>1000,26005=>1000,26006=>1000,26007=>1000,26008=>1000,26009=>1000,26010=>1000,26011=>1000,26012=>1000,26013=>1000,26014=>1000,26015=>1000,26016=>1000,26017=>1000,26018=>1000,26019=>1000,26020=>1000,26021=>1000,26022=>1000,26023=>1000,26024=>1000,26025=>1000,26026=>1000,26027=>1000,26028=>1000,26029=>1000,26030=>1000,26031=>1000,26032=>1000,26033=>1000,26034=>1000,26035=>1000,26036=>1000,26037=>1000,26038=>1000,26039=>1000,26040=>1000,26041=>1000,26042=>1000,26043=>1000,26044=>1000,26045=>1000,26046=>1000,26047=>1000,26048=>1000,26049=>1000,26050=>1000,26051=>1000,26052=>1000,26053=>1000,26054=>1000,26055=>1000,26056=>1000,26057=>1000,26058=>1000,26059=>1000,26060=>1000,26061=>1000,26062=>1000,26063=>1000,26064=>1000,26065=>1000,26066=>1000,26067=>1000,26068=>1000,26069=>1000,26070=>1000,26071=>1000,26072=>1000,26073=>1000,26074=>1000,26075=>1000,26076=>1000,26077=>1000,26078=>1000,26079=>1000,26080=>1000,26081=>1000,26082=>1000,26083=>1000,26084=>1000,26085=>1000,26086=>1000,26087=>1000,26088=>1000,26089=>1000,26090=>1000,26091=>1000,26092=>1000,26093=>1000,26094=>1000,26095=>1000,26096=>1000,26097=>1000,26098=>1000,26099=>1000,26100=>1000,26101=>1000,26102=>1000,26103=>1000,26104=>1000,26105=>1000,26106=>1000,26107=>1000,26108=>1000,26109=>1000,26110=>1000,26111=>1000,26112=>1000,26113=>1000,26114=>1000,26115=>1000,26116=>1000,26117=>1000,26118=>1000,26119=>1000,26120=>1000,26121=>1000,26122=>1000,26123=>1000,26124=>1000,26125=>1000,26126=>1000,26127=>1000,26128=>1000,26129=>1000,26130=>1000,26131=>1000,26132=>1000,26133=>1000,26134=>1000,26135=>1000,26136=>1000,26137=>1000,26138=>1000,26139=>1000,26140=>1000,26141=>1000,26142=>1000,26143=>1000,26144=>1000,26145=>1000,26146=>1000,26147=>1000,26148=>1000,26149=>1000,26150=>1000,26151=>1000,26152=>1000,26153=>1000,26154=>1000,26155=>1000,26156=>1000,26157=>1000,26158=>1000,26159=>1000,26160=>1000,26161=>1000,26162=>1000,26163=>1000,26164=>1000,26165=>1000,26166=>1000,26167=>1000,26168=>1000,26169=>1000,26170=>1000,26171=>1000,26172=>1000,26173=>1000,26174=>1000,26175=>1000,26176=>1000,26177=>1000,26178=>1000,26179=>1000,26180=>1000,26181=>1000,26182=>1000,26183=>1000,26184=>1000,26185=>1000,26186=>1000,26187=>1000,26188=>1000,26189=>1000,26190=>1000,26191=>1000,26192=>1000,26193=>1000,26194=>1000,26195=>1000,26196=>1000,26197=>1000,26198=>1000,26199=>1000,26200=>1000,26201=>1000,26202=>1000,26203=>1000,26204=>1000,26205=>1000,26206=>1000,26207=>1000,26208=>1000,26209=>1000,26210=>1000,26211=>1000,26212=>1000,26213=>1000,26214=>1000,26215=>1000,26216=>1000,26217=>1000,26218=>1000,26219=>1000,26220=>1000,26221=>1000,26222=>1000,26223=>1000,26224=>1000,26225=>1000,26226=>1000,26227=>1000,26228=>1000,26229=>1000,26230=>1000,26231=>1000,26232=>1000,26233=>1000,26234=>1000,26235=>1000,26236=>1000,26237=>1000,26238=>1000,26239=>1000,26240=>1000,26241=>1000,26242=>1000,26243=>1000,26244=>1000,26245=>1000,26246=>1000,26247=>1000,26248=>1000,26249=>1000,26250=>1000,26251=>1000,26252=>1000,26253=>1000,26254=>1000,26255=>1000,26256=>1000,26257=>1000,26258=>1000,26259=>1000,26260=>1000,26261=>1000,26262=>1000,26263=>1000,26264=>1000,26265=>1000,26266=>1000,26267=>1000,26268=>1000,26269=>1000,26270=>1000,26271=>1000,26272=>1000,26273=>1000,26274=>1000,26275=>1000,26276=>1000,26277=>1000,26278=>1000,26279=>1000,26280=>1000,26281=>1000,26282=>1000,26283=>1000,26284=>1000,26285=>1000,26286=>1000,26287=>1000,26288=>1000,26289=>1000,26290=>1000,26291=>1000,26292=>1000,26293=>1000,26294=>1000,26295=>1000,26296=>1000,26297=>1000,26298=>1000,26299=>1000,26300=>1000,26301=>1000,26302=>1000,26303=>1000,26304=>1000,26305=>1000,26306=>1000,26307=>1000,26308=>1000,26309=>1000,26310=>1000,26311=>1000,26312=>1000,26313=>1000,26314=>1000,26315=>1000,26316=>1000,26317=>1000,26318=>1000,26319=>1000,26320=>1000,26321=>1000,26322=>1000,26323=>1000,26324=>1000,26325=>1000,26326=>1000,26327=>1000,26328=>1000,26329=>1000,26330=>1000,26331=>1000,26332=>1000,26333=>1000,26334=>1000,26335=>1000,26336=>1000,26337=>1000,26338=>1000,26339=>1000,26340=>1000,26341=>1000,26342=>1000,26343=>1000,26344=>1000,26345=>1000,26346=>1000,26347=>1000,26348=>1000,26349=>1000,26350=>1000,26351=>1000,26352=>1000,26353=>1000,26354=>1000,26355=>1000,26356=>1000,26357=>1000,26358=>1000,26359=>1000,26360=>1000,26361=>1000,26362=>1000,26363=>1000,26364=>1000,26365=>1000,26366=>1000,26367=>1000,26368=>1000,26369=>1000,26370=>1000,26371=>1000,26372=>1000,26373=>1000,26374=>1000,26375=>1000,26376=>1000,26377=>1000,26378=>1000,26379=>1000,26380=>1000,26381=>1000,26382=>1000,26383=>1000,26384=>1000,26385=>1000,26386=>1000,26387=>1000,26388=>1000,26389=>1000,26390=>1000,26391=>1000,26392=>1000,26393=>1000,26394=>1000,26395=>1000,26396=>1000,26397=>1000,26398=>1000,26399=>1000,26400=>1000,26401=>1000,26402=>1000,26403=>1000,26404=>1000,26405=>1000,26406=>1000,26407=>1000,26408=>1000,26409=>1000,26410=>1000,26411=>1000,26412=>1000,26413=>1000,26414=>1000,26415=>1000,26416=>1000,26417=>1000,26418=>1000,26419=>1000,26420=>1000,26421=>1000,26422=>1000,26423=>1000,26424=>1000,26425=>1000,26426=>1000,26427=>1000,26428=>1000,26429=>1000,26430=>1000,26431=>1000,26432=>1000,26433=>1000,26434=>1000,26435=>1000,26436=>1000,26437=>1000,26438=>1000,26439=>1000,26440=>1000,26441=>1000,26442=>1000,26443=>1000,26444=>1000,26445=>1000,26446=>1000,26447=>1000,26448=>1000,26449=>1000,26450=>1000,26451=>1000,26452=>1000,26453=>1000,26454=>1000,26455=>1000,26456=>1000,26457=>1000,26458=>1000,26459=>1000,26460=>1000,26461=>1000,26462=>1000,26463=>1000,26464=>1000,26465=>1000,26466=>1000,26467=>1000,26468=>1000,26469=>1000,26470=>1000,26471=>1000,26472=>1000,26473=>1000,26474=>1000,26475=>1000,26476=>1000,26477=>1000,26478=>1000,26479=>1000,26480=>1000,26481=>1000,26482=>1000,26483=>1000,26484=>1000,26485=>1000,26486=>1000,26487=>1000,26488=>1000,26489=>1000,26490=>1000,26491=>1000,26492=>1000,26493=>1000,26494=>1000,26495=>1000,26496=>1000,26497=>1000,26498=>1000,26499=>1000,26500=>1000,26501=>1000,26502=>1000,26503=>1000,26504=>1000,26505=>1000,26506=>1000,26507=>1000,26508=>1000,26509=>1000,26510=>1000,26511=>1000,26512=>1000,26513=>1000,26514=>1000,26515=>1000,26516=>1000,26517=>1000,26518=>1000,26519=>1000,26520=>1000,26521=>1000,26522=>1000,26523=>1000,26524=>1000,26525=>1000,26526=>1000,26527=>1000,26528=>1000,26529=>1000,26530=>1000,26531=>1000,26532=>1000,26533=>1000,26534=>1000,26535=>1000,26536=>1000,26537=>1000,26538=>1000,26539=>1000,26540=>1000,26541=>1000,26542=>1000,26543=>1000,26544=>1000,26545=>1000,26546=>1000,26547=>1000,26548=>1000,26549=>1000,26550=>1000,26551=>1000,26552=>1000,26553=>1000,26554=>1000,26555=>1000,26556=>1000,26557=>1000,26558=>1000,26559=>1000,26560=>1000,26561=>1000,26562=>1000,26563=>1000,26564=>1000,26565=>1000,26566=>1000,26567=>1000,26568=>1000,26569=>1000,26570=>1000,26571=>1000,26572=>1000,26573=>1000,26574=>1000,26575=>1000,26576=>1000,26577=>1000,26578=>1000,26579=>1000,26580=>1000,26581=>1000,26582=>1000,26583=>1000,26584=>1000,26585=>1000,26586=>1000,26587=>1000,26588=>1000,26589=>1000,26590=>1000,26591=>1000,26592=>1000,26593=>1000,26594=>1000,26595=>1000,26596=>1000,26597=>1000,26598=>1000,26599=>1000,26600=>1000,26601=>1000,26602=>1000,26603=>1000,26604=>1000,26605=>1000,26606=>1000,26607=>1000,26608=>1000,26609=>1000,26610=>1000,26611=>1000,26612=>1000,26613=>1000,26614=>1000,26615=>1000,26616=>1000,26617=>1000,26618=>1000,26619=>1000,26620=>1000,26621=>1000,26622=>1000,26623=>1000,26624=>1000,26625=>1000,26626=>1000,26627=>1000,26628=>1000,26629=>1000,26630=>1000,26631=>1000,26632=>1000,26633=>1000,26634=>1000,26635=>1000,26636=>1000,26637=>1000,26638=>1000,26639=>1000,26640=>1000,26641=>1000,26642=>1000,26643=>1000,26644=>1000,26645=>1000,26646=>1000,26647=>1000,26648=>1000,26649=>1000,26650=>1000,26651=>1000,26652=>1000,26653=>1000,26654=>1000,26655=>1000,26656=>1000,26657=>1000,26658=>1000,26659=>1000,26660=>1000,26661=>1000,26662=>1000,26663=>1000,26664=>1000,26665=>1000,26666=>1000,26667=>1000,26668=>1000,26669=>1000,26670=>1000,26671=>1000,26672=>1000,26673=>1000,26674=>1000,26675=>1000,26676=>1000,26677=>1000,26678=>1000,26679=>1000,26680=>1000,26681=>1000,26682=>1000,26683=>1000,26684=>1000,26685=>1000,26686=>1000,26687=>1000,26688=>1000,26689=>1000,26690=>1000,26691=>1000,26692=>1000,26693=>1000,26694=>1000,26695=>1000,26696=>1000,26697=>1000,26698=>1000,26699=>1000,26700=>1000,26701=>1000,26702=>1000,26703=>1000,26704=>1000,26705=>1000,26706=>1000,26707=>1000,26708=>1000,26709=>1000,26710=>1000,26711=>1000,26712=>1000,26713=>1000,26714=>1000,26715=>1000,26716=>1000,26717=>1000,26718=>1000,26719=>1000,26720=>1000,26721=>1000,26722=>1000,26723=>1000,26724=>1000,26725=>1000,26726=>1000,26727=>1000,26728=>1000,26729=>1000,26730=>1000,26731=>1000,26732=>1000,26733=>1000,26734=>1000,26735=>1000,26736=>1000,26737=>1000,26738=>1000,26739=>1000,26740=>1000,26741=>1000,26742=>1000,26743=>1000,26744=>1000,26745=>1000,26746=>1000,26747=>1000,26748=>1000,26749=>1000,26750=>1000,26751=>1000,26752=>1000,26753=>1000,26754=>1000,26755=>1000,26756=>1000,26757=>1000,26758=>1000,26759=>1000,26760=>1000,26761=>1000,26762=>1000,26763=>1000,26764=>1000,26765=>1000,26766=>1000,26767=>1000,26768=>1000,26769=>1000,26770=>1000,26771=>1000,26772=>1000,26773=>1000,26774=>1000,26775=>1000,26776=>1000,26777=>1000,26778=>1000,26779=>1000,26780=>1000,26781=>1000,26782=>1000,26783=>1000,26784=>1000,26785=>1000,26786=>1000,26787=>1000,26788=>1000,26789=>1000,26790=>1000,26791=>1000,26792=>1000,26793=>1000,26794=>1000,26795=>1000,26796=>1000,26797=>1000,26798=>1000,26799=>1000,26800=>1000,26801=>1000,26802=>1000,26803=>1000,26804=>1000,26805=>1000,26806=>1000,26807=>1000,26808=>1000,26809=>1000,26810=>1000,26811=>1000,26812=>1000,26813=>1000,26814=>1000,26815=>1000,26816=>1000,26817=>1000,26818=>1000,26819=>1000,26820=>1000,26821=>1000,26822=>1000,26823=>1000,26824=>1000,26825=>1000,26826=>1000,26827=>1000,26828=>1000,26829=>1000,26830=>1000,26831=>1000,26832=>1000,26833=>1000,26834=>1000,26835=>1000,26836=>1000,26837=>1000,26838=>1000,26839=>1000,26840=>1000,26841=>1000,26842=>1000,26843=>1000,26844=>1000,26845=>1000,26846=>1000,26847=>1000,26848=>1000,26849=>1000,26850=>1000,26851=>1000,26852=>1000,26853=>1000,26854=>1000,26855=>1000,26856=>1000,26857=>1000,26858=>1000,26859=>1000,26860=>1000,26861=>1000,26862=>1000,26863=>1000,26864=>1000,26865=>1000,26866=>1000,26867=>1000,26868=>1000,26869=>1000,26870=>1000,26871=>1000,26872=>1000,26873=>1000,26874=>1000,26875=>1000,26876=>1000,26877=>1000,26878=>1000,26879=>1000,26880=>1000,26881=>1000,26882=>1000,26883=>1000,26884=>1000,26885=>1000,26886=>1000,26887=>1000,26888=>1000,26889=>1000,26890=>1000,26891=>1000,26892=>1000,26893=>1000,26894=>1000,26895=>1000,26896=>1000,26897=>1000,26898=>1000,26899=>1000,26900=>1000,26901=>1000,26902=>1000,26903=>1000,26904=>1000,26905=>1000,26906=>1000,26907=>1000,26908=>1000,26909=>1000,26910=>1000,26911=>1000,26912=>1000,26913=>1000,26914=>1000,26915=>1000,26916=>1000,26917=>1000,26918=>1000,26919=>1000,26920=>1000,26921=>1000,26922=>1000,26923=>1000,26924=>1000,26925=>1000,26926=>1000,26927=>1000,26928=>1000,26929=>1000,26930=>1000,26931=>1000,26932=>1000,26933=>1000,26934=>1000,26935=>1000,26936=>1000,26937=>1000,26938=>1000,26939=>1000,26940=>1000,26941=>1000,26942=>1000,26943=>1000,26944=>1000,26945=>1000,26946=>1000,26947=>1000,26948=>1000,26949=>1000,26950=>1000,26951=>1000,26952=>1000,26953=>1000,26954=>1000,26955=>1000,26956=>1000,26957=>1000,26958=>1000,26959=>1000,26960=>1000,26961=>1000,26962=>1000,26963=>1000,26964=>1000,26965=>1000,26966=>1000,26967=>1000,26968=>1000,26969=>1000,26970=>1000,26971=>1000,26972=>1000,26973=>1000,26974=>1000,26975=>1000,26976=>1000,26977=>1000,26978=>1000,26979=>1000,26980=>1000,26981=>1000,26982=>1000,26983=>1000,26984=>1000,26985=>1000,26986=>1000,26987=>1000,26988=>1000,26989=>1000,26990=>1000,26991=>1000,26992=>1000,26993=>1000,26994=>1000,26995=>1000,26996=>1000,26997=>1000,26998=>1000,26999=>1000,27000=>1000,27001=>1000,27002=>1000,27003=>1000,27004=>1000,27005=>1000,27006=>1000,27007=>1000,27008=>1000,27009=>1000,27010=>1000,27011=>1000,27012=>1000,27013=>1000,27014=>1000,27015=>1000,27016=>1000,27017=>1000,27018=>1000,27019=>1000,27020=>1000,27021=>1000,27022=>1000,27023=>1000,27024=>1000,27025=>1000,27026=>1000,27027=>1000,27028=>1000,27029=>1000,27030=>1000,27031=>1000,27032=>1000,27033=>1000,27034=>1000,27035=>1000,27036=>1000,27037=>1000,27038=>1000,27039=>1000,27040=>1000,27041=>1000,27042=>1000,27043=>1000,27044=>1000,27045=>1000,27046=>1000,27047=>1000,27048=>1000,27049=>1000,27050=>1000,27051=>1000,27052=>1000,27053=>1000,27054=>1000,27055=>1000,27056=>1000,27057=>1000,27058=>1000,27059=>1000,27060=>1000,27061=>1000,27062=>1000,27063=>1000,27064=>1000,27065=>1000,27066=>1000,27067=>1000,27068=>1000,27069=>1000,27070=>1000,27071=>1000,27072=>1000,27073=>1000,27074=>1000,27075=>1000,27076=>1000,27077=>1000,27078=>1000,27079=>1000,27080=>1000,27081=>1000,27082=>1000,27083=>1000,27084=>1000,27085=>1000,27086=>1000,27087=>1000,27088=>1000,27089=>1000,27090=>1000,27091=>1000,27092=>1000,27093=>1000,27094=>1000,27095=>1000,27096=>1000,27097=>1000,27098=>1000,27099=>1000,27100=>1000,27101=>1000,27102=>1000,27103=>1000,27104=>1000,27105=>1000,27106=>1000,27107=>1000,27108=>1000,27109=>1000,27110=>1000,27111=>1000,27112=>1000,27113=>1000,27114=>1000,27115=>1000,27116=>1000,27117=>1000,27118=>1000,27119=>1000,27120=>1000,27121=>1000,27122=>1000,27123=>1000,27124=>1000,27125=>1000,27126=>1000,27127=>1000,27128=>1000,27129=>1000,27130=>1000,27131=>1000,27132=>1000,27133=>1000,27134=>1000,27135=>1000,27136=>1000,27137=>1000,27138=>1000,27139=>1000,27140=>1000,27141=>1000,27142=>1000,27143=>1000,27144=>1000,27145=>1000,27146=>1000,27147=>1000,27148=>1000,27149=>1000,27150=>1000,27151=>1000,27152=>1000,27153=>1000,27154=>1000,27155=>1000,27156=>1000,27157=>1000,27158=>1000,27159=>1000,27160=>1000,27161=>1000,27162=>1000,27163=>1000,27164=>1000,27165=>1000,27166=>1000,27167=>1000,27168=>1000,27169=>1000,27170=>1000,27171=>1000,27172=>1000,27173=>1000,27174=>1000,27175=>1000,27176=>1000,27177=>1000,27178=>1000,27179=>1000,27180=>1000,27181=>1000,27182=>1000,27183=>1000,27184=>1000,27185=>1000,27186=>1000,27187=>1000,27188=>1000,27189=>1000,27190=>1000,27191=>1000,27192=>1000,27193=>1000,27194=>1000,27195=>1000,27196=>1000,27197=>1000,27198=>1000,27199=>1000,27200=>1000,27201=>1000,27202=>1000,27203=>1000,27204=>1000,27205=>1000,27206=>1000,27207=>1000,27208=>1000,27209=>1000,27210=>1000,27211=>1000,27212=>1000,27213=>1000,27214=>1000,27215=>1000,27216=>1000,27217=>1000,27218=>1000,27219=>1000,27220=>1000,27221=>1000,27222=>1000,27223=>1000,27224=>1000,27225=>1000,27226=>1000,27227=>1000,27228=>1000,27229=>1000,27230=>1000,27231=>1000,27232=>1000,27233=>1000,27234=>1000,27235=>1000,27236=>1000,27237=>1000,27238=>1000,27239=>1000,27240=>1000,27241=>1000,27242=>1000,27243=>1000,27244=>1000,27245=>1000,27246=>1000,27247=>1000,27248=>1000,27249=>1000,27250=>1000,27251=>1000,27252=>1000,27253=>1000,27254=>1000,27255=>1000,27256=>1000,27257=>1000,27258=>1000,27259=>1000,27260=>1000,27261=>1000,27262=>1000,27263=>1000,27264=>1000,27265=>1000,27266=>1000,27267=>1000,27268=>1000,27269=>1000,27270=>1000,27271=>1000,27272=>1000,27273=>1000,27274=>1000,27275=>1000,27276=>1000,27277=>1000,27278=>1000,27279=>1000,27280=>1000,27281=>1000,27282=>1000,27283=>1000,27284=>1000,27285=>1000,27286=>1000,27287=>1000,27288=>1000,27289=>1000,27290=>1000,27291=>1000,27292=>1000,27293=>1000,27294=>1000,27295=>1000,27296=>1000,27297=>1000,27298=>1000,27299=>1000,27300=>1000,27301=>1000,27302=>1000,27303=>1000,27304=>1000,27305=>1000,27306=>1000,27307=>1000,27308=>1000,27309=>1000,27310=>1000,27311=>1000,27312=>1000,27313=>1000,27314=>1000,27315=>1000,27316=>1000,27317=>1000,27318=>1000,27319=>1000,27320=>1000,27321=>1000,27322=>1000,27323=>1000,27324=>1000,27325=>1000,27326=>1000,27327=>1000,27328=>1000,27329=>1000,27330=>1000,27331=>1000,27332=>1000,27333=>1000,27334=>1000,27335=>1000,27336=>1000,27337=>1000,27338=>1000,27339=>1000,27340=>1000,27341=>1000,27342=>1000,27343=>1000,27344=>1000,27345=>1000,27346=>1000,27347=>1000,27348=>1000,27349=>1000,27350=>1000,27351=>1000,27352=>1000,27353=>1000,27354=>1000,27355=>1000,27356=>1000,27357=>1000,27358=>1000,27359=>1000,27360=>1000,27361=>1000,27362=>1000,27363=>1000,27364=>1000,27365=>1000,27366=>1000,27367=>1000,27368=>1000,27369=>1000,27370=>1000,27371=>1000,27372=>1000,27373=>1000,27374=>1000,27375=>1000,27376=>1000,27377=>1000,27378=>1000,27379=>1000,27380=>1000,27381=>1000,27382=>1000,27383=>1000,27384=>1000,27385=>1000,27386=>1000,27387=>1000,27388=>1000,27389=>1000,27390=>1000,27391=>1000,27392=>1000,27393=>1000,27394=>1000,27395=>1000,27396=>1000,27397=>1000,27398=>1000,27399=>1000,27400=>1000,27401=>1000,27402=>1000,27403=>1000,27404=>1000,27405=>1000,27406=>1000,27407=>1000,27408=>1000,27409=>1000,27410=>1000,27411=>1000,27412=>1000,27413=>1000,27414=>1000,27415=>1000,27416=>1000,27417=>1000,27418=>1000,27419=>1000,27420=>1000,27421=>1000,27422=>1000,27423=>1000,27424=>1000,27425=>1000,27426=>1000,27427=>1000,27428=>1000,27429=>1000,27430=>1000,27431=>1000,27432=>1000,27433=>1000,27434=>1000,27435=>1000,27436=>1000,27437=>1000,27438=>1000,27439=>1000,27440=>1000,27441=>1000,27442=>1000,27443=>1000,27444=>1000,27445=>1000,27446=>1000,27447=>1000,27448=>1000,27449=>1000,27450=>1000,27451=>1000,27452=>1000,27453=>1000,27454=>1000,27455=>1000,27456=>1000,27457=>1000,27458=>1000,27459=>1000,27460=>1000,27461=>1000,27462=>1000,27463=>1000,27464=>1000,27465=>1000,27466=>1000,27467=>1000,27468=>1000,27469=>1000,27470=>1000,27471=>1000,27472=>1000,27473=>1000,27474=>1000,27475=>1000,27476=>1000,27477=>1000,27478=>1000,27479=>1000,27480=>1000,27481=>1000,27482=>1000,27483=>1000,27484=>1000,27485=>1000,27486=>1000,27487=>1000,27488=>1000,27489=>1000,27490=>1000,27491=>1000,27492=>1000,27493=>1000,27494=>1000,27495=>1000,27496=>1000,27497=>1000,27498=>1000,27499=>1000,27500=>1000,27501=>1000,27502=>1000,27503=>1000,27504=>1000,27505=>1000,27506=>1000,27507=>1000,27508=>1000,27509=>1000,27510=>1000,27511=>1000,27512=>1000,27513=>1000,27514=>1000,27515=>1000,27516=>1000,27517=>1000,27518=>1000,27519=>1000,27520=>1000,27521=>1000,27522=>1000,27523=>1000,27524=>1000,27525=>1000,27526=>1000,27527=>1000,27528=>1000,27529=>1000,27530=>1000,27531=>1000,27532=>1000,27533=>1000,27534=>1000,27535=>1000,27536=>1000,27537=>1000,27538=>1000,27539=>1000,27540=>1000,27541=>1000,27542=>1000,27543=>1000,27544=>1000,27545=>1000,27546=>1000,27547=>1000,27548=>1000,27549=>1000,27550=>1000,27551=>1000,27552=>1000,27553=>1000,27554=>1000,27555=>1000,27556=>1000,27557=>1000,27558=>1000,27559=>1000,27560=>1000,27561=>1000,27562=>1000,27563=>1000,27564=>1000,27565=>1000,27566=>1000,27567=>1000,27568=>1000,27569=>1000,27570=>1000,27571=>1000,27572=>1000,27573=>1000,27574=>1000,27575=>1000,27576=>1000,27577=>1000,27578=>1000,27579=>1000,27580=>1000,27581=>1000,27582=>1000,27583=>1000,27584=>1000,27585=>1000,27586=>1000,27587=>1000,27588=>1000,27589=>1000,27590=>1000,27591=>1000,27592=>1000,27593=>1000,27594=>1000,27595=>1000,27596=>1000,27597=>1000,27598=>1000,27599=>1000,27600=>1000,27601=>1000,27602=>1000,27603=>1000,27604=>1000,27605=>1000,27606=>1000,27607=>1000,27608=>1000,27609=>1000,27610=>1000,27611=>1000,27612=>1000,27613=>1000,27614=>1000,27615=>1000,27616=>1000,27617=>1000,27618=>1000,27619=>1000,27620=>1000,27621=>1000,27622=>1000,27623=>1000,27624=>1000,27625=>1000,27626=>1000,27627=>1000,27628=>1000,27629=>1000,27630=>1000,27631=>1000,27632=>1000,27633=>1000,27634=>1000,27635=>1000,27636=>1000,27637=>1000,27638=>1000,27639=>1000,27640=>1000,27641=>1000,27642=>1000,27643=>1000,27644=>1000,27645=>1000,27646=>1000,27647=>1000,27648=>1000,27649=>1000,27650=>1000,27651=>1000,27652=>1000,27653=>1000,27654=>1000,27655=>1000,27656=>1000,27657=>1000,27658=>1000,27659=>1000,27660=>1000,27661=>1000,27662=>1000,27663=>1000,27664=>1000,27665=>1000,27666=>1000,27667=>1000,27668=>1000,27669=>1000,27670=>1000,27671=>1000,27672=>1000,27673=>1000,27674=>1000,27675=>1000,27676=>1000,27677=>1000,27678=>1000,27679=>1000,27680=>1000,27681=>1000,27682=>1000,27683=>1000,27684=>1000,27685=>1000,27686=>1000,27687=>1000,27688=>1000,27689=>1000,27690=>1000,27691=>1000,27692=>1000,27693=>1000,27694=>1000,27695=>1000,27696=>1000,27697=>1000,27698=>1000,27699=>1000,27700=>1000,27701=>1000,27702=>1000,27703=>1000,27704=>1000,27705=>1000,27706=>1000,27707=>1000,27708=>1000,27709=>1000,27710=>1000,27711=>1000,27712=>1000,27713=>1000,27714=>1000,27715=>1000,27716=>1000,27717=>1000,27718=>1000,27719=>1000,27720=>1000,27721=>1000,27722=>1000,27723=>1000,27724=>1000,27725=>1000,27726=>1000,27727=>1000,27728=>1000,27729=>1000,27730=>1000,27731=>1000,27732=>1000,27733=>1000,27734=>1000,27735=>1000,27736=>1000,27737=>1000,27738=>1000,27739=>1000,27740=>1000,27741=>1000,27742=>1000,27743=>1000,27744=>1000,27745=>1000,27746=>1000,27747=>1000,27748=>1000,27749=>1000,27750=>1000,27751=>1000,27752=>1000,27753=>1000,27754=>1000,27755=>1000,27756=>1000,27757=>1000,27758=>1000,27759=>1000,27760=>1000,27761=>1000,27762=>1000,27763=>1000,27764=>1000,27765=>1000,27766=>1000,27767=>1000,27768=>1000,27769=>1000,27770=>1000,27771=>1000,27772=>1000,27773=>1000,27774=>1000,27775=>1000,27776=>1000,27777=>1000,27778=>1000,27779=>1000,27780=>1000,27781=>1000,27782=>1000,27783=>1000,27784=>1000,27785=>1000,27786=>1000,27787=>1000,27788=>1000,27789=>1000,27790=>1000,27791=>1000,27792=>1000,27793=>1000,27794=>1000,27795=>1000,27796=>1000,27797=>1000,27798=>1000,27799=>1000,27800=>1000,27801=>1000,27802=>1000,27803=>1000,27804=>1000,27805=>1000,27806=>1000,27807=>1000,27808=>1000,27809=>1000,27810=>1000,27811=>1000,27812=>1000,27813=>1000,27814=>1000,27815=>1000,27816=>1000,27817=>1000,27818=>1000,27819=>1000,27820=>1000,27821=>1000,27822=>1000,27823=>1000,27824=>1000,27825=>1000,27826=>1000,27827=>1000,27828=>1000,27829=>1000,27830=>1000,27831=>1000,27832=>1000,27833=>1000,27834=>1000,27835=>1000,27836=>1000,27837=>1000,27838=>1000,27839=>1000,27840=>1000,27841=>1000,27842=>1000,27843=>1000,27844=>1000,27845=>1000,27846=>1000,27847=>1000,27848=>1000,27849=>1000,27850=>1000,27851=>1000,27852=>1000,27853=>1000,27854=>1000,27855=>1000,27856=>1000,27857=>1000,27858=>1000,27859=>1000,27860=>1000,27861=>1000,27862=>1000,27863=>1000,27864=>1000,27865=>1000,27866=>1000,27867=>1000,27868=>1000,27869=>1000,27870=>1000,27871=>1000,27872=>1000,27873=>1000,27874=>1000,27875=>1000,27876=>1000,27877=>1000,27878=>1000,27879=>1000,27880=>1000,27881=>1000,27882=>1000,27883=>1000,27884=>1000,27885=>1000,27886=>1000,27887=>1000,27888=>1000,27889=>1000,27890=>1000,27891=>1000,27892=>1000,27893=>1000,27894=>1000,27895=>1000,27896=>1000,27897=>1000,27898=>1000,27899=>1000,27900=>1000,27901=>1000,27902=>1000,27903=>1000,27904=>1000,27905=>1000,27906=>1000,27907=>1000,27908=>1000,27909=>1000,27910=>1000,27911=>1000,27912=>1000,27913=>1000,27914=>1000,27915=>1000,27916=>1000,27917=>1000,27918=>1000,27919=>1000,27920=>1000,27921=>1000,27922=>1000,27923=>1000,27924=>1000,27925=>1000,27926=>1000,27927=>1000,27928=>1000,27929=>1000,27930=>1000,27931=>1000,27932=>1000,27933=>1000,27934=>1000,27935=>1000,27936=>1000,27937=>1000,27938=>1000,27939=>1000,27940=>1000,27941=>1000,27942=>1000,27943=>1000,27944=>1000,27945=>1000,27946=>1000,27947=>1000,27948=>1000,27949=>1000,27950=>1000,27951=>1000,27952=>1000,27953=>1000,27954=>1000,27955=>1000,27956=>1000,27957=>1000,27958=>1000,27959=>1000,27960=>1000,27961=>1000,27962=>1000,27963=>1000,27964=>1000,27965=>1000,27966=>1000,27967=>1000,27968=>1000,27969=>1000,27970=>1000,27971=>1000,27972=>1000,27973=>1000,27974=>1000,27975=>1000,27976=>1000,27977=>1000,27978=>1000,27979=>1000,27980=>1000,27981=>1000,27982=>1000,27983=>1000,27984=>1000,27985=>1000,27986=>1000,27987=>1000,27988=>1000,27989=>1000,27990=>1000,27991=>1000,27992=>1000,27993=>1000,27994=>1000,27995=>1000,27996=>1000,27997=>1000,27998=>1000,27999=>1000,28000=>1000,28001=>1000,28002=>1000,28003=>1000,28004=>1000,28005=>1000,28006=>1000,28007=>1000,28008=>1000,28009=>1000,28010=>1000,28011=>1000,28012=>1000,28013=>1000,28014=>1000,28015=>1000,28016=>1000,28017=>1000,28018=>1000,28019=>1000,28020=>1000,28021=>1000,28022=>1000,28023=>1000,28024=>1000,28025=>1000,28026=>1000,28027=>1000,28028=>1000,28029=>1000,28030=>1000,28031=>1000,28032=>1000,28033=>1000,28034=>1000,28035=>1000,28036=>1000,28037=>1000,28038=>1000,28039=>1000,28040=>1000,28041=>1000,28042=>1000,28043=>1000,28044=>1000,28045=>1000,28046=>1000,28047=>1000,28048=>1000,28049=>1000,28050=>1000,28051=>1000,28052=>1000,28053=>1000,28054=>1000,28055=>1000,28056=>1000,28057=>1000,28058=>1000,28059=>1000,28060=>1000,28061=>1000,28062=>1000,28063=>1000,28064=>1000,28065=>1000,28066=>1000,28067=>1000,28068=>1000,28069=>1000,28070=>1000,28071=>1000,28072=>1000,28073=>1000,28074=>1000,28075=>1000,28076=>1000,28077=>1000,28078=>1000,28079=>1000,28080=>1000,28081=>1000,28082=>1000,28083=>1000,28084=>1000,28085=>1000,28086=>1000,28087=>1000,28088=>1000,28089=>1000,28090=>1000,28091=>1000,28092=>1000,28093=>1000,28094=>1000,28095=>1000,28096=>1000,28097=>1000,28098=>1000,28099=>1000,28100=>1000,28101=>1000,28102=>1000,28103=>1000,28104=>1000,28105=>1000,28106=>1000,28107=>1000,28108=>1000,28109=>1000,28110=>1000,28111=>1000,28112=>1000,28113=>1000,28114=>1000,28115=>1000,28116=>1000,28117=>1000,28118=>1000,28119=>1000,28120=>1000,28121=>1000,28122=>1000,28123=>1000,28124=>1000,28125=>1000,28126=>1000,28127=>1000,28128=>1000,28129=>1000,28130=>1000,28131=>1000,28132=>1000,28133=>1000,28134=>1000,28135=>1000,28136=>1000,28137=>1000,28138=>1000,28139=>1000,28140=>1000,28141=>1000,28142=>1000,28143=>1000,28144=>1000,28145=>1000,28146=>1000,28147=>1000,28148=>1000,28149=>1000,28150=>1000,28151=>1000,28152=>1000,28153=>1000,28154=>1000,28155=>1000,28156=>1000,28157=>1000,28158=>1000,28159=>1000,28160=>1000,28161=>1000,28162=>1000,28163=>1000,28164=>1000,28165=>1000,28166=>1000,28167=>1000,28168=>1000,28169=>1000,28170=>1000,28171=>1000,28172=>1000,28173=>1000,28174=>1000,28175=>1000,28176=>1000,28177=>1000,28178=>1000,28179=>1000,28180=>1000,28181=>1000,28182=>1000,28183=>1000,28184=>1000,28185=>1000,28186=>1000,28187=>1000,28188=>1000,28189=>1000,28190=>1000,28191=>1000,28192=>1000,28193=>1000,28194=>1000,28195=>1000,28196=>1000,28197=>1000,28198=>1000,28199=>1000,28200=>1000,28201=>1000,28202=>1000,28203=>1000,28204=>1000,28205=>1000,28206=>1000,28207=>1000,28208=>1000,28209=>1000,28210=>1000,28211=>1000,28212=>1000,28213=>1000,28214=>1000,28215=>1000,28216=>1000,28217=>1000,28218=>1000,28219=>1000,28220=>1000,28221=>1000,28222=>1000,28223=>1000,28224=>1000,28225=>1000,28226=>1000,28227=>1000,28228=>1000,28229=>1000,28230=>1000,28231=>1000,28232=>1000,28233=>1000,28234=>1000,28235=>1000,28236=>1000,28237=>1000,28238=>1000,28239=>1000,28240=>1000,28241=>1000,28242=>1000,28243=>1000,28244=>1000,28245=>1000,28246=>1000,28247=>1000,28248=>1000,28249=>1000,28250=>1000,28251=>1000,28252=>1000,28253=>1000,28254=>1000,28255=>1000,28256=>1000,28257=>1000,28258=>1000,28259=>1000,28260=>1000,28261=>1000,28262=>1000,28263=>1000,28264=>1000,28265=>1000,28266=>1000,28267=>1000,28268=>1000,28269=>1000,28270=>1000,28271=>1000,28272=>1000,28273=>1000,28274=>1000,28275=>1000,28276=>1000,28277=>1000,28278=>1000,28279=>1000,28280=>1000,28281=>1000,28282=>1000,28283=>1000,28284=>1000,28285=>1000,28286=>1000,28287=>1000,28288=>1000,28289=>1000,28290=>1000,28291=>1000,28292=>1000,28293=>1000,28294=>1000,28295=>1000,28296=>1000,28297=>1000,28298=>1000,28299=>1000,28300=>1000,28301=>1000,28302=>1000,28303=>1000,28304=>1000,28305=>1000,28306=>1000,28307=>1000,28308=>1000,28309=>1000,28310=>1000,28311=>1000,28312=>1000,28313=>1000,28314=>1000,28315=>1000,28316=>1000,28317=>1000,28318=>1000,28319=>1000,28320=>1000,28321=>1000,28322=>1000,28323=>1000,28324=>1000,28325=>1000,28326=>1000,28327=>1000,28328=>1000,28329=>1000,28330=>1000,28331=>1000,28332=>1000,28333=>1000,28334=>1000,28335=>1000,28336=>1000,28337=>1000,28338=>1000,28339=>1000,28340=>1000,28341=>1000,28342=>1000,28343=>1000,28344=>1000,28345=>1000,28346=>1000,28347=>1000,28348=>1000,28349=>1000,28350=>1000,28351=>1000,28352=>1000,28353=>1000,28354=>1000,28355=>1000,28356=>1000,28357=>1000,28358=>1000,28359=>1000,28360=>1000,28361=>1000,28362=>1000,28363=>1000,28364=>1000,28365=>1000,28366=>1000,28367=>1000,28368=>1000,28369=>1000,28370=>1000,28371=>1000,28372=>1000,28373=>1000,28374=>1000,28375=>1000,28376=>1000,28377=>1000,28378=>1000,28379=>1000,28380=>1000,28381=>1000,28382=>1000,28383=>1000,28384=>1000,28385=>1000,28386=>1000,28387=>1000,28388=>1000,28389=>1000,28390=>1000,28391=>1000,28392=>1000,28393=>1000,28394=>1000,28395=>1000,28396=>1000,28397=>1000,28398=>1000,28399=>1000,28400=>1000,28401=>1000,28402=>1000,28403=>1000,28404=>1000,28405=>1000,28406=>1000,28407=>1000,28408=>1000,28409=>1000,28410=>1000,28411=>1000,28412=>1000,28413=>1000,28414=>1000,28415=>1000,28416=>1000,28417=>1000,28418=>1000,28419=>1000,28420=>1000,28421=>1000,28422=>1000,28423=>1000,28424=>1000,28425=>1000,28426=>1000,28427=>1000,28428=>1000,28429=>1000,28430=>1000,28431=>1000,28432=>1000,28433=>1000,28434=>1000,28435=>1000,28436=>1000,28437=>1000,28438=>1000,28439=>1000,28440=>1000,28441=>1000,28442=>1000,28443=>1000,28444=>1000,28445=>1000,28446=>1000,28447=>1000,28448=>1000,28449=>1000,28450=>1000,28451=>1000,28452=>1000,28453=>1000,28454=>1000,28455=>1000,28456=>1000,28457=>1000,28458=>1000,28459=>1000,28460=>1000,28461=>1000,28462=>1000,28463=>1000,28464=>1000,28465=>1000,28466=>1000,28467=>1000,28468=>1000,28469=>1000,28470=>1000,28471=>1000,28472=>1000,28473=>1000,28474=>1000,28475=>1000,28476=>1000,28477=>1000,28478=>1000,28479=>1000,28480=>1000,28481=>1000,28482=>1000,28483=>1000,28484=>1000,28485=>1000,28486=>1000,28487=>1000,28488=>1000,28489=>1000,28490=>1000,28491=>1000,28492=>1000,28493=>1000,28494=>1000,28495=>1000,28496=>1000,28497=>1000,28498=>1000,28499=>1000,28500=>1000,28501=>1000,28502=>1000,28503=>1000,28504=>1000,28505=>1000,28506=>1000,28507=>1000,28508=>1000,28509=>1000,28510=>1000,28511=>1000,28512=>1000,28513=>1000,28514=>1000,28515=>1000,28516=>1000,28517=>1000,28518=>1000,28519=>1000,28520=>1000,28521=>1000,28522=>1000,28523=>1000,28524=>1000,28525=>1000,28526=>1000,28527=>1000,28528=>1000,28529=>1000,28530=>1000,28531=>1000,28532=>1000,28533=>1000,28534=>1000,28535=>1000,28536=>1000,28537=>1000,28538=>1000,28539=>1000,28540=>1000,28541=>1000,28542=>1000,28543=>1000,28544=>1000,28545=>1000,28546=>1000,28547=>1000,28548=>1000,28549=>1000,28550=>1000,28551=>1000,28552=>1000,28553=>1000,28554=>1000,28555=>1000,28556=>1000,28557=>1000,28558=>1000,28559=>1000,28560=>1000,28561=>1000,28562=>1000,28563=>1000,28564=>1000,28565=>1000,28566=>1000,28567=>1000,28568=>1000,28569=>1000,28570=>1000,28571=>1000,28572=>1000,28573=>1000,28574=>1000,28575=>1000,28576=>1000,28577=>1000,28578=>1000,28579=>1000,28580=>1000,28581=>1000,28582=>1000,28583=>1000,28584=>1000,28585=>1000,28586=>1000,28587=>1000,28588=>1000,28589=>1000,28590=>1000,28591=>1000,28592=>1000,28593=>1000,28594=>1000,28595=>1000,28596=>1000,28597=>1000,28598=>1000,28599=>1000,28600=>1000,28601=>1000,28602=>1000,28603=>1000,28604=>1000,28605=>1000,28606=>1000,28607=>1000,28608=>1000,28609=>1000,28610=>1000,28611=>1000,28612=>1000,28613=>1000,28614=>1000,28615=>1000,28616=>1000,28617=>1000,28618=>1000,28619=>1000,28620=>1000,28621=>1000,28622=>1000,28623=>1000,28624=>1000,28625=>1000,28626=>1000,28627=>1000,28628=>1000,28629=>1000,28630=>1000,28631=>1000,28632=>1000,28633=>1000,28634=>1000,28635=>1000,28636=>1000,28637=>1000,28638=>1000,28639=>1000,28640=>1000,28641=>1000,28642=>1000,28643=>1000,28644=>1000,28645=>1000,28646=>1000,28647=>1000,28648=>1000,28649=>1000,28650=>1000,28651=>1000,28652=>1000,28653=>1000,28654=>1000,28655=>1000,28656=>1000,28657=>1000,28658=>1000,28659=>1000,28660=>1000,28661=>1000,28662=>1000,28663=>1000,28664=>1000,28665=>1000,28666=>1000,28667=>1000,28668=>1000,28669=>1000,28670=>1000,28671=>1000,28672=>1000,28673=>1000,28674=>1000,28675=>1000,28676=>1000,28677=>1000,28678=>1000,28679=>1000,28680=>1000,28681=>1000,28682=>1000,28683=>1000,28684=>1000,28685=>1000,28686=>1000,28687=>1000,28688=>1000,28689=>1000,28690=>1000,28691=>1000,28692=>1000,28693=>1000,28694=>1000,28695=>1000,28696=>1000,28697=>1000,28698=>1000,28699=>1000,28700=>1000,28701=>1000,28702=>1000,28703=>1000,28704=>1000,28705=>1000,28706=>1000,28707=>1000,28708=>1000,28709=>1000,28710=>1000,28711=>1000,28712=>1000,28713=>1000,28714=>1000,28715=>1000,28716=>1000,28717=>1000,28718=>1000,28719=>1000,28720=>1000,28721=>1000,28722=>1000,28723=>1000,28724=>1000,28725=>1000,28726=>1000,28727=>1000,28728=>1000,28729=>1000,28730=>1000,28731=>1000,28732=>1000,28733=>1000,28734=>1000,28735=>1000,28736=>1000,28737=>1000,28738=>1000,28739=>1000,28740=>1000,28741=>1000,28742=>1000,28743=>1000,28744=>1000,28745=>1000,28746=>1000,28747=>1000,28748=>1000,28749=>1000,28750=>1000,28751=>1000,28752=>1000,28753=>1000,28754=>1000,28755=>1000,28756=>1000,28757=>1000,28758=>1000,28759=>1000,28760=>1000,28761=>1000,28762=>1000,28763=>1000,28764=>1000,28765=>1000,28766=>1000,28767=>1000,28768=>1000,28769=>1000,28770=>1000,28771=>1000,28772=>1000,28773=>1000,28774=>1000,28775=>1000,28776=>1000,28777=>1000,28778=>1000,28779=>1000,28780=>1000,28781=>1000,28782=>1000,28783=>1000,28784=>1000,28785=>1000,28786=>1000,28787=>1000,28788=>1000,28789=>1000,28790=>1000,28791=>1000,28792=>1000,28793=>1000,28794=>1000,28795=>1000,28796=>1000,28797=>1000,28798=>1000,28799=>1000,28800=>1000,28801=>1000,28802=>1000,28803=>1000,28804=>1000,28805=>1000,28806=>1000,28807=>1000,28808=>1000,28809=>1000,28810=>1000,28811=>1000,28812=>1000,28813=>1000,28814=>1000,28815=>1000,28816=>1000,28817=>1000,28818=>1000,28819=>1000,28820=>1000,28821=>1000,28822=>1000,28823=>1000,28824=>1000,28825=>1000,28826=>1000,28827=>1000,28828=>1000,28829=>1000,28830=>1000,28831=>1000,28832=>1000,28833=>1000,28834=>1000,28835=>1000,28836=>1000,28837=>1000,28838=>1000,28839=>1000,28840=>1000,28841=>1000,28842=>1000,28843=>1000,28844=>1000,28845=>1000,28846=>1000,28847=>1000,28848=>1000,28849=>1000,28850=>1000,28851=>1000,28852=>1000,28853=>1000,28854=>1000,28855=>1000,28856=>1000,28857=>1000,28858=>1000,28859=>1000,28860=>1000,28861=>1000,28862=>1000,28863=>1000,28864=>1000,28865=>1000,28866=>1000,28867=>1000,28868=>1000,28869=>1000,28870=>1000,28871=>1000,28872=>1000,28873=>1000,28874=>1000,28875=>1000,28876=>1000,28877=>1000,28878=>1000,28879=>1000,28880=>1000,28881=>1000,28882=>1000,28883=>1000,28884=>1000,28885=>1000,28886=>1000,28887=>1000,28888=>1000,28889=>1000,28890=>1000,28891=>1000,28892=>1000,28893=>1000,28894=>1000,28895=>1000,28896=>1000,28897=>1000,28898=>1000,28899=>1000,28900=>1000,28901=>1000,28902=>1000,28903=>1000,28904=>1000,28905=>1000,28906=>1000,28907=>1000,28908=>1000,28909=>1000,28910=>1000,28911=>1000,28912=>1000,28913=>1000,28914=>1000,28915=>1000,28916=>1000,28917=>1000,28918=>1000,28919=>1000,28920=>1000,28921=>1000,28922=>1000,28923=>1000,28924=>1000,28925=>1000,28926=>1000,28927=>1000,28928=>1000,28929=>1000,28930=>1000,28931=>1000,28932=>1000,28933=>1000,28934=>1000,28935=>1000,28936=>1000,28937=>1000,28938=>1000,28939=>1000,28940=>1000,28941=>1000,28942=>1000,28943=>1000,28944=>1000,28945=>1000,28946=>1000,28947=>1000,28948=>1000,28949=>1000,28950=>1000,28951=>1000,28952=>1000,28953=>1000,28954=>1000,28955=>1000,28956=>1000,28957=>1000,28958=>1000,28959=>1000,28960=>1000,28961=>1000,28962=>1000,28963=>1000,28964=>1000,28965=>1000,28966=>1000,28967=>1000,28968=>1000,28969=>1000,28970=>1000,28971=>1000,28972=>1000,28973=>1000,28974=>1000,28975=>1000,28976=>1000,28977=>1000,28978=>1000,28979=>1000,28980=>1000,28981=>1000,28982=>1000,28983=>1000,28984=>1000,28985=>1000,28986=>1000,28987=>1000,28988=>1000,28989=>1000,28990=>1000,28991=>1000,28992=>1000,28993=>1000,28994=>1000,28995=>1000,28996=>1000,28997=>1000,28998=>1000,28999=>1000,29000=>1000,29001=>1000,29002=>1000,29003=>1000,29004=>1000,29005=>1000,29006=>1000,29007=>1000,29008=>1000,29009=>1000,29010=>1000,29011=>1000,29012=>1000,29013=>1000,29014=>1000,29015=>1000,29016=>1000,29017=>1000,29018=>1000,29019=>1000,29020=>1000,29021=>1000,29022=>1000,29023=>1000,29024=>1000,29025=>1000,29026=>1000,29027=>1000,29028=>1000,29029=>1000,29030=>1000,29031=>1000,29032=>1000,29033=>1000,29034=>1000,29035=>1000,29036=>1000,29037=>1000,29038=>1000,29039=>1000,29040=>1000,29041=>1000,29042=>1000,29043=>1000,29044=>1000,29045=>1000,29046=>1000,29047=>1000,29048=>1000,29049=>1000,29050=>1000,29051=>1000,29052=>1000,29053=>1000,29054=>1000,29055=>1000,29056=>1000,29057=>1000,29058=>1000,29059=>1000,29060=>1000,29061=>1000,29062=>1000,29063=>1000,29064=>1000,29065=>1000,29066=>1000,29067=>1000,29068=>1000,29069=>1000,29070=>1000,29071=>1000,29072=>1000,29073=>1000,29074=>1000,29075=>1000,29076=>1000,29077=>1000,29078=>1000,29079=>1000,29080=>1000,29081=>1000,29082=>1000,29083=>1000,29084=>1000,29085=>1000,29086=>1000,29087=>1000,29088=>1000,29089=>1000,29090=>1000,29091=>1000,29092=>1000,29093=>1000,29094=>1000,29095=>1000,29096=>1000,29097=>1000,29098=>1000,29099=>1000,29100=>1000,29101=>1000,29102=>1000,29103=>1000,29104=>1000,29105=>1000,29106=>1000,29107=>1000,29108=>1000,29109=>1000,29110=>1000,29111=>1000,29112=>1000,29113=>1000,29114=>1000,29115=>1000,29116=>1000,29117=>1000,29118=>1000,29119=>1000,29120=>1000,29121=>1000,29122=>1000,29123=>1000,29124=>1000,29125=>1000,29126=>1000,29127=>1000,29128=>1000,29129=>1000,29130=>1000,29131=>1000,29132=>1000,29133=>1000,29134=>1000,29135=>1000,29136=>1000,29137=>1000,29138=>1000,29139=>1000,29140=>1000,29141=>1000,29142=>1000,29143=>1000,29144=>1000,29145=>1000,29146=>1000,29147=>1000,29148=>1000,29149=>1000,29150=>1000,29151=>1000,29152=>1000,29153=>1000,29154=>1000,29155=>1000,29156=>1000,29157=>1000,29158=>1000,29159=>1000,29160=>1000,29161=>1000,29162=>1000,29163=>1000,29164=>1000,29165=>1000,29166=>1000,29167=>1000,29168=>1000,29169=>1000,29170=>1000,29171=>1000,29172=>1000,29173=>1000,29174=>1000,29175=>1000,29176=>1000,29177=>1000,29178=>1000,29179=>1000,29180=>1000,29181=>1000,29182=>1000,29183=>1000,29184=>1000,29185=>1000,29186=>1000,29187=>1000,29188=>1000,29189=>1000,29190=>1000,29191=>1000,29192=>1000,29193=>1000,29194=>1000,29195=>1000,29196=>1000,29197=>1000,29198=>1000,29199=>1000,29200=>1000,29201=>1000,29202=>1000,29203=>1000,29204=>1000,29205=>1000,29206=>1000,29207=>1000,29208=>1000,29209=>1000,29210=>1000,29211=>1000,29212=>1000,29213=>1000,29214=>1000,29215=>1000,29216=>1000,29217=>1000,29218=>1000,29219=>1000,29220=>1000,29221=>1000,29222=>1000,29223=>1000,29224=>1000,29225=>1000,29226=>1000,29227=>1000,29228=>1000,29229=>1000,29230=>1000,29231=>1000,29232=>1000,29233=>1000,29234=>1000,29235=>1000,29236=>1000,29237=>1000,29238=>1000,29239=>1000,29240=>1000,29241=>1000,29242=>1000,29243=>1000,29244=>1000,29245=>1000,29246=>1000,29247=>1000,29248=>1000,29249=>1000,29250=>1000,29251=>1000,29252=>1000,29253=>1000,29254=>1000,29255=>1000,29256=>1000,29257=>1000,29258=>1000,29259=>1000,29260=>1000,29261=>1000,29262=>1000,29263=>1000,29264=>1000,29265=>1000,29266=>1000,29267=>1000,29268=>1000,29269=>1000,29270=>1000,29271=>1000,29272=>1000,29273=>1000,29274=>1000,29275=>1000,29276=>1000,29277=>1000,29278=>1000,29279=>1000,29280=>1000,29281=>1000,29282=>1000,29283=>1000,29284=>1000,29285=>1000,29286=>1000,29287=>1000,29288=>1000,29289=>1000,29290=>1000,29291=>1000,29292=>1000,29293=>1000,29294=>1000,29295=>1000,29296=>1000,29297=>1000,29298=>1000,29299=>1000,29300=>1000,29301=>1000,29302=>1000,29303=>1000,29304=>1000,29305=>1000,29306=>1000,29307=>1000,29308=>1000,29309=>1000,29310=>1000,29311=>1000,29312=>1000,29313=>1000,29314=>1000,29315=>1000,29316=>1000,29317=>1000,29318=>1000,29319=>1000,29320=>1000,29321=>1000,29322=>1000,29323=>1000,29324=>1000,29325=>1000,29326=>1000,29327=>1000,29328=>1000,29329=>1000,29330=>1000,29331=>1000,29332=>1000,29333=>1000,29334=>1000,29335=>1000,29336=>1000,29337=>1000,29338=>1000,29339=>1000,29340=>1000,29341=>1000,29342=>1000,29343=>1000,29344=>1000,29345=>1000,29346=>1000,29347=>1000,29348=>1000,29349=>1000,29350=>1000,29351=>1000,29352=>1000,29353=>1000,29354=>1000,29355=>1000,29356=>1000,29357=>1000,29358=>1000,29359=>1000,29360=>1000,29361=>1000,29362=>1000,29363=>1000,29364=>1000,29365=>1000,29366=>1000,29367=>1000,29368=>1000,29369=>1000,29370=>1000,29371=>1000,29372=>1000,29373=>1000,29374=>1000,29375=>1000,29376=>1000,29377=>1000,29378=>1000,29379=>1000,29380=>1000,29381=>1000,29382=>1000,29383=>1000,29384=>1000,29385=>1000,29386=>1000,29387=>1000,29388=>1000,29389=>1000,29390=>1000,29391=>1000,29392=>1000,29393=>1000,29394=>1000,29395=>1000,29396=>1000,29397=>1000,29398=>1000,29399=>1000,29400=>1000,29401=>1000,29402=>1000,29403=>1000,29404=>1000,29405=>1000,29406=>1000,29407=>1000,29408=>1000,29409=>1000,29410=>1000,29411=>1000,29412=>1000,29413=>1000,29414=>1000,29415=>1000,29416=>1000,29417=>1000,29418=>1000,29419=>1000,29420=>1000,29421=>1000,29422=>1000,29423=>1000,29424=>1000,29425=>1000,29426=>1000,29427=>1000,29428=>1000,29429=>1000,29430=>1000,29431=>1000,29432=>1000,29433=>1000,29434=>1000,29435=>1000,29436=>1000,29437=>1000,29438=>1000,29439=>1000,29440=>1000,29441=>1000,29442=>1000,29443=>1000,29444=>1000,29445=>1000,29446=>1000,29447=>1000,29448=>1000,29449=>1000,29450=>1000,29451=>1000,29452=>1000,29453=>1000,29454=>1000,29455=>1000,29456=>1000,29457=>1000,29458=>1000,29459=>1000,29460=>1000,29461=>1000,29462=>1000,29463=>1000,29464=>1000,29465=>1000,29466=>1000,29467=>1000,29468=>1000,29469=>1000,29470=>1000,29471=>1000,29472=>1000,29473=>1000,29474=>1000,29475=>1000,29476=>1000,29477=>1000,29478=>1000,29479=>1000,29480=>1000,29481=>1000,29482=>1000,29483=>1000,29484=>1000,29485=>1000,29486=>1000,29487=>1000,29488=>1000,29489=>1000,29490=>1000,29491=>1000,29492=>1000,29493=>1000,29494=>1000,29495=>1000,29496=>1000,29497=>1000,29498=>1000,29499=>1000,29500=>1000,29501=>1000,29502=>1000,29503=>1000,29504=>1000,29505=>1000,29506=>1000,29507=>1000,29508=>1000,29509=>1000,29510=>1000,29511=>1000,29512=>1000,29513=>1000,29514=>1000,29515=>1000,29516=>1000,29517=>1000,29518=>1000,29519=>1000,29520=>1000,29521=>1000,29522=>1000,29523=>1000,29524=>1000,29525=>1000,29526=>1000,29527=>1000,29528=>1000,29529=>1000,29530=>1000,29531=>1000,29532=>1000,29533=>1000,29534=>1000,29535=>1000,29536=>1000,29537=>1000,29538=>1000,29539=>1000,29540=>1000,29541=>1000,29542=>1000,29543=>1000,29544=>1000,29545=>1000,29546=>1000,29547=>1000,29548=>1000,29549=>1000,29550=>1000,29551=>1000,29552=>1000,29553=>1000,29554=>1000,29555=>1000,29556=>1000,29557=>1000,29558=>1000,29559=>1000,29560=>1000,29561=>1000,29562=>1000,29563=>1000,29564=>1000,29565=>1000,29566=>1000,29567=>1000,29568=>1000,29569=>1000,29570=>1000,29571=>1000,29572=>1000,29573=>1000,29574=>1000,29575=>1000,29576=>1000,29577=>1000,29578=>1000,29579=>1000,29580=>1000,29581=>1000,29582=>1000,29583=>1000,29584=>1000,29585=>1000,29586=>1000,29587=>1000,29588=>1000,29589=>1000,29590=>1000,29591=>1000,29592=>1000,29593=>1000,29594=>1000,29595=>1000,29596=>1000,29597=>1000,29598=>1000,29599=>1000,29600=>1000,29601=>1000,29602=>1000,29603=>1000,29604=>1000,29605=>1000,29606=>1000,29607=>1000,29608=>1000,29609=>1000,29610=>1000,29611=>1000,29612=>1000,29613=>1000,29614=>1000,29615=>1000,29616=>1000,29617=>1000,29618=>1000,29619=>1000,29620=>1000,29621=>1000,29622=>1000,29623=>1000,29624=>1000,29625=>1000,29626=>1000,29627=>1000,29628=>1000,29629=>1000,29630=>1000,29631=>1000,29632=>1000,29633=>1000,29634=>1000,29635=>1000,29636=>1000,29637=>1000,29638=>1000,29639=>1000,29640=>1000,29641=>1000,29642=>1000,29643=>1000,29644=>1000,29645=>1000,29646=>1000,29647=>1000,29648=>1000,29649=>1000,29650=>1000,29651=>1000,29652=>1000,29653=>1000,29654=>1000,29655=>1000,29656=>1000,29657=>1000,29658=>1000,29659=>1000,29660=>1000,29661=>1000,29662=>1000,29663=>1000,29664=>1000,29665=>1000,29666=>1000,29667=>1000,29668=>1000,29669=>1000,29670=>1000,29671=>1000,29672=>1000,29673=>1000,29674=>1000,29675=>1000,29676=>1000,29677=>1000,29678=>1000,29679=>1000,29680=>1000,29681=>1000,29682=>1000,29683=>1000,29684=>1000,29685=>1000,29686=>1000,29687=>1000,29688=>1000,29689=>1000,29690=>1000,29691=>1000,29692=>1000,29693=>1000,29694=>1000,29695=>1000,29696=>1000,29697=>1000,29698=>1000,29699=>1000,29700=>1000,29701=>1000,29702=>1000,29703=>1000,29704=>1000,29705=>1000,29706=>1000,29707=>1000,29708=>1000,29709=>1000,29710=>1000,29711=>1000,29712=>1000,29713=>1000,29714=>1000,29715=>1000,29716=>1000,29717=>1000,29718=>1000,29719=>1000,29720=>1000,29721=>1000,29722=>1000,29723=>1000,29724=>1000,29725=>1000,29726=>1000,29727=>1000,29728=>1000,29729=>1000,29730=>1000,29731=>1000,29732=>1000,29733=>1000,29734=>1000,29735=>1000,29736=>1000,29737=>1000,29738=>1000,29739=>1000,29740=>1000,29741=>1000,29742=>1000,29743=>1000,29744=>1000,29745=>1000,29746=>1000,29747=>1000,29748=>1000,29749=>1000,29750=>1000,29751=>1000,29752=>1000,29753=>1000,29754=>1000,29755=>1000,29756=>1000,29757=>1000,29758=>1000,29759=>1000,29760=>1000,29761=>1000,29762=>1000,29763=>1000,29764=>1000,29765=>1000,29766=>1000,29767=>1000,29768=>1000,29769=>1000,29770=>1000,29771=>1000,29772=>1000,29773=>1000,29774=>1000,29775=>1000,29776=>1000,29777=>1000,29778=>1000,29779=>1000,29780=>1000,29781=>1000,29782=>1000,29783=>1000,29784=>1000,29785=>1000,29786=>1000,29787=>1000,29788=>1000,29789=>1000,29790=>1000,29791=>1000,29792=>1000,29793=>1000,29794=>1000,29795=>1000,29796=>1000,29797=>1000,29798=>1000,29799=>1000,29800=>1000,29801=>1000,29802=>1000,29803=>1000,29804=>1000,29805=>1000,29806=>1000,29807=>1000,29808=>1000,29809=>1000,29810=>1000,29811=>1000,29812=>1000,29813=>1000,29814=>1000,29815=>1000,29816=>1000,29817=>1000,29818=>1000,29819=>1000,29820=>1000,29821=>1000,29822=>1000,29823=>1000,29824=>1000,29825=>1000,29826=>1000,29827=>1000,29828=>1000,29829=>1000,29830=>1000,29831=>1000,29832=>1000,29833=>1000,29834=>1000,29835=>1000,29836=>1000,29837=>1000,29838=>1000,29839=>1000,29840=>1000,29841=>1000,29842=>1000,29843=>1000,29844=>1000,29845=>1000,29846=>1000,29847=>1000,29848=>1000,29849=>1000,29850=>1000,29851=>1000,29852=>1000,29853=>1000,29854=>1000,29855=>1000,29856=>1000,29857=>1000,29858=>1000,29859=>1000,29860=>1000,29861=>1000,29862=>1000,29863=>1000,29864=>1000,29865=>1000,29866=>1000,29867=>1000,29868=>1000,29869=>1000,29870=>1000,29871=>1000,29872=>1000,29873=>1000,29874=>1000,29875=>1000,29876=>1000,29877=>1000,29878=>1000,29879=>1000,29880=>1000,29881=>1000,29882=>1000,29883=>1000,29884=>1000,29885=>1000,29886=>1000,29887=>1000,29888=>1000,29889=>1000,29890=>1000,29891=>1000,29892=>1000,29893=>1000,29894=>1000,29895=>1000,29896=>1000,29897=>1000,29898=>1000,29899=>1000,29900=>1000,29901=>1000,29902=>1000,29903=>1000,29904=>1000,29905=>1000,29906=>1000,29907=>1000,29908=>1000,29909=>1000,29910=>1000,29911=>1000,29912=>1000,29913=>1000,29914=>1000,29915=>1000,29916=>1000,29917=>1000,29918=>1000,29919=>1000,29920=>1000,29921=>1000,29922=>1000,29923=>1000,29924=>1000,29925=>1000,29926=>1000,29927=>1000,29928=>1000,29929=>1000,29930=>1000,29931=>1000,29932=>1000,29933=>1000,29934=>1000,29935=>1000,29936=>1000,29937=>1000,29938=>1000,29939=>1000,29940=>1000,29941=>1000,29942=>1000,29943=>1000,29944=>1000,29945=>1000,29946=>1000,29947=>1000,29948=>1000,29949=>1000,29950=>1000,29951=>1000,29952=>1000,29953=>1000,29954=>1000,29955=>1000,29956=>1000,29957=>1000,29958=>1000,29959=>1000,29960=>1000,29961=>1000,29962=>1000,29963=>1000,29964=>1000,29965=>1000,29966=>1000,29967=>1000,29968=>1000,29969=>1000,29970=>1000,29971=>1000,29972=>1000,29973=>1000,29974=>1000,29975=>1000,29976=>1000,29977=>1000,29978=>1000,29979=>1000,29980=>1000,29981=>1000,29982=>1000,29983=>1000,29984=>1000,29985=>1000,29986=>1000,29987=>1000,29988=>1000,29989=>1000,29990=>1000,29991=>1000,29992=>1000,29993=>1000,29994=>1000,29995=>1000,29996=>1000,29997=>1000,29998=>1000,29999=>1000,30000=>1000,30001=>1000,30002=>1000,30003=>1000,30004=>1000,30005=>1000,30006=>1000,30007=>1000,30008=>1000,30009=>1000,30010=>1000,30011=>1000,30012=>1000,30013=>1000,30014=>1000,30015=>1000,30016=>1000,30017=>1000,30018=>1000,30019=>1000,30020=>1000,30021=>1000,30022=>1000,30023=>1000,30024=>1000,30025=>1000,30026=>1000,30027=>1000,30028=>1000,30029=>1000,30030=>1000,30031=>1000,30032=>1000,30033=>1000,30034=>1000,30035=>1000,30036=>1000,30037=>1000,30038=>1000,30039=>1000,30040=>1000,30041=>1000,30042=>1000,30043=>1000,30044=>1000,30045=>1000,30046=>1000,30047=>1000,30048=>1000,30049=>1000,30050=>1000,30051=>1000,30052=>1000,30053=>1000,30054=>1000,30055=>1000,30056=>1000,30057=>1000,30058=>1000,30059=>1000,30060=>1000,30061=>1000,30062=>1000,30063=>1000,30064=>1000,30065=>1000,30066=>1000,30067=>1000,30068=>1000,30069=>1000,30070=>1000,30071=>1000,30072=>1000,30073=>1000,30074=>1000,30075=>1000,30076=>1000,30077=>1000,30078=>1000,30079=>1000,30080=>1000,30081=>1000,30082=>1000,30083=>1000,30084=>1000,30085=>1000,30086=>1000,30087=>1000,30088=>1000,30089=>1000,30090=>1000,30091=>1000,30092=>1000,30093=>1000,30094=>1000,30095=>1000,30096=>1000,30097=>1000,30098=>1000,30099=>1000,30100=>1000,30101=>1000,30102=>1000,30103=>1000,30104=>1000,30105=>1000,30106=>1000,30107=>1000,30108=>1000,30109=>1000,30110=>1000,30111=>1000,30112=>1000,30113=>1000,30114=>1000,30115=>1000,30116=>1000,30117=>1000,30118=>1000,30119=>1000,30120=>1000,30121=>1000,30122=>1000,30123=>1000,30124=>1000,30125=>1000,30126=>1000,30127=>1000,30128=>1000,30129=>1000,30130=>1000,30131=>1000,30132=>1000,30133=>1000,30134=>1000,30135=>1000,30136=>1000,30137=>1000,30138=>1000,30139=>1000,30140=>1000,30141=>1000,30142=>1000,30143=>1000,30144=>1000,30145=>1000,30146=>1000,30147=>1000,30148=>1000,30149=>1000,30150=>1000,30151=>1000,30152=>1000,30153=>1000,30154=>1000,30155=>1000,30156=>1000,30157=>1000,30158=>1000,30159=>1000,30160=>1000,30161=>1000,30162=>1000,30163=>1000,30164=>1000,30165=>1000,30166=>1000,30167=>1000,30168=>1000,30169=>1000,30170=>1000,30171=>1000,30172=>1000,30173=>1000,30174=>1000,30175=>1000,30176=>1000,30177=>1000,30178=>1000,30179=>1000,30180=>1000,30181=>1000,30182=>1000,30183=>1000,30184=>1000,30185=>1000,30186=>1000,30187=>1000,30188=>1000,30189=>1000,30190=>1000,30191=>1000,30192=>1000,30193=>1000,30194=>1000,30195=>1000,30196=>1000,30197=>1000,30198=>1000,30199=>1000,30200=>1000,30201=>1000,30202=>1000,30203=>1000,30204=>1000,30205=>1000,30206=>1000,30207=>1000,30208=>1000,30209=>1000,30210=>1000,30211=>1000,30212=>1000,30213=>1000,30214=>1000,30215=>1000,30216=>1000,30217=>1000,30218=>1000,30219=>1000,30220=>1000,30221=>1000,30222=>1000,30223=>1000,30224=>1000,30225=>1000,30226=>1000,30227=>1000,30228=>1000,30229=>1000,30230=>1000,30231=>1000,30232=>1000,30233=>1000,30234=>1000,30235=>1000,30236=>1000,30237=>1000,30238=>1000,30239=>1000,30240=>1000,30241=>1000,30242=>1000,30243=>1000,30244=>1000,30245=>1000,30246=>1000,30247=>1000,30248=>1000,30249=>1000,30250=>1000,30251=>1000,30252=>1000,30253=>1000,30254=>1000,30255=>1000,30256=>1000,30257=>1000,30258=>1000,30259=>1000,30260=>1000,30261=>1000,30262=>1000,30263=>1000,30264=>1000,30265=>1000,30266=>1000,30267=>1000,30268=>1000,30269=>1000,30270=>1000,30271=>1000,30272=>1000,30273=>1000,30274=>1000,30275=>1000,30276=>1000,30277=>1000,30278=>1000,30279=>1000,30280=>1000,30281=>1000,30282=>1000,30283=>1000,30284=>1000,30285=>1000,30286=>1000,30287=>1000,30288=>1000,30289=>1000,30290=>1000,30291=>1000,30292=>1000,30293=>1000,30294=>1000,30295=>1000,30296=>1000,30297=>1000,30298=>1000,30299=>1000,30300=>1000,30301=>1000,30302=>1000,30303=>1000,30304=>1000,30305=>1000,30306=>1000,30307=>1000,30308=>1000,30309=>1000,30310=>1000,30311=>1000,30312=>1000,30313=>1000,30314=>1000,30315=>1000,30316=>1000,30317=>1000,30318=>1000,30319=>1000,30320=>1000,30321=>1000,30322=>1000,30323=>1000,30324=>1000,30325=>1000,30326=>1000,30327=>1000,30328=>1000,30329=>1000,30330=>1000,30331=>1000,30332=>1000,30333=>1000,30334=>1000,30335=>1000,30336=>1000,30337=>1000,30338=>1000,30339=>1000,30340=>1000,30341=>1000,30342=>1000,30343=>1000,30344=>1000,30345=>1000,30346=>1000,30347=>1000,30348=>1000,30349=>1000,30350=>1000,30351=>1000,30352=>1000,30353=>1000,30354=>1000,30355=>1000,30356=>1000,30357=>1000,30358=>1000,30359=>1000,30360=>1000,30361=>1000,30362=>1000,30363=>1000,30364=>1000,30365=>1000,30366=>1000,30367=>1000,30368=>1000,30369=>1000,30370=>1000,30371=>1000,30372=>1000,30373=>1000,30374=>1000,30375=>1000,30376=>1000,30377=>1000,30378=>1000,30379=>1000,30380=>1000,30381=>1000,30382=>1000,30383=>1000,30384=>1000,30385=>1000,30386=>1000,30387=>1000,30388=>1000,30389=>1000,30390=>1000,30391=>1000,30392=>1000,30393=>1000,30394=>1000,30395=>1000,30396=>1000,30397=>1000,30398=>1000,30399=>1000,30400=>1000,30401=>1000,30402=>1000,30403=>1000,30404=>1000,30405=>1000,30406=>1000,30407=>1000,30408=>1000,30409=>1000,30410=>1000,30411=>1000,30412=>1000,30413=>1000,30414=>1000,30415=>1000,30416=>1000,30417=>1000,30418=>1000,30419=>1000,30420=>1000,30421=>1000,30422=>1000,30423=>1000,30424=>1000,30425=>1000,30426=>1000,30427=>1000,30428=>1000,30429=>1000,30430=>1000,30431=>1000,30432=>1000,30433=>1000,30434=>1000,30435=>1000,30436=>1000,30437=>1000,30438=>1000,30439=>1000,30440=>1000,30441=>1000,30442=>1000,30443=>1000,30444=>1000,30445=>1000,30446=>1000,30447=>1000,30448=>1000,30449=>1000,30450=>1000,30451=>1000,30452=>1000,30453=>1000,30454=>1000,30455=>1000,30456=>1000,30457=>1000,30458=>1000,30459=>1000,30460=>1000,30461=>1000,30462=>1000,30463=>1000,30464=>1000,30465=>1000,30466=>1000,30467=>1000,30468=>1000,30469=>1000,30470=>1000,30471=>1000,30472=>1000,30473=>1000,30474=>1000,30475=>1000,30476=>1000,30477=>1000,30478=>1000,30479=>1000,30480=>1000,30481=>1000,30482=>1000,30483=>1000,30484=>1000,30485=>1000,30486=>1000,30487=>1000,30488=>1000,30489=>1000,30490=>1000,30491=>1000,30492=>1000,30493=>1000,30494=>1000,30495=>1000,30496=>1000,30497=>1000,30498=>1000,30499=>1000,30500=>1000,30501=>1000,30502=>1000,30503=>1000,30504=>1000,30505=>1000,30506=>1000,30507=>1000,30508=>1000,30509=>1000,30510=>1000,30511=>1000,30512=>1000,30513=>1000,30514=>1000,30515=>1000,30516=>1000,30517=>1000,30518=>1000,30519=>1000,30520=>1000,30521=>1000,30522=>1000,30523=>1000,30524=>1000,30525=>1000,30526=>1000,30527=>1000,30528=>1000,30529=>1000,30530=>1000,30531=>1000,30532=>1000,30533=>1000,30534=>1000,30535=>1000,30536=>1000,30537=>1000,30538=>1000,30539=>1000,30540=>1000,30541=>1000,30542=>1000,30543=>1000,30544=>1000,30545=>1000,30546=>1000,30547=>1000,30548=>1000,30549=>1000,30550=>1000,30551=>1000,30552=>1000,30553=>1000,30554=>1000,30555=>1000,30556=>1000,30557=>1000,30558=>1000,30559=>1000,30560=>1000,30561=>1000,30562=>1000,30563=>1000,30564=>1000,30565=>1000,30566=>1000,30567=>1000,30568=>1000,30569=>1000,30570=>1000,30571=>1000,30572=>1000,30573=>1000,30574=>1000,30575=>1000,30576=>1000,30577=>1000,30578=>1000,30579=>1000,30580=>1000,30581=>1000,30582=>1000,30583=>1000,30584=>1000,30585=>1000,30586=>1000,30587=>1000,30588=>1000,30589=>1000,30590=>1000,30591=>1000,30592=>1000,30593=>1000,30594=>1000,30595=>1000,30596=>1000,30597=>1000,30598=>1000,30599=>1000,30600=>1000,30601=>1000,30602=>1000,30603=>1000,30604=>1000,30605=>1000,30606=>1000,30607=>1000,30608=>1000,30609=>1000,30610=>1000,30611=>1000,30612=>1000,30613=>1000,30614=>1000,30615=>1000,30616=>1000,30617=>1000,30618=>1000,30619=>1000,30620=>1000,30621=>1000,30622=>1000,30623=>1000,30624=>1000,30625=>1000,30626=>1000,30627=>1000,30628=>1000,30629=>1000,30630=>1000,30631=>1000,30632=>1000,30633=>1000,30634=>1000,30635=>1000,30636=>1000,30637=>1000,30638=>1000,30639=>1000,30640=>1000,30641=>1000,30642=>1000,30643=>1000,30644=>1000,30645=>1000,30646=>1000,30647=>1000,30648=>1000,30649=>1000,30650=>1000,30651=>1000,30652=>1000,30653=>1000,30654=>1000,30655=>1000,30656=>1000,30657=>1000,30658=>1000,30659=>1000,30660=>1000,30661=>1000,30662=>1000,30663=>1000,30664=>1000,30665=>1000,30666=>1000,30667=>1000,30668=>1000,30669=>1000,30670=>1000,30671=>1000,30672=>1000,30673=>1000,30674=>1000,30675=>1000,30676=>1000,30677=>1000,30678=>1000,30679=>1000,30680=>1000,30681=>1000,30682=>1000,30683=>1000,30684=>1000,30685=>1000,30686=>1000,30687=>1000,30688=>1000,30689=>1000,30690=>1000,30691=>1000,30692=>1000,30693=>1000,30694=>1000,30695=>1000,30696=>1000,30697=>1000,30698=>1000,30699=>1000,30700=>1000,30701=>1000,30702=>1000,30703=>1000,30704=>1000,30705=>1000,30706=>1000,30707=>1000,30708=>1000,30709=>1000,30710=>1000,30711=>1000,30712=>1000,30713=>1000,30714=>1000,30715=>1000,30716=>1000,30717=>1000,30718=>1000,30719=>1000,30720=>1000,30721=>1000,30722=>1000,30723=>1000,30724=>1000,30725=>1000,30726=>1000,30727=>1000,30728=>1000,30729=>1000,30730=>1000,30731=>1000,30732=>1000,30733=>1000,30734=>1000,30735=>1000,30736=>1000,30737=>1000,30738=>1000,30739=>1000,30740=>1000,30741=>1000,30742=>1000,30743=>1000,30744=>1000,30745=>1000,30746=>1000,30747=>1000,30748=>1000,30749=>1000,30750=>1000,30751=>1000,30752=>1000,30753=>1000,30754=>1000,30755=>1000,30756=>1000,30757=>1000,30758=>1000,30759=>1000,30760=>1000,30761=>1000,30762=>1000,30763=>1000,30764=>1000,30765=>1000,30766=>1000,30767=>1000,30768=>1000,30769=>1000,30770=>1000,30771=>1000,30772=>1000,30773=>1000,30774=>1000,30775=>1000,30776=>1000,30777=>1000,30778=>1000,30779=>1000,30780=>1000,30781=>1000,30782=>1000,30783=>1000,30784=>1000,30785=>1000,30786=>1000,30787=>1000,30788=>1000,30789=>1000,30790=>1000,30791=>1000,30792=>1000,30793=>1000,30794=>1000,30795=>1000,30796=>1000,30797=>1000,30798=>1000,30799=>1000,30800=>1000,30801=>1000,30802=>1000,30803=>1000,30804=>1000,30805=>1000,30806=>1000,30807=>1000,30808=>1000,30809=>1000,30810=>1000,30811=>1000,30812=>1000,30813=>1000,30814=>1000,30815=>1000,30816=>1000,30817=>1000,30818=>1000,30819=>1000,30820=>1000,30821=>1000,30822=>1000,30823=>1000,30824=>1000,30825=>1000,30826=>1000,30827=>1000,30828=>1000,30829=>1000,30830=>1000,30831=>1000,30832=>1000,30833=>1000,30834=>1000,30835=>1000,30836=>1000,30837=>1000,30838=>1000,30839=>1000,30840=>1000,30841=>1000,30842=>1000,30843=>1000,30844=>1000,30845=>1000,30846=>1000,30847=>1000,30848=>1000,30849=>1000,30850=>1000,30851=>1000,30852=>1000,30853=>1000,30854=>1000,30855=>1000,30856=>1000,30857=>1000,30858=>1000,30859=>1000,30860=>1000,30861=>1000,30862=>1000,30863=>1000,30864=>1000,30865=>1000,30866=>1000,30867=>1000,30868=>1000,30869=>1000,30870=>1000,30871=>1000,30872=>1000,30873=>1000,30874=>1000,30875=>1000,30876=>1000,30877=>1000,30878=>1000,30879=>1000,30880=>1000,30881=>1000,30882=>1000,30883=>1000,30884=>1000,30885=>1000,30886=>1000,30887=>1000,30888=>1000,30889=>1000,30890=>1000,30891=>1000,30892=>1000,30893=>1000,30894=>1000,30895=>1000,30896=>1000,30897=>1000,30898=>1000,30899=>1000,30900=>1000,30901=>1000,30902=>1000,30903=>1000,30904=>1000,30905=>1000,30906=>1000,30907=>1000,30908=>1000,30909=>1000,30910=>1000,30911=>1000,30912=>1000,30913=>1000,30914=>1000,30915=>1000,30916=>1000,30917=>1000,30918=>1000,30919=>1000,30920=>1000,30921=>1000,30922=>1000,30923=>1000,30924=>1000,30925=>1000,30926=>1000,30927=>1000,30928=>1000,30929=>1000,30930=>1000,30931=>1000,30932=>1000,30933=>1000,30934=>1000,30935=>1000,30936=>1000,30937=>1000,30938=>1000,30939=>1000,30940=>1000,30941=>1000,30942=>1000,30943=>1000,30944=>1000,30945=>1000,30946=>1000,30947=>1000,30948=>1000,30949=>1000,30950=>1000,30951=>1000,30952=>1000,30953=>1000,30954=>1000,30955=>1000,30956=>1000,30957=>1000,30958=>1000,30959=>1000,30960=>1000,30961=>1000,30962=>1000,30963=>1000,30964=>1000,30965=>1000,30966=>1000,30967=>1000,30968=>1000,30969=>1000,30970=>1000,30971=>1000,30972=>1000,30973=>1000,30974=>1000,30975=>1000,30976=>1000,30977=>1000,30978=>1000,30979=>1000,30980=>1000,30981=>1000,30982=>1000,30983=>1000,30984=>1000,30985=>1000,30986=>1000,30987=>1000,30988=>1000,30989=>1000,30990=>1000,30991=>1000,30992=>1000,30993=>1000,30994=>1000,30995=>1000,30996=>1000,30997=>1000,30998=>1000,30999=>1000,31000=>1000,31001=>1000,31002=>1000,31003=>1000,31004=>1000,31005=>1000,31006=>1000,31007=>1000,31008=>1000,31009=>1000,31010=>1000,31011=>1000,31012=>1000,31013=>1000,31014=>1000,31015=>1000,31016=>1000,31017=>1000,31018=>1000,31019=>1000,31020=>1000,31021=>1000,31022=>1000,31023=>1000,31024=>1000,31025=>1000,31026=>1000,31027=>1000,31028=>1000,31029=>1000,31030=>1000,31031=>1000,31032=>1000,31033=>1000,31034=>1000,31035=>1000,31036=>1000,31037=>1000,31038=>1000,31039=>1000,31040=>1000,31041=>1000,31042=>1000,31043=>1000,31044=>1000,31045=>1000,31046=>1000,31047=>1000,31048=>1000,31049=>1000,31050=>1000,31051=>1000,31052=>1000,31053=>1000,31054=>1000,31055=>1000,31056=>1000,31057=>1000,31058=>1000,31059=>1000,31060=>1000,31061=>1000,31062=>1000,31063=>1000,31064=>1000,31065=>1000,31066=>1000,31067=>1000,31068=>1000,31069=>1000,31070=>1000,31071=>1000,31072=>1000,31073=>1000,31074=>1000,31075=>1000,31076=>1000,31077=>1000,31078=>1000,31079=>1000,31080=>1000,31081=>1000,31082=>1000,31083=>1000,31084=>1000,31085=>1000,31086=>1000,31087=>1000,31088=>1000,31089=>1000,31090=>1000,31091=>1000,31092=>1000,31093=>1000,31094=>1000,31095=>1000,31096=>1000,31097=>1000,31098=>1000,31099=>1000,31100=>1000,31101=>1000,31102=>1000,31103=>1000,31104=>1000,31105=>1000,31106=>1000,31107=>1000,31108=>1000,31109=>1000,31110=>1000,31111=>1000,31112=>1000,31113=>1000,31114=>1000,31115=>1000,31116=>1000,31117=>1000,31118=>1000,31119=>1000,31120=>1000,31121=>1000,31122=>1000,31123=>1000,31124=>1000,31125=>1000,31126=>1000,31127=>1000,31128=>1000,31129=>1000,31130=>1000,31131=>1000,31132=>1000,31133=>1000,31134=>1000,31135=>1000,31136=>1000,31137=>1000,31138=>1000,31139=>1000,31140=>1000,31141=>1000,31142=>1000,31143=>1000,31144=>1000,31145=>1000,31146=>1000,31147=>1000,31148=>1000,31149=>1000,31150=>1000,31151=>1000,31152=>1000,31153=>1000,31154=>1000,31155=>1000,31156=>1000,31157=>1000,31158=>1000,31159=>1000,31160=>1000,31161=>1000,31162=>1000,31163=>1000,31164=>1000,31165=>1000,31166=>1000,31167=>1000,31168=>1000,31169=>1000,31170=>1000,31171=>1000,31172=>1000,31173=>1000,31174=>1000,31175=>1000,31176=>1000,31177=>1000,31178=>1000,31179=>1000,31180=>1000,31181=>1000,31182=>1000,31183=>1000,31184=>1000,31185=>1000,31186=>1000,31187=>1000,31188=>1000,31189=>1000,31190=>1000,31191=>1000,31192=>1000,31193=>1000,31194=>1000,31195=>1000,31196=>1000,31197=>1000,31198=>1000,31199=>1000,31200=>1000,31201=>1000,31202=>1000,31203=>1000,31204=>1000,31205=>1000,31206=>1000,31207=>1000,31208=>1000,31209=>1000,31210=>1000,31211=>1000,31212=>1000,31213=>1000,31214=>1000,31215=>1000,31216=>1000,31217=>1000,31218=>1000,31219=>1000,31220=>1000,31221=>1000,31222=>1000,31223=>1000,31224=>1000,31225=>1000,31226=>1000,31227=>1000,31228=>1000,31229=>1000,31230=>1000,31231=>1000,31232=>1000,31233=>1000,31234=>1000,31235=>1000,31236=>1000,31237=>1000,31238=>1000,31239=>1000,31240=>1000,31241=>1000,31242=>1000,31243=>1000,31244=>1000,31245=>1000,31246=>1000,31247=>1000,31248=>1000,31249=>1000,31250=>1000,31251=>1000,31252=>1000,31253=>1000,31254=>1000,31255=>1000,31256=>1000,31257=>1000,31258=>1000,31259=>1000,31260=>1000,31261=>1000,31262=>1000,31263=>1000,31264=>1000,31265=>1000,31266=>1000,31267=>1000,31268=>1000,31269=>1000,31270=>1000,31271=>1000,31272=>1000,31273=>1000,31274=>1000,31275=>1000,31276=>1000,31277=>1000,31278=>1000,31279=>1000,31280=>1000,31281=>1000,31282=>1000,31283=>1000,31284=>1000,31285=>1000,31286=>1000,31287=>1000,31288=>1000,31289=>1000,31290=>1000,31291=>1000,31292=>1000,31293=>1000,31294=>1000,31295=>1000,31296=>1000,31297=>1000,31298=>1000,31299=>1000,31300=>1000,31301=>1000,31302=>1000,31303=>1000,31304=>1000,31305=>1000,31306=>1000,31307=>1000,31308=>1000,31309=>1000,31310=>1000,31311=>1000,31312=>1000,31313=>1000,31314=>1000,31315=>1000,31316=>1000,31317=>1000,31318=>1000,31319=>1000,31320=>1000,31321=>1000,31322=>1000,31323=>1000,31324=>1000,31325=>1000,31326=>1000,31327=>1000,31328=>1000,31329=>1000,31330=>1000,31331=>1000,31332=>1000,31333=>1000,31334=>1000,31335=>1000,31336=>1000,31337=>1000,31338=>1000,31339=>1000,31340=>1000,31341=>1000,31342=>1000,31343=>1000,31344=>1000,31345=>1000,31346=>1000,31347=>1000,31348=>1000,31349=>1000,31350=>1000,31351=>1000,31352=>1000,31353=>1000,31354=>1000,31355=>1000,31356=>1000,31357=>1000,31358=>1000,31359=>1000,31360=>1000,31361=>1000,31362=>1000,31363=>1000,31364=>1000,31365=>1000,31366=>1000,31367=>1000,31368=>1000,31369=>1000,31370=>1000,31371=>1000,31372=>1000,31373=>1000,31374=>1000,31375=>1000,31376=>1000,31377=>1000,31378=>1000,31379=>1000,31380=>1000,31381=>1000,31382=>1000,31383=>1000,31384=>1000,31385=>1000,31386=>1000,31387=>1000,31388=>1000,31389=>1000,31390=>1000,31391=>1000,31392=>1000,31393=>1000,31394=>1000,31395=>1000,31396=>1000,31397=>1000,31398=>1000,31399=>1000,31400=>1000,31401=>1000,31402=>1000,31403=>1000,31404=>1000,31405=>1000,31406=>1000,31407=>1000,31408=>1000,31409=>1000,31410=>1000,31411=>1000,31412=>1000,31413=>1000,31414=>1000,31415=>1000,31416=>1000,31417=>1000,31418=>1000,31419=>1000,31420=>1000,31421=>1000,31422=>1000,31423=>1000,31424=>1000,31425=>1000,31426=>1000,31427=>1000,31428=>1000,31429=>1000,31430=>1000,31431=>1000,31432=>1000,31433=>1000,31434=>1000,31435=>1000,31436=>1000,31437=>1000,31438=>1000,31439=>1000,31440=>1000,31441=>1000,31442=>1000,31443=>1000,31444=>1000,31445=>1000,31446=>1000,31447=>1000,31448=>1000,31449=>1000,31450=>1000,31451=>1000,31452=>1000,31453=>1000,31454=>1000,31455=>1000,31456=>1000,31457=>1000,31458=>1000,31459=>1000,31460=>1000,31461=>1000,31462=>1000,31463=>1000,31464=>1000,31465=>1000,31466=>1000,31467=>1000,31468=>1000,31469=>1000,31470=>1000,31471=>1000,31472=>1000,31473=>1000,31474=>1000,31475=>1000,31476=>1000,31477=>1000,31478=>1000,31479=>1000,31480=>1000,31481=>1000,31482=>1000,31483=>1000,31484=>1000,31485=>1000,31486=>1000,31487=>1000,31488=>1000,31489=>1000,31490=>1000,31491=>1000,31492=>1000,31493=>1000,31494=>1000,31495=>1000,31496=>1000,31497=>1000,31498=>1000,31499=>1000,31500=>1000,31501=>1000,31502=>1000,31503=>1000,31504=>1000,31505=>1000,31506=>1000,31507=>1000,31508=>1000,31509=>1000,31510=>1000,31511=>1000,31512=>1000,31513=>1000,31514=>1000,31515=>1000,31516=>1000,31517=>1000,31518=>1000,31519=>1000,31520=>1000,31521=>1000,31522=>1000,31523=>1000,31524=>1000,31525=>1000,31526=>1000,31527=>1000,31528=>1000,31529=>1000,31530=>1000,31531=>1000,31532=>1000,31533=>1000,31534=>1000,31535=>1000,31536=>1000,31537=>1000,31538=>1000,31539=>1000,31540=>1000,31541=>1000,31542=>1000,31543=>1000,31544=>1000,31545=>1000,31546=>1000,31547=>1000,31548=>1000,31549=>1000,31550=>1000,31551=>1000,31552=>1000,31553=>1000,31554=>1000,31555=>1000,31556=>1000,31557=>1000,31558=>1000,31559=>1000,31560=>1000,31561=>1000,31562=>1000,31563=>1000,31564=>1000,31565=>1000,31566=>1000,31567=>1000,31568=>1000,31569=>1000,31570=>1000,31571=>1000,31572=>1000,31573=>1000,31574=>1000,31575=>1000,31576=>1000,31577=>1000,31578=>1000,31579=>1000,31580=>1000,31581=>1000,31582=>1000,31583=>1000,31584=>1000,31585=>1000,31586=>1000,31587=>1000,31588=>1000,31589=>1000,31590=>1000,31591=>1000,31592=>1000,31593=>1000,31594=>1000,31595=>1000,31596=>1000,31597=>1000,31598=>1000,31599=>1000,31600=>1000,31601=>1000,31602=>1000,31603=>1000,31604=>1000,31605=>1000,31606=>1000,31607=>1000,31608=>1000,31609=>1000,31610=>1000,31611=>1000,31612=>1000,31613=>1000,31614=>1000,31615=>1000,31616=>1000,31617=>1000,31618=>1000,31619=>1000,31620=>1000,31621=>1000,31622=>1000,31623=>1000,31624=>1000,31625=>1000,31626=>1000,31627=>1000,31628=>1000,31629=>1000,31630=>1000,31631=>1000,31632=>1000,31633=>1000,31634=>1000,31635=>1000,31636=>1000,31637=>1000,31638=>1000,31639=>1000,31640=>1000,31641=>1000,31642=>1000,31643=>1000,31644=>1000,31645=>1000,31646=>1000,31647=>1000,31648=>1000,31649=>1000,31650=>1000,31651=>1000,31652=>1000,31653=>1000,31654=>1000,31655=>1000,31656=>1000,31657=>1000,31658=>1000,31659=>1000,31660=>1000,31661=>1000,31662=>1000,31663=>1000,31664=>1000,31665=>1000,31666=>1000,31667=>1000,31668=>1000,31669=>1000,31670=>1000,31671=>1000,31672=>1000,31673=>1000,31674=>1000,31675=>1000,31676=>1000,31677=>1000,31678=>1000,31679=>1000,31680=>1000,31681=>1000,31682=>1000,31683=>1000,31684=>1000,31685=>1000,31686=>1000,31687=>1000,31688=>1000,31689=>1000,31690=>1000,31691=>1000,31692=>1000,31693=>1000,31694=>1000,31695=>1000,31696=>1000,31697=>1000,31698=>1000,31699=>1000,31700=>1000,31701=>1000,31702=>1000,31703=>1000,31704=>1000,31705=>1000,31706=>1000,31707=>1000,31708=>1000,31709=>1000,31710=>1000,31711=>1000,31712=>1000,31713=>1000,31714=>1000,31715=>1000,31716=>1000,31717=>1000,31718=>1000,31719=>1000,31720=>1000,31721=>1000,31722=>1000,31723=>1000,31724=>1000,31725=>1000,31726=>1000,31727=>1000,31728=>1000,31729=>1000,31730=>1000,31731=>1000,31732=>1000,31733=>1000,31734=>1000,31735=>1000,31736=>1000,31737=>1000,31738=>1000,31739=>1000,31740=>1000,31741=>1000,31742=>1000,31743=>1000,31744=>1000,31745=>1000,31746=>1000,31747=>1000,31748=>1000,31749=>1000,31750=>1000,31751=>1000,31752=>1000,31753=>1000,31754=>1000,31755=>1000,31756=>1000,31757=>1000,31758=>1000,31759=>1000,31760=>1000,31761=>1000,31762=>1000,31763=>1000,31764=>1000,31765=>1000,31766=>1000,31767=>1000,31768=>1000,31769=>1000,31770=>1000,31771=>1000,31772=>1000,31773=>1000,31774=>1000,31775=>1000,31776=>1000,31777=>1000,31778=>1000,31779=>1000,31780=>1000,31781=>1000,31782=>1000,31783=>1000,31784=>1000,31785=>1000,31786=>1000,31787=>1000,31788=>1000,31789=>1000,31790=>1000,31791=>1000,31792=>1000,31793=>1000,31794=>1000,31795=>1000,31796=>1000,31797=>1000,31798=>1000,31799=>1000,31800=>1000,31801=>1000,31802=>1000,31803=>1000,31804=>1000,31805=>1000,31806=>1000,31807=>1000,31808=>1000,31809=>1000,31810=>1000,31811=>1000,31812=>1000,31813=>1000,31814=>1000,31815=>1000,31816=>1000,31817=>1000,31818=>1000,31819=>1000,31820=>1000,31821=>1000,31822=>1000,31823=>1000,31824=>1000,31825=>1000,31826=>1000,31827=>1000,31828=>1000,31829=>1000,31830=>1000,31831=>1000,31832=>1000,31833=>1000,31834=>1000,31835=>1000,31836=>1000,31837=>1000,31838=>1000,31839=>1000,31840=>1000,31841=>1000,31842=>1000,31843=>1000,31844=>1000,31845=>1000,31846=>1000,31847=>1000,31848=>1000,31849=>1000,31850=>1000,31851=>1000,31852=>1000,31853=>1000,31854=>1000,31855=>1000,31856=>1000,31857=>1000,31858=>1000,31859=>1000,31860=>1000,31861=>1000,31862=>1000,31863=>1000,31864=>1000,31865=>1000,31866=>1000,31867=>1000,31868=>1000,31869=>1000,31870=>1000,31871=>1000,31872=>1000,31873=>1000,31874=>1000,31875=>1000,31876=>1000,31877=>1000,31878=>1000,31879=>1000,31880=>1000,31881=>1000,31882=>1000,31883=>1000,31884=>1000,31885=>1000,31886=>1000,31887=>1000,31888=>1000,31889=>1000,31890=>1000,31891=>1000,31892=>1000,31893=>1000,31894=>1000,31895=>1000,31896=>1000,31897=>1000,31898=>1000,31899=>1000,31900=>1000,31901=>1000,31902=>1000,31903=>1000,31904=>1000,31905=>1000,31906=>1000,31907=>1000,31908=>1000,31909=>1000,31910=>1000,31911=>1000,31912=>1000,31913=>1000,31914=>1000,31915=>1000,31916=>1000,31917=>1000,31918=>1000,31919=>1000,31920=>1000,31921=>1000,31922=>1000,31923=>1000,31924=>1000,31925=>1000,31926=>1000,31927=>1000,31928=>1000,31929=>1000,31930=>1000,31931=>1000,31932=>1000,31933=>1000,31934=>1000,31935=>1000,31936=>1000,31937=>1000,31938=>1000,31939=>1000,31940=>1000,31941=>1000,31942=>1000,31943=>1000,31944=>1000,31945=>1000,31946=>1000,31947=>1000,31948=>1000,31949=>1000,31950=>1000,31951=>1000,31952=>1000,31953=>1000,31954=>1000,31955=>1000,31956=>1000,31957=>1000,31958=>1000,31959=>1000,31960=>1000,31961=>1000,31962=>1000,31963=>1000,31964=>1000,31965=>1000,31966=>1000,31967=>1000,31968=>1000,31969=>1000,31970=>1000,31971=>1000,31972=>1000,31973=>1000,31974=>1000,31975=>1000,31976=>1000,31977=>1000,31978=>1000,31979=>1000,31980=>1000,31981=>1000,31982=>1000,31983=>1000,31984=>1000,31985=>1000,31986=>1000,31987=>1000,31988=>1000,31989=>1000,31990=>1000,31991=>1000,31992=>1000,31993=>1000,31994=>1000,31995=>1000,31996=>1000,31997=>1000,31998=>1000,31999=>1000,32000=>1000,32001=>1000,32002=>1000,32003=>1000,32004=>1000,32005=>1000,32006=>1000,32007=>1000,32008=>1000,32009=>1000,32010=>1000,32011=>1000,32012=>1000,32013=>1000,32014=>1000,32015=>1000,32016=>1000,32017=>1000,32018=>1000,32019=>1000,32020=>1000,32021=>1000,32022=>1000,32023=>1000,32024=>1000,32025=>1000,32026=>1000,32027=>1000,32028=>1000,32029=>1000,32030=>1000,32031=>1000,32032=>1000,32033=>1000,32034=>1000,32035=>1000,32036=>1000,32037=>1000,32038=>1000,32039=>1000,32040=>1000,32041=>1000,32042=>1000,32043=>1000,32044=>1000,32045=>1000,32046=>1000,32047=>1000,32048=>1000,32049=>1000,32050=>1000,32051=>1000,32052=>1000,32053=>1000,32054=>1000,32055=>1000,32056=>1000,32057=>1000,32058=>1000,32059=>1000,32060=>1000,32061=>1000,32062=>1000,32063=>1000,32064=>1000,32065=>1000,32066=>1000,32067=>1000,32068=>1000,32069=>1000,32070=>1000,32071=>1000,32072=>1000,32073=>1000,32074=>1000,32075=>1000,32076=>1000,32077=>1000,32078=>1000,32079=>1000,32080=>1000,32081=>1000,32082=>1000,32083=>1000,32084=>1000,32085=>1000,32086=>1000,32087=>1000,32088=>1000,32089=>1000,32090=>1000,32091=>1000,32092=>1000,32093=>1000,32094=>1000,32095=>1000,32096=>1000,32097=>1000,32098=>1000,32099=>1000,32100=>1000,32101=>1000,32102=>1000,32103=>1000,32104=>1000,32105=>1000,32106=>1000,32107=>1000,32108=>1000,32109=>1000,32110=>1000,32111=>1000,32112=>1000,32113=>1000,32114=>1000,32115=>1000,32116=>1000,32117=>1000,32118=>1000,32119=>1000,32120=>1000,32121=>1000,32122=>1000,32123=>1000,32124=>1000,32125=>1000,32126=>1000,32127=>1000,32128=>1000,32129=>1000,32130=>1000,32131=>1000,32132=>1000,32133=>1000,32134=>1000,32135=>1000,32136=>1000,32137=>1000,32138=>1000,32139=>1000,32140=>1000,32141=>1000,32142=>1000,32143=>1000,32144=>1000,32145=>1000,32146=>1000,32147=>1000,32148=>1000,32149=>1000,32150=>1000,32151=>1000,32152=>1000,32153=>1000,32154=>1000,32155=>1000,32156=>1000,32157=>1000,32158=>1000,32159=>1000,32160=>1000,32161=>1000,32162=>1000,32163=>1000,32164=>1000,32165=>1000,32166=>1000,32167=>1000,32168=>1000,32169=>1000,32170=>1000,32171=>1000,32172=>1000,32173=>1000,32174=>1000,32175=>1000,32176=>1000,32177=>1000,32178=>1000,32179=>1000,32180=>1000,32181=>1000,32182=>1000,32183=>1000,32184=>1000,32185=>1000,32186=>1000,32187=>1000,32188=>1000,32189=>1000,32190=>1000,32191=>1000,32192=>1000,32193=>1000,32194=>1000,32195=>1000,32196=>1000,32197=>1000,32198=>1000,32199=>1000,32200=>1000,32201=>1000,32202=>1000,32203=>1000,32204=>1000,32205=>1000,32206=>1000,32207=>1000,32208=>1000,32209=>1000,32210=>1000,32211=>1000,32212=>1000,32213=>1000,32214=>1000,32215=>1000,32216=>1000,32217=>1000,32218=>1000,32219=>1000,32220=>1000,32221=>1000,32222=>1000,32223=>1000,32224=>1000,32225=>1000,32226=>1000,32227=>1000,32228=>1000,32229=>1000,32230=>1000,32231=>1000,32232=>1000,32233=>1000,32234=>1000,32235=>1000,32236=>1000,32237=>1000,32238=>1000,32239=>1000,32240=>1000,32241=>1000,32242=>1000,32243=>1000,32244=>1000,32245=>1000,32246=>1000,32247=>1000,32248=>1000,32249=>1000,32250=>1000,32251=>1000,32252=>1000,32253=>1000,32254=>1000,32255=>1000,32256=>1000,32257=>1000,32258=>1000,32259=>1000,32260=>1000,32261=>1000,32262=>1000,32263=>1000,32264=>1000,32265=>1000,32266=>1000,32267=>1000,32268=>1000,32269=>1000,32270=>1000,32271=>1000,32272=>1000,32273=>1000,32274=>1000,32275=>1000,32276=>1000,32277=>1000,32278=>1000,32279=>1000,32280=>1000,32281=>1000,32282=>1000,32283=>1000,32284=>1000,32285=>1000,32286=>1000,32287=>1000,32288=>1000,32289=>1000,32290=>1000,32291=>1000,32292=>1000,32293=>1000,32294=>1000,32295=>1000,32296=>1000,32297=>1000,32298=>1000,32299=>1000,32300=>1000,32301=>1000,32302=>1000,32303=>1000,32304=>1000,32305=>1000,32306=>1000,32307=>1000,32308=>1000,32309=>1000,32310=>1000,32311=>1000,32312=>1000,32313=>1000,32314=>1000,32315=>1000,32316=>1000,32317=>1000,32318=>1000,32319=>1000,32320=>1000,32321=>1000,32322=>1000,32323=>1000,32324=>1000,32325=>1000,32326=>1000,32327=>1000,32328=>1000,32329=>1000,32330=>1000,32331=>1000,32332=>1000,32333=>1000,32334=>1000,32335=>1000,32336=>1000,32337=>1000,32338=>1000,32339=>1000,32340=>1000,32341=>1000,32342=>1000,32343=>1000,32344=>1000,32345=>1000,32346=>1000,32347=>1000,32348=>1000,32349=>1000,32350=>1000,32351=>1000,32352=>1000,32353=>1000,32354=>1000,32355=>1000,32356=>1000,32357=>1000,32358=>1000,32359=>1000,32360=>1000,32361=>1000,32362=>1000,32363=>1000,32364=>1000,32365=>1000,32366=>1000,32367=>1000,32368=>1000,32369=>1000,32370=>1000,32371=>1000,32372=>1000,32373=>1000,32374=>1000,32375=>1000,32376=>1000,32377=>1000,32378=>1000,32379=>1000,32380=>1000,32381=>1000,32382=>1000,32383=>1000,32384=>1000,32385=>1000,32386=>1000,32387=>1000,32388=>1000,32389=>1000,32390=>1000,32391=>1000,32392=>1000,32393=>1000,32394=>1000,32395=>1000,32396=>1000,32397=>1000,32398=>1000,32399=>1000,32400=>1000,32401=>1000,32402=>1000,32403=>1000,32404=>1000,32405=>1000,32406=>1000,32407=>1000,32408=>1000,32409=>1000,32410=>1000,32411=>1000,32412=>1000,32413=>1000,32414=>1000,32415=>1000,32416=>1000,32417=>1000,32418=>1000,32419=>1000,32420=>1000,32421=>1000,32422=>1000,32423=>1000,32424=>1000,32425=>1000,32426=>1000,32427=>1000,32428=>1000,32429=>1000,32430=>1000,32431=>1000,32432=>1000,32433=>1000,32434=>1000,32435=>1000,32436=>1000,32437=>1000,32438=>1000,32439=>1000,32440=>1000,32441=>1000,32442=>1000,32443=>1000,32444=>1000,32445=>1000,32446=>1000,32447=>1000,32448=>1000,32449=>1000,32450=>1000,32451=>1000,32452=>1000,32453=>1000,32454=>1000,32455=>1000,32456=>1000,32457=>1000,32458=>1000,32459=>1000,32460=>1000,32461=>1000,32462=>1000,32463=>1000,32464=>1000,32465=>1000,32466=>1000,32467=>1000,32468=>1000,32469=>1000,32470=>1000,32471=>1000,32472=>1000,32473=>1000,32474=>1000,32475=>1000,32476=>1000,32477=>1000,32478=>1000,32479=>1000,32480=>1000,32481=>1000,32482=>1000,32483=>1000,32484=>1000,32485=>1000,32486=>1000,32487=>1000,32488=>1000,32489=>1000,32490=>1000,32491=>1000,32492=>1000,32493=>1000,32494=>1000,32495=>1000,32496=>1000,32497=>1000,32498=>1000,32499=>1000,32500=>1000,32501=>1000,32502=>1000,32503=>1000,32504=>1000,32505=>1000,32506=>1000,32507=>1000,32508=>1000,32509=>1000,32510=>1000,32511=>1000,32512=>1000,32513=>1000,32514=>1000,32515=>1000,32516=>1000,32517=>1000,32518=>1000,32519=>1000,32520=>1000,32521=>1000,32522=>1000,32523=>1000,32524=>1000,32525=>1000,32526=>1000,32527=>1000,32528=>1000,32529=>1000,32530=>1000,32531=>1000,32532=>1000,32533=>1000,32534=>1000,32535=>1000,32536=>1000,32537=>1000,32538=>1000,32539=>1000,32540=>1000,32541=>1000,32542=>1000,32543=>1000,32544=>1000,32545=>1000,32546=>1000,32547=>1000,32548=>1000,32549=>1000,32550=>1000,32551=>1000,32552=>1000,32553=>1000,32554=>1000,32555=>1000,32556=>1000,32557=>1000,32558=>1000,32559=>1000,32560=>1000,32561=>1000,32562=>1000,32563=>1000,32564=>1000,32565=>1000,32566=>1000,32567=>1000,32568=>1000,32569=>1000,32570=>1000,32571=>1000,32572=>1000,32573=>1000,32574=>1000,32575=>1000,32576=>1000,32577=>1000,32578=>1000,32579=>1000,32580=>1000,32581=>1000,32582=>1000,32583=>1000,32584=>1000,32585=>1000,32586=>1000,32587=>1000,32588=>1000,32589=>1000,32590=>1000,32591=>1000,32592=>1000,32593=>1000,32594=>1000,32595=>1000,32596=>1000,32597=>1000,32598=>1000,32599=>1000,32600=>1000,32601=>1000,32602=>1000,32603=>1000,32604=>1000,32605=>1000,32606=>1000,32607=>1000,32608=>1000,32609=>1000,32610=>1000,32611=>1000,32612=>1000,32613=>1000,32614=>1000,32615=>1000,32616=>1000,32617=>1000,32618=>1000,32619=>1000,32620=>1000,32621=>1000,32622=>1000,32623=>1000,32624=>1000,32625=>1000,32626=>1000,32627=>1000,32628=>1000,32629=>1000,32630=>1000,32631=>1000,32632=>1000,32633=>1000,32634=>1000,32635=>1000,32636=>1000,32637=>1000,32638=>1000,32639=>1000,32640=>1000,32641=>1000,32642=>1000,32643=>1000,32644=>1000,32645=>1000,32646=>1000,32647=>1000,32648=>1000,32649=>1000,32650=>1000,32651=>1000,32652=>1000,32653=>1000,32654=>1000,32655=>1000,32656=>1000,32657=>1000,32658=>1000,32659=>1000,32660=>1000,32661=>1000,32662=>1000,32663=>1000,32664=>1000,32665=>1000,32666=>1000,32667=>1000,32668=>1000,32669=>1000,32670=>1000,32671=>1000,32672=>1000,32673=>1000,32674=>1000,32675=>1000,32676=>1000,32677=>1000,32678=>1000,32679=>1000,32680=>1000,32681=>1000,32682=>1000,32683=>1000,32684=>1000,32685=>1000,32686=>1000,32687=>1000,32688=>1000,32689=>1000,32690=>1000,32691=>1000,32692=>1000,32693=>1000,32694=>1000,32695=>1000,32696=>1000,32697=>1000,32698=>1000,32699=>1000,32700=>1000,32701=>1000,32702=>1000,32703=>1000,32704=>1000,32705=>1000,32706=>1000,32707=>1000,32708=>1000,32709=>1000,32710=>1000,32711=>1000,32712=>1000,32713=>1000,32714=>1000,32715=>1000,32716=>1000,32717=>1000,32718=>1000,32719=>1000,32720=>1000,32721=>1000,32722=>1000,32723=>1000,32724=>1000,32725=>1000,32726=>1000,32727=>1000,32728=>1000,32729=>1000,32730=>1000,32731=>1000,32732=>1000,32733=>1000,32734=>1000,32735=>1000,32736=>1000,32737=>1000,32738=>1000,32739=>1000,32740=>1000,32741=>1000,32742=>1000,32743=>1000,32744=>1000,32745=>1000,32746=>1000,32747=>1000,32748=>1000,32749=>1000,32750=>1000,32751=>1000,32752=>1000,32753=>1000,32754=>1000,32755=>1000,32756=>1000,32757=>1000,32758=>1000,32759=>1000,32760=>1000,32761=>1000,32762=>1000,32763=>1000,32764=>1000,32765=>1000,32766=>1000,32767=>1000,32768=>1000,32769=>1000,32770=>1000,32771=>1000,32772=>1000,32773=>1000,32774=>1000,32775=>1000,32776=>1000,32777=>1000,32778=>1000,32779=>1000,32780=>1000,32781=>1000,32782=>1000,32783=>1000,32784=>1000,32785=>1000,32786=>1000,32787=>1000,32788=>1000,32789=>1000,32790=>1000,32791=>1000,32792=>1000,32793=>1000,32794=>1000,32795=>1000,32796=>1000,32797=>1000,32798=>1000,32799=>1000,32800=>1000,32801=>1000,32802=>1000,32803=>1000,32804=>1000,32805=>1000,32806=>1000,32807=>1000,32808=>1000,32809=>1000,32810=>1000,32811=>1000,32812=>1000,32813=>1000,32814=>1000,32815=>1000,32816=>1000,32817=>1000,32818=>1000,32819=>1000,32820=>1000,32821=>1000,32822=>1000,32823=>1000,32824=>1000,32825=>1000,32826=>1000,32827=>1000,32828=>1000,32829=>1000,32830=>1000,32831=>1000,32832=>1000,32833=>1000,32834=>1000,32835=>1000,32836=>1000,32837=>1000,32838=>1000,32839=>1000,32840=>1000,32841=>1000,32842=>1000,32843=>1000,32844=>1000,32845=>1000,32846=>1000,32847=>1000,32848=>1000,32849=>1000,32850=>1000,32851=>1000,32852=>1000,32853=>1000,32854=>1000,32855=>1000,32856=>1000,32857=>1000,32858=>1000,32859=>1000,32860=>1000,32861=>1000,32862=>1000,32863=>1000,32864=>1000,32865=>1000,32866=>1000,32867=>1000,32868=>1000,32869=>1000,32870=>1000,32871=>1000,32872=>1000,32873=>1000,32874=>1000,32875=>1000,32876=>1000,32877=>1000,32878=>1000,32879=>1000,32880=>1000,32881=>1000,32882=>1000,32883=>1000,32884=>1000,32885=>1000,32886=>1000,32887=>1000,32888=>1000,32889=>1000,32890=>1000,32891=>1000,32892=>1000,32893=>1000,32894=>1000,32895=>1000,32896=>1000,32897=>1000,32898=>1000,32899=>1000,32900=>1000,32901=>1000,32902=>1000,32903=>1000,32904=>1000,32905=>1000,32906=>1000,32907=>1000,32908=>1000,32909=>1000,32910=>1000,32911=>1000,32912=>1000,32913=>1000,32914=>1000,32915=>1000,32916=>1000,32917=>1000,32918=>1000,32919=>1000,32920=>1000,32921=>1000,32922=>1000,32923=>1000,32924=>1000,32925=>1000,32926=>1000,32927=>1000,32928=>1000,32929=>1000,32930=>1000,32931=>1000,32932=>1000,32933=>1000,32934=>1000,32935=>1000,32936=>1000,32937=>1000,32938=>1000,32939=>1000,32940=>1000,32941=>1000,32942=>1000,32943=>1000,32944=>1000,32945=>1000,32946=>1000,32947=>1000,32948=>1000,32949=>1000,32950=>1000,32951=>1000,32952=>1000,32953=>1000,32954=>1000,32955=>1000,32956=>1000,32957=>1000,32958=>1000,32959=>1000,32960=>1000,32961=>1000,32962=>1000,32963=>1000,32964=>1000,32965=>1000,32966=>1000,32967=>1000,32968=>1000,32969=>1000,32970=>1000,32971=>1000,32972=>1000,32973=>1000,32974=>1000,32975=>1000,32976=>1000,32977=>1000,32978=>1000,32979=>1000,32980=>1000,32981=>1000,32982=>1000,32983=>1000,32984=>1000,32985=>1000,32986=>1000,32987=>1000,32988=>1000,32989=>1000,32990=>1000,32991=>1000,32992=>1000,32993=>1000,32994=>1000,32995=>1000,32996=>1000,32997=>1000,32998=>1000,32999=>1000,33000=>1000,33001=>1000,33002=>1000,33003=>1000,33004=>1000,33005=>1000,33006=>1000,33007=>1000,33008=>1000,33009=>1000,33010=>1000,33011=>1000,33012=>1000,33013=>1000,33014=>1000,33015=>1000,33016=>1000,33017=>1000,33018=>1000,33019=>1000,33020=>1000,33021=>1000,33022=>1000,33023=>1000,33024=>1000,33025=>1000,33026=>1000,33027=>1000,33028=>1000,33029=>1000,33030=>1000,33031=>1000,33032=>1000,33033=>1000,33034=>1000,33035=>1000,33036=>1000,33037=>1000,33038=>1000,33039=>1000,33040=>1000,33041=>1000,33042=>1000,33043=>1000,33044=>1000,33045=>1000,33046=>1000,33047=>1000,33048=>1000,33049=>1000,33050=>1000,33051=>1000,33052=>1000,33053=>1000,33054=>1000,33055=>1000,33056=>1000,33057=>1000,33058=>1000,33059=>1000,33060=>1000,33061=>1000,33062=>1000,33063=>1000,33064=>1000,33065=>1000,33066=>1000,33067=>1000,33068=>1000,33069=>1000,33070=>1000,33071=>1000,33072=>1000,33073=>1000,33074=>1000,33075=>1000,33076=>1000,33077=>1000,33078=>1000,33079=>1000,33080=>1000,33081=>1000,33082=>1000,33083=>1000,33084=>1000,33085=>1000,33086=>1000,33087=>1000,33088=>1000,33089=>1000,33090=>1000,33091=>1000,33092=>1000,33093=>1000,33094=>1000,33095=>1000,33096=>1000,33097=>1000,33098=>1000,33099=>1000,33100=>1000,33101=>1000,33102=>1000,33103=>1000,33104=>1000,33105=>1000,33106=>1000,33107=>1000,33108=>1000,33109=>1000,33110=>1000,33111=>1000,33112=>1000,33113=>1000,33114=>1000,33115=>1000,33116=>1000,33117=>1000,33118=>1000,33119=>1000,33120=>1000,33121=>1000,33122=>1000,33123=>1000,33124=>1000,33125=>1000,33126=>1000,33127=>1000,33128=>1000,33129=>1000,33130=>1000,33131=>1000,33132=>1000,33133=>1000,33134=>1000,33135=>1000,33136=>1000,33137=>1000,33138=>1000,33139=>1000,33140=>1000,33141=>1000,33142=>1000,33143=>1000,33144=>1000,33145=>1000,33146=>1000,33147=>1000,33148=>1000,33149=>1000,33150=>1000,33151=>1000,33152=>1000,33153=>1000,33154=>1000,33155=>1000,33156=>1000,33157=>1000,33158=>1000,33159=>1000,33160=>1000,33161=>1000,33162=>1000,33163=>1000,33164=>1000,33165=>1000,33166=>1000,33167=>1000,33168=>1000,33169=>1000,33170=>1000,33171=>1000,33172=>1000,33173=>1000,33174=>1000,33175=>1000,33176=>1000,33177=>1000,33178=>1000,33179=>1000,33180=>1000,33181=>1000,33182=>1000,33183=>1000,33184=>1000,33185=>1000,33186=>1000,33187=>1000,33188=>1000,33189=>1000,33190=>1000,33191=>1000,33192=>1000,33193=>1000,33194=>1000,33195=>1000,33196=>1000,33197=>1000,33198=>1000,33199=>1000,33200=>1000,33201=>1000,33202=>1000,33203=>1000,33204=>1000,33205=>1000,33206=>1000,33207=>1000,33208=>1000,33209=>1000,33210=>1000,33211=>1000,33212=>1000,33213=>1000,33214=>1000,33215=>1000,33216=>1000,33217=>1000,33218=>1000,33219=>1000,33220=>1000,33221=>1000,33222=>1000,33223=>1000,33224=>1000,33225=>1000,33226=>1000,33227=>1000,33228=>1000,33229=>1000,33230=>1000,33231=>1000,33232=>1000,33233=>1000,33234=>1000,33235=>1000,33236=>1000,33237=>1000,33238=>1000,33239=>1000,33240=>1000,33241=>1000,33242=>1000,33243=>1000,33244=>1000,33245=>1000,33246=>1000,33247=>1000,33248=>1000,33249=>1000,33250=>1000,33251=>1000,33252=>1000,33253=>1000,33254=>1000,33255=>1000,33256=>1000,33257=>1000,33258=>1000,33259=>1000,33260=>1000,33261=>1000,33262=>1000,33263=>1000,33264=>1000,33265=>1000,33266=>1000,33267=>1000,33268=>1000,33269=>1000,33270=>1000,33271=>1000,33272=>1000,33273=>1000,33274=>1000,33275=>1000,33276=>1000,33277=>1000,33278=>1000,33279=>1000,33280=>1000,33281=>1000,33282=>1000,33283=>1000,33284=>1000,33285=>1000,33286=>1000,33287=>1000,33288=>1000,33289=>1000,33290=>1000,33291=>1000,33292=>1000,33293=>1000,33294=>1000,33295=>1000,33296=>1000,33297=>1000,33298=>1000,33299=>1000,33300=>1000,33301=>1000,33302=>1000,33303=>1000,33304=>1000,33305=>1000,33306=>1000,33307=>1000,33308=>1000,33309=>1000,33310=>1000,33311=>1000,33312=>1000,33313=>1000,33314=>1000,33315=>1000,33316=>1000,33317=>1000,33318=>1000,33319=>1000,33320=>1000,33321=>1000,33322=>1000,33323=>1000,33324=>1000,33325=>1000,33326=>1000,33327=>1000,33328=>1000,33329=>1000,33330=>1000,33331=>1000,33332=>1000,33333=>1000,33334=>1000,33335=>1000,33336=>1000,33337=>1000,33338=>1000,33339=>1000,33340=>1000,33341=>1000,33342=>1000,33343=>1000,33344=>1000,33345=>1000,33346=>1000,33347=>1000,33348=>1000,33349=>1000,33350=>1000,33351=>1000,33352=>1000,33353=>1000,33354=>1000,33355=>1000,33356=>1000,33357=>1000,33358=>1000,33359=>1000,33360=>1000,33361=>1000,33362=>1000,33363=>1000,33364=>1000,33365=>1000,33366=>1000,33367=>1000,33368=>1000,33369=>1000,33370=>1000,33371=>1000,33372=>1000,33373=>1000,33374=>1000,33375=>1000,33376=>1000,33377=>1000,33378=>1000,33379=>1000,33380=>1000,33381=>1000,33382=>1000,33383=>1000,33384=>1000,33385=>1000,33386=>1000,33387=>1000,33388=>1000,33389=>1000,33390=>1000,33391=>1000,33392=>1000,33393=>1000,33394=>1000,33395=>1000,33396=>1000,33397=>1000,33398=>1000,33399=>1000,33400=>1000,33401=>1000,33402=>1000,33403=>1000,33404=>1000,33405=>1000,33406=>1000,33407=>1000,33408=>1000,33409=>1000,33410=>1000,33411=>1000,33412=>1000,33413=>1000,33414=>1000,33415=>1000,33416=>1000,33417=>1000,33418=>1000,33419=>1000,33420=>1000,33421=>1000,33422=>1000,33423=>1000,33424=>1000,33425=>1000,33426=>1000,33427=>1000,33428=>1000,33429=>1000,33430=>1000,33431=>1000,33432=>1000,33433=>1000,33434=>1000,33435=>1000,33436=>1000,33437=>1000,33438=>1000,33439=>1000,33440=>1000,33441=>1000,33442=>1000,33443=>1000,33444=>1000,33445=>1000,33446=>1000,33447=>1000,33448=>1000,33449=>1000,33450=>1000,33451=>1000,33452=>1000,33453=>1000,33454=>1000,33455=>1000,33456=>1000,33457=>1000,33458=>1000,33459=>1000,33460=>1000,33461=>1000,33462=>1000,33463=>1000,33464=>1000,33465=>1000,33466=>1000,33467=>1000,33468=>1000,33469=>1000,33470=>1000,33471=>1000,33472=>1000,33473=>1000,33474=>1000,33475=>1000,33476=>1000,33477=>1000,33478=>1000,33479=>1000,33480=>1000,33481=>1000,33482=>1000,33483=>1000,33484=>1000,33485=>1000,33486=>1000,33487=>1000,33488=>1000,33489=>1000,33490=>1000,33491=>1000,33492=>1000,33493=>1000,33494=>1000,33495=>1000,33496=>1000,33497=>1000,33498=>1000,33499=>1000,33500=>1000,33501=>1000,33502=>1000,33503=>1000,33504=>1000,33505=>1000,33506=>1000,33507=>1000,33508=>1000,33509=>1000,33510=>1000,33511=>1000,33512=>1000,33513=>1000,33514=>1000,33515=>1000,33516=>1000,33517=>1000,33518=>1000,33519=>1000,33520=>1000,33521=>1000,33522=>1000,33523=>1000,33524=>1000,33525=>1000,33526=>1000,33527=>1000,33528=>1000,33529=>1000,33530=>1000,33531=>1000,33532=>1000,33533=>1000,33534=>1000,33535=>1000,33536=>1000,33537=>1000,33538=>1000,33539=>1000,33540=>1000,33541=>1000,33542=>1000,33543=>1000,33544=>1000,33545=>1000,33546=>1000,33547=>1000,33548=>1000,33549=>1000,33550=>1000,33551=>1000,33552=>1000,33553=>1000,33554=>1000,33555=>1000,33556=>1000,33557=>1000,33558=>1000,33559=>1000,33560=>1000,33561=>1000,33562=>1000,33563=>1000,33564=>1000,33565=>1000,33566=>1000,33567=>1000,33568=>1000,33569=>1000,33570=>1000,33571=>1000,33572=>1000,33573=>1000,33574=>1000,33575=>1000,33576=>1000,33577=>1000,33578=>1000,33579=>1000,33580=>1000,33581=>1000,33582=>1000,33583=>1000,33584=>1000,33585=>1000,33586=>1000,33587=>1000,33588=>1000,33589=>1000,33590=>1000,33591=>1000,33592=>1000,33593=>1000,33594=>1000,33595=>1000,33596=>1000,33597=>1000,33598=>1000,33599=>1000,33600=>1000,33601=>1000,33602=>1000,33603=>1000,33604=>1000,33605=>1000,33606=>1000,33607=>1000,33608=>1000,33609=>1000,33610=>1000,33611=>1000,33612=>1000,33613=>1000,33614=>1000,33615=>1000,33616=>1000,33617=>1000,33618=>1000,33619=>1000,33620=>1000,33621=>1000,33622=>1000,33623=>1000,33624=>1000,33625=>1000,33626=>1000,33627=>1000,33628=>1000,33629=>1000,33630=>1000,33631=>1000,33632=>1000,33633=>1000,33634=>1000,33635=>1000,33636=>1000,33637=>1000,33638=>1000,33639=>1000,33640=>1000,33641=>1000,33642=>1000,33643=>1000,33644=>1000,33645=>1000,33646=>1000,33647=>1000,33648=>1000,33649=>1000,33650=>1000,33651=>1000,33652=>1000,33653=>1000,33654=>1000,33655=>1000,33656=>1000,33657=>1000,33658=>1000,33659=>1000,33660=>1000,33661=>1000,33662=>1000,33663=>1000,33664=>1000,33665=>1000,33666=>1000,33667=>1000,33668=>1000,33669=>1000,33670=>1000,33671=>1000,33672=>1000,33673=>1000,33674=>1000,33675=>1000,33676=>1000,33677=>1000,33678=>1000,33679=>1000,33680=>1000,33681=>1000,33682=>1000,33683=>1000,33684=>1000,33685=>1000,33686=>1000,33687=>1000,33688=>1000,33689=>1000,33690=>1000,33691=>1000,33692=>1000,33693=>1000,33694=>1000,33695=>1000,33696=>1000,33697=>1000,33698=>1000,33699=>1000,33700=>1000,33701=>1000,33702=>1000,33703=>1000,33704=>1000,33705=>1000,33706=>1000,33707=>1000,33708=>1000,33709=>1000,33710=>1000,33711=>1000,33712=>1000,33713=>1000,33714=>1000,33715=>1000,33716=>1000,33717=>1000,33718=>1000,33719=>1000,33720=>1000,33721=>1000,33722=>1000,33723=>1000,33724=>1000,33725=>1000,33726=>1000,33727=>1000,33728=>1000,33729=>1000,33730=>1000,33731=>1000,33732=>1000,33733=>1000,33734=>1000,33735=>1000,33736=>1000,33737=>1000,33738=>1000,33739=>1000,33740=>1000,33741=>1000,33742=>1000,33743=>1000,33744=>1000,33745=>1000,33746=>1000,33747=>1000,33748=>1000,33749=>1000,33750=>1000,33751=>1000,33752=>1000,33753=>1000,33754=>1000,33755=>1000,33756=>1000,33757=>1000,33758=>1000,33759=>1000,33760=>1000,33761=>1000,33762=>1000,33763=>1000,33764=>1000,33765=>1000,33766=>1000,33767=>1000,33768=>1000,33769=>1000,33770=>1000,33771=>1000,33772=>1000,33773=>1000,33774=>1000,33775=>1000,33776=>1000,33777=>1000,33778=>1000,33779=>1000,33780=>1000,33781=>1000,33782=>1000,33783=>1000,33784=>1000,33785=>1000,33786=>1000,33787=>1000,33788=>1000,33789=>1000,33790=>1000,33791=>1000,33792=>1000,33793=>1000,33794=>1000,33795=>1000,33796=>1000,33797=>1000,33798=>1000,33799=>1000,33800=>1000,33801=>1000,33802=>1000,33803=>1000,33804=>1000,33805=>1000,33806=>1000,33807=>1000,33808=>1000,33809=>1000,33810=>1000,33811=>1000,33812=>1000,33813=>1000,33814=>1000,33815=>1000,33816=>1000,33817=>1000,33818=>1000,33819=>1000,33820=>1000,33821=>1000,33822=>1000,33823=>1000,33824=>1000,33825=>1000,33826=>1000,33827=>1000,33828=>1000,33829=>1000,33830=>1000,33831=>1000,33832=>1000,33833=>1000,33834=>1000,33835=>1000,33836=>1000,33837=>1000,33838=>1000,33839=>1000,33840=>1000,33841=>1000,33842=>1000,33843=>1000,33844=>1000,33845=>1000,33846=>1000,33847=>1000,33848=>1000,33849=>1000,33850=>1000,33851=>1000,33852=>1000,33853=>1000,33854=>1000,33855=>1000,33856=>1000,33857=>1000,33858=>1000,33859=>1000,33860=>1000,33861=>1000,33862=>1000,33863=>1000,33864=>1000,33865=>1000,33866=>1000,33867=>1000,33868=>1000,33869=>1000,33870=>1000,33871=>1000,33872=>1000,33873=>1000,33874=>1000,33875=>1000,33876=>1000,33877=>1000,33878=>1000,33879=>1000,33880=>1000,33881=>1000,33882=>1000,33883=>1000,33884=>1000,33885=>1000,33886=>1000,33887=>1000,33888=>1000,33889=>1000,33890=>1000,33891=>1000,33892=>1000,33893=>1000,33894=>1000,33895=>1000,33896=>1000,33897=>1000,33898=>1000,33899=>1000,33900=>1000,33901=>1000,33902=>1000,33903=>1000,33904=>1000,33905=>1000,33906=>1000,33907=>1000,33908=>1000,33909=>1000,33910=>1000,33911=>1000,33912=>1000,33913=>1000,33914=>1000,33915=>1000,33916=>1000,33917=>1000,33918=>1000,33919=>1000,33920=>1000,33921=>1000,33922=>1000,33923=>1000,33924=>1000,33925=>1000,33926=>1000,33927=>1000,33928=>1000,33929=>1000,33930=>1000,33931=>1000,33932=>1000,33933=>1000,33934=>1000,33935=>1000,33936=>1000,33937=>1000,33938=>1000,33939=>1000,33940=>1000,33941=>1000,33942=>1000,33943=>1000,33944=>1000,33945=>1000,33946=>1000,33947=>1000,33948=>1000,33949=>1000,33950=>1000,33951=>1000,33952=>1000,33953=>1000,33954=>1000,33955=>1000,33956=>1000,33957=>1000,33958=>1000,33959=>1000,33960=>1000,33961=>1000,33962=>1000,33963=>1000,33964=>1000,33965=>1000,33966=>1000,33967=>1000,33968=>1000,33969=>1000,33970=>1000,33971=>1000,33972=>1000,33973=>1000,33974=>1000,33975=>1000,33976=>1000,33977=>1000,33978=>1000,33979=>1000,33980=>1000,33981=>1000,33982=>1000,33983=>1000,33984=>1000,33985=>1000,33986=>1000,33987=>1000,33988=>1000,33989=>1000,33990=>1000,33991=>1000,33992=>1000,33993=>1000,33994=>1000,33995=>1000,33996=>1000,33997=>1000,33998=>1000,33999=>1000,34000=>1000,34001=>1000,34002=>1000,34003=>1000,34004=>1000,34005=>1000,34006=>1000,34007=>1000,34008=>1000,34009=>1000,34010=>1000,34011=>1000,34012=>1000,34013=>1000,34014=>1000,34015=>1000,34016=>1000,34017=>1000,34018=>1000,34019=>1000,34020=>1000,34021=>1000,34022=>1000,34023=>1000,34024=>1000,34025=>1000,34026=>1000,34027=>1000,34028=>1000,34029=>1000,34030=>1000,34031=>1000,34032=>1000,34033=>1000,34034=>1000,34035=>1000,34036=>1000,34037=>1000,34038=>1000,34039=>1000,34040=>1000,34041=>1000,34042=>1000,34043=>1000,34044=>1000,34045=>1000,34046=>1000,34047=>1000,34048=>1000,34049=>1000,34050=>1000,34051=>1000,34052=>1000,34053=>1000,34054=>1000,34055=>1000,34056=>1000,34057=>1000,34058=>1000,34059=>1000,34060=>1000,34061=>1000,34062=>1000,34063=>1000,34064=>1000,34065=>1000,34066=>1000,34067=>1000,34068=>1000,34069=>1000,34070=>1000,34071=>1000,34072=>1000,34073=>1000,34074=>1000,34075=>1000,34076=>1000,34077=>1000,34078=>1000,34079=>1000,34080=>1000,34081=>1000,34082=>1000,34083=>1000,34084=>1000,34085=>1000,34086=>1000,34087=>1000,34088=>1000,34089=>1000,34090=>1000,34091=>1000,34092=>1000,34093=>1000,34094=>1000,34095=>1000,34096=>1000,34097=>1000,34098=>1000,34099=>1000,34100=>1000,34101=>1000,34102=>1000,34103=>1000,34104=>1000,34105=>1000,34106=>1000,34107=>1000,34108=>1000,34109=>1000,34110=>1000,34111=>1000,34112=>1000,34113=>1000,34114=>1000,34115=>1000,34116=>1000,34117=>1000,34118=>1000,34119=>1000,34120=>1000,34121=>1000,34122=>1000,34123=>1000,34124=>1000,34125=>1000,34126=>1000,34127=>1000,34128=>1000,34129=>1000,34130=>1000,34131=>1000,34132=>1000,34133=>1000,34134=>1000,34135=>1000,34136=>1000,34137=>1000,34138=>1000,34139=>1000,34140=>1000,34141=>1000,34142=>1000,34143=>1000,34144=>1000,34145=>1000,34146=>1000,34147=>1000,34148=>1000,34149=>1000,34150=>1000,34151=>1000,34152=>1000,34153=>1000,34154=>1000,34155=>1000,34156=>1000,34157=>1000,34158=>1000,34159=>1000,34160=>1000,34161=>1000,34162=>1000,34163=>1000,34164=>1000,34165=>1000,34166=>1000,34167=>1000,34168=>1000,34169=>1000,34170=>1000,34171=>1000,34172=>1000,34173=>1000,34174=>1000,34175=>1000,34176=>1000,34177=>1000,34178=>1000,34179=>1000,34180=>1000,34181=>1000,34182=>1000,34183=>1000,34184=>1000,34185=>1000,34186=>1000,34187=>1000,34188=>1000,34189=>1000,34190=>1000,34191=>1000,34192=>1000,34193=>1000,34194=>1000,34195=>1000,34196=>1000,34197=>1000,34198=>1000,34199=>1000,34200=>1000,34201=>1000,34202=>1000,34203=>1000,34204=>1000,34205=>1000,34206=>1000,34207=>1000,34208=>1000,34209=>1000,34210=>1000,34211=>1000,34212=>1000,34213=>1000,34214=>1000,34215=>1000,34216=>1000,34217=>1000,34218=>1000,34219=>1000,34220=>1000,34221=>1000,34222=>1000,34223=>1000,34224=>1000,34225=>1000,34226=>1000,34227=>1000,34228=>1000,34229=>1000,34230=>1000,34231=>1000,34232=>1000,34233=>1000,34234=>1000,34235=>1000,34236=>1000,34237=>1000,34238=>1000,34239=>1000,34240=>1000,34241=>1000,34242=>1000,34243=>1000,34244=>1000,34245=>1000,34246=>1000,34247=>1000,34248=>1000,34249=>1000,34250=>1000,34251=>1000,34252=>1000,34253=>1000,34254=>1000,34255=>1000,34256=>1000,34257=>1000,34258=>1000,34259=>1000,34260=>1000,34261=>1000,34262=>1000,34263=>1000,34264=>1000,34265=>1000,34266=>1000,34267=>1000,34268=>1000,34269=>1000,34270=>1000,34271=>1000,34272=>1000,34273=>1000,34274=>1000,34275=>1000,34276=>1000,34277=>1000,34278=>1000,34279=>1000,34280=>1000,34281=>1000,34282=>1000,34283=>1000,34284=>1000,34285=>1000,34286=>1000,34287=>1000,34288=>1000,34289=>1000,34290=>1000,34291=>1000,34292=>1000,34293=>1000,34294=>1000,34295=>1000,34296=>1000,34297=>1000,34298=>1000,34299=>1000,34300=>1000,34301=>1000,34302=>1000,34303=>1000,34304=>1000,34305=>1000,34306=>1000,34307=>1000,34308=>1000,34309=>1000,34310=>1000,34311=>1000,34312=>1000,34313=>1000,34314=>1000,34315=>1000,34316=>1000,34317=>1000,34318=>1000,34319=>1000,34320=>1000,34321=>1000,34322=>1000,34323=>1000,34324=>1000,34325=>1000,34326=>1000,34327=>1000,34328=>1000,34329=>1000,34330=>1000,34331=>1000,34332=>1000,34333=>1000,34334=>1000,34335=>1000,34336=>1000,34337=>1000,34338=>1000,34339=>1000,34340=>1000,34341=>1000,34342=>1000,34343=>1000,34344=>1000,34345=>1000,34346=>1000,34347=>1000,34348=>1000,34349=>1000,34350=>1000,34351=>1000,34352=>1000,34353=>1000,34354=>1000,34355=>1000,34356=>1000,34357=>1000,34358=>1000,34359=>1000,34360=>1000,34361=>1000,34362=>1000,34363=>1000,34364=>1000,34365=>1000,34366=>1000,34367=>1000,34368=>1000,34369=>1000,34370=>1000,34371=>1000,34372=>1000,34373=>1000,34374=>1000,34375=>1000,34376=>1000,34377=>1000,34378=>1000,34379=>1000,34380=>1000,34381=>1000,34382=>1000,34383=>1000,34384=>1000,34385=>1000,34386=>1000,34387=>1000,34388=>1000,34389=>1000,34390=>1000,34391=>1000,34392=>1000,34393=>1000,34394=>1000,34395=>1000,34396=>1000,34397=>1000,34398=>1000,34399=>1000,34400=>1000,34401=>1000,34402=>1000,34403=>1000,34404=>1000,34405=>1000,34406=>1000,34407=>1000,34408=>1000,34409=>1000,34410=>1000,34411=>1000,34412=>1000,34413=>1000,34414=>1000,34415=>1000,34416=>1000,34417=>1000,34418=>1000,34419=>1000,34420=>1000,34421=>1000,34422=>1000,34423=>1000,34424=>1000,34425=>1000,34426=>1000,34427=>1000,34428=>1000,34429=>1000,34430=>1000,34431=>1000,34432=>1000,34433=>1000,34434=>1000,34435=>1000,34436=>1000,34437=>1000,34438=>1000,34439=>1000,34440=>1000,34441=>1000,34442=>1000,34443=>1000,34444=>1000,34445=>1000,34446=>1000,34447=>1000,34448=>1000,34449=>1000,34450=>1000,34451=>1000,34452=>1000,34453=>1000,34454=>1000,34455=>1000,34456=>1000,34457=>1000,34458=>1000,34459=>1000,34460=>1000,34461=>1000,34462=>1000,34463=>1000,34464=>1000,34465=>1000,34466=>1000,34467=>1000,34468=>1000,34469=>1000,34470=>1000,34471=>1000,34472=>1000,34473=>1000,34474=>1000,34475=>1000,34476=>1000,34477=>1000,34478=>1000,34479=>1000,34480=>1000,34481=>1000,34482=>1000,34483=>1000,34484=>1000,34485=>1000,34486=>1000,34487=>1000,34488=>1000,34489=>1000,34490=>1000,34491=>1000,34492=>1000,34493=>1000,34494=>1000,34495=>1000,34496=>1000,34497=>1000,34498=>1000,34499=>1000,34500=>1000,34501=>1000,34502=>1000,34503=>1000,34504=>1000,34505=>1000,34506=>1000,34507=>1000,34508=>1000,34509=>1000,34510=>1000,34511=>1000,34512=>1000,34513=>1000,34514=>1000,34515=>1000,34516=>1000,34517=>1000,34518=>1000,34519=>1000,34520=>1000,34521=>1000,34522=>1000,34523=>1000,34524=>1000,34525=>1000,34526=>1000,34527=>1000,34528=>1000,34529=>1000,34530=>1000,34531=>1000,34532=>1000,34533=>1000,34534=>1000,34535=>1000,34536=>1000,34537=>1000,34538=>1000,34539=>1000,34540=>1000,34541=>1000,34542=>1000,34543=>1000,34544=>1000,34545=>1000,34546=>1000,34547=>1000,34548=>1000,34549=>1000,34550=>1000,34551=>1000,34552=>1000,34553=>1000,34554=>1000,34555=>1000,34556=>1000,34557=>1000,34558=>1000,34559=>1000,34560=>1000,34561=>1000,34562=>1000,34563=>1000,34564=>1000,34565=>1000,34566=>1000,34567=>1000,34568=>1000,34569=>1000,34570=>1000,34571=>1000,34572=>1000,34573=>1000,34574=>1000,34575=>1000,34576=>1000,34577=>1000,34578=>1000,34579=>1000,34580=>1000,34581=>1000,34582=>1000,34583=>1000,34584=>1000,34585=>1000,34586=>1000,34587=>1000,34588=>1000,34589=>1000,34590=>1000,34591=>1000,34592=>1000,34593=>1000,34594=>1000,34595=>1000,34596=>1000,34597=>1000,34598=>1000,34599=>1000,34600=>1000,34601=>1000,34602=>1000,34603=>1000,34604=>1000,34605=>1000,34606=>1000,34607=>1000,34608=>1000,34609=>1000,34610=>1000,34611=>1000,34612=>1000,34613=>1000,34614=>1000,34615=>1000,34616=>1000,34617=>1000,34618=>1000,34619=>1000,34620=>1000,34621=>1000,34622=>1000,34623=>1000,34624=>1000,34625=>1000,34626=>1000,34627=>1000,34628=>1000,34629=>1000,34630=>1000,34631=>1000,34632=>1000,34633=>1000,34634=>1000,34635=>1000,34636=>1000,34637=>1000,34638=>1000,34639=>1000,34640=>1000,34641=>1000,34642=>1000,34643=>1000,34644=>1000,34645=>1000,34646=>1000,34647=>1000,34648=>1000,34649=>1000,34650=>1000,34651=>1000,34652=>1000,34653=>1000,34654=>1000,34655=>1000,34656=>1000,34657=>1000,34658=>1000,34659=>1000,34660=>1000,34661=>1000,34662=>1000,34663=>1000,34664=>1000,34665=>1000,34666=>1000,34667=>1000,34668=>1000,34669=>1000,34670=>1000,34671=>1000,34672=>1000,34673=>1000,34674=>1000,34675=>1000,34676=>1000,34677=>1000,34678=>1000,34679=>1000,34680=>1000,34681=>1000,34682=>1000,34683=>1000,34684=>1000,34685=>1000,34686=>1000,34687=>1000,34688=>1000,34689=>1000,34690=>1000,34691=>1000,34692=>1000,34693=>1000,34694=>1000,34695=>1000,34696=>1000,34697=>1000,34698=>1000,34699=>1000,34700=>1000,34701=>1000,34702=>1000,34703=>1000,34704=>1000,34705=>1000,34706=>1000,34707=>1000,34708=>1000,34709=>1000,34710=>1000,34711=>1000,34712=>1000,34713=>1000,34714=>1000,34715=>1000,34716=>1000,34717=>1000,34718=>1000,34719=>1000,34720=>1000,34721=>1000,34722=>1000,34723=>1000,34724=>1000,34725=>1000,34726=>1000,34727=>1000,34728=>1000,34729=>1000,34730=>1000,34731=>1000,34732=>1000,34733=>1000,34734=>1000,34735=>1000,34736=>1000,34737=>1000,34738=>1000,34739=>1000,34740=>1000,34741=>1000,34742=>1000,34743=>1000,34744=>1000,34745=>1000,34746=>1000,34747=>1000,34748=>1000,34749=>1000,34750=>1000,34751=>1000,34752=>1000,34753=>1000,34754=>1000,34755=>1000,34756=>1000,34757=>1000,34758=>1000,34759=>1000,34760=>1000,34761=>1000,34762=>1000,34763=>1000,34764=>1000,34765=>1000,34766=>1000,34767=>1000,34768=>1000,34769=>1000,34770=>1000,34771=>1000,34772=>1000,34773=>1000,34774=>1000,34775=>1000,34776=>1000,34777=>1000,34778=>1000,34779=>1000,34780=>1000,34781=>1000,34782=>1000,34783=>1000,34784=>1000,34785=>1000,34786=>1000,34787=>1000,34788=>1000,34789=>1000,34790=>1000,34791=>1000,34792=>1000,34793=>1000,34794=>1000,34795=>1000,34796=>1000,34797=>1000,34798=>1000,34799=>1000,34800=>1000,34801=>1000,34802=>1000,34803=>1000,34804=>1000,34805=>1000,34806=>1000,34807=>1000,34808=>1000,34809=>1000,34810=>1000,34811=>1000,34812=>1000,34813=>1000,34814=>1000,34815=>1000,34816=>1000,34817=>1000,34818=>1000,34819=>1000,34820=>1000,34821=>1000,34822=>1000,34823=>1000,34824=>1000,34825=>1000,34826=>1000,34827=>1000,34828=>1000,34829=>1000,34830=>1000,34831=>1000,34832=>1000,34833=>1000,34834=>1000,34835=>1000,34836=>1000,34837=>1000,34838=>1000,34839=>1000,34840=>1000,34841=>1000,34842=>1000,34843=>1000,34844=>1000,34845=>1000,34846=>1000,34847=>1000,34848=>1000,34849=>1000,34850=>1000,34851=>1000,34852=>1000,34853=>1000,34854=>1000,34855=>1000,34856=>1000,34857=>1000,34858=>1000,34859=>1000,34860=>1000,34861=>1000,34862=>1000,34863=>1000,34864=>1000,34865=>1000,34866=>1000,34867=>1000,34868=>1000,34869=>1000,34870=>1000,34871=>1000,34872=>1000,34873=>1000,34874=>1000,34875=>1000,34876=>1000,34877=>1000,34878=>1000,34879=>1000,34880=>1000,34881=>1000,34882=>1000,34883=>1000,34884=>1000,34885=>1000,34886=>1000,34887=>1000,34888=>1000,34889=>1000,34890=>1000,34891=>1000,34892=>1000,34893=>1000,34894=>1000,34895=>1000,34896=>1000,34897=>1000,34898=>1000,34899=>1000,34900=>1000,34901=>1000,34902=>1000,34903=>1000,34904=>1000,34905=>1000,34906=>1000,34907=>1000,34908=>1000,34909=>1000,34910=>1000,34911=>1000,34912=>1000,34913=>1000,34914=>1000,34915=>1000,34916=>1000,34917=>1000,34918=>1000,34919=>1000,34920=>1000,34921=>1000,34922=>1000,34923=>1000,34924=>1000,34925=>1000,34926=>1000,34927=>1000,34928=>1000,34929=>1000,34930=>1000,34931=>1000,34932=>1000,34933=>1000,34934=>1000,34935=>1000,34936=>1000,34937=>1000,34938=>1000,34939=>1000,34940=>1000,34941=>1000,34942=>1000,34943=>1000,34944=>1000,34945=>1000,34946=>1000,34947=>1000,34948=>1000,34949=>1000,34950=>1000,34951=>1000,34952=>1000,34953=>1000,34954=>1000,34955=>1000,34956=>1000,34957=>1000,34958=>1000,34959=>1000,34960=>1000,34961=>1000,34962=>1000,34963=>1000,34964=>1000,34965=>1000,34966=>1000,34967=>1000,34968=>1000,34969=>1000,34970=>1000,34971=>1000,34972=>1000,34973=>1000,34974=>1000,34975=>1000,34976=>1000,34977=>1000,34978=>1000,34979=>1000,34980=>1000,34981=>1000,34982=>1000,34983=>1000,34984=>1000,34985=>1000,34986=>1000,34987=>1000,34988=>1000,34989=>1000,34990=>1000,34991=>1000,34992=>1000,34993=>1000,34994=>1000,34995=>1000,34996=>1000,34997=>1000,34998=>1000,34999=>1000,35000=>1000,35001=>1000,35002=>1000,35003=>1000,35004=>1000,35005=>1000,35006=>1000,35007=>1000,35008=>1000,35009=>1000,35010=>1000,35011=>1000,35012=>1000,35013=>1000,35014=>1000,35015=>1000,35016=>1000,35017=>1000,35018=>1000,35019=>1000,35020=>1000,35021=>1000,35022=>1000,35023=>1000,35024=>1000,35025=>1000,35026=>1000,35027=>1000,35028=>1000,35029=>1000,35030=>1000,35031=>1000,35032=>1000,35033=>1000,35034=>1000,35035=>1000,35036=>1000,35037=>1000,35038=>1000,35039=>1000,35040=>1000,35041=>1000,35042=>1000,35043=>1000,35044=>1000,35045=>1000,35046=>1000,35047=>1000,35048=>1000,35049=>1000,35050=>1000,35051=>1000,35052=>1000,35053=>1000,35054=>1000,35055=>1000,35056=>1000,35057=>1000,35058=>1000,35059=>1000,35060=>1000,35061=>1000,35062=>1000,35063=>1000,35064=>1000,35065=>1000,35066=>1000,35067=>1000,35068=>1000,35069=>1000,35070=>1000,35071=>1000,35072=>1000,35073=>1000,35074=>1000,35075=>1000,35076=>1000,35077=>1000,35078=>1000,35079=>1000,35080=>1000,35081=>1000,35082=>1000,35083=>1000,35084=>1000,35085=>1000,35086=>1000,35087=>1000,35088=>1000,35089=>1000,35090=>1000,35091=>1000,35092=>1000,35093=>1000,35094=>1000,35095=>1000,35096=>1000,35097=>1000,35098=>1000,35099=>1000,35100=>1000,35101=>1000,35102=>1000,35103=>1000,35104=>1000,35105=>1000,35106=>1000,35107=>1000,35108=>1000,35109=>1000,35110=>1000,35111=>1000,35112=>1000,35113=>1000,35114=>1000,35115=>1000,35116=>1000,35117=>1000,35118=>1000,35119=>1000,35120=>1000,35121=>1000,35122=>1000,35123=>1000,35124=>1000,35125=>1000,35126=>1000,35127=>1000,35128=>1000,35129=>1000,35130=>1000,35131=>1000,35132=>1000,35133=>1000,35134=>1000,35135=>1000,35136=>1000,35137=>1000,35138=>1000,35139=>1000,35140=>1000,35141=>1000,35142=>1000,35143=>1000,35144=>1000,35145=>1000,35146=>1000,35147=>1000,35148=>1000,35149=>1000,35150=>1000,35151=>1000,35152=>1000,35153=>1000,35154=>1000,35155=>1000,35156=>1000,35157=>1000,35158=>1000,35159=>1000,35160=>1000,35161=>1000,35162=>1000,35163=>1000,35164=>1000,35165=>1000,35166=>1000,35167=>1000,35168=>1000,35169=>1000,35170=>1000,35171=>1000,35172=>1000,35173=>1000,35174=>1000,35175=>1000,35176=>1000,35177=>1000,35178=>1000,35179=>1000,35180=>1000,35181=>1000,35182=>1000,35183=>1000,35184=>1000,35185=>1000,35186=>1000,35187=>1000,35188=>1000,35189=>1000,35190=>1000,35191=>1000,35192=>1000,35193=>1000,35194=>1000,35195=>1000,35196=>1000,35197=>1000,35198=>1000,35199=>1000,35200=>1000,35201=>1000,35202=>1000,35203=>1000,35204=>1000,35205=>1000,35206=>1000,35207=>1000,35208=>1000,35209=>1000,35210=>1000,35211=>1000,35212=>1000,35213=>1000,35214=>1000,35215=>1000,35216=>1000,35217=>1000,35218=>1000,35219=>1000,35220=>1000,35221=>1000,35222=>1000,35223=>1000,35224=>1000,35225=>1000,35226=>1000,35227=>1000,35228=>1000,35229=>1000,35230=>1000,35231=>1000,35232=>1000,35233=>1000,35234=>1000,35235=>1000,35236=>1000,35237=>1000,35238=>1000,35239=>1000,35240=>1000,35241=>1000,35242=>1000,35243=>1000,35244=>1000,35245=>1000,35246=>1000,35247=>1000,35248=>1000,35249=>1000,35250=>1000,35251=>1000,35252=>1000,35253=>1000,35254=>1000,35255=>1000,35256=>1000,35257=>1000,35258=>1000,35259=>1000,35260=>1000,35261=>1000,35262=>1000,35263=>1000,35264=>1000,35265=>1000,35266=>1000,35267=>1000,35268=>1000,35269=>1000,35270=>1000,35271=>1000,35272=>1000,35273=>1000,35274=>1000,35275=>1000,35276=>1000,35277=>1000,35278=>1000,35279=>1000,35280=>1000,35281=>1000,35282=>1000,35283=>1000,35284=>1000,35285=>1000,35286=>1000,35287=>1000,35288=>1000,35289=>1000,35290=>1000,35291=>1000,35292=>1000,35293=>1000,35294=>1000,35295=>1000,35296=>1000,35297=>1000,35298=>1000,35299=>1000,35300=>1000,35301=>1000,35302=>1000,35303=>1000,35304=>1000,35305=>1000,35306=>1000,35307=>1000,35308=>1000,35309=>1000,35310=>1000,35311=>1000,35312=>1000,35313=>1000,35314=>1000,35315=>1000,35316=>1000,35317=>1000,35318=>1000,35319=>1000,35320=>1000,35321=>1000,35322=>1000,35323=>1000,35324=>1000,35325=>1000,35326=>1000,35327=>1000,35328=>1000,35329=>1000,35330=>1000,35331=>1000,35332=>1000,35333=>1000,35334=>1000,35335=>1000,35336=>1000,35337=>1000,35338=>1000,35339=>1000,35340=>1000,35341=>1000,35342=>1000,35343=>1000,35344=>1000,35345=>1000,35346=>1000,35347=>1000,35348=>1000,35349=>1000,35350=>1000,35351=>1000,35352=>1000,35353=>1000,35354=>1000,35355=>1000,35356=>1000,35357=>1000,35358=>1000,35359=>1000,35360=>1000,35361=>1000,35362=>1000,35363=>1000,35364=>1000,35365=>1000,35366=>1000,35367=>1000,35368=>1000,35369=>1000,35370=>1000,35371=>1000,35372=>1000,35373=>1000,35374=>1000,35375=>1000,35376=>1000,35377=>1000,35378=>1000,35379=>1000,35380=>1000,35381=>1000,35382=>1000,35383=>1000,35384=>1000,35385=>1000,35386=>1000,35387=>1000,35388=>1000,35389=>1000,35390=>1000,35391=>1000,35392=>1000,35393=>1000,35394=>1000,35395=>1000,35396=>1000,35397=>1000,35398=>1000,35399=>1000,35400=>1000,35401=>1000,35402=>1000,35403=>1000,35404=>1000,35405=>1000,35406=>1000,35407=>1000,35408=>1000,35409=>1000,35410=>1000,35411=>1000,35412=>1000,35413=>1000,35414=>1000,35415=>1000,35416=>1000,35417=>1000,35418=>1000,35419=>1000,35420=>1000,35421=>1000,35422=>1000,35423=>1000,35424=>1000,35425=>1000,35426=>1000,35427=>1000,35428=>1000,35429=>1000,35430=>1000,35431=>1000,35432=>1000,35433=>1000,35434=>1000,35435=>1000,35436=>1000,35437=>1000,35438=>1000,35439=>1000,35440=>1000,35441=>1000,35442=>1000,35443=>1000,35444=>1000,35445=>1000,35446=>1000,35447=>1000,35448=>1000,35449=>1000,35450=>1000,35451=>1000,35452=>1000,35453=>1000,35454=>1000,35455=>1000,35456=>1000,35457=>1000,35458=>1000,35459=>1000,35460=>1000,35461=>1000,35462=>1000,35463=>1000,35464=>1000,35465=>1000,35466=>1000,35467=>1000,35468=>1000,35469=>1000,35470=>1000,35471=>1000,35472=>1000,35473=>1000,35474=>1000,35475=>1000,35476=>1000,35477=>1000,35478=>1000,35479=>1000,35480=>1000,35481=>1000,35482=>1000,35483=>1000,35484=>1000,35485=>1000,35486=>1000,35487=>1000,35488=>1000,35489=>1000,35490=>1000,35491=>1000,35492=>1000,35493=>1000,35494=>1000,35495=>1000,35496=>1000,35497=>1000,35498=>1000,35499=>1000,35500=>1000,35501=>1000,35502=>1000,35503=>1000,35504=>1000,35505=>1000,35506=>1000,35507=>1000,35508=>1000,35509=>1000,35510=>1000,35511=>1000,35512=>1000,35513=>1000,35514=>1000,35515=>1000,35516=>1000,35517=>1000,35518=>1000,35519=>1000,35520=>1000,35521=>1000,35522=>1000,35523=>1000,35524=>1000,35525=>1000,35526=>1000,35527=>1000,35528=>1000,35529=>1000,35530=>1000,35531=>1000,35532=>1000,35533=>1000,35534=>1000,35535=>1000,35536=>1000,35537=>1000,35538=>1000,35539=>1000,35540=>1000,35541=>1000,35542=>1000,35543=>1000,35544=>1000,35545=>1000,35546=>1000,35547=>1000,35548=>1000,35549=>1000,35550=>1000,35551=>1000,35552=>1000,35553=>1000,35554=>1000,35555=>1000,35556=>1000,35557=>1000,35558=>1000,35559=>1000,35560=>1000,35561=>1000,35562=>1000,35563=>1000,35564=>1000,35565=>1000,35566=>1000,35567=>1000,35568=>1000,35569=>1000,35570=>1000,35571=>1000,35572=>1000,35573=>1000,35574=>1000,35575=>1000,35576=>1000,35577=>1000,35578=>1000,35579=>1000,35580=>1000,35581=>1000,35582=>1000,35583=>1000,35584=>1000,35585=>1000,35586=>1000,35587=>1000,35588=>1000,35589=>1000,35590=>1000,35591=>1000,35592=>1000,35593=>1000,35594=>1000,35595=>1000,35596=>1000,35597=>1000,35598=>1000,35599=>1000,35600=>1000,35601=>1000,35602=>1000,35603=>1000,35604=>1000,35605=>1000,35606=>1000,35607=>1000,35608=>1000,35609=>1000,35610=>1000,35611=>1000,35612=>1000,35613=>1000,35614=>1000,35615=>1000,35616=>1000,35617=>1000,35618=>1000,35619=>1000,35620=>1000,35621=>1000,35622=>1000,35623=>1000,35624=>1000,35625=>1000,35626=>1000,35627=>1000,35628=>1000,35629=>1000,35630=>1000,35631=>1000,35632=>1000,35633=>1000,35634=>1000,35635=>1000,35636=>1000,35637=>1000,35638=>1000,35639=>1000,35640=>1000,35641=>1000,35642=>1000,35643=>1000,35644=>1000,35645=>1000,35646=>1000,35647=>1000,35648=>1000,35649=>1000,35650=>1000,35651=>1000,35652=>1000,35653=>1000,35654=>1000,35655=>1000,35656=>1000,35657=>1000,35658=>1000,35659=>1000,35660=>1000,35661=>1000,35662=>1000,35663=>1000,35664=>1000,35665=>1000,35666=>1000,35667=>1000,35668=>1000,35669=>1000,35670=>1000,35671=>1000,35672=>1000,35673=>1000,35674=>1000,35675=>1000,35676=>1000,35677=>1000,35678=>1000,35679=>1000,35680=>1000,35681=>1000,35682=>1000,35683=>1000,35684=>1000,35685=>1000,35686=>1000,35687=>1000,35688=>1000,35689=>1000,35690=>1000,35691=>1000,35692=>1000,35693=>1000,35694=>1000,35695=>1000,35696=>1000,35697=>1000,35698=>1000,35699=>1000,35700=>1000,35701=>1000,35702=>1000,35703=>1000,35704=>1000,35705=>1000,35706=>1000,35707=>1000,35708=>1000,35709=>1000,35710=>1000,35711=>1000,35712=>1000,35713=>1000,35714=>1000,35715=>1000,35716=>1000,35717=>1000,35718=>1000,35719=>1000,35720=>1000,35721=>1000,35722=>1000,35723=>1000,35724=>1000,35725=>1000,35726=>1000,35727=>1000,35728=>1000,35729=>1000,35730=>1000,35731=>1000,35732=>1000,35733=>1000,35734=>1000,35735=>1000,35736=>1000,35737=>1000,35738=>1000,35739=>1000,35740=>1000,35741=>1000,35742=>1000,35743=>1000,35744=>1000,35745=>1000,35746=>1000,35747=>1000,35748=>1000,35749=>1000,35750=>1000,35751=>1000,35752=>1000,35753=>1000,35754=>1000,35755=>1000,35756=>1000,35757=>1000,35758=>1000,35759=>1000,35760=>1000,35761=>1000,35762=>1000,35763=>1000,35764=>1000,35765=>1000,35766=>1000,35767=>1000,35768=>1000,35769=>1000,35770=>1000,35771=>1000,35772=>1000,35773=>1000,35774=>1000,35775=>1000,35776=>1000,35777=>1000,35778=>1000,35779=>1000,35780=>1000,35781=>1000,35782=>1000,35783=>1000,35784=>1000,35785=>1000,35786=>1000,35787=>1000,35788=>1000,35789=>1000,35790=>1000,35791=>1000,35792=>1000,35793=>1000,35794=>1000,35795=>1000,35796=>1000,35797=>1000,35798=>1000,35799=>1000,35800=>1000,35801=>1000,35802=>1000,35803=>1000,35804=>1000,35805=>1000,35806=>1000,35807=>1000,35808=>1000,35809=>1000,35810=>1000,35811=>1000,35812=>1000,35813=>1000,35814=>1000,35815=>1000,35816=>1000,35817=>1000,35818=>1000,35819=>1000,35820=>1000,35821=>1000,35822=>1000,35823=>1000,35824=>1000,35825=>1000,35826=>1000,35827=>1000,35828=>1000,35829=>1000,35830=>1000,35831=>1000,35832=>1000,35833=>1000,35834=>1000,35835=>1000,35836=>1000,35837=>1000,35838=>1000,35839=>1000,35840=>1000,35841=>1000,35842=>1000,35843=>1000,35844=>1000,35845=>1000,35846=>1000,35847=>1000,35848=>1000,35849=>1000,35850=>1000,35851=>1000,35852=>1000,35853=>1000,35854=>1000,35855=>1000,35856=>1000,35857=>1000,35858=>1000,35859=>1000,35860=>1000,35861=>1000,35862=>1000,35863=>1000,35864=>1000,35865=>1000,35866=>1000,35867=>1000,35868=>1000,35869=>1000,35870=>1000,35871=>1000,35872=>1000,35873=>1000,35874=>1000,35875=>1000,35876=>1000,35877=>1000,35878=>1000,35879=>1000,35880=>1000,35881=>1000,35882=>1000,35883=>1000,35884=>1000,35885=>1000,35886=>1000,35887=>1000,35888=>1000,35889=>1000,35890=>1000,35891=>1000,35892=>1000,35893=>1000,35894=>1000,35895=>1000,35896=>1000,35897=>1000,35898=>1000,35899=>1000,35900=>1000,35901=>1000,35902=>1000,35903=>1000,35904=>1000,35905=>1000,35906=>1000,35907=>1000,35908=>1000,35909=>1000,35910=>1000,35911=>1000,35912=>1000,35913=>1000,35914=>1000,35915=>1000,35916=>1000,35917=>1000,35918=>1000,35919=>1000,35920=>1000,35921=>1000,35922=>1000,35923=>1000,35924=>1000,35925=>1000,35926=>1000,35927=>1000,35928=>1000,35929=>1000,35930=>1000,35931=>1000,35932=>1000,35933=>1000,35934=>1000,35935=>1000,35936=>1000,35937=>1000,35938=>1000,35939=>1000,35940=>1000,35941=>1000,35942=>1000,35943=>1000,35944=>1000,35945=>1000,35946=>1000,35947=>1000,35948=>1000,35949=>1000,35950=>1000,35951=>1000,35952=>1000,35953=>1000,35954=>1000,35955=>1000,35956=>1000,35957=>1000,35958=>1000,35959=>1000,35960=>1000,35961=>1000,35962=>1000,35963=>1000,35964=>1000,35965=>1000,35966=>1000,35967=>1000,35968=>1000,35969=>1000,35970=>1000,35971=>1000,35972=>1000,35973=>1000,35974=>1000,35975=>1000,35976=>1000,35977=>1000,35978=>1000,35979=>1000,35980=>1000,35981=>1000,35982=>1000,35983=>1000,35984=>1000,35985=>1000,35986=>1000,35987=>1000,35988=>1000,35989=>1000,35990=>1000,35991=>1000,35992=>1000,35993=>1000,35994=>1000,35995=>1000,35996=>1000,35997=>1000,35998=>1000,35999=>1000,36000=>1000,36001=>1000,36002=>1000,36003=>1000,36004=>1000,36005=>1000,36006=>1000,36007=>1000,36008=>1000,36009=>1000,36010=>1000,36011=>1000,36012=>1000,36013=>1000,36014=>1000,36015=>1000,36016=>1000,36017=>1000,36018=>1000,36019=>1000,36020=>1000,36021=>1000,36022=>1000,36023=>1000,36024=>1000,36025=>1000,36026=>1000,36027=>1000,36028=>1000,36029=>1000,36030=>1000,36031=>1000,36032=>1000,36033=>1000,36034=>1000,36035=>1000,36036=>1000,36037=>1000,36038=>1000,36039=>1000,36040=>1000,36041=>1000,36042=>1000,36043=>1000,36044=>1000,36045=>1000,36046=>1000,36047=>1000,36048=>1000,36049=>1000,36050=>1000,36051=>1000,36052=>1000,36053=>1000,36054=>1000,36055=>1000,36056=>1000,36057=>1000,36058=>1000,36059=>1000,36060=>1000,36061=>1000,36062=>1000,36063=>1000,36064=>1000,36065=>1000,36066=>1000,36067=>1000,36068=>1000,36069=>1000,36070=>1000,36071=>1000,36072=>1000,36073=>1000,36074=>1000,36075=>1000,36076=>1000,36077=>1000,36078=>1000,36079=>1000,36080=>1000,36081=>1000,36082=>1000,36083=>1000,36084=>1000,36085=>1000,36086=>1000,36087=>1000,36088=>1000,36089=>1000,36090=>1000,36091=>1000,36092=>1000,36093=>1000,36094=>1000,36095=>1000,36096=>1000,36097=>1000,36098=>1000,36099=>1000,36100=>1000,36101=>1000,36102=>1000,36103=>1000,36104=>1000,36105=>1000,36106=>1000,36107=>1000,36108=>1000,36109=>1000,36110=>1000,36111=>1000,36112=>1000,36113=>1000,36114=>1000,36115=>1000,36116=>1000,36117=>1000,36118=>1000,36119=>1000,36120=>1000,36121=>1000,36122=>1000,36123=>1000,36124=>1000,36125=>1000,36126=>1000,36127=>1000,36128=>1000,36129=>1000,36130=>1000,36131=>1000,36132=>1000,36133=>1000,36134=>1000,36135=>1000,36136=>1000,36137=>1000,36138=>1000,36139=>1000,36140=>1000,36141=>1000,36142=>1000,36143=>1000,36144=>1000,36145=>1000,36146=>1000,36147=>1000,36148=>1000,36149=>1000,36150=>1000,36151=>1000,36152=>1000,36153=>1000,36154=>1000,36155=>1000,36156=>1000,36157=>1000,36158=>1000,36159=>1000,36160=>1000,36161=>1000,36162=>1000,36163=>1000,36164=>1000,36165=>1000,36166=>1000,36167=>1000,36168=>1000,36169=>1000,36170=>1000,36171=>1000,36172=>1000,36173=>1000,36174=>1000,36175=>1000,36176=>1000,36177=>1000,36178=>1000,36179=>1000,36180=>1000,36181=>1000,36182=>1000,36183=>1000,36184=>1000,36185=>1000,36186=>1000,36187=>1000,36188=>1000,36189=>1000,36190=>1000,36191=>1000,36192=>1000,36193=>1000,36194=>1000,36195=>1000,36196=>1000,36197=>1000,36198=>1000,36199=>1000,36200=>1000,36201=>1000,36202=>1000,36203=>1000,36204=>1000,36205=>1000,36206=>1000,36207=>1000,36208=>1000,36209=>1000,36210=>1000,36211=>1000,36212=>1000,36213=>1000,36214=>1000,36215=>1000,36216=>1000,36217=>1000,36218=>1000,36219=>1000,36220=>1000,36221=>1000,36222=>1000,36223=>1000,36224=>1000,36225=>1000,36226=>1000,36227=>1000,36228=>1000,36229=>1000,36230=>1000,36231=>1000,36232=>1000,36233=>1000,36234=>1000,36235=>1000,36236=>1000,36237=>1000,36238=>1000,36239=>1000,36240=>1000,36241=>1000,36242=>1000,36243=>1000,36244=>1000,36245=>1000,36246=>1000,36247=>1000,36248=>1000,36249=>1000,36250=>1000,36251=>1000,36252=>1000,36253=>1000,36254=>1000,36255=>1000,36256=>1000,36257=>1000,36258=>1000,36259=>1000,36260=>1000,36261=>1000,36262=>1000,36263=>1000,36264=>1000,36265=>1000,36266=>1000,36267=>1000,36268=>1000,36269=>1000,36270=>1000,36271=>1000,36272=>1000,36273=>1000,36274=>1000,36275=>1000,36276=>1000,36277=>1000,36278=>1000,36279=>1000,36280=>1000,36281=>1000,36282=>1000,36283=>1000,36284=>1000,36285=>1000,36286=>1000,36287=>1000,36288=>1000,36289=>1000,36290=>1000,36291=>1000,36292=>1000,36293=>1000,36294=>1000,36295=>1000,36296=>1000,36297=>1000,36298=>1000,36299=>1000,36300=>1000,36301=>1000,36302=>1000,36303=>1000,36304=>1000,36305=>1000,36306=>1000,36307=>1000,36308=>1000,36309=>1000,36310=>1000,36311=>1000,36312=>1000,36313=>1000,36314=>1000,36315=>1000,36316=>1000,36317=>1000,36318=>1000,36319=>1000,36320=>1000,36321=>1000,36322=>1000,36323=>1000,36324=>1000,36325=>1000,36326=>1000,36327=>1000,36328=>1000,36329=>1000,36330=>1000,36331=>1000,36332=>1000,36333=>1000,36334=>1000,36335=>1000,36336=>1000,36337=>1000,36338=>1000,36339=>1000,36340=>1000,36341=>1000,36342=>1000,36343=>1000,36344=>1000,36345=>1000,36346=>1000,36347=>1000,36348=>1000,36349=>1000,36350=>1000,36351=>1000,36352=>1000,36353=>1000,36354=>1000,36355=>1000,36356=>1000,36357=>1000,36358=>1000,36359=>1000,36360=>1000,36361=>1000,36362=>1000,36363=>1000,36364=>1000,36365=>1000,36366=>1000,36367=>1000,36368=>1000,36369=>1000,36370=>1000,36371=>1000,36372=>1000,36373=>1000,36374=>1000,36375=>1000,36376=>1000,36377=>1000,36378=>1000,36379=>1000,36380=>1000,36381=>1000,36382=>1000,36383=>1000,36384=>1000,36385=>1000,36386=>1000,36387=>1000,36388=>1000,36389=>1000,36390=>1000,36391=>1000,36392=>1000,36393=>1000,36394=>1000,36395=>1000,36396=>1000,36397=>1000,36398=>1000,36399=>1000,36400=>1000,36401=>1000,36402=>1000,36403=>1000,36404=>1000,36405=>1000,36406=>1000,36407=>1000,36408=>1000,36409=>1000,36410=>1000,36411=>1000,36412=>1000,36413=>1000,36414=>1000,36415=>1000,36416=>1000,36417=>1000,36418=>1000,36419=>1000,36420=>1000,36421=>1000,36422=>1000,36423=>1000,36424=>1000,36425=>1000,36426=>1000,36427=>1000,36428=>1000,36429=>1000,36430=>1000,36431=>1000,36432=>1000,36433=>1000,36434=>1000,36435=>1000,36436=>1000,36437=>1000,36438=>1000,36439=>1000,36440=>1000,36441=>1000,36442=>1000,36443=>1000,36444=>1000,36445=>1000,36446=>1000,36447=>1000,36448=>1000,36449=>1000,36450=>1000,36451=>1000,36452=>1000,36453=>1000,36454=>1000,36455=>1000,36456=>1000,36457=>1000,36458=>1000,36459=>1000,36460=>1000,36461=>1000,36462=>1000,36463=>1000,36464=>1000,36465=>1000,36466=>1000,36467=>1000,36468=>1000,36469=>1000,36470=>1000,36471=>1000,36472=>1000,36473=>1000,36474=>1000,36475=>1000,36476=>1000,36477=>1000,36478=>1000,36479=>1000,36480=>1000,36481=>1000,36482=>1000,36483=>1000,36484=>1000,36485=>1000,36486=>1000,36487=>1000,36488=>1000,36489=>1000,36490=>1000,36491=>1000,36492=>1000,36493=>1000,36494=>1000,36495=>1000,36496=>1000,36497=>1000,36498=>1000,36499=>1000,36500=>1000,36501=>1000,36502=>1000,36503=>1000,36504=>1000,36505=>1000,36506=>1000,36507=>1000,36508=>1000,36509=>1000,36510=>1000,36511=>1000,36512=>1000,36513=>1000,36514=>1000,36515=>1000,36516=>1000,36517=>1000,36518=>1000,36519=>1000,36520=>1000,36521=>1000,36522=>1000,36523=>1000,36524=>1000,36525=>1000,36526=>1000,36527=>1000,36528=>1000,36529=>1000,36530=>1000,36531=>1000,36532=>1000,36533=>1000,36534=>1000,36535=>1000,36536=>1000,36537=>1000,36538=>1000,36539=>1000,36540=>1000,36541=>1000,36542=>1000,36543=>1000,36544=>1000,36545=>1000,36546=>1000,36547=>1000,36548=>1000,36549=>1000,36550=>1000,36551=>1000,36552=>1000,36553=>1000,36554=>1000,36555=>1000,36556=>1000,36557=>1000,36558=>1000,36559=>1000,36560=>1000,36561=>1000,36562=>1000,36563=>1000,36564=>1000,36565=>1000,36566=>1000,36567=>1000,36568=>1000,36569=>1000,36570=>1000,36571=>1000,36572=>1000,36573=>1000,36574=>1000,36575=>1000,36576=>1000,36577=>1000,36578=>1000,36579=>1000,36580=>1000,36581=>1000,36582=>1000,36583=>1000,36584=>1000,36585=>1000,36586=>1000,36587=>1000,36588=>1000,36589=>1000,36590=>1000,36591=>1000,36592=>1000,36593=>1000,36594=>1000,36595=>1000,36596=>1000,36597=>1000,36598=>1000,36599=>1000,36600=>1000,36601=>1000,36602=>1000,36603=>1000,36604=>1000,36605=>1000,36606=>1000,36607=>1000,36608=>1000,36609=>1000,36610=>1000,36611=>1000,36612=>1000,36613=>1000,36614=>1000,36615=>1000,36616=>1000,36617=>1000,36618=>1000,36619=>1000,36620=>1000,36621=>1000,36622=>1000,36623=>1000,36624=>1000,36625=>1000,36626=>1000,36627=>1000,36628=>1000,36629=>1000,36630=>1000,36631=>1000,36632=>1000,36633=>1000,36634=>1000,36635=>1000,36636=>1000,36637=>1000,36638=>1000,36639=>1000,36640=>1000,36641=>1000,36642=>1000,36643=>1000,36644=>1000,36645=>1000,36646=>1000,36647=>1000,36648=>1000,36649=>1000,36650=>1000,36651=>1000,36652=>1000,36653=>1000,36654=>1000,36655=>1000,36656=>1000,36657=>1000,36658=>1000,36659=>1000,36660=>1000,36661=>1000,36662=>1000,36663=>1000,36664=>1000,36665=>1000,36666=>1000,36667=>1000,36668=>1000,36669=>1000,36670=>1000,36671=>1000,36672=>1000,36673=>1000,36674=>1000,36675=>1000,36676=>1000,36677=>1000,36678=>1000,36679=>1000,36680=>1000,36681=>1000,36682=>1000,36683=>1000,36684=>1000,36685=>1000,36686=>1000,36687=>1000,36688=>1000,36689=>1000,36690=>1000,36691=>1000,36692=>1000,36693=>1000,36694=>1000,36695=>1000,36696=>1000,36697=>1000,36698=>1000,36699=>1000,36700=>1000,36701=>1000,36702=>1000,36703=>1000,36704=>1000,36705=>1000,36706=>1000,36707=>1000,36708=>1000,36709=>1000,36710=>1000,36711=>1000,36712=>1000,36713=>1000,36714=>1000,36715=>1000,36716=>1000,36717=>1000,36718=>1000,36719=>1000,36720=>1000,36721=>1000,36722=>1000,36723=>1000,36724=>1000,36725=>1000,36726=>1000,36727=>1000,36728=>1000,36729=>1000,36730=>1000,36731=>1000,36732=>1000,36733=>1000,36734=>1000,36735=>1000,36736=>1000,36737=>1000,36738=>1000,36739=>1000,36740=>1000,36741=>1000,36742=>1000,36743=>1000,36744=>1000,36745=>1000,36746=>1000,36747=>1000,36748=>1000,36749=>1000,36750=>1000,36751=>1000,36752=>1000,36753=>1000,36754=>1000,36755=>1000,36756=>1000,36757=>1000,36758=>1000,36759=>1000,36760=>1000,36761=>1000,36762=>1000,36763=>1000,36764=>1000,36765=>1000,36766=>1000,36767=>1000,36768=>1000,36769=>1000,36770=>1000,36771=>1000,36772=>1000,36773=>1000,36774=>1000,36775=>1000,36776=>1000,36777=>1000,36778=>1000,36779=>1000,36780=>1000,36781=>1000,36782=>1000,36783=>1000,36784=>1000,36785=>1000,36786=>1000,36787=>1000,36788=>1000,36789=>1000,36790=>1000,36791=>1000,36792=>1000,36793=>1000,36794=>1000,36795=>1000,36796=>1000,36797=>1000,36798=>1000,36799=>1000,36800=>1000,36801=>1000,36802=>1000,36803=>1000,36804=>1000,36805=>1000,36806=>1000,36807=>1000,36808=>1000,36809=>1000,36810=>1000,36811=>1000,36812=>1000,36813=>1000,36814=>1000,36815=>1000,36816=>1000,36817=>1000,36818=>1000,36819=>1000,36820=>1000,36821=>1000,36822=>1000,36823=>1000,36824=>1000,36825=>1000,36826=>1000,36827=>1000,36828=>1000,36829=>1000,36830=>1000,36831=>1000,36832=>1000,36833=>1000,36834=>1000,36835=>1000,36836=>1000,36837=>1000,36838=>1000,36839=>1000,36840=>1000,36841=>1000,36842=>1000,36843=>1000,36844=>1000,36845=>1000,36846=>1000,36847=>1000,36848=>1000,36849=>1000,36850=>1000,36851=>1000,36852=>1000,36853=>1000,36854=>1000,36855=>1000,36856=>1000,36857=>1000,36858=>1000,36859=>1000,36860=>1000,36861=>1000,36862=>1000,36863=>1000,36864=>1000,36865=>1000,36866=>1000,36867=>1000,36868=>1000,36869=>1000,36870=>1000,36871=>1000,36872=>1000,36873=>1000,36874=>1000,36875=>1000,36876=>1000,36877=>1000,36878=>1000,36879=>1000,36880=>1000,36881=>1000,36882=>1000,36883=>1000,36884=>1000,36885=>1000,36886=>1000,36887=>1000,36888=>1000,36889=>1000,36890=>1000,36891=>1000,36892=>1000,36893=>1000,36894=>1000,36895=>1000,36896=>1000,36897=>1000,36898=>1000,36899=>1000,36900=>1000,36901=>1000,36902=>1000,36903=>1000,36904=>1000,36905=>1000,36906=>1000,36907=>1000,36908=>1000,36909=>1000,36910=>1000,36911=>1000,36912=>1000,36913=>1000,36914=>1000,36915=>1000,36916=>1000,36917=>1000,36918=>1000,36919=>1000,36920=>1000,36921=>1000,36922=>1000,36923=>1000,36924=>1000,36925=>1000,36926=>1000,36927=>1000,36928=>1000,36929=>1000,36930=>1000,36931=>1000,36932=>1000,36933=>1000,36934=>1000,36935=>1000,36936=>1000,36937=>1000,36938=>1000,36939=>1000,36940=>1000,36941=>1000,36942=>1000,36943=>1000,36944=>1000,36945=>1000,36946=>1000,36947=>1000,36948=>1000,36949=>1000,36950=>1000,36951=>1000,36952=>1000,36953=>1000,36954=>1000,36955=>1000,36956=>1000,36957=>1000,36958=>1000,36959=>1000,36960=>1000,36961=>1000,36962=>1000,36963=>1000,36964=>1000,36965=>1000,36966=>1000,36967=>1000,36968=>1000,36969=>1000,36970=>1000,36971=>1000,36972=>1000,36973=>1000,36974=>1000,36975=>1000,36976=>1000,36977=>1000,36978=>1000,36979=>1000,36980=>1000,36981=>1000,36982=>1000,36983=>1000,36984=>1000,36985=>1000,36986=>1000,36987=>1000,36988=>1000,36989=>1000,36990=>1000,36991=>1000,36992=>1000,36993=>1000,36994=>1000,36995=>1000,36996=>1000,36997=>1000,36998=>1000,36999=>1000,37000=>1000,37001=>1000,37002=>1000,37003=>1000,37004=>1000,37005=>1000,37006=>1000,37007=>1000,37008=>1000,37009=>1000,37010=>1000,37011=>1000,37012=>1000,37013=>1000,37014=>1000,37015=>1000,37016=>1000,37017=>1000,37018=>1000,37019=>1000,37020=>1000,37021=>1000,37022=>1000,37023=>1000,37024=>1000,37025=>1000,37026=>1000,37027=>1000,37028=>1000,37029=>1000,37030=>1000,37031=>1000,37032=>1000,37033=>1000,37034=>1000,37035=>1000,37036=>1000,37037=>1000,37038=>1000,37039=>1000,37040=>1000,37041=>1000,37042=>1000,37043=>1000,37044=>1000,37045=>1000,37046=>1000,37047=>1000,37048=>1000,37049=>1000,37050=>1000,37051=>1000,37052=>1000,37053=>1000,37054=>1000,37055=>1000,37056=>1000,37057=>1000,37058=>1000,37059=>1000,37060=>1000,37061=>1000,37062=>1000,37063=>1000,37064=>1000,37065=>1000,37066=>1000,37067=>1000,37068=>1000,37069=>1000,37070=>1000,37071=>1000,37072=>1000,37073=>1000,37074=>1000,37075=>1000,37076=>1000,37077=>1000,37078=>1000,37079=>1000,37080=>1000,37081=>1000,37082=>1000,37083=>1000,37084=>1000,37085=>1000,37086=>1000,37087=>1000,37088=>1000,37089=>1000,37090=>1000,37091=>1000,37092=>1000,37093=>1000,37094=>1000,37095=>1000,37096=>1000,37097=>1000,37098=>1000,37099=>1000,37100=>1000,37101=>1000,37102=>1000,37103=>1000,37104=>1000,37105=>1000,37106=>1000,37107=>1000,37108=>1000,37109=>1000,37110=>1000,37111=>1000,37112=>1000,37113=>1000,37114=>1000,37115=>1000,37116=>1000,37117=>1000,37118=>1000,37119=>1000,37120=>1000,37121=>1000,37122=>1000,37123=>1000,37124=>1000,37125=>1000,37126=>1000,37127=>1000,37128=>1000,37129=>1000,37130=>1000,37131=>1000,37132=>1000,37133=>1000,37134=>1000,37135=>1000,37136=>1000,37137=>1000,37138=>1000,37139=>1000,37140=>1000,37141=>1000,37142=>1000,37143=>1000,37144=>1000,37145=>1000,37146=>1000,37147=>1000,37148=>1000,37149=>1000,37150=>1000,37151=>1000,37152=>1000,37153=>1000,37154=>1000,37155=>1000,37156=>1000,37157=>1000,37158=>1000,37159=>1000,37160=>1000,37161=>1000,37162=>1000,37163=>1000,37164=>1000,37165=>1000,37166=>1000,37167=>1000,37168=>1000,37169=>1000,37170=>1000,37171=>1000,37172=>1000,37173=>1000,37174=>1000,37175=>1000,37176=>1000,37177=>1000,37178=>1000,37179=>1000,37180=>1000,37181=>1000,37182=>1000,37183=>1000,37184=>1000,37185=>1000,37186=>1000,37187=>1000,37188=>1000,37189=>1000,37190=>1000,37191=>1000,37192=>1000,37193=>1000,37194=>1000,37195=>1000,37196=>1000,37197=>1000,37198=>1000,37199=>1000,37200=>1000,37201=>1000,37202=>1000,37203=>1000,37204=>1000,37205=>1000,37206=>1000,37207=>1000,37208=>1000,37209=>1000,37210=>1000,37211=>1000,37212=>1000,37213=>1000,37214=>1000,37215=>1000,37216=>1000,37217=>1000,37218=>1000,37219=>1000,37220=>1000,37221=>1000,37222=>1000,37223=>1000,37224=>1000,37225=>1000,37226=>1000,37227=>1000,37228=>1000,37229=>1000,37230=>1000,37231=>1000,37232=>1000,37233=>1000,37234=>1000,37235=>1000,37236=>1000,37237=>1000,37238=>1000,37239=>1000,37240=>1000,37241=>1000,37242=>1000,37243=>1000,37244=>1000,37245=>1000,37246=>1000,37247=>1000,37248=>1000,37249=>1000,37250=>1000,37251=>1000,37252=>1000,37253=>1000,37254=>1000,37255=>1000,37256=>1000,37257=>1000,37258=>1000,37259=>1000,37260=>1000,37261=>1000,37262=>1000,37263=>1000,37264=>1000,37265=>1000,37266=>1000,37267=>1000,37268=>1000,37269=>1000,37270=>1000,37271=>1000,37272=>1000,37273=>1000,37274=>1000,37275=>1000,37276=>1000,37277=>1000,37278=>1000,37279=>1000,37280=>1000,37281=>1000,37282=>1000,37283=>1000,37284=>1000,37285=>1000,37286=>1000,37287=>1000,37288=>1000,37289=>1000,37290=>1000,37291=>1000,37292=>1000,37293=>1000,37294=>1000,37295=>1000,37296=>1000,37297=>1000,37298=>1000,37299=>1000,37300=>1000,37301=>1000,37302=>1000,37303=>1000,37304=>1000,37305=>1000,37306=>1000,37307=>1000,37308=>1000,37309=>1000,37310=>1000,37311=>1000,37312=>1000,37313=>1000,37314=>1000,37315=>1000,37316=>1000,37317=>1000,37318=>1000,37319=>1000,37320=>1000,37321=>1000,37322=>1000,37323=>1000,37324=>1000,37325=>1000,37326=>1000,37327=>1000,37328=>1000,37329=>1000,37330=>1000,37331=>1000,37332=>1000,37333=>1000,37334=>1000,37335=>1000,37336=>1000,37337=>1000,37338=>1000,37339=>1000,37340=>1000,37341=>1000,37342=>1000,37343=>1000,37344=>1000,37345=>1000,37346=>1000,37347=>1000,37348=>1000,37349=>1000,37350=>1000,37351=>1000,37352=>1000,37353=>1000,37354=>1000,37355=>1000,37356=>1000,37357=>1000,37358=>1000,37359=>1000,37360=>1000,37361=>1000,37362=>1000,37363=>1000,37364=>1000,37365=>1000,37366=>1000,37367=>1000,37368=>1000,37369=>1000,37370=>1000,37371=>1000,37372=>1000,37373=>1000,37374=>1000,37375=>1000,37376=>1000,37377=>1000,37378=>1000,37379=>1000,37380=>1000,37381=>1000,37382=>1000,37383=>1000,37384=>1000,37385=>1000,37386=>1000,37387=>1000,37388=>1000,37389=>1000,37390=>1000,37391=>1000,37392=>1000,37393=>1000,37394=>1000,37395=>1000,37396=>1000,37397=>1000,37398=>1000,37399=>1000,37400=>1000,37401=>1000,37402=>1000,37403=>1000,37404=>1000,37405=>1000,37406=>1000,37407=>1000,37408=>1000,37409=>1000,37410=>1000,37411=>1000,37412=>1000,37413=>1000,37414=>1000,37415=>1000,37416=>1000,37417=>1000,37418=>1000,37419=>1000,37420=>1000,37421=>1000,37422=>1000,37423=>1000,37424=>1000,37425=>1000,37426=>1000,37427=>1000,37428=>1000,37429=>1000,37430=>1000,37431=>1000,37432=>1000,37433=>1000,37434=>1000,37435=>1000,37436=>1000,37437=>1000,37438=>1000,37439=>1000,37440=>1000,37441=>1000,37442=>1000,37443=>1000,37444=>1000,37445=>1000,37446=>1000,37447=>1000,37448=>1000,37449=>1000,37450=>1000,37451=>1000,37452=>1000,37453=>1000,37454=>1000,37455=>1000,37456=>1000,37457=>1000,37458=>1000,37459=>1000,37460=>1000,37461=>1000,37462=>1000,37463=>1000,37464=>1000,37465=>1000,37466=>1000,37467=>1000,37468=>1000,37469=>1000,37470=>1000,37471=>1000,37472=>1000,37473=>1000,37474=>1000,37475=>1000,37476=>1000,37477=>1000,37478=>1000,37479=>1000,37480=>1000,37481=>1000,37482=>1000,37483=>1000,37484=>1000,37485=>1000,37486=>1000,37487=>1000,37488=>1000,37489=>1000,37490=>1000,37491=>1000,37492=>1000,37493=>1000,37494=>1000,37495=>1000,37496=>1000,37497=>1000,37498=>1000,37499=>1000,37500=>1000,37501=>1000,37502=>1000,37503=>1000,37504=>1000,37505=>1000,37506=>1000,37507=>1000,37508=>1000,37509=>1000,37510=>1000,37511=>1000,37512=>1000,37513=>1000,37514=>1000,37515=>1000,37516=>1000,37517=>1000,37518=>1000,37519=>1000,37520=>1000,37521=>1000,37522=>1000,37523=>1000,37524=>1000,37525=>1000,37526=>1000,37527=>1000,37528=>1000,37529=>1000,37530=>1000,37531=>1000,37532=>1000,37533=>1000,37534=>1000,37535=>1000,37536=>1000,37537=>1000,37538=>1000,37539=>1000,37540=>1000,37541=>1000,37542=>1000,37543=>1000,37544=>1000,37545=>1000,37546=>1000,37547=>1000,37548=>1000,37549=>1000,37550=>1000,37551=>1000,37552=>1000,37553=>1000,37554=>1000,37555=>1000,37556=>1000,37557=>1000,37558=>1000,37559=>1000,37560=>1000,37561=>1000,37562=>1000,37563=>1000,37564=>1000,37565=>1000,37566=>1000,37567=>1000,37568=>1000,37569=>1000,37570=>1000,37571=>1000,37572=>1000,37573=>1000,37574=>1000,37575=>1000,37576=>1000,37577=>1000,37578=>1000,37579=>1000,37580=>1000,37581=>1000,37582=>1000,37583=>1000,37584=>1000,37585=>1000,37586=>1000,37587=>1000,37588=>1000,37589=>1000,37590=>1000,37591=>1000,37592=>1000,37593=>1000,37594=>1000,37595=>1000,37596=>1000,37597=>1000,37598=>1000,37599=>1000,37600=>1000,37601=>1000,37602=>1000,37603=>1000,37604=>1000,37605=>1000,37606=>1000,37607=>1000,37608=>1000,37609=>1000,37610=>1000,37611=>1000,37612=>1000,37613=>1000,37614=>1000,37615=>1000,37616=>1000,37617=>1000,37618=>1000,37619=>1000,37620=>1000,37621=>1000,37622=>1000,37623=>1000,37624=>1000,37625=>1000,37626=>1000,37627=>1000,37628=>1000,37629=>1000,37630=>1000,37631=>1000,37632=>1000,37633=>1000,37634=>1000,37635=>1000,37636=>1000,37637=>1000,37638=>1000,37639=>1000,37640=>1000,37641=>1000,37642=>1000,37643=>1000,37644=>1000,37645=>1000,37646=>1000,37647=>1000,37648=>1000,37649=>1000,37650=>1000,37651=>1000,37652=>1000,37653=>1000,37654=>1000,37655=>1000,37656=>1000,37657=>1000,37658=>1000,37659=>1000,37660=>1000,37661=>1000,37662=>1000,37663=>1000,37664=>1000,37665=>1000,37666=>1000,37667=>1000,37668=>1000,37669=>1000,37670=>1000,37671=>1000,37672=>1000,37673=>1000,37674=>1000,37675=>1000,37676=>1000,37677=>1000,37678=>1000,37679=>1000,37680=>1000,37681=>1000,37682=>1000,37683=>1000,37684=>1000,37685=>1000,37686=>1000,37687=>1000,37688=>1000,37689=>1000,37690=>1000,37691=>1000,37692=>1000,37693=>1000,37694=>1000,37695=>1000,37696=>1000,37697=>1000,37698=>1000,37699=>1000,37700=>1000,37701=>1000,37702=>1000,37703=>1000,37704=>1000,37705=>1000,37706=>1000,37707=>1000,37708=>1000,37709=>1000,37710=>1000,37711=>1000,37712=>1000,37713=>1000,37714=>1000,37715=>1000,37716=>1000,37717=>1000,37718=>1000,37719=>1000,37720=>1000,37721=>1000,37722=>1000,37723=>1000,37724=>1000,37725=>1000,37726=>1000,37727=>1000,37728=>1000,37729=>1000,37730=>1000,37731=>1000,37732=>1000,37733=>1000,37734=>1000,37735=>1000,37736=>1000,37737=>1000,37738=>1000,37739=>1000,37740=>1000,37741=>1000,37742=>1000,37743=>1000,37744=>1000,37745=>1000,37746=>1000,37747=>1000,37748=>1000,37749=>1000,37750=>1000,37751=>1000,37752=>1000,37753=>1000,37754=>1000,37755=>1000,37756=>1000,37757=>1000,37758=>1000,37759=>1000,37760=>1000,37761=>1000,37762=>1000,37763=>1000,37764=>1000,37765=>1000,37766=>1000,37767=>1000,37768=>1000,37769=>1000,37770=>1000,37771=>1000,37772=>1000,37773=>1000,37774=>1000,37775=>1000,37776=>1000,37777=>1000,37778=>1000,37779=>1000,37780=>1000,37781=>1000,37782=>1000,37783=>1000,37784=>1000,37785=>1000,37786=>1000,37787=>1000,37788=>1000,37789=>1000,37790=>1000,37791=>1000,37792=>1000,37793=>1000,37794=>1000,37795=>1000,37796=>1000,37797=>1000,37798=>1000,37799=>1000,37800=>1000,37801=>1000,37802=>1000,37803=>1000,37804=>1000,37805=>1000,37806=>1000,37807=>1000,37808=>1000,37809=>1000,37810=>1000,37811=>1000,37812=>1000,37813=>1000,37814=>1000,37815=>1000,37816=>1000,37817=>1000,37818=>1000,37819=>1000,37820=>1000,37821=>1000,37822=>1000,37823=>1000,37824=>1000,37825=>1000,37826=>1000,37827=>1000,37828=>1000,37829=>1000,37830=>1000,37831=>1000,37832=>1000,37833=>1000,37834=>1000,37835=>1000,37836=>1000,37837=>1000,37838=>1000,37839=>1000,37840=>1000,37841=>1000,37842=>1000,37843=>1000,37844=>1000,37845=>1000,37846=>1000,37847=>1000,37848=>1000,37849=>1000,37850=>1000,37851=>1000,37852=>1000,37853=>1000,37854=>1000,37855=>1000,37856=>1000,37857=>1000,37858=>1000,37859=>1000,37860=>1000,37861=>1000,37862=>1000,37863=>1000,37864=>1000,37865=>1000,37866=>1000,37867=>1000,37868=>1000,37869=>1000,37870=>1000,37871=>1000,37872=>1000,37873=>1000,37874=>1000,37875=>1000,37876=>1000,37877=>1000,37878=>1000,37879=>1000,37880=>1000,37881=>1000,37882=>1000,37883=>1000,37884=>1000,37885=>1000,37886=>1000,37887=>1000,37888=>1000,37889=>1000,37890=>1000,37891=>1000,37892=>1000,37893=>1000,37894=>1000,37895=>1000,37896=>1000,37897=>1000,37898=>1000,37899=>1000,37900=>1000,37901=>1000,37902=>1000,37903=>1000,37904=>1000,37905=>1000,37906=>1000,37907=>1000,37908=>1000,37909=>1000,37910=>1000,37911=>1000,37912=>1000,37913=>1000,37914=>1000,37915=>1000,37916=>1000,37917=>1000,37918=>1000,37919=>1000,37920=>1000,37921=>1000,37922=>1000,37923=>1000,37924=>1000,37925=>1000,37926=>1000,37927=>998,37928=>1000,37929=>1000,37930=>1000,37931=>1000,37932=>1000,37933=>1000,37934=>1000,37935=>1000,37936=>1000,37937=>1000,37938=>1000,37939=>1000,37940=>1000,37941=>1000,37942=>1000,37943=>1000,37944=>1000,37945=>1000,37946=>1000,37947=>1000,37948=>1000,37949=>1000,37950=>1000,37951=>1000,37952=>1000,37953=>1000,37954=>1000,37955=>1000,37956=>1000,37957=>1000,37958=>1000,37959=>1000,37960=>1000,37961=>1000,37962=>1000,37963=>1000,37964=>1000,37965=>1000,37966=>1000,37967=>1000,37968=>1000,37969=>1000,37970=>1000,37971=>1000,37972=>1000,37973=>1000,37974=>1000,37975=>1000,37976=>1000,37977=>1000,37978=>1000,37979=>1000,37980=>1000,37981=>1000,37982=>1000,37983=>1000,37984=>1000,37985=>1000,37986=>1000,37987=>1000,37988=>1000,37989=>1000,37990=>1000,37991=>1000,37992=>1000,37993=>1000,37994=>1000,37995=>1000,37996=>1000,37997=>1000,37998=>1000,37999=>1000,38000=>1000,38001=>1000,38002=>1000,38003=>1000,38004=>1000,38005=>1000,38006=>1000,38007=>1000,38008=>1000,38009=>1000,38010=>1000,38011=>1000,38012=>1000,38013=>1000,38014=>1000,38015=>1000,38016=>1000,38017=>1000,38018=>1000,38019=>1000,38020=>1000,38021=>1000,38022=>1000,38023=>1000,38024=>1000,38025=>1000,38026=>1000,38027=>1000,38028=>1000,38029=>1000,38030=>1000,38031=>1000,38032=>1000,38033=>1000,38034=>1000,38035=>1000,38036=>1000,38037=>1000,38038=>1000,38039=>1000,38040=>1000,38041=>1000,38042=>1000,38043=>1000,38044=>1000,38045=>1000,38046=>1000,38047=>1000,38048=>1000,38049=>1000,38050=>1000,38051=>1000,38052=>1000,38053=>1000,38054=>1000,38055=>1000,38056=>1000,38057=>1000,38058=>1000,38059=>1000,38060=>1000,38061=>1000,38062=>1000,38063=>1000,38064=>1000,38065=>1000,38066=>1000,38067=>1000,38068=>1000,38069=>1000,38070=>1000,38071=>1000,38072=>1000,38073=>1000,38074=>1000,38075=>1000,38076=>1000,38077=>1000,38078=>1000,38079=>1000,38080=>1000,38081=>1000,38082=>1000,38083=>1000,38084=>1000,38085=>1000,38086=>1000,38087=>1000,38088=>1000,38089=>1000,38090=>1000,38091=>1000,38092=>1000,38093=>1000,38094=>1000,38095=>1000,38096=>1000,38097=>1000,38098=>1000,38099=>1000,38100=>1000,38101=>1000,38102=>1000,38103=>1000,38104=>1000,38105=>1000,38106=>1000,38107=>1000,38108=>1000,38109=>1000,38110=>1000,38111=>1000,38112=>1000,38113=>1000,38114=>1000,38115=>1000,38116=>1000,38117=>1000,38118=>1000,38119=>1000,38120=>1000,38121=>1000,38122=>1000,38123=>1000,38124=>1000,38125=>1000,38126=>1000,38127=>1000,38128=>1000,38129=>1000,38130=>1000,38131=>1000,38132=>1000,38133=>1000,38134=>1000,38135=>1000,38136=>1000,38137=>1000,38138=>1000,38139=>1000,38140=>1000,38141=>1000,38142=>1000,38143=>1000,38144=>1000,38145=>1000,38146=>1000,38147=>1000,38148=>1000,38149=>1000,38150=>1000,38151=>1000,38152=>1000,38153=>1000,38154=>1000,38155=>1000,38156=>1000,38157=>1000,38158=>1000,38159=>1000,38160=>1000,38161=>1000,38162=>1000,38163=>1000,38164=>1000,38165=>1000,38166=>1000,38167=>1000,38168=>1000,38169=>1000,38170=>1000,38171=>1000,38172=>1000,38173=>1000,38174=>1000,38175=>1000,38176=>1000,38177=>1000,38178=>1000,38179=>1000,38180=>1000,38181=>1000,38182=>1000,38183=>1000,38184=>1000,38185=>1000,38186=>1000,38187=>1000,38188=>1000,38189=>1000,38190=>1000,38191=>1000,38192=>1000,38193=>1000,38194=>1000,38195=>1000,38196=>1000,38197=>1000,38198=>1000,38199=>1000,38200=>1000,38201=>1000,38202=>1000,38203=>1000,38204=>1000,38205=>1000,38206=>1000,38207=>1000,38208=>1000,38209=>1000,38210=>1000,38211=>1000,38212=>1000,38213=>1000,38214=>1000,38215=>1000,38216=>1000,38217=>1000,38218=>1000,38219=>1000,38220=>1000,38221=>1000,38222=>1000,38223=>1000,38224=>1000,38225=>1000,38226=>1000,38227=>1000,38228=>1000,38229=>1000,38230=>1000,38231=>1000,38232=>1000,38233=>1000,38234=>1000,38235=>1000,38236=>1000,38237=>1000,38238=>1000,38239=>1000,38240=>1000,38241=>1000,38242=>1000,38243=>1000,38244=>1000,38245=>1000,38246=>1000,38247=>1000,38248=>1000,38249=>1000,38250=>1000,38251=>1000,38252=>1000,38253=>1000,38254=>1000,38255=>1000,38256=>1000,38257=>1000,38258=>1000,38259=>1000,38260=>1000,38261=>1000,38262=>1000,38263=>1000,38264=>1000,38265=>1000,38266=>1000,38267=>1000,38268=>1000,38269=>1000,38270=>1000,38271=>1000,38272=>1000,38273=>1000,38274=>1000,38275=>1000,38276=>1000,38277=>1000,38278=>1000,38279=>1000,38280=>1000,38281=>1000,38282=>1000,38283=>1000,38284=>1000,38285=>1000,38286=>1000,38287=>1000,38288=>1000,38289=>1000,38290=>1000,38291=>1000,38292=>1000,38293=>1000,38294=>1000,38295=>1000,38296=>1000,38297=>1000,38298=>1000,38299=>1000,38300=>1000,38301=>1000,38302=>1000,38303=>1000,38304=>1000,38305=>1000,38306=>1000,38307=>1000,38308=>1000,38309=>1000,38310=>1000,38311=>1000,38312=>1000,38313=>1000,38314=>1000,38315=>1000,38316=>1000,38317=>1000,38318=>1000,38319=>1000,38320=>1000,38321=>1000,38322=>1000,38323=>1000,38324=>1000,38325=>1000,38326=>1000,38327=>1000,38328=>1000,38329=>1000,38330=>1000,38331=>1000,38332=>1000,38333=>1000,38334=>1000,38335=>1000,38336=>1000,38337=>1000,38338=>1000,38339=>1000,38340=>1000,38341=>1000,38342=>1000,38343=>1000,38344=>1000,38345=>1000,38346=>1000,38347=>1000,38348=>1000,38349=>1000,38350=>1000,38351=>1000,38352=>1000,38353=>1000,38354=>1000,38355=>1000,38356=>1000,38357=>1000,38358=>1000,38359=>1000,38360=>1000,38361=>1000,38362=>1000,38363=>1000,38364=>1000,38365=>1000,38366=>1000,38367=>1000,38368=>1000,38369=>1000,38370=>1000,38371=>1000,38372=>1000,38373=>1000,38374=>1000,38375=>1000,38376=>1000,38377=>1000,38378=>1000,38379=>1000,38380=>1000,38381=>1000,38382=>1000,38383=>1000,38384=>1000,38385=>1000,38386=>1000,38387=>1000,38388=>1000,38389=>1000,38390=>1000,38391=>1000,38392=>1000,38393=>1000,38394=>1000,38395=>1000,38396=>1000,38397=>1000,38398=>1000,38399=>1000,38400=>1000,38401=>1000,38402=>1000,38403=>1000,38404=>1000,38405=>1000,38406=>1000,38407=>1000,38408=>1000,38409=>1000,38410=>1000,38411=>1000,38412=>1000,38413=>1000,38414=>1000,38415=>1000,38416=>1000,38417=>1000,38418=>1000,38419=>1000,38420=>1000,38421=>1000,38422=>1000,38423=>1000,38424=>1000,38425=>1000,38426=>1000,38427=>1000,38428=>1000,38429=>1000,38430=>1000,38431=>1000,38432=>1000,38433=>1000,38434=>1000,38435=>1000,38436=>1000,38437=>1000,38438=>1000,38439=>1000,38440=>1000,38441=>1000,38442=>1000,38443=>1000,38444=>1000,38445=>1000,38446=>1000,38447=>1000,38448=>1000,38449=>1000,38450=>1000,38451=>1000,38452=>1000,38453=>1000,38454=>1000,38455=>1000,38456=>1000,38457=>1000,38458=>1000,38459=>1000,38460=>1000,38461=>1000,38462=>1000,38463=>1000,38464=>1000,38465=>1000,38466=>1000,38467=>1000,38468=>1000,38469=>1000,38470=>1000,38471=>1000,38472=>1000,38473=>1000,38474=>1000,38475=>1000,38476=>1000,38477=>1000,38478=>1000,38479=>1000,38480=>1000,38481=>1000,38482=>1000,38483=>1000,38484=>1000,38485=>1000,38486=>1000,38487=>1000,38488=>1000,38489=>1000,38490=>1000,38491=>1000,38492=>1000,38493=>1000,38494=>1000,38495=>1000,38496=>1000,38497=>1000,38498=>1000,38499=>1000,38500=>1000,38501=>1000,38502=>1000,38503=>1000,38504=>1000,38505=>1000,38506=>1000,38507=>1000,38508=>1000,38509=>1000,38510=>1000,38511=>1000,38512=>1000,38513=>1000,38514=>1000,38515=>1000,38516=>1000,38517=>1000,38518=>1000,38519=>1000,38520=>1000,38521=>1000,38522=>1000,38523=>1000,38524=>1000,38525=>1000,38526=>1000,38527=>1000,38528=>1000,38529=>1000,38530=>1000,38531=>1000,38532=>1000,38533=>1000,38534=>1000,38535=>1000,38536=>1000,38537=>1000,38538=>1000,38539=>1000,38540=>1000,38541=>1000,38542=>1000,38543=>1000,38544=>1000,38545=>1000,38546=>1000,38547=>1000,38548=>1000,38549=>1000,38550=>1000,38551=>1000,38552=>1000,38553=>1000,38554=>1000,38555=>1000,38556=>1000,38557=>1000,38558=>1000,38559=>1000,38560=>1000,38561=>1000,38562=>1000,38563=>1000,38564=>1000,38565=>1000,38566=>1000,38567=>1000,38568=>1000,38569=>1000,38570=>1000,38571=>1000,38572=>1000,38573=>1000,38574=>1000,38575=>1000,38576=>1000,38577=>1000,38578=>1000,38579=>1000,38580=>1000,38581=>1000,38582=>1000,38583=>1000,38584=>1000,38585=>1000,38586=>1000,38587=>1000,38588=>1000,38589=>1000,38590=>1000,38591=>1000,38592=>1000,38593=>1000,38594=>1000,38595=>1000,38596=>1000,38597=>1000,38598=>1000,38599=>1000,38600=>1000,38601=>1000,38602=>1000,38603=>1000,38604=>1000,38605=>1000,38606=>1000,38607=>1000,38608=>1000,38609=>1000,38610=>1000,38611=>1000,38612=>1000,38613=>1000,38614=>1000,38615=>1000,38616=>1000,38617=>1000,38618=>1000,38619=>1000,38620=>1000,38621=>1000,38622=>1000,38623=>1000,38624=>1000,38625=>1000,38626=>1000,38627=>1000,38628=>1000,38629=>1000,38630=>1000,38631=>1000,38632=>1000,38633=>1000,38634=>1000,38635=>1000,38636=>1000,38637=>1000,38638=>1000,38639=>1000,38640=>1000,38641=>1000,38642=>1000,38643=>1000,38644=>1000,38645=>1000,38646=>1000,38647=>1000,38648=>1000,38649=>1000,38650=>1000,38651=>1000,38652=>1000,38653=>1000,38654=>1000,38655=>1000,38656=>1000,38657=>1000,38658=>1000,38659=>1000,38660=>1000,38661=>1000,38662=>1000,38663=>1000,38664=>1000,38665=>1000,38666=>1000,38667=>1000,38668=>1000,38669=>1000,38670=>1000,38671=>1000,38672=>1000,38673=>1000,38674=>1000,38675=>1000,38676=>1000,38677=>1000,38678=>1000,38679=>1000,38680=>1000,38681=>1000,38682=>1000,38683=>1000,38684=>1000,38685=>1000,38686=>1000,38687=>1000,38688=>1000,38689=>1000,38690=>1000,38691=>1000,38692=>1000,38693=>1000,38694=>1000,38695=>1000,38696=>1000,38697=>1000,38698=>1000,38699=>1000,38700=>1000,38701=>1000,38702=>1000,38703=>1000,38704=>1000,38705=>1000,38706=>1000,38707=>1000,38708=>1000,38709=>1000,38710=>1000,38711=>1000,38712=>1000,38713=>1000,38714=>1000,38715=>1000,38716=>1000,38717=>1000,38718=>1000,38719=>1000,38720=>1000,38721=>1000,38722=>1000,38723=>1000,38724=>1000,38725=>1000,38726=>1000,38727=>1000,38728=>1000,38729=>1000,38730=>1000,38731=>1000,38732=>1000,38733=>1000,38734=>1000,38735=>1000,38736=>1000,38737=>1000,38738=>1000,38739=>1000,38740=>1000,38741=>1000,38742=>1000,38743=>1000,38744=>1000,38745=>1000,38746=>1000,38747=>1000,38748=>1000,38749=>1000,38750=>1000,38751=>1000,38752=>1000,38753=>1000,38754=>1000,38755=>1000,38756=>1000,38757=>1000,38758=>1000,38759=>1000,38760=>1000,38761=>1000,38762=>1000,38763=>1000,38764=>1000,38765=>1000,38766=>1000,38767=>1000,38768=>1000,38769=>1000,38770=>1000,38771=>1000,38772=>1000,38773=>1000,38774=>1000,38775=>1000,38776=>1000,38777=>1000,38778=>1000,38779=>1000,38780=>1000,38781=>1000,38782=>1000,38783=>1000,38784=>1000,38785=>1000,38786=>1000,38787=>1000,38788=>1000,38789=>1000,38790=>1000,38791=>1000,38792=>1000,38793=>1000,38794=>1000,38795=>1000,38796=>1000,38797=>1000,38798=>1000,38799=>1000,38800=>1000,38801=>1000,38802=>1000,38803=>1000,38804=>1000,38805=>1000,38806=>1000,38807=>1000,38808=>1000,38809=>1000,38810=>1000,38811=>1000,38812=>1000,38813=>1000,38814=>1000,38815=>1000,38816=>1000,38817=>1000,38818=>1000,38819=>1000,38820=>1000,38821=>1000,38822=>1000,38823=>1000,38824=>1000,38825=>1000,38826=>1000,38827=>1000,38828=>1000,38829=>1000,38830=>1000,38831=>1000,38832=>1000,38833=>1000,38834=>1000,38835=>1000,38836=>1000,38837=>1000,38838=>1000,38839=>1000,38840=>1000,38841=>1000,38842=>1000,38843=>1000,38844=>1000,38845=>1000,38846=>1000,38847=>1000,38848=>1000,38849=>1000,38850=>1000,38851=>1000,38852=>1000,38853=>1000,38854=>1000,38855=>1000,38856=>1000,38857=>1000,38858=>1000,38859=>1000,38860=>1000,38861=>1000,38862=>1000,38863=>1000,38864=>1000,38865=>1000,38866=>1000,38867=>1000,38868=>1000,38869=>1000,38870=>1000,38871=>1000,38872=>1000,38873=>1000,38874=>1000,38875=>1000,38876=>1000,38877=>1000,38878=>1000,38879=>1000,38880=>1000,38881=>1000,38882=>1000,38883=>1000,38884=>1000,38885=>1000,38886=>1000,38887=>1000,38888=>1000,38889=>1000,38890=>1000,38891=>1000,38892=>1000,38893=>1000,38894=>1000,38895=>1000,38896=>1000,38897=>1000,38898=>1000,38899=>1000,38900=>1000,38901=>1000,38902=>1000,38903=>1000,38904=>1000,38905=>1000,38906=>1000,38907=>1000,38908=>1000,38909=>1000,38910=>1000,38911=>1000,38912=>1000,38913=>1000,38914=>1000,38915=>1000,38916=>1000,38917=>1000,38918=>1000,38919=>1000,38920=>1000,38921=>1000,38922=>1000,38923=>1000,38924=>1000,38925=>1000,38926=>1000,38927=>1000,38928=>1000,38929=>1000,38930=>1000,38931=>1000,38932=>1000,38933=>1000,38934=>1000,38935=>1000,38936=>1000,38937=>1000,38938=>1000,38939=>1000,38940=>1000,38941=>1000,38942=>1000,38943=>1000,38944=>1000,38945=>1000,38946=>1000,38947=>1000,38948=>1000,38949=>1000,38950=>1000,38951=>1000,38952=>1000,38953=>1000,38954=>1000,38955=>1000,38956=>1000,38957=>1000,38958=>1000,38959=>1000,38960=>1000,38961=>1000,38962=>1000,38963=>1000,38964=>1000,38965=>1000,38966=>1000,38967=>1000,38968=>1000,38969=>1000,38970=>1000,38971=>1000,38972=>1000,38973=>1000,38974=>1000,38975=>1000,38976=>1000,38977=>1000,38978=>1000,38979=>1000,38980=>1000,38981=>1000,38982=>1000,38983=>1000,38984=>1000,38985=>1000,38986=>1000,38987=>1000,38988=>1000,38989=>1000,38990=>1000,38991=>1000,38992=>1000,38993=>1000,38994=>1000,38995=>1000,38996=>1000,38997=>1000,38998=>1000,38999=>1000,39000=>1000,39001=>1000,39002=>1000,39003=>1000,39004=>1000,39005=>1000,39006=>1000,39007=>1000,39008=>1000,39009=>1000,39010=>1000,39011=>1000,39012=>1000,39013=>1000,39014=>1000,39015=>1000,39016=>1000,39017=>1000,39018=>1000,39019=>1000,39020=>1000,39021=>1000,39022=>1000,39023=>1000,39024=>1000,39025=>1000,39026=>1000,39027=>1000,39028=>1000,39029=>1000,39030=>1000,39031=>1000,39032=>1000,39033=>1000,39034=>1000,39035=>1000,39036=>1000,39037=>1000,39038=>1000,39039=>1000,39040=>1000,39041=>1000,39042=>1000,39043=>1000,39044=>1000,39045=>1000,39046=>1000,39047=>1000,39048=>1000,39049=>1000,39050=>1000,39051=>1000,39052=>1000,39053=>1000,39054=>1000,39055=>1000,39056=>1000,39057=>1000,39058=>1000,39059=>1000,39060=>1000,39061=>1000,39062=>1000,39063=>1000,39064=>1000,39065=>1000,39066=>1000,39067=>1000,39068=>1000,39069=>1000,39070=>1000,39071=>1000,39072=>1000,39073=>1000,39074=>1000,39075=>1000,39076=>1000,39077=>1000,39078=>1000,39079=>1000,39080=>1000,39081=>1000,39082=>1000,39083=>1000,39084=>1000,39085=>1000,39086=>1000,39087=>1000,39088=>1000,39089=>1000,39090=>1000,39091=>1000,39092=>1000,39093=>1000,39094=>1000,39095=>1000,39096=>1000,39097=>1000,39098=>1000,39099=>1000,39100=>1000,39101=>1000,39102=>1000,39103=>1000,39104=>1000,39105=>1000,39106=>1000,39107=>1000,39108=>1000,39109=>1000,39110=>1000,39111=>1000,39112=>1000,39113=>1000,39114=>1000,39115=>1000,39116=>1000,39117=>1000,39118=>1000,39119=>1000,39120=>1000,39121=>1000,39122=>1000,39123=>1000,39124=>1000,39125=>1000,39126=>1000,39127=>1000,39128=>1000,39129=>1000,39130=>1000,39131=>1000,39132=>1000,39133=>1000,39134=>1000,39135=>1000,39136=>1000,39137=>1000,39138=>1000,39139=>1000,39140=>1000,39141=>1000,39142=>1000,39143=>1000,39144=>1000,39145=>1000,39146=>1000,39147=>1000,39148=>1000,39149=>1000,39150=>1000,39151=>1000,39152=>1000,39153=>1000,39154=>1000,39155=>1000,39156=>1000,39157=>1000,39158=>1000,39159=>1000,39160=>1000,39161=>1000,39162=>1000,39163=>1000,39164=>1000,39165=>1000,39166=>1000,39167=>1000,39168=>1000,39169=>1000,39170=>1000,39171=>1000,39172=>1000,39173=>1000,39174=>1000,39175=>1000,39176=>1000,39177=>1000,39178=>1000,39179=>1000,39180=>1000,39181=>1000,39182=>1000,39183=>1000,39184=>1000,39185=>1000,39186=>1000,39187=>1000,39188=>1000,39189=>1000,39190=>1000,39191=>1000,39192=>1000,39193=>1000,39194=>1000,39195=>1000,39196=>1000,39197=>1000,39198=>1000,39199=>1000,39200=>1000,39201=>1000,39202=>1000,39203=>1000,39204=>1000,39205=>1000,39206=>1000,39207=>1000,39208=>1000,39209=>1000,39210=>1000,39211=>1000,39212=>1000,39213=>1000,39214=>1000,39215=>1000,39216=>1000,39217=>1000,39218=>1000,39219=>1000,39220=>1000,39221=>1000,39222=>1000,39223=>1000,39224=>1000,39225=>1000,39226=>1000,39227=>1000,39228=>1000,39229=>1000,39230=>1000,39231=>1000,39232=>1000,39233=>1000,39234=>1000,39235=>1000,39236=>1000,39237=>1000,39238=>1000,39239=>1000,39240=>1000,39241=>1000,39242=>1000,39243=>1000,39244=>1000,39245=>1000,39246=>1000,39247=>1000,39248=>1000,39249=>1000,39250=>1000,39251=>1000,39252=>1000,39253=>1000,39254=>1000,39255=>1000,39256=>1000,39257=>1000,39258=>1000,39259=>1000,39260=>1000,39261=>1000,39262=>1000,39263=>1000,39264=>1000,39265=>1000,39266=>1000,39267=>1000,39268=>1000,39269=>1000,39270=>1000,39271=>1000,39272=>1000,39273=>1000,39274=>1000,39275=>1000,39276=>1000,39277=>1000,39278=>1000,39279=>1000,39280=>1000,39281=>1000,39282=>1000,39283=>1000,39284=>1000,39285=>1000,39286=>1000,39287=>1000,39288=>1000,39289=>1000,39290=>1000,39291=>1000,39292=>1000,39293=>1000,39294=>1000,39295=>1000,39296=>1000,39297=>1000,39298=>1000,39299=>1000,39300=>1000,39301=>1000,39302=>1000,39303=>1000,39304=>1000,39305=>1000,39306=>1000,39307=>1000,39308=>1000,39309=>1000,39310=>1000,39311=>1000,39312=>1000,39313=>1000,39314=>1000,39315=>1000,39316=>1000,39317=>1000,39318=>1000,39319=>1000,39320=>1000,39321=>1000,39322=>1000,39323=>1000,39324=>1000,39325=>1000,39326=>1000,39327=>1000,39328=>1000,39329=>1000,39330=>1000,39331=>1000,39332=>1000,39333=>1000,39334=>1000,39335=>1000,39336=>1000,39337=>1000,39338=>1000,39339=>1000,39340=>1000,39341=>1000,39342=>1000,39343=>1000,39344=>1000,39345=>1000,39346=>1000,39347=>1000,39348=>1000,39349=>1000,39350=>1000,39351=>1000,39352=>1000,39353=>1000,39354=>1000,39355=>1000,39356=>1000,39357=>1000,39358=>1000,39359=>1000,39360=>1000,39361=>1000,39362=>1000,39363=>1000,39364=>1000,39365=>1000,39366=>1000,39367=>1000,39368=>1000,39369=>1000,39370=>1000,39371=>1000,39372=>1000,39373=>1000,39374=>1000,39375=>1000,39376=>1000,39377=>1000,39378=>1000,39379=>1000,39380=>1000,39381=>1000,39382=>1000,39383=>1000,39384=>1000,39385=>1000,39386=>1000,39387=>1000,39388=>1000,39389=>1000,39390=>1000,39391=>1000,39392=>1000,39393=>1000,39394=>1000,39395=>1000,39396=>1000,39397=>1000,39398=>1000,39399=>1000,39400=>1000,39401=>1000,39402=>1000,39403=>1000,39404=>1000,39405=>1000,39406=>1000,39407=>1000,39408=>1000,39409=>1000,39410=>1000,39411=>1000,39412=>1000,39413=>1000,39414=>1000,39415=>1000,39416=>1000,39417=>1000,39418=>1000,39419=>1000,39420=>1000,39421=>1000,39422=>1000,39423=>1000,39424=>1000,39425=>1000,39426=>1000,39427=>1000,39428=>1000,39429=>1000,39430=>1000,39431=>1000,39432=>1000,39433=>1000,39434=>1000,39435=>1000,39436=>1000,39437=>1000,39438=>1000,39439=>1000,39440=>1000,39441=>1000,39442=>1000,39443=>1000,39444=>1000,39445=>1000,39446=>1000,39447=>1000,39448=>1000,39449=>1000,39450=>1000,39451=>1000,39452=>1000,39453=>1000,39454=>1000,39455=>1000,39456=>1000,39457=>1000,39458=>1000,39459=>1000,39460=>1000,39461=>1000,39462=>1000,39463=>1000,39464=>1000,39465=>1000,39466=>1000,39467=>1000,39468=>1000,39469=>1000,39470=>1000,39471=>1000,39472=>1000,39473=>1000,39474=>1000,39475=>1000,39476=>1000,39477=>1000,39478=>1000,39479=>1000,39480=>1000,39481=>1000,39482=>1000,39483=>1000,39484=>1000,39485=>1000,39486=>1000,39487=>1000,39488=>1000,39489=>1000,39490=>1000,39491=>1000,39492=>1000,39493=>1000,39494=>1000,39495=>1000,39496=>1000,39497=>1000,39498=>1000,39499=>1000,39500=>1000,39501=>1000,39502=>1000,39503=>1000,39504=>1000,39505=>1000,39506=>1000,39507=>1000,39508=>1000,39509=>1000,39510=>1000,39511=>1000,39512=>1000,39513=>1000,39514=>1000,39515=>1000,39516=>1000,39517=>1000,39518=>1000,39519=>1000,39520=>1000,39521=>1000,39522=>1000,39523=>1000,39524=>1000,39525=>1000,39526=>1000,39527=>1000,39528=>1000,39529=>1000,39530=>1000,39531=>1000,39532=>1000,39533=>1000,39534=>1000,39535=>1000,39536=>1000,39537=>1000,39538=>1000,39539=>1000,39540=>1000,39541=>1000,39542=>1000,39543=>1000,39544=>1000,39545=>1000,39546=>1000,39547=>1000,39548=>1000,39549=>1000,39550=>1000,39551=>1000,39552=>1000,39553=>1000,39554=>1000,39555=>1000,39556=>1000,39557=>1000,39558=>1000,39559=>1000,39560=>1000,39561=>1000,39562=>1000,39563=>1000,39564=>1000,39565=>1000,39566=>1000,39567=>1000,39568=>1000,39569=>1000,39570=>1000,39571=>1000,39572=>1000,39573=>1000,39574=>1000,39575=>1000,39576=>1000,39577=>1000,39578=>1000,39579=>1000,39580=>1000,39581=>1000,39582=>1000,39583=>1000,39584=>1000,39585=>1000,39586=>1000,39587=>1000,39588=>1000,39589=>1000,39590=>1000,39591=>1000,39592=>1000,39593=>1000,39594=>1000,39595=>1000,39596=>1000,39597=>1000,39598=>1000,39599=>1000,39600=>1000,39601=>1000,39602=>1000,39603=>1000,39604=>1000,39605=>1000,39606=>1000,39607=>1000,39608=>1000,39609=>1000,39610=>1000,39611=>1000,39612=>1000,39613=>1000,39614=>1000,39615=>1000,39616=>1000,39617=>1000,39618=>1000,39619=>1000,39620=>1000,39621=>1000,39622=>1000,39623=>1000,39624=>1000,39625=>1000,39626=>1000,39627=>1000,39628=>1000,39629=>1000,39630=>1000,39631=>1000,39632=>1000,39633=>1000,39634=>1000,39635=>1000,39636=>1000,39637=>1000,39638=>1000,39639=>1000,39640=>1000,39641=>1000,39642=>1000,39643=>1000,39644=>1000,39645=>1000,39646=>1000,39647=>1000,39648=>1000,39649=>1000,39650=>1000,39651=>1000,39652=>1000,39653=>1000,39654=>1000,39655=>1000,39656=>1000,39657=>1000,39658=>1000,39659=>1000,39660=>1000,39661=>1000,39662=>1000,39663=>1000,39664=>1000,39665=>1000,39666=>1000,39667=>1000,39668=>1000,39669=>1000,39670=>1000,39671=>1000,39672=>1000,39673=>1000,39674=>1000,39675=>1000,39676=>1000,39677=>1000,39678=>1000,39679=>1000,39680=>1000,39681=>1000,39682=>1000,39683=>1000,39684=>1000,39685=>1000,39686=>1000,39687=>1000,39688=>1000,39689=>1000,39690=>1000,39691=>1000,39692=>1000,39693=>1000,39694=>1000,39695=>1000,39696=>1000,39697=>1000,39698=>1000,39699=>1000,39700=>1000,39701=>1000,39702=>1000,39703=>1000,39704=>1000,39705=>1000,39706=>1000,39707=>1000,39708=>1000,39709=>1000,39710=>1000,39711=>1000,39712=>1000,39713=>1000,39714=>1000,39715=>1000,39716=>1000,39717=>1000,39718=>1000,39719=>1000,39720=>1000,39721=>1000,39722=>1000,39723=>1000,39724=>1000,39725=>1000,39726=>1000,39727=>1000,39728=>1000,39729=>1000,39730=>1000,39731=>1000,39732=>1000,39733=>1000,39734=>1000,39735=>1000,39736=>1000,39737=>1000,39738=>1000,39739=>1000,39740=>1000,39741=>1000,39742=>1000,39743=>1000,39744=>1000,39745=>1000,39746=>1000,39747=>1000,39748=>1000,39749=>1000,39750=>1000,39751=>1000,39752=>1000,39753=>1000,39754=>1000,39755=>1000,39756=>1000,39757=>1000,39758=>1000,39759=>1000,39760=>1000,39761=>1000,39762=>1000,39763=>1000,39764=>1000,39765=>1000,39766=>1000,39767=>1000,39768=>1000,39769=>1000,39770=>1000,39771=>1000,39772=>1000,39773=>1000,39774=>1000,39775=>1000,39776=>1000,39777=>1000,39778=>1000,39779=>1000,39780=>1000,39781=>1000,39782=>1000,39783=>1000,39784=>1000,39785=>1000,39786=>1000,39787=>1000,39788=>1000,39789=>1000,39790=>1000,39791=>1000,39792=>1000,39793=>1000,39794=>1000,39795=>1000,39796=>1000,39797=>1000,39798=>1000,39799=>1000,39800=>1000,39801=>1000,39802=>1000,39803=>1000,39804=>1000,39805=>1000,39806=>1000,39807=>1000,39808=>1000,39809=>1000,39810=>1000,39811=>1000,39812=>1000,39813=>1000,39814=>1000,39815=>1000,39816=>1000,39817=>1000,39818=>1000,39819=>1000,39820=>1000,39821=>1000,39822=>1000,39823=>1000,39824=>1000,39825=>1000,39826=>1000,39827=>1000,39828=>1000,39829=>1000,39830=>1000,39831=>1000,39832=>1000,39833=>1000,39834=>1000,39835=>1000,39836=>1000,39837=>1000,39838=>1000,39839=>1000,39840=>1000,39841=>1000,39842=>1000,39843=>1000,39844=>1000,39845=>1000,39846=>1000,39847=>1000,39848=>1000,39849=>1000,39850=>1000,39851=>1000,39852=>1000,39853=>1000,39854=>1000,39855=>1000,39856=>1000,39857=>1000,39858=>1000,39859=>1000,39860=>1000,39861=>1000,39862=>1000,39863=>1000,39864=>1000,39865=>1000,39866=>1000,39867=>1000,39868=>1000,39869=>1000,39870=>1000,39871=>1000,39872=>1000,39873=>1000,39874=>1000,39875=>1000,39876=>1000,39877=>1000,39878=>1000,39879=>1000,39880=>1000,39881=>1000,39882=>1000,39883=>1000,39884=>1000,39885=>1000,39886=>1000,39887=>1000,39888=>1000,39889=>1000,39890=>1000,39891=>1000,39892=>1000,39893=>1000,39894=>1000,39895=>1000,39896=>1000,39897=>1000,39898=>1000,39899=>1000,39900=>1000,39901=>1000,39902=>1000,39903=>1000,39904=>1000,39905=>1000,39906=>1000,39907=>1000,39908=>1000,39909=>1000,39910=>1000,39911=>1000,39912=>1000,39913=>1000,39914=>1000,39915=>1000,39916=>1000,39917=>1000,39918=>1000,39919=>1000,39920=>1000,39921=>1000,39922=>1000,39923=>1000,39924=>1000,39925=>1000,39926=>1000,39927=>1000,39928=>1000,39929=>1000,39930=>1000,39931=>1000,39932=>1000,39933=>1000,39934=>1000,39935=>1000,39936=>1000,39937=>1000,39938=>1000,39939=>1000,39940=>1000,39941=>1000,39942=>1000,39943=>1000,39944=>1000,39945=>1000,39946=>1000,39947=>1000,39948=>1000,39949=>1000,39950=>1000,39951=>1000,39952=>1000,39953=>1000,39954=>1000,39955=>1000,39956=>1000,39957=>1000,39958=>1000,39959=>1000,39960=>1000,39961=>1000,39962=>1000,39963=>1000,39964=>1000,39965=>1000,39966=>1000,39967=>1000,39968=>1000,39969=>1000,39970=>1000,39971=>1000,39972=>1000,39973=>1000,39974=>1000,39975=>1000,39976=>1000,39977=>1000,39978=>1000,39979=>1000,39980=>1000,39981=>1000,39982=>1000,39983=>1000,39984=>1000,39985=>1000,39986=>1000,39987=>1000,39988=>1000,39989=>1000,39990=>1000,39991=>1000,39992=>1000,39993=>1000,39994=>1000,39995=>1000,39996=>1000,39997=>1000,39998=>1000,39999=>1000,40000=>1000,40001=>1000,40002=>1000,40003=>1000,40004=>1000,40005=>1000,40006=>1000,40007=>1000,40008=>1000,40009=>1000,40010=>1000,40011=>1000,40012=>1000,40013=>1000,40014=>1000,40015=>1000,40016=>1000,40017=>1000,40018=>1000,40019=>1000,40020=>1000,40021=>1000,40022=>1000,40023=>1000,40024=>1000,40025=>1000,40026=>1000,40027=>1000,40028=>1000,40029=>1000,40030=>1000,40031=>1000,40032=>1000,40033=>1000,40034=>1000,40035=>1000,40036=>1000,40037=>1000,40038=>1000,40039=>1000,40040=>1000,40041=>1000,40042=>1000,40043=>1000,40044=>1000,40045=>1000,40046=>1000,40047=>1000,40048=>1000,40049=>1000,40050=>1000,40051=>1000,40052=>1000,40053=>1000,40054=>1000,40055=>1000,40056=>1000,40057=>1000,40058=>1000,40059=>1000,40060=>1000,40061=>1000,40062=>1000,40063=>1000,40064=>1000,40065=>1000,40066=>1000,40067=>1000,40068=>1000,40069=>1000,40070=>1000,40071=>1000,40072=>1000,40073=>1000,40074=>1000,40075=>1000,40076=>1000,40077=>1000,40078=>1000,40079=>1000,40080=>1000,40081=>1000,40082=>1000,40083=>1000,40084=>1000,40085=>1000,40086=>1000,40087=>1000,40088=>1000,40089=>1000,40090=>1000,40091=>1000,40092=>1000,40093=>1000,40094=>1000,40095=>1000,40096=>1000,40097=>1000,40098=>1000,40099=>1000,40100=>1000,40101=>1000,40102=>1000,40103=>1000,40104=>1000,40105=>1000,40106=>1000,40107=>1000,40108=>1000,40109=>1000,40110=>1000,40111=>1000,40112=>1000,40113=>1000,40114=>1000,40115=>1000,40116=>1000,40117=>1000,40118=>1000,40119=>1000,40120=>1000,40121=>1000,40122=>1000,40123=>1000,40124=>1000,40125=>1000,40126=>1000,40127=>1000,40128=>1000,40129=>1000,40130=>1000,40131=>1000,40132=>1000,40133=>1000,40134=>1000,40135=>1000,40136=>1000,40137=>1000,40138=>1000,40139=>1000,40140=>1000,40141=>1000,40142=>1000,40143=>1000,40144=>1000,40145=>1000,40146=>1000,40147=>1000,40148=>1000,40149=>1000,40150=>1000,40151=>1000,40152=>1000,40153=>1000,40154=>1000,40155=>1000,40156=>1000,40157=>1000,40158=>1000,40159=>1000,40160=>1000,40161=>1000,40162=>1000,40163=>1000,40164=>1000,40165=>1000,40166=>1000,40167=>1000,40168=>1000,40169=>1000,40170=>1000,40171=>1000,40172=>1000,40173=>1000,40174=>1000,40175=>1000,40176=>1000,40177=>1000,40178=>1000,40179=>1000,40180=>1000,40181=>1000,40182=>1000,40183=>1000,40184=>1000,40185=>1000,40186=>1000,40187=>1000,40188=>1000,40189=>1000,40190=>1000,40191=>1000,40192=>1000,40193=>1000,40194=>1000,40195=>1000,40196=>1000,40197=>1000,40198=>1000,40199=>1000,40200=>1000,40201=>1000,40202=>1000,40203=>1000,40204=>1000,40205=>1000,40206=>1000,40207=>1000,40208=>1000,40209=>1000,40210=>1000,40211=>1000,40212=>1000,40213=>1000,40214=>1000,40215=>1000,40216=>1000,40217=>1000,40218=>1000,40219=>1000,40220=>1000,40221=>1000,40222=>1000,40223=>1000,40224=>1000,40225=>1000,40226=>1000,40227=>1000,40228=>1000,40229=>1000,40230=>1000,40231=>1000,40232=>1000,40233=>1000,40234=>1000,40235=>1000,40236=>1000,40237=>1000,40238=>1000,40239=>1000,40240=>1000,40241=>1000,40242=>1000,40243=>1000,40244=>1000,40245=>1000,40246=>1000,40247=>1000,40248=>1000,40249=>1000,40250=>1000,40251=>1000,40252=>1000,40253=>1000,40254=>1000,40255=>1000,40256=>1000,40257=>1000,40258=>1000,40259=>1000,40260=>1000,40261=>1000,40262=>1000,40263=>1000,40264=>1000,40265=>1000,40266=>1000,40267=>1000,40268=>1000,40269=>1000,40270=>1000,40271=>1000,40272=>1000,40273=>1000,40274=>1000,40275=>1000,40276=>1000,40277=>1000,40278=>1000,40279=>1000,40280=>1000,40281=>1000,40282=>1000,40283=>1000,40284=>1000,40285=>1000,40286=>1000,40287=>1000,40288=>1000,40289=>1000,40290=>1000,40291=>1000,40292=>1000,40293=>1000,40294=>1000,40295=>1000,40296=>1000,40297=>1000,40298=>1000,40299=>1000,40300=>1000,40301=>1000,40302=>1000,40303=>1000,40304=>1000,40305=>1000,40306=>1000,40307=>1000,40308=>1000,40309=>1000,40310=>1000,40311=>1000,40312=>1000,40313=>1000,40314=>1000,40315=>1000,40316=>1000,40317=>1000,40318=>1000,40319=>1000,40320=>1000,40321=>1000,40322=>1000,40323=>1000,40324=>1000,40325=>1000,40326=>1000,40327=>1000,40328=>1000,40329=>1000,40330=>1000,40331=>1000,40332=>1000,40333=>1000,40334=>1000,40335=>1000,40336=>1000,40337=>1000,40338=>1000,40339=>1000,40340=>1000,40341=>1000,40342=>1000,40343=>1000,40344=>1000,40345=>1000,40346=>1000,40347=>1000,40348=>1000,40349=>1000,40350=>1000,40351=>1000,40352=>1000,40353=>1000,40354=>1000,40355=>1000,40356=>1000,40357=>1000,40358=>1000,40359=>1000,40360=>1000,40361=>1000,40362=>1000,40363=>1000,40364=>1000,40365=>1000,40366=>1000,40367=>1000,40368=>1000,40369=>1000,40370=>1000,40371=>1000,40372=>1000,40373=>1000,40374=>1000,40375=>1000,40376=>1000,40377=>1000,40378=>1000,40379=>1000,40380=>1000,40381=>1000,40382=>1000,40383=>1000,40384=>1000,40385=>1000,40386=>1000,40387=>1000,40388=>1000,40389=>1000,40390=>1000,40391=>1000,40392=>1000,40393=>1000,40394=>1000,40395=>1000,40396=>1000,40397=>1000,40398=>1000,40399=>1000,40400=>1000,40401=>1000,40402=>1000,40403=>1000,40404=>1000,40405=>1000,40406=>1000,40407=>1000,40408=>1000,40409=>1000,40410=>1000,40411=>1000,40412=>1000,40413=>1000,40414=>1000,40415=>1000,40416=>1000,40417=>1000,40418=>1000,40419=>1000,40420=>1000,40421=>1000,40422=>1000,40423=>1000,40424=>1000,40425=>1000,40426=>1000,40427=>1000,40428=>1000,40429=>1000,40430=>1000,40431=>1000,40432=>1000,40433=>1000,40434=>1000,40435=>1000,40436=>1000,40437=>1000,40438=>1000,40439=>1000,40440=>1000,40441=>1000,40442=>1000,40443=>1000,40444=>1000,40445=>1000,40446=>1000,40447=>1000,40448=>1000,40449=>1000,40450=>1000,40451=>1000,40452=>1000,40453=>1000,40454=>1000,40455=>1000,40456=>1000,40457=>1000,40458=>1000,40459=>1000,40460=>1000,40461=>1000,40462=>1000,40463=>1000,40464=>1000,40465=>1000,40466=>1000,40467=>1000,40468=>1000,40469=>1000,40470=>1000,40471=>1000,40472=>1000,40473=>1000,40474=>1000,40475=>1000,40476=>1000,40477=>1000,40478=>1000,40479=>1000,40480=>1000,40481=>1000,40482=>1000,40483=>1000,40484=>1000,40485=>1000,40486=>1000,40487=>1000,40488=>1000,40489=>1000,40490=>1000,40491=>1000,40492=>1000,40493=>1000,40494=>1000,40495=>1000,40496=>1000,40497=>1000,40498=>1000,40499=>1000,40500=>1000,40501=>1000,40502=>1000,40503=>1000,40504=>1000,40505=>1000,40506=>1000,40507=>1000,40508=>1000,40509=>1000,40510=>1000,40511=>1000,40512=>1000,40513=>1000,40514=>1000,40515=>1000,40516=>1000,40517=>1000,40518=>1000,40519=>1000,40520=>1000,40521=>1000,40522=>1000,40523=>1000,40524=>1000,40525=>1000,40526=>1000,40527=>1000,40528=>1000,40529=>1000,40530=>1000,40531=>1000,40532=>1000,40533=>1000,40534=>1000,40535=>1000,40536=>1000,40537=>1000,40538=>1000,40539=>1000,40540=>1000,40541=>1000,40542=>1000,40543=>1000,40544=>1000,40545=>1000,40546=>1000,40547=>1000,40548=>1000,40549=>1000,40550=>1000,40551=>1000,40552=>1000,40553=>1000,40554=>1000,40555=>1000,40556=>1000,40557=>1000,40558=>1000,40559=>1000,40560=>1000,40561=>1000,40562=>1000,40563=>1000,40564=>1000,40565=>1000,40566=>1000,40567=>1000,40568=>1000,40569=>1000,40570=>1000,40571=>1000,40572=>1000,40573=>1000,40574=>1000,40575=>1000,40576=>1000,40577=>1000,40578=>1000,40579=>1000,40580=>1000,40581=>1000,40582=>1000,40583=>1000,40584=>1000,40585=>1000,40586=>1000,40587=>1000,40588=>1000,40589=>1000,40590=>1000,40591=>1000,40592=>1000,40593=>1000,40594=>1000,40595=>1000,40596=>1000,40597=>1000,40598=>1000,40599=>1000,40600=>1000,40601=>1000,40602=>1000,40603=>1000,40604=>1000,40605=>1000,40606=>1000,40607=>1000,40608=>1000,40609=>1000,40610=>1000,40611=>1000,40612=>1000,40613=>1000,40614=>1000,40615=>1000,40616=>1000,40617=>1000,40618=>1000,40619=>1000,40620=>1000,40621=>1000,40622=>1000,40623=>1000,40624=>1000,40625=>1000,40626=>1000,40627=>1000,40628=>1000,40629=>1000,40630=>1000,40631=>1000,40632=>1000,40633=>1000,40634=>1000,40635=>1000,40636=>1000,40637=>1000,40638=>1000,40639=>1000,40640=>1000,40641=>1000,40642=>1000,40643=>1000,40644=>1000,40645=>1000,40646=>1000,40647=>1000,40648=>1000,40649=>1000,40650=>1000,40651=>1000,40652=>1000,40653=>1000,40654=>1000,40655=>1000,40656=>1000,40657=>1000,40658=>1000,40659=>1000,40660=>1000,40661=>1000,40662=>1000,40663=>1000,40664=>1000,40665=>1000,40666=>1000,40667=>1000,40668=>1000,40669=>1000,40670=>1000,40671=>1000,40672=>1000,40673=>1000,40674=>1000,40675=>1000,40676=>1000,40677=>1000,40678=>1000,40679=>1000,40680=>1000,40681=>1000,40682=>1000,40683=>1000,40684=>1000,40685=>1000,40686=>1000,40687=>1000,40688=>1000,40689=>1000,40690=>1000,40691=>1000,40692=>1000,40693=>1000,40694=>1000,40695=>1000,40696=>1000,40697=>1000,40698=>1000,40699=>1000,40700=>1000,40701=>1000,40702=>1000,40703=>1000,40704=>1000,40705=>1000,40706=>1000,40707=>1000,40708=>1000,40709=>1000,40710=>1000,40711=>1000,40712=>1000,40713=>1000,40714=>1000,40715=>1000,40716=>1000,40717=>1000,40718=>1000,40719=>1000,40720=>1000,40721=>1000,40722=>1000,40723=>1000,40724=>1000,40725=>1000,40726=>1000,40727=>1000,40728=>1000,40729=>1000,40730=>1000,40731=>1000,40732=>1000,40733=>1000,40734=>1000,40735=>1000,40736=>1000,40737=>1000,40738=>1000,40739=>1000,40740=>1000,40741=>1000,40742=>1000,40743=>1000,40744=>1000,40745=>1000,40746=>1000,40747=>1000,40748=>1000,40749=>1000,40750=>1000,40751=>1000,40752=>1000,40753=>1000,40754=>1000,40755=>1000,40756=>1000,40757=>1000,40758=>1000,40759=>1000,40760=>1000,40761=>1000,40762=>1000,40763=>1000,40764=>1000,40765=>1000,40766=>1000,40767=>1000,40768=>1000,40769=>1000,40770=>1000,40771=>1000,40772=>1000,40773=>1000,40774=>1000,40775=>1000,40776=>1000,40777=>1000,40778=>1000,40779=>1000,40780=>1000,40781=>1000,40782=>1000,40783=>1000,40784=>1000,40785=>1000,40786=>1000,40787=>1000,40788=>1000,40789=>1000,40790=>1000,40791=>1000,40792=>1000,40793=>1000,40794=>1000,40795=>1000,40796=>1000,40797=>1000,40798=>1000,40799=>1000,40800=>1000,40801=>1000,40802=>1000,40803=>1000,40804=>1000,40805=>1000,40806=>1000,40807=>1000,40808=>1000,40809=>1000,40810=>1000,40811=>1000,40812=>1000,40813=>1000,40814=>1000,40815=>1000,40816=>1000,40817=>1000,40818=>1000,40819=>1000,40820=>1000,40821=>1000,40822=>1000,40823=>1000,40824=>1000,40825=>1000,40826=>1000,40827=>1000,40828=>1000,40829=>1000,40830=>1000,40831=>1000,40832=>1000,40833=>1000,40834=>1000,40835=>1000,40836=>1000,40837=>1000,40838=>1000,40839=>1000,40840=>1000,40841=>1000,40842=>1000,40843=>1000,40844=>1000,40845=>1000,40846=>1000,40847=>1000,40848=>1000,40849=>1000,40850=>1000,40851=>1000,40852=>1000,40853=>1000,40854=>1000,40855=>1000,40856=>1000,40857=>1000,40858=>1000,40859=>1000,40860=>1000,40861=>1000,40862=>1000,40863=>1000,40864=>1000,40865=>1000,40866=>1000,40867=>1000,40868=>1000,40869=>1000,44032=>1000,44033=>1000,44034=>1000,44035=>1000,44036=>1000,44037=>1000,44038=>1000,44039=>1000,44040=>1000,44041=>1000,44042=>1000,44043=>1000,44044=>1000,44045=>1000,44046=>1000,44047=>1000,44048=>1000,44049=>1000,44050=>1000,44051=>1000,44052=>1000,44053=>1000,44054=>1000,44055=>1000,44056=>1000,44057=>1000,44058=>1000,44059=>1000,44060=>1000,44061=>1000,44062=>1000,44063=>1000,44064=>1000,44065=>1000,44066=>1000,44067=>1000,44068=>1000,44069=>1000,44070=>1000,44071=>1000,44072=>1000,44073=>1000,44074=>1000,44075=>1000,44076=>1000,44077=>1000,44078=>1000,44079=>1000,44080=>1000,44081=>1000,44082=>1000,44083=>1000,44084=>1000,44085=>1000,44086=>1000,44087=>1000,44088=>1000,44089=>1000,44090=>1000,44091=>1000,44092=>1000,44093=>1000,44094=>1000,44095=>1000,44096=>1000,44097=>1000,44098=>1000,44099=>1000,44100=>1000,44101=>1000,44102=>1000,44103=>1000,44104=>1000,44105=>1000,44106=>1000,44107=>1000,44108=>1000,44109=>1000,44110=>1000,44111=>1000,44112=>1000,44113=>1000,44114=>1000,44115=>1000,44116=>1000,44117=>1000,44118=>1000,44119=>1000,44120=>1000,44121=>1000,44122=>1000,44123=>1000,44124=>1000,44125=>1000,44126=>1000,44127=>1000,44128=>1000,44129=>1000,44130=>1000,44131=>1000,44132=>1000,44133=>1000,44134=>1000,44135=>1000,44136=>1000,44137=>1000,44138=>1000,44139=>1000,44140=>1000,44141=>1000,44142=>1000,44143=>1000,44144=>1000,44145=>1000,44146=>1000,44147=>1000,44148=>1000,44149=>1000,44150=>1000,44151=>1000,44152=>1000,44153=>1000,44154=>1000,44155=>1000,44156=>1000,44157=>1000,44158=>1000,44159=>1000,44160=>1000,44161=>1000,44162=>1000,44163=>1000,44164=>1000,44165=>1000,44166=>1000,44167=>1000,44168=>1000,44169=>1000,44170=>1000,44171=>1000,44172=>1000,44173=>1000,44174=>1000,44175=>1000,44176=>1000,44177=>1000,44178=>1000,44179=>1000,44180=>1000,44181=>1000,44182=>1000,44183=>1000,44184=>1000,44185=>1000,44186=>1000,44187=>1000,44188=>1000,44189=>1000,44190=>1000,44191=>1000,44192=>1000,44193=>1000,44194=>1000,44195=>1000,44196=>1000,44197=>1000,44198=>1000,44199=>1000,44200=>1000,44201=>1000,44202=>1000,44203=>1000,44204=>1000,44205=>1000,44206=>1000,44207=>1000,44208=>1000,44209=>1000,44210=>1000,44211=>1000,44212=>1000,44213=>1000,44214=>1000,44215=>1000,44216=>1000,44217=>1000,44218=>1000,44219=>1000,44220=>1000,44221=>1000,44222=>1000,44223=>1000,44224=>1000,44225=>1000,44226=>1000,44227=>1000,44228=>1000,44229=>1000,44230=>1000,44231=>1000,44232=>1000,44233=>1000,44234=>1000,44235=>1000,44236=>1000,44237=>1000,44238=>1000,44239=>1000,44240=>1000,44241=>1000,44242=>1000,44243=>1000,44244=>1000,44245=>1000,44246=>1000,44247=>1000,44248=>1000,44249=>1000,44250=>1000,44251=>1000,44252=>1000,44253=>1000,44254=>1000,44255=>1000,44256=>1000,44257=>1000,44258=>1000,44259=>1000,44260=>1000,44261=>1000,44262=>1000,44263=>1000,44264=>1000,44265=>1000,44266=>1000,44267=>1000,44268=>1000,44269=>1000,44270=>1000,44271=>1000,44272=>1000,44273=>1000,44274=>1000,44275=>1000,44276=>1000,44277=>1000,44278=>1000,44279=>1000,44280=>1000,44281=>1000,44282=>1000,44283=>1000,44284=>1000,44285=>1000,44286=>1000,44287=>1000,44288=>1000,44289=>1000,44290=>1000,44291=>1000,44292=>1000,44293=>1000,44294=>1000,44295=>1000,44296=>1000,44297=>1000,44298=>1000,44299=>1000,44300=>1000,44301=>1000,44302=>1000,44303=>1000,44304=>1000,44305=>1000,44306=>1000,44307=>1000,44308=>1000,44309=>1000,44310=>1000,44311=>1000,44312=>1000,44313=>1000,44314=>1000,44315=>1000,44316=>1000,44317=>1000,44318=>1000,44319=>1000,44320=>1000,44321=>1000,44322=>1000,44323=>1000,44324=>1000,44325=>1000,44326=>1000,44327=>1000,44328=>1000,44329=>1000,44330=>1000,44331=>1000,44332=>1000,44333=>1000,44334=>1000,44335=>1000,44336=>1000,44337=>1000,44338=>1000,44339=>1000,44340=>1000,44341=>1000,44342=>1000,44343=>1000,44344=>1000,44345=>1000,44346=>1000,44347=>1000,44348=>1000,44349=>1000,44350=>1000,44351=>1000,44352=>1000,44353=>1000,44354=>1000,44355=>1000,44356=>1000,44357=>1000,44358=>1000,44359=>1000,44360=>1000,44361=>1000,44362=>1000,44363=>1000,44364=>1000,44365=>1000,44366=>1000,44367=>1000,44368=>1000,44369=>1000,44370=>1000,44371=>1000,44372=>1000,44373=>1000,44374=>1000,44375=>1000,44376=>1000,44377=>1000,44378=>1000,44379=>1000,44380=>1000,44381=>1000,44382=>1000,44383=>1000,44384=>1000,44385=>1000,44386=>1000,44387=>1000,44388=>1000,44389=>1000,44390=>1000,44391=>1000,44392=>1000,44393=>1000,44394=>1000,44395=>1000,44396=>1000,44397=>1000,44398=>1000,44399=>1000,44400=>1000,44401=>1000,44402=>1000,44403=>1000,44404=>1000,44405=>1000,44406=>1000,44407=>1000,44408=>1000,44409=>1000,44410=>1000,44411=>1000,44412=>1000,44413=>1000,44414=>1000,44415=>1000,44416=>1000,44417=>1000,44418=>1000,44419=>1000,44420=>1000,44421=>1000,44422=>1000,44423=>1000,44424=>1000,44425=>1000,44426=>1000,44427=>1000,44428=>1000,44429=>1000,44430=>1000,44431=>1000,44432=>1000,44433=>1000,44434=>1000,44435=>1000,44436=>1000,44437=>1000,44438=>1000,44439=>1000,44440=>1000,44441=>1000,44442=>1000,44443=>1000,44444=>1000,44445=>1000,44446=>1000,44447=>1000,44448=>1000,44449=>1000,44450=>1000,44451=>1000,44452=>1000,44453=>1000,44454=>1000,44455=>1000,44456=>1000,44457=>1000,44458=>1000,44459=>1000,44460=>1000,44461=>1000,44462=>1000,44463=>1000,44464=>1000,44465=>1000,44466=>1000,44467=>1000,44468=>1000,44469=>1000,44470=>1000,44471=>1000,44472=>1000,44473=>1000,44474=>1000,44475=>1000,44476=>1000,44477=>1000,44478=>1000,44479=>1000,44480=>1000,44481=>1000,44482=>1000,44483=>1000,44484=>1000,44485=>1000,44486=>1000,44487=>1000,44488=>1000,44489=>1000,44490=>1000,44491=>1000,44492=>1000,44493=>1000,44494=>1000,44495=>1000,44496=>1000,44497=>1000,44498=>1000,44499=>1000,44500=>1000,44501=>1000,44502=>1000,44503=>1000,44504=>1000,44505=>1000,44506=>1000,44507=>1000,44508=>1000,44509=>1000,44510=>1000,44511=>1000,44512=>1000,44513=>1000,44514=>1000,44515=>1000,44516=>1000,44517=>1000,44518=>1000,44519=>1000,44520=>1000,44521=>1000,44522=>1000,44523=>1000,44524=>1000,44525=>1000,44526=>1000,44527=>1000,44528=>1000,44529=>1000,44530=>1000,44531=>1000,44532=>1000,44533=>1000,44534=>1000,44535=>1000,44536=>1000,44537=>1000,44538=>1000,44539=>1000,44540=>1000,44541=>1000,44542=>1000,44543=>1000,44544=>1000,44545=>1000,44546=>1000,44547=>1000,44548=>1000,44549=>1000,44550=>1000,44551=>1000,44552=>1000,44553=>1000,44554=>1000,44555=>1000,44556=>1000,44557=>1000,44558=>1000,44559=>1000,44560=>1000,44561=>1000,44562=>1000,44563=>1000,44564=>1000,44565=>1000,44566=>1000,44567=>1000,44568=>1000,44569=>1000,44570=>1000,44571=>1000,44572=>1000,44573=>1000,44574=>1000,44575=>1000,44576=>1000,44577=>1000,44578=>1000,44579=>1000,44580=>1000,44581=>1000,44582=>1000,44583=>1000,44584=>1000,44585=>1000,44586=>1000,44587=>1000,44588=>1000,44589=>1000,44590=>1000,44591=>1000,44592=>1000,44593=>1000,44594=>1000,44595=>1000,44596=>1000,44597=>1000,44598=>1000,44599=>1000,44600=>1000,44601=>1000,44602=>1000,44603=>1000,44604=>1000,44605=>1000,44606=>1000,44607=>1000,44608=>1000,44609=>1000,44610=>1000,44611=>1000,44612=>1000,44613=>1000,44614=>1000,44615=>1000,44616=>1000,44617=>1000,44618=>1000,44619=>1000,44620=>1000,44621=>1000,44622=>1000,44623=>1000,44624=>1000,44625=>1000,44626=>1000,44627=>1000,44628=>1000,44629=>1000,44630=>1000,44631=>1000,44632=>1000,44633=>1000,44634=>1000,44635=>1000,44636=>1000,44637=>1000,44638=>1000,44639=>1000,44640=>1000,44641=>1000,44642=>1000,44643=>1000,44644=>1000,44645=>1000,44646=>1000,44647=>1000,44648=>1000,44649=>1000,44650=>1000,44651=>1000,44652=>1000,44653=>1000,44654=>1000,44655=>1000,44656=>1000,44657=>1000,44658=>1000,44659=>1000,44660=>1000,44661=>1000,44662=>1000,44663=>1000,44664=>1000,44665=>1000,44666=>1000,44667=>1000,44668=>1000,44669=>1000,44670=>1000,44671=>1000,44672=>1000,44673=>1000,44674=>1000,44675=>1000,44676=>1000,44677=>1000,44678=>1000,44679=>1000,44680=>1000,44681=>1000,44682=>1000,44683=>1000,44684=>1000,44685=>1000,44686=>1000,44687=>1000,44688=>1000,44689=>1000,44690=>1000,44691=>1000,44692=>1000,44693=>1000,44694=>1000,44695=>1000,44696=>1000,44697=>1000,44698=>1000,44699=>1000,44700=>1000,44701=>1000,44702=>1000,44703=>1000,44704=>1000,44705=>1000,44706=>1000,44707=>1000,44708=>1000,44709=>1000,44710=>1000,44711=>1000,44712=>1000,44713=>1000,44714=>1000,44715=>1000,44716=>1000,44717=>1000,44718=>1000,44719=>1000,44720=>1000,44721=>1000,44722=>1000,44723=>1000,44724=>1000,44725=>1000,44726=>1000,44727=>1000,44728=>1000,44729=>1000,44730=>1000,44731=>1000,44732=>1000,44733=>1000,44734=>1000,44735=>1000,44736=>1000,44737=>1000,44738=>1000,44739=>1000,44740=>1000,44741=>1000,44742=>1000,44743=>1000,44744=>1000,44745=>1000,44746=>1000,44747=>1000,44748=>1000,44749=>1000,44750=>1000,44751=>1000,44752=>1000,44753=>1000,44754=>1000,44755=>1000,44756=>1000,44757=>1000,44758=>1000,44759=>1000,44760=>1000,44761=>1000,44762=>1000,44763=>1000,44764=>1000,44765=>1000,44766=>1000,44767=>1000,44768=>1000,44769=>1000,44770=>1000,44771=>1000,44772=>1000,44773=>1000,44774=>1000,44775=>1000,44776=>1000,44777=>1000,44778=>1000,44779=>1000,44780=>1000,44781=>1000,44782=>1000,44783=>1000,44784=>1000,44785=>1000,44786=>1000,44787=>1000,44788=>1000,44789=>1000,44790=>1000,44791=>1000,44792=>1000,44793=>1000,44794=>1000,44795=>1000,44796=>1000,44797=>1000,44798=>1000,44799=>1000,44800=>1000,44801=>1000,44802=>1000,44803=>1000,44804=>1000,44805=>1000,44806=>1000,44807=>1000,44808=>1000,44809=>1000,44810=>1000,44811=>1000,44812=>1000,44813=>1000,44814=>1000,44815=>1000,44816=>1000,44817=>1000,44818=>1000,44819=>1000,44820=>1000,44821=>1000,44822=>1000,44823=>1000,44824=>1000,44825=>1000,44826=>1000,44827=>1000,44828=>1000,44829=>1000,44830=>1000,44831=>1000,44832=>1000,44833=>1000,44834=>1000,44835=>1000,44836=>1000,44837=>1000,44838=>1000,44839=>1000,44840=>1000,44841=>1000,44842=>1000,44843=>1000,44844=>1000,44845=>1000,44846=>1000,44847=>1000,44848=>1000,44849=>1000,44850=>1000,44851=>1000,44852=>1000,44853=>1000,44854=>1000,44855=>1000,44856=>1000,44857=>1000,44858=>1000,44859=>1000,44860=>1000,44861=>1000,44862=>1000,44863=>1000,44864=>1000,44865=>1000,44866=>1000,44867=>1000,44868=>1000,44869=>1000,44870=>1000,44871=>1000,44872=>1000,44873=>1000,44874=>1000,44875=>1000,44876=>1000,44877=>1000,44878=>1000,44879=>1000,44880=>1000,44881=>1000,44882=>1000,44883=>1000,44884=>1000,44885=>1000,44886=>1000,44887=>1000,44888=>1000,44889=>1000,44890=>1000,44891=>1000,44892=>1000,44893=>1000,44894=>1000,44895=>1000,44896=>1000,44897=>1000,44898=>1000,44899=>1000,44900=>1000,44901=>1000,44902=>1000,44903=>1000,44904=>1000,44905=>1000,44906=>1000,44907=>1000,44908=>1000,44909=>1000,44910=>1000,44911=>1000,44912=>1000,44913=>1000,44914=>1000,44915=>1000,44916=>1000,44917=>1000,44918=>1000,44919=>1000,44920=>1000,44921=>1000,44922=>1000,44923=>1000,44924=>1000,44925=>1000,44926=>1000,44927=>1000,44928=>1000,44929=>1000,44930=>1000,44931=>1000,44932=>1000,44933=>1000,44934=>1000,44935=>1000,44936=>1000,44937=>1000,44938=>1000,44939=>1000,44940=>1000,44941=>1000,44942=>1000,44943=>1000,44944=>1000,44945=>1000,44946=>1000,44947=>1000,44948=>1000,44949=>1000,44950=>1000,44951=>1000,44952=>1000,44953=>1000,44954=>1000,44955=>1000,44956=>1000,44957=>1000,44958=>1000,44959=>1000,44960=>1000,44961=>1000,44962=>1000,44963=>1000,44964=>1000,44965=>1000,44966=>1000,44967=>1000,44968=>1000,44969=>1000,44970=>1000,44971=>1000,44972=>1000,44973=>1000,44974=>1000,44975=>1000,44976=>1000,44977=>1000,44978=>1000,44979=>1000,44980=>1000,44981=>1000,44982=>1000,44983=>1000,44984=>1000,44985=>1000,44986=>1000,44987=>1000,44988=>1000,44989=>1000,44990=>1000,44991=>1000,44992=>1000,44993=>1000,44994=>1000,44995=>1000,44996=>1000,44997=>1000,44998=>1000,44999=>1000,45000=>1000,45001=>1000,45002=>1000,45003=>1000,45004=>1000,45005=>1000,45006=>1000,45007=>1000,45008=>1000,45009=>1000,45010=>1000,45011=>1000,45012=>1000,45013=>1000,45014=>1000,45015=>1000,45016=>1000,45017=>1000,45018=>1000,45019=>1000,45020=>1000,45021=>1000,45022=>1000,45023=>1000,45024=>1000,45025=>1000,45026=>1000,45027=>1000,45028=>1000,45029=>1000,45030=>1000,45031=>1000,45032=>1000,45033=>1000,45034=>1000,45035=>1000,45036=>1000,45037=>1000,45038=>1000,45039=>1000,45040=>1000,45041=>1000,45042=>1000,45043=>1000,45044=>1000,45045=>1000,45046=>1000,45047=>1000,45048=>1000,45049=>1000,45050=>1000,45051=>1000,45052=>1000,45053=>1000,45054=>1000,45055=>1000,45056=>1000,45057=>1000,45058=>1000,45059=>1000,45060=>1000,45061=>1000,45062=>1000,45063=>1000,45064=>1000,45065=>1000,45066=>1000,45067=>1000,45068=>1000,45069=>1000,45070=>1000,45071=>1000,45072=>1000,45073=>1000,45074=>1000,45075=>1000,45076=>1000,45077=>1000,45078=>1000,45079=>1000,45080=>1000,45081=>1000,45082=>1000,45083=>1000,45084=>1000,45085=>1000,45086=>1000,45087=>1000,45088=>1000,45089=>1000,45090=>1000,45091=>1000,45092=>1000,45093=>1000,45094=>1000,45095=>1000,45096=>1000,45097=>1000,45098=>1000,45099=>1000,45100=>1000,45101=>1000,45102=>1000,45103=>1000,45104=>1000,45105=>1000,45106=>1000,45107=>1000,45108=>1000,45109=>1000,45110=>1000,45111=>1000,45112=>1000,45113=>1000,45114=>1000,45115=>1000,45116=>1000,45117=>1000,45118=>1000,45119=>1000,45120=>1000,45121=>1000,45122=>1000,45123=>1000,45124=>1000,45125=>1000,45126=>1000,45127=>1000,45128=>1000,45129=>1000,45130=>1000,45131=>1000,45132=>1000,45133=>1000,45134=>1000,45135=>1000,45136=>1000,45137=>1000,45138=>1000,45139=>1000,45140=>1000,45141=>1000,45142=>1000,45143=>1000,45144=>1000,45145=>1000,45146=>1000,45147=>1000,45148=>1000,45149=>1000,45150=>1000,45151=>1000,45152=>1000,45153=>1000,45154=>1000,45155=>1000,45156=>1000,45157=>1000,45158=>1000,45159=>1000,45160=>1000,45161=>1000,45162=>1000,45163=>1000,45164=>1000,45165=>1000,45166=>1000,45167=>1000,45168=>1000,45169=>1000,45170=>1000,45171=>1000,45172=>1000,45173=>1000,45174=>1000,45175=>1000,45176=>1000,45177=>1000,45178=>1000,45179=>1000,45180=>1000,45181=>1000,45182=>1000,45183=>1000,45184=>1000,45185=>1000,45186=>1000,45187=>1000,45188=>1000,45189=>1000,45190=>1000,45191=>1000,45192=>1000,45193=>1000,45194=>1000,45195=>1000,45196=>1000,45197=>1000,45198=>1000,45199=>1000,45200=>1000,45201=>1000,45202=>1000,45203=>1000,45204=>1000,45205=>1000,45206=>1000,45207=>1000,45208=>1000,45209=>1000,45210=>1000,45211=>1000,45212=>1000,45213=>1000,45214=>1000,45215=>1000,45216=>1000,45217=>1000,45218=>1000,45219=>1000,45220=>1000,45221=>1000,45222=>1000,45223=>1000,45224=>1000,45225=>1000,45226=>1000,45227=>1000,45228=>1000,45229=>1000,45230=>1000,45231=>1000,45232=>1000,45233=>1000,45234=>1000,45235=>1000,45236=>1000,45237=>1000,45238=>1000,45239=>1000,45240=>1000,45241=>1000,45242=>1000,45243=>1000,45244=>1000,45245=>1000,45246=>1000,45247=>1000,45248=>1000,45249=>1000,45250=>1000,45251=>1000,45252=>1000,45253=>1000,45254=>1000,45255=>1000,45256=>1000,45257=>1000,45258=>1000,45259=>1000,45260=>1000,45261=>1000,45262=>1000,45263=>1000,45264=>1000,45265=>1000,45266=>1000,45267=>1000,45268=>1000,45269=>1000,45270=>1000,45271=>1000,45272=>1000,45273=>1000,45274=>1000,45275=>1000,45276=>1000,45277=>1000,45278=>1000,45279=>1000,45280=>1000,45281=>1000,45282=>1000,45283=>1000,45284=>1000,45285=>1000,45286=>1000,45287=>1000,45288=>1000,45289=>1000,45290=>1000,45291=>1000,45292=>1000,45293=>1000,45294=>1000,45295=>1000,45296=>1000,45297=>1000,45298=>1000,45299=>1000,45300=>1000,45301=>1000,45302=>1000,45303=>1000,45304=>1000,45305=>1000,45306=>1000,45307=>1000,45308=>1000,45309=>1000,45310=>1000,45311=>1000,45312=>1000,45313=>1000,45314=>1000,45315=>1000,45316=>1000,45317=>1000,45318=>1000,45319=>1000,45320=>1000,45321=>1000,45322=>1000,45323=>1000,45324=>1000,45325=>1000,45326=>1000,45327=>1000,45328=>1000,45329=>1000,45330=>1000,45331=>1000,45332=>1000,45333=>1000,45334=>1000,45335=>1000,45336=>1000,45337=>1000,45338=>1000,45339=>1000,45340=>1000,45341=>1000,45342=>1000,45343=>1000,45344=>1000,45345=>1000,45346=>1000,45347=>1000,45348=>1000,45349=>1000,45350=>1000,45351=>1000,45352=>1000,45353=>1000,45354=>1000,45355=>1000,45356=>1000,45357=>1000,45358=>1000,45359=>1000,45360=>1000,45361=>1000,45362=>1000,45363=>1000,45364=>1000,45365=>1000,45366=>1000,45367=>1000,45368=>1000,45369=>1000,45370=>1000,45371=>1000,45372=>1000,45373=>1000,45374=>1000,45375=>1000,45376=>1000,45377=>1000,45378=>1000,45379=>1000,45380=>1000,45381=>1000,45382=>1000,45383=>1000,45384=>1000,45385=>1000,45386=>1000,45387=>1000,45388=>1000,45389=>1000,45390=>1000,45391=>1000,45392=>1000,45393=>1000,45394=>1000,45395=>1000,45396=>1000,45397=>1000,45398=>1000,45399=>1000,45400=>1000,45401=>1000,45402=>1000,45403=>1000,45404=>1000,45405=>1000,45406=>1000,45407=>1000,45408=>1000,45409=>1000,45410=>1000,45411=>1000,45412=>1000,45413=>1000,45414=>1000,45415=>1000,45416=>1000,45417=>1000,45418=>1000,45419=>1000,45420=>1000,45421=>1000,45422=>1000,45423=>1000,45424=>1000,45425=>1000,45426=>1000,45427=>1000,45428=>1000,45429=>1000,45430=>1000,45431=>1000,45432=>1000,45433=>1000,45434=>1000,45435=>1000,45436=>1000,45437=>1000,45438=>1000,45439=>1000,45440=>1000,45441=>1000,45442=>1000,45443=>1000,45444=>1000,45445=>1000,45446=>1000,45447=>1000,45448=>1000,45449=>1000,45450=>1000,45451=>1000,45452=>1000,45453=>1000,45454=>1000,45455=>1000,45456=>1000,45457=>1000,45458=>1000,45459=>1000,45460=>1000,45461=>1000,45462=>1000,45463=>1000,45464=>1000,45465=>1000,45466=>1000,45467=>1000,45468=>1000,45469=>1000,45470=>1000,45471=>1000,45472=>1000,45473=>1000,45474=>1000,45475=>1000,45476=>1000,45477=>1000,45478=>1000,45479=>1000,45480=>1000,45481=>1000,45482=>1000,45483=>1000,45484=>1000,45485=>1000,45486=>1000,45487=>1000,45488=>1000,45489=>1000,45490=>1000,45491=>1000,45492=>1000,45493=>1000,45494=>1000,45495=>1000,45496=>1000,45497=>1000,45498=>1000,45499=>1000,45500=>1000,45501=>1000,45502=>1000,45503=>1000,45504=>1000,45505=>1000,45506=>1000,45507=>1000,45508=>1000,45509=>1000,45510=>1000,45511=>1000,45512=>1000,45513=>1000,45514=>1000,45515=>1000,45516=>1000,45517=>1000,45518=>1000,45519=>1000,45520=>1000,45521=>1000,45522=>1000,45523=>1000,45524=>1000,45525=>1000,45526=>1000,45527=>1000,45528=>1000,45529=>1000,45530=>1000,45531=>1000,45532=>1000,45533=>1000,45534=>1000,45535=>1000,45536=>1000,45537=>1000,45538=>1000,45539=>1000,45540=>1000,45541=>1000,45542=>1000,45543=>1000,45544=>1000,45545=>1000,45546=>1000,45547=>1000,45548=>1000,45549=>1000,45550=>1000,45551=>1000,45552=>1000,45553=>1000,45554=>1000,45555=>1000,45556=>1000,45557=>1000,45558=>1000,45559=>1000,45560=>1000,45561=>1000,45562=>1000,45563=>1000,45564=>1000,45565=>1000,45566=>1000,45567=>1000,45568=>1000,45569=>1000,45570=>1000,45571=>1000,45572=>1000,45573=>1000,45574=>1000,45575=>1000,45576=>1000,45577=>1000,45578=>1000,45579=>1000,45580=>1000,45581=>1000,45582=>1000,45583=>1000,45584=>1000,45585=>1000,45586=>1000,45587=>1000,45588=>1000,45589=>1000,45590=>1000,45591=>1000,45592=>1000,45593=>1000,45594=>1000,45595=>1000,45596=>1000,45597=>1000,45598=>1000,45599=>1000,45600=>1000,45601=>1000,45602=>1000,45603=>1000,45604=>1000,45605=>1000,45606=>1000,45607=>1000,45608=>1000,45609=>1000,45610=>1000,45611=>1000,45612=>1000,45613=>1000,45614=>1000,45615=>1000,45616=>1000,45617=>1000,45618=>1000,45619=>1000,45620=>1000,45621=>1000,45622=>1000,45623=>1000,45624=>1000,45625=>1000,45626=>1000,45627=>1000,45628=>1000,45629=>1000,45630=>1000,45631=>1000,45632=>1000,45633=>1000,45634=>1000,45635=>1000,45636=>1000,45637=>1000,45638=>1000,45639=>1000,45640=>1000,45641=>1000,45642=>1000,45643=>1000,45644=>1000,45645=>1000,45646=>1000,45647=>1000,45648=>1000,45649=>1000,45650=>1000,45651=>1000,45652=>1000,45653=>1000,45654=>1000,45655=>1000,45656=>1000,45657=>1000,45658=>1000,45659=>1000,45660=>1000,45661=>1000,45662=>1000,45663=>1000,45664=>1000,45665=>1000,45666=>1000,45667=>1000,45668=>1000,45669=>1000,45670=>1000,45671=>1000,45672=>1000,45673=>1000,45674=>1000,45675=>1000,45676=>1000,45677=>1000,45678=>1000,45679=>1000,45680=>1000,45681=>1000,45682=>1000,45683=>1000,45684=>1000,45685=>1000,45686=>1000,45687=>1000,45688=>1000,45689=>1000,45690=>1000,45691=>1000,45692=>1000,45693=>1000,45694=>1000,45695=>1000,45696=>1000,45697=>1000,45698=>1000,45699=>1000,45700=>1000,45701=>1000,45702=>1000,45703=>1000,45704=>1000,45705=>1000,45706=>1000,45707=>1000,45708=>1000,45709=>1000,45710=>1000,45711=>1000,45712=>1000,45713=>1000,45714=>1000,45715=>1000,45716=>1000,45717=>1000,45718=>1000,45719=>1000,45720=>1000,45721=>1000,45722=>1000,45723=>1000,45724=>1000,45725=>1000,45726=>1000,45727=>1000,45728=>1000,45729=>1000,45730=>1000,45731=>1000,45732=>1000,45733=>1000,45734=>1000,45735=>1000,45736=>1000,45737=>1000,45738=>1000,45739=>1000,45740=>1000,45741=>1000,45742=>1000,45743=>1000,45744=>1000,45745=>1000,45746=>1000,45747=>1000,45748=>1000,45749=>1000,45750=>1000,45751=>1000,45752=>1000,45753=>1000,45754=>1000,45755=>1000,45756=>1000,45757=>1000,45758=>1000,45759=>1000,45760=>1000,45761=>1000,45762=>1000,45763=>1000,45764=>1000,45765=>1000,45766=>1000,45767=>1000,45768=>1000,45769=>1000,45770=>1000,45771=>1000,45772=>1000,45773=>1000,45774=>1000,45775=>1000,45776=>1000,45777=>1000,45778=>1000,45779=>1000,45780=>1000,45781=>1000,45782=>1000,45783=>1000,45784=>1000,45785=>1000,45786=>1000,45787=>1000,45788=>1000,45789=>1000,45790=>1000,45791=>1000,45792=>1000,45793=>1000,45794=>1000,45795=>1000,45796=>1000,45797=>1000,45798=>1000,45799=>1000,45800=>1000,45801=>1000,45802=>1000,45803=>1000,45804=>1000,45805=>1000,45806=>1000,45807=>1000,45808=>1000,45809=>1000,45810=>1000,45811=>1000,45812=>1000,45813=>1000,45814=>1000,45815=>1000,45816=>1000,45817=>1000,45818=>1000,45819=>1000,45820=>1000,45821=>1000,45822=>1000,45823=>1000,45824=>1000,45825=>1000,45826=>1000,45827=>1000,45828=>1000,45829=>1000,45830=>1000,45831=>1000,45832=>1000,45833=>1000,45834=>1000,45835=>1000,45836=>1000,45837=>1000,45838=>1000,45839=>1000,45840=>1000,45841=>1000,45842=>1000,45843=>1000,45844=>1000,45845=>1000,45846=>1000,45847=>1000,45848=>1000,45849=>1000,45850=>1000,45851=>1000,45852=>1000,45853=>1000,45854=>1000,45855=>1000,45856=>1000,45857=>1000,45858=>1000,45859=>1000,45860=>1000,45861=>1000,45862=>1000,45863=>1000,45864=>1000,45865=>1000,45866=>1000,45867=>1000,45868=>1000,45869=>1000,45870=>1000,45871=>1000,45872=>1000,45873=>1000,45874=>1000,45875=>1000,45876=>1000,45877=>1000,45878=>1000,45879=>1000,45880=>1000,45881=>1000,45882=>1000,45883=>1000,45884=>1000,45885=>1000,45886=>1000,45887=>1000,45888=>1000,45889=>1000,45890=>1000,45891=>1000,45892=>1000,45893=>1000,45894=>1000,45895=>1000,45896=>1000,45897=>1000,45898=>1000,45899=>1000,45900=>1000,45901=>1000,45902=>1000,45903=>1000,45904=>1000,45905=>1000,45906=>1000,45907=>1000,45908=>1000,45909=>1000,45910=>1000,45911=>1000,45912=>1000,45913=>1000,45914=>1000,45915=>1000,45916=>1000,45917=>1000,45918=>1000,45919=>1000,45920=>1000,45921=>1000,45922=>1000,45923=>1000,45924=>1000,45925=>1000,45926=>1000,45927=>1000,45928=>1000,45929=>1000,45930=>1000,45931=>1000,45932=>1000,45933=>1000,45934=>1000,45935=>1000,45936=>1000,45937=>1000,45938=>1000,45939=>1000,45940=>1000,45941=>1000,45942=>1000,45943=>1000,45944=>1000,45945=>1000,45946=>1000,45947=>1000,45948=>1000,45949=>1000,45950=>1000,45951=>1000,45952=>1000,45953=>1000,45954=>1000,45955=>1000,45956=>1000,45957=>1000,45958=>1000,45959=>1000,45960=>1000,45961=>1000,45962=>1000,45963=>1000,45964=>1000,45965=>1000,45966=>1000,45967=>1000,45968=>1000,45969=>1000,45970=>1000,45971=>1000,45972=>1000,45973=>1000,45974=>1000,45975=>1000,45976=>1000,45977=>1000,45978=>1000,45979=>1000,45980=>1000,45981=>1000,45982=>1000,45983=>1000,45984=>1000,45985=>1000,45986=>1000,45987=>1000,45988=>1000,45989=>1000,45990=>1000,45991=>1000,45992=>1000,45993=>1000,45994=>1000,45995=>1000,45996=>1000,45997=>1000,45998=>1000,45999=>1000,46000=>1000,46001=>1000,46002=>1000,46003=>1000,46004=>1000,46005=>1000,46006=>1000,46007=>1000,46008=>1000,46009=>1000,46010=>1000,46011=>1000,46012=>1000,46013=>1000,46014=>1000,46015=>1000,46016=>1000,46017=>1000,46018=>1000,46019=>1000,46020=>1000,46021=>1000,46022=>1000,46023=>1000,46024=>1000,46025=>1000,46026=>1000,46027=>1000,46028=>1000,46029=>1000,46030=>1000,46031=>1000,46032=>1000,46033=>1000,46034=>1000,46035=>1000,46036=>1000,46037=>1000,46038=>1000,46039=>1000,46040=>1000,46041=>1000,46042=>1000,46043=>1000,46044=>1000,46045=>1000,46046=>1000,46047=>1000,46048=>1000,46049=>1000,46050=>1000,46051=>1000,46052=>1000,46053=>1000,46054=>1000,46055=>1000,46056=>1000,46057=>1000,46058=>1000,46059=>1000,46060=>1000,46061=>1000,46062=>1000,46063=>1000,46064=>1000,46065=>1000,46066=>1000,46067=>1000,46068=>1000,46069=>1000,46070=>1000,46071=>1000,46072=>1000,46073=>1000,46074=>1000,46075=>1000,46076=>1000,46077=>1000,46078=>1000,46079=>1000,46080=>1000,46081=>1000,46082=>1000,46083=>1000,46084=>1000,46085=>1000,46086=>1000,46087=>1000,46088=>1000,46089=>1000,46090=>1000,46091=>1000,46092=>1000,46093=>1000,46094=>1000,46095=>1000,46096=>1000,46097=>1000,46098=>1000,46099=>1000,46100=>1000,46101=>1000,46102=>1000,46103=>1000,46104=>1000,46105=>1000,46106=>1000,46107=>1000,46108=>1000,46109=>1000,46110=>1000,46111=>1000,46112=>1000,46113=>1000,46114=>1000,46115=>1000,46116=>1000,46117=>1000,46118=>1000,46119=>1000,46120=>1000,46121=>1000,46122=>1000,46123=>1000,46124=>1000,46125=>1000,46126=>1000,46127=>1000,46128=>1000,46129=>1000,46130=>1000,46131=>1000,46132=>1000,46133=>1000,46134=>1000,46135=>1000,46136=>1000,46137=>1000,46138=>1000,46139=>1000,46140=>1000,46141=>1000,46142=>1000,46143=>1000,46144=>1000,46145=>1000,46146=>1000,46147=>1000,46148=>1000,46149=>1000,46150=>1000,46151=>1000,46152=>1000,46153=>1000,46154=>1000,46155=>1000,46156=>1000,46157=>1000,46158=>1000,46159=>1000,46160=>1000,46161=>1000,46162=>1000,46163=>1000,46164=>1000,46165=>1000,46166=>1000,46167=>1000,46168=>1000,46169=>1000,46170=>1000,46171=>1000,46172=>1000,46173=>1000,46174=>1000,46175=>1000,46176=>1000,46177=>1000,46178=>1000,46179=>1000,46180=>1000,46181=>1000,46182=>1000,46183=>1000,46184=>1000,46185=>1000,46186=>1000,46187=>1000,46188=>1000,46189=>1000,46190=>1000,46191=>1000,46192=>1000,46193=>1000,46194=>1000,46195=>1000,46196=>1000,46197=>1000,46198=>1000,46199=>1000,46200=>1000,46201=>1000,46202=>1000,46203=>1000,46204=>1000,46205=>1000,46206=>1000,46207=>1000,46208=>1000,46209=>1000,46210=>1000,46211=>1000,46212=>1000,46213=>1000,46214=>1000,46215=>1000,46216=>1000,46217=>1000,46218=>1000,46219=>1000,46220=>1000,46221=>1000,46222=>1000,46223=>1000,46224=>1000,46225=>1000,46226=>1000,46227=>1000,46228=>1000,46229=>1000,46230=>1000,46231=>1000,46232=>1000,46233=>1000,46234=>1000,46235=>1000,46236=>1000,46237=>1000,46238=>1000,46239=>1000,46240=>1000,46241=>1000,46242=>1000,46243=>1000,46244=>1000,46245=>1000,46246=>1000,46247=>1000,46248=>1000,46249=>1000,46250=>1000,46251=>1000,46252=>1000,46253=>1000,46254=>1000,46255=>1000,46256=>1000,46257=>1000,46258=>1000,46259=>1000,46260=>1000,46261=>1000,46262=>1000,46263=>1000,46264=>1000,46265=>1000,46266=>1000,46267=>1000,46268=>1000,46269=>1000,46270=>1000,46271=>1000,46272=>1000,46273=>1000,46274=>1000,46275=>1000,46276=>1000,46277=>1000,46278=>1000,46279=>1000,46280=>1000,46281=>1000,46282=>1000,46283=>1000,46284=>1000,46285=>1000,46286=>1000,46287=>1000,46288=>1000,46289=>1000,46290=>1000,46291=>1000,46292=>1000,46293=>1000,46294=>1000,46295=>1000,46296=>1000,46297=>1000,46298=>1000,46299=>1000,46300=>1000,46301=>1000,46302=>1000,46303=>1000,46304=>1000,46305=>1000,46306=>1000,46307=>1000,46308=>1000,46309=>1000,46310=>1000,46311=>1000,46312=>1000,46313=>1000,46314=>1000,46315=>1000,46316=>1000,46317=>1000,46318=>1000,46319=>1000,46320=>1000,46321=>1000,46322=>1000,46323=>1000,46324=>1000,46325=>1000,46326=>1000,46327=>1000,46328=>1000,46329=>1000,46330=>1000,46331=>1000,46332=>1000,46333=>1000,46334=>1000,46335=>1000,46336=>1000,46337=>1000,46338=>1000,46339=>1000,46340=>1000,46341=>1000,46342=>1000,46343=>1000,46344=>1000,46345=>1000,46346=>1000,46347=>1000,46348=>1000,46349=>1000,46350=>1000,46351=>1000,46352=>1000,46353=>1000,46354=>1000,46355=>1000,46356=>1000,46357=>1000,46358=>1000,46359=>1000,46360=>1000,46361=>1000,46362=>1000,46363=>1000,46364=>1000,46365=>1000,46366=>1000,46367=>1000,46368=>1000,46369=>1000,46370=>1000,46371=>1000,46372=>1000,46373=>1000,46374=>1000,46375=>1000,46376=>1000,46377=>1000,46378=>1000,46379=>1000,46380=>1000,46381=>1000,46382=>1000,46383=>1000,46384=>1000,46385=>1000,46386=>1000,46387=>1000,46388=>1000,46389=>1000,46390=>1000,46391=>1000,46392=>1000,46393=>1000,46394=>1000,46395=>1000,46396=>1000,46397=>1000,46398=>1000,46399=>1000,46400=>1000,46401=>1000,46402=>1000,46403=>1000,46404=>1000,46405=>1000,46406=>1000,46407=>1000,46408=>1000,46409=>1000,46410=>1000,46411=>1000,46412=>1000,46413=>1000,46414=>1000,46415=>1000,46416=>1000,46417=>1000,46418=>1000,46419=>1000,46420=>1000,46421=>1000,46422=>1000,46423=>1000,46424=>1000,46425=>1000,46426=>1000,46427=>1000,46428=>1000,46429=>1000,46430=>1000,46431=>1000,46432=>1000,46433=>1000,46434=>1000,46435=>1000,46436=>1000,46437=>1000,46438=>1000,46439=>1000,46440=>1000,46441=>1000,46442=>1000,46443=>1000,46444=>1000,46445=>1000,46446=>1000,46447=>1000,46448=>1000,46449=>1000,46450=>1000,46451=>1000,46452=>1000,46453=>1000,46454=>1000,46455=>1000,46456=>1000,46457=>1000,46458=>1000,46459=>1000,46460=>1000,46461=>1000,46462=>1000,46463=>1000,46464=>1000,46465=>1000,46466=>1000,46467=>1000,46468=>1000,46469=>1000,46470=>1000,46471=>1000,46472=>1000,46473=>1000,46474=>1000,46475=>1000,46476=>1000,46477=>1000,46478=>1000,46479=>1000,46480=>1000,46481=>1000,46482=>1000,46483=>1000,46484=>1000,46485=>1000,46486=>1000,46487=>1000,46488=>1000,46489=>1000,46490=>1000,46491=>1000,46492=>1000,46493=>1000,46494=>1000,46495=>1000,46496=>1000,46497=>1000,46498=>1000,46499=>1000,46500=>1000,46501=>1000,46502=>1000,46503=>1000,46504=>1000,46505=>1000,46506=>1000,46507=>1000,46508=>1000,46509=>1000,46510=>1000,46511=>1000,46512=>1000,46513=>1000,46514=>1000,46515=>1000,46516=>1000,46517=>1000,46518=>1000,46519=>1000,46520=>1000,46521=>1000,46522=>1000,46523=>1000,46524=>1000,46525=>1000,46526=>1000,46527=>1000,46528=>1000,46529=>1000,46530=>1000,46531=>1000,46532=>1000,46533=>1000,46534=>1000,46535=>1000,46536=>1000,46537=>1000,46538=>1000,46539=>1000,46540=>1000,46541=>1000,46542=>1000,46543=>1000,46544=>1000,46545=>1000,46546=>1000,46547=>1000,46548=>1000,46549=>1000,46550=>1000,46551=>1000,46552=>1000,46553=>1000,46554=>1000,46555=>1000,46556=>1000,46557=>1000,46558=>1000,46559=>1000,46560=>1000,46561=>1000,46562=>1000,46563=>1000,46564=>1000,46565=>1000,46566=>1000,46567=>1000,46568=>1000,46569=>1000,46570=>1000,46571=>1000,46572=>1000,46573=>1000,46574=>1000,46575=>1000,46576=>1000,46577=>1000,46578=>1000,46579=>1000,46580=>1000,46581=>1000,46582=>1000,46583=>1000,46584=>1000,46585=>1000,46586=>1000,46587=>1000,46588=>1000,46589=>1000,46590=>1000,46591=>1000,46592=>1000,46593=>1000,46594=>1000,46595=>1000,46596=>1000,46597=>1000,46598=>1000,46599=>1000,46600=>1000,46601=>1000,46602=>1000,46603=>1000,46604=>1000,46605=>1000,46606=>1000,46607=>1000,46608=>1000,46609=>1000,46610=>1000,46611=>1000,46612=>1000,46613=>1000,46614=>1000,46615=>1000,46616=>1000,46617=>1000,46618=>1000,46619=>1000,46620=>1000,46621=>1000,46622=>1000,46623=>1000,46624=>1000,46625=>1000,46626=>1000,46627=>1000,46628=>1000,46629=>1000,46630=>1000,46631=>1000,46632=>1000,46633=>1000,46634=>1000,46635=>1000,46636=>1000,46637=>1000,46638=>1000,46639=>1000,46640=>1000,46641=>1000,46642=>1000,46643=>1000,46644=>1000,46645=>1000,46646=>1000,46647=>1000,46648=>1000,46649=>1000,46650=>1000,46651=>1000,46652=>1000,46653=>1000,46654=>1000,46655=>1000,46656=>1000,46657=>1000,46658=>1000,46659=>1000,46660=>1000,46661=>1000,46662=>1000,46663=>1000,46664=>1000,46665=>1000,46666=>1000,46667=>1000,46668=>1000,46669=>1000,46670=>1000,46671=>1000,46672=>1000,46673=>1000,46674=>1000,46675=>1000,46676=>1000,46677=>1000,46678=>1000,46679=>1000,46680=>1000,46681=>1000,46682=>1000,46683=>1000,46684=>1000,46685=>1000,46686=>1000,46687=>1000,46688=>1000,46689=>1000,46690=>1000,46691=>1000,46692=>1000,46693=>1000,46694=>1000,46695=>1000,46696=>1000,46697=>1000,46698=>1000,46699=>1000,46700=>1000,46701=>1000,46702=>1000,46703=>1000,46704=>1000,46705=>1000,46706=>1000,46707=>1000,46708=>1000,46709=>1000,46710=>1000,46711=>1000,46712=>1000,46713=>1000,46714=>1000,46715=>1000,46716=>1000,46717=>1000,46718=>1000,46719=>1000,46720=>1000,46721=>1000,46722=>1000,46723=>1000,46724=>1000,46725=>1000,46726=>1000,46727=>1000,46728=>1000,46729=>1000,46730=>1000,46731=>1000,46732=>1000,46733=>1000,46734=>1000,46735=>1000,46736=>1000,46737=>1000,46738=>1000,46739=>1000,46740=>1000,46741=>1000,46742=>1000,46743=>1000,46744=>1000,46745=>1000,46746=>1000,46747=>1000,46748=>1000,46749=>1000,46750=>1000,46751=>1000,46752=>1000,46753=>1000,46754=>1000,46755=>1000,46756=>1000,46757=>1000,46758=>1000,46759=>1000,46760=>1000,46761=>1000,46762=>1000,46763=>1000,46764=>1000,46765=>1000,46766=>1000,46767=>1000,46768=>1000,46769=>1000,46770=>1000,46771=>1000,46772=>1000,46773=>1000,46774=>1000,46775=>1000,46776=>1000,46777=>1000,46778=>1000,46779=>1000,46780=>1000,46781=>1000,46782=>1000,46783=>1000,46784=>1000,46785=>1000,46786=>1000,46787=>1000,46788=>1000,46789=>1000,46790=>1000,46791=>1000,46792=>1000,46793=>1000,46794=>1000,46795=>1000,46796=>1000,46797=>1000,46798=>1000,46799=>1000,46800=>1000,46801=>1000,46802=>1000,46803=>1000,46804=>1000,46805=>1000,46806=>1000,46807=>1000,46808=>1000,46809=>1000,46810=>1000,46811=>1000,46812=>1000,46813=>1000,46814=>1000,46815=>1000,46816=>1000,46817=>1000,46818=>1000,46819=>1000,46820=>1000,46821=>1000,46822=>1000,46823=>1000,46824=>1000,46825=>1000,46826=>1000,46827=>1000,46828=>1000,46829=>1000,46830=>1000,46831=>1000,46832=>1000,46833=>1000,46834=>1000,46835=>1000,46836=>1000,46837=>1000,46838=>1000,46839=>1000,46840=>1000,46841=>1000,46842=>1000,46843=>1000,46844=>1000,46845=>1000,46846=>1000,46847=>1000,46848=>1000,46849=>1000,46850=>1000,46851=>1000,46852=>1000,46853=>1000,46854=>1000,46855=>1000,46856=>1000,46857=>1000,46858=>1000,46859=>1000,46860=>1000,46861=>1000,46862=>1000,46863=>1000,46864=>1000,46865=>1000,46866=>1000,46867=>1000,46868=>1000,46869=>1000,46870=>1000,46871=>1000,46872=>1000,46873=>1000,46874=>1000,46875=>1000,46876=>1000,46877=>1000,46878=>1000,46879=>1000,46880=>1000,46881=>1000,46882=>1000,46883=>1000,46884=>1000,46885=>1000,46886=>1000,46887=>1000,46888=>1000,46889=>1000,46890=>1000,46891=>1000,46892=>1000,46893=>1000,46894=>1000,46895=>1000,46896=>1000,46897=>1000,46898=>1000,46899=>1000,46900=>1000,46901=>1000,46902=>1000,46903=>1000,46904=>1000,46905=>1000,46906=>1000,46907=>1000,46908=>1000,46909=>1000,46910=>1000,46911=>1000,46912=>1000,46913=>1000,46914=>1000,46915=>1000,46916=>1000,46917=>1000,46918=>1000,46919=>1000,46920=>1000,46921=>1000,46922=>1000,46923=>1000,46924=>1000,46925=>1000,46926=>1000,46927=>1000,46928=>1000,46929=>1000,46930=>1000,46931=>1000,46932=>1000,46933=>1000,46934=>1000,46935=>1000,46936=>1000,46937=>1000,46938=>1000,46939=>1000,46940=>1000,46941=>1000,46942=>1000,46943=>1000,46944=>1000,46945=>1000,46946=>1000,46947=>1000,46948=>1000,46949=>1000,46950=>1000,46951=>1000,46952=>1000,46953=>1000,46954=>1000,46955=>1000,46956=>1000,46957=>1000,46958=>1000,46959=>1000,46960=>1000,46961=>1000,46962=>1000,46963=>1000,46964=>1000,46965=>1000,46966=>1000,46967=>1000,46968=>1000,46969=>1000,46970=>1000,46971=>1000,46972=>1000,46973=>1000,46974=>1000,46975=>1000,46976=>1000,46977=>1000,46978=>1000,46979=>1000,46980=>1000,46981=>1000,46982=>1000,46983=>1000,46984=>1000,46985=>1000,46986=>1000,46987=>1000,46988=>1000,46989=>1000,46990=>1000,46991=>1000,46992=>1000,46993=>1000,46994=>1000,46995=>1000,46996=>1000,46997=>1000,46998=>1000,46999=>1000,47000=>1000,47001=>1000,47002=>1000,47003=>1000,47004=>1000,47005=>1000,47006=>1000,47007=>1000,47008=>1000,47009=>1000,47010=>1000,47011=>1000,47012=>1000,47013=>1000,47014=>1000,47015=>1000,47016=>1000,47017=>1000,47018=>1000,47019=>1000,47020=>1000,47021=>1000,47022=>1000,47023=>1000,47024=>1000,47025=>1000,47026=>1000,47027=>1000,47028=>1000,47029=>1000,47030=>1000,47031=>1000,47032=>1000,47033=>1000,47034=>1000,47035=>1000,47036=>1000,47037=>1000,47038=>1000,47039=>1000,47040=>1000,47041=>1000,47042=>1000,47043=>1000,47044=>1000,47045=>1000,47046=>1000,47047=>1000,47048=>1000,47049=>1000,47050=>1000,47051=>1000,47052=>1000,47053=>1000,47054=>1000,47055=>1000,47056=>1000,47057=>1000,47058=>1000,47059=>1000,47060=>1000,47061=>1000,47062=>1000,47063=>1000,47064=>1000,47065=>1000,47066=>1000,47067=>1000,47068=>1000,47069=>1000,47070=>1000,47071=>1000,47072=>1000,47073=>1000,47074=>1000,47075=>1000,47076=>1000,47077=>1000,47078=>1000,47079=>1000,47080=>1000,47081=>1000,47082=>1000,47083=>1000,47084=>1000,47085=>1000,47086=>1000,47087=>1000,47088=>1000,47089=>1000,47090=>1000,47091=>1000,47092=>1000,47093=>1000,47094=>1000,47095=>1000,47096=>1000,47097=>1000,47098=>1000,47099=>1000,47100=>1000,47101=>1000,47102=>1000,47103=>1000,47104=>1000,47105=>1000,47106=>1000,47107=>1000,47108=>1000,47109=>1000,47110=>1000,47111=>1000,47112=>1000,47113=>1000,47114=>1000,47115=>1000,47116=>1000,47117=>1000,47118=>1000,47119=>1000,47120=>1000,47121=>1000,47122=>1000,47123=>1000,47124=>1000,47125=>1000,47126=>1000,47127=>1000,47128=>1000,47129=>1000,47130=>1000,47131=>1000,47132=>1000,47133=>1000,47134=>1000,47135=>1000,47136=>1000,47137=>1000,47138=>1000,47139=>1000,47140=>1000,47141=>1000,47142=>1000,47143=>1000,47144=>1000,47145=>1000,47146=>1000,47147=>1000,47148=>1000,47149=>1000,47150=>1000,47151=>1000,47152=>1000,47153=>1000,47154=>1000,47155=>1000,47156=>1000,47157=>1000,47158=>1000,47159=>1000,47160=>1000,47161=>1000,47162=>1000,47163=>1000,47164=>1000,47165=>1000,47166=>1000,47167=>1000,47168=>1000,47169=>1000,47170=>1000,47171=>1000,47172=>1000,47173=>1000,47174=>1000,47175=>1000,47176=>1000,47177=>1000,47178=>1000,47179=>1000,47180=>1000,47181=>1000,47182=>1000,47183=>1000,47184=>1000,47185=>1000,47186=>1000,47187=>1000,47188=>1000,47189=>1000,47190=>1000,47191=>1000,47192=>1000,47193=>1000,47194=>1000,47195=>1000,47196=>1000,47197=>1000,47198=>1000,47199=>1000,47200=>1000,47201=>1000,47202=>1000,47203=>1000,47204=>1000,47205=>1000,47206=>1000,47207=>1000,47208=>1000,47209=>1000,47210=>1000,47211=>1000,47212=>1000,47213=>1000,47214=>1000,47215=>1000,47216=>1000,47217=>1000,47218=>1000,47219=>1000,47220=>1000,47221=>1000,47222=>1000,47223=>1000,47224=>1000,47225=>1000,47226=>1000,47227=>1000,47228=>1000,47229=>1000,47230=>1000,47231=>1000,47232=>1000,47233=>1000,47234=>1000,47235=>1000,47236=>1000,47237=>1000,47238=>1000,47239=>1000,47240=>1000,47241=>1000,47242=>1000,47243=>1000,47244=>1000,47245=>1000,47246=>1000,47247=>1000,47248=>1000,47249=>1000,47250=>1000,47251=>1000,47252=>1000,47253=>1000,47254=>1000,47255=>1000,47256=>1000,47257=>1000,47258=>1000,47259=>1000,47260=>1000,47261=>1000,47262=>1000,47263=>1000,47264=>1000,47265=>1000,47266=>1000,47267=>1000,47268=>1000,47269=>1000,47270=>1000,47271=>1000,47272=>1000,47273=>1000,47274=>1000,47275=>1000,47276=>1000,47277=>1000,47278=>1000,47279=>1000,47280=>1000,47281=>1000,47282=>1000,47283=>1000,47284=>1000,47285=>1000,47286=>1000,47287=>1000,47288=>1000,47289=>1000,47290=>1000,47291=>1000,47292=>1000,47293=>1000,47294=>1000,47295=>1000,47296=>1000,47297=>1000,47298=>1000,47299=>1000,47300=>1000,47301=>1000,47302=>1000,47303=>1000,47304=>1000,47305=>1000,47306=>1000,47307=>1000,47308=>1000,47309=>1000,47310=>1000,47311=>1000,47312=>1000,47313=>1000,47314=>1000,47315=>1000,47316=>1000,47317=>1000,47318=>1000,47319=>1000,47320=>1000,47321=>1000,47322=>1000,47323=>1000,47324=>1000,47325=>1000,47326=>1000,47327=>1000,47328=>1000,47329=>1000,47330=>1000,47331=>1000,47332=>1000,47333=>1000,47334=>1000,47335=>1000,47336=>1000,47337=>1000,47338=>1000,47339=>1000,47340=>1000,47341=>1000,47342=>1000,47343=>1000,47344=>1000,47345=>1000,47346=>1000,47347=>1000,47348=>1000,47349=>1000,47350=>1000,47351=>1000,47352=>1000,47353=>1000,47354=>1000,47355=>1000,47356=>1000,47357=>1000,47358=>1000,47359=>1000,47360=>1000,47361=>1000,47362=>1000,47363=>1000,47364=>1000,47365=>1000,47366=>1000,47367=>1000,47368=>1000,47369=>1000,47370=>1000,47371=>1000,47372=>1000,47373=>1000,47374=>1000,47375=>1000,47376=>1000,47377=>1000,47378=>1000,47379=>1000,47380=>1000,47381=>1000,47382=>1000,47383=>1000,47384=>1000,47385=>1000,47386=>1000,47387=>1000,47388=>1000,47389=>1000,47390=>1000,47391=>1000,47392=>1000,47393=>1000,47394=>1000,47395=>1000,47396=>1000,47397=>1000,47398=>1000,47399=>1000,47400=>1000,47401=>1000,47402=>1000,47403=>1000,47404=>1000,47405=>1000,47406=>1000,47407=>1000,47408=>1000,47409=>1000,47410=>1000,47411=>1000,47412=>1000,47413=>1000,47414=>1000,47415=>1000,47416=>1000,47417=>1000,47418=>1000,47419=>1000,47420=>1000,47421=>1000,47422=>1000,47423=>1000,47424=>1000,47425=>1000,47426=>1000,47427=>1000,47428=>1000,47429=>1000,47430=>1000,47431=>1000,47432=>1000,47433=>1000,47434=>1000,47435=>1000,47436=>1000,47437=>1000,47438=>1000,47439=>1000,47440=>1000,47441=>1000,47442=>1000,47443=>1000,47444=>1000,47445=>1000,47446=>1000,47447=>1000,47448=>1000,47449=>1000,47450=>1000,47451=>1000,47452=>1000,47453=>1000,47454=>1000,47455=>1000,47456=>1000,47457=>1000,47458=>1000,47459=>1000,47460=>1000,47461=>1000,47462=>1000,47463=>1000,47464=>1000,47465=>1000,47466=>1000,47467=>1000,47468=>1000,47469=>1000,47470=>1000,47471=>1000,47472=>1000,47473=>1000,47474=>1000,47475=>1000,47476=>1000,47477=>1000,47478=>1000,47479=>1000,47480=>1000,47481=>1000,47482=>1000,47483=>1000,47484=>1000,47485=>1000,47486=>1000,47487=>1000,47488=>1000,47489=>1000,47490=>1000,47491=>1000,47492=>1000,47493=>1000,47494=>1000,47495=>1000,47496=>1000,47497=>1000,47498=>1000,47499=>1000,47500=>1000,47501=>1000,47502=>1000,47503=>1000,47504=>1000,47505=>1000,47506=>1000,47507=>1000,47508=>1000,47509=>1000,47510=>1000,47511=>1000,47512=>1000,47513=>1000,47514=>1000,47515=>1000,47516=>1000,47517=>1000,47518=>1000,47519=>1000,47520=>1000,47521=>1000,47522=>1000,47523=>1000,47524=>1000,47525=>1000,47526=>1000,47527=>1000,47528=>1000,47529=>1000,47530=>1000,47531=>1000,47532=>1000,47533=>1000,47534=>1000,47535=>1000,47536=>1000,47537=>1000,47538=>1000,47539=>1000,47540=>1000,47541=>1000,47542=>1000,47543=>1000,47544=>1000,47545=>1000,47546=>1000,47547=>1000,47548=>1000,47549=>1000,47550=>1000,47551=>1000,47552=>1000,47553=>1000,47554=>1000,47555=>1000,47556=>1000,47557=>1000,47558=>1000,47559=>1000,47560=>1000,47561=>1000,47562=>1000,47563=>1000,47564=>1000,47565=>1000,47566=>1000,47567=>1000,47568=>1000,47569=>1000,47570=>1000,47571=>1000,47572=>1000,47573=>1000,47574=>1000,47575=>1000,47576=>1000,47577=>1000,47578=>1000,47579=>1000,47580=>1000,47581=>1000,47582=>1000,47583=>1000,47584=>1000,47585=>1000,47586=>1000,47587=>1000,47588=>1000,47589=>1000,47590=>1000,47591=>1000,47592=>1000,47593=>1000,47594=>1000,47595=>1000,47596=>1000,47597=>1000,47598=>1000,47599=>1000,47600=>1000,47601=>1000,47602=>1000,47603=>1000,47604=>1000,47605=>1000,47606=>1000,47607=>1000,47608=>1000,47609=>1000,47610=>1000,47611=>1000,47612=>1000,47613=>1000,47614=>1000,47615=>1000,47616=>1000,47617=>1000,47618=>1000,47619=>1000,47620=>1000,47621=>1000,47622=>1000,47623=>1000,47624=>1000,47625=>1000,47626=>1000,47627=>1000,47628=>1000,47629=>1000,47630=>1000,47631=>1000,47632=>1000,47633=>1000,47634=>1000,47635=>1000,47636=>1000,47637=>1000,47638=>1000,47639=>1000,47640=>1000,47641=>1000,47642=>1000,47643=>1000,47644=>1000,47645=>1000,47646=>1000,47647=>1000,47648=>1000,47649=>1000,47650=>1000,47651=>1000,47652=>1000,47653=>1000,47654=>1000,47655=>1000,47656=>1000,47657=>1000,47658=>1000,47659=>1000,47660=>1000,47661=>1000,47662=>1000,47663=>1000,47664=>1000,47665=>1000,47666=>1000,47667=>1000,47668=>1000,47669=>1000,47670=>1000,47671=>1000,47672=>1000,47673=>1000,47674=>1000,47675=>1000,47676=>1000,47677=>1000,47678=>1000,47679=>1000,47680=>1000,47681=>1000,47682=>1000,47683=>1000,47684=>1000,47685=>1000,47686=>1000,47687=>1000,47688=>1000,47689=>1000,47690=>1000,47691=>1000,47692=>1000,47693=>1000,47694=>1000,47695=>1000,47696=>1000,47697=>1000,47698=>1000,47699=>1000,47700=>1000,47701=>1000,47702=>1000,47703=>1000,47704=>1000,47705=>1000,47706=>1000,47707=>1000,47708=>1000,47709=>1000,47710=>1000,47711=>1000,47712=>1000,47713=>1000,47714=>1000,47715=>1000,47716=>1000,47717=>1000,47718=>1000,47719=>1000,47720=>1000,47721=>1000,47722=>1000,47723=>1000,47724=>1000,47725=>1000,47726=>1000,47727=>1000,47728=>1000,47729=>1000,47730=>1000,47731=>1000,47732=>1000,47733=>1000,47734=>1000,47735=>1000,47736=>1000,47737=>1000,47738=>1000,47739=>1000,47740=>1000,47741=>1000,47742=>1000,47743=>1000,47744=>1000,47745=>1000,47746=>1000,47747=>1000,47748=>1000,47749=>1000,47750=>1000,47751=>1000,47752=>1000,47753=>1000,47754=>1000,47755=>1000,47756=>1000,47757=>1000,47758=>1000,47759=>1000,47760=>1000,47761=>1000,47762=>1000,47763=>1000,47764=>1000,47765=>1000,47766=>1000,47767=>1000,47768=>1000,47769=>1000,47770=>1000,47771=>1000,47772=>1000,47773=>1000,47774=>1000,47775=>1000,47776=>1000,47777=>1000,47778=>1000,47779=>1000,47780=>1000,47781=>1000,47782=>1000,47783=>1000,47784=>1000,47785=>1000,47786=>1000,47787=>1000,47788=>1000,47789=>1000,47790=>1000,47791=>1000,47792=>1000,47793=>1000,47794=>1000,47795=>1000,47796=>1000,47797=>1000,47798=>1000,47799=>1000,47800=>1000,47801=>1000,47802=>1000,47803=>1000,47804=>1000,47805=>1000,47806=>1000,47807=>1000,47808=>1000,47809=>1000,47810=>1000,47811=>1000,47812=>1000,47813=>1000,47814=>1000,47815=>1000,47816=>1000,47817=>1000,47818=>1000,47819=>1000,47820=>1000,47821=>1000,47822=>1000,47823=>1000,47824=>1000,47825=>1000,47826=>1000,47827=>1000,47828=>1000,47829=>1000,47830=>1000,47831=>1000,47832=>1000,47833=>1000,47834=>1000,47835=>1000,47836=>1000,47837=>1000,47838=>1000,47839=>1000,47840=>1000,47841=>1000,47842=>1000,47843=>1000,47844=>1000,47845=>1000,47846=>1000,47847=>1000,47848=>1000,47849=>1000,47850=>1000,47851=>1000,47852=>1000,47853=>1000,47854=>1000,47855=>1000,47856=>1000,47857=>1000,47858=>1000,47859=>1000,47860=>1000,47861=>1000,47862=>1000,47863=>1000,47864=>1000,47865=>1000,47866=>1000,47867=>1000,47868=>1000,47869=>1000,47870=>1000,47871=>1000,47872=>1000,47873=>1000,47874=>1000,47875=>1000,47876=>1000,47877=>1000,47878=>1000,47879=>1000,47880=>1000,47881=>1000,47882=>1000,47883=>1000,47884=>1000,47885=>1000,47886=>1000,47887=>1000,47888=>1000,47889=>1000,47890=>1000,47891=>1000,47892=>1000,47893=>1000,47894=>1000,47895=>1000,47896=>1000,47897=>1000,47898=>1000,47899=>1000,47900=>1000,47901=>1000,47902=>1000,47903=>1000,47904=>1000,47905=>1000,47906=>1000,47907=>1000,47908=>1000,47909=>1000,47910=>1000,47911=>1000,47912=>1000,47913=>1000,47914=>1000,47915=>1000,47916=>1000,47917=>1000,47918=>1000,47919=>1000,47920=>1000,47921=>1000,47922=>1000,47923=>1000,47924=>1000,47925=>1000,47926=>1000,47927=>1000,47928=>1000,47929=>1000,47930=>1000,47931=>1000,47932=>1000,47933=>1000,47934=>1000,47935=>1000,47936=>1000,47937=>1000,47938=>1000,47939=>1000,47940=>1000,47941=>1000,47942=>1000,47943=>1000,47944=>1000,47945=>1000,47946=>1000,47947=>1000,47948=>1000,47949=>1000,47950=>1000,47951=>1000,47952=>1000,47953=>1000,47954=>1000,47955=>1000,47956=>1000,47957=>1000,47958=>1000,47959=>1000,47960=>1000,47961=>1000,47962=>1000,47963=>1000,47964=>1000,47965=>1000,47966=>1000,47967=>1000,47968=>1000,47969=>1000,47970=>1000,47971=>1000,47972=>1000,47973=>1000,47974=>1000,47975=>1000,47976=>1000,47977=>1000,47978=>1000,47979=>1000,47980=>1000,47981=>1000,47982=>1000,47983=>1000,47984=>1000,47985=>1000,47986=>1000,47987=>1000,47988=>1000,47989=>1000,47990=>1000,47991=>1000,47992=>1000,47993=>1000,47994=>1000,47995=>1000,47996=>1000,47997=>1000,47998=>1000,47999=>1000,48000=>1000,48001=>1000,48002=>1000,48003=>1000,48004=>1000,48005=>1000,48006=>1000,48007=>1000,48008=>1000,48009=>1000,48010=>1000,48011=>1000,48012=>1000,48013=>1000,48014=>1000,48015=>1000,48016=>1000,48017=>1000,48018=>1000,48019=>1000,48020=>1000,48021=>1000,48022=>1000,48023=>1000,48024=>1000,48025=>1000,48026=>1000,48027=>1000,48028=>1000,48029=>1000,48030=>1000,48031=>1000,48032=>1000,48033=>1000,48034=>1000,48035=>1000,48036=>1000,48037=>1000,48038=>1000,48039=>1000,48040=>1000,48041=>1000,48042=>1000,48043=>1000,48044=>1000,48045=>1000,48046=>1000,48047=>1000,48048=>1000,48049=>1000,48050=>1000,48051=>1000,48052=>1000,48053=>1000,48054=>1000,48055=>1000,48056=>1000,48057=>1000,48058=>1000,48059=>1000,48060=>1000,48061=>1000,48062=>1000,48063=>1000,48064=>1000,48065=>1000,48066=>1000,48067=>1000,48068=>1000,48069=>1000,48070=>1000,48071=>1000,48072=>1000,48073=>1000,48074=>1000,48075=>1000,48076=>1000,48077=>1000,48078=>1000,48079=>1000,48080=>1000,48081=>1000,48082=>1000,48083=>1000,48084=>1000,48085=>1000,48086=>1000,48087=>1000,48088=>1000,48089=>1000,48090=>1000,48091=>1000,48092=>1000,48093=>1000,48094=>1000,48095=>1000,48096=>1000,48097=>1000,48098=>1000,48099=>1000,48100=>1000,48101=>1000,48102=>1000,48103=>1000,48104=>1000,48105=>1000,48106=>1000,48107=>1000,48108=>1000,48109=>1000,48110=>1000,48111=>1000,48112=>1000,48113=>1000,48114=>1000,48115=>1000,48116=>1000,48117=>1000,48118=>1000,48119=>1000,48120=>1000,48121=>1000,48122=>1000,48123=>1000,48124=>1000,48125=>1000,48126=>1000,48127=>1000,48128=>1000,48129=>1000,48130=>1000,48131=>1000,48132=>1000,48133=>1000,48134=>1000,48135=>1000,48136=>1000,48137=>1000,48138=>1000,48139=>1000,48140=>1000,48141=>1000,48142=>1000,48143=>1000,48144=>1000,48145=>1000,48146=>1000,48147=>1000,48148=>1000,48149=>1000,48150=>1000,48151=>1000,48152=>1000,48153=>1000,48154=>1000,48155=>1000,48156=>1000,48157=>1000,48158=>1000,48159=>1000,48160=>1000,48161=>1000,48162=>1000,48163=>1000,48164=>1000,48165=>1000,48166=>1000,48167=>1000,48168=>1000,48169=>1000,48170=>1000,48171=>1000,48172=>1000,48173=>1000,48174=>1000,48175=>1000,48176=>1000,48177=>1000,48178=>1000,48179=>1000,48180=>1000,48181=>1000,48182=>1000,48183=>1000,48184=>1000,48185=>1000,48186=>1000,48187=>1000,48188=>1000,48189=>1000,48190=>1000,48191=>1000,48192=>1000,48193=>1000,48194=>1000,48195=>1000,48196=>1000,48197=>1000,48198=>1000,48199=>1000,48200=>1000,48201=>1000,48202=>1000,48203=>1000,48204=>1000,48205=>1000,48206=>1000,48207=>1000,48208=>1000,48209=>1000,48210=>1000,48211=>1000,48212=>1000,48213=>1000,48214=>1000,48215=>1000,48216=>1000,48217=>1000,48218=>1000,48219=>1000,48220=>1000,48221=>1000,48222=>1000,48223=>1000,48224=>1000,48225=>1000,48226=>1000,48227=>1000,48228=>1000,48229=>1000,48230=>1000,48231=>1000,48232=>1000,48233=>1000,48234=>1000,48235=>1000,48236=>1000,48237=>1000,48238=>1000,48239=>1000,48240=>1000,48241=>1000,48242=>1000,48243=>1000,48244=>1000,48245=>1000,48246=>1000,48247=>1000,48248=>1000,48249=>1000,48250=>1000,48251=>1000,48252=>1000,48253=>1000,48254=>1000,48255=>1000,48256=>1000,48257=>1000,48258=>1000,48259=>1000,48260=>1000,48261=>1000,48262=>1000,48263=>1000,48264=>1000,48265=>1000,48266=>1000,48267=>1000,48268=>1000,48269=>1000,48270=>1000,48271=>1000,48272=>1000,48273=>1000,48274=>1000,48275=>1000,48276=>1000,48277=>1000,48278=>1000,48279=>1000,48280=>1000,48281=>1000,48282=>1000,48283=>1000,48284=>1000,48285=>1000,48286=>1000,48287=>1000,48288=>1000,48289=>1000,48290=>1000,48291=>1000,48292=>1000,48293=>1000,48294=>1000,48295=>1000,48296=>1000,48297=>1000,48298=>1000,48299=>1000,48300=>1000,48301=>1000,48302=>1000,48303=>1000,48304=>1000,48305=>1000,48306=>1000,48307=>1000,48308=>1000,48309=>1000,48310=>1000,48311=>1000,48312=>1000,48313=>1000,48314=>1000,48315=>1000,48316=>1000,48317=>1000,48318=>1000,48319=>1000,48320=>1000,48321=>1000,48322=>1000,48323=>1000,48324=>1000,48325=>1000,48326=>1000,48327=>1000,48328=>1000,48329=>1000,48330=>1000,48331=>1000,48332=>1000,48333=>1000,48334=>1000,48335=>1000,48336=>1000,48337=>1000,48338=>1000,48339=>1000,48340=>1000,48341=>1000,48342=>1000,48343=>1000,48344=>1000,48345=>1000,48346=>1000,48347=>1000,48348=>1000,48349=>1000,48350=>1000,48351=>1000,48352=>1000,48353=>1000,48354=>1000,48355=>1000,48356=>1000,48357=>1000,48358=>1000,48359=>1000,48360=>1000,48361=>1000,48362=>1000,48363=>1000,48364=>1000,48365=>1000,48366=>1000,48367=>1000,48368=>1000,48369=>1000,48370=>1000,48371=>1000,48372=>1000,48373=>1000,48374=>1000,48375=>1000,48376=>1000,48377=>1000,48378=>1000,48379=>1000,48380=>1000,48381=>1000,48382=>1000,48383=>1000,48384=>1000,48385=>1000,48386=>1000,48387=>1000,48388=>1000,48389=>1000,48390=>1000,48391=>1000,48392=>1000,48393=>1000,48394=>1000,48395=>1000,48396=>1000,48397=>1000,48398=>1000,48399=>1000,48400=>1000,48401=>1000,48402=>1000,48403=>1000,48404=>1000,48405=>1000,48406=>1000,48407=>1000,48408=>1000,48409=>1000,48410=>1000,48411=>1000,48412=>1000,48413=>1000,48414=>1000,48415=>1000,48416=>1000,48417=>1000,48418=>1000,48419=>1000,48420=>1000,48421=>1000,48422=>1000,48423=>1000,48424=>1000,48425=>1000,48426=>1000,48427=>1000,48428=>1000,48429=>1000,48430=>1000,48431=>1000,48432=>1000,48433=>1000,48434=>1000,48435=>1000,48436=>1000,48437=>1000,48438=>1000,48439=>1000,48440=>1000,48441=>1000,48442=>1000,48443=>1000,48444=>1000,48445=>1000,48446=>1000,48447=>1000,48448=>1000,48449=>1000,48450=>1000,48451=>1000,48452=>1000,48453=>1000,48454=>1000,48455=>1000,48456=>1000,48457=>1000,48458=>1000,48459=>1000,48460=>1000,48461=>1000,48462=>1000,48463=>1000,48464=>1000,48465=>1000,48466=>1000,48467=>1000,48468=>1000,48469=>1000,48470=>1000,48471=>1000,48472=>1000,48473=>1000,48474=>1000,48475=>1000,48476=>1000,48477=>1000,48478=>1000,48479=>1000,48480=>1000,48481=>1000,48482=>1000,48483=>1000,48484=>1000,48485=>1000,48486=>1000,48487=>1000,48488=>1000,48489=>1000,48490=>1000,48491=>1000,48492=>1000,48493=>1000,48494=>1000,48495=>1000,48496=>1000,48497=>1000,48498=>1000,48499=>1000,48500=>1000,48501=>1000,48502=>1000,48503=>1000,48504=>1000,48505=>1000,48506=>1000,48507=>1000,48508=>1000,48509=>1000,48510=>1000,48511=>1000,48512=>1000,48513=>1000,48514=>1000,48515=>1000,48516=>1000,48517=>1000,48518=>1000,48519=>1000,48520=>1000,48521=>1000,48522=>1000,48523=>1000,48524=>1000,48525=>1000,48526=>1000,48527=>1000,48528=>1000,48529=>1000,48530=>1000,48531=>1000,48532=>1000,48533=>1000,48534=>1000,48535=>1000,48536=>1000,48537=>1000,48538=>1000,48539=>1000,48540=>1000,48541=>1000,48542=>1000,48543=>1000,48544=>1000,48545=>1000,48546=>1000,48547=>1000,48548=>1000,48549=>1000,48550=>1000,48551=>1000,48552=>1000,48553=>1000,48554=>1000,48555=>1000,48556=>1000,48557=>1000,48558=>1000,48559=>1000,48560=>1000,48561=>1000,48562=>1000,48563=>1000,48564=>1000,48565=>1000,48566=>1000,48567=>1000,48568=>1000,48569=>1000,48570=>1000,48571=>1000,48572=>1000,48573=>1000,48574=>1000,48575=>1000,48576=>1000,48577=>1000,48578=>1000,48579=>1000,48580=>1000,48581=>1000,48582=>1000,48583=>1000,48584=>1000,48585=>1000,48586=>1000,48587=>1000,48588=>1000,48589=>1000,48590=>1000,48591=>1000,48592=>1000,48593=>1000,48594=>1000,48595=>1000,48596=>1000,48597=>1000,48598=>1000,48599=>1000,48600=>1000,48601=>1000,48602=>1000,48603=>1000,48604=>1000,48605=>1000,48606=>1000,48607=>1000,48608=>1000,48609=>1000,48610=>1000,48611=>1000,48612=>1000,48613=>1000,48614=>1000,48615=>1000,48616=>1000,48617=>1000,48618=>1000,48619=>1000,48620=>1000,48621=>1000,48622=>1000,48623=>1000,48624=>1000,48625=>1000,48626=>1000,48627=>1000,48628=>1000,48629=>1000,48630=>1000,48631=>1000,48632=>1000,48633=>1000,48634=>1000,48635=>1000,48636=>1000,48637=>1000,48638=>1000,48639=>1000,48640=>1000,48641=>1000,48642=>1000,48643=>1000,48644=>1000,48645=>1000,48646=>1000,48647=>1000,48648=>1000,48649=>1000,48650=>1000,48651=>1000,48652=>1000,48653=>1000,48654=>1000,48655=>1000,48656=>1000,48657=>1000,48658=>1000,48659=>1000,48660=>1000,48661=>1000,48662=>1000,48663=>1000,48664=>1000,48665=>1000,48666=>1000,48667=>1000,48668=>1000,48669=>1000,48670=>1000,48671=>1000,48672=>1000,48673=>1000,48674=>1000,48675=>1000,48676=>1000,48677=>1000,48678=>1000,48679=>1000,48680=>1000,48681=>1000,48682=>1000,48683=>1000,48684=>1000,48685=>1000,48686=>1000,48687=>1000,48688=>1000,48689=>1000,48690=>1000,48691=>1000,48692=>1000,48693=>1000,48694=>1000,48695=>1000,48696=>1000,48697=>1000,48698=>1000,48699=>1000,48700=>1000,48701=>1000,48702=>1000,48703=>1000,48704=>1000,48705=>1000,48706=>1000,48707=>1000,48708=>1000,48709=>1000,48710=>1000,48711=>1000,48712=>1000,48713=>1000,48714=>1000,48715=>1000,48716=>1000,48717=>1000,48718=>1000,48719=>1000,48720=>1000,48721=>1000,48722=>1000,48723=>1000,48724=>1000,48725=>1000,48726=>1000,48727=>1000,48728=>1000,48729=>1000,48730=>1000,48731=>1000,48732=>1000,48733=>1000,48734=>1000,48735=>1000,48736=>1000,48737=>1000,48738=>1000,48739=>1000,48740=>1000,48741=>1000,48742=>1000,48743=>1000,48744=>1000,48745=>1000,48746=>1000,48747=>1000,48748=>1000,48749=>1000,48750=>1000,48751=>1000,48752=>1000,48753=>1000,48754=>1000,48755=>1000,48756=>1000,48757=>1000,48758=>1000,48759=>1000,48760=>1000,48761=>1000,48762=>1000,48763=>1000,48764=>1000,48765=>1000,48766=>1000,48767=>1000,48768=>1000,48769=>1000,48770=>1000,48771=>1000,48772=>1000,48773=>1000,48774=>1000,48775=>1000,48776=>1000,48777=>1000,48778=>1000,48779=>1000,48780=>1000,48781=>1000,48782=>1000,48783=>1000,48784=>1000,48785=>1000,48786=>1000,48787=>1000,48788=>1000,48789=>1000,48790=>1000,48791=>1000,48792=>1000,48793=>1000,48794=>1000,48795=>1000,48796=>1000,48797=>1000,48798=>1000,48799=>1000,48800=>1000,48801=>1000,48802=>1000,48803=>1000,48804=>1000,48805=>1000,48806=>1000,48807=>1000,48808=>1000,48809=>1000,48810=>1000,48811=>1000,48812=>1000,48813=>1000,48814=>1000,48815=>1000,48816=>1000,48817=>1000,48818=>1000,48819=>1000,48820=>1000,48821=>1000,48822=>1000,48823=>1000,48824=>1000,48825=>1000,48826=>1000,48827=>1000,48828=>1000,48829=>1000,48830=>1000,48831=>1000,48832=>1000,48833=>1000,48834=>1000,48835=>1000,48836=>1000,48837=>1000,48838=>1000,48839=>1000,48840=>1000,48841=>1000,48842=>1000,48843=>1000,48844=>1000,48845=>1000,48846=>1000,48847=>1000,48848=>1000,48849=>1000,48850=>1000,48851=>1000,48852=>1000,48853=>1000,48854=>1000,48855=>1000,48856=>1000,48857=>1000,48858=>1000,48859=>1000,48860=>1000,48861=>1000,48862=>1000,48863=>1000,48864=>1000,48865=>1000,48866=>1000,48867=>1000,48868=>1000,48869=>1000,48870=>1000,48871=>1000,48872=>1000,48873=>1000,48874=>1000,48875=>1000,48876=>1000,48877=>1000,48878=>1000,48879=>1000,48880=>1000,48881=>1000,48882=>1000,48883=>1000,48884=>1000,48885=>1000,48886=>1000,48887=>1000,48888=>1000,48889=>1000,48890=>1000,48891=>1000,48892=>1000,48893=>1000,48894=>1000,48895=>1000,48896=>1000,48897=>1000,48898=>1000,48899=>1000,48900=>1000,48901=>1000,48902=>1000,48903=>1000,48904=>1000,48905=>1000,48906=>1000,48907=>1000,48908=>1000,48909=>1000,48910=>1000,48911=>1000,48912=>1000,48913=>1000,48914=>1000,48915=>1000,48916=>1000,48917=>1000,48918=>1000,48919=>1000,48920=>1000,48921=>1000,48922=>1000,48923=>1000,48924=>1000,48925=>1000,48926=>1000,48927=>1000,48928=>1000,48929=>1000,48930=>1000,48931=>1000,48932=>1000,48933=>1000,48934=>1000,48935=>1000,48936=>1000,48937=>1000,48938=>1000,48939=>1000,48940=>1000,48941=>1000,48942=>1000,48943=>1000,48944=>1000,48945=>1000,48946=>1000,48947=>1000,48948=>1000,48949=>1000,48950=>1000,48951=>1000,48952=>1000,48953=>1000,48954=>1000,48955=>1000,48956=>1000,48957=>1000,48958=>1000,48959=>1000,48960=>1000,48961=>1000,48962=>1000,48963=>1000,48964=>1000,48965=>1000,48966=>1000,48967=>1000,48968=>1000,48969=>1000,48970=>1000,48971=>1000,48972=>1000,48973=>1000,48974=>1000,48975=>1000,48976=>1000,48977=>1000,48978=>1000,48979=>1000,48980=>1000,48981=>1000,48982=>1000,48983=>1000,48984=>1000,48985=>1000,48986=>1000,48987=>1000,48988=>1000,48989=>1000,48990=>1000,48991=>1000,48992=>1000,48993=>1000,48994=>1000,48995=>1000,48996=>1000,48997=>1000,48998=>1000,48999=>1000,49000=>1000,49001=>1000,49002=>1000,49003=>1000,49004=>1000,49005=>1000,49006=>1000,49007=>1000,49008=>1000,49009=>1000,49010=>1000,49011=>1000,49012=>1000,49013=>1000,49014=>1000,49015=>1000,49016=>1000,49017=>1000,49018=>1000,49019=>1000,49020=>1000,49021=>1000,49022=>1000,49023=>1000,49024=>1000,49025=>1000,49026=>1000,49027=>1000,49028=>1000,49029=>1000,49030=>1000,49031=>1000,49032=>1000,49033=>1000,49034=>1000,49035=>1000,49036=>1000,49037=>1000,49038=>1000,49039=>1000,49040=>1000,49041=>1000,49042=>1000,49043=>1000,49044=>1000,49045=>1000,49046=>1000,49047=>1000,49048=>1000,49049=>1000,49050=>1000,49051=>1000,49052=>1000,49053=>1000,49054=>1000,49055=>1000,49056=>1000,49057=>1000,49058=>1000,49059=>1000,49060=>1000,49061=>1000,49062=>1000,49063=>1000,49064=>1000,49065=>1000,49066=>1000,49067=>1000,49068=>1000,49069=>1000,49070=>1000,49071=>1000,49072=>1000,49073=>1000,49074=>1000,49075=>1000,49076=>1000,49077=>1000,49078=>1000,49079=>1000,49080=>1000,49081=>1000,49082=>1000,49083=>1000,49084=>1000,49085=>1000,49086=>1000,49087=>1000,49088=>1000,49089=>1000,49090=>1000,49091=>1000,49092=>1000,49093=>1000,49094=>1000,49095=>1000,49096=>1000,49097=>1000,49098=>1000,49099=>1000,49100=>1000,49101=>1000,49102=>1000,49103=>1000,49104=>1000,49105=>1000,49106=>1000,49107=>1000,49108=>1000,49109=>1000,49110=>1000,49111=>1000,49112=>1000,49113=>1000,49114=>1000,49115=>1000,49116=>1000,49117=>1000,49118=>1000,49119=>1000,49120=>1000,49121=>1000,49122=>1000,49123=>1000,49124=>1000,49125=>1000,49126=>1000,49127=>1000,49128=>1000,49129=>1000,49130=>1000,49131=>1000,49132=>1000,49133=>1000,49134=>1000,49135=>1000,49136=>1000,49137=>1000,49138=>1000,49139=>1000,49140=>1000,49141=>1000,49142=>1000,49143=>1000,49144=>1000,49145=>1000,49146=>1000,49147=>1000,49148=>1000,49149=>1000,49150=>1000,49151=>1000,49152=>1000,49153=>1000,49154=>1000,49155=>1000,49156=>1000,49157=>1000,49158=>1000,49159=>1000,49160=>1000,49161=>1000,49162=>1000,49163=>1000,49164=>1000,49165=>1000,49166=>1000,49167=>1000,49168=>1000,49169=>1000,49170=>1000,49171=>1000,49172=>1000,49173=>1000,49174=>1000,49175=>1000,49176=>1000,49177=>1000,49178=>1000,49179=>1000,49180=>1000,49181=>1000,49182=>1000,49183=>1000,49184=>1000,49185=>1000,49186=>1000,49187=>1000,49188=>1000,49189=>1000,49190=>1000,49191=>1000,49192=>1000,49193=>1000,49194=>1000,49195=>1000,49196=>1000,49197=>1000,49198=>1000,49199=>1000,49200=>1000,49201=>1000,49202=>1000,49203=>1000,49204=>1000,49205=>1000,49206=>1000,49207=>1000,49208=>1000,49209=>1000,49210=>1000,49211=>1000,49212=>1000,49213=>1000,49214=>1000,49215=>1000,49216=>1000,49217=>1000,49218=>1000,49219=>1000,49220=>1000,49221=>1000,49222=>1000,49223=>1000,49224=>1000,49225=>1000,49226=>1000,49227=>1000,49228=>1000,49229=>1000,49230=>1000,49231=>1000,49232=>1000,49233=>1000,49234=>1000,49235=>1000,49236=>1000,49237=>1000,49238=>1000,49239=>1000,49240=>1000,49241=>1000,49242=>1000,49243=>1000,49244=>1000,49245=>1000,49246=>1000,49247=>1000,49248=>1000,49249=>1000,49250=>1000,49251=>1000,49252=>1000,49253=>1000,49254=>1000,49255=>1000,49256=>1000,49257=>1000,49258=>1000,49259=>1000,49260=>1000,49261=>1000,49262=>1000,49263=>1000,49264=>1000,49265=>1000,49266=>1000,49267=>1000,49268=>1000,49269=>1000,49270=>1000,49271=>1000,49272=>1000,49273=>1000,49274=>1000,49275=>1000,49276=>1000,49277=>1000,49278=>1000,49279=>1000,49280=>1000,49281=>1000,49282=>1000,49283=>1000,49284=>1000,49285=>1000,49286=>1000,49287=>1000,49288=>1000,49289=>1000,49290=>1000,49291=>1000,49292=>1000,49293=>1000,49294=>1000,49295=>1000,49296=>1000,49297=>1000,49298=>1000,49299=>1000,49300=>1000,49301=>1000,49302=>1000,49303=>1000,49304=>1000,49305=>1000,49306=>1000,49307=>1000,49308=>1000,49309=>1000,49310=>1000,49311=>1000,49312=>1000,49313=>1000,49314=>1000,49315=>1000,49316=>1000,49317=>1000,49318=>1000,49319=>1000,49320=>1000,49321=>1000,49322=>1000,49323=>1000,49324=>1000,49325=>1000,49326=>1000,49327=>1000,49328=>1000,49329=>1000,49330=>1000,49331=>1000,49332=>1000,49333=>1000,49334=>1000,49335=>1000,49336=>1000,49337=>1000,49338=>1000,49339=>1000,49340=>1000,49341=>1000,49342=>1000,49343=>1000,49344=>1000,49345=>1000,49346=>1000,49347=>1000,49348=>1000,49349=>1000,49350=>1000,49351=>1000,49352=>1000,49353=>1000,49354=>1000,49355=>1000,49356=>1000,49357=>1000,49358=>1000,49359=>1000,49360=>1000,49361=>1000,49362=>1000,49363=>1000,49364=>1000,49365=>1000,49366=>1000,49367=>1000,49368=>1000,49369=>1000,49370=>1000,49371=>1000,49372=>1000,49373=>1000,49374=>1000,49375=>1000,49376=>1000,49377=>1000,49378=>1000,49379=>1000,49380=>1000,49381=>1000,49382=>1000,49383=>1000,49384=>1000,49385=>1000,49386=>1000,49387=>1000,49388=>1000,49389=>1000,49390=>1000,49391=>1000,49392=>1000,49393=>1000,49394=>1000,49395=>1000,49396=>1000,49397=>1000,49398=>1000,49399=>1000,49400=>1000,49401=>1000,49402=>1000,49403=>1000,49404=>1000,49405=>1000,49406=>1000,49407=>1000,49408=>1000,49409=>1000,49410=>1000,49411=>1000,49412=>1000,49413=>1000,49414=>1000,49415=>1000,49416=>1000,49417=>1000,49418=>1000,49419=>1000,49420=>1000,49421=>1000,49422=>1000,49423=>1000,49424=>1000,49425=>1000,49426=>1000,49427=>1000,49428=>1000,49429=>1000,49430=>1000,49431=>1000,49432=>1000,49433=>1000,49434=>1000,49435=>1000,49436=>1000,49437=>1000,49438=>1000,49439=>1000,49440=>1000,49441=>1000,49442=>1000,49443=>1000,49444=>1000,49445=>1000,49446=>1000,49447=>1000,49448=>1000,49449=>1000,49450=>1000,49451=>1000,49452=>1000,49453=>1000,49454=>1000,49455=>1000,49456=>1000,49457=>1000,49458=>1000,49459=>1000,49460=>1000,49461=>1000,49462=>1000,49463=>1000,49464=>1000,49465=>1000,49466=>1000,49467=>1000,49468=>1000,49469=>1000,49470=>1000,49471=>1000,49472=>1000,49473=>1000,49474=>1000,49475=>1000,49476=>1000,49477=>1000,49478=>1000,49479=>1000,49480=>1000,49481=>1000,49482=>1000,49483=>1000,49484=>1000,49485=>1000,49486=>1000,49487=>1000,49488=>1000,49489=>1000,49490=>1000,49491=>1000,49492=>1000,49493=>1000,49494=>1000,49495=>1000,49496=>1000,49497=>1000,49498=>1000,49499=>1000,49500=>1000,49501=>1000,49502=>1000,49503=>1000,49504=>1000,49505=>1000,49506=>1000,49507=>1000,49508=>1000,49509=>1000,49510=>1000,49511=>1000,49512=>1000,49513=>1000,49514=>1000,49515=>1000,49516=>1000,49517=>1000,49518=>1000,49519=>1000,49520=>1000,49521=>1000,49522=>1000,49523=>1000,49524=>1000,49525=>1000,49526=>1000,49527=>1000,49528=>1000,49529=>1000,49530=>1000,49531=>1000,49532=>1000,49533=>1000,49534=>1000,49535=>1000,49536=>1000,49537=>1000,49538=>1000,49539=>1000,49540=>1000,49541=>1000,49542=>1000,49543=>1000,49544=>1000,49545=>1000,49546=>1000,49547=>1000,49548=>1000,49549=>1000,49550=>1000,49551=>1000,49552=>1000,49553=>1000,49554=>1000,49555=>1000,49556=>1000,49557=>1000,49558=>1000,49559=>1000,49560=>1000,49561=>1000,49562=>1000,49563=>1000,49564=>1000,49565=>1000,49566=>1000,49567=>1000,49568=>1000,49569=>1000,49570=>1000,49571=>1000,49572=>1000,49573=>1000,49574=>1000,49575=>1000,49576=>1000,49577=>1000,49578=>1000,49579=>1000,49580=>1000,49581=>1000,49582=>1000,49583=>1000,49584=>1000,49585=>1000,49586=>1000,49587=>1000,49588=>1000,49589=>1000,49590=>1000,49591=>1000,49592=>1000,49593=>1000,49594=>1000,49595=>1000,49596=>1000,49597=>1000,49598=>1000,49599=>1000,49600=>1000,49601=>1000,49602=>1000,49603=>1000,49604=>1000,49605=>1000,49606=>1000,49607=>1000,49608=>1000,49609=>1000,49610=>1000,49611=>1000,49612=>1000,49613=>1000,49614=>1000,49615=>1000,49616=>1000,49617=>1000,49618=>1000,49619=>1000,49620=>1000,49621=>1000,49622=>1000,49623=>1000,49624=>1000,49625=>1000,49626=>1000,49627=>1000,49628=>1000,49629=>1000,49630=>1000,49631=>1000,49632=>1000,49633=>1000,49634=>1000,49635=>1000,49636=>1000,49637=>1000,49638=>1000,49639=>1000,49640=>1000,49641=>1000,49642=>1000,49643=>1000,49644=>1000,49645=>1000,49646=>1000,49647=>1000,49648=>1000,49649=>1000,49650=>1000,49651=>1000,49652=>1000,49653=>1000,49654=>1000,49655=>1000,49656=>1000,49657=>1000,49658=>1000,49659=>1000,49660=>1000,49661=>1000,49662=>1000,49663=>1000,49664=>1000,49665=>1000,49666=>1000,49667=>1000,49668=>1000,49669=>1000,49670=>1000,49671=>1000,49672=>1000,49673=>1000,49674=>1000,49675=>1000,49676=>1000,49677=>1000,49678=>1000,49679=>1000,49680=>1000,49681=>1000,49682=>1000,49683=>1000,49684=>1000,49685=>1000,49686=>1000,49687=>1000,49688=>1000,49689=>1000,49690=>1000,49691=>1000,49692=>1000,49693=>1000,49694=>1000,49695=>1000,49696=>1000,49697=>1000,49698=>1000,49699=>1000,49700=>1000,49701=>1000,49702=>1000,49703=>1000,49704=>1000,49705=>1000,49706=>1000,49707=>1000,49708=>1000,49709=>1000,49710=>1000,49711=>1000,49712=>1000,49713=>1000,49714=>1000,49715=>1000,49716=>1000,49717=>1000,49718=>1000,49719=>1000,49720=>1000,49721=>1000,49722=>1000,49723=>1000,49724=>1000,49725=>1000,49726=>1000,49727=>1000,49728=>1000,49729=>1000,49730=>1000,49731=>1000,49732=>1000,49733=>1000,49734=>1000,49735=>1000,49736=>1000,49737=>1000,49738=>1000,49739=>1000,49740=>1000,49741=>1000,49742=>1000,49743=>1000,49744=>1000,49745=>1000,49746=>1000,49747=>1000,49748=>1000,49749=>1000,49750=>1000,49751=>1000,49752=>1000,49753=>1000,49754=>1000,49755=>1000,49756=>1000,49757=>1000,49758=>1000,49759=>1000,49760=>1000,49761=>1000,49762=>1000,49763=>1000,49764=>1000,49765=>1000,49766=>1000,49767=>1000,49768=>1000,49769=>1000,49770=>1000,49771=>1000,49772=>1000,49773=>1000,49774=>1000,49775=>1000,49776=>1000,49777=>1000,49778=>1000,49779=>1000,49780=>1000,49781=>1000,49782=>1000,49783=>1000,49784=>1000,49785=>1000,49786=>1000,49787=>1000,49788=>1000,49789=>1000,49790=>1000,49791=>1000,49792=>1000,49793=>1000,49794=>1000,49795=>1000,49796=>1000,49797=>1000,49798=>1000,49799=>1000,49800=>1000,49801=>1000,49802=>1000,49803=>1000,49804=>1000,49805=>1000,49806=>1000,49807=>1000,49808=>1000,49809=>1000,49810=>1000,49811=>1000,49812=>1000,49813=>1000,49814=>1000,49815=>1000,49816=>1000,49817=>1000,49818=>1000,49819=>1000,49820=>1000,49821=>1000,49822=>1000,49823=>1000,49824=>1000,49825=>1000,49826=>1000,49827=>1000,49828=>1000,49829=>1000,49830=>1000,49831=>1000,49832=>1000,49833=>1000,49834=>1000,49835=>1000,49836=>1000,49837=>1000,49838=>1000,49839=>1000,49840=>1000,49841=>1000,49842=>1000,49843=>1000,49844=>1000,49845=>1000,49846=>1000,49847=>1000,49848=>1000,49849=>1000,49850=>1000,49851=>1000,49852=>1000,49853=>1000,49854=>1000,49855=>1000,49856=>1000,49857=>1000,49858=>1000,49859=>1000,49860=>1000,49861=>1000,49862=>1000,49863=>1000,49864=>1000,49865=>1000,49866=>1000,49867=>1000,49868=>1000,49869=>1000,49870=>1000,49871=>1000,49872=>1000,49873=>1000,49874=>1000,49875=>1000,49876=>1000,49877=>1000,49878=>1000,49879=>1000,49880=>1000,49881=>1000,49882=>1000,49883=>1000,49884=>1000,49885=>1000,49886=>1000,49887=>1000,49888=>1000,49889=>1000,49890=>1000,49891=>1000,49892=>1000,49893=>1000,49894=>1000,49895=>1000,49896=>1000,49897=>1000,49898=>1000,49899=>1000,49900=>1000,49901=>1000,49902=>1000,49903=>1000,49904=>1000,49905=>1000,49906=>1000,49907=>1000,49908=>1000,49909=>1000,49910=>1000,49911=>1000,49912=>1000,49913=>1000,49914=>1000,49915=>1000,49916=>1000,49917=>1000,49918=>1000,49919=>1000,49920=>1000,49921=>1000,49922=>1000,49923=>1000,49924=>1000,49925=>1000,49926=>1000,49927=>1000,49928=>1000,49929=>1000,49930=>1000,49931=>1000,49932=>1000,49933=>1000,49934=>1000,49935=>1000,49936=>1000,49937=>1000,49938=>1000,49939=>1000,49940=>1000,49941=>1000,49942=>1000,49943=>1000,49944=>1000,49945=>1000,49946=>1000,49947=>1000,49948=>1000,49949=>1000,49950=>1000,49951=>1000,49952=>1000,49953=>1000,49954=>1000,49955=>1000,49956=>1000,49957=>1000,49958=>1000,49959=>1000,49960=>1000,49961=>1000,49962=>1000,49963=>1000,49964=>1000,49965=>1000,49966=>1000,49967=>1000,49968=>1000,49969=>1000,49970=>1000,49971=>1000,49972=>1000,49973=>1000,49974=>1000,49975=>1000,49976=>1000,49977=>1000,49978=>1000,49979=>1000,49980=>1000,49981=>1000,49982=>1000,49983=>1000,49984=>1000,49985=>1000,49986=>1000,49987=>1000,49988=>1000,49989=>1000,49990=>1000,49991=>1000,49992=>1000,49993=>1000,49994=>1000,49995=>1000,49996=>1000,49997=>1000,49998=>1000,49999=>1000,50000=>1000,50001=>1000,50002=>1000,50003=>1000,50004=>1000,50005=>1000,50006=>1000,50007=>1000,50008=>1000,50009=>1000,50010=>1000,50011=>1000,50012=>1000,50013=>1000,50014=>1000,50015=>1000,50016=>1000,50017=>1000,50018=>1000,50019=>1000,50020=>1000,50021=>1000,50022=>1000,50023=>1000,50024=>1000,50025=>1000,50026=>1000,50027=>1000,50028=>1000,50029=>1000,50030=>1000,50031=>1000,50032=>1000,50033=>1000,50034=>1000,50035=>1000,50036=>1000,50037=>1000,50038=>1000,50039=>1000,50040=>1000,50041=>1000,50042=>1000,50043=>1000,50044=>1000,50045=>1000,50046=>1000,50047=>1000,50048=>1000,50049=>1000,50050=>1000,50051=>1000,50052=>1000,50053=>1000,50054=>1000,50055=>1000,50056=>1000,50057=>1000,50058=>1000,50059=>1000,50060=>1000,50061=>1000,50062=>1000,50063=>1000,50064=>1000,50065=>1000,50066=>1000,50067=>1000,50068=>1000,50069=>1000,50070=>1000,50071=>1000,50072=>1000,50073=>1000,50074=>1000,50075=>1000,50076=>1000,50077=>1000,50078=>1000,50079=>1000,50080=>1000,50081=>1000,50082=>1000,50083=>1000,50084=>1000,50085=>1000,50086=>1000,50087=>1000,50088=>1000,50089=>1000,50090=>1000,50091=>1000,50092=>1000,50093=>1000,50094=>1000,50095=>1000,50096=>1000,50097=>1000,50098=>1000,50099=>1000,50100=>1000,50101=>1000,50102=>1000,50103=>1000,50104=>1000,50105=>1000,50106=>1000,50107=>1000,50108=>1000,50109=>1000,50110=>1000,50111=>1000,50112=>1000,50113=>1000,50114=>1000,50115=>1000,50116=>1000,50117=>1000,50118=>1000,50119=>1000,50120=>1000,50121=>1000,50122=>1000,50123=>1000,50124=>1000,50125=>1000,50126=>1000,50127=>1000,50128=>1000,50129=>1000,50130=>1000,50131=>1000,50132=>1000,50133=>1000,50134=>1000,50135=>1000,50136=>1000,50137=>1000,50138=>1000,50139=>1000,50140=>1000,50141=>1000,50142=>1000,50143=>1000,50144=>1000,50145=>1000,50146=>1000,50147=>1000,50148=>1000,50149=>1000,50150=>1000,50151=>1000,50152=>1000,50153=>1000,50154=>1000,50155=>1000,50156=>1000,50157=>1000,50158=>1000,50159=>1000,50160=>1000,50161=>1000,50162=>1000,50163=>1000,50164=>1000,50165=>1000,50166=>1000,50167=>1000,50168=>1000,50169=>1000,50170=>1000,50171=>1000,50172=>1000,50173=>1000,50174=>1000,50175=>1000,50176=>1000,50177=>1000,50178=>1000,50179=>1000,50180=>1000,50181=>1000,50182=>1000,50183=>1000,50184=>1000,50185=>1000,50186=>1000,50187=>1000,50188=>1000,50189=>1000,50190=>1000,50191=>1000,50192=>1000,50193=>1000,50194=>1000,50195=>1000,50196=>1000,50197=>1000,50198=>1000,50199=>1000,50200=>1000,50201=>1000,50202=>1000,50203=>1000,50204=>1000,50205=>1000,50206=>1000,50207=>1000,50208=>1000,50209=>1000,50210=>1000,50211=>1000,50212=>1000,50213=>1000,50214=>1000,50215=>1000,50216=>1000,50217=>1000,50218=>1000,50219=>1000,50220=>1000,50221=>1000,50222=>1000,50223=>1000,50224=>1000,50225=>1000,50226=>1000,50227=>1000,50228=>1000,50229=>1000,50230=>1000,50231=>1000,50232=>1000,50233=>1000,50234=>1000,50235=>1000,50236=>1000,50237=>1000,50238=>1000,50239=>1000,50240=>1000,50241=>1000,50242=>1000,50243=>1000,50244=>1000,50245=>1000,50246=>1000,50247=>1000,50248=>1000,50249=>1000,50250=>1000,50251=>1000,50252=>1000,50253=>1000,50254=>1000,50255=>1000,50256=>1000,50257=>1000,50258=>1000,50259=>1000,50260=>1000,50261=>1000,50262=>1000,50263=>1000,50264=>1000,50265=>1000,50266=>1000,50267=>1000,50268=>1000,50269=>1000,50270=>1000,50271=>1000,50272=>1000,50273=>1000,50274=>1000,50275=>1000,50276=>1000,50277=>1000,50278=>1000,50279=>1000,50280=>1000,50281=>1000,50282=>1000,50283=>1000,50284=>1000,50285=>1000,50286=>1000,50287=>1000,50288=>1000,50289=>1000,50290=>1000,50291=>1000,50292=>1000,50293=>1000,50294=>1000,50295=>1000,50296=>1000,50297=>1000,50298=>1000,50299=>1000,50300=>1000,50301=>1000,50302=>1000,50303=>1000,50304=>1000,50305=>1000,50306=>1000,50307=>1000,50308=>1000,50309=>1000,50310=>1000,50311=>1000,50312=>1000,50313=>1000,50314=>1000,50315=>1000,50316=>1000,50317=>1000,50318=>1000,50319=>1000,50320=>1000,50321=>1000,50322=>1000,50323=>1000,50324=>1000,50325=>1000,50326=>1000,50327=>1000,50328=>1000,50329=>1000,50330=>1000,50331=>1000,50332=>1000,50333=>1000,50334=>1000,50335=>1000,50336=>1000,50337=>1000,50338=>1000,50339=>1000,50340=>1000,50341=>1000,50342=>1000,50343=>1000,50344=>1000,50345=>1000,50346=>1000,50347=>1000,50348=>1000,50349=>1000,50350=>1000,50351=>1000,50352=>1000,50353=>1000,50354=>1000,50355=>1000,50356=>1000,50357=>1000,50358=>1000,50359=>1000,50360=>1000,50361=>1000,50362=>1000,50363=>1000,50364=>1000,50365=>1000,50366=>1000,50367=>1000,50368=>1000,50369=>1000,50370=>1000,50371=>1000,50372=>1000,50373=>1000,50374=>1000,50375=>1000,50376=>1000,50377=>1000,50378=>1000,50379=>1000,50380=>1000,50381=>1000,50382=>1000,50383=>1000,50384=>1000,50385=>1000,50386=>1000,50387=>1000,50388=>1000,50389=>1000,50390=>1000,50391=>1000,50392=>1000,50393=>1000,50394=>1000,50395=>1000,50396=>1000,50397=>1000,50398=>1000,50399=>1000,50400=>1000,50401=>1000,50402=>1000,50403=>1000,50404=>1000,50405=>1000,50406=>1000,50407=>1000,50408=>1000,50409=>1000,50410=>1000,50411=>1000,50412=>1000,50413=>1000,50414=>1000,50415=>1000,50416=>1000,50417=>1000,50418=>1000,50419=>1000,50420=>1000,50421=>1000,50422=>1000,50423=>1000,50424=>1000,50425=>1000,50426=>1000,50427=>1000,50428=>1000,50429=>1000,50430=>1000,50431=>1000,50432=>1000,50433=>1000,50434=>1000,50435=>1000,50436=>1000,50437=>1000,50438=>1000,50439=>1000,50440=>1000,50441=>1000,50442=>1000,50443=>1000,50444=>1000,50445=>1000,50446=>1000,50447=>1000,50448=>1000,50449=>1000,50450=>1000,50451=>1000,50452=>1000,50453=>1000,50454=>1000,50455=>1000,50456=>1000,50457=>1000,50458=>1000,50459=>1000,50460=>1000,50461=>1000,50462=>1000,50463=>1000,50464=>1000,50465=>1000,50466=>1000,50467=>1000,50468=>1000,50469=>1000,50470=>1000,50471=>1000,50472=>1000,50473=>1000,50474=>1000,50475=>1000,50476=>1000,50477=>1000,50478=>1000,50479=>1000,50480=>1000,50481=>1000,50482=>1000,50483=>1000,50484=>1000,50485=>1000,50486=>1000,50487=>1000,50488=>1000,50489=>1000,50490=>1000,50491=>1000,50492=>1000,50493=>1000,50494=>1000,50495=>1000,50496=>1000,50497=>1000,50498=>1000,50499=>1000,50500=>1000,50501=>1000,50502=>1000,50503=>1000,50504=>1000,50505=>1000,50506=>1000,50507=>1000,50508=>1000,50509=>1000,50510=>1000,50511=>1000,50512=>1000,50513=>1000,50514=>1000,50515=>1000,50516=>1000,50517=>1000,50518=>1000,50519=>1000,50520=>1000,50521=>1000,50522=>1000,50523=>1000,50524=>1000,50525=>1000,50526=>1000,50527=>1000,50528=>1000,50529=>1000,50530=>1000,50531=>1000,50532=>1000,50533=>1000,50534=>1000,50535=>1000,50536=>1000,50537=>1000,50538=>1000,50539=>1000,50540=>1000,50541=>1000,50542=>1000,50543=>1000,50544=>1000,50545=>1000,50546=>1000,50547=>1000,50548=>1000,50549=>1000,50550=>1000,50551=>1000,50552=>1000,50553=>1000,50554=>1000,50555=>1000,50556=>1000,50557=>1000,50558=>1000,50559=>1000,50560=>1000,50561=>1000,50562=>1000,50563=>1000,50564=>1000,50565=>1000,50566=>1000,50567=>1000,50568=>1000,50569=>1000,50570=>1000,50571=>1000,50572=>1000,50573=>1000,50574=>1000,50575=>1000,50576=>1000,50577=>1000,50578=>1000,50579=>1000,50580=>1000,50581=>1000,50582=>1000,50583=>1000,50584=>1000,50585=>1000,50586=>1000,50587=>1000,50588=>1000,50589=>1000,50590=>1000,50591=>1000,50592=>1000,50593=>1000,50594=>1000,50595=>1000,50596=>1000,50597=>1000,50598=>1000,50599=>1000,50600=>1000,50601=>1000,50602=>1000,50603=>1000,50604=>1000,50605=>1000,50606=>1000,50607=>1000,50608=>1000,50609=>1000,50610=>1000,50611=>1000,50612=>1000,50613=>1000,50614=>1000,50615=>1000,50616=>1000,50617=>1000,50618=>1000,50619=>1000,50620=>1000,50621=>1000,50622=>1000,50623=>1000,50624=>1000,50625=>1000,50626=>1000,50627=>1000,50628=>1000,50629=>1000,50630=>1000,50631=>1000,50632=>1000,50633=>1000,50634=>1000,50635=>1000,50636=>1000,50637=>1000,50638=>1000,50639=>1000,50640=>1000,50641=>1000,50642=>1000,50643=>1000,50644=>1000,50645=>1000,50646=>1000,50647=>1000,50648=>1000,50649=>1000,50650=>1000,50651=>1000,50652=>1000,50653=>1000,50654=>1000,50655=>1000,50656=>1000,50657=>1000,50658=>1000,50659=>1000,50660=>1000,50661=>1000,50662=>1000,50663=>1000,50664=>1000,50665=>1000,50666=>1000,50667=>1000,50668=>1000,50669=>1000,50670=>1000,50671=>1000,50672=>1000,50673=>1000,50674=>1000,50675=>1000,50676=>1000,50677=>1000,50678=>1000,50679=>1000,50680=>1000,50681=>1000,50682=>1000,50683=>1000,50684=>1000,50685=>1000,50686=>1000,50687=>1000,50688=>1000,50689=>1000,50690=>1000,50691=>1000,50692=>1000,50693=>1000,50694=>1000,50695=>1000,50696=>1000,50697=>1000,50698=>1000,50699=>1000,50700=>1000,50701=>1000,50702=>1000,50703=>1000,50704=>1000,50705=>1000,50706=>1000,50707=>1000,50708=>1000,50709=>1000,50710=>1000,50711=>1000,50712=>1000,50713=>1000,50714=>1000,50715=>1000,50716=>1000,50717=>1000,50718=>1000,50719=>1000,50720=>1000,50721=>1000,50722=>1000,50723=>1000,50724=>1000,50725=>1000,50726=>1000,50727=>1000,50728=>1000,50729=>1000,50730=>1000,50731=>1000,50732=>1000,50733=>1000,50734=>1000,50735=>1000,50736=>1000,50737=>1000,50738=>1000,50739=>1000,50740=>1000,50741=>1000,50742=>1000,50743=>1000,50744=>1000,50745=>1000,50746=>1000,50747=>1000,50748=>1000,50749=>1000,50750=>1000,50751=>1000,50752=>1000,50753=>1000,50754=>1000,50755=>1000,50756=>1000,50757=>1000,50758=>1000,50759=>1000,50760=>1000,50761=>1000,50762=>1000,50763=>1000,50764=>1000,50765=>1000,50766=>1000,50767=>1000,50768=>1000,50769=>1000,50770=>1000,50771=>1000,50772=>1000,50773=>1000,50774=>1000,50775=>1000,50776=>1000,50777=>1000,50778=>1000,50779=>1000,50780=>1000,50781=>1000,50782=>1000,50783=>1000,50784=>1000,50785=>1000,50786=>1000,50787=>1000,50788=>1000,50789=>1000,50790=>1000,50791=>1000,50792=>1000,50793=>1000,50794=>1000,50795=>1000,50796=>1000,50797=>1000,50798=>1000,50799=>1000,50800=>1000,50801=>1000,50802=>1000,50803=>1000,50804=>1000,50805=>1000,50806=>1000,50807=>1000,50808=>1000,50809=>1000,50810=>1000,50811=>1000,50812=>1000,50813=>1000,50814=>1000,50815=>1000,50816=>1000,50817=>1000,50818=>1000,50819=>1000,50820=>1000,50821=>1000,50822=>1000,50823=>1000,50824=>1000,50825=>1000,50826=>1000,50827=>1000,50828=>1000,50829=>1000,50830=>1000,50831=>1000,50832=>1000,50833=>1000,50834=>1000,50835=>1000,50836=>1000,50837=>1000,50838=>1000,50839=>1000,50840=>1000,50841=>1000,50842=>1000,50843=>1000,50844=>1000,50845=>1000,50846=>1000,50847=>1000,50848=>1000,50849=>1000,50850=>1000,50851=>1000,50852=>1000,50853=>1000,50854=>1000,50855=>1000,50856=>1000,50857=>1000,50858=>1000,50859=>1000,50860=>1000,50861=>1000,50862=>1000,50863=>1000,50864=>1000,50865=>1000,50866=>1000,50867=>1000,50868=>1000,50869=>1000,50870=>1000,50871=>1000,50872=>1000,50873=>1000,50874=>1000,50875=>1000,50876=>1000,50877=>1000,50878=>1000,50879=>1000,50880=>1000,50881=>1000,50882=>1000,50883=>1000,50884=>1000,50885=>1000,50886=>1000,50887=>1000,50888=>1000,50889=>1000,50890=>1000,50891=>1000,50892=>1000,50893=>1000,50894=>1000,50895=>1000,50896=>1000,50897=>1000,50898=>1000,50899=>1000,50900=>1000,50901=>1000,50902=>1000,50903=>1000,50904=>1000,50905=>1000,50906=>1000,50907=>1000,50908=>1000,50909=>1000,50910=>1000,50911=>1000,50912=>1000,50913=>1000,50914=>1000,50915=>1000,50916=>1000,50917=>1000,50918=>1000,50919=>1000,50920=>1000,50921=>1000,50922=>1000,50923=>1000,50924=>1000,50925=>1000,50926=>1000,50927=>1000,50928=>1000,50929=>1000,50930=>1000,50931=>1000,50932=>1000,50933=>1000,50934=>1000,50935=>1000,50936=>1000,50937=>1000,50938=>1000,50939=>1000,50940=>1000,50941=>1000,50942=>1000,50943=>1000,50944=>1000,50945=>1000,50946=>1000,50947=>1000,50948=>1000,50949=>1000,50950=>1000,50951=>1000,50952=>1000,50953=>1000,50954=>1000,50955=>1000,50956=>1000,50957=>1000,50958=>1000,50959=>1000,50960=>1000,50961=>1000,50962=>1000,50963=>1000,50964=>1000,50965=>1000,50966=>1000,50967=>1000,50968=>1000,50969=>1000,50970=>1000,50971=>1000,50972=>1000,50973=>1000,50974=>1000,50975=>1000,50976=>1000,50977=>1000,50978=>1000,50979=>1000,50980=>1000,50981=>1000,50982=>1000,50983=>1000,50984=>1000,50985=>1000,50986=>1000,50987=>1000,50988=>1000,50989=>1000,50990=>1000,50991=>1000,50992=>1000,50993=>1000,50994=>1000,50995=>1000,50996=>1000,50997=>1000,50998=>1000,50999=>1000,51000=>1000,51001=>1000,51002=>1000,51003=>1000,51004=>1000,51005=>1000,51006=>1000,51007=>1000,51008=>1000,51009=>1000,51010=>1000,51011=>1000,51012=>1000,51013=>1000,51014=>1000,51015=>1000,51016=>1000,51017=>1000,51018=>1000,51019=>1000,51020=>1000,51021=>1000,51022=>1000,51023=>1000,51024=>1000,51025=>1000,51026=>1000,51027=>1000,51028=>1000,51029=>1000,51030=>1000,51031=>1000,51032=>1000,51033=>1000,51034=>1000,51035=>1000,51036=>1000,51037=>1000,51038=>1000,51039=>1000,51040=>1000,51041=>1000,51042=>1000,51043=>1000,51044=>1000,51045=>1000,51046=>1000,51047=>1000,51048=>1000,51049=>1000,51050=>1000,51051=>1000,51052=>1000,51053=>1000,51054=>1000,51055=>1000,51056=>1000,51057=>1000,51058=>1000,51059=>1000,51060=>1000,51061=>1000,51062=>1000,51063=>1000,51064=>1000,51065=>1000,51066=>1000,51067=>1000,51068=>1000,51069=>1000,51070=>1000,51071=>1000,51072=>1000,51073=>1000,51074=>1000,51075=>1000,51076=>1000,51077=>1000,51078=>1000,51079=>1000,51080=>1000,51081=>1000,51082=>1000,51083=>1000,51084=>1000,51085=>1000,51086=>1000,51087=>1000,51088=>1000,51089=>1000,51090=>1000,51091=>1000,51092=>1000,51093=>1000,51094=>1000,51095=>1000,51096=>1000,51097=>1000,51098=>1000,51099=>1000,51100=>1000,51101=>1000,51102=>1000,51103=>1000,51104=>1000,51105=>1000,51106=>1000,51107=>1000,51108=>1000,51109=>1000,51110=>1000,51111=>1000,51112=>1000,51113=>1000,51114=>1000,51115=>1000,51116=>1000,51117=>1000,51118=>1000,51119=>1000,51120=>1000,51121=>1000,51122=>1000,51123=>1000,51124=>1000,51125=>1000,51126=>1000,51127=>1000,51128=>1000,51129=>1000,51130=>1000,51131=>1000,51132=>1000,51133=>1000,51134=>1000,51135=>1000,51136=>1000,51137=>1000,51138=>1000,51139=>1000,51140=>1000,51141=>1000,51142=>1000,51143=>1000,51144=>1000,51145=>1000,51146=>1000,51147=>1000,51148=>1000,51149=>1000,51150=>1000,51151=>1000,51152=>1000,51153=>1000,51154=>1000,51155=>1000,51156=>1000,51157=>1000,51158=>1000,51159=>1000,51160=>1000,51161=>1000,51162=>1000,51163=>1000,51164=>1000,51165=>1000,51166=>1000,51167=>1000,51168=>1000,51169=>1000,51170=>1000,51171=>1000,51172=>1000,51173=>1000,51174=>1000,51175=>1000,51176=>1000,51177=>1000,51178=>1000,51179=>1000,51180=>1000,51181=>1000,51182=>1000,51183=>1000,51184=>1000,51185=>1000,51186=>1000,51187=>1000,51188=>1000,51189=>1000,51190=>1000,51191=>1000,51192=>1000,51193=>1000,51194=>1000,51195=>1000,51196=>1000,51197=>1000,51198=>1000,51199=>1000,51200=>1000,51201=>1000,51202=>1000,51203=>1000,51204=>1000,51205=>1000,51206=>1000,51207=>1000,51208=>1000,51209=>1000,51210=>1000,51211=>1000,51212=>1000,51213=>1000,51214=>1000,51215=>1000,51216=>1000,51217=>1000,51218=>1000,51219=>1000,51220=>1000,51221=>1000,51222=>1000,51223=>1000,51224=>1000,51225=>1000,51226=>1000,51227=>1000,51228=>1000,51229=>1000,51230=>1000,51231=>1000,51232=>1000,51233=>1000,51234=>1000,51235=>1000,51236=>1000,51237=>1000,51238=>1000,51239=>1000,51240=>1000,51241=>1000,51242=>1000,51243=>1000,51244=>1000,51245=>1000,51246=>1000,51247=>1000,51248=>1000,51249=>1000,51250=>1000,51251=>1000,51252=>1000,51253=>1000,51254=>1000,51255=>1000,51256=>1000,51257=>1000,51258=>1000,51259=>1000,51260=>1000,51261=>1000,51262=>1000,51263=>1000,51264=>1000,51265=>1000,51266=>1000,51267=>1000,51268=>1000,51269=>1000,51270=>1000,51271=>1000,51272=>1000,51273=>1000,51274=>1000,51275=>1000,51276=>1000,51277=>1000,51278=>1000,51279=>1000,51280=>1000,51281=>1000,51282=>1000,51283=>1000,51284=>1000,51285=>1000,51286=>1000,51287=>1000,51288=>1000,51289=>1000,51290=>1000,51291=>1000,51292=>1000,51293=>1000,51294=>1000,51295=>1000,51296=>1000,51297=>1000,51298=>1000,51299=>1000,51300=>1000,51301=>1000,51302=>1000,51303=>1000,51304=>1000,51305=>1000,51306=>1000,51307=>1000,51308=>1000,51309=>1000,51310=>1000,51311=>1000,51312=>1000,51313=>1000,51314=>1000,51315=>1000,51316=>1000,51317=>1000,51318=>1000,51319=>1000,51320=>1000,51321=>1000,51322=>1000,51323=>1000,51324=>1000,51325=>1000,51326=>1000,51327=>1000,51328=>1000,51329=>1000,51330=>1000,51331=>1000,51332=>1000,51333=>1000,51334=>1000,51335=>1000,51336=>1000,51337=>1000,51338=>1000,51339=>1000,51340=>1000,51341=>1000,51342=>1000,51343=>1000,51344=>1000,51345=>1000,51346=>1000,51347=>1000,51348=>1000,51349=>1000,51350=>1000,51351=>1000,51352=>1000,51353=>1000,51354=>1000,51355=>1000,51356=>1000,51357=>1000,51358=>1000,51359=>1000,51360=>1000,51361=>1000,51362=>1000,51363=>1000,51364=>1000,51365=>1000,51366=>1000,51367=>1000,51368=>1000,51369=>1000,51370=>1000,51371=>1000,51372=>1000,51373=>1000,51374=>1000,51375=>1000,51376=>1000,51377=>1000,51378=>1000,51379=>1000,51380=>1000,51381=>1000,51382=>1000,51383=>1000,51384=>1000,51385=>1000,51386=>1000,51387=>1000,51388=>1000,51389=>1000,51390=>1000,51391=>1000,51392=>1000,51393=>1000,51394=>1000,51395=>1000,51396=>1000,51397=>1000,51398=>1000,51399=>1000,51400=>1000,51401=>1000,51402=>1000,51403=>1000,51404=>1000,51405=>1000,51406=>1000,51407=>1000,51408=>1000,51409=>1000,51410=>1000,51411=>1000,51412=>1000,51413=>1000,51414=>1000,51415=>1000,51416=>1000,51417=>1000,51418=>1000,51419=>1000,51420=>1000,51421=>1000,51422=>1000,51423=>1000,51424=>1000,51425=>1000,51426=>1000,51427=>1000,51428=>1000,51429=>1000,51430=>1000,51431=>1000,51432=>1000,51433=>1000,51434=>1000,51435=>1000,51436=>1000,51437=>1000,51438=>1000,51439=>1000,51440=>1000,51441=>1000,51442=>1000,51443=>1000,51444=>1000,51445=>1000,51446=>1000,51447=>1000,51448=>1000,51449=>1000,51450=>1000,51451=>1000,51452=>1000,51453=>1000,51454=>1000,51455=>1000,51456=>1000,51457=>1000,51458=>1000,51459=>1000,51460=>1000,51461=>1000,51462=>1000,51463=>1000,51464=>1000,51465=>1000,51466=>1000,51467=>1000,51468=>1000,51469=>1000,51470=>1000,51471=>1000,51472=>1000,51473=>1000,51474=>1000,51475=>1000,51476=>1000,51477=>1000,51478=>1000,51479=>1000,51480=>1000,51481=>1000,51482=>1000,51483=>1000,51484=>1000,51485=>1000,51486=>1000,51487=>1000,51488=>1000,51489=>1000,51490=>1000,51491=>1000,51492=>1000,51493=>1000,51494=>1000,51495=>1000,51496=>1000,51497=>1000,51498=>1000,51499=>1000,51500=>1000,51501=>1000,51502=>1000,51503=>1000,51504=>1000,51505=>1000,51506=>1000,51507=>1000,51508=>1000,51509=>1000,51510=>1000,51511=>1000,51512=>1000,51513=>1000,51514=>1000,51515=>1000,51516=>1000,51517=>1000,51518=>1000,51519=>1000,51520=>1000,51521=>1000,51522=>1000,51523=>1000,51524=>1000,51525=>1000,51526=>1000,51527=>1000,51528=>1000,51529=>1000,51530=>1000,51531=>1000,51532=>1000,51533=>1000,51534=>1000,51535=>1000,51536=>1000,51537=>1000,51538=>1000,51539=>1000,51540=>1000,51541=>1000,51542=>1000,51543=>1000,51544=>1000,51545=>1000,51546=>1000,51547=>1000,51548=>1000,51549=>1000,51550=>1000,51551=>1000,51552=>1000,51553=>1000,51554=>1000,51555=>1000,51556=>1000,51557=>1000,51558=>1000,51559=>1000,51560=>1000,51561=>1000,51562=>1000,51563=>1000,51564=>1000,51565=>1000,51566=>1000,51567=>1000,51568=>1000,51569=>1000,51570=>1000,51571=>1000,51572=>1000,51573=>1000,51574=>1000,51575=>1000,51576=>1000,51577=>1000,51578=>1000,51579=>1000,51580=>1000,51581=>1000,51582=>1000,51583=>1000,51584=>1000,51585=>1000,51586=>1000,51587=>1000,51588=>1000,51589=>1000,51590=>1000,51591=>1000,51592=>1000,51593=>1000,51594=>1000,51595=>1000,51596=>1000,51597=>1000,51598=>1000,51599=>1000,51600=>1000,51601=>1000,51602=>1000,51603=>1000,51604=>1000,51605=>1000,51606=>1000,51607=>1000,51608=>1000,51609=>1000,51610=>1000,51611=>1000,51612=>1000,51613=>1000,51614=>1000,51615=>1000,51616=>1000,51617=>1000,51618=>1000,51619=>1000,51620=>1000,51621=>1000,51622=>1000,51623=>1000,51624=>1000,51625=>1000,51626=>1000,51627=>1000,51628=>1000,51629=>1000,51630=>1000,51631=>1000,51632=>1000,51633=>1000,51634=>1000,51635=>1000,51636=>1000,51637=>1000,51638=>1000,51639=>1000,51640=>1000,51641=>1000,51642=>1000,51643=>1000,51644=>1000,51645=>1000,51646=>1000,51647=>1000,51648=>1000,51649=>1000,51650=>1000,51651=>1000,51652=>1000,51653=>1000,51654=>1000,51655=>1000,51656=>1000,51657=>1000,51658=>1000,51659=>1000,51660=>1000,51661=>1000,51662=>1000,51663=>1000,51664=>1000,51665=>1000,51666=>1000,51667=>1000,51668=>1000,51669=>1000,51670=>1000,51671=>1000,51672=>1000,51673=>1000,51674=>1000,51675=>1000,51676=>1000,51677=>1000,51678=>1000,51679=>1000,51680=>1000,51681=>1000,51682=>1000,51683=>1000,51684=>1000,51685=>1000,51686=>1000,51687=>1000,51688=>1000,51689=>1000,51690=>1000,51691=>1000,51692=>1000,51693=>1000,51694=>1000,51695=>1000,51696=>1000,51697=>1000,51698=>1000,51699=>1000,51700=>1000,51701=>1000,51702=>1000,51703=>1000,51704=>1000,51705=>1000,51706=>1000,51707=>1000,51708=>1000,51709=>1000,51710=>1000,51711=>1000,51712=>1000,51713=>1000,51714=>1000,51715=>1000,51716=>1000,51717=>1000,51718=>1000,51719=>1000,51720=>1000,51721=>1000,51722=>1000,51723=>1000,51724=>1000,51725=>1000,51726=>1000,51727=>1000,51728=>1000,51729=>1000,51730=>1000,51731=>1000,51732=>1000,51733=>1000,51734=>1000,51735=>1000,51736=>1000,51737=>1000,51738=>1000,51739=>1000,51740=>1000,51741=>1000,51742=>1000,51743=>1000,51744=>1000,51745=>1000,51746=>1000,51747=>1000,51748=>1000,51749=>1000,51750=>1000,51751=>1000,51752=>1000,51753=>1000,51754=>1000,51755=>1000,51756=>1000,51757=>1000,51758=>1000,51759=>1000,51760=>1000,51761=>1000,51762=>1000,51763=>1000,51764=>1000,51765=>1000,51766=>1000,51767=>1000,51768=>1000,51769=>1000,51770=>1000,51771=>1000,51772=>1000,51773=>1000,51774=>1000,51775=>1000,51776=>1000,51777=>1000,51778=>1000,51779=>1000,51780=>1000,51781=>1000,51782=>1000,51783=>1000,51784=>1000,51785=>1000,51786=>1000,51787=>1000,51788=>1000,51789=>1000,51790=>1000,51791=>1000,51792=>1000,51793=>1000,51794=>1000,51795=>1000,51796=>1000,51797=>1000,51798=>1000,51799=>1000,51800=>1000,51801=>1000,51802=>1000,51803=>1000,51804=>1000,51805=>1000,51806=>1000,51807=>1000,51808=>1000,51809=>1000,51810=>1000,51811=>1000,51812=>1000,51813=>1000,51814=>1000,51815=>1000,51816=>1000,51817=>1000,51818=>1000,51819=>1000,51820=>1000,51821=>1000,51822=>1000,51823=>1000,51824=>1000,51825=>1000,51826=>1000,51827=>1000,51828=>1000,51829=>1000,51830=>1000,51831=>1000,51832=>1000,51833=>1000,51834=>1000,51835=>1000,51836=>1000,51837=>1000,51838=>1000,51839=>1000,51840=>1000,51841=>1000,51842=>1000,51843=>1000,51844=>1000,51845=>1000,51846=>1000,51847=>1000,51848=>1000,51849=>1000,51850=>1000,51851=>1000,51852=>1000,51853=>1000,51854=>1000,51855=>1000,51856=>1000,51857=>1000,51858=>1000,51859=>1000,51860=>1000,51861=>1000,51862=>1000,51863=>1000,51864=>1000,51865=>1000,51866=>1000,51867=>1000,51868=>1000,51869=>1000,51870=>1000,51871=>1000,51872=>1000,51873=>1000,51874=>1000,51875=>1000,51876=>1000,51877=>1000,51878=>1000,51879=>1000,51880=>1000,51881=>1000,51882=>1000,51883=>1000,51884=>1000,51885=>1000,51886=>1000,51887=>1000,51888=>1000,51889=>1000,51890=>1000,51891=>1000,51892=>1000,51893=>1000,51894=>1000,51895=>1000,51896=>1000,51897=>1000,51898=>1000,51899=>1000,51900=>1000,51901=>1000,51902=>1000,51903=>1000,51904=>1000,51905=>1000,51906=>1000,51907=>1000,51908=>1000,51909=>1000,51910=>1000,51911=>1000,51912=>1000,51913=>1000,51914=>1000,51915=>1000,51916=>1000,51917=>1000,51918=>1000,51919=>1000,51920=>1000,51921=>1000,51922=>1000,51923=>1000,51924=>1000,51925=>1000,51926=>1000,51927=>1000,51928=>1000,51929=>1000,51930=>1000,51931=>1000,51932=>1000,51933=>1000,51934=>1000,51935=>1000,51936=>1000,51937=>1000,51938=>1000,51939=>1000,51940=>1000,51941=>1000,51942=>1000,51943=>1000,51944=>1000,51945=>1000,51946=>1000,51947=>1000,51948=>1000,51949=>1000,51950=>1000,51951=>1000,51952=>1000,51953=>1000,51954=>1000,51955=>1000,51956=>1000,51957=>1000,51958=>1000,51959=>1000,51960=>1000,51961=>1000,51962=>1000,51963=>1000,51964=>1000,51965=>1000,51966=>1000,51967=>1000,51968=>1000,51969=>1000,51970=>1000,51971=>1000,51972=>1000,51973=>1000,51974=>1000,51975=>1000,51976=>1000,51977=>1000,51978=>1000,51979=>1000,51980=>1000,51981=>1000,51982=>1000,51983=>1000,51984=>1000,51985=>1000,51986=>1000,51987=>1000,51988=>1000,51989=>1000,51990=>1000,51991=>1000,51992=>1000,51993=>1000,51994=>1000,51995=>1000,51996=>1000,51997=>1000,51998=>1000,51999=>1000,52000=>1000,52001=>1000,52002=>1000,52003=>1000,52004=>1000,52005=>1000,52006=>1000,52007=>1000,52008=>1000,52009=>1000,52010=>1000,52011=>1000,52012=>1000,52013=>1000,52014=>1000,52015=>1000,52016=>1000,52017=>1000,52018=>1000,52019=>1000,52020=>1000,52021=>1000,52022=>1000,52023=>1000,52024=>1000,52025=>1000,52026=>1000,52027=>1000,52028=>1000,52029=>1000,52030=>1000,52031=>1000,52032=>1000,52033=>1000,52034=>1000,52035=>1000,52036=>1000,52037=>1000,52038=>1000,52039=>1000,52040=>1000,52041=>1000,52042=>1000,52043=>1000,52044=>1000,52045=>1000,52046=>1000,52047=>1000,52048=>1000,52049=>1000,52050=>1000,52051=>1000,52052=>1000,52053=>1000,52054=>1000,52055=>1000,52056=>1000,52057=>1000,52058=>1000,52059=>1000,52060=>1000,52061=>1000,52062=>1000,52063=>1000,52064=>1000,52065=>1000,52066=>1000,52067=>1000,52068=>1000,52069=>1000,52070=>1000,52071=>1000,52072=>1000,52073=>1000,52074=>1000,52075=>1000,52076=>1000,52077=>1000,52078=>1000,52079=>1000,52080=>1000,52081=>1000,52082=>1000,52083=>1000,52084=>1000,52085=>1000,52086=>1000,52087=>1000,52088=>1000,52089=>1000,52090=>1000,52091=>1000,52092=>1000,52093=>1000,52094=>1000,52095=>1000,52096=>1000,52097=>1000,52098=>1000,52099=>1000,52100=>1000,52101=>1000,52102=>1000,52103=>1000,52104=>1000,52105=>1000,52106=>1000,52107=>1000,52108=>1000,52109=>1000,52110=>1000,52111=>1000,52112=>1000,52113=>1000,52114=>1000,52115=>1000,52116=>1000,52117=>1000,52118=>1000,52119=>1000,52120=>1000,52121=>1000,52122=>1000,52123=>1000,52124=>1000,52125=>1000,52126=>1000,52127=>1000,52128=>1000,52129=>1000,52130=>1000,52131=>1000,52132=>1000,52133=>1000,52134=>1000,52135=>1000,52136=>1000,52137=>1000,52138=>1000,52139=>1000,52140=>1000,52141=>1000,52142=>1000,52143=>1000,52144=>1000,52145=>1000,52146=>1000,52147=>1000,52148=>1000,52149=>1000,52150=>1000,52151=>1000,52152=>1000,52153=>1000,52154=>1000,52155=>1000,52156=>1000,52157=>1000,52158=>1000,52159=>1000,52160=>1000,52161=>1000,52162=>1000,52163=>1000,52164=>1000,52165=>1000,52166=>1000,52167=>1000,52168=>1000,52169=>1000,52170=>1000,52171=>1000,52172=>1000,52173=>1000,52174=>1000,52175=>1000,52176=>1000,52177=>1000,52178=>1000,52179=>1000,52180=>1000,52181=>1000,52182=>1000,52183=>1000,52184=>1000,52185=>1000,52186=>1000,52187=>1000,52188=>1000,52189=>1000,52190=>1000,52191=>1000,52192=>1000,52193=>1000,52194=>1000,52195=>1000,52196=>1000,52197=>1000,52198=>1000,52199=>1000,52200=>1000,52201=>1000,52202=>1000,52203=>1000,52204=>1000,52205=>1000,52206=>1000,52207=>1000,52208=>1000,52209=>1000,52210=>1000,52211=>1000,52212=>1000,52213=>1000,52214=>1000,52215=>1000,52216=>1000,52217=>1000,52218=>1000,52219=>1000,52220=>1000,52221=>1000,52222=>1000,52223=>1000,52224=>1000,52225=>1000,52226=>1000,52227=>1000,52228=>1000,52229=>1000,52230=>1000,52231=>1000,52232=>1000,52233=>1000,52234=>1000,52235=>1000,52236=>1000,52237=>1000,52238=>1000,52239=>1000,52240=>1000,52241=>1000,52242=>1000,52243=>1000,52244=>1000,52245=>1000,52246=>1000,52247=>1000,52248=>1000,52249=>1000,52250=>1000,52251=>1000,52252=>1000,52253=>1000,52254=>1000,52255=>1000,52256=>1000,52257=>1000,52258=>1000,52259=>1000,52260=>1000,52261=>1000,52262=>1000,52263=>1000,52264=>1000,52265=>1000,52266=>1000,52267=>1000,52268=>1000,52269=>1000,52270=>1000,52271=>1000,52272=>1000,52273=>1000,52274=>1000,52275=>1000,52276=>1000,52277=>1000,52278=>1000,52279=>1000,52280=>1000,52281=>1000,52282=>1000,52283=>1000,52284=>1000,52285=>1000,52286=>1000,52287=>1000,52288=>1000,52289=>1000,52290=>1000,52291=>1000,52292=>1000,52293=>1000,52294=>1000,52295=>1000,52296=>1000,52297=>1000,52298=>1000,52299=>1000,52300=>1000,52301=>1000,52302=>1000,52303=>1000,52304=>1000,52305=>1000,52306=>1000,52307=>1000,52308=>1000,52309=>1000,52310=>1000,52311=>1000,52312=>1000,52313=>1000,52314=>1000,52315=>1000,52316=>1000,52317=>1000,52318=>1000,52319=>1000,52320=>1000,52321=>1000,52322=>1000,52323=>1000,52324=>1000,52325=>1000,52326=>1000,52327=>1000,52328=>1000,52329=>1000,52330=>1000,52331=>1000,52332=>1000,52333=>1000,52334=>1000,52335=>1000,52336=>1000,52337=>1000,52338=>1000,52339=>1000,52340=>1000,52341=>1000,52342=>1000,52343=>1000,52344=>1000,52345=>1000,52346=>1000,52347=>1000,52348=>1000,52349=>1000,52350=>1000,52351=>1000,52352=>1000,52353=>1000,52354=>1000,52355=>1000,52356=>1000,52357=>1000,52358=>1000,52359=>1000,52360=>1000,52361=>1000,52362=>1000,52363=>1000,52364=>1000,52365=>1000,52366=>1000,52367=>1000,52368=>1000,52369=>1000,52370=>1000,52371=>1000,52372=>1000,52373=>1000,52374=>1000,52375=>1000,52376=>1000,52377=>1000,52378=>1000,52379=>1000,52380=>1000,52381=>1000,52382=>1000,52383=>1000,52384=>1000,52385=>1000,52386=>1000,52387=>1000,52388=>1000,52389=>1000,52390=>1000,52391=>1000,52392=>1000,52393=>1000,52394=>1000,52395=>1000,52396=>1000,52397=>1000,52398=>1000,52399=>1000,52400=>1000,52401=>1000,52402=>1000,52403=>1000,52404=>1000,52405=>1000,52406=>1000,52407=>1000,52408=>1000,52409=>1000,52410=>1000,52411=>1000,52412=>1000,52413=>1000,52414=>1000,52415=>1000,52416=>1000,52417=>1000,52418=>1000,52419=>1000,52420=>1000,52421=>1000,52422=>1000,52423=>1000,52424=>1000,52425=>1000,52426=>1000,52427=>1000,52428=>1000,52429=>1000,52430=>1000,52431=>1000,52432=>1000,52433=>1000,52434=>1000,52435=>1000,52436=>1000,52437=>1000,52438=>1000,52439=>1000,52440=>1000,52441=>1000,52442=>1000,52443=>1000,52444=>1000,52445=>1000,52446=>1000,52447=>1000,52448=>1000,52449=>1000,52450=>1000,52451=>1000,52452=>1000,52453=>1000,52454=>1000,52455=>1000,52456=>1000,52457=>1000,52458=>1000,52459=>1000,52460=>1000,52461=>1000,52462=>1000,52463=>1000,52464=>1000,52465=>1000,52466=>1000,52467=>1000,52468=>1000,52469=>1000,52470=>1000,52471=>1000,52472=>1000,52473=>1000,52474=>1000,52475=>1000,52476=>1000,52477=>1000,52478=>1000,52479=>1000,52480=>1000,52481=>1000,52482=>1000,52483=>1000,52484=>1000,52485=>1000,52486=>1000,52487=>1000,52488=>1000,52489=>1000,52490=>1000,52491=>1000,52492=>1000,52493=>1000,52494=>1000,52495=>1000,52496=>1000,52497=>1000,52498=>1000,52499=>1000,52500=>1000,52501=>1000,52502=>1000,52503=>1000,52504=>1000,52505=>1000,52506=>1000,52507=>1000,52508=>1000,52509=>1000,52510=>1000,52511=>1000,52512=>1000,52513=>1000,52514=>1000,52515=>1000,52516=>1000,52517=>1000,52518=>1000,52519=>1000,52520=>1000,52521=>1000,52522=>1000,52523=>1000,52524=>1000,52525=>1000,52526=>1000,52527=>1000,52528=>1000,52529=>1000,52530=>1000,52531=>1000,52532=>1000,52533=>1000,52534=>1000,52535=>1000,52536=>1000,52537=>1000,52538=>1000,52539=>1000,52540=>1000,52541=>1000,52542=>1000,52543=>1000,52544=>1000,52545=>1000,52546=>1000,52547=>1000,52548=>1000,52549=>1000,52550=>1000,52551=>1000,52552=>1000,52553=>1000,52554=>1000,52555=>1000,52556=>1000,52557=>1000,52558=>1000,52559=>1000,52560=>1000,52561=>1000,52562=>1000,52563=>1000,52564=>1000,52565=>1000,52566=>1000,52567=>1000,52568=>1000,52569=>1000,52570=>1000,52571=>1000,52572=>1000,52573=>1000,52574=>1000,52575=>1000,52576=>1000,52577=>1000,52578=>1000,52579=>1000,52580=>1000,52581=>1000,52582=>1000,52583=>1000,52584=>1000,52585=>1000,52586=>1000,52587=>1000,52588=>1000,52589=>1000,52590=>1000,52591=>1000,52592=>1000,52593=>1000,52594=>1000,52595=>1000,52596=>1000,52597=>1000,52598=>1000,52599=>1000,52600=>1000,52601=>1000,52602=>1000,52603=>1000,52604=>1000,52605=>1000,52606=>1000,52607=>1000,52608=>1000,52609=>1000,52610=>1000,52611=>1000,52612=>1000,52613=>1000,52614=>1000,52615=>1000,52616=>1000,52617=>1000,52618=>1000,52619=>1000,52620=>1000,52621=>1000,52622=>1000,52623=>1000,52624=>1000,52625=>1000,52626=>1000,52627=>1000,52628=>1000,52629=>1000,52630=>1000,52631=>1000,52632=>1000,52633=>1000,52634=>1000,52635=>1000,52636=>1000,52637=>1000,52638=>1000,52639=>1000,52640=>1000,52641=>1000,52642=>1000,52643=>1000,52644=>1000,52645=>1000,52646=>1000,52647=>1000,52648=>1000,52649=>1000,52650=>1000,52651=>1000,52652=>1000,52653=>1000,52654=>1000,52655=>1000,52656=>1000,52657=>1000,52658=>1000,52659=>1000,52660=>1000,52661=>1000,52662=>1000,52663=>1000,52664=>1000,52665=>1000,52666=>1000,52667=>1000,52668=>1000,52669=>1000,52670=>1000,52671=>1000,52672=>1000,52673=>1000,52674=>1000,52675=>1000,52676=>1000,52677=>1000,52678=>1000,52679=>1000,52680=>1000,52681=>1000,52682=>1000,52683=>1000,52684=>1000,52685=>1000,52686=>1000,52687=>1000,52688=>1000,52689=>1000,52690=>1000,52691=>1000,52692=>1000,52693=>1000,52694=>1000,52695=>1000,52696=>1000,52697=>1000,52698=>1000,52699=>1000,52700=>1000,52701=>1000,52702=>1000,52703=>1000,52704=>1000,52705=>1000,52706=>1000,52707=>1000,52708=>1000,52709=>1000,52710=>1000,52711=>1000,52712=>1000,52713=>1000,52714=>1000,52715=>1000,52716=>1000,52717=>1000,52718=>1000,52719=>1000,52720=>1000,52721=>1000,52722=>1000,52723=>1000,52724=>1000,52725=>1000,52726=>1000,52727=>1000,52728=>1000,52729=>1000,52730=>1000,52731=>1000,52732=>1000,52733=>1000,52734=>1000,52735=>1000,52736=>1000,52737=>1000,52738=>1000,52739=>1000,52740=>1000,52741=>1000,52742=>1000,52743=>1000,52744=>1000,52745=>1000,52746=>1000,52747=>1000,52748=>1000,52749=>1000,52750=>1000,52751=>1000,52752=>1000,52753=>1000,52754=>1000,52755=>1000,52756=>1000,52757=>1000,52758=>1000,52759=>1000,52760=>1000,52761=>1000,52762=>1000,52763=>1000,52764=>1000,52765=>1000,52766=>1000,52767=>1000,52768=>1000,52769=>1000,52770=>1000,52771=>1000,52772=>1000,52773=>1000,52774=>1000,52775=>1000,52776=>1000,52777=>1000,52778=>1000,52779=>1000,52780=>1000,52781=>1000,52782=>1000,52783=>1000,52784=>1000,52785=>1000,52786=>1000,52787=>1000,52788=>1000,52789=>1000,52790=>1000,52791=>1000,52792=>1000,52793=>1000,52794=>1000,52795=>1000,52796=>1000,52797=>1000,52798=>1000,52799=>1000,52800=>1000,52801=>1000,52802=>1000,52803=>1000,52804=>1000,52805=>1000,52806=>1000,52807=>1000,52808=>1000,52809=>1000,52810=>1000,52811=>1000,52812=>1000,52813=>1000,52814=>1000,52815=>1000,52816=>1000,52817=>1000,52818=>1000,52819=>1000,52820=>1000,52821=>1000,52822=>1000,52823=>1000,52824=>1000,52825=>1000,52826=>1000,52827=>1000,52828=>1000,52829=>1000,52830=>1000,52831=>1000,52832=>1000,52833=>1000,52834=>1000,52835=>1000,52836=>1000,52837=>1000,52838=>1000,52839=>1000,52840=>1000,52841=>1000,52842=>1000,52843=>1000,52844=>1000,52845=>1000,52846=>1000,52847=>1000,52848=>1000,52849=>1000,52850=>1000,52851=>1000,52852=>1000,52853=>1000,52854=>1000,52855=>1000,52856=>1000,52857=>1000,52858=>1000,52859=>1000,52860=>1000,52861=>1000,52862=>1000,52863=>1000,52864=>1000,52865=>1000,52866=>1000,52867=>1000,52868=>1000,52869=>1000,52870=>1000,52871=>1000,52872=>1000,52873=>1000,52874=>1000,52875=>1000,52876=>1000,52877=>1000,52878=>1000,52879=>1000,52880=>1000,52881=>1000,52882=>1000,52883=>1000,52884=>1000,52885=>1000,52886=>1000,52887=>1000,52888=>1000,52889=>1000,52890=>1000,52891=>1000,52892=>1000,52893=>1000,52894=>1000,52895=>1000,52896=>1000,52897=>1000,52898=>1000,52899=>1000,52900=>1000,52901=>1000,52902=>1000,52903=>1000,52904=>1000,52905=>1000,52906=>1000,52907=>1000,52908=>1000,52909=>1000,52910=>1000,52911=>1000,52912=>1000,52913=>1000,52914=>1000,52915=>1000,52916=>1000,52917=>1000,52918=>1000,52919=>1000,52920=>1000,52921=>1000,52922=>1000,52923=>1000,52924=>1000,52925=>1000,52926=>1000,52927=>1000,52928=>1000,52929=>1000,52930=>1000,52931=>1000,52932=>1000,52933=>1000,52934=>1000,52935=>1000,52936=>1000,52937=>1000,52938=>1000,52939=>1000,52940=>1000,52941=>1000,52942=>1000,52943=>1000,52944=>1000,52945=>1000,52946=>1000,52947=>1000,52948=>1000,52949=>1000,52950=>1000,52951=>1000,52952=>1000,52953=>1000,52954=>1000,52955=>1000,52956=>1000,52957=>1000,52958=>1000,52959=>1000,52960=>1000,52961=>1000,52962=>1000,52963=>1000,52964=>1000,52965=>1000,52966=>1000,52967=>1000,52968=>1000,52969=>1000,52970=>1000,52971=>1000,52972=>1000,52973=>1000,52974=>1000,52975=>1000,52976=>1000,52977=>1000,52978=>1000,52979=>1000,52980=>1000,52981=>1000,52982=>1000,52983=>1000,52984=>1000,52985=>1000,52986=>1000,52987=>1000,52988=>1000,52989=>1000,52990=>1000,52991=>1000,52992=>1000,52993=>1000,52994=>1000,52995=>1000,52996=>1000,52997=>1000,52998=>1000,52999=>1000,53000=>1000,53001=>1000,53002=>1000,53003=>1000,53004=>1000,53005=>1000,53006=>1000,53007=>1000,53008=>1000,53009=>1000,53010=>1000,53011=>1000,53012=>1000,53013=>1000,53014=>1000,53015=>1000,53016=>1000,53017=>1000,53018=>1000,53019=>1000,53020=>1000,53021=>1000,53022=>1000,53023=>1000,53024=>1000,53025=>1000,53026=>1000,53027=>1000,53028=>1000,53029=>1000,53030=>1000,53031=>1000,53032=>1000,53033=>1000,53034=>1000,53035=>1000,53036=>1000,53037=>1000,53038=>1000,53039=>1000,53040=>1000,53041=>1000,53042=>1000,53043=>1000,53044=>1000,53045=>1000,53046=>1000,53047=>1000,53048=>1000,53049=>1000,53050=>1000,53051=>1000,53052=>1000,53053=>1000,53054=>1000,53055=>1000,53056=>1000,53057=>1000,53058=>1000,53059=>1000,53060=>1000,53061=>1000,53062=>1000,53063=>1000,53064=>1000,53065=>1000,53066=>1000,53067=>1000,53068=>1000,53069=>1000,53070=>1000,53071=>1000,53072=>1000,53073=>1000,53074=>1000,53075=>1000,53076=>1000,53077=>1000,53078=>1000,53079=>1000,53080=>1000,53081=>1000,53082=>1000,53083=>1000,53084=>1000,53085=>1000,53086=>1000,53087=>1000,53088=>1000,53089=>1000,53090=>1000,53091=>1000,53092=>1000,53093=>1000,53094=>1000,53095=>1000,53096=>1000,53097=>1000,53098=>1000,53099=>1000,53100=>1000,53101=>1000,53102=>1000,53103=>1000,53104=>1000,53105=>1000,53106=>1000,53107=>1000,53108=>1000,53109=>1000,53110=>1000,53111=>1000,53112=>1000,53113=>1000,53114=>1000,53115=>1000,53116=>1000,53117=>1000,53118=>1000,53119=>1000,53120=>1000,53121=>1000,53122=>1000,53123=>1000,53124=>1000,53125=>1000,53126=>1000,53127=>1000,53128=>1000,53129=>1000,53130=>1000,53131=>1000,53132=>1000,53133=>1000,53134=>1000,53135=>1000,53136=>1000,53137=>1000,53138=>1000,53139=>1000,53140=>1000,53141=>1000,53142=>1000,53143=>1000,53144=>1000,53145=>1000,53146=>1000,53147=>1000,53148=>1000,53149=>1000,53150=>1000,53151=>1000,53152=>1000,53153=>1000,53154=>1000,53155=>1000,53156=>1000,53157=>1000,53158=>1000,53159=>1000,53160=>1000,53161=>1000,53162=>1000,53163=>1000,53164=>1000,53165=>1000,53166=>1000,53167=>1000,53168=>1000,53169=>1000,53170=>1000,53171=>1000,53172=>1000,53173=>1000,53174=>1000,53175=>1000,53176=>1000,53177=>1000,53178=>1000,53179=>1000,53180=>1000,53181=>1000,53182=>1000,53183=>1000,53184=>1000,53185=>1000,53186=>1000,53187=>1000,53188=>1000,53189=>1000,53190=>1000,53191=>1000,53192=>1000,53193=>1000,53194=>1000,53195=>1000,53196=>1000,53197=>1000,53198=>1000,53199=>1000,53200=>1000,53201=>1000,53202=>1000,53203=>1000,53204=>1000,53205=>1000,53206=>1000,53207=>1000,53208=>1000,53209=>1000,53210=>1000,53211=>1000,53212=>1000,53213=>1000,53214=>1000,53215=>1000,53216=>1000,53217=>1000,53218=>1000,53219=>1000,53220=>1000,53221=>1000,53222=>1000,53223=>1000,53224=>1000,53225=>1000,53226=>1000,53227=>1000,53228=>1000,53229=>1000,53230=>1000,53231=>1000,53232=>1000,53233=>1000,53234=>1000,53235=>1000,53236=>1000,53237=>1000,53238=>1000,53239=>1000,53240=>1000,53241=>1000,53242=>1000,53243=>1000,53244=>1000,53245=>1000,53246=>1000,53247=>1000,53248=>1000,53249=>1000,53250=>1000,53251=>1000,53252=>1000,53253=>1000,53254=>1000,53255=>1000,53256=>1000,53257=>1000,53258=>1000,53259=>1000,53260=>1000,53261=>1000,53262=>1000,53263=>1000,53264=>1000,53265=>1000,53266=>1000,53267=>1000,53268=>1000,53269=>1000,53270=>1000,53271=>1000,53272=>1000,53273=>1000,53274=>1000,53275=>1000,53276=>1000,53277=>1000,53278=>1000,53279=>1000,53280=>1000,53281=>1000,53282=>1000,53283=>1000,53284=>1000,53285=>1000,53286=>1000,53287=>1000,53288=>1000,53289=>1000,53290=>1000,53291=>1000,53292=>1000,53293=>1000,53294=>1000,53295=>1000,53296=>1000,53297=>1000,53298=>1000,53299=>1000,53300=>1000,53301=>1000,53302=>1000,53303=>1000,53304=>1000,53305=>1000,53306=>1000,53307=>1000,53308=>1000,53309=>1000,53310=>1000,53311=>1000,53312=>1000,53313=>1000,53314=>1000,53315=>1000,53316=>1000,53317=>1000,53318=>1000,53319=>1000,53320=>1000,53321=>1000,53322=>1000,53323=>1000,53324=>1000,53325=>1000,53326=>1000,53327=>1000,53328=>1000,53329=>1000,53330=>1000,53331=>1000,53332=>1000,53333=>1000,53334=>1000,53335=>1000,53336=>1000,53337=>1000,53338=>1000,53339=>1000,53340=>1000,53341=>1000,53342=>1000,53343=>1000,53344=>1000,53345=>1000,53346=>1000,53347=>1000,53348=>1000,53349=>1000,53350=>1000,53351=>1000,53352=>1000,53353=>1000,53354=>1000,53355=>1000,53356=>1000,53357=>1000,53358=>1000,53359=>1000,53360=>1000,53361=>1000,53362=>1000,53363=>1000,53364=>1000,53365=>1000,53366=>1000,53367=>1000,53368=>1000,53369=>1000,53370=>1000,53371=>1000,53372=>1000,53373=>1000,53374=>1000,53375=>1000,53376=>1000,53377=>1000,53378=>1000,53379=>1000,53380=>1000,53381=>1000,53382=>1000,53383=>1000,53384=>1000,53385=>1000,53386=>1000,53387=>1000,53388=>1000,53389=>1000,53390=>1000,53391=>1000,53392=>1000,53393=>1000,53394=>1000,53395=>1000,53396=>1000,53397=>1000,53398=>1000,53399=>1000,53400=>1000,53401=>1000,53402=>1000,53403=>1000,53404=>1000,53405=>1000,53406=>1000,53407=>1000,53408=>1000,53409=>1000,53410=>1000,53411=>1000,53412=>1000,53413=>1000,53414=>1000,53415=>1000,53416=>1000,53417=>1000,53418=>1000,53419=>1000,53420=>1000,53421=>1000,53422=>1000,53423=>1000,53424=>1000,53425=>1000,53426=>1000,53427=>1000,53428=>1000,53429=>1000,53430=>1000,53431=>1000,53432=>1000,53433=>1000,53434=>1000,53435=>1000,53436=>1000,53437=>1000,53438=>1000,53439=>1000,53440=>1000,53441=>1000,53442=>1000,53443=>1000,53444=>1000,53445=>1000,53446=>1000,53447=>1000,53448=>1000,53449=>1000,53450=>1000,53451=>1000,53452=>1000,53453=>1000,53454=>1000,53455=>1000,53456=>1000,53457=>1000,53458=>1000,53459=>1000,53460=>1000,53461=>1000,53462=>1000,53463=>1000,53464=>1000,53465=>1000,53466=>1000,53467=>1000,53468=>1000,53469=>1000,53470=>1000,53471=>1000,53472=>1000,53473=>1000,53474=>1000,53475=>1000,53476=>1000,53477=>1000,53478=>1000,53479=>1000,53480=>1000,53481=>1000,53482=>1000,53483=>1000,53484=>1000,53485=>1000,53486=>1000,53487=>1000,53488=>1000,53489=>1000,53490=>1000,53491=>1000,53492=>1000,53493=>1000,53494=>1000,53495=>1000,53496=>1000,53497=>1000,53498=>1000,53499=>1000,53500=>1000,53501=>1000,53502=>1000,53503=>1000,53504=>1000,53505=>1000,53506=>1000,53507=>1000,53508=>1000,53509=>1000,53510=>1000,53511=>1000,53512=>1000,53513=>1000,53514=>1000,53515=>1000,53516=>1000,53517=>1000,53518=>1000,53519=>1000,53520=>1000,53521=>1000,53522=>1000,53523=>1000,53524=>1000,53525=>1000,53526=>1000,53527=>1000,53528=>1000,53529=>1000,53530=>1000,53531=>1000,53532=>1000,53533=>1000,53534=>1000,53535=>1000,53536=>1000,53537=>1000,53538=>1000,53539=>1000,53540=>1000,53541=>1000,53542=>1000,53543=>1000,53544=>1000,53545=>1000,53546=>1000,53547=>1000,53548=>1000,53549=>1000,53550=>1000,53551=>1000,53552=>1000,53553=>1000,53554=>1000,53555=>1000,53556=>1000,53557=>1000,53558=>1000,53559=>1000,53560=>1000,53561=>1000,53562=>1000,53563=>1000,53564=>1000,53565=>1000,53566=>1000,53567=>1000,53568=>1000,53569=>1000,53570=>1000,53571=>1000,53572=>1000,53573=>1000,53574=>1000,53575=>1000,53576=>1000,53577=>1000,53578=>1000,53579=>1000,53580=>1000,53581=>1000,53582=>1000,53583=>1000,53584=>1000,53585=>1000,53586=>1000,53587=>1000,53588=>1000,53589=>1000,53590=>1000,53591=>1000,53592=>1000,53593=>1000,53594=>1000,53595=>1000,53596=>1000,53597=>1000,53598=>1000,53599=>1000,53600=>1000,53601=>1000,53602=>1000,53603=>1000,53604=>1000,53605=>1000,53606=>1000,53607=>1000,53608=>1000,53609=>1000,53610=>1000,53611=>1000,53612=>1000,53613=>1000,53614=>1000,53615=>1000,53616=>1000,53617=>1000,53618=>1000,53619=>1000,53620=>1000,53621=>1000,53622=>1000,53623=>1000,53624=>1000,53625=>1000,53626=>1000,53627=>1000,53628=>1000,53629=>1000,53630=>1000,53631=>1000,53632=>1000,53633=>1000,53634=>1000,53635=>1000,53636=>1000,53637=>1000,53638=>1000,53639=>1000,53640=>1000,53641=>1000,53642=>1000,53643=>1000,53644=>1000,53645=>1000,53646=>1000,53647=>1000,53648=>1000,53649=>1000,53650=>1000,53651=>1000,53652=>1000,53653=>1000,53654=>1000,53655=>1000,53656=>1000,53657=>1000,53658=>1000,53659=>1000,53660=>1000,53661=>1000,53662=>1000,53663=>1000,53664=>1000,53665=>1000,53666=>1000,53667=>1000,53668=>1000,53669=>1000,53670=>1000,53671=>1000,53672=>1000,53673=>1000,53674=>1000,53675=>1000,53676=>1000,53677=>1000,53678=>1000,53679=>1000,53680=>1000,53681=>1000,53682=>1000,53683=>1000,53684=>1000,53685=>1000,53686=>1000,53687=>1000,53688=>1000,53689=>1000,53690=>1000,53691=>1000,53692=>1000,53693=>1000,53694=>1000,53695=>1000,53696=>1000,53697=>1000,53698=>1000,53699=>1000,53700=>1000,53701=>1000,53702=>1000,53703=>1000,53704=>1000,53705=>1000,53706=>1000,53707=>1000,53708=>1000,53709=>1000,53710=>1000,53711=>1000,53712=>1000,53713=>1000,53714=>1000,53715=>1000,53716=>1000,53717=>1000,53718=>1000,53719=>1000,53720=>1000,53721=>1000,53722=>1000,53723=>1000,53724=>1000,53725=>1000,53726=>1000,53727=>1000,53728=>1000,53729=>1000,53730=>1000,53731=>1000,53732=>1000,53733=>1000,53734=>1000,53735=>1000,53736=>1000,53737=>1000,53738=>1000,53739=>1000,53740=>1000,53741=>1000,53742=>1000,53743=>1000,53744=>1000,53745=>1000,53746=>1000,53747=>1000,53748=>1000,53749=>1000,53750=>1000,53751=>1000,53752=>1000,53753=>1000,53754=>1000,53755=>1000,53756=>1000,53757=>1000,53758=>1000,53759=>1000,53760=>1000,53761=>1000,53762=>1000,53763=>1000,53764=>1000,53765=>1000,53766=>1000,53767=>1000,53768=>1000,53769=>1000,53770=>1000,53771=>1000,53772=>1000,53773=>1000,53774=>1000,53775=>1000,53776=>1000,53777=>1000,53778=>1000,53779=>1000,53780=>1000,53781=>1000,53782=>1000,53783=>1000,53784=>1000,53785=>1000,53786=>1000,53787=>1000,53788=>1000,53789=>1000,53790=>1000,53791=>1000,53792=>1000,53793=>1000,53794=>1000,53795=>1000,53796=>1000,53797=>1000,53798=>1000,53799=>1000,53800=>1000,53801=>1000,53802=>1000,53803=>1000,53804=>1000,53805=>1000,53806=>1000,53807=>1000,53808=>1000,53809=>1000,53810=>1000,53811=>1000,53812=>1000,53813=>1000,53814=>1000,53815=>1000,53816=>1000,53817=>1000,53818=>1000,53819=>1000,53820=>1000,53821=>1000,53822=>1000,53823=>1000,53824=>1000,53825=>1000,53826=>1000,53827=>1000,53828=>1000,53829=>1000,53830=>1000,53831=>1000,53832=>1000,53833=>1000,53834=>1000,53835=>1000,53836=>1000,53837=>1000,53838=>1000,53839=>1000,53840=>1000,53841=>1000,53842=>1000,53843=>1000,53844=>1000,53845=>1000,53846=>1000,53847=>1000,53848=>1000,53849=>1000,53850=>1000,53851=>1000,53852=>1000,53853=>1000,53854=>1000,53855=>1000,53856=>1000,53857=>1000,53858=>1000,53859=>1000,53860=>1000,53861=>1000,53862=>1000,53863=>1000,53864=>1000,53865=>1000,53866=>1000,53867=>1000,53868=>1000,53869=>1000,53870=>1000,53871=>1000,53872=>1000,53873=>1000,53874=>1000,53875=>1000,53876=>1000,53877=>1000,53878=>1000,53879=>1000,53880=>1000,53881=>1000,53882=>1000,53883=>1000,53884=>1000,53885=>1000,53886=>1000,53887=>1000,53888=>1000,53889=>1000,53890=>1000,53891=>1000,53892=>1000,53893=>1000,53894=>1000,53895=>1000,53896=>1000,53897=>1000,53898=>1000,53899=>1000,53900=>1000,53901=>1000,53902=>1000,53903=>1000,53904=>1000,53905=>1000,53906=>1000,53907=>1000,53908=>1000,53909=>1000,53910=>1000,53911=>1000,53912=>1000,53913=>1000,53914=>1000,53915=>1000,53916=>1000,53917=>1000,53918=>1000,53919=>1000,53920=>1000,53921=>1000,53922=>1000,53923=>1000,53924=>1000,53925=>1000,53926=>1000,53927=>1000,53928=>1000,53929=>1000,53930=>1000,53931=>1000,53932=>1000,53933=>1000,53934=>1000,53935=>1000,53936=>1000,53937=>1000,53938=>1000,53939=>1000,53940=>1000,53941=>1000,53942=>1000,53943=>1000,53944=>1000,53945=>1000,53946=>1000,53947=>1000,53948=>1000,53949=>1000,53950=>1000,53951=>1000,53952=>1000,53953=>1000,53954=>1000,53955=>1000,53956=>1000,53957=>1000,53958=>1000,53959=>1000,53960=>1000,53961=>1000,53962=>1000,53963=>1000,53964=>1000,53965=>1000,53966=>1000,53967=>1000,53968=>1000,53969=>1000,53970=>1000,53971=>1000,53972=>1000,53973=>1000,53974=>1000,53975=>1000,53976=>1000,53977=>1000,53978=>1000,53979=>1000,53980=>1000,53981=>1000,53982=>1000,53983=>1000,53984=>1000,53985=>1000,53986=>1000,53987=>1000,53988=>1000,53989=>1000,53990=>1000,53991=>1000,53992=>1000,53993=>1000,53994=>1000,53995=>1000,53996=>1000,53997=>1000,53998=>1000,53999=>1000,54000=>1000,54001=>1000,54002=>1000,54003=>1000,54004=>1000,54005=>1000,54006=>1000,54007=>1000,54008=>1000,54009=>1000,54010=>1000,54011=>1000,54012=>1000,54013=>1000,54014=>1000,54015=>1000,54016=>1000,54017=>1000,54018=>1000,54019=>1000,54020=>1000,54021=>1000,54022=>1000,54023=>1000,54024=>1000,54025=>1000,54026=>1000,54027=>1000,54028=>1000,54029=>1000,54030=>1000,54031=>1000,54032=>1000,54033=>1000,54034=>1000,54035=>1000,54036=>1000,54037=>1000,54038=>1000,54039=>1000,54040=>1000,54041=>1000,54042=>1000,54043=>1000,54044=>1000,54045=>1000,54046=>1000,54047=>1000,54048=>1000,54049=>1000,54050=>1000,54051=>1000,54052=>1000,54053=>1000,54054=>1000,54055=>1000,54056=>1000,54057=>1000,54058=>1000,54059=>1000,54060=>1000,54061=>1000,54062=>1000,54063=>1000,54064=>1000,54065=>1000,54066=>1000,54067=>1000,54068=>1000,54069=>1000,54070=>1000,54071=>1000,54072=>1000,54073=>1000,54074=>1000,54075=>1000,54076=>1000,54077=>1000,54078=>1000,54079=>1000,54080=>1000,54081=>1000,54082=>1000,54083=>1000,54084=>1000,54085=>1000,54086=>1000,54087=>1000,54088=>1000,54089=>1000,54090=>1000,54091=>1000,54092=>1000,54093=>1000,54094=>1000,54095=>1000,54096=>1000,54097=>1000,54098=>1000,54099=>1000,54100=>1000,54101=>1000,54102=>1000,54103=>1000,54104=>1000,54105=>1000,54106=>1000,54107=>1000,54108=>1000,54109=>1000,54110=>1000,54111=>1000,54112=>1000,54113=>1000,54114=>1000,54115=>1000,54116=>1000,54117=>1000,54118=>1000,54119=>1000,54120=>1000,54121=>1000,54122=>1000,54123=>1000,54124=>1000,54125=>1000,54126=>1000,54127=>1000,54128=>1000,54129=>1000,54130=>1000,54131=>1000,54132=>1000,54133=>1000,54134=>1000,54135=>1000,54136=>1000,54137=>1000,54138=>1000,54139=>1000,54140=>1000,54141=>1000,54142=>1000,54143=>1000,54144=>1000,54145=>1000,54146=>1000,54147=>1000,54148=>1000,54149=>1000,54150=>1000,54151=>1000,54152=>1000,54153=>1000,54154=>1000,54155=>1000,54156=>1000,54157=>1000,54158=>1000,54159=>1000,54160=>1000,54161=>1000,54162=>1000,54163=>1000,54164=>1000,54165=>1000,54166=>1000,54167=>1000,54168=>1000,54169=>1000,54170=>1000,54171=>1000,54172=>1000,54173=>1000,54174=>1000,54175=>1000,54176=>1000,54177=>1000,54178=>1000,54179=>1000,54180=>1000,54181=>1000,54182=>1000,54183=>1000,54184=>1000,54185=>1000,54186=>1000,54187=>1000,54188=>1000,54189=>1000,54190=>1000,54191=>1000,54192=>1000,54193=>1000,54194=>1000,54195=>1000,54196=>1000,54197=>1000,54198=>1000,54199=>1000,54200=>1000,54201=>1000,54202=>1000,54203=>1000,54204=>1000,54205=>1000,54206=>1000,54207=>1000,54208=>1000,54209=>1000,54210=>1000,54211=>1000,54212=>1000,54213=>1000,54214=>1000,54215=>1000,54216=>1000,54217=>1000,54218=>1000,54219=>1000,54220=>1000,54221=>1000,54222=>1000,54223=>1000,54224=>1000,54225=>1000,54226=>1000,54227=>1000,54228=>1000,54229=>1000,54230=>1000,54231=>1000,54232=>1000,54233=>1000,54234=>1000,54235=>1000,54236=>1000,54237=>1000,54238=>1000,54239=>1000,54240=>1000,54241=>1000,54242=>1000,54243=>1000,54244=>1000,54245=>1000,54246=>1000,54247=>1000,54248=>1000,54249=>1000,54250=>1000,54251=>1000,54252=>1000,54253=>1000,54254=>1000,54255=>1000,54256=>1000,54257=>1000,54258=>1000,54259=>1000,54260=>1000,54261=>1000,54262=>1000,54263=>1000,54264=>1000,54265=>1000,54266=>1000,54267=>1000,54268=>1000,54269=>1000,54270=>1000,54271=>1000,54272=>1000,54273=>1000,54274=>1000,54275=>1000,54276=>1000,54277=>1000,54278=>1000,54279=>1000,54280=>1000,54281=>1000,54282=>1000,54283=>1000,54284=>1000,54285=>1000,54286=>1000,54287=>1000,54288=>1000,54289=>1000,54290=>1000,54291=>1000,54292=>1000,54293=>1000,54294=>1000,54295=>1000,54296=>1000,54297=>1000,54298=>1000,54299=>1000,54300=>1000,54301=>1000,54302=>1000,54303=>1000,54304=>1000,54305=>1000,54306=>1000,54307=>1000,54308=>1000,54309=>1000,54310=>1000,54311=>1000,54312=>1000,54313=>1000,54314=>1000,54315=>1000,54316=>1000,54317=>1000,54318=>1000,54319=>1000,54320=>1000,54321=>1000,54322=>1000,54323=>1000,54324=>1000,54325=>1000,54326=>1000,54327=>1000,54328=>1000,54329=>1000,54330=>1000,54331=>1000,54332=>1000,54333=>1000,54334=>1000,54335=>1000,54336=>1000,54337=>1000,54338=>1000,54339=>1000,54340=>1000,54341=>1000,54342=>1000,54343=>1000,54344=>1000,54345=>1000,54346=>1000,54347=>1000,54348=>1000,54349=>1000,54350=>1000,54351=>1000,54352=>1000,54353=>1000,54354=>1000,54355=>1000,54356=>1000,54357=>1000,54358=>1000,54359=>1000,54360=>1000,54361=>1000,54362=>1000,54363=>1000,54364=>1000,54365=>1000,54366=>1000,54367=>1000,54368=>1000,54369=>1000,54370=>1000,54371=>1000,54372=>1000,54373=>1000,54374=>1000,54375=>1000,54376=>1000,54377=>1000,54378=>1000,54379=>1000,54380=>1000,54381=>1000,54382=>1000,54383=>1000,54384=>1000,54385=>1000,54386=>1000,54387=>1000,54388=>1000,54389=>1000,54390=>1000,54391=>1000,54392=>1000,54393=>1000,54394=>1000,54395=>1000,54396=>1000,54397=>1000,54398=>1000,54399=>1000,54400=>1000,54401=>1000,54402=>1000,54403=>1000,54404=>1000,54405=>1000,54406=>1000,54407=>1000,54408=>1000,54409=>1000,54410=>1000,54411=>1000,54412=>1000,54413=>1000,54414=>1000,54415=>1000,54416=>1000,54417=>1000,54418=>1000,54419=>1000,54420=>1000,54421=>1000,54422=>1000,54423=>1000,54424=>1000,54425=>1000,54426=>1000,54427=>1000,54428=>1000,54429=>1000,54430=>1000,54431=>1000,54432=>1000,54433=>1000,54434=>1000,54435=>1000,54436=>1000,54437=>1000,54438=>1000,54439=>1000,54440=>1000,54441=>1000,54442=>1000,54443=>1000,54444=>1000,54445=>1000,54446=>1000,54447=>1000,54448=>1000,54449=>1000,54450=>1000,54451=>1000,54452=>1000,54453=>1000,54454=>1000,54455=>1000,54456=>1000,54457=>1000,54458=>1000,54459=>1000,54460=>1000,54461=>1000,54462=>1000,54463=>1000,54464=>1000,54465=>1000,54466=>1000,54467=>1000,54468=>1000,54469=>1000,54470=>1000,54471=>1000,54472=>1000,54473=>1000,54474=>1000,54475=>1000,54476=>1000,54477=>1000,54478=>1000,54479=>1000,54480=>1000,54481=>1000,54482=>1000,54483=>1000,54484=>1000,54485=>1000,54486=>1000,54487=>1000,54488=>1000,54489=>1000,54490=>1000,54491=>1000,54492=>1000,54493=>1000,54494=>1000,54495=>1000,54496=>1000,54497=>1000,54498=>1000,54499=>1000,54500=>1000,54501=>1000,54502=>1000,54503=>1000,54504=>1000,54505=>1000,54506=>1000,54507=>1000,54508=>1000,54509=>1000,54510=>1000,54511=>1000,54512=>1000,54513=>1000,54514=>1000,54515=>1000,54516=>1000,54517=>1000,54518=>1000,54519=>1000,54520=>1000,54521=>1000,54522=>1000,54523=>1000,54524=>1000,54525=>1000,54526=>1000,54527=>1000,54528=>1000,54529=>1000,54530=>1000,54531=>1000,54532=>1000,54533=>1000,54534=>1000,54535=>1000,54536=>1000,54537=>1000,54538=>1000,54539=>1000,54540=>1000,54541=>1000,54542=>1000,54543=>1000,54544=>1000,54545=>1000,54546=>1000,54547=>1000,54548=>1000,54549=>1000,54550=>1000,54551=>1000,54552=>1000,54553=>1000,54554=>1000,54555=>1000,54556=>1000,54557=>1000,54558=>1000,54559=>1000,54560=>1000,54561=>1000,54562=>1000,54563=>1000,54564=>1000,54565=>1000,54566=>1000,54567=>1000,54568=>1000,54569=>1000,54570=>1000,54571=>1000,54572=>1000,54573=>1000,54574=>1000,54575=>1000,54576=>1000,54577=>1000,54578=>1000,54579=>1000,54580=>1000,54581=>1000,54582=>1000,54583=>1000,54584=>1000,54585=>1000,54586=>1000,54587=>1000,54588=>1000,54589=>1000,54590=>1000,54591=>1000,54592=>1000,54593=>1000,54594=>1000,54595=>1000,54596=>1000,54597=>1000,54598=>1000,54599=>1000,54600=>1000,54601=>1000,54602=>1000,54603=>1000,54604=>1000,54605=>1000,54606=>1000,54607=>1000,54608=>1000,54609=>1000,54610=>1000,54611=>1000,54612=>1000,54613=>1000,54614=>1000,54615=>1000,54616=>1000,54617=>1000,54618=>1000,54619=>1000,54620=>1000,54621=>1000,54622=>1000,54623=>1000,54624=>1000,54625=>1000,54626=>1000,54627=>1000,54628=>1000,54629=>1000,54630=>1000,54631=>1000,54632=>1000,54633=>1000,54634=>1000,54635=>1000,54636=>1000,54637=>1000,54638=>1000,54639=>1000,54640=>1000,54641=>1000,54642=>1000,54643=>1000,54644=>1000,54645=>1000,54646=>1000,54647=>1000,54648=>1000,54649=>1000,54650=>1000,54651=>1000,54652=>1000,54653=>1000,54654=>1000,54655=>1000,54656=>1000,54657=>1000,54658=>1000,54659=>1000,54660=>1000,54661=>1000,54662=>1000,54663=>1000,54664=>1000,54665=>1000,54666=>1000,54667=>1000,54668=>1000,54669=>1000,54670=>1000,54671=>1000,54672=>1000,54673=>1000,54674=>1000,54675=>1000,54676=>1000,54677=>1000,54678=>1000,54679=>1000,54680=>1000,54681=>1000,54682=>1000,54683=>1000,54684=>1000,54685=>1000,54686=>1000,54687=>1000,54688=>1000,54689=>1000,54690=>1000,54691=>1000,54692=>1000,54693=>1000,54694=>1000,54695=>1000,54696=>1000,54697=>1000,54698=>1000,54699=>1000,54700=>1000,54701=>1000,54702=>1000,54703=>1000,54704=>1000,54705=>1000,54706=>1000,54707=>1000,54708=>1000,54709=>1000,54710=>1000,54711=>1000,54712=>1000,54713=>1000,54714=>1000,54715=>1000,54716=>1000,54717=>1000,54718=>1000,54719=>1000,54720=>1000,54721=>1000,54722=>1000,54723=>1000,54724=>1000,54725=>1000,54726=>1000,54727=>1000,54728=>1000,54729=>1000,54730=>1000,54731=>1000,54732=>1000,54733=>1000,54734=>1000,54735=>1000,54736=>1000,54737=>1000,54738=>1000,54739=>1000,54740=>1000,54741=>1000,54742=>1000,54743=>1000,54744=>1000,54745=>1000,54746=>1000,54747=>1000,54748=>1000,54749=>1000,54750=>1000,54751=>1000,54752=>1000,54753=>1000,54754=>1000,54755=>1000,54756=>1000,54757=>1000,54758=>1000,54759=>1000,54760=>1000,54761=>1000,54762=>1000,54763=>1000,54764=>1000,54765=>1000,54766=>1000,54767=>1000,54768=>1000,54769=>1000,54770=>1000,54771=>1000,54772=>1000,54773=>1000,54774=>1000,54775=>1000,54776=>1000,54777=>1000,54778=>1000,54779=>1000,54780=>1000,54781=>1000,54782=>1000,54783=>1000,54784=>1000,54785=>1000,54786=>1000,54787=>1000,54788=>1000,54789=>1000,54790=>1000,54791=>1000,54792=>1000,54793=>1000,54794=>1000,54795=>1000,54796=>1000,54797=>1000,54798=>1000,54799=>1000,54800=>1000,54801=>1000,54802=>1000,54803=>1000,54804=>1000,54805=>1000,54806=>1000,54807=>1000,54808=>1000,54809=>1000,54810=>1000,54811=>1000,54812=>1000,54813=>1000,54814=>1000,54815=>1000,54816=>1000,54817=>1000,54818=>1000,54819=>1000,54820=>1000,54821=>1000,54822=>1000,54823=>1000,54824=>1000,54825=>1000,54826=>1000,54827=>1000,54828=>1000,54829=>1000,54830=>1000,54831=>1000,54832=>1000,54833=>1000,54834=>1000,54835=>1000,54836=>1000,54837=>1000,54838=>1000,54839=>1000,54840=>1000,54841=>1000,54842=>1000,54843=>1000,54844=>1000,54845=>1000,54846=>1000,54847=>1000,54848=>1000,54849=>1000,54850=>1000,54851=>1000,54852=>1000,54853=>1000,54854=>1000,54855=>1000,54856=>1000,54857=>1000,54858=>1000,54859=>1000,54860=>1000,54861=>1000,54862=>1000,54863=>1000,54864=>1000,54865=>1000,54866=>1000,54867=>1000,54868=>1000,54869=>1000,54870=>1000,54871=>1000,54872=>1000,54873=>1000,54874=>1000,54875=>1000,54876=>1000,54877=>1000,54878=>1000,54879=>1000,54880=>1000,54881=>1000,54882=>1000,54883=>1000,54884=>1000,54885=>1000,54886=>1000,54887=>1000,54888=>1000,54889=>1000,54890=>1000,54891=>1000,54892=>1000,54893=>1000,54894=>1000,54895=>1000,54896=>1000,54897=>1000,54898=>1000,54899=>1000,54900=>1000,54901=>1000,54902=>1000,54903=>1000,54904=>1000,54905=>1000,54906=>1000,54907=>1000,54908=>1000,54909=>1000,54910=>1000,54911=>1000,54912=>1000,54913=>1000,54914=>1000,54915=>1000,54916=>1000,54917=>1000,54918=>1000,54919=>1000,54920=>1000,54921=>1000,54922=>1000,54923=>1000,54924=>1000,54925=>1000,54926=>1000,54927=>1000,54928=>1000,54929=>1000,54930=>1000,54931=>1000,54932=>1000,54933=>1000,54934=>1000,54935=>1000,54936=>1000,54937=>1000,54938=>1000,54939=>1000,54940=>1000,54941=>1000,54942=>1000,54943=>1000,54944=>1000,54945=>1000,54946=>1000,54947=>1000,54948=>1000,54949=>1000,54950=>1000,54951=>1000,54952=>1000,54953=>1000,54954=>1000,54955=>1000,54956=>1000,54957=>1000,54958=>1000,54959=>1000,54960=>1000,54961=>1000,54962=>1000,54963=>1000,54964=>1000,54965=>1000,54966=>1000,54967=>1000,54968=>1000,54969=>1000,54970=>1000,54971=>1000,54972=>1000,54973=>1000,54974=>1000,54975=>1000,54976=>1000,54977=>1000,54978=>1000,54979=>1000,54980=>1000,54981=>1000,54982=>1000,54983=>1000,54984=>1000,54985=>1000,54986=>1000,54987=>1000,54988=>1000,54989=>1000,54990=>1000,54991=>1000,54992=>1000,54993=>1000,54994=>1000,54995=>1000,54996=>1000,54997=>1000,54998=>1000,54999=>1000,55000=>1000,55001=>1000,55002=>1000,55003=>1000,55004=>1000,55005=>1000,55006=>1000,55007=>1000,55008=>1000,55009=>1000,55010=>1000,55011=>1000,55012=>1000,55013=>1000,55014=>1000,55015=>1000,55016=>1000,55017=>1000,55018=>1000,55019=>1000,55020=>1000,55021=>1000,55022=>1000,55023=>1000,55024=>1000,55025=>1000,55026=>1000,55027=>1000,55028=>1000,55029=>1000,55030=>1000,55031=>1000,55032=>1000,55033=>1000,55034=>1000,55035=>1000,55036=>1000,55037=>1000,55038=>1000,55039=>1000,55040=>1000,55041=>1000,55042=>1000,55043=>1000,55044=>1000,55045=>1000,55046=>1000,55047=>1000,55048=>1000,55049=>1000,55050=>1000,55051=>1000,55052=>1000,55053=>1000,55054=>1000,55055=>1000,55056=>1000,55057=>1000,55058=>1000,55059=>1000,55060=>1000,55061=>1000,55062=>1000,55063=>1000,55064=>1000,55065=>1000,55066=>1000,55067=>1000,55068=>1000,55069=>1000,55070=>1000,55071=>1000,55072=>1000,55073=>1000,55074=>1000,55075=>1000,55076=>1000,55077=>1000,55078=>1000,55079=>1000,55080=>1000,55081=>1000,55082=>1000,55083=>1000,55084=>1000,55085=>1000,55086=>1000,55087=>1000,55088=>1000,55089=>1000,55090=>1000,55091=>1000,55092=>1000,55093=>1000,55094=>1000,55095=>1000,55096=>1000,55097=>1000,55098=>1000,55099=>1000,55100=>1000,55101=>1000,55102=>1000,55103=>1000,55104=>1000,55105=>1000,55106=>1000,55107=>1000,55108=>1000,55109=>1000,55110=>1000,55111=>1000,55112=>1000,55113=>1000,55114=>1000,55115=>1000,55116=>1000,55117=>1000,55118=>1000,55119=>1000,55120=>1000,55121=>1000,55122=>1000,55123=>1000,55124=>1000,55125=>1000,55126=>1000,55127=>1000,55128=>1000,55129=>1000,55130=>1000,55131=>1000,55132=>1000,55133=>1000,55134=>1000,55135=>1000,55136=>1000,55137=>1000,55138=>1000,55139=>1000,55140=>1000,55141=>1000,55142=>1000,55143=>1000,55144=>1000,55145=>1000,55146=>1000,55147=>1000,55148=>1000,55149=>1000,55150=>1000,55151=>1000,55152=>1000,55153=>1000,55154=>1000,55155=>1000,55156=>1000,55157=>1000,55158=>1000,55159=>1000,55160=>1000,55161=>1000,55162=>1000,55163=>1000,55164=>1000,55165=>1000,55166=>1000,55167=>1000,55168=>1000,55169=>1000,55170=>1000,55171=>1000,55172=>1000,55173=>1000,55174=>1000,55175=>1000,55176=>1000,55177=>1000,55178=>1000,55179=>1000,55180=>1000,55181=>1000,55182=>1000,55183=>1000,55184=>1000,55185=>1000,55186=>1000,55187=>1000,55188=>1000,55189=>1000,55190=>1000,55191=>1000,55192=>1000,55193=>1000,55194=>1000,55195=>1000,55196=>1000,55197=>1000,55198=>1000,55199=>1000,55200=>1000,55201=>1000,55202=>1000,55203=>1000,59393=>316,59394=>507,59395=>507,59396=>484,59397=>484,59416=>0,59492=>480,59495=>480,59536=>458,59557=>466,59558=>480,59559=>903,61441=>500,61442=>500,63232=>541,63233=>0,63234=>0,63235=>0,63236=>0,63237=>0,63238=>0,63239=>0,63240=>0,63241=>0,63242=>0,63243=>0,63244=>0,63245=>0,63246=>0,63247=>849,63248=>0,63249=>0,63250=>0,63251=>0,63252=>0,63253=>0,63254=>0,63255=>0,63256=>0,63257=>0,63258=>0,63260=>333,63261=>287,63744=>1000,63745=>1000,63746=>1000,63747=>1000,63748=>1000,63749=>1000,63750=>1000,63751=>1000,63752=>1000,63753=>1000,63754=>1000,63755=>1000,63756=>1000,63757=>1000,63758=>1000,63759=>1000,63760=>1000,63761=>1000,63762=>1000,63763=>1000,63764=>1000,63765=>1000,63766=>1000,63767=>1000,63768=>1000,63769=>1000,63770=>1000,63771=>1000,63772=>1000,63773=>1000,63774=>1000,63775=>1000,63776=>1000,63777=>1000,63778=>1000,63779=>1000,63780=>1000,63781=>1000,63782=>1000,63783=>1000,63784=>1000,63785=>1000,63786=>1000,63787=>1000,63788=>1000,63789=>1000,63790=>1000,63791=>1000,63792=>1000,63793=>1000,63794=>1000,63795=>1000,63796=>1000,63797=>1000,63798=>1000,63799=>1000,63800=>1000,63801=>1000,63802=>1000,63803=>1000,63804=>1000,63805=>1000,63806=>1000,63807=>1000,63808=>1000,63809=>1000,63810=>1000,63811=>1000,63812=>1000,63813=>1000,63814=>1000,63815=>1000,63816=>1000,63817=>1000,63818=>1000,63819=>1000,63820=>1000,63821=>1000,63822=>1000,63823=>1000,63824=>1000,63825=>1000,63826=>1000,63827=>1000,63828=>1000,63829=>1000,63830=>1000,63831=>1000,63832=>1000,63833=>1000,63834=>1000,63835=>1000,63836=>1000,63837=>1000,63838=>1000,63839=>1000,63840=>1000,63841=>1000,63842=>1000,63843=>1000,63844=>1000,63845=>1000,63846=>1000,63847=>1000,63848=>1000,63849=>1000,63850=>1000,63851=>1000,63852=>1000,63853=>1000,63854=>1000,63855=>1000,63856=>1000,63857=>1000,63858=>1000,63859=>1000,63860=>1000,63861=>1000,63862=>1000,63863=>1000,63864=>1000,63865=>1000,63866=>1000,63867=>1000,63868=>1000,63869=>1000,63870=>1000,63871=>1000,63872=>1000,63873=>1000,63874=>1000,63875=>1000,63876=>1000,63877=>1000,63878=>1000,63879=>1000,63880=>1000,63881=>1000,63882=>1000,63883=>1000,63884=>1000,63885=>1000,63886=>1000,63887=>1000,63888=>1000,63889=>1000,63890=>1000,63891=>1000,63892=>1000,63893=>1000,63894=>1000,63895=>1000,63896=>1000,63897=>1000,63898=>1000,63899=>1000,63900=>1000,63901=>1000,63902=>1000,63903=>1000,63904=>1000,63905=>1000,63906=>1000,63907=>1000,63908=>1000,63909=>1000,63910=>1000,63911=>1000,63912=>1000,63913=>1000,63914=>1000,63915=>1000,63916=>1000,63917=>1000,63918=>1000,63919=>1000,63920=>1000,63921=>1000,63922=>1000,63923=>1000,63924=>1000,63925=>1000,63926=>1000,63927=>1000,63928=>1000,63929=>1000,63930=>1000,63931=>1000,63932=>1000,63933=>1000,63934=>1000,63935=>1000,63936=>1000,63937=>1000,63938=>1000,63939=>1000,63940=>1000,63941=>1000,63942=>1000,63943=>1000,63944=>1000,63945=>1000,63946=>1000,63947=>1000,63948=>1000,63949=>1000,63950=>1000,63951=>1000,63952=>1000,63953=>1000,63954=>1000,63955=>1000,63956=>1000,63957=>1000,63958=>1000,63959=>1000,63960=>1000,63961=>1000,63962=>1000,63963=>1000,63964=>1000,63965=>1000,63966=>1000,63967=>1000,63968=>1000,63969=>1000,63970=>1000,63971=>1000,63972=>1000,63973=>1000,63974=>1000,63975=>1000,63976=>1000,63977=>1000,63978=>1000,63979=>1000,63980=>1000,63981=>1000,63982=>1000,63983=>1000,63984=>1000,63985=>1000,63986=>1000,63987=>1000,63988=>1000,63989=>1000,63990=>1000,63991=>1000,63992=>1000,63993=>1000,63994=>1000,63995=>1000,63996=>1000,63997=>1000,63998=>1000,63999=>1000,64000=>1000,64001=>1000,64002=>1000,64003=>1000,64004=>1000,64005=>1000,64006=>1000,64007=>1000,64008=>1000,64009=>1000,64010=>1000,64011=>1000,64012=>1000,64013=>1000,64014=>1000,64015=>1000,64016=>1000,64017=>1000,64018=>1000,64019=>1000,64020=>1000,64021=>1000,64022=>1000,64023=>1000,64024=>1000,64025=>1000,64026=>1000,64027=>1000,64028=>1000,64029=>1000,64030=>1000,64031=>1000,64032=>1000,64033=>1000,64034=>1000,64035=>1000,64036=>1000,64037=>1000,64038=>1000,64039=>1000,64040=>1000,64041=>1000,64042=>1000,64043=>1000,64044=>1000,64045=>1000,64256=>537,64257=>500,64258=>500,64259=>778,64260=>750,64261=>532,64262=>758,64275=>784,64276=>784,64277=>784,64278=>784,64279=>893,64286=>333,64287=>590,64288=>550,64289=>709,64290=>649,64291=>730,64292=>656,64293=>605,64294=>730,64295=>633,64296=>794,64297=>584,64298=>700,64299=>700,64300=>700,64301=>700,64302=>577,64303=>577,64304=>577,64305=>563,64306=>411,64307=>512,64308=>594,64309=>316,64310=>326,64312=>594,64313=>316,64314=>507,64315=>527,64316=>484,64318=>594,64320=>338,64321=>604,64323=>567,64324=>569,64326=>514,64327=>583,64328=>507,64329=>700,64330=>633,64331=>316,64332=>563,64333=>527,64334=>569,64335=>577,64336=>243,64337=>273,64338=>771,64339=>788,64340=>276,64341=>243,64342=>771,64343=>788,64344=>276,64345=>243,64346=>771,64347=>788,64348=>276,64349=>243,64350=>771,64351=>788,64352=>276,64353=>243,64354=>771,64355=>788,64356=>276,64357=>243,64358=>771,64359=>788,64360=>276,64361=>243,64362=>957,64363=>903,64364=>466,64365=>480,64366=>957,64367=>903,64368=>466,64369=>480,64370=>544,64371=>658,64372=>646,64373=>637,64374=>544,64375=>658,64376=>646,64377=>637,64378=>544,64379=>658,64380=>646,64381=>637,64382=>544,64383=>658,64384=>646,64385=>637,64386=>430,64387=>458,64388=>430,64389=>458,64390=>430,64391=>458,64392=>430,64393=>458,64394=>421,64395=>436,64396=>421,64397=>436,64398=>828,64399=>942,64400=>432,64401=>549,64402=>828,64403=>942,64404=>432,64405=>549,64406=>828,64407=>942,64408=>432,64409=>549,64410=>828,64411=>942,64412=>432,64413=>549,64414=>692,64415=>723,64416=>692,64417=>723,64418=>276,64419=>243,64420=>514,64421=>477,64422=>514,64423=>509,64424=>273,64425=>427,64426=>706,64427=>706,64428=>686,64429=>686,64430=>550,64431=>461,64432=>550,64433=>461,64467=>757,64468=>733,64469=>432,64470=>549,64471=>470,64472=>466,64473=>470,64474=>466,64475=>470,64476=>466,64477=>470,64478=>470,64479=>466,64480=>470,64481=>466,64482=>470,64483=>466,64484=>781,64485=>933,64486=>276,64487=>243,64488=>276,64489=>243,64490=>547,64491=>517,64492=>783,64493=>753,64494=>740,64495=>710,64496=>740,64497=>710,64498=>740,64499=>710,64500=>740,64501=>710,64502=>1207,64503=>1177,64504=>517,64505=>1067,64506=>1037,64507=>517,64508=>731,64509=>793,64510=>276,64511=>243,64512=>932,64513=>932,64514=>914,64515=>1067,64516=>1077,64517=>935,64518=>935,64519=>935,64520=>917,64521=>1070,64522=>1080,64523=>932,64524=>932,64525=>932,64526=>914,64527=>1067,64528=>1077,64529=>932,64530=>914,64531=>1067,64532=>1077,64533=>1305,64534=>1287,64535=>1305,64536=>1287,64537=>1305,64538=>1305,64539=>1287,64540=>1429,64541=>1429,64542=>1429,64543=>1411,64544=>1476,64545=>1458,64546=>1476,64547=>1476,64548=>1476,64549=>1458,64550=>1392,64551=>1374,64552=>1374,64553=>1245,64554=>1227,64555=>1245,64556=>1227,64557=>1125,64558=>1125,64559=>1125,64560=>1107,64561=>1260,64562=>1270,64563=>1125,64564=>1107,64565=>1260,64566=>1270,64567=>706,64568=>1091,64569=>1091,64570=>1091,64571=>1106,64572=>1073,64573=>1226,64574=>1236,64575=>932,64576=>932,64577=>932,64578=>914,64579=>1067,64580=>1077,64581=>1140,64582=>1140,64583=>1140,64584=>1122,64585=>1275,64586=>1285,64587=>932,64588=>932,64589=>932,64590=>914,64591=>1067,64592=>1077,64593=>1345,64594=>1327,64595=>1480,64596=>1490,64597=>932,64598=>932,64599=>932,64600=>914,64601=>1067,64602=>1077,64603=>430,64604=>421,64605=>731,64606=>296,64607=>300,64608=>300,64609=>300,64610=>300,64611=>300,64612=>680,64613=>680,64614=>884,64615=>967,64616=>1037,64617=>1047,64618=>680,64619=>680,64620=>884,64621=>967,64622=>1037,64623=>1047,64624=>680,64625=>680,64626=>884,64627=>967,64628=>1037,64629=>1047,64630=>680,64631=>680,64632=>884,64633=>967,64634=>1037,64635=>1047,64636=>1274,64637=>1284,64638=>1274,64639=>1284,64640=>821,64641=>1221,64642=>1188,64643=>1341,64644=>1351,64645=>884,64646=>1037,64647=>1047,64648=>806,64649=>1173,64650=>680,64651=>680,64652=>884,64653=>967,64654=>1037,64655=>1047,64656=>793,64657=>680,64658=>680,64659=>884,64660=>967,64661=>1037,64662=>1047,64663=>911,64664=>911,64665=>911,64666=>806,64667=>679,64668=>911,64669=>911,64670=>911,64671=>806,64672=>679,64673=>911,64674=>911,64675=>911,64676=>806,64677=>679,64678=>806,64679=>1284,64680=>1179,64681=>1284,64682=>1179,64683=>1284,64684=>1179,64685=>1408,64686=>1408,64687=>1408,64688=>1303,64689=>1455,64690=>1455,64691=>1350,64692=>1455,64693=>1455,64694=>1455,64695=>1350,64696=>1371,64697=>1266,64698=>1224,64699=>1119,64700=>1224,64701=>1119,64702=>1104,64703=>1104,64704=>1104,64705=>999,64706=>1104,64707=>999,64708=>1070,64709=>1070,64710=>1070,64711=>676,64712=>965,64713=>911,64714=>911,64715=>911,64716=>806,64717=>679,64718=>1119,64719=>1119,64720=>1119,64721=>1014,64722=>911,64723=>911,64724=>911,64725=>806,64726=>679,64727=>1324,64728=>1219,64729=>686,64730=>911,64731=>911,64732=>911,64733=>806,64734=>679,64735=>776,64736=>649,64737=>776,64738=>649,64739=>776,64740=>649,64741=>776,64742=>649,64743=>1303,64744=>1176,64745=>1303,64746=>1176,64747=>793,64748=>1082,64749=>776,64750=>776,64751=>649,64752=>776,64753=>649,64754=>306,64755=>302,64756=>298,64757=>1527,64758=>1537,64759=>1380,64760=>1390,64761=>1380,64762=>1390,64763=>1564,64764=>1574,64765=>1564,64766=>1574,64767=>1440,64768=>1450,64769=>1440,64770=>1450,64771=>1440,64772=>1450,64773=>1611,64774=>1621,64775=>1611,64776=>1621,64777=>1429,64778=>1429,64779=>1429,64780=>1411,64781=>1207,64782=>1207,64783=>1254,64784=>1254,64785=>1527,64786=>1537,64787=>1348,64788=>1358,64789=>1348,64790=>1358,64791=>1564,64792=>1574,64793=>1564,64794=>1574,64795=>1431,64796=>1441,64797=>1431,64798=>1441,64799=>1431,64800=>1441,64801=>1611,64802=>1621,64803=>1611,64804=>1621,64805=>1429,64806=>1429,64807=>1429,64808=>1411,64809=>1207,64810=>1207,64811=>1254,64812=>1254,64813=>1408,64814=>1408,64815=>1408,64816=>1303,64817=>1176,64818=>1176,64819=>1266,64820=>1408,64821=>1408,64822=>1408,64823=>1408,64824=>1408,64825=>1408,64826=>1266,64827=>1266,64828=>273,64829=>243,64830=>600,64831=>600,64848=>1444,64849=>1541,64850=>1549,64851=>1444,64852=>1444,64853=>1444,64854=>1444,64855=>1444,64856=>1830,64857=>1817,64858=>1975,64859=>1964,64860=>2046,64861=>2046,64862=>2202,64863=>1962,64864=>1941,64865=>1941,64866=>1944,64867=>1836,64868=>2114,64869=>2093,64870=>1991,64871=>2049,64872=>1941,64873=>2212,64874=>1962,64875=>1941,64876=>1944,64877=>1836,64878=>2249,64879=>2096,64880=>1988,64881=>1925,64882=>1904,64883=>1799,64884=>2070,64885=>1833,64886=>1729,64887=>1652,64888=>1881,64889=>1729,64890=>1892,64891=>1881,64892=>1759,64893=>1637,64894=>1670,64895=>1654,64896=>1522,64897=>1686,64898=>1675,64899=>1549,64900=>1541,64901=>1522,64902=>1444,64903=>1436,64904=>1444,64905=>1757,64906=>1652,64907=>1975,64908=>1757,64909=>1652,64910=>1757,64911=>1652,64914=>1757,64915=>1857,64916=>1752,64917=>1444,64918=>1675,64919=>1522,64920=>1444,64921=>1675,64922=>1581,64923=>1570,64924=>1417,64925=>1362,64926=>1686,64927=>1686,64928=>1675,64929=>1686,64930=>1675,64931=>1581,64932=>1570,64933=>1975,64934=>2069,64935=>1964,64936=>2202,64937=>2259,64938=>2212,64939=>2259,64940=>1686,64941=>1581,64942=>1686,64943=>1686,64944=>1581,64945=>1870,64946=>1817,64947=>1686,64948=>1637,64949=>1444,64950=>1892,64951=>1886,64952=>1549,64953=>1975,64954=>1444,64955=>1723,64956=>1522,64957=>1541,64958=>2080,64959=>2080,64960=>1975,64961=>1817,64962=>1686,64963=>1499,64964=>1757,64965=>1883,64966=>2212,64967=>1686,65008=>1523,65009=>1172,65010=>1159,65011=>1356,65012=>2111,65013=>2258,65014=>2130,65015=>1552,65016=>2046,65017=>1856,65018=>1930,65019=>1070,65056=>450,65057=>450,65058=>450,65059=>450,65072=>1000,65073=>1000,65074=>1000,65075=>1000,65076=>1000,65077=>1000,65078=>1000,65079=>1000,65080=>1000,65081=>1000,65082=>1000,65083=>1000,65084=>1000,65085=>1000,65086=>1000,65087=>1000,65088=>1000,65089=>1000,65090=>1000,65091=>1000,65092=>1000,65097=>1000,65098=>1000,65099=>1000,65100=>1000,65101=>1000,65102=>1000,65103=>1000,65104=>167,65105=>250,65106=>167,65108=>167,65109=>167,65110=>334,65111=>167,65112=>600,65113=>200,65114=>200,65115=>200,65116=>200,65117=>200,65118=>200,65119=>334,65120=>400,65121=>233,65122=>350,65123=>200,65124=>350,65125=>350,65126=>350,65128=>167,65129=>334,65130=>533,65131=>609,65136=>300,65137=>298,65138=>296,65140=>298,65142=>300,65143=>298,65144=>300,65145=>302,65146=>298,65147=>296,65148=>306,65149=>306,65150=>154,65151=>154,65152=>529,65153=>243,65154=>273,65155=>243,65156=>273,65157=>470,65158=>466,65159=>243,65160=>273,65161=>731,65162=>793,65163=>276,65164=>243,65165=>243,65166=>273,65167=>771,65168=>788,65169=>276,65170=>243,65171=>514,65172=>477,65173=>771,65174=>788,65175=>276,65176=>243,65177=>771,65178=>788,65179=>276,65180=>243,65181=>544,65182=>658,65183=>646,65184=>637,65185=>544,65186=>658,65187=>646,65188=>637,65189=>544,65190=>658,65191=>646,65192=>637,65193=>430,65194=>458,65195=>430,65196=>458,65197=>421,65198=>436,65199=>421,65200=>436,65201=>1194,65202=>1194,65203=>770,65204=>770,65205=>1194,65206=>1194,65207=>770,65208=>770,65209=>1291,65210=>1291,65211=>817,65212=>817,65213=>1291,65214=>1291,65215=>817,65216=>817,65217=>843,65218=>843,65219=>733,65220=>733,65221=>843,65222=>843,65223=>733,65224=>733,65225=>594,65226=>556,65227=>586,65228=>554,65229=>594,65230=>556,65231=>586,65232=>554,65233=>957,65234=>903,65235=>466,65236=>480,65237=>800,65238=>823,65239=>466,65240=>480,65241=>757,65242=>733,65243=>432,65244=>549,65245=>662,65246=>673,65247=>273,65248=>243,65249=>589,65250=>640,65251=>481,65252=>532,65253=>692,65254=>723,65255=>276,65256=>243,65257=>514,65258=>477,65259=>686,65260=>405,65261=>470,65262=>466,65263=>731,65264=>793,65265=>731,65266=>803,65267=>276,65268=>243,65269=>551,65270=>603,65271=>551,65272=>603,65273=>551,65274=>603,65275=>551,65276=>603,65281=>1000,65282=>1000,65283=>1000,65284=>1000,65285=>1000,65286=>1000,65287=>1000,65288=>1000,65289=>1000,65290=>1000,65291=>1000,65292=>1000,65293=>1000,65294=>1000,65295=>1000,65296=>1000,65297=>1000,65298=>1000,65299=>1000,65300=>1000,65301=>1000,65302=>1000,65303=>1000,65304=>1000,65305=>1000,65306=>1000,65307=>1000,65308=>1000,65309=>1000,65310=>1000,65311=>1000,65312=>1000,65313=>1000,65314=>1000,65315=>1000,65316=>1000,65317=>1000,65318=>1000,65319=>1000,65320=>1000,65321=>1000,65322=>1000,65323=>1000,65324=>1000,65325=>1000,65326=>1000,65327=>1000,65328=>1000,65329=>1000,65330=>1000,65331=>1000,65332=>1000,65333=>1000,65334=>1000,65335=>1000,65336=>1000,65337=>1000,65338=>1000,65339=>1000,65340=>1000,65341=>1000,65342=>1000,65343=>1000,65344=>1000,65345=>1000,65346=>1000,65347=>1000,65348=>1000,65349=>1000,65350=>1000,65351=>1000,65352=>1000,65353=>1000,65354=>1000,65355=>1000,65356=>1000,65357=>1000,65358=>1000,65359=>1000,65360=>1000,65361=>1000,65362=>1000,65363=>1000,65364=>1000,65365=>1000,65366=>1000,65367=>1000,65368=>1000,65369=>1000,65370=>1000,65371=>1000,65372=>1000,65373=>1000,65374=>1000,65377=>500,65378=>500,65379=>500,65380=>500,65381=>500,65382=>500,65383=>500,65384=>500,65385=>500,65386=>500,65387=>500,65388=>500,65389=>500,65390=>500,65391=>500,65392=>500,65393=>500,65394=>500,65395=>500,65396=>500,65397=>500,65398=>500,65399=>500,65400=>500,65401=>500,65402=>500,65403=>500,65404=>500,65405=>500,65406=>500,65407=>500,65408=>500,65409=>500,65410=>500,65411=>500,65412=>500,65413=>500,65414=>500,65415=>500,65416=>500,65417=>500,65418=>500,65419=>500,65420=>500,65421=>500,65422=>500,65423=>500,65424=>500,65425=>500,65426=>500,65427=>500,65428=>500,65429=>500,65430=>500,65431=>500,65432=>500,65433=>500,65434=>500,65435=>500,65436=>500,65437=>500,65438=>500,65439=>500,65440=>500,65441=>500,65442=>500,65443=>500,65444=>500,65445=>500,65446=>500,65447=>500,65448=>500,65449=>500,65450=>500,65451=>500,65452=>500,65453=>500,65454=>500,65455=>500,65456=>500,65457=>500,65458=>500,65459=>500,65460=>500,65461=>500,65462=>500,65463=>500,65464=>500,65465=>500,65466=>500,65467=>500,65468=>500,65469=>500,65470=>500,65474=>500,65475=>500,65476=>500,65477=>500,65478=>500,65479=>500,65482=>500,65483=>500,65484=>500,65485=>500,65486=>500,65487=>500,65490=>500,65491=>500,65492=>500,65493=>500,65494=>500,65495=>500,65498=>500,65499=>500,65500=>500,65504=>1000,65505=>1000,65506=>1000,65507=>1000,65508=>1000,65509=>1000,65510=>1000,65512=>500,65513=>500,65514=>500,65515=>500,65516=>500,65517=>500,65518=>500,65532=>1000,65533=>1000,65535=>1000);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/courier.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/courier.php
new file mode 100644
index 00000000..e935b676
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/courier.php
@@ -0,0 +1,12 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='core';
+$name='Courier';
+$up=-100;
+$ut=50;
+$dw=600;
+$diff='';
+$enc='';
+$desc=array('Flags'=>33,'FontBBox'=>'[-23 -250 715 805]','ItalicAngle'=>0,'Ascent'=>805,'Descent'=>-250,'Leading'=>0,'CapHeight'=>562,'XHeight'=>426,'StemV'=>51,'StemH'=>51,'AvgWidth'=>600,'MaxWidth'=>600,'MissingWidth'=>600);
+$cw=array(0=>600,1=>600,2=>600,3=>600,4=>600,5=>600,6=>600,7=>600,8=>600,9=>600,10=>600,11=>600,12=>600,13=>600,14=>600,15=>600,16=>600,17=>600,18=>600,19=>600,20=>600,21=>600,22=>600,23=>600,24=>600,25=>600,26=>600,27=>600,28=>600,29=>600,30=>600,31=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600,127=>600,128=>600,129=>600,130=>600,131=>600,132=>600,133=>600,134=>600,135=>600,136=>600,137=>600,138=>600,139=>600,140=>600,141=>600,142=>600,143=>600,144=>600,145=>600,146=>600,147=>600,148=>600,149=>600,150=>600,151=>600,152=>600,153=>600,154=>600,155=>600,156=>600,157=>600,158=>600,159=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600,208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/courierb.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/courierb.php
new file mode 100644
index 00000000..acb01b0d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/courierb.php
@@ -0,0 +1,12 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='core';
+$name='Courier-Bold';
+$up=-100;
+$ut=50;
+$dw=600;
+$diff='';
+$enc='';
+$desc=array('Flags'=>33,'FontBBox'=>'[-113 -250 749 801]','ItalicAngle'=>0,'Ascent'=>801,'Descent'=>-250,'Leading'=>0,'CapHeight'=>562,'XHeight'=>439,'StemV'=>106,'StemH'=>84,'AvgWidth'=>600,'MaxWidth'=>600,'MissingWidth'=>600);
+$cw=array(0=>600,1=>600,2=>600,3=>600,4=>600,5=>600,6=>600,7=>600,8=>600,9=>600,10=>600,11=>600,12=>600,13=>600,14=>600,15=>600,16=>600,17=>600,18=>600,19=>600,20=>600,21=>600,22=>600,23=>600,24=>600,25=>600,26=>600,27=>600,28=>600,29=>600,30=>600,31=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600,127=>600,128=>600,129=>600,130=>600,131=>600,132=>600,133=>600,134=>600,135=>600,136=>600,137=>600,138=>600,139=>600,140=>600,141=>600,142=>600,143=>600,144=>600,145=>600,146=>600,147=>600,148=>600,149=>600,150=>600,151=>600,152=>600,153=>600,154=>600,155=>600,156=>600,157=>600,158=>600,159=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600,208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/courierbi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/courierbi.php
new file mode 100644
index 00000000..631c623e
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/courierbi.php
@@ -0,0 +1,12 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='core';
+$name='Courier-BoldOblique';
+$up=-100;
+$ut=50;
+$dw=600;
+$diff='';
+$enc='';
+$desc=array('Flags'=>97,'FontBBox'=>'[-57 -250 869 801]','ItalicAngle'=>-12,'Ascent'=>801,'Descent'=>-250,'Leading'=>0,'CapHeight'=>562,'XHeight'=>439,'StemV'=>106,'StemH'=>84,'AvgWidth'=>600,'MaxWidth'=>600,'MissingWidth'=>600);
+$cw=array(0=>600,1=>600,2=>600,3=>600,4=>600,5=>600,6=>600,7=>600,8=>600,9=>600,10=>600,11=>600,12=>600,13=>600,14=>600,15=>600,16=>600,17=>600,18=>600,19=>600,20=>600,21=>600,22=>600,23=>600,24=>600,25=>600,26=>600,27=>600,28=>600,29=>600,30=>600,31=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600,127=>600,128=>600,129=>600,130=>600,131=>600,132=>600,133=>600,134=>600,135=>600,136=>600,137=>600,138=>600,139=>600,140=>600,141=>600,142=>600,143=>600,144=>600,145=>600,146=>600,147=>600,148=>600,149=>600,150=>600,151=>600,152=>600,153=>600,154=>600,155=>600,156=>600,157=>600,158=>600,159=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600,208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/courieri.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/courieri.php
new file mode 100644
index 00000000..5ae725d4
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/courieri.php
@@ -0,0 +1,12 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='core';
+$name='Courier-Oblique';
+$up=-100;
+$ut=50;
+$dw=600;
+$diff='';
+$enc='';
+$desc=array('Flags'=>97,'FontBBox'=>'[-27 -250 849 805]','ItalicAngle'=>-12,'Ascent'=>805,'Descent'=>-250,'Leading'=>0,'CapHeight'=>562,'XHeight'=>426,'StemV'=>51,'StemH'=>51,'AvgWidth'=>600,'MaxWidth'=>600,'MissingWidth'=>600);
+$cw=array(0=>600,1=>600,2=>600,3=>600,4=>600,5=>600,6=>600,7=>600,8=>600,9=>600,10=>600,11=>600,12=>600,13=>600,14=>600,15=>600,16=>600,17=>600,18=>600,19=>600,20=>600,21=>600,22=>600,23=>600,24=>600,25=>600,26=>600,27=>600,28=>600,29=>600,30=>600,31=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600,127=>600,128=>600,129=>600,130=>600,131=>600,132=>600,133=>600,134=>600,135=>600,136=>600,137=>600,138=>600,139=>600,140=>600,141=>600,142=>600,143=>600,144=>600,145=>600,146=>600,147=>600,148=>600,149=>600,150=>600,151=>600,152=>600,153=>600,154=>600,155=>600,156=>600,157=>600,158=>600,159=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600,208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/AUTHORS b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/AUTHORS
new file mode 100644
index 00000000..48073dad
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/AUTHORS
@@ -0,0 +1,53 @@
+abysta at yandex.ru
+Adrian Schroeter
+Aleksey Chalabyan
+Andrey Valentinovich Panov
+Ben Laenen
+Besarion Gugushvili
+Bhikkhu Pesala
+Clayborne Arevalo
+Dafydd Harries
+Danilo Segan
+Davide Viti
+David Jez
+David Lawrence Ramsey
+Denis Jacquerye
+Dwayne Bailey
+Eugeniy Meshcheryakov
+Gee Fung Sit
+Heikki Lindroos
+James Cloos
+James Crippen
+John Karp
+Keenan Pepper
+Lars Naesbye Christensen
+Lior Halphon
+MaEr
+Mashrab Kuvatov
+Max Berger
+Mederic Boquien
+Michael Everson
+MihailJP
+Misu Moldovan
+Nguyen Thai Ngoc Duy
+Nicolas Mailhot
+Norayr Chilingarian
+Ognyan Kulev
+Ondrej Koala Vacha
+Peter Cernak
+Remy Oudompheng
+Roozbeh Pournader
+Rouben Hakobian
+Sahak Petrosyan
+Sander Vesik
+Stepan Roh
+Stephen Hartke
+Steve Tinney
+Tavmjong Bah
+Thomas Henlich
+Tim May
+Valentin Stoykov
+Vasek Stodulka
+Wesley Transue
+
+$Id: AUTHORS 2461 2011-02-18 16:38:20Z ben_laenen $
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/BUGS b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/BUGS
new file mode 100644
index 00000000..49b36de5
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/BUGS
@@ -0,0 +1,3 @@
+See http://dejavu.sourceforge.net/wiki/index.php/Bugs
+
+$Id: BUGS 80 2004-11-13 13:12:02Z src $
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/LICENSE b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/LICENSE
new file mode 100644
index 00000000..254e2cc4
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/LICENSE
@@ -0,0 +1,99 @@
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
+
+Bitstream Vera Fonts Copyright
+------------------------------
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
+a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated
+documentation files (the "Font Software"), to reproduce and distribute the
+Font Software, including without limitation the rights to use, copy, merge,
+publish, distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright and trademark notices and this permission notice shall
+be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the fonts
+are renamed to names not containing either the words "Bitstream" or the word
+"Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font
+Software that has been modified and is distributed under the "Bitstream
+Vera" names.
+
+The Font Software may be sold as part of a larger software package but no
+copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
+FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the Gnome Foundation or Bitstream
+Inc., respectively. For further information, contact: fonts at gnome dot
+org. 
+
+Arev Fonts Copyright
+------------------------------
+
+Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the fonts accompanying this license ("Fonts") and
+associated documentation files (the "Font Software"), to reproduce
+and distribute the modifications to the Bitstream Vera Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software
+typefaces.
+
+The Font Software may be modified, altered, or added to, and in
+particular the designs of glyphs or characters in the Fonts may be
+modified and additional glyphs or characters may be added to the
+Fonts, only if the fonts are renamed to names not containing either
+the words "Tavmjong Bah" or the word "Arev".
+
+This License becomes null and void to the extent applicable to Fonts
+or Font Software that has been modified and is distributed under the 
+"Tavmjong Bah Arev" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by
+itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
+TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the name of Tavmjong Bah shall not
+be used in advertising or otherwise to promote the sale, use or other
+dealings in this Font Software without prior written authorization
+from Tavmjong Bah. For further information, contact: tavmjong @ free
+. fr.
+
+$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/NEWS b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/NEWS
new file mode 100644
index 00000000..87e3d5e5
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/NEWS
@@ -0,0 +1,1315 @@
+Changes from 2.32 to 2.33
+
+* added Old Italic block to Sans (by MaEr) 
+* added U+051E, U+051F to Sans (by MaEr) 
+* added U+01BA, U+0372-U+0373, U+0376-U+0377, U+03CF, U+1D00-U+1D01,
+  U+1D03-U+1D07, U+1D0A-U+1D13, U+1D15, U+1D18-U+1D1C, U+1D20-U+1D2B,
+  U+1D2F, U+1D3D, U+1D5C-U+1D61, U+1D66-U+1D6B, U+1DB8, U+1E9C-U+1E9D,
+  U+1EFA-U+1EFB, U+2C60-U+2C61, U+2C63, U+A726-U+A73C, U+A73E-U+A73F,
+  U+A746-U+A747, U+A74A-U+A74B, U+A74E+U+A74F, U+A768-U+A769, U+A77B-U+A77C,
+  U+A780-U+A787, U+A790-U+A791, U+A7FA-U+A7FF to Serif (by Gee Fung Sit 薛至峰) 
+* added alternate forms to U+014A and U+01B7 in Serif (by Gee Fung Sit 薛至峰) 
+* typographical improvements to U+0166-U+0167, U+0197, U+01B5-U+01B6, U+01BB,
+  U+0222-U+0223, U+023D, U+0250-U+0252, U+026E, U+0274, U+028F, U+029F,
+  U+02A3-U+02A5, U+02AB, U+03FE-U+03FF, U+1D02, U+1D14, U+1D1D-U+1D1F, U+1D3B,
+  U+1D43-U+1D46, U+1D59, U+1D9B, U+2C71, U+2C73 in Serif (by Gee Fung Sit 薛至峰) 
+* fixed bugs #31762 and #34700 plus other small fixes (wrong direction,
+  duplicate points, etc.) for Sans and Serif (by Gee Fung Sit 薛至峰) 
+* added U+204B to Mono (by Gee Fung Sit 薛至峰) 
+* added U+26E2 to Sans (by Gee Fung Sit 薛至峰) 
+* added Playing Cards block (U+1F0A0-U+1F0DF) to Sans (by Gee Fung Sit 薛至峰) 
+* emoticons in Sans: replace U+2639-U+263B with better versions, add
+  U+1F601-U+1F610, U+1F612-U+1F614, U+1F616, U+1F618, U+1F61A, U+1F61C-U+1F61E,
+  U+1F620-U+1F624, U+1F625, U+1F628-U+1F62B, U+1F62D, U+1F630-U+1F633,
+  U+1F635-U+1F640 (by Ben Laenen and Denis Jacquerye) 
+* added U+A78E, U+A790-U+A791 to Sans and Mono (by Denis Jacquerye) 
+* added U+A7FA to Sans (by Denis Jacquerye) 
+* subscripts: added U+2095-U+209C to Sans, Serif and Mono, adjusted
+  U+1D49-U+1D4A in Sans and Mono (by Denis Jacquerye) 
+* added U+0243 to Mono (by Denis Jacquerye) 
+* adjusted U+0307 to match dot of i, replaced dotaccent U+02D9 with U+0307 in
+most dependencies in Sans (by Denis Jacquerye) 
+* adjusted anchors of f and added them to long s in Sans (by Denis Jacquerye) 
+* added anchors to precomposed dependencies of D and d (by Denis Jacquerye) 
+* added debug glyphs U+F002 and U+F003 which will show current point size (by
+  Ben Laenen) 
+* use correct version for Serbian italic be (by Eugeniy Meshcheryakov) 
+* added pictograms U+1F42D-U+1F42E, U+1F431, U+1F435 (by Denis Jacquerye) 
+* improved Hebrew in Sans (by Lior Halphon) 
+* improved Armenian in Sans, and added Armenian in Serif and Mono (by Rouben
+  Hakobian (Tarumian), Aleksey Chalabyan and Norayr Chilingarian) 
+* remove "locl" feature for Romanian for S/T/s/t with cedilla/comma accent (by
+  Ben Laenen) 
+* replace wrong "dflt" script tag in Mono with "DFLT" (by Ben Laenen)
+
+Changes from 2.31 to 2.32
+
+* added to Sans: Latin small letter p with stroke (U+1D7D), Latin capital
+  letter p with stroke through descender (U+A750), Latin small letter p with
+  stroke through descender (U+A751), Latin capital letter thorn with stroke
+  (U+A764), Latin small letter thorn with stroke (U+A765), Latin capital letter
+  thorn with stroke through descender (U+A766), Latin small letter thorn with
+  stroke through descender (U+A767), Latin capital letter q with stroke through
+  descender (U+A756), Latin small letter q with stroke through descender
+  (U+A757), Latin capital letter p with flourish (U+A752), Latin small letter p
+  with flourish (U+A753) (by Ben Laenen)
+* add new Indian rupee symbol (U+20B9) to Sans, Serif and Mono (although
+  standardization in Unicode not complete yet, UTC did assign this code point)
+  (by Ben Laenen)
+* Sans: adjusted U+0E3F, U+20AB, U+20AD-U+20AE, U+20B1, U+20B5, U+20B8 to have
+  them take up the same width as digits (by Gee Fung Sit 薛至峰)
+* added U+23E8 to Sans (by Thomas Henlich)
+* fixed numerous bugs (#22579, #28189, #28977, N'Ko in Windows, fixed U+FB4F,
+  anchors for U+0332-U+0333, made extensions in Misc. Technical connect, and
+  other small fixes) (by Gee Fung Sit 薛至峰)
+* added looptail g as stylistic variant to Serif (by Gee Fung Sit 薛至峰)
+* added the remaining precomposed characters in Latin Extended Additional in
+  Serif (by Gee Fung Sit 薛至峰)
+* added Georgian Mkhedruli (U+10D0-U+10FC) to Sans ExtraLight (by Besarion
+  Gugushvili)
+* fix spacing in hinting of U+042E (Ю) in Mono (by Ben Laenen)
+* replaced U+2650 and minor changes to U+2640-U+2642, U+2699, U+26A2-U+26A5,
+  U+26B2-U+26B5, U+26B8 in Sans (by Gee Fung Sit 薛至峰)
+* added U+1E9C-U+1E9D, U+1EFA-U+1EFB, U+2028-U+2029, U+20B8, U+2150-U+2152,
+  U+2189, U+26C0-U+26C3, U+A722-U+A725, U+1F030-U+1F093 to Sans (by Gee Fung
+  Sit 薛至峰)
+* added U+1E9C-U+1E9E, U+1EFA-U+1EFB, U+2028-U+2029, U+20B8, U+2181-U+2182,
+  U+2185 U+A722-U+A725, to Sans ExtraLight (by Gee Fung Sit 薛至峰)
+* added U+20B8, U+22A2-U+22A5, U+A722-U+A725 to Mono (by Gee Fung Sit 薛至峰)
+* added U+02CD, U+01BF, U+01F7, U+0222-U+0223, U+0243-U+0244, U+0246-U+024F,
+  U+2150-U+2152, U+2189, U+239B-U+23AD and U+A73D to Serif (by Gee Fung Sit
+  薛至峰)
+
+Changes from 2.30 to 2.31
+
+* fixed bug where Serif Condensed Italic wouldn't get proper subfamily tags (by
+  Ben Laenen)
+* added math operators U+2234-U+2237 to Mono (by Ben Laenen)
+* removed buggy instructions of U+032D (by Eugeniy Meshcheryakov)
+* added U+2C70, U+2C7E, U+2C7F to Sans and Sans Mono (by Denis Jacquerye)
+* added U+2C7D to Sans Mono (by Denis Jacquerye)
+* added U+2C6D, U+2C70-2C73, U+2C7E-2C7F to Serif (by Denis Jacquerye)
+* added extremas to alpha U+03B1 in Serif-Italic (by Denis Jacquerye)
+* added U+4A4, U+4A5 to Mono (by Andrey V. Panov)
+* added Arabic letters U+0657, U+0670, U+0688-U+0690, U+0693-U+0694,
+  U+0696-U+0697, U+0699-U+06A0, U+06A2-U+06A3, U+06A5, U+06A7-U+06A8,
+  U+06AA-U+06AE, U+06B0-U+06B4, U+06B6-U+06B9, U+06BB-U+06BE and their
+  contextual forms to Sans (by MihailJP)
+* added U+A78D LATIN CAPITAL LETTER TURNED H for coming Unicode 6.0 (by Denis
+  Jacquerye) 
+
+Changes from 2.29 to 2.30
+
+* added U+0462-U+0463 to Mono (by Denis Jacquerye) 
+* corrected U+1E53 in Serif (by Gee Fung Sit) 
+* added U+1E4C-U+1E4D to Mono and Serif (by Gee Fung Sit) 
+* added U+1E78-U+1E79 to Mono (by Gee Fung Sit) 
+* fixed missing diacritics in Latin Extended Additional in Sans ExtraLight
+  (moved stacked diacritics out of PUA in the process) (by Gee Fung Sit) 
+* fixed anchors on U+1E78 in Serif (by Gee Fung Sit) 
+* added U+1DC4-U+1DC9 to Serif (by Denis Jacquerye) 
+* renamed above-mark to above-mark in Serif-Italic (by Denis Jacquerye) 
+* added U+1DC4-U+1DC9 to context class for dotless substitution (by Denis
+  Jacquerye) 
+* changed Doubleacute to Doublegrave in Sans ExtraLight (by Gee Fung Sit) 
+* removed redundant reference in U+01FB in Sans Oblique (by Gee Fung Sit) 
+* added U+A726-U+A727 to Mono (Denis Jacquerye) 
+* changed U+04BE and U+04BF according to recommedations of Sasha Ankwab in Sans
+  (by Andrey V. Panov) 
+* remove "Symbol Charset" from set of codepages in Sans (by Eugeniy
+  Meshcheryakov)
+
+Changes from 2.28 to 2.29
+
+* modified U+10FB in Sans to be a mirror image of U+2056, since U+10FB is not
+  Georgian-specific (by Roozbeh Pournader)
+* added U+2B1F, U+2B24, U+2B53, U+2B54 in Sans (by Roozbeh Pournader)
+* fixed TUR opentype language tag to TRK in Serif (bug 19825) (by Ben Laenen)
+* early implementation of Abkhaz letter U+0524-U+0525 in Sans
+  (by Michael Everson and abysta)
+* flipped U+1D538 in Sans (by Gee Fung Sit)
+* added U+26B3-U+26B8, U+1D7D8-U+1D7E1 in Sans (by Gee Fung Sit)
+* corrected U+1D7A9 in Sans Bold Oblique (by Gee Fung Sit)
+* Fixed U+0649 to be dual-joining in Sans Mono (by Roozbeh Pournader)
+* Remove unnecessary 'isol' feature from Sans Mono (by Roozbeh Pournader)
+* Remove 'cmap' mappings for U+066E, U+066F, U+067C, U+067D, U+0681, U+0682,
+  U+0685, U+0692, U+06A1, U+06B5, U+06BA, U+06C6, U+06CE, and U+06D5
+  in Sans Mono (bug 20323) (by Roozbeh Pournader)
+* add half brackets (U+2E22 - U+2E25, by Steve Tinney) 
+
+Changes from 2.27 to 2.28
+
+* added U+A789, U+A78A in Sans and Sans Mono (by Denis Jacquerye)
+* modified U+02D6, U+02D7, U+02EE in Sans and Sans Mono (by Denis Jacquerye)
+* added U+1E9E (German capital ß) to Sans and Serif (by Denis Jacquerye)
+* adjusted width of U+01B7-U+01B9 in Serif Italic (by Denis Jacquerye)
+* modified U+021C, U+021D in Sans (by Denis Jacquerye)
+* added U+021C, U+021D in Mono (by Denis Jacquerye)
+* added U+F428 (Georgian Nuskhuri "f") in private use area (by Besarion
+  Gugushvili)
+* updated Georgian mkhedruli (U+10D0-U+10FA) with new version (by Besarion
+  Gugushvili)
+* updated Georgian asomtavruli (U+10A0-U+10C5) with new version (by Besarion
+  Gugushvili)
+* added Georgian nuskhuri (U+2D00-U+2D25) (by Besarion Gugushvili)
+* added Georgian mtavruli in private use area (U+F400-U+F426) (by Besarion
+  Gugushvili)
+* added mark anchors above to Cyrillic U+0430-U+0438, U+043A-U+044F,
+  U+0454-U+0455 in Mono (by Ben Laenen)
+* modified/moved up U+0318-U+0319, U+031C-U+031F, U+0329-U+032A, U+032C-U+032D,
+  U+0339-U+033B, U+0348 and U+0353 in Sans to prevent cut-off (by Gee Fung Sit)
+* added U+035A to Sans (by Gee Fung Sit)
+* updated fontconfig files (by Nicolas Mailhot)
+* added U+2032-2037 to Mono (by Denis Jacquerye)
+* added Ogham to Sans ExtraLight (by Gee Fung Sit)
+* added U+2C6F, U+2C79, U+2C7C-2C7D to Mono (by Gee Fung Sit)
+* added U+210F to Serif and Sans ExtraLight (by Gee Fung Sit)
+* changed U+210F to a more common glyph in Sans and Mono (by Gee Fung Sit)
+
+Changes from 2.26 to 2.27
+
+* added some of Michael Everson's new Cyrillic glyphs to Sans (by Wesley
+  Transue)
+* removed blank glyph at U+05EF from Sans Bold Oblique (by Gee Fung Sit)
+* small adjustments to existing tone bars in Sans and Mono (by Gee Fung Sit)
+* added U+0372-U+0373, U+0376-U+0377, U+03CF, U+A668-U+A66E, U+A708-U+A711,
+  U+A71B-U+A71F to Sans (by Gee Fung Sit)
+* copied U+02E5-U+02E9 over from Sans to fix inconsistencies in Serif (by Gee
+  Fung Sit)
+* added U+021C-U+021D, U+0370-U+0371, U+037B-U+037D, U+0470-U+0471,
+  U+0510-U+0515, U+051A-U+051D, U+1E9F, U+2C64, U+2C6E-U+2C6F, U+2C79,
+  U+2C7C-U+2C7D, U+A644-U+A647, U+A650-U+A651, U+A654-U+A657, U+A708-U+A716,
+  U+A71B-U+A71F to Serif (by Gee Fung Sit)
+* added U+A708-U+A716, U+A71B-U+A71F to Mono (by Gee Fung Sit)
+* added anchors to U+017F (ſ) and fixed U+1E9B (ẛ) in Serif (by Gee Fung Sit)
+* made U+0325 smaller in Sans Bold and Serif to match Sans Book (by Gee Fung
+  Sit)
+* fixes to U+02F3 (moved up), U+228F-U+2294 (more square-like) and
+  U+22CE-U+22CF (stroke width) in Sans (by Gee Fung Sit)
+* replaced U+2202 ∂ (Sans and Mono) and U+221D ∝, U+221E ∞ (Sans) with glyphs
+  from Arev (with small changes) (by Gee Fung Sit)
+* added U+22B0-U+22B1, U+22C7, U+22D0-U+22D5 from Arev to Sans to complete the
+  block (by Gee Fung Sit)
+* added U+0514-U+0515 to Sans ExtraLight (by Gee Fung Sit)
+* skewed U+A78C in all Oblique/Italic fonts (by Gee Fung Sit)
+* moved U+2215 to U+2044 in Sans and Serif and replaced U+2215 with reference
+  to U+002F in all fonts (by Gee Fung Sit)
+* added U+2C6E to Mono (by Denis Jacquerye)
+* added U+A782 and U+A783 in Sans (by Wesley Transue)
+* added U+0244, U+024C-024D, U+2C64 in Sans Mono (by Denis Jacquerye)
+* modified U+01AE in Sans Mono (by Denis Jacquerye)
+* added U+2C7A to all fonts (by Gee Fung Sit)
+* italicized/small changes to U+2C76 in Serif (Bold) Italic (by Gee Fung Sit)
+* improved outlines of U+2C68, U+2C6A, U+2C6C in Serif (Bold) Italic (by Gee
+  Fung Sit)
+* rounded U+2C77 at the bottom in Serif (by Gee Fung Sit)
+* added joining behavior for tone letters (U+02E5-U+02E9) in Sans (bug #15669)
+  (by Gee Fung Sit)
+* fixed outline of y.alt in Sans Regular (by Denis Jacquerye) 
+* changed references of U+1D5A8, U+1D5C5, U+1D5DC, U+1D5F9, U+1D610, U+1D62D,
+  U+1D644 and U+1D661 to stylistic alternates to have a better distinction (by
+  Gee Fung Sit)
+* hinted I.alt in Sans Regular (by Gee Fung Sit)
+* added U+0487, completing Cyrillic block (by Gee Fung Sit)
+* extended the bar of U+0463 to the right and moved the anchor (by Gee Fung
+  Sit)
+* added anchors to glyphs in Cyrillic block (by Gee Fung Sit)
+* added (preliminary) hints to tone letter forms (U+02E5.5, U+02E9.1, stem) in
+  Sans Book (by Gee Fung Sit)
+
+Changes from 2.25 to 2.26
+
+- added glyphs for Cyrillic-B to Sans (by Wesley Transue) 
+- added U+0370-U+0371 to Sans (by Wesley Transue) 
+- added U+019C, U+01A2-U+01A3, U+01A6, U+01E4-U+01E5, U+024C-U+024D, U+0285,
+  U+0290, U+02A0, U+0370-U+0371, U+03F1, U+03FC to Sans ExtraLight (by Wesley
+  Transue) 
+- added U+20A0-U+20A5, U+20A7-U+20B3, U+2105, U+210D, U+210F, U+2115, U+2117,
+  U+2119-U+211A, U+211D, U+2124, U+212E, U+2200-U+2204 to Mono (by Heikki
+  Lindroos) 
+- added U+01BA and U+01BF to Mono (by Heikki Lindroos) 
+- merged OpenType "aalt" feature in Latin in Sans (by Denis Jacquerye) 
+- added alternative shape for y in Sans (by Denis Jacquerye) 
+- added saltillo (U+A78B-U+A78C) to all faces (by James Cloos) 
+- changed U+047C-U+047D to references instead of outlines in Sans (by Wesley
+  Transue) 
+- added Latin letter tresillo U+A72A-U+A72B to Sans (by Wesley Transue) 
+- added U+A734-U+A737 to Sans (by Wesley Transue) 
+- added U+2053 to Serif and fixed it bug:9425 in Sans (by Gee Fung Sit) 
+- removed problematic hints for U+0423 bug:10025 (by Gee Fung Sit) 
+- added U+27C5-U+27C6 bug:10255 to all faces (by Gee Fung Sit) 
+- fixed width of U+2016 in Sans Oblique (by Gee Fung Sit) 
+- added U+2016, U+2032-U+2038, U+2042, U+2045-U+2046, U+204B-U+204F,
+  U+2051-U+2052, U+2057 to Serif (by Gee Fung Sit) 
+- made U+2140 bigger to match other n-ary operators (by Gee Fung Sit) 
+- added U+0606-U+0607, U+0609-U+060A to Sans (by Gee Fung Sit) 
+- added U+221B-U+221C to Mono (by Gee Fung Sit) 
+- small adjustments to U+221B-U+221C in Sans and Serif (by Gee Fung Sit) 
+- update U+04B4-U+04B5 in Serif (by Andrey V. Panov) 
+- increased max-storage value from maxp table to 153 (by Andrey V. Panov) 
+- added U+0472-U+0473, U+0510-U+0511, U+051A-U+051D, U+0606-U+0607,
+  U+0609-U+060A, U+1E26-U+1E27, U+1E54-U+1E55, U+1E7C-U+1E7D, U+1E8C-U+1E8D,
+  U+1E90-U+1E91, U+1E97-U+1E99, U+1E9F, U+1EAC-U+1EAD, U+1EB6-U+1EB7,
+  U+1EC6-U+1EC7, U+1ED8-U+1EDD, U+1EE0-U+1EE3, U+1EE8-U+1EEB, U+1EEE-U+1EF1 to
+  Mono (by Gee Fung Sit) 
+- added locl rules for S/T cedilla for Romanian and Moldavian so they get
+  rendered as S/T with comma accent (see Redhat bug #455981) (by Ben Laenen) 
+- removed ligature rule from Armenian U+0587 bug:16113 (by Gee Fung Sit)
+
+Changes from 2.24 to 2.25
+
+- moved/added U+2E18 (by Gee Fung Sit)
+- added empty glyph for U+2064 in Sans and Serif (by Gee Fung Sit)
+- added U+22CE-U+22CF to Sans (by Gee Fung Sit)
+- Sans Oblique and Bold Oblique, Serif: reverted digits hinting instructions back to before revision 1590, which fixed mistaken debian bug #471024. This fixes Debian bug #411308. The original bug was in freetype not in the fonts (by Denis Jacquerye)
+- added U+A726-U+A729, U+A730-U+A733, U+A738-U+A73F, U+A746-U+A74B, U+A74E-U+A74F, U+A780-U+A781, U+A7FB-U+A7FF to Sans (by Gee Fung Sit)
+- added Macedonian italic glyph shape for U+0453 in Serif (by Ben Laenen)
+- changed descenders in U+0446, U+0449, U+0497, U+04A3, U+04AD (by Andrey V. Panov)
+- updated main SFD files to SplineFontDB 3.0 (Denis Jacquerye and Gee Fung Sit)
+- moved U+0561 2 up since it wasn't aligned with the baseline well (by Ben Laenen)
+- added U+2E2E to Sans (by Gee Fung Sit)
+- replaced U+2699 with simpler version in Sans (by Gee Fung Sit)
+- added a lot of hinting instructions to Latin Extended B, Greek and Coptic glyphs Sans Book (by Wesley Transue)
+- differentiated U+2219 from U+22C5 and adjusted affected references in Sans and Mono (by Gee Fung Sit)
+- made Hebrew narrower in Sans Bold and Sans Bold Oblique (by Denis Jacquerye)
+- added Kurdish and Chuvash letters from Unicode 5.1 Cyrillic Extended block (by Wesley Transue)
+- added U+1E9F, U+A644-U+A647, U+A64C-U+A64D, U+A650-U+A651, U+A654-U+A655, U+A712U+A716 to Sans (by Gee Fung Sit)
+- added several glyphs to Sans ExtraLight (by Gee Fung Sit)
+- added hinting instructions to U+046A-U+046B, U+0508-U+0509, U+050B, U+0512-U+0513 in Sans Book (by Wesley Transue)
+- corrected width of U+027E in Sans Book (by Gee Fung Sit)
+- added U+2C79, U+2C7B-U+2C7D to Sans (by Gee Fung Sit)
+- added a bunch of glyphs+small corrections to Sans Light (by Gee Fung Sit)
+- added U+0496, U+0497, U+04B0, U+04B1 (by Andrey V. Panov)
+- updated U+0493, U+049B, U+04B3, U+04B7, U+04F7 (by Andrey V. Panov)
+- further improvements in extended Cyrillic (by Andrey V. Panov) 
+
+Changes from 2.23 to 2.24
+
+- instructions for U+05C0 ׀, U+05C3 ׃, U+05F3 ׳, and U+05F4 ״ in DejaVu 
+   Sans. (by Wesley Transue)
+- instructions for U+2116 in Sans (by Andrey V. Panov)
+- Unicode 5.1 update: moved U+F208 to U+2C6D, U+F25F to U+2C71, added 
+  U+2C6E-U+2C6F, U+2C72-U+2C73, updated outline of U+2C71 in Sans. (by 
+  Denis Jacquerye)
+- updated and instructed U+0401 in Sans (by Andrey V. Panov)
+- fixed the bug in Sans faces where U+02EC ˬ faced the wrong direction. 
+  Also, added a few more glyph instructions. (by Wesley Transue)
+- removed OS2Sub and OS2Strike that weren't intentional in Sans 
+  ExtraLight. (by Denis Jacquerye)
+- updated instructions for U+401, U+44F in Serif Book. (by Andrey V. 
+  Panov)
+- instructions for U+02C4 ˄, U+02C5 ˅, U+03D8 Ϙ, U+03D9 ϙ, U+0494 Ҕ, and 
+  U+0495 ҕ in Sans Book. (by Wesley Transue)
+- instructions for U+01A6 Ʀ, U+0238 ȸ, U+0239 ȹ, U+02EC ˬ, and U+05C6 ׆ 
+  in Sans Book. (by Wesley Transue)
+- DejaVuSans.sfd DejaVuSerif.sfd: updated instructions for U+447 and 
+  U+451 using code generated with xgridfit (by Andrey V. Panov)
+- instructions for a few glyphs in the Latin Extended-B Block, Greek 
+  Block, Cyrillic Block, and N'Ko block. (by Wesley Transue)
+- updated sfdnormalize.pl, and SFD files to new SFD format with empty 
+  lines. (by Denis Jacquerye) 
+
+Changes from 2.22 to 2.23
+
+- fixed bug which made Condensed fonts appear instead of normal width ones
+- added U+20DB, U+20DC, and U+20E1 to Sans (by Roozbeh Pournader)
+- added hinting instructions to U+01A7, U+01AA-U+01AC, U+01AE-U+01AF,
+  U+01BC-U+01BD, U+01BF, U+01F7, U+0277, U+027F, U+0285-U+0286, U+0297, U+02AF,
+  U+02B4-U+02B5, U+02BD, U+030D, U+0311, U+0329, U+04A0-U+04A1 in Sans Book (by
+  Wesley Transue)
+- modified hinting instructions of U+04A2 in Sans Book (by Wesley Transue)
+- added hinting instructions to U+237D, U+2423 in Mono Book and Mono Bold (by
+  Wesley Transue)
+- added mathematical alphanumeric symbols to all styles (by Max Berger)
+- added Unicode 5.1 U+2E18 as U+2E18.u51 (not yet usable) to Sans (by Roozbeh
+  Pournader) 
+- dereferenced all glyphs with mixed references and outlines (by Denis
+  Jacquerye)
+- removed non-zero width from U+0344 in Sans (by Denis Jacquerye)
+
+Changes from 2.21 to 2.22
+
+- directory structure has changed, we now use the Makefile
+- modified Armenian U+0565 in Sans (by Սահակ Պետրոսյան)
+- added double struck letters and numbers U+2102, U+210D, U+2115,
+  U+2119-U+211A, U+211D, U+2124, U+213C-U+2140, U+2145-U+2149, U+1D538-U+1D539,
+  U+1D53B-U+1D53E, U+1D540-U+1D544, U+1D546, U+1D54A-U+1D550, U+1D552-U+1D56B,
+  U+1D7D8-U+1D7E1 to Serif (by Stephen Hartke)
+- added letterlike symbols U+2103, U+2109, U+2127, U+214B, U+2141-U+2144 to
+  Serif (by Ben Laenen)
+- fixed outline direction of U+2143 in Sans Bold/Bold Oblique (by Ben Laenen)
+- added arrow set in Serif: arrows: U+2194-U+21FF; dingbats: U+27A1;
+  supplemental arrows A: U+27F0-U+27FF; supplemental arrows B: U+2900-U+2975,
+  U+297A; miscellaneous symbols and arrows: U+2B00-U+2B11 (by Ben Laenen)
+- added U+0180, U+01DE, U+01E0-01E1, U+022A, U+022C, U+0230, U+1E08-U+1E09,
+  U+1E10-U+1E11, U+1EB0-U+1EB1 to Mono (by Denis Jacquerye)
+- adjusted U+01D5, U+01D7, U+01D9, U+1DB in Mono (by Denis Jacquerye)
+- added Ogham in Sans (by Wesley Transue)
+- added Yijing Hexagram Symbols in Sans (by Wesley Transue)
+- hinting instructions added to Cyrillic U+0460, U+04A6-U+04A7, U+04AC-U+04AD,
+  U+04C7-U+04C8, U+04F6-U+04F7, U+04FA-U+04FB, U+050C-U+050D in Sans Book (by
+  Wesley Transue)
+- adjusted Cyrillic letters U+042A, U+044A, U+044C, U+0459-U+045B, U+0462,
+  U+048C-U+048D in Serif (by Andrey V. Panov)
+- hinting instructions added to Lao U+0EB7 in Sans (by Wesley Transue)
+- added Roman numerals and Claudian letter U+2160-U+2184 in Serif (by Ben
+  Laenen)
+- added U+FFF9-U+FFFD to Sans, Serif and Mono (by Lars Næsbye Christensen)
+- added mathematical symbols to Serif: U+2200, U+2203-U+2204, U+2213-U+2214,
+  U+2217-U+2218, U+2223-U+2226, U+2250-U+2255, U+2295-U+22AF, U+22C5 (by Ben
+  Laenen)
+- modified bullet symbol U+2219 in Serif (by Ben Laenen)
+
+Changes from 2.20 to 2.21
+
+- added U+FE20-U+FE23 (half diacritics) to Sans (by Denis Jacquerye)
+- added anchor "half" to position right half of double marks, U+FE21 or U+FE23
+  to Sans (by Denis Jacquerye)
+- shifted U+0360 up to avoid collision with some outlines in Sans (by Denis
+  Jacquerye)
+- added anchor above-mark anchor to U+035D, U+035E, U+0360, U+0361 in Sans (by
+  Denis Jacquerye)
+- added instructions for ff, ffi, ffl ligatures in Serif Bold (by Eugeniy
+  Meshcheryakov)
+- added instructions to some N'Ko glyphs (by Wesley Transue)
+- added instructions to some Lao glyphs (by Wesley Transue)
+- cleaning up 'liga' Standard Ligature in Latin, in Sans and Sans Mono (by
+  Denis Jacquerye)
+- added U+046A, U+046B (big yus) in Serif (by Andrey V. Panov)
+- added box drawing symbols to Sans and Serif (by Lars Næsbye Christensen)
+- added Makefile to improve font and packages generating (by Nicolas Mailhot)
+
+Changes from 2.19 to 2.20
+
+- removed TeX and TeXData tags from all sfd files (by Eugeniy  Meshcheryakov)
+- removed all 'frac' lookups (by Eugeniy  Meshcheryakov)
+- fixed duplicate glyph names (by Eugeniy  Meshcheryakov)
+- removed standard ligatures with U+00B7 in Mono (by Eugeniy  Meshcheryakov)
+- use reference to U+002D in U+00AD in Sans Oblique, and adjust instructions
+  (by Eugeniy  Meshcheryakov)
+- updated Cyrillic in Sans Extra Light (by Andrey V. Panov)
+- added instructions to N'Ko U+07C1-U+07C6, U+07CA, U+07CE-U+07CF, U+07D1,
+  U+07D3-U+07D4, U+07D8, U+07DB and U+07EB in Sans (by Wesley Transue)
+- added instructions to Lao U+0E8A, U+0E95, U+0E97, U+EA5, U+0EB4 and U+0EB5
+  (by Wesley Transue)
+- adjusted instructions for Hebrew glyphs (by Denis Jacquerye)
+- added instructions for U+0265 in Sans Bold (by Denis Jacquerye)
+- fix U+1D68 in Sans: it had the shape of delta, where it should be a rho (by
+  Ben Laenen)
+- remove U+1D5C glyph in Sans Oblique (it was empty) (by Ben Laenen)
+- fix instructions of U+01AD in Sans Bold  (by Ben Laenen)
+- fix instructions of U+042D in Serif (by Ben Laenen)
+- remove buggy instructions of U+2328 in Serif (by Ben Laenen)
+- corrected width of U+2C75-U+2C76 in Sans Bold and Serif Bold (by Gee Fung Sit)
+- added U+2C75-U+2C77 to Mono (by Gee Fung Sit)
+
+Changes from 2.18 to 2.19
+
+- fixed misplaced symbols (U+2325,2326) in Sans Oblique (by John Karp) 
+- added Mark to Base anchors: 'cedilla' for combining cedilla and
+  'above-legacy' for stacking above precomposed glyphs (just a,e,i,o,u with
+  macron for now) in Sans (by Denis Jacquerye).
+- added contextual substitution for Case and Dotless forms in all Sans variants
+  (by Denis Jacquerye).
+- renamed 'ccmp' lookups for RTL and Basic (LGC, etc.) (by Denis Jacquerye)
+- added anchor 'cedilla' for vowels in Sans. (by Denis Jacquerye)
+- extended contextual dotless and case substitutions to handle both below and
+  above diacritics (by Denis Jacquerye)
+- renamed Dotless and Case Form GSUB lookups in Sans with meaningful names (by
+  Denis Jacquerye)
+
+Changes from 2.17 to 2.18
+
+- Re-encoded the source files for Full Unicode (by Ben Laenen)
+- Re-enabled the "ff", "fl", "fi", "ffl", "ffi" ligatures by default in Serif
+  (by Ben Laenen)
+- Disabled the "fi", "ffi" ligatures for languages with dotless i in Serif (by
+  Ben Laenen)
+- added Tifinagh to Sans Book and Bold, U+2D30-U+2D65, U+2D6F, partially hinted
+  in Sans Book. (by Denis Jacquerye)
+- added Tai Xuan Jing Symbols (U+1D300-1D356) to Sans (by Remy Oudompheng)
+- added double-struck letters (U+1D538-U+1D56B minus reserved code points) to
+  Sans (by Gee Fung Sit)
+- added U+22EE-U+22F1 to Sans (by Gee Fung Sit)
+- added U+2C67-U+2C6C, U+2C75-U+2C77 to Serif (by Gee Fung Sit)
+- italicized various glyphs in Latin Extended-B, IPA Extensions, Spacing
+  Modifier Letters, Phonetic Extension (Supplement) and Super- and Subscripts
+  in Serif Oblique fonts (by Gee Fung Sit)
+- modified outlines, bearings of Hebrew U+05D6, U+05D8, U+05DB, U+05DE, U+05E0,
+  U+05E1, U+05E2, U+05EA in Sans Book and Oblique, adjusted hinting in Book
+  based on Yotam Benshalom's comments. (by Denis Jacquerye)
+- added Braille Patterns (U+2800-U+28FF) to Serif fonts (by Gee Fung Sit)
+- added N'Ko to Sans Book and Bold: U+07C0-U+07E7, U+07EB-U+07F5, U+07F8-U+07FA
+  (by Eugeniy  Meshcheryakov)
+- added U+0ED8 (Lao digit 8) to Sans (by Remy Oudompheng)
+- added Lao diacritics U+0EB0-0EB9, U+0EBB-0EBC, U+0EC8-0ECD to Mono (by Remy
+  Oudompheng)
+- renamed Serif [Bold] Oblique, make it Italic (by Eugeniy  Meshcheryakov)
+- added U+29FA-U+29FB to Sans and Sans Mono (by Gee Fung Sit)
+- swapped glyphs for Eng U+014A from Sami Eng to African Eng, the latter being
+  more common (by Denis Jacquerye)
+- swapped ae U+00E6 and ae.alt in Serif Italics fonts, thus fixing #8213 (by
+  Denis Jacquerye)
+- minor improvements to Misc. Symbols in Sans (by Gee Fung Sit)
+- minor improvements and additions to Sans ExtraLight (by Gee Fung Sit)
+- improved instructions for various Cyrillic letters (by Eugeniy  Meshcheryakov)
+- fixed hinting of theta and chi in Sans Book (by Ben Laenen)
+- added Georgian Mkhedruli to Sans, Serif and Mono, ASumtavruli to Sans and
+  Serif (by Besarion Gugushvili)
+
+Changes from 2.16 to 2.17
+
+- Sans fonts: fix position for certain combinations of Arabic fatha, kasra,
+  shadda, damma, kasratan, dammatan, fathatan and hamza (by Ben Laenen)
+- added 'ae.alt' to Serif Oblique fonts, with design matching shape of italic
+  'a' instead of slanted 'a', see bug #8213 (by Denis Jacquerye)
+- added super- and subscripts to Serif and Mono: U+1D2C-U+1D2E, U+1D30-U+1D3C,
+  U+1D3E-U+1D42, U+1D62-U+1D65, U+1D78, U+2071, U+207A-U+207E, U+208A-U+208E,
+  U+2090-U+2094 (by Gee Fung Sit)
+
+Changes from 2.15 to 2.16
+
+- fixed hinting instructions for digits in DejaVu Sans Oblique, Bold Oblique,
+  and Serif Book to not change glyph width (by Eugeniy  Meshcheryakov)
+- added instructions for U+0404, U+0411, U+0413, U+0414, U+0417-U+041B, U+041F,
+  U+0423, U+0424, U+0426-U+0429, U+042C, U+042E, U+042F, U+0490 in Serif Bold
+  (by Eugeniy  Meshcheryakov)
+- added U+0220 and Eng.alt to Serif fonts (by Denis Jacquerye)
+- added U+232C, U+2394, U+23E3 to Sans fonts (by John Karp)
+- added U+230C-U+230F, U+231C-U+231F to Sans fonts, fixing bug:9547
+  (by John Karp)
+- adjusted dot below, dot above, dieresis above, dieresis below in Sans fonts
+  (by Denis Jacquerye)
+- added U+2300, U+2301, U+2303, U+2304, U+2305, U+2307, U+2326, U+2327, U+232B,
+  arrow.base to Sans fonts (by John Karp)
+- adjusted dot and dieresis below and above in Serif fonts (by Denis Jacquerye)
+- added U+1E1C-U+1E1D to Serif fonts (by Denis Jacquerye)
+- added U+22BE, U+22BF (by Wesley Transue)
+- added U+2324; modified U+2325: more standard proportions, and matches U+2324 
+  and U+2387; added U+2387 : flipped U+2325 with standard arrowhead 
+  (by John Karp)
+- added Lao digits U+0ED0-0ED7, U+0ED9 (by Remy Oudompheng)
+- added to Mono in Arabic block : U+060C, U+0615, U+061B, U+061F, 
+  U+0621-U+063A, U+0640-0655, U+065A, U+0660-066F, U+0674, U+0679-0687, U+0691, 
+  U+0692, U+0698, U+06A1, U+06A4, U+06A9, U+06AF, U+06B5, U+06BA, U+06BE, 
+  U+06C6, U+06CC, U+06CE, U+06D5, U+06F0-06F9 (by Remy Oudompheng)
+- added to Mono in Arabic Presentations Forms-A : U+FB52-FB81, U+FB8A-FB95, 
+  U+FB9E, U+FB9F, U+FBAA-FBAD, U+FBE8, U+FBE9, U+FBFC-FBFF (by Remy Oudompheng)
+- added to Mono in Arabic Presentations Forms-B : U+FE70-FE74, U+FE76-FEFC, 
+  U+FEFF (by Remy Oudompheng)
+- added U+05BA, U+05BE, U+05F3, U+05F4, U+FB1E, U+FB21-U+FB28, U+FB4F to Sans 
+  (by Eugeniy  Meshcheryakov)
+- added U+2102 to Mono (by Eugeniy  Meshcheryakov)
+- added U+2983-U+2984 to Sans (by Gee Fung Sit)
+- added U+2A2F to Sans, Serif and Mono (by Gee Fung Sit)
+- added U+2373-2375, U+237A to Sans (by John Karp)
+- converted kern pairs to kern classes with Tavmjong Bah's scripts 
+  (by Denis Jacquerye)
+- set ScriptLang of kerning classes to just latn because of Pango bug
+  (by Denis Jacquerye)
+- added DNK to ScriptLang latn otherwise it is excluded, and SRB and MDK to
+  cyrl (by Denis Jacquerye)
+- removed flag 0x80 in generate.pe, otherwise it generates kerning tables some
+  systems don't like; thus loosing Apple tables (by Denis Jacquerye)
+- removed ligature for precomposed legacy characters of Sans Oblique fonts
+  (by Denis Jacquerye)
+- added bearings to en dash U+2013, em dash U+2014 and figure dash U+2012
+  by making dashes shorter, preserving character width (by Denis Jacquerye)
+- reduced U+031C, U+0325 (ring below), U+0339 to be entirely visible; 
+  added instructions in Sans Book; changed U+1e00-U+1e01 to use new ring below
+  (by Denis Jacquerye)
+- adjusted circumflex below on U+1E12-U+1E13, U+1E18-U+1E19, U+1E3C-U+1E3D,
+  U+1E4A-U+1E4B, U+1E70-U+1E71, U+1E76-U+1E77 in Sans fonts (by Denis Jacquerye)
+- Added U+0ED4, U+0ED5 to DejaVu Sans (by Remy Oudompheng)
+- Lao-specific anchors (by Remy Oudompheng)
+- added alternate I to match the small capital in Sans (by Gee Fung Sit)
+
+Changes from 2.14 to 2.15
+
+- improved hinting in Sans Oblique to deal with some spacing and inconsistency
+  issues (by Ben Laenen)
+- added anchors to Mono Book, and added GPOS rules for combining diacritics to
+  show up as zero width glyphs (by Ben Laenen)
+- removed U+F21C (PUA), it was copy of U+2C64 from Latin Extended C (by Eugeniy
+  Meshcheryakov)
+- added U+27E6-U+27E7 to Sans (by Gee Fung Sit)
+- added U+1407, U+1409, U+140C-U+141B, U+141D-U+1425, U+1427-U+142E,
+  U+1435-U+1438, U+143A-U+1449, U+1452, U+1454, U+1457-U+1465, U+1467-U+146A,
+  U+1471, U+1474-U+1482, U+1484-U+1488, U+148F, U+1492, U+14A0, U+14A2, U+14A9,
+  U+14AC-U+14BA, U+14BC, U+14BD, U+14C6, U+14C9-U+14CF, U+14D1, U+14D2, U+14D9,
+  U+14DC-U+14E9, U+14EC, U+14F3, U+14F6-U+1504, U+1506, U+1507, U+1510-U+1525,
+  U+152C, U+152F-U+153D, U+1540, U+1541, U+154E, U+154F, U+1552, U+155B, U+155C,
+  U+1568, U+1569, U+1574-U+157B, U+157D, U+15A7-U+15AE, U+1646, U+1647 (by
+  Eugeniy Meshcheryakov)
+- fixed several contours to not intersect, use horizontal or vertical tangents,
+  use integer coordinates, etc in Sans Book (by Denis Jacquerye)
+- added U+0496-U+0497 in Serif (by Andrey V. Panov)
+
+Changes from 2.13 to 2.14
+
+- added Philippine peso glyph U+20B1 (by Clayborne Arevalo)
+- made U+2012 have the same width as digits, according to Unicode 5.0, 
+  page 206 (by Roozbeh Pournader)
+- made all of the "above" combining characters remove the dot of "i", 
+  "j", etc (Soft_Dotted characters), according to Unicode 5.0, 
+  page 228 (by Roozbeh Pournader)
+- made U+012F, U+03F3, U+0456, U+0458, U+1E2D, and U+1ECB (all fonts 
+  except Mono), U+0249, U+2148, and U+2149 (Sans and Sans Condensed), 
+  U+0268 (Sans ExtraLight, Serif and Serif Condensed), and U+029D (Serif 
+  and Serif Condensed) respect the Soft_Dotted property (by Roozbeh 
+  Pournader)
+- added U+223E, U+223F, U+2240, U+22C2, U+22C3 to Sans (by Remy Oudompheng)
+- added U+203D to Serif (by Gee Fung Sit)
+- added zero-width glyphs for U+2061-U+2063 to Sans and Serif (by Gee 
+  Fung Sit)
+- changed isolated forms of Arabic waw (U+0648, U+0624 and U+06C6) (bug #9432) 
+  (by Ben Laenen)
+- added Lao consonants U+0E81, U+0E82, U+0E84, U+0E87, U+0E88, U+0E8A, 
+  U+0E8D, U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA, 
+  U+0EAB, U+0EAD-0EAF to Sans Mono (by Remy Oudompheng)
+- added U+0200-U+0217, U+0226-U+0229, U+02F3, U+1E00-U+1E07, 
+  U+1E0A-U+1E0B, U+1E18-U+1E1F, U+1E22-U+1E23, U+1E28-U+1E2D, 
+  U+1E3A-U+1E3B, U+1E40, U+1E48-U+1E49, U+1E56, U+1E58-U+1E59, 
+  U+1E5E-U+1E5F, U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F, U+1E72-U+1E77, 
+  U+1E86-U+1E8B, U+1E92-U+1E96, U+1EA0-U+1EA1, U+1EF4-U+1EF5 to Mono 
+  (by Ben Laenen)
+- renamed uppercase variants of diacritics (macron, breve, double grave, 
+  double acute, inverted breve, dot above) to "uni03XX.case" in Mono 
+  (by Ben Laenen)
+- moved uppercase variants of diacritics up in Mono so they properly 
+  vertically align on capitals (by Ben Laenen)
+- precomposed glyphs with macron, breve, double grave, double acute, 
+  inverted breve, dot above, macron below, breve below, inverted breve 
+  below, dot below, cedilla, caron below, circumflex below, diaeresis 
+  below, tilde below now reference to combining diacritics instead of 
+  space modifiers in Mono (by Ben Laenen)
+- made ring below (U+0325), and half rings below (U+031C and U+0339) 
+  smaller in Mono (by Ben Laenen)
+- added U+205F to all fonts (by Roozbeh Pournader)
+- added U+035E-U+035F to Sans (by Roozbeh Pournader)
+- added empty glyphs for U+034F, U+202A-U+202E, U+2060, U+206A-206F, 
+  U+FE00-U+FE0F to non-Mono fonts (by Roozbeh Pournader)
+- added U+2101, U+2107-U+2108, U+210B, U+210C, U+2110, U+2112, U+211B, 
+  U+211F, U+2123, U+2125, U+2128-U+2129, U+212C-U+212D, U+212F, 
+  U+2130-U+2131, U+2133, U+2136-U+213A, U+2141-U+2144, U+2B00-U+2B11, 
+  U+2B20-U+2B23 to Sans (by John Karp)
+- reshaped omega (U+03C9) in Mono (by Ben Laenen)
+- added U+2205, U+22C6, U+2300-U+2301, U+2303-U+2306, U+230C-U+230F, 
+  U+2312-U+2315, U+231C-U+231F, U+2335, U+2337-U+233E, U+2341-U+2344, 
+  U+2347-U+2348, U+234B-U+234D, U+2349-U+2350, U+2352-U+2354, 
+  U+2357-U+2359, U+235A-U+235C, U+235E-U+2360, U+2363-U+2365, 
+  U+2368-U+2369, U+236B-U+2370, U+2373-U+237A, U+2380-U+2383, 
+  U+2388-U+238B, U+2395 in Mono (by Ben Laenen)
+
+Changes from 2.12 to 2.13
+
+- adjusted U+0198B, U+01B3-U+01B4 in Sans, hinted U+01B4 in Sans Book 
+  (by Denis Jacquerye)
+- added U+27F0-U+27FF, U+2906-U+2907, U+290A-U+290B, U+2940-U+2941 to Sans 
+  (by Denis Jacquerye)
+- added U+01E6-U+01E9, U+01EE-U+01EF, U+01F4-U+01F5, U+01FC-U+01FF, 
+  U+021E-U+021F, U+0245, U+02BD, U+02C9, U+1E9B, U+2045-U+2046, U+2213, U+22C5,
+  U+22EF to Sans Mono (by Roozbeh Pournader)
+- added U+04FA-U+04FD to Sans (by Michael Everson)
+- removed U+2329 and U+232A because of their CJK properties, added U+27E8 
+  and U+27E9 in their stead, fixing part of bug #9038 (by Roozbeh Pournader)
+- corrected and improvised U+0466-U+0469, U+046E-U+0471, U+047C-U+047D, U+0482, 
+  U+0484-U+0486, U+0492-U+0493, U+04B0-U+04B1, U+050C-U+050D, and U+204A 
+  in Sans (by Michael Everson)
+- added instructions for U+0402, U+0409, U+040A, U+040B, U+044D, U+040F, 
+  U+0452, U+0459-U+045B, U+045F to Sans Book (by Eugeniy Meshcheryakov)
+- made italic shape for U+431, U+432, U+437, U+43B, U+43C, U+43D, U+444, U+447, 
+  U+44D, U+44F, U+459, U+45A in SerifOblique and SerifBoldOblique 
+  (by Andrey V. Panov)
+- modified U+024C to match glyph in Unicode chart, fixing bug #9039 
+  (by Denis Jacquerye)
+- made some canonically equivalent characters share the same glyph: 
+  U+02B9 = U+0374, U+0343 = U+0313, and U+0387 = U+00B7 also adjusting U+02BA 
+  to look like double U+02B9, fixing parts of bug #9038 (by Roozbeh Pournader)
+- changed shapes for U+0478 and U+0479 in Sans to those in the Unicode charts, 
+  based on a recent decision by Unicode Technical Committee to only use 
+  the digraph form (by Michael Everson)
+- adjusted width of NBSP U+00A0 and NNBSP U+202F, fixing bug #8401 
+  (by Denis Jacquerye)
+- fixed several contours to not intersect, use horizontal or vertical tangents, 
+  use integer coordinates, etc (by Roozbeh Pournader and Denis Jacquerye)
+- added U+1402, U+1430, U+144D, U+146C, U+148A, U+14A4, U+14C1, U+14D4, U+14EE, 
+  U+1527, U+1545, U+157E, U+158E, U+15AF to Sans (by Eugeniy Meshcheryakov)
+- enlarged width of U+459 and U+45A in Serif (by Andrey V. Panov)
+- made traditional shape for U+452, U+45B (by Andrey V. Panov)
+- added euro sign U+20AC to Sans ExtraLight, making fontconfig recognize 
+  the font as supporting English (by Denis Jacquerye)
+
+Changes from 2.11 to 2.12
+
+- added U+0180 to Serif (by Denis Jacquerye)
+- improved and/or hinted Armenian letters U+0542, U+0546, U+0562,
+  U+0563, U+0564, U+0577, U+0582 in Sans (by Ben Laenen)
+- added U+4FE-U+4FF, U+512-U+513, U+2114, U+214E, U+26B2 to Sans
+  (by Gee Fung Sit)
+- adjusted U+0496-U+0497, U+049A-U+04A1 in Sans to match U+0416,
+  U+041A, U+0436 and U+043A (by Gee Fung Sit)
+- Mathematical Operators in Sans: changed U+22C0-U+22C1 to match
+  other n-ary operators, adjusted U+2203-U+2204, changed U+2220 in
+  Sans to match the style of U+2221 (by Gee Fung Sit)
+- added U+1401, U+1403-U+1406, U+140A, U+140B, U+1426, U+142F,
+  U+1431-U+1434, U+1438, U+1439, U+1449, U+144A, U+144C,
+  U+144E-U+1451, U+1455, U+1456, U+1466, U+146B, U+146D-U+1470,
+  U+1472, U+1473, U+1483, U+1489, U+148B-U+148E, U+1490, U+1491,
+  U+14A1, U+14A3, U+14A5-U+14A8, U+14AA, U+14AB, U+14BB, U+14C0,
+  U+14C2-U+14C5, U+14C7, U+14C8, U+14D0, U+14D3, U+14D5-U+14D8,
+  U+14DA, U+14DB, U+14EA, U+14ED, U+14EF-U+14F2, U+14F4, U+14F5,
+  U+1405, U+1526, U+1528-U+152B, U+152D, U+152E, U+153E,
+  U+1542-U+1544, U+1546-U+154D, U+1550, U+1553, U+1555-U+155A,
+  U+1567, U+156A, U+157C, U+157F-U+1585, U+158A-U+158D,
+  U+158F-U+1596, U+15A0-U+15A6, U+15DE, U+15E1, U+166E-U+1676 to
+  Sans (by Eugeniy Meshcheryakov)
+- re-enabled Latin ligatures fi, ffi, fl, ffl and ff in Sans
+  (by Ben Laenen)
+- made italic shape for U+436, U+44A, U+44B, U+44C, U+44E, U+45F,
+  U+463 in SerifOblique and SerifBoldOblique (by Andrey V. Panov)
+- fixed sub- and superscript metrics in Condensed Sans (bug #8848)
+  (by Ben Laenen)
+- added U+474, U+475 in Serif (by Andrey V. Panov)
+- hinted Greek glyphs U+03B7, U+30B8, U+03B9, U+03C1, U+03C3,
+  U+03C6 in Mono Book (by Ben Laenen)
+
+Changes from 2.10 to 2.11
+
+- added instructions for Hebrew glyphs (Sans Book, by Eugeniy
+  Meshcheryakov)
+- changed U+01A6 (Latin Yr) after bug #8212, in Sans, Serif and
+  Sans Mono fonts (by Denis Jacquerye).
+- removed instruction for U+2600-U+26A1 (by Mederic Boquien)
+- added U+202F and set width of U+00A0 (nobreakingspace) to the
+  same as U+0020, space (by Denis Jacquerye).
+- added and improved instructions for various Cyrillic letters
+  (by Eugeniy Meshcheryakov)
+- Changed U+416, U+42F, U+427 (non-Bold), U+436, U+447 (non-Bold),
+  U+44F, U+437 (Bold), corrected U+40F, U+414, U+424, U+426, U+429,
+  U+434, U+438 (Bold), U+446, U+449, U+44D (non-Bold), U+45F in
+  Sans Mono (by Andrey V. Panov)
+- made small corrections to Cyrillic, most appreciable to U+409,
+  U+413, U+41B, U+427 and U+433, U+434, U+43B, U+447, U+459
+  (upright fonts) to Serif (by Andrey V. Panov)
+- adjusted bearings of U+410, U+416, U+41A, U+42F, U+436, U+43A,
+  U+443, U+44F in Serif (by Andrey V. Panov)
+- enlarged width of U+44A, U+44B, U+44C, U+463 in Serif
+  (by Andrey V. Panov)
+- added ligature "iacute" as "afii10103" (U+456) "acutecomb" in
+  Serif (by Andrey V. Panov)
+- made italic shape to U+446, U+448, U+449 in Serif (by Andrey V.
+  Panov)
+- added "afii10831" (U+F6C7), "afii10832" (U+F6C8) in Serif (by
+  Andrey V. Panov)
+- new minimum version of fontforge is 20061014 (by Ben Laenen)
+
+Changes from 2.9 to 2.10:
+
+- added U+0242, U+024A-U+024B, U+024E-U+024F, U+037C-U+037D, U+0E3F, 
+  U+1D2C-U+1D2E, U+1D30-U+1D42, U+1D5D-U+1D6A, U+1D78, U+1DB8, 
+  U+2090-U+2094, U+20D0-U+20D1, U+2C60-U+2C66, U+2C6B-U+2C6C, U+2C74 and 
+  U+FB29 to Sans (by Gee Fung Sit)
+- added Lao glyphs : U+0E81-0E82, U+E084, U+0E87-0E88, U+0E8A, U+0E8D, 
+  U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA-0EAB, 
+  U+0EAD-0EB9, U+0EBB-0EBD, U+0EC0-0EC4, U+0EC6, U+0EC8-0ECD, U+0EDC-0EDD 
+  (by Remy Oudompheng)
+- fixed U+0193 not showing in Windows (bug #7897) (by Ben Laenen)
+- changes to U+222B-222D in Sans Mono (by Remy Oudompheng)
+- ported the three remaining currency symbols from Arev (U+20B0, 
+  U+20B2-U+20B3), and replaced one (U+20AF) in Sans (by Lars Naesbye 
+  Christensen)
+- corrected U+20A5 in Sans (by Gee Fung Sit)
+- merged Double-Struck Letters from Arev: U+2102, U+210D, U+2115, 
+  U+2119-U+211A, U+2124, U+213C-U+2140 (by Gee Fung Sit)
+- added U+2308-U+230B and U+2329-U+232A to Sans Mono and Serif faces, 
+  fixed incorrect direction of U+2329 in Sans faces, and improved 
+  U+2308-U+230B in Sans faces per Ben Laenen's suggestions (by David 
+  Lawrence Ramsey)
+- added U+06D5 and final form of it (needed for Kurdish) (by Ben Laenen)
+- added two special glyphs U+F000 and U+F001 in Sans Book that show the 
+  current ppem size (horizontal and vertical) (by Ben Laenen)
+- added U+2318 and U+2325 to Sans Mono faces, based on the Sans versions 
+  (by David Lawrence Ramsey)
+- added U+2B14-U+2B1A to all faces except Sans ExtraLight (by David 
+  Lawrence Ramsey)
+- respaced all Geometric Shapes characters in Serif faces to match those 
+  in Sans faces again, respaced U+23CF in Sans, Sans ExtraLight, and 
+  Serif faces to match U+25A0 (or Sans in Sans ExtraLight's case) again, 
+  and respaced U+2B12-U+2B13 in Sans and Serif faces to match U+25A1 
+  again (by David Lawrence Ramsey)
+- corrected width of Modifier Small Letters U+1D43-1D5B in Sans Oblique 
+  and U+1D9B-U+1DBF in Sans Oblique and Sans Bold Oblique (by Gee Fung Sit)
+- added a bunch of glyphs to Sans ExtraLight (see SVN for details) (by 
+  Gee Fung Sit)
+- adjusted Cyrillic descenders in Sans ExtraLight to sync with Sans (by 
+  Gee Fung Sit)
+- added U+0242, U+0245 to Serif (by Gee Fung Sit)
+- replaced the SHPIX routines which gave them bad spacing at certain 
+  sizes in FreeType for A, V, Z, v and z in Sans Bold (by Ben Laenen) 
+
+Changes from 2.8 to 2.9:
+
+- DejaVuSansExtraLight.sfd: changed family name from "DejaVu Sans" to
+  "DejaVu Sans Light" (in case we add a Light weight variant), so legacy
+  apps that understand only 4 styles are happy. (by Denis Jacquerye)
+- added Name ID 16, aka preferred family name, and Name ID 17, aka
+  preferred style name, so contemporary apps that understand more that 4
+  styles can use big fonts families "DejaVu Sans" and "DejaVu Serif". For
+  those, Extralight and Condensed are just styles not different families.
+  (by Denis Jacquerye)
+- added U+22B6-22BD, U+22C0-22C1, U+22D6-22D7 to Sans. (by Remy Oudompheng)
+- added U+037B, U+2184, U+2C67-U+2C6A and U+2C75-U+2C77 to Sans (by Gee
+  Fung Sit)
+- adjusted asteriskmath (U+2217) for consistency with other mathematical
+  operators in Sans (by Ben Laenen)
+- hinted some Armenian capitals in Sans Book (by Ben Laenen)
+- added U+0246 - U+0249 (by Ben Laenen)
+- BUGFIX : swapped U+224E and U+224F, in Sans, Sans Condensed and Sans Mono
+  (by Remy Oudompheng)
+- adjusted U+20B5 (by Mederic Boquien)
+- swapped U+21DA and U+21DB which were in wrong order (by Heikki Lindroos)
+- added U+222E-2233, U+239B-23AD, U+2A00-2A02, U+2A0F-2A1C to Sans (by Remy
+  Oudompheng)
+- added U+239B-23AD to Mono (by Remy Oudompheng)
+- added U+2024-2025 to Serif (by Mederic Boquien)
+- added U+222C-222D, U+2A0C-2A0E to Serif (by Remy Oudompheng)
+- added U+2190-21FF to Mono (by Heikki Lindroos)
+- added Hebrew glyphs - U+05B0-U+05BD, U+05BF-U+05C3, U+05C6, U+05C7,
+  U+05D0-U+05EA, U+05F0-U+05F2, U+FB1F, U+FB20, U+FB2A-U+FB36,
+  U+FB38-U+FB3C, U+FB3E, U+FB40, U+FB41, U+FB43, U+FB44, U+FB46-U+FB4E (by
+  Gee Fung Sit and Eugeniy Meshcheryakov)
+- adjustments for Cyrillic in Sans (by Andrey V. Panov)
+- made italic shape for U+0434, U+0456, U+0457 in SerifOblique and Serif
+  Bold Oblique (by Andrey V. Panov)
+
+Changes from 2.7 to 2.8:
+
+- fixed instructions for U+0423, U+0427, U+0447, U+0448 in Serif, so they
+  look good at large sizes too (by Eugeniy Meshcheryakov)
+- added U+FB00 and U+FB03 to U+FB06 to Serif typefaces (by Heikki Lindroos)
+- added U+26B0-U+26B1, U+2701-U+2704, U+2706-U+2709, U+270C-U+2727, U+2729
+  to U+274B, U+274D, U+274F to U+2752, U+2756, U+2758-U+275E, U+2761 to
+  U+2775 (by Heikki Lindroos)
+- added and improved instructions for Cyrillic letters in Mono and Serif
+  (Book, by Eugeniy Meshcheryakov)
+- rotated U+26B0 (was too small in mono) (by Gee Fung Sit)
+- adjusted U+1EDA-U+1EDD, U+1EE8-U+1EEB, capitals using capital specific
+  accent and moved diacritics to match position on U+00F2 (ograve), etc.
+  (by Denis Jacquerye)
+- added U+20D6, U+20D7 to Sans (by Gee Fung Sit)
+- made Armenian ligatures discretionary since the Firefox ligature problem
+  still isn't fixed (by Ben Laenen)
+- moved Armenian hyphen U+058A to a higher position (bug #7436) (by Ben
+  Laenen)
+- hinted Greek glyphs in Sans Bold (by Ben Laenen)
+- enabled Arabic lam-alif ligatures when diacritics are used (by Ben Laenen)
+
+Changes from 2.6 to 2.7:
+
+- added glyphs needed for Kurdish: U+0695, U+06B5, U+06C6, U+06CE and their
+  init/medi/fina forms in Sans (by Ben Laenen)
+- added U+02CD, U+01F8 - U+01F9, U+1E3E - U+1E3F, U+1E30 - U+1E35, U+1EBC -
+  U+1EBD, U+1EF8 - U+1EF9 (includes glyphs needed for Yoruba, Maori, Guarani
+  and Twi) (by Ben Laenen)
+- added U+22C8-22CC, U+29CE-29D5, U+2A7D-2AA0, U+2AAE-2ABA, U+2AF9-2AFA to
+  Sans (by Remy Oudompheng)
+- adjusted diacritics on Vietnamese, Pinyin and other characters:
+  U+01A0-U+01A1, U+01AF-U+01B0, U+01D5-U+01DC, U+01DE-01E1, U+01FA-U+01FB
+  U+022A-U+022D, U+0230-U+0231, U+1E14-U+1E17, U+1E4C-U+1E53, U+1E78-U+1E7B,
+  U+1EA4-U+1EF1 in Sans (Book, Bold and Oblique) (by Denis Jacquerye)
+- added basic arrows U+2190-U+2193 in Serif, which completes MES-1 compliance
+  for Serif (by Ben Laenen)
+- added U+01E4, U+01E5, U+01FA, U+01FB, U+02BD, U+02C9 and U+02EE to Serif
+  (by Ben Laenen)
+- fixed U+0209 in Serif Bold Oblique (by Ben Laenen)
+- adjusted Box Drawing block characters U+2500-257F in Mono to fit character
+  cell, shifting them up by 416 (Denis Jacquerye)
+- redid U+0194 in Sans (by Ben Laenen)
+- added U+2217-2218, U+2295-22A1 to Mono (by Remy Oudompheng)
+- added U+0462 to Serif (by Andrey V. Panov)
+- added U+226C, U+228C-228E, U+2293-2294, U+22F2-22FF to Sans (by Remy
+  Oudompheng)
+- adjusted U+2208-220D in Sans (by Remy Oudompheng)
+- improved some Cyrillic glyphs in Mono (by Andrey V. Panov), rewritten
+  instructions for changed glyphs (by Eugeniy Meshcheryakov)
+- added U+1E0E-1E0F, U+1E8E-1E8F to Mono fonts (by Denis Jacquerye). (bug
+  #7166)
+- renamed 'Dotabove' to 'Dotaccent' in Mono Sans Oblique to match other fonts
+  (by Denis Jacquerye).
+- added U+200B-U+200F in Sans faces and Serif faces, U+200B and U+200C were
+  in Sans already (by Lars Naesbye Christensen)
+- added U+2601-U+262F, U+263D, U+263E, U+2648-U+265F, U+2668, U+2670-U+268B,
+  U+2690-U+269C, U+26A0, U+26A1, U+2794, U+2798-U+27AF, U+27B1-U+27BE to Mono
+  (by Heikki Lindroos)
+- replaced the references with unshifted ones for both κ U+03BA and к U+043A
+  in Mono Book (by Denis Jacquerye)
+- fixing glyph for U+04ED in Mono Book, consisted only of dieresis (by Andrey
+  V. Panov).
+
+Changes from 2.5 to 2.6:
+
+- redid U+2032 - U+2037, U+2057 based on Arev in Sans (by Gee Fung Sit)
+- added U+0195, corrected U+039E, U+204B in Sans ExtraLight (by Gee Fung Sit)
+- added instructions for some Cyrillic letters in Sans Bold (by Eugeniy
+  Meshcheryakov)
+- added vulgar fractions U+2153-U+215F for Serif, made with references (by
+  Lars Naesbye Christensen)
+- added U+228F-2292, U+2299-22AF, U+22B2-22B5, U+22CD, U+22D8-22ED to Sans
+  (by Remy Oudompheng)
+- added U+2208-220D, U+2238-223D, U+2278-2281, U+228A-228B, U+228F-2292,
+  U+22CD, U+22DA-22E9 to Mono (by Remy Oudompheng)
+- fixed misplaced dot in U+2250 in Mono (by Remy Oudompheng)
+- added instructions for some Cyrillic letters in Mono Book and Bold(by
+  Eugeniy Meshcheryakov)
+- minor changes to U+2241, U+2261-2263, U+22A4, U+22A5 in Sans (by Remy
+  Oudompheng)
+- added hinting instructions to lowercase Armenian glyphs in Sans Book (by
+  Ben Laenen)
+- changed U+2208, U+220B to match U+2209 and U+220C in Sans Bold (by Remy
+  Oudompheng)
+- added Braille patterns U+2800-U+28FF to Sans (by Mederic Boquien)
+- added instructions for some Cyrillic letters in Serif Book (by Eugeniy
+  Meshcheryakov)
+- renamed BoldOblique fonts to Bold Oblique in TTF Name as originally in
+  Bitstream Vera fonts (by Denis Jacquerye)
+- added hinting instructions to some Latin-B Extended and IPA characters in
+  Sans Book (by Denis Jacquerye and Ben Laenen)
+- adjusted bearings, replaced diacritics, hinted hook and horn for
+  Vietnamese in Sans Book (by Denis Jacquerye)
+- made FAX, TM, TEL, etc. discritionary ligatures in Sans and Serif fonts
+  (by Denis Jacquerye)
+- removed ligatures of precomposed characters in Sans and Serif fonts (by
+  Denis Jacquerye)
+- added U+F208, U+F20A, U+F215-F217, U+F21A-F21B, U+F25F in PUA (from SIL's
+  PUA, probably in Unicode 5.0): U+0243, U+0244, U+0245, U+024C, U+024D,
+  U+2C64, (U+2C6D), (U+2C71)
+- modified some glyphs in Serif Oblique to make them more italic (by Denis
+  Jacquerye)
+
+Changes from 2.4 to 2.5:
+
+- fixed excessive kerning bug that occurs with Pango (by Denis Jacquerye)
+- added U+20AF to Sans and Serif (by Lars Naesbye Christensen)
+- regenerated Condensed faces (by Ben Laenen)
+- added U+035C-U+035D to Sans, fixed U+0361 (by Denis Jacquerye)
+- integrated 255 characters from Arev fonts: Latin Extended-B, Spacing
+  Modifiers, Combining Diacritical Marks, Cyrillic, Cyrillic supplement,
+  General Punctuation, Letterlike Symbols, Arrows, Mathematical Operators,
+  Miscellaneous Technical, Dingbats, Alphabetic Presentation Forms (by Denis
+  Jacquerye)
+- added basic Cyrillic and basic Greek to Sans ExtraLight (by Denis Jacquerye)
+- added U+0498, U+049A, U+04AA, U+04AB, U+04AF to Serif (by Eugeniy
+  Meshcheryakov)
+- added U+0494, U+0495, U+0498, U+0499, U+04AA, U+04AB, U+04C3, U+04C4,
+  U+04C7, U+04C8 to Mono (by Eugeniy Meshcheryakov)
+- adjusted weight of U+0256, U+0257, U+0260, U+0272, U+0273, U+0277, U+029B,
+  U+02A0 and modifed  U+028B and U+027A in Mono (by Denis Jacquerye)
+- added U+2000-200A to Mono (by Denis Jacquerye)
+- added vulgar fractions U+2153 - U+215F to Mono (by Gee Fung Sit)
+- adapted metrics of Arabic glyphs so they stay above cut-off height in Sans
+  (by Ben Laenen)
+- fixed mkmk anchors for Arabic diacritics so they stack properly in Sans (by
+  Ben Laenen)
+- fixed weight of lowercase upsilon in Sans Bold, make small adjustment to
+  lowercase omega in Sans (by Ben Laenen)
+- added U+210E (by Mederic Boquien)
+- unslanted U+2201, U+221B and U+221C in Sans Oblique (by Mederic Boquien)
+- added several mathematical relation symbols to Sans and Mono (U+2241-224C,
+  U+2250-2255, U+2260-2269, U+226E-2277, U+2282-2287) modified U+223C to match
+  other tildes, and U+2282-2284 to have the same shape. (by Remy Oudompheng)
+- made U+2234-U+2237 refer to U+2219 instead of U+00B7 in Sans (by Mederic
+  Boquien)
+- added U+2238-223B, U+226A-226B, U+2278-2281, U+2288-228B to Sans (by Remy
+  Oudompheng)
+- unslanted and changed reference of U+22C5 from U+00B7 to U+2219 in Sans (by
+  Mederic Boquien)
+- added U+224D-225F, U+226D, U+22C6 to Sans and unslanted U+2219 in Sans
+  Oblique. (by Remy Oudompheng)
+- added U+224D-225F, U+226D to Mono, shifted U+2266-2269 higher upwards and
+  unslanted U+2219 in Oblique. (by Remy Oudompheng)
+- merged Coptic glyphs from Arev 0.2 (by Lars Naesbye Christensen)
+- fixed and adjusted various Cyrillic glyphs in Serif (by Andrey V. Panov)
+- made fi, fl... ligatures discretionary ligatures (by Ben Laenen)
+
+Changes from 2.3 to 2.4:
+
+- added U+04A2, U+04A3, U+04AC - U+04AF, U+04BA, U+04BB, U+04C0 -
+  U+04C2, U+04CB, U+04CD, U+04D8 - U+04DF, U+04E2 - U+04E5, U+04E8 - U+04F5,
+  U+04F6 - U+04F9 to Mono (by Eugeniy Meshcheryakov)
+- added U+048C, U+048D, U+0494, U+0495, U+049E - U+04A7, U+04AC -
+  U+04AE, U+04B4- U+04B7, U+04BA, U+04BB, U+04C0 - U+04C4, U+04C7, U+04C8,
+  U+04CB, U+04CC, U+04D8 - U+04DF, U+04E2 - U+04E5, U+04EC - U+04F9 to Serif
+  (by Eugeniy Meshcheryakov)
+- added U+2134 to Sans (by Gee Fung Sit)
+- added U+2080 - U+2089 to all faces (by Gee Fung Sit)
+- several minor corrections to Sans (by Gee Fung Sit)
+- major corrections to Sans Condensed (by Gee Fung Sit)
+- corrected Superscripts and Subscripts in Sans (by Gee Fung Sit)
+- corrected anchors of U+0316-U+0319 (by Denis Jacquerye)
+- Verajja integrated (by Stepan Roh)
+- copied U+2328, U+2600, U+2639-U+263C, U+263F-U+2647, U+2660-U+2667,
+  and U+2669-U+266F from Sans to Serif, and copied scaled-down versions of
+  them to Sans Mono (by David Lawrence Ramsey)
+- added U+20B4 to all faces (by Eugeniy Meshcheryakov)
+- added more minor positional adjustments to U+2638 in all faces to
+  match the other miscellaneous symbols in Verajja, and rescale it in Sans
+  Mono so that it looks better (by David Lawrence Ramsey)
+- added U+2242, U+2243 and U+22A4 (by Mederic Boquien)
+- corrected U+2245 in Sans (by Mederic Boquien)
+- added U+0221, U+0234-0236 (by Denis Jacquerye)
+- added in Arabic block to Sans: U+060C, U+0615, U+061B, U+061F, U+0621
+- U+063A, U+0640 - U+0655, U+0660 - U+066F, U+0679 - U+0687, U+0698, U+06A1,
+  U+06A9, U+06AF, U+06BA, U+06BF, U+06CC, U+06F0 - U+06F9 (by Ben Laenen)
+- added in Arabic Presentation Forms A to Sans: U+FB52 - U+FB81, U+FB8A
+- U+FB95, U+FB9E - U+FB9F, U+FBE8 - U+FBE9, U+FBFC - U+FBFF (by Ben Laenen)
+- added complete Arabic Presentation Forms B to Sans: U+FE70 - U+FE74,
+  U+FE76 - U+FEFC, U+FEFF (by Ben Laenen)
+- added complete Greek Extended block to Mono (by Ben Laenen)
+- modified Greek capitals with tonos in Mono (by Ben Laenen)
+- added U+01C4-01CC, U+01D5, U+01DE, U+01E0-U+01E1, U+01E6-U+01E9,
+  U+01EE-U+01F5, U+01F8-U+0217, U+021E-U+021F, U+0226-U+022A, U+022C to Serif
+  (by Denis Jacquerye)
+- adjusted U+043B and U+044F in Serif (by Denis Jacquerye)
+- added U+2000-U+200A (by Denis Jacquerye)
+- added U+1E00-U+1E0B, U+1E0E-U+1E11, U+1E14-U+1E1C, U+1E1E-U+1E23,
+  U+1E26-U+1E2D, U+1E30-U+1E35, U+1E3A-U+1E3B, U+1E3E-U+1E40, U+1E48-U+1E49,
+  U+1E50-U+1E56, U+1E58-U+1E59, U+1E5E-U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F,
+  U+1E72-U+1E7D, U+1E86-U+1E9B, U+1EA0-U+1EA3, U+1EAC-U+1EB7, U+1EBA-U+1EBD,
+  U+1EC6-U+1ECF, U+1ED8-U+1ED9, U+1EE6-U+1EE7, U+1EF4-U+1EF9 to Serif (by
+  Denis Jacquerye)
+- added U+048E, U+048F, U+049C-U+049F, U+04B8, U+04B9, U+04BC-U+04BF,
+  U+04C3, U+04C4 to Sans (by Eugeniy Meshcheryakov)
+- added DejaVu Sans Extra Light (by Denis Jacquerye)
+- Adjusted underline position for (hopefully) improved legibility in
+  Sans, Serif, Mono (Tim May)
+- added auto-generated DejaVu LGC (by Stepan Roh) 
+
+Changes from 2.2 to 2.3:
+
+- fixed bug U+042B and U+044B behave badly in Sans Bold or Oblique (by
+  Keenan Pepper)
+- added and improved TrueType instructions and related settings (by
+  Keenan Pepper)
+- added U+04D0-U+04D7, U+04E6, U+04E7 to Mono (by Eugeniy Meshcheryakov)
+- added U+048A - U+048D, U+0498, U+0499, U+04AA, U+04AB, U+04B0, U+04B1,
+  U+04C0, U+04C9, U+04CA, U+04CE, U+04CD, U+04DA, U+04DB, U+04DE, U+04DF,
+  U+04E2 - U+04E5, U+04EC - U+04F8, U+04F9 to Sans (by Eugeniy Meshcheryakov)
+- added U+04E0, U+04E1 to all faces (by Eugeniy Meshcheryakov)
+- added Greek Extended to Sans and Serif: U+1F00-U+1F15, U+1F18-U+1F1D,
+  U+1F20-U+1F45, U+1F48-U+1F4D, U+1F50-U+1F57, U+1F59, U+1F5B, U+1F5D,
+  U+1F5F-U+1F7D, U+1F80-U+1FB4, U+1FB6-U+1FC4, U+1FC6-U+1FD3, U+1FD6-U+1FDB,
+  U+1FDD-U+1FEF, U+1FF2-U+1FF4, U+1FF6-U+1FFE (by Ben Laenen)
+- added Greek variant letterforms, archaic letters and symbols to Mono:
+  U+03D0-U+03E1, U+03F0-U+03FF (by Ben Laenen)
+- added Armenian block and Armenian ligatures to Sans (U+0531 - U+0556,
+  U+0559 - U+055F, U+0561 - U+0587, U+0589 - U+058A, U+FB13 - U+FB17) (by Ben
+  Laenen)
+- redid some Greek characters in Sans and Mono to make them look better
+  and to correct some errors (by Ben Laenen)
+- added U+27E0 to all faces (by David Lawrence Ramsey)
+- added underscore (U+005F) consistency fixes: extended the Sans Mono
+  and Sans Mono Oblique underscores to touch both horizontal edges, and
+  reduced the height of the Sans Bold Oblique underscore to match the Sans
+  Bold underscore (by David Lawrence Ramsey)
+- added underscore (U+005F) derivatives and consistency fixes for them:
+  made U+0332 a reference to underscore at Denis Jacquerye's suggestion; made
+  U+0333 two references to underscore; made U+033F two references to U+203E;
+  added U+2017 as two references to underscore, and made U+0333 a reference to
+  it; and added U+203E as a reference to underscore, and made U+0305 a
+  reference to it (by David Lawrence Ramsey)
+- added U+201B, U+2220, U+2320-U+2321, U+23AE, U+23CF, all remaining
+  Geometric Shapes glyphs (U+25A0-U+25C9, U+25CB-U+25D7, U+25D9-U+25E5,
+  U+25E7-U+25FF), and U+2B12-U+2B13 to all faces (by David Lawrence Ramsey)
+- added minor positional adjustments to U+2638 in all faces (by David
+  Lawrence Ramsey)
+- added U+201F to Sans Mono and Serif faces (by David Lawrence Ramsey)
+- added U+01B7, U+01F6, U+0464 - U+0465, U+2160 - U+2180, U+2183,
+  U+220A, U+220D, U+2329, U+232A, U+2422, U+27E8 - U+27EB, U+2680 - U+2685 to
+  Sans (by Gee Fung Sit ???)
+- added U+2116 to Sans and Serif (by Gee Fung Sit)
+- changed florin sign U+0192 in Sans (by Gee Fung Sit)
+- added anchor points to some glyphs (by Denis Jacquerye)
+- adjusted height of IPA superscripts U+02B0-02B8, U+02C0-02C1,
+  U+02E0-02E4, U+207F to match with height of U+00B2 (by Denis Jacquerye)
+- added U+0184-U+0185, U+019C, U+019F, U+01A0-U+01A3, U+01A6, U+01AA,
+  U+01AF-U+01B0, U+01B2-U+01B4, U+01B7-U+01B8, U+01BC-U+01BC, U+0224-U+0225,
+  U+023A-U+0240, U+1D16-U+1D17, U+1D1D-U+1D1E, U+1D43-U+1D5B, U+1D7B,
+  U+1D85,U+1D9B-1DB7, U+1DB9-U+1DBF, U+20A6 to all fonts (by Denis Jacquerye)
+- added added U+0182, U+018B, U+018E, U+01A0-U+01A1, U+01B1, U+01B9,
+  U+01C0-U+01C3, U+0238-U+0239, U+1D02, U+1D08-U+1D09, U+1D14, U+1D1F, U+1D77
+  to Serif and Mono (by Denis Jacquerye)
+- added U+0181, U+0183, U+0187-U+0188, U+018A-U+018F, U+0191, U+0193,
+  U+0195-U+019B, U+019D-U+019E, U+01A4-U+01A5, U+01AC-U+01AE, U+01B5-U+01B6,
+  U+01B9, U+01BB, U+01F6 to Serif (by Denis Jacquerye)
+- added U+0181, U+0187-U+0188, U+018A, U+018D, U+018F, U+0191, U+0193,
+  U+0195-U+019F, U+01A4-01A5, U+01AC-01AD, U+01B5-U+01B6, U+1BB, U+01F6,
+  U+01D7-U+01DC, U+0238-U+0239, U+0241 to Mono (by Denis Jacquerye)
+- added to Mono and Serif (by Denis Jacquerye) 
+
+Changes from 2.1 to 2.2:
+
+- reworked the vertical orientation of the Blocks Elements characters
+  in all faces to remove their overly large descenders, in order to fix
+  problems with e.g. terminal emulators (by David Lawrence Ramsey)
+- copied bullet in Sans faces to Serif faces for consistency (by David
+  Lawrence Ramsey)
+- added U+2023, U+25D8, U+25E6, and U+29EB to all faces (by David
+  Lawrence Ramsey)
+- added U+1EB8, U+1EB9, U+1ECA - U+1ECD, U+1EE4, U+1EE5 (by Tim May)
+- added U+01DD, U+02BE, U+02BF, U+02D3 to all, changed U+02D2 in
+  non-Condensed and U+1EE5 in Serif (by Tim May)
+- fixed U+01CE, replacing wrong circumflex by caron (by Denis Jacquerye)
+- added anchor points to some glyphs (by Denis Jacquerye)
+- added U+20B5 (by Denis Jacquerye)
+- added U+0181 - U+0183, U+0187, U+0188, U+018A - U+018D, U+0191,
+  U+0193, U+0195 - U+019B, U+019D, U+019E, U+01A4, U+01A7 - U+01A9, U+01AB -
+  U+01AE, U+01B1, U+01B5, U+01B6, U+01BB, U+01C0 - U+01C3, U+01F1 - U+01F3,
+  U+0238, U+0239, U+1D02, U+1D08, U+1D09, U+1D14, U+1D1F, U+1D77, U+2103,
+  U+2126, U+2127, U+212A, U+212B, U+2132, U+214B, U+2210, U+2217, U+2218,
+  U+2A0C - U+2A0E, U+FB00, U+FB03 and U+FB04 to Sans (by Gee Fung Sit)
+- added U+01A9, U+01C3 and U+2126 to Mono and Serif (by Gee Fung Sit)
+- adjusted bearings of U+028B in Sans (by Gee Fung Sit)
+- added U+018F, U+0494-U+0497, U+04A0-U+04A7, U+04AC-U+04AF,
+  U+04B4-U+04B7, U+04BA-U+04BB, U+04C1-U+04C2, U+04C5-U+04C8, U+04CB-U+04CC,
+  U+04D0-U+04D9, U+04DC-U+04DD, U+04E6-U+04EB to Sans (by Eugeniy
+  Meshcheryakov)
+- replaced with references U+0391-U+0393, U+0395-U+0397, U+0399, U+039A,
+  U+039C, U+039D, U+039F-U+03A1, U+03A4, U+03A5, U+03A7, U+03BF, U+03DC,
+  U+0405, U+0406, U+0408, U+0410, U+0412, U+0415, U+0417, U+041A,
+  U+041C-U+041E, U+0420-U+0422, U+0425, U+0430, U+0435, U+043E, U+0440,
+  U+0441, U+0443, U+0445, U+0455-U+0458 in Serif and Mono (by Eugeniy
+  Meshcheryakov)
+- added U+04D0-U+04D7, U+04E6-U+04EB to Serif (by Eugeniy Meshcheryakov)
+- added U+212A and U+212B to the rest of the faces (by Lars Naesbye
+  Christensen)
+- added U+2318 and U+2325 to Sans and Serif (by Lars Naesbye Christensen)
+- added and improved TrueType instructions and related settings (by
+  Keenan Pepper)
+- completed basic Greek alphabet: added U+0374-U+0375, U+037A, U+037E,
+  U+0384-U+038A, U+038C, U+038E-U+0390, U+03AC-U+03BF, U+03C1-U+03CE (by Ben
+  Laenen)
+- added U+2070 and U+2074-U+2079 (by Mederic Boquien) 
+
+Changes from 2.0 to 2.1:
+
+*** Be aware that names of some TTF files changed since version 2.0. ***
+
+- added U+0323, U+1E0C, U+1E0D, U+1E24, U+1E25, U+1E36 - U+1E39, U+1E42,
+  U+1E43, U+1E46, U+1E47, U+1E5A - U+1E5D, U+1E62, U+1E63, U+1E6C, U+1E6D,
+  U+1E7E, U+1E7F (by Tim May)
+- fixed bug where GNOME applications used Mono Bold Oblique instead of
+  Mono Oblique (by Keenan Pepper)
+- added and improved TrueType instructions and related settings (by
+  Keenan Pepper)
+- added U+1E41, U+1E57, U+1E61 (by Sander Vesik)
+- added U+0189, U+0309, U+0313, U+0314, U+031A, U+031B, U+0327, U+0328,
+  U+032B, U+0333, U+033C (by Denis Jacquerye)
+- adjusted and fixed U+0186, U+0254, U+0291, U+0316 - U+0319, U+031C -
+  U+0320, U+0323 - U+0326, U+0329 - U+032A, U+032C - U+0332, U+0339 - U+033B,
+  U+033E, U+033F (by Denis Jacquerye)
+- fixed U+1E12, U+1E3C, U+1E4A, U+1E70 to have normal below diacritics
+  (by Denis Jacquerye)
+- fixed U+1E82, U+1E84 and U+1EF2 to have uppercase above diacritics (by
+  Denis Jacquerye)
+- added anchor points to some glyphs (by Denis Jacquerye)
+- dropped "-Roman" from font names - affects both internal TTF names and
+  names of generated files (by Stepan Roh)
+- attempt to fix bug Vertical spacing too big for Mono by exchanging
+  LineGap and OS2TypoLinegap values (proofed by Stefan Rank)
+- added Greek capitals U+0391 - U+03A1, U+03A3 - U+03A9, U+03AA, U+03AB
+  in Mono (by Ben Laenen)
+- added the per ten thousand sign U+2031 (by Mederic Boquien)
+- added U+2207, U+221D, U+221F, U+2227 - U+222A, and U+2261 (by David
+  Lawrence Ramsey)
+- new logo (by Gee Fung Sit)
+- added U+0180, U+018E, U+201F, U+2024, U+2025, U+203D, U+2200, U+2203,
+  U+2213, U+222C, U+222D, U+2263 to Sans (by Gee Fung Sit) 
+
+Changes from 1.15 to 2.0:
+
+- "Italized" basic glyphs in all Serif Oblique and their Condensed faces
+  (by David Jez)
+- added and improved TrueType instructions and related settings (by Keenan
+  Pepper)
+- added anchor points to some glyphs (by Denis Jacquerye)
+- many new spacing and combining accents (by Denis Jacquerye)
+- smart substitutions for transforming i and j to dottless form and for
+  using uppercase diacritics (by Denis Jacquerye)
+- fixed remaining erroneously slanted characters in Serif Oblique faces (by
+  David Lawrence Ramsey)
+- copied bullet in Sans faces to Sans Oblique faces for consistency (by
+  David Lawrence Ramsey)
+- added U+203C and U+2047-U+2049 (by David Lawrence Ramsey)
+- added Greek glyphs to Serif (by Ben Laenen, Condensed merge by David Jez)
+- fixed bug LTR glyphs behaving like RTL (by Ben Laenen)
+- fixed wrong glyph directions (by David Jez)
+- fixed repositioned accents in Condensed faces (by David Jez)
+
+Changes from 1.14 to 1.15:
+
+- added and improved TrueType instructions and related settings (by Keenan
+  Pepper)
+- fixed U+2302, U+2319 (by David Lawrence Ramsey)
+- fixed yet another monospace bug (by Stepan Roh)
+- fixed potential "too big ascender/descender" bug (by Stepan Roh)
+- fixed U+026E and U+028E (by Denis Jacquerye)
+- added U+0186, U+0190, U+0300 - U+0304, U+0306 - U+0308, U+030A - U+030C,
+  U+0321, U+0322 (by Denis Jacquerye)
+- added rest of Block Elements: U+2591 - U+2593 (by David Lawrence Ramsey)
+- added U+2311, U+237D and U+2638 (by David Lawrence Ramsey)
+- added U+01CD - U+01D4 (by Denis Jacquerye)
+- fixed accents of U+00F2 - U+00F6 by replacing them with references in Mono
+  Bold (by David Jez)
+- added U+0490, U+0491 (by Eugeniy Meshcheryakov)
+- added hints to U+0404 and U+0454 in Sans (by Eugeniy Meshcheryakov)
+- completed Greek glyphs from U+0370 to U+03CF in Serif (by Ben Laenen)
+- fixed shape of U+0255 in Sans Bold and Sans Bold Oblique (by Denis
+  Jacquerye)
+
+Changes from 1.13 to 1.14:
+
+- fixed bug where Mono faces were not recognized as fixed pitch in Windows
+  by correcting Venda glyphs (by David Jez)
+- added and improved TrueType instructions (by Keenan Pepper)
+- added 6 Uzbekian glyphs (by Mashrab Kuvatov)
+- added Greek glyphs to Sans and Serif, changed pi and omega to fit in (by
+  Ben Laenen)
+- added IPA and related superscript glyphs (by Denis Jacquerye)
+- fixed buggy Venda glyphs (by David Lawrence Ramsey and Stepan Roh)
+- added U+2302, U+2310, U+2319 (by David Lawrence Ramsey)
+- fixed slanted U+00AC in Serif Oblique faces (by David Lawrence Ramsey)
+- added 29 glyphs from Block Elements (by David Lawrence Ramsey)
+
+Changes from 1.12 to 1.13:
+
+- removed all stems (PS hints) (requested by David Jez)
+- added U+01D6, U+01DF, U+022B, U+022D and U+0231 (by Sander Vesik)
+- added 10 Venda glyphs (by Dwayne Bailey)
+- fixed bug when fonts had no name on Microsoft Windows (by Stepan Roh)
+- updated 'missing' glyph U+FFFD (by David Jez)
+- set TTF flag fsType to 'Installable Embedding' (= unrestricted usage)
+  (idea by C. Tiffany)
+
+Changes from 1.11 to 1.12:
+
+- added long s (by James Cloos)
+- prettier comma accent in gcommaaccent (by David Jez)
+- added Hbar, hbar, kgreenlandic, napostrophe, Eng, eng, Tbar, tbar,
+  afii57929 (by David Jez)
+- changed Iogonek, iogonek, IJ, ij to look better (by David Jez)
+- glyph uni0237 renamed to dotlessj (requested by David Jez)
+- fixed accents for dcaron, lcaron, tcaron, Uogonek, uogonek in Serif (by
+  David Jez)
+- added U+2500 - U+257F box drawing glyphs to Sans Mono (by David Jez)
+- fixed accents in Wcircumflex, Ycircumflex and Zdotaccent (by David Jez)
+- extra kerning for F (by Sander Vesik)
+- added 'missing' glyph U+FFFD (by David Jez)
+
+Changes from 1.10 to 1.11:
+
+- kerning updates (by Sander Vesik)
+- added Iogonek, iogonek, IJ, ij, Uogonek, uogonek (from SuSE standard fonts
+  by Adrian Schroeter, SuSE AG)
+- added Gcommaaccent, gcommaaccent, Kcommaaccent, kcommaaccent,
+  Lcommaaccent, lcommaaccent, Ncommaaccent, ncommaaccent, Rcommaaccent,
+  rcommaaccent (by Stepan Roh)
+
+Changes from 1.9 to 1.10:
+
+- added U+022E, U+022F (by Sander Vesik)
+- kerning updates for DejaVu Sans (by Sander Vesik)
+- fixed too wide cyrillic glyphs in DejaVu Sans Mono (by Valentin Stoykov)
+- fixed ligatures bug in Mono (by Stepan Roh)
+
+Changes from 1.8 to 1.9:
+
+- integrated Arev Cyrillics (by Danilo Segan)
+- added U+01EA, U+01EB, U+01EC, U+01ED (by Sander Vesik)
+
+Changes from 1.7 to 1.8:
+
+- fixed accents in Serif Oblique and Serif Bold Oblique (by Stepan Roh)
+
+Changes from 1.6 to 1.7:
+
+- added automatically generated Condensed typefaces (by Stepan Roh)
+
+Changes from 1.5 to 1.6:
+
+- monospace bug fixed (by Stepan Roh)
+- incorrect Bitstream foundry assigned by fontconfig and KDE Font Installer
+fixed (by Stepan Roh)
+- added automatically generated Oblique version of Serif typefaces (by
+Stepan Roh)
+- corrected cyrillic D and d (by Danilo Segan and David Jez)
+- fixed accents position in Oblique version of Serif typefaces (by Danilo
+Segan and Sander Vesik)
+- fixed incorrect computation of OS2Win* fields (by Stepan Roh)
+- added visiblespace U+2423 (by David Jez)
+- fixed 'line height' bug by fixing ascender and descender values (by David
+Jez and Stepan Roh)
+- fixed part of 'worse than Vera' bug (by Peter Cernak)
+- smaller comma accent U+0326 (by David Jez)
+
+Changes from 1.4 to 1.5:
+
+- added Cyrillics (96 characters) and Dcroat to the rest of typefaces (by
+Danilo Segan)
+- fixed bugs in some Cyrillic characters, some of them reported by Sander
+Vesik (by Danilo Segan)
+- added U+0100, U+0101, U+0112, U+0113, U+012A, U+012B, U+014C, U+014D,
+U+016A, U+016B, U+01E2, U+01E3, U+0232 and U+0233 (by Sander Vesik)
+- added Romanian characters (by Misu Moldovan)
+- added U+0108, U+0109, U+010A, U+010B, U+0114, U+0115, U+0116, U+0117,
+U+011C, U+011D, U+0120, U+0121, U+0124, U+0125, U+0128, U+0129, U+012C,
+U+012D, U+0134, U+0135, U+014E, U+014F, U+0150, U+0151, U+015C, U+015D,
+U+0168, U+0169, U+016C, U+016D, U+0170, U+0171 and U+0237 (by James
+Crippen)
+- added U+02BB, U+2010, U+2011, U+2012 and U+2015 (by Stepan Roh)
+
+Changes from 1.3 to 1.4:
+
+- added Polish characters (Aogonek, aogonek, Eogonek, eogonek, Nacute,
+nacute, Sacute, sacute, Zacute, zacute, Zdotaccent, zdotaccent) (by Stepan
+Roh)
+
+Changes from 1.2 to 1.3:
+
+- added Cyrillics (96 characters) and Dcroat to Sans typefaces (by Danilo
+Segan from his BePa fonts)
+
+Changes from 1.1 to 1.2:
+
+- added Ldot, ldot, Wcircumflex, wcircumflex, Ycircumflex, ycircumflex,
+  Wgrave, wgrave, Wacute, wacute, Wdieresis, wdieresis, Ygrave and ygrave
+  (from The Olwen Font Family 0.2 by Dafydd Harries)
+
+Changes from 1.0 to 1.1:
+
+- added Lacute, lacute, Lcaron, lcaron, Racute and racute (by Peter Cernak)
+
+Changes from 0.9.4 to 1.0:
+
+- none, just changed version and updated README
+
+Changes from 0.9.3 to 0.9.4:
+
+- fixed TTF generation (kerning tables were missing)
+
+Changes from 0.9.2 to 0.9.3:
+
+- kerning of added characters
+- proper caron shape for dcaron in Mono (by Ondrej Koala Vacha)
+- minor visual changes
+
+Changes from 0.9.1 to 0.9.2:
+
+- internal bugged version
+
+Changes from 0.9 to 0.9.1:
+
+- proper caron shape for dcaron and tcaron
+- minor visual changes
+
+$Id: NEWS 2471 2011-02-27 14:25:15Z ben_laenen $
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/README b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/README
new file mode 100644
index 00000000..0f2079a9
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/README
@@ -0,0 +1,59 @@
+DejaVu fonts 2.33 (c)2004-2011 DejaVu fonts team
+------------------------------------------------
+
+The DejaVu fonts are a font family based on the Bitstream Vera Fonts
+(http://gnome.org/fonts/). Its purpose is to provide a wider range of
+characters (see status.txt for more information) while maintaining the
+original look and feel.
+
+DejaVu fonts are based on Bitstream Vera fonts version 1.10.
+
+Available fonts (Sans = sans serif, Mono = monospaced):
+
+DejaVu Sans Mono
+DejaVu Sans Mono Bold
+DejaVu Sans Mono Bold Oblique
+DejaVu Sans Mono Oblique
+DejaVu Sans
+DejaVu Sans Bold
+DejaVu Sans Bold Oblique
+DejaVu Sans Oblique
+DejaVu Sans ExtraLight (experimental)
+DejaVu Serif
+DejaVu Serif Bold
+DejaVu Serif Bold Italic (experimental)
+DejaVu Serif Italic (experimental)
+DejaVu Sans Condensed (experimental)
+DejaVu Sans Condensed Bold (experimental)
+DejaVu Sans Condensed Bold Oblique (experimental)
+DejaVu Sans Condensed Oblique (experimental)
+DejaVu Serif Condensed (experimental)
+DejaVu Serif Condensed Bold (experimental)
+DejaVu Serif Condensed Bold Italic (experimental)
+DejaVu Serif Condensed Italic (experimental)
+
+All fonts are also available as derivative called DejaVu LGC with support
+only for Latin, Greek and Cyrillic scripts.
+
+For license information see LICENSE. What's new is described in NEWS. Known
+bugs are in BUGS. All authors are mentioned in AUTHORS.
+
+Fonts are published in source form as SFD files (Spline Font Database from
+FontForge - http://fontforge.sf.net/) and in compiled form as TTF files
+(TrueType fonts).
+
+For more information go to http://dejavu.sourceforge.net/.
+
+Characters from Arev fonts, Copyright (c) 2006 by Tavmjong Bah:
+---------------------------
+U+01BA, U+01BF, U+01F7, U+021C-U+021D, U+0220, U+0222-U+0223,
+U+02B9, U+02BA, U+02BD, U+02C2-U+02C5, U+02d4-U+02D5,
+U+02D7, U+02EC-U+02EE, U+0346-U+034E, U+0360, U+0362,
+U+03E2-03EF, U+0460-0463, U+0466-U+0486, U+0488-U+0489, U+04A8-U+04A9,
+U+0500-U+050F, U+2055-205E, U+20B0, U+20B2-U+20B3, U+2102, U+210D, U+210F,
+U+2111, U+2113, U+2115, U+2118-U+211A, U+211C-U+211D, U+2124, U+2135,
+U+213C-U+2140, U+2295-U+2298, U+2308-U+230B, U+26A2-U+26B1, U+2701-U+2704,
+U+2706-U+2709, U+270C-U+274B, U+2758-U+275A, U+2761-U+2775, U+2780-U+2794,
+U+2798-U+27AF, U+27B1-U+27BE, U+FB05-U+FB06
+
+$Id: README 2471 2011-02-27 14:25:15Z ben_laenen $
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/langcover.txt b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/langcover.txt
new file mode 100644
index 00000000..f5034487
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/langcover.txt
@@ -0,0 +1,242 @@
+This is the language coverage file for DejaVu fonts
+($Id$)
+
+                                                Sans               Serif              Sans Mono          
+aa     Afar                                     100% (62/62)       100% (62/62)       100% (62/62)      
+ab     Abkhazia                                 100% (90/90)        93% (84/90)        84% (76/90)      
+af     Afrikaans                                100% (69/69)       100% (69/69)       100% (69/69)      
+ak     Akan                                     100% (73/73)       100% (73/73)       100% (73/73)      
+am     Amharic                                       (0/264)            (0/264)            (0/264)      
+an     Aragonese                                100% (66/66)       100% (66/66)       100% (66/66)      
+ar     Arabic                                   100% (125/125)          (0/125)       100% (125/125)    
+as     Assamese                                      (0/64)             (0/64)             (0/64)       
+ast    Asturian/Bable/Leonese/Asturleonese      100% (66/66)       100% (66/66)       100% (66/66)      
+av     Avaric                                   100% (67/67)       100% (67/67)       100% (67/67)      
+ay     Aymara                                   100% (60/60)       100% (60/60)       100% (60/60)      
+az-az  Azerbaijani in Azerbaijan                100% (66/66)       100% (66/66)       100% (66/66)      
+az-ir  Azerbaijani in Iran                      100% (130/130)          (0/130)       100% (130/130)    
+ba     Bashkir                                  100% (82/82)       100% (82/82)        97% (80/82)      
+be     Byelorussian                             100% (68/68)       100% (68/68)       100% (68/68)      
+ber-dz Berber in Algeria                        100% (70/70)       100% (70/70)       100% (70/70)      
+ber-ma Berber in Morocco                        100% (32/32)            (0/32)             (0/32)       
+bg     Bulgarian                                100% (60/60)       100% (60/60)       100% (60/60)      
+bh     Bihari (Devanagari script)                    (0/68)             (0/68)             (0/68)       
+bho    Bhojpuri (Devanagari script)                  (0/68)             (0/68)             (0/68)       
+bi     Bislama                                  100% (58/58)       100% (58/58)       100% (58/58)      
+bin    Edo or Bini                              100% (78/78)       100% (78/78)       100% (78/78)      
+bm     Bambara                                  100% (60/60)       100% (60/60)       100% (60/60)      
+bn     Bengali                                       (0/63)             (0/63)             (0/63)       
+bo     Tibetan                                       (0/95)             (0/95)             (0/95)       
+br     Breton                                   100% (64/64)       100% (64/64)       100% (64/64)      
+bs     Bosnian                                  100% (62/62)       100% (62/62)       100% (62/62)      
+bua    Buriat (Buryat)                          100% (70/70)       100% (70/70)       100% (70/70)      
+byn    Blin/Bilin                                    (0/255)            (0/255)            (0/255)      
+ca     Catalan                                  100% (74/74)       100% (74/74)       100% (74/74)      
+ce     Chechen                                  100% (67/67)       100% (67/67)       100% (67/67)      
+ch     Chamorro                                 100% (58/58)       100% (58/58)       100% (58/58)      
+chm    Mari (Lower Cheremis / Upper Cheremis)   100% (76/76)       100% (76/76)       100% (76/76)      
+chr    Cherokee                                      (0/85)             (0/85)             (0/85)       
+co     Corsican                                 100% (84/84)       100% (84/84)       100% (84/84)      
+crh    Crimean Tatar/Crimean Turkish            100% (68/68)       100% (68/68)       100% (68/68)      
+cs     Czech                                    100% (82/82)       100% (82/82)       100% (82/82)      
+csb    Kashubian                                100% (74/74)       100% (74/74)       100% (74/74)      
+cu     Old Church Slavonic                      100% (103/103)      86% (89/103)       78% (81/103)     
+cv     Chuvash                                  100% (74/74)       100% (74/74)       100% (74/74)      
+cy     Welsh                                    100% (78/78)       100% (78/78)       100% (78/78)      
+da     Danish                                   100% (70/70)       100% (70/70)       100% (70/70)      
+de     German                                   100% (59/59)       100% (59/59)       100% (59/59)      
+dv     Divehi/Dhivehi/Maldivian                      (0/49)             (0/49)             (0/49)       
+dz     Dzongkha                                      (0/95)             (0/95)             (0/95)       
+ee     Ewe                                      100% (99/99)       100% (99/99)       100% (99/99)      
+el     Greek                                    100% (69/69)       100% (69/69)       100% (69/69)      
+en     English                                  100% (72/72)       100% (72/72)       100% (72/72)      
+eo     Esperanto                                100% (64/64)       100% (64/64)       100% (64/64)      
+es     Spanish                                  100% (66/66)       100% (66/66)       100% (66/66)      
+et     Estonian                                 100% (64/64)       100% (64/64)       100% (64/64)      
+eu     Basque                                   100% (56/56)       100% (56/56)       100% (56/56)      
+fa     Persian                                  100% (129/129)          (0/129)       100% (129/129)    
+fat    Fanti                                    100% (73/73)       100% (73/73)       100% (73/73)      
+ff     Fulah (Fula)                             100% (62/62)       100% (62/62)       100% (62/62)      
+fi     Finnish                                  100% (62/62)       100% (62/62)       100% (62/62)      
+fil    Filipino                                 100% (84/84)       100% (84/84)       100% (84/84)      
+fj     Fijian                                   100% (52/52)       100% (52/52)       100% (52/52)      
+fo     Faroese                                  100% (68/68)       100% (68/68)       100% (68/68)      
+fr     French                                   100% (84/84)       100% (84/84)       100% (84/84)      
+fur    Friulian                                 100% (66/66)       100% (66/66)       100% (66/66)      
+fy     Frisian                                  100% (75/75)       100% (75/75)       100% (75/75)      
+ga     Irish                                    100% (80/80)       100% (80/80)       100% (80/80)      
+gd     Scots Gaelic                             100% (70/70)       100% (70/70)       100% (70/70)      
+gez    Ethiopic (Geez)                               (0/218)            (0/218)            (0/218)      
+gl     Galician                                 100% (66/66)       100% (66/66)       100% (66/66)      
+gn     Guarani                                  100% (70/70)       100% (70/70)       100% (70/70)      
+gu     Gujarati                                      (0/68)             (0/68)             (0/68)       
+gv     Manx Gaelic                              100% (54/54)       100% (54/54)       100% (54/54)      
+ha     Hausa                                    100% (60/60)       100% (60/60)       100% (60/60)      
+haw    Hawaiian                                 100% (63/63)       100% (63/63)       100% (63/63)      
+he     Hebrew                                   100% (27/27)            (0/27)             (0/27)       
+hi     Hindi (Devanagari script)                     (0/68)             (0/68)             (0/68)       
+hne    Chhattisgarhi                                 (0/68)             (0/68)             (0/68)       
+ho     Hiri Motu                                100% (52/52)       100% (52/52)       100% (52/52)      
+hr     Croatian                                 100% (62/62)       100% (62/62)       100% (62/62)      
+hsb    Upper Sorbian                            100% (72/72)       100% (72/72)       100% (72/72)      
+ht     Haitian/Haitian Creole                   100% (56/56)       100% (56/56)       100% (56/56)      
+hu     Hungarian                                100% (70/70)       100% (70/70)       100% (70/70)      
+hy     Armenian                                 100% (77/77)       100% (77/77)       100% (77/77)      
+hz     Herero                                   100% (57/57)       100% (57/57)       100% (57/57)      
+ia     Interlingua                              100% (52/52)       100% (52/52)       100% (52/52)      
+id     Indonesian                               100% (54/54)       100% (54/54)       100% (54/54)      
+ie     Interlingue                              100% (52/52)       100% (52/52)       100% (52/52)      
+ig     Igbo                                     100% (58/58)       100% (58/58)       100% (58/58)      
+ii     Sichuan Yi/Nuosu                              (0/1165)           (0/1165)           (0/1165)     
+ik     Inupiaq (Inupiak, Eskimo)                100% (68/68)       100% (68/68)       100% (68/68)      
+io     Ido                                      100% (52/52)       100% (52/52)       100% (52/52)      
+is     Icelandic                                100% (70/70)       100% (70/70)       100% (70/70)      
+it     Italian                                  100% (72/72)       100% (72/72)       100% (72/72)      
+iu     Inuktitut                                100% (161/161)          (0/161)            (0/161)      
+ja     Japanese                                      (0/6537)           (0/6537)           (0/6537)     
+jv     Javanese                                 100% (56/56)       100% (56/56)       100% (56/56)      
+ka     Georgian                                 100% (33/33)       100% (33/33)       100% (33/33)      
+kaa    Kara-Kalpak (Karakalpak)                 100% (78/78)       100% (78/78)       100% (78/78)      
+kab    Kabyle                                   100% (70/70)       100% (70/70)       100% (70/70)      
+ki     Kikuyu                                   100% (56/56)       100% (56/56)       100% (56/56)      
+kj     Kuanyama/Kwanyama                        100% (52/52)       100% (52/52)       100% (52/52)      
+kk     Kazakh                                   100% (77/77)       100% (77/77)       100% (77/77)      
+kl     Greenlandic                              100% (81/81)       100% (81/81)       100% (81/81)      
+km     Central Khmer                                 (0/63)             (0/63)             (0/63)       
+kn     Kannada                                       (0/70)             (0/70)             (0/70)       
+ko     Korean                                        (0/2443)           (0/2443)           (0/2443)     
+kok    Kokani (Devanagari script)                    (0/68)             (0/68)             (0/68)       
+kr     Kanuri                                   100% (56/56)       100% (56/56)       100% (56/56)      
+ks     Kashmiri                                  98% (143/145)          (0/145)        97% (141/145)    
+ku-am  Kurdish in Armenia                       100% (64/64)       100% (64/64)       100% (64/64)      
+ku-iq  Kurdish in Iraq                          100% (32/32)            (0/32)         87% (28/32)      
+ku-ir  Kurdish in Iran                          100% (32/32)            (0/32)         87% (28/32)      
+ku-tr  Kurdish in Turkey                        100% (62/62)       100% (62/62)       100% (62/62)      
+kum    Kumyk                                    100% (66/66)       100% (66/66)       100% (66/66)      
+kv     Komi (Komi-Permyak/Komi-Siryan)          100% (70/70)       100% (70/70)       100% (70/70)      
+kw     Cornish                                  100% (64/64)       100% (64/64)       100% (64/64)      
+kwm    Kwambi                                   100% (52/52)       100% (52/52)       100% (52/52)      
+ky     Kirgiz                                   100% (70/70)       100% (70/70)       100% (70/70)      
+la     Latin                                    100% (68/68)       100% (68/68)       100% (68/68)      
+lah    Lahnda                                    98% (143/145)          (0/145)        97% (141/145)    
+lb     Luxembourgish (Letzeburgesch)            100% (75/75)       100% (75/75)       100% (75/75)      
+lez    Lezghian (Lezgian)                       100% (67/67)       100% (67/67)       100% (67/67)      
+lg     Ganda                                    100% (54/54)       100% (54/54)       100% (54/54)      
+li     Limburgan/Limburger/Limburgish           100% (62/62)       100% (62/62)       100% (62/62)      
+ln     Lingala                                  100% (81/81)       100% (81/81)       100% (81/81)      
+lo     Lao                                      100% (55/55)            (0/55)         83% (46/55)      
+lt     Lithuanian                               100% (70/70)       100% (70/70)       100% (70/70)      
+lv     Latvian                                  100% (78/78)       100% (78/78)       100% (78/78)      
+mai    Maithili (Devanagari script)                  (0/68)             (0/68)             (0/68)       
+mg     Malagasy                                 100% (56/56)       100% (56/56)       100% (56/56)      
+mh     Marshallese                              100% (62/62)       100% (62/62)       100% (62/62)      
+mi     Maori                                    100% (64/64)       100% (64/64)       100% (64/64)      
+mk     Macedonian                               100% (42/42)       100% (42/42)       100% (42/42)      
+ml     Malayalam                                     (0/68)             (0/68)             (0/68)       
+mn-cn  Mongolian in China                            (0/130)            (0/130)            (0/130)      
+mn-mn  Mongolian in Mongolia                    100% (70/70)       100% (70/70)       100% (70/70)      
+mo     Moldavian                                100% (128/128)     100% (128/128)     100% (128/128)    
+mr     Marathi (Devanagari script)                   (0/68)             (0/68)             (0/68)       
+ms     Malay                                    100% (52/52)       100% (52/52)       100% (52/52)      
+mt     Maltese                                  100% (72/72)       100% (72/72)       100% (72/72)      
+my     Burmese (Myanmar)                             (0/48)             (0/48)             (0/48)       
+na     Nauru                                    100% (60/60)       100% (60/60)       100% (60/60)      
+nb     Norwegian Bokmal                         100% (70/70)       100% (70/70)       100% (70/70)      
+nds    Low Saxon                                100% (59/59)       100% (59/59)       100% (59/59)      
+ne     Nepali (Devanagari script)                    (0/68)             (0/68)             (0/68)       
+ng     Ndonga                                   100% (52/52)       100% (52/52)       100% (52/52)      
+nl     Dutch                                    100% (82/82)       100% (82/82)       100% (82/82)      
+nn     Norwegian Nynorsk                        100% (76/76)       100% (76/76)       100% (76/76)      
+no     Norwegian (Bokmal)                       100% (70/70)       100% (70/70)       100% (70/70)      
+nr     Ndebele, South                           100% (52/52)       100% (52/52)       100% (52/52)      
+nso    Northern Sotho                           100% (58/58)       100% (58/58)       100% (58/58)      
+nv     Navajo/Navaho                            100% (72/72)       100% (72/72)       100% (72/72)      
+ny     Chichewa                                 100% (54/54)       100% (54/54)       100% (54/54)      
+oc     Occitan                                  100% (70/70)       100% (70/70)       100% (70/70)      
+om     Oromo or Galla                           100% (52/52)       100% (52/52)       100% (52/52)      
+or     Oriya                                         (0/68)             (0/68)             (0/68)       
+os     Ossetic                                  100% (66/66)       100% (66/66)       100% (66/66)      
+ota    Ottoman Turkish                          100% (37/37)            (0/37)         97% (36/37)      
+pa     Panjabi/Punjabi                               (0/63)             (0/63)             (0/63)       
+pa-pk  Panjabi/Punjabi in Pakistan               98% (143/145)          (0/145)        97% (141/145)    
+pap-an Papiamento in Netherlands Antilles       100% (72/72)       100% (72/72)       100% (72/72)      
+pap-aw Papiamento in Aruba                      100% (54/54)       100% (54/54)       100% (54/54)      
+pl     Polish                                   100% (70/70)       100% (70/70)       100% (70/70)      
+ps-af  Pashto in Afghanistan                     95% (47/49)            (0/49)         77% (38/49)      
+ps-pk  Pashto in Pakistan                        93% (46/49)            (0/49)         75% (37/49)      
+pt     Portuguese                               100% (82/82)       100% (82/82)       100% (82/82)      
+qu     Quechua                                  100% (55/55)       100% (55/55)       100% (55/55)      
+rm     Rhaeto-Romance (Romansch)                100% (66/66)       100% (66/66)       100% (66/66)      
+rn     Rundi                                    100% (52/52)       100% (52/52)       100% (52/52)      
+ro     Romanian                                 100% (62/62)       100% (62/62)       100% (62/62)      
+ru     Russian                                  100% (66/66)       100% (66/66)       100% (66/66)      
+rw     Kinyarwanda                              100% (52/52)       100% (52/52)       100% (52/52)      
+sa     Sanskrit (Devanagari script)                  (0/68)             (0/68)             (0/68)       
+sah    Yakut                                    100% (76/76)       100% (76/76)       100% (76/76)      
+sc     Sardinian                                100% (62/62)       100% (62/62)       100% (62/62)      
+sco    Scots                                    100% (56/56)       100% (56/56)       100% (56/56)      
+sd     Sindhi                                   100% (54/54)            (0/54)         79% (43/54)      
+se     North Sami                               100% (66/66)       100% (66/66)       100% (66/66)      
+sel    Selkup (Ostyak-Samoyed)                  100% (66/66)       100% (66/66)       100% (66/66)      
+sg     Sango                                    100% (72/72)       100% (72/72)       100% (72/72)      
+sh     Serbo-Croatian                           100% (156/156)     100% (156/156)      98% (154/156)    
+shs    Secwepemctsin                            100% (48/48)       100% (48/48)       100% (48/48)      
+si     Sinhala/Sinhalese                             (0/73)             (0/73)             (0/73)       
+sid    Sidamo                                        (0/281)            (0/281)            (0/281)      
+sk     Slovak                                   100% (86/86)       100% (86/86)       100% (86/86)      
+sl     Slovenian                                100% (62/62)       100% (62/62)       100% (62/62)      
+sm     Samoan                                   100% (53/53)       100% (53/53)       100% (53/53)      
+sma    South Sami                               100% (60/60)       100% (60/60)       100% (60/60)      
+smj    Lule Sami                                100% (60/60)       100% (60/60)       100% (60/60)      
+smn    Inari Sami                               100% (68/68)       100% (68/68)       100% (68/68)      
+sms    Skolt Sami                               100% (80/80)       100% (80/80)        97% (78/80)      
+sn     Shona                                    100% (52/52)       100% (52/52)       100% (52/52)      
+so     Somali                                   100% (52/52)       100% (52/52)       100% (52/52)      
+sq     Albanian                                 100% (56/56)       100% (56/56)       100% (56/56)      
+sr     Serbian                                  100% (60/60)       100% (60/60)       100% (60/60)      
+ss     Swati                                    100% (52/52)       100% (52/52)       100% (52/52)      
+st     Sotho, Southern                          100% (52/52)       100% (52/52)       100% (52/52)      
+su     Sundanese                                100% (54/54)       100% (54/54)       100% (54/54)      
+sv     Swedish                                  100% (68/68)       100% (68/68)       100% (68/68)      
+sw     Swahili                                  100% (52/52)       100% (52/52)       100% (52/52)      
+syr    Syriac                                        (0/45)             (0/45)             (0/45)       
+ta     Tamil                                         (0/48)             (0/48)             (0/48)       
+te     Telugu                                        (0/70)             (0/70)             (0/70)       
+tg     Tajik                                    100% (78/78)       100% (78/78)        97% (76/78)      
+th     Thai                                       1% (1/74)             (0/74)             (0/74)       
+ti-er  Eritrean Tigrinya                             (0/255)            (0/255)            (0/255)      
+ti-et  Ethiopian Tigrinya                            (0/281)            (0/281)            (0/281)      
+tig    Tigre                                         (0/221)            (0/221)            (0/221)      
+tk     Turkmen                                  100% (68/68)       100% (68/68)       100% (68/68)      
+tl     Tagalog                                  100% (84/84)       100% (84/84)       100% (84/84)      
+tn     Tswana                                   100% (58/58)       100% (58/58)       100% (58/58)      
+to     Tonga                                    100% (53/53)       100% (53/53)       100% (53/53)      
+tr     Turkish                                  100% (70/70)       100% (70/70)       100% (70/70)      
+ts     Tsonga                                   100% (52/52)       100% (52/52)       100% (52/52)      
+tt     Tatar                                    100% (76/76)       100% (76/76)       100% (76/76)      
+tw     Twi                                      100% (73/73)       100% (73/73)       100% (73/73)      
+ty     Tahitian                                 100% (65/65)       100% (65/65)       100% (65/65)      
+tyv    Tuvinian                                 100% (70/70)       100% (70/70)       100% (70/70)      
+ug     Uighur                                   100% (125/125)          (0/125)       100% (125/125)    
+uk     Ukrainian                                100% (72/72)       100% (72/72)       100% (72/72)      
+ur     Urdu                                      98% (143/145)          (0/145)        97% (141/145)    
+uz     Uzbek                                    100% (52/52)       100% (52/52)       100% (52/52)      
+ve     Venda                                    100% (62/62)       100% (62/62)       100% (62/62)      
+vi     Vietnamese                               100% (194/194)     100% (194/194)      76% (148/194)    
+vo     Volapuk                                  100% (54/54)       100% (54/54)       100% (54/54)      
+vot    Votic                                    100% (62/62)       100% (62/62)       100% (62/62)      
+wa     Walloon                                  100% (70/70)       100% (70/70)       100% (70/70)      
+wal    Wolaitta/Wolaytta                             (0/281)            (0/281)            (0/281)      
+wen    Sorbian languages (lower and upper)      100% (76/76)       100% (76/76)       100% (76/76)      
+wo     Wolof                                    100% (66/66)       100% (66/66)       100% (66/66)      
+xh     Xhosa                                    100% (52/52)       100% (52/52)       100% (52/52)      
+yap    Yapese                                   100% (58/58)       100% (58/58)       100% (58/58)      
+yi     Yiddish                                  100% (27/27)            (0/27)             (0/27)       
+yo     Yoruba                                   100% (119/119)     100% (119/119)     100% (119/119)    
+za     Zhuang/Chuang                            100% (52/52)       100% (52/52)       100% (52/52)      
+zh-cn  Chinese (simplified)                       0% (2/6765)        0% (2/6765)        0% (2/6765)     
+zh-hk  Chinese Hong Kong Supplementary Character Set      (0/2213)           (0/2213)           (0/2213)     
+zh-mo  Chinese in Macau                              (0/2213)           (0/2213)           (0/2213)     
+zh-sg  Chinese in Singapore                       0% (2/6765)        0% (2/6765)        0% (2/6765)     
+zh-tw  Chinese (traditional)                         (0/13063)          (0/13063)          (0/13063)    
+zu     Zulu                                     100% (52/52)       100% (52/52)       100% (52/52)      
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/status.txt b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/status.txt
new file mode 100644
index 00000000..e860ef48
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/status.txt
@@ -0,0 +1,6657 @@
+This is the status file for DejaVu fonts
+($Id: status.txt 2425 2010-08-22 16:07:31Z moyogo $)
+
+original = present in original Bitstream Vera 1.10
+<version> = added in DejaVu fonts <version>
+
+U+0020 space                original
+U+0021 exclam               original
+U+0022 quotedbl             original
+U+0023 numbersign           original
+U+0024 dollar               original
+U+0025 percent              original
+U+0026 ampersand            original
+U+0027 quotesingle          original
+U+0028 parenleft            original
+U+0029 parenright           original
+U+002a asterisk             original
+U+002b plus                 original
+U+002c comma                original
+U+002d hyphen               original
+U+002e period               original
+U+002f slash                original
+U+0030 zero                 original
+U+0031 one                  original
+U+0032 two                  original
+U+0033 three                original
+U+0034 four                 original
+U+0035 five                 original
+U+0036 six                  original
+U+0037 seven                original
+U+0038 eight                original
+U+0039 nine                 original
+U+003a colon                original
+U+003b semicolon            original
+U+003c less                 original
+U+003d equal                original
+U+003e greater              original
+U+003f question             original
+U+0040 at                   original
+U+0041 A                    original
+U+0042 B                    original
+U+0043 C                    original
+U+0044 D                    original
+U+0045 E                    original
+U+0046 F                    original
+U+0047 G                    original
+U+0048 H                    original
+U+0049 I                    original
+U+004a J                    original
+U+004b K                    original
+U+004c L                    original
+U+004d M                    original
+U+004e N                    original
+U+004f O                    original
+U+0050 P                    original
+U+0051 Q                    original
+U+0052 R                    original
+U+0053 S                    original
+U+0054 T                    original
+U+0055 U                    original
+U+0056 V                    original
+U+0057 W                    original
+U+0058 X                    original
+U+0059 Y                    original
+U+005a Z                    original
+U+005b bracketleft          original
+U+005c backslash            original
+U+005d bracketright         original
+U+005e asciicircum          original
+U+005f underscore           original
+U+0060 grave                original
+U+0061 a                    original
+U+0062 b                    original
+U+0063 c                    original
+U+0064 d                    original
+U+0065 e                    original
+U+0066 f                    original
+U+0067 g                    original
+U+0068 h                    original
+U+0069 i                    original
+U+006a j                    original
+U+006b k                    original
+U+006c l                    original
+U+006d m                    original
+U+006e n                    original
+U+006f o                    original
+U+0070 p                    original
+U+0071 q                    original
+U+0072 r                    original
+U+0073 s                    original
+U+0074 t                    original
+U+0075 u                    original
+U+0076 v                    original
+U+0077 w                    original
+U+0078 x                    original
+U+0079 y                    original
+U+007a z                    original
+U+007b braceleft            original
+U+007c bar                  original
+U+007d braceright           original
+U+007e asciitilde           original
+U+00a0 nonbreakingspace     original
+U+00a1 exclamdown           original
+U+00a2 cent                 original
+U+00a3 sterling             original
+U+00a4 currency             original
+U+00a5 yen                  original
+U+00a6 brokenbar            original
+U+00a7 section              original
+U+00a8 dieresis             original
+U+00a9 copyright            original
+U+00aa ordfeminine          original
+U+00ab guillemotleft        original
+U+00ac logicalnot           original
+U+00ad sfthyphen            original
+U+00ae registered           original
+U+00af macron               original
+U+00b0 degree               original
+U+00b1 plusminus            original
+U+00b2 twosuperior          original
+U+00b3 threesuperior        original
+U+00b4 acute                original
+U+00b5 mu                   original
+U+00b6 paragraph            original
+U+00b7 periodcentered       original
+U+00b8 cedilla              original
+U+00b9 onesuperior          original
+U+00ba ordmasculine         original
+U+00bb guillemotright       original
+U+00bc onequarter           original
+U+00bd onehalf              original
+U+00be threequarters        original
+U+00bf questiondown         original
+U+00c0 Agrave               original
+U+00c1 Aacute               original
+U+00c2 Acircumflex          original
+U+00c3 Atilde               original
+U+00c4 Adieresis            original
+U+00c5 Aring                original
+U+00c6 AE                   original
+U+00c7 Ccedilla             original
+U+00c8 Egrave               original
+U+00c9 Eacute               original
+U+00ca Ecircumflex          original
+U+00cb Edieresis            original
+U+00cc Igrave               original
+U+00cd Iacute               original
+U+00ce Icircumflex          original
+U+00cf Idieresis            original
+U+00d0 Eth                  original
+U+00d1 Ntilde               original
+U+00d2 Ograve               original
+U+00d3 Oacute               original
+U+00d4 Ocircumflex          original
+U+00d5 Otilde               original
+U+00d6 Odieresis            original
+U+00d7 multiply             original
+U+00d8 Oslash               original
+U+00d9 Ugrave               original
+U+00da Uacute               original
+U+00db Ucircumflex          original
+U+00dc Udieresis            original
+U+00dd Yacute               original
+U+00de Thorn                original
+U+00df germandbls           original
+U+00e0 agrave               original
+U+00e1 aacute               original
+U+00e2 acircumflex          original
+U+00e3 atilde               original
+U+00e4 adieresis            original
+U+00e5 aring                original
+U+00e6 ae                   original
+U+00e7 ccedilla             original
+U+00e8 egrave               original
+U+00e9 eacute               original
+U+00ea ecircumflex          original
+U+00eb edieresis            original
+U+00ec igrave               original
+U+00ed iacute               original
+U+00ee icircumflex          original
+U+00ef idieresis            original
+U+00f0 eth                  original
+U+00f1 ntilde               original
+U+00f2 ograve               original
+U+00f3 oacute               original
+U+00f4 ocircumflex          original
+U+00f5 otilde               original
+U+00f6 odieresis            original
+U+00f7 divide               original
+U+00f8 oslash               original
+U+00f9 ugrave               original
+U+00fa uacute               original
+U+00fb ucircumflex          original
+U+00fc udieresis            original
+U+00fd yacute               original
+U+00fe thorn                original
+U+00ff ydieresis            original
+U+0100 Amacron              1.5
+U+0101 amacron              1.5
+U+0102 Abreve               1.5
+U+0103 abreve               1.5
+U+0104 Aogonek              1.4
+U+0105 aogonek              1.4
+U+0106 Cacute               original
+U+0107 cacute               original
+U+0108 Ccircumflex          1.5
+U+0109 ccircumflex          1.5
+U+010a Cdotaccent           1.5
+U+010b cdotaccent           1.5
+U+010c Ccaron               original
+U+010d ccaron               original
+U+010e Dcaron               1.0
+U+010f dcaron               1.0
+U+0110 Dcroat               1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0111 dcroat               original
+U+0112 Emacron              1.5
+U+0113 emacron              1.5
+U+0114 Ebreve               1.5
+U+0115 ebreve               1.5
+U+0116 Edotaccent           1.5
+U+0117 edotaccent           1.5
+U+0118 Eogonek              1.4
+U+0119 eogonek              1.4
+U+011a Ecaron               1.0
+U+011b ecaron               1.0
+U+011c Gcircumflex          1.5
+U+011d gcircumflex          1.5
+U+011e Gbreve               original
+U+011f gbreve               original
+U+0120 Gdotaccent           1.5
+U+0121 gdotaccent           1.5
+U+0122 Gcommaaccent         1.11
+U+0123 gcommaaccent         1.11
+U+0124 Hcircumflex          1.5
+U+0125 hcircumflex          1.5
+U+0126 Hbar                 1.12
+U+0127 hbar                 1.12
+U+0128 Itilde               1.5
+U+0129 itilde               1.5
+U+012a Imacron              1.5
+U+012b imacron              1.5
+U+012c Ibreve               1.5
+U+012d ibreve               1.5
+U+012e Iogonek              1.11
+U+012f iogonek              1.11
+U+0130 Idotaccent           original
+U+0131 dotlessi             original
+U+0132 IJ                   1.11
+U+0133 ij                   1.11
+U+0134 Jcircumflex          1.5
+U+0135 jcircumflex          1.5
+U+0136 Kcommaaccent         1.11
+U+0137 kcommaaccent         1.11
+U+0138 kgreenlandic         1.12
+U+0139 Lacute               1.1
+U+013a lacute               1.1
+U+013b Lcommaaccent         1.11
+U+013c lcommaaccent         1.11
+U+013d Lcaron               1.1
+U+013e lcaron               1.1
+U+013f Ldot                 1.2
+U+0140 ldot                 1.2
+U+0141 Lslash               original
+U+0142 lslash               original
+U+0143 Nacute               1.4
+U+0144 nacute               1.4
+U+0145 Ncommaaccent         1.11
+U+0146 ncommaaccent         1.11
+U+0147 Ncaron               1.0
+U+0148 ncaron               1.0
+U+0149 napostrophe          1.12
+U+014a Eng                  1.12
+U+014b eng                  1.12
+U+014c Omacron              1.5
+U+014d omacron              1.5
+U+014e Obreve               1.5
+U+014f obreve               1.5
+U+0150 Ohungarumlaut        1.5
+U+0151 ohungarumlaut        1.5
+U+0152 OE                   original
+U+0153 oe                   original
+U+0154 Racute               1.1
+U+0155 racute               1.1
+U+0156 Rcommaaccent         1.11
+U+0157 rcommaaccent         1.11
+U+0158 Rcaron               1.0
+U+0159 rcaron               1.0
+U+015a Sacute               1.4
+U+015b sacute               1.4
+U+015c Scircumflex          1.5
+U+015d scircumflex          1.5
+U+015e Scedilla             original
+U+015f scedilla             original
+U+0160 Scaron               original
+U+0161 scaron               original
+U+0162 Tcommaaccent         1.5
+U+0163 tcommaaccent         1.5
+U+0164 Tcaron               1.0
+U+0165 tcaron               1.0
+U+0166 Tbar                 1.12
+U+0167 tbar                 1.12
+U+0168 Utilde               1.5
+U+0169 utilde               1.5
+U+016a Umacron              1.5
+U+016b umacron              1.5
+U+016c Ubreve               1.5
+U+016d ubreve               1.5
+U+016e Uring                1.0
+U+016f uring                1.0
+U+0170 Uhungarumlaut        1.5
+U+0171 uhungarumlaut        1.5
+U+0172 Uogonek              1.11
+U+0173 uogonek              1.11
+U+0174 Wcircumflex          1.2
+U+0175 wcircumflex          1.2
+U+0176 Ycircumflex          1.2
+U+0177 ycircumflex          1.2
+U+0178 Ydieresis            original
+U+0179 Zacute               1.4
+U+017a zacute               1.4
+U+017b Zdotaccent           1.4
+U+017c zdotaccent           1.4
+U+017d Zcaron               original
+U+017e zcaron               original
+U+017f longs                1.12
+U+0180 uni0180              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0181 uni0181              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0182 uni0182              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0183 uni0183              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0184 uni0184              2.3
+U+0185 uni0185              2.3
+U+0186 uni0186              1.15
+U+0187 uni0187              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0188 uni0188              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0189 uni0189              2.1
+U+018a uni018A              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+018b uni018B              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+018c uni018C              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+018d uni018D              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+018e uni018E              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+018f uni018F              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0190 uni0190              1.15
+U+0191 uni0191              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0192 florin               original
+U+0193 uni0193              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0194 uni0194              1.14
+U+0195 uni0195              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0196 uni0196              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0197 uni0197              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0198 uni0198              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0199 uni0199              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+019a uni019A              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+019b uni019B              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+019c uni019C              2.3
+U+019d uni019D              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+019e uni019E              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+019f uni019F              2.3
+U+01a0 Ohorn                2.3
+U+01a1 ohorn                2.3
+U+01a2 uni01A2              2.3
+U+01a3 uni01A3              2.3
+U+01a4 uni01A4              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01a5 uni01A5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01a6 uni01A6              2.3
+U+01a7 uni01A7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01a8 uni01A8              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01a9 uni01A9              2.2
+U+01aa uni01AA              2.3
+U+01ab uni01AB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01ac uni01AC              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01ad uni01AD              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01ae uni01AE              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01af Uhorn                2.3
+U+01b0 uhorn                2.3
+U+01b1 uni01B1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01b2 uni01B2              2.3
+U+01b3 uni01B3              2.3
+U+01b4 uni01B4              2.3
+U+01b5 uni01B5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01b6 uni01B6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01b7 uni01B7              2.3
+U+01b8 uni01B8              2.3
+U+01b9 uni01B9              2.3
+U+01ba uni01BA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+01bb uni01BB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01bc uni01BC              2.3
+U+01bd uni01BD              2.3
+U+01be uni01BE              2.3
+U+01bf uni01BF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+01c0 uni01C0              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01c1 uni01C1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01c2 uni01C2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+01c3 uni01C3              2.2
+U+01c4 uni01C4              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01c5 uni01C5              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01c6 uni01C6              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01c7 uni01C7              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01c8 uni01C8              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01c9 uni01C9              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01ca uni01CA              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01cb uni01CB              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01cc uni01CC              1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01cd uni01CD              1.15
+U+01ce uni01CE              1.15
+U+01cf uni01CF              1.15
+U+01d0 uni01D0              1.15
+U+01d1 uni01D1              1.15
+U+01d2 uni01D2              1.15
+U+01d3 uni01D3              1.15
+U+01d4 uni01D4              1.15
+U+01d5 uni01D5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01d6 uni01D6              1.13
+U+01d7 uni01D7              2.3
+U+01d8 uni01D8              2.3
+U+01d9 uni01D9              2.3
+U+01da uni01DA              2.3
+U+01db uni01DB              2.3
+U+01dc uni01DC              2.3
+U+01dd uni01DD              2.2
+U+01de uni01DE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique) 2.23 (Serif Italic Condensed)
+U+01df uni01DF              1.13
+U+01e0 uni01E0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01e1 uni01E1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01e2 uni01E2              1.5
+U+01e3 uni01E3              1.5
+U+01e4 uni01E4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+01e5 uni01E5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+01e6 Gcaron               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01e7 gcaron               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01e8 uni01E8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01e9 uni01E9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01ea uni01EA              1.9
+U+01eb uni01EB              1.9
+U+01ec uni01EC              1.9
+U+01ed uni01ED              1.9
+U+01ee uni01EE              2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01ef uni01EF              2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01f0 uni01F0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono) 2.22 (Sans Mono Bold) 2.23 (Serif Italic Condensed)
+U+01f1 uni01F1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01f2 uni01F2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01f3 uni01F3              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01f4 uni01F4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01f5 uni01F5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01f6 uni01F6              2.3
+U+01f7 uni01F7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+01f8 uni01F8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01f9 uni01F9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01fa Aringacute           2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01fb aringacute           2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+01fc AEacute              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01fd aeacute              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01fe Oslashacute          2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+01ff oslashacute          2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0200 uni0200              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0201 uni0201              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0202 uni0202              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0203 uni0203              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0204 uni0204              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0205 uni0205              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0206 uni0206              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0207 uni0207              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0208 uni0208              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0209 uni0209              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+020a uni020A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+020b uni020B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+020c uni020C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+020d uni020D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+020e uni020E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+020f uni020F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0210 uni0210              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0211 uni0211              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0212 uni0212              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0213 uni0213              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0214 uni0214              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0215 uni0215              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0216 uni0216              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0217 uni0217              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0218 Scommaaccent         1.5
+U+0219 scommaaccent         1.5
+U+021a uni021A              1.5
+U+021b uni021B              1.5
+U+021c uni021C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+021d uni021D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+021e uni021E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+021f uni021F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0220 uni0220              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.18 (Sans Mono, Sans Mono Bold) 2.23 (Serif Italic Condensed)
+U+0221 uni0221              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0222 uni0222              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0223 uni0223              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0224 uni0224              2.3
+U+0225 uni0225              2.3
+U+0226 uni0226              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0227 uni0227              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0228 uni0228              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0229 uni0229              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+022a uni022A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+022b uni022B              1.13
+U+022c uni022C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+022d uni022D              1.13
+U+022e uni022E              1.10
+U+022f uni022F              1.10
+U+0230 uni0230              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0231 uni0231              1.13
+U+0232 uni0232              1.5
+U+0233 uni0233              1.5
+U+0234 uni0234              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0235 uni0235              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0236 uni0236              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0237 dotlessj             1.5
+U+0238 uni0238              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0239 uni0239              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+023a uni023A              2.3
+U+023b uni023B              2.3
+U+023c uni023C              2.3
+U+023d uni023D              2.3
+U+023e uni023E              2.3
+U+023f uni023F              2.3
+U+0240 uni0240              2.3
+U+0241 uni0241              2.3
+U+0242 uni0242              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+0243 uni0243              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0244 uni0244              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0245 uni0245              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0246 uni0246              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0247 uni0247              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0248 uni0248              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0249 uni0249              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+024a uni024A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+024b uni024B              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+024c uni024C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+024d uni024D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+024e uni024E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+024f uni024F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0250 uni0250              1.14
+U+0251 uni0251              1.14
+U+0252 uni0252              1.14
+U+0253 uni0253              1.14
+U+0254 uni0254              1.14
+U+0255 uni0255              1.14
+U+0256 uni0256              1.14
+U+0257 uni0257              1.14
+U+0258 uni0258              1.14
+U+0259 uni0259              1.14
+U+025a uni025A              1.14
+U+025b uni025B              1.14
+U+025c uni025C              1.14
+U+025d uni025D              1.14
+U+025e uni025E              1.14
+U+025f uni025F              1.14
+U+0260 uni0260              1.14
+U+0261 uni0261              1.14
+U+0262 uni0262              1.14
+U+0263 uni0263              1.14
+U+0264 uni0264              1.14
+U+0265 uni0265              1.14
+U+0266 uni0266              1.14
+U+0267 uni0267              1.14
+U+0268 uni0268              1.14
+U+0269 uni0269              1.14
+U+026a uni026A              1.14
+U+026b uni026B              1.14
+U+026c uni026C              1.14
+U+026d uni026D              1.14
+U+026e uni026E              1.14
+U+026f uni026F              1.14
+U+0270 uni0270              1.14
+U+0271 uni0271              1.14
+U+0272 uni0272              1.14
+U+0273 uni0273              1.14
+U+0274 uni0274              1.14
+U+0275 uni0275              1.14
+U+0276 uni0276              1.14
+U+0277 uni0277              1.14
+U+0278 uni0278              1.14
+U+0279 uni0279              1.14
+U+027a uni027A              1.14
+U+027b uni027B              1.14
+U+027c uni027C              1.14
+U+027d uni027D              1.14
+U+027e uni027E              1.14
+U+027f uni027F              1.14
+U+0280 uni0280              1.14
+U+0281 uni0281              1.14
+U+0282 uni0282              1.14
+U+0283 uni0283              1.14
+U+0284 uni0284              1.14
+U+0285 uni0285              1.14
+U+0286 uni0286              1.14
+U+0287 uni0287              1.14
+U+0288 uni0288              1.14
+U+0289 uni0289              1.14
+U+028a uni028A              1.14
+U+028b uni028B              1.14
+U+028c uni028C              1.14
+U+028d uni028D              1.14
+U+028e uni028E              1.14
+U+028f uni028F              1.14
+U+0290 uni0290              1.14
+U+0291 uni0291              1.14
+U+0292 uni0292              1.14
+U+0293 uni0293              1.14
+U+0294 uni0294              1.14
+U+0295 uni0295              1.14
+U+0296 uni0296              1.14
+U+0297 uni0297              1.14
+U+0298 uni0298              1.14
+U+0299 uni0299              1.14
+U+029a uni029A              1.14
+U+029b uni029B              1.14
+U+029c uni029C              1.14
+U+029d uni029D              1.14
+U+029e uni029E              1.14
+U+029f uni029F              1.14
+U+02a0 uni02A0              1.14
+U+02a1 uni02A1              1.14
+U+02a2 uni02A2              1.14
+U+02a3 uni02A3              1.14
+U+02a4 uni02A4              1.14
+U+02a5 uni02A5              1.14
+U+02a6 uni02A6              1.14
+U+02a7 uni02A7              1.14
+U+02a8 uni02A8              1.14
+U+02a9 uni02A9              1.14
+U+02aa uni02AA              1.14
+U+02ab uni02AB              1.14
+U+02ac uni02AC              1.14
+U+02ad uni02AD              1.14
+U+02ae uni02AE              1.14
+U+02af uni02AF              1.14
+U+02b0 uni02B0              1.14
+U+02b1 uni02B1              1.14
+U+02b2 uni02B2              1.14
+U+02b3 uni02B3              1.14
+U+02b4 uni02B4              1.14
+U+02b5 uni02B5              1.14
+U+02b6 uni02B6              1.14
+U+02b7 uni02B7              1.14
+U+02b8 uni02B8              1.14
+U+02b9 uni02B9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+02ba uni02BA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02bb uni02BB              1.5
+U+02bc uni02BC              1.12
+U+02bd uni02BD              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+02be uni02BE              2.2
+U+02bf uni02BF              2.2
+U+02c0 uni02C0              1.14
+U+02c1 uni02C1              1.14
+U+02c2 uni02C2              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02c3 uni02C3              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02c4 uni02C4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02c5 uni02C5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02c6 circumflex           original
+U+02c7 caron                original
+U+02c8 uni02C8              2.0
+U+02c9 uni02C9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+02ca uni02CA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+02cb uni02CB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+02cc uni02CC              2.0
+U+02cd uni02CD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+02ce uni02CE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+02cf uni02CF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+02d0 uni02D0              1.14
+U+02d1 uni02D1              1.14
+U+02d2 uni02D2              2.0
+U+02d3 uni02D3              2.2
+U+02d4 uni02D4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02d5 uni02D5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02d6 uni02D6              2.0
+U+02d7 uni02D7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+02d8 breve                original
+U+02d9 dotaccent            original
+U+02da ring                 original
+U+02db ogonek               original
+U+02dc tilde                original
+U+02dd hungarumlaut         original
+U+02de uni02DE              2.0
+U+02df uni02DF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02e0 uni02E0              1.14
+U+02e1 uni02E1              1.14
+U+02e2 uni02E2              1.14
+U+02e3 uni02E3              1.14
+U+02e4 uni02E4              1.14
+U+02e5 uni02E5              2.0
+U+02e6 uni02E6              2.0
+U+02e7 uni02E7              2.0
+U+02e8 uni02E8              2.0
+U+02e9 uni02E9              2.0
+U+02ec uni02EC              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02ed uni02ED              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+02ee uni02EE              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+02f3 uni02F3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+02f7 uni02F7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+0300 gravecomb            1.15
+U+0301 acutecomb            1.15
+U+0302 uni0302              1.15
+U+0303 tildecomb            1.15
+U+0304 uni0304              1.15
+U+0305 uni0305              2.0
+U+0306 uni0306              1.15
+U+0307 uni0307              1.15
+U+0308 uni0308              1.15
+U+0309 hookabovecomb        2.1
+U+030a uni030A              1.15
+U+030b uni030B              1.15
+U+030c uni030C              1.15
+U+030d uni030D              2.0
+U+030e uni030E              2.0
+U+030f uni030F              2.0
+U+0310 uni0310              2.0
+U+0311 uni0311              2.0
+U+0312 uni0312              1.11
+U+0313 uni0313              2.1
+U+0314 uni0314              2.1
+U+0315 uni0315              2.0
+U+0316 uni0316              2.0
+U+0317 uni0317              2.0
+U+0318 uni0318              2.0
+U+0319 uni0319              2.0
+U+031a uni031A              2.1
+U+031b uni031B              2.1
+U+031c uni031C              2.0
+U+031d uni031D              2.0
+U+031e uni031E              2.0
+U+031f uni031F              2.0
+U+0320 uni0320              2.0
+U+0321 uni0321              1.15
+U+0322 uni0322              1.15
+U+0323 dotbelowcomb         2.1
+U+0324 uni0324              2.0
+U+0325 uni0325              2.0
+U+0326 uni0326              1.5
+U+0327 uni0327              2.1
+U+0328 uni0328              2.1
+U+0329 uni0329              2.0
+U+032a uni032A              2.0
+U+032b uni032B              2.1
+U+032c uni032C              2.0
+U+032d uni032D              2.0
+U+032e uni032E              2.0
+U+032f uni032F              2.0
+U+0330 uni0330              2.0
+U+0331 uni0331              2.0
+U+0332 uni0332              2.0
+U+0333 uni0333              2.1
+U+0334 uni0334              2.3
+U+0335 uni0335              2.3
+U+0336 uni0336              2.3
+U+0337 uni0337              2.3
+U+0338 uni0338              2.3
+U+0339 uni0339              2.0
+U+033a uni033A              2.0
+U+033b uni033B              2.0
+U+033c uni033C              2.1
+U+033d uni033D              2.0
+U+033e uni033E              2.1
+U+033f uni033F              2.1
+U+0340 uni0340              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0341 uni0341              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0342 uni0342              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0343 uni0343              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0344 uni0344              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0345 uni0345              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0346 uni0346              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0347 uni0347              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0348 uni0348              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0349 uni0349              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+034a uni034A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+034b uni034B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+034c uni034C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+034d uni034D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+034e uni034E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+034f uni034F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0351 uni0351              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0352 uni0352              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) 2.28 (Sans Condensed Oblique, Sans Oblique)
+U+0353 uni0353              2.5 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0357 uni0357              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0358 uni0358              2.3
+U+035a uni035A              2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+035c uni035C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+035d uni035D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+035e uni035E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+035f uni035F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0360 uni0360              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0361 uni0361              2.0
+U+0362 uni0362              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0370 uni0370              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0371 uni0371              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0372 uni0372              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0373 uni0373              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0374 uni0374              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0375 uni0375              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0376 uni0376              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0377 uni0377              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+037a uni037A              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+037b uni037B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+037c uni037C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+037d uni037D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+037e uni037E              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0384 tonos                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0385 dieresistonos        1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0386 Alphatonos           1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0387 anoteleia            1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0388 Epsilontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0389 Etatonos             1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+038a Iotatonos            1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+038c Omicrontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+038e Upsilontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+038f Omegatonos           1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0390 iotadieresistonos    1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0391 Alpha                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0392 Beta                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0393 Gamma                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0394 uni0394              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0395 Epsilon              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0396 Zeta                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0397 Eta                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0398 Theta                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0399 Iota                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+039a Kappa                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+039b Lambda               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+039c Mu                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+039d Nu                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+039e Xi                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+039f Omicron              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a0 Pi                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a1 Rho                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a3 Sigma                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a4 Tau                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a5 Upsilon              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a6 Phi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a7 Chi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a8 Psi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03a9 Omega                original
+U+03aa Iotadieresis         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ab Upsilondieresis      1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ac alphatonos           1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ad epsilontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ae etatonos             1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03af iotatonos            1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b0 upsilondieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b1 alpha                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b2 beta                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b3 gamma                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b4 delta                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b5 epsilon              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b6 zeta                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b7 eta                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b8 theta                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03b9 iota                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ba kappa                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03bb lambda               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03bc uni03BC              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03bd nu                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03be xi                   1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03bf omicron              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c0 pi                   original
+U+03c1 rho                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c2 sigma1               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c3 sigma                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c4 tau                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c5 upsilon              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c6 phi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c7 chi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c8 psi                  1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03c9 omega                1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ca iotadieresis         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03cb upsilondieresis      1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03cc omicrontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03cd upsilontonos         1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ce omegatonos           1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03cf uni03CF              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+03d0 uni03D0              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03d1 theta1               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03d2 Upsilon1             1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03d3 uni03D3              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03d4 uni03D4              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03d5 phi1                 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.18 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03d6 omega1               1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+03d7 uni03D7              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03d8 uni03D8              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+03d9 uni03D9              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+03da uni03DA              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03db uni03DB              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03dc uni03DC              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03dd uni03DD              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03de uni03DE              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03df uni03DF              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03e0 uni03E0              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03e1 uni03E1              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03e2 uni03E2              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03e3 uni03E3              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03e4 uni03E4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03e5 uni03E5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03e6 uni03E6              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03e7 uni03E7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03e8 uni03E8              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03e9 uni03E9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03ea uni03EA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03eb uni03EB              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03ec uni03EC              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03ed uni03ED              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03ee uni03EE              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03ef uni03EF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+03f0 uni03F0              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03f1 uni03F1              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+03f2 uni03F2              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03f3 uni03F3              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03f4 uni03F4              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03f5 uni03F5              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03f6 uni03F6              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03f7 uni03F7              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03f8 uni03F8              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03f9 uni03F9              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03fa uni03FA              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03fb uni03FB              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+03fc uni03FC              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+03fd uni03FD              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03fe uni03FE              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+03ff uni03FF              1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0400 uni0400              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0401 uni0401              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0402 uni0402              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0403 uni0403              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0404 uni0404              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0405 uni0405              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0406 uni0406              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0407 uni0407              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0408 uni0408              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0409 uni0409              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+040a uni040A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+040b uni040B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+040c uni040C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+040d uni040D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+040e uni040E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+040f uni040F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0410 uni0410              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0411 uni0411              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0412 uni0412              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0413 uni0413              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0414 uni0414              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0415 uni0415              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0416 uni0416              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0417 uni0417              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0418 uni0418              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0419 uni0419              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+041a uni041A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+041b uni041B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+041c uni041C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+041d uni041D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+041e uni041E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+041f uni041F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0420 uni0420              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0421 uni0421              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0422 uni0422              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0423 uni0423              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0424 uni0424              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0425 uni0425              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0426 uni0426              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0427 uni0427              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0428 uni0428              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0429 uni0429              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+042a uni042A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+042b uni042B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+042c uni042C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+042d uni042D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+042e uni042E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+042f uni042F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0430 uni0430              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0431 uni0431              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0432 uni0432              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0433 uni0433              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0434 uni0434              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0435 uni0435              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0436 uni0436              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0437 uni0437              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0438 uni0438              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0439 uni0439              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+043a uni043A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+043b uni043B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+043c uni043C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+043d uni043D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+043e uni043E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+043f uni043F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0440 uni0440              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0441 uni0441              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0442 uni0442              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0443 uni0443              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0444 uni0444              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0445 uni0445              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0446 uni0446              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0447 uni0447              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0448 uni0448              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0449 uni0449              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+044a uni044A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+044b uni044B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+044c uni044C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+044d uni044D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+044e uni044E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+044f uni044F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0450 uni0450              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0451 uni0451              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0452 uni0452              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0453 uni0453              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0454 uni0454              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0455 uni0455              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0456 uni0456              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0457 uni0457              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0458 uni0458              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0459 uni0459              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+045a uni045A              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+045b uni045B              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+045c uni045C              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+045d uni045D              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+045e uni045E              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+045f uni045F              1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+0460 uni0460              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0461 uni0461              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
+U+0462 uni0462              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0463 uni0463              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0464 uni0464              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0465 uni0465              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0466 uni0466              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0467 uni0467              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0468 uni0468              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0469 uni0469              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+046a uni046A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.21 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+046b uni046B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.21 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+046c uni046C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+046d uni046D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+046e uni046E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+046f uni046F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0470 uni0470              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0471 uni0471              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0472 uni0472              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0473 uni0473              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0474 uni0474              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0475 uni0475              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0476 uni0476              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0477 uni0477              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0478 uni0478              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0479 uni0479              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+047a uni047A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+047b uni047B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+047c uni047C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+047d uni047D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+047e uni047E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+047f uni047F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0480 uni0480              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0481 uni0481              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0482 uni0482              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0483 uni0483              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0484 uni0484              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0485 uni0485              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0486 uni0486              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0487 uni0487              2.9 (Sans, Sans Condensed) 2.27 (Sans Bold, Sans Bold Oblique, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0488 uni0488              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0489 uni0489              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+048a uni048A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+048b uni048B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+048c uni048C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+048d uni048D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+048e uni048E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+048f uni048F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0490 uni0490              1.15
+U+0491 uni0491              1.15
+U+0492 uni0492              1.14
+U+0493 uni0493              1.14
+U+0494 uni0494              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0495 uni0495              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+0496 uni0496              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0497 uni0497              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0498 uni0498              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+0499 uni0499              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+049a uni049A              1.14
+U+049b uni049B              1.14
+U+049c uni049C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+049d uni049D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+049e uni049E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+049f uni049F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04a0 uni04A0              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+04a1 uni04A1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+04a2 uni04A2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04a3 uni04A3              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04a4 uni04A4              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+04a5 uni04A5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+04a6 uni04A6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04a7 uni04A7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04a8 uni04A8              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04a9 uni04A9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04aa uni04AA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04ab uni04AB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04ac uni04AC              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04ad uni04AD              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04ae uni04AE              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04af uni04AF              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04b0 uni04B0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+04b1 uni04B1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+04b2 uni04B2              1.14
+U+04b3 uni04B3              1.14
+U+04b4 uni04B4              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04b5 uni04B5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04b6 uni04B6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04b7 uni04B7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04b8 uni04B8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04b9 uni04B9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04ba uni04BA              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04bb uni04BB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04bc uni04BC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04bd uni04BD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04be uni04BE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04bf uni04BF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04c0 uni04C0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04c1 uni04C1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04c2 uni04C2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04c3 uni04C3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+04c4 uni04C4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+04c5 uni04C5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04c6 uni04C6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04c7 uni04C7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+04c8 uni04C8              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+04c9 uni04C9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04ca uni04CA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04cb uni04CB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04cc uni04CC              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04cd uni04CD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04ce uni04CE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04cf uni04CF              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04d0 uni04D0              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d1 uni04D1              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d2 uni04D2              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d3 uni04D3              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d4 uni04D4              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d5 uni04D5              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d6 uni04D6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d7 uni04D7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04d8 uni04D8              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04d9 uni04D9              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04da uni04DA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04db uni04DB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04dc uni04DC              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04dd uni04DD              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04de uni04DE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04df uni04DF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04e0 uni04E0              2.3
+U+04e1 uni04E1              2.3
+U+04e2 uni04E2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04e3 uni04E3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04e4 uni04E4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04e5 uni04E5              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04e6 uni04E6              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04e7 uni04E7              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04e8 uni04E8              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+04e9 uni04E9              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+04ea uni04EA              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+04eb uni04EB              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+04ec uni04EC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04ed uni04ED              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04ee uni04EE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04ef uni04EF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04f0 uni04F0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04f1 uni04F1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04f2 uni04F2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04f3 uni04F3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04f4 uni04F4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04f5 uni04F5              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04f6 uni04F6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04f7 uni04F7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04f8 uni04F8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+04f9 uni04F9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+04fa uni04FA              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04fb uni04FB              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04fc uni04FC              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04fd uni04FD              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+04fe uni04FE              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
+U+04ff uni04FF              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
+U+0500 uni0500              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
+U+0501 uni0501              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight)
+U+0502 uni0502              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0503 uni0503              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0504 uni0504              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0505 uni0505              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0506 uni0506              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0507 uni0507              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0508 uni0508              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0509 uni0509              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+050a uni050A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+050b uni050B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+050c uni050C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+050d uni050D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+050e uni050E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+050f uni050F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0510 uni0510              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0511 uni0511              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0512 uni0512              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0513 uni0513              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0514 uni0514              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0515 uni0515              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+0516 uni0516              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0517 uni0517              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0518 uni0518              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0519 uni0519              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+051a uni051A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+051b uni051B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+051c uni051C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+051d uni051D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+051e uni051E              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+051f uni051F              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0520 uni0520              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0521 uni0521              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0522 uni0522              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0523 uni0523              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0524 uni0524              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0525 uni0525              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0531 uni0531              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0532 uni0532              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0533 uni0533              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0534 uni0534              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0535 uni0535              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0536 uni0536              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0537 uni0537              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0538 uni0538              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0539 uni0539              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+053a uni053A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+053b uni053B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+053c uni053C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+053d uni053D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+053e uni053E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+053f uni053F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0540 uni0540              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0541 uni0541              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0542 uni0542              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0543 uni0543              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0544 uni0544              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0545 uni0545              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0546 uni0546              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0547 uni0547              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0548 uni0548              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0549 uni0549              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+054a uni054A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+054b uni054B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+054c uni054C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+054d uni054D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+054e uni054E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+054f uni054F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0550 uni0550              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0551 uni0551              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0552 uni0552              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0553 uni0553              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0554 uni0554              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0555 uni0555              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0556 uni0556              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0559 uni0559              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+055a uni055A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+055b uni055B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+055c uni055C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+055d uni055D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+055e uni055E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+055f uni055F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0561 uni0561              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0562 uni0562              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0563 uni0563              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0564 uni0564              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0565 uni0565              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0566 uni0566              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0567 uni0567              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0568 uni0568              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0569 uni0569              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+056a uni056A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+056b uni056B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+056c uni056C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+056d uni056D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+056e uni056E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+056f uni056F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0570 uni0570              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0571 uni0571              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0572 uni0572              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0573 uni0573              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0574 uni0574              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0575 uni0575              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0576 uni0576              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0577 uni0577              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0578 uni0578              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0579 uni0579              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+057a uni057A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+057b uni057B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+057c uni057C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+057d uni057D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+057e uni057E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+057f uni057F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0580 uni0580              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0581 uni0581              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0582 uni0582              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0583 uni0583              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0584 uni0584              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0585 uni0585              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0586 uni0586              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0587 uni0587              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+0589 uni0589              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+058a uni058A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+05b0 uni05B0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b1 uni05B1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b2 uni05B2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b3 uni05B3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b4 uni05B4              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b5 uni05B5              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b6 uni05B6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b7 uni05B7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b8 uni05B8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05b9 uni05B9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05ba uni05BA              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+05bb uni05BB              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05bc uni05BC              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05bd uni05BD              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05be uni05BE              2.9 (Sans Condensed Oblique, Sans Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique)
+U+05bf uni05BF              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05c0 uni05C0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05c1 uni05C1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05c2 uni05C2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05c3 uni05C3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05c6 uni05C6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05c7 uni05C7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d0 uni05D0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d1 uni05D1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d2 uni05D2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d3 uni05D3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d4 uni05D4              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d5 uni05D5              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d6 uni05D6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d7 uni05D7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d8 uni05D8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05d9 uni05D9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05da uni05DA              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05db uni05DB              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05dc uni05DC              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05dd uni05DD              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05de uni05DE              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05df uni05DF              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e0 uni05E0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e1 uni05E1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e2 uni05E2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e3 uni05E3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e4 uni05E4              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e5 uni05E5              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e6 uni05E6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e7 uni05E7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e8 uni05E8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05e9 uni05E9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05ea uni05EA              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05f0 uni05F0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05f1 uni05F1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05f2 uni05F2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+05f3 uni05F3              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+05f4 uni05F4              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0606 uni0606              2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold)
+U+0607 uni0607              2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold)
+U+0609 uni0609              2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold)
+U+060a uni060A              2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold)
+U+060c uni060C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0615 uni0615              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+061b uni061B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+061f uni061F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0621 uni0621              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0622 uni0622              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0623 uni0623              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0624 uni0624              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0625 uni0625              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0626 uni0626              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0627 uni0627              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0628 uni0628              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0629 uni0629              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+062a uni062A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+062b uni062B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+062c uni062C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+062d uni062D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+062e uni062E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+062f uni062F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0630 uni0630              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0631 uni0631              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0632 uni0632              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0633 uni0633              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0634 uni0634              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0635 uni0635              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0636 uni0636              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0637 uni0637              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0638 uni0638              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0639 uni0639              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+063a uni063A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0640 uni0640              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0641 uni0641              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0642 uni0642              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0643 uni0643              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0644 uni0644              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0645 uni0645              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0646 uni0646              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0647 uni0647              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0648 uni0648              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0649 uni0649              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+064a uni064A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+064b uni064B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+064c uni064C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+064d uni064D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+064e uni064E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+064f uni064F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0650 uni0650              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0651 uni0651              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0652 uni0652              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0653 uni0653              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0654 uni0654              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0655 uni0655              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0657 uni0657              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+065a uni065A              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0660 uni0660              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0661 uni0661              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0662 uni0662              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0663 uni0663              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0664 uni0664              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0665 uni0665              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0666 uni0666              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0667 uni0667              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0668 uni0668              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0669 uni0669              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+066a uni066A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+066b uni066B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+066c uni066C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+066d uni066D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+066e uni066E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+066f uni066F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0670 uni0670              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0674 uni0674              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans ExtraLight) 2.16 (Sans Mono, Sans Mono Bold)
+U+0679 uni0679              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+067a uni067A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+067b uni067B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+067c uni067C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+067d uni067D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+067e uni067E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+067f uni067F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0680 uni0680              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0681 uni0681              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0682 uni0682              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0683 uni0683              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0684 uni0684              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0685 uni0685              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0686 uni0686              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0687 uni0687              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0688 uni0688              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0689 uni0689              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+068a uni068A              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+068b uni068B              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+068c uni068C              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+068d uni068D              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+068e uni068E              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+068f uni068F              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0690 uni0690              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0691 uni0691              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0692 uni0692              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0693 uni0693              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0694 uni0694              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0695 uni0695              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0696 uni0696              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0697 uni0697              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0698 uni0698              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+0699 uni0699              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+069a uni069A              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+069b uni069B              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+069c uni069C              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+069d uni069D              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+069e uni069E              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+069f uni069F              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a0 uni06A0              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a1 uni06A1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06a2 uni06A2              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a3 uni06A3              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a4 uni06A4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06a5 uni06A5              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a6 uni06A6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a7 uni06A7              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a8 uni06A8              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06a9 uni06A9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06aa uni06AA              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06ab uni06AB              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06ac uni06AC              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06ad uni06AD              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06ae uni06AE              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06af uni06AF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06b0 uni06B0              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b1 uni06B1              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b2 uni06B2              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b3 uni06B3              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b4 uni06B4              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b5 uni06B5              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06b6 uni06B6              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b7 uni06B7              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b8 uni06B8              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06b9 uni06B9              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06ba uni06BA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06bb uni06BB              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06bc uni06BC              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06bd uni06BD              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06be uni06BE              2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06bf uni06BF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+06c6 uni06C6              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06cc uni06CC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06ce uni06CE              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06d5 uni06D5              2.10 (Sans, Sans Bold) 2.11 (Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f0 uni06F0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f1 uni06F1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f2 uni06F2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f3 uni06F3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f4 uni06F4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f5 uni06F5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f6 uni06F6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f7 uni06F7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f8 uni06F8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+06f9 uni06F9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+07c0 uni07C0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c1 uni07C1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c2 uni07C2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c3 uni07C3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c4 uni07C4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c5 uni07C5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c6 uni07C6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c7 uni07C7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c8 uni07C8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07c9 uni07C9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07ca uni07CA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07cb uni07CB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07cc uni07CC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07cd uni07CD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07ce uni07CE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07cf uni07CF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d0 uni07D0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d1 uni07D1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d2 uni07D2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d3 uni07D3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d4 uni07D4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d5 uni07D5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d6 uni07D6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d7 uni07D7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d8 uni07D8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07d9 uni07D9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07da uni07DA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07db uni07DB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07dc uni07DC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07dd uni07DD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07de uni07DE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07df uni07DF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e0 uni07E0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e1 uni07E1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e2 uni07E2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e3 uni07E3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e4 uni07E4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e5 uni07E5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e6 uni07E6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07e7 uni07E7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07eb uni07EB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07ec uni07EC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07ed uni07ED              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07ee uni07EE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07ef uni07EF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f0 uni07F0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f1 uni07F1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f2 uni07F2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f3 uni07F3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f4 uni07F4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f5 uni07F5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f8 uni07F8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07f9 uni07F9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+07fa uni07FA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+0e3f uni0E3F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0e81 uni0E81              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e82 uni0E82              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e84 uni0E84              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e87 uni0E87              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e88 uni0E88              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e8a uni0E8A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e8d uni0E8D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e94 uni0E94              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e95 uni0E95              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e96 uni0E96              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e97 uni0E97              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e99 uni0E99              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e9a uni0E9A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e9b uni0E9B              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e9c uni0E9C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e9d uni0E9D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e9e uni0E9E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0e9f uni0E9F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ea1 uni0EA1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ea2 uni0EA2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ea3 uni0EA3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ea5 uni0EA5              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ea7 uni0EA7              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eaa uni0EAA              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eab uni0EAB              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ead uni0EAD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eae uni0EAE              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eaf uni0EAF              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb0 uni0EB0              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb1 uni0EB1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb2 uni0EB2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb3 uni0EB3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb4 uni0EB4              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb5 uni0EB5              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb6 uni0EB6              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb7 uni0EB7              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb8 uni0EB8              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eb9 uni0EB9              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ebb uni0EBB              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ebc uni0EBC              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ebd uni0EBD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ec0 uni0EC0              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ec1 uni0EC1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ec2 uni0EC2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ec3 uni0EC3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ec4 uni0EC4              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ec6 uni0EC6              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ec8 uni0EC8              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ec9 uni0EC9              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0eca uni0ECA              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ecb uni0ECB              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ecc uni0ECC              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ecd uni0ECD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+0ed0 uni0ED0              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed1 uni0ED1              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed2 uni0ED2              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed3 uni0ED3              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed4 uni0ED4              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed5 uni0ED5              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed6 uni0ED6              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed7 uni0ED7              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0ed8 uni0ED8              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+0ed9 uni0ED9              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0edc uni0EDC              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+0edd uni0EDD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+10a0 uni10A0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a1 uni10A1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a2 uni10A2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a3 uni10A3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a4 uni10A4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a5 uni10A5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a6 uni10A6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a7 uni10A7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a8 uni10A8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10a9 uni10A9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10aa uni10AA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10ab uni10AB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10ac uni10AC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10ad uni10AD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10ae uni10AE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10af uni10AF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b0 uni10B0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b1 uni10B1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b2 uni10B2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b3 uni10B3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b4 uni10B4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b5 uni10B5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b6 uni10B6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b7 uni10B7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b8 uni10B8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10b9 uni10B9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10ba uni10BA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10bb uni10BB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10bc uni10BC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10bd uni10BD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10be uni10BE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10bf uni10BF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10c0 uni10C0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10c1 uni10C1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10c2 uni10C2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10c3 uni10C3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10c4 uni10C4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10c5 uni10C5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+10d0 uni10D0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d1 uni10D1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d2 uni10D2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d3 uni10D3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d4 uni10D4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d5 uni10D5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d6 uni10D6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d7 uni10D7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d8 uni10D8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10d9 uni10D9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10da uni10DA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10db uni10DB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10dc uni10DC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10dd uni10DD              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10de uni10DE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10df uni10DF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e0 uni10E0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e1 uni10E1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e2 uni10E2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e3 uni10E3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e4 uni10E4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e5 uni10E5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e6 uni10E6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e7 uni10E7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e8 uni10E8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10e9 uni10E9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10ea uni10EA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10eb uni10EB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10ec uni10EC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10ed uni10ED              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10ee uni10EE              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10ef uni10EF              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f0 uni10F0              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f1 uni10F1              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f2 uni10F2              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f3 uni10F3              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f4 uni10F4              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f5 uni10F5              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f6 uni10F6              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f7 uni10F7              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f8 uni10F8              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10f9 uni10F9              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10fa uni10FA              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10fb uni10FB              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+10fc uni10FC              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+1401 uni1401              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1402 uni1402              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1403 uni1403              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1404 uni1404              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1405 uni1405              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1406 uni1406              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1407 uni1407              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1409 uni1409              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+140a uni140A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+140b uni140B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+140c uni140C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+140d uni140D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+140e uni140E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+140f uni140F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1410 uni1410              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1411 uni1411              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1412 uni1412              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1413 uni1413              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1414 uni1414              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1415 uni1415              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1416 uni1416              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1417 uni1417              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1418 uni1418              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1419 uni1419              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+141a uni141A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+141b uni141B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+141d uni141D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+141e uni141E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+141f uni141F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1420 uni1420              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1421 uni1421              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1422 uni1422              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1423 uni1423              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1424 uni1424              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1425 uni1425              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1426 uni1426              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1427 uni1427              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1428 uni1428              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1429 uni1429              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+142a uni142A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+142b uni142B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+142c uni142C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+142d uni142D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+142e uni142E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+142f uni142F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1430 uni1430              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1431 uni1431              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1432 uni1432              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1433 uni1433              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1434 uni1434              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1435 uni1435              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1437 uni1437              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1438 uni1438              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1439 uni1439              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+143a uni143A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+143b uni143B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+143c uni143C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+143d uni143D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+143e uni143E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+143f uni143F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1440 uni1440              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1441 uni1441              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1442 uni1442              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1443 uni1443              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1444 uni1444              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1445 uni1445              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1446 uni1446              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1447 uni1447              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1448 uni1448              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1449 uni1449              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+144a uni144A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+144c uni144C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+144d uni144D              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+144e uni144E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+144f uni144F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1450 uni1450              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1451 uni1451              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1452 uni1452              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1454 uni1454              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1455 uni1455              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1456 uni1456              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1457 uni1457              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1458 uni1458              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1459 uni1459              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+145a uni145A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+145b uni145B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+145c uni145C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+145d uni145D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+145e uni145E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+145f uni145F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1460 uni1460              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1461 uni1461              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1462 uni1462              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1463 uni1463              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1464 uni1464              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1465 uni1465              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1466 uni1466              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1467 uni1467              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1468 uni1468              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1469 uni1469              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+146a uni146A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+146b uni146B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+146c uni146C              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+146d uni146D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+146e uni146E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+146f uni146F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1470 uni1470              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1471 uni1471              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1472 uni1472              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1473 uni1473              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1474 uni1474              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1475 uni1475              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1476 uni1476              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1477 uni1477              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1478 uni1478              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1479 uni1479              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+147a uni147A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+147b uni147B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+147c uni147C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+147d uni147D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+147e uni147E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+147f uni147F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1480 uni1480              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1481 uni1481              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1482 uni1482              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1483 uni1483              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1484 uni1484              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1485 uni1485              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1486 uni1486              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1487 uni1487              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1488 uni1488              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1489 uni1489              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+148a uni148A              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+148b uni148B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+148c uni148C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+148d uni148D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+148e uni148E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+148f uni148F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1490 uni1490              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1491 uni1491              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1492 uni1492              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1493 uni1493              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1494 uni1494              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1495 uni1495              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1496 uni1496              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1497 uni1497              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1498 uni1498              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1499 uni1499              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+149a uni149A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+149b uni149B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+149c uni149C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+149d uni149D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+149e uni149E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+149f uni149F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a0 uni14A0              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a1 uni14A1              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a2 uni14A2              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a3 uni14A3              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a4 uni14A4              2.13 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.15 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+14a5 uni14A5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a6 uni14A6              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a7 uni14A7              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a8 uni14A8              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14a9 uni14A9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14aa uni14AA              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ab uni14AB              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ac uni14AC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ad uni14AD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ae uni14AE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14af uni14AF              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b0 uni14B0              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b1 uni14B1              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b2 uni14B2              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b3 uni14B3              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b4 uni14B4              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b5 uni14B5              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b6 uni14B6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b7 uni14B7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b8 uni14B8              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14b9 uni14B9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ba uni14BA              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14bb uni14BB              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14bc uni14BC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14bd uni14BD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c0 uni14C0              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c1 uni14C1              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c2 uni14C2              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c3 uni14C3              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c4 uni14C4              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c5 uni14C5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c6 uni14C6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c7 uni14C7              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c8 uni14C8              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14c9 uni14C9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ca uni14CA              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14cb uni14CB              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14cc uni14CC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14cd uni14CD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ce uni14CE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14cf uni14CF              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d0 uni14D0              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d1 uni14D1              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d2 uni14D2              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d3 uni14D3              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d4 uni14D4              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d5 uni14D5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d6 uni14D6              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d7 uni14D7              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d8 uni14D8              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14d9 uni14D9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14da uni14DA              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14db uni14DB              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14dc uni14DC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14dd uni14DD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14de uni14DE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14df uni14DF              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e0 uni14E0              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e1 uni14E1              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e2 uni14E2              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e3 uni14E3              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e4 uni14E4              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e5 uni14E5              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e6 uni14E6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e7 uni14E7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e8 uni14E8              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14e9 uni14E9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ea uni14EA              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ec uni14EC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ed uni14ED              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ee uni14EE              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ef uni14EF              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f0 uni14F0              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f1 uni14F1              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f2 uni14F2              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f3 uni14F3              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f4 uni14F4              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f5 uni14F5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f6 uni14F6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f7 uni14F7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f8 uni14F8              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14f9 uni14F9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14fa uni14FA              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14fb uni14FB              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14fc uni14FC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14fd uni14FD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14fe uni14FE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+14ff uni14FF              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1500 uni1500              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1501 uni1501              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1502 uni1502              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1503 uni1503              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1504 uni1504              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1505 uni1505              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1506 uni1506              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1507 uni1507              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1510 uni1510              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1511 uni1511              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1512 uni1512              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1513 uni1513              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1514 uni1514              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1515 uni1515              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1516 uni1516              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1517 uni1517              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1518 uni1518              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1519 uni1519              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+151a uni151A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+151b uni151B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+151c uni151C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+151d uni151D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+151e uni151E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+151f uni151F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1520 uni1520              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1521 uni1521              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1522 uni1522              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1523 uni1523              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1524 uni1524              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1525 uni1525              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1526 uni1526              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1527 uni1527              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1528 uni1528              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1529 uni1529              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+152a uni152A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+152b uni152B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+152c uni152C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+152d uni152D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+152e uni152E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+152f uni152F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1530 uni1530              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1531 uni1531              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1532 uni1532              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1533 uni1533              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1534 uni1534              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1535 uni1535              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1536 uni1536              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1537 uni1537              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1538 uni1538              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1539 uni1539              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+153a uni153A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+153b uni153B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+153c uni153C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+153d uni153D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+153e uni153E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1540 uni1540              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1541 uni1541              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1542 uni1542              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1543 uni1543              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1544 uni1544              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1545 uni1545              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1546 uni1546              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1547 uni1547              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1548 uni1548              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1549 uni1549              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+154a uni154A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+154b uni154B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+154c uni154C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+154d uni154D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+154e uni154E              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+154f uni154F              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1550 uni1550              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1552 uni1552              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1553 uni1553              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1554 uni1554              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1555 uni1555              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1556 uni1556              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1557 uni1557              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1558 uni1558              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1559 uni1559              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+155a uni155A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+155b uni155B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+155c uni155C              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+155d uni155D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+155e uni155E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+155f uni155F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1560 uni1560              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1561 uni1561              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1562 uni1562              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1563 uni1563              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1564 uni1564              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1565 uni1565              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1566 uni1566              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1567 uni1567              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1568 uni1568              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1569 uni1569              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+156a uni156A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1574 uni1574              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1575 uni1575              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1576 uni1576              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1577 uni1577              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1578 uni1578              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1579 uni1579              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+157a uni157A              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+157b uni157B              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+157c uni157C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+157d uni157D              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+157e uni157E              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+157f uni157F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1580 uni1580              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1581 uni1581              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1582 uni1582              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1583 uni1583              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1584 uni1584              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1585 uni1585              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+158a uni158A              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+158b uni158B              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+158c uni158C              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+158d uni158D              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+158e uni158E              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+158f uni158F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1590 uni1590              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1591 uni1591              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1592 uni1592              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1593 uni1593              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1594 uni1594              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1595 uni1595              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1596 uni1596              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a0 uni15A0              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a1 uni15A1              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a2 uni15A2              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a3 uni15A3              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a4 uni15A4              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a5 uni15A5              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a6 uni15A6              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a7 uni15A7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a8 uni15A8              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15a9 uni15A9              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15aa uni15AA              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15ab uni15AB              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15ac uni15AC              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15ad uni15AD              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15ae uni15AE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15af uni15AF              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15de uni15DE              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+15e1 uni15E1              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1646 uni1646              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1647 uni1647              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+166e uni166E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+166f uni166F              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1670 uni1670              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1671 uni1671              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1672 uni1672              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1673 uni1673              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1674 uni1674              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1675 uni1675              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1676 uni1676              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1680 uni1680              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1681 uni1681              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1682 uni1682              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1683 uni1683              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1684 uni1684              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1685 uni1685              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1686 uni1686              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1687 uni1687              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1688 uni1688              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1689 uni1689              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+168a uni168A              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+168b uni168B              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+168c uni168C              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+168d uni168D              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+168e uni168E              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+168f uni168F              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1690 uni1690              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1691 uni1691              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1692 uni1692              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1693 uni1693              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1694 uni1694              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1695 uni1695              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1696 uni1696              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1697 uni1697              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1698 uni1698              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1699 uni1699              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+169a uni169A              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+169b uni169B              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+169c uni169C              2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight)
+U+1d00 uni1D00              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d01 uni1D01              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d02 uni1D02              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1d03 uni1D03              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d04 uni1D04              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d05 uni1D05              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d06 uni1D06              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d07 uni1D07              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d08 uni1D08              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+1d09 uni1D09              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1d0a uni1D0A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d0b uni1D0B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d0c uni1D0C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d0d uni1D0D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d0e uni1D0E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d0f uni1D0F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d10 uni1D10              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d11 uni1D11              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d12 uni1D12              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d13 uni1D13              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d14 uni1D14              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1d15 uni1D15              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d16 uni1D16              2.3
+U+1d17 uni1D17              2.3
+U+1d18 uni1D18              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d19 uni1D19              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d1a uni1D1A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d1b uni1D1B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d1c uni1D1C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d1d uni1D1D              2.3
+U+1d1e uni1D1E              2.3
+U+1d1f uni1D1F              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+1d20 uni1D20              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d21 uni1D21              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d22 uni1D22              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d23 uni1D23              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d24 uni1D24              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d25 uni1D25              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d26 uni1D26              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d27 uni1D27              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d28 uni1D28              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d29 uni1D29              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d2a uni1D2A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d2b uni1D2B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d2c uni1D2C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d2d uni1D2D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d2e uni1D2E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d2f uni1D2F              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d30 uni1D30              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d31 uni1D31              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d32 uni1D32              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d33 uni1D33              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d34 uni1D34              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d35 uni1D35              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d36 uni1D36              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d37 uni1D37              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d38 uni1D38              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d39 uni1D39              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d3a uni1D3A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d3b uni1D3B              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d3c uni1D3C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d3d uni1D3D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d3e uni1D3E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d3f uni1D3F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d40 uni1D40              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d41 uni1D41              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d42 uni1D42              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d43 uni1D43              2.3
+U+1d44 uni1D44              2.3
+U+1d45 uni1D45              2.3
+U+1d46 uni1D46              2.3
+U+1d47 uni1D47              2.3
+U+1d48 uni1D48              2.3
+U+1d49 uni1D49              2.3
+U+1d4a uni1D4A              2.3
+U+1d4b uni1D4B              2.3
+U+1d4c uni1D4C              2.3
+U+1d4d uni1D4D              2.3
+U+1d4e uni1D4E              2.3
+U+1d4f uni1D4F              2.3
+U+1d50 uni1D50              2.3
+U+1d51 uni1D51              2.3
+U+1d52 uni1D52              2.3
+U+1d53 uni1D53              2.3
+U+1d54 uni1D54              2.3
+U+1d55 uni1D55              2.3
+U+1d56 uni1D56              2.3
+U+1d57 uni1D57              2.3
+U+1d58 uni1D58              2.3
+U+1d59 uni1D59              2.3
+U+1d5a uni1D5A              2.3
+U+1d5b uni1D5B              2.3
+U+1d5c uni1D5C              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d5d uni1D5D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d5e uni1D5E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d5f uni1D5F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d60 uni1D60              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d61 uni1D61              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d62 uni1D62              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d63 uni1D63              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d64 uni1D64              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d65 uni1D65              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d66 uni1D66              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d67 uni1D67              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d68 uni1D68              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d69 uni1D69              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d6a uni1D6A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d6b uni1D6B              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1d77 uni1D77              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1d78 uni1D78              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1d7b uni1D7B              2.3
+U+1d7d uni1D7D              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d85 uni1D85              2.3
+U+1d9b uni1D9B              2.3
+U+1d9c uni1D9C              2.3
+U+1d9d uni1D9D              2.3
+U+1d9e uni1D9E              2.3
+U+1d9f uni1D9F              2.3
+U+1da0 uni1DA0              2.3
+U+1da1 uni1DA1              2.3
+U+1da2 uni1DA2              2.3
+U+1da3 uni1DA3              2.3
+U+1da4 uni1DA4              2.3
+U+1da5 uni1DA5              2.3
+U+1da6 uni1DA6              2.3
+U+1da7 uni1DA7              2.3
+U+1da8 uni1DA8              2.3
+U+1da9 uni1DA9              2.3
+U+1daa uni1DAA              2.3
+U+1dab uni1DAB              2.3
+U+1dac uni1DAC              2.3
+U+1dad uni1DAD              2.3
+U+1dae uni1DAE              2.3
+U+1daf uni1DAF              2.3
+U+1db0 uni1DB0              2.3
+U+1db1 uni1DB1              2.3
+U+1db2 uni1DB2              2.3
+U+1db3 uni1DB3              2.3
+U+1db4 uni1DB4              2.3
+U+1db5 uni1DB5              2.3
+U+1db6 uni1DB6              2.3
+U+1db7 uni1DB7              2.3
+U+1db8 uni1DB8              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1db9 uni1DB9              2.3
+U+1dba uni1DBA              2.3
+U+1dbb uni1DBB              2.3
+U+1dbc uni1DBC              2.3
+U+1dbd uni1DBD              2.3
+U+1dbe uni1DBE              2.3
+U+1dbf uni1DBF              2.3
+U+1dc4 uni1DC4              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1dc5 uni1DC5              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1dc6 uni1DC6              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1dc7 uni1DC7              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1dc8 uni1DC8              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1dc9 uni1DC9              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1e00 uni1E00              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e01 uni1E01              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e02 uni1E02              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e03 uni1E03              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e04 uni1E04              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e05 uni1E05              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e06 uni1E06              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e07 uni1E07              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e08 uni1E08              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e09 uni1E09              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e0a uni1E0A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e0b uni1E0B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e0c uni1E0C              2.1
+U+1e0d uni1E0D              2.1
+U+1e0e uni1E0E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e0f uni1E0F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e10 uni1E10              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e11 uni1E11              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e12 uni1E12              1.13
+U+1e13 uni1E13              1.13
+U+1e14 uni1E14              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e15 uni1E15              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e16 uni1E16              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e17 uni1E17              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e18 uni1E18              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e19 uni1E19              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e1a uni1E1A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e1b uni1E1B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e1c uni1E1C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1e1d uni1E1D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+1e1e uni1E1E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e1f uni1E1F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e20 uni1E20              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e21 uni1E21              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e22 uni1E22              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e23 uni1E23              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e24 uni1E24              2.1
+U+1e25 uni1E25              2.1
+U+1e26 uni1E26              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e27 uni1E27              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e28 uni1E28              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e29 uni1E29              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e2a uni1E2A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e2b uni1E2B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e2c uni1E2C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e2d uni1E2D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e2e uni1E2E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e2f uni1E2F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e30 uni1E30              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e31 uni1E31              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e32 uni1E32              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e33 uni1E33              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e34 uni1E34              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e35 uni1E35              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e36 uni1E36              2.1
+U+1e37 uni1E37              2.1
+U+1e38 uni1E38              2.1
+U+1e39 uni1E39              2.1
+U+1e3a uni1E3A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e3b uni1E3B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e3c uni1E3C              1.13
+U+1e3d uni1E3D              1.13
+U+1e3e uni1E3E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e3f uni1E3F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e40 uni1E40              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e41 uni1E41              2.1
+U+1e42 uni1E42              2.1
+U+1e43 uni1E43              2.1
+U+1e44 uni1E44              1.13
+U+1e45 uni1E45              1.13
+U+1e46 uni1E46              2.1
+U+1e47 uni1E47              2.1
+U+1e48 uni1E48              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e49 uni1E49              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e4a uni1E4A              1.13
+U+1e4b uni1E4B              1.13
+U+1e4c uni1E4C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1e4d uni1E4D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1e4e uni1E4E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e4f uni1E4F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e50 uni1E50              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e51 uni1E51              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e52 uni1E52              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e53 uni1E53              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e54 uni1E54              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e55 uni1E55              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e56 uni1E56              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e57 uni1E57              2.1
+U+1e58 uni1E58              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e59 uni1E59              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e5a uni1E5A              2.1
+U+1e5b uni1E5B              2.1
+U+1e5c uni1E5C              2.1
+U+1e5d uni1E5D              2.1
+U+1e5e uni1E5E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e5f uni1E5F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e60 uni1E60              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e61 uni1E61              2.1
+U+1e62 uni1E62              2.1
+U+1e63 uni1E63              2.1
+U+1e64 uni1E64              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e65 uni1E65              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e66 uni1E66              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e67 uni1E67              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e68 uni1E68              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e69 uni1E69              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e6a uni1E6A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e6b uni1E6B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e6c uni1E6C              2.1
+U+1e6d uni1E6D              2.1
+U+1e6e uni1E6E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e6f uni1E6F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e70 uni1E70              1.13
+U+1e71 uni1E71              1.13
+U+1e72 uni1E72              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e73 uni1E73              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e74 uni1E74              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e75 uni1E75              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e76 uni1E76              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e77 uni1E77              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e78 uni1E78              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e79 uni1E79              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e7a uni1E7A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e7b uni1E7B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e7c uni1E7C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e7d uni1E7D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e7e uni1E7E              2.1
+U+1e7f uni1E7F              2.1
+U+1e80 Wgrave               1.2
+U+1e81 wgrave               1.2
+U+1e82 Wacute               1.2
+U+1e83 wacute               1.2
+U+1e84 Wdieresis            1.2
+U+1e85 wdieresis            1.2
+U+1e86 uni1E86              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e87 uni1E87              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e88 uni1E88              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e89 uni1E89              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e8a uni1E8A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e8b uni1E8B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e8c uni1E8C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e8d uni1E8D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e8e uni1E8E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e8f uni1E8F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e90 uni1E90              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e91 uni1E91              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e92 uni1E92              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e93 uni1E93              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e94 uni1E94              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e95 uni1E95              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e96 uni1E96              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e97 uni1E97              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e98 uni1E98              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e99 uni1E99              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1e9a uni1E9A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1e9b uni1E9B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1e9c uni1E9C              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e9d uni1E9D              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1e9e uni1E9E              2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) 2.32 (Sans ExtraLight)
+U+1e9f uni1E9F              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1ea0 uni1EA0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ea1 uni1EA1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ea2 uni1EA2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ea3 uni1EA3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ea4 uni1EA4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ea5 uni1EA5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ea6 uni1EA6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ea7 uni1EA7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ea8 uni1EA8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ea9 uni1EA9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eaa uni1EAA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eab uni1EAB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eac uni1EAC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1ead uni1EAD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1eae uni1EAE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1eaf uni1EAF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1eb0 uni1EB0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1eb1 uni1EB1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1eb2 uni1EB2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1eb3 uni1EB3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1eb4 uni1EB4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1eb5 uni1EB5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1eb6 uni1EB6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1eb7 uni1EB7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1eb8 uni1EB8              2.2
+U+1eb9 uni1EB9              2.2
+U+1eba uni1EBA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ebb uni1EBB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ebc uni1EBC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ebd uni1EBD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ebe uni1ebe              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ebf uni1ebF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ec0 uni1EC0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ec1 uni1EC1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ec2 uni1EC2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ec3 uni1EC3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ec4 uni1EC4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ec5 uni1EC5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ec6 uni1EC6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1ec7 uni1EC7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1ec8 uni1EC8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ec9 uni1EC9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1eca uni1ECA              2.2
+U+1ecb uni1ECB              2.2
+U+1ecc uni1ECC              2.2
+U+1ecd uni1ECD              2.2
+U+1ece uni1ECE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ecf uni1ECF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ed0 uni1ED0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed1 uni1ED1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed2 uni1ED2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed3 uni1ED3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed4 uni1ED4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed5 uni1ED5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed6 uni1ED6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed7 uni1ED7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ed8 uni1ED8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1ed9 uni1ED9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+1eda uni1EDA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1edb uni1EDB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1edc uni1EDC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1edd uni1EDD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ede uni1EDE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1edf uni1EDF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ee0 uni1EE0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ee1 uni1EE1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ee2 uni1EE2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ee3 uni1EE3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ee4 uni1EE4              2.2
+U+1ee5 uni1EE5              2.2
+U+1ee6 uni1EE6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ee7 uni1EE7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ee8 uni1EE8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ee9 uni1EE9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eea uni1EEA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eeb uni1EEB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eec uni1EEC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eed uni1EED              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eee uni1EEE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1eef uni1EEF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ef0 uni1EF0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ef1 uni1EF1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1ef2 Ygrave               1.2
+U+1ef3 ygrave               1.2
+U+1ef4 uni1EF4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ef5 uni1EF5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ef6 uni1EF6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ef7 uni1EF7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ef8 uni1EF8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ef9 uni1EF9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1efa uni1EFA              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1efb uni1EFB              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+1f00 uni1F00              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f01 uni1F01              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f02 uni1F02              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f03 uni1F03              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f04 uni1F04              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f05 uni1F05              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f06 uni1F06              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f07 uni1F07              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f08 uni1F08              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f09 uni1F09              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f0a uni1F0A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f0b uni1F0B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f0c uni1F0C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f0d uni1F0D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f0e uni1F0E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f0f uni1F0F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f10 uni1F10              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f11 uni1F11              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f12 uni1F12              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f13 uni1F13              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f14 uni1F14              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f15 uni1F15              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f18 uni1F18              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f19 uni1F19              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f1a uni1F1A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f1b uni1F1B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f1c uni1F1C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f1d uni1F1D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f20 uni1F20              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f21 uni1F21              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f22 uni1F22              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f23 uni1F23              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f24 uni1F24              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f25 uni1F25              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f26 uni1F26              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f27 uni1F27              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f28 uni1F28              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f29 uni1F29              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f2a uni1F2A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f2b uni1F2B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f2c uni1F2C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f2d uni1F2D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f2e uni1F2E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f2f uni1F2F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f30 uni1F30              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f31 uni1F31              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f32 uni1F32              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f33 uni1F33              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f34 uni1F34              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f35 uni1F35              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f36 uni1F36              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f37 uni1F37              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f38 uni1F38              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f39 uni1F39              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f3a uni1F3A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f3b uni1F3B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f3c uni1F3C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f3d uni1F3D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f3e uni1F3E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f3f uni1F3F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f40 uni1F40              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f41 uni1F41              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f42 uni1F42              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f43 uni1F43              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f44 uni1F44              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f45 uni1F45              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f48 uni1F48              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f49 uni1F49              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f4a uni1F4A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f4b uni1F4B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f4c uni1F4C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f4d uni1F4D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f50 uni1F50              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f51 uni1F51              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f52 uni1F52              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f53 uni1F53              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f54 uni1F54              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f55 uni1F55              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f56 uni1F56              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f57 uni1F57              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f59 uni1F59              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f5b uni1F5B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f5d uni1F5D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f5f uni1F5F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f60 uni1F60              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f61 uni1F61              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f62 uni1F62              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f63 uni1F63              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f64 uni1F64              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f65 uni1F65              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f66 uni1F66              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f67 uni1F67              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f68 uni1F68              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f69 uni1F69              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f6a uni1F6A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f6b uni1F6B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f6c uni1F6C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f6d uni1F6D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f6e uni1F6E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f6f uni1F6F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f70 uni1F70              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f71 uni1F71              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f72 uni1F72              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f73 uni1F73              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f74 uni1F74              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f75 uni1F75              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f76 uni1F76              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f77 uni1F77              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f78 uni1F78              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f79 uni1F79              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1f7a uni1F7A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f7b uni1F7B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f7c uni1F7C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f7d uni1F7D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f80 uni1F80              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f81 uni1F81              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f82 uni1F82              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f83 uni1F83              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f84 uni1F84              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f85 uni1F85              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f86 uni1F86              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f87 uni1F87              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f88 uni1F88              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f89 uni1F89              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f8a uni1F8A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f8b uni1F8B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f8c uni1F8C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f8d uni1F8D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f8e uni1F8E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f8f uni1F8F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f90 uni1F90              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f91 uni1F91              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f92 uni1F92              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f93 uni1F93              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f94 uni1F94              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f95 uni1F95              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f96 uni1F96              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f97 uni1F97              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f98 uni1F98              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f99 uni1F99              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f9a uni1F9A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f9b uni1F9B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f9c uni1F9C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f9d uni1F9D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f9e uni1F9E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1f9f uni1F9F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa0 uni1FA0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa1 uni1FA1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa2 uni1FA2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa3 uni1FA3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa4 uni1FA4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa5 uni1FA5              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa6 uni1FA6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa7 uni1FA7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa8 uni1FA8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fa9 uni1FA9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1faa uni1FAA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fab uni1FAB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fac uni1FAC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fad uni1FAD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fae uni1FAE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1faf uni1FAF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb0 uni1FB0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb1 uni1FB1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb2 uni1FB2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb3 uni1FB3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb4 uni1FB4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb6 uni1FB6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb7 uni1FB7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fb8 uni1FB8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fb9 uni1FB9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fba uni1FBA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fbb uni1FBB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fbc uni1FBC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fbd uni1FBD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fbe uni1FBE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fbf uni1FBF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fc0 uni1FC0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fc1 uni1FC1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fc2 uni1FC2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fc3 uni1FC3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fc4 uni1FC4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fc6 uni1FC6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fc7 uni1FC7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fc8 uni1FC8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fc9 uni1FC9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fca uni1FCA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fcb uni1FCB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fcc uni1FCC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fcd uni1FCD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fce uni1FCE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fcf uni1FCF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fd0 uni1FD0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fd1 uni1FD1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fd2 uni1FD2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fd3 uni1FD3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fd6 uni1FD6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fd7 uni1FD7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fd8 uni1FD8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fd9 uni1FD9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fda uni1FDA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fdb uni1FDB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fdd uni1FDD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fde uni1FDE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fdf uni1FDF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe0 uni1FE0              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe1 uni1FE1              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe2 uni1FE2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe3 uni1FE3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe4 uni1FE4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe5 uni1FE5              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe6 uni1FE6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe7 uni1FE7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fe8 uni1FE8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fe9 uni1FE9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fea uni1FEA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1feb uni1FEB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fec uni1FEC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1fed uni1FED              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fee uni1FEE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1fef uni1FEF              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ff2 uni1FF2              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ff3 uni1FF3              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ff4 uni1FF4              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ff6 uni1FF6              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ff7 uni1FF7              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ff8 uni1FF8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ff9 uni1FF9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ffa uni1FFA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ffb uni1FFB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ffc uni1FFC              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+1ffd uni1FFD              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+1ffe uni1FFE              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+2000 uni2000              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2001 uni2001              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2002 uni2002              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2003 uni2003              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2004 uni2004              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2005 uni2005              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2006 uni2006              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2007 uni2007              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2008 uni2008              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2009 uni2009              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+200a uni200A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+200b uni200B              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+200c uni200C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+200d uni200D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+200e uni200E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+200f uni200F              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2010 uni2010              1.5
+U+2011 uni2011              1.5
+U+2012 figuredash           1.5
+U+2013 endash               original
+U+2014 emdash               original
+U+2015 uni2015              1.5
+U+2016 uni2016              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2017 underscoredbl        2.3
+U+2018 quoteleft            original
+U+2019 quoteright           original
+U+201a quotesinglbase       original
+U+201b quotereversed        2.3
+U+201c quotedblleft         original
+U+201d quotedblright        original
+U+201e quotedblbase         original
+U+201f uni201F              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+2020 dagger               original
+U+2021 daggerdbl            original
+U+2022 bullet               original
+U+2023 uni2023              2.2
+U+2024 onedotenleader       2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2025 twodotenleader       2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2026 ellipsis             original
+U+2027 uni2027              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2028 uni2028              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2029 uni2029              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+202a uni202A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+202b uni202B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+202c uni202C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+202d uni202D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+202e uni202E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+202f uni202F              2.11 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.23 (Serif Italic Condensed)
+U+2030 perthousand          original
+U+2031 uni2031              2.1
+U+2032 minute               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2033 second               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2034 uni2034              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2035 uni2035              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2036 uni2036              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2037 uni2037              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2038 uni2038              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2039 guilsinglleft        original
+U+203a guilsinglright       original
+U+203b uni203B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+203c exclamdbl            2.0
+U+203d uni203D              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.11 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.14 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+203e uni203E              2.3
+U+203f uni203F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2040 uni2040              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2041 uni2041              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2042 uni2042              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2043 uni2043              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2044 fraction             2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2045 uni2045              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2046 uni2046              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2047 uni2047              2.0
+U+2048 uni2048              2.0
+U+2049 uni2049              2.0
+U+204a uni204A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+204b uni204B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) 2.33 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+204c uni204C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+204d uni204D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+204e uni204E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+204f uni204F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2050 uni2050              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2051 uni2051              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2052 uni2052              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2053 uni2053              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2054 uni2054              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2055 uni2055              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2056 uni2056              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2057 uni2057              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2058 uni2058              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2059 uni2059              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+205a uni205A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+205b uni205B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+205c uni205C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+205d uni205D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+205e uni205E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+205f uni205F              2.14
+U+2060 uni2060              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2061 uni2061              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2062 uni2062              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2063 uni2063              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2064 uni2064              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+206a uni206A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+206b uni206B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+206c uni206C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+206d uni206D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+206e uni206E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+206f uni206F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2070 uni2070              2.2
+U+2071 uni2071              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2074 uni2074              2.2
+U+2075 uni2075              2.2
+U+2076 uni2076              2.2
+U+2077 uni2077              2.2
+U+2078 uni2078              2.2
+U+2079 uni2079              2.2
+U+207a uni207A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+207b uni207B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+207c uni207C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+207d uni207D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+207e uni207E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+207f uni207F              1.14
+U+2080 uni2080              2.4
+U+2081 uni2081              2.4
+U+2082 uni2082              2.4
+U+2083 uni2083              2.4
+U+2084 uni2084              2.4
+U+2085 uni2085              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2086 uni2086              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2087 uni2087              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2088 uni2088              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2089 uni2089              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+208a uni208A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+208b uni208B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+208c uni208C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+208d uni208D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+208e uni208E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2090 uni2090              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2091 uni2091              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2092 uni2092              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2093 uni2093              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2094 uni2094              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2095 uni2095              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2096 uni2096              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2097 uni2097              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2098 uni2098              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2099 uni2099              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+209a uni209A              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+209b uni209B              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+209c uni209C              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+20a0 uni20A0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a1 colonmonetary        2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a2 uni20A2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a3 franc                2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a4 lira                 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a5 uni20A5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a6 uni20A6              2.3
+U+20a7 peseta               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a8 uni20A8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20a9 uni20A9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20aa uni20AA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20ab dong                 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20ac Euro                 original
+U+20ad uni20AD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20ae uni20AE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20af uni20AF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20b0 uni20B0              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20b1 uni20B1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+20b2 uni20B2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20b3 uni20B3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+20b4 uni20B4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+20b5 uni20B5              2.2
+U+20b8 uni20B8              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+20b9 uni20B9              2.32
+U+20d0 uni20D0              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+20d1 uni20D1              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+20d6 uni20D6              2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+20d7 uni20D7              2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+20db uni20DB              2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+20dc uni20DC              2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+20e1 uni20E1              2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2100 uni2100              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2101 uni2101              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2102 uni2102              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.16 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Condensed)
+U+2103 uni2103              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2104 uni2104              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2105 uni2105              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2106 uni2106              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2107 uni2107              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2108 uni2108              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2109 uni2109              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+210b uni210B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+210c uni210C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+210d uni210D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+210e uni210E              2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight)
+U+210f uni210F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.28 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2110 uni2110              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2111 Ifraktur             2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2112 uni2112              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2113 uni2113              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2114 uni2114              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2115 uni2115              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2116 uni2116              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2117 uni2117              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2118 weierstrass          2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2119 uni2119              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+211a uni211A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+211b uni211B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+211c Rfraktur             2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+211d uni211D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+211e prescription         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+211f uni211F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2120 uni2120              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2121 uni2121              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2122 trademark            original
+U+2123 uni2123              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2124 uni2124              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2125 uni2125              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2126 uni2126              2.2
+U+2127 uni2127              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2128 uni2128              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2129 uni2129              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+212a uni212A              2.2
+U+212b uni212B              2.2
+U+212c uni212C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+212d uni212D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+212e estimated            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+212f uni212F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2130 uni2130              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2131 uni2131              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2132 uni2132              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight)
+U+2133 uni2133              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2134 uni2134              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2135 aleph                2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2136 uni2136              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2137 uni2137              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2138 uni2138              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2139 uni2139              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+213a uni213A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+213b uni213B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+213c uni213C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+213d uni213D              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+213e uni213E              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+213f uni213F              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+2140 uni2140              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+2141 uni2141              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2142 uni2142              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2143 uni2143              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2144 uni2144              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2145 uni2145              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+2146 uni2146              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+2147 uni2147              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+2148 uni2148              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+2149 uni2149              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed)
+U+214b uni214B              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+214e uni214E              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2150 uni2150              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2151 uni2151              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2152 uni2152              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2153 onethird             2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2154 twothirds            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2155 uni2155              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2156 uni2156              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2157 uni2157              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2158 uni2158              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2159 uni2159              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+215a uni215A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+215b oneeighth            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+215c threeeighths         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+215d fiveeighths          2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+215e seveneighths         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+215f uni215F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2160 uni2160              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2161 uni2161              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2162 uni2162              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2163 uni2163              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2164 uni2164              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2165 uni2165              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2166 uni2166              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2167 uni2167              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2168 uni2168              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2169 uni2169              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+216a uni216A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+216b uni216B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+216c uni216C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+216d uni216D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+216e uni216E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+216f uni216F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2170 uni2170              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2171 uni2171              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2172 uni2172              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2173 uni2173              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2174 uni2174              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2175 uni2175              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2176 uni2176              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2177 uni2177              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2178 uni2178              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2179 uni2179              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+217a uni217A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+217b uni217B              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+217c uni217C              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+217d uni217D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+217e uni217E              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+217f uni217F              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2180 uni2180              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2181 uni2181              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+2182 uni2182              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans ExtraLight)
+U+2183 uni2183              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2184 uni2184              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2185 uni2185              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2189 uni2189              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2190 arrowleft            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2191 arrowup              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2192 arrowright           2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2193 arrowdown            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2194 arrowboth            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2195 arrowupdn            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2196 uni2196              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2197 uni2197              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2198 uni2198              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2199 uni2199              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+219a uni219A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+219b uni219B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+219c uni219C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+219d uni219D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+219e uni219E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+219f uni219F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a0 uni21A0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a1 uni21A1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a2 uni21A2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a3 uni21A3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a4 uni21A4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a5 uni21A5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a6 uni21A6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a7 uni21A7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a8 arrowupdnbse         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21a9 uni21A9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21aa uni21AA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ab uni21AB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ac uni21AC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ad uni21AD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ae uni21AE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21af uni21AF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b0 uni21B0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b1 uni21B1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b2 uni21B2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b3 uni21B3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b4 uni21B4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b5 carriagereturn       2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b6 uni21B6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b7 uni21B7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b8 uni21B8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21b9 uni21B9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ba uni21BA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21bb uni21BB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21bc uni21BC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21bd uni21BD              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21be uni21BE              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21bf uni21BF              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c0 uni21C0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c1 uni21C1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c2 uni21C2              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c3 uni21C3              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c4 uni21C4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c5 uni21C5              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c6 uni21C6              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c7 uni21C7              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c8 uni21C8              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21c9 uni21C9              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ca uni21CA              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21cb uni21CB              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21cc uni21CC              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21cd uni21CD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ce uni21CE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21cf uni21CF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d0 arrowdblleft         2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d1 arrowdblup           2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d2 arrowdblright        2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d3 arrowdbldown         2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d4 arrowdblboth         2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d5 uni21D5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d6 uni21D6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d7 uni21D7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d8 uni21D8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21d9 uni21D9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21da uni21DA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21db uni21DB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21dc uni21DC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21dd uni21DD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21de uni21DE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21df uni21DF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e0 uni21E0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e1 uni21E1              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e2 uni21E2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e3 uni21E3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e4 uni21E4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e5 uni21E5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e6 uni21E6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e7 uni21E7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e8 uni21E8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21e9 uni21E9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ea uni21EA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21eb uni21EB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ec uni21EC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ed uni21ED              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ee uni21EE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ef uni21EF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f0 uni21F0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f1 uni21F1              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f2 uni21F2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f3 uni21F3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f4 uni21F4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f5 uni21F5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f6 uni21F6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f7 uni21F7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f8 uni21F8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21f9 uni21F9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21fa uni21FA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21fb uni21FB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21fc uni21FC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21fd uni21FD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21fe uni21FE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+21ff uni21FF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2200 universal            2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2201 uni2201              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2202 partialdiff          original
+U+2203 existential          2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2204 uni2204              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2205 emptyset             2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2206 Delta                original
+U+2207 gradient             2.1
+U+2208 element              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2209 notelement           2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+220a uni220A              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+220b suchthat             2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+220c uni220C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+220d uni220D              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+220e uni220E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+220f product              original
+U+2210 uni2210              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2211 summation            original
+U+2212 minus                original
+U+2213 uni2213              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2214 uni2214              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2215 uni2215              original
+U+2216 uni2216              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2217 asteriskmath         2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2218 uni2218              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2219 uni2219              original
+U+221a radical              original
+U+221b uni221B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+221c uni221C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+221d proportional         2.1
+U+221e infinity             original
+U+221f orthogonal           2.1
+U+2220 angle                2.3
+U+2221 uni2221              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2222 uni2222              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2223 uni2223              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2224 uni2224              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2225 uni2225              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2226 uni2226              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2227 logicaland           2.1
+U+2228 logicalor            2.1
+U+2229 intersection         2.1
+U+222a union                2.1
+U+222b integral             original
+U+222c uni222C              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+222d uni222D              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+222e uni222E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+222f uni222F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2230 uni2230              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2231 uni2231              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2232 uni2232              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2233 uni2233              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2234 therefore            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2235 uni2235              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2236 uni2236              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2237 uni2237              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2238 uni2238              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2239 uni2239              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+223a uni223A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+223b uni223B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+223c similar              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+223d uni223D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+223e uni223E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+223f uni223F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2240 uni2240              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2241 uni2241              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2242 uni2242              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2243 uni2243              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2244 uni2244              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2245 congruent            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2246 uni2246              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2247 uni2247              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2248 approxequal          original
+U+2249 uni2249              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+224a uni224A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+224b uni224B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+224c uni224C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+224d uni224D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+224e uni224E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+224f uni224F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2250 uni2250              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2251 uni2251              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2252 uni2252              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2253 uni2253              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2254 uni2254              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2255 uni2255              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2256 uni2256              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2257 uni2257              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2258 uni2258              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2259 uni2259              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+225a uni225A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+225b uni225B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+225c uni225C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+225d uni225D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+225e uni225E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+225f uni225F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2260 notequal             original
+U+2261 equivalence          2.1
+U+2262 uni2262              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2263 uni2263              2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2264 lessequal            original
+U+2265 greaterequal         original
+U+2266 uni2266              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2267 uni2267              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2268 uni2268              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2269 uni2269              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+226a uni226A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+226b uni226B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+226c uni226C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+226d uni226D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+226e uni226E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+226f uni226F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2270 uni2270              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2271 uni2271              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2272 uni2272              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2273 uni2273              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2274 uni2274              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2275 uni2275              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2276 uni2276              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2277 uni2277              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2278 uni2278              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2279 uni2279              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+227a uni227A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+227b uni227B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+227c uni227C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+227d uni227D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+227e uni227E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+227f uni227F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2280 uni2280              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2281 uni2281              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2282 propersubset         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2283 propersuperset       2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2284 notsubset            2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2285 uni2285              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2286 reflexsubset         2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2287 reflexsuperset       2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2288 uni2288              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2289 uni2289              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+228a uni228A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+228b uni228B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+228c uni228C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+228d uni228D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+228e uni228E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+228f uni228F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2290 uni2290              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2291 uni2291              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2292 uni2292              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2293 uni2293              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2294 uni2294              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2295 circleplus           2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2296 uni2296              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2297 circlemultiply       2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2298 uni2298              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2299 uni2299              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+229a uni229A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+229b uni229B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+229c uni229C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+229d uni229D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+229e uni229E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+229f uni229F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22a0 uni22A0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22a1 uni22A1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22a2 uni22A2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+22a3 uni22A3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+22a4 uni22A4              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+22a5 perpendicular        2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.32 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+22a6 uni22A6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22a7 uni22A7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22a8 uni22A8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22a9 uni22A9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22aa uni22AA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22ab uni22AB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22ac uni22AC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22ad uni22AD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22ae uni22AE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22af uni22AF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22b0 uni22B0              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b1 uni22B1              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b2 uni22B2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b3 uni22B3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b4 uni22B4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b5 uni22B5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b6 uni22B6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b7 uni22B7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b8 uni22B8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22b9 uni22B9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22ba uni22BA              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22bb uni22BB              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22bc uni22BC              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22bd uni22BD              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22be uni22BE              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+22bf uni22BF              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+22c0 uni22C0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22c1 uni22C1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22c2 uni22C2              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22c3 uni22C3              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22c4 uni22C4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22c5 dotmath              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+22c6 uni22C6              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+22c7 uni22C7              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22c8 uni22C8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22c9 uni22C9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22ca uni22CA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22cb uni22CB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22cc uni22CC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22cd uni22CD              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+22ce uni22CE              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22cf uni22CF              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d0 uni22D0              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d1 uni22D1              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d2 uni22D2              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d3 uni22D3              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d4 uni22D4              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d5 uni22D5              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d6 uni22D6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d7 uni22D7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22d8 uni22D8              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+22d9 uni22D9              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+22da uni22DA              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+22db uni22DB              2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+22dc uni22DC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22dd uni22DD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22de uni22DE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22df uni22DF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e0 uni22E0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e1 uni22E1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e2 uni22E2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e3 uni22E3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e4 uni22E4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e5 uni22E5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e6 uni22E6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e7 uni22E7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e8 uni22E8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22e9 uni22E9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+22ea uni22EA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22eb uni22EB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22ec uni22EC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22ed uni22ED              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22ee uni22EE              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22ef uni22EF              2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f0 uni22F0              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f1 uni22F1              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f2 uni22F2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f3 uni22F3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f4 uni22F4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f5 uni22F5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f6 uni22F6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f7 uni22F7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f8 uni22F8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22f9 uni22F9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22fa uni22FA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22fb uni22FB              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22fc uni22FC              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22fd uni22FD              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22fe uni22FE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+22ff uni22FF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2300 uni2300              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2301 uni2301              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2302 house                1.14
+U+2303 uni2303              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2304 uni2304              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2305 uni2305              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2306 uni2306              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2307 uni2307              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2308 uni2308              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2309 uni2309              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+230a uni230A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+230b uni230B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+230c uni230C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+230d uni230D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+230e uni230E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+230f uni230F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2310 revlogicalnot        1.14
+U+2311 uni2311              1.15
+U+2312 uni2312              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2313 uni2313              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2314 uni2314              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2315 uni2315              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2318 uni2318              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2319 uni2319              1.14
+U+231c uni231C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+231d uni231D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+231e uni231E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+231f uni231F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2320 integraltp           2.3
+U+2321 integralbt           2.3
+U+2324 uni2324              2.16 (Sans, Sans Bold, Sans Bold Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) 2.19 (Sans Condensed Oblique, Sans Oblique)
+U+2325 uni2325              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2326 uni2326              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2327 uni2327              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2328 uni2328              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2329 angleleft            2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic)
+U+232a angleright           2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic)
+U+232b uni232B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+232c uni232C              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2335 uni2335              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2337 uni2337              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2338 uni2338              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2339 uni2339              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+233a uni233A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+233b uni233B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+233c uni233C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+233d uni233D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+233e uni233E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2341 uni2341              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2342 uni2342              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2343 uni2343              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2344 uni2344              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2347 uni2347              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2348 uni2348              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2349 uni2349              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+234b uni234B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+234c uni234C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+234d uni234D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2350 uni2350              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2352 uni2352              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2353 uni2353              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2354 uni2354              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2357 uni2357              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2358 uni2358              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2359 uni2359              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+235a uni235A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+235b uni235B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+235c uni235C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+235e uni235E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+235f uni235F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2360 uni2360              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2363 uni2363              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2364 uni2364              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2365 uni2365              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2368 uni2368              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2369 uni2369              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+236b uni236B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+236c uni236C              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+236d uni236D              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+236e uni236E              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+236f uni236F              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2370 uni2370              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2373 uni2373              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2374 uni2374              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2375 uni2375              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2376 uni2376              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2377 uni2377              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2378 uni2378              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2379 uni2379              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+237a uni237A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+237d uni237D              1.15
+U+2380 uni2380              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2381 uni2381              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2382 uni2382              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2383 uni2383              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2387 uni2387              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2388 uni2388              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2389 uni2389              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+238a uni238A              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+238b uni238B              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+2394 uni2394              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2395 uni2395              2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique)
+U+239b uni239B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+239c uni239C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+239d uni239D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+239e uni239E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+239f uni239F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a0 uni23A0              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a1 uni23A1              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a2 uni23A2              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a3 uni23A3              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a4 uni23A4              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a5 uni23A5              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a6 uni23A6              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a7 uni23A7              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a8 uni23A8              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23a9 uni23A9              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23aa uni23AA              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23ab uni23AB              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23ac uni23AC              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23ad uni23AD              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+23ae uni23AE              2.3
+U+23ce uni23CE              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+23cf uni23CF              2.3
+U+23e3 uni23E3              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+23e5 uni23E5              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+23e8 uni23E8              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2422 uni2422              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2423 uni2423              1.6
+U+2460 uni2460              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2461 uni2461              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2462 uni2462              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2463 uni2463              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2464 uni2464              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2465 uni2465              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2466 uni2466              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2467 uni2467              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2468 uni2468              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2469 uni2469              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2500 SF100000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2501 uni2501              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2502 SF110000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2503 uni2503              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2504 uni2504              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2505 uni2505              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2506 uni2506              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2507 uni2507              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2508 uni2508              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2509 uni2509              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+250a uni250A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+250b uni250B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+250c SF010000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+250d uni250D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+250e uni250E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+250f uni250F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2510 SF030000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2511 uni2511              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2512 uni2512              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2513 uni2513              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2514 SF020000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2515 uni2515              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2516 uni2516              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2517 uni2517              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2518 SF040000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2519 uni2519              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+251a uni251A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+251b uni251B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+251c SF080000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+251d uni251D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+251e uni251E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+251f uni251F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2520 uni2520              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2521 uni2521              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2522 uni2522              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2523 uni2523              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2524 SF090000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2525 uni2525              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2526 uni2526              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2527 uni2527              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2528 uni2528              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2529 uni2529              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+252a uni252A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+252b uni252B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+252c SF060000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+252d uni252D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+252e uni252E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+252f uni252F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2530 uni2530              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2531 uni2531              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2532 uni2532              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2533 uni2533              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2534 SF070000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2535 uni2535              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2536 uni2536              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2537 uni2537              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2538 uni2538              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2539 uni2539              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+253a uni253A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+253b uni253B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+253c SF050000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+253d uni253D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+253e uni253E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+253f uni253F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2540 uni2540              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2541 uni2541              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2542 uni2542              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2543 uni2543              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2544 uni2544              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2545 uni2545              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2546 uni2546              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2547 uni2547              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2548 uni2548              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2549 uni2549              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+254a uni254A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+254b uni254B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+254c uni254C              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+254d uni254D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+254e uni254E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+254f uni254F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2550 SF430000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2551 SF240000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2552 SF510000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2553 SF520000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2554 SF390000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2555 SF220000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2556 SF210000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2557 SF250000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2558 SF500000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2559 SF490000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+255a SF380000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+255b SF280000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+255c SF270000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+255d SF260000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+255e SF360000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+255f SF370000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2560 SF420000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2561 SF190000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2562 SF200000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2563 SF230000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2564 SF470000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2565 SF480000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2566 SF410000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2567 SF450000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2568 SF460000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2569 SF400000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+256a SF540000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+256b SF530000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+256c SF440000             1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+256d uni256D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+256e uni256E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+256f uni256F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2570 uni2570              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2571 uni2571              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2572 uni2572              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2573 uni2573              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2574 uni2574              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2575 uni2575              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2576 uni2576              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2577 uni2577              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2578 uni2578              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2579 uni2579              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+257a uni257A              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+257b uni257B              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+257c uni257C              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+257d uni257D              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+257e uni257E              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+257f uni257F              1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2580 upblock              1.14
+U+2581 uni2581              1.14
+U+2582 uni2582              1.14
+U+2583 uni2583              1.14
+U+2584 dnblock              1.14
+U+2585 uni2585              1.14
+U+2586 uni2586              1.14
+U+2587 uni2587              1.14
+U+2588 block                1.14
+U+2589 uni2589              1.14
+U+258a uni258A              1.14
+U+258b uni258B              1.14
+U+258c lfblock              1.14
+U+258d uni258D              1.14
+U+258e uni258E              1.14
+U+258f uni258F              1.14
+U+2590 rtblock              1.14
+U+2591 ltshade              1.15
+U+2592 shade                1.15
+U+2593 dkshade              1.15
+U+2594 uni2594              1.14
+U+2595 uni2595              1.14
+U+2596 uni2596              1.14
+U+2597 uni2597              1.14
+U+2598 uni2598              1.14
+U+2599 uni2599              1.14
+U+259a uni259A              1.14
+U+259b uni259B              1.14
+U+259c uni259C              1.14
+U+259d uni259D              1.14
+U+259e uni259E              1.14
+U+259f uni259F              1.14
+U+25a0 filledbox            2.3
+U+25a1 H22073               2.3
+U+25a2 uni25A2              2.3
+U+25a3 uni25A3              2.3
+U+25a4 uni25A4              2.3
+U+25a5 uni25A5              2.3
+U+25a6 uni25A6              2.3
+U+25a7 uni25A7              2.3
+U+25a8 uni25A8              2.3
+U+25a9 uni25A9              2.3
+U+25aa H18543               2.3
+U+25ab H18551               2.3
+U+25ac filledrect           2.3
+U+25ad uni25AD              2.3
+U+25ae uni25AE              2.3
+U+25af uni25AF              2.3
+U+25b0 uni25B0              2.3
+U+25b1 uni25B1              2.3
+U+25b2 triagup              2.3
+U+25b3 uni25B3              2.3
+U+25b4 uni25B4              2.3
+U+25b5 uni25B5              2.3
+U+25b6 uni25B6              2.3
+U+25b7 uni25B7              2.3
+U+25b8 uni25B8              2.3
+U+25b9 uni25B9              2.3
+U+25ba triagrt              2.3
+U+25bb uni25BB              2.3
+U+25bc triagdn              2.3
+U+25bd uni25BD              2.3
+U+25be uni25BE              2.3
+U+25bf uni25BF              2.3
+U+25c0 uni25C0              2.3
+U+25c1 uni25C1              2.3
+U+25c2 uni25C2              2.3
+U+25c3 uni25C3              2.3
+U+25c4 triaglf              2.3
+U+25c5 uni25C5              2.3
+U+25c6 uni25C6              2.3
+U+25c7 uni25C7              2.3
+U+25c8 uni25C8              2.3
+U+25c9 uni25C9              2.3
+U+25ca lozenge              original
+U+25cb circle               2.3
+U+25cc uni25CC              2.3
+U+25cd uni25CD              2.3
+U+25ce uni25CE              2.3
+U+25cf H18533               2.3
+U+25d0 uni25D0              2.3
+U+25d1 uni25D1              2.3
+U+25d2 uni25D2              2.3
+U+25d3 uni25D3              2.3
+U+25d4 uni25D4              2.3
+U+25d5 uni25D5              2.3
+U+25d6 uni25D6              2.3
+U+25d7 uni25D7              2.3
+U+25d8 invbullet            2.2
+U+25d9 invcircle            2.3
+U+25da uni25DA              2.3
+U+25db uni25DB              2.3
+U+25dc uni25DC              2.3
+U+25dd uni25DD              2.3
+U+25de uni25DE              2.3
+U+25df uni25DF              2.3
+U+25e0 uni25E0              2.3
+U+25e1 uni25E1              2.3
+U+25e2 uni25E2              2.3
+U+25e3 uni25E3              2.3
+U+25e4 uni25E4              2.3
+U+25e5 uni25E5              2.3
+U+25e6 openbullet           2.2
+U+25e7 uni25E7              2.3
+U+25e8 uni25E8              2.3
+U+25e9 uni25E9              2.3
+U+25ea uni25EA              2.3
+U+25eb uni25EB              2.3
+U+25ec uni25EC              2.3
+U+25ed uni25ED              2.3
+U+25ee uni25EE              2.3
+U+25ef uni25EF              2.3
+U+25f0 uni25F0              2.3
+U+25f1 uni25F1              2.3
+U+25f2 uni25F2              2.3
+U+25f3 uni25F3              2.3
+U+25f4 uni25F4              2.3
+U+25f5 uni25F5              2.3
+U+25f6 uni25F6              2.3
+U+25f7 uni25F7              2.3
+U+25f8 uni25F8              2.3
+U+25f9 uni25F9              2.3
+U+25fa uni25FA              2.3
+U+25fb uni25FB              2.3
+U+25fc uni25FC              2.3
+U+25fd uni25FD              2.3
+U+25fe uni25FE              2.3
+U+25ff uni25FF              2.3
+U+2600 uni2600              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2601 uni2601              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2602 uni2602              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2603 uni2603              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2604 uni2604              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2605 uni2605              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2606 uni2606              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2607 uni2607              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2608 uni2608              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2609 uni2609              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+260a uni260A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+260b uni260B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+260c uni260C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+260d uni260D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+260e uni260E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+260f uni260F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2610 uni2610              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2611 uni2611              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2612 uni2612              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2613 uni2613              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2614 uni2614              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2615 uni2615              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2616 uni2616              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2617 uni2617              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2618 uni2618              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2619 uni2619              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+261a uni261A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+261b uni261B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+261c uni261C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+261d uni261D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+261e uni261E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+261f uni261F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2620 uni2620              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2621 uni2621              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2622 uni2622              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2623 uni2623              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2624 uni2624              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2625 uni2625              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2626 uni2626              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2627 uni2627              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2628 uni2628              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2629 uni2629              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+262a uni262A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+262b uni262B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+262c uni262C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+262d uni262D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+262e uni262E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+262f uni262F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2630 uni2630              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2631 uni2631              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2632 uni2632              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2633 uni2633              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2634 uni2634              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2635 uni2635              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2636 uni2636              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2637 uni2637              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2638 uni2638              1.15
+U+2639 uni2639              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+263a smileface            2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+263b invsmileface         2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+263c sun                  2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+263d uni263D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+263e uni263E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+263f uni263F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2640 female               2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2641 uni2641              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2642 male                 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2643 uni2643              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2644 uni2644              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2645 uni2645              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2646 uni2646              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2647 uni2647              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2648 uni2648              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2649 uni2649              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+264a uni264A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+264b uni264B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+264c uni264C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+264d uni264D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+264e uni264E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+264f uni264F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2650 uni2650              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2651 uni2651              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2652 uni2652              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2653 uni2653              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2654 uni2654              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2655 uni2655              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2656 uni2656              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2657 uni2657              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2658 uni2658              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2659 uni2659              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+265a uni265A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+265b uni265B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+265c uni265C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+265d uni265D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+265e uni265E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+265f uni265F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2660 spade                2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2661 uni2661              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2662 uni2662              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2663 club                 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2664 uni2664              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2665 heart                2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2666 diamond              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2667 uni2667              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2668 uni2668              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2669 uni2669              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+266a musicalnote          2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+266b musicalnotedbl       2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+266c uni266C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+266d uni266D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+266e uni266E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+266f uni266F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2670 uni2670              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2671 uni2671              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2672 uni2672              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2673 uni2673              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2674 uni2674              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2675 uni2675              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2676 uni2676              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2677 uni2677              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2678 uni2678              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2679 uni2679              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+267a uni267A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+267b uni267B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+267c uni267C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+267d uni267D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+267e uni267E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+267f uni267F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2680 uni2680              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
+U+2681 uni2681              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
+U+2682 uni2682              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
+U+2683 uni2683              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
+U+2684 uni2684              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
+U+2685 uni2685              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold)
+U+2686 uni2686              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2687 uni2687              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2688 uni2688              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2689 uni2689              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+268a uni268A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+268b uni268B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+268c uni268C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+268d uni268D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+268e uni268E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+268f uni268F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+2690 uni2690              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2691 uni2691              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2692 uni2692              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2693 uni2693              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2694 uni2694              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2695 uni2695              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2696 uni2696              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2697 uni2697              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2698 uni2698              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2699 uni2699              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+269a uni269A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+269b uni269B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+269c uni269C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+26a0 uni26A0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+26a1 uni26A1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+26a2 uni26A2              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26a3 uni26A3              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26a4 uni26A4              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26a5 uni26A5              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26a6 uni26A6              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26a7 uni26A7              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26a8 uni26A8              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26a9 uni26A9              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26aa uni26AA              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26ab uni26AB              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26ac uni26AC              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26ad uni26AD              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26ae uni26AE              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26af uni26AF              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+26b0 uni26B0              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+26b1 uni26B1              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+26b2 uni26B2              2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26b3 uni26B3              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26b4 uni26B4              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26b5 uni26B5              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26b6 uni26B6              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26b7 uni26B7              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26b8 uni26B8              2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26c0 uni26C0              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26c1 uni26C1              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26c2 uni26C2              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26c3 uni26C3              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+26e2 uni26E2              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2701 uni2701              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2702 uni2702              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2703 uni2703              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2704 uni2704              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2706 uni2706              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2707 uni2707              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2708 uni2708              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2709 uni2709              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+270c uni270C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+270d uni270D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+270e uni270E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+270f uni270F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2710 uni2710              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2711 uni2711              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2712 uni2712              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2713 uni2713              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2714 uni2714              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2715 uni2715              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2716 uni2716              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2717 uni2717              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2718 uni2718              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2719 uni2719              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+271a uni271A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+271b uni271B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+271c uni271C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+271d uni271D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+271e uni271E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+271f uni271F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2720 uni2720              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2721 uni2721              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2722 uni2722              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2723 uni2723              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2724 uni2724              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2725 uni2725              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2726 uni2726              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2727 uni2727              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2729 uni2729              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+272a uni272A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+272b uni272B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+272c uni272C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+272d uni272D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+272e uni272E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+272f uni272F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2730 uni2730              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2731 uni2731              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2732 uni2732              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2733 uni2733              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2734 uni2734              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2735 uni2735              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2736 uni2736              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2737 uni2737              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2738 uni2738              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2739 uni2739              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+273a uni273A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+273b uni273B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+273c uni273C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+273d uni273D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+273e uni273E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+273f uni273F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2740 uni2740              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2741 uni2741              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2742 uni2742              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2743 uni2743              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2744 uni2744              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2745 uni2745              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2746 uni2746              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2747 uni2747              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2748 uni2748              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2749 uni2749              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+274a uni274A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+274b uni274B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+274d uni274D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+274f uni274F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2750 uni2750              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2751 uni2751              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2752 uni2752              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2756 uni2756              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2758 uni2758              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2759 uni2759              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+275a uni275A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+275b uni275B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+275c uni275C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+275d uni275D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+275e uni275E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2761 uni2761              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2762 uni2762              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2763 uni2763              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2764 uni2764              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2765 uni2765              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2766 uni2766              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2767 uni2767              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2768 uni2768              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2769 uni2769              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+276a uni276A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+276b uni276B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+276c uni276C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+276d uni276D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+276e uni276E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+276f uni276F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2770 uni2770              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2771 uni2771              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2772 uni2772              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2773 uni2773              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2774 uni2774              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2775 uni2775              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold)
+U+2776 uni2776              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2777 uni2777              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2778 uni2778              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2779 uni2779              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+277a uni277A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+277b uni277B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+277c uni277C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+277d uni277D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+277e uni277E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+277f uni277F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2780 uni2780              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2781 uni2781              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2782 uni2782              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2783 uni2783              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2784 uni2784              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2785 uni2785              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2786 uni2786              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2787 uni2787              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2788 uni2788              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2789 uni2789              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+278a uni278A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+278b uni278B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+278c uni278C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+278d uni278D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+278e uni278E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+278f uni278F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2790 uni2790              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2791 uni2791              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2792 uni2792              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2793 uni2793              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2794 uni2794              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2798 uni2798              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+2799 uni2799              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+279a uni279A              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+279b uni279B              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+279c uni279C              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+279d uni279D              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+279e uni279E              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+279f uni279F              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a0 uni27A0              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a1 uni27A1              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27a2 uni27A2              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a3 uni27A3              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a4 uni27A4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a5 uni27A5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a6 uni27A6              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a7 uni27A7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a8 uni27A8              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27a9 uni27A9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27aa uni27AA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27ab uni27AB              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27ac uni27AC              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27ad uni27AD              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27ae uni27AE              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27af uni27AF              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b1 uni27B1              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b2 uni27B2              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b3 uni27B3              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b4 uni27B4              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b5 uni27B5              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b6 uni27B6              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b7 uni27B7              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b8 uni27B8              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27b9 uni27B9              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27ba uni27BA              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27bb uni27BB              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27bc uni27BC              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27bd uni27BD              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27be uni27BE              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold)
+U+27bf uni27BF              2.7 (Sans Mono Bold)
+U+27c5 uni27C5              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+27c6 uni27C6              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+27e0 uni27E0              2.3
+U+27e6 uni27E6              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+27e7 uni27E7              2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+27e8 uni27E8              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27e9 uni27E9              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27ea uni27EA              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+27eb uni27EB              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+27f0 uni27F0              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f1 uni27F1              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f2 uni27F2              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f3 uni27F3              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f4 uni27F4              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f5 uni27F5              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f6 uni27F6              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f7 uni27F7              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f8 uni27F8              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27f9 uni27F9              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27fa uni27FA              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27fb uni27FB              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27fc uni27FC              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27fd uni27FD              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27fe uni27FE              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+27ff uni27FF              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2800 uni2800              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2801 uni2801              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2802 uni2802              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2803 uni2803              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2804 uni2804              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2805 uni2805              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2806 uni2806              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2807 uni2807              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2808 uni2808              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2809 uni2809              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+280a uni280A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+280b uni280B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+280c uni280C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+280d uni280D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+280e uni280E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+280f uni280F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2810 uni2810              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2811 uni2811              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2812 uni2812              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2813 uni2813              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2814 uni2814              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2815 uni2815              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2816 uni2816              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2817 uni2817              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2818 uni2818              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2819 uni2819              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+281a uni281A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+281b uni281B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+281c uni281C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+281d uni281D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+281e uni281E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+281f uni281F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2820 uni2820              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2821 uni2821              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2822 uni2822              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2823 uni2823              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2824 uni2824              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2825 uni2825              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2826 uni2826              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2827 uni2827              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2828 uni2828              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2829 uni2829              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+282a uni282A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+282b uni282B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+282c uni282C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+282d uni282D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+282e uni282E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+282f uni282F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2830 uni2830              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2831 uni2831              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2832 uni2832              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2833 uni2833              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2834 uni2834              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2835 uni2835              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2836 uni2836              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2837 uni2837              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2838 uni2838              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2839 uni2839              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+283a uni283A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+283b uni283B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+283c uni283C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+283d uni283D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+283e uni283E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+283f uni283F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2840 uni2840              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2841 uni2841              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2842 uni2842              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2843 uni2843              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2844 uni2844              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2845 uni2845              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2846 uni2846              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2847 uni2847              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2848 uni2848              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2849 uni2849              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+284a uni284A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+284b uni284B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+284c uni284C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+284d uni284D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+284e uni284E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+284f uni284F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2850 uni2850              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2851 uni2851              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2852 uni2852              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2853 uni2853              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2854 uni2854              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2855 uni2855              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2856 uni2856              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2857 uni2857              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2858 uni2858              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2859 uni2859              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+285a uni285A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+285b uni285B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+285c uni285C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+285d uni285D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+285e uni285E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+285f uni285F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2860 uni2860              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2861 uni2861              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2862 uni2862              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2863 uni2863              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2864 uni2864              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2865 uni2865              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2866 uni2866              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2867 uni2867              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2868 uni2868              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2869 uni2869              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+286a uni286A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+286b uni286B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+286c uni286C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+286d uni286D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+286e uni286E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+286f uni286F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2870 uni2870              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2871 uni2871              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2872 uni2872              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2873 uni2873              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2874 uni2874              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2875 uni2875              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2876 uni2876              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2877 uni2877              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2878 uni2878              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2879 uni2879              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+287a uni287A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+287b uni287B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+287c uni287C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+287d uni287D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+287e uni287E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+287f uni287F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2880 uni2880              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2881 uni2881              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2882 uni2882              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2883 uni2883              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2884 uni2884              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2885 uni2885              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2886 uni2886              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2887 uni2887              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2888 uni2888              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2889 uni2889              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+288a uni288A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+288b uni288B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+288c uni288C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+288d uni288D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+288e uni288E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+288f uni288F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2890 uni2890              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2891 uni2891              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2892 uni2892              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2893 uni2893              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2894 uni2894              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2895 uni2895              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2896 uni2896              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2897 uni2897              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2898 uni2898              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2899 uni2899              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+289a uni289A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+289b uni289B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+289c uni289C              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+289d uni289D              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+289e uni289E              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+289f uni289F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a0 uni28A0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a1 uni28A1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a2 uni28A2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a3 uni28A3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a4 uni28A4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a5 uni28A5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a6 uni28A6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a7 uni28A7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a8 uni28A8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28a9 uni28A9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28aa uni28AA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ab uni28AB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ac uni28AC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ad uni28AD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ae uni28AE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28af uni28AF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b0 uni28B0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b1 uni28B1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b2 uni28B2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b3 uni28B3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b4 uni28B4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b5 uni28B5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b6 uni28B6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b7 uni28B7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b8 uni28B8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28b9 uni28B9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ba uni28BA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28bb uni28BB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28bc uni28BC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28bd uni28BD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28be uni28BE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28bf uni28BF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c0 uni28C0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c1 uni28C1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c2 uni28C2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c3 uni28C3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c4 uni28C4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c5 uni28C5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c6 uni28C6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c7 uni28C7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c8 uni28C8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28c9 uni28C9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ca uni28CA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28cb uni28CB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28cc uni28CC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28cd uni28CD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ce uni28CE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28cf uni28CF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d0 uni28D0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d1 uni28D1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d2 uni28D2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d3 uni28D3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d4 uni28D4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d5 uni28D5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d6 uni28D6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d7 uni28D7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d8 uni28D8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28d9 uni28D9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28da uni28DA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28db uni28DB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28dc uni28DC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28dd uni28DD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28de uni28DE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28df uni28DF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e0 uni28E0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e1 uni28E1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e2 uni28E2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e3 uni28E3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e4 uni28E4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e5 uni28E5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e6 uni28E6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e7 uni28E7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e8 uni28E8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28e9 uni28E9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ea uni28EA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28eb uni28EB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ec uni28EC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ed uni28ED              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ee uni28EE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ef uni28EF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f0 uni28F0              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f1 uni28F1              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f2 uni28F2              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f3 uni28F3              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f4 uni28F4              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f5 uni28F5              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f6 uni28F6              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f7 uni28F7              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f8 uni28F8              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28f9 uni28F9              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28fa uni28FA              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28fb uni28FB              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28fc uni28FC              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28fd uni28FD              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28fe uni28FE              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+28ff uni28FF              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2900 uni2900              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2901 uni2901              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2902 uni2902              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2903 uni2903              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2904 uni2904              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2905 uni2905              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2906 uni2906              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2907 uni2907              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2908 uni2908              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2909 uni2909              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+290a uni290A              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+290b uni290B              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+290c uni290C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+290d uni290D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+290e uni290E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+290f uni290F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2910 uni2910              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2911 uni2911              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2912 uni2912              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2913 uni2913              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2914 uni2914              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2915 uni2915              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2916 uni2916              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2917 uni2917              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2918 uni2918              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2919 uni2919              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+291a uni291A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+291b uni291B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+291c uni291C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+291d uni291D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+291e uni291E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+291f uni291F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2920 uni2920              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2921 uni2921              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2922 uni2922              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2923 uni2923              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2924 uni2924              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2925 uni2925              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2926 uni2926              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2927 uni2927              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2928 uni2928              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2929 uni2929              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+292a uni292A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+292b uni292B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+292c uni292C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+292d uni292D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+292e uni292E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+292f uni292F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2930 uni2930              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2931 uni2931              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2932 uni2932              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2933 uni2933              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2934 uni2934              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2935 uni2935              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2936 uni2936              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2937 uni2937              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2938 uni2938              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2939 uni2939              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+293a uni293A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+293b uni293B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+293c uni293C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+293d uni293D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+293e uni293E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+293f uni293F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2940 uni2940              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2941 uni2941              2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2942 uni2942              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2943 uni2943              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2944 uni2944              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2945 uni2945              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2946 uni2946              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2947 uni2947              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2948 uni2948              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2949 uni2949              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+294a uni294A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+294b uni294B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+294c uni294C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+294d uni294D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+294e uni294E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+294f uni294F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2950 uni2950              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2951 uni2951              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2952 uni2952              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2953 uni2953              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2954 uni2954              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2955 uni2955              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2956 uni2956              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2957 uni2957              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2958 uni2958              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2959 uni2959              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+295a uni295A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+295b uni295B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+295c uni295C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+295d uni295D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+295e uni295E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+295f uni295F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2960 uni2960              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2961 uni2961              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2962 uni2962              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2963 uni2963              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2964 uni2964              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2965 uni2965              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2966 uni2966              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2967 uni2967              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2968 uni2968              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2969 uni2969              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+296a uni296A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+296b uni296B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+296c uni296C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+296d uni296D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+296e uni296E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+296f uni296F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2970 uni2970              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2971 uni2971              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2972 uni2972              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2973 uni2973              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2974 uni2974              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2975 uni2975              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2976 uni2976              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2977 uni2977              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2978 uni2978              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2979 uni2979              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+297a uni297A              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+297b uni297B              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+297c uni297C              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+297d uni297D              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+297e uni297E              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+297f uni297F              2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2983 uni2983              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2984 uni2984              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+29ce uni29CE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29cf uni29CF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29d0 uni29D0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29d1 uni29D1              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29d2 uni29D2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29d3 uni29D3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29d4 uni29D4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29d5 uni29D5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+29eb uni29EB              2.2
+U+29fa uni29FA              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+29fb uni29FB              2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+2a00 uni2A00              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a01 uni2A01              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a02 uni2A02              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a0c uni2A0C              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2a0d uni2A0D              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2a0e uni2A0E              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2a0f uni2A0F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a10 uni2A10              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a11 uni2A11              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a12 uni2A12              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a13 uni2A13              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a14 uni2A14              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a15 uni2A15              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a16 uni2A16              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a17 uni2A17              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a18 uni2A18              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a19 uni2A19              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a1a uni2A1A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a1b uni2A1B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a1c uni2A1C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a2f uni2A2F              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2a7d uni2A7D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a7e uni2A7E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a7f uni2A7F              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a80 uni2A80              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a81 uni2A81              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a82 uni2A82              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a83 uni2A83              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a84 uni2A84              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a85 uni2A85              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a86 uni2A86              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a87 uni2A87              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a88 uni2A88              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a89 uni2A89              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a8a uni2A8A              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a8b uni2A8B              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a8c uni2A8C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a8d uni2A8D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a8e uni2A8E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a8f uni2A8F              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a90 uni2A90              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a91 uni2A91              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a92 uni2A92              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a93 uni2A93              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a94 uni2A94              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a95 uni2A95              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a96 uni2A96              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a97 uni2A97              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a98 uni2A98              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a99 uni2A99              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a9a uni2A9A              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a9b uni2A9B              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a9c uni2A9C              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a9d uni2A9D              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a9e uni2A9E              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2a9f uni2A9F              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2aa0 uni2AA0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2aae uni2AAE              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2aaf uni2AAF              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab0 uni2AB0              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab1 uni2AB1              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab2 uni2AB2              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab3 uni2AB3              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab4 uni2AB4              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab5 uni2AB5              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab6 uni2AB6              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab7 uni2AB7              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab8 uni2AB8              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2ab9 uni2AB9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2aba uni2ABA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2af9 uni2AF9              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2afa uni2AFA              2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2b00 uni2B00              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b01 uni2B01              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b02 uni2B02              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b03 uni2B03              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b04 uni2B04              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b05 uni2B05              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b06 uni2B06              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b07 uni2B07              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b08 uni2B08              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b09 uni2B09              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b0a uni2B0A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b0b uni2B0B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b0c uni2B0C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b0d uni2B0D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b0e uni2B0E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b0f uni2B0F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b10 uni2B10              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b11 uni2B11              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2b12 uni2B12              2.3
+U+2b13 uni2B13              2.3
+U+2b14 uni2B14              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2b15 uni2B15              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2b16 uni2B16              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2b17 uni2B17              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2b18 uni2B18              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2b19 uni2B19              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2b1a uni2B1A              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+2b1f uni2B1F              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+2b20 uni2B20              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2b21 uni2B21              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2b22 uni2B22              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2b23 uni2B23              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2b24 uni2B24              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+2b53 uni2B53              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+2b54 uni2B54              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+2c60 uni2C60              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c61 uni2C61              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c62 uni2C62              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2c63 uni2C63              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c64 uni2C64              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2c65 uni2C65              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2c66 uni2C66              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2c67 uni2C67              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2c68 uni2C68              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2c69 uni2C69              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2c6a uni2C6A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2c6b uni2C6B              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2c6c uni2C6C              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+2c6d uni2C6D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c6e uni2C6E              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2c6f uni2C6F              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2c70 uni2C70              2.31 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c71 uni2C71              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.31 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c72 uni2C72              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.31 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c73 uni2C73              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.31 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c74 uni2C74              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+2c75 uni2C75              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2c76 uni2C76              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2c77 uni2C77              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed)
+U+2c79 uni2C79              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2c7a uni2C7A              2.27
+U+2c7b uni2C7B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+2c7c uni2C7C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2c7d uni2C7D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic)
+U+2c7e uni2C7E              2.31 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2c7f uni2C7F              2.31 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+2d00 uni2D00              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d01 uni2D01              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d02 uni2D02              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d03 uni2D03              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d04 uni2D04              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d05 uni2D05              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d06 uni2D06              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d07 uni2D07              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d08 uni2D08              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d09 uni2D09              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d0a uni2D0A              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d0b uni2D0B              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d0c uni2D0C              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d0d uni2D0D              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d0e uni2D0E              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d0f uni2D0F              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d10 uni2D10              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d11 uni2D11              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d12 uni2D12              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d13 uni2D13              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d14 uni2D14              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d15 uni2D15              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d16 uni2D16              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d17 uni2D17              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d18 uni2D18              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d19 uni2D19              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d1a uni2D1A              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d1b uni2D1B              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d1c uni2D1C              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d1d uni2D1D              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d1e uni2D1E              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d1f uni2D1F              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d20 uni2D20              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d21 uni2D21              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d22 uni2D22              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d23 uni2D23              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d24 uni2D24              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d25 uni2D25              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+2d30 uni2D30              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d31 uni2D31              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d32 uni2D32              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d33 uni2D33              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d34 uni2D34              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d35 uni2D35              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d36 uni2D36              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d37 uni2D37              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d38 uni2D38              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d39 uni2D39              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d3a uni2D3A              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d3b uni2D3B              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d3c uni2D3C              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d3d uni2D3D              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d3e uni2D3E              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d3f uni2D3F              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d40 uni2D40              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d41 uni2D41              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d42 uni2D42              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d43 uni2D43              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d44 uni2D44              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d45 uni2D45              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d46 uni2D46              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d47 uni2D47              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d48 uni2D48              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d49 uni2D49              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d4a uni2D4A              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d4b uni2D4B              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d4c uni2D4C              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d4d uni2D4D              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d4e uni2D4E              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d4f uni2D4F              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d50 uni2D50              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d51 uni2D51              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d52 uni2D52              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d53 uni2D53              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d54 uni2D54              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d55 uni2D55              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d56 uni2D56              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d57 uni2D57              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d58 uni2D58              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d59 uni2D59              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d5a uni2D5A              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d5b uni2D5B              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d5c uni2D5C              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d5d uni2D5D              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d5e uni2D5E              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d5f uni2D5F              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d60 uni2D60              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d61 uni2D61              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d62 uni2D62              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d63 uni2D63              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d64 uni2D64              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d65 uni2D65              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2d6f uni2D6F              2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+2e18 uni2E18              2.26
+U+2e22 uni2E22              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) 2.31 (Serif Condensed Italic)
+U+2e23 uni2E23              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) 2.31 (Serif Condensed Italic)
+U+2e24 uni2E24              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) 2.31 (Serif Condensed Italic)
+U+2e25 uni2E25              2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) 2.31 (Serif Condensed Italic)
+U+2e2e uni2E2E              2.26
+U+4dc0 uni4DC0              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc1 uni4DC1              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc2 uni4DC2              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc3 uni4DC3              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc4 uni4DC4              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc5 uni4DC5              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc6 uni4DC6              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc7 uni4DC7              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc8 uni4DC8              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dc9 uni4DC9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dca uni4DCA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dcb uni4DCB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dcc uni4DCC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dcd uni4DCD              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dce uni4DCE              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dcf uni4DCF              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd0 uni4DD0              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd1 uni4DD1              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd2 uni4DD2              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd3 uni4DD3              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd4 uni4DD4              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd5 uni4DD5              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd6 uni4DD6              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd7 uni4DD7              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd8 uni4DD8              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dd9 uni4DD9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dda uni4DDA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4ddb uni4DDB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4ddc uni4DDC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4ddd uni4DDD              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dde uni4DDE              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4ddf uni4DDF              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de0 uni4DE0              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de1 uni4DE1              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de2 uni4DE2              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de3 uni4DE3              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de4 uni4DE4              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de5 uni4DE5              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de6 uni4DE6              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de7 uni4DE7              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de8 uni4DE8              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4de9 uni4DE9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dea uni4DEA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4deb uni4DEB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dec uni4DEC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4ded uni4DED              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dee uni4DEE              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4def uni4DEF              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df0 uni4DF0              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df1 uni4DF1              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df2 uni4DF2              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df3 uni4DF3              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df4 uni4DF4              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df5 uni4DF5              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df6 uni4DF6              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df7 uni4DF7              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df8 uni4DF8              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4df9 uni4DF9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dfa uni4DFA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dfb uni4DFB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dfc uni4DFC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dfd uni4DFD              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dfe uni4DFE              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+4dff uni4DFF              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a644 uniA644              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a645 uniA645              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a646 uniA646              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a647 uniA647              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a64c uniA64C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a64d uniA64D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a650 uniA650              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a651 uniA651              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a654 uniA654              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a655 uniA655              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a656 uniA656              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a657 uniA657              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a662 uniA662              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a663 uniA663              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a664 uniA664              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a665 uniA665              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a666 uniA666              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a667 uniA667              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a668 uniA668              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a669 uniA669              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a66a uniA66A              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a66b uniA66B              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a66c uniA66C              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a66d uniA66D              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a66e uniA66E              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a68a uniA68A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a68b uniA68B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a68c uniA68C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a68d uniA68D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a694 uniA694              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a695 uniA695              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+a708 uniA708              2.27
+U+a709 uniA709              2.27
+U+a70a uniA70A              2.27
+U+a70b uniA70B              2.27
+U+a70c uniA70C              2.27
+U+a70d uniA70D              2.27
+U+a70e uniA70E              2.27
+U+a70f uniA70F              2.27
+U+a710 uniA710              2.27
+U+a711 uniA711              2.27
+U+a712 uniA712              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a713 uniA713              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a714 uniA714              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a715 uniA715              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a716 uniA716              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+a71b uniA71B              2.27
+U+a71c uniA71C              2.27
+U+a71d uniA71D              2.27
+U+a71e uniA71E              2.27
+U+a71f uniA71F              2.27
+U+a722 uniA722              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+a723 uniA723              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+a724 uniA724              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+a725 uniA725              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+a726 uniA726              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a727 uniA727              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a728 uniA728              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a729 uniA729              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a72a uniA72A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a72b uniA72B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a72c uniA72C              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a72d uniA72D              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a72e uniA72E              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a72f uniA72F              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a730 uniA730              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a731 uniA731              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a732 uniA732              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a733 uniA733              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a734 uniA734              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a735 uniA735              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a736 uniA736              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a737 uniA737              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a738 uniA738              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a739 uniA739              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a73a uniA73A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a73b uniA73B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a73c uniA73C              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a73d uniA73D              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.32 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a73e uniA73E              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a73f uniA73F              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a746 uniA746              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a747 uniA747              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a748 uniA748              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a749 uniA749              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a74a uniA74A              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a74b uniA74B              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a74e uniA74E              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a74f uniA74F              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a750 uniA750              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a751 uniA751              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a752 uniA752              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a753 uniA753              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a756 uniA756              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a757 uniA757              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a764 uniA764              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a765 uniA765              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a766 uniA766              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a767 uniA767              2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+a768 uniA768              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a769 uniA769              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a77b uniA77B              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a77c uniA77C              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a780 uniA780              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a781 uniA781              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a782 uniA782              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a783 uniA783              2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a784 uniA784              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a785 uniA785              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a786 uniA786              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a787 uniA787              2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a789 uniA789              2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+a78a uniA78A              2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+a78b uniA78B              2.26
+U+a78c uniA78C              2.26
+U+a78d uniA78D              2.31
+U+a78e uniA78E              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique)
+U+a790 uniA790              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a791 uniA791              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a7fa uniA7FA              2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a7fb uniA7FB              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a7fc uniA7FC              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a7fd uniA7FD              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a7fe uniA7FE              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+a7ff uniA7FF              2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.33 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic)
+U+e000 uniE000              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e001 uniE001              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e002 uniE002              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e003 uniE003              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e004 uniE004              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e005 uniE005              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e006 uniE006              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e007 uniE007              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e008 uniE008              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique)
+U+e009 uniE009              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e00a uniE00A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e00b uniE00B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e00c uniE00C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e00d uniE00D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e00e uniE00E              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e00f uniE00F              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e010 uniE010              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e011 uniE011              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e012 uniE012              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e013 uniE013              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e014 uniE014              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight)
+U+e015 uniE015              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e016 uniE016              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e017 uniE017              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e018 uniE018              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e019 uniE019              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e01a uniE01A              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e01b uniE01B              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e01c uniE01C              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+e01d uniE01D              2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef00 uni02E5.5            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef01 uni02E6.5            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef02 uni02E7.5            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef03 uni02E8.5            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef04 uni02E9.5            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef05 uni02E5.4            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef06 uni02E6.4            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef07 uni02E7.4            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef08 uni02E8.4            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef09 uni02E9.4            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef0a uni02E5.3            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef0b uni02E6.3            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef0c uni02E7.3            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef0d uni02E8.3            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef0e uni02E9.3            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef0f uni02E5.2            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef10 uni02E6.2            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef11 uni02E7.2            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef12 uni02E8.2            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef13 uni02E9.2            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef14 uni02E5.1            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef15 uni02E6.1            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef16 uni02E7.1            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef17 uni02E8.1            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef18 uni02E9.1            2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+ef19 stem                 2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f000 uniF000              2.10 (Sans) 2.11 (Sans Condensed)
+U+f001 uniF001              2.10 (Sans) 2.11 (Sans Condensed)
+U+f002 uniF002              2.33 (Sans, Sans Condensed)
+U+f003 uniF003              2.33 (Sans, Sans Condensed)
+U+f208 uniF208              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f20a uniF20A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f215 uniF215              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f216 uniF216              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f217 uniF217              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f21a uniF21A              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f21b uniF21B              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f25f uniF25F              2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+f400 uniF400              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f401 uniF401              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f402 uniF402              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f403 uniF403              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f404 uniF404              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f405 uniF405              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f406 uniF406              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f407 uniF407              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f408 uniF408              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f409 uniF409              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f40a uniF40A              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f40b uniF40B              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f40c uniF40C              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f40d uniF40D              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f40e uniF40E              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f40f uniF40F              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f410 uniF410              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f411 uniF411              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f412 uniF412              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f413 uniF413              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f414 uniF414              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f415 uniF415              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f416 uniF416              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f417 uniF417              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f418 uniF418              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f419 uniF419              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f41a uniF41A              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f41b uniF41B              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f41c uniF41C              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f41d uniF41D              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f41e uniF41E              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f41f uniF41F              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f420 uniF420              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f421 uniF421              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f422 uniF422              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f423 uniF423              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f424 uniF424              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f425 uniF425              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f426 uniF426              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f428 uniF428              2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+f5c5 uniF5C5              2.9 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+f6c4 uniF6C4              2.10 (Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed)
+U+f6c5 uniF6C5              2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.9 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight) 2.23 (Serif Italic Condensed)
+U+f6c6 uniF6C6              2.5 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+f6c7 uniF6C7              2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+f6c8 uniF6C8              2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+f6d1 cyrBreve             2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+f6d4 cyrbreve             2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fb00 uniFB00              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fb01 fi                   original
+U+fb02 fl                   original
+U+fb03 uniFB03              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fb04 uniFB04              2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fb05 uniFB05              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fb06 uniFB06              2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fb13 uniFB13              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb14 uniFB14              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb15 uniFB15              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb16 uniFB16              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb17 uniFB17              2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb1d uniFB1D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb1e uniFB1E              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb1f uniFB1F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb20 uniFB20              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb21 uniFB21              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb22 uniFB22              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb23 uniFB23              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb24 uniFB24              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb25 uniFB25              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb26 uniFB26              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb27 uniFB27              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb28 uniFB28              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb29 uniFB29              2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb2a uniFB2A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb2b uniFB2B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb2c uniFB2C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb2d uniFB2D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb2e uniFB2E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb2f uniFB2F              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb30 uniFB30              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb31 uniFB31              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb32 uniFB32              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb33 uniFB33              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb34 uniFB34              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb35 uniFB35              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb36 uniFB36              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb37 uniFB37              2.11 (Sans Condensed Oblique, Sans Oblique) 2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+fb38 uniFB38              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb39 uniFB39              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb3a uniFB3A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb3b uniFB3B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb3c uniFB3C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb3d uniFB3D              2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb3e uniFB3E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb3f uniFB3F              2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb40 uniFB40              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb41 uniFB41              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb42 uniFB42              2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb43 uniFB43              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb44 uniFB44              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb45 uniFB45              2.33 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb46 uniFB46              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb47 uniFB47              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb48 uniFB48              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb49 uniFB49              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb4a uniFB4A              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb4b uniFB4B              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb4c uniFB4C              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb4d uniFB4D              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb4e uniFB4E              2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fb4f uniFB4F              2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique)
+U+fb52 uniFB52              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb53 uniFB53              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb54 uniFB54              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb55 uniFB55              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb56 uniFB56              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb57 uniFB57              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb58 uniFB58              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb59 uniFB59              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb5a uniFB5A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb5b uniFB5B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb5c uniFB5C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb5d uniFB5D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb5e uniFB5E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb5f uniFB5F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb60 uniFB60              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb61 uniFB61              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb62 uniFB62              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb63 uniFB63              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb64 uniFB64              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb65 uniFB65              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb66 uniFB66              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb67 uniFB67              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb68 uniFB68              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb69 uniFB69              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb6a uniFB6A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb6b uniFB6B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb6c uniFB6C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb6d uniFB6D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb6e uniFB6E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb6f uniFB6F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb70 uniFB70              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb71 uniFB71              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb72 uniFB72              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb73 uniFB73              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb74 uniFB74              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb75 uniFB75              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb76 uniFB76              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb77 uniFB77              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb78 uniFB78              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb79 uniFB79              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb7a uniFB7A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb7b uniFB7B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb7c uniFB7C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb7d uniFB7D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb7e uniFB7E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb7f uniFB7F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb80 uniFB80              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb81 uniFB81              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb82 uniFB82              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb83 uniFB83              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb84 uniFB84              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb85 uniFB85              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb86 uniFB86              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb87 uniFB87              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb88 uniFB88              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb89 uniFB89              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb8a uniFB8A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb8b uniFB8B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb8c uniFB8C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb8d uniFB8D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb8e uniFB8E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb8f uniFB8F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb90 uniFB90              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb91 uniFB91              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb92 uniFB92              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb93 uniFB93              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb94 uniFB94              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb95 uniFB95              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb96 uniFB96              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb97 uniFB97              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb98 uniFB98              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb99 uniFB99              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb9a uniFB9A              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb9b uniFB9B              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb9c uniFB9C              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb9d uniFB9D              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fb9e uniFB9E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fb9f uniFB9F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fba0 uniFBA0              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fba1 uniFBA1              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fba2 uniFBA2              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fba3 uniFBA3              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbaa uniFBAA              2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbab uniFBAB              2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbac uniFBAC              2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbad uniFBAD              2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbd3 uniFBD3              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbd4 uniFBD4              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbd5 uniFBD5              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbd6 uniFBD6              2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbd9 uniFBD9              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbda uniFBDA              2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold)
+U+fbe8 uniFBE8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fbe9 uniFBE9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fbfc uniFBFC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fbfd uniFBFD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fbfe uniFBFE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fbff uniFBFF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe00 uniFE00              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe01 uniFE01              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe02 uniFE02              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe03 uniFE03              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe04 uniFE04              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe05 uniFE05              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe06 uniFE06              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe07 uniFE07              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe08 uniFE08              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe09 uniFE09              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe0a uniFE0A              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe0b uniFE0B              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe0c uniFE0C              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe0d uniFE0D              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe0e uniFE0E              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe0f uniFE0F              2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fe20 uniFE20              2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fe21 uniFE21              2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fe22 uniFE22              2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fe23 uniFE23              2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+fe70 uniFE70              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe71 uniFE71              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe72 uniFE72              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe73 uniFE73              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe74 uniFE74              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe76 uniFE76              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe77 uniFE77              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe78 uniFE78              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe79 uniFE79              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe7a uniFE7A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe7b uniFE7B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe7c uniFE7C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe7d uniFE7D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe7e uniFE7E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe7f uniFE7F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe80 uniFE80              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe81 uniFE81              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe82 uniFE82              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe83 uniFE83              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe84 uniFE84              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe85 uniFE85              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe86 uniFE86              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe87 uniFE87              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe88 uniFE88              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe89 uniFE89              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe8a uniFE8A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe8b uniFE8B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe8c uniFE8C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe8d uniFE8D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe8e uniFE8E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe8f uniFE8F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe90 uniFE90              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe91 uniFE91              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe92 uniFE92              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe93 uniFE93              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe94 uniFE94              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe95 uniFE95              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe96 uniFE96              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe97 uniFE97              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe98 uniFE98              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe99 uniFE99              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe9a uniFE9A              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe9b uniFE9B              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe9c uniFE9C              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe9d uniFE9D              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe9e uniFE9E              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fe9f uniFE9F              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea0 uniFEA0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea1 uniFEA1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea2 uniFEA2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea3 uniFEA3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea4 uniFEA4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea5 uniFEA5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea6 uniFEA6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea7 uniFEA7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea8 uniFEA8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fea9 uniFEA9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feaa uniFEAA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feab uniFEAB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feac uniFEAC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fead uniFEAD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feae uniFEAE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feaf uniFEAF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb0 uniFEB0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb1 uniFEB1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb2 uniFEB2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb3 uniFEB3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb4 uniFEB4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb5 uniFEB5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb6 uniFEB6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb7 uniFEB7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb8 uniFEB8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feb9 uniFEB9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feba uniFEBA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+febb uniFEBB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+febc uniFEBC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+febd uniFEBD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+febe uniFEBE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+febf uniFEBF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec0 uniFEC0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec1 uniFEC1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec2 uniFEC2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec3 uniFEC3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec4 uniFEC4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec5 uniFEC5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec6 uniFEC6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec7 uniFEC7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec8 uniFEC8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fec9 uniFEC9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feca uniFECA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fecb uniFECB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fecc uniFECC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fecd uniFECD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fece uniFECE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fecf uniFECF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed0 uniFED0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed1 uniFED1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed2 uniFED2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed3 uniFED3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed4 uniFED4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed5 uniFED5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed6 uniFED6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed7 uniFED7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed8 uniFED8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fed9 uniFED9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feda uniFEDA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fedb uniFEDB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fedc uniFEDC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fedd uniFEDD              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fede uniFEDE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fedf uniFEDF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee0 uniFEE0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee1 uniFEE1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee2 uniFEE2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee3 uniFEE3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee4 uniFEE4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee5 uniFEE5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee6 uniFEE6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee7 uniFEE7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee8 uniFEE8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fee9 uniFEE9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feea uniFEEA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feeb uniFEEB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feec uniFEEC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feed uniFEED              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feee uniFEEE              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feef uniFEEF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef0 uniFEF0              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef1 uniFEF1              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef2 uniFEF2              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef3 uniFEF3              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef4 uniFEF4              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef5 uniFEF5              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef6 uniFEF6              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef7 uniFEF7              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef8 uniFEF8              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fef9 uniFEF9              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fefa uniFEFA              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fefb uniFEFB              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fefc uniFEFC              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+feff uniFEFF              2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold)
+U+fff9 uniFFF9              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fffa uniFFFA              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fffb uniFFFB              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fffc uniFFFC              2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed)
+U+fffd uniFFFD              1.12
+U+10300 u10300               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10301 u10301               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10302 u10302               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10303 u10303               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10304 u10304               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10305 u10305               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10306 u10306               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10307 u10307               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10308 u10308               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10309 u10309               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1030a u1030A               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1030b u1030B               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1030c u1030C               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1030d u1030D               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1030e u1030E               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1030f u1030F               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10310 u10310               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10311 u10311               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10312 u10312               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10313 u10313               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10314 u10314               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10315 u10315               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10316 u10316               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10317 u10317               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10318 u10318               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10319 u10319               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1031a u1031A               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1031b u1031B               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1031c u1031C               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1031d u1031D               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1031e u1031E               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10320 u10320               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10321 u10321               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10322 u10322               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+10323 u10323               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d300 u1D300               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d301 u1D301               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d302 u1D302               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d303 u1D303               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d304 u1D304               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d305 u1D305               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d306 u1D306               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d307 u1D307               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d308 u1D308               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d309 u1D309               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d30a u1D30A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d30b u1D30B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d30c u1D30C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d30d u1D30D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d30e u1D30E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d30f u1D30F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d310 u1D310               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d311 u1D311               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d312 u1D312               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d313 u1D313               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d314 u1D314               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d315 u1D315               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d316 u1D316               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d317 u1D317               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d318 u1D318               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d319 u1D319               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d31a u1D31A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d31b u1D31B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d31c u1D31C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d31d u1D31D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d31e u1D31E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d31f u1D31F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d320 u1D320               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d321 u1D321               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d322 u1D322               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d323 u1D323               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d324 u1D324               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d325 u1D325               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d326 u1D326               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d327 u1D327               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d328 u1D328               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d329 u1D329               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d32a u1D32A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d32b u1D32B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d32c u1D32C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d32d u1D32D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d32e u1D32E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d32f u1D32F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d330 u1D330               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d331 u1D331               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d332 u1D332               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d333 u1D333               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d334 u1D334               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d335 u1D335               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d336 u1D336               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d337 u1D337               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d338 u1D338               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d339 u1D339               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d33a u1D33A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d33b u1D33B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d33c u1D33C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d33d u1D33D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d33e u1D33E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d33f u1D33F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d340 u1D340               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d341 u1D341               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d342 u1D342               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d343 u1D343               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d344 u1D344               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d345 u1D345               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d346 u1D346               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d347 u1D347               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d348 u1D348               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d349 u1D349               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d34a u1D34A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d34b u1D34B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d34c u1D34C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d34d u1D34D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d34e u1D34E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d34f u1D34F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d350 u1D350               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d351 u1D351               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d352 u1D352               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d353 u1D353               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d354 u1D354               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d355 u1D355               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d356 u1D356               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1d400 u1D400               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d401 u1D401               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d402 u1D402               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d403 u1D403               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d404 u1D404               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d405 u1D405               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d406 u1D406               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d407 u1D407               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d408 u1D408               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d409 u1D409               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d40a u1D40A               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d40b u1D40B               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d40c u1D40C               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d40d u1D40D               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d40e u1D40E               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d40f u1D40F               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d410 u1D410               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d411 u1D411               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d412 u1D412               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d413 u1D413               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d414 u1D414               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d415 u1D415               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d416 u1D416               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d417 u1D417               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d418 u1D418               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d419 u1D419               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d41a u1D41A               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d41b u1D41B               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d41c u1D41C               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d41d u1D41D               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d41e u1D41E               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d41f u1D41F               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d420 u1D420               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d421 u1D421               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d422 u1D422               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d423 u1D423               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d424 u1D424               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d425 u1D425               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d426 u1D426               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d427 u1D427               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d428 u1D428               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d429 u1D429               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d42a u1D42A               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d42b u1D42B               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d42c u1D42C               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d42d u1D42D               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d42e u1D42E               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d42f u1D42F               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d430 u1D430               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d431 u1D431               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d432 u1D432               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d433 u1D433               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d434 u1D434               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d435 u1D435               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d436 u1D436               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d437 u1D437               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d438 u1D438               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d439 u1D439               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d43a u1D43A               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d43b u1D43B               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d43c u1D43C               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d43d u1D43D               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d43e u1D43E               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d43f u1D43F               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d440 u1D440               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d441 u1D441               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d442 u1D442               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d443 u1D443               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d444 u1D444               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d445 u1D445               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d446 u1D446               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d447 u1D447               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d448 u1D448               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d449 u1D449               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d44a u1D44A               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d44b u1D44B               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d44c u1D44C               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d44d u1D44D               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d44e u1D44E               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d44f u1D44F               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d450 u1D450               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d451 u1D451               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d452 u1D452               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d453 u1D453               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d454 u1D454               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d456 u1D456               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d457 u1D457               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d458 u1D458               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d459 u1D459               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d45a u1D45A               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d45b u1D45B               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d45c u1D45C               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d45d u1D45D               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d45e u1D45E               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d45f u1D45F               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d460 u1D460               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d461 u1D461               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d462 u1D462               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d463 u1D463               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d464 u1D464               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d465 u1D465               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d466 u1D466               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d467 u1D467               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d468 u1D468               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d469 u1D469               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d46a u1D46A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d46b u1D46B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d46c u1D46C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d46d u1D46D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d46e u1D46E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d46f u1D46F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d470 u1D470               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d471 u1D471               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d472 u1D472               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d473 u1D473               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d474 u1D474               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d475 u1D475               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d476 u1D476               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d477 u1D477               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d478 u1D478               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d479 u1D479               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d47a u1D47A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d47b u1D47B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d47c u1D47C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d47d u1D47D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d47e u1D47E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d47f u1D47F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d480 u1D480               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d481 u1D481               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d482 u1D482               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d483 u1D483               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d484 u1D484               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d485 u1D485               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d486 u1D486               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d487 u1D487               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d488 u1D488               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d489 u1D489               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d48a u1D48A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d48b u1D48B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d48c u1D48C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d48d u1D48D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d48e u1D48E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d48f u1D48F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d490 u1D490               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d491 u1D491               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d492 u1D492               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d493 u1D493               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d494 u1D494               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d495 u1D495               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d496 u1D496               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d497 u1D497               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d498 u1D498               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d499 u1D499               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d49a u1D49A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d49b u1D49B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d538 u1D538               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d539 u1D539               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d53b u1D53B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d53c u1D53C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d53d u1D53D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d53e u1D53E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d540 u1D540               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d541 u1D541               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d542 u1D542               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d543 u1D543               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d544 u1D544               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d546 u1D546               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d54a u1D54A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d54b u1D54B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d54c u1D54C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d54d u1D54D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d54e u1D54E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d54f u1D54F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d550 u1D550               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d552 u1D552               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d553 u1D553               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d554 u1D554               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d555 u1D555               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d556 u1D556               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d557 u1D557               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d558 u1D558               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d559 u1D559               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d55a u1D55A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d55b u1D55B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d55c u1D55C               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d55d u1D55D               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d55e u1D55E               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d55f u1D55F               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d560 u1D560               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d561 u1D561               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d562 u1D562               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d563 u1D563               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d564 u1D564               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d565 u1D565               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d566 u1D566               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d567 u1D567               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d568 u1D568               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d569 u1D569               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d56a u1D56A               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d56b u1D56B               2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed)
+U+1d5a0 u1D5A0               2.23 (Sans, Sans Condensed)
+U+1d5a1 u1D5A1               2.23 (Sans, Sans Condensed)
+U+1d5a2 u1D5A2               2.23 (Sans, Sans Condensed)
+U+1d5a3 u1D5A3               2.23 (Sans, Sans Condensed)
+U+1d5a4 u1D5A4               2.23 (Sans, Sans Condensed)
+U+1d5a5 u1D5A5               2.23 (Sans, Sans Condensed)
+U+1d5a6 u1D5A6               2.23 (Sans, Sans Condensed)
+U+1d5a7 u1D5A7               2.23 (Sans, Sans Condensed)
+U+1d5a8 u1D5A8               2.23 (Sans, Sans Condensed)
+U+1d5a9 u1D5A9               2.23 (Sans, Sans Condensed)
+U+1d5aa u1D5AA               2.23 (Sans, Sans Condensed)
+U+1d5ab u1D5AB               2.23 (Sans, Sans Condensed)
+U+1d5ac u1D5AC               2.23 (Sans, Sans Condensed)
+U+1d5ad u1D5AD               2.23 (Sans, Sans Condensed)
+U+1d5ae u1D5AE               2.23 (Sans, Sans Condensed)
+U+1d5af u1D5AF               2.23 (Sans, Sans Condensed)
+U+1d5b0 u1D5B0               2.23 (Sans, Sans Condensed)
+U+1d5b1 u1D5B1               2.23 (Sans, Sans Condensed)
+U+1d5b2 u1D5B2               2.23 (Sans, Sans Condensed)
+U+1d5b3 u1D5B3               2.23 (Sans, Sans Condensed)
+U+1d5b4 u1D5B4               2.23 (Sans, Sans Condensed)
+U+1d5b5 u1D5B5               2.23 (Sans, Sans Condensed)
+U+1d5b6 u1D5B6               2.23 (Sans, Sans Condensed)
+U+1d5b7 u1D5B7               2.23 (Sans, Sans Condensed)
+U+1d5b8 u1D5B8               2.23 (Sans, Sans Condensed)
+U+1d5b9 u1D5B9               2.23 (Sans, Sans Condensed)
+U+1d5ba u1D5BA               2.23 (Sans, Sans Condensed)
+U+1d5bb u1D5BB               2.23 (Sans, Sans Condensed)
+U+1d5bc u1D5BC               2.23 (Sans, Sans Condensed)
+U+1d5bd u1D5BD               2.23 (Sans, Sans Condensed)
+U+1d5be u1D5BE               2.23 (Sans, Sans Condensed)
+U+1d5bf u1D5BF               2.23 (Sans, Sans Condensed)
+U+1d5c0 u1D5C0               2.23 (Sans, Sans Condensed)
+U+1d5c1 u1D5C1               2.23 (Sans, Sans Condensed)
+U+1d5c2 u1D5C2               2.23 (Sans, Sans Condensed)
+U+1d5c3 u1D5C3               2.23 (Sans, Sans Condensed)
+U+1d5c4 u1D5C4               2.23 (Sans, Sans Condensed)
+U+1d5c5 u1D5C5               2.23 (Sans, Sans Condensed)
+U+1d5c6 u1D5C6               2.23 (Sans, Sans Condensed)
+U+1d5c7 u1D5C7               2.23 (Sans, Sans Condensed)
+U+1d5c8 u1D5C8               2.23 (Sans, Sans Condensed)
+U+1d5c9 u1D5C9               2.23 (Sans, Sans Condensed)
+U+1d5ca u1D5CA               2.23 (Sans, Sans Condensed)
+U+1d5cb u1D5CB               2.23 (Sans, Sans Condensed)
+U+1d5cc u1D5CC               2.23 (Sans, Sans Condensed)
+U+1d5cd u1D5CD               2.23 (Sans, Sans Condensed)
+U+1d5ce u1D5CE               2.23 (Sans, Sans Condensed)
+U+1d5cf u1D5CF               2.23 (Sans, Sans Condensed)
+U+1d5d0 u1D5D0               2.23 (Sans, Sans Condensed)
+U+1d5d1 u1D5D1               2.23 (Sans, Sans Condensed)
+U+1d5d2 u1D5D2               2.23 (Sans, Sans Condensed)
+U+1d5d3 u1D5D3               2.23 (Sans, Sans Condensed)
+U+1d5d4 u1D5D4               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5d5 u1D5D5               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5d6 u1D5D6               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5d7 u1D5D7               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5d8 u1D5D8               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5d9 u1D5D9               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5da u1D5DA               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5db u1D5DB               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5dc u1D5DC               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5dd u1D5DD               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5de u1D5DE               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5df u1D5DF               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e0 u1D5E0               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e1 u1D5E1               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e2 u1D5E2               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e3 u1D5E3               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e4 u1D5E4               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e5 u1D5E5               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e6 u1D5E6               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e7 u1D5E7               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e8 u1D5E8               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5e9 u1D5E9               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5ea u1D5EA               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5eb u1D5EB               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5ec u1D5EC               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5ed u1D5ED               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5ee u1D5EE               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5ef u1D5EF               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f0 u1D5F0               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f1 u1D5F1               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f2 u1D5F2               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f3 u1D5F3               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f4 u1D5F4               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f5 u1D5F5               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f6 u1D5F6               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f7 u1D5F7               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f8 u1D5F8               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5f9 u1D5F9               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5fa u1D5FA               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5fb u1D5FB               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5fc u1D5FC               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5fd u1D5FD               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5fe u1D5FE               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d5ff u1D5FF               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d600 u1D600               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d601 u1D601               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d602 u1D602               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d603 u1D603               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d604 u1D604               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d605 u1D605               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d606 u1D606               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d607 u1D607               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d608 u1D608               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d609 u1D609               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d60a u1D60A               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d60b u1D60B               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d60c u1D60C               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d60d u1D60D               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d60e u1D60E               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d60f u1D60F               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d610 u1D610               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d611 u1D611               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d612 u1D612               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d613 u1D613               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d614 u1D614               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d615 u1D615               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d616 u1D616               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d617 u1D617               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d618 u1D618               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d619 u1D619               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d61a u1D61A               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d61b u1D61B               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d61c u1D61C               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d61d u1D61D               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d61e u1D61E               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d61f u1D61F               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d620 u1D620               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d621 u1D621               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d622 u1D622               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d623 u1D623               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d624 u1D624               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d625 u1D625               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d626 u1D626               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d627 u1D627               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d628 u1D628               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d629 u1D629               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d62a u1D62A               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d62b u1D62B               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d62c u1D62C               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d62d u1D62D               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d62e u1D62E               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d62f u1D62F               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d630 u1D630               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d631 u1D631               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d632 u1D632               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d633 u1D633               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d634 u1D634               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d635 u1D635               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d636 u1D636               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d637 u1D637               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d638 u1D638               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d639 u1D639               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d63a u1D63A               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d63b u1D63B               2.23 (Sans Condensed Oblique, Sans Oblique)
+U+1d63c u1D63C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d63d u1D63D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d63e u1D63E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d63f u1D63F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d640 u1D640               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d641 u1D641               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d642 u1D642               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d643 u1D643               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d644 u1D644               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d645 u1D645               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d646 u1D646               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d647 u1D647               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d648 u1D648               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d649 u1D649               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d64a u1D64A               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d64b u1D64B               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d64c u1D64C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d64d u1D64D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d64e u1D64E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d64f u1D64F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d650 u1D650               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d651 u1D651               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d652 u1D652               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d653 u1D653               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d654 u1D654               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d655 u1D655               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d656 u1D656               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d657 u1D657               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d658 u1D658               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d659 u1D659               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d65a u1D65A               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d65b u1D65B               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d65c u1D65C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d65d u1D65D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d65e u1D65E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d65f u1D65F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d660 u1D660               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d661 u1D661               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d662 u1D662               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d663 u1D663               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d664 u1D664               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d665 u1D665               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d666 u1D666               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d667 u1D667               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d668 u1D668               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d669 u1D669               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d66a u1D66A               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d66b u1D66B               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d66c u1D66C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d66d u1D66D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d66e u1D66E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d66f u1D66F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d670 u1D670               2.23 (Sans Mono)
+U+1d671 u1D671               2.23 (Sans Mono)
+U+1d672 u1D672               2.23 (Sans Mono)
+U+1d673 u1D673               2.23 (Sans Mono)
+U+1d674 u1D674               2.23 (Sans Mono)
+U+1d675 u1D675               2.23 (Sans Mono)
+U+1d676 u1D676               2.23 (Sans Mono)
+U+1d677 u1D677               2.23 (Sans Mono)
+U+1d678 u1D678               2.23 (Sans Mono)
+U+1d679 u1D679               2.23 (Sans Mono)
+U+1d67a u1D67A               2.23 (Sans Mono)
+U+1d67b u1D67B               2.23 (Sans Mono)
+U+1d67c u1D67C               2.23 (Sans Mono)
+U+1d67d u1D67D               2.23 (Sans Mono)
+U+1d67e u1D67E               2.23 (Sans Mono)
+U+1d67f u1D67F               2.23 (Sans Mono)
+U+1d680 u1D680               2.23 (Sans Mono)
+U+1d681 u1D681               2.23 (Sans Mono)
+U+1d682 u1D682               2.23 (Sans Mono)
+U+1d683 u1D683               2.23 (Sans Mono)
+U+1d684 u1D684               2.23 (Sans Mono)
+U+1d685 u1D685               2.23 (Sans Mono)
+U+1d686 u1D686               2.23 (Sans Mono)
+U+1d687 u1D687               2.23 (Sans Mono)
+U+1d688 u1D688               2.23 (Sans Mono)
+U+1d689 u1D689               2.23 (Sans Mono)
+U+1d68a u1D68A               2.23 (Sans Mono)
+U+1d68b u1D68B               2.23 (Sans Mono)
+U+1d68c u1D68C               2.23 (Sans Mono)
+U+1d68d u1D68D               2.23 (Sans Mono)
+U+1d68e u1D68E               2.23 (Sans Mono)
+U+1d68f u1D68F               2.23 (Sans Mono)
+U+1d690 u1D690               2.23 (Sans Mono)
+U+1d691 u1D691               2.23 (Sans Mono)
+U+1d692 u1D692               2.23 (Sans Mono)
+U+1d693 u1D693               2.23 (Sans Mono)
+U+1d694 u1D694               2.23 (Sans Mono)
+U+1d695 u1D695               2.23 (Sans Mono)
+U+1d696 u1D696               2.23 (Sans Mono)
+U+1d697 u1D697               2.23 (Sans Mono)
+U+1d698 u1D698               2.23 (Sans Mono)
+U+1d699 u1D699               2.23 (Sans Mono)
+U+1d69a u1D69A               2.23 (Sans Mono)
+U+1d69b u1D69B               2.23 (Sans Mono)
+U+1d69c u1D69C               2.23 (Sans Mono)
+U+1d69d u1D69D               2.23 (Sans Mono)
+U+1d69e u1D69E               2.23 (Sans Mono)
+U+1d69f u1D69F               2.23 (Sans Mono)
+U+1d6a0 u1D6A0               2.23 (Sans Mono)
+U+1d6a1 u1D6A1               2.23 (Sans Mono)
+U+1d6a2 u1D6A2               2.23 (Sans Mono)
+U+1d6a3 u1D6A3               2.23 (Sans Mono)
+U+1d6a4 u1D6A4               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6a5 u1D6A5               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6a8 u1D6A8               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6a9 u1D6A9               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6aa u1D6AA               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6ab u1D6AB               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6ac u1D6AC               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6ad u1D6AD               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6ae u1D6AE               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6af u1D6AF               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b0 u1D6B0               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b1 u1D6B1               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b2 u1D6B2               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b3 u1D6B3               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b4 u1D6B4               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b5 u1D6B5               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b6 u1D6B6               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b7 u1D6B7               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b8 u1D6B8               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6b9 u1D6B9               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6ba u1D6BA               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6bb u1D6BB               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6bc u1D6BC               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6bd u1D6BD               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6be u1D6BE               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6bf u1D6BF               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c0 u1D6C0               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c1 u1D6C1               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c2 u1D6C2               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c3 u1D6C3               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c4 u1D6C4               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c5 u1D6C5               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c6 u1D6C6               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c7 u1D6C7               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c8 u1D6C8               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6c9 u1D6C9               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6ca u1D6CA               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6cb u1D6CB               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6cc u1D6CC               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6cd u1D6CD               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6ce u1D6CE               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6cf u1D6CF               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d0 u1D6D0               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d1 u1D6D1               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d2 u1D6D2               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d3 u1D6D3               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d4 u1D6D4               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d5 u1D6D5               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d6 u1D6D6               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d7 u1D6D7               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d8 u1D6D8               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6d9 u1D6D9               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6da u1D6DA               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6db u1D6DB               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6dc u1D6DC               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6dd u1D6DD               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6de u1D6DE               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6df u1D6DF               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6e0 u1D6E0               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6e1 u1D6E1               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d6e2 u1D6E2               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6e3 u1D6E3               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6e4 u1D6E4               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6e5 u1D6E5               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6e6 u1D6E6               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6e7 u1D6E7               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6e8 u1D6E8               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6e9 u1D6E9               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6ea u1D6EA               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6eb u1D6EB               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6ec u1D6EC               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6ed u1D6ED               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6ee u1D6EE               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6ef u1D6EF               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f0 u1D6F0               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f1 u1D6F1               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f2 u1D6F2               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f3 u1D6F3               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f4 u1D6F4               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f5 u1D6F5               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f6 u1D6F6               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f7 u1D6F7               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f8 u1D6F8               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6f9 u1D6F9               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6fa u1D6FA               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6fb u1D6FB               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6fc u1D6FC               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6fd u1D6FD               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6fe u1D6FE               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d6ff u1D6FF               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d700 u1D700               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d701 u1D701               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d702 u1D702               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d703 u1D703               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d704 u1D704               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d705 u1D705               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d706 u1D706               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d707 u1D707               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d708 u1D708               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d709 u1D709               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d70a u1D70A               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d70b u1D70B               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d70c u1D70C               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d70d u1D70D               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d70e u1D70E               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d70f u1D70F               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d710 u1D710               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d711 u1D711               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d712 u1D712               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d713 u1D713               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d714 u1D714               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d715 u1D715               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d716 u1D716               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d717 u1D717               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d718 u1D718               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d719 u1D719               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d71a u1D71A               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d71b u1D71B               2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic)
+U+1d71c u1D71C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d71d u1D71D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d71e u1D71E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d71f u1D71F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d720 u1D720               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d721 u1D721               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d722 u1D722               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d723 u1D723               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d724 u1D724               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d725 u1D725               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d726 u1D726               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d727 u1D727               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d728 u1D728               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d729 u1D729               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d72a u1D72A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d72b u1D72B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d72c u1D72C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d72d u1D72D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d72e u1D72E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d72f u1D72F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d730 u1D730               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d731 u1D731               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d732 u1D732               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d733 u1D733               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d734 u1D734               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d735 u1D735               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d736 u1D736               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d737 u1D737               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d738 u1D738               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d739 u1D739               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d73a u1D73A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d73b u1D73B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d73c u1D73C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d73d u1D73D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d73e u1D73E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d73f u1D73F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d740 u1D740               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d741 u1D741               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d742 u1D742               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d743 u1D743               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d744 u1D744               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d745 u1D745               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d746 u1D746               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d747 u1D747               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d748 u1D748               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d749 u1D749               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d74a u1D74A               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d74b u1D74B               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d74c u1D74C               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d74d u1D74D               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d74e u1D74E               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d74f u1D74F               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d750 u1D750               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d751 u1D751               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d752 u1D752               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d753 u1D753               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d754 u1D754               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d755 u1D755               2.23 (Serif Bold Italic, Serif Condensed Bold Italic)
+U+1d756 u1D756               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d757 u1D757               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d758 u1D758               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d759 u1D759               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d75a u1D75A               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d75b u1D75B               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d75c u1D75C               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d75d u1D75D               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d75e u1D75E               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d75f u1D75F               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d760 u1D760               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d761 u1D761               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d762 u1D762               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d763 u1D763               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d764 u1D764               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d765 u1D765               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d766 u1D766               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d767 u1D767               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d768 u1D768               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d769 u1D769               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d76a u1D76A               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d76b u1D76B               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d76c u1D76C               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d76d u1D76D               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d76e u1D76E               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d76f u1D76F               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d770 u1D770               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d771 u1D771               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d772 u1D772               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d773 u1D773               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d774 u1D774               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d775 u1D775               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d776 u1D776               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d777 u1D777               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d778 u1D778               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d779 u1D779               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d77a u1D77A               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d77b u1D77B               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d77c u1D77C               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d77d u1D77D               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d77e u1D77E               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d77f u1D77F               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d780 u1D780               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d781 u1D781               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d782 u1D782               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d783 u1D783               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d784 u1D784               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d785 u1D785               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d786 u1D786               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d787 u1D787               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d788 u1D788               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d789 u1D789               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d78a u1D78A               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d78b u1D78B               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d78c u1D78C               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d78d u1D78D               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d78e u1D78E               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d78f u1D78F               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d790 u1D790               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d791 u1D791               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d792 u1D792               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d793 u1D793               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d794 u1D794               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d795 u1D795               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d796 u1D796               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d797 u1D797               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d798 u1D798               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d799 u1D799               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d79a u1D79A               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d79b u1D79B               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d79c u1D79C               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d79d u1D79D               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d79e u1D79E               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d79f u1D79F               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a0 u1D7A0               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a1 u1D7A1               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a2 u1D7A2               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a3 u1D7A3               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a4 u1D7A4               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a5 u1D7A5               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a6 u1D7A6               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a7 u1D7A7               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a8 u1D7A8               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7a9 u1D7A9               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7aa u1D7AA               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7ab u1D7AB               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7ac u1D7AC               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7ad u1D7AD               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7ae u1D7AE               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7af u1D7AF               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b0 u1D7B0               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b1 u1D7B1               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b2 u1D7B2               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b3 u1D7B3               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b4 u1D7B4               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b5 u1D7B5               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b6 u1D7B6               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b7 u1D7B7               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b8 u1D7B8               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7b9 u1D7B9               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7ba u1D7BA               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7bb u1D7BB               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7bc u1D7BC               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7bd u1D7BD               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7be u1D7BE               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7bf u1D7BF               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c0 u1D7C0               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c1 u1D7C1               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c2 u1D7C2               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c3 u1D7C3               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c4 u1D7C4               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c5 u1D7C5               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c6 u1D7C6               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c7 u1D7C7               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c8 u1D7C8               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7c9 u1D7C9               2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique)
+U+1d7ca u1D7CA               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7cb u1D7CB               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7ce u1D7CE               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7cf u1D7CF               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d0 u1D7D0               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d1 u1D7D1               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d2 u1D7D2               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d3 u1D7D3               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d4 u1D7D4               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d5 u1D7D5               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d6 u1D7D6               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d7 u1D7D7               2.23 (Serif Bold, Serif Condensed Bold)
+U+1d7d8 u1D7D8               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7d9 u1D7D9               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7da u1D7DA               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7db u1D7DB               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7dc u1D7DC               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7dd u1D7DD               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7de u1D7DE               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7df u1D7DF               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7e0 u1D7E0               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7e1 u1D7E1               2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold)
+U+1d7e2 u1D7E2               2.23 (Sans, Sans Condensed)
+U+1d7e3 u1D7E3               2.23 (Sans, Sans Condensed)
+U+1d7e4 u1D7E4               2.23 (Sans, Sans Condensed)
+U+1d7e5 u1D7E5               2.23 (Sans, Sans Condensed)
+U+1d7e6 u1D7E6               2.23 (Sans, Sans Condensed)
+U+1d7e7 u1D7E7               2.23 (Sans, Sans Condensed)
+U+1d7e8 u1D7E8               2.23 (Sans, Sans Condensed)
+U+1d7e9 u1D7E9               2.23 (Sans, Sans Condensed)
+U+1d7ea u1D7EA               2.23 (Sans, Sans Condensed)
+U+1d7eb u1D7EB               2.23 (Sans, Sans Condensed)
+U+1d7ec u1D7EC               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7ed u1D7ED               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7ee u1D7EE               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7ef u1D7EF               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7f0 u1D7F0               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7f1 u1D7F1               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7f2 u1D7F2               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7f3 u1D7F3               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7f4 u1D7F4               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7f5 u1D7F5               2.23 (Sans Bold, Sans Condensed Bold)
+U+1d7f6 u1D7F6               2.23 (Sans Mono)
+U+1d7f7 u1D7F7               2.23 (Sans Mono)
+U+1d7f8 u1D7F8               2.23 (Sans Mono)
+U+1d7f9 u1D7F9               2.23 (Sans Mono)
+U+1d7fa u1D7FA               2.23 (Sans Mono)
+U+1d7fb u1D7FB               2.23 (Sans Mono)
+U+1d7fc u1D7FC               2.23 (Sans Mono)
+U+1d7fd u1D7FD               2.23 (Sans Mono)
+U+1d7fe u1D7FE               2.23 (Sans Mono)
+U+1d7ff u1D7FF               2.23 (Sans Mono)
+U+1f030 u1F030               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f031 u1F031               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f032 u1F032               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f033 u1F033               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f034 u1F034               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f035 u1F035               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f036 u1F036               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f037 u1F037               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f038 u1F038               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f039 u1F039               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f03a u1F03A               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f03b u1F03B               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f03c u1F03C               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f03d u1F03D               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f03e u1F03E               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f03f u1F03F               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f040 u1F040               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f041 u1F041               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f042 u1F042               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f043 u1F043               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f044 u1F044               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f045 u1F045               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f046 u1F046               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f047 u1F047               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f048 u1F048               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f049 u1F049               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f04a u1F04A               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f04b u1F04B               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f04c u1F04C               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f04d u1F04D               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f04e u1F04E               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f04f u1F04F               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f050 u1F050               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f051 u1F051               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f052 u1F052               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f053 u1F053               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f054 u1F054               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f055 u1F055               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f056 u1F056               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f057 u1F057               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f058 u1F058               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f059 u1F059               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f05a u1F05A               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f05b u1F05B               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f05c u1F05C               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f05d u1F05D               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f05e u1F05E               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f05f u1F05F               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f060 u1F060               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f061 u1F061               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f062 u1F062               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f063 u1F063               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f064 u1F064               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f065 u1F065               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f066 u1F066               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f067 u1F067               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f068 u1F068               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f069 u1F069               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f06a u1F06A               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f06b u1F06B               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f06c u1F06C               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f06d u1F06D               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f06e u1F06E               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f06f u1F06F               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f070 u1F070               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f071 u1F071               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f072 u1F072               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f073 u1F073               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f074 u1F074               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f075 u1F075               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f076 u1F076               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f077 u1F077               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f078 u1F078               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f079 u1F079               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f07a u1F07A               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f07b u1F07B               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f07c u1F07C               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f07d u1F07D               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f07e u1F07E               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f07f u1F07F               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f080 u1F080               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f081 u1F081               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f082 u1F082               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f083 u1F083               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f084 u1F084               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f085 u1F085               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f086 u1F086               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f087 u1F087               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f088 u1F088               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f089 u1F089               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f08a u1F08A               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f08b u1F08B               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f08c u1F08C               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f08d u1F08D               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f08e u1F08E               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f08f u1F08F               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f090 u1F090               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f091 u1F091               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f092 u1F092               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f093 u1F093               2.32 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a0 u1F0A0               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a1 u1F0A1               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a2 u1F0A2               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a3 u1F0A3               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a4 u1F0A4               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a5 u1F0A5               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a6 u1F0A6               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a7 u1F0A7               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a8 u1F0A8               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0a9 u1F0A9               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0aa u1F0AA               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0ab u1F0AB               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0ac u1F0AC               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0ad u1F0AD               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0ae u1F0AE               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b1 u1F0B1               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b2 u1F0B2               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b3 u1F0B3               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b4 u1F0B4               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b5 u1F0B5               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b6 u1F0B6               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b7 u1F0B7               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b8 u1F0B8               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0b9 u1F0B9               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0ba u1F0BA               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0bb u1F0BB               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0bc u1F0BC               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0bd u1F0BD               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0be u1F0BE               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c1 u1F0C1               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c2 u1F0C2               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c3 u1F0C3               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c4 u1F0C4               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c5 u1F0C5               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c6 u1F0C6               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c7 u1F0C7               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c8 u1F0C8               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0c9 u1F0C9               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0ca u1F0CA               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0cb u1F0CB               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0cc u1F0CC               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0cd u1F0CD               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0ce u1F0CE               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0cf u1F0CF               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d1 u1F0D1               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d2 u1F0D2               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d3 u1F0D3               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d4 u1F0D4               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d5 u1F0D5               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d6 u1F0D6               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d7 u1F0D7               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d8 u1F0D8               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0d9 u1F0D9               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0da u1F0DA               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0db u1F0DB               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0dc u1F0DC               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0dd u1F0DD               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0de u1F0DE               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f0df u1F0DF               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f42d u1F42D               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f42e u1F42E               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f431 u1F431               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f435 u1F435               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f601 u1F601               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f602 u1F602               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f603 u1F603               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f604 u1F604               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f605 u1F605               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f606 u1F606               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f607 u1F607               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f608 u1F608               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f609 u1F609               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f60a u1F60A               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f60b u1F60B               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f60c u1F60C               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f60d u1F60D               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f60e u1F60E               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f60f u1F60F               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f610 u1F610               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f612 u1F612               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f613 u1F613               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f614 u1F614               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f616 u1F616               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f618 u1F618               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f61a u1F61A               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f61c u1F61C               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f61d u1F61D               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f61e u1F61E               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f620 u1F620               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f621 u1F621               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f622 u1F622               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f623 u1F623               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f625 u1F625               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f628 u1F628               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f629 u1F629               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f62a u1F62A               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f62b u1F62B               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f62d u1F62D               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f630 u1F630               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f631 u1F631               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f632 u1F632               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f633 u1F633               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f635 u1F635               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f636 u1F636               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f637 u1F637               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f638 u1F638               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f639 u1F639               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f63a u1F63A               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f63b u1F63B               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f63c u1F63C               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f63d u1F63D               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f63e u1F63E               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f63f u1F63F               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
+U+1f640 u1F640               2.33 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique)
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/unicover.txt b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/unicover.txt
new file mode 100644
index 00000000..42c21225
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavu-fonts-ttf-2.33/unicover.txt
@@ -0,0 +1,215 @@
+This is the Unicode coverage file for DejaVu fonts
+($Id$)
+
+Control and similar characters are discounted from totals.
+
+                                                Sans               Serif              Sans Mono          
+U+0000 Basic Latin                              100% (95/95)       100% (95/95)       100% (95/95)      
+U+0080 Latin-1 Supplement                       100% (96/96)       100% (96/96)       100% (96/96)      
+U+0100 Latin Extended-A                         100% (128/128)     100% (128/128)     100% (128/128)    
+U+0180 Latin Extended-B                         100% (208/208)     100% (208/208)      86% (180/208)    
+U+0250 IPA Extensions                           100% (96/96)       100% (96/96)       100% (96/96)      
+U+02b0 Spacing Modifier Letters                  78% (63/80)        57% (46/80)        60% (48/80)      
+U+0300 Combining Diacritical Marks               83% (93/112)       60% (68/112)       59% (67/112)     
+U+0370 Greek and Coptic                         100% (134/134)      89% (120/134)      82% (110/134)    
+U+0400 Cyrillic                                 100% (256/256)      78% (200/256)      70% (180/256)    
+U+0500 Cyrillic Supplement                       95% (38/40)        25% (10/40)        15% (6/40)       
+U+0530 Armenian                                 100% (86/86)       100% (86/86)       100% (86/86)      
+U+0590 Hebrew                                    62% (54/87)            (0/87)             (0/87)       
+U+0600 Arabic                                    63% (161/252)          (0/252)        39% (99/252)     
+U+0700 Syriac                                        (0/77)             (0/77)             (0/77)       
+U+0750 Arabic Supplement                             (0/48)             (0/48)             (0/48)       
+U+0780 Thaana                                        (0/50)             (0/50)             (0/50)       
+U+07c0 NKo                                       91% (54/59)            (0/59)             (0/59)       
+U+0800 Samaritan                                     (0/61)             (0/61)             (0/61)       
+U+0840 Mandaic                                       (0/29)             (0/29)             (0/29)       
+U+0900 Devanagari                                    (0/127)            (0/127)            (0/127)      
+U+0980 Bengali                                       (0/92)             (0/92)             (0/92)       
+U+0a00 Gurmukhi                                      (0/79)             (0/79)             (0/79)       
+U+0a80 Gujarati                                      (0/83)             (0/83)             (0/83)       
+U+0b00 Oriya                                         (0/90)             (0/90)             (0/90)       
+U+0b80 Tamil                                         (0/72)             (0/72)             (0/72)       
+U+0c00 Telugu                                        (0/93)             (0/93)             (0/93)       
+U+0c80 Kannada                                       (0/86)             (0/86)             (0/86)       
+U+0d00 Malayalam                                     (0/98)             (0/98)             (0/98)       
+U+0d80 Sinhala                                       (0/80)             (0/80)             (0/80)       
+U+0e00 Thai                                       1% (1/87)             (0/87)             (0/87)       
+U+0e80 Lao                                      100% (65/65)            (0/65)         70% (46/65)      
+U+0f00 Tibetan                                       (0/211)            (0/211)            (0/211)      
+U+1000 Myanmar                                       (0/160)            (0/160)            (0/160)      
+U+10a0 Georgian                                 100% (83/83)       100% (83/83)        54% (45/83)      
+U+1100 Hangul Jamo                                   (0/256)            (0/256)            (0/256)      
+U+1200 Ethiopic                                      (0/358)            (0/358)            (0/358)      
+U+1380 Ethiopic Supplement                           (0/26)             (0/26)             (0/26)       
+U+13a0 Cherokee                                      (0/85)             (0/85)             (0/85)       
+U+1400 Unified Canadian Aboriginal Syllabics     63% (404/640)          (0/640)            (0/640)      
+U+1680 Ogham                                    100% (29/29)            (0/29)             (0/29)       
+U+16a0 Runic                                         (0/81)             (0/81)             (0/81)       
+U+1700 Tagalog                                       (0/20)             (0/20)             (0/20)       
+U+1720 Hanunoo                                       (0/23)             (0/23)             (0/23)       
+U+1740 Buhid                                         (0/20)             (0/20)             (0/20)       
+U+1760 Tagbanwa                                      (0/18)             (0/18)             (0/18)       
+U+1780 Khmer                                         (0/114)            (0/114)            (0/114)      
+U+1800 Mongolian                                     (0/156)            (0/156)            (0/156)      
+U+18b0 Unified Canadian Aboriginal Syllabics Extended      (0/70)             (0/70)             (0/70)       
+U+1900 Limbu                                         (0/66)             (0/66)             (0/66)       
+U+1950 Tai Le                                        (0/35)             (0/35)             (0/35)       
+U+1980 New Tai Lue                                   (0/83)             (0/83)             (0/83)       
+U+19e0 Khmer Symbols                                 (0/32)             (0/32)             (0/32)       
+U+1a00 Buginese                                      (0/30)             (0/30)             (0/30)       
+U+1a20 Tai Tham                                      (0/127)            (0/127)            (0/127)      
+U+1b00 Balinese                                      (0/121)            (0/121)            (0/121)      
+U+1b80 Sundanese                                     (0/55)             (0/55)             (0/55)       
+U+1bc0 Batak                                         (0/56)             (0/56)             (0/56)       
+U+1c00 Lepcha                                        (0/74)             (0/74)             (0/74)       
+U+1c50 Ol Chiki                                      (0/48)             (0/48)             (0/48)       
+U+1cd0 Vedic Extensions                              (0/35)             (0/35)             (0/35)       
+U+1d00 Phonetic Extensions                       82% (106/128)      86% (111/128)      48% (62/128)     
+U+1d80 Phonetic Extensions Supplement            59% (38/64)        59% (38/64)        57% (37/64)      
+U+1dc0 Combining Diacritical Marks Supplement    13% (6/43)         13% (6/43)             (0/43)       
+U+1e00 Latin Extended Additional                 98% (252/256)      98% (252/256)      71% (182/256)    
+U+1f00 Greek Extended                           100% (233/233)     100% (233/233)     100% (233/233)    
+U+2000 General Punctuation                      100% (107/107)      81% (87/107)       48% (52/107)     
+U+2070 Superscripts and Subscripts              100% (42/42)       100% (42/42)       100% (42/42)      
+U+20a0 Currency Symbols                          92% (24/26)        26% (7/26)         92% (24/26)      
+U+20d0 Combining Diacritical Marks for Symbols   21% (7/33)             (0/33)             (0/33)       
+U+2100 Letterlike Symbols                        93% (75/80)        40% (32/80)        21% (17/80)      
+U+2150 Number Forms                              94% (55/58)        94% (55/58)        22% (13/58)      
+U+2190 Arrows                                   100% (112/112)     100% (112/112)     100% (112/112)    
+U+2200 Mathematical Operators                   100% (256/256)      39% (100/256)      62% (159/256)    
+U+2300 Miscellaneous Technical                   26% (65/244)       14% (35/244)       47% (117/244)    
+U+2400 Control Pictures                           5% (2/39)          2% (1/39)          2% (1/39)       
+U+2440 Optical Character Recognition                 (0/11)             (0/11)             (0/11)       
+U+2460 Enclosed Alphanumerics                     6% (10/160)           (0/160)            (0/160)      
+U+2500 Box Drawing                              100% (128/128)     100% (128/128)     100% (128/128)    
+U+2580 Block Elements                           100% (32/32)       100% (32/32)       100% (32/32)      
+U+25a0 Geometric Shapes                         100% (96/96)       100% (96/96)       100% (96/96)      
+U+2600 Miscellaneous Symbols                     73% (187/256)      11% (30/256)       58% (149/256)    
+U+2700 Dingbats                                  91% (174/191)       0% (1/191)        75% (144/191)    
+U+27c0 Miscellaneous Mathematical Symbols-A      19% (9/46)         10% (5/46)         10% (5/46)       
+U+27f0 Supplemental Arrows-A                    100% (16/16)       100% (16/16)            (0/16)       
+U+2800 Braille Patterns                         100% (256/256)     100% (256/256)          (0/256)      
+U+2900 Supplemental Arrows-B                      4% (6/128)       100% (128/128)          (0/128)      
+U+2980 Miscellaneous Mathematical Symbols-B      10% (13/128)        0% (1/128)         2% (3/128)      
+U+2a00 Supplemental Mathematical Operators       28% (72/256)        1% (4/256)         0% (1/256)      
+U+2b00 Miscellaneous Symbols and Arrows          40% (35/87)        31% (27/87)        10% (9/87)       
+U+2c00 Glagolitic                                    (0/94)             (0/94)             (0/94)       
+U+2c60 Latin Extended-C                          96% (31/32)        81% (26/32)        43% (14/32)      
+U+2c80 Coptic                                        (0/121)            (0/121)            (0/121)      
+U+2d00 Georgian Supplement                           (0/38)        100% (38/38)            (0/38)       
+U+2d30 Tifinagh                                  96% (55/57)            (0/57)             (0/57)       
+U+2d80 Ethiopic Extended                             (0/79)             (0/79)             (0/79)       
+U+2de0 Cyrillic Extended-A                           (0/32)             (0/32)             (0/32)       
+U+2e00 Supplemental Punctuation                  12% (6/50)         12% (6/50)         12% (6/50)       
+U+2e80 CJK Radicals Supplement                       (0/115)            (0/115)            (0/115)      
+U+2f00 Kangxi Radicals                               (0/214)            (0/214)            (0/214)      
+U+2ff0 Ideographic Description Characters            (0/12)             (0/12)             (0/12)       
+U+3000 CJK Symbols and Punctuation                   (0/64)             (0/64)             (0/64)       
+U+3040 Hiragana                                      (0/93)             (0/93)             (0/93)       
+U+30a0 Katakana                                      (0/96)             (0/96)             (0/96)       
+U+3100 Bopomofo                                      (0/41)             (0/41)             (0/41)       
+U+3130 Hangul Compatibility Jamo                     (0/94)             (0/94)             (0/94)       
+U+3190 Kanbun                                        (0/16)             (0/16)             (0/16)       
+U+31a0 Bopomofo Extended                             (0/27)             (0/27)             (0/27)       
+U+31c0 CJK Strokes                                   (0/36)             (0/36)             (0/36)       
+U+31f0 Katakana Phonetic Extensions                  (0/16)             (0/16)             (0/16)       
+U+3200 Enclosed CJK Letters and Months               (0/254)            (0/254)            (0/254)      
+U+3300 CJK Compatibility                             (0/256)            (0/256)            (0/256)      
+U+3400 CJK Unified Ideographs Extension A            (0/0)              (0/0)              (0/0)        
+U+4dc0 Yijing Hexagram Symbols                  100% (64/64)            (0/64)             (0/64)       
+U+4e00 CJK Unified Ideographs                        (0/0)              (0/0)              (0/0)        
+U+a000 Yi Syllables                                  (0/1165)           (0/1165)           (0/1165)     
+U+a490 Yi Radicals                                   (0/55)             (0/55)             (0/55)       
+U+a4d0 Lisu                                          (0/48)             (0/48)             (0/48)       
+U+a500 Vai                                           (0/300)            (0/300)            (0/300)      
+U+a640 Cyrillic Extended-B                       38% (31/80)        12% (10/80)            (0/80)       
+U+a6a0 Bamum                                         (0/88)             (0/88)             (0/88)       
+U+a700 Modifier Tone Letters                     62% (20/32)        62% (20/32)        62% (20/32)      
+U+a720 Latin Extended-D                          48% (62/129)       42% (55/129)       10% (14/129)     
+U+a800 Syloti Nagri                                  (0/44)             (0/44)             (0/44)       
+U+a830 Common Indic Number Forms                     (0/10)             (0/10)             (0/10)       
+U+a840 Phags-pa                                      (0/56)             (0/56)             (0/56)       
+U+a880 Saurashtra                                    (0/81)             (0/81)             (0/81)       
+U+a8e0 Devanagari Extended                           (0/28)             (0/28)             (0/28)       
+U+a900 Kayah Li                                      (0/48)             (0/48)             (0/48)       
+U+a930 Rejang                                        (0/37)             (0/37)             (0/37)       
+U+a960 Hangul Jamo Extended-A                        (0/29)             (0/29)             (0/29)       
+U+a980 Javanese                                      (0/91)             (0/91)             (0/91)       
+U+aa00 Cham                                          (0/83)             (0/83)             (0/83)       
+U+aa60 Myanmar Extended-A                            (0/28)             (0/28)             (0/28)       
+U+aa80 Tai Viet                                      (0/72)             (0/72)             (0/72)       
+U+ab00 Ethiopic Extended-A                           (0/33)             (0/33)             (0/33)       
+U+abc0 Meetei Mayek                                  (0/56)             (0/56)             (0/56)       
+U+ac00 Hangul Syllables                              (0/0)              (0/0)              (0/0)        
+U+d7b0 Hangul Jamo Extended-B                        (0/72)             (0/72)             (0/72)       
+U+d800 High Surrogates                               (0/0)              (0/0)              (0/0)        
+U+db80 High Private Use Surrogates                   (0/0)              (0/0)              (0/0)        
+U+dc00 Low Surrogates                                (0/0)              (0/0)              (0/0)        
+U+e000 Private Use Area                              (0/0)              (0/0)              (0/0)        
+U+f900 CJK Compatibility Ideographs                  (0/470)            (0/470)            (0/470)      
+U+fb00 Alphabetic Presentation Forms            100% (58/58)        12% (7/58)          3% (2/58)       
+U+fb50 Arabic Presentation Forms-A               16% (98/611)           (0/611)        11% (72/611)     
+U+fe00 Variation Selectors                      100% (16/16)       100% (16/16)            (0/16)       
+U+fe10 Vertical Forms                                (0/10)             (0/10)             (0/10)       
+U+fe20 Combining Half Marks                      57% (4/7)              (0/7)              (0/7)        
+U+fe30 CJK Compatibility Forms                       (0/32)             (0/32)             (0/32)       
+U+fe50 Small Form Variants                           (0/26)             (0/26)             (0/26)       
+U+fe70 Arabic Presentation Forms-B              100% (141/141)          (0/141)       100% (141/141)    
+U+ff00 Halfwidth and Fullwidth Forms                 (0/225)            (0/225)            (0/225)      
+U+fff0 Specials                                 100% (5/5)         100% (5/5)         100% (5/5)        
+U+10000 Linear B Syllabary                            (0/88)             (0/88)             (0/88)       
+U+10080 Linear B Ideograms                            (0/123)            (0/123)            (0/123)      
+U+10100 Aegean Numbers                                (0/57)             (0/57)             (0/57)       
+U+10140 Ancient Greek Numbers                         (0/75)             (0/75)             (0/75)       
+U+10190 Ancient Symbols                               (0/12)             (0/12)             (0/12)       
+U+101d0 Phaistos Disc                                 (0/46)             (0/46)             (0/46)       
+U+10280 Lycian                                        (0/29)             (0/29)             (0/29)       
+U+102a0 Carian                                        (0/49)             (0/49)             (0/49)       
+U+10300 Old Italic                               100% (35/35)            (0/35)             (0/35)       
+U+10330 Gothic                                        (0/27)             (0/27)             (0/27)       
+U+10380 Ugaritic                                      (0/31)             (0/31)             (0/31)       
+U+103a0 Old Persian                                   (0/50)             (0/50)             (0/50)       
+U+10400 Deseret                                       (0/80)             (0/80)             (0/80)       
+U+10450 Shavian                                       (0/48)             (0/48)             (0/48)       
+U+10480 Osmanya                                       (0/40)             (0/40)             (0/40)       
+U+10800 Cypriot Syllabary                             (0/55)             (0/55)             (0/55)       
+U+10840 Imperial Aramaic                              (0/31)             (0/31)             (0/31)       
+U+10900 Phoenician                                    (0/29)             (0/29)             (0/29)       
+U+10920 Lydian                                        (0/27)             (0/27)             (0/27)       
+U+10a00 Kharoshthi                                    (0/65)             (0/65)             (0/65)       
+U+10a60 Old South Arabian                             (0/32)             (0/32)             (0/32)       
+U+10b00 Avestan                                       (0/61)             (0/61)             (0/61)       
+U+10b40 Inscriptional Parthian                        (0/30)             (0/30)             (0/30)       
+U+10b60 Inscriptional Pahlavi                         (0/27)             (0/27)             (0/27)       
+U+10c00 Old Turkic                                    (0/73)             (0/73)             (0/73)       
+U+10e60 Rumi Numeral Symbols                          (0/31)             (0/31)             (0/31)       
+U+11000 Brahmi                                        (0/108)            (0/108)            (0/108)      
+U+11080 Kaithi                                        (0/66)             (0/66)             (0/66)       
+U+12000 Cuneiform                                     (0/879)            (0/879)            (0/879)      
+U+12400 Cuneiform Numbers and Punctuation             (0/103)            (0/103)            (0/103)      
+U+13000 Egyptian Hieroglyphs                          (0/1071)           (0/1071)           (0/1071)     
+U+16800 Bamum Supplement                              (0/569)            (0/569)            (0/569)      
+U+1b000 Kana Supplement                               (0/2)              (0/2)              (0/2)        
+U+1d000 Byzantine Musical Symbols                     (0/246)            (0/246)            (0/246)      
+U+1d100 Musical Symbols                               (0/220)            (0/220)            (0/220)      
+U+1d200 Ancient Greek Musical Notation                (0/70)             (0/70)             (0/70)       
+U+1d300 Tai Xuan Jing Symbols                    100% (87/87)            (0/87)             (0/87)       
+U+1d360 Counting Rod Numerals                         (0/18)             (0/18)             (0/18)       
+U+1d400 Mathematical Alphanumeric Symbols         11% (117/996)       5% (55/996)        6% (62/996)     
+U+1f000 Mahjong Tiles                                 (0/44)             (0/44)             (0/44)       
+U+1f030 Domino Tiles                             100% (100/100)          (0/100)            (0/100)      
+U+1f0a0 Playing Cards                            100% (59/59)            (0/59)             (0/59)       
+U+1f100 Enclosed Alphanumeric Supplement              (0/169)            (0/169)            (0/169)      
+U+1f200 Enclosed Ideographic Supplement               (0/57)             (0/57)             (0/57)       
+U+1f300 Miscellaneous Symbols And Pictographs      0% (4/529)            (0/529)            (0/529)      
+U+1f600 Emoticons                                 80% (51/63)            (0/63)             (0/63)       
+U+1f680 Transport And Map Symbols                     (0/70)             (0/70)             (0/70)       
+U+1f700 Alchemical Symbols                            (0/116)            (0/116)            (0/116)      
+U+20000 CJK Unified Ideographs Extension B            (0/0)              (0/0)              (0/0)        
+U+2a700 CJK Unified Ideographs Extension C            (0/0)              (0/0)              (0/0)        
+U+2b740 CJK Unified Ideographs Extension D            (0/0)              (0/0)              (0/0)        
+U+2f800 CJK Compatibility Ideographs Supplement       (0/542)            (0/542)            (0/542)      
+U+e0000 Tags                                          (0/98)             (0/98)             (0/98)       
+U+e0100 Variation Selectors Supplement                (0/240)            (0/240)            (0/240)      
+U+f0000 Supplementary Private Use Area-A              (0/0)              (0/0)              (0/0)        
+U+100000 Supplementary Private Use Area-B              (0/0)              (0/0)              (0/0)        
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusans.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusans.ctg.z
new file mode 100644
index 00000000..cceabb65
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusans.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusans.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusans.php
new file mode 100644
index 00000000..3cd08131
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusans.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSans';
+$up=-63;
+$ut=44;
+$dw=600;
+$diff='';
+$originalsize=720012;
+$enc='';
+$file='dejavusans.z';
+$ctg='dejavusans.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-1021 -415 1681 1167]','ItalicAngle'=>0,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>547,'StemV'=>34,'StemH'=>15,'AvgWidth'=>507,'MaxWidth'=>1735,'MissingWidth'=>600);
+$cw=array(0=>600,32=>318,33=>401,34=>460,35=>838,36=>636,37=>950,38=>780,39=>275,40=>390,41=>390,42=>500,43=>838,44=>318,45=>361,46=>318,47=>337,48=>636,49=>636,50=>636,51=>636,52=>636,53=>636,54=>636,55=>636,56=>636,57=>636,58=>337,59=>337,60=>838,61=>838,62=>838,63=>531,64=>1000,65=>684,66=>686,67=>698,68=>770,69=>632,70=>575,71=>775,72=>752,73=>295,74=>295,75=>656,76=>557,77=>863,78=>748,79=>787,80=>603,81=>787,82=>695,83=>635,84=>611,85=>732,86=>684,87=>989,88=>685,89=>611,90=>685,91=>390,92=>337,93=>390,94=>838,95=>500,96=>500,97=>613,98=>635,99=>550,100=>635,101=>615,102=>352,103=>635,104=>634,105=>278,106=>278,107=>579,108=>278,109=>974,110=>634,111=>612,112=>635,113=>635,114=>411,115=>521,116=>392,117=>634,118=>592,119=>818,120=>592,121=>592,122=>525,123=>636,124=>337,125=>636,126=>838,160=>318,161=>401,162=>636,163=>636,164=>636,165=>636,166=>337,167=>500,168=>500,169=>1000,170=>471,171=>612,172=>838,173=>361,174=>1000,175=>500,176=>500,177=>838,178=>401,179=>401,180=>500,181=>636,182=>636,183=>318,184=>500,185=>401,186=>471,187=>612,188=>969,189=>969,190=>969,191=>531,192=>684,193=>684,194=>684,195=>684,196=>684,197=>684,198=>974,199=>698,200=>632,201=>632,202=>632,203=>632,204=>295,205=>295,206=>295,207=>295,208=>775,209=>748,210=>787,211=>787,212=>787,213=>787,214=>787,215=>838,216=>787,217=>732,218=>732,219=>732,220=>732,221=>611,222=>605,223=>630,224=>613,225=>613,226=>613,227=>613,228=>613,229=>613,230=>982,231=>550,232=>615,233=>615,234=>615,235=>615,236=>278,237=>278,238=>278,239=>278,240=>612,241=>634,242=>612,243=>612,244=>612,245=>612,246=>612,247=>838,248=>612,249=>634,250=>634,251=>634,252=>634,253=>592,254=>635,255=>592,256=>684,257=>613,258=>684,259=>613,260=>684,261=>613,262=>698,263=>550,264=>698,265=>550,266=>698,267=>550,268=>698,269=>550,270=>770,271=>635,272=>775,273=>635,274=>632,275=>615,276=>632,277=>615,278=>632,279=>615,280=>632,281=>615,282=>632,283=>615,284=>775,285=>635,286=>775,287=>635,288=>775,289=>635,290=>775,291=>635,292=>752,293=>634,294=>916,295=>695,296=>295,297=>278,298=>295,299=>278,300=>295,301=>278,302=>295,303=>278,304=>295,305=>278,306=>590,307=>556,308=>295,309=>278,310=>656,311=>579,312=>579,313=>557,314=>278,315=>557,316=>278,317=>557,318=>375,319=>557,320=>342,321=>562,322=>284,323=>748,324=>634,325=>748,326=>634,327=>748,328=>634,329=>813,330=>748,331=>634,332=>787,333=>612,334=>787,335=>612,336=>787,337=>612,338=>1070,339=>1023,340=>695,341=>411,342=>695,343=>411,344=>695,345=>411,346=>635,347=>521,348=>635,349=>521,350=>635,351=>521,352=>635,353=>521,354=>611,355=>392,356=>611,357=>392,358=>611,359=>392,360=>732,361=>634,362=>732,363=>634,364=>732,365=>634,366=>732,367=>634,368=>732,369=>634,370=>732,371=>634,372=>989,373=>818,374=>611,375=>592,376=>611,377=>685,378=>525,379=>685,380=>525,381=>685,382=>525,383=>352,384=>635,385=>735,386=>686,387=>635,388=>686,389=>635,390=>703,391=>698,392=>550,393=>775,394=>819,395=>686,396=>635,397=>612,398=>632,399=>787,400=>614,401=>575,402=>352,403=>775,404=>687,405=>984,406=>354,407=>295,408=>746,409=>579,410=>278,411=>592,412=>974,413=>748,414=>634,415=>787,416=>913,417=>612,418=>949,419=>759,420=>652,421=>635,422=>695,423=>635,424=>521,425=>632,426=>336,427=>392,428=>611,429=>392,430=>611,431=>858,432=>634,433=>764,434=>721,435=>744,436=>730,437=>685,438=>525,439=>666,440=>666,441=>578,442=>525,443=>636,444=>666,445=>578,446=>510,447=>635,448=>295,449=>492,450=>459,451=>295,452=>1422,453=>1299,454=>1154,455=>835,456=>787,457=>457,458=>931,459=>924,460=>797,461=>684,462=>613,463=>295,464=>278,465=>787,466=>612,467=>732,468=>634,469=>732,470=>634,471=>732,472=>634,473=>732,474=>634,475=>732,476=>634,477=>615,478=>684,479=>613,480=>684,481=>613,482=>974,483=>982,484=>775,485=>635,486=>775,487=>635,488=>656,489=>579,490=>787,491=>612,492=>787,493=>612,494=>666,495=>578,496=>278,497=>1422,498=>1299,499=>1154,500=>775,501=>635,502=>1113,503=>682,504=>748,505=>634,506=>684,507=>613,508=>974,509=>982,510=>787,511=>612,512=>684,513=>613,514=>684,515=>613,516=>632,517=>615,518=>632,519=>615,520=>295,521=>278,522=>295,523=>278,524=>787,525=>612,526=>787,527=>612,528=>695,529=>411,530=>695,531=>411,532=>732,533=>634,534=>732,535=>634,536=>635,537=>521,538=>611,539=>392,540=>627,541=>521,542=>752,543=>634,544=>735,545=>838,546=>698,547=>610,548=>685,549=>525,550=>684,551=>613,552=>632,553=>615,554=>787,555=>612,556=>787,557=>612,558=>787,559=>612,560=>787,561=>612,562=>611,563=>592,564=>475,565=>843,566=>477,567=>278,568=>998,569=>998,570=>684,571=>698,572=>550,573=>557,574=>611,575=>521,576=>525,577=>603,578=>479,579=>686,580=>732,581=>684,582=>632,583=>615,584=>295,585=>278,586=>781,587=>635,588=>695,589=>411,590=>611,591=>592,592=>600,593=>635,594=>635,595=>635,596=>549,597=>550,598=>635,599=>696,600=>615,601=>615,602=>819,603=>541,604=>532,605=>775,606=>664,607=>278,608=>696,609=>635,610=>629,611=>596,612=>596,613=>634,614=>634,615=>634,616=>278,617=>338,618=>372,619=>396,620=>487,621=>278,622=>706,623=>974,624=>974,625=>974,626=>646,627=>642,628=>634,629=>612,630=>858,631=>728,632=>660,633=>414,634=>414,635=>414,636=>411,637=>411,638=>530,639=>530,640=>604,641=>604,642=>521,643=>336,644=>336,645=>461,646=>336,647=>392,648=>392,649=>634,650=>618,651=>598,652=>592,653=>818,654=>592,655=>611,656=>525,657=>525,658=>578,659=>578,660=>510,661=>510,662=>510,663=>510,664=>787,665=>580,666=>664,667=>708,668=>654,669=>292,670=>667,671=>507,672=>727,673=>510,674=>510,675=>1014,676=>1058,677=>1013,678=>824,679=>610,680=>778,681=>848,682=>641,683=>654,684=>515,685=>515,686=>661,687=>664,688=>404,689=>399,690=>175,691=>259,692=>295,693=>296,694=>379,695=>515,696=>373,697=>278,698=>460,699=>318,700=>318,701=>318,702=>307,703=>307,704=>370,705=>370,706=>500,707=>500,708=>500,709=>500,710=>500,711=>500,712=>275,713=>500,714=>500,715=>500,716=>275,717=>500,718=>500,719=>500,720=>337,721=>337,722=>307,723=>307,724=>500,725=>500,726=>390,727=>317,728=>500,729=>500,730=>500,731=>500,732=>500,733=>500,734=>315,735=>500,736=>426,737=>166,738=>373,739=>444,740=>370,741=>493,742=>493,743=>493,744=>493,745=>493,748=>500,749=>500,750=>518,755=>500,759=>500,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>654,881=>568,882=>862,883=>647,884=>278,885=>278,886=>748,887=>650,890=>500,891=>549,892=>550,893=>549,894=>337,900=>500,901=>500,902=>692,903=>318,904=>746,905=>871,906=>408,908=>813,910=>825,911=>826,912=>338,913=>684,914=>686,915=>557,916=>684,917=>632,918=>685,919=>752,920=>787,921=>295,922=>656,923=>684,924=>863,925=>748,926=>632,927=>787,928=>752,929=>603,931=>632,932=>611,933=>611,934=>787,935=>685,936=>787,937=>764,938=>295,939=>611,940=>659,941=>541,942=>634,943=>338,944=>579,945=>659,946=>638,947=>592,948=>612,949=>541,950=>544,951=>634,952=>612,953=>338,954=>589,955=>592,956=>636,957=>559,958=>558,959=>612,960=>602,961=>635,962=>587,963=>634,964=>602,965=>579,966=>660,967=>578,968=>660,969=>837,970=>338,971=>579,972=>612,973=>579,974=>837,975=>656,976=>614,977=>619,978=>699,979=>842,980=>699,981=>660,982=>837,983=>664,984=>787,985=>612,986=>648,987=>587,988=>575,989=>458,990=>660,991=>660,992=>865,993=>627,994=>934,995=>837,996=>758,997=>659,998=>792,999=>615,1000=>687,1001=>607,1002=>768,1003=>625,1004=>699,1005=>612,1006=>611,1007=>536,1008=>664,1009=>635,1010=>550,1011=>278,1012=>787,1013=>615,1014=>615,1015=>605,1016=>635,1017=>698,1018=>863,1019=>651,1020=>635,1021=>703,1022=>698,1023=>703,1024=>632,1025=>632,1026=>786,1027=>610,1028=>698,1029=>635,1030=>295,1031=>295,1032=>295,1033=>1094,1034=>1045,1035=>786,1036=>710,1037=>748,1038=>609,1039=>752,1040=>684,1041=>686,1042=>686,1043=>610,1044=>781,1045=>632,1046=>1077,1047=>641,1048=>748,1049=>748,1050=>710,1051=>752,1052=>863,1053=>752,1054=>787,1055=>752,1056=>603,1057=>698,1058=>611,1059=>609,1060=>861,1061=>685,1062=>776,1063=>686,1064=>1069,1065=>1094,1066=>833,1067=>882,1068=>686,1069=>698,1070=>1080,1071=>695,1072=>613,1073=>617,1074=>589,1075=>525,1076=>691,1077=>615,1078=>901,1079=>532,1080=>650,1081=>650,1082=>604,1083=>639,1084=>754,1085=>654,1086=>612,1087=>654,1088=>635,1089=>550,1090=>583,1091=>592,1092=>855,1093=>592,1094=>681,1095=>591,1096=>915,1097=>942,1098=>707,1099=>790,1100=>589,1101=>549,1102=>842,1103=>602,1104=>615,1105=>615,1106=>625,1107=>525,1108=>549,1109=>521,1110=>278,1111=>278,1112=>278,1113=>902,1114=>898,1115=>652,1116=>604,1117=>650,1118=>592,1119=>654,1120=>934,1121=>837,1122=>771,1123=>672,1124=>942,1125=>749,1126=>879,1127=>783,1128=>1160,1129=>1001,1130=>787,1131=>612,1132=>1027,1133=>824,1134=>636,1135=>541,1136=>856,1137=>876,1138=>787,1139=>612,1140=>781,1141=>665,1142=>781,1143=>665,1144=>992,1145=>904,1146=>953,1147=>758,1148=>1180,1149=>1028,1150=>934,1151=>837,1152=>698,1153=>550,1154=>502,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>418,1161=>418,1162=>772,1163=>677,1164=>686,1165=>589,1166=>603,1167=>635,1168=>610,1169=>525,1170=>675,1171=>590,1172=>624,1173=>530,1174=>1077,1175=>901,1176=>641,1177=>532,1178=>710,1179=>604,1180=>710,1181=>604,1182=>710,1183=>604,1184=>856,1185=>832,1186=>752,1187=>661,1188=>1014,1189=>877,1190=>1081,1191=>916,1192=>878,1193=>693,1194=>698,1195=>550,1196=>611,1197=>583,1198=>611,1199=>592,1200=>611,1201=>592,1202=>685,1203=>592,1204=>934,1205=>807,1206=>686,1207=>591,1208=>686,1209=>591,1210=>686,1211=>634,1212=>941,1213=>728,1214=>941,1215=>728,1216=>295,1217=>1077,1218=>901,1219=>656,1220=>604,1221=>776,1222=>670,1223=>752,1224=>661,1225=>776,1226=>681,1227=>686,1228=>591,1229=>888,1230=>774,1231=>278,1232=>684,1233=>613,1234=>684,1235=>613,1236=>974,1237=>982,1238=>632,1239=>615,1240=>787,1241=>615,1242=>787,1243=>615,1244=>1077,1245=>901,1246=>641,1247=>532,1248=>666,1249=>578,1250=>748,1251=>650,1252=>748,1253=>650,1254=>787,1255=>612,1256=>787,1257=>612,1258=>787,1259=>612,1260=>698,1261=>549,1262=>609,1263=>592,1264=>609,1265=>592,1266=>609,1267=>592,1268=>686,1269=>591,1270=>610,1271=>525,1272=>882,1273=>790,1274=>675,1275=>590,1276=>685,1277=>592,1278=>685,1279=>592,1280=>686,1281=>589,1282=>1006,1283=>897,1284=>975,1285=>869,1286=>679,1287=>588,1288=>1072,1289=>957,1290=>1113,1291=>967,1292=>775,1293=>660,1294=>773,1295=>711,1296=>614,1297=>541,1298=>752,1299=>639,1300=>1169,1301=>994,1302=>894,1303=>864,1304=>1032,1305=>986,1306=>787,1307=>635,1308=>989,1309=>818,1310=>710,1311=>604,1312=>1081,1313=>905,1314=>1081,1315=>912,1316=>793,1317=>683,1329=>766,1330=>732,1331=>753,1332=>753,1333=>732,1334=>772,1335=>640,1336=>732,1337=>859,1338=>753,1339=>691,1340=>533,1341=>922,1342=>863,1343=>732,1344=>716,1345=>766,1346=>753,1347=>767,1348=>792,1349=>728,1350=>729,1351=>757,1352=>732,1353=>713,1354=>800,1355=>768,1356=>792,1357=>732,1358=>753,1359=>705,1360=>694,1361=>744,1362=>538,1363=>811,1364=>757,1365=>787,1366=>790,1369=>307,1370=>318,1371=>234,1372=>361,1373=>238,1374=>405,1375=>500,1377=>974,1378=>634,1379=>658,1380=>663,1381=>634,1382=>635,1383=>515,1384=>634,1385=>738,1386=>658,1387=>634,1388=>271,1389=>980,1390=>623,1391=>634,1392=>634,1393=>608,1394=>634,1395=>629,1396=>634,1397=>271,1398=>634,1399=>499,1400=>634,1401=>404,1402=>974,1403=>560,1404=>648,1405=>634,1406=>634,1407=>974,1408=>634,1409=>633,1410=>435,1411=>974,1412=>636,1413=>609,1414=>805,1415=>812,1417=>337,1418=>361,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>361,1471=>0,1472=>295,1473=>0,1474=>0,1475=>295,1478=>441,1479=>0,1488=>668,1489=>578,1490=>412,1491=>546,1492=>653,1493=>272,1494=>346,1495=>653,1496=>648,1497=>224,1498=>537,1499=>529,1500=>568,1501=>664,1502=>679,1503=>272,1504=>400,1505=>649,1506=>626,1507=>640,1508=>625,1509=>540,1510=>593,1511=>709,1512=>564,1513=>708,1514=>657,1520=>471,1521=>423,1522=>331,1523=>416,1524=>645,1542=>637,1543=>637,1545=>757,1546=>977,1548=>323,1557=>0,1563=>318,1567=>531,1569=>470,1570=>278,1571=>278,1572=>483,1573=>278,1574=>783,1575=>278,1576=>941,1577=>524,1578=>941,1579=>941,1580=>646,1581=>646,1582=>646,1583=>445,1584=>445,1585=>483,1586=>483,1587=>1221,1588=>1221,1589=>1209,1590=>1209,1591=>925,1592=>925,1593=>597,1594=>597,1600=>293,1601=>1037,1602=>776,1603=>824,1604=>727,1605=>619,1606=>734,1607=>524,1608=>483,1609=>783,1610=>783,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1623=>0,1626=>500,1632=>537,1633=>537,1634=>537,1635=>537,1636=>537,1637=>537,1638=>537,1639=>537,1640=>537,1641=>537,1642=>537,1643=>325,1644=>318,1645=>545,1646=>941,1647=>776,1648=>0,1652=>292,1657=>941,1658=>941,1659=>941,1660=>941,1661=>941,1662=>941,1663=>941,1664=>941,1665=>646,1666=>646,1667=>646,1668=>646,1669=>646,1670=>646,1671=>646,1672=>445,1673=>445,1674=>445,1675=>445,1676=>445,1677=>445,1678=>445,1679=>445,1680=>445,1681=>483,1682=>483,1683=>498,1684=>530,1685=>610,1686=>530,1687=>483,1688=>483,1689=>483,1690=>1221,1691=>1221,1692=>1221,1693=>1209,1694=>1209,1695=>925,1696=>597,1697=>1037,1698=>1037,1699=>1037,1700=>1037,1701=>1037,1702=>1037,1703=>776,1704=>776,1705=>895,1706=>1054,1707=>895,1708=>824,1709=>824,1710=>824,1711=>895,1712=>895,1713=>895,1714=>895,1715=>895,1716=>895,1717=>727,1718=>727,1719=>727,1720=>727,1721=>734,1722=>734,1723=>734,1724=>734,1725=>734,1726=>698,1727=>646,1734=>483,1740=>783,1742=>783,1749=>524,1776=>537,1777=>537,1778=>537,1779=>537,1780=>537,1781=>537,1782=>537,1783=>537,1784=>537,1785=>537,1984=>636,1985=>636,1986=>636,1987=>636,1988=>636,1989=>636,1990=>636,1991=>636,1992=>636,1993=>636,1994=>278,1995=>571,1996=>424,1997=>592,1998=>654,1999=>654,2000=>594,2001=>654,2002=>829,2003=>438,2004=>438,2005=>559,2006=>612,2007=>350,2008=>959,2009=>473,2010=>783,2011=>654,2012=>625,2013=>734,2014=>530,2015=>724,2016=>473,2017=>625,2018=>594,2019=>530,2020=>530,2021=>522,2022=>594,2023=>594,2027=>0,2028=>0,2029=>0,2030=>0,2031=>0,2032=>0,2033=>0,2034=>0,2035=>0,2036=>313,2037=>313,2040=>560,2041=>560,2042=>361,3647=>636,3713=>670,3714=>684,3716=>688,3719=>482,3720=>628,3722=>684,3725=>688,3732=>669,3733=>642,3734=>645,3735=>655,3737=>659,3738=>625,3739=>625,3740=>745,3741=>767,3742=>687,3743=>687,3745=>702,3746=>688,3747=>684,3749=>649,3751=>632,3754=>703,3755=>819,3757=>633,3758=>684,3759=>788,3760=>632,3761=>0,3762=>539,3763=>539,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0,3769=>0,3771=>0,3772=>0,3773=>663,3776=>375,3777=>657,3778=>460,3779=>547,3780=>491,3782=>674,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>636,3793=>641,3794=>641,3795=>670,3796=>625,3797=>625,3798=>703,3799=>670,3800=>674,3801=>677,3804=>1028,3805=>1028,4256=>840,4257=>690,4258=>642,4259=>759,4260=>591,4261=>686,4262=>789,4263=>811,4264=>467,4265=>565,4266=>789,4267=>793,4268=>584,4269=>837,4270=>750,4271=>688,4272=>811,4273=>584,4274=>584,4275=>837,4276=>837,4277=>646,4278=>604,4279=>584,4280=>596,4281=>584,4282=>721,4283=>795,4284=>584,4285=>566,4286=>584,4287=>669,4288=>799,4289=>542,4290=>664,4291=>542,4292=>565,4293=>674,4304=>508,4305=>508,4306=>533,4307=>785,4308=>522,4309=>517,4310=>508,4311=>797,4312=>507,4313=>518,4314=>1058,4315=>522,4316=>523,4317=>783,4318=>518,4319=>523,4320=>792,4321=>523,4322=>656,4323=>524,4324=>788,4325=>523,4326=>782,4327=>523,4328=>522,4329=>522,4330=>566,4331=>523,4332=>523,4333=>489,4334=>522,4335=>498,4336=>517,4337=>560,4338=>508,4339=>508,4340=>508,4341=>563,4342=>824,4343=>595,4344=>522,4345=>554,4346=>553,4347=>586,4348=>304,5121=>684,5122=>684,5123=>684,5124=>684,5125=>769,5126=>769,5127=>769,5129=>769,5130=>769,5131=>769,5132=>835,5133=>834,5134=>835,5135=>834,5136=>835,5137=>834,5138=>967,5139=>1007,5140=>967,5141=>1007,5142=>769,5143=>967,5144=>1007,5145=>967,5146=>1007,5147=>769,5149=>256,5150=>543,5151=>423,5152=>423,5153=>389,5154=>389,5155=>393,5156=>389,5157=>466,5158=>385,5159=>256,5160=>389,5161=>389,5162=>389,5163=>1090,5164=>909,5165=>953,5166=>1117,5167=>684,5168=>684,5169=>684,5170=>684,5171=>729,5172=>729,5173=>729,5175=>729,5176=>729,5177=>729,5178=>835,5179=>684,5180=>835,5181=>834,5182=>835,5183=>834,5184=>967,5185=>1007,5186=>967,5187=>1007,5188=>967,5189=>1007,5190=>967,5191=>1007,5192=>729,5193=>508,5194=>192,5196=>732,5197=>732,5198=>732,5199=>732,5200=>730,5201=>730,5202=>730,5204=>730,5205=>730,5206=>730,5207=>921,5208=>889,5209=>921,5210=>889,5211=>921,5212=>889,5213=>928,5214=>900,5215=>928,5216=>900,5217=>947,5218=>900,5219=>947,5220=>900,5221=>947,5222=>434,5223=>877,5224=>877,5225=>866,5226=>890,5227=>628,5228=>628,5229=>628,5230=>628,5231=>628,5232=>628,5233=>628,5234=>628,5235=>628,5236=>860,5237=>771,5238=>815,5239=>816,5240=>815,5241=>816,5242=>860,5243=>771,5244=>860,5245=>771,5246=>815,5247=>816,5248=>815,5249=>816,5250=>815,5251=>407,5252=>407,5253=>750,5254=>775,5255=>750,5256=>775,5257=>628,5258=>628,5259=>628,5260=>628,5261=>628,5262=>628,5263=>628,5264=>628,5265=>628,5266=>860,5267=>771,5268=>815,5269=>816,5270=>815,5271=>816,5272=>860,5273=>771,5274=>860,5275=>771,5276=>815,5277=>816,5278=>815,5279=>816,5280=>815,5281=>435,5282=>435,5283=>610,5284=>557,5285=>557,5286=>557,5287=>610,5288=>610,5289=>610,5290=>557,5291=>557,5292=>749,5293=>769,5294=>746,5295=>764,5296=>746,5297=>764,5298=>749,5299=>769,5300=>749,5301=>769,5302=>746,5303=>764,5304=>746,5305=>764,5306=>746,5307=>386,5308=>508,5309=>386,5312=>852,5313=>852,5314=>852,5315=>852,5316=>852,5317=>852,5318=>852,5319=>852,5320=>852,5321=>1069,5322=>1035,5323=>1059,5324=>852,5325=>1059,5326=>852,5327=>852,5328=>600,5329=>453,5330=>600,5331=>852,5332=>852,5333=>852,5334=>852,5335=>852,5336=>852,5337=>852,5338=>852,5339=>852,5340=>1069,5341=>1035,5342=>1059,5343=>1030,5344=>1059,5345=>1030,5346=>1069,5347=>1035,5348=>1069,5349=>1035,5350=>1083,5351=>1030,5352=>1083,5353=>1030,5354=>600,5356=>729,5357=>603,5358=>603,5359=>603,5360=>603,5361=>603,5362=>603,5363=>603,5364=>603,5365=>603,5366=>834,5367=>754,5368=>792,5369=>771,5370=>792,5371=>771,5372=>834,5373=>754,5374=>834,5375=>754,5376=>792,5377=>771,5378=>792,5379=>771,5380=>792,5381=>418,5382=>420,5383=>418,5392=>712,5393=>712,5394=>712,5395=>892,5396=>892,5397=>892,5398=>892,5399=>910,5400=>872,5401=>910,5402=>872,5403=>910,5404=>872,5405=>1140,5406=>1100,5407=>1140,5408=>1100,5409=>1140,5410=>1100,5411=>1140,5412=>1100,5413=>641,5414=>627,5415=>627,5416=>627,5417=>627,5418=>627,5419=>627,5420=>627,5421=>627,5422=>627,5423=>844,5424=>781,5425=>816,5426=>818,5427=>816,5428=>818,5429=>844,5430=>781,5431=>844,5432=>781,5433=>816,5434=>818,5435=>816,5436=>818,5437=>816,5438=>418,5440=>389,5441=>484,5442=>916,5443=>916,5444=>916,5445=>916,5446=>916,5447=>916,5448=>603,5449=>603,5450=>603,5451=>603,5452=>603,5453=>603,5454=>834,5455=>754,5456=>418,5458=>729,5459=>684,5460=>684,5461=>684,5462=>684,5463=>726,5464=>726,5465=>726,5466=>726,5467=>924,5468=>1007,5469=>508,5470=>732,5471=>732,5472=>732,5473=>732,5474=>732,5475=>732,5476=>730,5477=>730,5478=>730,5479=>730,5480=>947,5481=>900,5482=>508,5492=>831,5493=>831,5494=>831,5495=>831,5496=>831,5497=>831,5498=>831,5499=>563,5500=>752,5501=>484,5502=>1047,5503=>1047,5504=>1047,5505=>1047,5506=>1047,5507=>1047,5508=>1047,5509=>825,5514=>831,5515=>831,5516=>831,5517=>831,5518=>1259,5519=>1259,5520=>1259,5521=>1002,5522=>1002,5523=>1259,5524=>1259,5525=>700,5526=>1073,5536=>852,5537=>852,5538=>852,5539=>852,5540=>852,5541=>852,5542=>600,5543=>643,5544=>643,5545=>643,5546=>643,5547=>643,5548=>643,5549=>643,5550=>418,5551=>628,5598=>770,5601=>767,5702=>468,5703=>468,5742=>444,5743=>1047,5744=>1310,5745=>1632,5746=>1632,5747=>1375,5748=>1375,5749=>1632,5750=>1632,5760=>477,5761=>493,5762=>712,5763=>931,5764=>1150,5765=>1370,5766=>493,5767=>712,5768=>931,5769=>1150,5770=>1370,5771=>498,5772=>718,5773=>938,5774=>1159,5775=>1379,5776=>493,5777=>712,5778=>930,5779=>1149,5780=>1370,5781=>498,5782=>752,5783=>789,5784=>1205,5785=>1150,5786=>683,5787=>507,5788=>507,7424=>592,7425=>717,7426=>982,7427=>586,7428=>550,7429=>605,7430=>605,7431=>491,7432=>541,7433=>278,7434=>395,7435=>579,7436=>583,7437=>754,7438=>650,7439=>612,7440=>550,7441=>684,7442=>684,7443=>684,7444=>1023,7446=>612,7447=>612,7448=>524,7449=>602,7450=>602,7451=>583,7452=>574,7453=>737,7454=>948,7455=>638,7456=>592,7457=>818,7458=>525,7459=>526,7462=>583,7463=>592,7464=>564,7465=>524,7466=>590,7467=>639,7468=>431,7469=>613,7470=>432,7472=>485,7473=>398,7474=>398,7475=>488,7476=>474,7477=>186,7478=>186,7479=>413,7480=>351,7481=>543,7482=>471,7483=>471,7484=>496,7485=>439,7486=>380,7487=>438,7488=>385,7489=>461,7490=>623,7491=>392,7492=>392,7493=>405,7494=>648,7495=>428,7496=>405,7497=>417,7498=>417,7499=>360,7500=>359,7501=>405,7502=>179,7503=>426,7504=>623,7505=>409,7506=>414,7507=>370,7508=>414,7509=>414,7510=>428,7511=>295,7512=>405,7513=>470,7514=>623,7515=>417,7517=>402,7518=>373,7519=>385,7520=>416,7521=>364,7522=>179,7523=>259,7524=>405,7525=>417,7526=>402,7527=>373,7528=>412,7529=>416,7530=>364,7543=>635,7544=>474,7547=>372,7549=>667,7557=>278,7579=>405,7580=>370,7581=>370,7582=>414,7583=>360,7584=>296,7585=>233,7586=>405,7587=>405,7588=>261,7589=>250,7590=>261,7591=>261,7592=>234,7593=>250,7594=>235,7595=>376,7596=>623,7597=>623,7598=>411,7599=>479,7600=>409,7601=>414,7602=>414,7603=>360,7604=>287,7605=>295,7606=>508,7607=>418,7608=>361,7609=>406,7610=>417,7611=>366,7612=>437,7613=>366,7614=>392,7615=>414,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>684,7681=>613,7682=>686,7683=>635,7684=>686,7685=>635,7686=>686,7687=>635,7688=>698,7689=>550,7690=>770,7691=>635,7692=>770,7693=>635,7694=>770,7695=>635,7696=>770,7697=>635,7698=>770,7699=>635,7700=>632,7701=>615,7702=>632,7703=>615,7704=>632,7705=>615,7706=>632,7707=>615,7708=>632,7709=>615,7710=>575,7711=>352,7712=>775,7713=>635,7714=>752,7715=>634,7716=>752,7717=>634,7718=>752,7719=>634,7720=>752,7721=>634,7722=>752,7723=>634,7724=>295,7725=>278,7726=>295,7727=>278,7728=>656,7729=>579,7730=>656,7731=>579,7732=>656,7733=>579,7734=>557,7735=>288,7736=>557,7737=>288,7738=>557,7739=>278,7740=>557,7741=>278,7742=>863,7743=>974,7744=>863,7745=>974,7746=>863,7747=>974,7748=>748,7749=>634,7750=>748,7751=>634,7752=>748,7753=>634,7754=>748,7755=>634,7756=>787,7757=>612,7758=>787,7759=>612,7760=>787,7761=>612,7762=>787,7763=>612,7764=>603,7765=>635,7766=>603,7767=>635,7768=>695,7769=>411,7770=>695,7771=>411,7772=>695,7773=>411,7774=>695,7775=>411,7776=>635,7777=>521,7778=>635,7779=>521,7780=>635,7781=>521,7782=>635,7783=>521,7784=>635,7785=>521,7786=>611,7787=>392,7788=>611,7789=>392,7790=>611,7791=>392,7792=>611,7793=>392,7794=>732,7795=>634,7796=>732,7797=>634,7798=>732,7799=>634,7800=>732,7801=>634,7802=>732,7803=>634,7804=>684,7805=>592,7806=>684,7807=>592,7808=>989,7809=>818,7810=>989,7811=>818,7812=>989,7813=>818,7814=>989,7815=>818,7816=>989,7817=>818,7818=>685,7819=>592,7820=>685,7821=>592,7822=>611,7823=>592,7824=>685,7825=>525,7826=>685,7827=>525,7828=>685,7829=>525,7830=>634,7831=>392,7832=>818,7833=>592,7834=>613,7835=>352,7836=>352,7837=>352,7838=>769,7839=>612,7840=>684,7841=>613,7842=>684,7843=>613,7844=>684,7845=>613,7846=>684,7847=>613,7848=>684,7849=>613,7850=>684,7851=>613,7852=>684,7853=>613,7854=>684,7855=>613,7856=>684,7857=>613,7858=>684,7859=>613,7860=>684,7861=>613,7862=>684,7863=>613,7864=>632,7865=>615,7866=>632,7867=>615,7868=>632,7869=>615,7870=>632,7871=>615,7872=>632,7873=>615,7874=>632,7875=>615,7876=>632,7877=>615,7878=>632,7879=>615,7880=>295,7881=>278,7882=>295,7883=>278,7884=>787,7885=>612,7886=>787,7887=>612,7888=>787,7889=>612,7890=>787,7891=>612,7892=>787,7893=>612,7894=>787,7895=>612,7896=>787,7897=>612,7898=>913,7899=>612,7900=>913,7901=>612,7902=>913,7903=>612,7904=>913,7905=>612,7906=>913,7907=>612,7908=>732,7909=>634,7910=>732,7911=>634,7912=>858,7913=>634,7914=>858,7915=>634,7916=>858,7917=>634,7918=>858,7919=>634,7920=>858,7921=>634,7922=>611,7923=>592,7924=>611,7925=>592,7926=>611,7927=>592,7928=>611,7929=>592,7930=>769,7931=>477,7936=>659,7937=>659,7938=>659,7939=>659,7940=>659,7941=>659,7942=>659,7943=>659,7944=>684,7945=>684,7946=>877,7947=>877,7948=>769,7949=>801,7950=>708,7951=>743,7952=>541,7953=>541,7954=>541,7955=>541,7956=>541,7957=>541,7960=>711,7961=>711,7962=>966,7963=>975,7964=>898,7965=>928,7968=>634,7969=>634,7970=>634,7971=>634,7972=>634,7973=>634,7974=>634,7975=>634,7976=>837,7977=>835,7978=>1086,7979=>1089,7980=>1027,7981=>1051,7982=>934,7983=>947,7984=>338,7985=>338,7986=>338,7987=>338,7988=>338,7989=>338,7990=>338,7991=>338,7992=>380,7993=>374,7994=>635,7995=>635,7996=>570,7997=>600,7998=>489,7999=>493,8000=>612,8001=>612,8002=>612,8003=>612,8004=>612,8005=>612,8008=>804,8009=>848,8010=>1095,8011=>1100,8012=>938,8013=>970,8016=>579,8017=>579,8018=>579,8019=>579,8020=>579,8021=>579,8022=>579,8023=>579,8025=>784,8027=>998,8029=>1012,8031=>897,8032=>837,8033=>837,8034=>837,8035=>837,8036=>837,8037=>837,8038=>837,8039=>837,8040=>802,8041=>843,8042=>1089,8043=>1095,8044=>946,8045=>972,8046=>921,8047=>952,8048=>659,8049=>659,8050=>541,8051=>548,8052=>634,8053=>654,8054=>338,8055=>338,8056=>612,8057=>612,8058=>579,8059=>579,8060=>837,8061=>837,8064=>659,8065=>659,8066=>659,8067=>659,8068=>659,8069=>659,8070=>659,8071=>659,8072=>684,8073=>684,8074=>877,8075=>877,8076=>769,8077=>801,8078=>708,8079=>743,8080=>634,8081=>634,8082=>634,8083=>634,8084=>634,8085=>634,8086=>634,8087=>634,8088=>837,8089=>835,8090=>1086,8091=>1089,8092=>1027,8093=>1051,8094=>934,8095=>947,8096=>837,8097=>837,8098=>837,8099=>837,8100=>837,8101=>837,8102=>837,8103=>837,8104=>802,8105=>843,8106=>1089,8107=>1095,8108=>946,8109=>972,8110=>921,8111=>952,8112=>659,8113=>659,8114=>659,8115=>659,8116=>659,8118=>659,8119=>659,8120=>684,8121=>684,8122=>716,8123=>692,8124=>684,8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>634,8131=>634,8132=>654,8134=>634,8135=>634,8136=>805,8137=>746,8138=>931,8139=>871,8140=>752,8141=>500,8142=>500,8143=>500,8144=>338,8145=>338,8146=>338,8147=>338,8150=>338,8151=>338,8152=>295,8153=>295,8154=>475,8155=>408,8157=>500,8158=>500,8159=>500,8160=>579,8161=>579,8162=>579,8163=>579,8164=>635,8165=>635,8166=>579,8167=>579,8168=>611,8169=>611,8170=>845,8171=>825,8172=>685,8173=>500,8174=>500,8175=>500,8178=>837,8179=>837,8180=>837,8182=>837,8183=>837,8184=>941,8185=>813,8186=>922,8187=>826,8188=>764,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>636,8200=>318,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>361,8209=>361,8210=>636,8211=>500,8212=>1000,8213=>1000,8214=>500,8215=>500,8216=>318,8217=>318,8218=>318,8219=>318,8220=>518,8221=>518,8222=>518,8223=>518,8224=>500,8225=>500,8226=>590,8227=>590,8228=>334,8229=>667,8230=>1000,8231=>318,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200,8240=>1342,8241=>1735,8242=>227,8243=>374,8244=>520,8245=>227,8246=>374,8247=>520,8248=>339,8249=>400,8250=>400,8251=>838,8252=>485,8253=>531,8254=>500,8255=>804,8256=>804,8257=>250,8258=>1000,8259=>500,8260=>167,8261=>390,8262=>390,8263=>922,8264=>733,8265=>733,8266=>497,8267=>636,8268=>500,8269=>500,8270=>500,8271=>337,8272=>804,8273=>500,8274=>450,8275=>1000,8276=>804,8277=>838,8278=>586,8279=>663,8280=>838,8281=>838,8282=>318,8283=>797,8284=>838,8285=>318,8286=>318,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>401,8305=>179,8308=>401,8309=>401,8310=>401,8311=>401,8312=>401,8313=>401,8314=>528,8315=>528,8316=>528,8317=>246,8318=>246,8319=>398,8320=>401,8321=>401,8322=>401,8323=>401,8324=>401,8325=>401,8326=>401,8327=>401,8328=>401,8329=>401,8330=>528,8331=>528,8332=>528,8333=>246,8334=>246,8336=>392,8337=>417,8338=>414,8339=>444,8340=>417,8341=>404,8342=>426,8343=>166,8344=>623,8345=>398,8346=>428,8347=>373,8348=>295,8352=>877,8353=>636,8354=>636,8355=>636,8356=>636,8357=>974,8358=>748,8359=>1272,8360=>1074,8361=>989,8362=>784,8363=>636,8364=>636,8365=>636,8366=>636,8367=>1272,8368=>636,8369=>636,8370=>636,8371=>636,8372=>774,8373=>636,8376=>636,8377=>636,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>1019,8449=>1019,8450=>698,8451=>1123,8452=>642,8453=>1019,8454=>1067,8455=>614,8456=>698,8457=>952,8459=>988,8460=>754,8461=>850,8462=>634,8463=>634,8464=>470,8465=>697,8466=>720,8467=>413,8468=>818,8469=>801,8470=>1040,8471=>1000,8472=>697,8473=>701,8474=>787,8475=>798,8476=>814,8477=>792,8478=>896,8479=>684,8480=>1020,8481=>1074,8482=>1000,8483=>684,8484=>745,8485=>578,8486=>764,8487=>764,8488=>616,8489=>338,8490=>656,8491=>684,8492=>786,8493=>703,8494=>854,8495=>592,8496=>605,8497=>786,8498=>575,8499=>1069,8500=>462,8501=>745,8502=>674,8503=>466,8504=>645,8505=>380,8506=>926,8507=>1194,8508=>702,8509=>728,8510=>654,8511=>849,8512=>811,8513=>775,8514=>557,8515=>557,8516=>611,8517=>819,8518=>708,8519=>615,8520=>351,8521=>351,8523=>780,8526=>526,8528=>969,8529=>969,8530=>1370,8531=>969,8532=>969,8533=>969,8534=>969,8535=>969,8536=>969,8537=>969,8538=>969,8539=>969,8540=>969,8541=>969,8542=>969,8543=>568,8544=>295,8545=>492,8546=>689,8547=>923,8548=>684,8549=>922,8550=>1120,8551=>1317,8552=>917,8553=>685,8554=>933,8555=>1131,8556=>557,8557=>698,8558=>770,8559=>863,8560=>278,8561=>458,8562=>637,8563=>812,8564=>592,8565=>811,8566=>991,8567=>1170,8568=>819,8569=>592,8570=>822,8571=>1002,8572=>278,8573=>550,8574=>635,8575=>974,8576=>1245,8577=>770,8578=>1245,8579=>703,8580=>549,8581=>698,8585=>969,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838,8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838,8620=>838,8621=>838,8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838,8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838,8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838,8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838,8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838,8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838,8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838,8700=>838,8701=>838,8702=>838,8703=>838,8704=>684,8705=>636,8706=>517,8707=>632,8708=>632,8709=>871,8710=>669,8711=>669,8712=>871,8713=>871,8714=>718,8715=>871,8716=>871,8717=>718,8718=>636,8719=>757,8720=>757,8721=>674,8722=>838,8723=>838,8724=>838,8725=>337,8726=>637,8727=>838,8728=>626,8729=>626,8730=>637,8731=>637,8732=>637,8733=>714,8734=>833,8735=>838,8736=>896,8737=>896,8738=>838,8739=>500,8740=>500,8741=>500,8742=>500,8743=>732,8744=>732,8745=>732,8746=>732,8747=>521,8748=>789,8749=>1057,8750=>521,8751=>789,8752=>1057,8753=>521,8754=>521,8755=>521,8756=>636,8757=>636,8758=>260,8759=>636,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838,8766=>838,8767=>838,8768=>375,8769=>838,8770=>838,8771=>838,8772=>838,8773=>838,8774=>838,8775=>838,8776=>838,8777=>838,8778=>838,8779=>838,8780=>838,8781=>838,8782=>838,8783=>838,8784=>838,8785=>838,8786=>839,8787=>839,8788=>1000,8789=>1000,8790=>838,8791=>838,8792=>838,8793=>838,8794=>838,8795=>838,8796=>838,8797=>838,8798=>838,8799=>838,8800=>838,8801=>838,8802=>838,8803=>838,8804=>838,8805=>838,8806=>838,8807=>838,8808=>838,8809=>838,8810=>1047,8811=>1047,8812=>464,8813=>838,8814=>838,8815=>838,8816=>838,8817=>838,8818=>838,8819=>838,8820=>838,8821=>838,8822=>838,8823=>838,8824=>838,8825=>838,8826=>838,8827=>838,8828=>838,8829=>838,8830=>838,8831=>838,8832=>838,8833=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8840=>838,8841=>838,8842=>838,8843=>838,8844=>732,8845=>732,8846=>732,8847=>838,8848=>838,8849=>838,8850=>838,8851=>780,8852=>780,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838,8865=>838,8866=>871,8867=>871,8868=>871,8869=>871,8870=>521,8871=>521,8872=>871,8873=>871,8874=>871,8875=>871,8876=>871,8877=>871,8878=>871,8879=>871,8880=>838,8881=>838,8882=>838,8883=>838,8884=>838,8885=>838,8886=>1000,8887=>1000,8888=>838,8889=>838,8890=>521,8891=>732,8892=>732,8893=>732,8894=>838,8895=>838,8896=>820,8897=>820,8898=>820,8899=>820,8900=>494,8901=>318,8902=>626,8903=>838,8904=>1000,8905=>1000,8906=>1000,8907=>1000,8908=>1000,8909=>838,8910=>732,8911=>732,8912=>838,8913=>838,8914=>838,8915=>838,8916=>838,8917=>838,8918=>838,8919=>838,8920=>1422,8921=>1422,8922=>838,8923=>838,8924=>838,8925=>838,8926=>838,8927=>838,8928=>838,8929=>838,8930=>838,8931=>838,8932=>838,8933=>838,8934=>838,8935=>838,8936=>838,8937=>838,8938=>838,8939=>838,8940=>838,8941=>838,8942=>1000,8943=>1000,8944=>1000,8945=>1000,8946=>1000,8947=>871,8948=>718,8949=>871,8950=>871,8951=>718,8952=>871,8953=>871,8954=>1000,8955=>871,8956=>718,8957=>871,8958=>718,8959=>871,8960=>602,8961=>602,8962=>635,8963=>838,8964=>838,8965=>838,8966=>838,8967=>488,8968=>390,8969=>390,8970=>390,8971=>390,8972=>809,8973=>809,8974=>809,8975=>809,8976=>838,8977=>513,8984=>1000,8985=>838,8988=>469,8989=>469,8990=>469,8991=>469,8992=>521,8993=>521,8996=>1152,8997=>1152,8998=>1414,8999=>1152,9000=>1443,9003=>1414,9004=>873,9075=>338,9076=>635,9077=>837,9082=>659,9085=>757,9095=>1152,9108=>873,9115=>500,9116=>500,9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500,9125=>500,9126=>500,9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>521,9166=>838,9167=>945,9187=>873,9189=>769,9192=>636,9250=>635,9251=>635,9312=>896,9313=>896,9314=>896,9315=>896,9316=>896,9317=>896,9318=>896,9319=>896,9320=>896,9321=>896,9472=>602,9473=>602,9474=>602,9475=>602,9476=>602,9477=>602,9478=>602,9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602,9486=>602,9487=>602,9488=>602,9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602,9496=>602,9497=>602,9498=>602,9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602,9506=>602,9507=>602,9508=>602,9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602,9516=>602,9517=>602,9518=>602,9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602,9526=>602,9527=>602,9528=>602,9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602,9536=>602,9537=>602,9538=>602,9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602,9546=>602,9547=>602,9548=>602,9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602,9556=>602,9557=>602,9558=>602,9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602,9566=>602,9567=>602,9568=>602,9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602,9576=>602,9577=>602,9578=>602,9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602,9586=>602,9587=>602,9588=>602,9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602,9596=>602,9597=>602,9598=>602,9599=>602,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527,9687=>527,9688=>791,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>873,9697=>873,9698=>769,9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945,9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732,9727=>769,9728=>896,9729=>1000,9730=>896,9731=>896,9732=>896,9733=>896,9734=>896,9735=>573,9736=>896,9737=>896,9738=>888,9739=>888,9740=>671,9741=>1013,9742=>1246,9743=>1250,9744=>896,9745=>896,9746=>896,9747=>532,9748=>896,9749=>896,9750=>896,9751=>896,9752=>896,9753=>896,9754=>896,9755=>896,9756=>896,9757=>609,9758=>896,9759=>609,9760=>896,9761=>896,9762=>896,9763=>896,9764=>669,9765=>746,9766=>649,9767=>784,9768=>545,9769=>896,9770=>896,9771=>896,9772=>710,9773=>896,9774=>896,9775=>896,9776=>896,9777=>896,9778=>896,9779=>896,9780=>896,9781=>896,9782=>896,9783=>896,9784=>896,9785=>1042,9786=>1042,9787=>1042,9788=>896,9789=>896,9790=>896,9791=>614,9792=>732,9793=>732,9794=>896,9795=>896,9796=>896,9797=>896,9798=>896,9799=>896,9800=>896,9801=>896,9802=>896,9803=>896,9804=>896,9805=>896,9806=>896,9807=>896,9808=>896,9809=>896,9810=>896,9811=>896,9812=>896,9813=>896,9814=>896,9815=>896,9816=>896,9817=>896,9818=>896,9819=>896,9820=>896,9821=>896,9822=>896,9823=>896,9824=>896,9825=>896,9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9832=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472,9838=>357,9839=>484,9840=>748,9841=>766,9842=>896,9843=>896,9844=>896,9845=>896,9846=>896,9847=>896,9848=>896,9849=>896,9850=>896,9851=>896,9852=>896,9853=>896,9854=>896,9855=>896,9856=>869,9857=>869,9858=>869,9859=>869,9860=>869,9861=>869,9862=>896,9863=>896,9864=>896,9865=>896,9866=>896,9867=>896,9868=>896,9869=>896,9870=>896,9871=>896,9872=>896,9873=>896,9874=>896,9875=>896,9876=>896,9877=>541,9878=>896,9879=>896,9880=>896,9881=>896,9882=>896,9883=>896,9884=>896,9888=>896,9889=>702,9890=>1004,9891=>1089,9892=>1175,9893=>903,9894=>838,9895=>838,9896=>838,9897=>838,9898=>838,9899=>838,9900=>838,9901=>838,9902=>838,9903=>838,9904=>844,9905=>838,9906=>732,9907=>732,9908=>732,9909=>732,9910=>850,9911=>732,9912=>732,9920=>838,9921=>838,9922=>838,9923=>838,9954=>732,9985=>838,9986=>838,9987=>838,9988=>838,9990=>838,9991=>838,9992=>838,9993=>838,9996=>838,9997=>838,9998=>838,9999=>838,10000=>838,10001=>838,10002=>838,10003=>838,10004=>838,10005=>838,10006=>838,10007=>838,10008=>838,10009=>838,10010=>838,10011=>838,10012=>838,10013=>838,10014=>838,10015=>838,10016=>838,10017=>838,10018=>838,10019=>838,10020=>838,10021=>838,10022=>838,10023=>838,10025=>838,10026=>838,10027=>838,10028=>838,10029=>838,10030=>838,10031=>838,10032=>838,10033=>838,10034=>838,10035=>838,10036=>838,10037=>838,10038=>838,10039=>838,10040=>838,10041=>838,10042=>838,10043=>838,10044=>838,10045=>838,10046=>838,10047=>838,10048=>838,10049=>838,10050=>838,10051=>838,10052=>838,10053=>838,10054=>838,10055=>838,10056=>838,10057=>838,10058=>838,10059=>838,10061=>896,10063=>896,10064=>896,10065=>896,10066=>896,10070=>896,10072=>838,10073=>838,10074=>838,10075=>322,10076=>322,10077=>538,10078=>538,10081=>838,10082=>838,10083=>838,10084=>838,10085=>838,10086=>838,10087=>838,10088=>838,10089=>838,10090=>838,10091=>838,10092=>838,10093=>838,10094=>838,10095=>838,10096=>838,10097=>838,10098=>838,10099=>838,10100=>838,10101=>838,10102=>896,10103=>896,10104=>896,10105=>896,10106=>896,10107=>896,10108=>896,10109=>896,10110=>896,10111=>896,10112=>838,10113=>838,10114=>838,10115=>838,10116=>838,10117=>838,10118=>838,10119=>838,10120=>838,10121=>838,10122=>838,10123=>838,10124=>838,10125=>838,10126=>838,10127=>838,10128=>838,10129=>838,10130=>838,10131=>838,10132=>838,10136=>838,10137=>838,10138=>838,10139=>838,10140=>838,10141=>838,10142=>838,10143=>838,10144=>838,10145=>838,10146=>838,10147=>838,10148=>838,10149=>838,10150=>838,10151=>838,10152=>838,10153=>838,10154=>838,10155=>838,10156=>838,10157=>838,10158=>838,10159=>838,10161=>838,10162=>838,10163=>838,10164=>838,10165=>838,10166=>838,10167=>838,10168=>838,10169=>838,10170=>838,10171=>838,10172=>838,10173=>838,10174=>838,10181=>390,10182=>390,10208=>494,10214=>495,10215=>495,10216=>390,10217=>390,10218=>556,10219=>556,10224=>838,10225=>838,10226=>838,10227=>838,10228=>1157,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434,10237=>1434,10238=>1434,10239=>1434,10240=>732,10241=>732,10242=>732,10243=>732,10244=>732,10245=>732,10246=>732,10247=>732,10248=>732,10249=>732,10250=>732,10251=>732,10252=>732,10253=>732,10254=>732,10255=>732,10256=>732,10257=>732,10258=>732,10259=>732,10260=>732,10261=>732,10262=>732,10263=>732,10264=>732,10265=>732,10266=>732,10267=>732,10268=>732,10269=>732,10270=>732,10271=>732,10272=>732,10273=>732,10274=>732,10275=>732,10276=>732,10277=>732,10278=>732,10279=>732,10280=>732,10281=>732,10282=>732,10283=>732,10284=>732,10285=>732,10286=>732,10287=>732,10288=>732,10289=>732,10290=>732,10291=>732,10292=>732,10293=>732,10294=>732,10295=>732,10296=>732,10297=>732,10298=>732,10299=>732,10300=>732,10301=>732,10302=>732,10303=>732,10304=>732,10305=>732,10306=>732,10307=>732,10308=>732,10309=>732,10310=>732,10311=>732,10312=>732,10313=>732,10314=>732,10315=>732,10316=>732,10317=>732,10318=>732,10319=>732,10320=>732,10321=>732,10322=>732,10323=>732,10324=>732,10325=>732,10326=>732,10327=>732,10328=>732,10329=>732,10330=>732,10331=>732,10332=>732,10333=>732,10334=>732,10335=>732,10336=>732,10337=>732,10338=>732,10339=>732,10340=>732,10341=>732,10342=>732,10343=>732,10344=>732,10345=>732,10346=>732,10347=>732,10348=>732,10349=>732,10350=>732,10351=>732,10352=>732,10353=>732,10354=>732,10355=>732,10356=>732,10357=>732,10358=>732,10359=>732,10360=>732,10361=>732,10362=>732,10363=>732,10364=>732,10365=>732,10366=>732,10367=>732,10368=>732,10369=>732,10370=>732,10371=>732,10372=>732,10373=>732,10374=>732,10375=>732,10376=>732,10377=>732,10378=>732,10379=>732,10380=>732,10381=>732,10382=>732,10383=>732,10384=>732,10385=>732,10386=>732,10387=>732,10388=>732,10389=>732,10390=>732,10391=>732,10392=>732,10393=>732,10394=>732,10395=>732,10396=>732,10397=>732,10398=>732,10399=>732,10400=>732,10401=>732,10402=>732,10403=>732,10404=>732,10405=>732,10406=>732,10407=>732,10408=>732,10409=>732,10410=>732,10411=>732,10412=>732,10413=>732,10414=>732,10415=>732,10416=>732,10417=>732,10418=>732,10419=>732,10420=>732,10421=>732,10422=>732,10423=>732,10424=>732,10425=>732,10426=>732,10427=>732,10428=>732,10429=>732,10430=>732,10431=>732,10432=>732,10433=>732,10434=>732,10435=>732,10436=>732,10437=>732,10438=>732,10439=>732,10440=>732,10441=>732,10442=>732,10443=>732,10444=>732,10445=>732,10446=>732,10447=>732,10448=>732,10449=>732,10450=>732,10451=>732,10452=>732,10453=>732,10454=>732,10455=>732,10456=>732,10457=>732,10458=>732,10459=>732,10460=>732,10461=>732,10462=>732,10463=>732,10464=>732,10465=>732,10466=>732,10467=>732,10468=>732,10469=>732,10470=>732,10471=>732,10472=>732,10473=>732,10474=>732,10475=>732,10476=>732,10477=>732,10478=>732,10479=>732,10480=>732,10481=>732,10482=>732,10483=>732,10484=>732,10485=>732,10486=>732,10487=>732,10488=>732,10489=>732,10490=>732,10491=>732,10492=>732,10493=>732,10494=>732,10495=>732,10502=>838,10503=>838,10506=>838,10507=>838,10560=>683,10561=>683,10627=>734,10628=>734,10702=>838,10703=>1000,10704=>1000,10705=>1000,10706=>1000,10707=>1000,10708=>1000,10709=>1000,10731=>494,10746=>838,10747=>838,10752=>1000,10753=>1000,10754=>1000,10764=>1325,10765=>521,10766=>521,10767=>521,10768=>521,10769=>521,10770=>521,10771=>521,10772=>521,10773=>521,10774=>521,10775=>521,10776=>521,10777=>521,10778=>521,10779=>521,10780=>521,10799=>838,10877=>838,10878=>838,10879=>838,10880=>838,10881=>838,10882=>838,10883=>838,10884=>838,10885=>838,10886=>838,10887=>838,10888=>838,10889=>838,10890=>838,10891=>838,10892=>838,10893=>838,10894=>838,10895=>838,10896=>838,10897=>838,10898=>838,10899=>838,10900=>838,10901=>838,10902=>838,10903=>838,10904=>838,10905=>838,10906=>838,10907=>838,10908=>838,10909=>838,10910=>838,10911=>838,10912=>838,10926=>838,10927=>838,10928=>838,10929=>838,10930=>838,10931=>838,10932=>838,10933=>838,10934=>838,10935=>838,10936=>838,10937=>838,10938=>838,11001=>838,11002=>838,11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838,11018=>838,11019=>838,11020=>838,11021=>838,11022=>836,11023=>836,11024=>836,11025=>836,11026=>945,11027=>945,11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11039=>869,11040=>869,11041=>873,11042=>873,11043=>873,11044=>1119,11091=>869,11092=>869,11360=>557,11361=>278,11362=>557,11363=>603,11364=>695,11365=>613,11366=>392,11367=>752,11368=>634,11369=>656,11370=>579,11371=>685,11372=>525,11373=>781,11374=>863,11375=>684,11376=>781,11377=>734,11378=>1128,11379=>961,11380=>592,11381=>654,11382=>568,11383=>660,11385=>414,11386=>612,11387=>491,11388=>175,11389=>431,11390=>635,11391=>685,11568=>646,11569=>888,11570=>888,11571=>682,11572=>684,11573=>635,11574=>562,11575=>684,11576=>684,11577=>632,11578=>632,11579=>683,11580=>875,11581=>685,11582=>491,11583=>685,11584=>888,11585=>888,11586=>300,11587=>627,11588=>752,11589=>656,11590=>527,11591=>685,11592=>645,11593=>632,11594=>502,11595=>953,11596=>778,11597=>748,11598=>621,11599=>295,11600=>778,11601=>295,11602=>752,11603=>633,11604=>888,11605=>888,11606=>752,11607=>320,11608=>749,11609=>888,11610=>888,11611=>698,11612=>768,11613=>685,11614=>698,11615=>622,11616=>684,11617=>752,11618=>632,11619=>788,11620=>567,11621=>788,11631=>515,11800=>531,11810=>390,11811=>390,11812=>390,11813=>390,11822=>531,19904=>896,19905=>896,19906=>896,19907=>896,19908=>896,19909=>896,19910=>896,19911=>896,19912=>896,19913=>896,19914=>896,19915=>896,19916=>896,19917=>896,19918=>896,19919=>896,19920=>896,19921=>896,19922=>896,19923=>896,19924=>896,19925=>896,19926=>896,19927=>896,19928=>896,19929=>896,19930=>896,19931=>896,19932=>896,19933=>896,19934=>896,19935=>896,19936=>896,19937=>896,19938=>896,19939=>896,19940=>896,19941=>896,19942=>896,19943=>896,19944=>896,19945=>896,19946=>896,19947=>896,19948=>896,19949=>896,19950=>896,19951=>896,19952=>896,19953=>896,19954=>896,19955=>896,19956=>896,19957=>896,19958=>896,19959=>896,19960=>896,19961=>896,19962=>896,19963=>896,19964=>896,19965=>896,19966=>896,19967=>896,42564=>635,42565=>521,42566=>354,42567=>338,42572=>1180,42573=>1028,42576=>1029,42577=>906,42580=>1080,42581=>842,42582=>977,42583=>843,42594=>1062,42595=>912,42596=>1066,42597=>901,42598=>1178,42599=>1008,42600=>787,42601=>612,42602=>855,42603=>712,42604=>1358,42605=>1019,42606=>879,42634=>782,42635=>685,42636=>611,42637=>583,42644=>686,42645=>634,42760=>493,42761=>493,42762=>493,42763=>493,42764=>493,42765=>493,42766=>493,42767=>493,42768=>493,42769=>493,42770=>493,42771=>493,42772=>493,42773=>493,42774=>493,42779=>369,42780=>369,42781=>252,42782=>252,42783=>252,42786=>385,42787=>356,42788=>472,42789=>472,42790=>752,42791=>634,42792=>878,42793=>709,42794=>614,42795=>541,42800=>491,42801=>521,42802=>1250,42803=>985,42804=>1203,42805=>990,42806=>1142,42807=>981,42808=>971,42809=>818,42810=>971,42811=>818,42812=>959,42813=>818,42814=>703,42815=>549,42822=>680,42823=>392,42824=>582,42825=>427,42826=>807,42827=>704,42830=>1358,42831=>1019,42832=>603,42833=>635,42834=>734,42835=>774,42838=>787,42839=>635,42852=>605,42853=>635,42854=>605,42855=>635,42880=>557,42881=>278,42882=>735,42883=>634,42889=>337,42890=>376,42891=>401,42892=>275,42893=>686,42894=>487,42896=>772,42897=>667,43002=>915,43003=>575,43004=>603,43005=>863,43006=>295,43007=>1199,61184=>213,61185=>238,61186=>257,61187=>264,61188=>267,61189=>238,61190=>213,61191=>238,61192=>257,61193=>264,61194=>257,61195=>238,61196=>213,61197=>238,61198=>257,61199=>264,61200=>257,61201=>238,61202=>213,61203=>238,61204=>267,61205=>264,61206=>257,61207=>238,61208=>213,61209=>275,61440=>977,61441=>977,61442=>977,61443=>977,63173=>612,64256=>689,64257=>630,64258=>630,64259=>967,64260=>967,64261=>686,64262=>861,64275=>1202,64276=>1202,64277=>1196,64278=>1186,64279=>1529,64285=>224,64286=>0,64287=>331,64288=>636,64289=>856,64290=>774,64291=>906,64292=>771,64293=>843,64294=>855,64295=>807,64296=>875,64297=>838,64298=>708,64299=>708,64300=>708,64301=>708,64302=>668,64303=>668,64304=>668,64305=>578,64306=>412,64307=>546,64308=>653,64309=>355,64310=>406,64312=>648,64313=>330,64314=>537,64315=>529,64316=>568,64318=>679,64320=>399,64321=>649,64323=>640,64324=>625,64326=>593,64327=>709,64328=>564,64329=>708,64330=>657,64331=>272,64332=>578,64333=>529,64334=>625,64335=>629,64338=>941,64339=>982,64340=>278,64341=>302,64342=>941,64343=>982,64344=>278,64345=>302,64346=>941,64347=>982,64348=>278,64349=>302,64350=>941,64351=>982,64352=>278,64353=>302,64354=>941,64355=>982,64356=>278,64357=>302,64358=>941,64359=>982,64360=>278,64361=>302,64362=>1037,64363=>1035,64364=>478,64365=>506,64366=>1037,64367=>1035,64368=>478,64369=>506,64370=>646,64371=>646,64372=>618,64373=>646,64374=>646,64375=>646,64376=>618,64377=>646,64378=>646,64379=>646,64380=>618,64381=>646,64382=>646,64383=>646,64384=>618,64385=>646,64386=>445,64387=>525,64388=>445,64389=>525,64390=>445,64391=>525,64392=>445,64393=>525,64394=>483,64395=>552,64396=>483,64397=>552,64398=>895,64399=>895,64400=>476,64401=>552,64402=>895,64403=>895,64404=>476,64405=>552,64406=>895,64407=>895,64408=>476,64409=>552,64410=>895,64411=>895,64412=>476,64413=>552,64414=>734,64415=>761,64416=>734,64417=>761,64418=>278,64419=>302,64426=>698,64427=>632,64428=>527,64429=>461,64467=>824,64468=>843,64469=>476,64470=>552,64473=>483,64474=>517,64488=>278,64489=>302,64508=>783,64509=>833,64510=>278,64511=>302,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65136=>293,65137=>293,65138=>293,65139=>262,65140=>293,65142=>293,65143=>293,65144=>293,65145=>293,65146=>293,65147=>293,65148=>293,65149=>293,65150=>293,65151=>293,65152=>470,65153=>278,65154=>305,65155=>278,65156=>305,65157=>483,65158=>517,65159=>278,65160=>305,65161=>783,65162=>833,65163=>278,65164=>302,65165=>278,65166=>305,65167=>941,65168=>982,65169=>278,65170=>302,65171=>524,65172=>536,65173=>941,65174=>982,65175=>278,65176=>302,65177=>941,65178=>982,65179=>278,65180=>302,65181=>646,65182=>646,65183=>618,65184=>646,65185=>646,65186=>646,65187=>618,65188=>646,65189=>646,65190=>646,65191=>618,65192=>646,65193=>445,65194=>525,65195=>445,65196=>525,65197=>483,65198=>552,65199=>483,65200=>552,65201=>1221,65202=>1275,65203=>838,65204=>892,65205=>1221,65206=>1275,65207=>838,65208=>892,65209=>1209,65210=>1225,65211=>849,65212=>867,65213=>1209,65214=>1225,65215=>849,65216=>867,65217=>925,65218=>949,65219=>796,65220=>820,65221=>925,65222=>949,65223=>796,65224=>820,65225=>597,65226=>532,65227=>597,65228=>482,65229=>597,65230=>532,65231=>523,65232=>482,65233=>1037,65234=>1035,65235=>478,65236=>506,65237=>776,65238=>834,65239=>478,65240=>506,65241=>824,65242=>843,65243=>476,65244=>552,65245=>727,65246=>757,65247=>305,65248=>331,65249=>619,65250=>666,65251=>536,65252=>578,65253=>734,65254=>761,65255=>278,65256=>302,65257=>524,65258=>536,65259=>527,65260=>461,65261=>483,65262=>517,65263=>783,65264=>833,65265=>783,65266=>833,65267=>278,65268=>302,65269=>570,65270=>597,65271=>570,65272=>597,65273=>570,65274=>597,65275=>570,65276=>597,65279=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1025,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusans.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusans.z
new file mode 100644
index 00000000..114ed7d3
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusans.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansb.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansb.ctg.z
new file mode 100644
index 00000000..0d171320
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansb.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansb.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansb.php
new file mode 100644
index 00000000..ee8a5b65
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansb.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSans-Bold';
+$up=-63;
+$ut=44;
+$dw=600;
+$diff='';
+$originalsize=672300;
+$enc='';
+$file='dejavusansb.z';
+$ctg='dejavusansb.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-1069 -415 1975 1174]','ItalicAngle'=>0,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>547,'StemV'=>60,'StemH'=>26,'AvgWidth'=>573,'MaxWidth'=>2016,'MissingWidth'=>600);
+$cw=array(0=>600,32=>348,33=>456,34=>521,35=>838,36=>696,37=>1002,38=>872,39=>306,40=>457,41=>457,42=>523,43=>838,44=>380,45=>415,46=>380,47=>365,48=>696,49=>696,50=>696,51=>696,52=>696,53=>696,54=>696,55=>696,56=>696,57=>696,58=>400,59=>400,60=>838,61=>838,62=>838,63=>580,64=>1000,65=>774,66=>762,67=>734,68=>830,69=>683,70=>683,71=>821,72=>837,73=>372,74=>372,75=>775,76=>637,77=>995,78=>837,79=>850,80=>733,81=>850,82=>770,83=>720,84=>682,85=>812,86=>774,87=>1103,88=>771,89=>724,90=>725,91=>457,92=>365,93=>457,94=>838,95=>500,96=>500,97=>675,98=>716,99=>593,100=>716,101=>678,102=>435,103=>716,104=>712,105=>343,106=>343,107=>665,108=>343,109=>1042,110=>712,111=>687,112=>716,113=>716,114=>493,115=>595,116=>478,117=>712,118=>652,119=>924,120=>645,121=>652,122=>582,123=>712,124=>365,125=>712,126=>838,160=>348,161=>456,162=>696,163=>696,164=>636,165=>696,166=>365,167=>500,168=>500,169=>1000,170=>564,171=>646,172=>838,173=>415,174=>1000,175=>500,176=>500,177=>838,178=>438,179=>438,180=>500,181=>736,182=>636,183=>380,184=>500,185=>438,186=>564,187=>646,188=>1035,189=>1035,190=>1035,191=>580,192=>774,193=>774,194=>774,195=>774,196=>774,197=>774,198=>1085,199=>734,200=>683,201=>683,202=>683,203=>683,204=>372,205=>372,206=>372,207=>372,208=>838,209=>837,210=>850,211=>850,212=>850,213=>850,214=>850,215=>838,216=>850,217=>812,218=>812,219=>812,220=>812,221=>724,222=>738,223=>719,224=>675,225=>675,226=>675,227=>675,228=>675,229=>675,230=>1048,231=>593,232=>678,233=>678,234=>678,235=>678,236=>343,237=>343,238=>343,239=>343,240=>687,241=>712,242=>687,243=>687,244=>687,245=>687,246=>687,247=>838,248=>687,249=>712,250=>712,251=>712,252=>712,253=>652,254=>716,255=>652,256=>774,257=>675,258=>774,259=>675,260=>774,261=>675,262=>734,263=>593,264=>734,265=>593,266=>734,267=>593,268=>734,269=>593,270=>830,271=>716,272=>838,273=>716,274=>683,275=>678,276=>683,277=>678,278=>683,279=>678,280=>683,281=>678,282=>683,283=>678,284=>821,285=>716,286=>821,287=>716,288=>821,289=>716,290=>821,291=>716,292=>837,293=>712,294=>974,295=>790,296=>372,297=>343,298=>372,299=>343,300=>372,301=>343,302=>372,303=>343,304=>372,305=>343,306=>744,307=>686,308=>372,309=>343,310=>775,311=>665,312=>665,313=>637,314=>343,315=>637,316=>343,317=>637,318=>479,319=>637,320=>557,321=>642,322=>371,323=>837,324=>712,325=>837,326=>712,327=>837,328=>712,329=>983,330=>837,331=>712,332=>850,333=>687,334=>850,335=>687,336=>850,337=>687,338=>1167,339=>1094,340=>770,341=>493,342=>770,343=>493,344=>770,345=>493,346=>720,347=>595,348=>720,349=>595,350=>720,351=>595,352=>720,353=>595,354=>682,355=>478,356=>682,357=>478,358=>682,359=>478,360=>812,361=>712,362=>812,363=>712,364=>812,365=>712,366=>812,367=>712,368=>812,369=>712,370=>812,371=>712,372=>1103,373=>924,374=>724,375=>652,376=>724,377=>725,378=>582,379=>725,380=>582,381=>725,382=>582,383=>435,384=>716,385=>811,386=>762,387=>716,388=>762,389=>716,390=>734,391=>734,392=>593,393=>838,394=>879,395=>757,396=>716,397=>688,398=>683,399=>849,400=>696,401=>683,402=>435,403=>821,404=>793,405=>1045,406=>436,407=>389,408=>775,409=>665,410=>360,411=>592,412=>1042,413=>837,414=>712,415=>850,416=>874,417=>687,418=>1083,419=>912,420=>782,421=>716,422=>770,423=>720,424=>595,425=>683,426=>552,427=>478,428=>707,429=>478,430=>682,431=>835,432=>712,433=>850,434=>813,435=>797,436=>778,437=>725,438=>582,439=>772,440=>772,441=>641,442=>582,443=>696,444=>772,445=>641,446=>573,447=>716,448=>372,449=>659,450=>544,451=>372,452=>1555,453=>1412,454=>1298,455=>1009,456=>980,457=>686,458=>1209,459=>1180,460=>1055,461=>774,462=>675,463=>372,464=>343,465=>850,466=>687,467=>812,468=>712,469=>812,470=>712,471=>812,472=>712,473=>812,474=>712,475=>812,476=>712,477=>678,478=>774,479=>675,480=>774,481=>675,482=>1085,483=>1048,484=>821,485=>716,486=>821,487=>716,488=>775,489=>665,490=>850,491=>687,492=>850,493=>687,494=>772,495=>582,496=>343,497=>1555,498=>1412,499=>1298,500=>821,501=>716,502=>1289,503=>787,504=>837,505=>712,506=>774,507=>675,508=>1085,509=>1048,510=>850,511=>687,512=>774,513=>675,514=>774,515=>675,516=>683,517=>678,518=>683,519=>678,520=>372,521=>343,522=>372,523=>343,524=>850,525=>687,526=>850,527=>687,528=>770,529=>493,530=>770,531=>493,532=>812,533=>712,534=>812,535=>712,536=>720,537=>595,538=>682,539=>478,540=>690,541=>607,542=>837,543=>712,544=>837,545=>865,546=>809,547=>659,548=>725,549=>582,550=>774,551=>675,552=>683,553=>678,554=>850,555=>687,556=>850,557=>687,558=>850,559=>687,560=>850,561=>687,562=>724,563=>652,564=>492,565=>867,566=>512,567=>343,568=>1088,569=>1088,570=>774,571=>734,572=>593,573=>637,574=>682,575=>595,576=>582,577=>782,578=>614,579=>762,580=>812,581=>774,582=>683,583=>678,584=>372,585=>343,586=>860,587=>791,588=>770,589=>493,590=>724,591=>652,592=>675,593=>716,594=>716,595=>716,596=>593,597=>593,598=>717,599=>792,600=>678,601=>678,602=>876,603=>557,604=>545,605=>815,606=>731,607=>343,608=>792,609=>716,610=>627,611=>644,612=>635,613=>712,614=>712,615=>712,616=>545,617=>440,618=>545,619=>559,620=>693,621=>343,622=>841,623=>1042,624=>1042,625=>1042,626=>712,627=>793,628=>707,629=>687,630=>909,631=>681,632=>796,633=>538,634=>538,635=>650,636=>493,637=>493,638=>596,639=>596,640=>642,641=>642,642=>595,643=>415,644=>435,645=>605,646=>552,647=>478,648=>478,649=>920,650=>772,651=>670,652=>652,653=>924,654=>652,655=>724,656=>694,657=>684,658=>641,659=>641,660=>573,661=>573,662=>573,663=>573,664=>850,665=>633,666=>731,667=>685,668=>691,669=>343,670=>732,671=>539,672=>792,673=>573,674=>573,675=>1156,676=>1214,677=>1155,678=>974,679=>769,680=>929,681=>1026,682=>792,683=>780,684=>591,685=>415,686=>677,687=>789,688=>456,689=>456,690=>219,691=>315,692=>315,693=>315,694=>411,695=>591,696=>417,697=>302,698=>521,699=>380,700=>380,701=>380,702=>366,703=>366,704=>326,705=>326,706=>500,707=>500,708=>500,709=>500,710=>500,711=>500,712=>306,713=>500,714=>500,715=>500,716=>306,717=>500,718=>500,719=>500,720=>337,721=>337,722=>366,723=>366,724=>500,725=>500,726=>416,727=>328,728=>500,729=>500,730=>500,731=>500,732=>500,733=>500,734=>351,735=>500,736=>412,737=>219,738=>381,739=>413,740=>326,741=>500,742=>500,743=>500,744=>500,745=>500,748=>500,749=>500,750=>657,755=>500,759=>500,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>698,881=>565,882=>1022,883=>836,884=>302,885=>302,886=>837,887=>701,890=>500,891=>593,892=>550,893=>549,894=>400,900=>441,901=>500,902=>797,903=>380,904=>846,905=>1009,906=>563,908=>891,910=>980,911=>894,912=>390,913=>774,914=>762,915=>637,916=>774,917=>683,918=>725,919=>837,920=>850,921=>372,922=>775,923=>774,924=>995,925=>837,926=>632,927=>850,928=>837,929=>733,931=>683,932=>682,933=>724,934=>850,935=>771,936=>850,937=>850,938=>372,939=>724,940=>687,941=>557,942=>712,943=>390,944=>675,945=>687,946=>716,947=>681,948=>687,949=>557,950=>591,951=>712,952=>687,953=>390,954=>710,955=>633,956=>736,957=>681,958=>591,959=>687,960=>791,961=>716,962=>593,963=>779,964=>638,965=>675,966=>782,967=>645,968=>794,969=>869,970=>390,971=>675,972=>687,973=>675,974=>869,975=>775,976=>651,977=>661,978=>746,979=>981,980=>746,981=>796,982=>869,983=>744,984=>850,985=>687,986=>734,987=>593,988=>683,989=>494,990=>702,991=>660,992=>919,993=>627,994=>1093,995=>837,996=>832,997=>716,998=>928,999=>744,1000=>733,1001=>650,1002=>789,1003=>671,1004=>752,1005=>716,1006=>682,1007=>590,1008=>744,1009=>716,1010=>593,1011=>343,1012=>850,1013=>645,1014=>644,1015=>738,1016=>716,1017=>734,1018=>995,1019=>732,1020=>716,1021=>698,1022=>734,1023=>698,1024=>683,1025=>683,1026=>878,1027=>637,1028=>734,1029=>720,1030=>372,1031=>372,1032=>372,1033=>1154,1034=>1130,1035=>878,1036=>817,1037=>837,1038=>771,1039=>837,1040=>774,1041=>762,1042=>762,1043=>637,1044=>891,1045=>683,1046=>1224,1047=>710,1048=>837,1049=>837,1050=>817,1051=>831,1052=>995,1053=>837,1054=>850,1055=>837,1056=>733,1057=>734,1058=>682,1059=>771,1060=>992,1061=>771,1062=>928,1063=>808,1064=>1235,1065=>1326,1066=>939,1067=>1036,1068=>762,1069=>734,1070=>1174,1071=>770,1072=>675,1073=>698,1074=>633,1075=>522,1076=>808,1077=>678,1078=>995,1079=>581,1080=>701,1081=>701,1082=>679,1083=>732,1084=>817,1085=>691,1086=>687,1087=>691,1088=>716,1089=>593,1090=>580,1091=>652,1092=>992,1093=>645,1094=>741,1095=>687,1096=>1062,1097=>1105,1098=>751,1099=>904,1100=>632,1101=>593,1102=>972,1103=>642,1104=>678,1105=>678,1106=>714,1107=>522,1108=>593,1109=>595,1110=>343,1111=>343,1112=>343,1113=>991,1114=>956,1115=>734,1116=>679,1117=>701,1118=>652,1119=>691,1120=>1093,1121=>869,1122=>840,1123=>736,1124=>1012,1125=>839,1126=>992,1127=>832,1128=>1358,1129=>1121,1130=>850,1131=>687,1132=>1236,1133=>1007,1134=>696,1135=>557,1136=>1075,1137=>1061,1138=>850,1139=>687,1140=>850,1141=>695,1142=>850,1143=>695,1144=>1148,1145=>1043,1146=>1074,1147=>863,1148=>1405,1149=>1173,1150=>1093,1151=>869,1152=>734,1153=>593,1154=>652,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>418,1161=>418,1162=>957,1163=>807,1164=>762,1165=>611,1166=>733,1167=>716,1168=>637,1169=>522,1170=>666,1171=>543,1172=>808,1173=>669,1174=>1224,1175=>995,1176=>710,1177=>581,1178=>775,1179=>679,1180=>817,1181=>679,1182=>817,1183=>679,1184=>1015,1185=>826,1186=>956,1187=>808,1188=>1103,1189=>874,1190=>1273,1191=>1017,1192=>952,1193=>858,1194=>734,1195=>593,1196=>682,1197=>580,1198=>724,1199=>652,1200=>724,1201=>652,1202=>771,1203=>645,1204=>1112,1205=>1000,1206=>808,1207=>687,1208=>808,1209=>687,1210=>808,1211=>712,1212=>1026,1213=>810,1214=>1026,1215=>810,1216=>372,1217=>1224,1218=>995,1219=>775,1220=>630,1221=>951,1222=>805,1223=>837,1224=>691,1225=>957,1226=>807,1227=>808,1228=>687,1229=>1115,1230=>933,1231=>343,1232=>774,1233=>675,1234=>774,1235=>675,1236=>1085,1237=>1048,1238=>683,1239=>678,1240=>849,1241=>678,1242=>849,1243=>678,1244=>1224,1245=>995,1246=>710,1247=>581,1248=>772,1249=>641,1250=>837,1251=>701,1252=>837,1253=>701,1254=>850,1255=>687,1256=>850,1257=>687,1258=>850,1259=>687,1260=>734,1261=>593,1262=>771,1263=>652,1264=>771,1265=>652,1266=>771,1267=>652,1268=>808,1269=>687,1270=>637,1271=>522,1272=>1036,1273=>904,1274=>666,1275=>543,1276=>771,1277=>645,1278=>771,1279=>645,1280=>762,1281=>608,1282=>1159,1283=>893,1284=>1119,1285=>920,1286=>828,1287=>693,1288=>1242,1289=>1017,1290=>1289,1291=>1013,1292=>839,1293=>638,1294=>938,1295=>803,1296=>696,1297=>557,1298=>831,1299=>732,1300=>1286,1301=>1068,1302=>1065,1303=>979,1304=>1082,1305=>1013,1306=>850,1307=>716,1308=>1103,1309=>924,1310=>817,1311=>679,1312=>1267,1313=>1059,1314=>1273,1315=>1017,1316=>957,1317=>807,1329=>813,1330=>729,1331=>728,1332=>731,1333=>729,1334=>733,1335=>652,1336=>720,1337=>903,1338=>728,1339=>666,1340=>558,1341=>961,1342=>788,1343=>713,1344=>651,1345=>730,1346=>715,1347=>704,1348=>780,1349=>689,1350=>715,1351=>708,1352=>731,1353=>677,1354=>867,1355=>711,1356=>780,1357=>731,1358=>715,1359=>693,1360=>666,1361=>698,1362=>576,1363=>833,1364=>698,1365=>763,1366=>855,1369=>330,1370=>342,1371=>308,1372=>374,1373=>313,1374=>461,1375=>468,1377=>938,1378=>642,1379=>704,1380=>708,1381=>642,1382=>644,1383=>565,1384=>642,1385=>756,1386=>704,1387=>643,1388=>310,1389=>984,1390=>638,1391=>643,1392=>643,1393=>603,1394=>643,1395=>642,1396=>643,1397=>309,1398=>643,1399=>486,1400=>643,1401=>366,1402=>938,1403=>573,1404=>666,1405=>643,1406=>643,1407=>934,1408=>643,1409=>643,1410=>479,1411=>934,1412=>648,1413=>620,1414=>813,1415=>812,1417=>360,1418=>374,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>415,1471=>0,1472=>372,1473=>0,1474=>0,1475=>372,1478=>497,1479=>0,1488=>728,1489=>610,1490=>447,1491=>588,1492=>687,1493=>343,1494=>400,1495=>687,1496=>679,1497=>294,1498=>578,1499=>566,1500=>605,1501=>696,1502=>724,1503=>343,1504=>453,1505=>680,1506=>666,1507=>675,1508=>658,1509=>661,1510=>653,1511=>736,1512=>602,1513=>758,1514=>683,1520=>664,1521=>567,1522=>519,1523=>444,1524=>710,1542=>667,1543=>667,1545=>884,1546=>1157,1548=>380,1557=>0,1563=>400,1567=>580,1569=>511,1570=>343,1571=>343,1572=>622,1573=>343,1574=>917,1575=>343,1576=>1005,1577=>590,1578=>1005,1579=>1005,1580=>721,1581=>721,1582=>721,1583=>513,1584=>513,1585=>576,1586=>576,1587=>1380,1588=>1380,1589=>1345,1590=>1345,1591=>1039,1592=>1039,1593=>683,1594=>683,1600=>342,1601=>1162,1602=>894,1603=>917,1604=>868,1605=>733,1606=>854,1607=>590,1608=>622,1609=>917,1610=>917,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1623=>0,1626=>500,1632=>610,1633=>610,1634=>610,1635=>610,1636=>610,1637=>610,1638=>610,1639=>610,1640=>610,1641=>610,1642=>610,1643=>374,1644=>380,1645=>545,1646=>1005,1647=>894,1648=>0,1652=>292,1657=>1005,1658=>1005,1659=>1005,1660=>1005,1661=>1005,1662=>1005,1663=>1005,1664=>1005,1665=>721,1666=>721,1667=>721,1668=>721,1669=>721,1670=>721,1671=>721,1672=>445,1673=>445,1674=>445,1675=>445,1676=>445,1677=>445,1678=>445,1679=>445,1680=>445,1681=>576,1682=>576,1683=>576,1684=>576,1685=>681,1686=>576,1687=>576,1688=>576,1689=>576,1690=>1380,1691=>1380,1692=>1380,1693=>1345,1694=>1345,1695=>1039,1696=>683,1697=>1162,1698=>1162,1699=>1162,1700=>1162,1701=>1162,1702=>1162,1703=>894,1704=>894,1705=>1024,1706=>1271,1707=>1024,1708=>917,1709=>917,1710=>917,1711=>1024,1712=>1024,1713=>1024,1714=>1024,1715=>1024,1716=>1024,1717=>868,1718=>868,1719=>868,1720=>868,1721=>854,1722=>854,1723=>854,1724=>854,1725=>854,1726=>938,1727=>721,1734=>622,1740=>917,1742=>917,1749=>590,1776=>610,1777=>610,1778=>610,1779=>610,1780=>610,1781=>610,1782=>610,1783=>610,1784=>610,1785=>610,1984=>696,1985=>696,1986=>696,1987=>696,1988=>696,1989=>696,1990=>696,1991=>696,1992=>696,1993=>696,1994=>343,1995=>547,1996=>543,1997=>652,1998=>691,1999=>691,2000=>594,2001=>691,2002=>904,2003=>551,2004=>551,2005=>627,2006=>688,2007=>444,2008=>1022,2009=>506,2010=>826,2011=>691,2012=>652,2013=>912,2014=>627,2015=>707,2016=>506,2017=>652,2018=>574,2019=>627,2020=>627,2021=>627,2022=>574,2023=>574,2027=>0,2028=>0,2029=>0,2030=>0,2031=>0,2032=>0,2033=>0,2034=>0,2035=>0,2036=>380,2037=>380,2040=>691,2041=>691,2042=>415,3647=>696,3713=>790,3714=>748,3716=>749,3719=>569,3720=>742,3722=>744,3725=>761,3732=>706,3733=>704,3734=>747,3735=>819,3737=>730,3738=>727,3739=>727,3740=>922,3741=>827,3742=>866,3743=>866,3745=>836,3746=>761,3747=>770,3749=>769,3751=>713,3754=>827,3755=>1031,3757=>724,3758=>784,3759=>934,3760=>688,3761=>0,3762=>610,3763=>610,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0,3769=>0,3771=>0,3772=>0,3773=>670,3776=>516,3777=>860,3778=>516,3779=>650,3780=>632,3782=>759,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>771,3793=>771,3794=>693,3795=>836,3796=>729,3797=>729,3798=>849,3799=>790,3800=>759,3801=>910,3804=>1363,3805=>1363,4256=>918,4257=>744,4258=>739,4259=>837,4260=>649,4261=>773,4262=>857,4263=>889,4264=>530,4265=>633,4266=>857,4267=>900,4268=>643,4269=>903,4270=>814,4271=>752,4272=>869,4273=>643,4274=>643,4275=>886,4276=>886,4277=>733,4278=>653,4279=>643,4280=>646,4281=>643,4282=>790,4283=>902,4284=>633,4285=>619,4286=>643,4287=>778,4288=>892,4289=>601,4290=>742,4291=>616,4292=>633,4293=>742,4304=>553,4305=>552,4306=>596,4307=>815,4308=>562,4309=>563,4310=>553,4311=>827,4312=>553,4313=>543,4314=>1074,4315=>563,4316=>563,4317=>812,4318=>552,4319=>591,4320=>822,4321=>563,4322=>690,4323=>583,4324=>813,4325=>562,4326=>813,4327=>563,4328=>563,4329=>563,4330=>632,4331=>563,4332=>563,4333=>552,4334=>563,4335=>563,4336=>558,4337=>604,4338=>552,4339=>552,4340=>553,4341=>605,4342=>852,4343=>635,4344=>563,4345=>596,4346=>542,4347=>684,4348=>368,5121=>774,5122=>774,5123=>774,5124=>774,5125=>905,5126=>905,5127=>905,5129=>905,5130=>905,5131=>905,5132=>1018,5133=>1009,5134=>1018,5135=>1009,5136=>1018,5137=>1009,5138=>1149,5139=>1140,5140=>1149,5141=>1140,5142=>905,5143=>1149,5144=>1142,5145=>1149,5146=>1142,5147=>905,5149=>310,5150=>529,5151=>425,5152=>425,5153=>395,5154=>395,5155=>395,5156=>395,5157=>564,5158=>470,5159=>310,5160=>395,5161=>395,5162=>395,5163=>1213,5164=>986,5165=>1216,5166=>1297,5167=>774,5168=>774,5169=>774,5170=>774,5171=>886,5172=>886,5173=>886,5175=>886,5176=>886,5177=>886,5178=>1018,5179=>1009,5180=>1018,5181=>1009,5182=>1018,5183=>1009,5184=>1149,5185=>1140,5186=>1149,5187=>1140,5188=>1149,5189=>1142,5190=>1149,5191=>1142,5192=>886,5193=>576,5194=>229,5196=>812,5197=>812,5198=>812,5199=>812,5200=>815,5201=>815,5202=>815,5204=>815,5205=>815,5206=>815,5207=>1056,5208=>1048,5209=>1056,5210=>1048,5211=>1056,5212=>1048,5213=>1060,5214=>1054,5215=>1060,5216=>1054,5217=>1060,5218=>1052,5219=>1060,5220=>1052,5221=>1060,5222=>483,5223=>1005,5224=>1005,5225=>1023,5226=>1017,5227=>743,5228=>743,5229=>743,5230=>743,5231=>743,5232=>743,5233=>743,5234=>743,5235=>743,5236=>1029,5237=>975,5238=>980,5239=>975,5240=>980,5241=>975,5242=>1029,5243=>975,5244=>1029,5245=>975,5246=>980,5247=>975,5248=>980,5249=>975,5250=>980,5251=>501,5252=>501,5253=>938,5254=>938,5255=>938,5256=>938,5257=>743,5258=>743,5259=>743,5260=>743,5261=>743,5262=>743,5263=>743,5264=>743,5265=>743,5266=>1029,5267=>975,5268=>1029,5269=>975,5270=>1029,5271=>975,5272=>1029,5273=>975,5274=>1029,5275=>975,5276=>1029,5277=>975,5278=>1029,5279=>975,5280=>1029,5281=>501,5282=>501,5283=>626,5284=>626,5285=>626,5286=>626,5287=>626,5288=>626,5289=>626,5290=>626,5291=>626,5292=>881,5293=>854,5294=>863,5295=>874,5296=>863,5297=>874,5298=>881,5299=>874,5300=>881,5301=>874,5302=>863,5303=>874,5304=>863,5305=>874,5306=>863,5307=>436,5308=>548,5309=>436,5312=>988,5313=>988,5314=>988,5315=>988,5316=>931,5317=>931,5318=>931,5319=>931,5320=>931,5321=>1238,5322=>1247,5323=>1200,5324=>1228,5325=>1200,5326=>1228,5327=>931,5328=>660,5329=>497,5330=>660,5331=>988,5332=>988,5333=>988,5334=>988,5335=>931,5336=>931,5337=>931,5338=>931,5339=>931,5340=>1231,5341=>1247,5342=>1283,5343=>1228,5344=>1283,5345=>1228,5346=>1228,5347=>1214,5348=>1228,5349=>1214,5350=>1283,5351=>1228,5352=>1283,5353=>1228,5354=>660,5356=>886,5357=>730,5358=>730,5359=>730,5360=>730,5361=>730,5362=>730,5363=>730,5364=>730,5365=>730,5366=>998,5367=>958,5368=>967,5369=>989,5370=>967,5371=>989,5372=>998,5373=>958,5374=>998,5375=>958,5376=>967,5377=>989,5378=>967,5379=>989,5380=>967,5381=>493,5382=>460,5383=>493,5392=>923,5393=>923,5394=>923,5395=>1136,5396=>1136,5397=>1136,5398=>1136,5399=>1209,5400=>1202,5401=>1209,5402=>1202,5403=>1209,5404=>1202,5405=>1431,5406=>1420,5407=>1431,5408=>1420,5409=>1431,5410=>1420,5411=>1431,5412=>1420,5413=>746,5414=>776,5415=>776,5416=>776,5417=>776,5418=>776,5419=>776,5420=>776,5421=>776,5422=>776,5423=>1003,5424=>1003,5425=>1013,5426=>996,5427=>1013,5428=>996,5429=>1003,5430=>1003,5431=>1003,5432=>1003,5433=>1013,5434=>996,5435=>1013,5436=>996,5437=>1013,5438=>495,5440=>395,5441=>510,5442=>1033,5443=>1033,5444=>976,5445=>976,5446=>976,5447=>976,5448=>733,5449=>733,5450=>733,5451=>733,5452=>733,5453=>733,5454=>1003,5455=>959,5456=>495,5458=>886,5459=>774,5460=>774,5461=>774,5462=>774,5463=>928,5464=>928,5465=>928,5466=>928,5467=>1172,5468=>1142,5469=>602,5470=>812,5471=>812,5472=>812,5473=>812,5474=>812,5475=>812,5476=>815,5477=>815,5478=>815,5479=>815,5480=>1060,5481=>1052,5482=>548,5492=>977,5493=>977,5494=>977,5495=>977,5496=>977,5497=>977,5498=>977,5499=>618,5500=>837,5501=>510,5502=>1238,5503=>1238,5504=>1238,5505=>1238,5506=>1238,5507=>1238,5508=>1238,5509=>989,5514=>977,5515=>977,5516=>977,5517=>977,5518=>1591,5519=>1591,5520=>1591,5521=>1295,5522=>1295,5523=>1591,5524=>1591,5525=>848,5526=>1273,5536=>988,5537=>988,5538=>931,5539=>931,5540=>931,5541=>931,5542=>660,5543=>776,5544=>776,5545=>776,5546=>776,5547=>776,5548=>776,5549=>776,5550=>495,5551=>743,5598=>830,5601=>830,5702=>496,5703=>496,5742=>413,5743=>1238,5744=>1591,5745=>2016,5746=>2016,5747=>1720,5748=>1678,5749=>2016,5750=>2016,5760=>543,5761=>637,5762=>945,5763=>1254,5764=>1563,5765=>1871,5766=>627,5767=>936,5768=>1254,5769=>1559,5770=>1871,5771=>569,5772=>877,5773=>1187,5774=>1497,5775=>1807,5776=>637,5777=>945,5778=>1240,5779=>1555,5780=>1871,5781=>569,5782=>569,5783=>789,5784=>1234,5785=>1559,5786=>740,5787=>638,5788=>638,7424=>652,7425=>833,7426=>1048,7427=>608,7428=>593,7429=>676,7430=>676,7431=>559,7432=>557,7433=>343,7434=>494,7435=>665,7436=>539,7437=>817,7438=>701,7439=>687,7440=>593,7441=>660,7442=>660,7443=>660,7444=>1094,7446=>687,7447=>687,7448=>556,7449=>642,7450=>642,7451=>580,7452=>634,7453=>737,7454=>948,7455=>695,7456=>652,7457=>924,7458=>582,7459=>646,7462=>539,7463=>652,7464=>691,7465=>556,7466=>781,7467=>732,7468=>487,7469=>683,7470=>480,7472=>523,7473=>430,7474=>430,7475=>517,7476=>527,7477=>234,7478=>234,7479=>488,7480=>401,7481=>626,7482=>527,7483=>527,7484=>535,7485=>509,7486=>461,7487=>485,7488=>430,7489=>511,7490=>695,7491=>458,7492=>458,7493=>479,7494=>712,7495=>479,7496=>479,7497=>479,7498=>479,7499=>386,7500=>386,7501=>479,7502=>219,7503=>487,7504=>664,7505=>456,7506=>488,7507=>414,7508=>488,7509=>488,7510=>479,7511=>388,7512=>456,7513=>462,7514=>664,7515=>501,7517=>451,7518=>429,7519=>433,7520=>493,7521=>406,7522=>219,7523=>315,7524=>456,7525=>501,7526=>451,7527=>429,7528=>451,7529=>493,7530=>406,7543=>716,7544=>527,7547=>545,7549=>747,7557=>514,7579=>479,7580=>414,7581=>414,7582=>488,7583=>386,7584=>377,7585=>348,7586=>479,7587=>456,7588=>347,7589=>281,7590=>347,7591=>347,7592=>431,7593=>326,7594=>330,7595=>370,7596=>664,7597=>664,7598=>562,7599=>562,7600=>448,7601=>488,7602=>542,7603=>422,7604=>396,7605=>388,7606=>583,7607=>494,7608=>399,7609=>451,7610=>501,7611=>417,7612=>523,7613=>470,7614=>455,7615=>425,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>774,7681=>675,7682=>762,7683=>716,7684=>762,7685=>716,7686=>762,7687=>716,7688=>734,7689=>593,7690=>830,7691=>716,7692=>830,7693=>716,7694=>830,7695=>716,7696=>830,7697=>716,7698=>830,7699=>716,7700=>683,7701=>678,7702=>683,7703=>678,7704=>683,7705=>678,7706=>683,7707=>678,7708=>683,7709=>678,7710=>683,7711=>435,7712=>821,7713=>716,7714=>837,7715=>712,7716=>837,7717=>712,7718=>837,7719=>712,7720=>837,7721=>712,7722=>837,7723=>712,7724=>372,7725=>343,7726=>372,7727=>343,7728=>775,7729=>665,7730=>775,7731=>665,7732=>775,7733=>665,7734=>637,7735=>343,7736=>637,7737=>343,7738=>637,7739=>343,7740=>637,7741=>343,7742=>995,7743=>1042,7744=>995,7745=>1042,7746=>995,7747=>1042,7748=>837,7749=>712,7750=>837,7751=>712,7752=>837,7753=>712,7754=>837,7755=>712,7756=>850,7757=>687,7758=>850,7759=>687,7760=>850,7761=>687,7762=>850,7763=>687,7764=>733,7765=>716,7766=>733,7767=>716,7768=>770,7769=>493,7770=>770,7771=>493,7772=>770,7773=>493,7774=>770,7775=>493,7776=>720,7777=>595,7778=>720,7779=>595,7780=>720,7781=>595,7782=>720,7783=>595,7784=>720,7785=>595,7786=>682,7787=>478,7788=>682,7789=>478,7790=>682,7791=>478,7792=>682,7793=>478,7794=>812,7795=>712,7796=>812,7797=>712,7798=>812,7799=>712,7800=>812,7801=>712,7802=>812,7803=>712,7804=>774,7805=>652,7806=>774,7807=>652,7808=>1103,7809=>924,7810=>1103,7811=>924,7812=>1103,7813=>924,7814=>1103,7815=>924,7816=>1103,7817=>924,7818=>771,7819=>645,7820=>771,7821=>645,7822=>724,7823=>652,7824=>725,7825=>582,7826=>725,7827=>582,7828=>725,7829=>582,7830=>712,7831=>478,7832=>924,7833=>652,7834=>675,7835=>435,7836=>435,7837=>435,7838=>896,7839=>687,7840=>774,7841=>675,7842=>774,7843=>675,7844=>774,7845=>675,7846=>774,7847=>675,7848=>774,7849=>675,7850=>774,7851=>675,7852=>774,7853=>675,7854=>774,7855=>675,7856=>774,7857=>675,7858=>774,7859=>675,7860=>774,7861=>675,7862=>774,7863=>675,7864=>683,7865=>678,7866=>683,7867=>678,7868=>683,7869=>678,7870=>683,7871=>678,7872=>683,7873=>678,7874=>683,7875=>678,7876=>683,7877=>678,7878=>683,7879=>678,7880=>372,7881=>343,7882=>372,7883=>343,7884=>850,7885=>687,7886=>850,7887=>687,7888=>850,7889=>687,7890=>850,7891=>687,7892=>850,7893=>687,7894=>850,7895=>687,7896=>850,7897=>687,7898=>874,7899=>687,7900=>874,7901=>687,7902=>874,7903=>687,7904=>874,7905=>687,7906=>874,7907=>687,7908=>812,7909=>712,7910=>812,7911=>712,7912=>835,7913=>712,7914=>835,7915=>712,7916=>835,7917=>712,7918=>835,7919=>712,7920=>835,7921=>712,7922=>724,7923=>652,7924=>724,7925=>652,7926=>724,7927=>652,7928=>724,7929=>652,7930=>953,7931=>644,7936=>687,7937=>687,7938=>687,7939=>687,7940=>687,7941=>687,7942=>687,7943=>687,7944=>774,7945=>774,7946=>1041,7947=>1043,7948=>935,7949=>963,7950=>835,7951=>859,7952=>557,7953=>557,7954=>557,7955=>557,7956=>557,7957=>557,7960=>792,7961=>794,7962=>1100,7963=>1096,7964=>1023,7965=>1052,7968=>712,7969=>712,7970=>712,7971=>712,7972=>712,7973=>712,7974=>712,7975=>712,7976=>945,7977=>951,7978=>1250,7979=>1250,7980=>1180,7981=>1206,7982=>1054,7983=>1063,7984=>390,7985=>390,7986=>390,7987=>390,7988=>390,7989=>390,7990=>390,7991=>390,7992=>483,7993=>489,7994=>777,7995=>785,7996=>712,7997=>738,7998=>604,7999=>604,8000=>687,8001=>687,8002=>687,8003=>687,8004=>687,8005=>687,8008=>892,8009=>933,8010=>1221,8011=>1224,8012=>1053,8013=>1082,8016=>675,8017=>675,8018=>675,8019=>675,8020=>675,8021=>675,8022=>675,8023=>675,8025=>930,8027=>1184,8029=>1199,8031=>1049,8032=>869,8033=>869,8034=>869,8035=>869,8036=>869,8037=>869,8038=>869,8039=>869,8040=>909,8041=>958,8042=>1246,8043=>1251,8044=>1076,8045=>1105,8046=>1028,8047=>1076,8048=>687,8049=>687,8050=>557,8051=>557,8052=>712,8053=>712,8054=>390,8055=>390,8056=>687,8057=>687,8058=>675,8059=>675,8060=>869,8061=>869,8064=>687,8065=>687,8066=>687,8067=>687,8068=>687,8069=>687,8070=>687,8071=>687,8072=>774,8073=>774,8074=>1041,8075=>1043,8076=>935,8077=>963,8078=>835,8079=>859,8080=>712,8081=>712,8082=>712,8083=>712,8084=>712,8085=>712,8086=>712,8087=>712,8088=>945,8089=>951,8090=>1250,8091=>1250,8092=>1180,8093=>1206,8094=>1054,8095=>1063,8096=>869,8097=>869,8098=>869,8099=>869,8100=>869,8101=>869,8102=>869,8103=>869,8104=>909,8105=>958,8106=>1246,8107=>1251,8108=>1076,8109=>1105,8110=>1028,8111=>1076,8112=>687,8113=>687,8114=>687,8115=>687,8116=>687,8118=>687,8119=>687,8120=>774,8121=>774,8122=>876,8123=>797,8124=>774,8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>712,8131=>712,8132=>712,8134=>712,8135=>712,8136=>929,8137=>846,8138=>1080,8139=>1009,8140=>837,8141=>500,8142=>500,8143=>500,8144=>390,8145=>390,8146=>390,8147=>390,8150=>390,8151=>390,8152=>372,8153=>372,8154=>621,8155=>563,8157=>500,8158=>500,8159=>500,8160=>675,8161=>675,8162=>675,8163=>675,8164=>716,8165=>716,8166=>675,8167=>675,8168=>724,8169=>724,8170=>1020,8171=>980,8172=>838,8173=>500,8174=>500,8175=>500,8178=>869,8179=>869,8180=>869,8182=>869,8183=>869,8184=>1065,8185=>891,8186=>1084,8187=>894,8188=>850,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>696,8200=>380,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>415,8209=>415,8210=>696,8211=>500,8212=>1000,8213=>1000,8214=>500,8215=>500,8216=>380,8217=>380,8218=>380,8219=>380,8220=>657,8221=>657,8222=>657,8223=>657,8224=>500,8225=>500,8226=>639,8227=>639,8228=>333,8229=>667,8230=>1000,8231=>348,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200,8240=>1440,8241=>1887,8242=>264,8243=>447,8244=>630,8245=>264,8246=>447,8247=>630,8248=>733,8249=>412,8250=>412,8251=>972,8252=>627,8253=>580,8254=>500,8255=>828,8256=>828,8257=>329,8258=>1023,8259=>500,8260=>167,8261=>457,8262=>457,8263=>1030,8264=>829,8265=>829,8266=>513,8267=>636,8268=>500,8269=>500,8270=>523,8271=>400,8272=>828,8273=>523,8274=>556,8275=>1000,8276=>828,8277=>838,8278=>684,8279=>813,8280=>838,8281=>838,8282=>380,8283=>872,8284=>838,8285=>380,8286=>380,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>438,8305=>219,8308=>438,8309=>438,8310=>438,8311=>438,8312=>438,8313=>438,8314=>528,8315=>528,8316=>528,8317=>288,8318=>288,8319=>456,8320=>438,8321=>438,8322=>438,8323=>438,8324=>438,8325=>438,8326=>438,8327=>438,8328=>438,8329=>438,8330=>528,8331=>528,8332=>528,8333=>288,8334=>288,8336=>458,8337=>479,8338=>488,8339=>413,8340=>479,8341=>456,8342=>487,8343=>219,8344=>664,8345=>456,8346=>479,8347=>381,8348=>388,8352=>929,8353=>696,8354=>696,8355=>696,8356=>696,8357=>1042,8358=>837,8359=>1518,8360=>1205,8361=>1103,8362=>904,8363=>696,8364=>696,8365=>696,8366=>696,8367=>1392,8368=>696,8369=>696,8370=>696,8371=>696,8372=>859,8373=>696,8376=>696,8377=>696,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>1120,8449=>1170,8450=>734,8451=>1211,8452=>896,8453=>1091,8454=>1144,8455=>614,8456=>698,8457=>1086,8459=>1073,8460=>913,8461=>888,8462=>712,8463=>712,8464=>597,8465=>697,8466=>856,8467=>472,8468=>974,8469=>837,8470=>1203,8471=>1000,8472=>697,8473=>750,8474=>850,8475=>938,8476=>814,8477=>801,8478=>896,8479=>710,8480=>1020,8481=>1281,8482=>1000,8483=>755,8484=>754,8485=>578,8486=>850,8487=>850,8488=>763,8489=>338,8490=>775,8491=>774,8492=>928,8493=>818,8494=>854,8495=>636,8496=>729,8497=>808,8498=>683,8499=>1184,8500=>465,8501=>794,8502=>731,8503=>494,8504=>684,8505=>380,8506=>945,8507=>1348,8508=>790,8509=>737,8510=>654,8511=>863,8512=>840,8513=>775,8514=>557,8515=>637,8516=>760,8517=>830,8518=>716,8519=>678,8520=>343,8521=>343,8523=>872,8526=>547,8528=>1035,8529=>1035,8530=>1483,8531=>1035,8532=>1035,8533=>1035,8534=>1035,8535=>1035,8536=>1035,8537=>1035,8538=>1035,8539=>1035,8540=>1035,8541=>1035,8542=>1035,8543=>615,8544=>372,8545=>659,8546=>945,8547=>1099,8548=>774,8549=>1099,8550=>1386,8551=>1672,8552=>1121,8553=>771,8554=>1120,8555=>1407,8556=>637,8557=>734,8558=>830,8559=>995,8560=>343,8561=>607,8562=>872,8563=>984,8564=>652,8565=>962,8566=>1227,8567=>1491,8568=>969,8569=>645,8570=>969,8571=>1233,8572=>343,8573=>593,8574=>716,8575=>1042,8576=>1289,8577=>830,8578=>1289,8579=>734,8580=>593,8581=>734,8585=>1035,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838,8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838,8620=>838,8621=>838,8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838,8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838,8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838,8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838,8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838,8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838,8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838,8700=>838,8701=>838,8702=>838,8703=>838,8704=>774,8705=>696,8706=>544,8707=>683,8708=>683,8709=>856,8710=>697,8711=>697,8712=>896,8713=>896,8714=>750,8715=>896,8716=>896,8717=>750,8718=>636,8719=>787,8720=>787,8721=>718,8722=>838,8723=>838,8724=>696,8725=>365,8726=>696,8727=>838,8728=>626,8729=>380,8730=>667,8731=>667,8732=>667,8733=>712,8734=>833,8735=>838,8736=>896,8737=>896,8738=>838,8739=>500,8740=>500,8741=>500,8742=>500,8743=>812,8744=>812,8745=>812,8746=>812,8747=>610,8748=>929,8749=>1295,8750=>563,8751=>977,8752=>1313,8753=>563,8754=>563,8755=>563,8756=>696,8757=>696,8758=>294,8759=>696,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838,8766=>838,8767=>838,8768=>375,8769=>838,8770=>838,8771=>838,8772=>838,8773=>838,8774=>838,8775=>838,8776=>838,8777=>838,8778=>838,8779=>838,8780=>838,8781=>838,8782=>838,8783=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1063,8789=>1063,8790=>838,8791=>838,8792=>838,8793=>838,8794=>838,8795=>838,8796=>838,8797=>838,8798=>838,8799=>838,8800=>838,8801=>838,8802=>838,8803=>838,8804=>838,8805=>838,8806=>838,8807=>838,8808=>841,8809=>841,8810=>1047,8811=>1047,8812=>500,8813=>838,8814=>838,8815=>838,8816=>838,8817=>838,8818=>838,8819=>838,8820=>838,8821=>838,8822=>838,8823=>838,8824=>838,8825=>838,8826=>838,8827=>838,8828=>838,8829=>838,8830=>838,8831=>838,8832=>838,8833=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8840=>838,8841=>838,8842=>838,8843=>838,8844=>812,8845=>812,8846=>812,8847=>838,8848=>838,8849=>838,8850=>838,8851=>796,8852=>796,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838,8865=>838,8866=>914,8867=>914,8868=>914,8869=>914,8870=>542,8871=>542,8872=>914,8873=>914,8874=>914,8875=>914,8876=>914,8877=>914,8878=>914,8879=>914,8880=>838,8881=>838,8882=>838,8883=>838,8884=>838,8885=>838,8886=>1000,8887=>1000,8888=>838,8889=>838,8890=>542,8891=>812,8892=>812,8893=>812,8894=>838,8895=>838,8896=>843,8897=>843,8898=>843,8899=>843,8900=>494,8901=>380,8902=>626,8903=>838,8904=>1000,8905=>1000,8906=>1000,8907=>1000,8908=>1000,8909=>838,8910=>812,8911=>812,8912=>838,8913=>838,8914=>838,8915=>838,8916=>838,8917=>838,8918=>838,8919=>838,8920=>1422,8921=>1422,8922=>838,8923=>838,8924=>838,8925=>838,8926=>838,8927=>838,8928=>838,8929=>838,8930=>838,8931=>838,8932=>838,8933=>838,8934=>838,8935=>838,8936=>838,8937=>838,8938=>838,8939=>838,8940=>838,8941=>838,8942=>1000,8943=>1000,8944=>1000,8945=>1000,8946=>1158,8947=>896,8948=>750,8949=>896,8950=>896,8951=>750,8952=>896,8953=>896,8954=>1158,8955=>896,8956=>750,8957=>896,8958=>750,8959=>896,8960=>602,8961=>602,8962=>716,8963=>838,8964=>838,8965=>838,8966=>838,8967=>488,8968=>457,8969=>457,8970=>457,8971=>457,8972=>809,8973=>809,8974=>809,8975=>809,8976=>838,8977=>539,8984=>928,8985=>838,8988=>469,8989=>469,8990=>469,8991=>469,8992=>610,8993=>610,8996=>1152,8997=>1152,8998=>1414,8999=>1152,9000=>1443,9003=>1414,9004=>873,9075=>390,9076=>716,9077=>869,9082=>687,9085=>863,9095=>1152,9108=>873,9115=>500,9116=>500,9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500,9125=>500,9126=>500,9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>610,9166=>838,9167=>945,9187=>873,9189=>769,9192=>696,9250=>716,9251=>716,9312=>847,9313=>847,9314=>847,9315=>847,9316=>847,9317=>847,9318=>847,9319=>847,9320=>847,9321=>847,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527,9687=>527,9688=>840,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>769,9697=>769,9698=>769,9699=>769,9700=>769,9701=>769,9702=>639,9703=>945,9704=>945,9705=>945,9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732,9727=>769,9728=>896,9729=>1000,9730=>896,9731=>896,9732=>896,9733=>896,9734=>896,9735=>573,9736=>896,9737=>896,9738=>888,9739=>888,9740=>671,9741=>1013,9742=>1246,9743=>1250,9744=>896,9745=>896,9746=>896,9747=>532,9748=>896,9749=>896,9750=>896,9751=>896,9752=>896,9753=>896,9754=>896,9755=>896,9756=>896,9757=>609,9758=>896,9759=>609,9760=>896,9761=>896,9762=>896,9763=>896,9764=>669,9765=>746,9766=>649,9767=>784,9768=>545,9769=>896,9770=>896,9771=>896,9772=>710,9773=>896,9774=>896,9775=>896,9776=>896,9777=>896,9778=>896,9779=>896,9780=>896,9781=>896,9782=>896,9783=>896,9784=>896,9785=>1042,9786=>1042,9787=>1042,9788=>896,9789=>896,9790=>896,9791=>614,9792=>732,9793=>732,9794=>896,9795=>896,9796=>896,9797=>896,9798=>896,9799=>896,9800=>896,9801=>896,9802=>896,9803=>896,9804=>896,9805=>896,9806=>896,9807=>896,9808=>896,9809=>896,9810=>896,9811=>896,9812=>896,9813=>896,9814=>896,9815=>896,9816=>896,9817=>896,9818=>896,9819=>896,9820=>896,9821=>896,9822=>896,9823=>896,9824=>896,9825=>896,9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9832=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472,9838=>357,9839=>484,9840=>748,9841=>766,9842=>896,9843=>896,9844=>896,9845=>896,9846=>896,9847=>896,9848=>896,9849=>896,9850=>896,9851=>896,9852=>896,9853=>896,9854=>896,9855=>896,9856=>869,9857=>869,9858=>869,9859=>869,9860=>869,9861=>869,9862=>896,9863=>896,9864=>896,9865=>896,9866=>896,9867=>896,9868=>896,9869=>896,9870=>896,9871=>896,9872=>896,9873=>896,9874=>896,9875=>896,9876=>896,9877=>541,9878=>896,9879=>896,9880=>896,9881=>896,9882=>896,9883=>896,9884=>896,9888=>896,9889=>702,9890=>1004,9891=>1089,9892=>1175,9893=>903,9894=>838,9895=>838,9896=>838,9897=>838,9898=>838,9899=>838,9900=>838,9901=>838,9902=>838,9903=>838,9904=>844,9905=>838,9906=>732,9907=>732,9908=>732,9909=>732,9910=>850,9911=>732,9912=>732,9920=>838,9921=>838,9922=>838,9923=>838,9954=>732,9985=>838,9986=>838,9987=>838,9988=>838,9990=>838,9991=>838,9992=>838,9993=>838,9996=>838,9997=>838,9998=>838,9999=>838,10000=>838,10001=>838,10002=>838,10003=>838,10004=>838,10005=>838,10006=>838,10007=>838,10008=>838,10009=>838,10010=>838,10011=>838,10012=>838,10013=>838,10014=>838,10015=>838,10016=>838,10017=>838,10018=>838,10019=>838,10020=>838,10021=>838,10022=>838,10023=>838,10025=>838,10026=>838,10027=>838,10028=>838,10029=>838,10030=>838,10031=>838,10032=>838,10033=>838,10034=>838,10035=>838,10036=>838,10037=>838,10038=>838,10039=>838,10040=>838,10041=>838,10042=>838,10043=>838,10044=>838,10045=>838,10046=>838,10047=>838,10048=>838,10049=>838,10050=>838,10051=>838,10052=>838,10053=>838,10054=>838,10055=>838,10056=>838,10057=>838,10058=>838,10059=>838,10061=>896,10063=>896,10064=>896,10065=>896,10066=>896,10070=>896,10072=>838,10073=>838,10074=>838,10075=>347,10076=>347,10077=>587,10078=>587,10081=>838,10082=>838,10083=>838,10084=>838,10085=>838,10086=>838,10087=>838,10088=>838,10089=>838,10090=>838,10091=>838,10092=>838,10093=>838,10094=>838,10095=>838,10096=>838,10097=>838,10098=>838,10099=>838,10100=>838,10101=>838,10102=>847,10103=>847,10104=>847,10105=>847,10106=>847,10107=>847,10108=>847,10109=>847,10110=>847,10111=>847,10112=>838,10113=>838,10114=>838,10115=>838,10116=>838,10117=>838,10118=>838,10119=>838,10120=>838,10121=>838,10122=>838,10123=>838,10124=>838,10125=>838,10126=>838,10127=>838,10128=>838,10129=>838,10130=>838,10131=>838,10132=>838,10136=>838,10137=>838,10138=>838,10139=>838,10140=>838,10141=>838,10142=>838,10143=>838,10144=>838,10145=>838,10146=>838,10147=>838,10148=>838,10149=>838,10150=>838,10151=>838,10152=>838,10153=>838,10154=>838,10155=>838,10156=>838,10157=>838,10158=>838,10159=>838,10161=>838,10162=>838,10163=>838,10164=>838,10165=>838,10166=>838,10167=>838,10168=>838,10169=>838,10170=>838,10171=>838,10172=>838,10173=>838,10174=>838,10181=>457,10182=>457,10208=>494,10214=>487,10215=>487,10216=>457,10217=>457,10218=>721,10219=>721,10224=>838,10225=>838,10226=>838,10227=>838,10228=>1157,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434,10237=>1434,10238=>1434,10239=>1434,10240=>781,10241=>781,10242=>781,10243=>781,10244=>781,10245=>781,10246=>781,10247=>781,10248=>781,10249=>781,10250=>781,10251=>781,10252=>781,10253=>781,10254=>781,10255=>781,10256=>781,10257=>781,10258=>781,10259=>781,10260=>781,10261=>781,10262=>781,10263=>781,10264=>781,10265=>781,10266=>781,10267=>781,10268=>781,10269=>781,10270=>781,10271=>781,10272=>781,10273=>781,10274=>781,10275=>781,10276=>781,10277=>781,10278=>781,10279=>781,10280=>781,10281=>781,10282=>781,10283=>781,10284=>781,10285=>781,10286=>781,10287=>781,10288=>781,10289=>781,10290=>781,10291=>781,10292=>781,10293=>781,10294=>781,10295=>781,10296=>781,10297=>781,10298=>781,10299=>781,10300=>781,10301=>781,10302=>781,10303=>781,10304=>781,10305=>781,10306=>781,10307=>781,10308=>781,10309=>781,10310=>781,10311=>781,10312=>781,10313=>781,10314=>781,10315=>781,10316=>781,10317=>781,10318=>781,10319=>781,10320=>781,10321=>781,10322=>781,10323=>781,10324=>781,10325=>781,10326=>781,10327=>781,10328=>781,10329=>781,10330=>781,10331=>781,10332=>781,10333=>781,10334=>781,10335=>781,10336=>781,10337=>781,10338=>781,10339=>781,10340=>781,10341=>781,10342=>781,10343=>781,10344=>781,10345=>781,10346=>781,10347=>781,10348=>781,10349=>781,10350=>781,10351=>781,10352=>781,10353=>781,10354=>781,10355=>781,10356=>781,10357=>781,10358=>781,10359=>781,10360=>781,10361=>781,10362=>781,10363=>781,10364=>781,10365=>781,10366=>781,10367=>781,10368=>781,10369=>781,10370=>781,10371=>781,10372=>781,10373=>781,10374=>781,10375=>781,10376=>781,10377=>781,10378=>781,10379=>781,10380=>781,10381=>781,10382=>781,10383=>781,10384=>781,10385=>781,10386=>781,10387=>781,10388=>781,10389=>781,10390=>781,10391=>781,10392=>781,10393=>781,10394=>781,10395=>781,10396=>781,10397=>781,10398=>781,10399=>781,10400=>781,10401=>781,10402=>781,10403=>781,10404=>781,10405=>781,10406=>781,10407=>781,10408=>781,10409=>781,10410=>781,10411=>781,10412=>781,10413=>781,10414=>781,10415=>781,10416=>781,10417=>781,10418=>781,10419=>781,10420=>781,10421=>781,10422=>781,10423=>781,10424=>781,10425=>781,10426=>781,10427=>781,10428=>781,10429=>781,10430=>781,10431=>781,10432=>781,10433=>781,10434=>781,10435=>781,10436=>781,10437=>781,10438=>781,10439=>781,10440=>781,10441=>781,10442=>781,10443=>781,10444=>781,10445=>781,10446=>781,10447=>781,10448=>781,10449=>781,10450=>781,10451=>781,10452=>781,10453=>781,10454=>781,10455=>781,10456=>781,10457=>781,10458=>781,10459=>781,10460=>781,10461=>781,10462=>781,10463=>781,10464=>781,10465=>781,10466=>781,10467=>781,10468=>781,10469=>781,10470=>781,10471=>781,10472=>781,10473=>781,10474=>781,10475=>781,10476=>781,10477=>781,10478=>781,10479=>781,10480=>781,10481=>781,10482=>781,10483=>781,10484=>781,10485=>781,10486=>781,10487=>781,10488=>781,10489=>781,10490=>781,10491=>781,10492=>781,10493=>781,10494=>781,10495=>781,10502=>838,10503=>838,10506=>838,10507=>838,10560=>838,10561=>838,10627=>753,10628=>753,10702=>838,10703=>1046,10704=>1046,10705=>1000,10706=>1000,10707=>1000,10708=>1000,10709=>1000,10731=>494,10746=>838,10747=>838,10752=>1000,10753=>1000,10754=>1000,10764=>1661,10765=>563,10766=>563,10767=>563,10768=>563,10769=>563,10770=>563,10771=>563,10772=>563,10773=>563,10774=>563,10775=>563,10776=>563,10777=>563,10778=>563,10779=>563,10780=>563,10799=>838,10877=>838,10878=>838,10879=>838,10880=>838,10881=>838,10882=>838,10883=>838,10884=>838,10885=>838,10886=>838,10887=>838,10888=>838,10889=>838,10890=>838,10891=>838,10892=>838,10893=>838,10894=>838,10895=>838,10896=>838,10897=>838,10898=>838,10899=>838,10900=>838,10901=>838,10902=>838,10903=>838,10904=>838,10905=>838,10906=>838,10907=>838,10908=>838,10909=>838,10910=>838,10911=>838,10912=>838,10926=>838,10927=>838,10928=>838,10929=>838,10930=>838,10931=>838,10932=>838,10933=>838,10934=>838,10935=>838,10936=>838,10937=>838,10938=>838,11001=>838,11002=>838,11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838,11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838,11026=>945,11027=>945,11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11039=>869,11040=>869,11041=>873,11042=>873,11043=>873,11044=>1119,11091=>869,11092=>869,11360=>637,11361=>360,11362=>637,11363=>733,11364=>770,11365=>675,11366=>478,11367=>956,11368=>712,11369=>775,11370=>665,11371=>725,11372=>582,11373=>860,11374=>995,11375=>774,11376=>860,11377=>778,11378=>1221,11379=>1056,11380=>652,11381=>698,11382=>565,11383=>782,11385=>538,11386=>687,11387=>559,11388=>219,11389=>487,11390=>720,11391=>725,11568=>691,11569=>941,11570=>941,11571=>725,11572=>725,11573=>725,11574=>676,11575=>774,11576=>774,11577=>683,11578=>683,11579=>802,11580=>989,11581=>761,11582=>623,11583=>761,11584=>941,11585=>941,11586=>373,11587=>740,11588=>837,11589=>914,11590=>672,11591=>737,11592=>680,11593=>683,11594=>602,11595=>1039,11596=>778,11597=>837,11598=>683,11599=>372,11600=>778,11601=>373,11602=>725,11603=>691,11604=>941,11605=>941,11606=>837,11607=>373,11608=>836,11609=>941,11610=>941,11611=>734,11612=>876,11613=>771,11614=>734,11615=>683,11616=>774,11617=>837,11618=>683,11619=>850,11620=>697,11621=>850,11631=>716,11800=>580,11810=>457,11811=>457,11812=>457,11813=>457,11822=>580,19904=>896,19905=>896,19906=>896,19907=>896,19908=>896,19909=>896,19910=>896,19911=>896,19912=>896,19913=>896,19914=>896,19915=>896,19916=>896,19917=>896,19918=>896,19919=>896,19920=>896,19921=>896,19922=>896,19923=>896,19924=>896,19925=>896,19926=>896,19927=>896,19928=>896,19929=>896,19930=>896,19931=>896,19932=>896,19933=>896,19934=>896,19935=>896,19936=>896,19937=>896,19938=>896,19939=>896,19940=>896,19941=>896,19942=>896,19943=>896,19944=>896,19945=>896,19946=>896,19947=>896,19948=>896,19949=>896,19950=>896,19951=>896,19952=>896,19953=>896,19954=>896,19955=>896,19956=>896,19957=>896,19958=>896,19959=>896,19960=>896,19961=>896,19962=>896,19963=>896,19964=>896,19965=>896,19966=>896,19967=>896,42564=>720,42565=>595,42566=>436,42567=>440,42572=>1405,42573=>1173,42576=>1234,42577=>1027,42580=>1174,42581=>972,42582=>1093,42583=>958,42594=>1085,42595=>924,42596=>1096,42597=>912,42598=>1260,42599=>997,42600=>850,42601=>687,42602=>1037,42603=>868,42604=>1406,42605=>1106,42606=>961,42634=>963,42635=>787,42636=>682,42637=>580,42644=>808,42645=>712,42760=>500,42761=>500,42762=>500,42763=>500,42764=>500,42765=>500,42766=>500,42767=>500,42768=>500,42769=>500,42770=>500,42771=>500,42772=>500,42773=>500,42774=>500,42779=>400,42780=>400,42781=>287,42782=>287,42783=>287,42786=>444,42787=>390,42788=>540,42789=>540,42790=>837,42791=>712,42792=>1031,42793=>857,42794=>696,42795=>557,42800=>559,42801=>595,42802=>1349,42803=>1052,42804=>1284,42805=>1064,42806=>1216,42807=>1054,42808=>1079,42809=>922,42810=>1079,42811=>922,42812=>1035,42813=>922,42814=>698,42815=>549,42822=>850,42823=>542,42824=>683,42825=>531,42826=>918,42827=>814,42830=>1406,42831=>1106,42832=>733,42833=>716,42834=>948,42835=>937,42838=>850,42839=>716,42852=>738,42853=>716,42854=>738,42855=>716,42880=>637,42881=>343,42882=>837,42883=>712,42889=>400,42890=>386,42891=>456,42892=>306,42893=>808,42894=>693,42896=>928,42897=>768,43002=>1062,43003=>683,43004=>733,43005=>995,43006=>372,43007=>1325,61184=>216,61185=>242,61186=>267,61187=>277,61188=>282,61189=>242,61190=>216,61191=>242,61192=>267,61193=>277,61194=>267,61195=>242,61196=>216,61197=>242,61198=>267,61199=>277,61200=>267,61201=>242,61202=>216,61203=>242,61204=>282,61205=>277,61206=>267,61207=>242,61208=>216,61209=>282,63173=>687,64256=>810,64257=>741,64258=>741,64259=>1115,64260=>1116,64261=>808,64262=>1020,64275=>1388,64276=>1384,64277=>1378,64278=>1384,64279=>1713,64285=>294,64286=>0,64287=>519,64288=>665,64289=>939,64290=>788,64291=>920,64292=>786,64293=>857,64294=>869,64295=>821,64296=>890,64297=>838,64298=>758,64299=>758,64300=>758,64301=>758,64302=>728,64303=>728,64304=>728,64305=>610,64306=>447,64307=>588,64308=>687,64309=>437,64310=>485,64312=>679,64313=>435,64314=>578,64315=>566,64316=>605,64318=>724,64320=>453,64321=>680,64323=>675,64324=>658,64326=>653,64327=>736,64328=>602,64329=>758,64330=>683,64331=>343,64332=>610,64333=>566,64334=>658,64335=>710,64338=>1005,64339=>1059,64340=>375,64341=>408,64342=>1005,64343=>1059,64344=>375,64345=>408,64346=>1005,64347=>1059,64348=>375,64349=>408,64350=>1005,64351=>1059,64352=>375,64353=>408,64354=>1005,64355=>1059,64356=>375,64357=>408,64358=>1005,64359=>1059,64360=>375,64361=>408,64362=>1162,64363=>1191,64364=>655,64365=>720,64366=>1162,64367=>1191,64368=>655,64369=>720,64370=>721,64371=>721,64372=>721,64373=>721,64374=>721,64375=>721,64376=>721,64377=>721,64378=>721,64379=>721,64380=>721,64381=>721,64382=>721,64383=>721,64384=>721,64385=>721,64386=>513,64387=>578,64388=>513,64389=>578,64390=>513,64391=>578,64392=>513,64393=>578,64394=>576,64395=>622,64396=>576,64397=>622,64398=>1024,64399=>1024,64400=>582,64401=>582,64402=>1024,64403=>1024,64404=>582,64405=>582,64406=>1024,64407=>1024,64408=>582,64409=>582,64410=>1024,64411=>1024,64412=>582,64413=>582,64414=>854,64415=>900,64416=>854,64417=>900,64418=>375,64419=>408,64426=>938,64427=>880,64428=>693,64429=>660,64467=>824,64468=>843,64469=>476,64470=>552,64473=>622,64474=>627,64488=>375,64489=>408,64508=>917,64509=>1012,64510=>375,64511=>408,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65136=>342,65137=>342,65138=>342,65139=>346,65140=>342,65142=>342,65143=>342,65144=>342,65145=>342,65146=>342,65147=>342,65148=>342,65149=>342,65150=>342,65151=>342,65152=>511,65153=>343,65154=>375,65155=>343,65156=>375,65157=>622,65158=>627,65159=>343,65160=>375,65161=>917,65162=>917,65163=>375,65164=>408,65165=>343,65166=>375,65167=>1005,65168=>1059,65169=>375,65170=>408,65171=>590,65172=>606,65173=>1005,65174=>1059,65175=>375,65176=>408,65177=>1005,65178=>1059,65179=>375,65180=>408,65181=>721,65182=>721,65183=>721,65184=>721,65185=>721,65186=>721,65187=>721,65188=>721,65189=>721,65190=>721,65191=>721,65192=>721,65193=>513,65194=>578,65195=>513,65196=>578,65197=>576,65198=>622,65199=>576,65200=>622,65201=>1380,65202=>1414,65203=>983,65204=>1018,65205=>1380,65206=>1414,65207=>983,65208=>1018,65209=>1345,65210=>1364,65211=>966,65212=>985,65213=>1345,65214=>1364,65215=>966,65216=>985,65217=>1039,65218=>1071,65219=>942,65220=>974,65221=>1039,65222=>1071,65223=>942,65224=>974,65225=>683,65226=>683,65227=>683,65228=>564,65229=>683,65230=>683,65231=>683,65232=>564,65233=>1162,65234=>1191,65235=>655,65236=>720,65237=>894,65238=>901,65239=>655,65240=>720,65241=>917,65242=>931,65243=>582,65244=>582,65245=>868,65246=>893,65247=>375,65248=>408,65249=>733,65250=>784,65251=>619,65252=>670,65253=>854,65254=>900,65255=>375,65256=>408,65257=>590,65258=>606,65259=>693,65260=>660,65261=>622,65262=>627,65263=>917,65264=>1012,65265=>917,65266=>1012,65267=>375,65268=>408,65269=>745,65270=>759,65271=>745,65272=>759,65273=>745,65274=>759,65275=>745,65276=>759,65279=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1113,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansb.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansb.z
new file mode 100644
index 00000000..ec19021e
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansb.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansbi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansbi.ctg.z
new file mode 100644
index 00000000..3119c2a2
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansbi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansbi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansbi.php
new file mode 100644
index 00000000..90d83ce4
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansbi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSans-BoldOblique';
+$up=-63;
+$ut=44;
+$dw=600;
+$diff='';
+$originalsize=611212;
+$enc='';
+$file='dejavusansbi.z';
+$ctg='dejavusansbi.ctg.z';
+$desc=array('Flags'=>96,'FontBBox'=>'[-1067 -385 1999 1121]','ItalicAngle'=>-11,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>547,'StemV'=>60,'StemH'=>26,'AvgWidth'=>573,'MaxWidth'=>2016,'MissingWidth'=>600);
+$cw=array(0=>600,32=>348,33=>456,34=>521,35=>696,36=>696,37=>1002,38=>872,39=>306,40=>457,41=>457,42=>523,43=>838,44=>380,45=>415,46=>380,47=>365,48=>696,49=>696,50=>696,51=>696,52=>696,53=>696,54=>696,55=>696,56=>696,57=>696,58=>400,59=>400,60=>838,61=>838,62=>838,63=>580,64=>1000,65=>774,66=>762,67=>734,68=>830,69=>683,70=>683,71=>821,72=>837,73=>372,74=>372,75=>775,76=>637,77=>995,78=>837,79=>850,80=>733,81=>850,82=>770,83=>720,84=>682,85=>812,86=>774,87=>1103,88=>771,89=>724,90=>725,91=>457,92=>365,93=>457,94=>838,95=>500,96=>500,97=>675,98=>716,99=>593,100=>716,101=>678,102=>435,103=>716,104=>712,105=>343,106=>343,107=>665,108=>343,109=>1042,110=>712,111=>687,112=>716,113=>716,114=>493,115=>595,116=>478,117=>712,118=>652,119=>924,120=>645,121=>652,122=>582,123=>712,124=>365,125=>712,126=>838,160=>348,161=>456,162=>696,163=>696,164=>636,165=>696,166=>365,167=>500,168=>500,169=>1000,170=>564,171=>650,172=>838,173=>415,174=>1000,175=>500,176=>500,177=>838,178=>438,179=>438,180=>500,181=>736,182=>636,183=>380,184=>500,185=>438,186=>564,187=>650,188=>1035,189=>1035,190=>1035,191=>580,192=>774,193=>774,194=>774,195=>774,196=>774,197=>774,198=>1085,199=>734,200=>683,201=>683,202=>683,203=>683,204=>372,205=>372,206=>372,207=>372,208=>845,209=>837,210=>850,211=>850,212=>850,213=>850,214=>850,215=>838,216=>850,217=>812,218=>812,219=>812,220=>812,221=>724,222=>742,223=>719,224=>675,225=>675,226=>675,227=>675,228=>675,229=>675,230=>1048,231=>593,232=>678,233=>678,234=>678,235=>678,236=>343,237=>343,238=>343,239=>343,240=>687,241=>712,242=>687,243=>687,244=>687,245=>687,246=>687,247=>838,248=>687,249=>712,250=>712,251=>712,252=>712,253=>652,254=>716,255=>652,256=>774,257=>675,258=>774,259=>675,260=>774,261=>675,262=>734,263=>593,264=>734,265=>593,266=>734,267=>593,268=>734,269=>593,270=>830,271=>716,272=>845,273=>716,274=>683,275=>678,276=>683,277=>678,278=>683,279=>678,280=>683,281=>678,282=>683,283=>678,284=>821,285=>716,286=>821,287=>716,288=>821,289=>716,290=>821,291=>716,292=>837,293=>712,294=>974,295=>790,296=>372,297=>343,298=>372,299=>343,300=>372,301=>343,302=>372,303=>343,304=>372,305=>343,306=>744,307=>686,308=>372,309=>343,310=>775,311=>665,312=>665,313=>637,314=>343,315=>637,316=>343,317=>637,318=>343,319=>637,320=>343,321=>660,322=>375,323=>837,324=>712,325=>837,326=>712,327=>837,328=>712,329=>983,330=>837,331=>712,332=>850,333=>687,334=>850,335=>687,336=>850,337=>687,338=>1167,339=>1094,340=>770,341=>493,342=>770,343=>493,344=>770,345=>493,346=>720,347=>595,348=>720,349=>595,350=>720,351=>595,352=>720,353=>595,354=>682,355=>478,356=>682,357=>478,358=>682,359=>478,360=>812,361=>712,362=>812,363=>712,364=>812,365=>712,366=>812,367=>712,368=>812,369=>712,370=>812,371=>712,372=>1103,373=>924,374=>724,375=>652,376=>724,377=>725,378=>582,379=>725,380=>582,381=>725,382=>582,383=>435,384=>716,385=>811,386=>762,387=>716,388=>762,389=>716,390=>734,391=>734,392=>593,393=>845,394=>879,395=>762,396=>716,397=>687,398=>683,399=>850,400=>696,401=>683,402=>435,403=>821,404=>793,405=>1045,406=>436,407=>389,408=>775,409=>665,410=>360,411=>592,412=>1042,413=>837,414=>712,415=>850,416=>850,417=>687,418=>1114,419=>962,420=>782,421=>716,422=>770,423=>720,424=>595,425=>683,426=>552,427=>478,428=>707,429=>478,430=>682,431=>812,432=>712,433=>769,434=>813,435=>797,436=>778,437=>725,438=>582,439=>772,440=>772,441=>641,442=>582,443=>696,444=>772,445=>641,446=>573,447=>716,448=>372,449=>659,450=>544,451=>372,452=>1548,453=>1450,454=>1307,455=>977,456=>979,457=>670,458=>1193,459=>1213,460=>1063,461=>774,462=>675,463=>372,464=>343,465=>850,466=>687,467=>812,468=>712,469=>812,470=>712,471=>812,472=>712,473=>812,474=>712,475=>812,476=>712,477=>678,478=>774,479=>675,480=>774,481=>675,482=>1085,483=>1048,484=>821,485=>716,486=>821,487=>716,488=>775,489=>665,490=>850,491=>687,492=>850,493=>687,494=>772,495=>582,496=>343,497=>1548,498=>1450,499=>1307,500=>821,501=>716,502=>1289,503=>787,504=>837,505=>712,506=>774,507=>675,508=>1085,509=>1048,510=>850,511=>687,512=>774,513=>675,514=>774,515=>675,516=>683,517=>678,518=>683,519=>678,520=>372,521=>343,522=>372,523=>343,524=>850,525=>687,526=>850,527=>687,528=>770,529=>493,530=>770,531=>493,532=>812,533=>712,534=>812,535=>712,536=>720,537=>595,538=>682,539=>478,540=>690,541=>607,542=>837,543=>712,544=>837,545=>865,546=>809,547=>659,548=>725,549=>582,550=>774,551=>675,552=>683,553=>678,554=>850,555=>687,556=>850,557=>687,558=>850,559=>687,560=>850,561=>687,562=>724,563=>652,564=>492,565=>867,566=>512,567=>343,568=>1088,569=>1088,570=>774,571=>734,572=>593,573=>637,574=>682,575=>595,576=>582,577=>782,578=>614,579=>762,580=>812,581=>774,582=>683,583=>678,584=>372,585=>343,586=>860,587=>791,588=>770,589=>493,590=>724,591=>652,592=>675,593=>716,594=>716,595=>716,596=>593,597=>593,598=>791,599=>792,600=>678,601=>678,602=>876,603=>557,604=>545,605=>774,606=>731,607=>343,608=>792,609=>716,610=>627,611=>735,612=>635,613=>712,614=>712,615=>712,616=>545,617=>440,618=>545,619=>559,620=>693,621=>343,622=>841,623=>1042,624=>1042,625=>1042,626=>712,627=>793,628=>642,629=>687,630=>909,631=>682,632=>796,633=>538,634=>538,635=>650,636=>493,637=>493,638=>596,639=>596,640=>642,641=>642,642=>595,643=>415,644=>435,645=>605,646=>552,647=>478,648=>478,649=>920,650=>769,651=>670,652=>652,653=>924,654=>652,655=>724,656=>694,657=>684,658=>641,659=>641,660=>573,661=>573,662=>573,663=>573,664=>850,665=>633,666=>731,667=>685,668=>691,669=>343,670=>732,671=>539,672=>792,673=>573,674=>573,675=>1156,676=>1214,677=>1155,678=>974,679=>769,680=>929,681=>1026,682=>792,683=>780,684=>591,685=>415,686=>677,687=>789,688=>456,689=>456,690=>219,691=>315,692=>315,693=>315,694=>411,695=>591,696=>417,697=>302,698=>521,699=>380,700=>380,701=>380,702=>366,703=>366,704=>326,705=>326,706=>500,707=>500,708=>500,709=>500,710=>500,711=>500,712=>306,713=>500,714=>500,715=>500,716=>306,717=>500,718=>500,719=>500,720=>337,721=>337,722=>366,723=>366,724=>500,725=>500,726=>416,727=>328,728=>500,729=>500,730=>500,731=>500,732=>500,733=>500,734=>351,735=>500,736=>412,737=>219,738=>381,739=>413,740=>326,741=>500,742=>500,743=>500,744=>500,745=>500,748=>500,749=>500,750=>644,755=>500,759=>500,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>698,881=>565,882=>1022,883=>836,884=>302,885=>302,886=>837,887=>701,890=>500,891=>593,892=>550,893=>549,894=>400,900=>441,901=>500,902=>797,903=>380,904=>846,905=>1009,906=>563,908=>891,910=>980,911=>894,912=>390,913=>774,914=>762,915=>637,916=>774,917=>683,918=>725,919=>837,920=>850,921=>372,922=>775,923=>774,924=>995,925=>837,926=>632,927=>850,928=>837,929=>733,931=>683,932=>682,933=>724,934=>850,935=>771,936=>850,937=>850,938=>372,939=>724,940=>687,941=>557,942=>712,943=>390,944=>675,945=>687,946=>716,947=>681,948=>687,949=>557,950=>591,951=>712,952=>687,953=>390,954=>710,955=>633,956=>736,957=>681,958=>591,959=>687,960=>791,961=>716,962=>593,963=>779,964=>638,965=>675,966=>782,967=>645,968=>794,969=>869,970=>390,971=>675,972=>687,973=>675,974=>869,975=>775,976=>651,977=>661,978=>746,979=>981,980=>746,981=>796,982=>869,983=>744,984=>850,985=>687,986=>734,987=>593,988=>683,989=>494,990=>702,991=>660,992=>919,993=>627,994=>1093,995=>837,996=>832,997=>716,998=>928,999=>744,1000=>733,1001=>650,1002=>789,1003=>671,1004=>752,1005=>716,1006=>682,1007=>590,1008=>744,1009=>716,1010=>593,1011=>343,1012=>850,1013=>645,1014=>645,1015=>742,1016=>716,1017=>734,1018=>995,1019=>732,1020=>716,1021=>734,1022=>734,1023=>698,1024=>683,1025=>683,1026=>878,1027=>637,1028=>734,1029=>720,1030=>372,1031=>372,1032=>372,1033=>1154,1034=>1130,1035=>878,1036=>817,1037=>837,1038=>771,1039=>837,1040=>774,1041=>762,1042=>762,1043=>637,1044=>891,1045=>683,1046=>1224,1047=>710,1048=>837,1049=>837,1050=>817,1051=>831,1052=>995,1053=>837,1054=>850,1055=>837,1056=>733,1057=>734,1058=>682,1059=>771,1060=>992,1061=>771,1062=>928,1063=>808,1064=>1235,1065=>1326,1066=>939,1067=>1036,1068=>762,1069=>734,1070=>1174,1071=>770,1072=>675,1073=>698,1074=>633,1075=>522,1076=>808,1077=>678,1078=>995,1079=>581,1080=>701,1081=>701,1082=>679,1083=>732,1084=>817,1085=>691,1086=>687,1087=>691,1088=>716,1089=>593,1090=>580,1091=>652,1092=>992,1093=>645,1094=>741,1095=>687,1096=>1062,1097=>1105,1098=>751,1099=>904,1100=>632,1101=>593,1102=>972,1103=>642,1104=>678,1105=>678,1106=>714,1107=>522,1108=>593,1109=>595,1110=>343,1111=>343,1112=>343,1113=>991,1114=>956,1115=>734,1116=>679,1117=>701,1118=>652,1119=>691,1120=>1093,1121=>869,1122=>840,1123=>736,1124=>1012,1125=>839,1126=>992,1127=>832,1128=>1358,1129=>1121,1130=>850,1131=>687,1132=>1236,1133=>1007,1134=>696,1135=>557,1136=>1075,1137=>1061,1138=>850,1139=>687,1140=>850,1141=>695,1142=>850,1143=>695,1144=>1148,1145=>1043,1146=>1074,1147=>863,1148=>1405,1149=>1173,1150=>1093,1151=>869,1152=>734,1153=>593,1154=>652,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>418,1161=>418,1162=>938,1163=>806,1164=>762,1165=>611,1166=>736,1167=>718,1168=>637,1169=>522,1170=>666,1171=>543,1172=>789,1173=>522,1174=>1224,1175=>995,1176=>710,1177=>581,1178=>775,1179=>679,1180=>817,1181=>679,1182=>817,1183=>679,1184=>1015,1185=>826,1186=>837,1187=>691,1188=>1103,1189=>871,1190=>1254,1191=>979,1192=>946,1193=>859,1194=>734,1195=>593,1196=>682,1197=>580,1198=>724,1199=>652,1200=>724,1201=>652,1202=>771,1203=>645,1204=>1104,1205=>1001,1206=>808,1207=>687,1208=>808,1209=>687,1210=>808,1211=>712,1212=>1026,1213=>810,1214=>1026,1215=>810,1216=>372,1217=>1224,1218=>995,1219=>778,1220=>629,1221=>933,1222=>804,1223=>837,1224=>691,1225=>938,1226=>806,1227=>808,1228=>687,1229=>1096,1230=>932,1231=>343,1232=>774,1233=>675,1234=>774,1235=>675,1236=>1085,1237=>1048,1238=>683,1239=>678,1240=>850,1241=>678,1242=>850,1243=>678,1244=>1224,1245=>995,1246=>710,1247=>581,1248=>772,1249=>641,1250=>837,1251=>701,1252=>837,1253=>701,1254=>850,1255=>687,1256=>850,1257=>687,1258=>850,1259=>687,1260=>734,1261=>593,1262=>771,1263=>652,1264=>771,1265=>652,1266=>771,1267=>652,1268=>808,1269=>687,1270=>637,1271=>522,1272=>1036,1273=>904,1274=>666,1275=>543,1276=>771,1277=>645,1278=>771,1279=>645,1280=>762,1281=>608,1282=>1159,1283=>893,1284=>1119,1285=>920,1286=>828,1287=>693,1288=>1242,1289=>1017,1290=>1289,1291=>1013,1292=>839,1293=>638,1294=>938,1295=>803,1296=>696,1297=>557,1298=>831,1299=>732,1300=>1286,1301=>1070,1302=>1065,1303=>982,1304=>1082,1305=>960,1306=>850,1307=>716,1308=>1103,1309=>924,1310=>817,1311=>679,1312=>1248,1313=>1022,1314=>1254,1315=>979,1316=>957,1317=>807,1329=>904,1330=>810,1331=>809,1332=>813,1333=>810,1334=>815,1335=>724,1336=>800,1337=>1004,1338=>809,1339=>740,1340=>620,1341=>1068,1342=>875,1343=>792,1344=>723,1345=>811,1346=>794,1347=>782,1348=>867,1349=>766,1350=>794,1351=>787,1352=>812,1353=>752,1354=>963,1355=>790,1356=>867,1357=>812,1358=>794,1359=>771,1360=>740,1361=>775,1362=>640,1363=>926,1364=>775,1365=>848,1366=>951,1369=>366,1370=>380,1371=>342,1372=>415,1373=>348,1374=>513,1375=>521,1377=>1043,1378=>713,1379=>782,1380=>786,1381=>713,1382=>715,1383=>628,1384=>713,1385=>840,1386=>782,1387=>714,1388=>344,1389=>1094,1390=>708,1391=>714,1392=>714,1393=>670,1394=>714,1395=>713,1396=>714,1397=>343,1398=>714,1399=>541,1400=>714,1401=>407,1402=>1043,1403=>636,1404=>740,1405=>714,1406=>714,1407=>1038,1408=>714,1409=>714,1410=>532,1411=>1038,1412=>720,1413=>689,1414=>904,1415=>902,1417=>400,1418=>415,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>415,1471=>0,1472=>372,1473=>0,1474=>0,1475=>372,1478=>497,1479=>0,1488=>728,1489=>610,1490=>447,1491=>588,1492=>687,1493=>343,1494=>400,1495=>687,1496=>679,1497=>294,1498=>578,1499=>566,1500=>605,1501=>696,1502=>724,1503=>343,1504=>453,1505=>680,1506=>666,1507=>675,1508=>658,1509=>661,1510=>653,1511=>736,1512=>602,1513=>749,1514=>683,1520=>664,1521=>664,1522=>663,1523=>444,1524=>710,3647=>696,3713=>815,3714=>748,3716=>749,3719=>569,3720=>742,3722=>744,3725=>761,3732=>706,3733=>704,3734=>747,3735=>819,3737=>730,3738=>727,3739=>727,3740=>922,3741=>827,3742=>866,3743=>866,3745=>836,3746=>761,3747=>770,3749=>769,3751=>713,3754=>827,3755=>1031,3757=>724,3758=>784,3759=>934,3760=>688,3761=>0,3762=>610,3763=>610,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0,3769=>0,3771=>0,3772=>0,3773=>670,3776=>516,3777=>860,3778=>516,3779=>650,3780=>632,3782=>759,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>771,3793=>771,3794=>693,3795=>836,3796=>729,3797=>729,3798=>849,3799=>790,3800=>759,3801=>910,3804=>1363,3805=>1363,4256=>918,4257=>744,4258=>739,4259=>837,4260=>649,4261=>773,4262=>857,4263=>889,4264=>530,4265=>633,4266=>857,4267=>900,4268=>643,4269=>903,4270=>814,4271=>752,4272=>869,4273=>643,4274=>643,4275=>886,4276=>886,4277=>733,4278=>653,4279=>643,4280=>646,4281=>643,4282=>790,4283=>902,4284=>633,4285=>619,4286=>643,4287=>778,4288=>892,4289=>601,4290=>742,4291=>616,4292=>633,4293=>742,4304=>553,4305=>552,4306=>596,4307=>815,4308=>562,4309=>563,4310=>553,4311=>827,4312=>553,4313=>543,4314=>1074,4315=>563,4316=>563,4317=>812,4318=>552,4319=>591,4320=>822,4321=>563,4322=>690,4323=>583,4324=>813,4325=>562,4326=>813,4327=>563,4328=>563,4329=>563,4330=>632,4331=>563,4332=>563,4333=>552,4334=>563,4335=>563,4336=>558,4337=>604,4338=>552,4339=>552,4340=>553,4341=>605,4342=>852,4343=>635,4344=>563,4345=>596,4346=>542,4347=>684,4348=>368,5121=>774,5122=>774,5123=>774,5124=>774,5125=>905,5126=>905,5127=>905,5129=>905,5130=>905,5131=>905,5132=>1018,5133=>1009,5134=>1018,5135=>1009,5136=>1018,5137=>1009,5138=>1149,5139=>1140,5140=>1149,5141=>1140,5142=>905,5143=>1149,5144=>1142,5145=>1149,5146=>1142,5147=>905,5149=>310,5150=>529,5151=>425,5152=>425,5153=>395,5154=>395,5155=>395,5156=>395,5157=>564,5158=>470,5159=>310,5160=>395,5161=>395,5162=>395,5163=>1213,5164=>986,5165=>1216,5166=>1297,5167=>774,5168=>774,5169=>774,5170=>774,5171=>886,5172=>886,5173=>886,5175=>886,5176=>886,5177=>886,5178=>1018,5179=>1009,5180=>1018,5181=>1009,5182=>1018,5183=>1009,5184=>1149,5185=>1140,5186=>1149,5187=>1140,5188=>1149,5189=>1142,5190=>1149,5191=>1142,5192=>886,5193=>576,5194=>229,5196=>812,5197=>812,5198=>812,5199=>812,5200=>815,5201=>815,5202=>815,5204=>815,5205=>815,5206=>815,5207=>1056,5208=>1048,5209=>1056,5210=>1048,5211=>1056,5212=>1048,5213=>1060,5214=>1054,5215=>1060,5216=>1054,5217=>1060,5218=>1052,5219=>1060,5220=>1052,5221=>1060,5222=>483,5223=>1005,5224=>1005,5225=>1023,5226=>1017,5227=>743,5228=>743,5229=>743,5230=>743,5231=>743,5232=>743,5233=>743,5234=>743,5235=>743,5236=>1029,5237=>975,5238=>980,5239=>975,5240=>980,5241=>975,5242=>1029,5243=>975,5244=>1029,5245=>975,5246=>980,5247=>975,5248=>980,5249=>975,5250=>980,5251=>501,5252=>501,5253=>938,5254=>938,5255=>938,5256=>938,5257=>743,5258=>743,5259=>743,5260=>743,5261=>743,5262=>743,5263=>743,5264=>743,5265=>743,5266=>1029,5267=>975,5268=>1029,5269=>975,5270=>1029,5271=>975,5272=>1029,5273=>975,5274=>1029,5275=>975,5276=>1029,5277=>975,5278=>1029,5279=>975,5280=>1029,5281=>501,5282=>501,5283=>626,5284=>626,5285=>626,5286=>626,5287=>626,5288=>626,5289=>626,5290=>626,5291=>626,5292=>881,5293=>854,5294=>863,5295=>874,5296=>863,5297=>874,5298=>881,5299=>874,5300=>881,5301=>874,5302=>863,5303=>874,5304=>863,5305=>874,5306=>863,5307=>436,5308=>548,5309=>436,5312=>988,5313=>988,5314=>988,5315=>988,5316=>931,5317=>931,5318=>931,5319=>931,5320=>931,5321=>1238,5322=>1247,5323=>1200,5324=>1228,5325=>1200,5326=>1228,5327=>931,5328=>660,5329=>497,5330=>660,5331=>988,5332=>988,5333=>988,5334=>988,5335=>931,5336=>931,5337=>931,5338=>931,5339=>931,5340=>1231,5341=>1247,5342=>1283,5343=>1228,5344=>1283,5345=>1228,5346=>1228,5347=>1214,5348=>1228,5349=>1214,5350=>1283,5351=>1228,5352=>1283,5353=>1228,5354=>660,5356=>886,5357=>730,5358=>730,5359=>730,5360=>730,5361=>730,5362=>730,5363=>730,5364=>730,5365=>730,5366=>998,5367=>958,5368=>967,5369=>989,5370=>967,5371=>989,5372=>998,5373=>958,5374=>998,5375=>958,5376=>967,5377=>989,5378=>967,5379=>989,5380=>967,5381=>493,5382=>460,5383=>493,5392=>923,5393=>923,5394=>923,5395=>1136,5396=>1136,5397=>1136,5398=>1136,5399=>1209,5400=>1202,5401=>1209,5402=>1202,5403=>1209,5404=>1202,5405=>1431,5406=>1420,5407=>1431,5408=>1420,5409=>1431,5410=>1420,5411=>1431,5412=>1420,5413=>746,5414=>776,5415=>776,5416=>776,5417=>776,5418=>776,5419=>776,5420=>776,5421=>776,5422=>776,5423=>1003,5424=>1003,5425=>1013,5426=>996,5427=>1013,5428=>996,5429=>1003,5430=>1003,5431=>1003,5432=>1003,5433=>1013,5434=>996,5435=>1013,5436=>996,5437=>1013,5438=>495,5440=>395,5441=>510,5442=>1033,5443=>1033,5444=>976,5445=>976,5446=>976,5447=>976,5448=>733,5449=>733,5450=>733,5451=>733,5452=>733,5453=>733,5454=>1003,5455=>959,5456=>495,5458=>886,5459=>774,5460=>774,5461=>774,5462=>774,5463=>928,5464=>928,5465=>928,5466=>928,5467=>1172,5468=>1142,5469=>602,5470=>812,5471=>812,5472=>812,5473=>812,5474=>812,5475=>812,5476=>815,5477=>815,5478=>815,5479=>815,5480=>1060,5481=>1052,5482=>548,5492=>977,5493=>977,5494=>977,5495=>977,5496=>977,5497=>977,5498=>977,5499=>618,5500=>837,5501=>510,5502=>1238,5503=>1238,5504=>1238,5505=>1238,5506=>1238,5507=>1238,5508=>1238,5509=>989,5514=>977,5515=>977,5516=>977,5517=>977,5518=>1591,5519=>1591,5520=>1591,5521=>1295,5522=>1295,5523=>1591,5524=>1591,5525=>848,5526=>1273,5536=>988,5537=>988,5538=>931,5539=>931,5540=>931,5541=>931,5542=>660,5543=>776,5544=>776,5545=>776,5546=>776,5547=>776,5548=>776,5549=>776,5550=>495,5551=>743,5598=>830,5601=>830,5702=>496,5703=>496,5742=>413,5743=>1238,5744=>1591,5745=>2016,5746=>2016,5747=>1720,5748=>1678,5749=>2016,5750=>2016,7424=>652,7425=>833,7426=>1048,7427=>608,7428=>593,7429=>676,7430=>676,7431=>559,7432=>557,7433=>343,7434=>494,7435=>665,7436=>539,7437=>817,7438=>701,7439=>687,7440=>593,7441=>660,7442=>660,7443=>660,7444=>1094,7446=>687,7447=>687,7448=>556,7449=>642,7450=>642,7451=>580,7452=>634,7453=>737,7454=>948,7455=>695,7456=>652,7457=>924,7458=>582,7459=>646,7462=>539,7463=>652,7464=>691,7465=>556,7466=>781,7467=>732,7468=>487,7469=>683,7470=>480,7472=>523,7473=>430,7474=>430,7475=>517,7476=>527,7477=>234,7478=>234,7479=>488,7480=>401,7481=>626,7482=>527,7483=>527,7484=>535,7485=>509,7486=>461,7487=>485,7488=>430,7489=>511,7490=>695,7491=>458,7492=>458,7493=>479,7494=>712,7495=>479,7496=>479,7497=>479,7498=>479,7499=>386,7500=>386,7501=>479,7502=>219,7503=>487,7504=>664,7505=>456,7506=>488,7507=>414,7508=>488,7509=>488,7510=>479,7511=>388,7512=>456,7513=>462,7514=>664,7515=>501,7517=>451,7518=>429,7519=>433,7520=>493,7521=>406,7522=>219,7523=>315,7524=>456,7525=>501,7526=>451,7527=>429,7528=>451,7529=>493,7530=>406,7543=>716,7544=>527,7547=>545,7549=>747,7557=>514,7579=>479,7580=>414,7581=>414,7582=>488,7583=>386,7584=>377,7585=>348,7586=>479,7587=>456,7588=>347,7589=>281,7590=>347,7591=>347,7592=>431,7593=>326,7594=>330,7595=>370,7596=>664,7597=>664,7598=>562,7599=>562,7600=>448,7601=>488,7602=>542,7603=>422,7604=>396,7605=>388,7606=>583,7607=>494,7608=>399,7609=>451,7610=>501,7611=>417,7612=>523,7613=>470,7614=>455,7615=>425,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>774,7681=>675,7682=>762,7683=>716,7684=>762,7685=>716,7686=>762,7687=>716,7688=>734,7689=>593,7690=>830,7691=>716,7692=>830,7693=>716,7694=>830,7695=>716,7696=>830,7697=>716,7698=>830,7699=>716,7700=>683,7701=>678,7702=>683,7703=>678,7704=>683,7705=>678,7706=>683,7707=>678,7708=>683,7709=>678,7710=>683,7711=>435,7712=>821,7713=>716,7714=>837,7715=>712,7716=>837,7717=>712,7718=>837,7719=>712,7720=>837,7721=>712,7722=>837,7723=>712,7724=>372,7725=>343,7726=>372,7727=>343,7728=>775,7729=>665,7730=>775,7731=>665,7732=>775,7733=>665,7734=>637,7735=>343,7736=>637,7737=>343,7738=>637,7739=>343,7740=>637,7741=>343,7742=>995,7743=>1042,7744=>995,7745=>1042,7746=>995,7747=>1042,7748=>837,7749=>712,7750=>837,7751=>712,7752=>837,7753=>712,7754=>837,7755=>712,7756=>850,7757=>687,7758=>850,7759=>687,7760=>850,7761=>687,7762=>850,7763=>687,7764=>733,7765=>716,7766=>733,7767=>716,7768=>770,7769=>493,7770=>770,7771=>493,7772=>770,7773=>493,7774=>770,7775=>493,7776=>720,7777=>595,7778=>720,7779=>595,7780=>720,7781=>595,7782=>720,7783=>595,7784=>720,7785=>595,7786=>682,7787=>478,7788=>682,7789=>478,7790=>682,7791=>478,7792=>682,7793=>478,7794=>812,7795=>712,7796=>812,7797=>712,7798=>812,7799=>712,7800=>812,7801=>712,7802=>812,7803=>712,7804=>774,7805=>652,7806=>774,7807=>652,7808=>1103,7809=>924,7810=>1103,7811=>924,7812=>1103,7813=>924,7814=>1103,7815=>924,7816=>1103,7817=>924,7818=>771,7819=>645,7820=>771,7821=>645,7822=>724,7823=>652,7824=>725,7825=>582,7826=>725,7827=>582,7828=>725,7829=>582,7830=>712,7831=>478,7832=>924,7833=>652,7834=>675,7835=>435,7836=>435,7837=>435,7838=>896,7839=>687,7840=>774,7841=>675,7842=>774,7843=>675,7844=>774,7845=>675,7846=>774,7847=>675,7848=>774,7849=>675,7850=>774,7851=>675,7852=>774,7853=>675,7854=>774,7855=>675,7856=>774,7857=>675,7858=>774,7859=>675,7860=>774,7861=>675,7862=>774,7863=>675,7864=>683,7865=>678,7866=>683,7867=>678,7868=>683,7869=>678,7870=>683,7871=>678,7872=>683,7873=>678,7874=>683,7875=>678,7876=>683,7877=>678,7878=>683,7879=>678,7880=>372,7881=>343,7882=>372,7883=>343,7884=>850,7885=>687,7886=>850,7887=>687,7888=>850,7889=>687,7890=>850,7891=>687,7892=>850,7893=>687,7894=>850,7895=>687,7896=>850,7897=>687,7898=>850,7899=>687,7900=>850,7901=>687,7902=>850,7903=>687,7904=>850,7905=>687,7906=>850,7907=>687,7908=>812,7909=>712,7910=>812,7911=>712,7912=>812,7913=>712,7914=>812,7915=>712,7916=>812,7917=>712,7918=>812,7919=>712,7920=>812,7921=>712,7922=>724,7923=>652,7924=>724,7925=>652,7926=>724,7927=>652,7928=>724,7929=>652,7930=>953,7931=>644,7936=>687,7937=>687,7938=>687,7939=>687,7940=>687,7941=>687,7942=>687,7943=>687,7944=>774,7945=>774,7946=>1041,7947=>1043,7948=>935,7949=>963,7950=>835,7951=>859,7952=>557,7953=>557,7954=>557,7955=>557,7956=>557,7957=>557,7960=>792,7961=>794,7962=>1100,7963=>1096,7964=>1023,7965=>1052,7968=>712,7969=>712,7970=>712,7971=>712,7972=>712,7973=>712,7974=>712,7975=>712,7976=>945,7977=>951,7978=>1250,7979=>1250,7980=>1180,7981=>1206,7982=>1054,7983=>1063,7984=>390,7985=>390,7986=>390,7987=>390,7988=>390,7989=>390,7990=>390,7991=>390,7992=>483,7993=>489,7994=>777,7995=>785,7996=>712,7997=>738,7998=>604,7999=>604,8000=>687,8001=>687,8002=>687,8003=>687,8004=>687,8005=>687,8008=>892,8009=>933,8010=>1221,8011=>1224,8012=>1053,8013=>1082,8016=>675,8017=>675,8018=>675,8019=>675,8020=>675,8021=>675,8022=>675,8023=>675,8025=>930,8027=>1184,8029=>1199,8031=>1049,8032=>869,8033=>869,8034=>869,8035=>869,8036=>869,8037=>869,8038=>869,8039=>869,8040=>909,8041=>958,8042=>1246,8043=>1251,8044=>1076,8045=>1105,8046=>1028,8047=>1076,8048=>687,8049=>687,8050=>557,8051=>557,8052=>712,8053=>712,8054=>390,8055=>390,8056=>687,8057=>687,8058=>675,8059=>675,8060=>869,8061=>869,8064=>687,8065=>687,8066=>687,8067=>687,8068=>687,8069=>687,8070=>687,8071=>687,8072=>774,8073=>774,8074=>1041,8075=>1043,8076=>935,8077=>963,8078=>835,8079=>859,8080=>712,8081=>712,8082=>712,8083=>712,8084=>712,8085=>712,8086=>712,8087=>712,8088=>945,8089=>951,8090=>1250,8091=>1250,8092=>1180,8093=>1206,8094=>1054,8095=>1063,8096=>869,8097=>869,8098=>869,8099=>869,8100=>869,8101=>869,8102=>869,8103=>869,8104=>909,8105=>958,8106=>1246,8107=>1251,8108=>1076,8109=>1105,8110=>1028,8111=>1076,8112=>687,8113=>687,8114=>687,8115=>687,8116=>687,8118=>687,8119=>687,8120=>774,8121=>774,8122=>876,8123=>797,8124=>774,8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>712,8131=>712,8132=>712,8134=>712,8135=>712,8136=>929,8137=>846,8138=>1080,8139=>1009,8140=>837,8141=>500,8142=>500,8143=>500,8144=>390,8145=>390,8146=>390,8147=>390,8150=>390,8151=>390,8152=>372,8153=>372,8154=>621,8155=>563,8157=>500,8158=>500,8159=>500,8160=>675,8161=>675,8162=>675,8163=>675,8164=>716,8165=>716,8166=>675,8167=>675,8168=>724,8169=>724,8170=>1020,8171=>980,8172=>838,8173=>500,8174=>500,8175=>500,8178=>869,8179=>869,8180=>869,8182=>869,8183=>869,8184=>1065,8185=>891,8186=>1084,8187=>894,8188=>850,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>696,8200=>380,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>415,8209=>415,8210=>696,8211=>500,8212=>1000,8213=>1000,8214=>500,8215=>500,8216=>380,8217=>380,8218=>380,8219=>380,8220=>644,8221=>644,8222=>644,8223=>657,8224=>500,8225=>500,8226=>639,8227=>639,8228=>380,8229=>685,8230=>1000,8231=>348,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200,8240=>1454,8241=>1908,8242=>264,8243=>447,8244=>630,8245=>264,8246=>447,8247=>630,8248=>733,8249=>412,8250=>412,8251=>972,8252=>627,8253=>580,8254=>500,8255=>828,8256=>828,8257=>329,8258=>1023,8259=>500,8260=>167,8261=>457,8262=>457,8263=>1030,8264=>829,8265=>829,8266=>513,8267=>687,8268=>500,8269=>500,8270=>523,8271=>400,8272=>828,8273=>523,8274=>556,8275=>838,8276=>828,8277=>838,8278=>684,8279=>813,8280=>838,8281=>838,8282=>380,8283=>872,8284=>838,8285=>380,8286=>380,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>438,8305=>219,8308=>438,8309=>438,8310=>438,8311=>438,8312=>438,8313=>438,8314=>528,8315=>528,8316=>528,8317=>288,8318=>288,8319=>456,8320=>438,8321=>438,8322=>438,8323=>438,8324=>438,8325=>438,8326=>438,8327=>438,8328=>438,8329=>438,8330=>528,8331=>528,8332=>528,8333=>288,8334=>288,8336=>458,8337=>479,8338=>488,8339=>413,8340=>479,8341=>456,8342=>487,8343=>219,8344=>664,8345=>456,8346=>479,8347=>381,8348=>388,8352=>929,8353=>696,8354=>696,8355=>696,8356=>696,8357=>1042,8358=>837,8359=>1488,8360=>1205,8361=>1103,8362=>854,8363=>696,8364=>696,8365=>696,8366=>696,8367=>1392,8368=>696,8369=>696,8370=>696,8371=>696,8372=>859,8373=>696,8376=>696,8377=>696,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>1106,8449=>1106,8450=>734,8451=>1211,8452=>896,8453=>1114,8454=>1148,8455=>696,8456=>698,8457=>952,8459=>1073,8460=>913,8461=>888,8462=>712,8463=>712,8464=>597,8465=>697,8466=>856,8467=>472,8468=>974,8469=>837,8470=>1203,8471=>1000,8472=>697,8473=>750,8474=>850,8475=>938,8476=>814,8477=>801,8478=>896,8479=>710,8480=>1020,8481=>1239,8482=>1000,8483=>834,8484=>754,8485=>622,8486=>850,8487=>769,8488=>763,8489=>303,8490=>775,8491=>774,8492=>928,8493=>818,8494=>854,8495=>636,8496=>729,8497=>808,8498=>683,8499=>1184,8500=>465,8501=>794,8502=>731,8503=>494,8504=>684,8505=>380,8506=>945,8507=>1370,8508=>790,8509=>737,8510=>654,8511=>863,8512=>840,8513=>786,8514=>576,8515=>637,8516=>760,8517=>830,8518=>716,8519=>678,8520=>343,8521=>343,8523=>872,8526=>547,8528=>1035,8529=>1035,8530=>1483,8531=>1035,8532=>1035,8533=>1035,8534=>1035,8535=>1035,8536=>1035,8537=>1035,8538=>1035,8539=>1035,8540=>1035,8541=>1035,8542=>1035,8543=>615,8544=>372,8545=>659,8546=>945,8547=>1099,8548=>774,8549=>1099,8550=>1386,8551=>1672,8552=>1121,8553=>771,8554=>1120,8555=>1407,8556=>637,8557=>734,8558=>830,8559=>995,8560=>343,8561=>607,8562=>872,8563=>984,8564=>652,8565=>962,8566=>1227,8567=>1491,8568=>969,8569=>645,8570=>969,8571=>1233,8572=>343,8573=>593,8574=>716,8575=>1042,8576=>1289,8577=>830,8578=>1289,8579=>734,8580=>593,8581=>734,8585=>1035,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838,8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838,8620=>838,8621=>838,8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838,8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838,8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838,8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838,8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838,8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838,8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838,8700=>838,8701=>838,8702=>838,8703=>838,8704=>774,8705=>696,8706=>544,8707=>683,8708=>683,8709=>856,8710=>697,8711=>697,8712=>896,8713=>896,8714=>750,8715=>896,8716=>896,8717=>750,8718=>636,8719=>787,8720=>787,8721=>718,8722=>838,8723=>838,8724=>696,8725=>365,8726=>696,8727=>838,8728=>626,8729=>380,8730=>667,8731=>667,8732=>667,8733=>712,8734=>833,8735=>838,8736=>896,8737=>896,8738=>838,8739=>500,8740=>500,8741=>500,8742=>500,8743=>812,8744=>812,8745=>812,8746=>812,8747=>610,8748=>929,8749=>1295,8750=>563,8751=>977,8752=>1313,8753=>563,8754=>563,8755=>563,8756=>696,8757=>696,8758=>294,8759=>696,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838,8766=>838,8767=>838,8768=>375,8769=>838,8770=>838,8771=>838,8772=>838,8773=>838,8774=>838,8775=>838,8776=>838,8777=>838,8778=>838,8779=>838,8780=>838,8781=>838,8782=>838,8783=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1063,8789=>1063,8790=>838,8791=>838,8792=>838,8793=>838,8794=>838,8795=>838,8796=>838,8797=>838,8798=>838,8799=>838,8800=>838,8801=>838,8802=>838,8803=>838,8804=>838,8805=>838,8806=>838,8807=>838,8808=>841,8809=>841,8810=>1047,8811=>1047,8812=>500,8813=>838,8814=>838,8815=>838,8816=>838,8817=>838,8818=>838,8819=>838,8820=>838,8821=>838,8822=>838,8823=>838,8824=>838,8825=>838,8826=>838,8827=>838,8828=>838,8829=>838,8830=>838,8831=>838,8832=>838,8833=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8840=>838,8841=>838,8842=>838,8843=>838,8844=>812,8845=>812,8846=>812,8847=>838,8848=>838,8849=>838,8850=>838,8851=>796,8852=>796,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838,8865=>838,8866=>914,8867=>914,8868=>914,8869=>914,8870=>542,8871=>542,8872=>914,8873=>914,8874=>914,8875=>914,8876=>914,8877=>914,8878=>914,8879=>914,8880=>838,8881=>838,8882=>838,8883=>838,8884=>838,8885=>838,8886=>1000,8887=>1000,8888=>838,8889=>838,8890=>542,8891=>812,8892=>812,8893=>812,8894=>838,8895=>838,8896=>843,8897=>843,8898=>843,8899=>843,8900=>494,8901=>380,8902=>626,8903=>838,8904=>1000,8905=>1000,8906=>1000,8907=>1000,8908=>1000,8909=>838,8910=>812,8911=>812,8912=>838,8913=>838,8914=>838,8915=>838,8916=>838,8917=>838,8918=>838,8919=>838,8920=>1422,8921=>1422,8922=>838,8923=>838,8924=>838,8925=>838,8926=>838,8927=>838,8928=>838,8929=>838,8930=>838,8931=>838,8932=>838,8933=>838,8934=>838,8935=>838,8936=>838,8937=>838,8938=>838,8939=>838,8940=>838,8941=>838,8942=>1000,8943=>1000,8944=>1000,8945=>1000,8946=>1158,8947=>896,8948=>750,8949=>896,8950=>896,8951=>750,8952=>896,8953=>896,8954=>1158,8955=>896,8956=>750,8957=>896,8958=>750,8959=>896,8960=>602,8961=>602,8962=>716,8963=>838,8964=>838,8965=>838,8966=>838,8967=>488,8968=>457,8969=>457,8970=>457,8971=>457,8972=>809,8973=>809,8974=>809,8975=>809,8976=>838,8977=>539,8984=>928,8985=>838,8988=>469,8989=>469,8990=>469,8991=>469,8992=>610,8993=>610,8996=>1152,8997=>1152,8998=>1414,8999=>1152,9000=>1443,9003=>1414,9004=>873,9075=>390,9076=>716,9077=>869,9082=>687,9085=>863,9095=>1152,9108=>873,9115=>500,9116=>500,9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500,9125=>500,9126=>500,9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>610,9166=>838,9167=>945,9187=>873,9189=>769,9192=>696,9250=>716,9251=>716,9312=>847,9313=>847,9314=>847,9315=>847,9316=>847,9317=>847,9318=>847,9319=>847,9320=>847,9321=>847,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527,9687=>527,9688=>840,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>769,9697=>769,9698=>769,9699=>769,9700=>769,9701=>769,9702=>639,9703=>945,9704=>945,9705=>945,9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732,9727=>769,9728=>896,9729=>1000,9730=>896,9731=>896,9732=>896,9733=>896,9734=>896,9735=>573,9736=>896,9737=>896,9738=>888,9739=>888,9740=>671,9741=>1013,9742=>1246,9743=>1250,9744=>896,9745=>896,9746=>896,9747=>532,9748=>896,9749=>896,9750=>896,9751=>896,9752=>896,9753=>896,9754=>896,9755=>896,9756=>896,9757=>609,9758=>896,9759=>609,9760=>896,9761=>896,9762=>896,9763=>896,9764=>669,9765=>746,9766=>649,9767=>784,9768=>545,9769=>896,9770=>896,9771=>896,9772=>710,9773=>896,9774=>896,9775=>896,9776=>896,9777=>896,9778=>896,9779=>896,9780=>896,9781=>896,9782=>896,9783=>896,9784=>896,9785=>1042,9786=>1042,9787=>1042,9788=>896,9789=>896,9790=>896,9791=>614,9792=>732,9793=>732,9794=>896,9795=>896,9796=>896,9797=>896,9798=>896,9799=>896,9800=>896,9801=>896,9802=>896,9803=>896,9804=>896,9805=>896,9806=>896,9807=>896,9808=>896,9809=>896,9810=>896,9811=>896,9812=>896,9813=>896,9814=>896,9815=>896,9816=>896,9817=>896,9818=>896,9819=>896,9820=>896,9821=>896,9822=>896,9823=>896,9824=>896,9825=>896,9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9832=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472,9838=>357,9839=>484,9840=>748,9841=>766,9842=>896,9843=>896,9844=>896,9845=>896,9846=>896,9847=>896,9848=>896,9849=>896,9850=>896,9851=>896,9852=>896,9853=>896,9854=>896,9855=>896,9856=>869,9857=>869,9858=>869,9859=>869,9860=>869,9861=>869,9862=>896,9863=>896,9864=>896,9865=>896,9866=>896,9867=>896,9868=>896,9869=>896,9870=>896,9871=>896,9872=>896,9873=>896,9874=>896,9875=>896,9876=>896,9877=>541,9878=>896,9879=>896,9880=>896,9881=>896,9882=>896,9883=>896,9884=>896,9888=>896,9889=>702,9890=>1004,9891=>1089,9892=>1175,9893=>903,9894=>838,9895=>838,9896=>838,9897=>838,9898=>838,9899=>838,9900=>838,9901=>838,9902=>838,9903=>838,9904=>844,9905=>838,9906=>732,9907=>732,9908=>732,9909=>732,9910=>850,9911=>732,9912=>732,9920=>838,9921=>838,9922=>838,9923=>838,9954=>732,9985=>838,9986=>838,9987=>838,9988=>838,9990=>838,9991=>838,9992=>838,9993=>838,9996=>838,9997=>838,9998=>838,9999=>838,10000=>838,10001=>838,10002=>838,10003=>838,10004=>838,10005=>838,10006=>838,10007=>838,10008=>838,10009=>838,10010=>838,10011=>838,10012=>838,10013=>838,10014=>838,10015=>838,10016=>838,10017=>838,10018=>838,10019=>838,10020=>838,10021=>838,10022=>838,10023=>838,10025=>838,10026=>838,10027=>838,10028=>838,10029=>838,10030=>838,10031=>838,10032=>838,10033=>838,10034=>838,10035=>838,10036=>838,10037=>838,10038=>838,10039=>838,10040=>838,10041=>838,10042=>838,10043=>838,10044=>838,10045=>838,10046=>838,10047=>838,10048=>838,10049=>838,10050=>838,10051=>838,10052=>838,10053=>838,10054=>838,10055=>838,10056=>838,10057=>838,10058=>838,10059=>838,10061=>896,10063=>896,10064=>896,10065=>896,10066=>896,10070=>896,10072=>838,10073=>838,10074=>838,10075=>322,10076=>322,10077=>538,10078=>538,10081=>838,10082=>838,10083=>838,10084=>838,10085=>838,10086=>838,10087=>838,10088=>838,10089=>838,10090=>838,10091=>838,10092=>838,10093=>838,10094=>838,10095=>838,10096=>838,10097=>838,10098=>838,10099=>838,10100=>838,10101=>838,10102=>847,10103=>847,10104=>847,10105=>847,10106=>847,10107=>847,10108=>847,10109=>847,10110=>847,10111=>847,10112=>838,10113=>838,10114=>838,10115=>838,10116=>838,10117=>838,10118=>838,10119=>838,10120=>838,10121=>838,10122=>838,10123=>838,10124=>838,10125=>838,10126=>838,10127=>838,10128=>838,10129=>838,10130=>838,10131=>838,10132=>838,10136=>838,10137=>838,10138=>838,10139=>838,10140=>838,10141=>838,10142=>838,10143=>838,10144=>838,10145=>838,10146=>838,10147=>838,10148=>838,10149=>838,10150=>838,10151=>838,10152=>838,10153=>838,10154=>838,10155=>838,10156=>838,10157=>838,10158=>838,10159=>838,10161=>838,10162=>838,10163=>838,10164=>838,10165=>838,10166=>838,10167=>838,10168=>838,10169=>838,10170=>838,10171=>838,10172=>838,10173=>838,10174=>838,10181=>457,10182=>457,10208=>494,10214=>487,10215=>487,10216=>457,10217=>457,10218=>721,10219=>721,10224=>838,10225=>838,10226=>838,10227=>838,10228=>1157,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434,10237=>1434,10238=>1434,10239=>1434,10240=>781,10241=>781,10242=>781,10243=>781,10244=>781,10245=>781,10246=>781,10247=>781,10248=>781,10249=>781,10250=>781,10251=>781,10252=>781,10253=>781,10254=>781,10255=>781,10256=>781,10257=>781,10258=>781,10259=>781,10260=>781,10261=>781,10262=>781,10263=>781,10264=>781,10265=>781,10266=>781,10267=>781,10268=>781,10269=>781,10270=>781,10271=>781,10272=>781,10273=>781,10274=>781,10275=>781,10276=>781,10277=>781,10278=>781,10279=>781,10280=>781,10281=>781,10282=>781,10283=>781,10284=>781,10285=>781,10286=>781,10287=>781,10288=>781,10289=>781,10290=>781,10291=>781,10292=>781,10293=>781,10294=>781,10295=>781,10296=>781,10297=>781,10298=>781,10299=>781,10300=>781,10301=>781,10302=>781,10303=>781,10304=>781,10305=>781,10306=>781,10307=>781,10308=>781,10309=>781,10310=>781,10311=>781,10312=>781,10313=>781,10314=>781,10315=>781,10316=>781,10317=>781,10318=>781,10319=>781,10320=>781,10321=>781,10322=>781,10323=>781,10324=>781,10325=>781,10326=>781,10327=>781,10328=>781,10329=>781,10330=>781,10331=>781,10332=>781,10333=>781,10334=>781,10335=>781,10336=>781,10337=>781,10338=>781,10339=>781,10340=>781,10341=>781,10342=>781,10343=>781,10344=>781,10345=>781,10346=>781,10347=>781,10348=>781,10349=>781,10350=>781,10351=>781,10352=>781,10353=>781,10354=>781,10355=>781,10356=>781,10357=>781,10358=>781,10359=>781,10360=>781,10361=>781,10362=>781,10363=>781,10364=>781,10365=>781,10366=>781,10367=>781,10368=>781,10369=>781,10370=>781,10371=>781,10372=>781,10373=>781,10374=>781,10375=>781,10376=>781,10377=>781,10378=>781,10379=>781,10380=>781,10381=>781,10382=>781,10383=>781,10384=>781,10385=>781,10386=>781,10387=>781,10388=>781,10389=>781,10390=>781,10391=>781,10392=>781,10393=>781,10394=>781,10395=>781,10396=>781,10397=>781,10398=>781,10399=>781,10400=>781,10401=>781,10402=>781,10403=>781,10404=>781,10405=>781,10406=>781,10407=>781,10408=>781,10409=>781,10410=>781,10411=>781,10412=>781,10413=>781,10414=>781,10415=>781,10416=>781,10417=>781,10418=>781,10419=>781,10420=>781,10421=>781,10422=>781,10423=>781,10424=>781,10425=>781,10426=>781,10427=>781,10428=>781,10429=>781,10430=>781,10431=>781,10432=>781,10433=>781,10434=>781,10435=>781,10436=>781,10437=>781,10438=>781,10439=>781,10440=>781,10441=>781,10442=>781,10443=>781,10444=>781,10445=>781,10446=>781,10447=>781,10448=>781,10449=>781,10450=>781,10451=>781,10452=>781,10453=>781,10454=>781,10455=>781,10456=>781,10457=>781,10458=>781,10459=>781,10460=>781,10461=>781,10462=>781,10463=>781,10464=>781,10465=>781,10466=>781,10467=>781,10468=>781,10469=>781,10470=>781,10471=>781,10472=>781,10473=>781,10474=>781,10475=>781,10476=>781,10477=>781,10478=>781,10479=>781,10480=>781,10481=>781,10482=>781,10483=>781,10484=>781,10485=>781,10486=>781,10487=>781,10488=>781,10489=>781,10490=>781,10491=>781,10492=>781,10493=>781,10494=>781,10495=>781,10502=>838,10503=>838,10506=>838,10507=>838,10560=>838,10561=>838,10627=>753,10628=>753,10702=>838,10703=>1046,10704=>1046,10705=>1000,10706=>1000,10707=>1000,10708=>1000,10709=>1000,10731=>494,10746=>838,10747=>838,10752=>1000,10753=>1000,10754=>1000,10764=>1661,10765=>563,10766=>563,10767=>563,10768=>563,10769=>563,10770=>563,10771=>563,10772=>563,10773=>563,10774=>563,10775=>563,10776=>563,10777=>563,10778=>563,10779=>563,10780=>563,10799=>838,10877=>838,10878=>838,10879=>838,10880=>838,10881=>838,10882=>838,10883=>838,10884=>838,10885=>838,10886=>838,10887=>838,10888=>838,10889=>838,10890=>838,10891=>838,10892=>838,10893=>838,10894=>838,10895=>838,10896=>838,10897=>838,10898=>838,10899=>838,10900=>838,10901=>838,10902=>838,10903=>838,10904=>838,10905=>838,10906=>838,10907=>838,10908=>838,10909=>838,10910=>838,10911=>838,10912=>838,10926=>838,10927=>838,10928=>838,10929=>838,10930=>838,10931=>838,10932=>838,10933=>838,10934=>838,10935=>838,10936=>838,10937=>838,10938=>838,11001=>838,11002=>838,11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838,11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838,11026=>945,11027=>945,11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11039=>869,11040=>869,11041=>873,11042=>873,11043=>873,11044=>1119,11091=>869,11092=>869,11360=>637,11361=>360,11362=>637,11363=>733,11364=>770,11365=>675,11366=>478,11367=>956,11368=>712,11369=>775,11370=>665,11371=>725,11372=>582,11373=>860,11374=>995,11375=>774,11376=>860,11377=>778,11378=>1221,11379=>1056,11380=>652,11381=>698,11382=>565,11383=>782,11385=>538,11386=>687,11387=>559,11388=>219,11389=>487,11390=>720,11391=>725,11800=>586,11810=>457,11811=>457,11812=>457,11813=>457,11822=>580,19904=>896,19905=>896,19906=>896,19907=>896,19908=>896,19909=>896,19910=>896,19911=>896,19912=>896,19913=>896,19914=>896,19915=>896,19916=>896,19917=>896,19918=>896,19919=>896,19920=>896,19921=>896,19922=>896,19923=>896,19924=>896,19925=>896,19926=>896,19927=>896,19928=>896,19929=>896,19930=>896,19931=>896,19932=>896,19933=>896,19934=>896,19935=>896,19936=>896,19937=>896,19938=>896,19939=>896,19940=>896,19941=>896,19942=>896,19943=>896,19944=>896,19945=>896,19946=>896,19947=>896,19948=>896,19949=>896,19950=>896,19951=>896,19952=>896,19953=>896,19954=>896,19955=>896,19956=>896,19957=>896,19958=>896,19959=>896,19960=>896,19961=>896,19962=>896,19963=>896,19964=>896,19965=>896,19966=>896,19967=>896,42564=>720,42565=>595,42566=>436,42567=>440,42572=>1405,42573=>1173,42576=>1234,42577=>1027,42580=>1174,42581=>972,42582=>1100,42583=>969,42594=>1100,42595=>940,42596=>1096,42597=>915,42598=>1260,42599=>997,42600=>850,42601=>687,42602=>1037,42603=>868,42604=>1406,42605=>1106,42606=>961,42634=>944,42635=>749,42636=>682,42637=>580,42644=>808,42645=>712,42760=>500,42761=>500,42762=>500,42763=>500,42764=>500,42765=>500,42766=>500,42767=>500,42768=>500,42769=>500,42770=>500,42771=>500,42772=>500,42773=>500,42774=>500,42779=>400,42780=>400,42781=>287,42782=>287,42783=>287,42786=>444,42787=>390,42788=>540,42789=>540,42790=>837,42791=>712,42792=>1031,42793=>857,42794=>696,42795=>557,42800=>559,42801=>595,42802=>1349,42803=>1052,42804=>1285,42805=>1065,42806=>1245,42807=>1052,42808=>1079,42809=>922,42810=>1079,42811=>922,42812=>1035,42813=>922,42814=>698,42815=>549,42822=>850,42823=>542,42824=>683,42825=>531,42826=>918,42827=>814,42830=>1406,42831=>1106,42832=>733,42833=>716,42834=>948,42835=>937,42838=>850,42839=>716,42852=>738,42853=>716,42854=>738,42855=>716,42880=>637,42881=>343,42882=>837,42883=>712,42889=>400,42890=>396,42891=>456,42892=>306,42893=>808,42894=>693,42896=>928,42897=>768,43002=>1062,43003=>683,43004=>733,43005=>995,43006=>372,43007=>1325,61184=>216,61185=>242,61186=>267,61187=>277,61188=>282,61189=>242,61190=>216,61191=>242,61192=>267,61193=>277,61194=>267,61195=>242,61196=>216,61197=>242,61198=>267,61199=>277,61200=>267,61201=>242,61202=>216,61203=>242,61204=>282,61205=>277,61206=>267,61207=>242,61208=>216,61209=>282,62917=>687,64256=>833,64257=>787,64258=>787,64259=>1138,64260=>1139,64261=>808,64262=>1020,64275=>1388,64276=>1384,64277=>1378,64278=>1384,64279=>1713,64285=>294,64286=>0,64287=>663,64288=>665,64289=>939,64290=>788,64291=>920,64292=>786,64293=>857,64294=>869,64295=>821,64296=>890,64297=>838,64298=>749,64299=>749,64300=>749,64301=>749,64302=>728,64303=>728,64304=>728,64305=>610,64306=>447,64307=>588,64308=>687,64309=>343,64310=>400,64311=>1000,64312=>679,64313=>436,64314=>578,64315=>566,64316=>605,64317=>1000,64318=>724,64319=>1000,64320=>453,64321=>680,64322=>1000,64323=>675,64324=>658,64325=>1000,64326=>653,64327=>736,64328=>602,64329=>749,64330=>683,64331=>343,64332=>610,64333=>566,64334=>658,64335=>710,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1113,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansbi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansbi.z
new file mode 100644
index 00000000..694c287b
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansbi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensed.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensed.ctg.z
new file mode 100644
index 00000000..cceabb65
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensed.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensed.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensed.php
new file mode 100644
index 00000000..57890f40
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensed.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSansCondensed';
+$up=-63;
+$ut=44;
+$dw=540;
+$diff='';
+$originalsize=643852;
+$enc='';
+$file='dejavusanscondensed.z';
+$ctg='dejavusanscondensed.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-918 -415 1513 1167]','ItalicAngle'=>0,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>547,'StemV'=>34,'StemH'=>15,'AvgWidth'=>456,'MaxWidth'=>1562,'MissingWidth'=>540);
+$cw=array(0=>540,32=>286,33=>360,34=>414,35=>754,36=>572,37=>855,38=>702,39=>247,40=>351,41=>351,42=>450,43=>754,44=>286,45=>325,46=>286,47=>303,48=>572,49=>572,50=>572,51=>572,52=>572,53=>572,54=>572,55=>572,56=>572,57=>572,58=>303,59=>303,60=>754,61=>754,62=>754,63=>478,64=>900,65=>615,66=>617,67=>628,68=>693,69=>568,70=>518,71=>697,72=>677,73=>265,74=>265,75=>590,76=>501,77=>776,78=>673,79=>708,80=>542,81=>708,82=>625,83=>571,84=>549,85=>659,86=>615,87=>890,88=>616,89=>549,90=>616,91=>351,92=>303,93=>351,94=>754,95=>450,96=>450,97=>551,98=>571,99=>495,100=>571,101=>554,102=>316,103=>571,104=>570,105=>250,106=>250,107=>521,108=>250,109=>876,110=>570,111=>550,112=>571,113=>571,114=>370,115=>469,116=>353,117=>570,118=>532,119=>736,120=>532,121=>532,122=>472,123=>572,124=>303,125=>572,126=>754,160=>286,161=>360,162=>572,163=>572,164=>572,165=>572,166=>303,167=>450,168=>450,169=>900,170=>424,171=>550,172=>754,173=>325,174=>900,175=>450,176=>450,177=>754,178=>360,179=>360,180=>450,181=>572,182=>572,183=>286,184=>450,185=>360,186=>424,187=>550,188=>872,189=>872,190=>872,191=>478,192=>615,193=>615,194=>615,195=>615,196=>615,197=>615,198=>876,199=>628,200=>568,201=>568,202=>568,203=>568,204=>265,205=>265,206=>265,207=>265,208=>697,209=>673,210=>708,211=>708,212=>708,213=>708,214=>708,215=>754,216=>708,217=>659,218=>659,219=>659,220=>659,221=>549,222=>544,223=>567,224=>551,225=>551,226=>551,227=>551,228=>551,229=>551,230=>883,231=>495,232=>554,233=>554,234=>554,235=>554,236=>250,237=>250,238=>250,239=>250,240=>550,241=>570,242=>550,243=>550,244=>550,245=>550,246=>550,247=>754,248=>550,249=>570,250=>570,251=>570,252=>570,253=>532,254=>571,255=>532,256=>615,257=>551,258=>615,259=>551,260=>615,261=>551,262=>628,263=>495,264=>628,265=>495,266=>628,267=>495,268=>628,269=>495,270=>693,271=>571,272=>697,273=>571,274=>568,275=>554,276=>568,277=>554,278=>568,279=>554,280=>568,281=>554,282=>568,283=>554,284=>697,285=>571,286=>697,287=>571,288=>697,289=>571,290=>697,291=>571,292=>677,293=>570,294=>824,295=>625,296=>265,297=>250,298=>265,299=>250,300=>265,301=>250,302=>265,303=>250,304=>265,305=>250,306=>531,307=>500,308=>265,309=>250,310=>590,311=>521,312=>521,313=>501,314=>250,315=>501,316=>250,317=>501,318=>337,319=>501,320=>308,321=>505,322=>255,323=>673,324=>570,325=>673,326=>570,327=>673,328=>570,329=>732,330=>673,331=>570,332=>708,333=>550,334=>708,335=>550,336=>708,337=>550,338=>962,339=>920,340=>625,341=>370,342=>625,343=>370,344=>625,345=>370,346=>571,347=>469,348=>571,349=>469,350=>571,351=>469,352=>571,353=>469,354=>549,355=>353,356=>549,357=>353,358=>549,359=>353,360=>659,361=>570,362=>659,363=>570,364=>659,365=>570,366=>659,367=>570,368=>659,369=>570,370=>659,371=>570,372=>890,373=>736,374=>549,375=>532,376=>549,377=>616,378=>472,379=>616,380=>472,381=>616,382=>472,383=>316,384=>571,385=>661,386=>617,387=>571,388=>617,389=>571,390=>633,391=>628,392=>495,393=>697,394=>737,395=>617,396=>571,397=>550,398=>568,399=>708,400=>553,401=>518,402=>316,403=>697,404=>618,405=>885,406=>318,407=>265,408=>671,409=>521,410=>250,411=>532,412=>876,413=>673,414=>570,415=>708,416=>822,417=>550,418=>854,419=>683,420=>586,421=>571,422=>625,423=>571,424=>469,425=>568,426=>302,427=>353,428=>549,429=>353,430=>549,431=>772,432=>570,433=>688,434=>648,435=>669,436=>657,437=>616,438=>472,439=>599,440=>599,441=>520,442=>472,443=>572,444=>599,445=>520,446=>459,447=>571,448=>265,449=>443,450=>413,451=>266,452=>1279,453=>1169,454=>1039,455=>751,456=>708,457=>411,458=>838,459=>831,460=>717,461=>615,462=>551,463=>265,464=>250,465=>708,466=>550,467=>659,468=>570,469=>659,470=>570,471=>659,472=>570,473=>659,474=>570,475=>659,476=>570,477=>554,478=>615,479=>551,480=>615,481=>551,482=>876,483=>883,484=>697,485=>571,486=>697,487=>571,488=>590,489=>521,490=>708,491=>550,492=>708,493=>550,494=>599,495=>520,496=>250,497=>1279,498=>1169,499=>1039,500=>697,501=>571,502=>1001,503=>614,504=>673,505=>570,506=>615,507=>551,508=>876,509=>883,510=>708,511=>550,512=>615,513=>551,514=>615,515=>551,516=>568,517=>554,518=>568,519=>554,520=>265,521=>250,522=>265,523=>250,524=>708,525=>550,526=>708,527=>550,528=>625,529=>370,530=>625,531=>370,532=>659,533=>570,534=>659,535=>570,536=>571,537=>469,538=>549,539=>353,540=>564,541=>469,542=>677,543=>570,544=>662,545=>754,546=>628,547=>549,548=>616,549=>472,550=>615,551=>551,552=>568,553=>554,554=>708,555=>550,556=>708,557=>550,558=>708,559=>550,560=>708,561=>550,562=>549,563=>532,564=>427,565=>758,566=>429,567=>250,568=>898,569=>898,570=>615,571=>628,572=>495,573=>501,574=>549,575=>469,576=>472,577=>542,578=>431,579=>617,580=>659,581=>615,582=>568,583=>554,584=>265,585=>250,586=>703,587=>571,588=>625,589=>370,590=>549,591=>532,592=>540,593=>571,594=>571,595=>571,596=>494,597=>495,598=>571,599=>626,600=>554,601=>554,602=>737,603=>486,604=>479,605=>698,606=>598,607=>250,608=>626,609=>571,610=>566,611=>536,612=>536,613=>570,614=>570,615=>570,616=>250,617=>304,618=>334,619=>356,620=>438,621=>250,622=>635,623=>876,624=>876,625=>876,626=>581,627=>578,628=>570,629=>550,630=>772,631=>655,632=>593,633=>373,634=>373,635=>372,636=>370,637=>369,638=>477,639=>477,640=>543,641=>543,642=>469,643=>302,644=>302,645=>415,646=>302,647=>353,648=>353,649=>570,650=>556,651=>538,652=>532,653=>736,654=>532,655=>549,656=>472,657=>472,658=>520,659=>520,660=>459,661=>459,662=>459,663=>459,664=>708,665=>521,666=>598,667=>637,668=>588,669=>263,670=>600,671=>456,672=>654,673=>459,674=>459,675=>913,676=>952,677=>911,678=>742,679=>549,680=>700,681=>763,682=>576,683=>589,684=>463,685=>463,686=>595,687=>597,688=>364,689=>359,690=>157,691=>233,692=>266,693=>266,694=>341,695=>463,696=>335,697=>250,698=>414,699=>286,700=>286,701=>286,702=>276,703=>276,704=>333,705=>333,706=>450,707=>450,708=>450,709=>450,710=>450,711=>450,712=>247,713=>450,714=>450,715=>450,716=>247,717=>450,718=>450,719=>450,720=>303,721=>303,722=>276,723=>276,724=>450,725=>450,726=>351,727=>286,728=>450,729=>450,730=>450,731=>450,732=>450,733=>450,734=>284,735=>450,736=>383,737=>149,738=>335,739=>399,740=>333,741=>444,742=>444,743=>444,744=>444,745=>444,748=>450,749=>450,750=>466,755=>450,759=>450,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>589,881=>511,882=>775,883=>583,884=>250,885=>250,886=>673,887=>584,890=>450,891=>494,892=>495,893=>494,894=>303,900=>450,901=>450,902=>623,903=>286,904=>671,905=>784,906=>367,908=>731,910=>742,911=>743,912=>304,913=>615,914=>617,915=>501,916=>615,917=>568,918=>616,919=>677,920=>708,921=>265,922=>590,923=>615,924=>776,925=>673,926=>568,927=>708,928=>677,929=>542,931=>568,932=>549,933=>549,934=>708,935=>616,936=>708,937=>688,938=>265,939=>549,940=>593,941=>486,942=>570,943=>304,944=>521,945=>593,946=>574,947=>532,948=>550,949=>486,950=>489,951=>570,952=>550,953=>304,954=>530,955=>532,956=>572,957=>502,958=>501,959=>550,960=>542,961=>571,962=>528,963=>570,964=>542,965=>521,966=>593,967=>520,968=>593,969=>753,970=>304,971=>521,972=>550,973=>521,974=>753,975=>590,976=>553,977=>557,978=>628,979=>758,980=>628,981=>593,982=>753,983=>597,984=>708,985=>550,986=>583,987=>528,988=>518,989=>413,990=>593,991=>593,992=>778,993=>564,994=>840,995=>753,996=>682,997=>593,998=>712,999=>553,1000=>618,1001=>546,1002=>690,1003=>563,1004=>629,1005=>550,1006=>549,1007=>482,1008=>597,1009=>571,1010=>495,1011=>250,1012=>708,1013=>554,1014=>554,1015=>544,1016=>571,1017=>628,1018=>776,1019=>585,1020=>571,1021=>633,1022=>628,1023=>633,1024=>568,1025=>568,1026=>708,1027=>549,1028=>628,1029=>571,1030=>265,1031=>265,1032=>265,1033=>984,1034=>940,1035=>708,1036=>639,1037=>673,1038=>548,1039=>677,1040=>615,1041=>617,1042=>617,1043=>549,1044=>703,1045=>568,1046=>969,1047=>577,1048=>673,1049=>673,1050=>639,1051=>677,1052=>776,1053=>677,1054=>708,1055=>677,1056=>542,1057=>628,1058=>549,1059=>548,1060=>774,1061=>616,1062=>699,1063=>617,1064=>962,1065=>984,1066=>749,1067=>794,1068=>617,1069=>628,1070=>971,1071=>625,1072=>551,1073=>555,1074=>530,1075=>473,1076=>622,1077=>554,1078=>811,1079=>479,1080=>584,1081=>584,1082=>543,1083=>575,1084=>679,1085=>588,1086=>550,1087=>588,1088=>571,1089=>495,1090=>524,1091=>532,1092=>769,1093=>532,1094=>612,1095=>532,1096=>823,1097=>848,1098=>636,1099=>710,1100=>530,1101=>494,1102=>757,1103=>541,1104=>554,1105=>554,1106=>563,1107=>473,1108=>494,1109=>469,1110=>250,1111=>250,1112=>250,1113=>812,1114=>809,1115=>586,1116=>543,1117=>584,1118=>532,1119=>588,1120=>840,1121=>753,1122=>693,1123=>604,1124=>848,1125=>674,1126=>791,1127=>705,1128=>1043,1129=>901,1130=>708,1131=>550,1132=>924,1133=>742,1134=>572,1135=>486,1136=>771,1137=>789,1138=>708,1139=>550,1140=>703,1141=>598,1142=>703,1143=>598,1144=>893,1145=>813,1146=>857,1147=>682,1148=>1062,1149=>925,1150=>840,1151=>753,1152=>628,1153=>495,1154=>452,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>376,1161=>376,1162=>695,1163=>609,1164=>617,1165=>530,1166=>542,1167=>571,1168=>549,1169=>473,1170=>607,1171=>531,1172=>562,1173=>477,1174=>969,1175=>811,1176=>577,1177=>479,1178=>639,1179=>543,1180=>639,1181=>543,1182=>639,1183=>543,1184=>771,1185=>748,1186=>677,1187=>594,1188=>913,1189=>789,1190=>973,1191=>824,1192=>790,1193=>624,1194=>628,1195=>495,1196=>549,1197=>524,1198=>549,1199=>532,1200=>549,1201=>532,1202=>616,1203=>532,1204=>840,1205=>726,1206=>617,1207=>532,1208=>617,1209=>532,1210=>617,1211=>570,1212=>847,1213=>655,1214=>847,1215=>655,1216=>265,1217=>969,1218=>811,1219=>590,1220=>543,1221=>698,1222=>603,1223=>677,1224=>594,1225=>699,1226=>612,1227=>617,1228=>532,1229=>799,1230=>697,1231=>250,1232=>615,1233=>551,1234=>615,1235=>551,1236=>876,1237=>883,1238=>568,1239=>554,1240=>708,1241=>554,1242=>708,1243=>554,1244=>969,1245=>811,1246=>577,1247=>479,1248=>599,1249=>520,1250=>673,1251=>584,1252=>673,1253=>584,1254=>708,1255=>550,1256=>708,1257=>550,1258=>708,1259=>550,1260=>628,1261=>494,1262=>548,1263=>532,1264=>548,1265=>532,1266=>548,1267=>532,1268=>617,1269=>532,1270=>549,1271=>473,1272=>794,1273=>710,1274=>607,1275=>531,1276=>616,1277=>532,1278=>616,1279=>532,1280=>617,1281=>530,1282=>905,1283=>807,1284=>877,1285=>782,1286=>611,1287=>529,1288=>964,1289=>861,1290=>1001,1291=>870,1292=>697,1293=>593,1294=>695,1295=>640,1296=>553,1297=>486,1298=>677,1299=>575,1300=>1052,1301=>894,1302=>804,1303=>778,1304=>928,1305=>887,1306=>708,1307=>571,1308=>890,1309=>736,1310=>639,1311=>543,1312=>972,1313=>814,1314=>973,1315=>821,1316=>713,1317=>614,1329=>689,1330=>659,1331=>678,1332=>678,1333=>659,1334=>694,1335=>576,1336=>659,1337=>773,1338=>678,1339=>622,1340=>479,1341=>830,1342=>777,1343=>659,1344=>644,1345=>689,1346=>678,1347=>690,1348=>712,1349=>655,1350=>656,1351=>681,1352=>659,1353=>642,1354=>720,1355=>691,1356=>712,1357=>659,1358=>678,1359=>634,1360=>624,1361=>669,1362=>483,1363=>729,1364=>681,1365=>708,1366=>711,1369=>276,1370=>286,1371=>211,1372=>325,1373=>214,1374=>365,1375=>450,1377=>876,1378=>570,1379=>592,1380=>597,1381=>570,1382=>571,1383=>463,1384=>570,1385=>664,1386=>592,1387=>570,1388=>244,1389=>882,1390=>560,1391=>570,1392=>570,1393=>547,1394=>571,1395=>566,1396=>570,1397=>244,1398=>570,1399=>448,1400=>570,1401=>364,1402=>876,1403=>504,1404=>583,1405=>570,1406=>570,1407=>876,1408=>570,1409=>570,1410=>391,1411=>876,1412=>572,1413=>548,1414=>725,1415=>730,1417=>303,1418=>325,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>325,1471=>0,1472=>265,1473=>0,1474=>0,1475=>265,1478=>397,1479=>0,1488=>602,1489=>520,1490=>371,1491=>491,1492=>588,1493=>245,1494=>312,1495=>588,1496=>583,1497=>201,1498=>483,1499=>476,1500=>511,1501=>597,1502=>611,1503=>245,1504=>360,1505=>584,1506=>563,1507=>576,1508=>562,1509=>485,1510=>534,1511=>638,1512=>508,1513=>637,1514=>591,1520=>423,1521=>380,1522=>297,1523=>374,1524=>580,1542=>573,1543=>573,1545=>681,1546=>879,1548=>290,1557=>0,1563=>286,1567=>478,1569=>423,1570=>250,1571=>250,1572=>435,1573=>250,1574=>704,1575=>250,1576=>847,1577=>471,1578=>847,1579=>847,1580=>581,1581=>581,1582=>581,1583=>400,1584=>400,1585=>435,1586=>435,1587=>1099,1588=>1099,1589=>1088,1590=>1088,1591=>832,1592=>832,1593=>537,1594=>537,1600=>264,1601=>933,1602=>698,1603=>742,1604=>654,1605=>557,1606=>661,1607=>471,1608=>435,1609=>704,1610=>704,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1623=>0,1626=>450,1632=>483,1633=>483,1634=>483,1635=>483,1636=>483,1637=>483,1638=>483,1639=>483,1640=>483,1641=>483,1642=>483,1643=>292,1644=>286,1645=>490,1646=>847,1647=>698,1648=>0,1652=>263,1657=>847,1658=>847,1659=>847,1660=>847,1661=>847,1662=>847,1663=>847,1664=>847,1665=>581,1666=>581,1667=>581,1668=>581,1669=>581,1670=>581,1671=>581,1672=>400,1673=>400,1674=>400,1675=>400,1676=>400,1677=>400,1678=>400,1679=>400,1680=>400,1681=>435,1682=>435,1683=>448,1684=>477,1685=>549,1686=>477,1687=>435,1688=>435,1689=>435,1690=>1099,1691=>1099,1692=>1099,1693=>1088,1694=>1088,1695=>832,1696=>537,1697=>933,1698=>933,1699=>933,1700=>933,1701=>933,1702=>933,1703=>698,1704=>698,1705=>805,1706=>948,1707=>805,1708=>742,1709=>742,1710=>742,1711=>805,1712=>805,1713=>805,1714=>805,1715=>805,1716=>805,1717=>654,1718=>654,1719=>654,1720=>654,1721=>661,1722=>661,1723=>661,1724=>661,1725=>661,1726=>628,1727=>581,1734=>435,1740=>704,1742=>704,1749=>471,1776=>483,1777=>483,1778=>483,1779=>483,1780=>483,1781=>483,1782=>483,1783=>483,1784=>483,1785=>483,1984=>572,1985=>572,1986=>572,1987=>572,1988=>572,1989=>572,1990=>572,1991=>572,1992=>572,1993=>572,1994=>250,1995=>514,1996=>381,1997=>532,1998=>588,1999=>588,2000=>534,2001=>588,2002=>746,2003=>394,2004=>394,2005=>502,2006=>550,2007=>315,2008=>863,2009=>425,2010=>705,2011=>588,2012=>563,2013=>660,2014=>477,2015=>651,2016=>425,2017=>563,2018=>534,2019=>477,2020=>477,2021=>470,2022=>534,2023=>534,2027=>0,2028=>0,2029=>0,2030=>0,2031=>0,2032=>0,2033=>0,2034=>0,2035=>0,2036=>282,2037=>282,2040=>504,2041=>504,2042=>325,3647=>572,3713=>603,3714=>615,3716=>619,3719=>434,3720=>565,3722=>615,3725=>619,3732=>602,3733=>577,3734=>580,3735=>589,3737=>593,3738=>563,3739=>563,3740=>670,3741=>690,3742=>618,3743=>618,3745=>631,3746=>619,3747=>615,3749=>584,3751=>569,3754=>633,3755=>737,3757=>569,3758=>615,3759=>708,3760=>569,3761=>0,3762=>485,3763=>485,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0,3769=>0,3771=>0,3772=>0,3773=>597,3776=>337,3777=>591,3778=>414,3779=>492,3780=>442,3782=>606,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>572,3793=>576,3794=>576,3795=>603,3796=>563,3797=>563,3798=>633,3799=>603,3800=>606,3801=>609,3804=>925,3805=>925,4256=>756,4257=>621,4258=>577,4259=>683,4260=>532,4261=>617,4262=>710,4263=>729,4264=>420,4265=>508,4266=>710,4267=>713,4268=>526,4269=>753,4270=>675,4271=>620,4272=>729,4273=>526,4274=>526,4275=>753,4276=>753,4277=>581,4278=>543,4279=>526,4280=>536,4281=>526,4282=>649,4283=>715,4284=>526,4285=>510,4286=>526,4287=>602,4288=>719,4289=>488,4290=>598,4291=>488,4292=>508,4293=>606,4304=>457,4305=>457,4306=>479,4307=>706,4308=>470,4309=>465,4310=>457,4311=>717,4312=>457,4313=>466,4314=>952,4315=>470,4316=>470,4317=>704,4318=>466,4319=>470,4320=>713,4321=>470,4322=>590,4323=>471,4324=>709,4325=>470,4326=>704,4327=>470,4328=>470,4329=>470,4330=>510,4331=>470,4332=>470,4333=>439,4334=>470,4335=>448,4336=>465,4337=>504,4338=>457,4339=>457,4340=>457,4341=>507,4342=>741,4343=>536,4344=>470,4345=>498,4346=>498,4347=>527,4348=>273,5121=>615,5122=>615,5123=>615,5124=>615,5125=>692,5126=>692,5127=>692,5129=>692,5130=>692,5131=>692,5132=>751,5133=>751,5134=>751,5135=>751,5136=>751,5137=>751,5138=>870,5139=>906,5140=>870,5141=>906,5142=>692,5143=>870,5144=>906,5145=>870,5146=>906,5147=>692,5149=>230,5150=>488,5151=>381,5152=>381,5153=>350,5154=>350,5155=>354,5156=>350,5157=>419,5158=>347,5159=>230,5160=>350,5161=>350,5162=>350,5163=>980,5164=>817,5165=>857,5166=>1005,5167=>615,5168=>615,5169=>615,5170=>615,5171=>656,5172=>656,5173=>656,5175=>656,5176=>656,5177=>656,5178=>751,5179=>615,5180=>751,5181=>751,5182=>751,5183=>751,5184=>870,5185=>906,5186=>870,5187=>906,5188=>870,5189=>906,5190=>870,5191=>906,5192=>656,5193=>457,5194=>172,5196=>659,5197=>659,5198=>659,5199=>659,5200=>657,5201=>657,5202=>657,5204=>657,5205=>657,5206=>657,5207=>829,5208=>800,5209=>829,5210=>800,5211=>829,5212=>800,5213=>835,5214=>810,5215=>835,5216=>810,5217=>853,5218=>810,5219=>853,5220=>810,5221=>853,5222=>391,5223=>790,5224=>790,5225=>779,5226=>801,5227=>565,5228=>565,5229=>565,5230=>565,5231=>565,5232=>565,5233=>565,5234=>565,5235=>565,5236=>773,5237=>693,5238=>733,5239=>734,5240=>733,5241=>734,5242=>773,5243=>693,5244=>773,5245=>693,5246=>733,5247=>734,5248=>733,5249=>734,5250=>733,5251=>366,5252=>366,5253=>675,5254=>697,5255=>675,5256=>697,5257=>565,5258=>565,5259=>565,5260=>565,5261=>565,5262=>565,5263=>565,5264=>565,5265=>565,5266=>773,5267=>693,5268=>733,5269=>734,5270=>733,5271=>734,5272=>773,5273=>693,5274=>773,5275=>693,5276=>733,5277=>734,5278=>733,5279=>734,5280=>733,5281=>391,5282=>391,5283=>549,5284=>501,5285=>501,5286=>501,5287=>549,5288=>549,5289=>549,5290=>501,5291=>501,5292=>674,5293=>691,5294=>671,5295=>687,5296=>671,5297=>687,5298=>674,5299=>691,5300=>674,5301=>691,5302=>671,5303=>687,5304=>671,5305=>687,5306=>671,5307=>347,5308=>457,5309=>347,5312=>766,5313=>766,5314=>766,5315=>766,5316=>766,5317=>766,5318=>766,5319=>766,5320=>766,5321=>962,5322=>931,5323=>953,5324=>766,5325=>953,5326=>766,5327=>766,5328=>540,5329=>407,5330=>540,5331=>766,5332=>766,5333=>766,5334=>766,5335=>766,5336=>766,5337=>766,5338=>766,5339=>766,5340=>962,5341=>931,5342=>953,5343=>927,5344=>953,5345=>927,5346=>962,5347=>931,5348=>962,5349=>931,5350=>975,5351=>927,5352=>975,5353=>927,5354=>540,5356=>656,5357=>542,5358=>542,5359=>542,5360=>542,5361=>542,5362=>542,5363=>542,5364=>542,5365=>542,5366=>751,5367=>678,5368=>712,5369=>694,5370=>712,5371=>694,5372=>751,5373=>678,5374=>751,5375=>678,5376=>712,5377=>694,5378=>712,5379=>694,5380=>712,5381=>376,5382=>378,5383=>376,5392=>641,5393=>641,5394=>641,5395=>802,5396=>802,5397=>802,5398=>802,5399=>818,5400=>785,5401=>818,5402=>785,5403=>818,5404=>785,5405=>1026,5406=>989,5407=>1026,5408=>989,5409=>1026,5410=>989,5411=>1026,5412=>989,5413=>576,5414=>564,5415=>564,5416=>564,5417=>564,5418=>564,5419=>564,5420=>564,5421=>564,5422=>564,5423=>760,5424=>703,5425=>734,5426=>736,5427=>734,5428=>736,5429=>760,5430=>703,5431=>760,5432=>703,5433=>734,5434=>736,5435=>734,5436=>736,5437=>734,5438=>376,5440=>350,5441=>436,5442=>824,5443=>824,5444=>824,5445=>824,5446=>824,5447=>824,5448=>542,5449=>542,5450=>542,5451=>542,5452=>542,5453=>542,5454=>751,5455=>678,5456=>376,5458=>656,5459=>615,5460=>615,5461=>615,5462=>615,5463=>653,5464=>653,5465=>653,5466=>653,5467=>831,5468=>906,5469=>457,5470=>659,5471=>659,5472=>659,5473=>659,5474=>659,5475=>659,5476=>657,5477=>657,5478=>657,5479=>657,5480=>853,5481=>810,5482=>457,5492=>747,5493=>747,5494=>747,5495=>747,5496=>747,5497=>747,5498=>747,5499=>507,5500=>677,5501=>436,5502=>942,5503=>942,5504=>942,5505=>942,5506=>942,5507=>942,5508=>942,5509=>743,5514=>747,5515=>747,5516=>747,5517=>747,5518=>1133,5519=>1133,5520=>1133,5521=>901,5522=>901,5523=>1133,5524=>1133,5525=>629,5526=>965,5536=>766,5537=>766,5538=>766,5539=>766,5540=>766,5541=>766,5542=>540,5543=>579,5544=>579,5545=>579,5546=>579,5547=>579,5548=>579,5549=>579,5550=>376,5551=>565,5598=>693,5601=>690,5702=>421,5703=>421,5742=>399,5743=>942,5744=>1178,5745=>1469,5746=>1469,5747=>1237,5748=>1237,5749=>1469,5750=>1469,5760=>429,5761=>443,5762=>641,5763=>838,5764=>1035,5765=>1232,5766=>443,5767=>641,5768=>838,5769=>1035,5770=>1232,5771=>448,5772=>646,5773=>844,5774=>1042,5775=>1241,5776=>443,5777=>641,5778=>836,5779=>1034,5780=>1232,5781=>448,5782=>677,5783=>709,5784=>1084,5785=>1035,5786=>615,5787=>457,5788=>456,7424=>532,7425=>646,7426=>883,7427=>527,7428=>495,7429=>544,7430=>544,7431=>441,7432=>486,7433=>250,7434=>355,7435=>521,7436=>524,7437=>679,7438=>584,7439=>550,7440=>495,7441=>615,7442=>615,7443=>615,7444=>920,7446=>550,7447=>550,7448=>472,7449=>541,7450=>541,7451=>524,7452=>517,7453=>663,7454=>853,7455=>574,7456=>532,7457=>736,7458=>472,7459=>473,7462=>524,7463=>532,7464=>507,7465=>472,7466=>531,7467=>575,7468=>387,7469=>552,7470=>389,7472=>436,7473=>358,7474=>358,7475=>439,7476=>426,7477=>167,7478=>167,7479=>372,7480=>315,7481=>489,7482=>424,7483=>424,7484=>446,7485=>396,7486=>342,7487=>394,7488=>346,7489=>415,7490=>560,7491=>352,7492=>352,7493=>365,7494=>583,7495=>385,7496=>365,7497=>375,7498=>375,7499=>324,7500=>323,7501=>365,7502=>161,7503=>383,7504=>561,7505=>368,7506=>372,7507=>333,7508=>372,7509=>372,7510=>385,7511=>265,7512=>364,7513=>422,7514=>561,7515=>375,7517=>361,7518=>335,7519=>347,7520=>374,7521=>327,7522=>161,7523=>233,7524=>364,7525=>375,7526=>361,7527=>335,7528=>370,7529=>374,7530=>327,7543=>571,7544=>426,7547=>334,7549=>600,7557=>250,7579=>365,7580=>333,7581=>333,7582=>372,7583=>324,7584=>267,7585=>209,7586=>365,7587=>364,7588=>235,7589=>224,7590=>234,7591=>235,7592=>211,7593=>224,7594=>211,7595=>338,7596=>561,7597=>561,7598=>369,7599=>431,7600=>368,7601=>372,7602=>372,7603=>324,7604=>258,7605=>265,7606=>457,7607=>376,7608=>325,7609=>365,7610=>375,7611=>330,7612=>393,7613=>330,7614=>353,7615=>372,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>615,7681=>551,7682=>617,7683=>571,7684=>617,7685=>571,7686=>617,7687=>571,7688=>628,7689=>495,7690=>693,7691=>571,7692=>693,7693=>571,7694=>693,7695=>571,7696=>693,7697=>571,7698=>693,7699=>571,7700=>568,7701=>554,7702=>568,7703=>554,7704=>568,7705=>554,7706=>568,7707=>554,7708=>568,7709=>554,7710=>518,7711=>316,7712=>697,7713=>571,7714=>677,7715=>570,7716=>677,7717=>570,7718=>677,7719=>570,7720=>677,7721=>570,7722=>677,7723=>570,7724=>265,7725=>250,7726=>265,7727=>250,7728=>590,7729=>521,7730=>590,7731=>521,7732=>590,7733=>521,7734=>501,7735=>259,7736=>501,7737=>259,7738=>501,7739=>250,7740=>501,7741=>250,7742=>776,7743=>876,7744=>776,7745=>876,7746=>776,7747=>876,7748=>673,7749=>570,7750=>673,7751=>570,7752=>673,7753=>570,7754=>673,7755=>570,7756=>708,7757=>550,7758=>708,7759=>550,7760=>708,7761=>550,7762=>708,7763=>550,7764=>542,7765=>571,7766=>542,7767=>571,7768=>625,7769=>370,7770=>625,7771=>370,7772=>625,7773=>370,7774=>625,7775=>370,7776=>571,7777=>469,7778=>571,7779=>469,7780=>571,7781=>469,7782=>571,7783=>469,7784=>571,7785=>469,7786=>549,7787=>353,7788=>549,7789=>353,7790=>549,7791=>353,7792=>549,7793=>353,7794=>659,7795=>570,7796=>659,7797=>570,7798=>659,7799=>570,7800=>659,7801=>570,7802=>659,7803=>570,7804=>615,7805=>532,7806=>615,7807=>532,7808=>890,7809=>736,7810=>890,7811=>736,7812=>890,7813=>736,7814=>890,7815=>736,7816=>890,7817=>736,7818=>616,7819=>532,7820=>616,7821=>532,7822=>549,7823=>532,7824=>616,7825=>472,7826=>616,7827=>472,7828=>616,7829=>472,7830=>570,7831=>353,7832=>736,7833=>532,7834=>551,7835=>316,7836=>316,7837=>316,7838=>691,7839=>550,7840=>615,7841=>551,7842=>615,7843=>551,7844=>615,7845=>551,7846=>615,7847=>551,7848=>615,7849=>551,7850=>615,7851=>551,7852=>615,7853=>551,7854=>615,7855=>551,7856=>615,7857=>551,7858=>615,7859=>551,7860=>615,7861=>551,7862=>615,7863=>551,7864=>568,7865=>554,7866=>568,7867=>554,7868=>568,7869=>554,7870=>568,7871=>554,7872=>568,7873=>554,7874=>568,7875=>554,7876=>568,7877=>554,7878=>568,7879=>554,7880=>265,7881=>250,7882=>265,7883=>250,7884=>708,7885=>550,7886=>708,7887=>550,7888=>708,7889=>550,7890=>708,7891=>550,7892=>708,7893=>550,7894=>708,7895=>550,7896=>708,7897=>550,7898=>822,7899=>550,7900=>822,7901=>550,7902=>822,7903=>550,7904=>822,7905=>550,7906=>822,7907=>550,7908=>659,7909=>570,7910=>659,7911=>570,7912=>772,7913=>570,7914=>772,7915=>570,7916=>772,7917=>570,7918=>772,7919=>570,7920=>772,7921=>570,7922=>549,7923=>532,7924=>549,7925=>532,7926=>549,7927=>532,7928=>549,7929=>532,7930=>692,7931=>429,7936=>593,7937=>593,7938=>593,7939=>593,7940=>593,7941=>593,7942=>593,7943=>593,7944=>615,7945=>615,7946=>790,7947=>790,7948=>692,7949=>721,7950=>637,7951=>668,7952=>486,7953=>486,7954=>486,7955=>486,7956=>486,7957=>486,7960=>640,7961=>640,7962=>869,7963=>877,7964=>809,7965=>835,7968=>570,7969=>570,7970=>570,7971=>570,7972=>570,7973=>570,7974=>570,7975=>570,7976=>753,7977=>751,7978=>977,7979=>980,7980=>924,7981=>945,7982=>840,7983=>852,7984=>304,7985=>304,7986=>304,7987=>304,7988=>304,7989=>304,7990=>304,7991=>304,7992=>342,7993=>336,7994=>571,7995=>571,7996=>513,7997=>540,7998=>440,7999=>443,8000=>550,8001=>550,8002=>550,8003=>550,8004=>550,8005=>550,8008=>724,8009=>763,8010=>985,8011=>989,8012=>844,8013=>873,8016=>521,8017=>521,8018=>521,8019=>521,8020=>521,8021=>521,8022=>521,8023=>521,8025=>705,8027=>897,8029=>911,8031=>808,8032=>753,8033=>753,8034=>753,8035=>753,8036=>753,8037=>753,8038=>753,8039=>753,8040=>722,8041=>759,8042=>980,8043=>985,8044=>851,8045=>875,8046=>829,8047=>857,8048=>593,8049=>593,8050=>486,8051=>493,8052=>570,8053=>589,8054=>304,8055=>304,8056=>550,8057=>550,8058=>521,8059=>521,8060=>753,8061=>753,8064=>593,8065=>593,8066=>593,8067=>593,8068=>593,8069=>593,8070=>593,8071=>593,8072=>615,8073=>615,8074=>790,8075=>790,8076=>692,8077=>721,8078=>637,8079=>668,8080=>570,8081=>570,8082=>570,8083=>570,8084=>570,8085=>570,8086=>570,8087=>570,8088=>753,8089=>751,8090=>977,8091=>980,8092=>924,8093=>945,8094=>840,8095=>852,8096=>753,8097=>753,8098=>753,8099=>753,8100=>753,8101=>753,8102=>753,8103=>753,8104=>722,8105=>759,8106=>980,8107=>985,8108=>851,8109=>875,8110=>829,8111=>857,8112=>593,8113=>593,8114=>593,8115=>593,8116=>593,8118=>593,8119=>593,8120=>615,8121=>615,8122=>645,8123=>623,8124=>615,8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>570,8131=>570,8132=>589,8134=>570,8135=>570,8136=>724,8137=>671,8138=>837,8139=>784,8140=>677,8141=>450,8142=>450,8143=>450,8144=>304,8145=>304,8146=>304,8147=>304,8150=>304,8151=>304,8152=>265,8153=>265,8154=>427,8155=>367,8157=>450,8158=>450,8159=>450,8160=>521,8161=>521,8162=>521,8163=>521,8164=>571,8165=>571,8166=>521,8167=>521,8168=>549,8169=>549,8170=>760,8171=>742,8172=>616,8173=>450,8174=>450,8175=>450,8178=>753,8179=>753,8180=>753,8182=>753,8183=>753,8184=>847,8185=>731,8186=>830,8187=>743,8188=>688,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>572,8200=>286,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>325,8209=>325,8210=>572,8211=>450,8212=>900,8213=>900,8214=>450,8215=>450,8216=>286,8217=>286,8218=>286,8219=>286,8220=>466,8221=>466,8222=>466,8223=>466,8224=>450,8225=>450,8226=>531,8227=>531,8228=>301,8229=>601,8230=>900,8231=>286,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180,8240=>1208,8241=>1562,8242=>204,8243=>336,8244=>468,8245=>204,8246=>336,8247=>468,8248=>305,8249=>360,8250=>360,8251=>754,8252=>437,8253=>478,8254=>450,8255=>723,8256=>723,8257=>225,8258=>900,8259=>450,8260=>150,8261=>351,8262=>351,8263=>830,8264=>659,8265=>659,8266=>447,8267=>572,8268=>450,8269=>450,8270=>450,8271=>303,8272=>723,8273=>450,8274=>404,8275=>900,8276=>723,8277=>754,8278=>527,8279=>597,8280=>754,8281=>754,8282=>286,8283=>717,8284=>754,8285=>286,8286=>286,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>360,8305=>161,8308=>360,8309=>360,8310=>360,8311=>360,8312=>360,8313=>360,8314=>475,8315=>475,8316=>475,8317=>221,8318=>221,8319=>358,8320=>360,8321=>360,8322=>360,8323=>360,8324=>360,8325=>360,8326=>360,8327=>360,8328=>360,8329=>360,8330=>475,8331=>475,8332=>475,8333=>221,8334=>221,8336=>352,8337=>375,8338=>372,8339=>399,8340=>375,8341=>364,8342=>383,8343=>149,8344=>561,8345=>358,8346=>385,8347=>335,8348=>265,8352=>789,8353=>572,8354=>572,8355=>572,8356=>572,8357=>876,8358=>673,8359=>1145,8360=>966,8361=>890,8362=>706,8363=>572,8364=>572,8365=>572,8366=>572,8367=>1145,8368=>572,8369=>572,8370=>572,8371=>572,8372=>696,8373=>572,8376=>572,8377=>572,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>917,8449=>917,8450=>628,8451=>1011,8452=>578,8453=>917,8454=>960,8455=>553,8456=>628,8457=>856,8459=>889,8460=>679,8461=>765,8462=>570,8463=>570,8464=>422,8465=>627,8466=>648,8467=>372,8468=>736,8469=>721,8470=>936,8471=>900,8472=>627,8473=>631,8474=>708,8475=>718,8476=>732,8477=>712,8478=>807,8479=>615,8480=>917,8481=>967,8482=>900,8483=>615,8484=>670,8485=>520,8486=>688,8487=>688,8488=>554,8489=>304,8490=>590,8491=>615,8492=>708,8493=>633,8494=>769,8495=>532,8496=>545,8497=>708,8498=>518,8499=>962,8500=>416,8501=>670,8502=>606,8503=>419,8504=>580,8505=>342,8506=>833,8507=>1074,8508=>632,8509=>655,8510=>589,8511=>764,8512=>729,8513=>697,8514=>501,8515=>501,8516=>549,8517=>737,8518=>637,8519=>554,8520=>316,8521=>316,8523=>702,8526=>474,8528=>872,8529=>872,8530=>1233,8531=>872,8532=>872,8533=>872,8534=>872,8535=>872,8536=>872,8537=>872,8538=>872,8539=>872,8540=>872,8541=>872,8542=>872,8543=>511,8544=>265,8545=>443,8546=>620,8547=>831,8548=>615,8549=>830,8550=>1007,8551=>1185,8552=>826,8553=>616,8554=>839,8555=>1018,8556=>501,8557=>628,8558=>693,8559=>776,8560=>250,8561=>412,8562=>573,8563=>730,8564=>532,8565=>729,8566=>892,8567=>1053,8568=>737,8569=>532,8570=>740,8571=>901,8572=>250,8573=>495,8574=>571,8575=>876,8576=>1121,8577=>693,8578=>1121,8579=>633,8580=>494,8581=>628,8585=>872,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754,8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754,8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754,8620=>754,8621=>754,8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754,8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754,8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754,8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754,8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754,8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754,8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754,8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754,8700=>754,8701=>754,8702=>754,8703=>754,8704=>615,8705=>572,8706=>465,8707=>568,8708=>568,8709=>784,8710=>602,8711=>602,8712=>784,8713=>784,8714=>646,8715=>784,8716=>784,8717=>646,8718=>572,8719=>681,8720=>681,8721=>606,8722=>754,8723=>754,8724=>754,8725=>303,8726=>573,8727=>754,8728=>563,8729=>563,8730=>573,8731=>573,8732=>573,8733=>643,8734=>750,8735=>754,8736=>807,8737=>807,8738=>754,8739=>450,8740=>450,8741=>450,8742=>450,8743=>659,8744=>659,8745=>659,8746=>659,8747=>469,8748=>710,8749=>951,8750=>469,8751=>710,8752=>951,8753=>469,8754=>469,8755=>469,8756=>572,8757=>572,8758=>234,8759=>572,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754,8766=>754,8767=>754,8768=>337,8769=>754,8770=>754,8771=>754,8772=>754,8773=>754,8774=>754,8775=>754,8776=>754,8777=>754,8778=>754,8779=>754,8780=>754,8781=>754,8782=>754,8783=>754,8784=>754,8785=>754,8786=>755,8787=>755,8788=>900,8789=>900,8790=>754,8791=>754,8792=>754,8793=>754,8794=>754,8795=>754,8796=>754,8797=>754,8798=>754,8799=>754,8800=>754,8801=>754,8802=>754,8803=>754,8804=>754,8805=>754,8806=>754,8807=>754,8808=>754,8809=>754,8810=>942,8811=>942,8812=>417,8813=>754,8814=>754,8815=>754,8816=>754,8817=>754,8818=>754,8819=>754,8820=>754,8821=>754,8822=>754,8823=>754,8824=>754,8825=>754,8826=>754,8827=>754,8828=>754,8829=>754,8830=>754,8831=>754,8832=>754,8833=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8840=>754,8841=>754,8842=>754,8843=>754,8844=>659,8845=>659,8846=>659,8847=>754,8848=>754,8849=>754,8850=>754,8851=>702,8852=>702,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754,8865=>754,8866=>784,8867=>784,8868=>784,8869=>784,8870=>468,8871=>468,8872=>784,8873=>784,8874=>784,8875=>784,8876=>784,8877=>784,8878=>784,8879=>784,8880=>754,8881=>754,8882=>754,8883=>754,8884=>754,8885=>754,8886=>900,8887=>900,8888=>754,8889=>754,8890=>468,8891=>659,8892=>659,8893=>659,8894=>754,8895=>754,8896=>738,8897=>738,8898=>738,8899=>738,8900=>444,8901=>286,8902=>563,8903=>754,8904=>900,8905=>900,8906=>900,8907=>900,8908=>900,8909=>754,8910=>659,8911=>659,8912=>754,8913=>754,8914=>754,8915=>754,8916=>754,8917=>754,8918=>754,8919=>754,8920=>1280,8921=>1280,8922=>754,8923=>754,8924=>754,8925=>754,8926=>754,8927=>754,8928=>754,8929=>754,8930=>754,8931=>754,8932=>754,8933=>754,8934=>754,8935=>754,8936=>754,8937=>754,8938=>754,8939=>754,8940=>754,8941=>754,8942=>900,8943=>900,8944=>900,8945=>900,8946=>900,8947=>784,8948=>646,8949=>784,8950=>784,8951=>646,8952=>784,8953=>784,8954=>900,8955=>784,8956=>646,8957=>784,8958=>646,8959=>784,8960=>542,8961=>542,8962=>571,8963=>754,8964=>754,8965=>754,8966=>754,8967=>439,8968=>351,8969=>351,8970=>351,8971=>351,8972=>728,8973=>728,8974=>728,8975=>728,8976=>754,8977=>461,8984=>900,8985=>754,8988=>422,8989=>422,8990=>422,8991=>422,8992=>469,8993=>469,8996=>1037,8997=>1037,8998=>1272,8999=>1037,9000=>1299,9003=>1272,9004=>786,9075=>304,9076=>571,9077=>753,9082=>593,9085=>681,9095=>1037,9108=>786,9115=>450,9116=>450,9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450,9125=>450,9126=>450,9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>469,9166=>754,9167=>850,9187=>786,9189=>692,9192=>572,9250=>571,9251=>571,9312=>807,9313=>807,9314=>807,9315=>807,9316=>807,9317=>807,9318=>807,9319=>807,9320=>807,9321=>807,9472=>542,9473=>542,9474=>542,9475=>542,9476=>542,9477=>542,9478=>542,9479=>542,9480=>542,9481=>542,9482=>542,9483=>542,9484=>542,9485=>542,9486=>542,9487=>542,9488=>542,9489=>542,9490=>542,9491=>542,9492=>542,9493=>542,9494=>542,9495=>542,9496=>542,9497=>542,9498=>542,9499=>542,9500=>542,9501=>542,9502=>542,9503=>542,9504=>542,9505=>542,9506=>542,9507=>542,9508=>542,9509=>542,9510=>542,9511=>542,9512=>542,9513=>542,9514=>542,9515=>542,9516=>542,9517=>542,9518=>542,9519=>542,9520=>542,9521=>542,9522=>542,9523=>542,9524=>542,9525=>542,9526=>542,9527=>542,9528=>542,9529=>542,9530=>542,9531=>542,9532=>542,9533=>542,9534=>542,9535=>542,9536=>542,9537=>542,9538=>542,9539=>542,9540=>542,9541=>542,9542=>542,9543=>542,9544=>542,9545=>542,9546=>542,9547=>542,9548=>542,9549=>542,9550=>542,9551=>542,9552=>542,9553=>542,9554=>542,9555=>542,9556=>542,9557=>542,9558=>542,9559=>542,9560=>542,9561=>542,9562=>542,9563=>542,9564=>542,9565=>542,9566=>542,9567=>542,9568=>542,9569=>542,9570=>542,9571=>542,9572=>542,9573=>542,9574=>542,9575=>542,9576=>542,9577=>542,9578=>542,9579=>542,9580=>542,9581=>542,9582=>542,9583=>542,9584=>542,9585=>542,9586=>542,9587=>542,9588=>542,9589=>542,9590=>542,9591=>542,9592=>542,9593=>542,9594=>542,9595=>542,9596=>542,9597=>542,9598=>542,9599=>542,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474,9687=>474,9688=>712,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>785,9697=>785,9698=>692,9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850,9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659,9727=>692,9728=>807,9729=>900,9730=>807,9731=>807,9732=>807,9733=>807,9734=>807,9735=>515,9736=>806,9737=>807,9738=>799,9739=>799,9740=>604,9741=>911,9742=>1121,9743=>1125,9744=>807,9745=>807,9746=>807,9747=>479,9748=>807,9749=>807,9750=>807,9751=>807,9752=>807,9753=>807,9754=>807,9755=>807,9756=>807,9757=>548,9758=>807,9759=>548,9760=>807,9761=>807,9762=>807,9763=>807,9764=>602,9765=>671,9766=>584,9767=>705,9768=>490,9769=>807,9770=>807,9771=>807,9772=>639,9773=>807,9774=>807,9775=>807,9776=>807,9777=>807,9778=>807,9779=>807,9780=>807,9781=>807,9782=>807,9783=>807,9784=>807,9785=>938,9786=>938,9787=>938,9788=>807,9789=>807,9790=>807,9791=>552,9792=>659,9793=>659,9794=>807,9795=>807,9796=>807,9797=>807,9798=>807,9799=>807,9800=>807,9801=>807,9802=>807,9803=>807,9804=>807,9805=>807,9806=>807,9807=>807,9808=>807,9809=>807,9810=>807,9811=>807,9812=>807,9813=>807,9814=>807,9815=>807,9816=>807,9817=>807,9818=>807,9819=>807,9820=>807,9821=>807,9822=>807,9823=>807,9824=>807,9825=>807,9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9832=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424,9838=>321,9839=>435,9840=>673,9841=>689,9842=>807,9843=>807,9844=>807,9845=>807,9846=>807,9847=>807,9848=>807,9849=>807,9850=>807,9851=>807,9852=>807,9853=>807,9854=>807,9855=>807,9856=>782,9857=>782,9858=>782,9859=>782,9860=>782,9861=>782,9862=>807,9863=>807,9864=>807,9865=>807,9866=>807,9867=>807,9868=>807,9869=>807,9870=>807,9871=>807,9872=>807,9873=>807,9874=>807,9875=>807,9876=>807,9877=>487,9878=>807,9879=>807,9880=>807,9881=>807,9882=>807,9883=>807,9884=>807,9888=>807,9889=>632,9890=>904,9891=>980,9892=>1057,9893=>813,9894=>754,9895=>754,9896=>754,9897=>754,9898=>754,9899=>754,9900=>754,9901=>754,9902=>754,9903=>754,9904=>759,9905=>754,9906=>659,9907=>659,9908=>659,9909=>659,9910=>765,9911=>659,9912=>659,9920=>754,9921=>754,9922=>754,9923=>754,9954=>659,9985=>754,9986=>754,9987=>754,9988=>754,9990=>754,9991=>754,9992=>754,9993=>754,9996=>754,9997=>754,9998=>754,9999=>754,10000=>754,10001=>754,10002=>754,10003=>754,10004=>754,10005=>754,10006=>754,10007=>754,10008=>754,10009=>754,10010=>754,10011=>754,10012=>754,10013=>754,10014=>754,10015=>754,10016=>754,10017=>754,10018=>754,10019=>754,10020=>754,10021=>754,10022=>754,10023=>754,10025=>754,10026=>754,10027=>754,10028=>754,10029=>754,10030=>754,10031=>754,10032=>754,10033=>754,10034=>754,10035=>754,10036=>754,10037=>754,10038=>754,10039=>754,10040=>754,10041=>754,10042=>754,10043=>754,10044=>754,10045=>754,10046=>754,10047=>754,10048=>754,10049=>754,10050=>754,10051=>754,10052=>754,10053=>754,10054=>754,10055=>754,10056=>754,10057=>754,10058=>754,10059=>754,10061=>807,10063=>807,10064=>807,10065=>807,10066=>807,10070=>807,10072=>754,10073=>754,10074=>754,10075=>290,10076=>290,10077=>484,10078=>484,10081=>754,10082=>754,10083=>754,10084=>754,10085=>754,10086=>754,10087=>754,10088=>754,10089=>754,10090=>754,10091=>754,10092=>754,10093=>754,10094=>754,10095=>754,10096=>754,10097=>754,10098=>754,10099=>754,10100=>754,10101=>754,10102=>807,10103=>807,10104=>807,10105=>807,10106=>807,10107=>807,10108=>807,10109=>807,10110=>807,10111=>807,10112=>754,10113=>754,10114=>754,10115=>754,10116=>754,10117=>754,10118=>754,10119=>754,10120=>754,10121=>754,10122=>754,10123=>754,10124=>754,10125=>754,10126=>754,10127=>754,10128=>754,10129=>754,10130=>754,10131=>754,10132=>754,10136=>754,10137=>754,10138=>754,10139=>754,10140=>754,10141=>754,10142=>754,10143=>754,10144=>754,10145=>754,10146=>754,10147=>754,10148=>754,10149=>754,10150=>754,10151=>754,10152=>754,10153=>754,10154=>754,10155=>754,10156=>754,10157=>754,10158=>754,10159=>754,10161=>754,10162=>754,10163=>754,10164=>754,10165=>754,10166=>754,10167=>754,10168=>754,10169=>754,10170=>754,10171=>754,10172=>754,10173=>754,10174=>754,10181=>351,10182=>351,10208=>444,10214=>445,10215=>445,10216=>351,10217=>351,10218=>500,10219=>500,10224=>754,10225=>754,10226=>754,10227=>754,10228=>1042,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290,10237=>1290,10238=>1290,10239=>1290,10240=>659,10241=>659,10242=>659,10243=>659,10244=>659,10245=>659,10246=>659,10247=>659,10248=>659,10249=>659,10250=>659,10251=>659,10252=>659,10253=>659,10254=>659,10255=>659,10256=>659,10257=>659,10258=>659,10259=>659,10260=>659,10261=>659,10262=>659,10263=>659,10264=>659,10265=>659,10266=>659,10267=>659,10268=>659,10269=>659,10270=>659,10271=>659,10272=>659,10273=>659,10274=>659,10275=>659,10276=>659,10277=>659,10278=>659,10279=>659,10280=>659,10281=>659,10282=>659,10283=>659,10284=>659,10285=>659,10286=>659,10287=>659,10288=>659,10289=>659,10290=>659,10291=>659,10292=>659,10293=>659,10294=>659,10295=>659,10296=>659,10297=>659,10298=>659,10299=>659,10300=>659,10301=>659,10302=>659,10303=>659,10304=>659,10305=>659,10306=>659,10307=>659,10308=>659,10309=>659,10310=>659,10311=>659,10312=>659,10313=>659,10314=>659,10315=>659,10316=>659,10317=>659,10318=>659,10319=>659,10320=>659,10321=>659,10322=>659,10323=>659,10324=>659,10325=>659,10326=>659,10327=>659,10328=>659,10329=>659,10330=>659,10331=>659,10332=>659,10333=>659,10334=>659,10335=>659,10336=>659,10337=>659,10338=>659,10339=>659,10340=>659,10341=>659,10342=>659,10343=>659,10344=>659,10345=>659,10346=>659,10347=>659,10348=>659,10349=>659,10350=>659,10351=>659,10352=>659,10353=>659,10354=>659,10355=>659,10356=>659,10357=>659,10358=>659,10359=>659,10360=>659,10361=>659,10362=>659,10363=>659,10364=>659,10365=>659,10366=>659,10367=>659,10368=>659,10369=>659,10370=>659,10371=>659,10372=>659,10373=>659,10374=>659,10375=>659,10376=>659,10377=>659,10378=>659,10379=>659,10380=>659,10381=>659,10382=>659,10383=>659,10384=>659,10385=>659,10386=>659,10387=>659,10388=>659,10389=>659,10390=>659,10391=>659,10392=>659,10393=>659,10394=>659,10395=>659,10396=>659,10397=>659,10398=>659,10399=>659,10400=>659,10401=>659,10402=>659,10403=>659,10404=>659,10405=>659,10406=>659,10407=>659,10408=>659,10409=>659,10410=>659,10411=>659,10412=>659,10413=>659,10414=>659,10415=>659,10416=>659,10417=>659,10418=>659,10419=>659,10420=>659,10421=>659,10422=>659,10423=>659,10424=>659,10425=>659,10426=>659,10427=>659,10428=>659,10429=>659,10430=>659,10431=>659,10432=>659,10433=>659,10434=>659,10435=>659,10436=>659,10437=>659,10438=>659,10439=>659,10440=>659,10441=>659,10442=>659,10443=>659,10444=>659,10445=>659,10446=>659,10447=>659,10448=>659,10449=>659,10450=>659,10451=>659,10452=>659,10453=>659,10454=>659,10455=>659,10456=>659,10457=>659,10458=>659,10459=>659,10460=>659,10461=>659,10462=>659,10463=>659,10464=>659,10465=>659,10466=>659,10467=>659,10468=>659,10469=>659,10470=>659,10471=>659,10472=>659,10473=>659,10474=>659,10475=>659,10476=>659,10477=>659,10478=>659,10479=>659,10480=>659,10481=>659,10482=>659,10483=>659,10484=>659,10485=>659,10486=>659,10487=>659,10488=>659,10489=>659,10490=>659,10491=>659,10492=>659,10493=>659,10494=>659,10495=>659,10502=>754,10503=>754,10506=>754,10507=>754,10560=>615,10561=>615,10627=>660,10628=>660,10702=>754,10703=>900,10704=>900,10705=>900,10706=>900,10707=>900,10708=>900,10709=>900,10731=>444,10746=>754,10747=>754,10752=>900,10753=>900,10754=>900,10764=>1192,10765=>469,10766=>469,10767=>469,10768=>469,10769=>469,10770=>469,10771=>469,10772=>469,10773=>469,10774=>469,10775=>469,10776=>469,10777=>469,10778=>469,10779=>469,10780=>469,10799=>754,10877=>754,10878=>754,10879=>754,10880=>754,10881=>754,10882=>754,10883=>754,10884=>754,10885=>754,10886=>754,10887=>754,10888=>754,10889=>754,10890=>754,10891=>754,10892=>754,10893=>754,10894=>754,10895=>754,10896=>754,10897=>754,10898=>754,10899=>754,10900=>754,10901=>754,10902=>754,10903=>754,10904=>754,10905=>754,10906=>754,10907=>754,10908=>754,10909=>754,10910=>754,10911=>754,10912=>754,10926=>754,10927=>754,10928=>754,10929=>754,10930=>754,10931=>754,10932=>754,10933=>754,10934=>754,10935=>754,10936=>754,10937=>754,10938=>754,11001=>754,11002=>754,11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754,11018=>754,11019=>754,11020=>754,11021=>754,11022=>752,11023=>752,11024=>752,11025=>752,11026=>850,11027=>850,11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11039=>782,11040=>782,11041=>786,11042=>786,11043=>786,11044=>1007,11091=>782,11092=>782,11360=>501,11361=>250,11362=>501,11363=>542,11364=>625,11365=>551,11366=>353,11367=>677,11368=>570,11369=>590,11370=>521,11371=>616,11372=>472,11373=>703,11374=>776,11375=>615,11376=>703,11377=>661,11378=>1015,11379=>865,11380=>532,11381=>589,11382=>511,11383=>593,11385=>373,11386=>550,11387=>441,11388=>157,11389=>387,11390=>571,11391=>616,11568=>582,11569=>799,11570=>799,11571=>614,11572=>615,11573=>571,11574=>505,11575=>615,11576=>615,11577=>568,11578=>568,11579=>614,11580=>787,11581=>616,11582=>441,11583=>616,11584=>799,11585=>799,11586=>270,11587=>564,11588=>677,11589=>590,11590=>475,11591=>616,11592=>580,11593=>568,11594=>452,11595=>857,11596=>700,11597=>673,11598=>558,11599=>265,11600=>700,11601=>265,11602=>677,11603=>569,11604=>799,11605=>799,11606=>677,11607=>288,11608=>674,11609=>799,11610=>799,11611=>628,11612=>690,11613=>616,11614=>628,11615=>560,11616=>615,11617=>677,11618=>568,11619=>709,11620=>510,11621=>709,11631=>463,11800=>478,11810=>351,11811=>351,11812=>351,11813=>351,11822=>478,19904=>807,19905=>807,19906=>807,19907=>807,19908=>807,19909=>807,19910=>807,19911=>807,19912=>807,19913=>807,19914=>807,19915=>807,19916=>807,19917=>807,19918=>807,19919=>807,19920=>807,19921=>807,19922=>807,19923=>807,19924=>807,19925=>807,19926=>807,19927=>807,19928=>807,19929=>807,19930=>807,19931=>807,19932=>807,19933=>807,19934=>807,19935=>807,19936=>807,19937=>807,19938=>807,19939=>807,19940=>807,19941=>807,19942=>807,19943=>807,19944=>807,19945=>807,19946=>807,19947=>807,19948=>807,19949=>807,19950=>807,19951=>807,19952=>807,19953=>807,19954=>807,19955=>807,19956=>807,19957=>807,19958=>807,19959=>807,19960=>807,19961=>807,19962=>807,19963=>807,19964=>807,19965=>807,19966=>807,19967=>807,42564=>571,42565=>469,42566=>318,42567=>304,42572=>1062,42573=>925,42576=>926,42577=>815,42580=>971,42581=>757,42582=>879,42583=>758,42594=>956,42595=>820,42596=>959,42597=>811,42598=>1060,42599=>907,42600=>708,42601=>550,42602=>770,42603=>641,42604=>1222,42605=>917,42606=>791,42634=>704,42635=>616,42636=>549,42637=>524,42644=>617,42645=>570,42760=>444,42761=>444,42762=>444,42763=>444,42764=>444,42765=>444,42766=>444,42767=>444,42768=>444,42769=>444,42770=>444,42771=>444,42772=>444,42773=>444,42774=>444,42779=>332,42780=>332,42781=>227,42782=>227,42783=>227,42786=>347,42787=>320,42788=>424,42789=>424,42790=>677,42791=>570,42792=>790,42793=>638,42794=>553,42795=>486,42800=>441,42801=>469,42802=>1125,42803=>886,42804=>1083,42805=>891,42806=>1028,42807=>883,42808=>874,42809=>736,42810=>874,42811=>736,42812=>863,42813=>736,42814=>633,42815=>494,42822=>612,42823=>353,42824=>523,42825=>384,42826=>726,42827=>633,42830=>1222,42831=>917,42832=>542,42833=>571,42834=>660,42835=>697,42838=>708,42839=>571,42852=>544,42853=>571,42854=>544,42855=>571,42880=>501,42881=>250,42882=>662,42883=>570,42889=>303,42890=>338,42891=>360,42892=>247,42893=>617,42894=>438,42896=>695,42897=>600,43002=>823,43003=>518,43004=>542,43005=>776,43006=>265,43007=>1079,61184=>192,61185=>214,61186=>231,61187=>237,61188=>240,61189=>214,61190=>192,61191=>214,61192=>231,61193=>237,61194=>231,61195=>214,61196=>192,61197=>214,61198=>231,61199=>237,61200=>231,61201=>214,61202=>192,61203=>214,61204=>240,61205=>237,61206=>231,61207=>214,61208=>192,61209=>247,61440=>879,61441=>879,61442=>879,61443=>879,63173=>550,64256=>620,64257=>567,64258=>567,64259=>870,64260=>870,64261=>617,64262=>774,64275=>1081,64276=>1081,64277=>1076,64278=>1067,64279=>1376,64285=>201,64286=>0,64287=>297,64288=>572,64289=>770,64290=>696,64291=>815,64292=>694,64293=>759,64294=>769,64295=>726,64296=>788,64297=>754,64298=>637,64299=>637,64300=>637,64301=>637,64302=>602,64303=>602,64304=>602,64305=>520,64306=>371,64307=>491,64308=>588,64309=>320,64310=>365,64312=>583,64313=>297,64314=>483,64315=>476,64316=>511,64318=>611,64320=>359,64321=>584,64323=>576,64324=>562,64326=>534,64327=>638,64328=>508,64329=>637,64330=>591,64331=>245,64332=>520,64333=>476,64334=>562,64335=>566,64338=>847,64339=>883,64340=>250,64341=>271,64342=>847,64343=>883,64344=>250,64345=>271,64346=>847,64347=>883,64348=>250,64349=>271,64350=>847,64351=>883,64352=>250,64353=>271,64354=>847,64355=>883,64356=>250,64357=>271,64358=>847,64359=>883,64360=>250,64361=>271,64362=>933,64363=>932,64364=>430,64365=>455,64366=>933,64367=>932,64368=>430,64369=>455,64370=>581,64371=>581,64372=>556,64373=>581,64374=>581,64375=>581,64376=>556,64377=>581,64378=>581,64379=>581,64380=>556,64381=>581,64382=>581,64383=>581,64384=>556,64385=>581,64386=>400,64387=>472,64388=>400,64389=>472,64390=>400,64391=>472,64392=>400,64393=>472,64394=>435,64395=>497,64396=>435,64397=>497,64398=>805,64399=>805,64400=>428,64401=>497,64402=>805,64403=>805,64404=>428,64405=>497,64406=>805,64407=>805,64408=>428,64409=>497,64410=>805,64411=>805,64412=>428,64413=>497,64414=>661,64415=>685,64416=>661,64417=>685,64418=>250,64419=>271,64426=>628,64427=>568,64428=>475,64429=>415,64467=>742,64468=>758,64469=>428,64470=>497,64473=>435,64474=>465,64488=>250,64489=>271,64508=>704,64509=>750,64510=>250,64511=>271,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65136=>264,65137=>264,65138=>264,65139=>235,65140=>264,65142=>264,65143=>264,65144=>264,65145=>264,65146=>264,65147=>264,65148=>264,65149=>264,65150=>264,65151=>264,65152=>423,65153=>250,65154=>274,65155=>250,65156=>274,65157=>435,65158=>465,65159=>250,65160=>274,65161=>704,65162=>750,65163=>250,65164=>271,65165=>250,65166=>274,65167=>847,65168=>883,65169=>250,65170=>271,65171=>471,65172=>482,65173=>847,65174=>883,65175=>250,65176=>271,65177=>847,65178=>883,65179=>250,65180=>271,65181=>581,65182=>581,65183=>556,65184=>581,65185=>581,65186=>581,65187=>556,65188=>581,65189=>581,65190=>581,65191=>556,65192=>581,65193=>400,65194=>472,65195=>400,65196=>472,65197=>435,65198=>497,65199=>435,65200=>497,65201=>1099,65202=>1147,65203=>754,65204=>803,65205=>1099,65206=>1147,65207=>754,65208=>803,65209=>1088,65210=>1103,65211=>764,65212=>780,65213=>1088,65214=>1103,65215=>764,65216=>780,65217=>832,65218=>854,65219=>716,65220=>738,65221=>832,65222=>854,65223=>716,65224=>738,65225=>537,65226=>479,65227=>537,65228=>434,65229=>537,65230=>479,65231=>470,65232=>434,65233=>933,65234=>932,65235=>430,65236=>455,65237=>698,65238=>750,65239=>430,65240=>455,65241=>742,65242=>758,65243=>428,65244=>497,65245=>654,65246=>681,65247=>274,65248=>298,65249=>557,65250=>599,65251=>482,65252=>520,65253=>661,65254=>685,65255=>250,65256=>271,65257=>471,65258=>482,65259=>475,65260=>415,65261=>435,65262=>465,65263=>704,65264=>750,65265=>704,65266=>750,65267=>250,65268=>271,65269=>513,65270=>537,65271=>513,65272=>537,65273=>513,65274=>537,65275=>513,65276=>537,65279=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>923,65535=>540);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensed.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensed.z
new file mode 100644
index 00000000..fddaa89d
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensed.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedb.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedb.ctg.z
new file mode 100644
index 00000000..0d171320
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedb.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedb.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedb.php
new file mode 100644
index 00000000..11e4a43d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedb.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSansCondensed-Bold';
+$up=-63;
+$ut=44;
+$dw=540;
+$diff='';
+$originalsize=631992;
+$enc='';
+$file='dejavusanscondensedb.z';
+$ctg='dejavusanscondensedb.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-962 -415 1778 1174]','ItalicAngle'=>0,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>547,'StemV'=>60,'StemH'=>26,'AvgWidth'=>515,'MaxWidth'=>1814,'MissingWidth'=>540);
+$cw=array(0=>540,32=>313,33=>410,34=>469,35=>754,36=>626,37=>901,38=>785,39=>275,40=>411,41=>411,42=>470,43=>754,44=>342,45=>374,46=>342,47=>329,48=>626,49=>626,50=>626,51=>626,52=>626,53=>626,54=>626,55=>626,56=>626,57=>626,58=>360,59=>360,60=>754,61=>754,62=>754,63=>522,64=>900,65=>696,66=>686,67=>660,68=>747,69=>615,70=>615,71=>738,72=>753,73=>334,74=>334,75=>697,76=>573,77=>896,78=>753,79=>765,80=>659,81=>765,82=>693,83=>648,84=>614,85=>730,86=>696,87=>993,88=>694,89=>651,90=>652,91=>411,92=>329,93=>411,94=>754,95=>450,96=>450,97=>607,98=>644,99=>533,100=>644,101=>610,102=>391,103=>644,104=>641,105=>308,106=>308,107=>598,108=>308,109=>938,110=>641,111=>618,112=>644,113=>644,114=>444,115=>536,116=>430,117=>641,118=>586,119=>831,120=>580,121=>586,122=>523,123=>641,124=>329,125=>641,126=>754,160=>313,161=>410,162=>626,163=>626,164=>572,165=>626,166=>329,167=>450,168=>450,169=>900,170=>507,171=>581,172=>754,173=>374,174=>900,175=>450,176=>450,177=>754,178=>394,179=>394,180=>450,181=>662,182=>572,183=>342,184=>450,185=>394,186=>507,187=>581,188=>932,189=>932,190=>932,191=>522,192=>696,193=>696,194=>696,195=>696,196=>696,197=>696,198=>976,199=>660,200=>615,201=>615,202=>615,203=>615,204=>334,205=>334,206=>334,207=>334,208=>754,209=>753,210=>765,211=>765,212=>765,213=>765,214=>765,215=>754,216=>765,217=>730,218=>730,219=>730,220=>730,221=>651,222=>664,223=>647,224=>607,225=>607,226=>607,227=>607,228=>607,229=>607,230=>943,231=>533,232=>610,233=>610,234=>610,235=>610,236=>308,237=>308,238=>308,239=>308,240=>618,241=>641,242=>618,243=>618,244=>618,245=>618,246=>618,247=>754,248=>618,249=>641,250=>641,251=>641,252=>641,253=>586,254=>644,255=>586,256=>696,257=>607,258=>696,259=>607,260=>696,261=>607,262=>660,263=>533,264=>660,265=>533,266=>660,267=>533,268=>660,269=>533,270=>747,271=>644,272=>754,273=>644,274=>615,275=>610,276=>615,277=>610,278=>615,279=>610,280=>615,281=>610,282=>615,283=>610,284=>738,285=>644,286=>738,287=>644,288=>738,289=>644,290=>738,291=>644,292=>753,293=>641,294=>876,295=>711,296=>334,297=>308,298=>334,299=>308,300=>334,301=>308,302=>334,303=>308,304=>334,305=>308,306=>669,307=>617,308=>334,309=>308,310=>697,311=>598,312=>598,313=>573,314=>308,315=>573,316=>308,317=>573,318=>431,319=>573,320=>501,321=>578,322=>334,323=>753,324=>641,325=>753,326=>641,327=>753,328=>641,329=>884,330=>753,331=>641,332=>765,333=>618,334=>765,335=>618,336=>765,337=>618,338=>1050,339=>984,340=>693,341=>444,342=>693,343=>444,344=>693,345=>444,346=>648,347=>536,348=>648,349=>536,350=>648,351=>536,352=>648,353=>536,354=>614,355=>430,356=>614,357=>430,358=>614,359=>430,360=>730,361=>641,362=>730,363=>641,364=>730,365=>641,366=>730,367=>641,368=>730,369=>641,370=>730,371=>641,372=>993,373=>831,374=>651,375=>586,376=>651,377=>652,378=>523,379=>652,380=>523,381=>652,382=>523,383=>391,384=>644,385=>729,386=>686,387=>644,388=>686,389=>644,390=>660,391=>660,392=>533,393=>754,394=>791,395=>681,396=>644,397=>619,398=>615,399=>764,400=>626,401=>615,402=>391,403=>738,404=>713,405=>940,406=>392,407=>350,408=>697,409=>598,410=>324,411=>532,412=>938,413=>753,414=>641,415=>765,416=>786,417=>618,418=>974,419=>821,420=>703,421=>644,422=>693,423=>648,424=>536,425=>615,426=>497,427=>430,428=>636,429=>430,430=>614,431=>751,432=>641,433=>765,434=>732,435=>717,436=>700,437=>652,438=>523,439=>695,440=>695,441=>576,442=>523,443=>626,444=>695,445=>576,446=>515,447=>644,448=>334,449=>593,450=>489,451=>334,452=>1399,453=>1271,454=>1168,455=>908,456=>882,457=>617,458=>1088,459=>1062,460=>949,461=>696,462=>607,463=>334,464=>308,465=>765,466=>618,467=>730,468=>641,469=>730,470=>641,471=>730,472=>641,473=>730,474=>641,475=>730,476=>641,477=>610,478=>696,479=>607,480=>696,481=>607,482=>976,483=>943,484=>738,485=>644,486=>738,487=>644,488=>697,489=>598,490=>765,491=>618,492=>765,493=>618,494=>695,495=>523,496=>308,497=>1399,498=>1271,499=>1168,500=>738,501=>644,502=>1160,503=>708,504=>753,505=>641,506=>696,507=>607,508=>976,509=>943,510=>765,511=>618,512=>696,513=>607,514=>696,515=>607,516=>615,517=>610,518=>615,519=>610,520=>334,521=>308,522=>334,523=>308,524=>765,525=>618,526=>765,527=>618,528=>693,529=>444,530=>693,531=>444,532=>730,533=>641,534=>730,535=>641,536=>648,537=>536,538=>614,539=>430,540=>621,541=>546,542=>753,543=>641,544=>753,545=>778,546=>728,547=>593,548=>652,549=>523,550=>696,551=>607,552=>615,553=>610,554=>765,555=>618,556=>765,557=>618,558=>765,559=>618,560=>765,561=>618,562=>651,563=>586,564=>442,565=>780,566=>460,567=>308,568=>979,569=>979,570=>696,571=>660,572=>533,573=>573,574=>614,575=>536,576=>523,577=>703,578=>553,579=>686,580=>730,581=>696,582=>615,583=>610,584=>334,585=>308,586=>774,587=>712,588=>693,589=>444,590=>651,591=>586,592=>607,593=>644,594=>644,595=>644,596=>533,597=>533,598=>645,599=>712,600=>610,601=>610,602=>788,603=>501,604=>490,605=>733,606=>658,607=>308,608=>712,609=>644,610=>564,611=>579,612=>571,613=>641,614=>641,615=>641,616=>491,617=>396,618=>491,619=>502,620=>624,621=>308,622=>757,623=>938,624=>938,625=>938,626=>641,627=>713,628=>636,629=>618,630=>817,631=>613,632=>716,633=>484,634=>484,635=>584,636=>444,637=>444,638=>536,639=>536,640=>578,641=>578,642=>536,643=>374,644=>391,645=>544,646=>497,647=>430,648=>430,649=>828,650=>695,651=>603,652=>586,653=>831,654=>586,655=>651,656=>624,657=>615,658=>576,659=>576,660=>515,661=>515,662=>515,663=>515,664=>765,665=>569,666=>658,667=>616,668=>622,669=>308,670=>659,671=>485,672=>712,673=>515,674=>515,675=>1040,676=>1093,677=>1039,678=>876,679=>691,680=>836,681=>923,682=>712,683=>702,684=>532,685=>374,686=>609,687=>710,688=>410,689=>410,690=>197,691=>284,692=>284,693=>284,694=>369,695=>532,696=>375,697=>271,698=>469,699=>342,700=>342,701=>342,702=>330,703=>330,704=>293,705=>293,706=>450,707=>450,708=>450,709=>450,710=>450,711=>450,712=>275,713=>450,714=>450,715=>450,716=>275,717=>450,718=>450,719=>450,720=>303,721=>303,722=>330,723=>330,724=>450,725=>450,726=>374,727=>295,728=>450,729=>450,730=>450,731=>450,732=>450,733=>450,734=>315,735=>450,736=>370,737=>197,738=>343,739=>371,740=>293,741=>450,742=>450,743=>450,744=>450,745=>450,748=>450,749=>450,750=>591,755=>450,759=>450,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>628,881=>508,882=>919,883=>752,884=>271,885=>271,886=>753,887=>630,890=>450,891=>533,892=>495,893=>494,894=>360,900=>397,901=>450,902=>717,903=>342,904=>761,905=>908,906=>507,908=>801,910=>882,911=>804,912=>351,913=>696,914=>686,915=>573,916=>696,917=>615,918=>652,919=>753,920=>765,921=>334,922=>697,923=>696,924=>896,925=>753,926=>568,927=>765,928=>753,929=>659,931=>615,932=>614,933=>651,934=>765,935=>694,936=>765,937=>765,938=>334,939=>651,940=>618,941=>501,942=>641,943=>351,944=>607,945=>618,946=>644,947=>613,948=>618,949=>501,950=>532,951=>641,952=>618,953=>351,954=>639,955=>569,956=>662,957=>613,958=>532,959=>618,960=>712,961=>644,962=>533,963=>701,964=>574,965=>607,966=>704,967=>580,968=>714,969=>782,970=>351,971=>607,972=>618,973=>607,974=>782,975=>697,976=>585,977=>594,978=>671,979=>883,980=>671,981=>716,982=>782,983=>669,984=>765,985=>618,986=>660,987=>533,988=>615,989=>444,990=>632,991=>593,992=>827,993=>564,994=>983,995=>753,996=>749,997=>644,998=>835,999=>669,1000=>660,1001=>585,1002=>709,1003=>604,1004=>677,1005=>644,1006=>614,1007=>531,1008=>669,1009=>644,1010=>533,1011=>308,1012=>765,1013=>580,1014=>580,1015=>664,1016=>644,1017=>660,1018=>896,1019=>659,1020=>644,1021=>628,1022=>660,1023=>628,1024=>615,1025=>615,1026=>791,1027=>573,1028=>660,1029=>648,1030=>334,1031=>334,1032=>334,1033=>1039,1034=>1017,1035=>791,1036=>735,1037=>753,1038=>694,1039=>753,1040=>696,1041=>686,1042=>686,1043=>573,1044=>801,1045=>615,1046=>1102,1047=>639,1048=>753,1049=>753,1050=>735,1051=>747,1052=>896,1053=>753,1054=>765,1055=>753,1056=>659,1057=>660,1058=>614,1059=>694,1060=>892,1061=>694,1062=>835,1063=>727,1064=>1112,1065=>1193,1066=>845,1067=>932,1068=>686,1069=>660,1070=>1056,1071=>693,1072=>607,1073=>628,1074=>569,1075=>470,1076=>727,1077=>610,1078=>896,1079=>523,1080=>630,1081=>630,1082=>611,1083=>659,1084=>735,1085=>622,1086=>618,1087=>622,1088=>644,1089=>533,1090=>521,1091=>586,1092=>893,1093=>580,1094=>667,1095=>618,1096=>956,1097=>995,1098=>676,1099=>813,1100=>569,1101=>533,1102=>875,1103=>578,1104=>610,1105=>610,1106=>642,1107=>470,1108=>533,1109=>536,1110=>308,1111=>308,1112=>308,1113=>892,1114=>860,1115=>661,1116=>611,1117=>630,1118=>586,1119=>622,1120=>983,1121=>782,1122=>756,1123=>662,1124=>911,1125=>755,1126=>893,1127=>749,1128=>1222,1129=>1009,1130=>765,1131=>618,1132=>1112,1133=>906,1134=>626,1135=>501,1136=>967,1137=>955,1138=>765,1139=>618,1140=>765,1141=>625,1142=>765,1143=>625,1144=>1033,1145=>939,1146=>967,1147=>776,1148=>1265,1149=>1055,1150=>983,1151=>782,1152=>660,1153=>533,1154=>587,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>376,1161=>376,1162=>861,1163=>726,1164=>686,1165=>550,1166=>659,1167=>644,1168=>573,1169=>470,1170=>599,1171=>488,1172=>727,1173=>602,1174=>1102,1175=>896,1176=>639,1177=>523,1178=>697,1179=>611,1180=>735,1181=>611,1182=>735,1183=>611,1184=>914,1185=>743,1186=>860,1187=>727,1188=>992,1189=>787,1190=>1146,1191=>915,1192=>856,1193=>772,1194=>660,1195=>533,1196=>614,1197=>521,1198=>651,1199=>586,1200=>651,1201=>586,1202=>694,1203=>580,1204=>1001,1205=>900,1206=>727,1207=>618,1208=>727,1209=>618,1210=>727,1211=>641,1212=>923,1213=>729,1214=>923,1215=>729,1216=>334,1217=>1102,1218=>896,1219=>697,1220=>567,1221=>855,1222=>725,1223=>753,1224=>622,1225=>861,1226=>726,1227=>727,1228=>618,1229=>1003,1230=>839,1231=>308,1232=>696,1233=>607,1234=>696,1235=>607,1236=>976,1237=>943,1238=>615,1239=>610,1240=>764,1241=>610,1242=>764,1243=>610,1244=>1102,1245=>896,1246=>639,1247=>523,1248=>695,1249=>576,1250=>753,1251=>630,1252=>753,1253=>630,1254=>765,1255=>618,1256=>765,1257=>618,1258=>765,1259=>618,1260=>660,1261=>533,1262=>694,1263=>586,1264=>694,1265=>586,1266=>694,1267=>586,1268=>727,1269=>618,1270=>573,1271=>470,1272=>932,1273=>813,1274=>599,1275=>488,1276=>694,1277=>580,1278=>694,1279=>580,1280=>686,1281=>547,1282=>1043,1283=>804,1284=>1007,1285=>828,1286=>745,1287=>624,1288=>1117,1289=>915,1290=>1160,1291=>912,1292=>755,1293=>574,1294=>844,1295=>722,1296=>626,1297=>501,1298=>747,1299=>659,1300=>1157,1301=>961,1302=>958,1303=>881,1304=>973,1305=>912,1306=>765,1307=>644,1308=>993,1309=>831,1310=>735,1311=>611,1312=>1140,1313=>953,1314=>1146,1315=>915,1316=>861,1317=>726,1329=>732,1330=>656,1331=>655,1332=>658,1333=>656,1334=>660,1335=>586,1336=>648,1337=>813,1338=>655,1339=>599,1340=>501,1341=>865,1342=>708,1343=>642,1344=>585,1345=>657,1346=>643,1347=>633,1348=>702,1349=>620,1350=>643,1351=>637,1352=>658,1353=>609,1354=>780,1355=>640,1356=>702,1357=>658,1358=>643,1359=>624,1360=>599,1361=>628,1362=>519,1363=>750,1364=>628,1365=>686,1366=>770,1369=>296,1370=>308,1371=>277,1372=>336,1373=>282,1374=>415,1375=>421,1377=>844,1378=>577,1379=>633,1380=>637,1381=>577,1382=>579,1383=>508,1384=>577,1385=>680,1386=>633,1387=>578,1388=>278,1389=>886,1390=>574,1391=>578,1392=>578,1393=>542,1394=>578,1395=>577,1396=>578,1397=>277,1398=>578,1399=>438,1400=>578,1401=>330,1402=>844,1403=>515,1404=>599,1405=>578,1406=>578,1407=>840,1408=>578,1409=>579,1410=>431,1411=>840,1412=>583,1413=>558,1414=>732,1415=>730,1417=>324,1418=>336,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>374,1471=>0,1472=>334,1473=>0,1474=>0,1475=>334,1478=>447,1479=>0,1488=>655,1489=>549,1490=>402,1491=>529,1492=>618,1493=>309,1494=>360,1495=>618,1496=>611,1497=>265,1498=>520,1499=>510,1500=>544,1501=>626,1502=>651,1503=>309,1504=>408,1505=>611,1506=>599,1507=>607,1508=>592,1509=>595,1510=>587,1511=>663,1512=>542,1513=>682,1514=>615,1520=>598,1521=>510,1522=>467,1523=>399,1524=>639,1542=>600,1543=>600,1545=>795,1546=>1042,1548=>342,1557=>0,1563=>360,1567=>522,1569=>460,1570=>308,1571=>308,1572=>559,1573=>308,1574=>825,1575=>308,1576=>904,1577=>531,1578=>904,1579=>904,1580=>648,1581=>648,1582=>648,1583=>461,1584=>461,1585=>518,1586=>518,1587=>1242,1588=>1242,1589=>1210,1590=>1210,1591=>935,1592=>935,1593=>615,1594=>615,1600=>308,1601=>1045,1602=>804,1603=>825,1604=>781,1605=>659,1606=>768,1607=>531,1608=>559,1609=>825,1610=>825,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1623=>0,1626=>450,1632=>549,1633=>549,1634=>549,1635=>549,1636=>549,1637=>549,1638=>549,1639=>549,1640=>549,1641=>549,1642=>549,1643=>336,1644=>342,1645=>490,1646=>904,1647=>804,1648=>0,1652=>263,1657=>904,1658=>904,1659=>904,1660=>904,1661=>904,1662=>904,1663=>904,1664=>904,1665=>648,1666=>648,1667=>648,1668=>648,1669=>648,1670=>648,1671=>648,1672=>400,1673=>400,1674=>400,1675=>400,1676=>400,1677=>400,1678=>400,1679=>400,1680=>400,1681=>518,1682=>518,1683=>518,1684=>518,1685=>613,1686=>518,1687=>518,1688=>518,1689=>518,1690=>1242,1691=>1242,1692=>1242,1693=>1210,1694=>1210,1695=>935,1696=>615,1697=>1045,1698=>1045,1699=>1045,1700=>1045,1701=>1045,1702=>1045,1703=>804,1704=>804,1705=>921,1706=>1144,1707=>921,1708=>825,1709=>825,1710=>825,1711=>921,1712=>921,1713=>921,1714=>921,1715=>921,1716=>921,1717=>781,1718=>781,1719=>781,1720=>781,1721=>768,1722=>768,1723=>768,1724=>768,1725=>768,1726=>844,1727=>648,1734=>559,1740=>825,1742=>825,1749=>531,1776=>549,1777=>549,1778=>549,1779=>549,1780=>549,1781=>549,1782=>549,1783=>549,1784=>549,1785=>549,1984=>626,1985=>626,1986=>626,1987=>626,1988=>626,1989=>626,1990=>626,1991=>626,1992=>626,1993=>626,1994=>308,1995=>492,1996=>489,1997=>586,1998=>622,1999=>622,2000=>534,2001=>622,2002=>813,2003=>496,2004=>496,2005=>564,2006=>619,2007=>399,2008=>920,2009=>456,2010=>743,2011=>622,2012=>586,2013=>821,2014=>564,2015=>636,2016=>456,2017=>586,2018=>517,2019=>564,2020=>564,2021=>564,2022=>517,2023=>517,2027=>0,2028=>0,2029=>0,2030=>0,2031=>0,2032=>0,2033=>0,2034=>0,2035=>0,2036=>342,2037=>342,2040=>622,2041=>622,2042=>374,3647=>626,3713=>710,3714=>673,3716=>674,3719=>512,3720=>668,3722=>669,3725=>685,3732=>635,3733=>633,3734=>672,3735=>737,3737=>657,3738=>654,3739=>654,3740=>830,3741=>744,3742=>779,3743=>779,3745=>752,3746=>685,3747=>692,3749=>691,3751=>642,3754=>744,3755=>928,3757=>651,3758=>705,3759=>840,3760=>620,3761=>0,3762=>549,3763=>549,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0,3769=>0,3771=>0,3772=>0,3773=>603,3776=>464,3777=>774,3778=>464,3779=>584,3780=>569,3782=>683,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>694,3793=>694,3794=>624,3795=>752,3796=>655,3797=>655,3798=>764,3799=>710,3800=>683,3801=>818,3804=>1227,3805=>1227,4256=>826,4257=>669,4258=>665,4259=>753,4260=>584,4261=>696,4262=>771,4263=>800,4264=>477,4265=>570,4266=>771,4267=>810,4268=>579,4269=>813,4270=>732,4271=>677,4272=>782,4273=>579,4274=>579,4275=>797,4276=>797,4277=>660,4278=>587,4279=>579,4280=>582,4281=>579,4282=>710,4283=>812,4284=>570,4285=>557,4286=>579,4287=>700,4288=>802,4289=>541,4290=>668,4291=>554,4292=>570,4293=>668,4304=>497,4305=>497,4306=>536,4307=>734,4308=>505,4309=>506,4310=>497,4311=>744,4312=>497,4313=>488,4314=>967,4315=>506,4316=>507,4317=>730,4318=>497,4319=>532,4320=>740,4321=>506,4322=>621,4323=>525,4324=>732,4325=>505,4326=>731,4327=>506,4328=>506,4329=>507,4330=>568,4331=>506,4332=>506,4333=>497,4334=>506,4335=>506,4336=>501,4337=>543,4338=>497,4339=>497,4340=>497,4341=>544,4342=>767,4343=>571,4344=>506,4345=>536,4346=>487,4347=>615,4348=>331,5121=>696,5122=>696,5123=>696,5124=>696,5125=>814,5126=>814,5127=>814,5129=>814,5130=>814,5131=>814,5132=>916,5133=>908,5134=>916,5135=>908,5136=>916,5137=>908,5138=>1034,5139=>1025,5140=>1034,5141=>1025,5142=>814,5143=>1034,5144=>1028,5145=>1034,5146=>1028,5147=>814,5149=>278,5150=>476,5151=>382,5152=>382,5153=>355,5154=>355,5155=>355,5156=>355,5157=>507,5158=>423,5159=>278,5160=>355,5161=>355,5162=>355,5163=>1092,5164=>888,5165=>1094,5166=>1167,5167=>696,5168=>696,5169=>696,5170=>696,5171=>797,5172=>797,5173=>797,5175=>797,5176=>797,5177=>797,5178=>916,5179=>908,5180=>916,5181=>908,5182=>916,5183=>908,5184=>1034,5185=>1025,5186=>1034,5187=>1025,5188=>1034,5189=>1028,5190=>1034,5191=>1028,5192=>797,5193=>518,5194=>206,5196=>730,5197=>730,5198=>730,5199=>730,5200=>734,5201=>734,5202=>734,5204=>734,5205=>734,5206=>734,5207=>950,5208=>943,5209=>950,5210=>943,5211=>950,5212=>943,5213=>954,5214=>949,5215=>954,5216=>949,5217=>954,5218=>946,5219=>954,5220=>946,5221=>954,5222=>435,5223=>904,5224=>904,5225=>921,5226=>915,5227=>668,5228=>668,5229=>668,5230=>668,5231=>668,5232=>668,5233=>668,5234=>668,5235=>668,5236=>926,5237=>877,5238=>882,5239=>877,5240=>882,5241=>877,5242=>926,5243=>877,5244=>926,5245=>877,5246=>882,5247=>877,5248=>882,5249=>877,5250=>882,5251=>451,5252=>451,5253=>844,5254=>844,5255=>844,5256=>844,5257=>668,5258=>668,5259=>668,5260=>668,5261=>668,5262=>668,5263=>668,5264=>668,5265=>668,5266=>926,5267=>877,5268=>926,5269=>877,5270=>926,5271=>877,5272=>926,5273=>877,5274=>926,5275=>877,5276=>926,5277=>877,5278=>926,5279=>877,5280=>926,5281=>451,5282=>451,5283=>563,5284=>563,5285=>563,5286=>563,5287=>563,5288=>563,5289=>563,5290=>563,5291=>563,5292=>793,5293=>769,5294=>777,5295=>786,5296=>777,5297=>786,5298=>793,5299=>786,5300=>793,5301=>786,5302=>777,5303=>786,5304=>777,5305=>786,5306=>777,5307=>392,5308=>493,5309=>392,5312=>889,5313=>889,5314=>889,5315=>889,5316=>838,5317=>838,5318=>838,5319=>838,5320=>838,5321=>1114,5322=>1122,5323=>1080,5324=>1105,5325=>1080,5326=>1105,5327=>838,5328=>593,5329=>447,5330=>593,5331=>889,5332=>889,5333=>889,5334=>889,5335=>838,5336=>838,5337=>838,5338=>838,5339=>838,5340=>1107,5341=>1122,5342=>1155,5343=>1105,5344=>1155,5345=>1105,5346=>1105,5347=>1093,5348=>1105,5349=>1093,5350=>1155,5351=>1105,5352=>1155,5353=>1105,5354=>593,5356=>797,5357=>657,5358=>657,5359=>657,5360=>657,5361=>657,5362=>657,5363=>657,5364=>657,5365=>657,5366=>897,5367=>862,5368=>870,5369=>890,5370=>870,5371=>890,5372=>897,5373=>862,5374=>897,5375=>862,5376=>870,5377=>890,5378=>870,5379=>890,5380=>870,5381=>443,5382=>414,5383=>443,5392=>831,5393=>831,5394=>831,5395=>1022,5396=>1022,5397=>1022,5398=>1022,5399=>1088,5400=>1081,5401=>1088,5402=>1081,5403=>1088,5404=>1081,5405=>1288,5406=>1278,5407=>1288,5408=>1278,5409=>1288,5410=>1278,5411=>1288,5412=>1278,5413=>671,5414=>698,5415=>698,5416=>698,5417=>698,5418=>698,5419=>698,5420=>698,5421=>698,5422=>698,5423=>902,5424=>903,5425=>911,5426=>896,5427=>911,5428=>896,5429=>902,5430=>903,5431=>902,5432=>903,5433=>911,5434=>896,5435=>911,5436=>896,5437=>911,5438=>445,5440=>355,5441=>458,5442=>929,5443=>929,5444=>878,5445=>878,5446=>878,5447=>878,5448=>659,5449=>659,5450=>659,5451=>659,5452=>659,5453=>659,5454=>902,5455=>863,5456=>445,5458=>797,5459=>696,5460=>696,5461=>696,5462=>696,5463=>835,5464=>835,5465=>835,5466=>835,5467=>1055,5468=>1028,5469=>542,5470=>730,5471=>730,5472=>730,5473=>730,5474=>730,5475=>730,5476=>734,5477=>734,5478=>734,5479=>734,5480=>954,5481=>946,5482=>493,5492=>879,5493=>879,5494=>879,5495=>879,5496=>879,5497=>879,5498=>879,5499=>556,5500=>753,5501=>458,5502=>1114,5503=>1114,5504=>1114,5505=>1114,5506=>1114,5507=>1114,5508=>1114,5509=>890,5514=>879,5515=>879,5516=>879,5517=>879,5518=>1432,5519=>1432,5520=>1432,5521=>1165,5522=>1165,5523=>1432,5524=>1432,5525=>763,5526=>1146,5536=>889,5537=>889,5538=>838,5539=>838,5540=>838,5541=>838,5542=>593,5543=>698,5544=>698,5545=>698,5546=>698,5547=>698,5548=>698,5549=>698,5550=>445,5551=>668,5598=>747,5601=>747,5702=>446,5703=>446,5742=>371,5743=>1114,5744=>1432,5745=>1814,5746=>1814,5747=>1548,5748=>1510,5749=>1814,5750=>1814,5760=>489,5761=>573,5762=>851,5763=>1128,5764=>1406,5765=>1684,5766=>564,5767=>842,5768=>1128,5769=>1403,5770=>1684,5771=>512,5772=>789,5773=>1068,5774=>1347,5775=>1626,5776=>573,5777=>851,5778=>1116,5779=>1399,5780=>1684,5781=>512,5782=>512,5783=>709,5784=>1110,5785=>1403,5786=>666,5787=>574,5788=>574,7424=>586,7425=>750,7426=>943,7427=>547,7428=>533,7429=>608,7430=>608,7431=>502,7432=>501,7433=>308,7434=>444,7435=>598,7436=>485,7437=>735,7438=>630,7439=>618,7440=>533,7441=>594,7442=>594,7443=>594,7444=>984,7446=>618,7447=>618,7448=>500,7449=>578,7450=>578,7451=>521,7452=>571,7453=>663,7454=>853,7455=>625,7456=>586,7457=>831,7458=>523,7459=>581,7462=>485,7463=>586,7464=>622,7465=>500,7466=>703,7467=>659,7468=>438,7469=>615,7470=>432,7472=>470,7473=>387,7474=>387,7475=>465,7476=>474,7477=>211,7478=>211,7479=>439,7480=>361,7481=>563,7482=>474,7483=>474,7484=>481,7485=>458,7486=>415,7487=>436,7488=>387,7489=>460,7490=>625,7491=>412,7492=>412,7493=>431,7494=>641,7495=>431,7496=>431,7497=>431,7498=>431,7499=>347,7500=>347,7501=>431,7502=>197,7503=>438,7504=>597,7505=>410,7506=>439,7507=>372,7508=>439,7509=>439,7510=>431,7511=>349,7512=>410,7513=>416,7514=>597,7515=>451,7517=>405,7518=>386,7519=>389,7520=>443,7521=>365,7522=>197,7523=>284,7524=>410,7525=>451,7526=>405,7527=>386,7528=>405,7529=>443,7530=>365,7543=>644,7544=>474,7547=>491,7549=>672,7557=>462,7579=>431,7580=>372,7581=>372,7582=>439,7583=>347,7584=>339,7585=>313,7586=>431,7587=>410,7588=>312,7589=>253,7590=>312,7591=>312,7592=>388,7593=>293,7594=>296,7595=>333,7596=>598,7597=>597,7598=>505,7599=>505,7600=>403,7601=>439,7602=>488,7603=>379,7604=>356,7605=>349,7606=>524,7607=>444,7608=>359,7609=>405,7610=>451,7611=>375,7612=>471,7613=>422,7614=>409,7615=>382,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>696,7681=>607,7682=>686,7683=>644,7684=>686,7685=>644,7686=>686,7687=>644,7688=>660,7689=>533,7690=>747,7691=>644,7692=>747,7693=>644,7694=>747,7695=>644,7696=>747,7697=>644,7698=>747,7699=>644,7700=>615,7701=>610,7702=>615,7703=>610,7704=>615,7705=>610,7706=>615,7707=>610,7708=>615,7709=>610,7710=>615,7711=>391,7712=>738,7713=>644,7714=>753,7715=>641,7716=>753,7717=>641,7718=>753,7719=>641,7720=>753,7721=>641,7722=>753,7723=>641,7724=>334,7725=>308,7726=>334,7727=>308,7728=>697,7729=>598,7730=>697,7731=>598,7732=>697,7733=>598,7734=>573,7735=>308,7736=>573,7737=>308,7738=>573,7739=>308,7740=>573,7741=>308,7742=>896,7743=>938,7744=>896,7745=>938,7746=>896,7747=>938,7748=>753,7749=>641,7750=>753,7751=>641,7752=>753,7753=>641,7754=>753,7755=>641,7756=>765,7757=>618,7758=>765,7759=>618,7760=>765,7761=>618,7762=>765,7763=>618,7764=>659,7765=>644,7766=>659,7767=>644,7768=>693,7769=>444,7770=>693,7771=>444,7772=>693,7773=>444,7774=>693,7775=>444,7776=>648,7777=>536,7778=>648,7779=>536,7780=>648,7781=>536,7782=>648,7783=>536,7784=>648,7785=>536,7786=>614,7787=>430,7788=>614,7789=>430,7790=>614,7791=>430,7792=>614,7793=>430,7794=>730,7795=>641,7796=>730,7797=>641,7798=>730,7799=>641,7800=>730,7801=>641,7802=>730,7803=>641,7804=>696,7805=>586,7806=>696,7807=>586,7808=>993,7809=>831,7810=>993,7811=>831,7812=>993,7813=>831,7814=>993,7815=>831,7816=>993,7817=>831,7818=>694,7819=>580,7820=>694,7821=>580,7822=>651,7823=>586,7824=>652,7825=>523,7826=>652,7827=>523,7828=>652,7829=>523,7830=>641,7831=>430,7832=>831,7833=>586,7834=>607,7835=>391,7836=>391,7837=>391,7838=>806,7839=>618,7840=>696,7841=>607,7842=>696,7843=>607,7844=>696,7845=>607,7846=>696,7847=>607,7848=>696,7849=>607,7850=>696,7851=>607,7852=>696,7853=>607,7854=>696,7855=>607,7856=>696,7857=>607,7858=>696,7859=>607,7860=>696,7861=>607,7862=>696,7863=>607,7864=>615,7865=>610,7866=>615,7867=>610,7868=>615,7869=>610,7870=>615,7871=>610,7872=>615,7873=>610,7874=>615,7875=>610,7876=>615,7877=>610,7878=>615,7879=>610,7880=>334,7881=>308,7882=>334,7883=>308,7884=>765,7885=>618,7886=>765,7887=>618,7888=>765,7889=>618,7890=>765,7891=>618,7892=>765,7893=>618,7894=>765,7895=>618,7896=>765,7897=>618,7898=>786,7899=>618,7900=>786,7901=>618,7902=>786,7903=>618,7904=>786,7905=>618,7906=>786,7907=>618,7908=>730,7909=>641,7910=>730,7911=>641,7912=>751,7913=>641,7914=>751,7915=>641,7916=>751,7917=>641,7918=>751,7919=>641,7920=>751,7921=>641,7922=>651,7923=>586,7924=>651,7925=>586,7926=>651,7927=>586,7928=>651,7929=>586,7930=>857,7931=>579,7936=>618,7937=>618,7938=>618,7939=>618,7940=>618,7941=>618,7942=>618,7943=>618,7944=>696,7945=>696,7946=>937,7947=>939,7948=>841,7949=>866,7950=>751,7951=>773,7952=>501,7953=>501,7954=>501,7955=>501,7956=>501,7957=>501,7960=>712,7961=>715,7962=>989,7963=>986,7964=>920,7965=>947,7968=>641,7969=>641,7970=>641,7971=>641,7972=>641,7973=>641,7974=>641,7975=>641,7976=>851,7977=>856,7978=>1125,7979=>1125,7980=>1062,7981=>1085,7982=>948,7983=>956,7984=>351,7985=>351,7986=>351,7987=>351,7988=>351,7989=>351,7990=>351,7991=>351,7992=>435,7993=>440,7994=>699,7995=>707,7996=>641,7997=>664,7998=>544,7999=>544,8000=>618,8001=>618,8002=>618,8003=>618,8004=>618,8005=>618,8008=>802,8009=>839,8010=>1099,8011=>1101,8012=>947,8013=>974,8016=>607,8017=>607,8018=>607,8019=>607,8020=>607,8021=>607,8022=>607,8023=>607,8025=>837,8027=>1065,8029=>1079,8031=>944,8032=>782,8033=>782,8034=>782,8035=>782,8036=>782,8037=>782,8038=>782,8039=>782,8040=>817,8041=>862,8042=>1121,8043=>1126,8044=>968,8045=>994,8046=>925,8047=>968,8048=>618,8049=>618,8050=>501,8051=>501,8052=>641,8053=>641,8054=>351,8055=>351,8056=>618,8057=>618,8058=>607,8059=>607,8060=>782,8061=>782,8064=>618,8065=>618,8066=>618,8067=>618,8068=>618,8069=>618,8070=>618,8071=>618,8072=>696,8073=>696,8074=>937,8075=>939,8076=>841,8077=>866,8078=>751,8079=>773,8080=>641,8081=>641,8082=>641,8083=>641,8084=>641,8085=>641,8086=>641,8087=>641,8088=>851,8089=>856,8090=>1125,8091=>1125,8092=>1062,8093=>1085,8094=>948,8095=>956,8096=>782,8097=>782,8098=>782,8099=>782,8100=>782,8101=>782,8102=>782,8103=>782,8104=>817,8105=>862,8106=>1121,8107=>1126,8108=>968,8109=>994,8110=>925,8111=>968,8112=>618,8113=>618,8114=>618,8115=>618,8116=>618,8118=>618,8119=>618,8120=>696,8121=>696,8122=>789,8123=>717,8124=>696,8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>641,8131=>641,8132=>641,8134=>641,8135=>641,8136=>836,8137=>761,8138=>972,8139=>908,8140=>753,8141=>450,8142=>450,8143=>450,8144=>351,8145=>351,8146=>351,8147=>351,8150=>351,8151=>351,8152=>334,8153=>334,8154=>559,8155=>507,8157=>450,8158=>450,8159=>450,8160=>607,8161=>607,8162=>607,8163=>607,8164=>644,8165=>644,8166=>607,8167=>607,8168=>651,8169=>651,8170=>918,8171=>882,8172=>754,8173=>450,8174=>450,8175=>450,8178=>782,8179=>782,8180=>782,8182=>782,8183=>782,8184=>958,8185=>801,8186=>976,8187=>804,8188=>765,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>626,8200=>342,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>374,8209=>374,8210=>626,8211=>450,8212=>900,8213=>900,8214=>450,8215=>450,8216=>342,8217=>342,8218=>342,8219=>342,8220=>591,8221=>591,8222=>591,8223=>591,8224=>450,8225=>450,8226=>575,8227=>575,8228=>299,8229=>600,8230=>900,8231=>313,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180,8240=>1296,8241=>1698,8242=>237,8243=>402,8244=>567,8245=>237,8246=>402,8247=>567,8248=>659,8249=>371,8250=>371,8251=>875,8252=>564,8253=>522,8254=>450,8255=>745,8256=>745,8257=>296,8258=>920,8259=>450,8260=>150,8261=>411,8262=>411,8263=>927,8264=>746,8265=>746,8266=>461,8267=>572,8268=>450,8269=>450,8270=>470,8271=>360,8272=>745,8273=>470,8274=>500,8275=>900,8276=>745,8277=>754,8278=>615,8279=>731,8280=>754,8281=>754,8282=>342,8283=>784,8284=>754,8285=>342,8286=>342,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>394,8305=>197,8308=>394,8309=>394,8310=>394,8311=>394,8312=>394,8313=>394,8314=>475,8315=>475,8316=>475,8317=>259,8318=>259,8319=>410,8320=>394,8321=>394,8322=>394,8323=>394,8324=>394,8325=>394,8326=>394,8327=>394,8328=>394,8329=>394,8330=>475,8331=>475,8332=>475,8333=>259,8334=>259,8336=>412,8337=>431,8338=>439,8339=>371,8340=>431,8341=>410,8342=>438,8343=>197,8344=>597,8345=>410,8346=>431,8347=>343,8348=>349,8352=>836,8353=>626,8354=>626,8355=>626,8356=>626,8357=>938,8358=>753,8359=>1366,8360=>1084,8361=>993,8362=>813,8363=>626,8364=>626,8365=>626,8366=>626,8367=>1252,8368=>626,8369=>626,8370=>626,8371=>626,8372=>773,8373=>626,8376=>626,8377=>626,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>1007,8449=>1053,8450=>660,8451=>1090,8452=>806,8453=>982,8454=>1029,8455=>553,8456=>628,8457=>978,8459=>965,8460=>822,8461=>799,8462=>641,8463=>641,8464=>537,8465=>627,8466=>771,8467=>424,8468=>876,8469=>753,8470=>1083,8471=>900,8472=>627,8473=>675,8474=>765,8475=>844,8476=>732,8477=>721,8478=>807,8479=>639,8480=>917,8481=>1152,8482=>900,8483=>679,8484=>679,8485=>520,8486=>765,8487=>765,8488=>686,8489=>304,8490=>697,8491=>696,8492=>835,8493=>736,8494=>769,8495=>572,8496=>656,8497=>727,8498=>615,8499=>1065,8500=>418,8501=>714,8502=>658,8503=>444,8504=>615,8505=>342,8506=>851,8507=>1213,8508=>710,8509=>663,8510=>589,8511=>776,8512=>756,8513=>697,8514=>501,8515=>573,8516=>684,8517=>747,8518=>644,8519=>610,8520=>308,8521=>308,8523=>785,8526=>492,8528=>932,8529=>932,8530=>1334,8531=>932,8532=>932,8533=>932,8534=>932,8535=>932,8536=>932,8537=>932,8538=>932,8539=>932,8540=>932,8541=>932,8542=>932,8543=>554,8544=>334,8545=>593,8546=>851,8547=>989,8548=>696,8549=>989,8550=>1247,8551=>1505,8552=>1008,8553=>694,8554=>1008,8555=>1266,8556=>573,8557=>660,8558=>747,8559=>896,8560=>308,8561=>546,8562=>785,8563=>885,8564=>586,8565=>866,8566=>1104,8567=>1342,8568=>872,8569=>580,8570=>872,8571=>1110,8572=>308,8573=>533,8574=>644,8575=>938,8576=>1160,8577=>747,8578=>1160,8579=>660,8580=>533,8581=>660,8585=>932,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754,8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754,8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754,8620=>754,8621=>754,8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754,8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754,8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754,8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754,8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754,8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754,8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754,8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754,8700=>754,8701=>754,8702=>754,8703=>754,8704=>696,8705=>626,8706=>489,8707=>615,8708=>615,8709=>771,8710=>627,8711=>627,8712=>807,8713=>807,8714=>675,8715=>807,8716=>807,8717=>675,8718=>572,8719=>708,8720=>708,8721=>646,8722=>754,8723=>754,8724=>626,8725=>329,8726=>626,8727=>754,8728=>563,8729=>342,8730=>600,8731=>600,8732=>600,8733=>641,8734=>750,8735=>754,8736=>807,8737=>807,8738=>754,8739=>450,8740=>450,8741=>450,8742=>450,8743=>730,8744=>730,8745=>730,8746=>730,8747=>549,8748=>835,8749=>1165,8750=>506,8751=>879,8752=>1181,8753=>506,8754=>506,8755=>506,8756=>626,8757=>626,8758=>264,8759=>626,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754,8766=>754,8767=>754,8768=>337,8769=>754,8770=>754,8771=>754,8772=>754,8773=>754,8774=>754,8775=>754,8776=>754,8777=>754,8778=>754,8779=>754,8780=>754,8781=>754,8782=>754,8783=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>956,8789=>956,8790=>754,8791=>754,8792=>754,8793=>754,8794=>754,8795=>754,8796=>754,8797=>754,8798=>754,8799=>754,8800=>754,8801=>754,8802=>754,8803=>754,8804=>754,8805=>754,8806=>754,8807=>754,8808=>756,8809=>756,8810=>942,8811=>942,8812=>450,8813=>754,8814=>754,8815=>754,8816=>754,8817=>754,8818=>754,8819=>754,8820=>754,8821=>754,8822=>754,8823=>754,8824=>754,8825=>754,8826=>754,8827=>754,8828=>754,8829=>754,8830=>754,8831=>754,8832=>754,8833=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8840=>754,8841=>754,8842=>754,8843=>754,8844=>730,8845=>730,8846=>730,8847=>754,8848=>754,8849=>754,8850=>754,8851=>716,8852=>716,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754,8865=>754,8866=>822,8867=>822,8868=>822,8869=>822,8870=>488,8871=>488,8872=>822,8873=>822,8874=>822,8875=>822,8876=>822,8877=>822,8878=>822,8879=>822,8880=>754,8881=>754,8882=>754,8883=>754,8884=>754,8885=>754,8886=>900,8887=>900,8888=>754,8889=>754,8890=>488,8891=>730,8892=>730,8893=>730,8894=>754,8895=>754,8896=>758,8897=>758,8898=>758,8899=>758,8900=>444,8901=>342,8902=>563,8903=>754,8904=>900,8905=>900,8906=>900,8907=>900,8908=>900,8909=>754,8910=>730,8911=>730,8912=>754,8913=>754,8914=>754,8915=>754,8916=>754,8917=>754,8918=>754,8919=>754,8920=>1280,8921=>1280,8922=>754,8923=>754,8924=>754,8925=>754,8926=>754,8927=>754,8928=>754,8929=>754,8930=>754,8931=>754,8932=>754,8933=>754,8934=>754,8935=>754,8936=>754,8937=>754,8938=>754,8939=>754,8940=>754,8941=>754,8942=>900,8943=>900,8944=>900,8945=>900,8946=>1042,8947=>807,8948=>675,8949=>807,8950=>807,8951=>675,8952=>807,8953=>807,8954=>1042,8955=>807,8956=>675,8957=>807,8958=>675,8959=>807,8960=>542,8961=>542,8962=>644,8963=>754,8964=>754,8965=>754,8966=>754,8967=>439,8968=>411,8969=>411,8970=>411,8971=>411,8972=>728,8973=>728,8974=>728,8975=>728,8976=>754,8977=>484,8984=>835,8985=>754,8988=>422,8989=>422,8990=>422,8991=>422,8992=>549,8993=>549,8996=>1037,8997=>1037,8998=>1272,8999=>1037,9000=>1299,9003=>1272,9004=>786,9075=>351,9076=>644,9077=>782,9082=>618,9085=>776,9095=>1037,9108=>786,9115=>450,9116=>450,9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450,9125=>450,9126=>450,9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>549,9166=>754,9167=>850,9187=>786,9189=>692,9192=>626,9250=>644,9251=>644,9312=>762,9313=>762,9314=>762,9315=>762,9316=>762,9317=>762,9318=>762,9319=>762,9320=>762,9321=>762,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474,9687=>474,9688=>756,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>692,9697=>692,9698=>692,9699=>692,9700=>692,9701=>692,9702=>575,9703=>850,9704=>850,9705=>850,9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659,9727=>692,9728=>807,9729=>900,9730=>807,9731=>807,9732=>807,9733=>807,9734=>807,9735=>515,9736=>806,9737=>807,9738=>799,9739=>799,9740=>604,9741=>911,9742=>1121,9743=>1125,9744=>807,9745=>807,9746=>807,9747=>479,9748=>807,9749=>807,9750=>807,9751=>807,9752=>807,9753=>807,9754=>807,9755=>807,9756=>807,9757=>548,9758=>807,9759=>548,9760=>807,9761=>807,9762=>807,9763=>807,9764=>602,9765=>671,9766=>584,9767=>705,9768=>490,9769=>807,9770=>807,9771=>807,9772=>639,9773=>807,9774=>807,9775=>807,9776=>807,9777=>807,9778=>807,9779=>807,9780=>807,9781=>807,9782=>807,9783=>807,9784=>807,9785=>938,9786=>938,9787=>938,9788=>807,9789=>807,9790=>807,9791=>552,9792=>659,9793=>659,9794=>807,9795=>807,9796=>807,9797=>807,9798=>807,9799=>807,9800=>807,9801=>807,9802=>807,9803=>807,9804=>807,9805=>807,9806=>807,9807=>807,9808=>807,9809=>807,9810=>807,9811=>807,9812=>807,9813=>807,9814=>807,9815=>807,9816=>807,9817=>807,9818=>807,9819=>807,9820=>807,9821=>807,9822=>807,9823=>807,9824=>807,9825=>807,9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9832=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424,9838=>321,9839=>435,9840=>673,9841=>689,9842=>807,9843=>807,9844=>807,9845=>807,9846=>807,9847=>807,9848=>807,9849=>807,9850=>807,9851=>807,9852=>807,9853=>807,9854=>807,9855=>807,9856=>782,9857=>782,9858=>782,9859=>782,9860=>782,9861=>782,9862=>807,9863=>807,9864=>807,9865=>807,9866=>807,9867=>807,9868=>807,9869=>807,9870=>807,9871=>807,9872=>807,9873=>807,9874=>807,9875=>807,9876=>807,9877=>487,9878=>807,9879=>807,9880=>807,9881=>807,9882=>807,9883=>807,9884=>807,9888=>807,9889=>632,9890=>904,9891=>980,9892=>1057,9893=>813,9894=>754,9895=>754,9896=>754,9897=>754,9898=>754,9899=>754,9900=>754,9901=>754,9902=>754,9903=>754,9904=>759,9905=>754,9906=>659,9907=>659,9908=>659,9909=>659,9910=>765,9911=>659,9912=>659,9920=>754,9921=>754,9922=>754,9923=>754,9954=>659,9985=>754,9986=>754,9987=>754,9988=>754,9990=>754,9991=>754,9992=>754,9993=>754,9996=>754,9997=>754,9998=>754,9999=>754,10000=>754,10001=>754,10002=>754,10003=>754,10004=>754,10005=>754,10006=>754,10007=>754,10008=>754,10009=>754,10010=>754,10011=>754,10012=>754,10013=>754,10014=>754,10015=>754,10016=>754,10017=>754,10018=>754,10019=>754,10020=>754,10021=>754,10022=>754,10023=>754,10025=>754,10026=>754,10027=>754,10028=>754,10029=>754,10030=>754,10031=>754,10032=>754,10033=>754,10034=>754,10035=>754,10036=>754,10037=>754,10038=>754,10039=>754,10040=>754,10041=>754,10042=>754,10043=>754,10044=>754,10045=>754,10046=>754,10047=>754,10048=>754,10049=>754,10050=>754,10051=>754,10052=>754,10053=>754,10054=>754,10055=>754,10056=>754,10057=>754,10058=>754,10059=>754,10061=>807,10063=>807,10064=>807,10065=>807,10066=>807,10070=>807,10072=>754,10073=>754,10074=>754,10075=>312,10076=>312,10077=>528,10078=>528,10081=>754,10082=>754,10083=>754,10084=>754,10085=>754,10086=>754,10087=>754,10088=>754,10089=>754,10090=>754,10091=>754,10092=>754,10093=>754,10094=>754,10095=>754,10096=>754,10097=>754,10098=>754,10099=>754,10100=>754,10101=>754,10102=>762,10103=>762,10104=>762,10105=>762,10106=>762,10107=>762,10108=>762,10109=>762,10110=>762,10111=>762,10112=>754,10113=>754,10114=>754,10115=>754,10116=>754,10117=>754,10118=>754,10119=>754,10120=>754,10121=>754,10122=>754,10123=>754,10124=>754,10125=>754,10126=>754,10127=>754,10128=>754,10129=>754,10130=>754,10131=>754,10132=>754,10136=>754,10137=>754,10138=>754,10139=>754,10140=>754,10141=>754,10142=>754,10143=>754,10144=>754,10145=>754,10146=>754,10147=>754,10148=>754,10149=>754,10150=>754,10151=>754,10152=>754,10153=>754,10154=>754,10155=>754,10156=>754,10157=>754,10158=>754,10159=>754,10161=>754,10162=>754,10163=>754,10164=>754,10165=>754,10166=>754,10167=>754,10168=>754,10169=>754,10170=>754,10171=>754,10172=>754,10173=>754,10174=>754,10181=>411,10182=>411,10208=>444,10214=>438,10215=>438,10216=>411,10217=>411,10218=>648,10219=>648,10224=>754,10225=>754,10226=>754,10227=>754,10228=>1042,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290,10237=>1290,10238=>1290,10239=>1290,10240=>703,10241=>703,10242=>703,10243=>703,10244=>703,10245=>703,10246=>703,10247=>703,10248=>703,10249=>703,10250=>703,10251=>703,10252=>703,10253=>703,10254=>703,10255=>703,10256=>703,10257=>703,10258=>703,10259=>703,10260=>703,10261=>703,10262=>703,10263=>703,10264=>703,10265=>703,10266=>703,10267=>703,10268=>703,10269=>703,10270=>703,10271=>703,10272=>703,10273=>703,10274=>703,10275=>703,10276=>703,10277=>703,10278=>703,10279=>703,10280=>703,10281=>703,10282=>703,10283=>703,10284=>703,10285=>703,10286=>703,10287=>703,10288=>703,10289=>703,10290=>703,10291=>703,10292=>703,10293=>703,10294=>703,10295=>703,10296=>703,10297=>703,10298=>703,10299=>703,10300=>703,10301=>703,10302=>703,10303=>703,10304=>703,10305=>703,10306=>703,10307=>703,10308=>703,10309=>703,10310=>703,10311=>703,10312=>703,10313=>703,10314=>703,10315=>703,10316=>703,10317=>703,10318=>703,10319=>703,10320=>703,10321=>703,10322=>703,10323=>703,10324=>703,10325=>703,10326=>703,10327=>703,10328=>703,10329=>703,10330=>703,10331=>703,10332=>703,10333=>703,10334=>703,10335=>703,10336=>703,10337=>703,10338=>703,10339=>703,10340=>703,10341=>703,10342=>703,10343=>703,10344=>703,10345=>703,10346=>703,10347=>703,10348=>703,10349=>703,10350=>703,10351=>703,10352=>703,10353=>703,10354=>703,10355=>703,10356=>703,10357=>703,10358=>703,10359=>703,10360=>703,10361=>703,10362=>703,10363=>703,10364=>703,10365=>703,10366=>703,10367=>703,10368=>703,10369=>703,10370=>703,10371=>703,10372=>703,10373=>703,10374=>703,10375=>703,10376=>703,10377=>703,10378=>703,10379=>703,10380=>703,10381=>703,10382=>703,10383=>703,10384=>703,10385=>703,10386=>703,10387=>703,10388=>703,10389=>703,10390=>703,10391=>703,10392=>703,10393=>703,10394=>703,10395=>703,10396=>703,10397=>703,10398=>703,10399=>703,10400=>703,10401=>703,10402=>703,10403=>703,10404=>703,10405=>703,10406=>703,10407=>703,10408=>703,10409=>703,10410=>703,10411=>703,10412=>703,10413=>703,10414=>703,10415=>703,10416=>703,10417=>703,10418=>703,10419=>703,10420=>703,10421=>703,10422=>703,10423=>703,10424=>703,10425=>703,10426=>703,10427=>703,10428=>703,10429=>703,10430=>703,10431=>703,10432=>703,10433=>703,10434=>703,10435=>703,10436=>703,10437=>703,10438=>703,10439=>703,10440=>703,10441=>703,10442=>703,10443=>703,10444=>703,10445=>703,10446=>703,10447=>703,10448=>703,10449=>703,10450=>703,10451=>703,10452=>703,10453=>703,10454=>703,10455=>703,10456=>703,10457=>703,10458=>703,10459=>703,10460=>703,10461=>703,10462=>703,10463=>703,10464=>703,10465=>703,10466=>703,10467=>703,10468=>703,10469=>703,10470=>703,10471=>703,10472=>703,10473=>703,10474=>703,10475=>703,10476=>703,10477=>703,10478=>703,10479=>703,10480=>703,10481=>703,10482=>703,10483=>703,10484=>703,10485=>703,10486=>703,10487=>703,10488=>703,10489=>703,10490=>703,10491=>703,10492=>703,10493=>703,10494=>703,10495=>703,10502=>754,10503=>754,10506=>754,10507=>754,10560=>754,10561=>754,10627=>678,10628=>678,10702=>754,10703=>941,10704=>941,10705=>900,10706=>900,10707=>900,10708=>900,10709=>900,10731=>444,10746=>754,10747=>754,10752=>900,10753=>900,10754=>900,10764=>1495,10765=>506,10766=>506,10767=>506,10768=>506,10769=>506,10770=>506,10771=>506,10772=>506,10773=>506,10774=>506,10775=>506,10776=>506,10777=>506,10778=>506,10779=>506,10780=>506,10799=>754,10877=>754,10878=>754,10879=>754,10880=>754,10881=>754,10882=>754,10883=>754,10884=>754,10885=>754,10886=>754,10887=>754,10888=>754,10889=>754,10890=>754,10891=>754,10892=>754,10893=>754,10894=>754,10895=>754,10896=>754,10897=>754,10898=>754,10899=>754,10900=>754,10901=>754,10902=>754,10903=>754,10904=>754,10905=>754,10906=>754,10907=>754,10908=>754,10909=>754,10910=>754,10911=>754,10912=>754,10926=>754,10927=>754,10928=>754,10929=>754,10930=>754,10931=>754,10932=>754,10933=>754,10934=>754,10935=>754,10936=>754,10937=>754,10938=>754,11001=>754,11002=>754,11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754,11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754,11026=>850,11027=>850,11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11039=>782,11040=>782,11041=>786,11042=>786,11043=>786,11044=>1007,11091=>782,11092=>782,11360=>573,11361=>324,11362=>573,11363=>659,11364=>693,11365=>607,11366=>430,11367=>860,11368=>641,11369=>697,11370=>598,11371=>652,11372=>523,11373=>774,11374=>896,11375=>696,11376=>774,11377=>700,11378=>1099,11379=>950,11380=>586,11381=>628,11382=>508,11383=>704,11385=>484,11386=>618,11387=>502,11388=>197,11389=>438,11390=>648,11391=>652,11568=>622,11569=>847,11570=>847,11571=>652,11572=>652,11573=>652,11574=>608,11575=>696,11576=>696,11577=>615,11578=>615,11579=>721,11580=>890,11581=>685,11582=>561,11583=>685,11584=>847,11585=>847,11586=>335,11587=>666,11588=>753,11589=>822,11590=>604,11591=>663,11592=>612,11593=>615,11594=>542,11595=>935,11596=>700,11597=>753,11598=>615,11599=>334,11600=>700,11601=>335,11602=>652,11603=>622,11604=>847,11605=>847,11606=>753,11607=>335,11608=>752,11609=>847,11610=>847,11611=>660,11612=>789,11613=>694,11614=>660,11615=>615,11616=>696,11617=>753,11618=>615,11619=>765,11620=>627,11621=>765,11631=>644,11800=>522,11810=>411,11811=>411,11812=>411,11813=>411,11822=>522,19904=>807,19905=>807,19906=>807,19907=>807,19908=>807,19909=>807,19910=>807,19911=>807,19912=>807,19913=>807,19914=>807,19915=>807,19916=>807,19917=>807,19918=>807,19919=>807,19920=>807,19921=>807,19922=>807,19923=>807,19924=>807,19925=>807,19926=>807,19927=>807,19928=>807,19929=>807,19930=>807,19931=>807,19932=>807,19933=>807,19934=>807,19935=>807,19936=>807,19937=>807,19938=>807,19939=>807,19940=>807,19941=>807,19942=>807,19943=>807,19944=>807,19945=>807,19946=>807,19947=>807,19948=>807,19949=>807,19950=>807,19951=>807,19952=>807,19953=>807,19954=>807,19955=>807,19956=>807,19957=>807,19958=>807,19959=>807,19960=>807,19961=>807,19962=>807,19963=>807,19964=>807,19965=>807,19966=>807,19967=>807,42564=>648,42565=>536,42566=>392,42567=>396,42572=>1265,42573=>1055,42576=>1110,42577=>924,42580=>1056,42581=>875,42582=>983,42583=>862,42594=>976,42595=>832,42596=>986,42597=>821,42598=>1134,42599=>897,42600=>765,42601=>618,42602=>933,42603=>781,42604=>1266,42605=>995,42606=>865,42634=>867,42635=>708,42636=>614,42637=>521,42644=>727,42645=>641,42760=>450,42761=>450,42762=>450,42763=>450,42764=>450,42765=>450,42766=>450,42767=>450,42768=>450,42769=>450,42770=>450,42771=>450,42772=>450,42773=>450,42774=>450,42779=>360,42780=>360,42781=>258,42782=>258,42783=>258,42786=>399,42787=>351,42788=>486,42789=>486,42790=>753,42791=>641,42792=>928,42793=>771,42794=>626,42795=>501,42800=>502,42801=>536,42802=>1214,42803=>946,42804=>1156,42805=>958,42806=>1094,42807=>949,42808=>971,42809=>830,42810=>971,42811=>830,42812=>932,42813=>830,42814=>628,42815=>494,42822=>765,42823=>488,42824=>614,42825=>478,42826=>826,42827=>732,42830=>1266,42831=>995,42832=>659,42833=>644,42834=>853,42835=>843,42838=>765,42839=>644,42852=>664,42853=>644,42854=>664,42855=>644,42880=>573,42881=>308,42882=>753,42883=>641,42889=>360,42890=>347,42891=>410,42892=>275,42893=>727,42894=>624,42896=>835,42897=>691,43002=>956,43003=>615,43004=>659,43005=>896,43006=>334,43007=>1192,61184=>194,61185=>218,61186=>240,61187=>249,61188=>254,61189=>218,61190=>194,61191=>218,61192=>240,61193=>249,61194=>240,61195=>218,61196=>194,61197=>218,61198=>240,61199=>249,61200=>240,61201=>218,61202=>194,61203=>218,61204=>254,61205=>249,61206=>240,61207=>218,61208=>194,61209=>254,63173=>618,64256=>729,64257=>667,64258=>667,64259=>1003,64260=>1004,64261=>727,64262=>917,64275=>1249,64276=>1245,64277=>1240,64278=>1245,64279=>1542,64285=>265,64286=>0,64287=>467,64288=>598,64289=>845,64290=>709,64291=>828,64292=>707,64293=>771,64294=>782,64295=>739,64296=>801,64297=>754,64298=>682,64299=>682,64300=>682,64301=>682,64302=>655,64303=>655,64304=>655,64305=>549,64306=>402,64307=>529,64308=>618,64309=>393,64310=>436,64312=>611,64313=>391,64314=>520,64315=>510,64316=>544,64318=>651,64320=>408,64321=>611,64323=>607,64324=>592,64326=>587,64327=>663,64328=>542,64329=>682,64330=>615,64331=>309,64332=>549,64333=>510,64334=>592,64335=>639,64338=>904,64339=>953,64340=>338,64341=>367,64342=>904,64343=>953,64344=>338,64345=>367,64346=>904,64347=>953,64348=>338,64349=>367,64350=>904,64351=>953,64352=>338,64353=>367,64354=>904,64355=>953,64356=>338,64357=>367,64358=>904,64359=>953,64360=>338,64361=>367,64362=>1045,64363=>1072,64364=>589,64365=>647,64366=>1045,64367=>1072,64368=>589,64369=>647,64370=>648,64371=>648,64372=>648,64373=>648,64374=>648,64375=>648,64376=>648,64377=>648,64378=>648,64379=>648,64380=>648,64381=>648,64382=>648,64383=>648,64384=>648,64385=>648,64386=>461,64387=>520,64388=>461,64389=>520,64390=>461,64391=>520,64392=>461,64393=>520,64394=>518,64395=>560,64396=>518,64397=>560,64398=>921,64399=>921,64400=>523,64401=>523,64402=>921,64403=>921,64404=>523,64405=>523,64406=>921,64407=>921,64408=>523,64409=>523,64410=>921,64411=>921,64412=>523,64413=>523,64414=>768,64415=>810,64416=>768,64417=>810,64418=>338,64419=>367,64426=>844,64427=>792,64428=>624,64429=>594,64467=>742,64468=>758,64469=>428,64470=>497,64473=>559,64474=>564,64488=>338,64489=>367,64508=>825,64509=>910,64510=>338,64511=>367,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65136=>308,65137=>308,65138=>308,65139=>311,65140=>308,65142=>308,65143=>308,65144=>308,65145=>308,65146=>308,65147=>308,65148=>308,65149=>308,65150=>308,65151=>308,65152=>460,65153=>308,65154=>338,65155=>308,65156=>338,65157=>559,65158=>564,65159=>308,65160=>338,65161=>825,65162=>825,65163=>338,65164=>367,65165=>308,65166=>338,65167=>904,65168=>953,65169=>338,65170=>367,65171=>531,65172=>545,65173=>904,65174=>953,65175=>338,65176=>367,65177=>904,65178=>953,65179=>338,65180=>367,65181=>648,65182=>648,65183=>648,65184=>648,65185=>648,65186=>648,65187=>648,65188=>648,65189=>648,65190=>648,65191=>648,65192=>648,65193=>461,65194=>520,65195=>461,65196=>520,65197=>518,65198=>560,65199=>518,65200=>560,65201=>1242,65202=>1272,65203=>885,65204=>916,65205=>1242,65206=>1272,65207=>885,65208=>916,65209=>1210,65210=>1228,65211=>870,65212=>887,65213=>1210,65214=>1228,65215=>870,65216=>887,65217=>935,65218=>963,65219=>848,65220=>876,65221=>935,65222=>963,65223=>848,65224=>876,65225=>615,65226=>615,65227=>615,65228=>508,65229=>615,65230=>615,65231=>615,65232=>508,65233=>1045,65234=>1072,65235=>589,65236=>647,65237=>804,65238=>811,65239=>589,65240=>647,65241=>825,65242=>838,65243=>523,65244=>523,65245=>781,65246=>803,65247=>338,65248=>367,65249=>659,65250=>706,65251=>557,65252=>603,65253=>768,65254=>810,65255=>338,65256=>367,65257=>531,65258=>545,65259=>624,65260=>594,65261=>559,65262=>564,65263=>825,65264=>910,65265=>825,65266=>910,65267=>338,65268=>367,65269=>670,65270=>683,65271=>670,65272=>683,65273=>670,65274=>683,65275=>670,65276=>683,65279=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1002,65535=>540);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedb.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedb.z
new file mode 100644
index 00000000..5609a282
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedb.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedbi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedbi.ctg.z
new file mode 100644
index 00000000..3119c2a2
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedbi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedbi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedbi.php
new file mode 100644
index 00000000..551feee0
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedbi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSansCondensed-BoldOblique';
+$up=-63;
+$ut=44;
+$dw=540;
+$diff='';
+$originalsize=580168;
+$enc='';
+$file='dejavusanscondensedbi.z';
+$ctg='dejavusanscondensedbi.ctg.z';
+$desc=array('Flags'=>96,'FontBBox'=>'[-960 -385 1799 1121]','ItalicAngle'=>-11,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>547,'StemV'=>60,'StemH'=>26,'AvgWidth'=>515,'MaxWidth'=>1814,'MissingWidth'=>540);
+$cw=array(0=>540,32=>313,33=>410,34=>469,35=>626,36=>626,37=>901,38=>785,39=>275,40=>411,41=>411,42=>470,43=>754,44=>342,45=>374,46=>342,47=>329,48=>626,49=>626,50=>626,51=>626,52=>626,53=>626,54=>626,55=>626,56=>626,57=>626,58=>360,59=>360,60=>754,61=>754,62=>754,63=>522,64=>900,65=>696,66=>686,67=>660,68=>747,69=>615,70=>615,71=>738,72=>753,73=>334,74=>334,75=>697,76=>573,77=>896,78=>753,79=>765,80=>659,81=>765,82=>693,83=>648,84=>614,85=>730,86=>696,87=>993,88=>694,89=>651,90=>652,91=>411,92=>329,93=>411,94=>754,95=>450,96=>450,97=>607,98=>644,99=>533,100=>644,101=>610,102=>391,103=>644,104=>641,105=>308,106=>308,107=>598,108=>308,109=>938,110=>641,111=>618,112=>644,113=>644,114=>444,115=>536,116=>430,117=>641,118=>586,119=>831,120=>580,121=>586,122=>523,123=>641,124=>329,125=>641,126=>754,160=>313,161=>410,162=>626,163=>626,164=>572,165=>626,166=>329,167=>450,168=>450,169=>900,170=>507,171=>584,172=>754,173=>374,174=>900,175=>450,176=>450,177=>754,178=>394,179=>394,180=>450,181=>662,182=>572,183=>342,184=>450,185=>394,186=>507,187=>584,188=>932,189=>932,190=>932,191=>522,192=>696,193=>696,194=>696,195=>696,196=>696,197=>696,198=>976,199=>660,200=>615,201=>615,202=>615,203=>615,204=>334,205=>334,206=>334,207=>334,208=>760,209=>753,210=>765,211=>765,212=>765,213=>765,214=>765,215=>754,216=>765,217=>730,218=>730,219=>730,220=>730,221=>651,222=>668,223=>647,224=>607,225=>607,226=>607,227=>607,228=>607,229=>607,230=>943,231=>533,232=>610,233=>610,234=>610,235=>610,236=>308,237=>308,238=>308,239=>308,240=>618,241=>641,242=>618,243=>618,244=>618,245=>618,246=>618,247=>754,248=>618,249=>641,250=>641,251=>641,252=>641,253=>586,254=>644,255=>586,256=>696,257=>607,258=>696,259=>607,260=>696,261=>607,262=>660,263=>533,264=>660,265=>533,266=>660,267=>533,268=>660,269=>533,270=>747,271=>644,272=>760,273=>644,274=>615,275=>610,276=>615,277=>610,278=>615,279=>610,280=>615,281=>610,282=>615,283=>610,284=>738,285=>644,286=>738,287=>644,288=>738,289=>644,290=>738,291=>644,292=>753,293=>641,294=>876,295=>711,296=>334,297=>308,298=>334,299=>308,300=>334,301=>308,302=>334,303=>308,304=>334,305=>308,306=>669,307=>617,308=>334,309=>308,310=>697,311=>598,312=>598,313=>573,314=>308,315=>573,316=>308,317=>573,318=>308,319=>573,320=>308,321=>594,322=>337,323=>753,324=>641,325=>753,326=>641,327=>753,328=>641,329=>884,330=>753,331=>641,332=>765,333=>618,334=>765,335=>618,336=>765,337=>618,338=>1050,339=>984,340=>693,341=>444,342=>693,343=>444,344=>693,345=>444,346=>648,347=>536,348=>648,349=>536,350=>648,351=>536,352=>648,353=>536,354=>614,355=>430,356=>614,357=>430,358=>614,359=>430,360=>730,361=>641,362=>730,363=>641,364=>730,365=>641,366=>730,367=>641,368=>730,369=>641,370=>730,371=>641,372=>993,373=>831,374=>651,375=>586,376=>651,377=>652,378=>523,379=>652,380=>523,381=>652,382=>523,383=>391,384=>644,385=>729,386=>686,387=>644,388=>686,389=>644,390=>660,391=>660,392=>533,393=>760,394=>791,395=>686,396=>644,397=>618,398=>615,399=>765,400=>626,401=>615,402=>391,403=>738,404=>713,405=>940,406=>392,407=>350,408=>697,409=>598,410=>324,411=>532,412=>938,413=>753,414=>641,415=>765,416=>765,417=>618,418=>1002,419=>866,420=>703,421=>644,422=>693,423=>648,424=>536,425=>615,426=>497,427=>430,428=>636,429=>430,430=>614,431=>730,432=>641,433=>692,434=>732,435=>717,436=>700,437=>652,438=>523,439=>695,440=>695,441=>576,442=>523,443=>626,444=>695,445=>576,446=>515,447=>644,448=>334,449=>593,450=>489,451=>334,452=>1393,453=>1305,454=>1176,455=>879,456=>881,457=>603,458=>1074,459=>1091,460=>957,461=>696,462=>607,463=>334,464=>308,465=>765,466=>618,467=>730,468=>641,469=>730,470=>641,471=>730,472=>641,473=>730,474=>641,475=>730,476=>641,477=>610,478=>696,479=>607,480=>696,481=>607,482=>976,483=>943,484=>738,485=>644,486=>738,487=>644,488=>697,489=>598,490=>765,491=>618,492=>765,493=>618,494=>695,495=>523,496=>308,497=>1393,498=>1305,499=>1176,500=>738,501=>644,502=>1160,503=>708,504=>753,505=>641,506=>696,507=>607,508=>976,509=>943,510=>765,511=>618,512=>696,513=>607,514=>696,515=>607,516=>615,517=>610,518=>615,519=>610,520=>334,521=>308,522=>334,523=>308,524=>765,525=>618,526=>765,527=>618,528=>693,529=>444,530=>693,531=>444,532=>730,533=>641,534=>730,535=>641,536=>648,537=>536,538=>614,539=>430,540=>621,541=>546,542=>753,543=>641,544=>753,545=>778,546=>728,547=>593,548=>652,549=>523,550=>696,551=>607,552=>615,553=>610,554=>765,555=>618,556=>765,557=>618,558=>765,559=>618,560=>765,561=>618,562=>651,563=>586,564=>442,565=>780,566=>460,567=>308,568=>979,569=>979,570=>696,571=>660,572=>533,573=>573,574=>614,575=>536,576=>523,577=>703,578=>553,579=>686,580=>730,581=>696,582=>615,583=>610,584=>334,585=>308,586=>774,587=>712,588=>693,589=>444,590=>651,591=>586,592=>607,593=>644,594=>644,595=>644,596=>533,597=>533,598=>712,599=>712,600=>610,601=>610,602=>788,603=>501,604=>490,605=>696,606=>658,607=>308,608=>712,609=>644,610=>564,611=>661,612=>571,613=>641,614=>641,615=>641,616=>491,617=>396,618=>491,619=>502,620=>624,621=>308,622=>757,623=>938,624=>938,625=>938,626=>641,627=>713,628=>578,629=>618,630=>817,631=>613,632=>716,633=>484,634=>484,635=>584,636=>444,637=>444,638=>536,639=>536,640=>578,641=>578,642=>536,643=>374,644=>391,645=>544,646=>497,647=>430,648=>430,649=>828,650=>692,651=>603,652=>586,653=>831,654=>586,655=>651,656=>624,657=>615,658=>576,659=>576,660=>515,661=>515,662=>515,663=>515,664=>765,665=>569,666=>658,667=>616,668=>622,669=>308,670=>659,671=>485,672=>712,673=>515,674=>515,675=>1040,676=>1093,677=>1039,678=>876,679=>691,680=>836,681=>923,682=>712,683=>702,684=>532,685=>374,686=>609,687=>710,688=>410,689=>410,690=>197,691=>284,692=>284,693=>284,694=>369,695=>532,696=>375,697=>271,698=>469,699=>342,700=>342,701=>342,702=>330,703=>330,704=>293,705=>293,706=>450,707=>450,708=>450,709=>450,710=>450,711=>450,712=>275,713=>450,714=>450,715=>450,716=>275,717=>450,718=>450,719=>450,720=>303,721=>303,722=>330,723=>330,724=>450,725=>450,726=>374,727=>295,728=>450,729=>450,730=>450,731=>450,732=>450,733=>450,734=>315,735=>450,736=>370,737=>197,738=>343,739=>371,740=>293,741=>450,742=>450,743=>450,744=>450,745=>450,748=>450,749=>450,750=>580,755=>450,759=>450,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>628,881=>508,882=>919,883=>752,884=>271,885=>271,886=>753,887=>630,890=>450,891=>533,892=>495,893=>494,894=>360,900=>397,901=>450,902=>717,903=>342,904=>761,905=>908,906=>507,908=>801,910=>882,911=>804,912=>351,913=>696,914=>686,915=>573,916=>696,917=>615,918=>652,919=>753,920=>765,921=>334,922=>697,923=>696,924=>896,925=>753,926=>568,927=>765,928=>753,929=>659,931=>615,932=>614,933=>651,934=>765,935=>694,936=>765,937=>765,938=>334,939=>651,940=>618,941=>501,942=>641,943=>351,944=>607,945=>618,946=>644,947=>613,948=>618,949=>501,950=>532,951=>641,952=>618,953=>351,954=>639,955=>569,956=>662,957=>613,958=>532,959=>618,960=>712,961=>644,962=>533,963=>701,964=>574,965=>607,966=>704,967=>580,968=>714,969=>782,970=>351,971=>607,972=>618,973=>607,974=>782,975=>697,976=>585,977=>594,978=>671,979=>883,980=>671,981=>716,982=>782,983=>669,984=>765,985=>618,986=>660,987=>533,988=>615,989=>444,990=>632,991=>593,992=>827,993=>564,994=>983,995=>753,996=>749,997=>644,998=>835,999=>669,1000=>660,1001=>585,1002=>709,1003=>604,1004=>677,1005=>644,1006=>614,1007=>531,1008=>669,1009=>644,1010=>533,1011=>308,1012=>765,1013=>580,1014=>580,1015=>668,1016=>644,1017=>660,1018=>896,1019=>659,1020=>644,1021=>660,1022=>660,1023=>628,1024=>615,1025=>615,1026=>791,1027=>573,1028=>660,1029=>648,1030=>334,1031=>334,1032=>334,1033=>1039,1034=>1017,1035=>791,1036=>735,1037=>753,1038=>694,1039=>753,1040=>696,1041=>686,1042=>686,1043=>573,1044=>801,1045=>615,1046=>1102,1047=>639,1048=>753,1049=>753,1050=>735,1051=>747,1052=>896,1053=>753,1054=>765,1055=>753,1056=>659,1057=>660,1058=>614,1059=>694,1060=>892,1061=>694,1062=>835,1063=>727,1064=>1112,1065=>1193,1066=>845,1067=>932,1068=>686,1069=>660,1070=>1056,1071=>693,1072=>607,1073=>628,1074=>569,1075=>470,1076=>727,1077=>610,1078=>896,1079=>523,1080=>630,1081=>630,1082=>611,1083=>659,1084=>735,1085=>622,1086=>618,1087=>622,1088=>644,1089=>533,1090=>521,1091=>586,1092=>893,1093=>580,1094=>667,1095=>618,1096=>956,1097=>995,1098=>676,1099=>813,1100=>569,1101=>533,1102=>875,1103=>578,1104=>610,1105=>610,1106=>642,1107=>470,1108=>533,1109=>536,1110=>308,1111=>308,1112=>308,1113=>892,1114=>860,1115=>661,1116=>611,1117=>630,1118=>586,1119=>622,1120=>983,1121=>782,1122=>756,1123=>662,1124=>911,1125=>755,1126=>893,1127=>749,1128=>1222,1129=>1009,1130=>765,1131=>618,1132=>1112,1133=>906,1134=>626,1135=>501,1136=>967,1137=>955,1138=>765,1139=>618,1140=>765,1141=>625,1142=>765,1143=>625,1144=>1033,1145=>939,1146=>967,1147=>776,1148=>1265,1149=>1055,1150=>983,1151=>782,1152=>660,1153=>533,1154=>587,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>376,1161=>376,1162=>844,1163=>725,1164=>686,1165=>550,1166=>662,1167=>646,1168=>573,1169=>470,1170=>599,1171=>488,1172=>709,1173=>470,1174=>1102,1175=>896,1176=>639,1177=>523,1178=>697,1179=>611,1180=>735,1181=>611,1182=>735,1183=>611,1184=>914,1185=>743,1186=>753,1187=>622,1188=>992,1189=>783,1190=>1129,1191=>880,1192=>851,1193=>773,1194=>660,1195=>533,1196=>614,1197=>521,1198=>651,1199=>586,1200=>651,1201=>586,1202=>694,1203=>580,1204=>993,1205=>901,1206=>727,1207=>618,1208=>727,1209=>618,1210=>727,1211=>641,1212=>923,1213=>729,1214=>923,1215=>729,1216=>334,1217=>1102,1218=>896,1219=>700,1220=>566,1221=>839,1222=>724,1223=>753,1224=>622,1225=>844,1226=>725,1227=>727,1228=>618,1229=>986,1230=>838,1231=>308,1232=>696,1233=>607,1234=>696,1235=>607,1236=>976,1237=>943,1238=>615,1239=>610,1240=>765,1241=>610,1242=>765,1243=>610,1244=>1102,1245=>896,1246=>639,1247=>523,1248=>695,1249=>576,1250=>753,1251=>630,1252=>753,1253=>630,1254=>765,1255=>618,1256=>765,1257=>618,1258=>765,1259=>618,1260=>660,1261=>533,1262=>694,1263=>586,1264=>694,1265=>586,1266=>694,1267=>586,1268=>727,1269=>618,1270=>573,1271=>470,1272=>932,1273=>813,1274=>599,1275=>488,1276=>694,1277=>580,1278=>694,1279=>580,1280=>686,1281=>547,1282=>1043,1283=>804,1284=>1007,1285=>828,1286=>745,1287=>624,1288=>1117,1289=>915,1290=>1160,1291=>912,1292=>755,1293=>574,1294=>844,1295=>722,1296=>626,1297=>501,1298=>747,1299=>659,1300=>1157,1301=>963,1302=>958,1303=>883,1304=>973,1305=>864,1306=>765,1307=>644,1308=>993,1309=>831,1310=>735,1311=>611,1312=>1123,1313=>920,1314=>1128,1315=>880,1316=>861,1317=>726,1329=>813,1330=>729,1331=>728,1332=>731,1333=>729,1334=>733,1335=>651,1336=>720,1337=>903,1338=>728,1339=>666,1340=>558,1341=>961,1342=>787,1343=>713,1344=>650,1345=>729,1346=>715,1347=>704,1348=>780,1349=>689,1350=>715,1351=>708,1352=>730,1353=>677,1354=>867,1355=>711,1356=>780,1357=>730,1358=>715,1359=>693,1360=>666,1361=>698,1362=>576,1363=>833,1364=>698,1365=>763,1366=>855,1369=>330,1370=>342,1371=>308,1372=>374,1373=>313,1374=>461,1375=>468,1377=>938,1378=>642,1379=>704,1380=>708,1381=>642,1382=>643,1383=>565,1384=>642,1385=>756,1386=>704,1387=>642,1388=>309,1389=>984,1390=>637,1391=>642,1392=>642,1393=>603,1394=>642,1395=>642,1396=>642,1397=>308,1398=>642,1399=>486,1400=>642,1401=>366,1402=>938,1403=>572,1404=>666,1405=>642,1406=>642,1407=>934,1408=>642,1409=>643,1410=>479,1411=>934,1412=>647,1413=>620,1414=>813,1415=>812,1417=>360,1418=>374,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>374,1471=>0,1472=>334,1473=>0,1474=>0,1475=>334,1478=>447,1479=>0,1488=>655,1489=>549,1490=>402,1491=>529,1492=>618,1493=>309,1494=>360,1495=>618,1496=>611,1497=>265,1498=>520,1499=>510,1500=>544,1501=>626,1502=>651,1503=>309,1504=>408,1505=>611,1506=>599,1507=>607,1508=>592,1509=>595,1510=>587,1511=>663,1512=>542,1513=>673,1514=>615,1520=>598,1521=>598,1522=>597,1523=>399,1524=>639,3647=>626,3713=>734,3714=>673,3716=>674,3719=>512,3720=>668,3722=>669,3725=>685,3732=>635,3733=>633,3734=>672,3735=>737,3737=>657,3738=>654,3739=>654,3740=>830,3741=>744,3742=>779,3743=>779,3745=>752,3746=>685,3747=>692,3749=>691,3751=>642,3754=>744,3755=>928,3757=>651,3758=>705,3759=>840,3760=>620,3761=>0,3762=>549,3763=>549,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0,3769=>0,3771=>0,3772=>0,3773=>603,3776=>464,3777=>774,3778=>464,3779=>584,3780=>569,3782=>683,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>694,3793=>694,3794=>624,3795=>752,3796=>655,3797=>655,3798=>764,3799=>710,3800=>683,3801=>818,3804=>1227,3805=>1227,4256=>826,4257=>669,4258=>665,4259=>753,4260=>584,4261=>696,4262=>771,4263=>800,4264=>477,4265=>570,4266=>771,4267=>810,4268=>579,4269=>813,4270=>732,4271=>677,4272=>782,4273=>579,4274=>579,4275=>797,4276=>797,4277=>660,4278=>587,4279=>579,4280=>582,4281=>579,4282=>710,4283=>812,4284=>570,4285=>557,4286=>579,4287=>700,4288=>802,4289=>541,4290=>668,4291=>554,4292=>570,4293=>668,4304=>497,4305=>497,4306=>536,4307=>734,4308=>505,4309=>506,4310=>497,4311=>744,4312=>497,4313=>488,4314=>967,4315=>506,4316=>507,4317=>730,4318=>497,4319=>532,4320=>740,4321=>506,4322=>621,4323=>525,4324=>732,4325=>505,4326=>731,4327=>506,4328=>506,4329=>507,4330=>568,4331=>506,4332=>506,4333=>497,4334=>506,4335=>506,4336=>501,4337=>543,4338=>497,4339=>497,4340=>497,4341=>544,4342=>767,4343=>571,4344=>506,4345=>536,4346=>487,4347=>615,4348=>331,5121=>696,5122=>696,5123=>696,5124=>696,5125=>814,5126=>814,5127=>814,5129=>814,5130=>814,5131=>814,5132=>916,5133=>908,5134=>916,5135=>908,5136=>916,5137=>908,5138=>1034,5139=>1025,5140=>1034,5141=>1025,5142=>814,5143=>1034,5144=>1028,5145=>1034,5146=>1028,5147=>814,5149=>278,5150=>476,5151=>382,5152=>382,5153=>355,5154=>355,5155=>355,5156=>355,5157=>507,5158=>423,5159=>278,5160=>355,5161=>355,5162=>355,5163=>1092,5164=>888,5165=>1094,5166=>1167,5167=>696,5168=>696,5169=>696,5170=>696,5171=>797,5172=>797,5173=>797,5175=>797,5176=>797,5177=>797,5178=>916,5179=>908,5180=>916,5181=>908,5182=>916,5183=>908,5184=>1034,5185=>1025,5186=>1034,5187=>1025,5188=>1034,5189=>1028,5190=>1034,5191=>1028,5192=>797,5193=>518,5194=>206,5196=>730,5197=>730,5198=>730,5199=>730,5200=>734,5201=>734,5202=>734,5204=>734,5205=>734,5206=>734,5207=>950,5208=>943,5209=>950,5210=>943,5211=>950,5212=>943,5213=>954,5214=>949,5215=>954,5216=>949,5217=>954,5218=>946,5219=>954,5220=>946,5221=>954,5222=>435,5223=>904,5224=>904,5225=>921,5226=>915,5227=>668,5228=>668,5229=>668,5230=>668,5231=>668,5232=>668,5233=>668,5234=>668,5235=>668,5236=>926,5237=>877,5238=>882,5239=>877,5240=>882,5241=>877,5242=>926,5243=>877,5244=>926,5245=>877,5246=>882,5247=>877,5248=>882,5249=>877,5250=>882,5251=>451,5252=>451,5253=>844,5254=>844,5255=>844,5256=>844,5257=>668,5258=>668,5259=>668,5260=>668,5261=>668,5262=>668,5263=>668,5264=>668,5265=>668,5266=>926,5267=>877,5268=>926,5269=>877,5270=>926,5271=>877,5272=>926,5273=>877,5274=>926,5275=>877,5276=>926,5277=>877,5278=>926,5279=>877,5280=>926,5281=>451,5282=>451,5283=>563,5284=>563,5285=>563,5286=>563,5287=>563,5288=>563,5289=>563,5290=>563,5291=>563,5292=>793,5293=>769,5294=>777,5295=>786,5296=>777,5297=>786,5298=>793,5299=>786,5300=>793,5301=>786,5302=>777,5303=>786,5304=>777,5305=>786,5306=>777,5307=>392,5308=>493,5309=>392,5312=>889,5313=>889,5314=>889,5315=>889,5316=>838,5317=>838,5318=>838,5319=>838,5320=>838,5321=>1114,5322=>1122,5323=>1080,5324=>1105,5325=>1080,5326=>1105,5327=>838,5328=>593,5329=>447,5330=>593,5331=>889,5332=>889,5333=>889,5334=>889,5335=>838,5336=>838,5337=>838,5338=>838,5339=>838,5340=>1107,5341=>1122,5342=>1155,5343=>1105,5344=>1155,5345=>1105,5346=>1105,5347=>1093,5348=>1105,5349=>1093,5350=>1155,5351=>1105,5352=>1155,5353=>1105,5354=>593,5356=>797,5357=>657,5358=>657,5359=>657,5360=>657,5361=>657,5362=>657,5363=>657,5364=>657,5365=>657,5366=>897,5367=>862,5368=>870,5369=>890,5370=>870,5371=>890,5372=>897,5373=>862,5374=>897,5375=>862,5376=>870,5377=>890,5378=>870,5379=>890,5380=>870,5381=>443,5382=>414,5383=>443,5392=>831,5393=>831,5394=>831,5395=>1022,5396=>1022,5397=>1022,5398=>1022,5399=>1088,5400=>1081,5401=>1088,5402=>1081,5403=>1088,5404=>1081,5405=>1288,5406=>1278,5407=>1288,5408=>1278,5409=>1288,5410=>1278,5411=>1288,5412=>1278,5413=>671,5414=>698,5415=>698,5416=>698,5417=>698,5418=>698,5419=>698,5420=>698,5421=>698,5422=>698,5423=>902,5424=>903,5425=>911,5426=>896,5427=>911,5428=>896,5429=>902,5430=>903,5431=>902,5432=>903,5433=>911,5434=>896,5435=>911,5436=>896,5437=>911,5438=>445,5440=>355,5441=>458,5442=>929,5443=>929,5444=>878,5445=>878,5446=>878,5447=>878,5448=>659,5449=>659,5450=>659,5451=>659,5452=>659,5453=>659,5454=>902,5455=>863,5456=>445,5458=>797,5459=>696,5460=>696,5461=>696,5462=>696,5463=>835,5464=>835,5465=>835,5466=>835,5467=>1055,5468=>1028,5469=>542,5470=>730,5471=>730,5472=>730,5473=>730,5474=>730,5475=>730,5476=>734,5477=>734,5478=>734,5479=>734,5480=>954,5481=>946,5482=>493,5492=>879,5493=>879,5494=>879,5495=>879,5496=>879,5497=>879,5498=>879,5499=>556,5500=>753,5501=>458,5502=>1114,5503=>1114,5504=>1114,5505=>1114,5506=>1114,5507=>1114,5508=>1114,5509=>890,5514=>879,5515=>879,5516=>879,5517=>879,5518=>1432,5519=>1432,5520=>1432,5521=>1165,5522=>1165,5523=>1432,5524=>1432,5525=>763,5526=>1146,5536=>889,5537=>889,5538=>838,5539=>838,5540=>838,5541=>838,5542=>593,5543=>698,5544=>698,5545=>698,5546=>698,5547=>698,5548=>698,5549=>698,5550=>445,5551=>668,5598=>747,5601=>747,5702=>446,5703=>446,5742=>371,5743=>1114,5744=>1432,5745=>1814,5746=>1814,5747=>1548,5748=>1510,5749=>1814,5750=>1814,7424=>586,7425=>750,7426=>943,7427=>547,7428=>533,7429=>608,7430=>608,7431=>502,7432=>501,7433=>308,7434=>444,7435=>598,7436=>485,7437=>735,7438=>630,7439=>618,7440=>533,7441=>594,7442=>594,7443=>594,7444=>984,7446=>618,7447=>618,7448=>500,7449=>578,7450=>578,7451=>521,7452=>571,7453=>663,7454=>853,7455=>625,7456=>586,7457=>831,7458=>523,7459=>581,7462=>485,7463=>586,7464=>622,7465=>500,7466=>703,7467=>659,7468=>438,7469=>615,7470=>432,7472=>470,7473=>387,7474=>387,7475=>465,7476=>474,7477=>211,7478=>211,7479=>439,7480=>361,7481=>563,7482=>474,7483=>474,7484=>481,7485=>458,7486=>415,7487=>436,7488=>387,7489=>460,7490=>625,7491=>412,7492=>412,7493=>431,7494=>641,7495=>431,7496=>431,7497=>431,7498=>431,7499=>347,7500=>347,7501=>431,7502=>197,7503=>438,7504=>597,7505=>410,7506=>439,7507=>372,7508=>439,7509=>439,7510=>431,7511=>349,7512=>410,7513=>416,7514=>597,7515=>451,7517=>405,7518=>386,7519=>389,7520=>443,7521=>365,7522=>197,7523=>284,7524=>410,7525=>451,7526=>405,7527=>386,7528=>405,7529=>443,7530=>365,7543=>644,7544=>474,7547=>491,7549=>672,7557=>462,7579=>431,7580=>372,7581=>372,7582=>439,7583=>347,7584=>339,7585=>313,7586=>431,7587=>410,7588=>312,7589=>253,7590=>312,7591=>312,7592=>388,7593=>293,7594=>296,7595=>333,7596=>598,7597=>597,7598=>505,7599=>505,7600=>403,7601=>439,7602=>488,7603=>379,7604=>356,7605=>349,7606=>524,7607=>444,7608=>359,7609=>405,7610=>451,7611=>375,7612=>471,7613=>422,7614=>409,7615=>382,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>696,7681=>607,7682=>686,7683=>644,7684=>686,7685=>644,7686=>686,7687=>644,7688=>660,7689=>533,7690=>747,7691=>644,7692=>747,7693=>644,7694=>747,7695=>644,7696=>747,7697=>644,7698=>747,7699=>644,7700=>615,7701=>610,7702=>615,7703=>610,7704=>615,7705=>610,7706=>615,7707=>610,7708=>615,7709=>610,7710=>615,7711=>391,7712=>738,7713=>644,7714=>753,7715=>641,7716=>753,7717=>641,7718=>753,7719=>641,7720=>753,7721=>641,7722=>753,7723=>641,7724=>334,7725=>308,7726=>334,7727=>308,7728=>697,7729=>598,7730=>697,7731=>598,7732=>697,7733=>598,7734=>573,7735=>308,7736=>573,7737=>308,7738=>573,7739=>308,7740=>573,7741=>308,7742=>896,7743=>938,7744=>896,7745=>938,7746=>896,7747=>938,7748=>753,7749=>641,7750=>753,7751=>641,7752=>753,7753=>641,7754=>753,7755=>641,7756=>765,7757=>618,7758=>765,7759=>618,7760=>765,7761=>618,7762=>765,7763=>618,7764=>659,7765=>644,7766=>659,7767=>644,7768=>693,7769=>444,7770=>693,7771=>444,7772=>693,7773=>444,7774=>693,7775=>444,7776=>648,7777=>536,7778=>648,7779=>536,7780=>648,7781=>536,7782=>648,7783=>536,7784=>648,7785=>536,7786=>614,7787=>430,7788=>614,7789=>430,7790=>614,7791=>430,7792=>614,7793=>430,7794=>730,7795=>641,7796=>730,7797=>641,7798=>730,7799=>641,7800=>730,7801=>641,7802=>730,7803=>641,7804=>696,7805=>586,7806=>696,7807=>586,7808=>993,7809=>831,7810=>993,7811=>831,7812=>993,7813=>831,7814=>993,7815=>831,7816=>993,7817=>831,7818=>694,7819=>580,7820=>694,7821=>580,7822=>651,7823=>586,7824=>652,7825=>523,7826=>652,7827=>523,7828=>652,7829=>523,7830=>641,7831=>430,7832=>831,7833=>586,7834=>607,7835=>391,7836=>391,7837=>391,7838=>806,7839=>618,7840=>696,7841=>607,7842=>696,7843=>607,7844=>696,7845=>607,7846=>696,7847=>607,7848=>696,7849=>607,7850=>696,7851=>607,7852=>696,7853=>607,7854=>696,7855=>607,7856=>696,7857=>607,7858=>696,7859=>607,7860=>696,7861=>607,7862=>696,7863=>607,7864=>615,7865=>610,7866=>615,7867=>610,7868=>615,7869=>610,7870=>615,7871=>610,7872=>615,7873=>610,7874=>615,7875=>610,7876=>615,7877=>610,7878=>615,7879=>610,7880=>334,7881=>308,7882=>334,7883=>308,7884=>765,7885=>618,7886=>765,7887=>618,7888=>765,7889=>618,7890=>765,7891=>618,7892=>765,7893=>618,7894=>765,7895=>618,7896=>765,7897=>618,7898=>765,7899=>618,7900=>765,7901=>618,7902=>765,7903=>618,7904=>765,7905=>618,7906=>765,7907=>618,7908=>730,7909=>641,7910=>730,7911=>641,7912=>730,7913=>641,7914=>730,7915=>641,7916=>730,7917=>641,7918=>730,7919=>641,7920=>730,7921=>641,7922=>651,7923=>586,7924=>651,7925=>586,7926=>651,7927=>586,7928=>651,7929=>586,7930=>857,7931=>579,7936=>618,7937=>618,7938=>618,7939=>618,7940=>618,7941=>618,7942=>618,7943=>618,7944=>696,7945=>696,7946=>937,7947=>939,7948=>841,7949=>866,7950=>751,7951=>773,7952=>501,7953=>501,7954=>501,7955=>501,7956=>501,7957=>501,7960=>712,7961=>715,7962=>989,7963=>986,7964=>920,7965=>947,7968=>641,7969=>641,7970=>641,7971=>641,7972=>641,7973=>641,7974=>641,7975=>641,7976=>851,7977=>856,7978=>1125,7979=>1125,7980=>1062,7981=>1085,7982=>948,7983=>956,7984=>351,7985=>351,7986=>351,7987=>351,7988=>351,7989=>351,7990=>351,7991=>351,7992=>435,7993=>440,7994=>699,7995=>707,7996=>641,7997=>664,7998=>544,7999=>544,8000=>618,8001=>618,8002=>618,8003=>618,8004=>618,8005=>618,8008=>802,8009=>839,8010=>1099,8011=>1101,8012=>947,8013=>974,8016=>607,8017=>607,8018=>607,8019=>607,8020=>607,8021=>607,8022=>607,8023=>607,8025=>837,8027=>1065,8029=>1079,8031=>944,8032=>782,8033=>782,8034=>782,8035=>782,8036=>782,8037=>782,8038=>782,8039=>782,8040=>817,8041=>862,8042=>1121,8043=>1126,8044=>968,8045=>994,8046=>925,8047=>968,8048=>618,8049=>618,8050=>501,8051=>501,8052=>641,8053=>641,8054=>351,8055=>351,8056=>618,8057=>618,8058=>607,8059=>607,8060=>782,8061=>782,8064=>618,8065=>618,8066=>618,8067=>618,8068=>618,8069=>618,8070=>618,8071=>618,8072=>696,8073=>696,8074=>937,8075=>939,8076=>841,8077=>866,8078=>751,8079=>773,8080=>641,8081=>641,8082=>641,8083=>641,8084=>641,8085=>641,8086=>641,8087=>641,8088=>851,8089=>856,8090=>1125,8091=>1125,8092=>1062,8093=>1085,8094=>948,8095=>956,8096=>782,8097=>782,8098=>782,8099=>782,8100=>782,8101=>782,8102=>782,8103=>782,8104=>817,8105=>862,8106=>1121,8107=>1126,8108=>968,8109=>994,8110=>925,8111=>968,8112=>618,8113=>618,8114=>618,8115=>618,8116=>618,8118=>618,8119=>618,8120=>696,8121=>696,8122=>789,8123=>717,8124=>696,8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>641,8131=>641,8132=>641,8134=>641,8135=>641,8136=>836,8137=>761,8138=>972,8139=>908,8140=>753,8141=>450,8142=>450,8143=>450,8144=>351,8145=>351,8146=>351,8147=>351,8150=>351,8151=>351,8152=>334,8153=>334,8154=>559,8155=>507,8157=>450,8158=>450,8159=>450,8160=>607,8161=>607,8162=>607,8163=>607,8164=>644,8165=>644,8166=>607,8167=>607,8168=>651,8169=>651,8170=>918,8171=>882,8172=>754,8173=>450,8174=>450,8175=>450,8178=>782,8179=>782,8180=>782,8182=>782,8183=>782,8184=>958,8185=>801,8186=>976,8187=>804,8188=>765,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>626,8200=>342,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>374,8209=>374,8210=>626,8211=>450,8212=>900,8213=>900,8214=>450,8215=>450,8216=>342,8217=>342,8218=>342,8219=>342,8220=>580,8221=>580,8222=>580,8223=>591,8224=>450,8225=>450,8226=>575,8227=>575,8228=>342,8229=>616,8230=>900,8231=>313,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180,8240=>1309,8241=>1717,8242=>237,8243=>402,8244=>567,8245=>237,8246=>402,8247=>567,8248=>659,8249=>371,8250=>371,8251=>875,8252=>564,8253=>522,8254=>450,8255=>745,8256=>745,8257=>296,8258=>920,8259=>450,8260=>150,8261=>411,8262=>411,8263=>927,8264=>746,8265=>746,8266=>461,8267=>618,8268=>450,8269=>450,8270=>470,8271=>360,8272=>745,8273=>470,8274=>500,8275=>754,8276=>745,8277=>754,8278=>615,8279=>731,8280=>754,8281=>754,8282=>342,8283=>784,8284=>754,8285=>342,8286=>342,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>394,8305=>197,8308=>394,8309=>394,8310=>394,8311=>394,8312=>394,8313=>394,8314=>475,8315=>475,8316=>475,8317=>259,8318=>259,8319=>410,8320=>394,8321=>394,8322=>394,8323=>394,8324=>394,8325=>394,8326=>394,8327=>394,8328=>394,8329=>394,8330=>475,8331=>475,8332=>475,8333=>259,8334=>259,8336=>412,8337=>431,8338=>439,8339=>371,8340=>431,8341=>410,8342=>438,8343=>197,8344=>597,8345=>410,8346=>431,8347=>343,8348=>349,8352=>836,8353=>626,8354=>626,8355=>626,8356=>626,8357=>938,8358=>753,8359=>1339,8360=>1084,8361=>993,8362=>768,8363=>626,8364=>626,8365=>626,8366=>626,8367=>1252,8368=>626,8369=>626,8370=>626,8371=>626,8372=>773,8373=>626,8376=>626,8377=>626,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>995,8449=>995,8450=>660,8451=>1090,8452=>807,8453=>1002,8454=>1033,8455=>626,8456=>628,8457=>856,8459=>965,8460=>822,8461=>799,8462=>641,8463=>641,8464=>537,8465=>627,8466=>771,8467=>424,8468=>876,8469=>753,8470=>1083,8471=>900,8472=>627,8473=>675,8474=>765,8475=>844,8476=>732,8477=>721,8478=>807,8479=>639,8480=>917,8481=>1115,8482=>900,8483=>751,8484=>679,8485=>560,8486=>765,8487=>692,8488=>686,8489=>272,8490=>697,8491=>696,8492=>835,8493=>736,8494=>769,8495=>572,8496=>656,8497=>727,8498=>615,8499=>1065,8500=>418,8501=>714,8502=>658,8503=>444,8504=>615,8505=>342,8506=>851,8507=>1232,8508=>710,8509=>663,8510=>589,8511=>776,8512=>756,8513=>707,8514=>518,8515=>573,8516=>684,8517=>747,8518=>644,8519=>610,8520=>308,8521=>308,8523=>785,8526=>492,8528=>932,8529=>932,8530=>1334,8531=>932,8532=>932,8533=>932,8534=>932,8535=>932,8536=>932,8537=>932,8538=>932,8539=>932,8540=>932,8541=>932,8542=>932,8543=>554,8544=>334,8545=>593,8546=>851,8547=>989,8548=>696,8549=>989,8550=>1247,8551=>1505,8552=>1008,8553=>694,8554=>1008,8555=>1266,8556=>573,8557=>660,8558=>747,8559=>896,8560=>308,8561=>546,8562=>785,8563=>885,8564=>586,8565=>866,8566=>1104,8567=>1342,8568=>872,8569=>580,8570=>872,8571=>1110,8572=>308,8573=>533,8574=>644,8575=>938,8576=>1160,8577=>747,8578=>1160,8579=>660,8580=>533,8581=>660,8585=>932,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754,8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754,8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754,8620=>754,8621=>754,8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754,8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754,8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754,8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754,8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754,8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754,8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754,8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754,8700=>754,8701=>754,8702=>754,8703=>754,8704=>696,8705=>626,8706=>489,8707=>615,8708=>615,8709=>771,8710=>627,8711=>627,8712=>807,8713=>807,8714=>675,8715=>807,8716=>807,8717=>675,8718=>572,8719=>708,8720=>708,8721=>646,8722=>754,8723=>754,8724=>626,8725=>329,8726=>626,8727=>754,8728=>563,8729=>342,8730=>600,8731=>600,8732=>600,8733=>641,8734=>750,8735=>754,8736=>807,8737=>807,8738=>754,8739=>450,8740=>450,8741=>450,8742=>450,8743=>730,8744=>730,8745=>730,8746=>730,8747=>549,8748=>835,8749=>1165,8750=>506,8751=>879,8752=>1181,8753=>506,8754=>506,8755=>506,8756=>626,8757=>626,8758=>264,8759=>626,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754,8766=>754,8767=>754,8768=>337,8769=>754,8770=>754,8771=>754,8772=>754,8773=>754,8774=>754,8775=>754,8776=>754,8777=>754,8778=>754,8779=>754,8780=>754,8781=>754,8782=>754,8783=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>956,8789=>956,8790=>754,8791=>754,8792=>754,8793=>754,8794=>754,8795=>754,8796=>754,8797=>754,8798=>754,8799=>754,8800=>754,8801=>754,8802=>754,8803=>754,8804=>754,8805=>754,8806=>754,8807=>754,8808=>756,8809=>756,8810=>942,8811=>942,8812=>450,8813=>754,8814=>754,8815=>754,8816=>754,8817=>754,8818=>754,8819=>754,8820=>754,8821=>754,8822=>754,8823=>754,8824=>754,8825=>754,8826=>754,8827=>754,8828=>754,8829=>754,8830=>754,8831=>754,8832=>754,8833=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8840=>754,8841=>754,8842=>754,8843=>754,8844=>730,8845=>730,8846=>730,8847=>754,8848=>754,8849=>754,8850=>754,8851=>716,8852=>716,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754,8865=>754,8866=>822,8867=>822,8868=>822,8869=>822,8870=>488,8871=>488,8872=>822,8873=>822,8874=>822,8875=>822,8876=>822,8877=>822,8878=>822,8879=>822,8880=>754,8881=>754,8882=>754,8883=>754,8884=>754,8885=>754,8886=>900,8887=>900,8888=>754,8889=>754,8890=>488,8891=>730,8892=>730,8893=>730,8894=>754,8895=>754,8896=>758,8897=>758,8898=>758,8899=>758,8900=>444,8901=>342,8902=>563,8903=>754,8904=>900,8905=>900,8906=>900,8907=>900,8908=>900,8909=>754,8910=>730,8911=>730,8912=>754,8913=>754,8914=>754,8915=>754,8916=>754,8917=>754,8918=>754,8919=>754,8920=>1280,8921=>1280,8922=>754,8923=>754,8924=>754,8925=>754,8926=>754,8927=>754,8928=>754,8929=>754,8930=>754,8931=>754,8932=>754,8933=>754,8934=>754,8935=>754,8936=>754,8937=>754,8938=>754,8939=>754,8940=>754,8941=>754,8942=>900,8943=>900,8944=>900,8945=>900,8946=>1042,8947=>807,8948=>675,8949=>807,8950=>807,8951=>675,8952=>807,8953=>807,8954=>1042,8955=>807,8956=>675,8957=>807,8958=>675,8959=>807,8960=>542,8961=>542,8962=>644,8963=>754,8964=>754,8965=>754,8966=>754,8967=>439,8968=>411,8969=>411,8970=>411,8971=>411,8972=>728,8973=>728,8974=>728,8975=>728,8976=>754,8977=>484,8984=>835,8985=>754,8988=>422,8989=>422,8990=>422,8991=>422,8992=>549,8993=>549,8996=>1037,8997=>1037,8998=>1272,8999=>1037,9000=>1299,9003=>1272,9004=>786,9075=>351,9076=>644,9077=>782,9082=>618,9085=>776,9095=>1037,9108=>786,9115=>450,9116=>450,9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450,9125=>450,9126=>450,9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>549,9166=>754,9167=>850,9187=>786,9189=>692,9192=>626,9250=>644,9251=>644,9312=>762,9313=>762,9314=>762,9315=>762,9316=>762,9317=>762,9318=>762,9319=>762,9320=>762,9321=>762,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474,9687=>474,9688=>756,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>692,9697=>692,9698=>692,9699=>692,9700=>692,9701=>692,9702=>575,9703=>850,9704=>850,9705=>850,9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659,9727=>692,9728=>807,9729=>900,9730=>807,9731=>807,9732=>807,9733=>807,9734=>807,9735=>515,9736=>806,9737=>807,9738=>799,9739=>799,9740=>604,9741=>911,9742=>1121,9743=>1125,9744=>807,9745=>807,9746=>807,9747=>479,9748=>807,9749=>807,9750=>807,9751=>807,9752=>807,9753=>807,9754=>807,9755=>807,9756=>807,9757=>548,9758=>807,9759=>548,9760=>807,9761=>807,9762=>807,9763=>807,9764=>602,9765=>671,9766=>584,9767=>705,9768=>490,9769=>807,9770=>807,9771=>807,9772=>639,9773=>807,9774=>807,9775=>807,9776=>807,9777=>807,9778=>807,9779=>807,9780=>807,9781=>807,9782=>807,9783=>807,9784=>807,9785=>938,9786=>938,9787=>938,9788=>807,9789=>807,9790=>807,9791=>552,9792=>659,9793=>659,9794=>807,9795=>807,9796=>807,9797=>807,9798=>807,9799=>807,9800=>807,9801=>807,9802=>807,9803=>807,9804=>807,9805=>807,9806=>807,9807=>807,9808=>807,9809=>807,9810=>807,9811=>807,9812=>807,9813=>807,9814=>807,9815=>807,9816=>807,9817=>807,9818=>807,9819=>807,9820=>807,9821=>807,9822=>807,9823=>807,9824=>807,9825=>807,9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9832=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424,9838=>321,9839=>435,9840=>673,9841=>689,9842=>807,9843=>807,9844=>807,9845=>807,9846=>807,9847=>807,9848=>807,9849=>807,9850=>807,9851=>807,9852=>807,9853=>807,9854=>807,9855=>807,9856=>782,9857=>782,9858=>782,9859=>782,9860=>782,9861=>782,9862=>807,9863=>807,9864=>807,9865=>807,9866=>807,9867=>807,9868=>807,9869=>807,9870=>807,9871=>807,9872=>807,9873=>807,9874=>807,9875=>807,9876=>807,9877=>487,9878=>807,9879=>807,9880=>807,9881=>807,9882=>807,9883=>807,9884=>807,9888=>807,9889=>632,9890=>904,9891=>980,9892=>1057,9893=>813,9894=>754,9895=>754,9896=>754,9897=>754,9898=>754,9899=>754,9900=>754,9901=>754,9902=>754,9903=>754,9904=>759,9905=>754,9906=>659,9907=>659,9908=>659,9909=>659,9910=>765,9911=>659,9912=>659,9920=>754,9921=>754,9922=>754,9923=>754,9954=>659,9985=>754,9986=>754,9987=>754,9988=>754,9990=>754,9991=>754,9992=>754,9993=>754,9996=>754,9997=>754,9998=>754,9999=>754,10000=>754,10001=>754,10002=>754,10003=>754,10004=>754,10005=>754,10006=>754,10007=>754,10008=>754,10009=>754,10010=>754,10011=>754,10012=>754,10013=>754,10014=>754,10015=>754,10016=>754,10017=>754,10018=>754,10019=>754,10020=>754,10021=>754,10022=>754,10023=>754,10025=>754,10026=>754,10027=>754,10028=>754,10029=>754,10030=>754,10031=>754,10032=>754,10033=>754,10034=>754,10035=>754,10036=>754,10037=>754,10038=>754,10039=>754,10040=>754,10041=>754,10042=>754,10043=>754,10044=>754,10045=>754,10046=>754,10047=>754,10048=>754,10049=>754,10050=>754,10051=>754,10052=>754,10053=>754,10054=>754,10055=>754,10056=>754,10057=>754,10058=>754,10059=>754,10061=>807,10063=>807,10064=>807,10065=>807,10066=>807,10070=>807,10072=>754,10073=>754,10074=>754,10075=>290,10076=>290,10077=>484,10078=>484,10081=>754,10082=>754,10083=>754,10084=>754,10085=>754,10086=>754,10087=>754,10088=>754,10089=>754,10090=>754,10091=>754,10092=>754,10093=>754,10094=>754,10095=>754,10096=>754,10097=>754,10098=>754,10099=>754,10100=>754,10101=>754,10102=>762,10103=>762,10104=>762,10105=>762,10106=>762,10107=>762,10108=>762,10109=>762,10110=>762,10111=>762,10112=>754,10113=>754,10114=>754,10115=>754,10116=>754,10117=>754,10118=>754,10119=>754,10120=>754,10121=>754,10122=>754,10123=>754,10124=>754,10125=>754,10126=>754,10127=>754,10128=>754,10129=>754,10130=>754,10131=>754,10132=>754,10136=>754,10137=>754,10138=>754,10139=>754,10140=>754,10141=>754,10142=>754,10143=>754,10144=>754,10145=>754,10146=>754,10147=>754,10148=>754,10149=>754,10150=>754,10151=>754,10152=>754,10153=>754,10154=>754,10155=>754,10156=>754,10157=>754,10158=>754,10159=>754,10161=>754,10162=>754,10163=>754,10164=>754,10165=>754,10166=>754,10167=>754,10168=>754,10169=>754,10170=>754,10171=>754,10172=>754,10173=>754,10174=>754,10181=>411,10182=>411,10208=>444,10214=>438,10215=>438,10216=>411,10217=>411,10218=>648,10219=>648,10224=>754,10225=>754,10226=>754,10227=>754,10228=>1042,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290,10237=>1290,10238=>1290,10239=>1290,10240=>703,10241=>703,10242=>703,10243=>703,10244=>703,10245=>703,10246=>703,10247=>703,10248=>703,10249=>703,10250=>703,10251=>703,10252=>703,10253=>703,10254=>703,10255=>703,10256=>703,10257=>703,10258=>703,10259=>703,10260=>703,10261=>703,10262=>703,10263=>703,10264=>703,10265=>703,10266=>703,10267=>703,10268=>703,10269=>703,10270=>703,10271=>703,10272=>703,10273=>703,10274=>703,10275=>703,10276=>703,10277=>703,10278=>703,10279=>703,10280=>703,10281=>703,10282=>703,10283=>703,10284=>703,10285=>703,10286=>703,10287=>703,10288=>703,10289=>703,10290=>703,10291=>703,10292=>703,10293=>703,10294=>703,10295=>703,10296=>703,10297=>703,10298=>703,10299=>703,10300=>703,10301=>703,10302=>703,10303=>703,10304=>703,10305=>703,10306=>703,10307=>703,10308=>703,10309=>703,10310=>703,10311=>703,10312=>703,10313=>703,10314=>703,10315=>703,10316=>703,10317=>703,10318=>703,10319=>703,10320=>703,10321=>703,10322=>703,10323=>703,10324=>703,10325=>703,10326=>703,10327=>703,10328=>703,10329=>703,10330=>703,10331=>703,10332=>703,10333=>703,10334=>703,10335=>703,10336=>703,10337=>703,10338=>703,10339=>703,10340=>703,10341=>703,10342=>703,10343=>703,10344=>703,10345=>703,10346=>703,10347=>703,10348=>703,10349=>703,10350=>703,10351=>703,10352=>703,10353=>703,10354=>703,10355=>703,10356=>703,10357=>703,10358=>703,10359=>703,10360=>703,10361=>703,10362=>703,10363=>703,10364=>703,10365=>703,10366=>703,10367=>703,10368=>703,10369=>703,10370=>703,10371=>703,10372=>703,10373=>703,10374=>703,10375=>703,10376=>703,10377=>703,10378=>703,10379=>703,10380=>703,10381=>703,10382=>703,10383=>703,10384=>703,10385=>703,10386=>703,10387=>703,10388=>703,10389=>703,10390=>703,10391=>703,10392=>703,10393=>703,10394=>703,10395=>703,10396=>703,10397=>703,10398=>703,10399=>703,10400=>703,10401=>703,10402=>703,10403=>703,10404=>703,10405=>703,10406=>703,10407=>703,10408=>703,10409=>703,10410=>703,10411=>703,10412=>703,10413=>703,10414=>703,10415=>703,10416=>703,10417=>703,10418=>703,10419=>703,10420=>703,10421=>703,10422=>703,10423=>703,10424=>703,10425=>703,10426=>703,10427=>703,10428=>703,10429=>703,10430=>703,10431=>703,10432=>703,10433=>703,10434=>703,10435=>703,10436=>703,10437=>703,10438=>703,10439=>703,10440=>703,10441=>703,10442=>703,10443=>703,10444=>703,10445=>703,10446=>703,10447=>703,10448=>703,10449=>703,10450=>703,10451=>703,10452=>703,10453=>703,10454=>703,10455=>703,10456=>703,10457=>703,10458=>703,10459=>703,10460=>703,10461=>703,10462=>703,10463=>703,10464=>703,10465=>703,10466=>703,10467=>703,10468=>703,10469=>703,10470=>703,10471=>703,10472=>703,10473=>703,10474=>703,10475=>703,10476=>703,10477=>703,10478=>703,10479=>703,10480=>703,10481=>703,10482=>703,10483=>703,10484=>703,10485=>703,10486=>703,10487=>703,10488=>703,10489=>703,10490=>703,10491=>703,10492=>703,10493=>703,10494=>703,10495=>703,10502=>754,10503=>754,10506=>754,10507=>754,10560=>754,10561=>754,10627=>678,10628=>678,10702=>754,10703=>941,10704=>941,10705=>900,10706=>900,10707=>900,10708=>900,10709=>900,10731=>444,10746=>754,10747=>754,10752=>900,10753=>900,10754=>900,10764=>1495,10765=>506,10766=>506,10767=>506,10768=>506,10769=>506,10770=>506,10771=>506,10772=>506,10773=>506,10774=>506,10775=>506,10776=>506,10777=>506,10778=>506,10779=>506,10780=>506,10799=>754,10877=>754,10878=>754,10879=>754,10880=>754,10881=>754,10882=>754,10883=>754,10884=>754,10885=>754,10886=>754,10887=>754,10888=>754,10889=>754,10890=>754,10891=>754,10892=>754,10893=>754,10894=>754,10895=>754,10896=>754,10897=>754,10898=>754,10899=>754,10900=>754,10901=>754,10902=>754,10903=>754,10904=>754,10905=>754,10906=>754,10907=>754,10908=>754,10909=>754,10910=>754,10911=>754,10912=>754,10926=>754,10927=>754,10928=>754,10929=>754,10930=>754,10931=>754,10932=>754,10933=>754,10934=>754,10935=>754,10936=>754,10937=>754,10938=>754,11001=>754,11002=>754,11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754,11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754,11026=>850,11027=>850,11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11039=>782,11040=>782,11041=>786,11042=>786,11043=>786,11044=>1007,11091=>782,11092=>782,11360=>573,11361=>324,11362=>573,11363=>659,11364=>693,11365=>607,11366=>430,11367=>860,11368=>641,11369=>697,11370=>598,11371=>652,11372=>523,11373=>774,11374=>896,11375=>696,11376=>774,11377=>700,11378=>1099,11379=>950,11380=>586,11381=>628,11382=>508,11383=>704,11385=>484,11386=>618,11387=>502,11388=>197,11389=>438,11390=>648,11391=>652,11800=>527,11810=>411,11811=>411,11812=>411,11813=>411,11822=>522,19904=>807,19905=>807,19906=>807,19907=>807,19908=>807,19909=>807,19910=>807,19911=>807,19912=>807,19913=>807,19914=>807,19915=>807,19916=>807,19917=>807,19918=>807,19919=>807,19920=>807,19921=>807,19922=>807,19923=>807,19924=>807,19925=>807,19926=>807,19927=>807,19928=>807,19929=>807,19930=>807,19931=>807,19932=>807,19933=>807,19934=>807,19935=>807,19936=>807,19937=>807,19938=>807,19939=>807,19940=>807,19941=>807,19942=>807,19943=>807,19944=>807,19945=>807,19946=>807,19947=>807,19948=>807,19949=>807,19950=>807,19951=>807,19952=>807,19953=>807,19954=>807,19955=>807,19956=>807,19957=>807,19958=>807,19959=>807,19960=>807,19961=>807,19962=>807,19963=>807,19964=>807,19965=>807,19966=>807,19967=>807,42564=>648,42565=>536,42566=>392,42567=>396,42572=>1265,42573=>1055,42576=>1110,42577=>924,42580=>1056,42581=>875,42582=>990,42583=>872,42594=>990,42595=>846,42596=>986,42597=>823,42598=>1134,42599=>896,42600=>765,42601=>618,42602=>933,42603=>781,42604=>1266,42605=>995,42606=>865,42634=>849,42635=>673,42636=>614,42637=>521,42644=>727,42645=>641,42760=>450,42761=>450,42762=>450,42763=>450,42764=>450,42765=>450,42766=>450,42767=>450,42768=>450,42769=>450,42770=>450,42771=>450,42772=>450,42773=>450,42774=>450,42779=>360,42780=>360,42781=>258,42782=>258,42783=>258,42786=>399,42787=>351,42788=>486,42789=>486,42790=>753,42791=>641,42792=>928,42793=>771,42794=>626,42795=>501,42800=>502,42801=>536,42802=>1214,42803=>946,42804=>1156,42805=>958,42806=>1120,42807=>947,42808=>971,42809=>830,42810=>971,42811=>830,42812=>932,42813=>830,42814=>628,42815=>494,42822=>765,42823=>488,42824=>614,42825=>478,42826=>826,42827=>732,42830=>1266,42831=>995,42832=>659,42833=>644,42834=>853,42835=>843,42838=>765,42839=>644,42852=>664,42853=>644,42854=>664,42855=>644,42880=>573,42881=>308,42882=>753,42883=>641,42889=>360,42890=>356,42891=>410,42892=>275,42893=>727,42894=>624,42896=>835,42897=>691,43002=>956,43003=>615,43004=>659,43005=>896,43006=>334,43007=>1192,61184=>194,61185=>218,61186=>240,61187=>249,61188=>254,61189=>218,61190=>194,61191=>218,61192=>240,61193=>249,61194=>240,61195=>218,61196=>194,61197=>218,61198=>240,61199=>249,61200=>240,61201=>218,61202=>194,61203=>218,61204=>254,61205=>249,61206=>240,61207=>218,61208=>194,61209=>254,62917=>618,64256=>749,64257=>708,64258=>708,64259=>1024,64260=>1024,64261=>727,64262=>917,64275=>1249,64276=>1245,64277=>1240,64278=>1245,64279=>1542,64285=>265,64286=>0,64287=>597,64288=>598,64289=>845,64290=>709,64291=>828,64292=>707,64293=>771,64294=>782,64295=>739,64296=>801,64297=>754,64298=>673,64299=>673,64300=>673,64301=>673,64302=>655,64303=>655,64304=>655,64305=>549,64306=>402,64307=>529,64308=>618,64309=>309,64310=>360,64311=>900,64312=>611,64313=>392,64314=>520,64315=>510,64316=>544,64317=>900,64318=>651,64319=>900,64320=>408,64321=>611,64322=>900,64323=>607,64324=>592,64325=>900,64326=>587,64327=>663,64328=>542,64329=>673,64330=>615,64331=>309,64332=>549,64333=>510,64334=>592,64335=>639,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1002,65535=>540);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedbi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedbi.z
new file mode 100644
index 00000000..d39eeab0
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedbi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedi.ctg.z
new file mode 100644
index 00000000..4525c434
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedi.php
new file mode 100644
index 00000000..86233dc0
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSansCondensed-Oblique';
+$up=-63;
+$ut=44;
+$dw=540;
+$diff='';
+$originalsize=576004;
+$enc='';
+$file='dejavusanscondensedi.z';
+$ctg='dejavusanscondensedi.ctg.z';
+$desc=array('Flags'=>96,'FontBBox'=>'[-914 -350 1493 1068]','ItalicAngle'=>-11,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>547,'StemV'=>34,'StemH'=>15,'AvgWidth'=>456,'MaxWidth'=>1521,'MissingWidth'=>540);
+$cw=array(0=>540,32=>286,33=>360,34=>414,35=>754,36=>572,37=>855,38=>702,39=>247,40=>351,41=>351,42=>450,43=>754,44=>286,45=>325,46=>286,47=>303,48=>572,49=>572,50=>572,51=>572,52=>572,53=>572,54=>572,55=>572,56=>572,57=>572,58=>303,59=>303,60=>754,61=>754,62=>754,63=>478,64=>900,65=>615,66=>617,67=>628,68=>693,69=>568,70=>518,71=>697,72=>677,73=>265,74=>265,75=>590,76=>501,77=>776,78=>673,79=>708,80=>542,81=>708,82=>625,83=>571,84=>549,85=>659,86=>615,87=>890,88=>616,89=>549,90=>616,91=>351,92=>303,93=>351,94=>754,95=>450,96=>450,97=>551,98=>571,99=>495,100=>571,101=>554,102=>316,103=>571,104=>570,105=>250,106=>250,107=>521,108=>250,109=>876,110=>570,111=>550,112=>571,113=>571,114=>370,115=>469,116=>353,117=>570,118=>532,119=>736,120=>532,121=>532,122=>472,123=>572,124=>303,125=>572,126=>754,160=>286,161=>360,162=>572,163=>572,164=>572,165=>572,166=>303,167=>450,168=>450,169=>900,170=>424,171=>555,172=>754,173=>325,174=>900,175=>450,176=>450,177=>754,178=>360,179=>360,180=>450,181=>572,182=>572,183=>286,184=>450,185=>360,186=>424,187=>555,188=>872,189=>872,190=>872,191=>478,192=>615,193=>615,194=>615,195=>615,196=>615,197=>615,198=>876,199=>628,200=>568,201=>568,202=>568,203=>568,204=>265,205=>265,206=>265,207=>265,208=>697,209=>673,210=>708,211=>708,212=>708,213=>708,214=>708,215=>754,216=>708,217=>659,218=>659,219=>659,220=>659,221=>549,222=>547,223=>567,224=>551,225=>551,226=>551,227=>551,228=>551,229=>551,230=>896,231=>495,232=>554,233=>554,234=>554,235=>554,236=>250,237=>250,238=>250,239=>250,240=>550,241=>570,242=>550,243=>550,244=>550,245=>550,246=>550,247=>754,248=>550,249=>570,250=>570,251=>570,252=>570,253=>532,254=>571,255=>532,256=>615,257=>551,258=>615,259=>551,260=>615,261=>551,262=>628,263=>495,264=>628,265=>495,266=>628,267=>495,268=>628,269=>495,270=>693,271=>571,272=>697,273=>571,274=>568,275=>554,276=>568,277=>554,278=>568,279=>554,280=>568,281=>554,282=>568,283=>554,284=>697,285=>571,286=>697,287=>571,288=>697,289=>571,290=>697,291=>571,292=>677,293=>570,294=>824,295=>625,296=>265,297=>250,298=>265,299=>250,300=>265,301=>250,302=>265,303=>250,304=>265,305=>250,306=>531,307=>500,308=>265,309=>250,310=>590,311=>521,312=>521,313=>501,314=>250,315=>501,316=>250,317=>501,318=>250,319=>501,320=>250,321=>505,322=>258,323=>673,324=>570,325=>673,326=>570,327=>673,328=>570,329=>732,330=>673,331=>570,332=>708,333=>550,334=>708,335=>550,336=>708,337=>550,338=>962,339=>925,340=>625,341=>370,342=>625,343=>370,344=>625,345=>370,346=>571,347=>469,348=>571,349=>469,350=>571,351=>469,352=>571,353=>469,354=>549,355=>353,356=>549,357=>353,358=>549,359=>353,360=>659,361=>570,362=>659,363=>570,364=>659,365=>570,366=>659,367=>570,368=>659,369=>570,370=>659,371=>570,372=>890,373=>736,374=>549,375=>532,376=>549,377=>616,378=>472,379=>616,380=>472,381=>616,382=>472,383=>316,384=>571,385=>661,386=>617,387=>571,388=>617,389=>571,390=>633,391=>628,392=>495,393=>697,394=>737,395=>617,396=>571,397=>550,398=>568,399=>708,400=>553,401=>518,402=>316,403=>697,404=>618,405=>885,406=>318,407=>265,408=>671,409=>521,410=>250,411=>532,412=>876,413=>673,414=>570,415=>708,416=>822,417=>550,418=>844,419=>663,420=>586,421=>571,422=>625,423=>571,424=>469,425=>568,426=>302,427=>353,428=>549,429=>353,430=>549,431=>754,432=>570,433=>688,434=>648,435=>669,436=>657,437=>616,438=>472,439=>599,440=>599,441=>520,442=>472,443=>572,444=>599,445=>520,446=>459,447=>571,448=>265,449=>443,450=>413,451=>266,452=>1310,453=>1165,454=>1043,455=>767,456=>751,457=>500,458=>938,459=>923,460=>820,461=>615,462=>551,463=>265,464=>250,465=>708,466=>550,467=>659,468=>570,469=>659,470=>570,471=>659,472=>570,473=>659,474=>570,475=>659,476=>570,477=>554,478=>615,479=>551,480=>615,481=>551,482=>876,483=>896,484=>697,485=>571,486=>697,487=>571,488=>590,489=>521,490=>708,491=>550,492=>708,493=>550,494=>599,495=>472,496=>250,497=>1310,498=>1165,499=>1043,500=>697,501=>571,502=>1001,503=>614,504=>673,505=>570,506=>615,507=>551,508=>876,509=>896,510=>708,511=>550,512=>615,513=>551,514=>615,515=>551,516=>568,517=>554,518=>568,519=>554,520=>265,521=>250,522=>265,523=>250,524=>708,525=>550,526=>708,527=>550,528=>625,529=>370,530=>625,531=>370,532=>659,533=>570,534=>659,535=>570,536=>571,537=>469,538=>549,539=>353,540=>564,541=>469,542=>677,543=>570,544=>662,545=>754,546=>628,547=>549,548=>616,549=>472,550=>615,551=>551,552=>568,553=>554,554=>708,555=>550,556=>708,557=>550,558=>708,559=>550,560=>708,561=>550,562=>549,563=>532,564=>427,565=>758,566=>429,567=>250,568=>898,569=>898,570=>615,571=>628,572=>495,573=>501,574=>549,575=>469,576=>472,577=>542,578=>431,579=>617,580=>659,581=>615,582=>568,583=>554,584=>265,585=>250,586=>703,587=>571,588=>625,589=>370,590=>549,591=>532,592=>551,593=>571,594=>571,595=>571,596=>495,597=>495,598=>571,599=>654,600=>554,601=>554,602=>759,603=>490,604=>490,605=>698,606=>598,607=>293,608=>626,609=>571,610=>566,611=>536,612=>536,613=>570,614=>570,615=>570,616=>334,617=>348,618=>334,619=>356,620=>438,621=>250,622=>635,623=>876,624=>876,625=>876,626=>581,627=>578,628=>570,629=>550,630=>772,631=>655,632=>593,633=>422,634=>422,635=>422,636=>422,637=>422,638=>477,639=>477,640=>541,641=>541,642=>469,643=>302,644=>302,645=>415,646=>302,647=>353,648=>353,649=>570,650=>556,651=>538,652=>532,653=>736,654=>532,655=>549,656=>472,657=>472,658=>520,659=>520,660=>459,661=>459,662=>459,663=>459,664=>708,665=>521,666=>598,667=>637,668=>588,669=>263,670=>600,671=>456,672=>654,673=>459,674=>459,675=>913,676=>952,677=>911,678=>742,679=>549,680=>700,681=>763,682=>576,683=>589,684=>463,685=>463,686=>513,687=>597,688=>359,689=>359,690=>157,691=>233,692=>266,693=>266,694=>341,695=>463,696=>335,697=>250,698=>414,699=>286,700=>286,701=>286,702=>276,703=>276,704=>333,705=>333,706=>450,707=>450,708=>450,709=>450,710=>450,711=>450,712=>247,713=>450,714=>450,715=>450,716=>247,717=>450,718=>450,719=>450,720=>303,721=>303,722=>276,723=>276,724=>450,725=>450,726=>351,727=>286,728=>450,729=>450,730=>450,731=>450,732=>450,733=>450,734=>284,735=>450,736=>383,737=>149,738=>335,739=>399,740=>333,741=>444,742=>444,743=>444,744=>444,745=>444,748=>450,749=>450,750=>466,755=>450,759=>450,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>589,881=>511,882=>775,883=>583,884=>250,885=>250,886=>673,887=>584,890=>450,891=>494,892=>495,893=>494,894=>303,900=>450,901=>450,902=>615,903=>286,904=>690,905=>813,906=>391,908=>755,910=>773,911=>814,912=>304,913=>615,914=>617,915=>501,916=>615,917=>568,918=>616,919=>677,920=>708,921=>265,922=>590,923=>615,924=>776,925=>673,926=>568,927=>708,928=>677,929=>542,931=>568,932=>549,933=>549,934=>708,935=>616,936=>708,937=>688,938=>265,939=>549,940=>593,941=>486,942=>570,943=>304,944=>521,945=>593,946=>574,947=>532,948=>550,949=>486,950=>489,951=>570,952=>550,953=>304,954=>530,955=>532,956=>572,957=>502,958=>501,959=>550,960=>542,961=>571,962=>528,963=>570,964=>542,965=>521,966=>593,967=>532,968=>593,969=>753,970=>304,971=>521,972=>550,973=>521,974=>753,975=>590,976=>553,977=>557,978=>628,979=>758,980=>628,981=>593,982=>753,983=>597,984=>708,985=>550,986=>583,987=>528,988=>518,989=>413,990=>593,991=>593,992=>778,993=>564,994=>840,995=>753,996=>682,997=>593,998=>712,999=>553,1000=>618,1001=>546,1002=>690,1003=>563,1004=>629,1005=>550,1006=>549,1007=>482,1008=>597,1009=>571,1010=>495,1011=>250,1012=>708,1013=>554,1014=>554,1015=>547,1016=>571,1017=>628,1018=>776,1019=>585,1020=>571,1021=>633,1022=>628,1023=>633,1024=>568,1025=>568,1026=>708,1027=>501,1028=>628,1029=>571,1030=>265,1031=>265,1032=>265,1033=>984,1034=>940,1035=>708,1036=>639,1037=>673,1038=>548,1039=>677,1040=>615,1041=>617,1042=>617,1043=>501,1044=>703,1045=>568,1046=>969,1047=>577,1048=>673,1049=>673,1050=>639,1051=>677,1052=>776,1053=>677,1054=>708,1055=>677,1056=>542,1057=>628,1058=>549,1059=>548,1060=>774,1061=>616,1062=>699,1063=>617,1064=>962,1065=>984,1066=>749,1067=>736,1068=>617,1069=>628,1070=>971,1071=>625,1072=>551,1073=>555,1074=>530,1075=>473,1076=>622,1077=>554,1078=>811,1079=>479,1080=>584,1081=>584,1082=>543,1083=>575,1084=>679,1085=>588,1086=>550,1087=>588,1088=>571,1089=>495,1090=>524,1091=>532,1092=>769,1093=>532,1094=>612,1095=>532,1096=>823,1097=>848,1098=>636,1099=>710,1100=>530,1101=>494,1102=>757,1103=>541,1104=>554,1105=>554,1106=>563,1107=>473,1108=>494,1109=>469,1110=>250,1111=>250,1112=>250,1113=>812,1114=>809,1115=>586,1116=>543,1117=>584,1118=>532,1119=>588,1120=>840,1121=>753,1122=>693,1123=>604,1124=>848,1125=>674,1126=>791,1127=>705,1128=>1043,1129=>901,1130=>708,1131=>550,1132=>924,1133=>742,1134=>572,1135=>486,1136=>771,1137=>789,1138=>708,1139=>550,1140=>703,1141=>598,1142=>703,1143=>598,1144=>893,1145=>813,1146=>857,1147=>682,1148=>1062,1149=>925,1150=>840,1151=>753,1152=>628,1153=>495,1154=>452,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>376,1161=>376,1162=>673,1163=>591,1164=>617,1165=>530,1166=>542,1167=>571,1168=>549,1169=>473,1170=>607,1171=>500,1172=>501,1173=>441,1174=>969,1175=>811,1176=>577,1177=>479,1178=>639,1179=>543,1180=>639,1181=>543,1182=>639,1183=>543,1184=>771,1185=>748,1186=>677,1187=>594,1188=>913,1189=>789,1190=>1002,1191=>855,1192=>801,1193=>636,1194=>628,1195=>495,1196=>549,1197=>476,1198=>549,1199=>532,1200=>549,1201=>532,1202=>616,1203=>532,1204=>840,1205=>726,1206=>617,1207=>532,1208=>617,1209=>532,1210=>617,1211=>570,1212=>836,1213=>658,1214=>836,1215=>658,1216=>265,1217=>969,1218=>811,1219=>589,1220=>543,1221=>677,1222=>575,1223=>677,1224=>594,1225=>677,1226=>594,1227=>617,1228=>532,1229=>776,1230=>679,1231=>250,1232=>615,1233=>551,1234=>615,1235=>551,1236=>876,1237=>896,1238=>568,1239=>554,1240=>708,1241=>554,1242=>708,1243=>554,1244=>969,1245=>811,1246=>577,1247=>479,1248=>599,1249=>520,1250=>673,1251=>584,1252=>673,1253=>584,1254=>708,1255=>550,1256=>708,1257=>550,1258=>708,1259=>550,1260=>628,1261=>494,1262=>548,1263=>532,1264=>548,1265=>532,1266=>548,1267=>532,1268=>617,1269=>532,1270=>501,1271=>442,1272=>736,1273=>710,1274=>607,1275=>500,1276=>616,1277=>532,1278=>616,1279=>532,1280=>617,1281=>530,1282=>905,1283=>807,1284=>877,1285=>782,1286=>611,1287=>529,1288=>964,1289=>861,1290=>1001,1291=>870,1292=>697,1293=>593,1294=>695,1295=>640,1296=>553,1297=>486,1298=>677,1299=>575,1300=>1076,1301=>896,1302=>810,1303=>780,1304=>927,1305=>890,1306=>708,1307=>571,1308=>890,1309=>736,1310=>639,1311=>543,1312=>1002,1313=>848,1314=>1002,1315=>854,1316=>713,1317=>614,1329=>689,1330=>659,1331=>678,1332=>678,1333=>659,1334=>694,1335=>576,1336=>659,1337=>773,1338=>678,1339=>622,1340=>479,1341=>830,1342=>777,1343=>659,1344=>644,1345=>689,1346=>678,1347=>690,1348=>712,1349=>655,1350=>656,1351=>681,1352=>659,1353=>642,1354=>720,1355=>691,1356=>712,1357=>659,1358=>678,1359=>634,1360=>624,1361=>669,1362=>483,1363=>729,1364=>681,1365=>708,1366=>711,1369=>276,1370=>286,1371=>211,1372=>325,1373=>214,1374=>365,1375=>450,1377=>876,1378=>570,1379=>592,1380=>597,1381=>570,1382=>571,1383=>463,1384=>570,1385=>664,1386=>592,1387=>570,1388=>244,1389=>882,1390=>560,1391=>570,1392=>570,1393=>547,1394=>571,1395=>566,1396=>570,1397=>250,1398=>570,1399=>448,1400=>570,1401=>364,1402=>876,1403=>504,1404=>583,1405=>570,1406=>570,1407=>876,1408=>570,1409=>571,1410=>391,1411=>876,1412=>572,1413=>550,1414=>725,1415=>730,1417=>303,1418=>325,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>325,1471=>0,1472=>265,1473=>0,1474=>0,1475=>265,1478=>410,1479=>0,1488=>602,1489=>520,1490=>371,1491=>491,1492=>588,1493=>245,1494=>312,1495=>588,1496=>583,1497=>201,1498=>483,1499=>476,1500=>511,1501=>597,1502=>611,1503=>245,1504=>360,1505=>584,1506=>563,1507=>576,1508=>562,1509=>485,1510=>534,1511=>638,1512=>508,1513=>637,1514=>591,1520=>423,1521=>409,1522=>423,1523=>374,1524=>580,3647=>572,3713=>603,3714=>615,3716=>619,3719=>434,3720=>565,3722=>615,3725=>619,3732=>577,3733=>577,3734=>605,3735=>589,3737=>576,3738=>533,3739=>533,3740=>670,3741=>690,3742=>618,3743=>618,3745=>631,3746=>619,3747=>615,3749=>584,3751=>569,3754=>633,3755=>737,3757=>569,3758=>615,3759=>708,3760=>569,3761=>0,3762=>485,3763=>485,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0,3769=>0,3771=>0,3772=>0,3773=>597,3776=>324,3777=>611,3778=>414,3779=>492,3780=>442,3782=>606,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>572,3793=>576,3794=>576,3795=>603,3796=>563,3797=>563,3798=>633,3799=>603,3800=>606,3801=>609,3804=>925,3805=>925,4256=>756,4257=>621,4258=>577,4259=>683,4260=>532,4261=>617,4262=>710,4263=>729,4264=>420,4265=>508,4266=>710,4267=>713,4268=>526,4269=>753,4270=>675,4271=>620,4272=>729,4273=>526,4274=>526,4275=>753,4276=>753,4277=>581,4278=>543,4279=>526,4280=>536,4281=>526,4282=>649,4283=>715,4284=>526,4285=>510,4286=>526,4287=>602,4288=>719,4289=>488,4290=>598,4291=>488,4292=>508,4293=>606,4304=>457,4305=>457,4306=>479,4307=>706,4308=>470,4309=>465,4310=>457,4311=>717,4312=>457,4313=>466,4314=>952,4315=>470,4316=>470,4317=>704,4318=>466,4319=>470,4320=>713,4321=>470,4322=>590,4323=>471,4324=>709,4325=>470,4326=>704,4327=>470,4328=>470,4329=>470,4330=>510,4331=>470,4332=>470,4333=>439,4334=>470,4335=>448,4336=>465,4337=>504,4338=>457,4339=>457,4340=>457,4341=>507,4342=>741,4343=>536,4344=>470,4345=>498,4346=>498,4347=>527,4348=>273,5121=>615,5122=>615,5123=>615,5124=>615,5125=>692,5126=>692,5127=>692,5129=>692,5130=>692,5131=>692,5132=>751,5133=>751,5134=>751,5135=>751,5136=>751,5137=>751,5138=>870,5139=>906,5140=>870,5141=>906,5142=>692,5143=>870,5144=>906,5145=>870,5146=>906,5147=>692,5149=>230,5150=>488,5151=>381,5152=>381,5153=>350,5154=>350,5155=>354,5156=>350,5157=>419,5158=>347,5159=>230,5160=>350,5161=>350,5162=>350,5163=>980,5164=>817,5165=>857,5166=>1005,5167=>615,5168=>615,5169=>615,5170=>615,5171=>656,5172=>656,5173=>656,5175=>656,5176=>656,5177=>656,5178=>751,5179=>615,5180=>751,5181=>751,5182=>751,5183=>751,5184=>870,5185=>906,5186=>870,5187=>906,5188=>870,5189=>906,5190=>870,5191=>906,5192=>656,5193=>457,5194=>172,5196=>659,5197=>659,5198=>659,5199=>659,5200=>657,5201=>657,5202=>657,5204=>657,5205=>657,5206=>657,5207=>829,5208=>800,5209=>829,5210=>800,5211=>829,5212=>800,5213=>835,5214=>810,5215=>835,5216=>810,5217=>853,5218=>810,5219=>853,5220=>810,5221=>853,5222=>391,5223=>790,5224=>790,5225=>779,5226=>801,5227=>565,5228=>565,5229=>565,5230=>565,5231=>565,5232=>565,5233=>565,5234=>565,5235=>565,5236=>773,5237=>693,5238=>733,5239=>734,5240=>733,5241=>734,5242=>773,5243=>693,5244=>773,5245=>693,5246=>733,5247=>734,5248=>733,5249=>734,5250=>733,5251=>366,5252=>366,5253=>675,5254=>697,5255=>675,5256=>697,5257=>565,5258=>565,5259=>565,5260=>565,5261=>565,5262=>565,5263=>565,5264=>565,5265=>565,5266=>773,5267=>693,5268=>733,5269=>734,5270=>733,5271=>734,5272=>773,5273=>693,5274=>773,5275=>693,5276=>733,5277=>734,5278=>733,5279=>734,5280=>733,5281=>391,5282=>391,5283=>549,5284=>501,5285=>501,5286=>501,5287=>549,5288=>549,5289=>549,5290=>501,5291=>501,5292=>674,5293=>691,5294=>671,5295=>687,5296=>671,5297=>687,5298=>674,5299=>691,5300=>674,5301=>691,5302=>671,5303=>687,5304=>671,5305=>687,5306=>671,5307=>347,5308=>457,5309=>347,5312=>766,5313=>766,5314=>766,5315=>766,5316=>766,5317=>766,5318=>766,5319=>766,5320=>766,5321=>962,5322=>931,5323=>953,5324=>766,5325=>953,5326=>766,5327=>766,5328=>540,5329=>407,5330=>540,5331=>766,5332=>766,5333=>766,5334=>766,5335=>766,5336=>766,5337=>766,5338=>766,5339=>766,5340=>962,5341=>931,5342=>953,5343=>927,5344=>953,5345=>927,5346=>962,5347=>931,5348=>962,5349=>931,5350=>975,5351=>927,5352=>975,5353=>927,5354=>540,5356=>656,5357=>542,5358=>542,5359=>542,5360=>542,5361=>542,5362=>542,5363=>542,5364=>542,5365=>542,5366=>751,5367=>678,5368=>712,5369=>694,5370=>712,5371=>694,5372=>751,5373=>678,5374=>751,5375=>678,5376=>712,5377=>694,5378=>712,5379=>694,5380=>712,5381=>376,5382=>378,5383=>376,5392=>641,5393=>641,5394=>641,5395=>802,5396=>802,5397=>802,5398=>802,5399=>818,5400=>785,5401=>818,5402=>785,5403=>818,5404=>785,5405=>1026,5406=>989,5407=>1026,5408=>989,5409=>1026,5410=>989,5411=>1026,5412=>989,5413=>576,5414=>564,5415=>564,5416=>564,5417=>564,5418=>564,5419=>564,5420=>564,5421=>564,5422=>564,5423=>760,5424=>703,5425=>734,5426=>736,5427=>734,5428=>736,5429=>760,5430=>703,5431=>760,5432=>703,5433=>734,5434=>736,5435=>734,5436=>736,5437=>734,5438=>376,5440=>350,5441=>436,5442=>824,5443=>824,5444=>776,5445=>824,5446=>776,5447=>776,5448=>542,5449=>542,5450=>542,5451=>542,5452=>542,5453=>542,5454=>751,5455=>678,5456=>376,5458=>656,5459=>615,5460=>615,5461=>615,5462=>615,5463=>653,5464=>653,5465=>653,5466=>653,5467=>831,5468=>906,5469=>457,5470=>659,5471=>659,5472=>659,5473=>659,5474=>659,5475=>659,5476=>657,5477=>657,5478=>657,5479=>657,5480=>853,5481=>810,5482=>457,5492=>747,5493=>747,5494=>747,5495=>747,5496=>747,5497=>747,5498=>747,5499=>507,5500=>677,5501=>436,5502=>942,5503=>942,5504=>942,5505=>942,5506=>942,5507=>942,5508=>942,5509=>743,5514=>747,5515=>747,5516=>747,5517=>747,5518=>1133,5519=>1133,5520=>1133,5521=>901,5522=>901,5523=>1133,5524=>1133,5525=>629,5526=>965,5536=>766,5537=>766,5538=>719,5539=>719,5540=>719,5541=>719,5542=>540,5543=>579,5544=>579,5545=>579,5546=>579,5547=>579,5548=>579,5549=>579,5550=>376,5551=>565,5598=>693,5601=>693,5702=>421,5703=>421,5742=>399,5743=>942,5744=>1178,5745=>1469,5746=>1469,5747=>1237,5748=>1237,5749=>1469,5750=>1469,7424=>532,7425=>646,7426=>883,7427=>527,7428=>495,7429=>544,7430=>544,7431=>441,7432=>486,7433=>250,7434=>355,7435=>521,7436=>524,7437=>679,7438=>584,7439=>550,7440=>495,7441=>615,7442=>615,7443=>615,7444=>920,7446=>550,7447=>550,7448=>472,7449=>541,7450=>541,7451=>524,7452=>517,7453=>663,7454=>853,7455=>574,7456=>532,7457=>736,7458=>472,7459=>473,7462=>524,7463=>532,7464=>507,7465=>472,7466=>531,7467=>575,7468=>387,7469=>552,7470=>389,7472=>436,7473=>358,7474=>358,7475=>439,7476=>426,7477=>167,7478=>167,7479=>372,7480=>315,7481=>489,7482=>424,7483=>424,7484=>446,7485=>396,7486=>342,7487=>394,7488=>346,7489=>415,7490=>560,7491=>352,7492=>352,7493=>365,7494=>583,7495=>385,7496=>365,7497=>375,7498=>375,7499=>324,7500=>323,7501=>365,7502=>161,7503=>383,7504=>561,7505=>368,7506=>372,7507=>333,7508=>372,7509=>372,7510=>385,7511=>265,7512=>364,7513=>422,7514=>561,7515=>375,7517=>361,7518=>335,7519=>347,7520=>374,7521=>327,7522=>161,7523=>233,7524=>364,7525=>375,7526=>361,7527=>335,7528=>370,7529=>374,7530=>327,7543=>571,7544=>426,7547=>334,7549=>600,7557=>250,7579=>365,7580=>333,7581=>333,7582=>372,7583=>324,7584=>267,7585=>209,7586=>365,7587=>364,7588=>235,7589=>224,7590=>234,7591=>235,7592=>211,7593=>224,7594=>211,7595=>338,7596=>561,7597=>561,7598=>369,7599=>431,7600=>368,7601=>372,7602=>372,7603=>324,7604=>258,7605=>265,7606=>457,7607=>376,7608=>325,7609=>365,7610=>375,7611=>330,7612=>393,7613=>330,7614=>353,7615=>372,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>615,7681=>551,7682=>617,7683=>571,7684=>617,7685=>571,7686=>617,7687=>571,7688=>628,7689=>495,7690=>693,7691=>571,7692=>693,7693=>571,7694=>693,7695=>571,7696=>693,7697=>571,7698=>693,7699=>571,7700=>568,7701=>554,7702=>568,7703=>554,7704=>568,7705=>554,7706=>568,7707=>554,7708=>568,7709=>554,7710=>518,7711=>316,7712=>697,7713=>571,7714=>677,7715=>570,7716=>677,7717=>570,7718=>677,7719=>570,7720=>677,7721=>570,7722=>677,7723=>570,7724=>265,7725=>250,7726=>265,7727=>250,7728=>590,7729=>521,7730=>590,7731=>521,7732=>590,7733=>521,7734=>501,7735=>250,7736=>501,7737=>250,7738=>501,7739=>250,7740=>501,7741=>250,7742=>776,7743=>876,7744=>776,7745=>876,7746=>776,7747=>876,7748=>673,7749=>570,7750=>673,7751=>570,7752=>673,7753=>570,7754=>673,7755=>570,7756=>708,7757=>550,7758=>708,7759=>550,7760=>708,7761=>550,7762=>708,7763=>550,7764=>542,7765=>571,7766=>542,7767=>571,7768=>625,7769=>370,7770=>625,7771=>370,7772=>625,7773=>370,7774=>625,7775=>370,7776=>571,7777=>469,7778=>571,7779=>469,7780=>571,7781=>469,7782=>571,7783=>469,7784=>571,7785=>469,7786=>549,7787=>353,7788=>549,7789=>353,7790=>549,7791=>353,7792=>549,7793=>353,7794=>659,7795=>570,7796=>659,7797=>570,7798=>659,7799=>570,7800=>659,7801=>570,7802=>659,7803=>570,7804=>615,7805=>532,7806=>615,7807=>532,7808=>890,7809=>736,7810=>890,7811=>736,7812=>890,7813=>736,7814=>890,7815=>736,7816=>890,7817=>736,7818=>616,7819=>532,7820=>616,7821=>532,7822=>549,7823=>532,7824=>616,7825=>472,7826=>616,7827=>472,7828=>616,7829=>472,7830=>570,7831=>353,7832=>736,7833=>532,7834=>551,7835=>316,7836=>316,7837=>316,7838=>691,7839=>550,7840=>615,7841=>551,7842=>615,7843=>551,7844=>615,7845=>551,7846=>615,7847=>551,7848=>615,7849=>551,7850=>615,7851=>551,7852=>615,7853=>551,7854=>615,7855=>551,7856=>615,7857=>551,7858=>615,7859=>551,7860=>615,7861=>551,7862=>615,7863=>551,7864=>568,7865=>554,7866=>568,7867=>554,7868=>568,7869=>554,7870=>568,7871=>554,7872=>568,7873=>554,7874=>568,7875=>554,7876=>568,7877=>554,7878=>568,7879=>554,7880=>265,7881=>250,7882=>265,7883=>250,7884=>708,7885=>550,7886=>708,7887=>550,7888=>708,7889=>550,7890=>708,7891=>550,7892=>708,7893=>550,7894=>708,7895=>550,7896=>708,7897=>550,7898=>822,7899=>550,7900=>822,7901=>550,7902=>822,7903=>550,7904=>822,7905=>550,7906=>822,7907=>550,7908=>659,7909=>570,7910=>659,7911=>570,7912=>754,7913=>570,7914=>754,7915=>570,7916=>754,7917=>570,7918=>754,7919=>570,7920=>754,7921=>570,7922=>549,7923=>532,7924=>549,7925=>532,7926=>549,7927=>532,7928=>549,7929=>532,7930=>692,7931=>429,7936=>593,7937=>593,7938=>593,7939=>593,7940=>593,7941=>593,7942=>593,7943=>593,7944=>615,7945=>615,7946=>790,7947=>790,7948=>692,7949=>721,7950=>637,7951=>668,7952=>486,7953=>486,7954=>486,7955=>486,7956=>486,7957=>486,7960=>640,7961=>640,7962=>869,7963=>877,7964=>809,7965=>835,7968=>570,7969=>570,7970=>570,7971=>570,7972=>570,7973=>570,7974=>570,7975=>570,7976=>753,7977=>751,7978=>977,7979=>980,7980=>924,7981=>945,7982=>840,7983=>852,7984=>304,7985=>304,7986=>304,7987=>304,7988=>304,7989=>304,7990=>304,7991=>304,7992=>342,7993=>336,7994=>571,7995=>571,7996=>513,7997=>540,7998=>440,7999=>443,8000=>550,8001=>550,8002=>550,8003=>550,8004=>550,8005=>550,8008=>724,8009=>763,8010=>985,8011=>989,8012=>844,8013=>873,8016=>521,8017=>521,8018=>521,8019=>521,8020=>521,8021=>521,8022=>521,8023=>521,8025=>705,8027=>897,8029=>911,8031=>808,8032=>753,8033=>753,8034=>753,8035=>753,8036=>753,8037=>753,8038=>753,8039=>753,8040=>722,8041=>759,8042=>980,8043=>985,8044=>851,8045=>875,8046=>829,8047=>857,8048=>593,8049=>593,8050=>486,8051=>493,8052=>570,8053=>589,8054=>304,8055=>304,8056=>550,8057=>550,8058=>521,8059=>521,8060=>753,8061=>753,8064=>593,8065=>593,8066=>593,8067=>593,8068=>593,8069=>593,8070=>593,8071=>593,8072=>615,8073=>615,8074=>790,8075=>790,8076=>692,8077=>721,8078=>637,8079=>668,8080=>570,8081=>570,8082=>570,8083=>570,8084=>570,8085=>570,8086=>570,8087=>570,8088=>753,8089=>751,8090=>977,8091=>980,8092=>924,8093=>945,8094=>840,8095=>852,8096=>753,8097=>753,8098=>753,8099=>753,8100=>753,8101=>753,8102=>753,8103=>753,8104=>722,8105=>759,8106=>980,8107=>985,8108=>851,8109=>875,8110=>829,8111=>857,8112=>593,8113=>593,8114=>593,8115=>593,8116=>593,8118=>593,8119=>593,8120=>615,8121=>615,8122=>645,8123=>623,8124=>615,8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>570,8131=>570,8132=>589,8134=>570,8135=>570,8136=>724,8137=>671,8138=>837,8139=>784,8140=>677,8141=>450,8142=>450,8143=>450,8144=>304,8145=>304,8146=>304,8147=>304,8150=>304,8151=>304,8152=>265,8153=>265,8154=>427,8155=>367,8157=>450,8158=>450,8159=>450,8160=>521,8161=>521,8162=>521,8163=>521,8164=>571,8165=>571,8166=>521,8167=>521,8168=>549,8169=>549,8170=>760,8171=>742,8172=>616,8173=>450,8174=>450,8175=>450,8178=>753,8179=>753,8180=>753,8182=>753,8183=>753,8184=>847,8185=>731,8186=>830,8187=>743,8188=>688,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>572,8200=>286,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>325,8209=>325,8210=>572,8211=>450,8212=>900,8213=>900,8214=>450,8215=>450,8216=>286,8217=>286,8218=>286,8219=>286,8220=>466,8221=>466,8222=>466,8223=>466,8224=>450,8225=>450,8226=>531,8227=>531,8228=>299,8229=>600,8230=>900,8231=>286,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180,8240=>1215,8241=>1521,8242=>204,8243=>336,8244=>468,8245=>204,8246=>336,8247=>468,8248=>305,8249=>360,8250=>360,8251=>754,8252=>437,8253=>478,8254=>450,8255=>723,8256=>723,8257=>225,8258=>900,8259=>450,8260=>150,8261=>351,8262=>351,8263=>830,8264=>659,8265=>659,8266=>447,8267=>572,8268=>450,8269=>450,8270=>450,8271=>303,8272=>723,8273=>450,8274=>404,8275=>900,8276=>723,8277=>754,8278=>527,8279=>597,8280=>754,8281=>754,8282=>286,8283=>717,8284=>754,8285=>286,8286=>286,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>360,8305=>161,8308=>360,8309=>360,8310=>360,8311=>360,8312=>360,8313=>360,8314=>475,8315=>475,8316=>475,8317=>221,8318=>221,8319=>359,8320=>360,8321=>360,8322=>360,8323=>360,8324=>360,8325=>360,8326=>360,8327=>360,8328=>360,8329=>360,8330=>475,8331=>475,8332=>475,8333=>221,8334=>221,8336=>352,8337=>375,8338=>372,8339=>399,8340=>375,8341=>359,8342=>383,8343=>149,8344=>561,8345=>359,8346=>385,8347=>335,8348=>265,8352=>789,8353=>572,8354=>572,8355=>572,8356=>572,8357=>876,8358=>673,8359=>1143,8360=>966,8361=>890,8362=>754,8363=>572,8364=>572,8365=>572,8366=>572,8367=>1145,8368=>572,8369=>572,8370=>572,8371=>572,8372=>696,8373=>572,8376=>572,8377=>572,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>873,8449=>873,8450=>628,8451=>1011,8452=>807,8453=>872,8454=>929,8455=>553,8456=>628,8457=>856,8459=>889,8460=>679,8461=>765,8462=>570,8463=>570,8464=>422,8465=>627,8466=>648,8467=>372,8468=>736,8469=>721,8470=>936,8471=>900,8472=>627,8473=>631,8474=>708,8475=>718,8476=>732,8477=>712,8478=>807,8479=>615,8480=>917,8481=>912,8482=>900,8483=>615,8484=>670,8485=>520,8486=>688,8487=>688,8488=>554,8489=>304,8490=>590,8491=>615,8492=>708,8493=>633,8494=>769,8495=>532,8496=>545,8497=>708,8498=>518,8499=>962,8500=>416,8501=>670,8502=>606,8503=>419,8504=>580,8505=>342,8506=>833,8507=>1041,8508=>632,8509=>655,8510=>589,8511=>764,8512=>729,8513=>697,8514=>501,8515=>501,8516=>549,8517=>737,8518=>637,8519=>554,8520=>316,8521=>316,8523=>702,8526=>474,8528=>872,8529=>872,8530=>1233,8531=>872,8532=>872,8533=>872,8534=>872,8535=>872,8536=>872,8537=>872,8538=>872,8539=>872,8540=>872,8541=>872,8542=>872,8543=>511,8544=>265,8545=>443,8546=>620,8547=>831,8548=>615,8549=>830,8550=>1007,8551=>1185,8552=>826,8553=>616,8554=>839,8555=>1018,8556=>501,8557=>628,8558=>693,8559=>776,8560=>250,8561=>412,8562=>573,8563=>730,8564=>532,8565=>729,8566=>892,8567=>1053,8568=>737,8569=>532,8570=>740,8571=>901,8572=>250,8573=>495,8574=>571,8575=>876,8576=>1121,8577=>693,8578=>1121,8579=>633,8580=>494,8581=>628,8585=>872,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754,8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754,8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754,8620=>754,8621=>754,8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754,8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754,8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754,8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754,8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754,8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754,8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754,8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754,8700=>754,8701=>754,8702=>754,8703=>754,8704=>615,8705=>572,8706=>465,8707=>568,8708=>568,8709=>784,8710=>602,8711=>602,8712=>784,8713=>784,8714=>646,8715=>784,8716=>784,8717=>646,8718=>572,8719=>681,8720=>681,8721=>606,8722=>754,8723=>754,8724=>754,8725=>303,8726=>573,8727=>754,8728=>563,8729=>563,8730=>573,8731=>573,8732=>573,8733=>643,8734=>750,8735=>754,8736=>807,8737=>807,8738=>754,8739=>450,8740=>450,8741=>450,8742=>450,8743=>659,8744=>659,8745=>659,8746=>659,8747=>469,8748=>710,8749=>951,8750=>469,8751=>710,8752=>951,8753=>469,8754=>469,8755=>469,8756=>572,8757=>572,8758=>234,8759=>572,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754,8766=>754,8767=>754,8768=>337,8769=>754,8770=>754,8771=>754,8772=>754,8773=>754,8774=>754,8775=>754,8776=>754,8777=>754,8778=>754,8779=>754,8780=>754,8781=>754,8782=>754,8783=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>900,8789=>900,8790=>754,8791=>754,8792=>754,8793=>754,8794=>754,8795=>754,8796=>754,8797=>754,8798=>754,8799=>754,8800=>754,8801=>754,8802=>754,8803=>754,8804=>754,8805=>754,8806=>754,8807=>754,8808=>754,8809=>754,8810=>942,8811=>942,8812=>417,8813=>754,8814=>754,8815=>754,8816=>754,8817=>754,8818=>754,8819=>754,8820=>754,8821=>754,8822=>754,8823=>754,8824=>754,8825=>754,8826=>754,8827=>754,8828=>754,8829=>754,8830=>754,8831=>754,8832=>754,8833=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8840=>754,8841=>754,8842=>754,8843=>754,8844=>659,8845=>659,8846=>659,8847=>754,8848=>754,8849=>754,8850=>754,8851=>702,8852=>702,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754,8865=>754,8866=>784,8867=>784,8868=>784,8869=>784,8870=>468,8871=>468,8872=>784,8873=>784,8874=>784,8875=>784,8876=>784,8877=>784,8878=>784,8879=>784,8880=>754,8881=>754,8882=>754,8883=>754,8884=>754,8885=>754,8886=>900,8887=>900,8888=>754,8889=>754,8890=>468,8891=>659,8892=>659,8893=>659,8894=>754,8895=>754,8896=>738,8897=>738,8898=>738,8899=>738,8900=>444,8901=>286,8902=>563,8903=>754,8904=>900,8905=>900,8906=>900,8907=>900,8908=>900,8909=>754,8910=>659,8911=>659,8912=>754,8913=>754,8914=>754,8915=>754,8916=>754,8917=>754,8918=>754,8919=>754,8920=>1280,8921=>1280,8922=>754,8923=>754,8924=>754,8925=>754,8926=>754,8927=>754,8928=>754,8929=>754,8930=>754,8931=>754,8932=>754,8933=>754,8934=>754,8935=>754,8936=>754,8937=>754,8938=>754,8939=>754,8940=>754,8941=>754,8942=>900,8943=>900,8944=>900,8945=>900,8946=>900,8947=>784,8948=>646,8949=>784,8950=>784,8951=>646,8952=>784,8953=>784,8954=>900,8955=>784,8956=>646,8957=>784,8958=>646,8959=>784,8960=>542,8961=>542,8962=>571,8963=>754,8964=>754,8965=>754,8966=>754,8967=>439,8968=>351,8969=>351,8970=>351,8971=>351,8972=>728,8973=>728,8974=>728,8975=>728,8976=>754,8977=>461,8984=>900,8985=>754,8988=>422,8989=>422,8990=>422,8991=>422,8992=>469,8993=>469,8996=>1037,8997=>1037,8998=>1272,8999=>1037,9000=>1299,9003=>1272,9004=>786,9075=>304,9076=>571,9077=>753,9082=>593,9085=>681,9095=>1037,9108=>786,9115=>450,9116=>450,9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450,9125=>450,9126=>450,9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>469,9166=>754,9167=>850,9187=>786,9189=>692,9192=>572,9250=>571,9251=>571,9312=>807,9313=>807,9314=>807,9315=>807,9316=>807,9317=>807,9318=>807,9319=>807,9320=>807,9321=>807,9472=>542,9473=>542,9474=>542,9475=>542,9476=>542,9477=>542,9478=>542,9479=>542,9480=>542,9481=>542,9482=>542,9483=>542,9484=>542,9485=>542,9486=>542,9487=>542,9488=>542,9489=>542,9490=>542,9491=>542,9492=>542,9493=>542,9494=>542,9495=>542,9496=>542,9497=>542,9498=>542,9499=>542,9500=>542,9501=>542,9502=>542,9503=>542,9504=>542,9505=>542,9506=>542,9507=>542,9508=>542,9509=>542,9510=>542,9511=>542,9512=>542,9513=>542,9514=>542,9515=>542,9516=>542,9517=>542,9518=>542,9519=>542,9520=>542,9521=>542,9522=>542,9523=>542,9524=>542,9525=>542,9526=>542,9527=>542,9528=>542,9529=>542,9530=>542,9531=>542,9532=>542,9533=>542,9534=>542,9535=>542,9536=>542,9537=>542,9538=>542,9539=>542,9540=>542,9541=>542,9542=>542,9543=>542,9544=>542,9545=>542,9546=>542,9547=>542,9548=>542,9549=>542,9550=>542,9551=>542,9552=>542,9553=>542,9554=>542,9555=>542,9556=>542,9557=>542,9558=>542,9559=>542,9560=>542,9561=>542,9562=>542,9563=>542,9564=>542,9565=>542,9566=>542,9567=>542,9568=>542,9569=>542,9570=>542,9571=>542,9572=>542,9573=>542,9574=>542,9575=>542,9576=>542,9577=>542,9578=>542,9579=>542,9580=>542,9581=>542,9582=>542,9583=>542,9584=>542,9585=>542,9586=>542,9587=>542,9588=>542,9589=>542,9590=>542,9591=>542,9592=>542,9593=>542,9594=>542,9595=>542,9596=>542,9597=>542,9598=>542,9599=>542,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474,9687=>474,9688=>712,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>692,9697=>692,9698=>692,9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850,9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659,9727=>692,9728=>807,9729=>900,9730=>807,9731=>807,9732=>807,9733=>807,9734=>807,9735=>515,9736=>806,9737=>807,9738=>799,9739=>799,9740=>604,9741=>911,9742=>1121,9743=>1125,9744=>807,9745=>807,9746=>807,9747=>479,9748=>807,9749=>807,9750=>807,9751=>807,9752=>807,9753=>807,9754=>807,9755=>807,9756=>807,9757=>548,9758=>807,9759=>548,9760=>807,9761=>807,9762=>807,9763=>807,9764=>602,9765=>671,9766=>584,9767=>705,9768=>490,9769=>807,9770=>807,9771=>807,9772=>639,9773=>807,9774=>807,9775=>807,9776=>800,9777=>800,9778=>800,9779=>800,9780=>800,9781=>800,9782=>800,9783=>800,9784=>807,9785=>938,9786=>938,9787=>938,9788=>807,9789=>807,9790=>807,9791=>552,9792=>659,9793=>659,9794=>807,9795=>807,9796=>807,9797=>807,9798=>807,9799=>807,9800=>807,9801=>807,9802=>807,9803=>807,9804=>807,9805=>807,9806=>807,9807=>807,9808=>807,9809=>807,9810=>807,9811=>807,9812=>807,9813=>807,9814=>807,9815=>807,9816=>807,9817=>807,9818=>807,9819=>807,9820=>807,9821=>807,9822=>807,9823=>807,9824=>807,9825=>807,9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9832=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424,9838=>321,9839=>435,9840=>673,9841=>689,9842=>807,9843=>807,9844=>807,9845=>807,9846=>807,9847=>807,9848=>807,9849=>807,9850=>807,9851=>807,9852=>807,9853=>807,9854=>807,9855=>807,9856=>782,9857=>782,9858=>782,9859=>782,9860=>782,9861=>782,9862=>800,9863=>800,9864=>800,9865=>800,9866=>800,9867=>800,9868=>800,9869=>800,9870=>800,9871=>800,9872=>675,9873=>675,9874=>800,9875=>734,9876=>644,9877=>483,9878=>766,9879=>800,9880=>615,9881=>807,9882=>637,9883=>800,9884=>800,9888=>800,9889=>632,9890=>904,9891=>980,9892=>1057,9893=>813,9894=>754,9895=>754,9896=>754,9897=>754,9898=>754,9899=>754,9900=>754,9901=>754,9902=>754,9903=>754,9904=>759,9905=>754,9906=>659,9907=>659,9908=>659,9909=>659,9910=>765,9911=>659,9912=>659,9920=>754,9921=>754,9922=>754,9923=>754,9954=>659,9985=>754,9986=>754,9987=>754,9988=>754,9990=>754,9991=>754,9992=>754,9993=>754,9996=>754,9997=>754,9998=>754,9999=>754,10000=>754,10001=>754,10002=>754,10003=>754,10004=>754,10005=>754,10006=>754,10007=>754,10008=>754,10009=>754,10010=>754,10011=>754,10012=>754,10013=>754,10014=>754,10015=>754,10016=>754,10017=>754,10018=>754,10019=>754,10020=>754,10021=>754,10022=>754,10023=>754,10025=>754,10026=>754,10027=>754,10028=>754,10029=>754,10030=>754,10031=>754,10032=>754,10033=>754,10034=>754,10035=>754,10036=>754,10037=>754,10038=>754,10039=>754,10040=>754,10041=>754,10042=>754,10043=>754,10044=>754,10045=>754,10046=>754,10047=>754,10048=>754,10049=>754,10050=>754,10051=>754,10052=>754,10053=>754,10054=>754,10055=>754,10056=>754,10057=>754,10058=>754,10059=>754,10061=>807,10063=>807,10064=>807,10065=>807,10066=>807,10070=>807,10072=>754,10073=>754,10074=>754,10075=>290,10076=>290,10077=>484,10078=>484,10081=>754,10082=>754,10083=>754,10084=>754,10085=>754,10086=>754,10087=>754,10088=>754,10089=>754,10090=>754,10091=>754,10092=>754,10093=>754,10094=>754,10095=>754,10096=>754,10097=>754,10098=>754,10099=>754,10100=>754,10101=>754,10102=>807,10103=>807,10104=>807,10105=>807,10106=>807,10107=>807,10108=>807,10109=>807,10110=>807,10111=>807,10112=>754,10113=>754,10114=>754,10115=>754,10116=>754,10117=>754,10118=>754,10119=>754,10120=>754,10121=>754,10122=>754,10123=>754,10124=>754,10125=>754,10126=>754,10127=>754,10128=>754,10129=>754,10130=>754,10131=>754,10132=>754,10136=>754,10137=>754,10138=>754,10139=>754,10140=>754,10141=>754,10142=>754,10143=>754,10144=>754,10145=>754,10146=>754,10147=>754,10148=>754,10149=>754,10150=>754,10151=>754,10152=>754,10153=>754,10154=>754,10155=>754,10156=>754,10157=>754,10158=>754,10159=>754,10161=>754,10162=>754,10163=>754,10164=>754,10165=>754,10166=>754,10167=>754,10168=>754,10169=>754,10170=>754,10171=>754,10172=>754,10173=>754,10174=>754,10181=>351,10182=>351,10208=>444,10214=>445,10215=>445,10216=>351,10217=>351,10218=>500,10219=>500,10224=>754,10225=>754,10226=>754,10227=>754,10228=>1042,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290,10237=>1290,10238=>1290,10239=>1290,10240=>659,10241=>659,10242=>659,10243=>659,10244=>659,10245=>659,10246=>659,10247=>659,10248=>659,10249=>659,10250=>659,10251=>659,10252=>659,10253=>659,10254=>659,10255=>659,10256=>659,10257=>659,10258=>659,10259=>659,10260=>659,10261=>659,10262=>659,10263=>659,10264=>659,10265=>659,10266=>659,10267=>659,10268=>659,10269=>659,10270=>659,10271=>659,10272=>659,10273=>659,10274=>659,10275=>659,10276=>659,10277=>659,10278=>659,10279=>659,10280=>659,10281=>659,10282=>659,10283=>659,10284=>659,10285=>659,10286=>659,10287=>659,10288=>659,10289=>659,10290=>659,10291=>659,10292=>659,10293=>659,10294=>659,10295=>659,10296=>659,10297=>659,10298=>659,10299=>659,10300=>659,10301=>659,10302=>659,10303=>659,10304=>659,10305=>659,10306=>659,10307=>659,10308=>659,10309=>659,10310=>659,10311=>659,10312=>659,10313=>659,10314=>659,10315=>659,10316=>659,10317=>659,10318=>659,10319=>659,10320=>659,10321=>659,10322=>659,10323=>659,10324=>659,10325=>659,10326=>659,10327=>659,10328=>659,10329=>659,10330=>659,10331=>659,10332=>659,10333=>659,10334=>659,10335=>659,10336=>659,10337=>659,10338=>659,10339=>659,10340=>659,10341=>659,10342=>659,10343=>659,10344=>659,10345=>659,10346=>659,10347=>659,10348=>659,10349=>659,10350=>659,10351=>659,10352=>659,10353=>659,10354=>659,10355=>659,10356=>659,10357=>659,10358=>659,10359=>659,10360=>659,10361=>659,10362=>659,10363=>659,10364=>659,10365=>659,10366=>659,10367=>659,10368=>659,10369=>659,10370=>659,10371=>659,10372=>659,10373=>659,10374=>659,10375=>659,10376=>659,10377=>659,10378=>659,10379=>659,10380=>659,10381=>659,10382=>659,10383=>659,10384=>659,10385=>659,10386=>659,10387=>659,10388=>659,10389=>659,10390=>659,10391=>659,10392=>659,10393=>659,10394=>659,10395=>659,10396=>659,10397=>659,10398=>659,10399=>659,10400=>659,10401=>659,10402=>659,10403=>659,10404=>659,10405=>659,10406=>659,10407=>659,10408=>659,10409=>659,10410=>659,10411=>659,10412=>659,10413=>659,10414=>659,10415=>659,10416=>659,10417=>659,10418=>659,10419=>659,10420=>659,10421=>659,10422=>659,10423=>659,10424=>659,10425=>659,10426=>659,10427=>659,10428=>659,10429=>659,10430=>659,10431=>659,10432=>659,10433=>659,10434=>659,10435=>659,10436=>659,10437=>659,10438=>659,10439=>659,10440=>659,10441=>659,10442=>659,10443=>659,10444=>659,10445=>659,10446=>659,10447=>659,10448=>659,10449=>659,10450=>659,10451=>659,10452=>659,10453=>659,10454=>659,10455=>659,10456=>659,10457=>659,10458=>659,10459=>659,10460=>659,10461=>659,10462=>659,10463=>659,10464=>659,10465=>659,10466=>659,10467=>659,10468=>659,10469=>659,10470=>659,10471=>659,10472=>659,10473=>659,10474=>659,10475=>659,10476=>659,10477=>659,10478=>659,10479=>659,10480=>659,10481=>659,10482=>659,10483=>659,10484=>659,10485=>659,10486=>659,10487=>659,10488=>659,10489=>659,10490=>659,10491=>659,10492=>659,10493=>659,10494=>659,10495=>659,10502=>754,10503=>754,10506=>754,10507=>754,10560=>615,10561=>615,10627=>660,10628=>660,10702=>754,10703=>900,10704=>900,10705=>900,10706=>900,10707=>900,10708=>900,10709=>900,10731=>444,10746=>754,10747=>754,10752=>900,10753=>900,10754=>900,10764=>1192,10765=>469,10766=>469,10767=>469,10768=>469,10769=>469,10770=>469,10771=>469,10772=>469,10773=>469,10774=>469,10775=>469,10776=>469,10777=>469,10778=>469,10779=>469,10780=>469,10799=>754,10877=>754,10878=>754,10879=>754,10880=>754,10881=>754,10882=>754,10883=>754,10884=>754,10885=>754,10886=>754,10887=>754,10888=>754,10889=>754,10890=>754,10891=>754,10892=>754,10893=>754,10894=>754,10895=>754,10896=>754,10897=>754,10898=>754,10899=>754,10900=>754,10901=>754,10902=>754,10903=>754,10904=>754,10905=>754,10906=>754,10907=>754,10908=>754,10909=>754,10910=>754,10911=>754,10912=>754,10926=>754,10927=>754,10928=>754,10929=>754,10930=>754,10931=>754,10932=>754,10933=>754,10934=>754,10935=>754,10936=>754,10937=>754,10938=>754,11001=>754,11002=>754,11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754,11018=>754,11019=>754,11020=>754,11021=>754,11022=>752,11023=>752,11024=>752,11025=>752,11026=>850,11027=>850,11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11039=>782,11040=>782,11041=>786,11042=>786,11043=>786,11044=>1007,11091=>782,11092=>782,11360=>501,11361=>250,11362=>501,11363=>542,11364=>625,11365=>551,11366=>353,11367=>677,11368=>570,11369=>590,11370=>521,11371=>616,11372=>472,11373=>703,11374=>776,11375=>615,11376=>703,11377=>661,11378=>1015,11379=>865,11380=>532,11381=>589,11382=>511,11383=>593,11385=>373,11386=>550,11387=>441,11388=>157,11389=>387,11390=>571,11391=>616,11800=>478,11810=>351,11811=>351,11812=>351,11813=>351,11822=>478,19904=>807,19905=>807,19906=>807,19907=>807,19908=>807,19909=>807,19910=>807,19911=>807,19912=>807,19913=>807,19914=>807,19915=>807,19916=>807,19917=>807,19918=>807,19919=>807,19920=>807,19921=>807,19922=>807,19923=>807,19924=>807,19925=>807,19926=>807,19927=>807,19928=>807,19929=>807,19930=>807,19931=>807,19932=>807,19933=>807,19934=>807,19935=>807,19936=>807,19937=>807,19938=>807,19939=>807,19940=>807,19941=>807,19942=>807,19943=>807,19944=>807,19945=>807,19946=>807,19947=>807,19948=>807,19949=>807,19950=>807,19951=>807,19952=>807,19953=>807,19954=>807,19955=>807,19956=>807,19957=>807,19958=>807,19959=>807,19960=>807,19961=>807,19962=>807,19963=>807,19964=>807,19965=>807,19966=>807,19967=>807,42564=>571,42565=>469,42566=>318,42567=>304,42572=>1062,42573=>925,42576=>926,42577=>815,42580=>971,42581=>757,42582=>886,42583=>762,42594=>922,42595=>833,42596=>912,42597=>810,42598=>776,42599=>907,42600=>708,42601=>550,42602=>770,42603=>641,42604=>1222,42605=>917,42606=>791,42634=>725,42635=>649,42636=>549,42637=>524,42644=>617,42645=>570,42760=>444,42761=>444,42762=>444,42763=>444,42764=>444,42765=>444,42766=>444,42767=>444,42768=>444,42769=>444,42770=>444,42771=>444,42772=>444,42773=>444,42774=>444,42779=>332,42780=>332,42781=>227,42782=>227,42783=>227,42786=>347,42787=>320,42788=>424,42789=>424,42790=>677,42791=>570,42792=>790,42793=>638,42794=>553,42795=>486,42800=>441,42801=>469,42802=>1125,42803=>886,42804=>1097,42805=>900,42806=>1039,42807=>896,42808=>874,42809=>736,42810=>874,42811=>736,42812=>863,42813=>736,42814=>628,42815=>494,42822=>612,42823=>353,42824=>523,42825=>384,42826=>726,42827=>633,42830=>1222,42831=>917,42832=>542,42833=>571,42834=>660,42835=>697,42838=>708,42839=>571,42852=>544,42853=>571,42854=>544,42855=>571,42880=>501,42881=>250,42882=>662,42883=>570,42889=>303,42890=>338,42891=>360,42892=>247,42893=>617,42894=>438,42896=>695,42897=>600,43002=>823,43003=>518,43004=>542,43005=>776,43006=>265,43007=>1079,61184=>192,61185=>214,61186=>231,61187=>237,61188=>240,61189=>214,61190=>192,61191=>214,61192=>231,61193=>237,61194=>231,61195=>214,61196=>192,61197=>214,61198=>231,61199=>237,61200=>231,61201=>214,61202=>192,61203=>214,61204=>240,61205=>237,61206=>231,61207=>214,61208=>192,61209=>247,63173=>550,64256=>649,64257=>581,64258=>581,64259=>899,64260=>899,64261=>617,64262=>774,64275=>1081,64276=>1081,64277=>1076,64278=>1067,64279=>1376,64285=>201,64286=>0,64287=>423,64288=>572,64289=>770,64290=>696,64291=>815,64292=>694,64293=>759,64294=>769,64295=>726,64296=>788,64297=>754,64298=>637,64299=>637,64300=>637,64301=>637,64302=>602,64303=>602,64304=>602,64305=>520,64306=>371,64307=>491,64308=>588,64309=>245,64310=>312,64311=>900,64312=>583,64313=>276,64314=>483,64315=>476,64316=>511,64317=>900,64318=>611,64319=>900,64320=>360,64321=>584,64322=>900,64323=>576,64324=>562,64325=>900,64326=>534,64327=>638,64328=>508,64329=>637,64330=>591,64331=>245,64332=>520,64333=>476,64334=>562,64335=>566,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>923,65535=>540);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedi.z
new file mode 100644
index 00000000..0a4c451c
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusanscondensedi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansextralight.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansextralight.ctg.z
new file mode 100644
index 00000000..3c980ae2
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansextralight.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansextralight.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansextralight.php
new file mode 100644
index 00000000..91bf550d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansextralight.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSans-ExtraLight';
+$up=-63;
+$ut=44;
+$dw=600;
+$diff='';
+$originalsize=345208;
+$enc='';
+$file='dejavusansextralight.z';
+$ctg='dejavusansextralight.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-733 -269 1659 1104]','ItalicAngle'=>0,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>547,'StemV'=>17,'StemH'=>7,'AvgWidth'=>506,'MaxWidth'=>1735,'MissingWidth'=>600);
+$cw=array(0=>600,32=>318,33=>401,34=>460,35=>838,36=>636,37=>950,38=>780,39=>275,40=>390,41=>390,42=>500,43=>838,44=>318,45=>361,46=>318,47=>337,48=>636,49=>636,50=>636,51=>636,52=>636,53=>636,54=>636,55=>636,56=>636,57=>636,58=>337,59=>337,60=>838,61=>838,62=>838,63=>531,64=>1000,65=>684,66=>655,67=>698,68=>770,69=>632,70=>575,71=>775,72=>752,73=>295,74=>295,75=>656,76=>557,77=>863,78=>748,79=>787,80=>603,81=>787,82=>695,83=>635,84=>611,85=>732,86=>684,87=>989,88=>685,89=>611,90=>685,91=>390,92=>337,93=>390,94=>838,95=>500,96=>500,97=>613,98=>635,99=>550,100=>635,101=>615,102=>352,103=>600,104=>634,105=>278,106=>278,107=>579,108=>278,109=>974,110=>634,111=>612,112=>635,113=>635,114=>411,115=>521,116=>392,117=>634,118=>592,119=>818,120=>592,121=>592,122=>525,123=>636,124=>337,125=>636,126=>838,160=>318,161=>401,162=>636,163=>636,164=>636,165=>636,166=>337,167=>500,168=>500,169=>1000,170=>471,171=>612,172=>838,173=>361,174=>1000,175=>500,176=>500,177=>838,178=>401,179=>401,180=>483,181=>636,182=>636,183=>318,184=>500,185=>401,186=>471,187=>612,188=>969,189=>969,190=>969,191=>536,192=>684,193=>684,194=>684,195=>684,196=>684,197=>684,198=>974,199=>698,200=>632,201=>632,202=>632,203=>632,204=>295,205=>295,206=>295,207=>295,208=>775,209=>748,210=>787,211=>787,212=>787,213=>787,214=>787,215=>838,216=>787,217=>732,218=>732,219=>732,220=>732,221=>611,222=>605,223=>676,224=>613,225=>613,226=>613,227=>613,228=>613,229=>613,230=>982,231=>550,232=>615,233=>615,234=>615,235=>615,236=>278,237=>278,238=>278,239=>278,240=>612,241=>634,242=>612,243=>612,244=>612,245=>612,246=>612,247=>838,248=>612,249=>634,250=>634,251=>634,252=>634,253=>592,254=>635,255=>592,256=>684,257=>613,258=>684,259=>613,260=>684,261=>613,262=>698,263=>550,264=>698,265=>550,266=>698,267=>550,268=>698,269=>550,270=>770,271=>635,272=>775,273=>635,274=>632,275=>615,276=>632,277=>615,278=>632,279=>615,280=>632,281=>615,282=>632,283=>615,284=>775,285=>600,286=>775,287=>600,288=>775,289=>600,290=>775,291=>600,292=>752,293=>634,294=>916,295=>695,296=>295,297=>278,298=>295,299=>278,300=>295,301=>278,302=>295,303=>278,304=>295,305=>278,306=>590,307=>556,308=>295,309=>278,310=>656,311=>579,312=>579,313=>557,314=>278,315=>557,316=>278,317=>557,318=>375,319=>557,320=>342,321=>562,322=>284,323=>748,324=>634,325=>748,326=>634,327=>748,328=>634,329=>813,330=>757,331=>634,332=>787,333=>612,334=>787,335=>612,336=>787,337=>612,338=>1070,339=>1023,340=>695,341=>411,342=>695,343=>411,344=>695,345=>411,346=>635,347=>521,348=>635,349=>521,350=>635,351=>521,352=>635,353=>521,354=>611,355=>392,356=>611,357=>392,358=>611,359=>392,360=>732,361=>634,362=>732,363=>634,364=>732,365=>634,366=>732,367=>634,368=>732,369=>634,370=>732,371=>634,372=>989,373=>818,374=>611,375=>592,376=>611,377=>685,378=>525,379=>685,380=>525,381=>685,382=>525,383=>352,384=>635,385=>735,386=>686,387=>635,390=>698,391=>698,392=>550,393=>775,394=>824,395=>686,396=>635,397=>612,398=>632,399=>787,400=>585,401=>575,402=>352,403=>775,404=>685,405=>965,406=>354,407=>295,408=>690,409=>526,410=>278,412=>974,413=>748,414=>634,415=>787,416=>934,417=>757,418=>949,419=>759,420=>652,421=>635,422=>695,423=>635,424=>521,425=>632,427=>392,428=>611,429=>392,430=>611,431=>879,432=>779,433=>764,434=>721,435=>696,436=>805,437=>685,438=>525,448=>295,449=>492,450=>459,451=>295,452=>1422,453=>1299,454=>1154,455=>835,456=>787,457=>457,458=>931,459=>924,460=>797,461=>684,462=>613,463=>295,464=>278,465=>787,466=>612,467=>732,468=>634,469=>732,470=>634,471=>732,472=>634,473=>732,474=>634,475=>732,476=>634,477=>615,478=>684,479=>613,480=>684,481=>613,482=>974,483=>982,484=>775,485=>600,486=>775,487=>600,488=>656,489=>579,490=>787,491=>612,492=>787,493=>612,496=>278,497=>1422,498=>1299,499=>1154,500=>775,501=>600,504=>748,505=>634,506=>684,507=>613,508=>974,509=>982,510=>787,511=>612,512=>684,513=>613,514=>684,515=>613,516=>632,517=>615,518=>632,519=>615,520=>295,521=>278,522=>295,523=>278,524=>787,525=>612,526=>787,527=>612,528=>695,529=>411,530=>695,531=>411,532=>732,533=>634,534=>732,535=>634,536=>635,537=>521,538=>611,539=>392,542=>752,543=>634,548=>685,549=>525,550=>684,551=>613,552=>632,553=>615,554=>787,555=>612,556=>787,557=>612,558=>787,559=>612,560=>787,561=>612,562=>611,563=>592,567=>278,568=>1032,569=>1032,581=>684,584=>295,585=>278,587=>635,588=>695,589=>411,592=>614,593=>635,594=>635,595=>635,596=>550,598=>635,599=>727,600=>615,601=>615,603=>541,604=>541,607=>326,608=>637,609=>635,611=>685,613=>634,614=>634,615=>634,616=>278,617=>387,618=>372,621=>387,623=>974,624=>974,625=>974,626=>634,627=>634,628=>634,629=>612,632=>660,633=>411,634=>411,635=>411,636=>411,637=>411,638=>530,639=>530,640=>602,641=>602,642=>521,643=>336,645=>461,647=>392,648=>392,649=>634,650=>618,651=>598,652=>592,653=>818,654=>592,656=>525,665=>580,668=>654,670=>667,671=>583,672=>712,675=>1014,678=>824,679=>610,681=>848,682=>641,683=>654,686=>661,687=>664,699=>318,700=>318,702=>307,710=>500,711=>500,713=>500,714=>483,715=>500,717=>500,718=>500,719=>483,728=>500,729=>500,730=>500,731=>500,732=>500,733=>500,741=>493,742=>493,743=>493,744=>493,745=>493,755=>500,759=>500,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,795=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,831=>0,847=>0,856=>0,860=>0,861=>0,865=>0,880=>654,881=>568,882=>862,883=>647,884=>278,885=>278,886=>748,887=>650,890=>361,891=>549,892=>550,893=>549,894=>337,900=>483,901=>500,902=>692,903=>318,904=>746,905=>871,906=>408,908=>813,910=>825,911=>826,912=>387,913=>684,914=>655,915=>557,916=>684,917=>632,918=>685,919=>752,920=>787,921=>295,922=>656,923=>684,924=>863,925=>748,926=>632,927=>787,928=>752,929=>603,931=>632,932=>611,933=>611,934=>860,935=>685,936=>787,937=>764,938=>295,939=>611,940=>659,941=>541,942=>634,943=>387,944=>579,945=>659,946=>638,947=>592,948=>612,949=>541,950=>544,951=>634,952=>612,953=>387,954=>594,955=>592,956=>636,957=>559,958=>558,959=>612,960=>602,961=>635,962=>587,963=>634,964=>602,965=>579,966=>660,967=>592,968=>660,969=>837,970=>387,971=>579,972=>612,973=>579,974=>837,975=>656,981=>660,982=>837,984=>787,985=>612,988=>575,1009=>635,1010=>550,1011=>278,1012=>787,1013=>615,1014=>615,1015=>605,1016=>635,1017=>698,1020=>635,1021=>698,1022=>698,1023=>698,1024=>632,1025=>632,1026=>786,1027=>557,1028=>698,1029=>635,1030=>295,1031=>295,1032=>295,1033=>1094,1034=>1045,1035=>786,1036=>674,1037=>755,1038=>609,1039=>752,1040=>684,1041=>686,1042=>655,1043=>557,1044=>776,1045=>632,1046=>1040,1047=>636,1048=>755,1049=>755,1050=>674,1051=>752,1052=>863,1053=>752,1054=>787,1055=>752,1056=>603,1057=>698,1058=>611,1059=>609,1060=>860,1061=>685,1062=>776,1063=>686,1064=>1068,1065=>1094,1066=>833,1067=>882,1068=>686,1069=>698,1070=>1031,1071=>695,1072=>613,1073=>612,1074=>586,1075=>491,1076=>677,1077=>615,1078=>908,1079=>541,1080=>659,1081=>659,1082=>594,1083=>639,1084=>754,1085=>654,1086=>612,1087=>654,1088=>635,1089=>550,1090=>549,1091=>592,1092=>854,1093=>592,1094=>681,1095=>591,1096=>917,1097=>938,1098=>727,1099=>765,1100=>589,1101=>549,1102=>813,1103=>592,1104=>615,1105=>615,1106=>625,1107=>491,1108=>549,1109=>521,1110=>278,1111=>278,1112=>278,1113=>898,1114=>892,1115=>652,1116=>594,1117=>659,1118=>592,1119=>662,1121=>837,1122=>769,1123=>667,1124=>942,1125=>749,1136=>787,1137=>660,1138=>787,1168=>557,1169=>491,1176=>636,1177=>541,1184=>856,1185=>832,1188=>1014,1189=>868,1194=>698,1195=>550,1198=>611,1199=>592,1204=>934,1205=>809,1210=>686,1211=>634,1216=>278,1217=>1040,1218=>908,1223=>752,1224=>654,1232=>684,1233=>613,1234=>684,1235=>613,1236=>974,1237=>982,1238=>632,1239=>615,1240=>787,1241=>615,1242=>787,1243=>615,1244=>1040,1245=>908,1246=>636,1247=>541,1250=>755,1251=>659,1252=>755,1253=>659,1254=>787,1255=>612,1256=>787,1257=>612,1258=>787,1259=>612,1260=>698,1261=>549,1262=>609,1263=>592,1264=>609,1265=>592,1266=>609,1267=>592,1268=>686,1269=>591,1272=>882,1273=>765,1278=>685,1279=>592,1280=>686,1281=>589,1296=>585,1297=>541,1298=>752,1299=>639,1300=>1169,1301=>994,1306=>787,1307=>635,1308=>989,1309=>818,1329=>792,1330=>746,1331=>790,1332=>800,1333=>746,1334=>779,1335=>665,1336=>746,1337=>877,1338=>780,1339=>689,1340=>540,1341=>1040,1342=>858,1343=>744,1344=>684,1345=>774,1346=>800,1347=>794,1348=>789,1349=>728,1350=>755,1351=>755,1352=>732,1353=>739,1354=>889,1355=>792,1356=>833,1357=>732,1358=>790,1359=>737,1360=>732,1361=>728,1362=>557,1363=>784,1364=>767,1365=>787,1366=>833,1370=>318,1371=>224,1372=>359,1373=>213,1374=>370,1375=>366,1377=>974,1378=>634,1379=>702,1380=>742,1381=>634,1382=>702,1383=>567,1384=>634,1385=>832,1386=>702,1387=>634,1388=>280,1389=>894,1390=>645,1391=>634,1392=>634,1393=>606,1394=>702,1395=>649,1396=>709,1397=>278,1398=>669,1399=>581,1400=>634,1401=>419,1402=>974,1403=>581,1404=>671,1405=>634,1406=>701,1407=>1002,1408=>634,1409=>600,1410=>477,1411=>1002,1412=>645,1413=>612,1414=>899,1415=>836,1417=>337,1418=>313,1652=>292,4304=>469,4305=>469,4306=>519,4307=>741,4308=>479,4309=>478,4310=>468,4311=>749,4312=>469,4313=>479,4314=>1058,4315=>479,4316=>479,4317=>744,4318=>469,4319=>479,4320=>753,4321=>479,4322=>578,4323=>468,4324=>729,4325=>478,4326=>743,4327=>479,4328=>479,4329=>479,4330=>532,4331=>479,4332=>478,4333=>469,4334=>479,4335=>469,4336=>468,4337=>506,4338=>469,4339=>469,4340=>469,4341=>524,4342=>755,4343=>517,4344=>469,4345=>519,4346=>524,4347=>416,4348=>304,5760=>477,5761=>493,5762=>712,5763=>931,5764=>1150,5765=>1370,5766=>493,5767=>712,5768=>931,5769=>1150,5770=>1370,5771=>498,5772=>718,5773=>938,5774=>1159,5775=>1379,5776=>493,5777=>712,5778=>930,5779=>1149,5780=>1370,5781=>498,5782=>752,5783=>789,5784=>1205,5785=>1150,5786=>683,5787=>507,5788=>507,7426=>982,7428=>550,7433=>278,7435=>604,7437=>754,7438=>650,7439=>612,7440=>550,7441=>684,7442=>684,7443=>684,7444=>1023,7446=>612,7447=>612,7449=>592,7450=>592,7456=>592,7457=>818,7458=>525,7462=>525,7463=>592,7464=>654,7467=>639,7543=>635,7680=>684,7681=>613,7682=>655,7683=>635,7684=>655,7685=>635,7686=>655,7687=>635,7688=>698,7689=>550,7690=>770,7691=>635,7692=>770,7693=>635,7694=>770,7695=>635,7696=>770,7697=>635,7698=>770,7699=>635,7700=>632,7701=>615,7702=>632,7703=>615,7704=>632,7705=>615,7706=>632,7707=>615,7708=>632,7709=>615,7710=>575,7711=>352,7712=>775,7713=>600,7714=>752,7715=>634,7716=>752,7717=>634,7718=>752,7719=>634,7720=>752,7721=>634,7722=>752,7723=>634,7724=>295,7725=>278,7726=>295,7727=>278,7728=>656,7729=>579,7730=>656,7731=>579,7732=>656,7733=>579,7734=>557,7735=>288,7736=>557,7737=>288,7738=>557,7739=>278,7740=>557,7741=>278,7742=>863,7743=>974,7744=>863,7745=>974,7746=>863,7747=>974,7748=>748,7749=>634,7750=>748,7751=>634,7752=>748,7753=>634,7754=>748,7755=>634,7756=>787,7757=>612,7758=>787,7759=>612,7760=>787,7761=>612,7762=>787,7763=>612,7764=>603,7765=>635,7766=>603,7767=>635,7768=>695,7769=>411,7770=>695,7771=>411,7772=>695,7773=>411,7774=>695,7775=>411,7776=>635,7777=>521,7778=>635,7779=>521,7780=>635,7781=>521,7782=>635,7783=>521,7784=>635,7785=>521,7786=>611,7787=>392,7788=>611,7789=>392,7790=>611,7791=>392,7792=>611,7793=>392,7794=>732,7795=>634,7796=>732,7797=>634,7798=>732,7799=>634,7800=>732,7801=>634,7802=>732,7803=>634,7804=>684,7805=>592,7806=>684,7807=>592,7808=>989,7809=>818,7810=>989,7811=>818,7812=>989,7813=>818,7814=>989,7815=>818,7816=>989,7817=>818,7818=>685,7819=>592,7820=>685,7821=>592,7822=>611,7823=>592,7824=>685,7825=>525,7826=>685,7827=>525,7828=>685,7829=>525,7830=>634,7831=>392,7832=>818,7833=>592,7834=>613,7835=>352,7836=>352,7837=>352,7838=>769,7839=>612,7840=>684,7841=>613,7842=>684,7843=>613,7844=>684,7845=>613,7846=>684,7847=>613,7848=>684,7849=>613,7850=>684,7851=>613,7852=>684,7853=>613,7854=>684,7855=>613,7856=>684,7857=>613,7858=>684,7859=>613,7860=>684,7861=>613,7862=>684,7863=>613,7864=>632,7865=>615,7866=>632,7867=>615,7868=>632,7869=>615,7870=>632,7871=>615,7872=>632,7873=>615,7874=>632,7875=>615,7876=>632,7877=>615,7878=>632,7879=>615,7880=>295,7881=>278,7882=>295,7883=>278,7884=>787,7885=>612,7886=>787,7887=>612,7888=>787,7889=>612,7890=>787,7891=>612,7892=>787,7893=>612,7894=>787,7895=>612,7896=>787,7897=>612,7898=>934,7899=>757,7900=>934,7901=>757,7902=>934,7903=>757,7904=>934,7905=>757,7906=>934,7907=>757,7908=>732,7909=>634,7910=>732,7911=>634,7912=>879,7913=>779,7914=>879,7915=>779,7916=>879,7917=>779,7918=>879,7919=>779,7920=>879,7921=>779,7922=>611,7923=>592,7924=>611,7925=>592,7926=>611,7927=>592,7928=>611,7929=>592,7930=>769,7931=>477,7936=>659,7937=>659,7938=>659,7939=>659,7940=>659,7941=>659,7942=>659,7943=>659,7944=>684,7945=>684,7946=>877,7947=>877,7948=>769,7949=>801,7950=>708,7951=>743,7952=>541,7953=>541,7954=>541,7955=>541,7956=>541,7957=>541,7960=>711,7961=>711,7962=>966,7963=>975,7964=>898,7965=>928,7968=>634,7969=>634,7970=>634,7971=>634,7972=>634,7973=>634,7974=>634,7975=>634,7976=>837,7977=>835,7978=>1086,7979=>1089,7980=>1027,7981=>1051,7982=>934,7983=>947,7984=>338,7985=>338,7986=>338,7987=>338,7988=>338,7989=>338,7990=>338,7991=>338,7992=>380,7993=>374,7994=>635,7995=>635,7996=>570,7997=>600,7998=>489,7999=>493,8000=>612,8001=>612,8002=>612,8003=>612,8004=>612,8005=>612,8008=>804,8009=>848,8010=>1095,8011=>1100,8012=>938,8013=>970,8016=>579,8017=>579,8018=>579,8019=>579,8020=>579,8021=>579,8022=>579,8023=>579,8025=>784,8027=>998,8029=>1012,8031=>897,8032=>837,8033=>837,8034=>837,8035=>837,8036=>837,8037=>837,8038=>837,8039=>837,8040=>802,8041=>843,8042=>1089,8043=>1095,8044=>946,8045=>972,8046=>921,8047=>952,8048=>659,8049=>659,8050=>541,8051=>548,8052=>634,8053=>654,8054=>338,8055=>338,8056=>612,8057=>612,8058=>579,8059=>579,8060=>837,8061=>837,8064=>659,8065=>659,8066=>659,8067=>659,8068=>659,8069=>659,8070=>659,8071=>659,8072=>684,8073=>684,8074=>877,8075=>877,8076=>769,8077=>801,8078=>708,8079=>743,8080=>634,8081=>634,8082=>634,8083=>634,8084=>634,8085=>634,8086=>634,8087=>634,8088=>837,8089=>835,8090=>1086,8091=>1089,8092=>1027,8093=>1051,8094=>934,8095=>947,8096=>837,8097=>837,8098=>837,8099=>837,8100=>837,8101=>837,8102=>837,8103=>837,8104=>802,8105=>843,8106=>1089,8107=>1095,8108=>946,8109=>972,8110=>921,8111=>952,8112=>659,8113=>659,8114=>659,8115=>659,8116=>659,8118=>659,8119=>659,8120=>684,8121=>684,8122=>716,8123=>692,8124=>684,8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>634,8131=>634,8132=>654,8134=>634,8135=>634,8136=>805,8137=>746,8138=>931,8139=>871,8140=>752,8141=>500,8142=>500,8143=>500,8144=>338,8145=>338,8146=>338,8147=>338,8150=>338,8151=>338,8152=>295,8153=>295,8154=>475,8155=>408,8157=>500,8158=>500,8159=>500,8160=>579,8161=>579,8162=>579,8163=>579,8164=>635,8165=>635,8166=>579,8167=>579,8168=>611,8169=>611,8170=>845,8171=>825,8172=>685,8173=>500,8174=>500,8175=>500,8178=>837,8179=>837,8180=>837,8182=>837,8183=>837,8184=>941,8185=>813,8186=>922,8187=>826,8188=>764,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>636,8200=>318,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>361,8209=>361,8210=>636,8211=>500,8212=>1000,8213=>1000,8214=>500,8215=>500,8216=>318,8217=>318,8218=>318,8219=>318,8220=>518,8221=>518,8222=>518,8223=>518,8224=>500,8225=>500,8228=>334,8229=>667,8230=>1000,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200,8240=>1342,8241=>1735,8249=>400,8250=>400,8251=>838,8252=>485,8253=>531,8254=>500,8255=>804,8256=>804,8258=>1000,8259=>500,8260=>167,8261=>390,8262=>390,8263=>922,8264=>733,8265=>733,8267=>636,8268=>500,8269=>500,8270=>500,8271=>337,8272=>804,8273=>500,8274=>450,8275=>1000,8276=>804,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>401,8305=>179,8308=>401,8320=>401,8321=>401,8322=>401,8323=>401,8324=>401,8363=>636,8364=>636,8369=>636,8376=>636,8377=>636,8451=>1123,8457=>952,8462=>634,8463=>634,8470=>1165,8471=>1000,8486=>764,8487=>764,8490=>656,8491=>684,8494=>854,8498=>575,8500=>462,8523=>780,8530=>1370,8531=>969,8532=>969,8543=>568,8544=>295,8545=>492,8546=>689,8547=>923,8548=>684,8549=>922,8550=>1120,8551=>1317,8552=>917,8553=>685,8554=>933,8555=>1131,8556=>557,8557=>698,8558=>770,8559=>863,8560=>278,8561=>458,8562=>637,8563=>812,8564=>592,8565=>811,8566=>991,8567=>1170,8568=>819,8569=>592,8570=>822,8571=>1002,8572=>278,8573=>550,8574=>635,8575=>974,8576=>1285,8577=>770,8578=>1285,8579=>698,8580=>549,8581=>698,8585=>969,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838,8601=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838,8704=>684,8707=>632,8710=>684,8711=>684,8722=>838,8725=>337,8726=>637,8727=>626,8728=>626,8756=>636,8757=>636,8758=>260,8759=>636,8764=>636,9134=>521,9167=>945,10731=>494,10799=>838,11374=>863,11375=>684,11381=>654,11382=>568,11383=>660,11386=>612,11800=>536,11810=>390,11811=>390,11812=>390,11813=>390,11822=>531,42564=>635,42565=>521,42566=>354,42567=>387,42576=>1029,42577=>906,42580=>1031,42581=>813,42582=>927,42583=>814,42594=>1014,42595=>866,42596=>1015,42597=>864,42598=>1088,42599=>944,42600=>787,42601=>612,42602=>855,42603=>712,42604=>1358,42605=>1019,42606=>879,42636=>611,42637=>549,42644=>686,42645=>634,42760=>493,42761=>493,42762=>493,42763=>493,42764=>493,42765=>493,42766=>493,42767=>493,42768=>493,42769=>493,42770=>493,42771=>493,42772=>493,42773=>493,42774=>493,42779=>369,42780=>369,42781=>252,42782=>252,42783=>252,42786=>385,42787=>356,42788=>472,42789=>472,42790=>752,42791=>634,42800=>491,42801=>521,42802=>1250,42803=>985,42814=>703,42815=>549,42822=>680,42823=>392,42830=>1358,42831=>1019,42880=>557,42881=>278,42891=>401,42892=>275,42893=>686,43002=>917,43003=>575,43004=>603,43005=>863,43006=>295,43007=>1199,63173=>612,64256=>689,64257=>630,64258=>630,64259=>967,64260=>967,64297=>838,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65533=>1025,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansextralight.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansextralight.z
new file mode 100644
index 00000000..1c970cd2
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansextralight.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansi.ctg.z
new file mode 100644
index 00000000..4525c434
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansi.php
new file mode 100644
index 00000000..338b2c33
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSans-Oblique';
+$up=-63;
+$ut=44;
+$dw=600;
+$diff='';
+$originalsize=611556;
+$enc='';
+$file='dejavusansi.z';
+$ctg='dejavusansi.ctg.z';
+$desc=array('Flags'=>96,'FontBBox'=>'[-1016 -350 1659 1068]','ItalicAngle'=>-11,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>547,'StemV'=>34,'StemH'=>15,'AvgWidth'=>507,'MaxWidth'=>1690,'MissingWidth'=>600);
+$cw=array(0=>600,32=>318,33=>401,34=>460,35=>838,36=>636,37=>950,38=>780,39=>275,40=>390,41=>390,42=>500,43=>838,44=>318,45=>361,46=>318,47=>337,48=>636,49=>636,50=>636,51=>636,52=>636,53=>636,54=>636,55=>636,56=>636,57=>636,58=>337,59=>337,60=>838,61=>838,62=>838,63=>531,64=>1000,65=>684,66=>686,67=>698,68=>770,69=>632,70=>575,71=>775,72=>752,73=>295,74=>295,75=>656,76=>557,77=>863,78=>748,79=>787,80=>603,81=>787,82=>695,83=>635,84=>611,85=>732,86=>684,87=>989,88=>685,89=>611,90=>685,91=>390,92=>337,93=>390,94=>838,95=>500,96=>500,97=>613,98=>635,99=>550,100=>635,101=>615,102=>352,103=>635,104=>634,105=>278,106=>278,107=>579,108=>278,109=>974,110=>634,111=>612,112=>635,113=>635,114=>411,115=>521,116=>392,117=>634,118=>592,119=>818,120=>592,121=>592,122=>525,123=>636,124=>337,125=>636,126=>838,160=>318,161=>401,162=>636,163=>636,164=>636,165=>636,166=>337,167=>500,168=>500,169=>1000,170=>471,171=>617,172=>838,173=>361,174=>1000,175=>500,176=>500,177=>838,178=>401,179=>401,180=>500,181=>636,182=>636,183=>318,184=>500,185=>401,186=>471,187=>617,188=>969,189=>969,190=>969,191=>531,192=>684,193=>684,194=>684,195=>684,196=>684,197=>684,198=>974,199=>698,200=>632,201=>632,202=>632,203=>632,204=>295,205=>295,206=>295,207=>295,208=>775,209=>748,210=>787,211=>787,212=>787,213=>787,214=>787,215=>838,216=>787,217=>732,218=>732,219=>732,220=>732,221=>611,222=>608,223=>630,224=>613,225=>613,226=>613,227=>613,228=>613,229=>613,230=>995,231=>550,232=>615,233=>615,234=>615,235=>615,236=>278,237=>278,238=>278,239=>278,240=>612,241=>634,242=>612,243=>612,244=>612,245=>612,246=>612,247=>838,248=>612,249=>634,250=>634,251=>634,252=>634,253=>592,254=>635,255=>592,256=>684,257=>613,258=>684,259=>613,260=>684,261=>613,262=>698,263=>550,264=>698,265=>550,266=>698,267=>550,268=>698,269=>550,270=>770,271=>635,272=>775,273=>635,274=>632,275=>615,276=>632,277=>615,278=>632,279=>615,280=>632,281=>615,282=>632,283=>615,284=>775,285=>635,286=>775,287=>635,288=>775,289=>635,290=>775,291=>635,292=>752,293=>634,294=>916,295=>695,296=>295,297=>278,298=>295,299=>278,300=>295,301=>278,302=>295,303=>278,304=>295,305=>278,306=>590,307=>556,308=>295,309=>278,310=>656,311=>579,312=>579,313=>557,314=>278,315=>557,316=>278,317=>557,318=>278,319=>557,320=>278,321=>562,322=>287,323=>748,324=>634,325=>748,326=>634,327=>748,328=>634,329=>813,330=>748,331=>634,332=>787,333=>612,334=>787,335=>612,336=>787,337=>612,338=>1070,339=>1028,340=>695,341=>411,342=>695,343=>411,344=>695,345=>411,346=>635,347=>521,348=>635,349=>521,350=>635,351=>521,352=>635,353=>521,354=>611,355=>392,356=>611,357=>392,358=>611,359=>392,360=>732,361=>634,362=>732,363=>634,364=>732,365=>634,366=>732,367=>634,368=>732,369=>634,370=>732,371=>634,372=>989,373=>818,374=>611,375=>592,376=>611,377=>685,378=>525,379=>685,380=>525,381=>685,382=>525,383=>352,384=>635,385=>735,386=>686,387=>635,388=>686,389=>635,390=>703,391=>698,392=>550,393=>775,394=>819,395=>686,396=>635,397=>612,398=>632,399=>787,400=>614,401=>575,402=>352,403=>775,404=>687,405=>984,406=>354,407=>295,408=>746,409=>579,410=>278,411=>592,412=>974,413=>748,414=>634,415=>787,416=>913,417=>612,418=>938,419=>737,420=>652,421=>635,422=>695,423=>635,424=>521,425=>632,426=>336,427=>392,428=>611,429=>392,430=>611,431=>838,432=>634,433=>764,434=>721,435=>744,436=>730,437=>685,438=>525,439=>666,440=>666,441=>578,442=>525,443=>636,444=>666,445=>578,446=>510,447=>635,448=>295,449=>492,450=>459,451=>295,452=>1455,453=>1295,454=>1160,455=>852,456=>835,457=>556,458=>1043,459=>1026,460=>912,461=>684,462=>613,463=>295,464=>278,465=>787,466=>612,467=>732,468=>634,469=>732,470=>634,471=>732,472=>634,473=>732,474=>634,475=>732,476=>634,477=>615,478=>684,479=>613,480=>684,481=>613,482=>974,483=>995,484=>775,485=>635,486=>775,487=>635,488=>656,489=>579,490=>787,491=>612,492=>787,493=>612,494=>666,495=>525,496=>278,497=>1455,498=>1295,499=>1160,500=>775,501=>635,502=>1113,503=>682,504=>748,505=>634,506=>684,507=>613,508=>974,509=>995,510=>787,511=>612,512=>684,513=>613,514=>684,515=>613,516=>632,517=>615,518=>632,519=>615,520=>295,521=>278,522=>295,523=>278,524=>787,525=>612,526=>787,527=>612,528=>695,529=>411,530=>695,531=>411,532=>732,533=>634,534=>732,535=>634,536=>635,537=>521,538=>611,539=>392,540=>627,541=>521,542=>752,543=>634,544=>735,545=>838,546=>698,547=>610,548=>685,549=>525,550=>684,551=>613,552=>632,553=>615,554=>787,555=>612,556=>787,557=>612,558=>787,559=>612,560=>787,561=>612,562=>611,563=>592,564=>475,565=>843,566=>477,567=>278,568=>998,569=>998,570=>684,571=>698,572=>550,573=>557,574=>611,575=>521,576=>525,577=>603,578=>479,579=>686,580=>732,581=>684,582=>632,583=>615,584=>295,585=>278,586=>781,587=>635,588=>695,589=>411,590=>611,591=>592,592=>613,593=>635,594=>635,595=>635,596=>550,597=>550,598=>635,599=>727,600=>615,601=>615,602=>844,603=>545,604=>545,605=>775,606=>664,607=>326,608=>696,609=>635,610=>629,611=>596,612=>596,613=>634,614=>634,615=>634,616=>372,617=>387,618=>372,619=>396,620=>487,621=>278,622=>706,623=>974,624=>974,625=>974,626=>646,627=>642,628=>634,629=>612,630=>858,631=>728,632=>660,633=>469,634=>469,635=>469,636=>469,637=>469,638=>530,639=>530,640=>602,641=>602,642=>521,643=>336,644=>336,645=>461,646=>336,647=>392,648=>392,649=>634,650=>618,651=>598,652=>592,653=>818,654=>592,655=>611,656=>525,657=>525,658=>578,659=>578,660=>510,661=>510,662=>510,663=>510,664=>787,665=>580,666=>664,667=>708,668=>654,669=>292,670=>667,671=>507,672=>727,673=>510,674=>510,675=>1014,676=>1058,677=>1013,678=>824,679=>610,680=>778,681=>848,682=>641,683=>654,684=>515,685=>515,686=>570,687=>664,688=>399,689=>399,690=>175,691=>259,692=>295,693=>296,694=>379,695=>515,696=>373,697=>278,698=>460,699=>318,700=>318,701=>318,702=>307,703=>307,704=>370,705=>370,706=>500,707=>500,708=>500,709=>500,710=>500,711=>500,712=>275,713=>500,714=>500,715=>500,716=>275,717=>500,718=>500,719=>500,720=>337,721=>337,722=>307,723=>307,724=>500,725=>500,726=>390,727=>317,728=>500,729=>500,730=>500,731=>500,732=>500,733=>500,734=>315,735=>500,736=>426,737=>166,738=>373,739=>444,740=>370,741=>493,742=>493,743=>493,744=>493,745=>493,748=>500,749=>500,750=>518,755=>500,759=>500,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>654,881=>568,882=>862,883=>647,884=>278,885=>278,886=>748,887=>650,890=>500,891=>549,892=>550,893=>549,894=>337,900=>500,901=>500,902=>684,903=>318,904=>767,905=>903,906=>435,908=>839,910=>860,911=>905,912=>338,913=>684,914=>686,915=>557,916=>684,917=>632,918=>685,919=>752,920=>787,921=>295,922=>656,923=>684,924=>863,925=>748,926=>632,927=>787,928=>752,929=>603,931=>632,932=>611,933=>611,934=>787,935=>685,936=>787,937=>764,938=>295,939=>611,940=>659,941=>541,942=>634,943=>338,944=>579,945=>659,946=>638,947=>592,948=>612,949=>541,950=>544,951=>634,952=>612,953=>338,954=>589,955=>592,956=>636,957=>559,958=>558,959=>612,960=>602,961=>635,962=>587,963=>634,964=>602,965=>579,966=>660,967=>592,968=>660,969=>837,970=>338,971=>579,972=>612,973=>579,974=>837,975=>656,976=>614,977=>619,978=>699,979=>842,980=>699,981=>660,982=>837,983=>664,984=>787,985=>612,986=>648,987=>587,988=>575,989=>458,990=>660,991=>660,992=>865,993=>627,994=>934,995=>837,996=>758,997=>659,998=>792,999=>615,1000=>687,1001=>607,1002=>768,1003=>625,1004=>699,1005=>612,1006=>611,1007=>536,1008=>664,1009=>635,1010=>550,1011=>278,1012=>787,1013=>615,1014=>615,1015=>608,1016=>635,1017=>698,1018=>863,1019=>651,1020=>635,1021=>703,1022=>698,1023=>703,1024=>632,1025=>632,1026=>786,1027=>557,1028=>698,1029=>635,1030=>295,1031=>295,1032=>295,1033=>1094,1034=>1045,1035=>786,1036=>710,1037=>748,1038=>609,1039=>752,1040=>684,1041=>686,1042=>686,1043=>557,1044=>781,1045=>632,1046=>1077,1047=>641,1048=>748,1049=>748,1050=>710,1051=>752,1052=>863,1053=>752,1054=>787,1055=>752,1056=>603,1057=>698,1058=>611,1059=>609,1060=>861,1061=>685,1062=>776,1063=>686,1064=>1069,1065=>1094,1066=>833,1067=>818,1068=>686,1069=>698,1070=>1080,1071=>695,1072=>613,1073=>617,1074=>589,1075=>525,1076=>691,1077=>615,1078=>901,1079=>532,1080=>650,1081=>650,1082=>604,1083=>639,1084=>754,1085=>654,1086=>612,1087=>654,1088=>635,1089=>550,1090=>583,1091=>592,1092=>855,1093=>592,1094=>681,1095=>591,1096=>915,1097=>942,1098=>707,1099=>790,1100=>589,1101=>549,1102=>842,1103=>602,1104=>615,1105=>615,1106=>625,1107=>525,1108=>549,1109=>521,1110=>278,1111=>278,1112=>278,1113=>902,1114=>898,1115=>652,1116=>604,1117=>650,1118=>592,1119=>654,1120=>934,1121=>837,1122=>771,1123=>672,1124=>942,1125=>749,1126=>879,1127=>783,1128=>1160,1129=>1001,1130=>787,1131=>612,1132=>1027,1133=>824,1134=>636,1135=>541,1136=>856,1137=>876,1138=>787,1139=>612,1140=>781,1141=>665,1142=>781,1143=>665,1144=>992,1145=>904,1146=>953,1147=>758,1148=>1180,1149=>1028,1150=>934,1151=>837,1152=>698,1153=>550,1154=>502,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>418,1161=>418,1162=>748,1163=>657,1164=>686,1165=>589,1166=>603,1167=>635,1168=>610,1169=>525,1170=>675,1171=>556,1172=>557,1173=>491,1174=>1077,1175=>901,1176=>641,1177=>532,1178=>710,1179=>604,1180=>710,1181=>604,1182=>710,1183=>604,1184=>856,1185=>832,1186=>752,1187=>661,1188=>1014,1189=>877,1190=>1113,1191=>950,1192=>890,1193=>707,1194=>698,1195=>550,1196=>611,1197=>529,1198=>611,1199=>592,1200=>611,1201=>592,1202=>685,1203=>592,1204=>934,1205=>807,1206=>686,1207=>591,1208=>686,1209=>591,1210=>686,1211=>634,1212=>929,1213=>731,1214=>929,1215=>731,1216=>295,1217=>1077,1218=>901,1219=>655,1220=>604,1221=>752,1222=>639,1223=>752,1224=>661,1225=>752,1226=>661,1227=>686,1228=>591,1229=>863,1230=>754,1231=>278,1232=>684,1233=>613,1234=>684,1235=>613,1236=>974,1237=>995,1238=>632,1239=>615,1240=>787,1241=>615,1242=>787,1243=>615,1244=>1077,1245=>901,1246=>641,1247=>532,1248=>666,1249=>578,1250=>748,1251=>650,1252=>748,1253=>650,1254=>787,1255=>612,1256=>787,1257=>612,1258=>787,1259=>612,1260=>698,1261=>549,1262=>609,1263=>592,1264=>609,1265=>592,1266=>609,1267=>592,1268=>686,1269=>591,1270=>557,1271=>491,1272=>818,1273=>790,1274=>675,1275=>556,1276=>685,1277=>592,1278=>685,1279=>592,1280=>686,1281=>589,1282=>1006,1283=>897,1284=>975,1285=>869,1286=>679,1287=>588,1288=>1072,1289=>957,1290=>1113,1291=>967,1292=>775,1293=>660,1294=>773,1295=>711,1296=>614,1297=>541,1298=>752,1299=>639,1300=>1195,1301=>997,1302=>900,1303=>867,1304=>1031,1305=>989,1306=>787,1307=>635,1308=>989,1309=>818,1310=>710,1311=>604,1312=>1113,1313=>942,1314=>1113,1315=>949,1316=>793,1317=>683,1329=>766,1330=>732,1331=>753,1332=>753,1333=>732,1334=>772,1335=>640,1336=>732,1337=>859,1338=>753,1339=>691,1340=>533,1341=>922,1342=>863,1343=>732,1344=>716,1345=>766,1346=>753,1347=>767,1348=>792,1349=>728,1350=>729,1351=>757,1352=>732,1353=>713,1354=>800,1355=>768,1356=>792,1357=>732,1358=>753,1359=>705,1360=>694,1361=>744,1362=>538,1363=>811,1364=>757,1365=>787,1366=>790,1369=>307,1370=>318,1371=>234,1372=>361,1373=>238,1374=>405,1375=>500,1377=>974,1378=>634,1379=>658,1380=>663,1381=>634,1382=>635,1383=>515,1384=>634,1385=>738,1386=>658,1387=>634,1388=>271,1389=>980,1390=>623,1391=>634,1392=>634,1393=>608,1394=>634,1395=>629,1396=>634,1397=>278,1398=>634,1399=>499,1400=>634,1401=>404,1402=>974,1403=>560,1404=>648,1405=>634,1406=>634,1407=>974,1408=>634,1409=>635,1410=>435,1411=>974,1412=>636,1413=>612,1414=>805,1415=>812,1417=>337,1418=>361,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>361,1471=>0,1472=>295,1473=>0,1474=>0,1475=>295,1478=>456,1479=>0,1488=>668,1489=>578,1490=>412,1491=>546,1492=>653,1493=>272,1494=>346,1495=>653,1496=>648,1497=>224,1498=>537,1499=>529,1500=>568,1501=>664,1502=>679,1503=>272,1504=>400,1505=>649,1506=>626,1507=>640,1508=>625,1509=>540,1510=>593,1511=>709,1512=>564,1513=>708,1514=>657,1520=>471,1521=>454,1522=>471,1523=>416,1524=>645,3647=>636,3713=>670,3714=>684,3716=>688,3719=>482,3720=>628,3722=>684,3725=>688,3732=>642,3733=>642,3734=>672,3735=>655,3737=>641,3738=>592,3739=>592,3740=>745,3741=>767,3742=>687,3743=>687,3745=>702,3746=>688,3747=>684,3749=>649,3751=>632,3754=>703,3755=>819,3757=>633,3758=>684,3759=>788,3760=>632,3761=>0,3762=>539,3763=>539,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0,3769=>0,3771=>0,3772=>0,3773=>663,3776=>360,3777=>679,3778=>460,3779=>547,3780=>491,3782=>674,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>636,3793=>641,3794=>641,3795=>670,3796=>625,3797=>625,3798=>703,3799=>670,3800=>674,3801=>677,3804=>1028,3805=>1028,4256=>840,4257=>690,4258=>642,4259=>759,4260=>591,4261=>686,4262=>789,4263=>811,4264=>467,4265=>565,4266=>789,4267=>793,4268=>584,4269=>837,4270=>750,4271=>688,4272=>811,4273=>584,4274=>584,4275=>837,4276=>837,4277=>646,4278=>604,4279=>584,4280=>596,4281=>584,4282=>721,4283=>795,4284=>584,4285=>566,4286=>584,4287=>669,4288=>799,4289=>542,4290=>664,4291=>542,4292=>565,4293=>674,4304=>508,4305=>508,4306=>533,4307=>785,4308=>522,4309=>517,4310=>508,4311=>797,4312=>507,4313=>518,4314=>1058,4315=>522,4316=>523,4317=>783,4318=>518,4319=>523,4320=>792,4321=>523,4322=>656,4323=>524,4324=>788,4325=>523,4326=>782,4327=>523,4328=>522,4329=>522,4330=>566,4331=>523,4332=>523,4333=>489,4334=>522,4335=>498,4336=>517,4337=>560,4338=>508,4339=>508,4340=>508,4341=>563,4342=>824,4343=>595,4344=>522,4345=>554,4346=>553,4347=>586,4348=>304,5121=>684,5122=>684,5123=>684,5124=>684,5125=>769,5126=>769,5127=>769,5129=>769,5130=>769,5131=>769,5132=>835,5133=>834,5134=>835,5135=>834,5136=>835,5137=>834,5138=>967,5139=>1007,5140=>967,5141=>1007,5142=>769,5143=>967,5144=>1007,5145=>967,5146=>1007,5147=>769,5149=>256,5150=>543,5151=>423,5152=>423,5153=>389,5154=>389,5155=>393,5156=>389,5157=>466,5158=>385,5159=>256,5160=>389,5161=>389,5162=>389,5163=>1090,5164=>909,5165=>953,5166=>1117,5167=>684,5168=>684,5169=>684,5170=>684,5171=>729,5172=>729,5173=>729,5175=>729,5176=>729,5177=>729,5178=>835,5179=>684,5180=>835,5181=>834,5182=>835,5183=>834,5184=>967,5185=>1007,5186=>967,5187=>1007,5188=>967,5189=>1007,5190=>967,5191=>1007,5192=>729,5193=>508,5194=>192,5196=>732,5197=>732,5198=>732,5199=>732,5200=>730,5201=>730,5202=>730,5204=>730,5205=>730,5206=>730,5207=>921,5208=>889,5209=>921,5210=>889,5211=>921,5212=>889,5213=>928,5214=>900,5215=>928,5216=>900,5217=>947,5218=>900,5219=>947,5220=>900,5221=>947,5222=>434,5223=>877,5224=>877,5225=>866,5226=>890,5227=>628,5228=>628,5229=>628,5230=>628,5231=>628,5232=>628,5233=>628,5234=>628,5235=>628,5236=>860,5237=>771,5238=>815,5239=>816,5240=>815,5241=>816,5242=>860,5243=>771,5244=>860,5245=>771,5246=>815,5247=>816,5248=>815,5249=>816,5250=>815,5251=>407,5252=>407,5253=>750,5254=>775,5255=>750,5256=>775,5257=>628,5258=>628,5259=>628,5260=>628,5261=>628,5262=>628,5263=>628,5264=>628,5265=>628,5266=>860,5267=>771,5268=>815,5269=>816,5270=>815,5271=>816,5272=>860,5273=>771,5274=>860,5275=>771,5276=>815,5277=>816,5278=>815,5279=>816,5280=>815,5281=>435,5282=>435,5283=>610,5284=>557,5285=>557,5286=>557,5287=>610,5288=>610,5289=>610,5290=>557,5291=>557,5292=>749,5293=>769,5294=>746,5295=>764,5296=>746,5297=>764,5298=>749,5299=>769,5300=>749,5301=>769,5302=>746,5303=>764,5304=>746,5305=>764,5306=>746,5307=>386,5308=>508,5309=>386,5312=>852,5313=>852,5314=>852,5315=>852,5316=>852,5317=>852,5318=>852,5319=>852,5320=>852,5321=>1069,5322=>1035,5323=>1059,5324=>852,5325=>1059,5326=>852,5327=>852,5328=>600,5329=>453,5330=>600,5331=>852,5332=>852,5333=>852,5334=>852,5335=>852,5336=>852,5337=>852,5338=>852,5339=>852,5340=>1069,5341=>1035,5342=>1059,5343=>1030,5344=>1059,5345=>1030,5346=>1069,5347=>1035,5348=>1069,5349=>1035,5350=>1083,5351=>1030,5352=>1083,5353=>1030,5354=>600,5356=>729,5357=>603,5358=>603,5359=>603,5360=>603,5361=>603,5362=>603,5363=>603,5364=>603,5365=>603,5366=>834,5367=>754,5368=>792,5369=>771,5370=>792,5371=>771,5372=>834,5373=>754,5374=>834,5375=>754,5376=>792,5377=>771,5378=>792,5379=>771,5380=>792,5381=>418,5382=>420,5383=>418,5392=>712,5393=>712,5394=>712,5395=>892,5396=>892,5397=>892,5398=>892,5399=>910,5400=>872,5401=>910,5402=>872,5403=>910,5404=>872,5405=>1140,5406=>1100,5407=>1140,5408=>1100,5409=>1140,5410=>1100,5411=>1140,5412=>1100,5413=>641,5414=>627,5415=>627,5416=>627,5417=>627,5418=>627,5419=>627,5420=>627,5421=>627,5422=>627,5423=>844,5424=>781,5425=>816,5426=>818,5427=>816,5428=>818,5429=>844,5430=>781,5431=>844,5432=>781,5433=>816,5434=>818,5435=>816,5436=>818,5437=>816,5438=>418,5440=>389,5441=>484,5442=>916,5443=>916,5444=>863,5445=>916,5446=>863,5447=>863,5448=>603,5449=>603,5450=>603,5451=>603,5452=>603,5453=>603,5454=>834,5455=>754,5456=>418,5458=>729,5459=>684,5460=>684,5461=>684,5462=>684,5463=>726,5464=>726,5465=>726,5466=>726,5467=>924,5468=>1007,5469=>508,5470=>732,5471=>732,5472=>732,5473=>732,5474=>732,5475=>732,5476=>730,5477=>730,5478=>730,5479=>730,5480=>947,5481=>900,5482=>508,5492=>831,5493=>831,5494=>831,5495=>831,5496=>831,5497=>831,5498=>831,5499=>563,5500=>752,5501=>484,5502=>1047,5503=>1047,5504=>1047,5505=>1047,5506=>1047,5507=>1047,5508=>1047,5509=>825,5514=>831,5515=>831,5516=>831,5517=>831,5518=>1259,5519=>1259,5520=>1259,5521=>1002,5522=>1002,5523=>1259,5524=>1259,5525=>700,5526=>1073,5536=>852,5537=>852,5538=>799,5539=>799,5540=>799,5541=>799,5542=>600,5543=>643,5544=>643,5545=>643,5546=>643,5547=>643,5548=>643,5549=>643,5550=>418,5551=>628,5598=>770,5601=>770,5702=>468,5703=>468,5742=>444,5743=>1047,5744=>1310,5745=>1632,5746=>1632,5747=>1375,5748=>1375,5749=>1632,5750=>1632,7424=>592,7425=>717,7426=>982,7427=>586,7428=>550,7429=>605,7430=>605,7431=>491,7432=>541,7433=>278,7434=>395,7435=>579,7436=>583,7437=>754,7438=>650,7439=>612,7440=>550,7441=>684,7442=>684,7443=>684,7444=>1023,7446=>612,7447=>612,7448=>524,7449=>602,7450=>602,7451=>583,7452=>574,7453=>737,7454=>948,7455=>638,7456=>592,7457=>818,7458=>525,7459=>526,7462=>583,7463=>592,7464=>564,7465=>524,7466=>590,7467=>639,7468=>431,7469=>613,7470=>432,7472=>485,7473=>398,7474=>398,7475=>488,7476=>474,7477=>186,7478=>186,7479=>413,7480=>351,7481=>543,7482=>471,7483=>471,7484=>496,7485=>439,7486=>380,7487=>438,7488=>385,7489=>461,7490=>623,7491=>392,7492=>392,7493=>405,7494=>648,7495=>428,7496=>405,7497=>417,7498=>417,7499=>360,7500=>359,7501=>405,7502=>179,7503=>426,7504=>623,7505=>409,7506=>414,7507=>370,7508=>414,7509=>414,7510=>428,7511=>295,7512=>405,7513=>470,7514=>623,7515=>417,7517=>402,7518=>373,7519=>385,7520=>416,7521=>364,7522=>179,7523=>259,7524=>405,7525=>417,7526=>402,7527=>373,7528=>412,7529=>416,7530=>364,7543=>635,7544=>474,7547=>372,7549=>667,7557=>278,7579=>405,7580=>370,7581=>370,7582=>414,7583=>360,7584=>296,7585=>233,7586=>405,7587=>405,7588=>261,7589=>250,7590=>261,7591=>261,7592=>234,7593=>250,7594=>235,7595=>376,7596=>623,7597=>623,7598=>411,7599=>479,7600=>409,7601=>414,7602=>414,7603=>360,7604=>287,7605=>295,7606=>508,7607=>418,7608=>361,7609=>406,7610=>417,7611=>366,7612=>437,7613=>366,7614=>392,7615=>414,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>684,7681=>613,7682=>686,7683=>635,7684=>686,7685=>635,7686=>686,7687=>635,7688=>698,7689=>550,7690=>770,7691=>635,7692=>770,7693=>635,7694=>770,7695=>635,7696=>770,7697=>635,7698=>770,7699=>635,7700=>632,7701=>615,7702=>632,7703=>615,7704=>632,7705=>615,7706=>632,7707=>615,7708=>632,7709=>615,7710=>575,7711=>352,7712=>775,7713=>635,7714=>752,7715=>634,7716=>752,7717=>634,7718=>752,7719=>634,7720=>752,7721=>634,7722=>752,7723=>634,7724=>295,7725=>278,7726=>295,7727=>278,7728=>656,7729=>579,7730=>656,7731=>579,7732=>656,7733=>579,7734=>557,7735=>278,7736=>557,7737=>278,7738=>557,7739=>278,7740=>557,7741=>278,7742=>863,7743=>974,7744=>863,7745=>974,7746=>863,7747=>974,7748=>748,7749=>634,7750=>748,7751=>634,7752=>748,7753=>634,7754=>748,7755=>634,7756=>787,7757=>612,7758=>787,7759=>612,7760=>787,7761=>612,7762=>787,7763=>612,7764=>603,7765=>635,7766=>603,7767=>635,7768=>695,7769=>411,7770=>695,7771=>411,7772=>695,7773=>411,7774=>695,7775=>411,7776=>635,7777=>521,7778=>635,7779=>521,7780=>635,7781=>521,7782=>635,7783=>521,7784=>635,7785=>521,7786=>611,7787=>392,7788=>611,7789=>392,7790=>611,7791=>392,7792=>611,7793=>392,7794=>732,7795=>634,7796=>732,7797=>634,7798=>732,7799=>634,7800=>732,7801=>634,7802=>732,7803=>634,7804=>684,7805=>592,7806=>684,7807=>592,7808=>989,7809=>818,7810=>989,7811=>818,7812=>989,7813=>818,7814=>989,7815=>818,7816=>989,7817=>818,7818=>685,7819=>592,7820=>685,7821=>592,7822=>611,7823=>592,7824=>685,7825=>525,7826=>685,7827=>525,7828=>685,7829=>525,7830=>634,7831=>392,7832=>818,7833=>592,7834=>613,7835=>352,7836=>352,7837=>352,7838=>769,7839=>612,7840=>684,7841=>613,7842=>684,7843=>613,7844=>684,7845=>613,7846=>684,7847=>613,7848=>684,7849=>613,7850=>684,7851=>613,7852=>684,7853=>613,7854=>684,7855=>613,7856=>684,7857=>613,7858=>684,7859=>613,7860=>684,7861=>613,7862=>684,7863=>613,7864=>632,7865=>615,7866=>632,7867=>615,7868=>632,7869=>615,7870=>632,7871=>615,7872=>632,7873=>615,7874=>632,7875=>615,7876=>632,7877=>615,7878=>632,7879=>615,7880=>295,7881=>278,7882=>295,7883=>278,7884=>787,7885=>612,7886=>787,7887=>612,7888=>787,7889=>612,7890=>787,7891=>612,7892=>787,7893=>612,7894=>787,7895=>612,7896=>787,7897=>612,7898=>913,7899=>612,7900=>913,7901=>612,7902=>913,7903=>612,7904=>913,7905=>612,7906=>913,7907=>612,7908=>732,7909=>634,7910=>732,7911=>634,7912=>838,7913=>634,7914=>838,7915=>634,7916=>838,7917=>634,7918=>838,7919=>634,7920=>838,7921=>634,7922=>611,7923=>592,7924=>611,7925=>592,7926=>611,7927=>592,7928=>611,7929=>592,7930=>769,7931=>477,7936=>659,7937=>659,7938=>659,7939=>659,7940=>659,7941=>659,7942=>659,7943=>659,7944=>684,7945=>684,7946=>877,7947=>877,7948=>769,7949=>801,7950=>708,7951=>743,7952=>541,7953=>541,7954=>541,7955=>541,7956=>541,7957=>541,7960=>711,7961=>711,7962=>966,7963=>975,7964=>898,7965=>928,7968=>634,7969=>634,7970=>634,7971=>634,7972=>634,7973=>634,7974=>634,7975=>634,7976=>837,7977=>835,7978=>1086,7979=>1089,7980=>1027,7981=>1051,7982=>934,7983=>947,7984=>338,7985=>338,7986=>338,7987=>338,7988=>338,7989=>338,7990=>338,7991=>338,7992=>380,7993=>374,7994=>635,7995=>635,7996=>570,7997=>600,7998=>489,7999=>493,8000=>612,8001=>612,8002=>612,8003=>612,8004=>612,8005=>612,8008=>804,8009=>848,8010=>1095,8011=>1100,8012=>938,8013=>970,8016=>579,8017=>579,8018=>579,8019=>579,8020=>579,8021=>579,8022=>579,8023=>579,8025=>784,8027=>998,8029=>1012,8031=>897,8032=>837,8033=>837,8034=>837,8035=>837,8036=>837,8037=>837,8038=>837,8039=>837,8040=>802,8041=>843,8042=>1089,8043=>1095,8044=>946,8045=>972,8046=>921,8047=>952,8048=>659,8049=>659,8050=>541,8051=>548,8052=>634,8053=>654,8054=>338,8055=>338,8056=>612,8057=>612,8058=>579,8059=>579,8060=>837,8061=>837,8064=>659,8065=>659,8066=>659,8067=>659,8068=>659,8069=>659,8070=>659,8071=>659,8072=>684,8073=>684,8074=>877,8075=>877,8076=>769,8077=>801,8078=>708,8079=>743,8080=>634,8081=>634,8082=>634,8083=>634,8084=>634,8085=>634,8086=>634,8087=>634,8088=>837,8089=>835,8090=>1086,8091=>1089,8092=>1027,8093=>1051,8094=>934,8095=>947,8096=>837,8097=>837,8098=>837,8099=>837,8100=>837,8101=>837,8102=>837,8103=>837,8104=>802,8105=>843,8106=>1089,8107=>1095,8108=>946,8109=>972,8110=>921,8111=>952,8112=>659,8113=>659,8114=>659,8115=>659,8116=>659,8118=>659,8119=>659,8120=>684,8121=>684,8122=>716,8123=>692,8124=>684,8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>634,8131=>634,8132=>654,8134=>634,8135=>634,8136=>805,8137=>746,8138=>931,8139=>871,8140=>752,8141=>500,8142=>500,8143=>500,8144=>338,8145=>338,8146=>338,8147=>338,8150=>338,8151=>338,8152=>295,8153=>295,8154=>475,8155=>408,8157=>500,8158=>500,8159=>500,8160=>579,8161=>579,8162=>579,8163=>579,8164=>635,8165=>635,8166=>579,8167=>579,8168=>611,8169=>611,8170=>845,8171=>825,8172=>685,8173=>500,8174=>500,8175=>500,8178=>837,8179=>837,8180=>837,8182=>837,8183=>837,8184=>941,8185=>813,8186=>922,8187=>826,8188=>764,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>636,8200=>318,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>361,8209=>361,8210=>636,8211=>500,8212=>1000,8213=>1000,8214=>500,8215=>500,8216=>318,8217=>318,8218=>318,8219=>318,8220=>518,8221=>518,8222=>518,8223=>518,8224=>500,8225=>500,8226=>590,8227=>590,8228=>333,8229=>667,8230=>1000,8231=>318,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200,8240=>1350,8241=>1690,8242=>227,8243=>374,8244=>520,8245=>227,8246=>374,8247=>520,8248=>339,8249=>400,8250=>400,8251=>838,8252=>485,8253=>531,8254=>500,8255=>804,8256=>804,8257=>250,8258=>1000,8259=>500,8260=>167,8261=>390,8262=>390,8263=>922,8264=>733,8265=>733,8266=>497,8267=>636,8268=>500,8269=>500,8270=>500,8271=>337,8272=>804,8273=>500,8274=>450,8275=>1000,8276=>804,8277=>838,8278=>586,8279=>663,8280=>838,8281=>838,8282=>318,8283=>797,8284=>838,8285=>318,8286=>318,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>401,8305=>179,8308=>401,8309=>401,8310=>401,8311=>401,8312=>401,8313=>401,8314=>528,8315=>528,8316=>528,8317=>246,8318=>246,8319=>399,8320=>401,8321=>401,8322=>401,8323=>401,8324=>401,8325=>401,8326=>401,8327=>401,8328=>401,8329=>401,8330=>528,8331=>528,8332=>528,8333=>246,8334=>246,8336=>392,8337=>417,8338=>414,8339=>444,8340=>417,8341=>399,8342=>426,8343=>166,8344=>623,8345=>399,8346=>428,8347=>373,8348=>295,8352=>877,8353=>636,8354=>636,8355=>636,8356=>636,8357=>974,8358=>748,8359=>1271,8360=>1074,8361=>989,8362=>838,8363=>636,8364=>636,8365=>636,8366=>636,8367=>1272,8368=>636,8369=>636,8370=>636,8371=>636,8372=>774,8373=>636,8376=>636,8377=>636,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>970,8449=>970,8450=>698,8451=>1123,8452=>896,8453=>969,8454=>1032,8455=>614,8456=>698,8457=>952,8459=>988,8460=>754,8461=>850,8462=>634,8463=>634,8464=>470,8465=>697,8466=>720,8467=>413,8468=>818,8469=>801,8470=>1040,8471=>1000,8472=>697,8473=>701,8474=>787,8475=>798,8476=>814,8477=>792,8478=>896,8479=>684,8480=>1020,8481=>1014,8482=>1000,8483=>684,8484=>745,8485=>578,8486=>764,8487=>764,8488=>616,8489=>338,8490=>656,8491=>684,8492=>786,8493=>703,8494=>854,8495=>592,8496=>605,8497=>786,8498=>575,8499=>1069,8500=>462,8501=>745,8502=>674,8503=>466,8504=>645,8505=>380,8506=>926,8507=>1157,8508=>702,8509=>728,8510=>654,8511=>849,8512=>811,8513=>775,8514=>557,8515=>557,8516=>611,8517=>819,8518=>708,8519=>615,8520=>351,8521=>351,8523=>780,8526=>526,8528=>969,8529=>969,8530=>1370,8531=>969,8532=>969,8533=>969,8534=>969,8535=>969,8536=>969,8537=>969,8538=>969,8539=>969,8540=>969,8541=>969,8542=>969,8543=>568,8544=>295,8545=>492,8546=>689,8547=>923,8548=>684,8549=>922,8550=>1120,8551=>1317,8552=>917,8553=>685,8554=>933,8555=>1131,8556=>557,8557=>698,8558=>770,8559=>863,8560=>278,8561=>458,8562=>637,8563=>812,8564=>592,8565=>811,8566=>991,8567=>1170,8568=>819,8569=>592,8570=>822,8571=>1002,8572=>278,8573=>550,8574=>635,8575=>974,8576=>1245,8577=>770,8578=>1245,8579=>703,8580=>549,8581=>698,8585=>969,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838,8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838,8620=>838,8621=>838,8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838,8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838,8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838,8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838,8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838,8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838,8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838,8700=>838,8701=>838,8702=>838,8703=>838,8704=>684,8705=>636,8706=>517,8707=>632,8708=>632,8709=>871,8710=>669,8711=>669,8712=>871,8713=>871,8714=>718,8715=>871,8716=>871,8717=>718,8718=>636,8719=>757,8720=>757,8721=>674,8722=>838,8723=>838,8724=>838,8725=>337,8726=>637,8727=>838,8728=>626,8729=>626,8730=>637,8731=>637,8732=>637,8733=>714,8734=>833,8735=>838,8736=>896,8737=>896,8738=>838,8739=>500,8740=>500,8741=>500,8742=>500,8743=>732,8744=>732,8745=>732,8746=>732,8747=>521,8748=>789,8749=>1057,8750=>521,8751=>789,8752=>1057,8753=>521,8754=>521,8755=>521,8756=>636,8757=>636,8758=>260,8759=>636,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838,8766=>838,8767=>838,8768=>375,8769=>838,8770=>838,8771=>838,8772=>838,8773=>838,8774=>838,8775=>838,8776=>838,8777=>838,8778=>838,8779=>838,8780=>838,8781=>838,8782=>838,8783=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1000,8789=>1000,8790=>838,8791=>838,8792=>838,8793=>838,8794=>838,8795=>838,8796=>838,8797=>838,8798=>838,8799=>838,8800=>838,8801=>838,8802=>838,8803=>838,8804=>838,8805=>838,8806=>838,8807=>838,8808=>838,8809=>838,8810=>1047,8811=>1047,8812=>464,8813=>838,8814=>838,8815=>838,8816=>838,8817=>838,8818=>838,8819=>838,8820=>838,8821=>838,8822=>838,8823=>838,8824=>838,8825=>838,8826=>838,8827=>838,8828=>838,8829=>838,8830=>838,8831=>838,8832=>838,8833=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8840=>838,8841=>838,8842=>838,8843=>838,8844=>732,8845=>732,8846=>732,8847=>838,8848=>838,8849=>838,8850=>838,8851=>780,8852=>780,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838,8865=>838,8866=>871,8867=>871,8868=>871,8869=>871,8870=>521,8871=>521,8872=>871,8873=>871,8874=>871,8875=>871,8876=>871,8877=>871,8878=>871,8879=>871,8880=>838,8881=>838,8882=>838,8883=>838,8884=>838,8885=>838,8886=>1000,8887=>1000,8888=>838,8889=>838,8890=>521,8891=>732,8892=>732,8893=>732,8894=>838,8895=>838,8896=>820,8897=>820,8898=>820,8899=>820,8900=>494,8901=>318,8902=>626,8903=>838,8904=>1000,8905=>1000,8906=>1000,8907=>1000,8908=>1000,8909=>838,8910=>732,8911=>732,8912=>838,8913=>838,8914=>838,8915=>838,8916=>838,8917=>838,8918=>838,8919=>838,8920=>1422,8921=>1422,8922=>838,8923=>838,8924=>838,8925=>838,8926=>838,8927=>838,8928=>838,8929=>838,8930=>838,8931=>838,8932=>838,8933=>838,8934=>838,8935=>838,8936=>838,8937=>838,8938=>838,8939=>838,8940=>838,8941=>838,8942=>1000,8943=>1000,8944=>1000,8945=>1000,8946=>1000,8947=>871,8948=>718,8949=>871,8950=>871,8951=>718,8952=>871,8953=>871,8954=>1000,8955=>871,8956=>718,8957=>871,8958=>718,8959=>871,8960=>602,8961=>602,8962=>635,8963=>838,8964=>838,8965=>838,8966=>838,8967=>488,8968=>390,8969=>390,8970=>390,8971=>390,8972=>809,8973=>809,8974=>809,8975=>809,8976=>838,8977=>513,8984=>1000,8985=>838,8988=>469,8989=>469,8990=>469,8991=>469,8992=>521,8993=>521,8996=>1152,8997=>1152,8998=>1414,8999=>1152,9000=>1443,9003=>1414,9004=>873,9075=>338,9076=>635,9077=>837,9082=>659,9085=>757,9095=>1152,9108=>873,9115=>500,9116=>500,9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500,9125=>500,9126=>500,9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>521,9166=>838,9167=>945,9187=>873,9189=>769,9192=>636,9250=>635,9251=>635,9312=>896,9313=>896,9314=>896,9315=>896,9316=>896,9317=>896,9318=>896,9319=>896,9320=>896,9321=>896,9472=>602,9473=>602,9474=>602,9475=>602,9476=>602,9477=>602,9478=>602,9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602,9486=>602,9487=>602,9488=>602,9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602,9496=>602,9497=>602,9498=>602,9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602,9506=>602,9507=>602,9508=>602,9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602,9516=>602,9517=>602,9518=>602,9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602,9526=>602,9527=>602,9528=>602,9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602,9536=>602,9537=>602,9538=>602,9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602,9546=>602,9547=>602,9548=>602,9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602,9556=>602,9557=>602,9558=>602,9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602,9566=>602,9567=>602,9568=>602,9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602,9576=>602,9577=>602,9578=>602,9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602,9586=>602,9587=>602,9588=>602,9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602,9596=>602,9597=>602,9598=>602,9599=>602,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527,9687=>527,9688=>791,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>769,9697=>769,9698=>769,9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945,9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732,9727=>769,9728=>896,9729=>1000,9730=>896,9731=>896,9732=>896,9733=>896,9734=>896,9735=>573,9736=>896,9737=>896,9738=>888,9739=>888,9740=>671,9741=>1013,9742=>1246,9743=>1250,9744=>896,9745=>896,9746=>896,9747=>532,9748=>896,9749=>896,9750=>896,9751=>896,9752=>896,9753=>896,9754=>896,9755=>896,9756=>896,9757=>609,9758=>896,9759=>609,9760=>896,9761=>896,9762=>896,9763=>896,9764=>669,9765=>746,9766=>649,9767=>784,9768=>545,9769=>896,9770=>896,9771=>896,9772=>710,9773=>896,9774=>896,9775=>896,9776=>890,9777=>890,9778=>890,9779=>890,9780=>890,9781=>890,9782=>890,9783=>890,9784=>896,9785=>1042,9786=>1042,9787=>1042,9788=>896,9789=>896,9790=>896,9791=>614,9792=>732,9793=>732,9794=>896,9795=>896,9796=>896,9797=>896,9798=>896,9799=>896,9800=>896,9801=>896,9802=>896,9803=>896,9804=>896,9805=>896,9806=>896,9807=>896,9808=>896,9809=>896,9810=>896,9811=>896,9812=>896,9813=>896,9814=>896,9815=>896,9816=>896,9817=>896,9818=>896,9819=>896,9820=>896,9821=>896,9822=>896,9823=>896,9824=>896,9825=>896,9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9832=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472,9838=>357,9839=>484,9840=>748,9841=>766,9842=>896,9843=>896,9844=>896,9845=>896,9846=>896,9847=>896,9848=>896,9849=>896,9850=>896,9851=>896,9852=>896,9853=>896,9854=>896,9855=>896,9856=>869,9857=>869,9858=>869,9859=>869,9860=>869,9861=>869,9862=>890,9863=>890,9864=>890,9865=>890,9866=>890,9867=>890,9868=>890,9869=>890,9870=>890,9871=>890,9872=>750,9873=>750,9874=>890,9875=>816,9876=>716,9877=>537,9878=>852,9879=>890,9880=>684,9881=>896,9882=>708,9883=>890,9884=>890,9888=>890,9889=>702,9890=>1004,9891=>1089,9892=>1175,9893=>903,9894=>838,9895=>838,9896=>838,9897=>838,9898=>838,9899=>838,9900=>838,9901=>838,9902=>838,9903=>838,9904=>844,9905=>838,9906=>732,9907=>732,9908=>732,9909=>732,9910=>850,9911=>732,9912=>732,9920=>838,9921=>838,9922=>838,9923=>838,9954=>732,9985=>838,9986=>838,9987=>838,9988=>838,9990=>838,9991=>838,9992=>838,9993=>838,9996=>838,9997=>838,9998=>838,9999=>838,10000=>838,10001=>838,10002=>838,10003=>838,10004=>838,10005=>838,10006=>838,10007=>838,10008=>838,10009=>838,10010=>838,10011=>838,10012=>838,10013=>838,10014=>838,10015=>838,10016=>838,10017=>838,10018=>838,10019=>838,10020=>838,10021=>838,10022=>838,10023=>838,10025=>838,10026=>838,10027=>838,10028=>838,10029=>838,10030=>838,10031=>838,10032=>838,10033=>838,10034=>838,10035=>838,10036=>838,10037=>838,10038=>838,10039=>838,10040=>838,10041=>838,10042=>838,10043=>838,10044=>838,10045=>838,10046=>838,10047=>838,10048=>838,10049=>838,10050=>838,10051=>838,10052=>838,10053=>838,10054=>838,10055=>838,10056=>838,10057=>838,10058=>838,10059=>838,10061=>896,10063=>896,10064=>896,10065=>896,10066=>896,10070=>896,10072=>838,10073=>838,10074=>838,10075=>322,10076=>322,10077=>538,10078=>538,10081=>838,10082=>838,10083=>838,10084=>838,10085=>838,10086=>838,10087=>838,10088=>838,10089=>838,10090=>838,10091=>838,10092=>838,10093=>838,10094=>838,10095=>838,10096=>838,10097=>838,10098=>838,10099=>838,10100=>838,10101=>838,10102=>896,10103=>896,10104=>896,10105=>896,10106=>896,10107=>896,10108=>896,10109=>896,10110=>896,10111=>896,10112=>838,10113=>838,10114=>838,10115=>838,10116=>838,10117=>838,10118=>838,10119=>838,10120=>838,10121=>838,10122=>838,10123=>838,10124=>838,10125=>838,10126=>838,10127=>838,10128=>838,10129=>838,10130=>838,10131=>838,10132=>838,10136=>838,10137=>838,10138=>838,10139=>838,10140=>838,10141=>838,10142=>838,10143=>838,10144=>838,10145=>838,10146=>838,10147=>838,10148=>838,10149=>838,10150=>838,10151=>838,10152=>838,10153=>838,10154=>838,10155=>838,10156=>838,10157=>838,10158=>838,10159=>838,10161=>838,10162=>838,10163=>838,10164=>838,10165=>838,10166=>838,10167=>838,10168=>838,10169=>838,10170=>838,10171=>838,10172=>838,10173=>838,10174=>838,10181=>390,10182=>390,10208=>494,10214=>495,10215=>495,10216=>390,10217=>390,10218=>556,10219=>556,10224=>838,10225=>838,10226=>838,10227=>838,10228=>1157,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434,10237=>1434,10238=>1434,10239=>1434,10240=>732,10241=>732,10242=>732,10243=>732,10244=>732,10245=>732,10246=>732,10247=>732,10248=>732,10249=>732,10250=>732,10251=>732,10252=>732,10253=>732,10254=>732,10255=>732,10256=>732,10257=>732,10258=>732,10259=>732,10260=>732,10261=>732,10262=>732,10263=>732,10264=>732,10265=>732,10266=>732,10267=>732,10268=>732,10269=>732,10270=>732,10271=>732,10272=>732,10273=>732,10274=>732,10275=>732,10276=>732,10277=>732,10278=>732,10279=>732,10280=>732,10281=>732,10282=>732,10283=>732,10284=>732,10285=>732,10286=>732,10287=>732,10288=>732,10289=>732,10290=>732,10291=>732,10292=>732,10293=>732,10294=>732,10295=>732,10296=>732,10297=>732,10298=>732,10299=>732,10300=>732,10301=>732,10302=>732,10303=>732,10304=>732,10305=>732,10306=>732,10307=>732,10308=>732,10309=>732,10310=>732,10311=>732,10312=>732,10313=>732,10314=>732,10315=>732,10316=>732,10317=>732,10318=>732,10319=>732,10320=>732,10321=>732,10322=>732,10323=>732,10324=>732,10325=>732,10326=>732,10327=>732,10328=>732,10329=>732,10330=>732,10331=>732,10332=>732,10333=>732,10334=>732,10335=>732,10336=>732,10337=>732,10338=>732,10339=>732,10340=>732,10341=>732,10342=>732,10343=>732,10344=>732,10345=>732,10346=>732,10347=>732,10348=>732,10349=>732,10350=>732,10351=>732,10352=>732,10353=>732,10354=>732,10355=>732,10356=>732,10357=>732,10358=>732,10359=>732,10360=>732,10361=>732,10362=>732,10363=>732,10364=>732,10365=>732,10366=>732,10367=>732,10368=>732,10369=>732,10370=>732,10371=>732,10372=>732,10373=>732,10374=>732,10375=>732,10376=>732,10377=>732,10378=>732,10379=>732,10380=>732,10381=>732,10382=>732,10383=>732,10384=>732,10385=>732,10386=>732,10387=>732,10388=>732,10389=>732,10390=>732,10391=>732,10392=>732,10393=>732,10394=>732,10395=>732,10396=>732,10397=>732,10398=>732,10399=>732,10400=>732,10401=>732,10402=>732,10403=>732,10404=>732,10405=>732,10406=>732,10407=>732,10408=>732,10409=>732,10410=>732,10411=>732,10412=>732,10413=>732,10414=>732,10415=>732,10416=>732,10417=>732,10418=>732,10419=>732,10420=>732,10421=>732,10422=>732,10423=>732,10424=>732,10425=>732,10426=>732,10427=>732,10428=>732,10429=>732,10430=>732,10431=>732,10432=>732,10433=>732,10434=>732,10435=>732,10436=>732,10437=>732,10438=>732,10439=>732,10440=>732,10441=>732,10442=>732,10443=>732,10444=>732,10445=>732,10446=>732,10447=>732,10448=>732,10449=>732,10450=>732,10451=>732,10452=>732,10453=>732,10454=>732,10455=>732,10456=>732,10457=>732,10458=>732,10459=>732,10460=>732,10461=>732,10462=>732,10463=>732,10464=>732,10465=>732,10466=>732,10467=>732,10468=>732,10469=>732,10470=>732,10471=>732,10472=>732,10473=>732,10474=>732,10475=>732,10476=>732,10477=>732,10478=>732,10479=>732,10480=>732,10481=>732,10482=>732,10483=>732,10484=>732,10485=>732,10486=>732,10487=>732,10488=>732,10489=>732,10490=>732,10491=>732,10492=>732,10493=>732,10494=>732,10495=>732,10502=>838,10503=>838,10506=>838,10507=>838,10560=>683,10561=>683,10627=>734,10628=>734,10702=>838,10703=>1000,10704=>1000,10705=>1000,10706=>1000,10707=>1000,10708=>1000,10709=>1000,10731=>494,10746=>838,10747=>838,10752=>1000,10753=>1000,10754=>1000,10764=>1325,10765=>521,10766=>521,10767=>521,10768=>521,10769=>521,10770=>521,10771=>521,10772=>521,10773=>521,10774=>521,10775=>521,10776=>521,10777=>521,10778=>521,10779=>521,10780=>521,10799=>838,10877=>838,10878=>838,10879=>838,10880=>838,10881=>838,10882=>838,10883=>838,10884=>838,10885=>838,10886=>838,10887=>838,10888=>838,10889=>838,10890=>838,10891=>838,10892=>838,10893=>838,10894=>838,10895=>838,10896=>838,10897=>838,10898=>838,10899=>838,10900=>838,10901=>838,10902=>838,10903=>838,10904=>838,10905=>838,10906=>838,10907=>838,10908=>838,10909=>838,10910=>838,10911=>838,10912=>838,10926=>838,10927=>838,10928=>838,10929=>838,10930=>838,10931=>838,10932=>838,10933=>838,10934=>838,10935=>838,10936=>838,10937=>838,10938=>838,11001=>838,11002=>838,11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838,11018=>838,11019=>838,11020=>838,11021=>838,11022=>836,11023=>836,11024=>836,11025=>836,11026=>945,11027=>945,11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11039=>869,11040=>869,11041=>873,11042=>873,11043=>873,11044=>1119,11091=>869,11092=>869,11360=>557,11361=>278,11362=>557,11363=>603,11364=>695,11365=>613,11366=>392,11367=>752,11368=>634,11369=>656,11370=>579,11371=>685,11372=>525,11373=>781,11374=>863,11375=>684,11376=>781,11377=>734,11378=>1128,11379=>961,11380=>592,11381=>654,11382=>568,11383=>660,11385=>414,11386=>612,11387=>491,11388=>175,11389=>431,11390=>635,11391=>685,11800=>531,11810=>390,11811=>390,11812=>390,11813=>390,11822=>531,19904=>896,19905=>896,19906=>896,19907=>896,19908=>896,19909=>896,19910=>896,19911=>896,19912=>896,19913=>896,19914=>896,19915=>896,19916=>896,19917=>896,19918=>896,19919=>896,19920=>896,19921=>896,19922=>896,19923=>896,19924=>896,19925=>896,19926=>896,19927=>896,19928=>896,19929=>896,19930=>896,19931=>896,19932=>896,19933=>896,19934=>896,19935=>896,19936=>896,19937=>896,19938=>896,19939=>896,19940=>896,19941=>896,19942=>896,19943=>896,19944=>896,19945=>896,19946=>896,19947=>896,19948=>896,19949=>896,19950=>896,19951=>896,19952=>896,19953=>896,19954=>896,19955=>896,19956=>896,19957=>896,19958=>896,19959=>896,19960=>896,19961=>896,19962=>896,19963=>896,19964=>896,19965=>896,19966=>896,19967=>896,42564=>635,42565=>521,42566=>354,42567=>338,42572=>1180,42573=>1028,42576=>1029,42577=>906,42580=>1080,42581=>842,42582=>985,42583=>847,42594=>1024,42595=>925,42596=>1014,42597=>900,42598=>863,42599=>1008,42600=>787,42601=>612,42602=>855,42603=>712,42604=>1358,42605=>1019,42606=>879,42634=>805,42635=>722,42636=>611,42637=>583,42644=>686,42645=>634,42760=>493,42761=>493,42762=>493,42763=>493,42764=>493,42765=>493,42766=>493,42767=>493,42768=>493,42769=>493,42770=>493,42771=>493,42772=>493,42773=>493,42774=>493,42779=>369,42780=>369,42781=>252,42782=>252,42783=>252,42786=>385,42787=>356,42788=>472,42789=>472,42790=>752,42791=>634,42792=>878,42793=>709,42794=>614,42795=>541,42800=>491,42801=>521,42802=>1250,42803=>985,42804=>1219,42805=>1000,42806=>1155,42807=>996,42808=>971,42809=>818,42810=>971,42811=>818,42812=>959,42813=>818,42814=>698,42815=>549,42822=>680,42823=>392,42824=>582,42825=>427,42826=>807,42827=>704,42830=>1358,42831=>1019,42832=>603,42833=>635,42834=>734,42835=>774,42838=>787,42839=>635,42852=>605,42853=>635,42854=>605,42855=>635,42880=>557,42881=>278,42882=>735,42883=>634,42889=>337,42890=>376,42891=>401,42892=>275,42893=>686,42894=>487,42896=>772,42897=>667,43002=>915,43003=>575,43004=>603,43005=>863,43006=>295,43007=>1199,61184=>213,61185=>238,61186=>257,61187=>264,61188=>267,61189=>238,61190=>213,61191=>238,61192=>257,61193=>264,61194=>257,61195=>238,61196=>213,61197=>238,61198=>257,61199=>264,61200=>257,61201=>238,61202=>213,61203=>238,61204=>267,61205=>264,61206=>257,61207=>238,61208=>213,61209=>275,63173=>612,64256=>722,64257=>646,64258=>646,64259=>1000,64260=>1000,64261=>686,64262=>861,64275=>1202,64276=>1202,64277=>1196,64278=>1186,64279=>1529,64285=>224,64286=>0,64287=>471,64288=>636,64289=>856,64290=>774,64291=>906,64292=>771,64293=>843,64294=>855,64295=>807,64296=>875,64297=>838,64298=>708,64299=>708,64300=>708,64301=>708,64302=>668,64303=>668,64304=>668,64305=>578,64306=>412,64307=>546,64308=>653,64309=>272,64310=>346,64311=>1000,64312=>648,64313=>307,64314=>537,64315=>529,64316=>568,64317=>1000,64318=>679,64319=>1000,64320=>400,64321=>649,64322=>1000,64323=>640,64324=>625,64325=>1000,64326=>593,64327=>709,64328=>564,64329=>708,64330=>657,64331=>272,64332=>578,64333=>529,64334=>625,64335=>629,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1025,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansi.z
new file mode 100644
index 00000000..28c93714
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmono.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmono.ctg.z
new file mode 100644
index 00000000..f4d91664
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmono.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmono.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmono.php
new file mode 100644
index 00000000..42da1e19
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmono.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSansMono';
+$up=-63;
+$ut=44;
+$dw=602;
+$diff='';
+$originalsize=333636;
+$enc='';
+$file='dejavusansmono.z';
+$ctg='dejavusansmono.ctg.z';
+$desc=array('Flags'=>33,'FontBBox'=>'[-558 -375 718 1042]','ItalicAngle'=>0,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>547,'StemV'=>34,'StemH'=>15,'AvgWidth'=>602,'MaxWidth'=>602,'MissingWidth'=>602);
+$cw=array(0=>602,32=>602,33=>602,34=>602,35=>602,36=>602,37=>602,38=>602,39=>602,40=>602,41=>602,42=>602,43=>602,44=>602,45=>602,46=>602,47=>602,48=>602,49=>602,50=>602,51=>602,52=>602,53=>602,54=>602,55=>602,56=>602,57=>602,58=>602,59=>602,60=>602,61=>602,62=>602,63=>602,64=>602,65=>602,66=>602,67=>602,68=>602,69=>602,70=>602,71=>602,72=>602,73=>602,74=>602,75=>602,76=>602,77=>602,78=>602,79=>602,80=>602,81=>602,82=>602,83=>602,84=>602,85=>602,86=>602,87=>602,88=>602,89=>602,90=>602,91=>602,92=>602,93=>602,94=>602,95=>602,96=>602,97=>602,98=>602,99=>602,100=>602,101=>602,102=>602,103=>602,104=>602,105=>602,106=>602,107=>602,108=>602,109=>602,110=>602,111=>602,112=>602,113=>602,114=>602,115=>602,116=>602,117=>602,118=>602,119=>602,120=>602,121=>602,122=>602,123=>602,124=>602,125=>602,126=>602,160=>602,161=>602,162=>602,163=>602,164=>602,165=>602,166=>602,167=>602,168=>602,169=>602,170=>602,171=>602,172=>602,173=>602,174=>602,175=>602,176=>602,177=>602,178=>602,179=>602,180=>602,181=>602,182=>602,183=>602,184=>602,185=>602,186=>602,187=>602,188=>602,189=>602,190=>602,191=>602,192=>602,193=>602,194=>602,195=>602,196=>602,197=>602,198=>602,199=>602,200=>602,201=>602,202=>602,203=>602,204=>602,205=>602,206=>602,207=>602,208=>602,209=>602,210=>602,211=>602,212=>602,213=>602,214=>602,215=>602,216=>602,217=>602,218=>602,219=>602,220=>602,221=>602,222=>602,223=>602,224=>602,225=>602,226=>602,227=>602,228=>602,229=>602,230=>602,231=>602,232=>602,233=>602,234=>602,235=>602,236=>602,237=>602,238=>602,239=>602,240=>602,241=>602,242=>602,243=>602,244=>602,245=>602,246=>602,247=>602,248=>602,249=>602,250=>602,251=>602,252=>602,253=>602,254=>602,255=>602,256=>602,257=>602,258=>602,259=>602,260=>602,261=>602,262=>602,263=>602,264=>602,265=>602,266=>602,267=>602,268=>602,269=>602,270=>602,271=>602,272=>602,273=>602,274=>602,275=>602,276=>602,277=>602,278=>602,279=>602,280=>602,281=>602,282=>602,283=>602,284=>602,285=>602,286=>602,287=>602,288=>602,289=>602,290=>602,291=>602,292=>602,293=>602,294=>602,295=>602,296=>602,297=>602,298=>602,299=>602,300=>602,301=>602,302=>602,303=>602,304=>602,305=>602,306=>602,307=>602,308=>602,309=>602,310=>602,311=>602,312=>602,313=>602,314=>602,315=>602,316=>602,317=>602,318=>602,319=>602,320=>602,321=>602,322=>602,323=>602,324=>602,325=>602,326=>602,327=>602,328=>602,329=>602,330=>602,331=>602,332=>602,333=>602,334=>602,335=>602,336=>602,337=>602,338=>602,339=>602,340=>602,341=>602,342=>602,343=>602,344=>602,345=>602,346=>602,347=>602,348=>602,349=>602,350=>602,351=>602,352=>602,353=>602,354=>602,355=>602,356=>602,357=>602,358=>602,359=>602,360=>602,361=>602,362=>602,363=>602,364=>602,365=>602,366=>602,367=>602,368=>602,369=>602,370=>602,371=>602,372=>602,373=>602,374=>602,375=>602,376=>602,377=>602,378=>602,379=>602,380=>602,381=>602,382=>602,383=>602,384=>602,385=>602,386=>602,387=>602,388=>602,389=>602,390=>602,391=>602,392=>602,393=>602,394=>602,395=>602,396=>602,397=>602,398=>602,399=>602,400=>602,401=>602,402=>602,403=>602,404=>602,405=>602,406=>602,407=>602,408=>602,409=>602,410=>602,411=>602,412=>602,413=>602,414=>602,415=>602,416=>602,417=>602,418=>602,419=>602,420=>602,421=>602,422=>602,423=>602,424=>602,425=>602,426=>602,427=>602,428=>602,429=>602,430=>602,431=>602,432=>602,433=>602,434=>602,435=>602,436=>602,437=>602,438=>602,439=>602,440=>602,441=>602,442=>602,443=>602,444=>602,445=>602,446=>602,447=>602,448=>602,449=>602,450=>602,451=>602,461=>602,462=>602,463=>602,464=>602,465=>602,466=>602,467=>602,468=>602,469=>602,470=>602,471=>602,472=>602,473=>602,474=>602,475=>602,476=>602,477=>602,478=>602,479=>602,480=>602,481=>602,482=>602,483=>602,486=>602,487=>602,488=>602,489=>602,490=>602,491=>602,492=>602,493=>602,494=>602,495=>602,496=>602,500=>602,501=>602,502=>602,504=>602,505=>602,508=>602,509=>602,510=>602,511=>602,512=>602,513=>602,514=>602,515=>602,516=>602,517=>602,518=>602,519=>602,520=>602,521=>602,522=>602,523=>602,524=>602,525=>602,526=>602,527=>602,528=>602,529=>602,530=>602,531=>602,532=>602,533=>602,534=>602,535=>602,536=>602,537=>602,538=>602,539=>602,540=>602,541=>602,542=>602,543=>602,544=>602,545=>602,548=>602,549=>602,550=>602,551=>602,552=>602,553=>602,554=>602,555=>602,556=>602,557=>602,558=>602,559=>602,560=>602,561=>602,562=>602,563=>602,564=>602,565=>602,566=>602,567=>602,568=>602,569=>602,570=>602,571=>602,572=>602,573=>602,574=>602,575=>602,576=>602,577=>602,579=>602,580=>602,581=>602,588=>602,589=>602,592=>602,593=>602,594=>602,595=>602,596=>602,597=>602,598=>602,599=>602,600=>602,601=>602,602=>602,603=>602,604=>602,605=>602,606=>602,607=>602,608=>602,609=>602,610=>602,611=>602,612=>602,613=>602,614=>602,615=>602,616=>602,617=>602,618=>602,619=>602,620=>602,621=>602,622=>602,623=>602,624=>602,625=>602,626=>602,627=>602,628=>602,629=>602,630=>602,631=>602,632=>602,633=>602,634=>602,635=>602,636=>602,637=>602,638=>602,639=>602,640=>602,641=>602,642=>602,643=>602,644=>602,645=>602,646=>602,647=>602,648=>602,649=>602,650=>602,651=>602,652=>602,653=>602,654=>602,655=>602,656=>602,657=>602,658=>602,659=>602,660=>602,661=>602,662=>602,663=>602,664=>602,665=>602,666=>602,667=>602,668=>602,669=>602,670=>602,671=>602,672=>602,673=>602,674=>602,675=>602,676=>602,677=>602,678=>602,679=>602,680=>602,681=>602,682=>602,683=>602,684=>602,685=>602,686=>602,687=>602,688=>602,689=>602,690=>602,691=>602,692=>602,693=>602,694=>602,695=>602,696=>602,697=>602,699=>602,700=>602,701=>602,702=>602,703=>602,704=>602,705=>602,710=>602,711=>602,712=>602,713=>602,716=>602,717=>602,720=>602,721=>602,722=>602,723=>602,726=>602,727=>602,728=>602,729=>602,730=>602,731=>602,732=>602,733=>602,734=>602,736=>602,737=>602,738=>602,739=>602,740=>602,741=>602,742=>602,743=>602,744=>602,745=>602,750=>602,755=>602,768=>602,769=>602,770=>602,771=>602,772=>602,773=>602,774=>602,775=>602,776=>602,777=>602,778=>602,779=>602,780=>602,781=>602,782=>602,783=>602,784=>602,785=>602,786=>602,787=>602,788=>602,789=>602,790=>602,791=>602,792=>602,793=>602,794=>602,795=>602,796=>602,797=>602,798=>602,799=>602,800=>602,801=>602,802=>602,803=>602,804=>602,805=>602,806=>602,807=>602,808=>602,809=>602,810=>602,811=>602,812=>602,813=>602,814=>602,815=>602,816=>602,817=>602,818=>602,819=>602,820=>602,821=>602,822=>602,823=>602,824=>602,825=>602,826=>602,827=>602,828=>602,829=>602,830=>602,831=>602,835=>602,856=>602,865=>602,884=>602,885=>602,890=>602,894=>602,900=>602,901=>602,902=>602,903=>602,904=>602,905=>602,906=>602,908=>602,910=>602,911=>602,912=>602,913=>602,914=>602,915=>602,916=>602,917=>602,918=>602,919=>602,920=>602,921=>602,922=>602,923=>602,924=>602,925=>602,926=>602,927=>602,928=>602,929=>602,931=>602,932=>602,933=>602,934=>602,935=>602,936=>602,937=>602,938=>602,939=>602,940=>602,941=>602,942=>602,943=>602,944=>602,945=>602,946=>602,947=>602,948=>602,949=>602,950=>602,951=>602,952=>602,953=>602,954=>602,955=>602,956=>602,957=>602,958=>602,959=>602,960=>602,961=>602,962=>602,963=>602,964=>602,965=>602,966=>602,967=>602,968=>602,969=>602,970=>602,971=>602,972=>602,973=>602,974=>602,976=>602,977=>602,978=>602,979=>602,980=>602,981=>602,982=>602,983=>602,984=>602,985=>602,986=>602,987=>602,988=>602,989=>602,990=>602,991=>602,992=>602,993=>602,1008=>602,1009=>602,1010=>602,1011=>602,1012=>602,1013=>602,1014=>602,1015=>602,1016=>602,1017=>602,1018=>602,1019=>602,1020=>602,1021=>602,1022=>602,1023=>602,1024=>602,1025=>602,1026=>602,1027=>602,1028=>602,1029=>602,1030=>602,1031=>602,1032=>602,1033=>602,1034=>602,1035=>602,1036=>602,1037=>602,1038=>602,1039=>602,1040=>602,1041=>602,1042=>602,1043=>602,1044=>602,1045=>602,1046=>602,1047=>602,1048=>602,1049=>602,1050=>602,1051=>602,1052=>602,1053=>602,1054=>602,1055=>602,1056=>602,1057=>602,1058=>602,1059=>602,1060=>602,1061=>602,1062=>602,1063=>602,1064=>602,1065=>602,1066=>602,1067=>602,1068=>602,1069=>602,1070=>602,1071=>602,1072=>602,1073=>602,1074=>602,1075=>602,1076=>602,1077=>602,1078=>602,1079=>602,1080=>602,1081=>602,1082=>602,1083=>602,1084=>602,1085=>602,1086=>602,1087=>602,1088=>602,1089=>602,1090=>602,1091=>602,1092=>602,1093=>602,1094=>602,1095=>602,1096=>602,1097=>602,1098=>602,1099=>602,1100=>602,1101=>602,1102=>602,1103=>602,1104=>602,1105=>602,1106=>602,1107=>602,1108=>602,1109=>602,1110=>602,1111=>602,1112=>602,1113=>602,1114=>602,1115=>602,1116=>602,1117=>602,1118=>602,1119=>602,1122=>602,1123=>602,1138=>602,1139=>602,1168=>602,1169=>602,1170=>602,1171=>602,1172=>602,1173=>602,1174=>602,1175=>602,1176=>602,1177=>602,1178=>602,1179=>602,1186=>602,1187=>602,1188=>602,1189=>602,1194=>602,1195=>602,1196=>602,1197=>602,1198=>602,1199=>602,1200=>602,1201=>602,1202=>602,1203=>602,1210=>602,1211=>602,1216=>602,1217=>602,1218=>602,1219=>602,1220=>602,1223=>602,1224=>602,1227=>602,1228=>602,1231=>602,1232=>602,1233=>602,1234=>602,1235=>602,1236=>602,1237=>602,1238=>602,1239=>602,1240=>602,1241=>602,1242=>602,1243=>602,1244=>602,1245=>602,1246=>602,1247=>602,1248=>602,1249=>602,1250=>602,1251=>602,1252=>602,1253=>602,1254=>602,1255=>602,1256=>602,1257=>602,1258=>602,1259=>602,1260=>602,1261=>602,1262=>602,1263=>602,1264=>602,1265=>602,1266=>602,1267=>602,1268=>602,1269=>602,1270=>602,1271=>602,1272=>602,1273=>602,1296=>602,1297=>602,1306=>602,1307=>602,1308=>602,1309=>602,1329=>602,1330=>602,1331=>602,1332=>602,1333=>602,1334=>602,1335=>602,1336=>602,1337=>602,1338=>602,1339=>602,1340=>602,1341=>602,1342=>602,1343=>602,1344=>602,1345=>602,1346=>602,1347=>602,1348=>602,1349=>602,1350=>602,1351=>602,1352=>602,1353=>602,1354=>602,1355=>602,1356=>602,1357=>602,1358=>602,1359=>602,1360=>602,1361=>602,1362=>602,1363=>602,1364=>602,1365=>602,1366=>602,1369=>602,1370=>602,1371=>602,1372=>602,1373=>602,1374=>602,1375=>602,1377=>602,1378=>602,1379=>602,1380=>602,1381=>602,1382=>602,1383=>602,1384=>602,1385=>602,1386=>602,1387=>602,1388=>602,1389=>602,1390=>602,1391=>602,1392=>602,1393=>602,1394=>602,1395=>602,1396=>602,1397=>602,1398=>602,1399=>602,1400=>602,1401=>602,1402=>602,1403=>602,1404=>602,1405=>602,1406=>602,1407=>602,1408=>602,1409=>602,1410=>602,1411=>602,1412=>602,1413=>602,1414=>602,1415=>602,1417=>602,1418=>602,1542=>602,1543=>602,1545=>602,1546=>602,1548=>602,1557=>602,1563=>602,1567=>602,1569=>602,1570=>602,1571=>602,1572=>602,1573=>602,1574=>602,1575=>602,1576=>602,1577=>602,1578=>602,1579=>602,1580=>602,1581=>602,1582=>602,1583=>602,1584=>602,1585=>602,1586=>602,1587=>602,1588=>602,1589=>602,1590=>602,1591=>602,1592=>602,1593=>602,1594=>602,1600=>602,1601=>602,1602=>602,1603=>602,1604=>602,1605=>602,1606=>602,1607=>602,1608=>602,1609=>602,1610=>602,1611=>602,1612=>602,1613=>602,1614=>602,1615=>602,1616=>602,1617=>602,1618=>602,1619=>602,1620=>602,1621=>602,1626=>602,1632=>602,1633=>602,1634=>602,1635=>602,1636=>602,1637=>602,1638=>602,1639=>602,1640=>602,1641=>602,1642=>602,1643=>602,1644=>602,1645=>602,1652=>602,1657=>602,1658=>602,1659=>602,1662=>602,1663=>602,1664=>602,1667=>602,1668=>602,1670=>602,1671=>602,1681=>602,1688=>602,1700=>602,1705=>602,1711=>602,1726=>602,1740=>602,1776=>602,1777=>602,1778=>602,1779=>602,1780=>602,1781=>602,1782=>602,1783=>602,1784=>602,1785=>602,3713=>602,3714=>602,3716=>602,3719=>602,3720=>602,3722=>602,3725=>602,3732=>602,3733=>602,3734=>602,3735=>602,3737=>602,3738=>602,3739=>602,3740=>602,3741=>602,3742=>602,3743=>602,3745=>602,3746=>602,3747=>602,3749=>602,3751=>602,3754=>602,3755=>602,3757=>602,3758=>602,3759=>602,3760=>602,3761=>602,3762=>602,3763=>602,3764=>602,3765=>602,3766=>602,3767=>602,3768=>602,3769=>602,3771=>602,3772=>602,3784=>602,3785=>602,3786=>602,3787=>602,3788=>602,3789=>602,4304=>602,4305=>602,4306=>602,4307=>602,4308=>602,4309=>602,4310=>602,4311=>602,4312=>602,4313=>602,4314=>602,4315=>602,4316=>602,4317=>602,4318=>602,4319=>602,4320=>602,4321=>602,4322=>602,4323=>602,4324=>602,4325=>602,4326=>602,4327=>602,4328=>602,4329=>602,4330=>602,4331=>602,4332=>602,4333=>602,4334=>602,4335=>602,4336=>602,4337=>602,4338=>602,4339=>602,4340=>602,4341=>602,4342=>602,4343=>602,4344=>602,4345=>602,4346=>602,4347=>602,4348=>602,7426=>602,7432=>602,7433=>602,7444=>602,7446=>602,7447=>602,7453=>602,7454=>602,7455=>602,7468=>602,7469=>602,7470=>602,7472=>602,7473=>602,7474=>602,7475=>602,7476=>602,7477=>602,7478=>602,7479=>602,7480=>602,7481=>602,7482=>602,7483=>602,7484=>602,7486=>602,7487=>602,7488=>602,7489=>602,7490=>602,7491=>602,7492=>602,7493=>602,7494=>602,7495=>602,7496=>602,7497=>602,7498=>602,7499=>602,7500=>602,7501=>602,7502=>602,7503=>602,7504=>602,7505=>602,7506=>602,7507=>602,7508=>602,7509=>602,7510=>602,7511=>602,7512=>602,7513=>602,7514=>602,7515=>602,7522=>602,7523=>602,7524=>602,7525=>602,7543=>602,7544=>602,7547=>602,7557=>602,7579=>602,7580=>602,7581=>602,7582=>602,7583=>602,7584=>602,7585=>602,7586=>602,7587=>602,7588=>602,7589=>602,7590=>602,7591=>602,7592=>602,7593=>602,7594=>602,7595=>602,7596=>602,7597=>602,7598=>602,7599=>602,7600=>602,7601=>602,7602=>602,7603=>602,7604=>602,7605=>602,7606=>602,7607=>602,7609=>602,7610=>602,7611=>602,7612=>602,7613=>602,7614=>602,7615=>602,7680=>602,7681=>602,7682=>602,7683=>602,7684=>602,7685=>602,7686=>602,7687=>602,7688=>602,7689=>602,7690=>602,7691=>602,7692=>602,7693=>602,7694=>602,7695=>602,7696=>602,7697=>602,7698=>602,7699=>602,7704=>602,7705=>602,7706=>602,7707=>602,7708=>602,7709=>602,7710=>602,7711=>602,7712=>602,7713=>602,7714=>602,7715=>602,7716=>602,7717=>602,7718=>602,7719=>602,7720=>602,7721=>602,7722=>602,7723=>602,7724=>602,7725=>602,7728=>602,7729=>602,7730=>602,7731=>602,7732=>602,7733=>602,7734=>602,7735=>602,7736=>602,7737=>602,7738=>602,7739=>602,7740=>602,7741=>602,7742=>602,7743=>602,7744=>602,7745=>602,7746=>602,7747=>602,7748=>602,7749=>602,7750=>602,7751=>602,7752=>602,7753=>602,7754=>602,7755=>602,7756=>602,7757=>602,7764=>602,7765=>602,7766=>602,7767=>602,7768=>602,7769=>602,7770=>602,7771=>602,7772=>602,7773=>602,7774=>602,7775=>602,7776=>602,7777=>602,7778=>602,7779=>602,7784=>602,7785=>602,7786=>602,7787=>602,7788=>602,7789=>602,7790=>602,7791=>602,7792=>602,7793=>602,7794=>602,7795=>602,7796=>602,7797=>602,7798=>602,7799=>602,7800=>602,7801=>602,7804=>602,7805=>602,7806=>602,7807=>602,7808=>602,7809=>602,7810=>602,7811=>602,7812=>602,7813=>602,7814=>602,7815=>602,7816=>602,7817=>602,7818=>602,7819=>602,7820=>602,7821=>602,7822=>602,7823=>602,7824=>602,7825=>602,7826=>602,7827=>602,7828=>602,7829=>602,7830=>602,7831=>602,7832=>602,7833=>602,7835=>602,7839=>602,7840=>602,7841=>602,7852=>602,7853=>602,7856=>602,7857=>602,7862=>602,7863=>602,7864=>602,7865=>602,7868=>602,7869=>602,7878=>602,7879=>602,7882=>602,7883=>602,7884=>602,7885=>602,7896=>602,7897=>602,7898=>602,7899=>602,7900=>602,7901=>602,7904=>602,7905=>602,7906=>602,7907=>602,7908=>602,7909=>602,7912=>602,7913=>602,7914=>602,7915=>602,7918=>602,7919=>602,7920=>602,7921=>602,7922=>602,7923=>602,7924=>602,7925=>602,7928=>602,7929=>602,7936=>602,7937=>602,7938=>602,7939=>602,7940=>602,7941=>602,7942=>602,7943=>602,7944=>602,7945=>602,7946=>602,7947=>602,7948=>602,7949=>602,7950=>602,7951=>602,7952=>602,7953=>602,7954=>602,7955=>602,7956=>602,7957=>602,7960=>602,7961=>602,7962=>602,7963=>602,7964=>602,7965=>602,7968=>602,7969=>602,7970=>602,7971=>602,7972=>602,7973=>602,7974=>602,7975=>602,7976=>602,7977=>602,7978=>602,7979=>602,7980=>602,7981=>602,7982=>602,7983=>602,7984=>602,7985=>602,7986=>602,7987=>602,7988=>602,7989=>602,7990=>602,7991=>602,7992=>602,7993=>602,7994=>602,7995=>602,7996=>602,7997=>602,7998=>602,7999=>602,8000=>602,8001=>602,8002=>602,8003=>602,8004=>602,8005=>602,8008=>602,8009=>602,8010=>602,8011=>602,8012=>602,8013=>602,8016=>602,8017=>602,8018=>602,8019=>602,8020=>602,8021=>602,8022=>602,8023=>602,8025=>602,8027=>602,8029=>602,8031=>602,8032=>602,8033=>602,8034=>602,8035=>602,8036=>602,8037=>602,8038=>602,8039=>602,8040=>602,8041=>602,8042=>602,8043=>602,8044=>602,8045=>602,8046=>602,8047=>602,8048=>602,8049=>602,8050=>602,8051=>602,8052=>602,8053=>602,8054=>602,8055=>602,8056=>602,8057=>602,8058=>602,8059=>602,8060=>602,8061=>602,8064=>602,8065=>602,8066=>602,8067=>602,8068=>602,8069=>602,8070=>602,8071=>602,8072=>602,8073=>602,8074=>602,8075=>602,8076=>602,8077=>602,8078=>602,8079=>602,8080=>602,8081=>602,8082=>602,8083=>602,8084=>602,8085=>602,8086=>602,8087=>602,8088=>602,8089=>602,8090=>602,8091=>602,8092=>602,8093=>602,8094=>602,8095=>602,8096=>602,8097=>602,8098=>602,8099=>602,8100=>602,8101=>602,8102=>602,8103=>602,8104=>602,8105=>602,8106=>602,8107=>602,8108=>602,8109=>602,8110=>602,8111=>602,8112=>602,8113=>602,8114=>602,8115=>602,8116=>602,8118=>602,8119=>602,8120=>602,8121=>602,8122=>602,8123=>602,8124=>602,8125=>602,8126=>602,8127=>602,8128=>602,8129=>602,8130=>602,8131=>602,8132=>602,8134=>602,8135=>602,8136=>602,8137=>602,8138=>602,8139=>602,8140=>602,8141=>602,8142=>602,8143=>602,8144=>602,8145=>602,8146=>602,8147=>602,8150=>602,8151=>602,8152=>602,8153=>602,8154=>602,8155=>602,8157=>602,8158=>602,8159=>602,8160=>602,8161=>602,8162=>602,8163=>602,8164=>602,8165=>602,8166=>602,8167=>602,8168=>602,8169=>602,8170=>602,8171=>602,8172=>602,8173=>602,8174=>602,8175=>602,8178=>602,8179=>602,8180=>602,8182=>602,8183=>602,8184=>602,8185=>602,8186=>602,8187=>602,8188=>602,8189=>602,8190=>602,8192=>602,8193=>602,8194=>602,8195=>602,8196=>602,8197=>602,8198=>602,8199=>602,8200=>602,8201=>602,8202=>602,8208=>602,8209=>602,8210=>602,8211=>602,8212=>602,8213=>602,8215=>602,8216=>602,8217=>602,8218=>602,8219=>602,8220=>602,8221=>602,8222=>602,8223=>602,8224=>602,8225=>602,8226=>602,8227=>602,8230=>602,8239=>602,8240=>602,8241=>602,8242=>602,8243=>602,8244=>602,8245=>602,8246=>602,8247=>602,8249=>602,8250=>602,8252=>602,8253=>602,8254=>602,8261=>602,8262=>602,8263=>602,8264=>602,8265=>602,8267=>602,8287=>602,8304=>602,8305=>602,8308=>602,8309=>602,8310=>602,8311=>602,8312=>602,8313=>602,8314=>602,8315=>602,8316=>602,8317=>602,8318=>602,8319=>602,8320=>602,8321=>602,8322=>602,8323=>602,8324=>602,8325=>602,8326=>602,8327=>602,8328=>602,8329=>602,8330=>602,8331=>602,8332=>602,8333=>602,8334=>602,8336=>602,8337=>602,8338=>602,8339=>602,8340=>602,8341=>602,8342=>602,8343=>602,8344=>602,8345=>602,8346=>602,8347=>602,8348=>602,8352=>602,8353=>602,8354=>602,8355=>602,8356=>602,8357=>602,8358=>602,8359=>602,8360=>602,8361=>602,8362=>602,8363=>602,8364=>602,8365=>602,8366=>602,8367=>602,8368=>602,8369=>602,8370=>602,8371=>602,8372=>602,8373=>602,8376=>602,8377=>602,8450=>602,8453=>602,8461=>602,8462=>602,8463=>602,8469=>602,8470=>602,8471=>602,8473=>602,8474=>602,8477=>602,8482=>602,8484=>602,8486=>602,8490=>602,8491=>602,8494=>602,8531=>602,8532=>602,8533=>602,8534=>602,8535=>602,8536=>602,8537=>602,8538=>602,8539=>602,8540=>602,8541=>602,8542=>602,8543=>602,8592=>602,8593=>602,8594=>602,8595=>602,8596=>602,8597=>602,8598=>602,8599=>602,8600=>602,8601=>602,8602=>602,8603=>602,8604=>602,8605=>602,8606=>602,8607=>602,8608=>602,8609=>602,8610=>602,8611=>602,8612=>602,8613=>602,8614=>602,8615=>602,8616=>602,8617=>602,8618=>602,8619=>602,8620=>602,8621=>602,8622=>602,8623=>602,8624=>602,8625=>602,8626=>602,8627=>602,8628=>602,8629=>602,8630=>602,8631=>602,8632=>602,8633=>602,8634=>602,8635=>602,8636=>602,8637=>602,8638=>602,8639=>602,8640=>602,8641=>602,8642=>602,8643=>602,8644=>602,8645=>602,8646=>602,8647=>602,8648=>602,8649=>602,8650=>602,8651=>602,8652=>602,8653=>602,8654=>602,8655=>602,8656=>602,8657=>602,8658=>602,8659=>602,8660=>602,8661=>602,8662=>602,8663=>602,8664=>602,8665=>602,8666=>602,8667=>602,8668=>602,8669=>602,8670=>602,8671=>602,8672=>602,8673=>602,8674=>602,8675=>602,8676=>602,8677=>602,8678=>602,8679=>602,8680=>602,8681=>602,8682=>602,8683=>602,8684=>602,8685=>602,8686=>602,8687=>602,8688=>602,8689=>602,8690=>602,8691=>602,8692=>602,8693=>602,8694=>602,8695=>602,8696=>602,8697=>602,8698=>602,8699=>602,8700=>602,8701=>602,8702=>602,8703=>602,8704=>602,8705=>602,8706=>602,8707=>602,8708=>602,8709=>602,8710=>602,8711=>602,8712=>602,8713=>602,8714=>602,8715=>602,8716=>602,8717=>602,8719=>602,8721=>602,8722=>602,8723=>602,8725=>602,8727=>602,8728=>602,8729=>602,8730=>602,8731=>602,8732=>602,8733=>602,8734=>602,8735=>602,8736=>602,8743=>602,8744=>602,8745=>602,8746=>602,8747=>602,8748=>602,8749=>602,8756=>602,8757=>602,8758=>602,8759=>602,8760=>602,8761=>602,8762=>602,8763=>602,8764=>602,8765=>602,8769=>602,8770=>602,8771=>602,8772=>602,8773=>602,8774=>602,8775=>602,8776=>602,8777=>602,8778=>602,8779=>602,8780=>602,8781=>602,8782=>602,8783=>602,8784=>602,8785=>602,8786=>602,8787=>602,8788=>602,8789=>602,8790=>602,8791=>602,8792=>602,8793=>602,8794=>602,8795=>602,8796=>602,8797=>602,8798=>602,8799=>602,8800=>602,8801=>602,8802=>602,8803=>602,8804=>602,8805=>602,8806=>602,8807=>602,8808=>602,8809=>602,8813=>602,8814=>602,8815=>602,8816=>602,8817=>602,8818=>602,8819=>602,8820=>602,8821=>602,8822=>602,8823=>602,8824=>602,8825=>602,8826=>602,8827=>602,8828=>602,8829=>602,8830=>602,8831=>602,8832=>602,8833=>602,8834=>602,8835=>602,8836=>602,8837=>602,8838=>602,8839=>602,8840=>602,8841=>602,8842=>602,8843=>602,8847=>602,8848=>602,8849=>602,8850=>602,8853=>602,8854=>602,8855=>602,8856=>602,8857=>602,8858=>602,8859=>602,8860=>602,8861=>602,8862=>602,8863=>602,8864=>602,8865=>602,8866=>602,8867=>602,8868=>602,8869=>602,8901=>602,8902=>602,8909=>602,8922=>602,8923=>602,8924=>602,8925=>602,8926=>602,8927=>602,8928=>602,8929=>602,8930=>602,8931=>602,8932=>602,8933=>602,8934=>602,8935=>602,8936=>602,8937=>602,8943=>602,8960=>602,8961=>602,8962=>602,8963=>602,8964=>602,8965=>602,8966=>602,8968=>602,8969=>602,8970=>602,8971=>602,8972=>602,8973=>602,8974=>602,8975=>602,8976=>602,8977=>602,8978=>602,8979=>602,8980=>602,8981=>602,8984=>602,8985=>602,8988=>602,8989=>602,8990=>602,8991=>602,8992=>602,8993=>602,8997=>602,8998=>602,8999=>602,9000=>602,9003=>602,9013=>602,9015=>602,9016=>602,9017=>602,9018=>602,9019=>602,9020=>602,9021=>602,9022=>602,9025=>602,9026=>602,9027=>602,9028=>602,9031=>602,9032=>602,9033=>602,9035=>602,9036=>602,9037=>602,9040=>602,9042=>602,9043=>602,9044=>602,9047=>602,9048=>602,9049=>602,9050=>602,9051=>602,9052=>602,9054=>602,9055=>602,9056=>602,9059=>602,9060=>602,9061=>602,9064=>602,9065=>602,9067=>602,9068=>602,9069=>602,9070=>602,9071=>602,9072=>602,9075=>602,9076=>602,9077=>602,9078=>602,9079=>602,9080=>602,9081=>602,9082=>602,9085=>602,9088=>602,9089=>602,9090=>602,9091=>602,9096=>602,9097=>602,9098=>602,9099=>602,9109=>602,9115=>602,9116=>602,9117=>602,9118=>602,9119=>602,9120=>602,9121=>602,9122=>602,9123=>602,9124=>602,9125=>602,9126=>602,9127=>602,9128=>602,9129=>602,9130=>602,9131=>602,9132=>602,9133=>602,9134=>602,9166=>602,9167=>602,9251=>602,9472=>602,9473=>602,9474=>602,9475=>602,9476=>602,9477=>602,9478=>602,9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602,9486=>602,9487=>602,9488=>602,9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602,9496=>602,9497=>602,9498=>602,9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602,9506=>602,9507=>602,9508=>602,9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602,9516=>602,9517=>602,9518=>602,9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602,9526=>602,9527=>602,9528=>602,9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602,9536=>602,9537=>602,9538=>602,9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602,9546=>602,9547=>602,9548=>602,9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602,9556=>602,9557=>602,9558=>602,9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602,9566=>602,9567=>602,9568=>602,9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602,9576=>602,9577=>602,9578=>602,9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602,9586=>602,9587=>602,9588=>602,9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602,9596=>602,9597=>602,9598=>602,9599=>602,9600=>602,9601=>602,9602=>602,9603=>602,9604=>602,9605=>602,9606=>602,9607=>602,9608=>602,9609=>602,9610=>602,9611=>602,9612=>602,9613=>602,9614=>602,9615=>602,9616=>602,9617=>602,9618=>602,9619=>602,9620=>602,9621=>602,9622=>602,9623=>602,9624=>602,9625=>602,9626=>602,9627=>602,9628=>602,9629=>602,9630=>602,9631=>602,9632=>602,9633=>602,9634=>602,9635=>602,9636=>602,9637=>602,9638=>602,9639=>602,9640=>602,9641=>602,9642=>602,9643=>602,9644=>602,9645=>602,9646=>602,9647=>602,9648=>602,9649=>602,9650=>602,9651=>602,9652=>602,9653=>602,9654=>602,9655=>602,9656=>602,9657=>602,9658=>602,9659=>602,9660=>602,9661=>602,9662=>602,9663=>602,9664=>602,9665=>602,9666=>602,9667=>602,9668=>602,9669=>602,9670=>602,9671=>602,9672=>602,9673=>602,9674=>602,9675=>602,9676=>602,9677=>602,9678=>602,9679=>602,9680=>602,9681=>602,9682=>602,9683=>602,9684=>602,9685=>602,9686=>602,9687=>602,9688=>602,9689=>602,9690=>602,9691=>602,9692=>602,9693=>602,9694=>602,9695=>602,9696=>602,9697=>602,9698=>602,9699=>602,9700=>602,9701=>602,9702=>602,9703=>602,9704=>602,9705=>602,9706=>602,9707=>602,9708=>602,9709=>602,9710=>602,9711=>602,9712=>602,9713=>602,9714=>602,9715=>602,9716=>602,9717=>602,9718=>602,9719=>602,9720=>602,9721=>602,9722=>602,9723=>602,9724=>602,9725=>602,9726=>602,9727=>602,9728=>602,9729=>602,9730=>602,9731=>602,9732=>602,9733=>602,9734=>602,9735=>602,9736=>602,9737=>602,9738=>602,9739=>602,9740=>602,9741=>602,9742=>602,9743=>602,9744=>602,9745=>602,9746=>602,9747=>602,9748=>602,9749=>602,9750=>602,9751=>602,9752=>602,9753=>602,9754=>602,9755=>602,9756=>602,9757=>602,9758=>602,9759=>602,9760=>602,9761=>602,9762=>602,9763=>602,9764=>602,9765=>602,9766=>602,9767=>602,9768=>602,9769=>602,9770=>602,9771=>602,9772=>602,9773=>602,9774=>602,9775=>602,9784=>602,9785=>602,9786=>602,9787=>602,9788=>602,9789=>602,9790=>602,9791=>602,9792=>602,9793=>602,9794=>602,9795=>602,9796=>602,9797=>602,9798=>602,9799=>602,9800=>602,9801=>602,9802=>602,9803=>602,9804=>602,9805=>602,9806=>602,9807=>602,9808=>602,9809=>602,9810=>602,9811=>602,9812=>602,9813=>602,9814=>602,9815=>602,9816=>602,9817=>602,9818=>602,9819=>602,9820=>602,9821=>602,9822=>602,9823=>602,9824=>602,9825=>602,9826=>602,9827=>602,9828=>602,9829=>602,9830=>602,9831=>602,9832=>602,9833=>602,9834=>602,9835=>602,9836=>602,9837=>602,9838=>602,9839=>602,9840=>602,9841=>602,9842=>602,9843=>602,9844=>602,9845=>602,9846=>602,9847=>602,9848=>602,9849=>602,9850=>602,9851=>602,9852=>602,9853=>602,9854=>602,9855=>602,9856=>602,9857=>602,9858=>602,9859=>602,9860=>602,9861=>602,9862=>602,9863=>602,9864=>602,9865=>602,9866=>602,9867=>602,9872=>602,9873=>602,9874=>602,9875=>602,9876=>602,9877=>602,9878=>602,9879=>602,9880=>602,9881=>602,9882=>602,9883=>602,9884=>602,9888=>602,9889=>602,9904=>602,9905=>602,9985=>602,9986=>602,9987=>602,9988=>602,9990=>602,9991=>602,9992=>602,9993=>602,9996=>602,9997=>602,9998=>602,9999=>602,10000=>602,10001=>602,10002=>602,10003=>602,10004=>602,10005=>602,10006=>602,10007=>602,10008=>602,10009=>602,10010=>602,10011=>602,10012=>602,10013=>602,10014=>602,10015=>602,10016=>602,10017=>602,10018=>602,10019=>602,10020=>602,10021=>602,10022=>602,10023=>602,10025=>602,10026=>602,10027=>602,10028=>602,10029=>602,10030=>602,10031=>602,10032=>602,10033=>602,10034=>602,10035=>602,10036=>602,10037=>602,10038=>602,10039=>602,10040=>602,10041=>602,10042=>602,10043=>602,10044=>602,10045=>602,10046=>602,10047=>602,10048=>602,10049=>602,10050=>602,10051=>602,10052=>602,10053=>602,10054=>602,10055=>602,10056=>602,10057=>602,10058=>602,10059=>602,10061=>602,10063=>602,10064=>602,10065=>602,10066=>602,10070=>602,10072=>602,10073=>602,10074=>602,10075=>602,10076=>602,10077=>602,10078=>602,10081=>602,10082=>602,10083=>602,10084=>602,10085=>602,10086=>602,10087=>602,10088=>602,10089=>602,10090=>602,10091=>602,10092=>602,10093=>602,10094=>602,10095=>602,10096=>602,10097=>602,10098=>602,10099=>602,10100=>602,10101=>602,10132=>602,10136=>602,10137=>602,10138=>602,10139=>602,10140=>602,10141=>602,10142=>602,10143=>602,10144=>602,10145=>602,10146=>602,10147=>602,10148=>602,10149=>602,10150=>602,10151=>602,10152=>602,10153=>602,10154=>602,10155=>602,10156=>602,10157=>602,10158=>602,10159=>602,10161=>602,10162=>602,10163=>602,10164=>602,10165=>602,10166=>602,10167=>602,10168=>602,10169=>602,10170=>602,10171=>602,10172=>602,10173=>602,10174=>602,10181=>602,10182=>602,10208=>602,10216=>602,10217=>602,10731=>602,10746=>602,10747=>602,10799=>602,11026=>602,11027=>602,11028=>602,11029=>602,11030=>602,11031=>602,11032=>602,11033=>602,11034=>602,11364=>602,11373=>602,11374=>602,11375=>602,11376=>602,11381=>602,11382=>602,11383=>602,11385=>602,11386=>602,11388=>602,11389=>602,11390=>602,11391=>602,11800=>602,11810=>602,11811=>602,11812=>602,11813=>602,11822=>602,42760=>602,42761=>602,42762=>602,42763=>602,42764=>602,42765=>602,42766=>602,42767=>602,42768=>602,42769=>602,42770=>602,42771=>602,42772=>602,42773=>602,42774=>602,42779=>602,42780=>602,42781=>602,42782=>602,42783=>602,42786=>602,42787=>602,42788=>602,42789=>602,42790=>602,42791=>602,42889=>602,42890=>602,42891=>602,42892=>602,42893=>602,42894=>602,42896=>602,42897=>602,63173=>602,64257=>602,64258=>602,64338=>602,64339=>602,64340=>602,64341=>602,64342=>602,64343=>602,64344=>602,64345=>602,64346=>602,64347=>602,64348=>602,64349=>602,64350=>602,64351=>602,64352=>602,64353=>602,64354=>602,64355=>602,64356=>602,64357=>602,64358=>602,64359=>602,64360=>602,64361=>602,64362=>602,64363=>602,64364=>602,64365=>602,64366=>602,64367=>602,64368=>602,64369=>602,64370=>602,64371=>602,64372=>602,64373=>602,64374=>602,64375=>602,64376=>602,64377=>602,64378=>602,64379=>602,64380=>602,64381=>602,64382=>602,64383=>602,64384=>602,64385=>602,64394=>602,64395=>602,64396=>602,64397=>602,64398=>602,64399=>602,64400=>602,64401=>602,64402=>602,64403=>602,64404=>602,64405=>602,64414=>602,64415=>602,64426=>602,64427=>602,64428=>602,64429=>602,64488=>602,64489=>602,64508=>602,64509=>602,64510=>602,64511=>602,65136=>602,65137=>602,65138=>602,65139=>602,65140=>602,65142=>602,65143=>602,65144=>602,65145=>602,65146=>602,65147=>602,65148=>602,65149=>602,65150=>602,65151=>602,65152=>602,65153=>602,65154=>602,65155=>602,65156=>602,65157=>602,65158=>602,65159=>602,65160=>602,65161=>602,65162=>602,65163=>602,65164=>602,65165=>602,65166=>602,65167=>602,65168=>602,65169=>602,65170=>602,65171=>602,65172=>602,65173=>602,65174=>602,65175=>602,65176=>602,65177=>602,65178=>602,65179=>602,65180=>602,65181=>602,65182=>602,65183=>602,65184=>602,65185=>602,65186=>602,65187=>602,65188=>602,65189=>602,65190=>602,65191=>602,65192=>602,65193=>602,65194=>602,65195=>602,65196=>602,65197=>602,65198=>602,65199=>602,65200=>602,65201=>602,65202=>602,65203=>602,65204=>602,65205=>602,65206=>602,65207=>602,65208=>602,65209=>602,65210=>602,65211=>602,65212=>602,65213=>602,65214=>602,65215=>602,65216=>602,65217=>602,65218=>602,65219=>602,65220=>602,65221=>602,65222=>602,65223=>602,65224=>602,65225=>602,65226=>602,65227=>602,65228=>602,65229=>602,65230=>602,65231=>602,65232=>602,65233=>602,65234=>602,65235=>602,65236=>602,65237=>602,65238=>602,65239=>602,65240=>602,65241=>602,65242=>602,65243=>602,65244=>602,65245=>602,65246=>602,65247=>602,65248=>602,65249=>602,65250=>602,65251=>602,65252=>602,65253=>602,65254=>602,65255=>602,65256=>602,65257=>602,65258=>602,65259=>602,65260=>602,65261=>602,65262=>602,65263=>602,65264=>602,65265=>602,65266=>602,65267=>602,65268=>602,65269=>602,65270=>602,65271=>602,65272=>602,65273=>602,65274=>602,65275=>602,65276=>602,65279=>602,65529=>602,65530=>602,65531=>602,65532=>602,65533=>602,65535=>602);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmono.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmono.z
new file mode 100644
index 00000000..5cac152a
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmono.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonob.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonob.ctg.z
new file mode 100644
index 00000000..1a600109
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonob.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonob.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonob.php
new file mode 100644
index 00000000..d419fef5
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonob.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSansMono-Bold';
+$up=-63;
+$ut=44;
+$dw=602;
+$diff='';
+$originalsize=313856;
+$enc='';
+$file='dejavusansmonob.z';
+$ctg='dejavusansmonob.ctg.z';
+$desc=array('Flags'=>33,'FontBBox'=>'[-447 -394 731 1052]','ItalicAngle'=>0,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>547,'StemV'=>60,'StemH'=>26,'AvgWidth'=>602,'MaxWidth'=>602,'MissingWidth'=>602);
+$cw=array(0=>602,32=>602,33=>602,34=>602,35=>602,36=>602,37=>602,38=>602,39=>602,40=>602,41=>602,42=>602,43=>602,44=>602,45=>602,46=>602,47=>602,48=>602,49=>602,50=>602,51=>602,52=>602,53=>602,54=>602,55=>602,56=>602,57=>602,58=>602,59=>602,60=>602,61=>602,62=>602,63=>602,64=>602,65=>602,66=>602,67=>602,68=>602,69=>602,70=>602,71=>602,72=>602,73=>602,74=>602,75=>602,76=>602,77=>602,78=>602,79=>602,80=>602,81=>602,82=>602,83=>602,84=>602,85=>602,86=>602,87=>602,88=>602,89=>602,90=>602,91=>602,92=>602,93=>602,94=>602,95=>602,96=>602,97=>602,98=>602,99=>602,100=>602,101=>602,102=>602,103=>602,104=>602,105=>602,106=>602,107=>602,108=>602,109=>602,110=>602,111=>602,112=>602,113=>602,114=>602,115=>602,116=>602,117=>602,118=>602,119=>602,120=>602,121=>602,122=>602,123=>602,124=>602,125=>602,126=>602,160=>602,161=>602,162=>602,163=>602,164=>602,165=>602,166=>602,167=>602,168=>602,169=>602,170=>602,171=>602,172=>602,173=>602,174=>602,175=>602,176=>602,177=>602,178=>602,179=>602,180=>602,181=>602,182=>602,183=>602,184=>602,185=>602,186=>602,187=>602,188=>602,189=>602,190=>602,191=>602,192=>602,193=>602,194=>602,195=>602,196=>602,197=>602,198=>602,199=>602,200=>602,201=>602,202=>602,203=>602,204=>602,205=>602,206=>602,207=>602,208=>602,209=>602,210=>602,211=>602,212=>602,213=>602,214=>602,215=>602,216=>602,217=>602,218=>602,219=>602,220=>602,221=>602,222=>602,223=>602,224=>602,225=>602,226=>602,227=>602,228=>602,229=>602,230=>602,231=>602,232=>602,233=>602,234=>602,235=>602,236=>602,237=>602,238=>602,239=>602,240=>602,241=>602,242=>602,243=>602,244=>602,245=>602,246=>602,247=>602,248=>602,249=>602,250=>602,251=>602,252=>602,253=>602,254=>602,255=>602,256=>602,257=>602,258=>602,259=>602,260=>602,261=>602,262=>602,263=>602,264=>602,265=>602,266=>602,267=>602,268=>602,269=>602,270=>602,271=>602,272=>602,273=>602,274=>602,275=>602,276=>602,277=>602,278=>602,279=>602,280=>602,281=>602,282=>602,283=>602,284=>602,285=>602,286=>602,287=>602,288=>602,289=>602,290=>602,291=>602,292=>602,293=>602,294=>602,295=>602,296=>602,297=>602,298=>602,299=>602,300=>602,301=>602,302=>602,303=>602,304=>602,305=>602,306=>602,307=>602,308=>602,309=>602,310=>602,311=>602,312=>602,313=>602,314=>602,315=>602,316=>602,317=>602,318=>602,319=>602,320=>602,321=>602,322=>602,323=>602,324=>602,325=>602,326=>602,327=>602,328=>602,329=>602,330=>602,331=>602,332=>602,333=>602,334=>602,335=>602,336=>602,337=>602,338=>602,339=>602,340=>602,341=>602,342=>602,343=>602,344=>602,345=>602,346=>602,347=>602,348=>602,349=>602,350=>602,351=>602,352=>602,353=>602,354=>602,355=>602,356=>602,357=>602,358=>602,359=>602,360=>602,361=>602,362=>602,363=>602,364=>602,365=>602,366=>602,367=>602,368=>602,369=>602,370=>602,371=>602,372=>602,373=>602,374=>602,375=>602,376=>602,377=>602,378=>602,379=>602,380=>602,381=>602,382=>602,383=>602,384=>602,385=>602,386=>602,387=>602,388=>602,389=>602,390=>602,391=>602,392=>602,393=>602,394=>602,395=>602,396=>602,397=>602,398=>602,399=>602,400=>602,401=>602,402=>602,403=>602,404=>602,405=>602,406=>602,407=>602,408=>602,409=>602,410=>602,411=>602,412=>602,413=>602,414=>602,415=>602,416=>602,417=>602,418=>602,419=>602,420=>602,421=>602,422=>602,423=>602,424=>602,425=>602,426=>602,427=>602,428=>602,429=>602,430=>602,431=>602,432=>602,433=>602,434=>602,435=>602,436=>602,437=>602,438=>602,439=>602,440=>602,441=>602,442=>602,443=>602,444=>602,445=>602,446=>602,447=>602,448=>602,449=>602,450=>602,451=>602,461=>602,462=>602,463=>602,464=>602,465=>602,466=>602,467=>602,468=>602,469=>602,470=>602,471=>602,472=>602,473=>602,474=>602,475=>602,476=>602,477=>602,478=>602,479=>602,480=>602,481=>602,482=>602,483=>602,486=>602,487=>602,488=>602,489=>602,490=>602,491=>602,492=>602,493=>602,494=>602,495=>602,496=>602,500=>602,501=>602,502=>602,504=>602,505=>602,508=>602,509=>602,510=>602,511=>602,512=>602,513=>602,514=>602,515=>602,516=>602,517=>602,518=>602,519=>602,520=>602,521=>602,522=>602,523=>602,524=>602,525=>602,526=>602,527=>602,528=>602,529=>602,530=>602,531=>602,532=>602,533=>602,534=>602,535=>602,536=>602,537=>602,538=>602,539=>602,540=>602,541=>602,542=>602,543=>602,544=>602,545=>602,548=>602,549=>602,550=>602,551=>602,552=>602,553=>602,554=>602,555=>602,556=>602,557=>602,558=>602,559=>602,560=>602,561=>602,562=>602,563=>602,564=>602,565=>602,566=>602,567=>602,568=>602,569=>602,570=>602,571=>602,572=>602,573=>602,574=>602,575=>602,576=>602,577=>602,579=>602,580=>602,581=>602,588=>602,589=>602,592=>602,593=>602,594=>602,595=>602,596=>602,597=>602,598=>602,599=>602,600=>602,601=>602,602=>602,603=>602,604=>602,605=>602,606=>602,607=>602,608=>602,609=>602,610=>602,611=>602,612=>602,613=>602,614=>602,615=>602,616=>602,617=>602,618=>602,619=>602,620=>602,621=>602,622=>602,623=>602,624=>602,625=>602,626=>602,627=>602,628=>602,629=>602,630=>602,631=>602,632=>602,633=>602,634=>602,635=>602,636=>602,637=>602,638=>602,639=>602,640=>602,641=>602,642=>602,643=>602,644=>602,645=>602,646=>602,647=>602,648=>602,649=>602,650=>602,651=>602,652=>602,653=>602,654=>602,655=>602,656=>602,657=>602,658=>602,659=>602,660=>602,661=>602,662=>602,663=>602,664=>602,665=>602,666=>602,667=>602,668=>602,669=>602,670=>602,671=>602,672=>602,673=>602,674=>602,675=>602,676=>602,677=>602,678=>602,679=>602,680=>602,681=>602,682=>602,683=>602,684=>602,685=>602,686=>602,687=>602,688=>602,689=>602,690=>602,691=>602,692=>602,693=>602,694=>602,695=>602,696=>602,697=>602,699=>602,700=>602,701=>602,702=>602,703=>602,704=>602,705=>602,710=>602,711=>602,712=>602,713=>602,716=>602,717=>602,720=>602,721=>602,722=>602,723=>602,726=>602,727=>602,728=>602,729=>602,730=>602,731=>602,732=>602,733=>602,734=>602,736=>602,737=>602,738=>602,739=>602,740=>602,741=>602,742=>602,743=>602,744=>602,745=>602,750=>602,755=>602,768=>602,769=>602,770=>602,771=>602,772=>602,773=>602,774=>602,775=>602,776=>602,777=>602,778=>602,779=>602,780=>602,781=>602,782=>602,783=>602,784=>602,785=>602,786=>602,787=>602,788=>602,789=>602,790=>602,791=>602,792=>602,793=>602,794=>602,795=>602,796=>602,797=>602,798=>602,799=>602,800=>602,801=>602,802=>602,803=>602,804=>602,805=>602,806=>602,807=>602,808=>602,809=>602,810=>602,811=>602,812=>602,813=>602,814=>602,815=>602,816=>602,817=>602,818=>602,819=>602,820=>602,821=>602,822=>602,823=>602,824=>602,825=>602,826=>602,827=>602,828=>602,829=>602,830=>602,831=>602,835=>602,856=>602,865=>602,884=>602,885=>602,890=>602,894=>602,900=>602,901=>602,902=>602,903=>602,904=>602,905=>602,906=>602,908=>602,910=>602,911=>602,912=>602,913=>602,914=>602,915=>602,916=>602,917=>602,918=>602,919=>602,920=>602,921=>602,922=>602,923=>602,924=>602,925=>602,926=>602,927=>602,928=>602,929=>602,931=>602,932=>602,933=>602,934=>602,935=>602,936=>602,937=>602,938=>602,939=>602,940=>602,941=>602,942=>602,943=>602,944=>602,945=>602,946=>602,947=>602,948=>602,949=>602,950=>602,951=>602,952=>602,953=>602,954=>602,955=>602,956=>602,957=>602,958=>602,959=>602,960=>602,961=>602,962=>602,963=>602,964=>602,965=>602,966=>602,967=>602,968=>602,969=>602,970=>602,971=>602,972=>602,973=>602,974=>602,976=>602,977=>602,978=>602,979=>602,980=>602,981=>602,982=>602,983=>602,984=>602,985=>602,986=>602,987=>602,988=>602,989=>602,990=>602,991=>602,992=>602,993=>602,1008=>602,1009=>602,1010=>602,1011=>602,1012=>602,1013=>602,1014=>602,1015=>602,1016=>602,1017=>602,1018=>602,1019=>602,1020=>602,1021=>602,1022=>602,1023=>602,1024=>602,1025=>602,1026=>602,1027=>602,1028=>602,1029=>602,1030=>602,1031=>602,1032=>602,1033=>602,1034=>602,1035=>602,1036=>602,1037=>602,1038=>602,1039=>602,1040=>602,1041=>602,1042=>602,1043=>602,1044=>602,1045=>602,1046=>602,1047=>602,1048=>602,1049=>602,1050=>602,1051=>602,1052=>602,1053=>602,1054=>602,1055=>602,1056=>602,1057=>602,1058=>602,1059=>602,1060=>602,1061=>602,1062=>602,1063=>602,1064=>602,1065=>602,1066=>602,1067=>602,1068=>602,1069=>602,1070=>602,1071=>602,1072=>602,1073=>602,1074=>602,1075=>602,1076=>602,1077=>602,1078=>602,1079=>602,1080=>602,1081=>602,1082=>602,1083=>602,1084=>602,1085=>602,1086=>602,1087=>602,1088=>602,1089=>602,1090=>602,1091=>602,1092=>602,1093=>602,1094=>602,1095=>602,1096=>602,1097=>602,1098=>602,1099=>602,1100=>602,1101=>602,1102=>602,1103=>602,1104=>602,1105=>602,1106=>602,1107=>602,1108=>602,1109=>602,1110=>602,1111=>602,1112=>602,1113=>602,1114=>602,1115=>602,1116=>602,1117=>602,1118=>602,1119=>602,1122=>602,1123=>602,1138=>602,1139=>602,1168=>602,1169=>602,1170=>602,1171=>602,1172=>602,1173=>602,1174=>602,1175=>602,1176=>602,1177=>602,1178=>602,1179=>602,1186=>602,1187=>602,1188=>602,1189=>602,1194=>602,1195=>602,1196=>602,1197=>602,1198=>602,1199=>602,1200=>602,1201=>602,1202=>602,1203=>602,1210=>602,1211=>602,1216=>602,1217=>602,1218=>602,1219=>602,1220=>602,1223=>602,1224=>602,1227=>602,1228=>602,1231=>602,1232=>602,1233=>602,1234=>602,1235=>602,1236=>602,1237=>602,1238=>602,1239=>602,1240=>602,1241=>602,1242=>602,1243=>602,1244=>602,1245=>602,1246=>602,1247=>602,1248=>602,1249=>602,1250=>602,1251=>602,1252=>602,1253=>602,1254=>602,1255=>602,1256=>602,1257=>602,1258=>602,1259=>602,1260=>602,1261=>602,1262=>602,1263=>602,1264=>602,1265=>602,1266=>602,1267=>602,1268=>602,1269=>602,1270=>602,1271=>602,1272=>602,1273=>602,1296=>602,1297=>602,1306=>602,1307=>602,1308=>602,1309=>602,1329=>602,1330=>602,1331=>602,1332=>602,1333=>602,1334=>602,1335=>602,1336=>602,1337=>602,1338=>602,1339=>602,1340=>602,1341=>602,1342=>602,1343=>602,1344=>602,1345=>602,1346=>602,1347=>602,1348=>602,1349=>602,1350=>602,1351=>602,1352=>602,1353=>602,1354=>602,1355=>602,1356=>602,1357=>602,1358=>602,1359=>602,1360=>602,1361=>602,1362=>602,1363=>602,1364=>602,1365=>602,1366=>602,1369=>602,1370=>602,1371=>602,1372=>602,1373=>602,1374=>602,1375=>602,1377=>602,1378=>602,1379=>602,1380=>602,1381=>602,1382=>602,1383=>602,1384=>602,1385=>602,1386=>602,1387=>602,1388=>602,1389=>602,1390=>602,1391=>602,1392=>602,1393=>602,1394=>602,1395=>602,1396=>602,1397=>602,1398=>602,1399=>602,1400=>602,1401=>602,1402=>602,1403=>602,1404=>602,1405=>602,1406=>602,1407=>602,1408=>602,1409=>602,1410=>602,1411=>602,1412=>602,1413=>602,1414=>602,1415=>602,1417=>602,1418=>602,1542=>602,1543=>602,1545=>602,1546=>602,1548=>602,1557=>602,1563=>602,1567=>602,1569=>602,1570=>602,1571=>602,1572=>602,1573=>602,1574=>602,1575=>602,1576=>602,1577=>602,1578=>602,1579=>602,1580=>602,1581=>602,1582=>602,1583=>602,1584=>602,1585=>602,1586=>602,1587=>602,1588=>602,1589=>602,1590=>602,1591=>602,1592=>602,1593=>602,1594=>602,1600=>602,1601=>602,1602=>602,1603=>602,1604=>602,1605=>602,1606=>602,1607=>602,1608=>602,1609=>602,1610=>602,1611=>602,1612=>602,1613=>602,1614=>602,1615=>602,1616=>602,1617=>602,1618=>602,1619=>602,1620=>602,1621=>602,1626=>602,1632=>602,1633=>602,1634=>602,1635=>602,1636=>602,1637=>602,1638=>602,1639=>602,1640=>602,1641=>602,1642=>602,1643=>602,1644=>602,1645=>602,1652=>602,1657=>602,1658=>602,1659=>602,1662=>602,1663=>602,1664=>602,1667=>602,1668=>602,1670=>602,1671=>602,1681=>602,1688=>602,1700=>602,1705=>602,1711=>602,1726=>602,1740=>602,1776=>602,1777=>602,1778=>602,1779=>602,1780=>602,1781=>602,1782=>602,1783=>602,1784=>602,1785=>602,3713=>602,3714=>602,3716=>602,3719=>602,3720=>602,3722=>602,3725=>602,3732=>602,3733=>602,3734=>602,3735=>602,3737=>602,3738=>602,3739=>602,3740=>602,3741=>602,3742=>602,3743=>602,3745=>602,3746=>602,3747=>602,3749=>602,3751=>602,3754=>602,3755=>602,3757=>602,3758=>602,3759=>602,3760=>602,3761=>602,3762=>602,3763=>602,3764=>602,3765=>602,3766=>602,3767=>602,3768=>602,3769=>602,3771=>602,3772=>602,3784=>602,3785=>602,3786=>602,3787=>602,3788=>602,3789=>602,4304=>602,4305=>602,4306=>602,4307=>602,4308=>602,4309=>602,4310=>602,4311=>602,4312=>602,4313=>602,4314=>602,4315=>602,4316=>602,4317=>602,4318=>602,4319=>602,4320=>602,4321=>602,4322=>602,4323=>602,4324=>602,4325=>602,4326=>602,4327=>602,4328=>602,4329=>602,4330=>602,4331=>602,4332=>602,4333=>602,4334=>602,4335=>602,4336=>602,4337=>602,4338=>602,4339=>602,4340=>602,4341=>602,4342=>602,4343=>602,4344=>602,4345=>602,4346=>602,4347=>602,4348=>602,7426=>602,7432=>602,7433=>602,7444=>602,7446=>602,7447=>602,7453=>602,7454=>602,7455=>602,7468=>602,7469=>602,7470=>602,7472=>602,7473=>602,7474=>602,7475=>602,7476=>602,7477=>602,7478=>602,7479=>602,7480=>602,7481=>602,7482=>602,7483=>602,7484=>602,7486=>602,7487=>602,7488=>602,7489=>602,7490=>602,7491=>602,7492=>602,7493=>602,7494=>602,7495=>602,7496=>602,7497=>602,7498=>602,7499=>602,7500=>602,7501=>602,7502=>602,7503=>602,7504=>602,7505=>602,7506=>602,7507=>602,7508=>602,7509=>602,7510=>602,7511=>602,7512=>602,7513=>602,7514=>602,7515=>602,7522=>602,7523=>602,7524=>602,7525=>602,7543=>602,7544=>602,7547=>602,7557=>602,7579=>602,7580=>602,7581=>602,7582=>602,7583=>602,7584=>602,7585=>602,7586=>602,7587=>602,7588=>602,7589=>602,7590=>602,7591=>602,7592=>602,7593=>602,7594=>602,7595=>602,7596=>602,7597=>602,7598=>602,7599=>602,7600=>602,7601=>602,7602=>602,7603=>602,7604=>602,7605=>602,7606=>602,7607=>602,7609=>602,7610=>602,7611=>602,7612=>602,7613=>602,7614=>602,7615=>602,7680=>602,7681=>602,7682=>602,7683=>602,7684=>602,7685=>602,7686=>602,7687=>602,7688=>602,7689=>602,7690=>602,7691=>602,7692=>602,7693=>602,7694=>602,7695=>602,7696=>602,7697=>602,7698=>602,7699=>602,7704=>602,7705=>602,7706=>602,7707=>602,7708=>602,7709=>602,7710=>602,7711=>602,7712=>602,7713=>602,7714=>602,7715=>602,7716=>602,7717=>602,7718=>602,7719=>602,7720=>602,7721=>602,7722=>602,7723=>602,7724=>602,7725=>602,7728=>602,7729=>602,7730=>602,7731=>602,7732=>602,7733=>602,7734=>602,7735=>602,7736=>602,7737=>602,7738=>602,7739=>602,7740=>602,7741=>602,7742=>602,7743=>602,7744=>602,7745=>602,7746=>602,7747=>602,7748=>602,7749=>602,7750=>602,7751=>602,7752=>602,7753=>602,7754=>602,7755=>602,7756=>602,7757=>602,7764=>602,7765=>602,7766=>602,7767=>602,7768=>602,7769=>602,7770=>602,7771=>602,7772=>602,7773=>602,7774=>602,7775=>602,7776=>602,7777=>602,7778=>602,7779=>602,7784=>602,7785=>602,7786=>602,7787=>602,7788=>602,7789=>602,7790=>602,7791=>602,7792=>602,7793=>602,7794=>602,7795=>602,7796=>602,7797=>602,7798=>602,7799=>602,7800=>602,7801=>602,7804=>602,7805=>602,7806=>602,7807=>602,7808=>602,7809=>602,7810=>602,7811=>602,7812=>602,7813=>602,7814=>602,7815=>602,7816=>602,7817=>602,7818=>602,7819=>602,7820=>602,7821=>602,7822=>602,7823=>602,7824=>602,7825=>602,7826=>602,7827=>602,7828=>602,7829=>602,7830=>602,7831=>602,7832=>602,7833=>602,7835=>602,7839=>602,7840=>602,7841=>602,7852=>602,7853=>602,7856=>602,7857=>602,7862=>602,7863=>602,7864=>602,7865=>602,7868=>602,7869=>602,7878=>602,7879=>602,7882=>602,7883=>602,7884=>602,7885=>602,7896=>602,7897=>602,7898=>602,7899=>602,7900=>602,7901=>602,7904=>602,7905=>602,7906=>602,7907=>602,7908=>602,7909=>602,7912=>602,7913=>602,7914=>602,7915=>602,7918=>602,7919=>602,7920=>602,7921=>602,7922=>602,7923=>602,7924=>602,7925=>602,7928=>602,7929=>602,7936=>602,7937=>602,7938=>602,7939=>602,7940=>602,7941=>602,7942=>602,7943=>602,7944=>602,7945=>602,7946=>602,7947=>602,7948=>602,7949=>602,7950=>602,7951=>602,7952=>602,7953=>602,7954=>602,7955=>602,7956=>602,7957=>602,7960=>602,7961=>602,7962=>602,7963=>602,7964=>602,7965=>602,7968=>602,7969=>602,7970=>602,7971=>602,7972=>602,7973=>602,7974=>602,7975=>602,7976=>602,7977=>602,7978=>602,7979=>602,7980=>602,7981=>602,7982=>602,7983=>602,7984=>602,7985=>602,7986=>602,7987=>602,7988=>602,7989=>602,7990=>602,7991=>602,7992=>602,7993=>602,7994=>602,7995=>602,7996=>602,7997=>602,7998=>602,7999=>602,8000=>602,8001=>602,8002=>602,8003=>602,8004=>602,8005=>602,8008=>602,8009=>602,8010=>602,8011=>602,8012=>602,8013=>602,8016=>602,8017=>602,8018=>602,8019=>602,8020=>602,8021=>602,8022=>602,8023=>602,8025=>602,8027=>602,8029=>602,8031=>602,8032=>602,8033=>602,8034=>602,8035=>602,8036=>602,8037=>602,8038=>602,8039=>602,8040=>602,8041=>602,8042=>602,8043=>602,8044=>602,8045=>602,8046=>602,8047=>602,8048=>602,8049=>602,8050=>602,8051=>602,8052=>602,8053=>602,8054=>602,8055=>602,8056=>602,8057=>602,8058=>602,8059=>602,8060=>602,8061=>602,8064=>602,8065=>602,8066=>602,8067=>602,8068=>602,8069=>602,8070=>602,8071=>602,8072=>602,8073=>602,8074=>602,8075=>602,8076=>602,8077=>602,8078=>602,8079=>602,8080=>602,8081=>602,8082=>602,8083=>602,8084=>602,8085=>602,8086=>602,8087=>602,8088=>602,8089=>602,8090=>602,8091=>602,8092=>602,8093=>602,8094=>602,8095=>602,8096=>602,8097=>602,8098=>602,8099=>602,8100=>602,8101=>602,8102=>602,8103=>602,8104=>602,8105=>602,8106=>602,8107=>602,8108=>602,8109=>602,8110=>602,8111=>602,8112=>602,8113=>602,8114=>602,8115=>602,8116=>602,8118=>602,8119=>602,8120=>602,8121=>602,8122=>602,8123=>602,8124=>602,8125=>602,8126=>602,8127=>602,8128=>602,8129=>602,8130=>602,8131=>602,8132=>602,8134=>602,8135=>602,8136=>602,8137=>602,8138=>602,8139=>602,8140=>602,8141=>602,8142=>602,8143=>602,8144=>602,8145=>602,8146=>602,8147=>602,8150=>602,8151=>602,8152=>602,8153=>602,8154=>602,8155=>602,8157=>602,8158=>602,8159=>602,8160=>602,8161=>602,8162=>602,8163=>602,8164=>602,8165=>602,8166=>602,8167=>602,8168=>602,8169=>602,8170=>602,8171=>602,8172=>602,8173=>602,8174=>602,8175=>602,8178=>602,8179=>602,8180=>602,8182=>602,8183=>602,8184=>602,8185=>602,8186=>602,8187=>602,8188=>602,8189=>602,8190=>602,8192=>602,8193=>602,8194=>602,8195=>602,8196=>602,8197=>602,8198=>602,8199=>602,8200=>602,8201=>602,8202=>602,8208=>602,8209=>602,8210=>602,8211=>602,8212=>602,8213=>602,8215=>602,8216=>602,8217=>602,8218=>602,8219=>602,8220=>602,8221=>602,8222=>602,8223=>602,8224=>602,8225=>602,8226=>602,8227=>602,8230=>602,8239=>602,8240=>602,8241=>602,8242=>602,8243=>602,8244=>602,8245=>602,8246=>602,8247=>602,8249=>602,8250=>602,8252=>602,8253=>602,8254=>602,8261=>602,8262=>602,8263=>602,8264=>602,8265=>602,8267=>602,8287=>602,8304=>602,8305=>602,8308=>602,8309=>602,8310=>602,8311=>602,8312=>602,8313=>602,8314=>602,8315=>602,8316=>602,8317=>602,8318=>602,8319=>602,8320=>602,8321=>602,8322=>602,8323=>602,8324=>602,8325=>602,8326=>602,8327=>602,8328=>602,8329=>602,8330=>602,8331=>602,8332=>602,8333=>602,8334=>602,8336=>602,8337=>602,8338=>602,8339=>602,8340=>602,8341=>602,8342=>602,8343=>602,8344=>602,8345=>602,8346=>602,8347=>602,8348=>602,8352=>602,8353=>602,8354=>602,8355=>602,8356=>602,8357=>602,8358=>602,8359=>602,8360=>602,8361=>602,8362=>602,8363=>602,8364=>602,8365=>602,8366=>602,8367=>602,8368=>602,8369=>602,8370=>602,8371=>602,8372=>602,8373=>602,8376=>602,8377=>602,8450=>602,8453=>602,8461=>602,8462=>602,8463=>602,8469=>602,8470=>602,8471=>602,8473=>602,8474=>602,8477=>602,8482=>602,8484=>602,8486=>602,8490=>602,8491=>602,8494=>602,8531=>602,8532=>602,8533=>602,8534=>602,8535=>602,8536=>602,8537=>602,8538=>602,8539=>602,8540=>602,8541=>602,8542=>602,8543=>602,8592=>602,8593=>602,8594=>602,8595=>602,8596=>602,8597=>602,8598=>602,8599=>602,8600=>602,8601=>602,8602=>602,8603=>602,8604=>602,8605=>602,8606=>602,8607=>602,8608=>602,8609=>602,8610=>602,8611=>602,8612=>602,8613=>602,8614=>602,8615=>602,8616=>602,8617=>602,8618=>602,8619=>602,8620=>602,8621=>602,8622=>602,8623=>602,8624=>602,8625=>602,8626=>602,8627=>602,8628=>602,8629=>602,8630=>602,8631=>602,8632=>602,8633=>602,8634=>602,8635=>602,8636=>602,8637=>602,8638=>602,8639=>602,8640=>602,8641=>602,8642=>602,8643=>602,8644=>602,8645=>602,8646=>602,8647=>602,8648=>602,8649=>602,8650=>602,8651=>602,8652=>602,8653=>602,8654=>602,8655=>602,8656=>602,8657=>602,8658=>602,8659=>602,8660=>602,8661=>602,8662=>602,8663=>602,8664=>602,8665=>602,8666=>602,8667=>602,8668=>602,8669=>602,8670=>602,8671=>602,8672=>602,8673=>602,8674=>602,8675=>602,8676=>602,8677=>602,8678=>602,8679=>602,8680=>602,8681=>602,8682=>602,8683=>602,8684=>602,8685=>602,8686=>602,8687=>602,8688=>602,8689=>602,8690=>602,8691=>602,8692=>602,8693=>602,8694=>602,8695=>602,8696=>602,8697=>602,8698=>602,8699=>602,8700=>602,8701=>602,8702=>602,8703=>602,8704=>602,8705=>602,8706=>602,8707=>602,8708=>602,8709=>602,8710=>602,8711=>602,8712=>602,8713=>602,8714=>602,8715=>602,8716=>602,8717=>602,8719=>602,8721=>602,8722=>602,8723=>602,8725=>602,8727=>602,8728=>602,8729=>602,8730=>602,8731=>602,8732=>602,8733=>602,8734=>602,8735=>602,8736=>602,8743=>602,8744=>602,8745=>602,8746=>602,8747=>602,8748=>602,8749=>602,8756=>602,8757=>602,8758=>602,8759=>602,8760=>602,8761=>602,8762=>602,8763=>602,8764=>602,8765=>602,8769=>602,8770=>602,8771=>602,8772=>602,8773=>602,8774=>602,8775=>602,8776=>602,8777=>602,8778=>602,8779=>602,8780=>602,8781=>602,8782=>602,8783=>602,8784=>602,8785=>602,8786=>602,8787=>602,8788=>602,8789=>602,8790=>602,8791=>602,8792=>602,8793=>602,8794=>602,8795=>602,8796=>602,8797=>602,8798=>602,8799=>602,8800=>602,8801=>602,8802=>602,8803=>602,8804=>602,8805=>602,8806=>602,8807=>602,8808=>602,8809=>602,8813=>602,8814=>602,8815=>602,8816=>602,8817=>602,8818=>602,8819=>602,8820=>602,8821=>602,8822=>602,8823=>602,8824=>602,8825=>602,8826=>602,8827=>602,8828=>602,8829=>602,8830=>602,8831=>602,8832=>602,8833=>602,8834=>602,8835=>602,8836=>602,8837=>602,8838=>602,8839=>602,8840=>602,8841=>602,8842=>602,8843=>602,8847=>602,8848=>602,8849=>602,8850=>602,8853=>602,8854=>602,8855=>602,8856=>602,8857=>602,8858=>602,8859=>602,8860=>602,8861=>602,8862=>602,8863=>602,8864=>602,8865=>602,8866=>602,8867=>602,8868=>602,8869=>602,8901=>602,8902=>602,8909=>602,8922=>602,8923=>602,8924=>602,8925=>602,8926=>602,8927=>602,8928=>602,8929=>602,8930=>602,8931=>602,8932=>602,8933=>602,8934=>602,8935=>602,8936=>602,8937=>602,8943=>602,8960=>602,8961=>602,8962=>602,8963=>602,8964=>602,8965=>602,8966=>602,8968=>602,8969=>602,8970=>602,8971=>602,8972=>602,8973=>602,8974=>602,8975=>602,8976=>602,8977=>602,8978=>602,8979=>602,8980=>602,8981=>602,8984=>602,8985=>602,8988=>602,8989=>602,8990=>602,8991=>602,8992=>602,8993=>602,8997=>602,8998=>602,8999=>602,9000=>602,9003=>602,9013=>602,9015=>602,9016=>602,9017=>602,9018=>602,9019=>602,9020=>602,9021=>602,9022=>602,9025=>602,9026=>602,9027=>602,9028=>602,9031=>602,9032=>602,9033=>602,9035=>602,9036=>602,9037=>602,9040=>602,9042=>602,9043=>602,9044=>602,9047=>602,9048=>602,9049=>602,9050=>602,9051=>602,9052=>602,9054=>602,9055=>602,9056=>602,9059=>602,9060=>602,9061=>602,9064=>602,9065=>602,9067=>602,9068=>602,9069=>602,9070=>602,9071=>602,9072=>602,9075=>602,9076=>602,9077=>602,9078=>602,9079=>602,9080=>602,9081=>602,9082=>602,9085=>602,9088=>602,9089=>602,9090=>602,9091=>602,9096=>602,9097=>602,9098=>602,9099=>602,9109=>602,9115=>602,9116=>602,9117=>602,9118=>602,9119=>602,9120=>602,9121=>602,9122=>602,9123=>602,9124=>602,9125=>602,9126=>602,9127=>602,9128=>602,9129=>602,9130=>602,9131=>602,9132=>602,9133=>602,9134=>602,9166=>602,9167=>602,9251=>602,9600=>602,9601=>602,9602=>602,9603=>602,9604=>602,9605=>602,9606=>602,9607=>602,9608=>602,9609=>602,9610=>602,9611=>602,9612=>602,9613=>602,9614=>602,9615=>602,9616=>602,9617=>602,9618=>602,9619=>602,9620=>602,9621=>602,9622=>602,9623=>602,9624=>602,9625=>602,9626=>602,9627=>602,9628=>602,9629=>602,9630=>602,9631=>602,9632=>602,9633=>602,9634=>602,9635=>602,9636=>602,9637=>602,9638=>602,9639=>602,9640=>602,9641=>602,9642=>602,9643=>602,9644=>602,9645=>602,9646=>602,9647=>602,9648=>602,9649=>602,9650=>602,9651=>602,9652=>602,9653=>602,9654=>602,9655=>602,9656=>602,9657=>602,9658=>602,9659=>602,9660=>602,9661=>602,9662=>602,9663=>602,9664=>602,9665=>602,9666=>602,9667=>602,9668=>602,9669=>602,9670=>602,9671=>602,9672=>602,9673=>602,9674=>602,9675=>602,9676=>602,9677=>602,9678=>602,9679=>602,9680=>602,9681=>602,9682=>602,9683=>602,9684=>602,9685=>602,9686=>602,9687=>602,9688=>602,9689=>602,9690=>602,9691=>602,9692=>602,9693=>602,9694=>602,9695=>602,9696=>602,9697=>602,9698=>602,9699=>602,9700=>602,9701=>602,9702=>602,9703=>602,9704=>602,9705=>602,9706=>602,9707=>602,9708=>602,9709=>602,9710=>602,9711=>602,9712=>602,9713=>602,9714=>602,9715=>602,9716=>602,9717=>602,9718=>602,9719=>602,9720=>602,9721=>602,9722=>602,9723=>602,9724=>602,9725=>602,9726=>602,9727=>602,9728=>602,9729=>602,9730=>602,9731=>602,9732=>602,9733=>602,9734=>602,9735=>602,9736=>602,9737=>602,9738=>602,9739=>602,9740=>602,9741=>602,9742=>602,9743=>602,9744=>602,9745=>602,9746=>602,9747=>602,9748=>602,9749=>602,9750=>602,9751=>602,9752=>602,9753=>602,9754=>602,9755=>602,9756=>602,9757=>602,9758=>602,9759=>602,9760=>602,9761=>602,9762=>602,9763=>602,9764=>602,9765=>602,9766=>602,9767=>602,9768=>602,9769=>602,9770=>602,9771=>602,9772=>602,9773=>602,9774=>602,9775=>602,9784=>602,9785=>602,9786=>602,9787=>602,9788=>602,9789=>602,9790=>602,9791=>602,9792=>602,9793=>602,9794=>602,9795=>602,9796=>602,9797=>602,9798=>602,9799=>602,9800=>602,9801=>602,9802=>602,9803=>602,9804=>602,9805=>602,9806=>602,9807=>602,9808=>602,9809=>602,9810=>602,9811=>602,9812=>602,9813=>602,9814=>602,9815=>602,9816=>602,9817=>602,9818=>602,9819=>602,9820=>602,9821=>602,9822=>602,9823=>602,9824=>602,9825=>602,9826=>602,9827=>602,9828=>602,9829=>602,9830=>602,9831=>602,9832=>602,9833=>602,9834=>602,9835=>602,9836=>602,9837=>602,9838=>602,9839=>602,9840=>602,9841=>602,9842=>602,9843=>602,9844=>602,9845=>602,9846=>602,9847=>602,9848=>602,9849=>602,9850=>602,9851=>602,9852=>602,9853=>602,9854=>602,9855=>602,9856=>602,9857=>602,9858=>602,9859=>602,9860=>602,9861=>602,9862=>602,9863=>602,9864=>602,9865=>602,9866=>602,9867=>602,9872=>602,9873=>602,9874=>602,9875=>602,9876=>602,9877=>602,9878=>602,9879=>602,9880=>602,9881=>602,9882=>602,9883=>602,9884=>602,9888=>602,9889=>602,9904=>602,9905=>602,9985=>602,9986=>602,9987=>602,9988=>602,9990=>602,9991=>602,9992=>602,9993=>602,9996=>602,9997=>602,9998=>602,9999=>602,10000=>602,10001=>602,10002=>602,10003=>602,10004=>602,10005=>602,10006=>602,10007=>602,10008=>602,10009=>602,10010=>602,10011=>602,10012=>602,10013=>602,10014=>602,10015=>602,10016=>602,10017=>602,10018=>602,10019=>602,10020=>602,10021=>602,10022=>602,10023=>602,10025=>602,10026=>602,10027=>602,10028=>602,10029=>602,10030=>602,10031=>602,10032=>602,10033=>602,10034=>602,10035=>602,10036=>602,10037=>602,10038=>602,10039=>602,10040=>602,10041=>602,10042=>602,10043=>602,10044=>602,10045=>602,10046=>602,10047=>602,10048=>602,10049=>602,10050=>602,10051=>602,10052=>602,10053=>602,10054=>602,10055=>602,10056=>602,10057=>602,10058=>602,10059=>602,10061=>602,10063=>602,10064=>602,10065=>602,10066=>602,10070=>602,10072=>602,10073=>602,10074=>602,10075=>602,10076=>602,10077=>602,10078=>602,10081=>602,10082=>602,10083=>602,10084=>602,10085=>602,10086=>602,10087=>602,10088=>602,10089=>602,10090=>602,10091=>602,10092=>602,10093=>602,10094=>602,10095=>602,10096=>602,10097=>602,10098=>602,10099=>602,10100=>602,10101=>602,10132=>602,10136=>602,10137=>602,10138=>602,10139=>602,10140=>602,10141=>602,10142=>602,10143=>602,10144=>602,10145=>602,10146=>602,10147=>602,10148=>602,10149=>602,10150=>602,10151=>602,10152=>602,10153=>602,10154=>602,10155=>602,10156=>602,10157=>602,10158=>602,10159=>602,10161=>602,10162=>602,10163=>602,10164=>602,10165=>602,10166=>602,10167=>602,10168=>602,10169=>602,10170=>602,10171=>602,10172=>602,10173=>602,10174=>602,10175=>602,10181=>602,10182=>602,10208=>602,10216=>602,10217=>602,10731=>602,10746=>602,10747=>602,10799=>602,11026=>602,11027=>602,11028=>602,11029=>602,11030=>602,11031=>602,11032=>602,11033=>602,11034=>602,11364=>602,11373=>602,11374=>602,11375=>602,11376=>602,11381=>602,11382=>602,11383=>602,11385=>602,11386=>602,11388=>602,11389=>602,11390=>602,11391=>602,11800=>602,11810=>602,11811=>602,11812=>602,11813=>602,11822=>602,42760=>602,42761=>602,42762=>602,42763=>602,42764=>602,42765=>602,42766=>602,42767=>602,42768=>602,42769=>602,42770=>602,42771=>602,42772=>602,42773=>602,42774=>602,42779=>602,42780=>602,42781=>602,42782=>602,42783=>602,42786=>602,42787=>602,42788=>602,42789=>602,42790=>602,42791=>602,42889=>602,42890=>602,42891=>602,42892=>602,42893=>602,42894=>602,42896=>602,42897=>602,63173=>602,64257=>602,64258=>602,64338=>602,64339=>602,64340=>602,64341=>602,64342=>602,64343=>602,64344=>602,64345=>602,64346=>602,64347=>602,64348=>602,64349=>602,64350=>602,64351=>602,64352=>602,64353=>602,64354=>602,64355=>602,64356=>602,64357=>602,64358=>602,64359=>602,64360=>602,64361=>602,64362=>602,64363=>602,64364=>602,64365=>602,64366=>602,64367=>602,64368=>602,64369=>602,64370=>602,64371=>602,64372=>602,64373=>602,64374=>602,64375=>602,64376=>602,64377=>602,64378=>602,64379=>602,64380=>602,64381=>602,64382=>602,64383=>602,64384=>602,64385=>602,64394=>602,64395=>602,64396=>602,64397=>602,64398=>602,64399=>602,64400=>602,64401=>602,64402=>602,64403=>602,64404=>602,64405=>602,64414=>602,64415=>602,64426=>602,64427=>602,64428=>602,64429=>602,64488=>602,64489=>602,64508=>602,64509=>602,64510=>602,64511=>602,65136=>602,65137=>602,65138=>602,65139=>602,65140=>602,65142=>602,65143=>602,65144=>602,65145=>602,65146=>602,65147=>602,65148=>602,65149=>602,65150=>602,65151=>602,65152=>602,65153=>602,65154=>602,65155=>602,65156=>602,65157=>602,65158=>602,65159=>602,65160=>602,65161=>602,65162=>602,65163=>602,65164=>602,65165=>602,65166=>602,65167=>602,65168=>602,65169=>602,65170=>602,65171=>602,65172=>602,65173=>602,65174=>602,65175=>602,65176=>602,65177=>602,65178=>602,65179=>602,65180=>602,65181=>602,65182=>602,65183=>602,65184=>602,65185=>602,65186=>602,65187=>602,65188=>602,65189=>602,65190=>602,65191=>602,65192=>602,65193=>602,65194=>602,65195=>602,65196=>602,65197=>602,65198=>602,65199=>602,65200=>602,65201=>602,65202=>602,65203=>602,65204=>602,65205=>602,65206=>602,65207=>602,65208=>602,65209=>602,65210=>602,65211=>602,65212=>602,65213=>602,65214=>602,65215=>602,65216=>602,65217=>602,65218=>602,65219=>602,65220=>602,65221=>602,65222=>602,65223=>602,65224=>602,65225=>602,65226=>602,65227=>602,65228=>602,65229=>602,65230=>602,65231=>602,65232=>602,65233=>602,65234=>602,65235=>602,65236=>602,65237=>602,65238=>602,65239=>602,65240=>602,65241=>602,65242=>602,65243=>602,65244=>602,65245=>602,65246=>602,65247=>602,65248=>602,65249=>602,65250=>602,65251=>602,65252=>602,65253=>602,65254=>602,65255=>602,65256=>602,65257=>602,65258=>602,65259=>602,65260=>602,65261=>602,65262=>602,65263=>602,65264=>602,65265=>602,65266=>602,65267=>602,65268=>602,65269=>602,65270=>602,65271=>602,65272=>602,65273=>602,65274=>602,65275=>602,65276=>602,65279=>602,65529=>602,65530=>602,65531=>602,65532=>602,65533=>602,65535=>602);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonob.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonob.z
new file mode 100644
index 00000000..93a8335d
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonob.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonobi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonobi.ctg.z
new file mode 100644
index 00000000..3130300c
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonobi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonobi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonobi.php
new file mode 100644
index 00000000..9e4a044c
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonobi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSansMono-BoldOblique';
+$up=-63;
+$ut=44;
+$dw=602;
+$diff='';
+$originalsize=235848;
+$enc='';
+$file='dejavusansmonobi.z';
+$ctg='dejavusansmonobi.ctg.z';
+$desc=array('Flags'=>97,'FontBBox'=>'[-425 -394 808 1053]','ItalicAngle'=>-11,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>547,'StemV'=>60,'StemH'=>26,'AvgWidth'=>602,'MaxWidth'=>602,'MissingWidth'=>602);
+$cw=array(0=>602,32=>602,33=>602,34=>602,35=>602,36=>602,37=>602,38=>602,39=>602,40=>602,41=>602,42=>602,43=>602,44=>602,45=>602,46=>602,47=>602,48=>602,49=>602,50=>602,51=>602,52=>602,53=>602,54=>602,55=>602,56=>602,57=>602,58=>602,59=>602,60=>602,61=>602,62=>602,63=>602,64=>602,65=>602,66=>602,67=>602,68=>602,69=>602,70=>602,71=>602,72=>602,73=>602,74=>602,75=>602,76=>602,77=>602,78=>602,79=>602,80=>602,81=>602,82=>602,83=>602,84=>602,85=>602,86=>602,87=>602,88=>602,89=>602,90=>602,91=>602,92=>602,93=>602,94=>602,95=>602,96=>602,97=>602,98=>602,99=>602,100=>602,101=>602,102=>602,103=>602,104=>602,105=>602,106=>602,107=>602,108=>602,109=>602,110=>602,111=>602,112=>602,113=>602,114=>602,115=>602,116=>602,117=>602,118=>602,119=>602,120=>602,121=>602,122=>602,123=>602,124=>602,125=>602,126=>602,160=>602,161=>602,162=>602,163=>602,164=>602,165=>602,166=>602,167=>602,168=>602,169=>602,170=>602,171=>602,172=>602,173=>602,174=>602,175=>602,176=>602,177=>602,178=>602,179=>602,180=>602,181=>602,182=>602,183=>602,184=>602,185=>602,186=>602,187=>602,188=>602,189=>602,190=>602,191=>602,192=>602,193=>602,194=>602,195=>602,196=>602,197=>602,198=>602,199=>602,200=>602,201=>602,202=>602,203=>602,204=>602,205=>602,206=>602,207=>602,208=>602,209=>602,210=>602,211=>602,212=>602,213=>602,214=>602,215=>602,216=>602,217=>602,218=>602,219=>602,220=>602,221=>602,222=>602,223=>602,224=>602,225=>602,226=>602,227=>602,228=>602,229=>602,230=>602,231=>602,232=>602,233=>602,234=>602,235=>602,236=>602,237=>602,238=>602,239=>602,240=>602,241=>602,242=>602,243=>602,244=>602,245=>602,246=>602,247=>602,248=>602,249=>602,250=>602,251=>602,252=>602,253=>602,254=>602,255=>602,256=>602,257=>602,258=>602,259=>602,260=>602,261=>602,262=>602,263=>602,264=>602,265=>602,266=>602,267=>602,268=>602,269=>602,270=>602,271=>602,272=>602,273=>602,274=>602,275=>602,276=>602,277=>602,278=>602,279=>602,280=>602,281=>602,282=>602,283=>602,284=>602,285=>602,286=>602,287=>602,288=>602,289=>602,290=>602,291=>602,292=>602,293=>602,294=>602,295=>602,296=>602,297=>602,298=>602,299=>602,300=>602,301=>602,302=>602,303=>602,304=>602,305=>602,306=>602,307=>602,308=>602,309=>602,310=>602,311=>602,312=>602,313=>602,314=>602,315=>602,316=>602,317=>602,318=>602,319=>602,320=>602,321=>602,322=>602,323=>602,324=>602,325=>602,326=>602,327=>602,328=>602,329=>602,330=>602,331=>602,332=>602,333=>602,334=>602,335=>602,336=>602,337=>602,338=>602,339=>602,340=>602,341=>602,342=>602,343=>602,344=>602,345=>602,346=>602,347=>602,348=>602,349=>602,350=>602,351=>602,352=>602,353=>602,354=>602,355=>602,356=>602,357=>602,358=>602,359=>602,360=>602,361=>602,362=>602,363=>602,364=>602,365=>602,366=>602,367=>602,368=>602,369=>602,370=>602,371=>602,372=>602,373=>602,374=>602,375=>602,376=>602,377=>602,378=>602,379=>602,380=>602,381=>602,382=>602,383=>602,384=>602,385=>602,386=>602,387=>602,388=>602,389=>602,390=>602,391=>602,392=>602,393=>602,394=>602,395=>602,396=>602,397=>602,398=>602,399=>602,400=>602,401=>602,402=>602,403=>602,404=>602,405=>602,406=>602,407=>602,408=>602,409=>602,410=>602,411=>602,412=>602,413=>602,414=>602,415=>602,416=>602,417=>602,418=>602,419=>602,420=>602,421=>602,422=>602,423=>602,424=>602,425=>602,426=>602,427=>602,428=>602,429=>602,430=>602,431=>602,432=>602,433=>602,434=>602,435=>602,436=>602,437=>602,438=>602,439=>602,440=>602,441=>602,442=>602,443=>602,444=>602,445=>602,446=>602,447=>602,448=>602,449=>602,450=>602,451=>602,461=>602,462=>602,463=>602,464=>602,465=>602,466=>602,467=>602,468=>602,469=>602,470=>602,471=>602,472=>602,473=>602,474=>602,475=>602,476=>602,477=>602,478=>602,479=>602,480=>602,481=>602,482=>602,483=>602,486=>602,487=>602,488=>602,489=>602,490=>602,491=>602,492=>602,493=>602,494=>602,495=>602,500=>602,501=>602,502=>602,504=>602,505=>602,508=>602,509=>602,510=>602,511=>602,512=>602,513=>602,514=>602,515=>602,516=>602,517=>602,518=>602,519=>602,520=>602,521=>602,522=>602,523=>602,524=>602,525=>602,526=>602,527=>602,528=>602,529=>602,530=>602,531=>602,532=>602,533=>602,534=>602,535=>602,536=>602,537=>602,538=>602,539=>602,540=>602,541=>602,542=>602,543=>602,545=>602,548=>602,549=>602,550=>602,551=>602,552=>602,553=>602,554=>602,555=>602,556=>602,557=>602,558=>602,559=>602,560=>602,561=>602,562=>602,563=>602,564=>602,565=>602,566=>602,567=>602,568=>602,569=>602,570=>602,571=>602,572=>602,573=>602,574=>602,575=>602,576=>602,577=>602,579=>602,580=>602,581=>602,588=>602,589=>602,592=>602,593=>602,594=>602,595=>602,596=>602,597=>602,598=>602,599=>602,600=>602,601=>602,602=>602,603=>602,604=>602,605=>602,606=>602,607=>602,608=>602,609=>602,610=>602,611=>602,612=>602,613=>602,614=>602,615=>602,616=>602,617=>602,618=>602,619=>602,620=>602,621=>602,622=>602,623=>602,624=>602,625=>602,626=>602,627=>602,628=>602,629=>602,630=>602,631=>602,632=>602,633=>602,634=>602,635=>602,636=>602,637=>602,638=>602,639=>602,640=>602,641=>602,642=>602,643=>602,644=>602,645=>602,646=>602,647=>602,648=>602,649=>602,650=>602,651=>602,652=>602,653=>602,654=>602,655=>602,656=>602,657=>602,658=>602,659=>602,660=>602,661=>602,662=>602,663=>602,664=>602,665=>602,666=>602,667=>602,668=>602,669=>602,670=>602,671=>602,672=>602,673=>602,674=>602,675=>602,676=>602,677=>602,678=>602,679=>602,680=>602,681=>602,682=>602,683=>602,684=>602,685=>602,686=>602,687=>602,688=>602,689=>602,690=>602,691=>602,692=>602,693=>602,694=>602,695=>602,696=>602,697=>602,699=>602,700=>602,701=>602,702=>602,703=>602,704=>602,705=>602,710=>602,711=>602,712=>602,713=>602,716=>602,717=>602,720=>602,721=>602,722=>602,723=>602,726=>602,727=>602,728=>602,729=>602,730=>602,731=>602,732=>602,733=>602,734=>602,736=>602,737=>602,738=>602,739=>602,740=>602,741=>602,742=>602,743=>602,744=>602,745=>602,750=>602,755=>602,768=>602,769=>602,770=>602,771=>602,772=>602,773=>602,774=>602,775=>602,776=>602,777=>602,778=>602,779=>602,780=>602,781=>602,782=>602,783=>602,784=>602,785=>602,786=>602,787=>602,788=>602,789=>602,790=>602,791=>602,792=>602,793=>602,794=>602,795=>602,796=>602,797=>602,798=>602,799=>602,800=>602,801=>602,802=>602,803=>602,804=>602,805=>602,806=>602,807=>602,808=>602,809=>602,810=>602,811=>602,812=>602,813=>602,814=>602,815=>602,816=>602,817=>602,818=>602,819=>602,820=>602,821=>602,822=>602,823=>602,824=>602,825=>602,826=>602,827=>602,828=>602,829=>602,830=>602,831=>602,835=>602,856=>602,865=>602,884=>602,885=>602,890=>602,894=>602,900=>602,901=>602,902=>602,903=>602,904=>602,905=>602,906=>602,908=>602,910=>602,911=>602,912=>602,913=>602,914=>602,915=>602,916=>602,917=>602,918=>602,919=>602,920=>602,921=>602,922=>602,923=>602,924=>602,925=>602,926=>602,927=>602,928=>602,929=>602,931=>602,932=>602,933=>602,934=>602,935=>602,936=>602,937=>602,938=>602,939=>602,940=>602,941=>602,942=>602,943=>602,944=>602,945=>602,946=>602,947=>602,948=>602,949=>602,950=>602,951=>602,952=>602,953=>602,954=>602,955=>602,956=>602,957=>602,958=>602,959=>602,960=>602,961=>602,962=>602,963=>602,964=>602,965=>602,966=>602,967=>602,968=>602,969=>602,970=>602,971=>602,972=>602,973=>602,974=>602,976=>602,977=>602,978=>602,979=>602,980=>602,981=>602,982=>602,983=>602,984=>602,985=>602,986=>602,987=>602,988=>602,989=>602,990=>602,991=>602,992=>602,993=>602,1008=>602,1009=>602,1010=>602,1011=>602,1012=>602,1013=>602,1014=>602,1015=>602,1016=>602,1017=>602,1018=>602,1019=>602,1020=>602,1021=>602,1022=>602,1023=>602,1024=>602,1025=>602,1026=>602,1027=>602,1028=>602,1029=>602,1030=>602,1031=>602,1032=>602,1033=>602,1034=>602,1035=>602,1036=>602,1037=>602,1038=>602,1039=>602,1040=>602,1041=>602,1042=>602,1043=>602,1044=>602,1045=>602,1046=>602,1047=>602,1048=>602,1049=>602,1050=>602,1051=>602,1052=>602,1053=>602,1054=>602,1055=>602,1056=>602,1057=>602,1058=>602,1059=>602,1060=>602,1061=>602,1062=>602,1063=>602,1064=>602,1065=>602,1066=>602,1067=>602,1068=>602,1069=>602,1070=>602,1071=>602,1072=>602,1073=>602,1074=>602,1075=>602,1076=>602,1077=>602,1078=>602,1079=>602,1080=>602,1081=>602,1082=>602,1083=>602,1084=>602,1085=>602,1086=>602,1087=>602,1088=>602,1089=>602,1090=>602,1091=>602,1092=>602,1093=>602,1094=>602,1095=>602,1096=>602,1097=>602,1098=>602,1099=>602,1100=>602,1101=>602,1102=>602,1103=>602,1104=>602,1105=>602,1106=>602,1107=>602,1108=>602,1109=>602,1110=>602,1111=>602,1112=>602,1113=>602,1114=>602,1115=>602,1116=>602,1117=>602,1118=>602,1119=>602,1122=>602,1123=>602,1138=>602,1139=>602,1168=>602,1169=>602,1170=>602,1171=>602,1172=>602,1173=>602,1174=>602,1175=>602,1176=>602,1177=>602,1178=>602,1179=>602,1186=>602,1187=>602,1188=>602,1189=>602,1194=>602,1195=>602,1196=>602,1197=>602,1198=>602,1199=>602,1200=>602,1201=>602,1202=>602,1203=>602,1210=>602,1211=>602,1216=>602,1217=>602,1218=>602,1219=>602,1220=>602,1223=>602,1224=>602,1227=>602,1228=>602,1231=>602,1232=>602,1233=>602,1234=>602,1235=>602,1236=>602,1237=>602,1238=>602,1239=>602,1240=>602,1241=>602,1242=>602,1243=>602,1244=>602,1245=>602,1246=>602,1247=>602,1248=>602,1249=>602,1250=>602,1251=>602,1252=>602,1253=>602,1254=>602,1255=>602,1256=>602,1257=>602,1258=>602,1259=>602,1260=>602,1261=>602,1262=>602,1263=>602,1264=>602,1265=>602,1266=>602,1267=>602,1268=>602,1269=>602,1270=>602,1271=>602,1272=>602,1273=>602,1296=>602,1297=>602,1306=>602,1307=>602,1308=>602,1309=>602,1329=>602,1330=>602,1331=>602,1332=>602,1333=>602,1334=>602,1335=>602,1336=>602,1337=>602,1338=>602,1339=>602,1340=>602,1341=>602,1342=>602,1343=>602,1344=>602,1345=>602,1346=>602,1347=>602,1348=>602,1349=>602,1350=>602,1351=>602,1352=>602,1353=>602,1354=>602,1355=>602,1356=>602,1357=>602,1358=>602,1359=>602,1360=>602,1361=>602,1362=>602,1363=>602,1364=>602,1365=>602,1366=>602,1369=>602,1370=>602,1371=>602,1372=>602,1373=>602,1374=>602,1375=>602,1377=>602,1378=>602,1379=>602,1380=>602,1381=>602,1382=>602,1383=>602,1384=>602,1385=>602,1386=>602,1387=>602,1388=>602,1389=>602,1390=>602,1391=>602,1392=>602,1393=>602,1394=>602,1395=>602,1396=>602,1397=>602,1398=>602,1399=>602,1400=>602,1401=>602,1402=>602,1403=>602,1404=>602,1405=>602,1406=>602,1407=>602,1408=>602,1409=>602,1410=>602,1411=>602,1412=>602,1413=>602,1414=>602,1415=>602,1417=>602,1418=>602,3713=>602,3714=>602,3716=>602,3719=>602,3720=>602,3722=>602,3725=>602,3732=>602,3733=>602,3734=>602,3735=>602,3737=>602,3738=>602,3739=>602,3740=>602,3741=>602,3742=>602,3743=>602,3745=>602,3746=>602,3747=>602,3749=>602,3751=>602,3754=>602,3755=>602,3757=>602,3758=>602,3759=>602,3760=>602,3761=>602,3762=>602,3763=>602,3764=>602,3765=>602,3766=>602,3767=>602,3768=>602,3769=>602,3771=>602,3772=>602,3784=>602,3785=>602,3786=>602,3787=>602,3788=>602,3789=>602,4304=>602,4305=>602,4306=>602,4307=>602,4308=>602,4309=>602,4310=>602,4311=>602,4312=>602,4313=>602,4314=>602,4315=>602,4316=>602,4317=>602,4318=>602,4319=>602,4320=>602,4321=>602,4322=>602,4323=>602,4324=>602,4325=>602,4326=>602,4327=>602,4328=>602,4329=>602,4330=>602,4331=>602,4332=>602,4333=>602,4334=>602,4335=>602,4336=>602,4337=>602,4338=>602,4339=>602,4340=>602,4341=>602,4342=>602,4343=>602,4344=>602,4345=>602,4346=>602,4347=>602,4348=>602,7426=>602,7432=>602,7433=>602,7444=>602,7446=>602,7447=>602,7453=>602,7454=>602,7455=>602,7468=>602,7469=>602,7470=>602,7472=>602,7473=>602,7474=>602,7475=>602,7476=>602,7477=>602,7478=>602,7479=>602,7480=>602,7481=>602,7482=>602,7483=>602,7484=>602,7486=>602,7487=>602,7488=>602,7489=>602,7490=>602,7491=>602,7492=>602,7493=>602,7494=>602,7495=>602,7496=>602,7497=>602,7498=>602,7499=>602,7500=>602,7501=>602,7502=>602,7503=>602,7504=>602,7505=>602,7506=>602,7507=>602,7508=>602,7509=>602,7510=>602,7511=>602,7512=>602,7513=>602,7514=>602,7515=>602,7522=>602,7523=>602,7524=>602,7525=>602,7543=>602,7544=>602,7547=>602,7557=>602,7579=>602,7580=>602,7581=>602,7582=>602,7583=>602,7584=>602,7585=>602,7586=>602,7587=>602,7588=>602,7589=>602,7590=>602,7591=>602,7592=>602,7593=>602,7594=>602,7595=>602,7596=>602,7597=>602,7598=>602,7599=>602,7600=>602,7601=>602,7602=>602,7603=>602,7604=>602,7605=>602,7606=>602,7607=>602,7609=>602,7610=>602,7611=>602,7612=>602,7613=>602,7614=>602,7615=>602,7680=>602,7681=>602,7682=>602,7683=>602,7684=>602,7685=>602,7686=>602,7687=>602,7688=>602,7689=>602,7690=>602,7691=>602,7692=>602,7693=>602,7694=>602,7695=>602,7696=>602,7697=>602,7698=>602,7699=>602,7704=>602,7705=>602,7706=>602,7707=>602,7708=>602,7709=>602,7710=>602,7711=>602,7712=>602,7713=>602,7714=>602,7715=>602,7716=>602,7717=>602,7718=>602,7719=>602,7720=>602,7721=>602,7722=>602,7723=>602,7724=>602,7725=>602,7728=>602,7729=>602,7730=>602,7731=>602,7732=>602,7733=>602,7734=>602,7735=>602,7736=>602,7737=>602,7738=>602,7739=>602,7740=>602,7741=>602,7742=>602,7743=>602,7744=>602,7745=>602,7746=>602,7747=>602,7748=>602,7749=>602,7750=>602,7751=>602,7752=>602,7753=>602,7754=>602,7755=>602,7756=>602,7757=>602,7764=>602,7765=>602,7766=>602,7767=>602,7768=>602,7769=>602,7770=>602,7771=>602,7772=>602,7773=>602,7774=>602,7775=>602,7776=>602,7777=>602,7778=>602,7779=>602,7784=>602,7785=>602,7786=>602,7787=>602,7788=>602,7789=>602,7790=>602,7791=>602,7792=>602,7793=>602,7794=>602,7795=>602,7796=>602,7797=>602,7798=>602,7799=>602,7800=>602,7801=>602,7804=>602,7805=>602,7806=>602,7807=>602,7808=>602,7809=>602,7810=>602,7811=>602,7812=>602,7813=>602,7814=>602,7815=>602,7816=>602,7817=>602,7818=>602,7819=>602,7820=>602,7821=>602,7822=>602,7823=>602,7824=>602,7825=>602,7826=>602,7827=>602,7828=>602,7829=>602,7830=>602,7831=>602,7832=>602,7833=>602,7835=>602,7839=>602,7840=>602,7841=>602,7852=>602,7853=>602,7856=>602,7857=>602,7862=>602,7863=>602,7864=>602,7865=>602,7868=>602,7869=>602,7878=>602,7879=>602,7882=>602,7883=>602,7884=>602,7885=>602,7896=>602,7897=>602,7898=>602,7899=>602,7900=>602,7901=>602,7904=>602,7905=>602,7906=>602,7907=>602,7908=>602,7909=>602,7912=>602,7913=>602,7914=>602,7915=>602,7918=>602,7919=>602,7920=>602,7921=>602,7922=>602,7923=>602,7924=>602,7925=>602,7928=>602,7929=>602,7936=>602,7937=>602,7938=>602,7939=>602,7940=>602,7941=>602,7942=>602,7943=>602,7944=>602,7945=>602,7946=>602,7947=>602,7948=>602,7949=>602,7950=>602,7951=>602,7952=>602,7953=>602,7954=>602,7955=>602,7956=>602,7957=>602,7960=>602,7961=>602,7962=>602,7963=>602,7964=>602,7965=>602,7968=>602,7969=>602,7970=>602,7971=>602,7972=>602,7973=>602,7974=>602,7975=>602,7976=>602,7977=>602,7978=>602,7979=>602,7980=>602,7981=>602,7982=>602,7983=>602,7984=>602,7985=>602,7986=>602,7987=>602,7988=>602,7989=>602,7990=>602,7991=>602,7992=>602,7993=>602,7994=>602,7995=>602,7996=>602,7997=>602,7998=>602,7999=>602,8000=>602,8001=>602,8002=>602,8003=>602,8004=>602,8005=>602,8008=>602,8009=>602,8010=>602,8011=>602,8012=>602,8013=>602,8016=>602,8017=>602,8018=>602,8019=>602,8020=>602,8021=>602,8022=>602,8023=>602,8025=>602,8027=>602,8029=>602,8031=>602,8032=>602,8033=>602,8034=>602,8035=>602,8036=>602,8037=>602,8038=>602,8039=>602,8040=>602,8041=>602,8042=>602,8043=>602,8044=>602,8045=>602,8046=>602,8047=>602,8048=>602,8049=>602,8050=>602,8051=>602,8052=>602,8053=>602,8054=>602,8055=>602,8056=>602,8057=>602,8058=>602,8059=>602,8060=>602,8061=>602,8064=>602,8065=>602,8066=>602,8067=>602,8068=>602,8069=>602,8070=>602,8071=>602,8072=>602,8073=>602,8074=>602,8075=>602,8076=>602,8077=>602,8078=>602,8079=>602,8080=>602,8081=>602,8082=>602,8083=>602,8084=>602,8085=>602,8086=>602,8087=>602,8088=>602,8089=>602,8090=>602,8091=>602,8092=>602,8093=>602,8094=>602,8095=>602,8096=>602,8097=>602,8098=>602,8099=>602,8100=>602,8101=>602,8102=>602,8103=>602,8104=>602,8105=>602,8106=>602,8107=>602,8108=>602,8109=>602,8110=>602,8111=>602,8112=>602,8113=>602,8114=>602,8115=>602,8116=>602,8118=>602,8119=>602,8120=>602,8121=>602,8122=>602,8123=>602,8124=>602,8125=>602,8126=>602,8127=>602,8128=>602,8129=>602,8130=>602,8131=>602,8132=>602,8134=>602,8135=>602,8136=>602,8137=>602,8138=>602,8139=>602,8140=>602,8141=>602,8142=>602,8143=>602,8144=>602,8145=>602,8146=>602,8147=>602,8150=>602,8151=>602,8152=>602,8153=>602,8154=>602,8155=>602,8157=>602,8158=>602,8159=>602,8160=>602,8161=>602,8162=>602,8163=>602,8164=>602,8165=>602,8166=>602,8167=>602,8168=>602,8169=>602,8170=>602,8171=>602,8172=>602,8173=>602,8174=>602,8175=>602,8178=>602,8179=>602,8180=>602,8182=>602,8183=>602,8184=>602,8185=>602,8186=>602,8187=>602,8188=>602,8189=>602,8190=>602,8192=>602,8193=>602,8194=>602,8195=>602,8196=>602,8197=>602,8198=>602,8199=>602,8200=>602,8201=>602,8202=>602,8208=>602,8209=>602,8210=>602,8211=>602,8212=>602,8213=>602,8215=>602,8216=>602,8217=>602,8218=>602,8219=>602,8220=>602,8221=>602,8222=>602,8223=>602,8224=>602,8225=>602,8226=>602,8227=>602,8230=>602,8239=>602,8240=>602,8241=>602,8242=>602,8243=>602,8244=>602,8245=>602,8246=>602,8247=>602,8249=>602,8250=>602,8252=>602,8253=>602,8254=>602,8261=>602,8262=>602,8263=>602,8264=>602,8265=>602,8267=>602,8287=>602,8304=>602,8305=>602,8308=>602,8309=>602,8310=>602,8311=>602,8312=>602,8313=>602,8314=>602,8315=>602,8316=>602,8317=>602,8318=>602,8319=>602,8320=>602,8321=>602,8322=>602,8323=>602,8324=>602,8325=>602,8326=>602,8327=>602,8328=>602,8329=>602,8330=>602,8331=>602,8332=>602,8333=>602,8334=>602,8336=>602,8337=>602,8338=>602,8339=>602,8340=>602,8341=>602,8342=>602,8343=>602,8344=>602,8345=>602,8346=>602,8347=>602,8348=>602,8352=>602,8353=>602,8354=>602,8355=>602,8356=>602,8357=>602,8358=>602,8359=>602,8360=>602,8361=>602,8362=>602,8363=>602,8364=>602,8365=>602,8366=>602,8367=>602,8368=>602,8369=>602,8370=>602,8371=>602,8372=>602,8373=>602,8376=>602,8377=>602,8450=>602,8453=>602,8461=>602,8462=>602,8463=>602,8469=>602,8470=>602,8471=>602,8473=>602,8474=>602,8477=>602,8482=>602,8484=>602,8486=>602,8490=>602,8491=>602,8494=>602,8531=>602,8532=>602,8533=>602,8534=>602,8535=>602,8536=>602,8537=>602,8538=>602,8539=>602,8540=>602,8541=>602,8542=>602,8543=>602,8592=>602,8593=>602,8594=>602,8595=>602,8596=>602,8597=>602,8598=>602,8599=>602,8600=>602,8601=>602,8602=>602,8603=>602,8604=>602,8605=>602,8606=>602,8607=>602,8608=>602,8609=>602,8610=>602,8611=>602,8612=>602,8613=>602,8614=>602,8615=>602,8616=>602,8617=>602,8618=>602,8619=>602,8620=>602,8621=>602,8622=>602,8623=>602,8624=>602,8625=>602,8626=>602,8627=>602,8628=>602,8629=>602,8630=>602,8631=>602,8632=>602,8633=>602,8634=>602,8635=>602,8636=>602,8637=>602,8638=>602,8639=>602,8640=>602,8641=>602,8642=>602,8643=>602,8644=>602,8645=>602,8646=>602,8647=>602,8648=>602,8649=>602,8650=>602,8651=>602,8652=>602,8653=>602,8654=>602,8655=>602,8656=>602,8657=>602,8658=>602,8659=>602,8660=>602,8661=>602,8662=>602,8663=>602,8664=>602,8665=>602,8666=>602,8667=>602,8668=>602,8669=>602,8670=>602,8671=>602,8672=>602,8673=>602,8674=>602,8675=>602,8676=>602,8677=>602,8678=>602,8679=>602,8680=>602,8681=>602,8682=>602,8683=>602,8684=>602,8685=>602,8686=>602,8687=>602,8688=>602,8689=>602,8690=>602,8691=>602,8692=>602,8693=>602,8694=>602,8695=>602,8696=>602,8697=>602,8698=>602,8699=>602,8700=>602,8701=>602,8702=>602,8703=>602,8704=>602,8705=>602,8706=>602,8707=>602,8708=>602,8709=>602,8710=>602,8711=>602,8712=>602,8713=>602,8714=>602,8715=>602,8716=>602,8717=>602,8719=>602,8721=>602,8722=>602,8723=>602,8725=>602,8727=>602,8728=>602,8729=>602,8730=>602,8731=>602,8732=>602,8733=>602,8734=>602,8735=>602,8736=>602,8743=>602,8744=>602,8745=>602,8746=>602,8747=>602,8748=>602,8749=>602,8756=>602,8757=>602,8758=>602,8759=>602,8760=>602,8761=>602,8762=>602,8763=>602,8764=>602,8765=>602,8769=>602,8770=>602,8771=>602,8772=>602,8773=>602,8774=>602,8775=>602,8776=>602,8777=>602,8778=>602,8779=>602,8780=>602,8781=>602,8782=>602,8783=>602,8784=>602,8785=>602,8786=>602,8787=>602,8788=>602,8789=>602,8790=>602,8791=>602,8792=>602,8793=>602,8794=>602,8795=>602,8796=>602,8797=>602,8798=>602,8799=>602,8800=>602,8801=>602,8802=>602,8803=>602,8804=>602,8805=>602,8806=>602,8807=>602,8808=>602,8809=>602,8813=>602,8814=>602,8815=>602,8816=>602,8817=>602,8818=>602,8819=>602,8820=>602,8821=>602,8822=>602,8823=>602,8824=>602,8825=>602,8826=>602,8827=>602,8828=>602,8829=>602,8830=>602,8831=>602,8832=>602,8833=>602,8834=>602,8835=>602,8836=>602,8837=>602,8838=>602,8839=>602,8840=>602,8841=>602,8842=>602,8843=>602,8847=>602,8848=>602,8849=>602,8850=>602,8853=>602,8854=>602,8855=>602,8856=>602,8857=>602,8858=>602,8859=>602,8860=>602,8861=>602,8862=>602,8863=>602,8864=>602,8865=>602,8866=>602,8867=>602,8868=>602,8869=>602,8901=>602,8902=>602,8909=>602,8922=>602,8923=>602,8924=>602,8925=>602,8926=>602,8927=>602,8928=>602,8929=>602,8930=>602,8931=>602,8932=>602,8933=>602,8934=>602,8935=>602,8936=>602,8937=>602,8943=>602,8960=>602,8961=>602,8962=>602,8963=>602,8964=>602,8965=>602,8966=>602,8968=>602,8969=>602,8970=>602,8971=>602,8972=>602,8973=>602,8974=>602,8975=>602,8976=>602,8977=>602,8978=>602,8979=>602,8980=>602,8981=>602,8984=>602,8985=>602,8988=>602,8989=>602,8990=>602,8991=>602,8992=>602,8993=>602,8997=>602,8998=>602,8999=>602,9000=>602,9003=>602,9013=>602,9015=>602,9016=>602,9017=>602,9018=>602,9019=>602,9020=>602,9021=>602,9022=>602,9025=>602,9026=>602,9027=>602,9028=>602,9031=>602,9032=>602,9033=>602,9035=>602,9036=>602,9037=>602,9040=>602,9042=>602,9043=>602,9044=>602,9047=>602,9048=>602,9049=>602,9050=>602,9051=>602,9052=>602,9054=>602,9055=>602,9056=>602,9059=>602,9060=>602,9061=>602,9064=>602,9065=>602,9067=>602,9068=>602,9069=>602,9070=>602,9071=>602,9072=>602,9075=>602,9076=>602,9077=>602,9078=>602,9079=>602,9080=>602,9081=>602,9082=>602,9085=>602,9088=>602,9089=>602,9090=>602,9091=>602,9096=>602,9097=>602,9098=>602,9099=>602,9109=>602,9115=>602,9116=>602,9117=>602,9118=>602,9119=>602,9120=>602,9121=>602,9122=>602,9123=>602,9124=>602,9125=>602,9126=>602,9127=>602,9128=>602,9129=>602,9130=>602,9131=>602,9132=>602,9133=>602,9134=>602,9166=>602,9167=>602,9251=>602,9600=>602,9601=>602,9602=>602,9603=>602,9604=>602,9605=>602,9606=>602,9607=>602,9608=>602,9609=>602,9610=>602,9611=>602,9612=>602,9613=>602,9614=>602,9615=>602,9616=>602,9617=>602,9618=>602,9619=>602,9620=>602,9621=>602,9622=>602,9623=>602,9624=>602,9625=>602,9626=>602,9627=>602,9628=>602,9629=>602,9630=>602,9631=>602,9632=>602,9633=>602,9634=>602,9635=>602,9636=>602,9637=>602,9638=>602,9639=>602,9640=>602,9641=>602,9642=>602,9643=>602,9644=>602,9645=>602,9646=>602,9647=>602,9648=>602,9649=>602,9650=>602,9651=>602,9652=>602,9653=>602,9654=>602,9655=>602,9656=>602,9657=>602,9658=>602,9659=>602,9660=>602,9661=>602,9662=>602,9663=>602,9664=>602,9665=>602,9666=>602,9667=>602,9668=>602,9669=>602,9670=>602,9671=>602,9672=>602,9673=>602,9674=>602,9675=>602,9676=>602,9677=>602,9678=>602,9679=>602,9680=>602,9681=>602,9682=>602,9683=>602,9684=>602,9685=>602,9686=>602,9687=>602,9688=>602,9689=>602,9690=>602,9691=>602,9692=>602,9693=>602,9694=>602,9695=>602,9696=>602,9697=>602,9698=>602,9699=>602,9700=>602,9701=>602,9702=>602,9703=>602,9704=>602,9705=>602,9706=>602,9707=>602,9708=>602,9709=>602,9710=>602,9711=>602,9712=>602,9713=>602,9714=>602,9715=>602,9716=>602,9717=>602,9718=>602,9719=>602,9720=>602,9721=>602,9722=>602,9723=>602,9724=>602,9725=>602,9726=>602,9727=>602,9728=>602,9784=>602,9785=>602,9786=>602,9787=>602,9788=>602,9791=>602,9792=>602,9793=>602,9794=>602,9795=>602,9796=>602,9797=>602,9798=>602,9799=>602,9824=>602,9825=>602,9826=>602,9827=>602,9828=>602,9829=>602,9830=>602,9831=>602,9833=>602,9834=>602,9835=>602,9836=>602,9837=>602,9838=>602,9839=>602,10181=>602,10182=>602,10208=>602,10216=>602,10217=>602,10731=>602,10746=>602,10747=>602,10799=>602,11026=>602,11027=>602,11028=>602,11029=>602,11030=>602,11031=>602,11032=>602,11033=>602,11034=>602,11364=>602,11373=>602,11374=>602,11375=>602,11376=>602,11381=>602,11382=>602,11383=>602,11385=>602,11386=>602,11388=>602,11389=>602,11390=>602,11391=>602,11800=>602,11810=>602,11811=>602,11812=>602,11813=>602,11822=>602,42760=>602,42761=>602,42762=>602,42763=>602,42764=>602,42765=>602,42766=>602,42767=>602,42768=>602,42769=>602,42770=>602,42771=>602,42772=>602,42773=>602,42774=>602,42779=>602,42780=>602,42781=>602,42782=>602,42783=>602,42786=>602,42787=>602,42788=>602,42789=>602,42790=>602,42791=>602,42889=>602,42890=>602,42891=>602,42892=>602,42893=>602,42894=>602,42896=>602,42897=>602,63173=>602,64257=>602,64258=>602,65529=>602,65530=>602,65531=>602,65532=>602,65533=>602,65535=>602);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonobi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonobi.z
new file mode 100644
index 00000000..5d9926d4
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonobi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonoi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonoi.ctg.z
new file mode 100644
index 00000000..6a902498
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonoi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonoi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonoi.php
new file mode 100644
index 00000000..5dd8c55d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonoi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSansMono-Oblique';
+$up=-63;
+$ut=44;
+$dw=602;
+$diff='';
+$originalsize=241972;
+$enc='';
+$file='dejavusansmonoi.z';
+$ctg='dejavusansmonoi.ctg.z';
+$desc=array('Flags'=>97,'FontBBox'=>'[-403 -375 746 1028]','ItalicAngle'=>-11,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>547,'StemV'=>34,'StemH'=>15,'AvgWidth'=>602,'MaxWidth'=>602,'MissingWidth'=>602);
+$cw=array(0=>602,32=>602,33=>602,34=>602,35=>602,36=>602,37=>602,38=>602,39=>602,40=>602,41=>602,42=>602,43=>602,44=>602,45=>602,46=>602,47=>602,48=>602,49=>602,50=>602,51=>602,52=>602,53=>602,54=>602,55=>602,56=>602,57=>602,58=>602,59=>602,60=>602,61=>602,62=>602,63=>602,64=>602,65=>602,66=>602,67=>602,68=>602,69=>602,70=>602,71=>602,72=>602,73=>602,74=>602,75=>602,76=>602,77=>602,78=>602,79=>602,80=>602,81=>602,82=>602,83=>602,84=>602,85=>602,86=>602,87=>602,88=>602,89=>602,90=>602,91=>602,92=>602,93=>602,94=>602,95=>602,96=>602,97=>602,98=>602,99=>602,100=>602,101=>602,102=>602,103=>602,104=>602,105=>602,106=>602,107=>602,108=>602,109=>602,110=>602,111=>602,112=>602,113=>602,114=>602,115=>602,116=>602,117=>602,118=>602,119=>602,120=>602,121=>602,122=>602,123=>602,124=>602,125=>602,126=>602,160=>602,161=>602,162=>602,163=>602,164=>602,165=>602,166=>602,167=>602,168=>602,169=>602,170=>602,171=>602,172=>602,173=>602,174=>602,175=>602,176=>602,177=>602,178=>602,179=>602,180=>602,181=>602,182=>602,183=>602,184=>602,185=>602,186=>602,187=>602,188=>602,189=>602,190=>602,191=>602,192=>602,193=>602,194=>602,195=>602,196=>602,197=>602,198=>602,199=>602,200=>602,201=>602,202=>602,203=>602,204=>602,205=>602,206=>602,207=>602,208=>602,209=>602,210=>602,211=>602,212=>602,213=>602,214=>602,215=>602,216=>602,217=>602,218=>602,219=>602,220=>602,221=>602,222=>602,223=>602,224=>602,225=>602,226=>602,227=>602,228=>602,229=>602,230=>602,231=>602,232=>602,233=>602,234=>602,235=>602,236=>602,237=>602,238=>602,239=>602,240=>602,241=>602,242=>602,243=>602,244=>602,245=>602,246=>602,247=>602,248=>602,249=>602,250=>602,251=>602,252=>602,253=>602,254=>602,255=>602,256=>602,257=>602,258=>602,259=>602,260=>602,261=>602,262=>602,263=>602,264=>602,265=>602,266=>602,267=>602,268=>602,269=>602,270=>602,271=>602,272=>602,273=>602,274=>602,275=>602,276=>602,277=>602,278=>602,279=>602,280=>602,281=>602,282=>602,283=>602,284=>602,285=>602,286=>602,287=>602,288=>602,289=>602,290=>602,291=>602,292=>602,293=>602,294=>602,295=>602,296=>602,297=>602,298=>602,299=>602,300=>602,301=>602,302=>602,303=>602,304=>602,305=>602,306=>602,307=>602,308=>602,309=>602,310=>602,311=>602,312=>602,313=>602,314=>602,315=>602,316=>602,317=>602,318=>602,319=>602,320=>602,321=>602,322=>602,323=>602,324=>602,325=>602,326=>602,327=>602,328=>602,329=>602,330=>602,331=>602,332=>602,333=>602,334=>602,335=>602,336=>602,337=>602,338=>602,339=>602,340=>602,341=>602,342=>602,343=>602,344=>602,345=>602,346=>602,347=>602,348=>602,349=>602,350=>602,351=>602,352=>602,353=>602,354=>602,355=>602,356=>602,357=>602,358=>602,359=>602,360=>602,361=>602,362=>602,363=>602,364=>602,365=>602,366=>602,367=>602,368=>602,369=>602,370=>602,371=>602,372=>602,373=>602,374=>602,375=>602,376=>602,377=>602,378=>602,379=>602,380=>602,381=>602,382=>602,383=>602,384=>602,385=>602,386=>602,387=>602,388=>602,389=>602,390=>602,391=>602,392=>602,393=>602,394=>602,395=>602,396=>602,397=>602,398=>602,399=>602,400=>602,401=>602,402=>602,403=>602,404=>602,405=>602,406=>602,407=>602,408=>602,409=>602,410=>602,411=>602,412=>602,413=>602,414=>602,415=>602,416=>602,417=>602,418=>602,419=>602,420=>602,421=>602,422=>602,423=>602,424=>602,425=>602,426=>602,427=>602,428=>602,429=>602,430=>602,431=>602,432=>602,433=>602,434=>602,435=>602,436=>602,437=>602,438=>602,439=>602,440=>602,441=>602,442=>602,443=>602,444=>602,445=>602,446=>602,447=>602,448=>602,449=>602,450=>602,451=>602,461=>602,462=>602,463=>602,464=>602,465=>602,466=>602,467=>602,468=>602,469=>602,470=>602,471=>602,472=>602,473=>602,474=>602,475=>602,476=>602,477=>602,479=>602,480=>602,481=>602,482=>602,483=>602,486=>602,487=>602,488=>602,489=>602,490=>602,491=>602,492=>602,493=>602,494=>602,495=>602,500=>602,501=>602,502=>602,504=>602,505=>602,508=>602,509=>602,510=>602,511=>602,512=>602,513=>602,514=>602,515=>602,516=>602,517=>602,518=>602,519=>602,520=>602,521=>602,522=>602,523=>602,524=>602,525=>602,526=>602,527=>602,528=>602,529=>602,530=>602,531=>602,532=>602,533=>602,534=>602,535=>602,536=>602,537=>602,538=>602,539=>602,540=>602,541=>602,542=>602,543=>602,545=>602,548=>602,549=>602,550=>602,551=>602,552=>602,553=>602,554=>602,555=>602,556=>602,557=>602,558=>602,559=>602,560=>602,561=>602,562=>602,563=>602,564=>602,565=>602,566=>602,567=>602,568=>602,569=>602,570=>602,571=>602,572=>602,573=>602,574=>602,575=>602,576=>602,577=>602,579=>602,580=>602,581=>602,588=>602,589=>602,592=>602,593=>602,594=>602,595=>602,596=>602,597=>602,598=>602,599=>602,600=>602,601=>602,602=>602,603=>602,604=>602,605=>602,606=>602,607=>602,608=>602,609=>602,610=>602,611=>602,612=>602,613=>602,614=>602,615=>602,616=>602,617=>602,618=>602,619=>602,620=>602,621=>602,622=>602,623=>602,624=>602,625=>602,626=>602,627=>602,628=>602,629=>602,630=>602,631=>602,632=>602,633=>602,634=>602,635=>602,636=>602,637=>602,638=>602,639=>602,640=>602,641=>602,642=>602,643=>602,644=>602,645=>602,646=>602,647=>602,648=>602,649=>602,650=>602,651=>602,652=>602,653=>602,654=>602,655=>602,656=>602,657=>602,658=>602,659=>602,660=>602,661=>602,662=>602,663=>602,664=>602,665=>602,666=>602,667=>602,668=>602,669=>602,670=>602,671=>602,672=>602,673=>602,674=>602,675=>602,676=>602,677=>602,678=>602,679=>602,680=>602,681=>602,682=>602,683=>602,684=>602,685=>602,686=>602,687=>602,688=>602,689=>602,690=>602,691=>602,692=>602,693=>602,694=>602,695=>602,696=>602,697=>602,699=>602,700=>602,701=>602,702=>602,703=>602,704=>602,705=>602,710=>602,711=>602,712=>602,713=>602,716=>602,717=>602,720=>602,721=>602,722=>602,723=>602,726=>602,727=>602,728=>602,729=>602,730=>602,731=>602,732=>602,733=>602,734=>602,736=>602,737=>602,738=>602,739=>602,740=>602,741=>602,742=>602,743=>602,744=>602,745=>602,750=>602,755=>602,768=>602,769=>602,770=>602,771=>602,772=>602,773=>602,774=>602,775=>602,776=>602,777=>602,778=>602,779=>602,780=>602,781=>602,782=>602,783=>602,784=>602,785=>602,786=>602,787=>602,788=>602,789=>602,790=>602,791=>602,792=>602,793=>602,794=>602,795=>602,796=>602,797=>602,798=>602,799=>602,800=>602,801=>602,802=>602,803=>602,804=>602,805=>602,806=>602,807=>602,808=>602,809=>602,810=>602,811=>602,812=>602,813=>602,814=>602,815=>602,816=>602,817=>602,818=>602,819=>602,820=>602,821=>602,822=>602,823=>602,824=>602,825=>602,826=>602,827=>602,828=>602,829=>602,830=>602,831=>602,835=>602,856=>602,865=>602,884=>602,885=>602,890=>602,894=>602,900=>602,901=>602,902=>602,903=>602,904=>602,905=>602,906=>602,908=>602,910=>602,911=>602,912=>602,913=>602,914=>602,915=>602,916=>602,917=>602,918=>602,919=>602,920=>602,921=>602,922=>602,923=>602,924=>602,925=>602,926=>602,927=>602,928=>602,929=>602,931=>602,932=>602,933=>602,934=>602,935=>602,936=>602,937=>602,938=>602,939=>602,940=>602,941=>602,942=>602,943=>602,944=>602,945=>602,946=>602,947=>602,948=>602,949=>602,950=>602,951=>602,952=>602,953=>602,954=>602,955=>602,956=>602,957=>602,958=>602,959=>602,960=>602,961=>602,962=>602,963=>602,964=>602,965=>602,966=>602,967=>602,968=>602,969=>602,970=>602,971=>602,972=>602,973=>602,974=>602,976=>602,977=>602,978=>602,979=>602,980=>602,981=>602,982=>602,983=>602,984=>602,985=>602,986=>602,987=>602,988=>602,989=>602,990=>602,991=>602,992=>602,993=>602,1008=>602,1009=>602,1010=>602,1011=>602,1012=>602,1013=>602,1014=>602,1015=>602,1016=>602,1017=>602,1018=>602,1019=>602,1020=>602,1021=>602,1022=>602,1023=>602,1024=>602,1025=>602,1026=>602,1027=>602,1028=>602,1029=>602,1030=>602,1031=>602,1032=>602,1033=>602,1034=>602,1035=>602,1036=>602,1037=>602,1038=>602,1039=>602,1040=>602,1041=>602,1042=>602,1043=>602,1044=>602,1045=>602,1046=>602,1047=>602,1048=>602,1049=>602,1050=>602,1051=>602,1052=>602,1053=>602,1054=>602,1055=>602,1056=>602,1057=>602,1058=>602,1059=>602,1060=>602,1061=>602,1062=>602,1063=>602,1064=>602,1065=>602,1066=>602,1067=>602,1068=>602,1069=>602,1070=>602,1071=>602,1072=>602,1073=>602,1074=>602,1075=>602,1076=>602,1077=>602,1078=>602,1079=>602,1080=>602,1081=>602,1082=>602,1083=>602,1084=>602,1085=>602,1086=>602,1087=>602,1088=>602,1089=>602,1090=>602,1091=>602,1092=>602,1093=>602,1094=>602,1095=>602,1096=>602,1097=>602,1098=>602,1099=>602,1100=>602,1101=>602,1102=>602,1103=>602,1104=>602,1105=>602,1106=>602,1107=>602,1108=>602,1109=>602,1110=>602,1111=>602,1112=>602,1113=>602,1114=>602,1115=>602,1116=>602,1117=>602,1118=>602,1119=>602,1122=>602,1123=>602,1138=>602,1139=>602,1168=>602,1169=>602,1170=>602,1171=>602,1172=>602,1173=>602,1174=>602,1175=>602,1176=>602,1177=>602,1178=>602,1179=>602,1186=>602,1187=>602,1188=>602,1189=>602,1194=>602,1195=>602,1196=>602,1197=>602,1198=>602,1199=>602,1200=>602,1201=>602,1202=>602,1203=>602,1210=>602,1211=>602,1216=>602,1217=>602,1218=>602,1219=>602,1220=>602,1223=>602,1224=>602,1227=>602,1228=>602,1231=>602,1232=>602,1233=>602,1234=>602,1235=>602,1236=>602,1237=>602,1238=>602,1239=>602,1240=>602,1241=>602,1242=>602,1243=>602,1244=>602,1245=>602,1246=>602,1247=>602,1248=>602,1249=>602,1250=>602,1251=>602,1252=>602,1253=>602,1254=>602,1255=>602,1256=>602,1257=>602,1258=>602,1259=>602,1260=>602,1261=>602,1262=>602,1263=>602,1264=>602,1265=>602,1266=>602,1267=>602,1268=>602,1269=>602,1270=>602,1271=>602,1272=>602,1273=>602,1296=>602,1297=>602,1306=>602,1307=>602,1308=>602,1309=>602,1329=>602,1330=>602,1331=>602,1332=>602,1333=>602,1334=>602,1335=>602,1336=>602,1337=>602,1338=>602,1339=>602,1340=>602,1341=>602,1342=>602,1343=>602,1344=>602,1345=>602,1346=>602,1347=>602,1348=>602,1349=>602,1350=>602,1351=>602,1352=>602,1353=>602,1354=>602,1355=>602,1356=>602,1357=>602,1358=>602,1359=>602,1360=>602,1361=>602,1362=>602,1363=>602,1364=>602,1365=>602,1366=>602,1369=>602,1370=>602,1371=>602,1372=>602,1373=>602,1374=>602,1375=>602,1377=>602,1378=>602,1379=>602,1380=>602,1381=>602,1382=>602,1383=>602,1384=>602,1385=>602,1386=>602,1387=>602,1388=>602,1389=>602,1390=>602,1391=>602,1392=>602,1393=>602,1394=>602,1395=>602,1396=>602,1397=>602,1398=>602,1399=>602,1400=>602,1401=>602,1402=>602,1403=>602,1404=>602,1405=>602,1406=>602,1407=>602,1408=>602,1409=>602,1410=>602,1411=>602,1412=>602,1413=>602,1414=>602,1415=>602,1417=>602,1418=>602,3713=>602,3714=>602,3716=>602,3719=>602,3720=>602,3722=>602,3725=>602,3732=>602,3733=>602,3734=>602,3735=>602,3737=>602,3738=>602,3739=>602,3740=>602,3741=>602,3742=>602,3743=>602,3745=>602,3746=>602,3747=>602,3749=>602,3751=>602,3754=>602,3755=>602,3757=>602,3758=>602,3759=>602,3760=>602,3761=>602,3762=>602,3763=>602,3764=>602,3765=>602,3766=>602,3767=>602,3768=>602,3769=>602,3771=>602,3772=>602,3784=>602,3785=>602,3786=>602,3787=>602,3788=>602,3789=>602,4304=>602,4305=>602,4306=>602,4307=>602,4308=>602,4309=>602,4310=>602,4311=>602,4312=>602,4313=>602,4314=>602,4315=>602,4316=>602,4317=>602,4318=>602,4319=>602,4320=>602,4321=>602,4322=>602,4323=>602,4324=>602,4325=>602,4326=>602,4327=>602,4328=>602,4329=>602,4330=>602,4331=>602,4332=>602,4333=>602,4334=>602,4335=>602,4336=>602,4337=>602,4338=>602,4339=>602,4340=>602,4341=>602,4342=>602,4343=>602,4344=>602,4345=>602,4346=>602,4347=>602,4348=>602,7426=>602,7432=>602,7433=>602,7444=>602,7446=>602,7447=>602,7453=>602,7454=>602,7455=>602,7468=>602,7469=>602,7470=>602,7472=>602,7473=>602,7474=>602,7475=>602,7476=>602,7477=>602,7478=>602,7479=>602,7480=>602,7481=>602,7482=>602,7483=>602,7484=>602,7485=>602,7486=>602,7487=>602,7488=>602,7489=>602,7490=>602,7491=>602,7492=>602,7493=>602,7494=>602,7495=>602,7496=>602,7497=>602,7498=>602,7499=>602,7500=>602,7501=>602,7502=>602,7503=>602,7504=>602,7505=>602,7506=>602,7507=>602,7508=>602,7509=>602,7510=>602,7511=>602,7512=>602,7513=>602,7514=>602,7515=>602,7522=>602,7523=>602,7524=>602,7525=>602,7543=>602,7544=>602,7547=>602,7557=>602,7579=>602,7580=>602,7581=>602,7582=>602,7583=>602,7584=>602,7585=>602,7586=>602,7587=>602,7588=>602,7589=>602,7590=>602,7591=>602,7592=>602,7593=>602,7594=>602,7595=>602,7596=>602,7597=>602,7598=>602,7599=>602,7600=>602,7601=>602,7602=>602,7603=>602,7604=>602,7605=>602,7606=>602,7607=>602,7609=>602,7610=>602,7611=>602,7612=>602,7613=>602,7614=>602,7615=>602,7680=>602,7681=>602,7682=>602,7683=>602,7684=>602,7685=>602,7686=>602,7687=>602,7688=>602,7689=>602,7690=>602,7691=>602,7692=>602,7693=>602,7694=>602,7695=>602,7696=>602,7697=>602,7698=>602,7699=>602,7704=>602,7705=>602,7706=>602,7707=>602,7708=>602,7709=>602,7710=>602,7711=>602,7712=>602,7713=>602,7714=>602,7715=>602,7716=>602,7717=>602,7718=>602,7719=>602,7720=>602,7721=>602,7722=>602,7723=>602,7724=>602,7725=>602,7728=>602,7729=>602,7730=>602,7731=>602,7732=>602,7733=>602,7734=>602,7735=>602,7736=>602,7737=>602,7738=>602,7739=>602,7740=>602,7741=>602,7742=>602,7743=>602,7744=>602,7745=>602,7746=>602,7747=>602,7748=>602,7749=>602,7750=>602,7751=>602,7752=>602,7753=>602,7754=>602,7755=>602,7756=>602,7757=>602,7764=>602,7765=>602,7766=>602,7767=>602,7768=>602,7769=>602,7770=>602,7771=>602,7772=>602,7773=>602,7774=>602,7775=>602,7776=>602,7777=>602,7778=>602,7779=>602,7784=>602,7785=>602,7786=>602,7787=>602,7788=>602,7789=>602,7790=>602,7791=>602,7792=>602,7793=>602,7794=>602,7795=>602,7796=>602,7797=>602,7798=>602,7799=>602,7800=>602,7801=>602,7804=>602,7805=>602,7806=>602,7807=>602,7808=>602,7809=>602,7810=>602,7811=>602,7812=>602,7813=>602,7814=>602,7815=>602,7816=>602,7817=>602,7818=>602,7819=>602,7820=>602,7821=>602,7822=>602,7823=>602,7824=>602,7825=>602,7826=>602,7827=>602,7828=>602,7829=>602,7830=>602,7831=>602,7832=>602,7833=>602,7835=>602,7839=>602,7840=>602,7841=>602,7852=>602,7853=>602,7856=>602,7857=>602,7862=>602,7863=>602,7864=>602,7865=>602,7868=>602,7869=>602,7878=>602,7879=>602,7882=>602,7883=>602,7884=>602,7885=>602,7896=>602,7897=>602,7898=>602,7899=>602,7900=>602,7901=>602,7904=>602,7905=>602,7906=>602,7907=>602,7908=>602,7909=>602,7912=>602,7913=>602,7914=>602,7915=>602,7918=>602,7919=>602,7920=>602,7921=>602,7922=>602,7923=>602,7924=>602,7925=>602,7928=>602,7929=>602,7936=>602,7937=>602,7938=>602,7939=>602,7940=>602,7941=>602,7942=>602,7943=>602,7944=>602,7945=>602,7946=>602,7947=>602,7948=>602,7949=>602,7950=>602,7951=>602,7952=>602,7953=>602,7954=>602,7955=>602,7956=>602,7957=>602,7960=>602,7961=>602,7962=>602,7963=>602,7964=>602,7965=>602,7968=>602,7969=>602,7970=>602,7971=>602,7972=>602,7973=>602,7974=>602,7975=>602,7976=>602,7977=>602,7978=>602,7979=>602,7980=>602,7981=>602,7982=>602,7983=>602,7984=>602,7985=>602,7986=>602,7987=>602,7988=>602,7989=>602,7990=>602,7991=>602,7992=>602,7993=>602,7994=>602,7995=>602,7996=>602,7997=>602,7998=>602,7999=>602,8000=>602,8001=>602,8002=>602,8003=>602,8004=>602,8005=>602,8008=>602,8009=>602,8010=>602,8011=>602,8012=>602,8013=>602,8016=>602,8017=>602,8018=>602,8019=>602,8020=>602,8021=>602,8022=>602,8023=>602,8025=>602,8027=>602,8029=>602,8031=>602,8032=>602,8033=>602,8034=>602,8035=>602,8036=>602,8037=>602,8038=>602,8039=>602,8040=>602,8041=>602,8042=>602,8043=>602,8044=>602,8045=>602,8046=>602,8047=>602,8048=>602,8049=>602,8050=>602,8051=>602,8052=>602,8053=>602,8054=>602,8055=>602,8056=>602,8057=>602,8058=>602,8059=>602,8060=>602,8061=>602,8064=>602,8065=>602,8066=>602,8067=>602,8068=>602,8069=>602,8070=>602,8071=>602,8072=>602,8073=>602,8074=>602,8075=>602,8076=>602,8077=>602,8078=>602,8079=>602,8080=>602,8081=>602,8082=>602,8083=>602,8084=>602,8085=>602,8086=>602,8087=>602,8088=>602,8089=>602,8090=>602,8091=>602,8092=>602,8093=>602,8094=>602,8095=>602,8096=>602,8097=>602,8098=>602,8099=>602,8100=>602,8101=>602,8102=>602,8103=>602,8104=>602,8105=>602,8106=>602,8107=>602,8108=>602,8109=>602,8110=>602,8111=>602,8112=>602,8113=>602,8114=>602,8115=>602,8116=>602,8118=>602,8119=>602,8120=>602,8121=>602,8122=>602,8123=>602,8124=>602,8125=>602,8126=>602,8127=>602,8128=>602,8129=>602,8130=>602,8131=>602,8132=>602,8134=>602,8135=>602,8136=>602,8137=>602,8138=>602,8139=>602,8140=>602,8141=>602,8142=>602,8143=>602,8144=>602,8145=>602,8146=>602,8147=>602,8150=>602,8151=>602,8152=>602,8153=>602,8154=>602,8155=>602,8157=>602,8158=>602,8159=>602,8160=>602,8161=>602,8162=>602,8163=>602,8164=>602,8165=>602,8166=>602,8167=>602,8168=>602,8169=>602,8170=>602,8171=>602,8172=>602,8173=>602,8174=>602,8175=>602,8178=>602,8179=>602,8180=>602,8182=>602,8183=>602,8184=>602,8185=>602,8186=>602,8187=>602,8188=>602,8189=>602,8190=>602,8192=>602,8193=>602,8194=>602,8195=>602,8196=>602,8197=>602,8198=>602,8199=>602,8200=>602,8201=>602,8202=>602,8208=>602,8209=>602,8210=>602,8211=>602,8212=>602,8213=>602,8215=>602,8216=>602,8217=>602,8218=>602,8219=>602,8220=>602,8221=>602,8222=>602,8223=>602,8224=>602,8225=>602,8226=>602,8227=>602,8230=>602,8239=>602,8240=>602,8241=>602,8242=>602,8243=>602,8244=>602,8245=>602,8246=>602,8247=>602,8249=>602,8250=>602,8252=>602,8253=>602,8254=>602,8261=>602,8262=>602,8263=>602,8264=>602,8265=>602,8267=>602,8287=>602,8304=>602,8305=>602,8308=>602,8309=>602,8310=>602,8311=>602,8312=>602,8313=>602,8314=>602,8315=>602,8316=>602,8317=>602,8318=>602,8319=>602,8320=>602,8321=>602,8322=>602,8323=>602,8324=>602,8325=>602,8326=>602,8327=>602,8328=>602,8329=>602,8330=>602,8331=>602,8332=>602,8333=>602,8334=>602,8336=>602,8337=>602,8338=>602,8339=>602,8340=>602,8341=>602,8342=>602,8343=>602,8344=>602,8345=>602,8346=>602,8347=>602,8348=>602,8352=>602,8353=>602,8354=>602,8355=>602,8356=>602,8357=>602,8358=>602,8359=>602,8360=>602,8361=>602,8362=>602,8363=>602,8364=>602,8365=>602,8366=>602,8367=>602,8368=>602,8369=>602,8370=>602,8371=>602,8372=>602,8373=>602,8376=>602,8377=>602,8450=>602,8453=>602,8461=>602,8462=>602,8463=>602,8469=>602,8470=>602,8471=>602,8473=>602,8474=>602,8477=>602,8482=>602,8484=>602,8486=>602,8490=>602,8491=>602,8494=>602,8531=>602,8532=>602,8533=>602,8534=>602,8535=>602,8536=>602,8537=>602,8538=>602,8539=>602,8540=>602,8541=>602,8542=>602,8543=>602,8592=>602,8593=>602,8594=>602,8595=>602,8596=>602,8597=>602,8598=>602,8599=>602,8600=>602,8601=>602,8602=>602,8603=>602,8604=>602,8605=>602,8606=>602,8607=>602,8608=>602,8609=>602,8610=>602,8611=>602,8612=>602,8613=>602,8614=>602,8615=>602,8616=>602,8617=>602,8618=>602,8619=>602,8620=>602,8621=>602,8622=>602,8623=>602,8624=>602,8625=>602,8626=>602,8627=>602,8628=>602,8629=>602,8630=>602,8631=>602,8632=>602,8633=>602,8634=>602,8635=>602,8636=>602,8637=>602,8638=>602,8639=>602,8640=>602,8641=>602,8642=>602,8643=>602,8644=>602,8645=>602,8646=>602,8647=>602,8648=>602,8649=>602,8650=>602,8651=>602,8652=>602,8653=>602,8654=>602,8655=>602,8656=>602,8657=>602,8658=>602,8659=>602,8660=>602,8661=>602,8662=>602,8663=>602,8664=>602,8665=>602,8666=>602,8667=>602,8668=>602,8669=>602,8670=>602,8671=>602,8672=>602,8673=>602,8674=>602,8675=>602,8676=>602,8677=>602,8678=>602,8679=>602,8680=>602,8681=>602,8682=>602,8683=>602,8684=>602,8685=>602,8686=>602,8687=>602,8688=>602,8689=>602,8690=>602,8691=>602,8692=>602,8693=>602,8694=>602,8695=>602,8696=>602,8697=>602,8698=>602,8699=>602,8700=>602,8701=>602,8702=>602,8703=>602,8704=>602,8705=>602,8706=>602,8707=>602,8708=>602,8709=>602,8710=>602,8711=>602,8712=>602,8713=>602,8714=>602,8715=>602,8716=>602,8717=>602,8719=>602,8721=>602,8722=>602,8723=>602,8725=>602,8727=>602,8728=>602,8729=>602,8730=>602,8731=>602,8732=>602,8733=>602,8734=>602,8735=>602,8736=>602,8743=>602,8744=>602,8745=>602,8746=>602,8747=>602,8748=>602,8749=>602,8756=>602,8757=>602,8758=>602,8759=>602,8760=>602,8761=>602,8762=>602,8763=>602,8764=>602,8765=>602,8769=>602,8770=>602,8771=>602,8772=>602,8773=>602,8774=>602,8775=>602,8776=>602,8777=>602,8778=>602,8779=>602,8780=>602,8781=>602,8782=>602,8783=>602,8784=>602,8785=>602,8786=>602,8787=>602,8788=>602,8789=>602,8790=>602,8791=>602,8792=>602,8793=>602,8794=>602,8795=>602,8796=>602,8797=>602,8798=>602,8799=>602,8800=>602,8801=>602,8802=>602,8803=>602,8804=>602,8805=>602,8806=>602,8807=>602,8808=>602,8809=>602,8813=>602,8814=>602,8815=>602,8816=>602,8817=>602,8818=>602,8819=>602,8820=>602,8821=>602,8822=>602,8823=>602,8824=>602,8825=>602,8826=>602,8827=>602,8828=>602,8829=>602,8830=>602,8831=>602,8832=>602,8833=>602,8834=>602,8835=>602,8836=>602,8837=>602,8838=>602,8839=>602,8840=>602,8841=>602,8842=>602,8843=>602,8847=>602,8848=>602,8849=>602,8850=>602,8853=>602,8854=>602,8855=>602,8856=>602,8857=>602,8858=>602,8859=>602,8860=>602,8861=>602,8862=>602,8863=>602,8864=>602,8865=>602,8866=>602,8867=>602,8868=>602,8869=>602,8901=>602,8902=>602,8909=>602,8922=>602,8923=>602,8924=>602,8925=>602,8926=>602,8927=>602,8928=>602,8929=>602,8930=>602,8931=>602,8932=>602,8933=>602,8934=>602,8935=>602,8936=>602,8937=>602,8943=>602,8960=>602,8961=>602,8962=>602,8963=>602,8964=>602,8965=>602,8966=>602,8968=>602,8969=>602,8970=>602,8971=>602,8972=>602,8973=>602,8974=>602,8975=>602,8976=>602,8977=>602,8978=>602,8979=>602,8980=>602,8981=>602,8984=>602,8985=>602,8988=>602,8989=>602,8990=>602,8991=>602,8992=>602,8993=>602,8997=>602,8998=>602,8999=>602,9000=>602,9003=>602,9013=>602,9015=>602,9016=>602,9017=>602,9018=>602,9019=>602,9020=>602,9021=>602,9022=>602,9025=>602,9026=>602,9027=>602,9028=>602,9031=>602,9032=>602,9033=>602,9035=>602,9036=>602,9037=>602,9040=>602,9042=>602,9043=>602,9044=>602,9047=>602,9048=>602,9049=>602,9050=>602,9051=>602,9052=>602,9054=>602,9055=>602,9056=>602,9059=>602,9060=>602,9061=>602,9064=>602,9065=>602,9067=>602,9068=>602,9069=>602,9070=>602,9071=>602,9072=>602,9075=>602,9076=>602,9077=>602,9078=>602,9079=>602,9080=>602,9081=>602,9082=>602,9085=>602,9088=>602,9089=>602,9090=>602,9091=>602,9096=>602,9097=>602,9098=>602,9099=>602,9109=>602,9115=>602,9116=>602,9117=>602,9118=>602,9119=>602,9120=>602,9121=>602,9122=>602,9123=>602,9124=>602,9125=>602,9126=>602,9127=>602,9128=>602,9129=>602,9130=>602,9131=>602,9132=>602,9133=>602,9134=>602,9166=>602,9167=>602,9251=>602,9472=>602,9473=>602,9474=>602,9475=>602,9476=>602,9477=>602,9478=>602,9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602,9486=>602,9487=>602,9488=>602,9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602,9496=>602,9497=>602,9498=>602,9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602,9506=>602,9507=>602,9508=>602,9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602,9516=>602,9517=>602,9518=>602,9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602,9526=>602,9527=>602,9528=>602,9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602,9536=>602,9537=>602,9538=>602,9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602,9546=>602,9547=>602,9548=>602,9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602,9556=>602,9557=>602,9558=>602,9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602,9566=>602,9567=>602,9568=>602,9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602,9576=>602,9577=>602,9578=>602,9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602,9586=>602,9587=>602,9588=>602,9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602,9596=>602,9597=>602,9598=>602,9599=>602,9600=>602,9601=>602,9602=>602,9603=>602,9604=>602,9605=>602,9606=>602,9607=>602,9608=>602,9609=>602,9610=>602,9611=>602,9612=>602,9613=>602,9614=>602,9615=>602,9616=>602,9617=>602,9618=>602,9619=>602,9620=>602,9621=>602,9622=>602,9623=>602,9624=>602,9625=>602,9626=>602,9627=>602,9628=>602,9629=>602,9630=>602,9631=>602,9632=>602,9633=>602,9634=>602,9635=>602,9636=>602,9637=>602,9638=>602,9639=>602,9640=>602,9641=>602,9642=>602,9643=>602,9644=>602,9645=>602,9646=>602,9647=>602,9648=>602,9649=>602,9650=>602,9651=>602,9652=>602,9653=>602,9654=>602,9655=>602,9656=>602,9657=>602,9658=>602,9659=>602,9660=>602,9661=>602,9662=>602,9663=>602,9664=>602,9665=>602,9666=>602,9667=>602,9668=>602,9669=>602,9670=>602,9671=>602,9672=>602,9673=>602,9674=>602,9675=>602,9676=>602,9677=>602,9678=>602,9679=>602,9680=>602,9681=>602,9682=>602,9683=>602,9684=>602,9685=>602,9686=>602,9687=>602,9688=>602,9689=>602,9690=>602,9691=>602,9692=>602,9693=>602,9694=>602,9695=>602,9696=>602,9697=>602,9698=>602,9699=>602,9700=>602,9701=>602,9702=>602,9703=>602,9704=>602,9705=>602,9706=>602,9707=>602,9708=>602,9709=>602,9710=>602,9711=>602,9712=>602,9713=>602,9714=>602,9715=>602,9716=>602,9717=>602,9718=>602,9719=>602,9720=>602,9721=>602,9722=>602,9723=>602,9724=>602,9725=>602,9726=>602,9727=>602,9728=>602,9784=>602,9785=>602,9786=>602,9787=>602,9788=>602,9791=>602,9792=>602,9793=>602,9794=>602,9795=>602,9796=>602,9797=>602,9798=>602,9799=>602,9824=>602,9825=>602,9826=>602,9827=>602,9828=>602,9829=>602,9830=>602,9831=>602,9833=>602,9834=>602,9835=>602,9836=>602,9837=>602,9838=>602,9839=>602,10181=>602,10182=>602,10208=>602,10216=>602,10217=>602,10731=>602,10746=>602,10747=>602,10799=>602,11026=>602,11027=>602,11028=>602,11029=>602,11030=>602,11031=>602,11032=>602,11033=>602,11034=>602,11364=>602,11373=>602,11374=>602,11375=>602,11376=>602,11381=>602,11382=>602,11383=>602,11385=>602,11386=>602,11388=>602,11389=>602,11390=>602,11391=>602,11800=>602,11810=>602,11811=>602,11812=>602,11813=>602,11822=>602,42760=>602,42761=>602,42762=>602,42763=>602,42764=>602,42765=>602,42766=>602,42767=>602,42768=>602,42769=>602,42770=>602,42771=>602,42772=>602,42773=>602,42774=>602,42779=>602,42780=>602,42781=>602,42782=>602,42783=>602,42786=>602,42787=>602,42788=>602,42789=>602,42790=>602,42791=>602,42889=>602,42890=>602,42891=>602,42892=>602,42893=>602,42894=>602,42896=>602,42897=>602,63173=>602,64257=>602,64258=>602,65529=>602,65530=>602,65531=>602,65532=>602,65533=>602,65535=>602);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonoi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonoi.z
new file mode 100644
index 00000000..73a64f4c
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavusansmonoi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserif.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserif.ctg.z
new file mode 100644
index 00000000..39f79943
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserif.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserif.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserif.php
new file mode 100644
index 00000000..16873492
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserif.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSerif';
+$up=-63;
+$ut=44;
+$dw=600;
+$diff='';
+$originalsize=363200;
+$enc='';
+$file='dejavuserif.z';
+$ctg='dejavuserif.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-770 -347 1679 1109]','ItalicAngle'=>0,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>519,'StemV'=>34,'StemH'=>15,'AvgWidth'=>513,'MaxWidth'=>1734,'MissingWidth'=>600);
+$cw=array(0=>600,32=>318,33=>402,34=>460,35=>838,36=>636,37=>950,38=>890,39=>275,40=>390,41=>390,42=>500,43=>838,44=>318,45=>338,46=>318,47=>337,48=>636,49=>636,50=>636,51=>636,52=>636,53=>636,54=>636,55=>636,56=>636,57=>636,58=>337,59=>337,60=>838,61=>838,62=>838,63=>536,64=>1000,65=>722,66=>735,67=>765,68=>802,69=>730,70=>694,71=>799,72=>872,73=>395,74=>401,75=>747,76=>664,77=>1024,78=>875,79=>820,80=>673,81=>820,82=>753,83=>685,84=>667,85=>843,86=>722,87=>1028,88=>712,89=>660,90=>695,91=>390,92=>337,93=>390,94=>838,95=>500,96=>500,97=>596,98=>640,99=>560,100=>640,101=>592,102=>370,103=>640,104=>644,105=>320,106=>310,107=>606,108=>320,109=>948,110=>644,111=>602,112=>640,113=>640,114=>478,115=>513,116=>402,117=>644,118=>565,119=>856,120=>564,121=>565,122=>527,123=>636,124=>337,125=>636,126=>838,160=>318,161=>402,162=>636,163=>636,164=>636,165=>636,166=>337,167=>500,168=>500,169=>1000,170=>475,171=>612,172=>838,173=>338,174=>1000,175=>500,176=>500,177=>838,178=>401,179=>401,180=>500,181=>650,182=>636,183=>318,184=>500,185=>401,186=>470,187=>612,188=>969,189=>969,190=>969,191=>536,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1001,199=>765,200=>730,201=>730,202=>730,203=>730,204=>395,205=>395,206=>395,207=>395,208=>807,209=>875,210=>820,211=>820,212=>820,213=>820,214=>820,215=>838,216=>820,217=>843,218=>843,219=>843,220=>843,221=>660,222=>676,223=>668,224=>596,225=>596,226=>596,227=>596,228=>596,229=>596,230=>940,231=>560,232=>592,233=>592,234=>592,235=>592,236=>320,237=>320,238=>320,239=>320,240=>602,241=>644,242=>602,243=>602,244=>602,245=>602,246=>602,247=>838,248=>602,249=>644,250=>644,251=>644,252=>644,253=>565,254=>640,255=>565,256=>722,257=>596,258=>722,259=>596,260=>722,261=>596,262=>765,263=>560,264=>765,265=>560,266=>765,267=>560,268=>765,269=>560,270=>802,271=>640,272=>807,273=>640,274=>730,275=>592,276=>730,277=>592,278=>730,279=>592,280=>730,281=>592,282=>730,283=>592,284=>799,285=>640,286=>799,287=>640,288=>799,289=>640,290=>799,291=>640,292=>872,293=>644,294=>872,295=>644,296=>395,297=>320,298=>395,299=>320,300=>395,301=>320,302=>395,303=>320,304=>395,305=>320,306=>801,307=>533,308=>401,309=>310,310=>747,311=>606,312=>606,313=>664,314=>320,315=>664,316=>320,317=>664,318=>320,319=>664,320=>320,321=>669,322=>324,323=>875,324=>644,325=>875,326=>644,327=>875,328=>644,329=>866,330=>843,331=>644,332=>820,333=>602,334=>820,335=>602,336=>820,337=>602,338=>1137,339=>989,340=>753,341=>478,342=>753,343=>478,344=>753,345=>478,346=>685,347=>513,348=>685,349=>513,350=>685,351=>513,352=>685,353=>513,354=>667,355=>402,356=>667,357=>402,358=>667,359=>402,360=>843,361=>644,362=>843,363=>644,364=>843,365=>644,366=>843,367=>644,368=>843,369=>644,370=>843,371=>644,372=>1028,373=>856,374=>660,375=>565,376=>660,377=>695,378=>527,379=>695,380=>527,381=>695,382=>527,383=>370,384=>640,385=>735,386=>735,387=>640,388=>735,389=>640,390=>765,391=>765,392=>560,393=>807,394=>802,395=>735,396=>640,397=>602,398=>730,399=>820,400=>623,401=>694,402=>370,403=>799,404=>712,405=>932,406=>395,407=>395,408=>747,409=>606,410=>320,411=>634,412=>948,413=>875,414=>644,415=>820,416=>820,417=>602,418=>1040,419=>807,420=>673,421=>640,422=>753,423=>685,424=>513,425=>707,426=>324,427=>402,428=>667,429=>402,430=>667,431=>843,432=>644,433=>829,434=>760,435=>738,436=>663,437=>695,438=>527,439=>564,440=>564,441=>564,442=>564,443=>636,444=>687,445=>564,446=>536,447=>635,448=>295,449=>492,450=>459,451=>295,452=>1497,453=>1329,454=>1167,455=>1065,456=>974,457=>630,458=>1276,459=>1185,460=>954,461=>722,462=>596,463=>395,464=>320,465=>820,466=>602,467=>843,468=>644,469=>843,470=>644,471=>843,472=>644,473=>843,474=>644,475=>843,476=>644,477=>592,478=>722,479=>596,480=>722,481=>596,482=>1001,483=>940,484=>848,485=>640,486=>799,487=>640,488=>747,489=>606,490=>820,491=>602,492=>820,493=>602,494=>564,495=>564,496=>320,497=>1497,498=>1329,499=>1167,500=>799,501=>640,502=>1154,503=>707,504=>875,505=>644,506=>722,507=>596,508=>1001,509=>940,510=>820,511=>602,512=>722,513=>596,514=>722,515=>596,516=>730,517=>592,518=>730,519=>592,520=>395,521=>320,522=>395,523=>320,524=>820,525=>602,526=>820,527=>602,528=>753,529=>478,530=>753,531=>478,532=>843,533=>644,534=>843,535=>644,536=>685,537=>513,538=>667,539=>402,540=>627,541=>521,542=>872,543=>644,544=>843,545=>814,546=>572,547=>552,548=>695,549=>527,550=>722,551=>596,552=>730,553=>592,554=>820,555=>602,556=>820,557=>602,558=>820,559=>602,560=>820,561=>602,562=>660,563=>565,564=>500,565=>832,566=>494,567=>310,568=>960,569=>960,570=>722,571=>765,572=>560,573=>664,574=>667,575=>513,576=>527,577=>583,578=>464,579=>735,580=>843,581=>722,582=>730,583=>592,584=>401,585=>315,586=>782,587=>640,588=>753,589=>478,590=>660,591=>565,592=>596,593=>640,594=>640,595=>640,596=>560,597=>560,598=>647,599=>683,600=>592,601=>592,602=>843,603=>518,604=>509,605=>773,606=>613,607=>315,608=>683,609=>640,610=>544,611=>712,612=>564,613=>644,614=>644,615=>644,616=>320,617=>392,618=>320,619=>380,620=>454,621=>363,622=>704,623=>948,624=>948,625=>948,626=>644,627=>694,628=>646,629=>602,630=>790,631=>647,632=>602,633=>501,634=>501,635=>551,636=>478,637=>478,638=>453,639=>453,640=>594,641=>594,642=>513,643=>271,644=>370,645=>487,646=>324,647=>402,648=>402,649=>644,650=>620,651=>608,652=>565,653=>856,654=>565,655=>655,656=>597,657=>560,658=>564,659=>560,660=>536,661=>536,662=>536,663=>513,664=>820,665=>563,666=>613,667=>654,668=>667,669=>366,670=>606,671=>543,672=>683,673=>536,674=>536,675=>996,676=>1033,677=>998,678=>809,679=>598,680=>782,681=>894,682=>646,683=>676,684=>598,685=>443,686=>781,687=>767,688=>433,689=>430,690=>264,691=>347,692=>347,693=>430,694=>392,695=>585,696=>423,697=>278,699=>318,700=>318,701=>318,702=>307,703=>307,704=>280,705=>281,710=>500,711=>500,712=>275,713=>500,716=>275,717=>500,720=>337,721=>337,722=>307,723=>307,726=>329,728=>500,729=>500,730=>500,731=>500,732=>500,733=>500,734=>417,736=>447,737=>243,738=>337,739=>424,740=>281,741=>493,742=>493,743=>493,744=>493,745=>493,750=>484,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>740,881=>531,882=>667,883=>553,884=>278,885=>278,886=>875,887=>667,890=>500,891=>560,892=>560,893=>560,894=>337,900=>500,901=>500,902=>722,903=>318,904=>900,905=>1039,906=>562,908=>835,910=>897,911=>853,912=>392,913=>722,914=>735,915=>694,916=>722,917=>730,918=>695,919=>872,920=>820,921=>395,922=>747,923=>722,924=>1024,925=>875,926=>704,927=>820,928=>872,929=>673,931=>707,932=>667,933=>660,934=>820,935=>712,936=>877,937=>829,938=>395,939=>660,940=>675,941=>518,942=>599,943=>392,944=>608,945=>675,946=>578,947=>598,948=>602,949=>518,950=>542,951=>599,952=>602,953=>392,954=>625,955=>634,956=>650,957=>608,958=>551,959=>602,960=>657,961=>588,962=>560,963=>683,964=>553,965=>608,966=>700,967=>606,968=>784,969=>815,970=>392,971=>608,972=>602,973=>608,974=>815,975=>747,976=>583,977=>715,978=>687,979=>874,980=>687,981=>682,982=>815,983=>624,984=>820,985=>602,986=>765,987=>560,988=>694,989=>463,990=>590,991=>660,992=>782,993=>577,1008=>624,1009=>588,1010=>560,1011=>310,1012=>820,1013=>560,1014=>560,1015=>676,1016=>640,1017=>765,1018=>1024,1019=>708,1020=>588,1021=>765,1022=>765,1023=>765,1024=>730,1025=>730,1026=>799,1027=>662,1028=>765,1029=>685,1030=>395,1031=>395,1032=>401,1033=>1084,1034=>1118,1035=>872,1036=>774,1037=>872,1038=>723,1039=>872,1040=>757,1041=>735,1042=>735,1043=>662,1044=>813,1045=>730,1046=>1124,1047=>623,1048=>872,1049=>872,1050=>774,1051=>834,1052=>1024,1053=>872,1054=>820,1055=>872,1056=>673,1057=>765,1058=>667,1059=>723,1060=>830,1061=>712,1062=>872,1063=>773,1064=>1141,1065=>1141,1066=>794,1067=>984,1068=>674,1069=>765,1070=>1193,1071=>808,1072=>596,1073=>602,1074=>563,1075=>524,1076=>616,1077=>592,1078=>920,1079=>545,1080=>667,1081=>667,1082=>625,1083=>635,1084=>778,1085=>667,1086=>602,1087=>667,1088=>640,1089=>560,1090=>553,1091=>588,1092=>783,1093=>564,1094=>643,1095=>661,1096=>930,1097=>930,1098=>636,1099=>796,1100=>544,1101=>560,1102=>871,1103=>631,1104=>592,1105=>592,1106=>624,1107=>524,1108=>560,1109=>513,1110=>320,1111=>320,1112=>310,1113=>843,1114=>860,1115=>644,1116=>625,1117=>667,1118=>588,1119=>656,1122=>762,1123=>603,1124=>1129,1125=>834,1130=>1124,1131=>920,1136=>944,1137=>902,1138=>820,1139=>552,1140=>859,1141=>678,1164=>707,1165=>544,1168=>672,1169=>529,1170=>662,1171=>523,1172=>728,1173=>614,1174=>1124,1175=>920,1176=>636,1177=>537,1178=>774,1179=>606,1182=>774,1183=>625,1184=>891,1185=>717,1186=>872,1187=>641,1188=>1139,1189=>852,1190=>1205,1191=>941,1194=>765,1195=>560,1196=>667,1197=>553,1198=>660,1199=>565,1200=>660,1201=>565,1202=>712,1203=>564,1204=>952,1205=>732,1206=>749,1207=>690,1210=>749,1211=>644,1216=>395,1217=>1124,1218=>920,1219=>747,1220=>606,1223=>872,1224=>667,1227=>749,1228=>667,1231=>320,1232=>757,1233=>596,1234=>757,1235=>596,1236=>1001,1237=>940,1238=>730,1239=>592,1240=>820,1241=>592,1242=>820,1243=>592,1244=>1124,1245=>920,1246=>623,1247=>545,1248=>564,1249=>564,1250=>872,1251=>667,1252=>872,1253=>667,1254=>820,1255=>602,1256=>820,1257=>602,1258=>820,1259=>602,1260=>765,1261=>560,1262=>723,1263=>588,1264=>723,1265=>588,1266=>723,1267=>588,1268=>773,1269=>661,1270=>662,1271=>524,1272=>984,1273=>796,1296=>623,1297=>545,1298=>834,1299=>635,1300=>1198,1301=>919,1306=>820,1307=>640,1308=>1028,1309=>856,1329=>810,1330=>811,1331=>826,1332=>847,1333=>806,1334=>826,1335=>761,1336=>811,1337=>968,1338=>816,1339=>772,1340=>682,1341=>1097,1342=>845,1343=>804,1344=>719,1345=>810,1346=>833,1347=>843,1348=>897,1349=>763,1350=>794,1351=>754,1352=>799,1353=>797,1354=>875,1355=>830,1356=>884,1357=>799,1358=>802,1359=>731,1360=>774,1361=>749,1362=>633,1363=>845,1364=>843,1365=>835,1366=>821,1369=>307,1370=>264,1371=>229,1372=>391,1373=>364,1374=>386,1375=>500,1377=>949,1378=>618,1379=>695,1380=>695,1381=>628,1382=>688,1383=>510,1384=>636,1385=>791,1386=>671,1387=>635,1388=>305,1389=>973,1390=>614,1391=>628,1392=>636,1393=>630,1394=>636,1395=>654,1396=>644,1397=>309,1398=>636,1399=>461,1400=>649,1401=>365,1402=>940,1403=>562,1404=>657,1405=>644,1406=>630,1407=>930,1408=>644,1409=>643,1410=>483,1411=>930,1412=>636,1413=>609,1414=>809,1415=>789,1417=>340,1418=>334,4256=>723,4257=>850,4258=>828,4259=>859,4260=>733,4261=>981,4262=>916,4263=>1101,4264=>566,4265=>750,4266=>962,4267=>941,4268=>743,4269=>1075,4270=>896,4271=>829,4272=>1040,4273=>733,4274=>669,4275=>1015,4276=>937,4277=>1020,4278=>731,4279=>733,4280=>732,4281=>733,4282=>879,4283=>937,4284=>714,4285=>755,4286=>733,4287=>958,4288=>1000,4289=>702,4290=>864,4291=>734,4292=>837,4293=>951,4304=>541,4305=>571,4306=>589,4307=>833,4308=>561,4309=>557,4310=>618,4311=>861,4312=>560,4313=>546,4314=>1066,4315=>586,4316=>586,4317=>825,4318=>570,4319=>581,4320=>824,4321=>607,4322=>748,4323=>698,4324=>815,4325=>585,4326=>858,4327=>568,4328=>594,4329=>586,4330=>675,4331=>587,4332=>582,4333=>576,4334=>612,4335=>683,4336=>572,4337=>603,4338=>571,4339=>572,4340=>570,4341=>649,4342=>886,4343=>626,4344=>582,4345=>619,4346=>571,4347=>437,4348=>354,7424=>565,7425=>774,7426=>940,7427=>563,7428=>560,7429=>585,7430=>585,7431=>553,7432=>509,7433=>320,7434=>499,7435=>625,7436=>543,7437=>778,7438=>667,7439=>602,7440=>560,7441=>647,7442=>647,7443=>647,7444=>989,7445=>512,7446=>602,7447=>602,7448=>553,7449=>594,7450=>594,7451=>553,7452=>585,7453=>664,7454=>923,7455=>655,7456=>565,7457=>856,7458=>527,7459=>527,7460=>531,7461=>743,7462=>524,7463=>565,7464=>657,7465=>553,7466=>703,7467=>635,7468=>455,7469=>630,7470=>463,7471=>463,7472=>505,7473=>459,7474=>459,7475=>503,7476=>549,7477=>249,7478=>252,7479=>470,7480=>418,7481=>645,7482=>551,7483=>551,7484=>516,7485=>369,7486=>424,7487=>474,7488=>420,7489=>531,7490=>647,7491=>386,7492=>386,7493=>400,7494=>618,7495=>400,7496=>400,7497=>387,7498=>387,7499=>340,7500=>340,7501=>400,7502=>175,7503=>365,7504=>613,7505=>399,7506=>385,7507=>346,7508=>385,7509=>385,7510=>400,7511=>247,7512=>399,7513=>418,7514=>613,7515=>373,7516=>468,7517=>364,7518=>376,7519=>379,7520=>441,7521=>381,7522=>201,7523=>347,7524=>399,7525=>373,7526=>364,7527=>376,7528=>370,7529=>441,7530=>381,7531=>974,7543=>640,7544=>549,7547=>372,7557=>320,7579=>400,7580=>346,7581=>346,7582=>385,7583=>340,7584=>222,7585=>229,7586=>400,7587=>399,7588=>234,7589=>244,7590=>234,7591=>234,7592=>230,7593=>175,7594=>175,7595=>367,7596=>613,7597=>613,7598=>407,7599=>404,7600=>399,7601=>385,7602=>385,7603=>328,7604=>211,7605=>247,7606=>399,7607=>389,7608=>368,7609=>376,7610=>373,7611=>331,7612=>331,7613=>331,7614=>364,7615=>385,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>722,7681=>596,7682=>735,7683=>640,7684=>735,7685=>640,7686=>735,7687=>640,7688=>765,7689=>560,7690=>802,7691=>640,7692=>802,7693=>640,7694=>802,7695=>640,7696=>802,7697=>640,7698=>802,7699=>640,7700=>730,7701=>592,7702=>730,7703=>592,7704=>730,7705=>592,7706=>730,7707=>592,7708=>730,7709=>592,7710=>694,7711=>370,7712=>799,7713=>640,7714=>872,7715=>644,7716=>872,7717=>644,7718=>872,7719=>644,7720=>872,7721=>644,7722=>872,7723=>644,7724=>395,7725=>320,7726=>395,7727=>320,7728=>747,7729=>606,7730=>747,7731=>606,7732=>747,7733=>606,7734=>664,7735=>320,7736=>664,7737=>320,7738=>664,7739=>320,7740=>664,7741=>320,7742=>1024,7743=>948,7744=>1024,7745=>948,7746=>1024,7747=>948,7748=>875,7749=>644,7750=>875,7751=>644,7752=>875,7753=>644,7754=>875,7755=>644,7756=>820,7757=>602,7758=>820,7759=>602,7760=>820,7761=>602,7762=>820,7763=>602,7764=>673,7765=>640,7766=>673,7767=>640,7768=>753,7769=>478,7770=>753,7771=>478,7772=>753,7773=>478,7774=>753,7775=>478,7776=>685,7777=>513,7778=>685,7779=>513,7780=>685,7781=>513,7782=>685,7783=>521,7784=>685,7785=>513,7786=>667,7787=>402,7788=>667,7789=>402,7790=>667,7791=>402,7792=>667,7793=>402,7794=>843,7795=>644,7796=>843,7797=>644,7798=>843,7799=>644,7800=>843,7801=>644,7802=>843,7803=>644,7804=>722,7805=>565,7806=>722,7807=>565,7808=>1028,7809=>856,7810=>1028,7811=>856,7812=>1028,7813=>856,7814=>1028,7815=>856,7816=>1028,7817=>856,7818=>712,7819=>564,7820=>712,7821=>564,7822=>660,7823=>565,7824=>695,7825=>527,7826=>695,7827=>527,7828=>695,7829=>527,7830=>644,7831=>402,7832=>856,7833=>565,7834=>903,7835=>370,7836=>370,7837=>370,7838=>829,7839=>602,7840=>722,7841=>596,7842=>722,7843=>596,7844=>722,7845=>613,7846=>722,7847=>613,7848=>722,7849=>613,7850=>722,7851=>613,7852=>722,7853=>596,7854=>722,7855=>596,7856=>722,7857=>596,7858=>722,7859=>596,7860=>722,7861=>596,7862=>722,7863=>596,7864=>730,7865=>592,7866=>730,7867=>592,7868=>730,7869=>592,7870=>730,7871=>615,7872=>730,7873=>615,7874=>730,7875=>615,7876=>730,7877=>615,7878=>730,7879=>592,7880=>395,7881=>320,7882=>395,7883=>320,7884=>820,7885=>602,7886=>820,7887=>602,7888=>820,7889=>612,7890=>820,7891=>612,7892=>820,7893=>612,7894=>820,7895=>612,7896=>820,7897=>602,7898=>820,7899=>602,7900=>820,7901=>602,7902=>820,7903=>602,7904=>820,7905=>602,7906=>820,7907=>602,7908=>843,7909=>644,7910=>843,7911=>644,7912=>843,7913=>644,7914=>843,7915=>644,7916=>843,7917=>644,7918=>843,7919=>644,7920=>843,7921=>644,7922=>660,7923=>565,7924=>660,7925=>565,7926=>660,7927=>565,7928=>660,7929=>565,7930=>949,7931=>581,7936=>675,7937=>675,7938=>675,7939=>675,7940=>675,7941=>675,7942=>675,7943=>675,7944=>722,7945=>722,7946=>869,7947=>869,7948=>734,7949=>763,7950=>722,7951=>722,7952=>537,7953=>537,7954=>537,7955=>537,7956=>537,7957=>537,7960=>853,7961=>841,7962=>1067,7963=>1077,7964=>1008,7965=>1035,7968=>599,7969=>599,7970=>599,7971=>599,7972=>599,7973=>599,7974=>599,7975=>599,7976=>998,7977=>992,7978=>1212,7979=>1224,7980=>1159,7981=>1183,7982=>1098,7983=>1095,7984=>392,7985=>392,7986=>392,7987=>392,7988=>392,7989=>392,7990=>392,7991=>392,7992=>521,7993=>512,7994=>735,7995=>738,7996=>679,7997=>706,7998=>624,7999=>615,8000=>602,8001=>602,8002=>602,8003=>602,8004=>602,8005=>602,8008=>820,8009=>859,8010=>1120,8011=>1127,8012=>937,8013=>964,8016=>608,8017=>608,8018=>608,8019=>608,8020=>608,8021=>608,8022=>608,8023=>608,8025=>851,8027=>1079,8029=>1044,8031=>953,8032=>815,8033=>815,8034=>815,8035=>815,8036=>815,8037=>815,8038=>815,8039=>815,8040=>829,8041=>870,8042=>1131,8043=>1137,8044=>946,8045=>976,8046=>938,8047=>970,8048=>675,8049=>675,8050=>537,8051=>537,8052=>599,8053=>599,8054=>392,8055=>392,8056=>602,8057=>602,8058=>608,8059=>608,8060=>815,8061=>815,8064=>675,8065=>675,8066=>675,8067=>675,8068=>675,8069=>675,8070=>675,8071=>675,8072=>722,8073=>722,8074=>869,8075=>869,8076=>734,8077=>763,8078=>722,8079=>722,8080=>599,8081=>599,8082=>599,8083=>599,8084=>599,8085=>599,8086=>599,8087=>599,8088=>998,8089=>992,8090=>1212,8091=>1224,8092=>1159,8093=>1183,8094=>1098,8095=>1095,8096=>815,8097=>815,8098=>815,8099=>815,8100=>815,8101=>815,8102=>815,8103=>815,8104=>829,8105=>870,8106=>1131,8107=>1137,8108=>946,8109=>976,8110=>938,8111=>970,8112=>675,8113=>675,8114=>675,8115=>675,8116=>675,8118=>675,8119=>675,8120=>722,8121=>722,8122=>722,8123=>722,8124=>722,8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>599,8131=>599,8132=>599,8134=>599,8135=>599,8136=>912,8137=>900,8138=>1063,8139=>1039,8140=>872,8141=>500,8142=>500,8143=>500,8144=>392,8145=>392,8146=>392,8147=>392,8150=>392,8151=>392,8152=>395,8153=>395,8154=>588,8155=>562,8157=>500,8158=>500,8159=>500,8160=>608,8161=>608,8162=>608,8163=>608,8164=>588,8165=>588,8166=>608,8167=>608,8168=>660,8169=>660,8170=>921,8171=>897,8172=>790,8173=>500,8174=>500,8175=>500,8178=>815,8179=>815,8180=>815,8182=>815,8183=>815,8184=>961,8185=>835,8186=>984,8187=>853,8188=>829,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>636,8200=>318,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>338,8209=>338,8210=>636,8211=>500,8212=>1000,8213=>1000,8214=>500,8215=>500,8216=>318,8217=>318,8218=>318,8219=>318,8220=>511,8221=>511,8222=>518,8223=>511,8224=>500,8225=>500,8226=>590,8227=>590,8228=>334,8229=>667,8230=>1000,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200,8240=>1342,8241=>1734,8242=>227,8243=>374,8244=>520,8245=>227,8246=>374,8247=>520,8248=>339,8249=>400,8250=>400,8252=>527,8253=>536,8254=>500,8258=>1000,8260=>167,8261=>390,8262=>390,8263=>976,8264=>753,8265=>753,8267=>636,8268=>500,8269=>500,8270=>500,8271=>337,8273=>500,8274=>450,8275=>1000,8279=>663,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>401,8305=>201,8308=>401,8309=>401,8310=>401,8311=>401,8312=>401,8313=>401,8314=>528,8315=>528,8316=>528,8317=>246,8318=>246,8319=>433,8320=>401,8321=>401,8322=>401,8323=>401,8324=>401,8325=>401,8326=>401,8327=>401,8328=>401,8329=>401,8330=>528,8331=>528,8332=>528,8333=>246,8334=>246,8336=>386,8337=>387,8338=>385,8339=>424,8340=>387,8341=>433,8342=>365,8343=>243,8344=>613,8345=>433,8346=>400,8347=>337,8348=>247,8358=>660,8364=>636,8367=>1057,8369=>706,8372=>780,8373=>636,8377=>636,8450=>796,8451=>1119,8457=>1047,8461=>945,8462=>644,8463=>644,8469=>914,8470=>946,8473=>752,8474=>871,8477=>831,8482=>1000,8484=>730,8486=>829,8487=>829,8490=>747,8491=>722,8508=>732,8509=>660,8510=>710,8511=>944,8512=>714,8513=>775,8514=>557,8515=>557,8516=>611,8517=>867,8518=>699,8519=>636,8520=>380,8521=>362,8523=>890,8528=>969,8529=>969,8530=>1370,8531=>969,8532=>969,8533=>969,8534=>969,8535=>969,8536=>969,8537=>969,8538=>969,8539=>969,8540=>969,8541=>969,8542=>969,8543=>568,8544=>395,8545=>590,8546=>786,8547=>966,8548=>722,8549=>981,8550=>1176,8551=>1372,8552=>932,8553=>712,8554=>932,8555=>1127,8556=>664,8557=>765,8558=>802,8559=>1024,8560=>320,8561=>640,8562=>959,8563=>885,8564=>565,8565=>885,8566=>1205,8567=>1524,8568=>884,8569=>564,8570=>884,8571=>1204,8572=>320,8573=>560,8574=>640,8575=>948,8576=>1206,8577=>802,8578=>1206,8579=>765,8580=>560,8581=>765,8585=>969,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838,8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838,8620=>838,8621=>838,8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838,8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838,8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838,8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838,8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838,8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838,8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838,8700=>838,8701=>838,8702=>838,8703=>838,8704=>604,8706=>517,8707=>542,8708=>542,8710=>698,8711=>698,8712=>740,8713=>740,8715=>740,8716=>740,8719=>796,8720=>796,8721=>714,8722=>838,8723=>838,8724=>838,8725=>337,8727=>680,8728=>490,8729=>490,8730=>637,8731=>637,8732=>637,8733=>677,8734=>833,8735=>838,8736=>838,8739=>291,8740=>479,8741=>462,8742=>634,8743=>732,8744=>732,8745=>838,8746=>838,8747=>521,8748=>852,8749=>1182,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838,8770=>838,8771=>838,8776=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1033,8789=>1033,8800=>838,8801=>838,8804=>838,8805=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8844=>838,8845=>838,8846=>838,8847=>846,8848=>846,8849=>846,8850=>846,8851=>838,8852=>838,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838,8865=>838,8866=>860,8867=>860,8868=>940,8869=>940,8870=>567,8871=>567,8872=>860,8873=>860,8874=>860,8875=>1031,8876=>860,8877=>860,8878=>860,8879=>1031,8901=>342,8962=>764,8968=>390,8969=>390,8970=>390,8971=>390,8976=>838,8977=>513,8984=>1000,8985=>838,8992=>521,8993=>521,8997=>1000,9000=>1443,9085=>919,9115=>500,9116=>500,9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500,9125=>500,9126=>500,9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>521,9167=>945,9251=>764,9472=>602,9473=>602,9474=>602,9475=>602,9476=>602,9477=>602,9478=>602,9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602,9486=>602,9487=>602,9488=>602,9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602,9496=>602,9497=>602,9498=>602,9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602,9506=>602,9507=>602,9508=>602,9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602,9516=>602,9517=>602,9518=>602,9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602,9526=>602,9527=>602,9528=>602,9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602,9536=>602,9537=>602,9538=>602,9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602,9546=>602,9547=>602,9548=>602,9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602,9556=>602,9557=>602,9558=>602,9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602,9566=>602,9567=>602,9568=>602,9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602,9576=>602,9577=>602,9578=>602,9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602,9586=>602,9587=>602,9588=>602,9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602,9596=>602,9597=>602,9598=>602,9599=>602,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527,9687=>527,9688=>791,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>873,9697=>873,9698=>769,9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945,9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732,9727=>769,9728=>896,9784=>896,9785=>896,9786=>896,9787=>896,9788=>896,9791=>614,9792=>731,9793=>731,9794=>896,9795=>896,9796=>896,9797=>896,9798=>896,9799=>896,9824=>896,9825=>896,9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472,9838=>357,9839=>484,10145=>838,10181=>390,10182=>390,10208=>494,10216=>390,10217=>390,10224=>838,10225=>838,10226=>838,10227=>838,10228=>1033,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434,10237=>1434,10238=>1434,10239=>1434,10240=>732,10241=>732,10242=>732,10243=>732,10244=>732,10245=>732,10246=>732,10247=>732,10248=>732,10249=>732,10250=>732,10251=>732,10252=>732,10253=>732,10254=>732,10255=>732,10256=>732,10257=>732,10258=>732,10259=>732,10260=>732,10261=>732,10262=>732,10263=>732,10264=>732,10265=>732,10266=>732,10267=>732,10268=>732,10269=>732,10270=>732,10271=>732,10272=>732,10273=>732,10274=>732,10275=>732,10276=>732,10277=>732,10278=>732,10279=>732,10280=>732,10281=>732,10282=>732,10283=>732,10284=>732,10285=>732,10286=>732,10287=>732,10288=>732,10289=>732,10290=>732,10291=>732,10292=>732,10293=>732,10294=>732,10295=>732,10296=>732,10297=>732,10298=>732,10299=>732,10300=>732,10301=>732,10302=>732,10303=>732,10304=>732,10305=>732,10306=>732,10307=>732,10308=>732,10309=>732,10310=>732,10311=>732,10312=>732,10313=>732,10314=>732,10315=>732,10316=>732,10317=>732,10318=>732,10319=>732,10320=>732,10321=>732,10322=>732,10323=>732,10324=>732,10325=>732,10326=>732,10327=>732,10328=>732,10329=>732,10330=>732,10331=>732,10332=>732,10333=>732,10334=>732,10335=>732,10336=>732,10337=>732,10338=>732,10339=>732,10340=>732,10341=>732,10342=>732,10343=>732,10344=>732,10345=>732,10346=>732,10347=>732,10348=>732,10349=>732,10350=>732,10351=>732,10352=>732,10353=>732,10354=>732,10355=>732,10356=>732,10357=>732,10358=>732,10359=>732,10360=>732,10361=>732,10362=>732,10363=>732,10364=>732,10365=>732,10366=>732,10367=>732,10368=>732,10369=>732,10370=>732,10371=>732,10372=>732,10373=>732,10374=>732,10375=>732,10376=>732,10377=>732,10378=>732,10379=>732,10380=>732,10381=>732,10382=>732,10383=>732,10384=>732,10385=>732,10386=>732,10387=>732,10388=>732,10389=>732,10390=>732,10391=>732,10392=>732,10393=>732,10394=>732,10395=>732,10396=>732,10397=>732,10398=>732,10399=>732,10400=>732,10401=>732,10402=>732,10403=>732,10404=>732,10405=>732,10406=>732,10407=>732,10408=>732,10409=>732,10410=>732,10411=>732,10412=>732,10413=>732,10414=>732,10415=>732,10416=>732,10417=>732,10418=>732,10419=>732,10420=>732,10421=>732,10422=>732,10423=>732,10424=>732,10425=>732,10426=>732,10427=>732,10428=>732,10429=>732,10430=>732,10431=>732,10432=>732,10433=>732,10434=>732,10435=>732,10436=>732,10437=>732,10438=>732,10439=>732,10440=>732,10441=>732,10442=>732,10443=>732,10444=>732,10445=>732,10446=>732,10447=>732,10448=>732,10449=>732,10450=>732,10451=>732,10452=>732,10453=>732,10454=>732,10455=>732,10456=>732,10457=>732,10458=>732,10459=>732,10460=>732,10461=>732,10462=>732,10463=>732,10464=>732,10465=>732,10466=>732,10467=>732,10468=>732,10469=>732,10470=>732,10471=>732,10472=>732,10473=>732,10474=>732,10475=>732,10476=>732,10477=>732,10478=>732,10479=>732,10480=>732,10481=>732,10482=>732,10483=>732,10484=>732,10485=>732,10486=>732,10487=>732,10488=>732,10489=>732,10490=>732,10491=>732,10492=>732,10493=>732,10494=>732,10495=>732,10496=>838,10497=>838,10498=>838,10499=>838,10500=>838,10501=>838,10502=>838,10503=>838,10504=>838,10505=>838,10506=>838,10507=>838,10508=>838,10509=>838,10510=>838,10511=>838,10512=>838,10513=>838,10514=>838,10515=>838,10516=>838,10517=>838,10518=>838,10519=>838,10520=>838,10521=>838,10522=>838,10523=>838,10524=>838,10525=>838,10526=>838,10527=>838,10528=>838,10529=>838,10530=>838,10531=>838,10532=>838,10533=>838,10534=>838,10535=>838,10536=>838,10537=>838,10538=>838,10539=>838,10540=>838,10541=>838,10542=>838,10543=>838,10544=>838,10545=>838,10546=>838,10547=>838,10548=>838,10549=>838,10550=>838,10551=>838,10552=>838,10553=>838,10554=>838,10555=>838,10556=>838,10557=>838,10558=>838,10559=>838,10560=>838,10561=>838,10562=>838,10563=>838,10564=>838,10565=>838,10566=>838,10567=>838,10568=>838,10569=>838,10570=>838,10571=>838,10572=>838,10573=>838,10574=>838,10575=>838,10576=>838,10577=>838,10578=>838,10579=>838,10580=>838,10581=>838,10582=>838,10583=>838,10584=>838,10585=>838,10586=>838,10587=>838,10588=>838,10589=>838,10590=>838,10591=>838,10592=>838,10593=>838,10594=>838,10595=>838,10596=>838,10597=>838,10598=>838,10599=>838,10600=>838,10601=>838,10602=>838,10603=>838,10604=>838,10605=>838,10606=>838,10607=>838,10608=>838,10609=>838,10610=>838,10611=>838,10612=>838,10613=>838,10614=>838,10615=>981,10616=>838,10617=>838,10618=>984,10619=>838,10620=>838,10621=>838,10622=>838,10623=>838,10731=>494,10764=>1513,10765=>521,10766=>521,10799=>838,11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838,11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838,11026=>945,11027=>945,11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11360=>664,11361=>320,11363=>673,11364=>753,11367=>872,11368=>644,11369=>747,11370=>606,11371=>695,11372=>527,11373=>782,11374=>1024,11375=>722,11376=>782,11377=>663,11378=>1130,11379=>939,11381=>740,11382=>556,11383=>700,11385=>501,11386=>602,11388=>264,11389=>455,11390=>685,11391=>695,11520=>773,11521=>635,11522=>633,11523=>658,11524=>631,11525=>962,11526=>756,11527=>960,11528=>617,11529=>646,11530=>962,11531=>632,11532=>646,11533=>962,11534=>645,11535=>866,11536=>961,11537=>645,11538=>645,11539=>959,11540=>945,11541=>863,11542=>644,11543=>646,11544=>645,11545=>649,11546=>688,11547=>634,11548=>982,11549=>681,11550=>676,11551=>852,11552=>957,11553=>632,11554=>645,11555=>646,11556=>749,11557=>914,11800=>536,11810=>390,11811=>390,11812=>390,11813=>390,11822=>536,42564=>685,42565=>513,42566=>395,42567=>392,42576=>1104,42577=>888,42580=>1193,42581=>871,42582=>1140,42583=>899,42760=>493,42761=>493,42762=>493,42763=>493,42764=>493,42765=>493,42766=>493,42767=>493,42768=>493,42769=>493,42770=>493,42771=>493,42772=>493,42773=>493,42774=>493,42779=>369,42780=>369,42781=>253,42782=>253,42783=>253,42790=>872,42791=>634,42792=>843,42793=>754,42794=>612,42795=>560,42796=>548,42797=>531,42798=>629,42799=>610,42800=>514,42801=>513,42802=>1195,42803=>944,42804=>1226,42805=>950,42806=>1149,42807=>934,42808=>968,42809=>784,42810=>968,42811=>784,42812=>962,42813=>824,42814=>765,42815=>560,42822=>787,42823=>434,42826=>932,42827=>711,42830=>1416,42831=>999,42856=>707,42857=>610,42875=>612,42876=>478,42880=>664,42881=>320,42882=>843,42883=>644,42884=>612,42885=>478,42886=>765,42887=>560,42891=>402,42892=>275,42893=>773,42896=>875,42897=>644,43002=>957,43003=>694,43004=>673,43005=>1024,43006=>395,43007=>1201,62464=>654,62465=>665,62466=>714,62467=>947,62468=>665,62469=>659,62470=>725,62471=>986,62472=>665,62473=>665,62474=>1257,62475=>683,62476=>682,62477=>953,62478=>665,62479=>682,62480=>999,62481=>746,62482=>798,62483=>748,62484=>944,62485=>681,62486=>936,62487=>680,62488=>688,62489=>682,62490=>729,62491=>682,62492=>688,62493=>666,62494=>729,62495=>884,62496=>665,62497=>706,62498=>666,62499=>665,62500=>665,62501=>722,62502=>961,62504=>904,63173=>602,63185=>500,63188=>500,64256=>710,64257=>667,64258=>667,64259=>1028,64260=>1030,64261=>771,64262=>933,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1025,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserif.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserif.z
new file mode 100644
index 00000000..20eaaa0f
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserif.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifb.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifb.ctg.z
new file mode 100644
index 00000000..383a8e0b
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifb.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifb.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifb.php
new file mode 100644
index 00000000..a0d731ae
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifb.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSerif-Bold';
+$up=-63;
+$ut=44;
+$dw=600;
+$diff='';
+$originalsize=341072;
+$enc='';
+$file='dejavuserifb.z';
+$ctg='dejavuserifb.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-836 -389 1796 1145]','ItalicAngle'=>0,'Ascent'=>939,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>519,'StemV'=>60,'StemH'=>26,'AvgWidth'=>566,'MaxWidth'=>1820,'MissingWidth'=>600);
+$cw=array(0=>600,32=>348,33=>439,34=>521,35=>838,36=>696,37=>950,38=>903,39=>306,40=>473,41=>473,42=>523,43=>838,44=>348,45=>415,46=>348,47=>365,48=>696,49=>696,50=>696,51=>696,52=>696,53=>696,54=>696,55=>696,56=>696,57=>696,58=>369,59=>369,60=>838,61=>838,62=>838,63=>586,64=>1000,65=>776,66=>845,67=>796,68=>867,69=>762,70=>710,71=>854,72=>945,73=>468,74=>473,75=>869,76=>703,77=>1107,78=>914,79=>871,80=>752,81=>871,82=>831,83=>722,84=>744,85=>872,86=>776,87=>1123,88=>776,89=>714,90=>730,91=>473,92=>365,93=>473,94=>838,95=>500,96=>500,97=>648,98=>699,99=>609,100=>699,101=>636,102=>430,103=>699,104=>727,105=>380,106=>362,107=>693,108=>380,109=>1058,110=>727,111=>667,112=>699,113=>699,114=>527,115=>563,116=>462,117=>727,118=>581,119=>861,120=>596,121=>581,122=>568,123=>643,124=>364,125=>643,126=>838,160=>348,161=>439,162=>696,163=>696,164=>636,165=>696,166=>364,167=>523,168=>500,169=>1000,170=>487,171=>625,172=>838,173=>415,174=>1000,175=>500,176=>500,177=>838,178=>438,179=>438,180=>500,181=>732,182=>636,183=>348,184=>500,185=>438,186=>500,187=>625,188=>1043,189=>1043,190=>1043,191=>586,192=>776,193=>776,194=>776,195=>776,196=>776,197=>776,198=>1034,199=>796,200=>762,201=>762,202=>762,203=>762,204=>468,205=>468,206=>468,207=>468,208=>874,209=>914,210=>871,211=>871,212=>871,213=>871,214=>871,215=>838,216=>871,217=>872,218=>872,219=>872,220=>872,221=>714,222=>757,223=>760,224=>648,225=>648,226=>648,227=>648,228=>648,229=>648,230=>975,231=>609,232=>636,233=>636,234=>636,235=>636,236=>380,237=>380,238=>380,239=>380,240=>667,241=>727,242=>667,243=>667,244=>667,245=>667,246=>667,247=>838,248=>667,249=>727,250=>727,251=>727,252=>727,253=>581,254=>699,255=>581,256=>776,257=>648,258=>776,259=>648,260=>776,261=>648,262=>796,263=>609,264=>796,265=>609,266=>796,267=>609,268=>796,269=>609,270=>867,271=>699,272=>874,273=>699,274=>762,275=>636,276=>762,277=>636,278=>762,279=>636,280=>762,281=>636,282=>762,283=>636,284=>854,285=>699,286=>854,287=>699,288=>854,289=>699,290=>854,291=>699,292=>945,293=>727,294=>945,295=>727,296=>468,297=>380,298=>468,299=>380,300=>468,301=>380,302=>468,303=>380,304=>468,305=>380,306=>942,307=>751,308=>473,309=>362,310=>869,311=>693,312=>693,313=>703,314=>380,315=>703,316=>380,317=>703,318=>380,319=>703,320=>380,321=>710,322=>385,323=>914,324=>727,325=>914,326=>727,327=>914,328=>727,329=>1008,330=>872,331=>727,332=>871,333=>667,334=>871,335=>667,336=>871,337=>667,338=>1180,339=>1028,340=>831,341=>527,342=>831,343=>527,344=>831,345=>527,346=>722,347=>563,348=>722,349=>563,350=>722,351=>563,352=>722,353=>563,354=>744,355=>462,356=>744,357=>462,358=>744,359=>462,360=>872,361=>727,362=>872,363=>727,364=>872,365=>727,366=>872,367=>727,368=>872,369=>727,370=>872,371=>727,372=>1123,373=>861,374=>714,375=>581,376=>714,377=>730,378=>568,379=>730,380=>568,381=>730,382=>568,383=>430,384=>699,385=>845,386=>854,387=>699,388=>854,389=>699,390=>796,391=>796,392=>609,393=>874,394=>867,395=>854,396=>699,397=>667,398=>762,399=>871,400=>721,401=>710,402=>430,403=>854,404=>771,405=>1043,406=>468,407=>468,408=>869,409=>693,410=>380,411=>701,412=>1058,413=>914,414=>727,415=>871,416=>871,417=>667,418=>1200,419=>943,420=>752,421=>699,422=>831,423=>722,424=>563,425=>707,426=>331,427=>462,428=>744,429=>462,430=>744,431=>872,432=>727,433=>890,434=>890,435=>714,436=>708,437=>730,438=>568,439=>657,440=>657,441=>657,442=>657,443=>696,444=>754,445=>568,446=>536,447=>716,448=>295,449=>492,450=>459,451=>295,452=>1597,453=>1435,454=>1267,455=>1176,456=>1065,457=>742,458=>1387,459=>1276,460=>1089,461=>776,462=>648,463=>468,464=>380,465=>871,466=>667,467=>872,468=>727,469=>872,470=>727,471=>872,472=>727,473=>872,474=>727,475=>872,476=>727,477=>636,478=>776,479=>648,480=>776,481=>648,482=>1034,483=>975,484=>896,485=>699,486=>854,487=>699,488=>869,489=>693,490=>871,491=>667,492=>871,493=>667,494=>657,495=>568,496=>380,497=>1597,498=>1435,499=>1267,500=>854,501=>699,502=>1221,503=>787,504=>914,505=>727,506=>776,507=>648,508=>1034,509=>975,510=>871,511=>667,512=>776,513=>648,514=>776,515=>648,516=>762,517=>636,518=>762,519=>636,520=>468,521=>380,522=>468,523=>380,524=>871,525=>667,526=>871,527=>667,528=>831,529=>527,530=>831,531=>527,532=>872,533=>727,534=>872,535=>727,536=>722,537=>563,538=>744,539=>462,540=>690,541=>607,542=>945,543=>727,544=>872,545=>791,546=>703,547=>616,548=>730,549=>568,550=>776,551=>648,552=>762,553=>636,554=>871,555=>667,556=>871,557=>667,558=>871,559=>667,560=>871,561=>667,562=>714,563=>581,564=>573,565=>922,566=>564,567=>362,568=>1031,569=>1031,570=>776,571=>796,572=>609,573=>703,574=>744,575=>563,576=>568,577=>660,578=>547,579=>845,580=>872,581=>776,582=>762,583=>636,584=>473,585=>387,586=>848,587=>699,588=>831,589=>527,590=>714,591=>581,592=>648,593=>699,594=>699,595=>699,596=>609,597=>609,598=>699,599=>730,600=>636,601=>636,602=>907,603=>608,604=>562,605=>907,606=>720,607=>387,608=>699,609=>699,610=>626,611=>712,612=>627,613=>727,614=>727,615=>727,616=>380,617=>380,618=>380,619=>409,620=>514,621=>380,622=>795,623=>1058,624=>1058,625=>1058,626=>727,627=>727,628=>712,629=>667,630=>1061,631=>749,632=>667,633=>571,634=>571,635=>571,636=>527,637=>527,638=>452,639=>487,640=>801,641=>801,642=>563,643=>331,644=>430,645=>540,646=>331,647=>492,648=>462,649=>727,650=>679,651=>694,652=>641,653=>907,654=>635,655=>727,656=>568,657=>568,658=>568,659=>568,660=>536,661=>536,662=>536,663=>545,664=>871,665=>695,666=>720,667=>626,668=>732,669=>384,670=>740,671=>646,672=>699,673=>536,674=>536,675=>1117,676=>1179,677=>1117,678=>911,679=>715,680=>909,681=>1039,682=>790,683=>795,684=>662,685=>443,686=>613,687=>717,688=>521,689=>519,690=>313,691=>414,692=>414,693=>480,694=>527,695=>662,696=>485,697=>302,699=>348,700=>348,701=>348,702=>366,703=>366,704=>313,705=>313,710=>500,711=>500,712=>282,713=>500,716=>282,717=>500,720=>369,721=>369,722=>366,723=>366,726=>392,728=>500,729=>500,730=>500,731=>500,732=>500,733=>500,734=>417,736=>458,737=>292,738=>395,739=>475,740=>313,741=>500,742=>500,743=>500,744=>500,745=>500,750=>553,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>779,881=>576,882=>803,883=>777,884=>302,885=>302,886=>963,887=>737,890=>500,891=>609,892=>609,893=>609,894=>369,900=>500,901=>500,902=>776,903=>348,904=>947,905=>1118,906=>662,908=>887,910=>953,911=>911,912=>484,913=>776,914=>845,915=>710,916=>776,917=>762,918=>730,919=>945,920=>871,921=>468,922=>869,923=>776,924=>1107,925=>914,926=>704,927=>871,928=>944,929=>752,931=>707,932=>744,933=>714,934=>871,935=>776,936=>913,937=>890,938=>468,939=>714,940=>770,941=>608,942=>727,943=>484,944=>694,945=>770,946=>664,947=>660,948=>667,949=>608,950=>592,951=>727,952=>667,953=>484,954=>750,955=>701,956=>732,957=>694,958=>592,959=>667,960=>732,961=>665,962=>609,963=>737,964=>673,965=>694,966=>905,967=>658,968=>941,969=>952,970=>484,971=>694,972=>667,973=>694,974=>952,975=>869,976=>667,977=>849,978=>764,979=>969,980=>764,981=>941,982=>952,983=>655,984=>871,985=>667,986=>796,987=>609,988=>710,989=>527,990=>590,991=>660,992=>796,993=>667,1008=>655,1009=>665,1010=>609,1011=>362,1012=>871,1013=>609,1014=>609,1015=>757,1016=>699,1017=>796,1018=>1107,1019=>860,1020=>692,1021=>796,1022=>796,1023=>796,1024=>762,1025=>762,1026=>901,1027=>690,1028=>795,1029=>722,1030=>468,1031=>468,1032=>473,1033=>1202,1034=>1262,1035=>963,1036=>910,1037=>945,1038=>812,1039=>945,1040=>814,1041=>854,1042=>845,1043=>690,1044=>889,1045=>762,1046=>1312,1047=>721,1048=>945,1049=>945,1050=>910,1051=>884,1052=>1107,1053=>945,1054=>871,1055=>944,1056=>752,1057=>796,1058=>744,1059=>812,1060=>949,1061=>776,1062=>966,1063=>913,1064=>1268,1065=>1293,1066=>957,1067=>1202,1068=>825,1069=>795,1070=>1287,1071=>882,1072=>648,1073=>667,1074=>695,1075=>613,1076=>667,1077=>636,1078=>1010,1079=>638,1080=>742,1081=>742,1082=>722,1083=>705,1084=>869,1085=>732,1086=>667,1087=>732,1088=>699,1089=>609,1090=>620,1091=>640,1092=>902,1093=>596,1094=>739,1095=>732,1096=>1075,1097=>1082,1098=>767,1099=>1002,1100=>679,1101=>609,1102=>1025,1103=>739,1104=>636,1105=>636,1106=>719,1107=>613,1108=>609,1109=>563,1110=>380,1111=>380,1112=>362,1113=>988,1114=>1015,1115=>727,1116=>722,1117=>742,1118=>640,1119=>732,1122=>880,1123=>703,1124=>1195,1125=>963,1130=>1312,1131=>1010,1136=>1096,1137=>1105,1138=>871,1139=>652,1140=>916,1141=>749,1164=>846,1165=>673,1168=>700,1169=>618,1170=>690,1171=>613,1172=>868,1173=>716,1174=>1312,1175=>1010,1176=>721,1177=>638,1178=>947,1179=>744,1182=>910,1183=>722,1184=>1041,1185=>827,1186=>966,1187=>739,1188=>1167,1189=>956,1190=>1345,1191=>1059,1194=>796,1195=>609,1196=>744,1197=>620,1198=>714,1199=>581,1200=>714,1201=>581,1202=>866,1203=>649,1204=>1022,1205=>807,1206=>928,1207=>739,1210=>910,1211=>727,1216=>468,1217=>1312,1218=>1010,1219=>869,1220=>693,1223=>945,1224=>732,1227=>913,1228=>732,1231=>380,1232=>814,1233=>648,1234=>814,1235=>648,1236=>1034,1237=>975,1238=>762,1239=>636,1240=>871,1241=>636,1242=>871,1243=>636,1244=>1312,1245=>1010,1246=>721,1247=>638,1248=>657,1249=>568,1250=>945,1251=>742,1252=>945,1253=>742,1254=>871,1255=>667,1256=>871,1257=>667,1258=>871,1259=>667,1260=>795,1261=>609,1262=>812,1263=>640,1264=>812,1265=>640,1266=>812,1267=>640,1268=>913,1269=>732,1270=>690,1271=>613,1272=>1202,1273=>1002,1296=>721,1297=>638,1298=>884,1299=>705,1300=>1248,1301=>945,1306=>820,1307=>640,1308=>1028,1309=>856,1329=>942,1330=>832,1331=>894,1332=>909,1333=>822,1334=>821,1335=>747,1336=>832,1337=>1125,1338=>894,1339=>803,1340=>722,1341=>1188,1342=>887,1343=>842,1344=>737,1345=>863,1346=>918,1347=>851,1348=>977,1349=>833,1350=>914,1351=>843,1352=>871,1353=>818,1354=>1034,1355=>846,1356=>964,1357=>871,1358=>914,1359=>808,1360=>808,1361=>836,1362=>710,1363=>955,1364=>891,1365=>871,1366=>963,1369=>307,1370=>264,1371=>293,1372=>391,1373=>323,1374=>439,1375=>500,1377=>1055,1378=>695,1379=>776,1380=>801,1381=>729,1382=>742,1383=>599,1384=>733,1385=>909,1386=>768,1387=>724,1388=>398,1389=>1087,1390=>695,1391=>719,1392=>737,1393=>684,1394=>738,1395=>703,1396=>724,1397=>359,1398=>719,1399=>496,1400=>738,1401=>428,1402=>1059,1403=>668,1404=>744,1405=>724,1406=>724,1407=>1040,1408=>724,1409=>713,1410=>493,1411=>1040,1412=>734,1413=>693,1414=>956,1415=>833,1417=>340,1418=>388,4256=>755,4257=>936,4258=>866,4259=>874,4260=>781,4261=>1078,4262=>1014,4263=>1213,4264=>643,4265=>818,4266=>1051,4267=>1051,4268=>796,4269=>1135,4270=>969,4271=>902,4272=>1109,4273=>792,4274=>756,4275=>1076,4276=>976,4277=>1066,4278=>811,4279=>833,4280=>821,4281=>833,4282=>908,4283=>1077,4284=>769,4285=>822,4286=>813,4287=>1111,4288=>1123,4289=>802,4290=>892,4291=>802,4292=>880,4293=>1063,4304=>594,4305=>625,4306=>643,4307=>887,4308=>615,4309=>611,4310=>667,4311=>915,4312=>613,4313=>600,4314=>1120,4315=>640,4316=>640,4317=>879,4318=>624,4319=>634,4320=>877,4321=>666,4322=>780,4323=>751,4324=>869,4325=>639,4326=>912,4327=>622,4328=>647,4329=>640,4330=>729,4331=>641,4332=>630,4333=>629,4334=>670,4335=>753,4336=>625,4337=>657,4338=>625,4339=>625,4340=>624,4341=>670,4342=>940,4343=>680,4344=>636,4345=>672,4346=>625,4347=>588,4348=>354,7424=>641,7425=>892,7426=>940,7427=>695,7428=>609,7429=>675,7430=>675,7431=>617,7432=>509,7433=>320,7434=>561,7435=>722,7436=>617,7437=>869,7438=>737,7439=>667,7440=>609,7441=>628,7442=>628,7443=>667,7444=>989,7445=>598,7446=>667,7447=>667,7448=>586,7449=>801,7450=>801,7451=>620,7452=>647,7453=>664,7454=>923,7455=>655,7456=>581,7457=>861,7458=>568,7459=>568,7460=>588,7461=>802,7462=>586,7463=>641,7464=>732,7465=>586,7466=>854,7467=>705,7468=>489,7469=>651,7470=>532,7471=>532,7472=>546,7473=>480,7474=>480,7475=>538,7476=>595,7477=>294,7478=>298,7479=>547,7480=>443,7481=>697,7482=>576,7483=>606,7484=>548,7485=>442,7486=>474,7487=>523,7488=>455,7489=>469,7490=>549,7491=>466,7492=>466,7493=>498,7494=>657,7495=>499,7496=>498,7497=>444,7498=>444,7499=>412,7500=>412,7501=>498,7502=>300,7503=>523,7504=>729,7505=>473,7506=>467,7507=>427,7508=>467,7509=>467,7510=>499,7511=>371,7512=>520,7513=>418,7514=>729,7515=>491,7516=>505,7517=>418,7518=>416,7519=>420,7520=>570,7521=>414,7522=>239,7523=>414,7524=>520,7525=>491,7526=>418,7527=>416,7528=>419,7529=>570,7530=>414,7531=>1041,7543=>640,7544=>595,7547=>380,7557=>380,7579=>498,7580=>427,7581=>427,7582=>467,7583=>412,7584=>383,7585=>373,7586=>498,7587=>522,7588=>300,7589=>307,7590=>300,7591=>300,7592=>370,7593=>368,7594=>321,7595=>430,7596=>682,7597=>729,7598=>588,7599=>587,7600=>472,7601=>467,7602=>522,7603=>400,7604=>387,7605=>371,7606=>520,7607=>475,7608=>408,7609=>489,7610=>491,7611=>412,7612=>527,7613=>412,7614=>452,7615=>467,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>776,7681=>648,7682=>845,7683=>699,7684=>845,7685=>699,7686=>845,7687=>699,7688=>796,7689=>609,7690=>867,7691=>699,7692=>867,7693=>699,7694=>867,7695=>699,7696=>867,7697=>699,7698=>867,7699=>699,7700=>762,7701=>636,7702=>762,7703=>636,7704=>762,7705=>636,7706=>762,7707=>636,7708=>762,7709=>636,7710=>710,7711=>430,7712=>854,7713=>699,7714=>945,7715=>727,7716=>945,7717=>727,7718=>945,7719=>727,7720=>945,7721=>727,7722=>945,7723=>727,7724=>468,7725=>380,7726=>468,7727=>380,7728=>869,7729=>693,7730=>869,7731=>693,7732=>869,7733=>693,7734=>703,7735=>380,7736=>703,7737=>380,7738=>703,7739=>380,7740=>703,7741=>380,7742=>1107,7743=>1058,7744=>1107,7745=>1058,7746=>1107,7747=>1058,7748=>914,7749=>727,7750=>914,7751=>727,7752=>914,7753=>727,7754=>914,7755=>727,7756=>871,7757=>667,7758=>871,7759=>667,7760=>871,7761=>667,7762=>871,7763=>667,7764=>752,7765=>699,7766=>752,7767=>699,7768=>831,7769=>527,7770=>831,7771=>527,7772=>831,7773=>527,7774=>831,7775=>527,7776=>722,7777=>563,7778=>722,7779=>563,7780=>722,7781=>563,7782=>722,7783=>563,7784=>722,7785=>563,7786=>744,7787=>462,7788=>744,7789=>462,7790=>744,7791=>462,7792=>744,7793=>462,7794=>872,7795=>727,7796=>872,7797=>727,7798=>872,7799=>727,7800=>872,7801=>727,7802=>872,7803=>727,7804=>776,7805=>581,7806=>776,7807=>581,7808=>1123,7809=>861,7810=>1123,7811=>861,7812=>1123,7813=>861,7814=>1123,7815=>861,7816=>1123,7817=>861,7818=>776,7819=>596,7820=>776,7821=>596,7822=>714,7823=>581,7824=>730,7825=>568,7826=>730,7827=>568,7828=>730,7829=>568,7830=>727,7831=>462,7832=>861,7833=>581,7834=>1014,7835=>430,7836=>430,7837=>430,7838=>947,7839=>667,7840=>776,7841=>648,7842=>776,7843=>648,7844=>776,7845=>648,7846=>776,7847=>648,7848=>776,7849=>648,7850=>776,7851=>648,7852=>776,7853=>648,7854=>776,7855=>648,7856=>776,7857=>648,7858=>776,7859=>648,7860=>776,7861=>648,7862=>776,7863=>648,7864=>762,7865=>636,7866=>762,7867=>636,7868=>762,7869=>636,7870=>762,7871=>636,7872=>762,7873=>636,7874=>762,7875=>636,7876=>762,7877=>636,7878=>762,7879=>636,7880=>468,7881=>380,7882=>468,7883=>380,7884=>871,7885=>667,7886=>871,7887=>667,7888=>871,7889=>667,7890=>871,7891=>667,7892=>871,7893=>667,7894=>871,7895=>667,7896=>871,7897=>667,7898=>871,7899=>667,7900=>871,7901=>667,7902=>871,7903=>667,7904=>871,7905=>667,7906=>871,7907=>667,7908=>872,7909=>727,7910=>872,7911=>727,7912=>872,7913=>727,7914=>872,7915=>727,7916=>872,7917=>727,7918=>872,7919=>727,7920=>872,7921=>727,7922=>714,7923=>581,7924=>714,7925=>581,7926=>714,7927=>581,7928=>714,7929=>581,7930=>1078,7931=>701,7936=>770,7937=>770,7938=>770,7939=>770,7940=>770,7941=>770,7942=>770,7943=>770,7944=>776,7945=>776,7946=>978,7947=>978,7948=>832,7949=>849,7950=>776,7951=>776,7952=>608,7953=>608,7954=>608,7955=>608,7956=>608,7957=>608,7960=>917,7961=>909,7962=>1169,7963=>1169,7964=>1093,7965=>1120,7968=>727,7969=>727,7970=>727,7971=>727,7972=>727,7973=>727,7974=>727,7975=>727,7976=>1100,7977=>1094,7978=>1358,7979=>1361,7980=>1279,7981=>1308,7982=>1197,7983=>1194,7984=>484,7985=>484,7986=>484,7987=>484,7988=>484,7989=>484,7990=>484,7991=>484,7992=>629,7993=>617,7994=>878,7995=>881,7996=>799,7997=>831,7998=>723,7999=>714,8000=>667,8001=>667,8002=>667,8003=>667,8004=>667,8005=>667,8008=>900,8009=>935,8010=>1240,8011=>1237,8012=>1035,8013=>1066,8016=>694,8017=>694,8018=>694,8019=>694,8020=>694,8021=>694,8022=>694,8023=>694,8025=>922,8027=>1186,8029=>1133,8031=>1019,8032=>952,8033=>952,8034=>952,8035=>952,8036=>952,8037=>952,8038=>952,8039=>952,8040=>931,8041=>963,8042=>1268,8043=>1274,8044=>1054,8045=>1088,8046=>1023,8047=>1060,8048=>770,8049=>770,8050=>608,8051=>608,8052=>727,8053=>727,8054=>484,8055=>484,8056=>667,8057=>667,8058=>694,8059=>694,8060=>952,8061=>952,8064=>770,8065=>770,8066=>770,8067=>770,8068=>770,8069=>770,8070=>770,8071=>770,8072=>776,8073=>776,8074=>978,8075=>978,8076=>832,8077=>849,8078=>776,8079=>776,8080=>727,8081=>727,8082=>727,8083=>727,8084=>727,8085=>727,8086=>727,8087=>727,8088=>1100,8089=>1094,8090=>1358,8091=>1361,8092=>1279,8093=>1308,8094=>1197,8095=>1194,8096=>952,8097=>952,8098=>952,8099=>952,8100=>952,8101=>952,8102=>952,8103=>952,8104=>931,8105=>963,8106=>1268,8107=>1274,8108=>1054,8109=>1088,8110=>1023,8111=>1060,8112=>770,8113=>770,8114=>770,8115=>770,8116=>770,8118=>770,8119=>770,8120=>776,8121=>776,8122=>811,8123=>776,8124=>776,8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>727,8131=>727,8132=>727,8134=>727,8135=>727,8136=>1000,8137=>947,8138=>1191,8139=>1118,8140=>945,8141=>500,8142=>500,8143=>500,8144=>484,8145=>484,8146=>484,8147=>484,8150=>484,8151=>484,8152=>468,8153=>468,8154=>714,8155=>662,8157=>500,8158=>500,8159=>500,8160=>694,8161=>694,8162=>694,8163=>694,8164=>665,8165=>665,8166=>694,8167=>694,8168=>714,8169=>714,8170=>1019,8171=>953,8172=>910,8173=>500,8174=>500,8175=>500,8178=>952,8179=>952,8180=>952,8182=>952,8183=>952,8184=>1069,8185=>887,8186=>1101,8187=>911,8188=>890,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>696,8200=>348,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>415,8209=>415,8210=>696,8211=>500,8212=>1000,8213=>1000,8214=>500,8215=>500,8216=>348,8217=>348,8218=>348,8219=>348,8220=>575,8221=>575,8222=>575,8223=>575,8224=>523,8225=>523,8226=>639,8227=>639,8228=>348,8229=>674,8230=>1000,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200,8240=>1385,8241=>1820,8242=>264,8243=>447,8244=>630,8245=>264,8246=>447,8247=>630,8248=>733,8249=>400,8250=>400,8252=>629,8253=>586,8254=>500,8258=>1023,8260=>167,8261=>473,8262=>473,8263=>1082,8264=>856,8265=>856,8267=>636,8268=>500,8269=>500,8270=>523,8271=>369,8273=>523,8274=>556,8275=>1000,8279=>813,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>438,8305=>239,8308=>438,8309=>438,8310=>438,8311=>438,8312=>438,8313=>438,8314=>528,8315=>528,8316=>528,8317=>298,8318=>298,8319=>519,8320=>438,8321=>438,8322=>438,8323=>438,8324=>438,8325=>438,8326=>438,8327=>438,8328=>438,8329=>438,8330=>528,8331=>528,8332=>528,8333=>298,8334=>298,8336=>466,8337=>444,8338=>467,8339=>475,8340=>444,8341=>521,8342=>523,8343=>292,8344=>729,8345=>519,8346=>499,8347=>395,8348=>371,8358=>696,8364=>696,8367=>1155,8369=>790,8372=>876,8373=>696,8377=>696,8451=>1198,8457=>1112,8462=>727,8463=>727,8470=>1087,8482=>1000,8486=>890,8487=>890,8490=>869,8491=>776,8513=>775,8514=>557,8515=>637,8516=>760,8523=>903,8528=>1035,8529=>1035,8530=>1473,8531=>1035,8532=>1035,8533=>1035,8534=>1035,8535=>1035,8536=>1035,8537=>1035,8538=>1035,8539=>1035,8540=>1035,8541=>1035,8542=>1035,8543=>615,8544=>468,8545=>736,8546=>1005,8547=>1093,8548=>776,8549=>1127,8550=>1396,8551=>1664,8552=>1069,8553=>776,8554=>1078,8555=>1347,8556=>703,8557=>796,8558=>867,8559=>1107,8560=>380,8561=>760,8562=>1140,8563=>961,8564=>581,8565=>961,8566=>1341,8567=>1721,8568=>976,8569=>596,8570=>976,8571=>1356,8572=>380,8573=>609,8574=>699,8575=>1058,8576=>1255,8577=>867,8578=>1268,8579=>796,8580=>609,8581=>796,8585=>1035,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838,8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838,8620=>838,8621=>838,8622=>838,8623=>850,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838,8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838,8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838,8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838,8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838,8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838,8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838,8700=>838,8701=>838,8702=>838,8703=>838,8704=>641,8706=>534,8707=>620,8708=>620,8710=>753,8711=>753,8712=>740,8713=>740,8715=>740,8716=>740,8719=>842,8720=>842,8721=>753,8722=>838,8723=>838,8724=>838,8725=>365,8727=>691,8728=>519,8729=>519,8730=>657,8731=>657,8732=>657,8733=>672,8734=>833,8735=>838,8736=>838,8739=>324,8740=>607,8741=>529,8742=>773,8743=>812,8744=>812,8745=>838,8746=>838,8747=>579,8748=>1000,8749=>1391,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838,8770=>838,8771=>838,8776=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1082,8789=>1082,8800=>838,8801=>838,8804=>838,8805=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8844=>838,8845=>838,8846=>838,8847=>838,8848=>838,8849=>838,8850=>838,8851=>838,8852=>838,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838,8865=>838,8866=>884,8867=>884,8868=>960,8869=>960,8870=>616,8871=>616,8872=>884,8873=>884,8874=>884,8875=>1080,8876=>884,8877=>884,8878=>884,8879=>1080,8901=>398,8962=>834,8968=>473,8969=>473,8970=>473,8971=>473,8976=>838,8977=>539,8984=>928,8985=>838,8992=>579,8993=>579,8997=>1000,9000=>1443,9085=>1008,9115=>500,9116=>500,9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500,9125=>500,9126=>500,9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>579,9167=>945,9251=>834,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527,9687=>527,9688=>791,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>873,9697=>873,9698=>769,9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945,9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732,9727=>769,9728=>896,9784=>896,9785=>896,9786=>896,9787=>896,9788=>896,9791=>614,9792=>731,9793=>731,9794=>896,9795=>896,9796=>896,9797=>896,9798=>896,9799=>896,9824=>896,9825=>896,9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472,9838=>357,9839=>484,10145=>838,10181=>457,10182=>457,10208=>494,10216=>457,10217=>457,10224=>838,10225=>838,10226=>838,10227=>838,10228=>1033,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434,10237=>1434,10238=>1434,10239=>1434,10240=>781,10241=>781,10242=>781,10243=>781,10244=>781,10245=>781,10246=>781,10247=>781,10248=>781,10249=>781,10250=>781,10251=>781,10252=>781,10253=>781,10254=>781,10255=>781,10256=>781,10257=>781,10258=>781,10259=>781,10260=>781,10261=>781,10262=>781,10263=>781,10264=>781,10265=>781,10266=>781,10267=>781,10268=>781,10269=>781,10270=>781,10271=>781,10272=>781,10273=>781,10274=>781,10275=>781,10276=>781,10277=>781,10278=>781,10279=>781,10280=>781,10281=>781,10282=>781,10283=>781,10284=>781,10285=>781,10286=>781,10287=>781,10288=>781,10289=>781,10290=>781,10291=>781,10292=>781,10293=>781,10294=>781,10295=>781,10296=>781,10297=>781,10298=>781,10299=>781,10300=>781,10301=>781,10302=>781,10303=>781,10304=>781,10305=>781,10306=>781,10307=>781,10308=>781,10309=>781,10310=>781,10311=>781,10312=>781,10313=>781,10314=>781,10315=>781,10316=>781,10317=>781,10318=>781,10319=>781,10320=>781,10321=>781,10322=>781,10323=>781,10324=>781,10325=>781,10326=>781,10327=>781,10328=>781,10329=>781,10330=>781,10331=>781,10332=>781,10333=>781,10334=>781,10335=>781,10336=>781,10337=>781,10338=>781,10339=>781,10340=>781,10341=>781,10342=>781,10343=>781,10344=>781,10345=>781,10346=>781,10347=>781,10348=>781,10349=>781,10350=>781,10351=>781,10352=>781,10353=>781,10354=>781,10355=>781,10356=>781,10357=>781,10358=>781,10359=>781,10360=>781,10361=>781,10362=>781,10363=>781,10364=>781,10365=>781,10366=>781,10367=>781,10368=>781,10369=>781,10370=>781,10371=>781,10372=>781,10373=>781,10374=>781,10375=>781,10376=>781,10377=>781,10378=>781,10379=>781,10380=>781,10381=>781,10382=>781,10383=>781,10384=>781,10385=>781,10386=>781,10387=>781,10388=>781,10389=>781,10390=>781,10391=>781,10392=>781,10393=>781,10394=>781,10395=>781,10396=>781,10397=>781,10398=>781,10399=>781,10400=>781,10401=>781,10402=>781,10403=>781,10404=>781,10405=>781,10406=>781,10407=>781,10408=>781,10409=>781,10410=>781,10411=>781,10412=>781,10413=>781,10414=>781,10415=>781,10416=>781,10417=>781,10418=>781,10419=>781,10420=>781,10421=>781,10422=>781,10423=>781,10424=>781,10425=>781,10426=>781,10427=>781,10428=>781,10429=>781,10430=>781,10431=>781,10432=>781,10433=>781,10434=>781,10435=>781,10436=>781,10437=>781,10438=>781,10439=>781,10440=>781,10441=>781,10442=>781,10443=>781,10444=>781,10445=>781,10446=>781,10447=>781,10448=>781,10449=>781,10450=>781,10451=>781,10452=>781,10453=>781,10454=>781,10455=>781,10456=>781,10457=>781,10458=>781,10459=>781,10460=>781,10461=>781,10462=>781,10463=>781,10464=>781,10465=>781,10466=>781,10467=>781,10468=>781,10469=>781,10470=>781,10471=>781,10472=>781,10473=>781,10474=>781,10475=>781,10476=>781,10477=>781,10478=>781,10479=>781,10480=>781,10481=>781,10482=>781,10483=>781,10484=>781,10485=>781,10486=>781,10487=>781,10488=>781,10489=>781,10490=>781,10491=>781,10492=>781,10493=>781,10494=>781,10495=>781,10496=>838,10497=>838,10498=>838,10499=>838,10500=>838,10501=>838,10502=>838,10503=>838,10504=>838,10505=>838,10506=>838,10507=>838,10508=>838,10509=>838,10510=>838,10511=>838,10512=>838,10513=>838,10514=>838,10515=>838,10516=>838,10517=>838,10518=>838,10519=>838,10520=>838,10521=>838,10522=>838,10523=>838,10524=>838,10525=>838,10526=>838,10527=>838,10528=>838,10529=>838,10530=>838,10531=>838,10532=>838,10533=>838,10534=>838,10535=>838,10536=>838,10537=>838,10538=>838,10539=>838,10540=>838,10541=>838,10542=>838,10543=>838,10544=>838,10545=>838,10546=>838,10547=>838,10548=>838,10549=>838,10550=>838,10551=>838,10552=>838,10553=>838,10554=>838,10555=>838,10556=>838,10557=>838,10558=>838,10559=>838,10560=>838,10561=>838,10562=>838,10563=>838,10564=>838,10565=>838,10566=>838,10567=>838,10568=>838,10569=>838,10570=>838,10571=>838,10572=>838,10573=>838,10574=>838,10575=>838,10576=>838,10577=>838,10578=>838,10579=>838,10580=>838,10581=>838,10582=>838,10583=>838,10584=>838,10585=>838,10586=>838,10587=>838,10588=>838,10589=>838,10590=>838,10591=>838,10592=>838,10593=>838,10594=>838,10595=>838,10596=>838,10597=>838,10598=>838,10599=>838,10600=>838,10601=>838,10602=>838,10603=>838,10604=>838,10605=>838,10606=>838,10607=>838,10608=>838,10609=>838,10610=>838,10611=>838,10612=>838,10613=>838,10614=>838,10615=>1032,10616=>838,10617=>838,10618=>960,10619=>838,10620=>838,10621=>838,10622=>838,10623=>838,10731=>494,10764=>1782,10765=>610,10766=>610,10799=>838,11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838,11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838,11026=>945,11027=>945,11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11360=>703,11361=>380,11363=>752,11364=>831,11367=>945,11368=>727,11369=>869,11370=>693,11371=>730,11372=>568,11373=>848,11374=>1107,11375=>776,11376=>848,11377=>709,11378=>1221,11379=>984,11381=>779,11382=>601,11383=>905,11385=>571,11386=>667,11388=>313,11389=>489,11390=>722,11391=>730,11520=>773,11521=>635,11522=>804,11523=>658,11524=>788,11525=>962,11526=>756,11527=>960,11528=>617,11529=>646,11530=>962,11531=>631,11532=>646,11533=>962,11534=>846,11535=>866,11536=>961,11537=>645,11538=>645,11539=>959,11540=>945,11541=>863,11542=>644,11543=>646,11544=>645,11545=>649,11546=>688,11547=>936,11548=>982,11549=>681,11550=>676,11551=>852,11552=>1113,11553=>632,11554=>645,11555=>646,11556=>749,11557=>914,11800=>586,11810=>473,11811=>473,11812=>473,11813=>473,11822=>586,42564=>722,42565=>563,42566=>468,42567=>380,42576=>1333,42577=>1092,42580=>1287,42581=>1025,42582=>1287,42583=>1039,42760=>500,42761=>500,42762=>500,42763=>500,42764=>500,42765=>500,42766=>500,42767=>500,42768=>500,42769=>500,42770=>500,42771=>500,42772=>500,42773=>500,42774=>500,42779=>384,42780=>384,42781=>276,42782=>276,42783=>276,42790=>945,42791=>712,42792=>1003,42793=>909,42794=>696,42795=>609,42796=>634,42797=>598,42798=>741,42799=>706,42800=>592,42801=>563,42802=>1301,42803=>986,42804=>1261,42805=>1004,42806=>1168,42807=>1008,42808=>1016,42809=>813,42810=>1016,42811=>813,42812=>994,42813=>847,42814=>796,42815=>609,42822=>916,42823=>581,42826=>1010,42827=>770,42830=>1448,42831=>1060,42856=>787,42857=>716,42875=>694,42876=>527,42880=>703,42881=>380,42882=>872,42883=>727,42884=>694,42885=>527,42886=>796,42887=>609,42891=>439,42892=>306,42893=>913,42896=>914,42897=>727,43002=>1069,43003=>710,43004=>752,43005=>1107,43006=>468,43007=>1286,62464=>705,62465=>716,62466=>765,62467=>999,62468=>716,62469=>710,62470=>776,62471=>1038,62472=>716,62473=>716,62474=>1309,62475=>734,62476=>733,62477=>1004,62478=>716,62479=>733,62480=>1050,62481=>797,62482=>850,62483=>799,62484=>996,62485=>732,62486=>987,62487=>731,62488=>739,62489=>733,62490=>780,62491=>733,62492=>739,62493=>717,62494=>780,62495=>936,62496=>716,62497=>826,62498=>717,62499=>716,62500=>716,62501=>773,62502=>1013,62504=>904,63173=>667,63185=>500,63188=>500,64256=>821,64257=>727,64258=>727,64259=>1120,64260=>1117,64261=>871,64262=>971,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1113,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifb.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifb.z
new file mode 100644
index 00000000..b370b4bc
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifb.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifbi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifbi.ctg.z
new file mode 100644
index 00000000..eac5b937
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifbi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifbi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifbi.php
new file mode 100644
index 00000000..b7e5a6ea
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifbi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSerif-BoldItalic';
+$up=-63;
+$ut=44;
+$dw=600;
+$diff='';
+$originalsize=332036;
+$enc='';
+$file='dejavuserifbi.z';
+$ctg='dejavuserifbi.ctg.z';
+$desc=array('Flags'=>96,'FontBBox'=>'[-906 -389 1754 1145]','ItalicAngle'=>-11,'Ascent'=>939,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>519,'StemV'=>60,'StemH'=>26,'AvgWidth'=>566,'MaxWidth'=>1813,'MissingWidth'=>600);
+$cw=array(0=>600,32=>348,33=>439,34=>521,35=>838,36=>696,37=>950,38=>903,39=>306,40=>473,41=>473,42=>523,43=>838,44=>348,45=>415,46=>348,47=>365,48=>696,49=>696,50=>696,51=>696,52=>696,53=>696,54=>696,55=>696,56=>696,57=>696,58=>369,59=>369,60=>838,61=>838,62=>838,63=>586,64=>1000,65=>776,66=>845,67=>796,68=>867,69=>762,70=>710,71=>854,72=>945,73=>468,74=>473,75=>869,76=>703,77=>1107,78=>914,79=>871,80=>752,81=>871,82=>831,83=>722,84=>744,85=>872,86=>776,87=>1123,88=>776,89=>714,90=>730,91=>473,92=>365,93=>473,94=>838,95=>500,96=>500,97=>648,98=>699,99=>609,100=>699,101=>636,102=>430,103=>699,104=>727,105=>380,106=>362,107=>693,108=>380,109=>1058,110=>727,111=>667,112=>699,113=>699,114=>527,115=>563,116=>462,117=>727,118=>581,119=>861,120=>596,121=>581,122=>568,123=>643,124=>364,125=>643,126=>838,160=>348,161=>439,162=>696,163=>696,164=>636,165=>696,166=>364,167=>523,168=>500,169=>1000,170=>487,171=>625,172=>838,173=>415,174=>1000,175=>500,176=>500,177=>838,178=>438,179=>438,180=>500,181=>732,182=>636,183=>348,184=>500,185=>438,186=>500,187=>625,188=>1043,189=>1043,190=>1043,191=>586,192=>776,193=>776,194=>776,195=>776,196=>776,197=>776,198=>1034,199=>796,200=>762,201=>762,202=>762,203=>762,204=>468,205=>468,206=>468,207=>468,208=>874,209=>914,210=>871,211=>871,212=>871,213=>871,214=>871,215=>838,216=>871,217=>872,218=>872,219=>872,220=>872,221=>714,222=>757,223=>760,224=>648,225=>648,226=>648,227=>648,228=>648,229=>648,230=>932,231=>609,232=>636,233=>636,234=>636,235=>636,236=>380,237=>380,238=>380,239=>380,240=>667,241=>727,242=>667,243=>667,244=>667,245=>667,246=>667,247=>838,248=>667,249=>727,250=>727,251=>727,252=>727,253=>581,254=>699,255=>581,256=>776,257=>648,258=>776,259=>648,260=>776,261=>648,262=>796,263=>609,264=>796,265=>609,266=>796,267=>609,268=>796,269=>609,270=>867,271=>699,272=>874,273=>699,274=>762,275=>636,276=>762,277=>636,278=>762,279=>636,280=>762,281=>636,282=>762,283=>636,284=>854,285=>699,286=>854,287=>699,288=>854,289=>699,290=>854,291=>699,292=>945,293=>727,294=>945,295=>727,296=>468,297=>380,298=>468,299=>380,300=>468,301=>380,302=>468,303=>380,304=>468,305=>380,306=>942,307=>751,308=>473,309=>362,310=>869,311=>693,312=>693,313=>703,314=>380,315=>703,316=>380,317=>703,318=>508,319=>703,320=>557,321=>710,322=>385,323=>914,324=>727,325=>914,326=>727,327=>914,328=>727,329=>1008,330=>872,331=>727,332=>871,333=>667,334=>871,335=>667,336=>871,337=>667,338=>1180,339=>1028,340=>831,341=>527,342=>831,343=>527,344=>831,345=>527,346=>722,347=>563,348=>722,349=>563,350=>722,351=>563,352=>722,353=>563,354=>744,355=>462,356=>744,357=>462,358=>744,359=>462,360=>872,361=>727,362=>872,363=>727,364=>872,365=>727,366=>872,367=>727,368=>872,369=>727,370=>872,371=>727,372=>1123,373=>861,374=>714,375=>581,376=>714,377=>730,378=>568,379=>730,380=>568,381=>730,382=>568,383=>430,384=>699,385=>845,386=>854,387=>699,388=>854,389=>699,390=>796,391=>796,392=>609,393=>874,394=>867,395=>854,396=>699,397=>667,398=>762,399=>871,400=>721,401=>710,402=>430,403=>854,404=>771,405=>1043,406=>468,407=>468,408=>869,409=>693,410=>380,411=>701,412=>1058,413=>914,414=>727,415=>871,416=>871,417=>667,418=>1200,419=>943,420=>752,421=>699,422=>831,423=>722,424=>563,425=>707,426=>331,427=>462,428=>744,429=>462,430=>744,431=>872,432=>727,433=>890,434=>890,435=>714,436=>699,437=>730,438=>568,439=>657,440=>657,441=>657,442=>657,443=>696,444=>754,445=>568,446=>536,447=>716,448=>295,449=>492,450=>459,451=>295,452=>1597,453=>1435,454=>1267,455=>1176,456=>1065,457=>742,458=>1387,459=>1276,460=>1089,461=>776,462=>648,463=>468,464=>380,465=>871,466=>667,467=>872,468=>727,469=>872,470=>727,471=>872,472=>727,473=>872,474=>727,475=>872,476=>727,477=>636,478=>776,479=>648,480=>776,481=>648,482=>1034,483=>975,484=>896,485=>699,486=>854,487=>699,488=>869,489=>693,490=>871,491=>667,492=>871,493=>667,494=>657,495=>568,496=>362,497=>1597,498=>1435,499=>1267,500=>854,501=>699,502=>1221,503=>787,504=>914,505=>727,506=>776,507=>648,508=>1034,509=>932,510=>871,511=>667,512=>776,513=>648,514=>776,515=>648,516=>762,517=>636,518=>762,519=>636,520=>468,521=>380,522=>468,523=>380,524=>871,525=>667,526=>871,527=>667,528=>831,529=>527,530=>831,531=>527,532=>872,533=>727,534=>872,535=>727,536=>722,537=>563,538=>744,539=>462,540=>690,541=>607,542=>945,543=>727,544=>872,545=>791,546=>703,547=>616,548=>730,549=>568,550=>776,551=>648,552=>762,553=>636,554=>871,555=>667,556=>871,557=>667,558=>871,559=>667,560=>871,561=>667,562=>714,563=>581,564=>573,565=>922,566=>564,567=>362,568=>1031,569=>1031,570=>776,571=>796,572=>609,573=>703,574=>744,575=>563,576=>568,577=>660,578=>547,579=>845,580=>872,581=>776,582=>762,583=>636,584=>473,585=>387,586=>848,587=>699,588=>831,589=>527,590=>714,591=>581,592=>648,593=>770,594=>770,595=>699,596=>609,597=>609,598=>699,599=>730,600=>636,601=>636,602=>907,603=>608,604=>562,605=>907,606=>720,607=>387,608=>699,609=>699,610=>626,611=>712,612=>627,613=>727,614=>727,615=>727,616=>380,617=>380,618=>380,619=>409,620=>514,621=>380,622=>795,623=>1058,624=>1058,625=>1058,626=>727,627=>727,628=>712,629=>667,630=>1061,631=>749,632=>667,633=>571,634=>571,635=>571,636=>527,637=>527,638=>452,639=>487,640=>801,641=>801,642=>563,643=>331,644=>430,645=>540,646=>331,647=>492,648=>462,649=>727,650=>679,651=>694,652=>581,653=>861,654=>635,655=>727,656=>568,657=>568,658=>568,659=>568,660=>536,661=>536,662=>536,663=>545,664=>871,665=>695,666=>720,667=>626,668=>732,669=>384,670=>740,671=>617,672=>699,673=>536,674=>536,675=>1117,676=>1179,677=>1117,678=>911,679=>715,680=>909,681=>1039,682=>790,683=>795,684=>662,685=>443,686=>613,687=>717,688=>521,689=>519,690=>313,691=>414,692=>414,693=>480,694=>527,695=>542,696=>366,697=>302,699=>348,700=>348,701=>348,702=>366,703=>366,704=>313,705=>313,710=>500,711=>500,712=>282,713=>500,716=>282,717=>500,720=>369,721=>369,722=>366,723=>366,726=>392,728=>500,729=>500,730=>500,731=>500,732=>500,733=>500,734=>417,736=>448,737=>292,738=>395,739=>375,740=>313,741=>500,742=>500,743=>500,744=>500,745=>500,750=>553,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>779,881=>576,882=>803,883=>777,884=>302,885=>302,886=>963,887=>737,890=>500,891=>609,892=>609,893=>609,894=>369,900=>500,901=>500,902=>776,903=>348,904=>947,905=>1136,906=>662,908=>887,910=>953,911=>911,912=>484,913=>776,914=>845,915=>710,916=>776,917=>762,918=>730,919=>945,920=>871,921=>468,922=>869,923=>776,924=>1107,925=>914,926=>704,927=>871,928=>945,929=>752,931=>707,932=>744,933=>714,934=>871,935=>776,936=>913,937=>890,938=>468,939=>714,940=>770,941=>608,942=>727,943=>484,944=>694,945=>770,946=>664,947=>660,948=>667,949=>608,950=>592,951=>727,952=>667,953=>484,954=>750,955=>701,956=>732,957=>694,958=>592,959=>667,960=>732,961=>665,962=>609,963=>737,964=>673,965=>694,966=>905,967=>658,968=>941,969=>952,970=>484,971=>694,972=>667,973=>694,974=>952,975=>869,976=>667,977=>849,978=>764,979=>969,980=>764,981=>941,982=>952,983=>655,984=>871,985=>667,986=>796,987=>609,988=>710,989=>527,990=>590,991=>660,992=>796,993=>667,1008=>655,1009=>665,1010=>609,1011=>362,1012=>871,1013=>609,1014=>609,1015=>757,1016=>699,1017=>796,1018=>1107,1019=>860,1020=>692,1021=>796,1022=>796,1023=>796,1024=>762,1025=>762,1026=>901,1027=>690,1028=>795,1029=>722,1030=>468,1031=>468,1032=>473,1033=>1202,1034=>1262,1035=>963,1036=>910,1037=>945,1038=>812,1039=>945,1040=>814,1041=>854,1042=>845,1043=>690,1044=>889,1045=>762,1046=>1312,1047=>721,1048=>945,1049=>945,1050=>910,1051=>884,1052=>1107,1053=>945,1054=>871,1055=>945,1056=>752,1057=>796,1058=>744,1059=>812,1060=>949,1061=>776,1062=>966,1063=>913,1064=>1268,1065=>1293,1066=>957,1067=>1202,1068=>825,1069=>795,1070=>1287,1071=>882,1072=>648,1073=>722,1074=>657,1075=>563,1076=>695,1077=>636,1078=>1306,1079=>638,1080=>727,1081=>727,1082=>677,1083=>732,1084=>951,1085=>729,1086=>667,1087=>727,1088=>699,1089=>609,1090=>1058,1091=>598,1092=>902,1093=>596,1094=>803,1095=>715,1096=>1058,1097=>1134,1098=>727,1099=>1018,1100=>660,1101=>645,1102=>1001,1103=>796,1104=>636,1105=>636,1106=>719,1107=>563,1108=>609,1109=>563,1110=>380,1111=>380,1112=>362,1113=>1014,1114=>1011,1115=>727,1116=>677,1117=>727,1118=>598,1119=>727,1122=>880,1123=>1050,1124=>1195,1125=>963,1130=>1312,1131=>1010,1136=>1096,1137=>1105,1138=>871,1139=>652,1140=>916,1141=>749,1164=>846,1165=>673,1168=>700,1169=>618,1170=>690,1171=>563,1172=>854,1173=>705,1174=>1312,1175=>1306,1176=>721,1177=>638,1178=>902,1179=>703,1182=>910,1183=>677,1184=>1041,1185=>760,1186=>952,1187=>805,1188=>1167,1189=>955,1190=>1324,1191=>1013,1194=>796,1195=>609,1196=>744,1197=>1142,1198=>714,1199=>572,1200=>713,1201=>572,1202=>789,1203=>596,1204=>1010,1205=>833,1206=>913,1207=>792,1210=>910,1211=>727,1216=>468,1217=>1312,1218=>1306,1219=>869,1220=>693,1223=>945,1224=>732,1227=>984,1228=>732,1231=>380,1232=>814,1233=>648,1234=>814,1235=>648,1236=>1034,1237=>975,1238=>762,1239=>636,1240=>871,1241=>636,1242=>871,1243=>636,1244=>1312,1245=>1306,1246=>721,1247=>638,1248=>657,1249=>568,1250=>945,1251=>727,1252=>945,1253=>727,1254=>871,1255=>667,1256=>871,1257=>667,1258=>871,1259=>667,1260=>795,1261=>645,1262=>812,1263=>598,1264=>812,1265=>598,1266=>812,1267=>598,1268=>913,1269=>715,1270=>690,1271=>563,1272=>1202,1273=>1018,1296=>721,1297=>638,1298=>884,1299=>732,1300=>1248,1301=>1005,1306=>820,1307=>640,1308=>1028,1309=>856,1329=>942,1330=>832,1331=>894,1332=>909,1333=>822,1334=>821,1335=>747,1336=>832,1337=>1125,1338=>894,1339=>803,1340=>722,1341=>1188,1342=>887,1343=>842,1344=>737,1345=>863,1346=>918,1347=>851,1348=>977,1349=>833,1350=>914,1351=>843,1352=>871,1353=>818,1354=>1034,1355=>846,1356=>964,1357=>871,1358=>914,1359=>808,1360=>808,1361=>836,1362=>710,1363=>955,1364=>891,1365=>871,1366=>963,1369=>307,1370=>264,1371=>293,1372=>391,1373=>323,1374=>439,1375=>500,1377=>1055,1378=>695,1379=>776,1380=>801,1381=>729,1382=>742,1383=>599,1384=>733,1385=>909,1386=>768,1387=>724,1388=>398,1389=>1087,1390=>695,1391=>719,1392=>737,1393=>684,1394=>738,1395=>703,1396=>724,1397=>359,1398=>719,1399=>496,1400=>738,1401=>428,1402=>1059,1403=>668,1404=>744,1405=>724,1406=>724,1407=>1040,1408=>724,1409=>713,1410=>493,1411=>1040,1412=>734,1413=>693,1414=>956,1415=>833,1417=>340,1418=>388,4256=>765,4257=>945,4258=>876,4259=>884,4260=>791,4261=>1087,4262=>1024,4263=>1223,4264=>653,4265=>828,4266=>1061,4267=>1061,4268=>806,4269=>1145,4270=>979,4271=>912,4272=>1119,4273=>802,4274=>766,4275=>1085,4276=>986,4277=>1076,4278=>820,4279=>843,4280=>831,4281=>843,4282=>918,4283=>1086,4284=>779,4285=>832,4286=>822,4287=>1121,4288=>1132,4289=>812,4290=>902,4291=>812,4292=>890,4293=>1073,4304=>594,4305=>625,4306=>643,4307=>887,4308=>615,4309=>611,4310=>666,4311=>915,4312=>613,4313=>600,4314=>1120,4315=>654,4316=>640,4317=>879,4318=>624,4319=>634,4320=>877,4321=>657,4322=>802,4323=>751,4324=>869,4325=>639,4326=>912,4327=>622,4328=>647,4329=>640,4330=>729,4331=>641,4332=>639,4333=>629,4334=>674,4335=>737,4336=>625,4337=>657,4338=>625,4339=>625,4340=>624,4341=>670,4342=>940,4343=>680,4344=>636,4345=>672,4346=>625,4347=>446,4348=>363,7424=>641,7425=>892,7426=>932,7427=>695,7428=>609,7429=>675,7430=>675,7431=>617,7432=>509,7433=>320,7434=>561,7435=>722,7436=>617,7437=>869,7438=>737,7439=>667,7440=>609,7441=>628,7442=>628,7443=>667,7444=>1028,7445=>598,7446=>667,7447=>667,7448=>586,7449=>801,7450=>801,7451=>620,7452=>647,7453=>664,7454=>923,7455=>655,7456=>581,7457=>861,7458=>568,7459=>568,7460=>588,7461=>802,7462=>586,7463=>641,7464=>732,7465=>586,7466=>854,7467=>705,7468=>489,7469=>651,7470=>532,7471=>532,7472=>546,7473=>480,7474=>480,7475=>538,7476=>595,7477=>294,7478=>298,7479=>547,7480=>443,7481=>697,7482=>576,7483=>606,7484=>548,7485=>442,7486=>474,7487=>523,7488=>469,7489=>549,7490=>708,7491=>408,7492=>408,7493=>484,7494=>587,7495=>499,7496=>498,7497=>444,7498=>444,7499=>412,7500=>412,7501=>498,7502=>300,7503=>523,7504=>729,7505=>473,7506=>467,7507=>427,7508=>467,7509=>467,7510=>499,7511=>371,7512=>520,7513=>418,7514=>729,7515=>491,7516=>505,7517=>418,7518=>416,7519=>420,7520=>570,7521=>414,7522=>239,7523=>414,7524=>520,7525=>491,7526=>418,7527=>416,7528=>419,7529=>570,7530=>414,7531=>1042,7543=>640,7544=>595,7547=>380,7557=>380,7579=>484,7580=>427,7581=>427,7582=>467,7583=>412,7584=>271,7585=>373,7586=>498,7587=>522,7588=>300,7589=>307,7590=>300,7591=>300,7592=>370,7593=>368,7594=>321,7595=>430,7596=>682,7597=>729,7598=>588,7599=>587,7600=>472,7601=>467,7602=>522,7603=>400,7604=>387,7605=>371,7606=>520,7607=>475,7608=>408,7609=>489,7610=>366,7611=>357,7612=>527,7613=>412,7614=>452,7615=>467,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>776,7681=>648,7682=>845,7683=>699,7684=>845,7685=>699,7686=>845,7687=>699,7688=>796,7689=>609,7690=>867,7691=>699,7692=>867,7693=>699,7694=>867,7695=>699,7696=>867,7697=>699,7698=>867,7699=>699,7700=>762,7701=>636,7702=>762,7703=>636,7704=>762,7705=>636,7706=>762,7707=>636,7708=>762,7709=>636,7710=>710,7711=>430,7712=>854,7713=>699,7714=>945,7715=>727,7716=>945,7717=>727,7718=>945,7719=>727,7720=>945,7721=>727,7722=>945,7723=>727,7724=>468,7725=>380,7726=>468,7727=>380,7728=>869,7729=>693,7730=>869,7731=>693,7732=>869,7733=>693,7734=>703,7735=>380,7736=>703,7737=>380,7738=>703,7739=>380,7740=>703,7741=>380,7742=>1107,7743=>1058,7744=>1107,7745=>1058,7746=>1107,7747=>1058,7748=>914,7749=>727,7750=>914,7751=>727,7752=>914,7753=>727,7754=>914,7755=>727,7756=>871,7757=>667,7758=>871,7759=>667,7760=>871,7761=>667,7762=>871,7763=>667,7764=>752,7765=>699,7766=>752,7767=>699,7768=>831,7769=>527,7770=>831,7771=>527,7772=>831,7773=>527,7774=>831,7775=>527,7776=>722,7777=>563,7778=>722,7779=>563,7780=>722,7781=>563,7782=>722,7783=>563,7784=>722,7785=>563,7786=>744,7787=>462,7788=>744,7789=>462,7790=>744,7791=>462,7792=>744,7793=>462,7794=>872,7795=>727,7796=>872,7797=>727,7798=>872,7799=>727,7800=>872,7801=>727,7802=>872,7803=>727,7804=>776,7805=>581,7806=>776,7807=>581,7808=>1123,7809=>861,7810=>1123,7811=>861,7812=>1123,7813=>861,7814=>1123,7815=>861,7816=>1123,7817=>861,7818=>776,7819=>596,7820=>776,7821=>596,7822=>714,7823=>581,7824=>730,7825=>568,7826=>730,7827=>568,7828=>730,7829=>568,7830=>727,7831=>462,7832=>861,7833=>581,7834=>1014,7835=>430,7836=>430,7837=>430,7838=>947,7839=>667,7840=>776,7841=>648,7842=>776,7843=>648,7844=>776,7845=>648,7846=>776,7847=>648,7848=>776,7849=>648,7850=>776,7851=>648,7852=>776,7853=>648,7854=>776,7855=>648,7856=>776,7857=>648,7858=>776,7859=>648,7860=>776,7861=>648,7862=>776,7863=>648,7864=>762,7865=>636,7866=>762,7867=>636,7868=>762,7869=>636,7870=>762,7871=>636,7872=>762,7873=>636,7874=>762,7875=>636,7876=>762,7877=>636,7878=>762,7879=>636,7880=>468,7881=>380,7882=>468,7883=>380,7884=>871,7885=>667,7886=>871,7887=>667,7888=>871,7889=>667,7890=>871,7891=>667,7892=>871,7893=>667,7894=>871,7895=>667,7896=>871,7897=>667,7898=>871,7899=>667,7900=>871,7901=>667,7902=>871,7903=>667,7904=>871,7905=>667,7906=>871,7907=>667,7908=>872,7909=>727,7910=>872,7911=>727,7912=>872,7913=>727,7914=>872,7915=>727,7916=>872,7917=>727,7918=>872,7919=>727,7920=>872,7921=>727,7922=>714,7923=>581,7924=>714,7925=>581,7926=>714,7927=>581,7928=>714,7929=>581,7930=>1078,7931=>701,7936=>770,7937=>770,7938=>770,7939=>770,7940=>770,7941=>770,7942=>770,7943=>770,7944=>776,7945=>776,7946=>978,7947=>978,7948=>832,7949=>849,7950=>776,7951=>776,7952=>608,7953=>608,7954=>608,7955=>608,7956=>608,7957=>608,7960=>917,7961=>909,7962=>1169,7963=>1169,7964=>1093,7965=>1120,7968=>727,7969=>727,7970=>727,7971=>727,7972=>727,7973=>727,7974=>727,7975=>727,7976=>1100,7977=>1094,7978=>1358,7979=>1361,7980=>1279,7981=>1308,7982=>1197,7983=>1194,7984=>484,7985=>484,7986=>484,7987=>484,7988=>484,7989=>484,7990=>484,7991=>484,7992=>629,7993=>617,7994=>878,7995=>881,7996=>799,7997=>831,7998=>723,7999=>714,8000=>667,8001=>667,8002=>667,8003=>667,8004=>667,8005=>667,8008=>900,8009=>935,8010=>1240,8011=>1237,8012=>1035,8013=>1066,8016=>694,8017=>694,8018=>694,8019=>694,8020=>694,8021=>694,8022=>694,8023=>694,8025=>922,8027=>1186,8029=>1133,8031=>1019,8032=>952,8033=>952,8034=>952,8035=>952,8036=>952,8037=>952,8038=>952,8039=>952,8040=>931,8041=>963,8042=>1268,8043=>1274,8044=>1054,8045=>1088,8046=>1023,8047=>1060,8048=>770,8049=>770,8050=>608,8051=>608,8052=>727,8053=>727,8054=>484,8055=>484,8056=>667,8057=>667,8058=>694,8059=>694,8060=>952,8061=>952,8064=>770,8065=>770,8066=>770,8067=>770,8068=>770,8069=>770,8070=>770,8071=>770,8072=>776,8073=>776,8074=>978,8075=>978,8076=>832,8077=>849,8078=>776,8079=>776,8080=>727,8081=>727,8082=>727,8083=>727,8084=>727,8085=>727,8086=>727,8087=>727,8088=>1100,8089=>1094,8090=>1358,8091=>1361,8092=>1279,8093=>1308,8094=>1197,8095=>1194,8096=>952,8097=>952,8098=>952,8099=>952,8100=>952,8101=>952,8102=>952,8103=>952,8104=>931,8105=>963,8106=>1268,8107=>1274,8108=>1054,8109=>1088,8110=>1023,8111=>1060,8112=>770,8113=>770,8114=>770,8115=>770,8116=>770,8118=>770,8119=>770,8120=>776,8121=>776,8122=>811,8123=>776,8124=>776,8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>727,8131=>727,8132=>727,8134=>727,8135=>727,8136=>1000,8137=>947,8138=>1191,8139=>1118,8140=>945,8141=>500,8142=>500,8143=>500,8144=>484,8145=>484,8146=>484,8147=>484,8150=>484,8151=>484,8152=>468,8153=>468,8154=>714,8155=>662,8157=>500,8158=>500,8159=>500,8160=>694,8161=>694,8162=>694,8163=>694,8164=>665,8165=>665,8166=>694,8167=>694,8168=>714,8169=>714,8170=>1019,8171=>953,8172=>910,8173=>500,8174=>500,8175=>500,8178=>952,8179=>952,8180=>952,8182=>952,8183=>952,8184=>1069,8185=>887,8186=>1101,8187=>911,8188=>890,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>696,8200=>348,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>415,8209=>415,8210=>696,8211=>500,8212=>1000,8213=>1000,8214=>500,8215=>500,8216=>348,8217=>348,8218=>348,8219=>348,8220=>575,8221=>575,8222=>575,8223=>575,8224=>523,8225=>523,8226=>639,8227=>639,8228=>348,8229=>674,8230=>1000,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200,8240=>1385,8241=>1813,8242=>264,8243=>447,8244=>630,8245=>264,8246=>447,8247=>630,8248=>733,8249=>400,8250=>400,8252=>629,8253=>586,8254=>500,8258=>1023,8260=>167,8261=>473,8262=>473,8263=>1082,8264=>856,8265=>856,8267=>636,8268=>500,8269=>500,8270=>523,8271=>369,8273=>523,8274=>556,8275=>1000,8279=>813,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>438,8305=>239,8308=>438,8309=>438,8310=>438,8311=>438,8312=>438,8313=>438,8314=>528,8315=>528,8316=>528,8317=>298,8318=>298,8319=>458,8320=>438,8321=>438,8322=>438,8323=>438,8324=>438,8325=>438,8326=>438,8327=>438,8328=>438,8329=>438,8330=>528,8331=>528,8332=>528,8333=>298,8334=>298,8336=>408,8337=>444,8338=>467,8339=>375,8340=>444,8341=>521,8342=>523,8343=>292,8344=>729,8345=>458,8346=>499,8347=>395,8348=>371,8358=>696,8364=>696,8367=>1155,8369=>790,8372=>876,8373=>696,8377=>696,8451=>1198,8457=>1112,8462=>727,8463=>727,8470=>1087,8482=>1000,8486=>890,8487=>890,8490=>869,8491=>776,8513=>786,8514=>576,8515=>637,8516=>760,8523=>903,8528=>1035,8529=>1035,8530=>1473,8531=>1035,8532=>1035,8533=>1035,8534=>1035,8535=>1035,8536=>1035,8537=>1035,8538=>1035,8539=>1035,8540=>1035,8541=>1035,8542=>1035,8543=>615,8544=>468,8545=>736,8546=>1005,8547=>1093,8548=>776,8549=>1127,8550=>1396,8551=>1664,8552=>1069,8553=>776,8554=>1078,8555=>1347,8556=>703,8557=>796,8558=>867,8559=>1107,8560=>380,8561=>760,8562=>1140,8563=>961,8564=>581,8565=>961,8566=>1341,8567=>1721,8568=>976,8569=>596,8570=>976,8571=>1356,8572=>380,8573=>609,8574=>699,8575=>1058,8576=>1255,8577=>867,8578=>1268,8579=>796,8580=>609,8581=>796,8585=>1035,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838,8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838,8620=>838,8621=>838,8622=>838,8623=>850,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838,8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838,8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838,8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838,8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838,8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838,8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838,8700=>838,8701=>838,8702=>838,8703=>838,8704=>641,8706=>534,8707=>620,8708=>620,8710=>753,8711=>753,8712=>740,8713=>740,8715=>740,8716=>740,8719=>842,8720=>842,8721=>753,8722=>838,8723=>838,8724=>838,8725=>365,8727=>691,8728=>519,8729=>519,8730=>657,8731=>657,8732=>657,8733=>672,8734=>833,8735=>838,8736=>838,8739=>324,8740=>607,8741=>529,8742=>773,8743=>812,8744=>812,8745=>838,8746=>838,8747=>579,8748=>1000,8749=>1391,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838,8770=>838,8771=>838,8776=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1082,8789=>1082,8800=>838,8801=>838,8804=>838,8805=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8844=>838,8845=>838,8846=>838,8847=>838,8848=>838,8849=>838,8850=>838,8851=>838,8852=>838,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838,8865=>838,8866=>884,8867=>884,8868=>960,8869=>960,8870=>616,8871=>616,8872=>884,8873=>884,8874=>884,8875=>1080,8876=>884,8877=>884,8878=>884,8879=>1080,8901=>398,8962=>834,8968=>473,8969=>473,8970=>473,8971=>473,8976=>838,8977=>539,8984=>928,8985=>838,8992=>579,8993=>579,8997=>1000,9000=>1443,9085=>1008,9115=>500,9116=>500,9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500,9125=>500,9126=>500,9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>579,9167=>945,9251=>834,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527,9687=>527,9688=>791,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>873,9697=>873,9698=>769,9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945,9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732,9727=>769,9728=>896,9784=>896,9785=>896,9786=>896,9787=>896,9788=>896,9791=>614,9792=>731,9793=>731,9794=>896,9795=>896,9796=>896,9797=>896,9798=>896,9799=>896,9824=>896,9825=>896,9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472,9838=>357,9839=>484,10145=>838,10181=>457,10182=>457,10208=>494,10216=>457,10217=>457,10224=>838,10225=>838,10226=>838,10227=>838,10228=>1033,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434,10237=>1434,10238=>1434,10239=>1434,10240=>781,10241=>781,10242=>781,10243=>781,10244=>781,10245=>781,10246=>781,10247=>781,10248=>781,10249=>781,10250=>781,10251=>781,10252=>781,10253=>781,10254=>781,10255=>781,10256=>781,10257=>781,10258=>781,10259=>781,10260=>781,10261=>781,10262=>781,10263=>781,10264=>781,10265=>781,10266=>781,10267=>781,10268=>781,10269=>781,10270=>781,10271=>781,10272=>781,10273=>781,10274=>781,10275=>781,10276=>781,10277=>781,10278=>781,10279=>781,10280=>781,10281=>781,10282=>781,10283=>781,10284=>781,10285=>781,10286=>781,10287=>781,10288=>781,10289=>781,10290=>781,10291=>781,10292=>781,10293=>781,10294=>781,10295=>781,10296=>781,10297=>781,10298=>781,10299=>781,10300=>781,10301=>781,10302=>781,10303=>781,10304=>781,10305=>781,10306=>781,10307=>781,10308=>781,10309=>781,10310=>781,10311=>781,10312=>781,10313=>781,10314=>781,10315=>781,10316=>781,10317=>781,10318=>781,10319=>781,10320=>781,10321=>781,10322=>781,10323=>781,10324=>781,10325=>781,10326=>781,10327=>781,10328=>781,10329=>781,10330=>781,10331=>781,10332=>781,10333=>781,10334=>781,10335=>781,10336=>781,10337=>781,10338=>781,10339=>781,10340=>781,10341=>781,10342=>781,10343=>781,10344=>781,10345=>781,10346=>781,10347=>781,10348=>781,10349=>781,10350=>781,10351=>781,10352=>781,10353=>781,10354=>781,10355=>781,10356=>781,10357=>781,10358=>781,10359=>781,10360=>781,10361=>781,10362=>781,10363=>781,10364=>781,10365=>781,10366=>781,10367=>781,10368=>781,10369=>781,10370=>781,10371=>781,10372=>781,10373=>781,10374=>781,10375=>781,10376=>781,10377=>781,10378=>781,10379=>781,10380=>781,10381=>781,10382=>781,10383=>781,10384=>781,10385=>781,10386=>781,10387=>781,10388=>781,10389=>781,10390=>781,10391=>781,10392=>781,10393=>781,10394=>781,10395=>781,10396=>781,10397=>781,10398=>781,10399=>781,10400=>781,10401=>781,10402=>781,10403=>781,10404=>781,10405=>781,10406=>781,10407=>781,10408=>781,10409=>781,10410=>781,10411=>781,10412=>781,10413=>781,10414=>781,10415=>781,10416=>781,10417=>781,10418=>781,10419=>781,10420=>781,10421=>781,10422=>781,10423=>781,10424=>781,10425=>781,10426=>781,10427=>781,10428=>781,10429=>781,10430=>781,10431=>781,10432=>781,10433=>781,10434=>781,10435=>781,10436=>781,10437=>781,10438=>781,10439=>781,10440=>781,10441=>781,10442=>781,10443=>781,10444=>781,10445=>781,10446=>781,10447=>781,10448=>781,10449=>781,10450=>781,10451=>781,10452=>781,10453=>781,10454=>781,10455=>781,10456=>781,10457=>781,10458=>781,10459=>781,10460=>781,10461=>781,10462=>781,10463=>781,10464=>781,10465=>781,10466=>781,10467=>781,10468=>781,10469=>781,10470=>781,10471=>781,10472=>781,10473=>781,10474=>781,10475=>781,10476=>781,10477=>781,10478=>781,10479=>781,10480=>781,10481=>781,10482=>781,10483=>781,10484=>781,10485=>781,10486=>781,10487=>781,10488=>781,10489=>781,10490=>781,10491=>781,10492=>781,10493=>781,10494=>781,10495=>781,10496=>838,10497=>838,10498=>838,10499=>838,10500=>838,10501=>838,10502=>838,10503=>838,10504=>838,10505=>838,10506=>838,10507=>838,10508=>838,10509=>838,10510=>838,10511=>838,10512=>838,10513=>838,10514=>838,10515=>838,10516=>838,10517=>838,10518=>838,10519=>838,10520=>838,10521=>838,10522=>838,10523=>838,10524=>838,10525=>838,10526=>838,10527=>838,10528=>838,10529=>838,10530=>838,10531=>838,10532=>838,10533=>838,10534=>838,10535=>838,10536=>838,10537=>838,10538=>838,10539=>838,10540=>838,10541=>838,10542=>838,10543=>838,10544=>838,10545=>838,10546=>838,10547=>838,10548=>838,10549=>838,10550=>838,10551=>838,10552=>838,10553=>838,10554=>838,10555=>838,10556=>838,10557=>838,10558=>838,10559=>838,10560=>838,10561=>838,10562=>838,10563=>838,10564=>838,10565=>838,10566=>838,10567=>838,10568=>838,10569=>838,10570=>838,10571=>838,10572=>838,10573=>838,10574=>838,10575=>838,10576=>838,10577=>838,10578=>838,10579=>838,10580=>838,10581=>838,10582=>838,10583=>838,10584=>838,10585=>838,10586=>838,10587=>838,10588=>838,10589=>838,10590=>838,10591=>838,10592=>838,10593=>838,10594=>838,10595=>838,10596=>838,10597=>838,10598=>838,10599=>838,10600=>838,10601=>838,10602=>838,10603=>838,10604=>838,10605=>838,10606=>838,10607=>838,10608=>838,10609=>838,10610=>838,10611=>838,10612=>838,10613=>838,10614=>838,10615=>1032,10616=>838,10617=>838,10618=>960,10619=>838,10620=>838,10621=>838,10622=>838,10623=>838,10731=>494,10764=>1782,10765=>610,10766=>610,10799=>838,11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838,11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838,11026=>945,11027=>945,11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11360=>703,11361=>380,11363=>752,11364=>831,11367=>945,11368=>727,11369=>869,11370=>693,11371=>730,11372=>568,11373=>848,11374=>1107,11375=>776,11376=>848,11377=>709,11378=>1221,11379=>984,11381=>779,11382=>576,11383=>905,11385=>571,11386=>667,11388=>313,11389=>489,11390=>722,11391=>730,11520=>773,11521=>635,11522=>804,11523=>658,11524=>788,11525=>962,11526=>756,11527=>960,11528=>617,11529=>646,11530=>962,11531=>631,11532=>646,11533=>962,11534=>846,11535=>866,11536=>961,11537=>645,11538=>645,11539=>959,11540=>945,11541=>863,11542=>644,11543=>646,11544=>645,11545=>649,11546=>688,11547=>936,11548=>982,11549=>681,11550=>676,11551=>852,11552=>1113,11553=>632,11554=>645,11555=>646,11556=>749,11557=>914,11800=>586,11810=>473,11811=>473,11812=>473,11813=>473,11822=>586,42564=>722,42565=>563,42566=>468,42567=>380,42576=>1333,42577=>1085,42580=>1287,42581=>1025,42582=>1287,42583=>1029,42760=>500,42761=>500,42762=>500,42763=>500,42764=>500,42765=>500,42766=>500,42767=>500,42768=>500,42769=>500,42770=>500,42771=>500,42772=>500,42773=>500,42774=>500,42779=>384,42780=>384,42781=>276,42782=>276,42783=>276,42790=>945,42791=>712,42792=>1003,42793=>909,42794=>696,42795=>609,42796=>634,42797=>598,42798=>741,42799=>706,42800=>592,42801=>563,42802=>1301,42803=>983,42804=>1261,42805=>985,42806=>1168,42807=>1007,42808=>1016,42809=>832,42810=>1016,42811=>832,42812=>994,42813=>746,42814=>796,42815=>609,42822=>916,42823=>581,42826=>1010,42827=>770,42830=>1448,42831=>1060,42856=>787,42857=>716,42875=>694,42876=>527,42880=>703,42881=>380,42882=>872,42883=>727,42884=>694,42885=>527,42886=>796,42887=>609,42891=>439,42892=>306,42893=>913,42896=>914,42897=>812,43002=>1068,43003=>710,43004=>752,43005=>1107,43006=>468,43007=>1286,62464=>726,62465=>737,62466=>786,62467=>1019,62468=>737,62469=>731,62470=>796,62471=>1058,62472=>737,62473=>737,62474=>1329,62475=>754,62476=>753,62477=>1024,62478=>737,62479=>753,62480=>1070,62481=>818,62482=>870,62483=>819,62484=>1016,62485=>753,62486=>1008,62487=>752,62488=>760,62489=>753,62490=>800,62491=>753,62492=>760,62493=>738,62494=>801,62495=>956,62496=>736,62497=>847,62498=>737,62499=>737,62500=>737,62501=>793,62502=>1033,62504=>904,63172=>380,63173=>667,63174=>699,63175=>727,63176=>1058,63185=>500,63188=>500,64256=>827,64257=>727,64258=>727,64259=>1108,64260=>1146,64261=>879,64262=>971,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1113,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifbi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifbi.z
new file mode 100644
index 00000000..6ea1e825
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifbi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensed.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensed.ctg.z
new file mode 100644
index 00000000..39f79943
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensed.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensed.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensed.php
new file mode 100644
index 00000000..baccb83f
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensed.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSerifCondensed';
+$up=-63;
+$ut=44;
+$dw=540;
+$diff='';
+$originalsize=330012;
+$enc='';
+$file='dejavuserifcondensed.z';
+$ctg='dejavuserifcondensed.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-693 -347 1512 1109]','ItalicAngle'=>0,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>519,'StemV'=>34,'StemH'=>15,'AvgWidth'=>461,'MaxWidth'=>1560,'MissingWidth'=>540);
+$cw=array(0=>540,32=>286,33=>361,34=>414,35=>754,36=>572,37=>855,38=>801,39=>247,40=>351,41=>351,42=>450,43=>754,44=>286,45=>304,46=>286,47=>303,48=>572,49=>572,50=>572,51=>572,52=>572,53=>572,54=>572,55=>572,56=>572,57=>572,58=>303,59=>303,60=>754,61=>754,62=>754,63=>482,64=>900,65=>650,66=>661,67=>688,68=>721,69=>657,70=>624,71=>719,72=>785,73=>355,74=>360,75=>672,76=>598,77=>921,78=>787,79=>738,80=>605,81=>738,82=>677,83=>616,84=>600,85=>758,86=>650,87=>925,88=>641,89=>594,90=>625,91=>351,92=>303,93=>351,94=>754,95=>450,96=>450,97=>536,98=>576,99=>504,100=>576,101=>532,102=>333,103=>576,104=>580,105=>288,106=>279,107=>545,108=>288,109=>853,110=>580,111=>542,112=>576,113=>576,114=>430,115=>461,116=>361,117=>580,118=>508,119=>770,120=>507,121=>508,122=>474,123=>572,124=>303,125=>572,126=>754,160=>286,161=>361,162=>572,163=>572,164=>572,165=>572,166=>303,167=>450,168=>450,169=>900,170=>427,171=>550,172=>754,173=>304,174=>900,175=>450,176=>450,177=>754,178=>360,179=>360,180=>450,181=>584,182=>572,183=>286,184=>450,185=>360,186=>423,187=>550,188=>872,189=>872,190=>872,191=>482,192=>650,193=>650,194=>650,195=>650,196=>650,197=>650,198=>901,199=>688,200=>657,201=>657,202=>657,203=>657,204=>355,205=>355,206=>355,207=>355,208=>726,209=>787,210=>738,211=>738,212=>738,213=>738,214=>738,215=>754,216=>738,217=>758,218=>758,219=>758,220=>758,221=>594,222=>608,223=>601,224=>536,225=>536,226=>536,227=>536,228=>536,229=>536,230=>846,231=>504,232=>532,233=>532,234=>532,235=>532,236=>288,237=>288,238=>288,239=>288,240=>542,241=>580,242=>542,243=>542,244=>542,245=>542,246=>542,247=>754,248=>542,249=>580,250=>580,251=>580,252=>580,253=>508,254=>576,255=>508,256=>650,257=>536,258=>650,259=>536,260=>650,261=>536,262=>688,263=>504,264=>688,265=>504,266=>688,267=>504,268=>688,269=>504,270=>721,271=>576,272=>726,273=>576,274=>657,275=>532,276=>657,277=>532,278=>657,279=>532,280=>657,281=>532,282=>657,283=>532,284=>719,285=>576,286=>719,287=>576,288=>719,289=>576,290=>719,291=>576,292=>785,293=>580,294=>785,295=>580,296=>355,297=>288,298=>355,299=>288,300=>355,301=>288,302=>355,303=>288,304=>355,305=>288,306=>721,307=>479,308=>360,309=>279,310=>672,311=>545,312=>545,313=>598,314=>288,315=>598,316=>288,317=>598,318=>288,319=>598,320=>288,321=>602,322=>292,323=>787,324=>580,325=>787,326=>580,327=>787,328=>580,329=>779,330=>758,331=>580,332=>738,333=>542,334=>738,335=>542,336=>738,337=>542,338=>1023,339=>890,340=>677,341=>430,342=>677,343=>430,344=>677,345=>430,346=>616,347=>461,348=>616,349=>461,350=>616,351=>461,352=>616,353=>461,354=>600,355=>361,356=>600,357=>361,358=>600,359=>361,360=>758,361=>580,362=>758,363=>580,364=>758,365=>580,366=>758,367=>580,368=>758,369=>580,370=>758,371=>580,372=>925,373=>770,374=>594,375=>508,376=>594,377=>625,378=>474,379=>625,380=>474,381=>625,382=>474,383=>333,384=>576,385=>661,386=>661,387=>576,388=>661,389=>576,390=>688,391=>688,392=>504,393=>726,394=>721,395=>661,396=>576,397=>542,398=>657,399=>738,400=>561,401=>624,402=>333,403=>719,404=>641,405=>839,406=>355,407=>355,408=>672,409=>545,410=>288,411=>570,412=>853,413=>787,414=>580,415=>738,416=>738,417=>542,418=>936,419=>726,420=>605,421=>576,422=>677,423=>616,424=>461,425=>636,426=>292,427=>361,428=>600,429=>361,430=>600,431=>758,432=>580,433=>746,434=>684,435=>664,436=>596,437=>625,438=>474,439=>508,440=>508,441=>508,442=>508,443=>572,444=>618,445=>508,446=>482,447=>571,448=>265,449=>443,450=>413,451=>265,452=>1347,453=>1195,454=>1050,455=>958,456=>876,457=>567,458=>1148,459=>1066,460=>858,461=>650,462=>536,463=>355,464=>288,465=>738,466=>542,467=>758,468=>580,469=>758,470=>580,471=>758,472=>580,473=>758,474=>580,475=>758,476=>580,477=>532,478=>650,479=>536,480=>650,481=>536,482=>901,483=>846,484=>763,485=>576,486=>719,487=>576,488=>672,489=>545,490=>738,491=>542,492=>738,493=>542,494=>508,495=>508,496=>288,497=>1347,498=>1195,499=>1050,500=>719,501=>576,502=>1038,503=>636,504=>787,505=>580,506=>650,507=>536,508=>901,509=>846,510=>738,511=>542,512=>650,513=>536,514=>650,515=>536,516=>657,517=>532,518=>657,519=>532,520=>355,521=>288,522=>355,523=>288,524=>738,525=>542,526=>738,527=>542,528=>677,529=>430,530=>677,531=>430,532=>758,533=>580,534=>758,535=>580,536=>616,537=>461,538=>600,539=>361,540=>564,541=>469,542=>785,543=>580,544=>758,545=>732,546=>514,547=>497,548=>625,549=>474,550=>650,551=>536,552=>657,553=>532,554=>738,555=>542,556=>738,557=>542,558=>738,559=>542,560=>738,561=>542,562=>594,563=>508,564=>450,565=>748,566=>444,567=>279,568=>864,569=>864,570=>650,571=>688,572=>504,573=>598,574=>600,575=>461,576=>474,577=>525,578=>417,579=>661,580=>758,581=>650,582=>657,583=>532,584=>360,585=>283,586=>704,587=>576,588=>677,589=>430,590=>594,591=>508,592=>536,593=>576,594=>576,595=>576,596=>504,597=>504,598=>582,599=>614,600=>532,601=>532,602=>759,603=>466,604=>458,605=>695,606=>552,607=>283,608=>615,609=>576,610=>489,611=>641,612=>507,613=>580,614=>580,615=>580,616=>288,617=>353,618=>288,619=>342,620=>409,621=>326,622=>633,623=>853,624=>853,625=>853,626=>579,627=>624,628=>581,629=>542,630=>711,631=>583,632=>542,633=>451,634=>451,635=>496,636=>430,637=>430,638=>407,639=>407,640=>534,641=>534,642=>461,643=>244,644=>333,645=>438,646=>292,647=>361,648=>361,649=>580,650=>558,651=>547,652=>508,653=>770,654=>508,655=>589,656=>537,657=>504,658=>508,659=>504,660=>482,661=>482,662=>482,663=>461,664=>738,665=>506,666=>552,667=>588,668=>600,669=>329,670=>545,671=>488,672=>615,673=>482,674=>482,675=>896,676=>930,677=>898,678=>728,679=>538,680=>704,681=>804,682=>582,683=>608,684=>538,685=>398,686=>703,687=>690,688=>389,689=>387,690=>237,691=>312,692=>312,693=>387,694=>352,695=>527,696=>381,697=>250,699=>286,700=>286,701=>286,702=>276,703=>276,704=>252,705=>252,710=>450,711=>450,712=>247,713=>450,716=>247,717=>450,720=>303,721=>303,722=>276,723=>276,726=>295,728=>450,729=>450,730=>450,731=>450,732=>450,733=>450,734=>375,736=>402,737=>218,738=>303,739=>381,740=>252,741=>444,742=>444,743=>444,744=>444,745=>444,750=>435,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>666,881=>478,882=>600,883=>498,884=>250,885=>250,886=>787,887=>600,890=>450,891=>504,892=>504,893=>504,894=>303,900=>450,901=>450,902=>650,903=>286,904=>810,905=>935,906=>505,908=>751,910=>808,911=>767,912=>353,913=>650,914=>661,915=>624,916=>650,917=>657,918=>625,919=>785,920=>738,921=>355,922=>672,923=>650,924=>921,925=>787,926=>633,927=>738,928=>785,929=>605,931=>636,932=>600,933=>594,934=>738,935=>641,936=>789,937=>746,938=>355,939=>594,940=>607,941=>466,942=>539,943=>353,944=>547,945=>607,946=>520,947=>538,948=>542,949=>466,950=>488,951=>539,952=>542,953=>353,954=>563,955=>570,956=>584,957=>547,958=>496,959=>542,960=>591,961=>529,962=>504,963=>614,964=>498,965=>547,966=>630,967=>545,968=>706,969=>734,970=>353,971=>547,972=>542,973=>547,974=>734,975=>672,976=>524,977=>643,978=>618,979=>787,980=>618,981=>613,982=>734,983=>561,984=>738,985=>542,986=>688,987=>504,988=>624,989=>417,990=>531,991=>593,992=>704,993=>519,1008=>561,1009=>529,1010=>504,1011=>279,1012=>738,1013=>504,1014=>504,1015=>608,1016=>576,1017=>688,1018=>921,1019=>637,1020=>529,1021=>688,1022=>688,1023=>688,1024=>657,1025=>657,1026=>719,1027=>596,1028=>688,1029=>616,1030=>355,1031=>355,1032=>360,1033=>976,1034=>1006,1035=>785,1036=>696,1037=>785,1038=>650,1039=>785,1040=>681,1041=>661,1042=>661,1043=>596,1044=>731,1045=>657,1046=>1011,1047=>561,1048=>785,1049=>785,1050=>696,1051=>751,1052=>921,1053=>785,1054=>738,1055=>785,1056=>605,1057=>688,1058=>600,1059=>650,1060=>747,1061=>641,1062=>785,1063=>695,1064=>1027,1065=>1027,1066=>715,1067=>885,1068=>606,1069=>688,1070=>1074,1071=>727,1072=>536,1073=>542,1074=>506,1075=>471,1076=>554,1077=>532,1078=>828,1079=>491,1080=>600,1081=>600,1082=>563,1083=>571,1084=>700,1085=>600,1086=>542,1087=>600,1088=>576,1089=>504,1090=>498,1091=>529,1092=>704,1093=>507,1094=>579,1095=>595,1096=>836,1097=>836,1098=>572,1099=>716,1100=>490,1101=>504,1102=>783,1103=>567,1104=>532,1105=>532,1106=>561,1107=>471,1108=>504,1109=>461,1110=>288,1111=>288,1112=>279,1113=>759,1114=>774,1115=>580,1116=>563,1117=>600,1118=>529,1119=>590,1122=>686,1123=>542,1124=>1016,1125=>750,1130=>1011,1131=>828,1136=>849,1137=>812,1138=>738,1139=>497,1140=>773,1141=>610,1164=>636,1165=>490,1168=>604,1169=>476,1170=>596,1171=>471,1172=>655,1173=>552,1174=>1011,1175=>828,1176=>572,1177=>483,1178=>696,1179=>545,1182=>696,1183=>563,1184=>801,1185=>645,1186=>785,1187=>577,1188=>1025,1189=>767,1190=>1084,1191=>847,1194=>688,1195=>504,1196=>600,1197=>498,1198=>594,1199=>508,1200=>594,1201=>508,1202=>641,1203=>507,1204=>856,1205=>659,1206=>674,1207=>621,1210=>674,1211=>580,1216=>355,1217=>1011,1218=>828,1219=>672,1220=>545,1223=>785,1224=>600,1227=>674,1228=>600,1231=>288,1232=>681,1233=>536,1234=>681,1235=>536,1236=>901,1237=>846,1238=>657,1239=>532,1240=>738,1241=>532,1242=>738,1243=>532,1244=>1011,1245=>828,1246=>561,1247=>491,1248=>508,1249=>508,1250=>785,1251=>600,1252=>785,1253=>600,1254=>738,1255=>542,1256=>738,1257=>542,1258=>738,1259=>542,1260=>688,1261=>504,1262=>650,1263=>529,1264=>650,1265=>529,1266=>650,1267=>529,1268=>695,1269=>595,1270=>596,1271=>471,1272=>885,1273=>716,1296=>561,1297=>491,1298=>751,1299=>571,1300=>1078,1301=>827,1306=>738,1307=>576,1308=>925,1309=>770,1329=>729,1330=>729,1331=>743,1332=>762,1333=>725,1334=>743,1335=>685,1336=>729,1337=>871,1338=>734,1339=>695,1340=>614,1341=>987,1342=>760,1343=>723,1344=>647,1345=>729,1346=>750,1347=>759,1348=>808,1349=>687,1350=>714,1351=>678,1352=>719,1353=>717,1354=>787,1355=>747,1356=>795,1357=>719,1358=>721,1359=>658,1360=>697,1361=>674,1362=>570,1363=>760,1364=>759,1365=>751,1366=>738,1369=>276,1370=>237,1371=>207,1372=>352,1373=>328,1374=>347,1375=>450,1377=>854,1378=>556,1379=>625,1380=>625,1381=>565,1382=>619,1383=>458,1384=>572,1385=>711,1386=>604,1387=>571,1388=>274,1389=>875,1390=>553,1391=>565,1392=>572,1393=>567,1394=>572,1395=>588,1396=>580,1397=>278,1398=>572,1399=>415,1400=>584,1401=>329,1402=>846,1403=>505,1404=>591,1405=>580,1406=>567,1407=>836,1408=>580,1409=>578,1410=>435,1411=>836,1412=>572,1413=>548,1414=>728,1415=>709,1417=>306,1418=>300,4256=>650,4257=>765,4258=>745,4259=>773,4260=>659,4261=>883,4262=>824,4263=>991,4264=>510,4265=>675,4266=>866,4267=>847,4268=>668,4269=>967,4270=>807,4271=>746,4272=>936,4273=>660,4274=>602,4275=>914,4276=>843,4277=>917,4278=>658,4279=>659,4280=>659,4281=>660,4282=>791,4283=>843,4284=>642,4285=>679,4286=>660,4287=>862,4288=>900,4289=>632,4290=>777,4291=>660,4292=>753,4293=>855,4304=>486,4305=>514,4306=>530,4307=>750,4308=>505,4309=>501,4310=>556,4311=>774,4312=>503,4313=>491,4314=>959,4315=>527,4316=>527,4317=>743,4318=>513,4319=>522,4320=>741,4321=>546,4322=>673,4323=>628,4324=>733,4325=>526,4326=>772,4327=>511,4328=>534,4329=>527,4330=>607,4331=>528,4332=>523,4333=>518,4334=>550,4335=>615,4336=>514,4337=>542,4338=>514,4339=>514,4340=>513,4341=>584,4342=>797,4343=>563,4344=>523,4345=>557,4346=>514,4347=>393,4348=>318,7424=>508,7425=>697,7426=>846,7427=>506,7428=>504,7429=>527,7430=>527,7431=>498,7432=>458,7433=>288,7434=>448,7435=>563,7436=>488,7437=>700,7438=>600,7439=>542,7440=>504,7441=>582,7442=>582,7443=>582,7444=>890,7445=>461,7446=>542,7447=>542,7448=>498,7449=>534,7450=>534,7451=>498,7452=>526,7453=>597,7454=>831,7455=>589,7456=>508,7457=>770,7458=>474,7459=>474,7460=>478,7461=>668,7462=>471,7463=>508,7464=>591,7465=>498,7466=>632,7467=>571,7468=>409,7469=>567,7470=>417,7471=>417,7472=>454,7473=>413,7474=>413,7475=>453,7476=>494,7477=>224,7478=>227,7479=>423,7480=>376,7481=>580,7482=>496,7483=>496,7484=>464,7485=>332,7486=>381,7487=>426,7488=>378,7489=>478,7490=>583,7491=>347,7492=>347,7493=>360,7494=>556,7495=>360,7496=>360,7497=>348,7498=>348,7499=>306,7500=>306,7501=>360,7502=>157,7503=>328,7504=>552,7505=>359,7506=>347,7507=>312,7508=>347,7509=>347,7510=>360,7511=>222,7512=>359,7513=>376,7514=>552,7515=>335,7516=>421,7517=>327,7518=>338,7519=>341,7520=>396,7521=>343,7522=>181,7523=>312,7524=>359,7525=>335,7526=>327,7527=>338,7528=>333,7529=>396,7530=>343,7531=>876,7543=>576,7544=>494,7547=>334,7557=>288,7579=>360,7580=>312,7581=>312,7582=>347,7583=>306,7584=>199,7585=>206,7586=>360,7587=>359,7588=>210,7589=>219,7590=>210,7591=>210,7592=>207,7593=>158,7594=>157,7595=>330,7596=>552,7597=>552,7598=>366,7599=>364,7600=>359,7601=>347,7602=>347,7603=>295,7604=>190,7605=>222,7606=>359,7607=>350,7608=>331,7609=>338,7610=>335,7611=>297,7612=>297,7613=>297,7614=>327,7615=>347,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>650,7681=>536,7682=>661,7683=>576,7684=>661,7685=>576,7686=>661,7687=>576,7688=>688,7689=>504,7690=>721,7691=>576,7692=>721,7693=>576,7694=>721,7695=>576,7696=>721,7697=>576,7698=>721,7699=>576,7700=>657,7701=>532,7702=>657,7703=>532,7704=>657,7705=>532,7706=>657,7707=>532,7708=>657,7709=>532,7710=>624,7711=>333,7712=>719,7713=>576,7714=>785,7715=>580,7716=>785,7717=>580,7718=>785,7719=>580,7720=>785,7721=>580,7722=>785,7723=>580,7724=>355,7725=>288,7726=>355,7727=>288,7728=>672,7729=>545,7730=>672,7731=>545,7732=>672,7733=>545,7734=>598,7735=>288,7736=>598,7737=>288,7738=>598,7739=>288,7740=>598,7741=>288,7742=>921,7743=>853,7744=>921,7745=>853,7746=>921,7747=>853,7748=>787,7749=>580,7750=>787,7751=>580,7752=>787,7753=>580,7754=>787,7755=>580,7756=>738,7757=>542,7758=>738,7759=>542,7760=>738,7761=>542,7762=>738,7763=>542,7764=>605,7765=>576,7766=>605,7767=>576,7768=>677,7769=>430,7770=>677,7771=>430,7772=>677,7773=>430,7774=>677,7775=>430,7776=>616,7777=>461,7778=>616,7779=>461,7780=>616,7781=>461,7782=>616,7783=>469,7784=>616,7785=>461,7786=>600,7787=>361,7788=>600,7789=>361,7790=>600,7791=>361,7792=>600,7793=>361,7794=>758,7795=>580,7796=>758,7797=>580,7798=>758,7799=>580,7800=>758,7801=>580,7802=>758,7803=>580,7804=>650,7805=>508,7806=>650,7807=>508,7808=>925,7809=>770,7810=>925,7811=>770,7812=>925,7813=>770,7814=>925,7815=>770,7816=>925,7817=>770,7818=>641,7819=>507,7820=>641,7821=>507,7822=>594,7823=>508,7824=>625,7825=>474,7826=>625,7827=>474,7828=>625,7829=>474,7830=>580,7831=>361,7832=>770,7833=>508,7834=>813,7835=>333,7836=>333,7837=>333,7838=>746,7839=>542,7840=>650,7841=>536,7842=>650,7843=>536,7844=>650,7845=>551,7846=>650,7847=>551,7848=>650,7849=>551,7850=>650,7851=>551,7852=>650,7853=>536,7854=>650,7855=>536,7856=>650,7857=>536,7858=>650,7859=>536,7860=>650,7861=>536,7862=>650,7863=>536,7864=>657,7865=>532,7866=>657,7867=>532,7868=>657,7869=>532,7870=>657,7871=>554,7872=>657,7873=>554,7874=>657,7875=>554,7876=>657,7877=>554,7878=>657,7879=>532,7880=>355,7881=>288,7882=>355,7883=>288,7884=>738,7885=>542,7886=>738,7887=>542,7888=>738,7889=>550,7890=>738,7891=>550,7892=>738,7893=>550,7894=>738,7895=>550,7896=>738,7897=>542,7898=>738,7899=>542,7900=>738,7901=>542,7902=>738,7903=>542,7904=>738,7905=>542,7906=>738,7907=>542,7908=>758,7909=>580,7910=>758,7911=>580,7912=>758,7913=>580,7914=>758,7915=>580,7916=>758,7917=>580,7918=>758,7919=>580,7920=>758,7921=>580,7922=>594,7923=>508,7924=>594,7925=>508,7926=>594,7927=>508,7928=>594,7929=>508,7930=>854,7931=>523,7936=>607,7937=>607,7938=>607,7939=>607,7940=>607,7941=>607,7942=>607,7943=>607,7944=>650,7945=>650,7946=>782,7947=>782,7948=>660,7949=>687,7950=>650,7951=>650,7952=>483,7953=>483,7954=>483,7955=>483,7956=>483,7957=>483,7960=>768,7961=>757,7962=>960,7963=>969,7964=>907,7965=>931,7968=>539,7969=>539,7970=>539,7971=>539,7972=>539,7973=>539,7974=>539,7975=>539,7976=>898,7977=>893,7978=>1090,7979=>1101,7980=>1043,7981=>1064,7982=>988,7983=>985,7984=>353,7985=>353,7986=>353,7987=>353,7988=>353,7989=>353,7990=>353,7991=>353,7992=>469,7993=>461,7994=>661,7995=>664,7996=>611,7997=>635,7998=>561,7999=>553,8000=>542,8001=>542,8002=>542,8003=>542,8004=>542,8005=>542,8008=>738,8009=>773,8010=>1008,8011=>1015,8012=>843,8013=>867,8016=>547,8017=>547,8018=>547,8019=>547,8020=>547,8021=>547,8022=>547,8023=>547,8025=>765,8027=>971,8029=>939,8031=>857,8032=>734,8033=>734,8034=>734,8035=>734,8036=>734,8037=>734,8038=>734,8039=>734,8040=>746,8041=>783,8042=>1018,8043=>1023,8044=>852,8045=>878,8046=>844,8047=>873,8048=>607,8049=>607,8050=>483,8051=>483,8052=>539,8053=>539,8054=>353,8055=>353,8056=>542,8057=>542,8058=>547,8059=>547,8060=>734,8061=>734,8064=>607,8065=>607,8066=>607,8067=>607,8068=>607,8069=>607,8070=>607,8071=>607,8072=>650,8073=>650,8074=>782,8075=>782,8076=>660,8077=>687,8078=>650,8079=>650,8080=>539,8081=>539,8082=>539,8083=>539,8084=>539,8085=>539,8086=>539,8087=>539,8088=>898,8089=>893,8090=>1090,8091=>1101,8092=>1043,8093=>1064,8094=>988,8095=>985,8096=>734,8097=>734,8098=>734,8099=>734,8100=>734,8101=>734,8102=>734,8103=>734,8104=>746,8105=>783,8106=>1018,8107=>1023,8108=>852,8109=>878,8110=>844,8111=>873,8112=>607,8113=>607,8114=>607,8115=>607,8116=>607,8118=>607,8119=>607,8120=>650,8121=>650,8122=>650,8123=>650,8124=>650,8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>539,8131=>539,8132=>539,8134=>539,8135=>539,8136=>820,8137=>810,8138=>956,8139=>935,8140=>785,8141=>450,8142=>450,8143=>450,8144=>353,8145=>353,8146=>353,8147=>353,8150=>353,8151=>353,8152=>355,8153=>355,8154=>529,8155=>505,8157=>450,8158=>450,8159=>450,8160=>547,8161=>547,8162=>547,8163=>547,8164=>529,8165=>529,8166=>547,8167=>547,8168=>594,8169=>594,8170=>829,8171=>808,8172=>711,8173=>450,8174=>450,8175=>450,8178=>734,8179=>734,8180=>734,8182=>734,8183=>734,8184=>865,8185=>751,8186=>886,8187=>767,8188=>746,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>572,8200=>286,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>304,8209=>304,8210=>572,8211=>450,8212=>900,8213=>900,8214=>450,8215=>450,8216=>286,8217=>286,8218=>286,8219=>286,8220=>460,8221=>460,8222=>466,8223=>460,8224=>450,8225=>450,8226=>531,8227=>531,8228=>300,8229=>600,8230=>900,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180,8240=>1208,8241=>1560,8242=>204,8243=>336,8244=>468,8245=>204,8246=>336,8247=>468,8248=>305,8249=>360,8250=>360,8252=>475,8253=>482,8254=>450,8258=>900,8260=>150,8261=>351,8262=>351,8263=>878,8264=>678,8265=>678,8267=>572,8268=>450,8269=>450,8270=>450,8271=>303,8273=>450,8274=>404,8275=>900,8279=>597,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>360,8305=>181,8308=>360,8309=>360,8310=>360,8311=>360,8312=>360,8313=>360,8314=>475,8315=>475,8316=>475,8317=>221,8318=>221,8319=>389,8320=>360,8321=>360,8322=>360,8323=>360,8324=>360,8325=>360,8326=>360,8327=>360,8328=>360,8329=>360,8330=>475,8331=>475,8332=>475,8333=>221,8334=>221,8336=>347,8337=>348,8338=>347,8339=>381,8340=>348,8341=>389,8342=>328,8343=>218,8344=>552,8345=>389,8346=>360,8347=>303,8348=>222,8358=>594,8364=>572,8367=>951,8369=>635,8372=>702,8373=>572,8377=>572,8450=>716,8451=>1006,8457=>942,8461=>850,8462=>580,8463=>580,8469=>822,8470=>852,8473=>677,8474=>784,8477=>748,8482=>900,8484=>657,8486=>746,8487=>746,8490=>672,8491=>650,8508=>659,8509=>594,8510=>639,8511=>850,8512=>642,8513=>697,8514=>501,8515=>501,8516=>549,8517=>780,8518=>629,8519=>572,8520=>342,8521=>325,8523=>801,8528=>872,8529=>872,8530=>1233,8531=>872,8532=>872,8533=>872,8534=>872,8535=>872,8536=>872,8537=>872,8538=>872,8539=>872,8540=>872,8541=>872,8542=>872,8543=>511,8544=>355,8545=>531,8546=>707,8547=>870,8548=>650,8549=>883,8550=>1059,8551=>1234,8552=>838,8553=>641,8554=>839,8555=>1015,8556=>598,8557=>688,8558=>721,8559=>921,8560=>288,8561=>576,8562=>863,8563=>796,8564=>508,8565=>796,8566=>1084,8567=>1372,8568=>795,8569=>507,8570=>795,8571=>1083,8572=>288,8573=>504,8574=>576,8575=>853,8576=>1085,8577=>721,8578=>1085,8579=>688,8580=>504,8581=>688,8585=>872,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754,8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754,8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754,8620=>754,8621=>754,8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754,8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754,8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754,8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754,8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754,8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754,8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754,8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754,8700=>754,8701=>754,8702=>754,8703=>754,8704=>543,8706=>465,8707=>488,8708=>488,8710=>628,8711=>628,8712=>666,8713=>666,8715=>666,8716=>666,8719=>716,8720=>716,8721=>642,8722=>754,8723=>754,8724=>754,8725=>303,8727=>611,8728=>441,8729=>441,8730=>573,8731=>573,8732=>573,8733=>609,8734=>750,8735=>754,8736=>754,8739=>262,8740=>431,8741=>416,8742=>570,8743=>659,8744=>659,8745=>754,8746=>754,8747=>469,8748=>766,8749=>1063,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754,8770=>754,8771=>754,8776=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>930,8789=>930,8800=>754,8801=>754,8804=>754,8805=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8844=>754,8845=>754,8846=>754,8847=>761,8848=>761,8849=>761,8850=>761,8851=>754,8852=>754,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754,8865=>754,8866=>773,8867=>773,8868=>846,8869=>846,8870=>510,8871=>510,8872=>773,8873=>773,8874=>773,8875=>927,8876=>773,8877=>773,8878=>773,8879=>927,8901=>308,8962=>687,8968=>351,8969=>351,8970=>351,8971=>351,8976=>754,8977=>461,8984=>900,8985=>754,8992=>469,8993=>469,8997=>900,9000=>1299,9085=>827,9115=>450,9116=>450,9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450,9125=>450,9126=>450,9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>469,9167=>850,9251=>687,9472=>542,9473=>542,9474=>542,9475=>542,9476=>542,9477=>542,9478=>542,9479=>542,9480=>542,9481=>542,9482=>542,9483=>542,9484=>542,9485=>542,9486=>542,9487=>542,9488=>542,9489=>542,9490=>542,9491=>542,9492=>542,9493=>542,9494=>542,9495=>542,9496=>542,9497=>542,9498=>542,9499=>542,9500=>542,9501=>542,9502=>542,9503=>542,9504=>542,9505=>542,9506=>542,9507=>542,9508=>542,9509=>542,9510=>542,9511=>542,9512=>542,9513=>542,9514=>542,9515=>542,9516=>542,9517=>542,9518=>542,9519=>542,9520=>542,9521=>542,9522=>542,9523=>542,9524=>542,9525=>542,9526=>542,9527=>542,9528=>542,9529=>542,9530=>542,9531=>542,9532=>542,9533=>542,9534=>542,9535=>542,9536=>542,9537=>542,9538=>542,9539=>542,9540=>542,9541=>542,9542=>542,9543=>542,9544=>542,9545=>542,9546=>542,9547=>542,9548=>542,9549=>542,9550=>542,9551=>542,9552=>542,9553=>542,9554=>542,9555=>542,9556=>542,9557=>542,9558=>542,9559=>542,9560=>542,9561=>542,9562=>542,9563=>542,9564=>542,9565=>542,9566=>542,9567=>542,9568=>542,9569=>542,9570=>542,9571=>542,9572=>542,9573=>542,9574=>542,9575=>542,9576=>542,9577=>542,9578=>542,9579=>542,9580=>542,9581=>542,9582=>542,9583=>542,9584=>542,9585=>542,9586=>542,9587=>542,9588=>542,9589=>542,9590=>542,9591=>542,9592=>542,9593=>542,9594=>542,9595=>542,9596=>542,9597=>542,9598=>542,9599=>542,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474,9687=>474,9688=>712,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>785,9697=>785,9698=>692,9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850,9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659,9727=>692,9728=>807,9784=>807,9785=>807,9786=>807,9787=>807,9788=>807,9791=>552,9792=>658,9793=>658,9794=>807,9795=>807,9796=>807,9797=>807,9798=>807,9799=>807,9824=>807,9825=>807,9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424,9838=>321,9839=>435,10145=>754,10181=>351,10182=>351,10208=>444,10216=>351,10217=>351,10224=>754,10225=>754,10226=>754,10227=>754,10228=>930,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290,10237=>1290,10238=>1290,10239=>1290,10240=>659,10241=>659,10242=>659,10243=>659,10244=>659,10245=>659,10246=>659,10247=>659,10248=>659,10249=>659,10250=>659,10251=>659,10252=>659,10253=>659,10254=>659,10255=>659,10256=>659,10257=>659,10258=>659,10259=>659,10260=>659,10261=>659,10262=>659,10263=>659,10264=>659,10265=>659,10266=>659,10267=>659,10268=>659,10269=>659,10270=>659,10271=>659,10272=>659,10273=>659,10274=>659,10275=>659,10276=>659,10277=>659,10278=>659,10279=>659,10280=>659,10281=>659,10282=>659,10283=>659,10284=>659,10285=>659,10286=>659,10287=>659,10288=>659,10289=>659,10290=>659,10291=>659,10292=>659,10293=>659,10294=>659,10295=>659,10296=>659,10297=>659,10298=>659,10299=>659,10300=>659,10301=>659,10302=>659,10303=>659,10304=>659,10305=>659,10306=>659,10307=>659,10308=>659,10309=>659,10310=>659,10311=>659,10312=>659,10313=>659,10314=>659,10315=>659,10316=>659,10317=>659,10318=>659,10319=>659,10320=>659,10321=>659,10322=>659,10323=>659,10324=>659,10325=>659,10326=>659,10327=>659,10328=>659,10329=>659,10330=>659,10331=>659,10332=>659,10333=>659,10334=>659,10335=>659,10336=>659,10337=>659,10338=>659,10339=>659,10340=>659,10341=>659,10342=>659,10343=>659,10344=>659,10345=>659,10346=>659,10347=>659,10348=>659,10349=>659,10350=>659,10351=>659,10352=>659,10353=>659,10354=>659,10355=>659,10356=>659,10357=>659,10358=>659,10359=>659,10360=>659,10361=>659,10362=>659,10363=>659,10364=>659,10365=>659,10366=>659,10367=>659,10368=>659,10369=>659,10370=>659,10371=>659,10372=>659,10373=>659,10374=>659,10375=>659,10376=>659,10377=>659,10378=>659,10379=>659,10380=>659,10381=>659,10382=>659,10383=>659,10384=>659,10385=>659,10386=>659,10387=>659,10388=>659,10389=>659,10390=>659,10391=>659,10392=>659,10393=>659,10394=>659,10395=>659,10396=>659,10397=>659,10398=>659,10399=>659,10400=>659,10401=>659,10402=>659,10403=>659,10404=>659,10405=>659,10406=>659,10407=>659,10408=>659,10409=>659,10410=>659,10411=>659,10412=>659,10413=>659,10414=>659,10415=>659,10416=>659,10417=>659,10418=>659,10419=>659,10420=>659,10421=>659,10422=>659,10423=>659,10424=>659,10425=>659,10426=>659,10427=>659,10428=>659,10429=>659,10430=>659,10431=>659,10432=>659,10433=>659,10434=>659,10435=>659,10436=>659,10437=>659,10438=>659,10439=>659,10440=>659,10441=>659,10442=>659,10443=>659,10444=>659,10445=>659,10446=>659,10447=>659,10448=>659,10449=>659,10450=>659,10451=>659,10452=>659,10453=>659,10454=>659,10455=>659,10456=>659,10457=>659,10458=>659,10459=>659,10460=>659,10461=>659,10462=>659,10463=>659,10464=>659,10465=>659,10466=>659,10467=>659,10468=>659,10469=>659,10470=>659,10471=>659,10472=>659,10473=>659,10474=>659,10475=>659,10476=>659,10477=>659,10478=>659,10479=>659,10480=>659,10481=>659,10482=>659,10483=>659,10484=>659,10485=>659,10486=>659,10487=>659,10488=>659,10489=>659,10490=>659,10491=>659,10492=>659,10493=>659,10494=>659,10495=>659,10496=>754,10497=>754,10498=>754,10499=>754,10500=>754,10501=>754,10502=>754,10503=>754,10504=>754,10505=>754,10506=>754,10507=>754,10508=>754,10509=>754,10510=>754,10511=>754,10512=>754,10513=>754,10514=>754,10515=>754,10516=>754,10517=>754,10518=>754,10519=>754,10520=>754,10521=>754,10522=>754,10523=>754,10524=>754,10525=>754,10526=>754,10527=>754,10528=>754,10529=>754,10530=>754,10531=>754,10532=>754,10533=>754,10534=>754,10535=>754,10536=>754,10537=>754,10538=>754,10539=>754,10540=>754,10541=>754,10542=>754,10543=>754,10544=>754,10545=>754,10546=>754,10547=>754,10548=>754,10549=>754,10550=>754,10551=>754,10552=>754,10553=>754,10554=>754,10555=>754,10556=>754,10557=>754,10558=>754,10559=>754,10560=>754,10561=>754,10562=>754,10563=>754,10564=>754,10565=>754,10566=>754,10567=>754,10568=>754,10569=>754,10570=>754,10571=>754,10572=>754,10573=>754,10574=>754,10575=>754,10576=>754,10577=>754,10578=>754,10579=>754,10580=>754,10581=>754,10582=>754,10583=>754,10584=>754,10585=>754,10586=>754,10587=>754,10588=>754,10589=>754,10590=>754,10591=>754,10592=>754,10593=>754,10594=>754,10595=>754,10596=>754,10597=>754,10598=>754,10599=>754,10600=>754,10601=>754,10602=>754,10603=>754,10604=>754,10605=>754,10606=>754,10607=>754,10608=>754,10609=>754,10610=>754,10611=>754,10612=>754,10613=>754,10614=>754,10615=>883,10616=>754,10617=>754,10618=>886,10619=>754,10620=>754,10621=>754,10622=>754,10623=>754,10731=>444,10764=>1361,10765=>469,10766=>469,10799=>754,11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754,11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754,11026=>850,11027=>850,11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11360=>598,11361=>288,11363=>605,11364=>677,11367=>785,11368=>580,11369=>672,11370=>545,11371=>625,11372=>474,11373=>704,11374=>921,11375=>650,11376=>704,11377=>596,11378=>1017,11379=>845,11381=>666,11382=>500,11383=>630,11385=>451,11386=>542,11388=>237,11389=>409,11390=>616,11391=>625,11520=>695,11521=>571,11522=>569,11523=>592,11524=>568,11525=>866,11526=>680,11527=>864,11528=>555,11529=>581,11530=>866,11531=>568,11532=>581,11533=>866,11534=>580,11535=>779,11536=>865,11537=>580,11538=>580,11539=>863,11540=>851,11541=>777,11542=>580,11543=>581,11544=>580,11545=>584,11546=>619,11547=>571,11548=>883,11549=>613,11550=>608,11551=>766,11552=>861,11553=>569,11554=>580,11555=>582,11556=>674,11557=>822,11800=>482,11810=>351,11811=>351,11812=>351,11813=>351,11822=>482,42564=>616,42565=>461,42566=>355,42567=>353,42576=>994,42577=>799,42580=>1074,42581=>783,42582=>1025,42583=>809,42760=>444,42761=>444,42762=>444,42763=>444,42764=>444,42765=>444,42766=>444,42767=>444,42768=>444,42769=>444,42770=>444,42771=>444,42772=>444,42773=>444,42774=>444,42779=>332,42780=>332,42781=>228,42782=>228,42783=>228,42790=>785,42791=>571,42792=>758,42793=>679,42794=>550,42795=>504,42796=>493,42797=>478,42798=>566,42799=>549,42800=>462,42801=>461,42802=>1075,42803=>850,42804=>1103,42805=>855,42806=>1034,42807=>840,42808=>871,42809=>705,42810=>871,42811=>705,42812=>866,42813=>742,42814=>688,42815=>504,42822=>708,42823=>391,42826=>838,42827=>640,42830=>1274,42831=>899,42856=>636,42857=>549,42875=>550,42876=>430,42880=>598,42881=>288,42882=>758,42883=>580,42884=>550,42885=>430,42886=>688,42887=>504,42891=>361,42892=>247,42893=>695,42896=>787,42897=>580,43002=>861,43003=>624,43004=>605,43005=>921,43006=>355,43007=>1081,62464=>588,62465=>598,62466=>642,62467=>853,62468=>598,62469=>593,62470=>652,62471=>888,62472=>598,62473=>598,62474=>1131,62475=>614,62476=>613,62477=>857,62478=>598,62479=>613,62480=>898,62481=>671,62482=>718,62483=>672,62484=>850,62485=>613,62486=>842,62487=>612,62488=>619,62489=>613,62490=>655,62491=>613,62492=>619,62493=>599,62494=>656,62495=>795,62496=>598,62497=>635,62498=>599,62499=>598,62500=>598,62501=>649,62502=>865,62504=>813,63173=>542,63185=>450,63188=>450,64256=>639,64257=>600,64258=>600,64259=>925,64260=>927,64261=>694,64262=>839,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>923,65535=>540);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensed.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensed.z
new file mode 100644
index 00000000..9ee716bf
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensed.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedb.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedb.ctg.z
new file mode 100644
index 00000000..383a8e0b
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedb.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedb.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedb.php
new file mode 100644
index 00000000..d24f72f6
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedb.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSerifCondensed-Bold';
+$up=-63;
+$ut=44;
+$dw=540;
+$diff='';
+$originalsize=316440;
+$enc='';
+$file='dejavuserifcondensedb.z';
+$ctg='dejavuserifcondensedb.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-752 -389 1617 1145]','ItalicAngle'=>0,'Ascent'=>939,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>519,'StemV'=>60,'StemH'=>26,'AvgWidth'=>509,'MaxWidth'=>1638,'MissingWidth'=>540);
+$cw=array(0=>540,32=>313,33=>395,34=>469,35=>754,36=>626,37=>855,38=>813,39=>275,40=>426,41=>426,42=>470,43=>754,44=>313,45=>374,46=>313,47=>329,48=>626,49=>626,50=>626,51=>626,52=>626,53=>626,54=>626,55=>626,56=>626,57=>626,58=>332,59=>332,60=>754,61=>754,62=>754,63=>527,64=>900,65=>698,66=>760,67=>716,68=>780,69=>686,70=>639,71=>769,72=>850,73=>421,74=>426,75=>782,76=>633,77=>996,78=>822,79=>784,80=>677,81=>784,82=>748,83=>650,84=>669,85=>785,86=>698,87=>1011,88=>698,89=>642,90=>657,91=>426,92=>329,93=>426,94=>754,95=>450,96=>450,97=>583,98=>629,99=>548,100=>629,101=>572,102=>387,103=>629,104=>654,105=>342,106=>325,107=>624,108=>342,109=>952,110=>654,111=>600,112=>629,113=>629,114=>474,115=>506,116=>416,117=>654,118=>523,119=>774,120=>536,121=>523,122=>511,123=>579,124=>327,125=>579,126=>754,160=>313,161=>395,162=>626,163=>626,164=>572,165=>626,166=>327,167=>470,168=>450,169=>900,170=>438,171=>563,172=>754,173=>374,174=>900,175=>450,176=>450,177=>754,178=>394,179=>394,180=>450,181=>659,182=>572,183=>313,184=>450,185=>394,186=>450,187=>563,188=>938,189=>938,190=>938,191=>527,192=>698,193=>698,194=>698,195=>698,196=>698,197=>698,198=>931,199=>716,200=>686,201=>686,202=>686,203=>686,204=>421,205=>421,206=>421,207=>421,208=>787,209=>822,210=>784,211=>784,212=>784,213=>784,214=>784,215=>754,216=>784,217=>785,218=>785,219=>785,220=>785,221=>642,222=>681,223=>684,224=>583,225=>583,226=>583,227=>583,228=>583,229=>583,230=>877,231=>548,232=>572,233=>572,234=>572,235=>572,236=>342,237=>342,238=>342,239=>342,240=>600,241=>654,242=>600,243=>600,244=>600,245=>600,246=>600,247=>754,248=>600,249=>654,250=>654,251=>654,252=>654,253=>523,254=>629,255=>523,256=>698,257=>583,258=>698,259=>583,260=>698,261=>583,262=>716,263=>548,264=>716,265=>548,266=>716,267=>548,268=>716,269=>548,270=>780,271=>629,272=>787,273=>629,274=>686,275=>572,276=>686,277=>572,278=>686,279=>572,280=>686,281=>572,282=>686,283=>572,284=>769,285=>629,286=>769,287=>629,288=>769,289=>629,290=>769,291=>629,292=>850,293=>654,294=>850,295=>654,296=>421,297=>342,298=>421,299=>342,300=>421,301=>342,302=>421,303=>342,304=>421,305=>342,306=>848,307=>676,308=>426,309=>325,310=>782,311=>624,312=>624,313=>633,314=>342,315=>633,316=>342,317=>633,318=>342,319=>633,320=>342,321=>639,322=>346,323=>822,324=>654,325=>822,326=>654,327=>822,328=>654,329=>907,330=>785,331=>654,332=>784,333=>600,334=>784,335=>600,336=>784,337=>600,338=>1062,339=>925,340=>748,341=>474,342=>748,343=>474,344=>748,345=>474,346=>650,347=>506,348=>650,349=>506,350=>650,351=>506,352=>650,353=>506,354=>669,355=>416,356=>669,357=>416,358=>669,359=>416,360=>785,361=>654,362=>785,363=>654,364=>785,365=>654,366=>785,367=>654,368=>785,369=>654,370=>785,371=>654,372=>1011,373=>774,374=>642,375=>523,376=>642,377=>657,378=>511,379=>657,380=>511,381=>657,382=>511,383=>387,384=>629,385=>760,386=>769,387=>629,388=>769,389=>629,390=>716,391=>716,392=>548,393=>787,394=>780,395=>769,396=>629,397=>600,398=>686,399=>784,400=>649,401=>639,402=>387,403=>769,404=>693,405=>938,406=>421,407=>421,408=>782,409=>624,410=>342,411=>631,412=>952,413=>822,414=>654,415=>784,416=>784,417=>600,418=>1080,419=>849,420=>677,421=>629,422=>748,423=>650,424=>506,425=>636,426=>298,427=>416,428=>669,429=>416,430=>669,431=>785,432=>654,433=>801,434=>801,435=>642,436=>637,437=>657,438=>511,439=>591,440=>591,441=>591,442=>591,443=>626,444=>678,445=>511,446=>482,447=>644,448=>265,449=>443,450=>413,451=>265,452=>1437,453=>1292,454=>1140,455=>1059,456=>958,457=>667,458=>1248,459=>1148,460=>980,461=>698,462=>583,463=>421,464=>342,465=>784,466=>600,467=>785,468=>654,469=>785,470=>654,471=>785,472=>654,473=>785,474=>654,475=>785,476=>654,477=>572,478=>698,479=>583,480=>698,481=>583,482=>931,483=>877,484=>806,485=>629,486=>769,487=>629,488=>782,489=>624,490=>784,491=>600,492=>784,493=>600,494=>591,495=>511,496=>342,497=>1437,498=>1292,499=>1140,500=>769,501=>629,502=>1099,503=>708,504=>822,505=>654,506=>698,507=>583,508=>931,509=>877,510=>784,511=>600,512=>698,513=>583,514=>698,515=>583,516=>686,517=>572,518=>686,519=>572,520=>421,521=>342,522=>421,523=>342,524=>784,525=>600,526=>784,527=>600,528=>748,529=>474,530=>748,531=>474,532=>785,533=>654,534=>785,535=>654,536=>650,537=>506,538=>669,539=>416,540=>621,541=>546,542=>850,543=>654,544=>785,545=>711,546=>632,547=>554,548=>657,549=>511,550=>698,551=>583,552=>686,553=>572,554=>784,555=>600,556=>784,557=>600,558=>784,559=>600,560=>784,561=>600,562=>642,563=>523,564=>516,565=>830,566=>508,567=>325,568=>928,569=>928,570=>698,571=>716,572=>548,573=>633,574=>669,575=>506,576=>511,577=>594,578=>492,579=>760,580=>785,581=>698,582=>686,583=>572,584=>426,585=>348,586=>763,587=>629,588=>748,589=>474,590=>642,591=>523,592=>583,593=>629,594=>629,595=>629,596=>548,597=>548,598=>629,599=>657,600=>572,601=>572,602=>816,603=>547,604=>505,605=>816,606=>647,607=>348,608=>629,609=>629,610=>563,611=>641,612=>564,613=>654,614=>654,615=>654,616=>342,617=>342,618=>342,619=>368,620=>462,621=>342,622=>716,623=>952,624=>952,625=>952,626=>654,627=>654,628=>641,629=>600,630=>955,631=>674,632=>600,633=>514,634=>514,635=>514,636=>474,637=>474,638=>406,639=>438,640=>721,641=>721,642=>506,643=>298,644=>387,645=>486,646=>298,647=>443,648=>416,649=>654,650=>611,651=>624,652=>577,653=>816,654=>571,655=>654,656=>511,657=>511,658=>511,659=>511,660=>482,661=>482,662=>482,663=>490,664=>784,665=>625,666=>647,667=>563,668=>659,669=>345,670=>666,671=>581,672=>629,673=>482,674=>482,675=>1005,676=>1061,677=>1005,678=>819,679=>643,680=>817,681=>935,682=>711,683=>716,684=>596,685=>398,686=>552,687=>646,688=>469,689=>466,690=>282,691=>372,692=>372,693=>432,694=>474,695=>595,696=>436,697=>271,699=>313,700=>313,701=>313,702=>330,703=>330,704=>282,705=>282,710=>450,711=>450,712=>254,713=>450,716=>254,717=>450,720=>332,721=>332,722=>330,723=>330,726=>353,728=>450,729=>450,730=>450,731=>450,732=>450,733=>450,734=>375,736=>412,737=>263,738=>355,739=>427,740=>282,741=>450,742=>450,743=>450,744=>450,745=>450,750=>498,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>701,881=>519,882=>722,883=>699,884=>271,885=>271,886=>866,887=>664,890=>450,891=>548,892=>548,893=>548,894=>332,900=>450,901=>450,902=>698,903=>313,904=>852,905=>1006,906=>595,908=>798,910=>857,911=>820,912=>435,913=>698,914=>760,915=>639,916=>698,917=>686,918=>657,919=>850,920=>784,921=>421,922=>782,923=>698,924=>996,925=>822,926=>633,927=>784,928=>850,929=>677,931=>636,932=>669,933=>642,934=>784,935=>698,936=>822,937=>801,938=>421,939=>642,940=>692,941=>547,942=>654,943=>435,944=>624,945=>692,946=>598,947=>594,948=>600,949=>547,950=>533,951=>654,952=>600,953=>435,954=>674,955=>631,956=>659,957=>624,958=>533,959=>600,960=>659,961=>598,962=>548,963=>664,964=>605,965=>624,966=>814,967=>592,968=>847,969=>857,970=>435,971=>624,972=>600,973=>624,974=>857,975=>782,976=>600,977=>764,978=>687,979=>872,980=>687,981=>847,982=>857,983=>589,984=>784,985=>600,986=>716,987=>548,988=>639,989=>475,990=>531,991=>593,992=>716,993=>600,1008=>589,1009=>598,1010=>548,1011=>325,1012=>784,1013=>548,1014=>548,1015=>681,1016=>629,1017=>716,1018=>996,1019=>774,1020=>623,1021=>716,1022=>716,1023=>716,1024=>686,1025=>686,1026=>811,1027=>621,1028=>716,1029=>650,1030=>421,1031=>421,1032=>426,1033=>1081,1034=>1135,1035=>866,1036=>818,1037=>850,1038=>730,1039=>850,1040=>733,1041=>769,1042=>760,1043=>621,1044=>800,1045=>686,1046=>1181,1047=>649,1048=>850,1049=>850,1050=>818,1051=>795,1052=>996,1053=>850,1054=>784,1055=>850,1056=>677,1057=>716,1058=>669,1059=>730,1060=>854,1061=>698,1062=>870,1063=>822,1064=>1141,1065=>1164,1066=>861,1067=>1081,1068=>743,1069=>716,1070=>1158,1071=>793,1072=>583,1073=>600,1074=>625,1075=>551,1076=>600,1077=>572,1078=>909,1079=>574,1080=>667,1081=>667,1082=>650,1083=>634,1084=>782,1085=>659,1086=>600,1087=>659,1088=>629,1089=>548,1090=>558,1091=>576,1092=>812,1093=>536,1094=>665,1095=>659,1096=>967,1097=>974,1098=>690,1099=>902,1100=>611,1101=>548,1102=>923,1103=>665,1104=>572,1105=>572,1106=>646,1107=>551,1108=>548,1109=>506,1110=>342,1111=>342,1112=>325,1113=>889,1114=>913,1115=>654,1116=>650,1117=>667,1118=>576,1119=>659,1122=>792,1123=>633,1124=>1076,1125=>867,1130=>1181,1131=>909,1136=>986,1137=>995,1138=>784,1139=>587,1140=>824,1141=>673,1164=>761,1165=>606,1168=>630,1169=>556,1170=>621,1171=>551,1172=>781,1173=>645,1174=>1181,1175=>909,1176=>649,1177=>574,1178=>852,1179=>669,1182=>818,1183=>650,1184=>937,1185=>744,1186=>870,1187=>665,1188=>1050,1189=>860,1190=>1210,1191=>953,1194=>716,1195=>548,1196=>669,1197=>558,1198=>642,1199=>523,1200=>642,1201=>523,1202=>779,1203=>584,1204=>919,1205=>726,1206=>835,1207=>665,1210=>819,1211=>654,1216=>421,1217=>1181,1218=>909,1219=>782,1220=>624,1223=>850,1224=>659,1227=>822,1228=>659,1231=>342,1232=>733,1233=>583,1234=>733,1235=>583,1236=>931,1237=>877,1238=>686,1239=>572,1240=>784,1241=>572,1242=>784,1243=>572,1244=>1181,1245=>909,1246=>649,1247=>574,1248=>591,1249=>511,1250=>850,1251=>667,1252=>850,1253=>667,1254=>784,1255=>600,1256=>784,1257=>600,1258=>784,1259=>600,1260=>716,1261=>548,1262=>730,1263=>576,1264=>730,1265=>576,1266=>730,1267=>576,1268=>822,1269=>659,1270=>621,1271=>551,1272=>1081,1273=>902,1296=>649,1297=>574,1298=>795,1299=>634,1300=>1123,1301=>851,1306=>738,1307=>576,1308=>925,1309=>770,1329=>848,1330=>748,1331=>804,1332=>817,1333=>739,1334=>738,1335=>672,1336=>748,1337=>1013,1338=>804,1339=>722,1340=>650,1341=>1069,1342=>798,1343=>757,1344=>663,1345=>777,1346=>826,1347=>766,1348=>879,1349=>750,1350=>822,1351=>759,1352=>784,1353=>736,1354=>931,1355=>761,1356=>867,1357=>784,1358=>822,1359=>727,1360=>727,1361=>752,1362=>639,1363=>859,1364=>802,1365=>784,1366=>867,1369=>276,1370=>237,1371=>264,1372=>352,1373=>290,1374=>396,1375=>450,1377=>949,1378=>625,1379=>699,1380=>721,1381=>655,1382=>668,1383=>539,1384=>660,1385=>818,1386=>690,1387=>651,1388=>358,1389=>978,1390=>625,1391=>647,1392=>663,1393=>615,1394=>664,1395=>633,1396=>651,1397=>323,1398=>647,1399=>446,1400=>664,1401=>385,1402=>953,1403=>602,1404=>669,1405=>651,1406=>651,1407=>936,1408=>651,1409=>642,1410=>444,1411=>936,1412=>660,1413=>624,1414=>860,1415=>750,1417=>306,1418=>349,4256=>680,4257=>842,4258=>779,4259=>787,4260=>703,4261=>970,4262=>913,4263=>1091,4264=>579,4265=>736,4266=>946,4267=>945,4268=>716,4269=>1021,4270=>872,4271=>812,4272=>998,4273=>712,4274=>680,4275=>968,4276=>878,4277=>959,4278=>729,4279=>750,4280=>739,4281=>750,4282=>817,4283=>969,4284=>692,4285=>739,4286=>731,4287=>1000,4288=>1010,4289=>721,4290=>803,4291=>722,4292=>792,4293=>957,4304=>535,4305=>563,4306=>579,4307=>798,4308=>553,4309=>549,4310=>600,4311=>823,4312=>552,4313=>540,4314=>1008,4315=>576,4316=>576,4317=>791,4318=>561,4319=>571,4320=>790,4321=>599,4322=>702,4323=>676,4324=>782,4325=>575,4326=>820,4327=>559,4328=>583,4329=>576,4330=>656,4331=>577,4332=>567,4333=>566,4334=>603,4335=>678,4336=>563,4337=>591,4338=>563,4339=>563,4340=>562,4341=>603,4342=>846,4343=>612,4344=>572,4345=>605,4346=>562,4347=>529,4348=>318,7424=>577,7425=>802,7426=>846,7427=>625,7428=>548,7429=>607,7430=>607,7431=>555,7432=>458,7433=>288,7434=>505,7435=>650,7436=>555,7437=>782,7438=>664,7439=>600,7440=>548,7441=>565,7442=>565,7443=>600,7444=>890,7445=>538,7446=>600,7447=>600,7448=>527,7449=>721,7450=>721,7451=>558,7452=>583,7453=>597,7454=>831,7455=>589,7456=>523,7457=>774,7458=>511,7459=>511,7460=>529,7461=>721,7462=>527,7463=>577,7464=>659,7465=>527,7466=>769,7467=>634,7468=>439,7469=>586,7470=>479,7471=>479,7472=>491,7473=>432,7474=>432,7475=>483,7476=>536,7477=>265,7478=>268,7479=>492,7480=>398,7481=>627,7482=>518,7483=>545,7484=>493,7485=>398,7486=>426,7487=>471,7488=>409,7489=>422,7490=>494,7491=>419,7492=>419,7493=>448,7494=>591,7495=>448,7496=>448,7497=>400,7498=>400,7499=>370,7500=>370,7501=>448,7502=>270,7503=>471,7504=>655,7505=>426,7506=>420,7507=>384,7508=>420,7509=>420,7510=>448,7511=>333,7512=>468,7513=>376,7514=>655,7515=>442,7516=>454,7517=>376,7518=>374,7519=>378,7520=>513,7521=>373,7522=>215,7523=>372,7524=>468,7525=>442,7526=>376,7527=>374,7528=>377,7529=>513,7530=>373,7531=>937,7543=>576,7544=>536,7547=>342,7557=>342,7579=>448,7580=>384,7581=>384,7582=>420,7583=>370,7584=>345,7585=>335,7586=>448,7587=>470,7588=>270,7589=>276,7590=>270,7591=>270,7592=>333,7593=>331,7594=>289,7595=>387,7596=>613,7597=>655,7598=>529,7599=>528,7600=>425,7601=>420,7602=>470,7603=>360,7604=>348,7605=>333,7606=>468,7607=>427,7608=>367,7609=>439,7610=>442,7611=>371,7612=>474,7613=>371,7614=>407,7615=>420,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>698,7681=>583,7682=>760,7683=>629,7684=>760,7685=>629,7686=>760,7687=>629,7688=>716,7689=>548,7690=>780,7691=>629,7692=>780,7693=>629,7694=>780,7695=>629,7696=>780,7697=>629,7698=>780,7699=>629,7700=>686,7701=>572,7702=>686,7703=>572,7704=>686,7705=>572,7706=>686,7707=>572,7708=>686,7709=>572,7710=>639,7711=>387,7712=>769,7713=>629,7714=>850,7715=>654,7716=>850,7717=>654,7718=>850,7719=>654,7720=>850,7721=>654,7722=>850,7723=>654,7724=>421,7725=>342,7726=>421,7727=>342,7728=>782,7729=>624,7730=>782,7731=>624,7732=>782,7733=>624,7734=>633,7735=>342,7736=>633,7737=>342,7738=>633,7739=>342,7740=>633,7741=>342,7742=>996,7743=>952,7744=>996,7745=>952,7746=>996,7747=>952,7748=>822,7749=>654,7750=>822,7751=>654,7752=>822,7753=>654,7754=>822,7755=>654,7756=>784,7757=>600,7758=>784,7759=>600,7760=>784,7761=>600,7762=>784,7763=>600,7764=>677,7765=>629,7766=>677,7767=>629,7768=>748,7769=>474,7770=>748,7771=>474,7772=>748,7773=>474,7774=>748,7775=>474,7776=>650,7777=>506,7778=>650,7779=>506,7780=>650,7781=>506,7782=>650,7783=>506,7784=>650,7785=>506,7786=>669,7787=>416,7788=>669,7789=>416,7790=>669,7791=>416,7792=>669,7793=>416,7794=>785,7795=>654,7796=>785,7797=>654,7798=>785,7799=>654,7800=>785,7801=>654,7802=>785,7803=>654,7804=>698,7805=>523,7806=>698,7807=>523,7808=>1011,7809=>774,7810=>1011,7811=>774,7812=>1011,7813=>774,7814=>1011,7815=>774,7816=>1011,7817=>774,7818=>698,7819=>536,7820=>698,7821=>536,7822=>642,7823=>523,7824=>657,7825=>511,7826=>657,7827=>511,7828=>657,7829=>511,7830=>654,7831=>416,7832=>774,7833=>523,7834=>913,7835=>387,7836=>387,7837=>387,7838=>852,7839=>600,7840=>698,7841=>583,7842=>698,7843=>583,7844=>698,7845=>583,7846=>698,7847=>583,7848=>698,7849=>583,7850=>698,7851=>583,7852=>698,7853=>583,7854=>698,7855=>583,7856=>698,7857=>583,7858=>698,7859=>583,7860=>698,7861=>583,7862=>698,7863=>583,7864=>686,7865=>572,7866=>686,7867=>572,7868=>686,7869=>572,7870=>686,7871=>572,7872=>686,7873=>572,7874=>686,7875=>572,7876=>686,7877=>572,7878=>686,7879=>572,7880=>421,7881=>342,7882=>421,7883=>342,7884=>784,7885=>600,7886=>784,7887=>600,7888=>784,7889=>600,7890=>784,7891=>600,7892=>784,7893=>600,7894=>784,7895=>600,7896=>784,7897=>600,7898=>784,7899=>600,7900=>784,7901=>600,7902=>784,7903=>600,7904=>784,7905=>600,7906=>784,7907=>600,7908=>785,7909=>654,7910=>785,7911=>654,7912=>785,7913=>654,7914=>785,7915=>654,7916=>785,7917=>654,7918=>785,7919=>654,7920=>785,7921=>654,7922=>642,7923=>523,7924=>642,7925=>523,7926=>642,7927=>523,7928=>642,7929=>523,7930=>970,7931=>630,7936=>692,7937=>692,7938=>692,7939=>692,7940=>692,7941=>692,7942=>692,7943=>692,7944=>698,7945=>698,7946=>880,7947=>880,7948=>748,7949=>764,7950=>698,7951=>698,7952=>547,7953=>547,7954=>547,7955=>547,7956=>547,7957=>547,7960=>826,7961=>817,7962=>1052,7963=>1052,7964=>984,7965=>1007,7968=>654,7969=>654,7970=>654,7971=>654,7972=>654,7973=>654,7974=>654,7975=>654,7976=>990,7977=>984,7978=>1222,7979=>1225,7980=>1151,7981=>1177,7982=>1077,7983=>1074,7984=>435,7985=>435,7986=>435,7987=>435,7988=>435,7989=>435,7990=>435,7991=>435,7992=>566,7993=>555,7994=>790,7995=>792,7996=>719,7997=>748,7998=>650,7999=>642,8000=>600,8001=>600,8002=>600,8003=>600,8004=>600,8005=>600,8008=>810,8009=>841,8010=>1116,8011=>1113,8012=>931,8013=>959,8016=>624,8017=>624,8018=>624,8019=>624,8020=>624,8021=>624,8022=>624,8023=>624,8025=>830,8027=>1067,8029=>1020,8031=>917,8032=>857,8033=>857,8034=>857,8035=>857,8036=>857,8037=>857,8038=>857,8039=>857,8040=>838,8041=>867,8042=>1141,8043=>1146,8044=>949,8045=>979,8046=>920,8047=>954,8048=>692,8049=>692,8050=>547,8051=>547,8052=>654,8053=>654,8054=>435,8055=>435,8056=>600,8057=>600,8058=>624,8059=>624,8060=>857,8061=>857,8064=>692,8065=>692,8066=>692,8067=>692,8068=>692,8069=>692,8070=>692,8071=>692,8072=>698,8073=>698,8074=>880,8075=>880,8076=>748,8077=>764,8078=>698,8079=>698,8080=>654,8081=>654,8082=>654,8083=>654,8084=>654,8085=>654,8086=>654,8087=>654,8088=>990,8089=>984,8090=>1222,8091=>1225,8092=>1151,8093=>1177,8094=>1077,8095=>1074,8096=>857,8097=>857,8098=>857,8099=>857,8100=>857,8101=>857,8102=>857,8103=>857,8104=>838,8105=>867,8106=>1141,8107=>1146,8108=>949,8109=>979,8110=>920,8111=>954,8112=>692,8113=>692,8114=>692,8115=>692,8116=>692,8118=>692,8119=>692,8120=>698,8121=>698,8122=>729,8123=>698,8124=>698,8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>654,8131=>654,8132=>654,8134=>654,8135=>654,8136=>899,8137=>852,8138=>1072,8139=>1006,8140=>850,8141=>450,8142=>450,8143=>450,8144=>435,8145=>435,8146=>435,8147=>435,8150=>435,8151=>435,8152=>421,8153=>421,8154=>642,8155=>595,8157=>450,8158=>450,8159=>450,8160=>624,8161=>624,8162=>624,8163=>624,8164=>598,8165=>598,8166=>624,8167=>624,8168=>642,8169=>642,8170=>917,8171=>857,8172=>819,8173=>450,8174=>450,8175=>450,8178=>857,8179=>857,8180=>857,8182=>857,8183=>857,8184=>962,8185=>798,8186=>991,8187=>820,8188=>801,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>626,8200=>313,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>374,8209=>374,8210=>626,8211=>450,8212=>900,8213=>900,8214=>450,8215=>450,8216=>313,8217=>313,8218=>313,8219=>313,8220=>518,8221=>518,8222=>518,8223=>518,8224=>470,8225=>470,8226=>575,8227=>575,8228=>313,8229=>606,8230=>900,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180,8240=>1246,8241=>1638,8242=>237,8243=>402,8244=>567,8245=>237,8246=>402,8247=>567,8248=>659,8249=>360,8250=>360,8252=>566,8253=>527,8254=>450,8258=>920,8260=>150,8261=>426,8262=>426,8263=>974,8264=>770,8265=>770,8267=>572,8268=>450,8269=>450,8270=>470,8271=>332,8273=>470,8274=>500,8275=>900,8279=>731,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>394,8305=>215,8308=>394,8309=>394,8310=>394,8311=>394,8312=>394,8313=>394,8314=>475,8315=>475,8316=>475,8317=>268,8318=>268,8319=>467,8320=>394,8321=>394,8322=>394,8323=>394,8324=>394,8325=>394,8326=>394,8327=>394,8328=>394,8329=>394,8330=>475,8331=>475,8332=>475,8333=>268,8334=>268,8336=>419,8337=>400,8338=>420,8339=>427,8340=>400,8341=>469,8342=>471,8343=>263,8344=>655,8345=>467,8346=>448,8347=>355,8348=>333,8358=>626,8364=>626,8367=>1039,8369=>710,8372=>788,8373=>626,8377=>626,8451=>1078,8457=>1001,8462=>654,8463=>654,8470=>978,8482=>900,8486=>801,8487=>801,8490=>782,8491=>698,8513=>697,8514=>501,8515=>573,8516=>684,8523=>813,8528=>932,8529=>932,8530=>1326,8531=>932,8532=>932,8533=>932,8534=>932,8535=>932,8536=>932,8537=>932,8538=>932,8539=>932,8540=>932,8541=>932,8542=>932,8543=>554,8544=>421,8545=>663,8546=>904,8547=>984,8548=>698,8549=>1014,8550=>1256,8551=>1498,8552=>962,8553=>698,8554=>970,8555=>1212,8556=>633,8557=>716,8558=>780,8559=>996,8560=>342,8561=>684,8562=>1025,8563=>865,8564=>523,8565=>865,8566=>1207,8567=>1548,8568=>878,8569=>536,8570=>878,8571=>1220,8572=>342,8573=>548,8574=>629,8575=>952,8576=>1129,8577=>780,8578=>1141,8579=>716,8580=>548,8581=>716,8585=>932,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754,8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754,8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754,8620=>754,8621=>754,8622=>754,8623=>765,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754,8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754,8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754,8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754,8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754,8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754,8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754,8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754,8700=>754,8701=>754,8702=>754,8703=>754,8704=>577,8706=>480,8707=>558,8708=>558,8710=>677,8711=>677,8712=>666,8713=>666,8715=>666,8716=>666,8719=>757,8720=>757,8721=>677,8722=>754,8723=>754,8724=>754,8725=>329,8727=>622,8728=>466,8729=>466,8730=>591,8731=>591,8732=>591,8733=>604,8734=>750,8735=>754,8736=>754,8739=>292,8740=>546,8741=>476,8742=>696,8743=>730,8744=>730,8745=>754,8746=>754,8747=>521,8748=>900,8749=>1252,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754,8770=>754,8771=>754,8776=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>974,8789=>974,8800=>754,8801=>754,8804=>754,8805=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8844=>754,8845=>754,8846=>754,8847=>754,8848=>754,8849=>754,8850=>754,8851=>754,8852=>754,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754,8865=>754,8866=>795,8867=>795,8868=>864,8869=>864,8870=>554,8871=>554,8872=>795,8873=>795,8874=>795,8875=>971,8876=>795,8877=>795,8878=>795,8879=>971,8901=>358,8962=>751,8968=>426,8969=>426,8970=>426,8971=>426,8976=>754,8977=>484,8984=>835,8985=>754,8992=>521,8993=>521,8997=>900,9000=>1299,9085=>907,9115=>450,9116=>450,9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450,9125=>450,9126=>450,9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>521,9167=>850,9251=>751,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474,9687=>474,9688=>712,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>785,9697=>785,9698=>692,9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850,9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659,9727=>692,9728=>807,9784=>807,9785=>807,9786=>807,9787=>807,9788=>807,9791=>552,9792=>658,9793=>658,9794=>807,9795=>807,9796=>807,9797=>807,9798=>807,9799=>807,9824=>807,9825=>807,9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424,9838=>321,9839=>435,10145=>754,10181=>411,10182=>411,10208=>444,10216=>411,10217=>411,10224=>754,10225=>754,10226=>754,10227=>754,10228=>930,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290,10237=>1290,10238=>1290,10239=>1290,10240=>703,10241=>703,10242=>703,10243=>703,10244=>703,10245=>703,10246=>703,10247=>703,10248=>703,10249=>703,10250=>703,10251=>703,10252=>703,10253=>703,10254=>703,10255=>703,10256=>703,10257=>703,10258=>703,10259=>703,10260=>703,10261=>703,10262=>703,10263=>703,10264=>703,10265=>703,10266=>703,10267=>703,10268=>703,10269=>703,10270=>703,10271=>703,10272=>703,10273=>703,10274=>703,10275=>703,10276=>703,10277=>703,10278=>703,10279=>703,10280=>703,10281=>703,10282=>703,10283=>703,10284=>703,10285=>703,10286=>703,10287=>703,10288=>703,10289=>703,10290=>703,10291=>703,10292=>703,10293=>703,10294=>703,10295=>703,10296=>703,10297=>703,10298=>703,10299=>703,10300=>703,10301=>703,10302=>703,10303=>703,10304=>703,10305=>703,10306=>703,10307=>703,10308=>703,10309=>703,10310=>703,10311=>703,10312=>703,10313=>703,10314=>703,10315=>703,10316=>703,10317=>703,10318=>703,10319=>703,10320=>703,10321=>703,10322=>703,10323=>703,10324=>703,10325=>703,10326=>703,10327=>703,10328=>703,10329=>703,10330=>703,10331=>703,10332=>703,10333=>703,10334=>703,10335=>703,10336=>703,10337=>703,10338=>703,10339=>703,10340=>703,10341=>703,10342=>703,10343=>703,10344=>703,10345=>703,10346=>703,10347=>703,10348=>703,10349=>703,10350=>703,10351=>703,10352=>703,10353=>703,10354=>703,10355=>703,10356=>703,10357=>703,10358=>703,10359=>703,10360=>703,10361=>703,10362=>703,10363=>703,10364=>703,10365=>703,10366=>703,10367=>703,10368=>703,10369=>703,10370=>703,10371=>703,10372=>703,10373=>703,10374=>703,10375=>703,10376=>703,10377=>703,10378=>703,10379=>703,10380=>703,10381=>703,10382=>703,10383=>703,10384=>703,10385=>703,10386=>703,10387=>703,10388=>703,10389=>703,10390=>703,10391=>703,10392=>703,10393=>703,10394=>703,10395=>703,10396=>703,10397=>703,10398=>703,10399=>703,10400=>703,10401=>703,10402=>703,10403=>703,10404=>703,10405=>703,10406=>703,10407=>703,10408=>703,10409=>703,10410=>703,10411=>703,10412=>703,10413=>703,10414=>703,10415=>703,10416=>703,10417=>703,10418=>703,10419=>703,10420=>703,10421=>703,10422=>703,10423=>703,10424=>703,10425=>703,10426=>703,10427=>703,10428=>703,10429=>703,10430=>703,10431=>703,10432=>703,10433=>703,10434=>703,10435=>703,10436=>703,10437=>703,10438=>703,10439=>703,10440=>703,10441=>703,10442=>703,10443=>703,10444=>703,10445=>703,10446=>703,10447=>703,10448=>703,10449=>703,10450=>703,10451=>703,10452=>703,10453=>703,10454=>703,10455=>703,10456=>703,10457=>703,10458=>703,10459=>703,10460=>703,10461=>703,10462=>703,10463=>703,10464=>703,10465=>703,10466=>703,10467=>703,10468=>703,10469=>703,10470=>703,10471=>703,10472=>703,10473=>703,10474=>703,10475=>703,10476=>703,10477=>703,10478=>703,10479=>703,10480=>703,10481=>703,10482=>703,10483=>703,10484=>703,10485=>703,10486=>703,10487=>703,10488=>703,10489=>703,10490=>703,10491=>703,10492=>703,10493=>703,10494=>703,10495=>703,10496=>754,10497=>754,10498=>754,10499=>754,10500=>754,10501=>754,10502=>754,10503=>754,10504=>754,10505=>754,10506=>754,10507=>754,10508=>754,10509=>754,10510=>754,10511=>754,10512=>754,10513=>754,10514=>754,10515=>754,10516=>754,10517=>754,10518=>754,10519=>754,10520=>754,10521=>754,10522=>754,10523=>754,10524=>754,10525=>754,10526=>754,10527=>754,10528=>754,10529=>754,10530=>754,10531=>754,10532=>754,10533=>754,10534=>754,10535=>754,10536=>754,10537=>754,10538=>754,10539=>754,10540=>754,10541=>754,10542=>754,10543=>754,10544=>754,10545=>754,10546=>754,10547=>754,10548=>754,10549=>754,10550=>754,10551=>754,10552=>754,10553=>754,10554=>754,10555=>754,10556=>754,10557=>754,10558=>754,10559=>754,10560=>754,10561=>754,10562=>754,10563=>754,10564=>754,10565=>754,10566=>754,10567=>754,10568=>754,10569=>754,10570=>754,10571=>754,10572=>754,10573=>754,10574=>754,10575=>754,10576=>754,10577=>754,10578=>754,10579=>754,10580=>754,10581=>754,10582=>754,10583=>754,10584=>754,10585=>754,10586=>754,10587=>754,10588=>754,10589=>754,10590=>754,10591=>754,10592=>754,10593=>754,10594=>754,10595=>754,10596=>754,10597=>754,10598=>754,10599=>754,10600=>754,10601=>754,10602=>754,10603=>754,10604=>754,10605=>754,10606=>754,10607=>754,10608=>754,10609=>754,10610=>754,10611=>754,10612=>754,10613=>754,10614=>754,10615=>929,10616=>754,10617=>754,10618=>864,10619=>754,10620=>754,10621=>754,10622=>754,10623=>754,10731=>444,10764=>1604,10765=>549,10766=>549,10799=>754,11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754,11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754,11026=>850,11027=>850,11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11360=>633,11361=>342,11363=>677,11364=>748,11367=>850,11368=>654,11369=>782,11370=>624,11371=>657,11372=>511,11373=>763,11374=>996,11375=>698,11376=>763,11377=>638,11378=>1099,11379=>886,11381=>701,11382=>541,11383=>814,11385=>514,11386=>600,11388=>282,11389=>439,11390=>650,11391=>657,11520=>695,11521=>571,11522=>723,11523=>592,11524=>708,11525=>866,11526=>680,11527=>864,11528=>555,11529=>581,11530=>866,11531=>567,11532=>581,11533=>866,11534=>761,11535=>779,11536=>865,11537=>580,11538=>580,11539=>863,11540=>851,11541=>777,11542=>580,11543=>581,11544=>580,11545=>584,11546=>619,11547=>842,11548=>883,11549=>613,11550=>608,11551=>766,11552=>1002,11553=>569,11554=>580,11555=>582,11556=>674,11557=>822,11800=>527,11810=>426,11811=>426,11812=>426,11813=>426,11822=>527,42564=>650,42565=>506,42566=>421,42567=>342,42576=>1200,42577=>982,42580=>1158,42581=>923,42582=>1158,42583=>935,42760=>450,42761=>450,42762=>450,42763=>450,42764=>450,42765=>450,42766=>450,42767=>450,42768=>450,42769=>450,42770=>450,42771=>450,42772=>450,42773=>450,42774=>450,42779=>346,42780=>346,42781=>249,42782=>249,42783=>249,42790=>850,42791=>641,42792=>903,42793=>817,42794=>626,42795=>548,42796=>570,42797=>538,42798=>667,42799=>635,42800=>533,42801=>506,42802=>1170,42803=>887,42804=>1134,42805=>903,42806=>1051,42807=>907,42808=>914,42809=>731,42810=>914,42811=>731,42812=>895,42813=>762,42814=>716,42815=>548,42822=>824,42823=>523,42826=>909,42827=>692,42830=>1303,42831=>954,42856=>708,42857=>644,42875=>625,42876=>474,42880=>633,42881=>342,42882=>785,42883=>654,42884=>625,42885=>474,42886=>716,42887=>548,42891=>395,42892=>275,42893=>822,42896=>822,42897=>654,43002=>962,43003=>639,43004=>677,43005=>996,43006=>421,43007=>1157,62464=>634,62465=>645,62466=>688,62467=>898,62468=>645,62469=>639,62470=>698,62471=>934,62472=>645,62473=>645,62474=>1178,62475=>660,62476=>659,62477=>903,62478=>645,62479=>659,62480=>945,62481=>717,62482=>765,62483=>719,62484=>896,62485=>659,62486=>888,62487=>658,62488=>665,62489=>659,62490=>702,62491=>659,62492=>665,62493=>646,62494=>702,62495=>842,62496=>644,62497=>743,62498=>645,62499=>645,62500=>645,62501=>695,62502=>911,62504=>813,63173=>600,63185=>450,63188=>450,64256=>738,64257=>654,64258=>654,64259=>1007,64260=>1005,64261=>784,64262=>874,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1002,65535=>540);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedb.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedb.z
new file mode 100644
index 00000000..97ae26c9
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedb.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedbi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedbi.ctg.z
new file mode 100644
index 00000000..eac5b937
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedbi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedbi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedbi.php
new file mode 100644
index 00000000..7e84a473
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedbi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSerifCondensed-BoldItalic';
+$up=-63;
+$ut=44;
+$dw=540;
+$diff='';
+$originalsize=331128;
+$enc='';
+$file='dejavuserifcondensedbi.z';
+$ctg='dejavuserifcondensedbi.ctg.z';
+$desc=array('Flags'=>96,'FontBBox'=>'[-815 -389 1579 1145]','ItalicAngle'=>-11,'Ascent'=>939,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>519,'StemV'=>60,'StemH'=>26,'AvgWidth'=>509,'MaxWidth'=>1631,'MissingWidth'=>540);
+$cw=array(0=>540,32=>313,33=>395,34=>469,35=>754,36=>626,37=>855,38=>813,39=>275,40=>426,41=>426,42=>470,43=>754,44=>313,45=>374,46=>313,47=>329,48=>626,49=>626,50=>626,51=>626,52=>626,53=>626,54=>626,55=>626,56=>626,57=>626,58=>332,59=>332,60=>754,61=>754,62=>754,63=>527,64=>900,65=>698,66=>760,67=>716,68=>780,69=>686,70=>639,71=>769,72=>850,73=>421,74=>426,75=>782,76=>633,77=>996,78=>822,79=>784,80=>677,81=>784,82=>748,83=>650,84=>669,85=>785,86=>698,87=>1011,88=>698,89=>642,90=>657,91=>426,92=>329,93=>426,94=>754,95=>450,96=>450,97=>583,98=>629,99=>548,100=>629,101=>572,102=>387,103=>629,104=>654,105=>342,106=>325,107=>624,108=>342,109=>952,110=>654,111=>600,112=>629,113=>629,114=>474,115=>506,116=>416,117=>654,118=>523,119=>774,120=>536,121=>523,122=>511,123=>579,124=>327,125=>579,126=>754,160=>313,161=>395,162=>626,163=>626,164=>572,165=>626,166=>327,167=>470,168=>450,169=>900,170=>438,171=>563,172=>754,173=>374,174=>900,175=>450,176=>450,177=>754,178=>394,179=>394,180=>450,181=>659,182=>572,183=>313,184=>450,185=>394,186=>450,187=>563,188=>938,189=>938,190=>938,191=>527,192=>698,193=>698,194=>698,195=>698,196=>698,197=>698,198=>931,199=>716,200=>686,201=>686,202=>686,203=>686,204=>421,205=>421,206=>421,207=>421,208=>787,209=>822,210=>784,211=>784,212=>784,213=>784,214=>784,215=>754,216=>784,217=>785,218=>785,219=>785,220=>785,221=>642,222=>681,223=>684,224=>583,225=>583,226=>583,227=>583,228=>583,229=>583,230=>838,231=>548,232=>572,233=>572,234=>572,235=>572,236=>342,237=>342,238=>342,239=>342,240=>600,241=>654,242=>600,243=>600,244=>600,245=>600,246=>600,247=>754,248=>600,249=>654,250=>654,251=>654,252=>654,253=>523,254=>629,255=>523,256=>698,257=>583,258=>698,259=>583,260=>698,261=>583,262=>716,263=>548,264=>716,265=>548,266=>716,267=>548,268=>716,269=>548,270=>780,271=>629,272=>787,273=>629,274=>686,275=>572,276=>686,277=>572,278=>686,279=>572,280=>686,281=>572,282=>686,283=>572,284=>769,285=>629,286=>769,287=>629,288=>769,289=>629,290=>769,291=>629,292=>850,293=>654,294=>850,295=>654,296=>421,297=>342,298=>421,299=>342,300=>421,301=>342,302=>421,303=>342,304=>421,305=>342,306=>848,307=>676,308=>426,309=>325,310=>782,311=>624,312=>624,313=>633,314=>342,315=>633,316=>342,317=>633,318=>457,319=>633,320=>501,321=>639,322=>346,323=>822,324=>654,325=>822,326=>654,327=>822,328=>654,329=>907,330=>785,331=>654,332=>784,333=>600,334=>784,335=>600,336=>784,337=>600,338=>1062,339=>925,340=>748,341=>474,342=>748,343=>474,344=>748,345=>474,346=>650,347=>506,348=>650,349=>506,350=>650,351=>506,352=>650,353=>506,354=>669,355=>416,356=>669,357=>416,358=>669,359=>416,360=>785,361=>654,362=>785,363=>654,364=>785,365=>654,366=>785,367=>654,368=>785,369=>654,370=>785,371=>654,372=>1011,373=>774,374=>642,375=>523,376=>642,377=>657,378=>511,379=>657,380=>511,381=>657,382=>511,383=>387,384=>629,385=>760,386=>769,387=>629,388=>769,389=>629,390=>716,391=>716,392=>548,393=>787,394=>780,395=>769,396=>629,397=>600,398=>686,399=>784,400=>649,401=>639,402=>387,403=>769,404=>693,405=>938,406=>421,407=>421,408=>782,409=>624,410=>342,411=>631,412=>952,413=>822,414=>654,415=>784,416=>784,417=>600,418=>1080,419=>849,420=>677,421=>629,422=>748,423=>650,424=>506,425=>636,426=>298,427=>416,428=>669,429=>416,430=>669,431=>785,432=>654,433=>801,434=>801,435=>642,436=>628,437=>657,438=>511,439=>591,440=>591,441=>591,442=>591,443=>626,444=>678,445=>511,446=>482,447=>644,448=>265,449=>443,450=>413,451=>265,452=>1437,453=>1292,454=>1140,455=>1059,456=>958,457=>667,458=>1248,459=>1148,460=>980,461=>698,462=>583,463=>421,464=>342,465=>784,466=>600,467=>785,468=>654,469=>785,470=>654,471=>785,472=>654,473=>785,474=>654,475=>785,476=>654,477=>572,478=>698,479=>583,480=>698,481=>583,482=>931,483=>877,484=>806,485=>629,486=>769,487=>629,488=>782,489=>624,490=>784,491=>600,492=>784,493=>600,494=>591,495=>511,496=>325,497=>1437,498=>1292,499=>1140,500=>769,501=>629,502=>1099,503=>708,504=>822,505=>654,506=>698,507=>583,508=>931,509=>838,510=>784,511=>600,512=>698,513=>583,514=>698,515=>583,516=>686,517=>572,518=>686,519=>572,520=>421,521=>342,522=>421,523=>342,524=>784,525=>600,526=>784,527=>600,528=>748,529=>474,530=>748,531=>474,532=>785,533=>654,534=>785,535=>654,536=>650,537=>506,538=>669,539=>416,540=>621,541=>546,542=>850,543=>654,544=>785,545=>711,546=>632,547=>554,548=>657,549=>511,550=>698,551=>583,552=>686,553=>572,554=>784,555=>600,556=>784,557=>600,558=>784,559=>600,560=>784,561=>600,562=>642,563=>523,564=>516,565=>830,566=>508,567=>325,568=>928,569=>928,570=>698,571=>716,572=>548,573=>633,574=>669,575=>506,576=>511,577=>594,578=>492,579=>760,580=>785,581=>698,582=>686,583=>572,584=>426,585=>348,586=>763,587=>629,588=>748,589=>474,590=>642,591=>523,592=>583,593=>692,594=>692,595=>629,596=>548,597=>548,598=>629,599=>657,600=>572,601=>572,602=>816,603=>547,604=>505,605=>816,606=>647,607=>348,608=>629,609=>629,610=>563,611=>641,612=>564,613=>654,614=>654,615=>654,616=>342,617=>342,618=>342,619=>368,620=>462,621=>342,622=>716,623=>952,624=>952,625=>952,626=>654,627=>654,628=>641,629=>600,630=>955,631=>674,632=>600,633=>514,634=>514,635=>514,636=>474,637=>474,638=>406,639=>438,640=>721,641=>721,642=>506,643=>298,644=>387,645=>486,646=>298,647=>443,648=>416,649=>654,650=>611,651=>624,652=>523,653=>774,654=>571,655=>654,656=>511,657=>511,658=>511,659=>511,660=>482,661=>482,662=>482,663=>490,664=>784,665=>625,666=>647,667=>563,668=>659,669=>345,670=>666,671=>555,672=>629,673=>482,674=>482,675=>1005,676=>1061,677=>1005,678=>819,679=>643,680=>817,681=>935,682=>711,683=>716,684=>596,685=>398,686=>552,687=>646,688=>469,689=>466,690=>282,691=>372,692=>372,693=>432,694=>474,695=>488,696=>329,697=>271,699=>313,700=>313,701=>313,702=>330,703=>330,704=>282,705=>282,710=>450,711=>450,712=>254,713=>450,716=>254,717=>450,720=>332,721=>332,722=>330,723=>330,726=>353,728=>450,729=>450,730=>450,731=>450,732=>450,733=>450,734=>375,736=>403,737=>263,738=>355,739=>338,740=>282,741=>450,742=>450,743=>450,744=>450,745=>450,750=>498,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>701,881=>519,882=>722,883=>699,884=>271,885=>271,886=>866,887=>664,890=>450,891=>548,892=>548,893=>548,894=>332,900=>450,901=>450,902=>698,903=>313,904=>852,905=>1022,906=>595,908=>798,910=>857,911=>820,912=>435,913=>698,914=>760,915=>639,916=>698,917=>686,918=>657,919=>850,920=>784,921=>421,922=>782,923=>698,924=>996,925=>822,926=>633,927=>784,928=>850,929=>677,931=>636,932=>669,933=>642,934=>784,935=>698,936=>822,937=>801,938=>421,939=>642,940=>692,941=>547,942=>654,943=>435,944=>624,945=>692,946=>598,947=>594,948=>600,949=>547,950=>533,951=>654,952=>600,953=>435,954=>674,955=>631,956=>659,957=>624,958=>533,959=>600,960=>659,961=>598,962=>548,963=>664,964=>605,965=>624,966=>814,967=>592,968=>847,969=>857,970=>435,971=>624,972=>600,973=>624,974=>857,975=>782,976=>600,977=>764,978=>687,979=>872,980=>687,981=>847,982=>857,983=>589,984=>784,985=>600,986=>716,987=>548,988=>639,989=>475,990=>531,991=>593,992=>716,993=>600,1008=>589,1009=>598,1010=>548,1011=>325,1012=>784,1013=>548,1014=>548,1015=>681,1016=>629,1017=>716,1018=>996,1019=>774,1020=>623,1021=>716,1022=>716,1023=>716,1024=>686,1025=>686,1026=>811,1027=>621,1028=>716,1029=>650,1030=>421,1031=>421,1032=>426,1033=>1081,1034=>1135,1035=>866,1036=>818,1037=>850,1038=>730,1039=>850,1040=>733,1041=>769,1042=>760,1043=>621,1044=>800,1045=>686,1046=>1181,1047=>649,1048=>850,1049=>850,1050=>818,1051=>795,1052=>996,1053=>850,1054=>784,1055=>850,1056=>677,1057=>716,1058=>669,1059=>730,1060=>854,1061=>698,1062=>870,1063=>822,1064=>1141,1065=>1164,1066=>861,1067=>1081,1068=>743,1069=>716,1070=>1158,1071=>793,1072=>583,1073=>650,1074=>591,1075=>506,1076=>625,1077=>572,1078=>1175,1079=>574,1080=>654,1081=>654,1082=>609,1083=>659,1084=>855,1085=>656,1086=>600,1087=>654,1088=>629,1089=>548,1090=>952,1091=>538,1092=>812,1093=>536,1094=>723,1095=>643,1096=>952,1097=>1021,1098=>654,1099=>916,1100=>593,1101=>580,1102=>901,1103=>716,1104=>572,1105=>572,1106=>646,1107=>506,1108=>548,1109=>506,1110=>342,1111=>342,1112=>325,1113=>913,1114=>910,1115=>654,1116=>609,1117=>654,1118=>538,1119=>654,1122=>792,1123=>945,1124=>1076,1125=>867,1130=>1181,1131=>909,1136=>986,1137=>995,1138=>784,1139=>587,1140=>824,1141=>673,1164=>761,1165=>606,1168=>630,1169=>556,1170=>621,1171=>506,1172=>768,1173=>634,1174=>1181,1175=>1175,1176=>649,1177=>574,1178=>812,1179=>633,1182=>818,1183=>609,1184=>937,1185=>684,1186=>856,1187=>725,1188=>1050,1189=>859,1190=>1191,1191=>911,1194=>716,1195=>548,1196=>669,1197=>1028,1198=>642,1199=>515,1200=>642,1201=>515,1202=>709,1203=>536,1204=>909,1205=>749,1206=>822,1207=>712,1210=>819,1211=>654,1216=>421,1217=>1181,1218=>1175,1219=>782,1220=>624,1223=>850,1224=>659,1227=>885,1228=>659,1231=>342,1232=>733,1233=>583,1234=>733,1235=>583,1236=>931,1237=>877,1238=>686,1239=>572,1240=>784,1241=>572,1242=>784,1243=>572,1244=>1181,1245=>1175,1246=>649,1247=>574,1248=>591,1249=>511,1250=>850,1251=>654,1252=>850,1253=>654,1254=>784,1255=>600,1256=>784,1257=>600,1258=>784,1259=>600,1260=>716,1261=>580,1262=>730,1263=>538,1264=>730,1265=>538,1266=>730,1267=>538,1268=>822,1269=>643,1270=>621,1271=>506,1272=>1081,1273=>916,1296=>649,1297=>574,1298=>795,1299=>659,1300=>1123,1301=>904,1306=>738,1307=>576,1308=>925,1309=>770,1329=>848,1330=>748,1331=>804,1332=>817,1333=>739,1334=>738,1335=>672,1336=>748,1337=>1013,1338=>804,1339=>722,1340=>650,1341=>1069,1342=>798,1343=>757,1344=>663,1345=>777,1346=>826,1347=>766,1348=>879,1349=>750,1350=>822,1351=>759,1352=>784,1353=>736,1354=>931,1355=>761,1356=>867,1357=>784,1358=>822,1359=>727,1360=>727,1361=>752,1362=>639,1363=>859,1364=>802,1365=>784,1366=>867,1369=>276,1370=>237,1371=>264,1372=>352,1373=>290,1374=>396,1375=>450,1377=>949,1378=>625,1379=>699,1380=>721,1381=>655,1382=>668,1383=>539,1384=>660,1385=>818,1386=>690,1387=>651,1388=>358,1389=>978,1390=>625,1391=>647,1392=>663,1393=>615,1394=>664,1395=>633,1396=>651,1397=>323,1398=>647,1399=>446,1400=>664,1401=>385,1402=>953,1403=>602,1404=>669,1405=>651,1406=>651,1407=>936,1408=>651,1409=>642,1410=>444,1411=>936,1412=>660,1413=>624,1414=>860,1415=>750,1417=>306,1418=>349,4256=>688,4257=>851,4258=>788,4259=>795,4260=>712,4261=>979,4262=>921,4263=>1100,4264=>587,4265=>745,4266=>955,4267=>954,4268=>725,4269=>1030,4270=>880,4271=>820,4272=>1007,4273=>721,4274=>689,4275=>977,4276=>887,4277=>968,4278=>738,4279=>758,4280=>748,4281=>759,4282=>826,4283=>978,4284=>701,4285=>748,4286=>740,4287=>1008,4288=>1019,4289=>730,4290=>812,4291=>730,4292=>801,4293=>965,4304=>535,4305=>563,4306=>579,4307=>798,4308=>553,4309=>549,4310=>599,4311=>823,4312=>552,4313=>540,4314=>1008,4315=>589,4316=>576,4317=>791,4318=>561,4319=>571,4320=>790,4321=>591,4322=>721,4323=>676,4324=>782,4325=>575,4326=>820,4327=>559,4328=>583,4329=>576,4330=>656,4331=>577,4332=>575,4333=>566,4334=>606,4335=>663,4336=>563,4337=>591,4338=>563,4339=>563,4340=>562,4341=>603,4342=>846,4343=>612,4344=>572,4345=>605,4346=>562,4347=>401,4348=>327,7424=>577,7425=>802,7426=>838,7427=>625,7428=>548,7429=>607,7430=>607,7431=>555,7432=>458,7433=>288,7434=>505,7435=>650,7436=>555,7437=>782,7438=>664,7439=>600,7440=>548,7441=>565,7442=>565,7443=>600,7444=>925,7445=>538,7446=>600,7447=>600,7448=>527,7449=>721,7450=>721,7451=>558,7452=>583,7453=>597,7454=>831,7455=>589,7456=>523,7457=>774,7458=>511,7459=>511,7460=>529,7461=>721,7462=>527,7463=>577,7464=>659,7465=>527,7466=>769,7467=>634,7468=>439,7469=>586,7470=>479,7471=>479,7472=>491,7473=>432,7474=>432,7475=>483,7476=>536,7477=>265,7478=>268,7479=>492,7480=>398,7481=>627,7482=>518,7483=>545,7484=>493,7485=>398,7486=>426,7487=>471,7488=>422,7489=>494,7490=>637,7491=>367,7492=>367,7493=>436,7494=>528,7495=>448,7496=>448,7497=>400,7498=>400,7499=>370,7500=>370,7501=>448,7502=>270,7503=>471,7504=>655,7505=>426,7506=>420,7507=>384,7508=>420,7509=>420,7510=>448,7511=>333,7512=>468,7513=>376,7514=>655,7515=>442,7516=>454,7517=>376,7518=>374,7519=>378,7520=>513,7521=>373,7522=>215,7523=>372,7524=>468,7525=>442,7526=>376,7527=>374,7528=>377,7529=>513,7530=>373,7531=>938,7543=>576,7544=>536,7547=>342,7557=>342,7579=>436,7580=>384,7581=>384,7582=>420,7583=>370,7584=>244,7585=>335,7586=>448,7587=>470,7588=>270,7589=>276,7590=>270,7591=>270,7592=>333,7593=>331,7594=>289,7595=>387,7596=>613,7597=>655,7598=>529,7599=>528,7600=>425,7601=>420,7602=>470,7603=>360,7604=>348,7605=>333,7606=>468,7607=>427,7608=>367,7609=>439,7610=>329,7611=>321,7612=>474,7613=>371,7614=>407,7615=>420,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>698,7681=>583,7682=>760,7683=>629,7684=>760,7685=>629,7686=>760,7687=>629,7688=>716,7689=>548,7690=>780,7691=>629,7692=>780,7693=>629,7694=>780,7695=>629,7696=>780,7697=>629,7698=>780,7699=>629,7700=>686,7701=>572,7702=>686,7703=>572,7704=>686,7705=>572,7706=>686,7707=>572,7708=>686,7709=>572,7710=>639,7711=>387,7712=>769,7713=>629,7714=>850,7715=>654,7716=>850,7717=>654,7718=>850,7719=>654,7720=>850,7721=>654,7722=>850,7723=>654,7724=>421,7725=>342,7726=>421,7727=>342,7728=>782,7729=>624,7730=>782,7731=>624,7732=>782,7733=>624,7734=>633,7735=>342,7736=>633,7737=>342,7738=>633,7739=>342,7740=>633,7741=>342,7742=>996,7743=>952,7744=>996,7745=>952,7746=>996,7747=>952,7748=>822,7749=>654,7750=>822,7751=>654,7752=>822,7753=>654,7754=>822,7755=>654,7756=>784,7757=>600,7758=>784,7759=>600,7760=>784,7761=>600,7762=>784,7763=>600,7764=>677,7765=>629,7766=>677,7767=>629,7768=>748,7769=>474,7770=>748,7771=>474,7772=>748,7773=>474,7774=>748,7775=>474,7776=>650,7777=>506,7778=>650,7779=>506,7780=>650,7781=>506,7782=>650,7783=>506,7784=>650,7785=>506,7786=>669,7787=>416,7788=>669,7789=>416,7790=>669,7791=>416,7792=>669,7793=>416,7794=>785,7795=>654,7796=>785,7797=>654,7798=>785,7799=>654,7800=>785,7801=>654,7802=>785,7803=>654,7804=>698,7805=>523,7806=>698,7807=>523,7808=>1011,7809=>774,7810=>1011,7811=>774,7812=>1011,7813=>774,7814=>1011,7815=>774,7816=>1011,7817=>774,7818=>698,7819=>536,7820=>698,7821=>536,7822=>642,7823=>523,7824=>657,7825=>511,7826=>657,7827=>511,7828=>657,7829=>511,7830=>654,7831=>416,7832=>774,7833=>523,7834=>913,7835=>387,7836=>387,7837=>387,7838=>852,7839=>600,7840=>698,7841=>583,7842=>698,7843=>583,7844=>698,7845=>583,7846=>698,7847=>583,7848=>698,7849=>583,7850=>698,7851=>583,7852=>698,7853=>583,7854=>698,7855=>583,7856=>698,7857=>583,7858=>698,7859=>583,7860=>698,7861=>583,7862=>698,7863=>583,7864=>686,7865=>572,7866=>686,7867=>572,7868=>686,7869=>572,7870=>686,7871=>572,7872=>686,7873=>572,7874=>686,7875=>572,7876=>686,7877=>572,7878=>686,7879=>572,7880=>421,7881=>342,7882=>421,7883=>342,7884=>784,7885=>600,7886=>784,7887=>600,7888=>784,7889=>600,7890=>784,7891=>600,7892=>784,7893=>600,7894=>784,7895=>600,7896=>784,7897=>600,7898=>784,7899=>600,7900=>784,7901=>600,7902=>784,7903=>600,7904=>784,7905=>600,7906=>784,7907=>600,7908=>785,7909=>654,7910=>785,7911=>654,7912=>785,7913=>654,7914=>785,7915=>654,7916=>785,7917=>654,7918=>785,7919=>654,7920=>785,7921=>654,7922=>642,7923=>523,7924=>642,7925=>523,7926=>642,7927=>523,7928=>642,7929=>523,7930=>970,7931=>630,7936=>692,7937=>692,7938=>692,7939=>692,7940=>692,7941=>692,7942=>692,7943=>692,7944=>698,7945=>698,7946=>880,7947=>880,7948=>748,7949=>764,7950=>698,7951=>698,7952=>547,7953=>547,7954=>547,7955=>547,7956=>547,7957=>547,7960=>826,7961=>817,7962=>1052,7963=>1052,7964=>984,7965=>1007,7968=>654,7969=>654,7970=>654,7971=>654,7972=>654,7973=>654,7974=>654,7975=>654,7976=>990,7977=>984,7978=>1222,7979=>1225,7980=>1151,7981=>1177,7982=>1077,7983=>1074,7984=>435,7985=>435,7986=>435,7987=>435,7988=>435,7989=>435,7990=>435,7991=>435,7992=>566,7993=>555,7994=>790,7995=>792,7996=>719,7997=>748,7998=>650,7999=>642,8000=>600,8001=>600,8002=>600,8003=>600,8004=>600,8005=>600,8008=>810,8009=>841,8010=>1116,8011=>1113,8012=>931,8013=>959,8016=>624,8017=>624,8018=>624,8019=>624,8020=>624,8021=>624,8022=>624,8023=>624,8025=>830,8027=>1067,8029=>1020,8031=>917,8032=>857,8033=>857,8034=>857,8035=>857,8036=>857,8037=>857,8038=>857,8039=>857,8040=>838,8041=>867,8042=>1141,8043=>1146,8044=>949,8045=>979,8046=>920,8047=>954,8048=>692,8049=>692,8050=>547,8051=>547,8052=>654,8053=>654,8054=>435,8055=>435,8056=>600,8057=>600,8058=>624,8059=>624,8060=>857,8061=>857,8064=>692,8065=>692,8066=>692,8067=>692,8068=>692,8069=>692,8070=>692,8071=>692,8072=>698,8073=>698,8074=>880,8075=>880,8076=>748,8077=>764,8078=>698,8079=>698,8080=>654,8081=>654,8082=>654,8083=>654,8084=>654,8085=>654,8086=>654,8087=>654,8088=>990,8089=>984,8090=>1222,8091=>1225,8092=>1151,8093=>1177,8094=>1077,8095=>1074,8096=>857,8097=>857,8098=>857,8099=>857,8100=>857,8101=>857,8102=>857,8103=>857,8104=>838,8105=>867,8106=>1141,8107=>1146,8108=>949,8109=>979,8110=>920,8111=>954,8112=>692,8113=>692,8114=>692,8115=>692,8116=>692,8118=>692,8119=>692,8120=>698,8121=>698,8122=>729,8123=>698,8124=>698,8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>654,8131=>654,8132=>654,8134=>654,8135=>654,8136=>899,8137=>852,8138=>1072,8139=>1006,8140=>850,8141=>450,8142=>450,8143=>450,8144=>435,8145=>435,8146=>435,8147=>435,8150=>435,8151=>435,8152=>421,8153=>421,8154=>642,8155=>595,8157=>450,8158=>450,8159=>450,8160=>624,8161=>624,8162=>624,8163=>624,8164=>598,8165=>598,8166=>624,8167=>624,8168=>642,8169=>642,8170=>917,8171=>857,8172=>819,8173=>450,8174=>450,8175=>450,8178=>857,8179=>857,8180=>857,8182=>857,8183=>857,8184=>962,8185=>798,8186=>991,8187=>820,8188=>801,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>626,8200=>313,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>374,8209=>374,8210=>626,8211=>450,8212=>900,8213=>900,8214=>450,8215=>450,8216=>313,8217=>313,8218=>313,8219=>313,8220=>518,8221=>518,8222=>518,8223=>518,8224=>470,8225=>470,8226=>575,8227=>575,8228=>313,8229=>606,8230=>900,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180,8240=>1246,8241=>1631,8242=>237,8243=>402,8244=>567,8245=>237,8246=>402,8247=>567,8248=>659,8249=>360,8250=>360,8252=>566,8253=>527,8254=>450,8258=>920,8260=>150,8261=>426,8262=>426,8263=>974,8264=>770,8265=>770,8267=>572,8268=>450,8269=>450,8270=>470,8271=>332,8273=>470,8274=>500,8275=>900,8279=>731,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>394,8305=>215,8308=>394,8309=>394,8310=>394,8311=>394,8312=>394,8313=>394,8314=>475,8315=>475,8316=>475,8317=>268,8318=>268,8319=>412,8320=>394,8321=>394,8322=>394,8323=>394,8324=>394,8325=>394,8326=>394,8327=>394,8328=>394,8329=>394,8330=>475,8331=>475,8332=>475,8333=>268,8334=>268,8336=>367,8337=>400,8338=>420,8339=>338,8340=>400,8341=>469,8342=>471,8343=>263,8344=>655,8345=>412,8346=>448,8347=>355,8348=>333,8358=>626,8364=>626,8367=>1039,8369=>710,8372=>788,8373=>626,8377=>626,8451=>1078,8457=>1001,8462=>654,8463=>654,8470=>978,8482=>900,8486=>801,8487=>801,8490=>782,8491=>698,8513=>707,8514=>518,8515=>573,8516=>684,8523=>813,8528=>932,8529=>932,8530=>1326,8531=>932,8532=>932,8533=>932,8534=>932,8535=>932,8536=>932,8537=>932,8538=>932,8539=>932,8540=>932,8541=>932,8542=>932,8543=>554,8544=>421,8545=>663,8546=>904,8547=>984,8548=>698,8549=>1014,8550=>1256,8551=>1498,8552=>962,8553=>698,8554=>970,8555=>1212,8556=>633,8557=>716,8558=>780,8559=>996,8560=>342,8561=>684,8562=>1025,8563=>865,8564=>523,8565=>865,8566=>1207,8567=>1548,8568=>878,8569=>536,8570=>878,8571=>1220,8572=>342,8573=>548,8574=>629,8575=>952,8576=>1129,8577=>780,8578=>1141,8579=>716,8580=>548,8581=>716,8585=>932,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754,8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754,8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754,8620=>754,8621=>754,8622=>754,8623=>765,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754,8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754,8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754,8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754,8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754,8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754,8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754,8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754,8700=>754,8701=>754,8702=>754,8703=>754,8704=>577,8706=>480,8707=>558,8708=>558,8710=>677,8711=>677,8712=>666,8713=>666,8715=>666,8716=>666,8719=>757,8720=>757,8721=>677,8722=>754,8723=>754,8724=>754,8725=>329,8727=>622,8728=>466,8729=>466,8730=>591,8731=>591,8732=>591,8733=>604,8734=>750,8735=>754,8736=>754,8739=>292,8740=>546,8741=>476,8742=>696,8743=>730,8744=>730,8745=>754,8746=>754,8747=>521,8748=>900,8749=>1252,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754,8770=>754,8771=>754,8776=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>974,8789=>974,8800=>754,8801=>754,8804=>754,8805=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8844=>754,8845=>754,8846=>754,8847=>754,8848=>754,8849=>754,8850=>754,8851=>754,8852=>754,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754,8865=>754,8866=>795,8867=>795,8868=>864,8869=>864,8870=>554,8871=>554,8872=>795,8873=>795,8874=>795,8875=>971,8876=>795,8877=>795,8878=>795,8879=>971,8901=>358,8962=>751,8968=>426,8969=>426,8970=>426,8971=>426,8976=>754,8977=>484,8984=>835,8985=>754,8992=>521,8993=>521,8997=>900,9000=>1299,9085=>907,9115=>450,9116=>450,9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450,9125=>450,9126=>450,9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>521,9167=>850,9251=>751,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474,9687=>474,9688=>712,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>785,9697=>785,9698=>692,9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850,9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659,9727=>692,9728=>807,9784=>807,9785=>807,9786=>807,9787=>807,9788=>807,9791=>552,9792=>658,9793=>658,9794=>807,9795=>807,9796=>807,9797=>807,9798=>807,9799=>807,9824=>807,9825=>807,9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424,9838=>321,9839=>435,10145=>754,10181=>411,10182=>411,10208=>444,10216=>411,10217=>411,10224=>754,10225=>754,10226=>754,10227=>754,10228=>930,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290,10237=>1290,10238=>1290,10239=>1290,10240=>703,10241=>703,10242=>703,10243=>703,10244=>703,10245=>703,10246=>703,10247=>703,10248=>703,10249=>703,10250=>703,10251=>703,10252=>703,10253=>703,10254=>703,10255=>703,10256=>703,10257=>703,10258=>703,10259=>703,10260=>703,10261=>703,10262=>703,10263=>703,10264=>703,10265=>703,10266=>703,10267=>703,10268=>703,10269=>703,10270=>703,10271=>703,10272=>703,10273=>703,10274=>703,10275=>703,10276=>703,10277=>703,10278=>703,10279=>703,10280=>703,10281=>703,10282=>703,10283=>703,10284=>703,10285=>703,10286=>703,10287=>703,10288=>703,10289=>703,10290=>703,10291=>703,10292=>703,10293=>703,10294=>703,10295=>703,10296=>703,10297=>703,10298=>703,10299=>703,10300=>703,10301=>703,10302=>703,10303=>703,10304=>703,10305=>703,10306=>703,10307=>703,10308=>703,10309=>703,10310=>703,10311=>703,10312=>703,10313=>703,10314=>703,10315=>703,10316=>703,10317=>703,10318=>703,10319=>703,10320=>703,10321=>703,10322=>703,10323=>703,10324=>703,10325=>703,10326=>703,10327=>703,10328=>703,10329=>703,10330=>703,10331=>703,10332=>703,10333=>703,10334=>703,10335=>703,10336=>703,10337=>703,10338=>703,10339=>703,10340=>703,10341=>703,10342=>703,10343=>703,10344=>703,10345=>703,10346=>703,10347=>703,10348=>703,10349=>703,10350=>703,10351=>703,10352=>703,10353=>703,10354=>703,10355=>703,10356=>703,10357=>703,10358=>703,10359=>703,10360=>703,10361=>703,10362=>703,10363=>703,10364=>703,10365=>703,10366=>703,10367=>703,10368=>703,10369=>703,10370=>703,10371=>703,10372=>703,10373=>703,10374=>703,10375=>703,10376=>703,10377=>703,10378=>703,10379=>703,10380=>703,10381=>703,10382=>703,10383=>703,10384=>703,10385=>703,10386=>703,10387=>703,10388=>703,10389=>703,10390=>703,10391=>703,10392=>703,10393=>703,10394=>703,10395=>703,10396=>703,10397=>703,10398=>703,10399=>703,10400=>703,10401=>703,10402=>703,10403=>703,10404=>703,10405=>703,10406=>703,10407=>703,10408=>703,10409=>703,10410=>703,10411=>703,10412=>703,10413=>703,10414=>703,10415=>703,10416=>703,10417=>703,10418=>703,10419=>703,10420=>703,10421=>703,10422=>703,10423=>703,10424=>703,10425=>703,10426=>703,10427=>703,10428=>703,10429=>703,10430=>703,10431=>703,10432=>703,10433=>703,10434=>703,10435=>703,10436=>703,10437=>703,10438=>703,10439=>703,10440=>703,10441=>703,10442=>703,10443=>703,10444=>703,10445=>703,10446=>703,10447=>703,10448=>703,10449=>703,10450=>703,10451=>703,10452=>703,10453=>703,10454=>703,10455=>703,10456=>703,10457=>703,10458=>703,10459=>703,10460=>703,10461=>703,10462=>703,10463=>703,10464=>703,10465=>703,10466=>703,10467=>703,10468=>703,10469=>703,10470=>703,10471=>703,10472=>703,10473=>703,10474=>703,10475=>703,10476=>703,10477=>703,10478=>703,10479=>703,10480=>703,10481=>703,10482=>703,10483=>703,10484=>703,10485=>703,10486=>703,10487=>703,10488=>703,10489=>703,10490=>703,10491=>703,10492=>703,10493=>703,10494=>703,10495=>703,10496=>754,10497=>754,10498=>754,10499=>754,10500=>754,10501=>754,10502=>754,10503=>754,10504=>754,10505=>754,10506=>754,10507=>754,10508=>754,10509=>754,10510=>754,10511=>754,10512=>754,10513=>754,10514=>754,10515=>754,10516=>754,10517=>754,10518=>754,10519=>754,10520=>754,10521=>754,10522=>754,10523=>754,10524=>754,10525=>754,10526=>754,10527=>754,10528=>754,10529=>754,10530=>754,10531=>754,10532=>754,10533=>754,10534=>754,10535=>754,10536=>754,10537=>754,10538=>754,10539=>754,10540=>754,10541=>754,10542=>754,10543=>754,10544=>754,10545=>754,10546=>754,10547=>754,10548=>754,10549=>754,10550=>754,10551=>754,10552=>754,10553=>754,10554=>754,10555=>754,10556=>754,10557=>754,10558=>754,10559=>754,10560=>754,10561=>754,10562=>754,10563=>754,10564=>754,10565=>754,10566=>754,10567=>754,10568=>754,10569=>754,10570=>754,10571=>754,10572=>754,10573=>754,10574=>754,10575=>754,10576=>754,10577=>754,10578=>754,10579=>754,10580=>754,10581=>754,10582=>754,10583=>754,10584=>754,10585=>754,10586=>754,10587=>754,10588=>754,10589=>754,10590=>754,10591=>754,10592=>754,10593=>754,10594=>754,10595=>754,10596=>754,10597=>754,10598=>754,10599=>754,10600=>754,10601=>754,10602=>754,10603=>754,10604=>754,10605=>754,10606=>754,10607=>754,10608=>754,10609=>754,10610=>754,10611=>754,10612=>754,10613=>754,10614=>754,10615=>929,10616=>754,10617=>754,10618=>864,10619=>754,10620=>754,10621=>754,10622=>754,10623=>754,10731=>444,10764=>1604,10765=>549,10766=>549,10799=>754,11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754,11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754,11026=>850,11027=>850,11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11360=>633,11361=>342,11363=>677,11364=>748,11367=>850,11368=>654,11369=>782,11370=>624,11371=>657,11372=>511,11373=>763,11374=>996,11375=>698,11376=>763,11377=>638,11378=>1099,11379=>886,11381=>701,11382=>519,11383=>814,11385=>514,11386=>600,11388=>282,11389=>439,11390=>650,11391=>657,11520=>695,11521=>571,11522=>723,11523=>592,11524=>708,11525=>866,11526=>680,11527=>864,11528=>555,11529=>581,11530=>866,11531=>567,11532=>581,11533=>866,11534=>761,11535=>779,11536=>865,11537=>580,11538=>580,11539=>863,11540=>851,11541=>777,11542=>580,11543=>581,11544=>580,11545=>584,11546=>619,11547=>842,11548=>883,11549=>613,11550=>608,11551=>766,11552=>1002,11553=>569,11554=>580,11555=>582,11556=>674,11557=>822,11800=>527,11810=>426,11811=>426,11812=>426,11813=>426,11822=>527,42564=>650,42565=>506,42566=>421,42567=>342,42576=>1200,42577=>976,42580=>1158,42581=>923,42582=>1158,42583=>926,42760=>450,42761=>450,42762=>450,42763=>450,42764=>450,42765=>450,42766=>450,42767=>450,42768=>450,42769=>450,42770=>450,42771=>450,42772=>450,42773=>450,42774=>450,42779=>346,42780=>346,42781=>249,42782=>249,42783=>249,42790=>850,42791=>641,42792=>903,42793=>817,42794=>626,42795=>548,42796=>570,42797=>538,42798=>667,42799=>635,42800=>533,42801=>506,42802=>1170,42803=>885,42804=>1134,42805=>886,42806=>1051,42807=>906,42808=>914,42809=>749,42810=>914,42811=>749,42812=>895,42813=>671,42814=>716,42815=>548,42822=>824,42823=>523,42826=>909,42827=>692,42830=>1303,42831=>954,42856=>708,42857=>644,42875=>625,42876=>474,42880=>633,42881=>342,42882=>785,42883=>654,42884=>625,42885=>474,42886=>716,42887=>548,42891=>395,42892=>275,42893=>822,42896=>822,42897=>730,43002=>961,43003=>639,43004=>677,43005=>996,43006=>421,43007=>1157,62464=>653,62465=>663,62466=>707,62467=>917,62468=>663,62469=>658,62470=>716,62471=>952,62472=>663,62473=>663,62474=>1196,62475=>679,62476=>678,62477=>922,62478=>663,62479=>678,62480=>963,62481=>736,62482=>783,62483=>737,62484=>914,62485=>677,62486=>907,62487=>677,62488=>684,62489=>678,62490=>720,62491=>678,62492=>684,62493=>664,62494=>721,62495=>860,62496=>663,62497=>762,62498=>664,62499=>663,62500=>663,62501=>714,62502=>930,62504=>813,63172=>342,63173=>600,63174=>629,63175=>654,63176=>952,63185=>450,63188=>450,64256=>744,64257=>654,64258=>654,64259=>998,64260=>1031,64261=>791,64262=>874,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1002,65535=>540);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedbi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedbi.z
new file mode 100644
index 00000000..942d4209
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedbi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedi.ctg.z
new file mode 100644
index 00000000..57b90faa
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedi.php
new file mode 100644
index 00000000..0863ff36
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSerifCondensed-Italic';
+$up=-63;
+$ut=44;
+$dw=540;
+$diff='';
+$originalsize=338140;
+$enc='';
+$file='dejavuserifcondensedi.z';
+$ctg='dejavuserifcondensedi.ctg.z';
+$desc=array('Flags'=>96,'FontBBox'=>'[-755 -347 1480 1109]','ItalicAngle'=>-11,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>519,'StemV'=>34,'StemH'=>15,'AvgWidth'=>461,'MaxWidth'=>1560,'MissingWidth'=>540);
+$cw=array(0=>540,32=>286,33=>361,34=>414,35=>754,36=>572,37=>855,38=>801,39=>247,40=>351,41=>351,42=>450,43=>754,44=>286,45=>304,46=>286,47=>303,48=>572,49=>572,50=>572,51=>572,52=>572,53=>572,54=>572,55=>572,56=>572,57=>572,58=>303,59=>303,60=>754,61=>754,62=>754,63=>482,64=>900,65=>650,66=>661,67=>688,68=>721,69=>657,70=>624,71=>719,72=>785,73=>355,74=>360,75=>672,76=>598,77=>921,78=>787,79=>738,80=>605,81=>738,82=>677,83=>616,84=>600,85=>758,86=>650,87=>925,88=>641,89=>594,90=>625,91=>351,92=>303,93=>351,94=>754,95=>450,96=>450,97=>536,98=>576,99=>504,100=>576,101=>532,102=>333,103=>576,104=>580,105=>288,106=>279,107=>545,108=>288,109=>853,110=>580,111=>542,112=>576,113=>576,114=>430,115=>461,116=>361,117=>580,118=>508,119=>770,120=>507,121=>508,122=>474,123=>572,124=>303,125=>572,126=>754,160=>286,161=>361,162=>572,163=>572,164=>572,165=>572,166=>303,167=>450,168=>450,169=>900,170=>427,171=>550,172=>754,173=>304,174=>900,175=>450,176=>450,177=>754,178=>360,179=>360,180=>450,181=>584,182=>572,183=>286,184=>450,185=>360,186=>423,187=>550,188=>872,189=>872,190=>872,191=>482,192=>650,193=>650,194=>650,195=>650,196=>650,197=>650,198=>901,199=>688,200=>657,201=>657,202=>657,203=>657,204=>355,205=>355,206=>355,207=>355,208=>726,209=>787,210=>738,211=>738,212=>738,213=>738,214=>738,215=>754,216=>738,217=>758,218=>758,219=>758,220=>758,221=>594,222=>608,223=>601,224=>536,225=>536,226=>536,227=>536,228=>536,229=>536,230=>846,231=>504,232=>532,233=>532,234=>532,235=>532,236=>288,237=>288,238=>288,239=>288,240=>542,241=>580,242=>542,243=>542,244=>542,245=>542,246=>542,247=>754,248=>542,249=>580,250=>580,251=>580,252=>580,253=>508,254=>576,255=>508,256=>650,257=>536,258=>650,259=>536,260=>650,261=>536,262=>688,263=>504,264=>688,265=>504,266=>688,267=>504,268=>688,269=>504,270=>721,271=>576,272=>726,273=>576,274=>657,275=>532,276=>657,277=>532,278=>657,279=>532,280=>657,281=>532,282=>657,283=>532,284=>719,285=>576,286=>719,287=>576,288=>719,289=>576,290=>719,291=>576,292=>785,293=>580,294=>785,295=>580,296=>355,297=>288,298=>355,299=>288,300=>355,301=>288,302=>355,303=>288,304=>355,305=>288,306=>721,307=>479,308=>360,309=>279,310=>672,311=>545,312=>545,313=>598,314=>288,315=>598,316=>288,317=>598,318=>360,319=>604,320=>418,321=>602,322=>292,323=>787,324=>580,325=>787,326=>580,327=>787,328=>580,329=>779,330=>758,331=>580,332=>738,333=>542,334=>738,335=>542,336=>738,337=>542,338=>1023,339=>890,340=>677,341=>430,342=>677,343=>430,344=>677,345=>430,346=>616,347=>461,348=>616,349=>461,350=>616,351=>461,352=>616,353=>461,354=>600,355=>361,356=>600,357=>361,358=>600,359=>361,360=>758,361=>580,362=>758,363=>580,364=>758,365=>580,366=>758,367=>580,368=>758,369=>580,370=>758,371=>580,372=>925,373=>770,374=>594,375=>508,376=>594,377=>625,378=>474,379=>625,380=>474,381=>625,382=>474,383=>333,384=>576,385=>661,386=>661,387=>576,388=>661,389=>576,390=>688,391=>688,392=>504,393=>726,394=>721,395=>661,396=>576,397=>542,398=>657,399=>738,400=>561,401=>624,402=>333,403=>719,404=>641,405=>839,406=>355,407=>355,408=>672,409=>545,410=>288,411=>570,412=>853,413=>787,414=>580,415=>738,416=>738,417=>542,418=>936,419=>726,420=>605,421=>576,422=>677,423=>616,424=>461,425=>636,426=>292,427=>361,428=>600,429=>361,430=>600,431=>758,432=>580,433=>746,434=>684,435=>664,436=>670,437=>625,438=>474,439=>508,440=>508,441=>508,442=>508,443=>572,444=>618,445=>508,446=>482,447=>571,448=>265,449=>443,450=>413,451=>265,452=>1347,453=>1195,454=>1050,455=>958,456=>876,457=>567,458=>1148,459=>1066,460=>858,461=>650,462=>536,463=>355,464=>288,465=>738,466=>542,467=>758,468=>580,469=>758,470=>580,471=>758,472=>580,473=>758,474=>580,475=>758,476=>580,477=>532,478=>650,479=>536,480=>650,481=>536,482=>901,483=>846,484=>763,485=>576,486=>719,487=>576,488=>672,489=>545,490=>738,491=>542,492=>738,493=>542,494=>508,495=>508,496=>288,497=>1347,498=>1195,499=>1050,500=>719,501=>576,502=>1038,503=>636,504=>787,505=>580,506=>650,507=>536,508=>901,509=>846,510=>738,511=>542,512=>650,513=>536,514=>650,515=>536,516=>657,517=>532,518=>657,519=>532,520=>355,521=>288,522=>355,523=>288,524=>738,525=>542,526=>738,527=>542,528=>677,529=>430,530=>677,531=>430,532=>758,533=>580,534=>758,535=>580,536=>616,537=>461,538=>600,539=>361,540=>564,541=>469,542=>785,543=>580,544=>758,545=>732,546=>514,547=>497,548=>625,549=>474,550=>650,551=>536,552=>657,553=>532,554=>738,555=>542,556=>738,557=>542,558=>738,559=>542,560=>738,561=>542,562=>594,563=>508,564=>450,565=>748,566=>444,567=>279,568=>864,569=>864,570=>650,571=>688,572=>504,573=>598,574=>600,575=>461,576=>474,577=>525,578=>417,579=>661,580=>758,581=>650,582=>657,583=>532,584=>360,585=>283,586=>704,587=>576,588=>677,589=>430,590=>594,591=>508,592=>536,593=>607,594=>607,595=>576,596=>504,597=>504,598=>582,599=>614,600=>532,601=>532,602=>759,603=>483,604=>458,605=>695,606=>552,607=>283,608=>615,609=>576,610=>489,611=>641,612=>507,613=>580,614=>580,615=>580,616=>288,617=>353,618=>288,619=>342,620=>409,621=>326,622=>633,623=>853,624=>853,625=>853,626=>579,627=>624,628=>581,629=>542,630=>711,631=>583,632=>542,633=>451,634=>451,635=>496,636=>430,637=>430,638=>407,639=>407,640=>534,641=>534,642=>461,643=>244,644=>333,645=>438,646=>292,647=>361,648=>361,649=>580,650=>558,651=>547,652=>508,653=>770,654=>508,655=>589,656=>537,657=>504,658=>508,659=>504,660=>482,661=>482,662=>482,663=>461,664=>738,665=>506,666=>552,667=>588,668=>600,669=>329,670=>545,671=>488,672=>615,673=>482,674=>482,675=>896,676=>930,677=>898,678=>728,679=>538,680=>704,681=>804,682=>582,683=>608,684=>538,685=>398,686=>703,687=>690,688=>389,689=>387,690=>237,691=>312,692=>312,693=>387,694=>352,695=>485,696=>320,697=>250,699=>286,700=>286,701=>286,702=>276,703=>276,704=>252,705=>252,710=>450,711=>450,712=>254,713=>450,716=>254,717=>450,720=>303,721=>303,722=>276,723=>276,726=>353,728=>450,729=>450,730=>450,731=>450,732=>450,733=>450,734=>375,736=>403,737=>218,738=>303,739=>319,740=>252,741=>444,742=>444,743=>444,744=>444,745=>444,750=>435,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>666,881=>478,882=>600,883=>498,884=>250,885=>250,886=>787,887=>600,890=>450,891=>504,892=>504,893=>504,894=>303,900=>450,901=>450,902=>650,903=>286,904=>810,905=>935,906=>505,908=>751,910=>808,911=>767,912=>353,913=>650,914=>661,915=>624,916=>650,917=>657,918=>625,919=>785,920=>738,921=>355,922=>672,923=>650,924=>921,925=>787,926=>633,927=>738,928=>785,929=>605,931=>636,932=>600,933=>594,934=>738,935=>641,936=>789,937=>746,938=>355,939=>594,940=>607,941=>483,942=>539,943=>353,944=>547,945=>607,946=>520,947=>538,948=>542,949=>483,950=>488,951=>539,952=>542,953=>353,954=>590,955=>570,956=>584,957=>547,958=>496,959=>542,960=>591,961=>529,962=>504,963=>614,964=>498,965=>547,966=>630,967=>545,968=>706,969=>734,970=>353,971=>547,972=>542,973=>547,974=>734,975=>672,976=>524,977=>643,978=>618,979=>787,980=>618,981=>613,982=>734,983=>561,984=>738,985=>542,986=>688,987=>504,988=>624,989=>417,990=>531,991=>593,992=>704,993=>519,1008=>561,1009=>529,1010=>504,1011=>279,1012=>738,1013=>504,1014=>504,1015=>608,1016=>576,1017=>688,1018=>921,1019=>637,1020=>529,1021=>688,1022=>688,1023=>688,1024=>657,1025=>657,1026=>719,1027=>596,1028=>688,1029=>616,1030=>355,1031=>355,1032=>360,1033=>976,1034=>1006,1035=>785,1036=>696,1037=>785,1038=>650,1039=>785,1040=>681,1041=>661,1042=>661,1043=>596,1044=>731,1045=>657,1046=>1011,1047=>561,1048=>785,1049=>785,1050=>696,1051=>751,1052=>921,1053=>785,1054=>738,1055=>785,1056=>605,1057=>688,1058=>600,1059=>650,1060=>747,1061=>641,1062=>785,1063=>695,1064=>1027,1065=>1027,1066=>715,1067=>885,1068=>606,1069=>688,1070=>1074,1071=>727,1072=>536,1073=>549,1074=>523,1075=>455,1076=>570,1077=>532,1078=>1023,1079=>491,1080=>580,1081=>580,1082=>537,1083=>573,1084=>746,1085=>593,1086=>542,1087=>580,1088=>576,1089=>504,1090=>853,1091=>522,1092=>704,1093=>507,1094=>628,1095=>560,1096=>853,1097=>901,1098=>600,1099=>733,1100=>490,1101=>504,1102=>792,1103=>596,1104=>532,1105=>532,1106=>561,1107=>455,1108=>504,1109=>461,1110=>288,1111=>288,1112=>279,1113=>773,1114=>790,1115=>580,1116=>537,1117=>580,1118=>522,1119=>580,1122=>686,1123=>794,1124=>1016,1125=>750,1130=>1011,1131=>828,1136=>849,1137=>812,1138=>738,1139=>497,1140=>773,1141=>610,1164=>636,1165=>490,1168=>604,1169=>476,1170=>596,1171=>455,1172=>657,1173=>552,1174=>1011,1175=>1023,1176=>561,1177=>491,1178=>696,1179=>544,1182=>696,1183=>537,1184=>803,1185=>602,1186=>785,1187=>641,1188=>1025,1189=>771,1190=>1085,1191=>848,1194=>688,1195=>504,1196=>600,1197=>911,1198=>594,1199=>514,1200=>594,1201=>514,1202=>641,1203=>566,1204=>842,1205=>659,1206=>674,1207=>609,1210=>674,1211=>580,1216=>355,1217=>1011,1218=>1023,1219=>672,1220=>545,1223=>785,1224=>600,1227=>674,1228=>600,1231=>288,1232=>681,1233=>536,1234=>681,1235=>536,1236=>901,1237=>846,1238=>657,1239=>532,1240=>738,1241=>532,1242=>738,1243=>532,1244=>1011,1245=>1023,1246=>561,1247=>491,1248=>508,1249=>508,1250=>785,1251=>580,1252=>785,1253=>580,1254=>738,1255=>542,1256=>738,1257=>542,1258=>738,1259=>542,1260=>688,1261=>504,1262=>650,1263=>522,1264=>650,1265=>522,1266=>650,1267=>522,1268=>695,1269=>560,1270=>596,1271=>455,1272=>885,1273=>733,1296=>561,1297=>491,1298=>751,1299=>573,1300=>1079,1301=>845,1306=>738,1307=>576,1308=>925,1309=>770,1329=>729,1330=>729,1331=>725,1332=>745,1333=>725,1334=>743,1335=>685,1336=>729,1337=>871,1338=>734,1339=>695,1340=>614,1341=>987,1342=>760,1343=>723,1344=>647,1345=>729,1346=>750,1347=>748,1348=>808,1349=>687,1350=>714,1351=>678,1352=>719,1353=>717,1354=>787,1355=>747,1356=>778,1357=>719,1358=>721,1359=>658,1360=>697,1361=>674,1362=>570,1363=>760,1364=>759,1365=>751,1366=>738,1369=>276,1370=>237,1371=>207,1372=>352,1373=>328,1374=>347,1375=>450,1377=>854,1378=>556,1379=>625,1380=>625,1381=>565,1382=>619,1383=>458,1384=>572,1385=>711,1386=>604,1387=>571,1388=>274,1389=>875,1390=>553,1391=>565,1392=>572,1393=>567,1394=>572,1395=>588,1396=>580,1397=>278,1398=>572,1399=>415,1400=>584,1401=>329,1402=>846,1403=>505,1404=>591,1405=>580,1406=>567,1407=>836,1408=>580,1409=>578,1410=>435,1411=>836,1412=>572,1413=>548,1414=>728,1415=>709,1417=>306,1418=>300,4256=>659,4257=>773,4258=>753,4259=>782,4260=>668,4261=>892,4262=>833,4263=>1000,4264=>519,4265=>684,4266=>875,4267=>856,4268=>677,4269=>976,4270=>815,4271=>754,4272=>944,4273=>668,4274=>611,4275=>922,4276=>852,4277=>926,4278=>667,4279=>668,4280=>668,4281=>668,4282=>800,4283=>852,4284=>651,4285=>688,4286=>668,4287=>871,4288=>909,4289=>641,4290=>786,4291=>669,4292=>762,4293=>864,4304=>495,4305=>523,4306=>539,4307=>759,4308=>514,4309=>510,4310=>558,4311=>783,4312=>512,4313=>500,4314=>968,4315=>536,4316=>536,4317=>751,4318=>521,4319=>531,4320=>750,4321=>546,4322=>682,4323=>631,4324=>742,4325=>535,4326=>781,4327=>520,4328=>543,4329=>536,4330=>616,4331=>537,4332=>501,4333=>527,4334=>562,4335=>624,4336=>523,4337=>551,4338=>523,4339=>523,4340=>522,4341=>593,4342=>806,4343=>572,4344=>532,4345=>565,4346=>522,4347=>410,4348=>335,7424=>508,7425=>697,7426=>846,7427=>506,7428=>504,7429=>527,7430=>527,7431=>498,7432=>458,7433=>288,7434=>448,7435=>537,7436=>488,7437=>700,7438=>600,7439=>542,7440=>504,7441=>582,7442=>582,7443=>582,7444=>890,7445=>461,7446=>542,7447=>542,7448=>498,7449=>534,7450=>534,7451=>498,7452=>526,7453=>597,7454=>831,7455=>589,7456=>508,7457=>770,7458=>474,7459=>474,7460=>478,7461=>668,7462=>471,7463=>508,7464=>591,7465=>498,7466=>632,7467=>571,7468=>409,7469=>567,7470=>417,7471=>417,7472=>454,7473=>413,7474=>413,7475=>453,7476=>494,7477=>224,7478=>227,7479=>423,7480=>376,7481=>580,7482=>496,7483=>496,7484=>464,7485=>332,7486=>381,7487=>426,7488=>378,7489=>478,7490=>583,7491=>338,7492=>338,7493=>382,7494=>532,7495=>360,7496=>360,7497=>348,7498=>348,7499=>385,7500=>306,7501=>360,7502=>157,7503=>328,7504=>552,7505=>359,7506=>347,7507=>312,7508=>347,7509=>347,7510=>360,7511=>222,7512=>359,7513=>376,7514=>552,7515=>335,7516=>421,7517=>327,7518=>338,7519=>341,7520=>396,7521=>343,7522=>181,7523=>312,7524=>359,7525=>335,7526=>327,7527=>338,7528=>333,7529=>396,7530=>343,7531=>876,7543=>576,7544=>494,7547=>334,7557=>288,7579=>382,7580=>317,7581=>317,7582=>426,7583=>385,7584=>209,7585=>285,7586=>439,7587=>359,7588=>181,7589=>181,7590=>181,7591=>181,7592=>286,7593=>237,7594=>236,7595=>409,7596=>552,7597=>552,7598=>445,7599=>443,7600=>438,7601=>347,7602=>426,7603=>295,7604=>269,7605=>301,7606=>359,7607=>429,7608=>331,7609=>417,7610=>320,7611=>298,7612=>376,7613=>376,7614=>406,7615=>426,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>650,7681=>536,7682=>661,7683=>576,7684=>661,7685=>576,7686=>661,7687=>576,7688=>688,7689=>504,7690=>721,7691=>576,7692=>721,7693=>576,7694=>721,7695=>576,7696=>721,7697=>576,7698=>721,7699=>576,7700=>657,7701=>532,7702=>657,7703=>532,7704=>657,7705=>532,7706=>657,7707=>532,7708=>657,7709=>532,7710=>624,7711=>333,7712=>719,7713=>576,7714=>785,7715=>580,7716=>785,7717=>580,7718=>785,7719=>580,7720=>785,7721=>580,7722=>785,7723=>580,7724=>355,7725=>288,7726=>355,7727=>288,7728=>672,7729=>545,7730=>672,7731=>545,7732=>672,7733=>545,7734=>598,7735=>288,7736=>598,7737=>288,7738=>598,7739=>288,7740=>598,7741=>288,7742=>921,7743=>853,7744=>921,7745=>853,7746=>921,7747=>857,7748=>787,7749=>580,7750=>787,7751=>580,7752=>787,7753=>580,7754=>787,7755=>580,7756=>738,7757=>542,7758=>738,7759=>542,7760=>738,7761=>542,7762=>738,7763=>542,7764=>605,7765=>576,7766=>605,7767=>576,7768=>677,7769=>430,7770=>677,7771=>430,7772=>677,7773=>430,7774=>677,7775=>430,7776=>616,7777=>461,7778=>616,7779=>461,7780=>616,7781=>461,7782=>616,7783=>469,7784=>616,7785=>461,7786=>600,7787=>361,7788=>600,7789=>361,7790=>600,7791=>361,7792=>600,7793=>361,7794=>758,7795=>580,7796=>758,7797=>580,7798=>758,7799=>580,7800=>758,7801=>580,7802=>758,7803=>580,7804=>650,7805=>508,7806=>650,7807=>508,7808=>925,7809=>770,7810=>925,7811=>770,7812=>925,7813=>770,7814=>925,7815=>770,7816=>925,7817=>770,7818=>641,7819=>507,7820=>641,7821=>507,7822=>594,7823=>508,7824=>625,7825=>474,7826=>625,7827=>474,7828=>625,7829=>474,7830=>580,7831=>361,7832=>770,7833=>508,7834=>813,7835=>333,7836=>333,7837=>333,7838=>746,7839=>542,7840=>650,7841=>536,7842=>650,7843=>536,7844=>650,7845=>551,7846=>650,7847=>551,7848=>650,7849=>551,7850=>650,7851=>551,7852=>650,7853=>536,7854=>650,7855=>536,7856=>650,7857=>536,7858=>650,7859=>536,7860=>650,7861=>536,7862=>650,7863=>536,7864=>657,7865=>532,7866=>657,7867=>532,7868=>657,7869=>532,7870=>657,7871=>554,7872=>657,7873=>554,7874=>657,7875=>554,7876=>657,7877=>554,7878=>657,7879=>532,7880=>355,7881=>288,7882=>355,7883=>288,7884=>738,7885=>542,7886=>738,7887=>542,7888=>738,7889=>550,7890=>738,7891=>550,7892=>738,7893=>550,7894=>738,7895=>550,7896=>738,7897=>542,7898=>738,7899=>542,7900=>738,7901=>542,7902=>738,7903=>542,7904=>738,7905=>542,7906=>738,7907=>542,7908=>758,7909=>580,7910=>758,7911=>580,7912=>758,7913=>580,7914=>758,7915=>580,7916=>758,7917=>580,7918=>758,7919=>580,7920=>758,7921=>580,7922=>594,7923=>508,7924=>594,7925=>508,7926=>594,7927=>508,7928=>594,7929=>508,7930=>854,7931=>523,7936=>607,7937=>607,7938=>607,7939=>607,7940=>607,7941=>607,7942=>607,7943=>607,7944=>650,7945=>650,7946=>782,7947=>782,7948=>660,7949=>687,7950=>650,7951=>650,7952=>483,7953=>483,7954=>483,7955=>483,7956=>483,7957=>483,7960=>768,7961=>757,7962=>960,7963=>969,7964=>907,7965=>931,7968=>539,7969=>539,7970=>539,7971=>539,7972=>539,7973=>539,7974=>539,7975=>539,7976=>898,7977=>893,7978=>1090,7979=>1101,7980=>1043,7981=>1064,7982=>988,7983=>985,7984=>353,7985=>353,7986=>353,7987=>353,7988=>353,7989=>353,7990=>353,7991=>353,7992=>469,7993=>461,7994=>661,7995=>664,7996=>611,7997=>635,7998=>561,7999=>553,8000=>542,8001=>542,8002=>542,8003=>542,8004=>542,8005=>542,8008=>738,8009=>773,8010=>1008,8011=>1015,8012=>843,8013=>867,8016=>547,8017=>547,8018=>547,8019=>547,8020=>547,8021=>547,8022=>547,8023=>547,8025=>765,8027=>971,8029=>939,8031=>857,8032=>734,8033=>734,8034=>734,8035=>734,8036=>734,8037=>734,8038=>734,8039=>734,8040=>746,8041=>783,8042=>1018,8043=>1023,8044=>852,8045=>878,8046=>844,8047=>873,8048=>607,8049=>607,8050=>483,8051=>483,8052=>539,8053=>539,8054=>353,8055=>353,8056=>542,8057=>542,8058=>547,8059=>547,8060=>734,8061=>734,8064=>607,8065=>607,8066=>607,8067=>607,8068=>607,8069=>607,8070=>607,8071=>607,8072=>650,8073=>650,8074=>782,8075=>782,8076=>660,8077=>687,8078=>650,8079=>650,8080=>539,8081=>539,8082=>539,8083=>539,8084=>539,8085=>539,8086=>539,8087=>539,8088=>898,8089=>893,8090=>1090,8091=>1101,8092=>1043,8093=>1064,8094=>988,8095=>985,8096=>734,8097=>734,8098=>734,8099=>734,8100=>734,8101=>734,8102=>734,8103=>734,8104=>746,8105=>783,8106=>1018,8107=>1023,8108=>852,8109=>878,8110=>844,8111=>873,8112=>607,8113=>607,8114=>607,8115=>607,8116=>607,8118=>607,8119=>607,8120=>650,8121=>650,8122=>650,8123=>650,8124=>650,8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>539,8131=>539,8132=>539,8134=>539,8135=>539,8136=>820,8137=>810,8138=>956,8139=>935,8140=>785,8141=>450,8142=>450,8143=>450,8144=>353,8145=>353,8146=>353,8147=>353,8150=>353,8151=>353,8152=>355,8153=>355,8154=>529,8155=>505,8157=>450,8158=>450,8159=>450,8160=>547,8161=>547,8162=>547,8163=>547,8164=>529,8165=>529,8166=>547,8167=>547,8168=>594,8169=>594,8170=>829,8171=>808,8172=>711,8173=>450,8174=>450,8175=>450,8178=>734,8179=>734,8180=>734,8182=>734,8183=>734,8184=>865,8185=>751,8186=>886,8187=>767,8188=>746,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>572,8200=>286,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>304,8209=>304,8210=>572,8211=>450,8212=>900,8213=>900,8214=>450,8215=>450,8216=>286,8217=>286,8218=>286,8219=>286,8220=>460,8221=>460,8222=>466,8223=>460,8224=>450,8225=>450,8226=>531,8227=>531,8228=>301,8229=>600,8230=>900,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180,8240=>1208,8241=>1560,8242=>204,8243=>336,8244=>468,8245=>204,8246=>336,8247=>468,8248=>305,8249=>360,8250=>360,8252=>475,8253=>482,8254=>450,8258=>900,8260=>150,8261=>351,8262=>351,8263=>878,8264=>678,8265=>678,8267=>572,8268=>450,8269=>450,8270=>450,8271=>303,8273=>450,8274=>404,8275=>900,8279=>597,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>360,8305=>181,8308=>360,8309=>360,8310=>360,8311=>360,8312=>360,8313=>360,8314=>475,8315=>475,8316=>475,8317=>221,8318=>221,8319=>365,8320=>360,8321=>360,8322=>360,8323=>360,8324=>360,8325=>360,8326=>360,8327=>360,8328=>360,8329=>360,8330=>475,8331=>475,8332=>475,8333=>221,8334=>221,8336=>338,8337=>348,8338=>347,8339=>319,8340=>348,8341=>389,8342=>328,8343=>218,8344=>552,8345=>365,8346=>360,8347=>303,8348=>222,8358=>594,8364=>572,8367=>951,8369=>635,8372=>702,8373=>572,8377=>572,8451=>1006,8457=>942,8462=>580,8463=>580,8470=>852,8482=>900,8486=>746,8487=>746,8490=>672,8491=>650,8513=>697,8514=>501,8515=>501,8516=>549,8523=>801,8528=>872,8529=>872,8530=>1233,8531=>872,8532=>872,8533=>872,8534=>872,8535=>872,8536=>872,8537=>872,8538=>872,8539=>872,8540=>872,8541=>872,8542=>872,8543=>511,8544=>355,8545=>531,8546=>707,8547=>870,8548=>650,8549=>883,8550=>1059,8551=>1234,8552=>838,8553=>641,8554=>839,8555=>1015,8556=>598,8557=>688,8558=>721,8559=>921,8560=>288,8561=>576,8562=>863,8563=>796,8564=>508,8565=>796,8566=>1084,8567=>1372,8568=>795,8569=>507,8570=>795,8571=>1083,8572=>288,8573=>504,8574=>576,8575=>853,8576=>1085,8577=>721,8578=>1085,8579=>688,8580=>504,8581=>688,8585=>872,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754,8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754,8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754,8620=>754,8621=>754,8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754,8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754,8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754,8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754,8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754,8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754,8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754,8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754,8700=>754,8701=>754,8702=>754,8703=>754,8704=>543,8706=>465,8707=>488,8708=>488,8710=>628,8711=>628,8712=>666,8713=>666,8715=>666,8716=>666,8719=>716,8720=>716,8721=>642,8722=>754,8723=>754,8724=>754,8725=>303,8727=>611,8728=>441,8729=>441,8730=>573,8731=>573,8732=>573,8733=>609,8734=>750,8735=>754,8736=>754,8739=>262,8740=>431,8741=>416,8742=>570,8743=>659,8744=>659,8745=>754,8746=>754,8747=>469,8748=>766,8749=>1063,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754,8770=>754,8771=>754,8776=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>930,8789=>930,8800=>754,8801=>754,8804=>754,8805=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8844=>754,8845=>754,8846=>754,8847=>761,8848=>761,8849=>761,8850=>761,8851=>754,8852=>754,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754,8865=>754,8866=>773,8867=>773,8868=>846,8869=>846,8870=>510,8871=>510,8872=>773,8873=>773,8874=>773,8875=>927,8876=>773,8877=>773,8878=>773,8879=>927,8901=>308,8962=>687,8968=>351,8969=>351,8970=>351,8971=>351,8976=>754,8977=>461,8984=>900,8985=>754,8992=>469,8993=>469,8997=>900,9000=>1299,9085=>827,9115=>450,9116=>450,9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450,9125=>450,9126=>450,9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>469,9167=>850,9251=>687,9472=>542,9473=>542,9474=>542,9475=>542,9476=>542,9477=>542,9478=>542,9479=>542,9480=>542,9481=>542,9482=>542,9483=>542,9484=>542,9485=>542,9486=>542,9487=>542,9488=>542,9489=>542,9490=>542,9491=>542,9492=>542,9493=>542,9494=>542,9495=>542,9496=>542,9497=>542,9498=>542,9499=>542,9500=>542,9501=>542,9502=>542,9503=>542,9504=>542,9505=>542,9506=>542,9507=>542,9508=>542,9509=>542,9510=>542,9511=>542,9512=>542,9513=>542,9514=>542,9515=>542,9516=>542,9517=>542,9518=>542,9519=>542,9520=>542,9521=>542,9522=>542,9523=>542,9524=>542,9525=>542,9526=>542,9527=>542,9528=>542,9529=>542,9530=>542,9531=>542,9532=>542,9533=>542,9534=>542,9535=>542,9536=>542,9537=>542,9538=>542,9539=>542,9540=>542,9541=>542,9542=>542,9543=>542,9544=>542,9545=>542,9546=>542,9547=>542,9548=>542,9549=>542,9550=>542,9551=>542,9552=>542,9553=>542,9554=>542,9555=>542,9556=>542,9557=>542,9558=>542,9559=>542,9560=>542,9561=>542,9562=>542,9563=>542,9564=>542,9565=>542,9566=>542,9567=>542,9568=>542,9569=>542,9570=>542,9571=>542,9572=>542,9573=>542,9574=>542,9575=>542,9576=>542,9577=>542,9578=>542,9579=>542,9580=>542,9581=>542,9582=>542,9583=>542,9584=>542,9585=>542,9586=>542,9587=>542,9588=>542,9589=>542,9590=>542,9591=>542,9592=>542,9593=>542,9594=>542,9595=>542,9596=>542,9597=>542,9598=>542,9599=>542,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474,9687=>474,9688=>712,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>785,9697=>785,9698=>692,9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850,9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659,9727=>692,9728=>807,9784=>807,9785=>807,9786=>807,9787=>807,9788=>807,9791=>552,9792=>658,9793=>658,9794=>807,9795=>807,9796=>807,9797=>807,9798=>807,9799=>807,9824=>807,9825=>807,9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424,9838=>321,9839=>435,10145=>754,10181=>351,10182=>351,10208=>444,10216=>351,10217=>351,10224=>754,10225=>754,10226=>754,10227=>754,10228=>930,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290,10237=>1290,10238=>1290,10239=>1290,10240=>659,10241=>659,10242=>659,10243=>659,10244=>659,10245=>659,10246=>659,10247=>659,10248=>659,10249=>659,10250=>659,10251=>659,10252=>659,10253=>659,10254=>659,10255=>659,10256=>659,10257=>659,10258=>659,10259=>659,10260=>659,10261=>659,10262=>659,10263=>659,10264=>659,10265=>659,10266=>659,10267=>659,10268=>659,10269=>659,10270=>659,10271=>659,10272=>659,10273=>659,10274=>659,10275=>659,10276=>659,10277=>659,10278=>659,10279=>659,10280=>659,10281=>659,10282=>659,10283=>659,10284=>659,10285=>659,10286=>659,10287=>659,10288=>659,10289=>659,10290=>659,10291=>659,10292=>659,10293=>659,10294=>659,10295=>659,10296=>659,10297=>659,10298=>659,10299=>659,10300=>659,10301=>659,10302=>659,10303=>659,10304=>659,10305=>659,10306=>659,10307=>659,10308=>659,10309=>659,10310=>659,10311=>659,10312=>659,10313=>659,10314=>659,10315=>659,10316=>659,10317=>659,10318=>659,10319=>659,10320=>659,10321=>659,10322=>659,10323=>659,10324=>659,10325=>659,10326=>659,10327=>659,10328=>659,10329=>659,10330=>659,10331=>659,10332=>659,10333=>659,10334=>659,10335=>659,10336=>659,10337=>659,10338=>659,10339=>659,10340=>659,10341=>659,10342=>659,10343=>659,10344=>659,10345=>659,10346=>659,10347=>659,10348=>659,10349=>659,10350=>659,10351=>659,10352=>659,10353=>659,10354=>659,10355=>659,10356=>659,10357=>659,10358=>659,10359=>659,10360=>659,10361=>659,10362=>659,10363=>659,10364=>659,10365=>659,10366=>659,10367=>659,10368=>659,10369=>659,10370=>659,10371=>659,10372=>659,10373=>659,10374=>659,10375=>659,10376=>659,10377=>659,10378=>659,10379=>659,10380=>659,10381=>659,10382=>659,10383=>659,10384=>659,10385=>659,10386=>659,10387=>659,10388=>659,10389=>659,10390=>659,10391=>659,10392=>659,10393=>659,10394=>659,10395=>659,10396=>659,10397=>659,10398=>659,10399=>659,10400=>659,10401=>659,10402=>659,10403=>659,10404=>659,10405=>659,10406=>659,10407=>659,10408=>659,10409=>659,10410=>659,10411=>659,10412=>659,10413=>659,10414=>659,10415=>659,10416=>659,10417=>659,10418=>659,10419=>659,10420=>659,10421=>659,10422=>659,10423=>659,10424=>659,10425=>659,10426=>659,10427=>659,10428=>659,10429=>659,10430=>659,10431=>659,10432=>659,10433=>659,10434=>659,10435=>659,10436=>659,10437=>659,10438=>659,10439=>659,10440=>659,10441=>659,10442=>659,10443=>659,10444=>659,10445=>659,10446=>659,10447=>659,10448=>659,10449=>659,10450=>659,10451=>659,10452=>659,10453=>659,10454=>659,10455=>659,10456=>659,10457=>659,10458=>659,10459=>659,10460=>659,10461=>659,10462=>659,10463=>659,10464=>659,10465=>659,10466=>659,10467=>659,10468=>659,10469=>659,10470=>659,10471=>659,10472=>659,10473=>659,10474=>659,10475=>659,10476=>659,10477=>659,10478=>659,10479=>659,10480=>659,10481=>659,10482=>659,10483=>659,10484=>659,10485=>659,10486=>659,10487=>659,10488=>659,10489=>659,10490=>659,10491=>659,10492=>659,10493=>659,10494=>659,10495=>659,10496=>754,10497=>754,10498=>754,10499=>754,10500=>754,10501=>754,10502=>754,10503=>754,10504=>754,10505=>754,10506=>754,10507=>754,10508=>754,10509=>754,10510=>754,10511=>754,10512=>754,10513=>754,10514=>754,10515=>754,10516=>754,10517=>754,10518=>754,10519=>754,10520=>754,10521=>754,10522=>754,10523=>754,10524=>754,10525=>754,10526=>754,10527=>754,10528=>754,10529=>754,10530=>754,10531=>754,10532=>754,10533=>754,10534=>754,10535=>754,10536=>754,10537=>754,10538=>754,10539=>754,10540=>754,10541=>754,10542=>754,10543=>754,10544=>754,10545=>754,10546=>754,10547=>754,10548=>754,10549=>754,10550=>754,10551=>754,10552=>754,10553=>754,10554=>754,10555=>754,10556=>754,10557=>754,10558=>754,10559=>754,10560=>754,10561=>754,10562=>754,10563=>754,10564=>754,10565=>754,10566=>754,10567=>754,10568=>754,10569=>754,10570=>754,10571=>754,10572=>754,10573=>754,10574=>754,10575=>754,10576=>754,10577=>754,10578=>754,10579=>754,10580=>754,10581=>754,10582=>754,10583=>754,10584=>754,10585=>754,10586=>754,10587=>754,10588=>754,10589=>754,10590=>754,10591=>754,10592=>754,10593=>754,10594=>754,10595=>754,10596=>754,10597=>754,10598=>754,10599=>754,10600=>754,10601=>754,10602=>754,10603=>754,10604=>754,10605=>754,10606=>754,10607=>754,10608=>754,10609=>754,10610=>754,10611=>754,10612=>754,10613=>754,10614=>754,10615=>883,10616=>754,10617=>754,10618=>886,10619=>754,10620=>754,10621=>754,10622=>754,10623=>754,10731=>444,10764=>1361,10765=>469,10766=>469,10799=>754,11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754,11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754,11026=>850,11027=>850,11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11360=>598,11361=>288,11363=>605,11364=>677,11367=>785,11368=>580,11369=>672,11370=>545,11371=>625,11372=>474,11373=>704,11374=>921,11375=>650,11376=>704,11377=>596,11378=>1017,11379=>845,11381=>666,11382=>478,11383=>630,11385=>451,11386=>542,11388=>237,11389=>409,11390=>616,11391=>625,11520=>695,11521=>571,11522=>569,11523=>592,11524=>568,11525=>866,11526=>680,11527=>864,11528=>555,11529=>581,11530=>866,11531=>568,11532=>581,11533=>866,11534=>580,11535=>779,11536=>865,11537=>580,11538=>580,11539=>863,11540=>851,11541=>777,11542=>580,11543=>581,11544=>580,11545=>584,11546=>619,11547=>571,11548=>883,11549=>613,11550=>608,11551=>766,11552=>861,11553=>569,11554=>580,11555=>582,11556=>674,11557=>822,11800=>482,11810=>351,11811=>351,11812=>351,11813=>351,11822=>482,42564=>616,42565=>461,42566=>355,42567=>353,42576=>994,42577=>845,42580=>1074,42581=>783,42582=>1025,42583=>787,42760=>444,42761=>444,42762=>444,42763=>444,42764=>444,42765=>444,42766=>444,42767=>444,42768=>444,42769=>444,42770=>444,42771=>444,42772=>444,42773=>444,42774=>444,42779=>332,42780=>332,42781=>228,42782=>228,42783=>228,42790=>785,42791=>571,42792=>758,42793=>679,42794=>550,42795=>504,42796=>493,42797=>478,42798=>566,42799=>549,42800=>462,42801=>461,42802=>1075,42803=>848,42804=>1103,42805=>855,42806=>1034,42807=>839,42808=>871,42809=>705,42810=>871,42811=>705,42812=>866,42813=>683,42814=>688,42815=>504,42822=>708,42823=>391,42826=>838,42827=>640,42830=>1274,42831=>899,42856=>636,42857=>549,42875=>550,42876=>430,42880=>598,42881=>288,42882=>758,42883=>580,42884=>550,42885=>430,42886=>688,42887=>504,42891=>361,42892=>247,42893=>695,42896=>787,42897=>628,43002=>861,43003=>624,43004=>605,43005=>921,43006=>355,43007=>1081,62464=>598,62465=>607,62466=>651,62467=>861,62468=>607,62469=>602,62470=>661,62471=>896,62472=>607,62473=>607,62474=>1141,62475=>624,62476=>623,62477=>866,62478=>607,62479=>623,62480=>908,62481=>681,62482=>728,62483=>682,62484=>859,62485=>622,62486=>852,62487=>621,62488=>628,62489=>623,62490=>665,62491=>623,62492=>628,62493=>608,62494=>665,62495=>805,62496=>607,62497=>707,62498=>608,62499=>607,62500=>607,62501=>659,62502=>875,62504=>813,63172=>288,63173=>542,63174=>576,63175=>580,63176=>853,63185=>450,63188=>450,64256=>637,64257=>600,64258=>600,64259=>847,64260=>887,64261=>669,64262=>824,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>923,65535=>540);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedi.z
new file mode 100644
index 00000000..034e7415
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifcondensedi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifi.ctg.z
new file mode 100644
index 00000000..57b90faa
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifi.php
new file mode 100644
index 00000000..1daac0df
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='DejaVuSerif-Italic';
+$up=-63;
+$ut=44;
+$dw=600;
+$diff='';
+$originalsize=338776;
+$enc='';
+$file='dejavuserifi.z';
+$ctg='dejavuserifi.ctg.z';
+$desc=array('Flags'=>96,'FontBBox'=>'[-839 -347 1645 1109]','ItalicAngle'=>-11,'Ascent'=>928,'Descent'=>-236,'Leading'=>0,'CapHeight'=>729,'XHeight'=>519,'StemV'=>34,'StemH'=>15,'AvgWidth'=>513,'MaxWidth'=>1734,'MissingWidth'=>600);
+$cw=array(0=>600,32=>318,33=>402,34=>460,35=>838,36=>636,37=>950,38=>890,39=>275,40=>390,41=>390,42=>500,43=>838,44=>318,45=>338,46=>318,47=>337,48=>636,49=>636,50=>636,51=>636,52=>636,53=>636,54=>636,55=>636,56=>636,57=>636,58=>337,59=>337,60=>838,61=>838,62=>838,63=>536,64=>1000,65=>722,66=>735,67=>765,68=>802,69=>730,70=>694,71=>799,72=>872,73=>395,74=>401,75=>747,76=>664,77=>1024,78=>875,79=>820,80=>673,81=>820,82=>753,83=>685,84=>667,85=>843,86=>722,87=>1028,88=>712,89=>660,90=>695,91=>390,92=>337,93=>390,94=>838,95=>500,96=>500,97=>596,98=>640,99=>560,100=>640,101=>592,102=>370,103=>640,104=>644,105=>320,106=>310,107=>606,108=>320,109=>948,110=>644,111=>602,112=>640,113=>640,114=>478,115=>513,116=>402,117=>644,118=>565,119=>856,120=>564,121=>565,122=>527,123=>636,124=>337,125=>636,126=>838,160=>318,161=>402,162=>636,163=>636,164=>636,165=>636,166=>337,167=>500,168=>500,169=>1000,170=>475,171=>612,172=>838,173=>338,174=>1000,175=>500,176=>500,177=>838,178=>401,179=>401,180=>500,181=>650,182=>636,183=>318,184=>500,185=>401,186=>470,187=>612,188=>969,189=>969,190=>969,191=>536,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1001,199=>765,200=>730,201=>730,202=>730,203=>730,204=>395,205=>395,206=>395,207=>395,208=>807,209=>875,210=>820,211=>820,212=>820,213=>820,214=>820,215=>838,216=>820,217=>843,218=>843,219=>843,220=>843,221=>660,222=>676,223=>668,224=>596,225=>596,226=>596,227=>596,228=>596,229=>596,230=>940,231=>560,232=>592,233=>592,234=>592,235=>592,236=>320,237=>320,238=>320,239=>320,240=>602,241=>644,242=>602,243=>602,244=>602,245=>602,246=>602,247=>838,248=>602,249=>644,250=>644,251=>644,252=>644,253=>565,254=>640,255=>565,256=>722,257=>596,258=>722,259=>596,260=>722,261=>596,262=>765,263=>560,264=>765,265=>560,266=>765,267=>560,268=>765,269=>560,270=>802,271=>640,272=>807,273=>640,274=>730,275=>592,276=>730,277=>592,278=>730,279=>592,280=>730,281=>592,282=>730,283=>592,284=>799,285=>640,286=>799,287=>640,288=>799,289=>640,290=>799,291=>640,292=>872,293=>644,294=>872,295=>644,296=>395,297=>320,298=>395,299=>320,300=>395,301=>320,302=>395,303=>320,304=>395,305=>320,306=>801,307=>533,308=>401,309=>310,310=>747,311=>606,312=>606,313=>664,314=>320,315=>664,316=>320,317=>664,318=>400,319=>671,320=>465,321=>669,322=>324,323=>875,324=>644,325=>875,326=>644,327=>875,328=>644,329=>866,330=>843,331=>644,332=>820,333=>602,334=>820,335=>602,336=>820,337=>602,338=>1137,339=>989,340=>753,341=>478,342=>753,343=>478,344=>753,345=>478,346=>685,347=>513,348=>685,349=>513,350=>685,351=>513,352=>685,353=>513,354=>667,355=>402,356=>667,357=>402,358=>667,359=>402,360=>843,361=>644,362=>843,363=>644,364=>843,365=>644,366=>843,367=>644,368=>843,369=>644,370=>843,371=>644,372=>1028,373=>856,374=>660,375=>565,376=>660,377=>695,378=>527,379=>695,380=>527,381=>695,382=>527,383=>370,384=>640,385=>735,386=>735,387=>640,388=>735,389=>640,390=>765,391=>765,392=>560,393=>807,394=>802,395=>735,396=>640,397=>602,398=>730,399=>820,400=>623,401=>694,402=>370,403=>799,404=>712,405=>932,406=>395,407=>395,408=>747,409=>606,410=>320,411=>634,412=>948,413=>875,414=>644,415=>820,416=>820,417=>602,418=>1040,419=>807,420=>673,421=>640,422=>753,423=>685,424=>513,425=>707,426=>324,427=>402,428=>667,429=>402,430=>667,431=>843,432=>644,433=>829,434=>760,435=>738,436=>745,437=>695,438=>527,439=>564,440=>564,441=>564,442=>564,443=>636,444=>687,445=>564,446=>536,447=>635,448=>295,449=>492,450=>459,451=>295,452=>1497,453=>1329,454=>1167,455=>1065,456=>974,457=>630,458=>1276,459=>1185,460=>954,461=>722,462=>596,463=>395,464=>320,465=>820,466=>602,467=>843,468=>644,469=>843,470=>644,471=>843,472=>644,473=>843,474=>644,475=>843,476=>644,477=>592,478=>722,479=>596,480=>722,481=>596,482=>1001,483=>940,484=>848,485=>640,486=>799,487=>640,488=>747,489=>606,490=>820,491=>602,492=>820,493=>602,494=>564,495=>564,496=>320,497=>1497,498=>1329,499=>1167,500=>799,501=>640,502=>1154,503=>707,504=>875,505=>644,506=>722,507=>596,508=>1001,509=>940,510=>820,511=>602,512=>722,513=>596,514=>722,515=>596,516=>730,517=>592,518=>730,519=>592,520=>395,521=>320,522=>395,523=>320,524=>820,525=>602,526=>820,527=>602,528=>753,529=>478,530=>753,531=>478,532=>843,533=>644,534=>843,535=>644,536=>685,537=>513,538=>667,539=>402,540=>627,541=>521,542=>872,543=>644,544=>843,545=>814,546=>572,547=>552,548=>695,549=>527,550=>722,551=>596,552=>730,553=>592,554=>820,555=>602,556=>820,557=>602,558=>820,559=>602,560=>820,561=>602,562=>660,563=>565,564=>500,565=>832,566=>494,567=>310,568=>960,569=>960,570=>722,571=>765,572=>560,573=>664,574=>667,575=>513,576=>527,577=>583,578=>464,579=>735,580=>843,581=>722,582=>730,583=>592,584=>401,585=>315,586=>782,587=>640,588=>753,589=>478,590=>660,591=>565,592=>596,593=>675,594=>675,595=>640,596=>560,597=>560,598=>647,599=>683,600=>592,601=>592,602=>843,603=>537,604=>509,605=>773,606=>613,607=>315,608=>683,609=>640,610=>544,611=>712,612=>564,613=>644,614=>644,615=>644,616=>320,617=>392,618=>320,619=>380,620=>454,621=>363,622=>704,623=>948,624=>948,625=>948,626=>644,627=>694,628=>646,629=>602,630=>790,631=>647,632=>602,633=>501,634=>501,635=>551,636=>478,637=>478,638=>453,639=>453,640=>594,641=>594,642=>513,643=>271,644=>370,645=>487,646=>324,647=>402,648=>402,649=>644,650=>620,651=>608,652=>565,653=>856,654=>565,655=>655,656=>597,657=>560,658=>564,659=>560,660=>536,661=>536,662=>536,663=>513,664=>820,665=>563,666=>613,667=>654,668=>667,669=>366,670=>606,671=>543,672=>683,673=>536,674=>536,675=>996,676=>1033,677=>998,678=>809,679=>598,680=>782,681=>894,682=>646,683=>676,684=>598,685=>443,686=>781,687=>767,688=>433,689=>430,690=>264,691=>347,692=>347,693=>430,694=>392,695=>539,696=>355,697=>278,699=>318,700=>318,701=>318,702=>307,703=>307,704=>280,705=>281,710=>500,711=>500,712=>282,713=>500,716=>282,717=>500,720=>337,721=>337,722=>307,723=>307,726=>392,728=>500,729=>500,730=>500,731=>500,732=>500,733=>500,734=>417,736=>448,737=>243,738=>337,739=>355,740=>281,741=>493,742=>493,743=>493,744=>493,745=>493,750=>484,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>740,881=>531,882=>667,883=>553,884=>278,885=>278,886=>875,887=>667,890=>500,891=>560,892=>560,893=>560,894=>337,900=>500,901=>500,902=>722,903=>318,904=>900,905=>1039,906=>562,908=>835,910=>897,911=>853,912=>392,913=>722,914=>735,915=>694,916=>722,917=>730,918=>695,919=>872,920=>820,921=>395,922=>747,923=>722,924=>1024,925=>875,926=>704,927=>820,928=>872,929=>673,931=>707,932=>667,933=>660,934=>820,935=>712,936=>877,937=>829,938=>395,939=>660,940=>675,941=>537,942=>599,943=>392,944=>608,945=>675,946=>578,947=>598,948=>602,949=>537,950=>542,951=>599,952=>602,953=>392,954=>656,955=>634,956=>650,957=>608,958=>551,959=>602,960=>657,961=>588,962=>560,963=>683,964=>553,965=>608,966=>700,967=>606,968=>784,969=>815,970=>392,971=>608,972=>602,973=>608,974=>815,975=>747,976=>583,977=>715,978=>687,979=>874,980=>687,981=>682,982=>815,983=>624,984=>820,985=>602,986=>765,987=>560,988=>694,989=>463,990=>590,991=>660,992=>782,993=>577,1008=>624,1009=>588,1010=>560,1011=>310,1012=>820,1013=>560,1014=>560,1015=>676,1016=>640,1017=>765,1018=>1024,1019=>708,1020=>588,1021=>765,1022=>765,1023=>765,1024=>730,1025=>730,1026=>799,1027=>662,1028=>765,1029=>685,1030=>395,1031=>395,1032=>401,1033=>1084,1034=>1118,1035=>872,1036=>774,1037=>872,1038=>723,1039=>872,1040=>757,1041=>735,1042=>735,1043=>662,1044=>813,1045=>730,1046=>1124,1047=>623,1048=>872,1049=>872,1050=>774,1051=>834,1052=>1024,1053=>872,1054=>820,1055=>872,1056=>673,1057=>765,1058=>667,1059=>723,1060=>830,1061=>712,1062=>872,1063=>773,1064=>1141,1065=>1141,1066=>794,1067=>984,1068=>674,1069=>765,1070=>1193,1071=>808,1072=>596,1073=>610,1074=>582,1075=>505,1076=>634,1077=>592,1078=>1137,1079=>545,1080=>644,1081=>644,1082=>597,1083=>637,1084=>829,1085=>659,1086=>602,1087=>644,1088=>640,1089=>560,1090=>948,1091=>580,1092=>783,1093=>564,1094=>698,1095=>622,1096=>947,1097=>1001,1098=>667,1099=>814,1100=>544,1101=>560,1102=>880,1103=>662,1104=>592,1105=>592,1106=>624,1107=>505,1108=>560,1109=>513,1110=>320,1111=>320,1112=>310,1113=>859,1114=>878,1115=>644,1116=>597,1117=>644,1118=>580,1119=>644,1122=>762,1123=>882,1124=>1129,1125=>834,1130=>1124,1131=>920,1136=>944,1137=>902,1138=>820,1139=>552,1140=>859,1141=>678,1164=>707,1165=>544,1168=>672,1169=>529,1170=>662,1171=>505,1172=>730,1173=>614,1174=>1124,1175=>1137,1176=>623,1177=>545,1178=>774,1179=>604,1182=>774,1183=>597,1184=>892,1185=>669,1186=>872,1187=>712,1188=>1139,1189=>857,1190=>1206,1191=>943,1194=>765,1195=>560,1196=>667,1197=>1013,1198=>660,1199=>571,1200=>660,1201=>571,1202=>712,1203=>629,1204=>936,1205=>732,1206=>749,1207=>677,1210=>749,1211=>644,1216=>395,1217=>1124,1218=>1137,1219=>747,1220=>606,1223=>872,1224=>667,1227=>749,1228=>667,1231=>320,1232=>757,1233=>596,1234=>757,1235=>596,1236=>1001,1237=>940,1238=>730,1239=>592,1240=>820,1241=>592,1242=>820,1243=>592,1244=>1124,1245=>1137,1246=>623,1247=>545,1248=>564,1249=>564,1250=>872,1251=>644,1252=>872,1253=>644,1254=>820,1255=>602,1256=>820,1257=>602,1258=>820,1259=>602,1260=>765,1261=>560,1262=>723,1263=>580,1264=>723,1265=>580,1266=>723,1267=>580,1268=>773,1269=>622,1270=>662,1271=>505,1272=>984,1273=>814,1296=>623,1297=>545,1298=>834,1299=>637,1300=>1199,1301=>939,1306=>820,1307=>640,1308=>1028,1309=>856,1329=>810,1330=>811,1331=>806,1332=>828,1333=>806,1334=>826,1335=>761,1336=>811,1337=>968,1338=>816,1339=>772,1340=>682,1341=>1097,1342=>845,1343=>804,1344=>719,1345=>810,1346=>833,1347=>831,1348=>897,1349=>763,1350=>794,1351=>754,1352=>799,1353=>797,1354=>875,1355=>830,1356=>864,1357=>799,1358=>802,1359=>731,1360=>774,1361=>749,1362=>633,1363=>845,1364=>843,1365=>835,1366=>821,1369=>307,1370=>264,1371=>229,1372=>391,1373=>364,1374=>386,1375=>500,1377=>949,1378=>618,1379=>695,1380=>695,1381=>628,1382=>688,1383=>510,1384=>636,1385=>791,1386=>671,1387=>635,1388=>305,1389=>973,1390=>614,1391=>628,1392=>636,1393=>630,1394=>636,1395=>654,1396=>644,1397=>309,1398=>636,1399=>461,1400=>649,1401=>365,1402=>940,1403=>562,1404=>657,1405=>644,1406=>630,1407=>930,1408=>644,1409=>643,1410=>483,1411=>930,1412=>636,1413=>609,1414=>809,1415=>789,1417=>340,1418=>334,4256=>732,4257=>860,4258=>837,4259=>869,4260=>743,4261=>991,4262=>925,4263=>1111,4264=>576,4265=>760,4266=>972,4267=>951,4268=>753,4269=>1084,4270=>906,4271=>838,4272=>1049,4273=>743,4274=>679,4275=>1025,4276=>946,4277=>1029,4278=>741,4279=>743,4280=>742,4281=>743,4282=>889,4283=>946,4284=>724,4285=>765,4286=>743,4287=>968,4288=>1010,4289=>712,4290=>874,4291=>744,4292=>847,4293=>960,4304=>550,4305=>581,4306=>599,4307=>843,4308=>571,4309=>567,4310=>620,4311=>871,4312=>569,4313=>556,4314=>1076,4315=>596,4316=>596,4317=>835,4318=>580,4319=>590,4320=>833,4321=>607,4322=>758,4323=>701,4324=>825,4325=>595,4326=>868,4327=>578,4328=>604,4329=>596,4330=>685,4331=>597,4332=>557,4333=>585,4334=>625,4335=>693,4336=>582,4337=>613,4338=>581,4339=>582,4340=>580,4341=>659,4342=>896,4343=>636,4344=>592,4345=>628,4346=>581,4347=>456,4348=>373,7424=>565,7425=>774,7426=>940,7427=>563,7428=>560,7429=>585,7430=>585,7431=>553,7432=>509,7433=>320,7434=>499,7435=>597,7436=>543,7437=>778,7438=>667,7439=>602,7440=>560,7441=>647,7442=>647,7443=>647,7444=>989,7445=>512,7446=>602,7447=>602,7448=>553,7449=>594,7450=>594,7451=>553,7452=>585,7453=>664,7454=>923,7455=>655,7456=>565,7457=>856,7458=>527,7459=>527,7460=>531,7461=>743,7462=>524,7463=>565,7464=>657,7465=>553,7466=>703,7467=>635,7468=>455,7469=>630,7470=>463,7471=>463,7472=>505,7473=>459,7474=>459,7475=>503,7476=>549,7477=>249,7478=>252,7479=>470,7480=>418,7481=>645,7482=>551,7483=>551,7484=>516,7485=>369,7486=>424,7487=>474,7488=>420,7489=>531,7490=>647,7491=>375,7492=>375,7493=>425,7494=>592,7495=>400,7496=>400,7497=>387,7498=>387,7499=>428,7500=>340,7501=>400,7502=>175,7503=>365,7504=>613,7505=>399,7506=>385,7507=>346,7508=>385,7509=>385,7510=>400,7511=>247,7512=>399,7513=>418,7514=>613,7515=>373,7516=>468,7517=>364,7518=>376,7519=>379,7520=>441,7521=>381,7522=>201,7523=>347,7524=>399,7525=>373,7526=>364,7527=>376,7528=>370,7529=>441,7530=>381,7531=>974,7543=>640,7544=>549,7547=>372,7557=>320,7579=>425,7580=>353,7581=>353,7582=>473,7583=>428,7584=>233,7585=>316,7586=>488,7587=>399,7588=>201,7589=>201,7590=>201,7591=>201,7592=>318,7593=>263,7594=>263,7595=>455,7596=>613,7597=>613,7598=>495,7599=>492,7600=>487,7601=>385,7602=>473,7603=>328,7604=>299,7605=>334,7606=>399,7607=>477,7608=>368,7609=>464,7610=>355,7611=>332,7612=>418,7613=>418,7614=>452,7615=>473,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>722,7681=>596,7682=>735,7683=>640,7684=>735,7685=>640,7686=>735,7687=>640,7688=>765,7689=>560,7690=>802,7691=>640,7692=>802,7693=>640,7694=>802,7695=>640,7696=>802,7697=>640,7698=>802,7699=>640,7700=>730,7701=>592,7702=>730,7703=>592,7704=>730,7705=>592,7706=>730,7707=>592,7708=>730,7709=>592,7710=>694,7711=>370,7712=>799,7713=>640,7714=>872,7715=>644,7716=>872,7717=>644,7718=>872,7719=>644,7720=>872,7721=>644,7722=>872,7723=>644,7724=>395,7725=>320,7726=>395,7727=>320,7728=>747,7729=>606,7730=>747,7731=>606,7732=>747,7733=>606,7734=>664,7735=>320,7736=>664,7737=>320,7738=>664,7739=>320,7740=>664,7741=>320,7742=>1024,7743=>948,7744=>1024,7745=>948,7746=>1024,7747=>953,7748=>875,7749=>644,7750=>875,7751=>644,7752=>875,7753=>644,7754=>875,7755=>644,7756=>820,7757=>602,7758=>820,7759=>602,7760=>820,7761=>602,7762=>820,7763=>602,7764=>673,7765=>640,7766=>673,7767=>640,7768=>753,7769=>478,7770=>753,7771=>478,7772=>753,7773=>478,7774=>753,7775=>478,7776=>685,7777=>513,7778=>685,7779=>513,7780=>685,7781=>513,7782=>685,7783=>521,7784=>685,7785=>513,7786=>667,7787=>402,7788=>667,7789=>402,7790=>667,7791=>402,7792=>667,7793=>402,7794=>843,7795=>644,7796=>843,7797=>644,7798=>843,7799=>644,7800=>843,7801=>644,7802=>843,7803=>644,7804=>722,7805=>565,7806=>722,7807=>565,7808=>1028,7809=>856,7810=>1028,7811=>856,7812=>1028,7813=>856,7814=>1028,7815=>856,7816=>1028,7817=>856,7818=>712,7819=>564,7820=>712,7821=>564,7822=>660,7823=>565,7824=>695,7825=>527,7826=>695,7827=>527,7828=>695,7829=>527,7830=>644,7831=>402,7832=>856,7833=>565,7834=>903,7835=>370,7836=>370,7837=>370,7838=>829,7839=>602,7840=>722,7841=>596,7842=>722,7843=>596,7844=>722,7845=>613,7846=>722,7847=>613,7848=>722,7849=>613,7850=>722,7851=>613,7852=>722,7853=>596,7854=>722,7855=>596,7856=>722,7857=>596,7858=>722,7859=>596,7860=>722,7861=>596,7862=>722,7863=>596,7864=>730,7865=>592,7866=>730,7867=>592,7868=>730,7869=>592,7870=>730,7871=>615,7872=>730,7873=>615,7874=>730,7875=>615,7876=>730,7877=>615,7878=>730,7879=>592,7880=>395,7881=>320,7882=>395,7883=>320,7884=>820,7885=>602,7886=>820,7887=>602,7888=>820,7889=>612,7890=>820,7891=>612,7892=>820,7893=>612,7894=>820,7895=>612,7896=>820,7897=>602,7898=>820,7899=>602,7900=>820,7901=>602,7902=>820,7903=>602,7904=>820,7905=>602,7906=>820,7907=>602,7908=>843,7909=>644,7910=>843,7911=>644,7912=>843,7913=>644,7914=>843,7915=>644,7916=>843,7917=>644,7918=>843,7919=>644,7920=>843,7921=>644,7922=>660,7923=>565,7924=>660,7925=>565,7926=>660,7927=>565,7928=>660,7929=>565,7930=>949,7931=>581,7936=>675,7937=>675,7938=>675,7939=>675,7940=>675,7941=>675,7942=>675,7943=>675,7944=>722,7945=>722,7946=>869,7947=>869,7948=>734,7949=>763,7950=>722,7951=>722,7952=>537,7953=>537,7954=>537,7955=>537,7956=>537,7957=>537,7960=>853,7961=>841,7962=>1067,7963=>1077,7964=>1008,7965=>1035,7968=>599,7969=>599,7970=>599,7971=>599,7972=>599,7973=>599,7974=>599,7975=>599,7976=>998,7977=>992,7978=>1212,7979=>1224,7980=>1159,7981=>1183,7982=>1098,7983=>1095,7984=>392,7985=>392,7986=>392,7987=>392,7988=>392,7989=>392,7990=>392,7991=>392,7992=>521,7993=>512,7994=>735,7995=>738,7996=>679,7997=>706,7998=>624,7999=>615,8000=>602,8001=>602,8002=>602,8003=>602,8004=>602,8005=>602,8008=>820,8009=>859,8010=>1120,8011=>1127,8012=>937,8013=>964,8016=>608,8017=>608,8018=>608,8019=>608,8020=>608,8021=>608,8022=>608,8023=>608,8025=>851,8027=>1079,8029=>1044,8031=>953,8032=>815,8033=>815,8034=>815,8035=>815,8036=>815,8037=>815,8038=>815,8039=>815,8040=>829,8041=>870,8042=>1131,8043=>1137,8044=>946,8045=>976,8046=>938,8047=>970,8048=>675,8049=>675,8050=>537,8051=>537,8052=>599,8053=>599,8054=>392,8055=>392,8056=>602,8057=>602,8058=>608,8059=>608,8060=>815,8061=>815,8064=>675,8065=>675,8066=>675,8067=>675,8068=>675,8069=>675,8070=>675,8071=>675,8072=>722,8073=>722,8074=>869,8075=>869,8076=>734,8077=>763,8078=>722,8079=>722,8080=>599,8081=>599,8082=>599,8083=>599,8084=>599,8085=>599,8086=>599,8087=>599,8088=>998,8089=>992,8090=>1212,8091=>1224,8092=>1159,8093=>1183,8094=>1098,8095=>1095,8096=>815,8097=>815,8098=>815,8099=>815,8100=>815,8101=>815,8102=>815,8103=>815,8104=>829,8105=>870,8106=>1131,8107=>1137,8108=>946,8109=>976,8110=>938,8111=>970,8112=>675,8113=>675,8114=>675,8115=>675,8116=>675,8118=>675,8119=>675,8120=>722,8121=>722,8122=>722,8123=>722,8124=>722,8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>599,8131=>599,8132=>599,8134=>599,8135=>599,8136=>912,8137=>900,8138=>1063,8139=>1039,8140=>872,8141=>500,8142=>500,8143=>500,8144=>392,8145=>392,8146=>392,8147=>392,8150=>392,8151=>392,8152=>395,8153=>395,8154=>588,8155=>562,8157=>500,8158=>500,8159=>500,8160=>608,8161=>608,8162=>608,8163=>608,8164=>588,8165=>588,8166=>608,8167=>608,8168=>660,8169=>660,8170=>921,8171=>897,8172=>790,8173=>500,8174=>500,8175=>500,8178=>815,8179=>815,8180=>815,8182=>815,8183=>815,8184=>961,8185=>835,8186=>984,8187=>853,8188=>829,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>636,8200=>318,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>338,8209=>338,8210=>636,8211=>500,8212=>1000,8213=>1000,8214=>500,8215=>500,8216=>318,8217=>318,8218=>318,8219=>318,8220=>511,8221=>511,8222=>518,8223=>511,8224=>500,8225=>500,8226=>590,8227=>590,8228=>334,8229=>667,8230=>1000,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200,8240=>1342,8241=>1734,8242=>227,8243=>374,8244=>520,8245=>227,8246=>374,8247=>520,8248=>339,8249=>400,8250=>400,8252=>527,8253=>536,8254=>500,8258=>1000,8260=>167,8261=>390,8262=>390,8263=>976,8264=>753,8265=>753,8267=>636,8268=>500,8269=>500,8270=>500,8271=>337,8273=>500,8274=>450,8275=>1000,8279=>663,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>401,8305=>201,8308=>401,8309=>401,8310=>401,8311=>401,8312=>401,8313=>401,8314=>528,8315=>528,8316=>528,8317=>246,8318=>246,8319=>405,8320=>401,8321=>401,8322=>401,8323=>401,8324=>401,8325=>401,8326=>401,8327=>401,8328=>401,8329=>401,8330=>528,8331=>528,8332=>528,8333=>246,8334=>246,8336=>375,8337=>387,8338=>385,8339=>355,8340=>387,8341=>433,8342=>365,8343=>243,8344=>613,8345=>405,8346=>400,8347=>337,8348=>247,8358=>660,8364=>636,8367=>1057,8369=>706,8372=>780,8373=>636,8377=>636,8451=>1119,8457=>1047,8462=>644,8463=>644,8470=>946,8482=>1000,8486=>829,8487=>829,8490=>747,8491=>722,8513=>775,8514=>557,8515=>557,8516=>611,8523=>890,8528=>969,8529=>969,8530=>1370,8531=>969,8532=>969,8533=>969,8534=>969,8535=>969,8536=>969,8537=>969,8538=>969,8539=>969,8540=>969,8541=>969,8542=>969,8543=>568,8544=>395,8545=>590,8546=>786,8547=>966,8548=>722,8549=>981,8550=>1176,8551=>1372,8552=>932,8553=>712,8554=>932,8555=>1127,8556=>664,8557=>765,8558=>802,8559=>1024,8560=>320,8561=>640,8562=>959,8563=>885,8564=>565,8565=>885,8566=>1205,8567=>1524,8568=>884,8569=>564,8570=>884,8571=>1204,8572=>320,8573=>560,8574=>640,8575=>948,8576=>1206,8577=>802,8578=>1206,8579=>765,8580=>560,8581=>765,8585=>969,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838,8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838,8620=>838,8621=>838,8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838,8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838,8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838,8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838,8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838,8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838,8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838,8700=>838,8701=>838,8702=>838,8703=>838,8704=>604,8706=>517,8707=>542,8708=>542,8710=>698,8711=>698,8712=>740,8713=>740,8715=>740,8716=>740,8719=>796,8720=>796,8721=>714,8722=>838,8723=>838,8724=>838,8725=>337,8727=>680,8728=>490,8729=>490,8730=>637,8731=>637,8732=>637,8733=>677,8734=>833,8735=>838,8736=>838,8739=>291,8740=>479,8741=>462,8742=>634,8743=>732,8744=>732,8745=>838,8746=>838,8747=>521,8748=>852,8749=>1182,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838,8770=>838,8771=>838,8776=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1033,8789=>1033,8800=>838,8801=>838,8804=>838,8805=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8844=>838,8845=>838,8846=>838,8847=>846,8848=>846,8849=>846,8850=>846,8851=>838,8852=>838,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838,8865=>838,8866=>860,8867=>860,8868=>940,8869=>940,8870=>567,8871=>567,8872=>860,8873=>860,8874=>860,8875=>1031,8876=>860,8877=>860,8878=>860,8879=>1031,8901=>342,8962=>764,8968=>390,8969=>390,8970=>390,8971=>390,8976=>838,8977=>513,8984=>1000,8985=>838,8992=>521,8993=>521,8997=>1000,9000=>1443,9085=>919,9115=>500,9116=>500,9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500,9125=>500,9126=>500,9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>521,9167=>945,9251=>764,9472=>602,9473=>602,9474=>602,9475=>602,9476=>602,9477=>602,9478=>602,9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602,9486=>602,9487=>602,9488=>602,9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602,9496=>602,9497=>602,9498=>602,9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602,9506=>602,9507=>602,9508=>602,9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602,9516=>602,9517=>602,9518=>602,9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602,9526=>602,9527=>602,9528=>602,9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602,9536=>602,9537=>602,9538=>602,9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602,9546=>602,9547=>602,9548=>602,9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602,9556=>602,9557=>602,9558=>602,9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602,9566=>602,9567=>602,9568=>602,9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602,9576=>602,9577=>602,9578=>602,9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602,9586=>602,9587=>602,9588=>602,9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602,9596=>602,9597=>602,9598=>602,9599=>602,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527,9687=>527,9688=>791,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>873,9697=>873,9698=>769,9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945,9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732,9727=>769,9728=>896,9784=>896,9785=>896,9786=>896,9787=>896,9788=>896,9791=>614,9792=>731,9793=>731,9794=>896,9795=>896,9796=>896,9797=>896,9798=>896,9799=>896,9824=>896,9825=>896,9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472,9838=>357,9839=>484,10145=>838,10181=>390,10182=>390,10208=>494,10216=>390,10217=>390,10224=>838,10225=>838,10226=>838,10227=>838,10228=>1033,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434,10237=>1434,10238=>1434,10239=>1434,10240=>732,10241=>732,10242=>732,10243=>732,10244=>732,10245=>732,10246=>732,10247=>732,10248=>732,10249=>732,10250=>732,10251=>732,10252=>732,10253=>732,10254=>732,10255=>732,10256=>732,10257=>732,10258=>732,10259=>732,10260=>732,10261=>732,10262=>732,10263=>732,10264=>732,10265=>732,10266=>732,10267=>732,10268=>732,10269=>732,10270=>732,10271=>732,10272=>732,10273=>732,10274=>732,10275=>732,10276=>732,10277=>732,10278=>732,10279=>732,10280=>732,10281=>732,10282=>732,10283=>732,10284=>732,10285=>732,10286=>732,10287=>732,10288=>732,10289=>732,10290=>732,10291=>732,10292=>732,10293=>732,10294=>732,10295=>732,10296=>732,10297=>732,10298=>732,10299=>732,10300=>732,10301=>732,10302=>732,10303=>732,10304=>732,10305=>732,10306=>732,10307=>732,10308=>732,10309=>732,10310=>732,10311=>732,10312=>732,10313=>732,10314=>732,10315=>732,10316=>732,10317=>732,10318=>732,10319=>732,10320=>732,10321=>732,10322=>732,10323=>732,10324=>732,10325=>732,10326=>732,10327=>732,10328=>732,10329=>732,10330=>732,10331=>732,10332=>732,10333=>732,10334=>732,10335=>732,10336=>732,10337=>732,10338=>732,10339=>732,10340=>732,10341=>732,10342=>732,10343=>732,10344=>732,10345=>732,10346=>732,10347=>732,10348=>732,10349=>732,10350=>732,10351=>732,10352=>732,10353=>732,10354=>732,10355=>732,10356=>732,10357=>732,10358=>732,10359=>732,10360=>732,10361=>732,10362=>732,10363=>732,10364=>732,10365=>732,10366=>732,10367=>732,10368=>732,10369=>732,10370=>732,10371=>732,10372=>732,10373=>732,10374=>732,10375=>732,10376=>732,10377=>732,10378=>732,10379=>732,10380=>732,10381=>732,10382=>732,10383=>732,10384=>732,10385=>732,10386=>732,10387=>732,10388=>732,10389=>732,10390=>732,10391=>732,10392=>732,10393=>732,10394=>732,10395=>732,10396=>732,10397=>732,10398=>732,10399=>732,10400=>732,10401=>732,10402=>732,10403=>732,10404=>732,10405=>732,10406=>732,10407=>732,10408=>732,10409=>732,10410=>732,10411=>732,10412=>732,10413=>732,10414=>732,10415=>732,10416=>732,10417=>732,10418=>732,10419=>732,10420=>732,10421=>732,10422=>732,10423=>732,10424=>732,10425=>732,10426=>732,10427=>732,10428=>732,10429=>732,10430=>732,10431=>732,10432=>732,10433=>732,10434=>732,10435=>732,10436=>732,10437=>732,10438=>732,10439=>732,10440=>732,10441=>732,10442=>732,10443=>732,10444=>732,10445=>732,10446=>732,10447=>732,10448=>732,10449=>732,10450=>732,10451=>732,10452=>732,10453=>732,10454=>732,10455=>732,10456=>732,10457=>732,10458=>732,10459=>732,10460=>732,10461=>732,10462=>732,10463=>732,10464=>732,10465=>732,10466=>732,10467=>732,10468=>732,10469=>732,10470=>732,10471=>732,10472=>732,10473=>732,10474=>732,10475=>732,10476=>732,10477=>732,10478=>732,10479=>732,10480=>732,10481=>732,10482=>732,10483=>732,10484=>732,10485=>732,10486=>732,10487=>732,10488=>732,10489=>732,10490=>732,10491=>732,10492=>732,10493=>732,10494=>732,10495=>732,10496=>838,10497=>838,10498=>838,10499=>838,10500=>838,10501=>838,10502=>838,10503=>838,10504=>838,10505=>838,10506=>838,10507=>838,10508=>838,10509=>838,10510=>838,10511=>838,10512=>838,10513=>838,10514=>838,10515=>838,10516=>838,10517=>838,10518=>838,10519=>838,10520=>838,10521=>838,10522=>838,10523=>838,10524=>838,10525=>838,10526=>838,10527=>838,10528=>838,10529=>838,10530=>838,10531=>838,10532=>838,10533=>838,10534=>838,10535=>838,10536=>838,10537=>838,10538=>838,10539=>838,10540=>838,10541=>838,10542=>838,10543=>838,10544=>838,10545=>838,10546=>838,10547=>838,10548=>838,10549=>838,10550=>838,10551=>838,10552=>838,10553=>838,10554=>838,10555=>838,10556=>838,10557=>838,10558=>838,10559=>838,10560=>838,10561=>838,10562=>838,10563=>838,10564=>838,10565=>838,10566=>838,10567=>838,10568=>838,10569=>838,10570=>838,10571=>838,10572=>838,10573=>838,10574=>838,10575=>838,10576=>838,10577=>838,10578=>838,10579=>838,10580=>838,10581=>838,10582=>838,10583=>838,10584=>838,10585=>838,10586=>838,10587=>838,10588=>838,10589=>838,10590=>838,10591=>838,10592=>838,10593=>838,10594=>838,10595=>838,10596=>838,10597=>838,10598=>838,10599=>838,10600=>838,10601=>838,10602=>838,10603=>838,10604=>838,10605=>838,10606=>838,10607=>838,10608=>838,10609=>838,10610=>838,10611=>838,10612=>838,10613=>838,10614=>838,10615=>981,10616=>838,10617=>838,10618=>984,10619=>838,10620=>838,10621=>838,10622=>838,10623=>838,10731=>494,10764=>1513,10765=>521,10766=>521,10799=>838,11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838,11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838,11026=>945,11027=>945,11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11360=>664,11361=>320,11363=>673,11364=>753,11367=>872,11368=>644,11369=>747,11370=>606,11371=>695,11372=>527,11373=>782,11374=>1024,11375=>722,11376=>782,11377=>663,11378=>1130,11379=>939,11381=>740,11382=>531,11383=>700,11385=>501,11386=>602,11388=>264,11389=>455,11390=>685,11391=>695,11520=>773,11521=>635,11522=>633,11523=>658,11524=>631,11525=>962,11526=>756,11527=>960,11528=>617,11529=>646,11530=>962,11531=>632,11532=>646,11533=>962,11534=>645,11535=>866,11536=>961,11537=>645,11538=>645,11539=>959,11540=>945,11541=>863,11542=>644,11543=>646,11544=>645,11545=>649,11546=>688,11547=>634,11548=>982,11549=>681,11550=>676,11551=>852,11552=>957,11553=>632,11554=>645,11555=>646,11556=>749,11557=>914,11800=>536,11810=>390,11811=>390,11812=>390,11813=>390,11822=>536,42564=>685,42565=>513,42566=>395,42567=>392,42576=>1104,42577=>939,42580=>1193,42581=>871,42582=>1140,42583=>875,42760=>493,42761=>493,42762=>493,42763=>493,42764=>493,42765=>493,42766=>493,42767=>493,42768=>493,42769=>493,42770=>493,42771=>493,42772=>493,42773=>493,42774=>493,42779=>369,42780=>369,42781=>253,42782=>253,42783=>253,42790=>872,42791=>634,42792=>843,42793=>754,42794=>612,42795=>560,42796=>548,42797=>531,42798=>629,42799=>610,42800=>514,42801=>513,42802=>1195,42803=>943,42804=>1226,42805=>950,42806=>1149,42807=>933,42808=>968,42809=>784,42810=>968,42811=>784,42812=>962,42813=>759,42814=>765,42815=>560,42822=>787,42823=>434,42826=>932,42827=>711,42830=>1416,42831=>999,42856=>707,42857=>610,42875=>612,42876=>478,42880=>664,42881=>320,42882=>843,42883=>644,42884=>612,42885=>478,42886=>765,42887=>560,42891=>402,42892=>275,42893=>773,42896=>875,42897=>698,43002=>957,43003=>694,43004=>673,43005=>1024,43006=>395,43007=>1201,62464=>664,62465=>675,62466=>724,62467=>958,62468=>675,62469=>669,62470=>735,62471=>997,62472=>675,62473=>675,62474=>1268,62475=>693,62476=>692,62477=>963,62478=>675,62479=>692,62480=>1009,62481=>756,62482=>809,62483=>758,62484=>955,62485=>691,62486=>946,62487=>690,62488=>698,62489=>692,62490=>739,62491=>692,62492=>698,62493=>676,62494=>739,62495=>895,62496=>675,62497=>785,62498=>676,62499=>675,62500=>675,62501=>732,62502=>972,62504=>904,63172=>320,63173=>602,63174=>640,63175=>644,63176=>947,63185=>500,63188=>500,64256=>708,64257=>667,64258=>667,64259=>941,64260=>986,64261=>744,64262=>916,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1025,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifi.z
new file mode 100644
index 00000000..7c112849
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/dejavuserifi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/AUTHORS b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/AUTHORS
new file mode 100644
index 00000000..e7f7575d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/AUTHORS
@@ -0,0 +1,242 @@
+-*- mode:text; coding:utf-8; -*-
+                        GNU FreeFont Authors
+                        ====================
+
+The FreeFont collection is being maintained by
+	Steve White <stevan.white AT googlemail.com>
+The folowing list cites the other contributors that contributed to
+particular ISO 10646 blocks.
+
+* URW++ Design & Development GmbH <http://www.urwpp.de/>
+
+	Basic Latin				(U+0041-U+007A)
+	Latin-1 Supplement                      (U+00C0-U+00FF) (most)
+	Latin Extended-A                        (U+0100-U+017F)
+	Spacing Modifier Letters		(U+02B0-U+02FF)
+	Mathematical Operators			(U+2200-U+22FF) (parts)
+	Block Elements				(U+2580-U+259F)
+	Dingbats				(U+2700-U+27BF)
+
+* Yannis Haralambous <yannis.haralambous AT enst-bretagne.fr> and John
+  Plaice <plaice AT omega.cse.unsw.edu.au>
+
+	Latin Extended-B                        (U+0180-U+024F)
+	IPA Extensions				(U+0250-U+02AF)
+	Greek					(U+0370-U+03FF)
+	Armenian				(U+0530-U+058F)
+	Hebrew					(U+0590-U+05FF)
+	Arabic					(U+0600-U+06FF)
+	Currency Symbols			(U+20A0-U+20CF)
+	Arabic Presentation Forms-A		(U+FB50-U+FDFF)
+	Arabic Presentation Forms-B		(U+FE70-U+FEFF)
+
+* Yannis Haralambous and Wellcome Institute
+
+	Sinhala					(U+0D80-U+0DFF)
+
+* Young U. Ryu <ryoung AT utdallas.edu>
+
+	Arrows					(U+2190-U+21FF)
+	Mathematical Symbols			(U+2200-U+22FF)
+	Mathematical Alphanumeric Symbols       (U+1D400-U+1D7FF)
+
+* Valek Filippov <frob AT df.ru>
+
+	Cyrillic				(U+0400-U+04FF)
+
+* Wadalab Kanji Comittee
+
+	Hiragana				(U+3040-U+309F)
+	Katakana				(U+30A0-U+30FF)
+
+* Angelo Haritsis <ah AT computer.org>
+
+	Greek					(U+0370-U+03FF)
+
+* Yannis Haralambous and Virach Sornlertlamvanich
+
+	Thai					(U+0E00-U+0E7F)
+
+* Shaheed R. Haque <srhaque AT iee.org>
+
+	Bengali					(U+0980-U+09FF)
+
+* Sam Stepanyan <sam AT arminco.com>
+
+	Armenian				(U+0530-U+058F)
+
+* Mohamed Ishan <ishan AT mitf.f2s.com>
+
+	Thaana					(U+0780-U+07BF)
+
+* Sushant Kumar Dash <sushant AT writeme.com>
+
+	Oriya					(U+0B00-U+0B7F)
+
+* Harsh Kumar <harshkumar AT vsnl.com>
+
+	Devanagari				(U+0900-U+097F)
+	Bengali					(U+0980-U+09FF)
+	Gurmukhi				(U+0A00-U+0A7F)
+	Gujarati				(U+0A80-U+0AFF)
+
+* Prasad A. Chodavarapu <chprasad AT hotmail.com>
+
+	Telugu					(U+0C00-U+0C7F)
+
+* Frans Velthuis <velthuis AT rc.rug.nl> and Anshuman Pandey
+  <apandey AT u.washington.edu> 
+
+	Devanagari				(U+0900-U+097F)
+
+* Hardip Singh Pannu <HSPannu AT aol.com>
+
+	Gurmukhi				(U+0A00-U+0A7F)
+
+* Jeroen Hellingman <jehe AT kabelfoon.nl>
+
+	Oriya					(U+0B00-U+0B7F)
+	Malayalam				(U+0D00-U+0D7F)
+
+* Thomas Ridgeway <email needed>
+
+	Tamil					(U+0B80-U+0BFF)
+
+* Berhanu Beyene <1beyene AT informatik.uni-hamburg.de>,
+  Prof. Dr. Manfred Kudlek <kudlek AT informatik.uni-hamburg.de>, Olaf
+  Kummer <kummer AT informatik.uni-hamburg.de>, and Jochen Metzinger <?>
+
+	Ethiopic				(U+1200-U+137F)
+
+* Maxim Iorsh <iorsh AT users.sourceforge.net>
+
+	Hebrew					(U+0590-U+05FF)
+
+* Vyacheslav Dikonov <sdiconov AT mail.ru>
+
+	Syriac					(U+0700-U+074A)
+	Braille					(U+2800-U+28FF)
+
+* Panayotis Katsaloulis <panayotis AT panayotis.com>
+
+	Greek Extended				(U+1F00-U+1FFF)
+
+* M.S. Sridhar <mssridhar AT vsnl.com>
+
+	Devanagari				(U+0900-U+097F)
+	Bengali					(U+0980-U+09FF)
+	Gurmukhi				(U+0A00-U+0A7F)
+	Gujarati				(U+0A80-U+0AFF)
+	Oriya					(U+0B00-U+0B7F)
+	Tamil					(U+0B80-U+0BFF)
+	Telugu					(U+0C00-U+0C7F)
+	Kannada					(U+0C80-U+0CFF)	
+	Malayalam				(U+0D00-U+0D7F)
+
+* DMS Electronics, The Sri Lanka Tipitaka Project, and Noah Levitt
+  <nlevitt AT columbia.edu>
+
+	Sinhala					(U+0D80-U+0DFF)
+        
+* Dan Shurovich Chirkov <dansh AT chirkov.com>
+
+	Cyrillic				(U+0400-U+04FF)
+
+* Abbas Izad <abbasizad AT hotmail.com>
+
+	Arabic					(U+0600-U+06FF)
+	Arabic Presentation Forms-A		(U+FB50-U+FDFF)
+	Arabic Presentation Forms-B		(U+FE70-U+FEFF)
+
+* Denis Jacquerye <moyogo AT gmail.com>
+
+	Latin Extended-B                        (U+0180-U+024F)
+	IPA Extensions				(U+0250-U+02AF)
+
+* K.H. Hussain <hussain AT kfri.org> and R. Chitrajan
+
+	Malayalam				(U+0D00-U+0D7F)
+
+* Solaiman Karim <solaiman AT ekushey.org> and Omi Azad <omi AT ekushey.org>
+
+	Bengali					(U+0980-U+09FF)
+
+* Sonali Sonania <sonalisonania AT gmail.com> and Monika Shah
+  <monikapatira AT gmail.com>
+
+	Devanagari				(U+0900-U+097F)
+	Gujarati				(U+0A80-U+0AFF)
+
+* Pravin Satpute <pravin.d.s AT gmail.com>, Bageshri Salvi
+  <sbagrshri AT yahoo.co.in>, Rahul Bhalerao <b.rahul.pm AT gmail.com> and
+  Sandeep Shedmake <sandeep.shedmake AT gmail.com>
+
+	Devanagari				(U+0900-U+097F)
+	Gujarati				(U+0A80-U+0AFF)
+	Oriya					(U+0B00-U+0B7F)
+	Malayalam				(U+0D00-U+0D7F)
+	Tamil					(U+0B80-U+0BFF)
+
+* Kulbir Singh Thind
+
+	Gurmukhi				(U+0A00-U+0A7F)
+
+* Gia Shervashidze <giasher AT telenet.ge>
+
+        Georgian				(U+10A0-U+10FF)
+
+* Daniel Johnson
+
+	Armenian (serif)                        (U+0530-U+058F)
+	Cherokee                                (U+13A0-U+13FF)
+	Unified Canadian Aboriginal Syllabics   (U+1400-U+167F)
+	UCAS Extended                           (U+18B0-U+18F5)
+	Tifinagh                                (U+2D30-U+2D7F)
+	Vai                                     (U+A500-U+A62B)
+	Latin Extended-D (Mayanist letters)     (U+A720-U+A7FF)
+	Kayah Li                                (U+A900-U+A92F)
+	Osmanya                                 (U+10480-U+104a7)
+
+* George Douros
+
+	Gothic                                  (U+10330-U+1034F)
+	Phoenecian                              (U+10900-U+1091F)
+	Byzantine Musical Symbols               (U+1D000-U+1D0FF)
+	Western Musical Symbols                 (U+1D100-U+1D1DF)
+	Mathematical Alphanumeric Symbols       (U+1D400-U+1D7FF)
+	Mah Jong Tiles                          (U+1F000-U+1F02B)
+	Dominoes                                (U+1F030-U+1F093)
+
+* Steve White <stevan_white AT gmail.com>
+	Glagolitic                              (U+2C00-U+2C5F)
+	Coptic                                  (U+2C80-U+2CFF)
+	Arabic					(U+0600-U+06FF) (Mono)
+	Old Italic                              (U+10300-U+1032F)
+
+* Pavel Skrylev is responsible for
+	Cyrillic Extended-A                     (U+2DEO-U+2DFF)
+  as well as many of the additions to
+	Cyrillic Extended-B                     (U+A640-U+A65F)
+
+* Mark Williamson
+  Made the MPH 2 Damase font, from which 
+	Hanunóo                                 (U+1720-U+173F)
+	Buginese                                (U+1A00-U+1A1F)
+	Tai Le                                  (U+1950-U+197F)
+	Ugaritic                                (U+10380-U+1039F)
+	Old Persian                             (U+103A0-U+103DF)
+
+* Masoud Pourmoosa
+	Arabic					(U+0600-U+06FF)
+
+* Emmanuel Vallois
+	Python scripts, support
+
+* Primož Peterlin <primoz.peterlin AT biofiz.mf.uni-lj.si>
+  maintained FreeFont for several years, and is thanked for all his work.
+
+Please see the CREDITS file for details on who contributed particular
+subsets of the glyphs in font files.
+
+--------------------------------------------------------------------------
+$Id: AUTHORS,v 1.23 2010-09-11 13:24:11 Stevan_White Exp $
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/COPYING b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/COPYING
new file mode 100644
index 00000000..94a9ed02
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/COPYING
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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 <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/CREDITS b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/CREDITS
new file mode 100644
index 00000000..06d280e9
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/CREDITS
@@ -0,0 +1,597 @@
+-*- mode:text; coding:utf-8; -*-
+                         GNU FreeFont Credits
+                         ====================
+
+This file lists contributors and contributions to the GNU FreeFont project.
+
+
+* URW++ Design & Development GmbH <http://www.urwpp.de/>
+
+URW++ donated a set of 35 core PostScript Type 1 fonts to the
+Ghostscript project <http://www.ghostscript.com/>, to be available
+under the terms of GNU General Public License (GPL).
+
+	Basic Latin				(U+0041-U+007A)
+	Latin-1 Supplement                      (U+00C0-U+00FF)
+	Latin Extended-A                        (U+0100-U+017F)
+	Spacing Modifier Letters		(U+02B0-U+02FF)
+	Mathematical Operators			(U+2200-U+22FF)
+	Block Elements				(U+2580-U+259F)
+	Dingbats				(U+2700-U+27BF)
+
+
+* Yannis Haralambous <yannis.haralambous AT enst-bretagne.fr> and John
+  Plaice <plaice AT omega.cse.unsw.edu.au>
+
+Yannis Haralambous and John Plaice are the authors of Omega typesetting
+system, <http://omega.enstb.org/>. Omega is an extension of TeX.
+Its first release, aims primarily at improving TeX's multilingual abilities.
+In Omega all characters and pointers into data-structures are 16-bit wide,
+instead of 8-bit, thereby eliminating many of the trivial limitations of TeX.
+Omega also allows multiple input and output character sets, and uses
+programmable filters to translate from one encoding to another, to perform
+contextual analysis, etc. Internally, Omega uses the universal 16-bit Unicode
+standard character set, based on ISO-10646. These improvements not only make
+it a lot easier for TeX users to cope with multiple or complex languages,
+like Arabic, Indic, Khmer, Chinese, Japanese or Korean, in one document, but
+will also form the basis for future developments in other areas, such as
+native color support and hypertext features. ... Fonts for UT1 (omlgc family)
+and UT2 (omah family) are under development: these fonts are in PostScript
+format and visually close to Times and Helvetica font families. 
+Omega fonts are available subject to GPL
+
+	Latin Extended-B                        (U+0180-U+024F)
+	IPA Extensions				(U+0250-U+02AF)
+	Greek					(U+0370-U+03FF)
+	Armenian				(U+0530-U+058F)
+	Hebrew					(U+0590-U+05FF)
+	Arabic					(U+0600-U+06FF)
+	Currency Symbols			(U+20A0-U+20CF)
+	Arabic Presentation Forms-A		(U+FB50-U+FDFF)
+	Arabic Presentation Forms-B		(U+FE70-U+FEFF)
+
+Current info: <http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=omega>
+
+* Valek Filippov <frob AT df.ru>
+
+Valek Filippov added Cyrillic glyphs and composite Latin Extended A to
+the whole set of the abovementioned URW set of 35 PostScript core fonts,
+<ftp://ftp.gnome.ru/fonts/>.  The fonts are available under GPL.
+(The Cyrillic range was since replaced by another font.)
+
+	Latin Extended-A                        (U+0100-U+017F)
+
+
+* Wadalab Kanji Comittee
+
+Between April 1990 and March 1992, Wadalab Kanji Comittee put together a
+series of scalable font files with Japanese scripts, in four forms:
+Sai Micho, Chu Mincho, Cho Kaku and Saimaru.
+The font files are written in custom file format, while tools for conversion
+into Metafont and PostScript Type 1 are also supplied. The Wadalab Kanji
+Comittee was later dismissed. The resulting files were once found on the FTP
+server of the Department of Mathematical Engineering and Information Physics,
+Faculty of Engineering, University of Tokyo.  Some of these are available at
+<http://www.ctan.org/tex-archive/fonts/wadalab>
+
+	Hiragana				(U+3040-U+309F)
+	Katakana				(U+30A0-U+30FF)
+
+
+* Young U. Ryu <ryoung AT utdallas.edu>
+
+Young Ryu is the author of Txfonts, a set of mathematical symbols
+designed to accompany text typeset in Times or its variants. In the
+documentation, Young adresses the design of mathematical symbols: "The
+Adobe Times fonts are thicker than the CM fonts. Designing math fonts
+for Times based on the rule thickness of Times = , , + , / , < ,
+etc. would result in too thick math symbols, in my opinion. In the TX
+fonts, these glyphs are thinner than those of original Times
+fonts. That is, the rule thickness of these glyphs is around 85% of
+that of the Times fonts, but still thicker than that of the CM fonts."
+TX fonts are are distributed under the GNU public license (GPL). 
+<http://www.ctan.org/tex-archive/fonts/txfonts/>.
+
+	Arrows					(U+2190-U+21FF)
+	Mathematical Symbols			(U+2200-U+22FF)
+
+
+* Angelo Haritsis <ah AT computer.org>
+
+Angelo Haritsis has compiled a set of Greek Type 1 fonts, once available as
+as a tarball named greekXfonts-Type1-1.1.tgz.
+The glyphs from this source have been used to compose Greek glyphs in
+FreeSans and FreeMono.
+
+Angelo's licence says: "You can enjoy free use of these fonts for
+educational or commercial purposes.  All derived works should include
+this paragraph.  If you want to change something please let me have
+your changes (via email) so that they can go into the next
+version. You can also send comments etc to the above address."
+
+	Greek					(U+0370-U+03FF)
+
+
+* Yannis Haralambous and Virach Sornlertlamvanich
+
+In 1999, Yannis Haralambous and Virach Sornlertlamvanich made a set of
+glyphs covering the Thai national standard Nf3, in both upright and
+slanted shape. The collection of glyphs have been made part of GNU
+intlfonts 1.2 package and is available under the GPL at
+<ftp://ftp.gnu.org/pub/gnu/intlfonts/>.
+
+	Thai					(U+0E00-U+0E7F)
+
+* Shaheed R. Haque <srhaque AT iee.org>
+
+Shaheed Haque has developed a basic set of basic Bengali glyphs
+(without ligatures), using ISO10646 encoding. They are available under
+the XFree86 license at <http://www.btinternet.com/~shaheedhaque/>.
+
+Copyright (C) 2001 S.R.Haque <srhaque AT iee.org>.  All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL S.R.HAQUE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of S.R.Haque shall not be
+used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from
+S.R.Haque.
+
+	Bengali					(U+0980-U+09FF)
+
+
+* Sam Stepanyan <sam AT arminco.com>
+
+Sam Stepanyan created a set of Armenian sans serif glyphs visually
+compatible with Helvetica or Arial. Available on
+<http://www.editum.com.ar/mashtots/html/fonts/ara.tar.gz>. On
+2002-01-24, Sam writes: "Arial Armenian font is free for
+non-commercial use, so it is OK to use under GPL license."
+
+Armenian				(U+0530-U+058F)
+
+
+* Mohamed Ishan <>
+
+Mohamed Ishan started the Thaana Unicode Project and among other things
+created a couple of Thaana fonts, available under FDL or BDF license.
+
+	Thaana					(U+0780-U+07BF)
+
+
+* Sushant Kumar Dash <sushant AT writeme.com> (*)
+
+Sushant Dash has created a font in his mother tongue, Oriya. As he
+states on his web page <http://sushantdash.tripod.com/>:
+"Please feel free to foreword this mail to your Oriya friends. No
+copyright law is applied for this font. It is totally free!!! Feel
+free to modify this using any font editing tools. This is designed for
+people like me, who are away from Orissa and want to write letters
+home using Computers, but suffer due to unavailability of Oriya
+fonts.(Or the cost of the available packages are too much)."
+
+	Oriya					(U+0B00-U+0B7F)
+
+
+* Harsh Kumar <harshkumar AT vsnl.com>
+
+Harsh Kumar has started BharatBhasha <http://www.bharatbhasha.net/> -
+an effort to provide "FREE software, Tutorial, Source Codes
+etc. available for working in Hindi, Marathi, Gujarati, Gurmukhi and
+Bangla. You can type text, write Web pages or develop Indian Languages
+Applications on Windows and on Linux. We also offer FREE help to
+users, enthusiasts and software developers for their work in Indian
+languages."
+
+	Devanagari				(U+0900-U+097F)
+	Bengali					(U+0980-U+09FF)
+	Gurmukhi				(U+0A00-U+0A7F)
+	Gujarati				(U+0A80-U+0AFF)
+
+
+* Prasad A. Chodavarapu <chprasad AT hotmail.com>
+
+Prasad A. Chodavarapu created Tikkana, a Telugu font available in Type
+1 and TrueType format on <http://chaitanya.bhaavana.net/fonts/>. 
+Tikkana exceeds the Unicode Telugu range with some composite glyphs.
+Available under the GNU General Public License.
+
+	Telugu					(U+0C00-U+0C7F)
+
+
+* Frans Velthuis <velthuis AT rc.rug.nl> and Anshuman Pandey
+  <apandey AT u.washington.edu>
+
+In 1991, Frans Velthuis from the Groningen University, The Netherlands,
+released a Devanagari font as Metafont source, available under the terms of
+GNU GPL. Later, Anshuman Pandey from the Washington University, Seattle, USA,
+took over the maintenance of font.  Zdeněk Wagner has provided a huge amount
+of expert advice regarding the implementation of the font in FreeSerif.
+Fonts can be found on CTAN,
+<ftp://ftp.dante.de/tex-archive/language/devanagari/>.
+
+	Devanagari				(U+0900-U+097F)
+
+
+* Hardip Singh Pannu <HSPannu AT aol.com>
+
+In 1991, Hardip Singh Pannu has created a free Gurmukhi TrueType font,
+available as regular, bold, oblique and bold oblique form. Its license
+says "Please remember that these fonts are copyrighted (by me) and are
+for non-profit use only." 
+
+	Gurmukhi				(U+0A00-U+0A7F)
+
+
+* Jeroen Hellingman <jehe AT kabelfoon.nl>
+
+Jeroen Hellingman created a set of Malayalam metafonts in 1994, and a
+set of Oriya metafonts in 1996. Malayalam fonts were created as
+uniform stroke only, while Oriya metafonts exist in both uniform and
+modulated stroke. From private communication: "It is my intention to
+release the fonts under GPL, but not all copies around have this
+notice on them." Metafonts can be found on CTAN,
+<ftp://ftp.dante.de/tex-archive/language/oriya/> and
+<ftp://ftp.dante.de/tex-archive/language/malayalam/>.
+
+	Oriya					(U+0B00-U+0B7F)
+	Malayalam				(U+0D00-U+0D7F)
+
+
+* Thomas Ridgeway <> (*)
+
+Thomas Ridgeway, then at the Humanities And Arts Computing Center,
+Washington University, Seattle, USA, (now defunct), created a Tamil
+metafont in 1990. Anshuman Pandey from the same university took over
+the maintenance of font. Fonts can be found at CTAN,
+<ftp://ftp.dante.de/tex-archive/language/tamil/wntamil/>.
+
+	Tamil					(U+0B80-U+0BFF)
+
+
+* Berhanu Beyene <1beyene AT informatik.uni-hamburg.de>,
+  Prof. Dr. Manfred Kudlek <kudlek AT informatik.uni-hamburg.de>, Olaf
+  Kummer <kummer AT informatik.uni-hamburg.de>, and Jochen Metzinger <?>
+
+Beyene, Kudlek, Kummer and Metzinger from the Theoretical Foundations
+of Computer Science, University of Hamburg, prepared a set of Ethiopic
+metafonts, found on
+<ftp://ftp.dante.de/tex-archive/language/ethiopia/ethiop/>. They also
+maintain home page on the Ethiopic font project,
+<http://www.informatik.uni-hamburg.de/TGI/mitarbeiter/wimis/kummer/ethiop_eng.html>,
+and can be reached at <ethiop AT informatik.uni-hamburg.de>. The current
+version of fonts is 0.7 (1998), and they are released under GNU GPL. I
+converted the fonts to Type 1 format using Péter Szabó's TeXtrace-A
+program <http://www.inf.bme.hu/~pts/textrace/> and removed some
+redundant control points with PfaEdit.
+
+	Ethiopic				(U+1200-U+137F)
+
+
+* Maxim Iorsh <iorsh AT users.sourceforge.net>
+
+In 2002, Maxim Iorsh started the Culmus project, aiming at providing
+Hebrew-speaking Linux and Unix community with a basic collection of
+Hebrew fonts for X Windows. The fonts are visually compatible with
+URW++ Century Schoolbook L, URW++ Nimbus Sans L and URW++ Nimbus Mono
+L families, respectively, and are released under GNU GPL license. See
+also <http://culmus.sourceforge.net/>.
+
+	Hebrew					(U+0590-U+05FF)
+
+
+* Panayotis Katsaloulis <panayotis AT panayotis.com>
+
+Panayotis Katsaloulis helped fixing Greek accents in the Greek
+Extended area.
+
+	Greek Extended				(U+1F00-U+1FFF)
+
+
+* Vyacheslav Dikonov <sdiconov AT mail.ru>
+
+Vyacheslav Dikonov made a Braille unicode font that could be merged
+with the UCS fonts to fill the 2800-28FF range completely. (uniform
+scaling is possible to adapt it to any cell size). He also contributed
+a free syriac font, whose glyphs (about half of them) are borrowed
+from the "Carlo Ator" font by Tim Erickson.
+Vyacheslav also filled in a few missing
+spots in the U+2000-U+27FF area, e.g. the box drawing section, sets of
+subscript and superscript digits and capital Roman numbers.
+
+	Syriac					(U+0700-U+074A)
+	Box Drawing				(U+2500-U+257F)
+	Braille					(U+2800-U+28FF)
+
+* Tim Erickson
+
+Is the author of several Eurasian fonts, including "Carlo Ator".
+He has given his written permission for glyphs from this font to be
+included in FreeFont.
+	Syriac					(U+0700-U+074A)
+
+
+* M.S. Sridhar <mssridhar AT vsnl.com>
+
+M/S Cyberscape Multimedia Limited, Mumbai, developers of Akruti
+Software for Indian Languages (http://www.akruti.com/), have released
+a set of TTF fonts for nine Indian scripts (Devanagari, Gujarati,
+Telugu, Tamil, Malayalam, Kannada, Bengali, Oriya, and Gurumukhi)
+under the GNU General Public License (GPL). You can download the fonts
+from the Free Software Foundation of India WWW site
+(http://www.gnu.org.in/akruti-fonts/) or from the Akruti website.
+
+For any further information or assistance regarding these fonts,
+please contact mssridhar AT vsnl.com.
+
+	Devanagari				(U+0900-U+097F)
+	Bengali					(U+0980-U+09FF)
+	Gurmukhi				(U+0A00-U+0A7F)
+	Gujarati				(U+0A80-U+0AFF)
+	Oriya					(U+0B00-U+0B7F)
+	Tamil					(U+0B80-U+0BFF)
+	Telugu					(U+0C00-U+0C7F)
+	Kannada					(U+0C80-U+0CFF)	
+	Malayalam				(U+0D00-U+0D7F)
+
+
+* DMS Electronics, The Sri Lanka Tipitaka Project, and Noah Levitt
+  <nlevitt AT columbia.edu>
+
+Noah Levitt found out that the Sinhalese fonts available on the site
+<http://www.metta.lk/fonts/> are released under GNU GPL, or,
+precisely, "Public Domain under GNU Licence
 Produced by DMS
+Electronics for The Sri Lanka Tipitaka Project" (taken from the font
+comment), and took the effort of recoding the font to Unicode.
+
+These glyphs were later replaced by those from the LKLUG font
+<http://www.lug.lk/fonts/lklug>
+
+Finally the range was completely replaced by glyphs from the sinh TeX
+font, with much help and advice from Harshula Jayasuriya.
+
+	Sinhala					(U+0D80-U+0DFF)
+       
+
+* Daniel Shurovich Chirkov <dansh AT chirkov.com>
+
+Dan Chirkov updated the FreeSerif font with the missing Cyrillic
+glyphs needed for conformance to Unicode 3.2. The effort is part of
+the Slavjanskij package for Mac OS X,
+<http://www.versiontracker.com/dyn/moreinfo/macosx/18680>.
+
+	Cyrillic				(U+0400-U+04FF)
+
+
+* Denis Jacquerye <moyogo AT gmail.com>
+
+Denis Jacquerye added new glyphs and corrected existing ones in the
+Latin Extended-B and IPA Extensions ranges.
+
+	Latin Extended-B                        (U+0180-U+024F)
+	IPA Extensions				(U+0250-U+02AF)
+
+
+* K.H. Hussain <hussain AT kfri.org> and R. Chitrajan
+
+`Rachana' in Malayalam means `to write', `to create'. Rachana Akshara Vedi,
+a team of socially committed information technology professionals and
+philologists, has applied developments in computer technology and desktop
+publishing to resurrect the Malayalam language from the disorder,
+fragmentation and degeneration it had suffered since the attempt to adapt
+the Malayalam script for using with a regular mechanical typewriter, which
+took place in 1967-69. K.H. Hussein at the Kerala Forest Research Institute
+has released "Rachana Normal" fonts with approximately 900 glyphs required
+to typeset traditional Malayalam. R. Chitrajan apparently encoded the
+glyphs in the OpenType table.
+
+In 2008, the Malayalam ranges in FreeSerif were updated under the advise 
+and supervision of Hiran Venugopalan of Swathanthra Malayalam Computing,
+to reflect the revised edition Rachana_04.
+
+	Malayalam				(U+0D00-U+0D7F)
+
+
+* Solaiman Karim <solaiman AT ekushey.org>
+
+	Bengali					(U+0980-U+09FF)
+
+Solaiman Karim has developed several OpenType Bangla fonts and
+released them under GNU GPL on <http://www.ekushey.org>.
+
+
+* Sonali Sonania <sonalisonania AT gmail.com> and Monika Shah
+  <monikapatira AT gmail.com>
+
+	Devanagari				(U+0900-U+097F)
+	Gujarati				(U+0A80-U+0AFF)
+
+Glyphs were drawn by Cyberscape Multimedia Ltd., #101,Mahalakshmi
+Mansion 21st Main 22nd "A" Cross Banashankari 2nd stage Banglore
+560070, India. Converted to OTF by IndicTrans Team, Powai, Mumbai,
+lead by Prof. Jitendra Shah. Maintained by Monika Shah and Sonali
+Sonania of janabhaaratii Team, C-DAC, Mumbai. This font is released
+under GPL by Dr. Alka Irani and Prof Jitendra Shah, janabhaaratii
+Team, C-DAC, Mumabi. janabhaaratii is localisation project at C-DAC
+Mumbai (formerly National Centre for Software Technology); funded by
+TDIL, Govt. of India. Contact:monika_shah AT lycos.com,
+sonalisonania AT yahoo.com, jitendras AT vsnl.com, alka AT ncst.ernet.in.
+website: www.janabhaaratii.org.in.
+
+
+* Pravin Satpute <pravin.d.s AT gmail.com>, Bageshri Salvi
+  <sbagrshri AT yahoo.co.in>, Rahul Bhalerao <b.rahul.pm AT
+  gmail.com> and Sandeep Shedmake <sandeep.shedmake AT gmail.com>
+
+	Devanagari				(U+0900-U+097F)
+	Gujarati				(U+0A80-U+0AFF)
+	Oriya					(U+0B00-U+0B7F)
+	Malayalam				(U+0D00-U+0D7F)
+	Tamil					(U+0B80-U+0BFF)
+
+In December 2005 the team at www.gnowledge.org released a set of two
+Unicode pan-Indic fonts: "Samyak" and "Samyak Sans". "Samyak" font
+belongs to serif style and is an original work of the team; "Samyak
+Sans" font belongs to sans serif style and is actually a compilation
+of already released Indic fonts (Gargi, Padma, Mukti, Utkal, Akruti
+and ThendralUni). Both fonts are based on Unicode standard. 
+The fonts are now hosted at Sarovar.org:
+http://sarovar.org/projects/samyak/
+
+
+* Kulbir Singh Thind
+
+	Gurmukhi				(U+0A00-U+0A7F)
+
+Dr. Kulbir Singh Thind designed a set of Gurmukhi Unicode fonts,
+AnmolUni and AnmolUni-Bold, which are available under the terms of GNU
+Generel Public License from the Punjabu Computing Resource Center,
+http://guca.sourceforge.net/typography/fonts/anmoluni/.
+
+
+* Gia Shervashidze <giasher AT telenet.ge>
+
+        Georgian				(U+10A0-U+10FF)
+
+Starting in mid-1990s, Gia Shervashidze designed many
+Unicode-compliant Georgian fonts: Times New Roman Georgian, Arial
+Georgian, Courier New Georgian. His work on Georgian localization can
+be reached at http://www.gia.ge/.
+
+
+* Primož Peterlin <primoz.peterlin AT biofiz.mf.uni-lj.si>
+
+Primož Peterlin filled in missing glyphs here and there (e.g. Latin
+Extended-B and IPA Extensions ranges in the FreeMono familiy), and
+created the following UCS blocks:
+
+	Latin Extended-B                        (U+0180-U+024F)
+	IPA Extensions				(U+0250-U+02AF)
+	Arrows					(U+2190-U+21FF)
+	Box Drawing				(U+2500-U+257F)
+	Block Elements				(U+2580-U+259F)
+	Geometrical Shapes			(U+25A0-U+25FF)
+
+* Mark Williamson
+
+Made the MPH 2 Damase font, from which 
+	Hanunóo                                 (U+1720-U+173F)
+	Buginese                                (U+1A00-U+1A1F)
+	Tai Le                                  (U+1950-U+197F)
+	Ugaritic                                (U+10380-U+1039F)
+	Old Persian                             (U+103A0-U+103DF)
+
+* Jacob Poon
+
+Submitted a very thorough survey of glyph problems and other suggestions.
+
+* Alexey Kryukov
+
+Made the TemporaLCGUni fonts, based on the URW++ fonts, from which at one 
+point FreeSerif Cyrillic, and some of the Greek, was drawn.  He also provided
+valuable direction about Cyrillic and Greek typesetting.
+
+	Cyrillic				(U+0400-U+04FF)
+
+* George Douros
+
+The creator of several fonts focusing on ancient scripts and symbols.
+Many of the glyphs are created by making outlines from scanned images
+of ancient sources.
+
+	Aegean:   Phoenecian
+	Analecta: Gothic                        (U+10330-U+1034F)
+	Musical:  Byzantine & Western                  
+	Unicode:  many Miscellaneous Symbols, Miscellaneous Technical, OCR,
+	          supplemental Symbols, and Mathematical Alphanumeric symbols,
+		  Mah Jong, and the outline of the Domino.
+
+* Daniel Johnson
+
+Created by hand a Cherokee range specially for FreeFont to be "in line with
+the classic Cherokee typefaces used in 19th century printing", but also to
+fit well with ranges previously in FreeFont.  Then he made Unified Canadian
+Syllabics in Sans, and a Cherokee and Kayah Li in Mono!  And never to be
+outdone by himself, then did UCAS Extended and Osmanya....  What next?
+
+	Armenian (serif)                        (U+0530-U+058F)
+	Cherokee                                (U+13A0-U+13FF)
+	Unified Canadian Aboriginal Syllabics   (U+1400-U+167F)
+	UCAS Extended                           (U+18B0-U+18F5)
+	Kayah Li                                (U+A900-U+A92F)
+	Tifinagh                                (U+2D30-U+2D7F)
+	Vai                                     (U+A500-U+A62B)
+	Latin Extended-D (Mayanist letters)     (U+A720-U+A7FF)
+	Osmanya                                 (U+10480-U+104a7)
+
+* Yannis Haralambous and Wellcome Institute
+
+In 1994, The Wellcome Library
+  The Wellcome Institute for the History of Medicine
+  183 Euston Road, London NW1 2BE, England.
+commissioned Mr. Haralambous to produce a Sinhalese font for them.
+
+We have received 03/09 official notice from Robert Kiley, Head of e-Strategy
+for the Wellcome Library, that Yannis' font could be included in GNU
+FreeFont under its GNU license.
+
+Thanks to Dominik Wujastyk, for providing us with feedback and contacts
+to repsonsible people at the Trust.
+
+	Sinhala					(U+0D80-U+0DFF)
+
+* The Sinhala font project http://sinhala.sourceforge.net/
+
+The Sinhala font project has taken the glyphs from Yannis Haralambous'
+Sinhala font, to produce a Unicode TrueType font, LKLUG.  These glyphs
+were for a while included in FreeFont.
+
+	Sinhala					(U+0D80-U+0DFF)
+
+* Steve White <stevan.white AT googlemail.com>
+
+Filled in a lot of missing characters, got some font features working,
+left fingerprints almost everywhere, and is responsible for these blocks:
+
+	Runic                                   (U+16A0-U+16F0)
+	Glagolitic                              (U+2C00-U+2C5F)
+	Coptic                                  (U+2C80-U+2CFF)
+	Old Italic                              (U+10300-U+1032F)
+(The design of Runic is based roughly on one originally submitted by 
+Vyacheslav Dikonov)
+
+
+* Pavel Skrylev is responsible for
+	Cyrillic Extended-A                     (U+2DEO-U+2DFF)
+  as well as many of the additions to
+	Cyrillic Extended-B                     (U+A640-U+A65F)
+
+
+* Masoud Pourmoosa corrected several letters in Arabic for Persian:
+	Arabic					(U+0600-U+06FF)
+
+Notes:
+
+*: The glyph collection looks license-compatible, but its author has
+   not yet replied and agreed on their work being used in part of
+   this glyph collection.
+
+--------------------------------------------------------------------------
+$Id: CREDITS,v 1.28 2010/09/11 13:24:11 Stevan_White Exp $
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/ChangeLog b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/ChangeLog
new file mode 100644
index 00000000..6f348953
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/ChangeLog
@@ -0,0 +1,14707 @@
+2012-04-22 16:18 +0000 [r2239-2240]  Stevan_White:
+
+	* INSTALL: Improved info on Debian install.
+
+	* notes/troubleshooting.txt: More info on the blurry
+	  text in Windows issue.
+
+2012-04-22 11:43 +0000 [r2238]  Stevan_White:
+
+	* tools/report/OpenType/UnicodeRanges.py:
+	  Regularized abbreviatons of supplement, extended
+
+2012-04-22 11:06 +0000 [r2237]  Stevan_White:
+
+	* FreeSerifBold.sfd: Arabic: added 3 graphical
+	  marks to complete the range.
+
+2012-04-22 10:51 +0000 [r2236]  Stevan_White:
+
+	* FreeSerif.sfd: Fixed problems turned up by
+	  tests. Somehow alefmaksurainitialarabic hadn't been re-named. Two
+	  new Combining Diacritics hadn't been given Unicode.
+
+2012-04-21 17:11 +0000 [r2235]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBoldOblique.sfd: Revision of German
+	  TTF Names.
+
+2012-04-21 16:52 +0000 [r2231-2234]  Stevan_White:
+
+	* INSTALL: More info for Windows.
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd: PS Private: put in extra
+	  blues line, adjusted to numerals.
+
+	* tools/report/OpenType/UnicodeRanges.py: Corrected
+	  one range
+
+	* tools/generate/TrueType,
+	  tools/generate/WOFF,
+	  tools/generate/OpenType,
+	  tools/generate/MacTT: all: removed launch line
+	  WOFF: made quadratic, and autoinstructed TrueType: turned off
+	  saving of hints
+
+2012-04-21 11:17 +0000 [r2230]  Stevan_White:
+
+	* FreeSerifBold.sfd: Vietnamese: small
+	  adjustment of accents
+
+2012-04-20 12:57 +0000 [r2228-2229]  Stevan_White:
+
+	* AUTHORS, CREDITS: Various
+	  corrections, doing the best I could with stale URLs.
+
+	* ChangeLog: Some typos
+
+2012-04-20 11:06 +0000 [r2227]  Stevan_White:
+
+	* ChangeLog: Summary of changes since late last
+	  year.
+
+2012-04-19 21:07 +0000 [r2226]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: re-named
+	  alefmaksurainitialarabic and alefmaksuramedialarabic as
+	  alefmaksurainitialarabic and alefmaksuramedialarabic to avoid a
+	  confusing FontForge warning. This was discussed on the FontForge
+	  list, and a partial remedy was agreed upon.
+
+2012-04-19 21:02 +0000 [r2225]  Stevan_White:
+
+	* FreeSerif.sfd: GPOS table: removed the
+	  Cyrillic kerns with non-Unicode "alternative" Cyrillic, because
+	  FontForge warns that Windows apps will have *problems* with
+	  mappings that aren't Unicode-Unicode. Most of the kerns were
+	  rather small anyway.
+
+2012-04-19 20:39 +0000 [r2224]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoBoldOblique.sfd: TTF Names: Fixes bug
+	  #36232: Windows 7 strange bug with installation/font control
+	  panel. Also improved French names. (Thanks to Emmanuel Vallois)
+
+2012-04-18 07:31 +0000 [r2223]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Devanagari: Regularized
+	  overlap of horizontal. Cleaned up numerous other letters.
+
+2012-04-17 07:37 +0000 [r2222]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Currency Symbols:
+	  Added/corrected/adjusted Indian Rupee.
+
+2012-04-16 22:45 +0000 [r2221]  Stevan_White:
+
+	* notes/maintenance.txt,
+	  notes/usage.txt,
+	  notes/troubleshooting.txt,
+	  notes/webfont_guidelines.txt,
+	  notes/features.txt: Added section about where
+	  letters are to usage.txt Made sure svn properties are set for
+	  others.
+
+2012-04-16 22:26 +0000 [r2220]  Stevan_White:
+
+	* README: Updated information about file types
+
+2012-04-16 22:17 +0000 [r2219]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: resolves bug
+	  #36195: Arabic semicolon doesn't match with others
+
+2012-04-15 23:16 +0000 [r2218]  Stevan_White:
+
+	* FreeSerifBold.sfd: Arabic: this was meant to
+	  be in previous commit.
+
+2012-04-15 18:30 +0000 [r2217]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: Remedies bug
+	  #36196: Arabic ba and teh isolated and final. Also applied
+	  similar alteration to some similar letters. Bold: there were some
+	  missing ligatures of superscript marks.
+
+2012-04-15 17:52 +0000 [r2216]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: Remedies bug
+	  #36198: dots for Arabic letter jeh Also revised placement dots
+	  over some other letters.
+
+2012-04-15 13:24 +0000 [r2215]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: remedies bug #36191,
+	  Arabic character DAD final form
+
+2012-04-15 12:23 +0000 [r2214]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: toward bug #36189:
+	  discrepancy in different forms of ک and گ
+
+2012-04-15 12:02 +0000 [r2213]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: remedies bug
+	  #36190, Arabic question mark too small
+
+2012-04-15 11:16 +0000 [r2212]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Devanagari: anchors for
+	  recently added letters. Thanks, Zdenek.
+
+2012-04-15 10:44 +0000 [r2211]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: adjusted height of
+	  dots on a few glyphs
+
+2012-04-15 10:31 +0000 [r2210]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: remedies bug
+	  #36181: initial and final form of heh (U+0647)
+	  https://savannah.gnu.org/bugs/?36181
+
+2012-04-14 13:35 +0000 [r2209]  Stevan_White:
+
+	* tools/test/ranges/Arabic/arabic_test.py (added),
+	  tools/test/ranges/Arabic/unicode_joining.py
+	  (added),
+	  tools/test/ranges/Arabic/generate_arabic_shaping.py
+	  (added), tools/test/ranges (added),
+	  tools/test/ranges/Arabic (added): Scripts to
+	  generate comprehensive Arabic tests in HTML, courtesy of Emmanuel
+	  Vallois.
+
+2012-04-13 09:56 +0000 [r2208]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSerif.sfd: Devanagari: serif: corrected
+	  OpenType glyph type of ru, ruu ligatures to be base ligatures,
+	  not marks. sans, sans bold: added ka-ra "vatu" ligature at
+	  Zdenek's suggestion. sans: removed empty lookup.
+
+2012-04-10 20:33 +0000 [r2207]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: several mark
+	  placement issues, pointed out by Zdenek.
+
+2012-04-09 21:58 +0000 [r2206]  Stevan_White:
+
+	* sfd/Makefile, FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: made Arabic and
+	  Persion digits 500EM wide.
+
+2012-04-09 18:35 +0000 [r2205]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd: Arabic: messed with digits.
+	  Overall, had been building with GIT version of FontForge. found
+	  that older distro version 22-Feb-2011-ML shows warning dialogs
+	  Internal Error: EITOfNextMajor failed! on Clockwise Test
+	  (cleverly omitting the crucial info). Turns out, just rounding to
+	  int on certain characters fixes it.
+
+2012-04-09 11:34 +0000 [r2204]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: More kerning: tried
+	  to synch up normal and bold. Altered letters especially for
+	  Seraiki. Lots of fiddling with heh and heh-doachashmee. Seems the
+	  letter transforms very differently for different languages. This
+	  is not there yet.
+
+2012-04-08 12:53 +0000 [r2203]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: made 'ccmp' table
+	  and some combining marks to handle cases of letters that don't
+	  have positional forms in Unicode. Only did a few -- more are
+	  needed. Lots of kerning. Fiddled with shapes of several letters.
+
+2012-04-07 19:21 +0000 [r2202]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: more alterations toward
+	  bug #36115: Various little problems with Arabic/Persian glyphs
+	  More kerning. Some forms from Pashto are missing.
+
+2012-04-06 17:45 +0000 [r2201]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: made medial form of
+	  loop-letters more distinctive from initial forms. (toward bug bug
+	  #36115: Various little problems with Arabic/Persian glyphs)
+
+2012-04-05 16:43 +0000 [r2200]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: improvements to
+	  digits (Persian primarily) based on patch from Masoud Pourmoosa.
+
+2012-04-04 17:10 +0000 [r2199]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic; (for Farsi) toward
+	  bug 34700: made farsi yeh final more like the Unicode samples.
+	  https://savannah.gnu.org/bugs/?34700 Arabic/Persian in FreeSerif:
+	  ending "Yeh" is annoying
+
+2012-04-04 14:34 +0000 [r2198]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Various attempts to make
+	  web fonts work/look better. Sans Devanagari: made relation
+	  between overhang and horizontal more consistent for half-forms.
+	  Corrected metrics in FreeSansOblique. Some kerning overall, after
+	  looking again at sample pages
+
+2012-04-02 13:30 +0000 [r2197]  Stevan_White:
+
+	* FreeSansBold.sfd: Devanagari: toward more
+	  consistent spacing, especialy of half-forms
+
+2012-04-02 12:57 +0000 [r2196]  Stevan_White:
+
+	* FreeSans.sfd: Devanagri: better connection of
+	  horizontals, especially half forms.
+
+2012-04-01 13:45 +0000 [r2195]  Stevan_White:
+
+	* FreeSerif.sfd: Combining Diacritical Marks
+	  Supplement: made glyphs for large part of range. Latin
+	  Extended-D: made Latin con and US glyphs.
+
+2012-03-30 13:34 +0000 [r2193-2194]  Stevan_White:
+
+	* tools/generate/OpenType: Turn on PS rounding for
+	  Type1 glyphs
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoBoldOblique.sfd: Pointwise cleanup
+	  toward validation with PS rounding turned on for OpenType.
+
+2012-03-30 11:16 +0000 [r2192]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: bold, italic,
+	  re-considered vowel naming to avoid FF warnings. Latin: a bit of
+	  kerning
+
+2012-03-29 20:39 +0000 [r2191]  Stevan_White:
+
+	* notes/troubleshooting.txt: corrections about
+	  recent changes
+
+2012-03-28 19:59 +0000 [r2190]  Stevan_White:
+
+	* notes/troubleshooting.txt: Remarks about
+	  LibreOffice's challenges with OpenType features.
+
+2012-03-28 19:38 +0000 [r2189]  Stevan_White:
+
+	* notes/README-downloads.txt: brought up to date,
+	  regarding perferred format in various systems, and the WOFF files
+
+2012-03-28 19:31 +0000 [r2185-2188]  Stevan_White:
+
+	* AUTHORS, INSTALL,
+	  COPYING: changed SVN keywords
+
+	* ChangeLog: corrections, addition
+
+	* CREDITS: correctons, additions
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Devanagari: simplified dist
+	  lookup criteria
+
+2012-03-28 19:24 +0000 [r2184]  Stevan_White:
+
+	* tools/report/ligatureLookups.py: better error
+	  handling, doc
+
+2012-03-28 19:20 +0000 [r2183]  Stevan_White:
+
+	* FreeSerifBold.sfd: Devanagari: cleaned up a
+	  bunch of excess GPOS anchors; tidied lookups.
+
+2012-03-28 09:17 +0000 [r2180-2182]  Stevan_White:
+
+	* Makefile: insert troubleshooting doc
+
+	* notes/troubleshooting.txt (added): A doc
+	  explaining how to troubleshoot font problems.
+
+	* notes/usage.txt: Tidied, more explanation of the
+	  doc as a whole.
+
+2012-03-26 10:43 +0000 [r2179]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: much experimenting
+	  with lookups to center western punctuation between words
+	  (resulted in several bug reports on firefox and xetex).
+	  Currently, uses GSUB 'locl'. GPOS are too problematic in apps to
+	  use.
+
+2012-03-25 09:49 +0000 [r2178]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Devanagari: added
+	  positioning for western punctuation
+
+2012-03-25 09:40 +0000 [r2177]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari, Bengali: small
+	  tweeks to dots
+
+2012-03-24 21:34 +0000 [r2176]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoBoldOblique.sfd: TTF Names: Hindi
+	  hyphenated term
+
+2012-03-24 10:20 +0000 [r2175]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: regarding
+	  horizontal spacing, on advice of Zdenek. o, au -- stems were too
+	  close. danda, dbldanda: much too near preceding word. Made so
+	  that danda-space would space the mark evenly between the words.
+	  Made lookups for similarly-spaced question and exclamation marks.
+	  Kerning (or dist?): Experiments -- problems include: Firefox
+	  doesn't seem to support "dist". Xetex doesn't turn kerning on by
+	  default. Fontforge complains Windows doesn't like to kern
+	  auxiliaries with Unicode ranges. Nonetheless, it does pack words
+	  rather tighter. My own advice: made ra glyph more narrow. It was
+	  the worst, spacing wise, on the un-kerned page. Oriya: made
+	  similar spacing for its danda.
+
+2012-03-23 12:56 +0000 [r2174]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: efforts to
+	  improve horizontal spacing, that Zdenek complains about. 1)
+	  medium: o, au vowels: stems too close 2) danda, dbldanda, should
+	  be widely separated from words, centred between them. 3) bold: on
+	  horizontal, bevels extend rather more than they should (reduced
+	  in Unicode and through first set of half marks in the
+	  auxiliaries... willl complete later.) 4) made special localized
+	  forms of question, exclamation mark.
+
+2012-03-22 23:25 +0000 [r2172-2173]  Stevan_White:
+
+	* tools/generate/TrueType,
+	  tools/generate/WOFF,
+	  tools/generate/OpenType: Set the encoding to
+	  UnicodeFull before build (a bit wasteful for faces with no high
+	  Unicode, but couldn't think of a better way.)
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd: More re-thinking of OS/2
+	  weights. In sans, again adjusted OS/2 Windows metrics to stop
+	  clipping. (I'm just sure this will mess up line spacing in
+	  OpenOffice, but didn't have time to check. Something has a bug.)
+
+2012-03-22 19:17 +0000 [r2171]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Font Info: filled out
+	  TTF Names Fullname for Hindi
+
+2012-03-22 19:00 +0000 [r2170]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Added Hindi term for
+	  Font Style in TTF Names (courtesy of Monika Shah)
+
+2012-03-22 18:49 +0000 [r2169]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: FontInfo:
+	  re-considered OS/2 and Panose weight descriptions
+
+2012-03-22 15:02 +0000 [r2168]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: Replaced a
+	  'pres' table that got zeroed by a crash. More adjustments to mark
+	  placement.
+
+2012-03-22 12:51 +0000 [r2167]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: Replaced lost
+	  'pres' lookup tables.
+
+2012-03-22 10:35 +0000 [r2166]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Overall: Several
+	  measures toward reducing warnings from Font Validator. In "roman"
+	  faces, change TTF Name: SubFamily to "Regular". (FontForge binds
+	  this to PSNames:Weight --? so changed that.) Experimenting with
+	  General:Name For Humans (Fiddled with Family Name too...but
+	  changed it back.) Changes to OS/2:Sub/Super Subscript Offset --
+	  made positive. Some fiddling with Panose info. Also: previously
+	  OS/2 Charsets missed 708, Arabic ASMO 708. (Bug in
+	  FontForge-patch reported.) In sans and mono oblique, bold, and
+	  boldoblique, added some math operators to fill an Apple codepage.
+	  Sinhala: FreeSerifBold -- implemented same change moving 'ccmp'
+	  to 'akhn' as in roman face. Has to do with bug in OpenOffice/ICU.
+
+2012-03-20 08:25 +0000 [r2165]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: OS/2 small tweeks:
+	  set "weight, width, slope only"
+
+2012-03-19 18:34 +0000 [r2164]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: OS/2 Charsets: made serif,
+	  serifbold, mono to support ASMO 708 MS Codepage for Arabic (small
+	  bug in FontForge) OS/2 Version: changed from Automatic to 3 for
+	  all, only to satisfy old MS Font Validator, which chokes on
+	  higher versions.
+
+2012-03-19 09:45 +0000 [r2163]  Stevan_White:
+
+	* FreeMono.sfd: correction-something went wrong
+	  with the encoding two commits ago. (I switched encoding from
+	  custom to BMP and back again.) This should encorporate the recent
+	  changes and fix the problem.
+
+2012-03-19 09:07 +0000 [r2162]  Stevan_White:
+
+	* tools/report/OpenType/UnicodeRanges.py: comments
+	  containing new Unicode ranges without ulUnicodeRange bits
+
+2012-03-19 08:41 +0000 [r2161]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: OS/2 version: set to
+	  3 (was "Automatic") mostly for MS Font Validator. Arabic
+	  Presentation Forms B: (regular) made lam-alif ligatures,
+	  completing range.
+
+2012-03-18 15:57 +0000 [r2160]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Devanagari: more toward
+	  positioning of marks.
+
+2012-03-18 15:09 +0000 [r2159]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Devanagari: resolved some
+	  dfficult cases reported by Zdenek. (esp. that esign and reph
+	  could come in either order.)
+
+2012-03-18 06:37 +0000 [r2158]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSerif.sfd: Devanagari: More toward proper
+	  mark placement.
+
+2012-03-16 17:39 +0000 [r2157]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: more issues
+	  regarding mark placement.
+
+2012-03-15 23:39 +0000 [r2156]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: toward fixing
+	  mark positioning problems Zdenek pointed out.
+
+2012-03-15 10:28 +0000 [r2155]  Stevan_White:
+
+	* FreeSerif.sfd: Latin: got i-ogonek-acute to
+	  remove dot over i again (for Navaho). Problem was evidently a
+	  DFLT{dflt} entry in lookup language tags.
+
+2012-03-15 10:03 +0000 [r2153-2154]  Stevan_White:
+
+	* FreeSans.sfd: Devanagari: fixes for some mark
+	  issues pointed out by Zdenek.
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: corrected
+	  longstanding problem that made stacked Vietnamese accents fail.
+	  Had to do with long list of languages filter of default ligature
+	  lookup, excluding Turkish, and rendering logic I don't
+	  understand. Devanagari: toward correcting marks stacked below
+	  rakaar.
+
+2012-03-13 16:29 +0000 [r2152]  Stevan_White:
+
+	* FreeSerif.sfd: Mathematical Alphanumeric
+	  Symbols (especially) named some characters
+
+2012-03-13 10:46 +0000 [r2151]  Stevan_White:
+
+	* FreeSerifBold.sfd: Devanagari: ha-rrvocalic
+	  and improved ha-rakaar, as in medium
+
+2012-03-12 21:59 +0000 [r2150]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Mathematical Operators:
+	  reduced horizontal spacing of complement operator
+
+2012-03-12 21:28 +0000 [r2149]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Mathematical Operators:
+	  re-thought dimensions of "complement" symbol (after seeing it in
+	  Dieudonné's analysis book)
+
+2012-03-12 18:49 +0000 [r2148]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Devanagari: various adjustments
+	  to marks. serif: added ha-llvocalic, rplaced ha_ra conjunct,
+	  positioned virama separately from fowels.
+
+2012-03-11 22:39 +0000 [r2147]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Bengali: adjustments to marks;
+	  GPOS tables to position them.
+
+2012-03-11 16:37 +0000 [r2146]  Stevan_White:
+
+	* FreeSansOblique.sfd: Bengali: fixed some
+	  horizontal spacing issues
+
+2012-03-11 00:56 +0000 [r2145]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSerif.sfd: Made to pass tests -- mostly
+	  little pointwise tweeks. One range of auxiliaries had wandered
+	  out of the Private Use area.
+
+2012-03-10 23:55 +0000 [r2144]  Stevan_White:
+
+	* FreeMonoOblique.sfd: Armenian: corrected width
+	  of one glyph
+
+2012-03-10 18:53 +0000 [r2143]  Stevan_White:
+
+	* FreeSans.sfd: Bengali: completed pointwise
+	  clean-up of auxiliaries. Found a couple more with quite wrong
+	  rignt bounds.
+
+2012-03-10 13:15 +0000 [r2142]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: OS/2 vertical metrics:
+	  another change of heart: made vertical metrics like other fonts I
+	  looked at, and tightened line spacing. Bengali: (sans) point-wise
+	  clean-up down to bn_l_dd_ra (before I pooped out) Fixed right
+	  bound of several auxiliaries, such as bn_p_ma, bn_m_p_la
+
+2012-03-09 19:04 +0000 [r2141]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Removed some unintended
+	  empty contours. Pointwise clean-up of points too close (but gave
+	  up on Bengali range.)
+
+2012-03-09 18:45 +0000 [r2139-2140]  Stevan_White:
+
+	* tools/generate/TrueType: Made splines quadratic
+
+	* FreeMonoOblique.sfd: Pointwise cleanup of
+	  "points too close" problems.
+
+2012-03-09 18:35 +0000 [r2138]  Stevan_White:
+
+	* FreeSerifBold.sfd: Removed an unintended empty
+	  contour
+
+2012-03-09 16:52 +0000 [r2137]  Stevan_White:
+
+	* tools/generate/TrueType,
+	  tools/generate/WOFF,
+	  tools/generate/OpenType,
+	  tools/generate/buildutils.py,
+	  tools/generate/MacTT: Updated copyrights
+
+2012-03-09 16:49 +0000 [r2136]  Stevan_White:
+
+	* sfd/Makefile: Made to properly report progress for
+	  OpenType target
+
+2012-03-09 16:08 +0000 [r2135]  Stevan_White:
+
+	* FreeSerif.sfd: Mahjong Tiles: The previous
+	  commit didn't quite do it. Sometimes, but starting the generate
+	  process from scratch, it still crashed. But this "circle" glyph
+	  was excessively elaborate anyway. Made it simpler, cleaned it up,
+	  and now the crash isn't happening.
+
+2012-03-09 13:12 +0000 [r2134]  Stevan_White:
+
+	* FreeSerif.sfd: Mahjong Tiles: work-around for
+	  FontForge crash, by use of references. Crash: Select All,
+	  AutoHint. Generate Fonts, OpenType Options, check Postscript
+	  Hints. Generate. segfault.
+
+2012-03-09 12:04 +0000 [r2133]  Stevan_White:
+
+	* FreeSerif.sfd: Mahjong Tiles: named the glyphs
+
+2012-03-09 01:17 +0000 [r2132]  Stevan_White:
+
+	* FreeSans.sfd: Corrected mixed reference and
+	  contour. Overall point-wise cleanup "points too close"
+
+2012-03-07 23:27 +0000 [r2131]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Font Info General:
+	  changed copyright 2011 to 2012 since no public release was made
+	  last year.
+
+2012-03-07 21:06 +0000 [r2130]  Stevan_White:
+
+	* Makefile: Source tarball now includes all build
+	  scripts etc.
+
+2012-03-07 14:50 +0000 [r2129]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: .notdef: made clearer
+	  that something is missing...
+
+2012-03-06 19:07 +0000 [r2128]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: mostly
+	  adjustments to mark placement.
+
+2012-03-06 11:22 +0000 [r2127]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Devanagari: various
+	  alterations toward ligatures as in Velthuis manual, and for
+	  legibility.
+
+2012-03-05 21:18 +0000 [r2126]  Stevan_White:
+
+	* FreeSansBold.sfd: Devanagari: made half-na a
+	  bit wider on Monika Shah's recommendation. Tweeked several other
+	  auxiliaries for legibility.
+
+2012-03-05 20:25 +0000 [r2125]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Devanagari: Several issues
+	  reported by Monika Shah, including rakaar being placed
+	  improperly, and some Sanskrit ligatures leaking into Hindi.
+
+2012-03-05 16:41 +0000 [r2124]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Devanagari: combined
+	  half-form issues, reported by Zdenek Wagner.
+
+2012-03-05 15:07 +0000 [r2123]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: Several
+	  alterations based on a report by Zdenek Wagner. Anusvara in
+	  conjunction with other above marks, u and uumatra in conjunction
+	  with ha and nuktas.
+
+2012-03-05 01:22 +0000 [r2122]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd: Bengali: Several
+	  ligatures with ba had lost the holes in their ba. (bn_k_ba, etc);
+	  also bn_asamib_r_ukaar. Copied holes from similar glyphs. A
+	  similar thing may have happend to a couple of other ligs
+	  (bn_ss_tta1, bn_ss_tt_ra1). I don't know how these should look,
+	  but they seem to be unused anyway.
+
+2012-03-04 18:24 +0000 [r2121]  Stevan_White:
+
+	* FreeSerifItalic.sfd: general clean-up of
+	  points too close. Bogged down on Bengali.
+
+2012-03-04 18:01 +0000 [r2120]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Currency Symbols: added
+	  Rupee to italic. general clean-up of points too close.
+
+2012-03-04 13:18 +0000 [r2119]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Gurmukhi: adjusted
+	  placement of dots. re-named tables and rounded to int in bold.
+
+2012-03-04 12:25 +0000 [r2118]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari Extended: completed
+	  range
+
+2012-03-04 11:25 +0000 [r2117]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoOblique.sfd: Armenian: added dhahma
+	  (and ran clear hints)
+
+2012-03-04 11:21 +0000 [r2116]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Armenian: added drahma
+
+2012-03-04 10:45 +0000 [r2115]  Stevan_White:
+
+	* FreeSerifBold.sfd: Devanagari: completed main
+	  Unicode range.
+
+2012-03-04 10:17 +0000 [r2114]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Gurmukhi: Added range in
+	  bold. Serif: Many point-wise cleanups, in Gurmukhi and other
+	  ranges.
+
+2012-03-02 22:19 +0000 [r2113]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: starting to
+	  converge. In serif, added ra-u and ra-uu and tables, raised
+	  anusvara. Various small alterations to sans letters.
+
+2012-03-02 15:18 +0000 [r2112]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: corrected
+	  rakaar on letter da
+
+2012-03-02 14:56 +0000 [r2111]  Stevan_White:
+
+	* FreeSansBold.sfd: Devanagari: glyph clean-up
+	  pass through auxiliaries.
+
+2012-03-02 12:22 +0000 [r2110]  Stevan_White:
+
+	* FreeSansBold.sfd: Devanagari: clean-up pass
+	  through Unicode range. Added a few ligatures.
+
+2012-03-02 03:35 +0000 [r2107-2109]  Stevan_White:
+
+	* FreeSansBold.sfd: Devanagari: implemented by
+	  increasing weight of letters from Sans. Subset of auxiliaries in
+	  Sans: plan is to do more with tables.
+
+	* FreeSans.sfd: Devanagari: re-instated
+	  dev_ha_rvocalic.blws
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: corrected table
+	  having to do with rakaar on round consonants
+
+2012-03-01 19:50 +0000 [r2106]  Stevan_White:
+
+	* FreeSans.sfd: Devanagari: Regularized
+	  horizontal bar height and width, as well as size and shape of dot
+	  marks (made all diamonds). More use of references. (With GPOS
+	  tables, most of the nuktas and halents would go away.) Latin:
+	  made comma a bit less spindly, and likewise with derived marks.
+
+2012-02-29 22:29 +0000 [r2105]  Stevan_White:
+
+	* FreeSerif.sfd: Bengali: some insignificant
+	  clean-up. what to do about these glyphs?
+
+2012-02-29 19:12 +0000 [r2104]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd: Various small corrections
+	  to get test suite to run
+
+2012-02-29 17:02 +0000 [r2103]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: corrected table
+	  tag for style sets. Made substitutions for Marathi more like
+	  those for Hindi than Sanskrit.
+
+2012-02-29 11:21 +0000 [r2102]  Stevan_White:
+
+	* FreeSerifBold.sfd: Devanagari: should now have
+	  same coverage as regular face.
+
+2012-02-29 07:10 +0000 [r2101]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: replaced
+	  auxiliaries; added positioning anchors.
+
+2012-02-25 13:52 +0000 [r2100]  Stevan_White:
+
+	* Makefile: include usage notes in packages
+
+2012-02-25 10:40 +0000 [r2099]  Stevan_White:
+
+	* notes/usage.txt: Further notes
+
+2012-02-25 10:30 +0000 [r2098]  Stevan_White:
+
+	* notes/usage.txt (added),
+	  notes/features.txt: Usage notes -- primarily about
+	  discretionary and language-specific features, what they're for
+	  and how to use them.
+
+2012-02-24 15:58 +0000 [r2097]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: Special form for ukar
+	  under some consonants, ligatures for several consonants with
+	  aakar, with lookups.
+
+2012-02-24 12:21 +0000 [r2096]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: found auxiliaries that
+	  had excaped clean-up.
+
+2012-02-24 11:47 +0000 [r2095]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: Switched yophola and
+	  yyophola for about the 3rd time. This time, following doc for
+	  ortex. Clean-up of "points too close".
+
+2012-02-23 23:37 +0000 [r2094]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: removed overlap of
+	  components, validated.
+
+2012-02-23 23:25 +0000 [r2093]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: glyph cleanup of
+	  auxiliaries complete.
+
+2012-02-23 19:55 +0000 [r2092]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: one removed glyph had
+	  stowed away in a chaining lookup list
+
+2012-02-23 18:09 +0000 [r2091]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: Corrected lookup tag for
+	  'haln' form for 'no'. More glyph cleanup in auxiliaries.
+
+2012-02-23 16:19 +0000 [r2090]  daniel_j:
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd: Set correct codepoint
+	  and Unicode name for uniA7AA (hooked H) in sans bold and
+	  bold-oblique
+
+2012-02-23 14:52 +0000 [r2089]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: corrected blown-out
+	  letter in main range, renamed an auxiliary.
+
+2012-02-23 14:11 +0000 [r2088]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: worked on vowels.
+	  adjusted ii and ai_length to improve connections. Made table for
+	  i sign beneath tho, dho.
+
+2012-02-23 13:35 +0000 [r2087]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: in auxiliary glyphs, a
+	  bit more clean-up, regularizing stem widths. Moved previous
+	  'half' to 'haln', as 'half' isn't recognized by Pango.
+
+2012-02-23 12:46 +0000 [r2086]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: Re-shaped a few letters
+	  with over-thick round parts. Made vowels a bit closer to base
+	  letter.
+
+2012-02-23 11:53 +0000 [r2085]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: made verticals in main
+	  range of more consistent width.
+
+2012-02-22 22:32 +0000 [r2084]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: more lookups seem to be
+	  working, but there is a big question about why the halent
+	  switches position. Is this the shaping engine, or something I've
+	  done with the tables?
+
+2012-02-22 19:44 +0000 [r2083]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: regularized glyph
+	  bearings
+
+2012-02-22 19:18 +0000 [r2082]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: enabled lookups for lots
+	  more ligatures. Still concerned that akhans aren't activating.
+	  Some adjustment of stem widths, etc.
+
+2012-02-22 09:38 +0000 [r2081]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: made anusvara a spacing
+	  mark, made tables and spacing versions of below base marks to
+	  avoid collisions with subscripted consonants, adjusted vowel e to
+	  be less angular and a bit lighter.
+
+2012-02-22 00:44 +0000 [r2080]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: a lot of work with
+	  tables getting examples on MS Typography pages on Oriya to work.
+	  Glyph clean-up, mark adjustments.
+
+2012-02-21 10:39 +0000 [r2079]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: completed Unicode range;
+	  more glyph clean-up. yophola and zophola were exchanged -- fixed.
+	  made look-up for reph+canrabindu.
+
+2012-02-20 22:39 +0000 [r2078]  Stevan_White:
+
+	* FreeSans.sfd: Devanagari: better use of
+	  references in auxiliary range
+
+2012-02-20 08:41 +0000 [r2077]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: more glyph clean-up
+
+2012-02-19 20:52 +0000 [r2076]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerifBold.sfd: Currency Symbols: New
+	  Indian Rupee.
+
+2012-02-19 20:27 +0000 [r2075]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Currency Symbols: Rupee ought
+	  to be shaped as a Devanagari ra with two horizontals, as pointed
+	  out by Santhosh Thottingal.
+
+2012-02-19 20:05 +0000 [r2074]  Stevan_White:
+
+	* FreeSans.sfd: Malayalam: corrected l_voc_mal
+	  and ll_voc_mal, which were completely wrong, as pointed out by
+	  Santhosh Thottingal.
+
+2012-02-19 19:37 +0000 [r2073]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: Made vowels combine more
+	  correctly. More glyph clean-up.
+
+2012-02-19 11:03 +0000 [r2072]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: more glyph clean-up
+
+2012-02-19 00:51 +0000 [r2071]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: clean-up, glyph
+	  validation of main Unicode range.
+
+2012-02-18 21:50 +0000 [r2070]  Stevan_White:
+
+	* FreeSerif.sfd: Gujarati: Removed overlaps,
+	  cleaned up resulting issues.
+
+2012-02-18 19:34 +0000 [r2069]  Stevan_White:
+
+	* FreeSerif.sfd: Gujarati: main glyph clean-up
+	  done. some mods to glyph shapes . added a few i-widening table
+	  entries.
+
+2012-02-18 18:16 +0000 [r2068]  Stevan_White:
+
+	* FreeSans.sfd: Malayalam: positioning tables
+	  for below marks l_voc_mal and ll_voc_mal, as well as for reph.
+	  (consult latest development version of Meera). Currency: made
+	  indian Rupee sign a bit wider
+
+2012-02-18 00:02 +0000 [r2067]  Stevan_White:
+
+	* FreeSerif.sfd: Gujarati: further glyph
+	  clean-up (almost there!). Adjusted marks. Made new lookups to
+	  pick letter i based on width of the letter it goes over.
+
+2012-02-17 14:42 +0000 [r2066]  Stevan_White:
+
+	* FreeSerif.sfd: Gujarati: mostly messing with
+	  mark positioning: got rid of carat-reph forms.
+
+2012-02-17 11:28 +0000 [r2065]  Stevan_White:
+
+	* FreeSerif.sfd: Gujarati: further glyph
+	  clean-up, adjustments to mark placement.
+
+2012-02-17 01:44 +0000 [r2064]  Stevan_White:
+
+	* FreeSerif.sfd: Gujarati: replaced ha_half,
+	  added some lookups for above marks.
+
+2012-02-17 00:14 +0000 [r2062-2063]  Stevan_White:
+
+	* FreeSerif.sfd: Correction: kerning tables were
+	  blown out in commit 2056. There were several bad crashes about
+	  that time. The effect seems to be: all kern table entries are set
+	  to 0.
+
+	* sfd/Makefile, FreeSansBold.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: kerning tables restored.
+	  Problem happened in commit 2096
+
+2012-02-16 23:41 +0000 [r2061]  Stevan_White:
+
+	* FreeSerif.sfd: Gujarati: more glyph clean-up,
+	  mostly in auxiliaries. Just noticed all kern tables have been
+	  zeroed again (thank you, FontForge).
+
+2012-02-16 21:11 +0000 [r2060]  Stevan_White:
+
+	* FreeSerif.sfd: Gujarati: glyph clean-up of
+	  Unicode range, some of auxiliary glyphs.
+
+2012-02-15 20:16 +0000 [r2059]  Stevan_White:
+
+	* FreeSerif.sfd: Gujarati: more glyph clean-up,
+	  re-naming. much more to do.
+
+2012-02-15 17:12 +0000 [r2058]  Stevan_White:
+
+	* FreeSerif.sfd: Gujurati: removed anusvara and
+	  nukta lookups in preference of positioning. general glyph
+	  clean-up. deleted a bunch of unused characters. Oriya: general
+	  glyph clean-up.
+
+2012-02-14 23:59 +0000 [r2057]  Stevan_White:
+
+	* FreeSerif.sfd: Gujarati: Again, from Samak
+	  Gujarati font (full GPL 3.0 with font exception) Scaled slightly
+	  to fit bounds, moved some letters, renamed a few. Lots more to
+	  do.
+
+2012-02-14 22:35 +0000 [r2056]  Stevan_White:
+
+	* FreeSerif.sfd: reverting previous commit.
+	  lookup tables somehow got damaged
+
+2012-02-14 20:40 +0000 [r2055]  Stevan_White:
+
+	* FreeSerif.sfd: Gujarati: From Samak Gujarati
+	  font (full GPL 3.0 with font exception) Scaled slightly to fit
+	  bounds, moved some letters, renamed a few. Lots more to do.
+
+2012-02-14 19:37 +0000 [r2054]  Stevan_White:
+
+	* FreeSans.sfd: Gujarati: Deleted range, over
+	  questions of its provenance. Tut mir leid.
+
+2012-02-13 23:16 +0000 [r2052-2053]  Stevan_White:
+
+	* FreeSerif.sfd: Tamil: cleaned up 'virama'
+	  glyph.
+
+	* FreeSerif.sfd: Gurmukhi: cleaned up 'aa'
+	  glyph.
+
+2012-02-13 23:11 +0000 [r2051]  Stevan_White:
+
+	* FreeSerif.sfd: Gurmukhi: cleaned up 'a' glyph.
+
+2012-02-13 23:06 +0000 [r2049-2050]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: compacted auxiliary
+	  glyphs a bit.
+
+	* FreeSerif.sfd: Oriya: removed most holonto and
+	  nukta forms in preference for positioning lookups
+
+2012-02-13 21:08 +0000 [r2048]  Stevan_White:
+
+	* FreeSans.sfd: Gujarati: made to validate
+
+2012-02-13 20:55 +0000 [r2047]  Stevan_White:
+
+	* FreeSans.sfd: Gujarati: regularized horizontal
+	  placement and spacing, mostly increasing spacing a bit. Got rid
+	  of nukta substitution table in favor of positioning lookup;
+	  likewise with all anusvara lookups. The glyphs of this range are
+	  still very erratic, and the weight is substantially greater than
+	  that of the rest of the face.
+
+2012-02-13 13:56 +0000 [r2046]  Stevan_White:
+
+	* FreeSans.sfd: Gujarati: shifted entire range
+	  up by 44EM, so it didn't dangle so. Fiddled with mark placement.
+
+2012-02-13 00:01 +0000 [r2045]  Stevan_White:
+
+	* FreeSerif.sfd: Gurmukhi: improved vowel a.
+
+2012-02-12 23:29 +0000 [r2044]  Stevan_White:
+
+	* FreeSerif.sfd: Gurmukhi: replaced range with
+	  glyphs from 'singh' metafont by Amarjit Singh
+	  http://www.tex.ac.uk/tex-archive/language/gurmukhi/ The 'singh'
+	  font is properly GPL. And the overall look is much more like
+	  serif than what had been there. Status: added a few letters and
+	  tables. Two marks were unrepresented in 'singh', and are
+	  leftovers. I made a ya_halant and a ra below-form. Also made
+	  substitution and positioning tables. Worst: the vowel 'a' is very
+	  messed up -- much too heavy; hand-drawn. Will have to replace it.
+	  Also need to review the missing marks. Pity there's no bold...
+
+2012-02-12 22:02 +0000 [r2043]  Stevan_White:
+
+	* tools/utility/metafont/bulk_eps_import.py (added),
+	  tools/utility/metafont (added): Tools for
+	  extracting glyphs from metafont files
+
+2012-02-10 23:22 +0000 [r2042]  Stevan_White:
+
+	* FreeSansBold.sfd: Gurmukhi: more of same.
+
+2012-02-10 23:18 +0000 [r2041]  Stevan_White:
+
+	* FreeSansBold.sfd: Gurmukhi: adjusted GPOS
+	  entries
+
+2012-02-10 22:58 +0000 [r2040]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Gurmukhi: various tweeks to
+	  ligatures. Gujarati: various tweeks to ligatures.
+
+2012-02-10 19:01 +0000 [r2039]  Stevan_White:
+
+	* FreeSansBold.sfd: Gurmukhi: toward version in
+	  medium. Geometric Shapes: made dotted circle.
+
+2012-02-10 17:57 +0000 [r2038]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: added letters to
+	  complete range. re-named letters for consistency with other indic
+	  languages. fixed a broken table.
+
+2012-02-10 16:46 +0000 [r2037]  daniel_j:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Unicode 6.1 addition in
+	  FreeSerif: H-hook (U+A7AA) for Chadian languages
+
+2012-02-10 15:46 +0000 [r2036]  Stevan_White:
+
+	* FreeSerif.sfd: Oriya: Re-introduced, using
+	  Samak Oriya, a GPL v.3 + font exception.
+	  http://sarovar.org/projects/samyak/ Already the original is
+	  altered in several ways. The glyphs need a lot of work.
+
+2012-02-10 12:03 +0000 [r2035]  Stevan_White:
+
+	* tools/report/OpenType/UnicodeRanges.py: corrected
+	  Private Use range
+
+2012-02-09 18:50 +0000 [r2034]  Stevan_White:
+
+	* FreeSans.sfd: Gujarati: added abbreviation
+	  character
+
+2012-02-09 18:29 +0000 [r2033]  Stevan_White:
+
+	* FreeSans.sfd: Gurmukhi: named glyphs better.
+	  Malayalam: corrected problems caused by recent inconsistent
+	  naming.
+
+2012-02-09 16:36 +0000 [r2032]  Stevan_White:
+
+	* FreeSans.sfd: Gujurati: named characters
+	  better -- makes it easier to see table problems. Found one error
+	  in tables, fixed. There are others.
+
+2012-02-08 19:55 +0000 [r2031]  Stevan_White:
+
+	* FreeSerif.sfd: Tamil: several new tables in
+	  effort to resolve spacing bug.
+
+2012-02-08 15:37 +0000 [r2030]  Stevan_White:
+
+	* FreeSerif.sfd: Tamil: fixed shrii ligature
+
+2012-02-08 15:15 +0000 [r2029]  Stevan_White:
+
+	* FreeSerif.sfd: Tamil: Toward resolution of bug
+	  #35479: Tamil in FreeSerif: some ligatures wrong
+	  https://savannah.gnu.org/bugs/index.php?35479 Removed GSUB tables
+	  about positioning the virama; implemented this with a GPOS table
+	  and anchor points. Corrected tables for sshri, kss ligatures.
+	  Toward resolution of bug #35480: Tamil in FreeSerif: placement of
+	  vowel marks poor https://savannah.gnu.org/bugs/index.php?35480
+	  Made a vertical ii sign, made a contextual chain that replaces
+	  the normal ii with this one for certain letters.
+
+2012-02-08 01:41 +0000 [r2028]  Stevan_White:
+
+	* FreeSerif.sfd: Malayalam: Added subtable for
+	  nta (mal_n1rh), Separated 'psts' subtable into u and uu ones, and
+	  everything else, hoping somehow to deal with the orthographic
+	  reform.
+
+2012-02-07 23:52 +0000 [r2026-2027]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Malayalam: some additions from
+	  recent Unicode (historical letters) Rearranged akhan lookups.
+
+	* tools/report/OpenType/UnicodeRanges.py: Recent
+	  Unicode additions
+
+2012-02-06 19:24 +0000 [r2025]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd: Latin: Fixed broken
+	  kerning. Problem was: there was an entry for 'f' as the first
+	  letter in two subtables of the same lookup. The second subtable
+	  was ignored, even though there was no match for the second letter
+	  in the first lookup. That is, within a kern lookup, the first
+	  letters of the pairs should be unique.
+
+2012-02-06 14:41 +0000 [r2023-2024]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Latin: put dflt back in
+	  Standard Ligature language list
+
+	* FreeSerif.sfd: Devanagari: added glyphs for
+	  Bompay, Calcutta, Nepali styles from velthuis. made Style Set
+	  lookups for them. Latin: put dflt back in the Standard Ligatures
+	  language list
+
+2012-02-05 23:59 +0000 [r2022]  Stevan_White:
+
+	* FreeSerifBold.sfd: Devanagari: named more
+	  Unicode glyphs, tried to make tables more like latest Serif. Know
+	  of one inconsistency remaining.
+
+2012-02-05 12:18 +0000 [r2021]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: re-worked overlarge
+	  reph-anudatta. Regularized table naming.
+
+2012-02-04 21:50 +0000 [r2019-2020]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: lookup tables --
+	  for the first time, test matches big table of ligatures in
+	  velthuis (wrt Sanskrit and Hindi).
+
+	* FreeSans.sfd: Devanagari: named a bunch of
+	  Unicode glyphs
+
+2012-02-03 15:09 +0000 [r2018]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: another
+	  re-arrangement of tables for velthuis compliance. problems
+	  persist.
+
+2012-02-01 20:59 +0000 [r2017]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: complete
+	  re-structuring of tables in attempt to resemble better the specs
+	  about Indic tables, and produce ligatures of the velthuis font.
+	  Hebrew: Support raising of Yiddish vowel marks.
+
+2012-02-01 19:29 +0000 [r2016]  daniel_j:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Unicode 6.1 additions
+	  in FreeSans: - Tifinagh Ye, Yo - Armenian dram - African H with
+	  hook
+
+2012-01-31 12:02 +0000 [r2015]  Stevan_White:
+
+	* FreeSansBoldOblique.sfd: Hebrew: last commit
+	  accidentlly widened right side of many letters
+
+2012-01-31 11:51 +0000 [r2014]  Stevan_White:
+
+	* FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Hebrew: more
+	  adjustment of points: bold--shifted letters to right
+
+2012-01-31 11:08 +0000 [r2013]  Stevan_White:
+
+	* FreeSansOblique.sfd: Hebrew: some adjustment
+	  of mark positioning
+
+2012-01-31 10:58 +0000 [r2012]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Hebrew: adjustments to
+	  positioning marks; italic moved letter yod
+
+2012-01-31 10:33 +0000 [r2011]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Hebrew: deleted incorrect
+	  ligature lookup
+
+2012-01-31 10:24 +0000 [r2010]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Hebrew: deleted
+	  incorrect ligature lookup
+
+2012-01-31 10:13 +0000 [r2009]  Stevan_White:
+
+	* FreeSansBold.sfd: Hebrew: adjustments to mark
+	  positioning, a bit of tidying of letters. Latin: deleted a
+	  mistakenly copied table.
+
+2012-01-31 09:47 +0000 [r2008]  Stevan_White:
+
+	* FreeSansBold.sfd: Hebrew: added mark
+	  positioning
+
+2012-01-31 00:15 +0000 [r2007]  Stevan_White:
+
+	* FreeSans.sfd: Hebrew: should rememdy bug
+	  #35409: Incorrect placement of khirik-yud for Yiddish in FreeSans
+	  (At least for FreeSans medium)
+
+2012-01-28 14:26 +0000 [r2006]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Devanagari: roman--adjusted
+	  auxiliary glyph names to better fit bold bold: several
+	  corrections
+
+2012-01-28 12:37 +0000 [r2005]  Stevan_White:
+
+	* FreeSerifBold.sfd: Devanagari: various repairs
+	  to glyphs and tables
+
+2012-01-28 01:36 +0000 [r2004]  Stevan_White:
+
+	* FreeSerifBold.sfd: Devanagari: added glyphs
+	  from velthuis font's dvngb10.pfb, added subtables from FreeSerif.
+	  Still plenty missing.
+
+2012-01-27 22:13 +0000 [r2003]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: a couple more
+	  tables to handle velthuis corner cases.
+
+2012-01-26 22:52 +0000 [r2002]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: fixed a few lookup
+	  problems. several more remain.
+
+2012-01-25 14:24 +0000 [r2000-2001]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: adjustments to mark
+	  positioning
+
+	* FreeSans.sfd: Latin: adjustments to accents
+	  Devanagari: re-working tables for better support of Hindi vs
+	  Sanskrit
+
+2012-01-25 12:09 +0000 [r1999]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: Named some letters;
+	  some table clean-up. Devanagari Extended: Added combining
+	  cantillation marks.
+
+2012-01-24 15:02 +0000 [r1998]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: Most of the
+	  previous commits about Hindi were in error: two columns of the
+	  velthuis manual for Modern Hindi and Old Hindi were swapped. This
+	  now implements Modern Hindi, except for one conjunct. Old Hindi
+	  conjuncts are moved to separate tables, but Old Hindi is not
+	  specifically supported.
+
+2012-01-23 18:48 +0000 [r1997]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: several table
+	  corrections, based on new tests.
+
+2012-01-23 10:18 +0000 [r1996]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: table for
+	  consonants that don't take half-form, other conjunct table
+	  tweeks.
+
+2012-01-21 23:20 +0000 [r1995]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: many small
+	  corrections to GSUB.
+
+2012-01-20 13:44 +0000 [r1994]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: Sanskrit/Hindi
+	  distinction now seems to be working. (Was order of two 'akhn'
+	  tables, one specialized for Sanskrit. Don't understand--thought
+	  always all matching tables were executed.)
+
+2012-01-20 01:41 +0000 [r1993]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: some clean-up,
+	  split the akhn table into general (modern Hindi) and Sanskrit.
+	  But not the Sanskrit doesn't activate in any environment, with
+	  lang='sa'. However, seems to work for Hindi.
+
+2012-01-19 16:00 +0000 [r1992]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: more tweeks to
+	  rakaar slash
+
+2012-01-19 15:30 +0000 [r1991]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: corrected simple
+	  Rakaar forms again
+
+2012-01-19 13:52 +0000 [r1990]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: corrected spacing
+	  problem with combining rakaar slash.
+
+2012-01-19 00:52 +0000 [r1989]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: fixed last
+	  consonant-virama-ra conjuncts
+
+2012-01-19 00:32 +0000 [r1988]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: fixed
+	  consonant-virama-consonant-virama conjuncts
+
+2012-01-19 00:04 +0000 [r1987]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: much done on tables
+	  for compound letters. a couple of compounds were corrected.
+
+2012-01-18 14:40 +0000 [r1986]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: Much messing with
+	  combined forms for vowels+rakh, finally got features going for
+	  distinction of Rakaar slash vs Rakaar below mark.
+
+2012-01-16 00:36 +0000 [r1985]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: more lookups
+	  working. Still a couple of letters wrong.
+
+2012-01-14 22:43 +0000 [r1984]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: with help of Z.
+	  Wagner, and a TeX cmap file making the connection betwen
+	  conjuncts in the Velthuis font and Unicode, inserted the Velthuis
+	  au auxiliary glyphs and made lookup tables Mostly working.
+
+2012-01-13 12:08 +0000 [r1983]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Devanagari: (sans) better names
+	  for a couple of characters, (serif) made names more like sans,
+	  added Kashmiri letters to complete Unicode 6.0 range
+
+2012-01-13 00:25 +0000 [r1982]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: PS: Added UniqueId TT
+	  Names: Added UniqueID Devanagari: (serif) added ABVM, BLWM tables
+	  and anchors Devanagari: (sans) small tweaks mostly regarding mark
+	  placement
+
+2012-01-10 17:17 +0000 [r1981]  Stevan_White:
+
+	* FreeSans.sfd: Devanagari: a couple of
+	  touch-ups: corrected 'abvs' entry for ausign-anusvera.
+
+2012-01-10 16:12 +0000 [r1980]  Stevan_White:
+
+	* FreeSans.sfd: Devanagari: re-named most
+	  auxiliary glyphs to make tables more sensible.
+
+2012-01-10 12:56 +0000 [r1979]  Stevan_White:
+
+	* FreeSans.sfd: Devanagari: simplified and
+	  regularized some glyph names
+
+2012-01-10 02:07 +0000 [r1978]  Stevan_White:
+
+	* FreeSans.sfd: Gurmukhi: tried to get marks
+	  under control. Added GPOS tables, anchors.
+
+2012-01-10 00:48 +0000 [r1977]  Stevan_White:
+
+	* FreeSans.sfd: Devanagari: copied a few
+	  ligatures that were in gargi but not in FreeSans. There are still
+	  a few more, but I'm not clear about them. Tables: moved auxiliary
+	  letters for Indic around a bit.
+
+2012-01-09 20:56 +0000 [r1976]  Stevan_White:
+
+	* FreeSans.sfd: Indic tables: rearranged
+	  Devanagari: re-named the GPOS anchors Lagin: iogonek lookup had
+	  gotten somehow fouled up
+
+2012-01-08 01:32 +0000 [r1975]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: copied in rest of
+	  Unicode chars from velthuis font dvng10.pfb with advice from
+	  Zdeněk Wagner. Next plan: copy in ligatures from same file and
+	  use a cmap file provided by Zdeněk to construct a basic GSUB
+	  table.
+
+2012-01-08 00:25 +0000 [r1974]  Stevan_White:
+
+	* FreeSerif.sfd: Latin, Cyrillic: tweeks to
+	  accent marks. Devanagari: beginning to replace range with
+	  Velthuis font.
+
+2012-01-07 19:42 +0000 [r1973]  Stevan_White:
+
+	* FreeSans.sfd: Devanagari: widened space
+	  between verticals in U+0906 by request. Made a lot of references
+	  in range. Added Kashmiri letters from latest Unicode version.
+
+2012-01-03 20:17 +0000 [r1972]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Combining Diacritics:
+	  forgot to add Cyrillic mark for previous commit
+
+2012-01-03 20:08 +0000 [r1971]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Cyrillic: Added mark
+	  for diacriticals on capital letters. toward bug #35225: Combining
+	  Diacritical Marks improperly positioned for Cyrillic capital
+	  letters https://savannah.gnu.org/bugs/?35225 Latin: re-thought
+	  spacing in bold, bold oblique, and re-positioned many accents for
+	  legibility
+
+2011-12-31 20:09 +0000 [r1970]  Stevan_White:
+
+	* FreeSans.sfd: Miscellaneous Symbols: hammer
+	  and sickle, smileface, frown face, courtesy Sander van Geloven
+
+2011-12-28 14:05 +0000 [r1969]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Mathematical Operators:
+	  revision of v. and h. placement and spacing. Reduced height of
+	  partialdiff in some faces.
+
+2011-12-28 13:40 +0000 [r1968]  Stevan_White:
+
+	* FreeSerif.sfd: Mathematical Operators: lowered
+	  nabla, made partialdiff of normal height
+
+2011-12-25 13:54 +0000 [r1967]  Stevan_White:
+
+	* FreeSans.sfd: Miscellaneous Symbols: uni2639
+	  -- a (first) contribution by Sander van Geloven
+
+2011-12-25 13:37 +0000 [r1966]  Stevan_White:
+
+	* FreeSerif.sfd: Mathematical Operators:
+	  improved symbols having vertical lines
+
+2011-12-19 13:55 +0000 [r1965]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: General Punctuation:
+	  regularize width of bullet chars Geometrical Shapes: made new and
+	  regularized width of bullet chars Mathematical Operators: messed
+	  with bullet-lige operators
+
+2011-12-18 17:35 +0000 [r1964]  Stevan_White:
+
+	* FreeSerif.sfd: Mathematical Operators: fixed
+	  some spacing issues.
+
+2011-12-18 13:52 +0000 [r1963]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd: Latin, Punctuation:
+	  slash and some vertical lines were wrongly spaced.
+
+2011-12-17 01:39 +0000 [r1962]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Mathematical Operators: in
+	  sans, added some angle glyphs by request. General vertical
+	  metrecs: fixed some mistakes, re-thought overall.
+
+2011-12-16 12:17 +0000 [r1961]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Technical Symbols: made
+	  extensible mathematical symbol pieces for sans, adjusted
+	  horizontal bracket in serif.
+
+2011-12-16 00:10 +0000 [r1960]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Sans: glyphwise same
+	  vertical adjustments as with Serif, same caveats. All faces:
+	  re-thought metrics. Hope they make better sense now.
+
+2011-12-15 18:02 +0000 [r1959]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: General alterations to make
+	  fit in vertical bounds (-300,900). Problems remain in Sinhala and
+	  Malayalam. Esp. note two Bengali "vocalic" glyphs, used only for
+	  transcription of Sanskrit, were altered and moved.
+
+2011-12-14 22:31 +0000 [r1958]  Stevan_White:
+
+	* FreeSerif.sfd: Malayalam: some glyph clean-up
+
+2011-12-14 21:49 +0000 [r1957]  Stevan_White:
+
+	* FreeSerif.sfd: Changed ascent and descent of a
+	  number of letters out of bounds (several in Arabic, also
+	  Devnagari). The worst are in Malayalam though, and they remain.
+
+2011-12-14 15:59 +0000 [r1956]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Supplementary
+	  Punctuation: made a few new ones
+
+2011-12-12 20:52 +0000 [r1955]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd: Latin Extended-B:
+	  Same with tz ligature as in roman
+
+2011-12-12 18:42 +0000 [r1954]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin Extended-B:
+	  re-thought replacement for tz ligature in German. Note: the
+	  Unicode tz character is used in Mayanist texts.
+
+2011-12-11 23:25 +0000 [r1953]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Complete set of lowercse
+	  latin super/subscripts for normal and bold, with 'subs' and
+	  'sups' lookups.
+
+2011-12-11 20:59 +0000 [r1952]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: (roman) re-thought
+	  tz ligature Number Forms: adjusted vulgar fractions table, to
+	  make all work in xelatex
+
+2011-12-09 11:22 +0000 [r1951]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: avoid fi, fl etc
+	  ligatures in Turkish. Re-thought TZ, tz ligatures.
+
+2011-12-09 00:08 +0000 [r1950]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Proportional Numbers,
+	  Slashed Zero
+
+2011-12-08 23:57 +0000 [r1948-1949]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Greek: added digamma
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Serif faces: lots of work
+	  on numeric substitutions 'onum' Oldstyle Figures 'pnum'
+	  Proportional Numbers 'tnum' Tabular Numbers 'lnum' Lining Figures
+	  'zero' Slashed Zero Cyrillic for Bulgarian: activated new-style
+	  forms with 'ss01' Style Set 1 Cyrillic regular: Bit of kerning.
+	  (FontForge still complains about non-Unicode glyphs)
+
+2011-12-06 22:40 +0000 [r1947]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: More additions to 'sups'
+	  table in roman, bold. Added a few Phonetic Extensions to
+	  italic... but this should wait for a set of small caps.
+
+2011-12-06 21:47 +0000 [r1945-1946]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Changed Bulgarian lookup
+	  tag from cv00 to ss01 bold: adjusted some superscript letter
+	  spacings, minute, prime spacing normal: added proportional
+	  numerals, tables tnum, lnum, pnum adjusted widths of some
+	  superscript letters, tweeked some others added tables sups, subs
+
+	* FreeSans.sfd: Latin: some kerning
+
+2011-12-05 18:50 +0000 [r1944]  Stevan_White:
+
+	* FreeSansBold.sfd: Latin etc: re-spaced,
+	  re-kerned letter a
+
+2011-12-05 13:19 +0000 [r1943]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Cyrillic: tweeks to glyphs,
+	  spacing for alternate Bulgarian letters.
+
+2011-12-05 12:47 +0000 [r1942]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Cyrillic: kerning and spacing.
+
+2011-12-05 10:27 +0000 [r1941]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Cyrillic: more work on
+	  alternative letters for Bulgarian, Serbian
+
+2011-12-04 23:46 +0000 [r1939-1940]  Stevan_White:
+
+	* FreeSerif.sfd: Cyrillic: adjust spacing of
+	  some Bulgarin letters
+
+	* FreeSerifBold.sfd: Latin: bit o kerning
+
+2011-12-04 14:00 +0000 [r1938]  Stevan_White:
+
+	* FreeSerif.sfd: Cyrillic: expanded/corrected
+	  letters for Bulgarian alternate forms.
+
+2011-12-03 22:45 +0000 [r1937]  Stevan_White:
+
+	* FreeSerif.sfd: Cyrillic: alternative small
+	  letters for Bulgarian, with lookup table.
+
+2011-12-03 18:04 +0000 [r1936]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoBoldOblique.sfd: glyph clean-ups
+	  related to recent commits, toward validation
+
+2011-12-03 17:29 +0000 [r1935]  Stevan_White:
+
+	* FreeSansBoldOblique.sfd: Mathematical
+	  Operators: two were out of place
+
+2011-12-03 17:25 +0000 [r1934]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Arrows: made new
+	  ones, corrected others
+
+2011-12-03 15:48 +0000 [r1933]  Stevan_White:
+
+	* FreeSerif.sfd: Currency Symbols: added
+	  spesmilo
+
+2011-12-03 15:04 +0000 [r1932]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerifBold.sfd: Arrows: lots of additions,
+	  corrections
+
+2011-12-03 13:32 +0000 [r1931]  Stevan_White:
+
+	* FreeSansOblique.sfd: Arrows: made glyphs so
+	  range is similar to rest of Sans.
+
+2011-12-03 12:59 +0000 [r1930]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Geometric Shapes:
+	  made minimal set. Mathematical Operators: made a few more glyphs,
+	  corrected a couple. Number Forms: deleted range in bold faces --
+	  can't properly represent all.
+
+2011-12-03 01:02 +0000 [r1929]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoOblique.sfd: Miscellaneous Technical
+	  Symbols: made a few important ones.
+
+2011-12-03 00:33 +0000 [r1928]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Mathematical
+	  Operators: made a few more glyphs. some clean-up.
+
+2011-12-02 19:12 +0000 [r1927]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Mathematical
+	  Operators: revised a few glyphs in medium, got a sort of minimal
+	  set into other styles
+
+2011-12-02 15:03 +0000 [r1926]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Mathematical
+	  Operators: made yet more.
+
+2011-12-02 13:57 +0000 [r1925]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Mathematical Operators:
+	  revised a few in medium (weight and spacing), made a lot of new
+	  characters for other styles.
+
+2011-12-02 10:53 +0000 [r1924]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Mathematical Operators
+	  (etc): more operators (bold), revisions (medium)
+
+2011-12-02 02:32 +0000 [r1923]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Mathematical Operators:
+	  tried to make of more uniform weight (medium) made several new
+	  (bold)
+
+2011-12-01 20:22 +0000 [r1921-1922]  Stevan_White:
+
+	* FreeSerif.sfd: Combining Half Marks: adjusted
+	  mark anchors
+
+	* FreeMono.sfd: Cyrillic: fix to old letter
+	  Arabic: hah_final made all contours- no refs
+
+2011-12-01 19:34 +0000 [r1919-1920]  Stevan_White:
+
+	* tools/generate/TrueType,
+	  tools/generate/OpenType,
+	  tools/generate/MacTT: vim-style file type comment
+
+	* tools/generate/buildutils.py: Version string to
+	  comply with OpenType recommendation.
+
+2011-12-01 18:37 +0000 [r1918]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Misc. Math. Symbols:
+	  made reverse logical not (req. for some MS codepages) Math.
+	  Operators: made a few while I was around
+
+2011-11-30 20:50 +0000 [r1917]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoOblique.sfd: Cyrillic: made uk letters
+	  digraph, due to complaint by user
+
+2011-11-30 13:20 +0000 [r1916]  Stevan_White:
+
+	* tools/report/OpenType/UnicodeRanges.py: Corrected
+	  Combining Half Marks
+
+2011-11-30 13:15 +0000 [r1915]  Stevan_White:
+
+	* FreeSerif.sfd: Combining Half Marks: made
+	  letters, filled range, added mark anchors
+
+2011-11-30 12:26 +0000 [r1914]  Stevan_White:
+
+	* Makefile: targets for woff packages
+
+2011-11-30 12:15 +0000 [r1913]  Stevan_White:
+
+	* README: Added lines on WOFF format.
+
+2011-11-30 12:05 +0000 [r1912]  Stevan_White:
+
+	* notes/webfont_guidelines.txt: added WOFF
+
+2011-11-28 11:41 +0000 [r1911]  Stevan_White:
+
+	* FreeSerif.sfd: Latin: some light kerning
+
+2011-11-28 00:17 +0000 [r1910]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Grid Fitting: made
+	  uniformly Version 1 ("Optimized for Cleartype" won't stay on in
+	  FontForge ?)
+
+2011-11-27 20:52 +0000 [r1909]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: general glyph alterations
+	  toward validation. some of these are due to some bug in FontForge
+	  algorithms -- nothing was apparently wrong with the glyphs.
+
+2011-11-27 00:34 +0000 [r1907-1908]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: some kerning
+
+	* sfd/Makefile,
+	  tools/test/checkGlyphNumbers.py: Made to function
+	  either from directory or from Makefile.
+
+2011-11-25 11:38 +0000 [r1906]  Stevan_White:
+
+	* FreeSerifBold.sfd: correction to 'ccmp' table
+	  for Vietnamese 2
+
+2011-11-25 11:29 +0000 [r1905]  Stevan_White:
+
+	* FreeSerif.sfd: Added some fractions to the
+	  'frac' lookup
+
+2011-11-25 11:17 +0000 [r1904]  Stevan_White:
+
+	* FreeSerif.sfd: corrected some entries in
+	  'frac' lookup
+
+2011-11-25 11:08 +0000 [r1903]  Stevan_White:
+
+	* FreeSerif.sfd: Number Forms: adjusted diagonal
+	  fractions Cyrillic: clean-up of Ksi contour
+
+2011-11-25 10:36 +0000 [r1901-1902]  Stevan_White:
+
+	* tools/report/kernclasses.py (added): Tabular
+	  report of kerning classes in fonts
+
+	* FreeSerifBoldItalic.sfd: Latin: named 2 glyphs
+	  referred to in kern tables
+
+2011-11-25 10:16 +0000 [r1900]  Stevan_White:
+
+	* tools/test/checkGlyphNumbers.py: corrected for
+	  directory move
+
+2011-11-24 18:35 +0000 [r1899]  Stevan_White:
+
+	* FreeSans.sfd: Cyrillic: made Ksi, ksi
+
+2011-11-24 17:58 +0000 [r1898]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd: Latin: for f and
+	  other hooked letters: special punctuation lookup
+
+2011-11-24 17:39 +0000 [r1896-1897]  Stevan_White:
+
+	* FreeSerif.sfd: General Punctuation: adjusted,
+	  regularized spacing of primes
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd: Latin: f and other
+	  hooked letters: put more of hook into kerning
+
+2011-11-24 16:51 +0000 [r1895]  Stevan_White:
+
+	* FreeSerif.sfd: Cyrillic: improve spacing of
+	  Ksi
+
+2011-11-24 15:05 +0000 [r1894]  Stevan_White:
+
+	* FreeSans.sfd: Cyrillic: Made some Old Church
+	  Slavonic letters, by request.
+
+2011-11-23 15:12 +0000 [r1893]  Stevan_White:
+
+	* FreeSans.sfd: Malayalam: glyph clean-up toward
+	  validation
+
+2011-11-23 01:19 +0000 [r1892]  Stevan_White:
+
+	* FreeSans.sfd: Malayalam conjuncts: numerous
+	  contour improvements toward validation
+
+2011-11-22 00:25 +0000 [r1890-1891]  Stevan_White:
+
+	* tools/utility/log2changelog_CVS.pl (removed): This
+	  is what I meant to do in the previous commit
+
+	* tools/utility/log2changelog.pl (removed),
+	  tools/utility/log2changelog_CVS.pl (added): No
+	  need for this script now the VC is changed to SVN; there are
+	  other tools for SVN that perform the same task.
+
+2011-11-21 19:01 +0000 [r1889]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: More individual glyph
+	  tweeks toward validation. (Discovered trigger to one FontForge
+	  bug: contour 1st node at sharp point.)
+
+2011-11-21 11:15 +0000 [r1888]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Overall glyph tweeks
+	  to improve FontForge validation. Note some of these can be called
+	  messy node problems, others are due to some malfunction of
+	  FontForge.
+
+2011-11-20 14:36 +0000 [r1887]  Stevan_White:
+
+	* ChangeLog: brought up to date
+
+2011-11-18 09:55 +0000 [r1886]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Unfortunately several
+	  unrelated changes got balled up in this commit. Generally, slight
+	  re-wording of license (program ->font) Serif, Sans: Latin, Greek,
+	  Cyrillic and phonetic: substantial changes to glyph bearings,
+	  attempt to normalize; re-did kerning angled slightly
+	  hungarianumlaut and double-grave accents toward one another.
+	  lcaron, dcaron, tcaron: prefer an acute accent to apostrophe.
+	  Note this messes up some letters d, l, t with acute, for
+	  languages using IPA. Serif: Cyrillic Ouk: fixed bug #34687: Bad
+	  shape of Cyrillic U+0478 & u+0479 Cyrillic Extended-A: increased
+	  hight of combining marks slightly (regular face only) Italic
+	  Cyrillic: re-did Serbian sha and te with longer line. Bengali,
+	  Tamil, Thai, Ethiopic, Georgian, Cyrillic Extended-B, Latin
+	  Extended-D, Arabic Presentation forms, Letterlike and
+	  Miscellaneous Math Symbols: glyph clean-ups longs: fixed bug
+	  #34841: U+017F LONG S upright a bit wrong Sans: acute, grave,
+	  hungarianumlaut and double-grave accents on capitals somewhat
+	  shorter to better fit in the line,
+
+2011-11-18 09:46 +0000 [r1885]  Stevan_White:
+
+	* FreeMono.sfd: Arabic: positional
+	  substitutions; added a couple of characters
+
+2011-11-12 14:48 +0000 [r1883-1884]  Stevan_White:
+
+	* sfd/Makefile: target for making WOFF files
+
+	* tools/generate/WOFF: removed one unused package
+	  better documentation
+
+2011-11-12 14:37 +0000 [r1882]  Stevan_White:
+
+	* tools/generate/WOFF: removed debug strings
+
+2011-11-12 14:34 +0000 [r1881]  Stevan_White:
+
+	* tools/generate/WOFF (added): Generator for Web
+	  Open Font Format files
+
+2011-11-05 16:43 +0000 [r1880]  Stevan_White:
+
+	* FreeMono.sfd: Arabic: addded three letters
+
+2011-11-05 15:06 +0000 [r1879]  Stevan_White:
+
+	* FreeMono.sfd: Arabic: Many incorrectly 0-width
+	  chars made full width. Implemented marks, mostly for vertical
+	  mark placement.
+
+2011-11-04 22:28 +0000 [r1878]  Stevan_White:
+
+	* FreeMono.sfd: Arabic: added several
+	  characters. nearing functionality of serif version.
+
+2011-11-04 14:55 +0000 [r1877]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: fixed several
+	  substitution and glyph problems. See discussion
+	  https://savannah.gnu.org/bugs/?34190
+
+2011-11-03 17:55 +0000 [r1876]  Stevan_White:
+
+	* FreeSerifBold.sfd: Arabic: improved meemfinal
+
+2011-11-03 16:07 +0000 [r1875]  Stevan_White:
+
+	* FreeSerif.sfd: Punctuation Suppl: a few
+	  additions. Geometrical Shapes, Math Suppl: mostly spacing.
+
+2011-11-03 13:18 +0000 [r1873-1874]  Stevan_White:
+
+	* tools/report/OpenType/UnicodeRanges.py: typo in
+	  doc
+
+	* FreeSerif.sfd: Removed excess entry for
+	  uni29b4.
+
+2011-11-03 12:55 +0000 [r1872]  Stevan_White:
+
+	* tools/report/OpenType/UnicodeRanges.py: Added to
+	  Supplemental Punctuation
+
+2011-11-03 12:15 +0000 [r1871]  Stevan_White:
+
+	* FreeSerif.sfd: Punctuation: named some glyphs,
+	  re-sized some spaces, added some Supplemental
+
+2011-11-03 09:48 +0000 [r1870]  Stevan_White:
+
+	* tools/utility/fontforge-interp.sh: more doc
+
+2011-11-03 01:40 +0000 [r1869]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Glyph clean-up, and change
+	  of problematic glyph names
+
+2011-11-03 01:21 +0000 [r1868]  Stevan_White:
+
+	* tools/test/validate.py: Better exception handling
+
+2011-11-03 01:09 +0000 [r1867]  Stevan_White:
+
+	* FreeSerifBold.sfd: Some glyph clean-up
+
+2011-11-03 00:59 +0000 [r1866]  Stevan_White:
+
+	* FreeSerif.sfd: Some glyph clean-up.
+
+2011-11-03 00:51 +0000 [r1862-1865]  Stevan_White:
+
+	* tools/utility/fontforge-interp.sh (added): Wrapper
+	  for fontforge.
+
+	* tools/test/findBackLayers.py,
+	  tools/test/validate.py,
+	  tools/test/checkGlyphNumbers.py,
+	  tools/test/isMonoMono.py: Call wrapper for
+	  fontforge rather than calling a specific instance.
+
+	* tools/generate/TrueType,
+	  tools/generate/OpenType,
+	  tools/generate/MacTT: Call wrapper for fontforge
+	  rather than calling specific instance
+
+	* tools/report/private_use.py,
+	  tools/report/range_report.py,
+	  tools/report/ligatureLookups.py: Use wrapper for
+	  fontforge rather than calling explicit instance.
+
+2011-11-03 00:45 +0000 [r1861]  Stevan_White:
+
+	* sfd/Makefile: Made to execute fontforge from any
+	  instance in PATH
+
+2011-11-02 18:32 +0000 [r1859-1860]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: named some glyphs
+
+	* FreeMono.sfd: Arabic: corrected slot for one
+	  letter.
+
+2011-11-02 00:56 +0000 [r1858]  Stevan_White:
+
+	* FreeMono.sfd: Arabic: most of intermediate
+	  forms with lookups: A and B. Some general contour cleanup.
+
+2011-10-31 22:12 +0000 [r1857]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Cyrillic: added
+	  'locl' lookup for Serbian/Macedonian 'be'
+
+2011-10-31 19:34 +0000 [r1855-1856]  Stevan_White:
+
+	* FreeSerif.sfd: Spacing Modifier Letters:
+	  horizontal space adjustments
+
+	* FreeSans.sfd: Latin, Diacritics, etc:
+	  hungarian umlaut, double grave adjustments
+
+2011-10-31 19:27 +0000 [r1854]  Stevan_White:
+
+	* FreeMono.sfd: Arabic: Drew most of main range.
+
+2011-10-31 17:22 +0000 [r1853]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Latin, Diacriticals, etc:
+	  adjustment on hungarian umlaut, double grave
+
+2011-10-30 16:25 +0000 [r1852]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: removed Arabic-only
+	  ligatures lookup, as it seems to confuse Pango.
+
+2011-10-30 12:51 +0000 [r1851]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: changed size of tatweel
+
+2011-10-30 11:07 +0000 [r1850]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd: Cyrillic: cursive
+	  Macedonian gje. See bug 34688.
+	  https://savannah.gnu.org/bugs/?34688
+
+2011-10-29 23:12 +0000 [r1849]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic Presentation Forms-B:
+	  adjustment to meem-final.
+
+2011-10-29 22:01 +0000 [r1848]  Stevan_White:
+
+	* FreeSerif.sfd: Spacing Modifier/Combining
+	  Diacritics: double-gramve and Hungarian umlaut, to make them less
+	  extremely wide and hard to accommodate. Made less steep, at
+	  slightly different angles, following advice at
+	  http://typophile.com/node/78623
+	  http://diacritics.typo.cz/index.php?id=24
+
+2011-10-29 18:53 +0000 [r1847]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: Re-worked final meem.
+	  Put Arabic-only ligatures in Arabic-only lookup. Put Allah in a
+	  'dlig' lookup. Made tatweel shorter.
+
+2011-10-29 12:09 +0000 [r1846]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: marked some ending
+	  ligatures as Arabic-language only, on advice from a Persan
+	  speaker (comments to bug #34190)
+
+2011-10-29 06:18 +0000 [r1845]  Stevan_White:
+
+	* FreeSerif.sfd: General Punctuation: made
+	  bullet-bullets same width as bullet
+
+2011-10-29 04:44 +0000 [r1844]  Stevan_White:
+
+	* FreeSerif.sfd: Punctuation, Geometric Shapes,
+	  Miscellaneous Symbols, etc.: regularize bullet-like characters
+	  somewhat in width and weight
+
+2011-10-28 23:51 +0000 [r1843]  Stevan_White:
+
+	* FreeSerifBold.sfd: Arabic Extended-A: Added 2
+	  ligatures
+
+2011-10-28 22:53 +0000 [r1842]  Stevan_White:
+
+	* FreeSans.sfd: Cyrillic Supplement: letters for
+	  Abkhaz and Azerbaijani, and Nivkh.
+
+2011-10-28 22:16 +0000 [r1841]  Stevan_White:
+
+	* FreeMono.sfd: Cyrillic Supplement: letters for
+	  Abkhaz and Azerbaijani
+
+2011-10-28 21:53 +0000 [r1840]  Stevan_White:
+
+	* FreeMono.sfd: Cyrillic: Added Nivkh letters
+
+2011-10-28 18:10 +0000 [r1839]  Stevan_White:
+
+	* tools/utility/special-purpose/makeBraille.py
+	  (added), tools/utility/special-purpose (added),
+	  tools/utility/makeBraille.py (removed):
+	  special-purpose directory for one-shot scripts, included as
+	  examples.
+
+2011-10-28 12:29 +0000 [r1838]  Stevan_White:
+
+	* FreeSansBold.sfd: Latin: small adjustment to
+	  letter spacing
+
+2011-10-28 11:50 +0000 [r1837]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: several lookup
+	  corrections thanks to Emmanuel Vallois, see comments to [bug
+	  #34190] Persian characters in FreeSerif not connecting right In
+	  bold, lots of re-namings to make lookups copied from roman work.
+
+2011-10-27 22:01 +0000 [r1836]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeMono.sfd: Latin (Vietnamese): adjusted
+	  some marks. Latin: SansBold attempts to regularize spacing.
+
+2011-10-27 16:34 +0000 [r1834-1835]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: kerning, a bit of
+	  letter spacing
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Latin: much messing
+	  with accents for Vietnamese, some kerning
+
+2011-10-26 22:42 +0000 [r1833]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: efforts to limit
+	  height of accents: Making shorter glyphs for some accents for
+	  capital letters. Some compacting of taller stacked glyphs. Made
+	  all lowercase letters' accents fall in the bounds.
+
+2011-10-26 14:44 +0000 [r1832]  Stevan_White:
+
+	* FreeSerifBold.sfd: Combining Diacritics:
+	  adjustments for Serbian Cyrillic
+
+2011-10-26 14:36 +0000 [r1830-1831]  Stevan_White:
+
+	* FreeSans.sfd: Latin, General Punctuation:
+	  attempts to regularize widths and spaces
+
+	* FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Combinind
+	  Diacriticals: corrections to mark placement for Cyrillic Serbian
+
+2011-10-26 12:39 +0000 [r1829]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Latin: Replaced d-, l-, t-caron
+	  mark with one distinguishable from punctuation Sans: implemented
+	  shorter acute, grave, circumflex, caron for caps
+
+2011-10-26 10:20 +0000 [r1828]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Cyrillic: adjusted
+	  mark anchors
+
+2011-10-26 02:16 +0000 [r1827]  Stevan_White:
+
+	* FreeSansBoldOblique.sfd: General Punctuation:
+	  got rid of minor build warning
+
+2011-10-26 02:13 +0000 [r1826]  Stevan_White:
+
+	* FreeMono.sfd: Greek: got rid of build warning
+
+2011-10-26 01:56 +0000 [r1825]  Stevan_White:
+
+	* FreeSerif.sfd: Punctuation, Spacing
+	  Diacritical Marks: worked on widths
+
+2011-10-25 21:28 +0000 [r1822-1824]  Stevan_White:
+
+	* tools/generate/TrueType,
+	  tools/generate/OpenType,
+	  tools/generate/buildutils.py,
+	  tools/generate/MacTT: Again trying to set keywords
+
+	* tools/generate/TrueType,
+	  tools/generate/OpenType,
+	  tools/generate/buildutils.py,
+	  tools/generate/MacTT: Added Date svn keyword
+
+	* tools/generate/TrueType,
+	  tools/generate/OpenType,
+	  tools/generate/buildutils.py,
+	  tools/generate/MacTT: Added Revision keyword
+
+2011-10-25 21:13 +0000 [r1821]  Stevan_White:
+
+	* tools/generate/TrueType,
+	  tools/generate/OpenType,
+	  tools/generate/buildutils.py (added),
+	  tools/generate/MacTT: Implemented cleaned-up
+	  Revision string
+
+2011-10-25 20:10 +0000 [r1820]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Cyrillic: added marks for
+	  Serbian; adjusted others
+
+2011-10-25 19:19 +0000 [r1819]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Cyrillic: added marks
+	  for Serbian to roman, added mark positioning to non-roman
+
+2011-10-25 19:02 +0000 [r1818]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Adjusted the font family
+	  class. some kerning adjusted some marks.
+
+2011-10-25 18:42 +0000 [r1817]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Spacing
+	  Modifiers/Diacritics: regularized spacing some
+
+2011-10-25 14:42 +0000 [r1816]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Latin: shifted grave and
+	  acute accents so they could be used independently. Lots more
+	  kerning, More adjustment of extreme characters.
+
+2011-10-24 20:16 +0000 [r1815]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd: Cyrillic: for Serbian
+	  'salt' form for italic 'sha' with line below
+
+2011-10-24 15:02 +0000 [r1814]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Cyrillic: removed lookup
+	  for supposed Serbian gje, leaving only the Macedonian form.
+
+2011-10-23 12:06 +0000 [r1812-1813]  Stevan_White:
+
+	* FreeSerif.sfd: Latin, IPA: kerning
+
+	* FreeSerifItalic.sfd: Latin, IPA: horizontal
+	  positioning, kerning Greek, extended: re-positioning of all marks
+
+2011-10-22 18:24 +0000 [r1811]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Cyrillic: re-kerned a bit
+
+2011-10-21 22:53 +0000 [r1810]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Greek, Cyrillic: working
+	  on fallout from re-spacing of Latin
+
+2011-10-21 20:18 +0000 [r1809]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Latin: kerning
+
+2011-10-20 17:13 +0000 [r1808]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd: Greek, Cyrillic: made Phi,
+	  Ef more distinct, made some overwide glyphs narrower
+
+2011-10-20 16:44 +0000 [r1806-1807]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Latin: starting to mess
+	  with spacing of extreme letters: f g j y
+
+	* FreeMono.sfd: Greek, Cyrillic: make Phi, Ef
+	  more distinct
+
+2011-10-19 17:24 +0000 [r1805]  Stevan_White:
+
+	* FreeSerif.sfd: Diacriticals: corrected
+	  acutecmb placement
+
+2011-10-19 14:56 +0000 [r1804]  Stevan_White:
+
+	* FreeSerif.sfd: Latin/IPA: Reduced size of
+	  hooks on many letters. Reduced spacing of grave, acute (big
+	  overhaul). kerning in IPA for African, Americanist alphabets
+
+2011-10-18 23:35 +0000 [r1802-1803]  Stevan_White:
+
+	* notes/webfont_guidelines.txt: Propset id
+
+	* notes/webfont_guidelines.txt: formatting, propset
+	  ID
+
+2011-10-18 23:19 +0000 [r1801]  Stevan_White:
+
+	* notes/README-downloads.txt,
+	  notes/webfont_guidelines.txt (added),
+	  notes/features.txt: updates added webfont
+	  guidelines
+
+2011-10-18 22:22 +0000 [r1800]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: more fiddling with
+	  kerning. Fixed longstanding bug with "equals" (had mysterious
+	  mkmk anchors)
+
+2011-10-18 00:03 +0000 [r1799]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: more fiddling with
+	  kerning
+
+2011-10-17 23:36 +0000 [r1798]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: More with j and f.
+	  Got rid of small caps kerning, which didn't make much sense
+	  anyway. Tried to space small caps letters a bit better.
+
+2011-10-17 19:13 +0000 [r1797]  Stevan_White:
+
+	* FreeSerif.sfd: Latin: a bit experimental: got
+	  rid of overlap of tails on f and j, compensating with kerning.
+	  More kerning. Increased width of quotesingle.
+
+2011-10-17 18:10 +0000 [r1796]  Stevan_White:
+
+	* FreeSerif.sfd: Latin kerning: added letters to
+	  classes. Have not yet done Latin Extended Additional
+
+2011-10-17 12:40 +0000 [r1795]  Stevan_White:
+
+	* FreeSerifBold.sfd: Latin: kerning re-done
+
+2011-10-15 18:28 +0000 [r1794]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Latin: more adjustments to
+	  spacing, and re-introduced kerning, completely re-done since the
+	  disappearance of the tables. Improvement all around.
+
+2011-10-15 15:28 +0000 [r1793]  Stevan_White:
+
+	* FreeSerif.sfd: Latin, Greek, Cyrillic: changes
+	  to L and R bearings to most characters.
+
+2011-10-15 12:01 +0000 [r1792]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Latin, Cyrillic: spacing
+	  of a couple of letters
+
+2011-10-15 11:24 +0000 [r1791]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd: Latin, Cyrillic:
+	  spacing and kerning of a few letters
+
+2011-10-15 09:38 +0000 [r1790]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Cyrillic: some kerning,
+	  esp. of Serbian letters
+
+2011-10-15 01:40 +0000 [r1789]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd: Cyrillic: adjusted
+	  boundaries of alternate te
+
+2011-10-14 11:59 +0000 [r1788]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerifBold.sfd: Cyrillic: Made
+	  Serb/Macedonian 'be' and lookups for it
+
+2011-10-13 11:20 +0000 [r1787]  Stevan_White:
+
+	* FreeSans.sfd: Latin, Greek, Cyrillic: attempt
+	  to make capitals with straight sides spaced even Some clean-up of
+	  Greek letterforms
+
+2011-10-13 10:18 +0000 [r1786]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Cyrillic: made special 'be' for
+	  Serbian/Macedonian lookup for gje for italic
+
+2011-10-12 22:29 +0000 [r1785]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd: Cyrillic: more tweeks
+	  to Serbian Cyrillic glyphs and similar, re-named Cyrillic
+	  auxiliary glyphs.
+
+2011-10-12 18:40 +0000 [r1784]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Cyrillic: Lookups for
+	  localized forms for Serbian/Macedonian. Remedies bug #34537:
+	  Serbian Localized Glyphs https://savannah.gnu.org/bugs/?34537
+	  Most look-ups were for existing glyphs. In italic also made glyph
+	  for te, like a rotated m with macron. Re-named cyrillic auxiliary
+	  glyphs.
+
+2011-10-12 12:31 +0000 [r1783]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin, Diacriticals:
+	  adjustments for Kwak̕wala
+
+2011-10-11 20:48 +0000 [r1782]  Stevan_White:
+
+	* CREDITS: to myself, for Old Italic
+
+2011-10-11 17:55 +0000 [r1781]  Stevan_White:
+
+	* tools/report/OpenType/UnicodeRanges.py: Update for
+	  Old Italic
+
+2011-10-11 17:00 +0000 [r1780]  Stevan_White:
+
+	* FreeMono.sfd: Old Italic: I made letters for
+	  this alphabet based on bits of existing ones.
+
+2011-10-11 09:55 +0000 [r1779]  Stevan_White:
+
+	* FreeSerif.sfd: IPA: adjustment to kerning,
+	  named a few marked letters
+
+2011-10-11 09:45 +0000 [r1778]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd: Phonetic Extensions:
+	  additions for Saanich/Musqueam
+
+2011-10-11 09:40 +0000 [r1777]  Stevan_White:
+
+	* FreeMono.sfd: Runic: completely re-did range,
+	  to make stem width like rest of font. (ends are still square or
+	  angular rather than round...) Consulted many inscriptions, and
+	  changed form where seemed appropriate.
+
+2011-10-09 15:26 +0000 [r1776]  Stevan_White:
+
+	* FreeSerif.sfd: Kerning of IPA symbols for
+	  Saanich/Musqueam
+
+2011-10-09 14:03 +0000 [r1775]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Latin, IPA
+	  Extensions, Diacriticals: toward Sannich/Musqueam
+
+2011-10-09 10:52 +0000 [r1774]  Stevan_White:
+
+	* notes/maintenance.txt: about adding binaries to
+	  cvs for web pages
+
+2011-10-08 22:48 +0000 [r1773]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin/IPA: further tweeks
+	  to letter forms
+
+2011-10-08 19:36 +0000 [r1772]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin, Phonetic symbols,
+	  Diacriticals: tweeks for Musqueam/Saanich
+
+2011-10-08 17:33 +0000 [r1771]  Stevan_White:
+
+	* FreeSans.sfd: couple of validation issues
+
+2011-10-08 16:47 +0000 [r1770]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin, Combining Marks,
+	  IPA: lots of changes for Saanich/Musqueam.
+
+2011-10-08 01:28 +0000 [r1769]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Latin/IPA: tweeks for
+	  Saanich/Musqueam
+
+2011-10-07 12:13 +0000 [r1768]  Stevan_White:
+
+	* FreeSerif.sfd: Latin and IPA, Phonetic
+	  Extensions: For display of Saanich language, 1) made for
+	  combining right comma on small Latin, some IPA letters, and on
+	  the c-hacek. 2) made ligatures for d, l, and t combined with
+	  U+0313, 3) Adjusted the widths of some of the IPA letters.
+
+2011-09-30 23:31 +0000 [r1767]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: more kerning,
+	  re-think letter ae
+
+2011-09-30 19:50 +0000 [r1766]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerifBold.sfd: Basic Latin: emboldened
+	  commercial at sign, to remedy bug #23574: Serif Bold: some
+	  symbols not bold https://savannah.gnu.org/bugs/index.php?23574
+
+2011-09-30 18:59 +0000 [r1765]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerif.sfd: Bengali: made a Ganda mark, to
+	  remedy bug #33983: Bengali Ganda mark is missing
+	  https://savannah.gnu.org/bugs/index.php?33983
+
+2011-09-30 18:17 +0000 [r1764]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: more work on
+	  connecting letters. Re-thought tatween.
+
+2011-09-30 13:00 +0000 [r1763]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: un-linking more
+	  auxiliary dependencies. Re-thought 'v' decoration. Hebrew: dagesh
+	  was a little small in bold.
+
+2011-09-29 22:39 +0000 [r1762]  Stevan_White:
+
+	* FreeSerifBold.sfd: Arabic: removed more
+	  unnecessary auxiliary references
+
+2011-09-29 20:59 +0000 [r1761]  Stevan_White:
+
+	* FreeSerifBold.sfd: Arabic: emboldended the
+	  last of the letters (I hope) un-linked some auxiliaries that were
+	  represented by unicode
+
+2011-09-29 13:37 +0000 [r1760]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: alterations to
+	  kaf/keheh, kerning to improve spacing
+
+2011-09-29 10:43 +0000 [r1759]  Stevan_White:
+
+	* FreeSerifBold.sfd: Arabic: lots of alterations
+	  to letter shapes, spacing
+
+2011-09-28 23:03 +0000 [r1758]  Stevan_White:
+
+	* FreeSerifBold.sfd: Arabic: moved a lot of
+	  improvements from roman to bold
+
+2011-09-28 14:13 +0000 [r1757]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: reduced awful space on
+	  left side of free-standing letters
+
+2011-09-28 00:10 +0000 [r1756]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: regularized alef
+	  variants, maddah, etc.
+
+2011-09-27 20:47 +0000 [r1755]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: More ligatures, a
+	  couple alternative parentheses, re-worked hah medial
+
+2011-09-27 09:11 +0000 [r1754]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: added a few ligatures,
+	  re-thought jeem medial, touched up some other letters
+
+2011-09-26 15:28 +0000 [r1753]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: more small stem width
+	  adjustments
+
+2011-09-26 14:51 +0000 [r1752]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: kerning was in wrong
+	  direction.
+
+2011-09-26 13:01 +0000 [r1751]  Stevan_White:
+
+	* tools/report/range_report.py,
+	  tools/report/OpenType/UnicodeRanges.py: updated
+	  copyright
+
+2011-09-26 07:06 +0000 [r1750]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: trying to regularize
+	  stem widths
+
+2011-09-25 22:33 +0000 [r1749]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: more adjustment,
+	  kerning
+
+2011-09-25 15:45 +0000 [r1748]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: more tweeks to shapes,
+	  kerning
+
+2011-09-25 15:16 +0000 [r1747]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: tweeks to letter
+	  shapes, spacing, mark placement
+
+2011-09-25 01:13 +0000 [r1746]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: shape adjustments to
+	  dal and noon
+
+2011-09-24 14:58 +0000 [r1745]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: further adjustment of
+	  letter shapes, dot placement
+
+2011-09-22 21:28 +0000 [r1744]  Stevan_White:
+
+	* CREDITS: Credit to Tim Erickson for Syriac glyphs.
+	  Marked many links as being broken with FIXMEs
+
+2011-09-22 20:48 +0000 [r1743]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Thaana: made bold version,
+	  adjusted spacing
+
+2011-09-22 20:41 +0000 [r1742]  Stevan_White:
+
+	* FreeSerif.sfd: Thaana: made new character from
+	  parts
+
+2011-09-22 20:28 +0000 [r1741]  Stevan_White:
+
+	* tools/report/OpenType/UnicodeRanges.py: correct
+	  Runic
+
+2011-09-22 18:54 +0000 [r1740]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Arabic: numerous tweeks to
+	  letter shapes. In roman, some more kerning
+
+2011-09-22 18:16 +0000 [r1739]  Stevan_White:
+
+	* FreeSans.sfd: Syriac: filled in some missing
+	  Unicode using Tim Erikson's Carlo Ator font (by his written
+	  permission!)
+
+2011-09-21 10:13 +0000 [r1738]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: fixed lam-alef ligature
+	  (again) (I think) Made most dots of uniform size adjusted height
+	  of final, isolated hah started on a kerning table
+
+2011-09-20 17:52 +0000 [r1737]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: made a few more
+	  low-numbered glypys, to finish off the range.
+
+2011-09-20 12:47 +0000 [r1736]  Stevan_White:
+
+	* tools/report/OpenType/OpenType.py (removed),
+	  tools/report/range_report.py,
+	  tools/report/ranges (removed),
+	  tools/report/OpenType/UnicodeRanges.py (added),
+	  tools/report/OpenType (added): Better naming of
+	  packages
+
+2011-09-19 23:23 +0000 [r1735]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: added some low-numbered
+	  characters: Subtending marks, Arabic ray, Poetic marks
+
+2011-09-19 17:54 +0000 [r1734]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: drew some more Koranic
+	  annotations. re-thought sizing and placement of some others
+
+2011-09-19 13:55 +0000 [r1733]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: raised letter noon more
+	  attempts to regularize placement of marks
+
+2011-09-18 21:22 +0000 [r1732]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: many adjustments,
+	  mostly of marks
+
+2011-09-18 14:30 +0000 [r1731]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: adjusted marks, added
+	  anchor points for new marks, made a couple of new letters got
+	  ligatures working again replaced Allah and Rial ligatures
+
+2011-09-17 18:51 +0000 [r1730]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: mostly messing with
+	  marks: shadda combinations seem to be working.
+
+2011-09-16 19:45 +0000 [r1729]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: corrected some
+	  diacriticals in Presentation Forms-B especially FBBC-FBC1 were
+	  messed up, unfortunately so were a lot of references to those
+
+2011-09-16 18:36 +0000 [r1728]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: small spacing issues,
+	  tweeks to shapes of medial letters
+
+2011-09-16 17:56 +0000 [r1727]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: re-did several
+	  combining forms (which I think I drew myself) added some
+	  diacriticals to main range and finished Presentation Forms-B
+
+2011-09-16 13:54 +0000 [r1726]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: more fussing with marks
+
+2011-09-16 13:35 +0000 [r1725]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: more fiddling with
+	  marks
+
+2011-09-16 13:23 +0000 [r1724]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: much fussing with mark
+	  placement. horizontal spacing of waw
+
+2011-09-16 12:07 +0000 [r1723]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: added mark positioning.
+	  will need to re-think some of the marks.
+
+2011-09-16 10:18 +0000 [r1722]  Stevan_White:
+
+	* notes/maintenance.txt: Changed some CVS info to
+	  SVN info. Still need to test and describe tagging in SVN.
+
+2011-09-16 09:42 +0000 [r1721]  Stevan_White:
+
+	* README: Replaced list of character sets with
+	  character ranges, which makes more sense at this time.
+
+2011-09-15 23:22 +0000 [r1720]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: big experiment
+	  adjusting baselines of many of the deeper characters. from
+	  looking at "Arabic Calligraphy, Nash script for beginners". Also
+	  shortened reh.
+
+2011-09-15 21:32 +0000 [r1719]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: a couple more
+	  positional forms, a couple of lookups
+
+2011-09-15 19:22 +0000 [r1718]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd: Arabic Supplement: populated
+
+2011-09-15 14:12 +0000 [r1717]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: much concern over
+	  proper old Arabic kah U+0643 vs the more modern "Persian" keheh
+	  U+06a9. Fiddling with hamzas.
+
+2011-09-15 11:53 +0000 [r1716]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: added a few obsolete or
+	  unexplained characters. much adjustment of combining marks and
+	  dots for better consistency.
+
+2011-09-14 23:24 +0000 [r1715]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: much fiddling with
+	  medial forms, a bit with lookups (seems ligatures are failing
+	  altogether)
+
+2011-09-14 19:40 +0000 [r1714]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: added 2 radical signs
+	  Seems the digits in Arabic have been all along the Indo-Persian
+	  forms. Now there is a separate range for those. So I movde the
+	  old letters, and drew new Arabic versions of those that differed.
+
+2011-09-14 17:26 +0000 [r1713]  Stevan_White:
+
+	* tools/report/ranges/OpenType.py: Brought Arabic up
+	  to date
+
+2011-09-14 09:37 +0000 [r1712]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: further clean-up; made
+	  swash kaf to connect as initial form
+
+2011-09-14 08:52 +0000 [r1711]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: further cleanup, added
+	  pedagogical symbols (dots, etc)
+
+2011-09-14 01:04 +0000 [r1710]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: added letters for Malay
+	  Big clean-up of glyphs. Still to do one section of presentation
+	  forms.
+
+2011-09-13 20:46 +0000 [r1709]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: made letters for
+	  Parkari. Added lookups init, fina, medi for letters with forms
+	  that vary in the font.
+
+2011-09-13 19:43 +0000 [r1708]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: made main Arabic area
+	  characters and presentation forms for Uighur, Kazakh, Kirghiz,
+	  Sindhi, and Lahnda, as well as the kaf swash
+
+2011-09-13 19:40 +0000 [r1707]  Stevan_White:
+
+	* tools/report/range_report.py: corrected font paths
+
+2011-09-13 18:10 +0000 [r1706]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: added more presentation
+	  forms mostly for Urdu and Sindhi
+
+2011-09-13 13:34 +0000 [r1705]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: made some presentation
+	  forms for Urdu
+
+2011-09-13 11:05 +0000 [r1704]  Stevan_White:
+
+	* tools/utility/hex_range.py: doc
+
+2011-09-13 09:37 +0000 [r1703]  Stevan_White:
+
+	* tools/ranges.py (removed),
+	  tools/report/range_report.py (added),
+	  tools/report/ranges (added),
+	  tools/range_report.py (removed),
+	  tools/ranges (removed): rearrangement, got rid of
+	  duplicate script
+
+2011-09-13 09:29 +0000 [r1702]  Stevan_White:
+
+	* tools/ranges/OpenType.py: documented, removed
+	  copied text
+
+2011-09-13 09:20 +0000 [r1701]  Stevan_White:
+
+	* tools/freefont-ttf.spec (removed),
+	  tools/utility/freefont-ttf.spec (added):
+	  Rearranged, added a little doc
+
+2011-09-13 09:15 +0000 [r1700]  Stevan_White:
+
+	* tools/OS2UnicodeRange (removed),
+	  tools/KerningNumerals.pl (removed),
+	  tools/utility/KerningNumerals.pl (added),
+	  tools/report/OS2UnicodeRange (added): Rearranged
+	  some old utilities. Put in some doc of who wrote what.
+
+2011-09-12 23:37 +0000 [r1699]  Stevan_White:
+
+	* tools/script-menu (added),
+	  tools/hex_range.py (removed),
+	  tools/report/private_use.py (added),
+	  tools/utility/log2changelog.pl (added),
+	  tools/script-menu/nameBySlot.py (added),
+	  tools/utility/hex_range.py (added),
+	  tools/script-menu/unnameBySlot.py (added),
+	  tools/utility/makeBraille.py (added),
+	  tools/utility (added),
+	  tools/nameBySlot.py (removed): Added some scripts,
+	  reorganized
+
+2011-09-12 22:12 +0000 [r1698]  Stevan_White:
+
+	* tools/ranges/OpenType.py: Brought a few ranges up
+	  to date
+
+2011-09-12 22:06 +0000 [r1697]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic, etc: Added a lot of
+	  letters, mostly following existing patterns. Especially a lot of
+	  combinations for Urdu, Sindhi, Pashto, Kazakh, Kurdish, Kirghiz,
+	  Turkic, Uighur Berber, Maghrib Arabic, Tunisian Arabic, Moroccan
+	  Arabic, Not all forms are there yet. Very few lookups were
+	  added...this has to be done too.
+
+2011-09-12 15:13 +0000 [r1696]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: added some Urdu letters
+	  (drawn by myself, with apologies)
+
+2011-09-12 13:07 +0000 [r1695]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: added keheh and
+	  presentation forms, added lookup entries for them.
+
+2011-09-12 12:25 +0000 [r1694]  Stevan_White:
+
+	* tools/test/findBackLayers.py (added),
+	  sfd/Makefile,
+	  tools/test/MES-Conformance (added),
+	  tools/test/MES-Conformance/CheckConformance.pl,
+	  tools/test/validate.py (added),
+	  tools/generate/MacTT (added),
+	  tools/findBackLayers.py (removed),
+	  tools/test/MES-Conformance/WGL4.lst,
+	  tools/report (added),
+	  tools/generate/TrueType (added),
+	  tools/MES-Conformance (removed),
+	  FreeSansOblique.sfd, tools/test
+	  (added), tools/ligatureLookups.py (removed),
+	  tools/validate.py (removed),
+	  FreeMonoOblique.sfd,
+	  FreeSerifItalic.sfd,
+	  tools/hex_range.py,
+	  FreeSerifBoldItalic.sfd,
+	  tools/generate (added),
+	  tools/test/MES-Conformance/MES-1.txt,
+	  tools/report/ligatureLookups.py (added),
+	  tools/test/MES-Conformance/MES-2.txt,
+	  tools/GenerateTrueType (removed),
+	  tools/freefont-ttf.spec,
+	  tools/generate/OpenType (added),
+	  FreeSansBold.sfd,
+	  tools/test/MES-Conformance/MES-3B.txt,
+	  FreeMono.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBold.sfd,
+	  tools/test/isMonoMono.py (added),
+	  tools/checkGlyphNumbers.py (removed),
+	  tools/ranges/__init__.py,
+	  tools/ranges/OpenType.py,
+	  tools/GenerateOpenType (removed),
+	  tools/KerningNumerals.pl,
+	  tools/test/MES-Conformance/MES-1.lst,
+	  FreeSansBoldOblique.sfd,
+	  tools/test/MES-Conformance/MES-2.lst,
+	  tools/test/MES-Conformance/mes-list-expand.pl,
+	  tools/test/MES-Conformance/MES-3B.lst,
+	  FreeMonoBoldOblique.sfd,
+	  tools/GenerateMacTT (removed),
+	  tools/test/checkGlyphNumbers.py (added),
+	  tools/isMonoMono.py (removed): Rearranged tools/
+	  directory. Made paths in sfd/Makefile agree with changes.
+
+2011-09-12 12:10 +0000 [r1693]  Stevan_White:
+
+	* FreeSerif.sfd: Latin Extended-B: adjusted
+	  Hungarian umlauts Dingbats: drew several characters to fill out
+	  range for Unicode 6
+
+2011-09-12 11:40 +0000 [r1692]  Stevan_White:
+
+	* FreeSans.sfd: Osmanya: corrected Unicode
+	  values Letterlike symbols: added one, made some references
+
+2011-09-02 12:07 +0000 [r1691]  Stevan_White:
+
+	* FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd: Control Pictures: U+2404 and
+	  U+2405 glyphs are reversed. This is due to the icons for them in
+	  FontForge being also reversed. in response to
+	  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=632746
+
+2011-09-02 01:15 +0000 [r1690]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: (really Persian) lookup
+	  tables added init, medi, fina lookups peh, tcheh, gaf and fina
+	  lookup for jeh In response to ubuntu bug report
+	  https://bugs.launchpad.net/ubuntu/+source/ttf-freefont/+bug/730770
+	  Not sure if this completely resolves the issue.
+
+2011-08-31 18:16 +0000 [r1689]  Stevan_White:
+
+	* FreeSerif.sfd: Letterlike Symbols: added a
+	  few, made better use of small caps for others
+
+2011-08-31 17:24 +0000 [r1688]  Stevan_White:
+
+	* tools/ranges/OpenType.py: mostly revised some
+	  comments
+
+2011-08-31 17:19 +0000 [r1687]  Stevan_White:
+
+	* FreeSerif.sfd: Miscellaneous Technical:
+	  several additions Supplemental Punctuation: several additions
+
+2011-08-29 23:44 +0000 [r1686]  Stevan_White:
+
+	* tools/ranges/OpenType.py: typos
+
+2011-08-27 20:23 +0000 [r1685]  Stevan_White:
+
+	* FreeSans.sfd: Osmanya: resolves bug #34155:
+	  FreeSans: Osmanya digits shifted two code positions
+	  https://savannah.gnu.org/bugs/index.php?34155
+
+2011-08-27 20:08 +0000 [r1684]  Stevan_White:
+
+	* FreeSans.sfd: Greek: added lunate letters
+
+2011-08-24 21:40 +0000 [r1683]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Mathematical Operators: added a
+	  few in sans, named a few in serif
+
+2011-08-24 11:30 +0000 [r1682]  Stevan_White:
+
+	* FreeSerifBold.sfd: Phonetic Extensions: more
+
+2011-08-24 10:11 +0000 [r1681]  Stevan_White:
+
+	* FreeSerifBold.sfd: Public Use: script-size
+	  latin Sup-sub: implemented with script-size letters Phonetic
+	  Extensions: filled in many of them
+
+2011-08-24 01:09 +0000 [r1680]  daniel_j:
+
+	* FreeSans.sfd: Added U+1400. Fixes bug #34008
+
+2011-08-17 20:05 +0000 [r1679]  Stevan_White:
+
+	* FreeSerifItalic.sfd: named a few characters
+
+2011-08-14 08:55 +0000 [r1677-1678]  Stevan_White:
+
+	* tools/ranges/OpenType.py: some changes to Latin
+	  Extended ranges
+
+	* tools/ranges/OpenType.py: added point for Bengali
+	  gandha mark
+
+2011-08-13 23:15 +0000 [r1676]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoBoldOblique.sfd: Currency Symbols:
+	  added a few more
+
+2011-08-13 19:53 +0000 [r1675]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Currency Symbols:
+	  added several
+
+2011-08-13 14:10 +0000 [r1674]  Stevan_White:
+
+	* FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd: Control Pictures: filled out
+	  range
+
+2011-08-12 08:59 +0000 [r1673]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Specials: filled out
+	  range
+
+2011-08-12 08:21 +0000 [r1672]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoOblique.sfd: Cyrillic, Extensions:
+	  added a few archaic letters, messed with accents
+
+2011-08-10 22:13 +0000 [r1671]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Super/Subscripts (mono and
+	  serif roman) re-design of super numerals. Phonetic ranges:
+	  fiddled a lot with superscript letters. Cyrillic: adjusted some
+	  marks especially on antiquated letters.
+
+2011-08-05 16:52 +0000 [r1670]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerif.sfd: Phonetic Extensions: some
+	  tweeks to small caps letters Subscripts and superscripts: tweeks
+
+2011-08-04 21:27 +0000 [r1669]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: superscripts,
+	  subscripts, diagonal fractions: all faces Re-thought and
+	  regularized positioning, fixed a few bugs. All the "superior"
+	  numerals and a few superscript latin letters got positioned so
+	  they go over the em height. Latin ordinals are positioned
+	  parallel to em height, and now both a and o are underlined in all
+	  faces. Diagonal fractions are likewise regularized.
+
+2011-07-31 13:42 +0000 [r1668]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: General Punctuation: remedy
+	  bug #33905: NARROW NO-BREAK SPACE too wide In one face u+202F was
+	  zero width, in others much too wide. Also: set both it and
+	  thinspace to 1/6 em.
+
+2011-07-23 21:38 +0000 [r1667]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: further simplification
+	  of ccmp tables
+
+2011-07-23 09:58 +0000 [r1666]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Latin: Better optical
+	  centering of j
+
+2011-07-22 20:25 +0000 [r1665]  Stevan_White:
+
+	* FreeSerif.sfd: Indic ranges, mostly Sinhala:
+	  attempts to get it working in Windows. Problem: some of the
+	  ligature lookups map to things that by themselves could not
+	  render properly. e, o and O vowels around consonents, especially.
+	  Seems layout engine in Linux is responsible for making it work in
+	  the past... Cleaned up some lookups. In other ranges, added
+	  script ranges for MS "new layout engine", e.g. dev2, bng2. Note:
+	  Malayalam is mlm2, not mly2 as in Fontforge.
+
+2011-07-18 20:45 +0000 [r1664]  Stevan_White:
+
+	* FreeSerif.sfd: Greek: filled out range for
+	  Unicode 6 special mark lookups for Greek re-named some characters
+
+2011-07-18 19:02 +0000 [r1663]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Made more to validate
+	  Corrected one more wrong unicode in small caps
+
+2011-07-18 18:11 +0000 [r1662]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd: Private Use:
+	  corrected small caps unicode SansBoldOblique: made to validate
+
+2011-07-18 17:58 +0000 [r1661]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Cyrillic Extended: finished
+	  4 new letters (normal face) Combining Diacritical Marks: lots of
+	  small tweeks. Latin: fiddled with a few accent marks Private Use:
+	  small caps glyphs corrected unicode Added missing single-digit
+	  diagonal fractions, with lookups Added lookup to remove longs
+	  from end of words. Still isn't right.
+
+2011-07-16 11:24 +0000 [r1660]  Stevan_White:
+
+	* notes/features.txt (added): Initial document about
+	  OpenType features used in FreeFont.
+
+2011-07-16 11:12 +0000 [r1659]  Stevan_White:
+
+	* FreeSerif.sfd: Non-unicode vulgar fractions
+	  (2/7, 5/9, etc) with 'frac' table entries
+
+2011-07-16 10:28 +0000 [r1658]  Stevan_White:
+
+	* FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Added glyph for zeroslash,
+	  and lookup 'zero' for it. Mono: added 'frac' lookup.
+
+2011-07-16 09:45 +0000 [r1657]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Correction to ccmp table
+	  for iogonek
+
+2011-07-16 08:38 +0000 [r1656]  Stevan_White:
+
+	* notes/maintenance.txt: put a title on it, a little
+	  re-wording of new paragraphs
+
+2011-07-16 08:33 +0000 [r1655]  Stevan_White:
+
+	* notes/maintenance.txt: Added section on doing
+	  tests.
+
+2011-07-15 12:34 +0000 [r1654]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Serif: Made the diacritical
+	  lookups previously reserved for Latin to be generic, removed
+	  special marks lookup for Greek/Coptic, use instead generic one.
+	  Added a couple of new letters to Latin Extended-D Bold: Fiddling
+	  with diactitics and marks. Something has gone very wrong with the
+	  lookups... still not clear what.
+
+2011-07-13 09:20 +0000 [r1653]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Combining Diacritical
+	  Marks: a bugfix and a few positioning tweeks
+
+2011-07-12 14:24 +0000 [r1652]  Stevan_White:
+
+	* FreeSans.sfd: *** empty log message ***
+
+2011-07-12 14:17 +0000 [r1651]  Stevan_White:
+
+	* FreeSans.sfd: Latin: all letters now have
+	  'above' mark.
+
+2011-07-12 14:04 +0000 [r1650]  Stevan_White:
+
+	* FreeSerif.sfd: Combining diacritical marks:
+	  fiddled with positioning
+
+2011-07-01 10:56 +0000 [r1648-1649]  Stevan_White:
+
+	* FreeSans.sfd: Hebrew: tweeks to vowel points
+
+	* FreeMono.sfd: Alphabetic Presentation Forms:
+	  widened Hebrew wide letters
+
+2011-07-01 07:59 +0000 [r1647]  Stevan_White:
+
+	* FreeSerif.sfd: Hebrew: tweaks to absolute
+	  placement of marks
+
+2011-06-30 22:47 +0000 [r1646]  Stevan_White:
+
+	* FreeSerif.sfd: Hebrew: small tweeks to
+	  cantillation marks, etc
+
+2011-06-30 11:47 +0000 [r1645]  Stevan_White:
+
+	* FreeSerif.sfd: Hebrew: lower cantillation
+	  marks to left of vowels
+
+2011-06-27 00:20 +0000 [r1644]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Hebrew: got rid of spurious
+	  tables.
+
+2011-06-27 00:06 +0000 [r1643]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Hebrew: got yidddish CCMP with
+	  yod and yodyod working in Serif
+
+2011-06-26 22:32 +0000 [r1642]  Stevan_White:
+
+	* FreeSans.sfd: Hebrew: issue with Yiddish vs
+	  std. Hebrew scripts for MARK lookups. Somehow gets very confused
+	  by specific ranges, in different ways on different systems.
+	  Disabled distinction between scripts.
+
+2011-06-26 18:20 +0000 [r1641]  Stevan_White:
+
+	* FreeSans.sfd: Hebrew: corrected side of above
+	  vowel. More vowel marks.
+
+2011-06-26 17:56 +0000 [r1640]  Stevan_White:
+
+	* FreeSerif.sfd: Hebrew: corrected placement of
+	  top vowel. fiddled with cantellatin marks.
+
+2011-06-25 17:27 +0000 [r1639]  Stevan_White:
+
+	* FreeSerif.sfd: Hebrew: further fiddling with
+	  points
+
+2011-06-25 14:49 +0000 [r1638]  Stevan_White:
+
+	* FreeSerif.sfd: Hebrew: more fiddling with
+	  vowel and cantillation points
+
+2011-06-25 11:12 +0000 [r1637]  Stevan_White:
+
+	* FreeSerif.sfd: Hebrew: more vowel and
+	  cantillation point marks
+
+2011-06-25 09:01 +0000 [r1636]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Hebrew: disabled distinction
+	  between Yiddish and Std. vowel marks
+
+2011-06-24 14:57 +0000 [r1635]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Removed angle
+	  brackets from licence text, because it caused some trouble for
+	  some buggy software, and the offsetting could be done better with
+	  a newline.
+
+2011-06-24 13:17 +0000 [r1634]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Hebrew: worked on MARK
+	  tables in Sans and Serif in response to further mails regarding
+	  bug 25887. Split one table up so lookups wre properly executed in
+	  both Yiddish and regular Hebrew. Some adjustment of letter
+	  spacing and punctuation in other faces.
+
+2011-06-12 07:14 +0000 [r1633]  Stevan_White:
+
+	* INSTALL, README: Fixed a couple of
+	  goofs
+
+2011-06-11 08:12 +0000 [r1632]  Stevan_White:
+
+	* INSTALL: General update: Esp. concerning OpenType
+	  support using FreeType2, and on Win 7 and Mac OS X.
+
+2011-06-11 08:07 +0000 [r1631]  Stevan_White:
+
+	* README: Removed remarks about how to install
+	  (better for INSTALL file) General re-phrasing and tidying.
+
+2011-06-10 09:34 +0000 [r1630]  Stevan_White:
+
+	* INSTALL: Correct name of X Windows system. Also
+	  added Microsoft and Apple to their product names for clarity and
+	  consistency.
+
+2011-06-10 09:31 +0000 [r1629]  Stevan_White:
+
+	* README: Correct name of X Window system. Added web
+	  page and contact info. Removed Primoz' e-mail.
+
+2011-06-08 11:34 +0000 [r1628]  Stevan_White:
+
+	* INSTALL: Removed remark about "cost", slight
+	  rewording, pursuant to discussion in bug #33449: INSTALL file not
+	  conform to FSF's policy
+
+2011-05-04 16:13 +0000 [r1627]  Stevan_White:
+
+	* tools/ranges/OpenType.py: new letters to Cyrillic
+	  Supplement
+
+2011-04-29 10:33 +0000 [r1626]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Latin: a few more small
+	  adjustments to accents
+
+2011-04-29 10:13 +0000 [r1625]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Latin: small adjustments to
+	  some accents
+
+2011-04-29 09:48 +0000 [r1624]  Stevan_White:
+
+	* notes/maintenance.txt: info about ssh keys on
+	  Savannah
+
+2011-02-03 21:13 +0000 [r1623]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Latin ^ Extensions:
+	  various fiddling with spacing and accents for greater uniformity.
+	  Also fixed a couple of errors.
+
+2011-02-02 21:33 +0000 [r1622]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Remedies bug #32326, about
+	  alignment for combining diacritics on dottedcircle Just put main
+	  'mark' anchors on the dottedcircle character.
+
+2011-01-30 13:28 +0000 [r1621]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Latin: Much fiddling
+	  with accents, also with width of accented i letters
+
+2011-01-29 18:19 +0000 [r1620]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Accents macron,
+	  acute, grave: made more consistent
+
+2011-01-29 17:37 +0000 [r1619]  Stevan_White:
+
+	* FreeSerif.sfd: Chess pieces: made all same
+	  width, and in a square
+
+2011-01-28 21:05 +0000 [r1618]  Stevan_White:
+
+	* FreeSans.sfd: Made grave, acute, and macron a
+	  little more consistent
+
+2011-01-26 20:28 +0000 [r1617]  Stevan_White:
+
+	* FreeSerifBold.sfd: Made a few accents more
+	  consistent, re bug #32220
+
+2011-01-25 22:03 +0000 [r1616]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Latin, Cyrillic, Greek: more
+	  toward bug #32220
+
+2011-01-24 22:54 +0000 [r1615]  Stevan_White:
+
+	* FreeSerif.sfd: Latin, Cyrillic: preferred
+	  acute, grave and dieresis to the spacing modifier versions,
+	  somewhat in response to bug #32220
+	  http://savannah.gnu.org/bugs/?32220
+
+2011-01-21 22:12 +0000 [r1614]  Stevan_White:
+
+	* FreeSerifBold.sfd: Sinhala: various tweeking
+	  of auxiliary glyphs to avoid self-intersection
+
+2011-01-19 00:21 +0000 [r1613]  Stevan_White:
+
+	* FreeSerifBold.sfd: as prev.
+
+2011-01-19 00:14 +0000 [r1612]  Stevan_White:
+
+	* FreeSerifBold.sfd: Sinhala: trying to make
+	  widths like those of normal
+
+2011-01-18 23:26 +0000 [r1610-1611]  Stevan_White:
+
+	* FreeSerifBold.sfd: Geometric Shapes: re-did
+	  dotted circle, made some triangles bigger. Singhala: slight
+	  modification to widths, to make it more like normal.
+
+	* FreeSerif.sfd: Geometric Shapes: felt some
+	  triangles were over-large. Scaled, and fiddled with their
+	  references
+
+2011-01-18 08:53 +0000 [r1609]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Copyright: corrected
+	  on Karl Berry's advice.
+
+2011-01-18 08:41 +0000 [r1608]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: kerning
+
+2011-01-16 13:24 +0000 [r1606-1607]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: fixed one
+	  self-intersection
+
+	* FreeSerifBold.sfd: Sinhala: Now ccmp tables
+	  are working. Improved many gloppy self-intersections in the main
+	  Unicode range, but many remain in the replacement area.
+
+2011-01-16 11:35 +0000 [r1605]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Copyright notice:
+	  included 2011
+
+2011-01-15 21:35 +0000 [r1604]  Stevan_White:
+
+	* FreeSerifBold.sfd: Sinhala: mostly emboldened
+	  the FreeSerif glphs by 30 en. Many glyphs are pretty gloppy. Also
+	  the rak descender isn't connecting properly.
+
+2011-01-15 17:24 +0000 [r1603]  Stevan_White:
+
+	* FreeSerif.sfd: Miscellaneous Mathematical
+	  Symbols-A Mathematical Operators: a few more additions
+
+2011-01-09 15:08 +0000 [r1602]  Stevan_White:
+
+	* tools/ranges/OpenType.py: corrected/updated a
+	  couple of OpenType ranges
+
+2011-01-09 12:58 +0000 [r1601]  Stevan_White:
+
+	* FreeSerif.sfd: Mathematical Symbols: replaced
+	  some outlines with references Miscellaneous Mathematical
+	  Symbols-A: added a few
+
+2011-01-08 23:56 +0000 [r1600]  Stevan_White:
+
+	* FreeSerif.sfd: Miscellaneous Mathematical
+	  Symbols A & B: more
+
+2011-01-08 14:24 +0000 [r1599]  Stevan_White:
+
+	* FreeSerif.sfd: Miscellaneous Mathematical
+	  Symbols-A Miscellaneous Mathematical Symbols-B Supplemental
+	  Mathematical Operators: a few more characters
+
+2011-01-08 13:02 +0000 [r1598]  Stevan_White:
+
+	* FreeSerif.sfd: Miscellaneous Math Symbols-A:
+	  added a few easy symbols
+
+2011-01-08 00:21 +0000 [r1597]  Stevan_White:
+
+	* FreeSerif.sfd: Supplemental Mathematical
+	  Operators: Miscellaneous Mathematical Operators-B: a few more
+	  symbols
+
+2011-01-06 22:03 +0000 [r1596]  Stevan_White:
+
+	* FreeSerif.sfd: Miscellaneous Mathematical
+	  Symbols-B: added some easy ones
+
+2011-01-03 20:50 +0000 [r1595]  Stevan_White:
+
+	* FreeSerifBold.sfd: Greek Extended: U+1FC3
+	  should not have had a tilde resolves bug #32041: Error in
+	  FreeSerifBold.ttf character U+1FC3 (8131)
+
+2010-10-31 23:35 +0000 [r1594]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Added c2sc tables, and smcp
+	  tables for Turkish (dotted vs dotted i distinction)
+
+2010-10-29 06:57 +0000 [r1593]  Stevan_White:
+
+	* FreeSerif.sfd: Currency: Indian Rupee courtesy
+	  of Daniel Johnson Named some of the other characters.
+
+2010-10-19 23:01 +0000 [r1592]  Stevan_White:
+
+	* FreeSansBoldOblique.sfd: Latin: a bit
+	  o'kerning
+
+2010-10-19 19:25 +0000 [r1591]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Filled in IBM
+	  Classifications
+
+2010-10-19 07:27 +0000 [r1590]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSerif.sfd: roman: Mahjong made dot rounder
+	  sans: corrected missing extrema on ssharp
+
+2010-10-18 19:02 +0000 [r1589]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Combining Diacritical
+	  Marks: completed range
+
+2010-10-17 10:16 +0000 [r1588]  Stevan_White:
+
+	* FreeMono.sfd: Combining Diacritical Marks:
+	  completed range
+
+2010-10-12 21:50 +0000 [r1587]  Stevan_White:
+
+	* FreeMono.sfd: Miscellaneous Symbols: drew a
+	  few more.
+
+2010-10-12 18:27 +0000 [r1586]  Stevan_White:
+
+	* FreeMono.sfd: Miscellaneous Symbols: Corrected
+	  comet, drew a snowman. Solves bug #31315
+	  (https://savannah.gnu.org/bugs/?31315)
+
+2010-10-11 22:01 +0000 [r1585]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Malayalam: mass rename of
+	  auxiliary glyphs in Public Use Area
+
+2010-10-11 21:14 +0000 [r1584]  Stevan_White:
+
+	* FreeSerif.sfd: Adjusted spacing of some
+	  conjunct letter parts.
+
+2010-10-10 23:22 +0000 [r1583]  Stevan_White:
+
+	* FreeSerif.sfd: Malayalam: Corrected a couple
+	  of glyph names.
+
+2010-10-10 08:58 +0000 [r1582]  Stevan_White:
+
+	* FreeSans.sfd: Incorporated the Meera_04 font,
+	  of the GPL project Swathanthra Malayalam Computing
+	  http://savannah.nongnu.org/projects/smc/ Copyright (c) 2007,
+	  Hussain K H, Suresh P, Swathanthra Malayalam Computing Drew
+	  several additions for the modern Unicode standard. Cleaned up
+	  many glyphs, and re-named those in the Unicode range.
+	  Re-connected the lookups for Chillu letters to point to those in
+	  Unicode, and deleted the counterparts in the auxiliary range.
+
+2010-10-10 08:48 +0000 [r1581]  Stevan_White:
+
+	* FreeSerif.sfd: Malayalam: Re-named some glyphs
+	  so the commonly used ones were shorter. pba_mal renamed to ba_mal
+	  chandrakkala renamed to candrakala Cleared NameMe_195551 as it
+	  did nothing Raised ascenders on both i_sign_mal and ii_sign_mal,
+	  and made the latter go over preceeding letter, based on other
+	  fonts and samples.
+
+2010-10-07 06:21 +0000 [r1580]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Armenian: Changed U+FB13-7
+	  to 'dlig' lookup, based on a native speaker telling me this is
+	  not normally seen in printed form, and on the last lines of sect
+	  7.7 of the Unicode standard. (sans face too will follow)
+
+2010-10-06 20:34 +0000 [r1579]  Stevan_White:
+
+	* FreeSerif.sfd: Bengali: cleaned up a few
+	  conjunct glyphs
+
+2010-10-06 18:59 +0000 [r1578]  Stevan_White:
+
+	* FreeSerif.sfd: Phonetic Extensions Supplement:
+	  Corrected AD9B, raised all superscripts to capital height.
+	  (Thanks to Emmanuel Vallois for noticing!)
+
+2010-10-06 18:43 +0000 [r1577]  Stevan_White:
+
+	* FreeSerif.sfd: Cyrillic Extended-B: Corrected
+	  Payerok (pajerok) A67D. (Thanks to Emmanuel Valois for pointing
+	  it out!)
+
+2010-10-06 18:28 +0000 [r1576]  Stevan_White:
+
+	* FreeSerif.sfd: Tamil: Corrected position of
+	  pulli over some letters. (Thanks to Emmanuel Valois for pointing
+	  it out!)
+
+2010-10-05 21:58 +0000 [r1575]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic: added some Pashto
+	  letters. Need init, final, medial forms.
+
+2010-10-05 19:40 +0000 [r1574]  Stevan_White:
+
+	* FreeSerif.sfd: Buginese: On advice of Emmanuel
+	  Vallois, corrected iya ligature per
+	  http://www.unicode.org/versions/Unicode5.2.0/ch11.pd
+
+2010-10-05 07:34 +0000 [r1573]  Stevan_White:
+
+	* FreeSerif.sfd: Buginese: added iya ligature
+	  based on WAZU test page
+	  http://www.wazu.jp/gallery/Test_Buginese.html
+
+2010-10-03 16:31 +0000 [r1572]  Stevan_White:
+
+	* FreeSerif.sfd: old-style numerals and lookup
+
+2010-10-03 15:47 +0000 [r1571]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: combining diacritical
+	  marks: More corrections, making dots on i and j to be replaced by
+	  mark.
+
+2010-10-03 10:19 +0000 [r1570]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: combining diacritical
+	  marks: in serif, made more marks to remove dot on i, j. Filled
+	  out range in nono-roman faces.
+
+2010-10-02 22:05 +0000 [r1569]  Stevan_White:
+
+	* FreeSerif.sfd: small-caps: tweeks
+
+2010-10-02 21:39 +0000 [r1568]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: ssharp: made thinner,
+	  deeper, and renamed
+
+2010-10-02 20:31 +0000 [r1567]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: small-caps: kerning
+
+2010-09-30 21:37 +0000 [r1566]  Stevan_White:
+
+	* FreeSerif.sfd: Tamil: rounded to int on the
+	  Private Use ligatures
+
+2010-09-30 18:55 +0000 [r1565]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Latin: a touch of kerning
+
+2010-09-29 22:16 +0000 [r1564]  Stevan_White:
+
+	* FreeMono.sfd: Braille Patterns: made the dots
+	  bigger
+
+2010-09-29 21:38 +0000 [r1563]  Stevan_White:
+
+	* FreeMono.sfd: Braille Patterns: Replaced to
+	  conform better to the Unicode Standard, sect. 15.10 and the
+	  Unicode glyph samples: like it or not, the dots are meant to be
+	  hollow and filled, representing 'off' and 'on'. All now reference
+	  auxiliary characters, for consistency and flexibility.
+
+2010-09-28 23:16 +0000 [r1562]  Stevan_White:
+
+	* FreeSansBold.sfd: small caps
+
+2010-09-28 08:21 +0000 [r1561]  Stevan_White:
+
+	* FreeSerifBold.sfd: small caps: Touch-ups
+
+2010-09-27 20:02 +0000 [r1560]  Stevan_White:
+
+	* FreeSerifBold.sfd: small caps
+
+2010-09-26 16:50 +0000 [r1559]  Stevan_White:
+
+	* FreeSerifBold.sfd: Added PS Private OtherBlues
+
+2010-09-26 10:55 +0000 [r1558]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Latin: tweeked a couple
+	  of stacked accents
+
+2010-09-26 09:52 +0000 [r1557]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: More revision of
+	  spacing and letter forms. Still lots to do.
+
+2010-09-25 23:13 +0000 [r1556]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: kerning for African
+	  characters
+
+2010-09-25 22:54 +0000 [r1555]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd: Latin: spacing and glyph form
+	  tweeks in Extended-C and IPA for African scripts. Re-worked
+	  upsilonlatin in serif roman.
+
+2010-09-25 18:36 +0000 [r1554]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Latin Extended-B:
+	  re-worked Oi, oi, and yhook; kerning and other tweeks for African
+	  scripts.
+
+2010-09-25 14:04 +0000 [r1553]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: lookups for Latin as
+	  in serif, to deal with accented i and the dot.
+
+2010-09-25 13:39 +0000 [r1552]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Latin: tweeked kerning
+	  and spacing, especially of apostrophe and quotes.
+
+2010-09-25 12:22 +0000 [r1551]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: IPA Extensions: Completed
+	  range in bold italic. bold: characters with low right hook, made
+	  not so extreme yhook: made narrower by bending right arm in a
+	  bit. replacement lookups for i with accents and i-ogonek with
+	  accents, so that accents replace the dot rather than floating
+	  over it.
+
+2010-09-23 22:17 +0000 [r1550]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: more fiddling with
+	  letter forms and spacing
+
+2010-09-23 20:24 +0000 [r1549]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: blues values: made descender
+	  value a bit wider (also did this in previous commit to bold
+	  italic. Latin: more adjustments and corrections of hastily drawn
+	  glyphs.
+
+2010-09-23 19:27 +0000 [r1548]  Stevan_White:
+
+	* FreeSerif.sfd: Latin: Addressed several issues
+	  pointed out by Daniel Johnson concerning African and Navaho
+	  samples.
+
+2010-09-23 08:25 +0000 [r1547]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd: Latin: Re-worked
+	  various glyphs for consistency (mostly they appeared to have been
+	  skewed versions from bold--or worse). Still more to be done here.
+
+2010-09-22 22:20 +0000 [r1546]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Latin: some marks for
+	  African languages
+
+2010-09-22 22:04 +0000 [r1545]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: various measures to
+	  improve the look of African-language samples. Kerned several
+	  letters in IPA Extensions range. Adjusted spacing of several
+	  letters. Re-worked Eng a bit, as well as gammalatin. Put some new
+	  letters in bold italic.
+
+2010-09-22 08:42 +0000 [r1544]  Stevan_White:
+
+	* FreeSans.sfd: Latin Extended Additional: added
+	  four letters small caps: made basic set and smcp lookup table
+
+2010-09-22 06:09 +0000 [r1543]  Stevan_White:
+
+	* Makefile: Was putting ttf files into the otf
+	  tarball. One character fixes it.
+
+2010-09-21 19:34 +0000 [r1541-1542]  Stevan_White:
+
+	* FreeSerif.sfd: Latin Extended-C: three new
+	  letters; two are additions for Shona
+
+	* tools/ranges/OpenType.py: three new letters in
+	  Latin Extended-C range
+
+2010-09-21 19:16 +0000 [r1540]  Stevan_White:
+
+	* FreeSerif.sfd: small caps: forms for
+	  Vietnamese lookup tables for accessing alternate forms in Greek
+	  and in Latin
+
+2010-09-21 08:29 +0000 [r1539]  Stevan_White:
+
+	* FreeSerif.sfd: small caps: tweeked spacing
+
+2010-09-20 22:45 +0000 [r1538]  Stevan_White:
+
+	* FreeSerif.sfd: Small caps replacements for
+	  Latin, with the smcp table to do it. (Haven't seen this actually
+	  function yet... )
+
+2010-09-19 13:22 +0000 [r1536]  Stevan_White:
+
+	* FreeSerifBold.sfd: Fixed validation problem.
+
+2010-09-19 13:15 +0000 [r1535]  Stevan_White:
+
+	* ChangeLog: today's commits
+
+2010-09-19 12:40 +0000 [r1534]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: Fixed one lookup table
+	  mistake, and a couple of glpyh omissions, that Harshula pointed
+	  out.
+
+2010-09-19 11:48 +0000 [r1533]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Sans: Applied Daniel
+	  Johnsons improvement to capital Eng to Sans, as described in
+	  previous commits.
+
+2010-09-19 10:32 +0000 [r1532]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Coptic: added alphabet to
+	  bold. Accent marks not working -- a mystery. Some tweeks in
+	  medium face as well. glyph cleanup -- points too close, some
+	  glyphs outside bounding boxes.
+
+2010-09-18 08:50 +0000 [r1531]  Stevan_White:
+
+	* tools/ligatureLookups.py: mostly code style
+	  improvements
+
+2010-09-18 07:54 +0000 [r1529-1530]  Stevan_White:
+
+	* tools/ligatureLookups.py: mostly code tidying
+
+	* ChangeLog: added latest changes, and also changes
+	  to the tools/ directory since 2008
+
+2010-09-17 18:38 +0000 [r1528]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: tightened up left side
+	  of na and derivatives.
+
+2010-09-17 08:27 +0000 [r1527]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: tighened up left sides
+	  of u, lla, na, dha, ndha, nya, jnya
+
+2010-09-17 08:09 +0000 [r1526]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: tightened up some of
+	  the vowel conjuncts, and left side of nna.
+
+2010-09-16 20:05 +0000 [r1525]  Stevan_White:
+
+	* FreeSerif.sfd: Coptic: fiddled about with
+	  letter forms, striving for a kind of consistency. Sinhala:
+	  Harshula noticed four incorrect combined forms. Fixed these.
+
+2010-09-16 08:09 +0000 [r1524]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Latin Extended-A:
+	  Applied Daniel Johnson's patch that made two versions of capital
+	  Eng. His explanation: ' http://en.wikipedia.org/wiki/%C5%8A The
+	  form of capital Eng currently in all three FreeFont faces is that
+	  used by the Sami people, resembling a capital N with a hooked
+	  right descender. However, the form preferred for African and
+	  Amerindian languages resembles a tall lowercase n with a hook
+	  that almost meets the left vertical. (See wikipedia link above
+	  for a visual.) Recommend moving the existing Sami-style Eng to a
+	  PUA or non-Unicode slot, creating African-style Eng at U+014A,
+	  and adding a LOCL table with substitution rules for Inari Sami
+	  (ISM), Lule Sami (LSM), Northern Sami (NSM) and Skolt Sami (SKS).
+	  ' Latin Extended-B: Also in his patch: added U+0220 (Latin
+	  Capital Letter N with long leg)
+
+2010-09-15 17:02 +0000 [r1523]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin for Sami: Daniel
+	  Johnson's patch added alternative form of Eng for African
+	  languages and a 'local' table for the Sami form.
+
+2010-09-15 16:23 +0000 [r1522]  Stevan_White:
+
+	* notes/maintenance.txt: Updated upload and release
+	  procedures.
+
+2010-09-15 08:05 +0000 [r1521]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: regularized kundaliya
+	  a bit.
+
+2010-09-15 07:24 +0000 [r1520]  Stevan_White:
+
+	* FreeSans.sfd: Put stray lookup into its proper
+	  subtable.
+
+2010-09-14 23:24 +0000 [r1519]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: re-named a few more
+	  ligature glyphs, for consistency
+
+2010-09-14 22:50 +0000 [r1518]  Stevan_White:
+
+	* FreeSans.sfd: Gurmukhi: improved some names of
+	  ligature glyphs, and found one apparently doubled table entry
+	  (kagurmukhi_nuktagurmukhi.nukt now gur_ka.nukt)
+
+2010-09-14 22:17 +0000 [r1517]  Stevan_White:
+
+	* tools/GenerateTrueType: prev. commit had one space
+	  too many
+
+2010-09-14 22:08 +0000 [r1516]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerif.sfd: Various measures to fix
+	  problems FontForge Find Problems reports under ATT, including a
+	  mass glyph rename of Sinhala ligatures.
+
+2010-09-14 13:02 +0000 [r1514-1515]  Stevan_White:
+
+	* tools/ranges.py,
+	  tools/hex_range.py,
+	  tools/findBackLayers.py,
+	  tools/ranges/OpenType.py,
+	  tools/GenerateTrueType,
+	  tools/GenerateOpenType,
+	  tools/range_report.py,
+	  tools/ligatureLookups.py,
+	  tools/validate.py,
+	  tools/GenerateMacTT,
+	  tools/checkGlyphNumbers.py,
+	  tools/isMonoMono.py,
+	  tools/nameBySlot.py: Added license and other tags
+	  to python files.
+
+	* Makefile: target for tarball for OpenType
+
+2010-09-13 19:21 +0000 [r1513]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoOblique.sfd: Cyrillic: A few more old
+	  letters.
+
+2010-09-13 08:25 +0000 [r1512]  Stevan_White:
+
+	* tools/ranges/OpenType.py: updated some Web links.
+
+2010-09-12 22:57 +0000 [r1511]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Supplemental
+	  Punctuation: One character for consistency with other faces.
+
+2010-09-12 21:18 +0000 [r1510]  Stevan_White:
+
+	* FreeSans.sfd, FreeMono.sfd:
+	  Control Pictures: Added because it was easy.
+
+2010-09-12 20:49 +0000 [r1509]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Alphabetic
+	  Presentation Forms: filled out range in sans faces.
+
+2010-09-12 19:55 +0000 [r1508]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBoldOblique.sfd: Cleared hints.
+
+2010-09-12 19:43 +0000 [r1507]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Dozens of measures to
+	  pass general validation tests, including . cleanup of many glyphs
+	  for extrema and self-intersection problmes . re-naming glyphs
+	  whose PS names are too long. . removing blank glyphs . giving
+	  Unicode points to glyphs missing them. There are still a few
+	  lookup table issues in FreeSerif and FreeSans though.
+
+2010-09-12 18:42 +0000 [r1505-1506]  Stevan_White:
+
+	* tools/nameBySlot.py: Corrected output for high
+	  Unicode.
+
+	* tools/checkGlyphNumbers.py: Made aware of special
+	  TrueType slots.
+
+2010-09-12 16:50 +0000 [r1504]  Stevan_White:
+
+	* FreeSerif.sfd: Re-named some of the Sinhala
+	  lookups in somewhat better way. Control Pictures: added a bunch
+	  (but... is it worth it?)
+
+2010-09-12 15:01 +0000 [r1503]  Stevan_White:
+
+	* tools/range_report.py: Added a Private Use total
+	  and better explanation of totals generally. Some code clean-up.
+
+2010-09-11 13:24 +0000 [r1500-1502]  Stevan_White:
+
+	* ChangeLog: The sfd changes since the last release
+
+	* AUTHORS, CREDITS: Added some recent
+	  contributors
+
+	* tools/ranges/OpenType.py: made not to complain
+	  about extra TrueType characters.
+
+2010-09-11 09:52 +0000 [r1499]  Stevan_White:
+
+	* FreeSerif.sfd: Coptic: Widened bowl of Khei.
+
+2010-09-11 09:48 +0000 [r1498]  Stevan_White:
+
+	* FreeSerif.sfd: Coptic: deepened descenders of
+	  small letters to same depth as in Latin Expanded bowl of Fei and
+	  fei to resemble other samples.
+
+2010-09-10 21:38 +0000 [r1497]  Stevan_White:
+
+	* FreeSerif.sfd: Cyrillic: mostly positioning of
+	  marks for old Cyrillic alphabets
+
+2010-09-10 08:05 +0000 [r1496]  Stevan_White:
+
+	* FreeSerif.sfd: Coptic: Replaced acoptic with
+	  something more dramatic, fiddled with kerning, tidied some other
+	  letters
+
+2010-09-08 22:50 +0000 [r1495]  Stevan_White:
+
+	* AUTHORS, CREDITS: mention of recent
+	  additions
+
+2010-09-08 22:18 +0000 [r1494]  Stevan_White:
+
+	* FreeSerifBold.sfd: Block Elements: replaced
+	  long-missing shade blocks
+
+2010-09-08 22:12 +0000 [r1493]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Block Elements: replaced
+	  long-missing shade blocks
+
+2010-09-08 08:18 +0000 [r1492]  Stevan_White:
+
+	* tools/range_report.py: More explanation in output.
+
+2010-09-08 07:41 +0000 [r1491]  Stevan_White:
+
+	* tools/ranges/OpenType.py,
+	  tools/range_report.py: another consistency check
+	  added UCAS Extended range
+
+2010-09-07 18:30 +0000 [r1490]  Stevan_White:
+
+	* FreeSerif.sfd: Buginese: lookup tables and
+	  glyphs to re-order vowels, courtesy of Mohammad Anwari.
+
+2010-09-07 17:39 +0000 [r1489]  Stevan_White:
+
+	* FreeSans.sfd: Osmanya: courtesy of Daniel
+	  Johnson. Note this script is slanted in every sample I've seen.
+	  That is justification enough that the glyphs in this range look
+	  slated, although the face isn't oblique.
+
+2010-09-07 17:19 +0000 [r1488]  Stevan_White:
+
+	* FreeSans.sfd: UCAS Extended: by Daniel Johnson
+
+2010-09-07 16:43 +0000 [r1487]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: complete replacement
+	  of range with glyphs extracted more directly from Yannis
+	  Haralambous' sinha TeX font (last version was also derived from
+	  this font, but had undergone detrimental processing). Implements
+	  "rak" glyphs using three GSUB lookup steps.
+
+2010-09-04 23:52 +0000 [r1486]  Stevan_White:
+
+	* FreeSerif.sfd: Fix for FontForge warning (v
+	  20090923) "On Windows many apps will have problems with this
+	  font's kerning, because because 58 of its glyph kern pairs cannot
+	  be mapped to unicode-BMP kern pairs" This was due to kern tables
+	  for the Musical Symbols range, which isn't in the Unicode Basic
+	  Multilingual Plane. Removed this lookup. Might consider another
+	  way to position these symbols.
+
+2010-08-29 22:59 +0000 [r1485]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: patch by Harshula
+	  Jayasuriya to correct the writing system direction in some
+	  lookups.
+
+2010-08-29 22:52 +0000 [r1484]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Currency Symbols: additions
+	  and tweeking
+
+2010-08-24 19:15 +0000 [r1483]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: added one ligature
+	  glyph, from Harshula Jayasuriya
+
+2010-08-20 20:19 +0000 [r1482]  Stevan_White:
+
+	* FreeSerif.sfd: Resolves class of validation
+	  problems in Sinhala: Bad Glyph Name. This is a FontForge bug,
+	  that appears when certain types of problems occur in the glyph
+	  contours. Probably an arithmetic error causes some corruption.
+
+2010-08-20 18:17 +0000 [r1481]  Stevan_White:
+
+	* FreeSerif.sfd: corrected missing extrema in
+	  recent Latin Extended-D range
+
+2010-08-20 17:56 +0000 [r1480]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: re-did previous patch
+	  using a more recent one. Un-did some other glyph changes that
+	  didn't help much anyway.
+
+2010-08-20 11:05 +0000 [r1479]  Stevan_White:
+
+	* FreeMono.sfd: Named letters in several
+	  ranges... should write a script for this...
+
+2010-08-20 09:52 +0000 [r1478]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Added full GNU
+	  copyright announcement to TT Names. Updated Copyright date.
+
+2010-08-20 09:16 +0000 [r1477]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: Applied a patch from
+	  Harshula Jayasuriya, improving glyph names. I tried to tidy up
+	  some of the glyphs, but it's a big job... Latin Extended B: fixed
+	  one case of missing extrema
+
+2010-08-18 09:48 +0000 [r1476]  Stevan_White:
+
+	* FreeSerif.sfd: Latin Extended-D: yet a few
+	  more easily made letters
+
+2010-08-18 09:32 +0000 [r1475]  Stevan_White:
+
+	* FreeSerif.sfd: Latin Extended-D: made a few
+	  more letters
+
+2010-08-09 06:34 +0000 [r1474]  Stevan_White:
+
+	* FreeSerif.sfd: Supplemental Arrows-A:
+	  completed
+
+2010-08-09 05:50 +0000 [r1473]  Stevan_White:
+
+	* FreeSerif.sfd: Arrows: completed
+
+2010-08-08 22:38 +0000 [r1472]  Stevan_White:
+
+	* FreeSerif.sfd: Added more Arrows
+
+2010-08-04 17:43 +0000 [r1471]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoBoldOblique.sfd: Combining Diacritics:
+	  some additions in BoldOblique, corrections in other faces.
+	  Several improvements to Greek letter forms in BoldOblique
+
+2010-08-03 21:59 +0000 [r1470]  Stevan_White:
+
+	* FreeMonoBold.sfd: Arrows, a few math
+	  operators, and one more combining diacritical
+
+2010-08-03 16:03 +0000 [r1469]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd: Added some combining
+	  diacriticals to bold, touched up some spacing modifiers. Minor
+	  corrections to roman.
+
+2010-08-03 15:06 +0000 [r1468]  Stevan_White:
+
+	* FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Marks, spacing
+	  modifier letters: corrected placement of marks, added some
+	  spacing modifier letters and combining marks.
+
+2010-08-03 12:53 +0000 [r1467]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Better Vietnamese
+	  support, using 'ccmp' and 'mark' lookup tables. MonoBoldOblique:
+	  added Extended Latin ranges
+
+2010-08-03 09:12 +0000 [r1466]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Vietnamese: Much adjustment
+	  of horn letters, also general adjustemen of marks
+
+2010-08-02 21:49 +0000 [r1465]  Stevan_White:
+
+	* FreeSerif.sfd: Vietnamese: inadvertently broke
+	  the main face. This fixes it.
+
+2010-08-02 18:25 +0000 [r1464]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Vietamese: In roman and
+	  sans, lookups are basically functional now. Used 'ccmp' Ligature
+	  Substitution to form stacked marks (inasmuch as glyphs for the
+	  stacked Unicode codepoints are available) Adjusted positioning of
+	  some marks. Named many letters and combining marks. roman italic.
+	  Re-designed horn of O and U. Other roman faces could also benefit
+	  from a horn job.
+
+2010-08-02 09:43 +0000 [r1462-1463]  Stevan_White:
+
+	* tools/ranges/OpenType.py: Correction regarding NKo
+	  range.
+
+	* tools/range_report.py: made not to complain about
+	  special TrueType slots 0x00, 0x01, 0x0D
+
+2010-08-02 08:38 +0000 [r1461]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd: roman: correction to one math
+	  operator mono: Mathematical Operators complete (up to some
+	  pre-5.2 Unicode version)
+
+2010-08-01 22:01 +0000 [r1460]  Stevan_White:
+
+	* FreeMono.sfd: Mathematical Symbols: range
+	  nearly finished
+
+2010-08-01 17:17 +0000 [r1459]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd: roman: corrected direction of 2
+	  math operators mono: added several math operators
+
+2010-08-01 14:04 +0000 [r1458]  Stevan_White:
+
+	* FreeSerif.sfd: more improvements to marks for
+	  Vietnamese
+
+2010-08-01 13:25 +0000 [r1457]  Stevan_White:
+
+	* FreeSerif.sfd: Worked on mark positioning for
+	  Vietnamese, Cyrillic
+
+2010-07-30 11:59 +0000 [r1456]  Stevan_White:
+
+	* FreeMono.sfd: Reduced height of two-part
+	  Summation symbols https://savannah.gnu.org/bugs/?23064
+
+2010-07-30 10:53 +0000 [r1455]  Stevan_White:
+
+	* FreeSerif.sfd: Added some Miscellaneous
+	  Technical Symbols
+
+2010-07-30 09:24 +0000 [r1454]  Stevan_White:
+
+	* FreeMono.sfd: Corrected U+2626 Orthodox Cross
+	  https://savannah.gnu.org/bugs/?27579#discussion
+
+2010-07-29 19:29 +0000 [r1453]  Stevan_White:
+
+	* FreeSerif.sfd: Put in some scan lines
+	  23BA-23BD, based on 2500, as discussed in
+	  https://savannah.gnu.org/bugs/?23064 I still have no idea what
+	  the application for these glyphs would be...
+
+2010-07-17 20:07 +0000 [r1452]  Stevan_White:
+
+	* FreeSerif.sfd: added mark anchors for acute,
+	  grave in cyrillic (other faces already had them)
+
+2010-07-13 12:30 +0000 [r1451]  Stevan_White:
+
+	* FreeMono.sfd: Made germandbls (ess-zet) a bit
+	  wider, moved a bit to left
+
+2010-07-10 20:42 +0000 [r1450]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Resolves bug 30344: "Greek
+	  Final Sigma could be shortened"
+	  https://savannah.gnu.org/bugs/index.php?30344 Problem only
+	  affected roman, but touched up other faces anyway.
+
+2010-05-30 16:20 +0000 [r1449]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin-extended-B: fiddled
+	  with some of the horizontal strokes
+
+2010-05-29 16:22 +0000 [r1448]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: accents on ogonek
+	  letters (for Navaho) a little adjustment of apostrophe (Navaho,
+	  Hawaiian)
+
+2010-05-29 15:05 +0000 [r1447]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin mark problems * low
+	  dots in bold uneven * ring in bold smaller than in roman, and not
+	  heavier * apostrophe in italic too far to right (Navaho,
+	  Hawaiian)
+
+2010-05-29 09:19 +0000 [r1446]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: fixed problems with
+	  various marks: ogonek, hook, comma below, some kerning, esp. of
+	  non-ascii characters
+
+2010-05-29 07:39 +0000 [r1445]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Sans: made dot accents same
+	  height as i-dot, kerned y with comma Both: made low comma accent
+	  lower, smaller (esp. for Romanian)
+
+2010-05-27 19:13 +0000 [r1444]  Stevan_White:
+
+	* FreeSans.sfd: Latin: make caron of more
+	  uniform height
+
+2010-05-27 18:58 +0000 [r1443]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd: Latin: made ring accent
+	  heavier, esp. for Swedish
+
+2010-05-27 18:41 +0000 [r1442]  Stevan_White:
+
+	* FreeSans.sfd: Latin: i was somehow displaced,
+	  dotlessi was much too wide for Turkish
+
+2010-05-10 20:17 +0000 [r1441]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Latin: kerning tweeks
+
+2010-05-09 18:54 +0000 [r1440]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: As discussed in
+	  freefont-bugs mailing list, Thu, May 6, 2010 "FreeMono affected
+	  by OS X 10.6 nested character references bug" reduced reference
+	  nesting in multiple quote characters, as a courtesy to Mac OS
+	  10.6 users, who suffer from a bug.
+
+2010-05-03 22:52 +0000 [r1439]  Stevan_White:
+
+	* FreeSerif.sfd: Latin: kerning tweeks
+
+2010-05-03 20:51 +0000 [r1438]  Stevan_White:
+
+	* FreeSerifBold.sfd: Latin: spacing of round
+	  small letters, kerning tweeks, fiddled with ligatures
+
+2010-04-17 19:38 +0000 [r1437]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Daniel Johnson improved
+	  Cherokee Da
+
+2010-04-10 12:03 +0000 [r1436]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoBold.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Emboldened underscore
+	  and related glyphs. Resolves issue 22999
+	  https://savannah.gnu.org/bugs/index.php?22999 Low line (005F) in
+	  bold fonts do not have heavier weight
+
+2010-04-09 18:55 +0000 [r1435]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Serif: Added Thai TTF names
+
+2010-04-08 20:44 +0000 [r1434]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Corrected some
+	  language names A bit o kerning
+
+2010-04-08 20:20 +0000 [r1433]  Stevan_White:
+
+	* FreeSerifBold.sfd: Fixed problem with name.
+	  This should be the same as before the revision except for the
+	  fix. The KDE font installer was saying this face was incorrectly
+	  named Free Serif Bold Italic, but this wasn't quite correct. One
+	  of the other language names said it was named Free Serif Halvfett
+	  Kursiv, which conflicted with that language name for the real
+	  Free Serif Bold Italic.
+
+2010-04-08 17:26 +0000 [r1432]  Stevan_White:
+
+	* FreeSerifBold.sfd: regression: for some
+	  unknown reason, previous release gets built so that my system
+	  thinks it is Free Serif Bold Italic. This is a mystery. There is
+	  nothing about Italic in the file.
+
+2010-04-06 19:33 +0000 [r1431]  Stevan_White:
+
+	* sfd/Makefile: Made graceful in absence of
+	  Fontforge
+
+2010-03-29 20:47 +0000 [r1430]  Stevan_White:
+
+	* FreeSerifBold.sfd: Adjusted some accent marks,
+	  named a few characters
+
+2010-03-25 21:05 +0000 [r1429]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: added Ukrainian TTF
+	  names
+
+2010-03-24 23:40 +0000 [r1428]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: added bahasa
+	  indonesian TTF names
+
+2010-03-21 12:27 +0000 [r1427]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Added several TTF
+	  Names. (Need to check with native speakers.)
+
+2010-03-20 11:39 +0000 [r1426]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Fill out TTF Names tables
+	  regarding font names
+
+2010-03-19 08:37 +0000 [r1425]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Removed TTF Names for
+	  'sample text' and all 'license URL' except English, 1) in
+	  response to FontForge complain that large names tables conflict
+	  with recent Windows patches 2) because they are redundant and
+	  inappropriate (Hope to post the list of sample texts elsewhere,
+	  because I like the idea.)
+
+2010-03-02 08:13 +0000 [r1424]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Latin standard
+	  ligatures: in non-bold, promoted dlig to liga. Put standard Dutch
+	  IJ in all; Adjusted spacing a bit
+
+2010-02-28 13:04 +0000 [r1423]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBold.sfd: Cyrillic: further revision
+	  of spacing, in direction of loosening. bold ze was strangely
+	  thin; made bolder.
+
+2010-02-27 11:45 +0000 [r1422]  Stevan_White:
+
+	* FreeSerif.sfd: Cyrillic: reviewed spacing of
+	  whole range, generally loosened slightly tidied a couple of ugly
+	  glyphs
+
+2010-02-09 19:34 +0000 [r1421]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd: tweeks to kerning in
+	  Latin
+
+2010-02-09 18:40 +0000 [r1420]  Stevan_White:
+
+	* FreeSerifBold.sfd: Tweeks to kerning in Latin
+
+2010-01-28 08:20 +0000 [r1419]  Stevan_White:
+
+	* tools/isMonoMono.py: Implement FontForge handling
+	  of magic characters .notdef, .null, nonmarkingreturn at 0x0000
+	  0x0001 0x000D
+
+2010-01-27 22:48 +0000 [r1418]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Improved magic
+	  characters for FreeMono, inserted them for other faces
+	  https://savannah.gnu.org/bugs/index.php?28742
+
+2010-01-27 21:24 +0000 [r1417]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Added at 0x0000
+	  0x0001 0x000D characters .notdef .null nonmarkingreturn These are
+	  NOT UNICODE they are to satisfy an essentially undocumented
+	  "feature" of FontForge, ( in source tottf.c, AssignNotdefNull() )
+	  And a funny strong suggestion of TrueType fonts, that they begin
+	  with three special characters (evidently different from encoding
+	  slots) http://www.microsoft.com/typography/otspec/recom.htm
+	  FontForge looks for these glyphs in certain places and copies
+	  them. Otherwise, apparently, it will find a glyph elsewhere
+	  (unclear how) and copy it there, possibly resulting in something
+	  quite wrong (such as a non-monospace font). The three are copied
+	  to the end of TTF fonts (only one to the end of OTF fonts)
+
+2009-12-30 23:25 +0000 [r1416]  Stevan_White:
+
+	* FreeSans.sfd: Tamil: deletd Unicode range due
+	  to absence of necessary ligatures
+
+2009-12-30 23:01 +0000 [r1415]  Stevan_White:
+
+	* FreeSerifBold.sfd: Cyrillic tweek to spacing
+
+2009-12-29 21:01 +0000 [r1414]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Gurmukhi: added 2 characters
+	  to complete range
+
+2009-12-29 20:40 +0000 [r1413]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Devanagari: filled out sans,
+	  some corrections in serif
+
+2009-12-29 01:42 +0000 [r1412]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: Drew and
+	  constructed glyphs to complete range.
+
+2009-12-28 19:00 +0000 [r1411]  Stevan_White:
+
+	* AUTHORS, CREDITS: added credits for
+	  recent additions
+
+2009-12-28 18:36 +0000 [r1410]  Stevan_White:
+
+	* tools/ranges/OpenType.py: Added/corrected some
+	  ranges
+
+2009-12-27 16:25 +0000 [r1405-1409]  Stevan_White:
+
+	* tools/MES-Conformance/WGL4.lst (added),
+	  tools/MES-Conformance (added),
+	  tools/MES-Conformance/MES-1.txt (added),
+	  tools/MES-Conformance/MES-2.txt (added),
+	  tools/MES-Conformance/CheckConformance.pl (added),
+	  tools/MES-Conformance/MES-1.lst (added),
+	  tools/MES-Conformance/MES-2.lst (added),
+	  tools/MES-Conformance/MES-3B.txt (added),
+	  tools/MES-Conformance/mes-list-expand.pl (added),
+	  tools/MES-Conformance/MES-3B.lst (added): Moved
+	  Primoz' conformance tools (dated 2002) to a more comfortalbe
+	  directory.
+
+	* tools/MES-3B.lst (removed),
+	  tools/GenerateTrueType,
+	  tools/WGL4.lst (removed),
+	  tools/MES-1.txt (removed),
+	  tools/MES-2.txt (removed),
+	  tools/CheckConformance.pl (removed),
+	  tools/MES-1.lst (removed),
+	  tools/MES-2.lst (removed),
+	  tools/MES-3B.txt (removed),
+	  tools/mes-list-expand.pl (removed): disabled build
+	  of Mac TT
+
+	* tools/ligatureLookups.py: better sanity check
+
+	* tools/range_report.py: more generic title
+
+	* tools/ranges/OpenType.py: correction to Tamil
+
+2009-12-27 13:56 +0000 [r1404]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Resolves bug #23049
+	  Replacement character (U+FFFD) not properly styled
+	  https://savannah.gnu.org/bugs/index.php?23049
+
+2009-12-27 01:47 +0000 [r1403]  Stevan_White:
+
+	* FreeSerif.sfd: Devanagari: added letters,
+	  completing Unicode range
+
+2009-12-27 01:06 +0000 [r1402]  Stevan_White:
+
+	* FreeSerif.sfd: Tamil: added 2 monster glyphs,
+	  completing range (0bc1-2 still questionable)
+
+2009-12-26 18:14 +0000 [r1401]  Stevan_White:
+
+	* FreeSerif.sfd: Tamil: a few more symbols. Only
+	  a couple of monster signs still missing, and a couple of marks
+	  seem just wrong...
+
+2009-12-26 17:03 +0000 [r1400]  Stevan_White:
+
+	* FreeSerif.sfd: Tamil: added digits
+
+2009-12-26 15:40 +0000 [r1399]  Stevan_White:
+
+	* FreeSans.sfd: Tamil: completed digits, added
+	  some other chars
+
+2009-12-26 14:12 +0000 [r1398]  Stevan_White:
+
+	* FreeSerif.sfd: Malayalam: completed Unicode
+	  range, also moving some Chillu letters from Private Use area to
+	  Unicode, and re-establishing ligatures
+
+2009-12-26 00:38 +0000 [r1397]  Stevan_White:
+
+	* FreeSerif.sfd: Indic ranges: named lots of
+	  characters Tamil: corrected and added a few letters
+
+2009-12-24 23:56 +0000 [r1396]  Stevan_White:
+
+	* FreeSans.sfd: Indic ranges, esp. Devanagari:
+	  added several new Unicode (not yet complete) tidied letters
+	  Bengali: tidying, made some refs
+
+2009-12-24 18:29 +0000 [r1395]  Stevan_White:
+
+	* FreeSans.sfd: Indic ranges: named most of the
+	  Unicode characters Tried to improve a few bad names for ligatures
+	  in Private Use Area Made a few references: not clearly an
+	  improvement. This stuff is still a mess...
+
+2009-12-24 15:19 +0000 [r1394]  Stevan_White:
+
+	* FreeSans.sfd: Devanagari: added an obviously
+	  missing nukta ligature
+
+2009-12-24 14:36 +0000 [r1393]  Stevan_White:
+
+	* FreeSans.sfd: Gujarati: added some subvocalic
+	  letters for Sanskrit. Quality is low.
+
+2009-12-24 13:26 +0000 [r1392]  Stevan_White:
+
+	* FreeSans.sfd: Filled out Geometric Shapes.
+
+2009-12-24 10:23 +0000 [r1391]  Stevan_White:
+
+	* tools/ligatureLookups.py: fixed syntax error
+
+2009-12-23 23:06 +0000 [r1390]  Stevan_White:
+
+	* tools/LigatureList.pl (removed): no longer
+	  relevant.
+
+2009-12-23 22:58 +0000 [r1389]  Stevan_White:
+
+	* tools/ligatureLookups.py (added): Replacement for
+	  the LigatureList.pl script, which relied on an external utility
+	  to produce a list of replacement lookups.
+
+2009-12-22 23:56 +0000 [r1388]  Stevan_White:
+
+	* tools/ranges/OpenType.py: removed links to
+	  disappeared web pages
+
+2009-12-22 23:45 +0000 [r1387]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: cosmetic re-name and
+	  re-order of lookups
+
+2009-12-22 22:51 +0000 [r1386]  Stevan_White:
+
+	* FreeMonoOblique.sfd: Diagonal Fractions lookup
+	  didn't make much sense in mono anyway, much less in just one
+	  style.
+
+2009-12-20 13:33 +0000 [r1385]  Stevan_White:
+
+	* FreeSerif.sfd: split Diagonal Fractions lookup
+	  into two tables
+
+2009-12-19 23:20 +0000 [r1382-1384]  Stevan_White:
+
+	* tools/range_report.py: corrected script name
+
+	* tools/ranges/OpenType.py: numerous changes, some
+	  reflecting changes to Unicode standard
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: General Punctuation:
+	  Got rid of deprecated subrange 0x206A-0x206F
+
+2009-12-19 23:13 +0000 [r1381]  Stevan_White:
+
+	* FreeSerif.sfd: re-encoded some characters
+	  adjusted some marks corrected two wrongly-placed glyphs in
+	  Phonetic Extensions Supplement
+
+2009-12-14 08:22 +0000 [r1380]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Unicode 5.2
+	  corrections of Abkhasian letters from Daniel Johnson. Got rid of
+	  some old glyph names.
+
+2009-12-06 15:07 +0000 [r1379]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd: Cherokee: fixed previous
+	  commit of a partial, and old range in medium weight
+
+2009-12-06 14:57 +0000 [r1378]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Cherokee, courtesy of
+	  Daniel Johnson.
+
+2009-11-20 13:28 +0000 [r1377]  Stevan_White:
+
+	* FreeSans.sfd: New glyphs for Unified Canadian
+	  Aboriginal Syllabics as defined in Unicode 5.2 by Daniel Johnson
+
+2009-11-14 22:47 +0000 [r1376]  Stevan_White:
+
+	* FreeSerif.sfd: Resolves bug #27842: FreeSerif
+	  U+1F016 (Mahjong Tile Seven of Bamboos) Wrong
+	  https://savannah.gnu.org/bugs/?27842 has one extra bamboo in it
+	  for a total of eight. The bamboo on the top left needs to be
+	  removed
+
+2009-11-14 22:31 +0000 [r1375]  Stevan_White:
+
+	* FreeSerif.sfd: Resolves bug #27579: Orthodox
+	  cross has wrong glyph http://savannah.gnu.org/bugs/?27579 U+2626
+	  Orthodox Cross should slope downwards from left to right.
+
+2009-11-13 02:33 +0000 [r1374]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBold.sfd: Cyrillic: corrections to
+	  Abkhazian letters by Daniel Johnson
+
+2009-11-05 15:33 +0000 [r1373]  Stevan_White:
+
+	* FreeSerif.sfd: Cyrillic: corrections to
+	  Abkhazian letters by Daniel Johnson
+
+2009-10-16 21:12 +0000 [r1372]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Cyrillic: tweeks to brev,
+	  based on Unicode 5.2 samples
+
+2009-10-08 07:38 +0000 [r1371]  Stevan_White:
+
+	* FreeSerif.sfd: Currency Symbols: tidied
+
+2009-10-07 23:48 +0000 [r1370]  Stevan_White:
+
+	* FreeSerif.sfd: Number Forms: three new vulgar
+	  fractions
+
+2009-10-07 23:32 +0000 [r1369]  Stevan_White:
+
+	* FreeSerif.sfd: Currency Symbols: added "Tenga"
+	  of Kazakhstan
+
+2009-10-07 23:19 +0000 [r1368]  Stevan_White:
+
+	* FreeSerif.sfd: Latin Extended: corrected a
+	  couple of wrong bearings some fiddling with Vienamese letters
+	  with hook
+
+2009-09-30 23:31 +0000 [r1367]  Stevan_White:
+
+	* FreeSerif.sfd: added missing accent
+
+2009-09-17 21:20 +0000 [r1366]  Stevan_White:
+
+	* FreeSerif.sfd: Latin kerning: gave qj positive
+	  kerning (it must happen sometimes)
+
+2009-09-17 21:09 +0000 [r1365]  Stevan_White:
+
+	* FreeSerif.sfd: Latin kerning: differentiated
+	  grave and dieresis vowels in some combos. (also, adieresis hadn't
+	  been kerned at all...)
+
+2009-09-17 20:12 +0000 [r1364]  Stevan_White:
+
+	* AUTHORS: Credited Yannis & Wellcome Institute for
+	  Sinhala glyphs
+
+2009-09-17 20:07 +0000 [r1363]  Stevan_White:
+
+	* FreeSerif.sfd: made ref of one sinhals letter
+
+2009-09-15 10:30 +0000 [r1362]  Stevan_White:
+
+	* CREDITS: Credit Wellcome Library for Sinhala, and
+	  the Sinhala LKLUG font
+
+2009-07-30 14:03 +0000 [r1361]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSerif.sfd: kerning
+
+2009-07-26 10:41 +0000 [r1360]  Stevan_White:
+
+	* FreeSansBold.sfd: kerning
+
+2009-07-26 07:54 +0000 [r1359]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: added some space in
+	  diaeresis did some kerning
+
+2009-07-26 07:42 +0000 [r1358]  Stevan_White:
+
+	* FreeSansBold.sfd: revert serious mistake with
+	  previous commit: had somehow set splies quadratic. Here, the
+	  GaspTable from that commit is preserved, However there were
+	  evidently numerous other changes that weren't documented, and
+	  these are lost.
+
+2009-07-12 16:21 +0000 [r1357]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Added GASP tables for
+	  control of hinting/smoothing (anti-alising) of TrueType. Now the
+	  values are better suited to the EM size of the fonts. Further
+	  adjustment (based say on stem width) might still be profitable.
+
+2009-07-11 23:32 +0000 [r1356]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: More tweeks on
+	  accents, especially Maltese letters.
+
+2009-07-11 19:53 +0000 [r1355]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Maltese Hbar, hbar,
+	  Improved, made more consistent.
+
+2009-07-11 17:08 +0000 [r1354]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Latin: various
+	  corrections and tweeks for consistency in accented letters.
+
+2009-07-11 08:23 +0000 [r1353]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: more space to accent on
+	  lcaron tightened DZ etc ligatures in SerifItalic faces made
+	  references etc in Spacing Modifiers and Combining further kerning
+
+2009-07-10 22:21 +0000 [r1352]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: kerning Sans: decided dots
+	  and some other marks needed more room.
+
+2009-07-10 19:09 +0000 [r1351]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: IPA. Phonetics: tweeks
+
+2009-07-10 08:02 +0000 [r1349-1350]  Stevan_White:
+
+	* FreeSerif.sfd: Tweeked some math symbols
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd: Letterlike: additions
+
+2009-07-10 07:21 +0000 [r1348]  Stevan_White:
+
+	* FreeMonoOblique.sfd: IPA
+
+2009-07-09 22:53 +0000 [r1347]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd: Another IPA symbol
+
+2009-07-09 22:32 +0000 [r1346]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd: IPA and Spacing
+	  Modifier Letters: added a few
+
+2009-07-08 22:38 +0000 [r1345]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: various horizontal
+	  spacing and positioning issues Replaced Tz and tz ligatures with
+	  the originals of Danial Johnson. (range is "Mayanist" and despite
+	  Unicode samples, current usage uses normal z in glyph) Put
+	  stylized Tz tz in a discretionary ligature lookup.
+
+2009-07-08 18:39 +0000 [r1344]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Cyrillic yi_yi
+	  Ukrainian ligature Latin various pointwise cleanup, made some
+	  references, horizontal adjustments
+
+2009-07-08 00:16 +0000 [r1343]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Cyrillic: Special ligature
+	  for Ukrainian yi_yi, also some kerning
+
+2009-07-07 08:09 +0000 [r1342]  Stevan_White:
+
+	* FreeSerif.sfd: Latin: kerning; made accents on
+	  i tighter to avoid collisions
+
+2009-07-05 13:08 +0000 [r1341]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd: Made lookup tables
+	  for Dutch IJ
+
+2009-07-05 13:01 +0000 [r1340]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd: Re-did Dutch digraph
+	  IJ in bold faces as "broken-U", because I thought it was cool and
+	  nobody was there to stop me.
+
+2009-07-05 12:35 +0000 [r1339]  Stevan_White:
+
+	* FreeSerif.sfd: Corrected ligatures Tz tz; put
+	  them in special lookup Latin Extended Additional: added
+	  medevalist letters, completing range
+
+2009-07-05 11:07 +0000 [r1338]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Cyrillic: added yi_yi
+	  ligature for Ukrainian in roman. Not sure if it's right. Latin:
+	  kerning. Added longs_t ligature, and historic ligature tables
+	  IPA: in bolditalic, added a letter or two
+
+2009-07-04 23:22 +0000 [r1337]  Stevan_White:
+
+	* FreeSerif.sfd: Kerning for hbar
+
+2009-07-04 23:10 +0000 [r1336]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Kerning for Western Slavic
+	  languages Added a couple of IPA to BI
+
+2009-07-04 13:29 +0000 [r1335]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: combined letters ae,
+	  oe, ij had incorrect horizontal spacing
+
+2009-07-04 13:14 +0000 [r1334]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: combined letters ae, oe, ij
+	  had wrong horizontal spacing.
+
+2009-07-04 12:27 +0000 [r1333]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Combining Diacritical Marks
+	  for Symbols: additions and fiddling. Also related circles,
+	  arrows.
+
+2009-07-04 09:22 +0000 [r1332]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Letterlike Symbols:
+	  various additions and adjustments Number Forms: Completed range
+	  in serif roman. Adjusted spacing of Latin numerals in serif
+	  faces. Diacritics for Symbols: various additions Geometric
+	  shapes: thought it best for circle to be round even in oblique
+	  faces. It's a choice of course. Added to several faces. Made all
+	  to pass tests (except sinhals)
+
+2009-07-02 20:37 +0000 [r1331]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Letterlike Symbols: more
+	  additions, adjustments Also fiddled with some math symbols in
+	  Sans faces
+
+2009-07-02 09:14 +0000 [r1330]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd: Letterlike Symbols;
+	  additions and adjustments Note: Pango is rendering very
+	  strangely: many glyphs in the font are being stolen from some
+	  other fonts instead: All the script an blackletter, and some
+	  others as well. Is there a cache in the system somewhere? Or
+	  what?
+
+2009-06-28 19:48 +0000 [r1329]  Stevan_White:
+
+	* FreeSerif.sfd: Modified glyph. From patch by
+	  Pavel Skrylev.
+
+2009-06-28 19:11 +0000 [r1328]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Superscritps and
+	  Subscripts: made glyphs to complete range in all faces
+
+2009-06-28 17:43 +0000 [r1327]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd: Added some combining
+	  marks for symbols and Blackboard Bold letters to letterlike
+	  symbols
+
+2009-06-28 08:59 +0000 [r1326]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerifBold.sfd: Various adjustments
+	  regarding superscript and subscript characters in several ranges.
+
+2009-06-27 15:45 +0000 [r1325]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: More fiddling with
+	  super/subscripts Tidied points in Serif to make fontforge "wrong
+	  direction" complaint in scaled reference go away. Made some other
+	  references in basic latin ranges.
+
+2009-06-27 14:54 +0000 [r1324]  Stevan_White:
+
+	* FreeSerif.sfd: Superscripts and subscripts (in
+	  various ranges): tried to systematize sizing and vertical
+	  placement. Note: most letters are still simply scaled. This is
+	  practical maintenance-wise, but isn't typographically optimal.
+
+2009-06-27 09:04 +0000 [r1323]  Stevan_White:
+
+	* FreeSerif.sfd: Cyrillic Extended A: altered
+	  mark positions
+
+2009-06-26 23:31 +0000 [r1322]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Phonetic Extensions:
+	  various corrections and fiddling Changed Blues values in
+	  FreeSerifBoldItalic
+
+2009-06-25 19:27 +0000 [r1321]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd: Combining Diacritical
+	  Marks for Symbols: added to bold oblique added placement mark to
+	  many
+
+2009-06-25 07:37 +0000 [r1320]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Deleted TrueType
+	  tables 'cvt', 'fpgm', 'prep' because of FontForge complaints.
+
+2009-06-25 07:24 +0000 [r1319]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: IPA Extensions:
+	  completed in bold and boldoblique, completing range for face. All
+	  faces: deleted 'cvt', 'prep', 'fpgm' TrueType tables, because
+	  FontForge was complaining about them (legacy hinting that could
+	  interfere, possibly lower quality code, etc)
+
+2009-06-24 23:22 +0000 [r1318]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd: IPA Extensions: made
+	  several characters
+
+2009-06-24 22:25 +0000 [r1317]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: IPA Extensions: completed
+	  range in bold
+
+2009-06-23 21:48 +0000 [r1316]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Spacing Modifiers: added a
+	  couple Combining Diacriticals: brought range to par with FreeSans
+
+2009-06-23 21:11 +0000 [r1315]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Same correction as
+	  for FreeSerif
+
+2009-06-23 20:58 +0000 [r1314]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Corrected descender of 027f
+
+2009-06-23 20:45 +0000 [r1313]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: IPA and related: made lots
+	  of additional glyphs
+
+2009-06-22 08:43 +0000 [r1312]  Stevan_White:
+
+	* FreeSerif.sfd: Latin: further clean-up
+
+2009-06-21 10:53 +0000 [r1311]  Stevan_White:
+
+	* FreeSerif.sfd: General pointwise clean-up of
+	  Latin and Latin Extended. No visible changes were intended
+	  besides changed policy on horizontal placement of some horned
+	  letters
+
+2009-06-21 09:21 +0000 [r1310]  Stevan_White:
+
+	* FreeSerif.sfd: Latin Extended-C: constructed
+	  glyphs to complete range. Latin Extended-D: constructed a bunch
+	  of glyphs; some related changes elsewhere.
+
+2009-06-20 17:43 +0000 [r1309]  Stevan_White:
+
+	* FreeSerif.sfd: Latin Extended-C: added most of
+	  range
+
+2009-06-20 12:51 +0000 [r1308]  Stevan_White:
+
+	* FreeSerif.sfd: Modifier Tone Letters: added
+	  glyphs to complete range. This should also complete all the
+	  IPA/Phonetic extenseions ranges.
+
+2009-06-20 11:25 +0000 [r1307]  Stevan_White:
+
+	* FreeSerif.sfd: Phonetic Extensions Supplement:
+	  added letters completing range Note the superscript ones are
+	  simply scaled, so stem width is not quite right...
+
+2009-06-19 08:19 +0000 [r1306]  Stevan_White:
+
+	* FreeSerif.sfd: Phonetic Extensions: made
+	  letters to complete range
+
+2009-06-18 06:40 +0000 [r1305]  Stevan_White:
+
+	* FreeSans.sfd: IPA Extensions: clean-up, fix
+	  some horizontal spacing issues
+
+2009-06-18 06:16 +0000 [r1304]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Some glyph problems
+	  clean-up, made to pass validate (BlueValues)
+
+2009-06-17 21:13 +0000 [r1303]  Stevan_White:
+
+	* FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: IPA Extensions:
+	  Improved spacing and horizontal positioning
+
+2009-06-17 08:42 +0000 [r1302]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Georgian: added
+	  missing letter
+
+2009-06-17 08:22 +0000 [r1301]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd: IPA: made curls on
+	  some glyphs more distinct. note horizontal placement in BO is
+	  chaotic--needs work
+
+2009-06-14 13:51 +0000 [r1300]  Stevan_White:
+
+	* FreeSerif.sfd: Musical Symbols: various
+	  experiments with lookups. calt: should have allowed isolatef
+	  forms of combining marks, (but can't see application support...)
+	  aalt, hist: for alterntative characters Added some historical
+	  glyphs Math Alphanumeric: some clean-up.
+
+2009-06-11 21:57 +0000 [r1299]  Stevan_White:
+
+	* FreeSerif.sfd: Musical Symbols: various
+	  tweeks. Failed attempt to use 'isol' lookup to put isolated
+	  combining marks above the baseline.
+
+2009-06-11 09:04 +0000 [r1298]  Stevan_White:
+
+	* FreeSerif.sfd: Musical Symbols: more fiddling
+	  with mark placement, strengthened ornamental endings
+
+2009-06-10 22:53 +0000 [r1297]  Stevan_White:
+
+	* FreeSerif.sfd: Musical Symbols: mkmk
+	  positioning of augmentation dot
+
+2009-06-10 09:09 +0000 [r1296]  Stevan_White:
+
+	* FreeSerif.sfd: Musical Symbols: combining
+	  marks above and below notes now working somewhat
+
+2009-06-08 21:46 +0000 [r1295]  Stevan_White:
+
+	* FreeSerif.sfd: Musical Symbols: more
+	  adjustments of size and placement
+
+2009-06-06 23:28 +0000 [r1294]  Stevan_White:
+
+	* FreeSerif.sfd: Musical Symbols: mostly work on
+	  lookups. Made tablature symbols thinner.
+
+2009-06-06 19:24 +0000 [r1293]  Stevan_White:
+
+	* FreeSerif.sfd: Musical Symbols: more fiddling
+	  with sizes and positions Byzantine Musical Symbols: minor
+	  clean-ups
+
+2009-06-06 12:31 +0000 [r1292]  Stevan_White:
+
+	* FreeSerif.sfd: Fixed some ATT problems with
+	  'kern' lookups for Cyrillic
+
+2009-06-06 12:25 +0000 [r1291]  Stevan_White:
+
+	* FreeSerif.sfd: Musical Symbols: more changes
+	  to size and position
+
+2009-06-05 21:28 +0000 [r1290]  Stevan_White:
+
+	* FreeSerif.sfd: Musical Symbols: many changes
+	  to glyph positions and shapes
+
+2009-05-27 22:36 +0000 [r1289]  Stevan_White:
+
+	* FreeSerif.sfd: Cyrillic, additions and
+	  re-naming by Pavel Skrylev. * Added Cyrillic-B Ext glyphs, and
+	  Cyrillic-A Ext glyphs. * Added cyr_above anchor to all cyrillic
+	  glyphs, some glyphs was changed * To all Cyrillic letters I've
+	  given proper names based on old Slavic language which is source
+	  of all modern slavic languages. (the naming is contentious, and
+	  there are a couple of technical problems...under consideration)
+
+2009-05-26 23:09 +0000 [r1288]  Stevan_White:
+
+	* FreeSerif.sfd: Musical Symbols: scaled up
+	  accidentals a bit. reduced width of repeated figure marks reduced
+	  width of caesura even more tried to implement mark
+	  positioning...not working everywhere made references
+
+2009-05-25 23:48 +0000 [r1287]  Stevan_White:
+
+	* FreeSerif.sfd: Made all letterlike glyph parts
+	  more like those from Serif and Serif Italic. (Except for Ped.
+	  U+1d1ae)
+
+2009-05-20 08:25 +0000 [r1286]  Stevan_White:
+
+	* FreeSerif.sfd: Corrected DPOS lookup for Music
+	  range to be in script 'musi'
+
+2009-05-20 07:35 +0000 [r1285]  Stevan_White:
+
+	* FreeSerif.sfd: Western Musical Symbols:
+	  fiddling Miscellaneous Symbols: re-design of musical flat symbol
+
+2009-05-19 07:37 +0000 [r1284]  Stevan_White:
+
+	* FreeSerif.sfd: Western Musical Symbols:
+	  revised horizontal placement of notes
+
+2009-05-19 01:38 +0000 [r1283]  Stevan_White:
+
+	* FreeSerif.sfd: Western Musical Symbols: raised
+	  some more glyphs
+
+2009-05-19 01:27 +0000 [r1282]  Stevan_White:
+
+	* FreeSerif.sfd: Western Musical Symbols:
+	  altered many combining symbols to be more like Unicode sample
+	  corrected many symbols that should be spacing but had 0 width
+	  raised many symbols that were far lower than in Unicode samples
+
+2009-05-18 09:47 +0000 [r1281]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: U+0354 and U+0355
+	  (combining left/right arrowhead below) were switched
+
+2009-05-11 21:27 +0000 [r1280]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Hebrew: Moved vowel below mark
+	  for esh (05e8) and dalet (05d3) as recommended in bug report
+	  #25887 "FreeSans Hebrew most nonspacing marks are spacing"
+	  https://savannah.gnu.org/bugs/?25887
+
+2009-05-11 07:25 +0000 [r1279]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Put PS Private
+	  BlueScale back to default. (Was really experiment to alleviate
+	  excessive overshoot. Didn't work and FontForge complained.)
+
+2009-05-11 07:21 +0000 [r1278]  Stevan_White:
+
+	* FreeSerif.sfd: Geometric Shapes: made two
+	  'bullet' shapes to be consistent with 'bullet' Blues values: put
+	  Std VH W into Stem Snap values
+
+2009-05-11 07:09 +0000 [r1277]  Stevan_White:
+
+	* FreeSans.sfd: More Geometric Shapes. also
+	  worked on character widths.
+
+2009-05-09 19:47 +0000 [r1276]  Stevan_White:
+
+	* FreeSans.sfd: More Geometric Shapes
+
+2009-05-02 12:44 +0000 [r1274-1275]  Stevan_White:
+
+	* FreeSansOblique.sfd: Had misplaced Tifinagh
+	  range.
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: The rest of Tifinagh,
+	  courtesy of Daniel Johnson. + a few adjustments.
+
+2009-05-01 09:06 +0000 [r1273]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Explicitly disabled
+	  PS Private dictionary entry BlueFuzz as recommended in Adobe Type
+	  1 Font Format, sect. 5.8.
+
+2009-05-01 07:50 +0000 [r1272]  Stevan_White:
+
+	* FreeSans.sfd: Tifinagh range, courtesy of
+	  Daniel Johnson.
+
+2009-05-01 07:47 +0000 [r1271]  Stevan_White:
+
+	* tools/ranges.py: Corrections for Georgian and
+	  Tifinagh ranges
+
+2009-05-01 07:17 +0000 [r1270]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Adjusted PS Private
+	  values according to understanding of Adobe Type 1 Font Format
+	  (Ch. 5, Private Dictionary) Not completely clear on BlueScale,
+	  and StemSnap values are still a mystery. (FontForge 'guess' seems
+	  to do little or nothing, and I don't know where these values came
+	  from) Original hope was to improve appearance of overshoot in
+	  Sans, but it seems that my renderers ignore this information.
+
+2009-04-28 07:41 +0000 [r1269]  Stevan_White:
+
+	* FreeSans.sfd: More Geometric Shapes
+
+2009-04-27 23:14 +0000 [r1268]  Stevan_White:
+
+	* FreeSans.sfd: More Geometrical Shapes
+
+2009-04-27 08:11 +0000 [r1267]  Stevan_White:
+
+	* FreeSans.sfd: Added U+25D0-3 (half-black
+	  circles) Note the Geometric Shapes range is still in poor shape
+	  in Sans.
+
+2009-04-25 11:55 +0000 [r1266]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Serif: fiddled with mark
+	  positioning in Cyrillic and Glagolitic Non-roman faces: Added
+	  'mark' positioning for Cyrillic
+
+2009-04-14 09:16 +0000 [r1265]  Stevan_White:
+
+	* FreeSerif.sfd: Cyrillic Extended-B more
+	  additions. Now has all except payerok punctuation and Old
+	  Abkhasian letters.
+
+2009-04-13 18:10 +0000 [r1264]  Stevan_White:
+
+	* FreeSerif.sfd: Cyrillic Extended-B a few more
+	  letters
+
+2009-04-13 17:35 +0000 [r1263]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: kerning: tweeks
+
+2009-04-11 15:35 +0000 [r1262]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Georgian: additions and
+	  improvements. Serif now has full compliment. Note uppercase is
+	  questionable, being a simple scaling...
+
+2009-04-11 13:20 +0000 [r1261]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Latin Extended-D
+	  added u+a788-c
+
+2009-04-11 12:08 +0000 [r1260]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin Extended-D corrected
+	  slots for Mayanist letters in roman added modifier letters
+	  u+a788-c
+
+2009-04-11 11:42 +0000 [r1259]  Stevan_White:
+
+	* tools/ranges.py: Corrected Vai range
+
+2009-04-11 10:50 +0000 [r1258]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin Extended-D Mayanist
+	  letters by Daniel Johnson
+
+2009-04-10 09:00 +0000 [r1257]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Letterlike Symbols: additions
+	  and improvements
+
+2009-04-10 08:38 +0000 [r1256]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Letterlike Symbols:
+	  additions, improvements
+
+2009-04-10 07:13 +0000 [r1255]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Reconsidered numeral
+	  1. Made angle more like other angles in font.
+
+2009-04-09 06:45 +0000 [r1254]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Increased angle of
+	  hook on numeral 'one', to improve distinction from letter 'l' at
+	  small point sized. (Noticed that on some systems, even at 12
+	  point the distinction had not been obvious.)
+
+2009-03-29 13:56 +0000 [r1253]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: General Punctuation:
+	  Adjust position, shape of quotes, fiddle with others.
+
+2009-03-29 12:12 +0000 [r1252]  Stevan_White:
+
+	* FreeSans.sfd: Kerning: Had grouped letters
+	  with round bowls on left (e,c,0,d,q) together, but now see the
+	  original Nimbus fonts had left bounds that vary by 10 EM or more,
+	  which is quite visible. I am correcting a flaw in the original
+	  font in a very difficult and complex way. It would be much better
+	  to make the bounds of these similar letters to be equal. To do:
+	  same for punctuation, copy to other styles of Sans
+
+2009-03-29 03:48 +0000 [r1251]  Stevan_White:
+
+	* FreeSerif.sfd: Kerning: tweeks
+
+2009-03-29 03:34 +0000 [r1250]  Stevan_White:
+
+	* FreeSerif.sfd: Kerning tweek
+
+2009-03-22 18:54 +0000 [r1249]  Stevan_White:
+
+	* FreeMono.sfd: clean-up of some of the basic
+	  Nimbus glyphs
+
+2009-03-22 14:26 +0000 [r1248]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Hebrew: more work on lookups
+	  regarding vowel marks
+
+2009-03-22 11:03 +0000 [r1247]  Stevan_White:
+
+	* FreeSans.sfd: Hebrew: vowel mark positioning
+
+2009-03-16 19:26 +0000 [r1246]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: re-named some lookup tables
+	  (Sinhala, Hebrew)
+
+2009-03-15 11:58 +0000 [r1245]  Stevan_White:
+
+	* FreeSerif.sfd: Georgian: point-wise cleanup
+	  note: doubts about spacing and glyph bounds in capitals
+
+2009-03-15 09:58 +0000 [r1244]  Stevan_White:
+
+	* FreeSerif.sfd: Greek Extended: corrected
+	  u+1fd3
+
+2009-03-13 08:15 +0000 [r1243]  Stevan_White:
+
+	* FreeSerif.sfd: Cyrillic (and extensions)
+	  various tweeks to old Cyrillic letters, spacing.
+
+2009-03-07 12:30 +0000 [r1242]  Stevan_White:
+
+	* FreeMonoBoldOblique.sfd: correct direction
+	  braceleft
+
+2009-03-07 12:16 +0000 [r1240-1241]  Stevan_White:
+
+	* FreeSerif.sfd: Glagolitic: tweeks
+
+	* FreeMonoBold.sfd: correct direction of
+	  braceleft
+
+2009-03-05 09:03 +0000 [r1239]  Stevan_White:
+
+	* FreeSerif.sfd: Glagolitic: more fiddling.
+	  Raised small letters so their tops are even with the tops of the
+	  big letters, which is more in line with their "hanging" nature,
+	  and with most manuscripts.
+
+2009-03-04 07:03 +0000 [r1238]  Stevan_White:
+
+	* tools/ranges.py: ranges for Sinhala
+
+2009-03-03 09:54 +0000 [r1237]  Stevan_White:
+
+	* FreeSerif.sfd: Glagolitic: more tweeks
+
+2009-03-02 23:03 +0000 [r1236]  Stevan_White:
+
+	* FreeSerif.sfd: Glagolitic: added Djervi (I
+	  think)
+
+2009-03-02 21:49 +0000 [r1235]  Stevan_White:
+
+	* tools/GenerateMacTT (added): Special script for
+	  generating fonts that don't give errors on the Mac. I hope
+	  somebody will fix something, either in Font Book or FontForge,
+	  that will make this unnecessary
+
+2009-03-01 23:24 +0000 [r1234]  Stevan_White:
+
+	* FreeSerif.sfd: Glagolitic: tweeks
+
+2009-02-28 19:38 +0000 [r1233]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: replaced U+0DD0-1 with
+	  ones from sinha font
+
+2009-02-28 12:25 +0000 [r1232]  Stevan_White:
+
+	* FreeSerif.sfd: Glagolitid: Additions,
+	  improvements (Note: the characters still missing I simply haven't
+	  yet recognized in a manuscript or found in an on-line HTML
+	  encoded text. I would like to see real ones rather than copying
+	  out of the Unicode samples.) Cyrillic Extended B: Assembled
+	  Monograph Uk, uk. See discussion
+	  http://en.wikipedia.org/wiki/Uk_(Cyrillic)
+
+2009-02-28 00:14 +0000 [r1231]  Stevan_White:
+
+	* FreeSerif.sfd: More work on Glagolitic
+
+2009-02-27 15:35 +0000 [r1230]  Stevan_White:
+
+	* FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Made braces more
+	  distinctive.
+
+2009-02-26 15:12 +0000 [r1229]  Stevan_White:
+
+	* FreeMono.sfd: ASCII: Accentuated braces (for
+	  better readability in terminals)
+
+2009-02-24 22:27 +0000 [r1228]  Stevan_White:
+
+	* FreeSerif.sfd: Cherokee: Daniel improved
+	  U+13d2
+
+2009-02-24 07:41 +0000 [r1227]  Stevan_White:
+
+	* FreeSerif.sfd: Sinhala: Copied most Unicode
+	  glyphs directly from Yannis Haralambous sinhala MetaFont files.
+	  These are: all but 0dd0 0dd1 0df4. Gave Unicode characters names,
+	  based on a transliteration scheme from Harshula. The auxiliary
+	  Sinhala are all from the LKLUG font.
+
+2009-02-22 23:41 +0000 [r1226]  Stevan_White:
+
+	* FreeSerif.sfd: Copied glyphs from LKLUG font,
+	  as discussed with Harshula Jayasuriya.
+	  http://sinhala.cvs.sourceforge.net/viewvc/sinhala/sinhala/fonts/
+	  This font is derived from a Metafont font: This package was
+	  originally developed by Yannis Haralambous (Yannis.Haralambous at
+	  univ-lille1 fr), with funding from the Wellcome Institute for the
+	  History of Medicine, 183 Euston Road, London NW1 2BE, England
+	  (Contact person: Dominik Wujastyk (D.Wujastyk at ucl ac uk)),
+	  which is using the font in its Catalogue of Sinhala Manuscript.
+	  The original package was available by ftp at ftp.bcc.ac.uk in:
+	  /pub/users/ucgadkw/indology/software/sinhala1-TeX.zip The hope is
+	  to eventually pull glyphs directly from the original MF files.
+
+2009-02-21 19:48 +0000 [r1225]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: tidying previous commits
+
+2009-02-21 14:11 +0000 [r1224]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Serif: Revised letter
+	  spacing in Armenian. Serif roman: Added initial version of
+	  Glagolitic (by me)
+
+2009-02-18 20:38 +0000 [r1223]  Stevan_White:
+
+	* FreeSerif.sfd: Armenian: spacing changes
+	  Sinhala: deleted range, for usual reasons: It doesn't even
+	  contain the full set of Unicode letters, and Sinhala requires
+	  auxiliary characters and lookup tables for proper representation.
+	  (Found what I think are the originals at
+	  http://www.mettanet.org/fonts/ )
+
+2009-02-12 20:08 +0000 [r1222]  Stevan_White:
+
+	* tools/ranges.py,
+	  tools/findBackLayers.py,
+	  tools/GenerateTrueType,
+	  tools/GenerateOpenType,
+	  tools/range_report.py,
+	  tools/validate.py,
+	  tools/checkGlyphNumbers.py,
+	  tools/isMonoMono.py: Changed
+	  /usr/local/bin/fontforge to /usr/bin/fontforge (to work with the
+	  update-alternatives mechanism, whereby a link is made
+	  /usr/bin/fontforge -> /etc/alternatives/fontforge -> preferred
+	  binary )
+
+2009-02-12 19:33 +0000 [r1221]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: SerifBoldItalic - Armenian
+	  oblique from Daniel Johnson's bold version Added ligatures (by
+	  Daniel) and lookup tables.
+
+2009-02-12 08:39 +0000 [r1220]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Armenian: Made oblique
+	  version of Daniel Johnson's range
+
+2009-02-12 08:28 +0000 [r1219]  Stevan_White:
+
+	* FreeSerifBold.sfd: Armenian by Daniel Johnson
+
+2009-02-12 08:00 +0000 [r1218]  Stevan_White:
+
+	* FreeSerif.sfd: Improvements of a couple of
+	  Armenian characters, from Daniel Johnson.
+
+2009-02-07 20:28 +0000 [r1217]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Latin: kerning fixed some
+	  missing extrema
+
+2009-02-07 19:47 +0000 [r1216]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Latin: kerning made some
+	  more delicate italic IPA letters
+
+2009-02-06 20:14 +0000 [r1215]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Latin: kerning
+
+2009-02-06 10:19 +0000 [r1214]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Latin: kerning Adjusted ff
+	  etc ligatures in Italic
+
+2009-02-05 23:20 +0000 [r1213]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Latin: kerning
+
+2009-02-05 19:57 +0000 [r1212]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Thai sample text (means
+	  something like Mr Sangkapan who sells bottles was picked up by
+	  the police because he stole the wash of ms. .....)
+
+2009-02-04 20:19 +0000 [r1211]  Stevan_White:
+
+	* FreeSans.sfd: Vai range, by Daniel Johnson
+
+2009-02-04 20:08 +0000 [r1210]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd: Latin: kerning
+
+2009-02-03 20:53 +0000 [r1209]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Latin: kerning
+
+2009-02-02 23:44 +0000 [r1208]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd: Latin: kerning
+
+2009-02-02 23:32 +0000 [r1207]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Latin: kerning
+
+2009-01-26 21:00 +0000 [r1206]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Made nu distinct from
+	  v. Remedies bug #25376: https://savannah.gnu.org/bugs/?25376
+	  greek letter 'nu' [U+03bd] same as latin 'v' [U+0076] in FreeMono
+
+2009-01-22 21:37 +0000 [r1205]  Stevan_White:
+
+	* FreeSans.sfd: Kerning. Need to copy to other
+	  faces
+
+2009-01-22 01:44 +0000 [r1204]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic ligatures: turned on
+	  "ignore combining marks" on advice of Khaled Hosny.
+
+2009-01-20 17:09 +0000 [r1203]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Drew U+1e9C-F in Latin
+	  Extended Additional (including capital ess-zet)
+
+2009-01-19 20:48 +0000 [r1202]  Stevan_White:
+
+	* FreeMono.sfd: Update ot Kayah Li from Daniel
+	  Johnson
+
+2009-01-18 16:49 +0000 [r1201]  Stevan_White:
+
+	* AUTHORS, CREDITS: Daniel Johnson's
+	  latest contributions
+
+2009-01-18 14:33 +0000 [r1200]  Stevan_White:
+
+	* FreeSerif.sfd: Coptic: Laula to be same height
+	  as Phi Psi (higher than other letters). Dei and dei also to be
+	  higher letters, adjusted widths too.
+
+2009-01-18 14:25 +0000 [r1199]  Stevan_White:
+
+	* FreeSans.sfd: Unified Canadian Aboriginal
+	  Syllabics: moved the non-Unicode letter part glyphs ucas.ring
+	  ucas.horizline ucas.shortvert ucas.righttack ucas.lefttack to the
+	  Private Use area 59664-59668 Technique was to edit the SFD file
+	  directly: It seems the encoding slot for the glyph is the first
+	  field of the "Encoding:" line for the character.
+
+2009-01-18 13:28 +0000 [r1198]  Stevan_White:
+
+	* FreeMono.sfd: Cherokee: improvements from D.
+	  Johnsaon
+
+2009-01-18 12:34 +0000 [r1197]  Stevan_White:
+
+	* FreeSerif.sfd: Latin: kerning
+
+2009-01-17 18:58 +0000 [r1196]  Stevan_White:
+
+	* FreeSerif.sfd: Cyrillic: kerning
+
+2009-01-17 15:26 +0000 [r1195]  Stevan_White:
+
+	* FreeSerif.sfd: Re-linked Ezh/Yogh and re-made
+	  reversed Ezh
+
+2009-01-16 21:28 +0000 [r1194]  Stevan_White:
+
+	* FreeSerif.sfd: Fiddled with Coptic glyphs:
+	  Longer tail on Shei, less droopy Alfa. Made Armenian Aiw to be a
+	  link to Phi (on Daniel Johnson's advice )
+
+2009-01-16 08:01 +0000 [r1193]  Stevan_White:
+
+	* tools/ranges.py: corrected Unified Canadian
+	  Aboriginal Syllabics
+
+2009-01-16 07:44 +0000 [r1192]  Stevan_White:
+
+	* FreeMono.sfd: Kayah Li by Daniel Johnson
+
+2009-01-16 07:36 +0000 [r1190-1191]  Stevan_White:
+
+	* FreeMono.sfd: removed hints
+
+	* FreeMono.sfd: Cherokee, by Daniel Johnson
+
+2009-01-16 07:27 +0000 [r1189]  Stevan_White:
+
+	* FreeSerif.sfd: Made references of some
+	  Armenian punctuation, Made primereversed to be really the reverse
+	  of prime.
+
+2009-01-13 21:43 +0000 [r1187-1188]  Stevan_White:
+
+	* FreeSans.sfd: named some Armenian letters
+
+	* FreeSerif.sfd: Armenian range by Daniel
+	  Johnson, with ligatures.
+
+2009-01-13 08:43 +0000 [r1186]  Stevan_White:
+
+	* README: GPL 2 -> GPL 3
+
+2009-01-12 20:35 +0000 [r1185]  Stevan_White:
+
+	* FreeSerif.sfd: Coptic: more kerning
+
+2009-01-12 09:06 +0000 [r1184]  Stevan_White:
+
+	* FreeSerif.sfd: Coptic: Raised top of laula
+	  above common top, as it appears in most other fonts.Makes it
+	  easier to distinguish from alfa. A little more space around Iauda
+	  and iauda. Kerned Dei.
+
+2009-01-11 22:30 +0000 [r1183]  Stevan_White:
+
+	* FreeSerif.sfd: Coptic: Made capital Alpha is
+	  distinct in printed form. Made more angular vida with flattened
+	  top and bottom. Made small hori more curvy.
+
+2009-01-11 14:06 +0000 [r1182]  Stevan_White:
+
+	* FreeSerif.sfd: Greek: made archaic letters
+	  u+0370-3 (understand are used for old numbering) Coptic: more
+	  fiddling with Hori, made Kapa much wider reduced width of small
+	  letter straight stems to match small letters in Latin kerning for
+	  capitals
+
+2009-01-11 00:39 +0000 [r1181]  Stevan_White:
+
+	* FreeSerif.sfd: Revised Coptic. Added a few
+	  dialectic letters and kai symbol Removed many "ear" serifs,
+	  preferring a slashing continuation of long decenders and
+	  diagonals as in some manuscripts Made Kai and kai not to go below
+	  baseline Made Psi a little broader Made small khei distinct from
+	  cap, Revised Hori and hori. Some of this toward
+	  https://savannah.gnu.org/bugs/?25289
+
+2009-01-08 22:23 +0000 [r1180]  Stevan_White:
+
+	* FreeSerif.sfd: Various alterations to Coptic:
+	  Re-worked K and M, added kern table.
+
+2009-01-07 10:03 +0000 [r1179]  Stevan_White:
+
+	* FreeSans.sfd: Daniel Johnson's fix of TT
+	  reference transformation bug in Unified Canadian Aboriginal
+	  Syllabics,
+
+2009-01-06 22:27 +0000 [r1178]  Stevan_White:
+
+	* FreeSans.sfd: Unified Canadian Aboriginal
+	  Syllabics range, courtesy of Daniel Johnson.
+
+2009-01-04 16:12 +0000 [r1176]  Stevan_White:
+
+	* ChangeLog: copyright dates 2009
+
+2009-01-04 16:08 +0000 [r1175]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Added 2009 to
+	  copyright dates
+
+2009-01-04 15:59 +0000 [r1173-1174]  Stevan_White:
+
+	* ChangeLog: changes since last release
+
+	* AUTHORS, CREDITS: Removed
+	  Glagolitic range author
+
+2009-01-04 15:27 +0000 [r1172]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerifBold.sfd: Added some TrueType names
+
+2009-01-01 20:47 +0000 [r1171]  Stevan_White:
+
+	* FreeSerif.sfd: Removde Glagolitic range, since
+	  have not (yet) received OK from author. Added some TrueType Names
+
+2008-12-31 13:06 +0000 [r1170]  Stevan_White:
+
+	* COPYING: Updated license to GPL v3
+
+2008-12-30 21:34 +0000 [r1169]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd: Oblique versions of
+	  Daniel Johnson's Cherokee.
+
+2008-12-30 20:42 +0000 [r1168]  Stevan_White:
+
+	* FreeSerifBold.sfd: Cherokee Bold range from
+	  Daniel Johnson.
+
+2008-12-27 16:43 +0000 [r1165-1167]  Stevan_White:
+
+	* tools/isMonoMono.py: 900 EM -> 800
+
+	* FreeMonoBold.sfd,
+	  FreeMonoBoldOblique.sfd: Made glyphs to lie
+	  between -200 and 800 EM
+
+	* tools/isMonoMono.py: check that glyphs lie in
+	  vertical bounding boxes
+
+2008-12-27 14:46 +0000 [r1164]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd: Extensible bracket characters
+	  didn't exactly line up. Fixed. Mono: a couple of glyphs had
+	  gotten out of their bounding boxes again.
+
+2008-12-26 22:41 +0000 [r1162]  Stevan_White:
+
+	* ChangeLog: last two day's changes
+
+2008-12-26 22:36 +0000 [r1160-1161]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Final pre-release
+	  cleanup
+
+	* notes/maintenance.txt: nongnu -> gnu
+
+2008-12-26 20:48 +0000 [r1159]  Stevan_White:
+
+	* FreeSerif.sfd: Buginese vowel u was misnamed
+
+2008-12-26 20:36 +0000 [r1158]  Stevan_White:
+
+	* FreeMono.sfd: Yatcyrillic somehow was a mark
+	  character ... fixed
+
+2008-12-26 20:27 +0000 [r1157]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd: Had to un-link references
+	  in Sans: uni02B2, uni02B5 SansOblique: uni0363 because validation
+	  of the TTF file said the glyph "is drawn in wrong direction" I
+	  would have preferred to have understand this...
+
+2008-12-26 20:23 +0000 [r1156]  Stevan_White:
+
+	* sfd/Makefile: Added quick test for FontForge
+	  version.
+
+2008-12-26 19:52 +0000 [r1155]  Stevan_White:
+
+	* FreeMonoBold.sfd,
+	  FreeMonoBoldOblique.sfd: Removed kerning
+	  tables (?? what were they doing here anyway??)
+
+2008-12-26 19:43 +0000 [r1154]  Stevan_White:
+
+	* tools/ranges.py: some changes to explanatory text
+
+2008-12-26 18:54 +0000 [r1153]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Kerning tables for Thai.
+	  Handles one common case: short letter followed by a tall one with
+	  an overhang to the left.
+
+2008-12-26 12:33 +0000 [r1152]  Stevan_White:
+
+	* INSTALL: small corrections: better detail about
+	  Windows install
+
+2008-12-26 12:29 +0000 [r1151]  Stevan_White:
+
+	* AUTHORS, CREDITS: added most recent
+	  authors, synched up
+
+2008-12-25 20:47 +0000 [r1150]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd: More putzing with kerning
+	  tables
+
+2008-12-25 14:43 +0000 [r1149]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Copied kerning classes
+	  Serif -> SerifBold SerifItalic -> SerifBoldItalic Sans ->
+	  SansOblique SansBold SansBoldOblique Some associated naming of
+	  characters, etc
+
+2008-12-25 12:51 +0000 [r1146-1148]  Stevan_White:
+
+	* AUTHORS, CREDITS,
+	  README: formatting
+
+	* ChangeLog: brought up to date
+
+	* notes/maintenance.txt: added new release
+	  proceedures
+
+2008-12-25 11:54 +0000 [r1145]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Additions and correction in
+	  Spacing Modifier letters and IPA Extensions
+
+2008-12-23 21:35 +0000 [r1144]  Stevan_White:
+
+	* FreeSerif.sfd: Applied patch to Cherokee range
+
+2008-12-20 15:57 +0000 [r1143]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Fixed kern classes that end in
+	  space (crashes FontForge)
+
+2008-12-20 15:38 +0000 [r1142]  Stevan_White:
+
+	* FreeSerifItalic.sfd: kerning
+
+2008-12-20 12:17 +0000 [r1141]  Stevan_White:
+
+	* FreeSerif.sfd: kerning
+
+2008-12-19 00:55 +0000 [r1140]  Stevan_White:
+
+	* FreeSerifItalic.sfd: kerning
+
+2008-12-19 00:06 +0000 [r1139]  Stevan_White:
+
+	* FreeSerif.sfd: kerning Some adjustments to
+	  Glagolitc spacing, mark positioning
+
+2008-12-17 23:08 +0000 [r1138]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: kerning
+
+2008-12-16 23:36 +0000 [r1137]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: kerning
+
+2008-12-11 22:27 +0000 [r1136]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: kerning
+
+2008-12-10 11:03 +0000 [r1135]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: kerning
+
+2008-12-10 09:34 +0000 [r1134]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: kerning
+
+2008-12-08 23:01 +0000 [r1133]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: kerning
+
+2008-12-08 09:52 +0000 [r1132]  Stevan_White:
+
+	* FreeSansOblique.sfd: Slanted small final
+	  sigma. remedies bug #24993: U+03C2 "Greek small letter final
+	  sigma" not slanted in Free Sans Oblique
+	  https://savannah.gnu.org/bugs/index.php?24993
+
+2008-12-07 19:30 +0000 [r1131]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: kerning, etc
+
+2008-12-06 23:42 +0000 [r1130]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: kerning
+
+2008-12-06 13:48 +0000 [r1129]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: kerning Tweek in Sans
+	  having to do with addition of Latin Extended
+
+2008-12-05 20:52 +0000 [r1128]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd: Tweeks to Latin
+	  Extended Additional
+
+2008-12-05 20:34 +0000 [r1127]  Stevan_White:
+
+	* FreeSansBoldOblique.sfd: Added Latin Extended
+	  Additional range
+
+2008-12-05 10:35 +0000 [r1126]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Extra space at end of
+	  kern class names has bad effect on FornForge script that try to
+	  run through kern classes. Some FontForge call corrupts memory.
+	  Got rid of extra space.
+
+2008-12-02 21:12 +0000 [r1125]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Replaced U+0387 GREEK
+	  ANO TELEIA with top dot of colon. See bug #24987: U+0387 GREEK
+	  ANO TELEIA too low https://savannah.gnu.org/bugs/index.php?24987
+
+2008-12-02 09:25 +0000 [r1124]  Stevan_White:
+
+	* FreeSerif.sfd: more kerning in Cyrillic (broke
+	  into two tables of classes)
+
+2008-12-01 20:22 +0000 [r1122-1123]  Stevan_White:
+
+	* FreeSerif.sfd: tweeks to kernin
+
+	* FreeSerifBoldItalic.sfd: kerning
+
+2008-11-30 21:17 +0000 [r1121]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Kerning for Latin and
+	  Cyrillic fairly complete in Serif faces. Complete in sense that
+	  it looks pretty good under Pango for English French German
+	  Spanish Polish Czech Latvian But have not done Vietnamese (will
+	  require many more entries). I adjust roman and italic, then copy
+	  tables by hand to bold and bolditalic. Misgiving: bolditalic is
+	  much too crammed Overall, I may have over-kerned. (A difficult
+	  temptation to master.)
+
+2008-11-30 15:06 +0000 [r1120]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: kerning
+
+2008-11-30 13:43 +0000 [r1119]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerif.sfd: kerning In Serif, modified
+	  widths of some extended latin glyphs
+
+2008-11-29 13:44 +0000 [r1118]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: kerning
+
+2008-11-29 11:56 +0000 [r1117]  Stevan_White:
+
+	* FreeSerif.sfd: Broke Latin kerning subtable
+	  into four, hoping it will be easier to understand and maintain.
+
+2008-11-29 11:26 +0000 [r1116]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: kerning
+
+2008-11-29 00:38 +0000 [r1115]  Stevan_White:
+
+	* FreeSansOblique.sfd: kerning
+
+2008-11-28 23:43 +0000 [r1114]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerif.sfd: kerninig
+
+2008-11-28 21:54 +0000 [r1112-1113]  Stevan_White:
+
+	* FreeSans.sfd: kerning
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: more kerning; made guillemot
+	  narrower
+
+2008-11-28 10:26 +0000 [r1111]  Stevan_White:
+
+	* FreeSans.sfd: kerning
+
+2008-11-28 00:11 +0000 [r1109-1110]  Stevan_White:
+
+	* FreeSansOblique.sfd,
+	  FreeSerif.sfd: previous commit was incomplete
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Adjusted width of single
+	  quotes (and apostrophe) to be "punctuation width" More fiddling
+	  with kerning.
+
+2008-11-27 22:37 +0000 [r1108]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: much fiddling with kerning
+
+2008-11-26 19:44 +0000 [r1107]  Stevan_White:
+
+	* FreeSerifBold.sfd: Basic kerning, named main
+	  Cyrillic letters
+
+2008-11-26 18:41 +0000 [r1106]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Basic Cyrillic kerning
+
+2008-11-26 07:03 +0000 [r1105]  Stevan_White:
+
+	* FreeSerif.sfd: further tweeks to Cyrillic
+	  kerning
+
+2008-11-26 06:58 +0000 [r1104]  Stevan_White:
+
+	* FreeSerif.sfd: Tweeks to Cyrillic kerning
+
+2008-11-26 00:32 +0000 [r1103]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  sfd/Makefile, FreeSerif.sfd,
+	  FreeSerifBold.sfd: Much fiddling with kerning,
+	  tables, and generating fonts whose kerning tables work with
+	  OpenOffice.
+
+2008-11-25 23:59 +0000 [r1102]  Stevan_White:
+
+	* tools/GenerateTrueType: Made to include old-style
+	  kerning Converted to Python
+
+2008-11-24 08:11 +0000 [r1100-1101]  Stevan_White:
+
+	* FreeSerif.sfd: Prev commit to validate
+
+	* FreeSerif.sfd: regularized padding in
+	  Miscellaneous symbols. At least within related ranges tried to
+	  make similar.
+
+2008-11-23 20:21 +0000 [r1097-1099]  Stevan_White:
+
+	* tools/ranges/__init__.py (added),
+	  tools/ranges/OpenType.py (added),
+	  tools/ranges (added): meant to add these before
+	  moving the ranges.py file
+
+	* tools/range_report (removed),
+	  tools/range_report.py (added): preferred to keep
+	  the file ending
+
+	* tools/range_report (added): Starting to break out
+	  different functionalities of this large script
+
+2008-11-23 15:38 +0000 [r1096]  Stevan_White:
+
+	* FreeSerif.sfd: Completed Miscellaneous
+	  Symbols, with some drawings from George Douros' Unicode Symbols,
+	  and some of mine.
+
+2008-11-23 14:21 +0000 [r1095]  Stevan_White:
+
+	* FreeSerif.sfd: Filled out Miscellaneous
+	  Symbols. Used George Douros' Unicode font.
+
+2008-11-23 12:57 +0000 [r1094]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoOblique.sfd: Replaced Greek Exteded
+	  psili and dasia with scaled versions of the "bent quote" mark. I
+	  think it's distinctive enough, but not so silly. Remedies bug
+	  #22997: Mono: Greek Extended psili is ugly
+	  https://savannah.gnu.org/bugs/?22997
+
+2008-11-23 00:47 +0000 [r1093]  Stevan_White:
+
+	* FreeSerif.sfd: Made some recycling symbols
+
+2008-11-22 23:07 +0000 [r1092]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Finished with Hebrew
+	  Pointed letters in all faces.
+
+2008-11-22 16:36 +0000 [r1091]  Stevan_White:
+
+	* FreeSans.sfd: Fiddled with Hebrew Pointed
+	  letters
+
+2008-11-22 15:45 +0000 [r1090]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Marks for Vietnamese
+
+2008-11-22 10:32 +0000 [r1089]  Stevan_White:
+
+	* CREDITS: fixed some links having to do with Omega,
+	  intlfonts
+
+2008-11-22 09:32 +0000 [r1088]  Stevan_White:
+
+	* CREDITS: Fixed/removed broken links
+
+2008-11-21 23:53 +0000 [r1087]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Letter pe had strange thick
+	  middle ear that looked awful. lamed had ben bumped at some point.
+	  Fixed. Adjusted some of the points.
+
+2008-11-21 22:54 +0000 [r1086]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: repairs to Pointed Hebrew
+
+2008-11-21 21:29 +0000 [r1085]  Stevan_White:
+
+	* FreeSerif.sfd: Numeral line positioning marks
+	  for Gothic
+
+2008-11-21 10:17 +0000 [r1084]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Added Combining Marks for
+	  Symbols (some question about obliqueness of some symbols) Cleaned
+	  up some empty glyphs in Pointed Hebrew.
+
+2008-11-20 21:00 +0000 [r1083]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Provided Hebrew pointed
+	  letters, with lookups, for all Serif faces.
+
+2008-11-19 22:30 +0000 [r1082]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd: renamed Hebrew
+	  lookups
+
+2008-11-19 22:12 +0000 [r1081]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Completed Hebrew in Bold
+	  faces.
+
+2008-11-19 00:04 +0000 [r1080]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerif.sfd: More tweeks to Hebrew points
+
+2008-11-18 23:44 +0000 [r1079]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd: Adjustments corrections and
+	  additions to Hebrew points
+
+2008-11-18 20:56 +0000 [r1078]  Stevan_White:
+
+	* FreeSansBold.sfd: Cleaned out a lot of
+	  ridiculous kernings
+
+2008-11-16 23:39 +0000 [r1077]  Stevan_White:
+
+	* FreeSansBoldOblique.sfd: fiddled with Armenian
+	  ligatures
+
+2008-11-16 23:26 +0000 [r1076]  Stevan_White:
+
+	* FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Added Armenian (with
+	  ligatures) to BoldOblique Fiddled with character spacing
+
+2008-11-16 22:56 +0000 [r1075]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Added U+01f9 and
+	  paragraph end marker to Georgian Fiddled with Armenian ligatures
+
+2008-11-15 13:36 +0000 [r1074]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Added Georgian turned
+	  gan 10F9 (because it was easy)
+
+2008-11-15 13:28 +0000 [r1073]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Another pass at
+	  letter spacing in Cyrillic. Also went through ancient letters.
+	  Added Georgian paragraph separator 10FB
+
+2008-11-15 10:11 +0000 [r1072]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Re-worked letter
+	  spacing through modern Cyrillic range.
+
+2008-11-15 00:05 +0000 [r1071]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSerif.sfd: Letter spacing
+
+2008-11-14 22:48 +0000 [r1070]  Stevan_White:
+
+	* FreeSerif.sfd: Added several characters to
+	  Cyrillic Extended-B
+
+2008-11-14 09:56 +0000 [r1069]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd: Made Cyrillic hooked
+	  e U+04BC-F to look less goofy.
+
+2008-11-14 09:36 +0000 [r1068]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Based on assertion on
+	  Pechatnyj Dvor's web site, Cyrillic Fita U+0472-3 and "Barred O"
+	  U+04E8-9 are different styles the same letter, and the fact that
+	  the tilde in the O never looked good in Sans, I made them all
+	  barred O's.
+
+2008-11-14 09:32 +0000 [r1067]  Stevan_White:
+
+	* FreeSerif.sfd: Added Cyrillic Yn, yn
+	  (U+a65e-f)
+
+2008-11-14 08:30 +0000 [r1066]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerifBold.sfd: Synced up Cyrillic and
+	  Combining Diacritics ranges, Couple of tweeks in Gujarati to make
+	  TT validate
+
+2008-11-13 23:44 +0000 [r1065]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Changes to older Cyrillic
+	  letters, in response to further information. Made omegas, omegas
+	  with titlo, and OT to all be of the same size and shape in Serif.
+	  Un-linked Cyrillic Psi and psi from Greek, made squarer versions.
+	  Some more Cyrillic diacritical marks in Sans. Re-worked U+04bc-f
+	  . Experimenting with mark positioning for Cyrillic
+
+2008-11-12 22:53 +0000 [r1064]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Strove to make Euro
+	  look more like the EC logo design, while making glyph fit better
+	  with the design of its face. See bug #3576: Euro design
+	  https://savannah.gnu.org/bugs/?23576
+
+2008-11-12 21:33 +0000 [r1063]  Stevan_White:
+
+	* FreeSans.sfd: Tweeks to previous commit
+
+2008-11-12 21:10 +0000 [r1062]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Adjustments mostly to GPOS
+	  tables having to do with Vietnamese marks. The WAZU Vietnamese
+	  test page looks pretty good in Sans now. Still not thrilled with
+	  below-dot when it appears with a mark over e.g. U+0102. Pango
+	  positions one or the other but not both.
+
+2008-11-12 00:04 +0000 [r1061]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Extensive
+	  modification of GPOS lookup tables for mark positioning. I think
+	  they're now all functional (except styled Mono faces have none).
+	  Also added lots of marks to faces that didn't have them, and also
+	  fiddled with Combining Diacritical Marks.
+
+2008-11-10 19:53 +0000 [r1060]  Stevan_White:
+
+	* FreeSerif.sfd: Made one combining mark really
+	  combining
+
+2008-11-10 19:49 +0000 [r1059]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Made a few combining
+	  characters to be zero-width in Mono, Added them to other styles.
+
+2008-11-09 23:49 +0000 [r1058]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Figured out why below marks
+	  in Thai weren't working in the lowest letters. I think Pango and
+	  other font renderers ignore 'blwm'. 'mark' works though.
+
+2008-11-09 23:21 +0000 [r1057]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Tweeks to Thai marks
+
+2008-11-09 22:56 +0000 [r1056]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Several bugfixes in Thai,
+	  mostly having to do with mark placement and ligatures.
+	  Implemented ru-saraaa and lu-saraaa with ligatures.
+
+2008-11-09 21:21 +0000 [r1055]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: added and named
+	  dottedcircle (used by Pango to render combining mark base)
+
+2008-11-09 12:42 +0000 [r1054]  Stevan_White:
+
+	* FreeSerif.sfd: More tweeks to Coptic
+
+2008-11-09 12:22 +0000 [r1053]  Stevan_White:
+
+	* FreeSerif.sfd: Tweeks to Coptic, after viewing
+	  more papyrus samples and web pages.
+
+2008-11-09 10:41 +0000 [r1052]  Stevan_White:
+
+	* FreeSerif.sfd: Weight of Coptic small letters
+	  made to match that of Latin and Greek ones.
+
+2008-11-08 20:05 +0000 [r1051]  Stevan_White:
+
+	* FreeSerif.sfd: Coptic tweek spacing
+
+2008-11-08 19:22 +0000 [r1050]  Stevan_White:
+
+	* FreeSerif.sfd: Made Coptic to comply better
+	  with http://www.wazu.jp/gallery/Test_Coptic.html Made a flourish
+	  at foot of letters with long diagonal.
+
+2008-11-08 15:51 +0000 [r1049]  Stevan_White:
+
+	* FreeSerif.sfd: Coptic: punctuation marks were
+	  in the wrong row.
+
+2008-11-08 15:38 +0000 [r1048]  Stevan_White:
+
+	* FreeSerif.sfd: More tweeks to Coptic; put in a
+	  mark lookup table. Note: for small letters I made scaled
+	  references to captials. Results in those letters looking quite
+	  light next to the capitals and next to small Latin letters. Also,
+	  there are a few variant forms for capitals (Unicode samples don't
+	  show this). It would be good to re-work
+
+2008-11-08 13:27 +0000 [r1047]  Stevan_White:
+
+	* FreeSerif.sfd: Added Coptic alphabet in
+	  u+2C80-2CB1 and u+03E2-u+03EF, drawn/built by me, based on
+	  Unicode samples, TeX font copte, and scans at WikiPedia.
+
+2008-11-07 08:12 +0000 [r1046]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Further tweeks to dieresis
+	  in Greek and Cyrillic
+
+2008-11-07 07:41 +0000 [r1045]  Stevan_White:
+
+	* FreeSerif.sfd: replaced Greek I dieresis with
+	  references, tweeked height of dieresis.
+
+2008-11-04 08:42 +0000 [r1044]  Stevan_White:
+
+	* FreeSerif.sfd: Added a few Cyrillic Extended-B
+	  letters seen in web pages while looking for Glagolitic text.
+
+2008-11-04 00:29 +0000 [r1042-1043]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoOblique.sfd: Added a few old Cyrillic
+	  characters.
+
+	* FreeSerif.sfd: Several corrections and tweeks
+	  to Glagolitic. Still missing six slots from Unicode, but don't
+	  see them in the TeX fonts. On the other hand, several on-line
+	  Glagolitic pages (bibles etc) don't seem to use these. Maybe it's
+	  OK as-is.
+
+2008-11-03 09:53 +0000 [r1041]  Stevan_White:
+
+	* FreeSerif.sfd: Added lowercase range to
+	  Glagolitic, as a facile scaling of the uppercase.
+
+2008-11-03 09:50 +0000 [r1040]  Stevan_White:
+
+	* FreeSerif.sfd: Added letter to Glagolitic,
+	  scaled range.
+
+2008-11-02 22:59 +0000 [r1039]  Stevan_White:
+
+	* FreeSerif.sfd: Replaced fraktur bold from
+	  Mathematical Alphanumeric Symbols with that from TX Fonts by
+	  Young Ryu. One concern: letter k is damaged (in both medium and
+	  bold). I just hacked something up. Added Glagolitic "round type"
+	  font (Croation capitols only) from the collection of Croatian
+	  fonts for LaTeX by Darko ZubriniÄ
+	  ftp://ftp.dante.de/tex-archive/languages/croatian/
+	  http://www.tug.org/TUGboat/Articles/tb17-1/tb50zubr.pdf Several
+	  letters are missing besides the small letters.
+
+2008-11-02 09:06 +0000 [r1038]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd: A couple of Thai
+	  references got obliqued twice.
+
+2008-11-02 08:57 +0000 [r1037]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: By popular demand, removed
+	  'ears' from Greek Upsilon and Psi. Copied resulting glyphs to
+	  Serif Mathematical Alphanumeric Symbols.
+
+2008-11-02 00:49 +0000 [r1036]  Stevan_White:
+
+	* FreeSerif.sfd: Some pointwise cleanup of main
+	  Tamil range
+
+2008-11-01 23:20 +0000 [r1035]  Stevan_White:
+
+	* FreeSerif.sfd: Tried some things with lookups.
+	  Didn't make much headway.
+
+2008-11-01 22:34 +0000 [r1033-1034]  Stevan_White:
+
+	* FreeMono.sfd: somehow made a letter with wrong
+	  width
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Added similar lookups and
+	  ligatures to Thai ranges.
+
+2008-11-01 18:34 +0000 [r1032]  Stevan_White:
+
+	* FreeSerif.sfd: Lookups now work no worse than
+	  those for other Thai fonts, at least in Pango. Still perplexed by
+	  behaviour of "Required" lookups.
+
+2008-11-01 15:44 +0000 [r1031]  Stevan_White:
+
+	* FreeSerif.sfd: For Thai, made ligatures and
+	  lookups for yoying and thothan combined with a lower vowel. These
+	  work well. Attempted looksups for saraaa with ru and lu, and for
+	  saraam. Not working.
+
+2008-10-31 23:54 +0000 [r1030]  Stevan_White:
+
+	* FreeSans.sfd: Cleaned up a few of the Bengali
+	  ligatures
+
+2008-10-31 23:46 +0000 [r1029]  Stevan_White:
+
+	* FreeSerifBold.sfd: Tweek Thai
+
+2008-10-31 22:48 +0000 [r1028]  Stevan_White:
+
+	* FreeSerif.sfd: Fixed ligatures and mark
+	  positioning for HanunÃ³o. Problem with ligatures: Gnome pango
+	  doesn't do 'rlig', only 'liga'
+
+2008-10-31 21:27 +0000 [r1027]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Changed lookup table
+	  scripts for Devanagari and Bengali. Find Problems -> ATT found
+	  several problems showing lookups acting on glyphs that weren't
+	  listed in the script ranges, including dev2, bng2 (why not deva
+	  and beng, I don't know). danda and doubledanda of Devanagari I
+	  understand are to be shared among Indic scripts. So included bng2
+	  and dev2 in the 'aalt' table for those. The 'init' and 'half'
+	  tables for Bengali made active for bng2. The 'locl' table for
+	  Bengali didn't do anything I could see: It mapped the Devanagari
+	  danda to itself, and the doubledanda to itself. Deleted.
+
+2008-10-31 20:10 +0000 [r1026]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Cleaned up some kern
+	  tables. adjustments of under 5 EM are invisible. Some others I
+	  just didn't like. Some were putting a letter beneath another,
+	  with is wrong.
+
+2008-10-31 19:39 +0000 [r1025]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd: Added Thai
+
+2008-10-31 19:02 +0000 [r1024]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBold.sfd: Changes to mark positioning
+	  lookups, esp. in Italic. Widened numerals in Bold
+
+2008-10-27 19:00 +0000 [r1023]  Stevan_White:
+
+	* FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Tweeks regarding
+	  Armenian and lookups
+
+2008-10-27 18:48 +0000 [r1022]  Stevan_White:
+
+	* FreeSansBold.sfd: Added Armenian ligatures
+	  FB13-FB17 with lookups Also made a historical ligature ('hlig')
+	  table for u+0587. Toward bug #15183: missing characters from
+	  Armenian range (FreeSans, Bold)
+	  https://savannah.gnu.org/bugs/index.php?15183
+
+2008-10-27 09:17 +0000 [r1021]  Stevan_White:
+
+	* FreeSansOblique.sfd: Added Armenian ligatures,
+	  lookups. Cleaned up contours.
+
+2008-10-26 23:45 +0000 [r1020]  Stevan_White:
+
+	* FreeSans.sfd: Added 5 Armenian ligatures to
+	  U+FB13 â FB17, and made corresponding 'liga' lookup. Found
+	  there one ligature u+0587 that according to
+	  http://en.wikipedia.org/wiki/Armenian_alphabet "in new
+	  orthography the Ö character is not a typographical ligature
+	  anymore, and must never be treated as such. It is a distinct
+	  letter and has its place in the new alphabetic sequence." So
+	  moved this out of the 'liga' lookup and into a new 'hlig' lookup.
+
+2008-10-26 22:26 +0000 [r1019]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Lots of improvements to
+	  Thai. Completely revised letter spacing in Italic, and fiddled
+	  with combining marks in all. Still aren't working quite right,
+	  especially in Italic. Still need to work over digits (in Bold
+	  they aren't even bold yet)
+
+2008-10-26 14:21 +0000 [r1018]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Bold Thai : added
+	  (painstakingly) constructed glyphs, lookups roman Thai: tweeks
+	  Italic Thai: tweeks (Note this still has multiple problems)
+
+2008-10-25 08:26 +0000 [r1017]  Stevan_White:
+
+	* FreeSerif.sfd: WAZU says
+	  http://www.wazu.jp/gallery/Fonts_Hanunoo.html MPH 2B Damase
+	  doesn't support the consonant-vowel ligatures necessary to render
+	  Buhid writing. OK, so I made 'mark' lookups for combining marks
+	  and a bunch of ligatures in an 'rlig' lookup. The latter still
+	  not working: don't know why. Made page to match the example of
+	  the combining forms at
+	  http://www.omniglot.com/writing/hanunoo.htm
+
+2008-10-24 21:56 +0000 [r1016]  Stevan_White:
+
+	* FreeSerif.sfd: Removed some marks from
+	  Mathematical Alphanumeric Symbols
+
+2008-10-24 08:13 +0000 [r1015]  Stevan_White:
+
+	* FreeSerif.sfd: Tweeked combining marks for
+	  Vietnamese. Made to satisfy WAZU JAPAN Comprehensive Unicode Test
+	  Page for Vietnamese / Quá»c Ngá»¯
+	  http://www.wazu.jp/gallery/Test_Vietnamese.html Could still use
+	  some tweeking...
+
+2008-10-24 07:25 +0000 [r1014]  Stevan_White:
+
+	* FreeSerif.sfd: Added marks for composition of
+	  Vietnamese
+
+2008-10-23 22:03 +0000 [r1013]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd: Put "below" combining mark on
+	  lots of vowels and derivatives, for Vietnamese. Named a bunch of
+	  composit Latin, expecting to make substitutions.
+
+2008-10-23 20:14 +0000 [r1012]  Stevan_White:
+
+	* FreeSerif.sfd: Thai spacing alterations based
+	  on advice of a native speaker.
+
+2008-10-22 06:30 +0000 [r1011]  Stevan_White:
+
+	* FreeSerif.sfd: re-named Thai lookups according
+	  to order
+
+2008-10-21 21:28 +0000 [r1010]  Stevan_White:
+
+	* FreeSans.sfd: Cleanup of glyphs in Gujarati,
+	  Devanagari. Note: Serious problem with Sans GPOS abvm in
+	  Devanagari "'abvm' Above Base Mark in Devanagari subtable"
+	  "gujr-0" But all the characters that list gujr-0 are in Gujarati.
+	  Not sure how this got broken or how to fix it.
+
+2008-10-21 19:32 +0000 [r1009]  Stevan_White:
+
+	* FreeSerif.sfd: Fiddled with Thai mark
+	  positioning: passes my tests now OK. Made a few more references
+	  in Math Symbols; more regularization of stroke.
+
+2008-10-21 09:01 +0000 [r1008]  Stevan_White:
+
+	* FreeSerif.sfd: Added mark class for Vietnamese
+	  "horn" Several references made in General Punctuation, Arrows
+
+2008-10-20 22:47 +0000 [r1007]  Stevan_White:
+
+	* FreeMono.sfd: added some Combining Diacritical
+	  Marks
+
+2008-10-20 18:41 +0000 [r1006]  Stevan_White:
+
+	* FreeSerif.sfd: Made some references from
+	  serifed Latin capitals to Greek counterparts.
+
+2008-10-20 18:24 +0000 [r1005]  Stevan_White:
+
+	* FreeSerif.sfd: Made a few repeated glyphs into
+	  references in Musical Symbols
+
+2008-10-20 17:33 +0000 [r1004]  Stevan_White:
+
+	* tools/ranges.py, tools/validate.py:
+	  tweeked some ranges, format of output
+
+2008-10-19 19:36 +0000 [r1003]  Stevan_White:
+
+	* FreeSerif.sfd: Moved several glypns from
+	  Mathematical Alphanumeric Symbols to Letterlike Symbols. Couple
+	  tweeks in Mathematical Symbols.
+
+2008-10-19 18:30 +0000 [r1002]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd: Fiddling with Mathematical
+	  Symbols. In Serif, trying to make stroke width more consistent.
+
+2008-10-19 16:47 +0000 [r1001]  Stevan_White:
+
+	* FreeMono.sfd: Tweek
+
+2008-10-19 16:44 +0000 [r1000]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Added some Greek
+	  symbols in Mono and Sans to make a little more regular and
+	  correspond better with TeX. Tweek of serif.
+
+2008-10-19 14:47 +0000 [r999]  Stevan_White:
+
+	* FreeSansBold.sfd: a few more improvements.
+	  (One problem with the Mathematical Alphanumeric area is, one must
+	  remember to change it any time another face is altered...)
+
+2008-10-19 14:41 +0000 [r998]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerifBold.sfd: Several improvements and
+	  additions to Sans faces (mostly in Greek) from experience of
+	  pasting into FreeSerif Mathematical Alphanumeric Symbols.
+
+2008-10-19 14:37 +0000 [r997]  Stevan_White:
+
+	* FreeSerif.sfd: Replaced most of Mathematical
+	  Alphanumeric Symbols roman italic bold (latin and greek) gothic
+	  italic bold (latin and greek) typewriter and numerals with glyphs
+	  from FreeFont. These were scaled to uniform height. Remains:
+	  Blackboard Bold, Fraktur, Calligraphic, Script
+
+2008-10-19 12:03 +0000 [r996]  Stevan_White:
+
+	* FreeSerif.sfd: Tidied lookup table names for
+	  Malayalam
+
+2008-10-19 11:49 +0000 [r995]  Stevan_White:
+
+	* FreeSerif.sfd: Applied Malayalam patch from
+	  Hiran Venugopalan
+
+2008-10-19 10:27 +0000 [r993-994]  Stevan_White:
+
+	* FreeMono.sfd: Added/corrected many
+	  Mathematical Symbols
+
+	* FreeSansOblique.sfd: more IPA
+
+2008-10-18 11:20 +0000 [r992]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Made lots more IPA
+	  and Phonetic Extensions Note: fontforge is reporting an error in
+	  a few glyphs made by scaling another, that the glyphs are drawn
+	  in the wrong direction--only in TrueType though. Suspect a
+	  FontForge bug.
+
+2008-10-17 23:10 +0000 [r991]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Added several
+	  Combining Diacritical Marks
+
+2008-10-17 20:33 +0000 [r990]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Made several Spacing
+	  Modifier Letters, Combining Diacritical Marks, and IPA and
+	  Phonetic Extensions
+
+2008-10-17 06:40 +0000 [r989]  Stevan_White:
+
+	* CREDITS: Hiran Venugopalan of Swathanthra
+	  Malayalam Computing George Douros Daniel Johnson
+
+2008-10-16 20:53 +0000 [r988]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Added some Superscripts and
+	  Subscripts
+
+2008-10-16 20:01 +0000 [r987]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Finished off
+	  Superscripts and subscripts
+
+2008-10-16 19:06 +0000 [r986]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Completed General
+	  Punctuation for Mono faces
+
+2008-10-16 08:08 +0000 [r985]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Added some General
+	  Punctuation
+
+2008-10-16 06:48 +0000 [r983-984]  Stevan_White:
+
+	* tools/ranges.py: un-grayed totals rows
+
+	* tools/ranges.py: Fiddled Cyrillic made output
+	  prettier
+
+2008-10-15 18:28 +0000 [r982]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: more Letterlike
+	  Symbols, Currency Symbols
+
+2008-10-15 08:49 +0000 [r981]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Made some Combining
+	  Diacritical Marks for Symbols, Letterlike Symbols
+
+2008-10-14 22:18 +0000 [r980]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Added some General
+	  Punctuation
+
+2008-10-14 21:24 +0000 [r979]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Added double slanted
+	  hyphen, made General Punctuaton Supplement like Serif's
+
+2008-10-14 21:03 +0000 [r977-978]  Stevan_White:
+
+	* FreeSansBoldOblique.sfd: Filled out Greek
+	  Extended
+
+	* FreeSerifItalic.sfd,
+	  FreeMono.sfd: fixes to last 2 commits
+
+2008-10-14 19:51 +0000 [r976]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Last character to General
+	  Punctuation
+
+2008-10-14 19:43 +0000 [r975]  Stevan_White:
+
+	* FreeMono.sfd: Built some Enclosed
+	  Alphanumerics (1-10)
+
+2008-10-14 07:26 +0000 [r974]  Stevan_White:
+
+	* FreeSerif.sfd: Copied in Daniel Johnson's
+	  changes to Cherokee.
+
+2008-10-12 15:42 +0000 [r973]  Stevan_White:
+
+	* FreeSerif.sfd: Included Daniel Johnson's
+	  Cherokee glyphs.
+
+2008-10-05 11:20 +0000 [r972]  Stevan_White:
+
+	* FreeMono.sfd: Further corrections to diaresis
+	  in Cyrillic -- legibility in small sizes
+
+2008-10-05 10:43 +0000 [r971]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd: Regularized placement of
+	  diaresis in Cyrillic
+
+2008-10-05 09:07 +0000 [r970]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Added same set of
+	  glyphs to Cyrillic Supplement
+
+2008-10-04 22:26 +0000 [r969]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Added some of the
+	  easier letters from Cyrillic Supplement
+
+2008-10-04 20:27 +0000 [r968]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoBoldOblique.sfd: Finished high
+	  Cyrillic range for MonoBold and MonoBoldOblique. (Remaining:
+	  historic ranges, Cyrillic extensions) Tweeked others.
+
+2008-10-04 13:26 +0000 [r967]  Stevan_White:
+
+	* INSTALL: Added info about Adobe ATM
+
+2008-10-03 22:40 +0000 [r966]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeMonoBold.sfd: Serif*Italic: Added last
+	  Abkhazian letters to Cyrillic MonoBold: tweek
+
+2008-10-03 16:23 +0000 [r965]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoOblique.sfd: Mono: Some additions to
+	  historic letters
+
+2008-10-03 14:55 +0000 [r964]  Stevan_White:
+
+	* FreeSerif.sfd: Added some punctuation and
+	  combining numeric marks from Cyrillic Extended B
+
+2008-10-03 13:21 +0000 [r963]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeSerifBold.sfd: Various technical tweeks,
+	  mostly concerning recent additions. Also did a bit more "Points
+	  too close" and "irrelevant control points". Cyrillic millions
+	  redesign meant could not maintain use of refrences for it.
+
+2008-10-03 11:03 +0000 [r962]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: More high Cyrillic Included
+	  old Cyrillic millions combining mark in Sans, changed design in
+	  Serif
+
+2008-10-02 21:44 +0000 [r961]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: More high Cyrillic
+
+2008-10-02 17:45 +0000 [r960]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoOblique.sfd: More high Cyrillic glyphs
+
+2008-10-02 08:55 +0000 [r959]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd: More glyphs in high
+	  Cyrillic. Remains only some whose form I'm unsure of in italic.
+
+2008-10-02 07:44 +0000 [r958]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd: More glyphs in higher
+	  Cyrillic range
+
+2008-10-01 23:02 +0000 [r957]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Same process of
+	  tightening el, em, ge (but a P.S. to previous commit: also did
+	  ya, ze for SerifBold.
+
+2008-10-01 22:54 +0000 [r956]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: BoldItalic: Tightened up
+	  spacing on left of el, em, ge (could go farther, but it is partly
+	  a problem with glyph design...
+
+2008-10-01 22:10 +0000 [r955]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: More additions to Cyrillic.
+	  Finished SerifBold except for Nivkh additions. Used references on
+	  number combining forms.
+
+2008-09-29 22:44 +0000 [r954]  Stevan_White:
+
+	* FreeSerif.sfd: Added four (obsolete) Chuvash
+	  letters to Cyrillic Supplement - completing it.
+
+2008-09-29 21:32 +0000 [r953]  Stevan_White:
+
+	* FreeSerif.sfd: Greek adjustments Adjusted
+	  spacing of kappa slightly Got rid of ears on Psi, following
+	  similar request for Upsilon.
+
+2008-09-28 17:02 +0000 [r952]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Adding and fiddling with
+	  Spacing Modifiers and Combining Diacriticals
+
+2008-09-28 10:30 +0000 [r951]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Revisions of several
+	  Combining Diacritical marks
+
+2008-09-28 10:25 +0000 [r950]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: More Combining
+	  Diacriticals
+
+2008-09-28 08:18 +0000 [r949]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Still more Spacing
+	  Modifiers and Combining Diacriticals
+
+2008-09-28 00:10 +0000 [r948]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: A few Combining
+	  Diacriticals and Spacing Modifiers
+
+2008-09-27 23:45 +0000 [r947]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: MonoBoldOblique:
+	  Primarily filling out Spacing Modifier Letters others: little
+	  fixes found along the way
+
+2008-09-27 13:04 +0000 [r946]  Stevan_White:
+
+	* FreeSerif.sfd: Replaced Malayalam range with
+	  that from Rachana_04 found on Swathanthra Malayalam Computing
+	  project page http://savannah.nongnu.org/projects/smc/ Besides
+	  scaling and converting to cubic, performed much clean-up of
+	  glyphs, added an r2 character, and re-named a bunch of
+	  characters.
+
+2008-09-22 22:06 +0000 [r945]  Stevan_White:
+
+	* tools/ranges.py: Corrections and additions to
+	  several ranges, put extra row in table with character totals
+
+2008-09-22 21:41 +0000 [r944]  Stevan_White:
+
+	* FreeSerif.sfd: Filled in as much of Phonetic
+	  Extensions as I could without artistic abilities. Note 1D48-9 are
+	  not references due to apparent FontForge bug, that says scaled
+	  references go in wrong direction.
+
+2008-09-22 19:20 +0000 [r943]  Stevan_White:
+
+	* FreeSerif.sfd: Cleaup of some Bengali glyphs.
+	  Note many of the ligatures remain very very messy.
+
+2008-09-22 14:29 +0000 [r940-942]  Stevan_White:
+
+	* Makefile: made some lines quiet
+
+	* sfd/Makefile: added more validations made to work
+	  with GenerateOpenType
+
+	* tools/GenerateOpenType: Replaced bash version with
+	  Python
+
+2008-09-22 09:23 +0000 [r939]  Stevan_White:
+
+	* FreeSerif.sfd: Built two more easy Phonetic
+	  Extensions
+
+2008-09-22 09:14 +0000 [r938]  Stevan_White:
+
+	* FreeSerif.sfd: Built some Phonetic Extensions
+	  letters, those with middle tilde
+
+2008-09-21 20:46 +0000 [r937]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Added lots of Spacing
+	  Modifier Letters and Combining Diacritical Marks.
+
+2008-09-21 15:34 +0000 [r936]  Stevan_White:
+
+	* FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Wrote script to check
+	  if glyph encodings were in stated ranges, fixed most
+	  discrepancies. There were a bunch of incompletely deleted
+	  characters in several faces. Sans: found several other problems
+	  in the process Tamil Four slots labelled 0BDA-D have glyphs, not
+	  in Unicode. also 0BE1 I think they are misplaced; added 0010 to
+	  each of them Devanagari Slot labelled U+093B is not in
+	  Unicode--can't find glyph: deleted likewise 094F (may have been
+	  meant to be 0954) 0955, 0973-0976 0954 should be a combining
+	  mark, but it appears on the wrong side of 0. 0971 was just
+	  wrong--made into simple dot. 0972 is also wrong--made my own
+	  Candra A. Gujarati Slots labelled 0AE4-5 are not in Unicode; seem
+	  not to belong at all. Deleted. 2800 is a dup of 2790. Deleted
+	  Serif: phillipine_double u1736 was misplaced A bunch of the Math
+	  Alphanumeric symbols are empty in the standard, because they're
+	  represented elsewhere. These should be deleted (TO DO) First need
+	  to make style consistent with existing symbols.
+
+2008-09-21 11:41 +0000 [r935]  Stevan_White:
+
+	* FreeSerif.sfd: Applied patch from Daniel J
+	  Remedies bug FreeSerif: Missing glyphs with palatal hook
+	  https://savannah.gnu.org/bugs/index.php?24298 Adding several
+	  letters to Phoenetic Extensions range U+1D80-BF
+
+2008-09-21 11:00 +0000 [r934]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Made four characters
+	  U+200C-F to be zero-width Remedy to bug #23593: Mono 0-width
+	  chars: zero-width or space?
+	  https://savannah.gnu.org/bugs/index.php?23593
+
+2008-09-20 23:17 +0000 [r933]  Stevan_White:
+
+	* FreeSerif.sfd: Made Mahjong tiles to take up
+	  less space using references Cleaned up several validation
+	  problems
+
+2008-09-19 22:54 +0000 [r932]  Stevan_White:
+
+	* tools/checkGlyphNumbers.py: included other Private
+	  Use Ranges
+
+2008-09-19 20:48 +0000 [r931]  Stevan_White:
+
+	* tools/checkGlyphNumbers.py (added): Added script
+	  to check that glyph numbers match Unicode (with complication)
+
+2008-09-19 20:36 +0000 [r930]  Stevan_White:
+
+	* tools/ranges.py: corrected and simplified
+	  calculation of whether OS/2 bit is set. Now works mostly
+	  perfectly, except for some high Unicode ranges...
+
+2008-09-19 20:25 +0000 [r928-929]  Stevan_White:
+
+	* FreeSerif.sfd: Added several Hebrew Alphabetic
+	  Presentation Forms (some easy ones), to make its coverage the
+	  same as Serif Bold.
+
+	* FreeSerifBold.sfd: Re-encoded. Deleted several
+	  glyphs in Hebrew Alphabetic Presentation Forms that didn't
+	  correspond valid Unicode
+
+2008-09-19 20:19 +0000 [r927]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeMonoBold.sfd: Ran script to find
+	  mis-numbered glyphs. Several were simply typos, some offset by
+	  one.
+
+2008-09-19 20:13 +0000 [r926]  Stevan_White:
+
+	* FreeSansOblique.sfd: Numerous cases of glyphs
+	  in Private Use area incorrectly assigned Unicode numbers and
+	  names. Gave all -1 for Unicode and named like "slot.XXXX".
+
+2008-09-19 09:51 +0000 [r921-925]  Stevan_White:
+
+	* tools/GenerateOpenType: Made to output old-style
+	  kerning tables for Windows (FontForge complains though)
+
+	* tools/GenerateTrueType: Made to hint before
+	  instructing: FontForge bases TT instructions on hints although
+	  hints are not put into TrueType fonts.
+
+	* tools/hex_range.py: cosmetic tweek
+
+	* tools/isMonoMono.py: re-worked to take a list of
+	  files as input
+
+	* tools/ranges.py: re-structured code and corrected
+	  a few ranges
+
+2008-09-19 09:17 +0000 [r920]  Stevan_White:
+
+	* FreeSerif.sfd: Adapted Mahjong Tiles from
+	  George Douros' Unicode Symbols font.
+
+2008-09-18 23:27 +0000 [r919]  Stevan_White:
+
+	* FreeSerif.sfd: Added Domino Tiles. Domino
+	  outline is copied from George Douros' Unicode Symbols, but the
+	  rest I preferred to do with references.
+
+2008-09-18 21:30 +0000 [r918]  Stevan_White:
+
+	* FreeSerif.sfd: Adapted Mathematical
+	  Alphanumeric Symbols from George Douros' Unicode Symbols font.
+
+2008-09-18 21:02 +0000 [r917]  Stevan_White:
+
+	* FreeMonoBoldOblique.sfd: This one got away
+	  from me--I don't know what I did. Looks like some small contour
+	  edits.
+
+2008-09-18 20:58 +0000 [r915-916]  Stevan_White:
+
+	* FreeSansBoldOblique.sfd: Fixed one mis-numberd
+	  character in Latin Extended-B
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBold.sfd: Fixed several mis-numbered
+	  characters.
+
+2008-09-18 20:13 +0000 [r914]  Stevan_White:
+
+	* FreeSansBold.sfd: SansBold: one Georgian
+	  letter with no name, one Zapf Dingbat was unnumbered ATT test
+	  shows a bunch of problems with Gurmukhi and 'blwf' table indeed
+	  shows those letters at 0x10000+ Sans names them like
+	  uni0A30_uni0A4D.blwf: they are in range ECC6 to ED06 I meant to
+	  move this range into Private Use in last release, and missed it.
+	  So now it is moved, into same range as Sans. Both Sans and
+	  SansBold in nukt table for Gurmukhi have duplicate entries for
+	  uni0A15 uni0A3C. Deleted dups.
+
+2008-09-18 19:05 +0000 [r913]  Stevan_White:
+
+	* FreeMonoOblique.sfd: fixed a number of
+	  Unassigned Code Points in Greek Extended
+
+2008-09-18 18:31 +0000 [r912]  Stevan_White:
+
+	* FreeSansOblique.sfd: mis-numbered Combining
+	  Diacritics
+
+2008-09-18 18:24 +0000 [r911]  Stevan_White:
+
+	* FreeSansOblique.sfd: Several chars in Latin
+	  Extended hadn't been named. One spurious letter in Letterlike
+	  Symbols
+
+2008-09-16 19:37 +0000 [r910]  Stevan_White:
+
+	* FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd: Lots of additions: unless
+	  otherwise noted, they are from George Duros' fonts Analecta,
+	  Music, and Unicode (haven't got final confirmation of the
+	  eligibility of these glyphs, so this is just for testing.) Added
+	  some combining marks, fiddled a bit. In both Serif & Mono, tried
+	  to get a key symbol characters to fit inside the key combining
+	  mark Serif Got rid of ears on Upsilon Added: Gothic Western &
+	  Byzantine Musical Symbols Misc Symbols, Misc Technical Symbols
+	  (also drew many myself) Supplemental Symbols and Arrows Mono
+	  Added: lotsa Misc Technical Symbols OCR Symbols drew many
+	  Supplemental Symbols and Arrows, Misc Technical Sans Added
+	  Phoenecian Made a few Letterlike Symbols; Made Re and Im to be
+	  sans-serif.
+
+2008-09-11 20:49 +0000 [r908]  Stevan_White:
+
+	* ChangeLog: changes since June
+
+2008-09-11 20:42 +0000 [r907]  Stevan_White:
+
+	* FreeSerif.sfd: Removed pointless entries from
+	  Latin kern table Tidied points in Sinhala
+
+2008-09-07 21:47 +0000 [r906]  Stevan_White:
+
+	* FreeSerif.sfd: Tidied up Tamil ligatures
+	  EEA8-EEAB to fix TT build warning "MonotonicFindAlong: Never
+	  found our spline."
+
+2008-09-07 21:07 +0000 [r905]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  sfd/Makefile, FreeSans.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Added APL characters
+	  to FreeMono (why?...) Fixed several last-minute problems,
+	  including Serif: Tweeked GPOS mark table for Cyrillic Sans: Added
+	  a GPOS table for Cyrillic (but several diacritics are missing)
+	  Serif, Mono: tweeked some bugs in extensible brackets & integrals
+	  Serif: Vietnamese o circumflex: accent was a bit high. fixed.
+	  MonoBoldOblique OTF build uni213b intersects self Generation of
+	  TT fonts complains about several things to stderr, including
+	  SerifBold: "There exists a 'fpgm' code that seems incompatible
+	  with FontForge's. Instructions generated will be of lower
+	  quality. If legacy hinting is to be scrapped, it is suggested to
+	  clear the `fpgm` and repeat autoinstructing. It will be then
+	  possible to append user's code to FontForge's 'fpgm', but due to
+	  possible future updates, it is extremely advised to use high
+	  numbers for user's functions." (probably has been there since I
+	  first copied the TT instructions in. ) Just repeated the copying
+	  process carefully, and the warning went away. Serif:
+	  "FindMatchingHVEdge fell into an impossible position" fixed a
+	  bunch of point too close REMAINING PROBLEM in Serif TT build
+	  "MonotonicFindAlong: Never found our spline." fixed several bad
+	  TT matrices-- there are several more fixed many "control points
+	  too close" no luck
+
+2008-09-03 08:43 +0000 [r904]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd: Added/corrected some
+	  Misc. Symbols by copying from Serif. Note this is only a stopgap
+	  solution. Want real sans-serif symbols.
+
+2008-09-02 22:41 +0000 [r903]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Put in minimal
+	  Miscellaneous Symbols: Card suites and some musical notes. Note
+	  not very happy with shapes...some I just drew. Sans isn't really
+	  sans. Fixed one APL symbol in Mono so it verified in OTF version
+
+2008-08-31 11:39 +0000 [r902]  Stevan_White:
+
+	* FreeMono.sfd: Built set of APL symbols.
+
+2008-08-30 18:37 +0000 [r901]  Stevan_White:
+
+	* FreeSans.sfd: Un-linked references in uni02B2
+	  and uni02B5, because when validating the TrueType version,
+	  fontforge gave an error "is drawn in wrong direction". (I suspect
+	  a bug in fontforge. Other similar glyphs make no errors.)
+
+2008-08-30 16:23 +0000 [r900]  Stevan_White:
+
+	* FreeSerif.sfd: Fixed missing extrema in
+	  TrueType. These were the last cases being reported by validate in
+	  all the faces.
+
+2008-08-30 13:46 +0000 [r899]  Stevan_White:
+
+	* FreeSerifItalic.sfd: fixed last missing
+	  extrema in TrueType
+
+2008-08-30 11:02 +0000 [r898]  Stevan_White:
+
+	* sfd/Makefile, Makefile,
+	  tools/validate.py,
+	  tools/isMonoMono.py: restructured validation to
+	  look in a directory
+
+2008-08-30 10:57 +0000 [r897]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerif.sfd: Fixed missing extrema in
+	  TrueType versions
+
+2008-08-30 09:31 +0000 [r894-896]  Stevan_White:
+
+	* AUTHORS, CREDITS: unified style
+
+	* README: lots of re-wording, concerning goals and
+	  purposes
+
+	* INSTALL: Got rid of outline style, tried to make a
+	  little more appealing.
+
+2008-08-14 22:01 +0000 [r893]  Stevan_White:
+
+	* FreeSans.sfd: Same problem with uni0A83 as
+	  with bn_llikaar. Just made zero-width.
+
+2008-08-14 20:29 +0000 [r892]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd: Glyph bn_llikaar, U+09E3
+	  BENGALI VOWEL SIGN VOCALIC LL, has right bound positioned far
+	  into the negative. Causes a warning in fontforge when opening OTF
+	  version. Comparing with other fonts supporting Bengali, found no
+	  others that do this. FreeSerif makes glyph width 0 (which sounds
+	  right according to Unicode) and puts glyph wholly to left of 0.
+	  However, I haven't found this letter in text anywhere. I wonder
+	  if it is really used in writing.
+
+2008-08-14 07:41 +0000 [r891]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerif.sfd: Further TrueType validation
+	  fixes. Sans still has two glyps in wrong direction.
+
+2008-08-13 23:09 +0000 [r890]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Fixed more TrueType
+	  problems...all with missing extrema in TTF validation
+
+2008-08-13 21:35 +0000 [r889]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: fixed all the TrueType
+	  validation problems of type "intersects itself" and all but two
+	  of the "wrong directions", as well as a lot of "missing extrema".
+	  But there remain hundreds of missing extrema in the TrueType
+	  version. Also, bn_llikaar in Sans and Oblique still has a problem
+	  in OTF version.
+
+2008-08-12 22:21 +0000 [r888]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Made .ttf files to
+	  validate. Other faces have many more problems still.
+
+2008-08-12 20:41 +0000 [r887]  Stevan_White:
+
+	* tools/GenerateTrueType: For TrueType, one puts in
+	  Instructions, not Hints. This vastly improves look of TrueType
+	  fonts in Windows.
+
+2008-08-11 23:07 +0000 [r886]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoOblique.sfd: Continuing to make OTF
+	  versions validate. * FreeMonoOblique.sfd: lots of missing points
+	  at extrema * FreeSerif.sfd 12 wrong directions, 1 missing extrema
+	  * FreeSerifItalic.sfd many missing points at extrema, 1
+	  self-intersecting What was wrong: in several oblique cases, an
+	  already-italic glyph was made more italic, thereby fouling up
+	  extrema (although why it passed validation in the SFD I don't
+	  know). Some glyphs were overly-complicated with many near points.
+	  Cleaned up, rounded to int. Remaining problem: OTF
+	  FreeSansOblique FreeSans. one Bengali glyph in each whose advance
+	  width and htmx don't match. Moral of story: validate the OTF and
+	  TTF versions too before a release.
+
+2008-08-11 22:59 +0000 [r885]  Stevan_White:
+
+	* FreeSansOblique.sfd: Reverse a mistake from
+	  last commit: somehow this file was converted to quadratic, or
+	  something.
+
+2008-08-10 22:25 +0000 [r884]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Found that SFD files
+	  that validated produced OpenType files that don't. These
+	  represent the easy fixes. Some were result of conversion to
+	  quadratic; some shouldn't have validated in the SFD... *
+	  MonoBoldOblique: uni0250 missing pts at extrema [reference glyph
+	  rotated...] * Sans: uni0AC4 wrong direction [simplified, rounded
+	  to int] * SansOblique: uni01EA wrong direction [rounded to int] *
+	  SerifBold: uni023f wrong direction [round to int] *
+	  SerifBoldItalic: uni0245 missing pts at extrema [ungrouped ref,
+	  added extrema]
+
+2008-08-06 18:08 +0000 [r883]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd: Re-set font metrics,
+	  which were somehow making uneven vertical spacing.
+
+2008-08-06 07:05 +0000 [r882]  Stevan_White:
+
+	* ChangeLog: Added changes since last release
+
+2008-06-22 09:14 +0000 [r881]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: Made to validate
+
+2008-06-22 09:08 +0000 [r879-880]  Stevan_White:
+
+	* tools/ranges.py: Brought more into line with
+	  OpenType added some ranges fixed bug with ranges outside of font
+
+	* CREDITS: 3 new ranges
+
+2008-06-22 07:53 +0000 [r878]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Cyrillic: tweeked accents for
+	  consistency, and for readability in small sizes.
+
+2008-06-21 23:31 +0000 [r877]  Stevan_White:
+
+	* FreeSerif.sfd: Thanna range: tweeking
+
+2008-06-21 23:15 +0000 [r876]  Stevan_White:
+
+	* FreeSerif.sfd: Thaana range: Scaled up by
+	  about 15%, raised by 100EM, tightened some of the diacritics to
+	  get inside 900 to -300 EM limits.
+
+2008-06-21 22:21 +0000 [r875]  Stevan_White:
+
+	* FreeSans.sfd: Added Old Persian and Ugaritic
+	  from MPH2BDamase font.
+
+2008-06-21 21:50 +0000 [r874]  Stevan_White:
+
+	* FreeSerif.sfd: Added Tai Le range adapted from
+	  MPH2BDamase font.
+
+2008-06-21 18:39 +0000 [r873]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Added some ancient Greek
+	  numerals from Tempora to high Unicode area, (partly just to show
+	  it can now be done.)
+
+2008-06-21 15:51 +0000 [r871-872]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Couple of tweeks putting
+	  glyphs above -300EM.
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Surgery to Thai letter 'tho
+	  than', u+0e10, to push it above -300 EM. This makes Thai range
+	  completely between 900 and -300 EM.
+
+2008-06-21 11:20 +0000 [r870]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerif.sfd: Many auxilary characters (esp.
+	  for Malayalam, Bengla, and Tamil) representing ligatures and
+	  alternative forms without their own Unicode, were moved from
+	  ranges above 0xFFFF (which ought to have been slots for other
+	  defined Unicode ranges) into the Private Use area. In Serif, I
+	  segregated the scripts, in Sans it was hard to see where one
+	  began and another ended, so I moved them en masse. Note several
+	  problems with wrongly-named characters: I already re-named
+	  glyph570 and glyph582. But there are others with names starting
+	  with A...
+
+2008-06-21 11:08 +0000 [r869]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansOblique.sfd: Fixed (I hope the last)
+	  problem with scripts in lookups Find Problems -> ATT (all
+	  selected) finds multiple issues, SansBold In addition to script
+	  'guru', added 'gur2' to the scripts for these lookups 'nukt'
+	  Nukta forms in Gurmukhi 'blwf' Below Base Forms in Gurmukhi
+	  'pstf' Post Base Forms in Gurmukhi 'blws' Below Base
+	  Substitutions in Gurmukhi 'abvs' Above Base Substitutions in
+	  Gurmukhi 'psts' Post Base Substitutions in Gurmukhi SansOblique
+	  In addition to script 'beng', added 'bng2' to the scripts for the
+	  lookup 'half' Half Forms in Bengali Moreover, the lookup 'aalt'
+	  Access All Alternates in Latin contains only Bengali letters.
+	  Re-named as Bengali, made to work on beng, bng2 scripts
+
+2008-06-20 21:52 +0000 [r868]  Stevan_White:
+
+	* FreeSerif.sfd: Scaled Sinhala range. Remedies
+	  bug #23656: Sinhala letters over-sized
+
+2008-06-20 18:03 +0000 [r867]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Mostly messing with
+	  Greek Extended accents again. re-positioned ypogegrammani on
+	  advice of Alexey Kryukov Put prosgegrammani beneath main letters
+	  in Mono, to make narrower glyphs Implemented more distinction
+	  between tonos and acute.
+
+2008-06-19 08:25 +0000 [r866]  Stevan_White:
+
+	* FreeMonoBoldOblique.sfd: Completed fit of Mono
+	  to 800 to -200 EM.
+
+2008-06-19 07:47 +0000 [r865]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd: Set Metrics to
+	  recommended values
+
+2008-06-19 07:40 +0000 [r864]  Stevan_White:
+
+	* FreeMonoOblique.sfd: Now Mono Oblique, as well
+	  as roman and Bold, are within 800 to -200 EM. Just BoldOblique to
+	  go.
+
+2008-06-19 07:25 +0000 [r863]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd: More toward fitting to 800
+	  to -200 EM. Basically, reduced Georgian by 92%. Also made an
+	  over-all offset, so Georgian is somehow centered (Bold...I guess
+	  I already did this in roman). Want to also do an emboldening to
+	  make stroke like rest of font, but current FontForge has a nasty
+	  crash that loses data on this function.
+
+2008-06-19 06:19 +0000 [r862]  Stevan_White:
+
+	* FreeMono.sfd: In effort to make fit in 800 to
+	  -200 EM, Scaled Georgian by 92%, centered on 600 wide box. Next:
+	  Embolden a bit.
+
+2008-06-18 19:46 +0000 [r861]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Toward making all
+	  glyphs lie between -200 and 800 EM. Numerous small changes,
+	  especially raising descenders of some Hebrew letters. Georgian
+	  remains a problem
+
+2008-06-13 07:39 +0000 [r860]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Moved prosgegrammeni up to
+	  baseline, (and then moved all references down to baseline)
+
+2008-06-13 06:17 +0000 [r859]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Added Control Picture
+	  "blank" to all faces. Switched U+0222-3 from TemporaLGCUni
+
+2008-06-11 17:57 +0000 [r858]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: More fiddling with Greek
+	  Extended accents
+
+2008-06-11 07:43 +0000 [r857]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Tweeks to accents etc in
+	  Greek Extended and Cyrillic
+
+2008-06-10 08:00 +0000 [r856]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBold.sfd: Fixed a few big horizontal
+	  spacing problems
+
+2008-06-09 23:12 +0000 [r855]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Implemented TemporaLCGUni
+	  glyphs in Cyrillic ranges. Added a breve_cyrillic for the
+	  moustache breve mark.
+
+2008-06-08 08:45 +0000 [r854]  Stevan_White:
+
+	* FreeSerif.sfd: Replaced most of Cyrillic range
+	  with TemporaLGCUni. Remodelled many of the derived Cyrillic
+	  characters after these. Fiddled globally with spacing of small
+	  letters. Unclear on diacritics 485-6, unhappy with breve.
+
+2008-06-07 23:12 +0000 [r853]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Started implementing
+	  TemporaLCGUni in Greek ranges. Replaced 3DC-3E1 from Tempora,
+	  because I thought they looked nicer and more like the other
+	  existing FreeFont glyphs. Replaced 3DA-B from Tempora, because
+	  they look more like Unicode samples, and nicer. Added 03f3-4,
+	  03F7-F. Prefer my own lunate epsilon. Replaced Phi and Omega from
+	  Tempora. These plainly fit the other FreeFont glyphs better than
+	  the origninals. (How did this happen?) In bold, replaced U+03D7
+	  Copied lbbar u+2114 Small italic greek: replaced most except phi,
+	  psi, omega Based on new information, broke the identification of
+	  oxia with Latin acute.
+
+2008-06-07 13:15 +0000 [r852]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Efforts to control
+	  heights of characters
+
+2008-06-05 22:04 +0000 [r851]  Stevan_White:
+
+	* FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Made to validate
+
+2008-06-04 23:14 +0000 [r850]  Stevan_White:
+
+	* FreeSans.sfd: Fixed undefined character in
+	  kerning classes
+
+2008-06-03 22:26 +0000 [r849]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: tweeks and additions
+	  to General Punctuation
+
+2008-06-03 07:12 +0000 [r848]  Stevan_White:
+
+	* FreeSansOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Completed/tweeked
+	  Number Forms
+
+2008-06-02 22:28 +0000 [r847]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd: Added some Miscellaneous
+	  Technical symbols
+
+2008-06-02 21:25 +0000 [r846]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Tweeks...mostly Letterlike
+
+2008-06-01 21:52 +0000 [r845]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd: Added Box Drawing characters to
+	  Serif. Tweeked a glyph in Mono
+
+2008-06-01 12:30 +0000 [r844]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Added several glyphs
+	  to Letterlike Characters
+
+2008-05-31 07:30 +0000 [r843]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoBoldOblique.sfd: Validation pass
+	  SansOblique and SansBoldOblique had validation problem with
+	  BlueValues Private Dictionary Elements in BlueValues/OtherBlues
+	  array are disordered Elements in BlueValues/OtherBlues array are
+	  too close (Change BlueFuzz) StemSnapV does not contain StdVW
+	  value. So I ordered the array, and based on other slanted fonts,
+	  removed StemSnapV. Note however, I still think the two top Blues
+	  lines are too close But I don't even know what the second-to-top
+	  line is meant to do.
+
+2008-05-31 07:23 +0000 [r842]  Stevan_White:
+
+	* FreeSerif.sfd: Added to Block Elements,
+	  Geometric Shapes Made to validate
+
+2008-05-29 08:49 +0000 [r841]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Looking at special symbols.
+	  Drew several Miscellaneous Symbols in Mono and Serif
+	  (Completed/corrected planetary symbols, added Dice, some other
+	  easy ones) Completed Dingbats in Serif (using URW Dingbats) Added
+	  some Block Elements to Serif
+
+2008-05-25 23:47 +0000 [r840]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: More changes stemming from
+	  J. Poon's report.
+
+2008-05-25 12:56 +0000 [r839]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd: Height surgery on
+	  SerifBoldItalic. More fiddling with accents in others.
+
+2008-05-25 11:01 +0000 [r838]  Stevan_White:
+
+	* FreeSerifItalic.sfd: More height surgery. Only
+	  a few left in Benglai and Thai
+
+2008-05-25 10:54 +0000 [r837]  Stevan_White:
+
+	* FreeSerifBold.sfd: Re-applied surgery to make
+	  glyphs between 900 and -300EM
+
+2008-05-25 09:58 +0000 [r836]  Stevan_White:
+
+	* FreeSerifBold.sfd: *** Regression
+	  Inadvertently un-linked all references in SerifBold in r1.83.
+	  This reverses that error (but also un-does the surgery mentioned
+	  there)
+
+2008-05-24 22:23 +0000 [r835]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBold.sfd: Applied surgery to make
+	  Latin letters go under 900EM. One exception yet...
+
+2008-05-24 20:59 +0000 [r834]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Serif: much fiddling with
+	  accents in Latin ranges. Re-thought some glyphs (there are still
+	  a few messy ones, especially in bold) Checked horizontal
+	  spacing...fixed a number of problems.
+
+2008-05-23 07:37 +0000 [r833]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSerifBold.sfd: Made Latin Extended-B
+	  coverage consistent across Serif; cleaned up some glyphs
+
+2008-05-22 23:07 +0000 [r832]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd: Filled more of General
+	  Punctuation in Sans and Serif Made all agree on coverage of Latin
+	  Extended Additional
+
+2008-05-22 21:34 +0000 [r831]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSerifBold.sfd: Added Latin Extended
+	  Additional to SansOblique. Made Latin Extended Additional
+	  coverage consistent across Sans, B, I Made Latin Extended-B
+	  coverage same in SerifBold.
+
+2008-05-22 19:05 +0000 [r830]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoBoldOblique.sfd: Mono* made Latin-B
+	  coverage consistent across faces
+
+2008-05-22 07:50 +0000 [r829]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Made set of Latin
+	  Extended-B consistent across Sans faces
+
+2008-05-21 23:14 +0000 [r828]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: More filling in General
+	  Punctuation
+
+2008-05-21 22:26 +0000 [r827]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: another bunch of J. Poon's
+	  reports also, filling in some Combining Diacriticals, Spacing
+	  Modifiers, and General Punctuation in bold faces
+
+2008-05-20 23:16 +0000 [r826]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeSerifBold.sfd: Mucking about with mark
+	  tables in Thai (Serif) Other faces: Making changes from J. Poon's
+	  report
+
+2008-05-20 06:41 +0000 [r825]  Stevan_White:
+
+	* CREDITS: Mark Williamson Jacob Poon
+
+2008-05-20 06:37 +0000 [r823-824]  Stevan_White:
+
+	* Makefile: added tests target
+
+	* tools/findBackLayers.py (added),
+	  tools/validate.py (added),
+	  tools/isMonoMono.py (added),
+	  tools/nameBySlot.py (added): isMonoMono.py checks
+	  that monospace is really that findBackLayers.py finds glyphs in
+	  back layers nameBySlot.py Sets name/unicode values of a range to
+	  encoding value verify.py runs FontForge "verify" on all faces
+
+2008-05-18 19:17 +0000 [r822]  Stevan_White:
+
+	* tools/ranges.py: put table explanation back in
+
+2008-05-18 19:11 +0000 [r821]  Stevan_White:
+
+	* tools/ranges.py: Improved behaviour for high
+	  Unicode
+
+2008-05-18 13:32 +0000 [r820]  Stevan_White:
+
+	* FreeSans.sfd: Revision of kerning
+
+2008-05-18 12:16 +0000 [r819]  Stevan_White:
+
+	* FreeSerif.sfd: Made Latin kerning a little
+	  more reasonable: reduced many excessive kerns (some had letters
+	  apparently overlapping, which shouldn't happen) made kerns
+	  increment by 5EM for ease of reading got rid of kerns too small
+	  to be seen
+
+2008-05-18 12:11 +0000 [r818]  Stevan_White:
+
+	* FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: made to verify
+
+2008-05-12 22:52 +0000 [r817]  Stevan_White:
+
+	* FreeSerif.sfd: made to validate
+
+2008-05-12 22:46 +0000 [r816]  Stevan_White:
+
+	* FreeSerif.sfd: Gurmukhi: filled range in
+	  Serif, taking glyphs from the original Punjabi font by Hardip
+	  Singh Pannu http://members.aol.com/hspannu/punjabi.html (file
+	  pb_win95.exe)
+
+2008-05-12 19:43 +0000 [r815]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerifBold.sfd: Hebrew, basic. Some faces
+	  missing punctuation marks, added.
+
+2008-05-12 19:03 +0000 [r814]  Stevan_White:
+
+	* FreeSans.sfd, FreeMono.sfd:
+	  Armenian: Sans tried to make verticals and horizontals of more
+	  uniform width both, finddled with punctuation
+
+2008-05-12 12:56 +0000 [r813]  Stevan_White:
+
+	* FreeMonoOblique.sfd: made to validate
+
+2008-05-12 12:23 +0000 [r812]  Stevan_White:
+
+	* FreeMonoBold.sfd: made to validate
+
+2008-05-12 12:04 +0000 [r811]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Armenian in Sans:
+	  regularized letter spacing
+
+2008-05-12 10:19 +0000 [r810]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeMonoOblique.sfd: Armenian: fill out ranges
+	  and clean up SansBold especially had a lot of incorrect
+	  references. Now all the ranges with Armenian at least share the
+	  same set of characters.
+
+2008-05-12 07:58 +0000 [r809]  Stevan_White:
+
+	* FreeMono.sfd: Fixed glyph with wrong width.
+
+2008-05-11 21:29 +0000 [r808]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: 1) made to validate
+	  2) Mono: copied in Spacing Modifier Letters (glyphs not yet
+	  named) 3) SerifItalic: Filled in General Punctuation
+
+2008-05-11 17:56 +0000 [r807]  Stevan_White:
+
+	* FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Made to validate, and
+	  pass all other FontForge tests. Expedient: rounded everything to
+	  int
+
+2008-05-11 14:00 +0000 [r806]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Made to have the same Greek
+	  Symbols, Made to validate
+
+2008-05-11 12:59 +0000 [r805]  Stevan_White:
+
+	* FreeSansOblique.sfd: Made Greek Symbols as
+	  full as rest of Sans
+
+2008-05-11 12:40 +0000 [r804]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Made Greek Symbols as full
+	  as rest of Sans. Changed a name in Sans.
+
+2008-05-11 12:25 +0000 [r803]  Stevan_White:
+
+	* FreeSansBold.sfd: Deleted orphaned Arabic
+	  glyph from Arabic Presentation forms-B
+
+2008-05-11 12:17 +0000 [r802]  Stevan_White:
+
+	* FreeMonoOblique.sfd: Made Greek as full as
+	  other faces Made to validate
+
+2008-05-11 11:08 +0000 [r801]  Stevan_White:
+
+	* FreeSansBold.sfd: Deleted seven orphaned
+	  Arabic characters; looks like somebody started, didn't get very
+	  far, putting Arabic in bold.
+
+2008-05-11 11:05 +0000 [r800]  Stevan_White:
+
+	* FreeSerifBold.sfd: Deleted the single Arabic
+	  character: it was clearly there by mistake.
+
+2008-05-11 11:01 +0000 [r799]  Stevan_White:
+
+	* FreeSansOblique.sfd: Tweeks to Armenian
+
+2008-05-11 10:56 +0000 [r796-798]  Stevan_White:
+
+	* FreeSansOblique.sfd: Comment from previous
+	  commit of FreeSans was meant for FreeSansOblique. In FreeSans,
+	  only tweeked a few letters during putting more characters in this
+	  face. Filled in Spacing Modifier Letters, increased General
+	  Punctuation.
+
+	* FreeSans.sfd: Filled in Spacing Modifier
+	  Letters, increased General Punctuation
+
+	* FreeMono.sfd: Made Armenian as full as other
+	  roman faces.
+
+2008-05-11 08:22 +0000 [r795]  Stevan_White:
+
+	* FreeMono.sfd: Completed Spacing Modifier
+	  Letters Added a couple of Greek Punctuation
+
+2008-05-10 22:39 +0000 [r794]  Stevan_White:
+
+	* FreeMono.sfd: added more Spacing Modifier
+	  Letters
+
+2008-05-10 21:57 +0000 [r792-793]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Did same process of scaling and
+	  sizing for Thai in Sans as in Serif. Added mark tables to Sans.
+	  Improvement, but there are questions...
+
+	* FreeSans.sfd: Tidied some Gurmukhi glyphs,
+	  validated.
+
+2008-05-10 17:50 +0000 [r791]  Stevan_White:
+
+	* FreeMonoBoldOblique.sfd: Made metrics like
+	  rest of Mono
+
+2008-05-10 13:44 +0000 [r790]  Stevan_White:
+
+	* FreeSans.sfd: Deleted ranges for Oriya,
+	  Kannada, on account of 1) they only contained a subset of the
+	  consonant glyphs of the scripts, few if any vowels, and had no
+	  ligature lookups as required 2) Kannada was based on the Akurti
+	  fonts, which have copyright issues. See bug #23225: Oriya range
+	  only partial bug #23224: Kannada range only partial
+
+2008-05-09 07:49 +0000 [r789]  Stevan_White:
+
+	* tools/ranges.py: more info on range intervals
+
+2008-05-09 05:36 +0000 [r788]  Stevan_White:
+
+	* FreeSerif.sfd: Deleted Telugu range. It didn't
+	  represent a complete writing system for the language. See notes
+	  at https://savannah.gnu.org/bugs/index.php?23202 Serif: Telugu
+	  range missing many characters; many wrong
+
+2008-05-09 05:22 +0000 [r787]  Stevan_White:
+
+	* FreeSerif.sfd: Got a copy of the original
+	  Tikkana font, Copied in remaining consonants and vowels that I
+	  could find there. I think one vowel 0C55 is missing according to
+	  unicode). Strangely, the Telugu digits are alo missing. In
+	  Tikkana, the default "checkmark" structural mark is missing from
+	  many consonants, according to Unicode, but is a separate glyph. I
+	  put the checkmark on. This, and scaled up by 150% and cleaned up
+	  intersecting glyphs and many unnecessary points.
+
+2008-05-07 22:38 +0000 [r786]  Stevan_White:
+
+	* FreeSerif.sfd: Filled out Telugu consonants.
+	  Vowels still need to be done
+
+2008-05-07 19:35 +0000 [r785]  Stevan_White:
+
+	* FreeSerif.sfd: Operated on Latin glyphs with
+	  stacked accents to make them fit under 900EM. Scaled Telugu bu
+	  150%.
+
+2008-05-05 22:17 +0000 [r784]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd: Corrected further fontforge
+	  "find problems" added some math characters to FreeSerif
+
+2008-05-04 23:52 +0000 [r783]  Stevan_White:
+
+	* FreeSansBold.sfd: Made to validate, and fixed
+	  bad TT transformations
+
+2008-05-04 19:52 +0000 [r782]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd: Mainly TeX additions trying to
+	  satisfy Markus Kuhn's TeX-as-Unicode page
+
+2008-05-04 14:25 +0000 [r781]  Stevan_White:
+
+	* FreeMono.sfd: Adjusted heights of extensible
+	  brackets
+
+2008-05-04 13:42 +0000 [r780]  Stevan_White:
+
+	* FreeMono.sfd: Fixed problems with extensible
+	  brackets, thanks to Markus Kuhn's page
+	  http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt
+
+2008-05-04 11:43 +0000 [r779]  Stevan_White:
+
+	* tools/ranges.py: fiddled with ranges, doc
+
+2008-05-04 11:25 +0000 [r778]  Stevan_White:
+
+	* tools/ranges.py: made some ranges more correct?
+
+2008-05-04 11:02 +0000 [r777]  Stevan_White:
+
+	* tools/ranges.py: fixed some bugs in ranges better
+	  error reporting
+
+2008-05-04 10:34 +0000 [r775-776]  Stevan_White:
+
+	* tools/ranges.py: Got rid of Unicode 1.1 references
+
+	* tools/ranges.py: made to use OpenType table
+
+2008-05-04 03:11 +0000 [r774]  Stevan_White:
+
+	* FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd: made to validate
+
+2008-05-03 20:44 +0000 [r773]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Removed digits from Private
+	  Use Area. See bug 23050.
+
+2008-05-03 19:54 +0000 [r772]  Stevan_White:
+
+	* tools/ranges.py: restructure text output
+
+2008-05-03 17:05 +0000 [r771]  Stevan_White:
+
+	* FreeSans.sfd, FreeMono.sfd:
+	  Completed General Punctuation
+
+2008-05-03 15:00 +0000 [r770]  Stevan_White:
+
+	* tools/ranges.py: More docs, date
+
+2008-05-03 14:53 +0000 [r769]  Stevan_White:
+
+	* FreeSans.sfd: Completed IPA Extensions
+
+2008-05-03 13:46 +0000 [r768]  Stevan_White:
+
+	* FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd: More work on Superscripts and
+	  Subscripts, Spacing Modifiers. Sans is now complete in both.
+	  Added Pfennig to Sans and Mono.
+
+2008-05-03 11:55 +0000 [r767]  Stevan_White:
+
+	* tools/ranges.py: rearrangement and cosmetic
+
+2008-05-03 11:46 +0000 [r765-766]  Stevan_White:
+
+	* tools/ranges.py: ...except I had broken it. now
+	  fixed
+
+	* tools/ranges.py: Seems to be in a useful form at
+	  this point.
+
+2008-05-03 10:29 +0000 [r764]  Stevan_White:
+
+	* FreeSerif.sfd: Added a hand-drawn old German
+	  Pfennig to Currency Symbols
+
+2008-05-02 23:46 +0000 [r763]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd: Further additions to General
+	  Punctuation, Super and Sub Scripts, Spacing Modifiers, etc.
+
+2008-05-02 20:29 +0000 [r762]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd: Sans: additions to Spacing
+	  Modifiers, IPA SerifItalic: shortening stacked accents to
+	  maintain readability when clipped
+
+2008-05-01 19:32 +0000 [r761]  Stevan_White:
+
+	* FreeSans.sfd: Additions to Spacing Modifiers
+	  and changes to Combining Diacritics
+
+2008-05-01 18:26 +0000 [r760]  Stevan_White:
+
+	* FreeSerif.sfd: Made sure all the half rings in
+	  Combining Diacriticals and Spacing Modifiers were really half
+	  rings (J. Poon had complained about this)
+
+2008-05-01 18:11 +0000 [r759]  Stevan_White:
+
+	* FreeSerif.sfd: Filled out General Punctuation
+	  Some work on Spacing Modifiers
+
+2008-05-01 14:10 +0000 [r758]  Stevan_White:
+
+	* FreeSerif.sfd: Filled out Mathematical
+	  Operators still needs lots of work Made to validate
+
+2008-05-01 09:14 +0000 [r757]  Stevan_White:
+
+	* FreeSerif.sfd: Filled out Latin Extended B
+
+2008-04-30 23:00 +0000 [r756]  Stevan_White:
+
+	* FreeSerif.sfd: added some letters with curls
+	  to Latin Extended B
+
+2008-04-30 22:38 +0000 [r755]  Stevan_White:
+
+	* FreeSerif.sfd: more fiddling with Latin
+	  Extended B accents
+
+2008-04-30 20:28 +0000 [r754]  Stevan_White:
+
+	* FreeSerif.sfd: Added HanunÃ³o script, with
+	  characters based on those in font MPH2BDamase, on request from
+	  the maintainer of that font,
+	  http://packages.debian.org/sid/ttf-mph-2b-damase Glyphs are
+	  simple vector strokes. Could be a little more uniform.
+
+2008-04-29 23:54 +0000 [r753]  Stevan_White:
+
+	* FreeSerif.sfd: Added Buginese script
+	  "Lontara", with characters based on those in font MPH2BDamase, on
+	  request from the maintainer of that font,
+	  http://packages.debian.org/sid/ttf-mph-2b-damase Note the glyphs
+	  are pretty rough, clearly a digitization of handwriting. I just
+	  cleaned them up, and corrected discrepancies with Unicode, and
+	  compared with some pictorial samples of the script I could find.
+
+2008-04-28 22:15 +0000 [r752]  Stevan_White:
+
+	* tools/ranges.py: improved look a lot still unhappy
+	  with some ranges OS/2 seems sometimes bang-on, sometimes
+	  unrelated to anything ( including fontforge's OS/2 listing)
+
+2008-04-28 22:00 +0000 [r751]  Stevan_White:
+
+	* FreeSerif.sfd: Much fiddling with Tamil range.
+	  First scaled to 78% (avoiding the references) This gets it in the
+	  ballpark height-wise. [A bit taller than the Latin letters, but
+	  the stroke is narrower, but then the glyphs are busier.] Then had
+	  to re-align combined references, the trickiest being the halants.
+	  Checked with other fonts with Tamil text.
+
+2008-04-28 20:05 +0000 [r750]  Stevan_White:
+
+	* FreeSerif.sfd: Cleanum of missing extrema in
+	  Arabic and Thaana
+
+2008-04-28 19:55 +0000 [r749]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: cleanup of control points in
+	  Arabic and Thaana
+
+2008-04-28 17:04 +0000 [r748]  Stevan_White:
+
+	* tools/ranges.py (added): a script to print out how
+	  many characters in a range are implemented in each font
+
+2008-04-28 08:06 +0000 [r747]  Stevan_White:
+
+	* FreeSerif.sfd: * Many changes to Thai, trying
+	  to make the script fit between some lines, so accents won't get
+	  clipped, etc. Also, stroke weight was heavier than that of Latin.
+	  Scaled whole thing by 93%. Shrank the tallest letters 0E42-4 to
+	  get them under 900EM. Shaved off top of maiek. Fiddled with
+	  positioning of all accents. Made positioning tables for accents.
+	  [note, unclear these are working correctly] * Fixed a bug having
+	  to do with character replacements for characters named 'ng' and
+	  'nj'; these names had been taken on by other characters. * Made
+	  to validate * unicode positions of two Cyrillic Extended
+	  characters were switched. * fiddled with a couple of Cyrillic
+	  combining diacritics
+
+2008-04-26 22:14 +0000 [r746]  Stevan_White:
+
+	* FreeSans.sfd: bugfix: a left harpoon
+	  mysteriously appeared to the left of letter p!
+
+2008-04-26 19:46 +0000 [r745]  Stevan_White:
+
+	* FreeMono.sfd: Made to validate
+
+2008-04-26 18:40 +0000 [r744]  Stevan_White:
+
+	* FreeSans.sfd: made to validate
+
+2008-04-26 15:04 +0000 [r743]  Stevan_White:
+
+	* FreeSans.sfd: Toward J. Poons report Made 032B
+	  more like proper double-arches (and distinct fro 033C seagull)
+
+2008-04-26 14:22 +0000 [r742]  Stevan_White:
+
+	* FreeSans.sfd: Toward J. Poon's report Made
+	  032b more like a seagull
+
+2008-04-26 14:05 +0000 [r741]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd: Sans: fiddling with widths
+	  and terminators of math symbols, toward J. Poon's report R & B:
+	  removed u+2741 because it didn't match the Unicode description
+
+2008-04-26 12:08 +0000 [r740]  Stevan_White:
+
+	* FreeMono.sfd: extensible parenthesis symbols
+	  weight/terminators Toward bug # 23064
+	  https://savannah.gnu.org/bugs/index.php?23064 Rounded a bunch of
+	  terminators
+
+2008-04-22 21:45 +0000 [r739]  Stevan_White:
+
+	* FreeSans.sfd: Fiddled with math--consequences
+	  of changing the "similar" operator
+
+2008-04-22 20:06 +0000 [r738]  Stevan_White:
+
+	* FreeSerif.sfd: Small alignment problem in
+	  Greek Extended
+
+2008-04-22 19:52 +0000 [r737]  Stevan_White:
+
+	* FreeSerif.sfd: One more tweek to spacing in
+	  Cyrillic Extended
+
+2008-04-22 19:48 +0000 [r736]  Stevan_White:
+
+	* FreeSerif.sfd: Corrected spacing in Cyrillic
+	  Supplement
+
+2008-04-22 19:35 +0000 [r735]  Stevan_White:
+
+	* FreeSerif.sfd: Added Cyrillic Supplement
+	  letters for Enets, Khanty, Chukchi, Itelmen, Mordvin, Kurdish,
+	  Aleut
+
+2008-04-22 18:46 +0000 [r734]  Stevan_White:
+
+	* FreeSans.sfd: More tightening of accents
+
+2008-04-22 18:41 +0000 [r733]  Stevan_White:
+
+	* FreeSerif.sfd: Added Cyrillic letters for
+	  Nivkh (completing Cyrillic range) More tightening of accents in
+	  Latin Extended.
+
+2008-04-22 08:49 +0000 [r732]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Adjustments to h and k with
+	  caron and cedilla in Latin A and B
+
+2008-04-21 22:23 +0000 [r731]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: FreeSerifBold: deleted 3
+	  dotted Hebrew letters in Private/Corporate use (E801-3). They
+	  weren't ligatures or in any other lookup, and they weren't
+	  present in FreeSerif. FreeSansBold: unlinked and deleted F6C3,
+	  which called itself commaaccent. Made some new spacing and
+	  non-spacing accents to make up for it. FreeSansBoldOblique: Made
+	  references of many Latin Extended. Also corrected several wrong
+	  ones. Freeserif: re-named commaaccent
+
+2008-04-21 18:30 +0000 [r730]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Deleted Hiragana and
+	  Katakana ranges, as discussed on bugs list. Cleaned up some
+	  encoding issues, unnamed glyphs
+
+2008-04-21 07:28 +0000 [r728-729]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Roman: added 'sine' -- not
+	  beautiful, but I liked drawing it All: Made special lookup for
+	  Dutch ligatures 'IJ' and 'ij'
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Roman: ffi etc Latin
+	  ligatures from 'liga' to 'dlig' (these weren't really ligatures
+	  anyway, and only looked very bad when used. Retain for condensed
+	  type. Others: deleted Latin 'liga' table altogether BoldOblique :
+	  added j to ij ligature
+
+2008-04-20 22:31 +0000 [r727]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Toward J. Poon's
+	  Report: Except for issues of terminators not always vertical or
+	  horizontal, and a few things that were too hard or I was unsure
+	  of.
+
+2008-04-20 15:31 +0000 [r726]  Stevan_White:
+
+	* FreeSerif.sfd: More fiddling with accents
+
+2008-04-20 15:11 +0000 [r725]  Stevan_White:
+
+	* FreeSerif.sfd: futzing with accents in Latin
+	  Extended Additional
+
+2008-04-20 14:28 +0000 [r724]  Stevan_White:
+
+	* FreeSerif.sfd: Fiddled with accents in Latin
+	  Extended-B
+
+2008-04-20 12:56 +0000 [r723]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: added primemod
+	  character, referenced by Greek number sign
+
+2008-04-20 09:51 +0000 [r722]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoOblique.sfd: Following J. Poon's
+	  report, disconnected NJ (01CA)
+
+2008-04-19 21:20 +0000 [r721]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: First pass throught
+	  J. Poon's bug list. See bug reports for details.
+
+2008-04-19 15:44 +0000 [r720]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Made underscore
+	  slanted in Oblique faces, made all to be width of character.
+	  Towards J. Poon's report. Disturbed that xterm and some other
+	  apps put small space between characters when none was called for.
+
+2008-04-19 15:20 +0000 [r719]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd: corrections on Currency
+	  Symbols
+
+2008-04-19 11:59 +0000 [r718]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: More corrections, additions
+	  to Currency Symbols
+
+2008-04-19 01:41 +0000 [r717]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Filled out and corrected
+	  Currency Symbols
+
+2008-04-18 21:46 +0000 [r716]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Adjustments to Combining Marks
+	  for Symbols Additions to range in Sans, and re-structured its
+	  marks table so that "middle" can apply to any range
+
+2008-04-18 08:31 +0000 [r715]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Made reference between
+	  combining koronis and lenis of Greek Extended In Serif, re-worked
+	  combining marks lookup tables, added anchors in Latin, moved so
+	  without marks they work in kedit (but now I'm doubting kedit does
+	  a reasonable thing...what is a better application for testing
+	  this?)
+
+2008-04-16 21:46 +0000 [r714]  Stevan_White:
+
+	* FreeSerifItalic.sfd: adjusting of spacing and
+	  accents in Greek
+
+2008-04-16 20:30 +0000 [r713]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoOblique.sfd: Much futzing with Greek
+	  letter spacing and accents. Added lenis to FreeMono.
+
+2008-04-16 06:45 +0000 [r712]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd: Adjusted spacing of dots of
+	  Greek dieresistonons in Serif Whippted up something for Greek
+	  kappascript in Mono (could use revision)
+
+2008-04-16 06:18 +0000 [r711]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Raised dots on
+	  double-dotted Cyrillic i, to match that of i and j.
+
+2008-04-14 09:02 +0000 [r710]  Stevan_White:
+
+	* FreeMono.sfd: Corrected 27e6-7 "white bracket"
+	  Note it is probably a FontForge bug these symbols aren't showing
+	  up. FontForge thinks they are in Supplemental Arrows, but they
+	  should be in Supplemental Math-A
+
+2008-04-13 22:18 +0000 [r709]  Stevan_White:
+
+	* FreeMono.sfd: named some Greek characters
+
+2008-04-13 22:00 +0000 [r708]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Spacing of some Cyrillic
+	  characters
+
+2008-04-13 21:10 +0000 [r707]  Stevan_White:
+
+	* FreeSerif.sfd: some fiddling with accents,
+	  yogh was too wide
+
+2008-04-13 14:28 +0000 [r706]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansOblique.sfd: Character spacing was
+	  chaos--tried to improve. BoldOblique also needs it.
+
+2008-04-13 12:17 +0000 [r705]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Completed the fix of
+	  bug #12798, Greek glyphs with accents to side Much mucking with
+	  accents here, and fixed a few things that were just wrong.
+
+2008-04-12 19:56 +0000 [r704]  Stevan_White:
+
+	* FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Made Mono curly
+	  quotes "bent"
+
+2008-04-12 19:39 +0000 [r703]  Stevan_White:
+
+	* FreeMono.sfd: More fiddling with Greek accents
+	  Made quotes "bent"
+
+2008-04-12 18:57 +0000 [r702]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Adjustments on Greek
+	  diaresistonos etc. Adjustments in Serif on combining marks for
+	  symbols
+
+2008-04-12 11:58 +0000 [r701]  Stevan_White:
+
+	* FreeSerif.sfd: More additions to Combining
+	  marks for Symbols
+
+2008-04-12 11:44 +0000 [r700]  Stevan_White:
+
+	* FreeSerif.sfd: Additions to Combining marks
+	  for Symbols -- now mostly full. Lots of adjustments to middle
+	  anchor point in Latin to make big circle (nearly) encircle
+	  preceding latter
+
+2008-04-11 07:14 +0000 [r699]  Stevan_White:
+
+	* FreeMono.sfd: Bugfix: Had indroduce a glyph of
+	  width other than 600, making kterminal not recognize it as a
+	  monospace font.
+
+2008-04-10 19:44 +0000 [r698]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: More messing with accents.
+	  Further to bug #12798, Greek glyphs with accents to side Much
+	  messing with glyphs in Greek Extended range
+
+2008-04-09 11:35 +0000 [r697]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Revisited Latin-1 and
+	  Latin-A accents. Glyph B7 was called "periodcentered", but
+	  Unicode callse it Mid Dot, and the description doesn't refer to
+	  the period. I made it like the dot accent. throughout, and
+	  referred L-dot to it. Also double-checked "commaaccent"
+	  characters (some in Unicode called cedilla, but the Unicode
+	  example shows a comma...mystery) also the funny IPA upside-down f
+	  often had two bars, incorrectly. To do: go through rest of Serif,
+	  and Sans
+
+2008-04-08 23:25 +0000 [r696]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Completed
+	  re-structuring of stacked Latin accents in Mono. Also: lots of
+	  associated adjustments of Greek Extended accents. (Trying to at
+	  least center extremely wide characters on their box) Repaired
+	  some victems of "find overlaps" sweeps Worked on glyphs with
+	  apostrope/comma parts Corrected a few wrong glyphs. Trying out a
+	  "bent quotes" solution to making primes distinct from quotes.
+
+2008-04-08 09:56 +0000 [r695]  Stevan_White:
+
+	* FreeMonoOblique.sfd: Toward reducing overall
+	  height Did similar process as for Mono, fixing a few errors along
+	  the way. Also the Greek Extended range was very messed up
+	  vertical and horizontally. Horizonal spacing of the heavily
+	  accented Greek is a real problem in Mono... To do: revisit
+	  "commaaccent" characters in all faces: do some have cedillas?
+	  some Hebrew glyphs are a little low Georgian generally is way out
+	  of bounds
+
+2008-04-07 07:18 +0000 [r694]  Stevan_White:
+
+	* INSTALL: various updates and corrections, tweeked
+	  formatting
+
+2008-04-06 22:48 +0000 [r693]  Stevan_White:
+
+	* FreeMonoBold.sfd: Tweeking of accents
+
+2008-04-06 21:21 +0000 [r692]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd: Re-worked accents in
+	  FreeMonoBold.sfd to make Latin ranges lie between 800 and -200
+	  EM, as with FreeMono.
+
+2008-04-06 16:20 +0000 [r691]  Stevan_White:
+
+	* tools/hex_range.py (added): a tool for printing
+	  out ranges of formatted hex numbers
+
+2008-04-06 12:33 +0000 [r690]  Stevan_White:
+
+	* FreeMono.sfd: Latin Extended ranges:
+	  Implemented new policy of shortening the letters of the
+	  characters with the highest-stacked accents. At this point all
+	  the Latin glyphs lie betweeen 800 and -200 EM. Also checked for
+	  readability of all the Latin extended letters in xterm. (Issue:
+	  it chops letters outside their bounding boxes; many accents had
+	  been a bit outside. Made sure that if they were chopped, they
+	  were at least still recognizable.)
+
+2008-04-05 19:41 +0000 [r689]  Stevan_White:
+
+	* FreeMono.sfd: Following exchange about Mono on
+	  freefont-bugs with Joe Wells, who * doesn't like the curly quote
+	  marks * wants combining diacritics to work * wants tight line
+	  spacing Trying to reduce font height: * exclamdown was below -200
+	  * Throughout Extended Greek, ypogegrammeni were too low.
+	  Shortened glyph, and raised all references. * Lots of messing
+	  with Latin Extended ranges to make glyphs mostly fit into 800
+	  height. Mostly succeeded. A couple will get chopped. * Messed
+	  with "commaaccent" glyphs, which were very low * Cyrillic 04B1
+	  had a tail that was incorrectly low * Much mucking with Georgian
+	  range. Moved up by 95 (read Georgian is written as though
+	  centered between two horizontal lines, rather than as sitting on
+	  a baseline) There are still a few very high glyphs. FontForge
+	  U+0122 called Gcommaaccent, glyph looks like that, but Unicode
+	  says it's Gcedilla. Made the ones called cedilla by Unicode to be
+	  cedillas Note bug in Unicode: standard for 0122, 0123, 0136,
+	  0137, 013B, 013C, 0145, 0146, 0156, 0157 all talk about cedilla,
+	  say to make it with cedilla, but example shows comma. By the way:
+	  * Got rid of commaaccent and dotlessj in Corporate Use * Replaced
+	  shadedark, with little squares now not overlapping. * Corrected
+	  IPA symbol 'ts' 02A6, added 02a8, 02a9, 02aa, 02ab, 02ac, 02ad,
+	  02ae, 02af (so many changes...the CVS server was down...)
+
+2008-04-05 18:18 +0000 [r688]  Stevan_White:
+
+	* FreeSerif.sfd: e-named arabic and hebrew
+	  characters Big adjustment to comma-accents. Mostly effects Greek
+	  Extended. Made such accents to be like comma, rather than like
+	  Russian apostrophe (and de-referenced that symbol)
+
+2008-04-04 07:17 +0000 [r687]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeSerif.sfd: raised dot on superscript i
+	  (2071) to make it more distinct at small sizes
+
+2008-04-03 23:33 +0000 [r686]  Stevan_White:
+
+	* FreeMono.sfd: added two IPA symbols
+
+2008-04-02 20:15 +0000 [r685]  Stevan_White:
+
+	* FreeSerif.sfd: fixed a few more control points
+	  too close
+
+2008-04-02 18:59 +0000 [r684]  Stevan_White:
+
+	* FreeSerif.sfd: Fixed names of languages in
+	  ligature table for latn "w/i". This fixes a crash when FontForge
+	  opened the ttf table
+
+2008-04-02 18:47 +0000 [r683]  Stevan_White:
+
+	* FreeSerif.sfd: Motivated by bug crashing
+	  FontForge when opening ttf file, started cleanup of useless
+	  control points. Not finished. Got partway through Sinhala
+
+2008-03-31 21:51 +0000 [r682]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd: Fixed various "Find
+	  Problems", including glyphs with mixed-up names, and bad TT
+	  matrices. (lots more bad TT matrices remain)
+
+2008-03-31 06:50 +0000 [r681]  Stevan_White:
+
+	* FreeSerif.sfd: re-named a bunch of Cyrillic
+	  letters
+
+2008-03-30 22:32 +0000 [r680]  Stevan_White:
+
+	* FreeSerif.sfd: put above mark on Cyrillic i
+	  and double-dot i for Slavonic number forms
+
+2008-03-30 21:06 +0000 [r679]  Stevan_White:
+
+	* FreeSans.sfd: tightened spacing on glyphs of
+	  last commit
+
+2008-03-30 21:03 +0000 [r678]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Concerning bug #16120, Include
+	  upper case Wynn and upper case Yogh Adapted Herman Miller's
+	  Thyromanes letters 01F7 021C 021D for Serif Drew my own versions
+	  for Sans.
+
+2008-03-30 16:00 +0000 [r677]  Stevan_White:
+
+	* FreeSerif.sfd: Added 04F6,7
+
+2008-03-30 15:34 +0000 [r676]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Made more Cyrillic diacritics
+	  really combine. Made a mark lookup just for Cyrillic diacritics,
+	  Marked most of the unadorned Cyrillic alphabet. Still not clear
+	  on correct shapes for some of the marks.
+
+2008-03-29 23:25 +0000 [r675]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoOblique.sfd: Tweeks to accents
+
+2008-03-29 20:32 +0000 [r674]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd: small adjustments in Cyrillic
+
+2008-03-29 20:14 +0000 [r673]  Stevan_White:
+
+	* FreeSerif.sfd: corrected small palochka made
+	  Cyrillic combining hundred-thousands and millions really combine
+	  named some combining diacriticals
+
+2008-03-29 14:18 +0000 [r672]  Stevan_White:
+
+	* FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: mostly adjusted
+	  horizontal spacing of mono oblique faces
+
+2008-03-29 13:18 +0000 [r671]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: More cleanup of
+	  Cyrillic ranges Completely re-did horizontal spacing of
+	  SerifItalic and SerifBoldItalic. See bug #17912, poor kerning in
+	  Cyrillic oblique... https://savannah.gnu.org/bugs/index.php?17912
+	  It looked like chaos to me. Only so much can be done: the font is
+	  flawed. But I think the changes make text readable in these
+	  faces. There were many dozens of incorrect glyphs in
+	  higher-numbered characters. It looked like someone started
+	  copying letters that were like the correct ones, meaning to edit
+	  them later, but never got around to it. (Or else, a facile
+	  copying of glyphs that kinda looked right, but really kinda
+	  weren't.) I deleted all those I could find. No glyph is better
+	  than a wrong glyph. Futzt with accents, shooting for consistency
+	  and readability. A maintenance thing: making correct references
+	  (acyrillic vs a, although they may be the same glyph) I made a
+	  lot of headway, but it isn't finished. Likewise, a large fraction
+	  of these are compound characters, which can be made with
+	  references, resulting in easier maintenance, reduced likelihood
+	  of errors, and smaller files. I replaced many.
+
+2008-03-29 00:34 +0000 [r670]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd: Cyrillic italic Added italic,
+	  bolditalic 0493, 04a7, 04AD because their form clearly varies in
+	  italic. But was just guessing...
+
+2008-03-29 00:14 +0000 [r669]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd: Cyrillic italic Added
+	  italic, bolditalic 0493, 04AD because their form clearly varies
+	  in italic. But was just guessing as to exact form.
+
+2008-03-28 23:16 +0000 [r668]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Overhaul of Cyrillic
+	  Italic, BoldItalic added small yat for bug #22588 (note Times New
+	  Roman doesn't use alternate form in Italic) All forms of Serif
+	  have big problems in Cyrillic. The ugliest is in roman. The
+	  letters, even of the Russian alphabet, are of inconsistent height
+	  (awfully, small 0438 (ii) 0446 (tse)) and they vary from the
+	  height of Latin and they vary from the height of italic and bold.
+	  They are a mish-mash of letters from several fonts, of similar
+	  (but not quite identical) weight, and similar, (but not quite
+	  identical) size. I think the best solution would be to identify
+	  the face that best matches Latin, and fill the range with that. I
+	  think this is possible because the rarer letters seem to be
+	  better: the common letters are the ones that are wrong. For now,
+	  I just increased the sized of 0438 and 0446, and 048a, 048b, also
+	  0459 (lje) 045A (nje) 0464 (dje) Other issues ------------ Were
+	  outline, with home-made accents - replaced with references 0400
+	  (was referencing E) 0401, 0402, 040c, 040d, 040e 0450, 0451, 0453
+	  more in the later ranges. Deleted dozens of characters in Bold,
+	  Italic, and BoldItalic, that appeared half-made (a part of the
+	  letter was copied, but the letter was never completed, and was
+	  basically wrong) Lots of letters with hooks and lines in italic
+	  were represented as just the unhooked version in italic. 048a,
+	  048b (short i with tail, had big-eared breve common in Cyrillic,
+	  but unlike other letters) Re-implemented many compound letters
+	  with references. Questionable ------------ In all versions,
+	  0478-9 Uk, uk. SerifItalic 0495 Small ge with acute, in italic:
+	  is it like italic ge, or oblique? Well, peeked at Times New
+	  Roman, which has it oblique.
+
+2008-03-27 20:33 +0000 [r667]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd: Moving all Greek
+	  capitals with accent so they don't cover previous letter.
+	  Remedies bug #12798
+
+2008-03-27 20:27 +0000 [r666]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Various tweeks to accented
+	  Latin letters. Connected O-ogonek correctly
+
+2008-03-27 19:55 +0000 [r665]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Accents of numerous
+	  accented Latin letters got shifted in a previous commit. This
+	  fixes it.
+
+2008-03-27 19:28 +0000 [r664]  Stevan_White:
+
+	* FreeSerif.sfd: Adjusted combining tack left
+	  and right (0318-0319) to be above -300 EM.
+
+2008-03-26 23:37 +0000 [r663]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Added some "middle" marks for
+	  positioning of diacritics
+
+2008-03-26 23:21 +0000 [r662]  Stevan_White:
+
+	* FreeSans.sfd: copied 4 enclosing combining
+	  diacriticals from Serif 20DD - 20E0
+
+2008-03-26 23:13 +0000 [r661]  Stevan_White:
+
+	* FreeSerif.sfd: adjusted and added some
+	  enclosing diacritics 20DD - 20E0 could use more work. Other faces
+	  need 'em too. In response to Debian bug #472566 ttf-freefont:
+	  U+20DD COMBINING ENCOLSING CIRCLE doesn't combine
+	  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=472566
+
+2008-03-26 20:00 +0000 [r660]  Stevan_White:
+
+	* FreeSerif.sfd: Lowered a few over-high Latin
+	  accents
+
+2008-03-25 23:27 +0000 [r659]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd: FreeSansBold Devangari only
+	  digits 1 and 2, and nothing else. Deleted FreeMonoBold
+	  FreeMonoOblique FreeSerifBold FreeSeriftalic FreeSerifBoldItalic
+	  FreeSansOblique FreeSansBold FreeSansBoldOblique got rid of
+	  dotlessj, comma in Corporate Use Single Substitution lookup, ccmp
+	  table made proper dotlessj, re-linked j-circumflex Note:
+	  FreeSansBold has a commaaccent in Corporate Use, used by several
+	  other characers. Haven't done anything about this.
+
+2008-03-25 07:30 +0000 [r658]  Stevan_White:
+
+	* FreeSerif.sfd: Added/corrected glyphs for yeh
+	  hamza in Arabic, Added init and medi lookups for yeh hamza.
+
+2008-03-24 21:54 +0000 [r657]  Stevan_White:
+
+	* FreeSerif.sfd: Added isolated and final forms
+	  for 0629 teh marbuta 0624 waw hamza 0626 yeh hamza 0649 alef
+	  maksura A previous commit had added lookups that referred to
+	  these,
+
+2008-03-24 18:51 +0000 [r656]  Stevan_White:
+
+	* FreeSerif.sfd: more fiddling with
+	  super/subscripts
+
+2008-03-24 12:17 +0000 [r655]  Stevan_White:
+
+	* notes/README-downloads.txt (added): An explanatory
+	  file for the downloads directory
+
+2008-03-24 11:59 +0000 [r654]  Stevan_White:
+
+	* sfd/Makefile,
+	  tools/GenerateTrueType, Makefile,
+	  tools/GenerateOpenType (added): Scripts and Make
+	  targets to generate OpenType fonts and zip file
+
+2008-03-24 11:56 +0000 [r653]  Stevan_White:
+
+	* notes/maintenance.txt: Added gnupload and info
+	  about tagging
+
+2008-03-23 18:11 +0000 [r652]  Stevan_White:
+
+	* Makefile: no longer needs VPATH on top level
+
+2008-03-23 18:04 +0000 [r650]  Stevan_White:
+
+	* ChangeLog: additions for last few days
+
+2008-03-23 14:21 +0000 [r649]  Stevan_White:
+
+	* FreeSerif.sfd: last problem with Find Problems
+	  -> ATT 'mark' Latin lookup afii10026 is in 'cyrl', also afii10074
+	  (These are upper and lower Cyrillic i) [Just removed mark from
+	  both letters] 'half' Bengali lookup Khanda_Ta is in 'bng2' [added
+	  bng2 to lookup]
+
+2008-03-23 13:28 +0000 [r648]  Stevan_White:
+
+	* FreeSerif.sfd: added TtTable etc
+
+2008-03-23 13:15 +0000 [r647]  Stevan_White:
+
+	* FreeSerif.sfd: clean-up of Points too Close
+	  through to end of font. This episode completes the paths/points
+	  clean-up of Serif. (But note: many ranges, esp. Ethiopic,
+	  Japanese, and Indic, have way too many points, resulting in
+	  lumpiness.)
+
+2008-03-23 12:03 +0000 [r646]  Stevan_White:
+
+	* FreeSerif.sfd: clean-up of Points too Close
+	  though Arabic
+
+2008-03-23 11:50 +0000 [r645]  Stevan_White:
+
+	* FreeSerif.sfd: clean-up of Points too Close
+	  through Hiragana and Katakana
+
+2008-03-22 14:43 +0000 [r644]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Mostly additions to FreeSans,
+	  mostly having to do with LaTeX ranges. This basically fills the
+	  LaTeX range for FreeSans, except for extensible brackets etc.
+
+2008-03-21 23:49 +0000 [r642-643]  Stevan_White:
+
+	* Makefile: split Makefile into two levels
+
+	* sfd/Makefile (added): tidier with a lower-level
+	  makefile
+
+2008-03-21 21:51 +0000 [r641]  Stevan_White:
+
+	* Makefile: made quieter
+
+2008-03-21 20:57 +0000 [r640]  Stevan_White:
+
+	* FreeSerif.sfd: in previous commit, hadn't
+	  relly saved the changes about the ligature tables. this does that
+	  also, named the "ciel" and "floor" characters
+
+2008-03-21 20:50 +0000 [r636-639]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd: (these changes were also
+	  made in the previous few commits of other faces) changed name of
+	  00B5 from 'mu' to 'micro' changed name of 2206 from 'Delta' to
+	  'Delta.math' changed name of 0308 from 'diaerisis' to
+	  'diaerisiscomb'
+
+	* FreeSerif.sfd: split lookup for ligatures in
+	  latin into two classes; ff, ffl, fl which are appropriate for all
+	  languages, and fi, ffi, which are not appropriate in Turkish (due
+	  to distinction between short and long i)
+
+	* FreeMonoBoldOblique.sfd: moved dotlessj from
+	  Corporate Use, deleted commaaccent there mis-named glyphs
+	  tcommaaccent, Tcommaaccent changed name of 030A from 'dieresis'
+	  to 'ringcomb'
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd: removed bogus glyphs
+	  for 200C 200D, ZWJ and ZWNJ (zero-width joiner, zero-width
+	  non-joiner)
+
+2008-03-21 20:20 +0000 [r633-635]  Stevan_White:
+
+	* tools/ConvertFont (removed): this was apparently
+	  an older version of GenerateTrueType
+
+	* tools/GenerateTrueType: Took out scaling to 2048
+	  (was there a good reason for that?) Made to first auto-hint whole
+	  font
+
+	* Makefile: made to work for me
+
+2008-03-21 15:20 +0000 [r632]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd: Regularized stacking of
+	  accents in Latin Extended Additional
+
+2008-03-21 15:09 +0000 [r631]  Stevan_White:
+
+	* FreeSerif.sfd: everal characters in U+F600
+	  Corporate Use range dotlessj, onefitted (and other "fitted"
+	  numerals), commaaccent registered, copyright, trademark According
+	  to "Adobe Glyph List"
+	  http://www.tug.org/texlive/Contents/live/texmf-dist/doc/generic/t2/glyphlist.txt
+	  Adobe "fitted" numerals used to go in the corporate use section
+	  More in U+F800 range more corporate symbols represented elsewhere
+	  math braces, brackets move some to 2300 range Now Serif has full
+	  set extensible brackets in Miscellaneous Technical Also, think
+	  I've filled out all of the IPA
+
+2008-03-21 15:06 +0000 [r629-630]  Stevan_White:
+
+	* FreeMono.sfd: Several additions to IPA
+	  Regularized stacking of accents in Latin Extended Additional
+
+	* FreeSans.sfd: egularized stacking of accents
+	  in Latin Extended Additional Added some arrows Some Blackboard
+	  Bold Several characters in U+F600 Corporate Use range dotlessj,
+	  onefitted, commaaccent dotlessj referred to by: jcircumflex,
+	  uni01F0: how to move it? (renamed it to uFFFF, re-linked others
+	  by hand) commaaccent http://diacritics.typo.cz/index.php?id=9
+	  should be u+0326 but wasn't linked to anything anyway
+
+2008-03-21 15:01 +0000 [r628]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Got rid of dotlessi
+	  etc single substitution and related ccmp table Regularized
+	  stacking of accents in Latin Extended Additional FreeSansBold
+	  U+0617 etc, read glyphs "4GWglm" It should be arabic. Deleted
+
+2008-03-19 08:21 +0000 [r627]  Stevan_White:
+
+	* ChangeLog: added changes of the 18th
+
+2008-03-19 00:14 +0000 [r626]  Stevan_White:
+
+	* FreeSans.sfd: clean-up of all path issues and
+	  points too close
+
+2008-03-18 19:52 +0000 [r625]  Stevan_White:
+
+	* FreeSans.sfd: Re-ordered the ShortTable,
+	  because when I did autoinstruct on the quadratic version, it did
+	  it this way.
+
+2008-03-18 19:44 +0000 [r624]  Stevan_White:
+
+	* FreeSans.sfd: A ligature referred to a name
+	  with no entry: afii301. This is the Adobe name for zero-width
+	  joiner, U+200D. With this, FontForge's "Find Problems" ATT "Check
+	  for missing glyph names" finally passes.
+
+2008-03-18 19:41 +0000 [r623]  Stevan_White:
+
+	* FreeSans.sfd: zero-width joiner and zero-width
+	  non-joiner both had glyphs, incorrectly. (u+200B 200C)
+
+2008-03-18 19:33 +0000 [r622]  Stevan_White:
+
+	* FreeSans.sfd: Seems one ot the 'pres' tables
+	  contains mixed Devangari and Gujarati. This is probably a
+	  mistake, but re-named the table accordingly, and added the
+	  script. With this, FontForge "Find Problems" for ATT "Check for
+	  missing scripts in features" finally passes.
+
+2008-03-18 19:24 +0000 [r621]  Stevan_White:
+
+	* FreeSans.sfd: removed another 'above' mark
+	  form a greek letter
+
+2008-03-18 19:14 +0000 [r619-620]  Stevan_White:
+
+	* FreeSans.sfd: Likewise a Gugarati lookup had
+	  script DFLT.
+
+	* FreeSans.sfd: 'pres' Pre Base Substitution has
+	  script DFLT. That cannot be right: this contains Devangari
+	  characters. Changed script and name accordingly. This was
+	  probably a mistake and a leftover.
+
+2008-03-18 19:07 +0000 [r618]  Stevan_White:
+
+	* FreeSans.sfd: got rid of "lookup \d\d" in
+	  table names
+
+2008-03-18 19:01 +0000 [r617]  Stevan_White:
+
+	* FreeSans.sfd: The 'aalt' table for Latin
+	  contains only bengali characters. [renamed accordingly, and put
+	  in script 'beng' rather than 'latn'] The table "Ligature
+	  Substitution for Devanagari lookup 46" is really a 'reph'.
+	  Re-named accordingly. The table "'vatu' Vattu Variants lookup 24"
+	  is in script 'DFLT', which is wrong. The characters are from
+	  Gujarati. But there is already such a table for Gujarati. Changed
+	  name and script accordingly. Got rid of Single Substitution
+	  table.
+
+2008-03-18 18:54 +0000 [r616]  Stevan_White:
+
+	* FreeSans.sfd: Think I fixed the problem
+	  causing the FontForge crashes. Related to the dotlessi thing.
+	  There's a table Lookup: 6 0 0 "'ccmp' Glyph
+	  Composition/Decomposition in Latin lookup 0" {"'ccmp' Glyph
+	  Composition/Decomposition in Latin lookup 0 subtable" } ['ccmp'
+	  ('latn' <'dflt' > ) ] It is related to another lookup ChainSub2:
+	  class "'ccmp' Glyph Composition/Decomposition in Latin lookup 0
+	  subtable" that has something to do with i and j. It ends with
+	  SeqLookup: 0 "Single Substitution lookup 47" EndFPST When I
+	  removed the lookup for i and j, the SeqLookup line would be badly
+	  corrupted, and subsequent saves resulted in a segfault and a
+	  truncated sfd file. So I doctored the whole thing with vi.
+
+2008-03-18 08:13 +0000 [r615]  Stevan_White:
+
+	* FreeSans.sfd: Again got rid of single
+	  substitution lookup changing dotlessi and dotlessj to i and j,
+	  because it's wrong.
+
+2008-03-18 08:10 +0000 [r614]  Stevan_White:
+
+	* FreeSans.sfd: Regress to 1.118. Somehow
+	  introduced a crash. (I wasn't careful enough changing the names
+	  of the lookups, I think--need to make sure the change results in
+	  unique names).
+
+2008-03-17 23:36 +0000 [r613]  Stevan_White:
+
+	* FreeSans.sfd: got rid of single substiturions
+	  of dotlessi dotlessj for i and j. these were just wrong. the
+	  'aalt' table only contained Bengali, although it said 'latn' and
+	  its name was Latin. Changed name and script to correct. Got rid
+	  of extra Devanagari vatu table
+
+2008-03-17 23:30 +0000 [r612]  Stevan_White:
+
+	* FreeSans.sfd: got rid of 'lookup xx' in table
+	  names
+
+2008-03-17 23:26 +0000 [r611]  Stevan_White:
+
+	* FreeSans.sfd: Removed 'mark' named 'above'
+	  from some Greek and Cyrillic letters, and corrected it for a
+	  couple of diacriticals.
+
+2008-03-16 20:32 +0000 [r609-610]  Stevan_White:
+
+	* CREDITS: clean-up of non-unicode characters
+
+	* CREDITS: converted to UTF-8
+
+2008-03-16 20:18 +0000 [r608]  Stevan_White:
+
+	* AUTHORS: changed name of maintainer to mine
+
+2008-03-16 20:09 +0000 [r607]  Stevan_White:
+
+	* ChangeLog: compiled changes from CVS log. this is
+	  a messy process. I'm sure I missed a lot. Meant to represent
+	  changes since 02/10.
+
+2008-03-16 17:29 +0000 [r606]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd, FreeMono.sfd,
+	  FreeMonoOblique.sfd: clean-up named some
+	  unnamed characters removed a duplicate
+
+2008-03-16 13:34 +0000 [r605]  Stevan_White:
+
+	* FreeMono.sfd: Added vowels to GPOS 'mark'
+	  lookup table for 'above' added 'below' as well, but only for
+	  c-cedilla
+
+2008-03-16 12:11 +0000 [r604]  Stevan_White:
+
+	* FreeMono.sfd: Much futzing with accents in
+	  Latin extensions, in attempt to make them readable at small
+	  sizes, and to make the glyph bounds reasonable. Note:
+	  A-ring-acute is a silly character.
+
+2008-03-15 23:16 +0000 [r603]  Stevan_White:
+
+	* FreeMono.sfd: path clean-up up to points too
+	  close passes Validation
+
+2008-03-15 22:43 +0000 [r602]  Stevan_White:
+
+	* FreeMonoBoldOblique.sfd: clean-up of path
+	  problems up to points too close
+
+2008-03-15 22:19 +0000 [r601]  Stevan_White:
+
+	* FreeMonoBoldOblique.sfd: Made to Validate
+	  Added points at extrema
+
+2008-03-15 21:59 +0000 [r600]  Stevan_White:
+
+	* FreeSans.sfd: Changed names of a bunch of
+	  glyphs with invalid TrueType names, in response to failed
+	  Validation, and in Windows the font not showing up in the font
+	  display. These were all in the range 0x1025f+, which is an
+	  attempt to take care of combining forms in Indic scripts (I don't
+	  know if this work was ever completed, or if it is the best way to
+	  do this). The names were like uni0916_uni094D.half_uni0928.pres
+	  or longer uni0926_uni094D.half_uni0926_uni094D.half.pres and a
+	  few much longer than this. By a process of removing redundant
+	  information, I think I preserved what information was there.
+	  There were a few more names that were never filled in, but
+	  contained a minus, which isn't valid. These start with
+	  "nonunicode", and I replaced the minus with an underscore.
+
+2008-03-15 19:55 +0000 [r599]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: some futzing with Combining
+	  Diacriticals
+
+2008-03-15 19:50 +0000 [r597-598]  Stevan_White:
+
+	* FreeSerifBold.sfd: changed WinInfo
+
+	* FreeSerifBoldItalic.sfd: added TtTable
+
+2008-03-15 16:12 +0000 [r596]  Stevan_White:
+
+	* FreeSerif.sfd: Fixed several lookup issues,
+	  based on "Find Problems". TamlCA_TamlSSA.half with ligature from
+	  lookup subtable 'haln' Halant Forms in Tamil lookup 24 subtable
+	  refers to a missing glyph glyph190 Similar complaint with a
+	  'half' lookup. For this and the other glyph190 issue, I changed
+	  glyph190 to TamlCA_TamlSSA, which looks right according to its
+	  surroundings. The lookup 'aalt' Access All Alternatives i is
+	  active for glyph bn_ekaar which has script 'bng2', yet this
+	  script does not appear in any of the features which apply the
+	  lookup. Similar complaint about bn_aikaar. For this I changed the
+	  script of the lookup to bng2, and changed the name of the lookup
+	  accordingly. The lookup 'liga' standard Ligatures look is active
+	  for glyph uni0937091F which has script 'dev2', yet this script
+	  does not appear in any of the features which apply the lookup. It
+	  makes a ligature of uni0937 and uni091F, which are in Devangari.
+	  So I changed the script of the lookup to 'dev2' and changed the
+	  name of the lookup accordingly. Also shortened the names of many
+	  of the lookup tables.
+
+2008-03-15 14:31 +0000 [r595]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd: cleanup of path
+	  problems, including points too close
+
+2008-03-15 14:04 +0000 [r594]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd: clean-up of path
+	  problems, including extrema
+
+2008-03-15 13:22 +0000 [r593]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: CJK punctuation: made some of
+	  the very high glyphs smaller (under 900EM) The brackets in Sans
+	  were very ugly, and not even Sans-serif. Serif: added extensible
+	  square brackets, diddled with integral corrected direction of
+	  some added glyphs
+
+2008-03-15 13:13 +0000 [r592]  Stevan_White:
+
+	* FreeSansBoldOblique.sfd: added TtTable
+
+2008-03-15 13:10 +0000 [r591]  Stevan_White:
+
+	* FreeSansBoldOblique.sfd: clean-up of path
+	  problems, including points too close
+
+2008-03-15 09:41 +0000 [r590]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: OS/2 Metrics back to
+	  900/300
+
+2008-03-15 09:35 +0000 [r589]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: OS/2 Metrics back to
+	  900/300 -- kedit doesn't like offset values
+
+2008-03-14 23:17 +0000 [r588]  Stevan_White:
+
+	* FreeSansBold.sfd,
+	  FreeSansOblique.sfd: added TfTables
+
+2008-03-14 23:08 +0000 [r587]  Stevan_White:
+
+	* FreeSansBold.sfd: clean-up of path problems
+	  extrema self-intersecting ordered PS blue values
+
+2008-03-14 22:30 +0000 [r586]  Stevan_White:
+
+	* FreeSansBold.sfd: got rid of mixed references
+	  and contours
+
+2008-03-14 22:22 +0000 [r585]  Stevan_White:
+
+	* FreeSansOblique.sfd: much clean-up of "points
+	  too close"
+
+2008-03-14 21:18 +0000 [r584]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: unified OS/2 Metrics
+	  added Grid Fit added slated-hyphen to Sans
+
+2008-03-14 19:35 +0000 [r583]  Stevan_White:
+
+	* FreeSerif.sfd: in response to Validate,
+	  changed names of three glyphs in the Tamil ligatures range...all
+	  clearly bugs.
+
+2008-03-14 19:18 +0000 [r582]  Stevan_White:
+
+	* FreeSerif.sfd: cleanup of many path problems
+	  "points too close"
+
+2008-03-14 07:26 +0000 [r581]  Stevan_White:
+
+	* FreeSerif.sfd: in response to validate
+	  results, fixed a few glyphs
+
+2008-03-14 07:19 +0000 [r580]  Stevan_White:
+
+	* FreeSerif.sfd: got rid of mixed references and
+	  contours
+
+2008-03-14 00:05 +0000 [r579]  Stevan_White:
+
+	* FreeSerif.sfd: changed OS/2 metrics various
+	  other clean-ups
+
+2008-03-13 23:43 +0000 [r578]  Stevan_White:
+
+	* FreeMonoBoldOblique.sfd: added TtTable
+
+2008-03-13 23:39 +0000 [r577]  Stevan_White:
+
+	* FreeMonoBoldOblique.sfd: got rid of mixed ref
+	  and contour
+
+2008-03-13 23:33 +0000 [r576]  Stevan_White:
+
+	* FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: removed PS Private
+	  StemSnapV, which was empty anyway.
+
+2008-03-13 23:28 +0000 [r574-575]  Stevan_White:
+
+	* FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: added Grid Fit tables
+
+	* FreeMono.sfd: change OS/2 metrics to 900/300
+
+2008-03-13 23:19 +0000 [r573]  Stevan_White:
+
+	* FreeSerifItalic.sfd: added TtTable, ShortTable
+
+2008-03-13 23:15 +0000 [r572]  Stevan_White:
+
+	* FreeSerifItalic.sfd: Removed PS Private
+	  StemSnapV -- wasn't right anyway added Grid Fitting made better
+	  OS/2 metrics
+
+2008-03-13 23:06 +0000 [r571]  Stevan_White:
+
+	* FreeSerifItalic.sfd: further path cleanup:
+	  points too close together. in Bengli range, much yet to do
+
+2008-03-13 20:00 +0000 [r569-570]  Stevan_White:
+
+	* FreeMonoOblique.sfd: cleaned up remaining path
+	  problems, missing extrema fixed some math characters
+
+	* FreeMonoBold.sfd: cleaned up path problems,
+	  and mixed refs and contours added TfTable
+
+2008-03-13 08:25 +0000 [r568]  Stevan_White:
+
+	* FreeSerifItalic.sfd: path clean-up more
+	  self-intersecting added many missing extrema fixed mixed
+	  references and glyphs
+
+2008-03-12 23:11 +0000 [r567]  Stevan_White:
+
+	* FreeSans.sfd: Rearranged PS BluesValues so
+	  they were in increasing order, made all 20 in width. In response
+	  to FontForge Validate complaint, in hopes of making font work in
+	  Windows.
+
+2008-03-12 22:45 +0000 [r566]  Stevan_White:
+
+	* FreeMono.sfd: Copied in by hand TrueType
+	  tables from a version with quadratic splines. I hope this will
+	  make the glyphs smooth properly in Windows.
+
+2008-03-12 22:41 +0000 [r565]  Stevan_White:
+
+	* FreeSans.sfd: Added TrueType tables (copied in
+	  by hand from version with quadratic splines)
+
+2008-03-12 22:34 +0000 [r563-564]  Stevan_White:
+
+	* FreeSans.sfd: clean-up tweek
+
+	* FreeSans.sfd: Got rid of mixed contours and
+	  refs
+
+2008-03-12 22:18 +0000 [r562]  Stevan_White:
+
+	* FreeMono.sfd: two more glyphs with quadratic
+	  problems
+
+2008-03-12 22:07 +0000 [r561]  Stevan_White:
+
+	* FreeMono.sfd: a few paths that don't convert
+	  well to quadratics
+
+2008-03-12 21:45 +0000 [r560]  Stevan_White:
+
+	* FreeMono.sfd: Fixed glyphs with mixed contours
+	  and references
+
+2008-03-12 01:05 +0000 [r559]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd: cleanup of path
+	  problems as others
+
+2008-03-12 00:51 +0000 [r558]  Stevan_White:
+
+	* FreeSerifItalic.sfd: cleanup of path problems
+	  as others
+
+2008-03-12 00:08 +0000 [r557]  Stevan_White:
+
+	* FreeSerifBold.sfd: cleanup of path problems
+	  open intersecting clockwise ref reversed points outside glyph
+	  removed hints
+
+2008-03-11 23:13 +0000 [r556]  Stevan_White:
+
+	* FreeMonoBoldOblique.sfd: cleanup of path
+	  problems open intersecting clockwise flipped ref points beyond
+	  spline removed hints
+
+2008-03-11 22:59 +0000 [r555]  Stevan_White:
+
+	* FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd: cleanup of path problems
+	  open paths intersecting clockwise flipped references points
+	  beyond glyph removed hints
+
+2008-03-11 22:31 +0000 [r554]  Stevan_White:
+
+	* FreeSansBoldOblique.sfd: cleanup of path
+	  problems open intersecting clockwise flipped references beyond
+	  spline
+
+2008-03-11 21:51 +0000 [r553]  Stevan_White:
+
+	* FreeSansBold.sfd: clean-up of path problems
+	  open intersecting clockwise flipped references control points
+	  beyond spline removed hints
+
+2008-03-11 21:46 +0000 [r552]  Stevan_White:
+
+	* FreeSansOblique.sfd: clean-up of path and
+	  reference problems open paths intersecting clockwise flipped refs
+	  removed hints
+
+2008-03-09 20:58 +0000 [r551]  Stevan_White:
+
+	* FreeSerif.sfd: continuing general clean-up,
+	  Found several ligatures that referred to a missing glyph "ZWJ".
+	  Took this to mean the "zero width joiner" u+200D There are a
+	  couple more cases in Tamil, but I don't know the glyph they're
+	  referring to.
+
+2008-03-09 14:27 +0000 [r550]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerif.sfd: further cleanup of path/ref
+	  problems
+
+2008-03-09 14:08 +0000 [r549]  Stevan_White:
+
+	* FreeMono.sfd: clean-up of path problems
+
+2008-03-09 14:00 +0000 [r548]  Stevan_White:
+
+	* FreeMono.sfd: Efforts to make legible at 9pt.
+	  At 8pt, glyphs are at least distinct.
+
+2008-03-09 12:53 +0000 [r547]  Stevan_White:
+
+	* FreeMono.sfd: math symbols: set for LaTeX 2e
+	  seems to be all there. To do: improve legibility at 9pt. Some
+	  double-arrows are just a blur.
+
+2008-03-09 12:18 +0000 [r546]  Stevan_White:
+
+	* FreeMono.sfd: more math characters corrected
+	  logical 'assert' relations, etc. 22a2-22af
+
+2008-03-09 10:41 +0000 [r544-545]  Stevan_White:
+
+	* FreeSerif.sfd: corrected L-dot
+
+	* FreeSerifItalic.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd: Math symbols ============
+	  SerifItalic Greek lunate epsilon FreeMono many additions in math
+	  range reduced size of binary union, intersection, vee, wedge
+	  correcte empty set
+
+2008-03-08 23:22 +0000 [r543]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: FreeSans added Greek lunate
+	  epsilon and rho symbol both un-stacked some more stacked
+	  diacriticals
+
+2008-03-08 22:41 +0000 [r542]  Stevan_White:
+
+	* FreeSans.sfd: Clean-up of font paths open
+	  self-intersecting outermost clockwise missing extrema also
+	  flipped references (unlinked)
+
+2008-03-08 18:17 +0000 [r541]  Stevan_White:
+
+	* FreeSerif.sfd: Added lunate epsilon Corrected
+	  empty set tightened up spacing of some other technical characters
+	  worked on some more math operators involving =
+
+2008-03-08 15:11 +0000 [r540]  Stevan_White:
+
+	* FreeSerif.sfd: Added several math operators
+	  used by LaTeX 2e triangle several arrows arrowhookleft
+	  arrowhookright Supplemental Arrows-A long left arrow long right
+	  arrow long leftright arrow long left double arrow long right
+	  double arrow long leftright double arrow long left arrow with
+	  flat tail long right arrow with flat tail
+
+2008-03-08 13:11 +0000 [r539]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Supplemental Math operators
+	  ============== Added a few of the "n-ary" operators. Math
+	  operators ============== Corrected n-ary union, intersection, and
+	  spikes to be larger than the binary operators Made (many of) the
+	  operators based on + - = to use those symbols directly (by
+	  reference or copying). I think it is good practice to harmonize
+	  the appearance of math operators with the Latin character set.
+	  Geometrical Shapes ================== Made the large circle
+	  larger still. When is it large enough? Combining marks for
+	  Symbols =========================== Made the combining circle to
+	  really combine. Made a circle-slash
+
+2008-03-08 10:15 +0000 [r538]  Stevan_White:
+
+	* FreeSerif.sfd: Clean-up of path problems
+	  intersecting paths missing extrema outer path clockwise Many
+	  changes in Bengali, Ethiopic ranges. These could really use
+	  further clean-up. Added 'divides' and 'not divides'
+
+2008-03-08 10:10 +0000 [r537]  Stevan_White:
+
+	* FreeMono.sfd: Added Grid Fit "GASP" table
+	  Clean-up of contour problems: open paths intersecting paths (esp.
+	  those of references) outermost paths clockwise missing extrema
+	  Also references problems fipped refs tt (TrueType) transformation
+	  matrix problems Did same process of un-stacking some accents in
+	  Latin Extended range as done for Serif. Made combining
+	  diacritical 'hook' to be shorter. (Should have been multiple
+	  commits...I know)
+
+2008-03-06 18:58 +0000 [r536]  Stevan_White:
+
+	* FreeSerif.sfd: Shortened and thickened the
+	  combining hook mark, U+0309, thus shortening many combined
+	  characters and making it look more like the Unicode samples. Then
+	  touched on bug #22499 Latin Extended Additionals incorrectly
+	  stack accents At least in this face, un-stacked
+	  incorrectly-stacked marks.
+
+2008-03-05 22:01 +0000 [r535]  Stevan_White:
+
+	* FreeSerif.sfd: Fixed positioning U+1EC8, 9, I
+	  with hook above
+
+2008-03-05 21:45 +0000 [r534]  Stevan_White:
+
+	* FreeSerif.sfd: added spacing modifier letters
+	  02B9 02Ba prime and double-prime
+
+2008-03-05 21:36 +0000 [r533]  Stevan_White:
+
+	* FreeSerif.sfd: vertical lines: combining
+	  diacritical marks corrected 0300 030D 0329 0348 (were rendered as
+	  straight apostrophes) spacing modifier letters added 02C8 02CC
+
+2008-03-05 20:20 +0000 [r532]  Stevan_White:
+
+	* FreeSerif.sfd: Reverses 1.90. I regretted 1.90
+	  before while and after doing it.
+
+2008-03-04 20:47 +0000 [r531]  Stevan_White:
+
+	* FreeSerif.sfd: Some modifications to Spacing
+	  Modifier Letters 02B0 - 02FF Idea was to bring in line with
+	  Unicode that suggests that these characters should all occupy the
+	  width of a space in the font, here, 250 EM. Unfortunate
+	  side-effects in hundreds of characters that used them. Hope I got
+	  them all.
+
+2008-03-03 20:01 +0000 [r530]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Set the OS/2 Sup/Sub
+	  settings, which by default looked like random trash. I don't know
+	  if it really helps but it looks better.
+
+2008-03-03 00:13 +0000 [r529]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: TTY strings updates
+	  Updated Copyright to 2008 Added Vendor URL as the Savannah
+	  freefont site Added a standard pangram as the Sample Text for
+	  Russian in FreeMono*. It reads: In the thickets of the South once
+	  there was a citrus...--yes, but a fake specimen!
+
+2008-03-02 22:50 +0000 [r528]  Stevan_White:
+
+	* FreeMono.sfd: Completed fix of glyph path
+	  problems open path intersecting not clockwise missing extrema Had
+	  to remove one glyph, because couldn't figure out how to make it
+	  not intersect itself: dkshade U+2193, a checkerboard (probably
+	  should be re-done as non-intersecting squares). Also, lowered the
+	  diacritics on a bunch of capital Latin letters, so they didn't
+	  have to intersect when stacked. Act of desperation?
+
+2008-03-02 21:37 +0000 [r527]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Clean sweep, fixing
+	  all open glyph contours.
+
+2008-03-02 20:13 +0000 [r526]  Stevan_White:
+
+	* FreeSans.sfd: Parital clean-up of glyph path
+	  problems open paths some of intersecting paths There are many
+	  more instances of intersecting paths. The Bengali range is
+	  particularly affected.
+
+2008-03-02 19:14 +0000 [r525]  Stevan_White:
+
+	* FreeMonoBold.sfd: Cleaned up glyph path
+	  problems open paths intersecting paths not clockwise missing
+	  extrema
+
+2008-03-02 15:48 +0000 [r524]  Stevan_White:
+
+	* FreeMono.sfd: Fixed most glyph path problems.
+	  Open path path direction extrema There are still a few
+	  intersecting paths...
+
+2008-03-02 12:31 +0000 [r523]  Stevan_White:
+
+	* FreeSerif.sfd: Clean-up of problems found by
+	  FontForge "Find Problems". Fixed all problems with Open Paths
+	  Intersecting Paths Check outermost paths clockwise With Check
+	  missing extrema there were lots of problems, and it's very
+	  fiddly. I got up through the Arabic range, but pooped out in the
+	  Indian scripts. Note: Most of the problems were plainly mistakes,
+	  or problems that cropped up after some transformation of the
+	  glyph. Others seem to be the result of freehand drawing or
+	  scanning. More info at: bug #22454: Path bugs in FreeSerif
+
+2008-03-01 21:14 +0000 [r522]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoBoldOblique.sfd: Removed all back
+	  layers from glyphs that had them. In most cases, this layer had
+	  been used as a guide, slightly modified to make the front layer.
+	  Sometimes it was just a mistake. This remedies bug #22381: Some
+	  characters have "ghost" glyphs in back layer
+	  https://savannah.gnu.org/bugs/index.php?22381 However, this is
+	  bound to happen again. It would be good to have a script that
+	  checks, or maybe a facility in FontForge's "Find Problems".
+
+2008-03-01 10:20 +0000 [r521]  Stevan_White:
+
+	* FreeSerif.sfd: Arabic now seems to be working,
+	  in a limited way, for display of modern text. Remedy for: bug
+	  #22329: Arabic not really working
+	  https://savannah.gnu.org/bugs/index.php?22329 * Drew several
+	  glyphs for special forms of yeh * Drew sukun combining
+	  diacritical * Made some diacritical combining marks to be
+	  properly zero width. * Added 'init' 'medi' 'fina' tables to
+	  convert letters to their initial, medial, and final forms within
+	  words. * Added 'rlig' table for required ligatures of lam and
+	  alif * Constructed the lam-alif ligatures. Not done: * may be
+	  more required ligatures of lam and alif * other common ligatures
+	  * 'mark' table for better positioning of diacriticals * 'mark'
+	  table for positioning vowels * 'locl' table for localized forms
+	  of certain letters * 'ccmp' table for decomposing ligatures Also
+	  (nothing to do with Arabic): moved some glyphs 02d4-02D7 up.
+
+2008-02-27 22:45 +0000 [r520]  Stevan_White:
+
+	* FreeSerif.sfd: Shifted entire Arabic alphabet
+	  down by 200EM, so it shares the common baseline. I hope. Arabic
+	  Arabic Presetation Forms
+
+2008-02-27 22:26 +0000 [r519]  Stevan_White:
+
+	* FreeSans.sfd: Filled out Combining Diacritical
+	  Forms in Sans
+
+2008-02-27 22:02 +0000 [r518]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: more tweeks to Combining
+	  Diacritical Forms
+
+2008-02-27 08:38 +0000 [r517]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd: Combinint diacriticals range
+	  Mostly filled Sans. The rest are tweeks.
+
+2008-02-26 00:12 +0000 [r516]  Stevan_White:
+
+	* FreeSerif.sfd: More tweeks to combining
+	  diacriticals. added DPOS 'mark' tables for Latin below topright
+	  ogonek and put corresponding marks in many Latin letters
+
+2008-02-24 11:57 +0000 [r515]  Stevan_White:
+
+	* FreeSerif.sfd: Some tweeks to previous commit.
+
+2008-02-24 11:34 +0000 [r514]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Much fiddling with the
+	  "combining diacriticals" range 0300-036F. More info: see bug
+	  #22331: combining diacriticals are misplaced in FreeSerif Filled
+	  in for Serif. Also tidied diacriticals in some of the other
+	  faces. Made to align to medium-sized preceding character, when
+	  not using anchor marks. Added "above" marks where needed. To do:
+	  add "below" table and marks.
+
+2008-02-23 18:30 +0000 [r513]  Stevan_White:
+
+	* FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Continued programme
+	  of filling HTML Character Entities in Mono. I think there are
+	  still a few missing, but I don't have an easy way to tell...
+	  Anyway, it's looking good.
+
+2008-02-23 13:43 +0000 [r512]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Unified and corrected
+	  combining diacritical marks U+0360-1 where they existed. Also
+	  tidied some of the "tie" marks. These glyphs have width 0. I'm
+	  not sure that is the best way to approach the problem of
+	  combining marks, but I see other fonts that do the same.
+
+2008-02-23 12:58 +0000 [r511]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Checked U+203F, U+2040 (tie
+	  and undertie). Mostly the tie was too low.
+
+2008-02-23 11:55 +0000 [r510]  Stevan_White:
+
+	* FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd: Made "HTML 4 Character
+	  Entities" complete for normal-style faces. Partial remedy for bug
+	  #21784: missing glyphs for HTML 4 character entities
+	  https://savannah.gnu.org/bugs/?21784 Main things remaining: do
+	  similar process for bold and oblique forms. ----- notes
+	  ----------- Filled out several typographic spaces in Sans and
+	  Mono U+2000, etc. Mono made Rfraktur Mono made 'angle' Mono
+	  copied cards suites from FreeSerif and scaled to fit Sans drew
+	  upsilon-hook. Sans constructed omegapi from omega and a minus
+	  Sans made overline Sans flat copied cards suites from FreeSerif
+	  (maybe not "sans" enough?) Sans 'similar' didn't look like other
+	  such symbols and was much skinnier Sans made several symbols to
+	  be references to 'similar' Sans made 'congruent' Sans made
+	  reference to aleph from alephmath Sans angleleft and angleright
+	  brackets just copied from Serif (in which they look too angular)
+	  Sans "subset" is too high and looks like a letter C. Made to be a
+	  tad higher than small letter Sans notin doesn't look like isin:
+	  'element' 2208 is the height of a capital. Fixed this, and used
+	  references to better effect. Sans weierstrass p: copied from Mono
+	  (where its style doesn't fit anyway), and widened the stroke
+	  -------- other notes ----------------- better check Sans 0361
+	  also doubt 223E is right What is to be done about that? Serif
+	  2040 tie is low...didn't I fix this? Sans Rfraktur and Ifraktur
+	  are not sans-serif. Overall, many Sans math symbols are much
+	  thinner than seems to fit. Sans surprises me not all the
+	  "equals"-like characters are made from "minus" Sans "period" is a
+	  square. (Don't like the dot operator being a square, but that
+	  would be consistent.) Serif ceil and floor glyphs are not high
+	  enough
+
+2008-02-21 21:28 +0000 [r509]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: In previous commit,
+	  changed Font Info -> OS/2 -> Vendor ID to GNU Repeated that for
+	  the remaining fonts.
+
+2008-02-21 21:01 +0000 [r508]  Stevan_White:
+
+	* FreeSans.sfd, FreeMono.sfd,
+	  FreeSerif.sfd: Worked toward extended integral
+	  signs. U+2320 TOP HALF INTEGRAL U+23AE INTEGRAL EXTENSION U+2321
+	  BOTTOM HALF INTEGRAL Regarding bug #13370: INTEGRAL EXTENSION
+	  does not align with TOP/BOTTOM HALF INTEGRAL
+	  https://savannah.gnu.org/bugs/?13370 Hope was to make the three
+	  pieces precisely match up. But the horizontal space eludes me.
+	  There is still a tiny gap, althogh I have made the parts slightly
+	  longer than they ought to be. Also, FreeMono is still not
+	  advertizing that it supports "Miscellaneous Technical Symbols",
+	  although FontForge shows it selected in Font Info->OS/2.
+
+2008-02-21 00:46 +0000 [r507]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Moved capital Greeek
+	  letters with tonos so tonos doesn't cover preceding letter
+	  Partial remedy for bug #12798: some combined Greek characters
+	  have a bug https://savannah.gnu.org/bugs/index.php?12798 Only
+	  deals with range 0380 - 03df (Greek). More needs to be done in
+	  Greek Extended range.
+
+2008-02-20 21:57 +0000 [r506]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Made Greek 'tonos' to
+	  be the same as combining accent acute Remedy for bug #12821:
+	  FreeSerif has Greek tonos different than Greek acute
+	  https://savannah.gnu.org/bugs/index.php?12821 In some cases, just
+	  made a reference to U+0301 (combining accent acute) of U+0384
+	  (Greek tonos). The characters that used tonos were linked to
+	  that. In many cases, this cause spacing problems, which were also
+	  fixed
+
+2008-02-20 19:50 +0000 [r505]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoOblique.sfd: Tweeks to curly quotes of
+	  previous commit
+
+2008-02-20 08:52 +0000 [r504]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Made proper curly
+	  quotes of U2018 - U201F in monospace fonts (removed incorrect
+	  reference in some straight quotes U2033... Remedies bug #18300:
+	  FreeMono has the wrong quote marks â (U+2018) and â (U+201C)
+	  https://savannah.gnu.org/bugs/index.php?18300
+
+2008-02-19 23:17 +0000 [r503]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: This touches on two
+	  bug reports with interrelated glyphs bug #20278: Vertical offset
+	  of superscripted numerical digits Some vertical offset problems,
+	  lots more horizontal ones. Changes also impacted vulgar
+	  fractions, so had to fix those too. bug #17756: possible printing
+	  problem with vulgar fractions. . . .
+	  https://savannah.gnu.org/bugs/index.php?17756 I think this was a
+	  case of front and back layers inadvertently both having glyphs in
+	  them. Removed the ones I found, and tidied up all vulgar
+	  fractions
+
+2008-02-18 23:21 +0000 [r502]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Added to FreeSerif* uni2E17
+	  double hyphen In pursuit of bug #22267: Request Double-Hyphen
+	  Sign https://savannah.gnu.org/bugs/?22267
+
+2008-02-18 22:37 +0000 [r501]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: unified 'liga' for Latin:
+	  now only ff ffi ffl fi fl Other ligatures should be put in dlig,
+	  hlig, etc. Removed such as Lj, DZ. I don't thing these are
+	  ligatures. (Am I wrong? the glyphs aren't modified...)
+
+2008-02-18 08:33 +0000 [r500]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerif.sfd: Slightly increased the height
+	  of Cyrillic Ðž (U+0438) to be even with other similar glyphs
+	  (e.g. U+043D) Remedies bug #22289: The Cyrillic Ðž letter in
+	  FreeSerif isn't high enough
+	  https://savannah.gnu.org/bugs/index.php?22289
+
+2008-02-18 08:18 +0000 [r499]  Stevan_White:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Made U+30FB, KATAKANA MIDDLE
+	  DOT to be same width as other Katakana. Remedies bug #18326: ã»
+	  (U+30FB, KATAKANA MIDDLE DOT) should be fullwidth
+	  https://savannah.gnu.org/bugs/index.php?18326
+
+2008-02-18 08:02 +0000 [r498]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Moved U+203F UNDERTIE to be
+	  below the baseline, as it should be. See
+	  http://www.unicode.org/charts/PDF/U2000.pdf Remedy for bug
+	  #18413: U+203F UNDERTIE glyph too high in FreeSerif
+	  https://savannah.gnu.org/bugs/?18413
+
+2008-02-18 01:19 +0000 [r497]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Re-promoted ff ffi ffl fi
+	  fl as standard ligatures in Latin. Made st ligature historical,
+	  if anything. Cleaned up some silly ligatures (Roman numerals as
+	  ligatures, etc) There is more to be done here, just for Latin
+	  ligatures.
+
+2008-02-17 23:41 +0000 [r496]  Stevan_White:
+
+	* FreeSans.sfd: Offset Hiragana and Katakana
+	  ranges of FreeSans as in
+	  https://savannah.gnu.org/bugs/index.php?22326
+
+2008-02-17 23:34 +0000 [r495]  Stevan_White:
+
+	* FreeSerif.sfd,
+	  FreeSerifBold.sfd: Corrected vertical offset
+	  of Hiragana and Katakana, cf
+	  https://savannah.gnu.org/bugs/index.php?22326 (with advice from
+	  Kenshi Muto)
+
+2008-02-17 23:26 +0000 [r494]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Auto-Hinted
+	  everything. The auto-hinting in the new FontForge is said to be
+	  (and seems to me to be) much better than in previous versions.
+
+2008-02-17 23:16 +0000 [r493]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: TT Info ->
+	  Manufacturer = GNU
+
+2008-02-17 22:58 +0000 [r492]  Stevan_White:
+
+	* FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Updated FontForge SFD
+	  file version to SplineFontDB: 2.0 using FontFOrge 20080214 This
+	  is a very big change, with which we can carry on with the new
+	  FontForge.
+
+2008-02-17 22:20 +0000 [r491]  Stevan_White:
+
+	* FreeSerif.sfd: This removes the georgian-d
+	  patch of revision 1.58. I can't imagine what went on here. Maybe
+	  I somehow got the patch inverted. Anyway, after the patch, 10e6
+	  and 10d3 are indistinguishable, which is wrong, according to
+	  http://www.unicode.org/charts/PDF/U10A0.pdf Without the patch,
+	  they seem to be correct.
+
+2008-02-14 23:36 +0000 [r490]  Stevan_White:
+
+	* INSTALL: Instructions for KDE local installation
+	  Instructions for Windows Vista
+
+2008-02-11 22:55 +0000 [r489]  Stevan_White:
+
+	* FreeSerif.sfd: This is from an anonymous patch
+	  patch #5924: correct postscript name for cyrillic yat' Wednesday
+	  05/09/2007 at 18:25 (now bug #22265: correct postscript name for
+	  cyrillic yat') The postscript name of the two cyrillic letters
+	  yat' and YAT' (0x0462) is not correct, so this fixes it: I found
+	  confirmation of the PostScript names here
+	  http://www.adobe.com/devnet/font/pdfs/5013.Cyrillic_Font_Spec.pdf
+
+2008-02-11 20:06 +0000 [r488]  Stevan_White:
+
+	* README: Made status of Microsoft core web fonts a
+	  little clearer.
+
+2008-02-10 19:50 +0000 [r486]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Apply patch
+	  011_liga_to_dlig by Christian Perrier from Debian sources. I am
+	  not quite sure which bug this is meant to fix, but it is most
+	  like bug #15792: Freefont Alef and Lamed combine although this
+	  patch is not the patch included in that bug report. (The report
+	  was closed...no indication if any action was taken.) This is the
+	  last outstanding patch from the Debian sources for ttf-freefont
+	  found in ttf-freefont-20060501cvs-12.diff That is, the SVD files
+	  of this project should now match the ones used to build the
+	  Debian ttf-freefont fonts.
+
+2008-02-10 19:38 +0000 [r483-485]  Stevan_White:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Apply patch
+	  009_freemono_really_mono by Christian Perrier from Debian sources
+	  meant to remedy bug #17062: Erroneous Georgian D in FreeSerif
+	  reported by Christian Perrier
+
+	* FreeSerif.sfd: Apply patch 008_georgian_d by
+	  Christian Perrier from Debian sources, meant to remedy bug
+	  #17062: Erroneous Georgian D in FreeSerif
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Apply patch
+	  007_horizontal_spacing by Christian Perrier from Debian sources,
+	  which is meant to remedy bug #17038: horizontal spacing bug in
+	  freemono reported by Christian Perrier
+
+2008-02-10 19:28 +0000 [r482]  Stevan_White:
+
+	* FreeMono.sfd: Apply the patch
+	  006_remove-russian-sample by Christian Perrier from the Debian
+	  sources that remedies bug #15791 Weird strings in freefont fonts
+	  reported by Christian Perrier Note this change had previously
+	  been made by Primoz Peterlin. The problem was that the Russian
+	  string had somehow become corrupted. I may replace it with a
+	  correctly encoded version in the future.
+
+2008-02-10 19:23 +0000 [r481]  Stevan_White:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Apply patch
+	  004_workaround-spacing-bug by Christian Perrier, from the Debian
+	  sources which is meant as a (partial) remedy for bug #15956: Line
+	  height is too big in sans and serif reported by Eeli Kaikkonen
+	  Thanks also to Jan Willem Stumpel
+
+2008-02-10 19:12 +0000 [r479-480]  Stevan_White:
+
+	* FreeMono.sfd: In preparation for merge with
+	  Debian sources, which date from 2006-05-01, remove this commit,
+	  which was RCS file: /sources/freefont/freefont/FreeMono.sfd,v
+	  revision 1.28 date: 2006-05-04 15:54:45 +0200; author: peterlin;
+	  state: Exp; lines: +3 -3; Deleted messy Russian sample text from
+	  FreeMono. The Debian diffs already contain this patch, so it will
+	  not get re-applied. Note: I also found the Russian string that
+	  somehow got corrupted, and may well re-insert it later, because I
+	  like it.
+
+	* FreeSans.sfd: In preparation for merge with
+	  Debian sources which date from 2006-05-01, un-do this commit,
+	  which was revision 1.80 date: 2006-05-01 14:42:53 +0200; author:
+	  moyogo; state: Exp; lines: +72 -36; replaced U+2134 Plan to apply
+	  the Debian patches, then re-apply this one.
+
+2008-02-03 09:50 +0000 [r478]  Stevan_White:
+
+	* README: updated URLs corrected spelling errors
+	  added reference to DejaVu (Bitstream Vera) fonts removed
+	  reference to ttfedit, which seems no longer to exist updated
+	  freefont URL added Steve White
+
+2008-01-22 18:35 +0000 [r476-477]  Stevan_White:
+
+	* test (removed): remove the test file
+
+	* test (added): test to see if I can really commit
+	  with the new account
+
+2006-09-20 11:37 +0000 [r475]  peterlin:
+
+	* INSTALL, ChangeLog: * INSTALL:
+	  added installation procedure for MacOS X, courtesy Philipp
+	  Kempgen.
+
+2006-05-04 13:54 +0000 [r474]  peterlin:
+
+	* ChangeLog, FreeMono.sfd:
+	  Deleted messy Russian sample text from FreeMono.
+
+2006-05-01 12:42 +0000 [r473]  moyogo:
+
+	* FreeSans.sfd: replaced U+2134
+
+2006-04-15 21:49 +0000 [r472]  peterlin:
+
+	* ChangeLog, FreeSans.sfd,
+	  FreeSerif.sfd: * FreeSerif.sfd: corrected
+	  U+10D3. * FreeSans.sfd: ligature U+FB06 (LATIN SMALL LIGATURE
+	  S T) changed from mandatory ("liga") to discretionary ("dlig")
+	  (bug #16253).
+
+2006-04-15 21:01 +0000 [r471]  peterlin:
+
+	* ChangeLog, FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: * FreeMono.sfd:
+	  deleted incomplete glyph U+FB06 (LATIN SMALL LIGATURE S T);
+	  deleted U+FB00, U+FB01, U+FB02, U+FB05 as ligatures. *
+	  FreeMonoOblique.sfd, FreeMonoBoldOblique.sfd: added
+	  U+FB00; deleted U+FB01, U+FB02 as ligatures. *
+	  FreeMonoBold.sfd: deleted U+FB00, U+FB01, U+FB02 as
+	  ligatures.
+
+2006-04-15 20:21 +0000 [r470]  peterlin:
+
+	* ChangeLog, FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Added Georgian
+	  letters, donated by Gia Shervashidze.
+
+2006-02-22 22:57 +0000 [r469]  peterlin:
+
+	* ChangeLog, FreeMono.sfd,
+	  FreeMonoOblique.sfd: * FreeMono.sfd,
+	  FreeMonoOblique.sfd: ligature U+FB4F changed from mandatory
+	  ("liga") to discretionary ("dlig"). This is respons to
+	  Bug#349657: [bug #15792] Freefont Alef and Lamed combine
+
+2006-02-21 00:23 +0000 [r468]  peterlin:
+
+	* ChangeLog, FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeSerifBold.sfd: * FreeSerifBold.sfd,
+	  FreeSans.sfd, FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd, FreeSansBold.sfd: ligature
+	  U+FB4F changed from mandatory ("liga") to discretionary ("dlig").
+	  This is respons to Bug#349657: [bug #15792] Freefont Alef and
+	  Lamed combine
+
+2006-02-20 23:13 +0000 [r467]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd: corrected bug#275759: [bug #15790] FreeSerif
+	  glyphs for U+2198/U+2199 were reversed.
+
+2006-02-14 23:09 +0000 [r466]  moyogo:
+
+	* ChangeLog, FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: * removed ij and IJ
+	  ligature substitutions
+
+2006-02-10 22:13 +0000 [r465]  peterlin:
+
+	* AUTHORS, ChangeLog,
+	  CREDITS, FreeSerif.sfd: *
+	  FreeSerif.sfd: added small Georgian letters (mkhedruli),
+	  donated by Gia Shervashidze * AUTHORS: Added Gia Shervashidze *
+	  CREDITS: Added Gia Shervashidze
+
+2006-01-30 23:07 +0000 [r464]  peterlin:
+
+	* ChangeLog, notes/maintenance.txt:
+	  notes/maintenance.txt - login as "anonymous"
+
+2006-01-26 22:32 +0000 [r462]  peterlin:
+
+	* ChangeLog, notes/maintenance.txt: *
+	  notes/maintenance.txt: Added information on the Makefile now
+	  used.
+
+2006-01-26 22:12 +0000 [r461]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd: *
+	  FreeSansBold.sfd: added U+0569, U+0571, U+0579, U+057B,
+	  U+0586. Armenian small letters completed.
+
+2006-01-26 15:44 +0000 [r460]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd: added U+0297, U+02AD-02AF. IPA Extensions
+	  section is now complete. Copied a dozen of glyphs from Omega IPA
+	  to Phonetic Extension section.
+
+2006-01-25 23:01 +0000 [r459]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd: added U+01A, U+01A3, U+01A6, U+01B2, U+01BA,
+	  U+01BB, U+01BE, U+01BF.
+
+2006-01-25 12:44 +0000 [r458]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd: aligned small Armenian letters to x-height in
+	  response to bug #15480. Armenian in Free Sans needs a major
+	  cleanup.
+
+2006-01-24 23:39 +0000 [r457]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd: changed U+0452, U+045B. Cleanup: U+0460,
+	  U+0461, U+04Bc, U+04BD, U+0508.
+
+2006-01-24 12:18 +0000 [r456]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd: changed U+0285.
+
+2006-01-24 12:01 +0000 [r455]  peterlin:
+
+	* ChangeLog, FreeSansOblique.sfd:
+	  * FreeSansOblique.sfd: replaced accented chars in Latin-1 and
+	  Latin Extended-B sections with references, where possible.
+
+2006-01-23 22:13 +0000 [r454]  peterlin:
+
+	* ChangeLog, FreeSans.sfd,
+	  FreeSansOblique.sfd: * FreeSans.sfd: added
+	  U+0195, U+01AA, U+0297, U+03D7, U+03F0. Several flipped
+	  references replaced by outlines. * FreeSansOblique.sfd: Latin
+	  Extended-B section more or less brought in sync with FreeSans.
+
+2006-01-23 15:33 +0000 [r453]  peterlin:
+
+	* ChangeLog,
+	  FreeMonoBoldOblique.sfd: *
+	  FreeMonoBoldOblique.sfd: added glyphs from FreeMonoBold in
+	  the Latin Extended-B and IPA Extensions sections.
+
+2006-01-23 14:44 +0000 [r452]  peterlin:
+
+	* ChangeLog, FreeSerifBold.sfd: *
+	  FreeSerifBold.sfd: Added U+0224, U+0225. Changed U+01B7,
+	  U+01B8, U+04E0, U+0452, U+045B. Replaced accented characters in
+	  the Cyrillic region with references.
+
+2006-01-20 23:37 +0000 [r451]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd: Deleted spurious glyphs in the control code
+	  area.
+
+2006-01-20 23:27 +0000 [r450]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd: added U+0255, U+0264, U+0277, U+0286, U+029D.
+	  Changed U+0261.
+
+2006-01-19 22:00 +0000 [r449]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd: replaced Hardip Pannu Singh's Gurmukhi with
+	  AnmolUni by Kulbir Singh Thind.
+
+2006-01-17 22:10 +0000 [r448]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd: *
+	  FreeSansBold.sfd: Added U+018D, U+0194, U+01B5, U+01B6,
+	  U+01BE, U+0262, U+02A2.
+
+2006-01-17 14:07 +0000 [r447]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd: *
+	  FreeSansBold.sfd: Changed U+0261 in order to distinguish it
+	  from U+0067. Changed U+0251, U+0252.
+
+2006-01-17 13:26 +0000 [r446]  peterlin:
+
+	* ChangeLog,
+	  FreeSerifBoldItalic.sfd: *
+	  FreeSerifBold.sfd: Small changes in the Cyrillic section.
+	  Added U+0183, U+018C.
+
+2006-01-17 10:18 +0000 [r445]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd: Added U+2045, U+2046.
+
+2006-01-17 10:02 +0000 [r444]  peterlin:
+
+	* AUTHORS, ChangeLog,
+	  CREDITS, FreeSansBold.sfd: *
+	  FreeSansBold.sfd: Filled in the Gurkmukhi part with the
+	  AnmolUni-Bold by Kulbir Singh Thind. Also some minor corrections
+	  in the Cyrillic part. * CREDITS: Added Kulbir Singh Thind. *
+	  AUTHORS: Added Kulbir Singh Thind.
+
+2006-01-14 18:09 +0000 [r443]  peterlin:
+
+	* AUTHORS, ChangeLog,
+	  CREDITS, FreeSerif.sfd: *
+	  FreeSerif.sfd: Thomas Ridgeway's Tamil characters replaced by
+	  the ones released by the Samyak font project. * CREDITS: Added
+	  Pravin Satpute, Bageshri Salvi, Rahul Bhalerao and Sandeep
+	  Shedmake * AUTHORS: Added Pravin Satpute, Bageshri Salvi, Rahul
+	  Bhalerao and Sandeep Shedmake
+
+2006-01-08 14:12 +0000 [r442]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd,
+	  FreeMonoBoldOblique.sfd: FreeSansBold.sfd,
+	  FreeMonoBoldOblique.sfd: minor changes
+
+2006-01-05 22:18 +0000 [r441]  peterlin:
+
+	* ChangeLog: Noted moyogo's modifications in
+	  ChangeLog as well.
+
+2006-01-05 16:12 +0000 [r440]  moyogo:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: added cedi sign
+	  U+20B5, Ghanaian currency
+
+2006-01-05 15:55 +0000 [r439]  moyogo:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: added cedi sign U+20B5,
+	  Ghanaian currency
+
+2006-01-05 15:44 +0000 [r438]  moyogo:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: added cedi sign
+	  U+20B5, Ghanaian currency
+
+2005-12-29 14:39 +0000 [r437]  peterlin:
+
+	* ChangeLog, FreeSans.sfd:
+	  FreeSans.sfd: minor cleanup in the Gujarati part.
+
+2005-12-22 12:46 +0000 [r436]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd: Devanagari and Gujarati parts cleared; once
+	  again merged with Gargi 1.9 and Padmaa 0.6, this time correctly
+	  so that the anchor points survived the merger.
+
+2005-12-16 15:48 +0000 [r435]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd:
+	  FreeSansBold.sfd: added U+0577.
+
+2005-12-15 09:26 +0000 [r434]  peterlin:
+
+	* ChangeLog, FreeSans.sfd,
+	  FreeSansBold.sfd: * FreeSans.sfd: added
+	  U+0559, U+055F, U+2024. * FreeSansBold.sfd: added U+056E,
+	  U+0573.
+
+2005-12-14 10:07 +0000 [r433]  peterlin:
+
+	* AUTHORS, ChangeLog,
+	  CREDITS, FreeSans.sfd: *
+	  FreeSans.sfd: Merged with Gargi 1.9 and Padmaa 0.6, courtesy
+	  Monika Shah and Sonali Sonania from C-DAC, Mumbai. * CREDITS:
+	  Added Monika Shah and Sonali Sonania. * AUTHORS: Added Monika
+	  Shah and Sonali Sonania.
+
+2005-12-13 13:34 +0000 [r432]  peterlin:
+
+	* ChangeLog, FreeSans.sfd,
+	  FreeSerif.sfd: * FreeSans.sfd - Removed
+	  Sinhala glyphs. * FreeSerif.sfd - Added Sinhala glyphs,
+	  formerly in FreeSans.
+
+2005-12-09 10:04 +0000 [r431]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd: added U+20AF, U+211E. Changed U+20AC (EURO
+	  SIGN)
+
+2005-12-09 09:34 +0000 [r430]  peterlin:
+
+	* ChangeLog,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: * FreeSerifBold.sfd:
+	  added more glyphs from Txfonts to the Arrows and Mathematical
+	  Symbols ranges. * FreeSerifBoldItalic.sfd: added U+03F5 from
+	  Txfonts.
+
+2005-12-09 08:54 +0000 [r429]  peterlin:
+
+	* tools/freefont-ttf.spec (added): Specification
+	  file for building a RPM package, courtesy Rok Papez.
+
+2005-12-08 14:58 +0000 [r428]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd: *
+	  FreeSans.sfd: added U+0567, U+056A, U+056C, U+0582.
+
+2005-12-08 14:19 +0000 [r427]  peterlin:
+
+	* ChangeLog, FreeSerifBold.sfd: *
+	  FreeSerifBold.sfd: copied Box Drawing range from FreeSans.
+
+2005-12-08 13:13 +0000 [r426]  peterlin:
+
+	* ChangeLog, FreeSerifBold.sfd: *
+	  FreeSerifBold.sfd: added glyphs from Txfonts to the Arrows
+	  and Mathematical Symbols ranges.
+
+2005-12-08 09:59 +0000 [r425]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd: added U+2259-225A, U+22BA, U+2308-230B,
+	  U+2322-2323. Cyrillic composite characters replaced with
+	  references.
+
+2005-12-07 23:30 +0000 [r424]  peterlin:
+
+	* ChangeLog, FreeSerifBold.sfd: *
+	  FreeSerifBold.sfd: added U+025A, U+025D, U+026B, U+029B,
+	  U+02AE, U+02AF, U+02DE.
+
+2005-12-07 22:20 +0000 [r423]  peterlin:
+
+	* ChangeLog, FreeSerifBold.sfd: *
+	  FreeSerifBold.sfd: updated Hebrew part with Drugulin font
+	  from the Culmus project.
+
+2005-12-07 20:54 +0000 [r422]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd: added U+207A-207C, U+208A-208C, U+2215-2216.
+
+2005-12-07 15:12 +0000 [r421]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd: added U+ U+2320 TOP HALF INTEGRAL, U+23AE
+	  INTEGRAL EXTENSION, U+2321 BOTTOM HALF INTEGRAL (bug #13370).
+
+2005-12-06 23:17 +0000 [r420]  peterlin:
+
+	* ChangeLog, FreeSerifBold.sfd: *
+	  FreeSerifBold.sfd: added U+0294-0296, U+02A1-02A2. Started
+	  adding "below" anchors. Performed hinting on characters that were
+	  not hinted "en masse".
+
+2005-12-06 16:02 +0000 [r419]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd: fixed some more metrics problems in the
+	  Extended Greek area; performed hinting on characters that were
+	  not hinted "en masse".
+
+2005-12-06 10:52 +0000 [r418]  peterlin:
+
+	* ChangeLog, Makefile: * Makefile:
+	  clean also signature files.
+
+2005-12-06 09:46 +0000 [r416]  peterlin:
+
+	* ChangeLog, FreeMonoBold.sfd,
+	  FreeMonoBoldOblique.sfd: *
+	  FreeMonoBoldOblique.sfd, FreeMonoBold.sfd: cosmetic
+	  changes; cleaning background of referenced composed characters.
+
+2005-12-05 17:52 +0000 [r415]  teras:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Some changes to the
+	  greek glyphs, mostly having to do with "tonos" (accent)
+
+2005-12-05 16:24 +0000 [r414]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd: minor cosmetic changes.
+
+2005-12-05 15:18 +0000 [r413]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd: adjusted widths of characters in the Extended
+	  Greek range; accents are not any more considerably overhanging on
+	  the left side. Added U+1EDA-1EE3, U+1EE8-1EF1.
+
+2005-12-05 09:03 +0000 [r412]  peterlin:
+
+	* ChangeLog, FreeSans.sfd:
+	  FreeSans.sfd - continued working on Extended Greek range; not
+	  finished yet.
+
+2005-12-03 11:15 +0000 [r411]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd: fixed combined Greek accents (bug #12800).
+	  Width of characters still need to be adjusted as in FreeSerif.
+
+2005-12-03 10:56 +0000 [r410]  peterlin:
+
+	* AUTHORS, ChangeLog,
+	  CREDITS, FreeSerif.sfd: *
+	  FreeSerif.sfd: fixed positions of Greek accents (bug #12798).
+	  * CREDITS: Added Panayotis Katsaloulis. * AUTHORS: Added
+	  Panayotis Katsaloulis.i
+
+2005-12-03 09:25 +0000 [r409]  peterlin:
+
+	* ChangeLog, Makefile: * Makefile:
+	  minor changes; now creating also a tarfile with sfds.
+
+2005-12-01 15:31 +0000 [r408]  peterlin:
+
+	* ChangeLog, FreeSerifItalic.sfd:
+	  * FreeSerifItalic.sfd: added U+0183, U+018C, U+01C0, U+01C1,
+	  U+01C3, U+01E0, U+01E1, U+01F8, U+01F9.
+
+2005-12-01 15:03 +0000 [r407]  peterlin:
+
+	* ChangeLog, Makefile (added): *
+	  Makefile: created a Makefile to assist building.
+
+2005-12-01 15:00 +0000 [r406]  peterlin:
+
+	* ChangeLog, README: README: an
+	  update.
+
+2005-12-01 14:41 +0000 [r405]  peterlin:
+
+	* ChangeLog, COPYING (added): *
+	  COPYING: added GNU General Public License, version 2.
+
+2005-12-01 12:40 +0000 [r404]  peterlin:
+
+	* ChangeLog, tools/GenerateTrueType
+	  (added): * tools/GenerateTrueType: wrote a FontForge script for
+	  conversion to TrueType.
+
+2005-12-01 11:07 +0000 [r403]  peterlin:
+
+	* ChangeLog, FreeSerifItalic.sfd,
+	  FreeSerif.sfd: * FreeSerif.sfd: merged
+	  with SolaimanLipi Bangla OpenType font from www.ekushey.org,
+	  courtesy Solaiman Karim. * FreeSerifItalic.sfd: merged with
+	  SolaimanLipi Bangla OpenType font from www.ekushey.org, slanted
+	  by 15.5 degrees.
+
+2005-12-01 10:15 +0000 [r402]  peterlin:
+
+	* AUTHORS, ChangeLog,
+	  CREDITS, FreeSans.sfd,
+	  FreeSansOblique.sfd: * FreeSans.sfd:
+	  merged with Rupali Bangla OpenType font from www.ekushey.org *
+	  FreeSansOblique.sfd: merged with Rupali Bangla OpenType font
+	  from www.ekushey.org, slanted by 12 degrees. * CREDITS: added
+	  Solaiman Karim * AUTHORS: added Solaiman Karim
+
+2005-11-30 14:42 +0000 [r401]  peterlin:
+
+	* AUTHORS, ChangeLog,
+	  CREDITS, FreeSerif.sfd: *
+	  FreeSerif.sfd: merged with the Rachana Normal. * AUTHORS:
+	  added K.H. Hussain and R. Chitrajan * CREDITS: added K.H. Hussain
+	  and R. Chitrajan
+
+2005-11-23 22:37 +0000 [r400]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd - added U+01A0-01A1, U+01AF-01B0, U+026E,
+	  U+028F, U+0291, U+02A3-02A5, U+031B. Modified U+0198.
+
+2005-11-23 09:08 +0000 [r399]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd - cleaned some background images.
+
+2005-11-22 22:20 +0000 [r398]  peterlin:
+
+	* ChangeLog, FreeSans.sfd,
+	  FreeSansBold.sfd: * FreeSans.sfd,
+	  FreeSansBold.sfd - added U+0263.
+
+2005-11-22 15:51 +0000 [r397]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd - added U+2591-25A1, U+25A3-25A5, U+25AA,
+	  U+25AC.
+
+2005-11-22 09:34 +0000 [r396]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd - added U+2504-250B.
+
+2005-11-21 23:12 +0000 [r395]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd: *
+	  FreeSansBold.sfd - added U+0574, U+0576. Removed overlaps.
+
+2005-11-21 22:47 +0000 [r394]  peterlin:
+
+	* ChangeLog,
+	  FreeSerifBoldItalic.sfd: *
+	  FreeSerifBoldItalic.sfd - applied the sequence suggested by
+	  Werner Lemberg for reducing redundant points. Added a couple of
+	  glyphs in the IPA Extensions region.
+
+2005-11-21 15:49 +0000 [r393]  peterlin:
+
+	* ChangeLog, FreeMono.sfd,
+	  FreeMonoOblique.sfd: * FreeMono.sfd -
+	  corrected positions of some Greek diacritics on page 0x1F. *
+	  FreeMonoOblique.sfd - working on bringing it in sync with
+	  FreeMono.sfd.
+
+2005-11-20 22:56 +0000 [r392]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - added U+02AA-02AC, U+02B0-02B2.
+
+2005-11-19 22:59 +0000 [r391]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd - added U+01B7-01B9, U+0196, U+019A, U+01C3,
+	  U+0224-0225, U+025E, U+029A, U+2422. Changed U+0184-0185, U+0192,
+	  U+01B4, U+0282, U+0284.
+
+2005-11-18 22:44 +0000 [r390]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd - started Box Drawing area.
+
+2005-11-18 09:30 +0000 [r389]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - added U+02EE, U+207F.
+
+2005-11-17 22:06 +0000 [r388]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - removed overlaps in Latin Extended-B and IPA
+	  Extensions ranges.
+
+2005-11-17 12:59 +0000 [r387]  peterlin:
+
+	* ChangeLog, FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: *
+	  FreeMonoOblique.sfd, FreeMonoBold.sfd,
+	  FreeMonoBoldOblique.sfd, FreeSansOblique.sfd,
+	  FreeSansBold.sfd, FreeSansBoldOblique.sfd,
+	  FreeSerifItalic.sfd, FreeSerifBold.sfd,
+	  FreeSerifBoldItalic.sfd - added U+FFFD.
+
+2005-11-17 12:33 +0000 [r386]  peterlin:
+
+	* ChangeLog,
+	  FreeSerifBoldItalic.sfd: *
+	  FreeSerifBoldItalic.sfd - added U+1EDA-1EE3, U+1EE8-1EF1,
+	  U+2190-219B, U+219E-21A8, U+21B9-21BA, U+21C4-21CA, U+21E4-21E5,
+	  U+2669-266F. MES-1 compliant.
+
+2005-11-17 10:43 +0000 [r385]  peterlin:
+
+	* ChangeLog, FreeSerifItalic.sfd:
+	  * FreeSerifItalic.sfd - added U+018B, U+025C, U+0265, U+026F,
+	  U+0279, U+0287, U+028C-028E, U+029E.
+
+2005-11-17 10:23 +0000 [r384]  peterlin:
+
+	* ChangeLog, FreeSerifItalic.sfd:
+	  * FreeSerifItalic.sfd - added glyphs from the Omega project
+	  to Latin Extended-B, IPA Extensions and Greek ranges.
+
+2005-11-17 09:31 +0000 [r383]  peterlin:
+
+	* ChangeLog,
+	  FreeSerifBoldItalic.sfd: *
+	  FreeSerifBoldItalic.sfd - added glyphs from the Omega project
+	  to Latin Extended-B, IPA Extensions and Greek ranges.
+
+2005-11-17 09:09 +0000 [r382]  peterlin:
+
+	* ChangeLog, FreeSerifBold.sfd: *
+	  FreeSerifBold.sfd - added glyphs from the Omega project to
+	  Latin Extended-B, IPA Extensions and Greek ranges.
+
+2005-11-16 23:17 +0000 [r381]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - added a handful of letters in the Latin
+	  Extended-B and IPA Extension ranges from the Omega font
+	  collection.
+
+2005-11-16 22:37 +0000 [r380]  peterlin:
+
+	* ChangeLog, FreeSerifItalic.sfd:
+	  * FreeSerifItalic.sfd - started added accent anchors. Added a
+	  handful of Greek letters from Omega font collection.
+
+2005-11-16 15:41 +0000 [r379]  peterlin:
+
+	* ChangeLog, FreeSerifItalic.sfd:
+	  * FreeSerifItalic.sfd - applied the sequence suggested by
+	  Werner Lemberg for reducing redundant points
+
+2005-11-16 15:02 +0000 [r378]  peterlin:
+
+	* papers/eurotex2003/freefont.bib,
+	  papers/eurotex2003/freefont.tex: Changed files
+	  sent back by Karl Berry. The text should now exactly match the
+	  paper published in TUGboat 24(2003)545-549.
+
+2005-11-16 14:49 +0000 [r377]  peterlin:
+
+	* ChangeLog, FreeSans.sfd,
+	  FreeSansOblique.sfd: * FreeSansOblique.sfd
+	  - applied the sequence suggested by Werner Lemberg for reducing
+	  redundant points. * FreeSans.sfd - changed U+01A5.
+
+2005-11-16 13:23 +0000 [r376]  moyogo:
+
+	* ChangeLog, FreeSerifItalic.sfd,
+	  FreeSerif.sfd: fixed latin gamma and baby
+	  gamma in Serif; added Ezhes variations to SerifItalic
+
+2005-11-16 12:50 +0000 [r375]  peterlin:
+
+	* ChangeLog, FreeMonoOblique.sfd:
+	  * FreeMonoOblique.sfd - applied the sequence suggested by
+	  Werner Lemberg for reducing redundant points. Added U+F6BE.
+
+2005-11-16 12:28 +0000 [r374]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - added U+0255, U+025A, U+025D, U+025F,
+	  U+0262-0263, U+026B-026C, U+0274, U+0276-0277, U+028F, U+0291,
+	  U+029D.
+
+2005-11-16 10:36 +0000 [r373]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - replaced Greek letters with references, where
+	  applicable. Added U+03D7, U+03F0-03F2.
+
+2005-11-16 09:39 +0000 [r372]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd - Made small Greek letters the same height as
+	  Latin and Cyrillic ones and replaced them with references, where
+	  applicable.
+
+2005-11-15 23:09 +0000 [r371]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd - applied the sequence suggested by Werner
+	  Lemberg for reducing redundant points. Replaced accented glyphs
+	  in the Latin-1 and Latin Extended-A areas with references. Made
+	  capital Greek letters the same height as Latin and Cyrillic ones
+	  and replaced them with references, where applicable.
+
+2005-11-15 19:21 +0000 [r370]  moyogo:
+
+	* ChangeLog, FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: fixed U+026A, to
+	  prevent confusion with U+0069 when accented
+
+2005-11-15 12:18 +0000 [r369]  peterlin:
+
+	* ChangeLog, FreeMonoBold.sfd,
+	  FreeMonoBoldOblique.sfd: *
+	  FreeMonoBold.sfd - corrected Greek tonos (slanted instead of
+	  a vertical line). * FreeMonoBoldOblique.sfd - applied the
+	  sequence suggested by Werner Lemberg for reducing redundant
+	  points. Replaced accented glyphs in the Latin-1 and Latin
+	  Extended-A areas with references.
+
+2005-11-14 23:20 +0000 [r368]  peterlin:
+
+	* ChangeLog, FreeMonoBold.sfd: *
+	  FreeMonoBold.sfd - applied the sequence suggested by Werner
+	  Lemberg for reducing redundant points. Replaced accented glyphs
+	  in the Latin-1 and Latin Extended-A areas with references.
+
+2005-11-14 22:44 +0000 [r367]  peterlin:
+
+	* ChangeLog, FreeMono.sfd: *
+	  FreeMono.sfd - applied the sequence suggested by Werner
+	  Lemberg for reducing redundant points. Replaced accented glyphs
+	  in the Greek and Cyrillic areas with references.
+
+2005-11-14 13:43 +0000 [r366]  peterlin:
+
+	* ChangeLog,
+	  FreeSansBoldOblique.sfd: *
+	  FreeSansBoldOblique.sfd - added U+0180, U+0184, U+0185,
+	  U+0195, U+01A0-01A2, U+01AF-01B0, U+025E, U+026E, U+0292,
+	  U+0294-0296, U+029A, U+02A1, U+2126-2127, U+2190-219B,
+	  U+219E-21A8, U+21C4-21CA, U+2669-266F. MES-1 compliant.
+
+2005-11-14 12:55 +0000 [r365]  peterlin:
+
+	* ChangeLog,
+	  FreeSansBoldOblique.sfd: *
+	  FreeSansBoldOblique.sfd - applied the sequence suggested by
+	  Werner Lemberg for reducing redundant points. Replaced accented
+	  glyphs in the Latin-1 area with references.
+
+2005-11-14 09:07 +0000 [r364]  peterlin:
+
+	* ChangeLog, FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Added 2005 in
+	  copyright info.
+
+2005-11-13 23:19 +0000 [r363]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: * FreeSerif.sfd -
+	  applied the sequence suggested by Werner Lemberg for reducing
+	  redundant points. * FreeSansBold.sfd - added U+219A, U+219B,
+	  U+2669-266F. * FreeSerifBold.sfd - added U+2669-266F.
+
+2005-11-12 22:31 +0000 [r362]  peterlin:
+
+	* ChangeLog, FreeSerifBold.sfd: *
+	  FreeSansBold.sfd - added U+0180, U+0181, U+0183, U+0187,
+	  U+0188, U+018A, U+018C, U+018D, U+0193, U+019C, U+01A0, U+01A1,
+	  U+01AC, U+01AF, U+01B0, U+025C, U+0260, U+026E, U+0277, U+0281,
+	  U+0284.
+
+2005-11-11 22:50 +0000 [r361]  peterlin:
+
+	* ChangeLog, FreeSerifBold.sfd: *
+	  FreeSerifBold.sfd - applied the sequence for reducing
+	  redundant points, suggested by Werner Lemberg. Added U+01A5,
+	  U+02A0, U+2190-219B, U+219E-21A8, U+21B8, U+21B9, U+21C4-21CA,
+	  U+21E4, U+21E5.
+
+2005-11-11 15:52 +0000 [r360]  peterlin:
+
+	* ChangeLog, FreeMono.sfd: *
+	  FreeMono.sfd - corrected Greek letters (using tonos instead
+	  of a vertical line). Added U+026E, U+F6BE. Accented characters in
+	  Latin 1, Latin Extended A and partly Latin Extended B replaced by
+	  references.
+
+2005-11-11 15:03 +0000 [r359]  peterlin:
+
+	* ChangeLog, FreeMono.sfd: *
+	  FreeMono.sfd - applied the sequence for reducing redundant
+	  points, suggested by Werner Lemberg.
+
+2005-11-11 10:40 +0000 [r358]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd: *
+	  FreeSansBold.sfd - added U+195, U+1A6, U+025E, U+026E,
+	  U+029A, U+0313, U+0314, U+0342, U+0344, U+0345. Started adding
+	  accent anchors.
+
+2005-11-10 22:56 +0000 [r357]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd: *
+	  FreeSansBold.sfd - replaced glyphs with references in the
+	  Cyrillic area. Removed U+04A8, U+04A9. Added U+04C5, U+04C6,
+	  U+04C9, U+04CA, U+04CD, U+04CE, U+0535, U+053F, U+0546, U+0565,
+	  U+0584, U+0587, U+0589.
+
+2005-11-10 22:11 +0000 [r356]  peterlin:
+
+	* ChangeLog, FreeSansOblique.sfd:
+	  * FreeSansOblique - changed U+0192, U+01A5; added
+	  U+01C0-01C3.
+
+2005-11-10 17:01 +0000 [r355]  moyogo:
+
+	* ChangeLog, FreeSans.sfd,
+	  FreeSansOblique.sfd: added a couple of IPA
+	  characters to FreeSans and FreeSansOblique
+
+2005-11-10 15:53 +0000 [r354]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd: *
+	  FreeSansBold.sfd - applied the sequence for reducing
+	  redundant points, suggested by Werner Lemberg. Added
+	  automatically constructed accented characters in page 0x1E.
+
+2005-11-10 13:28 +0000 [r353]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd: *
+	  FreeSansBold.sfd - added U+00A0, U+00AD, U+0531, U+2126,
+	  U+2190-2199, U+219E-21A8, U+21C4-21CA.
+
+2005-11-10 10:07 +0000 [r352]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - added U+01A6. Simplified outlines in the
+	  ASCII range.
+
+2005-11-09 22:42 +0000 [r351]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - added U+0184, U+0185, U+018D, U+0195, U+0197,
+	  U+019A, U+019B, U+01A0, U+01A1, U+01AC, U+01B5, U+01B6, U+01C0,
+	  U+01C1, U+01C3, U+01F6, U+0294-0296, U+1E9A, U+1EDA-1EE3,
+	  U+1EE8-1EF1.
+
+2005-11-09 15:41 +0000 [r350]  peterlin:
+
+	* ChangeLog, FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd: *
+	  FreeSerifItalic.sfd - changed U+03D5. *
+	  FreeSerifBoldItalic.sfd - changed U+03C6; added U+2070,
+	  U+2075-2079, U+207F, U+2080, U+2085-2089, U+2155-217F.
+
+2005-11-09 14:32 +0000 [r349]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd - added U+1EA2, U+1EA3, U+1EA8, U+1EA9, U+1EB2,
+	  U+1EB3, U+1EBA, U+1EBB, U+1EC2, U+1EC3, U+1EC8, U+1EC9, U+1ECE,
+	  U+1ECF, U+1ED4, U+1ED5, U+1EE6, U+1EE7, U+1EF6, U+1EF7, U+220A,
+	  U+220B, U+220D, U+2272, U+2273, U+2282, U+2283.
+
+2005-11-09 12:57 +0000 [r348]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - added U+0183, U+018C.
+
+2005-11-07 21:00 +0000 [r347]  peterlin:
+
+	* FreeSansBold.sfd: FreeSansBold.sfd - added
+	  U+0562, U+056D. U+0575.
+
+2005-11-07 11:39 +0000 [r346]  peterlin:
+
+	* ChangeLog, FreeMono.sfd: *
+	  FreeSansBold.sfd - added U+0562, U+056D. U+0575. *
+	  FreeMono.sfd - added U+0589.
+
+2005-11-06 22:20 +0000 [r345]  peterlin:
+
+	* ChangeLog, FreeMono.sfd,
+	  FreeMonoBold.sfd: * FreeMono.sfd - added
+	  U+2227, U+2228, U+2262. Corrected U+2299-229D in response to bug
+	  report http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276121 *
+	  FreeMonoBold.sfd - added U+2010, U+2012 in response to bug
+	  report http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=289032
+	  Swapped U+03C6 (Greek small letter phi) and U+03D5 (Greek phi
+	  symbol) in order to conform to Unicode standard. Simplified glyph
+	  shapes in ASCII range. Started adding "above" and "below"
+	  anchors.
+
+2005-11-06 20:47 +0000 [r344]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd - added U+0278, U+03D5, U+2248. Corrected
+	  U+2071, U+222E, U+2242, U+2243 in response to bug reports
+	  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276118
+	  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276120
+
+2005-11-05 23:18 +0000 [r343]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - accented letters in Latin Extended-A replaced
+	  by references wherever possible. * FreeSerif.sfd - added
+	  U+0180, U+0181, U+0187, U+0188, U+018A, U+0193, U+019C, U+01A4,
+	  U+01A5, U+01A7, U+01A8, U+01AF, U+01B0, U+026E, U+0270, U+0278,
+	  U+0280, U+0281, U+028B, U+0299, U+029C, U+029F.
+
+2005-11-03 09:32 +0000 [r342]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd:
+	  FreeSansBold.sfd - cleaner Arabic outlines. Added U+01E4,
+	  U+01E5.
+
+2005-11-02 23:25 +0000 [r341]  peterlin:
+
+	* ChangeLog, FreeSans.sfd,
+	  FreeSansBold.sfd: * FreeSansBold.sfd -
+	  added U+0180, U+0184, U+0185, U+0192, U+019B, U+01A0-01A2,
+	  U+01AF, U+01B0, U+01EE, U+01EF, U+0292, U+0294-0296, U+02A1,
+	  U+0532, U+054C, U+057C, U+222B. Changed U+014B, U+01A5, U+01B4,
+	  U+03BB. * FreeSans.sfd - added U+04C5, U+04C6, U+04C9,
+	  U+04CA, U+04D, U+04CE.
+
+2005-11-02 09:52 +0000 [r340]  peterlin:
+
+	* ChangeLog, FreeMono.sfd: *
+	  FreeMono.sfd - swapped U+03C6 (Greek small letter phi) and
+	  U+03D5 (Greek phi symbol) in order to conform to Unicode
+	  standard. Added U+04C5, U+04C6, U+04C9, U+04CA, U+04D, U+04CE.
+
+2005-11-02 09:11 +0000 [r339]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd: *
+	  FreeSansBold.sfd - started Armenian; added U+0538, U+0542,
+	  U+0544, U+0548, U+054D, U+054F, U+0550, U+0553, U+0555, U+0561,
+	  U+0563, U+0564, U+0566, U+0568 U+056B, U+056F, U+0570, U+0572,
+	  U+0578, U+057A, U+057D-057F, U+0580, U+0581, U+0583, U+0585.
+
+2005-11-01 22:12 +0000 [r338]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd: *
+	  FreeSansBold.sfd - modified U+019C. *
+	  FreeSansBoldOblique.sfd - added U+00A0, U+00AD, U+019C,
+	  U+01B7, U+01B8, U+0275, U+0278, U+0298, U+2012, U+2015,
+	  U+2070-207F, U+2080-208E, U+2153-217F, U+2213, U+2215.
+
+2005-10-31 11:37 +0000 [r337]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - added U+0199, U+01AB, U+0265, U+0282, U+0288,
+	  U+028C-028E, U+0290, U+029E, U+02A0.
+
+2005-10-28 23:13 +0000 [r336]  peterlin:
+
+	* ChangeLog, FreeSerifBold.sfd:
+	  FreeSerifBold.sfd - added U+0199, U+019B, U+01B8, U+01B9,
+	  U+01BE, U+01C0, U+0262, U+0274, U+0278, U+0280, U+028F, U+0298,
+	  U+0299, U+029C, U+029E, U+029F, U+2012, U+2015, U+2016, U+2129,
+	  U+2217.
+
+2005-10-28 12:20 +0000 [r335]  peterlin:
+
+	* ChangeLog, FreeSerifBold.sfd:
+	  FreeSerifBold.sfd - added U+2070, U+2075-2079, U+2080,
+	  U+2085-2089, U+2153-215E, U+2113-2115, U+2119.
+
+2005-10-28 09:03 +0000 [r334]  peterlin:
+
+	* ChangeLog, FreeSerifBold.sfd:
+	  FreeSerifBold.sfd - added U+019E, U+01AB, U+01AD, U+01B1,
+	  U+0256, U+025F, U+0265, U+0269, U+026F, U+0270, U+0279-027F,
+	  U+0282, U+0287, U+0288, U+028C-028E, U+0290.
+
+2005-10-27 22:26 +0000 [r333]  peterlin:
+
+	* ChangeLog, FreeSerifBold.sfd:
+	  FreeSerifBold.sfd - added U+018B, U+018E, U+018F, U+0191,
+	  U+019D, U+01A7, U+01A8, U+01AE, U+0253, U+0266, U+0267, U+026A,
+	  U+0271-0273, U+0283, U+0285.
+
+2005-10-27 14:28 +0000 [r332]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd:
+	  FreeSansBold.sfd - added subscripts and superscripts
+	  (U+2070-208F), completed fractions (U+2152-215F) and Roman
+	  numerals (U+2160-217F).
+
+2005-10-27 13:44 +0000 [r331]  peterlin:
+
+	* ChangeLog, FreeSerifItalic.sfd:
+	  FreeSerifItalic.sfd - minor cleanup in the superscript range
+	  (U+2070-2079).
+
+2005-10-27 09:42 +0000 [r330]  peterlin:
+
+	* ChangeLog, FreeSans.sfd:
+	  FreeSans.sfd - added U+018D, U+0194, U+019B, U+019C, U+01B5,
+	  U+01B6, U+0295, U+0296, U+029B, U+02A2, U+0472, U+0473, U+2114,
+	  U+2119.
+
+2005-10-26 21:31 +0000 [r329]  peterlin:
+
+	* ChangeLog, FreeSans.sfd:
+	  FreeSans.sfd - Added U+01C0-01C2, U+0276, U+0292, U+0298.
+	  Changed U+0251, U+0294, U+02A1.
+
+2005-10-26 14:45 +0000 [r328]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd: *
+	  FreeSansBold.sfd - Added U+2010-2012, U+2015, U+2032, U+203C,
+	  U+2047-2049.
+
+2005-10-26 13:56 +0000 [r327]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd: *
+	  FreeSansBold.sfd - added U+0278, U+0298. Cleaned up outlines
+	  of most Greek letters.
+
+2005-10-26 12:52 +0000 [r326]  peterlin:
+
+	* ChangeLog, FreeMono.sfd: *
+	  FreeMono.sfd - a try to imitate Denis' work on adding anchors
+	  by adding "above" anchor to a couple of basic Latin characters.
+
+2005-10-26 11:57 +0000 [r325]  peterlin:
+
+	* ChangeLog, FreeMono.sfd:
+	  FreeMono.sfd - added U+2011, U+2012, U+203B, U+204A, U+2071,
+	  U+2129, U+2232, U+2233. Changed and/or corrected U+2106, U+211E,
+	  U+2126, U+2127, U+2153-215F, U+2202.
+
+2005-10-26 08:18 +0000 [r324]  peterlin:
+
+	* ChangeLog, FreeSans.sfd: *
+	  FreeSans.sfd - added "above" anchors to selected Cyrillic
+	  characters. Added U+0294, U+02A1.
+
+2005-10-25 14:29 +0000 [r323]  peterlin:
+
+	* ChangeLog, FreeSansOblique.sfd:
+	  FreeSansOblique.sfd - added U+00A0, U+2011-2012, U+2015,
+	  U+2070, U+2071, U+2074-2079, U+2080-2089, U+2126, U+2153-215F,
+	  U+2190-2195, U+2215, U+266A. FreeSansOblique is now MES-1
+	  compliant.
+
+2005-10-25 14:00 +0000 [r322]  peterlin:
+
+	* ChangeLog, FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoBold.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd:
+	  FreeSansOblique.sfd, FreeSans.sfd, FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd, FreeMonoBoldOblique.sfd,
+	  FreeMonoBold.sfd, FreeSerifItalic.sfd,
+	  FreeSerifBold.sfd FreeSerifBoldItalic.sfd - brought in
+	  sync with Valek Filipov's urw-fonts-1.0.7pre41
+
+2005-10-25 12:13 +0000 [r321]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - added U+019E, U+01AD, U+01B8, U+01B9, U+0253,
+	  U+0256, U+0257, U+025C, U+0260, U+0266, U+0267, U+0269, U+026D,
+	  U+0271-0273, U+0279-027D.
+
+2005-10-25 09:53 +0000 [r320]  peterlin:
+
+	* ChangeLog,
+	  FreeSerifBoldItalic.sfd:
+	  FreeSerifBoldItalic.sfd - added U+00A0, U+00AD, U+2010-2012,
+	  U+2015, U+2032-2034, U+203C, U+2047-204A, U+2074, U+2081-2084,
+	  U+2126, U+2153, U+2154, U+215F, U+2215. Corrected positions of
+	  diacritics on U+0200-0217.
+
+2005-10-25 09:06 +0000 [r319]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - added U+0191, U+019D, U+01AE, U+027E, U+027F,
+	  U+0283, U+0285.
+
+2005-10-25 08:12 +0000 [r318]  peterlin:
+
+	* ChangeLog, FreeSerifItalic.sfd:
+	  FreeSerifItalic.sfd - added U+00A0, U+00AD, U+2010-2012,
+	  U+2015, U+2126, U+2127, U+2153-215E, U+2160-217F, U+2190-2193,
+	  U+2669-266F. FreeSerifItalic is now MES-1 compliant.
+
+2005-10-24 19:34 +0000 [r317]  moyogo:
+
+	* ChangeLog, FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: added ccmp feature
+	  for i and j to be substituted with dotless i or j when followed
+	  by above diacritic
+
+2005-10-24 15:01 +0000 [r316]  peterlin:
+
+	* ChangeLog, FreeSans.sfd:
+	  FreeSans.sfd - added U+2011, U+2012, U+2015. FreeSans is now
+	  MES-1 conformant.
+
+2005-10-23 12:29 +0000 [r314-315]  moyogo:
+
+	* FreeSans.sfd: added above, below, abovemk and
+	  belowmk anchors for diacritics placement; cleared U+0084
+
+	* ChangeLog, FreeSans.sfd: added
+	  above, below, abovemk and belowmk anchors for diacritics
+	  placement
+
+2005-10-21 12:18 +0000 [r313]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - added U+02B9, U+02BA, U+02CD, U+2017, U+2036,
+	  U+2037, U+203C, U+203E, U+2047-204A.
+
+2005-10-20 12:04 +0000 [r312]  peterlin:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - added U+00A0, U+00AD, U+0182, U+0189, U+018B,
+	  U+018E, U+018F, U+0192, U+019F, U+01A9, U+01B1, U+01B7, U+01DD,
+	  U+2010-2013, U+2015. FreeSerif is now MES-1 conformant.
+
+2005-10-20 11:13 +0000 [r311]  peterlin:
+
+	* ChangeLog, FreeSerifBold.sfd: *
+	  FreeSerifBold.sfd - added U+0182, U+0189, U+0192, U+019F,
+	  U+01A9, U+01B7, U+01C4-01CC, U+01E0-1E2, U+01F0-01F3, U+F6BE.
+	  Corrected position of diacritics on U+0200-0217.
+
+2005-10-19 13:03 +0000 [r310]  moyogo:
+
+	* ChangeLog, FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: * FreeSerif.sfd - added
+	  U+0268, U+026A, U+0289, U+0292; and anchor "above" to more base
+	  glyphs. * FreeSerifBold.sfd, FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd - added U+0250-0252, U+0258-0259,
+	  U+0261, U+0268, U+026A, U+0279, U+0289 * FreeSerifBold.sfd -
+	  added anchor "above" to marks U+0300-0314, and to base glyphs
+	  (vowels).
+
+2005-10-18 20:36 +0000 [r309]  moyogo:
+
+	* ChangeLog, FreeSerif.sfd: *
+	  FreeSerif.sfd - added anchor "above" to marks U+0300-0314,
+	  and bases vowel of the U+0041-007A range, U+00E6, U+0186, U+0190,
+	  U+0254 and U+025B; fixed Latin-1 Supplement block accented glyphs
+	  to use references.
+
+2005-10-17 09:25 +0000 [r308]  peterlin:
+
+	* ChangeLog, FreeSansBold.sfd:
+	  FreeSansBold.sfd - added U+01B7, U+01B8, U+0275.
+
+2005-10-16 18:06 +0000 [r307]  moyogo:
+
+	* ChangeLog, FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: * FreeSans.sfd,
+	  FreeSansOblique.sfd - added some Latin Extended-B African
+	  letters: U+0181, U+018A, U+0197-0198, U+01A4, U+01AC, U+01B1,
+	  U+01B3-01B4; * FreeSansBold.sfd, FreeSansBoldOblique.sfd
+	  - added Latin Extended-B U+0187, 018E-018F, U+0191, U+0193,
+	  U+0197-0199, U+019D-019F, U+01AB-01AE; correcting width of
+	  non-space Combining Diacrtical Marks; added more glyphs to IPA
+	  Extensions to match non Bold * FreeSansBoldOblique.sfd -
+	  added many accented glyphs
+
+2005-10-15 20:59 +0000 [r306]  moyogo:
+
+	* ChangeLog, FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: * FreeSans.sfd,
+	  FreeSansOblique.sfd - added IPA Extensions
+	  U+0262,U+0274,U+0280-0281, U+0299, U+029F, and Spacing Modifier
+	  Letters U+02C9-02CB; fixed U+0287,029E height to baseline; added
+	  stroke to U+0268 * FreeSansOblique.sfd - fixed skew on U+027F
+	  * FreeSansBold.sfd, FreeSansBoldOblique.sfd - added to
+	  Latin Extended-B U+01A7-01A8, IPA Extensions U+0251-0253,
+	  U+0256-0257, U+0261, U+0265-026A, U+026F-0273, U+0289,
+	  U+028C-028E * FreeSansBoldOblique.sfd - added to Latin
+	  extended-B U+0189, U+01A8, U+01B1, U+0283, U+02C9 and Spacing
+	  Modifiers U+02C9-02CB
+
+2005-10-14 13:47 +0000 [r304-305]  peterlin:
+
+	* ChangeLog: FreeSansBold.sfd - Added a couple
+	  of composite glyphs, mostly in the IPA and Latin Extended B
+	  ranges.
+
+	* FreeSansBold.sfd: Added a couple of composite
+	  glyphs, mostly in the IPA and Latin Extended B ranges.
+
+2005-10-13 17:58 +0000 [r303]  moyogo:
+
+	* ChangeLog, FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: * FreeSans.sfd -
+	  removed overlap and simplified U+0187, 0191, 0193, 01A5, 01AE,
+	  0260, 0271, 0272, 0273, 027B; fixed diacritics placement on
+	  U+0200-0217; fixed glyph for U+0283 to correct esh without
+	  stroke; added U+025F and fixed U+025F from it; fixed height of
+	  glyph at U+0285; arranged U+027E,027F to make more
+	  distinguishable from U+0072. * FreeSansOblique.sfd - added the
+	  corrected or new glyphs from FreeSans; diacritics on U+200-0217
+	  will need height readjustements. * FreeSansBold.sfd,
+	  FreeSansBoldOblique - added U+0186, 0190, 0250, 0254, 0258, 0259,
+	  025B, 025C
+
+2005-10-13 15:00 +0000 [r302]  moyogo:
+
+	* FreeSerifBoldItalic.sfd: fixed open o, U+0254,
+	  that was left unturned
+
+2005-10-13 12:51 +0000 [r299-301]  peterlin:
+
+	* FreeSerifItalic.sfd: Added glyphs
+	  U+222B-U+222F, U+2320, U+2321. Fixed diacritics on U+0200-U+0217.
+
+	* AUTHORS, ChangeLog,
+	  CREDITS: Added Denis Jacquerye.
+
+	* FreeSerif.sfd: Minor changes: U+22A2, U+22A3,
+	  U+22A6, U+23AE. Added U+0250, U+0251, U+0258, U+0259, U+0275.
+
+2005-10-13 05:58 +0000 [r298]  moyogo:
+
+	* ChangeLog, FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: 2005-10-12 Denis Jacquerye
+	  <moyogo@gmail.com> * FreeSerif.sfd - Corrected diacritics
+	  position on U+01D5-01D9,01DB,01EA-01ED,0200-0217 and U+022A. *
+	  FreeSerif.sfd, FreeSerifBold.sfd,
+	  FreeSerifItalic.sfd, FreeSerifBoldItalic.sfd - added
+	  U+0186,0190,0254 and U+025B.
+
+2005-10-11 15:11 +0000 [r297]  peterlin:
+
+	* FreeSerif.sfd: Attempt to correct bug #13370:
+	  INTEGRAL EXTENSION does not align with TOP/BOTTOM HALF INTEGRAL;
+	  added glyph U+23AE.
+
+2005-10-11 14:33 +0000 [r296]  peterlin:
+
+	* FreeSerif.sfd: Fixed bug #13399 (glyphs for
+	  U+0360 and U+0361 swapped).
+
+2005-05-16 14:33 +0000 [r295]  peterlin:
+
+	* ChangeLog, FreeMono.sfd:
+	  Corrected shapes for Cross of Lorraine and Cross of Jerusalem.
+
+2005-04-07 13:45 +0000 [r294]  peterlin:
+
+	* notes (added),
+	  notes/maintenance.txt (added): Some basic notes
+	  how things work with Savannah.
+
+2005-04-07 13:25 +0000 [r292-293]  peterlin:
+
+	* FreeSansBold.sfd: Added some combining
+	  accents, just to test a new version of FontForge.
+
+	* ChangeLog: Minor change to FreeSansBold.
+
+2003-11-18 16:26 +0000 [r291]  peterlin:
+
+	* FreeSans.sfd: Started to apply Josef Segur's
+	  patch.
+
+2003-10-08 12:22 +0000 [r290]  peterlin:
+
+	* AUTHORS, ChangeLog: Added Abbas
+	  Izad.
+
+2003-10-08 12:18 +0000 [r289]  peterlin:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeMonoOblique.sfd: Applied Josef Segur's
+	  corrections from Oct. 5.
+
+2003-10-04 17:51 +0000 [r288]  peterlin:
+
+	* FreeSerif.sfd: A rather naive composition of
+	  Arabic "accented" charachers, based on the work of Abbas Izad.
+
+2003-10-02 20:54 +0000 [r286-287]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeSerif.sfd: Abbas Izad's contributed
+	  Arabic/Farsi characters added.
+
+2003-10-02 20:09 +0000 [r284-285]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeSansBoldOblique.sfd: Combining chars
+	  corrected (this one escaped the batch).
+
+2003-10-02 19:55 +0000 [r283]  peterlin:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Combining characters
+	  (U+0300 - U+036F) moved left, so that they have negative
+	  horizontal values and zero advance width.
+
+2003-09-15 09:23 +0000 [r282]  peterlin:
+
+	* FreeSerifItalic.sfd: Super- and subscripts
+	  added. Those copied from Free Serif regular (0,5-9) seem a bit
+	  heavier to me than 1-4 designed specially for italic. Might
+	  require a further adjustment. :
+	  ----------------------------------------------------------------------
+
+2003-09-15 09:08 +0000 [r281]  peterlin:
+
+	* FreeSerifItalic.sfd: Started working on super-
+	  and subscripts.
+
+2003-09-15 08:36 +0000 [r280]  peterlin:
+
+	* FreeSerifBold.sfd: Started working on super-
+	  and subscripts.
+
+2003-09-12 14:12 +0000 [r279]  peterlin:
+
+	* FreeSerif.sfd: Added three Hiragana characters
+	  (U+3094, U+3099 and U+309B) and 6 Katakana characters
+	  (U+30F4-U+30FC).
+
+2003-09-12 13:53 +0000 [r278]  peterlin:
+
+	* FreeSansBold.sfd: Cleared background
+	  characters in Latin Extended-A. Added some automatically
+	  constructed characters in Latin Extended-B. Started with
+	  superscripts and subscripts.
+
+2003-09-12 12:53 +0000 [r277]  peterlin:
+
+	* FreeSans.sfd: Subscript numerals
+	  (U+2080-U+2089) completed.
+
+2003-09-12 12:40 +0000 [r276]  peterlin:
+
+	* FreeSans.sfd: Upgraded Pfaedit to 030827. Two
+	  Hiragana characters (U+3099, U+309B) and 8 Katakana characters
+	  (U+30F7-U+30FE) added.
+
+2003-06-02 05:34 +0000 [r275]  teras:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Basic ancient greek
+	  support
+
+2003-05-22 19:35 +0000 [r274]  teras:
+
+	* FreeSansBold.sfd: Basic ancient greek support
+
+2003-05-22 18:05 +0000 [r273]  teras:
+
+	* FreeSans.sfd: Basic ancient greek support
+
+2003-05-19 08:18 +0000 [r272]  peterlin:
+
+	* ChangeLog: Upload.
+
+2003-05-19 08:15 +0000 [r271]  peterlin:
+
+	* FreeSerifItalic.sfd: Improved control point
+	  positioning on Thai character fongman. Actually, Thai needs some
+	  work here...
+
+2003-05-19 08:09 +0000 [r270]  peterlin:
+
+	* FreeSerif.sfd: Thai letters bo baimai and po
+	  pla swapped; Thai character fongman corrected, all courtesy
+	  Theppitak Karoonboonyanan.
+
+2003-05-19 07:45 +0000 [r269]  peterlin:
+
+	* ChangeLog: Update.
+
+2003-05-17 00:55 +0000 [r268]  teras:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Full support of all ancient
+	  greek glyphs
+
+2003-05-16 09:41 +0000 [r267]  peterlin:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSansBold.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Saved in a new SFD
+	  format with a new version of PfaEdit.
+
+2003-05-15 12:15 +0000 [r266]  peterlin:
+
+	* ChangeLog: Mentioned KerningNumerals.pl.
+
+2003-05-15 12:07 +0000 [r265]  peterlin:
+
+	* ChangeLog: Update.
+
+2003-05-15 12:04 +0000 [r263-264]  peterlin:
+
+	* tools/KerningNumerals.pl: Now doing the new-style
+	  kerning information (KernsSLIF) as well.
+
+	* FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Oops! It's KernsSLIF,
+	  not Kerns. Corrected.
+
+2003-05-15 11:58 +0000 [r262]  peterlin:
+
+	* FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Completed moving
+	  kerning information from ASCII numerals to kerned numerals in the
+	  Adobe corporate use area (U+F6xx).
+
+2003-05-15 10:32 +0000 [r261]  peterlin:
+
+	* FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Automatically moved
+	  kerning information from ASCII numerals with the
+	  KerningNumerals.pl script.
+
+2003-05-15 10:27 +0000 [r259-260]  peterlin:
+
+	* FreeSansBold.sfd: Automatically moved kerning
+	  information with the KerningNumerals.pl script.
+
+	* tools/KerningNumerals.pl (added): A Perl script
+	  for moving kerning information from ASCII numerals (U+0030...) to
+	  characters in the Adobe corporate use area (U+F6xx).
+
+2003-05-14 12:10 +0000 [r258]  peterlin:
+
+	* ChangeLog: Update
+
+2003-05-14 12:00 +0000 [r257]  peterlin:
+
+	* FreeSans.sfd: First approximation of super-
+	  and subscript numerals and vulgar fractions.
+
+2003-05-14 10:00 +0000 [r256]  peterlin:
+
+	* ChangeLog: Update.
+
+2003-05-14 09:57 +0000 [r255]  peterlin:
+
+	* FreeSerif.sfd: Super- and subscript numerals
+	  complete, vulgar fractions completed and redone as references
+	  rather than outlines.
+
+2003-05-12 16:58 +0000 [r253-254]  peterlin:
+
+	* ChangeLog: Update
+
+	* FreeSerif.sfd: Super- and subscripts, vulgar
+	  fractions.
+
+2003-05-12 16:12 +0000 [r251-252]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeSerif.sfd: Rounded to integer.
+
+2003-05-12 15:45 +0000 [r250]  peterlin:
+
+	* FreeSerif.sfd: Cleanup of the Cyrillic letters
+	  added on March 27.
+
+2003-05-09 09:56 +0000 [r249]  peterlin:
+
+	* ChangeLog: Update.
+
+2003-05-09 09:53 +0000 [r248]  peterlin:
+
+	* FreeMonoBold.sfd: Additions in the Latin
+	  Extended-B and IPA Extensions range.
+
+2003-05-08 09:07 +0000 [r246-247]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeSerifBoldItalic.sfd: Added a couple of
+	  characters to the Latin Extended-B area.
+
+2003-05-08 08:37 +0000 [r245]  peterlin:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: ASCII numerals now
+	  monospaced; kerned numerals moved to Adobe corporate use area
+	  (U+F6xx).
+
+2003-05-08 07:47 +0000 [r244]  peterlin:
+
+	* ChangeLog: Update.
+
+2003-05-07 15:56 +0000 [r243]  peterlin:
+
+	* FreeSans.sfd,
+	  FreeSerif.sfd: Roman numerals.
+
+2003-05-07 15:13 +0000 [r242]  peterlin:
+
+	* FreeSans.sfd: Added characters in the Latin
+	  Extended-B range.
+
+2003-05-07 13:56 +0000 [r241]  peterlin:
+
+	* FreeSans.sfd: Added Greek accents.
+
+2003-05-07 13:19 +0000 [r240]  peterlin:
+
+	* FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Automated addition of
+	  accented characters.
+
+2003-05-07 12:57 +0000 [r239]  peterlin:
+
+	* FreeMonoBoldOblique.sfd: Additions in Latin
+	  Extended-B and Basic Greek.
+
+2003-05-07 12:13 +0000 [r237-238]  peterlin:
+
+	* FreeMonoBoldOblique.sfd: Points rounded to
+	  integer values; glyphs simplified.
+
+	* FreeMonoBoldOblique.sfd: Cleanup (fixed
+	  widths, clockwise/counter-clockwise corrections etc.)
+
+2003-05-07 11:53 +0000 [r236]  peterlin:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd: Points rounded to integer
+	  values; outlines simplified.
+
+2003-05-07 11:48 +0000 [r234-235]  peterlin:
+
+	* FreeSans.sfd: Rounded to integer and
+	  simplified.
+
+	* FreeSans.sfd: Cleanup (open paths fixed).
+
+2003-05-07 11:40 +0000 [r232-233]  peterlin:
+
+	* FreeMonoOblique.sfd: Kerning pairs removed.
+
+	* FreeMonoOblique.sfd: Cleanup (path direction
+	  etc.)
+
+2003-05-07 10:16 +0000 [r231]  peterlin:
+
+	* FreeMonoBold.sfd: Cleanup
+	  (clockwise/counter-clockwise direction corrected).
+
+2003-05-07 10:01 +0000 [r230]  peterlin:
+
+	* FreeMono.sfd: Major cleanup (fixed widths,
+	  open paths, clockwise/counter-clockwise directions etc.).
+
+2003-05-06 15:54 +0000 [r229]  peterlin:
+
+	* FreeSans.sfd: Proportional numerals don't
+	  really have to be outlines - references are enough. Caught two
+	  remaining numeral kerns, ",1" and ".1". Free Sans is now clean.
+
+2003-05-06 15:39 +0000 [r228]  peterlin:
+
+	* FreeSansBold.sfd: ASCII numerals now
+	  monospaced; kerned numerals moved to Adobe corporate use area
+	  (U+F6xx). Not finished yet - left kerns are done, right only up
+	  to letter C!
+
+2003-05-06 14:39 +0000 [r227]  peterlin:
+
+	* FreeSans.sfd: ASCII numerals now monospaced;
+	  kerned numerals moved to Adobe corporate use area (uniF6xx).
+
+2003-05-06 13:09 +0000 [r226]  peterlin:
+
+	* tools/OS2UnicodeRange (added): A simple script to
+	  display OS/2 Unicode range table in TrueType fonts.
+
+2003-05-06 11:53 +0000 [r225]  peterlin:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Updated years of FSF
+	  copyleft.
+
+2003-05-06 11:36 +0000 [r224]  peterlin:
+
+	* FreeMonoBold.sfd: Minor changes in Latin
+	  Extended-B and IPA Extensions.
+
+2003-04-02 15:54 +0000 [r223]  peterlin:
+
+	* papers (added), papers/eurotex2003
+	  (added), papers/eurotex2003/eurotex2003.cls
+	  (added), papers/eurotex2003/freefont.bib (added),
+	  papers/eurotex2003/freefont.tex (added): Paper for
+	  the EuroTeX 2003 conference, ENST Bretagne, Brest, June 24-27.
+
+2003-03-27 08:40 +0000 [r222]  peterlin:
+
+	* AUTHORS, ChangeLog,
+	  CREDITS: Update.
+
+2003-03-27 08:13 +0000 [r221]  peterlin:
+
+	* FreeSerif.sfd: Cyrillic and Cyrillic
+	  Supplement blocks brought to conformance with Unicode 3.2,
+	  courtesy Daniel Shurovich Chirkov.
+
+2003-03-19 17:31 +0000 [r220]  peterlin:
+
+	* FreeSansOblique.sfd: Synchronized germandbls
+	  (U+00DF) with the one in FreeSans.
+
+2003-03-19 17:17 +0000 [r219]  peterlin:
+
+	* FreeSans.sfd: Made somewhat wider germandbls
+	  (U+00DF). Walter Schmidt brought up this problem with URW fonts
+	  in the tex-fonts list.
+
+2003-03-18 16:38 +0000 [r218]  peterlin:
+
+	* FreeSans.sfd: Added Sinhala glyphs from the
+	  Tipitaka project <http://www.metta.lk>, recoded to Unicode by
+	  Noah Levitt.
+
+2003-02-27 13:56 +0000 [r217]  peterlin:
+
+	* FreeSansBold.sfd: Somewhat "cleaner" glyphs in
+	  the Greek part.
+
+2003-02-24 12:49 +0000 [r216]  peterlin:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: All numerals set to
+	  equal width (556 points).
+
+2003-02-21 16:58 +0000 [r215]  peterlin:
+
+	* FreeSans.sfd: A nicer capital schwa.
+
+2003-02-19 09:35 +0000 [r213-214]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeSans.sfd: Minor changes on mathematics
+	  operators.
+
+2003-02-18 16:57 +0000 [r212]  peterlin:
+
+	* FreeSans.sfd: Added two Tamil signs (virama
+	  and au length mark).
+
+2003-02-18 11:35 +0000 [r211]  peterlin:
+
+	* ChangeLog: Update.
+
+2003-02-18 11:28 +0000 [r210]  peterlin:
+
+	* FreeMono.sfd: Integral signs more in the
+	  spirit of Courier design.
+
+2003-02-18 11:12 +0000 [r209]  peterlin:
+
+	* FreeMono.sfd: Cleaned out some backgrounds.
+
+2003-02-05 15:46 +0000 [r207-208]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeSans.sfd: Added a couple of glyphs in the
+	  IPA and African Latin ranges.
+
+2003-01-30 15:55 +0000 [r206]  peterlin:
+
+	* ChangeLog: Update.
+
+2003-01-30 15:35 +0000 [r205]  peterlin:
+
+	* FreeSansBold.sfd,
+	  FreeSansBoldOblique.sfd: Corrected Maltese
+	  hbar and Hbar.
+
+2003-01-30 14:54 +0000 [r204]  peterlin:
+
+	* FreeSans.sfd,
+	  FreeSansOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Corrected Maltese
+	  hbar and Hbar.
+
+2003-01-30 14:43 +0000 [r203]  peterlin:
+
+	* FreeMonoBold.sfd: Corrected Maltese Hbar.
+
+2003-01-28 16:31 +0000 [r202]  peterlin:
+
+	* FreeSerifItalic.sfd: Corrected Maltese hbar.
+
+2002-12-19 18:31 +0000 [r201]  peterlin:
+
+	* FreeSans.sfd: Cleaner Tamil outlines.
+
+2002-12-18 17:38 +0000 [r199-200]  peterlin:
+
+	* ChangeLog: Update.
+
+	* tools/ConvertFont (added): Convert fonts from
+	  PfaEdit's native format to TrueType format.
+
+2002-12-18 17:17 +0000 [r198]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-12-18 10:43 +0000 [r197]  peterlin:
+
+	* FreeSans.sfd: Added (almost complete) Tamil
+	  Unicode range.
+
+2002-12-17 16:44 +0000 [r196]  peterlin:
+
+	* FreeSans.sfd: Started adding Kannada glyphs
+	  from Akruti fonts.
+
+2002-12-17 15:56 +0000 [r195]  peterlin:
+
+	* AUTHORS, ChangeLog,
+	  CREDITS: Added M.S. Sridhar and Akruti fonts.
+
+2002-12-17 15:42 +0000 [r194]  peterlin:
+
+	* FreeSans.sfd: Added some Devanagari and
+	  Gujarati glyphs from the Akruti fonts.
+
+2002-12-17 10:08 +0000 [r193]  peterlin:
+
+	* ChangeLog, CREDITS: Correct
+	  spelling of Culmus project.
+
+2002-12-12 15:09 +0000 [r192]  peterlin:
+
+	* INSTALL (added): Installation notes for the Free
+	  UCS outline fonts.
+
+2002-12-12 08:57 +0000 [r191]  peterlin:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Checked in as v1.1.
+
+2002-12-12 08:48 +0000 [r190]  peterlin:
+
+	* FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Checked in as v1.1.
+
+2002-12-06 15:13 +0000 [r189]  peterlin:
+
+	* FreeMono.sfd: Minor correction on U+230F.
+
+2002-12-06 15:00 +0000 [r188]  peterlin:
+
+	* FreeMono.sfd: Various additions in the
+	  U+2000-U+27FF area, courtesy Vyacheslav Dikonov.
+
+2002-12-06 14:20 +0000 [r187]  peterlin:
+
+	* CREDITS: Added Vyacheslav Dikonov.
+
+2002-12-06 14:08 +0000 [r186]  peterlin:
+
+	* AUTHORS: Added Vyacheslav Dikonov.
+
+2002-12-06 13:59 +0000 [r185]  peterlin:
+
+	* FreeMono.sfd: Added Runes (U+16A0...),
+	  courtesy Vyacheslav Dikonov.
+
+2002-12-06 13:43 +0000 [r184]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-12-06 13:40 +0000 [r182-183]  peterlin:
+
+	* FreeSans.sfd: Added Unicode Syriac glyphs,
+	  courtesy Vyacheslav Dikonov.
+
+	* FreeMono.sfd: Added Braille glyphs, courtesy
+	  Vyacheslav Dikonov.
+
+2002-11-28 10:10 +0000 [r181]  peterlin:
+
+	* README: Resubmitted using -r1.1.
+
+2002-11-28 10:02 +0000 [r180]  peterlin:
+
+	* AUTHORS: Resubmitted using -r 1.1
+
+2002-11-28 09:57 +0000 [r179]  peterlin:
+
+	* AUTHORS: Re-submitted using CVS 1.11.2.
+
+2002-11-28 09:41 +0000 [r178]  peterlin:
+
+	* README: Updated text reflecting that Microsoft Web
+	  fonts are no longer freely available.
+
+2002-10-16 11:02 +0000 [r177]  peterlin:
+
+	* FreeSerif.sfd: Corrected glyph 0x0446, thanks
+	  to Reiji SUZUKI, who spotted it.
+
+2002-10-11 16:40 +0000 [r176]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-10-11 16:29 +0000 [r175]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-10-11 15:46 +0000 [r174]  peterlin:
+
+	* FreeSans.sfd: Added a handful of kern pairs
+	  beyond Latin-1.
+
+2002-10-11 14:14 +0000 [r173]  peterlin:
+
+	* FreeSerif.sfd: Adding kern pairs manually also
+	  cleans the empty glyph slots (and makes the file unreadable by
+	  PfaEdit). Reintroduced them.
+
+2002-10-11 14:01 +0000 [r172]  peterlin:
+
+	* FreeSerif.sfd: Added about one dozen kern
+	  pairs as a test.
+
+2002-10-11 13:44 +0000 [r171]  peterlin:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Patch from Sept 23
+	  introduced core dumps, as PfaEdit dutifully cleared all the empty
+	  glyph slots along the way, which messed up its internal workings.
+	  Re-introduced all the empty glyph slots.
+
+2002-09-23 16:00 +0000 [r170]  peterlin:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: At some point I lost the
+	  kerning information. First attempt to reconstruct it from AFM
+	  files.
+
+2002-09-11 14:39 +0000 [r169]  peterlin:
+
+	* FreeMono.sfd: Swapped incorrect "dialytika and
+	  oxia" and "dialytika and varia". Made "tonos" equal to "oxia".
+	  Started doing base Greek with new tonos.
+
+2002-09-11 11:31 +0000 [r168]  peterlin:
+
+	* FreeMonoBold.sfd: Hebrew parts in sync with
+	  Culmus 0.6.
+
+2002-09-11 11:26 +0000 [r167]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-09-11 09:53 +0000 [r166]  peterlin:
+
+	* FreeMono.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Hebrew parts in sync
+	  with Culmus 0.6.
+
+2002-09-11 09:16 +0000 [r165]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-09-11 09:13 +0000 [r164]  peterlin:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: * Added Danilo
+	  Segan's Serbian Cyrillic glyphs. * Updated Hebrew part to comply
+	  with Culmus 0.6.
+
+2002-09-10 08:21 +0000 [r163]  peterlin:
+
+	* FreeSans.sfd: Started working on IPA range.
+
+2002-09-09 16:01 +0000 [r161-162]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Updated Cyrillic part
+	  to match Filippov's 1.0.7pre14.
+
+2002-09-09 15:39 +0000 [r160]  peterlin:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Updated Cyrillic part
+	  to match Filippov's 1.0.7pre14.
+
+2002-09-09 14:33 +0000 [r158-159]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeSansOblique.sfd: Added Stepanyan's
+	  Armenian glyphs from FreeSans, skewed for 12 degrees.
+
+2002-09-06 14:16 +0000 [r157]  peterlin:
+
+	* AUTHORS, CREDITS: Changed @ in
+	  email addresses to " AT ".
+
+2002-09-06 13:43 +0000 [r155-156]  peterlin:
+
+	* ChangeLog: A minor correction.
+
+	* ChangeLog: Update.
+
+2002-09-06 13:18 +0000 [r154]  peterlin:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Added Maxim Iorsh's
+	  Hebrew glyphs (still considered experimental by their author, but
+	  much better than previous ones).
+
+2002-08-28 15:31 +0000 [r152-153]  peterlin:
+
+	* AUTHORS, CREDITS: Added Maxim
+	  Iorsh.
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Added Maxim Iorsh's
+	  Hebrew glyphs.
+
+2002-07-26 10:21 +0000 [r151]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-07-26 10:17 +0000 [r150]  peterlin:
+
+	* FreeMono.sfd: Some minor changes.
+
+2002-06-11 19:28 +0000 [r148-149]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeMono.sfd: Applied Michalis Kabrianis's
+	  patch concerning perispomeni in Greek politoniko.
+
+2002-05-23 11:25 +0000 [r147]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-05-23 11:20 +0000 [r146]  peterlin:
+
+	* FreeMono.sfd: Applied Michalis Kabrianis's
+	  patch which corrects psili. Also some working variants of
+	  characters in the IPA range.
+
+2002-05-16 14:44 +0000 [r145]  peterlin:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoBoldOblique.sfd: Added LangName
+	  information.
+
+2002-05-15 13:23 +0000 [r144]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-05-15 13:14 +0000 [r143]  peterlin:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Deleted explicit ".notdef"
+	  characters.
+
+2002-05-14 08:59 +0000 [r142]  peterlin:
+
+	* FreeSansBoldOblique.sfd: Filled-in the missing
+	  TTFWidth and TTFWeight values.
+
+2002-05-14 08:51 +0000 [r141]  peterlin:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Correctly formed
+	  Panose and LineGap lines.
+
+2002-05-09 18:13 +0000 [r140]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-05-09 17:42 +0000 [r139]  peterlin:
+
+	* FreeSans.sfd: Added some more composite
+	  glyphs. Croatian ligatures better kerned.
+
+2002-05-09 17:10 +0000 [r138]  peterlin:
+
+	* FreeSans.sfd: Added diacritics. Added glyphs
+	  to the Latin Extenede-B area.
+
+2002-05-07 16:13 +0000 [r137]  peterlin:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Updated Panose and LangName
+	  information in the TTF header.
+
+2002-05-07 15:40 +0000 [r136]  peterlin:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Updated Panose and
+	  LangName information in the TTF header.
+
+2002-05-07 15:28 +0000 [r135]  peterlin:
+
+	* FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd: Updating Panose and
+	  LangName information in the font header.
+
+2002-04-30 12:27 +0000 [r134]  peterlin:
+
+	* ChangeLog: Update
+
+2002-04-30 11:21 +0000 [r133]  peterlin:
+
+	* FreeMonoBold.sfd: Several minor changes (lower
+	  carons etc.)
+
+2002-04-30 10:14 +0000 [r132]  peterlin:
+
+	* FreeMonoBold.sfd: Working on Greek small
+	  letters.
+
+2002-04-29 19:44 +0000 [r131]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-04-29 19:38 +0000 [r129-130]  peterlin:
+
+	* FreeMonoBoldOblique.sfd: Started adding Greek.
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd: Harmonizing Greek with
+	  Latin. Done with capitals.
+
+2002-04-29 18:08 +0000 [r128]  peterlin:
+
+	* FreeMonoBold.sfd: Added glyphs in the
+	  Geometrical Shapes and Miscellaneous Symbols area.
+
+2002-04-29 17:35 +0000 [r127]  peterlin:
+
+	* FreeMono.sfd: Added one glyph to the
+	  Geometrical Shapes area, which is now completed; added three
+	  glyphs to the Miscellaneous Symbols area.
+
+2002-04-29 10:34 +0000 [r126]  peterlin:
+
+	* FreeMono.sfd: Erased explicit ".notdef"
+	  character (U+0000). Hopefully this will now stop getting PfaEdit
+	  confused about the "post" table.
+
+2002-04-26 15:41 +0000 [r124-125]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeSans.sfd: Adjusted accent positions on
+	  several glyphs in the Latin Extended-A area.
+
+2002-04-25 16:20 +0000 [r121-123]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeMono.sfd: Minor corrections in the Box
+	  Drawing area.
+
+	* FreeMonoBold.sfd: Box Drawing area completed.
+	  Added some glyphs in the Geometrical Shapes area.
+
+2002-04-24 16:09 +0000 [r120]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-04-24 16:06 +0000 [r119]  peterlin:
+
+	* FreeMono.sfd: BoxDrawing area completed.
+
+2002-04-23 15:22 +0000 [r118]  peterlin:
+
+	* FreeMonoBold.sfd: Added glyphs in the General
+	  Punctuation area.
+
+2002-04-23 15:04 +0000 [r117]  peterlin:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd: Added glyphs to the Box
+	  Drawing area.
+
+2002-04-23 13:52 +0000 [r115-116]  peterlin:
+
+	* ChangeLog: Update.
+
+	* tools/WGL4.lst: Correction. Added missing
+	  characters 02DC:SMALL TILDE, F001:LATIN SMALL LIGATURE FI and
+	  F002:LATIN SMALL LIGATURE FL (the latter two belong to private
+	  use area). Left 00A0:NO-BREAK SPACE in place, although some specs
+	  don't list it. Total 653 characters on the list (WGL4 is supposed
+	  to have 652 coded characters).
+
+2002-04-22 21:27 +0000 [r114]  peterlin:
+
+	* FreeMonoBold.sfd: Adding new glyphs to the
+	  Latin Extended-B and IPA Extensions ranges.
+
+2002-04-22 15:05 +0000 [r112-113]  peterlin:
+
+	* ChangeLog: *** empty log message ***
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd: Working on Latin Extended-B
+	  and Greek.
+
+2002-04-19 15:58 +0000 [r110-111]  peterlin:
+
+	* FreeSerif.sfd: Somewhat cleaner chess figures.
+
+	* ChangeLog: *** empty log message ***
+
+2002-04-19 14:57 +0000 [r109]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-04-19 14:23 +0000 [r108]  peterlin:
+
+	* tools/MES-2.txt, tools/MES-2.lst:
+	  Corrected list (it is not 203C-203E, it is 203C and 203E).
+
+2002-04-19 09:24 +0000 [r107]  peterlin:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSans.sfd,
+	  FreeSansBold.sfd,
+	  FreeSansOblique.sfd,
+	  FreeSansBoldOblique.sfd,
+	  FreeMono.sfd,
+	  FreeSerif.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeSerifBold.sfd,
+	  FreeMonoBoldOblique.sfd: Changed "Family Name"
+	  from Free to FreeSerif, FreeSans and FreeMono, as appropriate.
+	  Changed Font Modifiers from MonoBold etc. to Bold, Italic,
+	  Oblique, BoldOblique and BoldItalic.
+
+2002-04-18 09:38 +0000 [r106]  peterlin:
+
+	* FreeMono.sfd,
+	  FreeMonoBold.sfd,
+	  FreeMonoOblique.sfd,
+	  FreeMonoBoldOblique.sfd: Corrected metrics;
+	  now all character widths are set to 600.
+
+2002-04-17 18:49 +0000 [r104-105]  peterlin:
+
+	* ChangeLog: Added forgotten info on box drawing
+	  characters in FreeSerif.
+
+	* ChangeLog: *** empty log message ***
+
+2002-04-17 17:37 +0000 [r103]  peterlin:
+
+	* FreeSerif.sfd: Box drawing characters
+	  corrected. Now they extend both ascender and descender height.
+
+2002-04-17 15:45 +0000 [r102]  peterlin:
+
+	* FreeMonoBold.sfd: Continued working on Greek.
+
+2002-04-17 14:53 +0000 [r101]  peterlin:
+
+	* FreeMonoBold.sfd: Added some more Box Drawing
+	  characters.
+
+2002-04-17 11:56 +0000 [r100]  peterlin:
+
+	* FreeMonoBold.sfd: Added some Box Drawing
+	  characters.
+
+2002-04-16 15:36 +0000 [r99]  peterlin:
+
+	* ChangeLog: *** empty log message ***
+
+2002-04-16 15:30 +0000 [r98]  peterlin:
+
+	* FreeMono.sfd: Added a couple of characters in
+	  the Miscellaneous Symbols area.
+
+2002-04-16 14:28 +0000 [r97]  peterlin:
+
+	* FreeMonoBoldOblique.sfd: Added superscripts,
+	  subscripts, vulgar fractions and a couple other characters needed
+	  to make font MES-1 compliant.
+
+2002-04-16 13:58 +0000 [r96]  peterlin:
+
+	* FreeMonoBold.sfd: Added some characters,
+	  mostly in the Miscellaneous Symbols area. FreeMonoBold now
+	  complies with MES-1.
+
+2002-04-16 10:16 +0000 [r95]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-04-16 10:13 +0000 [r94]  peterlin:
+
+	* FreeMonoBold.sfd: Started harmonizing Greek
+	  letters with Latin and Cyrillic.
+
+2002-04-16 09:28 +0000 [r93]  peterlin:
+
+	* FreeMonoBold.sfd: Added subscripts,
+	  superscripts and vulgar fractions.
+
+2002-04-15 13:42 +0000 [r92]  peterlin:
+
+	* ChangeLog: Update
+
+2002-04-12 15:59 +0000 [r91]  peterlin:
+
+	* AUTHORS, CREDITS: Added Beyene,
+	  Kudlek, Kummer and Metzinger from the Theoretical Foundations of
+	  Computer Science, University of Hamburg, the authors of the set
+	  of Ethiopic metafonts.
+
+2002-04-12 15:42 +0000 [r90]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-04-12 15:38 +0000 [r89]  peterlin:
+
+	* FreeSerif.sfd: Added Ethiopian glyphs,
+	  converted from the Metafont sources from TGI, Universität Hamburg
+	  (authors Berhanu Beyene, Prof. Dr. Manfred Kudlek, Olaf Kummer,
+	  and Jochen Metzinger) using Szabo's TeXtrace and retouched using
+	  PfaEdit. Ethiopian metafonts are released under GNU GPL,
+	  http://www.informatik.uni-hamburg.de/TGI/mitarbeiter/wimis/kummer/ethiop_eng.html
+
+2002-04-12 15:30 +0000 [r88]  peterlin:
+
+	* FreeMonoBold.sfd: Added 40 characters, mostly
+	  in the Latin Extended-B and IPA Extensions areas.
+
+2002-04-11 19:56 +0000 [r86-87]  peterlin:
+
+	* ChangeLog: *** empty log message ***
+
+	* FreeMono.sfd: Added a handful of characters in
+	  the Latin Extended-B, Currency Symbols and Miscellaneous Symbols
+	  areas.
+
+2002-04-11 09:57 +0000 [r85]  peterlin:
+
+	* FreeMono.sfd: Added three glyphs to the IPA
+	  Extensions area.
+
+2002-04-09 07:12 +0000 [r83-84]  peterlin:
+
+	* ChangeLog: *** empty log message ***
+
+	* FreeMono.sfd: Corrected accent positioning in
+	  the Extended Greek area; adding a couple of glyphs here and
+	  there. 20 characters short of MES-2 conformance.
+
+2002-04-08 16:57 +0000 [r82]  peterlin:
+
+	* AUTHORS, CREDITS: Added Jeroen
+	  Hellingman and Thomas Ridgeway, the authors of Malayalam, Oriya
+	  and Tamil glyphs sets.
+
+2002-04-08 16:39 +0000 [r81]  peterlin:
+
+	* ChangeLog: *** empty log message ***
+
+2002-04-08 16:33 +0000 [r80]  peterlin:
+
+	* FreeMono.sfd: Added some arrows and Greek
+	  politoniko.
+
+2002-04-05 15:04 +0000 [r79]  peterlin:
+
+	* FreeMono.sfd,
+	  FreeMonoOblique.sfd: Modern Non-Russian
+	  Cyrillic mostly completed.
+
+2002-04-05 10:37 +0000 [r78]  peterlin:
+
+	* FreeSerif.sfd: Added Thomas Ridgeway's Tamil
+	  fonts, partly edited.
+
+2002-04-04 16:15 +0000 [r77]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-04-04 16:12 +0000 [r76]  peterlin:
+
+	* FreeMonoBold.sfd: Started working on the
+	  non-Russian Cyrillic glyphs. Corrected Serbian letters dje, lje,
+	  nje and tshe.
+
+2002-04-04 10:44 +0000 [r75]  peterlin:
+
+	* FreeMono.sfd: Minor modifications in the
+	  non-Russian Cyrillic area.
+
+2002-04-04 10:35 +0000 [r74]  peterlin:
+
+	* FreeMono.sfd,
+	  FreeMonoOblique.sfd: Armenian capital
+	  characters matching in case Latin, Cyrillic and Greek.
+
+2002-04-04 09:57 +0000 [r73]  peterlin:
+
+	* FreeMonoOblique.sfd: Serbian Cyrillic glyphs
+	  synchronized with FreeMono.
+
+2002-04-04 09:36 +0000 [r71-72]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeMono.sfd: Serbian cyrillic characters dje
+	  and tshe corrected.
+
+2002-04-03 16:34 +0000 [r70]  peterlin:
+
+	* ChangeLog: *** empty log message ***
+
+2002-04-03 16:29 +0000 [r69]  peterlin:
+
+	* FreeMono.sfd: Armenian characters added.
+
+2002-03-28 15:32 +0000 [r67-68]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeMono.sfd: Added some mathematical symbols.
+
+2002-03-26 21:00 +0000 [r66]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-03-26 20:56 +0000 [r65]  peterlin:
+
+	* FreeSans.sfd: Added H.S. Pannu's Gurmukhi. It
+	  actually fits in here much better than it fits FreeSerif. I'll
+	  have to look for a Gurmukhi font with modulated stroke for
+	  FreeSerif.
+
+2002-03-26 20:45 +0000 [r64]  peterlin:
+
+	* FreeSerif.sfd: A more stylish barred H.
+
+2002-03-26 20:35 +0000 [r63]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-03-26 20:29 +0000 [r62]  peterlin:
+
+	* FreeMono.sfd: Minor changes in Greek; added
+	  some mathematical symbols.
+
+2002-03-26 16:20 +0000 [r61]  peterlin:
+
+	* FreeMono.sfd: Completed vulgar fractions.
+
+2002-03-26 16:00 +0000 [r60]  peterlin:
+
+	* FreeSerif.sfd: Added dotted Hebrew letters.
+
+2002-03-26 14:40 +0000 [r58-59]  peterlin:
+
+	* FreeSerifItalic.sfd: Took Hebrew characters
+	  from FreeSerif and slanted them for 15.5 degrees.
+
+	* FreeSerif.sfd: Telugu letters optimized
+	  somehow. Still too small, though.
+
+2002-03-26 14:15 +0000 [r57]  peterlin:
+
+	* AUTHORS, CREDITS: Corrected Unicode
+	  ranges for Gurmukhi and Gujarati.
+
+2002-03-26 09:58 +0000 [r55-56]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeMonoBold.sfd: Added characters to the
+	  Latin Extended-B and IPA Extensions area.
+
+2002-03-25 20:00 +0000 [r53-54]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeMonoBold.sfd: Started adding Latin
+	  Extended-B and IPA Extensions.
+
+2002-03-25 19:28 +0000 [r51-52]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeMono.sfd: Minor cosmetic changes; cleaning
+	  up Greek (removing redundant control points), added some
+	  non-European Cyrillic glyphs as a test.
+
+2002-03-22 11:31 +0000 [r50]  peterlin:
+
+	* FreeMono.sfd: Some minor modifications;
+	  letters in Latin Extended-B area "welded" together.
+
+2002-03-20 20:47 +0000 [r49]  peterlin:
+
+	* FreeMono.sfd,
+	  FreeMonoOblique.sfd: Numerous glyphs added in
+	  the Latin Extended-B, IPA Extensions and Number Forms areas.
+	  MES-1 compliant!
+
+2002-03-20 12:46 +0000 [r48]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-03-19 14:22 +0000 [r47]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-03-19 13:12 +0000 [r46]  peterlin:
+
+	* FreeMonoOblique.sfd: Added characters in Latin
+	  Extended-B and IPA Extensions area. Now mostly synchronized with
+	  FreeMono.
+
+2002-03-18 17:56 +0000 [r45]  peterlin:
+
+	* FreeMono.sfd: Added some more IPA characters.
+
+2002-03-18 14:33 +0000 [r44]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-03-18 12:21 +0000 [r43]  peterlin:
+
+	* FreeMono.sfd: Added some more characters, in
+	  particular in the Latin Extended-B and IPA Extensions areas, to a
+	  total of 1424 chars.
+
+2002-03-15 19:08 +0000 [r41-42]  peterlin:
+
+	* FreeMono.sfd: Added a dozen or two new
+	  characters, in particular in the IPA Extensions area.
+
+	* ChangeLog: Update.
+
+2002-03-15 13:57 +0000 [r40]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-03-14 09:15 +0000 [r38-39]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeMono.sfd: Added three smiley characters.
+
+2002-03-10 18:16 +0000 [r37]  peterlin:
+
+	* AUTHORS, ChangeLog,
+	  CREDITS: Due credit to the original author of
+	  Gurmukhi font, Hardip Singh Pannu.
+
+2002-03-10 18:07 +0000 [r36]  peterlin:
+
+	* FreeSerif.sfd: Anshuman Pandey has only
+	  converted Gurmukhi from TrueType to Metafont; the original author
+	  of Gurkmukhi font is Hardip Singh Pannu
+	  <http://members.aol.com/hspannu/punjabi.html>. Got the permission
+	  from him to include the Gurmukhi glyph set.
+
+2002-03-08 12:17 +0000 [r34-35]  peterlin:
+
+	* ChangeLog: Update
+
+	* FreeSerif.sfd: Added some more glyphs in the
+	  Mathematical Symbols area.
+
+2002-03-06 20:48 +0000 [r32-33]  peterlin:
+
+	* ChangeLog: Update.
+
+	* FreeSerif.sfd: Basic Gurmukhi (Unicode range
+	  without ligatures). I believe the author is Anshuman Pandey
+	  <apandey@u.washington.edu>, found in CTAN
+	  <http://www.tex.ac.uk/tex-archive/language/gurmukhi/pandey/>.
+
+2002-03-06 20:13 +0000 [r31]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-03-06 18:07 +0000 [r30]  peterlin:
+
+	* FreeMono.sfd: Silly me. Glyphs in Box Drawing
+	  and Block Elements areas extend through ascender *and descender*
+	  width. Corrected.
+
+2002-03-06 15:10 +0000 [r29]  peterlin:
+
+	* FreeMono.sfd,
+	  FreeMonoOblique.sfd: Added musical glyphs in
+	  the Miscellaneous Symbols area, linked "non-breaking" space to
+	  space, "soft hyphen" to hyphen-minus. Now we are 4 glyphs short
+	  of MES-1 conformance.
+
+2002-03-05 19:50 +0000 [r28]  peterlin:
+
+	* ChangeLog: Update.
+
+2002-03-05 19:47 +0000 [r27]  peterlin:
+
+	* tools/WGL4.lst (added): Microsoft Windows Glyph
+	  List 4.0 (WGL4). I seem to have lost 2 characters - there ought
+	  to be 652, and I have only 650.
+
+2002-03-05 19:20 +0000 [r25-26]  peterlin:
+
+	* ChangeLog: Update.
+
+	* tools/LigatureList.pl (added): A Perl script,
+	  which lists the GSUB list (ligature list) of a OpenType font.
+	  Requires George Williams' showttf utility, available on
+	  <http://bibliofile.mc.duke.edu/gww/FreeWare/MyToys.html>.
+
+2002-03-05 19:12 +0000 [r24]  peterlin:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerifBold.sfd: An auxilliary substitute
+	  for Hebrew glyphs added.
+
+2002-03-04 17:38 +0000 [r23]  peterlin:
+
+	* ChangeLog: Update
+
+2002-03-04 17:35 +0000 [r22]  peterlin:
+
+	* FreeSerif.sfd: Added some more glyphs in the
+	  Mathematical Operators area.
+
+2002-03-04 15:24 +0000 [r21]  peterlin:
+
+	* AUTHORS, CREDITS: Added Frans
+	  Velthuis <velthuis@rc.rug.nl> and Anshuman Pandey
+	  <apandey@u.washington.edu>.
+
+2002-03-04 14:54 +0000 [r20]  peterlin:
+
+	* ChangeLog: Update
+
+2002-03-04 14:44 +0000 [r19]  peterlin:
+
+	* FreeSerif.sfd: Fragments of Harsh Kumar's
+	  Devanagari font substituted by Frans Velthuis' and Anshuman
+	  Pandey's devanagari metafont, converted to PFB by Peter Szabo's
+	  TeXtrace. Right now only Unicode part without ligatures is made
+	  (though they are present in original font).
+
+2002-02-28 19:14 +0000 [r18]  peterlin:
+
+	* ChangeLog: Update ChangeLog.
+
+2002-02-28 19:05 +0000 [r17]  peterlin:
+
+	* FreeSerif.sfd: Added some more glyphs to the
+	  Miscellaneous Symbols page (0x26).
+
+2002-02-28 18:33 +0000 [r16]  peterlin:
+
+	* AUTHORS, CREDITS: Added Prasad A.
+	  Chodavarapu, the author of Tikkana, a Telugu font available under
+	  the GNU General Public License.
+
+2002-02-28 18:00 +0000 [r15]  peterlin:
+
+	* FreeSerif.sfd: Added some Telugu glyphs to
+	  page 0x0C, courtesy Prasad A. Chodavarapu
+	  <http://chaitanya.bhaavana.net/fonts/>
+
+2002-02-28 16:49 +0000 [r14]  peterlin:
+
+	* AUTHORS, CREDITS: Prof. Venkatesh
+	  (Venky) Hariharan supplied me with an email address for Harsh
+	  Kumar.
+
+2002-02-28 14:51 +0000 [r13]  peterlin:
+
+	* ChangeLog (added): A log of changes to project
+	  files.
+
+2002-02-26 18:38 +0000 [r12]  peterlin:
+
+	* AUTHORS, CREDITS: Mohamed Ishan's
+	  email address corrected to his preferred one.
+
+2002-02-25 19:26 +0000 [r11]  peterlin:
+
+	* FreeMono.sfd: Added some more glyphs, in
+	  particular in the Mathematical Operators section. Changed
+	  FamilyName to Free, FontName to FreeMono, and Full name to "Free
+	  Monospaced".
+
+2002-02-25 12:43 +0000 [r10]  peterlin:
+
+	* FreeSerif.sfd: Added a couple of glyphs in
+	  Mathematics Operators.
+
+2002-02-20 21:08 +0000 [r9]  peterlin:
+
+	* AUTHORS, CREDITS: New coauthors
+	  added: Mohamed Ishan, Harsh Kumar and Sushant Kumar Dash.
+
+2002-02-20 20:21 +0000 [r8]  peterlin:
+
+	* FreeSerifItalic.sfd,
+	  FreeSerifBoldItalic.sfd,
+	  FreeSerif.sfd,
+	  FreeSerifBold.sfd: Glyphs originating from the
+	  old Omega system removed.
+
+2002-02-20 20:06 +0000 [r7]  peterlin:
+
+	* FreeSerifItalic.sfd (added),
+	  FreeSerifBoldItalic.sfd (added),
+	  FreeSerif.sfd (added),
+	  FreeSerifBold.sfd (added): Proportional ISO
+	  10646 fonts with modulated stroke.
+
+2002-02-20 18:46 +0000 [r6]  peterlin:
+
+	* FreeSans.sfd: Added an incomplete set of Oriya
+	  characters, courtesy Sushant Dash <sushant@writeme.com>.
+
+2002-02-20 16:37 +0000 [r5]  peterlin:
+
+	* tools/MES-3B.lst (added), tools
+	  (added), tools/MES-1.txt (added),
+	  tools/MES-2.txt (added),
+	  tools/CheckConformance.pl (added),
+	  tools/MES-1.lst (added),
+	  tools/MES-2.lst (added),
+	  tools/MES-3B.txt (added),
+	  tools/mes-list-expand.pl (added): Tools for
+	  checking conformance with coded character sets.
+
+2002-02-20 13:52 +0000 [r3-4]  peterlin:
+
+	* AUTHORS (added), CREDITS (added),
+	  README (added): Free UCS Scalable Fonts
+
+	* FreeSans.sfd (added),
+	  FreeSansBold.sfd (added),
+	  FreeSansOblique.sfd (added),
+	  FreeSansBoldOblique.sfd (added): Proportional
+	  ISO 10646 fonts with uniform stroke.
+
+2002-02-20 13:46 +0000 [r2]  peterlin:
+
+	* sfd (added), trunk/freefont (added),
+	  FreeMono.sfd (added),
+	  FreeMonoBold.sfd (added),
+	  FreeMonoOblique.sfd (added),
+	  FreeMonoBoldOblique.sfd (added): Monospaced
+	  ISO 10646 fonts.
+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/INSTALL b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/INSTALL
new file mode 100644
index 00000000..b458961f
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/INSTALL
@@ -0,0 +1,98 @@
+                          Installing GNU FreeFont
+                          =======================
+
+GNU FreeFont can be used in any modern operating system.
+
+This document explains how to install FreeFont on some common systems.
+
+UNIX/GNU/Linux/BSD Systems
+--------------------------
+
+FreeFont works with any system using the free font rasterizer FreeType
+<http://www.freetype.org/>.  Some features such as glyph substitution and
+positioning may be handled by the text layout library
+Pango <http://www.pango.org/>.
+
+Most recent systems using FreeType2 and Pango handle OpenType fonts well,
+but on older systems TrueType may perform better.
+
+* Debian GNU/Linux
+
+Users of Debian GNU/Linux system will probably want to use the Debian package,
+named 'ttf-freefont', available from the Debian Linux site.
+
+Install the fonts by issuing the command
+	apt-get install ttf-freefont
+
+
+* KDE local installation
+
+Users of KDE can install .ttf files on a per-user basis using the KDE 
+Control Center module "kcmfontinst", which may appear in the menu as
+
+	Settings -> System Administration -> Font Installer
+
+This is especially helpful for developers and testers.
+
+
+* Generic X Window systems
+
+	1) Fetch the freefont-ttf.tar.gz package with Free UCS outline fonts
+	   in the TrueType format.
+
+	2) Unpack TrueType fonts into a suitable directory,
+	   e.g. /usr/local/share/fonts/default/TrueType/
+
+	3) If you have chosen any other directory, make sure the directory you
+	   used to install the fonts is listed in the path searched by the X
+	   Font Server by editing the config file in /etc/X11/.
+
+	   In some systems, you list the directory in the item "catalogue="
+	   in the file /etc/X11/fs/config.
+
+	4) Run ttmkfdir in the directory where you unpacked the fonts.
+
+
+Microsoft Windows 95/98/NT/2000/XP; Vista/7
+-------------------------------------------
+
+Note that in at least Windows 7, Vista, XP and 2000, the TrueType versions
+perform much better than, and are recommended over, the OpenType ones.
+
+For good font smoothing in Windows, Microsoft ClearType must be enabled.
+The native Windows web browser must be used to install, enable, and configure
+ClearType. A web search for "ClearType Tuner" will find the proper web pages.
+Recent versions of the browser raise a security block (a yellow bar at the
+top of the window), which you must act upon to allow installation.  A
+checkbox in the window turns ClearType on (in Win-speek, "Turn on ClearType").
+The change happens immediately.
+
+* Vista, Windows 7:
+	1) From the Start menu, open Control Panels
+	2) Drag-n-drop font files onto Fonts control panel
+           You may get a dialog saying
+        	"Windows needs your permission to continue"
+	   a) Click Continue
+
+* 95/98/NT:
+	The font installation is similar to Vista.
+
+	In order to use OpenType, users of Windows 95, 98 and NT 4.0 can
+	install Adobe's 'Type Manager Light', which may be obtained from
+	the Adobe web site.
+
+	Otherwise, use the TrueType versions.
+
+Apple Mac OS X
+--------------
+
+Support for OpenType on MacOS X started with OS 10.4, and has been improved
+gradually in later versions.
+
+Installing on Mac OS X consists of moving the font files to either
+	/Library/Fonts/  or  ~/Library/Fonts/
+depending on whether they should be available to all users on your system
+or just to your own user.
+
+--------------------------------------------------------------------------
+$Id: INSTALL,v 1.11 2011-06-12 07:14:12 Stevan_White Exp $
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/README b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/README
new file mode 100644
index 00000000..d83f4a94
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/README
@@ -0,0 +1,127 @@
+-*-text-*-
+                          GNU FreeFont
+
+The GNU FreeFont project aims to provide a useful set of free scalable
+(i.e., OpenType) fonts covering as much as possible of the ISO 10646/Unicode
+UCS (Universal Character Set).
+
+Statement of Purpose
+--------------------
+
+The practical reason for putting glyphs together in a single font face is
+to conveniently mix symbols and characters from different writing systems,
+without having to switch fonts.
+
+Coverage
+--------
+
+FreeFont covers the following character ranges
+* Latin, Cyrillic, and Arabic, with supplements for many languages
+* Greek, Hebrew, Armenian, Georgian, Thaana, Syriac
+* Devanagari, Bengali, Gujarati, Gurmukhi, Sinhala, Tamil, Malayalam
+* Thai, Tai Le, Kayah Li, Hanunóo, Buginese
+* Cherokee, Unified Canadian Aboriginal Syllabics
+* Ethiopian, Tifnagh, Vai, Osmanya, Coptic
+* Glagolitic, Gothic, Runic, Ugaritic, Old Persian, Phoenician, Old Italic
+* Braille, International Phonetic Alphabet
+* currency symbols, general punctuation and diacritical marks, dingbats
+* mathematical symbols, including much of the TeX repertoire of symbols
+* technical symbols: APL, OCR, arrows,
+* geometrical shapes, box drawing
+* musical symbols, gaming symbols, miscellaneous symbols
+  etc.
+For more detail see <http://www.gnu.org/software/freefont/coverage.html>
+
+Editing
+-------
+
+The free outline font editor, George Williams' FontForge
+<http://fontforge.sourceforge.net/> is used for editing the fonts.
+
+Design Issues
+-------------
+
+Which font shapes should be made?  Historical style terms like Renaissance
+or Baroque letterforms cannot be applied beyond Latin/Cyrillic/Greek
+scripts to any greater extent than Kufi or Nashki can be applied beyond
+Arabic script; "italic" is strictly meaningful only for Latin letters, 
+although many scripts such as Cyrillic have a history with "cursive" and
+many others with "oblique" faces. 
+
+However, most modern writing systems have typographic formulations for
+contrasting uniform and modulated character stroke widths, and since the
+advent of the typewriter, most have developed a typographic style with
+uniform-width characters.
+
+Accordingly, the FreeFont family has one monospaced - FreeMono - and two
+proportional faces (one with uniform stroke - FreeSans - and one with
+modulated stroke - FreeSerif).
+
+The point of having characters from different writing systems in one font
+is that mixed text should look good, and so each FreeFont face contains
+characters of similar style and weight.
+
+Licensing
+---------
+
+Free UCS scalable fonts 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.
+
+The fonts are distributed in the hope that they will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+As a special exception, if you create a document which uses this font, and
+embed this font or unaltered portions of this font into the document, this
+font does not by itself cause the resulting document to be covered by the
+GNU General Public License. This exception does not however invalidate any
+other reasons why the document might be covered by the GNU General Public
+License. If you modify this font, you may extend this exception to your
+version of the font, but you are not obligated to do so.  If you do not
+wish to do so, delete this exception statement from your version.
+
+Files and their suffixes
+------------------------
+
+The files with .sfd (Spline Font Database) are in FontForge's native format. 
+They may be used to modify the fonts.
+
+TrueType fonts are the files with the .ttf (TrueType Font) suffix.  These
+are ready to use in Linux/Unix, on Apple Mac OS, and on Microsoft Windows
+systems.
+
+OpenType fonts (with suffix .otf) are preferred for use on Linux/Unix,
+but *not* for recent Microsoft Windows systems.
+See the INSTALL file for more information.
+
+Web Open Font Format files (with suffix .woff) are for use in Web sites.
+See the webfont_guidelines.txt for further information.
+
+Further information
+-------------------
+
+Home page of GNU FreeFont:
+	http://www.gnu.org/software/freefont/
+
+More information is at the main project page of Free UCS scalable fonts:
+	http://savannah.gnu.org/projects/freefont/
+
+To report problems with GNU FreeFont, it is best to obtain a Savannah
+account and post reports using that account on
+	https://savannah.gnu.org/bugs/
+	
+Public discussions about GNU FreeFont may be posted to the mailing list
+	freefont-bugs@gnu.org
+
+--------------------------------------------------------------------------
+Original author: Primoz Peterlin
+Current administrator: Steve White <stevan.white@googlemail.com>
+
+$Id: README,v 1.10 2011-06-12 07:14:12 Stevan_White Exp $
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/TROUBLESHOOTING b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/TROUBLESHOOTING
new file mode 100644
index 00000000..a7af2225
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/TROUBLESHOOTING
@@ -0,0 +1,115 @@
+	Troubleshooting GNU FreeFont
+
+So your text looks lousy, although you installed FreeFont and you seem to be
+using it.  What do you do?
+
+Before you blame the problem on FreeFont, take the time to double-check that
+the text you are looking at is really rendered with FreeFont.
+
+Be aware that not all Unicode characters are supported by FreeFont, and
+even characters supported by one face, such as Serif, might not be
+supported by other faces such as Sans.
+
+Also, some systems have settings that strongly affect the rendering
+of fonts.  It may be worth tweaking these.
+
+glyph substitution
+==================
+
+When given the task of displaying characters in text, modern font rendering
+software usually tries to display *something*, even if the font it is
+*supposed* to be using does not contain glyphs for all the characters in the
+text.  The software will snoop through all the fonts on the system to find
+one that has a glyph for the one missing in the desired font.  So although
+you have specified FreeSans-bold, you may be looking at a letter from quite
+a different font.
+
+First double-check that the font in question really contains the character
+in question.  If you don't have font development software, this can be
+tricky.  In the case of FreeFont, you can check if a given character 
+range is supported: <http://www.gnu.org/software/freefont/coverage.html>
+
+Next double-check that your application (web browser, text editor, etc)
+has indeed been properly instructed to use the font.
+
+Then double-check that the font is really installed in the system.
+(This depends on the operating system, of course.)
+
+Linux and Unix
+==============
+
+Modern Linux systems use a system called fontconfig, which maintains a font
+cache, for efficiency.
+
+The font cache can really complicate font installation and troubleshooting
+however.  It can happen that when a font is newly installed, what is 
+displayed is coming out of an old cache entry rather than the new font.
+
+Just what to do depends on how and where the font was installed.
+
+Fonts installed system-wide are usually put in a directory such as
+	/usr/share/fonts/
+the font cache for these might be in
+	/var/cache/fontconfig/
+Fonts installed just for one user account will typically be in
+	~/.fonts/
+and the cache will be
+	~/.fontconfig/
+
+You can clean your local cache merely by emptying the directory 
+	~/.fontconfig/
+In any case, to clean the cache, you can use the fontconfig command
+	fc-cache -vf
+If run as root, it will clean the system cache, if run as a normal user,
+it cleans only the normal user's cache.
+
+The procedure for local fonts is:
+	1) shut off any program using the fonts in question
+	2) clean the cache
+	3) re-start the program
+The procedure for system-wide fonts is:
+	1) log out of the X Windows session
+	2) in a console, clean the cache
+	3) log in to an X Windows session
+
+LibreOffice / OpenOffice
+========================
+These products have their own font rendering libraries, which have 
+idiosyncratic behavior.
+
+It has recently been reported that as of LibreOffice 3.5.1, font features
+are disabled for OpenType fonts.  If you use FreeFont with these products,
+you may want to install the TrueType versions of the fonts.
+
+Windows
+=======
+
+The most common complaint has to do with "blurry text".  There are two
+causes.
+
+The first is that ClearType smoothing is turned off.  The best way to check
+is to use the native Windows Web browser. Do a search for "ClearType Tuner".
+The Microsoft pages install a tuner for ClearType. A security block notice
+will appear at the top of the window--you have to allow the installation.
+Then check the box "Turn on ClearType".  The change happens immediately.
+
+The secont cause is that the FreeFont version with cubic spline outlines is
+installed.  As of the 2012 GNU FreeFont release, the TrueType builds have
+quadratic splines, which work best with Windows' rendering software.
+	TTF (TrueType)  quadratic splines Windows 7, Vista, Windows XP.
+	OTF (OpenType)  cubic splines     Linux, Mac
+
+Note also: Firefox has a setting for ClearType:
+	gfx.font_rendering.cleartype_params.rendering_mode
+A value of 2 sets it to old-style GDI rendering, while -1 is the default.
+
+reporting problems
+==================
+
+If you really think you're seeing a bug in FreeFont, or if you have
+a suggestion, consider opening a problem report at
+	https://savannah.gnu.org/bugs/?group=freefont
+It is best that you make a Savannah account and log in with that, so 
+you can be e-mailed whenever changes are made to your report.
+
+$Id: troubleshooting.txt,v 1.10 2011-07-16 08:38:06 Stevan_White Exp $
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/USAGE b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/USAGE
new file mode 100644
index 00000000..7f7aa5c7
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freefont-20120503/USAGE
@@ -0,0 +1,185 @@
+	Usage of GNU FreeFont
+
+Language scripts and faces
+==========================
+
+There are three faces (serif, sans-serif, and monospace), and four styles
+(regular, bold, cursive/italic, and bold cursive/italic) for each face.
+There is one font file per face/style combination: 12 files in total.
+
+The letters for various languages, as well as specialized symbols, exist
+among the various font files, but they are not uniformly populated.
+All the fonts have complete support for Latin, Cyrillic, and Greek, as
+well as most of the extensions for those scripts.
+
+At this time, serif regular has by far the largest number of letters, and
+supports the largest number of writing scripts.  However there are writing
+scripts supported by the sans-serif but not by serif.
+
+For an overview of which scripts and sets of symbols are supported by
+which face, see the FreeFont 'coverage' web page.
+
+Font features
+=============
+
+FreeFont has numerous font "features" that perform alterations to the basic
+letters of the font, replacing them with other letters, or positioning them
+with respect to other letters.
+
+Many features are activated automatically, but in some environments, they
+present some user control.  This documents those features with user control.
+
+Language-specific features
+==========================
+
+Some OpenType font features are activated only when the text is specified to
+be of a certain language. 
+
+This is done in HTML by enclosing the text with a tag whose 'lang' attribute
+is set to the appropriate ISO 632.2 language code.  In a word processor, 
+any block of text can be given a language setting.
+
+Latin
+-----
+Catalan	ligature improving l·l
+Dutch	ligatures for ij, IJ
+Sami	localized form for letter Eng
+Turkish	overrides ligatures fi ffi of Latin
+
+Cyrillic
+--------
+Ukrainian	ligature for double i-diaresis
+Serbian/Macedonian	localized letters be, and more in italic
+Bulgarian	style set for modern glyphs
+
+Hebrew
+------
+Yiddish	raised vowels under yo
+
+Devanagari
+----------
+Sanskrit	much larger set of ligatures
+
+Hindi, Marathi	better spacing of Western punctuation marks
+
+Indic languages
+---------------
+
+The 'danda' character is encoded in Unicode only in the Devanagari range.
+When writing in scripts of other Indic languages, this same character is to
+be used.  But the shapes and line thicknesses of glyphs vary slightly from
+one script to another, so the same glyph for 'danda' may not fit all scripts.
+
+By specifying the language of the text, an appropriate glyph for 'danda'
+will be obtained.
+
+Style sets
+==========
+
+These replacements are activated by specifying a "Style Set".
+These features are accessible only from typesetting software.
+
+Cyrillic	Bulgarian modern (ss01)
+
+Devanagari	Bombay (ss02), Calcutta (ss03), Nepali (ss04)
+
+Discretionary features
+======================
+These features are accessible only from typesetting software.
+Typically the user must specifically request them.
+
+Unless otherwise noted, these are available only in FreeSerif.
+
+Ligatures and substitutions
+---------------------------
+
+Arabic, Armenian, Hebrew, German, Dutch
+
+Small captials
+--------------
+
+A limited set of specially drawn small capital letters in Latin.
+
+Superscript and subscript
+-------------------------
+
+Transform a limited set of characters--mostly Latin letters and numerals--
+to versions well-sized and positioned as superscript or subscript.
+
+Numeral styles
+--------------
+
+The default numerals of FreeSerif are mono-spaced and of even height.
+It also features proportionally-spaced numerals, and "old-style" numerals--
+those which vary in height and sometimes go beneath the baseline.
+These can be had at discretion.
+
+Diagonal fractions
+------------------
+
+A limited set of diagonal fraction substitutions are available at discretion.
+The set is more than what is encoded in Unicode.
+They work with the ASCII slash or the mathematical slash U+2215.
+The transform a sequence "number-slash-number" to a diagonal form.
+
+Zero
+----
+
+A slashed form of the numeral zero is available at discretion.
+Available in all faces.
+
+Alternative characters
+======================
+
+FreeSerif has some listings of alternatives for specific characters.
+Again this is use primarily in specialized typesetting software.
+
+Greek, Latin
+
+Use in LaTeX
+============
+It is possible to use Unicode fonts in recent LaTeX implementations, but in
+	LuaTeX http://www.luatex.org/ and
+	XeTeX http://tug.org/xetex/
+it is particularly easy to use Unicode text, and to enable font features.
+Recent versions of these systems use the 'fontspec' package to choose fonts
+and features.
+
+A very simple document might contain the lines
+---------------------------------------------------------------------------
+\documentclass{ltxdockit}
+\usepackage{fontspec}
+\usepackage{xunicode}
+\setmainfont[]{FreeSerif}
+\begin{document}
+{\fontspec[Script=Default,Fractions={On}]{FreeSerif}
+1/7 3/10 7/10}
+
+x\raisebox{-0.5ex}{{\scriptsize ai}}
+x{\fontspec[Script=Default,VerticalPosition={Inferior}]{FreeSerif}
+abcdefghijklmnopqrstuvwxyz+−(0123456789)} \\
+x\raisebox{0.85ex}{{\scriptsize ai}}
+x{\fontspec[Script=Default,VerticalPosition={Superior}]{FreeSerif}
+abcdefghijklmnopqrstuvwxyz+−(0123456789)}
+
+{\fontspec[Script=Latin]{FreeSerif}
+\textsc{Small Caps} }
+
+{ Bсички хора се раждат свободни и равни по достойнство и права.
+\fontspec[Script=Cyrillic,Language=Bulgarian,Variant={1}]{FreeSerif} \selectfont
+Bсички хора се раждат свободни и равни по достойнство и права.  }
+
+\end{document}
+---------------------------------------------------------------------------
+Here are some 'fontspec' setting-value pairs meaningful for FreeFont.
+
+Numbers: Lining OldStyle Proportional SlashedZero
+Fractions: On
+VerticalPosition: Superior Inferior
+Ligatures: Common Historical
+Letters: UppercaseSmallCaps
+Variant: 1 (etc. -- must be in {} picks style set.)
+---------------------------------------------------------------------------
+
+
+$Id: usage.txt,v 1.10 2011-07-16 08:38:06 Stevan_White Exp $
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freemono.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemono.ctg.z
new file mode 100644
index 00000000..e952241b
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemono.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freemono.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemono.php
new file mode 100644
index 00000000..db445f4a
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemono.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='FreeMono';
+$up=-125;
+$ut=50;
+$dw=600;
+$diff='';
+$originalsize=584424;
+$enc='';
+$file='freemono.z';
+$ctg='freemono.ctg.z';
+$desc=array('Flags'=>33,'FontBBox'=>'[-793 -200 699 800]','ItalicAngle'=>0,'Ascent'=>800,'Descent'=>-200,'Leading'=>0,'CapHeight'=>563,'XHeight'=>417,'StemV'=>70,'StemH'=>30,'AvgWidth'=>600,'MaxWidth'=>600,'MissingWidth'=>600);
+$cw=array(0=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600,208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600,256=>600,257=>600,258=>600,259=>600,260=>600,261=>600,262=>600,263=>600,264=>600,265=>600,266=>600,267=>600,268=>600,269=>600,270=>600,271=>600,272=>600,273=>600,274=>600,275=>600,276=>600,277=>600,278=>600,279=>600,280=>600,281=>600,282=>600,283=>600,284=>600,285=>600,286=>600,287=>600,288=>600,289=>600,290=>600,291=>600,292=>600,293=>600,294=>600,295=>600,296=>600,297=>600,298=>600,299=>600,300=>600,301=>600,302=>600,303=>600,304=>600,305=>600,306=>600,307=>600,308=>600,309=>600,310=>600,311=>600,312=>600,313=>600,314=>600,315=>600,316=>600,317=>600,318=>600,319=>600,320=>600,321=>600,322=>600,323=>600,324=>600,325=>600,326=>600,327=>600,328=>600,329=>600,330=>600,331=>600,332=>600,333=>600,334=>600,335=>600,336=>600,337=>600,338=>600,339=>600,340=>600,341=>600,342=>600,343=>600,344=>600,345=>600,346=>600,347=>600,348=>600,349=>600,350=>600,351=>600,352=>600,353=>600,354=>600,355=>600,356=>600,357=>600,358=>600,359=>600,360=>600,361=>600,362=>600,363=>600,364=>600,365=>600,366=>600,367=>600,368=>600,369=>600,370=>600,371=>600,372=>600,373=>600,374=>600,375=>600,376=>600,377=>600,378=>600,379=>600,380=>600,381=>600,382=>600,383=>600,384=>600,385=>600,386=>600,387=>600,388=>600,389=>600,390=>600,391=>600,392=>600,393=>600,394=>600,395=>600,396=>600,397=>600,398=>600,399=>600,400=>600,401=>600,402=>600,403=>600,404=>600,405=>600,406=>600,407=>600,408=>600,409=>600,410=>600,411=>600,412=>600,413=>600,414=>600,415=>600,416=>600,417=>600,418=>600,419=>600,420=>600,421=>600,422=>600,423=>600,424=>600,425=>600,426=>600,427=>600,428=>600,429=>600,430=>600,431=>600,432=>600,433=>600,434=>600,435=>600,436=>600,437=>600,438=>600,439=>600,440=>600,441=>600,442=>600,443=>600,444=>600,445=>600,446=>600,447=>600,448=>600,449=>600,450=>600,451=>600,452=>600,453=>600,454=>600,455=>600,456=>600,457=>600,458=>600,459=>600,460=>600,461=>600,462=>600,463=>600,464=>600,465=>600,466=>600,467=>600,468=>600,469=>600,470=>600,471=>600,472=>600,473=>600,474=>600,475=>600,476=>600,477=>600,478=>600,479=>600,480=>600,481=>600,482=>600,483=>600,484=>600,485=>600,486=>600,487=>600,488=>600,489=>600,490=>600,491=>600,492=>600,493=>600,494=>600,495=>600,496=>600,497=>600,498=>600,499=>600,500=>600,501=>600,502=>600,503=>600,504=>600,505=>600,506=>600,507=>600,508=>600,509=>600,510=>600,511=>600,512=>600,513=>600,514=>600,515=>600,516=>600,517=>600,518=>600,519=>600,520=>600,521=>600,522=>600,523=>600,524=>600,525=>600,526=>600,527=>600,528=>600,529=>600,530=>600,531=>600,532=>600,533=>600,534=>600,535=>600,536=>600,537=>600,538=>600,539=>600,540=>600,541=>600,542=>600,543=>600,544=>600,548=>600,549=>600,550=>600,551=>600,552=>600,553=>600,554=>600,555=>600,556=>600,557=>600,558=>600,559=>600,560=>600,561=>600,562=>600,563=>600,567=>600,592=>600,593=>600,594=>600,595=>600,596=>600,597=>600,598=>600,599=>600,600=>600,601=>600,602=>600,603=>600,604=>600,605=>600,606=>600,607=>600,608=>600,609=>600,610=>600,611=>600,612=>600,613=>600,614=>600,615=>600,616=>600,617=>600,618=>600,619=>600,620=>600,621=>600,622=>600,623=>600,624=>600,625=>600,626=>600,627=>600,628=>600,629=>600,630=>600,631=>600,632=>600,633=>600,634=>600,635=>600,636=>600,637=>600,638=>600,639=>600,640=>600,641=>600,642=>600,643=>600,644=>600,645=>600,646=>600,647=>600,648=>600,649=>600,650=>600,651=>600,652=>600,653=>600,654=>600,655=>600,656=>600,657=>600,658=>600,659=>600,660=>600,661=>600,662=>600,663=>600,664=>600,665=>600,666=>600,667=>600,668=>600,669=>600,670=>600,671=>600,672=>600,673=>600,674=>600,675=>600,676=>600,677=>600,678=>600,679=>600,680=>600,681=>600,682=>600,683=>600,684=>600,685=>600,686=>600,687=>600,688=>600,689=>600,690=>600,691=>600,692=>600,693=>600,694=>600,695=>600,696=>600,697=>600,698=>600,699=>600,700=>600,701=>600,702=>600,703=>600,704=>600,705=>600,706=>600,707=>600,708=>600,709=>600,710=>600,711=>600,712=>600,713=>600,714=>600,715=>600,716=>600,717=>600,718=>600,719=>600,720=>600,721=>600,722=>600,723=>600,724=>600,725=>600,726=>600,727=>600,728=>600,729=>600,730=>600,731=>600,732=>600,733=>600,734=>600,735=>600,736=>600,737=>600,738=>600,739=>600,740=>600,741=>600,742=>600,743=>600,744=>600,745=>600,746=>600,747=>600,748=>600,749=>600,750=>600,751=>600,752=>600,753=>600,754=>600,755=>600,756=>600,757=>600,758=>600,759=>600,760=>600,761=>600,762=>600,763=>600,764=>600,765=>600,766=>600,767=>600,768=>600,769=>600,770=>600,771=>600,772=>600,773=>600,774=>600,775=>600,776=>600,777=>600,778=>600,779=>600,780=>600,781=>600,782=>600,783=>600,784=>600,785=>600,786=>600,787=>600,788=>600,789=>600,790=>600,791=>600,792=>600,793=>600,794=>600,795=>600,796=>600,797=>600,798=>600,799=>600,800=>600,801=>600,802=>600,803=>600,804=>600,805=>600,806=>600,807=>600,808=>600,809=>600,810=>600,811=>600,812=>600,813=>600,814=>600,815=>600,816=>600,817=>600,818=>600,819=>600,820=>600,821=>600,822=>600,823=>600,824=>600,825=>600,826=>600,827=>600,828=>600,829=>600,830=>600,831=>600,832=>600,833=>600,834=>600,835=>600,836=>600,837=>600,838=>600,839=>600,840=>600,841=>600,842=>600,843=>600,844=>600,845=>600,846=>600,847=>600,848=>600,849=>600,850=>600,851=>600,852=>600,853=>600,854=>600,855=>600,856=>600,857=>600,858=>600,859=>600,860=>600,861=>600,862=>600,863=>600,864=>600,865=>600,866=>600,867=>600,868=>600,869=>600,870=>600,871=>600,872=>600,873=>600,874=>600,875=>600,876=>600,877=>600,878=>600,879=>600,884=>600,885=>600,890=>600,894=>600,900=>600,901=>600,902=>600,903=>600,904=>600,905=>600,906=>600,908=>600,910=>600,911=>600,912=>600,913=>600,914=>600,915=>600,916=>600,917=>600,918=>600,919=>600,920=>600,921=>600,922=>600,923=>600,924=>600,925=>600,926=>600,927=>600,928=>600,929=>600,931=>600,932=>600,933=>600,934=>600,935=>600,936=>600,937=>600,938=>600,939=>600,940=>600,941=>600,942=>600,943=>600,944=>600,945=>600,946=>600,947=>600,948=>600,949=>600,950=>600,951=>600,952=>600,953=>600,954=>600,955=>600,956=>600,957=>600,958=>600,959=>600,960=>600,961=>600,962=>600,963=>600,964=>600,965=>600,966=>600,967=>600,968=>600,969=>600,970=>600,971=>600,972=>600,973=>600,974=>600,976=>600,977=>600,978=>600,979=>600,980=>600,981=>600,982=>600,986=>600,987=>600,988=>600,989=>600,1008=>600,1009=>600,1012=>600,1013=>600,1024=>600,1025=>600,1026=>600,1027=>600,1028=>600,1029=>600,1030=>600,1031=>600,1032=>600,1033=>600,1034=>600,1035=>600,1036=>600,1037=>600,1038=>600,1039=>600,1040=>600,1041=>600,1042=>600,1043=>600,1044=>600,1045=>600,1046=>600,1047=>600,1048=>600,1049=>600,1050=>600,1051=>600,1052=>600,1053=>600,1054=>600,1055=>600,1056=>600,1057=>600,1058=>600,1059=>600,1060=>600,1061=>600,1062=>600,1063=>600,1064=>600,1065=>600,1066=>600,1067=>600,1068=>600,1069=>600,1070=>600,1071=>600,1072=>600,1073=>600,1074=>600,1075=>600,1076=>600,1077=>600,1078=>600,1079=>600,1080=>600,1081=>600,1082=>600,1083=>600,1084=>600,1085=>600,1086=>600,1087=>600,1088=>600,1089=>600,1090=>600,1091=>600,1092=>600,1093=>600,1094=>600,1095=>600,1096=>600,1097=>600,1098=>600,1099=>600,1100=>600,1101=>600,1102=>600,1103=>600,1104=>600,1105=>600,1106=>600,1107=>600,1108=>600,1109=>600,1110=>600,1111=>600,1112=>600,1113=>600,1114=>600,1115=>600,1116=>600,1117=>600,1118=>600,1119=>600,1120=>600,1121=>600,1122=>600,1123=>600,1124=>600,1125=>600,1126=>600,1127=>600,1128=>600,1129=>600,1130=>600,1131=>600,1132=>600,1133=>600,1134=>600,1135=>600,1136=>600,1137=>600,1138=>600,1139=>600,1140=>600,1141=>600,1142=>600,1143=>600,1144=>600,1145=>600,1146=>600,1147=>600,1148=>600,1149=>600,1150=>600,1151=>600,1155=>600,1156=>600,1157=>600,1158=>600,1159=>600,1162=>600,1163=>600,1164=>600,1165=>600,1166=>600,1167=>600,1168=>600,1169=>600,1170=>600,1171=>600,1172=>600,1173=>600,1174=>600,1175=>600,1176=>600,1177=>600,1178=>600,1179=>600,1180=>600,1181=>600,1182=>600,1183=>600,1184=>600,1185=>600,1186=>600,1187=>600,1188=>600,1189=>600,1190=>600,1191=>600,1192=>600,1193=>600,1194=>600,1195=>600,1196=>600,1197=>600,1198=>600,1199=>600,1200=>600,1201=>600,1202=>600,1203=>600,1204=>600,1205=>600,1206=>600,1207=>600,1208=>600,1209=>600,1210=>600,1211=>600,1212=>600,1213=>600,1214=>600,1215=>600,1216=>600,1217=>600,1218=>600,1219=>600,1220=>600,1221=>600,1222=>600,1223=>600,1224=>600,1225=>600,1226=>600,1227=>600,1228=>600,1229=>600,1230=>600,1231=>600,1232=>600,1233=>600,1234=>600,1235=>600,1236=>600,1237=>600,1238=>600,1239=>600,1240=>600,1241=>600,1242=>600,1243=>600,1244=>600,1245=>600,1246=>600,1247=>600,1248=>600,1249=>600,1250=>600,1251=>600,1252=>600,1253=>600,1254=>600,1255=>600,1256=>600,1257=>600,1258=>600,1259=>600,1260=>600,1261=>600,1262=>600,1263=>600,1264=>600,1265=>600,1266=>600,1267=>600,1268=>600,1269=>600,1270=>600,1271=>600,1272=>600,1273=>600,1274=>600,1275=>600,1276=>600,1277=>600,1278=>600,1279=>600,1296=>600,1297=>600,1298=>600,1299=>600,1306=>600,1307=>600,1308=>600,1309=>600,1310=>600,1311=>600,1316=>600,1317=>600,1318=>600,1319=>600,1329=>600,1330=>600,1331=>600,1332=>600,1333=>600,1334=>600,1335=>600,1336=>600,1337=>600,1338=>600,1339=>600,1340=>600,1341=>600,1342=>600,1343=>600,1344=>600,1345=>600,1346=>600,1347=>600,1348=>600,1349=>600,1350=>600,1351=>600,1352=>600,1353=>600,1354=>600,1355=>600,1356=>600,1357=>600,1358=>600,1359=>600,1360=>600,1361=>600,1362=>600,1363=>600,1364=>600,1365=>600,1366=>600,1369=>600,1370=>600,1371=>600,1372=>600,1373=>600,1374=>600,1375=>600,1377=>600,1378=>600,1379=>600,1380=>600,1381=>600,1382=>600,1383=>600,1384=>600,1385=>600,1386=>600,1387=>600,1388=>600,1389=>600,1390=>600,1391=>600,1392=>600,1393=>600,1394=>600,1395=>600,1396=>600,1397=>600,1398=>600,1399=>600,1400=>600,1401=>600,1402=>600,1403=>600,1404=>600,1405=>600,1406=>600,1407=>600,1408=>600,1409=>600,1410=>600,1411=>600,1412=>600,1413=>600,1414=>600,1415=>600,1417=>600,1418=>600,1423=>600,1456=>600,1457=>600,1458=>600,1459=>600,1460=>600,1461=>600,1462=>600,1463=>600,1464=>600,1465=>600,1466=>600,1467=>600,1468=>600,1469=>600,1470=>600,1471=>600,1472=>600,1473=>600,1474=>600,1475=>600,1476=>600,1477=>600,1478=>600,1479=>600,1488=>600,1489=>600,1490=>600,1491=>600,1492=>600,1493=>600,1494=>600,1495=>600,1496=>600,1497=>600,1498=>600,1499=>600,1500=>600,1501=>600,1502=>600,1503=>600,1504=>600,1505=>600,1506=>600,1507=>600,1508=>600,1509=>600,1510=>600,1511=>600,1512=>600,1513=>600,1514=>600,1520=>600,1521=>600,1522=>600,1523=>600,1524=>600,1542=>600,1543=>600,1544=>600,1545=>600,1546=>600,1547=>600,1548=>600,1549=>600,1550=>600,1551=>600,1563=>600,1566=>600,1567=>600,1568=>600,1569=>600,1570=>600,1571=>600,1572=>600,1573=>600,1574=>600,1575=>600,1576=>600,1577=>600,1578=>600,1579=>600,1580=>600,1581=>600,1582=>600,1583=>600,1584=>600,1585=>600,1586=>600,1587=>600,1588=>600,1589=>600,1590=>600,1591=>600,1592=>600,1593=>600,1594=>600,1595=>600,1596=>600,1597=>600,1598=>600,1599=>600,1600=>600,1601=>600,1602=>600,1603=>600,1604=>600,1605=>600,1606=>600,1607=>600,1608=>600,1609=>600,1610=>600,1611=>600,1612=>600,1613=>600,1614=>600,1615=>600,1616=>600,1617=>600,1618=>600,1619=>600,1620=>600,1621=>600,1622=>600,1623=>600,1625=>600,1626=>600,1627=>600,1628=>600,1629=>600,1630=>600,1631=>600,1632=>600,1633=>600,1634=>600,1635=>600,1636=>600,1637=>600,1638=>600,1639=>600,1640=>600,1641=>600,1642=>600,1643=>600,1644=>600,1645=>600,1646=>600,1647=>600,1648=>600,1649=>600,1650=>600,1651=>600,1652=>600,1653=>600,1654=>600,1655=>600,1656=>600,1657=>600,1658=>600,1659=>600,1660=>600,1661=>600,1662=>600,1663=>600,1664=>600,1665=>600,1666=>600,1667=>600,1668=>600,1669=>600,1670=>600,1671=>600,1672=>600,1673=>600,1674=>600,1675=>600,1676=>600,1677=>600,1678=>600,1679=>600,1680=>600,1681=>600,1682=>600,1683=>600,1684=>600,1685=>600,1686=>600,1687=>600,1688=>600,1689=>600,1690=>600,1691=>600,1692=>600,1693=>600,1694=>600,1695=>600,1696=>600,1697=>600,1698=>600,1699=>600,1700=>600,1701=>600,1702=>600,1703=>600,1704=>600,1705=>600,1706=>600,1707=>600,1708=>600,1709=>600,1710=>600,1711=>600,1712=>600,1713=>600,1714=>600,1715=>600,1716=>600,1717=>600,1718=>600,1719=>600,1720=>600,1721=>600,1722=>600,1723=>600,1724=>600,1725=>600,1726=>600,1727=>600,1728=>600,1729=>600,1730=>600,1731=>600,1732=>600,1733=>600,1734=>600,1735=>600,1736=>600,1737=>600,1738=>600,1739=>600,1740=>600,1741=>600,1742=>600,1743=>600,1744=>600,1745=>600,1746=>600,1747=>600,1748=>600,1749=>600,1774=>600,1775=>600,1776=>600,1777=>600,1778=>600,1779=>600,1780=>600,1781=>600,1782=>600,1783=>600,1784=>600,1785=>600,1786=>600,1787=>600,1788=>600,1789=>600,1790=>600,1791=>600,4304=>600,4305=>600,4306=>600,4307=>600,4308=>600,4309=>600,4310=>600,4311=>600,4312=>600,4313=>600,4314=>600,4315=>600,4316=>600,4317=>600,4318=>600,4319=>600,4320=>600,4321=>600,4322=>600,4323=>600,4324=>600,4325=>600,4326=>600,4327=>600,4328=>600,4329=>600,4330=>600,4331=>600,4332=>600,4333=>600,4334=>600,4335=>600,4336=>600,4337=>600,4338=>600,4339=>600,4340=>600,4341=>600,4345=>600,4347=>600,4348=>600,5024=>600,5025=>600,5026=>600,5027=>600,5028=>600,5029=>600,5030=>600,5031=>600,5032=>600,5033=>600,5034=>600,5035=>600,5036=>600,5037=>600,5038=>600,5039=>600,5040=>600,5041=>600,5042=>600,5043=>600,5044=>600,5045=>600,5046=>600,5047=>600,5048=>600,5049=>600,5050=>600,5051=>600,5052=>600,5053=>600,5054=>600,5055=>600,5056=>600,5057=>600,5058=>600,5059=>600,5060=>600,5061=>600,5062=>600,5063=>600,5064=>600,5065=>600,5066=>600,5067=>600,5068=>600,5069=>600,5070=>600,5071=>600,5072=>600,5073=>600,5074=>600,5075=>600,5076=>600,5077=>600,5078=>600,5079=>600,5080=>600,5081=>600,5082=>600,5083=>600,5084=>600,5085=>600,5086=>600,5087=>600,5088=>600,5089=>600,5090=>600,5091=>600,5092=>600,5093=>600,5094=>600,5095=>600,5096=>600,5097=>600,5098=>600,5099=>600,5100=>600,5101=>600,5102=>600,5103=>600,5104=>600,5105=>600,5106=>600,5107=>600,5108=>600,5792=>600,5793=>600,5794=>600,5795=>600,5796=>600,5797=>600,5798=>600,5799=>600,5800=>600,5801=>600,5802=>600,5803=>600,5804=>600,5805=>600,5806=>600,5807=>600,5808=>600,5809=>600,5810=>600,5811=>600,5812=>600,5813=>600,5814=>600,5815=>600,5816=>600,5817=>600,5818=>600,5819=>600,5820=>600,5821=>600,5822=>600,5823=>600,5824=>600,5825=>600,5826=>600,5827=>600,5828=>600,5829=>600,5830=>600,5831=>600,5832=>600,5833=>600,5834=>600,5835=>600,5836=>600,5837=>600,5838=>600,5839=>600,5840=>600,5841=>600,5842=>600,5843=>600,5844=>600,5845=>600,5846=>600,5847=>600,5848=>600,5849=>600,5850=>600,5851=>600,5852=>600,5853=>600,5854=>600,5855=>600,5856=>600,5857=>600,5858=>600,5859=>600,5860=>600,5861=>600,5862=>600,5863=>600,5864=>600,5865=>600,5866=>600,5867=>600,5868=>600,5869=>600,5870=>600,5871=>600,5872=>600,7680=>600,7681=>600,7682=>600,7683=>600,7684=>600,7685=>600,7686=>600,7687=>600,7688=>600,7689=>600,7690=>600,7691=>600,7692=>600,7693=>600,7694=>600,7695=>600,7696=>600,7697=>600,7698=>600,7699=>600,7700=>600,7701=>600,7702=>600,7703=>600,7704=>600,7705=>600,7706=>600,7707=>600,7708=>600,7709=>600,7710=>600,7711=>600,7712=>600,7713=>600,7714=>600,7715=>600,7716=>600,7717=>600,7718=>600,7719=>600,7720=>600,7721=>600,7722=>600,7723=>600,7724=>600,7725=>600,7726=>600,7727=>600,7728=>600,7729=>600,7730=>600,7731=>600,7732=>600,7733=>600,7734=>600,7735=>600,7736=>600,7737=>600,7738=>600,7739=>600,7740=>600,7741=>600,7742=>600,7743=>600,7744=>600,7745=>600,7746=>600,7747=>600,7748=>600,7749=>600,7750=>600,7751=>600,7752=>600,7753=>600,7754=>600,7755=>600,7756=>600,7757=>600,7758=>600,7759=>600,7760=>600,7761=>600,7762=>600,7763=>600,7764=>600,7765=>600,7766=>600,7767=>600,7768=>600,7769=>600,7770=>600,7771=>600,7772=>600,7773=>600,7774=>600,7775=>600,7776=>600,7777=>600,7778=>600,7779=>600,7780=>600,7781=>600,7782=>600,7783=>600,7784=>600,7785=>600,7786=>600,7787=>600,7788=>600,7789=>600,7790=>600,7791=>600,7792=>600,7793=>600,7794=>600,7795=>600,7796=>600,7797=>600,7798=>600,7799=>600,7800=>600,7801=>600,7802=>600,7803=>600,7804=>600,7805=>600,7806=>600,7807=>600,7808=>600,7809=>600,7810=>600,7811=>600,7812=>600,7813=>600,7814=>600,7815=>600,7816=>600,7817=>600,7818=>600,7819=>600,7820=>600,7821=>600,7822=>600,7823=>600,7824=>600,7825=>600,7826=>600,7827=>600,7828=>600,7829=>600,7830=>600,7831=>600,7832=>600,7833=>600,7834=>600,7835=>600,7840=>600,7841=>600,7842=>600,7843=>600,7844=>600,7845=>600,7846=>600,7847=>600,7848=>600,7849=>600,7850=>600,7851=>600,7852=>600,7853=>600,7854=>600,7855=>600,7856=>600,7857=>600,7858=>600,7859=>600,7860=>600,7861=>600,7862=>600,7863=>600,7864=>600,7865=>600,7866=>600,7867=>600,7868=>600,7869=>600,7870=>600,7871=>600,7872=>600,7873=>600,7874=>600,7875=>600,7876=>600,7877=>600,7878=>600,7879=>600,7880=>600,7881=>600,7882=>600,7883=>600,7884=>600,7885=>600,7886=>600,7887=>600,7888=>600,7889=>600,7890=>600,7891=>600,7892=>600,7893=>600,7894=>600,7895=>600,7896=>600,7897=>600,7898=>600,7899=>600,7900=>600,7901=>600,7902=>600,7903=>600,7904=>600,7905=>600,7906=>600,7907=>600,7908=>600,7909=>600,7910=>600,7911=>600,7912=>600,7913=>600,7914=>600,7915=>600,7916=>600,7917=>600,7918=>600,7919=>600,7920=>600,7921=>600,7922=>600,7923=>600,7924=>600,7925=>600,7926=>600,7927=>600,7928=>600,7929=>600,7936=>600,7937=>600,7938=>600,7939=>600,7940=>600,7941=>600,7942=>600,7943=>600,7944=>600,7945=>600,7946=>600,7947=>600,7948=>600,7949=>600,7950=>600,7951=>600,7952=>600,7953=>600,7954=>600,7955=>600,7956=>600,7957=>600,7960=>600,7961=>600,7962=>600,7963=>600,7964=>600,7965=>600,7968=>600,7969=>600,7970=>600,7971=>600,7972=>600,7973=>600,7974=>600,7975=>600,7976=>600,7977=>600,7978=>600,7979=>600,7980=>600,7981=>600,7982=>600,7983=>600,7984=>600,7985=>600,7986=>600,7987=>600,7988=>600,7989=>600,7990=>600,7991=>600,7992=>600,7993=>600,7994=>600,7995=>600,7996=>600,7997=>600,7998=>600,7999=>600,8000=>600,8001=>600,8002=>600,8003=>600,8004=>600,8005=>600,8008=>600,8009=>600,8010=>600,8011=>600,8012=>600,8013=>600,8016=>600,8017=>600,8018=>600,8019=>600,8020=>600,8021=>600,8022=>600,8023=>600,8025=>600,8027=>600,8029=>600,8031=>600,8032=>600,8033=>600,8034=>600,8035=>600,8036=>600,8037=>600,8038=>600,8039=>600,8040=>600,8041=>600,8042=>600,8043=>600,8044=>600,8045=>600,8046=>600,8047=>600,8048=>600,8049=>600,8050=>600,8051=>600,8052=>600,8053=>600,8054=>600,8055=>600,8056=>600,8057=>600,8058=>600,8059=>600,8060=>600,8061=>600,8064=>600,8065=>600,8066=>600,8067=>600,8068=>600,8069=>600,8070=>600,8071=>600,8072=>600,8073=>600,8074=>600,8075=>600,8076=>600,8077=>600,8078=>600,8079=>600,8080=>600,8081=>600,8082=>600,8083=>600,8084=>600,8085=>600,8086=>600,8087=>600,8088=>600,8089=>600,8090=>600,8091=>600,8092=>600,8093=>600,8094=>600,8095=>600,8096=>600,8097=>600,8098=>600,8099=>600,8100=>600,8101=>600,8102=>600,8103=>600,8104=>600,8105=>600,8106=>600,8107=>600,8108=>600,8109=>600,8110=>600,8111=>600,8112=>600,8113=>600,8114=>600,8115=>600,8116=>600,8118=>600,8119=>600,8120=>600,8121=>600,8122=>600,8123=>600,8124=>600,8125=>600,8126=>600,8127=>600,8128=>600,8129=>600,8130=>600,8131=>600,8132=>600,8134=>600,8135=>600,8136=>600,8137=>600,8138=>600,8139=>600,8140=>600,8141=>600,8142=>600,8143=>600,8144=>600,8145=>600,8146=>600,8147=>600,8150=>600,8151=>600,8152=>600,8153=>600,8154=>600,8155=>600,8157=>600,8158=>600,8159=>600,8160=>600,8161=>600,8162=>600,8163=>600,8164=>600,8165=>600,8166=>600,8167=>600,8168=>600,8169=>600,8170=>600,8171=>600,8172=>600,8173=>600,8174=>600,8175=>600,8178=>600,8179=>600,8180=>600,8182=>600,8183=>600,8184=>600,8185=>600,8186=>600,8187=>600,8188=>600,8189=>600,8190=>600,8192=>600,8193=>600,8194=>600,8195=>600,8196=>600,8197=>600,8198=>600,8199=>600,8200=>600,8201=>600,8202=>600,8203=>600,8204=>600,8205=>600,8206=>600,8207=>600,8208=>600,8209=>600,8210=>600,8211=>600,8212=>600,8213=>600,8214=>600,8215=>600,8216=>600,8217=>600,8218=>600,8219=>600,8220=>600,8221=>600,8222=>600,8223=>600,8224=>600,8225=>600,8226=>600,8227=>600,8228=>600,8229=>600,8230=>600,8231=>600,8232=>600,8233=>600,8234=>600,8235=>600,8236=>600,8237=>600,8238=>600,8239=>600,8240=>600,8241=>600,8242=>600,8243=>600,8244=>600,8245=>600,8246=>600,8247=>600,8248=>600,8249=>600,8250=>600,8251=>600,8252=>600,8253=>600,8254=>600,8255=>600,8256=>600,8257=>600,8258=>600,8259=>600,8260=>600,8261=>600,8262=>600,8263=>600,8264=>600,8265=>600,8266=>600,8267=>600,8268=>600,8269=>600,8270=>600,8271=>600,8272=>600,8273=>600,8274=>600,8275=>600,8276=>600,8277=>600,8278=>600,8279=>600,8280=>600,8281=>600,8282=>600,8283=>600,8284=>600,8285=>600,8286=>600,8287=>600,8288=>600,8289=>600,8290=>600,8291=>600,8292=>600,8304=>600,8305=>600,8308=>600,8309=>600,8310=>600,8311=>600,8312=>600,8313=>600,8314=>600,8315=>600,8316=>600,8317=>600,8318=>600,8319=>600,8320=>600,8321=>600,8322=>600,8323=>600,8324=>600,8325=>600,8326=>600,8327=>600,8328=>600,8329=>600,8330=>600,8331=>600,8332=>600,8333=>600,8334=>600,8336=>600,8337=>600,8338=>600,8339=>600,8340=>600,8353=>600,8354=>600,8355=>600,8356=>600,8357=>600,8358=>600,8359=>600,8360=>600,8361=>600,8362=>600,8363=>600,8364=>600,8365=>600,8366=>600,8367=>600,8368=>600,8369=>600,8370=>600,8371=>600,8372=>600,8373=>600,8376=>600,8377=>600,8400=>600,8401=>600,8402=>600,8406=>600,8407=>600,8411=>600,8412=>600,8413=>600,8414=>600,8415=>600,8416=>600,8417=>600,8418=>600,8419=>600,8421=>600,8422=>600,8424=>600,8426=>600,8427=>600,8428=>600,8429=>600,8430=>600,8431=>600,8448=>600,8449=>600,8450=>600,8451=>600,8452=>600,8453=>600,8454=>600,8455=>600,8456=>600,8457=>600,8461=>600,8462=>600,8463=>600,8464=>600,8465=>600,8466=>600,8467=>600,8468=>600,8469=>600,8470=>600,8471=>600,8472=>600,8473=>600,8474=>600,8476=>600,8477=>600,8478=>600,8480=>600,8481=>600,8482=>600,8484=>600,8486=>600,8487=>600,8489=>600,8490=>600,8491=>600,8494=>600,8498=>600,8501=>600,8502=>600,8503=>600,8504=>600,8505=>600,8506=>600,8507=>600,8513=>600,8514=>600,8515=>600,8516=>600,8523=>600,8525=>600,8526=>600,8531=>600,8532=>600,8533=>600,8534=>600,8535=>600,8536=>600,8537=>600,8538=>600,8539=>600,8540=>600,8541=>600,8542=>600,8543=>600,8544=>600,8545=>600,8546=>600,8547=>600,8548=>600,8549=>600,8550=>600,8551=>600,8552=>600,8553=>600,8554=>600,8555=>600,8556=>600,8557=>600,8558=>600,8559=>600,8560=>600,8561=>600,8562=>600,8563=>600,8564=>600,8565=>600,8566=>600,8567=>600,8568=>600,8569=>600,8570=>600,8571=>600,8572=>600,8573=>600,8574=>600,8575=>600,8592=>600,8593=>600,8594=>600,8595=>600,8596=>600,8597=>600,8598=>600,8599=>600,8600=>600,8601=>600,8602=>600,8603=>600,8604=>600,8605=>600,8606=>600,8607=>600,8608=>600,8609=>600,8610=>600,8611=>600,8612=>600,8613=>600,8614=>600,8615=>600,8616=>600,8617=>600,8618=>600,8619=>600,8620=>600,8621=>600,8622=>600,8623=>600,8624=>600,8625=>600,8626=>600,8627=>600,8628=>600,8629=>600,8630=>600,8631=>600,8632=>600,8633=>600,8634=>600,8635=>600,8636=>600,8637=>600,8638=>600,8639=>600,8640=>600,8641=>600,8642=>600,8643=>600,8644=>600,8645=>600,8646=>600,8647=>600,8648=>600,8649=>600,8650=>600,8651=>600,8652=>600,8653=>600,8654=>600,8655=>600,8656=>600,8657=>600,8658=>600,8659=>600,8660=>600,8661=>600,8668=>600,8669=>600,8678=>600,8679=>600,8680=>600,8681=>600,8691=>600,8704=>600,8705=>600,8706=>600,8707=>600,8708=>600,8709=>600,8710=>600,8711=>600,8712=>600,8713=>600,8714=>600,8715=>600,8716=>600,8717=>600,8718=>600,8719=>600,8720=>600,8721=>600,8722=>600,8723=>600,8724=>600,8725=>600,8726=>600,8727=>600,8728=>600,8729=>600,8730=>600,8731=>600,8732=>600,8733=>600,8734=>600,8735=>600,8736=>600,8737=>600,8738=>600,8739=>600,8740=>600,8741=>600,8742=>600,8743=>600,8744=>600,8745=>600,8746=>600,8747=>600,8748=>600,8749=>600,8750=>600,8751=>600,8752=>600,8753=>600,8754=>600,8755=>600,8756=>600,8757=>600,8758=>600,8759=>600,8760=>600,8761=>600,8762=>600,8763=>600,8764=>600,8765=>600,8766=>600,8767=>600,8768=>600,8769=>600,8770=>600,8771=>600,8772=>600,8773=>600,8774=>600,8775=>600,8776=>600,8777=>600,8778=>600,8779=>600,8780=>600,8781=>600,8782=>600,8783=>600,8784=>600,8785=>600,8786=>600,8787=>600,8788=>600,8789=>600,8790=>600,8791=>600,8792=>600,8793=>600,8794=>600,8795=>600,8796=>600,8797=>600,8798=>600,8799=>600,8800=>600,8801=>600,8802=>600,8803=>600,8804=>600,8805=>600,8806=>600,8807=>600,8808=>600,8809=>600,8810=>600,8811=>600,8812=>600,8813=>600,8814=>600,8815=>600,8816=>600,8817=>600,8818=>600,8819=>600,8820=>600,8821=>600,8822=>600,8823=>600,8824=>600,8825=>600,8826=>600,8827=>600,8828=>600,8829=>600,8830=>600,8831=>600,8832=>600,8833=>600,8834=>600,8835=>600,8836=>600,8837=>600,8838=>600,8839=>600,8840=>600,8841=>600,8842=>600,8843=>600,8844=>600,8845=>600,8846=>600,8847=>600,8848=>600,8849=>600,8850=>600,8851=>600,8852=>600,8853=>600,8854=>600,8855=>600,8856=>600,8857=>600,8858=>600,8859=>600,8860=>600,8861=>600,8862=>600,8863=>600,8864=>600,8865=>600,8866=>600,8867=>600,8868=>600,8869=>600,8870=>600,8871=>600,8872=>600,8873=>600,8874=>600,8875=>600,8876=>600,8877=>600,8878=>600,8879=>600,8880=>600,8881=>600,8882=>600,8883=>600,8884=>600,8885=>600,8886=>600,8887=>600,8888=>600,8889=>600,8890=>600,8891=>600,8892=>600,8893=>600,8894=>600,8895=>600,8896=>600,8897=>600,8898=>600,8899=>600,8900=>600,8901=>600,8902=>600,8903=>600,8904=>600,8905=>600,8906=>600,8907=>600,8908=>600,8909=>600,8910=>600,8911=>600,8912=>600,8913=>600,8914=>600,8915=>600,8916=>600,8917=>600,8918=>600,8919=>600,8920=>600,8921=>600,8922=>600,8923=>600,8924=>600,8925=>600,8926=>600,8927=>600,8928=>600,8929=>600,8930=>600,8931=>600,8932=>600,8933=>600,8934=>600,8935=>600,8936=>600,8937=>600,8938=>600,8939=>600,8940=>600,8941=>600,8942=>600,8943=>600,8944=>600,8945=>600,8960=>600,8962=>600,8963=>600,8964=>600,8965=>600,8966=>600,8968=>600,8969=>600,8970=>600,8971=>600,8972=>600,8973=>600,8974=>600,8975=>600,8976=>600,8978=>600,8980=>600,8981=>600,8984=>600,8985=>600,8988=>600,8989=>600,8990=>600,8991=>600,8992=>600,8993=>600,8994=>600,8995=>600,8996=>600,8997=>600,8998=>600,8999=>600,9001=>600,9002=>600,9003=>600,9004=>600,9014=>600,9015=>600,9016=>600,9017=>600,9018=>600,9019=>600,9020=>600,9021=>600,9022=>600,9023=>600,9024=>600,9025=>600,9026=>600,9027=>600,9028=>600,9029=>600,9030=>600,9031=>600,9032=>600,9033=>600,9034=>600,9035=>600,9036=>600,9037=>600,9038=>600,9039=>600,9040=>600,9041=>600,9042=>600,9043=>600,9044=>600,9045=>600,9046=>600,9047=>600,9048=>600,9049=>600,9050=>600,9051=>600,9052=>600,9053=>600,9054=>600,9055=>600,9056=>600,9057=>600,9058=>600,9059=>600,9060=>600,9061=>600,9062=>600,9063=>600,9064=>600,9065=>600,9066=>600,9067=>600,9068=>600,9069=>600,9070=>600,9071=>600,9072=>600,9073=>600,9074=>600,9075=>600,9076=>600,9077=>600,9078=>600,9079=>600,9080=>600,9081=>600,9082=>600,9084=>600,9085=>600,9086=>600,9087=>600,9088=>600,9089=>600,9090=>600,9091=>600,9092=>600,9093=>600,9094=>600,9095=>600,9096=>600,9097=>600,9098=>600,9099=>600,9100=>600,9101=>600,9102=>600,9103=>600,9104=>600,9105=>600,9106=>600,9107=>600,9108=>600,9109=>600,9110=>600,9111=>600,9112=>600,9113=>600,9114=>600,9115=>600,9116=>600,9117=>600,9118=>600,9119=>600,9120=>600,9121=>600,9122=>600,9123=>600,9124=>600,9125=>600,9126=>600,9127=>600,9128=>600,9129=>600,9130=>600,9131=>600,9132=>600,9133=>600,9134=>600,9135=>600,9136=>600,9137=>600,9138=>600,9139=>600,9140=>600,9141=>600,9142=>600,9143=>600,9146=>600,9147=>600,9148=>600,9149=>600,9150=>600,9151=>600,9152=>600,9153=>600,9154=>600,9155=>600,9156=>600,9157=>600,9158=>600,9159=>600,9160=>600,9161=>600,9162=>600,9163=>600,9164=>600,9165=>600,9166=>600,9167=>600,9178=>600,9179=>600,9182=>600,9183=>600,9186=>600,9187=>600,9188=>600,9189=>600,9190=>600,9216=>600,9217=>600,9218=>600,9219=>600,9220=>600,9221=>600,9222=>600,9223=>600,9224=>600,9225=>600,9226=>600,9227=>600,9228=>600,9229=>600,9230=>600,9231=>600,9232=>600,9233=>600,9234=>600,9235=>600,9236=>600,9237=>600,9238=>600,9239=>600,9240=>600,9241=>600,9242=>600,9243=>600,9244=>600,9245=>600,9246=>600,9247=>600,9248=>600,9249=>600,9250=>600,9251=>600,9252=>600,9253=>600,9254=>600,9280=>600,9281=>600,9282=>600,9283=>600,9284=>600,9285=>600,9286=>600,9287=>600,9288=>600,9289=>600,9290=>600,9312=>600,9313=>600,9314=>600,9315=>600,9316=>600,9317=>600,9318=>600,9319=>600,9320=>600,9321=>600,9472=>600,9473=>600,9474=>600,9475=>600,9476=>600,9477=>600,9478=>600,9479=>600,9480=>600,9481=>600,9482=>600,9483=>600,9484=>600,9485=>600,9486=>600,9487=>600,9488=>600,9489=>600,9490=>600,9491=>600,9492=>600,9493=>600,9494=>600,9495=>600,9496=>600,9497=>600,9498=>600,9499=>600,9500=>600,9501=>600,9502=>600,9503=>600,9504=>600,9505=>600,9506=>600,9507=>600,9508=>600,9509=>600,9510=>600,9511=>600,9512=>600,9513=>600,9514=>600,9515=>600,9516=>600,9517=>600,9518=>600,9519=>600,9520=>600,9521=>600,9522=>600,9523=>600,9524=>600,9525=>600,9526=>600,9527=>600,9528=>600,9529=>600,9530=>600,9531=>600,9532=>600,9533=>600,9534=>600,9535=>600,9536=>600,9537=>600,9538=>600,9539=>600,9540=>600,9541=>600,9542=>600,9543=>600,9544=>600,9545=>600,9546=>600,9547=>600,9548=>600,9549=>600,9550=>600,9551=>600,9552=>600,9553=>600,9554=>600,9555=>600,9556=>600,9557=>600,9558=>600,9559=>600,9560=>600,9561=>600,9562=>600,9563=>600,9564=>600,9565=>600,9566=>600,9567=>600,9568=>600,9569=>600,9570=>600,9571=>600,9572=>600,9573=>600,9574=>600,9575=>600,9576=>600,9577=>600,9578=>600,9579=>600,9580=>600,9581=>600,9582=>600,9583=>600,9584=>600,9585=>600,9586=>600,9587=>600,9588=>600,9589=>600,9590=>600,9591=>600,9592=>600,9593=>600,9594=>600,9595=>600,9596=>600,9597=>600,9598=>600,9599=>600,9600=>600,9601=>600,9602=>600,9603=>600,9604=>600,9605=>600,9606=>600,9607=>600,9608=>600,9609=>600,9610=>600,9611=>600,9612=>600,9613=>600,9614=>600,9615=>600,9616=>600,9617=>600,9618=>600,9619=>600,9620=>600,9621=>600,9622=>600,9623=>600,9624=>600,9625=>600,9626=>600,9627=>600,9628=>600,9629=>600,9630=>600,9631=>600,9632=>600,9633=>600,9634=>600,9635=>600,9636=>600,9637=>600,9638=>600,9639=>600,9640=>600,9641=>600,9642=>600,9643=>600,9644=>600,9645=>600,9646=>600,9647=>600,9648=>600,9649=>600,9650=>600,9651=>600,9652=>600,9653=>600,9654=>600,9655=>600,9656=>600,9657=>600,9658=>600,9659=>600,9660=>600,9661=>600,9662=>600,9663=>600,9664=>600,9665=>600,9666=>600,9667=>600,9668=>600,9669=>600,9670=>600,9671=>600,9672=>600,9673=>600,9674=>600,9675=>600,9676=>600,9677=>600,9678=>600,9679=>600,9680=>600,9681=>600,9682=>600,9683=>600,9684=>600,9685=>600,9686=>600,9687=>600,9688=>600,9689=>600,9690=>600,9691=>600,9692=>600,9693=>600,9694=>600,9695=>600,9696=>600,9697=>600,9698=>600,9699=>600,9700=>600,9701=>600,9702=>600,9703=>600,9704=>600,9705=>600,9706=>600,9707=>600,9708=>600,9709=>600,9710=>600,9711=>600,9712=>600,9713=>600,9714=>600,9715=>600,9716=>600,9717=>600,9718=>600,9719=>600,9720=>600,9721=>600,9722=>600,9723=>600,9724=>600,9725=>600,9726=>600,9727=>600,9728=>600,9729=>600,9730=>600,9731=>600,9732=>600,9733=>600,9734=>600,9735=>600,9736=>600,9737=>600,9744=>600,9745=>600,9746=>600,9747=>600,9748=>600,9754=>600,9755=>600,9756=>600,9757=>600,9758=>600,9759=>600,9766=>600,9767=>600,9768=>600,9769=>600,9774=>600,9775=>600,9776=>600,9777=>600,9778=>600,9779=>600,9780=>600,9781=>600,9782=>600,9783=>600,9784=>600,9785=>600,9786=>600,9787=>600,9788=>600,9789=>600,9790=>600,9791=>600,9792=>600,9793=>600,9794=>600,9795=>600,9796=>600,9797=>600,9798=>600,9799=>600,9800=>600,9801=>600,9802=>600,9803=>600,9804=>600,9805=>600,9806=>600,9807=>600,9808=>600,9809=>600,9810=>600,9811=>600,9824=>600,9825=>600,9826=>600,9827=>600,9828=>600,9829=>600,9830=>600,9831=>600,9833=>600,9834=>600,9835=>600,9836=>600,9837=>600,9838=>600,9839=>600,9856=>600,9857=>600,9858=>600,9859=>600,9860=>600,9861=>600,10176=>600,10177=>600,10178=>600,10179=>600,10180=>600,10181=>600,10182=>600,10183=>600,10184=>600,10185=>600,10186=>600,10188=>600,10192=>600,10193=>600,10194=>600,10195=>600,10196=>600,10197=>600,10198=>600,10199=>600,10212=>600,10213=>600,10214=>600,10215=>600,10216=>600,10217=>600,10218=>600,10219=>600,10226=>600,10227=>600,10229=>600,10230=>600,10231=>600,10232=>600,10233=>600,10234=>600,10235=>600,10236=>600,10240=>600,10241=>600,10242=>600,10243=>600,10244=>600,10245=>600,10246=>600,10247=>600,10248=>600,10249=>600,10250=>600,10251=>600,10252=>600,10253=>600,10254=>600,10255=>600,10256=>600,10257=>600,10258=>600,10259=>600,10260=>600,10261=>600,10262=>600,10263=>600,10264=>600,10265=>600,10266=>600,10267=>600,10268=>600,10269=>600,10270=>600,10271=>600,10272=>600,10273=>600,10274=>600,10275=>600,10276=>600,10277=>600,10278=>600,10279=>600,10280=>600,10281=>600,10282=>600,10283=>600,10284=>600,10285=>600,10286=>600,10287=>600,10288=>600,10289=>600,10290=>600,10291=>600,10292=>600,10293=>600,10294=>600,10295=>600,10296=>600,10297=>600,10298=>600,10299=>600,10300=>600,10301=>600,10302=>600,10303=>600,10304=>600,10305=>600,10306=>600,10307=>600,10308=>600,10309=>600,10310=>600,10311=>600,10312=>600,10313=>600,10314=>600,10315=>600,10316=>600,10317=>600,10318=>600,10319=>600,10320=>600,10321=>600,10322=>600,10323=>600,10324=>600,10325=>600,10326=>600,10327=>600,10328=>600,10329=>600,10330=>600,10331=>600,10332=>600,10333=>600,10334=>600,10335=>600,10336=>600,10337=>600,10338=>600,10339=>600,10340=>600,10341=>600,10342=>600,10343=>600,10344=>600,10345=>600,10346=>600,10347=>600,10348=>600,10349=>600,10350=>600,10351=>600,10352=>600,10353=>600,10354=>600,10355=>600,10356=>600,10357=>600,10358=>600,10359=>600,10360=>600,10361=>600,10362=>600,10363=>600,10364=>600,10365=>600,10366=>600,10367=>600,10368=>600,10369=>600,10370=>600,10371=>600,10372=>600,10373=>600,10374=>600,10375=>600,10376=>600,10377=>600,10378=>600,10379=>600,10380=>600,10381=>600,10382=>600,10383=>600,10384=>600,10385=>600,10386=>600,10387=>600,10388=>600,10389=>600,10390=>600,10391=>600,10392=>600,10393=>600,10394=>600,10395=>600,10396=>600,10397=>600,10398=>600,10399=>600,10400=>600,10401=>600,10402=>600,10403=>600,10404=>600,10405=>600,10406=>600,10407=>600,10408=>600,10409=>600,10410=>600,10411=>600,10412=>600,10413=>600,10414=>600,10415=>600,10416=>600,10417=>600,10418=>600,10419=>600,10420=>600,10421=>600,10422=>600,10423=>600,10424=>600,10425=>600,10426=>600,10427=>600,10428=>600,10429=>600,10430=>600,10431=>600,10432=>600,10433=>600,10434=>600,10435=>600,10436=>600,10437=>600,10438=>600,10439=>600,10440=>600,10441=>600,10442=>600,10443=>600,10444=>600,10445=>600,10446=>600,10447=>600,10448=>600,10449=>600,10450=>600,10451=>600,10452=>600,10453=>600,10454=>600,10455=>600,10456=>600,10457=>600,10458=>600,10459=>600,10460=>600,10461=>600,10462=>600,10463=>600,10464=>600,10465=>600,10466=>600,10467=>600,10468=>600,10469=>600,10470=>600,10471=>600,10472=>600,10473=>600,10474=>600,10475=>600,10476=>600,10477=>600,10478=>600,10479=>600,10480=>600,10481=>600,10482=>600,10483=>600,10484=>600,10485=>600,10486=>600,10487=>600,10488=>600,10489=>600,10490=>600,10491=>600,10492=>600,10493=>600,10494=>600,10495=>600,10752=>600,10753=>600,10754=>600,10755=>600,10756=>600,10757=>600,10758=>600,10781=>600,10815=>600,11008=>600,11009=>600,11010=>600,11011=>600,11012=>600,11013=>600,11014=>600,11015=>600,11016=>600,11017=>600,11018=>600,11019=>600,11020=>600,11021=>600,11026=>600,11027=>600,11028=>600,11029=>600,11030=>600,11031=>600,11032=>600,11033=>600,11035=>600,11036=>600,11037=>600,11038=>600,11039=>600,11040=>600,11041=>600,11042=>600,11043=>600,11044=>600,11045=>600,11046=>600,11047=>600,11048=>600,11049=>600,11050=>600,11051=>600,11091=>600,11092=>600,11798=>600,11799=>600,11800=>600,11802=>600,11803=>600,11806=>600,11807=>600,11816=>600,11817=>600,11818=>600,11819=>600,11820=>600,11821=>600,11822=>600,11824=>600,42888=>600,42889=>600,42890=>600,42891=>600,42892=>600,43264=>600,43265=>600,43266=>600,43267=>600,43268=>600,43269=>600,43270=>600,43271=>600,43272=>600,43273=>600,43274=>600,43275=>600,43276=>600,43277=>600,43278=>600,43279=>600,43280=>600,43281=>600,43282=>600,43283=>600,43284=>600,43285=>600,43286=>600,43287=>600,43288=>600,43289=>600,43290=>600,43291=>600,43292=>600,43293=>600,43294=>600,43295=>600,43296=>600,43297=>600,43298=>600,43299=>600,43300=>600,43301=>600,43302=>600,43303=>600,43304=>600,43305=>600,43306=>600,43307=>600,43308=>600,43309=>600,43310=>600,43311=>600,64256=>600,64257=>600,64258=>600,64259=>600,64260=>600,64261=>600,64285=>600,64286=>600,64287=>600,64288=>600,64289=>600,64290=>600,64291=>600,64292=>600,64293=>600,64294=>600,64295=>600,64296=>600,64297=>600,64298=>600,64299=>600,64300=>600,64301=>600,64302=>600,64303=>600,64304=>600,64305=>600,64306=>600,64307=>600,64308=>600,64309=>600,64310=>600,64312=>600,64313=>600,64314=>600,64315=>600,64316=>600,64318=>600,64320=>600,64321=>600,64323=>600,64324=>600,64326=>600,64327=>600,64328=>600,64329=>600,64330=>600,64331=>600,64332=>600,64333=>600,64334=>600,64335=>600,64336=>600,64337=>600,64338=>600,64339=>600,64340=>600,64341=>600,64342=>600,64343=>600,64344=>600,64345=>600,64346=>600,64347=>600,64348=>600,64349=>600,64350=>600,64351=>600,64352=>600,64353=>600,64354=>600,64355=>600,64356=>600,64357=>600,64358=>600,64359=>600,64360=>600,64361=>600,64362=>600,64363=>600,64364=>600,64365=>600,64366=>600,64367=>600,64368=>600,64369=>600,64370=>600,64371=>600,64372=>600,64373=>600,64374=>600,64375=>600,64376=>600,64377=>600,64378=>600,64379=>600,64380=>600,64381=>600,64382=>600,64383=>600,64384=>600,64385=>600,64386=>600,64387=>600,64388=>600,64389=>600,64390=>600,64391=>600,64392=>600,64393=>600,64394=>600,64395=>600,64396=>600,64397=>600,64398=>600,64399=>600,64400=>600,64401=>600,64402=>600,64403=>600,64404=>600,64405=>600,64406=>600,64407=>600,64408=>600,64409=>600,64410=>600,64411=>600,64412=>600,64413=>600,64414=>600,64415=>600,64416=>600,64417=>600,64418=>600,64419=>600,64420=>600,64421=>600,64422=>600,64423=>600,64424=>600,64425=>600,64426=>600,64427=>600,64428=>600,64429=>600,64430=>600,64431=>600,64432=>600,64433=>600,64434=>600,64435=>600,64436=>600,64437=>600,64438=>600,64439=>600,64440=>600,64441=>600,64442=>600,64443=>600,64444=>600,64445=>600,64446=>600,64448=>600,64449=>600,64467=>600,64468=>600,64469=>600,64470=>600,64471=>600,64472=>600,64473=>600,64474=>600,64475=>600,64476=>600,64477=>600,64478=>600,64479=>600,64480=>600,64481=>600,64482=>600,64483=>600,64484=>600,64485=>600,64486=>600,64487=>600,64488=>600,64489=>600,64508=>600,64509=>600,64510=>600,64511=>600,65136=>600,65137=>600,65138=>600,65139=>600,65140=>600,65142=>600,65143=>600,65144=>600,65145=>600,65146=>600,65147=>600,65148=>600,65149=>600,65150=>600,65151=>600,65152=>600,65153=>600,65154=>600,65155=>600,65156=>600,65157=>600,65158=>600,65159=>600,65160=>600,65161=>600,65162=>600,65163=>600,65164=>600,65165=>600,65166=>600,65167=>600,65168=>600,65169=>600,65170=>600,65171=>600,65172=>600,65173=>600,65174=>600,65175=>600,65176=>600,65177=>600,65178=>600,65179=>600,65180=>600,65181=>600,65182=>600,65183=>600,65184=>600,65185=>600,65186=>600,65187=>600,65188=>600,65189=>600,65190=>600,65191=>600,65192=>600,65193=>600,65194=>600,65195=>600,65196=>600,65197=>600,65198=>600,65199=>600,65200=>600,65201=>600,65202=>600,65203=>600,65204=>600,65205=>600,65206=>600,65207=>600,65208=>600,65209=>600,65210=>600,65211=>600,65212=>600,65213=>600,65214=>600,65215=>600,65216=>600,65217=>600,65218=>600,65219=>600,65220=>600,65221=>600,65222=>600,65223=>600,65224=>600,65225=>600,65226=>600,65227=>600,65228=>600,65229=>600,65230=>600,65231=>600,65232=>600,65233=>600,65234=>600,65235=>600,65236=>600,65237=>600,65238=>600,65239=>600,65240=>600,65241=>600,65242=>600,65243=>600,65244=>600,65245=>600,65246=>600,65247=>600,65248=>600,65249=>600,65250=>600,65251=>600,65252=>600,65253=>600,65254=>600,65255=>600,65256=>600,65257=>600,65258=>600,65259=>600,65260=>600,65261=>600,65262=>600,65263=>600,65264=>600,65265=>600,65266=>600,65267=>600,65268=>600,65269=>600,65270=>600,65271=>600,65272=>600,65273=>600,65274=>600,65275=>600,65276=>600,65279=>600,65529=>600,65530=>600,65531=>600,65532=>600,65533=>600,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freemono.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemono.z
new file mode 100644
index 00000000..0df80446
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemono.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonob.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonob.ctg.z
new file mode 100644
index 00000000..703afc89
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonob.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonob.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonob.php
new file mode 100644
index 00000000..7a2e570c
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonob.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='FreeMonoBold';
+$up=-125;
+$ut=50;
+$dw=600;
+$diff='';
+$originalsize=296284;
+$enc='';
+$file='freemonob.z';
+$ctg='freemonob.ctg.z';
+$desc=array('Flags'=>33,'FontBBox'=>'[-600 -200 736 800]','ItalicAngle'=>0,'Ascent'=>800,'Descent'=>-200,'Leading'=>0,'CapHeight'=>583,'XHeight'=>437,'StemV'=>123,'StemH'=>53,'AvgWidth'=>600,'MaxWidth'=>600,'MissingWidth'=>600);
+$cw=array(0=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600,208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600,256=>600,257=>600,258=>600,259=>600,260=>600,261=>600,262=>600,263=>600,264=>600,265=>600,266=>600,267=>600,268=>600,269=>600,270=>600,271=>600,272=>600,273=>600,274=>600,275=>600,276=>600,277=>600,278=>600,279=>600,280=>600,281=>600,282=>600,283=>600,284=>600,285=>600,286=>600,287=>600,288=>600,289=>600,290=>600,291=>600,292=>600,293=>600,294=>600,295=>600,296=>600,297=>600,298=>600,299=>600,300=>600,301=>600,302=>600,303=>600,304=>600,305=>600,306=>600,307=>600,308=>600,309=>600,310=>600,311=>600,312=>600,313=>600,314=>600,315=>600,316=>600,317=>600,318=>600,319=>600,320=>600,321=>600,322=>600,323=>600,324=>600,325=>600,326=>600,327=>600,328=>600,329=>600,330=>600,331=>600,332=>600,333=>600,334=>600,335=>600,336=>600,337=>600,338=>600,339=>600,340=>600,341=>600,342=>600,343=>600,344=>600,345=>600,346=>600,347=>600,348=>600,349=>600,350=>600,351=>600,352=>600,353=>600,354=>600,355=>600,356=>600,357=>600,358=>600,359=>600,360=>600,361=>600,362=>600,363=>600,364=>600,365=>600,366=>600,367=>600,368=>600,369=>600,370=>600,371=>600,372=>600,373=>600,374=>600,375=>600,376=>600,377=>600,378=>600,379=>600,380=>600,381=>600,382=>600,383=>600,384=>600,385=>600,386=>600,387=>600,388=>600,389=>600,390=>600,391=>600,392=>600,393=>600,394=>600,395=>600,396=>600,397=>600,398=>600,399=>600,400=>600,401=>600,402=>600,403=>600,404=>600,405=>600,406=>600,407=>600,408=>600,409=>600,410=>600,411=>600,412=>600,413=>600,414=>600,415=>600,416=>600,417=>600,418=>600,419=>600,420=>600,421=>600,422=>600,423=>600,424=>600,425=>600,426=>600,427=>600,428=>600,429=>600,430=>600,431=>600,432=>600,433=>600,434=>600,435=>600,436=>600,437=>600,438=>600,439=>600,440=>600,441=>600,442=>600,443=>600,444=>600,445=>600,446=>600,447=>600,448=>600,449=>600,450=>600,451=>600,452=>600,453=>600,454=>600,455=>600,456=>600,457=>600,458=>600,459=>600,460=>600,461=>600,462=>600,463=>600,464=>600,465=>600,466=>600,467=>600,468=>600,469=>600,470=>600,471=>600,472=>600,473=>600,474=>600,475=>600,476=>600,477=>600,478=>600,479=>600,480=>600,481=>600,482=>600,483=>600,484=>600,485=>600,486=>600,487=>600,488=>600,489=>600,490=>600,491=>600,492=>600,493=>600,494=>600,495=>600,496=>600,497=>600,498=>600,499=>600,500=>600,501=>600,502=>600,503=>600,504=>600,505=>600,506=>600,507=>600,508=>600,509=>600,510=>600,511=>600,512=>600,513=>600,514=>600,515=>600,516=>600,517=>600,518=>600,519=>600,520=>600,521=>600,522=>600,523=>600,524=>600,525=>600,526=>600,527=>600,528=>600,529=>600,530=>600,531=>600,532=>600,533=>600,534=>600,535=>600,536=>600,537=>600,538=>600,539=>600,540=>600,541=>600,542=>600,543=>600,544=>600,548=>600,549=>600,550=>600,551=>600,552=>600,553=>600,554=>600,555=>600,556=>600,557=>600,558=>600,559=>600,560=>600,561=>600,562=>600,563=>600,567=>600,592=>600,593=>600,594=>600,595=>600,596=>600,598=>600,599=>600,600=>600,601=>600,603=>600,604=>600,607=>600,608=>600,609=>600,613=>600,614=>600,615=>600,616=>600,617=>600,618=>600,619=>600,621=>600,623=>600,624=>600,625=>600,626=>600,627=>600,628=>600,629=>600,633=>600,634=>600,635=>600,636=>600,637=>600,638=>600,639=>600,640=>600,641=>600,642=>600,643=>600,644=>600,645=>600,647=>600,648=>600,649=>600,652=>600,653=>600,654=>600,656=>600,657=>600,658=>600,659=>600,660=>600,661=>600,662=>600,663=>600,664=>600,665=>600,666=>600,667=>600,668=>600,669=>600,670=>600,671=>600,672=>600,673=>600,674=>600,688=>600,689=>600,690=>600,691=>600,692=>600,693=>600,694=>600,695=>600,696=>600,697=>600,698=>600,699=>600,700=>600,701=>600,702=>600,703=>600,704=>600,705=>600,706=>600,707=>600,708=>600,709=>600,710=>600,711=>600,712=>600,713=>600,714=>600,715=>600,716=>600,717=>600,718=>600,719=>600,720=>600,721=>600,722=>600,723=>600,724=>600,725=>600,726=>600,727=>600,728=>600,729=>600,730=>600,731=>600,732=>600,733=>600,734=>600,735=>600,736=>600,737=>600,738=>600,739=>600,740=>600,741=>600,742=>600,743=>600,744=>600,745=>600,746=>600,747=>600,748=>600,749=>600,750=>600,751=>600,752=>600,753=>600,754=>600,755=>600,756=>600,757=>600,758=>600,759=>600,760=>600,761=>600,762=>600,763=>600,764=>600,765=>600,766=>600,767=>600,768=>600,769=>600,770=>600,771=>600,772=>600,773=>600,774=>600,775=>600,776=>600,777=>600,778=>600,779=>600,780=>600,781=>600,782=>600,783=>600,784=>600,785=>600,786=>600,787=>600,788=>600,789=>600,790=>600,791=>600,792=>600,793=>600,794=>600,795=>600,796=>600,797=>600,798=>600,799=>600,800=>600,801=>600,802=>600,803=>600,804=>600,805=>600,806=>600,807=>600,808=>600,809=>600,810=>600,811=>600,812=>600,813=>600,814=>600,815=>600,816=>600,817=>600,818=>600,819=>600,820=>600,821=>600,822=>600,823=>600,824=>600,825=>600,826=>600,827=>600,828=>600,829=>600,830=>600,831=>600,832=>600,833=>600,834=>600,835=>600,836=>600,837=>600,838=>600,839=>600,840=>600,841=>600,842=>600,843=>600,844=>600,845=>600,846=>600,847=>600,848=>600,849=>600,850=>600,851=>600,852=>600,853=>600,854=>600,855=>600,856=>600,857=>600,858=>600,859=>600,860=>600,861=>600,862=>600,863=>600,864=>600,865=>600,866=>600,867=>600,868=>600,869=>600,870=>600,871=>600,872=>600,873=>600,874=>600,875=>600,876=>600,877=>600,878=>600,879=>600,884=>600,885=>600,890=>600,894=>600,900=>600,901=>600,902=>600,903=>600,904=>600,905=>600,906=>600,908=>600,910=>600,911=>600,912=>600,913=>600,914=>600,915=>600,916=>600,917=>600,918=>600,919=>600,920=>600,921=>600,922=>600,923=>600,924=>600,925=>600,926=>600,927=>600,928=>600,929=>600,931=>600,932=>600,933=>600,934=>600,935=>600,936=>600,937=>600,938=>600,939=>600,940=>600,941=>600,942=>600,943=>600,944=>600,945=>600,946=>600,947=>600,948=>600,949=>600,950=>600,951=>600,952=>600,953=>600,954=>600,955=>600,956=>600,957=>600,958=>600,959=>600,960=>600,961=>600,962=>600,963=>600,964=>600,965=>600,966=>600,967=>600,968=>600,969=>600,970=>600,971=>600,972=>600,973=>600,974=>600,976=>600,977=>600,978=>600,979=>600,980=>600,981=>600,982=>600,986=>600,987=>600,988=>600,989=>600,1008=>600,1009=>600,1012=>600,1013=>600,1024=>600,1025=>600,1026=>600,1027=>600,1028=>600,1029=>600,1030=>600,1031=>600,1032=>600,1033=>600,1034=>600,1035=>600,1036=>600,1037=>600,1038=>600,1039=>600,1040=>600,1041=>600,1042=>600,1043=>600,1044=>600,1045=>600,1046=>600,1047=>600,1048=>600,1049=>600,1050=>600,1051=>600,1052=>600,1053=>600,1054=>600,1055=>600,1056=>600,1057=>600,1058=>600,1059=>600,1060=>600,1061=>600,1062=>600,1063=>600,1064=>600,1065=>600,1066=>600,1067=>600,1068=>600,1069=>600,1070=>600,1071=>600,1072=>600,1073=>600,1074=>600,1075=>600,1076=>600,1077=>600,1078=>600,1079=>600,1080=>600,1081=>600,1082=>600,1083=>600,1084=>600,1085=>600,1086=>600,1087=>600,1088=>600,1089=>600,1090=>600,1091=>600,1092=>600,1093=>600,1094=>600,1095=>600,1096=>600,1097=>600,1098=>600,1099=>600,1100=>600,1101=>600,1102=>600,1103=>600,1104=>600,1105=>600,1106=>600,1107=>600,1108=>600,1109=>600,1110=>600,1111=>600,1112=>600,1113=>600,1114=>600,1115=>600,1116=>600,1117=>600,1118=>600,1119=>600,1136=>600,1137=>600,1138=>600,1156=>600,1157=>600,1158=>600,1162=>600,1163=>600,1164=>600,1165=>600,1166=>600,1167=>600,1168=>600,1169=>600,1170=>600,1171=>600,1172=>600,1173=>600,1174=>600,1175=>600,1176=>600,1177=>600,1178=>600,1179=>600,1180=>600,1181=>600,1182=>600,1183=>600,1184=>600,1185=>600,1186=>600,1187=>600,1188=>600,1189=>600,1190=>600,1191=>600,1192=>600,1193=>600,1194=>600,1195=>600,1196=>600,1197=>600,1198=>600,1199=>600,1200=>600,1201=>600,1202=>600,1203=>600,1204=>600,1205=>600,1206=>600,1207=>600,1208=>600,1209=>600,1210=>600,1211=>600,1212=>600,1213=>600,1214=>600,1215=>600,1216=>600,1217=>600,1218=>600,1219=>600,1220=>600,1221=>600,1222=>600,1223=>600,1224=>600,1225=>600,1226=>600,1227=>600,1228=>600,1229=>600,1230=>600,1231=>600,1232=>600,1233=>600,1234=>600,1235=>600,1236=>600,1237=>600,1238=>600,1239=>600,1240=>600,1241=>600,1242=>600,1243=>600,1244=>600,1245=>600,1246=>600,1247=>600,1248=>600,1249=>600,1250=>600,1251=>600,1252=>600,1253=>600,1254=>600,1255=>600,1256=>600,1257=>600,1258=>600,1259=>600,1260=>600,1261=>600,1262=>600,1263=>600,1264=>600,1265=>600,1266=>600,1267=>600,1268=>600,1269=>600,1270=>600,1271=>600,1272=>600,1273=>600,1296=>600,1297=>600,1298=>600,1299=>600,1306=>600,1307=>600,1308=>600,1309=>600,1310=>600,1311=>600,1456=>600,1457=>600,1458=>600,1459=>600,1460=>600,1461=>600,1462=>600,1463=>600,1464=>600,1465=>600,1467=>600,1468=>600,1469=>600,1470=>600,1471=>600,1472=>600,1473=>600,1474=>600,1475=>600,1476=>600,1488=>600,1489=>600,1490=>600,1491=>600,1492=>600,1493=>600,1494=>600,1495=>600,1496=>600,1497=>600,1498=>600,1499=>600,1500=>600,1501=>600,1502=>600,1503=>600,1504=>600,1505=>600,1506=>600,1507=>600,1508=>600,1509=>600,1510=>600,1511=>600,1512=>600,1513=>600,1514=>600,1520=>600,1521=>600,1522=>600,1523=>600,1524=>600,4304=>600,4305=>600,4306=>600,4307=>600,4308=>600,4309=>600,4310=>600,4311=>600,4312=>600,4313=>600,4314=>600,4315=>600,4316=>600,4317=>600,4318=>600,4319=>600,4320=>600,4321=>600,4322=>600,4323=>600,4324=>600,4325=>600,4326=>600,4327=>600,4328=>600,4329=>600,4330=>600,4331=>600,4332=>600,4333=>600,4334=>600,4335=>600,4336=>600,4337=>600,4338=>600,4339=>600,4340=>600,4341=>600,4345=>600,4347=>600,4348=>600,7680=>600,7681=>600,7682=>600,7683=>600,7684=>600,7685=>600,7686=>600,7687=>600,7688=>600,7689=>600,7690=>600,7691=>600,7692=>600,7693=>600,7694=>600,7695=>600,7696=>600,7697=>600,7698=>600,7699=>600,7700=>600,7701=>600,7702=>600,7703=>600,7704=>600,7705=>600,7706=>600,7707=>600,7708=>600,7709=>600,7710=>600,7711=>600,7712=>600,7713=>600,7714=>600,7715=>600,7716=>600,7717=>600,7718=>600,7719=>600,7720=>600,7721=>600,7722=>600,7723=>600,7724=>600,7725=>600,7726=>600,7727=>600,7728=>600,7729=>600,7730=>600,7731=>600,7732=>600,7733=>600,7734=>600,7735=>600,7736=>600,7737=>600,7738=>600,7739=>600,7740=>600,7741=>600,7742=>600,7743=>600,7744=>600,7745=>600,7746=>600,7747=>600,7748=>600,7749=>600,7750=>600,7751=>600,7752=>600,7753=>600,7754=>600,7755=>600,7756=>600,7757=>600,7758=>600,7759=>600,7760=>600,7761=>600,7762=>600,7763=>600,7764=>600,7765=>600,7766=>600,7767=>600,7768=>600,7769=>600,7770=>600,7771=>600,7772=>600,7773=>600,7774=>600,7775=>600,7776=>600,7777=>600,7778=>600,7779=>600,7780=>600,7781=>600,7782=>600,7783=>600,7784=>600,7785=>600,7786=>600,7787=>600,7788=>600,7789=>600,7790=>600,7791=>600,7792=>600,7793=>600,7794=>600,7795=>600,7796=>600,7797=>600,7798=>600,7799=>600,7800=>600,7801=>600,7802=>600,7803=>600,7804=>600,7805=>600,7806=>600,7807=>600,7808=>600,7809=>600,7810=>600,7811=>600,7812=>600,7813=>600,7814=>600,7815=>600,7816=>600,7817=>600,7818=>600,7819=>600,7820=>600,7821=>600,7822=>600,7823=>600,7824=>600,7825=>600,7826=>600,7827=>600,7828=>600,7829=>600,7830=>600,7831=>600,7832=>600,7833=>600,7834=>600,7835=>600,7840=>600,7841=>600,7842=>600,7843=>600,7844=>600,7845=>600,7846=>600,7847=>600,7848=>600,7849=>600,7850=>600,7851=>600,7852=>600,7853=>600,7854=>600,7855=>600,7856=>600,7857=>600,7858=>600,7859=>600,7860=>600,7861=>600,7862=>600,7863=>600,7864=>600,7865=>600,7866=>600,7867=>600,7868=>600,7869=>600,7870=>600,7871=>600,7872=>600,7873=>600,7874=>600,7875=>600,7876=>600,7877=>600,7878=>600,7879=>600,7880=>600,7881=>600,7882=>600,7883=>600,7884=>600,7885=>600,7886=>600,7887=>600,7888=>600,7889=>600,7890=>600,7891=>600,7892=>600,7893=>600,7894=>600,7895=>600,7896=>600,7897=>600,7898=>600,7899=>600,7900=>600,7901=>600,7902=>600,7903=>600,7904=>600,7905=>600,7906=>600,7907=>600,7908=>600,7909=>600,7910=>600,7911=>600,7912=>600,7913=>600,7914=>600,7915=>600,7916=>600,7917=>600,7918=>600,7919=>600,7920=>600,7921=>600,7922=>600,7923=>600,7924=>600,7925=>600,7926=>600,7927=>600,7928=>600,7929=>600,8192=>600,8193=>600,8194=>600,8195=>600,8196=>600,8197=>600,8198=>600,8199=>600,8200=>600,8201=>600,8202=>600,8203=>600,8204=>600,8205=>600,8206=>600,8207=>600,8208=>600,8209=>600,8210=>600,8211=>600,8212=>600,8213=>600,8214=>600,8215=>600,8216=>600,8217=>600,8218=>600,8219=>600,8220=>600,8221=>600,8222=>600,8223=>600,8224=>600,8225=>600,8226=>600,8227=>600,8228=>600,8229=>600,8230=>600,8231=>600,8232=>600,8233=>600,8234=>600,8235=>600,8236=>600,8237=>600,8238=>600,8239=>600,8240=>600,8241=>600,8242=>600,8243=>600,8244=>600,8245=>600,8246=>600,8247=>600,8248=>600,8249=>600,8250=>600,8251=>600,8252=>600,8253=>600,8254=>600,8255=>600,8256=>600,8257=>600,8258=>600,8259=>600,8260=>600,8261=>600,8262=>600,8263=>600,8264=>600,8265=>600,8266=>600,8267=>600,8268=>600,8269=>600,8270=>600,8271=>600,8272=>600,8273=>600,8274=>600,8275=>600,8276=>600,8277=>600,8278=>600,8279=>600,8280=>600,8281=>600,8282=>600,8283=>600,8284=>600,8285=>600,8286=>600,8287=>600,8288=>600,8289=>600,8290=>600,8291=>600,8292=>600,8304=>600,8305=>600,8308=>600,8309=>600,8310=>600,8311=>600,8312=>600,8313=>600,8314=>600,8315=>600,8316=>600,8317=>600,8318=>600,8319=>600,8320=>600,8321=>600,8322=>600,8323=>600,8324=>600,8325=>600,8326=>600,8327=>600,8328=>600,8329=>600,8330=>600,8331=>600,8332=>600,8333=>600,8334=>600,8336=>600,8337=>600,8338=>600,8339=>600,8340=>600,8355=>600,8356=>600,8357=>600,8358=>600,8361=>600,8362=>600,8363=>600,8364=>600,8365=>600,8366=>600,8369=>600,8370=>600,8371=>600,8372=>600,8373=>600,8376=>600,8377=>600,8448=>600,8449=>600,8451=>600,8453=>600,8454=>600,8455=>600,8457=>600,8462=>600,8465=>600,8466=>600,8467=>600,8470=>600,8472=>600,8476=>600,8480=>600,8481=>600,8482=>600,8486=>600,8487=>600,8489=>600,8490=>600,8491=>600,8494=>600,8498=>600,8501=>600,8502=>600,8503=>600,8504=>600,8506=>600,8507=>600,8513=>600,8514=>600,8515=>600,8516=>600,8523=>600,8525=>600,8526=>600,8531=>600,8532=>600,8533=>600,8534=>600,8535=>600,8536=>600,8537=>600,8538=>600,8539=>600,8540=>600,8541=>600,8542=>600,8543=>600,8592=>600,8593=>600,8594=>600,8595=>600,8596=>600,8597=>600,8598=>600,8599=>600,8600=>600,8601=>600,8612=>600,8613=>600,8614=>600,8615=>600,8633=>600,8636=>600,8637=>600,8638=>600,8639=>600,8640=>600,8641=>600,8642=>600,8643=>600,8644=>600,8645=>600,8646=>600,8647=>600,8648=>600,8649=>600,8650=>600,8651=>600,8652=>600,8656=>600,8657=>600,8658=>600,8659=>600,8660=>600,8661=>600,8704=>600,8705=>600,8706=>600,8707=>600,8708=>600,8709=>600,8710=>600,8711=>600,8712=>600,8713=>600,8714=>600,8715=>600,8716=>600,8717=>600,8718=>600,8719=>600,8720=>600,8721=>600,8722=>600,8723=>600,8724=>600,8725=>600,8726=>600,8727=>600,8728=>600,8729=>600,8730=>600,8731=>600,8732=>600,8733=>600,8734=>600,8735=>600,8739=>600,8741=>600,8743=>600,8744=>600,8745=>600,8746=>600,8747=>600,8748=>600,8756=>600,8757=>600,8758=>600,8759=>600,8764=>600,8776=>600,8800=>600,8801=>600,8804=>600,8805=>600,8834=>600,8835=>600,8836=>600,8837=>600,8838=>600,8839=>600,8869=>600,8898=>600,8899=>600,8976=>600,9001=>600,9002=>600,9251=>600,9472=>600,9473=>600,9474=>600,9475=>600,9476=>600,9477=>600,9478=>600,9479=>600,9480=>600,9481=>600,9482=>600,9483=>600,9484=>600,9485=>600,9486=>600,9487=>600,9488=>600,9489=>600,9490=>600,9491=>600,9492=>600,9493=>600,9494=>600,9495=>600,9496=>600,9497=>600,9498=>600,9499=>600,9500=>600,9501=>600,9502=>600,9503=>600,9504=>600,9505=>600,9506=>600,9507=>600,9508=>600,9509=>600,9510=>600,9511=>600,9512=>600,9513=>600,9514=>600,9515=>600,9516=>600,9517=>600,9518=>600,9519=>600,9520=>600,9521=>600,9522=>600,9523=>600,9524=>600,9525=>600,9526=>600,9527=>600,9528=>600,9529=>600,9530=>600,9531=>600,9532=>600,9533=>600,9534=>600,9535=>600,9536=>600,9537=>600,9538=>600,9539=>600,9540=>600,9541=>600,9542=>600,9543=>600,9544=>600,9545=>600,9546=>600,9547=>600,9548=>600,9549=>600,9550=>600,9551=>600,9552=>600,9553=>600,9554=>600,9555=>600,9556=>600,9557=>600,9558=>600,9559=>600,9560=>600,9561=>600,9562=>600,9563=>600,9564=>600,9565=>600,9566=>600,9567=>600,9568=>600,9569=>600,9570=>600,9571=>600,9572=>600,9573=>600,9574=>600,9575=>600,9576=>600,9577=>600,9578=>600,9579=>600,9580=>600,9581=>600,9582=>600,9583=>600,9584=>600,9585=>600,9586=>600,9587=>600,9588=>600,9589=>600,9590=>600,9591=>600,9592=>600,9593=>600,9594=>600,9595=>600,9596=>600,9597=>600,9598=>600,9599=>600,9600=>600,9601=>600,9602=>600,9603=>600,9604=>600,9605=>600,9606=>600,9607=>600,9608=>600,9609=>600,9610=>600,9611=>600,9612=>600,9613=>600,9614=>600,9615=>600,9616=>600,9617=>600,9618=>600,9619=>600,9620=>600,9621=>600,9632=>600,9633=>600,9635=>600,9636=>600,9637=>600,9638=>600,9639=>600,9640=>600,9641=>600,9642=>600,9643=>600,9644=>600,9645=>600,9646=>600,9647=>600,9648=>600,9649=>600,9650=>600,9651=>600,9652=>600,9653=>600,9654=>600,9655=>600,9656=>600,9657=>600,9658=>600,9660=>600,9661=>600,9662=>600,9663=>600,9664=>600,9665=>600,9666=>600,9667=>600,9668=>600,9669=>600,9670=>600,9671=>600,9673=>600,9674=>600,9675=>600,9677=>600,9679=>600,9680=>600,9681=>600,9682=>600,9683=>600,9684=>600,9685=>600,9686=>600,9687=>600,9688=>600,9689=>600,9698=>600,9699=>600,9700=>600,9701=>600,9702=>600,9703=>600,9704=>600,9705=>600,9706=>600,9707=>600,9708=>600,9709=>600,9710=>600,9711=>600,9712=>600,9713=>600,9714=>600,9715=>600,9716=>600,9717=>600,9718=>600,9719=>600,9735=>600,9736=>600,9737=>600,9776=>600,9777=>600,9778=>600,9779=>600,9780=>600,9781=>600,9782=>600,9783=>600,9785=>600,9786=>600,9787=>600,9824=>600,9825=>600,9826=>600,9827=>600,9828=>600,9829=>600,9830=>600,9831=>600,9833=>600,9834=>600,9835=>600,9836=>600,9837=>600,9838=>600,9839=>600,11798=>600,11799=>600,11800=>600,11802=>600,11803=>600,11806=>600,11807=>600,11816=>600,11817=>600,11818=>600,11819=>600,11820=>600,11821=>600,11822=>600,11824=>600,42888=>600,42889=>600,42890=>600,42891=>600,42892=>600,64256=>600,64257=>600,64258=>600,64285=>600,64287=>600,64288=>600,64298=>600,64299=>600,64300=>600,64301=>600,64302=>600,64303=>600,64304=>600,64305=>600,64306=>600,64307=>600,64308=>600,64309=>600,64310=>600,64312=>600,64313=>600,64314=>600,64315=>600,64316=>600,64318=>600,64320=>600,64321=>600,64323=>600,64324=>600,64326=>600,64327=>600,64328=>600,64329=>600,64330=>600,64331=>600,64332=>600,64333=>600,64334=>600,64335=>600,65529=>600,65530=>600,65531=>600,65532=>600,65533=>600,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonob.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonob.z
new file mode 100644
index 00000000..79dbeddf
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonob.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonobi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonobi.ctg.z
new file mode 100644
index 00000000..d206e6db
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonobi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonobi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonobi.php
new file mode 100644
index 00000000..a134e798
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonobi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='FreeMonoBoldOblique';
+$up=-125;
+$ut=50;
+$dw=600;
+$diff='';
+$originalsize=295360;
+$enc='';
+$file='freemonobi.z';
+$ctg='freemonobi.ctg.z';
+$desc=array('Flags'=>97,'FontBBox'=>'[-642 -200 834 800]','ItalicAngle'=>-12,'Ascent'=>800,'Descent'=>-200,'Leading'=>0,'CapHeight'=>583,'XHeight'=>437,'StemV'=>123,'StemH'=>53,'AvgWidth'=>600,'MaxWidth'=>600,'MissingWidth'=>600);
+$cw=array(0=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600,208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600,256=>600,257=>600,258=>600,259=>600,260=>600,261=>600,262=>600,263=>600,264=>600,265=>600,266=>600,267=>600,268=>600,269=>600,270=>600,271=>600,272=>600,273=>600,274=>600,275=>600,276=>600,277=>600,278=>600,279=>600,280=>600,281=>600,282=>600,283=>600,284=>600,285=>600,286=>600,287=>600,288=>600,289=>600,290=>600,291=>600,292=>600,293=>600,294=>600,295=>600,296=>600,297=>600,298=>600,299=>600,300=>600,301=>600,302=>600,303=>600,304=>600,305=>600,306=>600,307=>600,308=>600,309=>600,310=>600,311=>600,312=>600,313=>600,314=>600,315=>600,316=>600,317=>600,318=>600,319=>600,320=>600,321=>600,322=>600,323=>600,324=>600,325=>600,326=>600,327=>600,328=>600,329=>600,330=>600,331=>600,332=>600,333=>600,334=>600,335=>600,336=>600,337=>600,338=>600,339=>600,340=>600,341=>600,342=>600,343=>600,344=>600,345=>600,346=>600,347=>600,348=>600,349=>600,350=>600,351=>600,352=>600,353=>600,354=>600,355=>600,356=>600,357=>600,358=>600,359=>600,360=>600,361=>600,362=>600,363=>600,364=>600,365=>600,366=>600,367=>600,368=>600,369=>600,370=>600,371=>600,372=>600,373=>600,374=>600,375=>600,376=>600,377=>600,378=>600,379=>600,380=>600,381=>600,382=>600,383=>600,384=>600,385=>600,386=>600,387=>600,388=>600,389=>600,390=>600,391=>600,392=>600,393=>600,394=>600,395=>600,396=>600,397=>600,398=>600,399=>600,400=>600,401=>600,402=>600,403=>600,404=>600,405=>600,406=>600,407=>600,408=>600,409=>600,410=>600,411=>600,412=>600,413=>600,414=>600,415=>600,416=>600,417=>600,418=>600,419=>600,420=>600,421=>600,422=>600,423=>600,424=>600,425=>600,426=>600,427=>600,428=>600,429=>600,430=>600,431=>600,432=>600,433=>600,434=>600,435=>600,436=>600,437=>600,438=>600,439=>600,440=>600,441=>600,442=>600,443=>600,444=>600,445=>600,446=>600,447=>600,448=>600,449=>600,450=>600,451=>600,452=>600,453=>600,454=>600,455=>600,456=>600,457=>600,458=>600,459=>600,460=>600,461=>600,462=>600,463=>600,464=>600,465=>600,466=>600,467=>600,468=>600,469=>600,470=>600,471=>600,472=>600,473=>600,474=>600,475=>600,476=>600,477=>600,478=>600,479=>600,480=>600,481=>600,482=>600,483=>600,484=>600,485=>600,486=>600,487=>600,488=>600,489=>600,490=>600,491=>600,492=>600,493=>600,494=>600,495=>600,496=>600,497=>600,498=>600,499=>600,500=>600,501=>600,502=>600,503=>600,504=>600,505=>600,506=>600,507=>600,508=>600,509=>600,510=>600,511=>600,512=>600,513=>600,514=>600,515=>600,516=>600,517=>600,518=>600,519=>600,520=>600,521=>600,522=>600,523=>600,524=>600,525=>600,526=>600,527=>600,528=>600,529=>600,530=>600,531=>600,532=>600,533=>600,534=>600,535=>600,536=>600,537=>600,538=>600,539=>600,540=>600,541=>600,542=>600,543=>600,544=>600,548=>600,549=>600,550=>600,551=>600,552=>600,553=>600,554=>600,555=>600,556=>600,557=>600,558=>600,559=>600,560=>600,561=>600,562=>600,563=>600,567=>600,592=>600,593=>600,594=>600,595=>600,596=>600,598=>600,599=>600,600=>600,601=>600,603=>600,604=>600,607=>600,608=>600,609=>600,613=>600,614=>600,615=>600,616=>600,617=>600,618=>600,619=>600,621=>600,623=>600,624=>600,625=>600,626=>600,627=>600,628=>600,629=>600,633=>600,634=>600,635=>600,636=>600,637=>600,638=>600,639=>600,640=>600,641=>600,642=>600,643=>600,644=>600,645=>600,647=>600,648=>600,649=>600,652=>600,653=>600,654=>600,656=>600,657=>600,658=>600,659=>600,660=>600,661=>600,662=>600,663=>600,664=>600,665=>600,666=>600,667=>600,668=>600,669=>600,670=>600,671=>600,672=>600,673=>600,674=>600,688=>600,689=>600,690=>600,691=>600,692=>600,693=>600,694=>600,695=>600,696=>600,697=>600,698=>600,699=>600,700=>600,701=>600,702=>600,703=>600,704=>600,705=>600,706=>600,707=>600,708=>600,709=>600,710=>600,711=>600,712=>600,713=>600,714=>600,715=>600,716=>600,717=>600,718=>600,719=>600,720=>600,721=>600,722=>600,723=>600,724=>600,725=>600,726=>600,727=>600,728=>600,729=>600,730=>600,731=>600,732=>600,733=>600,734=>600,735=>600,736=>600,737=>600,738=>600,739=>600,740=>600,741=>600,742=>600,743=>600,744=>600,745=>600,746=>600,747=>600,748=>600,749=>600,750=>600,751=>600,752=>600,753=>600,754=>600,755=>600,756=>600,757=>600,758=>600,759=>600,760=>600,761=>600,762=>600,763=>600,764=>600,765=>600,766=>600,767=>600,768=>600,769=>600,770=>600,771=>600,772=>600,773=>600,774=>600,775=>600,776=>600,777=>600,778=>600,779=>600,780=>600,781=>600,782=>600,783=>600,784=>600,785=>600,786=>600,787=>600,788=>600,789=>600,790=>600,791=>600,792=>600,793=>600,794=>600,795=>600,796=>600,797=>600,798=>600,799=>600,800=>600,801=>600,802=>600,803=>600,804=>600,805=>600,806=>600,807=>600,808=>600,809=>600,810=>600,811=>600,812=>600,813=>600,814=>600,815=>600,816=>600,817=>600,818=>600,819=>600,820=>600,821=>600,822=>600,823=>600,824=>600,825=>600,826=>600,827=>600,828=>600,829=>600,830=>600,831=>600,832=>600,833=>600,834=>600,835=>600,836=>600,837=>600,838=>600,839=>600,840=>600,841=>600,842=>600,843=>600,844=>600,845=>600,846=>600,847=>600,848=>600,849=>600,850=>600,851=>600,852=>600,853=>600,854=>600,855=>600,856=>600,857=>600,858=>600,859=>600,860=>600,861=>600,862=>600,863=>600,864=>600,865=>600,866=>600,867=>600,868=>600,869=>600,870=>600,871=>600,872=>600,873=>600,874=>600,875=>600,876=>600,877=>600,878=>600,879=>600,884=>600,885=>600,890=>600,894=>600,900=>600,901=>600,902=>600,903=>600,904=>600,905=>600,906=>600,908=>600,910=>600,911=>600,912=>600,913=>600,914=>600,915=>600,916=>600,917=>600,918=>600,919=>600,920=>600,921=>600,922=>600,923=>600,924=>600,925=>600,926=>600,927=>600,928=>600,929=>600,931=>600,932=>600,933=>600,934=>600,935=>600,936=>600,937=>600,938=>600,939=>600,940=>600,941=>600,942=>600,943=>600,944=>600,945=>600,946=>600,947=>600,948=>600,949=>600,950=>600,951=>600,952=>600,953=>600,954=>600,955=>600,956=>600,957=>600,958=>600,959=>600,960=>600,961=>600,962=>600,963=>600,964=>600,965=>600,966=>600,967=>600,968=>600,969=>600,970=>600,971=>600,972=>600,973=>600,974=>600,976=>600,977=>600,978=>600,979=>600,980=>600,981=>600,982=>600,986=>600,987=>600,988=>600,989=>600,1008=>600,1009=>600,1012=>600,1013=>600,1024=>600,1025=>600,1026=>600,1027=>600,1028=>600,1029=>600,1030=>600,1031=>600,1032=>600,1033=>600,1034=>600,1035=>600,1036=>600,1037=>600,1038=>600,1039=>600,1040=>600,1041=>600,1042=>600,1043=>600,1044=>600,1045=>600,1046=>600,1047=>600,1048=>600,1049=>600,1050=>600,1051=>600,1052=>600,1053=>600,1054=>600,1055=>600,1056=>600,1057=>600,1058=>600,1059=>600,1060=>600,1061=>600,1062=>600,1063=>600,1064=>600,1065=>600,1066=>600,1067=>600,1068=>600,1069=>600,1070=>600,1071=>600,1072=>600,1073=>600,1074=>600,1075=>600,1076=>600,1077=>600,1078=>600,1079=>600,1080=>600,1081=>600,1082=>600,1083=>600,1084=>600,1085=>600,1086=>600,1087=>600,1088=>600,1089=>600,1090=>600,1091=>600,1092=>600,1093=>600,1094=>600,1095=>600,1096=>600,1097=>600,1098=>600,1099=>600,1100=>600,1101=>600,1102=>600,1103=>600,1104=>600,1105=>600,1106=>600,1107=>600,1108=>600,1109=>600,1110=>600,1111=>600,1112=>600,1113=>600,1114=>600,1115=>600,1116=>600,1117=>600,1118=>600,1119=>600,1136=>600,1137=>600,1138=>600,1156=>600,1157=>600,1158=>600,1162=>600,1163=>600,1164=>600,1165=>600,1166=>600,1167=>600,1168=>600,1169=>600,1170=>600,1171=>600,1172=>600,1173=>600,1174=>600,1175=>600,1176=>600,1177=>600,1178=>600,1179=>600,1180=>600,1181=>600,1182=>600,1183=>600,1184=>600,1185=>600,1186=>600,1187=>600,1188=>600,1189=>600,1190=>600,1191=>600,1192=>600,1193=>600,1194=>600,1195=>600,1196=>600,1197=>600,1198=>600,1199=>600,1200=>600,1201=>600,1202=>600,1203=>600,1204=>600,1205=>600,1206=>600,1207=>600,1208=>600,1209=>600,1210=>600,1211=>600,1212=>600,1213=>600,1214=>600,1215=>600,1216=>600,1217=>600,1218=>600,1219=>600,1220=>600,1221=>600,1222=>600,1223=>600,1224=>600,1225=>600,1226=>600,1227=>600,1228=>600,1229=>600,1230=>600,1231=>600,1232=>600,1233=>600,1234=>600,1235=>600,1236=>600,1237=>600,1238=>600,1239=>600,1240=>600,1241=>600,1242=>600,1243=>600,1244=>600,1245=>600,1246=>600,1247=>600,1248=>600,1249=>600,1250=>600,1251=>600,1252=>600,1253=>600,1254=>600,1255=>600,1256=>600,1257=>600,1258=>600,1259=>600,1260=>600,1261=>600,1262=>600,1263=>600,1264=>600,1265=>600,1266=>600,1267=>600,1268=>600,1269=>600,1270=>600,1271=>600,1272=>600,1273=>600,1296=>600,1297=>600,1298=>600,1299=>600,1306=>600,1307=>600,1308=>600,1309=>600,1310=>600,1311=>600,1456=>600,1457=>600,1458=>600,1459=>600,1460=>600,1461=>600,1462=>600,1463=>600,1464=>600,1465=>600,1467=>600,1468=>600,1469=>600,1470=>600,1471=>600,1472=>600,1473=>600,1474=>600,1475=>600,1476=>600,1488=>600,1489=>600,1490=>600,1491=>600,1492=>600,1493=>600,1494=>600,1495=>600,1496=>600,1497=>600,1498=>600,1499=>600,1500=>600,1501=>600,1502=>600,1503=>600,1504=>600,1505=>600,1506=>600,1507=>600,1508=>600,1509=>600,1510=>600,1511=>600,1512=>600,1513=>600,1514=>600,1520=>600,1521=>600,1522=>600,1523=>600,1524=>600,4304=>600,4305=>600,4306=>600,4307=>600,4308=>600,4309=>600,4310=>600,4311=>600,4312=>600,4313=>600,4314=>600,4315=>600,4316=>600,4317=>600,4318=>600,4319=>600,4320=>600,4321=>600,4322=>600,4323=>600,4324=>600,4325=>600,4326=>600,4327=>600,4328=>600,4329=>600,4330=>600,4331=>600,4332=>600,4333=>600,4334=>600,4335=>600,4336=>600,4337=>600,4338=>600,4339=>600,4340=>600,4341=>600,4345=>600,4347=>600,4348=>600,7680=>600,7681=>600,7682=>600,7683=>600,7684=>600,7685=>600,7686=>600,7687=>600,7688=>600,7689=>600,7690=>600,7691=>600,7692=>600,7693=>600,7694=>600,7695=>600,7696=>600,7697=>600,7698=>600,7699=>600,7700=>600,7701=>600,7702=>600,7703=>600,7704=>600,7705=>600,7706=>600,7707=>600,7708=>600,7709=>600,7710=>600,7711=>600,7712=>600,7713=>600,7714=>600,7715=>600,7716=>600,7717=>600,7718=>600,7719=>600,7720=>600,7721=>600,7722=>600,7723=>600,7724=>600,7725=>600,7726=>600,7727=>600,7728=>600,7729=>600,7730=>600,7731=>600,7732=>600,7733=>600,7734=>600,7735=>600,7736=>600,7737=>600,7738=>600,7739=>600,7740=>600,7741=>600,7742=>600,7743=>600,7744=>600,7745=>600,7746=>600,7747=>600,7748=>600,7749=>600,7750=>600,7751=>600,7752=>600,7753=>600,7754=>600,7755=>600,7756=>600,7757=>600,7758=>600,7759=>600,7760=>600,7761=>600,7762=>600,7763=>600,7764=>600,7765=>600,7766=>600,7767=>600,7768=>600,7769=>600,7770=>600,7771=>600,7772=>600,7773=>600,7774=>600,7775=>600,7776=>600,7777=>600,7778=>600,7779=>600,7780=>600,7781=>600,7782=>600,7783=>600,7784=>600,7785=>600,7786=>600,7787=>600,7788=>600,7789=>600,7790=>600,7791=>600,7792=>600,7793=>600,7794=>600,7795=>600,7796=>600,7797=>600,7798=>600,7799=>600,7800=>600,7801=>600,7802=>600,7803=>600,7804=>600,7805=>600,7806=>600,7807=>600,7808=>600,7809=>600,7810=>600,7811=>600,7812=>600,7813=>600,7814=>600,7815=>600,7816=>600,7817=>600,7818=>600,7819=>600,7820=>600,7821=>600,7822=>600,7823=>600,7824=>600,7825=>600,7826=>600,7827=>600,7828=>600,7829=>600,7830=>600,7831=>600,7832=>600,7833=>600,7834=>600,7835=>600,7840=>600,7841=>600,7842=>600,7843=>600,7844=>600,7845=>600,7846=>600,7847=>600,7848=>600,7849=>600,7850=>600,7851=>600,7852=>600,7853=>600,7854=>600,7855=>600,7856=>600,7857=>600,7858=>600,7859=>600,7860=>600,7861=>600,7862=>600,7863=>600,7864=>600,7865=>600,7866=>600,7867=>600,7868=>600,7869=>600,7870=>600,7871=>600,7872=>600,7873=>600,7874=>600,7875=>600,7876=>600,7877=>600,7878=>600,7879=>600,7880=>600,7881=>600,7882=>600,7883=>600,7884=>600,7885=>600,7886=>600,7887=>600,7888=>600,7889=>600,7890=>600,7891=>600,7892=>600,7893=>600,7894=>600,7895=>600,7896=>600,7897=>600,7898=>600,7899=>600,7900=>600,7901=>600,7902=>600,7903=>600,7904=>600,7905=>600,7906=>600,7907=>600,7908=>600,7909=>600,7910=>600,7911=>600,7912=>600,7913=>600,7914=>600,7915=>600,7916=>600,7917=>600,7918=>600,7919=>600,7920=>600,7921=>600,7922=>600,7923=>600,7924=>600,7925=>600,7926=>600,7927=>600,7928=>600,7929=>600,8192=>600,8193=>600,8194=>600,8195=>600,8196=>600,8197=>600,8198=>600,8199=>600,8200=>600,8201=>600,8202=>600,8203=>600,8204=>600,8205=>600,8206=>600,8207=>600,8208=>600,8209=>600,8210=>600,8211=>600,8212=>600,8213=>600,8214=>600,8215=>600,8216=>600,8217=>600,8218=>600,8219=>600,8220=>600,8221=>600,8222=>600,8223=>600,8224=>600,8225=>600,8226=>600,8227=>600,8228=>600,8229=>600,8230=>600,8231=>600,8232=>600,8233=>600,8234=>600,8235=>600,8236=>600,8237=>600,8238=>600,8239=>600,8240=>600,8241=>600,8242=>600,8243=>600,8244=>600,8245=>600,8246=>600,8247=>600,8248=>600,8249=>600,8250=>600,8251=>600,8252=>600,8253=>600,8254=>600,8255=>600,8256=>600,8257=>600,8258=>600,8259=>600,8260=>600,8261=>600,8262=>600,8263=>600,8264=>600,8265=>600,8266=>600,8267=>600,8268=>600,8269=>600,8270=>600,8271=>600,8272=>600,8273=>600,8274=>600,8275=>600,8276=>600,8277=>600,8278=>600,8279=>600,8280=>600,8281=>600,8282=>600,8283=>600,8284=>600,8285=>600,8286=>600,8287=>600,8288=>600,8289=>600,8290=>600,8291=>600,8292=>600,8304=>600,8305=>600,8308=>600,8309=>600,8310=>600,8311=>600,8312=>600,8313=>600,8314=>600,8315=>600,8316=>600,8317=>600,8318=>600,8319=>600,8320=>600,8321=>600,8322=>600,8323=>600,8324=>600,8325=>600,8326=>600,8327=>600,8328=>600,8329=>600,8330=>600,8331=>600,8332=>600,8333=>600,8334=>600,8336=>600,8337=>600,8338=>600,8339=>600,8340=>600,8355=>600,8356=>600,8357=>600,8358=>600,8361=>600,8362=>600,8363=>600,8364=>600,8365=>600,8366=>600,8369=>600,8370=>600,8371=>600,8372=>600,8373=>600,8376=>600,8377=>600,8448=>600,8449=>600,8451=>600,8453=>600,8454=>600,8455=>600,8457=>600,8462=>600,8465=>600,8466=>600,8467=>600,8470=>600,8472=>600,8476=>600,8480=>600,8481=>600,8482=>600,8486=>600,8487=>600,8489=>600,8490=>600,8491=>600,8494=>600,8498=>600,8501=>600,8502=>600,8503=>600,8504=>600,8506=>600,8507=>600,8513=>600,8514=>600,8515=>600,8516=>600,8523=>600,8525=>600,8526=>600,8531=>600,8532=>600,8533=>600,8534=>600,8535=>600,8536=>600,8537=>600,8538=>600,8539=>600,8540=>600,8541=>600,8542=>600,8543=>600,8592=>600,8593=>600,8594=>600,8595=>600,8596=>600,8597=>600,8598=>600,8599=>600,8600=>600,8601=>600,8612=>600,8613=>600,8614=>600,8615=>600,8633=>600,8636=>600,8637=>600,8638=>600,8639=>600,8640=>600,8641=>600,8642=>600,8643=>600,8644=>600,8645=>600,8646=>600,8647=>600,8648=>600,8649=>600,8650=>600,8651=>600,8652=>600,8656=>600,8657=>600,8658=>600,8659=>600,8660=>600,8661=>600,8704=>600,8705=>600,8706=>600,8707=>600,8708=>600,8709=>600,8710=>600,8711=>600,8712=>600,8713=>600,8714=>600,8715=>600,8716=>600,8717=>600,8718=>600,8719=>600,8720=>600,8721=>600,8722=>600,8723=>600,8724=>600,8725=>600,8726=>600,8727=>600,8728=>600,8729=>600,8730=>600,8731=>600,8732=>600,8733=>600,8734=>600,8735=>600,8739=>600,8741=>600,8743=>600,8744=>600,8745=>600,8746=>600,8747=>600,8748=>600,8756=>600,8757=>600,8758=>600,8759=>600,8764=>600,8776=>600,8800=>600,8801=>600,8804=>600,8805=>600,8834=>600,8835=>600,8838=>600,8839=>600,8869=>600,8898=>600,8899=>600,8976=>600,9001=>600,9002=>600,9251=>600,9674=>600,9675=>600,9711=>600,9824=>600,9825=>600,9826=>600,9827=>600,9828=>600,9829=>600,9830=>600,9831=>600,9833=>600,9834=>600,9835=>600,9836=>600,9837=>600,9838=>600,9839=>600,11798=>600,11799=>600,11800=>600,11802=>600,11803=>600,11806=>600,11807=>600,11816=>600,11817=>600,11818=>600,11819=>600,11820=>600,11821=>600,11822=>600,42888=>600,42889=>600,42890=>600,42891=>600,42892=>600,64256=>600,64257=>600,64258=>600,64285=>600,64287=>600,64288=>600,64298=>600,64299=>600,64300=>600,64301=>600,64302=>600,64303=>600,64304=>600,64305=>600,64306=>600,64307=>600,64308=>600,64309=>600,64310=>600,64312=>600,64313=>600,64314=>600,64315=>600,64316=>600,64318=>600,64320=>600,64321=>600,64323=>600,64324=>600,64326=>600,64327=>600,64328=>600,64329=>600,64330=>600,64331=>600,64332=>600,64333=>600,64334=>600,64335=>600,65529=>600,65530=>600,65531=>600,65532=>600,65533=>600,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonobi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonobi.z
new file mode 100644
index 00000000..6bf967c0
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonobi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonoi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonoi.ctg.z
new file mode 100644
index 00000000..f2eead80
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonoi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonoi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonoi.php
new file mode 100644
index 00000000..45a350d9
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonoi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='FreeMonoOblique';
+$up=-125;
+$ut=50;
+$dw=600;
+$diff='';
+$originalsize=390692;
+$enc='';
+$file='freemonoi.z';
+$ctg='freemonoi.ctg.z';
+$desc=array('Flags'=>97,'FontBBox'=>'[-644 -200 816 800]','ItalicAngle'=>-12,'Ascent'=>800,'Descent'=>-200,'Leading'=>0,'CapHeight'=>563,'XHeight'=>417,'StemV'=>70,'StemH'=>30,'AvgWidth'=>600,'MaxWidth'=>600,'MissingWidth'=>600);
+$cw=array(0=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600,208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600,256=>600,257=>600,258=>600,259=>600,260=>600,261=>600,262=>600,263=>600,264=>600,265=>600,266=>600,267=>600,268=>600,269=>600,270=>600,271=>600,272=>600,273=>600,274=>600,275=>600,276=>600,277=>600,278=>600,279=>600,280=>600,281=>600,282=>600,283=>600,284=>600,285=>600,286=>600,287=>600,288=>600,289=>600,290=>600,291=>600,292=>600,293=>600,294=>600,295=>600,296=>600,297=>600,298=>600,299=>600,300=>600,301=>600,302=>600,303=>600,304=>600,305=>600,306=>600,307=>600,308=>600,309=>600,310=>600,311=>600,312=>600,313=>600,314=>600,315=>600,316=>600,317=>600,318=>600,319=>600,320=>600,321=>600,322=>600,323=>600,324=>600,325=>600,326=>600,327=>600,328=>600,329=>600,330=>600,331=>600,332=>600,333=>600,334=>600,335=>600,336=>600,337=>600,338=>600,339=>600,340=>600,341=>600,342=>600,343=>600,344=>600,345=>600,346=>600,347=>600,348=>600,349=>600,350=>600,351=>600,352=>600,353=>600,354=>600,355=>600,356=>600,357=>600,358=>600,359=>600,360=>600,361=>600,362=>600,363=>600,364=>600,365=>600,366=>600,367=>600,368=>600,369=>600,370=>600,371=>600,372=>600,373=>600,374=>600,375=>600,376=>600,377=>600,378=>600,379=>600,380=>600,381=>600,382=>600,383=>600,384=>600,385=>600,386=>600,387=>600,388=>600,389=>600,390=>600,391=>600,392=>600,393=>600,394=>600,395=>600,396=>600,397=>600,398=>600,399=>600,400=>600,401=>600,402=>600,403=>600,404=>600,405=>600,406=>600,407=>600,408=>600,409=>600,410=>600,411=>600,412=>600,413=>600,414=>600,415=>600,416=>600,417=>600,418=>600,419=>600,420=>600,421=>600,422=>600,423=>600,424=>600,425=>600,426=>600,427=>600,428=>600,429=>600,430=>600,431=>600,432=>600,433=>600,434=>600,435=>600,436=>600,437=>600,438=>600,439=>600,440=>600,441=>600,442=>600,443=>600,444=>600,445=>600,446=>600,447=>600,448=>600,449=>600,450=>600,451=>600,452=>600,453=>600,454=>600,455=>600,456=>600,457=>600,458=>600,459=>600,460=>600,461=>600,462=>600,463=>600,464=>600,465=>600,466=>600,467=>600,468=>600,469=>600,470=>600,471=>600,472=>600,473=>600,474=>600,475=>600,476=>600,477=>600,478=>600,479=>600,480=>600,481=>600,482=>600,483=>600,484=>600,485=>600,486=>600,487=>600,488=>600,489=>600,490=>600,491=>600,492=>600,493=>600,494=>600,495=>600,496=>600,497=>600,498=>600,499=>600,500=>600,501=>600,502=>600,503=>600,504=>600,505=>600,506=>600,507=>600,508=>600,509=>600,510=>600,511=>600,512=>600,513=>600,514=>600,515=>600,516=>600,517=>600,518=>600,519=>600,520=>600,521=>600,522=>600,523=>600,524=>600,525=>600,526=>600,527=>600,528=>600,529=>600,530=>600,531=>600,532=>600,533=>600,534=>600,535=>600,536=>600,537=>600,538=>600,539=>600,540=>600,541=>600,542=>600,543=>600,544=>600,548=>600,549=>600,550=>600,551=>600,552=>600,553=>600,554=>600,555=>600,556=>600,557=>600,558=>600,559=>600,560=>600,561=>600,562=>600,563=>600,567=>600,592=>600,593=>600,594=>600,595=>600,596=>600,597=>600,598=>600,599=>600,600=>600,601=>600,602=>600,603=>600,604=>600,605=>600,606=>600,607=>600,608=>600,609=>600,610=>600,611=>600,612=>600,613=>600,614=>600,615=>600,616=>600,617=>600,618=>600,619=>600,620=>600,621=>600,622=>600,623=>600,624=>600,625=>600,626=>600,627=>600,628=>600,629=>600,630=>600,631=>600,632=>600,633=>600,634=>600,635=>600,636=>600,637=>600,638=>600,639=>600,640=>600,641=>600,642=>600,643=>600,644=>600,645=>600,646=>600,647=>600,648=>600,649=>600,650=>600,651=>600,652=>600,653=>600,654=>600,655=>600,656=>600,657=>600,658=>600,659=>600,660=>600,661=>600,662=>600,663=>600,664=>600,665=>600,666=>600,667=>600,668=>600,669=>600,670=>600,671=>600,672=>600,673=>600,674=>600,675=>600,676=>600,677=>600,678=>600,679=>600,680=>600,681=>600,682=>600,683=>600,684=>600,685=>600,686=>600,687=>600,688=>600,689=>600,690=>600,691=>600,692=>600,693=>600,694=>600,695=>600,696=>600,697=>600,698=>600,699=>600,700=>600,701=>600,702=>600,703=>600,704=>600,705=>600,706=>600,707=>600,708=>600,709=>600,710=>600,711=>600,712=>600,713=>600,714=>600,715=>600,716=>600,717=>600,718=>600,719=>600,720=>600,721=>600,722=>600,723=>600,724=>600,725=>600,726=>600,727=>600,728=>600,729=>600,730=>600,731=>600,732=>600,733=>600,734=>600,735=>600,736=>600,737=>600,738=>600,739=>600,740=>600,741=>600,742=>600,743=>600,744=>600,745=>600,746=>600,747=>600,748=>600,749=>600,750=>600,751=>600,752=>600,753=>600,754=>600,755=>600,756=>600,757=>600,758=>600,759=>600,760=>600,761=>600,762=>600,763=>600,764=>600,765=>600,766=>600,767=>600,768=>600,769=>600,770=>600,771=>600,772=>600,773=>600,774=>600,775=>600,776=>600,777=>600,778=>600,779=>600,780=>600,781=>600,782=>600,783=>600,784=>600,785=>600,786=>600,787=>600,788=>600,789=>600,790=>600,791=>600,792=>600,793=>600,794=>600,795=>600,796=>600,797=>600,798=>600,799=>600,800=>600,801=>600,802=>600,803=>600,804=>600,805=>600,806=>600,807=>600,808=>600,809=>600,810=>600,811=>600,812=>600,813=>600,814=>600,815=>600,816=>600,817=>600,818=>600,819=>600,820=>600,821=>600,822=>600,823=>600,824=>600,825=>600,826=>600,827=>600,828=>600,829=>600,830=>600,831=>600,832=>600,833=>600,834=>600,835=>600,836=>600,837=>600,838=>600,839=>600,840=>600,841=>600,842=>600,843=>600,844=>600,845=>600,846=>600,847=>600,848=>600,849=>600,850=>600,851=>600,852=>600,853=>600,854=>600,855=>600,856=>600,857=>600,858=>600,859=>600,860=>600,861=>600,862=>600,863=>600,864=>600,865=>600,866=>600,867=>600,868=>600,869=>600,870=>600,871=>600,872=>600,873=>600,874=>600,875=>600,876=>600,877=>600,878=>600,879=>600,884=>600,885=>600,890=>600,894=>600,900=>600,901=>600,902=>600,903=>600,904=>600,905=>600,906=>600,908=>600,910=>600,911=>600,912=>600,913=>600,914=>600,915=>600,916=>600,917=>600,918=>600,919=>600,920=>600,921=>600,922=>600,923=>600,924=>600,925=>600,926=>600,927=>600,928=>600,929=>600,931=>600,932=>600,933=>600,934=>600,935=>600,936=>600,937=>600,938=>600,939=>600,940=>600,941=>600,942=>600,943=>600,944=>600,945=>600,946=>600,947=>600,948=>600,949=>600,950=>600,951=>600,952=>600,953=>600,954=>600,955=>600,956=>600,957=>600,958=>600,959=>600,960=>600,961=>600,962=>600,963=>600,964=>600,965=>600,966=>600,967=>600,968=>600,969=>600,970=>600,971=>600,972=>600,973=>600,974=>600,976=>600,977=>600,978=>600,979=>600,980=>600,981=>600,982=>600,986=>600,987=>600,988=>600,989=>600,1008=>600,1009=>600,1012=>600,1013=>600,1024=>600,1025=>600,1026=>600,1027=>600,1028=>600,1029=>600,1030=>600,1031=>600,1032=>600,1033=>600,1034=>600,1035=>600,1036=>600,1037=>600,1038=>600,1039=>600,1040=>600,1041=>600,1042=>600,1043=>600,1044=>600,1045=>600,1046=>600,1047=>600,1048=>600,1049=>600,1050=>600,1051=>600,1052=>600,1053=>600,1054=>600,1055=>600,1056=>600,1057=>600,1058=>600,1059=>600,1060=>600,1061=>600,1062=>600,1063=>600,1064=>600,1065=>600,1066=>600,1067=>600,1068=>600,1069=>600,1070=>600,1071=>600,1072=>600,1073=>600,1074=>600,1075=>600,1076=>600,1077=>600,1078=>600,1079=>600,1080=>600,1081=>600,1082=>600,1083=>600,1084=>600,1085=>600,1086=>600,1087=>600,1088=>600,1089=>600,1090=>600,1091=>600,1092=>600,1093=>600,1094=>600,1095=>600,1096=>600,1097=>600,1098=>600,1099=>600,1100=>600,1101=>600,1102=>600,1103=>600,1104=>600,1105=>600,1106=>600,1107=>600,1108=>600,1109=>600,1110=>600,1111=>600,1112=>600,1113=>600,1114=>600,1115=>600,1116=>600,1117=>600,1118=>600,1119=>600,1120=>600,1121=>600,1122=>600,1123=>600,1124=>600,1125=>600,1126=>600,1127=>600,1128=>600,1129=>600,1130=>600,1131=>600,1132=>600,1133=>600,1134=>600,1135=>600,1136=>600,1137=>600,1138=>600,1139=>600,1140=>600,1141=>600,1142=>600,1143=>600,1144=>600,1145=>600,1146=>600,1147=>600,1148=>600,1149=>600,1150=>600,1151=>600,1155=>600,1156=>600,1157=>600,1158=>600,1159=>600,1162=>600,1163=>600,1164=>600,1165=>600,1166=>600,1167=>600,1168=>600,1169=>600,1170=>600,1171=>600,1172=>600,1173=>600,1174=>600,1175=>600,1176=>600,1177=>600,1178=>600,1179=>600,1180=>600,1181=>600,1182=>600,1183=>600,1184=>600,1185=>600,1186=>600,1187=>600,1188=>600,1189=>600,1190=>600,1191=>600,1192=>600,1193=>600,1194=>600,1195=>600,1196=>600,1197=>600,1198=>600,1199=>600,1200=>600,1201=>600,1202=>600,1203=>600,1204=>600,1205=>600,1206=>600,1207=>600,1208=>600,1209=>600,1210=>600,1211=>600,1212=>600,1213=>600,1214=>600,1215=>600,1216=>600,1217=>600,1218=>600,1219=>600,1220=>600,1221=>600,1222=>600,1223=>600,1224=>600,1225=>600,1226=>600,1227=>600,1228=>600,1229=>600,1230=>600,1231=>600,1232=>600,1233=>600,1234=>600,1235=>600,1236=>600,1237=>600,1238=>600,1239=>600,1240=>600,1241=>600,1242=>600,1243=>600,1244=>600,1245=>600,1246=>600,1247=>600,1248=>600,1249=>600,1250=>600,1251=>600,1252=>600,1253=>600,1254=>600,1255=>600,1256=>600,1257=>600,1258=>600,1259=>600,1260=>600,1261=>600,1262=>600,1263=>600,1264=>600,1265=>600,1266=>600,1267=>600,1268=>600,1269=>600,1270=>600,1271=>600,1272=>600,1273=>600,1296=>600,1297=>600,1298=>600,1299=>600,1306=>600,1307=>600,1308=>600,1309=>600,1310=>600,1311=>600,1329=>600,1330=>600,1331=>600,1332=>600,1333=>600,1334=>600,1335=>600,1336=>600,1337=>600,1338=>600,1339=>600,1340=>600,1341=>600,1342=>600,1343=>600,1344=>600,1345=>600,1346=>600,1347=>600,1348=>600,1349=>600,1350=>600,1351=>600,1352=>600,1353=>600,1354=>600,1355=>600,1356=>600,1357=>600,1358=>600,1359=>600,1360=>600,1361=>600,1362=>600,1363=>600,1364=>600,1365=>600,1366=>600,1369=>600,1370=>600,1371=>600,1372=>600,1373=>600,1374=>600,1375=>600,1377=>600,1378=>600,1379=>600,1380=>600,1381=>600,1382=>600,1383=>600,1384=>600,1385=>600,1386=>600,1387=>600,1388=>600,1389=>600,1390=>600,1391=>600,1392=>600,1393=>600,1394=>600,1395=>600,1396=>600,1397=>600,1398=>600,1399=>600,1400=>600,1401=>600,1402=>600,1403=>600,1404=>600,1405=>600,1406=>600,1407=>600,1408=>600,1409=>600,1410=>600,1411=>600,1412=>600,1413=>600,1414=>600,1415=>600,1417=>600,1418=>600,1423=>600,1456=>600,1457=>600,1458=>600,1459=>600,1460=>600,1461=>600,1462=>600,1463=>600,1464=>600,1465=>600,1467=>600,1468=>600,1469=>600,1470=>600,1471=>600,1472=>600,1473=>600,1474=>600,1475=>600,1476=>600,1488=>600,1489=>600,1490=>600,1491=>600,1492=>600,1493=>600,1494=>600,1495=>600,1496=>600,1497=>600,1498=>600,1499=>600,1500=>600,1501=>600,1502=>600,1503=>600,1504=>600,1505=>600,1506=>600,1507=>600,1508=>600,1509=>600,1510=>600,1511=>600,1512=>600,1513=>600,1514=>600,1520=>600,1521=>600,1522=>600,1523=>600,1524=>600,4304=>600,4305=>600,4306=>600,4307=>600,4308=>600,4309=>600,4310=>600,4311=>600,4312=>600,4313=>600,4314=>600,4315=>600,4316=>600,4317=>600,4318=>600,4319=>600,4320=>600,4321=>600,4322=>600,4323=>600,4324=>600,4325=>600,4326=>600,4327=>600,4328=>600,4329=>600,4330=>600,4331=>600,4332=>600,4333=>600,4334=>600,4335=>600,4336=>600,4337=>600,4338=>600,4339=>600,4340=>600,4341=>600,4345=>600,4347=>600,4348=>600,7680=>600,7681=>600,7682=>600,7683=>600,7684=>600,7685=>600,7686=>600,7687=>600,7688=>600,7689=>600,7690=>600,7691=>600,7692=>600,7693=>600,7694=>600,7695=>600,7696=>600,7697=>600,7698=>600,7699=>600,7700=>600,7701=>600,7702=>600,7703=>600,7704=>600,7705=>600,7706=>600,7707=>600,7708=>600,7709=>600,7710=>600,7711=>600,7712=>600,7713=>600,7714=>600,7715=>600,7716=>600,7717=>600,7718=>600,7719=>600,7720=>600,7721=>600,7722=>600,7723=>600,7724=>600,7725=>600,7726=>600,7727=>600,7728=>600,7729=>600,7730=>600,7731=>600,7732=>600,7733=>600,7734=>600,7735=>600,7736=>600,7737=>600,7738=>600,7739=>600,7740=>600,7741=>600,7742=>600,7743=>600,7744=>600,7745=>600,7746=>600,7747=>600,7748=>600,7749=>600,7750=>600,7751=>600,7752=>600,7753=>600,7754=>600,7755=>600,7756=>600,7757=>600,7758=>600,7759=>600,7760=>600,7761=>600,7762=>600,7763=>600,7764=>600,7765=>600,7766=>600,7767=>600,7768=>600,7769=>600,7770=>600,7771=>600,7772=>600,7773=>600,7774=>600,7775=>600,7776=>600,7777=>600,7778=>600,7779=>600,7780=>600,7781=>600,7782=>600,7783=>600,7784=>600,7785=>600,7786=>600,7787=>600,7788=>600,7789=>600,7790=>600,7791=>600,7792=>600,7793=>600,7794=>600,7795=>600,7796=>600,7797=>600,7798=>600,7799=>600,7800=>600,7801=>600,7802=>600,7803=>600,7804=>600,7805=>600,7806=>600,7807=>600,7808=>600,7809=>600,7810=>600,7811=>600,7812=>600,7813=>600,7814=>600,7815=>600,7816=>600,7817=>600,7818=>600,7819=>600,7820=>600,7821=>600,7822=>600,7823=>600,7824=>600,7825=>600,7826=>600,7827=>600,7828=>600,7829=>600,7830=>600,7831=>600,7832=>600,7833=>600,7834=>600,7835=>600,7840=>600,7841=>600,7842=>600,7843=>600,7844=>600,7845=>600,7846=>600,7847=>600,7848=>600,7849=>600,7850=>600,7851=>600,7852=>600,7853=>600,7854=>600,7855=>600,7856=>600,7857=>600,7858=>600,7859=>600,7860=>600,7861=>600,7862=>600,7863=>600,7864=>600,7865=>600,7866=>600,7867=>600,7868=>600,7869=>600,7870=>600,7871=>600,7872=>600,7873=>600,7874=>600,7875=>600,7876=>600,7877=>600,7878=>600,7879=>600,7880=>600,7881=>600,7882=>600,7883=>600,7884=>600,7885=>600,7886=>600,7887=>600,7888=>600,7889=>600,7890=>600,7891=>600,7892=>600,7893=>600,7894=>600,7895=>600,7896=>600,7897=>600,7898=>600,7899=>600,7900=>600,7901=>600,7902=>600,7903=>600,7904=>600,7905=>600,7906=>600,7907=>600,7908=>600,7909=>600,7910=>600,7911=>600,7912=>600,7913=>600,7914=>600,7915=>600,7916=>600,7917=>600,7918=>600,7919=>600,7920=>600,7921=>600,7922=>600,7923=>600,7924=>600,7925=>600,7926=>600,7927=>600,7928=>600,7929=>600,7936=>600,7937=>600,7938=>600,7939=>600,7940=>600,7941=>600,7942=>600,7943=>600,7944=>600,7945=>600,7946=>600,7947=>600,7948=>600,7949=>600,7950=>600,7951=>600,7952=>600,7953=>600,7954=>600,7955=>600,7956=>600,7957=>600,7960=>600,7961=>600,7962=>600,7963=>600,7964=>600,7965=>600,7968=>600,7969=>600,7970=>600,7971=>600,7972=>600,7973=>600,7974=>600,7975=>600,7976=>600,7977=>600,7978=>600,7979=>600,7980=>600,7981=>600,7982=>600,7983=>600,7984=>600,7985=>600,7986=>600,7987=>600,7988=>600,7989=>600,7990=>600,7991=>600,7992=>600,7993=>600,7994=>600,7995=>600,7996=>600,7997=>600,7998=>600,7999=>600,8000=>600,8001=>600,8002=>600,8003=>600,8004=>600,8005=>600,8008=>600,8009=>600,8010=>600,8011=>600,8012=>600,8013=>600,8016=>600,8017=>600,8018=>600,8019=>600,8020=>600,8021=>600,8022=>600,8023=>600,8025=>600,8027=>600,8029=>600,8031=>600,8032=>600,8033=>600,8034=>600,8035=>600,8036=>600,8037=>600,8038=>600,8039=>600,8040=>600,8041=>600,8042=>600,8043=>600,8044=>600,8045=>600,8046=>600,8047=>600,8048=>600,8049=>600,8050=>600,8051=>600,8052=>600,8053=>600,8054=>600,8055=>600,8056=>600,8057=>600,8058=>600,8059=>600,8060=>600,8061=>600,8064=>600,8065=>600,8066=>600,8067=>600,8068=>600,8069=>600,8070=>600,8071=>600,8072=>600,8073=>600,8074=>600,8075=>600,8076=>600,8077=>600,8078=>600,8079=>600,8080=>600,8081=>600,8082=>600,8083=>600,8084=>600,8085=>600,8086=>600,8087=>600,8088=>600,8089=>600,8090=>600,8091=>600,8092=>600,8093=>600,8094=>600,8095=>600,8096=>600,8097=>600,8098=>600,8099=>600,8100=>600,8101=>600,8102=>600,8103=>600,8104=>600,8105=>600,8106=>600,8107=>600,8108=>600,8109=>600,8110=>600,8111=>600,8112=>600,8113=>600,8114=>600,8115=>600,8116=>600,8118=>600,8119=>600,8120=>600,8121=>600,8122=>600,8123=>600,8124=>600,8125=>600,8126=>600,8127=>600,8128=>600,8129=>600,8130=>600,8131=>600,8132=>600,8134=>600,8135=>600,8136=>600,8137=>600,8138=>600,8139=>600,8140=>600,8141=>600,8142=>600,8143=>600,8144=>600,8145=>600,8146=>600,8147=>600,8150=>600,8151=>600,8152=>600,8153=>600,8154=>600,8155=>600,8157=>600,8158=>600,8159=>600,8160=>600,8161=>600,8162=>600,8163=>600,8164=>600,8165=>600,8166=>600,8167=>600,8168=>600,8169=>600,8170=>600,8171=>600,8172=>600,8173=>600,8174=>600,8175=>600,8178=>600,8179=>600,8180=>600,8182=>600,8183=>600,8184=>600,8185=>600,8186=>600,8187=>600,8188=>600,8189=>600,8190=>600,8192=>600,8193=>600,8194=>600,8195=>600,8196=>600,8197=>600,8198=>600,8199=>600,8200=>600,8201=>600,8202=>600,8203=>600,8204=>600,8205=>600,8206=>600,8207=>600,8208=>600,8209=>600,8210=>600,8211=>600,8212=>600,8213=>600,8214=>600,8215=>600,8216=>600,8217=>600,8218=>600,8219=>600,8220=>600,8221=>600,8222=>600,8223=>600,8224=>600,8225=>600,8226=>600,8227=>600,8228=>600,8229=>600,8230=>600,8231=>600,8232=>600,8233=>600,8234=>600,8235=>600,8236=>600,8237=>600,8238=>600,8239=>600,8240=>600,8241=>600,8242=>600,8243=>600,8244=>600,8245=>600,8246=>600,8247=>600,8248=>600,8249=>600,8250=>600,8251=>600,8252=>600,8253=>600,8254=>600,8255=>600,8256=>600,8257=>600,8258=>600,8259=>600,8260=>600,8261=>600,8262=>600,8263=>600,8264=>600,8265=>600,8266=>600,8267=>600,8268=>600,8269=>600,8270=>600,8271=>600,8272=>600,8273=>600,8274=>600,8275=>600,8276=>600,8277=>600,8278=>600,8279=>600,8280=>600,8281=>600,8282=>600,8283=>600,8284=>600,8285=>600,8286=>600,8287=>600,8288=>600,8289=>600,8290=>600,8291=>600,8292=>600,8304=>600,8305=>600,8308=>600,8309=>600,8310=>600,8311=>600,8312=>600,8313=>600,8314=>600,8315=>600,8316=>600,8317=>600,8318=>600,8319=>600,8320=>600,8321=>600,8322=>600,8323=>600,8324=>600,8325=>600,8326=>600,8327=>600,8328=>600,8329=>600,8330=>600,8331=>600,8332=>600,8333=>600,8334=>600,8336=>600,8337=>600,8338=>600,8339=>600,8340=>600,8353=>600,8354=>600,8355=>600,8356=>600,8357=>600,8358=>600,8359=>600,8360=>600,8361=>600,8362=>600,8363=>600,8364=>600,8365=>600,8366=>600,8367=>600,8368=>600,8369=>600,8370=>600,8371=>600,8372=>600,8373=>600,8376=>600,8377=>600,8448=>600,8449=>600,8450=>600,8451=>600,8452=>600,8453=>600,8454=>600,8455=>600,8456=>600,8457=>600,8461=>600,8462=>600,8463=>600,8464=>600,8465=>600,8466=>600,8467=>600,8468=>600,8469=>600,8470=>600,8471=>600,8472=>600,8473=>600,8474=>600,8476=>600,8477=>600,8478=>600,8480=>600,8481=>600,8482=>600,8484=>600,8486=>600,8487=>600,8489=>600,8490=>600,8491=>600,8494=>600,8498=>600,8501=>600,8502=>600,8503=>600,8504=>600,8505=>600,8506=>600,8507=>600,8513=>600,8514=>600,8515=>600,8516=>600,8523=>600,8525=>600,8526=>600,8531=>600,8532=>600,8533=>600,8534=>600,8535=>600,8536=>600,8537=>600,8538=>600,8539=>600,8540=>600,8541=>600,8542=>600,8543=>600,8544=>600,8545=>600,8546=>600,8547=>600,8548=>600,8549=>600,8550=>600,8551=>600,8552=>600,8553=>600,8554=>600,8555=>600,8556=>600,8557=>600,8558=>600,8559=>600,8560=>600,8561=>600,8562=>600,8563=>600,8564=>600,8565=>600,8566=>600,8567=>600,8568=>600,8569=>600,8570=>600,8571=>600,8572=>600,8573=>600,8574=>600,8575=>600,8592=>600,8593=>600,8594=>600,8595=>600,8596=>600,8597=>600,8598=>600,8599=>600,8600=>600,8601=>600,8612=>600,8613=>600,8614=>600,8615=>600,8616=>600,8617=>600,8618=>600,8628=>600,8629=>600,8636=>600,8637=>600,8638=>600,8639=>600,8640=>600,8641=>600,8642=>600,8643=>600,8644=>600,8646=>600,8651=>600,8652=>600,8656=>600,8657=>600,8658=>600,8659=>600,8660=>600,8661=>600,8668=>600,8669=>600,8704=>600,8705=>600,8706=>600,8707=>600,8708=>600,8709=>600,8710=>600,8711=>600,8712=>600,8713=>600,8714=>600,8715=>600,8716=>600,8717=>600,8718=>600,8719=>600,8720=>600,8721=>600,8722=>600,8723=>600,8724=>600,8725=>600,8726=>600,8727=>600,8728=>600,8729=>600,8730=>600,8731=>600,8732=>600,8733=>600,8734=>600,8735=>600,8736=>600,8739=>600,8740=>600,8741=>600,8742=>600,8745=>600,8746=>600,8747=>600,8748=>600,8756=>600,8757=>600,8758=>600,8759=>600,8764=>600,8769=>600,8770=>600,8771=>600,8773=>600,8776=>600,8800=>600,8801=>600,8804=>600,8805=>600,8834=>600,8835=>600,8836=>600,8837=>600,8838=>600,8839=>600,8869=>600,8898=>600,8899=>600,8901=>600,8976=>600,8994=>600,8995=>600,9001=>600,9002=>600,9251=>600,9674=>600,9675=>600,9711=>600,9824=>600,9825=>600,9826=>600,9827=>600,9828=>600,9829=>600,9830=>600,9831=>600,9833=>600,9834=>600,9835=>600,9836=>600,9837=>600,9838=>600,9839=>600,11798=>600,11799=>600,11800=>600,11802=>600,11803=>600,11806=>600,11807=>600,11816=>600,11817=>600,11818=>600,11819=>600,11820=>600,11821=>600,11822=>600,42888=>600,42889=>600,42890=>600,42891=>600,42892=>600,64256=>600,64257=>600,64258=>600,64285=>600,64286=>600,64287=>600,64288=>600,64289=>600,64290=>600,64291=>600,64292=>600,64293=>600,64294=>600,64295=>600,64296=>600,64297=>600,64298=>600,64299=>600,64300=>600,64301=>600,64302=>600,64303=>600,64304=>600,64305=>600,64306=>600,64307=>600,64308=>600,64309=>600,64310=>600,64312=>600,64313=>600,64314=>600,64315=>600,64316=>600,64318=>600,64320=>600,64321=>600,64323=>600,64324=>600,64326=>600,64327=>600,64328=>600,64329=>600,64330=>600,64331=>600,64332=>600,64333=>600,64334=>600,64335=>600,65529=>600,65530=>600,65531=>600,65532=>600,65533=>600,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonoi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonoi.z
new file mode 100644
index 00000000..fa76f851
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freemonoi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freesans.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesans.ctg.z
new file mode 100644
index 00000000..61b27293
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesans.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freesans.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesans.php
new file mode 100644
index 00000000..3b61795f
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesans.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='FreeSans';
+$up=-176;
+$ut=50;
+$dw=800;
+$diff='';
+$originalsize=1563256;
+$enc='';
+$file='freesans.z';
+$ctg='freesans.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-1166 -638 2260 1050]','ItalicAngle'=>0,'Ascent'=>900,'Descent'=>-200,'Leading'=>100,'CapHeight'=>729,'XHeight'=>524,'StemV'=>70,'StemH'=>30,'AvgWidth'=>657,'MaxWidth'=>2256,'MissingWidth'=>800);
+$cw=array(0=>800,32=>250,33=>333,34=>333,35=>556,36=>556,37=>889,38=>667,39=>200,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>250,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>250,59=>250,60=>584,61=>584,62=>584,63=>556,64=>1015,65=>666,66=>664,67=>709,68=>698,69=>633,70=>599,71=>765,72=>721,73=>278,74=>528,75=>674,76=>563,77=>846,78=>730,79=>784,80=>656,81=>784,82=>709,83=>667,84=>632,85=>720,86=>645,87=>937,88=>657,89=>678,90=>615,91=>278,92=>278,93=>277,94=>469,95=>556,96=>250,97=>543,98=>559,99=>506,100=>559,101=>533,102=>280,103=>550,104=>536,105=>222,106=>243,107=>514,108=>214,109=>812,110=>537,111=>534,112=>559,113=>559,114=>332,115=>493,116=>280,117=>537,118=>496,119=>722,120=>476,121=>478,122=>486,123=>333,124=>250,125=>333,126=>500,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>800,170=>370,171=>500,172=>584,173=>333,174=>800,175=>333,176=>606,177=>584,178=>350,179=>350,180=>333,181=>556,182=>537,183=>250,184=>333,185=>350,186=>365,187=>500,188=>869,189=>869,190=>879,191=>556,192=>666,193=>666,194=>666,195=>666,196=>666,197=>666,198=>984,199=>709,200=>633,201=>633,202=>633,203=>633,204=>278,205=>278,206=>300,207=>300,208=>707,209=>730,210=>784,211=>784,212=>784,213=>784,214=>784,215=>584,216=>789,217=>720,218=>720,219=>720,220=>720,221=>678,222=>645,223=>594,224=>543,225=>543,226=>543,227=>543,228=>543,229=>543,230=>871,231=>506,232=>533,233=>533,234=>533,235=>533,236=>222,237=>222,238=>262,239=>262,240=>534,241=>537,242=>534,243=>534,244=>534,245=>534,246=>534,247=>584,248=>534,249=>537,250=>537,251=>537,252=>537,253=>478,254=>558,255=>478,256=>666,257=>543,258=>666,259=>543,260=>667,261=>543,262=>709,263=>506,264=>709,265=>506,266=>709,267=>506,268=>709,269=>506,270=>698,271=>745,272=>707,273=>576,274=>633,275=>533,276=>633,277=>533,278=>633,279=>533,280=>642,281=>533,282=>633,283=>533,284=>765,285=>550,286=>765,287=>550,288=>765,289=>550,290=>765,291=>550,292=>721,293=>536,294=>722,295=>554,296=>300,297=>262,298=>278,299=>262,300=>300,301=>262,302=>278,303=>262,304=>278,305=>222,306=>759,307=>384,308=>528,309=>262,310=>674,311=>514,312=>514,313=>563,314=>242,315=>563,316=>214,317=>563,318=>385,319=>563,320=>360,321=>612,322=>252,323=>730,324=>537,325=>730,326=>537,327=>730,328=>537,329=>647,330=>677,331=>537,332=>784,333=>534,334=>784,335=>534,336=>784,337=>534,338=>986,339=>919,340=>709,341=>332,342=>709,343=>332,344=>709,345=>332,346=>667,347=>493,348=>667,349=>493,350=>667,351=>493,352=>667,353=>493,354=>632,355=>284,356=>632,357=>440,358=>632,359=>285,360=>720,361=>537,362=>720,363=>537,364=>720,365=>537,366=>720,367=>537,368=>720,369=>537,370=>720,371=>537,372=>937,373=>722,374=>678,375=>478,376=>678,377=>615,378=>486,379=>615,380=>486,381=>615,382=>486,383=>280,384=>581,385=>842,386=>664,387=>559,388=>713,389=>593,390=>709,391=>771,392=>577,393=>707,394=>876,395=>664,396=>559,397=>552,398=>633,399=>710,400=>653,401=>609,402=>278,403=>812,404=>678,405=>853,406=>256,407=>363,408=>673,409=>514,410=>345,411=>546,412=>864,413=>730,414=>537,415=>782,416=>792,417=>559,418=>1016,419=>726,420=>824,421=>559,422=>655,423=>667,424=>500,425=>615,426=>350,427=>280,428=>638,429=>281,430=>632,431=>776,432=>619,433=>757,434=>695,435=>728,436=>613,437=>615,438=>486,439=>619,440=>609,441=>524,442=>509,443=>556,446=>492,447=>561,448=>260,449=>370,450=>584,451=>278,452=>1275,453=>1178,454=>1032,455=>1054,456=>778,457=>424,458=>1216,459=>924,460=>758,461=>666,462=>543,463=>300,464=>262,465=>784,466=>534,467=>720,468=>537,469=>720,470=>537,471=>720,472=>537,473=>720,474=>537,475=>720,476=>537,477=>533,478=>666,479=>543,480=>666,481=>543,482=>984,483=>871,484=>774,485=>555,486=>765,487=>550,488=>674,489=>514,490=>784,491=>534,492=>784,493=>534,494=>619,495=>524,496=>222,497=>1297,498=>1178,499=>1042,500=>765,501=>550,503=>609,504=>730,505=>537,506=>666,507=>543,508=>984,509=>871,510=>789,511=>611,512=>666,513=>543,514=>666,515=>543,516=>633,517=>533,518=>633,519=>533,520=>300,521=>262,522=>300,523=>262,524=>784,525=>534,526=>784,527=>534,528=>709,529=>332,530=>709,531=>332,532=>720,533=>537,534=>720,535=>537,536=>667,537=>493,538=>632,539=>280,540=>539,541=>414,542=>721,543=>536,544=>720,548=>615,549=>486,550=>666,551=>543,552=>633,553=>533,554=>784,555=>534,556=>784,557=>534,558=>784,559=>534,560=>784,561=>534,562=>678,563=>478,567=>222,568=>915,569=>914,592=>543,593=>572,594=>572,595=>559,596=>506,597=>501,598=>602,599=>596,600=>533,601=>533,602=>784,603=>485,604=>485,605=>736,606=>505,607=>288,608=>587,609=>557,610=>562,611=>483,612=>552,613=>536,614=>536,615=>536,616=>268,617=>255,618=>278,619=>473,620=>427,621=>260,622=>608,623=>812,624=>812,625=>812,626=>575,627=>576,628=>547,629=>534,630=>754,631=>728,632=>700,633=>332,634=>332,635=>380,636=>332,637=>332,638=>368,639=>368,640=>529,641=>536,642=>500,643=>299,644=>298,645=>309,646=>463,647=>280,648=>280,649=>596,650=>608,651=>520,652=>496,653=>722,654=>478,655=>506,656=>564,657=>508,658=>524,659=>530,660=>498,661=>498,662=>498,663=>699,664=>784,665=>488,666=>505,667=>622,668=>538,669=>459,670=>514,671=>390,672=>606,673=>498,674=>498,675=>921,676=>960,677=>945,678=>705,679=>524,680=>770,681=>798,682=>652,683=>569,684=>530,685=>486,686=>574,687=>611,688=>333,689=>333,690=>167,691=>236,692=>236,693=>276,694=>359,695=>500,696=>330,697=>278,698=>454,699=>250,700=>250,701=>250,702=>250,703=>250,704=>333,705=>333,706=>333,707=>333,708=>333,709=>333,710=>333,711=>333,712=>250,713=>333,714=>333,715=>333,716=>250,717=>333,718=>333,719=>333,720=>333,721=>333,722=>250,723=>250,724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333,731=>333,732=>333,733=>333,734=>333,735=>333,736=>333,737=>186,738=>333,739=>333,740=>334,741=>526,742=>526,743=>526,744=>526,745=>526,746=>519,747=>519,748=>333,749=>333,750=>400,751=>333,752=>333,753=>333,754=>333,755=>333,756=>250,757=>333,758=>333,759=>333,760=>250,761=>200,762=>200,763=>200,764=>200,765=>333,766=>333,767=>333,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0,875=>0,876=>0,877=>0,878=>0,879=>0,884=>278,885=>199,890=>332,891=>460,892=>456,893=>460,894=>278,900=>333,901=>333,902=>666,903=>275,904=>785,905=>874,906=>413,908=>866,910=>893,911=>809,912=>284,913=>666,914=>664,915=>594,916=>699,917=>633,918=>615,919=>721,920=>784,921=>278,922=>674,923=>666,924=>846,925=>730,926=>626,927=>784,928=>720,929=>656,931=>636,932=>632,933=>678,934=>739,935=>657,936=>762,937=>757,938=>278,939=>678,940=>578,941=>497,942=>549,943=>307,944=>558,945=>578,946=>544,947=>518,948=>552,949=>497,950=>447,951=>549,952=>505,953=>284,954=>500,955=>546,956=>540,957=>496,958=>485,959=>544,960=>594,961=>574,962=>539,963=>606,964=>492,965=>558,966=>711,967=>569,968=>698,969=>728,970=>284,971=>558,972=>544,973=>558,974=>728,977=>553,978=>691,979=>884,980=>691,981=>700,982=>728,983=>556,1008=>580,1009=>574,1010=>456,1011=>243,1012=>782,1013=>308,1014=>308,1017=>619,1021=>619,1022=>619,1023=>619,1024=>643,1025=>643,1026=>770,1027=>599,1028=>709,1029=>667,1030=>278,1031=>300,1032=>528,1033=>1009,1034=>1009,1035=>770,1036=>637,1037=>730,1038=>623,1039=>722,1040=>666,1041=>664,1042=>664,1043=>599,1044=>812,1045=>643,1046=>915,1047=>653,1048=>730,1049=>730,1050=>637,1051=>671,1052=>846,1053=>721,1054=>784,1055=>721,1056=>646,1057=>709,1058=>632,1059=>623,1060=>845,1061=>657,1062=>742,1063=>620,1064=>830,1065=>851,1066=>845,1067=>879,1068=>664,1069=>709,1070=>995,1071=>686,1072=>543,1073=>534,1074=>488,1075=>390,1076=>582,1077=>533,1078=>765,1079=>485,1080=>547,1081=>547,1082=>484,1083=>497,1084=>598,1085=>538,1086=>534,1087=>537,1088=>559,1089=>506,1090=>412,1091=>478,1092=>849,1093=>476,1094=>558,1095=>490,1096=>672,1097=>702,1098=>646,1099=>680,1100=>503,1101=>506,1102=>741,1103=>529,1104=>533,1105=>533,1106=>577,1107=>390,1108=>506,1109=>502,1110=>224,1111=>262,1112=>243,1113=>796,1114=>837,1115=>579,1116=>484,1117=>547,1118=>478,1119=>538,1120=>936,1121=>680,1122=>815,1123=>636,1124=>947,1125=>702,1126=>785,1127=>556,1128=>1025,1129=>746,1130=>915,1131=>765,1132=>1125,1133=>935,1134=>653,1135=>485,1136=>762,1137=>698,1138=>784,1139=>534,1140=>772,1141=>570,1142=>772,1143=>570,1144=>1170,1145=>944,1146=>864,1147=>594,1148=>936,1149=>680,1150=>936,1151=>680,1154=>468,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>763,1163=>573,1164=>693,1165=>520,1166=>646,1167=>562,1168=>601,1169=>387,1170=>614,1171=>412,1172=>599,1173=>467,1174=>932,1175=>835,1176=>653,1177=>485,1178=>658,1179=>494,1180=>680,1181=>514,1182=>689,1183=>524,1184=>845,1185=>658,1186=>740,1187=>558,1188=>995,1189=>709,1190=>1058,1191=>790,1192=>802,1193=>626,1194=>709,1195=>506,1196=>632,1197=>412,1198=>678,1199=>588,1200=>678,1201=>588,1202=>674,1203=>486,1204=>951,1205=>672,1206=>640,1207=>501,1208=>630,1209=>480,1210=>630,1211=>480,1212=>915,1213=>691,1214=>915,1215=>691,1216=>254,1217=>915,1218=>765,1219=>671,1220=>482,1221=>694,1222=>518,1223=>721,1224=>538,1225=>744,1226=>559,1227=>630,1228=>480,1229=>869,1230=>619,1231=>254,1232=>666,1233=>543,1234=>666,1235=>543,1236=>984,1237=>871,1238=>643,1239=>533,1240=>710,1241=>543,1242=>710,1243=>543,1244=>915,1245=>765,1246=>653,1247=>485,1248=>619,1249=>534,1250=>730,1251=>547,1252=>730,1253=>547,1254=>784,1255=>534,1256=>784,1257=>534,1258=>784,1259=>534,1260=>709,1261=>506,1262=>623,1263=>478,1264=>623,1265=>478,1266=>623,1267=>478,1268=>620,1269=>490,1270=>599,1271=>390,1272=>879,1273=>680,1274=>614,1275=>412,1276=>657,1277=>476,1278=>657,1279=>476,1296=>653,1297=>485,1298=>671,1299=>497,1306=>784,1307=>559,1308=>937,1309=>712,1310=>637,1311=>484,1316=>727,1317=>564,1318=>627,1319=>517,1329=>730,1330=>693,1331=>730,1332=>735,1333=>693,1334=>751,1335=>446,1336=>703,1337=>790,1338=>656,1339=>697,1340=>390,1341=>852,1342=>791,1343=>698,1344=>585,1345=>656,1346=>651,1347=>658,1348=>759,1349=>595,1350=>772,1351=>603,1352=>703,1353=>648,1354=>698,1355=>744,1356=>738,1357=>703,1358=>739,1359=>660,1360=>693,1361=>623,1362=>385,1363=>788,1364=>632,1365=>775,1366=>714,1369=>250,1370=>222,1371=>200,1372=>333,1373=>333,1374=>333,1375=>333,1377=>833,1378=>551,1379=>572,1380=>569,1381=>546,1382=>581,1383=>353,1384=>551,1385=>568,1386=>569,1387=>552,1388=>276,1389=>795,1390=>535,1391=>553,1392=>537,1393=>512,1394=>568,1395=>552,1396=>531,1397=>249,1398=>527,1399=>405,1400=>551,1401=>390,1402=>833,1403=>509,1404=>523,1405=>545,1406=>584,1407=>879,1408=>552,1409=>552,1410=>301,1411=>884,1412=>578,1413=>556,1414=>668,1415=>544,1417=>278,1418=>333,1423=>735,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>448,1471=>0,1472=>212,1473=>0,1474=>0,1475=>278,1476=>0,1477=>0,1478=>378,1479=>0,1488=>640,1489=>591,1490=>466,1491=>598,1492=>622,1493=>212,1494=>351,1495=>623,1496=>608,1497=>200,1498=>526,1499=>550,1500=>600,1501=>623,1502=>621,1503=>212,1504=>378,1505=>607,1506=>587,1507=>575,1508=>568,1509=>540,1510=>590,1511=>606,1512=>547,1513=>776,1514=>687,1520=>424,1521=>412,1522=>400,1523=>184,1524=>344,1792=>600,1793=>201,1794=>201,1795=>201,1796=>201,1797=>500,1798=>500,1799=>500,1800=>370,1801=>370,1802=>574,1803=>574,1804=>645,1805=>574,1807=>0,1808=>452,1809=>452,1810=>574,1811=>645,1812=>645,1813=>509,1814=>509,1815=>682,1816=>585,1817=>404,1818=>627,1819=>718,1820=>718,1821=>484,1822=>682,1823=>600,1824=>660,1825=>682,1826=>538,1827=>718,1828=>718,1829=>718,1830=>574,1831=>574,1832=>638,1833=>585,1834=>509,1835=>682,1836=>682,1837=>574,1838=>645,1839=>509,1840=>0,1841=>0,1842=>0,1843=>0,1844=>0,1845=>0,1846=>0,1847=>0,1848=>0,1849=>0,1850=>0,1851=>0,1852=>0,1853=>0,1854=>0,1855=>0,1856=>0,1857=>0,1858=>0,1859=>0,1860=>0,1861=>0,1862=>0,1863=>0,1864=>0,1865=>0,1866=>0,1869=>660,1870=>660,1871=>660,2304=>0,2305=>0,2306=>0,2307=>305,2308=>717,2309=>717,2310=>888,2311=>464,2312=>464,2313=>582,2314=>804,2315=>921,2316=>641,2317=>433,2318=>433,2319=>433,2320=>433,2321=>888,2322=>888,2323=>888,2324=>888,2325=>749,2326=>780,2327=>522,2328=>590,2329=>680,2330=>620,2331=>644,2332=>703,2333=>692,2334=>680,2335=>568,2336=>531,2337=>611,2338=>538,2339=>608,2340=>564,2341=>660,2342=>500,2343=>593,2344=>568,2345=>568,2346=>479,2347=>733,2348=>492,2349=>578,2350=>518,2351=>556,2352=>435,2353=>435,2354=>656,2355=>661,2356=>661,2357=>492,2358=>646,2359=>479,2360=>667,2361=>486,2362=>0,2363=>226,2364=>0,2365=>442,2366=>226,2367=>226,2368=>226,2369=>0,2370=>0,2371=>0,2372=>0,2373=>0,2374=>0,2375=>0,2376=>0,2377=>226,2378=>226,2379=>226,2380=>226,2381=>0,2382=>149,2383=>226,2384=>839,2385=>0,2386=>0,2387=>0,2388=>0,2389=>0,2390=>0,2391=>0,2392=>749,2393=>780,2394=>522,2395=>703,2396=>611,2397=>538,2398=>733,2399=>556,2400=>900,2401=>626,2402=>0,2403=>0,2404=>674,2405=>674,2406=>575,2407=>575,2408=>575,2409=>575,2410=>575,2411=>575,2412=>575,2413=>575,2414=>575,2415=>575,2416=>365,2417=>387,2418=>717,2419=>717,2420=>888,2421=>888,2422=>717,2423=>717,2425=>703,2426=>556,2427=>568,2428=>703,2429=>575,2430=>611,2431=>492,2433=>0,2434=>300,2435=>264,2437=>656,2438=>829,2439=>507,2440=>564,2441=>539,2442=>559,2443=>600,2444=>481,2447=>580,2448=>627,2451=>540,2452=>613,2453=>570,2454=>467,2455=>481,2456=>438,2457=>483,2458=>408,2459=>509,2460=>601,2461=>563,2462=>771,2463=>401,2464=>404,2465=>540,2466=>408,2467=>460,2468=>543,2469=>477,2470=>418,2471=>433,2472=>445,2474=>499,2475=>594,2476=>397,2477=>565,2478=>458,2479=>433,2480=>396,2482=>508,2486=>518,2487=>445,2488=>508,2489=>460,2492=>0,2493=>440,2494=>193,2495=>189,2496=>180,2497=>0,2498=>0,2499=>0,2500=>0,2503=>295,2504=>303,2507=>0,2508=>0,2509=>0,2510=>356,2519=>219,2524=>540,2525=>408,2527=>433,2528=>594,2529=>481,2530=>0,2531=>0,2534=>500,2535=>437,2536=>479,2537=>530,2538=>497,2539=>500,2540=>482,2541=>503,2542=>517,2543=>481,2544=>377,2545=>377,2546=>429,2547=>383,2548=>429,2549=>478,2550=>545,2551=>158,2552=>365,2553=>280,2554=>357,2555=>344,2561=>0,2562=>0,2563=>351,2565=>860,2566=>1088,2567=>869,2568=>928,2569=>723,2570=>723,2575=>665,2576=>857,2579=>716,2580=>858,2581=>682,2582=>634,2583=>696,2584=>744,2585=>649,2586=>674,2587=>656,2588=>653,2589=>629,2590=>639,2591=>641,2592=>657,2593=>650,2594=>653,2595=>651,2596=>640,2597=>634,2598=>662,2599=>630,2600=>625,2602=>645,2603=>653,2604=>624,2605=>613,2606=>658,2607=>734,2608=>620,2610=>676,2611=>719,2613=>626,2614=>666,2616=>666,2617=>614,2620=>0,2622=>286,2623=>322,2624=>301,2625=>0,2626=>0,2631=>0,2632=>0,2635=>0,2636=>0,2637=>0,2641=>0,2649=>636,2650=>762,2651=>652,2652=>653,2654=>656,2662=>672,2663=>543,2664=>622,2665=>622,2666=>576,2667=>589,2668=>509,2669=>645,2670=>661,2671=>655,2672=>0,2673=>0,2674=>666,2675=>726,2676=>1217,2677=>0,3330=>419,3331=>273,3333=>1360,3334=>1522,3335=>981,3336=>1728,3337=>720,3338=>1473,3339=>865,3340=>1059,3342=>1203,3343=>1231,3344=>1902,3346=>714,3347=>1195,3348=>1463,3349=>954,3350=>910,3351=>910,3352=>1343,3353=>1002,3354=>865,3355=>1281,3356=>841,3357=>1536,3358=>1342,3359=>589,3360=>666,3361=>1291,3362=>1332,3363=>1326,3364=>954,3365=>823,3366=>618,3367=>928,3368=>928,3369=>928,3370=>855,3371=>1143,3372=>1203,3373=>644,3374=>628,3375=>1022,3376=>716,3377=>662,3378=>855,3379=>714,3380=>641,3381=>878,3382=>1009,3383=>1098,3384=>1287,3385=>1147,3386=>855,3389=>700,3390=>506,3391=>217,3392=>217,3393=>372,3394=>372,3395=>451,3396=>451,3398=>714,3399=>535,3400=>1404,3402=>0,3403=>0,3404=>0,3405=>0,3406=>273,3415=>724,3424=>865,3425=>1213,3426=>0,3427=>0,3430=>687,3431=>693,3432=>764,3433=>1030,3434=>666,3435=>934,3436=>1213,3437=>680,3438=>832,3439=>941,3440=>1221,3441=>886,3442=>1322,3443=>874,3444=>900,3445=>1044,3449=>1148,3450=>1400,3451=>994,3452=>700,3453=>1114,3454=>1004,3455=>957,4256=>587,4257=>620,4258=>642,4259=>815,4260=>600,4261=>595,4262=>799,4263=>893,4264=>622,4265=>597,4266=>939,4267=>602,4268=>603,4269=>790,4270=>587,4271=>623,4272=>799,4273=>601,4274=>792,4275=>724,4276=>847,4277=>599,4278=>812,4279=>603,4280=>653,4281=>590,4282=>754,4283=>596,4284=>653,4285=>651,4286=>596,4287=>888,4288=>593,4304=>436,4305=>491,4306=>528,4307=>692,4308=>447,4309=>447,4310=>628,4311=>734,4312=>449,4313=>445,4314=>843,4315=>449,4316=>449,4317=>682,4318=>449,4319=>480,4320=>682,4321=>468,4322=>710,4323=>623,4324=>697,4325=>447,4326=>702,4327=>447,4328=>470,4329=>440,4330=>632,4331=>449,4332=>470,4333=>536,4334=>449,4335=>656,4336=>474,4337=>630,4338=>394,4339=>419,4340=>422,4341=>436,4345=>528,4347=>515,4348=>449,5024=>678,5025=>756,5026=>604,5027=>770,5028=>969,5029=>207,5030=>633,5031=>800,5032=>474,5033=>689,5034=>672,5035=>446,5036=>637,5037=>776,5038=>511,5039=>723,5040=>528,5041=>591,5042=>839,5043=>963,5044=>615,5045=>563,5046=>705,5047=>800,5048=>558,5049=>880,5050=>966,5051=>675,5052=>527,5053=>733,5054=>779,5055=>547,5056=>756,5057=>834,5058=>604,5059=>632,5060=>605,5061=>1051,5062=>657,5063=>842,5064=>748,5065=>1192,5066=>842,5067=>632,5068=>668,5069=>928,5070=>626,5071=>655,5072=>502,5073=>696,5074=>642,5075=>518,5076=>952,5077=>622,5078=>710,5079=>521,5080=>556,5081=>656,5082=>622,5083=>881,5084=>760,5085=>564,5086=>567,5087=>712,5088=>717,5089=>838,5090=>617,5091=>689,5092=>767,5093=>728,5094=>690,5095=>551,5096=>859,5097=>957,5098=>900,5099=>779,5100=>805,5101=>621,5102=>604,5103=>842,5104=>653,5105=>737,5106=>601,5107=>901,5108=>655,5120=>584,5121=>941,5122=>941,5123=>941,5124=>941,5125=>726,5126=>726,5127=>726,5128=>726,5129=>726,5130=>726,5131=>726,5132=>941,5133=>941,5134=>941,5135=>941,5136=>941,5137=>941,5138=>882,5139=>882,5140=>882,5141=>882,5142=>726,5143=>882,5144=>882,5145=>882,5146=>882,5147=>726,5148=>494,5149=>347,5150=>447,5151=>329,5152=>329,5153=>452,5154=>452,5155=>276,5156=>451,5157=>463,5158=>289,5159=>216,5160=>400,5161=>400,5162=>400,5163=>1169,5164=>941,5165=>810,5166=>1012,5167=>941,5168=>941,5169=>941,5170=>941,5171=>726,5172=>726,5173=>726,5174=>726,5175=>726,5176=>726,5177=>726,5178=>941,5179=>941,5180=>941,5181=>941,5182=>941,5183=>941,5184=>726,5185=>882,5186=>726,5187=>882,5188=>882,5189=>726,5190=>882,5191=>726,5192=>726,5193=>390,5194=>159,5195=>332,5196=>742,5197=>742,5198=>742,5199=>742,5200=>744,5201=>744,5202=>744,5203=>744,5204=>744,5205=>744,5206=>744,5207=>914,5208=>912,5209=>912,5210=>914,5211=>912,5212=>914,5213=>744,5214=>916,5215=>744,5216=>916,5217=>916,5218=>744,5219=>916,5220=>744,5221=>915,5222=>477,5223=>855,5224=>855,5225=>855,5226=>855,5227=>592,5228=>592,5229=>592,5230=>592,5231=>592,5232=>610,5233=>713,5234=>592,5235=>608,5236=>718,5237=>764,5238=>764,5239=>718,5240=>764,5241=>718,5242=>718,5243=>763,5244=>735,5245=>763,5246=>764,5247=>718,5248=>764,5249=>734,5250=>763,5251=>361,5252=>361,5253=>708,5254=>708,5255=>708,5256=>651,5257=>592,5258=>592,5259=>592,5260=>592,5261=>592,5262=>610,5263=>713,5264=>592,5265=>608,5266=>608,5267=>763,5268=>763,5269=>608,5270=>763,5271=>608,5272=>609,5273=>763,5274=>627,5275=>763,5276=>763,5277=>609,5278=>763,5279=>625,5280=>763,5281=>361,5282=>361,5283=>592,5284=>592,5285=>592,5286=>592,5287=>592,5288=>610,5289=>713,5290=>592,5291=>608,5292=>592,5293=>763,5294=>763,5295=>592,5296=>763,5297=>592,5298=>592,5299=>763,5300=>610,5301=>763,5302=>763,5303=>592,5304=>763,5305=>608,5306=>763,5307=>346,5308=>276,5309=>346,5310=>331,5311=>562,5312=>712,5313=>712,5314=>712,5315=>712,5316=>712,5317=>712,5318=>712,5319=>712,5320=>712,5321=>868,5322=>828,5323=>828,5324=>712,5325=>828,5326=>712,5327=>712,5328=>466,5329=>452,5330=>466,5331=>712,5332=>712,5333=>712,5334=>712,5335=>712,5336=>712,5337=>712,5338=>712,5339=>712,5340=>868,5341=>828,5342=>828,5343=>868,5344=>828,5345=>868,5346=>712,5347=>828,5348=>712,5349=>828,5350=>828,5351=>712,5352=>828,5353=>712,5354=>466,5355=>262,5356=>624,5357=>504,5358=>524,5359=>504,5360=>521,5361=>504,5362=>520,5363=>624,5364=>504,5365=>520,5366=>620,5367=>660,5368=>659,5369=>620,5370=>676,5371=>620,5372=>620,5373=>660,5374=>637,5375=>676,5376=>659,5377=>620,5378=>659,5379=>636,5380=>659,5381=>309,5382=>365,5383=>309,5384=>458,5385=>315,5386=>315,5387=>347,5388=>1010,5389=>1020,5390=>872,5391=>872,5392=>830,5393=>830,5394=>830,5395=>854,5396=>854,5397=>854,5398=>854,5399=>1001,5400=>1002,5401=>1001,5402=>1002,5403=>1001,5404=>1002,5405=>998,5406=>998,5407=>998,5408=>998,5409=>998,5410=>998,5411=>998,5412=>998,5413=>594,5414=>516,5415=>516,5416=>516,5417=>516,5418=>516,5419=>532,5420=>636,5421=>516,5422=>532,5423=>671,5424=>672,5425=>671,5426=>672,5427=>671,5428=>672,5429=>671,5430=>672,5431=>687,5432=>672,5433=>671,5434=>672,5435=>671,5436=>688,5437=>671,5438=>372,5439=>505,5440=>464,5441=>460,5442=>830,5443=>830,5444=>830,5445=>830,5446=>830,5447=>830,5448=>556,5449=>556,5450=>556,5451=>556,5452=>556,5453=>556,5454=>691,5455=>712,5456=>343,5457=>362,5458=>624,5459=>817,5460=>817,5461=>817,5462=>817,5463=>824,5464=>824,5465=>824,5466=>824,5467=>980,5468=>972,5469=>465,5470=>742,5471=>742,5472=>742,5473=>742,5474=>742,5475=>742,5476=>742,5477=>742,5478=>742,5479=>742,5480=>898,5481=>848,5482=>410,5483=>742,5484=>742,5485=>744,5486=>744,5487=>825,5488=>742,5489=>742,5490=>744,5491=>744,5492=>800,5493=>800,5494=>800,5495=>800,5496=>800,5497=>800,5498=>800,5499=>493,5500=>592,5501=>460,5502=>875,5503=>875,5504=>875,5505=>777,5506=>795,5507=>875,5508=>875,5509=>644,5510=>592,5511=>592,5512=>592,5513=>592,5514=>782,5515=>782,5516=>782,5517=>782,5518=>1056,5519=>1056,5520=>1056,5521=>687,5522=>705,5523=>1056,5524=>1056,5525=>524,5526=>782,5527=>646,5528=>646,5529=>646,5530=>646,5531=>712,5532=>712,5533=>712,5534=>712,5535=>466,5536=>772,5537=>772,5538=>772,5539=>772,5540=>772,5541=>772,5542=>466,5543=>638,5544=>638,5545=>638,5546=>638,5547=>638,5548=>638,5549=>638,5550=>388,5551=>488,5552=>515,5553=>515,5554=>515,5555=>515,5556=>592,5557=>592,5558=>592,5559=>592,5560=>542,5561=>542,5562=>542,5563=>542,5564=>561,5565=>561,5566=>561,5567=>561,5568=>630,5569=>630,5570=>630,5571=>630,5572=>941,5573=>941,5574=>726,5575=>726,5576=>726,5577=>726,5578=>941,5579=>941,5580=>726,5581=>726,5582=>726,5583=>726,5584=>941,5585=>941,5586=>726,5587=>726,5588=>730,5589=>726,5590=>941,5591=>941,5592=>726,5593=>726,5594=>730,5595=>726,5596=>830,5597=>830,5598=>830,5599=>830,5600=>830,5601=>830,5602=>830,5603=>830,5604=>830,5605=>830,5606=>830,5607=>830,5608=>830,5609=>830,5610=>830,5611=>830,5612=>830,5613=>830,5614=>400,5615=>722,5616=>722,5617=>722,5618=>722,5619=>722,5620=>722,5621=>722,5622=>722,5623=>722,5624=>722,5625=>722,5626=>722,5627=>722,5628=>722,5629=>722,5630=>722,5631=>722,5632=>722,5633=>522,5634=>592,5635=>592,5636=>712,5637=>712,5638=>712,5639=>712,5640=>722,5641=>722,5642=>722,5643=>722,5644=>722,5645=>722,5646=>830,5647=>830,5648=>704,5649=>704,5650=>704,5651=>704,5652=>647,5653=>647,5654=>647,5655=>830,5656=>830,5657=>830,5658=>830,5659=>830,5660=>647,5661=>647,5662=>830,5663=>830,5664=>830,5665=>830,5666=>830,5667=>830,5668=>465,5669=>465,5670=>465,5671=>465,5672=>830,5673=>830,5674=>574,5675=>574,5676=>574,5677=>574,5678=>609,5679=>609,5680=>647,5681=>647,5682=>647,5683=>647,5684=>739,5685=>739,5686=>754,5687=>754,5688=>754,5689=>754,5690=>830,5691=>830,5692=>755,5693=>755,5694=>755,5695=>755,5696=>830,5697=>830,5698=>830,5699=>830,5700=>830,5701=>830,5702=>427,5703=>427,5704=>830,5705=>830,5706=>830,5707=>830,5708=>830,5709=>830,5710=>830,5711=>830,5712=>718,5713=>718,5714=>718,5715=>718,5716=>830,5717=>830,5718=>718,5719=>718,5720=>718,5721=>718,5722=>525,5723=>830,5724=>830,5725=>718,5726=>718,5727=>718,5728=>718,5729=>830,5730=>830,5731=>718,5732=>718,5733=>718,5734=>718,5735=>722,5736=>722,5737=>722,5738=>722,5739=>722,5740=>722,5741=>822,5742=>370,5743=>875,5744=>1056,5745=>1316,5746=>1314,5747=>963,5748=>981,5749=>1314,5750=>1330,5751=>668,5752=>778,5753=>778,5754=>698,5755=>698,5756=>778,5757=>778,5758=>400,5759=>400,6320=>726,6321=>726,6322=>726,6323=>882,6324=>726,6325=>726,6326=>786,6327=>744,6328=>592,6329=>764,6330=>592,6331=>712,6332=>712,6333=>712,6334=>504,6335=>504,6336=>830,6337=>830,6338=>1001,6339=>516,6340=>516,6341=>556,6342=>824,6343=>892,6344=>824,6345=>892,6346=>712,6347=>824,6348=>712,6349=>824,6350=>996,6351=>964,6352=>964,6353=>726,6354=>726,6355=>686,6356=>525,6357=>452,6358=>361,6359=>361,6360=>346,6361=>466,6362=>310,6363=>486,6364=>575,6365=>575,6366=>223,6367=>216,6368=>984,6369=>556,6370=>556,6371=>906,6372=>858,6373=>906,6374=>744,6375=>744,6376=>758,6377=>592,6378=>808,6379=>646,6380=>630,6381=>906,6382=>722,6383=>722,6384=>906,6385=>647,6386=>984,6387=>280,6388=>319,6389=>355,7424=>488,7425=>733,7426=>863,7427=>507,7428=>529,7429=>509,7430=>515,7431=>470,7432=>497,7433=>222,7434=>381,7435=>496,7436=>432,7437=>614,7439=>585,7448=>471,7449=>539,7450=>504,7451=>448,7452=>511,7456=>472,7457=>676,7458=>460,7579=>365,7581=>322,7582=>341,7583=>304,7588=>189,7589=>179,7590=>146,7595=>277,7596=>537,7597=>549,7598=>391,7599=>404,7600=>374,7601=>349,7602=>462,7607=>397,7608=>348,7609=>344,7612=>367,7613=>326,7614=>347,7615=>328,7680=>666,7681=>543,7682=>664,7683=>559,7684=>664,7685=>559,7686=>664,7687=>559,7688=>709,7689=>506,7690=>698,7691=>559,7692=>698,7693=>559,7694=>698,7695=>559,7696=>722,7697=>556,7698=>698,7699=>559,7700=>633,7701=>533,7702=>633,7703=>533,7704=>633,7705=>533,7706=>633,7707=>533,7708=>633,7709=>533,7710=>599,7711=>280,7712=>765,7713=>550,7714=>721,7715=>536,7716=>721,7717=>536,7718=>721,7719=>536,7720=>722,7721=>556,7722=>721,7723=>536,7724=>278,7725=>262,7726=>278,7727=>262,7728=>674,7729=>514,7730=>674,7731=>514,7732=>674,7733=>514,7734=>563,7735=>214,7736=>563,7737=>214,7738=>563,7739=>214,7740=>563,7741=>214,7742=>846,7743=>812,7744=>846,7745=>812,7746=>846,7747=>812,7748=>730,7749=>537,7750=>730,7751=>537,7752=>730,7753=>537,7754=>730,7755=>537,7756=>784,7757=>534,7758=>784,7759=>534,7760=>784,7761=>534,7762=>784,7763=>534,7764=>656,7765=>559,7766=>656,7767=>559,7768=>709,7769=>332,7770=>709,7771=>332,7772=>709,7773=>332,7774=>709,7775=>332,7776=>667,7777=>493,7778=>667,7779=>493,7780=>667,7781=>493,7782=>667,7783=>493,7784=>667,7785=>493,7786=>632,7787=>280,7788=>632,7789=>280,7790=>632,7791=>280,7792=>632,7793=>280,7794=>720,7795=>537,7796=>720,7797=>537,7798=>720,7799=>537,7800=>720,7801=>537,7802=>720,7803=>537,7804=>645,7805=>496,7806=>645,7807=>496,7808=>937,7809=>722,7810=>937,7811=>722,7812=>937,7813=>722,7814=>937,7815=>722,7816=>937,7817=>722,7818=>657,7819=>476,7820=>657,7821=>476,7822=>678,7823=>478,7824=>615,7825=>486,7826=>615,7827=>486,7828=>615,7829=>486,7830=>536,7831=>280,7832=>722,7833=>478,7834=>543,7835=>280,7836=>278,7837=>278,7838=>663,7839=>552,7840=>666,7841=>543,7842=>666,7843=>543,7844=>666,7845=>543,7846=>666,7847=>543,7848=>666,7849=>543,7850=>666,7851=>543,7852=>666,7853=>543,7854=>666,7855=>543,7856=>666,7857=>543,7858=>666,7859=>543,7860=>666,7861=>543,7862=>666,7863=>543,7864=>633,7865=>533,7866=>633,7867=>533,7868=>633,7869=>533,7870=>633,7871=>533,7872=>633,7873=>533,7874=>633,7875=>533,7876=>633,7877=>533,7878=>633,7879=>533,7880=>278,7881=>222,7882=>278,7883=>222,7884=>784,7885=>534,7886=>784,7887=>534,7888=>784,7889=>534,7890=>784,7891=>534,7892=>784,7893=>534,7894=>784,7895=>534,7896=>784,7897=>534,7898=>792,7899=>559,7900=>792,7901=>559,7902=>792,7903=>559,7904=>792,7905=>559,7906=>792,7907=>559,7908=>720,7909=>537,7910=>720,7911=>537,7912=>776,7913=>619,7914=>776,7915=>619,7916=>776,7917=>619,7918=>776,7919=>619,7920=>776,7921=>619,7922=>678,7923=>478,7924=>678,7925=>478,7926=>678,7927=>478,7928=>678,7929=>478,7936=>578,7937=>578,7938=>578,7939=>578,7940=>578,7941=>578,7942=>578,7943=>578,7944=>666,7945=>666,7946=>742,7947=>756,7948=>692,7949=>699,7950=>673,7951=>666,7952=>497,7953=>497,7954=>497,7955=>497,7956=>497,7957=>497,7960=>730,7961=>714,7962=>900,7963=>882,7964=>867,7965=>879,7968=>549,7969=>549,7970=>549,7971=>549,7972=>549,7973=>549,7974=>549,7975=>549,7976=>771,7977=>777,7978=>944,7979=>946,7980=>942,7981=>945,7982=>852,7983=>852,7984=>284,7985=>284,7986=>284,7987=>284,7988=>284,7989=>284,7990=>284,7991=>284,7992=>322,7993=>321,7994=>482,7995=>485,7996=>477,7997=>484,7998=>394,7999=>390,8000=>544,8001=>544,8002=>544,8003=>544,8004=>544,8005=>544,8008=>775,8009=>784,8010=>990,8011=>987,8012=>887,8013=>897,8016=>558,8017=>558,8018=>558,8019=>558,8020=>558,8021=>558,8022=>558,8023=>558,8025=>747,8027=>915,8029=>971,8031=>863,8032=>728,8033=>728,8034=>728,8035=>728,8036=>728,8037=>728,8038=>728,8039=>728,8040=>769,8041=>774,8042=>972,8043=>970,8044=>879,8045=>918,8046=>901,8047=>901,8048=>578,8049=>578,8050=>497,8051=>497,8052=>549,8053=>549,8054=>284,8055=>284,8056=>544,8057=>544,8058=>558,8059=>558,8060=>728,8061=>728,8064=>578,8065=>578,8066=>578,8067=>578,8068=>578,8069=>578,8070=>578,8071=>578,8072=>830,8073=>828,8074=>916,8075=>916,8076=>853,8077=>860,8078=>835,8079=>827,8080=>549,8081=>549,8082=>549,8083=>549,8084=>549,8085=>549,8086=>549,8087=>549,8088=>928,8089=>931,8090=>1104,8091=>1109,8092=>1099,8093=>1102,8094=>1009,8095=>1012,8096=>728,8097=>728,8098=>728,8099=>728,8100=>728,8101=>728,8102=>728,8103=>728,8104=>934,8105=>934,8106=>1130,8107=>1128,8108=>1045,8109=>1077,8110=>1062,8111=>1065,8112=>578,8113=>578,8114=>578,8115=>578,8116=>578,8118=>578,8119=>578,8120=>666,8121=>666,8122=>666,8123=>666,8124=>832,8125=>333,8126=>200,8127=>333,8128=>333,8129=>333,8130=>549,8131=>549,8132=>549,8134=>549,8135=>549,8136=>833,8137=>776,8138=>911,8139=>892,8140=>875,8141=>400,8142=>400,8143=>333,8144=>284,8145=>284,8146=>284,8147=>284,8150=>284,8151=>284,8152=>278,8153=>278,8154=>385,8155=>376,8157=>400,8158=>400,8159=>333,8160=>558,8161=>558,8162=>558,8163=>558,8164=>574,8165=>574,8166=>558,8167=>514,8168=>678,8169=>678,8170=>817,8171=>827,8172=>729,8173=>393,8174=>393,8175=>333,8178=>728,8179=>728,8180=>728,8182=>728,8183=>728,8184=>833,8185=>833,8186=>848,8187=>814,8188=>939,8189=>333,8190=>333,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>167,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>556,8211=>500,8212=>1000,8213=>1000,8214=>320,8215=>566,8216=>250,8217=>250,8218=>250,8219=>250,8220=>400,8221=>400,8222=>400,8223=>400,8224=>556,8225=>556,8226=>400,8227=>400,8228=>500,8229=>500,8230=>680,8231=>278,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>167,8240=>1000,8241=>1360,8242=>278,8243=>469,8244=>680,8245=>278,8246=>469,8247=>680,8248=>376,8249=>250,8250=>250,8251=>622,8252=>556,8253=>556,8254=>556,8255=>658,8256=>658,8257=>438,8258=>840,8259=>400,8260=>167,8261=>334,8262=>334,8263=>1112,8264=>834,8265=>834,8266=>556,8267=>537,8268=>537,8269=>537,8270=>389,8271=>278,8272=>658,8273=>389,8274=>634,8275=>500,8276=>658,8277=>787,8278=>515,8279=>855,8280=>722,8281=>725,8282=>224,8283=>722,8284=>604,8285=>224,8286=>224,8287=>0,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>350,8305=>140,8308=>350,8309=>350,8310=>350,8311=>350,8312=>350,8313=>350,8314=>350,8315=>350,8316=>350,8317=>350,8318=>350,8319=>360,8320=>350,8321=>350,8322=>350,8323=>350,8324=>350,8325=>350,8326=>350,8327=>350,8328=>350,8329=>350,8330=>350,8331=>350,8332=>350,8333=>350,8334=>350,8336=>363,8337=>366,8338=>360,8339=>325,8340=>350,8352=>623,8353=>615,8354=>601,8355=>611,8356=>556,8357=>833,8358=>682,8359=>1317,8360=>1202,8361=>879,8362=>869,8363=>538,8364=>655,8365=>667,8366=>611,8367=>1290,8368=>570,8369=>684,8370=>717,8371=>667,8372=>667,8373=>640,8376=>516,8377=>499,8400=>0,8401=>0,8402=>0,8403=>0,8404=>0,8405=>0,8406=>0,8407=>0,8408=>0,8409=>0,8410=>0,8411=>0,8412=>0,8413=>0,8414=>0,8415=>0,8416=>0,8417=>0,8420=>0,8421=>0,8422=>0,8423=>0,8424=>0,8425=>0,8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8432=>0,8448=>870,8449=>859,8450=>722,8451=>1017,8452=>556,8453=>796,8454=>832,8455=>653,8456=>722,8457=>919,8459=>1229,8460=>615,8461=>647,8462=>556,8463=>572,8464=>919,8465=>606,8466=>900,8467=>481,8468=>747,8469=>722,8470=>934,8471=>800,8472=>600,8473=>667,8474=>778,8475=>900,8476=>699,8477=>722,8478=>834,8479=>722,8480=>1043,8481=>1261,8482=>1000,8483=>667,8484=>611,8486=>757,8487=>757,8488=>512,8489=>284,8490=>674,8491=>666,8492=>918,8493=>623,8494=>533,8495=>469,8496=>712,8497=>965,8498=>588,8499=>1200,8501=>640,8502=>592,8503=>466,8504=>598,8505=>278,8506=>868,8507=>1338,8508=>619,8510=>582,8511=>722,8513=>765,8514=>563,8515=>556,8516=>678,8517=>780,8522=>516,8523=>655,8525=>1200,8526=>435,8531=>860,8532=>880,8533=>899,8534=>889,8535=>880,8536=>889,8537=>879,8538=>889,8539=>880,8540=>889,8541=>880,8542=>869,8543=>869,8544=>278,8545=>556,8546=>834,8547=>945,8548=>645,8549=>945,8550=>1223,8551=>1501,8552=>945,8553=>657,8554=>945,8555=>1223,8556=>563,8557=>709,8558=>698,8559=>846,8560=>222,8561=>444,8562=>666,8563=>722,8564=>496,8565=>722,8566=>944,8567=>1166,8568=>722,8569=>476,8570=>722,8571=>944,8572=>214,8573=>506,8574=>559,8575=>812,8592=>987,8593=>603,8594=>987,8595=>603,8596=>1042,8597=>1042,8598=>800,8599=>800,8600=>800,8601=>800,8612=>987,8613=>680,8614=>987,8615=>680,8617=>987,8618=>987,8628=>700,8629=>658,8636=>987,8637=>987,8638=>380,8639=>393,8640=>987,8641=>987,8642=>380,8643=>379,8644=>987,8645=>906,8646=>990,8647=>987,8648=>1010,8649=>987,8650=>1010,8651=>987,8652=>987,8656=>987,8657=>603,8658=>987,8659=>603,8660=>1042,8661=>603,8668=>1092,8669=>1092,8704=>667,8705=>676,8706=>556,8707=>667,8708=>667,8709=>802,8710=>711,8711=>711,8712=>584,8713=>584,8714=>585,8715=>584,8716=>584,8717=>585,8718=>500,8719=>783,8720=>783,8721=>771,8722=>584,8723=>584,8724=>584,8725=>510,8726=>392,8727=>500,8728=>500,8729=>500,8730=>512,8731=>512,8732=>512,8733=>713,8734=>713,8735=>639,8736=>768,8737=>768,8738=>600,8739=>200,8740=>288,8741=>320,8742=>340,8743=>608,8744=>608,8745=>768,8746=>768,8747=>465,8748=>705,8749=>905,8750=>464,8751=>761,8756=>800,8757=>800,8758=>250,8759=>620,8760=>584,8761=>778,8762=>584,8763=>500,8764=>500,8765=>500,8766=>573,8768=>244,8769=>584,8770=>584,8771=>584,8772=>584,8773=>584,8774=>584,8775=>584,8776=>500,8777=>500,8778=>584,8779=>500,8780=>584,8781=>554,8784=>584,8785=>584,8786=>584,8787=>584,8788=>735,8789=>755,8791=>584,8792=>584,8793=>584,8794=>584,8795=>584,8796=>584,8797=>584,8798=>584,8799=>584,8800=>584,8801=>584,8802=>584,8803=>600,8804=>584,8805=>584,8806=>584,8807=>584,8810=>955,8811=>955,8813=>554,8814=>584,8815=>584,8816=>584,8817=>584,8818=>584,8819=>584,8822=>584,8823=>584,8826=>584,8827=>584,8828=>584,8829=>584,8830=>584,8831=>584,8832=>584,8833=>584,8834=>584,8835=>584,8836=>584,8837=>584,8838=>584,8839=>584,8840=>584,8841=>584,8844=>768,8845=>768,8846=>768,8847=>636,8848=>636,8849=>636,8850=>636,8851=>636,8852=>636,8853=>768,8854=>778,8855=>778,8856=>768,8857=>778,8858=>776,8859=>776,8860=>776,8861=>776,8866=>658,8867=>658,8868=>658,8869=>658,8870=>500,8871=>528,8872=>758,8882=>636,8883=>636,8884=>636,8885=>636,8891=>584,8892=>608,8893=>584,8896=>744,8897=>744,8898=>764,8899=>764,8901=>298,8902=>471,8904=>710,8909=>584,8910=>584,8911=>584,8918=>584,8919=>564,8920=>1215,8921=>1215,8928=>584,8929=>584,8930=>636,8931=>636,8934=>584,8935=>584,8936=>584,8937=>584,8942=>250,8943=>1000,8944=>1000,8945=>1000,8960=>823,8968=>456,8969=>455,8970=>456,8971=>455,8976=>584,8992=>374,8993=>374,8994=>658,8995=>658,9001=>329,9002=>329,9115=>384,9116=>384,9117=>384,9118=>384,9119=>384,9120=>384,9121=>388,9122=>388,9123=>388,9124=>388,9125=>388,9126=>388,9127=>333,9128=>333,9129=>333,9130=>333,9131=>333,9132=>333,9133=>333,9134=>374,9138=>804,9139=>804,9216=>800,9217=>784,9218=>800,9219=>800,9220=>784,9221=>800,9222=>800,9223=>800,9224=>800,9225=>800,9226=>800,9227=>800,9228=>800,9229=>800,9230=>800,9231=>800,9232=>800,9233=>800,9234=>800,9235=>800,9236=>800,9237=>800,9238=>800,9239=>800,9240=>800,9241=>800,9242=>800,9243=>800,9244=>800,9245=>800,9246=>800,9247=>800,9248=>800,9249=>800,9250=>556,9251=>500,9252=>800,9253=>800,9254=>800,9312=>788,9313=>788,9314=>788,9315=>788,9316=>788,9317=>788,9318=>788,9319=>788,9320=>788,9321=>788,9472=>1000,9473=>1000,9474=>1000,9475=>1000,9476=>1000,9477=>1000,9478=>1000,9479=>1000,9480=>1000,9481=>1000,9482=>1000,9483=>1000,9484=>1000,9485=>1000,9486=>1000,9487=>1000,9488=>1000,9489=>1000,9490=>1000,9491=>1000,9492=>1000,9493=>1000,9494=>1000,9495=>1000,9496=>1000,9497=>1000,9498=>1000,9499=>1000,9500=>1000,9501=>1000,9502=>1000,9503=>1000,9504=>1000,9505=>1000,9506=>1000,9507=>1000,9508=>1000,9509=>1000,9510=>1000,9511=>1000,9512=>1000,9513=>1000,9514=>1000,9515=>1000,9516=>1000,9517=>1000,9518=>1000,9519=>1000,9520=>1000,9521=>1000,9522=>1000,9523=>1000,9524=>1000,9525=>1000,9526=>1000,9527=>1000,9528=>1000,9529=>1000,9530=>1000,9531=>1000,9532=>1000,9533=>1000,9534=>1000,9535=>1000,9536=>1000,9537=>1000,9538=>1000,9539=>1000,9540=>1000,9541=>1000,9542=>1000,9543=>1000,9544=>1000,9545=>1000,9546=>1000,9547=>1000,9552=>1000,9553=>1000,9554=>1000,9555=>1000,9556=>1000,9557=>1000,9558=>1000,9559=>1000,9560=>1000,9561=>1000,9562=>1000,9563=>1000,9564=>1000,9565=>1000,9566=>1000,9567=>1000,9568=>1000,9569=>1000,9570=>1000,9571=>1000,9572=>1000,9573=>1000,9574=>1000,9575=>1000,9576=>1000,9577=>1000,9578=>1000,9579=>1000,9580=>1000,9600=>1000,9601=>1000,9602=>1000,9603=>1000,9604=>1000,9605=>1000,9606=>1000,9607=>1000,9608=>1000,9609=>1000,9610=>1000,9611=>1000,9612=>1000,9613=>1000,9614=>1000,9615=>1000,9616=>1000,9617=>1000,9618=>1000,9619=>1000,9620=>1000,9621=>1000,9622=>1000,9623=>1000,9624=>1000,9625=>1000,9626=>1000,9627=>1000,9628=>1000,9629=>1000,9630=>1000,9631=>1000,9632=>800,9633=>800,9634=>800,9635=>800,9636=>800,9637=>800,9638=>800,9639=>800,9640=>800,9641=>800,9642=>625,9643=>625,9644=>800,9645=>800,9646=>800,9647=>800,9648=>1000,9649=>1000,9650=>892,9651=>892,9652=>669,9653=>669,9654=>892,9655=>892,9656=>669,9657=>669,9658=>891,9659=>891,9660=>892,9661=>892,9662=>669,9663=>669,9664=>892,9665=>892,9666=>669,9667=>669,9668=>891,9669=>891,9670=>788,9671=>788,9672=>788,9673=>800,9674=>489,9675=>800,9676=>800,9677=>800,9678=>800,9679=>800,9680=>800,9681=>800,9682=>800,9683=>800,9684=>800,9685=>800,9686=>800,9687=>800,9688=>400,9689=>800,9690=>800,9691=>800,9692=>800,9693=>800,9694=>800,9695=>799,9696=>800,9697=>800,9698=>1000,9699=>1000,9700=>1000,9701=>1000,9702=>400,9703=>800,9704=>800,9705=>800,9706=>800,9707=>800,9708=>892,9709=>892,9710=>892,9711=>1020,9712=>800,9713=>800,9714=>800,9715=>800,9716=>800,9717=>800,9718=>800,9719=>800,9720=>800,9721=>800,9722=>800,9723=>800,9724=>800,9725=>800,9726=>800,9727=>800,9772=>929,9773=>795,9785=>770,9786=>770,9824=>626,9825=>694,9826=>595,9827=>776,9828=>626,9829=>694,9830=>595,9831=>776,9833=>333,9834=>555,9835=>722,9836=>722,9837=>415,9838=>377,9839=>402,10048=>1161,10752=>1020,10753=>1020,10754=>1020,10755=>764,10756=>764,10761=>584,11568=>352,11569=>872,11570=>872,11571=>720,11572=>720,11573=>720,11574=>544,11575=>709,11576=>709,11577=>720,11578=>720,11579=>596,11580=>698,11581=>742,11582=>574,11583=>742,11584=>872,11585=>872,11586=>292,11587=>696,11588=>696,11589=>720,11590=>544,11591=>724,11592=>756,11593=>600,11594=>672,11595=>888,11596=>836,11597=>524,11598=>720,11599=>260,11600=>836,11601=>224,11602=>678,11603=>380,11604=>872,11605=>872,11606=>720,11607=>268,11608=>640,11609=>872,11610=>872,11611=>770,11612=>424,11613=>720,11614=>770,11615=>720,11616=>709,11617=>720,11618=>541,11619=>828,11620=>454,11621=>828,11622=>728,11623=>618,11631=>442,11798=>584,11799=>333,11800=>556,11802=>333,11803=>500,11806=>500,11807=>500,11816=>464,11817=>464,11818=>660,11819=>623,11820=>623,11821=>660,11822=>556,11824=>350,42240=>698,42241=>698,42242=>676,42243=>800,42244=>800,42245=>850,42246=>930,42247=>720,42248=>756,42249=>750,42250=>750,42251=>750,42252=>540,42253=>540,42254=>780,42255=>780,42256=>1082,42257=>1082,42258=>780,42259=>780,42260=>720,42261=>774,42262=>600,42263=>600,42264=>600,42265=>600,42266=>983,42267=>983,42268=>749,42269=>749,42270=>1080,42271=>890,42272=>869,42273=>720,42274=>739,42275=>983,42276=>780,42277=>840,42278=>780,42279=>424,42280=>840,42281=>967,42282=>462,42283=>952,42284=>735,42285=>735,42286=>780,42287=>750,42288=>869,42289=>772,42290=>772,42291=>676,42292=>762,42293=>674,42294=>674,42295=>488,42296=>604,42297=>822,42298=>1059,42299=>851,42300=>851,42301=>689,42302=>844,42303=>708,42304=>907,42305=>907,42306=>907,42307=>612,42308=>612,42309=>840,42310=>775,42311=>544,42312=>774,42313=>540,42314=>704,42315=>723,42316=>887,42317=>887,42318=>676,42319=>817,42320=>762,42321=>887,42322=>824,42323=>890,42324=>705,42325=>780,42326=>705,42327=>533,42328=>523,42329=>694,42330=>772,42331=>772,42332=>772,42333=>892,42334=>711,42335=>711,42336=>832,42337=>832,42338=>944,42339=>944,42340=>832,42341=>928,42342=>743,42343=>735,42344=>731,42345=>782,42346=>595,42347=>890,42348=>680,42349=>887,42350=>815,42351=>510,42352=>848,42353=>700,42354=>700,42355=>700,42356=>724,42357=>724,42358=>633,42359=>633,42360=>813,42361=>834,42362=>625,42363=>887,42364=>592,42365=>772,42366=>772,42367=>639,42368=>639,42369=>887,42370=>887,42371=>717,42372=>717,42373=>786,42374=>891,42375=>780,42376=>841,42377=>500,42378=>792,42379=>522,42380=>522,42381=>647,42382=>361,42383=>815,42384=>850,42385=>683,42386=>834,42387=>898,42388=>522,42389=>820,42390=>820,42391=>808,42392=>864,42393=>772,42394=>808,42395=>869,42396=>900,42397=>844,42398=>844,42399=>812,42400=>812,42401=>812,42402=>930,42403=>990,42404=>540,42405=>608,42406=>630,42407=>910,42408=>687,42409=>687,42410=>744,42411=>687,42412=>724,42413=>742,42414=>724,42415=>742,42416=>744,42417=>744,42418=>744,42419=>744,42420=>780,42421=>540,42422=>540,42423=>595,42424=>740,42425=>620,42426=>772,42427=>914,42428=>914,42429=>857,42430=>800,42431=>772,42432=>887,42433=>990,42434=>1005,42435=>799,42436=>799,42437=>948,42438=>948,42439=>906,42440=>1044,42441=>600,42442=>600,42443=>574,42444=>742,42445=>574,42446=>742,42447=>500,42448=>604,42449=>704,42450=>704,42451=>746,42452=>820,42453=>731,42454=>805,42455=>606,42456=>726,42457=>726,42458=>500,42459=>813,42460=>939,42461=>898,42462=>660,42463=>633,42464=>914,42465=>689,42466=>1231,42467=>784,42468=>710,42469=>982,42470=>704,42471=>782,42472=>591,42473=>770,42474=>620,42475=>620,42476=>930,42477=>930,42478=>930,42479=>785,42480=>785,42481=>813,42482=>813,42483=>971,42484=>971,42485=>721,42486=>801,42487=>582,42488=>604,42489=>618,42490=>582,42491=>1059,42492=>1059,42493=>1059,42494=>1059,42495=>720,42496=>789,42497=>723,42498=>721,42499=>772,42500=>772,42501=>772,42502=>772,42503=>772,42504=>620,42505=>634,42506=>806,42507=>825,42508=>670,42509=>521,42510=>512,42511=>1134,42512=>1324,42513=>772,42514=>1091,42515=>445,42516=>811,42517=>776,42518=>614,42519=>720,42520=>902,42521=>765,42522=>920,42523=>1024,42524=>735,42525=>742,42526=>816,42527=>715,42528=>692,42529=>200,42530=>677,42531=>770,42532=>640,42533=>595,42534=>526,42535=>677,42536=>500,42537=>715,42538=>1143,42539=>560,42888=>333,42889=>276,42890=>342,42891=>194,42892=>194,42922=>899,64256=>495,64257=>460,64258=>465,64259=>652,64260=>645,64261=>520,64275=>1004,64276=>1044,64277=>1042,64278=>1037,64279=>1256,64285=>200,64286=>305,64287=>400,64288=>587,64289=>890,64290=>848,64291=>872,64292=>800,64293=>850,64294=>873,64295=>797,64296=>937,64297=>584,64298=>776,64299=>776,64300=>776,64301=>776,64302=>640,64303=>640,64304=>640,64305=>591,64306=>466,64307=>598,64308=>622,64309=>291,64310=>371,64312=>608,64313=>270,64314=>526,64315=>550,64316=>600,64318=>621,64320=>378,64321=>607,64323=>575,64324=>568,64326=>590,64327=>606,64328=>547,64329=>776,64330=>687,64331=>212,64332=>591,64333=>550,64334=>568,64335=>640,65529=>0,65530=>0,65531=>0,65532=>784,65533=>900,65535=>800);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freesans.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesans.z
new file mode 100644
index 00000000..08bf8c3d
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesans.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansb.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansb.ctg.z
new file mode 100644
index 00000000..ccdcf6e8
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansb.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansb.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansb.php
new file mode 100644
index 00000000..21ce1cc8
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansb.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='FreeSansBold';
+$up=-189;
+$ut=69;
+$dw=800;
+$diff='';
+$originalsize=416128;
+$enc='';
+$file='freesansb.z';
+$ctg='freesansb.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-968 -460 1556 1066]','ItalicAngle'=>0,'Ascent'=>900,'Descent'=>-200,'Leading'=>100,'CapHeight'=>729,'XHeight'=>540,'StemV'=>105,'StemH'=>45,'AvgWidth'=>642,'MaxWidth'=>1473,'MissingWidth'=>800);
+$cw=array(0=>800,32=>278,33=>333,34=>474,35=>556,36=>556,37=>889,38=>722,39=>250,40=>333,41=>333,42=>389,43=>584,44=>250,45=>333,46=>250,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>250,59=>250,60=>584,61=>584,62=>584,63=>611,64=>975,65=>697,66=>704,67=>721,68=>724,69=>665,70=>632,71=>769,72=>749,73=>310,74=>572,75=>728,76=>619,77=>870,78=>753,79=>782,80=>677,81=>782,82=>722,83=>681,84=>644,85=>738,86=>663,87=>959,88=>675,89=>643,90=>608,91=>333,92=>278,93=>333,94=>584,95=>556,96=>250,97=>566,98=>621,99=>558,100=>621,101=>583,102=>343,103=>612,104=>604,105=>280,106=>280,107=>564,108=>270,109=>894,110=>613,111=>614,112=>621,113=>621,114=>392,115=>556,116=>338,117=>613,118=>542,119=>781,120=>549,121=>549,122=>507,123=>389,124=>280,125=>389,126=>500,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>280,167=>556,168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584,178=>351,179=>351,180=>333,181=>611,182=>556,183=>278,184=>333,185=>300,186=>365,187=>556,188=>869,189=>869,190=>869,191=>611,192=>697,193=>697,194=>697,195=>697,196=>697,197=>697,198=>1015,199=>721,200=>665,201=>665,202=>665,203=>665,204=>310,205=>310,206=>310,207=>310,208=>741,209=>753,210=>782,211=>782,212=>782,213=>782,214=>782,215=>584,216=>783,217=>738,218=>738,219=>738,220=>738,221=>643,222=>677,223=>611,224=>566,225=>566,226=>566,227=>566,228=>566,229=>566,230=>889,231=>558,232=>583,233=>583,234=>583,235=>583,236=>280,237=>280,238=>300,239=>300,240=>614,241=>613,242=>614,243=>614,244=>614,245=>614,246=>614,247=>584,248=>614,249=>613,250=>613,251=>613,252=>613,253=>549,254=>621,255=>549,256=>697,257=>566,258=>697,259=>566,260=>717,261=>556,262=>721,263=>558,264=>721,265=>558,266=>721,267=>558,268=>721,269=>558,270=>724,271=>789,272=>741,273=>626,274=>665,275=>583,276=>665,277=>583,278=>665,279=>583,280=>665,281=>584,282=>665,283=>583,284=>769,285=>612,286=>769,287=>612,288=>769,289=>612,290=>769,291=>612,292=>749,293=>604,294=>729,295=>606,296=>310,297=>300,298=>310,299=>280,300=>310,301=>300,302=>310,303=>280,304=>310,305=>280,306=>622,307=>548,308=>572,309=>280,310=>728,311=>564,312=>559,313=>619,314=>270,315=>619,316=>270,317=>619,318=>442,319=>619,320=>440,321=>637,322=>278,323=>753,324=>613,325=>753,326=>613,327=>753,328=>613,329=>701,330=>752,331=>613,332=>782,333=>614,334=>782,335=>614,336=>782,337=>614,338=>1012,339=>977,340=>722,341=>392,342=>722,343=>392,344=>722,345=>392,346=>681,347=>556,348=>681,349=>556,350=>681,351=>556,352=>681,353=>556,354=>644,355=>333,356=>644,357=>481,358=>644,359=>333,360=>738,361=>613,362=>738,363=>613,364=>738,365=>613,366=>738,367=>613,368=>738,369=>613,370=>738,371=>611,372=>959,373=>781,374=>643,375=>549,376=>643,377=>608,378=>507,379=>608,380=>507,381=>608,382=>507,383=>333,384=>621,385=>903,386=>679,387=>636,388=>690,389=>653,390=>721,391=>754,392=>613,393=>741,394=>923,395=>722,396=>621,397=>622,398=>665,399=>782,400=>681,401=>611,402=>333,403=>786,404=>657,405=>949,406=>299,407=>433,408=>784,409=>564,410=>393,411=>600,412=>978,413=>748,414=>613,415=>782,416=>791,417=>658,418=>1076,419=>847,420=>876,421=>621,422=>647,423=>681,424=>561,425=>676,426=>441,427=>333,428=>715,429=>333,430=>624,431=>773,432=>666,433=>799,434=>722,435=>839,436=>643,437=>611,438=>500,439=>567,440=>556,441=>645,442=>569,443=>579,446=>572,447=>627,448=>260,449=>400,450=>584,451=>278,452=>1300,453=>1204,454=>1111,455=>1183,456=>855,457=>556,458=>1294,459=>1000,460=>889,461=>697,462=>566,463=>310,464=>300,465=>782,466=>614,467=>738,468=>613,469=>738,470=>613,471=>738,472=>613,473=>738,474=>613,475=>738,476=>613,477=>583,478=>697,479=>566,480=>697,481=>566,482=>1005,483=>889,484=>804,485=>652,486=>769,487=>612,488=>728,489=>564,490=>782,491=>611,492=>782,493=>611,494=>567,495=>562,496=>300,497=>1333,498=>1222,499=>1111,500=>769,501=>612,503=>659,504=>753,505=>613,506=>697,507=>566,508=>1015,509=>889,510=>783,511=>614,512=>697,513=>566,514=>697,515=>566,516=>665,517=>583,518=>665,519=>583,520=>310,521=>300,522=>310,523=>280,524=>782,525=>614,526=>782,527=>614,528=>722,529=>392,530=>722,531=>392,532=>738,533=>613,534=>738,535=>613,536=>681,537=>556,538=>644,539=>338,540=>586,541=>484,542=>749,543=>604,548=>611,549=>500,550=>697,551=>566,552=>655,553=>583,554=>782,555=>614,556=>782,557=>614,558=>782,559=>614,560=>782,561=>614,562=>643,563=>549,567=>280,592=>566,593=>687,594=>687,595=>621,596=>558,597=>573,598=>636,599=>636,600=>583,601=>583,602=>834,603=>571,604=>561,605=>820,606=>570,607=>316,608=>625,609=>617,610=>579,611=>556,612=>654,613=>613,614=>603,615=>604,616=>300,617=>285,618=>300,619=>473,620=>527,621=>285,622=>744,623=>894,624=>895,625=>894,626=>628,627=>628,628=>625,629=>614,630=>894,631=>848,632=>714,633=>389,634=>386,635=>406,636=>386,637=>386,638=>473,639=>473,640=>586,641=>581,642=>609,643=>333,644=>331,645=>313,646=>553,647=>328,648=>315,649=>643,650=>728,651=>635,652=>542,653=>781,654=>549,655=>542,656=>551,657=>591,658=>562,659=>593,660=>572,661=>572,662=>572,663=>586,664=>614,665=>563,666=>590,667=>616,668=>613,669=>552,670=>588,671=>454,672=>636,673=>572,674=>572,675=>1004,676=>1029,677=>1117,678=>807,679=>583,680=>824,681=>871,682=>753,683=>668,684=>525,685=>486,686=>659,687=>679,688=>377,689=>377,690=>202,691=>272,692=>272,693=>299,694=>395,695=>534,696=>364,697=>250,698=>454,699=>250,700=>250,701=>250,702=>333,703=>333,704=>333,705=>333,706=>333,707=>333,708=>333,709=>333,710=>333,711=>333,712=>333,713=>333,714=>250,715=>250,716=>272,717=>333,718=>333,719=>250,720=>333,721=>333,722=>333,723=>333,724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333,731=>333,732=>333,733=>333,734=>333,735=>510,736=>372,737=>210,738=>363,739=>373,740=>334,741=>526,742=>526,743=>526,744=>526,745=>526,746=>519,747=>519,748=>333,749=>333,750=>500,751=>333,752=>333,753=>333,754=>333,755=>333,756=>250,757=>400,758=>400,759=>400,760=>333,761=>200,762=>200,763=>200,764=>200,765=>333,766=>333,767=>333,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0,875=>0,876=>0,877=>0,878=>0,879=>0,884=>379,885=>379,890=>333,894=>333,900=>363,901=>333,902=>697,903=>333,904=>802,905=>878,906=>430,908=>800,910=>958,911=>861,912=>341,913=>697,914=>673,915=>634,916=>744,917=>655,918=>608,919=>749,920=>796,921=>310,922=>728,923=>713,924=>910,925=>774,926=>684,927=>782,928=>770,929=>716,931=>676,932=>658,933=>761,934=>789,935=>784,936=>832,937=>799,938=>310,939=>771,940=>632,941=>571,942=>598,943=>356,944=>608,945=>632,946=>600,947=>573,948=>622,949=>571,950=>512,951=>598,952=>595,953=>341,954=>567,955=>589,956=>613,957=>566,958=>539,959=>614,960=>658,961=>634,962=>593,963=>662,964=>557,965=>608,966=>788,967=>631,968=>728,969=>798,970=>341,971=>608,972=>614,973=>608,974=>798,977=>609,978=>742,979=>917,980=>744,981=>714,982=>798,983=>642,1008=>642,1009=>614,1012=>782,1013=>358,1024=>655,1025=>655,1026=>824,1027=>612,1028=>721,1029=>681,1030=>310,1031=>310,1032=>572,1033=>1078,1034=>1116,1035=>824,1036=>728,1037=>753,1038=>701,1039=>750,1040=>697,1041=>704,1042=>704,1043=>612,1044=>900,1045=>655,1046=>1076,1047=>681,1048=>753,1049=>753,1050=>728,1051=>711,1052=>870,1053=>749,1054=>782,1055=>749,1056=>677,1057=>721,1058=>644,1059=>701,1060=>912,1061=>651,1062=>809,1063=>706,1064=>1059,1065=>1139,1066=>847,1067=>976,1068=>677,1069=>721,1070=>1095,1071=>701,1072=>566,1073=>595,1074=>563,1075=>428,1076=>679,1077=>583,1078=>782,1079=>571,1080=>625,1081=>625,1082=>559,1083=>573,1084=>676,1085=>613,1086=>614,1087=>613,1088=>621,1089=>558,1090=>440,1091=>549,1092=>972,1093=>539,1094=>654,1095=>573,1096=>896,1097=>970,1098=>703,1099=>788,1100=>577,1101=>568,1102=>857,1103=>581,1104=>583,1105=>583,1106=>631,1107=>428,1108=>568,1109=>555,1110=>280,1111=>300,1112=>270,1113=>893,1114=>907,1115=>629,1116=>559,1117=>625,1118=>549,1119=>614,1120=>986,1121=>736,1136=>832,1137=>758,1138=>782,1139=>606,1148=>942,1149=>736,1150=>986,1151=>736,1154=>449,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>832,1163=>675,1164=>682,1165=>611,1166=>677,1167=>612,1168=>636,1169=>440,1170=>622,1171=>449,1172=>647,1173=>574,1174=>1096,1175=>803,1176=>683,1177=>555,1178=>759,1179=>573,1180=>730,1181=>554,1182=>737,1183=>555,1184=>892,1185=>680,1186=>825,1187=>653,1188=>999,1189=>763,1190=>1105,1191=>925,1192=>963,1193=>766,1194=>722,1195=>558,1196=>614,1197=>438,1198=>643,1199=>573,1200=>643,1201=>603,1202=>670,1203=>548,1204=>952,1205=>738,1206=>781,1207=>615,1208=>698,1209=>588,1210=>687,1211=>588,1212=>993,1213=>761,1214=>993,1215=>761,1216=>314,1217=>1076,1218=>782,1219=>697,1220=>543,1221=>793,1222=>634,1223=>753,1224=>603,1225=>819,1226=>663,1227=>706,1228=>588,1229=>935,1230=>720,1231=>314,1232=>697,1233=>566,1234=>697,1235=>566,1236=>1004,1237=>898,1238=>655,1239=>583,1240=>722,1241=>583,1242=>722,1243=>583,1244=>1076,1245=>782,1246=>681,1247=>571,1248=>567,1249=>552,1250=>753,1251=>625,1252=>753,1253=>625,1254=>782,1255=>614,1256=>782,1257=>606,1258=>782,1259=>606,1260=>721,1261=>568,1262=>700,1263=>544,1264=>701,1265=>539,1266=>700,1267=>537,1268=>706,1269=>573,1270=>611,1271=>432,1272=>976,1273=>788,1296=>672,1297=>546,1298=>729,1299=>577,1306=>782,1307=>621,1308=>959,1309=>776,1310=>730,1311=>554,1329=>730,1330=>713,1331=>765,1332=>752,1333=>708,1334=>801,1335=>496,1336=>713,1337=>855,1338=>686,1339=>727,1340=>420,1341=>897,1342=>841,1343=>708,1344=>660,1345=>666,1346=>747,1347=>698,1348=>757,1349=>630,1350=>747,1351=>651,1352=>743,1353=>657,1354=>728,1355=>799,1356=>752,1357=>743,1358=>768,1359=>691,1360=>713,1361=>640,1362=>425,1363=>818,1364=>672,1365=>805,1366=>754,1369=>333,1370=>222,1371=>250,1372=>333,1373=>333,1374=>352,1375=>362,1377=>873,1378=>613,1379=>634,1380=>636,1381=>593,1382=>639,1383=>417,1384=>613,1385=>658,1386=>711,1387=>609,1388=>318,1389=>836,1390=>670,1391=>613,1392=>607,1393=>611,1394=>626,1395=>619,1396=>618,1397=>324,1398=>613,1399=>540,1400=>591,1401=>392,1402=>873,1403=>577,1404=>603,1405=>600,1406=>626,1407=>951,1408=>613,1409=>612,1410=>348,1411=>951,1412=>616,1413=>606,1414=>763,1415=>626,1417=>250,1418=>398,1423=>752,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0,1468=>0,1469=>0,1470=>516,1471=>0,1472=>297,1473=>0,1474=>0,1475=>333,1476=>0,1488=>714,1489=>651,1490=>557,1491=>638,1492=>682,1493=>297,1494=>443,1495=>682,1496=>670,1497=>284,1498=>590,1499=>595,1500=>667,1501=>683,1502=>704,1503=>297,1504=>429,1505=>670,1506=>653,1507=>661,1508=>660,1509=>616,1510=>671,1511=>672,1512=>600,1513=>840,1514=>756,1520=>554,1521=>550,1522=>542,1523=>238,1524=>474,2304=>0,2305=>0,2306=>0,2307=>305,2308=>737,2309=>737,2310=>928,2311=>504,2312=>504,2313=>622,2314=>844,2315=>961,2316=>681,2317=>473,2318=>473,2319=>473,2320=>473,2321=>928,2322=>928,2323=>928,2324=>928,2325=>789,2326=>820,2327=>562,2328=>630,2329=>770,2330=>660,2331=>684,2332=>743,2333=>732,2334=>720,2335=>608,2336=>571,2337=>651,2338=>578,2339=>648,2340=>604,2341=>700,2342=>540,2343=>633,2344=>608,2345=>608,2346=>519,2347=>773,2348=>532,2349=>618,2350=>558,2351=>596,2352=>475,2353=>475,2354=>696,2355=>701,2356=>701,2357=>532,2358=>686,2359=>519,2360=>707,2361=>526,2362=>0,2363=>266,2364=>0,2365=>482,2366=>266,2367=>266,2368=>266,2369=>0,2370=>0,2371=>0,2372=>0,2373=>0,2374=>0,2375=>0,2376=>0,2377=>266,2378=>266,2379=>266,2380=>266,2381=>0,2382=>189,2383=>266,2384=>879,2385=>0,2386=>0,2387=>0,2388=>0,2389=>0,2390=>0,2391=>0,2392=>789,2393=>820,2394=>562,2395=>743,2396=>651,2397=>578,2398=>773,2399=>596,2400=>940,2401=>666,2402=>0,2403=>0,2404=>674,2405=>674,2406=>575,2407=>575,2408=>575,2409=>575,2410=>575,2411=>575,2412=>575,2413=>575,2414=>575,2415=>575,2416=>365,2417=>387,2418=>737,2419=>737,2420=>928,2421=>888,2422=>737,2423=>737,2425=>743,2426=>596,2427=>608,2428=>743,2429=>615,2430=>651,2431=>532,2561=>0,2562=>0,2563=>313,2565=>897,2566=>1157,2567=>930,2568=>966,2569=>762,2570=>762,2575=>729,2576=>904,2579=>773,2580=>903,2581=>726,2582=>672,2583=>741,2584=>790,2585=>702,2586=>723,2587=>693,2588=>688,2589=>673,2590=>683,2591=>686,2592=>711,2593=>680,2594=>693,2595=>729,2596=>691,2597=>694,2598=>699,2599=>666,2600=>669,2602=>683,2603=>690,2604=>660,2605=>659,2606=>692,2607=>772,2608=>673,2610=>731,2611=>814,2613=>663,2614=>704,2616=>702,2617=>650,2620=>0,2622=>307,2623=>304,2624=>306,2625=>0,2626=>0,2631=>0,2632=>0,2635=>0,2636=>0,2637=>0,2641=>0,2649=>684,2650=>813,2651=>715,2652=>695,2654=>709,2662=>697,2663=>630,2664=>696,2665=>690,2666=>646,2667=>636,2668=>571,2669=>682,2670=>718,2671=>730,2672=>0,2673=>0,2674=>722,2675=>760,2676=>1110,2677=>0,4256=>616,4257=>645,4258=>664,4259=>839,4260=>627,4261=>630,4262=>827,4263=>928,4264=>639,4265=>630,4266=>951,4267=>606,4268=>608,4269=>835,4270=>630,4271=>610,4272=>804,4273=>615,4274=>823,4275=>747,4276=>870,4277=>627,4278=>840,4279=>627,4280=>665,4281=>610,4282=>799,4283=>598,4284=>665,4285=>664,4286=>608,4287=>886,4288=>629,4304=>463,4305=>516,4306=>564,4307=>706,4308=>459,4309=>476,4310=>623,4311=>711,4312=>494,4313=>476,4314=>894,4315=>500,4316=>500,4317=>712,4318=>493,4319=>503,4320=>712,4321=>503,4322=>710,4323=>670,4324=>707,4325=>459,4326=>691,4327=>465,4328=>492,4329=>480,4330=>656,4331=>500,4332=>492,4333=>524,4334=>500,4335=>688,4336=>510,4337=>739,4338=>450,4339=>479,4340=>502,4341=>501,4345=>564,4347=>515,4348=>449,5024=>714,5025=>731,5026=>624,5027=>908,5028=>1040,5029=>271,5030=>654,5031=>863,5032=>604,5033=>791,5034=>714,5035=>522,5036=>661,5037=>926,5038=>615,5039=>811,5040=>538,5041=>633,5042=>979,5043=>964,5044=>635,5045=>607,5046=>753,5047=>831,5048=>566,5049=>977,5050=>958,5051=>710,5052=>616,5053=>834,5054=>790,5055=>612,5056=>766,5057=>857,5058=>627,5059=>649,5060=>607,5061=>1127,5062=>680,5063=>920,5064=>928,5065=>1333,5066=>920,5067=>705,5068=>695,5069=>1074,5070=>672,5071=>672,5072=>667,5073=>819,5074=>679,5075=>575,5076=>903,5077=>652,5078=>776,5079=>643,5080=>670,5081=>660,5082=>648,5083=>934,5084=>909,5085=>613,5086=>615,5087=>735,5088=>900,5089=>1024,5090=>647,5091=>760,5092=>829,5093=>824,5094=>756,5095=>625,5096=>981,5097=>1014,5098=>1040,5099=>790,5100=>926,5101=>686,5102=>656,5103=>920,5104=>741,5105=>890,5106=>626,5107=>974,5108=>699,7680=>697,7681=>566,7682=>704,7683=>621,7684=>704,7685=>621,7686=>704,7687=>621,7688=>721,7689=>558,7690=>724,7691=>621,7692=>724,7693=>621,7694=>724,7695=>621,7696=>724,7697=>621,7698=>724,7699=>621,7700=>665,7701=>583,7702=>665,7703=>583,7704=>665,7705=>583,7706=>665,7707=>583,7708=>655,7709=>583,7710=>632,7711=>343,7712=>769,7713=>612,7714=>749,7715=>604,7716=>749,7717=>604,7718=>749,7719=>604,7720=>752,7721=>604,7722=>749,7723=>604,7724=>310,7725=>280,7726=>310,7727=>300,7728=>728,7729=>564,7730=>728,7731=>564,7732=>728,7733=>564,7734=>619,7735=>270,7736=>619,7737=>270,7738=>619,7739=>270,7740=>619,7741=>270,7742=>870,7743=>894,7744=>870,7745=>894,7746=>870,7747=>894,7748=>753,7749=>613,7750=>753,7751=>613,7752=>753,7753=>613,7754=>753,7755=>613,7756=>782,7757=>614,7758=>782,7759=>614,7760=>782,7761=>614,7762=>782,7763=>614,7764=>677,7765=>621,7766=>677,7767=>621,7768=>722,7769=>392,7770=>722,7771=>392,7772=>722,7773=>392,7774=>722,7775=>392,7776=>681,7777=>556,7778=>681,7779=>556,7780=>681,7781=>556,7782=>681,7783=>556,7784=>681,7785=>556,7786=>644,7787=>338,7788=>644,7789=>338,7790=>644,7791=>338,7792=>644,7793=>338,7794=>738,7795=>613,7796=>738,7797=>613,7798=>738,7799=>613,7800=>738,7801=>613,7802=>738,7803=>613,7804=>663,7805=>542,7806=>663,7807=>542,7808=>959,7809=>781,7810=>959,7811=>781,7812=>959,7813=>781,7814=>959,7815=>781,7816=>959,7817=>781,7818=>675,7819=>549,7820=>675,7821=>549,7822=>643,7823=>549,7824=>608,7825=>507,7826=>608,7827=>507,7828=>608,7829=>507,7830=>604,7831=>338,7832=>781,7833=>549,7834=>555,7835=>333,7838=>741,7840=>697,7841=>566,7842=>697,7843=>566,7844=>697,7845=>566,7846=>697,7847=>566,7848=>697,7849=>566,7850=>697,7851=>566,7852=>697,7853=>566,7854=>697,7855=>566,7856=>697,7857=>566,7858=>697,7859=>566,7860=>697,7861=>566,7862=>697,7863=>566,7864=>665,7865=>583,7866=>665,7867=>583,7868=>665,7869=>583,7870=>665,7871=>583,7872=>665,7873=>583,7874=>665,7875=>583,7876=>665,7877=>583,7878=>665,7879=>583,7880=>310,7881=>280,7882=>310,7883=>280,7884=>782,7885=>614,7886=>782,7887=>614,7888=>782,7889=>614,7890=>782,7891=>614,7892=>782,7893=>614,7894=>782,7895=>614,7896=>782,7897=>614,7898=>791,7899=>658,7900=>791,7901=>658,7902=>791,7903=>658,7904=>791,7905=>658,7906=>791,7907=>658,7908=>738,7909=>613,7910=>738,7911=>613,7912=>773,7913=>666,7914=>773,7915=>666,7916=>773,7917=>666,7918=>773,7919=>666,7920=>773,7921=>666,7922=>643,7923=>549,7924=>643,7925=>549,7926=>643,7927=>549,7928=>643,7929=>549,7936=>632,7937=>632,7938=>632,7939=>632,7940=>632,7941=>632,7942=>632,7943=>632,7944=>697,7945=>697,7946=>865,7947=>849,7948=>796,7949=>807,7950=>730,7951=>750,7952=>571,7953=>571,7954=>571,7955=>571,7956=>571,7957=>571,7960=>758,7961=>760,7962=>957,7963=>943,7964=>939,7965=>945,7968=>598,7969=>598,7970=>598,7971=>598,7972=>598,7973=>598,7974=>598,7975=>598,7976=>843,7977=>846,7978=>1041,7979=>1032,7980=>1027,7981=>1039,7982=>933,7983=>944,7984=>341,7985=>341,7986=>393,7987=>395,7988=>398,7989=>392,7990=>390,7991=>404,7992=>423,7993=>423,7994=>601,7995=>601,7996=>597,7997=>591,7998=>539,7999=>539,8000=>614,8001=>614,8002=>614,8003=>614,8004=>614,8005=>614,8008=>864,8009=>865,8010=>1058,8011=>1053,8012=>1019,8013=>1027,8016=>608,8017=>608,8018=>608,8019=>608,8020=>608,8021=>608,8022=>608,8023=>608,8025=>896,8027=>1100,8029=>1115,8031=>1027,8032=>798,8033=>798,8034=>798,8035=>798,8036=>798,8037=>798,8038=>798,8039=>798,8040=>876,8041=>879,8042=>1071,8043=>1071,8044=>1031,8045=>1044,8046=>1001,8047=>989,8048=>632,8049=>632,8050=>571,8051=>571,8052=>598,8053=>598,8054=>341,8055=>341,8056=>610,8057=>610,8058=>608,8059=>608,8060=>798,8061=>798,8064=>632,8065=>632,8066=>632,8067=>632,8068=>632,8069=>632,8070=>632,8071=>632,8072=>909,8073=>906,8074=>1071,8075=>1045,8076=>994,8077=>1004,8078=>920,8079=>926,8080=>598,8081=>598,8082=>598,8083=>598,8084=>598,8085=>598,8086=>598,8087=>598,8088=>1006,8089=>1015,8090=>1204,8091=>1207,8092=>1198,8093=>1209,8094=>1096,8095=>1115,8096=>798,8097=>798,8098=>798,8099=>798,8100=>798,8101=>798,8102=>798,8103=>798,8104=>1074,8105=>1068,8106=>1261,8107=>1260,8108=>1220,8109=>1237,8110=>1196,8111=>1192,8112=>642,8113=>642,8114=>642,8115=>642,8116=>642,8118=>642,8119=>642,8120=>697,8121=>697,8122=>697,8123=>697,8124=>907,8125=>278,8126=>346,8127=>278,8128=>354,8129=>333,8130=>598,8131=>598,8132=>598,8134=>598,8135=>598,8136=>792,8137=>789,8138=>884,8139=>881,8140=>908,8141=>492,8142=>489,8143=>394,8144=>361,8145=>360,8146=>373,8147=>364,8150=>379,8151=>392,8152=>310,8153=>310,8154=>455,8155=>445,8157=>481,8158=>589,8159=>333,8160=>608,8161=>608,8162=>608,8163=>608,8164=>634,8165=>634,8166=>608,8167=>608,8168=>761,8169=>761,8170=>948,8171=>972,8172=>822,8173=>333,8174=>333,8175=>333,8178=>798,8179=>798,8180=>798,8182=>798,8183=>798,8184=>913,8185=>873,8186=>916,8187=>894,8188=>988,8189=>333,8190=>278,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>167,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>556,8211=>556,8212=>1000,8213=>1000,8214=>437,8215=>556,8216=>250,8217=>250,8218=>260,8219=>250,8220=>450,8221=>450,8222=>450,8223=>450,8224=>556,8225=>556,8226=>400,8227=>400,8228=>500,8229=>500,8230=>750,8231=>278,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>167,8240=>1000,8241=>1367,8242=>250,8243=>426,8244=>614,8245=>250,8246=>426,8247=>614,8248=>450,8249=>333,8250=>333,8251=>622,8252=>666,8253=>614,8254=>556,8255=>658,8256=>658,8257=>438,8258=>840,8259=>400,8260=>167,8261=>334,8262=>334,8263=>1222,8264=>944,8265=>944,8266=>556,8267=>537,8268=>600,8269=>600,8270=>389,8271=>333,8272=>658,8273=>389,8274=>634,8275=>568,8276=>658,8277=>793,8278=>515,8279=>855,8280=>722,8281=>725,8282=>224,8283=>722,8284=>604,8285=>224,8286=>224,8287=>0,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>351,8305=>200,8308=>351,8309=>351,8310=>351,8311=>351,8312=>351,8313=>351,8314=>351,8315=>351,8316=>351,8317=>216,8318=>218,8319=>391,8320=>351,8321=>301,8322=>351,8323=>351,8324=>351,8325=>351,8326=>351,8327=>351,8328=>351,8329=>351,8330=>350,8331=>350,8332=>350,8333=>216,8334=>216,8336=>363,8337=>366,8338=>394,8339=>360,8340=>355,8355=>611,8356=>591,8357=>889,8358=>727,8360=>1265,8362=>1049,8363=>580,8364=>640,8368=>605,8373=>591,8376=>612,8377=>599,8400=>0,8401=>0,8402=>0,8403=>0,8406=>0,8407=>0,8411=>0,8412=>0,8413=>0,8414=>0,8415=>0,8416=>0,8417=>0,8421=>0,8422=>0,8423=>0,8424=>0,8425=>0,8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8432=>0,8448=>945,8449=>968,8451=>1033,8453=>981,8454=>1002,8455=>667,8456=>721,8457=>919,8462=>604,8465=>666,8467=>608,8468=>881,8470=>999,8471=>880,8476=>749,8480=>1000,8481=>1320,8482=>940,8486=>799,8487=>799,8489=>346,8490=>728,8491=>697,8494=>583,8498=>612,8501=>644,8502=>573,8503=>557,8504=>638,8506=>871,8507=>1431,8513=>769,8514=>619,8515=>611,8516=>643,8523=>669,8525=>1281,8526=>482,8531=>869,8532=>869,8533=>869,8534=>869,8535=>869,8536=>869,8537=>869,8538=>869,8539=>869,8540=>869,8541=>869,8542=>869,8543=>869,8544=>310,8545=>568,8546=>866,8547=>901,8548=>663,8549=>887,8550=>1195,8551=>1473,8552=>925,8553=>675,8554=>927,8555=>1195,8556=>619,8557=>721,8558=>724,8559=>870,8560=>280,8561=>556,8562=>834,8563=>800,8564=>542,8565=>786,8566=>1064,8567=>1342,8568=>794,8569=>549,8570=>786,8571=>1064,8572=>270,8573=>558,8574=>621,8575=>894,8592=>964,8593=>964,8594=>964,8595=>964,8596=>964,8597=>964,8598=>964,8599=>964,8600=>964,8601=>964,8602=>964,8603=>964,8606=>964,8607=>964,8608=>964,8609=>964,8610=>964,8611=>964,8612=>964,8613=>964,8614=>964,8615=>964,8616=>964,8644=>964,8645=>964,8646=>964,8647=>964,8648=>964,8649=>964,8650=>964,8704=>697,8705=>716,8706=>556,8707=>667,8708=>667,8709=>860,8710=>729,8711=>729,8712=>584,8713=>584,8714=>585,8715=>584,8716=>584,8717=>585,8718=>500,8719=>823,8720=>823,8721=>806,8722=>584,8723=>584,8724=>584,8725=>510,8726=>452,8727=>500,8728=>500,8729=>500,8730=>594,8731=>549,8732=>549,8733=>713,8734=>713,8735=>639,8736=>800,8739=>220,8741=>380,8743=>608,8744=>608,8745=>768,8746=>768,8747=>518,8748=>808,8749=>1098,8756=>797,8757=>800,8758=>250,8759=>620,8760=>584,8761=>778,8762=>584,8763=>500,8764=>500,8768=>244,8770=>584,8771=>584,8773=>584,8776=>500,8778=>584,8779=>500,8784=>584,8785=>584,8786=>584,8787=>584,8788=>755,8789=>755,8791=>584,8792=>584,8793=>584,8794=>584,8797=>614,8798=>584,8799=>584,8800=>584,8801=>584,8804=>583,8805=>584,8806=>584,8807=>584,8810=>1026,8811=>1026,8818=>584,8819=>584,8834=>584,8835=>584,8836=>584,8837=>584,8838=>584,8839=>584,8853=>776,8854=>776,8855=>776,8856=>776,8857=>778,8858=>776,8859=>776,8860=>776,8861=>776,8891=>584,8892=>608,8893=>584,8896=>744,8897=>744,8898=>764,8899=>764,8901=>298,8942=>250,8943=>1000,8944=>1000,8945=>1000,8968=>456,8969=>456,8970=>456,8971=>456,8976=>584,8994=>658,8995=>658,9001=>359,9002=>359,9251=>500,9674=>541,9675=>860,9676=>860,9702=>400,9711=>1020,9772=>923,9824=>626,9825=>694,9826=>595,9827=>776,9828=>626,9829=>694,9830=>595,9831=>776,9833=>333,9834=>556,9835=>778,9836=>778,9837=>556,9838=>556,9839=>556,10048=>1453,10752=>1020,10753=>1020,10754=>1020,11568=>352,11569=>872,11570=>872,11571=>720,11572=>720,11573=>720,11574=>664,11575=>752,11576=>752,11577=>720,11578=>720,11579=>596,11580=>698,11581=>742,11582=>574,11583=>742,11584=>872,11585=>872,11586=>312,11587=>720,11588=>696,11589=>720,11590=>584,11591=>742,11592=>796,11593=>613,11594=>672,11595=>888,11596=>836,11597=>524,11598=>720,11599=>300,11600=>836,11601=>300,11602=>718,11603=>388,11604=>872,11605=>872,11606=>696,11607=>308,11608=>640,11609=>872,11610=>872,11611=>762,11612=>424,11613=>720,11614=>762,11615=>720,11616=>709,11617=>720,11618=>541,11619=>828,11620=>454,11621=>828,11631=>482,11798=>584,11799=>333,11800=>611,11802=>333,11803=>500,11806=>500,11807=>500,11816=>504,11817=>504,11818=>660,11819=>623,11820=>623,11821=>660,11822=>611,42888=>333,42889=>276,42890=>342,42891=>258,42892=>258,42922=>948,64256=>607,64257=>575,64258=>602,64259=>848,64260=>848,64261=>627,64275=>1243,64276=>1226,64277=>1233,64278=>1238,64279=>1448,64285=>284,64286=>305,64287=>542,64288=>653,64289=>964,64290=>888,64291=>932,64292=>845,64293=>917,64294=>933,64295=>850,64296=>1006,64297=>584,64298=>840,64299=>840,64300=>840,64301=>840,64302=>714,64303=>714,64304=>714,64305=>651,64306=>557,64307=>638,64308=>682,64309=>348,64310=>443,64312=>670,64313=>354,64314=>590,64315=>595,64316=>667,64318=>704,64320=>429,64321=>670,64323=>661,64324=>660,64326=>671,64327=>672,64328=>600,64329=>840,64330=>756,64331=>297,64332=>591,64333=>550,64334=>568,64335=>714,65529=>0,65530=>0,65531=>0,65532=>800,65533=>900,65535=>800);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansb.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansb.z
new file mode 100644
index 00000000..472310c1
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansb.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansbi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansbi.ctg.z
new file mode 100644
index 00000000..fa1ba4a6
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansbi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansbi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansbi.php
new file mode 100644
index 00000000..5815e5d1
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansbi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='FreeSansBoldOblique';
+$up=-145;
+$ut=69;
+$dw=800;
+$diff='';
+$originalsize=342488;
+$enc='';
+$file='freesansbi.z';
+$ctg='freesansbi.ctg.z';
+$desc=array('Flags'=>96,'FontBBox'=>'[-908 -313 1591 1076]','ItalicAngle'=>-12,'Ascent'=>900,'Descent'=>-200,'Leading'=>100,'CapHeight'=>729,'XHeight'=>540,'StemV'=>105,'StemH'=>45,'AvgWidth'=>639,'MaxWidth'=>1501,'MissingWidth'=>800);
+$cw=array(0=>800,32=>278,33=>333,34=>474,35=>556,36=>556,37=>889,38=>722,39=>238,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>333,59=>333,60=>584,61=>584,62=>584,63=>611,64=>975,65=>722,66=>722,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>556,75=>722,76=>611,77=>833,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>333,92=>278,93=>333,94=>584,95=>556,96=>333,97=>556,98=>611,99=>556,100=>611,101=>556,102=>333,103=>611,104=>611,105=>278,106=>278,107=>556,108=>278,109=>889,110=>611,111=>611,112=>611,113=>611,114=>389,115=>556,116=>333,117=>611,118=>556,119=>778,120=>556,121=>556,122=>500,123=>389,124=>280,125=>389,126=>584,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>280,167=>556,168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584,178=>350,179=>350,180=>333,181=>667,182=>556,183=>278,184=>333,185=>248,186=>365,187=>556,188=>869,189=>869,190=>869,191=>611,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>892,231=>556,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278,238=>278,239=>278,240=>611,241=>611,242=>611,243=>611,244=>611,245=>611,246=>611,247=>584,248=>611,249=>611,250=>611,251=>611,252=>611,253=>556,254=>611,255=>556,256=>722,257=>556,258=>722,259=>556,260=>722,261=>556,262=>722,263=>556,264=>722,265=>556,266=>722,267=>556,268=>722,269=>556,270=>722,271=>755,272=>722,273=>611,274=>667,275=>556,276=>667,277=>556,278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>611,286=>778,287=>611,288=>778,289=>611,290=>778,291=>611,292=>722,293=>611,294=>722,295=>611,296=>278,297=>300,298=>278,299=>300,300=>278,301=>300,302=>278,303=>278,304=>278,305=>278,306=>595,307=>488,308=>556,309=>300,310=>722,311=>556,312=>529,313=>611,314=>278,315=>611,316=>278,317=>611,318=>444,319=>611,320=>466,321=>611,322=>278,323=>722,324=>611,325=>722,326=>611,327=>722,328=>611,329=>656,330=>720,331=>611,332=>778,333=>611,334=>778,335=>611,336=>778,337=>611,338=>1000,339=>962,340=>722,341=>389,342=>722,343=>389,344=>722,345=>389,346=>667,347=>556,348=>667,349=>556,350=>667,351=>556,352=>667,353=>556,354=>611,355=>333,356=>611,357=>444,358=>611,359=>404,360=>722,361=>611,362=>722,363=>611,364=>722,365=>611,366=>722,367=>611,368=>722,369=>611,370=>722,371=>611,372=>944,373=>778,374=>667,375=>556,376=>667,377=>611,378=>500,379=>611,380=>500,381=>611,382=>500,383=>333,384=>611,385=>857,386=>722,387=>611,388=>667,389=>611,390=>722,391=>752,392=>586,393=>722,394=>818,395=>722,396=>611,397=>609,398=>667,399=>778,400=>672,401=>611,402=>333,403=>778,404=>667,405=>940,406=>278,407=>395,408=>778,409=>556,410=>333,411=>620,412=>889,413=>722,414=>611,415=>778,416=>788,417=>653,418=>973,419=>739,420=>756,421=>611,422=>647,423=>667,424=>556,425=>688,426=>441,427=>333,428=>605,429=>333,430=>611,431=>769,432=>664,433=>780,434=>722,435=>762,436=>650,437=>611,438=>500,439=>556,440=>556,441=>645,442=>569,443=>579,446=>546,447=>608,448=>258,449=>443,450=>584,451=>278,452=>1333,453=>1222,454=>1111,455=>1167,456=>889,457=>556,458=>1278,459=>1000,460=>889,461=>722,462=>556,463=>278,464=>300,465=>778,466=>611,467=>722,468=>611,469=>722,470=>611,471=>722,472=>611,473=>722,474=>611,475=>722,476=>611,477=>556,478=>722,479=>556,480=>722,481=>556,482=>1000,483=>892,484=>811,485=>641,486=>778,487=>611,488=>722,489=>556,490=>778,491=>611,492=>778,493=>611,494=>556,495=>556,496=>278,497=>1333,498=>1222,499=>1111,500=>778,501=>611,503=>630,504=>722,505=>611,506=>722,507=>556,508=>1000,509=>892,510=>778,511=>611,512=>722,513=>556,514=>722,515=>556,516=>667,517=>556,518=>667,519=>556,520=>278,521=>301,522=>278,523=>278,524=>778,525=>611,526=>778,527=>611,528=>722,529=>389,530=>722,531=>389,532=>722,533=>611,534=>722,535=>611,536=>667,537=>556,538=>611,539=>333,540=>569,541=>486,542=>722,543=>611,548=>645,549=>500,550=>722,551=>556,552=>667,553=>556,554=>778,555=>611,556=>778,557=>611,558=>778,559=>611,560=>778,561=>611,562=>667,563=>556,567=>278,592=>556,593=>611,594=>671,595=>611,596=>556,597=>600,598=>595,599=>611,600=>556,601=>556,602=>834,603=>570,604=>546,605=>820,606=>570,607=>278,608=>611,609=>611,610=>556,611=>556,612=>646,613=>619,614=>611,615=>611,616=>278,617=>326,618=>278,619=>473,620=>527,621=>298,622=>778,623=>889,624=>889,625=>889,626=>611,627=>611,628=>615,629=>590,630=>878,631=>822,632=>778,633=>389,634=>389,635=>406,636=>419,637=>389,638=>455,639=>455,640=>620,641=>586,642=>606,643=>333,644=>302,645=>333,646=>556,647=>328,648=>333,649=>623,650=>686,651=>630,652=>556,653=>778,654=>556,655=>556,656=>519,657=>571,658=>556,659=>632,660=>563,661=>563,662=>563,663=>556,664=>579,665=>572,666=>570,667=>616,668=>603,669=>552,670=>556,671=>454,672=>611,673=>546,674=>546,675=>1004,676=>1018,677=>1097,678=>804,679=>593,680=>840,681=>866,682=>752,683=>668,684=>536,685=>486,686=>659,687=>679,688=>377,689=>377,690=>202,691=>272,692=>272,693=>299,694=>395,695=>534,696=>364,697=>278,698=>454,699=>278,700=>333,701=>278,702=>333,703=>333,704=>333,705=>333,706=>333,707=>333,708=>333,709=>333,710=>333,711=>333,712=>333,713=>333,714=>333,715=>333,716=>272,717=>333,718=>333,719=>333,720=>333,721=>333,722=>333,723=>333,724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333,731=>333,732=>333,733=>333,734=>333,735=>510,736=>372,737=>210,738=>363,739=>373,740=>334,741=>526,742=>526,743=>526,744=>526,745=>526,746=>519,747=>519,748=>333,749=>333,750=>333,751=>333,752=>333,753=>333,754=>333,755=>333,756=>333,757=>437,758=>437,759=>400,760=>333,761=>200,762=>200,763=>200,764=>200,765=>332,766=>333,767=>333,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0,875=>0,876=>0,877=>0,878=>0,879=>0,884=>208,885=>247,890=>364,894=>333,900=>239,901=>446,902=>688,903=>333,904=>903,905=>962,906=>448,908=>904,910=>991,911=>932,912=>346,913=>764,914=>688,915=>642,916=>744,917=>710,918=>688,919=>743,920=>810,921=>296,922=>744,923=>744,924=>860,925=>714,926=>690,927=>822,928=>781,929=>698,931=>688,932=>688,933=>744,934=>777,935=>783,936=>805,937=>780,938=>296,939=>744,940=>640,941=>530,942=>597,943=>339,944=>575,945=>656,946=>576,947=>591,948=>620,949=>570,950=>522,951=>586,952=>586,953=>346,954=>576,955=>620,956=>667,957=>564,958=>530,959=>610,960=>721,961=>626,962=>595,963=>676,964=>592,965=>575,966=>801,967=>632,968=>722,969=>800,970=>346,971=>575,972=>609,973=>604,974=>769,977=>580,978=>742,979=>857,980=>620,981=>778,982=>740,983=>601,1008=>556,1009=>566,1012=>778,1013=>328,1024=>667,1025=>667,1026=>790,1027=>617,1028=>731,1029=>667,1030=>278,1031=>278,1032=>556,1033=>1110,1034=>1088,1035=>790,1036=>722,1037=>757,1038=>698,1039=>722,1040=>722,1041=>722,1042=>722,1043=>617,1044=>876,1045=>667,1046=>1100,1047=>670,1048=>757,1049=>757,1050=>722,1051=>715,1052=>874,1053=>753,1054=>778,1055=>753,1056=>680,1057=>722,1058=>611,1059=>698,1060=>909,1061=>657,1062=>845,1063=>688,1064=>1132,1065=>1217,1066=>835,1067=>980,1068=>678,1069=>735,1070=>1142,1071=>708,1072=>553,1073=>591,1074=>574,1075=>429,1076=>745,1077=>572,1078=>792,1079=>554,1080=>603,1081=>603,1082=>559,1083=>583,1084=>664,1085=>603,1086=>588,1087=>603,1088=>605,1089=>549,1090=>440,1091=>541,1092=>948,1093=>539,1094=>690,1095=>564,1096=>901,1097=>987,1098=>692,1099=>806,1100=>572,1101=>546,1102=>893,1103=>586,1104=>572,1105=>572,1106=>616,1107=>429,1108=>549,1109=>562,1110=>281,1111=>300,1112=>282,1113=>888,1114=>897,1115=>606,1116=>559,1117=>603,1118=>541,1119=>603,1120=>986,1121=>736,1136=>830,1137=>761,1138=>778,1139=>590,1148=>942,1149=>736,1150=>986,1151=>736,1154=>456,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>791,1163=>662,1164=>639,1165=>581,1166=>670,1167=>649,1168=>623,1169=>450,1170=>623,1171=>472,1172=>674,1173=>528,1174=>1091,1175=>803,1176=>659,1177=>548,1178=>739,1179=>569,1180=>742,1181=>560,1182=>737,1183=>559,1184=>900,1185=>679,1186=>808,1187=>673,1188=>1004,1189=>761,1190=>1114,1191=>876,1192=>963,1193=>766,1194=>724,1195=>554,1196=>611,1197=>454,1198=>667,1199=>584,1200=>652,1201=>632,1202=>667,1203=>550,1204=>951,1205=>748,1206=>759,1207=>630,1208=>669,1209=>580,1210=>672,1211=>576,1212=>977,1213=>752,1214=>993,1215=>761,1216=>318,1217=>1087,1218=>792,1219=>726,1220=>530,1221=>782,1222=>674,1223=>749,1224=>603,1225=>823,1226=>682,1227=>675,1228=>573,1229=>941,1230=>754,1231=>310,1232=>704,1233=>553,1234=>711,1235=>553,1236=>1000,1237=>892,1238=>667,1239=>569,1240=>738,1241=>561,1242=>738,1243=>561,1244=>1086,1245=>792,1246=>670,1247=>554,1248=>558,1249=>546,1250=>753,1251=>603,1252=>753,1253=>603,1254=>778,1255=>588,1256=>778,1257=>590,1258=>778,1259=>590,1260=>735,1261=>546,1262=>698,1263=>541,1264=>698,1265=>541,1266=>698,1267=>541,1268=>686,1269=>564,1270=>617,1271=>475,1272=>976,1273=>806,1296=>672,1297=>546,1298=>729,1299=>577,1306=>778,1307=>611,1308=>944,1309=>776,1310=>750,1311=>573,1329=>730,1330=>713,1331=>765,1332=>752,1333=>708,1334=>801,1335=>496,1336=>713,1337=>855,1338=>686,1339=>727,1340=>420,1341=>897,1342=>841,1343=>708,1344=>660,1345=>666,1346=>747,1347=>698,1348=>757,1349=>630,1350=>747,1351=>651,1352=>743,1353=>657,1354=>728,1355=>799,1356=>752,1357=>743,1358=>768,1359=>691,1360=>713,1361=>640,1362=>425,1363=>818,1364=>672,1365=>805,1366=>754,1369=>333,1370=>222,1371=>250,1372=>333,1373=>333,1374=>352,1375=>362,1377=>873,1378=>613,1379=>634,1380=>636,1381=>593,1382=>639,1383=>417,1384=>613,1385=>658,1386=>711,1387=>609,1388=>318,1389=>836,1390=>670,1391=>613,1392=>607,1393=>611,1394=>626,1395=>619,1396=>618,1397=>324,1398=>613,1399=>540,1400=>591,1401=>392,1402=>873,1403=>577,1404=>603,1405=>600,1406=>626,1407=>951,1408=>613,1409=>612,1410=>348,1411=>951,1412=>616,1413=>606,1414=>763,1415=>626,1417=>333,1418=>398,1423=>752,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0,1468=>0,1469=>0,1470=>596,1471=>0,1472=>377,1473=>0,1474=>0,1475=>413,1476=>0,1488=>714,1489=>651,1490=>557,1491=>638,1492=>682,1493=>297,1494=>443,1495=>682,1496=>670,1497=>284,1498=>590,1499=>595,1500=>667,1501=>683,1502=>694,1503=>297,1504=>429,1505=>670,1506=>653,1507=>661,1508=>660,1509=>616,1510=>671,1511=>672,1512=>600,1513=>840,1514=>756,1520=>554,1521=>550,1522=>542,1523=>238,1524=>474,4256=>616,4257=>645,4258=>664,4259=>839,4260=>627,4261=>630,4262=>827,4263=>928,4264=>639,4265=>630,4266=>951,4267=>606,4268=>608,4269=>835,4270=>630,4271=>610,4272=>804,4273=>615,4274=>823,4275=>747,4276=>870,4277=>627,4278=>840,4279=>627,4280=>665,4281=>610,4282=>799,4283=>598,4284=>665,4285=>664,4286=>608,4287=>886,4288=>629,4304=>463,4305=>516,4306=>564,4307=>706,4308=>459,4309=>476,4310=>623,4311=>711,4312=>494,4313=>476,4314=>894,4315=>500,4316=>500,4317=>712,4318=>493,4319=>503,4320=>712,4321=>503,4322=>710,4323=>670,4324=>707,4325=>459,4326=>691,4327=>465,4328=>492,4329=>480,4330=>656,4331=>500,4332=>492,4333=>524,4334=>500,4335=>688,4336=>510,4337=>739,4338=>450,4339=>479,4340=>502,4341=>501,4345=>564,4347=>515,4348=>449,5024=>714,5025=>731,5026=>624,5027=>908,5028=>1040,5029=>271,5030=>654,5031=>863,5032=>604,5033=>791,5034=>714,5035=>522,5036=>661,5037=>926,5038=>615,5039=>811,5040=>538,5041=>633,5042=>979,5043=>964,5044=>635,5045=>607,5046=>753,5047=>831,5048=>566,5049=>977,5050=>958,5051=>710,5052=>616,5053=>834,5054=>790,5055=>612,5056=>766,5057=>857,5058=>627,5059=>649,5060=>607,5061=>1127,5062=>680,5063=>920,5064=>928,5065=>1333,5066=>920,5067=>705,5068=>695,5069=>1074,5070=>672,5071=>672,5072=>667,5073=>819,5074=>679,5075=>575,5076=>903,5077=>652,5078=>776,5079=>643,5080=>670,5081=>660,5082=>648,5083=>934,5084=>909,5085=>613,5086=>615,5087=>735,5088=>900,5089=>1024,5090=>647,5091=>760,5092=>829,5093=>824,5094=>756,5095=>625,5096=>981,5097=>1014,5098=>1040,5099=>790,5100=>926,5101=>686,5102=>656,5103=>920,5104=>741,5105=>890,5106=>626,5107=>974,5108=>699,7680=>722,7681=>556,7682=>722,7683=>611,7684=>722,7685=>611,7686=>722,7687=>611,7688=>722,7689=>556,7690=>722,7691=>611,7692=>722,7693=>611,7694=>722,7695=>611,7696=>722,7697=>611,7698=>722,7699=>611,7700=>667,7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667,7707=>556,7708=>667,7709=>556,7710=>611,7711=>333,7712=>778,7713=>611,7714=>722,7715=>611,7716=>722,7717=>611,7718=>722,7719=>611,7720=>722,7721=>611,7722=>722,7723=>611,7724=>278,7725=>278,7726=>278,7727=>278,7728=>722,7729=>556,7730=>722,7731=>556,7732=>722,7733=>556,7734=>611,7735=>278,7736=>611,7737=>278,7738=>611,7739=>278,7740=>611,7741=>278,7742=>833,7743=>889,7744=>833,7745=>889,7746=>833,7747=>889,7748=>722,7749=>611,7750=>722,7751=>611,7752=>722,7753=>611,7754=>722,7755=>611,7756=>778,7757=>611,7758=>778,7759=>611,7760=>778,7761=>611,7762=>778,7763=>611,7764=>667,7765=>611,7766=>667,7767=>611,7768=>722,7769=>389,7770=>722,7771=>389,7772=>722,7773=>389,7774=>722,7775=>389,7776=>667,7777=>556,7778=>667,7779=>556,7780=>667,7781=>556,7782=>667,7783=>556,7784=>667,7785=>556,7786=>611,7787=>333,7788=>611,7789=>333,7790=>611,7791=>333,7792=>611,7793=>333,7794=>722,7795=>611,7796=>722,7797=>611,7798=>722,7799=>611,7800=>722,7801=>611,7802=>722,7803=>611,7804=>667,7805=>556,7806=>667,7807=>556,7808=>944,7809=>778,7810=>944,7811=>778,7812=>944,7813=>778,7814=>944,7815=>778,7816=>944,7817=>778,7818=>667,7819=>556,7820=>667,7821=>556,7822=>667,7823=>556,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500,7830=>611,7831=>333,7832=>778,7833=>556,7834=>555,7835=>333,7840=>722,7841=>556,7842=>722,7843=>556,7844=>722,7845=>556,7846=>722,7847=>556,7848=>722,7849=>556,7850=>722,7851=>556,7852=>722,7853=>556,7854=>722,7855=>556,7856=>722,7857=>556,7858=>722,7859=>556,7860=>722,7861=>556,7862=>722,7863=>556,7864=>667,7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667,7871=>556,7872=>667,7873=>556,7874=>667,7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278,7881=>278,7882=>278,7883=>278,7884=>778,7885=>611,7886=>778,7887=>611,7888=>778,7889=>611,7890=>778,7891=>611,7892=>778,7893=>611,7894=>778,7895=>611,7896=>778,7897=>611,7898=>788,7899=>653,7900=>788,7901=>653,7902=>788,7903=>653,7904=>788,7905=>653,7906=>788,7907=>653,7908=>722,7909=>611,7910=>722,7911=>611,7912=>769,7913=>664,7914=>769,7915=>664,7916=>769,7917=>664,7918=>769,7919=>664,7920=>769,7921=>664,7922=>667,7923=>556,7924=>667,7925=>556,7926=>667,7927=>556,7928=>667,7929=>556,7936=>656,7937=>656,7938=>656,7939=>656,7940=>656,7941=>656,7942=>656,7943=>656,7944=>764,7945=>764,7946=>916,7947=>940,7948=>908,7949=>891,7950=>844,7951=>869,7952=>570,7953=>570,7954=>570,7955=>570,7956=>570,7957=>570,7960=>842,7961=>836,7962=>1025,7963=>1051,7964=>1035,7965=>1049,7968=>586,7969=>586,7970=>586,7971=>586,7972=>586,7973=>586,7974=>586,7975=>586,7976=>891,7977=>886,7978=>1081,7979=>1108,7980=>1085,7981=>1096,7982=>1009,7983=>1023,7984=>346,7985=>346,7986=>346,7987=>346,7988=>346,7989=>346,7990=>346,7991=>346,7992=>467,7993=>476,7994=>631,7995=>661,7996=>631,7997=>633,7998=>568,7999=>571,8000=>610,8001=>610,8002=>610,8003=>610,8004=>610,8005=>610,8008=>945,8009=>905,8010=>1118,8011=>1121,8012=>1064,8013=>1062,8016=>575,8017=>575,8018=>575,8019=>575,8020=>575,8021=>575,8022=>575,8023=>575,8025=>964,8027=>1148,8029=>1162,8031=>1081,8032=>800,8033=>800,8034=>800,8035=>800,8036=>800,8037=>800,8038=>800,8039=>800,8040=>904,8041=>875,8042=>1092,8043=>1087,8044=>1003,8045=>1002,8046=>1001,8047=>1025,8048=>656,8049=>656,8050=>570,8051=>570,8052=>586,8053=>586,8054=>346,8055=>346,8056=>610,8057=>610,8058=>575,8059=>575,8060=>800,8061=>800,8064=>656,8065=>656,8066=>656,8067=>656,8068=>656,8069=>656,8070=>656,8071=>656,8072=>854,8073=>855,8074=>1006,8075=>1030,8076=>996,8077=>977,8078=>938,8079=>959,8080=>586,8081=>586,8082=>586,8083=>586,8084=>586,8085=>586,8086=>586,8087=>586,8088=>960,8089=>960,8090=>1155,8091=>1186,8092=>1161,8093=>1171,8094=>1087,8095=>1102,8096=>800,8097=>800,8098=>800,8099=>800,8100=>800,8101=>800,8102=>800,8103=>800,8104=>1005,8105=>980,8106=>1201,8107=>1192,8108=>1109,8109=>1108,8110=>1106,8111=>1130,8112=>656,8113=>656,8114=>656,8115=>656,8116=>640,8118=>656,8119=>656,8120=>764,8121=>764,8122=>764,8123=>764,8124=>854,8125=>278,8126=>201,8127=>147,8128=>278,8129=>333,8130=>586,8131=>586,8132=>597,8134=>586,8135=>586,8136=>911,8137=>925,8138=>941,8139=>948,8140=>826,8141=>402,8142=>403,8143=>147,8144=>346,8145=>346,8146=>346,8147=>346,8150=>346,8151=>346,8152=>296,8153=>296,8154=>511,8155=>521,8157=>434,8158=>433,8159=>333,8160=>575,8161=>575,8162=>575,8163=>575,8164=>626,8165=>626,8166=>575,8167=>575,8168=>744,8169=>744,8170=>901,8171=>975,8172=>837,8173=>353,8174=>351,8175=>303,8178=>800,8179=>800,8180=>800,8182=>800,8183=>800,8184=>979,8185=>918,8186=>936,8187=>877,8188=>895,8189=>333,8190=>159,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>167,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>556,8211=>556,8212=>1000,8213=>1000,8214=>437,8215=>556,8216=>278,8217=>278,8218=>278,8219=>278,8220=>500,8221=>500,8222=>500,8223=>503,8224=>556,8225=>556,8226=>400,8227=>400,8228=>278,8229=>666,8230=>1000,8231=>278,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>167,8240=>1000,8241=>1372,8242=>238,8243=>426,8244=>614,8245=>238,8246=>379,8247=>571,8248=>450,8249=>333,8250=>333,8251=>622,8252=>666,8253=>617,8254=>556,8255=>658,8256=>658,8257=>438,8258=>840,8259=>400,8260=>167,8261=>334,8262=>334,8263=>1222,8264=>944,8265=>944,8266=>556,8267=>556,8268=>600,8269=>600,8270=>389,8271=>333,8272=>658,8273=>389,8274=>634,8275=>568,8276=>658,8277=>793,8278=>515,8279=>855,8280=>722,8281=>725,8282=>224,8283=>722,8284=>604,8285=>224,8286=>224,8287=>0,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>351,8305=>200,8308=>351,8309=>351,8310=>351,8311=>351,8312=>351,8313=>351,8314=>351,8315=>351,8316=>351,8317=>270,8318=>270,8319=>391,8320=>351,8321=>251,8322=>351,8323=>351,8324=>351,8325=>351,8326=>351,8327=>351,8328=>351,8329=>351,8330=>350,8331=>350,8332=>350,8333=>270,8334=>270,8336=>363,8337=>366,8338=>394,8339=>360,8340=>355,8355=>611,8356=>576,8357=>833,8358=>724,8360=>1286,8362=>1049,8363=>571,8364=>640,8368=>594,8373=>591,8376=>612,8377=>599,8400=>0,8401=>0,8402=>0,8403=>0,8406=>0,8407=>0,8411=>0,8412=>0,8413=>0,8414=>0,8415=>0,8416=>0,8417=>0,8421=>0,8422=>0,8423=>0,8424=>0,8425=>0,8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8432=>0,8448=>945,8449=>1007,8451=>1020,8453=>981,8454=>1002,8455=>667,8456=>722,8457=>930,8462=>611,8465=>606,8467=>608,8468=>883,8470=>1006,8471=>860,8476=>699,8480=>1000,8481=>1330,8482=>1000,8486=>780,8487=>780,8489=>286,8490=>722,8491=>722,8494=>556,8498=>626,8501=>714,8502=>651,8503=>557,8504=>638,8506=>906,8507=>1425,8513=>778,8514=>611,8515=>611,8516=>667,8523=>710,8525=>1242,8526=>460,8531=>869,8532=>869,8533=>869,8534=>869,8535=>869,8536=>869,8537=>869,8538=>869,8539=>869,8540=>869,8541=>869,8542=>869,8543=>869,8544=>278,8545=>556,8546=>834,8547=>945,8548=>667,8549=>945,8550=>1223,8551=>1501,8552=>945,8553=>667,8554=>945,8555=>1223,8556=>611,8557=>722,8558=>722,8559=>833,8560=>278,8561=>556,8562=>834,8563=>834,8564=>556,8565=>834,8566=>1112,8567=>1390,8568=>834,8569=>556,8570=>834,8571=>1112,8572=>278,8573=>556,8574=>611,8575=>889,8592=>964,8593=>964,8594=>964,8595=>964,8596=>964,8597=>964,8598=>964,8599=>964,8600=>964,8601=>964,8602=>964,8603=>964,8606=>964,8607=>964,8608=>964,8609=>964,8610=>964,8611=>964,8612=>964,8613=>964,8614=>964,8615=>964,8616=>964,8644=>964,8645=>964,8646=>964,8647=>964,8648=>964,8649=>964,8650=>964,8704=>697,8705=>716,8706=>608,8707=>667,8708=>667,8709=>860,8710=>729,8711=>729,8712=>584,8713=>584,8714=>585,8715=>584,8716=>584,8717=>585,8718=>500,8719=>800,8720=>801,8721=>856,8722=>584,8723=>584,8724=>584,8725=>627,8726=>452,8727=>500,8728=>500,8729=>500,8730=>637,8731=>549,8732=>549,8733=>713,8734=>713,8735=>639,8736=>800,8739=>220,8741=>380,8743=>608,8744=>608,8745=>768,8746=>768,8747=>518,8748=>808,8749=>1098,8764=>500,8776=>500,8800=>584,8801=>584,8804=>584,8805=>584,8834=>584,8835=>584,8838=>584,8839=>584,8976=>584,8994=>658,8995=>658,9001=>380,9002=>380,9251=>500,9674=>541,9675=>860,9702=>400,9711=>1020,9824=>626,9825=>694,9826=>595,9827=>776,9828=>626,9829=>694,9830=>595,9831=>776,9833=>333,9834=>556,9835=>778,9836=>778,9837=>556,9838=>556,9839=>556,11568=>352,11569=>872,11570=>872,11571=>720,11572=>720,11573=>720,11574=>664,11575=>752,11576=>752,11577=>720,11578=>720,11579=>596,11580=>698,11581=>742,11582=>574,11583=>742,11584=>872,11585=>872,11586=>312,11587=>720,11588=>696,11589=>720,11590=>584,11591=>742,11592=>796,11593=>613,11594=>672,11595=>888,11596=>836,11597=>524,11598=>720,11599=>300,11600=>836,11601=>300,11602=>718,11603=>388,11604=>872,11605=>872,11606=>696,11607=>308,11608=>640,11609=>872,11610=>872,11611=>762,11612=>424,11613=>720,11614=>762,11615=>720,11616=>709,11617=>720,11618=>541,11619=>828,11620=>454,11621=>828,11631=>482,11798=>584,11799=>333,11800=>611,11802=>333,11803=>500,11806=>500,11807=>500,11816=>504,11817=>504,11818=>660,11819=>660,11820=>660,11821=>660,11822=>611,42888=>333,42889=>276,42890=>342,42891=>258,42892=>258,42922=>917,64256=>607,64257=>576,64258=>603,64259=>849,64260=>849,64261=>627,64275=>1243,64276=>1226,64277=>1233,64278=>1238,64279=>1448,64285=>284,64286=>305,64287=>542,64288=>653,64289=>964,64290=>888,64291=>932,64292=>845,64293=>917,64294=>933,64295=>850,64296=>1006,64297=>584,64298=>840,64299=>840,64300=>840,64301=>840,64302=>714,64303=>714,64304=>714,64305=>651,64306=>557,64307=>638,64308=>682,64309=>348,64310=>443,64312=>670,64313=>284,64314=>590,64315=>595,64316=>667,64318=>694,64320=>429,64321=>670,64323=>661,64324=>660,64326=>671,64327=>672,64328=>600,64329=>840,64330=>756,64331=>212,64332=>591,64333=>550,64334=>568,64335=>714,65529=>0,65530=>0,65531=>0,65532=>800,65533=>900,65535=>800);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansbi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansbi.z
new file mode 100644
index 00000000..698832f8
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansbi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansi.ctg.z
new file mode 100644
index 00000000..5b8a88aa
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansi.php
new file mode 100644
index 00000000..8889e284
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='FreeSansOblique';
+$up=-176;
+$ut=50;
+$dw=800;
+$diff='';
+$originalsize=763696;
+$enc='';
+$file='freesansi.z';
+$ctg='freesansi.ctg.z';
+$desc=array('Flags'=>96,'FontBBox'=>'[-1166 -431 1572 1072]','ItalicAngle'=>-12,'Ascent'=>900,'Descent'=>-200,'Leading'=>100,'CapHeight'=>729,'XHeight'=>524,'StemV'=>70,'StemH'=>30,'AvgWidth'=>600,'MaxWidth'=>1501,'MissingWidth'=>800);
+$cw=array(0=>800,32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584,62=>584,63=>556,64=>1015,65=>667,66=>664,67=>710,68=>702,69=>657,70=>601,71=>778,72=>721,73=>278,74=>507,75=>667,76=>556,77=>846,78=>730,79=>770,80=>646,81=>776,82=>709,83=>651,84=>611,85=>721,86=>645,87=>937,88=>669,89=>678,90=>611,91=>278,92=>278,93=>278,94=>469,95=>556,96=>333,97=>554,98=>561,99=>515,100=>558,101=>547,102=>260,103=>552,104=>540,105=>222,106=>242,107=>502,108=>222,109=>816,110=>540,111=>556,112=>563,113=>556,114=>324,115=>500,116=>265,117=>538,118=>497,119=>723,120=>490,121=>479,122=>500,123=>334,124=>260,125=>334,126=>584,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>444,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584,178=>352,179=>352,180=>333,181=>556,182=>537,183=>278,184=>333,185=>250,186=>365,187=>444,188=>900,189=>927,190=>947,191=>611,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000,199=>711,200=>657,201=>657,202=>657,203=>657,204=>278,205=>278,206=>278,207=>278,208=>722,209=>730,210=>770,211=>770,212=>770,213=>770,214=>770,215=>584,216=>778,217=>721,218=>721,219=>721,220=>721,221=>678,222=>646,223=>579,224=>554,225=>554,226=>554,227=>554,228=>554,229=>554,230=>897,231=>510,232=>547,233=>547,234=>547,235=>547,236=>222,237=>222,238=>262,239=>262,240=>556,241=>540,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584,248=>561,249=>538,250=>538,251=>538,252=>538,253=>479,254=>561,255=>479,256=>667,257=>554,258=>667,259=>554,260=>667,261=>556,262=>710,263=>515,264=>710,265=>515,266=>710,267=>515,268=>710,269=>515,270=>702,271=>692,272=>722,273=>556,274=>657,275=>547,276=>657,277=>547,278=>657,279=>547,280=>657,281=>547,282=>657,283=>547,284=>778,285=>552,286=>778,287=>552,288=>778,289=>552,290=>778,291=>552,292=>721,293=>540,294=>722,295=>556,296=>300,297=>262,298=>300,299=>262,300=>300,301=>262,302=>278,303=>262,304=>278,305=>222,306=>742,307=>387,308=>507,309=>262,310=>667,311=>502,312=>500,313=>556,314=>222,315=>556,316=>222,317=>556,318=>342,319=>556,320=>359,321=>556,322=>222,323=>730,324=>540,325=>730,326=>540,327=>730,328=>540,329=>692,330=>642,331=>538,332=>770,333=>556,334=>770,335=>556,336=>770,337=>556,338=>1000,339=>937,340=>709,341=>324,342=>709,343=>324,344=>709,345=>324,346=>651,347=>500,348=>651,349=>500,350=>667,351=>500,352=>651,353=>500,354=>611,355=>278,356=>611,357=>373,358=>611,359=>278,360=>721,361=>538,362=>721,363=>538,364=>721,365=>538,366=>721,367=>538,368=>721,369=>538,370=>722,371=>556,372=>937,373=>723,374=>678,375=>479,376=>678,377=>611,378=>500,379=>611,380=>500,381=>611,382=>500,383=>278,384=>556,385=>777,386=>667,387=>556,388=>667,389=>556,390=>710,391=>722,392=>530,393=>722,394=>869,395=>667,396=>556,397=>566,398=>667,399=>778,400=>667,401=>611,402=>278,403=>778,404=>667,405=>889,406=>278,407=>333,408=>741,409=>500,410=>333,411=>560,412=>833,413=>722,414=>556,415=>778,416=>778,417=>556,418=>1002,419=>737,420=>842,421=>556,422=>666,423=>667,424=>500,425=>611,426=>333,427=>278,428=>611,429=>278,430=>611,431=>773,432=>623,433=>768,434=>722,435=>793,436=>608,437=>611,438=>500,439=>611,440=>611,441=>500,442=>500,443=>556,446=>556,447=>556,448=>260,449=>520,450=>584,451=>278,452=>1311,453=>1208,454=>1056,455=>1056,456=>778,457=>444,458=>1158,459=>944,460=>778,461=>667,462=>554,463=>300,464=>262,465=>770,466=>556,467=>721,468=>538,469=>721,470=>538,471=>721,472=>538,473=>721,474=>538,475=>721,476=>538,477=>547,478=>667,479=>554,480=>667,481=>554,482=>1000,483=>897,484=>778,485=>556,486=>778,487=>552,488=>667,489=>502,490=>778,491=>551,492=>778,493=>551,494=>611,495=>560,496=>222,497=>1333,498=>1222,499=>1056,500=>778,501=>552,503=>630,504=>730,505=>540,506=>667,507=>554,508=>1000,509=>897,510=>778,511=>561,512=>667,513=>554,514=>667,515=>554,516=>657,517=>547,518=>657,519=>547,520=>300,521=>262,522=>300,523=>262,524=>770,525=>556,526=>770,527=>556,528=>709,529=>324,530=>709,531=>324,532=>721,533=>538,534=>721,535=>538,536=>651,537=>500,538=>611,539=>265,540=>521,541=>393,542=>721,543=>540,548=>611,549=>500,550=>667,551=>554,552=>667,553=>556,554=>770,555=>556,556=>770,557=>556,558=>770,559=>556,560=>770,561=>556,562=>678,563=>479,567=>222,592=>554,593=>556,594=>589,595=>556,596=>515,597=>500,598=>581,599=>564,600=>556,601=>547,602=>773,603=>500,604=>500,605=>742,606=>500,607=>246,608=>556,609=>552,610=>546,611=>434,612=>556,613=>540,614=>556,615=>556,616=>245,617=>222,618=>278,619=>473,620=>427,621=>229,622=>611,623=>816,624=>803,625=>833,626=>566,627=>576,628=>560,629=>556,630=>778,631=>722,632=>728,633=>324,634=>333,635=>393,636=>333,637=>333,638=>384,639=>369,640=>546,641=>546,642=>550,643=>328,644=>298,645=>298,646=>444,647=>265,648=>278,649=>579,650=>626,651=>539,652=>497,653=>723,654=>479,655=>538,656=>510,657=>520,658=>560,659=>552,660=>533,661=>534,662=>533,663=>1000,664=>526,665=>501,666=>520,667=>575,668=>520,669=>444,670=>502,671=>430,672=>556,673=>532,674=>533,675=>934,676=>944,677=>944,678=>689,679=>506,680=>764,681=>766,682=>660,683=>577,684=>475,685=>486,686=>565,687=>621,688=>333,689=>333,690=>167,691=>236,692=>236,693=>276,694=>359,695=>500,696=>330,697=>278,698=>454,699=>278,700=>278,701=>278,702=>333,703=>333,704=>333,705=>333,706=>333,707=>333,708=>333,709=>333,710=>333,711=>333,712=>333,713=>333,714=>333,715=>333,716=>333,717=>333,718=>333,719=>333,720=>333,721=>333,722=>333,723=>333,724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333,731=>333,732=>333,733=>333,734=>333,735=>510,736=>333,737=>186,738=>333,739=>333,740=>334,741=>526,742=>526,743=>526,744=>526,745=>526,746=>519,747=>519,748=>333,749=>333,750=>333,751=>333,752=>383,753=>294,754=>294,755=>327,756=>261,757=>437,758=>437,759=>333,760=>278,761=>200,762=>200,763=>200,764=>200,765=>333,766=>333,767=>333,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0,875=>0,876=>0,877=>0,878=>0,879=>0,884=>199,885=>199,890=>332,894=>278,900=>291,901=>624,902=>659,903=>278,904=>870,905=>870,906=>315,908=>876,910=>903,911=>882,912=>333,913=>765,914=>643,915=>589,916=>760,917=>659,918=>682,919=>707,920=>769,921=>256,922=>689,923=>765,924=>825,925=>687,926=>649,927=>766,928=>730,929=>649,931=>678,932=>655,933=>733,934=>753,935=>783,936=>773,937=>768,938=>285,939=>733,940=>593,941=>523,942=>595,943=>271,944=>549,945=>596,946=>534,947=>531,948=>566,949=>523,950=>470,951=>557,952=>547,953=>293,954=>516,955=>579,956=>571,957=>518,958=>499,959=>561,960=>636,961=>551,962=>564,963=>627,964=>505,965=>549,966=>715,967=>579,968=>662,969=>746,970=>335,971=>549,972=>535,973=>503,974=>725,977=>580,978=>742,979=>809,980=>620,981=>728,982=>740,983=>556,1008=>556,1009=>566,1012=>778,1013=>328,1024=>657,1025=>657,1026=>781,1027=>590,1028=>709,1029=>655,1030=>254,1031=>300,1032=>532,1033=>1002,1034=>1166,1035=>772,1036=>674,1037=>730,1038=>605,1039=>721,1040=>667,1041=>665,1042=>664,1043=>590,1044=>807,1045=>657,1046=>914,1047=>653,1048=>730,1049=>730,1050=>674,1051=>656,1052=>846,1053=>721,1054=>770,1055=>720,1056=>649,1057=>709,1058=>606,1059=>605,1060=>875,1061=>660,1062=>754,1063=>612,1064=>830,1065=>872,1066=>839,1067=>885,1068=>668,1069=>708,1070=>1099,1071=>676,1072=>554,1073=>545,1074=>521,1075=>375,1076=>572,1077=>538,1078=>815,1079=>488,1080=>557,1081=>557,1082=>519,1083=>508,1084=>618,1085=>558,1086=>533,1087=>557,1088=>569,1089=>511,1090=>392,1091=>469,1092=>922,1093=>475,1094=>588,1095=>482,1096=>693,1097=>722,1098=>644,1099=>731,1100=>521,1101=>509,1102=>790,1103=>550,1104=>538,1105=>538,1106=>566,1107=>375,1108=>506,1109=>488,1110=>224,1111=>272,1112=>226,1113=>793,1114=>849,1115=>576,1116=>519,1117=>557,1118=>469,1119=>557,1120=>942,1121=>693,1136=>749,1137=>666,1138=>785,1139=>528,1148=>942,1149=>736,1150=>947,1151=>686,1154=>456,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>751,1163=>588,1164=>685,1165=>554,1166=>656,1167=>606,1168=>598,1169=>396,1170=>611,1171=>409,1172=>592,1173=>448,1174=>921,1175=>826,1176=>657,1177=>493,1178=>680,1179=>529,1180=>678,1181=>524,1182=>695,1183=>528,1184=>846,1185=>650,1186=>741,1187=>578,1188=>992,1189=>700,1190=>1047,1191=>778,1192=>810,1193=>645,1194=>709,1195=>509,1196=>611,1197=>393,1198=>664,1199=>580,1200=>668,1201=>617,1202=>664,1203=>489,1204=>905,1205=>662,1206=>631,1207=>498,1208=>597,1209=>472,1210=>597,1211=>471,1212=>927,1213=>716,1214=>927,1215=>699,1216=>254,1217=>915,1218=>815,1219=>665,1220=>510,1221=>678,1222=>533,1223=>721,1224=>558,1225=>751,1226=>589,1227=>599,1228=>472,1229=>876,1230=>649,1231=>254,1232=>667,1233=>552,1234=>667,1235=>552,1236=>1000,1237=>897,1238=>657,1239=>538,1240=>722,1241=>511,1242=>722,1243=>511,1244=>914,1245=>815,1246=>653,1247=>488,1248=>611,1249=>546,1250=>730,1251=>557,1252=>730,1253=>557,1254=>774,1255=>529,1256=>785,1257=>528,1258=>785,1259=>528,1260=>708,1261=>509,1262=>605,1263=>469,1264=>605,1265=>469,1266=>605,1267=>469,1268=>612,1269=>482,1270=>601,1271=>430,1272=>885,1273=>731,1296=>667,1297=>500,1298=>673,1299=>557,1306=>776,1307=>556,1308=>937,1309=>723,1310=>667,1311=>510,1329=>722,1330=>705,1331=>774,1332=>754,1333=>722,1334=>751,1335=>485,1336=>722,1337=>782,1338=>655,1339=>699,1340=>417,1341=>853,1342=>791,1343=>711,1344=>588,1345=>663,1346=>665,1347=>665,1348=>756,1349=>623,1350=>773,1351=>603,1352=>722,1353=>648,1354=>722,1355=>751,1356=>750,1357=>722,1358=>748,1359=>667,1360=>699,1361=>623,1362=>417,1363=>785,1364=>638,1365=>778,1366=>716,1369=>333,1370=>222,1371=>133,1372=>325,1373=>333,1374=>333,1375=>333,1377=>833,1378=>556,1379=>572,1380=>581,1381=>546,1382=>588,1383=>448,1384=>556,1385=>568,1386=>582,1387=>552,1388=>301,1389=>799,1390=>556,1391=>554,1392=>533,1393=>548,1394=>552,1395=>552,1396=>544,1397=>222,1398=>544,1399=>456,1400=>556,1401=>390,1402=>833,1403=>509,1404=>547,1405=>533,1406=>610,1407=>887,1408=>556,1409=>545,1410=>301,1411=>853,1412=>632,1413=>579,1414=>690,1415=>545,1417=>278,1418=>367,1423=>735,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0,1468=>0,1469=>0,1470=>488,1471=>0,1472=>212,1473=>0,1474=>0,1475=>278,1476=>0,1488=>640,1489=>591,1490=>466,1491=>598,1492=>622,1493=>212,1494=>351,1495=>623,1496=>608,1497=>200,1498=>526,1499=>550,1500=>600,1501=>623,1502=>621,1503=>212,1504=>378,1505=>607,1506=>587,1507=>575,1508=>568,1509=>540,1510=>590,1511=>606,1512=>547,1513=>776,1514=>687,1520=>424,1521=>412,1522=>400,1523=>184,1524=>344,2433=>0,2434=>300,2435=>264,2437=>594,2438=>790,2439=>469,2440=>513,2441=>520,2442=>549,2443=>594,2444=>481,2447=>580,2448=>627,2451=>540,2452=>613,2453=>570,2454=>467,2455=>471,2456=>428,2457=>483,2458=>408,2459=>509,2460=>591,2461=>563,2462=>771,2463=>381,2464=>404,2465=>522,2466=>408,2467=>450,2468=>543,2469=>477,2470=>418,2471=>433,2472=>445,2474=>499,2475=>584,2476=>377,2477=>555,2478=>448,2479=>423,2480=>390,2482=>498,2486=>498,2487=>425,2488=>495,2489=>440,2492=>0,2493=>440,2494=>193,2495=>189,2496=>180,2497=>0,2498=>0,2499=>0,2500=>0,2503=>252,2504=>243,2507=>889,2508=>865,2509=>0,2510=>356,2519=>219,2524=>523,2525=>408,2527=>428,2528=>594,2529=>481,2530=>0,2531=>0,2534=>500,2535=>437,2536=>479,2537=>530,2538=>497,2539=>500,2540=>482,2541=>503,2542=>517,2543=>481,2544=>377,2545=>377,2546=>429,2547=>383,2548=>429,2549=>478,2550=>545,2551=>158,2552=>365,2553=>280,2554=>357,2555=>344,4256=>587,4257=>620,4258=>642,4259=>815,4260=>600,4261=>595,4262=>799,4263=>893,4264=>622,4265=>597,4266=>939,4267=>602,4268=>603,4269=>790,4270=>587,4271=>623,4272=>799,4273=>601,4274=>792,4275=>724,4276=>847,4277=>599,4278=>812,4279=>603,4280=>653,4281=>590,4282=>754,4283=>596,4284=>653,4285=>651,4286=>596,4287=>888,4288=>593,4304=>436,4305=>491,4306=>528,4307=>692,4308=>447,4309=>447,4310=>628,4311=>734,4312=>449,4313=>445,4314=>843,4315=>449,4316=>449,4317=>682,4318=>449,4319=>480,4320=>682,4321=>468,4322=>710,4323=>623,4324=>697,4325=>447,4326=>702,4327=>447,4328=>470,4329=>440,4330=>632,4331=>449,4332=>470,4333=>536,4334=>449,4335=>656,4336=>474,4337=>630,4338=>394,4339=>419,4340=>422,4341=>436,4345=>528,4347=>515,4348=>449,5024=>678,5025=>756,5026=>604,5027=>770,5028=>969,5029=>207,5030=>633,5031=>800,5032=>474,5033=>689,5034=>672,5035=>446,5036=>637,5037=>776,5038=>511,5039=>723,5040=>528,5041=>591,5042=>839,5043=>963,5044=>615,5045=>563,5046=>705,5047=>800,5048=>558,5049=>880,5050=>966,5051=>675,5052=>527,5053=>733,5054=>779,5055=>547,5056=>756,5057=>834,5058=>604,5059=>632,5060=>605,5061=>1051,5062=>657,5063=>842,5064=>748,5065=>1192,5066=>842,5067=>632,5068=>668,5069=>928,5070=>626,5071=>655,5072=>502,5073=>696,5074=>642,5075=>518,5076=>952,5077=>622,5078=>710,5079=>521,5080=>556,5081=>656,5082=>622,5083=>881,5084=>760,5085=>564,5086=>567,5087=>712,5088=>717,5089=>838,5090=>617,5091=>689,5092=>767,5093=>728,5094=>690,5095=>551,5096=>859,5097=>957,5098=>900,5099=>779,5100=>805,5101=>621,5102=>604,5103=>842,5104=>653,5105=>737,5106=>601,5107=>901,5108=>655,7680=>667,7681=>554,7682=>664,7683=>561,7684=>664,7685=>561,7686=>664,7687=>561,7688=>711,7689=>510,7690=>702,7691=>558,7692=>702,7693=>558,7694=>702,7695=>558,7696=>722,7697=>556,7698=>702,7699=>558,7700=>657,7701=>547,7702=>657,7703=>547,7704=>657,7705=>547,7706=>657,7707=>547,7708=>667,7709=>556,7710=>601,7711=>260,7712=>778,7713=>552,7714=>721,7715=>540,7716=>721,7717=>540,7718=>721,7719=>540,7720=>722,7721=>556,7722=>721,7723=>540,7724=>278,7725=>222,7726=>278,7727=>262,7728=>667,7729=>502,7730=>667,7731=>502,7732=>667,7733=>502,7734=>556,7735=>222,7736=>556,7737=>222,7738=>556,7739=>222,7740=>556,7741=>222,7742=>846,7743=>816,7744=>846,7745=>816,7746=>846,7747=>816,7748=>730,7749=>540,7750=>730,7751=>540,7752=>730,7753=>540,7754=>730,7755=>540,7756=>770,7757=>556,7758=>770,7759=>556,7760=>770,7761=>556,7762=>770,7763=>556,7764=>646,7765=>563,7766=>646,7767=>563,7768=>709,7769=>324,7770=>709,7771=>324,7772=>709,7773=>324,7774=>709,7775=>324,7776=>651,7777=>500,7778=>651,7779=>500,7780=>651,7781=>500,7782=>651,7783=>500,7784=>651,7785=>500,7786=>611,7787=>265,7788=>611,7789=>265,7790=>611,7791=>265,7792=>611,7793=>265,7794=>721,7795=>538,7796=>721,7797=>538,7798=>721,7799=>538,7800=>721,7801=>538,7802=>721,7803=>538,7804=>645,7805=>497,7806=>645,7807=>497,7808=>937,7809=>723,7810=>937,7811=>723,7812=>937,7813=>723,7814=>937,7815=>723,7816=>937,7817=>723,7818=>669,7819=>490,7820=>669,7821=>490,7822=>678,7823=>479,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500,7830=>540,7831=>265,7832=>723,7833=>479,7834=>554,7835=>278,7840=>667,7841=>554,7842=>667,7843=>554,7844=>667,7845=>554,7846=>667,7847=>554,7848=>667,7849=>554,7850=>667,7851=>554,7852=>667,7853=>554,7854=>667,7855=>554,7856=>667,7857=>554,7858=>667,7859=>554,7860=>667,7861=>554,7862=>667,7863=>554,7864=>657,7865=>547,7866=>657,7867=>547,7868=>657,7869=>547,7870=>657,7871=>547,7872=>657,7873=>547,7874=>657,7875=>547,7876=>657,7877=>547,7878=>657,7879=>547,7880=>278,7881=>222,7882=>278,7883=>222,7884=>770,7885=>556,7886=>770,7887=>556,7888=>770,7889=>556,7890=>770,7891=>556,7892=>770,7893=>556,7894=>770,7895=>556,7896=>770,7897=>556,7898=>778,7899=>556,7900=>778,7901=>556,7902=>778,7903=>556,7904=>778,7905=>556,7906=>778,7907=>556,7908=>721,7909=>538,7910=>721,7911=>538,7912=>773,7913=>623,7914=>773,7915=>623,7916=>773,7917=>623,7918=>773,7919=>623,7920=>773,7921=>623,7922=>678,7923=>479,7924=>678,7925=>479,7926=>678,7927=>479,7928=>678,7929=>479,7936=>596,7937=>596,7938=>596,7939=>596,7940=>596,7941=>596,7942=>596,7943=>596,7944=>718,7945=>718,7946=>796,7947=>780,7948=>746,7949=>744,7950=>718,7951=>718,7952=>523,7953=>523,7954=>523,7955=>523,7956=>523,7957=>523,7960=>759,7961=>751,7962=>962,7963=>957,7964=>958,7965=>947,7968=>557,7969=>557,7970=>557,7971=>557,7972=>557,7973=>557,7974=>557,7975=>557,7976=>807,7977=>796,7978=>1013,7979=>1002,7980=>1009,7981=>1000,7982=>882,7983=>919,7984=>293,7985=>293,7986=>361,7987=>382,7988=>347,7989=>329,7990=>352,7991=>347,7992=>353,7993=>348,7994=>555,7995=>557,7996=>557,7997=>545,7998=>435,7999=>448,8000=>561,8001=>561,8002=>561,8003=>561,8004=>561,8005=>561,8008=>792,8009=>801,8010=>1031,8011=>1029,8012=>931,8013=>931,8016=>549,8017=>549,8018=>549,8019=>549,8020=>549,8021=>549,8022=>549,8023=>549,8025=>838,8027=>1004,8029=>1036,8031=>936,8032=>746,8033=>746,8034=>746,8035=>746,8036=>746,8037=>746,8038=>746,8039=>746,8040=>768,8041=>794,8042=>1003,8043=>1002,8044=>922,8045=>918,8046=>871,8047=>893,8048=>596,8049=>596,8050=>523,8051=>523,8052=>557,8053=>557,8054=>293,8055=>293,8056=>561,8057=>561,8058=>549,8059=>549,8060=>746,8061=>746,8064=>596,8065=>596,8066=>596,8067=>596,8068=>596,8069=>596,8070=>596,8071=>596,8072=>859,8073=>861,8074=>948,8075=>928,8076=>886,8077=>895,8078=>865,8079=>864,8080=>557,8081=>557,8082=>557,8083=>557,8084=>557,8085=>557,8086=>557,8087=>557,8088=>890,8089=>894,8090=>1092,8091=>1084,8092=>1095,8093=>1080,8094=>953,8095=>986,8096=>746,8097=>746,8098=>746,8099=>746,8100=>746,8101=>746,8102=>746,8103=>746,8104=>892,8105=>907,8106=>1113,8107=>1095,8108=>1034,8109=>1030,8110=>983,8111=>1002,8112=>596,8113=>596,8114=>596,8115=>596,8116=>593,8118=>596,8119=>596,8120=>765,8121=>765,8122=>765,8123=>765,8124=>861,8125=>147,8126=>201,8127=>147,8128=>278,8129=>333,8130=>557,8131=>557,8132=>595,8134=>557,8135=>557,8136=>835,8137=>849,8138=>895,8139=>861,8140=>786,8141=>602,8142=>601,8143=>333,8144=>335,8145=>322,8146=>357,8147=>336,8150=>340,8151=>320,8152=>300,8153=>298,8154=>439,8155=>408,8157=>434,8158=>433,8159=>333,8160=>549,8161=>549,8162=>549,8163=>549,8164=>551,8165=>551,8166=>549,8167=>549,8168=>733,8169=>733,8170=>794,8171=>832,8172=>739,8173=>333,8174=>624,8175=>303,8178=>746,8179=>746,8180=>725,8182=>746,8183=>746,8184=>889,8185=>828,8186=>836,8187=>811,8188=>867,8189=>333,8190=>159,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>167,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>556,8211=>556,8212=>1000,8213=>1000,8214=>312,8215=>567,8216=>222,8217=>222,8218=>222,8219=>221,8220=>333,8221=>333,8222=>333,8223=>333,8224=>556,8225=>556,8226=>400,8227=>400,8228=>278,8229=>666,8230=>1000,8231=>278,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>167,8240=>1000,8241=>1360,8242=>278,8243=>469,8244=>680,8245=>278,8246=>469,8247=>680,8248=>376,8249=>250,8250=>250,8251=>622,8252=>556,8253=>556,8254=>556,8255=>658,8256=>658,8257=>438,8258=>840,8259=>450,8260=>167,8261=>334,8262=>334,8263=>1082,8264=>834,8265=>834,8266=>556,8267=>537,8268=>537,8269=>537,8270=>389,8271=>278,8272=>658,8273=>389,8274=>634,8275=>500,8276=>658,8277=>1000,8278=>515,8279=>855,8280=>722,8281=>725,8282=>224,8283=>722,8284=>604,8285=>224,8286=>224,8287=>0,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>351,8305=>140,8308=>351,8309=>351,8310=>351,8311=>351,8312=>351,8313=>351,8314=>350,8315=>350,8316=>350,8317=>350,8318=>350,8319=>360,8320=>351,8321=>251,8322=>351,8323=>351,8324=>351,8325=>353,8326=>351,8327=>351,8328=>351,8329=>351,8330=>350,8331=>350,8332=>350,8333=>350,8334=>350,8336=>363,8337=>366,8338=>360,8339=>325,8340=>350,8352=>623,8353=>615,8354=>601,8355=>611,8356=>556,8357=>833,8358=>682,8359=>1205,8360=>1222,8361=>879,8362=>869,8363=>538,8364=>655,8365=>667,8366=>611,8367=>1290,8368=>570,8369=>684,8370=>717,8371=>667,8372=>667,8373=>640,8376=>516,8377=>544,8400=>0,8401=>0,8402=>0,8403=>0,8404=>0,8405=>0,8406=>0,8407=>0,8408=>0,8409=>0,8410=>0,8411=>0,8412=>0,8413=>0,8414=>0,8415=>0,8416=>0,8417=>0,8420=>0,8421=>0,8422=>0,8423=>0,8424=>0,8425=>0,8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8432=>0,8448=>900,8449=>889,8450=>722,8451=>1019,8452=>556,8453=>836,8454=>862,8455=>667,8456=>722,8457=>867,8459=>1139,8460=>615,8461=>647,8462=>540,8463=>572,8464=>829,8465=>606,8466=>900,8467=>481,8468=>747,8469=>722,8470=>934,8471=>882,8472=>600,8473=>667,8474=>778,8475=>850,8476=>699,8477=>722,8478=>834,8479=>722,8480=>1043,8481=>1261,8482=>1000,8483=>667,8484=>611,8486=>768,8487=>744,8488=>512,8489=>286,8490=>722,8491=>722,8492=>908,8493=>623,8494=>547,8495=>469,8496=>662,8497=>895,8498=>556,8499=>1100,8501=>570,8502=>591,8503=>456,8504=>598,8505=>278,8506=>848,8507=>1338,8508=>619,8510=>582,8511=>722,8513=>778,8514=>556,8515=>556,8516=>678,8522=>516,8523=>640,8525=>1160,8526=>435,8531=>869,8532=>869,8533=>869,8534=>869,8535=>839,8536=>849,8537=>869,8538=>849,8539=>849,8540=>849,8541=>869,8542=>869,8543=>869,8544=>278,8545=>556,8546=>834,8547=>945,8548=>645,8549=>945,8550=>1223,8551=>1501,8552=>945,8553=>669,8554=>945,8555=>1223,8556=>556,8557=>710,8558=>702,8559=>846,8560=>222,8561=>444,8562=>666,8563=>722,8564=>497,8565=>722,8566=>944,8567=>1166,8568=>722,8569=>490,8570=>722,8571=>944,8572=>222,8573=>515,8574=>558,8575=>816,8592=>987,8593=>603,8594=>987,8595=>603,8596=>1042,8597=>1042,8598=>800,8599=>800,8600=>800,8601=>800,8612=>987,8613=>680,8614=>987,8615=>680,8617=>987,8618=>987,8628=>700,8629=>658,8636=>987,8637=>987,8638=>440,8639=>440,8640=>987,8641=>987,8642=>440,8643=>440,8644=>987,8645=>863,8646=>990,8647=>987,8648=>1133,8649=>987,8650=>1133,8651=>987,8652=>987,8656=>987,8657=>577,8658=>987,8659=>577,8660=>1042,8661=>1042,8668=>1092,8669=>1092,8704=>697,8705=>676,8706=>556,8707=>667,8708=>667,8709=>802,8710=>712,8711=>712,8712=>584,8713=>584,8714=>585,8715=>584,8716=>584,8717=>585,8718=>500,8719=>783,8720=>783,8721=>771,8722=>584,8723=>584,8724=>584,8725=>947,8726=>392,8727=>584,8728=>497,8729=>584,8730=>662,8731=>662,8732=>662,8733=>713,8734=>713,8735=>639,8736=>768,8737=>768,8738=>600,8739=>200,8740=>288,8741=>320,8742=>340,8743=>608,8744=>608,8745=>768,8746=>768,8747=>465,8748=>725,8749=>965,8756=>800,8757=>800,8758=>250,8759=>620,8760=>584,8761=>778,8762=>584,8763=>500,8764=>500,8770=>584,8771=>584,8773=>584,8776=>500,8778=>584,8779=>500,8800=>584,8801=>584,8804=>584,8805=>584,8960=>823,8976=>584,8994=>658,8995=>658,9001=>390,9002=>390,9251=>500,9674=>489,9675=>800,9702=>400,9711=>882,9824=>626,9825=>694,9826=>595,9827=>776,9828=>626,9829=>694,9830=>595,9831=>776,9833=>333,9834=>556,9835=>722,9836=>722,9837=>415,9838=>377,9839=>402,11568=>352,11569=>872,11570=>872,11571=>720,11572=>720,11573=>720,11574=>544,11575=>709,11576=>709,11577=>720,11578=>720,11579=>596,11580=>698,11581=>742,11582=>574,11583=>742,11584=>872,11585=>872,11586=>292,11587=>696,11588=>696,11589=>720,11590=>544,11591=>724,11592=>756,11593=>600,11594=>672,11595=>888,11596=>836,11597=>524,11598=>720,11599=>260,11600=>836,11601=>224,11602=>678,11603=>380,11604=>872,11605=>872,11606=>720,11607=>268,11608=>640,11609=>872,11610=>872,11611=>770,11612=>424,11613=>720,11614=>770,11615=>720,11616=>709,11617=>720,11618=>541,11619=>828,11620=>454,11621=>828,11631=>442,11798=>584,11799=>333,11800=>556,11802=>333,11803=>500,11806=>500,11807=>500,11816=>464,11817=>464,11818=>660,11819=>623,11820=>623,11821=>660,11822=>556,42888=>333,42889=>276,42890=>342,42891=>194,42892=>194,42922=>830,64256=>494,64257=>471,64258=>474,64259=>659,64260=>654,64261=>530,64275=>1027,64276=>1056,64277=>1058,64278=>1073,64279=>1301,64285=>200,64286=>305,64287=>400,64288=>587,64289=>890,64290=>848,64291=>872,64292=>800,64293=>850,64294=>873,64295=>797,64296=>937,64297=>584,64298=>776,64299=>776,64300=>776,64301=>776,64302=>640,64303=>640,64304=>640,64305=>591,64306=>466,64307=>598,64308=>622,64309=>262,64310=>351,64312=>608,64313=>270,64314=>526,64315=>550,64316=>600,64318=>621,64320=>378,64321=>607,64323=>575,64324=>568,64326=>590,64327=>606,64328=>547,64329=>776,64330=>687,64331=>212,64332=>591,64333=>550,64334=>568,64335=>640,65529=>0,65530=>0,65531=>0,65532=>800,65533=>788,65535=>800);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansi.z
new file mode 100644
index 00000000..3b2d02ab
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freesansi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserif.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserif.ctg.z
new file mode 100644
index 00000000..fef758ff
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserif.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserif.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserif.php
new file mode 100644
index 00000000..7d5f6e64
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserif.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='FreeSerif';
+$up=-125;
+$ut=50;
+$dw=600;
+$diff='';
+$originalsize=3303588;
+$enc='';
+$file='freeserif.z';
+$ctg='freeserif.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-879 -551 1767 936]','ItalicAngle'=>0,'Ascent'=>900,'Descent'=>-200,'Leading'=>100,'CapHeight'=>662,'XHeight'=>450,'StemV'=>70,'StemH'=>30,'AvgWidth'=>618,'MaxWidth'=>1752,'MissingWidth'=>600);
+$cw=array(0=>600,13=>600,32=>250,33=>333,34=>400,35=>500,36=>500,37=>833,38=>778,39=>200,40=>333,41=>333,42=>500,43=>564,44=>250,45=>333,46=>250,47=>296,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>250,59=>250,60=>564,61=>564,62=>564,63=>444,64=>865,65=>721,66=>631,67=>670,68=>719,69=>610,70=>564,71=>722,72=>714,73=>327,74=>385,75=>709,76=>611,77=>881,78=>725,79=>724,80=>576,81=>723,82=>667,83=>529,84=>606,85=>721,86=>701,87=>947,88=>714,89=>701,90=>613,91=>333,92=>296,93=>333,94=>469,95=>500,96=>250,97=>435,98=>500,99=>444,100=>499,101=>444,102=>373,103=>467,104=>498,105=>278,106=>348,107=>513,108=>258,109=>779,110=>489,111=>491,112=>500,113=>499,114=>345,115=>367,116=>283,117=>490,118=>468,119=>683,120=>482,121=>471,122=>417,123=>480,124=>200,125=>480,126=>500,160=>250,161=>333,162=>500,163=>500,164=>500,165=>500,166=>200,167=>500,168=>333,169=>793,170=>276,171=>500,172=>564,173=>333,174=>792,175=>333,176=>400,177=>564,178=>320,179=>320,180=>250,181=>500,182=>483,183=>250,184=>333,185=>320,186=>310,187=>500,188=>730,189=>750,190=>750,191=>444,192=>721,193=>721,194=>721,195=>721,196=>721,197=>721,198=>888,199=>674,200=>610,201=>610,202=>610,203=>610,204=>327,205=>327,206=>327,207=>327,208=>719,209=>725,210=>724,211=>724,212=>724,213=>724,214=>724,215=>564,216=>724,217=>721,218=>721,219=>721,220=>721,221=>701,222=>577,223=>491,224=>435,225=>435,226=>435,227=>435,228=>435,229=>435,230=>639,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278,238=>278,239=>278,240=>492,241=>489,242=>491,243=>491,244=>491,245=>491,246=>491,247=>564,248=>491,249=>490,250=>490,251=>490,252=>490,253=>471,254=>500,255=>471,256=>721,257=>435,258=>721,259=>435,260=>717,261=>437,262=>670,263=>444,264=>670,265=>444,266=>670,267=>444,268=>670,269=>444,270=>719,271=>635,272=>719,273=>498,274=>610,275=>444,276=>610,277=>444,278=>610,279=>444,280=>611,281=>444,282=>610,283=>444,284=>722,285=>467,286=>722,287=>467,288=>722,289=>467,290=>722,291=>467,292=>714,293=>498,294=>711,295=>498,296=>327,297=>278,298=>327,299=>278,300=>327,301=>278,302=>325,303=>278,304=>327,305=>278,306=>699,307=>529,308=>385,309=>348,310=>709,311=>513,312=>503,313=>611,314=>258,315=>611,316=>258,317=>611,318=>390,319=>611,320=>382,321=>606,322=>278,323=>725,324=>489,325=>725,326=>489,327=>725,328=>489,329=>538,330=>701,331=>500,332=>724,333=>491,334=>724,335=>491,336=>724,337=>491,338=>900,339=>705,340=>667,341=>345,342=>667,343=>345,344=>667,345=>345,346=>529,347=>367,348=>529,349=>367,350=>549,351=>367,352=>529,353=>367,354=>596,355=>283,356=>606,357=>410,358=>596,359=>283,360=>721,361=>490,362=>721,363=>490,364=>721,365=>490,366=>721,367=>490,368=>721,369=>490,370=>711,371=>501,372=>947,373=>683,374=>701,375=>471,376=>701,377=>613,378=>417,379=>613,380=>417,381=>613,382=>417,383=>373,384=>504,385=>737,386=>624,387=>513,388=>641,389=>515,390=>670,391=>813,392=>554,393=>719,394=>830,395=>582,396=>511,397=>496,398=>610,399=>711,400=>525,401=>629,402=>460,403=>819,404=>650,405=>735,406=>333,407=>336,408=>776,409=>513,410=>286,411=>470,412=>951,413=>798,414=>495,415=>724,416=>723,417=>536,418=>1038,419=>774,420=>692,421=>495,422=>674,423=>549,424=>367,425=>603,426=>592,427=>289,428=>622,429=>376,430=>596,431=>783,432=>545,433=>723,434=>724,435=>801,436=>570,437=>617,438=>416,439=>531,440=>537,441=>396,442=>389,443=>500,444=>604,445=>439,446=>389,447=>502,448=>190,449=>350,450=>600,451=>333,452=>1333,453=>1166,454=>944,455=>1000,456=>889,457=>546,458=>1111,459=>1000,460=>778,461=>721,462=>435,463=>327,464=>278,465=>724,466=>491,467=>721,468=>490,469=>721,470=>490,471=>721,472=>490,473=>722,474=>490,475=>721,476=>490,477=>444,478=>721,479=>435,480=>721,481=>435,482=>888,483=>639,484=>722,485=>490,486=>722,487=>467,488=>709,489=>513,490=>722,491=>491,492=>722,493=>491,494=>531,495=>387,496=>348,497=>1333,498=>1166,499=>944,500=>722,501=>467,502=>1001,503=>552,504=>725,505=>489,506=>722,507=>435,508=>888,509=>639,510=>724,511=>491,512=>721,513=>435,514=>721,515=>435,516=>610,517=>444,518=>610,519=>444,520=>327,521=>278,522=>327,523=>278,524=>724,525=>491,526=>724,527=>491,528=>667,529=>345,530=>667,531=>345,532=>721,533=>490,534=>721,535=>490,536=>529,537=>367,538=>606,539=>283,540=>435,541=>426,542=>714,543=>498,544=>715,545=>588,546=>555,547=>458,548=>611,549=>444,550=>721,551=>435,552=>611,553=>444,554=>724,555=>491,556=>724,557=>491,558=>724,559=>491,560=>724,561=>491,562=>701,563=>471,564=>407,565=>597,566=>379,567=>348,568=>771,569=>762,570=>721,571=>674,572=>434,573=>612,574=>596,575=>377,576=>444,577=>418,578=>418,579=>628,580=>720,581=>701,582=>610,583=>444,584=>385,585=>358,586=>760,587=>559,588=>667,589=>345,590=>701,591=>490,592=>435,593=>498,594=>498,595=>493,596=>434,597=>444,598=>551,599=>569,600=>444,601=>444,602=>703,603=>403,604=>403,605=>641,606=>422,607=>353,608=>572,609=>501,610=>521,611=>494,612=>567,613=>498,614=>498,615=>501,616=>285,617=>306,618=>275,619=>340,620=>354,621=>364,622=>553,623=>779,624=>779,625=>772,626=>544,627=>547,628=>549,629=>491,630=>652,631=>661,632=>624,633=>345,634=>345,635=>443,636=>345,637=>344,638=>379,639=>374,640=>489,641=>484,642=>377,643=>360,644=>360,645=>360,646=>451,647=>281,648=>330,649=>512,650=>504,651=>485,652=>468,653=>683,654=>471,655=>485,656=>583,657=>428,658=>387,659=>409,660=>418,661=>408,662=>408,663=>454,664=>724,665=>468,666=>422,667=>587,668=>540,669=>343,670=>513,671=>449,672=>573,673=>408,674=>408,675=>784,676=>794,677=>801,678=>550,679=>493,680=>675,681=>752,682=>553,683=>543,684=>477,685=>500,686=>612,687=>667,688=>332,689=>333,690=>232,691=>228,692=>228,693=>305,694=>321,695=>463,696=>322,697=>250,698=>408,699=>200,700=>200,701=>200,702=>250,703=>250,704=>258,705=>258,706=>333,707=>333,708=>333,709=>333,710=>333,711=>333,712=>250,713=>333,714=>250,715=>250,716=>250,717=>333,718=>250,719=>250,720=>250,721=>250,722=>250,723=>250,724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333,731=>333,732=>333,733=>333,734=>336,735=>352,736=>331,737=>187,738=>263,739=>332,740=>300,741=>460,742=>460,743=>460,744=>460,745=>460,746=>477,747=>475,748=>339,749=>333,750=>400,751=>333,752=>333,753=>333,754=>333,755=>333,756=>250,757=>437,758=>437,759=>333,760=>250,761=>200,762=>200,763=>200,764=>200,765=>333,766=>333,767=>333,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>332,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0,875=>0,876=>0,877=>0,878=>0,879=>0,880=>535,881=>433,882=>537,883=>497,884=>199,885=>199,886=>722,887=>590,890=>332,891=>485,892=>485,893=>485,894=>250,900=>267,901=>333,902=>721,903=>250,904=>800,905=>902,906=>507,908=>818,910=>861,911=>871,912=>286,913=>721,914=>631,915=>569,916=>660,917=>610,918=>613,919=>714,920=>754,921=>327,922=>709,923=>721,924=>881,925=>725,926=>590,927=>724,928=>713,929=>576,931=>603,932=>606,933=>666,934=>760,935=>714,936=>788,937=>723,938=>327,939=>666,940=>583,941=>426,942=>536,943=>286,944=>514,945=>583,946=>527,947=>480,948=>534,949=>426,950=>466,951=>536,952=>534,953=>286,954=>544,955=>476,956=>536,957=>480,958=>514,959=>491,960=>587,961=>528,962=>452,963=>537,964=>420,965=>514,966=>643,967=>480,968=>693,969=>693,970=>286,971=>514,972=>491,973=>514,974=>693,975=>671,976=>534,977=>587,978=>627,979=>803,980=>627,981=>640,982=>684,983=>534,984=>576,985=>500,986=>602,987=>426,988=>559,989=>445,990=>656,991=>400,992=>721,993=>570,994=>962,995=>673,996=>592,997=>522,998=>580,999=>460,1000=>500,1001=>338,1002=>842,1003=>593,1004=>564,1005=>412,1006=>634,1007=>447,1008=>534,1009=>534,1010=>485,1011=>348,1012=>724,1013=>361,1014=>361,1015=>577,1016=>537,1017=>674,1018=>889,1019=>709,1020=>534,1021=>668,1022=>675,1023=>668,1024=>610,1025=>610,1026=>747,1027=>564,1028=>660,1029=>549,1030=>327,1031=>327,1032=>380,1033=>948,1034=>985,1035=>821,1036=>664,1037=>713,1038=>709,1039=>713,1040=>711,1041=>576,1042=>626,1043=>564,1044=>639,1045=>610,1046=>937,1047=>585,1048=>713,1049=>713,1050=>664,1051=>681,1052=>881,1053=>713,1054=>724,1055=>713,1056=>576,1057=>670,1058=>606,1059=>709,1060=>760,1061=>714,1062=>717,1063=>672,1064=>974,1065=>982,1066=>724,1067=>852,1068=>576,1069=>660,1070=>962,1071=>643,1072=>435,1073=>495,1074=>468,1075=>388,1076=>490,1077=>436,1078=>662,1079=>401,1080=>524,1081=>524,1082=>498,1083=>490,1084=>632,1085=>524,1086=>491,1087=>524,1088=>500,1089=>424,1090=>422,1091=>471,1092=>694,1093=>482,1094=>524,1095=>504,1096=>756,1097=>756,1098=>505,1099=>624,1100=>431,1101=>432,1102=>664,1103=>492,1104=>434,1105=>434,1106=>479,1107=>388,1108=>432,1109=>367,1110=>269,1111=>278,1112=>348,1113=>677,1114=>711,1115=>514,1116=>498,1117=>524,1118=>471,1119=>524,1120=>988,1121=>664,1122=>723,1123=>506,1124=>941,1125=>647,1126=>901,1127=>635,1128=>1245,1129=>894,1130=>937,1131=>654,1132=>1278,1133=>907,1134=>519,1135=>378,1136=>868,1137=>694,1138=>724,1139=>491,1140=>770,1141=>550,1142=>770,1143=>550,1144=>1151,1145=>885,1146=>879,1147=>611,1148=>988,1149=>664,1150=>988,1151=>664,1152=>602,1153=>428,1154=>232,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>713,1163=>522,1164=>576,1165=>430,1166=>575,1167=>511,1168=>559,1169=>397,1170=>571,1171=>392,1172=>619,1173=>462,1174=>983,1175=>682,1176=>587,1177=>401,1178=>683,1179=>516,1180=>708,1181=>531,1182=>664,1183=>494,1184=>811,1185=>568,1186=>717,1187=>519,1188=>921,1189=>647,1190=>1025,1191=>721,1192=>751,1193=>516,1194=>660,1195=>424,1196=>606,1197=>452,1198=>701,1199=>563,1200=>701,1201=>563,1202=>765,1203=>518,1204=>958,1205=>692,1206=>676,1207=>505,1208=>716,1209=>538,1210=>672,1211=>508,1212=>859,1213=>553,1214=>858,1215=>553,1216=>327,1217=>937,1218=>662,1219=>613,1220=>441,1221=>681,1222=>489,1223=>713,1224=>497,1225=>713,1226=>545,1227=>672,1228=>504,1229=>881,1230=>630,1231=>327,1232=>711,1233=>435,1234=>711,1235=>435,1236=>883,1237=>639,1238=>610,1239=>436,1240=>711,1241=>436,1242=>711,1243=>436,1244=>937,1245=>662,1246=>585,1247=>401,1248=>531,1249=>366,1250=>713,1251=>524,1252=>713,1253=>524,1254=>724,1255=>491,1256=>724,1257=>491,1258=>724,1259=>491,1260=>660,1261=>432,1262=>709,1263=>471,1264=>709,1265=>471,1266=>709,1267=>471,1268=>672,1269=>504,1270=>559,1271=>383,1272=>852,1273=>624,1274=>559,1275=>386,1276=>706,1277=>436,1278=>714,1279=>492,1280=>576,1281=>504,1282=>908,1283=>634,1284=>803,1285=>518,1286=>553,1287=>471,1288=>931,1289=>637,1290=>964,1291=>682,1292=>725,1293=>433,1294=>705,1295=>499,1296=>523,1297=>407,1298=>681,1299=>489,1300=>941,1301=>644,1302=>820,1303=>697,1304=>949,1305=>748,1306=>723,1307=>505,1308=>947,1309=>693,1310=>664,1311=>497,1312=>992,1313=>710,1314=>1029,1315=>741,1316=>719,1317=>520,1318=>678,1319=>505,1329=>794,1330=>712,1331=>782,1332=>854,1333=>711,1334=>702,1335=>707,1336=>655,1337=>777,1338=>782,1339=>710,1340=>663,1341=>830,1342=>917,1343=>672,1344=>469,1345=>666,1346=>858,1347=>685,1348=>856,1349=>618,1350=>858,1351=>709,1352=>719,1353=>714,1354=>731,1355=>702,1356=>874,1357=>719,1358=>844,1359=>519,1360=>703,1361=>608,1362=>586,1363=>750,1364=>780,1365=>714,1366=>684,1369=>120,1370=>120,1371=>269,1372=>307,1373=>241,1374=>312,1375=>300,1377=>786,1378=>506,1379=>542,1380=>541,1381=>506,1382=>503,1383=>478,1384=>499,1385=>541,1386=>539,1387=>508,1388=>289,1389=>750,1390=>540,1391=>513,1392=>508,1393=>503,1394=>531,1395=>518,1396=>500,1397=>243,1398=>473,1399=>406,1400=>499,1401=>407,1402=>793,1403=>414,1404=>463,1405=>500,1406=>516,1407=>758,1408=>504,1409=>466,1410=>288,1411=>758,1412=>510,1413=>501,1414=>562,1415=>543,1417=>278,1418=>280,1423=>754,1425=>0,1426=>0,1427=>0,1428=>0,1429=>0,1430=>0,1431=>0,1432=>0,1433=>0,1434=>0,1435=>0,1436=>0,1437=>0,1438=>0,1439=>0,1440=>0,1441=>0,1442=>0,1443=>0,1444=>0,1445=>0,1446=>0,1447=>0,1448=>0,1449=>0,1450=>0,1451=>0,1452=>0,1453=>0,1454=>0,1455=>0,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>370,1471=>0,1472=>126,1473=>0,1474=>0,1475=>346,1476=>0,1477=>0,1478=>350,1479=>0,1488=>537,1489=>537,1490=>350,1491=>537,1492=>537,1493=>350,1494=>350,1495=>537,1496=>537,1497=>320,1498=>537,1499=>537,1500=>537,1501=>537,1502=>537,1503=>310,1504=>350,1505=>537,1506=>537,1507=>537,1508=>537,1509=>537,1510=>537,1511=>537,1512=>537,1513=>537,1514=>537,1520=>583,1521=>563,1522=>537,1523=>396,1524=>396,1536=>600,1537=>1000,1538=>800,1539=>800,1542=>549,1543=>549,1544=>724,1545=>599,1546=>729,1547=>626,1548=>246,1549=>344,1550=>640,1551=>686,1552=>0,1553=>0,1554=>0,1555=>0,1556=>0,1557=>0,1558=>0,1559=>0,1560=>0,1561=>0,1562=>0,1563=>250,1566=>374,1567=>444,1568=>672,1569=>350,1570=>245,1571=>229,1572=>329,1573=>229,1574=>672,1575=>229,1576=>877,1577=>416,1578=>877,1579=>877,1580=>598,1581=>598,1582=>598,1583=>348,1584=>348,1585=>345,1586=>345,1587=>901,1588=>901,1589=>909,1590=>909,1591=>568,1592=>568,1593=>591,1594=>591,1595=>902,1596=>902,1597=>672,1598=>672,1599=>672,1600=>200,1601=>858,1602=>626,1603=>486,1604=>598,1605=>475,1606=>585,1607=>372,1608=>329,1609=>672,1610=>672,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1622=>0,1623=>0,1624=>0,1625=>0,1626=>0,1627=>0,1628=>0,1629=>0,1630=>0,1631=>0,1632=>500,1633=>500,1634=>500,1635=>500,1636=>500,1637=>500,1638=>500,1639=>500,1640=>500,1641=>500,1642=>440,1643=>212,1644=>235,1645=>471,1646=>877,1647=>626,1648=>0,1649=>229,1650=>229,1651=>229,1652=>300,1653=>326,1654=>442,1655=>482,1656=>792,1657=>877,1658=>877,1659=>877,1660=>877,1661=>877,1662=>877,1663=>877,1664=>877,1665=>598,1666=>598,1667=>598,1668=>598,1669=>598,1670=>598,1671=>598,1672=>348,1673=>348,1674=>348,1675=>348,1676=>348,1677=>348,1678=>348,1679=>348,1680=>348,1681=>345,1682=>345,1683=>345,1684=>345,1685=>492,1686=>345,1687=>345,1688=>345,1689=>345,1690=>901,1691=>901,1692=>901,1693=>909,1694=>909,1695=>568,1696=>591,1697=>858,1698=>858,1699=>858,1700=>858,1701=>858,1702=>858,1703=>626,1704=>626,1705=>902,1706=>1108,1707=>902,1708=>486,1709=>486,1710=>486,1711=>902,1712=>902,1713=>902,1714=>902,1715=>902,1716=>902,1717=>598,1718=>598,1719=>598,1720=>598,1721=>585,1722=>585,1723=>585,1724=>585,1725=>585,1726=>446,1727=>598,1728=>372,1729=>372,1730=>372,1731=>372,1732=>329,1733=>329,1734=>329,1735=>329,1736=>329,1737=>329,1738=>329,1739=>329,1740=>672,1741=>728,1742=>672,1743=>329,1744=>672,1745=>672,1746=>710,1747=>710,1748=>395,1749=>372,1750=>0,1751=>0,1752=>0,1753=>0,1754=>0,1755=>0,1756=>0,1757=>1132,1758=>970,1759=>0,1760=>0,1761=>0,1762=>0,1763=>0,1764=>301,1765=>250,1766=>400,1767=>0,1768=>0,1769=>760,1770=>0,1771=>0,1772=>0,1773=>0,1774=>348,1775=>345,1776=>500,1777=>501,1778=>500,1779=>500,1780=>500,1781=>500,1782=>500,1783=>500,1784=>500,1785=>500,1786=>901,1787=>909,1788=>591,1789=>300,1790=>246,1791=>446,1872=>877,1873=>877,1874=>877,1875=>877,1876=>877,1877=>877,1878=>877,1879=>598,1880=>598,1881=>348,1882=>348,1883=>345,1884=>901,1885=>591,1886=>591,1887=>591,1888=>858,1889=>858,1890=>902,1891=>902,1892=>902,1893=>475,1894=>475,1895=>585,1896=>585,1897=>585,1898=>678,1899=>345,1900=>345,1901=>901,1902=>598,1903=>598,1904=>901,1905=>345,1906=>598,1907=>229,1908=>229,1909=>672,1910=>672,1911=>753,1912=>329,1913=>329,1914=>710,1915=>710,1916=>598,1917=>901,1918=>901,1919=>486,1920=>450,1921=>501,1922=>582,1923=>544,1924=>482,1925=>433,1926=>448,1927=>462,1928=>474,1929=>471,1930=>469,1931=>537,1932=>499,1933=>514,1934=>471,1935=>572,1936=>880,1937=>440,1938=>476,1939=>594,1940=>469,1941=>448,1942=>441,1943=>519,1944=>573,1945=>459,1946=>447,1947=>496,1948=>541,1949=>887,1950=>883,1951=>964,1952=>558,1953=>505,1954=>471,1955=>554,1956=>459,1957=>486,1958=>36,1959=>36,1960=>43,1961=>45,1962=>43,1963=>45,1964=>45,1965=>45,1966=>45,1967=>45,1968=>0,1969=>406,2304=>0,2305=>0,2306=>0,2307=>398,2308=>861,2309=>861,2310=>1070,2311=>553,2312=>553,2313=>597,2314=>848,2315=>967,2316=>828,2317=>654,2318=>654,2319=>654,2320=>654,2321=>1070,2322=>1070,2323=>1070,2324=>1070,2325=>743,2326=>797,2327=>694,2328=>694,2329=>730,2330=>734,2331=>887,2332=>813,2333=>833,2334=>734,2335=>628,2336=>628,2337=>652,2338=>608,2339=>694,2340=>654,2341=>694,2342=>588,2343=>694,2344=>654,2345=>654,2346=>614,2347=>788,2348=>621,2349=>694,2350=>694,2351=>694,2352=>494,2353=>494,2354=>787,2355=>847,2356=>847,2357=>621,2358=>787,2359=>614,2360=>734,2361=>608,2362=>341,2363=>341,2364=>0,2365=>569,2366=>341,2367=>341,2368=>341,2369=>0,2370=>0,2371=>0,2372=>0,2373=>0,2374=>0,2375=>0,2376=>0,2377=>341,2378=>341,2379=>341,2380=>341,2381=>0,2382=>420,2383=>226,2384=>1047,2385=>0,2386=>0,2387=>0,2388=>0,2389=>0,2390=>0,2391=>0,2392=>743,2393=>797,2394=>694,2395=>813,2396=>652,2397=>608,2398=>788,2399=>694,2400=>967,2401=>827,2402=>0,2403=>0,2404=>450,2405=>644,2406=>455,2407=>419,2408=>569,2409=>509,2410=>701,2411=>628,2412=>569,2413=>701,2414=>608,2415=>608,2416=>455,2417=>398,2418=>861,2419=>861,2420=>1040,2421=>1040,2422=>861,2423=>861,2425=>813,2426=>694,2427=>654,2428=>814,2429=>569,2430=>730,2431=>621,2433=>0,2434=>300,2435=>312,2437=>594,2438=>776,2439=>469,2440=>513,2441=>535,2442=>561,2443=>604,2444=>481,2447=>580,2448=>604,2451=>540,2452=>620,2453=>570,2454=>485,2455=>484,2456=>471,2457=>457,2458=>408,2459=>452,2460=>591,2461=>551,2462=>771,2463=>414,2464=>404,2465=>522,2466=>415,2467=>450,2468=>551,2469=>477,2470=>478,2471=>449,2472=>448,2474=>535,2475=>611,2476=>443,2477=>534,2478=>492,2479=>474,2480=>442,2482=>542,2486=>507,2487=>467,2488=>523,2489=>419,2492=>0,2493=>419,2494=>202,2495=>189,2496=>202,2497=>0,2498=>0,2499=>0,2500=>0,2503=>294,2504=>289,2507=>774,2508=>825,2509=>0,2510=>356,2519=>219,2524=>523,2525=>420,2527=>469,2528=>604,2529=>481,2530=>0,2531=>0,2534=>500,2535=>437,2536=>479,2537=>507,2538=>497,2539=>500,2540=>482,2541=>503,2542=>517,2543=>481,2544=>443,2545=>443,2546=>429,2547=>383,2548=>432,2549=>478,2550=>539,2551=>158,2552=>365,2553=>280,2554=>357,2555=>344,2561=>0,2562=>0,2563=>385,2565=>781,2566=>982,2567=>789,2568=>860,2569=>559,2570=>559,2575=>589,2576=>781,2579=>559,2580=>781,2581=>538,2582=>650,2583=>650,2584=>781,2585=>589,2586=>589,2587=>699,2588=>650,2589=>589,2590=>589,2591=>589,2592=>589,2593=>559,2594=>589,2595=>589,2596=>559,2597=>650,2598=>589,2599=>650,2600=>626,2602=>650,2603=>570,2604=>650,2605=>559,2606=>650,2607=>781,2608=>490,2610=>626,2611=>626,2613=>589,2614=>650,2616=>650,2617=>490,2620=>0,2622=>320,2623=>260,2624=>320,2625=>0,2626=>0,2631=>0,2632=>0,2635=>0,2636=>0,2637=>0,2641=>0,2649=>650,2650=>650,2651=>650,2652=>559,2654=>570,2662=>420,2663=>350,2664=>490,2665=>434,2666=>574,2667=>455,2668=>452,2669=>490,2670=>504,2671=>504,2672=>0,2673=>0,2674=>589,2675=>559,2676=>808,2677=>0,2689=>0,2690=>0,2691=>287,2693=>1055,2694=>1272,2695=>643,2696=>772,2697=>756,2698=>1034,2699=>971,2700=>885,2701=>1055,2703=>1055,2704=>1055,2705=>1272,2707=>1272,2708=>1272,2709=>706,2710=>822,2711=>730,2712=>653,2713=>636,2714=>800,2715=>773,2716=>946,2717=>954,2718=>834,2719=>582,2720=>582,2721=>549,2722=>497,2723=>872,2724=>663,2725=>767,2726=>559,2727=>600,2728=>745,2730=>649,2731=>714,2732=>803,2733=>800,2734=>706,2735=>819,2736=>517,2738=>756,2739=>780,2741=>623,2742=>771,2743=>559,2744=>810,2745=>711,2748=>0,2749=>497,2750=>245,2751=>226,2752=>286,2753=>0,2754=>0,2755=>0,2756=>0,2757=>0,2759=>0,2760=>0,2761=>258,2763=>250,2764=>257,2765=>0,2768=>1078,2784=>1071,2785=>841,2786=>0,2787=>0,2790=>602,2791=>490,2792=>587,2793=>666,2794=>620,2795=>657,2796=>560,2797=>695,2798=>550,2799=>592,2800=>362,2801=>805,2817=>0,2818=>257,2819=>389,2821=>789,2822=>968,2823=>832,2824=>863,2825=>833,2826=>852,2827=>807,2828=>600,2831=>703,2832=>1000,2835=>689,2836=>959,2837=>739,2838=>748,2839=>768,2840=>775,2841=>828,2842=>711,2843=>634,2844=>691,2845=>679,2846=>624,2847=>693,2848=>667,2849=>741,2850=>692,2851=>756,2852=>713,2853=>748,2854=>688,2855=>677,2856=>689,2858=>748,2859=>960,2860=>682,2861=>787,2862=>748,2863=>808,2864=>758,2866=>870,2867=>722,2869=>676,2870=>744,2871=>738,2872=>652,2873=>583,2876=>0,2877=>366,2878=>228,2879=>0,2880=>218,2881=>0,2882=>0,2883=>0,2884=>0,2887=>501,2888=>1137,2891=>1322,2892=>1318,2893=>0,2902=>0,2903=>201,2908=>741,2909=>692,2911=>825,2912=>785,2913=>700,2914=>0,2915=>0,2918=>724,2919=>521,2920=>498,2921=>786,2922=>641,2923=>624,2924=>628,2925=>612,2926=>522,2927=>497,2928=>636,2929=>755,2930=>228,2931=>440,2932=>650,2933=>741,2934=>787,2935=>782,2946=>0,2947=>616,2949=>910,2950=>1072,2951=>848,2952=>591,2953=>492,2954=>1123,2958=>602,2959=>602,2960=>691,2962=>753,2963=>753,2964=>1597,2965=>686,2969=>727,2970=>607,2972=>700,2974=>879,2975=>589,2979=>1230,2980=>697,2984=>569,2985=>911,2986=>507,2990=>634,2991=>702,2992=>452,2993=>573,2994=>661,2995=>804,2996=>655,2997=>770,2998=>794,2999=>873,3000=>880,3001=>1102,3006=>452,3007=>176,3008=>0,3009=>404,3010=>641,3014=>690,3015=>500,3016=>848,3018=>1159,3019=>1000,3020=>1488,3021=>0,3024=>763,3031=>844,3046=>500,3047=>686,3048=>829,3049=>673,3050=>793,3051=>829,3052=>841,3053=>602,3054=>910,3055=>797,3056=>587,3057=>697,3058=>878,3059=>609,3060=>833,3061=>1549,3062=>664,3063=>978,3064=>1325,3065=>825,3066=>711,3330=>417,3331=>221,3333=>1055,3334=>1195,3335=>792,3336=>1469,3337=>570,3338=>1244,3339=>676,3340=>897,3342=>1008,3343=>1008,3344=>1538,3346=>586,3347=>981,3348=>1254,3349=>776,3350=>798,3351=>691,3352=>1095,3353=>811,3354=>728,3355=>963,3356=>704,3357=>1245,3358=>1106,3359=>466,3360=>531,3361=>984,3362=>1028,3363=>1102,3364=>780,3365=>732,3366=>485,3367=>737,3368=>747,3369=>747,3370=>780,3371=>962,3372=>1023,3373=>500,3374=>511,3375=>792,3376=>530,3377=>512,3378=>712,3379=>556,3380=>519,3381=>716,3382=>786,3383=>921,3384=>977,3385=>978,3386=>780,3389=>375,3390=>403,3391=>199,3392=>190,3393=>275,3394=>258,3395=>378,3396=>378,3398=>542,3399=>478,3400=>1070,3402=>0,3403=>0,3404=>0,3405=>89,3406=>221,3415=>677,3424=>676,3425=>1006,3426=>0,3427=>0,3430=>559,3431=>660,3432=>674,3433=>933,3434=>671,3435=>699,3436=>704,3437=>694,3438=>678,3439=>684,3440=>981,3441=>742,3442=>1056,3443=>660,3444=>664,3445=>870,3449=>864,3450=>1137,3451=>776,3452=>534,3453=>860,3454=>780,3455=>866,3458=>254,3459=>254,3461=>616,3462=>922,3463=>908,3464=>907,3465=>626,3466=>615,3467=>763,3468=>1109,3469=>1019,3470=>1311,3471=>1050,3472=>1477,3473=>677,3474=>746,3475=>1314,3476=>741,3477=>741,3478=>1170,3482=>894,3483=>715,3484=>715,3485=>719,3486=>741,3487=>834,3488=>719,3489=>677,3490=>677,3491=>1302,3492=>1005,3493=>919,3494=>677,3495=>719,3496=>677,3497=>741,3498=>677,3499=>1123,3500=>743,3501=>779,3502=>677,3503=>444,3504=>741,3505=>921,3507=>444,3508=>677,3509=>677,3510=>715,3511=>787,3512=>719,3513=>741,3514=>719,3515=>604,3517=>763,3520=>719,3521=>715,3522=>677,3523=>719,3524=>787,3525=>763,3526=>677,3530=>0,3535=>329,3536=>319,3537=>319,3538=>0,3539=>0,3540=>0,3542=>0,3544=>329,3545=>691,3546=>1062,3547=>1333,3548=>1278,3549=>1235,3550=>1292,3551=>461,3570=>680,3571=>481,3572=>948,3585=>532,3586=>472,3587=>534,3588=>532,3589=>544,3590=>583,3591=>417,3592=>488,3593=>604,3594=>472,3595=>534,3596=>716,3597=>717,3598=>568,3599=>568,3600=>457,3601=>637,3602=>731,3603=>790,3604=>531,3605=>542,3606=>522,3607=>577,3608=>468,3609=>603,3610=>554,3611=>554,3612=>556,3613=>556,3614=>604,3615=>604,3616=>568,3617=>542,3618=>496,3619=>442,3620=>530,3621=>512,3622=>568,3623=>478,3624=>543,3625=>614,3626=>525,3627=>578,3628=>659,3629=>514,3630=>514,3631=>450,3632=>402,3633=>0,3634=>378,3635=>415,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0,3647=>620,3648=>286,3649=>521,3650=>447,3651=>426,3652=>424,3653=>333,3654=>453,3655=>0,3656=>0,3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0,3663=>657,3664=>528,3665=>528,3666=>571,3667=>594,3668=>631,3669=>632,3670=>478,3671=>713,3672=>597,3673=>565,3674=>615,3675=>1381,4256=>453,4257=>448,4258=>546,4259=>619,4260=>478,4261=>481,4262=>459,4263=>707,4264=>467,4265=>471,4266=>855,4267=>464,4268=>443,4269=>707,4270=>460,4271=>465,4272=>686,4273=>440,4274=>550,4275=>561,4276=>580,4277=>467,4278=>630,4279=>466,4280=>517,4281=>456,4282=>502,4283=>464,4284=>534,4285=>440,4286=>443,4287=>522,4288=>460,4289=>463,4290=>536,4291=>455,4292=>468,4293=>449,4304=>454,4305=>452,4306=>544,4307=>629,4308=>451,4309=>452,4310=>452,4311=>702,4312=>451,4313=>452,4314=>820,4315=>451,4316=>453,4317=>695,4318=>449,4319=>448,4320=>694,4321=>501,4322=>544,4323=>518,4324=>560,4325=>450,4326=>627,4327=>452,4328=>490,4329=>452,4330=>485,4331=>452,4332=>485,4333=>443,4334=>500,4335=>582,4336=>455,4337=>451,4338=>482,4339=>414,4340=>453,4341=>418,4342=>741,4343=>452,4344=>452,4345=>544,4346=>454,4347=>410,4348=>339,4608=>583,4609=>770,4610=>560,4611=>525,4612=>525,4613=>583,4614=>758,4616=>598,4617=>787,4618=>817,4619=>583,4620=>758,4621=>612,4622=>875,4623=>817,4624=>817,4625=>1050,4626=>1050,4627=>817,4628=>1050,4629=>817,4630=>787,4631=>1021,4632=>933,4633=>1137,4634=>1067,4635=>980,4636=>1065,4637=>962,4638=>962,4639=>1097,4640=>831,4641=>1021,4642=>851,4643=>735,4644=>875,4645=>968,4646=>817,4647=>881,4648=>583,4649=>642,4650=>583,4651=>758,4652=>700,4653=>583,4654=>700,4655=>758,4656=>583,4657=>787,4658=>787,4659=>583,4660=>729,4661=>583,4662=>583,4663=>817,4664=>642,4665=>817,4666=>846,4667=>642,4668=>758,4669=>744,4670=>642,4671=>817,4672=>700,4673=>700,4674=>700,4675=>758,4676=>700,4677=>700,4678=>729,4680=>846,4682=>1079,4683=>700,4684=>700,4685=>1021,4688=>700,4689=>700,4690=>700,4691=>758,4692=>700,4693=>758,4694=>729,4696=>846,4698=>1079,4699=>700,4700=>700,4701=>1021,4704=>525,4705=>758,4706=>758,4707=>525,4708=>700,4709=>773,4710=>525,4711=>787,4712=>525,4713=>758,4714=>758,4715=>525,4716=>700,4717=>773,4718=>525,4719=>525,4720=>729,4721=>729,4722=>729,4723=>802,4724=>729,4725=>729,4726=>758,4727=>729,4728=>758,4729=>758,4730=>758,4731=>817,4732=>758,4733=>817,4734=>758,4735=>758,4736=>612,4737=>817,4738=>817,4739=>612,4740=>787,4741=>583,4742=>875,4744=>962,4746=>992,4747=>700,4748=>758,4749=>904,4752=>408,4753=>583,4754=>525,4755=>554,4756=>481,4757=>554,4758=>642,4759=>671,4760=>700,4761=>758,4762=>729,4763=>700,4764=>671,4765=>700,4766=>758,4767=>700,4768=>583,4769=>735,4770=>822,4771=>583,4772=>793,4773=>583,4774=>583,4775=>694,4776=>554,4777=>729,4778=>773,4779=>554,4780=>700,4781=>554,4782=>554,4784=>992,4786=>1021,4787=>671,4788=>787,4789=>904,4792=>729,4793=>904,4794=>948,4795=>729,4796=>875,4797=>729,4798=>729,4800=>1137,4802=>1167,4803=>758,4804=>875,4805=>1108,4808=>758,4809=>875,4810=>700,4811=>700,4812=>700,4813=>992,4814=>758,4816=>554,4817=>787,4818=>758,4819=>583,4820=>758,4821=>496,4822=>612,4824=>525,4825=>700,4826=>700,4827=>525,4828=>685,4829=>729,4830=>510,4831=>729,4832=>962,4833=>962,4834=>962,4835=>962,4836=>962,4837=>1021,4838=>962,4839=>962,4840=>467,4841=>525,4842=>671,4843=>612,4844=>612,4845=>671,4846=>671,4848=>612,4849=>875,4850=>817,4851=>642,4852=>729,4853=>729,4854=>758,4855=>817,4856=>700,4857=>758,4858=>715,4859=>700,4860=>700,4861=>787,4862=>758,4863=>700,4864=>700,4865=>758,4866=>715,4867=>700,4868=>700,4869=>787,4870=>758,4871=>700,4872=>467,4873=>671,4874=>671,4875=>612,4876=>612,4877=>583,4878=>525,4880=>846,4882=>904,4883=>554,4884=>700,4885=>817,4888=>525,4889=>729,4890=>729,4891=>612,4892=>671,4893=>583,4894=>525,4896=>817,4897=>1021,4898=>1021,4899=>817,4900=>992,4901=>758,4902=>817,4903=>1021,4904=>1079,4905=>1137,4906=>1137,4907=>1050,4908=>1312,4909=>1050,4910=>1050,4911=>1123,4912=>647,4913=>793,4914=>822,4915=>647,4916=>793,4917=>764,4918=>583,4919=>647,4920=>583,4921=>793,4922=>822,4923=>583,4924=>793,4925=>764,4926=>583,4927=>793,4928=>540,4929=>758,4930=>583,4931=>467,4932=>583,4933=>481,4934=>612,4936=>758,4937=>700,4938=>758,4939=>700,4940=>831,4941=>671,4942=>758,4943=>700,4944=>758,4945=>758,4946=>758,4947=>817,4948=>758,4949=>758,4950=>817,4951=>758,4952=>642,4953=>980,4954=>758,4961=>233,4962=>583,4963=>408,4964=>408,4965=>525,4966=>525,4967=>233,4968=>700,4969=>671,4970=>612,4971=>642,4972=>642,4973=>642,4974=>583,4975=>700,4976=>758,4977=>642,4978=>583,4979=>700,4980=>729,4981=>720,4982=>583,4983=>758,4984=>700,4985=>904,4986=>612,4987=>583,4988=>875,5024=>711,5025=>678,5026=>604,5027=>667,5028=>796,5029=>301,5030=>516,5031=>544,5032=>457,5033=>716,5034=>703,5035=>383,5036=>628,5037=>709,5038=>455,5039=>601,5040=>472,5041=>574,5042=>730,5043=>939,5044=>498,5045=>528,5046=>667,5047=>891,5048=>505,5049=>792,5050=>957,5051=>725,5052=>595,5053=>733,5054=>698,5055=>638,5056=>720,5057=>732,5058=>624,5059=>638,5060=>565,5061=>903,5062=>655,5063=>681,5064=>675,5065=>949,5066=>683,5067=>547,5068=>693,5069=>732,5070=>529,5071=>569,5072=>536,5073=>677,5074=>631,5075=>542,5076=>973,5077=>543,5078=>607,5079=>652,5080=>652,5081=>693,5082=>514,5083=>803,5084=>658,5085=>597,5086=>627,5087=>659,5088=>679,5089=>706,5090=>563,5091=>618,5092=>767,5093=>776,5094=>731,5095=>492,5096=>808,5097=>823,5098=>796,5099=>689,5100=>716,5101=>518,5102=>521,5103=>719,5104=>563,5105=>776,5106=>634,5107=>822,5108=>621,5920=>502,5921=>502,5922=>500,5923=>498,5924=>500,5925=>502,5926=>502,5927=>502,5928=>500,5929=>503,5930=>502,5931=>502,5932=>500,5933=>500,5934=>500,5935=>796,5936=>500,5937=>502,5938=>0,5939=>0,5940=>0,5941=>230,5942=>397,6480=>537,6481=>537,6482=>531,6483=>678,6484=>682,6485=>628,6486=>732,6487=>721,6488=>598,6489=>583,6490=>702,6491=>554,6492=>683,6493=>554,6494=>710,6495=>695,6496=>523,6497=>678,6498=>589,6499=>272,6500=>506,6501=>515,6502=>515,6503=>210,6504=>210,6505=>515,6506=>515,6507=>515,6508=>229,6509=>705,6512=>649,6513=>538,6514=>568,6515=>520,6516=>544,6656=>820,6657=>958,6658=>758,6659=>859,6660=>958,6661=>727,6662=>904,6663=>940,6664=>850,6665=>905,6666=>838,6667=>961,6668=>1000,6669=>880,6670=>1189,6671=>1246,6672=>1177,6673=>757,6674=>1246,6675=>1192,6676=>709,6677=>1192,6678=>1075,6679=>0,6680=>0,6681=>534,6682=>690,6683=>0,6686=>697,6687=>500,7424=>507,7425=>659,7426=>639,7427=>468,7428=>461,7429=>537,7430=>537,7431=>447,7432=>403,7433=>278,7434=>312,7435=>523,7436=>449,7437=>652,7438=>539,7439=>523,7440=>435,7441=>507,7442=>507,7443=>673,7444=>705,7445=>378,7446=>483,7447=>483,7448=>438,7449=>484,7450=>489,7451=>423,7452=>522,7453=>488,7454=>660,7455=>500,7456=>512,7457=>699,7458=>444,7459=>355,7460=>444,7461=>681,7462=>392,7463=>483,7464=>483,7465=>372,7466=>541,7467=>470,7468=>503,7469=>653,7470=>441,7471=>441,7472=>510,7473=>435,7474=>435,7475=>491,7476=>527,7477=>255,7478=>300,7479=>512,7480=>436,7481=>638,7482=>535,7483=>539,7484=>483,7485=>350,7486=>411,7487=>480,7488=>409,7489=>526,7490=>695,7491=>297,7492=>297,7493=>335,7494=>440,7495=>335,7496=>335,7497=>297,7498=>297,7499=>279,7500=>258,7501=>323,7502=>186,7503=>338,7504=>521,7505=>335,7506=>335,7507=>290,7508=>483,7509=>483,7510=>335,7511=>186,7512=>335,7513=>326,7514=>521,7515=>322,7516=>442,7517=>353,7518=>321,7519=>357,7520=>430,7521=>321,7522=>186,7523=>223,7524=>335,7525=>335,7526=>353,7527=>321,7528=>353,7529=>430,7530=>321,7531=>754,7532=>500,7533=>500,7534=>333,7535=>778,7536=>500,7537=>500,7538=>333,7539=>333,7540=>389,7541=>278,7542=>444,7543=>467,7544=>483,7545=>447,7546=>774,7547=>280,7548=>278,7549=>500,7550=>522,7551=>514,7552=>500,7553=>500,7554=>333,7555=>676,7556=>525,7557=>278,7558=>802,7559=>507,7560=>500,7561=>333,7562=>389,7563=>384,7564=>500,7565=>500,7566=>444,7567=>602,7568=>637,7569=>648,7570=>590,7571=>559,7572=>426,7573=>590,7574=>413,7575=>444,7576=>360,7577=>638,7578=>389,7579=>335,7580=>292,7581=>285,7582=>341,7583=>280,7584=>255,7585=>251,7586=>323,7587=>336,7588=>188,7589=>212,7590=>184,7591=>182,7592=>230,7593=>236,7594=>196,7595=>297,7596=>497,7597=>529,7598=>401,7599=>404,7600=>364,7601=>349,7602=>412,7603=>224,7604=>312,7605=>197,7606=>344,7607=>346,7608=>354,7609=>334,7610=>325,7611=>277,7612=>393,7613=>288,7614=>277,7615=>338,7616=>0,7617=>0,7619=>0,7626=>0,7627=>0,7628=>0,7629=>0,7630=>0,7631=>0,7635=>0,7636=>0,7637=>0,7638=>0,7639=>0,7640=>0,7641=>0,7642=>0,7643=>0,7644=>0,7645=>0,7646=>0,7647=>0,7648=>0,7649=>0,7650=>0,7651=>0,7652=>0,7653=>0,7654=>0,7676=>0,7677=>0,7678=>0,7679=>0,7680=>721,7681=>435,7682=>631,7683=>500,7684=>631,7685=>500,7686=>631,7687=>500,7688=>674,7689=>444,7690=>719,7691=>499,7692=>719,7693=>499,7694=>719,7695=>499,7696=>720,7697=>499,7698=>719,7699=>499,7700=>611,7701=>444,7702=>611,7703=>444,7704=>610,7705=>444,7706=>610,7707=>444,7708=>611,7709=>444,7710=>564,7711=>373,7712=>722,7713=>467,7714=>714,7715=>498,7716=>714,7717=>498,7718=>714,7719=>498,7720=>713,7721=>498,7722=>713,7723=>498,7724=>327,7725=>278,7726=>333,7727=>278,7728=>709,7729=>513,7730=>709,7731=>513,7732=>709,7733=>513,7734=>611,7735=>258,7736=>611,7737=>258,7738=>611,7739=>258,7740=>611,7741=>258,7742=>881,7743=>779,7744=>881,7745=>779,7746=>881,7747=>779,7748=>725,7749=>489,7750=>725,7751=>489,7752=>725,7753=>489,7754=>725,7755=>489,7756=>722,7757=>491,7758=>724,7759=>491,7760=>722,7761=>491,7762=>722,7763=>491,7764=>576,7765=>500,7766=>576,7767=>500,7768=>667,7769=>345,7770=>667,7771=>345,7772=>667,7773=>345,7774=>667,7775=>345,7776=>529,7777=>367,7778=>529,7779=>367,7780=>529,7781=>367,7782=>529,7783=>367,7784=>529,7785=>367,7786=>606,7787=>283,7788=>606,7789=>283,7790=>606,7791=>283,7792=>606,7793=>283,7794=>721,7795=>490,7796=>721,7797=>490,7798=>721,7799=>490,7800=>721,7801=>490,7802=>721,7803=>490,7804=>701,7805=>468,7806=>701,7807=>468,7808=>947,7809=>683,7810=>947,7811=>683,7812=>947,7813=>683,7814=>947,7815=>683,7816=>947,7817=>683,7818=>714,7819=>482,7820=>714,7821=>482,7822=>701,7823=>471,7824=>613,7825=>417,7826=>613,7827=>417,7828=>613,7829=>417,7830=>498,7831=>283,7832=>683,7833=>471,7834=>435,7835=>373,7836=>381,7837=>373,7838=>659,7839=>516,7840=>721,7841=>435,7842=>721,7843=>435,7844=>721,7845=>435,7846=>721,7847=>435,7848=>721,7849=>454,7850=>721,7851=>435,7852=>721,7853=>435,7854=>721,7855=>435,7856=>721,7857=>435,7858=>721,7859=>454,7860=>721,7861=>435,7862=>721,7863=>435,7864=>610,7865=>444,7866=>610,7867=>444,7868=>610,7869=>444,7870=>610,7871=>444,7872=>610,7873=>444,7874=>610,7875=>444,7876=>610,7877=>444,7878=>610,7879=>444,7880=>327,7881=>278,7882=>327,7883=>278,7884=>724,7885=>491,7886=>724,7887=>491,7888=>724,7889=>491,7890=>724,7891=>491,7892=>724,7893=>491,7894=>724,7895=>491,7896=>724,7897=>491,7898=>723,7899=>536,7900=>723,7901=>536,7902=>720,7903=>536,7904=>723,7905=>536,7906=>723,7907=>536,7908=>721,7909=>490,7910=>717,7911=>490,7912=>783,7913=>545,7914=>783,7915=>545,7916=>783,7917=>545,7918=>783,7919=>545,7920=>783,7921=>545,7922=>701,7923=>471,7924=>701,7925=>471,7926=>701,7927=>501,7928=>701,7929=>471,7930=>908,7931=>502,7932=>501,7933=>342,7934=>713,7935=>510,7936=>583,7937=>583,7938=>583,7939=>583,7940=>583,7941=>583,7942=>583,7943=>583,7944=>721,7945=>721,7946=>813,7947=>817,7948=>763,7949=>765,7950=>720,7951=>721,7952=>426,7953=>426,7954=>426,7955=>426,7956=>426,7957=>426,7960=>770,7961=>770,7962=>902,7963=>919,7964=>940,7965=>936,7968=>536,7969=>536,7970=>536,7971=>536,7972=>536,7973=>536,7974=>536,7975=>536,7976=>847,7977=>859,7978=>986,7979=>1010,7980=>1026,7981=>1029,7982=>918,7983=>921,7984=>286,7985=>286,7986=>302,7987=>320,7988=>300,7989=>306,7990=>312,7991=>303,7992=>475,7993=>507,7994=>617,7995=>654,7996=>655,7997=>660,7998=>551,7999=>566,8000=>491,8001=>491,8002=>491,8003=>491,8004=>491,8005=>491,8008=>816,8009=>825,8010=>969,8011=>995,8012=>938,8013=>955,8016=>514,8017=>514,8018=>514,8019=>514,8020=>514,8021=>514,8022=>514,8023=>514,8025=>818,8027=>988,8029=>989,8031=>893,8032=>693,8033=>693,8034=>693,8035=>693,8036=>693,8037=>693,8038=>693,8039=>693,8040=>836,8041=>843,8042=>1006,8043=>1024,8044=>974,8045=>986,8046=>905,8047=>896,8048=>583,8049=>583,8050=>426,8051=>426,8052=>536,8053=>536,8054=>286,8055=>286,8056=>491,8057=>491,8058=>514,8059=>514,8060=>693,8061=>693,8064=>583,8065=>583,8066=>583,8067=>583,8068=>583,8069=>583,8070=>583,8071=>583,8072=>888,8073=>889,8074=>984,8075=>991,8076=>943,8077=>948,8078=>884,8079=>886,8080=>536,8081=>536,8082=>536,8083=>536,8084=>536,8085=>536,8086=>536,8087=>536,8088=>1017,8089=>1026,8090=>1153,8091=>1179,8092=>1195,8093=>1199,8094=>1088,8095=>1088,8096=>693,8097=>693,8098=>693,8099=>693,8100=>693,8101=>693,8102=>693,8103=>693,8104=>1034,8105=>1040,8106=>1210,8107=>1229,8108=>1176,8109=>1186,8110=>1098,8111=>1090,8112=>583,8113=>583,8114=>583,8115=>583,8116=>583,8118=>583,8119=>583,8120=>721,8121=>721,8122=>721,8123=>721,8124=>889,8125=>250,8126=>332,8127=>500,8128=>500,8129=>534,8130=>536,8131=>536,8132=>536,8134=>536,8135=>536,8136=>761,8137=>800,8138=>829,8139=>893,8140=>883,8141=>500,8142=>500,8143=>500,8144=>286,8145=>286,8146=>286,8147=>286,8150=>286,8151=>286,8152=>327,8153=>327,8154=>447,8155=>537,8157=>500,8158=>500,8159=>500,8160=>514,8161=>514,8162=>514,8163=>514,8164=>528,8165=>528,8166=>514,8167=>514,8168=>666,8169=>666,8170=>816,8171=>828,8172=>721,8173=>333,8174=>333,8175=>500,8178=>693,8179=>693,8180=>693,8182=>693,8183=>693,8184=>832,8185=>899,8186=>847,8187=>852,8188=>928,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>500,8200=>250,8201=>166,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>500,8211=>500,8212=>1000,8213=>1000,8214=>320,8215=>478,8216=>200,8217=>200,8218=>200,8219=>200,8220=>400,8221=>400,8222=>400,8223=>400,8224=>500,8225=>500,8226=>400,8227=>400,8228=>620,8229=>620,8230=>1000,8231=>250,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>250,8240=>1000,8241=>1363,8242=>250,8243=>450,8244=>636,8245=>250,8246=>450,8247=>636,8248=>469,8249=>250,8250=>250,8251=>629,8252=>666,8253=>444,8254=>500,8255=>953,8256=>953,8257=>314,8258=>931,8259=>400,8260=>167,8261=>383,8262=>383,8263=>888,8264=>777,8265=>777,8266=>500,8267=>453,8268=>400,8269=>400,8270=>500,8271=>278,8272=>882,8273=>500,8274=>497,8275=>500,8276=>953,8277=>512,8278=>410,8279=>838,8280=>620,8281=>620,8282=>179,8283=>621,8284=>564,8285=>179,8286=>179,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>320,8305=>180,8308=>320,8309=>320,8310=>320,8311=>320,8312=>320,8313=>320,8314=>340,8315=>340,8316=>340,8317=>216,8318=>216,8319=>335,8320=>320,8321=>320,8322=>320,8323=>320,8324=>320,8325=>320,8326=>320,8327=>320,8328=>320,8329=>320,8330=>340,8331=>340,8332=>350,8333=>216,8334=>216,8336=>300,8337=>295,8338=>325,8339=>330,8340=>292,8352=>698,8353=>667,8354=>667,8355=>556,8356=>500,8357=>778,8358=>722,8359=>940,8360=>1009,8361=>813,8362=>869,8363=>512,8364=>741,8365=>722,8366=>611,8367=>1340,8368=>489,8369=>601,8370=>619,8371=>722,8372=>556,8373=>611,8374=>498,8375=>569,8376=>524,8377=>654,8400=>0,8401=>0,8402=>0,8403=>0,8404=>0,8405=>0,8406=>0,8407=>0,8408=>0,8409=>0,8410=>0,8411=>0,8412=>0,8413=>0,8414=>0,8415=>0,8416=>0,8417=>0,8418=>0,8419=>0,8420=>0,8421=>0,8422=>0,8423=>0,8424=>0,8425=>0,8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8432=>0,8448=>741,8449=>723,8450=>674,8451=>954,8452=>506,8453=>721,8454=>766,8455=>525,8456=>667,8457=>864,8458=>510,8459=>1127,8460=>649,8461=>768,8462=>490,8463=>490,8464=>808,8465=>613,8466=>845,8467=>447,8468=>778,8469=>701,8470=>880,8471=>792,8472=>767,8473=>589,8474=>729,8475=>964,8476=>711,8477=>755,8478=>667,8479=>667,8480=>960,8481=>1116,8482=>1048,8483=>722,8484=>640,8485=>389,8486=>723,8487=>750,8488=>643,8489=>286,8490=>709,8491=>721,8492=>906,8493=>603,8494=>533,8495=>393,8496=>682,8497=>920,8498=>564,8499=>1231,8500=>407,8501=>517,8502=>537,8503=>350,8504=>537,8505=>417,8506=>906,8507=>1155,8508=>655,8510=>577,8511=>722,8512=>600,8513=>663,8514=>485,8515=>485,8516=>637,8517=>768,8518=>653,8519=>606,8520=>369,8521=>535,8522=>516,8523=>778,8525=>899,8526=>413,8528=>780,8529=>770,8530=>980,8531=>750,8532=>801,8533=>720,8534=>796,8535=>736,8536=>766,8537=>750,8538=>730,8539=>750,8540=>770,8541=>760,8542=>750,8543=>700,8544=>327,8545=>658,8546=>977,8547=>1041,8548=>701,8549=>1040,8550=>1363,8551=>1679,8552=>1051,8553=>714,8554=>1046,8555=>1366,8556=>611,8557=>670,8558=>719,8559=>881,8560=>278,8561=>536,8562=>794,8563=>734,8564=>468,8565=>718,8566=>986,8567=>1244,8568=>736,8569=>482,8570=>754,8571=>1012,8572=>258,8573=>444,8574=>499,8575=>779,8576=>1082,8577=>722,8578=>1090,8579=>667,8580=>427,8581=>667,8582=>528,8583=>722,8584=>1093,8585=>771,8592=>900,8593=>472,8594=>900,8595=>500,8596=>900,8597=>499,8598=>800,8599=>800,8600=>800,8601=>800,8602=>900,8603=>900,8604=>1000,8605=>1000,8606=>900,8607=>500,8608=>900,8609=>499,8610=>1019,8611=>1019,8612=>1013,8613=>500,8614=>1013,8615=>500,8616=>500,8617=>910,8618=>910,8619=>910,8620=>900,8621=>1147,8622=>900,8623=>592,8624=>482,8625=>482,8626=>482,8627=>482,8628=>658,8629=>658,8630=>1069,8631=>1069,8632=>836,8633=>964,8634=>843,8635=>843,8636=>900,8637=>900,8638=>499,8639=>499,8640=>900,8641=>900,8642=>499,8643=>499,8644=>900,8645=>840,8646=>900,8647=>900,8648=>840,8649=>900,8650=>840,8651=>900,8652=>900,8653=>900,8654=>910,8655=>900,8656=>900,8657=>550,8658=>900,8659=>550,8660=>910,8661=>550,8662=>1000,8663=>1000,8664=>1000,8665=>1000,8666=>910,8667=>910,8668=>1078,8669=>1078,8670=>500,8671=>500,8672=>900,8673=>500,8674=>900,8675=>500,8676=>992,8677=>992,8678=>910,8679=>596,8680=>910,8681=>596,8682=>594,8683=>594,8684=>594,8685=>595,8686=>596,8687=>596,8688=>906,8689=>926,8690=>926,8691=>596,8692=>900,8693=>842,8694=>910,8695=>900,8696=>900,8697=>900,8698=>900,8699=>900,8700=>900,8701=>900,8702=>900,8703=>900,8704=>587,8705=>532,8706=>494,8707=>587,8708=>587,8709=>662,8710=>612,8711=>612,8712=>536,8713=>536,8714=>439,8715=>536,8716=>536,8717=>439,8718=>500,8719=>823,8720=>823,8721=>713,8722=>564,8723=>564,8724=>564,8725=>500,8726=>500,8727=>400,8728=>400,8729=>333,8730=>549,8731=>549,8732=>549,8733=>636,8734=>853,8735=>509,8736=>575,8737=>559,8738=>509,8739=>200,8740=>250,8741=>320,8742=>404,8743=>564,8744=>564,8745=>564,8746=>564,8747=>456,8748=>812,8749=>1153,8750=>618,8751=>910,8752=>1238,8753=>646,8754=>651,8755=>651,8756=>565,8757=>568,8758=>250,8759=>629,8760=>564,8761=>758,8762=>564,8763=>636,8764=>636,8765=>636,8766=>503,8767=>614,8768=>297,8769=>636,8770=>636,8771=>636,8772=>636,8773=>636,8774=>636,8775=>636,8776=>636,8777=>636,8778=>636,8779=>636,8780=>636,8781=>636,8782=>636,8783=>636,8784=>564,8785=>564,8786=>564,8787=>564,8788=>735,8789=>755,8790=>564,8791=>564,8792=>564,8793=>564,8794=>564,8795=>564,8796=>600,8797=>564,8798=>564,8799=>564,8800=>564,8801=>636,8802=>636,8803=>636,8804=>636,8805=>636,8806=>636,8807=>636,8808=>636,8809=>636,8810=>900,8811=>899,8812=>410,8813=>636,8814=>636,8815=>636,8816=>636,8817=>636,8818=>636,8819=>636,8820=>636,8821=>636,8822=>636,8823=>636,8824=>636,8825=>636,8826=>636,8827=>636,8828=>636,8829=>636,8830=>636,8831=>636,8832=>636,8833=>636,8834=>636,8835=>636,8836=>636,8837=>636,8838=>636,8839=>636,8840=>636,8841=>636,8842=>636,8843=>636,8844=>564,8845=>564,8846=>564,8847=>564,8848=>564,8849=>564,8850=>564,8851=>563,8852=>564,8853=>636,8854=>636,8855=>636,8856=>636,8857=>636,8858=>636,8859=>636,8860=>636,8861=>636,8862=>636,8863=>636,8864=>636,8865=>636,8866=>778,8867=>778,8868=>712,8869=>712,8870=>466,8871=>466,8872=>595,8873=>588,8874=>710,8875=>706,8876=>595,8877=>596,8878=>608,8879=>706,8880=>636,8881=>636,8882=>636,8883=>636,8884=>636,8885=>636,8886=>1296,8887=>1296,8888=>966,8889=>564,8890=>506,8891=>564,8892=>564,8893=>566,8894=>570,8895=>582,8896=>744,8897=>744,8898=>764,8899=>764,8900=>512,8901=>250,8902=>471,8903=>629,8904=>636,8905=>636,8906=>636,8907=>816,8908=>816,8909=>636,8910=>636,8911=>636,8912=>636,8913=>636,8914=>564,8915=>564,8916=>594,8917=>564,8918=>564,8919=>564,8920=>1215,8921=>1215,8922=>636,8923=>636,8924=>636,8925=>636,8926=>636,8927=>636,8928=>636,8929=>636,8930=>636,8931=>636,8932=>636,8933=>636,8934=>636,8935=>636,8936=>636,8937=>636,8938=>636,8939=>636,8940=>636,8941=>636,8942=>250,8943=>1000,8944=>1000,8945=>1000,8946=>601,8947=>536,8948=>464,8949=>536,8950=>536,8951=>464,8952=>536,8953=>536,8954=>601,8955=>536,8956=>464,8957=>536,8958=>464,8959=>600,8960=>662,8961=>442,8962=>694,8963=>472,8964=>472,8965=>508,8966=>508,8968=>474,8969=>474,8970=>474,8971=>474,8972=>600,8973=>600,8974=>600,8975=>600,8976=>564,8977=>503,8978=>791,8979=>791,8980=>593,8981=>560,8982=>563,8983=>563,8984=>700,8985=>564,8986=>780,8987=>632,8988=>474,8989=>474,8990=>474,8991=>474,8992=>686,8993=>686,8994=>658,8995=>658,8996=>800,8997=>800,8998=>800,8999=>800,9000=>800,9001=>329,9002=>329,9003=>800,9004=>800,9031=>777,9032=>777,9040=>777,9047=>777,9054=>777,9088=>800,9089=>800,9090=>800,9091=>840,9094=>800,9095=>800,9096=>800,9097=>800,9098=>800,9100=>800,9103=>788,9104=>788,9105=>788,9106=>788,9108=>800,9109=>800,9110=>800,9111=>800,9112=>800,9113=>800,9114=>800,9115=>384,9116=>384,9117=>384,9118=>384,9119=>384,9120=>384,9121=>388,9122=>388,9123=>388,9124=>388,9125=>388,9126=>388,9127=>494,9128=>494,9129=>494,9130=>494,9131=>494,9132=>494,9133=>494,9134=>686,9138=>1287,9139=>1287,9140=>860,9141=>861,9142=>861,9144=>889,9145=>889,9146=>889,9147=>889,9148=>889,9149=>889,9166=>800,9167=>800,9180=>896,9181=>896,9182=>903,9183=>904,9184=>910,9185=>910,9186=>761,9187=>910,9189=>942,9190=>817,9216=>800,9217=>800,9218=>800,9219=>800,9220=>800,9221=>800,9222=>800,9223=>800,9224=>800,9225=>800,9226=>800,9227=>800,9228=>800,9229=>800,9230=>800,9231=>800,9232=>800,9233=>800,9234=>800,9235=>800,9236=>800,9237=>800,9238=>800,9239=>800,9240=>800,9241=>800,9242=>800,9243=>800,9244=>800,9245=>800,9246=>800,9247=>800,9248=>800,9249=>800,9250=>556,9251=>500,9252=>800,9253=>800,9254=>500,9312=>788,9313=>788,9314=>788,9315=>788,9316=>788,9317=>788,9318=>788,9319=>788,9320=>788,9321=>788,9472=>889,9473=>889,9474=>889,9475=>889,9484=>889,9485=>889,9486=>889,9487=>889,9488=>889,9489=>889,9490=>889,9491=>889,9492=>889,9493=>889,9494=>889,9495=>889,9496=>889,9497=>889,9498=>889,9499=>889,9500=>889,9501=>889,9502=>889,9503=>889,9504=>889,9505=>889,9506=>889,9507=>889,9508=>889,9509=>889,9510=>889,9511=>889,9512=>889,9513=>889,9514=>889,9515=>889,9516=>889,9517=>889,9518=>889,9519=>889,9520=>889,9521=>889,9522=>889,9523=>889,9524=>889,9525=>889,9526=>889,9527=>889,9528=>889,9529=>889,9530=>889,9531=>889,9532=>889,9533=>889,9534=>889,9535=>889,9536=>889,9537=>889,9538=>889,9539=>889,9540=>889,9541=>889,9542=>889,9543=>889,9544=>889,9545=>889,9546=>889,9547=>889,9552=>889,9553=>889,9554=>889,9555=>889,9556=>889,9557=>889,9558=>889,9559=>889,9560=>889,9561=>889,9562=>889,9563=>889,9564=>889,9565=>889,9566=>889,9567=>889,9568=>889,9569=>889,9570=>889,9571=>889,9572=>889,9573=>889,9574=>889,9575=>889,9576=>889,9577=>889,9578=>889,9579=>889,9580=>889,9581=>889,9582=>889,9583=>889,9584=>889,9585=>889,9586=>889,9587=>889,9588=>889,9589=>889,9590=>889,9591=>889,9592=>889,9593=>889,9594=>889,9595=>889,9596=>600,9597=>889,9598=>600,9599=>889,9600=>761,9601=>761,9602=>761,9603=>761,9604=>761,9605=>761,9606=>761,9607=>761,9608=>761,9609=>761,9610=>761,9611=>761,9612=>761,9613=>761,9614=>761,9615=>761,9616=>761,9617=>1000,9618=>1000,9619=>1000,9620=>761,9621=>761,9622=>761,9623=>761,9624=>761,9625=>761,9626=>761,9627=>761,9628=>761,9629=>761,9630=>761,9631=>761,9632=>761,9633=>761,9634=>761,9635=>761,9636=>761,9637=>761,9638=>761,9639=>761,9640=>761,9641=>761,9642=>346,9643=>346,9644=>761,9645=>761,9646=>761,9647=>761,9648=>761,9649=>761,9650=>840,9651=>840,9652=>420,9653=>420,9654=>800,9655=>800,9656=>386,9657=>386,9658=>800,9659=>800,9660=>840,9661=>840,9662=>420,9663=>420,9664=>800,9665=>800,9666=>386,9667=>386,9668=>800,9669=>800,9670=>788,9671=>788,9672=>788,9673=>791,9674=>494,9675=>791,9676=>791,9677=>785,9678=>791,9679=>791,9680=>791,9681=>791,9682=>791,9683=>791,9684=>791,9685=>791,9686=>791,9687=>791,9688=>400,9689=>761,9690=>761,9691=>761,9692=>791,9693=>791,9694=>791,9695=>791,9696=>791,9697=>791,9698=>761,9699=>761,9700=>761,9701=>761,9702=>400,9703=>761,9704=>761,9705=>761,9706=>761,9707=>761,9708=>840,9709=>840,9710=>840,9711=>885,9712=>761,9713=>761,9714=>761,9715=>761,9716=>791,9717=>791,9718=>791,9719=>791,9720=>780,9721=>780,9722=>780,9723=>567,9724=>567,9725=>435,9726=>435,9727=>780,9728=>800,9729=>800,9730=>748,9731=>800,9732=>800,9733=>811,9734=>816,9735=>468,9736=>677,9737=>724,9738=>944,9739=>944,9740=>686,9741=>944,9742=>715,9743=>715,9744=>757,9745=>755,9746=>755,9747=>756,9748=>800,9749=>837,9750=>719,9751=>719,9752=>782,9753=>800,9754=>800,9755=>800,9756=>800,9757=>430,9758=>800,9759=>430,9760=>517,9761=>660,9762=>724,9763=>732,9764=>886,9765=>577,9766=>489,9767=>563,9768=>490,9769=>770,9770=>725,9771=>860,9772=>668,9773=>753,9774=>724,9775=>730,9776=>600,9777=>600,9778=>600,9779=>600,9780=>600,9781=>600,9782=>600,9783=>600,9784=>730,9785=>724,9786=>724,9787=>724,9788=>799,9789=>659,9790=>659,9791=>495,9792=>495,9793=>495,9794=>686,9795=>661,9796=>544,9797=>608,9798=>605,9799=>545,9800=>804,9801=>583,9802=>796,9803=>1006,9804=>825,9805=>1189,9806=>1144,9807=>1189,9808=>683,9809=>808,9810=>1146,9811=>797,9812=>800,9813=>800,9814=>800,9815=>800,9816=>800,9817=>800,9818=>800,9819=>800,9820=>800,9821=>800,9822=>800,9823=>800,9824=>770,9825=>770,9826=>770,9827=>770,9828=>770,9829=>770,9830=>770,9831=>770,9832=>895,9833=>333,9834=>513,9835=>722,9836=>722,9837=>371,9838=>377,9839=>402,9840=>642,9841=>655,9842=>869,9843=>905,9844=>905,9845=>905,9846=>905,9847=>905,9848=>905,9849=>905,9850=>905,9851=>1016,9852=>1064,9853=>1064,9854=>954,9855=>606,9856=>522,9857=>522,9858=>522,9859=>522,9860=>522,9861=>522,9862=>845,9863=>844,9864=>844,9865=>844,9866=>748,9867=>748,9868=>748,9869=>748,9870=>748,9871=>748,9872=>726,9873=>726,9874=>963,9875=>770,9876=>1038,9877=>388,9878=>997,9879=>787,9880=>508,9881=>809,9882=>1014,9883=>859,9884=>818,9885=>972,9888=>1000,9889=>546,9890=>784,9891=>786,9892=>738,9893=>542,9894=>601,9895=>700,9896=>511,9897=>861,9898=>611,9899=>611,9900=>544,9901=>782,9902=>1025,9903=>1141,9904=>1000,9905=>513,9906=>510,9907=>642,9908=>722,9909=>719,9910=>777,9911=>495,9912=>602,9913=>836,9914=>666,9915=>666,9916=>691,9920=>689,9921=>689,9922=>689,9923=>689,9985=>974,9986=>961,9987=>974,9988=>980,9989=>846,9990=>789,9991=>790,9992=>791,9993=>690,9994=>549,9995=>570,9996=>549,9997=>855,9998=>911,9999=>933,10000=>911,10001=>945,10002=>974,10003=>755,10004=>846,10005=>762,10006=>761,10007=>571,10008=>677,10009=>763,10010=>760,10011=>759,10012=>754,10013=>494,10014=>552,10015=>537,10016=>577,10017=>692,10018=>786,10019=>788,10020=>788,10021=>790,10022=>793,10023=>794,10024=>823,10025=>823,10026=>789,10027=>841,10028=>823,10029=>833,10030=>816,10031=>831,10032=>923,10033=>744,10034=>723,10035=>749,10036=>790,10037=>792,10038=>695,10039=>776,10040=>768,10041=>792,10042=>759,10043=>707,10044=>708,10045=>682,10046=>701,10047=>826,10048=>815,10049=>789,10050=>789,10051=>707,10052=>687,10053=>696,10054=>689,10055=>786,10056=>787,10057=>713,10058=>791,10059=>785,10060=>761,10061=>873,10062=>780,10063=>762,10064=>762,10065=>759,10066=>759,10067=>601,10068=>601,10069=>272,10070=>784,10071=>333,10072=>138,10073=>277,10074=>415,10075=>392,10076=>392,10077=>668,10078=>668,10079=>392,10080=>668,10081=>732,10082=>544,10083=>544,10084=>910,10085=>667,10086=>760,10087=>800,10088=>390,10089=>390,10090=>317,10091=>317,10092=>276,10093=>276,10094=>509,10095=>509,10096=>410,10097=>410,10098=>234,10099=>234,10100=>334,10101=>334,10102=>788,10103=>788,10104=>788,10105=>788,10106=>788,10107=>788,10108=>788,10109=>788,10110=>788,10111=>788,10112=>788,10113=>788,10114=>788,10115=>788,10116=>788,10117=>788,10118=>788,10119=>788,10120=>788,10121=>788,10122=>788,10123=>788,10124=>788,10125=>788,10126=>788,10127=>788,10128=>788,10129=>788,10130=>788,10131=>788,10132=>894,10133=>756,10134=>756,10135=>756,10136=>748,10137=>924,10138=>748,10139=>918,10140=>927,10141=>928,10142=>928,10143=>834,10144=>873,10145=>828,10146=>924,10147=>924,10148=>917,10149=>930,10150=>931,10151=>463,10152=>883,10153=>836,10154=>836,10155=>867,10156=>867,10157=>696,10158=>696,10159=>874,10160=>832,10161=>874,10162=>760,10163=>946,10164=>771,10165=>865,10166=>771,10167=>888,10168=>967,10169=>888,10170=>831,10171=>873,10172=>927,10173=>970,10174=>918,10175=>1248,10176=>509,10177=>892,10178=>752,10179=>636,10180=>636,10183=>564,10184=>876,10185=>867,10186=>220,10188=>847,10190=>636,10191=>636,10192=>788,10193=>564,10194=>536,10195=>474,10196=>474,10197=>755,10198=>755,10199=>874,10200=>712,10201=>712,10202=>890,10203=>890,10204=>966,10205=>926,10206=>926,10207=>372,10208=>494,10209=>661,10210=>741,10211=>741,10212=>756,10213=>756,10214=>455,10215=>455,10216=>329,10217=>329,10218=>496,10219=>496,10224=>1000,10225=>1000,10226=>1104,10227=>1102,10228=>964,10229=>1000,10230=>1000,10231=>1000,10232=>1000,10233=>1000,10234=>1000,10235=>1000,10236=>1000,10237=>1000,10238=>1000,10239=>1392,10624=>420,10625=>350,10626=>238,10627=>480,10628=>480,10629=>333,10630=>333,10635=>333,10636=>333,10641=>329,10642=>329,10649=>179,10651=>559,10653=>570,10654=>595,10656=>509,10657=>509,10658=>575,10659=>575,10660=>575,10661=>575,10672=>746,10673=>746,10674=>746,10675=>746,10676=>746,10677=>926,10678=>636,10679=>791,10680=>636,10681=>791,10684=>791,10686=>800,10687=>800,10688=>791,10689=>791,10690=>983,10691=>1052,10692=>636,10693=>636,10694=>636,10695=>636,10696=>636,10697=>714,10698=>840,10699=>892,10700=>892,10701=>931,10702=>892,10703=>870,10704=>870,10705=>702,10706=>702,10707=>702,10708=>702,10709=>702,10710=>702,10711=>702,10726=>804,10728=>840,10729=>840,10731=>494,10740=>1000,10741=>376,10742=>351,10743=>376,10744=>400,10745=>400,10752=>860,10753=>860,10754=>860,10755=>766,10756=>766,10757=>756,10758=>756,10761=>745,10781=>702,10786=>564,10787=>564,10788=>564,10789=>564,10790=>564,10791=>564,10800=>564,10801=>564,10808=>791,10809=>840,10810=>840,10811=>840,10815=>713,10993=>372,10994=>320,10995=>352,10996=>440,10997=>420,11008=>1000,11009=>1000,11010=>1000,11011=>1000,11012=>1222,11013=>1000,11014=>1000,11015=>1000,11016=>1000,11017=>1000,11018=>1000,11019=>1000,11020=>1244,11021=>1000,11022=>772,11023=>772,11024=>772,11025=>772,11026=>770,11027=>770,11028=>770,11029=>770,11030=>770,11031=>770,11032=>770,11033=>770,11034=>770,11035=>1000,11036=>1000,11037=>283,11038=>283,11039=>846,11040=>846,11041=>799,11042=>799,11043=>807,11044=>1000,11045=>461,11046=>461,11047=>461,11048=>461,11049=>360,11050=>360,11051=>283,11052=>854,11053=>854,11054=>628,11055=>628,11056=>900,11057=>910,11088=>589,11089=>443,11090=>443,11091=>802,11092=>803,11264=>645,11265=>793,11266=>851,11267=>700,11268=>851,11269=>640,11270=>774,11271=>665,11272=>733,11273=>834,11274=>834,11275=>734,11276=>790,11277=>580,11278=>834,11279=>979,11280=>738,11281=>410,11282=>775,11283=>471,11284=>734,11285=>851,11286=>895,11287=>722,11288=>638,11289=>620,11290=>721,11291=>793,11292=>821,11293=>699,11294=>793,11295=>682,11296=>569,11297=>791,11299=>751,11300=>705,11301=>874,11302=>665,11303=>1139,11304=>1023,11305=>1238,11306=>762,11310=>759,11312=>484,11313=>595,11314=>638,11315=>525,11316=>638,11317=>480,11318=>580,11319=>499,11320=>550,11321=>625,11322=>626,11323=>550,11324=>592,11325=>435,11326=>626,11327=>734,11328=>553,11329=>308,11330=>581,11331=>353,11332=>550,11333=>638,11334=>671,11335=>542,11336=>478,11337=>465,11338=>540,11339=>594,11340=>616,11341=>524,11342=>594,11343=>512,11344=>427,11345=>589,11347=>564,11348=>529,11349=>655,11350=>499,11351=>854,11352=>767,11353=>929,11354=>571,11358=>569,11360=>611,11361=>289,11362=>627,11363=>556,11364=>667,11365=>435,11366=>303,11367=>728,11368=>501,11369=>734,11370=>514,11371=>611,11372=>405,11373=>680,11374=>889,11375=>721,11376=>680,11377=>624,11378=>1075,11379=>852,11380=>468,11381=>557,11382=>380,11383=>612,11384=>559,11385=>347,11386=>491,11387=>397,11388=>230,11389=>469,11390=>556,11391=>611,11392=>719,11393=>499,11394=>532,11395=>381,11396=>615,11397=>433,11398=>969,11399=>680,11400=>647,11401=>444,11402=>593,11403=>402,11404=>573,11405=>405,11406=>698,11407=>509,11408=>726,11409=>493,11410=>283,11411=>238,11412=>628,11413=>455,11414=>653,11415=>471,11416=>819,11417=>589,11418=>698,11419=>507,11420=>546,11421=>378,11422=>724,11423=>489,11424=>724,11425=>524,11426=>526,11427=>375,11428=>647,11429=>438,11430=>615,11431=>433,11432=>719,11433=>519,11434=>762,11435=>538,11436=>649,11437=>461,11438=>721,11439=>519,11440=>964,11441=>681,11456=>689,11457=>464,11464=>579,11465=>391,11466=>493,11467=>355,11492=>408,11493=>499,11494=>496,11495=>986,11496=>466,11497=>461,11498=>934,11517=>256,11518=>617,11519=>266,11744=>0,11745=>0,11746=>0,11747=>0,11748=>0,11749=>0,11750=>0,11751=>0,11752=>0,11753=>0,11754=>0,11755=>0,11756=>0,11757=>0,11758=>0,11759=>0,11760=>0,11761=>0,11762=>0,11763=>0,11764=>0,11765=>0,11766=>0,11767=>0,11768=>0,11769=>0,11770=>0,11771=>0,11772=>0,11773=>0,11774=>0,11775=>0,11776=>333,11777=>333,11782=>534,11783=>534,11787=>346,11788=>500,11789=>500,11791=>1000,11792=>1000,11793=>1000,11798=>564,11799=>333,11800=>444,11802=>333,11803=>500,11804=>500,11805=>500,11806=>500,11807=>500,11808=>333,11809=>333,11810=>333,11811=>333,11812=>333,11813=>333,11814=>856,11815=>856,11816=>464,11817=>464,11818=>620,11819=>410,11820=>410,11821=>620,11822=>500,11823=>250,11824=>400,11825=>250,42560=>607,42561=>411,42562=>611,42563=>410,42564=>487,42565=>367,42566=>368,42567=>286,42568=>722,42569=>519,42570=>550,42571=>458,42572=>1145,42573=>775,42574=>665,42575=>548,42576=>1014,42577=>736,42578=>910,42579=>675,42580=>962,42581=>677,42582=>1042,42583=>648,42584=>722,42585=>513,42586=>932,42587=>700,42588=>1042,42589=>749,42590=>780,42591=>550,42592=>717,42593=>524,42594=>896,42595=>635,42596=>933,42597=>635,42598=>1139,42599=>777,42600=>724,42601=>491,42602=>790,42603=>560,42604=>1262,42605=>850,42606=>734,42607=>0,42608=>0,42609=>0,42610=>0,42611=>519,42620=>0,42621=>0,42622=>510,42623=>201,42624=>639,42625=>488,42626=>475,42627=>347,42628=>1160,42629=>842,42630=>1000,42631=>768,42632=>737,42633=>531,42634=>827,42635=>530,42636=>608,42637=>438,42638=>742,42639=>545,42640=>608,42641=>480,42642=>926,42643=>654,42644=>671,42645=>518,42646=>992,42647=>780,42752=>318,42753=>318,42754=>318,42755=>318,42756=>318,42757=>318,42758=>318,42759=>318,42760=>307,42761=>307,42762=>307,42763=>307,42764=>307,42765=>307,42766=>307,42767=>307,42768=>307,42769=>307,42770=>460,42771=>460,42772=>460,42773=>460,42774=>460,42775=>374,42776=>445,42777=>564,42778=>564,42779=>354,42780=>354,42781=>243,42782=>243,42783=>243,42784=>564,42785=>564,42786=>276,42787=>242,42788=>386,42789=>276,42790=>722,42791=>501,42792=>895,42793=>703,42794=>532,42795=>409,42796=>437,42797=>389,42798=>592,42799=>600,42800=>413,42801=>373,42802=>1183,42803=>683,42804=>1154,42805=>741,42806=>1089,42807=>693,42808=>902,42809=>563,42810=>902,42811=>563,42812=>912,42813=>549,42814=>667,42815=>432,42816=>722,42817=>513,42818=>722,42819=>513,42820=>722,42821=>512,42822=>713,42823=>341,42824=>611,42825=>289,42826=>750,42827=>544,42828=>918,42829=>654,42830=>1262,42831=>841,42832=>556,42833=>500,42838=>722,42839=>575,42842=>397,42843=>344,42852=>576,42853=>500,42854=>576,42855=>500,42862=>489,42863=>489,42864=>307,42873=>722,42874=>491,42875=>483,42876=>344,42877=>611,42878=>581,42879=>441,42880=>611,42881=>258,42882=>689,42883=>495,42884=>483,42885=>344,42886=>667,42887=>444,42888=>333,42889=>250,42890=>282,42891=>286,42892=>278,42893=>722,42896=>722,42897=>492,42922=>833,43002=>779,43003=>556,43004=>556,43005=>889,43006=>333,43007=>1298,43232=>0,43233=>0,43234=>0,43235=>0,43236=>0,43237=>0,43238=>0,43239=>0,43240=>0,43241=>0,43242=>0,43243=>0,43244=>0,43245=>0,43246=>0,43247=>0,43248=>0,43249=>0,43250=>500,43251=>500,43252=>500,43253=>500,43254=>500,43255=>500,43256=>694,43257=>680,43258=>400,43259=>500,64256=>639,64257=>524,64258=>509,64259=>795,64260=>778,64261=>581,64262=>663,64275=>971,64276=>969,64277=>978,64278=>971,64279=>1219,64285=>320,64286=>0,64287=>537,64288=>537,64289=>817,64290=>820,64291=>820,64292=>820,64293=>820,64294=>820,64295=>820,64296=>820,64297=>564,64298=>537,64299=>537,64300=>537,64301=>537,64302=>537,64303=>537,64304=>537,64305=>537,64306=>350,64307=>537,64308=>537,64309=>350,64310=>350,64312=>537,64313=>320,64314=>537,64315=>537,64316=>537,64318=>537,64320=>350,64321=>537,64323=>537,64324=>537,64326=>537,64327=>537,64328=>537,64329=>537,64330=>537,64331=>350,64332=>537,64333=>537,64334=>537,64335=>547,64336=>229,64337=>237,64338=>877,64339=>877,64340=>268,64341=>300,64342=>926,64343=>877,64344=>296,64345=>300,64346=>877,64347=>877,64348=>298,64349=>300,64350=>877,64351=>877,64352=>270,64353=>300,64354=>877,64355=>877,64356=>288,64357=>300,64358=>877,64359=>877,64360=>288,64361=>300,64362=>858,64363=>858,64364=>338,64365=>328,64366=>858,64367=>858,64368=>338,64369=>328,64370=>598,64371=>595,64372=>600,64373=>630,64374=>598,64375=>595,64376=>600,64377=>630,64378=>598,64379=>595,64380=>600,64381=>630,64382=>598,64383=>595,64384=>600,64385=>630,64386=>400,64387=>348,64388=>400,64389=>348,64390=>348,64391=>348,64392=>348,64393=>348,64394=>345,64395=>345,64396=>345,64397=>345,64398=>902,64399=>966,64400=>373,64401=>469,64402=>902,64403=>966,64404=>373,64405=>469,64406=>902,64407=>966,64408=>373,64409=>469,64410=>902,64411=>966,64412=>373,64413=>469,64414=>585,64415=>585,64416=>585,64417=>585,64418=>293,64419=>300,64420=>372,64421=>420,64422=>372,64423=>393,64424=>313,64425=>340,64426=>456,64427=>456,64428=>456,64429=>496,64430=>710,64431=>680,64432=>710,64433=>680,64434=>344,64435=>344,64436=>484,64437=>484,64438=>508,64439=>508,64440=>508,64441=>508,64442=>565,64443=>508,64444=>335,64445=>344,64446=>344,64447=>342,64448=>354,64449=>354,64467=>719,64468=>688,64469=>373,64470=>469,64471=>359,64472=>329,64473=>399,64474=>369,64475=>399,64476=>369,64477=>522,64478=>399,64479=>369,64480=>399,64481=>369,64482=>399,64483=>369,64484=>672,64485=>670,64486=>270,64487=>300,64488=>270,64489=>300,64508=>672,64509=>670,64510=>270,64511=>300,64606=>375,64607=>375,64608=>375,64609=>375,64610=>375,64611=>375,64612=>698,64613=>698,64615=>988,64618=>698,64619=>698,64621=>988,64624=>698,64625=>698,64627=>988,64630=>698,64631=>698,64633=>988,64650=>698,64651=>698,64653=>988,64657=>698,64658=>698,64660=>988,64830=>443,64831=>443,65010=>1025,65020=>1107,65056=>0,65057=>0,65058=>0,65059=>0,65060=>0,65061=>0,65062=>0,65136=>200,65137=>200,65138=>250,65139=>373,65140=>200,65142=>200,65143=>200,65144=>200,65145=>200,65146=>200,65147=>200,65148=>200,65149=>200,65150=>200,65151=>200,65152=>350,65153=>245,65154=>237,65155=>229,65156=>237,65157=>399,65158=>359,65159=>229,65160=>237,65161=>672,65162=>680,65163=>270,65164=>300,65165=>229,65166=>237,65167=>907,65168=>917,65169=>270,65170=>300,65171=>416,65172=>420,65173=>907,65174=>917,65175=>288,65176=>300,65177=>907,65178=>917,65179=>288,65180=>300,65181=>598,65182=>595,65183=>600,65184=>630,65185=>598,65186=>595,65187=>600,65188=>630,65189=>598,65190=>595,65191=>600,65192=>630,65193=>348,65194=>398,65195=>403,65196=>398,65197=>345,65198=>385,65199=>345,65200=>385,65201=>901,65202=>901,65203=>648,65204=>603,65205=>901,65206=>901,65207=>649,65208=>598,65209=>909,65210=>893,65211=>633,65212=>583,65213=>909,65214=>893,65215=>630,65216=>580,65217=>568,65218=>568,65219=>521,65220=>521,65221=>568,65222=>568,65223=>521,65224=>521,65225=>591,65226=>530,65227=>584,65228=>447,65229=>591,65230=>537,65231=>584,65232=>447,65233=>858,65234=>858,65235=>338,65236=>328,65237=>626,65238=>626,65239=>338,65240=>328,65241=>486,65242=>688,65243=>373,65244=>469,65245=>628,65246=>667,65247=>247,65248=>280,65249=>475,65250=>415,65251=>419,65252=>476,65253=>637,65254=>637,65255=>270,65256=>300,65257=>372,65258=>420,65259=>463,65260=>396,65261=>374,65262=>359,65263=>672,65264=>680,65265=>672,65266=>680,65267=>270,65268=>300,65269=>456,65270=>594,65271=>446,65272=>614,65273=>446,65274=>614,65275=>446,65276=>614,65279=>0,65529=>0,65530=>0,65531=>0,65532=>800,65533=>900,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserif.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserif.z
new file mode 100644
index 00000000..b18caef9
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserif.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifb.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifb.ctg.z
new file mode 100644
index 00000000..7afcbfcd
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifb.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifb.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifb.php
new file mode 100644
index 00000000..820d5680
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifb.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='FreeSerifBold';
+$up=-125;
+$ut=50;
+$dw=600;
+$diff='';
+$originalsize=1310828;
+$enc='';
+$file='freeserifb.z';
+$ctg='freeserifb.ctg.z';
+$desc=array('Flags'=>32,'FontBBox'=>'[-819 -555 1834 920]','ItalicAngle'=>0,'Ascent'=>900,'Descent'=>-200,'Leading'=>100,'CapHeight'=>676,'XHeight'=>461,'StemV'=>123,'StemH'=>53,'AvgWidth'=>628,'MaxWidth'=>1850,'MissingWidth'=>600);
+$cw=array(0=>600,32=>250,33=>333,34=>555,35=>500,36=>500,37=>1000,38=>833,39=>278,40=>333,41=>333,42=>507,43=>676,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333,60=>676,61=>676,62=>676,63=>500,64=>930,65=>721,66=>658,67=>708,68=>731,69=>671,70=>617,71=>776,72=>778,73=>390,74=>501,75=>774,76=>668,77=>947,78=>725,79=>778,80=>639,81=>778,82=>719,83=>568,84=>645,85=>725,86=>705,87=>982,88=>713,89=>704,90=>646,91=>333,92=>278,93=>333,94=>581,95=>500,96=>333,97=>500,98=>545,99=>435,100=>552,101=>444,102=>393,103=>500,104=>554,105=>299,106=>400,107=>555,108=>277,109=>832,110=>554,111=>501,112=>545,113=>545,114=>427,115=>406,116=>335,117=>564,118=>482,119=>702,120=>508,121=>482,122=>444,123=>394,124=>220,125=>394,126=>520,160=>250,161=>333,162=>500,163=>500,164=>500,165=>500,166=>220,167=>500,168=>333,169=>747,170=>300,171=>500,172=>680,173=>333,174=>747,175=>333,176=>400,177=>676,178=>300,179=>300,180=>333,181=>556,182=>540,183=>250,184=>333,185=>270,186=>330,187=>500,188=>750,189=>770,190=>750,191=>500,192=>721,193=>721,194=>721,195=>721,196=>721,197=>721,198=>987,199=>708,200=>671,201=>671,202=>671,203=>671,204=>390,205=>390,206=>390,207=>390,208=>731,209=>725,210=>778,211=>778,212=>778,213=>778,214=>778,215=>676,216=>778,217=>725,218=>725,219=>725,220=>725,221=>704,222=>639,223=>553,224=>500,225=>500,226=>500,227=>500,228=>500,229=>500,230=>703,231=>435,232=>444,233=>444,234=>444,235=>444,236=>299,237=>299,238=>299,239=>299,240=>501,241=>554,242=>501,243=>501,244=>501,245=>501,246=>501,247=>676,248=>501,249=>564,250=>564,251=>564,252=>564,253=>482,254=>548,255=>482,256=>721,257=>500,258=>721,259=>500,260=>722,261=>500,262=>708,263=>435,264=>708,265=>435,266=>708,267=>435,268=>708,269=>435,270=>722,271=>692,272=>731,273=>556,274=>671,275=>444,276=>671,277=>444,278=>671,279=>444,280=>669,281=>444,282=>671,283=>444,284=>776,285=>500,286=>776,287=>500,288=>776,289=>500,290=>776,291=>500,292=>778,293=>554,294=>778,295=>556,296=>390,297=>299,298=>390,299=>299,300=>390,301=>299,302=>389,303=>299,304=>390,305=>299,306=>882,307=>610,308=>501,309=>397,310=>774,311=>555,312=>534,313=>668,314=>277,315=>668,316=>277,317=>668,318=>433,319=>668,320=>457,321=>667,322=>278,323=>725,324=>554,325=>725,326=>554,327=>725,328=>554,329=>626,330=>829,331=>556,332=>778,333=>501,334=>778,335=>501,336=>778,337=>501,338=>1000,339=>717,340=>719,341=>427,342=>719,343=>427,344=>719,345=>427,346=>568,347=>406,348=>568,349=>406,350=>556,351=>389,352=>568,353=>406,354=>645,355=>335,356=>645,357=>467,358=>667,359=>337,360=>725,361=>564,362=>725,363=>564,364=>725,365=>564,366=>725,367=>564,368=>725,369=>564,370=>725,371=>561,372=>982,373=>702,374=>704,375=>482,376=>704,377=>646,378=>444,379=>646,380=>444,381=>646,382=>444,383=>337,384=>556,385=>802,386=>659,387=>556,388=>667,389=>556,390=>708,391=>901,392=>605,393=>731,394=>875,395=>658,396=>554,397=>525,398=>665,399=>778,400=>622,401=>735,402=>383,403=>901,404=>782,405=>811,406=>327,407=>389,408=>846,409=>556,410=>298,411=>495,412=>976,413=>864,414=>556,415=>778,416=>793,417=>574,418=>1177,419=>794,420=>749,421=>556,422=>748,423=>568,424=>406,425=>650,426=>465,427=>343,428=>719,429=>391,430=>667,431=>768,432=>620,433=>770,434=>685,435=>833,436=>695,437=>667,438=>444,439=>593,440=>639,441=>508,442=>482,443=>500,444=>641,445=>520,446=>444,447=>611,448=>220,449=>418,450=>570,451=>333,452=>1331,453=>1158,454=>990,455=>1134,456=>987,457=>610,458=>1200,459=>1025,460=>889,461=>721,462=>500,463=>390,464=>299,465=>778,466=>501,467=>725,468=>564,469=>722,470=>564,471=>722,472=>564,473=>722,474=>564,475=>722,476=>564,477=>444,478=>721,479=>500,480=>722,481=>500,482=>987,483=>703,484=>778,485=>500,486=>776,487=>500,488=>774,489=>555,490=>778,491=>501,492=>778,493=>501,494=>593,495=>502,496=>397,497=>1331,498=>1158,499=>990,500=>776,501=>500,502=>995,503=>603,504=>725,505=>554,506=>722,507=>500,508=>987,509=>703,510=>778,511=>501,512=>721,513=>500,514=>721,515=>500,516=>671,517=>444,518=>671,519=>444,520=>390,521=>299,522=>390,523=>299,524=>778,525=>501,526=>778,527=>501,528=>719,529=>427,530=>719,531=>427,532=>725,533=>564,534=>725,535=>564,536=>568,537=>406,538=>645,539=>335,540=>464,541=>453,542=>778,543=>554,544=>731,545=>649,546=>568,547=>494,548=>667,549=>444,550=>721,551=>500,552=>667,553=>444,554=>778,555=>501,556=>778,557=>501,558=>778,559=>501,560=>778,561=>501,562=>704,563=>482,564=>437,565=>636,566=>413,567=>397,568=>776,569=>760,570=>722,571=>722,572=>444,573=>664,574=>667,575=>409,576=>451,577=>505,578=>479,579=>656,580=>750,581=>705,582=>667,583=>478,584=>500,585=>333,586=>760,587=>588,588=>712,589=>444,590=>722,591=>500,592=>500,593=>523,594=>523,595=>556,596=>434,597=>468,598=>633,599=>654,600=>444,601=>444,602=>611,603=>438,604=>440,605=>611,606=>459,607=>333,608=>660,609=>500,610=>549,611=>499,612=>582,613=>554,614=>556,615=>556,616=>303,617=>333,618=>293,619=>369,620=>397,621=>344,622=>667,623=>832,624=>833,625=>833,626=>626,627=>633,628=>502,629=>501,630=>744,631=>715,632=>711,633=>427,634=>444,635=>524,636=>444,637=>428,638=>394,639=>394,640=>538,641=>538,642=>406,643=>410,644=>406,645=>507,646=>499,647=>335,648=>392,649=>500,650=>557,651=>533,652=>482,653=>702,654=>482,655=>516,656=>672,657=>492,658=>502,659=>502,660=>438,661=>438,662=>438,663=>444,664=>778,665=>507,666=>460,667=>722,668=>582,669=>438,670=>555,671=>483,672=>604,673=>438,674=>438,675=>872,676=>878,677=>926,678=>654,679=>624,680=>722,681=>825,682=>646,683=>604,684=>490,685=>500,686=>611,687=>713,688=>367,689=>378,690=>243,691=>300,692=>291,693=>337,694=>368,695=>476,696=>330,697=>250,698=>500,699=>250,700=>250,701=>250,702=>300,703=>300,704=>333,705=>333,706=>333,707=>333,708=>333,709=>333,710=>333,711=>333,712=>200,713=>333,714=>333,715=>333,716=>200,717=>333,718=>333,719=>333,720=>250,721=>250,722=>300,723=>300,724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333,731=>333,732=>333,733=>333,734=>333,735=>352,736=>350,737=>181,738=>257,739=>333,740=>300,741=>526,742=>526,743=>526,744=>526,745=>526,746=>519,747=>519,748=>333,749=>333,750=>480,751=>333,752=>333,753=>333,754=>333,755=>327,756=>261,757=>333,758=>333,759=>400,760=>333,761=>175,762=>175,763=>175,764=>175,765=>333,766=>337,767=>432,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0,875=>0,876=>0,877=>0,878=>0,879=>0,884=>199,885=>200,890=>0,894=>333,900=>330,901=>415,902=>721,903=>250,904=>811,905=>938,906=>556,908=>840,910=>886,911=>879,912=>330,913=>721,914=>658,915=>611,916=>759,917=>671,918=>646,919=>778,920=>778,921=>390,922=>774,923=>722,924=>947,925=>725,926=>650,927=>778,928=>812,929=>639,931=>650,932=>645,933=>738,934=>868,935=>713,936=>924,937=>811,938=>390,939=>738,940=>605,941=>440,942=>605,943=>330,944=>550,945=>605,946=>550,947=>550,948=>550,949=>440,950=>495,951=>605,952=>550,953=>330,954=>608,955=>495,956=>605,957=>495,958=>495,959=>550,960=>605,961=>550,962=>440,963=>550,964=>440,965=>550,966=>660,967=>495,968=>715,969=>715,970=>330,971=>550,972=>550,973=>550,974=>715,976=>550,977=>605,978=>722,979=>871,980=>722,981=>660,982=>715,983=>550,984=>611,985=>550,986=>650,987=>514,988=>611,989=>513,990=>715,991=>439,992=>722,993=>605,994=>1022,995=>715,996=>626,997=>576,998=>616,999=>544,1000=>539,1001=>441,1002=>932,1003=>653,1004=>593,1005=>513,1006=>654,1007=>517,1008=>550,1009=>550,1010=>477,1011=>400,1012=>778,1013=>424,1014=>424,1015=>639,1016=>575,1017=>722,1018=>943,1019=>809,1020=>550,1021=>722,1022=>722,1023=>722,1024=>666,1025=>666,1026=>852,1027=>617,1028=>733,1029=>568,1030=>400,1031=>400,1032=>513,1033=>1062,1034=>1057,1035=>899,1036=>769,1037=>788,1038=>731,1039=>788,1040=>704,1041=>659,1042=>678,1043=>617,1044=>718,1045=>666,1046=>1104,1047=>654,1048=>788,1049=>788,1050=>769,1051=>793,1052=>957,1053=>788,1054=>828,1055=>814,1056=>659,1057=>733,1058=>649,1059=>731,1060=>864,1061=>713,1062=>788,1063=>768,1064=>1129,1065=>1129,1066=>794,1067=>984,1068=>659,1069=>747,1070=>1136,1071=>734,1072=>528,1073=>567,1074=>545,1075=>439,1076=>565,1077=>511,1078=>805,1079=>495,1080=>572,1081=>572,1082=>566,1083=>551,1084=>682,1085=>572,1086=>571,1087=>572,1088=>591,1089=>495,1090=>501,1091=>482,1092=>879,1093=>508,1094=>566,1095=>564,1096=>833,1097=>827,1098=>647,1099=>764,1100=>545,1101=>539,1102=>800,1103=>563,1104=>511,1105=>511,1106=>592,1107=>439,1108=>539,1109=>436,1110=>291,1111=>299,1112=>400,1113=>812,1114=>824,1115=>570,1116=>566,1117=>572,1118=>482,1119=>572,1120=>1066,1121=>769,1122=>796,1123=>648,1124=>1033,1125=>778,1126=>977,1127=>685,1128=>1363,1129=>971,1130=>1086,1131=>778,1132=>1466,1133=>1062,1134=>650,1135=>462,1136=>974,1137=>771,1138=>828,1139=>661,1140=>808,1141=>578,1142=>808,1143=>590,1144=>1214,1145=>962,1146=>992,1147=>744,1148=>1066,1149=>769,1150=>1066,1151=>769,1152=>694,1153=>483,1154=>258,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>788,1163=>569,1164=>659,1165=>548,1166=>659,1167=>594,1168=>618,1169=>459,1170=>618,1171=>439,1172=>666,1173=>585,1174=>1155,1175=>843,1176=>670,1177=>495,1178=>833,1179=>610,1180=>815,1181=>597,1182=>901,1183=>676,1184=>874,1185=>636,1186=>788,1187=>572,1188=>986,1189=>693,1190=>1086,1191=>864,1192=>913,1193=>666,1194=>733,1195=>495,1196=>649,1197=>501,1198=>712,1199=>609,1200=>712,1201=>609,1202=>790,1203=>567,1204=>1043,1205=>785,1206=>768,1207=>562,1208=>824,1209=>598,1210=>768,1211=>570,1212=>960,1213=>637,1214=>960,1215=>637,1216=>400,1217=>1104,1218=>805,1219=>742,1220=>557,1221=>793,1222=>551,1223=>788,1224=>570,1225=>788,1226=>572,1227=>768,1228=>564,1229=>957,1230=>682,1231=>400,1232=>704,1233=>528,1234=>704,1235=>528,1236=>989,1237=>725,1238=>667,1239=>511,1240=>828,1241=>511,1242=>778,1243=>511,1244=>1104,1245=>805,1246=>654,1247=>495,1248=>626,1249=>472,1250=>788,1251=>572,1252=>788,1253=>572,1254=>828,1255=>571,1256=>828,1257=>571,1258=>778,1259=>571,1260=>747,1261=>539,1262=>731,1263=>482,1264=>731,1265=>482,1266=>731,1267=>500,1268=>768,1269=>564,1270=>627,1271=>435,1272=>984,1273=>764,1281=>544,1296=>660,1297=>495,1298=>793,1299=>551,1306=>778,1307=>588,1308=>994,1309=>716,1310=>769,1311=>566,1329=>889,1330=>787,1331=>858,1332=>941,1333=>775,1334=>765,1335=>805,1336=>762,1337=>938,1338=>869,1339=>765,1340=>756,1341=>966,1342=>992,1343=>748,1344=>469,1345=>731,1346=>941,1347=>745,1348=>966,1349=>641,1350=>929,1351=>774,1352=>779,1353=>784,1354=>841,1355=>775,1356=>955,1357=>779,1358=>927,1359=>555,1360=>763,1361=>641,1362=>656,1363=>824,1364=>869,1365=>768,1366=>754,1369=>300,1370=>300,1371=>270,1372=>307,1373=>270,1374=>324,1375=>322,1377=>818,1378=>548,1379=>601,1380=>608,1381=>551,1382=>547,1383=>496,1384=>548,1385=>586,1386=>585,1387=>548,1388=>269,1389=>798,1390=>594,1391=>544,1392=>548,1393=>513,1394=>583,1395=>560,1396=>551,1397=>397,1398=>567,1399=>447,1400=>548,1401=>411,1402=>810,1403=>464,1404=>548,1405=>551,1406=>595,1407=>821,1408=>548,1409=>557,1410=>312,1411=>821,1412=>550,1413=>511,1414=>668,1415=>602,1417=>333,1418=>349,1423=>818,1425=>0,1426=>0,1427=>0,1428=>0,1429=>0,1430=>0,1431=>0,1432=>0,1433=>0,1434=>0,1435=>0,1436=>0,1437=>0,1438=>0,1439=>0,1440=>0,1441=>0,1442=>0,1443=>0,1444=>0,1445=>0,1446=>0,1447=>0,1448=>0,1449=>0,1450=>0,1451=>0,1452=>0,1453=>0,1454=>0,1455=>0,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>433,1471=>0,1472=>155,1473=>0,1474=>0,1475=>400,1476=>0,1477=>0,1478=>347,1479=>0,1488=>593,1489=>498,1490=>339,1491=>523,1492=>561,1493=>266,1494=>291,1495=>559,1496=>576,1497=>266,1498=>496,1499=>501,1500=>510,1501=>542,1502=>581,1503=>273,1504=>347,1505=>512,1506=>552,1507=>493,1508=>491,1509=>537,1510=>561,1511=>544,1512=>502,1513=>716,1514=>571,1520=>532,1521=>532,1522=>532,1523=>396,1524=>432,1536=>600,1537=>1000,1538=>800,1539=>800,1542=>549,1543=>549,1544=>724,1545=>599,1546=>729,1547=>635,1548=>226,1549=>344,1550=>640,1551=>616,1552=>0,1553=>0,1554=>0,1555=>0,1556=>0,1557=>0,1558=>0,1559=>0,1560=>0,1561=>0,1562=>0,1563=>333,1566=>407,1567=>500,1568=>742,1569=>350,1570=>264,1571=>264,1572=>329,1573=>264,1574=>742,1575=>264,1576=>899,1577=>424,1578=>897,1579=>897,1580=>655,1581=>655,1582=>655,1583=>397,1584=>397,1585=>358,1586=>331,1587=>901,1588=>901,1589=>909,1590=>909,1591=>557,1592=>550,1593=>595,1594=>602,1595=>901,1596=>901,1597=>742,1598=>742,1599=>742,1600=>408,1601=>858,1602=>635,1603=>446,1604=>601,1605=>489,1606=>591,1607=>424,1608=>329,1609=>742,1610=>742,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1622=>0,1623=>0,1624=>0,1625=>0,1626=>0,1627=>0,1628=>0,1629=>0,1630=>0,1631=>0,1632=>500,1633=>500,1634=>500,1635=>500,1636=>500,1637=>500,1638=>500,1639=>500,1640=>500,1641=>500,1642=>449,1643=>212,1644=>235,1645=>487,1646=>899,1647=>665,1648=>0,1649=>264,1650=>264,1651=>264,1652=>300,1653=>356,1654=>472,1655=>462,1656=>752,1657=>897,1658=>897,1659=>897,1660=>897,1661=>897,1662=>899,1663=>897,1664=>897,1665=>655,1666=>655,1667=>655,1668=>655,1669=>655,1670=>655,1671=>655,1672=>397,1673=>397,1674=>397,1675=>397,1676=>397,1677=>397,1678=>397,1679=>397,1680=>397,1681=>358,1682=>358,1683=>355,1684=>358,1685=>520,1686=>358,1687=>345,1688=>345,1689=>345,1690=>901,1691=>901,1692=>901,1693=>909,1694=>909,1695=>557,1696=>595,1697=>858,1698=>858,1699=>858,1700=>858,1701=>858,1702=>858,1703=>635,1704=>665,1705=>901,1706=>1108,1707=>901,1708=>446,1709=>446,1710=>446,1711=>901,1712=>901,1713=>901,1714=>901,1715=>901,1716=>901,1717=>601,1718=>601,1719=>601,1720=>601,1721=>591,1722=>591,1723=>591,1724=>591,1725=>591,1726=>470,1727=>655,1728=>394,1729=>399,1730=>399,1731=>399,1732=>329,1733=>329,1734=>329,1735=>329,1736=>329,1737=>329,1738=>329,1739=>329,1740=>742,1741=>776,1742=>742,1743=>329,1744=>742,1745=>742,1746=>752,1747=>752,1748=>395,1749=>394,1750=>0,1751=>0,1752=>0,1753=>0,1754=>0,1755=>0,1756=>0,1757=>1132,1758=>970,1759=>0,1760=>0,1761=>0,1762=>0,1763=>0,1764=>321,1765=>329,1766=>500,1767=>0,1768=>0,1769=>760,1770=>0,1771=>0,1772=>0,1773=>0,1774=>397,1775=>338,1776=>500,1777=>500,1778=>500,1779=>500,1780=>500,1781=>500,1782=>500,1783=>500,1784=>500,1785=>500,1786=>901,1787=>909,1788=>602,1789=>300,1790=>300,1791=>447,1872=>897,1873=>897,1874=>897,1875=>897,1876=>897,1877=>897,1878=>897,1879=>655,1880=>655,1881=>397,1882=>397,1883=>418,1884=>901,1885=>595,1886=>595,1887=>595,1888=>858,1889=>858,1890=>901,1891=>901,1892=>901,1893=>489,1894=>489,1895=>591,1896=>591,1897=>591,1898=>658,1899=>358,1900=>358,1901=>901,1902=>655,1903=>655,1904=>901,1905=>358,1906=>655,1907=>264,1908=>264,1909=>742,1910=>742,1911=>792,1912=>329,1913=>329,1914=>752,1915=>752,1916=>655,1917=>901,1918=>901,1919=>446,1920=>450,1921=>501,1922=>582,1923=>544,1924=>482,1925=>433,1926=>448,1927=>462,1928=>474,1929=>471,1930=>469,1931=>537,1932=>499,1933=>514,1934=>471,1935=>572,1936=>880,1937=>440,1938=>476,1939=>594,1940=>469,1941=>448,1942=>441,1943=>519,1944=>573,1945=>459,1946=>447,1947=>496,1948=>541,1949=>887,1950=>883,1951=>964,1952=>558,1953=>505,1954=>471,1955=>554,1956=>459,1957=>486,1958=>36,1959=>36,1960=>43,1961=>45,1962=>43,1963=>45,1964=>45,1965=>45,1966=>45,1967=>45,1968=>0,1969=>412,2304=>0,2305=>0,2306=>0,2307=>398,2308=>862,2309=>862,2310=>1092,2311=>575,2312=>575,2313=>597,2314=>848,2315=>968,2316=>828,2317=>655,2318=>655,2319=>655,2320=>655,2321=>1092,2322=>1092,2323=>1092,2324=>1092,2325=>744,2326=>798,2327=>695,2328=>695,2329=>773,2330=>735,2331=>888,2332=>814,2333=>834,2334=>735,2335=>629,2336=>629,2337=>674,2338=>609,2339=>695,2340=>655,2341=>695,2342=>589,2343=>695,2344=>655,2345=>655,2346=>615,2347=>789,2348=>622,2349=>695,2350=>695,2351=>695,2352=>495,2353=>495,2354=>788,2355=>848,2356=>848,2357=>622,2358=>788,2359=>615,2360=>735,2361=>609,2362=>341,2363=>342,2364=>0,2365=>570,2366=>342,2367=>342,2368=>342,2369=>0,2370=>0,2371=>0,2372=>0,2373=>0,2374=>0,2375=>0,2376=>0,2377=>342,2378=>342,2379=>342,2380=>342,2381=>0,2382=>442,2383=>342,2384=>1047,2385=>0,2386=>0,2387=>0,2388=>0,2389=>0,2390=>0,2391=>0,2392=>744,2393=>798,2394=>695,2395=>864,2396=>674,2397=>609,2398=>789,2399=>695,2400=>968,2401=>828,2402=>0,2403=>0,2404=>475,2405=>730,2406=>455,2407=>419,2408=>569,2409=>509,2410=>701,2411=>628,2412=>569,2413=>701,2414=>608,2415=>608,2416=>625,2417=>398,2418=>862,2419=>862,2420=>1092,2421=>1092,2422=>862,2423=>862,2425=>814,2426=>695,2427=>655,2428=>814,2429=>628,2430=>674,2431=>622,2561=>0,2562=>0,2563=>385,2565=>781,2566=>982,2567=>789,2568=>860,2569=>559,2570=>559,2575=>589,2576=>781,2579=>559,2580=>781,2581=>538,2582=>650,2583=>650,2584=>781,2585=>589,2586=>589,2587=>699,2588=>650,2589=>589,2590=>589,2591=>589,2592=>589,2593=>559,2594=>589,2595=>589,2596=>559,2597=>650,2598=>589,2599=>650,2600=>626,2602=>650,2603=>570,2604=>650,2605=>559,2606=>650,2607=>781,2608=>490,2610=>626,2611=>626,2613=>589,2614=>650,2616=>650,2617=>490,2620=>0,2622=>320,2623=>260,2624=>320,2625=>0,2626=>0,2631=>0,2632=>0,2635=>0,2636=>0,2637=>0,2641=>0,2649=>650,2650=>650,2651=>650,2652=>559,2654=>570,2662=>420,2663=>350,2664=>490,2665=>434,2666=>574,2667=>455,2668=>452,2669=>490,2670=>504,2671=>504,2672=>0,2673=>0,2674=>589,2675=>559,2676=>808,2677=>0,3458=>254,3459=>254,3461=>616,3462=>932,3463=>908,3464=>907,3465=>626,3466=>624,3467=>763,3468=>1119,3469=>1029,3470=>1311,3471=>1050,3472=>1477,3473=>677,3474=>746,3475=>1338,3476=>741,3477=>741,3478=>1180,3482=>894,3483=>715,3484=>715,3485=>719,3486=>741,3487=>834,3488=>719,3489=>677,3490=>677,3491=>1302,3492=>1005,3493=>919,3494=>681,3495=>719,3496=>677,3497=>741,3498=>677,3499=>1123,3500=>743,3501=>779,3502=>677,3503=>444,3504=>741,3505=>921,3507=>444,3508=>677,3509=>677,3510=>715,3511=>787,3512=>719,3513=>741,3514=>719,3515=>604,3517=>763,3520=>719,3521=>715,3522=>677,3523=>719,3524=>787,3525=>763,3526=>677,3530=>0,3535=>329,3536=>319,3537=>319,3538=>0,3539=>0,3540=>0,3542=>0,3544=>329,3545=>691,3546=>1062,3547=>1333,3548=>1278,3549=>1235,3550=>1292,3551=>461,3570=>680,3571=>481,3572=>948,3585=>590,3586=>578,3587=>661,3588=>592,3589=>592,3590=>699,3591=>447,3592=>534,3593=>692,3594=>578,3595=>659,3596=>899,3597=>804,3598=>633,3599=>637,3600=>484,3601=>730,3602=>876,3603=>915,3604=>592,3605=>592,3606=>578,3607=>670,3608=>542,3609=>671,3610=>621,3611=>618,3612=>621,3613=>617,3614=>708,3615=>708,3616=>637,3617=>589,3618=>552,3619=>484,3620=>590,3621=>569,3622=>637,3623=>526,3624=>599,3625=>802,3626=>579,3627=>668,3628=>778,3629=>560,3630=>514,3631=>510,3632=>412,3633=>0,3634=>423,3635=>452,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0,3647=>665,3648=>357,3649=>624,3650=>529,3651=>486,3652=>475,3653=>423,3654=>500,3655=>0,3656=>0,3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0,3663=>657,3664=>548,3665=>548,3666=>592,3667=>614,3668=>631,3669=>643,3670=>508,3671=>744,3672=>622,3673=>585,3674=>721,3675=>1381,4256=>540,4257=>544,4258=>639,4259=>718,4260=>553,4261=>545,4262=>541,4263=>810,4264=>540,4265=>541,4266=>921,4267=>540,4268=>529,4269=>810,4270=>540,4271=>540,4272=>810,4273=>545,4274=>642,4275=>643,4276=>659,4277=>538,4278=>718,4279=>541,4280=>592,4281=>535,4282=>586,4283=>540,4284=>628,4285=>521,4286=>548,4287=>630,4288=>541,4289=>541,4290=>660,4291=>544,4292=>542,4293=>498,4304=>522,4305=>518,4306=>621,4307=>716,4308=>517,4309=>519,4310=>518,4311=>796,4312=>518,4313=>518,4314=>934,4315=>517,4316=>519,4317=>787,4318=>515,4319=>514,4320=>788,4321=>573,4322=>620,4323=>593,4324=>639,4325=>516,4326=>714,4327=>518,4328=>572,4329=>518,4330=>555,4331=>518,4332=>559,4333=>509,4334=>572,4335=>677,4336=>523,4337=>517,4338=>595,4339=>480,4340=>519,4341=>484,4342=>838,4343=>517,4344=>516,4345=>621,4346=>522,4347=>450,4348=>389,5024=>718,5025=>768,5026=>633,5027=>878,5028=>1001,5029=>371,5030=>576,5031=>754,5032=>531,5033=>774,5034=>692,5035=>499,5036=>668,5037=>829,5038=>575,5039=>681,5040=>485,5041=>607,5042=>885,5043=>974,5044=>588,5045=>583,5046=>726,5047=>947,5048=>558,5049=>832,5050=>1096,5051=>780,5052=>595,5053=>869,5054=>752,5055=>710,5056=>761,5057=>802,5058=>760,5059=>656,5060=>655,5061=>982,5062=>684,5063=>801,5064=>805,5065=>1042,5066=>755,5067=>612,5068=>707,5069=>889,5070=>584,5071=>623,5072=>536,5073=>763,5074=>763,5075=>581,5076=>1052,5077=>600,5078=>730,5079=>714,5080=>714,5081=>697,5082=>543,5083=>943,5084=>718,5085=>630,5086=>660,5087=>692,5088=>841,5089=>861,5090=>617,5091=>733,5092=>898,5093=>896,5094=>781,5095=>612,5096=>830,5097=>948,5098=>886,5099=>757,5100=>796,5101=>578,5102=>601,5103=>797,5104=>623,5105=>886,5106=>730,5107=>827,5108=>648,7424=>474,7425=>775,7426=>703,7427=>507,7428=>492,7429=>546,7430=>546,7431=>487,7432=>440,7433=>299,7434=>389,7435=>556,7436=>483,7437=>683,7438=>502,7439=>552,7440=>492,7441=>534,7442=>507,7443=>663,7444=>717,7445=>384,7446=>552,7447=>552,7448=>471,7449=>539,7450=>538,7451=>448,7452=>522,7453=>508,7454=>680,7455=>510,7456=>474,7457=>696,7458=>423,7459=>409,7460=>463,7461=>681,7462=>410,7463=>476,7464=>553,7465=>432,7466=>630,7467=>536,7468=>474,7469=>774,7470=>507,7471=>507,7472=>546,7473=>487,7474=>487,7475=>549,7476=>582,7477=>293,7478=>389,7479=>556,7480=>483,7481=>683,7482=>502,7483=>502,7484=>552,7485=>350,7486=>471,7487=>538,7488=>448,7489=>522,7490=>696,7491=>336,7492=>336,7493=>346,7494=>460,7495=>364,7496=>367,7497=>294,7498=>294,7499=>283,7500=>283,7501=>334,7502=>181,7503=>372,7504=>555,7505=>355,7506=>334,7507=>290,7508=>1000,7509=>1000,7510=>366,7511=>232,7512=>369,7513=>356,7514=>560,7515=>333,7516=>452,7517=>360,7518=>361,7519=>367,7520=>440,7521=>331,7522=>181,7523=>300,7524=>369,7525=>333,7526=>363,7527=>361,7528=>363,7529=>440,7530=>331,7543=>500,7544=>513,7579=>347,7580=>297,7581=>315,7582=>331,7583=>284,7584=>260,7585=>260,7586=>334,7587=>367,7588=>199,7589=>229,7590=>196,7591=>196,7592=>290,7593=>246,7595=>317,7596=>527,7597=>559,7598=>401,7599=>424,7600=>334,7601=>329,7602=>452,7603=>250,7604=>322,7605=>237,7606=>374,7607=>356,7608=>354,7609=>351,7610=>325,7611=>277,7612=>437,7613=>316,7614=>327,7615=>328,7680=>721,7681=>500,7682=>658,7683=>545,7684=>658,7685=>545,7686=>658,7687=>545,7688=>708,7689=>435,7690=>731,7691=>552,7692=>731,7693=>552,7694=>731,7695=>552,7696=>724,7697=>556,7698=>731,7699=>552,7700=>667,7701=>444,7702=>667,7703=>444,7704=>671,7705=>444,7706=>671,7707=>444,7708=>667,7709=>444,7710=>617,7711=>393,7712=>776,7713=>500,7714=>778,7715=>554,7716=>778,7717=>554,7718=>778,7719=>554,7720=>774,7721=>556,7722=>778,7723=>554,7724=>390,7725=>299,7726=>389,7727=>299,7728=>774,7729=>555,7730=>774,7731=>555,7732=>774,7733=>555,7734=>668,7735=>277,7736=>668,7737=>277,7738=>668,7739=>277,7740=>668,7741=>277,7742=>947,7743=>832,7744=>947,7745=>832,7746=>947,7747=>832,7748=>725,7749=>554,7750=>725,7751=>554,7752=>725,7753=>554,7754=>725,7755=>554,7756=>778,7757=>501,7758=>778,7759=>501,7760=>778,7761=>501,7762=>778,7763=>501,7764=>639,7765=>545,7766=>639,7767=>545,7768=>719,7769=>427,7770=>719,7771=>427,7772=>719,7773=>427,7774=>719,7775=>427,7776=>568,7777=>406,7778=>568,7779=>406,7780=>556,7781=>406,7782=>556,7783=>406,7784=>568,7785=>406,7786=>645,7787=>335,7788=>645,7789=>335,7790=>645,7791=>335,7792=>645,7793=>335,7794=>725,7795=>564,7796=>725,7797=>564,7798=>725,7799=>564,7800=>722,7801=>564,7802=>722,7803=>564,7804=>705,7805=>482,7806=>705,7807=>482,7808=>982,7809=>702,7810=>982,7811=>702,7812=>982,7813=>702,7814=>982,7815=>702,7816=>982,7817=>702,7818=>713,7819=>508,7820=>713,7821=>508,7822=>704,7823=>482,7824=>646,7825=>444,7826=>646,7827=>444,7828=>646,7829=>444,7830=>554,7831=>335,7832=>702,7833=>482,7834=>507,7835=>337,7836=>333,7837=>333,7838=>792,7839=>534,7840=>721,7841=>500,7842=>721,7843=>500,7844=>721,7845=>500,7846=>721,7847=>500,7848=>721,7849=>500,7850=>722,7851=>500,7852=>721,7853=>500,7854=>722,7855=>500,7856=>722,7857=>500,7858=>722,7859=>603,7860=>722,7861=>500,7862=>721,7863=>500,7864=>671,7865=>444,7866=>671,7867=>444,7868=>671,7869=>444,7870=>671,7871=>444,7872=>671,7873=>444,7874=>671,7875=>444,7876=>667,7877=>444,7878=>671,7879=>444,7880=>390,7881=>299,7882=>390,7883=>299,7884=>778,7885=>501,7886=>778,7887=>501,7888=>778,7889=>501,7890=>778,7891=>501,7892=>778,7893=>501,7894=>778,7895=>501,7896=>778,7897=>501,7898=>774,7899=>574,7900=>774,7901=>574,7902=>774,7903=>549,7904=>793,7905=>574,7906=>793,7907=>574,7908=>725,7909=>564,7910=>725,7911=>564,7912=>838,7913=>672,7914=>838,7915=>672,7916=>825,7917=>659,7918=>768,7919=>620,7920=>768,7921=>620,7922=>704,7923=>482,7924=>704,7925=>482,7926=>704,7927=>482,7928=>704,7929=>482,7936=>605,7937=>605,7938=>605,7939=>605,7940=>605,7941=>605,7942=>605,7943=>605,7944=>721,7945=>721,7946=>830,7947=>833,7948=>761,7949=>798,7950=>721,7951=>721,7952=>440,7953=>440,7954=>440,7955=>440,7956=>440,7957=>440,7960=>817,7961=>826,7962=>944,7963=>970,7964=>964,7965=>1009,7968=>605,7969=>605,7970=>605,7971=>605,7972=>605,7973=>605,7974=>605,7975=>605,7976=>926,7977=>921,7978=>1038,7979=>1064,7980=>1092,7981=>1102,7982=>1005,7983=>991,7984=>330,7985=>330,7986=>330,7987=>330,7988=>330,7989=>330,7990=>330,7991=>330,7992=>534,7993=>541,7994=>653,7995=>659,7996=>705,7997=>714,7998=>612,7999=>614,8000=>550,8001=>550,8002=>550,8003=>550,8004=>550,8005=>550,8008=>885,8009=>886,8010=>1038,8011=>1052,8012=>997,8013=>1021,8016=>550,8017=>550,8018=>550,8019=>550,8020=>550,8021=>550,8022=>550,8023=>550,8025=>870,8027=>1014,8029=>1043,8031=>944,8032=>715,8033=>715,8034=>715,8035=>715,8036=>715,8037=>715,8038=>715,8039=>715,8040=>905,8041=>913,8042=>1066,8043=>1085,8044=>1034,8045=>1044,8046=>980,8047=>961,8048=>605,8049=>605,8050=>440,8051=>440,8052=>605,8053=>605,8054=>330,8055=>330,8056=>550,8057=>550,8058=>550,8059=>550,8060=>715,8061=>715,8064=>605,8065=>605,8066=>605,8067=>605,8068=>605,8069=>605,8070=>605,8071=>605,8072=>886,8073=>887,8074=>985,8075=>993,8076=>937,8077=>956,8078=>874,8079=>878,8080=>605,8081=>605,8082=>605,8083=>605,8084=>605,8085=>605,8086=>605,8087=>605,8088=>1096,8089=>1092,8090=>1223,8091=>1250,8092=>1270,8093=>1283,8094=>1174,8095=>1162,8096=>715,8097=>715,8098=>715,8099=>715,8100=>715,8101=>715,8102=>715,8103=>715,8104=>1057,8105=>1073,8106=>1228,8107=>1251,8108=>1202,8109=>1210,8110=>1151,8111=>1131,8112=>605,8113=>605,8114=>605,8115=>605,8116=>605,8118=>605,8119=>605,8120=>721,8121=>721,8122=>721,8123=>721,8124=>883,8125=>500,8126=>0,8127=>500,8128=>500,8129=>550,8130=>605,8131=>605,8132=>605,8134=>605,8135=>605,8136=>790,8137=>830,8138=>909,8139=>931,8140=>950,8141=>500,8142=>500,8143=>500,8144=>330,8145=>330,8146=>330,8147=>330,8150=>330,8151=>330,8152=>390,8153=>390,8154=>506,8155=>550,8157=>500,8158=>500,8159=>500,8160=>550,8161=>550,8162=>550,8163=>550,8164=>550,8165=>550,8166=>550,8167=>550,8168=>738,8169=>738,8170=>858,8171=>880,8172=>764,8173=>550,8174=>550,8175=>500,8178=>715,8179=>715,8180=>715,8182=>715,8183=>715,8184=>884,8185=>857,8186=>927,8187=>892,8188=>988,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>500,8200=>250,8201=>166,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>500,8211=>500,8212=>1000,8213=>1000,8214=>333,8215=>478,8216=>250,8217=>250,8218=>250,8219=>250,8220=>500,8221=>500,8222=>500,8223=>500,8224=>500,8225=>500,8226=>500,8227=>500,8228=>250,8229=>500,8230=>1000,8231=>250,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>166,8240=>1000,8241=>1588,8242=>250,8243=>492,8244=>714,8245=>270,8246=>484,8247=>693,8248=>469,8249=>333,8250=>333,8251=>727,8252=>666,8253=>695,8254=>500,8255=>953,8256=>953,8257=>338,8258=>931,8259=>500,8260=>167,8261=>332,8262=>332,8263=>1000,8264=>833,8265=>833,8266=>500,8267=>540,8268=>600,8269=>600,8270=>500,8271=>333,8272=>953,8273=>500,8274=>497,8275=>576,8276=>953,8277=>785,8278=>450,8279=>881,8280=>620,8281=>620,8282=>179,8283=>621,8284=>569,8285=>179,8286=>179,8287=>111,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>300,8305=>185,8308=>300,8309=>300,8310=>300,8311=>300,8312=>300,8313=>300,8314=>300,8315=>300,8316=>300,8317=>216,8318=>216,8319=>373,8320=>300,8321=>274,8322=>300,8323=>300,8324=>300,8325=>300,8326=>300,8327=>300,8328=>300,8329=>300,8330=>300,8331=>300,8332=>300,8333=>216,8334=>216,8336=>336,8337=>294,8338=>334,8339=>333,8340=>308,8352=>710,8353=>722,8354=>783,8355=>611,8356=>500,8357=>833,8358=>722,8359=>960,8360=>1101,8361=>1000,8362=>889,8363=>532,8364=>761,8365=>742,8366=>631,8367=>1435,8368=>579,8369=>609,8370=>639,8371=>660,8372=>556,8373=>500,8376=>524,8377=>675,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8413=>0,8414=>0,8415=>0,8416=>0,8417=>0,8421=>0,8423=>0,8424=>0,8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8448=>694,8449=>692,8451=>1009,8453=>687,8454=>717,8455=>622,8456=>709,8457=>923,8458=>500,8459=>1035,8462=>556,8463=>556,8464=>952,8465=>637,8466=>800,8467=>457,8468=>835,8470=>896,8471=>855,8472=>644,8475=>757,8476=>905,8478=>722,8479=>722,8480=>991,8481=>1186,8482=>1086,8483=>722,8486=>771,8487=>771,8489=>333,8490=>774,8491=>721,8492=>806,8494=>551,8495=>444,8497=>873,8498=>617,8499=>1203,8501=>593,8502=>498,8503=>339,8504=>523,8506=>906,8507=>1181,8523=>778,8525=>1048,8526=>408,8531=>800,8532=>800,8533=>800,8534=>800,8535=>800,8536=>800,8537=>800,8538=>800,8539=>800,8540=>800,8541=>800,8542=>800,8543=>800,8544=>390,8545=>760,8546=>1138,8547=>1098,8548=>705,8549=>1098,8550=>1474,8551=>1850,8552=>1096,8553=>713,8554=>1095,8555=>1472,8556=>668,8557=>708,8558=>731,8559=>947,8560=>299,8561=>560,8562=>827,8563=>758,8564=>482,8565=>769,8566=>1033,8567=>1293,8568=>768,8569=>508,8570=>783,8571=>1049,8572=>277,8573=>435,8574=>552,8575=>832,8592=>900,8593=>523,8594=>900,8595=>523,8596=>900,8597=>523,8598=>900,8599=>900,8600=>900,8601=>900,8602=>900,8603=>900,8604=>1152,8605=>1152,8606=>900,8607=>523,8608=>900,8609=>523,8610=>1000,8611=>1000,8612=>900,8613=>552,8614=>900,8615=>552,8616=>524,8617=>900,8618=>900,8619=>900,8620=>900,8621=>1168,8622=>900,8624=>622,8625=>622,8630=>1069,8631=>1060,8632=>964,8633=>964,8634=>980,8635=>980,8636=>964,8637=>964,8638=>557,8639=>556,8640=>964,8641=>964,8642=>557,8643=>556,8644=>964,8645=>964,8646=>964,8647=>964,8648=>964,8649=>964,8650=>964,8651=>964,8652=>964,8653=>964,8654=>964,8655=>964,8656=>964,8657=>630,8658=>964,8659=>630,8660=>964,8661=>630,8662=>1063,8663=>1063,8664=>1063,8665=>1063,8666=>964,8667=>964,8668=>1100,8669=>1100,8672=>964,8674=>964,8676=>964,8677=>964,8704=>627,8705=>548,8706=>558,8707=>627,8708=>627,8709=>746,8710=>759,8711=>759,8712=>576,8713=>576,8714=>439,8715=>576,8716=>576,8717=>439,8718=>500,8719=>812,8720=>812,8721=>713,8722=>676,8723=>676,8724=>676,8725=>540,8726=>540,8727=>500,8728=>500,8729=>500,8730=>550,8731=>550,8732=>550,8733=>752,8734=>752,8735=>509,8736=>555,8737=>555,8738=>555,8739=>240,8740=>531,8741=>478,8742=>705,8743=>694,8744=>694,8745=>694,8746=>694,8747=>493,8748=>793,8749=>1103,8756=>629,8757=>629,8760=>676,8761=>947,8763=>676,8764=>676,8765=>676,8766=>803,8768=>305,8769=>676,8770=>676,8771=>676,8773=>676,8776=>676,8777=>676,8778=>676,8781=>676,8782=>676,8783=>676,8784=>676,8785=>676,8786=>676,8787=>676,8788=>947,8789=>947,8790=>676,8791=>676,8796=>676,8800=>570,8801=>676,8802=>676,8804=>570,8805=>570,8806=>676,8807=>676,8808=>676,8809=>676,8810=>1047,8811=>1047,8812=>450,8813=>676,8814=>676,8815=>676,8816=>676,8817=>676,8818=>676,8819=>676,8820=>676,8821=>676,8822=>676,8823=>676,8824=>676,8825=>676,8826=>676,8827=>676,8828=>676,8829=>676,8830=>676,8831=>676,8832=>676,8833=>676,8834=>676,8835=>676,8836=>676,8837=>676,8838=>676,8839=>676,8840=>676,8841=>676,8842=>676,8843=>676,8846=>694,8847=>676,8848=>676,8849=>676,8850=>676,8851=>694,8852=>694,8853=>738,8854=>738,8855=>738,8856=>738,8857=>738,8858=>738,8859=>738,8861=>738,8862=>678,8863=>678,8864=>678,8865=>678,8866=>487,8867=>487,8868=>752,8869=>752,8871=>487,8873=>659,8874=>831,8876=>587,8877=>587,8878=>759,8879=>759,8882=>676,8883=>676,8884=>676,8885=>676,8886=>1380,8887=>1380,8888=>1027,8890=>626,8891=>694,8892=>694,8893=>694,8900=>512,8903=>676,8904=>759,8905=>632,8906=>632,8907=>831,8908=>831,8909=>676,8910=>734,8911=>734,8912=>676,8913=>676,8914=>694,8915=>694,8916=>694,8918=>676,8919=>676,8920=>1441,8921=>1441,8922=>676,8923=>676,8924=>676,8925=>676,8926=>676,8927=>676,8928=>676,8929=>676,8930=>676,8931=>676,8934=>676,8935=>676,8936=>676,8937=>676,8938=>676,8939=>676,8940=>676,8941=>676,8960=>737,8968=>411,8969=>411,8970=>411,8971=>411,8976=>680,8994=>951,8995=>951,9001=>398,9002=>398,9251=>500,9472=>1000,9473=>1000,9474=>1000,9475=>1000,9476=>1000,9477=>1000,9478=>1000,9479=>1000,9480=>1000,9481=>1000,9482=>1000,9483=>1000,9484=>1000,9485=>1000,9486=>1000,9487=>1000,9488=>1000,9489=>1000,9490=>1000,9491=>1000,9492=>1000,9493=>1000,9494=>1000,9495=>1000,9496=>1000,9497=>1000,9498=>1000,9499=>1000,9500=>1000,9501=>1000,9502=>1000,9503=>1000,9504=>1000,9505=>1000,9506=>1000,9507=>1000,9508=>1000,9509=>1000,9510=>1000,9511=>1000,9512=>1000,9513=>1000,9514=>1000,9515=>1000,9516=>1000,9517=>1000,9518=>1000,9519=>1000,9520=>1000,9521=>1000,9522=>1000,9523=>1000,9524=>1000,9525=>1000,9526=>1000,9527=>1000,9528=>1000,9529=>1000,9530=>1000,9531=>1000,9532=>1000,9533=>1000,9534=>1000,9535=>1000,9536=>1000,9537=>1000,9538=>1000,9539=>1000,9540=>1000,9541=>1000,9542=>1000,9543=>1000,9544=>1000,9545=>1000,9546=>1000,9547=>1000,9552=>1000,9553=>1000,9554=>1000,9555=>1000,9556=>1000,9557=>1000,9558=>1000,9559=>1000,9560=>1000,9561=>1000,9562=>1000,9563=>1000,9564=>1000,9565=>1000,9566=>1000,9567=>1000,9568=>1000,9569=>1000,9570=>1000,9571=>1000,9572=>1000,9573=>1000,9574=>1000,9575=>1000,9576=>1000,9577=>1000,9578=>1000,9579=>1000,9580=>1000,9600=>1000,9601=>1000,9602=>1000,9603=>1000,9604=>1000,9605=>1000,9606=>1000,9607=>1000,9608=>1000,9609=>1000,9610=>1000,9611=>1000,9612=>1000,9613=>1000,9614=>1000,9615=>1000,9616=>1000,9617=>1000,9618=>1000,9619=>1000,9620=>1000,9621=>1000,9622=>1000,9623=>1000,9624=>1000,9625=>1000,9626=>1000,9627=>1000,9628=>1000,9629=>1000,9630=>1000,9631=>1000,9632=>678,9633=>678,9642=>309,9644=>825,9645=>825,9646=>678,9647=>678,9650=>840,9651=>681,9654=>681,9655=>681,9660=>681,9661=>681,9664=>681,9665=>681,9670=>580,9671=>580,9674=>494,9675=>791,9676=>791,9679=>738,9688=>500,9702=>500,9711=>855,9733=>1003,9734=>1003,9824=>618,9825=>645,9826=>587,9827=>582,9828=>582,9829=>645,9830=>587,9831=>618,9833=>333,9834=>556,9835=>778,9836=>778,9837=>556,9838=>556,9839=>556,10214=>561,10215=>561,11392=>760,11393=>568,11394=>545,11395=>444,11396=>598,11397=>433,11398=>1039,11399=>760,11400=>681,11401=>502,11402=>572,11403=>405,11404=>583,11405=>463,11406=>698,11407=>529,11408=>754,11409=>555,11410=>338,11411=>258,11412=>688,11413=>524,11414=>700,11415=>521,11416=>799,11417=>609,11418=>708,11419=>537,11420=>546,11421=>411,11422=>778,11423=>541,11424=>724,11425=>524,11426=>545,11427=>446,11428=>676,11429=>498,11430=>615,11431=>433,11432=>759,11433=>589,11434=>800,11435=>670,11436=>669,11437=>512,11438=>801,11439=>609,11440=>1003,11441=>743,11517=>266,11518=>617,11519=>307,11799=>333,42560=>657,42561=>444,42571=>494,42576=>1114,42577=>887,42580=>1107,42581=>758,42582=>1085,42583=>768,42600=>778,42601=>501,42790=>774,42791=>551,42792=>953,42793=>752,42794=>652,42795=>452,42796=>478,42797=>422,42798=>662,42799=>612,42888=>333,42889=>278,42890=>282,42891=>349,42892=>278,42893=>774,42896=>722,42897=>556,42922=>925,43002=>832,64256=>670,64257=>565,64258=>558,64259=>842,64260=>835,64261=>611,64262=>738,64275=>1105,64276=>1105,64277=>1099,64278=>1105,64279=>1361,64285=>266,64286=>0,64287=>532,64288=>552,64297=>570,64298=>716,64299=>716,64300=>716,64301=>716,64302=>593,64303=>593,64304=>593,64305=>498,64306=>339,64307=>523,64308=>561,64309=>266,64310=>291,64312=>576,64313=>266,64314=>496,64315=>501,64316=>510,64318=>581,64320=>347,64321=>512,64323=>493,64324=>491,64326=>561,64327=>544,64328=>502,64329=>716,64330=>571,64331=>266,64332=>498,64333=>501,64334=>491,64335=>593,64336=>264,64337=>247,64338=>897,64339=>897,64340=>328,64341=>338,64342=>898,64343=>898,64344=>328,64345=>335,64346=>897,64347=>897,64348=>338,64349=>338,64350=>897,64351=>897,64352=>328,64353=>338,64354=>897,64355=>897,64356=>348,64357=>338,64358=>897,64359=>897,64360=>328,64361=>338,64362=>858,64363=>858,64364=>360,64365=>328,64366=>858,64367=>858,64368=>360,64369=>328,64370=>655,64371=>688,64372=>597,64373=>597,64374=>655,64375=>688,64376=>597,64377=>597,64378=>655,64379=>688,64380=>597,64381=>597,64382=>655,64383=>750,64384=>597,64385=>597,64386=>440,64387=>397,64388=>397,64389=>397,64390=>397,64391=>397,64392=>397,64393=>397,64394=>345,64395=>345,64396=>338,64397=>338,64398=>901,64399=>950,64400=>453,64401=>489,64402=>901,64403=>950,64404=>451,64405=>489,64406=>901,64407=>950,64408=>451,64409=>489,64410=>901,64411=>950,64412=>451,64413=>489,64414=>591,64415=>591,64416=>591,64417=>591,64418=>328,64419=>333,64420=>394,64421=>423,64422=>424,64423=>399,64424=>314,64425=>314,64426=>470,64427=>470,64428=>470,64429=>486,64430=>752,64431=>752,64432=>752,64433=>752,64434=>344,64435=>344,64436=>484,64437=>484,64438=>508,64439=>508,64440=>508,64441=>508,64442=>565,64443=>508,64444=>335,64445=>344,64446=>344,64447=>342,64448=>354,64449=>354,64467=>648,64468=>648,64469=>453,64470=>489,64471=>359,64472=>329,64473=>359,64474=>329,64475=>359,64476=>329,64477=>462,64478=>329,64479=>329,64480=>329,64481=>329,64482=>329,64483=>329,64484=>742,64485=>725,64486=>301,64487=>339,64488=>301,64489=>339,64508=>742,64509=>725,64510=>301,64511=>275,65010=>1048,65020=>1135,65136=>300,65137=>408,65138=>373,65139=>373,65140=>300,65142=>300,65143=>408,65144=>300,65145=>408,65146=>300,65147=>408,65148=>300,65149=>408,65150=>351,65151=>408,65152=>350,65153=>264,65154=>247,65155=>264,65156=>247,65157=>329,65158=>329,65159=>264,65160=>247,65161=>742,65162=>725,65163=>301,65164=>339,65165=>264,65166=>247,65167=>899,65168=>957,65169=>328,65170=>340,65171=>424,65172=>423,65173=>897,65174=>957,65175=>328,65176=>338,65177=>897,65178=>957,65179=>348,65180=>338,65181=>655,65182=>688,65183=>574,65184=>602,65185=>655,65186=>688,65187=>610,65188=>602,65189=>655,65190=>688,65191=>610,65192=>602,65193=>397,65194=>397,65195=>397,65196=>397,65197=>358,65198=>348,65199=>351,65200=>348,65201=>901,65202=>901,65203=>641,65204=>601,65205=>901,65206=>901,65207=>641,65208=>601,65209=>909,65210=>909,65211=>823,65212=>803,65213=>909,65214=>909,65215=>850,65216=>820,65217=>557,65218=>557,65219=>541,65220=>504,65221=>550,65222=>557,65223=>535,65224=>495,65225=>595,65226=>552,65227=>694,65228=>517,65229=>602,65230=>577,65231=>694,65232=>517,65233=>858,65234=>858,65235=>346,65236=>328,65237=>635,65238=>635,65239=>346,65240=>328,65241=>446,65242=>648,65243=>453,65244=>489,65245=>601,65246=>672,65247=>238,65248=>280,65249=>489,65250=>478,65251=>473,65252=>534,65253=>591,65254=>591,65255=>328,65256=>333,65257=>424,65258=>423,65259=>470,65260=>406,65261=>329,65262=>401,65263=>742,65264=>725,65265=>742,65266=>725,65267=>301,65268=>275,65269=>476,65270=>614,65271=>476,65272=>614,65273=>476,65274=>614,65275=>476,65276=>614,65279=>0,65529=>0,65530=>0,65531=>0,65532=>800,65533=>900,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifb.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifb.z
new file mode 100644
index 00000000..4b124cec
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifb.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifbi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifbi.ctg.z
new file mode 100644
index 00000000..976cdc16
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifbi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifbi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifbi.php
new file mode 100644
index 00000000..b04b76d0
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifbi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='FreeSerifBoldItalic';
+$up=-125;
+$ut=50;
+$dw=600;
+$diff='';
+$originalsize=608708;
+$enc='';
+$file='freeserifbi.z';
+$ctg='freeserifbi.ctg.z';
+$desc=array('Flags'=>96,'FontBBox'=>'[-787 -300 1732 900]','ItalicAngle'=>-16.45875,'Ascent'=>900,'Descent'=>-200,'Leading'=>100,'CapHeight'=>669,'XHeight'=>475,'StemV'=>123,'StemH'=>53,'AvgWidth'=>596,'MaxWidth'=>1668,'MissingWidth'=>600);
+$cw=array(0=>600,32=>250,33=>389,34=>555,35=>500,36=>500,37=>833,38=>778,39=>278,40=>333,41=>333,42=>500,43=>570,44=>250,45=>333,46=>250,47=>335,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>250,59=>250,60=>570,61=>576,62=>570,63=>500,64=>832,65=>696,66=>640,67=>620,68=>723,69=>630,70=>609,71=>706,72=>753,73=>374,74=>500,75=>663,76=>609,77=>876,78=>705,79=>676,80=>600,81=>677,82=>667,83=>506,84=>593,85=>714,86=>703,87=>928,88=>699,89=>639,90=>562,91=>333,92=>400,93=>333,94=>570,95=>500,96=>333,97=>509,98=>481,99=>428,100=>510,101=>417,102=>485,103=>490,104=>546,105=>292,106=>333,107=>509,108=>294,109=>763,110=>526,111=>474,112=>482,113=>496,114=>400,115=>356,116=>286,117=>530,118=>439,119=>652,120=>476,121=>433,122=>410,123=>348,124=>270,125=>348,126=>570,160=>250,161=>389,162=>410,163=>522,164=>560,165=>645,166=>220,167=>500,168=>333,169=>747,170=>266,171=>500,172=>606,173=>333,174=>747,175=>333,176=>400,177=>570,178=>300,179=>300,180=>333,181=>576,182=>500,183=>250,184=>333,185=>272,186=>300,187=>500,188=>750,189=>750,190=>750,191=>500,192=>696,193=>696,194=>696,195=>696,196=>696,197=>696,198=>911,199=>620,200=>630,201=>630,202=>630,203=>630,204=>374,205=>374,206=>374,207=>374,208=>723,209=>705,210=>676,211=>676,212=>676,213=>676,214=>676,215=>570,216=>676,217=>714,218=>714,219=>714,220=>714,221=>639,222=>597,223=>580,224=>509,225=>509,226=>509,227=>509,228=>509,229=>509,230=>697,231=>417,232=>417,233=>417,234=>417,235=>417,236=>292,237=>292,238=>292,239=>292,240=>450,241=>526,242=>474,243=>474,244=>474,245=>474,246=>474,247=>570,248=>474,249=>530,250=>530,251=>530,252=>530,253=>433,254=>492,255=>433,256=>696,257=>509,258=>696,259=>509,260=>734,261=>509,262=>620,263=>428,264=>620,265=>428,266=>620,267=>428,268=>620,269=>428,270=>723,271=>609,272=>723,273=>505,274=>630,275=>417,276=>630,277=>417,278=>630,279=>417,280=>610,281=>417,282=>667,283=>417,284=>706,285=>490,286=>706,287=>490,288=>706,289=>490,290=>706,291=>490,292=>753,293=>546,294=>758,295=>547,296=>389,297=>292,298=>389,299=>292,300=>389,301=>292,302=>421,303=>292,304=>389,305=>292,306=>834,307=>516,308=>500,309=>333,310=>667,311=>509,312=>514,313=>609,314=>294,315=>609,316=>294,317=>638,318=>382,319=>609,320=>434,321=>609,322=>304,323=>705,324=>526,325=>705,326=>526,327=>705,328=>526,329=>526,330=>793,331=>495,332=>676,333=>474,334=>676,335=>474,336=>676,337=>474,338=>875,339=>680,340=>667,341=>400,342=>667,343=>400,344=>667,345=>400,346=>506,347=>356,348=>506,349=>356,350=>508,351=>337,352=>506,353=>356,354=>593,355=>286,356=>593,357=>426,358=>593,359=>317,360=>714,361=>530,362=>714,363=>530,364=>714,365=>530,366=>714,367=>530,368=>714,369=>530,370=>722,371=>556,372=>928,373=>652,374=>639,375=>433,376=>639,377=>562,378=>410,379=>562,380=>410,381=>562,382=>410,383=>485,384=>492,385=>778,386=>648,387=>486,388=>640,389=>502,390=>702,391=>870,392=>600,393=>723,394=>860,395=>717,396=>505,397=>546,398=>670,399=>629,400=>608,401=>639,402=>435,403=>885,404=>629,405=>738,406=>284,407=>389,408=>748,409=>489,410=>324,411=>508,412=>853,413=>824,414=>506,415=>670,416=>804,417=>579,418=>1014,419=>755,420=>718,421=>484,422=>661,423=>526,424=>400,425=>701,426=>455,427=>333,428=>611,429=>385,430=>611,431=>879,432=>665,433=>724,434=>626,435=>694,436=>591,437=>562,438=>417,439=>609,440=>614,441=>481,442=>428,443=>500,444=>604,445=>448,446=>406,447=>483,448=>260,449=>418,450=>570,451=>333,452=>1296,453=>1123,454=>889,455=>1109,456=>887,457=>556,458=>1132,459=>945,460=>789,461=>696,462=>509,463=>374,464=>292,465=>676,466=>474,467=>714,468=>530,469=>722,470=>530,471=>722,472=>530,473=>722,474=>530,475=>722,476=>530,477=>417,478=>696,479=>509,480=>667,481=>509,482=>911,483=>697,484=>730,485=>510,486=>706,487=>490,488=>663,489=>509,490=>667,491=>474,492=>667,493=>474,494=>609,495=>470,496=>333,497=>1335,498=>1123,499=>889,500=>706,501=>490,502=>992,503=>595,504=>705,505=>526,506=>667,507=>509,508=>911,509=>698,510=>676,511=>474,512=>696,513=>509,514=>696,515=>509,516=>630,517=>417,518=>630,519=>417,520=>374,521=>292,522=>374,523=>292,524=>676,525=>474,526=>676,527=>474,528=>667,529=>400,530=>667,531=>400,532=>714,533=>530,534=>714,535=>530,536=>506,537=>356,538=>593,539=>286,540=>506,541=>491,542=>753,543=>546,544=>719,545=>558,546=>568,547=>500,548=>667,549=>444,550=>696,551=>509,552=>610,553=>417,554=>676,555=>474,556=>676,557=>474,558=>676,559=>474,560=>722,561=>474,562=>639,563=>433,564=>422,565=>591,566=>393,567=>333,568=>810,569=>810,570=>695,571=>620,572=>428,573=>609,574=>593,575=>356,576=>410,577=>476,578=>467,579=>640,580=>714,581=>722,582=>610,583=>399,584=>500,585=>394,586=>732,587=>574,588=>669,589=>409,590=>671,591=>438,592=>509,593=>570,594=>570,595=>483,596=>444,597=>412,598=>476,599=>644,600=>408,601=>409,602=>546,603=>448,604=>463,605=>527,606=>472,607=>359,608=>656,609=>456,610=>494,611=>506,612=>582,613=>546,614=>556,615=>526,616=>318,617=>299,618=>278,619=>378,620=>378,621=>277,622=>639,623=>783,624=>728,625=>727,626=>489,627=>504,628=>513,629=>461,630=>700,631=>688,632=>604,633=>420,634=>389,635=>435,636=>389,637=>389,638=>424,639=>364,640=>496,641=>516,642=>365,643=>505,644=>505,645=>433,646=>601,647=>319,648=>286,649=>550,650=>503,651=>486,652=>439,653=>652,654=>458,655=>406,656=>604,657=>473,658=>470,659=>503,660=>390,661=>387,662=>427,663=>437,664=>778,665=>487,666=>453,667=>655,668=>540,669=>429,670=>509,671=>446,672=>604,673=>380,674=>395,675=>752,676=>848,677=>820,678=>607,679=>595,680=>656,681=>831,682=>585,683=>535,684=>458,685=>463,686=>529,687=>586,688=>396,689=>397,690=>242,691=>243,692=>267,693=>341,694=>368,695=>440,696=>300,697=>250,698=>408,699=>250,700=>250,701=>250,702=>300,703=>300,704=>340,705=>340,706=>333,707=>333,708=>333,709=>333,710=>333,711=>333,712=>333,713=>333,714=>333,715=>333,716=>300,717=>333,718=>333,719=>333,720=>278,721=>278,722=>300,723=>300,724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333,731=>333,732=>333,733=>333,734=>333,735=>352,736=>374,737=>227,738=>264,739=>340,740=>340,741=>526,742=>526,743=>526,744=>526,745=>526,746=>519,747=>519,748=>333,749=>333,750=>480,751=>333,752=>333,753=>333,754=>333,755=>327,756=>261,757=>333,758=>333,759=>400,760=>278,761=>175,762=>175,763=>175,764=>175,765=>0,766=>337,767=>432,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0,875=>0,876=>0,877=>0,878=>0,879=>0,885=>199,890=>0,894=>333,900=>330,901=>333,902=>696,903=>250,904=>819,905=>955,906=>539,908=>835,910=>961,911=>889,912=>312,913=>696,914=>640,915=>576,916=>751,917=>630,918=>562,919=>753,920=>675,921=>389,922=>663,923=>696,924=>889,925=>705,926=>629,927=>675,928=>753,929=>600,931=>701,932=>621,933=>710,934=>799,935=>699,936=>919,937=>750,938=>374,939=>710,940=>570,941=>439,942=>548,943=>312,944=>536,945=>570,946=>538,947=>532,948=>506,949=>439,950=>437,951=>548,952=>477,953=>312,954=>549,955=>510,956=>589,957=>522,958=>494,959=>512,960=>612,961=>513,962=>468,963=>525,964=>444,965=>536,966=>615,967=>495,968=>693,969=>687,970=>312,971=>536,972=>512,973=>536,974=>687,976=>489,977=>613,978=>722,979=>931,980=>722,981=>623,982=>688,983=>527,984=>615,985=>512,986=>608,987=>508,988=>598,989=>543,990=>708,991=>377,992=>731,993=>631,1008=>534,1009=>519,1010=>477,1011=>333,1012=>670,1013=>411,1014=>439,1015=>597,1016=>533,1017=>631,1018=>889,1019=>761,1020=>506,1021=>637,1022=>631,1023=>637,1024=>630,1025=>630,1026=>768,1027=>576,1028=>637,1029=>506,1030=>374,1031=>374,1032=>500,1033=>1053,1034=>1019,1035=>831,1036=>710,1037=>753,1038=>739,1039=>753,1040=>696,1041=>648,1042=>640,1043=>576,1044=>760,1045=>630,1046=>1052,1047=>651,1048=>753,1049=>753,1050=>710,1051=>786,1052=>876,1053=>753,1054=>676,1055=>753,1056=>600,1057=>620,1058=>593,1059=>739,1060=>799,1061=>699,1062=>754,1063=>693,1064=>1111,1065=>1111,1066=>756,1067=>959,1068=>624,1069=>689,1070=>1038,1071=>757,1072=>509,1073=>478,1074=>467,1075=>374,1076=>456,1077=>417,1078=>941,1079=>458,1080=>530,1081=>530,1082=>538,1083=>580,1084=>752,1085=>533,1086=>474,1087=>526,1088=>482,1089=>428,1090=>763,1091=>496,1092=>759,1093=>476,1094=>529,1095=>529,1096=>776,1097=>777,1098=>663,1099=>744,1100=>506,1101=>458,1102=>733,1103=>572,1104=>417,1105=>417,1106=>541,1107=>374,1108=>454,1109=>356,1110=>292,1111=>292,1112=>333,1113=>802,1114=>754,1115=>545,1116=>538,1117=>530,1118=>496,1119=>530,1120=>948,1121=>693,1122=>751,1123=>760,1124=>1005,1125=>718,1126=>906,1127=>732,1128=>1222,1129=>923,1130=>1052,1131=>828,1132=>1377,1133=>1014,1134=>604,1135=>446,1136=>938,1137=>779,1138=>667,1139=>517,1140=>796,1141=>584,1142=>796,1143=>584,1144=>1131,1145=>907,1146=>864,1147=>616,1148=>959,1149=>690,1150=>948,1151=>635,1152=>608,1153=>434,1154=>372,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>778,1163=>544,1164=>634,1165=>499,1166=>624,1167=>483,1168=>601,1169=>448,1170=>606,1171=>448,1172=>719,1173=>529,1174=>1080,1175=>941,1176=>651,1177=>450,1178=>772,1179=>538,1180=>780,1181=>558,1182=>750,1183=>538,1184=>862,1185=>688,1186=>754,1187=>533,1188=>965,1189=>664,1190=>1089,1191=>783,1192=>661,1193=>522,1194=>637,1195=>419,1196=>614,1197=>769,1198=>639,1199=>660,1200=>638,1201=>660,1202=>694,1203=>500,1204=>984,1205=>579,1206=>713,1207=>538,1208=>713,1209=>529,1210=>727,1211=>546,1212=>850,1213=>570,1214=>844,1215=>570,1216=>374,1217=>1052,1218=>941,1219=>705,1220=>509,1221=>786,1222=>580,1223=>753,1224=>483,1225=>753,1226=>539,1227=>703,1228=>485,1229=>876,1230=>758,1231=>374,1232=>696,1233=>509,1234=>696,1235=>509,1236=>891,1237=>646,1238=>630,1239=>417,1240=>609,1241=>403,1242=>609,1243=>403,1244=>1052,1245=>941,1246=>651,1247=>458,1248=>604,1249=>479,1250=>753,1251=>539,1252=>753,1253=>539,1254=>676,1255=>474,1256=>670,1257=>461,1258=>670,1259=>461,1260=>689,1261=>458,1262=>739,1263=>496,1264=>739,1265=>496,1266=>739,1267=>496,1268=>693,1269=>529,1270=>606,1271=>428,1272=>959,1273=>744,1296=>652,1297=>480,1298=>786,1299=>530,1306=>677,1307=>496,1308=>928,1309=>652,1310=>736,1311=>544,1329=>889,1330=>787,1331=>858,1332=>941,1333=>775,1334=>765,1335=>805,1336=>762,1337=>938,1338=>869,1339=>765,1340=>756,1341=>966,1342=>992,1343=>748,1344=>469,1345=>731,1346=>941,1347=>745,1348=>966,1349=>641,1350=>929,1351=>774,1352=>779,1353=>784,1354=>841,1355=>775,1356=>955,1357=>779,1358=>927,1359=>555,1360=>763,1361=>641,1362=>656,1363=>824,1364=>869,1365=>768,1366=>754,1369=>300,1370=>300,1371=>270,1372=>307,1373=>270,1374=>324,1375=>322,1377=>818,1378=>548,1379=>601,1380=>608,1381=>551,1382=>547,1383=>496,1384=>548,1385=>586,1386=>585,1387=>548,1388=>269,1389=>798,1390=>594,1391=>544,1392=>548,1393=>513,1394=>583,1395=>560,1396=>551,1397=>397,1398=>567,1399=>447,1400=>548,1401=>411,1402=>810,1403=>464,1404=>548,1405=>551,1406=>595,1407=>821,1408=>548,1409=>557,1410=>312,1411=>821,1412=>550,1413=>511,1414=>668,1415=>602,1417=>333,1418=>349,1423=>759,1425=>0,1426=>0,1427=>0,1428=>0,1429=>0,1430=>0,1431=>0,1432=>0,1433=>0,1434=>0,1435=>0,1436=>0,1437=>0,1438=>0,1439=>0,1440=>0,1441=>0,1442=>0,1443=>0,1444=>0,1445=>0,1446=>0,1447=>0,1448=>0,1449=>0,1450=>0,1451=>0,1452=>0,1453=>0,1454=>0,1455=>0,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>433,1471=>0,1472=>155,1473=>0,1474=>0,1475=>400,1476=>0,1477=>0,1478=>347,1479=>0,1488=>593,1489=>498,1490=>339,1491=>523,1492=>561,1493=>266,1494=>291,1495=>559,1496=>576,1497=>266,1498=>496,1499=>501,1500=>510,1501=>542,1502=>581,1503=>273,1504=>347,1505=>512,1506=>552,1507=>493,1508=>491,1509=>537,1510=>561,1511=>544,1512=>502,1513=>716,1514=>571,1520=>532,1521=>532,1522=>532,1523=>396,1524=>432,3585=>590,3586=>578,3587=>661,3588=>592,3589=>592,3590=>699,3591=>447,3592=>534,3593=>692,3594=>578,3595=>659,3596=>899,3597=>804,3598=>633,3599=>637,3600=>484,3601=>730,3602=>876,3603=>915,3604=>592,3605=>592,3606=>578,3607=>670,3608=>542,3609=>671,3610=>621,3611=>618,3612=>621,3613=>617,3614=>708,3615=>708,3616=>637,3617=>589,3618=>552,3619=>484,3620=>590,3621=>569,3622=>637,3623=>526,3624=>599,3625=>802,3626=>579,3627=>668,3628=>778,3629=>560,3630=>514,3631=>510,3632=>442,3633=>0,3634=>423,3635=>452,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0,3647=>665,3648=>357,3649=>624,3650=>529,3651=>486,3652=>475,3653=>423,3654=>500,3655=>0,3656=>0,3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0,3663=>657,3664=>548,3665=>548,3666=>592,3667=>614,3668=>631,3669=>643,3670=>508,3671=>744,3672=>622,3673=>585,3674=>721,3675=>1381,4256=>475,4257=>469,4258=>573,4259=>650,4260=>502,4261=>506,4262=>481,4263=>746,4264=>491,4265=>495,4266=>888,4267=>488,4268=>464,4269=>745,4270=>483,4271=>489,4272=>721,4273=>464,4274=>578,4275=>590,4276=>611,4277=>491,4278=>663,4279=>489,4280=>544,4281=>479,4282=>527,4283=>488,4284=>560,4285=>461,4286=>467,4287=>546,4288=>483,4289=>487,4290=>562,4291=>477,4292=>491,4293=>471,4304=>522,4305=>518,4306=>621,4307=>716,4308=>517,4309=>519,4310=>518,4311=>796,4312=>518,4313=>518,4314=>934,4315=>517,4316=>519,4317=>787,4318=>515,4319=>514,4320=>788,4321=>573,4322=>620,4323=>593,4324=>639,4325=>516,4326=>714,4327=>518,4328=>572,4329=>518,4330=>555,4331=>518,4332=>562,4333=>509,4334=>572,4335=>677,4336=>523,4337=>517,4338=>595,4339=>480,4340=>519,4341=>484,4342=>838,4343=>517,4344=>516,4345=>621,4346=>522,4347=>410,4348=>389,5024=>718,5025=>768,5026=>633,5027=>878,5028=>1001,5029=>371,5030=>576,5031=>754,5032=>531,5033=>774,5034=>692,5035=>499,5036=>668,5037=>829,5038=>575,5039=>681,5040=>485,5041=>607,5042=>885,5043=>974,5044=>588,5045=>583,5046=>726,5047=>947,5048=>558,5049=>832,5050=>1096,5051=>780,5052=>595,5053=>869,5054=>752,5055=>710,5056=>761,5057=>802,5058=>760,5059=>656,5060=>655,5061=>982,5062=>684,5063=>801,5064=>805,5065=>1042,5066=>755,5067=>612,5068=>707,5069=>889,5070=>584,5071=>623,5072=>536,5073=>763,5074=>763,5075=>549,5076=>1052,5077=>600,5078=>730,5079=>714,5080=>714,5081=>697,5082=>543,5083=>943,5084=>718,5085=>630,5086=>660,5087=>692,5088=>841,5089=>861,5090=>617,5091=>733,5092=>898,5093=>896,5094=>781,5095=>612,5096=>830,5097=>948,5098=>886,5099=>757,5100=>796,5101=>578,5102=>601,5103=>797,5104=>623,5105=>886,5106=>730,5107=>827,5108=>648,7424=>611,7425=>587,7426=>683,7427=>437,7428=>428,7429=>450,7431=>401,7432=>463,7433=>306,7434=>268,7435=>449,7436=>404,7437=>536,7439=>443,7448=>361,7450=>390,7451=>350,7452=>449,7456=>384,7457=>527,7458=>395,7579=>385,7581=>285,7582=>341,7583=>320,7588=>218,7589=>242,7592=>380,7593=>236,7596=>497,7597=>529,7598=>401,7599=>404,7600=>364,7601=>349,7602=>412,7603=>224,7604=>332,7605=>197,7606=>344,7607=>356,7608=>354,7609=>334,7612=>453,7613=>318,7614=>317,7615=>348,7680=>696,7681=>509,7682=>640,7683=>481,7684=>640,7685=>481,7686=>640,7687=>481,7688=>620,7689=>417,7690=>723,7691=>510,7692=>723,7693=>510,7694=>723,7695=>510,7696=>723,7697=>495,7698=>723,7699=>510,7700=>618,7701=>417,7702=>618,7703=>417,7704=>630,7705=>417,7706=>630,7707=>417,7708=>610,7709=>417,7710=>609,7711=>485,7712=>706,7713=>490,7714=>753,7715=>546,7716=>753,7717=>546,7718=>753,7719=>546,7720=>758,7721=>546,7722=>753,7723=>546,7724=>374,7725=>292,7726=>374,7727=>292,7728=>663,7729=>509,7730=>663,7731=>509,7732=>663,7733=>509,7734=>609,7735=>294,7736=>609,7737=>294,7738=>609,7739=>294,7740=>609,7741=>294,7742=>876,7743=>763,7744=>876,7745=>763,7746=>876,7747=>763,7748=>705,7749=>526,7750=>705,7751=>526,7752=>705,7753=>526,7754=>705,7755=>526,7756=>722,7757=>474,7758=>722,7759=>474,7760=>722,7761=>474,7762=>722,7763=>474,7764=>600,7765=>482,7766=>600,7767=>482,7768=>667,7769=>400,7770=>667,7771=>400,7772=>667,7773=>400,7774=>667,7775=>400,7776=>506,7777=>356,7778=>506,7779=>356,7780=>556,7781=>356,7782=>556,7783=>356,7784=>506,7785=>356,7786=>593,7787=>286,7788=>593,7789=>286,7790=>593,7791=>286,7792=>593,7793=>286,7794=>714,7795=>530,7796=>714,7797=>530,7798=>714,7799=>530,7800=>722,7801=>530,7802=>714,7803=>530,7804=>703,7805=>439,7806=>703,7807=>439,7808=>928,7809=>652,7810=>928,7811=>652,7812=>928,7813=>652,7814=>928,7815=>652,7816=>928,7817=>652,7818=>699,7819=>476,7820=>699,7821=>476,7822=>639,7823=>433,7824=>562,7825=>410,7826=>562,7827=>410,7828=>562,7829=>410,7830=>546,7831=>286,7832=>652,7833=>433,7834=>509,7835=>485,7836=>465,7837=>465,7838=>830,7839=>506,7840=>696,7841=>509,7842=>696,7843=>509,7844=>696,7845=>509,7846=>696,7847=>509,7848=>696,7849=>509,7850=>696,7851=>509,7852=>696,7853=>509,7854=>667,7855=>509,7856=>667,7857=>509,7858=>667,7859=>509,7860=>667,7861=>509,7862=>696,7863=>509,7864=>630,7865=>417,7866=>630,7867=>417,7868=>630,7869=>417,7870=>630,7871=>417,7872=>630,7873=>417,7874=>630,7875=>417,7876=>618,7877=>417,7878=>630,7879=>417,7880=>374,7881=>292,7882=>374,7883=>292,7884=>676,7885=>474,7886=>676,7887=>474,7888=>676,7889=>474,7890=>676,7891=>474,7892=>676,7893=>474,7894=>686,7895=>474,7896=>676,7897=>474,7898=>804,7899=>579,7900=>804,7901=>579,7902=>804,7903=>579,7904=>804,7905=>579,7906=>804,7907=>579,7908=>714,7909=>530,7910=>714,7911=>530,7912=>879,7913=>665,7914=>879,7915=>665,7916=>879,7917=>665,7918=>879,7919=>665,7920=>879,7921=>665,7922=>639,7923=>433,7924=>639,7925=>433,7926=>639,7927=>433,7928=>639,7929=>433,7936=>570,7937=>570,7938=>570,7939=>570,7940=>570,7941=>570,7942=>570,7943=>570,7944=>696,7945=>696,7946=>830,7947=>841,7948=>811,7949=>812,7950=>755,7951=>746,7952=>439,7953=>439,7954=>439,7955=>439,7956=>439,7957=>439,7960=>787,7961=>818,7962=>917,7963=>931,7964=>954,7965=>948,7968=>548,7969=>548,7970=>548,7971=>548,7972=>548,7973=>548,7974=>548,7975=>548,7976=>937,7977=>960,7978=>1073,7979=>1092,7980=>1109,7981=>1115,7982=>1020,7983=>1032,7984=>312,7985=>312,7986=>312,7987=>312,7988=>312,7989=>312,7990=>312,7991=>312,7992=>517,7993=>564,7994=>670,7995=>686,7996=>706,7997=>707,7998=>635,7999=>627,8000=>512,8001=>512,8002=>512,8003=>512,8004=>512,8005=>512,8008=>822,8009=>841,8010=>999,8011=>1031,8012=>963,8013=>971,8016=>536,8017=>536,8018=>536,8019=>536,8020=>536,8021=>536,8022=>536,8023=>536,8025=>949,8027=>1065,8029=>1098,8031=>1017,8032=>687,8033=>687,8034=>687,8035=>687,8036=>687,8037=>687,8038=>687,8039=>687,8040=>885,8041=>919,8042=>1092,8043=>1097,8044=>1058,8045=>1050,8046=>1009,8047=>985,8048=>570,8049=>570,8050=>439,8051=>439,8052=>548,8053=>548,8054=>312,8055=>312,8056=>512,8057=>512,8058=>536,8059=>536,8060=>687,8061=>687,8064=>570,8065=>570,8066=>570,8067=>570,8068=>570,8069=>570,8070=>570,8071=>570,8072=>842,8073=>847,8074=>981,8075=>991,8076=>957,8077=>955,8078=>897,8079=>893,8080=>548,8081=>548,8082=>548,8083=>548,8084=>548,8085=>548,8086=>548,8087=>548,8088=>1042,8089=>1066,8090=>1188,8091=>1199,8092=>1206,8093=>1211,8094=>1124,8095=>1129,8096=>687,8097=>687,8098=>687,8099=>687,8100=>687,8101=>687,8102=>687,8103=>687,8104=>1030,8105=>1066,8106=>1234,8107=>1247,8108=>1199,8109=>1194,8110=>1147,8111=>1135,8112=>570,8113=>570,8114=>570,8115=>570,8116=>570,8118=>570,8119=>570,8120=>696,8121=>696,8122=>696,8123=>696,8124=>835,8125=>250,8126=>0,8127=>250,8128=>500,8129=>400,8130=>548,8131=>548,8132=>548,8134=>548,8135=>548,8136=>737,8137=>762,8138=>883,8139=>919,8140=>859,8141=>500,8142=>500,8143=>500,8144=>312,8145=>312,8146=>312,8147=>312,8150=>312,8151=>312,8152=>389,8153=>389,8154=>519,8155=>552,8157=>500,8158=>500,8159=>500,8160=>536,8161=>536,8162=>536,8163=>536,8164=>513,8165=>513,8166=>536,8167=>536,8168=>710,8169=>710,8170=>895,8171=>890,8172=>801,8173=>550,8174=>550,8175=>250,8178=>687,8179=>687,8180=>687,8182=>687,8183=>687,8184=>814,8185=>776,8186=>883,8187=>864,8188=>882,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>500,8200=>250,8201=>166,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>500,8211=>500,8212=>1000,8213=>1000,8214=>333,8215=>478,8216=>250,8217=>250,8218=>250,8219=>250,8220=>500,8221=>500,8222=>500,8223=>500,8224=>500,8225=>500,8226=>500,8227=>500,8228=>250,8229=>500,8230=>850,8231=>0,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>250,8239=>166,8240=>1000,8241=>1618,8242=>278,8243=>556,8244=>834,8245=>270,8246=>468,8247=>630,8248=>469,8249=>333,8250=>333,8251=>727,8252=>778,8253=>733,8254=>500,8255=>953,8256=>953,8257=>338,8258=>931,8259=>500,8260=>167,8261=>332,8262=>332,8263=>1000,8264=>889,8265=>889,8266=>500,8267=>453,8268=>600,8269=>600,8270=>500,8271=>250,8272=>953,8273=>500,8274=>521,8275=>576,8276=>953,8277=>785,8278=>410,8279=>881,8280=>620,8281=>620,8282=>179,8283=>621,8284=>569,8285=>179,8286=>179,8287=>111,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>300,8305=>219,8308=>300,8309=>300,8310=>300,8311=>300,8312=>300,8313=>300,8314=>300,8315=>300,8316=>300,8317=>216,8318=>216,8319=>362,8320=>300,8321=>274,8322=>300,8323=>300,8324=>300,8325=>300,8326=>300,8327=>300,8328=>300,8329=>300,8330=>300,8331=>300,8332=>300,8333=>216,8334=>216,8336=>350,8337=>296,8338=>320,8339=>337,8340=>298,8352=>667,8353=>667,8354=>667,8355=>667,8356=>500,8357=>742,8358=>722,8359=>1008,8360=>953,8361=>889,8362=>889,8363=>532,8364=>761,8365=>742,8366=>631,8367=>1435,8368=>579,8369=>609,8370=>639,8371=>742,8372=>576,8373=>500,8376=>524,8377=>675,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8413=>0,8414=>0,8415=>0,8416=>0,8417=>0,8421=>0,8423=>0,8424=>0,8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8448=>624,8449=>625,8451=>964,8453=>623,8454=>727,8455=>608,8456=>685,8457=>881,8458=>500,8459=>1035,8462=>546,8463=>543,8464=>972,8465=>613,8466=>820,8467=>457,8468=>849,8470=>846,8471=>888,8472=>649,8475=>769,8476=>926,8478=>721,8479=>725,8480=>991,8481=>1080,8482=>1016,8483=>713,8486=>750,8487=>750,8489=>312,8490=>663,8491=>696,8492=>825,8494=>540,8495=>417,8497=>923,8498=>625,8499=>1253,8501=>537,8502=>537,8503=>350,8504=>537,8506=>942,8507=>1080,8523=>738,8525=>1072,8526=>440,8531=>800,8532=>800,8533=>800,8534=>800,8535=>800,8536=>800,8537=>800,8538=>800,8539=>800,8540=>800,8541=>800,8542=>800,8543=>750,8544=>374,8545=>716,8546=>1039,8547=>1040,8548=>703,8549=>1037,8550=>1345,8551=>1668,8552=>1005,8553=>699,8554=>1009,8555=>1334,8556=>609,8557=>620,8558=>723,8559=>876,8560=>292,8561=>551,8562=>813,8563=>686,8564=>439,8565=>690,8566=>950,8567=>1210,8568=>774,8569=>476,8570=>738,8571=>998,8572=>294,8573=>428,8574=>510,8575=>763,8592=>900,8593=>500,8594=>900,8595=>500,8596=>900,8597=>500,8598=>800,8599=>800,8600=>801,8601=>800,8602=>900,8603=>900,8606=>900,8607=>500,8608=>900,8609=>500,8610=>900,8611=>900,8612=>900,8613=>601,8614=>950,8615=>650,8616=>600,8632=>800,8633=>964,8636=>964,8637=>964,8638=>500,8639=>500,8640=>964,8641=>964,8642=>500,8643=>500,8644=>964,8645=>884,8646=>964,8647=>964,8648=>884,8649=>964,8650=>884,8651=>987,8652=>987,8656=>964,8657=>630,8658=>964,8659=>630,8660=>964,8661=>630,8668=>1100,8669=>1100,8676=>964,8677=>964,8704=>627,8705=>548,8706=>494,8707=>627,8708=>627,8709=>746,8710=>612,8711=>612,8712=>576,8713=>576,8714=>439,8715=>576,8716=>576,8717=>576,8718=>500,8719=>812,8720=>812,8721=>713,8722=>606,8723=>656,8724=>676,8725=>560,8726=>690,8727=>500,8728=>500,8729=>500,8730=>549,8731=>549,8732=>549,8733=>752,8734=>752,8735=>509,8739=>240,8740=>521,8741=>478,8742=>645,8743=>634,8744=>634,8745=>694,8746=>694,8747=>459,8748=>793,8749=>1103,8756=>629,8757=>629,8758=>250,8759=>629,8761=>767,8764=>676,8770=>676,8771=>636,8773=>636,8776=>676,8778=>636,8784=>570,8785=>570,8786=>570,8787=>570,8788=>827,8789=>877,8790=>636,8791=>576,8793=>570,8794=>570,8797=>570,8798=>570,8799=>570,8800=>570,8801=>636,8804=>626,8805=>616,8806=>676,8807=>676,8818=>636,8819=>636,8834=>676,8835=>676,8976=>680,8994=>951,8995=>951,9001=>398,9002=>398,9251=>500,9674=>494,9675=>738,9676=>791,9688=>500,9702=>500,9711=>855,9824=>618,9825=>645,9826=>587,9827=>582,9828=>582,9829=>645,9830=>587,9831=>618,9833=>333,9834=>556,9835=>778,9836=>778,9837=>556,9838=>556,9839=>556,11799=>333,42790=>778,42791=>548,42792=>868,42793=>648,42794=>652,42795=>452,42796=>478,42797=>422,42798=>675,42799=>627,42888=>333,42889=>278,42890=>282,42891=>349,42892=>278,42922=>892,43002=>763,64256=>753,64257=>623,64258=>619,64259=>891,64260=>888,64261=>616,64262=>662,64275=>1105,64276=>1105,64277=>1099,64278=>1105,64279=>1361,64285=>266,64286=>0,64287=>532,64288=>552,64297=>570,64298=>716,64299=>716,64300=>716,64301=>716,64302=>593,64303=>593,64304=>593,64305=>498,64306=>339,64307=>523,64308=>561,64309=>266,64310=>291,64312=>576,64313=>266,64314=>496,64315=>501,64316=>510,64318=>581,64320=>347,64321=>512,64323=>493,64324=>491,64326=>561,64327=>544,64328=>502,64329=>716,64330=>571,64331=>266,64332=>498,64333=>501,64334=>491,64335=>593,65529=>0,65530=>0,65531=>0,65532=>800,65533=>900,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifbi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifbi.z
new file mode 100644
index 00000000..891527b1
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifbi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifi.ctg.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifi.ctg.z
new file mode 100644
index 00000000..d953a901
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifi.ctg.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifi.php
new file mode 100644
index 00000000..69ac858b
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='TrueTypeUnicode';
+$name='FreeSerifItalic';
+$up=-125;
+$ut=50;
+$dw=600;
+$diff='';
+$originalsize=922088;
+$enc='';
+$file='freeserifi.z';
+$ctg='freeserifi.ctg.z';
+$desc=array('Flags'=>96,'FontBBox'=>'[-879 -300 1558 900]','ItalicAngle'=>-16.32768,'Ascent'=>900,'Descent'=>-200,'Leading'=>100,'CapHeight'=>653,'XHeight'=>452,'StemV'=>70,'StemH'=>30,'AvgWidth'=>559,'MaxWidth'=>1601,'MissingWidth'=>600);
+$cw=array(0=>600,32=>250,33=>333,34=>333,35=>500,36=>500,37=>833,38=>778,39=>200,40=>333,41=>333,42=>500,43=>675,44=>250,45=>333,46=>250,47=>296,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>250,59=>250,60=>570,61=>664,62=>570,63=>444,64=>780,65=>651,66=>591,67=>611,68=>702,69=>574,70=>576,71=>690,72=>705,73=>322,74=>427,75=>641,76=>568,77=>821,78=>677,79=>656,80=>566,81=>656,82=>616,83=>454,84=>589,85=>706,86=>663,87=>888,88=>665,89=>593,90=>563,91=>389,92=>490,93=>389,94=>422,95=>500,96=>250,97=>498,98=>476,99=>403,100=>500,101=>406,102=>424,103=>440,104=>499,105=>246,106=>285,107=>453,108=>251,109=>725,110=>493,111=>473,112=>469,113=>483,114=>366,115=>345,116=>238,117=>484,118=>456,119=>683,120=>435,121=>462,122=>389,123=>400,124=>275,125=>400,126=>541,160=>250,161=>333,162=>500,163=>500,164=>500,165=>500,166=>275,167=>500,168=>333,169=>760,170=>276,171=>444,172=>675,173=>333,174=>760,175=>333,176=>400,177=>675,178=>300,179=>300,180=>250,181=>500,182=>523,183=>250,184=>250,185=>250,186=>310,187=>444,188=>750,189=>740,190=>750,191=>500,192=>651,193=>651,194=>651,195=>651,196=>651,197=>651,198=>877,199=>611,200=>611,201=>611,202=>611,203=>611,204=>322,205=>322,206=>322,207=>322,208=>702,209=>677,210=>656,211=>656,212=>656,213=>656,214=>656,215=>675,216=>657,217=>706,218=>706,219=>706,220=>706,221=>593,222=>537,223=>569,224=>498,225=>498,226=>498,227=>498,228=>498,229=>498,230=>634,231=>403,232=>406,233=>406,234=>406,235=>406,236=>278,237=>278,238=>278,239=>278,240=>456,241=>493,242=>473,243=>473,244=>473,245=>473,246=>473,247=>675,248=>474,249=>484,250=>484,251=>484,252=>484,253=>462,254=>471,255=>462,256=>651,257=>498,258=>651,259=>498,260=>611,261=>500,262=>611,263=>403,264=>611,265=>403,266=>611,267=>403,268=>611,269=>403,270=>702,271=>625,272=>702,273=>500,274=>611,275=>406,276=>611,277=>406,278=>611,279=>406,280=>611,281=>406,282=>611,283=>406,284=>690,285=>440,286=>690,287=>440,288=>690,289=>440,290=>690,291=>440,292=>705,293=>499,294=>722,295=>500,296=>333,297=>278,298=>333,299=>278,300=>333,301=>278,302=>343,303=>278,304=>333,305=>278,306=>707,307=>452,308=>427,309=>328,310=>667,311=>453,312=>454,313=>568,314=>251,315=>568,316=>251,317=>568,318=>377,319=>568,320=>343,321=>564,322=>278,323=>677,324=>493,325=>677,326=>493,327=>677,328=>493,329=>542,330=>696,331=>500,332=>656,333=>473,334=>656,335=>473,336=>656,337=>473,338=>891,339=>653,340=>616,341=>366,342=>616,343=>366,344=>616,345=>366,346=>454,347=>345,348=>454,349=>345,350=>464,351=>345,352=>454,353=>345,354=>556,355=>238,356=>589,357=>364,358=>556,359=>248,360=>706,361=>484,362=>706,363=>484,364=>706,365=>484,366=>706,367=>484,368=>706,369=>484,370=>698,371=>484,372=>888,373=>683,374=>593,375=>462,376=>593,377=>563,378=>389,379=>563,380=>389,381=>563,382=>389,383=>464,384=>479,385=>738,386=>583,387=>481,388=>585,389=>509,390=>627,391=>853,392=>578,393=>702,394=>892,395=>669,396=>540,397=>472,398=>611,399=>585,400=>518,401=>611,402=>464,403=>863,404=>653,405=>708,406=>278,407=>333,408=>792,409=>444,410=>262,411=>480,412=>900,413=>768,414=>500,415=>661,416=>771,417=>576,418=>908,419=>722,420=>698,421=>483,422=>611,423=>500,424=>369,425=>653,426=>461,427=>313,428=>556,429=>335,430=>556,431=>801,432=>605,433=>747,434=>691,435=>663,436=>578,437=>556,438=>389,439=>518,440=>558,441=>434,442=>416,443=>500,444=>615,445=>439,446=>389,447=>473,448=>235,449=>360,450=>600,451=>333,452=>1268,453=>1091,454=>869,455=>1000,456=>824,457=>506,458=>1034,459=>895,460=>748,461=>651,462=>498,463=>322,464=>278,465=>656,466=>473,467=>706,468=>484,469=>706,470=>484,471=>698,472=>484,473=>698,474=>484,475=>698,476=>484,477=>406,478=>651,479=>498,480=>651,481=>498,482=>877,483=>634,484=>712,485=>490,486=>690,487=>440,488=>641,489=>453,490=>670,491=>473,492=>670,493=>473,494=>518,495=>446,496=>278,497=>1258,498=>1091,499=>859,500=>690,501=>440,502=>936,503=>537,504=>677,505=>493,506=>611,507=>498,508=>877,509=>634,510=>657,511=>474,512=>651,513=>498,514=>651,515=>498,516=>574,517=>406,518=>574,519=>406,520=>322,521=>278,522=>322,523=>278,524=>656,525=>473,526=>656,527=>473,528=>616,529=>366,530=>616,531=>366,532=>706,533=>484,534=>706,535=>484,536=>454,537=>345,538=>589,539=>238,540=>434,541=>465,542=>705,543=>499,544=>697,545=>558,546=>540,547=>508,548=>591,549=>404,550=>651,551=>498,552=>577,553=>406,554=>656,555=>473,556=>656,557=>473,558=>656,559=>473,560=>656,561=>473,562=>593,563=>462,564=>334,565=>527,566=>377,567=>278,568=>779,569=>768,570=>651,571=>611,572=>407,573=>564,574=>556,575=>350,576=>414,577=>436,578=>444,579=>588,580=>722,581=>657,582=>604,583=>406,584=>444,585=>348,586=>726,587=>550,588=>616,589=>333,590=>556,591=>470,592=>516,593=>564,594=>564,595=>500,596=>403,597=>407,598=>524,599=>647,600=>406,601=>406,602=>722,603=>431,604=>435,605=>664,606=>462,607=>353,608=>650,609=>480,610=>482,611=>491,612=>602,613=>499,614=>497,615=>485,616=>278,617=>278,618=>278,619=>378,620=>376,621=>364,622=>616,623=>761,624=>766,625=>768,626=>590,627=>569,628=>530,629=>500,630=>667,631=>700,632=>633,633=>366,634=>389,635=>444,636=>389,637=>393,638=>415,639=>383,640=>434,641=>456,642=>354,643=>464,644=>535,645=>496,646=>585,647=>238,648=>278,649=>510,650=>549,651=>464,652=>456,653=>683,654=>438,655=>490,656=>510,657=>492,658=>446,659=>479,660=>436,661=>438,662=>438,663=>454,664=>656,665=>402,666=>462,667=>695,668=>476,669=>307,670=>453,671=>383,672=>652,673=>414,674=>404,675=>745,676=>762,677=>799,678=>551,679=>542,680=>644,681=>756,682=>506,683=>481,684=>500,685=>500,686=>611,687=>716,688=>330,689=>330,690=>178,691=>248,692=>248,693=>309,694=>306,695=>405,696=>260,697=>250,698=>400,699=>200,700=>200,701=>200,702=>250,703=>250,704=>250,705=>250,706=>333,707=>333,708=>333,709=>333,710=>333,711=>333,712=>250,713=>333,714=>250,715=>250,716=>250,717=>333,718=>250,719=>250,720=>250,721=>250,722=>250,723=>250,724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333,731=>333,732=>333,733=>333,734=>400,735=>333,736=>311,737=>200,738=>243,739=>328,740=>300,741=>500,742=>500,743=>500,744=>500,745=>500,746=>500,747=>500,748=>333,749=>333,750=>333,751=>333,752=>333,753=>333,754=>333,755=>333,756=>250,757=>333,758=>333,759=>333,760=>250,761=>200,762=>200,763=>200,764=>200,765=>333,766=>333,767=>333,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0,875=>0,876=>0,877=>0,878=>0,879=>0,884=>199,885=>199,890=>332,894=>333,900=>257,901=>333,902=>661,903=>250,904=>794,905=>904,906=>524,908=>815,910=>837,911=>879,912=>270,913=>661,914=>581,915=>594,916=>660,917=>611,918=>606,919=>705,920=>661,921=>333,922=>641,923=>661,924=>821,925=>677,926=>678,927=>656,928=>697,929=>566,931=>653,932=>596,933=>679,934=>751,935=>665,936=>821,937=>767,938=>333,939=>696,940=>564,941=>431,942=>539,943=>270,944=>540,945=>564,946=>509,947=>496,948=>518,949=>431,950=>408,951=>539,952=>523,953=>270,954=>491,955=>488,956=>501,957=>515,958=>440,959=>524,960=>608,961=>506,962=>423,963=>532,964=>477,965=>540,966=>628,967=>500,968=>728,969=>701,970=>310,971=>540,972=>524,973=>540,974=>701,976=>537,977=>632,978=>630,979=>820,980=>680,981=>612,982=>704,983=>529,984=>555,985=>548,986=>588,987=>498,988=>610,989=>478,990=>653,991=>410,992=>719,993=>544,1008=>563,1009=>546,1010=>495,1011=>285,1012=>661,1013=>280,1014=>280,1015=>540,1016=>500,1017=>704,1018=>832,1019=>703,1020=>533,1021=>704,1022=>704,1023=>704,1024=>574,1025=>574,1026=>668,1027=>594,1028=>634,1029=>454,1030=>322,1031=>322,1032=>427,1033=>992,1034=>963,1035=>703,1036=>644,1037=>720,1038=>739,1039=>728,1040=>651,1041=>583,1042=>591,1043=>594,1044=>668,1045=>574,1046=>987,1047=>592,1048=>720,1049=>720,1050=>644,1051=>695,1052=>821,1053=>705,1054=>656,1055=>697,1056=>566,1057=>611,1058=>589,1059=>739,1060=>751,1061=>665,1062=>696,1063=>642,1064=>973,1065=>983,1066=>716,1067=>877,1068=>580,1069=>594,1070=>984,1071=>683,1072=>498,1073=>475,1074=>418,1075=>354,1076=>493,1077=>406,1078=>914,1079=>412,1080=>484,1081=>484,1082=>483,1083=>504,1084=>641,1085=>492,1086=>473,1087=>493,1088=>469,1089=>436,1090=>725,1091=>478,1092=>735,1093=>435,1094=>485,1095=>484,1096=>734,1097=>735,1098=>545,1099=>677,1100=>437,1101=>432,1102=>671,1103=>519,1104=>406,1105=>406,1106=>510,1107=>354,1108=>442,1109=>345,1110=>246,1111=>278,1112=>285,1113=>707,1114=>696,1115=>498,1116=>483,1117=>484,1118=>478,1119=>491,1120=>964,1121=>679,1122=>708,1123=>688,1124=>975,1125=>644,1126=>812,1127=>624,1128=>1096,1129=>791,1130=>964,1131=>738,1132=>1260,1133=>886,1134=>574,1135=>400,1136=>812,1137=>694,1138=>721,1139=>500,1140=>745,1141=>533,1142=>745,1143=>533,1144=>1108,1145=>908,1146=>868,1147=>602,1148=>964,1149=>684,1150=>964,1151=>679,1152=>588,1153=>443,1154=>320,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>720,1163=>500,1164=>602,1165=>433,1166=>611,1167=>500,1168=>552,1169=>424,1170=>593,1171=>424,1172=>611,1173=>432,1174=>992,1175=>932,1176=>592,1177=>396,1178=>681,1179=>491,1180=>700,1181=>532,1182=>664,1183=>491,1184=>776,1185=>690,1186=>729,1187=>500,1188=>908,1189=>660,1190=>1034,1191=>694,1192=>730,1193=>543,1194=>666,1195=>403,1196=>556,1197=>775,1198=>593,1199=>574,1200=>555,1201=>574,1202=>660,1203=>443,1204=>798,1205=>581,1206=>674,1207=>500,1208=>690,1209=>516,1210=>640,1211=>499,1212=>785,1213=>569,1214=>785,1215=>568,1216=>322,1217=>987,1218=>914,1219=>664,1220=>491,1221=>719,1222=>487,1223=>722,1224=>500,1225=>722,1226=>500,1227=>666,1228=>500,1229=>828,1230=>624,1231=>322,1232=>651,1233=>498,1234=>651,1235=>498,1236=>877,1237=>634,1238=>574,1239=>406,1240=>585,1241=>406,1242=>585,1243=>406,1244=>987,1245=>914,1246=>592,1247=>412,1248=>518,1249=>446,1250=>720,1251=>484,1252=>720,1253=>484,1254=>656,1255=>473,1256=>661,1257=>500,1258=>661,1259=>500,1260=>594,1261=>432,1262=>739,1263=>478,1264=>739,1265=>478,1266=>739,1267=>478,1268=>642,1269=>484,1270=>611,1271=>424,1272=>877,1273=>677,1296=>532,1297=>409,1298=>719,1299=>487,1306=>656,1307=>483,1308=>888,1309=>656,1310=>664,1311=>491,1329=>794,1330=>712,1331=>782,1332=>854,1333=>711,1334=>702,1335=>707,1336=>655,1337=>777,1338=>782,1339=>710,1340=>663,1341=>830,1342=>917,1343=>672,1344=>469,1345=>666,1346=>858,1347=>685,1348=>856,1349=>618,1350=>858,1351=>709,1352=>719,1353=>714,1354=>731,1355=>702,1356=>874,1357=>719,1358=>844,1359=>519,1360=>703,1361=>608,1362=>586,1363=>751,1364=>780,1365=>714,1366=>684,1369=>120,1370=>120,1371=>269,1372=>307,1373=>241,1374=>312,1375=>300,1377=>786,1378=>506,1379=>542,1380=>541,1381=>506,1382=>503,1383=>478,1384=>499,1385=>541,1386=>539,1387=>508,1388=>289,1389=>750,1390=>540,1391=>513,1392=>508,1393=>503,1394=>531,1395=>518,1396=>500,1397=>243,1398=>473,1399=>406,1400=>499,1401=>407,1402=>793,1403=>414,1404=>463,1405=>500,1406=>516,1407=>758,1408=>504,1409=>466,1410=>288,1411=>758,1412=>510,1413=>501,1414=>562,1415=>543,1417=>278,1418=>280,1423=>700,1425=>0,1426=>0,1427=>0,1428=>0,1429=>0,1430=>0,1431=>418,1432=>0,1433=>0,1434=>0,1435=>0,1436=>0,1437=>0,1438=>0,1439=>0,1440=>0,1441=>0,1442=>0,1443=>0,1444=>0,1445=>0,1446=>0,1447=>0,1448=>0,1449=>0,1450=>0,1451=>0,1452=>0,1453=>0,1454=>0,1455=>0,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>370,1471=>0,1472=>126,1473=>0,1474=>0,1475=>418,1476=>0,1477=>0,1478=>350,1479=>0,1488=>537,1489=>537,1490=>350,1491=>537,1492=>537,1493=>350,1494=>350,1495=>537,1496=>537,1497=>350,1498=>537,1499=>537,1500=>537,1501=>537,1502=>537,1503=>350,1504=>350,1505=>537,1506=>537,1507=>537,1508=>537,1509=>537,1510=>537,1511=>537,1512=>537,1513=>537,1514=>537,1520=>537,1521=>537,1522=>537,1523=>396,1524=>396,2404=>318,2405=>446,2433=>0,2434=>300,2435=>312,2437=>594,2438=>776,2439=>469,2440=>513,2441=>535,2442=>561,2443=>604,2444=>481,2447=>580,2448=>604,2451=>540,2452=>620,2453=>570,2454=>485,2455=>484,2456=>471,2457=>457,2458=>408,2459=>452,2460=>591,2461=>551,2462=>771,2463=>414,2464=>404,2465=>522,2466=>415,2467=>450,2468=>551,2469=>477,2470=>478,2471=>449,2472=>448,2474=>535,2475=>611,2476=>443,2477=>534,2478=>492,2479=>474,2480=>442,2482=>542,2486=>507,2487=>467,2488=>523,2489=>419,2492=>0,2493=>419,2494=>202,2495=>189,2496=>202,2497=>0,2498=>0,2499=>0,2500=>0,2503=>294,2504=>289,2507=>774,2508=>825,2509=>0,2510=>356,2519=>219,2524=>523,2525=>420,2527=>469,2528=>604,2529=>481,2530=>0,2531=>0,2534=>500,2535=>437,2536=>479,2537=>507,2538=>497,2539=>500,2540=>482,2541=>503,2542=>517,2543=>481,2544=>443,2545=>443,2546=>429,2547=>383,2548=>432,2549=>478,2550=>539,2551=>158,2552=>365,2553=>280,2554=>357,2555=>344,3585=>512,3586=>453,3587=>512,3588=>519,3589=>529,3590=>561,3591=>411,3592=>437,3593=>552,3594=>452,3595=>509,3596=>707,3597=>707,3598=>574,3599=>570,3600=>406,3601=>607,3602=>686,3603=>749,3604=>494,3605=>497,3606=>509,3607=>552,3608=>461,3609=>565,3610=>527,3611=>523,3612=>556,3613=>551,3614=>570,3615=>570,3616=>571,3617=>531,3618=>493,3619=>433,3620=>513,3621=>491,3622=>571,3623=>439,3624=>510,3625=>594,3626=>484,3627=>554,3628=>616,3629=>493,3630=>496,3631=>417,3632=>392,3633=>0,3634=>366,3635=>366,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0,3647=>662,3648=>297,3649=>544,3650=>298,3651=>329,3652=>328,3653=>326,3654=>488,3655=>0,3656=>0,3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0,3663=>725,3664=>624,3665=>624,3666=>624,3667=>624,3668=>624,3669=>624,3670=>624,3671=>624,3672=>624,3673=>624,3674=>645,3675=>872,4256=>453,4257=>448,4258=>546,4259=>619,4260=>478,4261=>481,4262=>459,4263=>707,4264=>467,4265=>471,4266=>842,4267=>464,4268=>443,4269=>707,4270=>460,4271=>465,4272=>686,4273=>440,4274=>550,4275=>561,4276=>580,4277=>467,4278=>630,4279=>466,4280=>517,4281=>456,4282=>502,4283=>464,4284=>534,4285=>440,4286=>443,4287=>522,4288=>460,4289=>463,4290=>536,4291=>455,4292=>468,4293=>449,4304=>454,4305=>452,4306=>544,4307=>629,4308=>451,4309=>452,4310=>452,4311=>702,4312=>451,4313=>452,4314=>820,4315=>451,4316=>453,4317=>695,4318=>449,4319=>448,4320=>694,4321=>501,4322=>544,4323=>517,4324=>560,4325=>450,4326=>627,4327=>452,4328=>491,4329=>452,4330=>485,4331=>452,4332=>485,4333=>443,4334=>500,4335=>582,4336=>455,4337=>451,4338=>480,4339=>414,4340=>453,4341=>418,4342=>741,4343=>452,4344=>452,4345=>544,4346=>454,4347=>410,4348=>339,5024=>711,5025=>678,5026=>604,5027=>667,5028=>796,5029=>301,5030=>516,5031=>544,5032=>457,5033=>716,5034=>703,5035=>383,5036=>628,5037=>709,5038=>455,5039=>601,5040=>472,5041=>574,5042=>730,5043=>939,5044=>498,5045=>528,5046=>667,5047=>891,5048=>505,5049=>792,5050=>957,5051=>725,5052=>595,5053=>733,5054=>698,5055=>638,5056=>720,5057=>732,5058=>624,5059=>638,5060=>565,5061=>903,5062=>655,5063=>681,5064=>675,5065=>949,5066=>683,5067=>547,5068=>693,5069=>732,5070=>529,5071=>569,5072=>536,5073=>677,5074=>631,5075=>495,5076=>973,5077=>543,5078=>607,5079=>652,5080=>652,5081=>693,5082=>514,5083=>803,5084=>658,5085=>597,5086=>627,5087=>659,5088=>679,5089=>706,5090=>563,5091=>618,5092=>767,5093=>776,5094=>731,5095=>492,5096=>808,5097=>823,5098=>796,5099=>689,5100=>716,5101=>518,5102=>521,5103=>719,5104=>563,5105=>776,5106=>634,5107=>822,5108=>621,7424=>416,7425=>587,7426=>703,7427=>410,7428=>428,7429=>450,7431=>401,7432=>435,7433=>246,7434=>268,7435=>449,7436=>364,7437=>536,7439=>443,7448=>361,7450=>390,7451=>380,7452=>449,7456=>384,7457=>527,7458=>395,7552=>500,7579=>335,7581=>285,7582=>312,7583=>280,7588=>188,7589=>212,7592=>230,7593=>236,7596=>497,7597=>529,7598=>421,7599=>404,7600=>364,7601=>329,7602=>412,7603=>234,7604=>282,7605=>217,7606=>384,7607=>356,7608=>344,7609=>334,7612=>403,7613=>318,7614=>297,7615=>318,7680=>651,7681=>498,7682=>591,7683=>476,7684=>591,7685=>476,7686=>591,7687=>476,7688=>611,7689=>403,7690=>702,7691=>500,7692=>702,7693=>500,7694=>702,7695=>500,7696=>693,7697=>500,7698=>702,7699=>500,7700=>577,7701=>406,7702=>577,7703=>406,7704=>574,7705=>406,7706=>574,7707=>406,7708=>577,7709=>406,7710=>576,7711=>424,7712=>690,7713=>440,7714=>705,7715=>499,7716=>705,7717=>499,7718=>705,7719=>499,7720=>697,7721=>498,7722=>705,7723=>499,7724=>322,7725=>246,7726=>314,7727=>278,7728=>641,7729=>453,7730=>641,7731=>453,7732=>641,7733=>453,7734=>568,7735=>251,7736=>568,7737=>251,7738=>568,7739=>251,7740=>568,7741=>251,7742=>821,7743=>725,7744=>821,7745=>725,7746=>821,7747=>725,7748=>677,7749=>493,7750=>677,7751=>493,7752=>677,7753=>493,7754=>677,7755=>493,7756=>656,7757=>473,7758=>656,7759=>473,7760=>656,7761=>473,7762=>656,7763=>473,7764=>566,7765=>469,7766=>566,7767=>469,7768=>616,7769=>366,7770=>616,7771=>366,7772=>616,7773=>366,7774=>616,7775=>366,7776=>454,7777=>345,7778=>454,7779=>345,7780=>464,7781=>345,7782=>464,7783=>345,7784=>454,7785=>345,7786=>589,7787=>238,7788=>589,7789=>238,7790=>589,7791=>238,7792=>589,7793=>238,7794=>706,7795=>484,7796=>706,7797=>484,7798=>706,7799=>484,7800=>698,7801=>484,7802=>706,7803=>484,7804=>663,7805=>456,7806=>663,7807=>456,7808=>888,7809=>683,7810=>888,7811=>683,7812=>888,7813=>683,7814=>888,7815=>683,7816=>888,7817=>683,7818=>665,7819=>435,7820=>665,7821=>435,7822=>593,7823=>462,7824=>563,7825=>389,7826=>563,7827=>389,7828=>563,7829=>389,7830=>499,7831=>238,7832=>683,7833=>462,7834=>444,7835=>383,7836=>383,7837=>424,7838=>676,7839=>464,7840=>651,7841=>498,7842=>651,7843=>498,7844=>651,7845=>498,7846=>651,7847=>498,7848=>651,7849=>498,7850=>651,7851=>498,7852=>651,7853=>498,7854=>651,7855=>498,7856=>651,7857=>498,7858=>651,7859=>498,7860=>651,7861=>498,7862=>651,7863=>498,7864=>574,7865=>406,7866=>574,7867=>406,7868=>574,7869=>406,7870=>611,7871=>406,7872=>611,7873=>406,7874=>611,7875=>406,7876=>611,7877=>406,7878=>574,7879=>406,7880=>322,7881=>278,7882=>322,7883=>246,7884=>656,7885=>473,7886=>656,7887=>473,7888=>656,7889=>473,7890=>656,7891=>473,7892=>656,7893=>473,7894=>656,7895=>473,7896=>656,7897=>473,7898=>771,7899=>576,7900=>771,7901=>576,7902=>807,7903=>585,7904=>771,7905=>576,7906=>771,7907=>576,7908=>706,7909=>484,7910=>706,7911=>484,7912=>801,7913=>605,7914=>801,7915=>605,7916=>807,7917=>585,7918=>801,7919=>605,7920=>801,7921=>605,7922=>593,7923=>462,7924=>593,7925=>462,7926=>593,7927=>462,7928=>593,7929=>462,7936=>564,7937=>564,7938=>564,7939=>564,7940=>564,7941=>564,7942=>564,7943=>564,7944=>661,7945=>661,7946=>794,7947=>771,7948=>792,7949=>773,7950=>661,7951=>648,7952=>431,7953=>431,7954=>431,7955=>431,7956=>431,7957=>431,7960=>740,7961=>795,7962=>923,7963=>910,7964=>956,7965=>926,7968=>539,7969=>539,7970=>539,7971=>539,7972=>539,7973=>539,7974=>539,7975=>539,7976=>879,7977=>901,7978=>1036,7979=>1035,7980=>1079,7981=>1060,7982=>924,7983=>929,7984=>270,7985=>270,7986=>267,7987=>267,7988=>267,7989=>267,7990=>267,7991=>267,7992=>490,7993=>499,7994=>625,7995=>614,7996=>665,7997=>653,7998=>510,7999=>513,8000=>558,8001=>524,8002=>524,8003=>524,8004=>524,8005=>524,8008=>797,8009=>807,8010=>966,8011=>962,8012=>953,8013=>947,8016=>540,8017=>540,8018=>540,8019=>540,8020=>540,8021=>540,8022=>540,8023=>540,8025=>816,8027=>922,8029=>950,8031=>823,8032=>701,8033=>701,8034=>701,8035=>701,8036=>701,8037=>701,8038=>701,8039=>701,8040=>852,8041=>849,8042=>1032,8043=>1012,8044=>1012,8045=>987,8046=>900,8047=>876,8048=>564,8049=>564,8050=>431,8051=>431,8052=>539,8053=>539,8054=>270,8055=>270,8056=>524,8057=>524,8058=>540,8059=>540,8060=>701,8061=>701,8064=>564,8065=>564,8066=>564,8067=>564,8068=>564,8069=>564,8070=>564,8071=>564,8072=>821,8073=>854,8074=>998,8075=>971,8076=>992,8077=>981,8078=>866,8079=>858,8080=>539,8081=>539,8082=>539,8083=>539,8084=>539,8085=>539,8086=>539,8087=>539,8088=>999,8089=>1044,8090=>1159,8091=>1165,8092=>1227,8093=>1229,8094=>1080,8095=>1085,8096=>701,8097=>701,8098=>701,8099=>701,8100=>701,8101=>701,8102=>701,8103=>701,8104=>1037,8105=>1053,8106=>1244,8107=>1214,8108=>1219,8109=>1191,8110=>1110,8111=>1082,8112=>564,8113=>564,8114=>564,8115=>564,8116=>564,8118=>564,8119=>564,8120=>661,8121=>661,8122=>661,8123=>661,8124=>831,8125=>192,8126=>200,8127=>200,8128=>500,8129=>534,8130=>539,8131=>539,8132=>539,8134=>539,8135=>539,8136=>731,8137=>766,8138=>889,8139=>908,8140=>851,8141=>330,8142=>333,8143=>500,8144=>270,8145=>270,8146=>270,8147=>270,8150=>270,8151=>270,8152=>333,8153=>333,8154=>477,8155=>491,8157=>333,8158=>500,8159=>333,8160=>540,8161=>540,8162=>540,8163=>540,8164=>506,8165=>506,8166=>540,8167=>540,8168=>679,8169=>679,8170=>865,8171=>861,8172=>783,8173=>333,8174=>333,8175=>200,8178=>701,8179=>701,8180=>701,8182=>701,8183=>701,8184=>807,8185=>793,8186=>855,8187=>835,8188=>952,8189=>500,8190=>200,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>500,8200=>250,8201=>166,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>500,8211=>500,8212=>1000,8213=>1000,8214=>293,8215=>465,8216=>200,8217=>200,8218=>200,8219=>200,8220=>333,8221=>333,8222=>333,8223=>333,8224=>500,8225=>500,8226=>400,8227=>400,8228=>250,8229=>500,8230=>889,8231=>250,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>166,8240=>1000,8241=>1601,8242=>247,8243=>411,8244=>611,8245=>220,8246=>410,8247=>600,8248=>469,8249=>250,8250=>250,8251=>629,8252=>666,8253=>500,8254=>500,8255=>953,8256=>1000,8257=>314,8258=>931,8259=>400,8260=>167,8261=>480,8262=>480,8263=>900,8264=>833,8265=>763,8266=>500,8267=>453,8268=>453,8269=>500,8270=>500,8271=>278,8272=>882,8273=>500,8274=>497,8275=>500,8276=>953,8277=>512,8278=>410,8279=>855,8280=>620,8281=>620,8282=>179,8283=>621,8284=>564,8285=>179,8286=>179,8287=>111,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>300,8305=>235,8308=>300,8309=>300,8310=>300,8311=>300,8312=>300,8313=>300,8314=>300,8315=>300,8316=>300,8317=>216,8318=>216,8319=>318,8320=>300,8321=>250,8322=>300,8323=>300,8324=>300,8325=>300,8326=>300,8327=>300,8328=>300,8329=>300,8330=>300,8331=>300,8332=>300,8333=>216,8334=>216,8336=>350,8337=>304,8338=>340,8339=>317,8340=>278,8352=>698,8353=>667,8354=>667,8355=>611,8356=>500,8357=>722,8358=>667,8359=>988,8360=>953,8361=>833,8362=>869,8363=>512,8364=>741,8365=>722,8366=>611,8367=>1340,8368=>489,8369=>589,8370=>619,8371=>722,8372=>556,8373=>611,8374=>408,8376=>524,8377=>654,8400=>0,8401=>0,8402=>0,8403=>0,8404=>0,8405=>0,8406=>0,8407=>0,8408=>0,8409=>0,8410=>0,8411=>0,8412=>0,8413=>0,8414=>0,8415=>0,8416=>0,8417=>0,8418=>0,8419=>0,8420=>0,8421=>0,8422=>0,8423=>0,8424=>0,8425=>0,8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8432=>0,8448=>604,8449=>605,8450=>674,8451=>954,8452=>536,8453=>593,8454=>667,8455=>518,8456=>667,8457=>862,8458=>560,8459=>1124,8460=>673,8461=>808,8462=>499,8463=>530,8464=>808,8465=>613,8466=>855,8467=>417,8468=>777,8469=>711,8470=>783,8471=>792,8472=>792,8473=>589,8474=>729,8475=>892,8476=>711,8477=>755,8478=>616,8479=>610,8480=>879,8481=>1156,8482=>920,8483=>611,8484=>659,8485=>409,8486=>767,8487=>767,8488=>663,8489=>286,8490=>722,8491=>722,8492=>936,8493=>613,8494=>523,8495=>430,8496=>637,8497=>890,8498=>576,8499=>1241,8500=>437,8501=>547,8502=>557,8503=>360,8504=>537,8505=>417,8506=>906,8507=>1195,8508=>675,8510=>586,8511=>722,8513=>663,8514=>485,8515=>485,8516=>637,8522=>516,8523=>778,8525=>926,8526=>378,8531=>750,8532=>750,8533=>750,8534=>750,8535=>750,8536=>750,8537=>750,8538=>750,8539=>750,8540=>750,8541=>750,8542=>750,8543=>750,8544=>322,8545=>608,8546=>877,8547=>950,8548=>663,8549=>930,8550=>1196,8551=>1459,8552=>900,8553=>665,8554=>931,8555=>1204,8556=>568,8557=>611,8558=>702,8559=>821,8560=>246,8561=>496,8562=>682,8563=>660,8564=>456,8565=>665,8566=>880,8567=>1096,8568=>703,8569=>435,8570=>650,8571=>878,8572=>251,8573=>403,8574=>500,8575=>725,8592=>964,8593=>499,8594=>964,8595=>499,8596=>900,8597=>900,8598=>800,8599=>800,8600=>800,8601=>800,8612=>1013,8613=>570,8614=>1013,8615=>500,8617=>910,8618=>910,8628=>658,8629=>658,8636=>900,8637=>900,8638=>400,8639=>400,8640=>900,8641=>900,8642=>400,8643=>400,8644=>900,8645=>790,8646=>900,8651=>900,8652=>900,8656=>900,8657=>550,8658=>900,8659=>550,8660=>910,8661=>650,8668=>1078,8669=>1078,8704=>587,8705=>532,8706=>544,8707=>587,8708=>587,8709=>662,8710=>612,8711=>612,8712=>536,8713=>536,8714=>439,8715=>536,8716=>536,8717=>439,8718=>500,8719=>823,8720=>823,8721=>713,8722=>675,8723=>675,8724=>675,8725=>750,8726=>610,8727=>400,8728=>400,8729=>400,8730=>549,8731=>549,8732=>549,8733=>677,8734=>677,8735=>509,8736=>575,8737=>559,8738=>509,8739=>200,8740=>250,8741=>320,8742=>404,8743=>564,8744=>564,8745=>654,8746=>654,8747=>496,8748=>840,8749=>1173,8750=>652,8751=>870,8756=>565,8757=>568,8758=>250,8759=>629,8761=>767,8764=>636,8770=>586,8771=>586,8773=>636,8776=>636,8778=>636,8784=>614,8785=>564,8786=>564,8787=>564,8788=>735,8789=>755,8790=>675,8791=>657,8793=>614,8794=>675,8797=>614,8798=>614,8799=>614,8800=>675,8801=>636,8804=>675,8805=>675,8806=>636,8807=>636,8810=>900,8811=>899,8818=>636,8819=>636,8834=>636,8835=>636,8976=>564,8992=>686,8993=>686,8994=>658,8995=>658,9001=>329,9002=>329,9251=>500,9674=>494,9675=>791,9676=>791,9688=>400,9702=>400,9711=>885,9824=>626,9825=>694,9826=>595,9827=>776,9828=>626,9829=>694,9830=>595,9831=>776,9833=>333,9834=>555,9835=>722,9836=>722,9837=>415,9838=>377,9839=>402,11799=>333,42790=>722,42791=>491,42792=>799,42793=>609,42794=>532,42795=>409,42796=>437,42797=>389,42798=>578,42799=>580,42888=>333,42889=>278,42890=>282,42891=>286,42892=>278,42893=>722,42896=>657,42897=>500,42922=>847,43002=>725,64256=>671,64257=>569,64258=>563,64259=>810,64260=>811,64261=>557,64262=>628,64275=>971,64276=>969,64277=>978,64278=>971,64279=>1219,64285=>350,64286=>0,64287=>537,64288=>537,64297=>564,64298=>537,64299=>537,64300=>537,64301=>537,64302=>537,64303=>537,64304=>537,64305=>537,64306=>350,64307=>537,64308=>537,64309=>350,64310=>350,64312=>537,64313=>350,64314=>537,64315=>537,64316=>537,64318=>537,64320=>350,64321=>537,64323=>537,64324=>537,64326=>537,64327=>537,64328=>537,64329=>537,64330=>537,64331=>350,64332=>537,64333=>537,64334=>537,64335=>537,65529=>0,65530=>0,65531=>0,65532=>800,65533=>900,65535=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifi.z
new file mode 100644
index 00000000..3ee26fe9
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/freeserifi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/helvetica.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/helvetica.php
new file mode 100644
index 00000000..d1aa6d85
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/helvetica.php
@@ -0,0 +1,13 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='core';
+$name='Helvetica';
+$up=-100;
+$ut=50;
+$dw=513;
+$diff='';
+$enc='';
+$desc=array('Flags'=>32,'FontBBox'=>'[-166 -225 1000 931]','ItalicAngle'=>0,'Ascent'=>931,'Descent'=>-225,'Leading'=>0,'CapHeight'=>718,'XHeight'=>523,'StemV'=>88,'StemH'=>76,'AvgWidth'=>513,'MaxWidth'=>1015,'MissingWidth'=>513);
+$cw=array(0=>500,1=>500,2=>500,3=>500,4=>500,5=>500,6=>500,7=>500,8=>500,9=>500,10=>500,11=>500,12=>500,13=>500,14=>500,15=>500,16=>500,17=>500,18=>500,19=>500,20=>500,21=>500,22=>500,23=>500,24=>500,25=>500,26=>500,27=>500,28=>500,29=>500,30=>500,31=>500,32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584,62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278,92=>278,93=>277,94=>469,95=>556,96=>333,97=>556,98=>556,99=>500,100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556,112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584,127=>500,128=>655,129=>500,130=>222,131=>278,132=>333,133=>1000,134=>556,135=>556,136=>333,137=>1000,138=>667,139=>250,140=>1000,141=>500,142=>611,143=>500,144=>500,145=>222,146=>221,147=>333,148=>333,149=>350,150=>556,151=>1000,152=>333,153=>1000,154=>500,155=>250,156=>938,157=>500,158=>500,159=>667,160=>278,161=>278,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>448,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584,178=>350,179=>350,180=>333,181=>556,182=>537,183=>278,184=>333,185=>350,186=>365,187=>448,188=>869,189=>869,190=>879,191=>556,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>666,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>896,231=>500,232=>556,233=>556,234=>556,235=>556,236=>251,237=>251,238=>251,239=>251,240=>556,241=>556,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>555,255=>500);
+
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/helveticab.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/helveticab.php
new file mode 100644
index 00000000..8d6047f6
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/helveticab.php
@@ -0,0 +1,12 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='core';
+$name='Helvetica-Bold';
+$up=-100;
+$ut=50;
+$dw=535;
+$diff='';
+$enc='';
+$desc=array('Flags'=>32,'FontBBox'=>'[-170 -228 1003 962]','ItalicAngle'=>0,'Ascent'=>962,'Descent'=>-228,'Leading'=>0,'CapHeight'=>718,'XHeight'=>532,'StemV'=>140,'StemH'=>118,'AvgWidth'=>535,'MaxWidth'=>1000,'MissingWidth'=>535);
+$cw=array(0=>278,1=>278,2=>278,3=>278,4=>278,5=>278,6=>278,7=>278,8=>278,9=>278,10=>278,11=>278,12=>278,13=>278,14=>278,15=>278,16=>278,17=>278,18=>278,19=>278,20=>278,21=>278,22=>278,23=>278,24=>278,25=>278,26=>278,27=>278,28=>278,29=>278,30=>278,31=>278,32=>278,33=>333,34=>474,35=>556,36=>556,37=>889,38=>722,39=>238,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>333,59=>333,60=>584,61=>584,62=>584,63=>611,64=>975,65=>722,66=>722,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>556,75=>722,76=>611,77=>833,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>333,92=>278,93=>333,94=>584,95=>556,96=>333,97=>556,98=>611,99=>556,100=>611,101=>556,102=>333,103=>611,104=>611,105=>278,106=>278,107=>556,108=>278,109=>889,110=>611,111=>611,112=>611,113=>611,114=>389,115=>556,116=>333,117=>611,118=>556,119=>778,120=>556,121=>556,122=>500,123=>389,124=>280,125=>389,126=>584,127=>350,128=>556,129=>350,130=>278,131=>556,132=>500,133=>1000,134=>556,135=>556,136=>333,137=>1000,138=>667,139=>333,140=>1000,141=>350,142=>611,143=>350,144=>350,145=>278,146=>278,147=>500,148=>500,149=>350,150=>556,151=>1000,152=>333,153=>1000,154=>556,155=>333,156=>944,157=>350,158=>500,159=>667,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>280,167=>556,168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>333,176=>400,177=>584,178=>333,179=>333,180=>333,181=>611,182=>556,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834,190=>834,191=>611,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>889,231=>556,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278,238=>278,239=>278,240=>611,241=>611,242=>611,243=>611,244=>611,245=>611,246=>611,247=>584,248=>611,249=>611,250=>611,251=>611,252=>611,253=>556,254=>611,255=>556);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/helveticabi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/helveticabi.php
new file mode 100644
index 00000000..e2ecf38d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/helveticabi.php
@@ -0,0 +1,12 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='core';
+$name='Helvetica-BoldOblique';
+$up=-100;
+$ut=50;
+$dw=535;
+$diff='';
+$enc='';
+$desc=array('Flags'=>96,'FontBBox'=>'[-174 -228 1114 962]','ItalicAngle'=>-12,'Ascent'=>962,'Descent'=>-228,'Leading'=>0,'CapHeight'=>718,'XHeight'=>532,'StemV'=>140,'StemH'=>118,'AvgWidth'=>535,'MaxWidth'=>1000,'MissingWidth'=>535);
+$cw=array(0=>278,1=>278,2=>278,3=>278,4=>278,5=>278,6=>278,7=>278,8=>278,9=>278,10=>278,11=>278,12=>278,13=>278,14=>278,15=>278,16=>278,17=>278,18=>278,19=>278,20=>278,21=>278,22=>278,23=>278,24=>278,25=>278,26=>278,27=>278,28=>278,29=>278,30=>278,31=>278,32=>278,33=>333,34=>474,35=>556,36=>556,37=>889,38=>722,39=>238,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>333,59=>333,60=>584,61=>584,62=>584,63=>611,64=>975,65=>722,66=>722,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>556,75=>722,76=>611,77=>833,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>333,92=>278,93=>333,94=>584,95=>556,96=>333,97=>556,98=>611,99=>556,100=>611,101=>556,102=>333,103=>611,104=>611,105=>278,106=>278,107=>556,108=>278,109=>889,110=>611,111=>611,112=>611,113=>611,114=>389,115=>556,116=>333,117=>611,118=>556,119=>778,120=>556,121=>556,122=>500,123=>389,124=>280,125=>389,126=>584,127=>350,128=>556,129=>350,130=>278,131=>556,132=>500,133=>1000,134=>556,135=>556,136=>333,137=>1000,138=>667,139=>333,140=>1000,141=>350,142=>611,143=>350,144=>350,145=>278,146=>278,147=>500,148=>500,149=>350,150=>556,151=>1000,152=>333,153=>1000,154=>556,155=>333,156=>944,157=>350,158=>500,159=>667,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>280,167=>556,168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>333,176=>400,177=>584,178=>333,179=>333,180=>333,181=>611,182=>556,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834,190=>834,191=>611,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>889,231=>556,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278,238=>278,239=>278,240=>611,241=>611,242=>611,243=>611,244=>611,245=>611,246=>611,247=>584,248=>611,249=>611,250=>611,251=>611,252=>611,253=>556,254=>611,255=>556);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/helveticai.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/helveticai.php
new file mode 100644
index 00000000..0404aebd
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/helveticai.php
@@ -0,0 +1,12 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='core';
+$name='Helvetica-Oblique';
+$up=-100;
+$ut=50;
+$dw=513;
+$diff='';
+$enc='';
+$desc=array('Flags'=>96,'FontBBox'=>'[-170 -225 1116 931]','ItalicAngle'=>-12,'Ascent'=>931,'Descent'=>-225,'Leading'=>0,'CapHeight'=>718,'XHeight'=>523,'StemV'=>88,'StemH'=>76,'AvgWidth'=>513,'MaxWidth'=>1015,'MissingWidth'=>513);
+$cw=array(0=>278,1=>278,2=>278,3=>278,4=>278,5=>278,6=>278,7=>278,8=>278,9=>278,10=>278,11=>278,12=>278,13=>278,14=>278,15=>278,16=>278,17=>278,18=>278,19=>278,20=>278,21=>278,22=>278,23=>278,24=>278,25=>278,26=>278,27=>278,28=>278,29=>278,30=>278,31=>278,32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584,62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278,92=>278,93=>278,94=>469,95=>556,96=>333,97=>556,98=>556,99=>500,100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556,112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584,127=>350,128=>556,129=>350,130=>222,131=>556,132=>333,133=>1000,134=>556,135=>556,136=>333,137=>1000,138=>667,139=>333,140=>1000,141=>350,142=>611,143=>350,144=>350,145=>222,146=>222,147=>333,148=>333,149=>350,150=>556,151=>1000,152=>333,153=>1000,154=>500,155=>333,156=>944,157=>350,158=>500,159=>667,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>333,176=>400,177=>584,178=>333,179=>333,180=>333,181=>556,182=>537,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834,190=>834,191=>611,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278,238=>278,239=>278,240=>556,241=>556,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>556,255=>500);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/hysmyeongjostdmedium.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/hysmyeongjostdmedium.php
new file mode 100644
index 00000000..9e8b23b4
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/hysmyeongjostdmedium.php
@@ -0,0 +1,48 @@
+<?php
+$type='cidfont0';
+$name='HYSMyeongJoStd-Medium-Acro'; // AdobeMyungjoStd-Medium-Acro in acrobat 6
+$displayname = 'MyungJo Medium (Korean)';
+$desc = array(
+	'Ascent' => 880,
+	'Descent' => -120,
+	'CapHeight' => 720,
+	'Flags' => 6,
+	'FontBBox' => '[-28 -148 1001 880]',
+	'ItalicAngle' => 0,
+	'StemV' => 60,
+	'Style' => '<< /Panose <000000000600000000000000> >>',
+);
+$cidinfo = array(
+	'Registry' => 'Adobe',
+	'Ordering' => 'Korea1',
+	'Supplement' => '1',
+);
+$enc = 'UniKS-UCS2-H';
+
+// underline position, needs checking:
+$up = -130;
+$ut = 40;
+
+$dw = 1000;
+$cw = array(
+	32 => 333, 33 => 416, 34 => 416, 35 => 833, 36 => 625, 37 => 916, 38 => 833, 39 => 250, 40 => 500, 41 => 500,
+	42 => 500, 43 => 833, 44 => 291, 45 => 450, 46 => 291, 47 => 375, 48 => 625, 49 => 625, 50 => 625, 51 => 625,
+	52 => 625, 53 => 625, 54 => 625, 55 => 625, 56 => 625, 57 => 625, 58 => 333, 59 => 333, 60 => 833, 61 => 833,
+	62 => 916, 63 => 500, 64 => 1000, 65 => 791, 66 => 708, 67 => 708, 68 => 750, 69 => 708, 70 => 666, 71 => 750,
+	72 => 791, 73 => 375, 74 => 500, 75 => 791, 76 => 666, 77 => 916, 78 => 791, 79 => 750, 80 => 666, 81 => 750,
+	82 => 708, 83 => 666, 84 => 791, 85 => 791, 86 => 750, 87 => 1000, 88 => 708, 89 => 708, 90 => 666, 91 => 500,
+	92 => 375, 93 => 500, 94 => 500, 95 => 500, 96 => 333, 97 => 541, 98 => 583, 99 => 541, 100 => 583, 101 => 583,
+	102 => 375, 103 => 583, 104 => 583, 105 => 291, 106 => 333, 107 => 583, 108 => 291, 109 => 875, 110 => 583, 111 => 583,
+	112 => 583, 113 => 583, 114 => 458, 115 => 541, 116 => 375, 117 => 583, 118 => 583, 119 => 833, 120 => 625, 121 => 625,
+	122 => 500, 123 => 583, 124 => 583, 125 => 583, 126 => 750,
+);
+$_cr = array(
+	//array(97, 97, 500),
+	array(8094, 8190, 500)
+);
+foreach($_cr as $_r) {
+	for($i = $_r[0]; $i <= $_r[1]; $i++) {
+		$cw[$i+31] = $_r[2];
+	}
+}
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/kozgopromedium.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/kozgopromedium.php
new file mode 100644
index 00000000..72783b76
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/kozgopromedium.php
@@ -0,0 +1,65 @@
+<?php
+$type = 'cidfont0';
+$name = 'KozGoPro-Medium-Acro';
+$displayname = 'Kozuka Gothic Pro (Japanese Sans-Serif)';
+$desc = array(
+	'Ascent' => 880,
+	'Descent' => -120,
+	'CapHeight' => 763,
+	'Flags' => 4,
+	'FontBBox' => '[-149 -374 1254 1008]',
+	'ItalicAngle' => 0,
+	'StemV' => 99,
+	'Style' => '<< /Panose <0000020b0700000000000000> >>',
+	'XHeight' => 549,
+);
+$cidinfo = array(
+	'Registry' => 'Adobe',
+	'Ordering' => 'Japan1',
+	'Supplement' => '4',
+);
+$enc = 'UniJIS-UCS2-H';
+
+// underline position, needs checking:
+$up = -75;
+$ut = 50;
+
+$dw = 1000;
+$cw = array(
+	32 => 224, 33 => 266, 34 => 392, 35 => 551, 36 => 562, 37 => 883, 38 => 677, 39 => 213, 40 => 322, 41 => 322,
+	42 => 470, 43 => 677, 44 => 247, 45 => 343, 46 => 245, 47 => 370, 48 => 562, 49 => 562, 50 => 562, 51 => 562,
+	52 => 562, 53 => 562, 54 => 562, 55 => 562, 56 => 562, 57 => 562, 58 => 245, 59 => 247, 60 => 677, 61 => 677,
+	62 => 677, 63 => 447, 64 => 808, 65 => 661, 66 => 602, 67 => 610, 68 => 708, 69 => 535, 70 => 528, 71 => 689,
+	72 => 703, 73 => 275, 74 => 404, 75 => 602, 76 => 514, 77 => 871, 78 => 708, 79 => 727, 80 => 585, 81 => 727,
+	82 => 595, 83 => 539, 84 => 541, 85 => 696, 86 => 619, 87 => 922, 88 => 612, 89 => 591, 90 => 584, 91 => 322,
+	92 => 562, 93 => 322, 94 => 677, 95 => 568, 96 => 340, 97 => 532, 98 => 612, 99 => 475, 100 => 608, 101 => 543,
+	102 => 332, 103 => 603, 104 => 601, 105 => 265, 106 => 276, 107 => 524, 108 => 264, 109 => 901, 110 => 601, 111 => 590,
+	112 => 612, 113 => 607, 114 => 367, 115 => 433, 116 => 369, 117 => 597, 118 => 527, 119 => 800, 120 => 511, 121 => 518,
+	122 => 468, 123 => 321, 124 => 273, 125 => 321, 126 => 341, 127 => 241, 128 => 362, 129 => 241, 130 => 273, 131 => 677,
+	132 => 266, 133 => 562, 134 => 562, 135 => 456, 136 => 562, 137 => 571, 138 => 562, 139 => 416, 140 => 472, 141 => 283,
+	142 => 283, 143 => 587, 144 => 588, 145 => 568, 146 => 545, 147 => 545, 148 => 247, 149 => 561, 150 => 330, 151 => 239,
+	152 => 418, 153 => 416, 154 => 472, 155 => 1136, 156 => 1288, 157 => 447, 158 => 340, 159 => 340, 160 => 340, 161 => 340,
+	162 => 340, 163 => 340, 164 => 455, 165 => 340, 166 => 340, 167 => 340, 168 => 340, 169 => 1136, 170 => 857, 171 => 384,
+	172 => 519, 173 => 727, 174 => 952, 175 => 398, 176 => 834, 177 => 264, 178 => 275, 179 => 590, 180 => 918, 181 => 605,
+	182 => 677, 183 => 769, 184 => 677, 185 => 473, 186 => 361, 187 => 677, 188 => 347, 189 => 340, 190 => 599, 191 => 284,
+	192 => 845, 193 => 845, 194 => 845, 195 => 661, 196 => 661, 197 => 661, 198 => 661, 199 => 661, 200 => 661, 201 => 610,
+	202 => 535, 203 => 535, 204 => 535, 205 => 535, 206 => 275, 207 => 275, 208 => 275, 209 => 275, 210 => 715, 211 => 708,
+	212 => 727, 213 => 727, 214 => 727, 215 => 727, 216 => 727, 217 => 677, 218 => 696, 219 => 696, 220 => 696, 221 => 696,
+	222 => 591, 223 => 584, 224 => 532, 225 => 532, 226 => 532, 227 => 532, 228 => 532, 229 => 532, 230 => 475, 231 => 543,
+	232 => 543, 233 => 543, 234 => 543, 235 => 264, 236 => 264, 237 => 264, 238 => 264, 239 => 584, 240 => 601, 241 => 590,
+	242 => 590, 243 => 590, 244 => 590, 245 => 590, 246 => 677, 247 => 597, 248 => 597, 249 => 597, 250 => 597, 251 => 518,
+	252 => 612, 253 => 518, 254 => 539, 255 => 591, 256 => 584, 257 => 446, 258 => 433, 259 => 683, 260 => 468, 261 => 562,
+);
+$_cr = array(
+	array(231, 632, 500), // half-width
+	array(8718, 8718, 500),
+	array(9738, 9757, 250), // quarter-width
+	array(9758, 9778, 333), // third-width
+	array(12063, 12087, 500)
+);
+foreach($_cr as $_r) {
+	for($i = $_r[0]; $i <= $_r[1]; $i++) {
+		$cw[$i+31] = $_r[2];
+	}
+}
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/kozminproregular.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/kozminproregular.php
new file mode 100644
index 00000000..c308d41d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/kozminproregular.php
@@ -0,0 +1,63 @@
+<?php
+$type = 'cidfont0';
+$name = 'KozMinPro-Regular-Acro';
+$displayname = 'Kozuka Mincho Pro (Japanese Serif)';
+$desc = array(
+	'Ascent' => 880,
+	'Descent' => -120,
+	'CapHeight' => 740,
+	'Flags' => 6,
+	'FontBBox' => '[-195 -272 1110 1075]',
+	'ItalicAngle' => 0,
+	'StemV' => 86,
+	'XHeight' => 502,
+);
+$cidinfo = array(
+	'Registry' => 'Adobe',
+	'Ordering' => 'Japan1',
+	'Supplement' => '4',
+);
+$enc = 'UniJIS-UCS2-H';
+
+$up = -75;
+$ut = 50;
+
+$dw = 1000;
+$cw = array(
+	32 => 278, 33 => 299, 34 => 353, 35 => 614, 36 => 614, 37 => 721, 38 => 735, 39 => 216, 40 => 323, 41 => 323,
+	42 => 449, 43 => 529, 44 => 219, 45 => 306, 46 => 219, 47 => 453, 48 => 614, 49 => 614, 50 => 614, 51 => 614,
+	52 => 614, 53 => 614, 54 => 614, 55 => 614, 56 => 614, 57 => 614, 58 => 219, 59 => 219, 60 => 529, 61 => 529,
+	62 => 529, 63 => 486, 64 => 744, 65 => 646, 66 => 604, 67 => 617, 68 => 681, 69 => 567, 70 => 537, 71 => 647,
+	72 => 738, 73 => 320, 74 => 433, 75 => 637, 76 => 566, 77 => 904, 78 => 710, 79 => 716, 80 => 605, 81 => 716,
+	82 => 623, 83 => 517, 84 => 601, 85 => 690, 86 => 668, 87 => 990, 88 => 681, 89 => 634, 90 => 578, 91 => 316,
+	92 => 614, 93 => 316, 94 => 529, 95 => 500, 96 => 387, 97 => 509, 98 => 566, 99 => 478, 100 => 565, 101 => 503,
+	102 => 337, 103 => 549, 104 => 580, 105 => 275, 106 => 266, 107 => 544, 108 => 276, 109 => 854, 110 => 579, 111 => 550,
+	112 => 578, 113 => 566, 114 => 410, 115 => 444, 116 => 340, 117 => 575, 118 => 512, 119 => 760, 120 => 503, 121 => 529,
+	122 => 453, 123 => 326, 124 => 380, 125 => 326, 126 => 387, 127 => 216, 128 => 453, 129 => 216, 130 => 380, 131 => 529,
+	132 => 299, 133 => 614, 134 => 614, 135 => 265, 136 => 614, 137 => 475, 138 => 614, 139 => 353, 140 => 451, 141 => 291,
+	142 => 291, 143 => 588, 144 => 589, 145 => 500, 146 => 476, 147 => 476, 148 => 219, 149 => 494, 150 => 452, 151 => 216,
+	152 => 353, 153 => 353, 154 => 451, 156 => 1075, 157 => 486, 158 => 387, 159 => 387, 160 => 387, 161 => 387,
+	162 => 387,	163 => 387, 164 => 387, 165 => 387, 166 => 387, 167 => 387, 168 => 387, 170 => 880, 171 => 448,
+	172 => 566, 173 => 716,	174 => 903, 175 => 460, 176 => 805, 177 => 275, 178 => 276, 179 => 550, 180 => 886, 181 => 582,
+	182 => 529, 183 => 738,	184 => 529, 185 => 738, 186 => 357, 187 => 529, 188 => 406, 189 => 406, 190 => 575, 191 => 406,
+	192 => 934, 193 => 934,	194 => 934, 195 => 646, 196 => 646, 197 => 646, 198 => 646, 199 => 646, 200 => 646, 201 => 617,
+	202 => 567, 203 => 567, 204 => 567, 205 => 567, 206 => 320, 207 => 320, 208 => 320, 209 => 320, 210 => 681, 211 => 710,
+	212 => 716, 213 => 716, 214 => 716, 215 => 716, 216 => 716, 217 => 529, 218 => 690, 219 => 690, 220 => 690, 221 => 690,
+	222 => 634, 223 => 605, 224 => 509, 225 => 509, 226 => 509, 227 => 509, 228 => 509, 229 => 509, 230 => 478, 231 => 503,
+	232 => 503, 233 => 503, 234 => 503, 235 => 275, 236 => 275, 237 => 275, 238 => 275, 239 => 550, 240 => 579, 241 => 550,
+	242 => 550, 243 => 550, 244 => 550, 245 => 550, 246 => 529, 247 => 575, 248 => 575, 249 => 575, 250 => 575, 251 => 529,
+	252 => 578, 253 => 529, 254 => 517, 255 => 634, 256 => 578, 257 => 445, 258 => 444, 259 => 842, 260 => 453, 261 => 614,
+);
+$_cr = array(
+	array(231, 632, 500), // half-width
+	array(8718, 8718, 500),
+	array(9738, 9757, 250), // quarter-width
+	array(9758, 9778, 333), // third-width
+	array(12063, 12087, 500),
+);
+foreach($_cr as $_r) {
+	for($i = $_r[0]; $i <= $_r[1]; $i++) {
+		$cw[$i+31] = $_r[2];
+	}
+}
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/msungstdlight.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/msungstdlight.php
new file mode 100644
index 00000000..a71ea295
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/msungstdlight.php
@@ -0,0 +1,38 @@
+<?php
+$type = 'cidfont0';
+$name = 'MSungStd-Light-Acro';
+$displayname = 'MSung Light (Trad. Chinese)';
+$desc = array(
+	'Ascent' => 880,
+	'Descent' => -120,
+	'CapHeight' => 880,
+	'Flags' => 6,
+	'FontBBox' => '[-160 -249 1015 1071]',
+	'ItalicAngle' => 0,
+	'StemV' => 93,
+);
+$cidinfo = array(
+	'Registry' => 'Adobe',
+	'Ordering' => 'CNS1',
+	'Supplement' => '3',
+);
+$enc = 'UniCNS-UCS2-H';
+
+$up = -130;
+$ut = 40;
+
+$dw = 1000;
+$cw = array(
+	32 => 250, 33 => 250, 34 => 408, 35 => 668, 36 => 490, 37 => 875, 38 => 698, 39 => 250, 40 => 240, 41 => 240,
+	42 => 417, 43 => 667, 44 => 250, 45 => 313, 46 => 250, 47 => 520, 48 => 500, 49 => 500, 50 => 500, 51 => 500,
+	52 => 500, 53 => 500, 54 => 500, 55 => 500, 56 => 500, 57 => 500, 58 => 250, 59 => 250, 60 => 667, 61 => 667,
+	62 => 667, 63 => 396, 64 => 921, 65 => 677, 66 => 615, 67 => 719, 68 => 760, 69 => 625, 70 => 552, 71 => 771,
+	72 => 802, 73 => 354, 74 => 354, 75 => 781, 76 => 604, 77 => 927, 78 => 750, 79 => 823, 80 => 563, 81 => 823,
+	82 => 729, 83 => 542, 84 => 698, 85 => 771, 86 => 729, 87 => 948, 88 => 771, 89 => 677, 90 => 635, 91 => 344,
+	92 => 520, 93 => 344, 94 => 469, 95 => 500, 96 => 250, 97 => 469, 98 => 521, 99 => 427, 100 => 521, 101 => 438,
+	102 => 271, 103 => 469, 104 => 531, 105 => 250, 106 => 250, 107 => 458, 108 => 240, 109 => 802, 110 => 531, 111 => 500,
+	112 => 521, 113 => 521, 114 => 365, 115 => 333, 116 => 292, 117 => 521, 118 => 458, 119 => 677, 120 => 479, 121 => 458,
+	122 => 427, 123 => 480, 124 => 496, 125 => 480, 126 => 667,
+	17601 => 500,
+);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourier.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourier.php
new file mode 100644
index 00000000..9b843ec8
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourier.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='Type1';
+$name='PDFACourier';
+$up=-100;
+$ut=50;
+$dw=600;
+$diff='';
+$enc='cp1252';
+$file='pdfacourier.z';
+$size1=5067;
+$size2=35145;
+$desc=array('Flags'=>33,'FontBBox'=>'[0 -200 600 794]','ItalicAngle'=>0,'Ascent'=>794,'Descent'=>-200,'Leading'=>0,'CapHeight'=>563,'XHeight'=>417,'StemV'=>70,'StemH'=>30,'AvgWidth'=>600,'MaxWidth'=>600,'MissingWidth'=>600);
+$cw=array(0=>600,1=>600,2=>600,3=>600,4=>600,5=>600,6=>600,7=>600,8=>600,9=>600,10=>600,11=>600,12=>600,13=>600,14=>600,15=>600,16=>600,17=>600,18=>600,19=>600,20=>600,21=>600,22=>600,23=>600,24=>600,25=>600,26=>600,27=>600,28=>600,29=>600,30=>600,31=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600,127=>600,128=>600,129=>600,130=>600,131=>600,132=>600,133=>600,134=>600,135=>600,136=>600,137=>600,138=>600,139=>600,140=>600,141=>600,142=>600,143=>600,144=>600,145=>600,146=>600,147=>600,148=>600,149=>600,150=>600,151=>600,152=>600,153=>600,154=>600,155=>600,156=>600,157=>600,158=>600,159=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600,208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourier.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourier.z
new file mode 100644
index 00000000..2a05b4d4
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourier.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourierb.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourierb.php
new file mode 100644
index 00000000..12e1b3b0
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourierb.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='Type1';
+$name='PDFACourierBold';
+$up=-100;
+$ut=50;
+$dw=600;
+$diff='';
+$enc='cp1252';
+$file='pdfacourierb.z';
+$size1=5086;
+$size2=37197;
+$desc=array('Flags'=>262177,'FontBBox'=>'[-43 -200 630 800]','ItalicAngle'=>0,'Ascent'=>800,'Descent'=>-200,'Leading'=>0,'CapHeight'=>583,'XHeight'=>437,'StemV'=>70,'StemH'=>30,'AvgWidth'=>600,'MaxWidth'=>600,'MissingWidth'=>600);
+$cw=array(0=>600,1=>600,2=>600,3=>600,4=>600,5=>600,6=>600,7=>600,8=>600,9=>600,10=>600,11=>600,12=>600,13=>600,14=>600,15=>600,16=>600,17=>600,18=>600,19=>600,20=>600,21=>600,22=>600,23=>600,24=>600,25=>600,26=>600,27=>600,28=>600,29=>600,30=>600,31=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600,127=>600,128=>600,129=>600,130=>600,131=>600,132=>600,133=>600,134=>600,135=>600,136=>600,137=>600,138=>600,139=>600,140=>600,141=>600,142=>600,143=>600,144=>600,145=>600,146=>600,147=>600,148=>600,149=>600,150=>600,151=>600,152=>600,153=>600,154=>600,155=>600,156=>600,157=>600,158=>600,159=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600,208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourierb.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourierb.z
new file mode 100644
index 00000000..dd6282a4
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourierb.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourierbi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourierbi.php
new file mode 100644
index 00000000..41c17da7
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourierbi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='Type1';
+$name='PDFACourierBoldOblique';
+$up=-100;
+$ut=50;
+$dw=600;
+$diff='';
+$enc='cp1252';
+$file='pdfacourierbi.z';
+$size1=5116;
+$size2=42289;
+$desc=array('Flags'=>262241,'FontBBox'=>'[-43 -200 735 800]','ItalicAngle'=>-12,'Ascent'=>800,'Descent'=>-200,'Leading'=>0,'CapHeight'=>583,'XHeight'=>437,'StemV'=>70,'StemH'=>30,'AvgWidth'=>600,'MaxWidth'=>600,'MissingWidth'=>600);
+$cw=array(0=>600,1=>600,2=>600,3=>600,4=>600,5=>600,6=>600,7=>600,8=>600,9=>600,10=>600,11=>600,12=>600,13=>600,14=>600,15=>600,16=>600,17=>600,18=>600,19=>600,20=>600,21=>600,22=>600,23=>600,24=>600,25=>600,26=>600,27=>600,28=>600,29=>600,30=>600,31=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600,127=>600,128=>600,129=>600,130=>600,131=>600,132=>600,133=>600,134=>600,135=>600,136=>600,137=>600,138=>600,139=>600,140=>600,141=>600,142=>600,143=>600,144=>600,145=>600,146=>600,147=>600,148=>600,149=>600,150=>600,151=>600,152=>600,153=>600,154=>600,155=>600,156=>600,157=>600,158=>600,159=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600,208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourierbi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourierbi.z
new file mode 100644
index 00000000..5bf8dc91
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourierbi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourieri.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourieri.php
new file mode 100644
index 00000000..d27bc905
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourieri.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='Type1';
+$name='PDFACourierOblique';
+$up=-100;
+$ut=50;
+$dw=600;
+$diff='';
+$enc='cp1252';
+$file='pdfacourieri.z';
+$size1=5100;
+$size2=32883;
+$desc=array('Flags'=>97,'FontBBox'=>'[-27 -200 710 783]','ItalicAngle'=>-12,'Ascent'=>783,'Descent'=>-200,'Leading'=>0,'CapHeight'=>563,'XHeight'=>417,'StemV'=>70,'StemH'=>30,'AvgWidth'=>600,'MaxWidth'=>600,'MissingWidth'=>600);
+$cw=array(0=>600,1=>600,2=>600,3=>600,4=>600,5=>600,6=>600,7=>600,8=>600,9=>600,10=>600,11=>600,12=>600,13=>600,14=>600,15=>600,16=>600,17=>600,18=>600,19=>600,20=>600,21=>600,22=>600,23=>600,24=>600,25=>600,26=>600,27=>600,28=>600,29=>600,30=>600,31=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600,127=>600,128=>600,129=>600,130=>600,131=>600,132=>600,133=>600,134=>600,135=>600,136=>600,137=>600,138=>600,139=>600,140=>600,141=>600,142=>600,143=>600,144=>600,145=>600,146=>600,147=>600,148=>600,149=>600,150=>600,151=>600,152=>600,153=>600,154=>600,155=>600,156=>600,157=>600,158=>600,159=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600,208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourieri.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourieri.z
new file mode 100644
index 00000000..cb2a06bd
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfacourieri.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelvetica.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelvetica.php
new file mode 100644
index 00000000..6fdef5aa
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelvetica.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='Type1';
+$name='PDFAHelvetica';
+$up=-151;
+$ut=50;
+$dw=500;
+$diff='';
+$enc='cp1252';
+$file='pdfahelvetica.z';
+$size1=5081;
+$size2=22907;
+$desc=array('Flags'=>32,'FontBBox'=>'[-22 -220 1001 966]','ItalicAngle'=>0,'Ascent'=>966,'Descent'=>-220,'Leading'=>0,'CapHeight'=>709,'XHeight'=>524,'StemV'=>70,'StemH'=>30,'AvgWidth'=>543,'MaxWidth'=>1015,'MissingWidth'=>500);
+$cw=array(0=>500,1=>500,2=>500,3=>500,4=>500,5=>500,6=>500,7=>500,8=>500,9=>500,10=>500,11=>500,12=>500,13=>500,14=>500,15=>500,16=>500,17=>500,18=>500,19=>500,20=>500,21=>500,22=>500,23=>500,24=>500,25=>500,26=>500,27=>500,28=>500,29=>500,30=>500,31=>500,32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584,62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278,92=>278,93=>277,94=>469,95=>556,96=>333,97=>556,98=>556,99=>500,100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556,112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584,127=>500,128=>655,129=>500,130=>222,131=>278,132=>333,133=>1000,134=>556,135=>556,136=>333,137=>1000,138=>667,139=>250,140=>1000,141=>500,142=>611,143=>500,144=>500,145=>222,146=>221,147=>333,148=>333,149=>350,150=>556,151=>1000,152=>333,153=>1000,154=>500,155=>250,156=>938,157=>500,158=>500,159=>667,160=>278,161=>278,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>448,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584,178=>350,179=>350,180=>333,181=>556,182=>537,183=>278,184=>333,185=>350,186=>365,187=>448,188=>869,189=>869,190=>879,191=>556,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>666,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>896,231=>500,232=>556,233=>556,234=>556,235=>556,236=>251,237=>251,238=>251,239=>251,240=>556,241=>556,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>555,255=>500);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelvetica.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelvetica.z
new file mode 100644
index 00000000..e733a8c5
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelvetica.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticab.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticab.php
new file mode 100644
index 00000000..39681506
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticab.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='Type1';
+$name='PDFAHelveticaBold';
+$up=-155;
+$ut=69;
+$dw=500;
+$diff='';
+$enc='cp1252';
+$file='pdfahelveticab.z';
+$size1=5098;
+$size2=23246;
+$desc=array('Flags'=>262176,'FontBBox'=>'[-22 -220 1003 949]','ItalicAngle'=>0,'Ascent'=>949,'Descent'=>-220,'Leading'=>0,'CapHeight'=>724,'XHeight'=>540,'StemV'=>70,'StemH'=>30,'AvgWidth'=>565,'MaxWidth'=>1000,'MissingWidth'=>500);
+$cw=array(0=>500,1=>500,2=>500,3=>500,4=>500,5=>500,6=>500,7=>500,8=>500,9=>500,10=>500,11=>500,12=>500,13=>500,14=>500,15=>500,16=>500,17=>500,18=>500,19=>500,20=>500,21=>500,22=>500,23=>500,24=>500,25=>500,26=>500,27=>500,28=>500,29=>500,30=>500,31=>500,32=>278,33=>333,34=>474,35=>556,36=>556,37=>889,38=>722,39=>238,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>333,59=>333,60=>584,61=>584,62=>584,63=>611,64=>975,65=>722,66=>722,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>556,75=>722,76=>611,77=>833,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>333,92=>278,93=>333,94=>584,95=>556,96=>333,97=>556,98=>611,99=>556,100=>611,101=>556,102=>333,103=>611,104=>611,105=>278,106=>278,107=>556,108=>278,109=>889,110=>611,111=>611,112=>611,113=>611,114=>389,115=>556,116=>333,117=>611,118=>556,119=>778,120=>556,121=>556,122=>500,123=>389,124=>280,125=>389,126=>584,127=>500,128=>640,129=>500,130=>278,131=>333,132=>500,133=>1000,134=>556,135=>556,136=>333,137=>1000,138=>667,139=>333,140=>1000,141=>500,142=>611,143=>500,144=>500,145=>278,146=>278,147=>500,148=>500,149=>350,150=>556,151=>1000,152=>333,153=>1000,154=>556,155=>333,156=>953,157=>500,158=>500,159=>667,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>280,167=>556,168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584,178=>351,179=>351,180=>333,181=>611,182=>556,183=>278,184=>333,185=>300,186=>365,187=>556,188=>869,189=>869,190=>869,191=>611,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>889,231=>556,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278,238=>278,239=>278,240=>611,241=>611,242=>611,243=>611,244=>611,245=>611,246=>611,247=>584,248=>611,249=>611,250=>611,251=>611,252=>611,253=>556,254=>611,255=>556);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticab.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticab.z
new file mode 100644
index 00000000..7c575f92
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticab.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticabi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticabi.php
new file mode 100644
index 00000000..2822fd23
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticabi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='Type1';
+$name='PDFAHelveticaBoldOblique';
+$up=-111;
+$ut=69;
+$dw=500;
+$diff='';
+$enc='cp1252';
+$file='pdfahelveticabi.z';
+$size1=5129;
+$size2=30559;
+$desc=array('Flags'=>262240,'FontBBox'=>'[-65 -220 1107 953]','ItalicAngle'=>-12,'Ascent'=>953,'Descent'=>-220,'Leading'=>0,'CapHeight'=>724,'XHeight'=>540,'StemV'=>70,'StemH'=>30,'AvgWidth'=>565,'MaxWidth'=>1000,'MissingWidth'=>500);
+$cw=array(0=>500,1=>500,2=>500,3=>500,4=>500,5=>500,6=>500,7=>500,8=>500,9=>500,10=>500,11=>500,12=>500,13=>500,14=>500,15=>500,16=>500,17=>500,18=>500,19=>500,20=>500,21=>500,22=>500,23=>500,24=>500,25=>500,26=>500,27=>500,28=>500,29=>500,30=>500,31=>500,32=>278,33=>333,34=>474,35=>556,36=>556,37=>889,38=>722,39=>238,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>333,59=>333,60=>584,61=>584,62=>584,63=>611,64=>975,65=>722,66=>722,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>556,75=>722,76=>611,77=>833,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>333,92=>278,93=>333,94=>584,95=>556,96=>333,97=>556,98=>611,99=>556,100=>611,101=>556,102=>333,103=>611,104=>611,105=>278,106=>278,107=>556,108=>278,109=>889,110=>611,111=>611,112=>611,113=>611,114=>389,115=>556,116=>333,117=>611,118=>556,119=>778,120=>556,121=>556,122=>500,123=>389,124=>280,125=>389,126=>584,127=>500,128=>640,129=>500,130=>278,131=>333,132=>500,133=>1000,134=>556,135=>556,136=>333,137=>1000,138=>667,139=>333,140=>1000,141=>500,142=>611,143=>500,144=>500,145=>278,146=>278,147=>500,148=>500,149=>350,150=>556,151=>1000,152=>333,153=>1000,154=>556,155=>333,156=>962,157=>500,158=>500,159=>667,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>280,167=>556,168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584,178=>350,179=>350,180=>333,181=>667,182=>556,183=>278,184=>333,185=>248,186=>365,187=>556,188=>869,189=>869,190=>869,191=>611,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>892,231=>556,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278,238=>278,239=>278,240=>611,241=>611,242=>611,243=>611,244=>611,245=>611,246=>611,247=>584,248=>611,249=>611,250=>611,251=>611,252=>611,253=>556,254=>611,255=>556);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticabi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticabi.z
new file mode 100644
index 00000000..57cb3ab5
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticabi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticai.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticai.php
new file mode 100644
index 00000000..ff0915d1
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticai.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='Type1';
+$name='PDFAHelveticaOblique';
+$up=-151;
+$ut=50;
+$dw=500;
+$diff='';
+$enc='cp1252';
+$file='pdfahelveticai.z';
+$size1=5112;
+$size2=26708;
+$desc=array('Flags'=>96,'FontBBox'=>'[-65 -218 1108 970]','ItalicAngle'=>-12,'Ascent'=>970,'Descent'=>-218,'Leading'=>0,'CapHeight'=>709,'XHeight'=>524,'StemV'=>70,'StemH'=>30,'AvgWidth'=>544,'MaxWidth'=>1015,'MissingWidth'=>500);
+$cw=array(0=>500,1=>500,2=>500,3=>500,4=>500,5=>500,6=>500,7=>500,8=>500,9=>500,10=>500,11=>500,12=>500,13=>500,14=>500,15=>500,16=>500,17=>500,18=>500,19=>500,20=>500,21=>500,22=>500,23=>500,24=>500,25=>500,26=>500,27=>500,28=>500,29=>500,30=>500,31=>500,32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584,62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278,92=>278,93=>278,94=>469,95=>556,96=>333,97=>556,98=>556,99=>500,100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556,112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584,127=>500,128=>655,129=>500,130=>222,131=>278,132=>333,133=>1000,134=>556,135=>556,136=>333,137=>1000,138=>667,139=>250,140=>1000,141=>500,142=>611,143=>500,144=>500,145=>222,146=>222,147=>333,148=>333,149=>350,150=>556,151=>1000,152=>333,153=>1000,154=>500,155=>250,156=>937,157=>500,158=>500,159=>667,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>444,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584,178=>352,179=>352,180=>333,181=>556,182=>537,183=>278,184=>333,185=>250,186=>365,187=>444,188=>947,189=>947,190=>947,191=>611,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>897,231=>500,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278,238=>278,239=>278,240=>556,241=>556,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>556,255=>500);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticai.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticai.z
new file mode 100644
index 00000000..ada7ee8f
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfahelveticai.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfasymbol.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfasymbol.php
new file mode 100644
index 00000000..0af8051a
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfasymbol.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='Type1';
+$name='PDFASymbol';
+$up=-100;
+$ut=50;
+$dw=500;
+$diff='32 /space /exclam /universal /numbersign /existential /percent /ampersand /suchthat /parenleft /parenright /asteriskmath /plus /comma /minus /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /congruent /Alpha /Beta /Chi /Delta /Epsilon /Phi /Gamma /Eta /Iota /theta1 /Kappa /Lambda /Mu /Nu /Omicron /Pi /Theta /Rho /Sigma /Tau /Upsilon /sigma1 /Omega /Xi /Psi /Zeta /bracketleft /therefore /bracketright /perpendicular /underscore /radicalex /alpha /beta /chi /delta /epsilon /phi /gamma /eta /iota /phi1 /kappa /lambda /mu /nu /omicron /pi /theta /rho /sigma /tau /upsilon /omega1 /omega /xi /psi /zeta /braceleft /bar /braceright /similar /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /Euro /Upsilon1 /minute /lessequal /fraction /infinity /florin /club /diamond /heart /spade /arrowboth /arrowleft /arrowup /arrowright /arrowdown /degree /plusminus /second /greaterequal /multiply /proportional /partialdiff /bullet /divide /notequal /equivalence /approxequal /ellipsis /arrowvertex /arrowhorizex /carriagereturn /aleph /Ifraktur /Rfraktur /weierstrass /circlemultiply /circleplus /emptyset /intersection /union /propersuperset /reflexsuperset /notsubset /propersubset /reflexsubset /element /notelement /angle /gradient /registerserif /copyrightserif /trademarkserif /product /radical /dotmath /logicalnot /logicaland /logicalor /arrowdblboth /arrowdblleft /arrowdblup /arrowdblright /arrowdbldown /lozenge /angleleft /registersans /copyrightsans /trademarksans /summation /parenlefttp /parenleftex /parenleftbt /bracketlefttp /bracketleftex /bracketleftbt /bracelefttp /braceleftmid /braceleftbt /braceex /.notdef /angleright /integral /integraltp /integralex /integralbt /parenrighttp /parenrightex /parenrightbt /bracketrighttp /bracketrightex /bracketrightbt /bracerighttp /bracerightmid /bracerightbt /.notdef ';
+$enc='symbol';
+$file='pdfasymbol.z';
+$size1=4188;
+$size2=28326;
+$desc=array('Flags'=>4,'FontBBox'=>'[-168 -233 997 900]','ItalicAngle'=>0,'Ascent'=>900,'Descent'=>-233,'Leading'=>0,'CapHeight'=>661,'XHeight'=>460,'StemV'=>70,'StemH'=>30,'AvgWidth'=>578,'MaxWidth'=>1008,'MissingWidth'=>500);
+$cw=array(0=>500,1=>500,2=>500,3=>500,4=>500,5=>500,6=>500,7=>500,8=>500,9=>500,10=>500,11=>500,12=>500,13=>500,14=>500,15=>500,16=>500,17=>500,18=>500,19=>500,20=>500,21=>500,22=>500,23=>500,24=>500,25=>500,26=>500,27=>500,28=>500,29=>500,30=>500,31=>500,32=>250,33=>333,34=>587,35=>500,36=>587,37=>833,38=>778,39=>439,40=>333,41=>333,42=>471,43=>564,44=>250,45=>564,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>278,59=>278,60=>564,61=>564,62=>564,63=>444,64=>636,65=>722,66=>667,67=>722,68=>660,69=>611,70=>742,71=>586,72=>722,73=>333,74=>587,75=>722,76=>722,77=>889,78=>722,79=>722,80=>722,81=>726,82=>556,83=>627,84=>611,85=>696,86=>452,87=>743,88=>628,89=>808,90=>611,91=>333,92=>565,93=>333,94=>712,95=>500,96=>500,97=>583,98=>527,99=>480,100=>534,101=>426,102=>643,103=>480,104=>536,105=>286,106=>640,107=>544,108=>476,109=>536,110=>480,111=>500,112=>587,113=>534,114=>528,115=>537,116=>420,117=>514,118=>684,119=>693,120=>514,121=>693,122=>466,123=>480,124=>200,125=>480,126=>636,127=>500,128=>500,129=>500,130=>500,131=>500,132=>500,133=>500,134=>500,135=>500,136=>500,137=>500,138=>500,139=>500,140=>500,141=>500,142=>500,143=>500,144=>500,145=>500,146=>500,147=>500,148=>500,149=>500,150=>500,151=>500,152=>500,153=>500,154=>500,155=>500,156=>500,157=>500,158=>500,159=>500,160=>500,161=>620,162=>247,163=>636,164=>167,165=>853,166=>358,167=>770,168=>770,169=>770,170=>770,171=>964,172=>964,173=>472,174=>964,175=>500,176=>400,177=>564,178=>411,179=>636,180=>564,181=>636,182=>494,183=>350,184=>564,185=>564,186=>636,187=>636,188=>1000,189=>500,190=>500,191=>658,192=>537,193=>613,194=>711,195=>832,196=>636,197=>636,198=>746,199=>654,200=>654,201=>636,202=>636,203=>636,204=>636,205=>636,206=>536,207=>536,208=>575,209=>612,210=>792,211=>793,212=>1008,213=>823,214=>549,215=>250,216=>564,217=>564,218=>564,219=>964,220=>964,221=>550,222=>964,223=>550,224=>512,225=>329,226=>500,227=>500,228=>500,229=>713,230=>500,231=>500,232=>500,233=>500,234=>500,235=>500,236=>500,237=>500,238=>500,239=>500,240=>500,241=>329,242=>416,243=>686,244=>500,245=>686,246=>500,247=>500,248=>500,249=>500,250=>500,251=>500,252=>500,253=>500,254=>500,255=>333);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfasymbol.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfasymbol.z
new file mode 100644
index 00000000..7deafb64
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfasymbol.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimes.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimes.php
new file mode 100644
index 00000000..49de77be
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimes.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='Type1';
+$name='PDFATimes';
+$up=-100;
+$ut=50;
+$dw=500;
+$diff='';
+$enc='cp1252';
+$file='pdfatimes.z';
+$size1=5061;
+$size2=36652;
+$desc=array('Flags'=>32,'FontBBox'=>'[-70 -218 1000 900]','ItalicAngle'=>0,'Ascent'=>900,'Descent'=>-218,'Leading'=>0,'CapHeight'=>662,'XHeight'=>450,'StemV'=>70,'StemH'=>30,'AvgWidth'=>517,'MaxWidth'=>1008,'MissingWidth'=>500);
+$cw=array(0=>500,1=>500,2=>500,3=>500,4=>500,5=>500,6=>500,7=>500,8=>500,9=>500,10=>500,11=>500,12=>500,13=>500,14=>500,15=>500,16=>500,17=>500,18=>500,19=>500,20=>500,21=>500,22=>500,23=>500,24=>500,25=>500,26=>500,27=>500,28=>500,29=>500,30=>500,31=>500,32=>250,33=>333,34=>408,35=>500,36=>500,37=>833,38=>778,39=>180,40=>333,41=>333,42=>500,43=>564,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>278,59=>278,60=>564,61=>564,62=>564,63=>444,64=>921,65=>722,66=>667,67=>667,68=>722,69=>611,70=>556,71=>722,72=>722,73=>333,74=>389,75=>722,76=>611,77=>889,78=>722,79=>722,80=>556,81=>722,82=>667,83=>556,84=>611,85=>722,86=>722,87=>944,88=>722,89=>722,90=>611,91=>333,92=>296,93=>333,94=>469,95=>500,96=>333,97=>444,98=>500,99=>444,100=>500,101=>444,102=>333,103=>500,104=>500,105=>278,106=>278,107=>500,108=>278,109=>778,110=>500,111=>500,112=>500,113=>500,114=>333,115=>389,116=>278,117=>500,118=>500,119=>722,120=>500,121=>500,122=>444,123=>480,124=>200,125=>480,126=>541,127=>500,128=>741,129=>500,130=>250,131=>358,132=>444,133=>1000,134=>500,135=>500,136=>333,137=>1000,138=>556,139=>250,140=>889,141=>500,142=>611,143=>500,144=>500,145=>250,146=>250,147=>444,148=>444,149=>350,150=>500,151=>1000,152=>333,153=>1008,154=>389,155=>250,156=>709,157=>500,158=>444,159=>722,160=>250,161=>333,162=>500,163=>500,164=>500,165=>500,166=>200,167=>500,168=>333,169=>793,170=>276,171=>444,172=>564,173=>333,174=>792,175=>333,176=>400,177=>564,178=>320,179=>320,180=>333,181=>500,182=>483,183=>250,184=>333,185=>320,186=>310,187=>441,188=>750,189=>750,190=>750,191=>444,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>889,199=>667,200=>611,201=>611,202=>611,203=>611,204=>333,205=>333,206=>333,207=>333,208=>722,209=>722,210=>722,211=>722,212=>722,213=>722,214=>722,215=>564,216=>722,217=>722,218=>722,219=>722,220=>722,221=>722,222=>576,223=>500,224=>444,225=>444,226=>444,227=>444,228=>444,229=>444,230=>651,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278,238=>278,239=>278,240=>501,241=>500,242=>500,243=>500,244=>500,245=>500,246=>500,247=>564,248=>500,249=>500,250=>500,251=>500,252=>500,253=>500,254=>496,255=>500);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimes.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimes.z
new file mode 100644
index 00000000..fa2fcab8
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimes.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesb.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesb.php
new file mode 100644
index 00000000..837a5d98
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesb.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='Type1';
+$name='PDFATimesBold';
+$up=-100;
+$ut=50;
+$dw=500;
+$diff='';
+$enc='cp1252';
+$file='pdfatimesb.z';
+$size1=5079;
+$size2=35781;
+$desc=array('Flags'=>262176,'FontBBox'=>'[-107 -218 1065 900]','ItalicAngle'=>0,'Ascent'=>900,'Descent'=>-218,'Leading'=>0,'CapHeight'=>676,'XHeight'=>461,'StemV'=>70,'StemH'=>30,'AvgWidth'=>544,'MaxWidth'=>1086,'MissingWidth'=>500);
+$cw=array(0=>500,1=>500,2=>500,3=>500,4=>500,5=>500,6=>500,7=>500,8=>500,9=>500,10=>500,11=>500,12=>500,13=>500,14=>500,15=>500,16=>500,17=>500,18=>500,19=>500,20=>500,21=>500,22=>500,23=>500,24=>500,25=>500,26=>500,27=>500,28=>500,29=>500,30=>500,31=>500,32=>250,33=>333,34=>555,35=>500,36=>500,37=>1000,38=>833,39=>278,40=>333,41=>333,42=>507,43=>676,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333,60=>676,61=>676,62=>676,63=>500,64=>930,65=>722,66=>667,67=>722,68=>724,69=>667,70=>611,71=>778,72=>774,73=>386,74=>500,75=>764,76=>664,77=>943,78=>722,79=>778,80=>611,81=>778,82=>712,83=>556,84=>667,85=>722,86=>722,87=>1000,88=>722,89=>722,90=>667,91=>333,92=>278,93=>333,94=>581,95=>500,96=>333,97=>500,98=>546,99=>444,100=>556,101=>444,102=>333,103=>500,104=>556,105=>278,106=>333,107=>556,108=>278,109=>833,110=>556,111=>500,112=>549,113=>547,114=>444,115=>389,116=>333,117=>556,118=>500,119=>722,120=>500,121=>500,122=>444,123=>394,124=>220,125=>394,126=>520,127=>500,128=>761,129=>500,130=>250,131=>333,132=>500,133=>1000,134=>500,135=>500,136=>333,137=>1000,138=>556,139=>333,140=>1000,141=>500,142=>667,143=>500,144=>500,145=>250,146=>250,147=>500,148=>500,149=>524,150=>500,151=>1000,152=>333,153=>1086,154=>389,155=>333,156=>717,157=>500,158=>444,159=>722,160=>250,161=>333,162=>500,163=>500,164=>500,165=>500,166=>220,167=>500,168=>333,169=>747,170=>300,171=>500,172=>680,173=>333,174=>747,175=>333,176=>400,177=>676,178=>300,179=>300,180=>333,181=>556,182=>540,183=>250,184=>333,185=>270,186=>330,187=>500,188=>750,189=>750,190=>750,191=>500,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>389,205=>389,206=>389,207=>389,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>676,216=>778,217=>722,218=>722,219=>722,220=>722,221=>722,222=>632,223=>556,224=>500,225=>500,226=>500,227=>500,228=>500,229=>500,230=>703,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>556,242=>500,243=>500,244=>500,245=>500,246=>500,247=>676,248=>500,249=>556,250=>556,251=>556,252=>556,253=>500,254=>556,255=>500);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesb.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesb.z
new file mode 100644
index 00000000..341ef312
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesb.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesbi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesbi.php
new file mode 100644
index 00000000..52eeff25
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesbi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='Type1';
+$name='PDFATimesBoldItalic';
+$up=-100;
+$ut=50;
+$dw=500;
+$diff='';
+$enc='cp1252';
+$file='pdfatimesbi.z';
+$size1=5108;
+$size2=38307;
+$desc=array('Flags'=>262240,'FontBBox'=>'[-200 -218 1121 900]','ItalicAngle'=>-15,'Ascent'=>900,'Descent'=>-218,'Leading'=>0,'CapHeight'=>669,'XHeight'=>462,'StemV'=>70,'StemH'=>30,'AvgWidth'=>525,'MaxWidth'=>1086,'MissingWidth'=>500);
+$cw=array(0=>500,1=>500,2=>500,3=>500,4=>500,5=>500,6=>500,7=>500,8=>500,9=>500,10=>500,11=>500,12=>500,13=>500,14=>500,15=>500,16=>500,17=>500,18=>500,19=>500,20=>500,21=>500,22=>500,23=>500,24=>500,25=>500,26=>500,27=>500,28=>500,29=>500,30=>500,31=>500,32=>250,33=>389,34=>555,35=>500,36=>500,37=>833,38=>778,39=>278,40=>333,41=>333,42=>500,43=>570,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333,60=>570,61=>570,62=>570,63=>500,64=>832,65=>667,66=>667,67=>667,68=>744,69=>670,70=>656,71=>722,72=>778,73=>393,74=>500,75=>664,76=>609,77=>896,78=>722,79=>722,80=>614,81=>722,82=>672,83=>556,84=>611,85=>722,86=>667,87=>889,88=>667,89=>611,90=>611,91=>333,92=>278,93=>333,94=>570,95=>500,96=>333,97=>500,98=>500,99=>444,100=>500,101=>444,102=>333,103=>500,104=>556,105=>278,106=>278,107=>500,108=>278,109=>778,110=>556,111=>500,112=>500,113=>500,114=>389,115=>389,116=>278,117=>556,118=>444,119=>667,120=>500,121=>444,122=>389,123=>348,124=>220,125=>348,126=>570,127=>500,128=>761,129=>500,130=>250,131=>333,132=>500,133=>1000,134=>500,135=>500,136=>333,137=>1000,138=>556,139=>333,140=>944,141=>500,142=>611,143=>500,144=>500,145=>250,146=>250,147=>500,148=>500,149=>350,150=>500,151=>1000,152=>333,153=>1086,154=>389,155=>333,156=>711,157=>500,158=>389,159=>611,160=>250,161=>389,162=>500,163=>500,164=>500,165=>500,166=>220,167=>500,168=>333,169=>747,170=>266,171=>500,172=>606,173=>333,174=>747,175=>333,176=>400,177=>570,178=>300,179=>300,180=>333,181=>576,182=>500,183=>250,184=>333,185=>272,186=>300,187=>500,188=>750,189=>750,190=>750,191=>500,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>944,199=>667,200=>667,201=>667,202=>667,203=>667,204=>389,205=>389,206=>389,207=>389,208=>722,209=>722,210=>722,211=>722,212=>722,213=>722,214=>722,215=>570,216=>722,217=>722,218=>722,219=>722,220=>722,221=>611,222=>609,223=>500,224=>500,225=>500,226=>500,227=>500,228=>500,229=>500,230=>703,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>556,242=>500,243=>500,244=>500,245=>500,246=>500,247=>570,248=>500,249=>556,250=>556,251=>556,252=>556,253=>444,254=>500,255=>444);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesbi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesbi.z
new file mode 100644
index 00000000..c0d9c7a1
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesbi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesi.php
new file mode 100644
index 00000000..4d15e94a
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesi.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='Type1';
+$name='PDFATimesItalic';
+$up=-100;
+$ut=50;
+$dw=500;
+$diff='';
+$enc='cp1252';
+$file='pdfatimesi.z';
+$size1=5091;
+$size2=33525;
+$desc=array('Flags'=>96,'FontBBox'=>'[-168 -217 1053 900]','ItalicAngle'=>-15,'Ascent'=>900,'Descent'=>-217,'Leading'=>0,'CapHeight'=>653,'XHeight'=>441,'StemV'=>70,'StemH'=>30,'AvgWidth'=>511,'MaxWidth'=>1000,'MissingWidth'=>500);
+$cw=array(0=>500,1=>500,2=>500,3=>500,4=>500,5=>500,6=>500,7=>500,8=>500,9=>500,10=>500,11=>500,12=>500,13=>500,14=>500,15=>500,16=>500,17=>500,18=>500,19=>500,20=>500,21=>500,22=>500,23=>500,24=>500,25=>500,26=>500,27=>500,28=>500,29=>500,30=>500,31=>500,32=>250,33=>333,34=>420,35=>500,36=>500,37=>833,38=>778,39=>214,40=>333,41=>333,42=>500,43=>675,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333,60=>675,61=>675,62=>675,63=>500,64=>920,65=>611,66=>611,67=>667,68=>722,69=>604,70=>611,71=>722,72=>722,73=>339,74=>444,75=>652,76=>556,77=>828,78=>657,79=>722,80=>603,81=>722,82=>616,83=>500,84=>556,85=>722,86=>611,87=>833,88=>611,89=>556,90=>556,91=>389,92=>278,93=>389,94=>422,95=>500,96=>333,97=>500,98=>500,99=>444,100=>500,101=>444,102=>278,103=>500,104=>500,105=>278,106=>278,107=>444,108=>278,109=>722,110=>500,111=>500,112=>500,113=>500,114=>389,115=>389,116=>278,117=>500,118=>444,119=>667,120=>444,121=>444,122=>389,123=>400,124=>275,125=>400,126=>541,127=>500,128=>741,129=>500,130=>250,131=>278,132=>444,133=>889,134=>500,135=>500,136=>333,137=>1000,138=>500,139=>250,140=>944,141=>500,142=>556,143=>500,144=>500,145=>250,146=>250,147=>444,148=>444,149=>350,150=>500,151=>1000,152=>333,153=>920,154=>389,155=>250,156=>694,157=>500,158=>389,159=>556,160=>250,161=>389,162=>500,163=>500,164=>500,165=>500,166=>275,167=>500,168=>333,169=>760,170=>276,171=>444,172=>675,173=>333,174=>760,175=>333,176=>400,177=>675,178=>300,179=>300,180=>333,181=>500,182=>523,183=>250,184=>333,185=>250,186=>310,187=>444,188=>750,189=>750,190=>750,191=>500,192=>611,193=>611,194=>611,195=>611,196=>611,197=>611,198=>889,199=>667,200=>611,201=>611,202=>611,203=>611,204=>333,205=>333,206=>333,207=>333,208=>722,209=>667,210=>722,211=>722,212=>722,213=>722,214=>722,215=>675,216=>722,217=>722,218=>722,219=>722,220=>722,221=>556,222=>611,223=>500,224=>500,225=>500,226=>500,227=>500,228=>500,229=>500,230=>673,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>500,242=>500,243=>500,244=>500,245=>500,246=>500,247=>675,248=>500,249=>500,250=>500,251=>500,252=>500,253=>444,254=>500,255=>444);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesi.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesi.z
new file mode 100644
index 00000000..e72ea740
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfatimesi.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfazapfdingbats.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfazapfdingbats.php
new file mode 100644
index 00000000..2e22503e
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfazapfdingbats.php
@@ -0,0 +1,15 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='Type1';
+$name='PDFAZapfdingbats';
+$up=-100;
+$ut=50;
+$dw=500;
+$diff='';
+$enc='';
+$file='pdfazapfdingbats.z';
+$size1=5065;
+$size2=48653;
+$desc=array('Flags'=>4,'FontBBox'=>'[-1 -218 945 805]','ItalicAngle'=>0,'Ascent'=>805,'Descent'=>-218,'Leading'=>0,'CapHeight'=>700,'XHeight'=>450,'StemV'=>70,'StemH'=>30,'AvgWidth'=>744,'MaxWidth'=>980,'MissingWidth'=>500);
+$cw=array(0=>500,1=>500,2=>500,3=>500,4=>500,5=>500,6=>500,7=>500,8=>500,9=>500,10=>500,11=>500,12=>500,13=>500,14=>500,15=>500,16=>500,17=>500,18=>500,19=>500,20=>500,21=>500,22=>500,23=>500,24=>500,25=>500,26=>500,27=>500,28=>500,29=>500,30=>500,31=>500,32=>250,33=>974,34=>961,35=>974,36=>980,37=>715,38=>789,39=>790,40=>791,41=>690,42=>954,43=>933,44=>549,45=>855,46=>911,47=>933,48=>911,49=>945,50=>974,51=>755,52=>846,53=>762,54=>761,55=>571,56=>677,57=>763,58=>760,59=>759,60=>754,61=>494,62=>552,63=>537,64=>577,65=>692,66=>786,67=>788,68=>788,69=>790,70=>793,71=>794,72=>811,73=>823,74=>789,75=>841,76=>823,77=>833,78=>816,79=>831,80=>923,81=>744,82=>723,83=>749,84=>790,85=>792,86=>695,87=>776,88=>768,89=>792,90=>759,91=>707,92=>708,93=>682,94=>701,95=>826,96=>815,97=>789,98=>789,99=>707,100=>687,101=>696,102=>689,103=>786,104=>787,105=>713,106=>791,107=>785,108=>791,109=>873,110=>761,111=>762,112=>762,113=>759,114=>759,115=>892,116=>892,117=>788,118=>784,119=>791,120=>138,121=>277,122=>415,123=>392,124=>392,125=>668,126=>668,127=>500,128=>390,129=>390,130=>317,131=>317,132=>276,133=>276,134=>509,135=>509,136=>410,137=>410,138=>234,139=>234,140=>334,141=>334,142=>500,143=>500,144=>500,145=>500,146=>500,147=>500,148=>500,149=>500,150=>500,151=>500,152=>500,153=>500,154=>500,155=>500,156=>500,157=>500,158=>500,159=>500,160=>250,161=>732,162=>544,163=>544,164=>910,165=>667,166=>760,167=>760,168=>770,169=>770,170=>770,171=>770,172=>788,173=>788,174=>788,175=>788,176=>788,177=>788,178=>788,179=>788,180=>788,181=>788,182=>788,183=>788,184=>788,185=>788,186=>788,187=>788,188=>788,189=>788,190=>788,191=>788,192=>788,193=>788,194=>788,195=>788,196=>788,197=>788,198=>788,199=>788,200=>788,201=>788,202=>788,203=>788,204=>788,205=>788,206=>788,207=>788,208=>788,209=>788,210=>788,211=>788,212=>894,213=>964,214=>964,215=>499,216=>748,217=>924,218=>748,219=>918,220=>927,221=>928,222=>928,223=>834,224=>873,225=>828,226=>924,227=>924,228=>917,229=>930,230=>931,231=>463,232=>883,233=>836,234=>836,235=>867,236=>867,237=>696,238=>696,239=>874,240=>501,241=>874,242=>760,243=>946,244=>771,245=>865,246=>771,247=>888,248=>967,249=>888,250=>831,251=>873,252=>927,253=>970,254=>918,255=>500);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfazapfdingbats.z b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfazapfdingbats.z
new file mode 100644
index 00000000..ebaf0f5f
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/fonts/pdfazapfdingbats.z differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/stsongstdlight.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/stsongstdlight.php
new file mode 100644
index 00000000..1c74c62d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/stsongstdlight.php
@@ -0,0 +1,39 @@
+<?php
+$type = 'cidfont0';
+$name = 'STSongStd-Light-Acro';
+$displayname = 'STSong Light (Simp. Chinese)';
+$desc = array(
+	'Ascent' => 752,
+	'Descent' => -271,
+	'CapHeight' => 737,
+	'Flags' => 6,
+	'FontBBox' => '[-25 -254 1000 880]',
+	'ItalicAngle' => 0,
+	'StemV' => 58,
+	'Style' => '<< /Panose <000000000400000000000000> >>',
+);
+$cidinfo = array(
+	'Registry' => 'Adobe',
+	'Ordering' => 'GB1',
+	'Supplement' => '2',
+);
+$enc = 'UniGB-UCS2-H';
+
+// underline position, needs checking:
+$up = -130;
+$ut = 40;
+
+$dw = 1000;
+$cw = array(
+	32 => 207, 33 => 270, 34 => 342, 35 => 467, 36 => 462, 37 => 797, 38 => 710, 39 => 239, 40 => 374, 41 => 374,
+	42 => 423, 43 => 605, 44 => 238, 45 => 375, 46 => 238, 47 => 334, 48 => 462, 49 => 462, 50 => 462, 51 => 462,
+	52 => 462, 53 => 462, 54 => 462, 55 => 462, 56 => 462, 57 => 462, 58 => 238, 59 => 238, 60 => 605, 61 => 605,
+	62 => 605, 63 => 344, 64 => 748, 65 => 684, 66 => 560, 67 => 695, 68 => 739, 69 => 563, 70 => 511, 71 => 729,
+	72 => 793, 73 => 318, 74 => 312, 75 => 666, 76 => 526, 77 => 896, 78 => 758, 79 => 772, 80 => 544, 81 => 772,
+	82 => 628, 83 => 465, 84 => 607, 85 => 753, 86 => 711, 87 => 972, 88 => 647, 89 => 620, 90 => 607, 91 => 374,
+	92 => 333, 93 => 374, 94 => 606, 95 => 500, 96 => 239, 97 => 417, 98 => 503, 99 => 427, 100 => 529, 101 => 415,
+	102 => 264, 103 => 444, 104 => 518, 105 => 241, 106 => 230, 107 => 495, 108 => 228, 109 => 793, 110 => 527, 111 => 524,
+	112 => 524, 113 => 504, 114 => 338, 115 => 336, 116 => 277, 117 => 517, 118 => 450, 119 => 652, 120 => 466, 121 => 452,
+	122 => 407, 123 => 370, 124 => 258, 125 => 370, 126 => 605
+);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/symbol.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/symbol.php
new file mode 100644
index 00000000..15f7f1dd
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/symbol.php
@@ -0,0 +1,12 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='core';
+$name='Symbol';
+$up=-100;
+$ut=50;
+$dw=587;
+$diff='';
+$enc='';
+$desc=array('Flags'=>4,'FontBBox'=>'[-180 -293 1090 1010]','ItalicAngle'=>0,'Ascent'=>1010,'Descent'=>-293,'Leading'=>0,'CapHeight'=>1010,'StemV'=>85,'StemH'=>92,'AvgWidth'=>587,'MaxWidth'=>1042,'MissingWidth'=>587);
+$cw=array(0=>587,1=>587,2=>587,3=>587,4=>587,5=>587,6=>587,7=>587,8=>587,9=>587,10=>587,11=>587,12=>587,13=>587,14=>587,15=>587,16=>587,17=>587,18=>587,19=>587,20=>587,21=>587,22=>587,23=>587,24=>587,25=>587,26=>587,27=>587,28=>587,29=>587,30=>587,31=>587,32=>250,33=>333,34=>713,35=>500,36=>549,37=>833,38=>778,39=>439,40=>333,41=>333,42=>500,43=>549,44=>250,45=>549,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>278,59=>278,60=>549,61=>549,62=>549,63=>444,64=>549,65=>722,66=>667,67=>722,68=>612,69=>611,70=>763,71=>603,72=>722,73=>333,74=>631,75=>722,76=>686,77=>889,78=>722,79=>722,80=>768,81=>741,82=>556,83=>592,84=>611,85=>690,86=>439,87=>768,88=>645,89=>795,90=>611,91=>333,92=>863,93=>333,94=>658,95=>500,96=>500,97=>631,98=>549,99=>549,100=>494,101=>439,102=>521,103=>411,104=>603,105=>329,106=>603,107=>549,108=>549,109=>576,110=>521,111=>549,112=>549,113=>521,114=>549,115=>603,116=>439,117=>576,118=>713,119=>686,120=>493,121=>686,122=>494,123=>480,124=>200,125=>480,126=>549,127=>587,128=>587,129=>587,130=>587,131=>587,132=>587,133=>587,134=>587,135=>587,136=>587,137=>587,138=>587,139=>587,140=>587,141=>587,142=>587,143=>587,144=>587,145=>587,146=>587,147=>587,148=>587,149=>587,150=>587,151=>587,152=>587,153=>587,154=>587,155=>587,156=>587,157=>587,158=>587,159=>587,160=>750,161=>620,162=>247,163=>549,164=>167,165=>713,166=>500,167=>753,168=>753,169=>753,170=>753,171=>1042,172=>987,173=>603,174=>987,175=>603,176=>400,177=>549,178=>411,179=>549,180=>549,181=>713,182=>494,183=>460,184=>549,185=>549,186=>549,187=>549,188=>1000,189=>603,190=>1000,191=>658,192=>823,193=>686,194=>795,195=>987,196=>768,197=>768,198=>823,199=>768,200=>768,201=>713,202=>713,203=>713,204=>713,205=>713,206=>713,207=>713,208=>768,209=>713,210=>790,211=>790,212=>890,213=>823,214=>549,215=>250,216=>713,217=>603,218=>603,219=>1042,220=>987,221=>603,222=>987,223=>603,224=>494,225=>329,226=>790,227=>790,228=>786,229=>713,230=>384,231=>384,232=>384,233=>384,234=>384,235=>384,236=>494,237=>494,238=>494,239=>494,240=>587,241=>329,242=>274,243=>686,244=>686,245=>686,246=>384,247=>384,248=>384,249=>384,250=>384,251=>384,252=>494,253=>494,254=>494,255=>587);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/times.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/times.php
new file mode 100644
index 00000000..cfcaf06c
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/times.php
@@ -0,0 +1,12 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='core';
+$name='Times-Roman';
+$up=-100;
+$ut=50;
+$dw=495;
+$diff='';
+$enc='';
+$desc=array('Flags'=>32,'FontBBox'=>'[-168 -218 1000 898]','ItalicAngle'=>0,'Ascent'=>898,'Descent'=>-218,'Leading'=>0,'CapHeight'=>662,'XHeight'=>450,'StemV'=>84,'StemH'=>28,'AvgWidth'=>495,'MaxWidth'=>1000,'MissingWidth'=>495);
+$cw=array(0=>250,1=>250,2=>250,3=>250,4=>250,5=>250,6=>250,7=>250,8=>250,9=>250,10=>250,11=>250,12=>250,13=>250,14=>250,15=>250,16=>250,17=>250,18=>250,19=>250,20=>250,21=>250,22=>250,23=>250,24=>250,25=>250,26=>250,27=>250,28=>250,29=>250,30=>250,31=>250,32=>250,33=>333,34=>408,35=>500,36=>500,37=>833,38=>778,39=>180,40=>333,41=>333,42=>500,43=>564,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>278,59=>278,60=>564,61=>564,62=>564,63=>444,64=>921,65=>722,66=>667,67=>667,68=>722,69=>611,70=>556,71=>722,72=>722,73=>333,74=>389,75=>722,76=>611,77=>889,78=>722,79=>722,80=>556,81=>722,82=>667,83=>556,84=>611,85=>722,86=>722,87=>944,88=>722,89=>722,90=>611,91=>333,92=>278,93=>333,94=>469,95=>500,96=>333,97=>444,98=>500,99=>444,100=>500,101=>444,102=>333,103=>500,104=>500,105=>278,106=>278,107=>500,108=>278,109=>778,110=>500,111=>500,112=>500,113=>500,114=>333,115=>389,116=>278,117=>500,118=>500,119=>722,120=>500,121=>500,122=>444,123=>480,124=>200,125=>480,126=>541,127=>350,128=>500,129=>350,130=>333,131=>500,132=>444,133=>1000,134=>500,135=>500,136=>333,137=>1000,138=>556,139=>333,140=>889,141=>350,142=>611,143=>350,144=>350,145=>333,146=>333,147=>444,148=>444,149=>350,150=>500,151=>1000,152=>333,153=>980,154=>389,155=>333,156=>722,157=>350,158=>444,159=>722,160=>250,161=>333,162=>500,163=>500,164=>500,165=>500,166=>200,167=>500,168=>333,169=>760,170=>276,171=>500,172=>564,173=>333,174=>760,175=>333,176=>400,177=>564,178=>300,179=>300,180=>333,181=>500,182=>453,183=>250,184=>333,185=>300,186=>310,187=>500,188=>750,189=>750,190=>750,191=>444,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>889,199=>667,200=>611,201=>611,202=>611,203=>611,204=>333,205=>333,206=>333,207=>333,208=>722,209=>722,210=>722,211=>722,212=>722,213=>722,214=>722,215=>564,216=>722,217=>722,218=>722,219=>722,220=>722,221=>722,222=>556,223=>500,224=>444,225=>444,226=>444,227=>444,228=>444,229=>444,230=>667,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>500,242=>500,243=>500,244=>500,245=>500,246=>500,247=>564,248=>500,249=>500,250=>500,251=>500,252=>500,253=>500,254=>500,255=>500);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/timesb.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/timesb.php
new file mode 100644
index 00000000..9c41a7b5
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/timesb.php
@@ -0,0 +1,12 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='core';
+$name='Times-Bold';
+$up=-100;
+$ut=50;
+$dw=516;
+$diff='';
+$enc='';
+$desc=array('Flags'=>32,'FontBBox'=>'[-168 -218 1000 935]','ItalicAngle'=>0,'Ascent'=>935,'Descent'=>-218,'Leading'=>0,'CapHeight'=>676,'XHeight'=>461,'StemV'=>139,'StemH'=>44,'AvgWidth'=>516,'MaxWidth'=>1000,'MissingWidth'=>516);
+$cw=array(0=>250,1=>250,2=>250,3=>250,4=>250,5=>250,6=>250,7=>250,8=>250,9=>250,10=>250,11=>250,12=>250,13=>250,14=>250,15=>250,16=>250,17=>250,18=>250,19=>250,20=>250,21=>250,22=>250,23=>250,24=>250,25=>250,26=>250,27=>250,28=>250,29=>250,30=>250,31=>250,32=>250,33=>333,34=>555,35=>500,36=>500,37=>1000,38=>833,39=>278,40=>333,41=>333,42=>500,43=>570,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333,60=>570,61=>570,62=>570,63=>500,64=>930,65=>722,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778,72=>778,73=>389,74=>500,75=>778,76=>667,77=>944,78=>722,79=>778,80=>611,81=>778,82=>722,83=>556,84=>667,85=>722,86=>722,87=>1000,88=>722,89=>722,90=>667,91=>333,92=>278,93=>333,94=>581,95=>500,96=>333,97=>500,98=>556,99=>444,100=>556,101=>444,102=>333,103=>500,104=>556,105=>278,106=>333,107=>556,108=>278,109=>833,110=>556,111=>500,112=>556,113=>556,114=>444,115=>389,116=>333,117=>556,118=>500,119=>722,120=>500,121=>500,122=>444,123=>394,124=>220,125=>394,126=>520,127=>350,128=>500,129=>350,130=>333,131=>500,132=>500,133=>1000,134=>500,135=>500,136=>333,137=>1000,138=>556,139=>333,140=>1000,141=>350,142=>667,143=>350,144=>350,145=>333,146=>333,147=>500,148=>500,149=>350,150=>500,151=>1000,152=>333,153=>1000,154=>389,155=>333,156=>722,157=>350,158=>444,159=>722,160=>250,161=>333,162=>500,163=>500,164=>500,165=>500,166=>220,167=>500,168=>333,169=>747,170=>300,171=>500,172=>570,173=>333,174=>747,175=>333,176=>400,177=>570,178=>300,179=>300,180=>333,181=>556,182=>540,183=>250,184=>333,185=>300,186=>330,187=>500,188=>750,189=>750,190=>750,191=>500,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>389,205=>389,206=>389,207=>389,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>570,216=>778,217=>722,218=>722,219=>722,220=>722,221=>722,222=>611,223=>556,224=>500,225=>500,226=>500,227=>500,228=>500,229=>500,230=>722,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>556,242=>500,243=>500,244=>500,245=>500,246=>500,247=>570,248=>500,249=>556,250=>556,251=>556,252=>556,253=>500,254=>556,255=>500);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/timesbi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/timesbi.php
new file mode 100644
index 00000000..4feed748
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/timesbi.php
@@ -0,0 +1,12 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='core';
+$name='Times-BoldItalic';
+$up=-100;
+$ut=50;
+$dw=501;
+$diff='';
+$enc='';
+$desc=array('Flags'=>96,'FontBBox'=>'[-200 -218 996 921]','ItalicAngle'=>-15,'Ascent'=>921,'Descent'=>-218,'Leading'=>0,'CapHeight'=>669,'XHeight'=>462,'StemV'=>121,'StemH'=>42,'AvgWidth'=>501,'MaxWidth'=>1000,'MissingWidth'=>501);
+$cw=array(0=>250,1=>250,2=>250,3=>250,4=>250,5=>250,6=>250,7=>250,8=>250,9=>250,10=>250,11=>250,12=>250,13=>250,14=>250,15=>250,16=>250,17=>250,18=>250,19=>250,20=>250,21=>250,22=>250,23=>250,24=>250,25=>250,26=>250,27=>250,28=>250,29=>250,30=>250,31=>250,32=>250,33=>389,34=>555,35=>500,36=>500,37=>833,38=>778,39=>278,40=>333,41=>333,42=>500,43=>570,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333,60=>570,61=>570,62=>570,63=>500,64=>832,65=>667,66=>667,67=>667,68=>722,69=>667,70=>667,71=>722,72=>778,73=>389,74=>500,75=>667,76=>611,77=>889,78=>722,79=>722,80=>611,81=>722,82=>667,83=>556,84=>611,85=>722,86=>667,87=>889,88=>667,89=>611,90=>611,91=>333,92=>278,93=>333,94=>570,95=>500,96=>333,97=>500,98=>500,99=>444,100=>500,101=>444,102=>333,103=>500,104=>556,105=>278,106=>278,107=>500,108=>278,109=>778,110=>556,111=>500,112=>500,113=>500,114=>389,115=>389,116=>278,117=>556,118=>444,119=>667,120=>500,121=>444,122=>389,123=>348,124=>220,125=>348,126=>570,127=>350,128=>500,129=>350,130=>333,131=>500,132=>500,133=>1000,134=>500,135=>500,136=>333,137=>1000,138=>556,139=>333,140=>944,141=>350,142=>611,143=>350,144=>350,145=>333,146=>333,147=>500,148=>500,149=>350,150=>500,151=>1000,152=>333,153=>1000,154=>389,155=>333,156=>722,157=>350,158=>389,159=>611,160=>250,161=>389,162=>500,163=>500,164=>500,165=>500,166=>220,167=>500,168=>333,169=>747,170=>266,171=>500,172=>606,173=>333,174=>747,175=>333,176=>400,177=>570,178=>300,179=>300,180=>333,181=>576,182=>500,183=>250,184=>333,185=>300,186=>300,187=>500,188=>750,189=>750,190=>750,191=>500,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>944,199=>667,200=>667,201=>667,202=>667,203=>667,204=>389,205=>389,206=>389,207=>389,208=>722,209=>722,210=>722,211=>722,212=>722,213=>722,214=>722,215=>570,216=>722,217=>722,218=>722,219=>722,220=>722,221=>611,222=>611,223=>500,224=>500,225=>500,226=>500,227=>500,228=>500,229=>500,230=>722,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>556,242=>500,243=>500,244=>500,245=>500,246=>500,247=>570,248=>500,249=>556,250=>556,251=>556,252=>556,253=>444,254=>500,255=>444);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/timesi.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/timesi.php
new file mode 100644
index 00000000..1e8b6734
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/timesi.php
@@ -0,0 +1,12 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='core';
+$name='Times-Italic';
+$up=-100;
+$ut=50;
+$dw=491;
+$diff='';
+$enc='';
+$desc=array('Flags'=>96,'FontBBox'=>'[-169 -217 1010 883]','ItalicAngle'=>-15.5,'Ascent'=>883,'Descent'=>-217,'Leading'=>0,'CapHeight'=>653,'XHeight'=>441,'StemV'=>76,'StemH'=>32,'AvgWidth'=>491,'MaxWidth'=>1000,'MissingWidth'=>491);
+$cw=array(0=>250,1=>250,2=>250,3=>250,4=>250,5=>250,6=>250,7=>250,8=>250,9=>250,10=>250,11=>250,12=>250,13=>250,14=>250,15=>250,16=>250,17=>250,18=>250,19=>250,20=>250,21=>250,22=>250,23=>250,24=>250,25=>250,26=>250,27=>250,28=>250,29=>250,30=>250,31=>250,32=>250,33=>333,34=>420,35=>500,36=>500,37=>833,38=>778,39=>214,40=>333,41=>333,42=>500,43=>675,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333,60=>675,61=>675,62=>675,63=>500,64=>920,65=>611,66=>611,67=>667,68=>722,69=>611,70=>611,71=>722,72=>722,73=>333,74=>444,75=>667,76=>556,77=>833,78=>667,79=>722,80=>611,81=>722,82=>611,83=>500,84=>556,85=>722,86=>611,87=>833,88=>611,89=>556,90=>556,91=>389,92=>278,93=>389,94=>422,95=>500,96=>333,97=>500,98=>500,99=>444,100=>500,101=>444,102=>278,103=>500,104=>500,105=>278,106=>278,107=>444,108=>278,109=>722,110=>500,111=>500,112=>500,113=>500,114=>389,115=>389,116=>278,117=>500,118=>444,119=>667,120=>444,121=>444,122=>389,123=>400,124=>275,125=>400,126=>541,127=>350,128=>500,129=>350,130=>333,131=>500,132=>556,133=>889,134=>500,135=>500,136=>333,137=>1000,138=>500,139=>333,140=>944,141=>350,142=>556,143=>350,144=>350,145=>333,146=>333,147=>556,148=>556,149=>350,150=>500,151=>889,152=>333,153=>980,154=>389,155=>333,156=>667,157=>350,158=>389,159=>556,160=>250,161=>389,162=>500,163=>500,164=>500,165=>500,166=>275,167=>500,168=>333,169=>760,170=>276,171=>500,172=>675,173=>333,174=>760,175=>333,176=>400,177=>675,178=>300,179=>300,180=>333,181=>500,182=>523,183=>250,184=>333,185=>300,186=>310,187=>500,188=>750,189=>750,190=>750,191=>500,192=>611,193=>611,194=>611,195=>611,196=>611,197=>611,198=>889,199=>667,200=>611,201=>611,202=>611,203=>611,204=>333,205=>333,206=>333,207=>333,208=>722,209=>667,210=>722,211=>722,212=>722,213=>722,214=>722,215=>675,216=>722,217=>722,218=>722,219=>722,220=>722,221=>556,222=>611,223=>500,224=>500,225=>500,226=>500,227=>500,228=>500,229=>500,230=>667,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>500,242=>500,243=>500,244=>500,245=>500,246=>500,247=>675,248=>500,249=>500,250=>500,251=>500,252=>500,253=>444,254=>500,255=>444);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/uni2cid_ac15.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/uni2cid_ac15.php
new file mode 100644
index 00000000..42c588d8
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/uni2cid_ac15.php
@@ -0,0 +1,6 @@
+<?php
+// unicode to cid conversion table is from
+// ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/
+// cid2code.txt in ag15.tar.Z
+$cidinfo['uni2cid'] = array(32=>1,33=>2,34=>3,35=>4,36=>5,37=>6,38=>7,39=>8,40=>9,41=>10,42=>11,43=>12,44=>13,45=>14,46=>15,47=>16,48=>17,49=>18,50=>19,51=>20,52=>21,53=>22,54=>23,55=>24,56=>25,57=>26,58=>27,59=>28,60=>29,61=>30,62=>31,63=>32,64=>33,65=>34,66=>35,67=>36,68=>37,69=>38,70=>39,71=>40,72=>41,73=>42,74=>43,75=>44,76=>45,77=>46,78=>47,79=>48,80=>49,81=>50,82=>51,83=>52,84=>53,85=>54,86=>55,87=>56,88=>57,89=>58,90=>59,91=>60,92=>61,93=>62,94=>63,95=>64,96=>65,97=>66,98=>67,99=>68,100=>69,101=>70,102=>71,103=>72,104=>73,105=>74,106=>75,107=>76,108=>77,109=>78,110=>79,111=>80,112=>81,113=>82,114=>83,115=>84,116=>85,117=>86,118=>87,119=>88,120=>89,121=>90,122=>91,123=>92,124=>93,125=>94,126=>95,12288=>99,65292=>100,12289=>101,12290=>102,65294=>103,8226=>104,8231=>104,65307=>105,65306=>106,65311=>107,65281=>108,65072=>109,8230=>110,8943=>110,8229=>111,65104=>112,65380=>113,65105=>113,65106=>114,183=>115,65108=>116,65109=>117,65110=>118,65111=>119,65372=>120,8211=>121,65073=>122,8212=>123,65288=>128,65289=>129,65077=>130,65078=>131,65371=>132,65373=>133,65079=>134,65080=>135,12308=>136,12309=>137,65081=>138,65082=>139,12304=>140,12305=>141,65083=>142,65084=>143,12298=>144,12299=>145,65085=>146,65086=>147,12296=>148,12297=>149,65087=>150,65088=>151,12300=>152,12301=>153,65089=>154,65090=>155,12302=>156,12303=>157,65091=>158,65092=>159,65113=>160,65114=>161,65115=>162,65116=>163,65117=>164,65118=>165,8216=>166,8217=>167,8220=>168,8221=>169,12317=>170,12318=>171,8245=>172,8242=>173,65283=>174,65286=>175,65290=>176,8251=>177,167=>178,12291=>179,9675=>180,9679=>181,9651=>182,9650=>183,9678=>184,9734=>185,9733=>186,9671=>187,9670=>188,9633=>189,9632=>190,9661=>191,9660=>192,12963=>193,8453=>194,175=>195,772=>195,8254=>195,65507=>196,65343=>197,717=>198,65097=>199,65098=>200,65101=>201,65102=>202,65099=>203,65100=>204,65119=>205,65120=>206,65121=>207,65291=>208,65293=>209,215=>210,247=>211,177=>212,8730=>213,65308=>214,65310=>215,65309=>216,8806=>217,8807=>218,8800=>219,8734=>220,8786=>221,8801=>222,65122=>223,65123=>224,65124=>225,65125=>226,65126=>227,8764=>228,65374=>228,8745=>229,8746=>230,8869=>231,8736=>232,8735=>233,8895=>234,13266=>235,13265=>236,8747=>237,8750=>238,8757=>239,8756=>240,9792=>241,9794=>242,8853=>243,9793=>243,8857=>244,9737=>244,8593=>245,8595=>246,8594=>247,8592=>248,8598=>249,8599=>250,8601=>251,8600=>252,8741=>253,8739=>254,8725=>257,65295=>257,65128=>258,65340=>258,65284=>259,165=>260,65509=>260,12306=>261,162=>262,65504=>262,163=>263,65505=>263,65285=>264,65312=>265,8451=>266,8457=>267,65129=>268,65130=>269,65131=>270,13269=>271,13212=>272,13213=>273,13214=>274,13262=>275,13217=>276,13198=>277,13199=>278,13252=>279,176=>280,20825=>281,58834=>281,20827=>282,58835=>282,20830=>283,58837=>283,20829=>284,58836=>284,20833=>285,20835=>286,21991=>287,29929=>288,58044=>288,31950=>289,58191=>289,9601=>290,9602=>291,9603=>292,9604=>293,9605=>294,9606=>295,9607=>296,9608=>297,9615=>298,9614=>299,9613=>300,9612=>301,9611=>302,9610=>303,9609=>304,9532=>305,9524=>306,9516=>307,9508=>308,9500=>309,9620=>310,9472=>311,9474=>312,9621=>313,9484=>314,9488=>315,9492=>316,9496=>317,9581=>318,9582=>319,9584=>320,9583=>321,9552=>322,9566=>323,9578=>324,9569=>325,9698=>326,9699=>327,9701=>328,9700=>329,9585=>330,9586=>331,9587=>332,65296=>333,65297=>334,65298=>335,65299=>336,65300=>337,65301=>338,65302=>339,65303=>340,65304=>341,65305=>342,8544=>343,8545=>344,8546=>345,8547=>346,8548=>347,8549=>348,8550=>349,8551=>350,8552=>351,8553=>352,12321=>353,12322=>354,12323=>355,12324=>356,12325=>357,12326=>358,12327=>359,12328=>360,12329=>361,12344=>362,21316=>363,57443=>363,12345=>363,12346=>364,65313=>365,65314=>366,65315=>367,65316=>368,65317=>369,65318=>370,65319=>371,65320=>372,65321=>373,65322=>374,65323=>375,65324=>376,65325=>377,65326=>378,65327=>379,65328=>380,65329=>381,65330=>382,65331=>383,65332=>384,65333=>385,65334=>386,65335=>387,65336=>388,65337=>389,65338=>390,65345=>391,65346=>392,65347=>393,65348=>394,65349=>395,65350=>396,65351=>397,65352=>398,65353=>399,65354=>400,65355=>401,65356=>402,65357=>403,65358=>404,65359=>405,65360=>406,65361=>407,65362=>408,65363=>409,65364=>410,65365=>411,65366=>412,65367=>413,65368=>414,65369=>415,65370=>416,913=>417,914=>418,915=>419,916=>420,917=>421,918=>422,919=>423,920=>424,921=>425,922=>426,923=>427,924=>428,925=>429,926=>430,927=>431,928=>432,929=>433,931=>434,932=>435,933=>436,934=>437,935=>438,936=>439,937=>440,945=>441,946=>442,947=>443,948=>444,949=>445,950=>446,951=>447,952=>448,953=>449,954=>450,955=>451,956=>452,957=>453,958=>454,959=>455,960=>456,961=>457,963=>458,964=>459,965=>460,966=>461,967=>462,968=>463,969=>464,12549=>465,12550=>466,12551=>467,12552=>468,12553=>469,12554=>470,12555=>471,12556=>472,12557=>473,12558=>474,12559=>475,12560=>476,12561=>477,12562=>478,12563=>479,12564=>480,12565=>481,12566=>482,12567=>483,12568=>484,12569=>485,12570=>486,12571=>487,12572=>488,12573=>489,12574=>490,12575=>491,12576=>492,12577=>493,12578=>494,12579=>495,12580=>496,12581=>497,12582=>498,12583=>499,12584=>500,12585=>501,729=>502,714=>503,711=>504,780=>504,715=>505,9312=>506,63153=>506,9313=>507,63154=>507,9314=>508,63155=>508,9315=>509,63156=>509,9316=>510,63157=>510,9317=>511,63158=>511,9318=>512,63159=>512,9319=>513,63160=>513,9320=>514,63161=>514,9321=>515,63162=>515,9332=>516,63163=>516,9333=>517,63164=>517,9334=>518,63165=>518,9335=>519,63166=>519,9336=>520,63167=>520,9337=>521,63168=>521,9338=>522,63169=>522,9339=>523,63170=>523,9340=>524,63171=>524,9341=>525,63172=>525,8560=>526,63173=>526,8561=>527,63174=>527,8562=>528,63175=>528,8563=>529,63176=>529,8564=>530,63177=>530,8565=>531,63178=>531,8566=>532,63179=>532,8567=>533,63180=>533,8568=>534,63181=>534,8569=>535,63182=>535,20008=>536,12033=>536,20022=>537,12034=>537,63183=>537,20031=>538,12035=>538,63184=>538,12037=>539,20101=>539,63185=>539,12039=>540,20128=>540,63186=>540,20866=>541,12044=>541,63187=>541,20886=>542,12045=>542,63188=>542,20907=>543,12046=>543,63189=>543,12051=>544,21241=>544,63190=>544,12054=>545,21304=>545,63191=>545,12057=>546,21353=>546,63192=>546,12059=>547,21430=>547,63193=>547,12065=>548,12066=>548,22786=>548,22794=>548,63194=>548,12071=>549,23424=>549,63195=>549,12078=>550,24027=>550,63196=>550,24186=>551,12083=>551,63197=>551,24191=>552,12084=>552,63198=>552,24308=>553,12085=>553,24400=>554,12089=>554,63200=>554,24417=>555,12090=>555,63201=>555,12097=>556,25908=>556,63202=>556,12102=>557,26080=>557,30098=>558,63204=>558,12135=>558,30326=>559,12136=>559,12193=>560,36789=>560,63206=>560,12202=>561,38582=>561,9216=>562,9217=>563,9218=>564,9219=>565,9220=>566,9221=>567,9222=>568,9223=>569,9224=>570,9225=>571,9226=>572,9227=>573,9228=>574,9229=>575,9230=>576,9231=>577,9232=>578,9233=>579,9234=>580,9235=>581,9236=>582,9237=>583,9238=>584,9239=>585,9240=>586,9241=>587,9242=>588,9243=>589,9244=>590,9245=>591,9246=>592,9247=>593,9249=>594,12032=>595,19968=>595,12036=>596,20057=>596,19969=>597,19971=>598,20035=>599,20061=>600,20102=>601,12038=>602,20108=>602,20154=>603,12040=>603,20799=>604,12041=>604,20837=>605,12042=>605,20843=>606,12043=>606,12047=>607,20960=>607,12049=>608,20992=>608,20993=>609,12050=>610,21147=>610,12052=>611,21269=>611,21313=>612,12055=>612,21340=>613,12056=>613,12060=>614,21448=>614,19977=>615,19979=>616,19976=>617,19978=>618,20011=>619,20024=>620,20961=>621,20037=>622,20040=>623,20063=>624,20062=>625,20110=>626,20129=>627,20800=>628,64012=>628,20995=>629,21242=>630,21315=>631,21449=>632,12061=>633,21475=>633,22303=>634,12063=>634,22763=>635,12064=>635,22805=>636,12067=>636,22823=>637,12068=>637,22899=>638,12069=>638,12070=>639,23376=>639,23377=>640,23379=>641,23544=>642,12072=>642,23567=>643,12073=>643,23586=>644,12074=>644,23608=>645,12075=>645,12077=>646,23665=>646,24029=>647,24037=>648,12079=>648,12080=>649,24049=>649,24050=>650,24051=>651,24062=>652,12081=>652,24178=>653,12082=>653,24318=>654,12086=>654,24331=>655,12087=>655,24339=>656,12088=>656,25165=>657,19985=>658,19984=>659,19981=>660,20013=>661,20016=>662,20025=>663,20043=>664,23609=>665,20104=>666,20113=>667,20117=>668,20114=>669,20116=>670,20130=>671,20161=>672,20160=>673,20163=>674,20166=>675,20167=>676,20173=>677,20170=>678,20171=>679,20164=>680,20803=>681,20801=>682,20839=>683,20845=>684,20846=>685,20844=>686,20887=>687,20982=>688,20998=>689,20999=>690,21000=>691,21243=>692,21246=>693,21247=>694,21270=>695,21305=>696,21320=>697,21319=>698,21317=>699,21342=>700,21380=>701,21451=>702,21450=>703,21453=>704,22764=>705,22825=>706,22827=>707,22826=>708,22829=>709,23380=>710,23569=>711,23588=>712,23610=>713,23663=>714,24052=>715,24187=>716,24319=>717,24340=>718,24341=>719,24515=>720,12092=>720,25096=>721,12093=>721,25142=>722,12094=>722,25163=>723,12095=>723,25166=>724,12096=>725,25903=>725,25991=>726,12098=>726,26007=>727,12099=>727,26020=>728,12100=>728,26041=>729,12101=>729,26085=>730,12103=>730,26352=>731,12104=>731,26376=>732,12105=>732,26408=>733,12106=>733,27424=>734,12107=>734,27490=>735,12108=>735,27513=>736,12109=>736,27595=>737,12111=>737,27604=>738,12112=>738,27611=>739,12113=>739,27663=>740,12114=>740,27700=>741,12116=>741,28779=>742,12117=>742,29226=>743,12118=>743,29238=>744,12119=>744,29243=>745,12120=>745,29255=>746,12122=>746,29273=>747,12123=>747,29275=>748,12124=>748,29356=>749,12125=>749,29579=>750,19993=>751,19990=>752,19989=>753,19988=>754,19992=>755,20027=>756,20045=>757,20047=>758,20046=>759,20197=>760,20184=>761,20180=>762,20181=>763,20182=>764,20183=>765,20195=>766,20196=>767,20185=>768,20190=>769,20805=>770,20804=>771,20873=>772,20874=>773,20908=>774,20985=>775,20986=>776,20984=>777,21002=>778,21152=>779,21151=>780,57435=>781,21253=>781,21254=>782,21271=>783,21277=>784,20191=>785,21322=>786,21321=>787,21345=>788,21344=>789,21359=>790,21358=>791,21435=>792,21487=>793,21476=>794,21491=>795,21484=>796,21486=>797,21481=>798,21480=>799,21500=>800,21496=>801,21493=>802,21483=>803,21478=>804,21482=>805,21490=>806,21489=>807,21488=>808,21477=>809,21485=>810,21499=>811,22235=>812,22234=>813,22806=>814,22830=>815,22833=>816,22900=>817,22902=>818,23381=>819,23427=>820,23612=>821,24040=>822,24039=>823,24038=>824,24066=>825,24067=>826,24179=>827,24188=>828,24321=>829,24344=>830,24343=>831,24517=>832,25098=>833,25171=>834,25172=>835,25170=>836,25169=>837,26021=>838,26086=>839,26414=>840,26412=>841,26410=>842,26411=>843,26413=>844,27491=>845,27597=>846,27665=>847,27664=>848,27704=>849,27713=>850,27712=>851,27710=>852,29359=>853,29572=>854,12126=>854,29577=>855,12127=>855,29916=>856,12128=>856,29926=>857,12129=>857,29976=>858,12130=>858,29983=>859,12131=>859,12132=>860,29992=>860,29993=>861,12133=>862,30000=>862,30001=>863,30002=>864,30003=>865,12134=>866,30091=>866,30333=>867,12137=>867,30382=>868,12138=>868,30399=>869,12139=>869,30446=>870,12140=>870,30683=>871,12141=>871,30690=>872,12142=>872,30707=>873,12143=>873,31034=>874,12144=>874,31166=>875,12146=>875,31348=>876,12147=>876,31435=>877,12148=>877,19998=>878,19999=>879,20050=>880,20051=>881,20073=>882,20121=>883,20132=>884,20134=>885,20133=>886,20223=>887,20233=>888,20249=>889,20234=>890,20245=>891,20237=>892,20240=>893,20241=>894,20239=>895,20210=>896,20214=>897,20219=>898,20208=>899,20211=>900,20221=>901,20225=>902,20235=>903,20809=>904,20807=>905,20806=>906,20808=>907,20840=>908,20849=>909,20877=>910,20912=>911,21015=>912,21009=>913,21010=>914,21006=>915,21014=>916,21155=>917,21256=>918,21281=>919,21280=>920,21360=>921,21361=>922,21513=>923,21519=>924,21516=>925,21514=>926,21520=>927,21505=>928,21515=>929,21508=>930,21521=>931,21517=>932,21512=>933,21507=>934,21518=>935,21510=>936,21522=>937,22240=>938,22238=>939,22237=>940,22323=>941,22320=>942,22312=>943,22317=>944,22316=>945,22319=>946,22313=>947,22809=>948,22810=>949,22839=>950,22840=>951,22916=>952,22904=>953,22915=>954,22909=>955,22905=>956,22914=>957,22913=>958,23383=>959,23384=>960,23431=>961,23432=>962,23429=>963,23433=>964,23546=>965,23574=>966,23673=>967,24030=>968,24070=>969,24182=>970,24180=>971,24335=>972,24347=>973,24537=>974,24534=>975,25102=>976,25100=>977,25101=>978,25104=>979,25187=>980,25179=>981,25176=>982,25910=>983,26089=>984,26088=>985,26092=>986,26093=>987,26354=>988,26355=>989,26377=>990,26429=>991,26420=>992,26417=>993,26421=>994,27425=>995,27492=>996,27515=>997,27670=>998,27741=>999,27735=>1000,27737=>1001,27743=>1002,27744=>1003,27728=>1004,27733=>1005,27745=>1006,27739=>1007,27725=>1008,27726=>1009,28784=>1010,29279=>1011,29277=>1012,30334=>1013,31481=>1014,12149=>1014,31859=>1015,12150=>1015,31992=>1016,12151=>1016,32566=>1017,12152=>1017,32650=>1018,12154=>1018,32701=>1019,12155=>1019,32769=>1020,12156=>1020,32771=>1021,32780=>1022,12157=>1022,32786=>1023,12158=>1023,32819=>1024,12159=>1024,32895=>1025,12160=>1025,32905=>1026,12161=>1026,32907=>1027,32908=>1028,33251=>1029,12162=>1029,33258=>1030,12163=>1030,33267=>1031,12164=>1031,33276=>1032,12165=>1032,33292=>1033,12166=>1033,33307=>1034,12167=>1034,33311=>1035,12168=>1035,33390=>1036,12169=>1036,33394=>1037,12170=>1037,33406=>1038,34411=>1039,12173=>1039,34880=>1040,12174=>1040,34892=>1041,12175=>1041,34915=>1042,12176=>1042,35199=>1043,38433=>1044,20018=>1045,20136=>1046,20301=>1047,20303=>1048,20295=>1049,20311=>1050,20318=>1051,20276=>1052,20315=>1053,20309=>1054,20272=>1055,20304=>1056,20305=>1057,20285=>1058,20282=>1059,20280=>1060,20291=>1061,20308=>1062,20284=>1063,20294=>1064,20323=>1065,20316=>1066,20320=>1067,20271=>1068,20302=>1069,20278=>1070,20313=>1071,20317=>1072,20296=>1073,20314=>1074,20812=>1075,20811=>1076,20813=>1077,20853=>1078,20918=>1079,20919=>1080,21029=>1081,21028=>1082,21033=>1083,21034=>1084,21032=>1085,21163=>1086,21161=>1087,21162=>1088,21164=>1089,21283=>1090,21363=>1091,21365=>1092,21533=>1093,21549=>1094,21534=>1095,21566=>1096,21542=>1097,21582=>1098,21543=>1099,21574=>1100,21571=>1101,21555=>1102,21576=>1103,21570=>1104,21531=>1105,21545=>1106,21578=>1107,21561=>1108,21563=>1109,21560=>1110,21550=>1111,21557=>1112,21558=>1113,21536=>1114,21564=>1115,21568=>1116,21553=>1117,21547=>1118,21535=>1119,21548=>1120,22250=>1121,22256=>1122,22244=>1123,22251=>1124,22346=>1125,22353=>1126,22336=>1127,22349=>1128,22343=>1129,22350=>1130,22334=>1131,22352=>1132,22351=>1133,22331=>1134,22767=>1135,22846=>1136,22941=>1137,22930=>1138,22952=>1139,22942=>1140,22947=>1141,22937=>1142,22934=>1143,22925=>1144,22948=>1145,22931=>1146,22922=>1147,22949=>1148,23389=>1149,23388=>1150,23386=>1151,23387=>1152,23436=>1153,23435=>1154,23439=>1155,23596=>1156,23616=>1157,23617=>1158,23615=>1159,23614=>1160,23696=>1161,23697=>1162,23700=>1163,23692=>1164,24043=>1165,24076=>1166,24207=>1167,24199=>1168,24202=>1169,24311=>1170,24324=>1171,24351=>1172,24420=>1173,24418=>1174,24439=>1175,24441=>1176,24536=>1177,24524=>1178,24535=>1179,24525=>1180,24561=>1181,24555=>1182,24568=>1183,24554=>1184,25106=>1185,25105=>1186,25220=>1187,25239=>1188,25238=>1189,25216=>1190,25206=>1191,25225=>1192,25197=>1193,25226=>1194,25212=>1195,25214=>1196,25209=>1197,25203=>1198,25234=>1199,25199=>1200,25240=>1201,25198=>1202,25237=>1203,25235=>1204,25233=>1205,25222=>1206,25913=>1207,25915=>1208,25912=>1209,26097=>1210,26356=>1211,26463=>1212,26446=>1213,26447=>1214,26448=>1215,26449=>1216,26460=>1217,26454=>1218,26462=>1219,57801=>1219,26441=>1220,26438=>1221,26464=>1222,26451=>1223,26455=>1224,27493=>1225,27599=>1226,27714=>1227,27742=>1228,27801=>1229,27777=>1230,27784=>1231,27785=>1232,27781=>1233,27803=>1234,27754=>1235,27770=>1236,27792=>1237,27760=>1238,27788=>1239,27752=>1240,27798=>1241,27794=>1242,27773=>1243,27779=>1244,27762=>1245,27774=>1246,27764=>1247,27782=>1248,27766=>1249,27789=>1250,27796=>1251,27800=>1252,27778=>1253,28790=>1254,28796=>1255,28797=>1256,28792=>1257,29282=>1258,29281=>1259,29280=>1260,29380=>1261,29378=>1262,29590=>1263,29996=>1264,29995=>1265,30007=>1266,30008=>1267,30338=>1268,30447=>1269,30691=>1270,31169=>1271,31168=>1272,31167=>1273,31350=>1274,31995=>1275,32597=>1276,32918=>1277,32915=>1278,32925=>1279,32920=>1280,32923=>1281,32922=>1282,32946=>1283,33391=>1284,33426=>1285,33419=>1286,33421=>1287,35211=>1288,12178=>1288,35282=>1289,12179=>1289,35328=>1290,12180=>1290,35895=>1291,12181=>1291,35910=>1292,12182=>1292,35925=>1293,12183=>1293,35997=>1294,12185=>1294,36196=>1295,12186=>1295,36208=>1296,12187=>1296,36275=>1297,12188=>1297,36523=>1298,12189=>1298,36554=>1299,12190=>1299,36763=>1300,12191=>1300,36784=>1301,12192=>1301,36802=>1302,36806=>1303,36805=>1304,36804=>1305,24033=>1306,12194=>1307,37009=>1307,37026=>1308,37034=>1309,37030=>1310,37027=>1311,37193=>1312,12195=>1312,37318=>1313,12196=>1313,37324=>1314,12197=>1314,38450=>1315,38446=>1316,38449=>1317,38442=>1318,38444=>1319,20006=>1320,20054=>1321,20083=>1322,20107=>1323,20123=>1324,20126=>1325,20139=>1326,20140=>1327,20335=>1328,20381=>1329,20365=>1330,20339=>1331,20351=>1332,20332=>1333,20379=>1334,20363=>1335,20358=>1336,20355=>1337,20336=>1338,20341=>1339,20360=>1340,20329=>1341,20347=>1342,20374=>1343,20350=>1344,20367=>1345,20369=>1346,20346=>1347,20820=>1348,20818=>1349,20821=>1350,20841=>1351,20855=>1352,20854=>1353,20856=>1354,20925=>1355,20989=>1356,21051=>1357,21048=>1358,21047=>1359,21050=>1360,21040=>1361,21038=>1362,21046=>1363,21057=>1364,21182=>1365,21179=>1366,21330=>1367,21332=>1368,21331=>1369,21329=>1370,21350=>1371,21367=>1372,21368=>1373,21369=>1374,21462=>1375,21460=>1376,21463=>1377,21619=>1378,21621=>1379,21654=>1380,21624=>1381,21653=>1382,21632=>1383,21627=>1384,21623=>1385,21636=>1386,21650=>1387,21638=>1388,21628=>1389,21648=>1390,21617=>1391,21622=>1392,21644=>1393,21658=>1394,21602=>1395,21608=>1396,21643=>1397,21629=>1398,21646=>1399,22266=>1400,22403=>1401,22391=>1402,22378=>1403,22377=>1404,22369=>1405,22374=>1406,22372=>1407,22396=>1408,22812=>1409,22857=>1410,22855=>1411,22856=>1412,22852=>1413,22868=>1414,22974=>1415,22971=>1416,22996=>1417,22969=>1418,22958=>1419,22993=>1420,22982=>1421,22992=>1422,22989=>1423,22987=>1424,22995=>1425,22986=>1426,22959=>1427,22963=>1428,22994=>1429,22981=>1430,23391=>1431,23396=>1432,23395=>1433,23447=>1434,23450=>1435,23448=>1436,23452=>1437,23449=>1438,23451=>1439,23578=>1440,23624=>1441,23621=>1442,23622=>1443,23735=>1444,23713=>1445,23736=>1446,23721=>1447,23723=>1448,23729=>1449,23731=>1450,24088=>1451,24090=>1452,24086=>1453,24085=>1454,24091=>1455,24081=>1456,24184=>1457,24218=>1458,24215=>1459,24220=>1460,24213=>1461,24214=>1462,24310=>1463,24358=>1464,24359=>1465,24361=>1466,24448=>1467,24449=>1468,24447=>1469,24444=>1470,24541=>1471,24544=>1472,24573=>1473,24565=>1474,24575=>1475,24591=>1476,24596=>1477,24623=>1478,24629=>1479,24598=>1480,24618=>1481,24597=>1482,24609=>1483,24615=>1484,24617=>1485,24619=>1486,24603=>1487,25110=>1488,25109=>1489,25151=>1490,25150=>1491,25152=>1492,25215=>1493,25289=>1494,25292=>1495,25284=>1496,25279=>1497,25282=>1498,25273=>1499,25298=>1500,25307=>1501,25259=>1502,25299=>1503,25300=>1504,25291=>1505,25288=>1506,25256=>1507,25277=>1508,25276=>1509,25296=>1510,60582=>1510,25305=>1511,25287=>1512,25293=>1513,25269=>1514,25306=>1515,25265=>1516,25304=>1517,25302=>1518,25303=>1519,25286=>1520,25260=>1521,25294=>1522,61010=>1522,25918=>1523,26023=>1524,26044=>1525,26106=>1526,26132=>1527,26131=>1528,26124=>1529,26118=>1530,26114=>1531,26126=>1532,26112=>1533,26127=>1534,26133=>1535,26122=>1536,26119=>1537,26381=>1538,26379=>1539,26477=>1540,26507=>1541,26517=>1542,26481=>1543,26524=>1544,26483=>1545,26487=>1546,26503=>1547,26525=>1548,26519=>1549,26479=>1550,26480=>1551,26495=>1552,26505=>1553,26494=>1554,26512=>1555,26485=>1556,26522=>1557,26515=>1558,26492=>1559,26474=>1560,26482=>1561,27427=>1562,27494=>1563,27495=>1564,27519=>1565,27667=>1566,27675=>1567,27875=>1568,27880=>1569,27891=>1570,27825=>1571,27852=>1572,27877=>1573,27827=>1574,27837=>1575,27838=>1576,27836=>1577,27874=>1578,27819=>1579,27861=>1580,27859=>1581,27832=>1582,27844=>1583,27833=>1584,27841=>1585,27822=>1586,27863=>1587,27845=>1588,27889=>1589,27839=>1590,27835=>1591,27873=>1592,27867=>1593,27850=>1594,27820=>1595,27887=>1596,27868=>1597,27862=>1598,27872=>1599,28821=>1600,28814=>1601,28818=>1602,28810=>1603,28825=>1604,29228=>1605,29229=>1606,29240=>1607,29256=>1608,29287=>1609,29289=>1610,29376=>1611,29390=>1612,29401=>1613,29399=>1614,29392=>1615,29609=>1616,29608=>1617,29599=>1618,29611=>1619,29605=>1620,30013=>1621,30109=>1622,30105=>1623,30106=>1624,30340=>1625,30402=>1626,30450=>1627,30452=>1628,30693=>1629,30717=>1630,31038=>1631,31040=>1632,31041=>1633,31177=>1634,31176=>1635,31354=>1636,31353=>1637,31482=>1638,31998=>1639,32596=>1640,32652=>1641,32651=>1642,32773=>1643,58236=>1643,32954=>1644,32933=>1645,32930=>1646,32945=>1647,32929=>1648,32939=>1649,32937=>1650,32948=>1651,32938=>1652,32943=>1653,33253=>1654,33278=>1655,33293=>1656,33459=>1657,33437=>1658,33433=>1659,33453=>1660,33469=>1661,33439=>1662,33465=>1663,33457=>1664,33452=>1665,33445=>1666,33455=>1667,33464=>1668,33443=>1669,33456=>1670,33470=>1671,33463=>1672,34382=>1673,34417=>1674,21021=>1675,34920=>1676,36555=>1677,36814=>1678,36820=>1679,36817=>1680,37045=>1681,37048=>1682,37041=>1683,37046=>1684,37319=>1685,37329=>1686,12198=>1686,38263=>1687,12199=>1687,38272=>1688,12200=>1688,38428=>1689,12201=>1689,38464=>1690,38463=>1691,38459=>1692,38468=>1693,38466=>1694,38585=>1695,12203=>1695,38632=>1696,12204=>1696,38738=>1697,12206=>1698,38750=>1698,20127=>1699,20141=>1700,20142=>1701,20449=>1702,20405=>1703,20399=>1704,20415=>1705,20448=>1706,20433=>1707,20431=>1708,20445=>1709,20419=>1710,20406=>1711,20440=>1712,20447=>1713,20426=>1714,20439=>1715,20398=>1716,20432=>1717,20420=>1718,20418=>1719,20442=>1720,20430=>1721,20446=>1722,20407=>1723,20823=>1724,20882=>1725,20881=>1726,20896=>1727,21070=>1728,21059=>1729,21066=>1730,21069=>1731,21068=>1732,21067=>1733,21063=>1734,21191=>1735,21193=>1736,21187=>1737,21185=>1738,21261=>1739,21335=>1740,21371=>1741,21402=>1742,21467=>1743,21676=>1744,21696=>1745,21672=>1746,21710=>1747,21705=>1748,21688=>1749,21670=>1750,21683=>1751,21703=>1752,21698=>1753,21693=>1754,21674=>1755,21697=>1756,21700=>1757,21704=>1758,21679=>1759,21675=>1760,21681=>1761,21691=>1762,21673=>1763,21671=>1764,21695=>1765,22271=>1766,22402=>1767,22411=>1768,22432=>1769,22435=>1770,22434=>1771,22478=>1772,22446=>1773,22419=>1774,22869=>1775,22865=>1776,22863=>1777,22862=>1778,22864=>1779,23004=>1780,23000=>1781,23039=>1782,23011=>1783,23016=>1784,23043=>1785,23013=>1786,23018=>1787,23002=>1788,23014=>1789,23041=>1790,23035=>1791,23401=>1792,23459=>1793,23462=>1794,23460=>1795,23458=>1796,23461=>1797,23553=>1798,23630=>1799,23631=>1800,23629=>1801,23627=>1802,23769=>1803,23762=>1804,24055=>1805,24093=>1806,24101=>1807,24095=>1808,24189=>1809,24224=>1810,24230=>1811,24314=>1812,24328=>1813,24365=>1814,24421=>1815,24456=>1816,24453=>1817,24458=>1818,24459=>1819,24455=>1820,24460=>1821,24457=>1822,24594=>1823,24605=>1824,24608=>1825,24613=>1826,24590=>1827,24616=>1828,24653=>1829,24688=>1830,24680=>1831,24674=>1832,60712=>1832,24646=>1833,24643=>1834,24684=>1835,24683=>1836,24682=>1837,24676=>1838,25153=>1839,25308=>1840,25366=>1841,25353=>1842,25340=>1843,25325=>1844,25345=>1845,25326=>1846,25341=>1847,25351=>1848,25329=>1849,25335=>1850,25327=>1851,25324=>1852,25342=>1853,25332=>1854,25361=>1855,25346=>1856,25919=>1857,25925=>1858,26027=>1859,26045=>1860,26082=>1861,26149=>1862,26157=>1863,26144=>1864,26151=>1865,26159=>1866,26143=>1867,26152=>1868,26161=>1869,26148=>1870,26359=>1871,26623=>1872,26579=>1873,26609=>1874,26580=>1875,26576=>1876,26604=>1877,26550=>1878,26543=>1879,26613=>1880,26601=>1881,26607=>1882,26564=>1883,26577=>1884,26548=>1885,26586=>1886,26597=>1887,26552=>1888,26575=>1889,26590=>1890,26611=>1891,26544=>1892,26585=>1893,26594=>1894,26589=>1895,26578=>1896,27498=>1897,27523=>1898,27526=>1899,27573=>1900,27602=>1901,27607=>1902,27679=>1903,27849=>1904,27915=>1905,27954=>1906,27946=>1907,27969=>1908,27941=>1909,27916=>1910,27953=>1911,27934=>1912,27927=>1913,27963=>1914,27965=>1915,27966=>1916,27958=>1917,27931=>1918,27893=>1919,27961=>1920,27943=>1921,27960=>1922,27945=>1923,27950=>1924,27957=>1925,27918=>1926,27947=>1927,28843=>1928,28858=>1929,28851=>1930,28844=>1931,28847=>1932,28845=>1933,28856=>1934,28846=>1935,28836=>1936,29232=>1937,29298=>1938,29295=>1939,29300=>1940,29417=>1941,29408=>1942,29409=>1943,29623=>1944,29642=>1945,29627=>1946,29618=>1947,29645=>1948,29632=>1949,29619=>1950,29978=>1951,29997=>1952,30031=>1953,30028=>1954,30030=>1955,30027=>1956,30123=>1957,30116=>1958,30117=>1959,30114=>1960,30115=>1961,30328=>1962,30342=>1963,30343=>1964,30344=>1965,30408=>1966,30406=>1967,30403=>1968,30405=>1969,30465=>1970,30457=>1971,30456=>1972,30473=>1973,30475=>1974,30462=>1975,30460=>1976,30471=>1977,30684=>1978,30722=>1979,30740=>1980,30732=>1981,30733=>1982,31046=>1983,31049=>1984,31048=>1985,31047=>1986,31161=>1987,31162=>1988,31185=>1989,31186=>1990,31179=>1991,31359=>1992,31361=>1993,31487=>1994,31485=>1995,31869=>1996,32002=>1997,32005=>1998,32000=>1999,32009=>2000,32007=>2001,32004=>2002,32006=>2003,32568=>2004,32654=>2005,32703=>2006,32784=>2007,32781=>2008,32785=>2009,32822=>2010,32982=>2011,32997=>2012,32986=>2013,32963=>2014,32964=>2015,32972=>2016,32993=>2017,32987=>2018,32974=>2019,32990=>2020,32996=>2021,32989=>2022,33268=>2023,33314=>2024,33511=>2025,33539=>2026,33541=>2027,33507=>2028,33499=>2029,33510=>2030,33540=>2031,33509=>2032,33538=>2033,33545=>2034,33490=>2035,33495=>2036,33521=>2037,33537=>2038,33500=>2039,33492=>2040,33489=>2041,33502=>2042,33491=>2043,33503=>2044,33519=>2045,33542=>2046,34384=>2047,34425=>2048,34427=>2049,34426=>2050,34893=>2051,34923=>2052,35201=>2053,35284=>2054,35336=>2055,35330=>2056,35331=>2057,35998=>2058,36000=>2059,36212=>2060,36211=>2061,36276=>2062,36557=>2063,36556=>2064,36848=>2065,36838=>2066,36834=>2067,36842=>2068,36837=>2069,36845=>2070,36843=>2071,36836=>2072,36840=>2073,37066=>2074,37070=>2075,37057=>2076,37059=>2077,37195=>2078,37194=>2079,37325=>2080,38274=>2081,38480=>2082,38475=>2083,38476=>2084,38477=>2085,38754=>2086,12207=>2086,38761=>2087,12208=>2087,38859=>2088,12209=>2088,38893=>2089,12210=>2089,38899=>2090,12211=>2090,38913=>2091,12212=>2091,39080=>2092,12213=>2092,39131=>2093,12214=>2093,39135=>2094,12215=>2094,39318=>2095,12216=>2095,39321=>2096,12217=>2096,20056=>2097,20147=>2098,20492=>2099,20493=>2100,20515=>2101,20463=>2102,20518=>2103,20517=>2104,20472=>2105,20521=>2106,57375=>2106,20502=>2107,20486=>2108,20540=>2109,20511=>2110,20506=>2111,20498=>2112,20497=>2113,20474=>2114,20480=>2115,20500=>2116,20520=>2117,20465=>2118,20513=>2119,20491=>2120,20505=>2121,20504=>2122,20467=>2123,20462=>2124,20525=>2125,20522=>2126,20478=>2127,20523=>2128,20489=>2129,20860=>2130,20900=>2131,20901=>2132,20898=>2133,20941=>2134,20940=>2135,20934=>2136,20939=>2137,21078=>2138,21084=>2139,21076=>2140,21083=>2141,21085=>2142,21290=>2143,21375=>2144,57459=>2144,21407=>2145,21405=>2146,21471=>2147,21736=>2148,21776=>2149,21761=>2150,21815=>2151,21756=>2152,21733=>2153,21746=>2154,21766=>2155,21754=>2156,21780=>2157,21737=>2158,21741=>2159,21729=>2160,21769=>2161,21742=>2162,21738=>2163,21734=>2164,21799=>2165,21767=>2166,21757=>2167,21775=>2168,22275=>2169,22276=>2170,22466=>2171,22484=>2172,22475=>2173,22467=>2174,22537=>2175,22799=>2176,22871=>2177,22872=>2178,22874=>2179,23057=>2180,23064=>2181,23068=>2182,23071=>2183,23067=>2184,23059=>2185,23020=>2186,23072=>2187,23075=>2188,23081=>2189,23077=>2190,23052=>2191,23049=>2192,23403=>2193,23640=>2194,23472=>2195,23475=>2196,23478=>2197,23476=>2198,23470=>2199,23477=>2200,23481=>2201,23480=>2202,23556=>2203,23633=>2204,23637=>2205,23632=>2206,23789=>2207,23805=>2208,23803=>2209,23786=>2210,23784=>2211,23792=>2212,23798=>2213,23809=>2214,23796=>2215,24046=>2216,24109=>2217,24107=>2218,24235=>2219,24237=>2220,24231=>2221,24369=>2222,24466=>2223,24465=>2224,24464=>2225,24665=>2226,24675=>2227,24677=>2228,24656=>2229,24661=>2230,24685=>2231,24681=>2232,24687=>2233,24708=>2234,24735=>2235,24730=>2236,24717=>2237,24724=>2238,24716=>2239,24709=>2240,24726=>2241,25159=>2242,25331=>2243,25352=>2244,25343=>2245,25422=>2246,25406=>2247,25391=>2248,25429=>2249,25410=>2250,25414=>2251,25423=>2252,25417=>2253,25402=>2254,25424=>2255,25405=>2256,25386=>2257,25387=>2258,25384=>2259,25421=>2260,25420=>2261,25928=>2262,25929=>2263,26009=>2264,26049=>2265,26053=>2266,26178=>2267,26185=>2268,26191=>2269,26179=>2270,26194=>2271,26188=>2272,26181=>2273,26177=>2274,26360=>2275,26388=>2276,26389=>2277,26391=>2278,26657=>2279,26680=>2280,26696=>2281,26694=>2282,26707=>2283,26681=>2284,26690=>2285,26708=>2286,26665=>2287,26803=>2288,26647=>2289,26700=>2290,26705=>2291,26685=>2292,26612=>2293,26704=>2294,26688=>2295,26684=>2296,26691=>2297,26666=>2298,26693=>2299,26643=>2300,26648=>2301,26689=>2302,27530=>2303,27529=>2304,27575=>2305,27683=>2306,27687=>2307,27688=>2308,27686=>2309,27684=>2310,27888=>2311,28010=>2312,28053=>2313,28040=>2314,28039=>2315,28006=>2316,28024=>2317,28023=>2318,27993=>2319,28051=>2320,28012=>2321,28041=>2322,28014=>2323,27994=>2324,28020=>2325,28009=>2326,28044=>2327,28042=>2328,28025=>2329,28037=>2330,28005=>2331,28052=>2332,28874=>2333,28888=>2334,28900=>2335,28889=>2336,28872=>2337,28879=>2338,29241=>2339,29305=>2340,29436=>2341,29433=>2342,29437=>2343,29432=>2344,29431=>2345,29574=>2346,29677=>2347,29705=>2348,29678=>2349,29664=>2350,29674=>2351,29662=>2352,30036=>2353,30045=>2354,30044=>2355,30042=>2356,30041=>2357,30142=>2358,30149=>2359,30151=>2360,30130=>2361,30131=>2362,30141=>2363,30140=>2364,30137=>2365,30146=>2366,30136=>2367,30347=>2368,30384=>2369,30410=>2370,30413=>2371,30414=>2372,30505=>2373,30495=>2374,30496=>2375,30504=>2376,30697=>2377,30768=>2378,30759=>2379,30776=>2380,30749=>2381,30772=>2382,30775=>2383,30757=>2384,30765=>2385,30752=>2386,30751=>2387,30770=>2388,31061=>2389,31056=>2390,31072=>2391,31071=>2392,31062=>2393,31070=>2394,31069=>2395,31063=>2396,31066=>2397,31204=>2398,31203=>2399,60418=>2399,31207=>2400,31199=>2401,31206=>2402,31209=>2403,31192=>2404,31364=>2405,31368=>2406,31449=>2407,31494=>2408,31505=>2409,31881=>2410,32033=>2411,32023=>2412,32011=>2413,32010=>2414,32032=>2415,32034=>2416,32020=>2417,32016=>2418,32021=>2419,32026=>2420,32028=>2421,32013=>2422,32025=>2423,32027=>2424,32570=>2425,32607=>2426,32660=>2427,32709=>2428,32705=>2429,32774=>2430,32772=>2431,32792=>2432,32789=>2433,32793=>2434,32791=>2435,32829=>2436,32831=>2437,33009=>2438,33026=>2439,33008=>2440,33029=>2441,33005=>2442,33012=>2443,33030=>2444,33016=>2445,33011=>2446,33032=>2447,33021=>2448,33034=>2449,33020=>2450,33007=>2451,33261=>2452,33260=>2453,33280=>2454,33296=>2455,33322=>2456,33323=>2457,33320=>2458,33324=>2459,33467=>2460,33579=>2461,33618=>2462,33620=>2463,33610=>2464,33592=>2465,33616=>2466,33609=>2467,33589=>2468,33588=>2469,33615=>2470,33586=>2471,33593=>2472,33590=>2473,33559=>2474,33600=>2475,33585=>2476,33576=>2477,33603=>2478,34388=>2479,34442=>2480,34474=>2481,34451=>2482,34468=>2483,34473=>2484,34444=>2485,34467=>2486,34460=>2487,34928=>2488,34935=>2489,34945=>2490,34946=>2491,34941=>2492,34937=>2493,35352=>2494,35344=>2495,35342=>2496,35340=>2497,35349=>2498,35338=>2499,35351=>2500,35347=>2501,35350=>2502,35343=>2503,35345=>2504,35912=>2505,35962=>2506,35961=>2507,36001=>2508,36002=>2509,36215=>2510,58442=>2510,36524=>2511,36562=>2512,36564=>2513,36559=>2514,36785=>2515,36865=>2516,36870=>2517,36855=>2518,36864=>2519,36858=>2520,36852=>2521,36867=>2522,36861=>2523,36869=>2524,36856=>2525,37013=>2526,37089=>2527,37085=>2528,37090=>2529,37202=>2530,37197=>2531,37196=>2532,37336=>2533,37341=>2534,37335=>2535,37340=>2536,37337=>2537,38275=>2538,38498=>2539,38499=>2540,38497=>2541,38491=>2542,38493=>2543,38500=>2544,38488=>2545,38494=>2546,38587=>2547,39138=>2548,39340=>2549,12218=>2549,39592=>2550,12219=>2550,39640=>2551,12220=>2551,12222=>2552,39717=>2552,39730=>2553,12224=>2553,39740=>2554,12225=>2554,20094=>2555,20602=>2556,20605=>2557,57382=>2557,20572=>2558,20551=>2559,20547=>2560,20556=>2561,20570=>2562,20553=>2563,20581=>2564,20598=>2565,20558=>2566,20565=>2567,20597=>2568,20596=>2569,20599=>2570,20559=>2571,20495=>2572,20591=>2573,20589=>2574,20828=>2575,20885=>2576,20976=>2577,21098=>2578,21103=>2579,21202=>2580,21209=>2581,21208=>2582,21205=>2583,21264=>2584,21263=>2585,21273=>2586,21311=>2587,21312=>2588,21310=>2589,21443=>2590,26364=>2591,21830=>2592,21866=>2593,21862=>2594,21828=>2595,21854=>2596,21857=>2597,21827=>2598,21834=>2599,21809=>2600,21846=>2601,21839=>2602,21845=>2603,21807=>2604,21860=>2605,21816=>2606,21806=>2607,21852=>2608,21804=>2609,21859=>2610,21811=>2611,21825=>2612,21847=>2613,22280=>2614,22283=>2615,22281=>2616,22495=>2617,22533=>2618,22538=>2619,22534=>2620,22496=>2621,22500=>2622,22522=>2623,22530=>2624,22581=>2625,22519=>2626,22521=>2627,22816=>2628,22882=>2629,23094=>2630,23105=>2631,23113=>2632,23142=>2633,23146=>2634,23104=>2635,23100=>2636,23138=>2637,23130=>2638,23110=>2639,23114=>2640,23408=>2641,23495=>2642,23493=>2643,23492=>2644,23490=>2645,23487=>2646,23494=>2647,23561=>2648,23560=>2649,23559=>2650,23648=>2651,23644=>2652,23645=>2653,23815=>2654,23814=>2655,23822=>2656,23835=>2657,23830=>2658,23842=>2659,23825=>2660,23849=>2661,23828=>2662,23833=>2663,23844=>2664,23847=>2665,23831=>2666,24034=>2667,24120=>2668,24118=>2669,24115=>2670,24119=>2671,24247=>2672,24248=>2673,24246=>2674,24245=>2675,24254=>2676,24373=>2677,24375=>2678,24407=>2679,24428=>2680,24425=>2681,24427=>2682,24471=>2683,24473=>2684,24478=>2685,24472=>2686,24481=>2687,24480=>2688,24476=>2689,24703=>2690,24739=>2691,24713=>2692,24736=>2693,24744=>2694,24779=>2695,24756=>2696,24806=>2697,24765=>2698,24773=>2699,24763=>2700,24757=>2701,24796=>2702,24764=>2703,24792=>2704,24789=>2705,24774=>2706,24799=>2707,24760=>2708,24794=>2709,24775=>2710,25114=>2711,25115=>2712,25160=>2713,25504=>2714,25511=>2715,25458=>2716,25494=>2717,25506=>2718,25509=>2719,25463=>2720,25447=>2721,25496=>2722,25514=>2723,25457=>2724,25513=>2725,25481=>2726,25475=>2727,25499=>2728,25451=>2729,25512=>2730,25476=>2731,25480=>2732,25497=>2733,25505=>2734,25516=>2735,25490=>2736,25487=>2737,25472=>2738,25467=>2739,25449=>2740,25448=>2741,25466=>2742,25949=>2743,25942=>2744,25937=>2745,25945=>2746,25943=>2747,21855=>2748,25935=>2749,25944=>2750,25941=>2751,25940=>2752,26012=>2753,26011=>2754,26028=>2755,26063=>2756,26059=>2757,26060=>2758,26062=>2759,26205=>2760,26202=>2761,26212=>2762,26216=>2763,26214=>2764,26206=>2765,26361=>2766,21207=>2767,26395=>2768,26753=>2769,26799=>2770,26786=>2771,26771=>2772,26805=>2773,26751=>2774,26742=>2775,26801=>2776,26791=>2777,26775=>2778,26800=>2779,26755=>2780,26820=>2781,26797=>2782,26758=>2783,26757=>2784,26772=>2785,26781=>2786,26792=>2787,26783=>2788,26785=>2789,26754=>2790,27442=>2791,27578=>2792,27627=>2793,27628=>2794,27691=>2795,28046=>2796,28092=>2797,28147=>2798,28121=>2799,28082=>2800,28129=>2801,28108=>2802,28132=>2803,28155=>2804,28154=>2805,28165=>2806,28103=>2807,28107=>2808,28079=>2809,28113=>2810,28078=>2811,28126=>2812,28153=>2813,28088=>2814,28151=>2815,28149=>2816,28101=>2817,28114=>2818,28186=>2819,28085=>2820,28122=>2821,28139=>2822,28120=>2823,28138=>2824,28145=>2825,28142=>2826,28136=>2827,28102=>2828,28100=>2829,28074=>2830,28140=>2831,28095=>2832,28134=>2833,28921=>2834,28937=>2835,28938=>2836,28925=>2837,28911=>2838,29245=>2839,29309=>2840,29313=>2841,29468=>2842,29467=>2843,29462=>2844,29459=>2845,29465=>2846,29575=>2847,29701=>2848,29706=>2849,29699=>2850,29702=>2851,29694=>2852,29709=>2853,29920=>2854,29942=>2855,29943=>2856,29980=>2857,29986=>2858,30053=>2859,30054=>2860,30050=>2861,30064=>2862,30095=>2863,30164=>2864,30165=>2865,30133=>2866,30154=>2867,30157=>2868,30350=>2869,30420=>2870,30418=>2871,30427=>2872,30519=>2873,30526=>2874,30524=>2875,30518=>2876,30520=>2877,30522=>2878,30827=>2879,30787=>2880,30798=>2881,31077=>2882,31080=>2883,31085=>2884,31227=>2885,31378=>2886,31381=>2887,31520=>2888,31528=>2889,31515=>2890,31532=>2891,31526=>2892,31513=>2893,31518=>2894,31534=>2895,31890=>2896,31895=>2897,31893=>2898,32070=>2899,32067=>2900,32113=>2901,32046=>2902,32057=>2903,32060=>2904,32064=>2905,32048=>2906,32051=>2907,32068=>2908,32047=>2909,32066=>2910,32050=>2911,32049=>2912,32573=>2913,32670=>2914,32666=>2915,32716=>2916,32718=>2917,32722=>2918,32796=>2919,32842=>2920,32838=>2921,33071=>2922,33046=>2923,33059=>2924,33067=>2925,33065=>2926,33072=>2927,33060=>2928,33282=>2929,33333=>2930,33335=>2931,33334=>2932,33337=>2933,33678=>2934,33694=>2935,33688=>2936,33656=>2937,33698=>2938,33686=>2939,33725=>2940,33707=>2941,33682=>2942,33674=>2943,33683=>2944,33673=>2945,33696=>2946,33655=>2947,33659=>2948,33660=>2949,33670=>2950,33703=>2951,34389=>2952,24426=>2953,34503=>2954,34496=>2955,34486=>2956,34500=>2957,34485=>2958,34502=>2959,34507=>2960,34481=>2961,34479=>2962,34505=>2963,34899=>2964,34974=>2965,34952=>2966,34987=>2967,34962=>2968,34966=>2969,34957=>2970,34955=>2971,35219=>2972,35215=>2973,35370=>2974,35357=>2975,35363=>2976,35365=>2977,35377=>2978,35373=>2979,35359=>2980,35355=>2981,35362=>2982,35913=>2983,35930=>2984,36009=>2985,36012=>2986,36011=>2987,36008=>2988,36010=>2989,36007=>2990,36199=>2991,36198=>2992,36286=>2993,36282=>2994,36571=>2995,36575=>2996,36889=>2997,36877=>2998,36890=>2999,36887=>3000,36899=>3001,36895=>3002,36893=>3003,36880=>3004,36885=>3005,36894=>3006,36896=>3007,36879=>3008,36898=>3009,36886=>3010,36891=>3011,36884=>3012,37096=>3013,37101=>3014,37117=>3015,58488=>3015,37207=>3016,37326=>3017,37365=>3018,37350=>3019,37347=>3020,37351=>3021,37357=>3022,37353=>3023,38281=>3024,38506=>3025,38517=>3026,38515=>3027,38520=>3028,38512=>3029,38516=>3030,38518=>3031,38519=>3032,38508=>3033,38592=>3034,38634=>3035,38633=>3036,31456=>3037,31455=>3038,38914=>3039,38915=>3040,39770=>3041,12226=>3041,40165=>3042,12227=>3042,40565=>3043,12228=>3043,40575=>3044,12229=>3044,40613=>3045,12230=>3045,40635=>3046,12231=>3046,20642=>3047,20621=>3048,20613=>3049,20633=>3050,20625=>3051,20608=>3052,20630=>3053,20632=>3054,20634=>3055,26368=>3056,20977=>3057,21106=>3058,21108=>3059,21109=>3060,21097=>3061,21214=>3062,21213=>3063,21211=>3064,21338=>3065,21413=>3066,21883=>3067,21888=>3068,21927=>3069,21884=>3070,21898=>3071,21917=>3072,21912=>3073,21890=>3074,21916=>3075,21930=>3076,21908=>3077,21895=>3078,21899=>3079,21891=>3080,21939=>3081,21934=>3082,21919=>3083,21822=>3084,21938=>3085,21914=>3086,21947=>3087,21932=>3088,21937=>3089,21886=>3090,21897=>3091,21931=>3092,21913=>3093,22285=>3094,22575=>3095,22570=>3096,22580=>3097,22564=>3098,22576=>3099,22577=>3100,22561=>3101,22557=>3102,22560=>3103,22777=>3104,22778=>3105,22880=>3106,23159=>3107,57587=>3107,23194=>3108,23167=>3109,23186=>3110,23195=>3111,23207=>3112,23411=>3113,23409=>3114,23506=>3115,23500=>3116,23507=>3117,23504=>3118,23562=>3119,23563=>3120,23601=>3121,23884=>3122,23888=>3123,23860=>3124,23879=>3125,24061=>3126,24133=>3127,24125=>3128,24128=>3129,24131=>3130,24190=>3131,24266=>3132,24257=>3133,24258=>3134,24260=>3135,24380=>3136,24429=>3137,24489=>3138,24490=>3139,24488=>3140,24785=>3141,24801=>3142,24754=>3143,24758=>3144,24800=>3145,24860=>3146,24867=>3147,24826=>3148,24853=>3149,24816=>3150,24827=>3151,24820=>3152,24936=>3153,24817=>3154,24846=>3155,24822=>3156,24841=>3157,24832=>3158,24850=>3159,25119=>3160,25161=>3161,25507=>3162,25484=>3163,25551=>3164,25536=>3165,25577=>3166,25545=>3167,25542=>3168,25549=>3169,25554=>3170,25571=>3171,25552=>3172,25569=>3173,25558=>3174,25581=>3175,25582=>3176,25462=>3177,25588=>3178,25578=>3179,25563=>3180,25682=>3181,25562=>3182,25593=>3183,25950=>3184,25958=>3185,25954=>3186,25955=>3187,26001=>3188,26000=>3189,26031=>3190,26222=>3191,26224=>3192,26228=>3193,57786=>3193,26230=>3194,26223=>3195,26257=>3196,26234=>3197,26238=>3198,26231=>3199,26366=>3200,26367=>3201,26399=>3202,26397=>3203,26874=>3204,26837=>3205,26848=>3206,26840=>3207,26839=>3208,26885=>3209,26847=>3210,26869=>3211,26862=>3212,26855=>3213,26873=>3214,26834=>3215,26866=>3216,26851=>3217,26827=>3218,26829=>3219,26893=>3220,26898=>3221,26894=>3222,26825=>3223,26842=>3224,26990=>3225,26875=>3226,27454=>3227,27450=>3228,27453=>3229,27544=>3230,27542=>3231,27580=>3232,27631=>3233,27694=>3234,27695=>3235,27692=>3236,28207=>3237,57904=>3237,28216=>3238,28244=>3239,28193=>3240,28210=>3241,28263=>3242,28234=>3243,28192=>3244,28197=>3245,28195=>3246,28187=>3247,28251=>3248,28248=>3249,28196=>3250,28246=>3251,28270=>3252,28205=>3253,28198=>3254,28271=>3255,28212=>3256,28237=>3257,28218=>3258,28204=>3259,28227=>3260,28189=>3261,57901=>3261,28222=>3262,28363=>3263,28297=>3264,28185=>3265,28238=>3266,28259=>3267,28228=>3268,28274=>3269,28265=>3270,28255=>3271,28953=>3272,28954=>3273,28966=>3274,28976=>3275,28961=>3276,28982=>3277,29038=>3278,57958=>3278,28956=>3279,29260=>3280,29316=>3281,29312=>3282,29494=>3283,29477=>3284,29492=>3285,29481=>3286,29754=>3287,29738=>3288,29747=>3289,29730=>3290,29733=>3291,29749=>3292,29750=>3293,29748=>3294,29743=>3295,29723=>3296,29734=>3297,29736=>3298,29989=>3299,29990=>3300,30059=>3301,30058=>3302,30178=>3303,30171=>3304,30179=>3305,30169=>3306,30168=>3307,30174=>3308,30176=>3309,30331=>3310,30332=>3311,30358=>3312,30355=>3313,30388=>3314,30428=>3315,30543=>3316,30701=>3317,30813=>3318,30828=>3319,30831=>3320,31245=>3321,31240=>3322,31243=>3323,31237=>3324,31232=>3325,31384=>3326,31383=>3327,31382=>3328,31461=>3329,31459=>3330,31561=>3331,31574=>3332,31558=>3333,31568=>3334,31570=>3335,31572=>3336,31565=>3337,31563=>3338,31567=>3339,31569=>3340,60510=>3340,31903=>3341,31909=>3342,32094=>3343,32080=>3344,32104=>3345,32085=>3346,32043=>3347,32110=>3348,32114=>3349,32097=>3350,32102=>3351,32098=>3352,32112=>3353,32115=>3354,21892=>3355,32724=>3356,32725=>3357,32779=>3358,32850=>3359,32901=>3360,33109=>3361,33108=>3362,33099=>3363,33105=>3364,33102=>3365,33081=>3366,33094=>3367,33086=>3368,33100=>3369,33107=>3370,33140=>3371,33298=>3372,33308=>3373,33769=>3374,33795=>3375,33784=>3376,33805=>3377,33760=>3378,33733=>3379,33803=>3380,33729=>3381,58309=>3381,33775=>3382,33777=>3383,33780=>3384,33879=>3385,33802=>3386,33776=>3387,33804=>3388,33740=>3389,33789=>3390,33778=>3391,33738=>3392,33848=>3393,33806=>3394,33796=>3395,33756=>3396,33799=>3397,33748=>3398,33759=>3399,34395=>3400,34527=>3401,34521=>3402,34541=>3403,34516=>3404,34523=>3405,34532=>3406,34512=>3407,34526=>3408,34903=>3409,35009=>3410,35010=>3411,34993=>3412,35203=>3413,35222=>3414,35387=>3415,35424=>3416,35413=>3417,35422=>3418,35388=>3419,35393=>3420,35412=>3421,35419=>3422,35408=>3423,35398=>3424,35380=>3425,35386=>3426,35382=>3427,35414=>3428,35937=>3429,35970=>3430,36015=>3431,36028=>3432,36019=>3433,36029=>3434,36033=>3435,36027=>3436,36032=>3437,36020=>3438,36023=>3439,36022=>3440,36031=>3441,36024=>3442,36234=>3443,36229=>3444,36225=>3445,36302=>3446,36317=>3447,36299=>3448,36314=>3449,36305=>3450,36300=>3451,36315=>3452,36294=>3453,36603=>3454,36600=>3455,36604=>3456,36764=>3457,36910=>3458,36917=>3459,36913=>3460,36920=>3461,36914=>3462,36918=>3463,37122=>3464,37109=>3465,37129=>3466,37118=>3467,37219=>3468,37221=>3469,37327=>3470,37396=>3471,37397=>3472,37411=>3473,37385=>3474,37406=>3475,37389=>3476,37392=>3477,37383=>3478,37393=>3479,38292=>3480,38287=>3481,38283=>3482,38289=>3483,38291=>3484,38290=>3485,38286=>3486,38538=>3487,38542=>3488,38539=>3489,38525=>3490,38533=>3491,38534=>3492,38541=>3493,38514=>3494,38532=>3495,38593=>3496,38597=>3497,38596=>3498,38598=>3499,38599=>3500,38639=>3501,38642=>3502,38860=>3503,38917=>3504,38918=>3505,38920=>3506,39143=>3507,39146=>3508,39151=>3509,39145=>3510,39154=>3511,39149=>3512,39342=>3513,39341=>3514,40643=>3515,12232=>3515,40653=>3516,12233=>3516,40657=>3517,12234=>3517,20098=>3518,20653=>3519,20661=>3520,20658=>3521,20659=>3522,20677=>3523,20670=>3524,20652=>3525,20663=>3526,20667=>3527,20655=>3528,20679=>3529,21119=>3530,21111=>3531,21117=>3532,21215=>3533,21222=>3534,21220=>3535,21218=>3536,21219=>3537,21295=>3538,21983=>3539,21992=>3540,21971=>3541,21990=>3542,21966=>3543,21980=>3544,21959=>3545,21969=>3546,21987=>3547,21988=>3548,21999=>3549,21978=>3550,21985=>3551,21957=>3552,21958=>3553,21989=>3554,21961=>3555,22290=>3556,22291=>3557,22622=>3558,22609=>3559,22616=>3560,22615=>3561,22618=>3562,22612=>3563,22635=>3564,22604=>3565,22637=>3566,22602=>3567,22626=>3568,22610=>3569,22603=>3570,22887=>3571,23233=>3572,23241=>3573,23244=>3574,23230=>3575,23229=>3576,23228=>3577,23219=>3578,23234=>3579,23218=>3580,23913=>3581,23919=>3582,24140=>3583,24185=>3584,24265=>3585,24264=>3586,24338=>3587,24409=>3588,24492=>3589,24494=>3590,24858=>3591,24847=>3592,24904=>3593,24863=>3594,24819=>3595,24859=>3596,24825=>3597,24833=>3598,24840=>3599,24910=>3600,24908=>3601,24900=>3602,24909=>3603,24894=>3604,24884=>3605,24871=>3606,24845=>3607,24838=>3608,24887=>3609,25121=>3610,25122=>3611,25619=>3612,25662=>3613,25630=>3614,25642=>3615,25645=>3616,25661=>3617,25644=>3618,25615=>3619,25628=>3620,25620=>3621,25613=>3622,25654=>3623,25622=>3624,25623=>3625,25606=>3626,25964=>3627,26015=>3628,26032=>3629,26263=>3630,26249=>3631,26247=>3632,26248=>3633,26262=>3634,26244=>3635,26264=>3636,26253=>3637,26371=>3638,27028=>3639,26989=>3640,26970=>3641,26999=>3642,26976=>3643,26964=>3644,26997=>3645,26928=>3646,27010=>3647,26954=>3648,26984=>3649,26987=>3650,26974=>3651,26963=>3652,27001=>3653,27014=>3654,26973=>3655,26979=>3656,26971=>3657,27463=>3658,27506=>3659,27584=>3660,27583=>3661,27603=>3662,27645=>3663,28322=>3664,28335=>3665,28371=>3666,28342=>3667,28354=>3668,28304=>3669,28317=>3670,28359=>3671,28357=>3672,28325=>3673,28312=>3674,28348=>3675,28346=>3676,28331=>3677,28369=>3678,28310=>3679,28316=>3680,28356=>3681,28372=>3682,28330=>3683,28327=>3684,28340=>3685,29006=>3686,29017=>3687,29033=>3688,29028=>3689,29001=>3690,29031=>3691,29020=>3692,29036=>3693,29030=>3694,29004=>3695,29029=>3696,29022=>3697,28998=>3698,29032=>3699,29014=>3700,29242=>3701,29266=>3702,29495=>3703,29509=>3704,29503=>3705,29502=>3706,29807=>3707,29786=>3708,29781=>3709,29791=>3710,29790=>3711,29761=>3712,29759=>3713,29785=>3714,29787=>3715,58019=>3716,29788=>3716,30070=>3717,30072=>3718,30208=>3719,30192=>3720,30209=>3721,30194=>3722,30193=>3723,30202=>3724,30207=>3725,30196=>3726,30195=>3727,30430=>3728,30431=>3729,30555=>3730,30571=>3731,30566=>3732,30558=>3733,30563=>3734,30585=>3735,30570=>3736,30572=>3737,30556=>3738,30565=>3739,30568=>3740,30562=>3741,30702=>3742,30862=>3743,30896=>3744,30871=>3745,30872=>3746,30860=>3747,30857=>3748,30844=>3749,30865=>3750,30867=>3751,30847=>3752,31098=>3753,31103=>3754,31105=>3755,33836=>3756,31165=>3757,31260=>3758,31258=>3759,31264=>3760,31252=>3761,31263=>3762,31262=>3763,31391=>3764,31392=>3765,31607=>3766,31680=>3767,31584=>3768,31598=>3769,31591=>3770,31921=>3771,31923=>3772,31925=>3773,32147=>3774,32121=>3775,32145=>3776,32129=>3777,32143=>3778,32091=>3779,32622=>3780,32617=>3781,32618=>3782,32626=>3783,32681=>3784,32680=>3785,32676=>3786,32854=>3787,32856=>3788,32902=>3789,32900=>3790,33137=>3791,33136=>3792,33144=>3793,33125=>3794,33134=>3795,33139=>3796,33131=>3797,33145=>3798,33146=>3799,33126=>3800,33285=>3801,33351=>3802,33922=>3803,33911=>3804,33853=>3805,33841=>3806,33909=>3807,33894=>3808,33899=>3809,33865=>3810,33900=>3811,33883=>3812,33852=>3813,33845=>3814,33889=>3815,33891=>3816,33897=>3817,33901=>3818,33862=>3819,34398=>3820,34396=>3821,34399=>3822,34553=>3823,34579=>3824,34568=>3825,34567=>3826,34560=>3827,34558=>3828,34555=>3829,34562=>3830,34563=>3831,34566=>3832,34570=>3833,34905=>3834,35039=>3835,35028=>3836,35033=>3837,35036=>3838,35032=>3839,35037=>3840,35041=>3841,35018=>3842,35029=>3843,35026=>3844,35228=>3845,35299=>3846,35435=>3847,35442=>3848,35443=>3849,35430=>3850,35433=>3851,35440=>3852,35463=>3853,35452=>3854,35427=>3855,35488=>3856,35441=>3857,35461=>3858,35437=>3859,35426=>3860,35438=>3861,35436=>3862,35449=>3863,35451=>3864,35390=>3865,35432=>3866,35938=>3867,35978=>3868,35977=>3869,36042=>3870,36039=>3871,36040=>3872,36036=>3873,36018=>3874,36035=>3875,36034=>3876,36037=>3877,36321=>3878,36319=>3879,36328=>3880,36335=>3881,36339=>3882,36346=>3883,36330=>3884,36324=>3885,36326=>3886,36530=>3887,36611=>3888,36617=>3889,36606=>3890,36618=>3891,36767=>3892,36786=>3893,36939=>3894,36938=>3895,36947=>3896,36930=>3897,36948=>3898,36924=>3899,36949=>3900,36944=>3901,36935=>3902,36943=>3903,36942=>3904,36941=>3905,36945=>3906,36926=>3907,36929=>3908,37138=>3909,37143=>3910,37228=>3911,37226=>3912,37225=>3913,37321=>3914,37431=>3915,37463=>3916,37432=>3917,37437=>3918,37440=>3919,37438=>3920,37467=>3921,37451=>3922,37476=>3923,37457=>3924,37428=>3925,37449=>3926,37453=>3927,37445=>3928,37433=>3929,37439=>3930,37466=>3931,38296=>3932,38552=>3933,38548=>3934,38549=>3935,38605=>3936,38603=>3937,38601=>3938,38602=>3939,38647=>3940,38651=>3941,38649=>3942,38646=>3943,38742=>3944,38772=>3945,38774=>3946,38928=>3947,38929=>3948,38931=>3949,38922=>3950,38930=>3951,38924=>3952,39164=>3953,39156=>3954,39165=>3955,39166=>3956,39347=>3957,39345=>3958,39348=>3959,39649=>3960,40169=>3961,40578=>3962,40718=>3963,12237=>3963,40723=>3964,12238=>3964,40736=>3965,12239=>3965,20711=>3966,20718=>3967,20709=>3968,20694=>3969,20717=>3970,60903=>3970,20698=>3971,20693=>3972,20687=>3973,20689=>3974,20721=>3975,20686=>3976,20713=>3977,20834=>3978,20979=>3979,21123=>3980,21122=>3981,21297=>3982,21421=>3983,22014=>3984,22016=>3985,22043=>3986,22039=>3987,22013=>3988,22036=>3989,22022=>3990,22025=>3991,22029=>3992,22030=>3993,22007=>3994,22038=>3995,22047=>3996,22024=>3997,22032=>3998,22006=>3999,22296=>4000,22294=>4001,22645=>4002,22654=>4003,22659=>4004,22675=>4005,22666=>4006,22649=>4007,22661=>4008,22653=>4009,22781=>4010,22821=>4011,22818=>4012,22820=>4013,22890=>4014,22889=>4015,23265=>4016,23270=>4017,23273=>4018,23255=>4019,23254=>4020,23256=>4021,23267=>4022,23413=>4023,23518=>4024,23527=>4025,23521=>4026,23525=>4027,23526=>4028,23528=>4029,23522=>4030,23524=>4031,23519=>4032,23565=>4033,23650=>4034,23940=>4035,23943=>4036,24155=>4037,24163=>4038,24149=>4039,24151=>4040,24148=>4041,24275=>4042,24278=>4043,24330=>4044,24390=>4045,24432=>4046,24505=>4047,24903=>4048,24895=>4049,24907=>4050,24951=>4051,24930=>4052,24931=>4053,24927=>4054,24922=>4055,24920=>4056,24949=>4057,25130=>4058,25735=>4059,25688=>4060,25684=>4061,25764=>4062,25720=>4063,25695=>4064,25722=>4065,25681=>4066,25703=>4067,25652=>4068,25709=>4069,25723=>4070,25970=>4071,26017=>4072,26071=>4073,26070=>4074,26274=>4075,26280=>4076,26269=>4077,27036=>4078,27048=>4079,27029=>4080,27073=>4081,27054=>4082,27091=>4083,27083=>4084,27035=>4085,27063=>4086,27067=>4087,27051=>4088,27060=>4089,27088=>4090,27085=>4091,27053=>4092,27084=>4093,27046=>4094,27075=>4095,27043=>4096,27465=>4097,27468=>4098,27699=>4099,28467=>4100,28436=>4101,28414=>4102,28435=>4103,28404=>4104,28457=>4105,28478=>4106,28448=>4107,28460=>4108,28431=>4109,28418=>4110,28450=>4111,28415=>4112,28399=>4113,28422=>4114,28465=>4115,28472=>4116,28466=>4117,28451=>4118,28437=>4119,28459=>4120,28463=>4121,28552=>4122,28458=>4123,28396=>4124,28417=>4125,28402=>4126,28364=>4127,28407=>4128,29076=>4129,29081=>4130,29053=>4131,29066=>4132,29060=>4133,29074=>4134,29246=>4135,29330=>4136,29334=>4137,29508=>4138,29520=>4139,29796=>4140,29795=>4141,29802=>4142,29808=>4143,29805=>4144,29956=>4145,30097=>4146,30247=>4147,30221=>4148,30219=>4149,30217=>4150,30227=>4151,30433=>4152,30435=>4153,30596=>4154,30589=>4155,30591=>4156,30561=>4157,30913=>4158,30879=>4159,30887=>4160,30899=>4161,30889=>4162,30883=>4163,31118=>4164,31119=>4165,31117=>4166,31278=>4167,31281=>4168,31402=>4169,31401=>4170,31469=>4171,31471=>4172,31649=>4173,31637=>4174,31627=>4175,31605=>4176,31639=>4177,31645=>4178,31636=>4179,31631=>4180,31672=>4181,58170=>4181,31623=>4182,31620=>4183,31929=>4184,31933=>4185,31934=>4186,32187=>4187,32176=>4188,32156=>4189,32189=>4190,32190=>4191,32160=>4192,32202=>4193,32180=>4194,32178=>4195,32177=>4196,32186=>4197,32162=>4198,32191=>4199,32181=>4200,32184=>4201,32173=>4202,32210=>4203,58202=>4203,32199=>4204,32172=>4205,32624=>4206,32736=>4207,32737=>4208,32735=>4209,32862=>4210,32858=>4211,32903=>4212,33104=>4213,33152=>4214,33167=>4215,33160=>4216,33162=>4217,33151=>4218,33154=>4219,33255=>4220,33274=>4221,33287=>4222,33300=>4223,33310=>4224,33355=>4225,33993=>4226,33983=>4227,33990=>4228,33988=>4229,33945=>4230,33950=>4231,33970=>4232,33948=>4233,33995=>4234,33976=>4235,33984=>4236,34003=>4237,33936=>4238,33980=>4239,34001=>4240,33994=>4241,34623=>4242,34588=>4243,34619=>4244,34594=>4245,34597=>4246,34612=>4247,34584=>4248,34645=>4249,34615=>4250,34601=>4251,35059=>4252,35074=>4253,35060=>4254,35065=>4255,35064=>4256,35069=>4257,35048=>4258,35098=>4259,35055=>4260,35494=>4261,35468=>4262,35486=>4263,35491=>4264,35469=>4265,35489=>4266,35475=>4267,35492=>4268,35498=>4269,35493=>4270,35496=>4271,35480=>4272,35473=>4273,35482=>4274,35495=>4275,35946=>4276,35981=>4277,35980=>4278,36051=>4279,36049=>4280,36050=>4281,36203=>4282,36249=>4283,36245=>4284,36348=>4285,36628=>4286,36626=>4287,36629=>4288,36627=>4289,36771=>4290,36960=>4291,36952=>4292,36956=>4293,36963=>4294,36953=>4295,36958=>4296,36962=>4297,36957=>4298,36955=>4299,37145=>4300,37144=>4301,37150=>4302,37237=>4303,37240=>4304,37239=>4305,37236=>4306,37496=>4307,37548=>4308,37504=>4309,37509=>4310,37528=>4311,37526=>4312,37499=>4313,37523=>4314,37532=>4315,37544=>4316,37500=>4317,37521=>4318,38305=>4319,38312=>4320,38313=>4321,38307=>4322,38309=>4323,38308=>4324,38553=>4325,38556=>4326,38555=>4327,38604=>4328,38610=>4329,38656=>4330,38780=>4331,38789=>4332,38902=>4333,38935=>4334,38936=>4335,39087=>4336,39089=>4337,39171=>4338,39173=>4339,39180=>4340,39177=>4341,39361=>4342,39599=>4343,39600=>4344,39654=>4345,39745=>4346,39746=>4347,40180=>4348,40182=>4349,40179=>4350,40636=>4351,40763=>4352,12240=>4352,40778=>4353,12241=>4353,20740=>4354,20736=>4355,20731=>4356,20725=>4357,20729=>4358,20738=>4359,20744=>4360,20745=>4361,20741=>4362,20956=>4363,21127=>4364,21128=>4365,21129=>4366,21133=>4367,21130=>4368,21232=>4369,21426=>4370,22062=>4371,22075=>4372,22073=>4373,22066=>4374,22079=>4375,22068=>4376,22057=>4377,22099=>4378,22094=>4379,22103=>4380,22132=>4381,22070=>4382,22063=>4383,22064=>4384,22656=>4385,22687=>4386,22686=>4387,22707=>4388,22684=>4389,22702=>4390,22697=>4391,22694=>4392,22893=>4393,23305=>4394,23291=>4395,23307=>4396,23285=>4397,23308=>4398,23304=>4399,23534=>4400,23532=>4401,23529=>4402,23531=>4403,23652=>4404,23653=>4405,23965=>4406,23956=>4407,24162=>4408,24159=>4409,24161=>4410,24290=>4411,24282=>4412,24287=>4413,24285=>4414,24291=>4415,24288=>4416,24392=>4417,24433=>4418,24503=>4419,24501=>4420,24950=>4421,24935=>4422,24942=>4423,24925=>4424,24917=>4425,24962=>4426,24956=>4427,24944=>4428,24939=>4429,24958=>4430,24999=>4431,24976=>4432,25003=>4433,24974=>4434,25004=>4435,24986=>4436,24996=>4437,24980=>4438,25006=>4439,25134=>4440,25705=>4441,25711=>4442,25721=>4443,25758=>4444,25778=>4445,25736=>4446,25744=>4447,57745=>4447,25776=>4448,25765=>4449,25747=>4450,25749=>4451,25769=>4452,25746=>4453,25774=>4454,25773=>4455,25771=>4456,25754=>4457,25772=>4458,25753=>4459,25762=>4460,25779=>4461,25973=>4462,25975=>4463,25976=>4464,26286=>4465,26283=>4466,26292=>4467,26289=>4468,27171=>4469,27167=>4470,27112=>4471,27137=>4472,27166=>4473,27161=>4474,27133=>4475,27169=>4476,27155=>4477,27146=>4478,27123=>4479,27138=>4480,27141=>4481,27117=>4482,27153=>4483,27472=>4484,27470=>4485,27556=>4486,27589=>4487,27590=>4488,28479=>4489,28540=>4490,28548=>4491,28497=>4492,28518=>4493,28500=>4494,28550=>4495,28525=>4496,28507=>4497,28536=>4498,28526=>4499,28558=>4500,28538=>4501,28528=>4502,28516=>4503,28567=>4504,28504=>4505,28373=>4506,28527=>4507,28512=>4508,28511=>4509,29087=>4510,29100=>4511,29105=>4512,29096=>4513,29270=>4514,29339=>4515,29518=>4516,29527=>4517,29801=>4518,29835=>4519,29827=>4520,29822=>4521,29824=>4522,30079=>4523,30240=>4524,30249=>4525,30239=>4526,30244=>4527,30246=>4528,30241=>4529,30242=>4530,30362=>4531,30394=>4532,30436=>4533,30606=>4534,30599=>4535,30604=>4536,30609=>4537,30603=>4538,30923=>4539,30917=>4540,30906=>4541,30922=>4542,30910=>4543,30933=>4544,30908=>4545,30928=>4546,31295=>4547,31292=>4548,31296=>4549,31293=>4550,31287=>4551,31291=>4552,31407=>4553,31406=>4554,31661=>4555,31665=>4556,31684=>4557,31668=>4558,31686=>4559,31687=>4560,31681=>4561,31648=>4562,31692=>4563,31946=>4564,32224=>4565,32244=>4566,32239=>4567,32251=>4568,32216=>4569,32236=>4570,32221=>4571,32232=>4572,32227=>4573,32218=>4574,32222=>4575,32233=>4576,32158=>4577,32217=>4578,32242=>4579,32249=>4580,32629=>4581,32631=>4582,32687=>4583,32745=>4584,32806=>4585,33179=>4586,33180=>4587,33181=>4588,33184=>4589,33178=>4590,33176=>4591,34071=>4592,34109=>4593,34074=>4594,34030=>4595,34092=>4596,34093=>4597,34067=>4598,34065=>4599,34083=>4600,34081=>4601,34068=>4602,34028=>4603,34085=>4604,34047=>4605,34054=>4606,34690=>4607,34676=>4608,34678=>4609,34656=>4610,34662=>4611,34680=>4612,34664=>4613,34649=>4614,34647=>4615,34636=>4616,34643=>4617,34907=>4618,34909=>4619,35088=>4620,35079=>4621,35090=>4622,35091=>4623,35093=>4624,35082=>4625,35516=>4626,35538=>4627,35527=>4628,35524=>4629,35477=>4630,35531=>4631,35576=>4632,35506=>4633,35529=>4634,35522=>4635,35519=>4636,35504=>4637,35542=>4638,35533=>4639,35510=>4640,35513=>4641,35547=>4642,35916=>4643,35918=>4644,35948=>4645,36064=>4646,36062=>4647,36070=>4648,36068=>4649,36076=>4650,36077=>4651,36066=>4652,36067=>4653,36060=>4654,36074=>4655,36065=>4656,36205=>4657,36255=>4658,36259=>4659,36395=>4660,36368=>4661,36381=>4662,36386=>4663,36367=>4664,36393=>4665,36383=>4666,36385=>4667,36382=>4668,36538=>4669,36637=>4670,36635=>4671,36639=>4672,36649=>4673,36646=>4674,36650=>4675,36636=>4676,36638=>4677,36645=>4678,36969=>4679,36974=>4680,36968=>4681,36973=>4682,36983=>4683,37168=>4684,37165=>4685,37159=>4686,37169=>4687,37255=>4688,37257=>4689,37259=>4690,37251=>4691,37573=>4692,37563=>4693,37559=>4694,37610=>4695,37604=>4696,37569=>4697,37555=>4698,37564=>4699,37586=>4700,37575=>4701,37616=>4702,37554=>4703,38317=>4704,38321=>4705,38660=>4706,38662=>4707,38663=>4708,38665=>4709,38752=>4710,38797=>4711,38795=>4712,38799=>4713,38945=>4714,38955=>4715,38940=>4716,39091=>4717,39178=>4718,39187=>4719,39186=>4720,39192=>4721,39389=>4722,39376=>4723,39391=>4724,39387=>4725,39377=>4726,39381=>4727,39378=>4728,39385=>4729,39607=>4730,39662=>4731,39663=>4732,39719=>4733,39749=>4734,39748=>4735,39799=>4736,39791=>4737,40198=>4738,40201=>4739,40195=>4740,40617=>4741,40638=>4742,40654=>4743,22696=>4744,12242=>4745,40786=>4745,20754=>4746,20760=>4747,20756=>4748,20752=>4749,20757=>4750,20864=>4751,20906=>4752,20957=>4753,21137=>4754,21139=>4755,21235=>4756,22105=>4757,22123=>4758,22137=>4759,22121=>4760,22116=>4761,22136=>4762,22122=>4763,22120=>4764,22117=>4765,22129=>4766,22127=>4767,22124=>4768,22114=>4769,22134=>4770,22721=>4771,22718=>4772,22727=>4773,22725=>4774,22894=>4775,23325=>4776,23348=>4777,23416=>4778,23536=>4779,23566=>4780,24394=>4781,25010=>4782,24977=>4783,25001=>4784,24970=>4785,25037=>4786,25014=>4787,25022=>4788,25034=>4789,25032=>4790,25136=>4791,25797=>4792,25793=>4793,25803=>4794,25787=>4795,25788=>4796,25818=>4797,25796=>4798,25799=>4799,25794=>4800,25805=>4801,25791=>4802,25810=>4803,25812=>4804,25790=>4805,25972=>4806,26310=>4807,26313=>4808,26297=>4809,26308=>4810,26311=>4811,26296=>4812,27197=>4813,27192=>4814,27194=>4815,27225=>4816,27243=>4817,27224=>4818,27193=>4819,27204=>4820,27234=>4821,27233=>4822,27211=>4823,27207=>4824,27189=>4825,27231=>4826,27208=>4827,27481=>4828,27511=>4829,27653=>4830,28610=>4831,28593=>4832,28577=>4833,28611=>4834,28580=>4835,28609=>4836,28583=>4837,28595=>4838,28608=>4839,28601=>4840,28598=>4841,60318=>4841,28582=>4842,28576=>4843,28596=>4844,29118=>4845,29129=>4846,29136=>4847,29138=>4848,29128=>4849,29141=>4850,29113=>4851,29134=>4852,29145=>4853,29148=>4854,29123=>4855,29124=>4856,29544=>4857,29852=>4858,29859=>4859,29848=>4860,29855=>4861,29854=>4862,29922=>4863,29964=>4864,29965=>4865,30260=>4866,30264=>4867,30266=>4868,30439=>4869,30437=>4870,30624=>4871,30622=>4872,30623=>4873,30629=>4874,30952=>4875,30938=>4876,30956=>4877,30951=>4878,31142=>4879,31309=>4880,31310=>4881,31302=>4882,31308=>4883,31307=>4884,31418=>4885,31705=>4886,31761=>4887,31689=>4888,31716=>4889,31707=>4890,31713=>4891,31721=>4892,31718=>4893,31957=>4894,31958=>4895,32266=>4896,32273=>4897,32264=>4898,32283=>4899,32291=>4900,32286=>4901,32285=>4902,58211=>4902,32265=>4903,32272=>4904,32633=>4905,32690=>4906,32752=>4907,32753=>4908,32750=>4909,32808=>4910,58239=>4910,33203=>4911,33193=>4912,33192=>4913,33275=>4914,33288=>4915,33368=>4916,33369=>4917,34122=>4918,34137=>4919,34120=>4920,34152=>4921,34153=>4922,34115=>4923,34121=>4924,34157=>4925,34154=>4926,34142=>4927,34691=>4928,34719=>4929,34718=>4930,34722=>4931,34701=>4932,34913=>4933,35114=>4934,35122=>4935,35109=>4936,35115=>4937,35105=>4938,35242=>4939,35238=>4940,58391=>4940,35558=>4941,35578=>4942,35563=>4943,35569=>4944,35584=>4945,35548=>4946,35559=>4947,35566=>4948,35582=>4949,35585=>4950,35586=>4951,35575=>4952,35565=>4953,35571=>4954,35574=>4955,35580=>4956,35947=>4957,35949=>4958,35987=>4959,36084=>4960,36420=>4961,36401=>4962,36404=>4963,36418=>4964,36409=>4965,36405=>4966,36667=>4967,36655=>4968,36664=>4969,36659=>4970,36776=>4971,36774=>4972,36981=>4973,36980=>4974,36984=>4975,36978=>4976,36988=>4977,36986=>4978,37172=>4979,37266=>4980,37664=>4981,37686=>4982,37624=>4983,37683=>4984,37679=>4985,37666=>4986,37628=>4987,37675=>4988,37636=>4989,37658=>4990,37648=>4991,37670=>4992,37665=>4993,37653=>4994,37678=>4995,37657=>4996,38331=>4997,38567=>4998,38568=>4999,38570=>5000,38613=>5001,38670=>5002,38673=>5003,38678=>5004,38669=>5005,38675=>5006,38671=>5007,38747=>5008,58565=>5009,38748=>5009,38758=>5010,38808=>5011,38960=>5012,38968=>5013,38971=>5014,38967=>5015,38957=>5016,38969=>5017,38948=>5018,39184=>5019,39208=>5020,39198=>5021,39195=>5022,39201=>5023,39194=>5024,39405=>5025,39394=>5026,39409=>5027,39608=>5028,39612=>5029,39675=>5030,39661=>5031,39720=>5032,39825=>5033,40213=>5034,40227=>5035,40230=>5036,40232=>5037,40210=>5038,40219=>5039,40664=>5040,40660=>5041,40845=>5042,12243=>5042,40860=>5043,12244=>5043,20778=>5044,20767=>5045,20769=>5046,20786=>5047,21237=>5048,22158=>5049,22144=>5050,22160=>5051,22149=>5052,22151=>5053,22159=>5054,22741=>5055,22739=>5056,22737=>5057,22734=>5058,23344=>5059,23338=>5060,23332=>5061,23418=>5062,23607=>5063,23656=>5064,23996=>5065,23994=>5066,23997=>5067,23992=>5068,24171=>5069,24396=>5070,24509=>5071,25033=>5072,25026=>5073,25031=>5074,25062=>5075,25035=>5076,25138=>5077,25140=>5078,25806=>5079,25802=>5080,25816=>5081,25824=>5082,25840=>5083,25830=>5084,25836=>5085,25841=>5086,25826=>5087,25837=>5088,25986=>5089,25987=>5090,26329=>5091,26326=>5092,27264=>5093,27284=>5094,27268=>5095,27298=>5096,27292=>5097,27355=>5098,27299=>5099,27262=>5100,27287=>5101,27280=>5102,27296=>5103,27484=>5104,27566=>5105,27610=>5106,27656=>5107,28632=>5108,28657=>5109,28639=>5110,28640=>5111,28635=>5112,28644=>5113,28651=>5114,28655=>5115,28544=>5116,28652=>5117,28641=>5118,28649=>5119,28629=>5120,28654=>5121,28656=>5122,29159=>5123,29151=>5124,60361=>5124,29166=>5125,29158=>5126,29157=>5127,29165=>5128,29164=>5129,29172=>5130,29152=>5131,29237=>5132,29254=>5133,29552=>5134,29554=>5135,29865=>5136,29872=>5137,29862=>5138,29864=>5139,30278=>5140,30274=>5141,30284=>5142,30442=>5143,30643=>5144,30634=>5145,30640=>5146,30636=>5147,30631=>5148,30637=>5149,30703=>5150,30967=>5151,30970=>5152,30964=>5153,30959=>5154,30977=>5155,31143=>5156,31146=>5157,31319=>5158,31423=>5159,31751=>5160,31757=>5161,31742=>5162,31735=>5163,31756=>5164,31712=>5165,31968=>5166,31964=>5167,31966=>5168,31970=>5169,31967=>5170,31961=>5171,31965=>5172,32302=>5173,32318=>5174,32326=>5175,32311=>5176,32306=>5177,32323=>5178,32299=>5179,32317=>5180,32305=>5181,32325=>5182,32321=>5183,32308=>5184,32313=>5185,32328=>5186,32309=>5187,32319=>5188,32303=>5189,32580=>5190,32755=>5191,32764=>5192,32881=>5193,32882=>5194,32880=>5195,32879=>5196,32883=>5197,33222=>5198,33219=>5199,33210=>5200,33218=>5201,33216=>5202,33215=>5203,33213=>5204,33225=>5205,33214=>5206,33256=>5207,33289=>5208,33393=>5209,34218=>5210,34180=>5211,34174=>5212,34204=>5213,34193=>5214,34196=>5215,34223=>5216,34203=>5217,34183=>5218,34216=>5219,34186=>5220,34214=>5221,34407=>5222,34752=>5223,34769=>5224,34739=>5225,34770=>5226,34758=>5227,34731=>5228,34747=>5229,34746=>5230,34760=>5231,34763=>5232,35131=>5233,35126=>5234,35140=>5235,35128=>5236,35133=>5237,35244=>5238,35598=>5239,35607=>5240,35609=>5241,35611=>5242,35594=>5243,35616=>5244,35613=>5245,35588=>5246,35600=>5247,35905=>5248,35903=>5249,35955=>5250,36090=>5251,36093=>5252,36092=>5253,36088=>5254,36091=>5255,36264=>5256,36425=>5257,36427=>5258,36424=>5259,36426=>5260,36676=>5261,36670=>5262,36674=>5263,36677=>5264,36671=>5265,36991=>5266,36989=>5267,36996=>5268,36993=>5269,36994=>5270,36992=>5271,37177=>5272,37283=>5273,37278=>5274,37276=>5275,37709=>5276,37762=>5277,37672=>5278,37749=>5279,37706=>5280,37733=>5281,37707=>5282,37656=>5283,37758=>5284,37740=>5285,37723=>5286,37744=>5287,37722=>5288,37716=>5289,38346=>5290,38347=>5291,38348=>5292,38344=>5293,38342=>5294,38577=>5295,38584=>5296,38614=>5297,38684=>5298,38686=>5299,38816=>5300,38867=>5301,38982=>5302,39094=>5303,39221=>5304,39425=>5305,39423=>5306,39854=>5307,39851=>5308,39850=>5309,39853=>5310,40251=>5311,40255=>5312,40587=>5313,40655=>5314,40670=>5315,40668=>5316,40669=>5317,40667=>5318,40766=>5319,40779=>5320,21474=>5321,22165=>5322,22190=>5323,22745=>5324,22744=>5325,23352=>5326,24413=>5327,25059=>5328,25139=>5329,25844=>5330,25842=>5331,25854=>5332,25862=>5333,25850=>5334,25851=>5335,25847=>5336,26039=>5337,26332=>5338,26406=>5339,27315=>5340,27308=>5341,27331=>5342,27323=>5343,27320=>5344,27330=>5345,27310=>5346,27311=>5347,27487=>5348,27512=>5349,27567=>5350,28681=>5351,28683=>5352,28670=>5353,28678=>5354,28666=>5355,28689=>5356,28687=>5357,29179=>5358,29180=>5359,29182=>5360,29176=>5361,29559=>5362,29557=>5363,29863=>5364,29887=>5365,29973=>5366,30294=>5367,30296=>5368,30290=>5369,30653=>5370,30655=>5371,30651=>5372,30652=>5373,30990=>5374,31150=>5375,31329=>5376,31330=>5377,31328=>5378,31428=>5379,31429=>5380,31787=>5381,31783=>5382,31786=>5383,31774=>5384,31779=>5385,31777=>5386,31975=>5387,32340=>5388,32341=>5389,32350=>5390,32346=>5391,32353=>5392,32338=>5393,32345=>5394,32584=>5395,32761=>5396,32763=>5397,32887=>5398,32886=>5399,33229=>5400,33231=>5401,33290=>5402,34255=>5403,34217=>5404,34253=>5405,34256=>5406,34249=>5407,34224=>5408,34234=>5409,34233=>5410,34799=>5411,34796=>5412,34802=>5413,34784=>5414,35206=>5415,35250=>5416,35316=>5417,35624=>5418,35641=>5419,35628=>5420,35627=>5421,35920=>5422,36101=>5423,36441=>5424,36451=>5425,36454=>5426,36452=>5427,36447=>5428,36437=>5429,36544=>5430,36681=>5431,36685=>5432,36999=>5433,36995=>5434,37000=>5435,37291=>5436,37292=>5437,37328=>5438,37780=>5439,37770=>5440,37782=>5441,37794=>5442,37811=>5443,37806=>5444,37804=>5445,37808=>5446,37784=>5447,37786=>5448,37783=>5449,38356=>5450,38358=>5451,38352=>5452,38357=>5453,38626=>5454,38620=>5455,38617=>5456,38619=>5457,38622=>5458,38692=>5459,38819=>5460,38822=>5461,38829=>5462,38905=>5463,38989=>5464,38991=>5465,38988=>5466,38990=>5467,38995=>5468,39098=>5469,39230=>5470,39231=>5471,39229=>5472,39214=>5473,39333=>5474,39438=>5475,39617=>5476,39683=>5477,39686=>5478,39759=>5479,39758=>5480,39757=>5481,39882=>5482,39881=>5483,39933=>5484,39880=>5485,39872=>5486,40273=>5487,40285=>5488,40288=>5489,40672=>5490,40725=>5491,40748=>5492,20787=>5493,22181=>5494,22184=>5495,22750=>5496,22751=>5497,22754=>5498,23541=>5499,40848=>5500,24300=>5501,25074=>5502,25079=>5503,25078=>5504,25077=>5505,25856=>5506,25871=>5507,26336=>5508,26333=>5509,27365=>5510,27357=>5511,27354=>5512,27347=>5513,28699=>5514,28703=>5515,28712=>5516,28698=>5517,28701=>5518,28693=>5519,28696=>5520,29190=>5521,29197=>5522,29272=>5523,29346=>5524,29560=>5525,29562=>5526,29885=>5527,29898=>5528,29923=>5529,30087=>5530,30086=>5531,30303=>5532,30305=>5533,30663=>5534,31001=>5535,31153=>5536,31339=>5537,31337=>5538,31806=>5539,31807=>5540,31800=>5541,31805=>5542,31799=>5543,31808=>5544,32363=>5545,32365=>5546,32377=>5547,32361=>5548,32362=>5549,32371=>5550,32645=>5551,32694=>5552,32697=>5553,32696=>5554,33240=>5555,34281=>5556,34269=>5557,34282=>5558,34261=>5559,34276=>5560,34277=>5561,34295=>5562,34811=>5563,34821=>5564,34829=>5565,34809=>5566,34814=>5567,35168=>5568,35167=>5569,35158=>5570,35166=>5571,35649=>5572,35676=>5573,35672=>5574,35657=>5575,35674=>5576,35662=>5577,35663=>5578,35654=>5579,35673=>5580,36104=>5581,36106=>5582,36476=>5583,36466=>5584,36487=>5585,36470=>5586,36460=>5587,36474=>5588,36468=>5589,36692=>5590,36686=>5591,36781=>5592,37002=>5593,37003=>5594,37297=>5595,37294=>5596,37857=>5597,37841=>5598,37855=>5599,37827=>5600,37832=>5601,37852=>5602,37853=>5603,37846=>5604,37858=>5605,37837=>5606,37848=>5607,37860=>5608,37847=>5609,37864=>5610,38364=>5611,38580=>5612,38627=>5613,38698=>5614,38695=>5615,38753=>5616,38876=>5617,38907=>5618,39006=>5619,39000=>5620,39003=>5621,39100=>5622,39237=>5623,39241=>5624,39446=>5625,39449=>5626,39693=>5627,39912=>5628,39911=>5629,39894=>5630,39899=>5631,40329=>5632,40289=>5633,40306=>5634,40298=>5635,40300=>5636,40594=>5637,40599=>5638,40595=>5639,40628=>5640,21240=>5641,22199=>5642,22198=>5643,22196=>5644,22204=>5645,22756=>5646,23360=>5647,23363=>5648,23421=>5649,23542=>5650,24009=>5651,25080=>5652,25082=>5653,25880=>5654,25876=>5655,25881=>5656,26342=>5657,26407=>5658,27372=>5659,28734=>5660,28720=>5661,28722=>5662,29200=>5663,29563=>5664,29903=>5665,30306=>5666,30309=>5667,31014=>5668,31018=>5669,31020=>5670,31019=>5671,31431=>5672,31478=>5673,31820=>5674,31811=>5675,31821=>5676,31983=>5677,31984=>5678,36782=>5679,32381=>5680,32380=>5681,32386=>5682,32588=>5683,32768=>5684,33242=>5685,33382=>5686,34299=>5687,34297=>5688,34321=>5689,34298=>5690,34310=>5691,34315=>5692,34311=>5693,34314=>5694,34836=>5695,34837=>5696,35172=>5697,35258=>5698,35320=>5699,35696=>5700,35692=>5701,35686=>5702,35695=>5703,35679=>5704,35691=>5705,36111=>5706,36109=>5707,36489=>5708,36481=>5709,36485=>5710,36482=>5711,37300=>5712,37323=>5713,37912=>5714,37891=>5715,37885=>5716,38369=>5717,38704=>5718,39108=>5719,39250=>5720,39249=>5721,39336=>5722,39467=>5723,39472=>5724,39479=>5725,39477=>5726,39955=>5727,39949=>5728,40569=>5729,40629=>5730,40680=>5731,40751=>5732,40799=>5733,40803=>5734,40801=>5735,20791=>5736,20792=>5737,22209=>5738,22208=>5739,22210=>5740,22804=>5741,23660=>5742,24013=>5743,25084=>5744,25086=>5745,25885=>5746,25884=>5747,26005=>5748,26345=>5749,27387=>5750,27396=>5751,27386=>5752,27570=>5753,28748=>5754,29211=>5755,29351=>5756,29910=>5757,29908=>5758,30313=>5759,30675=>5760,31824=>5761,32399=>5762,32396=>5763,32700=>5764,34327=>5765,34349=>5766,34330=>5767,34851=>5768,34850=>5769,34849=>5770,34847=>5771,35178=>5772,35180=>5773,35261=>5774,35700=>5775,35703=>5776,35709=>5777,36115=>5778,36490=>5779,36493=>5780,36491=>5781,36703=>5782,36783=>5783,37306=>5784,37934=>5785,37939=>5786,37941=>5787,37946=>5788,37944=>5789,37938=>5790,37931=>5791,38370=>5792,38712=>5793,38713=>5794,38706=>5795,38911=>5796,58586=>5796,39015=>5797,39013=>5798,39255=>5799,39493=>5800,39491=>5801,39488=>5802,39486=>5803,39631=>5804,39764=>5805,39761=>5806,39981=>5807,39973=>5808,40367=>5809,40372=>5810,40386=>5811,40376=>5812,40605=>5813,40687=>5814,40729=>5815,40796=>5816,40806=>5817,40807=>5818,20796=>5819,20795=>5820,22216=>5821,22218=>5822,22217=>5823,23423=>5824,24020=>5825,24018=>5826,24398=>5827,25087=>5828,25892=>5829,27402=>5830,27489=>5831,28753=>5832,28760=>5833,29568=>5834,29924=>5835,30090=>5836,30318=>5837,30316=>5838,31155=>5839,31840=>5840,31839=>5841,32894=>5842,32893=>5843,33247=>5844,35186=>5845,35183=>5846,35324=>5847,35712=>5848,36118=>5849,36119=>5850,36497=>5851,36499=>5852,36705=>5853,37192=>5854,37956=>5855,37969=>5856,37970=>5857,38717=>5858,38718=>5859,38851=>5860,38849=>5861,39019=>5862,39253=>5863,39509=>5864,39501=>5865,39634=>5866,39706=>5867,40009=>5868,39985=>5869,39998=>5870,39995=>5871,40403=>5872,40407=>5873,40756=>5874,40812=>5875,40810=>5876,40852=>5877,22220=>5878,24022=>5879,25088=>5880,25891=>5881,25899=>5882,25898=>5883,26348=>5884,27408=>5885,29914=>5886,31434=>5887,31844=>5888,31843=>5889,31845=>5890,32403=>5891,32406=>5892,32404=>5893,33250=>5894,34360=>5895,34367=>5896,34865=>5897,35722=>5898,37008=>5899,37007=>5900,37987=>5901,37984=>5902,37988=>5903,38760=>5904,39023=>5905,39260=>5906,39514=>5907,39515=>5908,39511=>5909,39635=>5910,39636=>5911,39633=>5912,40020=>5913,40023=>5914,40022=>5915,40421=>5916,40607=>5917,40692=>5918,22225=>5919,22761=>5920,25900=>5921,28766=>5922,30321=>5923,30322=>5924,30679=>5925,60226=>5925,32592=>5926,32648=>5927,34870=>5928,34873=>5929,34914=>5930,35731=>5931,35730=>5932,35734=>5933,33399=>5934,36123=>5935,37312=>5936,37994=>5937,38722=>5938,38728=>5939,38724=>5940,38854=>5941,39024=>5942,39519=>5943,39714=>5944,39768=>5945,40031=>5946,40441=>5947,40442=>5948,40572=>5949,40573=>5950,40711=>5951,40823=>5952,40818=>5953,24307=>5954,27414=>5955,28771=>5956,31852=>5957,31854=>5958,34875=>5959,35264=>5960,36513=>5961,37313=>5962,38002=>5963,38000=>5964,39025=>5965,39262=>5966,39638=>5967,39715=>5968,40652=>5969,28772=>5970,30682=>5971,35738=>5972,38007=>5973,38857=>5974,39522=>5975,39525=>5976,32412=>5977,35740=>5978,36522=>5979,37317=>5980,38013=>5981,38014=>5982,38012=>5983,40055=>5984,40056=>5985,40695=>5986,35924=>5987,38015=>5988,40474=>5989,29224=>5990,39530=>5991,39729=>5992,40475=>5993,40478=>5994,31858=>5995,20034=>5996,20060=>5997,12048=>5998,20981=>5998,12053=>5999,21274=>5999,12058=>6000,21378=>6000,19975=>6001,19980=>6002,20039=>6003,20109=>6004,12062=>6005,22231=>6005,12076=>6006,23662=>6006,12091=>6007,24435=>6007,19983=>6008,20871=>6009,19982=>6010,20014=>6011,20115=>6012,20162=>6013,20169=>6014,20168=>6015,20888=>6016,21244=>6017,21356=>6018,21433=>6019,22304=>6020,22787=>6021,22828=>6022,23568=>6023,60417=>6023,24063=>6024,26081=>6025,12110=>6026,27571=>6026,27596=>6027,12115=>6028,27668=>6028,12121=>6029,29247=>6029,20017=>6030,20028=>6031,20200=>6032,20188=>6033,20201=>6034,20193=>6035,20189=>6036,20186=>6037,21004=>6038,21001=>6039,21276=>6040,21324=>6041,22306=>6042,22307=>6043,22807=>6044,22831=>6045,23425=>6046,23428=>6047,23570=>6048,23611=>6049,23668=>6050,23667=>6051,24068=>6052,24192=>6053,24194=>6054,24521=>6055,25097=>6056,25168=>6057,27669=>6058,27702=>6059,27715=>6060,27711=>6061,27707=>6062,29358=>6063,29360=>6064,29578=>6065,12145=>6066,31160=>6066,32906=>6067,38430=>6068,20238=>6069,20248=>6070,20268=>6071,20213=>6072,20244=>6073,20209=>6074,20224=>6075,20215=>6076,20232=>6077,20253=>6078,20226=>6079,20229=>6080,20258=>6081,20243=>6082,20228=>6083,20212=>6084,20242=>6085,20913=>6086,21011=>6087,21008=>6088,21158=>6089,21282=>6090,21279=>6091,21325=>6092,21386=>6093,21511=>6094,22241=>6095,22239=>6096,22318=>6097,22314=>6098,22324=>6099,22844=>6100,22912=>6101,22908=>6102,22917=>6103,22907=>6104,22910=>6105,22903=>6106,22911=>6107,23382=>6108,23573=>6109,23589=>6110,23676=>6111,23674=>6112,23675=>6113,23678=>6114,24031=>6115,24181=>6116,57646=>6116,24196=>6117,24322=>6118,24346=>6119,24436=>6120,24533=>6121,24532=>6122,24527=>6123,25180=>6124,25182=>6125,25188=>6126,25185=>6127,25190=>6128,25186=>6129,25177=>6130,25184=>6131,25178=>6132,25189=>6133,25911=>6134,26095=>6135,26094=>6136,26430=>6137,26425=>6138,26424=>6139,26427=>6140,26426=>6141,26431=>6142,26428=>6143,26419=>6144,27672=>6145,27718=>6146,27730=>6147,27740=>6148,27727=>6149,27722=>6150,60796=>6150,27732=>6151,27723=>6152,27724=>6153,28785=>6154,29278=>6155,29364=>6156,29365=>6157,29582=>6158,29994=>6159,30335=>6160,31349=>6161,12153=>6162,32593=>6162,12171=>6163,33400=>6163,33404=>6164,33408=>6165,33405=>6166,33407=>6167,12172=>6168,34381=>6168,12177=>6169,35198=>6169,37017=>6170,59347=>6171,37015=>6171,37016=>6172,37019=>6173,37012=>6174,38434=>6175,38436=>6176,38432=>6177,38435=>6178,20310=>6179,20283=>6180,20322=>6181,20297=>6182,20307=>6183,20324=>6184,20286=>6185,20327=>6186,20306=>6187,20319=>6188,20289=>6189,20312=>6190,20269=>6191,20275=>6192,20287=>6193,20321=>6194,20879=>6195,20921=>6196,21020=>6197,21022=>6198,21025=>6199,21165=>6200,21166=>6201,21257=>6202,21347=>6203,21362=>6204,21390=>6205,21391=>6206,21552=>6207,21559=>6208,21546=>6209,21588=>6210,21573=>6211,21529=>6212,21532=>6213,21541=>6214,21528=>6215,21565=>6216,21583=>6217,21569=>6218,21544=>6219,21540=>6220,21575=>6221,22254=>6222,22247=>6223,22245=>6224,22337=>6225,22341=>6226,22348=>6227,22345=>6228,22347=>6229,22354=>6230,22790=>6231,22848=>6232,22950=>6233,22936=>6234,22944=>6235,22935=>6236,22926=>6237,22946=>6238,22928=>6239,22927=>6240,22951=>6241,22945=>6242,23438=>6243,23442=>6244,23592=>6245,23594=>6246,23693=>6247,23695=>6248,23688=>6249,23691=>6250,23689=>6251,23698=>6252,23690=>6253,23686=>6254,23699=>6255,23701=>6256,24032=>6257,24074=>6258,24078=>6259,24203=>6260,24201=>6261,24204=>6262,24200=>6263,24205=>6264,24325=>6265,24349=>6266,24440=>6267,24438=>6268,24530=>6269,24529=>6270,24528=>6271,24557=>6272,24552=>6273,24558=>6274,24563=>6275,24545=>6276,24548=>6277,24547=>6278,24570=>6279,24559=>6280,24567=>6281,24571=>6282,24576=>6283,24564=>6284,25146=>6285,25219=>6286,25228=>6287,25230=>6288,25231=>6289,25236=>6290,25223=>6291,25201=>6292,25211=>6293,25210=>6294,25200=>6295,25217=>6296,25224=>6297,25207=>6298,25213=>6299,25202=>6300,25204=>6301,26096=>6302,26100=>6303,26099=>6304,26098=>6305,26101=>6306,26437=>6307,26439=>6308,26457=>6309,26453=>6310,26444=>6311,26440=>6312,26461=>6313,26445=>6314,26458=>6315,26443=>6316,27600=>6317,27673=>6318,27674=>6319,27768=>6320,27751=>6321,27755=>6322,27780=>6323,27787=>6324,27791=>6325,27761=>6326,27759=>6327,27753=>6328,27802=>6329,27757=>6330,27783=>6331,27797=>6332,27804=>6333,57900=>6333,27750=>6334,27763=>6335,27749=>6336,27771=>6337,27790=>6338,28788=>6339,28794=>6340,29283=>6341,29375=>6342,29373=>6343,29379=>6344,29382=>6345,29377=>6346,29370=>6347,29381=>6348,29589=>6349,29591=>6350,29587=>6351,29588=>6352,29586=>6353,30010=>6354,30009=>6355,30100=>6356,30101=>6357,30337=>6358,31037=>6359,32820=>6360,32917=>6361,32921=>6362,32912=>6363,32914=>6364,32924=>6365,33424=>6366,33423=>6367,33413=>6368,33422=>6369,33425=>6370,33427=>6371,33418=>6372,33411=>6373,33412=>6374,12184=>6375,35960=>6375,36809=>6376,36799=>6377,37023=>6378,37025=>6379,37029=>6380,37022=>6381,37031=>6382,37024=>6383,38448=>6384,38440=>6385,38447=>6386,38445=>6387,20019=>6388,20376=>6389,20348=>6390,20357=>6391,20349=>6392,20352=>6393,20359=>6394,20342=>6395,20340=>6396,20361=>6397,20356=>6398,20343=>6399,20300=>6400,20375=>6401,20330=>6402,20378=>6403,20345=>6404,20353=>6405,20344=>6406,20368=>6407,20380=>6408,20372=>6409,20382=>6410,20370=>6411,20354=>6412,20373=>6413,20331=>6414,20334=>6415,20894=>6416,20924=>6417,20926=>6418,21045=>6419,21042=>6420,21043=>6421,21062=>6422,21041=>6423,21180=>6424,21258=>6425,21259=>6426,21308=>6427,21394=>6428,21396=>6429,21639=>6430,21631=>6431,21633=>6432,21649=>6433,21634=>6434,21640=>6435,21611=>6436,21626=>6437,21630=>6438,21605=>6439,21612=>6440,21620=>6441,21606=>6442,21645=>6443,21615=>6444,21601=>6445,21600=>6446,21656=>6447,21603=>6448,21607=>6449,21604=>6450,22263=>6451,22265=>6452,22383=>6453,22386=>6454,22381=>6455,22379=>6456,22385=>6457,22384=>6458,22390=>6459,22400=>6460,22389=>6461,22395=>6462,22387=>6463,22388=>6464,22370=>6465,22376=>6466,22397=>6467,22796=>6468,22853=>6469,22965=>6470,22970=>6471,22991=>6472,22990=>6473,22962=>6474,22988=>6475,22977=>6476,22966=>6477,22972=>6478,22979=>6479,22998=>6480,22961=>6481,22973=>6482,22976=>6483,22984=>6484,22964=>6485,22983=>6486,23394=>6487,23397=>6488,23443=>6489,23445=>6490,23620=>6491,23623=>6492,23726=>6493,23716=>6494,23712=>6495,23733=>6496,23727=>6497,23720=>6498,23724=>6499,23711=>6500,23715=>6501,23725=>6502,23714=>6503,23722=>6504,23719=>6505,23709=>6506,23717=>6507,23734=>6508,23728=>6509,23718=>6510,24087=>6511,24084=>6512,24089=>6513,24360=>6514,24354=>6515,24355=>6516,24356=>6517,24404=>6518,24450=>6519,24446=>6520,24445=>6521,24542=>6522,24549=>6523,24621=>6524,24614=>6525,24601=>6526,24626=>6527,24587=>6528,24628=>6529,24586=>6530,24599=>6531,24627=>6532,24602=>6533,24606=>6534,24620=>6535,24610=>6536,24589=>6537,24592=>6538,24622=>6539,24595=>6540,24593=>6541,24588=>6542,24585=>6543,24604=>6544,25108=>6545,25149=>6546,25261=>6547,25268=>6548,25297=>6549,25278=>6550,25258=>6551,25270=>6552,25290=>6553,25262=>6554,25267=>6555,25263=>6556,25275=>6557,25257=>6558,25264=>6559,25272=>6560,25917=>6561,26024=>6562,26043=>6563,26121=>6564,26108=>6565,26116=>6566,26130=>6567,26120=>6568,26107=>6569,26115=>6570,26123=>6571,26125=>6572,26117=>6573,26109=>6574,26129=>6575,26128=>6576,26358=>6577,26378=>6578,26501=>6579,26476=>6580,26510=>6581,26514=>6582,26486=>6583,26491=>6584,26520=>6585,26502=>6586,26500=>6587,26484=>6588,26509=>6589,26508=>6590,26490=>6591,26527=>6592,26513=>6593,26521=>6594,26499=>6595,26493=>6596,26497=>6597,26488=>6598,26489=>6599,26516=>6600,27429=>6601,27520=>6602,27518=>6603,27614=>6604,27677=>6605,27795=>6606,27884=>6607,27883=>6608,27886=>6609,27865=>6610,27830=>6611,27860=>6612,27821=>6613,27879=>6614,27831=>6615,27856=>6616,27842=>6617,27834=>6618,27843=>6619,27846=>6620,27885=>6621,27890=>6622,27858=>6623,27869=>6624,27828=>6625,27786=>6626,27805=>6627,27776=>6628,27870=>6629,27840=>6630,27952=>6631,27853=>6632,27847=>6633,27824=>6634,27897=>6635,27855=>6636,27881=>6637,27857=>6638,28820=>6639,28824=>6640,28805=>6641,28819=>6642,28806=>6643,28804=>6644,28817=>6645,28822=>6646,28802=>6647,28826=>6648,28803=>6649,29290=>6650,29398=>6651,29387=>6652,29400=>6653,29385=>6654,29404=>6655,29394=>6656,29396=>6657,29402=>6658,29388=>6659,29393=>6660,29604=>6661,29601=>6662,29613=>6663,29606=>6664,29602=>6665,29600=>6666,29612=>6667,29597=>6668,29917=>6669,29928=>6670,30015=>6671,30016=>6672,30014=>6673,30092=>6674,30104=>6675,30383=>6676,30451=>6677,30449=>6678,30448=>6679,30453=>6680,30712=>6681,30716=>6682,30713=>6683,30715=>6684,30714=>6685,30711=>6686,31042=>6687,31039=>6688,31173=>6689,31352=>6690,31355=>6691,31483=>6692,31861=>6693,31997=>6694,32821=>6695,32911=>6696,32942=>6697,32931=>6698,32952=>6699,32949=>6700,32941=>6701,33312=>6702,33440=>6703,33472=>6704,33451=>6705,33434=>6706,33432=>6707,33435=>6708,33461=>6709,33447=>6710,33454=>6711,33468=>6712,33438=>6713,33466=>6714,33460=>6715,33448=>6716,33441=>6717,33449=>6718,33474=>6719,33444=>6720,33475=>6721,33462=>6722,33442=>6723,34416=>6724,34415=>6725,34413=>6726,34414=>6727,35926=>6728,36818=>6729,36811=>6730,36819=>6731,36813=>6732,36822=>6733,36821=>6734,36823=>6735,37042=>6736,37044=>6737,37039=>6738,37043=>6739,37040=>6740,38457=>6741,38461=>6742,38460=>6743,38458=>6744,38467=>6745,20429=>6746,20421=>6747,20435=>6748,20402=>6749,20425=>6750,20427=>6751,20417=>6752,20436=>6753,20444=>6754,20441=>6755,20411=>6756,60346=>6756,20403=>6757,20443=>6758,20423=>6759,20438=>6760,20410=>6761,20416=>6762,20409=>6763,20460=>6764,21060=>6765,21065=>6766,21184=>6767,21186=>6768,21309=>6769,21372=>6770,21399=>6771,21398=>6772,21401=>6773,21400=>6774,21690=>6775,21665=>6776,21677=>6777,21669=>6778,21711=>6779,21699=>6780,33549=>6781,21687=>6782,21678=>6783,21718=>6784,21686=>6785,21701=>6786,21702=>6787,21664=>6788,21616=>6789,21692=>6790,21666=>6791,21694=>6792,21618=>6793,21726=>6794,21680=>6795,22453=>6796,22430=>6797,22431=>6798,22436=>6799,22412=>6800,22423=>6801,22429=>6802,22427=>6803,22420=>6804,22424=>6805,22415=>6806,22425=>6807,22437=>6808,22426=>6809,22421=>6810,22772=>6811,22797=>6812,22867=>6813,23009=>6814,23006=>6815,23022=>6816,23040=>6817,23025=>6818,23005=>6819,23034=>6820,23037=>6821,23036=>6822,23030=>6823,23012=>6824,23026=>6825,23031=>6826,23003=>6827,23017=>6828,23027=>6829,23029=>6830,23008=>6831,23038=>6832,23028=>6833,23021=>6834,23464=>6835,23628=>6836,23760=>6837,23768=>6838,23756=>6839,23767=>6840,23755=>6841,23771=>6842,23774=>6843,23770=>6844,23753=>6845,23751=>6846,23754=>6847,23766=>6848,23763=>6849,23764=>6850,23759=>6851,23752=>6852,23750=>6853,23758=>6854,23775=>6855,23800=>6856,24057=>6857,24097=>6858,24098=>6859,24099=>6860,24096=>6861,24100=>6862,24240=>6863,24228=>6864,24226=>6865,24219=>6866,24227=>6867,24229=>6868,24327=>6869,24366=>6870,24406=>6871,24454=>6872,24631=>6873,24633=>6874,24660=>6875,24690=>6876,24670=>6877,24645=>6878,24659=>6879,24647=>6880,24649=>6881,24667=>6882,24652=>6883,24640=>6884,24642=>6885,24671=>6886,24612=>6887,24644=>6888,24664=>6889,24678=>6890,24686=>6891,25154=>6892,25155=>6893,25295=>6894,25357=>6895,25355=>6896,25333=>6897,25358=>6898,25347=>6899,25323=>6900,25337=>6901,25359=>6902,25356=>6903,25336=>6904,25334=>6905,25344=>6906,25363=>6907,25364=>6908,25338=>6909,25365=>6910,25339=>6911,25328=>6912,25921=>6913,25923=>6914,26026=>6915,26047=>6916,26166=>6917,26145=>6918,26162=>6919,26165=>6920,26140=>6921,26150=>6922,26146=>6923,26163=>6924,26155=>6925,26170=>6926,26141=>6927,26164=>6928,26169=>6929,26158=>6930,26383=>6931,26384=>6932,26561=>6933,26610=>6934,26568=>6935,26554=>6936,26588=>6937,26555=>6938,26616=>6939,26584=>6940,26560=>6941,26551=>6942,26565=>6943,26603=>6944,26596=>6945,26591=>6946,26549=>6947,26573=>6948,26547=>6949,26615=>6950,26614=>6951,26606=>6952,26595=>6953,26562=>6954,26553=>6955,26574=>6956,26599=>6957,26608=>6958,26546=>6959,26620=>6960,26566=>6961,26605=>6962,26572=>6963,26542=>6964,26598=>6965,26587=>6966,26618=>6967,26569=>6968,26570=>6969,26563=>6970,26602=>6971,26571=>6972,27432=>6973,27522=>6974,27524=>6975,27574=>6976,27606=>6977,27608=>6978,27616=>6979,27680=>6980,27681=>6981,27944=>6982,27956=>6983,27949=>6984,27935=>6985,27964=>6986,27967=>6987,27922=>6988,27914=>6989,27866=>6990,27955=>6991,27908=>6992,27929=>6993,27962=>6994,27930=>6995,27921=>6996,27904=>6997,27933=>6998,27970=>6999,27905=>7000,27928=>7001,27959=>7002,27907=>7003,27919=>7004,27968=>7005,27911=>7006,27936=>7007,27948=>7008,27912=>7009,27938=>7010,27913=>7011,27920=>7012,28855=>7013,28831=>7014,28862=>7015,28849=>7016,28848=>7017,28833=>7018,28852=>7019,28853=>7020,28841=>7021,29249=>7022,29257=>7023,29258=>7024,29292=>7025,29296=>7026,29299=>7027,29294=>7028,29386=>7029,29412=>7030,29416=>7031,29419=>7032,29407=>7033,29418=>7034,29414=>7035,29411=>7036,29573=>7037,29644=>7038,29634=>7039,29640=>7040,29637=>7041,29625=>7042,29622=>7043,29621=>7044,29620=>7045,29675=>7046,29631=>7047,29639=>7048,29630=>7049,29635=>7050,29638=>7051,29624=>7052,29643=>7053,29932=>7054,29934=>7055,29998=>7056,30023=>7057,30024=>7058,30119=>7059,30122=>7060,30329=>7061,30404=>7062,30472=>7063,30467=>7064,30468=>7065,30469=>7066,30474=>7067,30455=>7068,30459=>7069,30458=>7070,30695=>7071,30696=>7072,30726=>7073,30737=>7074,30738=>7075,30725=>7076,30736=>7077,30735=>7078,30734=>7079,30729=>7080,58095=>7080,30723=>7081,30739=>7082,31050=>7083,31052=>7084,31051=>7085,31045=>7086,31044=>7087,31189=>7088,31181=>7089,31183=>7090,31190=>7091,31182=>7092,31360=>7093,31358=>7094,31441=>7095,31488=>7096,31489=>7097,31866=>7098,31864=>7099,31865=>7100,31871=>7101,31872=>7102,31873=>7103,32003=>7104,32008=>7105,32001=>7106,32600=>7107,32657=>7108,32653=>7109,32702=>7110,32775=>7111,32782=>7112,32783=>7113,32788=>7114,32823=>7115,32984=>7116,32967=>7117,32992=>7118,32977=>7119,32968=>7120,32962=>7121,32976=>7122,32965=>7123,32995=>7124,32985=>7125,32988=>7126,32970=>7127,32981=>7128,32969=>7129,32975=>7130,32983=>7131,32998=>7132,32973=>7133,33279=>7134,33313=>7135,33428=>7136,33497=>7137,33534=>7138,33529=>7139,33543=>7140,33512=>7141,33536=>7142,33493=>7143,33594=>7144,33515=>7145,33494=>7146,33524=>7147,33516=>7148,33505=>7149,33522=>7150,33525=>7151,33548=>7152,33531=>7153,33526=>7154,33520=>7155,33514=>7156,33508=>7157,33504=>7158,33530=>7159,33523=>7160,33517=>7161,34423=>7162,34420=>7163,34428=>7164,34419=>7165,34881=>7166,34894=>7167,34919=>7168,34922=>7169,34921=>7170,35283=>7171,35332=>7172,35335=>7173,36210=>7174,36835=>7175,36833=>7176,36846=>7177,36832=>7178,37105=>7179,37053=>7180,37055=>7181,37077=>7182,37061=>7183,37054=>7184,37063=>7185,37067=>7186,37064=>7187,37332=>7188,60294=>7188,37331=>7189,38484=>7190,38479=>7191,38481=>7192,38483=>7193,38474=>7194,38478=>7195,20510=>7196,20485=>7197,20487=>7198,20499=>7199,20514=>7200,20528=>7201,20507=>7202,20469=>7203,20468=>7204,20531=>7205,20535=>7206,20524=>7207,20470=>7208,20471=>7209,20503=>7210,20508=>7211,20512=>7212,20519=>7213,20533=>7214,20527=>7215,20529=>7216,20494=>7217,20826=>7218,20884=>7219,20883=>7220,20938=>7221,20932=>7222,20933=>7223,20936=>7224,20942=>7225,21089=>7226,21082=>7227,21074=>7228,21086=>7229,21087=>7230,21077=>7231,21090=>7232,21197=>7233,21262=>7234,21406=>7235,21798=>7236,21730=>7237,21783=>7238,21778=>7239,21735=>7240,21747=>7241,21732=>7242,21786=>7243,21759=>7244,21764=>7245,21768=>7246,21739=>7247,21777=>7248,21765=>7249,21745=>7250,21770=>7251,21755=>7252,21751=>7253,21752=>7254,21728=>7255,21774=>7256,21763=>7257,21771=>7258,22273=>7259,22274=>7260,22476=>7261,22578=>7262,22485=>7263,22482=>7264,22458=>7265,22470=>7266,22461=>7267,22460=>7268,22456=>7269,22454=>7270,22463=>7271,22471=>7272,22480=>7273,22457=>7274,22465=>7275,22798=>7276,22858=>7277,23065=>7278,23062=>7279,23085=>7280,23086=>7281,23061=>7282,23055=>7283,23063=>7284,23050=>7285,23070=>7286,23091=>7287,23404=>7288,23463=>7289,23469=>7290,23468=>7291,23555=>7292,23638=>7293,23636=>7294,23788=>7295,23807=>7296,23790=>7297,23793=>7298,23799=>7299,23808=>7300,23801=>7301,24105=>7302,24104=>7303,24232=>7304,24238=>7305,24234=>7306,24236=>7307,24371=>7308,24368=>7309,24423=>7310,24669=>7311,24666=>7312,24679=>7313,24641=>7314,24738=>7315,24712=>7316,24704=>7317,24722=>7318,24705=>7319,24733=>7320,24707=>7321,24725=>7322,24731=>7323,24727=>7324,24711=>7325,24732=>7326,24718=>7327,25113=>7328,25158=>7329,25330=>7330,25360=>7331,25430=>7332,25388=>7333,25412=>7334,25413=>7335,25398=>7336,25411=>7337,25572=>7338,25401=>7339,25419=>7340,25418=>7341,25404=>7342,25385=>7343,25409=>7344,25396=>7345,25432=>7346,25428=>7347,25433=>7348,25389=>7349,25415=>7350,25395=>7351,25434=>7352,25425=>7353,25400=>7354,25431=>7355,25408=>7356,25416=>7357,25930=>7358,25926=>7359,26054=>7360,26051=>7361,26052=>7362,26050=>7363,26186=>7364,26207=>7365,26183=>7366,26193=>7367,26386=>7368,26387=>7369,26655=>7370,26650=>7371,26697=>7372,26674=>7373,26675=>7374,26683=>7375,26699=>7376,26703=>7377,26646=>7378,26673=>7379,26652=>7380,26677=>7381,26667=>7382,26669=>7383,26671=>7384,26702=>7385,26692=>7386,26676=>7387,26653=>7388,26642=>7389,26644=>7390,26662=>7391,26664=>7392,26670=>7393,26701=>7394,26682=>7395,26661=>7396,26656=>7397,27436=>7398,27439=>7399,27437=>7400,27441=>7401,27444=>7402,27501=>7403,32898=>7404,27528=>7405,27622=>7406,27620=>7407,27624=>7408,27619=>7409,27618=>7410,27623=>7411,27685=>7412,28026=>7413,28003=>7414,28004=>7415,28022=>7416,27917=>7417,28001=>7418,28050=>7419,27992=>7420,28002=>7421,28013=>7422,28015=>7423,28049=>7424,28045=>7425,28143=>7426,28031=>7427,28038=>7428,27998=>7429,28007=>7430,59078=>7430,28000=>7431,28055=>7432,28016=>7433,28028=>7434,27999=>7435,28034=>7436,28056=>7437,27951=>7438,28008=>7439,28043=>7440,28030=>7441,28032=>7442,28036=>7443,27926=>7444,28035=>7445,28027=>7446,28029=>7447,28021=>7448,28048=>7449,28892=>7450,28883=>7451,28881=>7452,28893=>7453,28875=>7454,32569=>7455,28898=>7456,28887=>7457,28882=>7458,28894=>7459,28896=>7460,28884=>7461,28877=>7462,28869=>7463,28870=>7464,28871=>7465,28890=>7466,28878=>7467,28897=>7468,29250=>7469,29304=>7470,29303=>7471,29302=>7472,29440=>7473,29434=>7474,29428=>7475,29438=>7476,29430=>7477,29427=>7478,29435=>7479,29441=>7480,29651=>7481,29657=>7482,29669=>7483,29654=>7484,29628=>7485,29671=>7486,29667=>7487,29673=>7488,29660=>7489,29650=>7490,29659=>7491,29652=>7492,29661=>7493,29658=>7494,29655=>7495,29656=>7496,29672=>7497,29918=>7498,29919=>7499,29940=>7500,29941=>7501,29985=>7502,30043=>7503,30047=>7504,30128=>7505,30145=>7506,30139=>7507,30148=>7508,30144=>7509,30143=>7510,30134=>7511,30138=>7512,30346=>7513,30409=>7514,30493=>7515,30491=>7516,30480=>7517,30483=>7518,30482=>7519,30499=>7520,30481=>7521,30485=>7522,30489=>7523,30490=>7524,30498=>7525,30503=>7526,30755=>7527,30764=>7528,30754=>7529,30773=>7530,30767=>7531,30760=>7532,30766=>7533,30763=>7534,30753=>7535,30761=>7536,30771=>7537,30762=>7538,30769=>7539,31060=>7540,31067=>7541,31055=>7542,31068=>7543,31059=>7544,31058=>7545,31057=>7546,31211=>7547,31212=>7548,31200=>7549,31214=>7550,31213=>7551,31210=>7552,31196=>7553,31198=>7554,31197=>7555,31366=>7556,31369=>7557,31365=>7558,31371=>7559,31372=>7560,31370=>7561,31367=>7562,31448=>7563,31504=>7564,31492=>7565,31507=>7566,31493=>7567,31503=>7568,31496=>7569,31498=>7570,31502=>7571,31497=>7572,31506=>7573,31876=>7574,31889=>7575,31882=>7576,31884=>7577,31880=>7578,31885=>7579,31877=>7580,32030=>7581,32029=>7582,32017=>7583,32014=>7584,32024=>7585,32022=>7586,32019=>7587,32031=>7588,32018=>7589,32015=>7590,32012=>7591,32604=>7592,32609=>7593,32606=>7594,32608=>7595,32605=>7596,32603=>7597,32662=>7598,32658=>7599,32707=>7600,32706=>7601,32704=>7602,32790=>7603,32830=>7604,32825=>7605,33018=>7606,33010=>7607,33017=>7608,33013=>7609,33025=>7610,33019=>7611,33024=>7612,33281=>7613,33327=>7614,33317=>7615,33587=>7616,33581=>7617,33604=>7618,33561=>7619,33617=>7620,33573=>7621,33622=>7622,33599=>7623,33601=>7624,33574=>7625,33564=>7626,33570=>7627,33602=>7628,33614=>7629,33563=>7630,33578=>7631,33544=>7632,33596=>7633,33613=>7634,33558=>7635,33572=>7636,33568=>7637,33591=>7638,33583=>7639,33577=>7640,33607=>7641,33605=>7642,33612=>7643,33619=>7644,33566=>7645,33580=>7646,33611=>7647,33575=>7648,33608=>7649,34387=>7650,34386=>7651,34466=>7652,34472=>7653,34454=>7654,34445=>7655,34449=>7656,34462=>7657,34439=>7658,34455=>7659,34438=>7660,34443=>7661,34458=>7662,34437=>7663,34469=>7664,34457=>7665,34465=>7666,34471=>7667,34453=>7668,34456=>7669,34446=>7670,34461=>7671,34448=>7672,34452=>7673,34883=>7674,34884=>7675,34925=>7676,34933=>7677,34934=>7678,34930=>7679,34944=>7680,34929=>7681,34943=>7682,34927=>7683,34947=>7684,34942=>7685,34932=>7686,34940=>7687,35346=>7688,35911=>7689,35927=>7690,35963=>7691,36004=>7692,36003=>7693,36214=>7694,36216=>7695,36277=>7696,36279=>7697,36278=>7698,36561=>7699,36563=>7700,36862=>7701,36853=>7702,36866=>7703,36863=>7704,36859=>7705,36868=>7706,36860=>7707,36854=>7708,37078=>7709,37088=>7710,37081=>7711,37082=>7712,37091=>7713,37087=>7714,37093=>7715,37080=>7716,37083=>7717,37079=>7718,37084=>7719,37092=>7720,37200=>7721,37198=>7722,37199=>7723,37333=>7724,37346=>7725,37338=>7726,38492=>7727,38495=>7728,38588=>7729,39139=>7730,12221=>7731,39647=>7731,12223=>7732,39727=>7732,20095=>7733,20592=>7734,20586=>7735,20577=>7736,20574=>7737,20576=>7738,20563=>7739,20555=>7740,20573=>7741,20594=>7742,20552=>7743,20557=>7744,20545=>7745,20571=>7746,20554=>7747,20578=>7748,20501=>7749,20549=>7750,20575=>7751,20585=>7752,20587=>7753,20579=>7754,20580=>7755,20550=>7756,20544=>7757,20590=>7758,20595=>7759,20567=>7760,20561=>7761,20944=>7762,21099=>7763,21101=>7764,21100=>7765,21102=>7766,21206=>7767,21203=>7768,21293=>7769,21404=>7770,21877=>7771,21878=>7772,21820=>7773,21837=>7774,21840=>7775,21812=>7776,21802=>7777,21841=>7778,21858=>7779,21814=>7780,21813=>7781,21808=>7782,21842=>7783,21829=>7784,21772=>7785,21810=>7786,21861=>7787,21838=>7788,21817=>7789,21832=>7790,21805=>7791,21819=>7792,21824=>7793,21835=>7794,22282=>7795,22279=>7796,22523=>7797,22548=>7798,22498=>7799,22518=>7800,22492=>7801,22516=>7802,22528=>7803,22509=>7804,22525=>7805,22536=>7806,22520=>7807,22539=>7808,22515=>7809,22479=>7810,22535=>7811,22510=>7812,22499=>7813,22514=>7814,22501=>7815,22508=>7816,22497=>7817,22542=>7818,22524=>7819,22544=>7820,22503=>7821,22529=>7822,22540=>7823,22513=>7824,22505=>7825,22512=>7826,22541=>7827,22532=>7828,22876=>7829,23136=>7830,23128=>7831,23125=>7832,23143=>7833,60437=>7833,23134=>7834,23096=>7835,23093=>7836,23149=>7837,23120=>7838,23135=>7839,23141=>7840,23148=>7841,23123=>7842,23140=>7843,23127=>7844,23107=>7845,23133=>7846,23122=>7847,23108=>7848,23131=>7849,23112=>7850,23182=>7851,23102=>7852,23117=>7853,23097=>7854,23116=>7855,23152=>7856,23145=>7857,23111=>7858,23121=>7859,23126=>7860,23106=>7861,23132=>7862,23410=>7863,23406=>7864,23489=>7865,23488=>7866,23641=>7867,23838=>7868,23819=>7869,23837=>7870,23834=>7871,23840=>7872,23820=>7873,23848=>7874,23821=>7875,23846=>7876,23845=>7877,23823=>7878,23856=>7879,23826=>7880,23843=>7881,23839=>7882,23854=>7883,24126=>7884,24116=>7885,24241=>7886,24244=>7887,24249=>7888,24242=>7889,24243=>7890,24374=>7891,24376=>7892,24475=>7893,24470=>7894,24479=>7895,24714=>7896,24720=>7897,24710=>7898,24766=>7899,24752=>7900,24762=>7901,24787=>7902,24788=>7903,24783=>7904,24804=>7905,24793=>7906,24797=>7907,24776=>7908,24753=>7909,24795=>7910,24759=>7911,24778=>7912,24767=>7913,24771=>7914,24781=>7915,24768=>7916,25394=>7917,25445=>7918,25482=>7919,25474=>7920,25469=>7921,25533=>7922,25502=>7923,25517=>7924,25501=>7925,25495=>7926,25515=>7927,25486=>7928,25455=>7929,25479=>7930,25488=>7931,25454=>7932,25519=>7933,25461=>7934,25500=>7935,25453=>7936,25518=>7937,25468=>7938,25508=>7939,25403=>7940,25503=>7941,25464=>7942,25477=>7943,25473=>7944,25489=>7945,25485=>7946,25456=>7947,25939=>7948,26061=>7949,26213=>7950,26209=>7951,26203=>7952,26201=>7953,26204=>7954,26210=>7955,26392=>7956,26745=>7957,26759=>7958,26768=>7959,26780=>7960,26733=>7961,26734=>7962,26798=>7963,26795=>7964,26966=>7965,26735=>7966,26787=>7967,26796=>7968,26793=>7969,26741=>7970,26740=>7971,26802=>7972,26767=>7973,26743=>7974,26770=>7975,26748=>7976,26731=>7977,26738=>7978,26794=>7979,26752=>7980,26737=>7981,26750=>7982,26779=>7983,26774=>7984,26763=>7985,26784=>7986,26761=>7987,26788=>7988,26744=>7989,26747=>7990,26769=>7991,26764=>7992,26762=>7993,26749=>7994,27446=>7995,27443=>7996,27447=>7997,27448=>7998,27537=>7999,27535=>8000,27533=>8001,27534=>8002,27532=>8003,27690=>8004,28096=>8005,28075=>8006,28084=>8007,28083=>8008,28276=>8009,28076=>8010,28137=>8011,28130=>8012,28087=>8013,28150=>8014,28116=>8015,28160=>8016,28104=>8017,28128=>8018,28127=>8019,28118=>8020,28094=>8021,28133=>8022,28124=>8023,28125=>8024,28123=>8025,28148=>8026,28106=>8027,28093=>8028,28141=>8029,28144=>8030,28090=>8031,28117=>8032,28098=>8033,28111=>8034,28105=>8035,28112=>8036,28146=>8037,28115=>8038,28157=>8039,28119=>8040,28109=>8041,28131=>8042,28091=>8043,28922=>8044,28941=>8045,28919=>8046,28951=>8047,28916=>8048,28940=>8049,28912=>8050,28932=>8051,28915=>8052,28944=>8053,28924=>8054,28927=>8055,28934=>8056,28947=>8057,28928=>8058,28920=>8059,28918=>8060,28939=>8061,28930=>8062,28942=>8063,29310=>8064,29307=>8065,29308=>8066,29311=>8067,29469=>8068,29463=>8069,29447=>8070,29457=>8071,29464=>8072,29450=>8073,29448=>8074,29439=>8075,29455=>8076,29470=>8077,29576=>8078,29686=>8079,29688=>8080,29685=>8081,29700=>8082,29697=>8083,29693=>8084,29703=>8085,29696=>8086,29690=>8087,29692=>8088,29695=>8089,29708=>8090,29707=>8091,29684=>8092,29704=>8093,30052=>8094,30051=>8095,30158=>8096,30162=>8097,30159=>8098,30155=>8099,30156=>8100,30161=>8101,30160=>8102,30351=>8103,30345=>8104,30419=>8105,30521=>8106,30511=>8107,30509=>8108,30513=>8109,30514=>8110,30516=>8111,30515=>8112,30525=>8113,30501=>8114,30523=>8115,30517=>8116,30792=>8117,30802=>8118,30793=>8119,30797=>8120,30794=>8121,30796=>8122,30758=>8123,30789=>8124,30800=>8125,31076=>8126,31079=>8127,31081=>8128,31082=>8129,31075=>8130,31083=>8131,31073=>8132,31163=>8133,31226=>8134,31224=>8135,31222=>8136,31223=>8137,31375=>8138,31380=>8139,31376=>8140,31541=>8141,31547=>8142,31540=>8143,31525=>8144,31536=>8145,31522=>8146,31524=>8147,31539=>8148,31512=>8149,31530=>8150,31517=>8151,31537=>8152,31531=>8153,31533=>8154,31535=>8155,31538=>8156,31544=>8157,31514=>8158,31523=>8159,31892=>8160,31896=>8161,31894=>8162,31907=>8163,32053=>8164,32061=>8165,32056=>8166,32054=>8167,32058=>8168,32069=>8169,32044=>8170,32041=>8171,32065=>8172,32071=>8173,32062=>8174,32063=>8175,32074=>8176,32059=>8177,32040=>8178,32611=>8179,32661=>8180,32668=>8181,32669=>8182,32667=>8183,32714=>8184,32715=>8185,32717=>8186,32720=>8187,32721=>8188,32711=>8189,32719=>8190,32713=>8191,32799=>8192,32798=>8193,32795=>8194,32839=>8195,32835=>8196,32840=>8197,33048=>8198,33061=>8199,33049=>8200,33051=>8201,33069=>8202,33055=>8203,33068=>8204,33054=>8205,33057=>8206,33045=>8207,33063=>8208,33053=>8209,33058=>8210,33297=>8211,33336=>8212,33331=>8213,33338=>8214,33332=>8215,33330=>8216,33396=>8217,33680=>8218,33699=>8219,33704=>8220,33677=>8221,33658=>8222,33651=>8223,33700=>8224,33652=>8225,33679=>8226,33665=>8227,33685=>8228,33689=>8229,33653=>8230,33684=>8231,33705=>8232,33661=>8233,33667=>8234,33676=>8235,33693=>8236,33691=>8237,33706=>8238,33675=>8239,33662=>8240,33701=>8241,33711=>8242,33672=>8243,33687=>8244,33712=>8245,33663=>8246,33702=>8247,33671=>8248,33710=>8249,33654=>8250,34393=>8251,34390=>8252,34495=>8253,34487=>8254,34498=>8255,34497=>8256,34501=>8257,34490=>8258,34480=>8259,34504=>8260,34489=>8261,34483=>8262,34488=>8263,34508=>8264,34484=>8265,34491=>8266,34492=>8267,34499=>8268,34493=>8269,34494=>8270,34898=>8271,34953=>8272,34965=>8273,34984=>8274,34978=>8275,34986=>8276,34970=>8277,34961=>8278,34977=>8279,34975=>8280,34968=>8281,34983=>8282,34969=>8283,34971=>8284,34967=>8285,34980=>8286,34988=>8287,34956=>8288,34963=>8289,34958=>8290,35202=>8291,35286=>8292,35289=>8293,35285=>8294,35376=>8295,35367=>8296,35372=>8297,35358=>8298,35897=>8299,35899=>8300,35932=>8301,35933=>8302,35965=>8303,36005=>8304,36221=>8305,36219=>8306,36217=>8307,36284=>8308,36290=>8309,36281=>8310,36287=>8311,36289=>8312,36568=>8313,36574=>8314,36573=>8315,36572=>8316,36567=>8317,36576=>8318,36577=>8319,36900=>8320,36875=>8321,36881=>8322,36892=>8323,36876=>8324,36897=>8325,37103=>8326,37098=>8327,37104=>8328,37108=>8329,37106=>8330,37107=>8331,37076=>8332,37099=>8333,37100=>8334,37097=>8335,37206=>8336,37208=>8337,37210=>8338,37203=>8339,37205=>8340,37356=>8341,37364=>8342,37361=>8343,37363=>8344,37368=>8345,37348=>8346,37369=>8347,37354=>8348,37355=>8349,37367=>8350,37352=>8351,37358=>8352,38266=>8353,38278=>8354,38280=>8355,38524=>8356,38509=>8357,38507=>8358,38513=>8359,38511=>8360,38591=>8361,38762=>8362,38916=>8363,39141=>8364,39319=>8365,20635=>8366,20629=>8367,20628=>8368,20638=>8369,20619=>8370,20643=>8371,20611=>8372,20620=>8373,20622=>8374,20637=>8375,20584=>8376,20636=>8377,20626=>8378,20610=>8379,20615=>8380,20831=>8381,20948=>8382,21266=>8383,21265=>8384,21412=>8385,21415=>8386,21905=>8387,21928=>8388,21925=>8389,21933=>8390,21879=>8391,22085=>8392,21922=>8393,21907=>8394,21896=>8395,21903=>8396,21941=>8397,21889=>8398,21923=>8399,21906=>8400,21924=>8401,21885=>8402,21900=>8403,21926=>8404,21887=>8405,21909=>8406,21921=>8407,21902=>8408,22284=>8409,22569=>8410,22583=>8411,22553=>8412,22558=>8413,22567=>8414,22563=>8415,22568=>8416,22517=>8417,22600=>8418,22565=>8419,22556=>8420,22555=>8421,22579=>8422,22591=>8423,22582=>8424,22574=>8425,22585=>8426,22584=>8427,22573=>8428,22572=>8429,22587=>8430,22881=>8431,23215=>8432,23188=>8433,23199=>8434,23162=>8435,23202=>8436,23198=>8437,23160=>8438,23206=>8439,23164=>8440,23205=>8441,23212=>8442,23189=>8443,23214=>8444,23095=>8445,23172=>8446,23178=>8447,23191=>8448,23171=>8449,23179=>8450,23209=>8451,23163=>8452,23165=>8453,23180=>8454,23196=>8455,23183=>8456,23187=>8457,23197=>8458,23530=>8459,23501=>8460,23499=>8461,23508=>8462,23505=>8463,23498=>8464,23502=>8465,23564=>8466,23600=>8467,23863=>8468,23875=>8469,23915=>8470,23873=>8471,23883=>8472,23871=>8473,23861=>8474,23889=>8475,23886=>8476,23893=>8477,23859=>8478,23866=>8479,23890=>8480,23869=>8481,23857=>8482,23897=>8483,23874=>8484,23865=>8485,23881=>8486,23864=>8487,23868=>8488,23858=>8489,23862=>8490,23872=>8491,23877=>8492,24132=>8493,24129=>8494,24408=>8495,57673=>8495,24486=>8496,24485=>8497,24491=>8498,24777=>8499,24761=>8500,24780=>8501,24802=>8502,24782=>8503,24772=>8504,24852=>8505,24818=>8506,24842=>8507,24854=>8508,24837=>8509,24821=>8510,24851=>8511,24824=>8512,24828=>8513,24830=>8514,24769=>8515,24835=>8516,24856=>8517,24861=>8518,24848=>8519,24831=>8520,24836=>8521,24843=>8522,25162=>8523,25492=>8524,25521=>8525,25520=>8526,25550=>8527,25573=>8528,25576=>8529,25583=>8530,25539=>8531,25757=>8532,25587=>8533,25546=>8534,25568=>8535,25590=>8536,25557=>8537,25586=>8538,25589=>8539,25697=>8540,25567=>8541,25534=>8542,25565=>8543,25564=>8544,25540=>8545,25560=>8546,25555=>8547,25538=>8548,25543=>8549,25548=>8550,25547=>8551,25544=>8552,25584=>8553,25559=>8554,25561=>8555,25906=>8556,25959=>8557,25962=>8558,25956=>8559,25948=>8560,25960=>8561,25957=>8562,25996=>8563,26013=>8564,26014=>8565,26030=>8566,26064=>8567,26066=>8568,26236=>8569,26220=>8570,26235=>8571,26240=>8572,26225=>8573,26233=>8574,26218=>8575,26226=>8576,26369=>8577,26892=>8578,26835=>8579,26884=>8580,26844=>8581,26922=>8582,26860=>8583,26858=>8584,26865=>8585,26895=>8586,26838=>8587,26871=>8588,26859=>8589,26852=>8590,26870=>8591,26899=>8592,26896=>8593,26867=>8594,26849=>8595,26887=>8596,26828=>8597,26888=>8598,26992=>8599,26804=>8600,26897=>8601,26863=>8602,26822=>8603,26900=>8604,26872=>8605,26832=>8606,26877=>8607,26876=>8608,26856=>8609,26891=>8610,26890=>8611,26903=>8612,26830=>8613,26824=>8614,26845=>8615,26846=>8616,26854=>8617,26868=>8618,26833=>8619,26886=>8620,26836=>8621,26857=>8622,26901=>8623,26917=>8624,26823=>8625,27449=>8626,27451=>8627,27455=>8628,27452=>8629,27540=>8630,27543=>8631,27545=>8632,27541=>8633,27581=>8634,27632=>8635,27634=>8636,27635=>8637,27696=>8638,28156=>8639,28230=>8640,28231=>8641,28191=>8642,28233=>8643,28296=>8644,28220=>8645,28221=>8646,28229=>8647,28258=>8648,28203=>8649,28223=>8650,28225=>8651,28253=>8652,28275=>8653,28188=>8654,28211=>8655,28235=>8656,28224=>8657,28241=>8658,28219=>8659,28163=>8660,28206=>8661,28254=>8662,28264=>8663,28252=>8664,28257=>8665,28209=>8666,28200=>8667,28256=>8668,28273=>8669,28267=>8670,28217=>8671,28194=>8672,28208=>8673,28243=>8674,28261=>8675,28199=>8676,28280=>8677,28260=>8678,28279=>8679,28245=>8680,28281=>8681,28242=>8682,28262=>8683,28213=>8684,28214=>8685,28250=>8686,28960=>8687,28958=>8688,28975=>8689,28923=>8690,28974=>8691,28977=>8692,28963=>8693,28965=>8694,28962=>8695,28978=>8696,28959=>8697,28968=>8698,28986=>8699,28955=>8700,29259=>8701,29274=>8702,29320=>8703,29321=>8704,29318=>8705,29317=>8706,29323=>8707,29458=>8708,29451=>8709,29488=>8710,29474=>8711,29489=>8712,29491=>8713,29479=>8714,29490=>8715,29485=>8716,29478=>8717,29475=>8718,29493=>8719,29452=>8720,29742=>8721,29740=>8722,29744=>8723,29739=>8724,29718=>8725,29722=>8726,29729=>8727,29741=>8728,29745=>8729,29732=>8730,29731=>8731,29725=>8732,29737=>8733,29728=>8734,29746=>8735,29947=>8736,29999=>8737,30063=>8738,30060=>8739,30183=>8740,30170=>8741,30177=>8742,30182=>8743,30173=>8744,30175=>8745,30180=>8746,30167=>8747,30357=>8748,30354=>8749,30426=>8750,30534=>8751,30535=>8752,30532=>8753,30541=>8754,30533=>8755,30538=>8756,30542=>8757,30539=>8758,30540=>8759,30686=>8760,30700=>8761,30816=>8762,30820=>8763,30821=>8764,30812=>8765,30829=>8766,30833=>8767,30826=>8768,30830=>8769,30832=>8770,30825=>8771,30824=>8772,30814=>8773,30818=>8774,31092=>8775,31091=>8776,31090=>8777,31088=>8778,31234=>8779,31242=>8780,31235=>8781,31244=>8782,31236=>8783,31385=>8784,31462=>8785,31460=>8786,31562=>8787,31559=>8788,31556=>8789,31560=>8790,31564=>8791,31566=>8792,31552=>8793,31576=>8794,31557=>8795,31906=>8796,31902=>8797,31912=>8798,31905=>8799,32088=>8800,32111=>8801,32099=>8802,32083=>8803,32086=>8804,32103=>8805,32106=>8806,32079=>8807,32109=>8808,32092=>8809,32107=>8810,32082=>8811,32084=>8812,32105=>8813,32081=>8814,32095=>8815,32078=>8816,32574=>8817,32575=>8818,32613=>8819,32614=>8820,32674=>8821,32672=>8822,32673=>8823,32727=>8824,32849=>8825,32847=>8826,32848=>8827,33022=>8828,32980=>8829,33091=>8830,33098=>8831,33106=>8832,33103=>8833,33095=>8834,33085=>8835,33101=>8836,33082=>8837,33254=>8838,33262=>8839,33271=>8840,33272=>8841,33273=>8842,33284=>8843,33340=>8844,33341=>8845,33343=>8846,33397=>8847,33595=>8848,33743=>8849,60382=>8849,33785=>8850,33827=>8851,33728=>8852,33768=>8853,33810=>8854,33767=>8855,33764=>8856,33788=>8857,33782=>8858,33808=>8859,33734=>8860,33736=>8861,33771=>8862,33763=>8863,33727=>8864,33793=>8865,33757=>8866,33765=>8867,33752=>8868,33791=>8869,33761=>8870,33739=>8871,33742=>8872,33750=>8873,33781=>8874,33737=>8875,33801=>8876,33807=>8877,58332=>8877,33758=>8878,33809=>8879,33798=>8880,33730=>8881,33779=>8882,33749=>8883,33786=>8884,33735=>8885,33745=>8886,33770=>8887,33811=>8888,33690=>8889,33731=>8890,33772=>8891,33774=>8892,33732=>8893,33787=>8894,33751=>8895,33762=>8896,33819=>8897,33755=>8898,33790=>8899,34520=>8900,34530=>8901,34534=>8902,34515=>8903,34531=>8904,34522=>8905,34538=>8906,34525=>8907,34539=>8908,34524=>8909,34540=>8910,34537=>8911,34519=>8912,34536=>8913,34513=>8914,34888=>8915,34902=>8916,34901=>8917,35002=>8918,35031=>8919,35001=>8920,35000=>8921,35008=>8922,35006=>8923,34998=>8924,35004=>8925,34999=>8926,35005=>8927,34994=>8928,35073=>8929,35017=>8930,35221=>8931,35224=>8932,35223=>8933,35293=>8934,35290=>8935,35291=>8936,35406=>8937,35405=>8938,35385=>8939,35417=>8940,35392=>8941,35415=>8942,35416=>8943,35396=>8944,35397=>8945,35410=>8946,35400=>8947,35409=>8948,35402=>8949,35404=>8950,35407=>8951,35935=>8952,35969=>8953,35968=>8954,36026=>8955,36030=>8956,36016=>8957,36025=>8958,36021=>8959,36228=>8960,36224=>8961,36233=>8962,36312=>8963,36307=>8964,36301=>8965,36295=>8966,36310=>8967,36316=>8968,36303=>8969,36309=>8970,36313=>8971,36296=>8972,36311=>8973,36293=>8974,36591=>8975,36599=>8976,36602=>8977,36601=>8978,36582=>8979,36590=>8980,36581=>8981,36597=>8982,36583=>8983,36584=>8984,36598=>8985,36587=>8986,36593=>8987,36588=>8988,36596=>8989,36585=>8990,36909=>8991,36916=>8992,36911=>8993,37126=>8994,37164=>8995,37124=>8996,60367=>8996,37119=>8997,37116=>8998,37128=>8999,37113=>9000,37115=>9001,37121=>9002,37120=>9003,37127=>9004,37125=>9005,37123=>9006,37217=>9007,37220=>9008,37215=>9009,37218=>9010,37216=>9011,37377=>9012,37386=>9013,37413=>9014,37379=>9015,37402=>9016,37414=>9017,37391=>9018,37388=>9019,37376=>9020,37394=>9021,37375=>9022,37373=>9023,37382=>9024,37380=>9025,37415=>9026,37378=>9027,37404=>9028,37412=>9029,37401=>9030,37399=>9031,37381=>9032,37398=>9033,38267=>9034,38285=>9035,38284=>9036,38288=>9037,38535=>9038,38526=>9039,38536=>9040,38537=>9041,38531=>9042,38528=>9043,38594=>9044,38600=>9045,38595=>9046,38641=>9047,38640=>9048,38764=>9049,38768=>9050,38766=>9051,38919=>9052,39081=>9053,39147=>9054,40166=>9055,12235=>9056,40697=>9056,20099=>9057,20100=>9058,20150=>9059,20669=>9060,20671=>9061,20678=>9062,20654=>9063,20676=>9064,20682=>9065,20660=>9066,20680=>9067,20674=>9068,20656=>9069,20673=>9070,20666=>9071,20657=>9072,20683=>9073,20681=>9074,20662=>9075,20664=>9076,20951=>9077,21114=>9078,21112=>9079,21115=>9080,21116=>9081,21955=>9082,21979=>9083,21964=>9084,21968=>9085,21963=>9086,21962=>9087,21981=>9088,21952=>9089,64013=>9089,21972=>9090,21956=>9091,21993=>9092,21951=>9093,21970=>9094,21901=>9095,21967=>9096,21973=>9097,21986=>9098,21974=>9099,21960=>9100,22002=>9101,21965=>9102,21977=>9103,21954=>9104,22292=>9105,22611=>9106,22632=>9107,22628=>9108,22607=>9109,22605=>9110,22601=>9111,22639=>9112,22613=>9113,22606=>9114,22621=>9115,22617=>9116,22629=>9117,22619=>9118,22589=>9119,22627=>9120,22641=>9121,22780=>9122,23239=>9123,23236=>9124,23243=>9125,23226=>9126,23224=>9127,23217=>9128,23221=>9129,23216=>9130,23231=>9131,23240=>9132,23227=>9133,23238=>9134,23223=>9135,23232=>9136,23242=>9137,23220=>9138,23222=>9139,23245=>9140,23225=>9141,23184=>9142,23510=>9143,23512=>9144,23513=>9145,23583=>9146,23603=>9147,23921=>9148,23907=>9149,23882=>9150,23909=>9151,23922=>9152,23916=>9153,23902=>9154,23912=>9155,23911=>9156,23906=>9157,24048=>9158,24143=>9159,24142=>9160,24138=>9161,24141=>9162,24139=>9163,24261=>9164,24268=>9165,24262=>9166,24267=>9167,24263=>9168,24384=>9169,24495=>9170,24493=>9171,24823=>9172,24905=>9173,24906=>9174,24875=>9175,24901=>9176,24886=>9177,24882=>9178,24878=>9179,24902=>9180,24879=>9181,24911=>9182,24873=>9183,24896=>9184,25120=>9185,37224=>9186,25123=>9187,25125=>9188,25124=>9189,25541=>9190,25585=>9191,25579=>9192,25616=>9193,25618=>9194,25609=>9195,25632=>9196,25636=>9197,25651=>9198,25667=>9199,25631=>9200,25621=>9201,25624=>9202,25657=>9203,25655=>9204,25634=>9205,25635=>9206,25612=>9207,25638=>9208,25648=>9209,25640=>9210,25665=>9211,25653=>9212,25647=>9213,25610=>9214,25626=>9215,25664=>9216,25637=>9217,25639=>9218,25611=>9219,25575=>9220,25627=>9221,25646=>9222,25633=>9223,25614=>9224,25967=>9225,26002=>9226,26067=>9227,26246=>9228,26252=>9229,26261=>9230,26256=>9231,26251=>9232,26250=>9233,26265=>9234,26260=>9235,26232=>9236,26400=>9237,26982=>9238,26975=>9239,26936=>9240,26958=>9241,26978=>9242,26993=>9243,26943=>9244,26949=>9245,26986=>9246,26937=>9247,26946=>9248,26967=>9249,26969=>9250,27002=>9251,26952=>9252,26953=>9253,26933=>9254,26988=>9255,26931=>9256,26941=>9257,26981=>9258,26864=>9259,27000=>9260,26932=>9261,26985=>9262,26944=>9263,26991=>9264,26948=>9265,26998=>9266,26968=>9267,26945=>9268,26996=>9269,26956=>9270,26939=>9271,26955=>9272,26935=>9273,26972=>9274,26959=>9275,26961=>9276,26930=>9277,26962=>9278,26927=>9279,27003=>9280,26940=>9281,27462=>9282,27461=>9283,27459=>9284,27458=>9285,27464=>9286,27457=>9287,27547=>9288,27643=>9289,27644=>9290,27641=>9291,27639=>9292,27640=>9293,28315=>9294,28374=>9295,28360=>9296,28303=>9297,28352=>9298,28319=>9299,28307=>9300,28308=>9301,28320=>9302,28337=>9303,28345=>9304,28358=>9305,28370=>9306,28349=>9307,28353=>9308,28318=>9309,28361=>9310,28343=>9311,28336=>9312,28365=>9313,28326=>9314,28367=>9315,28338=>9316,28350=>9317,28355=>9318,28380=>9319,28376=>9320,28313=>9321,28306=>9322,28302=>9323,28301=>9324,28324=>9325,28321=>9326,28351=>9327,28339=>9328,28368=>9329,28362=>9330,28311=>9331,28334=>9332,28323=>9333,28999=>9334,29012=>9335,29010=>9336,29027=>9337,29024=>9338,28993=>9339,29021=>9340,29026=>9341,61080=>9341,29042=>9342,29048=>9343,29034=>9344,29025=>9345,28994=>9346,29016=>9347,28995=>9348,29003=>9349,29040=>9350,29023=>9351,29008=>9352,29011=>9353,28996=>9354,29005=>9355,29018=>9356,29263=>9357,29325=>9358,29324=>9359,29329=>9360,29328=>9361,29326=>9362,29500=>9363,29506=>9364,29499=>9365,29498=>9366,29504=>9367,29514=>9368,29513=>9369,29764=>9370,29770=>9371,29771=>9372,29778=>9373,29777=>9374,29783=>9375,29760=>9376,29775=>9377,29776=>9378,29774=>9379,29762=>9380,29766=>9381,29773=>9382,29780=>9383,29921=>9384,29951=>9385,29950=>9386,29949=>9387,29981=>9388,30073=>9389,30071=>9390,27011=>9391,30191=>9392,30223=>9393,30211=>9394,30199=>9395,30206=>9396,30204=>9397,30201=>9398,60782=>9398,30200=>9399,30224=>9400,30203=>9401,30198=>9402,30189=>9403,30197=>9404,30205=>9405,30361=>9406,30389=>9407,30429=>9408,30549=>9409,30559=>9410,30560=>9411,30546=>9412,30550=>9413,30554=>9414,30569=>9415,30567=>9416,30548=>9417,30553=>9418,30573=>9419,30688=>9420,30855=>9421,30874=>9422,30868=>9423,30863=>9424,30852=>9425,30869=>9426,30853=>9427,30854=>9428,30881=>9429,30851=>9430,30841=>9431,30873=>9432,30848=>9433,30870=>9434,30843=>9435,31100=>9436,31106=>9437,31101=>9438,31097=>9439,31249=>9440,31256=>9441,31257=>9442,31250=>9443,31255=>9444,31253=>9445,31266=>9446,31251=>9447,31259=>9448,31248=>9449,31395=>9450,31394=>9451,31390=>9452,31467=>9453,31590=>9454,31588=>9455,31597=>9456,31604=>9457,31593=>9458,31602=>9459,31589=>9460,31603=>9461,31601=>9462,31600=>9463,31585=>9464,31608=>9465,31606=>9466,31587=>9467,31922=>9468,31924=>9469,31919=>9470,32136=>9471,32134=>9472,32128=>9473,32141=>9474,32127=>9475,32133=>9476,32122=>9477,32142=>9478,32123=>9479,32131=>9480,32124=>9481,32140=>9482,32148=>9483,32132=>9484,32125=>9485,32146=>9486,32621=>9487,32619=>9488,32615=>9489,32616=>9490,32620=>9491,32678=>9492,32677=>9493,32679=>9494,32731=>9495,32732=>9496,32801=>9497,33124=>9498,33120=>9499,33143=>9500,33116=>9501,33129=>9502,33115=>9503,33122=>9504,33138=>9505,26401=>9506,33118=>9507,33142=>9508,33127=>9509,33135=>9510,33092=>9511,33121=>9512,33309=>9513,33353=>9514,33348=>9515,33344=>9516,33346=>9517,33349=>9518,34033=>9519,33855=>9520,33878=>9521,33910=>9522,33913=>9523,33935=>9524,33933=>9525,33893=>9526,33873=>9527,33856=>9528,33926=>9529,33895=>9530,33840=>9531,33869=>9532,33917=>9533,33882=>9534,33881=>9535,33908=>9536,33907=>9537,33885=>9538,34055=>9539,33886=>9540,33847=>9541,33850=>9542,33844=>9543,33914=>9544,33859=>9545,33912=>9546,33842=>9547,33861=>9548,33833=>9549,33753=>9550,33867=>9551,33839=>9552,33858=>9553,33837=>9554,33887=>9555,33904=>9556,33849=>9557,33870=>9558,33868=>9559,33874=>9560,33903=>9561,33989=>9562,33934=>9563,33851=>9564,33863=>9565,33846=>9566,33843=>9567,33896=>9568,33918=>9569,33860=>9570,33835=>9571,33888=>9572,33876=>9573,33902=>9574,33872=>9575,34571=>9576,34564=>9577,34551=>9578,34572=>9579,34554=>9580,34518=>9581,34549=>9582,34637=>9583,34552=>9584,34574=>9585,34569=>9586,34561=>9587,34550=>9588,34573=>9589,34565=>9590,35030=>9591,35019=>9592,35021=>9593,35022=>9594,35038=>9595,35035=>9596,35034=>9597,35020=>9598,35024=>9599,35205=>9600,35227=>9601,35295=>9602,35301=>9603,35300=>9604,35297=>9605,35296=>9606,35298=>9607,35292=>9608,35302=>9609,35446=>9610,35462=>9611,35455=>9612,35425=>9613,35391=>9614,35447=>9615,35458=>9616,35460=>9617,35445=>9618,35459=>9619,35457=>9620,35444=>9621,35450=>9622,35900=>9623,35915=>9624,35914=>9625,35941=>9626,35940=>9627,35942=>9628,35974=>9629,35972=>9630,35973=>9631,36044=>9632,36200=>9633,36201=>9634,36241=>9635,36236=>9636,36238=>9637,36239=>9638,36237=>9639,36243=>9640,36244=>9641,36240=>9642,36242=>9643,36336=>9644,36320=>9645,36332=>9646,36337=>9647,36334=>9648,36304=>9649,36329=>9650,36323=>9651,36322=>9652,36327=>9653,36338=>9654,36331=>9655,36340=>9656,36614=>9657,36607=>9658,36609=>9659,36608=>9660,36613=>9661,36615=>9662,36616=>9663,36610=>9664,36619=>9665,60507=>9665,36946=>9666,36927=>9667,36932=>9668,36937=>9669,36925=>9670,37136=>9671,37133=>9672,37135=>9673,37137=>9674,37142=>9675,37140=>9676,37131=>9677,37134=>9678,37230=>9679,37231=>9680,37448=>9681,37458=>9682,37424=>9683,37434=>9684,37478=>9685,37427=>9686,37477=>9687,37470=>9688,37507=>9689,37422=>9690,37450=>9691,37446=>9692,37485=>9693,37484=>9694,37455=>9695,37472=>9696,37479=>9697,37487=>9698,37430=>9699,37473=>9700,37488=>9701,37425=>9702,37460=>9703,37475=>9704,37456=>9705,37490=>9706,37454=>9707,37459=>9708,37452=>9709,37462=>9710,37426=>9711,38303=>9712,38300=>9713,38302=>9714,38299=>9715,38546=>9716,38547=>9717,38545=>9718,38551=>9719,38606=>9720,38650=>9721,38653=>9722,38648=>9723,38645=>9724,38771=>9725,38775=>9726,38776=>9727,38770=>9728,38927=>9729,38925=>9730,38926=>9731,39084=>9732,39158=>9733,39161=>9734,39343=>9735,39346=>9736,39344=>9737,39349=>9738,39597=>9739,39595=>9740,39771=>9741,40170=>9742,40173=>9743,40167=>9744,40576=>9745,12236=>9746,40701=>9746,20710=>9747,20692=>9748,20695=>9749,20712=>9750,20723=>9751,20699=>9752,20714=>9753,20701=>9754,20708=>9755,20691=>9756,20716=>9757,20720=>9758,20719=>9759,20707=>9760,20704=>9761,20952=>9762,21120=>9763,21121=>9764,21225=>9765,21227=>9766,21296=>9767,21420=>9768,22055=>9769,22037=>9770,22028=>9771,22034=>9772,22012=>9773,22031=>9774,22044=>9775,22017=>9776,22035=>9777,22018=>9778,22010=>9779,22045=>9780,22020=>9781,22015=>9782,22009=>9783,22665=>9784,22652=>9785,22672=>9786,22680=>9787,22662=>9788,22657=>9789,22655=>9790,22644=>9791,22667=>9792,22650=>9793,22663=>9794,22673=>9795,22670=>9796,22646=>9797,22658=>9798,22664=>9799,22651=>9800,22676=>9801,22671=>9802,22782=>9803,22891=>9804,23260=>9805,23278=>9806,23269=>9807,23253=>9808,23274=>9809,23258=>9810,23277=>9811,23275=>9812,23283=>9813,23266=>9814,23264=>9815,23259=>9816,23276=>9817,23262=>9818,23261=>9819,23257=>9820,23272=>9821,23263=>9822,23415=>9823,23520=>9824,23523=>9825,23651=>9826,23938=>9827,23936=>9828,23933=>9829,23942=>9830,23930=>9831,23937=>9832,23927=>9833,23946=>9834,23945=>9835,23944=>9836,23934=>9837,23932=>9838,23949=>9839,23929=>9840,23935=>9841,24152=>9842,24153=>9843,24147=>9844,24280=>9845,24273=>9846,24279=>9847,24270=>9848,24284=>9849,24277=>9850,24281=>9851,24274=>9852,24276=>9853,24388=>9854,24387=>9855,24431=>9856,24502=>9857,24876=>9858,24872=>9859,24897=>9860,24926=>9861,24945=>9862,24947=>9863,24914=>9864,24915=>9865,24946=>9866,24940=>9867,24960=>9868,24948=>9869,24916=>9870,24954=>9871,24923=>9872,24933=>9873,24891=>9874,24938=>9875,24929=>9876,24918=>9877,25129=>9878,25127=>9879,25131=>9880,25643=>9881,25677=>9882,25691=>9883,25693=>9884,25716=>9885,25718=>9886,25714=>9887,25715=>9888,25725=>9889,25717=>9890,25702=>9891,25766=>9892,25678=>9893,25730=>9894,25694=>9895,25692=>9896,25675=>9897,25683=>9898,25696=>9899,25680=>9900,25727=>9901,25663=>9902,25708=>9903,25707=>9904,25689=>9905,25701=>9906,25719=>9907,25971=>9908,26016=>9909,26273=>9910,26272=>9911,26271=>9912,26373=>9913,26372=>9914,26402=>9915,27057=>9916,27062=>9917,27081=>9918,27040=>9919,27086=>9920,27030=>9921,27056=>9922,27052=>9923,27068=>9924,27025=>9925,27033=>9926,27022=>9927,27047=>9928,27021=>9929,27049=>9930,27070=>9931,27055=>9932,27071=>9933,27076=>9934,27069=>9935,27044=>9936,27092=>9937,27065=>9938,27082=>9939,27034=>9940,27087=>9941,27059=>9942,27027=>9943,27050=>9944,27041=>9945,27038=>9946,27097=>9947,27031=>9948,27024=>9949,27074=>9950,27061=>9951,27045=>9952,27078=>9953,27466=>9954,27469=>9955,27467=>9956,27550=>9957,27551=>9958,27552=>9959,27587=>9960,27588=>9961,27646=>9962,28366=>9963,28405=>9964,28401=>9965,28419=>9966,28453=>9967,28408=>9968,28471=>9969,28411=>9970,28462=>9971,28425=>9972,28494=>9973,28441=>9974,28442=>9975,28455=>9976,28440=>9977,28475=>9978,28434=>9979,28397=>9980,28426=>9981,28470=>9982,28531=>9983,28409=>9984,28398=>9985,28461=>9986,28480=>9987,28464=>9988,28476=>9989,28469=>9990,28395=>9991,28423=>9992,28430=>9993,28483=>9994,28421=>9995,28413=>9996,28406=>9997,28473=>9998,28444=>9999,28412=>10000,28474=>10001,28447=>10002,28429=>10003,28446=>10004,28424=>10005,28449=>10006,29063=>10007,29072=>10008,29065=>10009,29056=>10010,29061=>10011,29058=>10012,29071=>10013,29051=>10014,29062=>10015,29057=>10016,29079=>10017,29252=>10018,29267=>10019,29335=>10020,29333=>10021,29331=>10022,29507=>10023,29517=>10024,29521=>10025,29516=>10026,29794=>10027,29811=>10028,29809=>10029,29813=>10030,29810=>10031,29799=>10032,29806=>10033,29952=>10034,29954=>10035,29955=>10036,30077=>10037,30096=>10038,30230=>10039,30216=>10040,30220=>10041,30229=>10042,30225=>10043,30218=>10044,30228=>10045,30392=>10046,30593=>10047,30588=>10048,30597=>10049,30594=>10050,30574=>10051,30592=>10052,30575=>10053,30590=>10054,30595=>10055,30898=>10056,30890=>10057,30900=>10058,30893=>10059,30888=>10060,30846=>10061,30891=>10062,30878=>10063,30885=>10064,30880=>10065,30892=>10066,30882=>10067,30884=>10068,31128=>10069,31114=>10070,31115=>10071,31126=>10072,31125=>10073,31124=>10074,31123=>10075,31127=>10076,31112=>10077,31122=>10078,31120=>10079,31275=>10080,31306=>10081,31280=>10082,31279=>10083,31272=>10084,31270=>10085,31400=>10086,31403=>10087,31404=>10088,31470=>10089,31624=>10090,31644=>10091,31626=>10092,31633=>10093,31632=>10094,31638=>10095,31629=>10096,31628=>10097,31643=>10098,31630=>10099,31621=>10100,31640=>10101,21124=>10102,31641=>10103,31652=>10104,31618=>10105,31931=>10106,31935=>10107,31932=>10108,31930=>10109,32167=>10110,32183=>10111,32194=>10112,32163=>10113,32170=>10114,32193=>10115,32192=>10116,32197=>10117,32157=>10118,32206=>10119,32196=>10120,32198=>10121,32203=>10122,32204=>10123,32175=>10124,32185=>10125,32150=>10126,32188=>10127,32159=>10128,32166=>10129,32174=>10130,32169=>10131,32161=>10132,32201=>10133,32627=>10134,32738=>10135,32739=>10136,32741=>10137,32734=>10138,32804=>10139,32861=>10140,32860=>10141,33161=>10142,33158=>10143,33155=>10144,33159=>10145,33165=>10146,33164=>10147,33163=>10148,33301=>10149,33943=>10150,33956=>10151,33953=>10152,33951=>10153,33978=>10154,33998=>10155,33986=>10156,33964=>10157,33966=>10158,33963=>10159,33977=>10160,33972=>10161,33985=>10162,33997=>10163,33962=>10164,33946=>10165,33969=>10166,34000=>10167,33949=>10168,33959=>10169,33979=>10170,33954=>10171,33940=>10172,33991=>10173,33996=>10174,33947=>10175,33961=>10176,33967=>10177,33960=>10178,58327=>10178,34006=>10179,33944=>10180,33974=>10181,33999=>10182,33952=>10183,34007=>10184,34004=>10185,34002=>10186,34011=>10187,33968=>10188,33937=>10189,34401=>10190,34611=>10191,34595=>10192,34600=>10193,34667=>10194,34624=>10195,34606=>10196,34590=>10197,34593=>10198,34585=>10199,34587=>10200,34627=>10201,34604=>10202,34625=>10203,34622=>10204,34630=>10205,34592=>10206,34610=>10207,34602=>10208,34605=>10209,34620=>10210,34578=>10211,34618=>10212,34609=>10213,34613=>10214,34626=>10215,34598=>10216,34599=>10217,34616=>10218,34596=>10219,34586=>10220,34608=>10221,34577=>10222,35063=>10223,35047=>10224,35057=>10225,35058=>10226,35066=>10227,35070=>10228,35054=>10229,35068=>10230,35062=>10231,35067=>10232,35056=>10233,35052=>10234,35051=>10235,35229=>10236,35233=>10237,35231=>10238,35230=>10239,35305=>10240,35307=>10241,35304=>10242,35499=>10243,35481=>10244,35467=>10245,35474=>10246,35471=>10247,35478=>10248,35901=>10249,35944=>10250,35945=>10251,36053=>10252,36047=>10253,36055=>10254,36246=>10255,36361=>10256,36354=>10257,36351=>10258,36365=>10259,36349=>10260,36362=>10261,36355=>10262,36359=>10263,36358=>10264,36357=>10265,36350=>10266,36352=>10267,36356=>10268,36624=>10269,36625=>10270,36622=>10271,36621=>10272,37155=>10273,37148=>10274,37152=>10275,37154=>10276,37151=>10277,37149=>10278,37146=>10279,37156=>10280,37153=>10281,37147=>10282,37242=>10283,37234=>10284,37241=>10285,37235=>10286,37541=>10287,37540=>10288,37494=>10289,37531=>10290,37498=>10291,37536=>10292,37524=>10293,37546=>10294,37517=>10295,37542=>10296,37530=>10297,37547=>10298,37497=>10299,37527=>10300,37503=>10301,37539=>10302,37614=>10303,37518=>10304,37506=>10305,37525=>10306,37538=>10307,37501=>10308,37512=>10309,37537=>10310,37514=>10311,37510=>10312,37516=>10313,37529=>10314,37543=>10315,37502=>10316,37511=>10317,37545=>10318,37533=>10319,37515=>10320,37421=>10321,38558=>10322,38561=>10323,38655=>10324,38744=>10325,38781=>10326,38778=>10327,38782=>10328,38787=>10329,38784=>10330,38786=>10331,38779=>10332,38788=>10333,38785=>10334,38783=>10335,38862=>10336,38861=>10337,38934=>10338,39085=>10339,39086=>10340,39170=>10341,39168=>10342,39175=>10343,39325=>10344,39324=>10345,39363=>10346,39353=>10347,39355=>10348,39354=>10349,39362=>10350,39357=>10351,39367=>10352,39601=>10353,39651=>10354,39655=>10355,39742=>10356,39743=>10357,39776=>10358,39777=>10359,39775=>10360,40177=>10361,40178=>10362,40181=>10363,40615=>10364,20735=>10365,20739=>10366,20784=>10367,20728=>10368,20742=>10369,20743=>10370,20726=>10371,20734=>10372,20747=>10373,20748=>10374,20733=>10375,20746=>10376,21131=>10377,21132=>10378,21233=>10379,21231=>10380,22088=>10381,22082=>10382,22092=>10383,22069=>10384,22081=>10385,22090=>10386,22089=>10387,22086=>10388,22104=>10389,22106=>10390,22080=>10391,22067=>10392,22077=>10393,22060=>10394,22078=>10395,22072=>10396,22058=>10397,22074=>10398,22298=>10399,22699=>10400,22685=>10401,22705=>10402,22688=>10403,22691=>10404,22703=>10405,22700=>10406,22693=>10407,22689=>10408,22783=>10409,23295=>10410,23284=>10411,23293=>10412,23287=>10413,23286=>10414,23299=>10415,23288=>10416,23298=>10417,23289=>10418,23297=>10419,23303=>10420,23301=>10421,23311=>10422,23655=>10423,23961=>10424,23959=>10425,23967=>10426,23954=>10427,23970=>10428,23955=>10429,23957=>10430,23968=>10431,23964=>10432,23969=>10433,23962=>10434,23966=>10435,24169=>10436,24157=>10437,24160=>10438,24156=>10439,32243=>10440,24283=>10441,24286=>10442,24289=>10443,24393=>10444,24498=>10445,24971=>10446,24963=>10447,24953=>10448,25009=>10449,25008=>10450,24994=>10451,24969=>10452,24987=>10453,24979=>10454,25007=>10455,25005=>10456,24991=>10457,24978=>10458,25002=>10459,24993=>10460,24973=>10461,24934=>10462,25011=>10463,25133=>10464,25710=>10465,25712=>10466,25750=>10467,25760=>10468,25733=>10469,25751=>10470,25756=>10471,25743=>10472,25739=>10473,25738=>10474,25740=>10475,25763=>10476,25759=>10477,25704=>10478,25777=>10479,25752=>10480,25974=>10481,25978=>10482,25977=>10483,25979=>10484,26034=>10485,26035=>10486,26293=>10487,26288=>10488,26281=>10489,26290=>10490,26295=>10491,26282=>10492,26287=>10493,27136=>10494,27142=>10495,27159=>10496,27109=>10497,27128=>10498,27157=>10499,27121=>10500,27108=>10501,27168=>10502,27135=>10503,27116=>10504,27106=>10505,27163=>10506,27165=>10507,27134=>10508,27175=>10509,27122=>10510,27118=>10511,27156=>10512,27127=>10513,27111=>10514,27200=>10515,27144=>10516,27110=>10517,27131=>10518,27149=>10519,27132=>10520,27115=>10521,27145=>10522,27140=>10523,27160=>10524,27173=>10525,27151=>10526,27126=>10527,27174=>10528,27143=>10529,27124=>10530,27158=>10531,27473=>10532,27557=>10533,27555=>10534,27554=>10535,27558=>10536,27649=>10537,27648=>10538,27647=>10539,27650=>10540,28481=>10541,28454=>10542,28542=>10543,28551=>10544,28614=>10545,28562=>10546,28557=>10547,28553=>10548,28556=>10549,28514=>10550,28495=>10551,28549=>10552,28506=>10553,28566=>10554,28534=>10555,28524=>10556,28546=>10557,28501=>10558,28530=>10559,28498=>10560,28496=>10561,28503=>10562,28564=>10563,28563=>10564,28509=>10565,28416=>10566,28513=>10567,28523=>10568,28541=>10569,28519=>10570,28560=>10571,28499=>10572,28555=>10573,28521=>10574,28543=>10575,28565=>10576,28515=>10577,28535=>10578,28522=>10579,28539=>10580,29106=>10581,29103=>10582,29083=>10583,29104=>10584,29088=>10585,29082=>10586,29097=>10587,29109=>10588,29085=>10589,29093=>10590,29086=>10591,29092=>10592,29089=>10593,29098=>10594,29084=>10595,29095=>10596,29107=>10597,29336=>10598,29338=>10599,29528=>10600,29522=>10601,29534=>10602,29535=>10603,29536=>10604,29533=>10605,29531=>10606,29537=>10607,29530=>10608,29529=>10609,29538=>10610,29831=>10611,29833=>10612,29834=>10613,29830=>10614,29825=>10615,29821=>10616,29829=>10617,29832=>10618,29820=>10619,29817=>10620,58868=>10620,29960=>10621,29959=>10622,30078=>10623,30245=>10624,30238=>10625,30233=>10626,30237=>10627,30236=>10628,30243=>10629,30234=>10630,30248=>10631,30235=>10632,30364=>10633,30365=>10634,30366=>10635,30363=>10636,30605=>10637,30607=>10638,30601=>10639,30600=>10640,30925=>10641,30907=>10642,30927=>10643,30924=>10644,30929=>10645,30926=>10646,30932=>10647,30920=>10648,30915=>10649,30916=>10650,30921=>10651,31130=>10652,31137=>10653,31136=>10654,31132=>10655,31138=>10656,31131=>10657,59175=>10657,27510=>10658,31289=>10659,31410=>10660,31412=>10661,31411=>10662,31671=>10663,31691=>10664,31678=>10665,31660=>10666,31694=>10667,31663=>10668,31673=>10669,31690=>10670,31669=>10671,31941=>10672,31944=>10673,31948=>10674,31947=>10675,32247=>10676,32219=>10677,32234=>10678,32231=>10679,32215=>10680,32225=>10681,32259=>10682,32250=>10683,32230=>10684,32246=>10685,32241=>10686,32240=>10687,32238=>10688,32223=>10689,32630=>10690,32684=>10691,32688=>10692,32685=>10693,32749=>10694,32747=>10695,32746=>10696,32748=>10697,32742=>10698,32744=>10699,32868=>10700,32871=>10701,33187=>10702,33183=>10703,33182=>10704,33173=>10705,33186=>10706,33177=>10707,33175=>10708,33302=>10709,33359=>10710,33363=>10711,33362=>10712,33360=>10713,33358=>10714,33361=>10715,34084=>10716,34107=>10717,34063=>10718,34048=>10719,34089=>10720,34062=>10721,34057=>10722,34061=>10723,34079=>10724,34058=>10725,34087=>10726,34076=>10727,34043=>10728,34091=>10729,34042=>10730,34056=>10731,34060=>10732,34036=>10733,34090=>10734,34034=>10735,34069=>10736,34039=>10737,34027=>10738,34035=>10739,34044=>10740,34066=>10741,34026=>10742,34025=>10743,34070=>10744,34046=>10745,34088=>10746,34077=>10747,34094=>10748,34050=>10749,34045=>10750,34078=>10751,34038=>10752,34097=>10753,34086=>10754,34023=>10755,34024=>10756,34032=>10757,34031=>10758,34041=>10759,34072=>10760,34080=>10761,34096=>10762,34059=>10763,34073=>10764,34095=>10765,34402=>10766,34646=>10767,34659=>10768,34660=>10769,34679=>10770,34785=>10771,34675=>10772,34648=>10773,34644=>10774,34651=>10775,34642=>10776,34657=>10777,34650=>10778,34641=>10779,34654=>10780,34669=>10781,34666=>10782,34640=>10783,34638=>10784,34655=>10785,34653=>10786,34671=>10787,34668=>10788,34682=>10789,34670=>10790,34652=>10791,34661=>10792,34639=>10793,34683=>10794,34677=>10795,34658=>10796,34663=>10797,34665=>10798,34906=>10799,35077=>10800,35084=>10801,35092=>10802,35083=>10803,35095=>10804,35096=>10805,35097=>10806,35078=>10807,35094=>10808,35089=>10809,35086=>10810,35081=>10811,35234=>10812,35236=>10813,35235=>10814,35309=>10815,35312=>10816,35308=>10817,35535=>10818,35526=>10819,35512=>10820,35539=>10821,35537=>10822,35540=>10823,35541=>10824,35515=>10825,35543=>10826,35518=>10827,35520=>10828,35525=>10829,35544=>10830,35523=>10831,35514=>10832,35517=>10833,35545=>10834,35902=>10835,35917=>10836,35983=>10837,36069=>10838,36063=>10839,36057=>10840,36072=>10841,36058=>10842,36061=>10843,36071=>10844,36256=>10845,36252=>10846,36257=>10847,36251=>10848,36384=>10849,36387=>10850,36389=>10851,36388=>10852,36398=>10853,36373=>10854,36379=>10855,36374=>10856,36369=>10857,36377=>10858,36390=>10859,36391=>10860,36372=>10861,36370=>10862,36376=>10863,36371=>10864,36380=>10865,36375=>10866,36378=>10867,36652=>10868,36644=>10869,36632=>10870,36634=>10871,36640=>10872,36643=>10873,36630=>10874,36631=>10875,36979=>10876,36976=>10877,36975=>10878,36967=>10879,36971=>10880,37167=>10881,37163=>10882,37161=>10883,37162=>10884,37170=>10885,37158=>10886,37166=>10887,37253=>10888,37254=>10889,37258=>10890,37249=>10891,37250=>10892,37252=>10893,37248=>10894,37584=>10895,37571=>10896,37572=>10897,37568=>10898,37593=>10899,37558=>10900,37583=>10901,37617=>10902,37599=>10903,37592=>10904,37609=>10905,37591=>10906,37597=>10907,37580=>10908,37615=>10909,37570=>10910,37608=>10911,37578=>10912,37576=>10913,37582=>10914,37606=>10915,37581=>10916,37589=>10917,37577=>10918,37600=>10919,37598=>10920,37607=>10921,37585=>10922,37587=>10923,37557=>10924,37601=>10925,37669=>10926,37574=>10927,37556=>10928,38268=>10929,38316=>10930,38315=>10931,38318=>10932,38320=>10933,38564=>10934,38562=>10935,38611=>10936,38661=>10937,38664=>10938,38658=>10939,38746=>10940,38794=>10941,38798=>10942,38792=>10943,38864=>10944,38863=>10945,38942=>10946,38941=>10947,38950=>10948,38953=>10949,38952=>10950,38944=>10951,38939=>10952,38951=>10953,39090=>10954,39176=>10955,39162=>10956,39185=>10957,39188=>10958,39190=>10959,39191=>10960,39189=>10961,39388=>10962,39373=>10963,39375=>10964,39379=>10965,39380=>10966,39374=>10967,39369=>10968,39382=>10969,60270=>10969,39384=>10970,39371=>10971,39383=>10972,39372=>10973,39603=>10974,39660=>10975,39659=>10976,39667=>10977,39666=>10978,39665=>10979,39750=>10980,39747=>10981,39783=>10982,39796=>10983,39793=>10984,39782=>10985,39798=>10986,39797=>10987,39792=>10988,39784=>10989,39780=>10990,39788=>10991,40188=>10992,40186=>10993,40189=>10994,40191=>10995,40183=>10996,40199=>10997,40192=>10998,40185=>10999,40187=>11000,40200=>11001,40197=>11002,40196=>11003,40579=>11004,40659=>11005,40719=>11006,40720=>11007,20764=>11008,20755=>11009,20759=>11010,20762=>11011,20753=>11012,20958=>11013,21300=>11014,21473=>11015,22128=>11016,22112=>11017,22126=>11018,22131=>11019,22118=>11020,22115=>11021,22125=>11022,22130=>11023,22110=>11024,22135=>11025,22300=>11026,22299=>11027,22728=>11028,22717=>11029,22729=>11030,22719=>11031,22714=>11032,22722=>11033,22716=>11034,22726=>11035,23319=>11036,23321=>11037,23323=>11038,23329=>11039,23316=>11040,23315=>11041,23312=>11042,23318=>11043,23336=>11044,59539=>11044,23322=>11045,23328=>11046,23326=>11047,23535=>11048,23980=>11049,23985=>11050,23977=>11051,23975=>11052,23989=>11053,23984=>11054,23982=>11055,23978=>11056,23976=>11057,23986=>11058,23981=>11059,23983=>11060,23988=>11061,24167=>11062,24168=>11063,24166=>11064,24175=>11065,24297=>11066,24295=>11067,24294=>11068,24296=>11069,24293=>11070,24395=>11071,24508=>11072,24507=>11073,24989=>11074,25000=>11075,24982=>11076,25029=>11077,25012=>11078,25030=>11079,25025=>11080,25036=>11081,25018=>11082,25023=>11083,25016=>11084,24972=>11085,25815=>11086,25814=>11087,25808=>11088,25807=>11089,25801=>11090,25789=>11091,25737=>11092,25795=>11093,25819=>11094,25843=>11095,25817=>11096,25907=>11097,25983=>11098,25980=>11099,26018=>11100,26312=>11101,26302=>11102,26304=>11103,26314=>11104,26315=>11105,26319=>11106,26301=>11107,26299=>11108,26298=>11109,26316=>11110,26403=>11111,27188=>11112,27238=>11113,27209=>11114,27239=>11115,27186=>11116,27240=>11117,27198=>11118,27229=>11119,27245=>11120,27254=>11121,27227=>11122,27217=>11123,27176=>11124,27226=>11125,27195=>11126,27199=>11127,27201=>11128,27242=>11129,27236=>11130,27216=>11131,27215=>11132,27220=>11133,27247=>11134,27241=>11135,27232=>11136,27196=>11137,27230=>11138,27222=>11139,27221=>11140,27213=>11141,27214=>11142,27206=>11143,27477=>11144,27476=>11145,27478=>11146,27559=>11147,27562=>11148,27563=>11149,27592=>11150,27591=>11151,27652=>11152,27651=>11153,27654=>11154,28589=>11155,28619=>11156,28579=>11157,28615=>11158,28604=>11159,28622=>11160,28616=>11161,28510=>11162,28612=>11163,28605=>11164,28574=>11165,28618=>11166,28584=>11167,28676=>11168,28581=>11169,28590=>11170,28602=>11171,28588=>11172,28586=>11173,28623=>11174,28607=>11175,28600=>11176,28578=>11177,28617=>11178,28587=>11179,28621=>11180,28591=>11181,28594=>11182,28592=>11183,29125=>11184,29122=>11185,29119=>11186,29112=>11187,29142=>11188,29120=>11189,29121=>11190,29131=>11191,29140=>11192,29130=>11193,29127=>11194,29135=>11195,29117=>11196,29144=>11197,29116=>11198,29126=>11199,29146=>11200,29147=>11201,29341=>11202,29342=>11203,29545=>11204,29542=>11205,29543=>11206,29548=>11207,29541=>11208,29547=>11209,29546=>11210,29823=>11211,29850=>11212,29856=>11213,29844=>11214,29842=>11215,29845=>11216,29857=>11217,29963=>11218,30080=>11219,30255=>11220,30253=>11221,30257=>11222,30269=>11223,30259=>11224,30268=>11225,30261=>11226,30258=>11227,30256=>11228,30395=>11229,30438=>11230,30618=>11231,30621=>11232,30625=>11233,30620=>11234,30619=>11235,30626=>11236,30627=>11237,30613=>11238,30617=>11239,30615=>11240,30941=>11241,30953=>11242,30949=>11243,30954=>11244,30942=>11245,30947=>11246,30939=>11247,30945=>11248,30946=>11249,30957=>11250,30943=>11251,30944=>11252,31140=>11253,31300=>11254,31304=>11255,31303=>11256,31414=>11257,31416=>11258,31413=>11259,31409=>11260,31415=>11261,31710=>11262,31715=>11263,31719=>11264,31709=>11265,31701=>11266,31717=>11267,31706=>11268,31720=>11269,31737=>11270,31700=>11271,31722=>11272,31714=>11273,31708=>11274,31723=>11275,31704=>11276,31711=>11277,31954=>11278,31956=>11279,31959=>11280,31952=>11281,31953=>11282,32274=>11283,32289=>11284,32279=>11285,32268=>11286,32287=>11287,32288=>11288,32275=>11289,32270=>11290,32284=>11291,32277=>11292,32282=>11293,32290=>11294,32267=>11295,32271=>11296,32278=>11297,32269=>11298,32276=>11299,32293=>11300,32292=>11301,32579=>11302,32635=>11303,32636=>11304,32634=>11305,32689=>11306,32751=>11307,32810=>11308,32809=>11309,32876=>11310,33201=>11311,33190=>11312,33198=>11313,33209=>11314,33205=>11315,33195=>11316,33200=>11317,33196=>11318,33204=>11319,33202=>11320,33207=>11321,33191=>11322,33266=>11323,33365=>11324,33366=>11325,33367=>11326,34134=>11327,34117=>11328,34155=>11329,34125=>11330,34131=>11331,34145=>11332,34136=>11333,34112=>11334,34118=>11335,34148=>11336,34113=>11337,34146=>11338,34116=>11339,34129=>11340,34119=>11341,34147=>11342,34110=>11343,34139=>11344,34161=>11345,34126=>11346,34158=>11347,34165=>11348,34133=>11349,34151=>11350,34144=>11351,34188=>11352,34150=>11353,34141=>11354,34132=>11355,34149=>11356,34156=>11357,34403=>11358,34405=>11359,34404=>11360,34724=>11361,34715=>11362,34703=>11363,34711=>11364,34707=>11365,34706=>11366,34696=>11367,34689=>11368,34710=>11369,34712=>11370,34681=>11371,34695=>11372,34723=>11373,34693=>11374,34704=>11375,34705=>11376,34717=>11377,34692=>11378,34708=>11379,34716=>11380,34714=>11381,34697=>11382,35102=>11383,35110=>11384,35120=>11385,35117=>11386,35118=>11387,35111=>11388,35121=>11389,35106=>11390,35113=>11391,35107=>11392,35119=>11393,35116=>11394,35103=>11395,35313=>11396,35552=>11397,35554=>11398,35570=>11399,35572=>11400,35573=>11401,35549=>11402,35604=>11403,35556=>11404,35551=>11405,35568=>11406,35528=>11407,35550=>11408,35553=>11409,35560=>11410,35583=>11411,35567=>11412,35579=>11413,35985=>11414,35986=>11415,35984=>11416,36085=>11417,36078=>11418,36081=>11419,36080=>11420,36083=>11421,36204=>11422,36206=>11423,36261=>11424,36263=>11425,36403=>11426,36414=>11427,36408=>11428,36416=>11429,36421=>11430,36406=>11431,36412=>11432,36413=>11433,36417=>11434,36400=>11435,36415=>11436,36541=>11437,36662=>11438,60329=>11438,36654=>11439,36661=>11440,36658=>11441,36665=>11442,36663=>11443,36660=>11444,36982=>11445,36985=>11446,36987=>11447,36998=>11448,37114=>11449,37171=>11450,37173=>11451,37174=>11452,37267=>11453,37264=>11454,37265=>11455,37261=>11456,37263=>11457,37671=>11458,37662=>11459,37640=>11460,37663=>11461,37638=>11462,37647=>11463,37754=>11464,37688=>11465,37692=>11466,37659=>11467,37667=>11468,37650=>11469,37633=>11470,37702=>11471,37677=>11472,37646=>11473,37645=>11474,37579=>11475,37661=>11476,37626=>11477,37651=>11478,37625=>11479,37623=>11480,37684=>11481,37634=>11482,37668=>11483,37631=>11484,37673=>11485,37689=>11486,37685=>11487,37674=>11488,37652=>11489,37644=>11490,37643=>11491,37630=>11492,37641=>11493,37632=>11494,37627=>11495,37654=>11496,38332=>11497,38349=>11498,38334=>11499,38329=>11500,38330=>11501,38326=>11502,38335=>11503,38325=>11504,38333=>11505,38569=>11506,38612=>11507,38667=>11508,38674=>11509,38672=>11510,38809=>11511,38807=>11512,38804=>11513,38896=>11514,38904=>11515,38965=>11516,38959=>11517,38962=>11518,39204=>11519,39199=>11520,39207=>11521,39209=>11522,39326=>11523,39406=>11524,39404=>11525,39397=>11526,39396=>11527,39408=>11528,39395=>11529,39402=>11530,39401=>11531,39399=>11532,39609=>11533,39615=>11534,39604=>11535,39611=>11536,39670=>11537,39674=>11538,39673=>11539,39671=>11540,39731=>11541,39808=>11542,39813=>11543,39815=>11544,39804=>11545,39806=>11546,39803=>11547,39810=>11548,39827=>11549,39826=>11550,39824=>11551,39802=>11552,39829=>11553,39805=>11554,39816=>11555,40229=>11556,40215=>11557,40224=>11558,40222=>11559,40212=>11560,40233=>11561,40221=>11562,40216=>11563,40226=>11564,40208=>11565,40217=>11566,40223=>11567,40584=>11568,40582=>11569,40583=>11570,40622=>11571,40621=>11572,40661=>11573,40662=>11574,40698=>11575,40722=>11576,40765=>11577,20774=>11578,20773=>11579,20770=>11580,20772=>11581,20768=>11582,20777=>11583,21236=>11584,22163=>11585,22156=>11586,22157=>11587,22150=>11588,22148=>11589,22147=>11590,22142=>11591,22146=>11592,22143=>11593,22145=>11594,22742=>11595,22740=>11596,22735=>11597,22738=>11598,23341=>11599,23333=>11600,23346=>11601,23331=>11602,23340=>11603,23335=>11604,23334=>11605,23343=>11606,23342=>11607,23419=>11608,23537=>11609,23538=>11610,23991=>11611,24172=>11612,24170=>11613,24510=>11614,25027=>11615,25013=>11616,25020=>11617,25063=>11618,25056=>11619,25061=>11620,25060=>11621,25064=>11622,25054=>11623,25839=>11624,25833=>11625,25827=>11626,25835=>11627,25828=>11628,25832=>11629,25985=>11630,25984=>11631,26038=>11632,26074=>11633,26322=>11634,27277=>11635,27286=>11636,27265=>11637,27301=>11638,27273=>11639,27295=>11640,27291=>11641,27297=>11642,27294=>11643,27271=>11644,27283=>11645,27278=>11646,27285=>11647,27267=>11648,27304=>11649,27300=>11650,27281=>11651,27263=>11652,27302=>11653,27290=>11654,27269=>11655,27276=>11656,27282=>11657,27483=>11658,27565=>11659,27657=>11660,28620=>11661,28585=>11662,28660=>11663,28628=>11664,28643=>11665,28636=>11666,28653=>11667,28647=>11668,28646=>11669,28638=>11670,28658=>11671,28637=>11672,28642=>11673,28648=>11674,29153=>11675,29169=>11676,29160=>11677,29170=>11678,29156=>11679,29168=>11680,29154=>11681,29555=>11682,29550=>11683,29551=>11684,29847=>11685,29874=>11686,29867=>11687,29840=>11688,29866=>11689,29869=>11690,29873=>11691,29861=>11692,29871=>11693,29968=>11694,29969=>11695,29970=>11696,29967=>11697,30084=>11698,30275=>11699,30280=>11700,30281=>11701,30279=>11702,30372=>11703,30441=>11704,30645=>11705,30635=>11706,30642=>11707,30647=>11708,30646=>11709,30644=>11710,30641=>11711,30632=>11712,30704=>11713,30963=>11714,30973=>11715,30978=>11716,30971=>11717,30972=>11718,30975=>11719,30962=>11720,30981=>11721,30969=>11722,30974=>11723,30980=>11724,31147=>11725,31144=>11726,31324=>11727,31323=>11728,31318=>11729,31320=>11730,31316=>11731,31322=>11732,31422=>11733,31424=>11734,31425=>11735,31749=>11736,31759=>11737,31730=>11738,31744=>11739,31743=>11740,31739=>11741,31758=>11742,31732=>11743,31755=>11744,31731=>11745,31746=>11746,31753=>11747,31747=>11748,31745=>11749,31736=>11750,31741=>11751,31750=>11752,58176=>11752,31728=>11753,31729=>11754,31760=>11755,31754=>11756,31976=>11757,32301=>11758,32316=>11759,32322=>11760,32307=>11761,38984=>11762,32312=>11763,32298=>11764,32329=>11765,32320=>11766,32327=>11767,32297=>11768,32332=>11769,32304=>11770,32315=>11771,32310=>11772,32324=>11773,32314=>11774,32581=>11775,32639=>11776,32638=>11777,32637=>11778,32756=>11779,32754=>11780,32812=>11781,33211=>11782,33220=>11783,33228=>11784,33226=>11785,33221=>11786,33223=>11787,33212=>11788,33257=>11789,33371=>11790,33370=>11791,33372=>11792,34179=>11793,34176=>11794,34191=>11795,34215=>11796,34197=>11797,34208=>11798,34187=>11799,34211=>11800,34171=>11801,34212=>11802,34202=>11803,34206=>11804,34167=>11805,34172=>11806,34185=>11807,34209=>11808,34170=>11809,34168=>11810,34135=>11811,34190=>11812,34198=>11813,34182=>11814,34189=>11815,34201=>11816,34205=>11817,34177=>11818,34210=>11819,34178=>11820,34184=>11821,34181=>11822,34169=>11823,34166=>11824,34200=>11825,34192=>11826,34207=>11827,34408=>11828,34750=>11829,34730=>11830,34733=>11831,34757=>11832,34736=>11833,34732=>11834,34745=>11835,34741=>11836,34748=>11837,34734=>11838,34761=>11839,34755=>11840,34754=>11841,34764=>11842,34743=>11843,34735=>11844,34756=>11845,34762=>11846,34740=>11847,34742=>11848,34751=>11849,34744=>11850,34749=>11851,34782=>11852,34738=>11853,35125=>11854,35123=>11855,35132=>11856,35134=>11857,35137=>11858,35154=>11859,35127=>11860,35138=>11861,35245=>11862,35247=>11863,35246=>11864,35314=>11865,35315=>11866,35614=>11867,35608=>11868,35606=>11869,35601=>11870,35589=>11871,35595=>11872,35618=>11873,35599=>11874,35602=>11875,35605=>11876,35591=>11877,35597=>11878,35592=>11879,35590=>11880,35612=>11881,35603=>11882,35610=>11883,35919=>11884,35952=>11885,35954=>11886,35953=>11887,35951=>11888,35989=>11889,35988=>11890,36089=>11891,36207=>11892,36430=>11893,36429=>11894,36435=>11895,36432=>11896,36428=>11897,36423=>11898,36675=>11899,36672=>11900,36997=>11901,36990=>11902,37176=>11903,37274=>11904,37282=>11905,37275=>11906,37273=>11907,37279=>11908,37281=>11909,37277=>11910,37280=>11911,37793=>11912,37763=>11913,37807=>11914,37732=>11915,37718=>11916,37703=>11917,37756=>11918,37720=>11919,37724=>11920,37750=>11921,37705=>11922,37712=>11923,37713=>11924,37728=>11925,37741=>11926,37775=>11927,37708=>11928,37738=>11929,37753=>11930,37719=>11931,37717=>11932,37714=>11933,37711=>11934,37745=>11935,37751=>11936,37755=>11937,37729=>11938,37726=>11939,37731=>11940,37735=>11941,37710=>11942,37721=>11943,38343=>11944,38336=>11945,38345=>11946,38339=>11947,38341=>11948,38327=>11949,38574=>11950,38576=>11951,38572=>11952,38688=>11953,38687=>11954,38680=>11955,38685=>11956,38681=>11957,38810=>11958,38817=>11959,38812=>11960,38814=>11961,38813=>11962,38869=>11963,38868=>11964,38897=>11965,38977=>11966,38980=>11967,38986=>11968,38985=>11969,38981=>11970,38979=>11971,39205=>11972,39211=>11973,39212=>11974,39210=>11975,39219=>11976,39218=>11977,39215=>11978,39213=>11979,39217=>11980,39216=>11981,39320=>11982,39331=>11983,39329=>11984,39426=>11985,39418=>11986,39412=>11987,39415=>11988,39417=>11989,39416=>11990,39414=>11991,39419=>11992,39421=>11993,39422=>11994,39420=>11995,39427=>11996,39614=>11997,39678=>11998,39677=>11999,39681=>12000,39676=>12001,39752=>12002,39834=>12003,39848=>12004,39838=>12005,39835=>12006,39846=>12007,39841=>12008,39845=>12009,39844=>12010,39814=>12011,39842=>12012,39840=>12013,39855=>12014,40243=>12015,40257=>12016,40295=>12017,40246=>12018,40238=>12019,40239=>12020,40241=>12021,40248=>12022,40240=>12023,40261=>12024,40258=>12025,40259=>12026,40254=>12027,40247=>12028,40256=>12029,40253=>12030,32757=>12031,40237=>12032,40586=>12033,40585=>12034,40589=>12035,40624=>12036,40648=>12037,40666=>12038,40699=>12039,40703=>12040,40740=>12041,40739=>12042,40738=>12043,40788=>12044,12245=>12045,40864=>12045,20785=>12046,20781=>12047,20782=>12048,22168=>12049,22172=>12050,22167=>12051,22170=>12052,22173=>12053,22169=>12054,22896=>12055,23356=>12056,23657=>12057,23658=>12058,24000=>12059,24173=>12060,24174=>12061,25048=>12062,25055=>12063,25069=>12064,25070=>12065,25073=>12066,25066=>12067,25072=>12068,25067=>12069,25046=>12070,25065=>12071,25855=>12072,25860=>12073,25853=>12074,25848=>12075,25857=>12076,25859=>12077,25852=>12078,26004=>12079,26075=>12080,26330=>12081,26331=>12082,26328=>12083,27333=>12084,27321=>12085,27325=>12086,27361=>12087,27334=>12088,27322=>12089,27318=>12090,27319=>12091,27335=>12092,27316=>12093,27309=>12094,27486=>12095,27593=>12096,27659=>12097,28679=>12098,28684=>12099,28685=>12100,28673=>12101,28677=>12102,28692=>12103,28686=>12104,28671=>12105,28672=>12106,28667=>12107,28710=>12108,28668=>12109,28663=>12110,28682=>12111,29185=>12112,60224=>12112,29183=>12113,29177=>12114,29187=>12115,29181=>12116,29558=>12117,29880=>12118,29888=>12119,29877=>12120,29889=>12121,29886=>12122,29878=>12123,29883=>12124,29890=>12125,29972=>12126,29971=>12127,30300=>12128,30308=>12129,30297=>12130,30288=>12131,30291=>12132,30295=>12133,30298=>12134,30374=>12135,30397=>12136,30444=>12137,30658=>12138,30650=>12139,30988=>12140,30995=>12141,30996=>12142,30985=>12143,30992=>12144,30994=>12145,30993=>12146,31149=>12147,31148=>12148,31327=>12149,31772=>12150,31785=>12151,31769=>12152,31776=>12153,31775=>12154,31789=>12155,31773=>12156,31782=>12157,31784=>12158,31778=>12159,31781=>12160,31792=>12161,32348=>12162,32336=>12163,32342=>12164,32355=>12165,32344=>12166,32354=>12167,32351=>12168,32337=>12169,32352=>12170,32343=>12171,32339=>12172,32693=>12173,32691=>12174,32759=>12175,32760=>12176,32885=>12177,33233=>12178,33234=>12179,33232=>12180,33375=>12181,33374=>12182,34228=>12183,34246=>12184,34240=>12185,34243=>12186,34242=>12187,34227=>12188,34229=>12189,34237=>12190,34247=>12191,34244=>12192,34239=>12193,34251=>12194,34254=>12195,34248=>12196,34245=>12197,34225=>12198,34230=>12199,34258=>12200,34340=>12201,34232=>12202,34231=>12203,34238=>12204,34409=>12205,34791=>12206,34790=>12207,34786=>12208,34779=>12209,34795=>12210,34794=>12211,34789=>12212,34783=>12213,34803=>12214,34788=>12215,34772=>12216,34780=>12217,34771=>12218,34797=>12219,34776=>12220,34787=>12221,34775=>12222,34777=>12223,34817=>12224,34804=>12225,34792=>12226,34781=>12227,35155=>12228,35147=>12229,35151=>12230,35148=>12231,35142=>12232,35152=>12233,35153=>12234,35145=>12235,35626=>12236,35623=>12237,35619=>12238,35635=>12239,35632=>12240,35637=>12241,35655=>12242,35631=>12243,35644=>12244,35646=>12245,35633=>12246,35621=>12247,35639=>12248,35622=>12249,35638=>12250,35630=>12251,35620=>12252,35643=>12253,35645=>12254,35642=>12255,35906=>12256,35957=>12257,35993=>12258,35992=>12259,35991=>12260,36094=>12261,36100=>12262,36098=>12263,36096=>12264,36444=>12265,36450=>12266,36448=>12267,36439=>12268,36438=>12269,36446=>12270,36453=>12271,36455=>12272,36443=>12273,36442=>12274,36449=>12275,36445=>12276,36457=>12277,36436=>12278,36678=>12279,36679=>12280,36680=>12281,36683=>12282,37160=>12283,37178=>12284,37179=>12285,37182=>12286,37288=>12287,37285=>12288,37287=>12289,37295=>12290,37290=>12291,37813=>12292,37772=>12293,37778=>12294,37815=>12295,37787=>12296,37789=>12297,37769=>12298,37799=>12299,37774=>12300,37802=>12301,37790=>12302,37798=>12303,37781=>12304,37768=>12305,37785=>12306,37791=>12307,37760=>12308,37773=>12309,37809=>12310,37777=>12311,37810=>12312,37796=>12313,37800=>12314,37812=>12315,37795=>12316,38354=>12317,38355=>12318,38353=>12319,38579=>12320,38615=>12321,38618=>12322,24002=>12323,38623=>12324,38616=>12325,38621=>12326,38691=>12327,38690=>12328,38693=>12329,38828=>12330,38830=>12331,38824=>12332,38827=>12333,38820=>12334,38826=>12335,38818=>12336,38821=>12337,38871=>12338,38873=>12339,38870=>12340,38872=>12341,38906=>12342,38992=>12343,38993=>12344,38994=>12345,39096=>12346,39233=>12347,39228=>12348,39226=>12349,39439=>12350,39435=>12351,39433=>12352,39437=>12353,39428=>12354,39441=>12355,39434=>12356,39429=>12357,39431=>12358,39430=>12359,39616=>12360,39644=>12361,39688=>12362,39684=>12363,39685=>12364,39721=>12365,39733=>12366,39754=>12367,39756=>12368,39755=>12369,39879=>12370,39878=>12371,39875=>12372,39871=>12373,39873=>12374,39861=>12375,39864=>12376,39891=>12377,39862=>12378,39876=>12379,39865=>12380,39869=>12381,40284=>12382,40275=>12383,40271=>12384,40266=>12385,40283=>12386,40267=>12387,40281=>12388,40278=>12389,40268=>12390,40279=>12391,40274=>12392,40276=>12393,40287=>12394,40280=>12395,40282=>12396,40590=>12397,40588=>12398,40671=>12399,40705=>12400,40704=>12401,40726=>12402,58693=>12402,40741=>12403,40747=>12404,40746=>12405,40745=>12406,40744=>12407,40780=>12408,40789=>12409,20788=>12410,20789=>12411,21142=>12412,21239=>12413,21428=>12414,22187=>12415,22189=>12416,22182=>12417,22183=>12418,22186=>12419,22188=>12420,22746=>12421,22749=>12422,22747=>12423,22802=>12424,23357=>12425,23358=>12426,23359=>12427,24003=>12428,24176=>12429,24511=>12430,25083=>12431,25863=>12432,25872=>12433,25869=>12434,25865=>12435,25868=>12436,25870=>12437,25988=>12438,26078=>12439,26077=>12440,26334=>12441,27367=>12442,27360=>12443,27340=>12444,27345=>12445,27353=>12446,27339=>12447,27359=>12448,27356=>12449,27344=>12450,27371=>12451,27343=>12452,27341=>12453,27358=>12454,27488=>12455,27568=>12456,27660=>12457,28697=>12458,28711=>12459,28704=>12460,28694=>12461,28715=>12462,28705=>12463,28706=>12464,28707=>12465,28713=>12466,28695=>12467,28708=>12468,28700=>12469,29196=>12470,29194=>12471,29191=>12472,29186=>12473,29189=>12474,29349=>12475,29350=>12476,29348=>12477,29347=>12478,29345=>12479,29899=>12480,29893=>12481,29879=>12482,29891=>12483,29974=>12484,30304=>12485,30665=>12486,30666=>12487,30660=>12488,30705=>12489,31005=>12490,31003=>12491,31009=>12492,31004=>12493,30999=>12494,31006=>12495,31152=>12496,31335=>12497,31336=>12498,31795=>12499,31804=>12500,31801=>12501,31788=>12502,31803=>12503,31980=>12504,31978=>12505,32374=>12506,32373=>12507,32376=>12508,32368=>12509,32375=>12510,32367=>12511,32378=>12512,32370=>12513,32372=>12514,32360=>12515,32587=>12516,32586=>12517,32643=>12518,32646=>12519,32695=>12520,32765=>12521,32766=>12522,32888=>12523,33239=>12524,33237=>12525,33291=>12526,33380=>12527,33377=>12528,33379=>12529,34283=>12530,34289=>12531,34285=>12532,34265=>12533,34273=>12534,34280=>12535,34266=>12536,34263=>12537,34284=>12538,34290=>12539,34296=>12540,34264=>12541,34271=>12542,34275=>12543,34268=>12544,34257=>12545,34288=>12546,34278=>12547,34287=>12548,34270=>12549,34274=>12550,34816=>12551,34810=>12552,34819=>12553,34806=>12554,34807=>12555,34825=>12556,34828=>12557,34827=>12558,34822=>12559,34812=>12560,34824=>12561,34815=>12562,34826=>12563,34818=>12564,35170=>12565,35162=>12566,35163=>12567,35159=>12568,35169=>12569,35164=>12570,35160=>12571,35165=>12572,35161=>12573,35208=>12574,35255=>12575,35254=>12576,35318=>12577,35664=>12578,35656=>12579,35658=>12580,35648=>12581,35667=>12582,35670=>12583,35668=>12584,35659=>12585,35669=>12586,35665=>12587,35650=>12588,35666=>12589,35671=>12590,35907=>12591,35959=>12592,35958=>12593,35994=>12594,36102=>12595,36103=>12596,36105=>12597,36268=>12598,36266=>12599,36269=>12600,36267=>12601,36461=>12602,36472=>12603,36467=>12604,36458=>12605,36463=>12606,36475=>12607,36546=>12608,36690=>12609,36689=>12610,36687=>12611,36688=>12612,36691=>12613,36788=>12614,37184=>12615,37183=>12616,37296=>12617,37293=>12618,37854=>12619,37831=>12620,37839=>12621,37826=>12622,37850=>12623,37840=>12624,37881=>12625,37868=>12626,37836=>12627,37849=>12628,37801=>12629,37862=>12630,37834=>12631,37844=>12632,37870=>12633,37859=>12634,37845=>12635,37828=>12636,37838=>12637,37824=>12638,37842=>12639,37797=>12640,37863=>12641,38269=>12642,38362=>12643,38363=>12644,38625=>12645,38697=>12646,38699=>12647,38700=>12648,38696=>12649,38694=>12650,38835=>12651,38839=>12652,38838=>12653,38877=>12654,38878=>12655,38879=>12656,39004=>12657,39001=>12658,39005=>12659,38999=>12660,39103=>12661,39101=>12662,39099=>12663,39102=>12664,39240=>12665,39239=>12666,39235=>12667,39334=>12668,39335=>12669,39450=>12670,39445=>12671,39461=>12672,39453=>12673,39460=>12674,39451=>12675,39458=>12676,39456=>12677,39463=>12678,39459=>12679,39454=>12680,39452=>12681,39444=>12682,39618=>12683,39691=>12684,39690=>12685,39694=>12686,39692=>12687,39735=>12688,39914=>12689,39915=>12690,39904=>12691,39902=>12692,39908=>12693,39910=>12694,39906=>12695,39920=>12696,39892=>12697,39895=>12698,39916=>12699,39900=>12700,39897=>12701,39909=>12702,39893=>12703,39905=>12704,39898=>12705,40311=>12706,40321=>12707,40330=>12708,40324=>12709,40328=>12710,40305=>12711,40320=>12712,40312=>12713,40326=>12714,40331=>12715,40332=>12716,40317=>12717,40299=>12718,40308=>12719,40309=>12720,40304=>12721,40297=>12722,40325=>12723,40307=>12724,40315=>12725,40322=>12726,40303=>12727,40313=>12728,40319=>12729,40327=>12730,40296=>12731,40596=>12732,40593=>12733,40640=>12734,40700=>12735,40749=>12736,40768=>12737,40769=>12738,40781=>12739,40790=>12740,40791=>12741,40792=>12742,21303=>12743,22194=>12744,22197=>12745,22195=>12746,22755=>12747,23365=>12748,24006=>12749,24007=>12750,24302=>12751,24303=>12752,24512=>12753,24513=>12754,25081=>12755,25879=>12756,25878=>12757,25877=>12758,25875=>12759,26079=>12760,26344=>12761,26339=>12762,26340=>12763,27379=>12764,27376=>12765,27370=>12766,27368=>12767,27385=>12768,27377=>12769,27374=>12770,27375=>12771,28732=>12772,28725=>12773,28719=>12774,28727=>12775,28724=>12776,28721=>12777,28738=>12778,28728=>12779,28735=>12780,28730=>12781,28729=>12782,28714=>12783,28736=>12784,28731=>12785,28723=>12786,28737=>12787,29203=>12788,29204=>12789,29352=>12790,29565=>12791,29564=>12792,29882=>12793,30379=>12794,30378=>12795,30398=>12796,30445=>12797,30668=>12798,30670=>12799,30671=>12800,30669=>12801,30706=>12802,31013=>12803,31011=>12804,31015=>12805,31016=>12806,31012=>12807,31017=>12808,31154=>12809,31342=>12810,31340=>12811,31341=>12812,31479=>12813,31817=>12814,31816=>12815,31818=>12816,31815=>12817,31813=>12818,31982=>12819,32379=>12820,32382=>12821,32385=>12822,32384=>12823,32698=>12824,32767=>12825,32889=>12826,33243=>12827,33241=>12828,33384=>12829,33385=>12830,34338=>12831,34303=>12832,34305=>12833,34302=>12834,34331=>12835,34304=>12836,34294=>12837,34308=>12838,34313=>12839,34309=>12840,34316=>12841,34301=>12842,34841=>12843,34832=>12844,34833=>12845,34839=>12846,34835=>12847,34838=>12848,35171=>12849,35174=>12850,35257=>12851,35319=>12852,35680=>12853,35690=>12854,35677=>12855,35688=>12856,35683=>12857,35685=>12858,35687=>12859,35693=>12860,36270=>12861,36486=>12862,36488=>12863,36484=>12864,36697=>12865,36694=>12866,36695=>12867,36693=>12868,36696=>12869,36698=>12870,37005=>12871,37187=>12872,37185=>12873,37303=>12874,37301=>12875,37298=>12876,37299=>12877,37899=>12878,37907=>12879,37883=>12880,37920=>12881,37903=>12882,37908=>12883,37886=>12884,37909=>12885,37904=>12886,37928=>12887,37913=>12888,37901=>12889,37877=>12890,37888=>12891,37879=>12892,37895=>12893,37902=>12894,37910=>12895,37906=>12896,37882=>12897,37897=>12898,37880=>12899,37948=>12900,37898=>12901,37887=>12902,37884=>12903,37900=>12904,37878=>12905,37905=>12906,37894=>12907,38366=>12908,38368=>12909,38367=>12910,38702=>12911,38703=>12912,38841=>12913,38843=>12914,38909=>12915,38910=>12916,39008=>12917,39010=>12918,39011=>12919,39007=>12920,39105=>12921,39106=>12922,39248=>12923,39246=>12924,39257=>12925,39244=>12926,39243=>12927,39251=>12928,39474=>12929,39476=>12930,39473=>12931,39468=>12932,39466=>12933,39478=>12934,39465=>12935,39470=>12936,39480=>12937,39469=>12938,39623=>12939,39626=>12940,39622=>12941,39696=>12942,39698=>12943,39697=>12944,39947=>12945,39944=>12946,39927=>12947,39941=>12948,39954=>12949,39928=>12950,40000=>12951,39943=>12952,39950=>12953,39942=>12954,39959=>12955,39956=>12956,39945=>12957,40351=>12958,40345=>12959,40356=>12960,40349=>12961,40338=>12962,40344=>12963,40336=>12964,40347=>12965,40352=>12966,40340=>12967,40348=>12968,40362=>12969,40343=>12970,40353=>12971,40346=>12972,40354=>12973,40360=>12974,40350=>12975,40355=>12976,40383=>12977,40361=>12978,40342=>12979,40358=>12980,40359=>12981,40601=>12982,40603=>12983,40602=>12984,40677=>12985,40676=>12986,40679=>12987,40678=>12988,40752=>12989,40750=>12990,40795=>12991,40800=>12992,40798=>12993,40797=>12994,40793=>12995,40849=>12996,20794=>12997,20793=>12998,21144=>12999,21143=>13000,22211=>13001,22205=>13002,22206=>13003,23368=>13004,23367=>13005,24011=>13006,24015=>13007,24305=>13008,25085=>13009,25883=>13010,27394=>13011,27388=>13012,27395=>13013,27384=>13014,27392=>13015,28739=>13016,28740=>13017,28746=>13018,28744=>13019,28745=>13020,28741=>13021,28742=>13022,29213=>13023,29210=>13024,29209=>13025,29566=>13026,29975=>13027,30314=>13028,30672=>13029,31021=>13030,31025=>13031,31023=>13032,31828=>13033,31827=>13034,31986=>13035,32394=>13036,60229=>13037,32391=>13037,32392=>13038,32395=>13039,32390=>13040,32397=>13041,32589=>13042,32699=>13043,32816=>13044,33245=>13045,34328=>13046,34346=>13047,34342=>13048,34335=>13049,34339=>13050,34332=>13051,34329=>13052,34343=>13053,34350=>13054,34337=>13055,34336=>13056,34345=>13057,34334=>13058,34341=>13059,34857=>13060,34845=>13061,34843=>13062,34848=>13063,34852=>13064,34844=>13065,34859=>13066,34890=>13067,35181=>13068,35177=>13069,35182=>13070,35179=>13071,35322=>13072,35705=>13073,35704=>13074,35653=>13075,35706=>13076,35707=>13077,36112=>13078,36116=>13079,36271=>13080,36494=>13081,36492=>13082,36702=>13083,36699=>13084,36701=>13085,37190=>13086,37188=>13087,37189=>13088,37305=>13089,37951=>13090,37947=>13091,37942=>13092,37929=>13093,37949=>13094,37936=>13095,37945=>13096,37930=>13097,37943=>13098,37932=>13099,37952=>13100,37937=>13101,38373=>13102,38372=>13103,38371=>13104,38709=>13105,38714=>13106,38847=>13107,38881=>13108,39012=>13109,39113=>13110,39110=>13111,39104=>13112,39256=>13113,39254=>13114,39481=>13115,39485=>13116,39494=>13117,39492=>13118,39490=>13119,39489=>13120,39482=>13121,39487=>13122,39629=>13123,39701=>13124,39703=>13125,39704=>13126,39702=>13127,39738=>13128,39762=>13129,39979=>13130,39965=>13131,39964=>13132,39980=>13133,39971=>13134,39976=>13135,39977=>13136,39972=>13137,39969=>13138,40375=>13139,40374=>13140,40380=>13141,40385=>13142,40391=>13143,40394=>13144,40399=>13145,40382=>13146,40389=>13147,40387=>13148,40379=>13149,40373=>13150,40398=>13151,40377=>13152,40378=>13153,40364=>13154,40392=>13155,40369=>13156,40365=>13157,40396=>13158,40371=>13159,40397=>13160,40370=>13161,40570=>13162,40604=>13163,40683=>13164,40686=>13165,40685=>13166,40731=>13167,40728=>13168,40730=>13169,40753=>13170,40782=>13171,40805=>13172,40804=>13173,40850=>13174,20153=>13175,22214=>13176,22213=>13177,22219=>13178,22897=>13179,23371=>13180,23372=>13181,24021=>13182,24017=>13183,24306=>13184,25889=>13185,25888=>13186,25894=>13187,25890=>13188,27403=>13189,27400=>13190,27401=>13191,27661=>13192,28757=>13193,28758=>13194,28759=>13195,28754=>13196,29214=>13197,29215=>13198,29353=>13199,29567=>13200,29912=>13201,29909=>13202,29913=>13203,29911=>13204,30317=>13205,30381=>13206,31029=>13207,31156=>13208,31344=>13209,31345=>13210,31831=>13211,31836=>13212,31833=>13213,31835=>13214,31834=>13215,31988=>13216,31985=>13217,32401=>13218,32591=>13219,32647=>13220,33246=>13221,33387=>13222,34356=>13223,34357=>13224,34355=>13225,34348=>13226,34354=>13227,34358=>13228,34860=>13229,34856=>13230,34854=>13231,34858=>13232,34853=>13233,35185=>13234,35263=>13235,35262=>13236,35323=>13237,35710=>13238,35716=>13239,35714=>13240,35718=>13241,35717=>13242,35711=>13243,36117=>13244,36501=>13245,36500=>13246,36506=>13247,36498=>13248,36496=>13249,36502=>13250,36503=>13251,36704=>13252,36706=>13253,37191=>13254,37964=>13255,37968=>13256,37962=>13257,37963=>13258,37967=>13259,37959=>13260,37957=>13261,37960=>13262,37961=>13263,37958=>13264,38719=>13265,38883=>13266,39018=>13267,39017=>13268,39115=>13269,39252=>13270,39259=>13271,39502=>13272,39507=>13273,39508=>13274,39500=>13275,39503=>13276,39496=>13277,39498=>13278,39497=>13279,39506=>13280,39504=>13281,39632=>13282,39705=>13283,39723=>13284,39739=>13285,39766=>13286,39765=>13287,40006=>13288,40008=>13289,39999=>13290,40004=>13291,39993=>13292,39987=>13293,40001=>13294,39996=>13295,39991=>13296,39988=>13297,39986=>13298,39997=>13299,39990=>13300,40411=>13301,40402=>13302,40414=>13303,40410=>13304,40395=>13305,40400=>13306,40412=>13307,40401=>13308,40415=>13309,40425=>13310,40409=>13311,40408=>13312,40406=>13313,40437=>13314,40405=>13315,40413=>13316,40630=>13317,40688=>13318,40757=>13319,40755=>13320,40754=>13321,40770=>13322,40811=>13323,40853=>13324,40866=>13325,20797=>13326,21145=>13327,22760=>13328,22759=>13329,22898=>13330,23373=>13331,24024=>13332,34863=>13333,24399=>13334,25089=>13335,25091=>13336,25092=>13337,25897=>13338,25893=>13339,26006=>13340,26347=>13341,27409=>13342,27410=>13343,27407=>13344,27594=>13345,28763=>13346,28762=>13347,29218=>13348,29570=>13349,29569=>13350,29571=>13351,30320=>13352,30676=>13353,31847=>13354,31846=>13355,32405=>13356,33388=>13357,34362=>13358,34368=>13359,34361=>13360,34364=>13361,34353=>13362,34363=>13363,34366=>13364,34864=>13365,34866=>13366,34862=>13367,34867=>13368,35190=>13369,35188=>13370,35187=>13371,35326=>13372,35724=>13373,35726=>13374,35723=>13375,35720=>13376,35909=>13377,36121=>13378,36504=>13379,36708=>13380,36707=>13381,37308=>13382,37986=>13383,37973=>13384,37981=>13385,37975=>13386,37982=>13387,38852=>13388,38853=>13389,38912=>13390,39510=>13391,39513=>13392,39710=>13393,39711=>13394,39712=>13395,40018=>13396,40024=>13397,40016=>13398,40010=>13399,40013=>13400,40011=>13401,40021=>13402,40025=>13403,40012=>13404,40014=>13405,40443=>13406,40439=>13407,40431=>13408,40419=>13409,40427=>13410,40440=>13411,40420=>13412,40438=>13413,40417=>13414,40430=>13415,40422=>13416,40434=>13417,40432=>13418,60370=>13418,40418=>13419,40428=>13420,40436=>13421,40435=>13422,40424=>13423,40429=>13424,40642=>13425,40656=>13426,40690=>13427,40691=>13428,40710=>13429,40732=>13430,40760=>13431,40759=>13432,40758=>13433,40771=>13434,40783=>13435,40817=>13436,40816=>13437,40814=>13438,40815=>13439,22227=>13440,22221=>13441,23374=>13442,23661=>13443,25901=>13444,26349=>13445,26350=>13446,27411=>13447,28767=>13448,28769=>13449,28765=>13450,28768=>13451,29219=>13452,29915=>13453,29925=>13454,30677=>13455,31032=>13456,31159=>13457,31158=>13458,31850=>13459,32407=>13460,32649=>13461,33389=>13462,34371=>13463,34872=>13464,34871=>13465,34869=>13466,34891=>13467,35732=>13468,35733=>13469,36510=>13470,36511=>13471,36512=>13472,36509=>13473,37310=>13474,37309=>13475,37314=>13476,37995=>13477,37992=>13478,37993=>13479,38629=>13480,38726=>13481,38723=>13482,38727=>13483,38855=>13484,38885=>13485,39518=>13486,39637=>13487,39769=>13488,40035=>13489,40039=>13490,40038=>13491,40034=>13492,40030=>13493,40032=>13494,40450=>13495,40446=>13496,40455=>13497,40451=>13498,40454=>13499,40453=>13500,40448=>13501,40449=>13502,40457=>13503,40447=>13504,40445=>13505,40452=>13506,40608=>13507,40734=>13508,40774=>13509,40820=>13510,40821=>13511,40822=>13512,22228=>13513,25902=>13514,26040=>13515,27416=>13516,27417=>13517,27415=>13518,27418=>13519,28770=>13520,29222=>13521,29354=>13522,30680=>13523,30681=>13524,31033=>13525,31849=>13526,31851=>13527,31990=>13528,32410=>13529,32408=>13530,32411=>13531,32409=>13532,33248=>13533,33249=>13534,34374=>13535,34375=>13536,34376=>13537,35193=>13538,35194=>13539,35196=>13540,35195=>13541,35327=>13542,35736=>13543,35737=>13544,36517=>13545,36516=>13546,36515=>13547,37998=>13548,37997=>13549,37999=>13550,38001=>13551,38003=>13552,38729=>13553,39026=>13554,39263=>13555,40040=>13556,40046=>13557,40045=>13558,40459=>13559,40461=>13560,40464=>13561,40463=>13562,40466=>13563,40465=>13564,40609=>13565,40693=>13566,40713=>13567,40775=>13568,40824=>13569,40827=>13570,40826=>13571,40825=>13572,22302=>13573,28774=>13574,31855=>13575,34876=>13576,36274=>13577,36518=>13578,37315=>13579,38004=>13580,38008=>13581,38006=>13582,38005=>13583,39520=>13584,39726=>13585,60830=>13585,40052=>13586,40051=>13587,40049=>13588,40053=>13589,40468=>13590,40467=>13591,40694=>13592,40714=>13593,40868=>13594,28776=>13595,28773=>13596,31991=>13597,34410=>13598,34878=>13599,34877=>13600,34879=>13601,35742=>13602,35996=>13603,36521=>13604,36553=>13605,38731=>13606,39027=>13607,39028=>13608,39116=>13609,39265=>13610,39339=>13611,39524=>13612,39526=>13613,39527=>13614,39716=>13615,40469=>13616,40471=>13617,40776=>13618,25095=>13619,27422=>13620,29223=>13621,34380=>13622,36520=>13623,38018=>13624,38016=>13625,38017=>13626,39529=>13627,39528=>13628,40473=>13629,34379=>13630,35743=>13631,38019=>13632,40057=>13633,40631=>13634,30325=>13635,39531=>13636,40058=>13637,40477=>13638,28777=>13639,28778=>13640,29225=>13641,40612=>13642,40830=>13643,40777=>13644,40856=>13645,65049=>13646,65075=>13743,9588=>13744,65076=>13745,65103=>13746,168=>13747,776=>13747,63208=>13747,710=>13748,65342=>13748,63209=>13748,12541=>13749,63210=>13749,12542=>13750,63211=>13750,12445=>13751,63212=>13751,12446=>13752,63213=>13752,12293=>13754,63216=>13754,12294=>13755,63217=>13755,12295=>13756,63218=>13756,12540=>13757,63219=>13757,65339=>13758,63220=>13758,65341=>13759,63221=>13759,10045=>13760,63222=>13760,12353=>13761,63223=>13761,12354=>13762,63224=>13762,12355=>13763,63225=>13763,12356=>13764,63226=>13764,12357=>13765,63227=>13765,12358=>13766,63228=>13766,12359=>13767,63229=>13767,12360=>13768,63230=>13768,12361=>13769,63231=>13769,12362=>13770,63232=>13770,12363=>13771,63233=>13771,12364=>13772,63234=>13772,12365=>13773,63235=>13773,12366=>13774,63236=>13774,12367=>13775,63237=>13775,12368=>13776,63238=>13776,12369=>13777,63239=>13777,12370=>13778,63240=>13778,12371=>13779,63241=>13779,12372=>13780,63242=>13780,12373=>13781,63243=>13781,12374=>13782,63244=>13782,12375=>13783,63245=>13783,12376=>13784,63246=>13784,12377=>13785,63247=>13785,12378=>13786,63248=>13786,12379=>13787,63249=>13787,12380=>13788,63250=>13788,12381=>13789,63251=>13789,12382=>13790,63252=>13790,12383=>13791,63253=>13791,12384=>13792,63254=>13792,12385=>13793,63255=>13793,12386=>13794,63256=>13794,12387=>13795,63257=>13795,12388=>13796,63258=>13796,12389=>13797,63259=>13797,12390=>13798,63260=>13798,12391=>13799,63261=>13799,12392=>13800,63262=>13800,12393=>13801,63263=>13801,12394=>13802,63264=>13802,12395=>13803,63265=>13803,12396=>13804,63266=>13804,12397=>13805,63267=>13805,12398=>13806,63268=>13806,12399=>13807,63269=>13807,12400=>13808,63270=>13808,12401=>13809,63271=>13809,12402=>13810,63272=>13810,12403=>13811,63273=>13811,12404=>13812,63274=>13812,12405=>13813,63275=>13813,12406=>13814,63276=>13814,12407=>13815,63277=>13815,12408=>13816,63278=>13816,12409=>13817,63279=>13817,12410=>13818,63280=>13818,12411=>13819,63281=>13819,12412=>13820,63282=>13820,12413=>13821,63283=>13821,12414=>13822,63284=>13822,12415=>13823,63285=>13823,12416=>13824,63286=>13824,12417=>13825,63287=>13825,12418=>13826,63288=>13826,12419=>13827,63289=>13827,12420=>13828,63290=>13828,12421=>13829,63291=>13829,12422=>13830,63292=>13830,12423=>13831,63293=>13831,12424=>13832,63294=>13832,12425=>13833,63295=>13833,12426=>13834,63296=>13834,12427=>13835,63297=>13835,12428=>13836,63298=>13836,12429=>13837,63299=>13837,12430=>13838,63300=>13838,12431=>13839,63301=>13839,12432=>13840,63302=>13840,12433=>13841,63303=>13841,12434=>13842,63304=>13842,12435=>13843,63305=>13843,12449=>13844,63306=>13844,12450=>13845,63307=>13845,12451=>13846,63308=>13846,12452=>13847,63309=>13847,12453=>13848,63310=>13848,12454=>13849,63311=>13849,12455=>13850,63312=>13850,12456=>13851,63313=>13851,12457=>13852,63314=>13852,12458=>13853,63315=>13853,12459=>13854,63316=>13854,12460=>13855,63317=>13855,12461=>13856,63318=>13856,12462=>13857,63319=>13857,12463=>13858,63320=>13858,12464=>13859,63321=>13859,12465=>13860,63322=>13860,12466=>13861,63323=>13861,12467=>13862,63324=>13862,12468=>13863,63325=>13863,12469=>13864,63326=>13864,12470=>13865,63327=>13865,12471=>13866,63328=>13866,12472=>13867,63329=>13867,12473=>13868,63330=>13868,12474=>13869,63331=>13869,12475=>13870,63332=>13870,12476=>13871,63333=>13871,12477=>13872,63334=>13872,12478=>13873,63335=>13873,12479=>13874,63336=>13874,12480=>13875,63337=>13875,12481=>13876,63338=>13876,12482=>13877,63339=>13877,12483=>13878,63340=>13878,12484=>13879,63341=>13879,12485=>13880,63342=>13880,12486=>13881,63343=>13881,12487=>13882,63344=>13882,12488=>13883,63345=>13883,12489=>13884,63346=>13884,12490=>13885,63347=>13885,12491=>13886,63348=>13886,12492=>13887,63349=>13887,12493=>13888,63350=>13888,12494=>13889,63351=>13889,12495=>13890,63352=>13890,12496=>13891,63353=>13891,12497=>13892,63354=>13892,12498=>13893,63355=>13893,12499=>13894,63356=>13894,12500=>13895,63357=>13895,12501=>13896,63358=>13896,12502=>13897,63359=>13897,12503=>13898,63360=>13898,12504=>13899,63361=>13899,12505=>13900,63362=>13900,12506=>13901,63363=>13901,12507=>13902,63364=>13902,12508=>13903,63365=>13903,12509=>13904,63366=>13904,12510=>13905,63367=>13905,12511=>13906,63368=>13906,12512=>13907,63369=>13907,12513=>13908,63370=>13908,12514=>13909,63371=>13909,12515=>13910,63372=>13910,12516=>13911,63373=>13911,12517=>13912,63374=>13912,12518=>13913,63375=>13913,12519=>13914,63376=>13914,12520=>13915,63377=>13915,12521=>13916,63378=>13916,12522=>13917,63379=>13917,12523=>13918,63380=>13918,12524=>13919,63381=>13919,12525=>13920,63382=>13920,12526=>13921,63383=>13921,12527=>13922,63384=>13922,12528=>13923,63385=>13923,12529=>13924,63386=>13924,12530=>13925,63387=>13925,12531=>13926,63388=>13926,12532=>13927,63389=>13927,12533=>13928,63390=>13928,12534=>13929,63391=>13929,1040=>13930,63392=>13930,1041=>13931,63393=>13931,1042=>13932,63394=>13932,1043=>13933,63395=>13933,1044=>13934,63396=>13934,1045=>13935,63397=>13935,1025=>13936,63398=>13936,1046=>13937,63399=>13937,1047=>13938,63400=>13938,1048=>13939,63401=>13939,1049=>13940,63402=>13940,1050=>13941,63403=>13941,1051=>13942,63404=>13942,1052=>13943,63405=>13943,1053=>13944,63406=>13944,1054=>13945,63407=>13945,1055=>13946,63408=>13946,1056=>13947,63409=>13947,1057=>13948,63410=>13948,1058=>13949,63411=>13949,1059=>13950,63412=>13950,1060=>13951,63413=>13951,1061=>13952,63414=>13952,1062=>13953,63415=>13953,1063=>13954,63416=>13954,1064=>13955,63417=>13955,1065=>13956,63418=>13956,1066=>13957,63419=>13957,1067=>13958,63420=>13958,1068=>13959,63421=>13959,1069=>13960,63422=>13960,1070=>13961,63423=>13961,1071=>13962,63424=>13962,1072=>13963,63425=>13963,1073=>13964,63426=>13964,1074=>13965,63427=>13965,1075=>13966,63428=>13966,1076=>13967,63429=>13967,1077=>13968,63430=>13968,1105=>13969,63431=>13969,1078=>13970,63432=>13970,1079=>13971,63433=>13971,1080=>13972,63434=>13972,1081=>13973,63435=>13973,1082=>13974,63436=>13974,1083=>13975,63437=>13975,1084=>13976,63438=>13976,1085=>13977,63439=>13977,1086=>13978,63440=>13978,1087=>13979,63441=>13979,1088=>13980,63442=>13980,1089=>13981,63443=>13981,1090=>13982,63444=>13982,1091=>13983,63445=>13983,1092=>13984,63446=>13984,1093=>13985,63447=>13985,1094=>13986,63448=>13986,1095=>13987,63449=>13987,1096=>13988,63450=>13988,1097=>13989,63451=>13989,1098=>13990,63452=>13990,1099=>13991,63453=>13991,1100=>13992,63454=>13992,1101=>13993,63455=>13993,1102=>13994,63456=>13994,1103=>13995,63457=>13995,8679=>13996,63458=>13996,8632=>13997,63459=>13997,8633=>13998,63460=>13998,12751=>13999,20033=>13999,63461=>13999,131276=>14000,63462=>14000,20058=>14001,63463=>14001,131210=>14002,63464=>14002,20994=>14003,63465=>14003,17553=>14004,63466=>14004,40880=>14005,63467=>14005,20872=>14006,63468=>14006,13853=>14007,40881=>14007,63469=>14007,161287=>14008,63470=>14008,172=>14049,65506=>14049,63511=>14049,65508=>14050,63512=>14050,65287=>14051,63513=>14051,65282=>14052,63514=>14052,12849=>14053,63515=>14053,8470=>14054,63516=>14054,8481=>14055,63517=>14055,30849=>14056,37561=>14057,58501=>14057,35023=>14058,22715=>14059,24658=>14060,31911=>14061,23290=>14062,9556=>14063,9574=>14064,9559=>14065,9568=>14066,9580=>14067,9571=>14068,9562=>14069,9577=>14070,9565=>14071,9554=>14072,9572=>14073,9557=>14074,9560=>14078,9575=>14079,9563=>14080,9555=>14081,9573=>14082,9558=>14083,9567=>14084,9579=>14085,9570=>14086,9561=>14087,9576=>14088,9564=>14089,9553=>14090,9619=>14096,65517=>14096,65040=>14099,65041=>14100,65042=>14101,65044=>14103,65043=>14104,65046=>14105,65045=>14106,147159=>14123,58129=>14123,22462=>14124,58130=>14124,159443=>14125,58131=>14125,28990=>14126,58132=>14126,153568=>14127,58133=>14127,27042=>14128,58135=>14128,166889=>14129,58136=>14129,23412=>14130,58137=>14130,31305=>14131,58138=>14131,153825=>14132,58139=>14132,169177=>14133,58140=>14133,31333=>14134,58141=>14134,31357=>14135,58142=>14135,154028=>14136,58143=>14136,31419=>14137,58144=>14137,31408=>14138,58145=>14138,31426=>14139,58146=>14139,31427=>14140,58147=>14140,29137=>14141,58148=>14141,156813=>14142,58149=>14142,16842=>14143,58150=>14143,31450=>14144,58151=>14144,31453=>14145,58152=>14145,31466=>14146,58153=>14146,16879=>14147,58154=>14147,21682=>14148,58155=>14148,154625=>14149,58156=>14149,31499=>14150,58157=>14150,31573=>14151,58158=>14151,31529=>14152,58159=>14152,152334=>14153,58160=>14153,154878=>14154,58161=>14154,31650=>14155,58162=>14155,31599=>14156,58163=>14156,33692=>14157,58164=>14157,154548=>14158,58165=>14158,158847=>14159,58166=>14159,31696=>14160,58167=>14160,33825=>14161,58168=>14161,31634=>14162,58169=>14162,58171=>14164,154912=>14164,33938=>14166,58174=>14166,31738=>14167,58175=>14167,31797=>14169,58177=>14169,154817=>14170,58178=>14170,31812=>14171,58179=>14171,31875=>14172,58180=>14172,149634=>14173,58181=>14173,31910=>14174,58182=>14174,148856=>14175,58184=>14175,31945=>14176,58185=>14176,31943=>14177,58186=>14177,31974=>14178,58187=>14178,31987=>14180,58189=>14180,31989=>14181,58190=>14181,32359=>14182,58192=>14182,17693=>14183,58193=>14183,159300=>14184,58194=>14184,32093=>14185,58195=>14185,159446=>14186,58196=>14186,32137=>14187,58198=>14187,32171=>14188,58199=>14188,28981=>14189,58200=>14189,32179=>14190,58201=>14190,32214=>14191,147543=>14192,58203=>14192,155689=>14193,58204=>14193,32228=>14194,58205=>14194,15635=>14195,58206=>14195,32245=>14196,58207=>14196,137209=>14197,58208=>14197,32229=>14198,58209=>14198,164717=>14199,58210=>14199,155937=>14201,58212=>14201,155994=>14202,58213=>14202,32366=>14203,58214=>14203,17195=>14205,58216=>14205,37996=>14206,58217=>14206,32295=>14207,58218=>14207,32576=>14208,58219=>14208,32577=>14209,58220=>14209,32583=>14210,58221=>14210,31030=>14211,58222=>14211,156368=>14212,58223=>14212,39393=>14213,58224=>14213,32663=>14214,58225=>14214,156497=>14215,58226=>14215,32675=>14216,58227=>14216,136801=>14217,58228=>14217,131176=>14218,58229=>14218,17756=>14219,58230=>14219,145254=>14220,58231=>14220,164666=>14221,58233=>14221,32762=>14222,58234=>14222,156809=>14223,58235=>14223,64091=>14224,32776=>14225,58237=>14225,32797=>14226,58238=>14226,32815=>14228,58240=>14228,172167=>14229,58241=>14229,158915=>14230,58242=>14230,32827=>14231,58243=>14231,32828=>14232,58244=>14232,32865=>14233,58245=>14233,141076=>14234,58246=>14234,18825=>14235,58247=>14235,157222=>14236,58248=>14236,146915=>14237,58249=>14237,157416=>14238,58250=>14238,26405=>14239,58251=>14239,32935=>14240,58252=>14240,166472=>14241,58253=>14241,33031=>14242,58254=>14242,33050=>14243,58255=>14243,22704=>14244,58256=>14244,141046=>14245,58257=>14245,27775=>14246,58258=>14246,156824=>14247,58259=>14247,25831=>14248,58261=>14248,136330=>14249,58262=>14249,33304=>14250,58263=>14250,137310=>14251,58264=>14251,27219=>14252,58265=>14252,150117=>14253,58266=>14253,150165=>14254,58267=>14254,17530=>14255,58268=>14255,33321=>14256,58269=>14256,158290=>14257,58271=>14257,146814=>14258,58272=>14258,20473=>14259,58273=>14259,136445=>14260,58274=>14260,34018=>14261,58275=>14261,33634=>14262,58276=>14262,194959=>14263,149927=>14264,58278=>14264,144688=>14265,58279=>14265,137075=>14266,58280=>14266,146936=>14267,58281=>14267,33450=>14268,58282=>14268,26907=>14269,58283=>14269,194964=>14270,58284=>14270,16859=>14271,58285=>14271,34123=>14272,58286=>14272,33488=>14273,58287=>14273,33562=>14274,58288=>14274,134678=>14275,58289=>14275,137140=>14276,58290=>14276,14017=>14277,58291=>14277,143741=>14278,58292=>14278,144730=>14279,58293=>14279,33403=>14280,58294=>14280,33506=>14281,58295=>14281,33560=>14282,58296=>14282,147083=>14283,58297=>14283,159139=>14284,58298=>14284,158469=>14285,58299=>14285,158615=>14286,58300=>14286,144846=>14287,58301=>14287,15807=>14288,58302=>14288,33565=>14289,58303=>14289,21996=>14290,58304=>14290,33669=>14291,58305=>14291,17675=>14292,58306=>14292,159141=>14293,58307=>14293,33708=>14294,58308=>14294,33747=>14296,58310=>14296,159444=>14297,58312=>14297,27223=>14298,58313=>14298,34138=>14299,58314=>14299,13462=>14300,58315=>14300,159298=>14301,58316=>14301,33880=>14302,58318=>14302,154596=>14303,58319=>14303,33905=>14304,58320=>14304,15827=>14305,58321=>14305,17636=>14306,58322=>14306,27303=>14307,58323=>14307,33866=>14308,58324=>14308,31064=>14309,58326=>14309,158614=>14311,58328=>14311,159351=>14312,58329=>14312,159299=>14313,58330=>14313,34014=>14314,58331=>14314,33681=>14316,58333=>14316,17568=>14317,58334=>14317,33939=>14318,58335=>14318,34020=>14319,58336=>14319,154769=>14320,58337=>14320,16960=>14321,58338=>14321,154816=>14322,58339=>14322,17731=>14323,58340=>14323,34100=>14324,58341=>14324,23282=>14325,58342=>14325,17699=>14326,17703=>14327,58344=>14327,34163=>14328,58345=>14328,17686=>14329,58346=>14329,26559=>14330,58347=>14330,34326=>14331,58348=>14331,165413=>14332,58349=>14332,165435=>14333,58350=>14333,34241=>14334,58351=>14334,159880=>14335,58352=>14335,34306=>14336,58353=>14336,136578=>14337,58354=>14337,159949=>14338,58355=>14338,194994=>14339,58356=>14339,17770=>14340,58357=>14340,34344=>14341,58358=>14341,13896=>14342,58359=>14342,137378=>14343,58360=>14343,21495=>14344,58361=>14344,160666=>14345,58362=>14345,34430=>14346,58363=>14346,172280=>14348,58365=>14348,34798=>14349,58366=>14349,142375=>14350,58367=>14350,34737=>14351,58368=>14351,34778=>14352,58369=>14352,34831=>14353,60990=>14353,58370=>14353,22113=>14354,58371=>14354,34412=>14355,58372=>14355,26710=>14356,58373=>14356,17935=>14357,58374=>14357,34885=>14358,58375=>14358,34886=>14359,58376=>14359,161248=>14360,58377=>14360,146873=>14361,58378=>14361,161252=>14362,58379=>14362,34910=>14363,58380=>14363,34972=>14364,58381=>14364,18011=>14365,58382=>14365,34996=>14366,58383=>14366,34997=>14367,58384=>14367,35013=>14368,58386=>14368,161551=>14369,58388=>14369,35207=>14370,58389=>14370,35239=>14374,58393=>14374,35260=>14375,58394=>14375,166437=>14376,58395=>14376,35303=>14377,58396=>14377,162084=>14378,58397=>14378,162493=>14379,58398=>14379,35484=>14380,58399=>14380,30611=>14381,58400=>14381,37374=>14382,58401=>14382,35472=>14383,58402=>14383,162393=>14384,58403=>14384,31465=>14385,58404=>14385,162618=>14386,58405=>14386,18195=>14387,58407=>14387,162616=>14388,58408=>14388,29052=>14389,58409=>14389,35596=>14390,58410=>14390,35615=>14391,58411=>14391,152624=>14392,58412=>14392,152933=>14393,58413=>14393,35647=>14394,58414=>14394,35661=>14396,58416=>14396,35497=>14397,58417=>14397,150138=>14398,58418=>14398,35728=>14399,58419=>14399,35739=>14400,58420=>14400,35503=>14401,58421=>14401,136927=>14402,58422=>14402,17941=>14403,58423=>14403,34895=>14404,58424=>14404,35995=>14405,58425=>14405,163156=>14406,58426=>14406,163215=>14407,58427=>14407,195028=>14408,58428=>14408,14117=>14409,58429=>14409,163155=>14410,58430=>14410,36054=>14411,58431=>14411,163224=>14412,58432=>14412,163261=>14413,58433=>14413,36114=>14414,58434=>14414,36099=>14415,58435=>14415,137488=>14416,58436=>14416,36059=>14417,58437=>14417,28764=>14418,58438=>14418,36113=>14419,58439=>14419,16080=>14420,58441=>14420,195031=>14421,36265=>14422,58443=>14422,163842=>14423,58444=>14423,135188=>14424,58445=>14424,149898=>14425,58446=>14425,15228=>14426,58447=>14426,164284=>14427,58448=>14427,160012=>14428,58449=>14428,31463=>14429,58450=>14429,36525=>14430,58451=>14430,36534=>14431,58452=>14431,36547=>14432,58453=>14432,37588=>14433,58454=>14433,36633=>14434,58455=>14434,36653=>14435,58456=>14435,164709=>14436,58457=>14436,164882=>14437,58458=>14437,36773=>14438,58459=>14438,37635=>14439,58460=>14439,172703=>14440,58461=>14440,133712=>14441,58462=>14441,36787=>14442,58463=>14442,166366=>14444,58465=>14444,165181=>14445,58466=>14445,146875=>14446,58467=>14446,24312=>14447,58468=>14447,143970=>14448,58469=>14448,36857=>14449,58470=>14449,140069=>14451,58474=>14451,14720=>14452,58475=>14452,159447=>14453,58476=>14453,36919=>14454,58477=>14454,165180=>14455,58478=>14455,162494=>14456,58479=>14456,36961=>14457,58480=>14457,165228=>14458,58481=>14458,165387=>14459,58482=>14459,37032=>14460,58483=>14460,165651=>14461,58484=>14461,37060=>14462,58485=>14462,165606=>14463,58486=>14463,37038=>14464,58487=>14464,64038=>14465,37223=>14466,58489=>14466,37289=>14467,58491=>14467,37316=>14468,58492=>14468,31916=>14469,58493=>14469,166195=>14470,58494=>14470,138889=>14471,58495=>14471,37390=>14472,58496=>14472,27807=>14473,58497=>14473,37441=>14474,58498=>14474,37474=>14475,58499=>14475,153017=>14476,58500=>14476,166598=>14477,58502=>14477,146587=>14478,58503=>14478,166668=>14479,58504=>14479,153051=>14480,58505=>14480,134449=>14481,58506=>14481,37676=>14482,58507=>14482,37739=>14483,58508=>14483,166625=>14484,58509=>14484,166891=>14485,58510=>14485,23235=>14486,58512=>14486,166626=>14487,58513=>14487,166629=>14488,58514=>14488,18789=>14489,58515=>14489,37444=>14490,58516=>14490,166892=>14491,58517=>14491,166969=>14492,58518=>14492,166911=>14493,58519=>14493,37747=>14494,58520=>14494,37979=>14495,58521=>14495,36540=>14496,58522=>14496,38277=>14497,58523=>14497,38310=>14498,58524=>14498,37926=>14499,58525=>14499,38304=>14500,58526=>14500,28662=>14501,58527=>14501,17081=>14502,58528=>14502,165592=>14503,58530=>14503,135804=>14504,58531=>14504,146990=>14505,58532=>14505,18911=>14506,58533=>14506,27676=>14507,58534=>14507,38523=>14508,58535=>14508,38550=>14509,58536=>14509,16748=>14510,58537=>14510,38563=>14511,58538=>14511,159445=>14512,58539=>14512,25050=>14513,58540=>14513,58541=>14514,30965=>14515,58542=>14515,166624=>14516,58543=>14516,38589=>14517,58544=>14517,21452=>14518,58545=>14518,18849=>14519,58546=>14519,158904=>14520,58547=>14520,131700=>14521,58548=>14521,156688=>14522,58549=>14522,168111=>14523,58550=>14523,168165=>14524,58551=>14524,150225=>14525,58552=>14525,137493=>14526,58553=>14526,144138=>14527,58554=>14527,38705=>14528,58555=>14528,34370=>14529,58556=>14529,38710=>14530,58557=>14530,18959=>14531,58558=>14531,17725=>14532,58559=>14532,17797=>14533,58560=>14533,150249=>14534,58561=>14534,28789=>14535,58562=>14535,23361=>14536,58563=>14536,38683=>14537,58564=>14537,168405=>14539,58566=>14539,38743=>14540,58567=>14540,23370=>14541,58568=>14541,168427=>14542,58569=>14542,38751=>14543,58570=>14543,37925=>14544,58571=>14544,20688=>14545,58572=>14545,143543=>14546,58573=>14546,143548=>14547,58574=>14547,38793=>14548,58575=>14548,38815=>14549,58576=>14549,38833=>14550,58577=>14550,38846=>14551,58578=>14551,38848=>14552,58579=>14552,38866=>14553,58580=>14553,38880=>14554,58581=>14554,152684=>14555,58582=>14555,38894=>14556,58583=>14556,29724=>14557,58584=>14557,169011=>14558,58585=>14558,38901=>14560,58587=>14560,168989=>14561,58588=>14561,162170=>14562,58589=>14562,19153=>14563,58590=>14563,38964=>14564,58591=>14564,38963=>14565,58592=>14565,38987=>14566,58593=>14566,39014=>14567,58594=>14567,15118=>14568,58595=>14568,160117=>14569,58596=>14569,15697=>14570,58597=>14570,132656=>14571,58598=>14571,147804=>14572,58599=>14572,153350=>14573,58600=>14573,39114=>14574,58601=>14574,39095=>14575,58602=>14575,39112=>14576,58603=>14576,39111=>14577,58604=>14577,19199=>14578,58605=>14578,159015=>14579,58606=>14579,136915=>14580,58607=>14580,21936=>14581,58608=>14581,39137=>14582,58609=>14582,39142=>14583,58610=>14583,39148=>14584,58611=>14584,37752=>14585,58612=>14585,39225=>14586,58613=>14586,150057=>14587,58614=>14587,19314=>14588,58615=>14588,170071=>14589,58616=>14589,170245=>14590,58617=>14590,39413=>14591,58618=>14591,39436=>14592,58619=>14592,39483=>14593,58620=>14593,39440=>14594,58621=>14594,39512=>14595,58622=>14595,153381=>14596,58623=>14596,14020=>14597,58624=>14597,168113=>14598,58625=>14598,170965=>14599,58626=>14599,39648=>14600,58627=>14600,39650=>14601,58628=>14601,170757=>14602,58629=>14602,39668=>14603,58630=>14603,19470=>14604,58631=>14604,39700=>14605,58632=>14605,39725=>14606,58633=>14606,165376=>14607,58634=>14607,20532=>14608,58635=>14608,39732=>14609,58636=>14609,14531=>14610,58638=>14610,143485=>14611,58639=>14611,39760=>14612,58640=>14612,39744=>14613,58641=>14613,171326=>14614,58642=>14614,23109=>14615,58643=>14615,137315=>14616,58644=>14616,39822=>14617,58645=>14617,39938=>14618,58647=>14618,39935=>14619,58648=>14619,39948=>14620,58649=>14620,171624=>14621,58650=>14621,40404=>14622,58651=>14622,171959=>14623,58652=>14623,172434=>14624,58653=>14624,172459=>14625,58654=>14625,172257=>14626,58655=>14626,172323=>14627,58656=>14627,172511=>14628,58657=>14628,40318=>14629,58658=>14629,40323=>14630,58659=>14630,172340=>14631,58660=>14631,40462=>14632,58661=>14632,40388=>14633,58663=>14633,172435=>14634,58665=>14634,172576=>14635,58666=>14635,137531=>14636,58667=>14636,172595=>14637,58668=>14637,40249=>14638,58669=>14638,172217=>14639,58670=>14639,172724=>14640,58671=>14640,40592=>14641,58672=>14641,40597=>14642,58673=>14642,40606=>14643,58674=>14643,40610=>14644,58675=>14644,19764=>14645,58676=>14645,40618=>14646,58677=>14646,40623=>14647,58678=>14647,148324=>14648,58679=>14648,40641=>14649,58680=>14649,15200=>14650,58681=>14650,14821=>14651,58682=>14651,15645=>14652,58683=>14652,20274=>14653,58684=>14653,14270=>14654,58685=>14654,166955=>14655,58686=>14655,40706=>14656,58687=>14656,40712=>14657,58688=>14657,19350=>14658,58689=>14658,37924=>14659,58690=>14659,159138=>14660,58691=>14660,40727=>14661,60836=>14661,58692=>14661,195099=>14662,40761=>14663,58694=>14663,22175=>14664,58695=>14664,22154=>14665,58696=>14665,40773=>14666,58697=>14666,39352=>14667,58698=>14667,168075=>14668,58699=>14668,38898=>14669,58700=>14669,33919=>14670,58701=>14670,40809=>14672,58703=>14672,31452=>14673,58704=>14673,40846=>14674,58705=>14674,29206=>14675,58706=>14675,19390=>14676,58707=>14676,149877=>14677,58708=>14677,149947=>14678,58709=>14678,29047=>14679,58710=>14679,150008=>14680,58711=>14680,148296=>14681,58712=>14681,150097=>14682,58713=>14682,29598=>14683,58714=>14683,166874=>14684,58715=>14684,137466=>14685,58716=>14685,31135=>14686,58717=>14686,166270=>14687,58718=>14687,167478=>14688,58719=>14688,37737=>14689,58720=>14689,37875=>14690,58721=>14690,166468=>14691,58722=>14691,37612=>14692,58723=>14692,37761=>14693,58724=>14693,37835=>14694,58725=>14694,166252=>14695,58726=>14695,148665=>14696,58727=>14696,29207=>14697,58728=>14697,16107=>14698,58729=>14698,30578=>14699,58730=>14699,31299=>14700,58731=>14700,28880=>14701,58732=>14701,148595=>14702,58733=>14702,148472=>14703,58734=>14703,29054=>14704,58735=>14704,137199=>14705,58736=>14705,28835=>14706,58737=>14706,137406=>14707,58738=>14707,144793=>14708,58739=>14708,16071=>14709,58740=>14709,137349=>14710,58741=>14710,152623=>14711,58742=>14711,137208=>14712,58743=>14712,14114=>14713,58744=>14713,136955=>14714,58745=>14714,137273=>14715,58746=>14715,14049=>14716,58747=>14716,137076=>14717,58748=>14717,137425=>14718,58749=>14718,155467=>14719,58750=>14719,14115=>14720,58751=>14720,136896=>14721,58752=>14721,22363=>14722,58753=>14722,150053=>14723,58754=>14723,136190=>14724,58755=>14724,135848=>14725,58756=>14725,136134=>14726,58757=>14726,136374=>14727,58758=>14727,34051=>14728,58761=>14728,58759=>14728,145062=>14729,58760=>14729,33877=>14731,58762=>14731,149908=>14732,58763=>14732,160101=>14733,58764=>14733,146993=>14734,58765=>14734,152924=>14735,58766=>14735,147195=>14736,58767=>14736,159826=>14737,58768=>14737,17652=>14738,58769=>14738,145134=>14739,58770=>14739,170397=>14740,58771=>14740,159526=>14741,58772=>14741,26617=>14742,58773=>14742,14131=>14743,58774=>14743,15381=>14744,58775=>14744,15847=>14745,58776=>14745,22636=>14746,58777=>14746,137506=>14747,58778=>14747,26640=>14748,58779=>14748,16471=>14749,58780=>14749,145215=>14750,58781=>14750,147681=>14751,58782=>14751,147595=>14752,58783=>14752,147727=>14753,58784=>14753,158753=>14754,58785=>14754,21707=>14755,58786=>14755,22174=>14756,58787=>14756,157361=>14757,58788=>14757,22162=>14758,58789=>14758,135135=>14759,58790=>14759,134056=>14760,58791=>14760,134669=>14761,58792=>14761,166675=>14763,58794=>14763,37788=>14764,58795=>14764,20216=>14765,58796=>14765,20779=>14766,58797=>14766,14361=>14767,58798=>14767,148534=>14768,58799=>14768,20156=>14769,58800=>14769,132197=>14770,58801=>14770,20299=>14772,58803=>14772,20362=>14773,58804=>14773,153169=>14774,58805=>14774,23144=>14775,58806=>14775,131499=>14776,58807=>14776,132043=>14777,58808=>14777,14745=>14778,58809=>14778,131850=>14779,58810=>14779,132116=>14780,58811=>14780,13365=>14781,58812=>14781,20265=>14782,58813=>14782,131776=>14783,58814=>14783,167603=>14784,58815=>14784,131701=>14785,58816=>14785,35546=>14786,58817=>14786,131596=>14787,58818=>14787,20120=>14788,58819=>14788,20685=>14789,58820=>14789,20749=>14790,58821=>14790,20386=>14791,58822=>14791,20227=>14792,58823=>14792,150030=>14793,58824=>14793,147082=>14794,58825=>14794,20290=>14795,58826=>14795,20526=>14796,58827=>14796,20588=>14797,58828=>14797,20609=>14798,58829=>14798,20428=>14799,58830=>14799,20453=>14800,58831=>14800,20568=>14801,58832=>14801,20732=>14802,58833=>14802,28278=>14803,58838=>14803,144789=>14804,58839=>14804,147001=>14805,58840=>14805,147135=>14806,58841=>14806,28018=>14807,58842=>14807,137348=>14808,58843=>14808,147081=>14809,58844=>14809,20904=>14810,58845=>14810,20931=>14811,58846=>14811,132576=>14812,58847=>14812,17629=>14813,58848=>14813,132259=>14814,58849=>14814,132242=>14815,58850=>14815,132241=>14816,58851=>14816,36218=>14817,58852=>14817,166556=>14818,58853=>14818,132878=>14819,58854=>14819,21081=>14820,58855=>14820,21156=>14821,58856=>14821,133235=>14822,58857=>14822,21217=>14823,58858=>14823,18042=>14825,58860=>14825,29068=>14826,58861=>14826,148364=>14827,58862=>14827,134176=>14828,58863=>14828,149932=>14829,58864=>14829,135396=>14830,58865=>14830,27089=>14831,58866=>14831,134685=>14832,58867=>14832,16094=>14834,58869=>14834,29849=>14835,58870=>14835,29716=>14836,58871=>14836,29782=>14837,58872=>14837,29592=>14838,58873=>14838,19342=>14839,58874=>14839,150204=>14840,58875=>14840,147597=>14841,58876=>14841,21456=>14842,58877=>14842,13700=>14843,58878=>14843,29199=>14844,58879=>14844,147657=>14845,58880=>14845,21940=>14846,58881=>14846,131909=>14847,58882=>14847,21709=>14848,58883=>14848,134086=>14849,58884=>14849,22301=>14850,58885=>14850,37469=>14851,58886=>14851,38644=>14852,58887=>14852,22493=>14853,58889=>14853,22413=>14854,58890=>14854,22399=>14855,58891=>14855,13886=>14856,58892=>14856,22731=>14857,58893=>14857,23193=>14858,58894=>14858,166470=>14859,58895=>14859,136954=>14860,58896=>14860,137071=>14861,58897=>14861,136976=>14862,58898=>14862,23084=>14863,58899=>14863,22968=>14864,58900=>14864,23166=>14865,58902=>14865,23247=>14866,58903=>14866,23058=>14867,58904=>14867,153926=>14868,58905=>14868,137715=>14869,58906=>14869,137313=>14870,58907=>14870,148117=>14871,58908=>14871,14069=>14872,58909=>14872,27909=>14873,58910=>14873,29763=>14874,58911=>14874,23073=>14875,58912=>14875,155267=>14876,58913=>14876,23169=>14877,58914=>14877,166871=>14878,58915=>14878,132115=>14879,58916=>14879,37856=>14880,58917=>14880,29836=>14881,58918=>14881,135939=>14882,58919=>14882,28933=>14883,58920=>14883,18802=>14884,58921=>14884,37896=>14885,58922=>14885,166395=>14886,58923=>14886,37821=>14887,58924=>14887,14240=>14888,58925=>14888,23582=>14889,58926=>14889,23710=>14890,58927=>14890,24158=>14891,58928=>14891,24136=>14892,58929=>14892,137622=>14893,58930=>14893,137596=>14894,58931=>14894,146158=>14895,58932=>14895,24269=>14896,58933=>14896,23375=>14897,58934=>14897,58935=>14898,137475=>14898,58936=>14899,137476=>14899,14081=>14900,58937=>14900,137376=>14901,58938=>14901,14045=>14902,58939=>14902,136958=>14903,58940=>14903,14035=>14904,58941=>14904,33066=>14905,58942=>14905,166471=>14906,58943=>14906,138682=>14907,58944=>14907,144498=>14908,58945=>14908,166312=>14909,58946=>14909,24332=>14910,60916=>14910,58947=>14910,24334=>14911,58948=>14911,137511=>14912,58949=>14912,137131=>14913,58950=>14913,23147=>14914,58951=>14914,137019=>14915,58952=>14915,23364=>14916,58953=>14916,161277=>14917,58955=>14917,34912=>14918,58956=>14918,24702=>14919,58957=>14919,141408=>14920,58958=>14920,140843=>14921,58959=>14921,24539=>14922,58960=>14922,16056=>14923,58961=>14923,140719=>14924,58962=>14924,140734=>14925,58963=>14925,168072=>14926,58964=>14926,159603=>14927,58965=>14927,25024=>14928,58966=>14928,131134=>14929,58967=>14929,131142=>14930,58968=>14930,140827=>14931,58969=>14931,24985=>14932,58970=>14932,24984=>14933,58971=>14933,24693=>14934,58972=>14934,142491=>14935,58973=>14935,142599=>14936,58974=>14936,149204=>14937,58975=>14937,168269=>14938,58976=>14938,25713=>14939,58977=>14939,149093=>14940,58978=>14940,142186=>14941,58979=>14941,14889=>14942,58980=>14942,142114=>14943,58981=>14943,144464=>14944,58982=>14944,170218=>14945,58983=>14945,142968=>14946,58984=>14946,25399=>14947,58985=>14947,25782=>14948,58987=>14948,25393=>14949,58988=>14949,25553=>14950,58989=>14950,149987=>14951,58990=>14951,142695=>14952,58991=>14952,25252=>14953,58992=>14953,142497=>14954,58993=>14954,25659=>14955,58994=>14955,25963=>14956,58995=>14956,26994=>14957,58996=>14957,15348=>14958,58997=>14958,143502=>14959,58998=>14959,144045=>14960,58999=>14960,149897=>14961,59000=>14961,144043=>14962,59001=>14962,21773=>14963,59002=>14963,144096=>14964,59003=>14964,137433=>14965,59004=>14965,169023=>14966,59005=>14966,26318=>14967,59006=>14967,144009=>14968,59007=>14968,143795=>14969,59008=>14969,15072=>14970,59009=>14970,152964=>14971,59011=>14971,166690=>14972,59012=>14972,152975=>14973,59013=>14973,136956=>14974,59014=>14974,152923=>14975,59015=>14975,152613=>14976,59016=>14976,30958=>14977,59017=>14977,143619=>14978,59018=>14978,137258=>14979,59019=>14979,143924=>14980,59020=>14980,13412=>14981,59021=>14981,143887=>14982,59022=>14982,143746=>14983,59023=>14983,148169=>14984,59024=>14984,26254=>14985,59025=>14985,159012=>14986,59026=>14986,26219=>14987,59027=>14987,19347=>14988,59028=>14988,26160=>14989,59029=>14989,161904=>14990,59030=>14990,138731=>14991,59031=>14991,26211=>14992,59032=>14992,144082=>14993,59033=>14993,144097=>14994,59034=>14994,26142=>14995,59035=>14995,153714=>14996,59036=>14996,14545=>14997,59037=>14997,145466=>14998,59038=>14998,145340=>14999,59039=>14999,15257=>15000,59040=>15000,145314=>15001,59041=>15001,144382=>15002,59042=>15002,29904=>15003,59043=>15003,15254=>15004,59044=>15004,149034=>15005,59046=>15005,26806=>15006,59047=>15006,15300=>15008,59049=>15008,27326=>15009,59050=>15009,145365=>15010,59052=>15010,148615=>15011,59053=>15011,27187=>15012,59054=>15012,27218=>15013,59055=>15013,27337=>15014,59056=>15014,27397=>15015,59057=>15015,137490=>15016,59058=>15016,25873=>15017,59059=>15017,26776=>15018,59060=>15018,27212=>15019,59061=>15019,15319=>15020,59062=>15020,27258=>15021,59063=>15021,27479=>15022,59064=>15022,147392=>15023,59065=>15023,146586=>15024,59066=>15024,37792=>15025,59067=>15025,37618=>15026,59068=>15026,166890=>15027,59069=>15027,166603=>15028,59070=>15028,37513=>15029,59071=>15029,163870=>15030,59072=>15030,166364=>15031,59073=>15031,37991=>15032,59074=>15032,28069=>15033,59075=>15033,28427=>15034,59076=>15034,147327=>15036,59079=>15036,15759=>15037,59080=>15037,28164=>15038,59081=>15038,147516=>15039,59082=>15039,23101=>15040,59083=>15040,28170=>15041,59084=>15041,22599=>15042,59085=>15042,27940=>15043,59086=>15043,30786=>15044,59087=>15044,28987=>15045,59088=>15045,148250=>15046,59089=>15046,148086=>15047,59090=>15047,28913=>15048,59091=>15048,29264=>15049,61085=>15049,59092=>15049,29319=>15050,59093=>15050,29332=>15051,59094=>15051,149391=>15052,59095=>15052,149285=>15053,59096=>15053,20857=>15054,59097=>15054,150180=>15055,59098=>15055,132587=>15056,59099=>15056,29818=>15057,59100=>15057,147192=>15058,59101=>15058,144991=>15059,59102=>15059,150090=>15060,59103=>15060,149783=>15061,59104=>15061,155617=>15062,59105=>15062,16134=>15063,59106=>15063,16049=>15064,59107=>15064,150239=>15065,59108=>15065,166947=>15066,59109=>15066,147253=>15067,59110=>15067,24743=>15068,59111=>15068,16115=>15069,59112=>15069,29900=>15070,59113=>15070,29756=>15071,59114=>15071,37767=>15072,59115=>15072,29751=>15073,59116=>15073,17567=>15074,59117=>15074,159210=>15075,59118=>15075,17745=>15076,59119=>15076,30083=>15077,59120=>15077,16227=>15078,59121=>15078,150745=>15079,59122=>15079,150790=>15080,59123=>15080,16216=>15081,59124=>15081,30037=>15082,59125=>15082,30323=>15083,59126=>15083,173510=>15084,59127=>15084,29800=>15086,61070=>15086,59129=>15086,166604=>15087,59130=>15087,149931=>15088,59131=>15088,149902=>15089,59132=>15089,15099=>15090,59133=>15090,15821=>15091,59134=>15091,150094=>15092,59135=>15092,16127=>15093,59136=>15093,149957=>15094,59137=>15094,149747=>15095,59138=>15095,37370=>15096,59139=>15096,22322=>15097,59140=>15097,37698=>15098,59141=>15098,166627=>15099,59142=>15099,137316=>15100,59143=>15100,20703=>15101,59144=>15101,152097=>15102,59145=>15102,152039=>15103,59146=>15103,30584=>15104,59147=>15104,143922=>15105,59148=>15105,30478=>15106,59149=>15106,30479=>15107,59150=>15107,30587=>15108,59151=>15108,149143=>15109,59152=>15109,145281=>15110,59153=>15110,14942=>15111,59154=>15111,149744=>15112,59155=>15112,29752=>15113,59156=>15113,29851=>15114,59157=>15114,16063=>15115,59158=>15115,150202=>15116,59159=>15116,150215=>15117,59160=>15117,16584=>15118,59161=>15118,150166=>15119,59162=>15119,156078=>15120,59163=>15120,37639=>15121,59164=>15121,152961=>15122,59165=>15122,30750=>15123,59166=>15123,30861=>15124,59167=>15124,30856=>15125,59168=>15125,30930=>15126,59169=>15126,29648=>15127,59170=>15127,31065=>15128,59171=>15128,161601=>15129,59172=>15129,153315=>15130,59173=>15130,16654=>15131,59174=>15131,31141=>15134,59177=>15134,27181=>15135,59178=>15135,147194=>15136,59179=>15136,31290=>15137,59180=>15137,31220=>15138,59181=>15138,16750=>15139,59182=>15139,136934=>15140,59183=>15140,16690=>15141,59184=>15141,37429=>15142,59185=>15142,31217=>15143,59186=>15143,134476=>15144,59187=>15144,149900=>15145,59188=>15145,131737=>15146,59189=>15146,146874=>15147,59190=>15147,137070=>15148,59191=>15148,13719=>15149,59192=>15149,21867=>15150,59193=>15150,13680=>15151,59194=>15151,13994=>15152,59195=>15152,131540=>15153,59196=>15153,134157=>15154,59197=>15154,31458=>15155,59198=>15155,23129=>15156,59199=>15156,141045=>15157,59200=>15157,154287=>15158,59201=>15158,154268=>15159,59202=>15159,23053=>15160,59203=>15160,131675=>15161,59204=>15161,30960=>15162,59205=>15162,23082=>15163,59206=>15163,154566=>15164,59207=>15164,31486=>15165,59208=>15165,16889=>15166,59209=>15166,31837=>15167,59210=>15167,31853=>15168,59211=>15168,16913=>15169,59212=>15169,154547=>15170,59213=>15170,155324=>15171,59214=>15171,155302=>15172,59215=>15172,31949=>15173,59216=>15173,150009=>15174,59217=>15174,137136=>15175,59218=>15175,31886=>15176,59219=>15176,31868=>15177,59220=>15177,31918=>15178,59221=>15178,27314=>15179,59222=>15179,32220=>15180,59223=>15180,32263=>15181,59224=>15181,32211=>15182,59225=>15182,32590=>15183,59226=>15183,156257=>15184,59227=>15184,155996=>15185,59228=>15185,162632=>15186,59229=>15186,32151=>15187,59230=>15187,155266=>15188,59231=>15188,17002=>15189,59232=>15189,158581=>15190,59233=>15190,133398=>15191,59234=>15191,26582=>15192,59235=>15192,131150=>15193,59236=>15193,144847=>15194,59237=>15194,22468=>15195,59238=>15195,156690=>15196,59239=>15196,156664=>15197,59240=>15197,32733=>15198,59242=>15198,31527=>15199,59243=>15199,133164=>15200,59244=>15200,154345=>15201,59245=>15201,154947=>15202,59246=>15202,31500=>15203,59247=>15203,155150=>15204,59248=>15204,39398=>15205,59249=>15205,34373=>15206,59250=>15206,39523=>15207,59251=>15207,27164=>15208,59252=>15208,144447=>15209,59253=>15209,150007=>15210,59255=>15210,157101=>15211,59256=>15211,39455=>15212,59257=>15212,157088=>15213,59258=>15213,33941=>15214,160039=>15215,59260=>15215,158929=>15216,59261=>15216,17642=>15217,59262=>15217,33079=>15218,59263=>15218,17410=>15219,59264=>15219,32966=>15220,59265=>15220,33033=>15221,59266=>15221,33090=>15222,59267=>15222,157620=>15223,59268=>15223,39107=>15224,59269=>15224,158274=>15225,59270=>15225,33378=>15226,59271=>15226,33381=>15227,59272=>15227,158289=>15228,59273=>15228,33875=>15229,59274=>15229,159143=>15230,59275=>15230,34320=>15231,59276=>15231,160283=>15232,59277=>15232,23174=>15233,59278=>15233,16767=>15234,59279=>15234,137280=>15235,59280=>15235,23339=>15236,59281=>15236,137377=>15237,59282=>15237,23268=>15238,59283=>15238,137432=>15239,59284=>15239,34464=>15240,59285=>15240,195004=>15241,59286=>15241,146831=>15242,59287=>15242,34861=>15243,59288=>15243,160802=>15244,59289=>15244,23042=>15245,59290=>15245,34926=>15246,59291=>15246,20293=>15247,59292=>15247,34951=>15248,59293=>15248,35007=>15249,59294=>15249,35046=>15250,59295=>15250,35173=>15251,59296=>15251,35149=>15252,59297=>15252,153219=>15253,59298=>15253,35156=>15254,59299=>15254,161669=>15255,59300=>15255,161668=>15256,59301=>15256,166901=>15257,59302=>15257,166873=>15258,59303=>15258,166812=>15259,59304=>15259,166393=>15260,59305=>15260,16045=>15261,59306=>15261,33955=>15262,59307=>15262,18165=>15263,59308=>15263,18127=>15264,59309=>15264,14322=>15265,59310=>15265,35389=>15266,59311=>15266,35356=>15267,59312=>15267,169032=>15268,59313=>15268,24397=>15269,59314=>15269,37419=>15270,59315=>15270,148100=>15271,59316=>15271,26068=>15272,59317=>15272,28969=>15273,59318=>15273,28868=>15274,59319=>15274,137285=>15275,59320=>15275,40301=>15276,59321=>15276,35999=>15277,59322=>15277,36073=>15278,59323=>15278,163292=>15279,59324=>15279,22938=>15280,59325=>15280,30659=>15281,59326=>15281,23024=>15282,59327=>15282,14036=>15283,59329=>15283,36394=>15284,59330=>15284,36519=>15285,59331=>15285,150537=>15286,59332=>15286,36656=>15287,59333=>15287,36682=>15288,59334=>15288,17140=>15289,59335=>15289,27736=>15290,59336=>15290,28603=>15291,59337=>15291,140065=>15292,59338=>15292,18587=>15293,59339=>15293,28537=>15294,59340=>15294,28299=>15295,59341=>15295,137178=>15296,59342=>15296,39913=>15297,59343=>15297,14005=>15298,59344=>15298,149807=>15299,59345=>15299,37051=>15300,59346=>15300,18612=>15301,21873=>15302,59348=>15302,18694=>15303,59349=>15303,37307=>15304,59350=>15304,37892=>15305,59351=>15305,166475=>15306,59352=>15306,16482=>15307,59353=>15307,166652=>15308,59354=>15308,37927=>15309,59355=>15309,166941=>15310,59356=>15310,166971=>15311,59357=>15311,34021=>15312,59358=>15312,35371=>15313,59359=>15313,38297=>15314,59360=>15314,38311=>15315,59361=>15315,38295=>15316,59362=>15316,38294=>15317,59363=>15317,167220=>15318,59364=>15318,29765=>15319,59365=>15319,16066=>15320,59366=>15320,149759=>15321,59367=>15321,150082=>15322,59368=>15322,148458=>15323,59369=>15323,16103=>15324,59370=>15324,143909=>15325,59371=>15325,38543=>15326,59372=>15326,167655=>15327,59373=>15327,167526=>15328,59374=>15328,167525=>15329,59375=>15329,16076=>15330,59376=>15330,149997=>15331,59377=>15331,150136=>15332,59378=>15332,147438=>15333,59379=>15333,29714=>15334,59380=>15334,29803=>15335,59381=>15335,16124=>15336,59382=>15336,38721=>15337,59383=>15337,168112=>15338,59384=>15338,26695=>15339,59385=>15339,18973=>15340,59386=>15340,168083=>15341,59387=>15341,153567=>15342,59388=>15342,37736=>15344,59390=>15344,166281=>15345,59391=>15345,166950=>15346,59392=>15346,166703=>15347,59393=>15347,156606=>15348,59394=>15348,37562=>15349,59395=>15349,23313=>15350,59396=>15350,35689=>15351,59397=>15351,18748=>15352,59398=>15352,29689=>15353,59399=>15353,147995=>15354,59400=>15354,38811=>15355,59401=>15355,39224=>15357,59403=>15357,134950=>15358,59404=>15358,24001=>15359,59405=>15359,166853=>15360,59406=>15360,150194=>15361,59407=>15361,38943=>15362,59408=>15362,169178=>15363,59409=>15363,37622=>15364,59410=>15364,169431=>15365,59411=>15365,37349=>15366,59412=>15366,17600=>15367,59413=>15367,166736=>15368,59414=>15368,150119=>15369,59415=>15369,166756=>15370,59416=>15370,39132=>15371,59417=>15371,166469=>15372,59418=>15372,16128=>15373,59419=>15373,37418=>15374,59420=>15374,18725=>15375,59421=>15375,33812=>15376,59422=>15376,39227=>15377,59423=>15377,39245=>15378,59424=>15378,162566=>15379,59425=>15379,15869=>15380,59426=>15380,19311=>15382,59428=>15382,39338=>15383,59429=>15383,39516=>15384,59430=>15384,166757=>15385,59431=>15385,153800=>15386,59432=>15386,27279=>15387,59433=>15387,39457=>15388,59434=>15388,23294=>15389,59435=>15389,39471=>15390,59436=>15390,170225=>15391,59437=>15391,19344=>15392,59438=>15392,170312=>15393,59439=>15393,39356=>15394,59440=>15394,19389=>15395,59441=>15395,19351=>15396,59442=>15396,37757=>15397,59443=>15397,22642=>15398,59444=>15398,135938=>15399,59445=>15399,22562=>15400,59446=>15400,149944=>15401,59447=>15401,136424=>15402,59448=>15402,30788=>15403,59449=>15403,141087=>15404,59450=>15404,146872=>15405,59451=>15405,26821=>15406,59452=>15406,15741=>15407,59453=>15407,37976=>15408,59454=>15408,14631=>15409,59455=>15409,24912=>15410,59456=>15410,141185=>15411,59457=>15411,141675=>15412,59458=>15412,24839=>15413,59459=>15413,40015=>15414,59460=>15414,40019=>15415,59461=>15415,40059=>15416,59462=>15416,39989=>15417,59463=>15417,39952=>15418,59464=>15418,39807=>15419,59465=>15419,39887=>15420,59466=>15420,171565=>15421,59467=>15421,39839=>15422,59468=>15422,172533=>15423,59469=>15423,172286=>15424,59470=>15424,40225=>15425,59471=>15425,19630=>15426,59472=>15426,147716=>15427,59473=>15427,40472=>15428,59474=>15428,19632=>15429,59475=>15429,40204=>15430,59476=>15430,172468=>15431,59477=>15431,172269=>15432,59478=>15432,172275=>15433,59479=>15433,170287=>15434,59480=>15434,40357=>15435,59481=>15435,33981=>15436,59482=>15436,159250=>15437,59483=>15437,159711=>15438,59484=>15438,158594=>15439,59485=>15439,34300=>15440,59486=>15440,17715=>15441,59487=>15441,159140=>15442,59488=>15442,159364=>15443,59489=>15443,159216=>15444,59490=>15444,33824=>15445,59491=>15445,34286=>15446,59492=>15446,159232=>15447,59493=>15447,145367=>15448,59494=>15448,155748=>15449,59495=>15449,31202=>15450,59496=>15450,144796=>15451,59497=>15451,144960=>15452,59498=>15452,149982=>15453,59500=>15453,15714=>15454,59501=>15454,37851=>15455,59502=>15455,37566=>15456,59503=>15456,37704=>15457,59504=>15457,131775=>15458,59505=>15458,30905=>15459,59506=>15459,37495=>15460,59507=>15460,37965=>15461,59508=>15461,20452=>15462,59509=>15462,13376=>15463,59510=>15463,36964=>15464,59511=>15464,152925=>15465,59512=>15465,30781=>15466,59513=>15466,30804=>15467,59514=>15467,30902=>15468,59515=>15468,30795=>15469,59516=>15469,137047=>15470,59517=>15470,143817=>15471,59518=>15471,149825=>15472,59519=>15472,13978=>15473,59520=>15473,20338=>15474,59521=>15474,28634=>15475,59522=>15475,28633=>15476,59523=>15476,28702=>15478,59524=>15478,59525=>15478,21524=>15479,59526=>15479,147893=>15480,59527=>15480,22459=>15481,59528=>15481,22771=>15482,59529=>15482,22410=>15483,59530=>15483,40214=>15484,59531=>15484,22487=>15485,59532=>15485,28980=>15486,59533=>15486,13487=>15487,59534=>15487,147884=>15488,59535=>15488,29163=>15489,59536=>15489,158784=>15490,59537=>15490,151447=>15491,59538=>15491,137141=>15493,59540=>15493,166473=>15494,59541=>15494,24844=>15495,59542=>15495,23246=>15496,59543=>15496,23051=>15497,59544=>15497,17084=>15498,59545=>15498,148616=>15499,59546=>15499,14124=>15500,59547=>15500,19323=>15501,59548=>15501,166396=>15502,59549=>15502,37819=>15503,59550=>15503,37816=>15504,59551=>15504,137430=>15505,59552=>15505,134941=>15506,59553=>15506,33906=>15507,59554=>15507,158912=>15508,59555=>15508,136211=>15509,59556=>15509,148218=>15510,59557=>15510,142374=>15511,59558=>15511,148417=>15512,59559=>15512,22932=>15513,59560=>15513,146871=>15514,59561=>15514,157505=>15515,59562=>15515,32168=>15516,59563=>15516,155995=>15517,59564=>15517,155812=>15518,59565=>15518,149945=>15519,59566=>15519,149899=>15520,59567=>15520,166394=>15521,59568=>15521,37605=>15522,59569=>15522,29666=>15523,59570=>15523,16105=>15524,59571=>15524,29876=>15525,59572=>15525,166755=>15526,59573=>15526,137375=>15527,59574=>15527,16097=>15528,59575=>15528,150195=>15529,59576=>15529,27352=>15530,59577=>15530,29683=>15531,59578=>15531,29691=>15532,59579=>15532,16086=>15533,59580=>15533,150078=>15534,59581=>15534,150164=>15535,59582=>15535,137177=>15536,59583=>15536,150118=>15537,59584=>15537,132007=>15538,59585=>15538,136228=>15539,59586=>15539,149989=>15540,59587=>15540,29768=>15541,59588=>15541,149782=>15542,59589=>15542,28837=>15543,59590=>15543,149878=>15544,59591=>15544,37508=>15545,59592=>15545,29670=>15546,59593=>15546,37727=>15547,59594=>15547,132350=>15548,59595=>15548,37681=>15549,59596=>15549,166606=>15550,59597=>15550,166422=>15551,59598=>15551,37766=>15552,59599=>15552,166887=>15553,59600=>15553,153045=>15554,59601=>15554,18741=>15555,59602=>15555,166530=>15556,59603=>15556,29035=>15557,59604=>15557,149827=>15558,59605=>15558,134399=>15559,59606=>15559,22180=>15560,59607=>15560,132634=>15561,59608=>15561,134123=>15562,59609=>15562,134328=>15563,59610=>15563,21762=>15564,59611=>15564,31172=>15565,59612=>15565,137210=>15566,59613=>15566,32254=>15567,59614=>15567,136898=>15568,59615=>15568,150096=>15569,59616=>15569,137298=>15570,59617=>15570,17710=>15571,59618=>15571,37889=>15572,59619=>15572,14090=>15573,59620=>15573,166592=>15574,59621=>15574,149933=>15575,59622=>15575,22960=>15576,59623=>15576,137407=>15577,59624=>15577,137347=>15578,59625=>15578,160900=>15579,59626=>15579,23201=>15580,59627=>15580,14050=>15581,59628=>15581,146779=>15582,59629=>15582,14000=>15583,59630=>15583,37471=>15584,59631=>15584,23161=>15585,59632=>15585,166529=>15586,59633=>15586,137314=>15587,59634=>15587,37748=>15588,59635=>15588,15565=>15589,59636=>15589,133812=>15590,59637=>15590,19094=>15591,59638=>15591,14730=>15592,59639=>15592,20724=>15593,59640=>15593,15721=>15594,59641=>15594,15692=>15595,59642=>15595,136092=>15596,59643=>15596,29045=>15597,59644=>15597,17147=>15598,59645=>15598,164376=>15599,59646=>15599,28175=>15600,59647=>15600,168164=>15601,59648=>15601,17643=>15602,59649=>15602,27991=>15603,59650=>15603,163407=>15604,59651=>15604,28775=>15605,59652=>15605,27823=>15606,59653=>15606,15574=>15607,59654=>15607,147437=>15608,59655=>15608,146989=>15609,59656=>15609,28162=>15610,59657=>15610,28428=>15611,59658=>15611,15727=>15612,59659=>15612,132085=>15613,59660=>15613,30033=>15614,59661=>15614,14012=>15615,59662=>15615,13512=>15616,59663=>15616,18048=>15617,59664=>15617,16090=>15618,59665=>15618,18545=>15619,59666=>15619,22980=>15620,59667=>15620,37486=>15621,59668=>15621,18750=>15622,59669=>15622,36673=>15623,59670=>15623,166940=>15624,59671=>15624,158656=>15625,59672=>15625,22546=>15626,59673=>15626,22472=>15627,59674=>15627,14038=>15628,59675=>15628,136274=>15629,59676=>15629,28926=>15630,59677=>15630,148322=>15631,59678=>15631,150129=>15632,59679=>15632,143331=>15633,59680=>15633,135856=>15634,59681=>15634,140221=>15635,59682=>15635,26809=>15636,59683=>15636,26983=>15637,59684=>15637,136088=>15638,59685=>15638,144613=>15639,59686=>15639,162804=>15640,59687=>15640,145119=>15641,59688=>15641,166531=>15642,59689=>15642,145366=>15643,59690=>15643,144378=>15644,59691=>15644,150687=>15645,59692=>15645,27162=>15646,59693=>15646,145069=>15647,59694=>15647,158903=>15648,59695=>15648,33854=>15649,59696=>15649,17631=>15650,59697=>15650,17614=>15651,59698=>15651,159014=>15652,59699=>15652,159057=>15653,59700=>15653,158850=>15654,59701=>15654,159710=>15655,59702=>15655,33597=>15658,59705=>15658,137018=>15659,59706=>15659,33773=>15660,59707=>15660,158848=>15661,59708=>15661,159827=>15662,59709=>15662,137179=>15663,59710=>15663,22921=>15664,59711=>15664,23170=>15665,59712=>15665,137139=>15666,59713=>15666,23137=>15667,59714=>15667,23153=>15668,59715=>15668,137477=>15669,59716=>15669,147964=>15670,59717=>15670,14125=>15671,59718=>15671,23023=>15672,59719=>15672,137020=>15673,59720=>15673,14023=>15674,59721=>15674,29070=>15675,59722=>15675,37776=>15676,59723=>15676,26266=>15677,59724=>15677,148133=>15678,59725=>15678,23150=>15679,59726=>15679,23083=>15680,59727=>15680,148115=>15681,59728=>15681,27179=>15682,59729=>15682,147193=>15683,59730=>15683,161590=>15684,59731=>15684,148571=>15685,59732=>15685,148170=>15686,59733=>15686,28957=>15687,59734=>15687,148057=>15688,59735=>15688,166369=>15689,59736=>15689,20400=>15690,59737=>15690,159016=>15691,59738=>15691,23746=>15692,59739=>15692,148686=>15693,59740=>15693,163405=>15694,59741=>15694,148413=>15695,59742=>15695,27148=>15696,59743=>15696,148054=>15697,59744=>15697,135940=>15698,59745=>15698,28979=>15700,59747=>15700,148457=>15701,59748=>15701,15781=>15702,59749=>15702,27871=>15703,59750=>15703,194597=>15704,59751=>15704,23019=>15705,59754=>15705,24412=>15706,59757=>15706,59764=>15707,144128=>15707,31955=>15708,59776=>15708,59783=>15709,162548=>15709,59786=>15710,153334=>15710,162584=>15711,59790=>15711,36972=>15712,59791=>15712,33270=>15713,59795=>15713,30476=>15714,59797=>15714,27810=>15715,59799=>15715,22269=>15716,59800=>15716,22633=>15717,59828=>15717,26465=>15718,59832=>15718,23646=>15719,59838=>15719,22770=>15720,59841=>15720,28857=>15721,59843=>15721,26627=>15722,59853=>15722,59859=>15723,36795=>15723,59861=>15724,36796=>15724,20001=>15725,59871=>15725,31545=>15726,59898=>15726,15820=>15727,59902=>15727,29482=>15728,57990=>15728,59909=>15728,30048=>15729,59912=>15729,22586=>15730,59920=>15730,33446=>15731,59932=>15731,27018=>15732,59940=>15732,24803=>15733,59944=>15733,20206=>15734,59984=>15734,39364=>15735,60002=>15735,40639=>15736,60023=>15736,21249=>15737,60025=>15737,26528=>15738,60038=>15738,24808=>15739,60046=>15739,20916=>15740,60053=>15740,31363=>15741,60064=>15741,39994=>15742,60075=>15742,31432=>15743,60093=>15743,26906=>15744,60098=>15744,22956=>15745,60100=>15745,22592=>15746,60102=>15746,21610=>15747,60114=>15747,24807=>15748,60123=>15748,22138=>15749,60125=>15749,26965=>15750,60132=>15750,39983=>15751,60133=>15751,34725=>15752,60134=>15752,23584=>15753,60141=>15753,24075=>15754,60143=>15754,26398=>15755,60147=>15755,33965=>15756,60157=>15756,35713=>15757,60161=>15757,20088=>15758,60166=>15758,25283=>15759,60176=>15759,26709=>15760,60180=>15760,33533=>15762,60190=>15762,35237=>15763,60194=>15763,36768=>15764,60196=>15764,38840=>15765,60198=>15765,38983=>15766,60200=>15766,39613=>15767,60201=>15767,24497=>15768,60218=>15768,26184=>15769,60219=>15769,26303=>15770,60220=>15770,162425=>15771,60221=>15771,60225=>15773,149946=>15773,60230=>15776,131910=>15776,26382=>15777,60232=>15777,26904=>15778,60233=>15778,161367=>15779,60235=>15779,155618=>15780,60236=>15780,161278=>15781,60239=>15781,139418=>15782,60240=>15782,18640=>15783,60241=>15783,19128=>15784,60242=>15784,60244=>15785,166554=>15785,60247=>15786,147515=>15786,150085=>15787,60250=>15787,132554=>15788,60251=>15788,20946=>15789,60252=>15789,132625=>15790,60253=>15790,22943=>15791,60254=>15791,138920=>15792,60255=>15792,15294=>15793,60256=>15793,146687=>15794,60257=>15794,14747=>15795,60262=>15795,165352=>15796,60264=>15796,170441=>15797,60265=>15797,14178=>15798,60266=>15798,139715=>15799,60267=>15799,35678=>15800,60268=>15800,166734=>15801,60269=>15801,29193=>15803,60274=>15803,60276=>15804,134264=>15804,132985=>15805,60280=>15805,36570=>15806,60281=>15806,21135=>15807,60283=>15807,29041=>15808,60285=>15808,147274=>15809,60288=>15809,150183=>15810,60289=>15810,21948=>15811,60290=>15811,60293=>15812,158546=>15812,13427=>15813,60295=>15813,60297=>15814,161330=>15814,18200=>15815,60299=>15815,60303=>15816,149823=>15816,20582=>15817,60305=>15817,13563=>15818,60306=>15818,144332=>15819,60307=>15819,18300=>15821,60310=>15821,166216=>15822,60311=>15822,60315=>15823,138640=>15823,162834=>15825,60320=>15825,36950=>15826,60321=>15826,151450=>15827,60323=>15827,35682=>15828,60324=>15828,23899=>15829,60327=>15829,158711=>15830,60328=>15830,137500=>15832,60331=>15832,35562=>15833,60332=>15833,150006=>15834,60333=>15834,60335=>15835,147439=>15835,19392=>15836,60337=>15836,141083=>15837,60340=>15837,37989=>15838,60341=>15838,153569=>15839,60342=>15839,24981=>15840,60343=>15840,23079=>15841,60344=>15841,194765=>15842,60345=>15842,194566=>15843,60348=>15844,148769=>15844,20074=>15845,60350=>15845,149812=>15846,60351=>15846,38486=>15847,60352=>15847,28047=>15848,60353=>15848,158909=>15849,60354=>15849,35191=>15850,60356=>15850,60359=>15851,156689=>15851,31554=>15853,60363=>15853,168128=>15854,60364=>15854,133649=>15855,60365=>15855,31301=>15857,60369=>15857,39462=>15858,60372=>15858,13919=>15859,60374=>15859,156777=>15860,60375=>15860,131105=>15861,60376=>15861,31107=>15862,60377=>15862,23852=>15863,60380=>15863,144665=>15864,60381=>15864,18128=>15866,60384=>15866,30011=>15867,60386=>15867,34917=>15868,60387=>15868,22710=>15869,60389=>15869,14108=>15870,60390=>15870,140685=>15871,60391=>15871,15444=>15872,60394=>15872,37505=>15873,60397=>15873,139642=>15874,60398=>15874,37680=>15875,60400=>15875,149968=>15876,60402=>15876,27705=>15877,60403=>15877,134904=>15878,60406=>15878,34855=>15879,60407=>15879,35061=>15880,60408=>15880,141606=>15881,60409=>15881,164979=>15882,60410=>15882,137137=>15883,60411=>15883,28344=>15884,60412=>15884,150058=>15885,60413=>15885,137248=>15886,60414=>15886,14756=>15887,60415=>15887,17727=>15890,60419=>15890,26294=>15891,60420=>15891,171181=>15892,60421=>15892,170148=>15893,60422=>15893,35139=>15894,60423=>15894,16607=>15895,60427=>15895,136714=>15896,60428=>15896,14753=>15897,60429=>15897,145199=>15898,60430=>15898,164072=>15899,60431=>15899,136133=>15900,60432=>15900,29101=>15901,60433=>15901,33638=>15902,60434=>15902,60436=>15903,168360=>15903,19639=>15905,60438=>15905,159919=>15906,60439=>15906,166315=>15907,60440=>15907,147834=>15908,60445=>15908,31555=>15909,60446=>15909,31102=>15910,60447=>15910,28597=>15911,60449=>15911,172767=>15912,60450=>15912,27139=>15913,60451=>15913,164632=>15914,60452=>15914,21410=>15915,60453=>15915,159239=>15916,60454=>15916,37823=>15917,60455=>15917,26678=>15918,60456=>15918,38749=>15919,59389=>15919,60457=>15919,164207=>15920,60458=>15920,158133=>15921,60460=>15921,136173=>15922,60461=>15922,143919=>15923,60462=>15923,23941=>15924,60464=>15924,166960=>15925,60465=>15925,22293=>15926,60467=>15926,38947=>15927,60468=>15927,166217=>15928,60469=>15928,23979=>15929,60470=>15929,149896=>15930,60471=>15930,26046=>15931,60472=>15931,27093=>15932,60473=>15932,21458=>15933,60474=>15933,150181=>15934,60475=>15934,147329=>15935,60476=>15935,15377=>15936,60477=>15936,26422=>15937,60478=>15937,60482=>15938,139169=>15938,13770=>15939,60490=>15939,18682=>15940,60493=>15940,30728=>15942,60496=>15942,37461=>15943,60497=>15943,17394=>15944,60499=>15944,17375=>15945,60501=>15945,23032=>15946,60505=>15946,22155=>15948,60518=>15948,60520=>15949,169449=>15949,36882=>15950,60541=>15950,21953=>15951,60546=>15951,17673=>15952,60551=>15952,32383=>15953,60552=>15953,28502=>15954,60553=>15954,27313=>15955,60554=>15955,13540=>15956,60556=>15956,161949=>15957,60558=>15957,14138=>15958,60559=>15958,60562=>15960,163876=>15960,60565=>15961,162366=>15961,15851=>15962,60567=>15962,60569=>15963,146615=>15963,156248=>15964,60574=>15964,22207=>15965,60575=>15965,36366=>15966,60577=>15966,23405=>15967,60578=>15967,25566=>15968,60581=>15968,25904=>15970,60585=>15970,22061=>15971,60586=>15971,21530=>15972,60588=>15972,171416=>15973,60591=>15973,19581=>15974,60592=>15974,22050=>15975,60593=>15975,22046=>15976,60594=>15976,32585=>15977,60595=>15977,22901=>15978,60597=>15978,146752=>15979,60598=>15979,34672=>15980,60599=>15980,33047=>15981,60604=>15981,40286=>15982,60605=>15982,36120=>15983,60606=>15983,30267=>15984,60607=>15984,40005=>15985,60608=>15985,30286=>15986,60609=>15986,30649=>15987,60610=>15987,37701=>15988,60611=>15988,21554=>15989,60612=>15989,33096=>15990,60613=>15990,33527=>15991,60614=>15991,22053=>15992,60615=>15992,33074=>15993,60616=>15993,33816=>15994,60617=>15994,32957=>15995,60618=>15995,21994=>15996,60619=>15996,31074=>15997,60620=>15997,22083=>15998,60621=>15998,21526=>15999,60622=>15999,134813=>16000,60623=>16000,13774=>16001,60624=>16001,22021=>16002,57509=>16002,60625=>16002,22001=>16003,60626=>16003,26353=>16004,60627=>16004,164578=>16005,60628=>16005,13869=>16006,60629=>16006,30004=>16007,60630=>16007,22000=>16008,60631=>16008,21946=>16009,60632=>16009,21655=>16010,60633=>16010,21874=>16011,60634=>16011,134209=>16012,60635=>16012,134294=>16013,60636=>16013,24272=>16014,57652=>16014,60637=>16014,134774=>16015,60639=>16015,142434=>16016,60640=>16016,134818=>16017,60641=>16017,40619=>16018,60642=>16018,32090=>16019,60643=>16019,135285=>16021,60645=>16021,25245=>16022,60646=>16022,38765=>16023,60647=>16023,21652=>16024,60648=>16024,36045=>16025,60649=>16025,29174=>16026,60650=>16026,37238=>16027,60651=>16027,25596=>16028,60652=>16028,25529=>16029,60653=>16029,25598=>16030,60654=>16030,21865=>16031,60655=>16031,142147=>16032,60656=>16032,40050=>16033,60657=>16033,143027=>16034,60658=>16034,20890=>16035,60659=>16035,13535=>16036,60660=>16036,134567=>16037,60661=>16037,20903=>16038,60662=>16038,21581=>16039,60663=>16039,21790=>16040,60664=>16040,21779=>16041,60665=>16041,30310=>16042,60666=>16042,36397=>16043,60667=>16043,157834=>16044,60668=>16044,30129=>16045,60669=>16045,32950=>16046,60670=>16046,34820=>16047,60671=>16047,35015=>16049,60673=>16049,33206=>16050,60674=>16050,33820=>16051,60675=>16051,17644=>16052,60677=>16052,29444=>16053,60678=>16053,33547=>16054,60681=>16054,22139=>16055,60683=>16055,37232=>16056,60690=>16056,37384=>16057,60692=>16057,134905=>16058,60696=>16058,29286=>16059,60697=>16059,18254=>16060,60699=>16060,60701=>16061,163833=>16061,16634=>16062,60703=>16062,40029=>16063,60704=>16063,25887=>16064,60705=>16064,18675=>16065,60707=>16065,149472=>16066,60708=>16066,171388=>16067,60709=>16067,60713=>16069,161187=>16069,60715=>16070,155720=>16071,60716=>16071,29091=>16072,60718=>16072,32398=>16073,60719=>16073,40272=>16074,60720=>16074,13687=>16075,60723=>16075,27826=>16076,60725=>16076,21351=>16077,60726=>16077,14812=>16078,60728=>16078,60731=>16079,149016=>16079,33325=>16080,60734=>16080,21579=>16081,60735=>16081,60739=>16082,14930=>16083,60740=>16083,29556=>16084,60742=>16084,171692=>16085,60743=>16085,19721=>16086,60744=>16086,39917=>16087,60745=>16087,19547=>16089,60748=>16089,171998=>16090,60751=>16090,33884=>16091,60752=>16091,60754=>16092,160434=>16092,25390=>16093,60757=>16093,32037=>16094,60758=>16094,14890=>16095,60761=>16095,36872=>16096,60762=>16096,21196=>16097,60763=>16097,15988=>16098,60764=>16098,13946=>16099,60765=>16099,17897=>16100,60766=>16100,132238=>16101,60767=>16101,30272=>16102,60768=>16102,23280=>16103,60769=>16103,134838=>16104,60770=>16104,30842=>16105,60771=>16105,18358=>16106,163630=>16106,60772=>16106,22695=>16107,60773=>16107,16575=>16108,60774=>16108,22140=>16109,60775=>16109,39819=>16110,60776=>16110,23924=>16111,60777=>16111,30292=>16112,60778=>16112,173108=>16113,60779=>16113,40581=>16114,60780=>16114,19681=>16115,60781=>16115,14331=>16117,60783=>16117,24857=>16118,60784=>16118,148466=>16119,60786=>16119,60787=>16120,22109=>16121,60788=>16121,171526=>16122,60792=>16122,21044=>16123,60793=>16123,13741=>16124,60795=>16124,40316=>16126,60797=>16126,31830=>16127,60798=>16127,39737=>16128,60799=>16128,22494=>16129,60800=>16129,23635=>16130,60802=>16130,25811=>16131,60803=>16131,169168=>16132,60804=>16132,156469=>16133,60805=>16133,34477=>16134,60807=>16134,134440=>16135,60808=>16135,134513=>16136,60811=>16136,60812=>16137,20990=>16138,60813=>16138,139023=>16139,60814=>16139,23950=>16140,60815=>16140,38659=>16141,60816=>16141,138705=>16142,60817=>16142,40577=>16143,60818=>16143,36940=>16144,60819=>16144,31519=>16145,60820=>16145,39682=>16146,60821=>16146,23761=>16147,60822=>16147,31651=>16148,60823=>16148,25192=>16149,60824=>16149,25397=>16150,60825=>16150,39679=>16151,60826=>16151,31695=>16152,60827=>16152,39722=>16153,60828=>16153,31870=>16154,60829=>16154,31810=>16156,60831=>16156,31878=>16157,60832=>16157,39957=>16158,60833=>16158,31740=>16159,60834=>16159,39689=>16160,60835=>16160,39982=>16162,40794=>16163,60839=>16163,21875=>16164,60840=>16164,23491=>16165,60841=>16165,20477=>16166,60842=>16166,40600=>16167,60843=>16167,20466=>16168,60844=>16168,21088=>16169,60845=>16169,21201=>16170,60847=>16170,22375=>16171,60848=>16171,20566=>16172,60849=>16172,22967=>16173,60850=>16173,24082=>16174,60851=>16174,38856=>16175,60852=>16175,40363=>16176,60853=>16176,36700=>16177,60854=>16177,21609=>16178,60855=>16178,38836=>16179,60856=>16179,39232=>16180,60857=>16180,38842=>16181,60858=>16181,21292=>16182,60859=>16182,24880=>16183,60860=>16183,26924=>16184,60861=>16184,21466=>16185,60862=>16185,39946=>16186,60863=>16186,40194=>16187,60864=>16187,19515=>16188,60865=>16188,38465=>16189,60866=>16189,27008=>16190,60867=>16190,20646=>16191,60868=>16191,30022=>16192,60869=>16192,137069=>16193,60870=>16193,39386=>16194,60871=>16194,21107=>16195,60872=>16195,60873=>16196,37209=>16197,60874=>16197,38529=>16198,60875=>16198,37212=>16199,60876=>16199,60877=>16200,37201=>16201,60878=>16201,167575=>16202,60879=>16202,25471=>16203,60880=>16203,27338=>16204,60882=>16204,22033=>16205,60883=>16205,37262=>16206,60884=>16206,30074=>16207,60885=>16207,25221=>16208,60886=>16208,29519=>16209,60888=>16209,31856=>16210,60889=>16210,154657=>16211,60890=>16211,60892=>16212,30422=>16213,60894=>16213,39837=>16214,60895=>16214,20010=>16215,60896=>16215,134356=>16216,60897=>16216,33726=>16217,60898=>16217,34882=>16218,60899=>16218,60900=>16219,23626=>16220,60901=>16220,27072=>16221,60902=>16221,21023=>16224,60905=>16224,24053=>16225,60906=>16225,20174=>16226,60907=>16226,27697=>16227,60908=>16227,131570=>16228,60909=>16228,20281=>16229,60910=>16229,21660=>16230,60911=>16230,21146=>16232,60913=>16232,36226=>16233,60914=>16233,13822=>16234,60915=>16234,13811=>16236,60917=>16236,60918=>16237,27474=>16238,60919=>16238,37244=>16239,60920=>16239,40869=>16240,60921=>16240,39831=>16241,60922=>16241,38958=>16242,60923=>16242,39092=>16243,60924=>16243,39610=>16244,60925=>16244,40616=>16245,60926=>16245,40580=>16246,60927=>16246,31508=>16247,60929=>16247,60930=>16248,27642=>16249,60931=>16249,34840=>16250,60932=>16250,32632=>16251,60933=>16251,60934=>16252,22048=>16253,60935=>16253,173642=>16254,60936=>16254,36471=>16255,60937=>16255,40787=>16256,60938=>16256,60939=>16257,36308=>16258,60940=>16258,36431=>16259,60941=>16259,40476=>16260,60942=>16260,36353=>16261,60943=>16261,25218=>16262,60944=>16262,164733=>16263,60945=>16263,36392=>16264,60946=>16264,36469=>16265,60947=>16265,31443=>16266,60948=>16266,31294=>16267,60950=>16267,30936=>16268,60951=>16268,27882=>16269,60952=>16269,35431=>16270,60953=>16270,30215=>16271,60954=>16271,40742=>16272,60956=>16272,27854=>16273,60957=>16273,34774=>16274,60958=>16274,30147=>16275,60959=>16275,172722=>16276,60960=>16276,30803=>16277,60961=>16277,36108=>16278,60963=>16278,29410=>16279,60964=>16279,29553=>16280,60965=>16280,35629=>16281,60966=>16281,29442=>16282,60967=>16282,29937=>16283,60968=>16283,36075=>16284,60969=>16284,150203=>16285,60970=>16285,34351=>16286,60971=>16286,24506=>16287,60972=>16287,34976=>16288,60973=>16288,17591=>16289,60974=>16289,60975=>16290,159237=>16291,60977=>16291,60978=>16292,35454=>16293,60979=>16293,140571=>16294,60980=>16294,60981=>16295,24829=>16296,60982=>16296,30311=>16297,60983=>16297,39639=>16298,60984=>16298,40260=>16299,60985=>16299,37742=>16300,58859=>16300,60986=>16300,39823=>16301,60987=>16301,34805=>16302,60988=>16302,60989=>16303,36087=>16305,60991=>16305,29484=>16306,60992=>16306,38689=>16307,60993=>16307,39856=>16308,60994=>16308,13782=>16309,60995=>16309,29362=>16310,60996=>16310,19463=>16311,60997=>16311,31825=>16312,60998=>16312,39242=>16313,60999=>16313,24921=>16314,61001=>16314,19460=>16315,61002=>16315,40598=>16316,61003=>16316,24957=>16317,61004=>16317,61005=>16318,22367=>16319,61006=>16319,24943=>16320,61007=>16320,25254=>16321,61008=>16321,25145=>16322,61009=>16322,14940=>16324,61011=>16324,25058=>16325,61012=>16325,21418=>16326,61013=>16326,25444=>16327,61015=>16327,26626=>16328,61016=>16328,13778=>16329,61017=>16329,23895=>16330,61018=>16330,36826=>16331,61020=>16331,167481=>16332,61021=>16332,61022=>16333,20697=>16334,61023=>16334,30982=>16335,61025=>16335,21298=>16336,61026=>16336,38456=>16337,61027=>16337,134971=>16338,61028=>16338,16485=>16339,61029=>16339,61030=>16340,30718=>16341,61031=>16341,61032=>16342,31938=>16343,61033=>16343,155418=>16344,61034=>16344,31962=>16345,61035=>16345,31277=>16346,61036=>16346,32870=>16347,61037=>16347,32867=>16348,61038=>16348,32077=>16349,61039=>16349,29957=>16350,61040=>16350,29938=>16351,61041=>16351,35220=>16352,61042=>16352,33306=>16353,61043=>16353,26380=>16354,61044=>16354,32866=>16355,61045=>16355,160902=>16356,61046=>16356,32859=>16357,61047=>16357,29936=>16358,61048=>16358,33027=>16359,61049=>16359,30500=>16360,61050=>16360,35209=>16361,61051=>16361,157644=>16362,61052=>16362,30035=>16363,61053=>16363,34729=>16364,61055=>16364,34766=>16365,61056=>16365,33224=>16366,61057=>16366,34700=>16367,61058=>16367,35401=>16368,61059=>16368,36013=>16369,61060=>16369,35651=>16370,61061=>16370,30507=>16371,61062=>16371,29944=>16372,61063=>16372,34010=>16373,61064=>16373,27058=>16374,61066=>16374,36262=>16375,61067=>16375,61068=>16376,35241=>16377,58392=>16377,61069=>16377,28089=>16379,61071=>16379,34753=>16380,61072=>16380,147473=>16381,61073=>16381,29927=>16382,61074=>16382,15835=>16383,61075=>16383,29046=>16384,61076=>16384,24740=>16385,57702=>16385,61077=>16385,24988=>16386,61078=>16386,15569=>16387,61079=>16387,24695=>16389,61081=>16389,61082=>16390,32625=>16391,61083=>16391,194850=>16392,24809=>16393,61086=>16393,19326=>16394,61087=>16394,132423=>16395,57344=>16395,37595=>16396,57345=>16396,132575=>16397,57346=>16397,147397=>16398,57347=>16398,34124=>16399,57348=>16399,17077=>16400,57349=>16400,29679=>16401,57350=>16401,20917=>16402,57351=>16402,13897=>16403,57352=>16403,149826=>16404,57353=>16404,166372=>16405,57354=>16405,37700=>16406,57355=>16406,137691=>16407,57356=>16407,33518=>16408,57357=>16408,146632=>16409,57358=>16409,30780=>16410,57359=>16410,26436=>16411,57360=>16411,25311=>16412,57361=>16412,149811=>16413,57362=>16413,166314=>16414,57363=>16414,131744=>16415,57364=>16415,158643=>16416,57365=>16416,135941=>16417,57366=>16417,20395=>16418,57367=>16418,140525=>16419,57368=>16419,20488=>16420,57369=>16420,159017=>16421,57370=>16421,162436=>16422,57371=>16422,144896=>16423,57372=>16423,150193=>16424,57373=>16424,140563=>16425,57374=>16425,131966=>16427,57376=>16427,24484=>16428,57377=>16428,131968=>16429,57378=>16429,131911=>16430,57379=>16430,28379=>16431,57380=>16431,132127=>16432,57381=>16432,20702=>16433,20737=>16434,57383=>16434,13434=>16435,57384=>16435,20750=>16436,57385=>16436,39020=>16437,57386=>16437,14147=>16438,57387=>16438,33814=>16439,57388=>16439,149924=>16440,57389=>16440,132231=>16441,57390=>16441,20832=>16442,57391=>16442,144308=>16443,57392=>16443,20842=>16444,57393=>16444,134143=>16445,57394=>16445,139516=>16446,57395=>16446,131813=>16447,57396=>16447,140592=>16448,57397=>16448,132494=>16449,57398=>16449,143923=>16450,57399=>16450,137603=>16451,57400=>16451,23426=>16452,57401=>16452,34685=>16453,57402=>16453,132531=>16454,57403=>16454,146585=>16455,57404=>16455,20914=>16456,57405=>16456,20920=>16457,57406=>16457,40244=>16458,57407=>16458,20937=>16459,57408=>16459,20943=>16460,57409=>16460,20945=>16461,57410=>16461,15580=>16462,57411=>16462,20947=>16463,57412=>16463,150182=>16464,57413=>16464,20915=>16465,57414=>16465,20973=>16468,57417=>16468,33741=>16469,57418=>16469,26942=>16470,57419=>16470,145197=>16471,57420=>16471,24443=>16472,57421=>16472,21003=>16473,57422=>16473,21030=>16474,57423=>16474,21052=>16475,57424=>16475,21173=>16476,57425=>16476,21079=>16477,57426=>16477,21140=>16478,57427=>16478,21177=>16479,57428=>16479,21189=>16480,57429=>16480,31765=>16481,57430=>16481,34114=>16482,57431=>16482,21216=>16483,57432=>16483,34317=>16484,57433=>16484,158483=>16485,57434=>16485,194601=>16486,166622=>16487,57436=>16487,21833=>16488,57437=>16488,28377=>16489,57438=>16489,147328=>16490,57439=>16490,133460=>16491,57440=>16491,147436=>16492,57441=>16492,21299=>16493,57442=>16493,134114=>16495,57444=>16495,27851=>16496,57445=>16496,136998=>16497,57446=>16497,26651=>16498,57447=>16498,29653=>16499,57448=>16499,24650=>16500,57449=>16500,16042=>16501,57450=>16501,14540=>16502,57451=>16502,136936=>16503,57452=>16503,29149=>16504,57453=>16504,17570=>16505,57454=>16505,21357=>16506,57455=>16506,21364=>16507,57456=>16507,165547=>16508,57457=>16508,21374=>16509,57458=>16509,194610=>16510,136598=>16511,57460=>16511,136723=>16512,57461=>16512,30694=>16513,57462=>16513,21395=>16514,57463=>16514,166555=>16515,57464=>16515,21408=>16516,57465=>16516,21419=>16517,57466=>16517,21422=>16518,57467=>16518,29607=>16519,57468=>16519,153458=>16520,57469=>16520,16217=>16521,57470=>16521,29596=>16522,57471=>16522,21441=>16523,57472=>16523,21445=>16524,57473=>16524,27721=>16525,57474=>16525,20041=>16526,57475=>16526,22526=>16527,57476=>16527,21465=>16528,57477=>16528,15019=>16529,57478=>16529,134031=>16530,57479=>16530,21472=>16531,57480=>16531,147435=>16532,57481=>16532,142755=>16533,57482=>16533,21494=>16534,57483=>16534,134263=>16535,57484=>16535,21523=>16536,57485=>16536,28793=>16537,57486=>16537,21803=>16538,57487=>16538,26199=>16539,57488=>16539,27995=>16540,57489=>16540,21613=>16541,57490=>16541,158547=>16542,57491=>16542,134516=>16543,57492=>16543,21853=>16544,57493=>16544,21647=>16545,57494=>16545,21668=>16546,57495=>16546,18342=>16547,57496=>16547,136973=>16548,57497=>16548,134877=>16549,57498=>16549,15796=>16550,57499=>16550,134477=>16551,57500=>16551,166332=>16552,57501=>16552,140952=>16553,57502=>16553,21831=>16554,57503=>16554,19693=>16555,57504=>16555,21551=>16556,57505=>16556,29719=>16557,57506=>16557,21894=>16558,57507=>16558,21929=>16559,57508=>16559,137431=>16561,57510=>16561,147514=>16562,57511=>16562,17746=>16563,57512=>16563,148533=>16564,57513=>16564,26291=>16565,57514=>16565,135348=>16566,57515=>16566,22071=>16567,57516=>16567,26317=>16568,57517=>16568,144010=>16569,57518=>16569,26276=>16570,57519=>16570,22093=>16572,57521=>16572,22095=>16573,57522=>16573,30961=>16574,57523=>16574,22257=>16575,57524=>16575,38791=>16576,57525=>16576,21502=>16577,57526=>16577,22272=>16578,57527=>16578,22255=>16579,57528=>16579,22253=>16580,57529=>16580,166758=>16581,57530=>16581,13859=>16582,57531=>16582,135759=>16583,57532=>16583,22342=>16584,57533=>16584,147877=>16585,57534=>16585,27758=>16586,57535=>16586,28811=>16587,57536=>16587,22338=>16588,57537=>16588,14001=>16589,57538=>16589,158846=>16590,57539=>16590,22502=>16591,57540=>16591,136214=>16592,57541=>16592,22531=>16593,57542=>16593,136276=>16594,57543=>16594,148323=>16595,57544=>16595,22566=>16596,57545=>16596,150517=>16597,57546=>16597,22559=>16598,22698=>16599,57548=>16599,13665=>16600,57549=>16600,22752=>16601,57550=>16601,22748=>16602,57551=>16602,135740=>16603,57552=>16603,22779=>16604,57553=>16604,23551=>16605,57554=>16605,22339=>16606,57555=>16606,172368=>16607,57556=>16607,148088=>16608,57557=>16608,37843=>16609,57558=>16609,13729=>16610,57559=>16610,22815=>16611,57560=>16611,26790=>16612,57561=>16612,14019=>16613,57562=>16613,28249=>16614,57563=>16614,136766=>16615,57564=>16615,23076=>16616,57565=>16616,136850=>16618,57567=>16618,34053=>16619,57568=>16619,22985=>16620,57569=>16620,134478=>16621,57570=>16621,158849=>16622,57571=>16622,159018=>16623,57572=>16623,137180=>16624,57573=>16624,23001=>16625,57574=>16625,137211=>16626,57575=>16626,137138=>16627,57576=>16627,159142=>16628,57577=>16628,28017=>16629,57578=>16629,137256=>16630,57579=>16630,136917=>16631,57580=>16631,23033=>16632,57581=>16632,159301=>16633,57582=>16633,23211=>16634,57583=>16634,23139=>16635,57584=>16635,14054=>16636,57585=>16636,149929=>16637,57586=>16637,14088=>16639,57588=>16639,23190=>16640,57589=>16640,29797=>16641,57590=>16641,23251=>16642,57591=>16642,159649=>16643,57592=>16643,140628=>16644,57593=>16644,137489=>16645,57595=>16645,14130=>16646,57596=>16646,136888=>16647,57597=>16647,24195=>16648,57598=>16648,21200=>16649,57599=>16649,23414=>16650,57600=>16650,25992=>16651,57601=>16651,23420=>16652,57602=>16652,162318=>16653,57603=>16653,16388=>16654,57604=>16654,18525=>16655,57605=>16655,131588=>16656,57606=>16656,23509=>16657,57607=>16657,137780=>16658,57609=>16658,154060=>16659,57610=>16659,132517=>16660,57611=>16660,23539=>16661,57612=>16661,23453=>16662,57613=>16662,19728=>16663,57614=>16663,23557=>16664,57615=>16664,138052=>16665,57616=>16665,23571=>16666,57617=>16666,29646=>16667,57618=>16667,23572=>16668,57619=>16668,138405=>16669,57620=>16669,158504=>16670,57621=>16670,23625=>16671,57622=>16671,18653=>16672,57623=>16672,23685=>16673,57624=>16673,23785=>16674,57625=>16674,23791=>16675,57626=>16675,23947=>16676,57627=>16676,138745=>16677,57628=>16677,138807=>16678,57629=>16678,23824=>16679,57630=>16679,23832=>16680,57631=>16680,23878=>16681,57632=>16681,138916=>16682,57633=>16682,23738=>16683,57634=>16683,24023=>16684,57635=>16684,33532=>16685,57636=>16685,14381=>16686,57637=>16686,149761=>16687,57638=>16687,139337=>16688,57639=>16688,139635=>16689,57640=>16689,33415=>16690,57641=>16690,14390=>16691,57642=>16691,15298=>16692,57643=>16692,24110=>16693,57644=>16693,27274=>16694,57645=>16694,57647=>16696,148668=>16697,57648=>16697,134355=>16698,57649=>16698,21414=>16699,57650=>16699,20151=>16700,57651=>16700,21416=>16702,57653=>16702,137073=>16703,57654=>16703,24073=>16704,57655=>16704,57656=>16705,164994=>16706,57657=>16706,24313=>16707,57658=>16707,24315=>16708,57659=>16708,14496=>16709,57660=>16709,24316=>16710,57661=>16710,26686=>16711,57662=>16711,37915=>16712,57663=>16712,24333=>16713,57664=>16713,131521=>16714,57665=>16714,194708=>16715,57666=>16715,15070=>16716,57667=>16716,135994=>16717,57669=>16717,24378=>16718,57670=>16718,157832=>16719,57671=>16719,140240=>16720,57672=>16720,140401=>16721,57674=>16721,24419=>16722,57675=>16722,159342=>16723,57677=>16723,24434=>16724,57678=>16724,37696=>16725,57679=>16725,166454=>16726,57680=>16726,24487=>16727,57681=>16727,23990=>16728,57682=>16728,15711=>16729,57683=>16729,152144=>16730,57684=>16730,139114=>16731,57685=>16731,159992=>16732,57686=>16732,140904=>16733,57687=>16733,37334=>16734,57688=>16734,131742=>16735,57689=>16735,166441=>16736,57690=>16736,24625=>16737,57691=>16737,26245=>16738,57692=>16738,14691=>16739,57694=>16739,15815=>16740,57695=>16740,13881=>16741,57696=>16741,22416=>16742,57697=>16742,141236=>16743,57698=>16743,31089=>16744,57699=>16744,15936=>16745,57700=>16745,24734=>16746,57701=>16746,24810=>16748,149890=>16749,57704=>16749,149903=>16750,57705=>16750,162387=>16751,57706=>16751,29860=>16752,57707=>16752,20705=>16753,57708=>16753,23200=>16754,57709=>16754,24932=>16755,57710=>16755,24898=>16756,57712=>16756,194726=>16757,57713=>16757,159442=>16758,57714=>16758,24961=>16759,57715=>16759,20980=>16760,57716=>16760,132694=>16761,57717=>16761,24967=>16762,57718=>16762,23466=>16763,57719=>16763,147383=>16764,57720=>16764,141407=>16765,57721=>16765,25043=>16766,57722=>16766,166813=>16767,57723=>16767,170333=>16768,57724=>16768,25040=>16769,57725=>16769,14642=>16770,57726=>16770,141696=>16771,57727=>16771,141505=>16772,57728=>16772,24611=>16773,57729=>16773,24924=>16774,57730=>16774,25886=>16775,57731=>16775,25483=>16776,57732=>16776,131352=>16777,57733=>16777,25285=>16778,57734=>16778,137072=>16779,57735=>16779,25301=>16780,57736=>16780,142861=>16781,57737=>16781,25452=>16782,57738=>16782,149983=>16783,57739=>16783,14871=>16784,57740=>16784,25656=>16785,57741=>16785,25592=>16786,57742=>16786,136078=>16787,57743=>16787,137212=>16788,57744=>16788,28554=>16789,57746=>16789,142902=>16790,57747=>16790,153373=>16792,57750=>16792,25825=>16793,57751=>16793,25829=>16794,57752=>16794,38011=>16795,57753=>16795,14950=>16796,57754=>16796,25658=>16797,57755=>16797,14935=>16798,57756=>16798,25933=>16799,57757=>16799,28438=>16800,57758=>16800,150056=>16801,57759=>16801,150051=>16802,57760=>16802,25989=>16803,57761=>16803,25965=>16804,57762=>16804,25951=>16805,57763=>16805,26037=>16807,57765=>16807,149824=>16808,57766=>16808,19255=>16809,57767=>16809,26065=>16810,57768=>16810,16600=>16811,57769=>16811,137257=>16812,57770=>16812,57771=>16813,26083=>16814,57772=>16814,24543=>16815,57773=>16815,144384=>16816,57774=>16816,26136=>16817,57775=>16817,57776=>16818,143863=>16818,57777=>16819,143864=>16819,26180=>16820,57778=>16820,57779=>16821,143780=>16821,57780=>16822,143781=>16822,26187=>16823,57781=>16823,134773=>16824,57782=>16824,26215=>16825,57783=>16825,152038=>16826,57784=>16826,26227=>16827,57785=>16827,64018=>16828,143921=>16829,57788=>16829,165364=>16830,57789=>16830,143816=>16831,57790=>16831,152339=>16832,57791=>16832,30661=>16833,57792=>16833,141559=>16834,57793=>16834,39332=>16835,57794=>16835,26370=>16836,57795=>16836,148380=>16837,57796=>16837,150049=>16838,57797=>16838,27130=>16839,57799=>16839,145346=>16840,57800=>16840,194779=>16841,26471=>16842,57802=>16842,26466=>16843,57803=>16843,147917=>16844,57804=>16844,168173=>16845,57805=>16845,26583=>16846,57806=>16846,17641=>16847,57807=>16847,26658=>16848,57808=>16848,28240=>16849,57809=>16849,37436=>16850,57810=>16850,26625=>16851,57811=>16851,144358=>16852,57812=>16852,159136=>16853,57813=>16853,26717=>16854,57814=>16854,144495=>16855,57815=>16855,27105=>16856,57816=>16856,27147=>16857,57817=>16857,166623=>16858,57818=>16858,26995=>16859,57819=>16859,26819=>16860,57820=>16860,144845=>16861,57821=>16861,26881=>16862,57822=>16862,26880=>16863,57823=>16863,14849=>16864,57825=>16864,144956=>16865,57826=>16865,15232=>16866,57827=>16866,26540=>16867,57828=>16867,26977=>16868,57829=>16868,166474=>16869,57830=>16869,17148=>16870,57831=>16870,26934=>16871,57832=>16871,27032=>16872,57833=>16872,15265=>16873,57834=>16873,132041=>16874,57835=>16874,33635=>16875,57836=>16875,20624=>16876,57837=>16876,27129=>16877,57838=>16877,144985=>16878,57839=>16878,139562=>16879,57840=>16879,27205=>16880,57841=>16880,145155=>16881,57842=>16881,27293=>16882,57843=>16882,15347=>16883,57844=>16883,26545=>16884,57845=>16884,27336=>16885,57846=>16885,168348=>16886,57847=>16886,15373=>16887,57848=>16887,27421=>16888,57849=>16888,133411=>16889,57850=>16889,24798=>16890,60308=>16890,57851=>16890,27445=>16891,57852=>16891,27508=>16892,57853=>16892,141261=>16893,57854=>16893,28341=>16894,57855=>16894,57856=>16895,146139=>16895,137560=>16897,57858=>16897,14144=>16898,57859=>16898,21537=>16899,57860=>16899,146266=>16900,57861=>16900,27617=>16901,57862=>16901,147196=>16902,57863=>16902,27612=>16903,57864=>16903,27703=>16904,57865=>16904,140427=>16905,57866=>16905,149745=>16906,57867=>16906,158545=>16907,57868=>16907,27738=>16908,57869=>16908,33318=>16909,57870=>16909,27769=>16910,57871=>16910,146876=>16911,57872=>16911,17605=>16912,57873=>16912,146877=>16913,57874=>16913,147876=>16914,57875=>16914,149772=>16915,57876=>16915,149760=>16916,57877=>16916,146633=>16917,57878=>16917,14053=>16918,57879=>16918,15595=>16919,57880=>16919,134450=>16920,57881=>16920,39811=>16921,57882=>16921,143865=>16922,57883=>16922,140433=>16923,57884=>16923,32655=>16924,57885=>16924,26679=>16925,57886=>16925,159013=>16926,57887=>16926,159137=>16927,57888=>16927,159211=>16928,57889=>16928,28054=>16929,57890=>16929,27996=>16930,57891=>16930,28284=>16931,57892=>16931,28420=>16932,57893=>16932,149887=>16933,57894=>16933,147589=>16934,57895=>16934,159346=>16935,57896=>16935,34099=>16936,57897=>16936,159604=>16937,57898=>16937,20935=>16938,57899=>16938,33838=>16941,57902=>16941,166689=>16942,57903=>16942,194824=>16943,146991=>16944,57905=>16944,29779=>16945,57906=>16945,147330=>16946,57907=>16946,31180=>16947,57908=>16947,28239=>16948,57909=>16948,23185=>16949,57910=>16949,143435=>16950,57911=>16950,28664=>16951,57912=>16951,14093=>16952,57913=>16952,28573=>16953,57914=>16953,146992=>16954,57915=>16954,28410=>16955,57916=>16955,136343=>16956,57917=>16956,147517=>16957,57918=>16957,17749=>16958,57919=>16958,37872=>16959,57920=>16959,28484=>16960,57921=>16960,28508=>16961,57922=>16961,15694=>16962,57923=>16962,28532=>16963,57924=>16963,168304=>16964,57925=>16964,15675=>16965,57926=>16965,28575=>16966,57927=>16966,147780=>16967,57928=>16967,28627=>16968,57929=>16968,147601=>16969,57930=>16969,147797=>16970,57931=>16970,147513=>16971,57932=>16971,147440=>16972,57933=>16972,147380=>16973,57934=>16973,147775=>16974,57935=>16974,20959=>16975,57936=>16975,57937=>16976,147798=>16976,57938=>16977,147799=>16977,147776=>16978,57939=>16978,156125=>16979,57940=>16979,28747=>16980,57941=>16980,28798=>16981,57942=>16981,28839=>16982,57943=>16982,28876=>16984,57945=>16984,28885=>16985,57946=>16985,28886=>16986,57947=>16986,28895=>16987,57948=>16987,16644=>16988,57949=>16988,15848=>16989,57950=>16989,29108=>16990,57951=>16990,29078=>16991,57952=>16991,148087=>16992,57953=>16992,28971=>16993,57954=>16993,28997=>16994,57955=>16994,23176=>16995,57956=>16995,29002=>16996,57957=>16996,64072=>16997,148325=>16998,57960=>16998,29007=>16999,57961=>16999,37730=>17000,57962=>17000,148161=>17001,57963=>17001,28972=>17002,57964=>17002,148570=>17003,57965=>17003,150055=>17004,57966=>17004,150050=>17005,57967=>17005,29114=>17006,57968=>17006,166888=>17007,57969=>17007,28861=>17008,57970=>17008,29198=>17009,57971=>17009,37954=>17010,57972=>17010,29205=>17011,57973=>17011,22801=>17012,57974=>17012,37955=>17013,57975=>17013,29220=>17014,57976=>17014,37697=>17015,57977=>17015,153093=>17016,57978=>17016,29230=>17017,57979=>17017,29248=>17018,57980=>17018,149876=>17019,57981=>17019,26813=>17020,57982=>17020,29269=>17021,57983=>17021,29271=>17022,57984=>17022,15957=>17023,57985=>17023,143428=>17024,57986=>17024,26637=>17025,57987=>17025,28477=>17026,57988=>17026,29314=>17027,57989=>17027,29483=>17029,57991=>17029,149539=>17030,57992=>17030,165931=>17031,57993=>17031,18669=>17032,57994=>17032,165892=>17033,57995=>17033,29480=>17034,57996=>17034,29486=>17035,57997=>17035,29647=>17036,57998=>17036,29610=>17037,57999=>17037,134202=>17038,58000=>17038,158254=>17039,58001=>17039,29641=>17040,58002=>17040,29769=>17041,58003=>17041,147938=>17042,58004=>17042,136935=>17043,58005=>17043,150052=>17044,58006=>17044,26147=>17045,58007=>17045,14021=>17046,58008=>17046,149943=>17047,58009=>17047,149901=>17048,58010=>17048,150011=>17049,58011=>17049,29687=>17050,58012=>17050,29717=>17051,58013=>17051,26883=>17052,58014=>17052,150054=>17053,58015=>17053,29753=>17054,58016=>17054,16087=>17055,58018=>17055,194863=>17056,141485=>17057,58020=>17057,29792=>17058,58021=>17058,167602=>17059,58022=>17059,29767=>17060,58023=>17060,29668=>17061,58024=>17061,29814=>17062,58025=>17062,33721=>17063,58026=>17063,29804=>17064,58027=>17064,29812=>17065,58029=>17065,37873=>17066,58030=>17066,27180=>17067,58031=>17067,29826=>17068,58032=>17068,18771=>17069,58033=>17069,150156=>17070,58034=>17070,147807=>17071,58035=>17071,150137=>17072,58036=>17072,166799=>17073,58037=>17073,23366=>17074,58038=>17074,166915=>17075,58039=>17075,137374=>17076,58040=>17076,29896=>17077,58041=>17077,137608=>17078,58042=>17078,29966=>17079,58043=>17079,29982=>17080,58045=>17080,167641=>17081,58046=>17081,137803=>17082,58047=>17082,23511=>17083,58048=>17083,167596=>17084,58049=>17084,37765=>17085,58050=>17085,30029=>17086,58051=>17086,30026=>17087,58052=>17087,30055=>17088,58053=>17088,30062=>17089,58054=>17089,151426=>17090,58055=>17090,16132=>17091,58056=>17091,150803=>17092,58057=>17092,30094=>17093,58058=>17093,29789=>17094,58059=>17094,30110=>17095,58060=>17095,30132=>17096,58061=>17096,30210=>17097,58062=>17097,30252=>17098,58063=>17098,30289=>17099,58064=>17099,30287=>17100,58065=>17100,30319=>17101,58066=>17101,58067=>17102,156661=>17103,58068=>17103,30352=>17104,58069=>17104,33263=>17105,58070=>17105,14328=>17106,58071=>17106,157969=>17107,58072=>17107,157966=>17108,58073=>17108,30369=>17109,58074=>17109,30373=>17110,58075=>17110,30391=>17111,58076=>17111,30412=>17112,58077=>17112,159647=>17113,58078=>17113,33890=>17114,58079=>17114,151709=>17115,58080=>17115,151933=>17116,58081=>17116,138780=>17117,58082=>17117,30494=>17118,58083=>17118,30502=>17119,58084=>17119,30528=>17120,58085=>17120,25775=>17121,58086=>17121,152096=>17122,58087=>17122,30552=>17123,58088=>17123,144044=>17124,58089=>17124,30639=>17125,58090=>17125,166244=>17126,58091=>17126,166248=>17127,58092=>17127,136897=>17128,58093=>17128,30708=>17129,58094=>17129,26826=>17131,58098=>17131,30895=>17132,58099=>17132,30919=>17133,58100=>17133,30931=>17134,58101=>17134,38565=>17135,58102=>17135,31022=>17136,58103=>17136,153056=>17137,58104=>17137,30935=>17138,58105=>17138,31028=>17139,58106=>17139,30897=>17140,58107=>17140,161292=>17141,58108=>17141,36792=>17142,58109=>17142,34948=>17143,58110=>17143,140828=>17144,58113=>17144,31110=>17145,58114=>17145,35072=>17146,58115=>17146,26882=>17147,58116=>17147,31104=>17148,58117=>17148,153687=>17149,58118=>17149,31133=>17150,58119=>17150,162617=>17151,58120=>17151,31036=>17152,58121=>17152,31145=>17153,58122=>17153,28202=>17154,58123=>17154,160038=>17155,58124=>17155,16040=>17156,58125=>17156,31174=>17157,58126=>17157,168205=>17158,58127=>17158,31188=>17159,58128=>17159,21797=>17161,62526=>17161,134210=>17163,62528=>17163,134421=>17164,62529=>17164,151851=>17165,62530=>17165,21904=>17166,62531=>17166,142534=>17167,62532=>17167,14828=>17168,62533=>17168,131905=>17169,62534=>17169,36422=>17170,62535=>17170,150968=>17171,62536=>17171,169189=>17172,62537=>17172,164030=>17174,62539=>17174,30586=>17175,62540=>17175,142392=>17176,62541=>17176,14900=>17177,62542=>17177,18389=>17178,62543=>17178,164189=>17179,62544=>17179,158194=>17180,62545=>17180,151018=>17181,62546=>17181,25821=>17182,62547=>17182,134524=>17183,62548=>17183,135092=>17184,62549=>17184,134357=>17185,62550=>17185,25741=>17187,62552=>17187,36478=>17188,62553=>17188,134806=>17189,62554=>17189,135012=>17191,62556=>17191,142505=>17192,62557=>17192,164438=>17193,62558=>17193,148691=>17194,62559=>17194,134470=>17196,62561=>17196,170573=>17197,62562=>17197,164073=>17198,62563=>17198,18420=>17199,62564=>17199,151207=>17200,62565=>17200,142530=>17201,62566=>17201,39602=>17202,62567=>17202,14951=>17203,62568=>17203,169460=>17204,62569=>17204,16365=>17205,62570=>17205,13574=>17206,62571=>17206,152263=>17207,62572=>17207,169940=>17208,62573=>17208,142660=>17210,62575=>17210,40302=>17211,62576=>17211,38933=>17212,62577=>17212,17369=>17214,62579=>17214,25780=>17216,62581=>17216,21731=>17217,62582=>17217,62584=>17219,142282=>17219,14843=>17221,62586=>17221,157402=>17223,62588=>17223,157462=>17224,62589=>17224,162208=>17225,62590=>17225,25834=>17226,62591=>17226,151634=>17227,62592=>17227,134211=>17228,62593=>17228,36456=>17229,62594=>17229,166732=>17231,62596=>17231,132913=>17232,62597=>17232,18443=>17234,62599=>17234,131497=>17235,62600=>17235,16378=>17236,62601=>17236,22643=>17237,62602=>17237,142733=>17238,62603=>17238,148936=>17240,62605=>17240,132348=>17241,62606=>17241,155799=>17242,62607=>17242,134988=>17243,62608=>17243,21881=>17245,62610=>17245,17338=>17247,62612=>17247,19124=>17249,62614=>17249,141926=>17250,62615=>17250,135325=>17251,62616=>17251,33194=>17252,62617=>17252,39157=>17253,62618=>17253,134556=>17254,62619=>17254,25465=>17255,62620=>17255,14846=>17256,62621=>17256,141173=>17257,62622=>17257,36288=>17258,62623=>17258,22177=>17259,62624=>17259,25724=>17260,62625=>17260,15939=>17261,62626=>17261,173569=>17263,62628=>17263,134665=>17264,62629=>17264,142031=>17265,62630=>17265,135368=>17268,62633=>17268,145858=>17269,62634=>17269,14738=>17270,62635=>17270,14854=>17271,62636=>17271,164507=>17272,62637=>17272,13688=>17273,62638=>17273,155209=>17274,62639=>17274,139463=>17275,62640=>17275,142514=>17278,62643=>17278,169760=>17279,62644=>17279,13500=>17280,62645=>17280,27709=>17281,62646=>17281,151099=>17282,62647=>17282,161140=>17285,62650=>17285,142987=>17286,62651=>17286,139784=>17287,62652=>17287,173659=>17288,62653=>17288,167117=>17289,62654=>17289,134778=>17290,62655=>17290,134196=>17291,62656=>17291,161337=>17292,62683=>17292,142286=>17293,62684=>17293,62687=>17294,142417=>17294,14872=>17295,62689=>17295,62691=>17296,135367=>17296,62693=>17297,173618=>17297,167122=>17298,62695=>17298,167321=>17299,62696=>17299,167114=>17300,62697=>17300,38314=>17301,62698=>17301,62706=>17303,161630=>17303,28992=>17304,62708=>17304,20822=>17306,62385=>17306,20222=>17307,20616=>17308,62487=>17308,13459=>17310,62489=>17310,20870=>17311,62491=>17311,24130=>17312,63037=>17312,20997=>17313,62495=>17313,21031=>17314,62436=>17314,21113=>17315,62497=>17315,194600=>17316,13651=>17317,62504=>17317,21442=>17318,62505=>17318,21343=>17319,62715=>17319,21823=>17321,62520=>17321,21976=>17323,59986=>17323,13789=>17324,62722=>17324,22049=>17325,63067=>17325,22100=>17327,60044=>17327,60148=>17328,135291=>17328,60153=>17330,135379=>17330,61095=>17332,135934=>17332,14265=>17335,60104=>17335,23745=>17336,61099=>17336,23829=>17337,63066=>17337,23894=>17338,63030=>17338,14392=>17339,63036=>17339,20097=>17340,62477=>17340,24253=>17341,63038=>17341,14612=>17342,63042=>17342,25017=>17343,63050=>17343,25232=>17344,63054=>17344,25368=>17345,63056=>17345,25690=>17346,63063=>17346,25745=>17347,62381=>17347,33133=>17348,62709=>17348,33156=>17349,59922=>17349,33171=>17350,59924=>17350,26624=>17351,63080=>17351,15292=>17352,63093=>17352,29327=>17353,60517=>17353,29389=>17354,59781=>17354,149487=>17355,29497=>17356,59785=>17356,30018=>17357,59811=>17357,30172=>17358,59817=>17358,16320=>17359,59818=>17359,60278=>17360,151205=>17360,16343=>17361,59820=>17361,30336=>17363,30348=>17364,59824=>17364,151388=>17364,16552=>17365,59845=>17365,30777=>17366,59846=>17366,16643=>17367,59855=>17367,31377=>17368,59863=>17368,31771=>17369,59876=>17369,31981=>17370,59884=>17370,32659=>17371,62658=>17371,32686=>17372,59892=>17372,33535=>17374,59936=>17374,22623=>17375,59981=>17375,34482=>17376,59960=>17376,17836=>17377,34699=>17378,59963=>17378,35143=>17379,59969=>17379,35369=>17381,59972=>17381,36465=>17383,59988=>17383,60484=>17384,164233=>17384,36528=>17385,59990=>17385,37214=>17387,62443=>17387,37260=>17388,62441=>17388,39182=>17389,60051=>17389,39196=>17390,60054=>17390,39809=>17393,60066=>17393,40384=>17394,60080=>17394,40339=>17395,60078=>17395,40620=>17396,60085=>17396,19857=>17397,60540=>17397,37818=>17399,40571=>17400,60084=>17400,28809=>17401,63148=>17401,29512=>17402,59788=>17402,31129=>17404,59858=>17404,36791=>17405,59997=>17405,39234=>17407,60056=>17407,8364=>17601,12443=>17606,63518=>17606,12444=>17607,63519=>17607,11904=>17608,63520=>17608,12736=>17609,62211=>17609,12737=>17610,62212=>17610,12738=>17611,62213=>17611,12739=>17612,62214=>17612,12740=>17613,62215=>17613,131340=>17614,62216=>17614,12741=>17615,62217=>17615,131281=>17616,62218=>17616,131277=>17617,62219=>17617,12742=>17618,62220=>17618,12743=>17619,62221=>17619,131275=>17620,62222=>17620,139240=>17621,62223=>17621,12744=>17622,62224=>17622,131274=>17623,62225=>17623,12745=>17624,62226=>17624,12746=>17625,62227=>17625,12747=>17626,62228=>17626,12748=>17627,62229=>17627,131342=>17628,62230=>17628,12749=>17629,62231=>17629,12750=>17630,62232=>17630,62776=>17631,62777=>17632,138177=>17633,62778=>17633,194680=>17634,62779=>17634,12205=>17635,38737=>17635,62780=>17635,131206=>17636,62781=>17636,20059=>17637,62782=>17637,20155=>17638,62783=>17638,13630=>17639,62784=>17639,23587=>17640,62785=>17640,24401=>17641,62786=>17641,24516=>17642,62787=>17642,14586=>17643,62788=>17643,25164=>17644,62789=>17644,25909=>17645,62790=>17645,27514=>17646,62791=>17646,27701=>17647,62792=>17647,27706=>17648,62793=>17648,28780=>17649,62794=>17649,29227=>17650,62795=>17650,20012=>17651,62796=>17651,29357=>17652,62797=>17652,149737=>17653,62798=>17653,32594=>17654,62799=>17654,31035=>17655,62800=>17655,31993=>17656,62801=>17656,32595=>17657,62802=>17657,156266=>17658,62803=>17658,13505=>17659,62804=>17659,156491=>17660,62806=>17660,32770=>17661,62807=>17661,32896=>17662,62808=>17662,157202=>17663,62809=>17663,158033=>17664,62810=>17664,21341=>17665,62811=>17665,34916=>17666,62812=>17666,35265=>17667,62813=>17667,161970=>17668,62814=>17668,35744=>17669,62815=>17669,36125=>17670,62816=>17670,38021=>17671,62817=>17671,38264=>17672,62818=>17672,38271=>17673,62819=>17673,38376=>17674,62820=>17674,167439=>17675,62821=>17675,38886=>17676,62822=>17676,39029=>17677,62823=>17677,39118=>17678,62824=>17678,39134=>17679,62825=>17679,39267=>17680,62826=>17680,170000=>17681,62827=>17681,40060=>17682,62828=>17682,40479=>17683,62829=>17683,40644=>17684,62830=>17684,27503=>17685,62831=>17685,63751=>17686,62832=>17686,20023=>17687,62833=>17687,131207=>17688,62834=>17688,38429=>17689,62835=>17689,25143=>17690,62836=>17690,38050=>17691,62837=>17691,11908=>17692,63521=>17692,11910=>17693,63522=>17693,11911=>17694,63523=>17694,11912=>17695,63524=>17695,11914=>17696,63525=>17696,11916=>17697,63526=>17697,11917=>17698,63527=>17698,11925=>17699,63528=>17699,11932=>17700,63529=>17700,11941=>17701,63531=>17701,11943=>17702,63532=>17702,11946=>17703,63533=>17703,11948=>17704,63534=>17704,11950=>17705,63535=>17705,11958=>17706,63536=>17706,11964=>17707,63537=>17707,11966=>17708,63538=>17708,11978=>17709,63540=>17709,11980=>17710,63541=>17710,11981=>17711,63542=>17711,11983=>17712,63543=>17712,11990=>17713,63544=>17713,11991=>17714,63545=>17714,11998=>17715,63546=>17715,172969=>17716,62368=>17716,135493=>17717,62369=>17717,25866=>17718,62371=>17718,20029=>17719,62374=>17719,28381=>17720,62375=>17720,40270=>17721,62376=>17721,37343=>17722,62377=>17722,62380=>17723,161589=>17723,20250=>17724,62382=>17724,20264=>17725,62383=>17725,20392=>17726,62384=>17726,20852=>17727,62386=>17727,20892=>17728,62387=>17728,20964=>17729,62388=>17729,21153=>17730,62389=>17730,21160=>17731,62390=>17731,21307=>17732,62391=>17732,21326=>17733,62392=>17733,21457=>17734,62393=>17734,21464=>17735,62394=>17735,22242=>17736,62395=>17736,22768=>17737,62396=>17737,22788=>17738,62397=>17738,22791=>17739,62398=>17739,22834=>17740,62399=>17740,22836=>17741,62400=>17741,23398=>17742,62401=>17742,23454=>17743,62402=>17743,23455=>17744,62403=>17744,23706=>17745,62404=>17745,24198=>17746,62405=>17746,24635=>17747,62406=>17747,25993=>17748,62407=>17748,26622=>17749,62408=>17749,26628=>17750,62409=>17750,26725=>17751,62410=>17751,27982=>17752,62411=>17752,28860=>17753,62412=>17753,30005=>17754,62413=>17754,32420=>17755,62414=>17755,32428=>17756,62415=>17756,32442=>17757,62416=>17757,32455=>17758,62417=>17758,32463=>17759,62418=>17759,32479=>17760,62419=>17760,32518=>17761,62420=>17761,32567=>17762,62421=>17762,33402=>17763,62422=>17763,33487=>17764,62423=>17764,33647=>17765,62424=>17765,35270=>17766,62425=>17766,35774=>17767,62426=>17767,35810=>17768,62427=>17768,36710=>17769,62428=>17769,36711=>17770,62429=>17770,36718=>17771,62430=>17771,29713=>17772,62431=>17772,31996=>17773,62432=>17773,32205=>17774,62433=>17774,26950=>17775,62434=>17775,31433=>17776,62435=>17776,30904=>17777,62442=>17777,32956=>17778,62444=>17778,36107=>17779,62446=>17779,33014=>17780,62447=>17780,133607=>17781,62448=>17781,32927=>17782,62451=>17782,40647=>17783,62452=>17783,19661=>17784,62453=>17784,40393=>17785,62454=>17785,40460=>17786,62455=>17786,19518=>17787,62456=>17787,171510=>17788,62457=>17788,159758=>17789,62458=>17789,40458=>17790,62459=>17790,172339=>17791,62460=>17791,13761=>17792,62461=>17792,28314=>17793,62463=>17793,33342=>17794,62464=>17794,29977=>17795,62465=>17795,18705=>17796,62467=>17796,39532=>17797,62468=>17797,39567=>17798,62469=>17798,40857=>17799,62470=>17799,31111=>17800,62471=>17800,164972=>17801,62472=>17801,138698=>17802,62473=>17802,132560=>17803,62474=>17803,142054=>17804,62475=>17804,20004=>17805,62476=>17805,20096=>17806,62478=>17806,20103=>17807,62479=>17807,20159=>17808,62480=>17808,20203=>17809,62481=>17809,20279=>17810,62482=>17810,13388=>17811,62483=>17811,20413=>17812,62484=>17812,15944=>17813,62485=>17813,20483=>17814,62486=>17814,13437=>17815,62488=>17815,13477=>17816,62490=>17816,22789=>17817,62492=>17817,20955=>17818,62493=>17818,20988=>17819,62494=>17819,20105=>17820,62496=>17820,21136=>17821,62498=>17821,21287=>17822,62499=>17822,13767=>17823,62500=>17823,21417=>17824,62501=>17824,13649=>17825,62502=>17825,21424=>17826,62503=>17826,21539=>17827,62506=>17827,13677=>17828,62507=>17828,13682=>17829,62508=>17829,13953=>17830,62509=>17830,21651=>17831,62510=>17831,21667=>17832,62511=>17832,21684=>17833,62512=>17833,21689=>17834,62513=>17834,21712=>17835,62514=>17835,21743=>17836,62515=>17836,21784=>17837,62516=>17837,21795=>17838,62517=>17838,21800=>17839,62518=>17839,13720=>17840,62519=>17840,13733=>17841,62521=>17841,13759=>17842,62522=>17842,21975=>17843,62523=>17843,13765=>17844,62524=>17844,163204=>17845,62525=>17845,16467=>17846,62538=>17846,62551=>17847,135412=>17847,62555=>17848,134155=>17848,62574=>17849,161992=>17849,62580=>17850,155813=>17850,62583=>17851,142668=>17851,62585=>17852,135287=>17852,62587=>17853,135279=>17853,62595=>17854,139681=>17854,62609=>17855,134550=>17855,16571=>17856,62611=>17856,62631=>17857,142537=>17857,22098=>17858,62641=>17858,134961=>17859,62642=>17859,62657=>17860,157724=>17860,135375=>17861,62659=>17861,141315=>17862,62660=>17862,141625=>17863,62661=>17863,13819=>17864,62662=>17864,152035=>17865,62663=>17865,134796=>17866,62664=>17866,135053=>17867,62665=>17867,134826=>17868,62666=>17868,16275=>17869,62667=>17869,134960=>17870,62668=>17870,134471=>17871,62669=>17871,135503=>17872,62670=>17872,134732=>17873,62671=>17873,134827=>17874,62673=>17874,134057=>17875,62674=>17875,134472=>17876,62675=>17876,135360=>17877,62676=>17877,135485=>17878,62677=>17878,16377=>17879,62678=>17879,140950=>17880,62679=>17880,25650=>17881,62680=>17881,135085=>17882,62681=>17882,144372=>17883,62682=>17883,62685=>17884,134526=>17884,62686=>17885,134527=>17885,62688=>17886,142421=>17886,62690=>17887,134808=>17887,62692=>17888,134958=>17888,62694=>17889,158544=>17889,21708=>17890,62699=>17890,33476=>17891,62700=>17891,21945=>17892,62701=>17892,171715=>17893,62703=>17893,39974=>17894,62704=>17894,39606=>17895,62705=>17895,62707=>17896,142830=>17896,33004=>17897,62710=>17897,23580=>17898,62711=>17898,157042=>17899,62712=>17899,33076=>17900,62713=>17900,14231=>17901,62714=>17901,164029=>17902,62716=>17902,37302=>17903,62717=>17903,134906=>17904,62718=>17904,134671=>17905,62719=>17905,134775=>17906,62720=>17906,134907=>17907,62721=>17907,151019=>17908,62723=>17908,13833=>17909,62724=>17909,134358=>17910,62725=>17910,22191=>17911,62726=>17911,141237=>17912,62727=>17912,135369=>17913,62728=>17913,134672=>17914,62729=>17914,134776=>17915,62730=>17915,135288=>17916,62731=>17916,135496=>17917,62732=>17917,164359=>17918,62733=>17918,136277=>17919,62734=>17919,134777=>17920,62735=>17920,151120=>17921,62736=>17921,142756=>17922,62737=>17922,23124=>17923,62738=>17923,62739=>17924,135197=>17924,62740=>17925,135198=>17925,62741=>17926,135413=>17926,62742=>17927,135414=>17927,22428=>17928,62743=>17928,134673=>17929,62744=>17929,161428=>17930,62745=>17930,164557=>17931,62746=>17931,135093=>17932,62747=>17932,134779=>17933,62748=>17933,151934=>17934,62749=>17934,14083=>17935,62750=>17935,135094=>17936,62751=>17936,135552=>17937,62752=>17937,152280=>17938,62753=>17938,172733=>17939,62754=>17939,149978=>17940,62755=>17940,137274=>17941,62756=>17941,147831=>17942,62757=>17942,164476=>17943,62758=>17943,22681=>17944,62759=>17944,21096=>17945,62760=>17945,13850=>17946,62761=>17946,153405=>17947,62762=>17947,31666=>17948,62763=>17948,23400=>17949,62764=>17949,18432=>17950,62765=>17950,19244=>17951,62766=>17951,40743=>17952,62767=>17952,18919=>17953,62768=>17953,39967=>17954,62769=>17954,39821=>17955,62770=>17955,154484=>17956,62771=>17956,143677=>17957,62772=>17957,22011=>17958,62773=>17958,13810=>17959,62774=>17959,22153=>17960,62775=>17960,23870=>17961,63028=>17961,23880=>17962,63029=>17962,15868=>17963,63031=>17963,14351=>17964,63032=>17964,23972=>17965,63033=>17965,23993=>17966,63034=>17966,14368=>17967,63035=>17967,24357=>17968,63039=>17968,24451=>17969,63040=>17969,14600=>17970,63041=>17970,14655=>17971,63043=>17971,14669=>17972,63044=>17972,24791=>17973,63045=>17973,24893=>17974,63046=>17974,23781=>17975,63047=>17975,14729=>17976,63048=>17976,25015=>17977,63049=>17977,25039=>17978,63051=>17978,14776=>17979,63052=>17979,25132=>17980,63053=>17980,25317=>17981,63055=>17981,14840=>17982,63057=>17982,22193=>17983,63058=>17983,14851=>17984,63059=>17984,25570=>17985,63060=>17985,25595=>17986,63061=>17986,25607=>17987,63062=>17987,14923=>17988,63064=>17988,25792=>17989,63065=>17989,40863=>17990,63068=>17990,14999=>17991,63069=>17991,25990=>17992,63070=>17992,15037=>17993,63071=>17993,26111=>17994,63072=>17994,26195=>17995,63073=>17995,15090=>17996,63074=>17996,26258=>17997,63075=>17997,15138=>17998,63076=>17998,26390=>17999,63077=>17999,15170=>18000,63078=>18000,26532=>18001,63079=>18001,15192=>18002,63081=>18002,26698=>18003,63082=>18003,26756=>18004,63083=>18004,15218=>18005,63084=>18005,15217=>18006,63085=>18006,15227=>18007,63086=>18007,26889=>18008,63087=>18008,26947=>18009,63088=>18009,29276=>18010,63089=>18010,26980=>18011,63090=>18011,27039=>18012,63091=>18012,27013=>18013,63092=>18013,27094=>18014,63094=>18014,15325=>18015,63095=>18015,27237=>18016,63096=>18016,27252=>18017,63097=>18017,27249=>18018,63098=>18018,27266=>18019,63099=>18019,15340=>18020,63100=>18020,27289=>18021,63101=>18021,15346=>18022,63102=>18022,27307=>18023,63103=>18023,27317=>18024,63104=>18024,27348=>18025,63105=>18025,27382=>18026,63106=>18026,27521=>18027,63107=>18027,27585=>18028,63108=>18028,27626=>18029,63109=>18029,27765=>18030,63110=>18030,27818=>18031,63111=>18031,15563=>18032,63112=>18032,27906=>18033,63113=>18033,27910=>18034,63114=>18034,27942=>18035,63115=>18035,28033=>18036,63116=>18036,15599=>18037,63117=>18037,28068=>18038,63118=>18038,28081=>18039,63119=>18039,28181=>18040,63120=>18040,28184=>18041,63121=>18041,28201=>18042,63122=>18042,28294=>18043,63123=>18043,166336=>18044,63124=>18044,28347=>18045,63125=>18045,28386=>18046,63126=>18046,28378=>18047,63127=>18047,40831=>18048,63128=>18048,28392=>18049,63129=>18049,28393=>18050,63130=>18050,28452=>18051,63131=>18051,28468=>18052,63132=>18052,15686=>18053,63133=>18053,147265=>18054,63134=>18054,28545=>18055,63135=>18055,28606=>18056,63136=>18056,15722=>18057,63137=>18057,15733=>18058,63138=>18058,29111=>18059,63139=>18059,23705=>18060,63140=>18060,15754=>18061,63141=>18061,28716=>18062,63142=>18062,15761=>18063,63143=>18063,28752=>18064,63144=>18064,28756=>18065,63145=>18065,28783=>18066,63146=>18066,28799=>18067,63147=>18067,131877=>18068,63149=>18068,17345=>18069,63150=>18069,13809=>18070,63151=>18070,134872=>18071,63152=>18071,13902=>18072,58134=>18072,15789=>18073,58172=>18073,154725=>18074,58173=>18074,26237=>18075,58183=>18075,31860=>18076,58188=>18076,29837=>18077,58197=>18077,32402=>18078,58215=>18078,17667=>18079,58232=>18079,58260=>18080,151480=>18080,58270=>18081,133901=>18081,58277=>18082,158474=>18082,13438=>18083,58311=>18083,58317=>18084,143087=>18084,58325=>18085,146613=>18085,58343=>18086,159385=>18086,34673=>18087,58364=>18087,25537=>18088,58385=>18088,30583=>18089,58387=>18089,35210=>18090,58390=>18090,58406=>18091,147343=>18091,35660=>18092,58415=>18092,58440=>18093,150729=>18093,18730=>18094,58464=>18094,172052=>18095,58471=>18095,165564=>18096,58472=>18096,165121=>18097,58473=>18097,15088=>18098,58490=>18098,28815=>18099,58511=>18099,58529=>18100,140922=>18100,58637=>18101,158120=>18101,58646=>18102,148043=>18102,26760=>18103,58662=>18103,58664=>18104,139611=>18104,40802=>18105,58702=>18105,37830=>18106,58793=>18106,58802=>18107,131967=>18107,37734=>18108,58888=>18108,37519=>18109,58901=>18109,34324=>18110,58954=>18110,58986=>18111,173147=>18111,16784=>18112,59010=>18112,26511=>18113,59045=>18113,26654=>18114,59048=>18114,14435=>18115,59051=>18115,59077=>18116,149996=>18116,15129=>18117,59128=>18117,33942=>18118,59176=>18118,59241=>18119,149858=>18119,14818=>18120,59254=>18120,33920=>18121,59259=>18121,17262=>18122,59328=>18122,38769=>18123,59402=>18123,39323=>18124,59427=>18124,18733=>18125,59499=>18125,28439=>18126,59703=>18126,160009=>18127,59704=>18127,28838=>18128,59746=>18128,150095=>18129,59752=>18129,32357=>18130,59753=>18130,23855=>18131,59755=>18131,15859=>18132,59756=>18132,150109=>18133,59758=>18133,137183=>18134,59759=>18134,32164=>18135,59760=>18135,33830=>18136,59761=>18136,21637=>18137,59762=>18137,146170=>18138,59763=>18138,131604=>18139,59765=>18139,22398=>18140,59766=>18140,133333=>18141,59767=>18141,132633=>18142,59768=>18142,16357=>18143,59769=>18143,139166=>18144,59770=>18144,172726=>18145,59771=>18145,28675=>18146,59772=>18146,168283=>18147,59773=>18147,23920=>18148,59774=>18148,29583=>18149,59775=>18149,166489=>18150,59777=>18150,168992=>18151,59778=>18151,20424=>18152,59779=>18152,32743=>18153,59780=>18153,29456=>18154,59782=>18154,29496=>18155,59784=>18155,29505=>18156,59787=>18156,16041=>18157,59789=>18157,29173=>18158,59792=>18158,149746=>18159,59793=>18159,29665=>18160,59794=>18160,16074=>18161,59796=>18161,16081=>18162,59798=>18162,29721=>18163,59801=>18163,29726=>18164,59802=>18164,29727=>18165,59803=>18165,16098=>18166,59804=>18166,16112=>18167,59805=>18167,16116=>18168,59806=>18168,16122=>18169,59807=>18169,29907=>18170,59808=>18170,16142=>18171,59809=>18171,16211=>18172,59810=>18172,30061=>18173,59812=>18173,30066=>18174,59813=>18174,30093=>18175,59814=>18175,16252=>18176,59815=>18176,30152=>18177,59816=>18177,30285=>18178,59819=>18178,30324=>18179,59821=>18179,16348=>18180,59822=>18180,30330=>18181,59823=>18181,29064=>18182,59825=>18182,22051=>18183,59826=>18183,35200=>18184,59827=>18184,16413=>18185,59829=>18185,30531=>18186,59830=>18186,16441=>18187,59831=>18187,16453=>18188,59833=>18188,13787=>18189,59834=>18189,30616=>18190,59835=>18190,16490=>18191,59836=>18191,16495=>18192,59837=>18192,30654=>18193,59839=>18193,30667=>18194,59840=>18194,30744=>18195,59842=>18195,30748=>18196,59844=>18196,30791=>18197,59847=>18197,30801=>18198,59848=>18198,30822=>18199,59849=>18199,33864=>18200,59850=>18200,152885=>18201,59851=>18201,31027=>18202,59852=>18202,31026=>18203,59854=>18203,16649=>18204,59856=>18204,31121=>18205,59857=>18205,31238=>18206,59860=>18206,16743=>18207,59862=>18207,16818=>18208,59864=>18208,31420=>18209,59865=>18209,33401=>18210,59866=>18210,16836=>18211,59867=>18211,31439=>18212,59868=>18212,31451=>18213,59869=>18213,16847=>18214,59870=>18214,31586=>18215,59872=>18215,31596=>18216,59873=>18216,31611=>18217,59874=>18217,31762=>18218,59875=>18218,16992=>18219,59877=>18219,17018=>18220,59878=>18220,31867=>18221,59879=>18221,31900=>18222,59880=>18222,17036=>18223,59881=>18223,31928=>18224,59882=>18224,17044=>18225,59883=>18225,36755=>18226,59885=>18226,28864=>18227,59886=>18227,134351=>18228,59887=>18228,32207=>18229,59888=>18229,32212=>18230,59889=>18230,32208=>18231,59890=>18231,32253=>18232,59891=>18232,32692=>18233,59893=>18233,29343=>18234,59894=>18234,17303=>18235,59895=>18235,32800=>18236,59896=>18236,32805=>18237,59897=>18237,32814=>18238,59899=>18238,32817=>18239,59900=>18239,32852=>18240,59901=>18240,22452=>18241,59903=>18241,28832=>18242,59904=>18242,32951=>18243,59905=>18243,33001=>18244,59906=>18244,17389=>18245,59907=>18245,33036=>18246,59908=>18246,33038=>18247,59910=>18247,33042=>18248,59911=>18248,33044=>18249,59913=>18249,17409=>18250,59914=>18250,15161=>18251,59915=>18251,33110=>18252,59916=>18252,33113=>18253,59917=>18253,33114=>18254,59918=>18254,17427=>18255,59919=>18255,33148=>18256,59921=>18256,17445=>18257,59923=>18257,17453=>18258,59925=>18258,33189=>18259,59926=>18259,22511=>18260,59927=>18260,33217=>18261,59928=>18261,33252=>18262,59929=>18262,33364=>18263,59930=>18263,17551=>18264,59931=>18264,33398=>18265,59933=>18265,33482=>18266,59934=>18266,33496=>18267,59935=>18267,17584=>18268,59937=>18268,33623=>18269,59938=>18269,38505=>18270,59939=>18270,33797=>18271,59941=>18271,28917=>18272,59942=>18272,33892=>18273,59943=>18273,33928=>18274,59945=>18274,17668=>18275,59946=>18275,33982=>18276,59947=>18276,34017=>18277,59948=>18277,34040=>18278,59949=>18278,34064=>18279,59950=>18279,34104=>18280,59951=>18280,34130=>18281,59952=>18281,17723=>18282,59953=>18282,34159=>18283,59954=>18283,34160=>18284,59955=>18284,34272=>18285,59956=>18285,17783=>18286,59957=>18286,34418=>18287,59958=>18287,34450=>18288,59959=>18288,34543=>18289,59961=>18289,38469=>18290,59962=>18290,17926=>18291,59964=>18291,17943=>18292,59965=>18292,34990=>18293,59966=>18293,35071=>18294,59967=>18294,35108=>18295,59968=>18295,35217=>18296,59970=>18296,162151=>18297,59971=>18297,35384=>18298,59973=>18298,35476=>18299,59974=>18299,35508=>18300,59975=>18300,35921=>18301,59976=>18301,36052=>18302,59977=>18302,36082=>18303,59978=>18303,36124=>18304,59979=>18304,18328=>18305,59980=>18305,36291=>18306,59982=>18306,18413=>18307,59983=>18307,36410=>18308,59985=>18308,22356=>18309,59987=>18309,22005=>18310,59989=>18310,18487=>18311,59991=>18311,36558=>18312,59992=>18312,36578=>18313,59993=>18313,36580=>18314,59994=>18314,36589=>18315,59995=>18315,36594=>18316,59996=>18316,36801=>18317,59998=>18317,36810=>18318,59999=>18318,36812=>18319,60000=>18319,36915=>18320,60001=>18320,18605=>18321,60003=>18321,39136=>18322,60004=>18322,37395=>18323,60005=>18323,18718=>18324,60006=>18324,37416=>18325,60007=>18325,37464=>18326,60008=>18326,37483=>18327,60009=>18327,37553=>18328,60010=>18328,37550=>18329,60011=>18329,37567=>18330,60012=>18330,37603=>18331,60013=>18331,37611=>18332,60014=>18332,37619=>18333,60015=>18333,37620=>18334,60016=>18334,37629=>18335,60017=>18335,37699=>18336,60018=>18336,37764=>18337,60019=>18337,37805=>18338,60020=>18338,18757=>18339,60021=>18339,18769=>18340,60022=>18340,37911=>18341,60024=>18341,37917=>18342,60026=>18342,37933=>18343,60027=>18343,37950=>18344,60028=>18344,18794=>18345,60029=>18345,37972=>18346,60030=>18346,38009=>18347,60031=>18347,38189=>18348,60032=>18348,38306=>18349,60033=>18349,18855=>18350,60034=>18350,38388=>18351,60035=>18351,38451=>18352,60036=>18352,18917=>18353,60037=>18353,18980=>18354,60039=>18354,38720=>18355,60040=>18355,18997=>18356,60041=>18356,38834=>18357,60042=>18357,38850=>18358,60043=>18358,19172=>18359,60045=>18359,39097=>18360,60047=>18360,19225=>18361,60048=>18361,39153=>18362,60049=>18362,22596=>18363,60050=>18363,39193=>18364,60052=>18364,39223=>18365,60055=>18365,39261=>18366,60057=>18366,39266=>18367,60058=>18367,19312=>18368,60059=>18368,39365=>18369,60060=>18369,19357=>18370,60061=>18370,39484=>18371,60062=>18371,39695=>18372,60063=>18372,39785=>18373,60065=>18373,39901=>18374,60067=>18374,39921=>18375,60068=>18375,39924=>18376,60069=>18376,19565=>18377,60070=>18377,39968=>18378,60071=>18378,14191=>18379,60072=>18379,138178=>18380,60073=>18380,40265=>18381,60074=>18381,40702=>18382,60076=>18382,22096=>18383,60077=>18383,40381=>18384,60079=>18384,40444=>18385,60081=>18385,38134=>18386,60082=>18386,36790=>18387,60083=>18387,40625=>18388,60086=>18388,40637=>18389,60087=>18389,40646=>18390,60088=>18390,38108=>18391,60089=>18391,40674=>18392,60090=>18392,40689=>18393,60091=>18393,40696=>18394,60092=>18394,40772=>18395,60094=>18395,131220=>18396,60095=>18396,131767=>18397,60096=>18397,132000=>18398,60097=>18398,38083=>18399,60099=>18399,60101=>18400,132311=>18400,38081=>18401,60103=>18401,132565=>18402,60105=>18402,132629=>18403,60106=>18403,132726=>18404,60107=>18404,136890=>18405,60108=>18405,22359=>18406,60109=>18406,29043=>18407,60110=>18407,133826=>18408,60111=>18408,133837=>18409,60112=>18409,134079=>18410,60113=>18410,194619=>18411,60115=>18411,134091=>18412,60116=>18412,21662=>18413,60117=>18413,134139=>18414,60118=>18414,134203=>18415,60119=>18415,134227=>18416,60120=>18416,134245=>18417,60121=>18417,134268=>18418,60122=>18418,60124=>18419,134285=>18419,134325=>18420,60126=>18420,134365=>18421,60127=>18421,134381=>18422,60128=>18422,134511=>18423,60129=>18423,134578=>18424,60130=>18424,134600=>18425,60131=>18425,134660=>18426,60135=>18426,134670=>18427,60136=>18427,134871=>18428,60137=>18428,135056=>18429,60138=>18429,134957=>18430,60139=>18430,134771=>18431,60140=>18431,60142=>18432,135100=>18432,135260=>18433,60144=>18433,135247=>18434,60145=>18434,135286=>18435,60146=>18435,135304=>18436,60149=>18436,135318=>18437,60150=>18437,13895=>18438,60151=>18438,135359=>18439,60152=>18439,135471=>18440,60154=>18440,135483=>18441,60155=>18441,21348=>18442,60156=>18442,135907=>18443,60158=>18443,136053=>18444,60159=>18444,60160=>18445,135990=>18445,136567=>18446,60162=>18446,136729=>18447,60163=>18447,137155=>18448,60164=>18448,137159=>18449,60165=>18449,28859=>18450,60167=>18450,137261=>18451,60168=>18451,137578=>18452,60169=>18452,137773=>18453,60170=>18453,137797=>18454,60171=>18454,138282=>18455,60172=>18455,138352=>18456,60173=>18456,138412=>18457,60174=>18457,138952=>18458,60175=>18458,138965=>18459,60177=>18459,139029=>18460,60178=>18460,29080=>18461,60179=>18461,139333=>18462,60181=>18462,27113=>18463,60182=>18463,14024=>18464,60183=>18464,139900=>18465,60184=>18465,140247=>18466,60185=>18466,140282=>18467,60186=>18467,141098=>18468,60187=>18468,141425=>18469,60188=>18469,141647=>18470,60189=>18470,141671=>18471,60191=>18471,141715=>18472,60192=>18472,142037=>18473,60193=>18473,60195=>18474,142056=>18474,60197=>18475,142094=>18475,60199=>18476,142143=>18476,60202=>18477,142412=>18477,142472=>18478,60204=>18478,142519=>18479,60205=>18479,154600=>18480,60206=>18480,142600=>18481,60207=>18481,142610=>18482,60208=>18482,142775=>18483,60209=>18483,142741=>18484,60210=>18484,142914=>18485,60211=>18485,143220=>18486,60212=>18486,143308=>18487,60213=>18487,143411=>18488,60214=>18488,143462=>18489,60215=>18489,144159=>18490,60216=>18490,144350=>18491,60217=>18491,144743=>18492,60222=>18492,144883=>18493,60223=>18493,144922=>18494,60227=>18494,145174=>18495,60228=>18495,22709=>18496,60231=>18496,60234=>18497,146087=>18497,146961=>18498,60237=>18498,147129=>18499,60238=>18499,60243=>18500,147737=>18500,148206=>18501,60245=>18501,148237=>18502,60246=>18502,148276=>18503,60248=>18503,148374=>18504,60249=>18504,148484=>18505,60258=>18505,148694=>18506,60259=>18506,22408=>18507,60260=>18507,149108=>18508,60261=>18508,60263=>18509,149295=>18509,149522=>18510,60271=>18510,149755=>18511,60272=>18511,150037=>18512,60273=>18512,60275=>18513,150208=>18513,22885=>18514,60277=>18514,60279=>18515,151430=>18515,60282=>18516,151596=>18516,22335=>18517,60284=>18517,152217=>18518,60286=>18518,152601=>18519,60287=>18519,152646=>18520,60291=>18520,152686=>18521,60292=>18521,60296=>18522,152895=>18522,60298=>18523,152926=>18523,152930=>18524,60300=>18524,152934=>18525,60301=>18525,153543=>18526,60302=>18526,60304=>18527,153693=>18527,60309=>18528,153859=>18528,154286=>18529,60312=>18529,154505=>18530,60313=>18530,154630=>18531,60314=>18531,22433=>18532,60316=>18532,29009=>18533,60317=>18533,60319=>18534,155906=>18534,60322=>18535,156082=>18535,156674=>18536,60325=>18536,156746=>18537,60326=>18537,60330=>18538,156804=>18538,60334=>18539,156808=>18539,60336=>18540,156946=>18540,157119=>18541,60338=>18541,157365=>18542,60339=>18542,22201=>18543,60347=>18543,60349=>18544,157436=>18544,13848=>18545,60355=>18545,157593=>18546,60357=>18546,157806=>18547,60358=>18547,60360=>18548,157790=>18548,60362=>18549,157895=>18549,60366=>18550,157990=>18550,60368=>18551,158009=>18551,60371=>18552,158202=>18552,60373=>18553,158253=>18553,158260=>18554,60378=>18554,158555=>18555,60379=>18555,60383=>18556,158621=>18556,60385=>18557,158884=>18557,60388=>18558,159150=>18558,159819=>18559,60392=>18559,160205=>18560,60393=>18560,160384=>18561,60395=>18561,160389=>18562,60396=>18562,60399=>18563,160395=>18563,60401=>18564,160486=>18564,38047=>18565,60404=>18565,160848=>18566,60405=>18566,14009=>18567,60416=>18567,161740=>18568,60424=>18568,161880=>18569,60425=>18569,22230=>18570,60426=>18570,60435=>18571,162269=>18571,162301=>18572,60441=>18572,162314=>18573,60442=>18573,162571=>18574,60443=>18574,163174=>18575,60444=>18575,60448=>18576,163849=>18576,60459=>18577,163875=>18577,60463=>18578,163912=>18578,60466=>18579,163971=>18579,163984=>18580,60479=>18580,164084=>18581,60480=>18581,164142=>18582,60481=>18582,60483=>18583,164175=>18583,164271=>18584,60485=>18584,164378=>18585,60486=>18585,164614=>18586,60487=>18586,164655=>18587,60488=>18587,164746=>18588,60489=>18588,164968=>18589,60491=>18589,165546=>18590,60492=>18590,25574=>18591,60494=>18591,166230=>18592,60495=>18592,60498=>18593,166328=>18593,60500=>18594,166375=>18594,60502=>18595,166376=>18595,166726=>18596,60503=>18596,166868=>18597,60504=>18597,60506=>18598,166921=>18598,167877=>18599,60508=>18599,168172=>18600,60509=>18600,168208=>18601,60511=>18601,168252=>18602,60512=>18602,15863=>18603,60513=>18603,168286=>18604,60514=>18604,150218=>18605,60515=>18605,36816=>18606,60516=>18606,60519=>18607,169191=>18607,169392=>18608,60521=>18608,169400=>18609,60522=>18609,169778=>18610,60523=>18610,170193=>18611,60524=>18611,170313=>18612,60525=>18612,170346=>18613,60526=>18613,170435=>18614,60527=>18614,170536=>18615,60528=>18615,170766=>18616,60529=>18616,171354=>18617,60530=>18617,171419=>18618,60531=>18618,32415=>18619,60532=>18619,171768=>18620,60533=>18620,171811=>18621,60534=>18621,19620=>18622,60535=>18622,38215=>18623,60536=>18623,172691=>18624,60537=>18624,29090=>18625,60538=>18625,172799=>18626,60539=>18626,173515=>18627,60542=>18627,19868=>18628,60543=>18628,134300=>18629,60544=>18629,36798=>18630,60545=>18630,36794=>18631,60547=>18631,140464=>18632,60548=>18632,36793=>18633,60549=>18633,150163=>18634,60550=>18634,20202=>18635,60555=>18635,60557=>18636,166700=>18636,36480=>18637,60560=>18637,137205=>18638,60561=>18638,166764=>18639,60563=>18639,166809=>18640,60564=>18640,60566=>18641,157359=>18641,60568=>18642,161365=>18642,153141=>18643,60570=>18643,153942=>18644,60571=>18644,20122=>18645,60572=>18645,155265=>18646,60573=>18646,60576=>18647,134765=>18647,147080=>18648,60579=>18648,150686=>18649,60580=>18649,137206=>18650,60583=>18650,137339=>18651,60584=>18651,60587=>18652,154698=>18652,152337=>18653,60589=>18653,15814=>18654,60590=>18654,60596=>18655,155352=>18655,19996=>18656,60600=>18656,135146=>18657,60601=>18657,134473=>18658,60602=>18658,145082=>18659,60603=>18659,60638=>18660,151880=>18660,21982=>18661,60644=>18661,34694=>18662,60672=>18662,60676=>18663,135361=>18663,149254=>18664,60679=>18664,23440=>18665,60680=>18665,60682=>18666,157843=>18666,141044=>18667,60684=>18667,163119=>18668,60685=>18668,147875=>18669,60686=>18669,163187=>18670,60687=>18670,159440=>18671,60688=>18671,160438=>18672,60689=>18672,60691=>18673,135641=>18673,146684=>18674,60693=>18674,173737=>18675,60694=>18675,134828=>18676,60695=>18676,60698=>18677,138402=>18677,60700=>18678,151490=>18678,60702=>18679,135147=>18679,60706=>18680,142752=>18680,135148=>18681,60710=>18681,134666=>18682,60711=>18682,60714=>18683,135149=>18683,60717=>18684,135559=>18684,19994=>18685,60721=>18685,19972=>18686,60722=>18686,23309=>18687,60724=>18687,13996=>18688,60727=>18688,21373=>18689,60729=>18689,13989=>18690,60730=>18690,22682=>18691,60732=>18691,150382=>18692,60733=>18692,22442=>18693,60736=>18693,154261=>18694,60737=>18694,133497=>18695,60738=>18695,60741=>18696,140389=>18696,146686=>18697,60746=>18697,171824=>18698,60747=>18698,151465=>18699,60749=>18699,169374=>18700,60750=>18700,60753=>18701,146870=>18701,157619=>18702,60755=>18702,145184=>18703,60756=>18703,147191=>18704,60759=>18704,146988=>18705,60760=>18705,60785=>18706,143578=>18706,135849=>18707,60789=>18707,22439=>18708,60790=>18708,149859=>18709,60791=>18709,60794=>18710,159918=>18710,60801=>18711,137068=>18711,60806=>18712,160100=>18712,159010=>18713,60809=>18713,150242=>18714,60810=>18714,39963=>18715,60837=>18715,149822=>18716,60838=>18716,15878=>18717,60846=>18717,60881=>18718,159011=>18718,60887=>18719,132092=>18719,60891=>18720,146685=>18720,60893=>18721,149785=>18721,22394=>18722,60904=>18722,21722=>18723,60912=>18723,29050=>18724,60928=>18724,60949=>18725,150135=>18725,60955=>18726,166490=>18726,60962=>18727,194624=>18727,60976=>18728,137275=>18728,61000=>18729,155993=>18729,61014=>18730,144373=>18730,61019=>18731,166850=>18731,61024=>18732,138566=>18732,61054=>18733,159441=>18733,13877=>18734,61065=>18734,61084=>18735,166701=>18735,21024=>18736,61088=>18736,15384=>18737,61089=>18737,146631=>18738,61090=>18738,155351=>18739,61091=>18739,161366=>18740,61092=>18740,152881=>18741,61093=>18741,137540=>18742,61094=>18742,170243=>18743,61096=>18743,159196=>18744,61097=>18744,159917=>18745,61098=>18745,156077=>18746,61100=>18746,166415=>18747,61101=>18747,145015=>18748,61102=>18748,131310=>18749,61103=>18749,157766=>18750,61104=>18750,151310=>18751,61105=>18751,17762=>18752,61106=>18752,23327=>18753,61107=>18753,156492=>18754,61108=>18754,40784=>18755,61109=>18755,40614=>18756,61110=>18756,156267=>18757,61111=>18757,20962=>18758,57415=>18758,21314=>18759,57416=>18759,26285=>18760,57520=>18760,22620=>18761,57547=>18761,21843=>18762,57566=>18762,15749=>18763,57594=>18763,24928=>18764,57608=>18764,18606=>18765,57668=>18765,38845=>18766,57676=>18766,57693=>18767,137335=>18767,24755=>18768,57703=>18768,33828=>18769,57711=>18769,38932=>18770,57748=>18770,147596=>18771,57749=>18771,57764=>18772,143486=>18772,57787=>18773,138813=>18773,15147=>18774,57798=>18774,15666=>18775,57824=>18775,57857=>18776,132021=>18776,28801=>18777,57944=>18777,23708=>18778,57959=>18778,58017=>18779,132547=>18779,14128=>18780,58028=>18780,136054=>18781,58096=>18781,150034=>18782,58097=>18782,58111=>18783,166699=>18783,58112=>18784,155779=>18784,256=>18785,62233=>18785,193=>18786,62234=>18786,461=>18787,62235=>18787,192=>18788,62236=>18788,274=>18789,62237=>18789,201=>18790,62238=>18790,282=>18791,62239=>18791,200=>18792,62240=>18792,332=>18793,62241=>18793,211=>18794,62242=>18794,465=>18795,62243=>18795,210=>18796,62244=>18796,62245=>18797,7870=>18798,62246=>18798,62247=>18799,7872=>18800,62248=>18800,202=>18801,62249=>18801,257=>18802,62250=>18802,225=>18803,62251=>18803,462=>18804,62252=>18804,224=>18805,62253=>18805,593=>18806,62254=>18806,275=>18807,62255=>18807,233=>18808,62256=>18808,283=>18809,62257=>18809,232=>18810,62258=>18810,299=>18811,62259=>18811,237=>18812,62260=>18812,464=>18813,62261=>18813,236=>18814,62262=>18814,333=>18815,62263=>18815,243=>18816,62264=>18816,466=>18817,62265=>18817,242=>18818,62266=>18818,363=>18819,62267=>18819,250=>18820,62268=>18820,468=>18821,62269=>18821,249=>18822,62270=>18822,470=>18823,62271=>18823,472=>18824,62272=>18824,474=>18825,62273=>18825,476=>18826,62274=>18826,252=>18827,62275=>18827,62276=>18828,7871=>18829,62277=>18829,62278=>18830,7873=>18831,62279=>18831,234=>18832,62280=>18832,609=>18833,62281=>18833,643=>18834,63551=>18834,592=>18835,63552=>18835,603=>18836,63553=>18836,596=>18837,63554=>18837,629=>18838,63555=>18838,339=>18839,63556=>18839,248=>18840,63557=>18840,331=>18841,63558=>18841,650=>18842,63559=>18842,618=>18843,63560=>18843,9178=>18844,62282=>18844,9179=>18845,62283=>18845,11933=>18846,63530=>18846,11974=>18847,63539=>18847,12003=>18848,63547=>18848,20539=>18849,28158=>18850,171123=>18851,62841=>18851,40870=>18852,62842=>18852,15817=>18853,62843=>18853,34959=>18854,62845=>18855,147790=>18855,28791=>18856,23797=>18857,19232=>18858,62848=>18858,152013=>18859,62849=>18859,13657=>18860,62850=>18860,154928=>18861,62851=>18861,24866=>18862,62853=>18863,166450=>18863,36775=>18864,37366=>18865,29073=>18866,26393=>18867,29626=>18868,144001=>18869,62859=>18869,172295=>18870,62860=>18870,15499=>18871,62861=>18871,137600=>18872,62862=>18872,19216=>18873,62863=>18873,30948=>18874,29698=>18875,20910=>18876,165647=>18877,62867=>18877,16393=>18878,62868=>18878,27235=>18879,172730=>18880,62870=>18880,16931=>18881,62871=>18881,34319=>18882,31274=>18883,170311=>18884,62875=>18884,166634=>18885,62876=>18885,38741=>18886,28749=>18887,21284=>18888,62880=>18889,139390=>18889,37876=>18890,30425=>18891,166371=>18892,62883=>18892,40871=>18893,62884=>18893,30685=>18894,20131=>18895,20464=>18896,20668=>18897,20015=>18898,20247=>18899,40872=>18900,62891=>18900,21556=>18901,32139=>18902,22674=>18903,22736=>18904,62896=>18905,138678=>18905,24210=>18906,24217=>18907,24514=>18908,62900=>18909,141074=>18909,25995=>18910,62902=>18911,144377=>18911,26905=>18912,27203=>18913,62905=>18914,146531=>18914,27903=>18915,29184=>18916,62909=>18917,148741=>18917,29580=>18918,16091=>18919,62911=>18919,150035=>18920,62912=>18920,23317=>18921,29881=>18922,35715=>18923,154788=>18924,62916=>18924,153237=>18925,62917=>18925,31379=>18926,31724=>18927,31939=>18928,32364=>18929,33528=>18930,34199=>18931,40873=>18932,62924=>18932,34960=>18933,40874=>18934,62926=>18934,36537=>18935,40875=>18936,62928=>18936,36815=>18937,34143=>18938,39392=>18939,37409=>18940,40876=>18941,62933=>18941,167353=>18942,62934=>18942,136255=>18943,62935=>18943,16497=>18944,62936=>18944,17058=>18945,62937=>18945,23066=>18946,39016=>18947,26475=>18948,17014=>18949,62944=>18949,22333=>18950,34262=>18951,62948=>18952,149883=>18952,33471=>18953,160013=>18954,62950=>18954,19585=>18955,62951=>18955,159092=>18956,62952=>18956,23931=>18957,158485=>18958,62954=>18958,159678=>18959,62955=>18959,40877=>18960,62956=>18960,40878=>18961,62957=>18961,23446=>18962,40879=>18963,62959=>18963,32347=>18964,17392=>18965,19506=>18966,17923=>18967,17830=>18968,17784=>18969,160359=>18970,19831=>18971,17843=>18972,162993=>18973,19682=>18974,163013=>18975,15253=>18976,18230=>18977,18244=>18978,19527=>18979,19520=>18980,148159=>18981,144919=>18982,160594=>18983,159371=>18984,159954=>18985,19543=>18986,172881=>18987,18255=>18988,17882=>18989,19589=>18990,162924=>18991,19719=>18992,19108=>18993,18081=>18994,158499=>18995,29221=>18996,154196=>18997,137827=>18998,146950=>18999,147297=>19000,26189=>19001,22267=>19002,32149=>19003,22813=>19004,166841=>19005,15860=>19006,38708=>19007,162799=>19008,23515=>19009,138590=>19010,23204=>19011,13861=>19012,171696=>19013,23249=>19014,23479=>19015,23804=>19016,26478=>19017,34195=>19018,170309=>19019,29793=>19020,29853=>19021,133743=>19022,26343=>19023,28247=>19024,31178=>19025,15752=>19026,17603=>19027,143958=>19028,141206=>19029,17306=>19030,17718=>19031,23765=>19032,146202=>19033,35577=>19034,23672=>19035,15634=>19036,144721=>19037,23928=>19038,40882=>19039,29015=>19040,17752=>19041,147692=>19042,138787=>19043,19575=>19044,14712=>19045,13386=>19046,131492=>19047,158785=>19048,35532=>19049,20404=>19050,131641=>19051,22975=>19052,33132=>19053,38998=>19054,170234=>19055,24379=>19056,134047=>19057,139713=>19058,166253=>19059,16642=>19060,18107=>19061,168057=>19062,16135=>19063,40883=>19064,172469=>19065,16632=>19066,14294=>19067,18167=>19068,158790=>19069,16764=>19070,165554=>19071,160767=>19072,17773=>19073,14548=>19074,152730=>19075,17761=>19076,17691=>19077,19849=>19078,19579=>19079,19830=>19080,17898=>19081,16328=>19082,150287=>19083,13921=>19084,17630=>19085,17597=>19086,16877=>19087);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/uni2cid_ag15.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/uni2cid_ag15.php
new file mode 100644
index 00000000..3fc61989
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/uni2cid_ag15.php
@@ -0,0 +1,6 @@
+<?php
+// unicode to cid conversion table is from
+// ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/
+// cid2code.txt in ag15.tar.Z
+$cidinfo['uni2cid'] = array(32=>1,33=>2,34=>3,35=>4,36=>5,37=>6,38=>7,39=>8,40=>9,41=>10,42=>11,43=>12,44=>13,45=>14,46=>15,47=>16,48=>17,49=>18,50=>19,51=>20,52=>21,53=>22,54=>23,55=>24,56=>25,57=>26,58=>27,59=>28,60=>29,61=>30,62=>31,63=>32,64=>33,65=>34,66=>35,67=>36,68=>37,69=>38,70=>39,71=>40,72=>41,73=>42,74=>43,75=>44,76=>45,77=>46,78=>47,79=>48,80=>49,81=>50,82=>51,83=>52,84=>53,85=>54,86=>55,87=>56,88=>57,89=>58,90=>59,91=>60,92=>61,93=>62,94=>63,95=>64,96=>65,97=>66,98=>67,99=>68,100=>69,101=>70,102=>71,103=>72,104=>73,105=>74,106=>75,107=>76,108=>77,109=>78,110=>79,111=>80,112=>81,113=>82,114=>83,115=>84,116=>85,117=>86,118=>87,119=>88,120=>89,121=>90,122=>91,123=>92,124=>93,125=>94,126=>95,12288=>96,12289=>97,12290=>98,183=>99,12539=>99,713=>100,711=>101,168=>102,12291=>103,12293=>104,8212=>105,65374=>106,8214=>107,8230=>108,8943=>108,8216=>109,8217=>110,8220=>111,8221=>112,12308=>113,12309=>114,12296=>115,12297=>116,12298=>117,12299=>118,12300=>119,12301=>120,12302=>121,12303=>122,12310=>123,12311=>124,12304=>125,12305=>126,177=>127,215=>128,247=>129,8758=>130,8743=>131,8744=>132,8721=>133,8719=>134,8746=>135,8745=>136,8712=>137,8759=>138,8730=>139,8869=>140,8741=>141,8736=>142,8978=>143,8857=>144,8747=>145,8750=>146,8801=>147,8780=>148,8776=>149,8765=>150,8733=>151,8800=>152,8814=>153,8815=>154,8804=>155,8805=>156,8734=>157,8757=>158,8756=>159,9794=>160,9792=>161,176=>162,8242=>163,8243=>164,8451=>165,65284=>166,164=>167,65504=>168,65505=>169,8240=>170,167=>171,8470=>172,9734=>173,9733=>174,9675=>175,9679=>176,9678=>177,9671=>178,9670=>179,9633=>180,9632=>181,9651=>182,9650=>183,8251=>184,8594=>185,8592=>186,8593=>187,8595=>188,12307=>189,9352=>190,9353=>191,9354=>192,9355=>193,9356=>194,9357=>195,9358=>196,9359=>197,9360=>198,9361=>199,9362=>200,9363=>201,9364=>202,9365=>203,9366=>204,9367=>205,9368=>206,9369=>207,9370=>208,9371=>209,9332=>210,9333=>211,9334=>212,9335=>213,9336=>214,9337=>215,9338=>216,9339=>217,9340=>218,9341=>219,9342=>220,9343=>221,9344=>222,9345=>223,9346=>224,9347=>225,9348=>226,9349=>227,9350=>228,9351=>229,9312=>230,9313=>231,9314=>232,9315=>233,9316=>234,9317=>235,9318=>236,9319=>237,9320=>238,9321=>239,12832=>240,12833=>241,12834=>242,12835=>243,12836=>244,12837=>245,12838=>246,12839=>247,12840=>248,12841=>249,8544=>250,8545=>251,8546=>252,8547=>253,8548=>254,8549=>255,8550=>256,8551=>257,8552=>258,8553=>259,8554=>260,8555=>261,65281=>262,65282=>263,65283=>264,65509=>265,65285=>266,65286=>267,65287=>268,65288=>269,65289=>270,65290=>271,65291=>272,65292=>273,65293=>274,65294=>275,65295=>276,65296=>277,65297=>278,65298=>279,65299=>280,65300=>281,65301=>282,65302=>283,65303=>284,65304=>285,65305=>286,65306=>287,65307=>288,65308=>289,65309=>290,65310=>291,65311=>292,65312=>293,65313=>294,65314=>295,65315=>296,65316=>297,65317=>298,65318=>299,65319=>300,65320=>301,65321=>302,65322=>303,65323=>304,65324=>305,65325=>306,65326=>307,65327=>308,65328=>309,65329=>310,65330=>311,65331=>312,65332=>313,65333=>314,65334=>315,65335=>316,65336=>317,65337=>318,65338=>319,65339=>320,65340=>321,65341=>322,65342=>323,65343=>324,65344=>325,65345=>326,65346=>327,65347=>328,65348=>329,65349=>330,65350=>331,65351=>332,65352=>333,65353=>334,65354=>335,65355=>336,65356=>337,65357=>338,65358=>339,65359=>340,65360=>341,65361=>342,65362=>343,65363=>344,65364=>345,65365=>346,65366=>347,65367=>348,65368=>349,65369=>350,65370=>351,65371=>352,65372=>353,65373=>354,65507=>355,12353=>356,12354=>357,12355=>358,12356=>359,12357=>360,12358=>361,12359=>362,12360=>363,12361=>364,12362=>365,12363=>366,12364=>367,12365=>368,12366=>369,12367=>370,12368=>371,12369=>372,12370=>373,12371=>374,12372=>375,12373=>376,12374=>377,12375=>378,12376=>379,12377=>380,12378=>381,12379=>382,12380=>383,12381=>384,12382=>385,12383=>386,12384=>387,12385=>388,12386=>389,12387=>390,12388=>391,12389=>392,12390=>393,12391=>394,12392=>395,12393=>396,12394=>397,12395=>398,12396=>399,12397=>400,12398=>401,12399=>402,12400=>403,12401=>404,12402=>405,12403=>406,12404=>407,12405=>408,12406=>409,12407=>410,12408=>411,12409=>412,12410=>413,12411=>414,12412=>415,12413=>416,12414=>417,12415=>418,12416=>419,12417=>420,12418=>421,12419=>422,12420=>423,12421=>424,12422=>425,12423=>426,12424=>427,12425=>428,12426=>429,12427=>430,12428=>431,12429=>432,12430=>433,12431=>434,12432=>435,12433=>436,12434=>437,12435=>438,12449=>439,12450=>440,12451=>441,12452=>442,12453=>443,12454=>444,12455=>445,12456=>446,12457=>447,12458=>448,12459=>449,12460=>450,12461=>451,12462=>452,12463=>453,12464=>454,12465=>455,12466=>456,12467=>457,12468=>458,12469=>459,12470=>460,12471=>461,12472=>462,12473=>463,12474=>464,12475=>465,12476=>466,12477=>467,12478=>468,12479=>469,12480=>470,12481=>471,12482=>472,12483=>473,12484=>474,12485=>475,12486=>476,12487=>477,12488=>478,12489=>479,12490=>480,12491=>481,12492=>482,12493=>483,12494=>484,12495=>485,12496=>486,12497=>487,12498=>488,12499=>489,12500=>490,12501=>491,12502=>492,12503=>493,12504=>494,12505=>495,12506=>496,12507=>497,12508=>498,12509=>499,12510=>500,12511=>501,12512=>502,12513=>503,12514=>504,12515=>505,12516=>506,12517=>507,12518=>508,12519=>509,12520=>510,12521=>511,12522=>512,12523=>513,12524=>514,12525=>515,12526=>516,12527=>517,12528=>518,12529=>519,12530=>520,12531=>521,12532=>522,12533=>523,12534=>524,913=>525,914=>526,915=>527,916=>528,917=>529,918=>530,919=>531,920=>532,921=>533,922=>534,923=>535,924=>536,925=>537,926=>538,927=>539,928=>540,929=>541,931=>542,932=>543,933=>544,934=>545,935=>546,936=>547,937=>548,945=>549,946=>550,947=>551,948=>552,949=>553,950=>554,951=>555,952=>556,953=>557,954=>558,955=>559,956=>560,957=>561,958=>562,959=>563,960=>564,961=>565,963=>566,964=>567,965=>568,966=>569,967=>570,968=>571,969=>572,65040=>573,59277=>573,65042=>574,59278=>574,65041=>575,59279=>575,59280=>576,65043=>576,59281=>577,65044=>577,59282=>578,65045=>578,59283=>579,65046=>579,65077=>580,65078=>581,65081=>582,65082=>583,65087=>584,65088=>585,65085=>586,65086=>587,65089=>588,65090=>589,65091=>590,65092=>591,59284=>592,65047=>592,59285=>593,65048=>593,65083=>594,65084=>595,65079=>596,65080=>597,65073=>598,8285=>599,59286=>599,65049=>599,65075=>600,65076=>601,1040=>602,1041=>603,1042=>604,1043=>605,1044=>606,1045=>607,1025=>608,1046=>609,1047=>610,1048=>611,1049=>612,1050=>613,1051=>614,1052=>615,1053=>616,1054=>617,1055=>618,1056=>619,1057=>620,1058=>621,1059=>622,1060=>623,1061=>624,1062=>625,1063=>626,1064=>627,1065=>628,1066=>629,1067=>630,1068=>631,1069=>632,1070=>633,1071=>634,1072=>635,1073=>636,1074=>637,1075=>638,1076=>639,1077=>640,1105=>641,1078=>642,1079=>643,1080=>644,1081=>645,1082=>646,1083=>647,1084=>648,1085=>649,1086=>650,1087=>651,1088=>652,1089=>653,1090=>654,1091=>655,1092=>656,1093=>657,1094=>658,1095=>659,1096=>660,1097=>661,1098=>662,1099=>663,1100=>664,1101=>665,1102=>666,1103=>667,257=>668,225=>669,462=>670,224=>671,275=>672,233=>673,283=>674,232=>675,299=>676,237=>677,464=>678,236=>679,333=>680,243=>681,466=>682,242=>683,363=>684,250=>685,468=>686,249=>687,470=>688,472=>689,474=>690,476=>691,252=>692,234=>693,593=>694,7743=>695,59335=>695,324=>696,328=>697,505=>698,59336=>698,609=>699,12549=>700,12550=>701,12551=>702,12552=>703,12553=>704,12554=>705,12555=>706,12556=>707,12557=>708,12558=>709,12559=>710,12560=>711,12561=>712,12562=>713,12563=>714,12564=>715,12565=>716,12566=>717,12567=>718,12568=>719,12569=>720,12570=>721,12571=>722,12572=>723,12573=>724,12574=>725,12575=>726,12576=>727,12577=>728,12578=>729,12579=>730,12580=>731,12581=>732,12582=>733,12583=>734,12584=>735,12585=>736,9472=>738,9473=>739,9474=>740,9475=>741,9476=>742,9477=>743,9478=>744,9479=>745,9480=>746,9481=>747,9482=>748,9483=>749,9484=>750,9485=>751,9486=>752,9487=>753,9488=>754,9489=>755,9490=>756,9491=>757,9492=>758,9493=>759,9494=>760,9495=>761,9496=>762,9497=>763,9498=>764,9499=>765,9500=>766,9501=>767,9502=>768,9503=>769,9504=>770,9505=>771,9506=>772,9507=>773,9508=>774,9509=>775,9510=>776,9511=>777,9512=>778,9513=>779,9514=>780,9515=>781,9516=>782,9517=>783,9518=>784,9519=>785,9520=>786,9521=>787,9522=>788,9523=>789,9524=>790,9525=>791,9526=>792,9527=>793,9528=>794,9529=>795,9530=>796,9531=>797,9532=>798,9533=>799,9534=>800,9535=>801,9536=>802,9537=>803,9538=>804,9539=>805,9540=>806,9541=>807,9542=>808,9543=>809,9544=>810,9545=>811,9546=>812,9547=>813,21834=>940,38463=>941,22467=>942,25384=>943,21710=>944,21769=>945,21696=>946,30353=>947,30284=>948,34108=>949,30702=>950,33406=>951,30861=>952,29233=>953,38552=>954,38797=>955,27688=>956,23433=>957,20474=>958,25353=>959,26263=>960,23736=>961,33018=>962,26696=>963,32942=>964,26114=>965,30414=>966,20985=>967,25942=>968,29100=>969,32753=>970,34948=>971,20658=>972,22885=>973,25034=>974,28595=>975,33453=>976,25420=>977,25170=>978,21485=>979,21543=>980,31494=>981,12043=>982,20843=>982,30116=>983,24052=>984,25300=>985,36299=>986,38774=>987,25226=>988,32793=>989,22365=>990,38712=>991,32610=>992,29240=>993,12137=>994,30333=>994,26575=>995,30334=>996,25670=>997,20336=>998,36133=>999,25308=>1000,31255=>1001,26001=>1002,29677=>1003,25644=>1004,25203=>1005,33324=>1006,39041=>1007,26495=>1008,29256=>1009,25198=>1010,25292=>1011,20276=>1012,29923=>1013,21322=>1014,21150=>1015,32458=>1016,37030=>1017,24110=>1018,26758=>1019,27036=>1020,33152=>1021,32465=>1022,26834=>1023,30917=>1024,34444=>1025,38225=>1026,20621=>1027,35876=>1028,33502=>1029,32990=>1030,21253=>1031,35090=>1032,21093=>1033,34180=>1034,38649=>1035,20445=>1036,22561=>1037,39281=>1038,23453=>1039,25265=>1040,25253=>1041,26292=>1042,35961=>1043,40077=>1044,29190=>1045,26479=>1046,30865=>1047,24754=>1048,21329=>1049,21271=>1050,36744=>1051,32972=>1052,36125=>1053,38049=>1054,20493=>1055,29384=>1056,22791=>1057,24811=>1058,28953=>1059,34987=>1060,22868=>1061,33519=>1062,26412=>1063,31528=>1064,23849=>1065,32503=>1066,29997=>1067,27893=>1068,36454=>1069,36856=>1070,36924=>1071,12240=>1072,40763=>1072,12112=>1073,27604=>1073,37145=>1074,31508=>1075,24444=>1076,30887=>1077,34006=>1078,34109=>1079,27605=>1080,27609=>1081,27606=>1082,24065=>1083,24199=>1084,30201=>1085,38381=>1086,25949=>1087,24330=>1088,24517=>1089,36767=>1090,22721=>1091,33218=>1092,36991=>1093,38491=>1094,38829=>1095,36793=>1096,32534=>1097,36140=>1098,25153=>1099,20415=>1100,21464=>1101,21342=>1102,36776=>1103,36777=>1104,36779=>1105,36941=>1106,26631=>1107,24426=>1108,33176=>1109,34920=>1110,40150=>1111,24971=>1112,21035=>1113,30250=>1114,24428=>1115,25996=>1116,28626=>1117,28392=>1118,23486=>1119,25672=>1120,20853=>1121,20912=>1122,26564=>1123,19993=>1124,31177=>1125,39292=>1126,28851=>1127,30149=>1128,24182=>1129,29627=>1130,33760=>1131,25773=>1132,25320=>1133,38069=>1134,27874=>1135,21338=>1136,21187=>1137,25615=>1138,38082=>1139,31636=>1140,20271=>1141,24091=>1142,33334=>1143,33046=>1144,33162=>1145,28196=>1146,27850=>1147,39539=>1148,25429=>1149,12056=>1150,21340=>1150,21754=>1151,34917=>1152,22496=>1153,19981=>1154,24067=>1155,27493=>1156,31807=>1157,37096=>1158,24598=>1159,25830=>1160,29468=>1161,35009=>1162,26448=>1163,25165=>1164,36130=>1165,30572=>1166,36393=>1167,37319=>1168,24425=>1169,33756=>1170,34081=>1171,39184=>1172,21442=>1173,34453=>1174,27531=>1175,24813=>1176,24808=>1177,28799=>1178,33485=>1179,33329=>1180,20179=>1181,27815=>1182,34255=>1183,25805=>1184,31961=>1185,27133=>1186,26361=>1187,33609=>1188,21397=>1189,31574=>1190,20391=>1191,20876=>1192,27979=>1193,23618=>1194,36461=>1195,25554=>1196,21449=>1197,33580=>1198,33590=>1199,26597=>1200,30900=>1201,25661=>1202,23519=>1203,23700=>1204,24046=>1205,35815=>1206,25286=>1207,26612=>1208,35962=>1209,25600=>1210,25530=>1211,34633=>1212,39307=>1213,35863=>1214,32544=>1215,38130=>1216,20135=>1217,38416=>1218,39076=>1219,26124=>1220,29462=>1221,22330=>1222,23581=>1223,24120=>1224,38271=>1225,20607=>1226,32928=>1227,12058=>1228,21378=>1228,25950=>1229,30021=>1230,21809=>1231,20513=>1232,36229=>1233,25220=>1234,38046=>1235,26397=>1236,22066=>1237,28526=>1238,24034=>1239,21557=>1240,28818=>1241,36710=>1242,25199=>1243,25764=>1244,25507=>1245,24443=>1246,28552=>1247,37108=>1248,12162=>1249,33251=>1249,12192=>1250,36784=>1250,23576=>1251,26216=>1252,24561=>1253,27785=>1254,38472=>1255,36225=>1256,34924=>1257,25745=>1258,31216=>1259,22478=>1260,27225=>1261,25104=>1262,21576=>1263,20056=>1264,31243=>1265,24809=>1266,28548=>1267,35802=>1268,25215=>1269,36894=>1270,39563=>1271,31204=>1272,21507=>1273,30196=>1274,25345=>1275,21273=>1276,27744=>1277,36831=>1278,24347=>1279,39536=>1280,32827=>1281,40831=>1282,20360=>1283,23610=>1284,12186=>1285,36196=>1285,32709=>1286,26021=>1287,28861=>1288,20805=>1289,20914=>1290,12173=>1291,34411=>1291,23815=>1292,23456=>1293,25277=>1294,37228=>1295,30068=>1296,36364=>1297,31264=>1298,24833=>1299,31609=>1300,20167=>1301,32504=>1302,30597=>1303,19985=>1304,33261=>1305,21021=>1306,20986=>1307,27249=>1308,21416=>1309,36487=>1310,38148=>1311,38607=>1312,28353=>1313,38500=>1314,26970=>1315,30784=>1316,20648=>1317,30679=>1318,25616=>1319,35302=>1320,22788=>1321,25571=>1322,24029=>1323,31359=>1324,26941=>1325,20256=>1326,33337=>1327,21912=>1328,20018=>1329,30126=>1330,31383=>1331,24162=>1332,24202=>1333,38383=>1334,21019=>1335,21561=>1336,28810=>1337,25462=>1338,38180=>1339,22402=>1340,26149=>1341,26943=>1342,37255=>1343,21767=>1344,28147=>1345,32431=>1346,34850=>1347,25139=>1348,32496=>1349,30133=>1350,33576=>1351,30913=>1352,38604=>1353,36766=>1354,24904=>1355,29943=>1356,35789=>1357,27492=>1358,21050=>1359,36176=>1360,27425=>1361,32874=>1362,33905=>1363,22257=>1364,21254=>1365,20174=>1366,19995=>1367,20945=>1368,31895=>1369,37259=>1370,31751=>1371,20419=>1372,36479=>1373,31713=>1374,31388=>1375,25703=>1376,23828=>1377,20652=>1378,33030=>1379,30209=>1380,31929=>1381,28140=>1382,32736=>1383,26449=>1384,23384=>1385,12072=>1386,23544=>1386,30923=>1387,25774=>1388,25619=>1389,25514=>1390,25387=>1391,38169=>1392,25645=>1393,36798=>1394,31572=>1395,30249=>1396,25171=>1397,12068=>1398,22823=>1398,21574=>1399,12109=>1400,27513=>1400,20643=>1401,25140=>1402,24102=>1403,27526=>1404,20195=>1405,36151=>1406,34955=>1407,24453=>1408,36910=>1409,24608=>1410,32829=>1411,25285=>1412,20025=>1413,21333=>1414,37112=>1415,25528=>1416,32966=>1417,26086=>1418,27694=>1419,20294=>1420,24814=>1421,28129=>1422,35806=>1423,24377=>1424,34507=>1425,24403=>1426,25377=>1427,20826=>1428,33633=>1429,26723=>1430,12049=>1431,20992=>1431,25443=>1432,36424=>1433,20498=>1434,23707=>1435,31095=>1436,23548=>1437,21040=>1438,31291=>1439,24764=>1440,36947=>1441,30423=>1442,24503=>1443,24471=>1444,30340=>1445,36460=>1446,28783=>1447,30331=>1448,31561=>1449,30634=>1450,20979=>1451,37011=>1452,22564=>1453,20302=>1454,28404=>1455,36842=>1456,25932=>1457,31515=>1458,29380=>1459,28068=>1460,32735=>1461,23265=>1462,25269=>1463,24213=>1464,22320=>1465,33922=>1466,31532=>1467,24093=>1468,24351=>1469,36882=>1470,32532=>1471,39072=>1472,25474=>1473,28359=>1474,30872=>1475,28857=>1476,20856=>1477,38747=>1478,22443=>1479,30005=>1480,20291=>1481,30008=>1482,24215=>1483,24806=>1484,22880=>1485,28096=>1486,27583=>1487,30857=>1488,21500=>1489,38613=>1490,20939=>1491,20993=>1492,25481=>1493,21514=>1494,38035=>1495,35843=>1496,36300=>1497,29241=>1498,30879=>1499,34678=>1500,36845=>1501,35853=>1502,21472=>1503,19969=>1504,30447=>1505,21486=>1506,38025=>1507,39030=>1508,12237=>1509,40718=>1509,38189=>1510,23450=>1511,35746=>1512,20002=>1513,19996=>1514,20908=>1515,33891=>1516,25026=>1517,21160=>1518,26635=>1519,20375=>1520,24683=>1521,20923=>1522,27934=>1523,20828=>1524,25238=>1525,12099=>1526,26007=>1526,38497=>1527,12182=>1528,35910=>1528,36887=>1529,30168=>1530,37117=>1531,30563=>1532,27602=>1533,29322=>1534,29420=>1535,35835=>1536,22581=>1537,30585=>1538,36172=>1539,26460=>1540,38208=>1541,32922=>1542,24230=>1543,28193=>1544,22930=>1545,31471=>1546,30701=>1547,38203=>1548,27573=>1549,26029=>1550,32526=>1551,22534=>1552,20817=>1553,38431=>1554,23545=>1555,22697=>1556,21544=>1557,36466=>1558,25958=>1559,39039=>1560,22244=>1561,38045=>1562,30462=>1563,36929=>1564,25479=>1565,21702=>1566,22810=>1567,22842=>1568,22427=>1569,36530=>1570,26421=>1571,36346=>1572,33333=>1573,21057=>1574,24816=>1575,22549=>1576,34558=>1577,23784=>1578,40517=>1579,20420=>1580,39069=>1581,35769=>1582,23077=>1583,24694=>1584,21380=>1585,25212=>1586,36943=>1587,37122=>1588,39295=>1589,24681=>1590,12157=>1591,32780=>1591,12041=>1592,20799=>1592,12159=>1593,32819=>1593,23572=>1594,39285=>1595,27953=>1596,12038=>1597,20108=>1597,36144=>1598,21457=>1599,32602=>1600,31567=>1601,20240=>1602,20047=>1603,38400=>1604,27861=>1605,29648=>1606,34281=>1607,24070=>1608,30058=>1609,32763=>1610,27146=>1611,30718=>1612,38034=>1613,32321=>1614,20961=>1615,28902=>1616,21453=>1617,36820=>1618,33539=>1619,36137=>1620,29359=>1621,39277=>1622,27867=>1623,22346=>1624,33459=>1625,12101=>1626,26041=>1626,32938=>1627,25151=>1628,38450=>1629,22952=>1630,20223=>1631,35775=>1632,32442=>1633,25918=>1634,33778=>1635,12206=>1636,38750=>1636,21857=>1637,39134=>1638,32933=>1639,21290=>1640,35837=>1641,21536=>1642,32954=>1643,24223=>1644,27832=>1645,36153=>1646,33452=>1647,37210=>1648,21545=>1649,27675=>1650,20998=>1651,32439=>1652,22367=>1653,28954=>1654,27774=>1655,31881=>1656,22859=>1657,20221=>1658,24575=>1659,24868=>1660,31914=>1661,20016=>1662,23553=>1663,26539=>1664,34562=>1665,23792=>1666,38155=>1667,39118=>1668,30127=>1669,28925=>1670,36898=>1671,20911=>1672,32541=>1673,35773=>1674,22857=>1675,20964=>1676,20315=>1677,21542=>1678,22827=>1679,25975=>1680,32932=>1681,23413=>1682,25206=>1683,25282=>1684,36752=>1685,24133=>1686,27679=>1687,31526=>1688,20239=>1689,20440=>1690,26381=>1691,28014=>1692,28074=>1693,31119=>1694,34993=>1695,24343=>1696,29995=>1697,25242=>1698,36741=>1699,20463=>1700,37340=>1701,26023=>1702,33071=>1703,33105=>1704,24220=>1705,33104=>1706,36212=>1707,21103=>1708,35206=>1709,36171=>1710,22797=>1711,20613=>1712,20184=>1713,12201=>1714,38428=>1714,12119=>1715,29238=>1715,33145=>1716,36127=>1717,23500=>1718,35747=>1719,38468=>1720,22919=>1721,32538=>1722,21648=>1723,22134=>1724,22030=>1725,35813=>1726,25913=>1727,27010=>1728,38041=>1729,30422=>1730,28297=>1731,12082=>1732,24178=>1732,12130=>1733,29976=>1733,26438=>1734,26577=>1735,31487=>1736,32925=>1737,36214=>1738,24863=>1739,31174=>1740,25954=>1741,36195=>1742,20872=>1743,21018=>1744,38050=>1745,32568=>1746,32923=>1747,32434=>1748,23703=>1749,28207=>1750,26464=>1751,31705=>1752,30347=>1753,12220=>1754,39640=>1754,33167=>1755,32660=>1756,31957=>1757,25630=>1758,38224=>1759,31295=>1760,21578=>1761,21733=>1762,27468=>1763,25601=>1764,12093=>1765,25096=>1765,40509=>1766,33011=>1767,30105=>1768,21106=>1769,12208=>1770,38761=>1770,33883=>1771,26684=>1772,34532=>1773,38401=>1774,38548=>1775,38124=>1776,20010=>1777,21508=>1778,32473=>1779,26681=>1780,36319=>1781,32789=>1782,26356=>1783,24218=>1784,32697=>1785,22466=>1786,32831=>1787,26775=>1788,12079=>1789,24037=>1789,25915=>1790,21151=>1791,24685=>1792,40858=>1793,20379=>1794,36524=>1795,20844=>1796,23467=>1797,12088=>1798,24339=>1798,24041=>1799,27742=>1800,25329=>1801,36129=>1802,20849=>1803,38057=>1804,21246=>1805,27807=>1806,33503=>1807,29399=>1808,22434=>1809,26500=>1810,36141=>1811,22815=>1812,36764=>1813,33735=>1814,21653=>1815,31629=>1816,20272=>1817,27837=>1818,23396=>1819,22993=>1820,12238=>1821,40723=>1821,21476=>1822,34506=>1823,12219=>1824,39592=>1824,12181=>1825,35895=>1825,32929=>1826,25925=>1827,39038=>1828,22266=>1829,38599=>1830,21038=>1831,12128=>1832,29916=>1832,21072=>1833,23521=>1834,25346=>1835,35074=>1836,20054=>1837,25296=>1838,24618=>1839,26874=>1840,20851=>1841,23448=>1842,20896=>1843,35266=>1844,31649=>1845,39302=>1846,32592=>1847,24815=>1848,28748=>1849,36143=>1850,20809=>1851,12084=>1852,24191=>1852,36891=>1853,29808=>1854,35268=>1855,22317=>1856,30789=>1857,24402=>1858,40863=>1859,38394=>1860,36712=>1861,12225=>1862,39740=>1862,35809=>1863,30328=>1864,26690=>1865,26588=>1866,36330=>1867,36149=>1868,21053=>1869,36746=>1870,28378=>1871,26829=>1872,38149=>1873,37101=>1874,22269=>1875,26524=>1876,35065=>1877,36807=>1878,21704=>1879,39608=>1880,23401=>1881,28023=>1882,27686=>1883,20133=>1884,23475=>1885,39559=>1886,37219=>1887,25000=>1888,37039=>1889,38889=>1890,21547=>1891,28085=>1892,23506=>1893,20989=>1894,21898=>1895,32597=>1896,32752=>1897,25788=>1898,25421=>1899,26097=>1900,25022=>1901,24717=>1902,28938=>1903,27735=>1904,27721=>1905,22831=>1906,26477=>1907,33322=>1908,22741=>1909,22158=>1910,35946=>1911,27627=>1912,37085=>1913,22909=>1914,32791=>1915,21495=>1916,28009=>1917,21621=>1918,21917=>1919,33655=>1920,33743=>1921,26680=>1922,12146=>1923,31166=>1923,21644=>1924,20309=>1925,21512=>1926,30418=>1927,35977=>1928,38402=>1929,27827=>1930,28088=>1931,36203=>1932,35088=>1933,40548=>1934,36154=>1935,22079=>1936,12234=>1937,40657=>1937,30165=>1938,24456=>1939,29408=>1940,24680=>1941,21756=>1942,20136=>1943,27178=>1944,34913=>1945,24658=>1946,36720=>1947,21700=>1948,28888=>1949,34425=>1950,40511=>1951,27946=>1952,23439=>1953,24344=>1954,32418=>1955,21897=>1956,20399=>1957,29492=>1958,21564=>1959,21402=>1960,20505=>1961,21518=>1962,21628=>1963,20046=>1964,24573=>1965,29786=>1966,22774=>1967,33899=>1968,32993=>1969,34676=>1970,29392=>1971,31946=>1972,28246=>1973,24359=>1974,34382=>1975,21804=>1976,25252=>1977,20114=>1978,27818=>1979,25143=>1980,33457=>1981,21719=>1982,21326=>1983,29502=>1984,28369=>1985,30011=>1986,21010=>1987,21270=>1988,35805=>1989,27088=>1990,24458=>1991,24576=>1992,28142=>1993,22351=>1994,27426=>1995,29615=>1996,26707=>1997,36824=>1998,32531=>1999,25442=>2000,24739=>2001,21796=>2002,30186=>2003,35938=>2004,28949=>2005,28067=>2006,23462=>2007,24187=>2008,33618=>2009,24908=>2010,40644=>2011,30970=>2012,34647=>2013,31783=>2014,30343=>2015,20976=>2016,24822=>2017,29004=>2018,26179=>2019,24140=>2020,24653=>2021,35854=>2022,28784=>2023,25381=>2024,36745=>2025,24509=>2026,24674=>2027,34516=>2028,22238=>2029,27585=>2030,24724=>2031,24935=>2032,21321=>2033,24800=>2034,26214=>2035,36159=>2036,31229=>2037,20250=>2038,28905=>2039,27719=>2040,35763=>2041,35826=>2042,32472=>2043,33636=>2044,26127=>2045,23130=>2046,39746=>2047,27985=>2048,28151=>2049,35905=>2050,27963=>2051,20249=>2052,12117=>2053,28779=>2053,33719=>2054,25110=>2055,24785=>2056,38669=>2057,36135=>2058,31096=>2059,20987=>2060,22334=>2061,22522=>2062,26426=>2063,30072=>2064,31293=>2065,31215=>2066,31637=>2067,32908=>2068,39269=>2069,36857=>2070,28608=>2071,35749=>2072,40481=>2073,23020=>2074,32489=>2075,32521=>2076,21513=>2077,26497=>2078,26840=>2079,36753=>2080,31821=>2081,38598=>2082,21450=>2083,24613=>2084,30142=>2085,27762=>2086,21363=>2087,23241=>2088,32423=>2089,25380=>2090,12047=>2091,20960=>2091,33034=>2092,12080=>2093,24049=>2093,34015=>2094,25216=>2095,20864=>2096,23395=>2097,20238=>2098,31085=>2099,21058=>2100,24760=>2101,27982=>2102,23492=>2103,23490=>2104,35745=>2105,35760=>2106,26082=>2107,24524=>2108,38469=>2109,22931=>2110,32487=>2111,32426=>2112,22025=>2113,26551=>2114,22841=>2115,20339=>2116,23478=>2117,21152=>2118,33626=>2119,39050=>2120,36158=>2121,30002=>2122,38078=>2123,20551=>2124,31292=>2125,20215=>2126,26550=>2127,39550=>2128,23233=>2129,27516=>2130,30417=>2131,22362=>2132,23574=>2133,31546=>2134,38388=>2135,29006=>2136,20860=>2137,32937=>2138,33392=>2139,22904=>2140,32516=>2141,33575=>2142,26816=>2143,26604=>2144,30897=>2145,30839=>2146,25315=>2147,25441=>2148,31616=>2149,20461=>2150,21098=>2151,20943=>2152,33616=>2153,27099=>2154,37492=>2155,36341=>2156,36145=>2157,35265=>2158,38190=>2159,31661=>2160,20214=>2161,20581=>2162,33328=>2163,21073=>2164,39279=>2165,28176=>2166,28293=>2167,28071=>2168,24314=>2169,20725=>2170,23004=>2171,23558=>2172,27974=>2173,27743=>2174,30086=>2175,33931=>2176,26728=>2177,22870=>2178,35762=>2179,21280=>2180,37233=>2181,38477=>2182,34121=>2183,26898=>2184,30977=>2185,28966=>2186,33014=>2187,20132=>2188,37066=>2189,27975=>2190,39556=>2191,23047=>2192,22204=>2193,25605=>2194,38128=>2195,30699=>2196,20389=>2197,33050=>2198,29409=>2199,12179=>2200,35282=>2200,39290=>2201,32564=>2202,32478=>2203,21119=>2204,25945=>2205,37237=>2206,36735=>2207,36739=>2208,21483=>2209,31382=>2210,25581=>2211,25509=>2212,30342=>2213,31224=>2214,34903=>2215,38454=>2216,25130=>2217,21163=>2218,33410=>2219,26708=>2220,26480=>2221,25463=>2222,30571=>2223,31469=>2224,27905=>2225,32467=>2226,35299=>2227,22992=>2228,25106=>2229,34249=>2230,33445=>2231,30028=>2232,20511=>2233,20171=>2234,30117=>2235,35819=>2236,23626=>2237,12081=>2238,24062=>2238,31563=>2239,12100=>2240,26020=>2240,12198=>2241,37329=>2241,20170=>2242,27941=>2243,35167=>2244,32039=>2245,38182=>2246,20165=>2247,35880=>2248,36827=>2249,38771=>2250,26187=>2251,31105=>2252,36817=>2253,28908=>2254,28024=>2255,23613=>2256,21170=>2257,33606=>2258,20834=>2259,33550=>2260,30555=>2261,26230=>2262,40120=>2263,20140=>2264,24778=>2265,31934=>2266,31923=>2267,32463=>2268,20117=>2269,35686=>2270,26223=>2271,39048=>2272,38745=>2273,22659=>2274,25964=>2275,38236=>2276,24452=>2277,30153=>2278,38742=>2279,31455=>2280,31454=>2281,20928=>2282,28847=>2283,31384=>2284,25578=>2285,31350=>2286,32416=>2287,29590=>2288,12210=>2289,38893=>2289,20037=>2290,28792=>2291,20061=>2292,37202=>2293,21417=>2294,25937=>2295,26087=>2296,12165=>2297,33276=>2297,33285=>2298,21646=>2299,23601=>2300,30106=>2301,38816=>2302,25304=>2303,29401=>2304,30141=>2305,23621=>2306,39545=>2307,33738=>2308,23616=>2309,21632=>2310,30697=>2311,20030=>2312,27822=>2313,32858=>2314,25298=>2315,25454=>2316,24040=>2317,20855=>2318,36317=>2319,36382=>2320,38191=>2321,20465=>2322,21477=>2323,24807=>2324,28844=>2325,21095=>2326,25424=>2327,40515=>2328,23071=>2329,20518=>2330,30519=>2331,21367=>2332,32482=>2333,25733=>2334,25899=>2335,25225=>2336,25496=>2337,20500=>2338,29237=>2339,35273=>2340,20915=>2341,35776=>2342,32477=>2343,22343=>2344,33740=>2345,38055=>2346,20891=>2347,21531=>2348,23803=>2349,20426=>2350,31459=>2351,27994=>2352,37089=>2353,39567=>2354,21888=>2355,21654=>2356,21345=>2357,21679=>2358,24320=>2359,25577=>2360,26999=>2361,20975=>2362,24936=>2363,21002=>2364,22570=>2365,21208=>2366,22350=>2367,30733=>2368,30475=>2369,24247=>2370,24951=>2371,31968=>2372,25179=>2373,25239=>2374,20130=>2375,28821=>2376,32771=>2377,25335=>2378,28900=>2379,38752=>2380,22391=>2381,33499=>2382,26607=>2383,26869=>2384,30933=>2385,39063=>2386,31185=>2387,22771=>2388,21683=>2389,21487=>2390,28212=>2391,20811=>2392,21051=>2393,23458=>2394,35838=>2395,32943=>2396,21827=>2397,22438=>2398,24691=>2399,22353=>2400,21549=>2401,31354=>2402,24656=>2403,23380=>2404,25511=>2405,25248=>2406,12061=>2407,21475=>2407,25187=>2408,23495=>2409,26543=>2410,21741=>2411,31391=>2412,33510=>2413,37239=>2414,24211=>2415,35044=>2416,22840=>2417,22446=>2418,25358=>2419,36328=>2420,33007=>2421,22359=>2422,31607=>2423,20393=>2424,24555=>2425,23485=>2426,27454=>2427,21281=>2428,31568=>2429,29378=>2430,26694=>2431,30719=>2432,30518=>2433,26103=>2434,20917=>2435,20111=>2436,30420=>2437,23743=>2438,31397=>2439,33909=>2440,22862=>2441,39745=>2442,20608=>2443,39304=>2444,24871=>2445,28291=>2446,22372=>2447,26118=>2448,25414=>2449,22256=>2450,25324=>2451,25193=>2452,24275=>2453,38420=>2454,22403=>2455,25289=>2456,21895=>2457,34593=>2458,33098=>2459,36771=>2460,21862=>2461,33713=>2462,26469=>2463,36182=>2464,34013=>2465,23146=>2466,26639=>2467,25318=>2468,31726=>2469,38417=>2470,20848=>2471,28572=>2472,35888=>2473,25597=>2474,35272=>2475,25042=>2476,32518=>2477,28866=>2478,28389=>2479,29701=>2480,27028=>2481,29436=>2482,24266=>2483,37070=>2484,26391=>2485,28010=>2486,25438=>2487,21171=>2488,29282=>2489,12156=>2490,32769=>2490,20332=>2491,23013=>2492,37226=>2493,28889=>2494,28061=>2495,21202=>2496,20048=>2497,38647=>2498,38253=>2499,34174=>2500,30922=>2501,32047=>2502,20769=>2503,22418=>2504,25794=>2505,32907=>2506,31867=>2507,27882=>2508,26865=>2509,26974=>2510,20919=>2511,21400=>2512,26792=>2513,29313=>2514,40654=>2515,31729=>2516,29432=>2517,31163=>2518,28435=>2519,29702=>2520,26446=>2521,12197=>2522,37324=>2522,40100=>2523,31036=>2524,33673=>2525,33620=>2526,21519=>2527,26647=>2528,20029=>2529,21385=>2530,21169=>2531,30782=>2532,21382=>2533,21033=>2534,20616=>2535,20363=>2536,20432=>2537,30178=>2538,12148=>2539,31435=>2539,31890=>2540,27813=>2541,12202=>2542,38582=>2542,12050=>2543,21147=>2543,29827=>2544,21737=>2545,20457=>2546,32852=>2547,33714=>2548,36830=>2549,38256=>2550,24265=>2551,24604=>2552,28063=>2553,24088=>2554,25947=>2555,33080=>2556,38142=>2557,24651=>2558,28860=>2559,32451=>2560,31918=>2561,20937=>2562,63865=>2562,26753=>2563,31921=>2564,33391=>2565,20004=>2566,36742=>2567,37327=>2568,26238=>2569,20142=>2570,35845=>2571,25769=>2572,32842=>2573,20698=>2574,30103=>2575,29134=>2576,23525=>2577,36797=>2578,28518=>2579,20102=>2580,25730=>2581,38243=>2582,24278=>2583,26009=>2584,21015=>2585,35010=>2586,28872=>2587,21155=>2588,29454=>2589,29747=>2590,26519=>2591,30967=>2592,38678=>2593,20020=>2594,37051=>2595,40158=>2596,28107=>2597,20955=>2598,36161=>2599,21533=>2600,25294=>2601,29618=>2602,33777=>2603,38646=>2604,40836=>2605,38083=>2606,20278=>2607,32666=>2608,20940=>2609,28789=>2610,38517=>2611,23725=>2612,39046=>2613,21478=>2614,20196=>2615,28316=>2616,29705=>2617,27060=>2618,30827=>2619,39311=>2620,30041=>2621,21016=>2622,30244=>2623,27969=>2624,26611=>2625,20845=>2626,40857=>2627,32843=>2628,21657=>2629,31548=>2630,31423=>2631,38534=>2632,22404=>2633,25314=>2634,38471=>2635,27004=>2636,23044=>2637,25602=>2638,31699=>2639,28431=>2640,38475=>2641,33446=>2642,21346=>2643,39045=>2644,24208=>2645,28809=>2646,25523=>2647,21348=>2648,34383=>2649,40065=>2650,40595=>2651,30860=>2652,38706=>2653,36335=>2654,36162=>2655,12229=>2656,40575=>2656,28510=>2657,31108=>2658,24405=>2659,38470=>2660,25134=>2661,39540=>2662,21525=>2663,38109=>2664,20387=>2665,26053=>2666,23653=>2667,23649=>2668,32533=>2669,34385=>2670,27695=>2671,24459=>2672,29575=>2673,28388=>2674,32511=>2675,23782=>2676,25371=>2677,23402=>2678,28390=>2679,21365=>2680,20081=>2681,25504=>2682,30053=>2683,25249=>2684,36718=>2685,20262=>2686,20177=>2687,27814=>2688,32438=>2689,35770=>2690,33821=>2691,34746=>2692,32599=>2693,36923=>2694,38179=>2695,31657=>2696,39585=>2697,35064=>2698,33853=>2699,27931=>2700,39558=>2701,32476=>2702,22920=>2703,12231=>2704,40635=>2704,29595=>2705,30721=>2706,34434=>2707,39532=>2708,39554=>2709,22043=>2710,21527=>2711,22475=>2712,20080=>2713,40614=>2714,21334=>2715,36808=>2716,33033=>2717,30610=>2718,39314=>2719,34542=>2720,28385=>2721,34067=>2722,26364=>2723,24930=>2724,28459=>2725,35881=>2726,33426=>2727,33579=>2728,30450=>2729,27667=>2730,24537=>2731,33725=>2732,29483=>2733,33541=>2734,38170=>2735,12113=>2736,27611=>2736,12141=>2737,30683=>2737,38086=>2738,21359=>2739,33538=>2740,20882=>2741,24125=>2742,35980=>2743,36152=>2744,20040=>2745,29611=>2746,26522=>2747,26757=>2748,37238=>2749,38665=>2750,29028=>2751,27809=>2752,30473=>2753,23186=>2754,38209=>2755,27599=>2756,32654=>2757,26151=>2758,23504=>2759,22969=>2760,23194=>2761,38376=>2762,38391=>2763,20204=>2764,33804=>2765,33945=>2766,27308=>2767,30431=>2768,38192=>2769,29467=>2770,26790=>2771,23391=>2772,30511=>2773,37274=>2774,38753=>2775,31964=>2776,36855=>2777,35868=>2778,24357=>2779,12150=>2780,31859=>2780,31192=>2781,35269=>2782,27852=>2783,34588=>2784,23494=>2785,24130=>2786,26825=>2787,30496=>2788,32501=>2789,20885=>2790,20813=>2791,21193=>2792,23081=>2793,32517=>2794,12207=>2795,38754=>2795,33495=>2796,25551=>2797,30596=>2798,34256=>2799,31186=>2800,28218=>2801,24217=>2802,22937=>2803,34065=>2804,28781=>2805,27665=>2806,25279=>2807,12139=>2808,30399=>2808,25935=>2809,24751=>2810,38397=>2811,26126=>2812,34719=>2813,40483=>2814,38125=>2815,21517=>2816,21629=>2817,35884=>2818,25720=>2819,25721=>2820,34321=>2821,27169=>2822,33180=>2823,30952=>2824,25705=>2825,39764=>2826,25273=>2827,26411=>2828,33707=>2829,22696=>2830,40664=>2831,27819=>2832,28448=>2833,23518=>2834,38476=>2835,35851=>2836,29279=>2837,26576=>2838,25287=>2839,29281=>2840,20137=>2841,22982=>2842,27597=>2843,22675=>2844,26286=>2845,24149=>2846,21215=>2847,24917=>2848,12106=>2849,26408=>2849,12140=>2850,30446=>2850,30566=>2851,29287=>2852,31302=>2853,25343=>2854,21738=>2855,21584=>2856,38048=>2857,37027=>2858,23068=>2859,32435=>2860,27670=>2861,20035=>2862,22902=>2863,32784=>2864,22856=>2865,21335=>2866,30007=>2867,38590=>2868,22218=>2869,25376=>2870,33041=>2871,24700=>2872,38393=>2873,28118=>2874,21602=>2875,39297=>2876,20869=>2877,23273=>2878,33021=>2879,22958=>2880,38675=>2881,20522=>2882,27877=>2883,23612=>2884,25311=>2885,20320=>2886,21311=>2887,33147=>2888,36870=>2889,28346=>2890,34091=>2891,25288=>2892,24180=>2893,30910=>2894,25781=>2895,25467=>2896,24565=>2897,23064=>2898,37247=>2899,40479=>2900,23615=>2901,25423=>2902,32834=>2903,23421=>2904,21870=>2905,38218=>2906,38221=>2907,28037=>2908,24744=>2909,26592=>2910,29406=>2911,20957=>2912,23425=>2913,25319=>2914,27870=>2915,12124=>2916,29275=>2916,25197=>2917,38062=>2918,32445=>2919,33043=>2920,27987=>2921,20892=>2922,24324=>2923,22900=>2924,21162=>2925,24594=>2926,12069=>2927,22899=>2927,26262=>2928,34384=>2929,30111=>2930,25386=>2931,25062=>2932,31983=>2933,35834=>2934,21734=>2935,27431=>2936,40485=>2937,27572=>2938,34261=>2939,21589=>2940,20598=>2941,27812=>2942,21866=>2943,36276=>2944,29228=>2945,24085=>2946,24597=>2947,29750=>2948,25293=>2949,25490=>2950,29260=>2951,24472=>2952,28227=>2953,27966=>2954,25856=>2955,28504=>2956,30424=>2957,30928=>2958,30460=>2959,30036=>2960,21028=>2961,21467=>2962,20051=>2963,24222=>2964,26049=>2965,32810=>2966,32982=>2967,25243=>2968,21638=>2969,21032=>2970,28846=>2971,34957=>2972,36305=>2973,27873=>2974,21624=>2975,32986=>2976,22521=>2977,35060=>2978,36180=>2979,38506=>2980,37197=>2981,20329=>2982,27803=>2983,21943=>2984,30406=>2985,30768=>2986,25256=>2987,28921=>2988,28558=>2989,24429=>2990,34028=>2991,26842=>2992,30844=>2993,31735=>2994,33192=>2995,26379=>2996,40527=>2997,25447=>2998,30896=>2999,22383=>3000,30738=>3001,38713=>3002,25209=>3003,25259=>3004,21128=>3005,29749=>3006,27607=>3007,21860=>3008,33086=>3009,30130=>3010,12138=>3011,30382=>3011,21305=>3012,30174=>3013,20731=>3014,23617=>3015,35692=>3016,31687=>3017,20559=>3018,12122=>3019,29255=>3019,39575=>3020,39128=>3021,28418=>3022,29922=>3023,31080=>3024,25735=>3025,30629=>3026,25340=>3027,39057=>3028,36139=>3029,21697=>3030,32856=>3031,20050=>3032,22378=>3033,33529=>3034,33805=>3035,24179=>3036,20973=>3037,29942=>3038,35780=>3039,23631=>3040,22369=>3041,27900=>3042,39047=>3043,23110=>3044,30772=>3045,39748=>3046,36843=>3047,31893=>3048,21078=>3049,25169=>3050,38138=>3051,20166=>3052,33670=>3053,33889=>3054,33769=>3055,33970=>3056,22484=>3057,26420=>3058,22275=>3059,26222=>3060,28006=>3061,35889=>3062,26333=>3063,28689=>3064,26399=>3065,27450=>3066,26646=>3067,25114=>3068,22971=>3069,19971=>3070,20932=>3071,28422=>3072,26578=>3073,27791=>3074,20854=>3075,26827=>3076,22855=>3077,27495=>3078,30054=>3079,23822=>3080,33040=>3081,40784=>3082,26071=>3083,31048=>3084,31041=>3085,39569=>3086,36215=>3087,23682=>3088,20062=>3089,20225=>3090,21551=>3091,22865=>3092,30732=>3093,22120=>3094,12115=>3095,27668=>3095,36804=>3096,24323=>3097,27773=>3098,27875=>3099,35755=>3100,25488=>3101,24688=>3102,27965=>3103,29301=>3104,25190=>3105,38030=>3106,38085=>3107,21315=>3108,36801=>3109,31614=>3110,20191=>3111,35878=>3112,20094=>3113,40660=>3114,38065=>3115,38067=>3116,21069=>3117,28508=>3118,36963=>3119,27973=>3120,35892=>3121,22545=>3122,23884=>3123,12107=>3124,27424=>3124,27465=>3125,26538=>3126,21595=>3127,33108=>3128,32652=>3129,22681=>3130,34103=>3131,24378=>3132,25250=>3133,27207=>3134,38201=>3135,25970=>3136,24708=>3137,26725=>3138,30631=>3139,20052=>3140,20392=>3141,24039=>3142,38808=>3143,25772=>3144,32728=>3145,23789=>3146,20431=>3147,31373=>3148,20999=>3149,33540=>3150,19988=>3151,24623=>3152,31363=>3153,38054=>3154,20405=>3155,20146=>3156,31206=>3157,29748=>3158,21220=>3159,33465=>3160,25810=>3161,31165=>3162,23517=>3163,27777=>3164,38738=>3165,36731=>3166,27682=>3167,20542=>3168,21375=>3169,28165=>3170,25806=>3171,26228=>3172,27696=>3173,24773=>3174,39031=>3175,35831=>3176,24198=>3177,29756=>3178,31351=>3179,31179=>3180,19992=>3181,37041=>3182,29699=>3183,27714=>3184,22234=>3185,37195=>3186,27845=>3187,36235=>3188,21306=>3189,34502=>3190,26354=>3191,36527=>3192,23624=>3193,39537=>3194,28192=>3195,21462=>3196,23094=>3197,40843=>3198,36259=>3199,21435=>3200,22280=>3201,39079=>3202,26435=>3203,37275=>3204,27849=>3205,20840=>3206,30154=>3207,25331=>3208,12125=>3209,29356=>3209,21048=>3210,21149=>3211,32570=>3212,28820=>3213,30264=>3214,21364=>3215,40522=>3216,27063=>3217,30830=>3218,38592=>3219,35033=>3220,32676=>3221,28982=>3222,29123=>3223,20873=>3224,26579=>3225,29924=>3226,22756=>3227,25880=>3228,22199=>3229,35753=>3230,39286=>3231,25200=>3232,32469=>3233,24825=>3234,28909=>3235,22764=>3236,20161=>3237,12040=>3238,20154=>3238,24525=>3239,38887=>3240,20219=>3241,35748=>3242,20995=>3243,22922=>3244,32427=>3245,25172=>3246,20173=>3247,12103=>3248,26085=>3248,25102=>3249,33592=>3250,33993=>3251,33635=>3252,34701=>3253,29076=>3254,28342=>3255,23481=>3256,32466=>3257,20887=>3258,25545=>3259,26580=>3260,12161=>3261,32905=>3261,33593=>3262,34837=>3263,20754=>3264,23418=>3265,22914=>3266,36785=>3267,20083=>3268,27741=>3269,12042=>3270,20837=>3270,35109=>3271,36719=>3272,38446=>3273,34122=>3274,29790=>3275,38160=>3276,38384=>3277,28070=>3278,33509=>3279,24369=>3280,25746=>3281,27922=>3282,33832=>3283,33134=>3284,40131=>3285,22622=>3286,36187=>3287,19977=>3288,21441=>3289,20254=>3290,25955=>3291,26705=>3292,21971=>3293,20007=>3294,25620=>3295,39578=>3296,25195=>3297,23234=>3298,29791=>3299,12170=>3300,33394=>3300,28073=>3301,26862=>3302,20711=>3303,33678=>3304,30722=>3305,26432=>3306,21049=>3307,27801=>3308,32433=>3309,20667=>3310,21861=>3311,29022=>3312,31579=>3313,26194=>3314,29642=>3315,33515=>3316,26441=>3317,12077=>3318,23665=>3318,21024=>3319,29053=>3320,34923=>3321,38378=>3322,38485=>3323,25797=>3324,36193=>3325,33203=>3326,21892=>3327,27733=>3328,25159=>3329,32558=>3330,22674=>3331,20260=>3332,21830=>3333,36175=>3334,26188=>3335,19978=>3336,23578=>3337,35059=>3338,26786=>3339,25422=>3340,31245=>3341,28903=>3342,33421=>3343,21242=>3344,38902=>3345,23569=>3346,21736=>3347,37045=>3348,32461=>3349,22882=>3350,36170=>3351,34503=>3352,12166=>3353,33292=>3353,33293=>3354,36198=>3355,25668=>3356,23556=>3357,24913=>3358,28041=>3359,31038=>3360,35774=>3361,30775=>3362,30003=>3363,21627=>3364,20280=>3365,12189=>3366,36523=>3366,28145=>3367,23072=>3368,32453=>3369,31070=>3370,27784=>3371,23457=>3372,23158=>3373,29978=>3374,32958=>3375,24910=>3376,28183=>3377,22768=>3378,12131=>3379,29983=>3379,29989=>3380,29298=>3381,21319=>3382,32499=>3383,30465=>3384,30427=>3385,21097=>3386,32988=>3387,22307=>3388,24072=>3389,22833=>3390,29422=>3391,26045=>3392,28287=>3393,35799=>3394,12075=>3395,23608=>3395,34417=>3396,12055=>3397,21313=>3397,12143=>3398,30707=>3398,25342=>3399,26102=>3400,20160=>3401,12215=>3402,39135=>3402,34432=>3403,23454=>3404,35782=>3405,21490=>3406,12142=>3407,30690=>3407,20351=>3408,23630=>3409,39542=>3410,22987=>3411,24335=>3412,12144=>3413,31034=>3413,12064=>3414,22763=>3414,19990=>3415,26623=>3416,20107=>3417,25325=>3418,35475=>3419,36893=>3420,21183=>3421,26159=>3422,21980=>3423,22124=>3424,36866=>3425,20181=>3426,20365=>3427,37322=>3428,39280=>3429,12114=>3430,27663=>3430,24066=>3431,24643=>3432,23460=>3433,35270=>3434,35797=>3435,25910=>3436,12095=>3437,25163=>3437,12216=>3438,39318=>3438,23432=>3439,23551=>3440,25480=>3441,21806=>3442,21463=>3443,30246=>3444,20861=>3445,34092=>3446,26530=>3447,26803=>3448,27530=>3449,25234=>3450,36755=>3451,21460=>3452,33298=>3453,28113=>3454,30095=>3455,20070=>3456,36174=>3457,23408=>3458,29087=>3459,34223=>3460,26257=>3461,26329=>3462,32626=>3463,34560=>3464,12233=>3465,40653=>3465,12239=>3466,40736=>3466,23646=>3467,26415=>3468,36848=>3469,26641=>3470,26463=>3471,25101=>3472,31446=>3473,22661=>3474,24246=>3475,25968=>3476,28465=>3477,24661=>3478,21047=>3479,32781=>3480,25684=>3481,34928=>3482,29993=>3483,24069=>3484,26643=>3485,25332=>3486,38684=>3487,21452=>3488,29245=>3489,35841=>3490,12116=>3491,27700=>3491,30561=>3492,31246=>3493,21550=>3494,30636=>3495,39034=>3496,33308=>3497,35828=>3498,30805=>3499,26388=>3500,28865=>3501,26031=>3502,25749=>3503,22070=>3504,24605=>3505,31169=>3506,21496=>3507,19997=>3508,27515=>3509,32902=>3510,23546=>3511,21987=>3512,22235=>3513,20282=>3514,20284=>3515,39282=>3516,24051=>3517,26494=>3518,32824=>3519,24578=>3520,39042=>3521,36865=>3522,23435=>3523,35772=>3524,35829=>3525,25628=>3526,33368=>3527,25822=>3528,22013=>3529,33487=>3530,37221=>3531,20439=>3532,32032=>3533,36895=>3534,31903=>3535,20723=>3536,22609=>3537,28335=>3538,23487=>3539,35785=>3540,32899=>3541,37240=>3542,33948=>3543,31639=>3544,34429=>3545,38539=>3546,38543=>3547,32485=>3548,39635=>3549,30862=>3550,23681=>3551,31319=>3552,36930=>3553,38567=>3554,31071=>3555,23385=>3556,25439=>3557,31499=>3558,34001=>3559,26797=>3560,21766=>3561,32553=>3562,29712=>3563,32034=>3564,38145=>3565,25152=>3566,22604=>3567,20182=>3568,23427=>3569,22905=>3570,22612=>3571,29549=>3572,25374=>3573,36427=>3574,36367=>3575,32974=>3576,33492=>3577,25260=>3578,21488=>3579,27888=>3580,37214=>3581,22826=>3582,24577=>3583,27760=>3584,22349=>3585,25674=>3586,36138=>3587,30251=>3588,28393=>3589,22363=>3590,27264=>3591,30192=>3592,28525=>3593,35885=>3594,35848=>3595,22374=>3596,27631=>3597,34962=>3598,30899=>3599,25506=>3600,21497=>3601,28845=>3602,27748=>3603,22616=>3604,25642=>3605,22530=>3606,26848=>3607,33179=>3608,21776=>3609,31958=>3610,20504=>3611,36538=>3612,28108=>3613,36255=>3614,28907=>3615,25487=>3616,28059=>3617,28372=>3618,32486=>3619,33796=>3620,26691=>3621,36867=>3622,28120=>3623,38518=>3624,35752=>3625,22871=>3626,29305=>3627,34276=>3628,33150=>3629,30140=>3630,35466=>3631,26799=>3632,21076=>3633,36386=>3634,38161=>3635,25552=>3636,39064=>3637,36420=>3638,21884=>3639,20307=>3640,26367=>3641,22159=>3642,24789=>3643,28053=>3644,21059=>3645,23625=>3646,22825=>3647,28155=>3648,22635=>3649,12133=>3650,30000=>3650,29980=>3651,24684=>3652,33300=>3653,33094=>3654,25361=>3655,26465=>3656,36834=>3657,30522=>3658,36339=>3659,36148=>3660,38081=>3661,24086=>3662,21381=>3663,21548=>3664,28867=>3665,27712=>3666,24311=>3667,20572=>3668,20141=>3669,24237=>3670,25402=>3671,33351=>3672,36890=>3673,26704=>3674,37230=>3675,30643=>3676,21516=>3677,38108=>3678,24420=>3679,31461=>3680,26742=>3681,25413=>3682,31570=>3683,32479=>3684,30171=>3685,20599=>3686,25237=>3687,22836=>3688,36879=>3689,20984=>3690,31171=>3691,31361=>3692,22270=>3693,24466=>3694,36884=>3695,28034=>3696,23648=>3697,12063=>3698,22303=>3698,21520=>3699,20820=>3700,28237=>3701,22242=>3702,25512=>3703,39059=>3704,33151=>3705,34581=>3706,35114=>3707,36864=>3708,21534=>3709,23663=>3710,33216=>3711,25302=>3712,25176=>3713,33073=>3714,40501=>3715,38464=>3716,39534=>3717,39548=>3718,26925=>3719,22949=>3720,25299=>3721,21822=>3722,25366=>3723,21703=>3724,34521=>3725,27964=>3726,23043=>3727,12129=>3728,29926=>3728,34972=>3729,27498=>3730,22806=>3731,35916=>3732,24367=>3733,28286=>3734,29609=>3735,39037=>3736,20024=>3737,28919=>3738,23436=>3739,30871=>3740,25405=>3741,26202=>3742,30358=>3743,24779=>3744,23451=>3745,23113=>3746,19975=>3747,33109=>3748,27754=>3749,29579=>3750,20129=>3751,26505=>3752,12153=>3753,32593=>3753,24448=>3754,26106=>3755,26395=>3756,24536=>3757,22916=>3758,23041=>3759,24013=>3760,24494=>3761,21361=>3762,38886=>3763,36829=>3764,26693=>3765,22260=>3766,21807=>3767,24799=>3768,20026=>3769,28493=>3770,32500=>3771,33479=>3772,33806=>3773,22996=>3774,20255=>3775,20266=>3776,23614=>3777,32428=>3778,26410=>3779,34074=>3780,21619=>3781,30031=>3782,32963=>3783,21890=>3784,39759=>3785,20301=>3786,28205=>3787,35859=>3788,23561=>3789,24944=>3790,21355=>3791,30239=>3792,28201=>3793,34442=>3794,12098=>3795,25991=>3795,38395=>3796,32441=>3797,21563=>3798,31283=>3799,32010=>3800,38382=>3801,21985=>3802,32705=>3803,29934=>3804,25373=>3805,34583=>3806,28065=>3807,31389=>3808,25105=>3809,26017=>3810,21351=>3811,25569=>3812,27779=>3813,24043=>3814,21596=>3815,38056=>3816,20044=>3817,27745=>3818,35820=>3819,23627=>3820,12102=>3821,26080=>3821,33436=>3822,26791=>3823,21566=>3824,21556=>3825,12111=>3826,27595=>3826,27494=>3827,20116=>3828,25410=>3829,21320=>3830,33310=>3831,20237=>3832,20398=>3833,22366=>3834,25098=>3835,38654=>3836,26212=>3837,29289=>3838,21247=>3839,21153=>3840,24735=>3841,35823=>3842,26132=>3843,29081=>3844,26512=>3845,35199=>3846,30802=>3847,30717=>3848,26224=>3849,22075=>3850,21560=>3851,38177=>3852,29306=>3853,31232=>3854,24687=>3855,24076=>3856,24713=>3857,33181=>3858,12067=>3859,22805=>3859,24796=>3860,29060=>3861,28911=>3862,28330=>3863,27728=>3864,29312=>3865,27268=>3866,34989=>3867,24109=>3868,20064=>3869,23219=>3870,21916=>3871,38115=>3872,27927=>3873,31995=>3874,38553=>3875,25103=>3876,32454=>3877,30606=>3878,34430=>3879,21283=>3880,38686=>3881,36758=>3882,26247=>3883,23777=>3884,20384=>3885,29421=>3886,19979=>3887,21414=>3888,22799=>3889,21523=>3890,25472=>3891,38184=>3892,20808=>3893,20185=>3894,40092=>3895,32420=>3896,21688=>3897,36132=>3898,34900=>3899,33335=>3900,38386=>3901,28046=>3902,24358=>3903,23244=>3904,26174=>3905,38505=>3906,29616=>3907,29486=>3908,21439=>3909,33146=>3910,39301=>3911,32673=>3912,23466=>3913,38519=>3914,38480=>3915,32447=>3916,30456=>3917,21410=>3918,38262=>3919,12217=>3920,39321=>3920,31665=>3921,35140=>3922,28248=>3923,20065=>3924,32724=>3925,31077=>3926,35814=>3927,24819=>3928,21709=>3929,20139=>3930,39033=>3931,24055=>3932,27233=>3933,20687=>3934,21521=>3935,35937=>3936,33831=>3937,30813=>3938,38660=>3939,21066=>3940,21742=>3941,22179=>3942,38144=>3943,28040=>3944,23477=>3945,28102=>3946,26195=>3947,12073=>3948,23567=>3948,23389=>3949,26657=>3950,32918=>3951,21880=>3952,31505=>3953,25928=>3954,26964=>3955,20123=>3956,27463=>3957,34638=>3958,38795=>3959,21327=>3960,25375=>3961,25658=>3962,37034=>3963,26012=>3964,32961=>3965,35856=>3966,20889=>3967,26800=>3968,21368=>3969,34809=>3970,25032=>3971,27844=>3972,27899=>3973,35874=>3974,23633=>3975,34218=>3976,33455=>3977,38156=>3978,27427=>3979,12191=>3980,36763=>3980,26032=>3981,24571=>3982,12092=>3983,24515=>3983,20449=>3984,34885=>3985,26143=>3986,33125=>3987,29481=>3988,24826=>3989,20852=>3990,21009=>3991,22411=>3992,24418=>3993,37026=>3994,12175=>3995,34892=>3995,37266=>3996,24184=>3997,26447=>3998,24615=>3999,22995=>4000,20804=>4001,20982=>4002,33016=>4003,21256=>4004,27769=>4005,38596=>4006,29066=>4007,20241=>4008,20462=>4009,32670=>4010,26429=>4011,21957=>4012,38152=>4013,31168=>4014,34966=>4015,32483=>4016,22687=>4017,25100=>4018,38656=>4019,34394=>4020,22040=>4021,39035=>4022,24464=>4023,35768=>4024,33988=>4025,37207=>4026,21465=>4027,26093=>4028,24207=>4029,30044=>4030,24676=>4031,32110=>4032,23167=>4033,32490=>4034,32493=>4035,36713=>4036,21927=>4037,23459=>4038,24748=>4039,26059=>4040,12126=>4041,29572=>4041,36873=>4042,30307=>4043,30505=>4044,32474=>4045,38772=>4046,34203=>4047,23398=>4048,12147=>4049,31348=>4049,38634=>4050,12174=>4051,34880=>4051,21195=>4052,29071=>4053,24490=>4054,26092=>4055,35810=>4056,23547=>4057,39535=>4058,24033=>4059,27529=>4060,27739=>4061,35757=>4062,35759=>4063,36874=>4064,36805=>4065,21387=>4066,25276=>4067,40486=>4068,40493=>4069,21568=>4070,20011=>4071,33469=>4072,12123=>4073,29273=>4073,34460=>4074,23830=>4075,34905=>4076,28079=>4077,38597=>4078,21713=>4079,20122=>4080,35766=>4081,28937=>4082,21693=>4083,38409=>4084,28895=>4085,28153=>4086,30416=>4087,20005=>4088,30740=>4089,34578=>4090,23721=>4091,24310=>4092,12180=>4093,35328=>4093,39068=>4094,38414=>4095,28814=>4096,27839=>4097,22852=>4098,25513=>4099,30524=>4100,34893=>4101,28436=>4102,33395=>4103,22576=>4104,29141=>4105,21388=>4106,30746=>4107,38593=>4108,21761=>4109,24422=>4110,28976=>4111,23476=>4112,35866=>4113,39564=>4114,27523=>4115,22830=>4116,40495=>4117,31207=>4118,26472=>4119,25196=>4120,20335=>4121,30113=>4122,12154=>4123,32650=>4123,27915=>4124,38451=>4125,27687=>4126,20208=>4127,30162=>4128,20859=>4129,26679=>4130,28478=>4131,36992=>4132,33136=>4133,22934=>4134,29814=>4135,25671=>4136,23591=>4137,36965=>4138,31377=>4139,35875=>4140,23002=>4141,21676=>4142,33280=>4143,33647=>4144,35201=>4145,32768=>4146,26928=>4147,22094=>4148,32822=>4149,29239=>4150,37326=>4151,20918=>4152,20063=>4153,39029=>4154,25494=>4155,19994=>4156,21494=>4157,26355=>4158,33099=>4159,22812=>4160,28082=>4161,12032=>4162,19968=>4162,22777=>4163,21307=>4164,25558=>4165,38129=>4166,20381=>4167,20234=>4168,12176=>4169,34915=>4169,39056=>4170,22839=>4171,36951=>4172,31227=>4173,20202=>4174,33008=>4175,30097=>4176,27778=>4177,23452=>4178,23016=>4179,24413=>4180,26885=>4181,34433=>4182,20506=>4183,24050=>4184,12036=>4185,20057=>4185,30691=>4186,20197=>4187,33402=>4188,25233=>4189,26131=>4190,12194=>4191,37009=>4191,23673=>4192,20159=>4193,24441=>4194,33222=>4195,36920=>4196,32900=>4197,30123=>4198,20134=>4199,35028=>4200,24847=>4201,27589=>4202,24518=>4203,20041=>4204,30410=>4205,28322=>4206,35811=>4207,35758=>4208,35850=>4209,35793=>4210,24322=>4211,32764=>4212,32716=>4213,32462=>4214,33589=>4215,33643=>4216,22240=>4217,27575=>4218,12211=>4219,38899=>4219,38452=>4220,23035=>4221,21535=>4222,38134=>4223,28139=>4224,23493=>4225,39278=>4226,23609=>4227,24341=>4228,38544=>4229,21360=>4230,33521=>4231,27185=>4232,23156=>4233,40560=>4234,24212=>4235,32552=>4236,33721=>4237,33828=>4238,33829=>4239,33639=>4240,34631=>4241,36814=>4242,36194=>4243,30408=>4244,24433=>4245,39062=>4246,30828=>4247,26144=>4248,21727=>4249,25317=>4250,20323=>4251,33219=>4252,30152=>4253,24248=>4254,38605=>4255,36362=>4256,34553=>4257,21647=>4258,27891=>4259,28044=>4260,27704=>4261,24703=>4262,21191=>4263,12132=>4264,29992=>4264,24189=>4265,20248=>4266,24736=>4267,24551=>4268,23588=>4269,30001=>4270,37038=>4271,38080=>4272,29369=>4273,27833=>4274,28216=>4275,12195=>4276,37193=>4276,26377=>4277,21451=>4278,21491=>4279,20305=>4280,37321=>4281,35825=>4282,12060=>4283,21448=>4283,24188=>4284,36802=>4285,28132=>4286,20110=>4287,30402=>4288,27014=>4289,34398=>4290,24858=>4291,33286=>4292,20313=>4293,20446=>4294,36926=>4295,40060=>4296,24841=>4297,28189=>4298,28180=>4299,38533=>4300,20104=>4301,23089=>4302,12204=>4303,38632=>4303,19982=>4304,23679=>4305,31161=>4306,23431=>4307,35821=>4308,12155=>4309,32701=>4309,12127=>4310,29577=>4310,22495=>4311,33419=>4312,37057=>4313,21505=>4314,36935=>4315,21947=>4316,23786=>4317,24481=>4318,24840=>4319,27442=>4320,29425=>4321,32946=>4322,35465=>4323,28020=>4324,23507=>4325,35029=>4326,39044=>4327,35947=>4328,39533=>4329,40499=>4330,28170=>4331,20900=>4332,20803=>4333,22435=>4334,34945=>4335,21407=>4336,25588=>4337,36757=>4338,22253=>4339,21592=>4340,22278=>4341,29503=>4342,28304=>4343,32536=>4344,36828=>4345,33489=>4346,24895=>4347,24616=>4348,38498=>4349,12104=>4350,26352=>4350,32422=>4351,36234=>4352,36291=>4353,38053=>4354,23731=>4355,31908=>4356,12105=>4357,26376=>4357,24742=>4358,38405=>4359,32792=>4360,20113=>4361,37095=>4362,21248=>4363,38504=>4364,20801=>4365,36816=>4366,34164=>4367,37213=>4368,26197=>4369,38901=>4370,23381=>4371,21277=>4372,30776=>4373,26434=>4374,26685=>4375,21705=>4376,28798=>4377,23472=>4378,36733=>4379,20877=>4380,22312=>4381,21681=>4382,25874=>4383,26242=>4384,36190=>4385,36163=>4386,33039=>4387,33900=>4388,36973=>4389,31967=>4390,20991=>4391,34299=>4392,26531=>4393,26089=>4394,28577=>4395,34468=>4396,36481=>4397,22122=>4398,36896=>4399,30338=>4400,28790=>4401,29157=>4402,36131=>4403,25321=>4404,21017=>4405,27901=>4406,36156=>4407,24590=>4408,22686=>4409,24974=>4410,26366=>4411,36192=>4412,25166=>4413,21939=>4414,28195=>4415,26413=>4416,36711=>4417,38113=>4418,38392=>4419,30504=>4420,26629=>4421,27048=>4422,21643=>4423,20045=>4424,28856=>4425,35784=>4426,25688=>4427,25995=>4428,23429=>4429,31364=>4430,20538=>4431,23528=>4432,30651=>4433,27617=>4434,35449=>4435,31896=>4436,27838=>4437,30415=>4438,26025=>4439,36759=>4440,23853=>4441,23637=>4442,34360=>4443,26632=>4444,21344=>4445,25112=>4446,31449=>4447,28251=>4448,32509=>4449,27167=>4450,31456=>4451,24432=>4452,28467=>4453,24352=>4454,25484=>4455,28072=>4456,26454=>4457,19976=>4458,24080=>4459,36134=>4460,20183=>4461,32960=>4462,30260=>4463,38556=>4464,25307=>4465,26157=>4466,25214=>4467,27836=>4468,36213=>4469,29031=>4470,32617=>4471,20806=>4472,32903=>4473,21484=>4474,36974=>4475,25240=>4476,21746=>4477,34544=>4478,36761=>4479,32773=>4480,38167=>4481,34071=>4482,36825=>4483,27993=>4484,29645=>4485,26015=>4486,30495=>4487,29956=>4488,30759=>4489,33275=>4490,36126=>4491,38024=>4492,20390=>4493,26517=>4494,30137=>4495,35786=>4496,38663=>4497,25391=>4498,38215=>4499,38453=>4500,33976=>4501,25379=>4502,30529=>4503,24449=>4504,29424=>4505,20105=>4506,24596=>4507,25972=>4508,25327=>4509,27491=>4510,25919=>4511,24103=>4512,30151=>4513,37073=>4514,35777=>4515,33437=>4516,26525=>4517,12096=>4518,25903=>4518,21553=>4519,34584=>4520,30693=>4521,32930=>4522,33026=>4523,27713=>4524,20043=>4525,32455=>4526,32844=>4527,30452=>4528,26893=>4529,27542=>4530,25191=>4531,20540=>4532,20356=>4533,22336=>4534,25351=>4535,12108=>4536,27490=>4536,36286=>4537,21482=>4538,26088=>4539,32440=>4540,24535=>4541,25370=>4542,25527=>4543,12164=>4544,33267=>4544,33268=>4545,32622=>4546,24092=>4547,23769=>4548,21046=>4549,26234=>4550,31209=>4551,31258=>4552,36136=>4553,28825=>4554,30164=>4555,28382=>4556,27835=>4557,31378=>4558,20013=>4559,30405=>4560,24544=>4561,38047=>4562,34935=>4563,32456=>4564,31181=>4565,32959=>4566,37325=>4567,20210=>4568,20247=>4569,12168=>4570,33311=>4570,21608=>4571,24030=>4572,27954=>4573,35788=>4574,31909=>4575,36724=>4576,32920=>4577,24090=>4578,21650=>4579,30385=>4580,23449=>4581,26172=>4582,39588=>4583,29664=>4584,26666=>4585,34523=>4586,26417=>4587,29482=>4588,35832=>4589,35803=>4590,36880=>4591,12149=>4592,31481=>4592,28891=>4593,29038=>4594,25284=>4595,30633=>4596,22065=>4597,20027=>4598,33879=>4599,26609=>4600,21161=>4601,34496=>4602,36142=>4603,38136=>4604,31569=>4605,20303=>4606,27880=>4607,31069=>4608,39547=>4609,25235=>4610,12118=>4611,29226=>4611,25341=>4612,19987=>4613,30742=>4614,36716=>4615,25776=>4616,36186=>4617,31686=>4618,26729=>4619,24196=>4620,35013=>4621,22918=>4622,25758=>4623,22766=>4624,29366=>4625,26894=>4626,38181=>4627,36861=>4628,36184=>4629,22368=>4630,32512=>4631,35846=>4632,20934=>4633,25417=>4634,25305=>4635,21331=>4636,26700=>4637,29730=>4638,33537=>4639,37196=>4640,21828=>4641,30528=>4642,28796=>4643,27978=>4644,20857=>4645,21672=>4646,36164=>4647,23039=>4648,28363=>4649,28100=>4650,23388=>4651,32043=>4652,20180=>4653,31869=>4654,28371=>4655,12070=>4656,23376=>4656,12163=>4657,33258=>4657,28173=>4658,23383=>4659,39683=>4660,26837=>4661,36394=>4662,23447=>4663,32508=>4664,24635=>4665,32437=>4666,37049=>4667,12187=>4668,36208=>4668,22863=>4669,25549=>4670,31199=>4671,12188=>4672,36275=>4672,21330=>4673,26063=>4674,31062=>4675,35781=>4676,38459=>4677,32452=>4678,38075=>4679,32386=>4680,22068=>4681,37257=>4682,26368=>4683,32618=>4684,23562=>4685,36981=>4686,26152=>4687,24038=>4688,20304=>4689,26590=>4690,20570=>4691,20316=>4692,22352=>4693,24231=>4694,20109=>4695,19980=>4696,20800=>4697,64012=>4697,19984=>4698,24319=>4699,21317=>4700,19989=>4701,20120=>4702,19998=>4703,12224=>4704,39730=>4704,23404=>4705,22121=>4706,12033=>4707,20008=>4707,31162=>4708,12035=>4709,20031=>4709,12052=>4710,21269=>4710,20039=>4711,22829=>4712,12120=>4713,29243=>4713,21358=>4714,27664=>4715,22239=>4716,32996=>4717,39319=>4718,27603=>4719,30590=>4720,40727=>4721,12034=>4722,20022=>4722,20127=>4723,40720=>4724,20060=>4725,20073=>4726,20115=>4727,33416=>4728,23387=>4729,21868=>4730,22031=>4731,20164=>4732,21389=>4733,21405=>4734,21411=>4735,21413=>4736,21422=>4737,38757=>4738,36189=>4739,12053=>4740,21274=>4740,21493=>4741,21286=>4742,21294=>4743,21310=>4744,36188=>4745,21350=>4746,21347=>4747,20994=>4748,21000=>4749,21006=>4750,21037=>4751,21043=>4752,21055=>4753,21056=>4754,21068=>4755,21086=>4756,21089=>4757,21084=>4758,33967=>4759,21117=>4760,21122=>4761,21121=>4762,21136=>4763,21139=>4764,12044=>4765,20866=>4765,32596=>4766,20155=>4767,20163=>4768,20169=>4769,20162=>4770,20200=>4771,20193=>4772,20203=>4773,20190=>4774,20251=>4775,20211=>4776,20258=>4777,20324=>4778,20213=>4779,20261=>4780,20263=>4781,20233=>4782,20267=>4783,20318=>4784,20327=>4785,25912=>4786,20314=>4787,20317=>4788,20319=>4789,20311=>4790,20274=>4791,20285=>4792,20342=>4793,20340=>4794,20369=>4795,20361=>4796,20355=>4797,20367=>4798,20350=>4799,20347=>4800,20394=>4801,20348=>4802,20396=>4803,20372=>4804,20454=>4805,20456=>4806,20458=>4807,20421=>4808,20442=>4809,20451=>4810,20444=>4811,20433=>4812,20447=>4813,20472=>4814,20521=>4815,20556=>4816,20467=>4817,20524=>4818,20495=>4819,20526=>4820,20525=>4821,20478=>4822,20508=>4823,20492=>4824,20517=>4825,20520=>4826,20606=>4827,20547=>4828,20565=>4829,20552=>4830,20558=>4831,20588=>4832,20603=>4833,20645=>4834,20647=>4835,20649=>4836,20666=>4837,20694=>4838,20742=>4839,20717=>4840,20716=>4841,20710=>4842,20718=>4843,20743=>4844,20747=>4845,20189=>4846,27709=>4847,20312=>4848,20325=>4849,20430=>4850,12245=>4851,40864=>4851,27718=>4852,31860=>4853,20846=>4854,24061=>4855,40649=>4856,39320=>4857,20865=>4858,22804=>4859,12051=>4860,21241=>4860,21261=>4861,35335=>4862,21264=>4863,20971=>4864,22809=>4865,20821=>4866,12039=>4867,20128=>4867,20822=>4868,20147=>4869,34926=>4870,34980=>4871,20149=>4872,33044=>4873,35026=>4874,31104=>4875,23348=>4876,34819=>4877,32696=>4878,12046=>4879,20907=>4879,20913=>4880,20925=>4881,20924=>4882,20935=>4883,12045=>4884,20886=>4884,20898=>4885,20901=>4886,35744=>4887,35750=>4888,35751=>4889,35754=>4890,35764=>4891,35765=>4892,35767=>4893,35778=>4894,35779=>4895,35787=>4896,35791=>4897,35790=>4898,35794=>4899,35795=>4900,35796=>4901,35798=>4902,35800=>4903,35801=>4904,35804=>4905,35807=>4906,35808=>4907,35812=>4908,35816=>4909,35817=>4910,35822=>4911,35824=>4912,35827=>4913,35830=>4914,35833=>4915,35836=>4916,35839=>4917,35840=>4918,35842=>4919,35844=>4920,35847=>4921,35852=>4922,35855=>4923,35857=>4924,35858=>4925,35860=>4926,35861=>4927,35862=>4928,35865=>4929,35867=>4930,35864=>4931,35869=>4932,35871=>4933,35872=>4934,35873=>4935,35877=>4936,35879=>4937,35882=>4938,35883=>4939,35886=>4940,35887=>4941,35890=>4942,35891=>4943,35893=>4944,35894=>4945,12057=>4946,21353=>4946,21370=>4947,38429=>4948,38434=>4949,38433=>4950,38449=>4951,38442=>4952,38461=>4953,38460=>4954,38466=>4955,38473=>4956,38484=>4957,38495=>4958,38503=>4959,38508=>4960,38514=>4961,38516=>4962,38536=>4963,38541=>4964,38551=>4965,38576=>4966,37015=>4967,37019=>4968,37021=>4969,37017=>4970,37036=>4971,37025=>4972,37044=>4973,37043=>4974,37046=>4975,37050=>4976,37048=>4977,37040=>4978,37071=>4979,37061=>4980,37054=>4981,37072=>4982,37060=>4983,37063=>4984,37075=>4985,37094=>4986,37090=>4987,37084=>4988,37079=>4989,37083=>4990,37099=>4991,37103=>4992,37118=>4993,37124=>4994,37154=>4995,37150=>4996,37155=>4997,37169=>4998,37167=>4999,37177=>5000,37187=>5001,37190=>5002,21005=>5003,22850=>5004,21154=>5005,21164=>5006,21165=>5007,21182=>5008,21759=>5009,21200=>5010,21206=>5011,21232=>5012,21471=>5013,29166=>5014,30669=>5015,12085=>5016,24308=>5016,12048=>5017,20981=>5017,20988=>5018,12223=>5019,39727=>5019,12059=>5020,21430=>5020,24321=>5021,30042=>5022,24047=>5023,22348=>5024,22441=>5025,22433=>5026,22654=>5027,22716=>5028,22725=>5029,22737=>5030,22313=>5031,22316=>5032,22314=>5033,22323=>5034,22329=>5035,22318=>5036,22319=>5037,22364=>5038,22331=>5039,22338=>5040,22377=>5041,22405=>5042,22379=>5043,22406=>5044,22396=>5045,22395=>5046,22376=>5047,22381=>5048,22390=>5049,22387=>5050,22445=>5051,22436=>5052,22412=>5053,22450=>5054,22479=>5055,22439=>5056,22452=>5057,22419=>5058,22432=>5059,22485=>5060,22488=>5061,22490=>5062,22489=>5063,22482=>5064,22456=>5065,22516=>5066,22511=>5067,22520=>5068,22500=>5069,22493=>5070,22539=>5071,22541=>5072,22525=>5073,22509=>5074,22528=>5075,22558=>5076,22553=>5077,22596=>5078,22560=>5079,22629=>5080,22636=>5081,22657=>5082,22665=>5083,22682=>5084,22656=>5085,39336=>5086,40729=>5087,25087=>5088,33401=>5089,33405=>5090,33407=>5091,33423=>5092,33418=>5093,33448=>5094,33412=>5095,33422=>5096,33425=>5097,33431=>5098,33433=>5099,33451=>5100,33464=>5101,33470=>5102,33456=>5103,33480=>5104,33482=>5105,33507=>5106,33432=>5107,33463=>5108,33454=>5109,33483=>5110,33484=>5111,33473=>5112,33449=>5113,33460=>5114,33441=>5115,33450=>5116,33439=>5117,33476=>5118,33486=>5119,33444=>5120,33505=>5121,33545=>5122,33527=>5123,33508=>5124,33551=>5125,33543=>5126,33500=>5127,33524=>5128,33490=>5129,33496=>5130,33548=>5131,33531=>5132,33491=>5133,33553=>5134,33562=>5135,33542=>5136,33556=>5137,33557=>5138,33504=>5139,33493=>5140,33564=>5141,33617=>5142,33627=>5143,33628=>5144,33544=>5145,33682=>5146,33596=>5147,33588=>5148,33585=>5149,33691=>5150,33630=>5151,33583=>5152,33615=>5153,33607=>5154,33603=>5155,33631=>5156,33600=>5157,33559=>5158,33632=>5159,33581=>5160,33594=>5161,33587=>5162,33638=>5163,33637=>5164,33640=>5165,33563=>5166,33641=>5167,33644=>5168,33642=>5169,33645=>5170,33646=>5171,33712=>5172,33656=>5173,33715=>5174,33716=>5175,33696=>5176,33706=>5177,33683=>5178,33692=>5179,33669=>5180,33660=>5181,33718=>5182,33705=>5183,33661=>5184,33720=>5185,33659=>5186,33688=>5187,33694=>5188,33704=>5189,33722=>5190,33724=>5191,33729=>5192,33793=>5193,33765=>5194,33752=>5195,22535=>5196,33816=>5197,33803=>5198,33757=>5199,33789=>5200,33750=>5201,33820=>5202,33848=>5203,33809=>5204,33798=>5205,33748=>5206,33759=>5207,33807=>5208,33795=>5209,33784=>5210,33785=>5211,33770=>5212,33733=>5213,33728=>5214,33830=>5215,33776=>5216,33761=>5217,33884=>5218,33873=>5219,33882=>5220,33881=>5221,33907=>5222,33927=>5223,33928=>5224,33914=>5225,33929=>5226,33912=>5227,33852=>5228,33862=>5229,33897=>5230,33910=>5231,33932=>5232,33934=>5233,33841=>5234,33901=>5235,33985=>5236,33997=>5237,34000=>5238,34022=>5239,33981=>5240,34003=>5241,33994=>5242,33983=>5243,33978=>5244,34016=>5245,33953=>5246,33977=>5247,33972=>5248,33943=>5249,34021=>5250,34019=>5251,34060=>5252,29965=>5253,34104=>5254,34032=>5255,34105=>5256,34079=>5257,34106=>5258,34134=>5259,34107=>5260,34047=>5261,34044=>5262,34137=>5263,34120=>5264,34152=>5265,34148=>5266,34142=>5267,34170=>5268,30626=>5269,34115=>5270,34162=>5271,34171=>5272,34212=>5273,34216=>5274,34183=>5275,34191=>5276,34169=>5277,34222=>5278,34204=>5279,34181=>5280,34233=>5281,34231=>5282,34224=>5283,34259=>5284,34241=>5285,34268=>5286,34303=>5287,34343=>5288,34309=>5289,34345=>5290,34326=>5291,34364=>5292,12086=>5293,24318=>5293,24328=>5294,22844=>5295,22849=>5296,32823=>5297,22869=>5298,22874=>5299,22872=>5300,21263=>5301,12074=>5302,23586=>5302,23589=>5303,23596=>5304,23604=>5305,25164=>5306,25194=>5307,25247=>5308,25275=>5309,25290=>5310,25306=>5311,25303=>5312,25326=>5313,25378=>5314,25334=>5315,25401=>5316,25419=>5317,25411=>5318,25517=>5319,25590=>5320,25457=>5321,25466=>5322,25486=>5323,25524=>5324,25453=>5325,25516=>5326,25482=>5327,25449=>5328,25518=>5329,25532=>5330,25586=>5331,25592=>5332,25568=>5333,25599=>5334,25540=>5335,25566=>5336,25550=>5337,25682=>5338,25542=>5339,25534=>5340,25669=>5341,25665=>5342,25611=>5343,25627=>5344,25632=>5345,25612=>5346,25638=>5347,25633=>5348,25694=>5349,25732=>5350,25709=>5351,25750=>5352,25722=>5353,25783=>5354,25784=>5355,25753=>5356,25786=>5357,25792=>5358,25808=>5359,25815=>5360,25828=>5361,25826=>5362,25865=>5363,25893=>5364,25902=>5365,12087=>5366,24331=>5366,24530=>5367,29977=>5368,24337=>5369,21343=>5370,21489=>5371,21501=>5372,21481=>5373,21480=>5374,21499=>5375,21522=>5376,21526=>5377,21510=>5378,21579=>5379,21586=>5380,21587=>5381,21588=>5382,21590=>5383,21571=>5384,21537=>5385,21591=>5386,21593=>5387,21539=>5388,21554=>5389,21634=>5390,21652=>5391,21623=>5392,21617=>5393,21604=>5394,21658=>5395,21659=>5396,21636=>5397,21622=>5398,21606=>5399,21661=>5400,21712=>5401,21677=>5402,21698=>5403,21684=>5404,21714=>5405,21671=>5406,21670=>5407,21715=>5408,21716=>5409,21618=>5410,21667=>5411,21717=>5412,21691=>5413,21695=>5414,21708=>5415,21721=>5416,21722=>5417,21724=>5418,21673=>5419,21674=>5420,21668=>5421,21725=>5422,21711=>5423,21726=>5424,21787=>5425,21735=>5426,21792=>5427,21757=>5428,21780=>5429,21747=>5430,21794=>5431,21795=>5432,21775=>5433,21777=>5434,21799=>5435,21802=>5436,21863=>5437,21903=>5438,21941=>5439,21833=>5440,21869=>5441,21825=>5442,21845=>5443,21823=>5444,21840=>5445,21820=>5446,21815=>5447,21846=>5448,21877=>5449,21878=>5450,21879=>5451,21811=>5452,21808=>5453,21852=>5454,21899=>5455,21970=>5456,21891=>5457,21937=>5458,21945=>5459,21896=>5460,21889=>5461,21919=>5462,21886=>5463,21974=>5464,21905=>5465,21883=>5466,21983=>5467,21949=>5468,21950=>5469,21908=>5470,21913=>5471,21994=>5472,22007=>5473,21961=>5474,22047=>5475,21969=>5476,21995=>5477,21996=>5478,21972=>5479,21990=>5480,21981=>5481,21956=>5482,21999=>5483,21989=>5484,22002=>5485,22003=>5486,21964=>5487,21965=>5488,21992=>5489,22005=>5490,21988=>5491,36756=>5492,22046=>5493,22024=>5494,22028=>5495,22017=>5496,22052=>5497,22051=>5498,22014=>5499,22016=>5500,22055=>5501,22061=>5502,22104=>5503,22073=>5504,22103=>5505,22060=>5506,22093=>5507,22114=>5508,22105=>5509,22108=>5510,22092=>5511,22100=>5512,22150=>5513,22116=>5514,22129=>5515,22123=>5516,22139=>5517,22140=>5518,22149=>5519,22163=>5520,22191=>5521,22228=>5522,12062=>5523,22231=>5523,22237=>5524,22241=>5525,22261=>5526,22251=>5527,22265=>5528,22271=>5529,22276=>5530,22282=>5531,22281=>5532,22300=>5533,24079=>5534,24089=>5535,24084=>5536,24081=>5537,24113=>5538,24123=>5539,24124=>5540,24119=>5541,24132=>5542,24148=>5543,24155=>5544,24158=>5545,24161=>5546,23692=>5547,23674=>5548,23693=>5549,23696=>5550,23702=>5551,23688=>5552,23704=>5553,23705=>5554,23697=>5555,23706=>5556,23708=>5557,23733=>5558,23714=>5559,23741=>5560,23724=>5561,23723=>5562,23729=>5563,23715=>5564,23745=>5565,23735=>5566,23748=>5567,23762=>5568,23780=>5569,23755=>5570,23781=>5571,23810=>5572,23811=>5573,23847=>5574,23846=>5575,23854=>5576,23844=>5577,23838=>5578,23814=>5579,23835=>5580,23896=>5581,23870=>5582,23860=>5583,23869=>5584,23916=>5585,23899=>5586,23919=>5587,23901=>5588,23915=>5589,23883=>5590,23882=>5591,23913=>5592,23924=>5593,23938=>5594,23961=>5595,23965=>5596,35955=>5597,23991=>5598,24005=>5599,12091=>5600,24435=>5600,24439=>5601,24450=>5602,24455=>5603,24457=>5604,24460=>5605,24469=>5606,24473=>5607,24476=>5608,24488=>5609,24493=>5610,24501=>5611,24508=>5612,34914=>5613,12090=>5614,24417=>5614,29357=>5615,29360=>5616,29364=>5617,29367=>5618,29368=>5619,29379=>5620,29377=>5621,29390=>5622,29389=>5623,29394=>5624,29416=>5625,29423=>5626,29417=>5627,29426=>5628,29428=>5629,29431=>5630,29441=>5631,29427=>5632,29443=>5633,29434=>5634,29435=>5635,29463=>5636,29459=>5637,29473=>5638,29450=>5639,29470=>5640,29469=>5641,29461=>5642,29474=>5643,29497=>5644,29477=>5645,29484=>5646,29496=>5647,29489=>5648,29520=>5649,29517=>5650,29527=>5651,29536=>5652,29548=>5653,29551=>5654,29566=>5655,12167=>5656,33307=>5656,22821=>5657,39143=>5658,22820=>5659,12065=>5660,22786=>5660,39267=>5661,39271=>5662,39272=>5663,39273=>5664,39274=>5665,39275=>5666,39276=>5667,39284=>5668,39287=>5669,39293=>5670,39296=>5671,39300=>5672,39303=>5673,39306=>5674,39309=>5675,39312=>5676,39313=>5677,39315=>5678,39316=>5679,39317=>5680,24192=>5681,24209=>5682,24203=>5683,24214=>5684,24229=>5685,24224=>5686,24249=>5687,24245=>5688,24254=>5689,24243=>5690,36179=>5691,24274=>5692,24273=>5693,24283=>5694,24296=>5695,24298=>5696,33210=>5697,24516=>5698,24521=>5699,24534=>5700,24527=>5701,24579=>5702,24558=>5703,24580=>5704,24545=>5705,24548=>5706,24574=>5707,24581=>5708,24582=>5709,24554=>5710,24557=>5711,24568=>5712,24601=>5713,24629=>5714,24614=>5715,24603=>5716,24591=>5717,24589=>5718,24617=>5719,24619=>5720,24586=>5721,24639=>5722,24609=>5723,24696=>5724,24697=>5725,24699=>5726,24698=>5727,24642=>5728,24682=>5729,24701=>5730,24726=>5731,24730=>5732,24749=>5733,24733=>5734,24707=>5735,24722=>5736,24716=>5737,24731=>5738,24812=>5739,24763=>5740,24753=>5741,24797=>5742,24792=>5743,24774=>5744,24794=>5745,24756=>5746,24864=>5747,24870=>5748,24853=>5749,24867=>5750,24820=>5751,24832=>5752,24846=>5753,24875=>5754,24906=>5755,24949=>5756,25004=>5757,24980=>5758,24999=>5759,25015=>5760,25044=>5761,25077=>5762,24541=>5763,38579=>5764,38377=>5765,38379=>5766,38385=>5767,38387=>5768,38389=>5769,38390=>5770,38396=>5771,38398=>5772,38403=>5773,38404=>5774,38406=>5775,38408=>5776,38410=>5777,38411=>5778,38412=>5779,38413=>5780,38415=>5781,38418=>5782,38421=>5783,38422=>5784,38423=>5785,38425=>5786,38426=>5787,20012=>5788,12121=>5789,29247=>5789,25109=>5790,27701=>5791,27732=>5792,27740=>5793,27722=>5794,27811=>5795,27781=>5796,27792=>5797,27796=>5798,27788=>5799,27752=>5800,27753=>5801,27764=>5802,27766=>5803,27782=>5804,27817=>5805,27856=>5806,27860=>5807,27821=>5808,27895=>5809,27896=>5810,27889=>5811,27863=>5812,27826=>5813,27872=>5814,27862=>5815,27898=>5816,27883=>5817,27886=>5818,27825=>5819,27859=>5820,27887=>5821,27902=>5822,27961=>5823,27943=>5824,27916=>5825,27971=>5826,27976=>5827,27911=>5828,27908=>5829,27929=>5830,27918=>5831,27947=>5832,27981=>5833,27950=>5834,27957=>5835,27930=>5836,27983=>5837,27986=>5838,27988=>5839,27955=>5840,28049=>5841,28015=>5842,28062=>5843,28064=>5844,27998=>5845,28051=>5846,28052=>5847,27996=>5848,28000=>5849,28028=>5850,28003=>5851,28186=>5852,28103=>5853,28101=>5854,28126=>5855,28174=>5856,28095=>5857,28128=>5858,28177=>5859,28134=>5860,28125=>5861,28121=>5862,28182=>5863,28075=>5864,28172=>5865,28078=>5866,28203=>5867,28270=>5868,28238=>5869,28267=>5870,28338=>5871,28255=>5872,28294=>5873,28243=>5874,28244=>5875,28210=>5876,28197=>5877,28228=>5878,28383=>5879,28337=>5880,28312=>5881,28384=>5882,28461=>5883,28386=>5884,28325=>5885,28327=>5886,28349=>5887,28347=>5888,28343=>5889,28375=>5890,28340=>5891,28367=>5892,28303=>5893,28354=>5894,28319=>5895,28514=>5896,28486=>5897,28487=>5898,28452=>5899,28437=>5900,28409=>5901,28463=>5902,28470=>5903,28491=>5904,28532=>5905,28458=>5906,28425=>5907,28457=>5908,28553=>5909,28557=>5910,28556=>5911,28536=>5912,28530=>5913,28540=>5914,28538=>5915,28625=>5916,28617=>5917,28583=>5918,28601=>5919,28598=>5920,28610=>5921,28641=>5922,28654=>5923,28638=>5924,28640=>5925,28655=>5926,28698=>5927,28707=>5928,28699=>5929,28729=>5930,28725=>5931,28751=>5932,28766=>5933,12071=>5934,23424=>5934,23428=>5935,23445=>5936,23443=>5937,23461=>5938,23480=>5939,29999=>5940,39582=>5941,25652=>5942,23524=>5943,23534=>5944,35120=>5945,23536=>5946,36423=>5947,35591=>5948,36790=>5949,36819=>5950,36821=>5951,36837=>5952,36846=>5953,36836=>5954,36841=>5955,36838=>5956,36851=>5957,36840=>5958,36869=>5959,36868=>5960,36875=>5961,36902=>5962,36881=>5963,36877=>5964,36886=>5965,36897=>5966,36917=>5967,36918=>5968,36909=>5969,36911=>5970,36932=>5971,36945=>5972,36946=>5973,36944=>5974,36968=>5975,36952=>5976,36962=>5977,36955=>5978,26297=>5979,36980=>5980,36989=>5981,36994=>5982,37000=>5983,36995=>5984,37003=>5985,12089=>5986,24400=>5986,24407=>5987,24406=>5988,24408=>5989,23611=>5990,21675=>5991,23632=>5992,23641=>5993,23409=>5994,23651=>5995,23654=>5996,32700=>5997,24362=>5998,24361=>5999,24365=>6000,33396=>6001,24380=>6002,39739=>6003,12076=>6004,23662=>6004,22913=>6005,22915=>6006,22925=>6007,22953=>6008,22954=>6009,22947=>6010,22935=>6011,22986=>6012,22955=>6013,22942=>6014,22948=>6015,22994=>6016,22962=>6017,22959=>6018,22999=>6019,22974=>6020,23045=>6021,23046=>6022,23005=>6023,23048=>6024,23011=>6025,23000=>6026,23033=>6027,23052=>6028,23049=>6029,23090=>6030,23092=>6031,23057=>6032,23075=>6033,23059=>6034,23104=>6035,23143=>6036,23114=>6037,23125=>6038,23100=>6039,23138=>6040,23157=>6041,33004=>6042,23210=>6043,23195=>6044,23159=>6045,23162=>6046,23230=>6047,23275=>6048,23218=>6049,23250=>6050,23252=>6051,23224=>6052,23264=>6053,23267=>6054,23281=>6055,23254=>6056,23270=>6057,23256=>6058,23260=>6059,23305=>6060,23319=>6061,23318=>6062,23346=>6063,23351=>6064,23360=>6065,23573=>6066,23580=>6067,23386=>6068,23397=>6069,23411=>6070,23377=>6071,23379=>6072,23394=>6073,39541=>6074,39543=>6075,39544=>6076,39546=>6077,39551=>6078,39549=>6079,39552=>6080,39553=>6081,39557=>6082,39560=>6083,39562=>6084,39568=>6085,39570=>6086,39571=>6087,39574=>6088,39576=>6089,39579=>6090,39580=>6091,39581=>6092,39583=>6093,39584=>6094,39586=>6095,39587=>6096,39589=>6097,39591=>6098,32415=>6099,32417=>6100,32419=>6101,32421=>6102,32424=>6103,32425=>6104,32429=>6105,32432=>6106,32446=>6107,32448=>6108,32449=>6109,32450=>6110,32457=>6111,32459=>6112,32460=>6113,32464=>6114,32468=>6115,32471=>6116,32475=>6117,32480=>6118,32481=>6119,32488=>6120,32491=>6121,32494=>6122,32495=>6123,32497=>6124,32498=>6125,32525=>6126,32502=>6127,32506=>6128,32507=>6129,32510=>6130,32513=>6131,32514=>6132,32515=>6133,32519=>6134,32520=>6135,32523=>6136,32524=>6137,32527=>6138,32529=>6139,32530=>6140,32535=>6141,32537=>6142,32540=>6143,32539=>6144,32543=>6145,32545=>6146,32546=>6147,32547=>6148,32548=>6149,32549=>6150,32550=>6151,32551=>6152,32554=>6153,32555=>6154,32556=>6155,32557=>6156,32559=>6157,32560=>6158,32561=>6159,32562=>6160,32563=>6161,32565=>6162,12083=>6163,24186=>6163,30079=>6164,12078=>6165,24027=>6165,30014=>6166,37013=>6167,29582=>6168,29585=>6169,29614=>6170,29602=>6171,29599=>6172,29647=>6173,29634=>6174,29649=>6175,29623=>6176,29619=>6177,29632=>6178,29641=>6179,29640=>6180,29669=>6181,29657=>6182,39036=>6183,29706=>6184,29673=>6185,29671=>6186,29662=>6187,29626=>6188,29682=>6189,29711=>6190,29738=>6191,29787=>6192,29734=>6193,29733=>6194,29736=>6195,29744=>6196,29742=>6197,29740=>6198,29723=>6199,29722=>6200,29761=>6201,29788=>6202,29783=>6203,29781=>6204,29785=>6205,29815=>6206,29805=>6207,29822=>6208,29852=>6209,29838=>6210,29824=>6211,29825=>6212,29831=>6213,29835=>6214,29854=>6215,29864=>6216,29865=>6217,29840=>6218,29863=>6219,29906=>6220,29882=>6221,38890=>6222,38891=>6223,38892=>6224,26444=>6225,26451=>6226,26462=>6227,26440=>6228,26473=>6229,26533=>6230,26503=>6231,26474=>6232,26483=>6233,26520=>6234,26535=>6235,26485=>6236,26536=>6237,26526=>6238,26541=>6239,26507=>6240,26487=>6241,26492=>6242,26608=>6243,26633=>6244,26584=>6245,26634=>6246,26601=>6247,26544=>6248,26636=>6249,26585=>6250,26549=>6251,26586=>6252,26547=>6253,26589=>6254,26624=>6255,26563=>6256,26552=>6257,26594=>6258,26638=>6259,26561=>6260,26621=>6261,26674=>6262,26675=>6263,26720=>6264,26721=>6265,26702=>6266,26722=>6267,26692=>6268,26724=>6269,26755=>6270,26653=>6271,26709=>6272,26726=>6273,26689=>6274,26727=>6275,26688=>6276,26686=>6277,26698=>6278,26697=>6279,26665=>6280,26805=>6281,26767=>6282,26740=>6283,26743=>6284,26771=>6285,26731=>6286,26818=>6287,26990=>6288,26876=>6289,26911=>6290,26912=>6291,26873=>6292,26916=>6293,26864=>6294,26891=>6295,26881=>6296,26967=>6297,26851=>6298,26896=>6299,26993=>6300,26937=>6301,26976=>6302,26946=>6303,26973=>6304,27012=>6305,26987=>6306,27008=>6307,27032=>6308,27000=>6309,26932=>6310,27084=>6311,27015=>6312,27016=>6313,27086=>6314,27017=>6315,26982=>6316,26979=>6317,27001=>6318,27035=>6319,27047=>6320,27067=>6321,27051=>6322,27053=>6323,27092=>6324,27057=>6325,27073=>6326,27082=>6327,27103=>6328,27029=>6329,27104=>6330,27021=>6331,27135=>6332,27183=>6333,27117=>6334,27159=>6335,27160=>6336,27237=>6337,27122=>6338,27204=>6339,27198=>6340,27296=>6341,27216=>6342,27227=>6343,27189=>6344,27278=>6345,27257=>6346,27197=>6347,27176=>6348,27224=>6349,27260=>6350,27281=>6351,27280=>6352,27305=>6353,27287=>6354,27307=>6355,29495=>6356,29522=>6357,27521=>6358,27522=>6359,27527=>6360,27524=>6361,27538=>6362,27539=>6363,27533=>6364,27546=>6365,27547=>6366,27553=>6367,27562=>6368,36715=>6369,36717=>6370,36721=>6371,36722=>6372,36723=>6373,36725=>6374,36726=>6375,36728=>6376,36727=>6377,36729=>6378,36730=>6379,36732=>6380,36734=>6381,36737=>6382,36738=>6383,36740=>6384,36743=>6385,36747=>6386,36749=>6387,36750=>6388,36751=>6389,36760=>6390,36762=>6391,36558=>6392,25099=>6393,25111=>6394,25115=>6395,25119=>6396,25122=>6397,25121=>6398,25125=>6399,25124=>6400,25132=>6401,33255=>6402,29935=>6403,29940=>6404,29951=>6405,29967=>6406,29969=>6407,29971=>6408,12097=>6409,25908=>6409,26094=>6410,26095=>6411,26096=>6412,26122=>6413,26137=>6414,26482=>6415,26115=>6416,26133=>6417,26112=>6418,28805=>6419,26359=>6420,26141=>6421,26164=>6422,26161=>6423,26166=>6424,26165=>6425,32774=>6426,26207=>6427,26196=>6428,26177=>6429,26191=>6430,26198=>6431,26209=>6432,26199=>6433,26231=>6434,26244=>6435,26252=>6436,26279=>6437,26269=>6438,26302=>6439,26331=>6440,26332=>6441,26342=>6442,26345=>6443,36146=>6444,36147=>6445,36150=>6446,36155=>6447,36157=>6448,36160=>6449,36165=>6450,36166=>6451,36168=>6452,36169=>6453,36167=>6454,36173=>6455,36181=>6456,36185=>6457,35271=>6458,35274=>6459,35275=>6460,35276=>6461,35278=>6462,35279=>6463,35280=>6464,35281=>6465,29294=>6466,29343=>6467,29277=>6468,29286=>6469,29295=>6470,29310=>6471,29311=>6472,29316=>6473,29323=>6474,29325=>6475,29327=>6476,29330=>6477,25352=>6478,25394=>6479,25520=>6480,25663=>6481,25816=>6482,32772=>6483,27626=>6484,27635=>6485,27645=>6486,27637=>6487,27641=>6488,27653=>6489,27655=>6490,27654=>6491,27661=>6492,27669=>6493,27672=>6494,27673=>6495,27674=>6496,27681=>6497,27689=>6498,27684=>6499,27690=>6500,27698=>6501,25909=>6502,25941=>6503,25963=>6504,29261=>6505,29266=>6506,29270=>6507,29232=>6508,34402=>6509,21014=>6510,32927=>6511,32924=>6512,32915=>6513,32956=>6514,26378=>6515,32957=>6516,32945=>6517,32939=>6518,32941=>6519,32948=>6520,32951=>6521,32999=>6522,33000=>6523,33001=>6524,33002=>6525,32987=>6526,32962=>6527,32964=>6528,32985=>6529,32973=>6530,32983=>6531,26384=>6532,32989=>6533,33003=>6534,33009=>6535,33012=>6536,33005=>6537,33037=>6538,33038=>6539,33010=>6540,33020=>6541,26389=>6542,33042=>6543,35930=>6544,33078=>6545,33054=>6546,33068=>6547,33048=>6548,33074=>6549,33096=>6550,33100=>6551,33107=>6552,33140=>6553,33113=>6554,33114=>6555,33137=>6556,33120=>6557,33129=>6558,33148=>6559,33149=>6560,33133=>6561,33127=>6562,22605=>6563,23221=>6564,33160=>6565,33154=>6566,33169=>6567,28373=>6568,33187=>6569,33194=>6570,33228=>6571,26406=>6572,33226=>6573,33211=>6574,33217=>6575,33190=>6576,27428=>6577,27447=>6578,27449=>6579,27459=>6580,27462=>6581,27481=>6582,39121=>6583,39122=>6584,39123=>6585,39125=>6586,39129=>6587,39130=>6588,12110=>6589,27571=>6589,24384=>6590,27586=>6591,35315=>6592,26000=>6593,40785=>6594,26003=>6595,26044=>6596,26054=>6597,26052=>6598,26051=>6599,26060=>6600,26062=>6601,26066=>6602,26070=>6603,28800=>6604,28828=>6605,28822=>6606,28829=>6607,28859=>6608,28864=>6609,28855=>6610,28843=>6611,28849=>6612,28904=>6613,28874=>6614,28944=>6615,28947=>6616,28950=>6617,28975=>6618,28977=>6619,29043=>6620,29020=>6621,29032=>6622,28997=>6623,29042=>6624,29002=>6625,29048=>6626,29050=>6627,29080=>6628,29107=>6629,29109=>6630,29096=>6631,29088=>6632,29152=>6633,29140=>6634,29159=>6635,29177=>6636,29213=>6637,29224=>6638,28780=>6639,28952=>6640,29030=>6641,29113=>6642,25150=>6643,25149=>6644,25155=>6645,25160=>6646,25161=>6647,31035=>6648,31040=>6649,31046=>6650,31049=>6651,31067=>6652,31068=>6653,31059=>6654,31066=>6655,31074=>6656,31063=>6657,31072=>6658,31087=>6659,31079=>6660,31098=>6661,31109=>6662,31114=>6663,31130=>6664,31143=>6665,31155=>6666,24529=>6667,24528=>6668,24636=>6669,24669=>6670,24666=>6671,24679=>6672,24641=>6673,24665=>6674,24675=>6675,24747=>6676,24838=>6677,24845=>6678,24925=>6679,25001=>6680,24989=>6681,25035=>6682,25041=>6683,25094=>6684,32896=>6685,12160=>6686,32895=>6686,27795=>6687,27894=>6688,28156=>6689,30710=>6690,30712=>6691,30720=>6692,30729=>6693,30743=>6694,30744=>6695,30737=>6696,26027=>6697,30765=>6698,30748=>6699,30749=>6700,30777=>6701,30778=>6702,30779=>6703,30751=>6704,30780=>6705,30757=>6706,30764=>6707,30755=>6708,30761=>6709,30798=>6710,30829=>6711,30806=>6712,30807=>6713,30758=>6714,30800=>6715,30791=>6716,30796=>6717,30826=>6718,30875=>6719,30867=>6720,30874=>6721,30855=>6722,30876=>6723,30881=>6724,30883=>6725,30898=>6726,30905=>6727,30885=>6728,30932=>6729,30937=>6730,30921=>6731,30956=>6732,30962=>6733,30981=>6734,30964=>6735,30995=>6736,31012=>6737,31006=>6738,31028=>6739,40859=>6740,12235=>6741,40697=>6741,40699=>6742,40700=>6743,30449=>6744,30468=>6745,30477=>6746,30457=>6747,30471=>6748,30472=>6749,30490=>6750,30498=>6751,30489=>6752,30509=>6753,30502=>6754,30517=>6755,30520=>6756,30544=>6757,30545=>6758,30535=>6759,30531=>6760,30554=>6761,30568=>6762,30562=>6763,30565=>6764,30591=>6765,30605=>6766,30589=>6767,30592=>6768,30604=>6769,30609=>6770,30623=>6771,30624=>6772,30640=>6773,30645=>6774,30653=>6775,30010=>6776,30016=>6777,30030=>6778,30027=>6779,30024=>6780,30043=>6781,30066=>6782,30073=>6783,30083=>6784,32600=>6785,32609=>6786,32607=>6787,35400=>6788,32616=>6789,32628=>6790,32625=>6791,32633=>6792,32641=>6793,32638=>6794,30413=>6795,30437=>6796,34866=>6797,38021=>6798,38022=>6799,38023=>6800,38027=>6801,38026=>6802,38028=>6803,38029=>6804,38031=>6805,38032=>6806,38036=>6807,38039=>6808,38037=>6809,38042=>6810,38043=>6811,38044=>6812,38051=>6813,38052=>6814,38059=>6815,38058=>6816,38061=>6817,38060=>6818,38063=>6819,38064=>6820,38066=>6821,38068=>6822,38070=>6823,38071=>6824,38072=>6825,38073=>6826,38074=>6827,38076=>6828,38077=>6829,38079=>6830,38084=>6831,38088=>6832,38089=>6833,38090=>6834,38091=>6835,38092=>6836,38093=>6837,38094=>6838,38096=>6839,38097=>6840,38098=>6841,38101=>6842,38102=>6843,38103=>6844,38105=>6845,38104=>6846,38107=>6847,38110=>6848,38111=>6849,38112=>6850,38114=>6851,38116=>6852,38117=>6853,38119=>6854,38120=>6855,38122=>6856,38121=>6857,38123=>6858,38126=>6859,38127=>6860,38131=>6861,38132=>6862,38133=>6863,38135=>6864,38137=>6865,38140=>6866,38141=>6867,38143=>6868,38147=>6869,38146=>6870,38150=>6871,38151=>6872,38153=>6873,38154=>6874,38157=>6875,38158=>6876,38159=>6877,38162=>6878,38163=>6879,38164=>6880,38165=>6881,38166=>6882,38168=>6883,38171=>6884,38173=>6885,38174=>6886,38175=>6887,38178=>6888,38186=>6889,38187=>6890,38185=>6891,38188=>6892,38193=>6893,38194=>6894,38196=>6895,38198=>6896,38199=>6897,38200=>6898,38204=>6899,38206=>6900,38207=>6901,38210=>6902,38197=>6903,38212=>6904,38213=>6905,38214=>6906,38217=>6907,38220=>6908,38222=>6909,38223=>6910,38226=>6911,38227=>6912,38228=>6913,38230=>6914,38231=>6915,38232=>6916,38233=>6917,38235=>6918,38238=>6919,38239=>6920,38237=>6921,38241=>6922,38242=>6923,38244=>6924,38245=>6925,38246=>6926,38247=>6927,38248=>6928,38249=>6929,38250=>6930,38251=>6931,38252=>6932,38255=>6933,38257=>6934,38258=>6935,38259=>6936,38202=>6937,30695=>6938,30700=>6939,38601=>6940,31189=>6941,31213=>6942,31203=>6943,31211=>6944,31238=>6945,23879=>6946,31235=>6947,31234=>6948,31262=>6949,31252=>6950,31289=>6951,31287=>6952,31313=>6953,40655=>6954,39333=>6955,31344=>6956,30344=>6957,30350=>6958,30355=>6959,30361=>6960,30372=>6961,29918=>6962,29920=>6963,29996=>6964,40480=>6965,40482=>6966,40488=>6967,40489=>6968,40490=>6969,40491=>6970,40492=>6971,40498=>6972,40497=>6973,40502=>6974,40504=>6975,40503=>6976,40505=>6977,40506=>6978,40510=>6979,40513=>6980,40514=>6981,40516=>6982,40518=>6983,40519=>6984,40520=>6985,40521=>6986,40523=>6987,40524=>6988,40526=>6989,40529=>6990,40533=>6991,40535=>6992,40538=>6993,40539=>6994,40540=>6995,40542=>6996,40547=>6997,40550=>6998,40551=>6999,40552=>7000,40553=>7001,40554=>7002,40555=>7003,40556=>7004,40561=>7005,40557=>7006,40563=>7007,12135=>7008,30098=>7008,30100=>7009,30102=>7010,30112=>7011,30109=>7012,30124=>7013,30115=>7014,30131=>7015,30132=>7016,30136=>7017,30148=>7018,30129=>7019,30128=>7020,30147=>7021,30146=>7022,30166=>7023,30157=>7024,30179=>7025,30184=>7026,30182=>7027,30180=>7028,30187=>7029,30183=>7030,30211=>7031,30193=>7032,30204=>7033,30207=>7034,30224=>7035,30208=>7036,30213=>7037,30220=>7038,30231=>7039,30218=>7040,30245=>7041,30232=>7042,30229=>7043,30233=>7044,30235=>7045,30268=>7046,30242=>7047,30240=>7048,30272=>7049,30253=>7050,30256=>7051,30271=>7052,30261=>7053,30275=>7054,30270=>7055,30259=>7056,30285=>7057,30302=>7058,30292=>7059,30300=>7060,30294=>7061,30315=>7062,30319=>7063,32714=>7064,31462=>7065,31352=>7066,31353=>7067,31360=>7068,31366=>7069,31368=>7070,31381=>7071,31398=>7072,31392=>7073,31404=>7074,31400=>7075,31405=>7076,31411=>7077,34916=>7078,34921=>7079,34930=>7080,34941=>7081,34943=>7082,34946=>7083,34978=>7084,35014=>7085,34999=>7086,35004=>7087,35017=>7088,35042=>7089,35022=>7090,35043=>7091,35045=>7092,35057=>7093,35098=>7094,35068=>7095,35048=>7096,35070=>7097,35056=>7098,35105=>7099,35097=>7100,35091=>7101,35099=>7102,35082=>7103,35124=>7104,35115=>7105,35126=>7106,35137=>7107,35174=>7108,35195=>7109,12134=>7110,30091=>7110,32997=>7111,30386=>7112,30388=>7113,30684=>7114,12158=>7115,32786=>7115,32788=>7116,32790=>7117,32796=>7118,32800=>7119,32802=>7120,32805=>7121,32806=>7122,32807=>7123,32809=>7124,32808=>7125,32817=>7126,32779=>7127,32821=>7128,32835=>7129,32838=>7130,32845=>7131,32850=>7132,32873=>7133,32881=>7134,35203=>7135,39032=>7136,39040=>7137,39043=>7138,39049=>7139,39052=>7140,39053=>7141,39055=>7142,39060=>7143,39066=>7144,39067=>7145,39070=>7146,39071=>7147,39073=>7148,39074=>7149,39077=>7150,39078=>7151,12172=>7152,34381=>7152,34388=>7153,34412=>7154,34414=>7155,34431=>7156,34426=>7157,34428=>7158,34427=>7159,34472=>7160,34445=>7161,34443=>7162,34476=>7163,34461=>7164,34471=>7165,34467=>7166,34474=>7167,34451=>7168,34473=>7169,34486=>7170,34500=>7171,34485=>7172,34510=>7173,34480=>7174,34490=>7175,34481=>7176,34479=>7177,34505=>7178,34511=>7179,34484=>7180,34537=>7181,34545=>7182,34546=>7183,34541=>7184,34547=>7185,34512=>7186,34579=>7187,34526=>7188,34548=>7189,34527=>7190,34520=>7191,34513=>7192,34563=>7193,34567=>7194,34552=>7195,34568=>7196,34570=>7197,34573=>7198,34569=>7199,34595=>7200,34619=>7201,34590=>7202,34597=>7203,34606=>7204,34586=>7205,34622=>7206,34632=>7207,34612=>7208,34609=>7209,34601=>7210,34615=>7211,34623=>7212,34690=>7213,34594=>7214,34685=>7215,34686=>7216,34683=>7217,34656=>7218,34672=>7219,34636=>7220,34670=>7221,34699=>7222,34643=>7223,34659=>7224,34684=>7225,34660=>7226,34649=>7227,34661=>7228,34707=>7229,34735=>7230,34728=>7231,34770=>7232,34758=>7233,34696=>7234,34693=>7235,34733=>7236,34711=>7237,34691=>7238,34731=>7239,34789=>7240,34732=>7241,34741=>7242,34739=>7243,34763=>7244,34771=>7245,34749=>7246,34769=>7247,34752=>7248,34762=>7249,34779=>7250,34794=>7251,34784=>7252,34798=>7253,34838=>7254,34835=>7255,34814=>7256,34826=>7257,34843=>7258,34849=>7259,34873=>7260,34876=>7261,12152=>7262,32566=>7262,32578=>7263,32580=>7264,32581=>7265,33296=>7266,31482=>7267,31485=>7268,31496=>7269,31491=>7270,31492=>7271,31509=>7272,31498=>7273,31531=>7274,31503=>7275,31559=>7276,31544=>7277,31530=>7278,31513=>7279,31534=>7280,31537=>7281,31520=>7282,31525=>7283,31524=>7284,31539=>7285,31550=>7286,31518=>7287,31576=>7288,31578=>7289,31557=>7290,31605=>7291,31564=>7292,31581=>7293,31584=>7294,31598=>7295,31611=>7296,31586=>7297,31602=>7298,31601=>7299,31632=>7300,31654=>7301,31655=>7302,31672=>7303,31660=>7304,31645=>7305,31656=>7306,31621=>7307,31658=>7308,31644=>7309,31650=>7310,31659=>7311,31668=>7312,31697=>7313,31681=>7314,31692=>7315,31709=>7316,31706=>7317,31717=>7318,31718=>7319,31722=>7320,31756=>7321,31742=>7322,31740=>7323,31759=>7324,31766=>7325,31755=>7326,31775=>7327,31786=>7328,31782=>7329,31800=>7330,31809=>7331,31808=>7332,33278=>7333,33281=>7334,33282=>7335,33284=>7336,33260=>7337,34884=>7338,33313=>7339,33314=>7340,33315=>7341,33325=>7342,33327=>7343,33320=>7344,33323=>7345,33336=>7346,33339=>7347,33331=>7348,33332=>7349,33342=>7350,33348=>7351,33353=>7352,33355=>7353,33359=>7354,33370=>7355,33375=>7356,33384=>7357,34942=>7358,34949=>7359,34952=>7360,35032=>7361,35039=>7362,35166=>7363,32669=>7364,32671=>7365,32679=>7366,32687=>7367,32688=>7368,32690=>7369,31868=>7370,25929=>7371,31889=>7372,31901=>7373,31900=>7374,31902=>7375,31906=>7376,31922=>7377,31932=>7378,31933=>7379,31937=>7380,31943=>7381,31948=>7382,31949=>7383,31944=>7384,31941=>7385,31959=>7386,31976=>7387,12169=>7388,33390=>7388,26280=>7389,32703=>7390,32718=>7391,32725=>7392,32741=>7393,32737=>7394,32742=>7395,32745=>7396,32750=>7397,32755=>7398,12151=>7399,31992=>7399,32119=>7400,32166=>7401,32174=>7402,32327=>7403,32411=>7404,40632=>7405,40628=>7406,36211=>7407,36228=>7408,36244=>7409,36241=>7410,36273=>7411,36199=>7412,36205=>7413,35911=>7414,35913=>7415,37194=>7416,37200=>7417,37198=>7418,37199=>7419,37220=>7420,37218=>7421,37217=>7422,37232=>7423,37225=>7424,37231=>7425,37245=>7426,37246=>7427,37234=>7428,37236=>7429,37241=>7430,37260=>7431,37253=>7432,37264=>7433,37261=>7434,37265=>7435,37282=>7436,37283=>7437,37290=>7438,37293=>7439,37294=>7440,37295=>7441,37301=>7442,37300=>7443,37306=>7444,12183=>7445,35925=>7445,40574=>7446,36280=>7447,36331=>7448,36357=>7449,36441=>7450,36457=>7451,36277=>7452,36287=>7453,36284=>7454,36282=>7455,36292=>7456,36310=>7457,36311=>7458,36314=>7459,36318=>7460,36302=>7461,36303=>7462,36315=>7463,36294=>7464,36332=>7465,36343=>7466,36344=>7467,36323=>7468,36345=>7469,36347=>7470,36324=>7471,36361=>7472,36349=>7473,36372=>7474,36381=>7475,36383=>7476,36396=>7477,36398=>7478,36387=>7479,36399=>7480,36410=>7481,36416=>7482,36409=>7483,36405=>7484,36413=>7485,36401=>7486,36425=>7487,36417=>7488,36418=>7489,36433=>7490,36434=>7491,36426=>7492,36464=>7493,36470=>7494,36476=>7495,36463=>7496,36468=>7497,36485=>7498,36495=>7499,36500=>7500,36496=>7501,36508=>7502,36510=>7503,12184=>7504,35960=>7504,35970=>7505,35978=>7506,35973=>7507,35992=>7508,35988=>7509,26011=>7510,35286=>7511,35294=>7512,35290=>7513,35292=>7514,35301=>7515,35307=>7516,35311=>7517,35390=>7518,35622=>7519,38739=>7520,38633=>7521,38643=>7522,38639=>7523,38662=>7524,38657=>7525,38664=>7526,38671=>7527,38670=>7528,38698=>7529,38701=>7530,38704=>7531,38718=>7532,40832=>7533,40835=>7534,40837=>7535,40838=>7536,40839=>7537,40840=>7538,40841=>7539,40842=>7540,40844=>7541,40702=>7542,40715=>7543,40717=>7544,12203=>7545,38585=>7545,38588=>7546,38589=>7547,38606=>7548,38610=>7549,30655=>7550,38624=>7551,37518=>7552,37550=>7553,37576=>7554,37694=>7555,37738=>7556,37834=>7557,37775=>7558,37950=>7559,37995=>7560,40063=>7561,40066=>7562,40069=>7563,40070=>7564,40071=>7565,40072=>7566,31267=>7567,40075=>7568,40078=>7569,40080=>7570,40081=>7571,40082=>7572,40084=>7573,40085=>7574,40090=>7575,40091=>7576,40094=>7577,40095=>7578,40096=>7579,40097=>7580,40098=>7581,40099=>7582,40101=>7583,40102=>7584,40103=>7585,40104=>7586,40105=>7587,40107=>7588,40109=>7589,40110=>7590,40112=>7591,40113=>7592,40114=>7593,40115=>7594,40116=>7595,40117=>7596,40118=>7597,40119=>7598,40122=>7599,40123=>7600,40124=>7601,40125=>7602,40132=>7603,40133=>7604,40134=>7605,40135=>7606,40138=>7607,40139=>7608,40140=>7609,40141=>7610,40142=>7611,40143=>7612,40144=>7613,40147=>7614,40148=>7615,40149=>7616,40151=>7617,40152=>7618,40153=>7619,40156=>7620,40157=>7621,40159=>7622,40162=>7623,38780=>7624,38789=>7625,38801=>7626,38802=>7627,38804=>7628,38831=>7629,38827=>7630,38819=>7631,38834=>7632,38836=>7633,39601=>7634,39600=>7635,39607=>7636,40536=>7637,39606=>7638,39610=>7639,39612=>7640,39617=>7641,39616=>7642,39621=>7643,39618=>7644,39627=>7645,39628=>7646,39633=>7647,39749=>7648,39747=>7649,39751=>7650,39753=>7651,39752=>7652,39757=>7653,39761=>7654,39144=>7655,39181=>7656,39214=>7657,39253=>7658,39252=>7659,12221=>7660,39647=>7660,39649=>7661,39654=>7662,39663=>7663,39659=>7664,39675=>7665,39661=>7666,39673=>7667,39688=>7668,39695=>7669,39699=>7670,39711=>7671,39715=>7672,40637=>7673,40638=>7674,32315=>7675,40578=>7676,40583=>7677,40584=>7678,40587=>7679,40594=>7680,37846=>7681,40605=>7682,40607=>7683,40667=>7684,40668=>7685,40669=>7686,40672=>7687,40671=>7688,40674=>7689,40681=>7690,40679=>7691,40677=>7692,40682=>7693,40687=>7694,40738=>7695,40748=>7696,40751=>7697,40761=>7698,40759=>7699,40765=>7700,40766=>7701,40772=>7702,12295=>7703,30362=>7717,34297=>7718,31001=>7719,24859=>7720,39599=>7721,35158=>7722,22761=>7723,32631=>7724,25850=>7725,25943=>7726,38930=>7727,36774=>7728,32070=>7729,24171=>7730,32129=>7731,37770=>7732,35607=>7733,39165=>7734,23542=>7735,22577=>7736,39825=>7737,36649=>7738,12185=>7739,35997=>7739,37575=>7740,29437=>7741,20633=>7742,24970=>7743,32179=>7744,31558=>7745,30050=>7746,25987=>7747,24163=>7748,38281=>7749,37002=>7750,32232=>7751,36022=>7752,35722=>7753,36783=>7754,36782=>7755,27161=>7756,40009=>7757,30303=>7758,28693=>7759,28657=>7760,36051=>7761,25839=>7762,39173=>7763,25765=>7764,37474=>7765,37457=>7766,39361=>7767,35036=>7768,36001=>7769,21443=>7770,34870=>7771,27544=>7772,24922=>7773,24920=>7774,29158=>7775,33980=>7776,33369=>7777,20489=>7778,28356=>7779,21408=>7780,20596=>7781,28204=>7782,23652=>7783,35435=>7784,25881=>7785,25723=>7786,34796=>7787,39262=>7788,35730=>7789,32399=>7790,37855=>7791,29987=>7792,38369=>7793,39019=>7794,22580=>7795,22039=>7796,12199=>7797,38263=>7797,20767=>7798,33144=>7799,24288=>7800,26274=>7801,37396=>7802,12190=>7803,36554=>7803,24505=>7804,22645=>7805,38515=>7806,35183=>7807,31281=>7808,25074=>7809,35488=>7810,39425=>7811,36978=>7812,39347=>7813,12242=>7814,40786=>7814,29118=>7815,34909=>7816,34802=>7817,23541=>7818,30087=>7819,36490=>7820,31820=>7821,32162=>7822,37276=>7823,37604=>7824,38619=>7825,30990=>7826,20786=>7827,35320=>7828,34389=>7829,20659=>7830,30241=>7831,38358=>7832,21109=>7833,37656=>7834,32020=>7835,32189=>7836,36781=>7837,35422=>7838,36060=>7839,32880=>7840,24478=>7841,21474=>7842,36517=>7843,31428=>7844,37679=>7845,36948=>7846,24118=>7847,36024=>7848,25812=>7849,21934=>7850,37170=>7851,25763=>7852,33213=>7853,24986=>7854,35477=>7855,24392=>7856,30070=>7857,25803=>7858,40680=>7859,34153=>7860,27284=>7861,25623=>7862,23798=>7863,31153=>7864,23566=>7865,29128=>7866,37159=>7867,25973=>7868,28364=>7869,36958=>7870,32224=>7871,39003=>7872,40670=>7873,22666=>7874,38651=>7875,28593=>7876,37347=>7877,35519=>7878,35548=>7879,37336=>7880,38914=>7881,37664=>7882,35330=>7883,26481=>7884,21205=>7885,26847=>7886,20941=>7887,12222=>7888,39717=>7888,29346=>7889,29544=>7890,35712=>7891,36077=>7892,37709=>7893,37723=>7894,26039=>7895,32222=>7896,38538=>7897,23565=>7898,22136=>7899,38931=>7900,37389=>7901,22890=>7902,22702=>7903,40285=>7904,38989=>7905,35355=>7906,24801=>7907,39187=>7908,20818=>7909,29246=>7910,39180=>7911,36019=>7912,30332=>7913,32624=>7914,38309=>7915,31020=>7916,37353=>7917,29033=>7918,31684=>7919,36009=>7920,39151=>7921,35370=>7922,32033=>7923,12214=>7924,39131=>7924,35513=>7925,24290=>7926,36027=>7927,32027=>7928,22707=>7929,22894=>7930,24996=>7931,31966=>7932,35920=>7933,26963=>7934,37586=>7935,12213=>7936,39080=>7936,30219=>7937,39342=>7938,32299=>7939,35575=>7940,40179=>7941,33178=>7942,36667=>7943,25771=>7944,36628=>7945,36070=>7946,24489=>7947,36000=>7948,35331=>7949,23142=>7950,32283=>7951,35442=>7952,37411=>7953,33995=>7954,24185=>7955,36245=>7956,36123=>7957,23713=>7958,21083=>7959,37628=>7960,32177=>7961,23831=>7962,37804=>7963,25841=>7964,40255=>7965,38307=>7966,37499=>7967,20491=>7968,32102=>7969,40852=>7970,38799=>7971,36002=>7972,37390=>7973,28317=>7974,27083=>7975,36092=>7976,34865=>7977,39015=>7978,21102=>7979,38364=>7980,35264=>7981,39208=>7982,24931=>7983,36011=>7984,24291=>7985,35215=>7986,27512=>7987,12244=>7988,40860=>7988,38312=>7989,36556=>7990,35437=>7991,27331=>7992,36020=>7993,21130=>7994,36645=>7995,37707=>7996,22283=>7997,36942=>7998,39405=>7999,38867=>8000,28450=>8001,34399=>8002,38305=>8003,40372=>8004,36032=>8005,36703=>8006,40251=>8007,32005=>8008,22778=>8009,35703=>8010,28396=>8011,22057=>8012,33775=>8013,30059=>8014,21123=>8015,35441=>8016,25079=>8017,22750=>8018,27489=>8019,29872=>8020,36996=>8021,32233=>8022,35594=>8023,25582=>8024,36637=>8025,36036=>8026,31330=>8027,26371=>8028,29172=>8029,21295=>8030,35569=>8031,35496=>8032,32362=>8033,33911=>8034,28222=>8035,29554=>8036,36008=>8037,31117=>8038,25802=>8039,27231=>8040,31309=>8041,39249=>8042,35663=>8043,40388=>8044,32318=>8045,32221=>8046,26997=>8047,36655=>8048,32026=>8049,25824=>8050,24190=>8051,34186=>8052,21137=>8053,28639=>8054,35336=>8055,35352=>8056,38555=>8057,32380=>8058,32000=>8059,22846=>8060,33698=>8061,38960=>8062,36040=>8063,37440=>8064,20729=>8065,39381=>8066,27570=>8067,30435=>8068,22533=>8069,31627=>8070,38291=>8071,33393=>8072,32216=>8073,32365=>8074,27298=>8075,40572=>8076,25536=>8077,25791=>8078,31777=>8079,20745=>8080,34214=>8081,27323=>8082,37970=>8083,36368=>8084,36068=>8085,12178=>8086,35211=>8086,37749=>8087,33382=>8088,21133=>8089,39198=>8090,28472=>8091,28666=>8092,28567=>8093,23559=>8094,28479=>8095,34083=>8096,27123=>8097,22892=>8098,35611=>8099,37292=>8100,33184=>8101,28550=>8102,39509=>8103,23308=>8104,25898=>8105,37496=>8106,30703=>8107,20709=>8108,39171=>8109,32371=>8110,32094=>8111,36686=>8112,36611=>8113,38542=>8114,31680=>8115,28500=>8116,32080=>8117,35489=>8118,32202=>8119,37670=>8120,20677=>8121,35641=>8122,36914=>8123,29180=>8124,30433=>8125,21185=>8126,33686=>8127,39912=>8128,39514=>8129,32147=>8130,38968=>8131,37857=>8132,24465=>8133,30169=>8134,31478=>8135,31998=>8136,33290=>8137,39378=>8138,33289=>8139,25818=>8140,37624=>8141,25084=>8142,21127=>8143,40273=>8144,32121=>8145,35258=>8146,35363=>8147,32118=>8148,37406=>8149,36557=>8150,39423=>8151,38283=>8152,20977=>8153,38982=>8154,27579=>8155,35506=>8156,22718=>8157,25031=>8158,25715=>8159,24235=>8160,35122=>8161,35463=>8162,22602=>8163,20744=>8164,23532=>8165,31014=>8166,26336=>8167,34407=>8168,24011=>8169,31418=>8170,39243=>8171,28528=>8172,25844=>8173,38346=>8174,34847=>8175,33240=>8176,33802=>8177,20358=>8178,36084=>8179,34253=>8180,27396=>8181,25876=>8182,31811=>8183,38348=>8184,34349=>8185,28734=>8186,35733=>8187,25900=>8188,35261=>8189,25078=>8190,32412=>8191,29211=>8192,28651=>8193,25736=>8194,21214=>8195,28551=>8196,27138=>8197,37939=>8198,22744=>8199,39006=>8200,31852=>8201,38626=>8202,28757=>8203,35023=>8204,63975=>8204,39881=>8205,31150=>8206,40599=>8207,21426=>8208,21237=>8209,31019=>8210,27511=>8211,28701=>8212,38584=>8213,20486=>8214,32879=>8215,34030=>8216,36899=>8217,37934=>8218,24976=>8219,28451=>8220,31806=>8221,25986=>8222,33225=>8223,37832=>8224,25088=>8225,29001=>8226,32244=>8227,31975=>8228,20841=>8229,36635=>8230,35538=>8231,30274=>8232,36988=>8233,37904=>8234,29557=>8235,33256=>8236,37168=>8237,40023=>8238,36035=>8239,40801=>8240,37428=>8241,38728=>8242,23994=>8243,38936=>8244,39230=>8245,21129=>8246,12243=>8247,40845=>8247,32894=>8248,22184=>8249,31840=>8250,22751=>8251,25871=>8252,38580=>8253,27155=>8254,23105=>8255,25695=>8256,31757=>8257,34310=>8258,30439=>8259,39025=>8260,24300=>8261,29200=>8262,25796=>8263,28407=>8264,34396=>8265,39791=>8266,36034=>8267,37682=>8268,38520=>8269,39522=>8270,37569=>8271,23650=>8272,32311=>8273,24942=>8274,28670=>8275,32209=>8276,24018=>8277,25891=>8278,23423=>8279,28772=>8280,20098=>8281,25476=>8282,36650=>8283,20523=>8284,20374=>8285,28138=>8286,32184=>8287,35542=>8288,34367=>8289,32645=>8290,37007=>8291,38012=>8292,31854=>8293,39486=>8294,39409=>8295,32097=>8296,23229=>8297,29802=>8298,30908=>8299,34718=>8300,12218=>8301,39340=>8301,39393=>8302,21966=>8303,36023=>8304,12230=>8305,40613=>8305,36067=>8306,36993=>8307,30622=>8308,39237=>8309,34875=>8310,28415=>8311,35646=>8312,37672=>8313,37466=>8314,36031=>8315,37762=>8316,12200=>8317,38272=>8317,24758=>8318,20497=>8319,37683=>8320,22818=>8321,35598=>8322,24396=>8323,35219=>8324,32191=>8325,32236=>8326,24287=>8327,28357=>8328,25003=>8329,38313=>8330,40180=>8331,37528=>8332,35628=>8333,35584=>8334,30045=>8335,37385=>8336,32013=>8337,38627=>8338,25747=>8339,33126=>8340,24817=>8341,39719=>8342,39186=>8343,25836=>8344,33193=>8345,25862=>8346,37312=>8347,12227=>8348,40165=>8348,32886=>8349,22169=>8350,38007=>8351,37811=>8352,27320=>8353,29552=>8354,23527=>8355,25840=>8356,28632=>8357,37397=>8358,32016=>8359,33215=>8360,28611=>8361,36786=>8362,30247=>8363,35582=>8364,27472=>8365,40407=>8366,27590=>8367,22036=>8368,28442=>8369,30436=>8370,40848=>8371,36064=>8372,22132=>8373,40300=>8374,39449=>8375,39108=>8376,38971=>8377,36007=>8378,34315=>8379,24977=>8380,35413=>8381,28497=>8382,38935=>8383,25778=>8384,37610=>8385,20693=>8386,27192=>8387,35676=>8388,33229=>8389,12241=>8390,40778=>8390,39438=>8391,35912=>8392,21843=>8393,27683=>8394,35350=>8395,29309=>8396,37370=>8397,37467=>8398,36983=>8399,31805=>8400,35609=>8401,37666=>8402,37463=>8403,28154=>8404,35700=>8405,22649=>8406,27085=>8407,21958=>8408,22715=>8409,34196=>8410,25654=>8411,37740=>8412,27211=>8413,21932=>8414,20689=>8415,32761=>8416,31429=>8417,31434=>8418,27453=>8419,35242=>8420,23522=>8421,36629=>8422,27691=>8423,20670=>8424,38915=>8425,35531=>8426,24950=>8427,29898=>8428,31406=>8429,36264=>8430,21312=>8431,36544=>8432,39493=>8433,40818=>8434,39028=>8435,27402=>8436,21240=>8437,40306=>8438,30906=>8439,35731=>8440,39250=>8441,25854=>8442,32350=>8443,29105=>8444,38860=>8445,35469=>8446,32009=>8447,27054=>8448,32104=>8449,36575=>8450,37613=>8451,38287=>8452,28516=>8453,28753=>8454,34217=>8455,39955=>8456,36093=>8457,20632=>8458,21930=>8459,39479=>8460,25475=>8461,28544=>8462,27578=>8463,32023=>8464,31721=>8465,26348=>8466,38275=>8467,38493=>8468,36109=>8469,32341=>8470,20663=>8471,36062=>8472,29138=>8473,32057=>8474,36050=>8475,25448=>8476,25885=>8477,25086=>8478,35373=>8479,32051=>8480,23529=>8481,23352=>8482,33102=>8483,28402=>8484,32882=>8485,32361=>8486,21213=>8487,32854=>8488,24107=>8489,29509=>8490,28629=>8491,35433=>8492,26178=>8493,34645=>8494,23526=>8495,35672=>8496,39387=>8497,21218=>8498,36969=>8499,37323=>8500,39166=>8501,35222=>8502,35430=>8503,22781=>8504,29560=>8505,27166=>8506,36664=>8507,26360=>8508,36118=>8509,23660=>8510,34899=>8511,27193=>8512,31466=>8513,25976=>8514,24101=>8515,38617=>8516,35504=>8517,38918=>8518,35500=>8519,30889=>8520,29197=>8521,32114=>8522,39164=>8523,39686=>8524,32883=>8525,24939=>8526,38924=>8527,35359=>8528,35494=>8529,25851=>8530,34311=>8531,35380=>8532,32901=>8533,38614=>8534,38568=>8535,32143=>8536,27506=>8537,23403=>8538,25613=>8539,32302=>8540,29795=>8541,37782=>8542,29562=>8543,25787=>8544,33274=>8545,24907=>8546,25892=>8547,36010=>8548,30321=>8549,28760=>8550,22727=>8551,35674=>8552,35527=>8553,22022=>8554,28271=>8555,29145=>8556,28644=>8557,32295=>8558,35342=>8559,39472=>8560,35588=>8561,37563=>8562,38988=>8563,39636=>8564,26781=>8565,36028=>8566,37941=>8567,24307=>8568,32893=>8569,28916=>8570,37509=>8571,32113=>8572,38957=>8573,22294=>8574,22615=>8575,22296=>8576,38973=>8577,40213=>8578,39345=>8579,39389=>8580,27234=>8581,31402=>8582,35178=>8583,24398=>8584,28771=>8585,38929=>8586,33836=>8587,32178=>8588,12209=>8589,38859=>8589,36949=>8590,22285=>8591,29234=>8592,28656=>8593,32173=>8594,33894=>8595,20553=>8596,20702=>8597,32239=>8598,35586=>8599,34907=>8600,32862=>8601,32011=>8602,31337=>8603,21839=>8604,25790=>8605,34680=>8606,28198=>8607,31401=>8608,21978=>8609,37794=>8610,28879=>8611,35491=>8612,28961=>8613,34154=>8614,22626=>8615,38695=>8616,21209=>8617,35492=>8618,37675=>8619,29351=>8620,35186=>8621,32722=>8622,37521=>8623,25138=>8624,32048=>8625,34662=>8626,36676=>8627,23805=>8628,20448=>8629,29433=>8630,22151=>8631,37697=>8632,39854=>8633,32406=>8634,36066=>8635,37532=>8636,38289=>8637,39023=>8638,38570=>8639,29694=>8640,29563=>8641,32291=>8642,39201=>8643,25010=>8644,32171=>8645,38002=>8646,37129=>8647,35443=>8648,38911=>8649,38917=>8650,34157=>8651,22210=>8652,37559=>8653,26313=>8654,22063=>8655,21332=>8656,25406=>8657,33029=>8658,35559=>8659,23531=>8660,28681=>8661,35613=>8662,37573=>8663,37313=>8664,33288=>8665,37561=>8666,32137=>8667,38920=>8668,35377=>8669,32210=>8670,32396=>8671,36562=>8672,25080=>8673,36984=>8674,30316=>8675,32098=>8676,23416=>8677,21211=>8678,35426=>8679,23563=>8680,39348=>8681,35347=>8682,35338=>8683,36956=>8684,22739=>8685,40201=>8686,40232=>8687,21854=>8688,20126=>8689,35357=>8690,38329=>8691,40573=>8692,22196=>8693,38996=>8694,38331=>8695,33399=>8696,21421=>8697,30831=>8698,35578=>8699,39511=>8700,40230=>8701,26954=>8702,25562=>8703,30221=>8704,38525=>8705,30306=>8706,39178=>8707,27171=>8708,22575=>8709,35617=>8710,34277=>8711,29242=>8712,12212=>8713,38913=>8713,26989=>8714,33865=>8715,37291=>8716,37541=>8717,38948=>8718,36986=>8719,20736=>8720,34811=>8721,34269=>8722,20740=>8723,25014=>8724,32681=>8725,35427=>8726,35696=>8727,35516=>8728,35695=>8729,32377=>8730,34093=>8731,38512=>8732,37504=>8733,39154=>8734,38577=>8735,27387=>8736,23344=>8737,40441=>8738,25033=>8739,32403=>8740,29801=>8741,34722=>8742,29151=>8743,29074=>8744,34821=>8745,36111=>8746,31310=>8747,21938=>8748,25793=>8749,20653=>8750,30320=>8751,36404=>8752,20778=>8753,24962=>8754,37109=>8755,37438=>8756,29494=>8757,35480=>8758,36671=>8759,39192=>8760,12226=>8761,39770=>8761,28417=>8762,33287=>8763,23996=>8764,35486=>8765,39729=>8766,29508=>8767,35709=>8768,38928=>8769,39341=>8770,40219=>8771,28149=>8772,36677=>8773,22290=>8774,21729=>8775,22291=>8776,32227=>8777,36960=>8778,39000=>8779,32004=>8780,36493=>8781,38000=>8782,38322=>8783,38642=>8784,37142=>8785,38549=>8786,36939=>8787,34292=>8788,37270=>8789,26248=>8790,38620=>8791,36617=>8792,25890=>8793,26283=>8794,36106=>8795,36124=>8796,33247=>8797,38015=>8798,26839=>8799,31432=>8800,36012=>8801,25799=>8802,21063=>8803,28580=>8804,36042=>8805,36104=>8806,36555=>8807,37720=>8808,38296=>8809,35408=>8810,40779=>8811,20661=>8812,27656=>8813,30430=>8814,26028=>8815,36670=>8816,23940=>8817,26855=>8818,25136=>8819,32187=>8820,24373=>8821,28466=>8822,24115=>8823,36076=>8824,33081=>8825,36249=>8826,34756=>8827,36685=>8828,37754=>8829,36889=>8830,35998=>8831,37341=>8832,20597=>8833,35386=>8834,37806=>8835,38499=>8836,24128=>8837,30309=>8838,37165=>8839,35657=>8840,32340=>8841,32887=>8842,22519=>8843,34937=>8844,32025=>8845,25711=>8846,25842=>8847,24159=>8848,36074=>8849,28399=>8850,37912=>8851,32066=>8852,31278=>8853,33131=>8854,34886=>8855,35589=>8856,36600=>8857,30394=>8858,26205=>8859,39519=>8860,35576=>8861,35461=>8862,29165=>8863,30682=>8864,22225=>8865,36015=>8866,37956=>8867,31689=>8868,39376=>8869,23560=>8870,30938=>8871,36681=>8872,36090=>8873,27137=>8874,33674=>8875,35037=>8876,22941=>8877,22767=>8878,29376=>8879,37648=>8880,36101=>8881,22684=>8882,32180=>8883,35524=>8884,28310=>8885,28609=>8886,36039=>8887,28460=>8888,32156=>8889,32317=>8890,32305=>8891,37138=>8892,35419=>8893,32068=>8894,38013=>8895,21959=>8896,21401=>8897,21428=>8898,38760=>8899,36107=>8900,21293=>8901,21297=>8902,36094=>8903,21060=>8904,21132=>8905,21108=>8906,20660=>8907,20480=>8908,20630=>8909,20757=>8910,20738=>8911,20756=>8912,20796=>8913,20791=>8914,20712=>8915,20674=>8916,20795=>8917,20752=>8918,20794=>8919,20681=>8920,31988=>8921,40652=>8922,22213=>8923,40172=>8924,35131=>8925,33248=>8926,35329=>8927,35344=>8928,35340=>8929,35349=>8930,35635=>8931,35406=>8932,35365=>8933,35393=>8934,35382=>8935,35398=>8936,35412=>8937,35416=>8938,35410=>8939,35462=>8940,35460=>8941,35455=>8942,35440=>8943,35452=>8944,35445=>8945,35436=>8946,35438=>8947,35533=>8948,35554=>8949,35425=>8950,35482=>8951,35493=>8952,35473=>8953,35474=>8954,35535=>8955,35537=>8956,35529=>8957,35547=>8958,35543=>8959,35522=>8960,35510=>8961,35574=>8962,35563=>8963,35604=>8964,35585=>8965,35556=>8966,35565=>8967,35580=>8968,35571=>8969,35558=>8970,35566=>8971,35550=>8972,35624=>8973,35740=>8974,35606=>8975,35610=>8976,35600=>8977,35627=>8978,35629=>8979,35670=>8980,35673=>8981,35662=>8982,35742=>8983,35691=>8984,35734=>8985,38488=>8986,37178=>8987,37140=>8988,37172=>8989,37087=>8990,37174=>8991,37126=>8992,37192=>8993,33467=>8994,21233=>8995,24048=>8996,22538=>8997,22745=>8998,22754=>8999,22752=>9000,22746=>9001,22497=>9002,22607=>9003,22550=>9004,22610=>9005,22557=>9006,22628=>9007,34188=>9008,34131=>9009,34294=>9010,33703=>9011,33799=>9012,34031=>9013,33511=>9014,34338=>9015,34086=>9016,22603=>9017,29026=>9018,34136=>9019,34045=>9020,34126=>9021,34184=>9022,34234=>9023,29334=>9024,28366=>9025,34113=>9026,34254=>9027,34130=>9028,33984=>9029,33874=>9030,33892=>9031,33940=>9032,33845=>9033,34207=>9034,34133=>9035,40367=>9036,33939=>9037,32264=>9038,34118=>9039,34146=>9040,34078=>9041,39488=>9042,34362=>9043,37795=>9044,34167=>9045,34334=>9046,34298=>9047,34308=>9048,34282=>9049,34330=>9050,22889=>9051,23607=>9052,25451=>9053,25718=>9054,25759=>9055,25681=>9056,25692=>9057,25779=>9058,25860=>9059,25878=>9060,25847=>9061,25852=>9062,25883=>9063,22064=>9064,22072=>9065,22216=>9066,22182=>9067,21764=>9068,21692=>9069,22144=>9070,22109=>9071,22112=>9072,22069=>9073,22006=>9074,22118=>9075,22130=>9076,22156=>9077,22117=>9078,22044=>9079,22062=>9080,21993=>9081,22038=>9082,22208=>9083,22029=>9084,22195=>9085,22209=>9086,22127=>9087,36705=>9088,22198=>9089,22165=>9090,22279=>9091,24131=>9092,24172=>9093,24152=>9094,24151=>9095,23943=>9096,23796=>9097,23888=>9098,23852=>9099,23975=>9100,23968=>9101,23959=>9102,23821=>9103,23992=>9104,23937=>9105,24020=>9106,24480=>9107,29559=>9108,29505=>9109,29546=>9110,29499=>9111,29547=>9112,29568=>9113,29564=>9114,39136=>9115,39219=>9116,39145=>9117,39228=>9118,39146=>9119,39147=>9120,39149=>9121,39156=>9122,39177=>9123,39185=>9124,39195=>9125,39223=>9126,39231=>9127,39235=>9128,39240=>9129,39241=>9130,39242=>9131,39244=>9132,39266=>9133,24289=>9134,36065=>9135,25082=>9136,25006=>9137,24938=>9138,24894=>9139,24757=>9140,24884=>9141,25036=>9142,24927=>9143,25064=>9144,24827=>9145,24887=>9146,24818=>9147,24947=>9148,24860=>9149,24978=>9150,38274=>9151,38278=>9152,38344=>9153,38286=>9154,38292=>9155,38284=>9156,38373=>9157,38317=>9158,38315=>9159,39726=>9160,38316=>9161,38334=>9162,38326=>9163,39721=>9164,38335=>9165,38333=>9166,38332=>9167,38339=>9168,38347=>9169,38356=>9170,38352=>9171,38357=>9172,38366=>9173,28739=>9174,28505=>9175,28711=>9176,28696=>9177,28668=>9178,28039=>9179,28025=>9180,28254=>9181,28590=>9182,28687=>9183,28408=>9184,28527=>9185,28150=>9186,28543=>9187,28678=>9188,28576=>9189,28683=>9190,28775=>9191,28740=>9192,28677=>9193,28535=>9194,28704=>9195,28703=>9196,28722=>9197,28712=>9198,28765=>9199,39467=>9200,36999=>9201,36885=>9202,37008=>9203,23656=>9204,24371=>9205,23285=>9206,23255=>9207,23296=>9208,23149=>9209,23304=>9210,23372=>9211,23207=>9212,23291=>9213,23307=>9214,23329=>9215,23338=>9216,23321=>9217,39380=>9218,39391=>9219,39385=>9220,39478=>9221,39515=>9222,39377=>9223,39384=>9224,39501=>9225,39498=>9226,39394=>9227,39530=>9228,39439=>9229,39437=>9230,39429=>9231,39490=>9232,39469=>9233,39446=>9234,39489=>9235,39470=>9236,39480=>9237,39491=>9238,39492=>9239,39503=>9240,39525=>9241,39524=>9242,31993=>9243,32006=>9244,32002=>9245,32007=>9246,32008=>9247,32394=>9248,32028=>9249,32021=>9250,32019=>9251,32058=>9252,32050=>9253,32049=>9254,32272=>9255,32060=>9256,32064=>9257,32063=>9258,32093=>9259,32078=>9260,32115=>9261,32134=>9262,32131=>9263,32136=>9264,32190=>9265,32186=>9266,32203=>9267,32212=>9268,32196=>9269,32158=>9270,32172=>9271,32185=>9272,32163=>9273,32176=>9274,32199=>9275,32217=>9276,32215=>9277,32249=>9278,32242=>9279,32354=>9280,32230=>9281,32246=>9282,32241=>9283,32267=>9284,32225=>9285,32265=>9286,32285=>9287,32287=>9288,32286=>9289,32301=>9290,32266=>9291,32273=>9292,32381=>9293,32313=>9294,32309=>9295,32306=>9296,32326=>9297,32325=>9298,32392=>9299,32346=>9300,32338=>9301,32366=>9302,32382=>9303,32368=>9304,32367=>9305,32408=>9306,29859=>9307,29771=>9308,29903=>9309,38922=>9310,29885=>9311,29759=>9312,29833=>9313,29862=>9314,29908=>9315,29914=>9316,38873=>9317,38878=>9318,38876=>9319,27050=>9320,27370=>9321,26776=>9322,26838=>9323,27141=>9324,26783=>9325,27355=>9326,27379=>9327,27368=>9328,27359=>9329,27273=>9330,26895=>9331,27208=>9332,26984=>9333,27071=>9334,27194=>9335,27292=>9336,27410=>9337,27422=>9338,27357=>9339,27111=>9340,27407=>9341,27414=>9342,27372=>9343,27354=>9344,27384=>9345,27315=>9346,27367=>9347,27299=>9348,27347=>9349,27358=>9350,27556=>9351,27550=>9352,27566=>9353,27563=>9354,27567=>9355,36564=>9356,36571=>9357,36594=>9358,36603=>9359,36708=>9360,36601=>9361,36604=>9362,36587=>9363,36580=>9364,36706=>9365,36602=>9366,36606=>9367,36618=>9368,36615=>9369,36613=>9370,36626=>9371,36646=>9372,36638=>9373,36639=>9374,36636=>9375,36659=>9376,36678=>9377,36692=>9378,25108=>9379,25127=>9380,29964=>9381,26311=>9382,26308=>9383,26249=>9384,26326=>9385,36033=>9386,36016=>9387,36026=>9388,36029=>9389,36100=>9390,36018=>9391,36037=>9392,36112=>9393,36049=>9394,36058=>9395,36053=>9396,36075=>9397,36071=>9398,36091=>9399,35224=>9400,35244=>9401,35233=>9402,35263=>9403,35238=>9404,35247=>9405,35250=>9406,35255=>9407,27647=>9408,27660=>9409,27692=>9410,29272=>9411,26407=>9412,33110=>9413,33242=>9414,33051=>9415,33214=>9416,33121=>9417,33231=>9418,27487=>9419,39086=>9420,39087=>9421,39094=>9422,39100=>9423,39110=>9424,39112=>9425,36674=>9426,40783=>9427,26005=>9428,29036=>9429,29010=>9430,29079=>9431,29121=>9432,29148=>9433,29182=>9434,31152=>9435,31118=>9436,31146=>9437,25055=>9438,24932=>9439,25059=>9440,25095=>9441,28585=>9442,30959=>9443,30893=>9444,30824=>9445,30904=>9446,31018=>9447,31025=>9448,30820=>9449,30973=>9450,30951=>9451,30947=>9452,40853=>9453,30616=>9454,30558=>9455,30652=>9456,32646=>9457,32648=>9458,37330=>9459,37331=>9460,37332=>9461,37337=>9462,37335=>9463,37333=>9464,37367=>9465,37351=>9466,37348=>9467,37702=>9468,37365=>9469,37369=>9470,37384=>9471,37414=>9472,37445=>9473,37393=>9474,37392=>9475,37377=>9476,37415=>9477,37380=>9478,37413=>9479,37376=>9480,37434=>9481,37478=>9482,37431=>9483,37427=>9484,37461=>9485,37437=>9486,37432=>9487,37470=>9488,37484=>9489,37485=>9490,37439=>9491,37984=>9492,37424=>9493,37449=>9494,37448=>9495,37453=>9496,37422=>9497,37433=>9498,37944=>9499,37548=>9500,37536=>9501,37498=>9502,37546=>9503,37614=>9504,37583=>9505,37891=>9506,37603=>9507,37946=>9508,37553=>9509,37542=>9510,37799=>9511,37526=>9512,37580=>9513,37545=>9514,37877=>9515,37523=>9516,37503=>9517,37801=>9518,37530=>9519,37658=>9520,37547=>9521,37507=>9522,37899=>9523,37544=>9524,37539=>9525,37906=>9526,37688=>9527,37617=>9528,37847=>9529,37605=>9530,37616=>9531,37615=>9532,37608=>9533,37564=>9534,37597=>9535,37622=>9536,37926=>9537,37927=>9538,37571=>9539,37599=>9540,37606=>9541,37650=>9542,37638=>9543,37737=>9544,37659=>9545,37696=>9546,37633=>9547,37653=>9548,37678=>9549,37699=>9550,37639=>9551,37640=>9552,37663=>9553,37657=>9554,37733=>9555,37703=>9556,37750=>9557,37716=>9558,37732=>9559,37802=>9560,37744=>9561,37764=>9562,37860=>9563,37848=>9564,37928=>9565,37767=>9566,37836=>9567,37784=>9568,37816=>9569,37823=>9570,37798=>9571,37808=>9572,37813=>9573,37964=>9574,37858=>9575,37852=>9576,37853=>9577,37837=>9578,37854=>9579,37827=>9580,37831=>9581,37841=>9582,37908=>9583,37917=>9584,37879=>9585,37989=>9586,37907=>9587,37997=>9588,37920=>9589,38009=>9590,37881=>9591,37913=>9592,37962=>9593,37938=>9594,37951=>9595,37972=>9596,37987=>9597,37758=>9598,31329=>9599,40169=>9600,40182=>9601,40199=>9602,40198=>9603,40227=>9604,40327=>9605,40469=>9606,40221=>9607,40223=>9608,40421=>9609,40239=>9610,40409=>9611,40240=>9612,40258=>9613,40478=>9614,40275=>9615,40477=>9616,40288=>9617,40274=>9618,40435=>9619,40284=>9620,40289=>9621,40339=>9622,40298=>9623,40303=>9624,40329=>9625,40344=>9626,40346=>9627,40384=>9628,40357=>9629,40361=>9630,40386=>9631,40380=>9632,40474=>9633,40403=>9634,40410=>9635,40431=>9636,40422=>9637,40434=>9638,40440=>9639,40460=>9640,40442=>9641,40475=>9642,30308=>9643,30296=>9644,30311=>9645,30210=>9646,30278=>9647,30279=>9648,30281=>9649,30238=>9650,30267=>9651,30317=>9652,30318=>9653,30313=>9654,30322=>9655,31431=>9656,31414=>9657,35168=>9658,35123=>9659,35165=>9660,35143=>9661,35128=>9662,35172=>9663,30392=>9664,32814=>9665,32812=>9666,32889=>9667,32885=>9668,38919=>9669,38926=>9670,38927=>9671,38945=>9672,38940=>9673,28481=>9674,38950=>9675,38967=>9676,38990=>9677,38995=>9678,39027=>9679,39010=>9680,39001=>9681,39013=>9682,39020=>9683,39024=>9684,34787=>9685,34822=>9686,34566=>9687,34851=>9688,34806=>9689,34554=>9690,34799=>9691,34692=>9692,34832=>9693,34760=>9694,34833=>9695,34747=>9696,34766=>9697,32588=>9698,31716=>9699,31591=>9700,31849=>9701,31731=>9702,31744=>9703,31691=>9704,31836=>9705,31774=>9706,31787=>9707,31779=>9708,31850=>9709,31839=>9710,33380=>9711,33387=>9712,35018=>9713,32677=>9714,31986=>9715,31990=>9716,31965=>9717,32310=>9718,40617=>9719,36274=>9720,37317=>9721,37315=>9722,40570=>9723,36489=>9724,36428=>9725,36498=>9726,36474=>9727,36437=>9728,36506=>9729,36491=>9730,36499=>9731,36497=>9732,36513=>9733,36451=>9734,36522=>9735,36518=>9736,35316=>9737,35318=>9738,38746=>9739,38722=>9740,38717=>9741,38724=>9742,40788=>9743,40799=>9744,40793=>9745,40800=>9746,40796=>9747,40806=>9748,40812=>9749,40810=>9750,40823=>9751,12236=>9752,40701=>9752,40703=>9753,40713=>9754,35726=>9755,38014=>9756,37864=>9757,39799=>9758,39796=>9759,39809=>9760,39811=>9761,39822=>9762,40056=>9763,31308=>9764,39826=>9765,40031=>9766,39824=>9767,39853=>9768,39834=>9769,39850=>9770,39838=>9771,40045=>9772,39851=>9773,39837=>9774,40024=>9775,39873=>9776,40058=>9777,39985=>9778,39993=>9779,39971=>9780,39991=>9781,39872=>9782,39882=>9783,39879=>9784,39933=>9785,39894=>9786,39914=>9787,39915=>9788,39905=>9789,39908=>9790,39911=>9791,39901=>9792,39906=>9793,39920=>9794,39899=>9795,39924=>9796,39892=>9797,40029=>9798,39944=>9799,39952=>9800,39949=>9801,39954=>9802,39945=>9803,39935=>9804,39968=>9805,39986=>9806,39981=>9807,39976=>9808,39973=>9809,39977=>9810,39987=>9811,39998=>9812,40008=>9813,39995=>9814,39989=>9815,40005=>9816,40022=>9817,40020=>9818,40018=>9819,40039=>9820,38851=>9821,38845=>9822,38857=>9823,40379=>9824,39631=>9825,39638=>9826,39637=>9827,39768=>9828,39758=>9829,39255=>9830,39260=>9831,39714=>9832,40695=>9833,40690=>9834,35180=>9835,38342=>9836,37686=>9837,24390=>9838,34068=>9839,32404=>9840,40803=>9841,22137=>9842,40725=>9843,22081=>9844,39662=>9845,35079=>9846,31296=>9847,39091=>9848,38308=>9849,39693=>9850,36852=>9851,24409=>9852,31339=>9853,39138=>9854,20642=>9855,34193=>9856,20760=>9857,25458=>9858,21067=>9859,30543=>9860,32397=>9861,26310=>9862,30637=>9863,12228=>9864,40565=>9864,22217=>9865,40692=>9866,28635=>9867,25054=>9868,30663=>9869,28720=>9870,40629=>9871,34890=>9872,38370=>9873,38854=>9874,31844=>9875,32308=>9876,38822=>9877,40623=>9878,22220=>9879,39089=>9880,27311=>9881,32590=>9882,31984=>9883,20418=>9884,32363=>9885,40569=>9886,22190=>9887,39706=>9888,33903=>9889,31142=>9890,31858=>9891,39634=>9892,38587=>9893,32251=>9894,35069=>9895,30787=>9896,8560=>9897,8561=>9898,8562=>9899,8563=>9900,8564=>9901,8565=>9902,8566=>9903,8567=>9904,8568=>9905,8569=>9906,714=>9907,715=>9908,729=>9909,8211=>9910,8213=>9911,8229=>9912,8245=>9913,8453=>9914,8457=>9915,8598=>9916,8599=>9917,8600=>9918,8601=>9919,8725=>9920,8735=>9921,8739=>9922,8786=>9923,8806=>9924,8807=>9925,8895=>9926,9552=>9927,9553=>9928,9554=>9929,9555=>9930,9556=>9931,9557=>9932,9558=>9933,9559=>9934,9560=>9935,9561=>9936,9562=>9937,9563=>9938,9564=>9939,9565=>9940,9566=>9941,9567=>9942,9568=>9943,9569=>9944,9570=>9945,9571=>9946,9572=>9947,9573=>9948,9574=>9949,9575=>9950,9576=>9951,9577=>9952,9578=>9953,9579=>9954,9580=>9955,9581=>9956,9582=>9957,9583=>9958,9584=>9959,9585=>9960,9586=>9961,9587=>9962,9601=>9963,9602=>9964,9603=>9965,9604=>9966,9605=>9967,9606=>9968,9607=>9969,9608=>9970,9609=>9971,9610=>9972,9611=>9973,9612=>9974,9613=>9975,9614=>9976,9615=>9977,9619=>9978,9620=>9979,9621=>9980,9660=>9981,9661=>9982,9698=>9983,9699=>9984,9700=>9985,9701=>9986,9737=>9987,8853=>9988,12306=>9989,12317=>9990,12318=>9991,12321=>9992,12322=>9993,12323=>9994,12324=>9995,12325=>9996,12326=>9997,12327=>9998,12328=>9999,12329=>10000,12963=>10001,13198=>10002,13199=>10003,13212=>10004,13213=>10005,13214=>10006,13217=>10007,13252=>10008,13262=>10009,13265=>10010,13266=>10011,13269=>10012,65072=>10013,65506=>10014,65508=>10015,8481=>10016,12849=>10017,8208=>10018,12540=>10019,12443=>10020,12444=>10021,12541=>10022,12542=>10023,12294=>10024,12445=>10025,12446=>10026,65097=>10027,65098=>10028,65099=>10029,65100=>10030,65101=>10031,65102=>10032,65103=>10033,65104=>10034,65105=>10035,65106=>10036,65108=>10037,65109=>10038,65110=>10039,65111=>10040,65113=>10041,65114=>10042,65115=>10043,65116=>10044,65117=>10045,65118=>10046,65119=>10047,65120=>10048,65121=>10049,65122=>10050,65123=>10051,65124=>10052,65125=>10053,65126=>10054,65128=>10055,65129=>10056,65130=>10057,65131=>10058,12350=>10059,59367=>10059,12272=>10060,59368=>10060,12273=>10061,59369=>10061,12274=>10062,59370=>10062,12275=>10063,59371=>10063,12276=>10064,59372=>10064,12277=>10065,59373=>10065,12278=>10066,59374=>10066,12279=>10067,59375=>10067,12280=>10068,59376=>10068,12281=>10069,59377=>10069,12282=>10070,59378=>10070,12283=>10071,59379=>10071,19970=>10072,19972=>10073,19973=>10074,19974=>10075,19983=>10076,19986=>10077,19991=>10078,19999=>10079,20000=>10080,20001=>10081,20003=>10082,20006=>10083,20009=>10084,20014=>10085,20015=>10086,20017=>10087,20019=>10088,20021=>10089,20023=>10090,20028=>10091,20032=>10092,20033=>10093,20034=>10094,20036=>10095,20038=>10096,20042=>10097,20049=>10098,20053=>10099,20055=>10100,20058=>10101,20059=>10102,20066=>10103,20067=>10104,20068=>10105,20069=>10106,20071=>10107,20072=>10108,20074=>10109,20075=>10110,20076=>10111,20077=>10112,20078=>10113,20079=>10114,20082=>10115,20084=>10116,20085=>10117,20086=>10118,20087=>10119,20088=>10120,20089=>10121,20090=>10122,20091=>10123,20092=>10124,20093=>10125,20095=>10126,20096=>10127,20097=>10128,20099=>10129,20100=>10130,12037=>10131,20101=>10131,20103=>10132,20106=>10133,20112=>10134,20118=>10135,20119=>10136,20121=>10137,20124=>10138,20125=>10139,20131=>10140,20138=>10141,20143=>10142,20144=>10143,20145=>10144,20148=>10145,20150=>10146,20151=>10147,20152=>10148,20153=>10149,20156=>10150,20157=>10151,20158=>10152,20168=>10153,20172=>10154,20175=>10155,20176=>10156,20178=>10157,20186=>10158,20187=>10159,20188=>10160,20192=>10161,20194=>10162,20198=>10163,20199=>10164,20201=>10165,20205=>10166,20206=>10167,20207=>10168,20209=>10169,20212=>10170,20216=>10171,20217=>10172,20218=>10173,20220=>10174,20222=>10175,20224=>10176,20226=>10177,20227=>10178,20228=>10179,20229=>10180,20230=>10181,20231=>10182,20232=>10183,20235=>10184,20236=>10185,20242=>10186,20243=>10187,20244=>10188,20245=>10189,20246=>10190,20252=>10191,20253=>10192,20257=>10193,20259=>10194,20264=>10195,20265=>10196,20268=>10197,20269=>10198,20270=>10199,20273=>10200,20275=>10201,20277=>10202,20279=>10203,20281=>10204,20283=>10205,20286=>10206,20287=>10207,20288=>10208,20289=>10209,20290=>10210,20292=>10211,20293=>10212,20295=>10213,20296=>10214,20297=>10215,20298=>10216,20299=>10217,20300=>10218,20306=>10219,20308=>10220,20310=>10221,20321=>10222,20322=>10223,20326=>10224,20328=>10225,20330=>10226,20331=>10227,20333=>10228,20334=>10229,20337=>10230,20338=>10231,20341=>10232,20343=>10233,20344=>10234,20345=>10235,20346=>10236,20349=>10237,20352=>10238,20353=>10239,20354=>10240,20357=>10241,20359=>10242,20362=>10243,20364=>10244,20366=>10245,20368=>10246,20370=>10247,20371=>10248,20373=>10249,20376=>10250,20377=>10251,20378=>10252,20380=>10253,20382=>10254,20383=>10255,20385=>10256,20386=>10257,20388=>10258,20395=>10259,20397=>10260,20400=>10261,20401=>10262,20402=>10263,20403=>10264,20404=>10265,20406=>10266,20407=>10267,20408=>10268,20409=>10269,20410=>10270,20411=>10271,20412=>10272,20413=>10273,20414=>10274,20416=>10275,20417=>10276,20422=>10277,20423=>10278,20424=>10279,20425=>10280,20427=>10281,20428=>10282,20429=>10283,20434=>10284,20435=>10285,20436=>10286,20437=>10287,20438=>10288,20441=>10289,20443=>10290,20450=>10291,20452=>10292,20453=>10293,20455=>10294,20459=>10295,20460=>10296,20464=>10297,20466=>10298,20468=>10299,20469=>10300,20470=>10301,20471=>10302,20473=>10303,20475=>10304,20476=>10305,20477=>10306,20479=>10307,20481=>10308,20482=>10309,20483=>10310,20484=>10311,20485=>10312,20487=>10313,20488=>10314,20490=>10315,20494=>10316,20496=>10317,20499=>10318,20501=>10319,20502=>10320,20503=>10321,20507=>10322,20509=>10323,20510=>10324,20512=>10325,20514=>10326,20515=>10327,20516=>10328,20519=>10329,20527=>10330,20528=>10331,20529=>10332,20530=>10333,20531=>10334,20532=>10335,20533=>10336,20534=>10337,20535=>10338,20536=>10339,20537=>10340,20539=>10341,20541=>10342,20543=>10343,20544=>10344,20545=>10345,20546=>10346,20548=>10347,20549=>10348,20550=>10349,20554=>10350,20555=>10351,20557=>10352,20560=>10353,20561=>10354,20562=>10355,20563=>10356,20564=>10357,20566=>10358,20567=>10359,20568=>10360,20569=>10361,20571=>10362,20573=>10363,20574=>10364,20575=>10365,20576=>10366,20577=>10367,20578=>10368,20579=>10369,20580=>10370,20582=>10371,20583=>10372,20584=>10373,20585=>10374,20586=>10375,20587=>10376,20589=>10377,20590=>10378,20591=>10379,20592=>10380,20593=>10381,20594=>10382,20595=>10383,20600=>10384,20601=>10385,20602=>10386,20604=>10387,20605=>10388,20609=>10389,20610=>10390,20611=>10391,20612=>10392,20614=>10393,20615=>10394,20617=>10395,20618=>10396,20619=>10397,20620=>10398,20622=>10399,20623=>10400,20624=>10401,20625=>10402,20626=>10403,20627=>10404,20628=>10405,20629=>10406,20631=>10407,20634=>10408,20635=>10409,20636=>10410,20637=>10411,20638=>10412,20639=>10413,20640=>10414,20641=>10415,20644=>10416,20646=>10417,20650=>10418,20651=>10419,20654=>10420,20655=>10421,20656=>10422,20657=>10423,20662=>10424,20664=>10425,20665=>10426,20668=>10427,20669=>10428,20671=>10429,20672=>10430,20673=>10431,20675=>10432,20676=>10433,20678=>10434,20679=>10435,20680=>10436,20682=>10437,20683=>10438,20684=>10439,20685=>10440,20686=>10441,20688=>10442,20690=>10443,20691=>10444,20692=>10445,20695=>10446,20696=>10447,20697=>10448,20699=>10449,20700=>10450,20701=>10451,20703=>10452,20704=>10453,20705=>10454,20706=>10455,20707=>10456,20708=>10457,20713=>10458,20714=>10459,20715=>10460,20719=>10461,20720=>10462,20721=>10463,20722=>10464,20724=>10465,20726=>10466,20727=>10467,20728=>10468,20730=>10469,20732=>10470,20733=>10471,20734=>10472,20735=>10473,20737=>10474,20739=>10475,20741=>10476,20746=>10477,20748=>10478,20749=>10479,20750=>10480,20751=>10481,20753=>10482,20755=>10483,20758=>10484,20759=>10485,20761=>10486,20762=>10487,20763=>10488,20764=>10489,20765=>10490,20766=>10491,20768=>10492,20770=>10493,20771=>10494,20772=>10495,20773=>10496,20774=>10497,20775=>10498,20776=>10499,20777=>10500,20779=>10501,20780=>10502,20781=>10503,20782=>10504,20783=>10505,20784=>10506,20785=>10507,20787=>10508,20788=>10509,20789=>10510,20790=>10511,20792=>10512,20793=>10513,20797=>10514,20798=>10515,20802=>10516,20807=>10517,20810=>10518,20812=>10519,20814=>10520,20815=>10521,20816=>10522,20819=>10523,20823=>10524,20824=>10525,20825=>10526,20827=>10527,20829=>10528,20830=>10529,20831=>10530,20832=>10531,20833=>10532,20835=>10533,20836=>10534,20838=>10535,20839=>10536,20842=>10537,20847=>10538,20850=>10539,20858=>10540,20862=>10541,20863=>10542,20867=>10543,20868=>10544,20870=>10545,20871=>10546,20874=>10547,20875=>10548,20878=>10549,20879=>10550,20880=>10551,20881=>10552,20883=>10553,20884=>10554,20888=>10555,20890=>10556,20893=>10557,20894=>10558,20895=>10559,20897=>10560,20899=>10561,20902=>10562,20903=>10563,20904=>10564,20905=>10565,20906=>10566,20909=>10567,20910=>10568,20916=>10569,20920=>10570,20921=>10571,20922=>10572,20926=>10573,20927=>10574,20929=>10575,20930=>10576,20931=>10577,20933=>10578,20936=>10579,20938=>10580,20942=>10581,20944=>10582,20946=>10583,20947=>10584,20948=>10585,20949=>10586,20950=>10587,20951=>10588,20952=>10589,20953=>10590,20954=>10591,20956=>10592,20958=>10593,20959=>10594,20962=>10595,20963=>10596,20965=>10597,20966=>10598,20967=>10599,20968=>10600,20969=>10601,20970=>10602,20972=>10603,20974=>10604,20978=>10605,20980=>10606,20983=>10607,20990=>10608,20996=>10609,20997=>10610,21001=>10611,21003=>10612,21004=>10613,21007=>10614,21008=>10615,21011=>10616,21012=>10617,21013=>10618,21020=>10619,21022=>10620,21023=>10621,21025=>10622,21026=>10623,21027=>10624,21029=>10625,21030=>10626,21031=>10627,21034=>10628,21036=>10629,21039=>10630,21041=>10631,21042=>10632,21044=>10633,21045=>10634,21052=>10635,21054=>10636,21061=>10637,21062=>10638,21064=>10639,21065=>10640,21070=>10641,21071=>10642,21074=>10643,21075=>10644,21077=>10645,21079=>10646,21080=>10647,21081=>10648,21082=>10649,21085=>10650,21087=>10651,21088=>10652,21090=>10653,21091=>10654,21092=>10655,21094=>10656,21096=>10657,21099=>10658,21100=>10659,21101=>10660,21104=>10661,21105=>10662,21107=>10663,21110=>10664,21111=>10665,21112=>10666,21113=>10667,21114=>10668,21115=>10669,21116=>10670,21118=>10671,21120=>10672,21124=>10673,21125=>10674,21126=>10675,21131=>10676,21134=>10677,21135=>10678,21138=>10679,21140=>10680,21141=>10681,21142=>10682,21143=>10683,21144=>10684,21145=>10685,21146=>10686,21148=>10687,21156=>10688,21157=>10689,21158=>10690,21159=>10691,21166=>10692,21167=>10693,21168=>10694,21172=>10695,21173=>10696,21174=>10697,21175=>10698,21176=>10699,21177=>10700,21178=>10701,21179=>10702,21180=>10703,21181=>10704,21184=>10705,21186=>10706,21188=>10707,21189=>10708,21190=>10709,21192=>10710,21194=>10711,21196=>10712,21197=>10713,21198=>10714,21199=>10715,21201=>10716,21203=>10717,21204=>10718,21207=>10719,21210=>10720,21212=>10721,21216=>10722,21217=>10723,21219=>10724,21221=>10725,21222=>10726,21223=>10727,21224=>10728,21225=>10729,21226=>10730,21227=>10731,21228=>10732,21229=>10733,21230=>10734,21231=>10735,21234=>10736,21235=>10737,21236=>10738,21238=>10739,21239=>10740,21243=>10741,21244=>10742,21245=>10743,21249=>10744,21250=>10745,21251=>10746,21252=>10747,21255=>10748,21257=>10749,21258=>10750,21259=>10751,21260=>10752,21262=>10753,21265=>10754,21266=>10755,21267=>10756,21268=>10757,21272=>10758,21275=>10759,21276=>10760,21278=>10761,21279=>10762,21282=>10763,21284=>10764,21285=>10765,21287=>10766,21288=>10767,21289=>10768,21291=>10769,21292=>10770,21296=>10771,21298=>10772,21299=>10773,21300=>10774,21301=>10775,21302=>10776,21303=>10777,12054=>10778,21304=>10778,21308=>10779,21309=>10780,21314=>10781,21316=>10782,21318=>10783,21323=>10784,21324=>10785,21325=>10786,21328=>10787,21336=>10788,21337=>10789,21339=>10790,21341=>10791,21349=>10792,21352=>10793,21354=>10794,21356=>10795,21357=>10796,21362=>10797,21366=>10798,21369=>10799,21371=>10800,21372=>10801,21373=>10802,21374=>10803,21376=>10804,21377=>10805,21379=>10806,21383=>10807,21384=>10808,21386=>10809,21390=>10810,21391=>10811,21392=>10812,21393=>10813,21394=>10814,21395=>10815,21396=>10816,21398=>10817,21399=>10818,21403=>10819,21404=>10820,21406=>10821,21409=>10822,21412=>10823,21415=>10824,21418=>10825,21419=>10826,21420=>10827,21423=>10828,21424=>10829,21425=>10830,21427=>10831,21429=>10832,21431=>10833,21432=>10834,21433=>10835,21434=>10836,21436=>10837,21437=>10838,21438=>10839,21440=>10840,21444=>10841,21445=>10842,21446=>10843,21447=>10844,21454=>10845,21455=>10846,21456=>10847,21458=>10848,21459=>10849,21461=>10850,21466=>10851,21468=>10852,21469=>10853,21470=>10854,21473=>10855,21479=>10856,21492=>10857,21498=>10858,21502=>10859,21503=>10860,21504=>10861,21506=>10862,21509=>10863,21511=>10864,21515=>10865,21524=>10866,21528=>10867,21529=>10868,21530=>10869,21532=>10870,21538=>10871,21540=>10872,21541=>10873,21546=>10874,21552=>10875,21555=>10876,21558=>10877,21559=>10878,21562=>10879,21565=>10880,21567=>10881,21569=>10882,21570=>10883,21572=>10884,21573=>10885,21575=>10886,21577=>10887,21580=>10888,21581=>10889,21582=>10890,21583=>10891,21585=>10892,21594=>10893,21597=>10894,21598=>10895,21599=>10896,21600=>10897,21601=>10898,21603=>10899,21605=>10900,21607=>10901,21609=>10902,21610=>10903,21611=>10904,21612=>10905,21613=>10906,21614=>10907,21615=>10908,21616=>10909,21620=>10910,21625=>10911,21626=>10912,21630=>10913,21631=>10914,21633=>10915,21635=>10916,21637=>10917,21639=>10918,21640=>10919,21641=>10920,21642=>10921,21645=>10922,21649=>10923,21651=>10924,21655=>10925,21656=>10926,21660=>10927,21662=>10928,21663=>10929,21664=>10930,21665=>10931,21666=>10932,21669=>10933,21678=>10934,21680=>10935,21682=>10936,21685=>10937,21686=>10938,21687=>10939,21689=>10940,21690=>10941,21694=>10942,21699=>10943,21701=>10944,21706=>10945,21707=>10946,21718=>10947,21720=>10948,21723=>10949,21728=>10950,21730=>10951,21731=>10952,21732=>10953,21739=>10954,21740=>10955,21743=>10956,21744=>10957,21745=>10958,21748=>10959,21749=>10960,21750=>10961,21751=>10962,21752=>10963,21753=>10964,21755=>10965,21758=>10966,21760=>10967,21762=>10968,21763=>10969,21765=>10970,21768=>10971,21770=>10972,21771=>10973,21772=>10974,21773=>10975,21774=>10976,21778=>10977,21779=>10978,21781=>10979,21782=>10980,21783=>10981,21784=>10982,21785=>10983,21786=>10984,21788=>10985,21789=>10986,21790=>10987,21791=>10988,21793=>10989,21797=>10990,21798=>10991,21800=>10992,21801=>10993,21803=>10994,21805=>10995,21810=>10996,21812=>10997,21813=>10998,21814=>10999,21816=>11000,21817=>11001,21818=>11002,21819=>11003,21821=>11004,21824=>11005,21826=>11006,21829=>11007,21831=>11008,21832=>11009,21835=>11010,21836=>11011,21837=>11012,21838=>11013,21841=>11014,21842=>11015,21844=>11016,21847=>11017,21848=>11018,21849=>11019,21850=>11020,21851=>11021,21853=>11022,21855=>11023,21856=>11024,21858=>11025,21859=>11026,21864=>11027,21865=>11028,21867=>11029,21871=>11030,21872=>11031,21873=>11032,21874=>11033,21875=>11034,21876=>11035,21881=>11036,21882=>11037,21885=>11038,21887=>11039,21893=>11040,21894=>11041,21900=>11042,21901=>11043,21902=>11044,21904=>11045,21906=>11046,21907=>11047,21909=>11048,21910=>11049,21911=>11050,21914=>11051,21915=>11052,21918=>11053,21920=>11054,21921=>11055,21922=>11056,21923=>11057,21924=>11058,21925=>11059,21926=>11060,21928=>11061,21929=>11062,21931=>11063,21933=>11064,21935=>11065,21936=>11066,21940=>11067,21942=>11068,21944=>11069,21946=>11070,21948=>11071,21951=>11072,21952=>11073,21953=>11074,21954=>11075,21955=>11076,21960=>11077,21962=>11078,21963=>11079,21967=>11080,21968=>11081,21973=>11082,21975=>11083,21976=>11084,21977=>11085,21979=>11086,21982=>11087,21984=>11088,21986=>11089,21991=>11090,21997=>11091,21998=>11092,22000=>11093,22001=>11094,22004=>11095,22008=>11096,22009=>11097,22010=>11098,22011=>11099,22012=>11100,22015=>11101,22018=>11102,22019=>11103,22020=>11104,22021=>11105,22023=>11106,22026=>11107,22027=>11108,22032=>11109,22033=>11110,22034=>11111,22035=>11112,22037=>11113,22041=>11114,22042=>11115,22045=>11116,22048=>11117,22049=>11118,22050=>11119,22053=>11120,22054=>11121,22056=>11122,22058=>11123,22059=>11124,22067=>11125,22071=>11126,22074=>11127,22076=>11128,22077=>11129,22078=>11130,22080=>11131,22082=>11132,22083=>11133,22084=>11134,22085=>11135,22086=>11136,22087=>11137,22088=>11138,22089=>11139,22090=>11140,22091=>11141,22095=>11142,22096=>11143,22097=>11144,22098=>11145,22099=>11146,22101=>11147,22102=>11148,22106=>11149,22107=>11150,22110=>11151,22111=>11152,22113=>11153,22115=>11154,22119=>11155,22125=>11156,22126=>11157,22128=>11158,22131=>11159,22133=>11160,22135=>11161,22138=>11162,22141=>11163,22142=>11164,22143=>11165,22145=>11166,22146=>11167,22147=>11168,22148=>11169,22152=>11170,22153=>11171,22154=>11172,22155=>11173,22157=>11174,22160=>11175,22161=>11176,22162=>11177,22164=>11178,22166=>11179,22167=>11180,22168=>11181,22170=>11182,22171=>11183,22172=>11184,22173=>11185,22174=>11186,22175=>11187,22176=>11188,22177=>11189,22178=>11190,22180=>11191,22181=>11192,22183=>11193,22185=>11194,22186=>11195,22187=>11196,22188=>11197,22189=>11198,22192=>11199,22193=>11200,22194=>11201,22197=>11202,22200=>11203,22201=>11204,22202=>11205,22203=>11206,22205=>11207,22206=>11208,22207=>11209,22211=>11210,22212=>11211,22214=>11212,22215=>11213,22219=>11214,22221=>11215,22222=>11216,22223=>11217,22224=>11218,22226=>11219,22227=>11220,22229=>11221,22230=>11222,22232=>11223,22233=>11224,22236=>11225,22243=>11226,22245=>11227,22246=>11228,22247=>11229,22248=>11230,22249=>11231,22250=>11232,22252=>11233,22254=>11234,22255=>11235,22258=>11236,22259=>11237,22262=>11238,22263=>11239,22264=>11240,22267=>11241,22268=>11242,22272=>11243,22273=>11244,22274=>11245,22277=>11246,22284=>11247,22286=>11248,22287=>11249,22288=>11250,22289=>11251,22292=>11252,22293=>11253,22295=>11254,22297=>11255,22298=>11256,22299=>11257,22301=>11258,22302=>11259,22304=>11260,22305=>11261,22306=>11262,22308=>11263,22309=>11264,22310=>11265,22311=>11266,22315=>11267,22321=>11268,22322=>11269,22324=>11270,22325=>11271,22326=>11272,22327=>11273,22328=>11274,22332=>11275,22333=>11276,22335=>11277,22337=>11278,22339=>11279,22340=>11280,22341=>11281,22342=>11282,22344=>11283,22345=>11284,22347=>11285,22354=>11286,22355=>11287,22356=>11288,22357=>11289,22358=>11290,22360=>11291,22361=>11292,22370=>11293,22371=>11294,22373=>11295,22375=>11296,22380=>11297,22382=>11298,22384=>11299,22385=>11300,22386=>11301,22388=>11302,22389=>11303,22392=>11304,22393=>11305,22394=>11306,22397=>11307,22398=>11308,22399=>11309,22400=>11310,22401=>11311,22407=>11312,22408=>11313,22409=>11314,22410=>11315,22413=>11316,22414=>11317,22415=>11318,22416=>11319,22417=>11320,22420=>11321,22421=>11322,22422=>11323,22423=>11324,22424=>11325,22425=>11326,22426=>11327,22428=>11328,22429=>11329,22430=>11330,22431=>11331,22437=>11332,22440=>11333,22442=>11334,22444=>11335,22447=>11336,22448=>11337,22449=>11338,22451=>11339,22453=>11340,22454=>11341,22455=>11342,22457=>11343,22458=>11344,22459=>11345,22460=>11346,22461=>11347,22462=>11348,22463=>11349,22464=>11350,22465=>11351,22468=>11352,22469=>11353,22470=>11354,22471=>11355,22472=>11356,22473=>11357,22474=>11358,22476=>11359,22477=>11360,22480=>11361,22481=>11362,22483=>11363,22486=>11364,22487=>11365,22491=>11366,22492=>11367,22494=>11368,22498=>11369,22499=>11370,22501=>11371,22502=>11372,22503=>11373,22504=>11374,22505=>11375,22506=>11376,22507=>11377,22508=>11378,22510=>11379,22512=>11380,22513=>11381,22514=>11382,22515=>11383,22517=>11384,22518=>11385,22523=>11386,22524=>11387,22526=>11388,22527=>11389,22529=>11390,22531=>11391,22532=>11392,22536=>11393,22537=>11394,22540=>11395,22542=>11396,22543=>11397,22544=>11398,22546=>11399,22547=>11400,22548=>11401,22551=>11402,22552=>11403,22554=>11404,22555=>11405,22556=>11406,22559=>11407,22562=>11408,22563=>11409,22565=>11410,22566=>11411,22567=>11412,22568=>11413,22569=>11414,22571=>11415,22572=>11416,22573=>11417,22574=>11418,22578=>11419,22579=>11420,22582=>11421,22583=>11422,22584=>11423,22585=>11424,22586=>11425,22587=>11426,22588=>11427,22589=>11428,22590=>11429,22591=>11430,22592=>11431,22593=>11432,22594=>11433,22595=>11434,22597=>11435,22598=>11436,22599=>11437,22600=>11438,22601=>11439,22606=>11440,22608=>11441,22611=>11442,22613=>11443,22614=>11444,22617=>11445,22618=>11446,22619=>11447,22620=>11448,22621=>11449,22623=>11450,22624=>11451,22625=>11452,22627=>11453,22630=>11454,22631=>11455,22632=>11456,22633=>11457,22634=>11458,22637=>11459,22638=>11460,22639=>11461,22640=>11462,22641=>11463,22642=>11464,22643=>11465,22644=>11466,22646=>11467,22647=>11468,22648=>11469,22650=>11470,22651=>11471,22652=>11472,22653=>11473,22655=>11474,22658=>11475,22660=>11476,22662=>11477,22663=>11478,22664=>11479,22667=>11480,22668=>11481,22669=>11482,22670=>11483,22671=>11484,22672=>11485,22673=>11486,22676=>11487,22677=>11488,22678=>11489,22679=>11490,22680=>11491,22683=>11492,22685=>11493,22688=>11494,22689=>11495,22690=>11496,22691=>11497,22692=>11498,22693=>11499,22694=>11500,22695=>11501,22698=>11502,22699=>11503,22700=>11504,22701=>11505,22703=>11506,22704=>11507,22705=>11508,22706=>11509,22708=>11510,22709=>11511,22710=>11512,22711=>11513,22712=>11514,22713=>11515,22714=>11516,22717=>11517,22719=>11518,22720=>11519,22722=>11520,22723=>11521,22724=>11522,22726=>11523,22728=>11524,22729=>11525,22730=>11526,22731=>11527,22732=>11528,22733=>11529,22734=>11530,22735=>11531,22736=>11532,22738=>11533,22740=>11534,22742=>11535,22743=>11536,22747=>11537,22748=>11538,22749=>11539,22753=>11540,22755=>11541,22757=>11542,22758=>11543,22759=>11544,22760=>11545,22762=>11546,22765=>11547,22769=>11548,22770=>11549,22772=>11550,22773=>11551,22775=>11552,22776=>11553,22779=>11554,22780=>11555,22782=>11556,22783=>11557,22784=>11558,22785=>11559,22787=>11560,22789=>11561,22790=>11562,22792=>11563,22793=>11564,12066=>11565,22794=>11565,22795=>11566,22796=>11567,22798=>11568,22800=>11569,22801=>11570,22802=>11571,22803=>11572,22807=>11573,22808=>11574,22811=>11575,22813=>11576,22814=>11577,22816=>11578,22817=>11579,22819=>11580,22822=>11581,22824=>11582,22828=>11583,22832=>11584,22834=>11585,22835=>11586,22837=>11587,22838=>11588,22843=>11589,22845=>11590,22847=>11591,22848=>11592,22851=>11593,22853=>11594,22854=>11595,22858=>11596,22860=>11597,22861=>11598,22864=>11599,22866=>11600,22867=>11601,22873=>11602,22875=>11603,22876=>11604,22877=>11605,22878=>11606,22879=>11607,22881=>11608,22883=>11609,22884=>11610,22886=>11611,22887=>11612,22888=>11613,22891=>11614,22893=>11615,22895=>11616,22896=>11617,22897=>11618,22898=>11619,22901=>11620,22903=>11621,22906=>11622,22907=>11623,22908=>11624,22910=>11625,22911=>11626,22912=>11627,22917=>11628,22921=>11629,22923=>11630,22924=>11631,22926=>11632,22927=>11633,22928=>11634,22929=>11635,22932=>11636,22933=>11637,22936=>11638,22938=>11639,22939=>11640,22940=>11641,22943=>11642,22944=>11643,22945=>11644,22946=>11645,22950=>11646,22951=>11647,22956=>11648,22957=>11649,22960=>11650,22961=>11651,22963=>11652,22964=>11653,22965=>11654,22966=>11655,22967=>11656,22968=>11657,22970=>11658,22972=>11659,22973=>11660,22975=>11661,22976=>11662,22977=>11663,22978=>11664,22979=>11665,22980=>11666,22981=>11667,22983=>11668,22984=>11669,22985=>11670,22988=>11671,22989=>11672,22990=>11673,22991=>11674,22997=>11675,22998=>11676,23001=>11677,23003=>11678,23006=>11679,23007=>11680,23008=>11681,23009=>11682,23010=>11683,23012=>11684,23014=>11685,23015=>11686,23017=>11687,23018=>11688,23019=>11689,23021=>11690,23022=>11691,23023=>11692,23024=>11693,23025=>11694,23026=>11695,23027=>11696,23028=>11697,23029=>11698,23030=>11699,23031=>11700,23032=>11701,23034=>11702,23036=>11703,23037=>11704,23038=>11705,23040=>11706,23042=>11707,23050=>11708,23051=>11709,23053=>11710,23054=>11711,23055=>11712,23056=>11713,23058=>11714,23060=>11715,23061=>11716,23062=>11717,23063=>11718,23065=>11719,23066=>11720,23067=>11721,23069=>11722,23070=>11723,23073=>11724,23074=>11725,23076=>11726,23078=>11727,23079=>11728,23080=>11729,23082=>11730,23083=>11731,23084=>11732,23085=>11733,23086=>11734,23087=>11735,23088=>11736,23091=>11737,23093=>11738,23095=>11739,23096=>11740,23097=>11741,23098=>11742,23099=>11743,23101=>11744,23102=>11745,23103=>11746,23106=>11747,23107=>11748,23108=>11749,23109=>11750,23111=>11751,23112=>11752,23115=>11753,23116=>11754,23117=>11755,23118=>11756,23119=>11757,23120=>11758,23121=>11759,23122=>11760,23123=>11761,23124=>11762,23126=>11763,23127=>11764,23128=>11765,23129=>11766,23131=>11767,23132=>11768,23133=>11769,23134=>11770,23135=>11771,23136=>11772,23137=>11773,23139=>11774,23140=>11775,23141=>11776,23144=>11777,23145=>11778,23147=>11779,23148=>11780,23150=>11781,23151=>11782,23152=>11783,23153=>11784,23154=>11785,23155=>11786,23160=>11787,23161=>11788,23163=>11789,23164=>11790,23165=>11791,23166=>11792,23168=>11793,23169=>11794,23170=>11795,23171=>11796,23172=>11797,23173=>11798,23174=>11799,23175=>11800,23176=>11801,23177=>11802,23178=>11803,23179=>11804,23180=>11805,23181=>11806,23182=>11807,23183=>11808,23184=>11809,23185=>11810,23187=>11811,23188=>11812,23189=>11813,23190=>11814,23191=>11815,23192=>11816,23193=>11817,23196=>11818,23197=>11819,23198=>11820,23199=>11821,23200=>11822,23201=>11823,23202=>11824,23203=>11825,23204=>11826,23205=>11827,23206=>11828,23208=>11829,23209=>11830,23211=>11831,23212=>11832,23213=>11833,23214=>11834,23215=>11835,23216=>11836,23217=>11837,23220=>11838,23222=>11839,23223=>11840,23225=>11841,23226=>11842,23227=>11843,23228=>11844,23231=>11845,23232=>11846,23235=>11847,23236=>11848,23237=>11849,23238=>11850,23239=>11851,23240=>11852,23242=>11853,23243=>11854,23245=>11855,23246=>11856,23247=>11857,23248=>11858,23249=>11859,23251=>11860,23253=>11861,23257=>11862,23258=>11863,23259=>11864,23261=>11865,23262=>11866,23263=>11867,23266=>11868,23268=>11869,23269=>11870,23271=>11871,23272=>11872,23274=>11873,23276=>11874,23277=>11875,23278=>11876,23279=>11877,23280=>11878,23282=>11879,23283=>11880,23284=>11881,23286=>11882,23287=>11883,23288=>11884,23289=>11885,23290=>11886,23292=>11887,23293=>11888,23294=>11889,23295=>11890,23297=>11891,23298=>11892,23299=>11893,23300=>11894,23301=>11895,23302=>11896,23303=>11897,23306=>11898,23309=>11899,23310=>11900,23311=>11901,23312=>11902,23313=>11903,23314=>11904,23315=>11905,23316=>11906,23317=>11907,23320=>11908,23322=>11909,23323=>11910,23324=>11911,23325=>11912,23326=>11913,23327=>11914,23328=>11915,23330=>11916,23331=>11917,23332=>11918,23333=>11919,23334=>11920,23335=>11921,23336=>11922,23337=>11923,23339=>11924,23340=>11925,23341=>11926,23342=>11927,23343=>11928,23345=>11929,23347=>11930,23349=>11931,23350=>11932,23353=>11933,23354=>11934,23355=>11935,23356=>11936,23357=>11937,23358=>11938,23359=>11939,23361=>11940,23362=>11941,23363=>11942,23364=>11943,23365=>11944,23366=>11945,23367=>11946,23368=>11947,23369=>11948,23370=>11949,23371=>11950,23373=>11951,23374=>11952,23375=>11953,23378=>11954,23382=>11955,23390=>11956,23392=>11957,23393=>11958,23399=>11959,23400=>11960,23405=>11961,23406=>11962,23407=>11963,23410=>11964,23412=>11965,23414=>11966,23415=>11967,23417=>11968,23419=>11969,23420=>11970,23422=>11971,23426=>11972,23430=>11973,23434=>11974,23437=>11975,23438=>11976,23440=>11977,23441=>11978,23442=>11979,23444=>11980,23446=>11981,23455=>11982,23463=>11983,23464=>11984,23465=>11985,23468=>11986,23469=>11987,23470=>11988,23471=>11989,23473=>11990,23474=>11991,23479=>11992,23482=>11993,23483=>11994,23484=>11995,23488=>11996,23489=>11997,23491=>11998,23496=>11999,23497=>12000,23498=>12001,23499=>12002,23501=>12003,23502=>12004,23503=>12005,23505=>12006,23508=>12007,23509=>12008,23510=>12009,23511=>12010,23512=>12011,23513=>12012,23514=>12013,23515=>12014,23516=>12015,23520=>12016,23523=>12017,23530=>12018,23533=>12019,23535=>12020,23537=>12021,23538=>12022,23539=>12023,23540=>12024,23543=>12025,23549=>12026,23550=>12027,23552=>12028,23554=>12029,23555=>12030,23557=>12031,23564=>12032,23568=>12033,23570=>12034,23571=>12035,23575=>12036,23577=>12037,23579=>12038,23582=>12039,23583=>12040,23584=>12041,23585=>12042,23587=>12043,23590=>12044,23592=>12045,23593=>12046,23594=>12047,23595=>12048,23597=>12049,23598=>12050,23599=>12051,23600=>12052,23602=>12053,23603=>12054,23605=>12055,23606=>12056,23619=>12057,23620=>12058,23622=>12059,23623=>12060,23628=>12061,23629=>12062,23634=>12063,23635=>12064,23636=>12065,23638=>12066,23639=>12067,23640=>12068,23642=>12069,23643=>12070,23644=>12071,23645=>12072,23647=>12073,23655=>12074,23657=>12075,23658=>12076,23659=>12077,23661=>12078,23664=>12079,23666=>12080,23667=>12081,23668=>12082,23669=>12083,23670=>12084,23671=>12085,23672=>12086,23675=>12087,23676=>12088,23677=>12089,23678=>12090,23680=>12091,23683=>12092,23684=>12093,23685=>12094,23686=>12095,23687=>12096,23689=>12097,23690=>12098,23691=>12099,23694=>12100,23695=>12101,23698=>12102,23699=>12103,23701=>12104,23709=>12105,23710=>12106,23711=>12107,23712=>12108,23716=>12109,23717=>12110,23718=>12111,23719=>12112,23720=>12113,23722=>12114,23726=>12115,23727=>12116,23728=>12117,23730=>12118,23732=>12119,23734=>12120,23737=>12121,23738=>12122,23739=>12123,23740=>12124,23742=>12125,23744=>12126,23746=>12127,23747=>12128,23749=>12129,23750=>12130,23751=>12131,23752=>12132,23753=>12133,23754=>12134,23756=>12135,23757=>12136,23758=>12137,23759=>12138,23760=>12139,23761=>12140,23763=>12141,23764=>12142,23765=>12143,23766=>12144,23767=>12145,23768=>12146,23770=>12147,23771=>12148,23772=>12149,23773=>12150,23774=>12151,23775=>12152,23776=>12153,23778=>12154,23779=>12155,23783=>12156,23785=>12157,23787=>12158,23788=>12159,23790=>12160,23791=>12161,23793=>12162,23794=>12163,23795=>12164,23797=>12165,23799=>12166,23800=>12167,23801=>12168,23802=>12169,23804=>12170,23806=>12171,23807=>12172,23808=>12173,23809=>12174,23812=>12175,23813=>12176,23816=>12177,23817=>12178,23818=>12179,23819=>12180,23820=>12181,23823=>12182,23824=>12183,23825=>12184,23826=>12185,23827=>12186,23829=>12187,23832=>12188,23833=>12189,23834=>12190,23836=>12191,23837=>12192,23839=>12193,23840=>12194,23841=>12195,23842=>12196,23843=>12197,23845=>12198,23848=>12199,23850=>12200,23851=>12201,23855=>12202,23856=>12203,23857=>12204,23858=>12205,23859=>12206,23861=>12207,23862=>12208,23863=>12209,23864=>12210,23865=>12211,23866=>12212,23867=>12213,23868=>12214,23871=>12215,23872=>12216,23873=>12217,23874=>12218,23875=>12219,23876=>12220,23877=>12221,23878=>12222,23880=>12223,23881=>12224,23885=>12225,23886=>12226,23887=>12227,23889=>12228,23890=>12229,23891=>12230,23892=>12231,23893=>12232,23894=>12233,23895=>12234,23897=>12235,23898=>12236,23900=>12237,23902=>12238,23903=>12239,23904=>12240,23905=>12241,23906=>12242,23907=>12243,23908=>12244,23909=>12245,23910=>12246,23911=>12247,23912=>12248,23914=>12249,23917=>12250,23918=>12251,23920=>12252,23921=>12253,23922=>12254,23923=>12255,23925=>12256,23926=>12257,23927=>12258,23928=>12259,23929=>12260,23930=>12261,23931=>12262,23932=>12263,23933=>12264,23934=>12265,23935=>12266,23936=>12267,23939=>12268,23941=>12269,23942=>12270,23944=>12271,23945=>12272,23946=>12273,23947=>12274,23948=>12275,23949=>12276,23950=>12277,23951=>12278,23952=>12279,23953=>12280,23954=>12281,23955=>12282,23956=>12283,23957=>12284,23958=>12285,23960=>12286,23962=>12287,23963=>12288,23964=>12289,23966=>12290,23967=>12291,23969=>12292,23970=>12293,23971=>12294,23972=>12295,23973=>12296,23974=>12297,23976=>12298,23977=>12299,23978=>12300,23979=>12301,23980=>12302,23981=>12303,23982=>12304,23983=>12305,23984=>12306,23985=>12307,23986=>12308,23987=>12309,23988=>12310,23989=>12311,23990=>12312,23993=>12313,23995=>12314,23997=>12315,23998=>12316,23999=>12317,24000=>12318,24001=>12319,24002=>12320,24003=>12321,24004=>12322,24006=>12323,24007=>12324,24008=>12325,24009=>12326,24010=>12327,24012=>12328,24014=>12329,24015=>12330,24016=>12331,24017=>12332,24019=>12333,24021=>12334,24022=>12335,24023=>12336,24024=>12337,24025=>12338,24026=>12339,24028=>12340,24031=>12341,24032=>12342,24035=>12343,24036=>12344,24042=>12345,24044=>12346,24045=>12347,24053=>12348,24054=>12349,24056=>12350,24057=>12351,24058=>12352,24059=>12353,24060=>12354,24063=>12355,24064=>12356,24068=>12357,24071=>12358,24073=>12359,24074=>12360,24075=>12361,24077=>12362,24078=>12363,24082=>12364,24083=>12365,24087=>12366,24094=>12367,24095=>12368,24096=>12369,24097=>12370,24098=>12371,24099=>12372,24100=>12373,24104=>12374,24105=>12375,24106=>12376,24108=>12377,24111=>12378,24112=>12379,24114=>12380,24116=>12381,24117=>12382,24121=>12383,24122=>12384,24126=>12385,24127=>12386,24129=>12387,24134=>12388,24135=>12389,24136=>12390,24137=>12391,24138=>12392,24139=>12393,24141=>12394,24142=>12395,24143=>12396,24144=>12397,24145=>12398,24146=>12399,24147=>12400,24150=>12401,24153=>12402,24154=>12403,24156=>12404,24157=>12405,24160=>12406,24164=>12407,24165=>12408,24166=>12409,24167=>12410,24168=>12411,24169=>12412,24170=>12413,24173=>12414,24174=>12415,24175=>12416,24176=>12417,24177=>12418,24181=>12419,24183=>12420,24193=>12421,24194=>12422,24195=>12423,24197=>12424,24200=>12425,24201=>12426,24204=>12427,24205=>12428,24206=>12429,24210=>12430,24216=>12431,24219=>12432,24221=>12433,24225=>12434,24226=>12435,24227=>12436,24228=>12437,24232=>12438,24233=>12439,24234=>12440,24236=>12441,24238=>12442,24239=>12443,24240=>12444,24241=>12445,24242=>12446,24244=>12447,24250=>12448,24251=>12449,24252=>12450,24253=>12451,24255=>12452,24256=>12453,24257=>12454,24258=>12455,24259=>12456,24260=>12457,24261=>12458,24262=>12459,24263=>12460,24264=>12461,24267=>12462,24268=>12463,24269=>12464,24270=>12465,24271=>12466,24272=>12467,24276=>12468,24277=>12469,24279=>12470,24280=>12471,24281=>12472,24282=>12473,24284=>12474,24285=>12475,24286=>12476,24292=>12477,24293=>12478,24294=>12479,24295=>12480,24297=>12481,24299=>12482,24301=>12483,24302=>12484,24303=>12485,24304=>12486,24305=>12487,24306=>12488,24309=>12489,24312=>12490,24313=>12491,24315=>12492,24316=>12493,24317=>12494,24325=>12495,24326=>12496,24327=>12497,24329=>12498,24332=>12499,24333=>12500,24334=>12501,24336=>12502,24338=>12503,24340=>12504,24342=>12505,24345=>12506,24346=>12507,24348=>12508,24349=>12509,24350=>12510,24353=>12511,24354=>12512,24355=>12513,24356=>12514,24360=>12515,24363=>12516,24364=>12517,24366=>12518,24368=>12519,24370=>12520,24372=>12521,24374=>12522,24375=>12523,24376=>12524,24379=>12525,24381=>12526,24382=>12527,24383=>12528,24385=>12529,24386=>12530,24387=>12531,24388=>12532,24389=>12533,24391=>12534,24393=>12535,24394=>12536,24395=>12537,24397=>12538,24399=>12539,24401=>12540,24404=>12541,24410=>12542,24411=>12543,24412=>12544,24414=>12545,24415=>12546,24416=>12547,24419=>12548,24421=>12549,24423=>12550,24424=>12551,24427=>12552,24430=>12553,24431=>12554,24434=>12555,24436=>12556,24437=>12557,24438=>12558,24440=>12559,24442=>12560,24445=>12561,24446=>12562,24447=>12563,24451=>12564,24454=>12565,24461=>12566,24462=>12567,24463=>12568,24467=>12569,24468=>12570,24470=>12571,24474=>12572,24475=>12573,24477=>12574,24479=>12575,24482=>12576,24483=>12577,24484=>12578,24485=>12579,24486=>12580,24487=>12581,24491=>12582,24492=>12583,24495=>12584,24496=>12585,24497=>12586,24498=>12587,24499=>12588,24500=>12589,24502=>12590,24504=>12591,24506=>12592,24507=>12593,24510=>12594,24511=>12595,24512=>12596,24513=>12597,24514=>12598,24519=>12599,24520=>12600,24522=>12601,24523=>12602,24526=>12603,24531=>12604,24532=>12605,24533=>12606,24538=>12607,24539=>12608,24540=>12609,24542=>12610,24543=>12611,24546=>12612,24547=>12613,24549=>12614,24550=>12615,24552=>12616,24553=>12617,24556=>12618,24559=>12619,24560=>12620,24562=>12621,24563=>12622,24564=>12623,24566=>12624,24567=>12625,24569=>12626,24570=>12627,24572=>12628,24583=>12629,24584=>12630,24585=>12631,24587=>12632,24588=>12633,24592=>12634,24593=>12635,24595=>12636,24599=>12637,24600=>12638,24602=>12639,24606=>12640,24607=>12641,24610=>12642,24611=>12643,24612=>12644,24620=>12645,24621=>12646,24622=>12647,24624=>12648,24625=>12649,24626=>12650,24627=>12651,24628=>12652,24630=>12653,24631=>12654,24632=>12655,24633=>12656,24634=>12657,24637=>12658,24638=>12659,24640=>12660,24644=>12661,24645=>12662,24646=>12663,24647=>12664,24648=>12665,24649=>12666,24650=>12667,24652=>12668,24654=>12669,24655=>12670,24657=>12671,24659=>12672,24660=>12673,24662=>12674,24663=>12675,24664=>12676,24667=>12677,24668=>12678,24670=>12679,24671=>12680,24672=>12681,24673=>12682,24677=>12683,24678=>12684,24686=>12685,24689=>12686,24690=>12687,24692=>12688,24693=>12689,24695=>12690,24702=>12691,24704=>12692,24705=>12693,24706=>12694,24709=>12695,24710=>12696,24711=>12697,24712=>12698,24714=>12699,24715=>12700,24718=>12701,24719=>12702,24720=>12703,24721=>12704,24723=>12705,24725=>12706,24727=>12707,24728=>12708,24729=>12709,24732=>12710,24734=>12711,24737=>12712,24738=>12713,24740=>12714,24741=>12715,24743=>12716,24745=>12717,24746=>12718,24750=>12719,24752=>12720,24755=>12721,24759=>12722,24761=>12723,24762=>12724,24765=>12725,24766=>12726,24767=>12727,24768=>12728,24769=>12729,24770=>12730,24771=>12731,24772=>12732,24775=>12733,24776=>12734,24777=>12735,24780=>12736,24781=>12737,24782=>12738,24783=>12739,24784=>12740,24786=>12741,24787=>12742,24788=>12743,24790=>12744,24791=>12745,24793=>12746,24795=>12747,24798=>12748,24802=>12749,24803=>12750,24804=>12751,24805=>12752,24810=>12753,24821=>12754,24823=>12755,24824=>12756,24828=>12757,24829=>12758,24830=>12759,24831=>12760,24834=>12761,24835=>12762,24836=>12763,24837=>12764,24839=>12765,24842=>12766,24843=>12767,24844=>12768,24848=>12769,24849=>12770,24850=>12771,24851=>12772,24852=>12773,24854=>12774,24855=>12775,24856=>12776,24857=>12777,24861=>12778,24862=>12779,24865=>12780,24866=>12781,24869=>12782,24872=>12783,24873=>12784,24874=>12785,24876=>12786,24877=>12787,24878=>12788,24879=>12789,24880=>12790,24881=>12791,24882=>12792,24883=>12793,24885=>12794,24886=>12795,24888=>12796,24889=>12797,24890=>12798,24891=>12799,24892=>12800,24893=>12801,24896=>12802,24897=>12803,24898=>12804,24899=>12805,24900=>12806,24901=>12807,24902=>12808,24903=>12809,24905=>12810,24909=>12811,24911=>12812,24912=>12813,24914=>12814,24915=>12815,24916=>12816,24918=>12817,24919=>12818,24921=>12819,24923=>12820,24924=>12821,24926=>12822,24928=>12823,24929=>12824,24933=>12825,24934=>12826,24937=>12827,24940=>12828,24941=>12829,24943=>12830,24945=>12831,24946=>12832,24948=>12833,24952=>12834,24953=>12835,24954=>12836,24955=>12837,24956=>12838,24957=>12839,24958=>12840,24959=>12841,24960=>12842,24961=>12843,24963=>12844,24964=>12845,24965=>12846,24966=>12847,24967=>12848,24968=>12849,24969=>12850,24972=>12851,24973=>12852,24975=>12853,24979=>12854,24981=>12855,24982=>12856,24983=>12857,24984=>12858,24985=>12859,24987=>12860,24988=>12861,24990=>12862,24991=>12863,24992=>12864,24993=>12865,24994=>12866,24995=>12867,24997=>12868,24998=>12869,25002=>12870,25005=>12871,25007=>12872,25008=>12873,25009=>12874,25011=>12875,25012=>12876,25013=>12877,25016=>12878,25017=>12879,25018=>12880,25019=>12881,25020=>12882,25021=>12883,25023=>12884,25024=>12885,25025=>12886,25027=>12887,25028=>12888,25029=>12889,25030=>12890,25037=>12891,25038=>12892,25039=>12893,25040=>12894,25043=>12895,25045=>12896,25046=>12897,25047=>12898,25048=>12899,25049=>12900,25050=>12901,25051=>12902,25052=>12903,25053=>12904,25056=>12905,25057=>12906,25058=>12907,25060=>12908,25061=>12909,25063=>12910,25065=>12911,25066=>12912,25067=>12913,25068=>12914,25069=>12915,25070=>12916,25071=>12917,25072=>12918,25073=>12919,25075=>12920,25076=>12921,25081=>12922,25083=>12923,25085=>12924,25089=>12925,25090=>12926,25091=>12927,25092=>12928,25093=>12929,25097=>12930,25107=>12931,25113=>12932,25116=>12933,25117=>12934,25118=>12935,25120=>12936,25123=>12937,25126=>12938,25128=>12939,25129=>12940,25131=>12941,25133=>12942,25135=>12943,25137=>12944,25141=>12945,12094=>12946,25142=>12946,25144=>12947,25145=>12948,25146=>12949,25147=>12950,25148=>12951,25154=>12952,25156=>12953,25157=>12954,25158=>12955,25162=>12956,25167=>12957,25168=>12958,25173=>12959,25174=>12960,25175=>12961,25177=>12962,25178=>12963,25180=>12964,25181=>12965,25182=>12966,25183=>12967,25184=>12968,25185=>12969,25186=>12970,25188=>12971,25189=>12972,25192=>12973,25201=>12974,25202=>12975,25204=>12976,25205=>12977,25207=>12978,25208=>12979,25210=>12980,25211=>12981,25213=>12982,25217=>12983,25218=>12984,25219=>12985,25221=>12986,25222=>12987,25223=>12988,25224=>12989,25227=>12990,25228=>12991,25229=>12992,25230=>12993,25231=>12994,25232=>12995,25236=>12996,25241=>12997,25244=>12998,25245=>12999,25246=>13000,25251=>13001,25254=>13002,25255=>13003,25257=>13004,25258=>13005,25261=>13006,25262=>13007,25263=>13008,25264=>13009,25266=>13010,25267=>13011,25268=>13012,25270=>13013,25271=>13014,25272=>13015,25274=>13016,25278=>13017,25280=>13018,25281=>13019,25283=>13020,25291=>13021,25295=>13022,25297=>13023,25301=>13024,25309=>13025,25310=>13026,25312=>13027,25313=>13028,25316=>13029,25322=>13030,25323=>13031,25328=>13032,25330=>13033,25333=>13034,25336=>13035,25337=>13036,25338=>13037,25339=>13038,25344=>13039,25347=>13040,25348=>13041,25349=>13042,25350=>13043,25354=>13044,25355=>13045,25356=>13046,25357=>13047,25359=>13048,25360=>13049,25362=>13050,25363=>13051,25364=>13052,25365=>13053,25367=>13054,25368=>13055,25369=>13056,25372=>13057,25382=>13058,25383=>13059,25385=>13060,25388=>13061,25389=>13062,25390=>13063,25392=>13064,25393=>13065,25395=>13066,25396=>13067,25397=>13068,25398=>13069,25399=>13070,25400=>13071,25403=>13072,25404=>13073,25407=>13074,25408=>13075,25409=>13076,25412=>13077,25415=>13078,25416=>13079,25418=>13080,25425=>13081,25426=>13082,25427=>13083,25428=>13084,25430=>13085,25431=>13086,25432=>13087,25433=>13088,25434=>13089,25435=>13090,25436=>13091,25437=>13092,25440=>13093,25444=>13094,25445=>13095,25446=>13096,25450=>13097,25452=>13098,25455=>13099,25456=>13100,25459=>13101,25460=>13102,25461=>13103,25464=>13104,25465=>13105,25468=>13106,25469=>13107,25470=>13108,25471=>13109,25473=>13110,25477=>13111,25478=>13112,25483=>13113,25485=>13114,25489=>13115,25491=>13116,25492=>13117,25493=>13118,25495=>13119,25497=>13120,25498=>13121,25499=>13122,25500=>13123,25501=>13124,25502=>13125,25503=>13126,25505=>13127,25508=>13128,25510=>13129,25515=>13130,25519=>13131,25521=>13132,25522=>13133,25525=>13134,25526=>13135,25529=>13136,25531=>13137,25533=>13138,25535=>13139,25537=>13140,25538=>13141,25539=>13142,25541=>13143,25543=>13144,25544=>13145,25546=>13146,25547=>13147,25548=>13148,25553=>13149,25555=>13150,25556=>13151,25557=>13152,25559=>13153,25560=>13154,25561=>13155,25563=>13156,25564=>13157,25565=>13158,25567=>13159,25570=>13160,25572=>13161,25573=>13162,25574=>13163,25575=>13164,25576=>13165,25579=>13166,25580=>13167,25583=>13168,25584=>13169,25585=>13170,25587=>13171,25589=>13172,25591=>13173,25593=>13174,25594=>13175,25595=>13176,25596=>13177,25598=>13178,25603=>13179,25604=>13180,25606=>13181,25607=>13182,25608=>13183,25609=>13184,25610=>13185,25614=>13186,25617=>13187,25618=>13188,25621=>13189,25622=>13190,25624=>13191,25625=>13192,25626=>13193,25629=>13194,25631=>13195,25634=>13196,25635=>13197,25636=>13198,25637=>13199,25639=>13200,25640=>13201,25641=>13202,25643=>13203,25646=>13204,25647=>13205,25648=>13206,25649=>13207,25650=>13208,25651=>13209,25653=>13210,25655=>13211,25656=>13212,25657=>13213,25659=>13214,25660=>13215,25662=>13216,25664=>13217,25666=>13218,25667=>13219,25673=>13220,25675=>13221,25676=>13222,25677=>13223,25678=>13224,25679=>13225,25680=>13226,25683=>13227,25685=>13228,25686=>13229,25687=>13230,25689=>13231,25690=>13232,25691=>13233,25693=>13234,25696=>13235,25697=>13236,25698=>13237,25699=>13238,25700=>13239,25701=>13240,25702=>13241,25704=>13242,25706=>13243,25707=>13244,25708=>13245,25710=>13246,25712=>13247,25713=>13248,25714=>13249,25716=>13250,25717=>13251,25719=>13252,25724=>13253,25725=>13254,25726=>13255,25727=>13256,25728=>13257,25729=>13258,25731=>13259,25734=>13260,25737=>13261,25738=>13262,25739=>13263,25740=>13264,25741=>13265,25742=>13266,25743=>13267,25744=>13268,25748=>13269,25751=>13270,25752=>13271,25754=>13272,25755=>13273,25756=>13274,25757=>13275,25760=>13276,25761=>13277,25762=>13278,25766=>13279,25767=>13280,25768=>13281,25770=>13282,25775=>13283,25777=>13284,25780=>13285,25782=>13286,25785=>13287,25789=>13288,25795=>13289,25798=>13290,25800=>13291,25801=>13292,25804=>13293,25807=>13294,25809=>13295,25811=>13296,25813=>13297,25814=>13298,25817=>13299,25819=>13300,25820=>13301,25821=>13302,25823=>13303,25825=>13304,25827=>13305,25829=>13306,25831=>13307,25832=>13308,25833=>13309,25834=>13310,25835=>13311,25837=>13312,25838=>13313,25843=>13314,25845=>13315,25846=>13316,25848=>13317,25849=>13318,25853=>13319,25855=>13320,25857=>13321,25858=>13322,25859=>13323,25861=>13324,25863=>13325,25864=>13326,25866=>13327,25867=>13328,25868=>13329,25869=>13330,25870=>13331,25872=>13332,25873=>13333,25875=>13334,25877=>13335,25879=>13336,25882=>13337,25884=>13338,25886=>13339,25887=>13340,25888=>13341,25889=>13342,25894=>13343,25895=>13344,25896=>13345,25897=>13346,25901=>13347,25904=>13348,25905=>13349,25906=>13350,25907=>13351,25911=>13352,25914=>13353,25916=>13354,25917=>13355,25920=>13356,25921=>13357,25922=>13358,25923=>13359,25924=>13360,25926=>13361,25927=>13362,25930=>13363,25931=>13364,25933=>13365,25934=>13366,25936=>13367,25938=>13368,25939=>13369,25940=>13370,25944=>13371,25946=>13372,25948=>13373,25951=>13374,25952=>13375,25953=>13376,25956=>13377,25957=>13378,25959=>13379,25960=>13380,25961=>13381,25962=>13382,25965=>13383,25966=>13384,25967=>13385,25969=>13386,25971=>13387,25974=>13388,25977=>13389,25978=>13390,25979=>13391,25980=>13392,25981=>13393,25982=>13394,25983=>13395,25984=>13396,25985=>13397,25988=>13398,25989=>13399,25990=>13400,25992=>13401,25993=>13402,25994=>13403,25997=>13404,25998=>13405,25999=>13406,26002=>13407,26004=>13408,26006=>13409,26008=>13410,26010=>13411,26013=>13412,26014=>13413,26016=>13414,26018=>13415,26019=>13416,26022=>13417,26024=>13418,26026=>13419,26030=>13420,26033=>13421,26034=>13422,26035=>13423,26036=>13424,26037=>13425,26038=>13426,26040=>13427,26042=>13428,26043=>13429,26046=>13430,26047=>13431,26048=>13432,26050=>13433,26055=>13434,26056=>13435,26057=>13436,26058=>13437,26061=>13438,26064=>13439,26065=>13440,26067=>13441,26068=>13442,26069=>13443,26072=>13444,26073=>13445,26074=>13446,26075=>13447,26076=>13448,26077=>13449,26078=>13450,26079=>13451,26081=>13452,26083=>13453,26084=>13454,26090=>13455,26091=>13456,26098=>13457,26099=>13458,26100=>13459,26101=>13460,26104=>13461,26105=>13462,26107=>13463,26108=>13464,26109=>13465,26110=>13466,26111=>13467,26113=>13468,26116=>13469,26117=>13470,26119=>13471,26120=>13472,26121=>13473,26123=>13474,26125=>13475,26128=>13476,26129=>13477,26130=>13478,26134=>13479,26135=>13480,26136=>13481,26138=>13482,26139=>13483,26140=>13484,26142=>13485,26145=>13486,26146=>13487,26147=>13488,26148=>13489,26150=>13490,26153=>13491,26154=>13492,26155=>13493,26156=>13494,26158=>13495,26160=>13496,26162=>13497,26163=>13498,26167=>13499,26168=>13500,26169=>13501,26170=>13502,26171=>13503,26173=>13504,26175=>13505,26176=>13506,26180=>13507,26181=>13508,26182=>13509,26183=>13510,26184=>13511,26185=>13512,26186=>13513,26189=>13514,26190=>13515,26192=>13516,26193=>13517,26200=>13518,26201=>13519,26203=>13520,26204=>13521,26206=>13522,26208=>13523,26210=>13524,26211=>13525,26213=>13526,26215=>13527,26217=>13528,26218=>13529,26219=>13530,26220=>13531,26221=>13532,26225=>13533,26226=>13534,26227=>13535,26229=>13536,26232=>13537,26233=>13538,26235=>13539,26236=>13540,26237=>13541,26239=>13542,26240=>13543,26241=>13544,26243=>13545,26245=>13546,26246=>13547,26250=>13548,26251=>13549,26253=>13550,26254=>13551,26255=>13552,26256=>13553,26258=>13554,26259=>13555,26260=>13556,26261=>13557,26264=>13558,26265=>13559,26266=>13560,26267=>13561,26268=>13562,26270=>13563,26271=>13564,26272=>13565,26273=>13566,26275=>13567,26276=>13568,26277=>13569,26278=>13570,26281=>13571,26282=>13572,26284=>13573,26285=>13574,26287=>13575,26288=>13576,26289=>13577,26290=>13578,26291=>13579,26293=>13580,26294=>13581,26295=>13582,26296=>13583,26298=>13584,26299=>13585,26300=>13586,26301=>13587,26303=>13588,26304=>13589,26305=>13590,26306=>13591,26307=>13592,26309=>13593,26312=>13594,26314=>13595,26315=>13596,26316=>13597,26317=>13598,26318=>13599,26319=>13600,26320=>13601,26321=>13602,26322=>13603,26323=>13604,26324=>13605,26325=>13606,26327=>13607,26328=>13608,26330=>13609,26334=>13610,26335=>13611,26337=>13612,26338=>13613,26339=>13614,26340=>13615,26341=>13616,26343=>13617,26344=>13618,26346=>13619,26347=>13620,26349=>13621,26350=>13622,26351=>13623,26353=>13624,26357=>13625,26358=>13626,26362=>13627,26363=>13628,26365=>13629,26369=>13630,26370=>13631,26372=>13632,26373=>13633,26374=>13634,26375=>13635,26380=>13636,26382=>13637,26383=>13638,26385=>13639,26386=>13640,26387=>13641,26390=>13642,26392=>13643,26393=>13644,26394=>13645,26396=>13646,26398=>13647,26400=>13648,26401=>13649,26402=>13650,26403=>13651,26404=>13652,26405=>13653,26409=>13654,26414=>13655,26416=>13656,26418=>13657,26419=>13658,26422=>13659,26423=>13660,26424=>13661,26425=>13662,26427=>13663,26428=>13664,26430=>13665,26431=>13666,26433=>13667,26436=>13668,26437=>13669,26439=>13670,26442=>13671,26443=>13672,26445=>13673,26450=>13674,26452=>13675,26453=>13676,26455=>13677,26456=>13678,26457=>13679,26458=>13680,26459=>13681,26461=>13682,26466=>13683,26467=>13684,26468=>13685,26470=>13686,26471=>13687,26475=>13688,26476=>13689,26478=>13690,26484=>13691,26486=>13692,26488=>13693,26489=>13694,26490=>13695,26491=>13696,26493=>13697,26496=>13698,26498=>13699,26499=>13700,26501=>13701,26502=>13702,26504=>13703,26506=>13704,26508=>13705,26509=>13706,26510=>13707,26511=>13708,26513=>13709,26514=>13710,26515=>13711,26516=>13712,26518=>13713,26521=>13714,26523=>13715,26527=>13716,26528=>13717,26529=>13718,26532=>13719,26534=>13720,26537=>13721,26540=>13722,26542=>13723,26545=>13724,26546=>13725,26548=>13726,26553=>13727,26554=>13728,26555=>13729,26556=>13730,26557=>13731,26558=>13732,26559=>13733,26560=>13734,26562=>13735,26565=>13736,26566=>13737,26567=>13738,26568=>13739,26569=>13740,26570=>13741,26571=>13742,26572=>13743,26573=>13744,26574=>13745,26581=>13746,26582=>13747,26583=>13748,26587=>13749,26591=>13750,26593=>13751,26595=>13752,26596=>13753,26598=>13754,26599=>13755,26600=>13756,26602=>13757,26603=>13758,26605=>13759,26606=>13760,26610=>13761,26613=>13762,26614=>13763,26615=>13764,26616=>13765,26617=>13766,26618=>13767,26619=>13768,26620=>13769,26622=>13770,26625=>13771,26626=>13772,26627=>13773,26628=>13774,26630=>13775,26637=>13776,26640=>13777,26642=>13778,26644=>13779,26645=>13780,26648=>13781,26649=>13782,26650=>13783,26651=>13784,26652=>13785,26654=>13786,26655=>13787,26656=>13788,26658=>13789,26659=>13790,26660=>13791,26661=>13792,26662=>13793,26663=>13794,26664=>13795,26667=>13796,26668=>13797,26669=>13798,26670=>13799,26671=>13800,26672=>13801,26673=>13802,26676=>13803,26677=>13804,26678=>13805,26682=>13806,26683=>13807,26687=>13808,26695=>13809,26699=>13810,26701=>13811,26703=>13812,26706=>13813,26710=>13814,26711=>13815,26712=>13816,26713=>13817,26714=>13818,26715=>13819,26716=>13820,26717=>13821,26718=>13822,26719=>13823,26730=>13824,26732=>13825,26733=>13826,26734=>13827,26735=>13828,26736=>13829,26737=>13830,26738=>13831,26739=>13832,26741=>13833,26744=>13834,26745=>13835,26746=>13836,26747=>13837,26748=>13838,26749=>13839,26750=>13840,26751=>13841,26752=>13842,26754=>13843,26756=>13844,26759=>13845,26760=>13846,26761=>13847,26762=>13848,26763=>13849,26764=>13850,26765=>13851,26766=>13852,26768=>13853,26769=>13854,26770=>13855,26772=>13856,26773=>13857,26774=>13858,26777=>13859,26778=>13860,26779=>13861,26780=>13862,26782=>13863,26784=>13864,26785=>13865,26787=>13866,26788=>13867,26789=>13868,26793=>13869,26794=>13870,26795=>13871,26796=>13872,26798=>13873,26801=>13874,26802=>13875,26804=>13876,26806=>13877,26807=>13878,26808=>13879,26809=>13880,26810=>13881,26811=>13882,26812=>13883,26813=>13884,26814=>13885,26815=>13886,26817=>13887,26819=>13888,26820=>13889,26821=>13890,26822=>13891,26823=>13892,26824=>13893,26826=>13894,26828=>13895,26830=>13896,26831=>13897,26832=>13898,26833=>13899,26835=>13900,26836=>13901,26841=>13902,26843=>13903,26844=>13904,26845=>13905,26846=>13906,26849=>13907,26850=>13908,26852=>13909,26853=>13910,26854=>13911,26856=>13912,26857=>13913,26858=>13914,26859=>13915,26860=>13916,26861=>13917,26863=>13918,26866=>13919,26867=>13920,26868=>13921,26870=>13922,26871=>13923,26872=>13924,26875=>13925,26877=>13926,26878=>13927,26879=>13928,26880=>13929,26882=>13930,26883=>13931,26884=>13932,26886=>13933,26887=>13934,26888=>13935,26889=>13936,26890=>13937,26892=>13938,26897=>13939,26899=>13940,26900=>13941,26901=>13942,26902=>13943,26903=>13944,26904=>13945,26905=>13946,26906=>13947,26907=>13948,26908=>13949,26909=>13950,26910=>13951,26913=>13952,26914=>13953,26915=>13954,26917=>13955,26918=>13956,26919=>13957,26920=>13958,26921=>13959,26922=>13960,26923=>13961,26924=>13962,26926=>13963,26927=>13964,26929=>13965,26930=>13966,26931=>13967,26933=>13968,26934=>13969,26935=>13970,26936=>13971,26938=>13972,26939=>13973,26940=>13974,26942=>13975,26944=>13976,26945=>13977,26947=>13978,26948=>13979,26949=>13980,26950=>13981,26951=>13982,26952=>13983,26953=>13984,26955=>13985,26956=>13986,26957=>13987,26958=>13988,26959=>13989,26960=>13990,26961=>13991,26962=>13992,26965=>13993,26966=>13994,26968=>13995,26969=>13996,26971=>13997,26972=>13998,26975=>13999,26977=>14000,26978=>14001,26980=>14002,26981=>14003,26983=>14004,26985=>14005,26986=>14006,26988=>14007,26991=>14008,26992=>14009,26994=>14010,26995=>14011,26996=>14012,26998=>14013,27002=>14014,27003=>14015,27005=>14016,27006=>14017,27007=>14018,27009=>14019,27011=>14020,27013=>14021,27018=>14022,27019=>14023,27020=>14024,27022=>14025,27023=>14026,27024=>14027,27025=>14028,27026=>14029,27027=>14030,27030=>14031,27031=>14032,27033=>14033,27034=>14034,27037=>14035,27038=>14036,27039=>14037,27040=>14038,27041=>14039,27042=>14040,27043=>14041,27044=>14042,27045=>14043,27046=>14044,27049=>14045,27052=>14046,27055=>14047,27056=>14048,27058=>14049,27059=>14050,27061=>14051,27062=>14052,27064=>14053,27065=>14054,27066=>14055,27068=>14056,27069=>14057,27070=>14058,27072=>14059,27074=>14060,27075=>14061,27076=>14062,27077=>14063,27078=>14064,27079=>14065,27080=>14066,27081=>14067,27087=>14068,27089=>14069,27090=>14070,27091=>14071,27093=>14072,27094=>14073,27095=>14074,27096=>14075,27097=>14076,27098=>14077,27100=>14078,27101=>14079,27102=>14080,27105=>14081,27106=>14082,27107=>14083,27108=>14084,27109=>14085,27110=>14086,27112=>14087,27113=>14088,27114=>14089,27115=>14090,27116=>14091,27118=>14092,27119=>14093,27120=>14094,27121=>14095,27124=>14096,27125=>14097,27126=>14098,27127=>14099,27128=>14100,27129=>14101,27130=>14102,27131=>14103,27132=>14104,27134=>14105,27136=>14106,27139=>14107,27140=>14108,27142=>14109,27143=>14110,27144=>14111,27145=>14112,27147=>14113,27148=>14114,27149=>14115,27150=>14116,27151=>14117,27152=>14118,27153=>14119,27154=>14120,27156=>14121,27157=>14122,27158=>14123,27162=>14124,27163=>14125,27164=>14126,27165=>14127,27168=>14128,27170=>14129,27172=>14130,27173=>14131,27174=>14132,27175=>14133,27177=>14134,27179=>14135,27180=>14136,27181=>14137,27182=>14138,27184=>14139,27186=>14140,27187=>14141,27188=>14142,27190=>14143,27191=>14144,27195=>14145,27196=>14146,27199=>14147,27200=>14148,27201=>14149,27202=>14150,27203=>14151,27205=>14152,27206=>14153,27209=>14154,27210=>14155,27212=>14156,27213=>14157,27214=>14158,27215=>14159,27217=>14160,27218=>14161,27219=>14162,27220=>14163,27221=>14164,27222=>14165,27223=>14166,27226=>14167,27228=>14168,27229=>14169,27230=>14170,27232=>14171,27235=>14172,27236=>14173,27238=>14174,27239=>14175,27240=>14176,27241=>14177,27242=>14178,27243=>14179,27244=>14180,27245=>14181,27246=>14182,27247=>14183,27248=>14184,27250=>14185,27251=>14186,27252=>14187,27253=>14188,27254=>14189,27255=>14190,27256=>14191,27258=>14192,27259=>14193,27261=>14194,27262=>14195,27263=>14196,27265=>14197,27266=>14198,27267=>14199,27269=>14200,27270=>14201,27271=>14202,27272=>14203,27274=>14204,27275=>14205,27276=>14206,27277=>14207,27279=>14208,27282=>14209,27283=>14210,27285=>14211,27286=>14212,27288=>14213,27289=>14214,27290=>14215,27291=>14216,27293=>14217,27294=>14218,27295=>14219,27297=>14220,27300=>14221,27301=>14222,27302=>14223,27303=>14224,27304=>14225,27306=>14226,27309=>14227,27310=>14228,27312=>14229,27313=>14230,27314=>14231,27316=>14232,27317=>14233,27318=>14234,27319=>14235,27321=>14236,27322=>14237,27324=>14238,27325=>14239,27326=>14240,27327=>14241,27328=>14242,27329=>14243,27330=>14244,27332=>14245,27333=>14246,27334=>14247,27335=>14248,27336=>14249,27337=>14250,27338=>14251,27339=>14252,27340=>14253,27341=>14254,27342=>14255,27343=>14256,27344=>14257,27345=>14258,27346=>14259,27348=>14260,27349=>14261,27350=>14262,27351=>14263,27352=>14264,27353=>14265,27356=>14266,27360=>14267,27361=>14268,27362=>14269,27363=>14270,27364=>14271,27365=>14272,27366=>14273,27369=>14274,27371=>14275,27373=>14276,27374=>14277,27375=>14278,27376=>14279,27377=>14280,27378=>14281,27380=>14282,27381=>14283,27382=>14284,27383=>14285,27385=>14286,27386=>14287,27388=>14288,27389=>14289,27390=>14290,27391=>14291,27392=>14292,27393=>14293,27394=>14294,27395=>14295,27397=>14296,27398=>14297,27399=>14298,27400=>14299,27401=>14300,27403=>14301,27404=>14302,27405=>14303,27406=>14304,27408=>14305,27409=>14306,27411=>14307,27412=>14308,27413=>14309,27415=>14310,27416=>14311,27417=>14312,27418=>14313,27419=>14314,27420=>14315,27421=>14316,27423=>14317,27429=>14318,27430=>14319,27432=>14320,27433=>14321,27434=>14322,27435=>14323,27436=>14324,27437=>14325,27438=>14326,27439=>14327,27440=>14328,27441=>14329,27443=>14330,27444=>14331,27445=>14332,27446=>14333,27448=>14334,27451=>14335,27452=>14336,27455=>14337,27456=>14338,27457=>14339,27458=>14340,27460=>14341,27461=>14342,27464=>14343,27466=>14344,27467=>14345,27469=>14346,27470=>14347,27471=>14348,27473=>14349,27474=>14350,27475=>14351,27476=>14352,27477=>14353,27478=>14354,27479=>14355,27480=>14356,27482=>14357,27483=>14358,27484=>14359,27485=>14360,27486=>14361,27488=>14362,27496=>14363,27497=>14364,27499=>14365,27500=>14366,27501=>14367,27502=>14368,27503=>14369,27504=>14370,27505=>14371,27507=>14372,27508=>14373,27509=>14374,27510=>14375,27514=>14376,27517=>14377,27518=>14378,27519=>14379,27520=>14380,27525=>14381,27528=>14382,27532=>14383,27534=>14384,27535=>14385,27536=>14386,27537=>14387,27540=>14388,27541=>14389,27543=>14390,27545=>14391,27548=>14392,27549=>14393,27551=>14394,27552=>14395,27554=>14396,27555=>14397,27557=>14398,27558=>14399,27559=>14400,27560=>14401,27561=>14402,27564=>14403,27565=>14404,27568=>14405,27569=>14406,27574=>14407,27576=>14408,27577=>14409,27580=>14410,27581=>14411,27582=>14412,27584=>14413,27587=>14414,27588=>14415,27591=>14416,27592=>14417,27593=>14418,27594=>14419,27596=>14420,27598=>14421,27600=>14422,27601=>14423,27608=>14424,27610=>14425,27612=>14426,27613=>14427,27614=>14428,27615=>14429,27616=>14430,27618=>14431,27619=>14432,27620=>14433,27621=>14434,27622=>14435,27623=>14436,27624=>14437,27625=>14438,27628=>14439,27629=>14440,27630=>14441,27632=>14442,27633=>14443,27634=>14444,27636=>14445,27638=>14446,27639=>14447,27640=>14448,27642=>14449,27643=>14450,27644=>14451,27646=>14452,27648=>14453,27649=>14454,27650=>14455,27651=>14456,27652=>14457,27657=>14458,27658=>14459,27659=>14460,27662=>14461,27666=>14462,27671=>14463,27676=>14464,27677=>14465,27678=>14466,27680=>14467,27685=>14468,27693=>14469,27697=>14470,27699=>14471,27702=>14472,27703=>14473,27705=>14474,27706=>14475,27707=>14476,27708=>14477,27710=>14478,27711=>14479,27715=>14480,27716=>14481,27717=>14482,27720=>14483,27723=>14484,27724=>14485,27725=>14486,27726=>14487,27727=>14488,27729=>14489,27730=>14490,27731=>14491,27734=>14492,27736=>14493,27737=>14494,27738=>14495,27746=>14496,27747=>14497,27749=>14498,27750=>14499,27751=>14500,27755=>14501,27756=>14502,27757=>14503,27758=>14504,27759=>14505,27761=>14506,27763=>14507,27765=>14508,27767=>14509,27768=>14510,27770=>14511,27771=>14512,27772=>14513,27775=>14514,27776=>14515,27780=>14516,27783=>14517,27786=>14518,27787=>14519,27789=>14520,27790=>14521,27793=>14522,27794=>14523,27797=>14524,27798=>14525,27799=>14526,27800=>14527,27802=>14528,27804=>14529,27805=>14530,27806=>14531,27808=>14532,27810=>14533,27816=>14534,27820=>14535,27823=>14536,27824=>14537,27828=>14538,27829=>14539,27830=>14540,27831=>14541,27834=>14542,27840=>14543,27841=>14544,27842=>14545,27843=>14546,27846=>14547,27847=>14548,27848=>14549,27851=>14550,27853=>14551,27854=>14552,27855=>14553,27857=>14554,27858=>14555,27864=>14556,27865=>14557,27866=>14558,27868=>14559,27869=>14560,27871=>14561,27876=>14562,27878=>14563,27879=>14564,27881=>14565,27884=>14566,27885=>14567,27890=>14568,27892=>14569,27897=>14570,27903=>14571,27904=>14572,27906=>14573,27907=>14574,27909=>14575,27910=>14576,27912=>14577,27913=>14578,27914=>14579,27917=>14580,27919=>14581,27920=>14582,27921=>14583,27923=>14584,27924=>14585,27925=>14586,27926=>14587,27928=>14588,27932=>14589,27933=>14590,27935=>14591,27936=>14592,27937=>14593,27938=>14594,27939=>14595,27940=>14596,27942=>14597,27944=>14598,27945=>14599,27948=>14600,27949=>14601,27951=>14602,27952=>14603,27956=>14604,27958=>14605,27959=>14606,27960=>14607,27962=>14608,27967=>14609,27968=>14610,27970=>14611,27972=>14612,27977=>14613,27980=>14614,27984=>14615,27989=>14616,27990=>14617,27991=>14618,27992=>14619,27995=>14620,27997=>14621,27999=>14622,28001=>14623,28002=>14624,28004=>14625,28005=>14626,28007=>14627,28008=>14628,28011=>14629,28012=>14630,28013=>14631,28016=>14632,28017=>14633,28018=>14634,28019=>14635,28021=>14636,28022=>14637,28026=>14638,28027=>14639,28029=>14640,28030=>14641,28031=>14642,28032=>14643,28033=>14644,28035=>14645,28036=>14646,28038=>14647,28042=>14648,28043=>14649,28045=>14650,28047=>14651,28048=>14652,28050=>14653,28054=>14654,28055=>14655,28056=>14656,28057=>14657,28058=>14658,28060=>14659,28066=>14660,28069=>14661,28076=>14662,28077=>14663,28080=>14664,28081=>14665,28083=>14666,28084=>14667,28086=>14668,28087=>14669,28089=>14670,28090=>14671,28091=>14672,28092=>14673,28093=>14674,28094=>14675,28097=>14676,28098=>14677,28099=>14678,28104=>14679,28105=>14680,28106=>14681,28109=>14682,28110=>14683,28111=>14684,28112=>14685,28114=>14686,28115=>14687,28116=>14688,28117=>14689,28119=>14690,28122=>14691,28123=>14692,28124=>14693,28127=>14694,28130=>14695,28131=>14696,28133=>14697,28135=>14698,28136=>14699,28137=>14700,28141=>14701,28143=>14702,28144=>14703,28146=>14704,28148=>14705,28152=>14706,28157=>14707,28158=>14708,28159=>14709,28160=>14710,28161=>14711,28162=>14712,28163=>14713,28164=>14714,28166=>14715,28167=>14716,28168=>14717,28169=>14718,28171=>14719,28175=>14720,28178=>14721,28179=>14722,28181=>14723,28184=>14724,28185=>14725,28187=>14726,28188=>14727,28190=>14728,28191=>14729,28194=>14730,28199=>14731,28200=>14732,28202=>14733,28206=>14734,28208=>14735,28209=>14736,28211=>14737,28213=>14738,28214=>14739,28215=>14740,28217=>14741,28219=>14742,28220=>14743,28221=>14744,28223=>14745,28224=>14746,28225=>14747,28226=>14748,28229=>14749,28230=>14750,28231=>14751,28232=>14752,28233=>14753,28234=>14754,28235=>14755,28236=>14756,28239=>14757,28240=>14758,28241=>14759,28242=>14760,28245=>14761,28247=>14762,28249=>14763,28250=>14764,28252=>14765,28253=>14766,28256=>14767,28257=>14768,28258=>14769,28259=>14770,28260=>14771,28261=>14772,28262=>14773,28263=>14774,28264=>14775,28265=>14776,28266=>14777,28268=>14778,28269=>14779,28272=>14780,28273=>14781,28274=>14782,28275=>14783,28276=>14784,28277=>14785,28278=>14786,28279=>14787,28280=>14788,28281=>14789,28282=>14790,28283=>14791,28284=>14792,28285=>14793,28288=>14794,28289=>14795,28290=>14796,28292=>14797,28295=>14798,28296=>14799,28298=>14800,28299=>14801,28300=>14802,28301=>14803,28302=>14804,28305=>14805,28306=>14806,28307=>14807,28308=>14808,28309=>14809,28311=>14810,28313=>14811,28314=>14812,28315=>14813,28318=>14814,28320=>14815,28321=>14816,28323=>14817,28324=>14818,28326=>14819,28328=>14820,28329=>14821,28331=>14822,28332=>14823,28333=>14824,28334=>14825,28336=>14826,28339=>14827,28341=>14828,28344=>14829,28345=>14830,28348=>14831,28350=>14832,28351=>14833,28352=>14834,28355=>14835,28358=>14836,28360=>14837,28361=>14838,28362=>14839,28365=>14840,28368=>14841,28370=>14842,28374=>14843,28376=>14844,28377=>14845,28379=>14846,28380=>14847,28381=>14848,28387=>14849,28391=>14850,28394=>14851,28395=>14852,28397=>14853,28398=>14854,28400=>14855,28401=>14856,28403=>14857,28405=>14858,28406=>14859,28410=>14860,28411=>14861,28412=>14862,28413=>14863,28414=>14864,28416=>14865,28419=>14866,28420=>14867,28421=>14868,28423=>14869,28424=>14870,28426=>14871,28427=>14872,28428=>14873,28429=>14874,28430=>14875,28432=>14876,28433=>14877,28434=>14878,28438=>14879,28439=>14880,28440=>14881,28441=>14882,28443=>14883,28444=>14884,28445=>14885,28446=>14886,28447=>14887,28449=>14888,28453=>14889,28454=>14890,28455=>14891,28456=>14892,28462=>14893,28464=>14894,28468=>14895,28469=>14896,28471=>14897,28473=>14898,28474=>14899,28475=>14900,28476=>14901,28477=>14902,28480=>14903,28482=>14904,28483=>14905,28484=>14906,28485=>14907,28488=>14908,28489=>14909,28490=>14910,28492=>14911,28494=>14912,28495=>14913,28496=>14914,28498=>14915,28499=>14916,28501=>14917,28502=>14918,28503=>14919,28506=>14920,28507=>14921,28509=>14922,28511=>14923,28512=>14924,28513=>14925,28515=>14926,28517=>14927,28519=>14928,28520=>14929,28521=>14930,28522=>14931,28523=>14932,28524=>14933,28529=>14934,28531=>14935,28533=>14936,28534=>14937,28537=>14938,28539=>14939,28541=>14940,28542=>14941,28545=>14942,28546=>14943,28547=>14944,28549=>14945,28554=>14946,28555=>14947,28559=>14948,28560=>14949,28561=>14950,28562=>14951,28563=>14952,28564=>14953,28565=>14954,28566=>14955,28568=>14956,28569=>14957,28570=>14958,28571=>14959,28573=>14960,28574=>14961,28575=>14962,28578=>14963,28579=>14964,28581=>14965,28582=>14966,28584=>14967,28586=>14968,28587=>14969,28588=>14970,28589=>14971,28591=>14972,28592=>14973,28594=>14974,28596=>14975,28597=>14976,28599=>14977,28600=>14978,28602=>14979,28603=>14980,28604=>14981,28605=>14982,28606=>14983,28607=>14984,28612=>14985,28613=>14986,28614=>14987,28615=>14988,28616=>14989,28618=>14990,28619=>14991,28620=>14992,28621=>14993,28622=>14994,28623=>14995,28624=>14996,28627=>14997,28628=>14998,28630=>14999,28631=>15000,28633=>15001,28634=>15002,28636=>15003,28637=>15004,28642=>15005,28643=>15006,28645=>15007,28646=>15008,28647=>15009,28648=>15010,28649=>15011,28650=>15012,28652=>15013,28653=>15014,28658=>15015,28659=>15016,28660=>15017,28661=>15018,28662=>15019,28663=>15020,28664=>15021,28665=>15022,28667=>15023,28669=>15024,28671=>15025,28672=>15026,28673=>15027,28674=>15028,28675=>15029,28676=>15030,28679=>15031,28680=>15032,28682=>15033,28684=>15034,28685=>15035,28686=>15036,28688=>15037,28690=>15038,28691=>15039,28692=>15040,28694=>15041,28695=>15042,28697=>15043,28700=>15044,28702=>15045,28705=>15046,28706=>15047,28708=>15048,28709=>15049,28710=>15050,28713=>15051,28714=>15052,28715=>15053,28716=>15054,28717=>15055,28718=>15056,28719=>15057,28721=>15058,28723=>15059,28724=>15060,28726=>15061,28727=>15062,28728=>15063,28730=>15064,28731=>15065,28732=>15066,28733=>15067,28735=>15068,28736=>15069,28737=>15070,28738=>15071,28741=>15072,28742=>15073,28743=>15074,28744=>15075,28745=>15076,28746=>15077,28747=>15078,28749=>15079,28750=>15080,28752=>15081,28754=>15082,28755=>15083,28756=>15084,28758=>15085,28759=>15086,28761=>15087,28762=>15088,28763=>15089,28764=>15090,28767=>15091,28768=>15092,28769=>15093,28770=>15094,28773=>15095,28774=>15096,28776=>15097,28777=>15098,28778=>15099,28782=>15100,28785=>15101,28786=>15102,28787=>15103,28788=>15104,28791=>15105,28793=>15106,28794=>15107,28795=>15108,28797=>15109,28801=>15110,28802=>15111,28803=>15112,28804=>15113,28806=>15114,28807=>15115,28808=>15116,28811=>15117,28812=>15118,28813=>15119,28815=>15120,28816=>15121,28817=>15122,28819=>15123,28823=>15124,28824=>15125,28826=>15126,28827=>15127,28830=>15128,28831=>15129,28832=>15130,28833=>15131,28834=>15132,28835=>15133,28836=>15134,28837=>15135,28838=>15136,28839=>15137,28840=>15138,28841=>15139,28842=>15140,28848=>15141,28850=>15142,28852=>15143,28853=>15144,28854=>15145,28858=>15146,28862=>15147,28863=>15148,28868=>15149,28869=>15150,28870=>15151,28871=>15152,28873=>15153,28875=>15154,28876=>15155,28877=>15156,28878=>15157,28880=>15158,28881=>15159,28882=>15160,28883=>15161,28884=>15162,28885=>15163,28886=>15164,28887=>15165,28890=>15166,28892=>15167,28893=>15168,28894=>15169,28896=>15170,28897=>15171,28898=>15172,28899=>15173,28901=>15174,28906=>15175,28910=>15176,28912=>15177,28913=>15178,28914=>15179,28915=>15180,28917=>15181,28918=>15182,28920=>15183,28922=>15184,28923=>15185,28924=>15186,28926=>15187,28927=>15188,28928=>15189,28929=>15190,28930=>15191,28931=>15192,28932=>15193,28933=>15194,28934=>15195,28935=>15196,28936=>15197,28939=>15198,28940=>15199,28941=>15200,28942=>15201,28943=>15202,28945=>15203,28946=>15204,28948=>15205,28951=>15206,28955=>15207,28956=>15208,28957=>15209,28958=>15210,28959=>15211,28960=>15212,28962=>15213,28963=>15214,28964=>15215,28965=>15216,28967=>15217,28968=>15218,28969=>15219,28970=>15220,28971=>15221,28972=>15222,28973=>15223,28974=>15224,28978=>15225,28979=>15226,28980=>15227,28981=>15228,28983=>15229,28984=>15230,28985=>15231,28986=>15232,28987=>15233,28988=>15234,28989=>15235,28990=>15236,28991=>15237,28992=>15238,28993=>15239,28994=>15240,28995=>15241,28996=>15242,28998=>15243,28999=>15244,29000=>15245,29003=>15246,29005=>15247,29007=>15248,29008=>15249,29009=>15250,29011=>15251,29012=>15252,29013=>15253,29014=>15254,29015=>15255,29016=>15256,29017=>15257,29018=>15258,29019=>15259,29021=>15260,29023=>15261,29024=>15262,29025=>15263,29027=>15264,29029=>15265,29034=>15266,29035=>15267,29037=>15268,29039=>15269,29040=>15270,29041=>15271,29044=>15272,29045=>15273,29046=>15274,29047=>15275,29049=>15276,29051=>15277,29052=>15278,29054=>15279,29055=>15280,29056=>15281,29057=>15282,29058=>15283,29059=>15284,29061=>15285,29062=>15286,29063=>15287,29064=>15288,29065=>15289,29067=>15290,29068=>15291,29069=>15292,29070=>15293,29072=>15294,29073=>15295,29075=>15296,29077=>15297,29078=>15298,29082=>15299,29083=>15300,29084=>15301,29085=>15302,29086=>15303,29089=>15304,29090=>15305,29091=>15306,29092=>15307,29093=>15308,29094=>15309,29095=>15310,29097=>15311,29098=>15312,29099=>15313,29101=>15314,29102=>15315,29103=>15316,29104=>15317,29106=>15318,29108=>15319,29110=>15320,29111=>15321,29112=>15322,29114=>15323,29115=>15324,29116=>15325,29117=>15326,29119=>15327,29120=>15328,29122=>15329,29124=>15330,29125=>15331,29126=>15332,29127=>15333,29129=>15334,29130=>15335,29131=>15336,29132=>15337,29133=>15338,29135=>15339,29136=>15340,29137=>15341,29139=>15342,29142=>15343,29143=>15344,29144=>15345,29146=>15346,29147=>15347,29149=>15348,29150=>15349,29153=>15350,29154=>15351,29155=>15352,29156=>15353,29160=>15354,29161=>15355,29162=>15356,29163=>15357,29164=>15358,29167=>15359,29168=>15360,29169=>15361,29170=>15362,29171=>15363,29173=>15364,29174=>15365,29175=>15366,29176=>15367,29178=>15368,29179=>15369,29181=>15370,29183=>15371,29184=>15372,29185=>15373,29186=>15374,29187=>15375,29188=>15376,29189=>15377,29191=>15378,29192=>15379,29193=>15380,29194=>15381,29195=>15382,29196=>15383,29198=>15384,29199=>15385,29201=>15386,29202=>15387,29203=>15388,29204=>15389,29205=>15390,29206=>15391,29207=>15392,29208=>15393,29209=>15394,29210=>15395,29212=>15396,29214=>15397,29215=>15398,29216=>15399,29217=>15400,29218=>15401,29219=>15402,29220=>15403,29221=>15404,29222=>15405,29223=>15406,29225=>15407,29227=>15408,29229=>15409,29230=>15410,29231=>15411,29235=>15412,29236=>15413,29244=>15414,29248=>15415,29249=>15416,29250=>15417,29251=>15418,29252=>15419,29253=>15420,29254=>15421,29257=>15422,29258=>15423,29259=>15424,29262=>15425,29263=>15426,29264=>15427,29265=>15428,29267=>15429,29268=>15430,29269=>15431,29271=>15432,29274=>15433,29276=>15434,29278=>15435,29280=>15436,29283=>15437,29284=>15438,29285=>15439,29288=>15440,29290=>15441,29291=>15442,29292=>15443,29293=>15444,29296=>15445,29297=>15446,29299=>15447,29300=>15448,29302=>15449,29303=>15450,29304=>15451,29307=>15452,29308=>15453,29314=>15454,29315=>15455,29317=>15456,29318=>15457,29319=>15458,29320=>15459,29321=>15460,29324=>15461,29326=>15462,29328=>15463,29329=>15464,29331=>15465,29332=>15466,29333=>15467,29335=>15468,29336=>15469,29337=>15470,29338=>15471,29339=>15472,29340=>15473,29341=>15474,29342=>15475,29344=>15476,29345=>15477,29347=>15478,29348=>15479,29349=>15480,29350=>15481,29352=>15482,29353=>15483,29354=>15484,29355=>15485,29358=>15486,29361=>15487,29362=>15488,29363=>15489,29365=>15490,29370=>15491,29371=>15492,29372=>15493,29373=>15494,29374=>15495,29375=>15496,29381=>15497,29382=>15498,29383=>15499,29385=>15500,29386=>15501,29387=>15502,29388=>15503,29391=>15504,29393=>15505,29395=>15506,29396=>15507,29397=>15508,29398=>15509,29400=>15510,29402=>15511,29403=>15512,29404=>15513,29405=>15514,29407=>15515,29410=>15516,29411=>15517,29412=>15518,29413=>15519,29414=>15520,29415=>15521,29418=>15522,29419=>15523,29429=>15524,29430=>15525,29438=>15526,29439=>15527,29440=>15528,29442=>15529,29444=>15530,29445=>15531,29446=>15532,29447=>15533,29448=>15534,29449=>15535,29451=>15536,29452=>15537,29453=>15538,29455=>15539,29456=>15540,29457=>15541,29458=>15542,29460=>15543,29464=>15544,29465=>15545,29466=>15546,29471=>15547,29472=>15548,29475=>15549,29476=>15550,29478=>15551,29479=>15552,29480=>15553,29485=>15554,29487=>15555,29488=>15556,29490=>15557,29491=>15558,29493=>15559,29498=>15560,29500=>15561,29501=>15562,29504=>15563,29506=>15564,29507=>15565,29510=>15566,29511=>15567,29512=>15568,29513=>15569,29514=>15570,29515=>15571,29516=>15572,29518=>15573,29519=>15574,29521=>15575,29523=>15576,29524=>15577,29525=>15578,29526=>15579,29528=>15580,29529=>15581,29530=>15582,29531=>15583,29532=>15584,29533=>15585,29534=>15586,29535=>15587,29537=>15588,29538=>15589,29539=>15590,29540=>15591,29541=>15592,29542=>15593,29543=>15594,29545=>15595,29550=>15596,29553=>15597,29555=>15598,29556=>15599,29558=>15600,29561=>15601,29565=>15602,29567=>15603,29569=>15604,29570=>15605,29571=>15606,29573=>15607,29574=>15608,29576=>15609,29578=>15610,29580=>15611,29581=>15612,29583=>15613,29584=>15614,29586=>15615,29587=>15616,29588=>15617,29589=>15618,29591=>15619,29592=>15620,29593=>15621,29594=>15622,29596=>15623,29597=>15624,29598=>15625,29600=>15626,29601=>15627,29603=>15628,29604=>15629,29605=>15630,29606=>15631,29607=>15632,29608=>15633,29610=>15634,29612=>15635,29613=>15636,29617=>15637,29620=>15638,29621=>15639,29622=>15640,29624=>15641,29625=>15642,29628=>15643,29629=>15644,29630=>15645,29631=>15646,29633=>15647,29635=>15648,29636=>15649,29637=>15650,29638=>15651,29639=>15652,29643=>15653,29644=>15654,29646=>15655,29650=>15656,29651=>15657,29652=>15658,29653=>15659,29654=>15660,29655=>15661,29656=>15662,29658=>15663,29659=>15664,29660=>15665,29661=>15666,29663=>15667,29665=>15668,29666=>15669,29667=>15670,29668=>15671,29670=>15672,29672=>15673,29674=>15674,29675=>15675,29676=>15676,29678=>15677,29679=>15678,29680=>15679,29681=>15680,29683=>15681,29684=>15682,29685=>15683,29686=>15684,29687=>15685,29688=>15686,29689=>15687,29690=>15688,29691=>15689,29692=>15690,29693=>15691,29695=>15692,29696=>15693,29697=>15694,29698=>15695,29700=>15696,29703=>15697,29704=>15698,29707=>15699,29708=>15700,29709=>15701,29710=>15702,29713=>15703,29714=>15704,29715=>15705,29716=>15706,29717=>15707,29718=>15708,29719=>15709,29720=>15710,29721=>15711,29724=>15712,29725=>15713,29726=>15714,29727=>15715,29728=>15716,29729=>15717,29731=>15718,29732=>15719,29735=>15720,29737=>15721,29739=>15722,29741=>15723,29743=>15724,29745=>15725,29746=>15726,29751=>15727,29752=>15728,29753=>15729,29754=>15730,29755=>15731,29757=>15732,29758=>15733,29760=>15734,29762=>15735,29763=>15736,29764=>15737,29765=>15738,29766=>15739,29767=>15740,29768=>15741,29769=>15742,29770=>15743,29772=>15744,29773=>15745,29774=>15746,29775=>15747,29776=>15748,29777=>15749,29778=>15750,29779=>15751,29780=>15752,29782=>15753,29784=>15754,29789=>15755,29792=>15756,29793=>15757,29794=>15758,29796=>15759,29797=>15760,29798=>15761,29799=>15762,29800=>15763,29803=>15764,29804=>15765,29806=>15766,29807=>15767,29809=>15768,29810=>15769,29811=>15770,29812=>15771,29813=>15772,29816=>15773,29817=>15774,29818=>15775,29819=>15776,29820=>15777,29821=>15778,29823=>15779,29826=>15780,29828=>15781,29829=>15782,29830=>15783,29832=>15784,29834=>15785,29836=>15786,29837=>15787,29839=>15788,29841=>15789,29842=>15790,29843=>15791,29844=>15792,29845=>15793,29846=>15794,29847=>15795,29848=>15796,29849=>15797,29850=>15798,29851=>15799,29853=>15800,29855=>15801,29856=>15802,29857=>15803,29858=>15804,29860=>15805,29861=>15806,29866=>15807,29867=>15808,29868=>15809,29869=>15810,29870=>15811,29871=>15812,29873=>15813,29874=>15814,29875=>15815,29876=>15816,29877=>15817,29878=>15818,29879=>15819,29880=>15820,29881=>15821,29883=>15822,29884=>15823,29886=>15824,29887=>15825,29888=>15826,29889=>15827,29890=>15828,29891=>15829,29892=>15830,29893=>15831,29894=>15832,29895=>15833,29896=>15834,29897=>15835,29899=>15836,29900=>15837,29901=>15838,29902=>15839,29904=>15840,29905=>15841,29907=>15842,29909=>15843,29910=>15844,29911=>15845,29912=>15846,29913=>15847,29915=>15848,29917=>15849,29919=>15850,29921=>15851,29925=>15852,29927=>15853,29928=>15854,29929=>15855,29930=>15856,29931=>15857,29932=>15858,29933=>15859,29936=>15860,29937=>15861,29938=>15862,29939=>15863,29941=>15864,29944=>15865,29945=>15866,29946=>15867,29947=>15868,29948=>15869,29949=>15870,29950=>15871,29952=>15872,29953=>15873,29954=>15874,29955=>15875,29957=>15876,29958=>15877,29959=>15878,29960=>15879,29961=>15880,29962=>15881,29963=>15882,29966=>15883,29968=>15884,29970=>15885,29972=>15886,29973=>15887,29974=>15888,29975=>15889,29979=>15890,29981=>15891,29982=>15892,29984=>15893,29985=>15894,29986=>15895,29988=>15896,29990=>15897,29991=>15898,29994=>15899,29998=>15900,30004=>15901,30006=>15902,30009=>15903,30012=>15904,30013=>15905,30015=>15906,30017=>15907,30018=>15908,30019=>15909,30020=>15910,30022=>15911,30023=>15912,30025=>15913,30026=>15914,30029=>15915,30032=>15916,30033=>15917,30034=>15918,30035=>15919,30037=>15920,30038=>15921,30039=>15922,30040=>15923,30046=>15924,30047=>15925,30048=>15926,30049=>15927,30051=>15928,30052=>15929,30055=>15930,30056=>15931,30057=>15932,30060=>15933,30061=>15934,30062=>15935,30063=>15936,30064=>15937,30065=>15938,30067=>15939,30069=>15940,30071=>15941,30074=>15942,30075=>15943,30076=>15944,30077=>15945,30078=>15946,30080=>15947,30081=>15948,30082=>15949,30084=>15950,30085=>15951,30088=>15952,30089=>15953,30090=>15954,30092=>15955,30093=>15956,30094=>15957,30096=>15958,30099=>15959,30101=>15960,30104=>15961,30107=>15962,30108=>15963,30110=>15964,30114=>15965,30118=>15966,30119=>15967,30120=>15968,30121=>15969,30122=>15970,30125=>15971,30134=>15972,30135=>15973,30138=>15974,30139=>15975,30143=>15976,30144=>15977,30145=>15978,30150=>15979,30155=>15980,30156=>15981,30158=>15982,30159=>15983,30160=>15984,30161=>15985,30163=>15986,30167=>15987,30170=>15988,30172=>15989,30173=>15990,30175=>15991,30176=>15992,30177=>15993,30181=>15994,30185=>15995,30188=>15996,30189=>15997,30190=>15998,30191=>15999,30194=>16000,30195=>16001,30197=>16002,30198=>16003,30199=>16004,30200=>16005,30202=>16006,30203=>16007,30205=>16008,30206=>16009,30212=>16010,30214=>16011,30215=>16012,30216=>16013,30217=>16014,30222=>16015,30223=>16016,30225=>16017,30226=>16018,30227=>16019,30228=>16020,30230=>16021,30234=>16022,30236=>16023,30237=>16024,30243=>16025,30248=>16026,30252=>16027,30254=>16028,30255=>16029,30257=>16030,30258=>16031,30262=>16032,30263=>16033,30265=>16034,30266=>16035,30269=>16036,30273=>16037,30276=>16038,30277=>16039,30280=>16040,30282=>16041,30283=>16042,30286=>16043,30287=>16044,30288=>16045,30289=>16046,30290=>16047,30291=>16048,30293=>16049,30295=>16050,30297=>16051,30298=>16052,30299=>16053,30301=>16054,30304=>16055,30305=>16056,30310=>16057,30312=>16058,30314=>16059,30323=>16060,30324=>16061,30325=>16062,12136=>16063,30326=>16063,30327=>16064,30329=>16065,30330=>16066,30335=>16067,30336=>16068,30337=>16069,30339=>16070,30341=>16071,30345=>16072,30346=>16073,30348=>16074,30349=>16075,30351=>16076,30352=>16077,30354=>16078,30356=>16079,30357=>16080,30359=>16081,30360=>16082,30363=>16083,30364=>16084,30365=>16085,30366=>16086,30367=>16087,30368=>16088,30369=>16089,30370=>16090,30371=>16091,30373=>16092,30374=>16093,30375=>16094,30376=>16095,30377=>16096,30378=>16097,30379=>16098,30380=>16099,30381=>16100,30383=>16101,30384=>16102,30387=>16103,30389=>16104,30390=>16105,30391=>16106,30393=>16107,30395=>16108,30396=>16109,30397=>16110,30398=>16111,30400=>16112,30401=>16113,30403=>16114,30404=>16115,30407=>16116,30409=>16117,30411=>16118,30412=>16119,30419=>16120,30421=>16121,30425=>16122,30426=>16123,30428=>16124,30429=>16125,30432=>16126,30434=>16127,30438=>16128,30440=>16129,30441=>16130,30442=>16131,30443=>16132,30444=>16133,30445=>16134,30448=>16135,30451=>16136,30453=>16137,30454=>16138,30455=>16139,30458=>16140,30459=>16141,30461=>16142,30463=>16143,30464=>16144,30466=>16145,30467=>16146,30469=>16147,30470=>16148,30474=>16149,30476=>16150,30478=>16151,30479=>16152,30480=>16153,30481=>16154,30482=>16155,30483=>16156,30484=>16157,30485=>16158,30486=>16159,30487=>16160,30488=>16161,30491=>16162,30492=>16163,30493=>16164,30494=>16165,30497=>16166,30499=>16167,30500=>16168,30501=>16169,30503=>16170,30506=>16171,30507=>16172,30508=>16173,30510=>16174,30512=>16175,30513=>16176,30514=>16177,30515=>16178,30516=>16179,30521=>16180,30523=>16181,30525=>16182,30526=>16183,30527=>16184,30530=>16185,30532=>16186,30533=>16187,30534=>16188,30536=>16189,30537=>16190,30538=>16191,30539=>16192,30540=>16193,30541=>16194,30542=>16195,30546=>16196,30547=>16197,30548=>16198,30549=>16199,30550=>16200,30551=>16201,30552=>16202,30553=>16203,30556=>16204,30557=>16205,30559=>16206,30560=>16207,30564=>16208,30567=>16209,30569=>16210,30570=>16211,30573=>16212,30574=>16213,30575=>16214,30576=>16215,30577=>16216,30578=>16217,30579=>16218,30580=>16219,30581=>16220,30582=>16221,30583=>16222,30584=>16223,30586=>16224,30587=>16225,30588=>16226,30593=>16227,30594=>16228,30595=>16229,30598=>16230,30599=>16231,30600=>16232,30601=>16233,30602=>16234,30603=>16235,30607=>16236,30608=>16237,30611=>16238,30612=>16239,30613=>16240,30614=>16241,30615=>16242,30617=>16243,30618=>16244,30619=>16245,30620=>16246,30621=>16247,30625=>16248,30627=>16249,30628=>16250,30630=>16251,30632=>16252,30635=>16253,30638=>16254,30639=>16255,30641=>16256,30642=>16257,30644=>16258,30646=>16259,30647=>16260,30648=>16261,30649=>16262,30650=>16263,30654=>16264,30656=>16265,30657=>16266,30658=>16267,30659=>16268,30660=>16269,30661=>16270,30662=>16271,30664=>16272,30665=>16273,30666=>16274,30667=>16275,30668=>16276,30670=>16277,30671=>16278,30672=>16279,30673=>16280,30674=>16281,30675=>16282,30676=>16283,30677=>16284,30678=>16285,30680=>16286,30681=>16287,30685=>16288,30686=>16289,30687=>16290,30688=>16291,30689=>16292,30692=>16293,30694=>16294,30696=>16295,30698=>16296,30704=>16297,30705=>16298,30706=>16299,30708=>16300,30709=>16301,30711=>16302,30713=>16303,30714=>16304,30715=>16305,30716=>16306,30723=>16307,30724=>16308,30725=>16309,30726=>16310,30727=>16311,30728=>16312,30730=>16313,30731=>16314,30734=>16315,30735=>16316,30736=>16317,30739=>16318,30741=>16319,30745=>16320,30747=>16321,30750=>16322,30752=>16323,30753=>16324,30754=>16325,30756=>16326,30760=>16327,30762=>16328,30763=>16329,30766=>16330,30767=>16331,30769=>16332,30770=>16333,30771=>16334,30773=>16335,30774=>16336,30781=>16337,30783=>16338,30785=>16339,30786=>16340,30788=>16341,30790=>16342,30792=>16343,30793=>16344,30794=>16345,30795=>16346,30797=>16347,30799=>16348,30801=>16349,30803=>16350,30804=>16351,30808=>16352,30809=>16353,30810=>16354,30811=>16355,30812=>16356,30814=>16357,30815=>16358,30816=>16359,30817=>16360,30818=>16361,30819=>16362,30821=>16363,30822=>16364,30823=>16365,30825=>16366,30832=>16367,30833=>16368,30834=>16369,30835=>16370,30836=>16371,30837=>16372,30838=>16373,30840=>16374,30841=>16375,30842=>16376,30843=>16377,30845=>16378,30846=>16379,30847=>16380,30848=>16381,30849=>16382,30850=>16383,30851=>16384,30852=>16385,30853=>16386,30854=>16387,30856=>16388,30858=>16389,30859=>16390,30863=>16391,30864=>16392,30866=>16393,30868=>16394,30869=>16395,30870=>16396,30873=>16397,30877=>16398,30878=>16399,30880=>16400,30882=>16401,30884=>16402,30886=>16403,30888=>16404,30890=>16405,30891=>16406,30892=>16407,30894=>16408,30895=>16409,30901=>16410,30902=>16411,30903=>16412,30907=>16413,30909=>16414,30911=>16415,30912=>16416,30914=>16417,30915=>16418,30916=>16419,30918=>16420,30919=>16421,30920=>16422,30924=>16423,30925=>16424,30926=>16425,30927=>16426,30929=>16427,30930=>16428,30931=>16429,30934=>16430,30935=>16431,30936=>16432,30939=>16433,30940=>16434,30941=>16435,30942=>16436,30943=>16437,30944=>16438,30945=>16439,30946=>16440,30948=>16441,30949=>16442,30950=>16443,30953=>16444,30954=>16445,30955=>16446,30957=>16447,30958=>16448,30960=>16449,30961=>16450,30963=>16451,30965=>16452,30966=>16453,30968=>16454,30969=>16455,30971=>16456,30972=>16457,30974=>16458,30975=>16459,30976=>16460,30978=>16461,30979=>16462,30980=>16463,30982=>16464,30983=>16465,30984=>16466,30985=>16467,30986=>16468,30987=>16469,30988=>16470,30989=>16471,30991=>16472,30992=>16473,30993=>16474,30994=>16475,30996=>16476,30997=>16477,30998=>16478,30999=>16479,31000=>16480,31002=>16481,31003=>16482,31004=>16483,31005=>16484,31007=>16485,31008=>16486,31009=>16487,31010=>16488,31011=>16489,31013=>16490,31015=>16491,31016=>16492,31017=>16493,31021=>16494,31022=>16495,31023=>16496,31024=>16497,31026=>16498,31027=>16499,31029=>16500,31030=>16501,31031=>16502,31032=>16503,31033=>16504,31037=>16505,31039=>16506,31042=>16507,31043=>16508,31044=>16509,31045=>16510,31047=>16511,31050=>16512,31051=>16513,31052=>16514,31053=>16515,31054=>16516,31055=>16517,31056=>16518,31057=>16519,31058=>16520,31060=>16521,31061=>16522,31064=>16523,31065=>16524,31073=>16525,31075=>16526,31076=>16527,31078=>16528,31081=>16529,31082=>16530,31083=>16531,31084=>16532,31086=>16533,31088=>16534,31089=>16535,31090=>16536,31091=>16537,31092=>16538,31093=>16539,31094=>16540,31097=>16541,31099=>16542,31100=>16543,31101=>16544,31102=>16545,31103=>16546,31106=>16547,31107=>16548,31110=>16549,31111=>16550,31112=>16551,31113=>16552,31115=>16553,31116=>16554,31120=>16555,31121=>16556,31122=>16557,31123=>16558,31124=>16559,31125=>16560,31126=>16561,31127=>16562,31128=>16563,31129=>16564,31131=>16565,31132=>16566,31133=>16567,31134=>16568,31135=>16569,31136=>16570,31137=>16571,31138=>16572,31139=>16573,31140=>16574,31141=>16575,31144=>16576,31145=>16577,31147=>16578,31148=>16579,31149=>16580,31151=>16581,31154=>16582,31156=>16583,31157=>16584,31158=>16585,31159=>16586,12145=>16587,31160=>16587,31164=>16588,31167=>16589,31170=>16590,31172=>16591,31173=>16592,31175=>16593,31176=>16594,31178=>16595,63893=>16595,31180=>16596,31182=>16597,31183=>16598,31184=>16599,31187=>16600,31188=>16601,31190=>16602,31191=>16603,31193=>16604,31194=>16605,31195=>16606,31196=>16607,31197=>16608,31198=>16609,31200=>16610,31201=>16611,31202=>16612,31205=>16613,31208=>16614,31210=>16615,31212=>16616,31214=>16617,31217=>16618,31218=>16619,31219=>16620,31220=>16621,31221=>16622,31222=>16623,31223=>16624,31225=>16625,31226=>16626,31228=>16627,31230=>16628,31231=>16629,31233=>16630,31236=>16631,31237=>16632,31239=>16633,31240=>16634,31241=>16635,31242=>16636,31244=>16637,31247=>16638,31248=>16639,31249=>16640,31250=>16641,31251=>16642,31253=>16643,31254=>16644,31256=>16645,31257=>16646,31259=>16647,31260=>16648,31261=>16649,31263=>16650,31265=>16651,31266=>16652,31268=>16653,31269=>16654,31270=>16655,31271=>16656,31272=>16657,31273=>16658,31274=>16659,31275=>16660,31276=>16661,31277=>16662,31279=>16663,31280=>16664,31282=>16665,31284=>16666,31285=>16667,31286=>16668,31288=>16669,31290=>16670,31294=>16671,31297=>16672,31298=>16673,31299=>16674,31300=>16675,31301=>16676,31303=>16677,31304=>16678,31305=>16679,31306=>16680,31307=>16681,31311=>16682,31312=>16683,31314=>16684,31315=>16685,31316=>16686,31317=>16687,31318=>16688,31320=>16689,31321=>16690,31322=>16691,31323=>16692,31324=>16693,31325=>16694,31326=>16695,31327=>16696,31328=>16697,31331=>16698,31332=>16699,31333=>16700,31334=>16701,31335=>16702,31336=>16703,31338=>16704,31340=>16705,31341=>16706,31342=>16707,31343=>16708,31345=>16709,31346=>16710,31347=>16711,31349=>16712,31355=>16713,31356=>16714,31357=>16715,31358=>16716,31362=>16717,31365=>16718,31367=>16719,31369=>16720,31370=>16721,31371=>16722,31372=>16723,31374=>16724,31375=>16725,31376=>16726,31379=>16727,31380=>16728,31385=>16729,31386=>16730,31387=>16731,31390=>16732,31393=>16733,31394=>16734,31395=>16735,31396=>16736,31399=>16737,31403=>16738,31407=>16739,31408=>16740,31409=>16741,31410=>16742,31412=>16743,31413=>16744,31415=>16745,31416=>16746,31417=>16747,31419=>16748,31420=>16749,31421=>16750,31422=>16751,31424=>16752,31425=>16753,31426=>16754,31427=>16755,31430=>16756,31433=>16757,31436=>16758,31437=>16759,31438=>16760,31439=>16761,31440=>16762,31441=>16763,31442=>16764,31443=>16765,31444=>16766,31445=>16767,31447=>16768,31448=>16769,31450=>16770,31451=>16771,31452=>16772,31453=>16773,31457=>16774,31458=>16775,31460=>16776,31463=>16777,31464=>16778,31465=>16779,31467=>16780,31468=>16781,31470=>16782,31472=>16783,31473=>16784,31474=>16785,31475=>16786,31476=>16787,31477=>16788,31479=>16789,31480=>16790,31483=>16791,31484=>16792,31486=>16793,31488=>16794,31489=>16795,31490=>16796,31493=>16797,31495=>16798,31497=>16799,31500=>16800,31501=>16801,31502=>16802,31504=>16803,31506=>16804,31507=>16805,31510=>16806,31511=>16807,31512=>16808,31514=>16809,31516=>16810,31517=>16811,31519=>16812,31521=>16813,31522=>16814,31523=>16815,31527=>16816,31529=>16817,31533=>16818,31535=>16819,31536=>16820,31538=>16821,31540=>16822,31541=>16823,31542=>16824,31543=>16825,31545=>16826,31547=>16827,31549=>16828,31551=>16829,31552=>16830,31553=>16831,31554=>16832,31555=>16833,31556=>16834,31560=>16835,31562=>16836,31565=>16837,31566=>16838,31571=>16839,31573=>16840,31575=>16841,31577=>16842,31580=>16843,31582=>16844,31583=>16845,31585=>16846,31587=>16847,31588=>16848,31589=>16849,31590=>16850,31592=>16851,31593=>16852,31594=>16853,31595=>16854,31596=>16855,31597=>16856,31599=>16857,31600=>16858,31603=>16859,31604=>16860,31606=>16861,31608=>16862,31610=>16863,31612=>16864,31613=>16865,31615=>16866,31617=>16867,31618=>16868,31619=>16869,31620=>16870,31622=>16871,31623=>16872,31624=>16873,31625=>16874,31626=>16875,31628=>16876,31630=>16877,31631=>16878,31633=>16879,31634=>16880,31635=>16881,31638=>16882,31640=>16883,31641=>16884,31642=>16885,31643=>16886,31646=>16887,31647=>16888,31648=>16889,31651=>16890,31652=>16891,31653=>16892,31662=>16893,31663=>16894,31664=>16895,31666=>16896,31667=>16897,31669=>16898,31670=>16899,31671=>16900,31673=>16901,31674=>16902,31675=>16903,31676=>16904,31677=>16905,31678=>16906,31679=>16907,31682=>16908,31683=>16909,31685=>16910,31688=>16911,31690=>16912,31693=>16913,31694=>16914,31695=>16915,31696=>16916,31698=>16917,31700=>16918,31701=>16919,31702=>16920,31703=>16921,31704=>16922,31707=>16923,31708=>16924,31710=>16925,31711=>16926,31712=>16927,31714=>16928,31715=>16929,31719=>16930,31720=>16931,31723=>16932,31724=>16933,31725=>16934,31727=>16935,31728=>16936,31730=>16937,31732=>16938,31733=>16939,31734=>16940,31736=>16941,31737=>16942,31738=>16943,31739=>16944,31741=>16945,31743=>16946,31745=>16947,31746=>16948,31747=>16949,31748=>16950,31749=>16951,31750=>16952,31752=>16953,31753=>16954,31754=>16955,31758=>16956,31760=>16957,31761=>16958,31762=>16959,31763=>16960,31764=>16961,31765=>16962,31767=>16963,31768=>16964,31769=>16965,31770=>16966,31771=>16967,31772=>16968,31773=>16969,31776=>16970,31778=>16971,31780=>16972,31781=>16973,31784=>16974,31785=>16975,31788=>16976,31789=>16977,31790=>16978,31791=>16979,31792=>16980,31793=>16981,31794=>16982,31795=>16983,31796=>16984,31797=>16985,31798=>16986,31799=>16987,31801=>16988,31802=>16989,31803=>16990,31804=>16991,31810=>16992,31812=>16993,31813=>16994,31814=>16995,31815=>16996,31816=>16997,31817=>16998,31818=>16999,31819=>17000,31822=>17001,31823=>17002,31824=>17003,31825=>17004,31826=>17005,31827=>17006,31828=>17007,31829=>17008,31830=>17009,31831=>17010,31832=>17011,31833=>17012,31834=>17013,31835=>17014,31837=>17015,31838=>17016,31841=>17017,31842=>17018,31843=>17019,31845=>17020,31846=>17021,31847=>17022,31848=>17023,31851=>17024,31853=>17025,31855=>17026,31856=>17027,31857=>17028,31861=>17029,31862=>17030,31863=>17031,31864=>17032,31865=>17033,31866=>17034,31870=>17035,31871=>17036,31872=>17037,31873=>17038,31874=>17039,31875=>17040,31876=>17041,31877=>17042,31878=>17043,31879=>17044,31880=>17045,31882=>17046,31883=>17047,31884=>17048,31885=>17049,31886=>17050,31887=>17051,31888=>17052,31891=>17053,31892=>17054,31894=>17055,31897=>17056,31898=>17057,31899=>17058,31904=>17059,31905=>17060,31907=>17061,31910=>17062,31911=>17063,31912=>17064,31913=>17065,31915=>17066,31916=>17067,31917=>17068,31919=>17069,31920=>17070,31924=>17071,31925=>17072,31926=>17073,31927=>17074,31928=>17075,31930=>17076,31931=>17077,31935=>17078,31936=>17079,31938=>17080,31939=>17081,31940=>17082,31942=>17083,31945=>17084,31947=>17085,31950=>17086,31951=>17087,31952=>17088,31953=>17089,31954=>17090,31955=>17091,31956=>17092,31960=>17093,31962=>17094,31963=>17095,31969=>17096,31970=>17097,31971=>17098,31972=>17099,31973=>17100,31974=>17101,31977=>17102,31978=>17103,31979=>17104,31980=>17105,31981=>17106,31982=>17107,31985=>17108,31987=>17109,31989=>17110,31991=>17111,31994=>17112,31996=>17113,31997=>17114,31999=>17115,32001=>17116,32003=>17117,32012=>17118,32014=>17119,32015=>17120,32017=>17121,32018=>17122,32022=>17123,32024=>17124,32029=>17125,32030=>17126,32031=>17127,32035=>17128,32036=>17129,32037=>17130,32038=>17131,32040=>17132,32041=>17133,32042=>17134,32044=>17135,32045=>17136,32046=>17137,32052=>17138,32053=>17139,32054=>17140,32055=>17141,32056=>17142,32059=>17143,32061=>17144,32062=>17145,32065=>17146,32067=>17147,32069=>17148,32071=>17149,32072=>17150,32073=>17151,32074=>17152,32075=>17153,32076=>17154,32077=>17155,32079=>17156,32081=>17157,32082=>17158,32083=>17159,32084=>17160,32085=>17161,32086=>17162,32087=>17163,32088=>17164,32089=>17165,32090=>17166,32091=>17167,32092=>17168,32095=>17169,32096=>17170,32099=>17171,32100=>17172,32101=>17173,32103=>17174,32105=>17175,32106=>17176,32107=>17177,32108=>17178,32109=>17179,32111=>17180,32112=>17181,32116=>17182,32117=>17183,32120=>17184,32122=>17185,32123=>17186,32124=>17187,32125=>17188,32126=>17189,32127=>17190,32128=>17191,32130=>17192,32132=>17193,32133=>17194,32135=>17195,32138=>17196,32139=>17197,32140=>17198,32141=>17199,32142=>17200,32144=>17201,32145=>17202,32146=>17203,32148=>17204,32149=>17205,32150=>17206,32151=>17207,32152=>17208,32153=>17209,32154=>17210,32155=>17211,32157=>17212,32159=>17213,32160=>17214,32161=>17215,32164=>17216,32165=>17217,32167=>17218,32168=>17219,32169=>17220,32170=>17221,32175=>17222,32181=>17223,32182=>17224,32183=>17225,32188=>17226,32192=>17227,32193=>17228,32194=>17229,32195=>17230,32197=>17231,32198=>17232,32200=>17233,32201=>17234,32204=>17235,32205=>17236,32206=>17237,32207=>17238,32208=>17239,32211=>17240,32213=>17241,32214=>17242,32218=>17243,32219=>17244,32220=>17245,32223=>17246,32226=>17247,32228=>17248,32229=>17249,32231=>17250,32234=>17251,32235=>17252,32237=>17253,32238=>17254,32240=>17255,32243=>17256,32245=>17257,32247=>17258,32248=>17259,32250=>17260,32252=>17261,32253=>17262,32254=>17263,32255=>17264,32256=>17265,32257=>17266,32258=>17267,32259=>17268,32260=>17269,32261=>17270,32262=>17271,32263=>17272,32268=>17273,32269=>17274,32270=>17275,32271=>17276,32274=>17277,32275=>17278,32276=>17279,32277=>17280,32278=>17281,32279=>17282,32280=>17283,32281=>17284,32282=>17285,32284=>17286,32288=>17287,32289=>17288,32290=>17289,32292=>17290,32293=>17291,32294=>17292,32296=>17293,32297=>17294,32298=>17295,32300=>17296,32303=>17297,32304=>17298,32307=>17299,32312=>17300,32314=>17301,32316=>17302,32319=>17303,32320=>17304,32322=>17305,32323=>17306,32324=>17307,32328=>17308,32329=>17309,32330=>17310,32331=>17311,32332=>17312,32333=>17313,32334=>17314,32335=>17315,32336=>17316,32337=>17317,32339=>17318,32342=>17319,32343=>17320,32344=>17321,32345=>17322,32347=>17323,32348=>17324,32349=>17325,32351=>17326,32352=>17327,32353=>17328,32355=>17329,32356=>17330,32357=>17331,32358=>17332,32359=>17333,32360=>17334,32364=>17335,32369=>17336,32370=>17337,32372=>17338,32373=>17339,32374=>17340,32375=>17341,32376=>17342,32378=>17343,32379=>17344,32383=>17345,32384=>17346,32385=>17347,32387=>17348,32388=>17349,32389=>17350,32390=>17351,32391=>17352,32393=>17353,32395=>17354,32398=>17355,32400=>17356,32401=>17357,32402=>17358,32405=>17359,32407=>17360,32409=>17361,32410=>17362,32413=>17363,32414=>17364,32430=>17365,32436=>17366,32443=>17367,32444=>17368,32470=>17369,32484=>17370,32492=>17371,32505=>17372,32522=>17373,32528=>17374,32542=>17375,32567=>17376,32569=>17377,32571=>17378,32572=>17379,32573=>17380,32574=>17381,32575=>17382,32576=>17383,32577=>17384,32579=>17385,32582=>17386,32583=>17387,32584=>17388,32585=>17389,32586=>17390,32587=>17391,32589=>17392,32591=>17393,32594=>17394,32595=>17395,32598=>17396,32601=>17397,32603=>17398,32604=>17399,32605=>17400,32606=>17401,32608=>17402,32611=>17403,32612=>17404,32613=>17405,32614=>17406,32615=>17407,32619=>17408,32620=>17409,32621=>17410,32623=>17411,32627=>17412,32629=>17413,32630=>17414,32632=>17415,32634=>17416,32635=>17417,32636=>17418,32637=>17419,32639=>17420,32640=>17421,32642=>17422,32643=>17423,32644=>17424,32647=>17425,32649=>17426,32651=>17427,32653=>17428,32655=>17429,32656=>17430,32657=>17431,32658=>17432,32659=>17433,32661=>17434,32662=>17435,32663=>17436,32664=>17437,32665=>17438,32667=>17439,32668=>17440,32672=>17441,32674=>17442,32675=>17443,32678=>17444,32680=>17445,32682=>17446,32683=>17447,32684=>17448,32685=>17449,32686=>17450,32689=>17451,32691=>17452,32692=>17453,32693=>17454,32694=>17455,32695=>17456,32698=>17457,32699=>17458,32702=>17459,32704=>17460,32706=>17461,32707=>17462,32708=>17463,32710=>17464,32711=>17465,32712=>17466,32713=>17467,32715=>17468,32717=>17469,32719=>17470,32720=>17471,32721=>17472,32723=>17473,32726=>17474,32727=>17475,32729=>17476,32730=>17477,32731=>17478,32732=>17479,32733=>17480,32734=>17481,32738=>17482,32739=>17483,32740=>17484,32743=>17485,32744=>17486,32746=>17487,32747=>17488,32748=>17489,32749=>17490,32751=>17491,32754=>17492,32756=>17493,32757=>17494,32758=>17495,32759=>17496,32760=>17497,32762=>17498,32765=>17499,32766=>17500,32767=>17501,32770=>17502,32775=>17503,32776=>17504,32777=>17505,32778=>17506,32782=>17507,32783=>17508,32785=>17509,32787=>17510,32794=>17511,32795=>17512,32797=>17513,32798=>17514,32799=>17515,32801=>17516,32803=>17517,32804=>17518,32811=>17519,32813=>17520,32815=>17521,32816=>17522,32818=>17523,32820=>17524,32825=>17525,32826=>17526,32828=>17527,32830=>17528,32832=>17529,32833=>17530,32836=>17531,32837=>17532,32839=>17533,32840=>17534,32841=>17535,32846=>17536,32847=>17537,32848=>17538,32849=>17539,32851=>17540,32853=>17541,32855=>17542,32857=>17543,32859=>17544,32860=>17545,32861=>17546,32863=>17547,32864=>17548,32865=>17549,32866=>17550,32867=>17551,32868=>17552,32869=>17553,32870=>17554,32871=>17555,32872=>17556,32875=>17557,32876=>17558,32877=>17559,32878=>17560,32884=>17561,32888=>17562,32890=>17563,32891=>17564,32892=>17565,32897=>17566,32898=>17567,32904=>17568,32906=>17569,32909=>17570,32910=>17571,32911=>17572,32912=>17573,32913=>17574,32914=>17575,32916=>17576,32917=>17577,32919=>17578,32921=>17579,32926=>17580,32931=>17581,32934=>17582,32935=>17583,32936=>17584,32940=>17585,32944=>17586,32947=>17587,32949=>17588,32950=>17589,32952=>17590,32953=>17591,32955=>17592,32965=>17593,32967=>17594,32968=>17595,32969=>17596,32970=>17597,32971=>17598,32975=>17599,32976=>17600,32977=>17601,32978=>17602,32979=>17603,32980=>17604,32981=>17605,32984=>17606,32991=>17607,32992=>17608,32994=>17609,32995=>17610,32998=>17611,33006=>17612,33013=>17613,33015=>17614,33017=>17615,33019=>17616,33022=>17617,33023=>17618,33024=>17619,33025=>17620,33027=>17621,33028=>17622,33031=>17623,33032=>17624,33035=>17625,33036=>17626,33045=>17627,33047=>17628,33049=>17629,33052=>17630,33053=>17631,33055=>17632,33056=>17633,33057=>17634,33058=>17635,33059=>17636,33060=>17637,33061=>17638,33062=>17639,33063=>17640,33064=>17641,33065=>17642,33066=>17643,33067=>17644,33069=>17645,33070=>17646,33072=>17647,33075=>17648,33076=>17649,33077=>17650,33079=>17651,33082=>17652,33083=>17653,33084=>17654,33085=>17655,33087=>17656,33088=>17657,33089=>17658,33090=>17659,33091=>17660,33092=>17661,33093=>17662,33095=>17663,33097=>17664,33101=>17665,33103=>17666,33106=>17667,33111=>17668,33112=>17669,33115=>17670,33116=>17671,33117=>17672,33118=>17673,33119=>17674,33122=>17675,33123=>17676,33124=>17677,33128=>17678,33130=>17679,33132=>17680,33135=>17681,33138=>17682,33139=>17683,33141=>17684,33142=>17685,33143=>17686,33153=>17687,33155=>17688,33156=>17689,33157=>17690,33158=>17691,33159=>17692,33161=>17693,33163=>17694,33164=>17695,33165=>17696,33166=>17697,33168=>17698,33170=>17699,33171=>17700,33172=>17701,33173=>17702,33174=>17703,33175=>17704,33177=>17705,33182=>17706,33183=>17707,33185=>17708,33186=>17709,33188=>17710,33189=>17711,33191=>17712,33195=>17713,33196=>17714,33197=>17715,33198=>17716,33199=>17717,33200=>17718,33201=>17719,33202=>17720,33204=>17721,33205=>17722,33206=>17723,33207=>17724,33208=>17725,33209=>17726,33212=>17727,33220=>17728,33221=>17729,33223=>17730,33224=>17731,33227=>17732,33230=>17733,33232=>17734,33233=>17735,33234=>17736,33235=>17737,33236=>17738,33237=>17739,33238=>17740,33239=>17741,33241=>17742,33243=>17743,33244=>17744,33245=>17745,33246=>17746,33249=>17747,33250=>17748,33252=>17749,33253=>17750,33254=>17751,33257=>17752,33259=>17753,33262=>17754,33263=>17755,33264=>17756,33265=>17757,33266=>17758,33269=>17759,33270=>17760,33271=>17761,33272=>17762,33273=>17763,33277=>17764,33279=>17765,33283=>17766,33291=>17767,33294=>17768,33295=>17769,33297=>17770,33299=>17771,33301=>17772,33302=>17773,33303=>17774,33304=>17775,33305=>17776,33306=>17777,33309=>17778,33312=>17779,33316=>17780,33317=>17781,33318=>17782,33319=>17783,33321=>17784,33326=>17785,33330=>17786,33338=>17787,33340=>17788,33341=>17789,33343=>17790,33344=>17791,33345=>17792,33346=>17793,33347=>17794,33349=>17795,33350=>17796,33352=>17797,33354=>17798,33356=>17799,33357=>17800,33358=>17801,33360=>17802,33361=>17803,33362=>17804,33363=>17805,33364=>17806,33365=>17807,33366=>17808,33367=>17809,33371=>17810,33372=>17811,33373=>17812,33374=>17813,33376=>17814,33377=>17815,33378=>17816,33379=>17817,33381=>17818,33383=>17819,33385=>17820,33386=>17821,33388=>17822,33389=>17823,33397=>17824,33398=>17825,12171=>17826,33400=>17826,33403=>17827,33404=>17828,33408=>17829,33409=>17830,33411=>17831,33413=>17832,33414=>17833,33415=>17834,33417=>17835,33420=>17836,33424=>17837,33427=>17838,33428=>17839,33429=>17840,33430=>17841,33434=>17842,33435=>17843,33438=>17844,33440=>17845,33442=>17846,33443=>17847,33447=>17848,33458=>17849,33461=>17850,33462=>17851,33466=>17852,33468=>17853,33471=>17854,33472=>17855,33474=>17856,33475=>17857,33477=>17858,33478=>17859,33481=>17860,33488=>17861,33494=>17862,33497=>17863,33498=>17864,33501=>17865,33506=>17866,33512=>17867,33513=>17868,33514=>17869,33516=>17870,33517=>17871,33518=>17872,33520=>17873,33522=>17874,33523=>17875,33525=>17876,33526=>17877,33528=>17878,33530=>17879,33532=>17880,33533=>17881,33534=>17882,33535=>17883,33536=>17884,33546=>17885,33547=>17886,33549=>17887,33552=>17888,33554=>17889,33555=>17890,33558=>17891,33560=>17892,33561=>17893,33565=>17894,33566=>17895,33567=>17896,33568=>17897,33569=>17898,33570=>17899,33571=>17900,33572=>17901,33573=>17902,33574=>17903,33577=>17904,33578=>17905,33582=>17906,33584=>17907,33586=>17908,33591=>17909,33595=>17910,33597=>17911,33598=>17912,33599=>17913,33601=>17914,33602=>17915,33604=>17916,33605=>17917,33608=>17918,33610=>17919,33611=>17920,33612=>17921,33613=>17922,33614=>17923,33619=>17924,33621=>17925,33622=>17926,33623=>17927,33624=>17928,33625=>17929,33629=>17930,33634=>17931,33648=>17932,33649=>17933,33650=>17934,33651=>17935,33652=>17936,33653=>17937,33654=>17938,33657=>17939,33658=>17940,33662=>17941,33663=>17942,33664=>17943,33665=>17944,33666=>17945,33667=>17946,33668=>17947,33671=>17948,33672=>17949,33675=>17950,33676=>17951,33677=>17952,33679=>17953,33680=>17954,33681=>17955,33684=>17956,33685=>17957,33687=>17958,33689=>17959,33690=>17960,33693=>17961,33695=>17962,33697=>17963,33699=>17964,33700=>17965,33701=>17966,33702=>17967,33708=>17968,33709=>17969,33710=>17970,33711=>17971,33717=>17972,33723=>17973,33726=>17974,33727=>17975,33730=>17976,33731=>17977,33732=>17978,33734=>17979,33736=>17980,33737=>17981,33739=>17982,33741=>17983,33742=>17984,33744=>17985,33745=>17986,33746=>17987,33747=>17988,33749=>17989,33751=>17990,33753=>17991,33754=>17992,33755=>17993,33758=>17994,33762=>17995,33763=>17996,33764=>17997,33766=>17998,33767=>17999,33768=>18000,33771=>18001,33772=>18002,33773=>18003,33774=>18004,33779=>18005,33780=>18006,33781=>18007,33782=>18008,33783=>18009,33786=>18010,33787=>18011,33788=>18012,33790=>18013,33791=>18014,33792=>18015,33794=>18016,33797=>18017,33800=>18018,33801=>18019,33808=>18020,33810=>18021,33811=>18022,33812=>18023,33813=>18024,33814=>18025,33815=>18026,33817=>18027,33818=>18028,33819=>18029,33822=>18030,33823=>18031,33824=>18032,33825=>18033,33826=>18034,33827=>18035,33833=>18036,33834=>18037,33835=>18038,33837=>18039,33838=>18040,33839=>18041,33840=>18042,33842=>18043,33843=>18044,33844=>18045,33846=>18046,33847=>18047,33849=>18048,33850=>18049,33851=>18050,33854=>18051,33855=>18052,33856=>18053,33857=>18054,33858=>18055,33859=>18056,33860=>18057,33861=>18058,33863=>18059,33864=>18060,33866=>18061,33867=>18062,33868=>18063,33869=>18064,33870=>18065,33871=>18066,33872=>18067,33875=>18068,33876=>18069,33877=>18070,33878=>18071,33880=>18072,33885=>18073,33886=>18074,33887=>18075,33888=>18076,33890=>18077,33893=>18078,33895=>18079,33896=>18080,33898=>18081,33902=>18082,33904=>18083,33906=>18084,33908=>18085,33913=>18086,33915=>18087,33916=>18088,33917=>18089,33918=>18090,33919=>18091,33920=>18092,33921=>18093,33923=>18094,33924=>18095,33925=>18096,33926=>18097,33930=>18098,33933=>18099,33935=>18100,33936=>18101,33937=>18102,33938=>18103,33941=>18104,33942=>18105,33944=>18106,33946=>18107,33947=>18108,33949=>18109,33950=>18110,33951=>18111,33952=>18112,33954=>18113,33955=>18114,33956=>18115,33957=>18116,33958=>18117,33959=>18118,33960=>18119,33961=>18120,33962=>18121,33963=>18122,33964=>18123,33965=>18124,33966=>18125,33968=>18126,33969=>18127,33971=>18128,33973=>18129,33974=>18130,33975=>18131,33979=>18132,33982=>18133,33986=>18134,33987=>18135,33989=>18136,33990=>18137,33991=>18138,33992=>18139,33996=>18140,33998=>18141,33999=>18142,34002=>18143,34004=>18144,34005=>18145,34007=>18146,34008=>18147,34009=>18148,34010=>18149,34011=>18150,34012=>18151,34014=>18152,34017=>18153,34018=>18154,34020=>18155,34023=>18156,34024=>18157,34025=>18158,34026=>18159,34027=>18160,34029=>18161,34033=>18162,34034=>18163,34035=>18164,34036=>18165,34037=>18166,34038=>18167,34039=>18168,34040=>18169,34041=>18170,34042=>18171,34043=>18172,34046=>18173,34048=>18174,34049=>18175,34050=>18176,34051=>18177,34052=>18178,34053=>18179,34054=>18180,34055=>18181,34056=>18182,34057=>18183,34058=>18184,34059=>18185,34061=>18186,34062=>18187,34063=>18188,34064=>18189,34066=>18190,34069=>18191,34070=>18192,34072=>18193,34073=>18194,34075=>18195,34076=>18196,34077=>18197,34080=>18198,34082=>18199,34084=>18200,34085=>18201,34087=>18202,34088=>18203,34089=>18204,34090=>18205,34094=>18206,34095=>18207,34096=>18208,34097=>18209,34098=>18210,34099=>18211,34100=>18212,34101=>18213,34102=>18214,34110=>18215,34111=>18216,34112=>18217,34114=>18218,34116=>18219,34117=>18220,34119=>18221,34123=>18222,34124=>18223,34125=>18224,34127=>18225,34128=>18226,34129=>18227,34132=>18228,34135=>18229,34138=>18230,34139=>18231,34140=>18232,34141=>18233,34143=>18234,34144=>18235,34145=>18236,34147=>18237,34149=>18238,34150=>18239,34151=>18240,34155=>18241,34156=>18242,34158=>18243,34159=>18244,34160=>18245,34161=>18246,34163=>18247,34165=>18248,34166=>18249,34168=>18250,34172=>18251,34173=>18252,34175=>18253,34176=>18254,34177=>18255,34178=>18256,34179=>18257,34182=>18258,34185=>18259,34187=>18260,34189=>18261,34190=>18262,34192=>18263,34194=>18264,34195=>18265,34197=>18266,34198=>18267,34199=>18268,34200=>18269,34201=>18270,34202=>18271,34205=>18272,34206=>18273,34208=>18274,34209=>18275,34210=>18276,34211=>18277,34213=>18278,34215=>18279,34219=>18280,34220=>18281,34221=>18282,34225=>18283,34226=>18284,34227=>18285,34228=>18286,34229=>18287,34230=>18288,34232=>18289,34235=>18290,34236=>18291,34237=>18292,34238=>18293,34239=>18294,34240=>18295,34242=>18296,34243=>18297,34244=>18298,34245=>18299,34246=>18300,34247=>18301,34248=>18302,34250=>18303,34251=>18304,34252=>18305,34257=>18306,34258=>18307,34260=>18308,34262=>18309,34263=>18310,34264=>18311,34265=>18312,34266=>18313,34267=>18314,34270=>18315,34271=>18316,34272=>18317,34273=>18318,34274=>18319,34275=>18320,34278=>18321,34279=>18322,34280=>18323,34283=>18324,34284=>18325,34285=>18326,34286=>18327,34287=>18328,34288=>18329,34289=>18330,34290=>18331,34291=>18332,34293=>18333,34295=>18334,34296=>18335,34300=>18336,34301=>18337,34302=>18338,34304=>18339,34305=>18340,34306=>18341,34307=>18342,34312=>18343,34313=>18344,34314=>18345,34316=>18346,34317=>18347,34318=>18348,34319=>18349,34320=>18350,34322=>18351,34323=>18352,34324=>18353,34325=>18354,34327=>18355,34328=>18356,34329=>18357,34331=>18358,34332=>18359,34333=>18360,34335=>18361,34336=>18362,34337=>18363,34339=>18364,34340=>18365,34341=>18366,34342=>18367,34344=>18368,34346=>18369,34347=>18370,34348=>18371,34350=>18372,34351=>18373,34352=>18374,34353=>18375,34354=>18376,34355=>18377,34356=>18378,34357=>18379,34358=>18380,34359=>18381,34361=>18382,34363=>18383,34365=>18384,34366=>18385,34368=>18386,34369=>18387,34370=>18388,34371=>18389,34372=>18390,34373=>18391,34374=>18392,34375=>18393,34376=>18394,34377=>18395,34378=>18396,34379=>18397,34380=>18398,34386=>18399,34387=>18400,34390=>18401,34391=>18402,34392=>18403,34393=>18404,34395=>18405,34397=>18406,34400=>18407,34401=>18408,34403=>18409,34404=>18410,34405=>18411,34406=>18412,34408=>18413,34409=>18414,34410=>18415,34413=>18416,34415=>18417,34416=>18418,34418=>18419,34419=>18420,34420=>18421,34421=>18422,34422=>18423,34423=>18424,34424=>18425,34435=>18426,34436=>18427,34437=>18428,34438=>18429,34439=>18430,34440=>18431,34441=>18432,34446=>18433,34447=>18434,34448=>18435,34449=>18436,34450=>18437,34452=>18438,34454=>18439,34455=>18440,34456=>18441,34457=>18442,34458=>18443,34459=>18444,34462=>18445,34463=>18446,34464=>18447,34465=>18448,34466=>18449,34469=>18450,34470=>18451,34475=>18452,34477=>18453,34478=>18454,34482=>18455,34483=>18456,34487=>18457,34488=>18458,34489=>18459,34491=>18460,34492=>18461,34493=>18462,34494=>18463,34495=>18464,34497=>18465,34498=>18466,34499=>18467,34501=>18468,34504=>18469,34508=>18470,34509=>18471,34514=>18472,34515=>18473,34517=>18474,34518=>18475,34519=>18476,34522=>18477,34524=>18478,34525=>18479,34528=>18480,34529=>18481,34530=>18482,34531=>18483,34533=>18484,34534=>18485,34535=>18486,34536=>18487,34538=>18488,34539=>18489,34540=>18490,34543=>18491,34549=>18492,34550=>18493,34551=>18494,34555=>18495,34556=>18496,34557=>18497,34559=>18498,34561=>18499,34564=>18500,34565=>18501,34571=>18502,34572=>18503,34574=>18504,34575=>18505,34576=>18506,34577=>18507,34580=>18508,34582=>18509,34585=>18510,34587=>18511,34589=>18512,34591=>18513,34592=>18514,34596=>18515,34598=>18516,34599=>18517,34600=>18518,34602=>18519,34603=>18520,34604=>18521,34605=>18522,34607=>18523,34608=>18524,34610=>18525,34611=>18526,34613=>18527,34614=>18528,34616=>18529,34617=>18530,34618=>18531,34620=>18532,34621=>18533,34624=>18534,34625=>18535,34626=>18536,34627=>18537,34628=>18538,34629=>18539,34630=>18540,34634=>18541,34635=>18542,34637=>18543,34639=>18544,34640=>18545,34641=>18546,34642=>18547,34644=>18548,34646=>18549,34648=>18550,34650=>18551,34651=>18552,34652=>18553,34653=>18554,34654=>18555,34655=>18556,34657=>18557,34658=>18558,34663=>18559,34664=>18560,34665=>18561,34666=>18562,34667=>18563,34668=>18564,34669=>18565,34671=>18566,34673=>18567,34674=>18568,34675=>18569,34677=>18570,34679=>18571,34681=>18572,34682=>18573,34687=>18574,34688=>18575,34689=>18576,34694=>18577,34695=>18578,34697=>18579,34698=>18580,34700=>18581,34702=>18582,34703=>18583,34704=>18584,34705=>18585,34706=>18586,34708=>18587,34709=>18588,34710=>18589,34712=>18590,34713=>18591,34714=>18592,34715=>18593,34716=>18594,34717=>18595,34720=>18596,34721=>18597,34723=>18598,34724=>18599,34725=>18600,34726=>18601,34727=>18602,34729=>18603,34730=>18604,34734=>18605,34736=>18606,34737=>18607,34738=>18608,34740=>18609,34742=>18610,34743=>18611,34744=>18612,34745=>18613,34748=>18614,34750=>18615,34751=>18616,34753=>18617,34754=>18618,34755=>18619,34757=>18620,34759=>18621,34761=>18622,34764=>18623,34765=>18624,34767=>18625,34768=>18626,34772=>18627,34773=>18628,34774=>18629,34775=>18630,34776=>18631,34777=>18632,34778=>18633,34780=>18634,34781=>18635,34782=>18636,34783=>18637,34785=>18638,34786=>18639,34788=>18640,34790=>18641,34791=>18642,34792=>18643,34793=>18644,34795=>18645,34797=>18646,34800=>18647,34801=>18648,34803=>18649,34804=>18650,34805=>18651,34807=>18652,34808=>18653,34810=>18654,34812=>18655,34813=>18656,34815=>18657,34816=>18658,34817=>18659,34818=>18660,34820=>18661,34823=>18662,34824=>18663,34825=>18664,34827=>18665,34828=>18666,34829=>18667,34830=>18668,34831=>18669,34834=>18670,34836=>18671,34839=>18672,34840=>18673,34841=>18674,34842=>18675,34844=>18676,34845=>18677,34846=>18678,34848=>18679,34852=>18680,34853=>18681,34854=>18682,34855=>18683,34856=>18684,34857=>18685,34858=>18686,34859=>18687,34860=>18688,34861=>18689,34862=>18690,34863=>18691,34864=>18692,34867=>18693,34868=>18694,34869=>18695,34871=>18696,34872=>18697,34874=>18698,34877=>18699,34878=>18700,34879=>18701,34881=>18702,34882=>18703,34883=>18704,34887=>18705,34888=>18706,34889=>18707,34891=>18708,34894=>18709,34895=>18710,34896=>18711,34897=>18712,34898=>18713,34901=>18714,34902=>18715,34904=>18716,34906=>18717,34908=>18718,34910=>18719,34911=>18720,34912=>18721,34918=>18722,34919=>18723,34922=>18724,34925=>18725,34927=>18726,34929=>18727,34931=>18728,34932=>18729,34933=>18730,34934=>18731,34936=>18732,34938=>18733,34939=>18734,34940=>18735,34944=>18736,34947=>18737,34950=>18738,34951=>18739,34953=>18740,34954=>18741,34956=>18742,34958=>18743,34959=>18744,34960=>18745,34961=>18746,34963=>18747,34964=>18748,34965=>18749,34967=>18750,34968=>18751,34969=>18752,34970=>18753,34971=>18754,34973=>18755,34974=>18756,34975=>18757,34976=>18758,34977=>18759,34979=>18760,34981=>18761,34982=>18762,34983=>18763,34984=>18764,34985=>18765,34986=>18766,34988=>18767,34990=>18768,34991=>18769,34992=>18770,34994=>18771,34995=>18772,34996=>18773,34997=>18774,34998=>18775,35000=>18776,35001=>18777,35002=>18778,35003=>18779,35005=>18780,35006=>18781,35007=>18782,35008=>18783,35011=>18784,35012=>18785,35015=>18786,35016=>18787,35019=>18788,35020=>18789,35021=>18790,35024=>18791,35025=>18792,35027=>18793,35030=>18794,35031=>18795,35034=>18796,35035=>18797,35038=>18798,35040=>18799,35041=>18800,35046=>18801,35047=>18802,35049=>18803,35050=>18804,35051=>18805,35052=>18806,35053=>18807,35054=>18808,35055=>18809,35058=>18810,35061=>18811,35062=>18812,35063=>18813,35066=>18814,35067=>18815,35071=>18816,35072=>18817,35073=>18818,35075=>18819,35076=>18820,35077=>18821,35078=>18822,35080=>18823,35081=>18824,35083=>18825,35084=>18826,35085=>18827,35086=>18828,35087=>18829,35089=>18830,35092=>18831,35093=>18832,35094=>18833,35095=>18834,35096=>18835,35100=>18836,35101=>18837,35102=>18838,35103=>18839,35104=>18840,35106=>18841,35107=>18842,35108=>18843,35110=>18844,35111=>18845,35112=>18846,35113=>18847,35116=>18848,35117=>18849,35118=>18850,35119=>18851,35121=>18852,35125=>18853,35127=>18854,35129=>18855,35130=>18856,35132=>18857,35133=>18858,35134=>18859,35135=>18860,35136=>18861,35138=>18862,35139=>18863,35141=>18864,35142=>18865,35144=>18866,35145=>18867,35146=>18868,35147=>18869,35148=>18870,35149=>18871,35150=>18872,35151=>18873,35152=>18874,35153=>18875,35154=>18876,35155=>18877,35156=>18878,35157=>18879,35159=>18880,35160=>18881,35161=>18882,35162=>18883,35163=>18884,35164=>18885,35169=>18886,35170=>18887,35171=>18888,35173=>18889,35175=>18890,35176=>18891,35177=>18892,35179=>18893,35181=>18894,35182=>18895,35184=>18896,35185=>18897,35187=>18898,35188=>18899,35189=>18900,35190=>18901,35191=>18902,35192=>18903,35193=>18904,35194=>18905,35196=>18906,35197=>18907,12177=>18908,35198=>18908,35200=>18909,35202=>18910,35204=>18911,35205=>18912,35207=>18913,35208=>18914,35209=>18915,35210=>18916,35212=>18917,35213=>18918,35214=>18919,35216=>18920,35217=>18921,35218=>18922,35220=>18923,35221=>18924,35223=>18925,35225=>18926,35226=>18927,35227=>18928,35228=>18929,35229=>18930,35230=>18931,35231=>18932,35232=>18933,35234=>18934,35235=>18935,35236=>18936,35237=>18937,35239=>18938,35240=>18939,35241=>18940,35243=>18941,35245=>18942,35246=>18943,35248=>18944,35249=>18945,35251=>18946,35252=>18947,35253=>18948,35254=>18949,35256=>18950,35257=>18951,35259=>18952,35260=>18953,35262=>18954,35267=>18955,35277=>18956,35283=>18957,35284=>18958,35285=>18959,35287=>18960,35288=>18961,35289=>18962,35291=>18963,35293=>18964,35295=>18965,35296=>18966,35297=>18967,35298=>18968,35300=>18969,35303=>18970,35304=>18971,35305=>18972,35306=>18973,35308=>18974,35309=>18975,35310=>18976,35312=>18977,35313=>18978,35314=>18979,35317=>18980,35319=>18981,35321=>18982,35322=>18983,35323=>18984,35324=>18985,35325=>18986,35326=>18987,35327=>18988,35332=>18989,35333=>18990,35334=>18991,35337=>18992,35339=>18993,35341=>18994,35343=>18995,35345=>18996,35346=>18997,35348=>18998,35351=>18999,35353=>19000,35354=>19001,35356=>19002,35358=>19003,35360=>19004,35361=>19005,35362=>19006,35364=>19007,35366=>19008,35367=>19009,35368=>19010,35369=>19011,35371=>19012,35372=>19013,35374=>19014,35375=>19015,35376=>19016,35378=>19017,35379=>19018,35381=>19019,35383=>19020,35384=>19021,35385=>19022,35387=>19023,35388=>19024,35389=>19025,35391=>19026,35392=>19027,35394=>19028,35395=>19029,35396=>19030,35397=>19031,35399=>19032,35401=>19033,35402=>19034,35403=>19035,35404=>19036,35405=>19037,35407=>19038,35409=>19039,35411=>19040,35414=>19041,35415=>19042,35417=>19043,35418=>19044,35420=>19045,35421=>19046,35423=>19047,35424=>19048,35428=>19049,35429=>19050,35431=>19051,35432=>19052,35434=>19053,35439=>19054,35444=>19055,35446=>19056,35447=>19057,35448=>19058,35450=>19059,35451=>19060,35453=>19061,35454=>19062,35456=>19063,35457=>19064,35458=>19065,35459=>19066,35464=>19067,35467=>19068,35468=>19069,35470=>19070,35471=>19071,35472=>19072,35476=>19073,35478=>19074,35479=>19075,35481=>19076,35483=>19077,35484=>19078,35485=>19079,35487=>19080,35490=>19081,35495=>19082,35497=>19083,35498=>19084,35499=>19085,35501=>19086,35502=>19087,35503=>19088,35505=>19089,35507=>19090,35508=>19091,35509=>19092,35511=>19093,35512=>19094,35514=>19095,35515=>19096,35517=>19097,35518=>19098,35520=>19099,35521=>19100,35523=>19101,35525=>19102,35526=>19103,35528=>19104,35530=>19105,35532=>19106,35534=>19107,35536=>19108,35539=>19109,35540=>19110,35541=>19111,35544=>19112,35545=>19113,35546=>19114,35549=>19115,35551=>19116,35552=>19117,35553=>19118,35555=>19119,35557=>19120,35560=>19121,35561=>19122,35562=>19123,35564=>19124,35567=>19125,35568=>19126,35570=>19127,35572=>19128,35573=>19129,35577=>19130,35579=>19131,35581=>19132,35583=>19133,35587=>19134,35590=>19135,35592=>19136,35593=>19137,35595=>19138,35596=>19139,35597=>19140,35599=>19141,35601=>19142,35602=>19143,35603=>19144,35605=>19145,35608=>19146,35612=>19147,35614=>19148,35615=>19149,35616=>19150,35618=>19151,35619=>19152,35620=>19153,35621=>19154,35623=>19155,35625=>19156,35626=>19157,35630=>19158,35631=>19159,35632=>19160,35633=>19161,35634=>19162,35636=>19163,35637=>19164,35638=>19165,35639=>19166,35640=>19167,35642=>19168,35643=>19169,35644=>19170,35645=>19171,35647=>19172,35648=>19173,35649=>19174,35650=>19175,35651=>19176,35652=>19177,35653=>19178,35654=>19179,35655=>19180,35656=>19181,35658=>19182,35659=>19183,35660=>19184,35661=>19185,35664=>19186,35665=>19187,35666=>19188,35667=>19189,35668=>19190,35669=>19191,35671=>19192,35675=>19193,35677=>19194,35678=>19195,35679=>19196,35680=>19197,35681=>19198,35682=>19199,35683=>19200,35684=>19201,35685=>19202,35687=>19203,35688=>19204,35689=>19205,35690=>19206,35693=>19207,35694=>19208,35697=>19209,35698=>19210,35699=>19211,35701=>19212,35702=>19213,35704=>19214,35705=>19215,35706=>19216,35707=>19217,35708=>19218,35710=>19219,35711=>19220,35713=>19221,35714=>19222,35715=>19223,35716=>19224,35717=>19225,35718=>19226,35719=>19227,35720=>19228,35721=>19229,35723=>19230,35724=>19231,35725=>19232,35727=>19233,35728=>19234,35729=>19235,35732=>19236,35735=>19237,35736=>19238,35737=>19239,35738=>19240,35739=>19241,35741=>19242,35743=>19243,35756=>19244,35761=>19245,35771=>19246,35783=>19247,35792=>19248,35818=>19249,35849=>19250,35870=>19251,35896=>19252,35897=>19253,35898=>19254,35899=>19255,35900=>19256,35901=>19257,35902=>19258,35903=>19259,35904=>19260,35906=>19261,35907=>19262,35908=>19263,35909=>19264,35914=>19265,35915=>19266,35917=>19267,35918=>19268,35919=>19269,35921=>19270,35922=>19271,35923=>19272,35924=>19273,35926=>19274,35927=>19275,35928=>19276,35929=>19277,35931=>19278,35932=>19279,35933=>19280,35934=>19281,35935=>19282,35936=>19283,35939=>19284,35940=>19285,35941=>19286,35942=>19287,35943=>19288,35944=>19289,35945=>19290,35948=>19291,35949=>19292,35950=>19293,35951=>19294,35952=>19295,35953=>19296,35954=>19297,35956=>19298,35957=>19299,35958=>19300,35959=>19301,35963=>19302,35964=>19303,35965=>19304,35966=>19305,35967=>19306,35968=>19307,35969=>19308,35971=>19309,35972=>19310,35974=>19311,35975=>19312,35976=>19313,35979=>19314,35981=>19315,35982=>19316,35983=>19317,35984=>19318,35985=>19319,35986=>19320,35987=>19321,35989=>19322,35990=>19323,35991=>19324,35993=>19325,35994=>19326,35995=>19327,35996=>19328,35999=>19329,36003=>19330,36004=>19331,36005=>19332,36006=>19333,36013=>19334,36014=>19335,36017=>19336,36021=>19337,36025=>19338,36030=>19339,36038=>19340,36041=>19341,36043=>19342,36044=>19343,36045=>19344,36046=>19345,36047=>19346,36048=>19347,36052=>19348,36054=>19349,36055=>19350,36056=>19351,36057=>19352,36059=>19353,36061=>19354,36063=>19355,36069=>19356,36072=>19357,36073=>19358,36078=>19359,36079=>19360,36080=>19361,36081=>19362,36082=>19363,36083=>19364,36085=>19365,36086=>19366,36087=>19367,36088=>19368,36089=>19369,36095=>19370,36096=>19371,36097=>19372,36098=>19373,36099=>19374,36102=>19375,36103=>19376,36105=>19377,36108=>19378,36110=>19379,36113=>19380,36114=>19381,36115=>19382,36116=>19383,36117=>19384,36119=>19385,36120=>19386,36121=>19387,36122=>19388,36128=>19389,36177=>19390,36178=>19391,36183=>19392,36191=>19393,36197=>19394,36200=>19395,36201=>19396,36202=>19397,36204=>19398,36206=>19399,36207=>19400,36209=>19401,36210=>19402,36216=>19403,36217=>19404,36218=>19405,36219=>19406,36220=>19407,36221=>19408,36222=>19409,36223=>19410,36224=>19411,36226=>19412,36227=>19413,36230=>19414,36231=>19415,36232=>19416,36233=>19417,36236=>19418,36237=>19419,36238=>19420,36239=>19421,36240=>19422,36242=>19423,36243=>19424,36246=>19425,36247=>19426,36248=>19427,36250=>19428,36251=>19429,36252=>19430,36253=>19431,36254=>19432,36256=>19433,36257=>19434,36258=>19435,36260=>19436,36261=>19437,36262=>19438,36263=>19439,36265=>19440,36266=>19441,36267=>19442,36268=>19443,36269=>19444,36270=>19445,36271=>19446,36272=>19447,36278=>19448,36279=>19449,36281=>19450,36283=>19451,36285=>19452,36288=>19453,36289=>19454,36290=>19455,36293=>19456,36295=>19457,36296=>19458,36297=>19459,36298=>19460,36301=>19461,36304=>19462,36306=>19463,36307=>19464,36308=>19465,36309=>19466,36312=>19467,36313=>19468,36316=>19469,36320=>19470,36321=>19471,36322=>19472,36325=>19473,36326=>19474,36327=>19475,36329=>19476,36333=>19477,36334=>19478,36336=>19479,36337=>19480,36338=>19481,36340=>19482,36342=>19483,36348=>19484,36350=>19485,36351=>19486,36352=>19487,36353=>19488,36354=>19489,36355=>19490,36356=>19491,36358=>19492,36359=>19493,36360=>19494,36363=>19495,36365=>19496,36366=>19497,36369=>19498,36370=>19499,36371=>19500,36373=>19501,36374=>19502,36375=>19503,36376=>19504,36377=>19505,36378=>19506,36379=>19507,36380=>19508,36384=>19509,36385=>19510,36388=>19511,36389=>19512,36390=>19513,36391=>19514,36392=>19515,36395=>19516,36397=>19517,36400=>19518,36402=>19519,36403=>19520,36406=>19521,36407=>19522,36408=>19523,36411=>19524,36412=>19525,36414=>19526,36415=>19527,36419=>19528,36421=>19529,36422=>19530,36429=>19531,36430=>19532,36431=>19533,36432=>19534,36435=>19535,36436=>19536,36438=>19537,36439=>19538,36440=>19539,36442=>19540,36443=>19541,36444=>19542,36445=>19543,36446=>19544,36447=>19545,36448=>19546,36449=>19547,36450=>19548,36452=>19549,36453=>19550,36455=>19551,36456=>19552,36458=>19553,36459=>19554,36462=>19555,36465=>19556,36467=>19557,36469=>19558,36471=>19559,36472=>19560,36473=>19561,36475=>19562,36477=>19563,36478=>19564,36480=>19565,36482=>19566,36483=>19567,36484=>19568,36486=>19569,36488=>19570,36492=>19571,36494=>19572,36501=>19573,36502=>19574,36503=>19575,36504=>19576,36505=>19577,36507=>19578,36509=>19579,36511=>19580,36512=>19581,36514=>19582,36515=>19583,36516=>19584,36519=>19585,36520=>19586,36521=>19587,36525=>19588,36526=>19589,36528=>19590,36529=>19591,36531=>19592,36532=>19593,36533=>19594,36534=>19595,36535=>19596,36536=>19597,36537=>19598,36539=>19599,36540=>19600,36541=>19601,36542=>19602,36543=>19603,36545=>19604,36546=>19605,36547=>19606,36548=>19607,36549=>19608,36550=>19609,36551=>19610,36552=>19611,36553=>19612,36559=>19613,36560=>19614,36561=>19615,36563=>19616,36565=>19617,36566=>19618,36567=>19619,36568=>19620,36569=>19621,36570=>19622,36572=>19623,36573=>19624,36574=>19625,36576=>19626,36577=>19627,36578=>19628,36579=>19629,36581=>19630,36582=>19631,36583=>19632,36584=>19633,36585=>19634,36586=>19635,36588=>19636,36589=>19637,36590=>19638,36591=>19639,36592=>19640,36593=>19641,36595=>19642,36596=>19643,36597=>19644,36598=>19645,36599=>19646,36605=>19647,36607=>19648,36608=>19649,36609=>19650,36610=>19651,36612=>19652,36614=>19653,36616=>19654,36619=>19655,36620=>19656,36621=>19657,36622=>19658,36623=>19659,36624=>19660,36625=>19661,36627=>19662,36630=>19663,36631=>19664,36632=>19665,36633=>19666,36634=>19667,36640=>19668,36641=>19669,36642=>19670,36643=>19671,36644=>19672,36647=>19673,36648=>19674,36651=>19675,36652=>19676,36653=>19677,36654=>19678,36656=>19679,36657=>19680,36658=>19681,36660=>19682,36661=>19683,36662=>19684,36663=>19685,36665=>19686,36666=>19687,36668=>19688,36669=>19689,36672=>19690,36673=>19691,36675=>19692,36679=>19693,36680=>19694,36682=>19695,36683=>19696,36684=>19697,36687=>19698,36688=>19699,36689=>19700,36690=>19701,36691=>19702,36693=>19703,36694=>19704,36695=>19705,36696=>19706,36697=>19707,36698=>19708,36699=>19709,36700=>19710,36701=>19711,36702=>19712,36704=>19713,36707=>19714,36709=>19715,36714=>19716,36736=>19717,36748=>19718,36754=>19719,36765=>19720,36768=>19721,36769=>19722,36770=>19723,36772=>19724,36773=>19725,36775=>19726,36778=>19727,36780=>19728,36787=>19729,36788=>19730,12193=>19731,36789=>19731,36791=>19732,36792=>19733,36794=>19734,36795=>19735,36796=>19736,36799=>19737,36800=>19738,36803=>19739,36806=>19740,36809=>19741,36810=>19742,36811=>19743,36812=>19744,36813=>19745,36815=>19746,36818=>19747,36822=>19748,36823=>19749,36826=>19750,36832=>19751,36833=>19752,36835=>19753,36839=>19754,36844=>19755,36847=>19756,36849=>19757,36850=>19758,36853=>19759,36854=>19760,36858=>19761,36859=>19762,36860=>19763,36862=>19764,36863=>19765,36871=>19766,36872=>19767,36876=>19768,36878=>19769,36883=>19770,36888=>19771,36892=>19772,36900=>19773,36901=>19774,36903=>19775,36904=>19776,36905=>19777,36906=>19778,36907=>19779,36908=>19780,36912=>19781,36913=>19782,36915=>19783,36916=>19784,36919=>19785,36921=>19786,36922=>19787,36925=>19788,36927=>19789,36928=>19790,36931=>19791,36933=>19792,36934=>19793,36936=>19794,36937=>19795,36938=>19796,36940=>19797,36950=>19798,36953=>19799,36954=>19800,36957=>19801,36959=>19802,36961=>19803,36964=>19804,36966=>19805,36967=>19806,36970=>19807,36971=>19808,36972=>19809,36975=>19810,36976=>19811,36977=>19812,36979=>19813,36982=>19814,36985=>19815,36987=>19816,36990=>19817,36997=>19818,36998=>19819,37001=>19820,37004=>19821,37005=>19822,37006=>19823,37010=>19824,37012=>19825,37014=>19826,37016=>19827,37018=>19828,37020=>19829,37022=>19830,37023=>19831,37024=>19832,37028=>19833,37029=>19834,37031=>19835,37032=>19836,37033=>19837,37035=>19838,37037=>19839,37042=>19840,37047=>19841,37052=>19842,37053=>19843,37055=>19844,37056=>19845,37058=>19846,37059=>19847,37062=>19848,37064=>19849,37065=>19850,37067=>19851,37068=>19852,37069=>19853,37074=>19854,37076=>19855,37077=>19856,37078=>19857,37080=>19858,37081=>19859,37082=>19860,37086=>19861,37088=>19862,37091=>19863,37092=>19864,37093=>19865,37097=>19866,37098=>19867,37100=>19868,37102=>19869,37104=>19870,37105=>19871,37106=>19872,37107=>19873,37110=>19874,37111=>19875,37113=>19876,37114=>19877,37115=>19878,37116=>19879,37119=>19880,37120=>19881,37121=>19882,37123=>19883,37125=>19884,37127=>19885,37128=>19886,37130=>19887,37131=>19888,37132=>19889,37133=>19890,37134=>19891,37135=>19892,37136=>19893,37137=>19894,37139=>19895,37141=>19896,37143=>19897,37144=>19898,37146=>19899,37147=>19900,37148=>19901,37149=>19902,37151=>19903,37152=>19904,37153=>19905,37156=>19906,37157=>19907,37158=>19908,37160=>19909,37161=>19910,37162=>19911,37163=>19912,37164=>19913,37166=>19914,37171=>19915,37173=>19916,37175=>19917,37176=>19918,37179=>19919,37180=>19920,37181=>19921,37182=>19922,37183=>19923,37184=>19924,37185=>19925,37186=>19926,37188=>19927,37189=>19928,37191=>19929,37201=>19930,37203=>19931,37204=>19932,37205=>19933,37206=>19934,37208=>19935,37209=>19936,37211=>19937,37212=>19938,37215=>19939,37216=>19940,37222=>19941,37223=>19942,37224=>19943,37227=>19944,37229=>19945,37235=>19946,37242=>19947,37243=>19948,37244=>19949,37248=>19950,37249=>19951,37250=>19952,37251=>19953,37252=>19954,37254=>19955,37256=>19956,37258=>19957,37262=>19958,37263=>19959,37267=>19960,37268=>19961,37269=>19962,37271=>19963,37272=>19964,37273=>19965,37277=>19966,37278=>19967,37279=>19968,37280=>19969,37281=>19970,37284=>19971,37285=>19972,37286=>19973,37287=>19974,37288=>19975,37289=>19976,37296=>19977,37297=>19978,37298=>19979,37299=>19980,37302=>19981,37303=>19982,37304=>19983,37305=>19984,37307=>19985,37308=>19986,37309=>19987,37310=>19988,37311=>19989,37314=>19990,37316=>19991,12196=>19992,37318=>19992,37320=>19993,37328=>19994,37334=>19995,37338=>19996,37339=>19997,37342=>19998,37343=>19999,37344=>20000,37345=>20001,37346=>20002,37349=>20003,37350=>20004,37352=>20005,37354=>20006,37355=>20007,37356=>20008,37357=>20009,37358=>20010,37359=>20011,37360=>20012,37361=>20013,37362=>20014,37363=>20015,37364=>20016,37366=>20017,37368=>20018,37371=>20019,37372=>20020,37373=>20021,37374=>20022,37375=>20023,37378=>20024,37379=>20025,37381=>20026,37382=>20027,37383=>20028,37386=>20029,37387=>20030,37388=>20031,37391=>20032,37394=>20033,37395=>20034,37398=>20035,37399=>20036,37400=>20037,37401=>20038,37402=>20039,37403=>20040,37404=>20041,37405=>20042,37407=>20043,37408=>20044,37409=>20045,37410=>20046,37412=>20047,37416=>20048,37417=>20049,37418=>20050,37419=>20051,37420=>20052,37421=>20053,37423=>20054,37425=>20055,37426=>20056,37429=>20057,37430=>20058,37435=>20059,37436=>20060,37441=>20061,37442=>20062,37443=>20063,37444=>20064,37446=>20065,37447=>20066,37450=>20067,37451=>20068,37452=>20069,37454=>20070,37455=>20071,37456=>20072,37458=>20073,37459=>20074,37460=>20075,37462=>20076,37464=>20077,37465=>20078,37468=>20079,37469=>20080,37471=>20081,37472=>20082,37473=>20083,37475=>20084,37476=>20085,37477=>20086,37479=>20087,37480=>20088,37481=>20089,37482=>20090,37483=>20091,37486=>20092,37487=>20093,37488=>20094,37489=>20095,37490=>20096,37491=>20097,37493=>20098,37494=>20099,37495=>20100,37497=>20101,37500=>20102,37501=>20103,37502=>20104,37505=>20105,37506=>20106,37508=>20107,37510=>20108,37511=>20109,37512=>20110,37513=>20111,37514=>20112,37515=>20113,37516=>20114,37517=>20115,37519=>20116,37520=>20117,37522=>20118,37524=>20119,37525=>20120,37527=>20121,37529=>20122,37531=>20123,37533=>20124,37534=>20125,37535=>20126,37537=>20127,37538=>20128,37540=>20129,37543=>20130,37549=>20131,37551=>20132,37552=>20133,37554=>20134,37555=>20135,37556=>20136,37557=>20137,37558=>20138,37560=>20139,37562=>20140,37565=>20141,37566=>20142,37567=>20143,37568=>20144,37570=>20145,37572=>20146,37574=>20147,37577=>20148,37578=>20149,37579=>20150,37581=>20151,37582=>20152,37584=>20153,37585=>20154,37587=>20155,37588=>20156,37589=>20157,37590=>20158,37591=>20159,37592=>20160,37593=>20161,37594=>20162,37595=>20163,37596=>20164,37598=>20165,37600=>20166,37601=>20167,37602=>20168,37607=>20169,37609=>20170,37611=>20171,37612=>20172,37618=>20173,37619=>20174,37620=>20175,37621=>20176,37623=>20177,37625=>20178,37626=>20179,37627=>20180,37629=>20181,37630=>20182,37631=>20183,37632=>20184,37634=>20185,37635=>20186,37636=>20187,37637=>20188,37641=>20189,37642=>20190,37643=>20191,37644=>20192,37645=>20193,37646=>20194,37647=>20195,37649=>20196,37651=>20197,37652=>20198,37654=>20199,37655=>20200,37660=>20201,37661=>20202,37662=>20203,37665=>20204,37667=>20205,37668=>20206,37669=>20207,37671=>20208,37673=>20209,37674=>20210,37676=>20211,37677=>20212,37680=>20213,37681=>20214,37684=>20215,37685=>20216,37687=>20217,37689=>20218,37690=>20219,37691=>20220,37692=>20221,37693=>20222,37695=>20223,37698=>20224,37700=>20225,37701=>20226,37704=>20227,37705=>20228,37706=>20229,37708=>20230,37710=>20231,37711=>20232,37712=>20233,37713=>20234,37714=>20235,37715=>20236,37717=>20237,37718=>20238,37719=>20239,37721=>20240,37722=>20241,37724=>20242,37725=>20243,37726=>20244,37727=>20245,37728=>20246,37729=>20247,37730=>20248,37731=>20249,37734=>20250,37735=>20251,37736=>20252,37739=>20253,37741=>20254,37742=>20255,37743=>20256,37745=>20257,37746=>20258,37747=>20259,37748=>20260,37751=>20261,37752=>20262,37753=>20263,37755=>20264,37756=>20265,37757=>20266,37759=>20267,37760=>20268,37761=>20269,37763=>20270,37765=>20271,37766=>20272,37768=>20273,37769=>20274,37771=>20275,37772=>20276,37773=>20277,37774=>20278,37776=>20279,37777=>20280,37778=>20281,37779=>20282,37780=>20283,37781=>20284,37783=>20285,37785=>20286,37786=>20287,37787=>20288,37788=>20289,37789=>20290,37790=>20291,37791=>20292,37792=>20293,37793=>20294,37796=>20295,37797=>20296,37800=>20297,37803=>20298,37805=>20299,37807=>20300,37809=>20301,37810=>20302,37812=>20303,37814=>20304,37815=>20305,37817=>20306,37818=>20307,37819=>20308,37820=>20309,37821=>20310,37822=>20311,37824=>20312,37825=>20313,37826=>20314,37828=>20315,37829=>20316,37830=>20317,37833=>20318,37835=>20319,37838=>20320,37839=>20321,37840=>20322,37842=>20323,37843=>20324,37844=>20325,37845=>20326,37849=>20327,37850=>20328,37851=>20329,37856=>20330,37859=>20331,37861=>20332,37862=>20333,37863=>20334,37865=>20335,37866=>20336,37867=>20337,37868=>20338,37869=>20339,37870=>20340,37871=>20341,37872=>20342,37873=>20343,37874=>20344,37875=>20345,37876=>20346,37878=>20347,37880=>20348,37882=>20349,37883=>20350,37884=>20351,37885=>20352,37886=>20353,37887=>20354,37888=>20355,37889=>20356,37890=>20357,37892=>20358,37893=>20359,37894=>20360,37895=>20361,37896=>20362,37897=>20363,37898=>20364,37900=>20365,37901=>20366,37902=>20367,37903=>20368,37905=>20369,37909=>20370,37910=>20371,37911=>20372,37914=>20373,37915=>20374,37916=>20375,37918=>20376,37919=>20377,37921=>20378,37922=>20379,37923=>20380,37924=>20381,37925=>20382,37929=>20383,37930=>20384,37931=>20385,37932=>20386,37933=>20387,37935=>20388,37936=>20389,37937=>20390,37940=>20391,37942=>20392,37943=>20393,37945=>20394,37947=>20395,37948=>20396,37949=>20397,37952=>20398,37953=>20399,37954=>20400,37955=>20401,37957=>20402,37958=>20403,37959=>20404,37960=>20405,37961=>20406,37963=>20407,37965=>20408,37966=>20409,37967=>20410,37968=>20411,37969=>20412,37971=>20413,37973=>20414,37974=>20415,37975=>20416,37976=>20417,37977=>20418,37978=>20419,37979=>20420,37980=>20421,37981=>20422,37982=>20423,37983=>20424,37985=>20425,37986=>20426,37988=>20427,37990=>20428,37991=>20429,37992=>20430,37993=>20431,37994=>20432,37996=>20433,37998=>20434,37999=>20435,38001=>20436,38003=>20437,38004=>20438,38005=>20439,38006=>20440,38008=>20441,38010=>20442,38011=>20443,38016=>20444,38017=>20445,38018=>20446,38019=>20447,38020=>20448,38033=>20449,38038=>20450,38040=>20451,38087=>20452,38095=>20453,38099=>20454,38100=>20455,38106=>20456,38118=>20457,38139=>20458,38172=>20459,38176=>20460,38183=>20461,38195=>20462,38205=>20463,38211=>20464,38216=>20465,38219=>20466,38229=>20467,38234=>20468,38240=>20469,38254=>20470,38260=>20471,38261=>20472,38264=>20473,38265=>20474,38266=>20475,38267=>20476,38268=>20477,38269=>20478,38270=>20479,38273=>20480,38276=>20481,38277=>20482,38279=>20483,38280=>20484,38282=>20485,38285=>20486,38288=>20487,38290=>20488,38293=>20489,38294=>20490,38295=>20491,38297=>20492,38298=>20493,38299=>20494,38300=>20495,38301=>20496,38302=>20497,38303=>20498,38304=>20499,38306=>20500,38310=>20501,38311=>20502,38314=>20503,38318=>20504,38319=>20505,38320=>20506,38321=>20507,38323=>20508,38324=>20509,38325=>20510,38327=>20511,38328=>20512,38330=>20513,38336=>20514,38337=>20515,38338=>20516,38340=>20517,38341=>20518,38343=>20519,38345=>20520,38349=>20521,38350=>20522,38351=>20523,38353=>20524,38354=>20525,38355=>20526,38359=>20527,38360=>20528,38361=>20529,38362=>20530,38363=>20531,38365=>20532,38367=>20533,38368=>20534,38371=>20535,38372=>20536,38374=>20537,38375=>20538,38380=>20539,38399=>20540,38407=>20541,38419=>20542,38424=>20543,38427=>20544,38430=>20545,38432=>20546,38435=>20547,38436=>20548,38437=>20549,38438=>20550,38439=>20551,38440=>20552,38441=>20553,38443=>20554,38444=>20555,38445=>20556,38447=>20557,38448=>20558,38455=>20559,38456=>20560,38457=>20561,38458=>20562,38462=>20563,38465=>20564,38467=>20565,38474=>20566,38478=>20567,38479=>20568,38481=>20569,38482=>20570,38483=>20571,38486=>20572,38487=>20573,38489=>20574,38490=>20575,38492=>20576,38494=>20577,38496=>20578,38501=>20579,38502=>20580,38507=>20581,38509=>20582,38510=>20583,38511=>20584,38513=>20585,38521=>20586,38522=>20587,38523=>20588,38524=>20589,38526=>20590,38527=>20591,38528=>20592,38529=>20593,38530=>20594,38531=>20595,38532=>20596,38535=>20597,38537=>20598,38540=>20599,38545=>20600,38546=>20601,38547=>20602,38550=>20603,38554=>20604,38557=>20605,38558=>20606,38559=>20607,38560=>20608,38561=>20609,38562=>20610,63985=>20611,38563=>20611,38564=>20612,38565=>20613,38566=>20614,38569=>20615,38571=>20616,38572=>20617,38573=>20618,38574=>20619,38575=>20620,38578=>20621,38581=>20622,38583=>20623,38586=>20624,38591=>20625,38594=>20626,38595=>20627,38600=>20628,38602=>20629,38603=>20630,38608=>20631,38609=>20632,38611=>20633,38612=>20634,38615=>20635,38616=>20636,38618=>20637,38621=>20638,38622=>20639,38623=>20640,38625=>20641,38628=>20642,38629=>20643,38630=>20644,38631=>20645,38635=>20646,38636=>20647,38637=>20648,38638=>20649,38640=>20650,38641=>20651,38644=>20652,38645=>20653,38648=>20654,38650=>20655,38652=>20656,38653=>20657,38655=>20658,38658=>20659,38659=>20660,38661=>20661,38666=>20662,38667=>20663,38668=>20664,38672=>20665,38673=>20666,38674=>20667,38676=>20668,38677=>20669,38679=>20670,38680=>20671,38681=>20672,38682=>20673,38683=>20674,38685=>20675,38687=>20676,38688=>20677,38689=>20678,38690=>20679,38691=>20680,38692=>20681,38693=>20682,38694=>20683,38696=>20684,38697=>20685,38699=>20686,38700=>20687,38702=>20688,38703=>20689,38705=>20690,38707=>20691,38708=>20692,38709=>20693,38710=>20694,38711=>20695,38714=>20696,38715=>20697,38716=>20698,38719=>20699,38720=>20700,38721=>20701,38723=>20702,38725=>20703,38726=>20704,38727=>20705,38729=>20706,38730=>20707,38731=>20708,38732=>20709,38733=>20710,38734=>20711,38735=>20712,38736=>20713,12205=>20714,38737=>20714,38740=>20715,38741=>20716,38743=>20717,38744=>20718,38748=>20719,38749=>20720,38751=>20721,38755=>20722,38756=>20723,38758=>20724,38759=>20725,38762=>20726,38763=>20727,38764=>20728,38765=>20729,38766=>20730,38767=>20731,38768=>20732,38769=>20733,38770=>20734,38773=>20735,38775=>20736,38776=>20737,38777=>20738,38778=>20739,38779=>20740,38781=>20741,38782=>20742,38783=>20743,38784=>20744,38785=>20745,38786=>20746,38787=>20747,38788=>20748,38790=>20749,38791=>20750,38792=>20751,38793=>20752,38794=>20753,38796=>20754,38798=>20755,38800=>20756,38803=>20757,38805=>20758,38806=>20759,38807=>20760,38809=>20761,38810=>20762,38811=>20763,38812=>20764,38813=>20765,38814=>20766,38815=>20767,38817=>20768,38818=>20769,38820=>20770,38821=>20771,38823=>20772,38824=>20773,38825=>20774,38826=>20775,38828=>20776,38830=>20777,38832=>20778,38833=>20779,38835=>20780,38837=>20781,38838=>20782,38839=>20783,38840=>20784,38841=>20785,38842=>20786,38843=>20787,38844=>20788,38846=>20789,38847=>20790,38848=>20791,38849=>20792,38850=>20793,38852=>20794,38853=>20795,38855=>20796,38856=>20797,38858=>20798,38861=>20799,38862=>20800,38863=>20801,38864=>20802,38865=>20803,38866=>20804,38868=>20805,38869=>20806,38870=>20807,38871=>20808,38872=>20809,38874=>20810,38875=>20811,38877=>20812,38879=>20813,38880=>20814,38881=>20815,38882=>20816,38883=>20817,38884=>20818,38885=>20819,38888=>20820,38894=>20821,38895=>20822,38896=>20823,38897=>20824,38898=>20825,38900=>20826,38903=>20827,38904=>20828,38905=>20829,38906=>20830,38907=>20831,38908=>20832,38909=>20833,38910=>20834,38912=>20835,38916=>20836,38921=>20837,38923=>20838,38925=>20839,38932=>20840,38933=>20841,38934=>20842,38937=>20843,38938=>20844,38939=>20845,38941=>20846,38942=>20847,38943=>20848,38944=>20849,38946=>20850,38947=>20851,38949=>20852,38951=>20853,38952=>20854,38953=>20855,38954=>20856,38955=>20857,38956=>20858,38958=>20859,38959=>20860,38961=>20861,38962=>20862,38963=>20863,38964=>20864,38965=>20865,38966=>20866,38969=>20867,38970=>20868,38972=>20869,38974=>20870,38975=>20871,38976=>20872,38977=>20873,38978=>20874,38979=>20875,38980=>20876,38981=>20877,38983=>20878,38984=>20879,38985=>20880,38986=>20881,38987=>20882,38991=>20883,38992=>20884,38993=>20885,38994=>20886,38997=>20887,38998=>20888,38999=>20889,39002=>20890,39004=>20891,39005=>20892,39007=>20893,39008=>20894,39009=>20895,39011=>20896,39012=>20897,39014=>20898,39016=>20899,39017=>20900,39018=>20901,39021=>20902,39022=>20903,39026=>20904,39051=>20905,39054=>20906,39058=>20907,39061=>20908,39065=>20909,39075=>20910,39081=>20911,39082=>20912,39083=>20913,39084=>20914,39085=>20915,39088=>20916,39090=>20917,39092=>20918,39093=>20919,39095=>20920,39096=>20921,39097=>20922,39098=>20923,39099=>20924,39101=>20925,39102=>20926,39103=>20927,39104=>20928,39105=>20929,39106=>20930,39107=>20931,39109=>20932,39111=>20933,39113=>20934,39114=>20935,39115=>20936,39116=>20937,39117=>20938,39119=>20939,39120=>20940,39124=>20941,39126=>20942,39127=>20943,39132=>20944,39133=>20945,39137=>20946,39139=>20947,39140=>20948,39141=>20949,39142=>20950,39148=>20951,39150=>20952,39152=>20953,39153=>20954,39155=>20955,39157=>20956,39158=>20957,39159=>20958,39160=>20959,39161=>20960,39162=>20961,39163=>20962,39167=>20963,39168=>20964,39169=>20965,39170=>20966,39172=>20967,39174=>20968,39175=>20969,39176=>20970,39179=>20971,39182=>20972,39183=>20973,39188=>20974,39189=>20975,39190=>20976,39191=>20977,39193=>20978,39194=>20979,39196=>20980,39197=>20981,39199=>20982,39200=>20983,39202=>20984,39203=>20985,39204=>20986,39205=>20987,39206=>20988,39207=>20989,39209=>20990,39210=>20991,39211=>20992,39212=>20993,39213=>20994,39215=>20995,39216=>20996,39217=>20997,39218=>20998,39220=>20999,39221=>21000,39222=>21001,39224=>21002,39225=>21003,39226=>21004,39227=>21005,39229=>21006,39232=>21007,39233=>21008,39234=>21009,39236=>21010,39238=>21011,39239=>21012,39245=>21013,39246=>21014,39247=>21015,39248=>21016,39251=>21017,39254=>21018,39256=>21019,39257=>21020,39258=>21021,39259=>21022,39261=>21023,39263=>21024,39264=>21025,39265=>21026,39268=>21027,39270=>21028,39283=>21029,39288=>21030,39289=>21031,39291=>21032,39294=>21033,39298=>21034,39299=>21035,39305=>21036,39308=>21037,39310=>21038,39322=>21039,39323=>21040,39324=>21041,39325=>21042,39326=>21043,39327=>21044,39328=>21045,39329=>21046,39330=>21047,39331=>21048,39332=>21049,39334=>21050,39335=>21051,39337=>21052,39338=>21053,39339=>21054,39343=>21055,39344=>21056,39346=>21057,39349=>21058,39350=>21059,39351=>21060,39352=>21061,39353=>21062,39354=>21063,39355=>21064,39356=>21065,39357=>21066,39358=>21067,39359=>21068,39360=>21069,39362=>21070,39363=>21071,39364=>21072,39365=>21073,39366=>21074,39367=>21075,39368=>21076,39369=>21077,39370=>21078,39371=>21079,39372=>21080,39373=>21081,39374=>21082,39375=>21083,39379=>21084,39382=>21085,39383=>21086,39386=>21087,39388=>21088,39390=>21089,39392=>21090,39395=>21091,39396=>21092,39397=>21093,39398=>21094,39399=>21095,39400=>21096,39401=>21097,39402=>21098,39403=>21099,39404=>21100,39406=>21101,39407=>21102,39408=>21103,39410=>21104,39411=>21105,39412=>21106,39413=>21107,39414=>21108,39415=>21109,39416=>21110,39417=>21111,39418=>21112,39419=>21113,39420=>21114,39421=>21115,39422=>21116,39424=>21117,39426=>21118,39427=>21119,39428=>21120,39430=>21121,39431=>21122,39432=>21123,39433=>21124,39434=>21125,39435=>21126,39436=>21127,39440=>21128,39441=>21129,39442=>21130,39443=>21131,39444=>21132,39445=>21133,39447=>21134,39448=>21135,39450=>21136,39451=>21137,39452=>21138,39453=>21139,39454=>21140,39455=>21141,39456=>21142,39457=>21143,39458=>21144,39459=>21145,39460=>21146,39461=>21147,39462=>21148,39463=>21149,39464=>21150,39465=>21151,39466=>21152,39468=>21153,39471=>21154,39473=>21155,39474=>21156,39475=>21157,39476=>21158,39477=>21159,39481=>21160,39482=>21161,39483=>21162,39484=>21163,39485=>21164,39487=>21165,39494=>21166,39495=>21167,39496=>21168,39497=>21169,39499=>21170,39500=>21171,39502=>21172,39504=>21173,39505=>21174,39506=>21175,39507=>21176,39508=>21177,39510=>21178,39512=>21179,39513=>21180,39516=>21181,39517=>21182,39518=>21183,39520=>21184,39521=>21185,39523=>21186,39526=>21187,39527=>21188,39528=>21189,39529=>21190,39531=>21191,39538=>21192,39555=>21193,39561=>21194,39565=>21195,39566=>21196,39572=>21197,39573=>21198,39577=>21199,39590=>21200,39593=>21201,39594=>21202,39595=>21203,39596=>21204,39597=>21205,39598=>21206,39602=>21207,39603=>21208,39604=>21209,39605=>21210,39609=>21211,39611=>21212,39613=>21213,39614=>21214,39615=>21215,39619=>21216,39620=>21217,39622=>21218,39623=>21219,39624=>21220,39625=>21221,39626=>21222,39629=>21223,39630=>21224,39632=>21225,39639=>21226,39641=>21227,39642=>21228,39643=>21229,39644=>21230,39645=>21231,39646=>21232,39648=>21233,39650=>21234,39651=>21235,39652=>21236,39653=>21237,39655=>21238,39656=>21239,39657=>21240,39658=>21241,39660=>21242,39664=>21243,39665=>21244,39666=>21245,39667=>21246,39668=>21247,39669=>21248,39670=>21249,39671=>21250,39672=>21251,39674=>21252,39676=>21253,39677=>21254,39678=>21255,39679=>21256,39680=>21257,39681=>21258,39682=>21259,39684=>21260,39685=>21261,39687=>21262,39689=>21263,39690=>21264,39691=>21265,39692=>21266,39694=>21267,39696=>21268,39697=>21269,39698=>21270,39700=>21271,39701=>21272,39702=>21273,39703=>21274,39704=>21275,39705=>21276,39707=>21277,39708=>21278,39709=>21279,39710=>21280,39712=>21281,39713=>21282,39716=>21283,39718=>21284,39720=>21285,39722=>21286,39723=>21287,39724=>21288,39725=>21289,39728=>21290,39731=>21291,39732=>21292,39733=>21293,39734=>21294,39735=>21295,39736=>21296,39737=>21297,39738=>21298,39741=>21299,39742=>21300,39743=>21301,39744=>21302,39750=>21303,39754=>21304,39755=>21305,39756=>21306,39760=>21307,39762=>21308,39763=>21309,39765=>21310,39766=>21311,39767=>21312,39769=>21313,39771=>21314,39772=>21315,39773=>21316,39774=>21317,39775=>21318,39776=>21319,39777=>21320,39778=>21321,39779=>21322,39780=>21323,39781=>21324,39782=>21325,39783=>21326,39784=>21327,39785=>21328,39786=>21329,39787=>21330,39788=>21331,39789=>21332,39790=>21333,39792=>21334,39793=>21335,39794=>21336,39795=>21337,39797=>21338,39798=>21339,39800=>21340,39801=>21341,39802=>21342,39803=>21343,39804=>21344,39805=>21345,39806=>21346,39807=>21347,39808=>21348,39810=>21349,39812=>21350,39813=>21351,39814=>21352,39815=>21353,39816=>21354,39817=>21355,39818=>21356,39819=>21357,39820=>21358,39821=>21359,39823=>21360,39827=>21361,39828=>21362,39829=>21363,39830=>21364,39831=>21365,39832=>21366,39833=>21367,39835=>21368,39836=>21369,39839=>21370,39840=>21371,39841=>21372,39842=>21373,39843=>21374,39844=>21375,39845=>21376,39846=>21377,39847=>21378,39848=>21379,39849=>21380,39852=>21381,39855=>21382,39856=>21383,39857=>21384,39858=>21385,39859=>21386,39860=>21387,39861=>21388,39862=>21389,39863=>21390,39864=>21391,39865=>21392,39866=>21393,39867=>21394,39868=>21395,39869=>21396,39870=>21397,39871=>21398,39874=>21399,39875=>21400,39876=>21401,39877=>21402,39878=>21403,39880=>21404,39883=>21405,39884=>21406,39885=>21407,39886=>21408,39887=>21409,39888=>21410,39889=>21411,39890=>21412,39891=>21413,39893=>21414,39895=>21415,39896=>21416,39897=>21417,39898=>21418,39900=>21419,39902=>21420,39903=>21421,39904=>21422,39907=>21423,39909=>21424,39910=>21425,39913=>21426,39916=>21427,39917=>21428,39918=>21429,39919=>21430,39921=>21431,39922=>21432,39923=>21433,39925=>21434,39926=>21435,39927=>21436,39928=>21437,39929=>21438,39930=>21439,39931=>21440,39932=>21441,39934=>21442,39936=>21443,39937=>21444,39938=>21445,39939=>21446,39940=>21447,39941=>21448,39942=>21449,39943=>21450,39946=>21451,39947=>21452,39948=>21453,39950=>21454,39951=>21455,39953=>21456,39956=>21457,39957=>21458,39958=>21459,39959=>21460,39960=>21461,39961=>21462,39962=>21463,39963=>21464,39964=>21465,39965=>21466,39966=>21467,39967=>21468,39969=>21469,39970=>21470,39972=>21471,39974=>21472,39975=>21473,39978=>21474,39979=>21475,39980=>21476,39982=>21477,39983=>21478,39984=>21479,39988=>21480,39990=>21481,39992=>21482,39994=>21483,39996=>21484,39997=>21485,39999=>21486,40000=>21487,40001=>21488,40002=>21489,40003=>21490,40004=>21491,40006=>21492,40007=>21493,40010=>21494,40011=>21495,40012=>21496,40013=>21497,40014=>21498,40015=>21499,40016=>21500,40017=>21501,40019=>21502,40021=>21503,40025=>21504,40026=>21505,40027=>21506,40028=>21507,40030=>21508,40032=>21509,40033=>21510,40034=>21511,40035=>21512,40036=>21513,40037=>21514,40038=>21515,40040=>21516,40041=>21517,40042=>21518,40043=>21519,40044=>21520,40046=>21521,40047=>21522,40048=>21523,40049=>21524,40050=>21525,40051=>21526,40052=>21527,40053=>21528,40054=>21529,40055=>21530,40057=>21531,40059=>21532,40061=>21533,40062=>21534,40064=>21535,40067=>21536,40068=>21537,40073=>21538,40074=>21539,40076=>21540,40079=>21541,40083=>21542,40086=>21543,40087=>21544,40088=>21545,40089=>21546,40093=>21547,40106=>21548,40108=>21549,40111=>21550,40121=>21551,40126=>21552,40127=>21553,40128=>21554,40129=>21555,40130=>21556,40136=>21557,40137=>21558,40145=>21559,40146=>21560,40154=>21561,40155=>21562,40160=>21563,40161=>21564,40163=>21565,40164=>21566,40166=>21567,40167=>21568,40168=>21569,40170=>21570,40171=>21571,40173=>21572,40174=>21573,40175=>21574,40176=>21575,40177=>21576,40178=>21577,40181=>21578,40183=>21579,40184=>21580,40185=>21581,40186=>21582,40187=>21583,40188=>21584,40189=>21585,40190=>21586,40191=>21587,40192=>21588,40193=>21589,40194=>21590,40195=>21591,40196=>21592,40197=>21593,40200=>21594,40202=>21595,40203=>21596,40204=>21597,40205=>21598,40206=>21599,40207=>21600,40208=>21601,40209=>21602,40210=>21603,40211=>21604,40212=>21605,40214=>21606,40215=>21607,40216=>21608,40217=>21609,40218=>21610,40220=>21611,40222=>21612,40224=>21613,40225=>21614,40226=>21615,40228=>21616,40229=>21617,40231=>21618,40233=>21619,40234=>21620,40235=>21621,40236=>21622,40237=>21623,40238=>21624,40241=>21625,40242=>21626,40243=>21627,40244=>21628,40245=>21629,40246=>21630,40247=>21631,40248=>21632,40249=>21633,40250=>21634,40252=>21635,40253=>21636,40254=>21637,40256=>21638,40257=>21639,40259=>21640,40260=>21641,40261=>21642,40262=>21643,40263=>21644,40264=>21645,40265=>21646,40266=>21647,40267=>21648,40268=>21649,40269=>21650,40270=>21651,40271=>21652,40272=>21653,40276=>21654,40277=>21655,40278=>21656,40279=>21657,40280=>21658,40281=>21659,40282=>21660,40283=>21661,40286=>21662,40287=>21663,40290=>21664,40291=>21665,40292=>21666,40293=>21667,40294=>21668,40295=>21669,40296=>21670,40297=>21671,40299=>21672,40301=>21673,40302=>21674,40304=>21675,40305=>21676,40307=>21677,40308=>21678,40309=>21679,40310=>21680,40311=>21681,40312=>21682,40313=>21683,40314=>21684,40315=>21685,40316=>21686,40317=>21687,40318=>21688,40319=>21689,40320=>21690,40321=>21691,40322=>21692,40323=>21693,40324=>21694,40325=>21695,40326=>21696,40328=>21697,40330=>21698,40331=>21699,40332=>21700,40333=>21701,40334=>21702,40335=>21703,40336=>21704,40337=>21705,40338=>21706,40340=>21707,40341=>21708,40342=>21709,40343=>21710,40345=>21711,40347=>21712,40348=>21713,40349=>21714,40350=>21715,40351=>21716,40352=>21717,40353=>21718,40354=>21719,40355=>21720,40356=>21721,40358=>21722,40359=>21723,40360=>21724,40362=>21725,40363=>21726,40364=>21727,40365=>21728,40366=>21729,40368=>21730,40369=>21731,40370=>21732,40371=>21733,40373=>21734,40374=>21735,40375=>21736,40376=>21737,40377=>21738,40378=>21739,40381=>21740,40382=>21741,40383=>21742,40385=>21743,40387=>21744,40389=>21745,40390=>21746,40391=>21747,40392=>21748,40393=>21749,40394=>21750,40395=>21751,40396=>21752,40397=>21753,40398=>21754,40399=>21755,40400=>21756,40401=>21757,40402=>21758,40404=>21759,40405=>21760,40406=>21761,40408=>21762,40411=>21763,40412=>21764,40413=>21765,40414=>21766,40415=>21767,40416=>21768,40417=>21769,40418=>21770,40419=>21771,40420=>21772,40423=>21773,40424=>21774,40425=>21775,40426=>21776,40427=>21777,40428=>21778,40429=>21779,40430=>21780,40432=>21781,40433=>21782,40436=>21783,40437=>21784,40438=>21785,40439=>21786,40443=>21787,40444=>21788,40445=>21789,40446=>21790,40447=>21791,40448=>21792,40449=>21793,40450=>21794,40451=>21795,40452=>21796,40453=>21797,40454=>21798,40455=>21799,40456=>21800,40457=>21801,40458=>21802,40459=>21803,40461=>21804,40462=>21805,40463=>21806,40464=>21807,40465=>21808,40466=>21809,40467=>21810,40468=>21811,40470=>21812,40471=>21813,40472=>21814,40473=>21815,40476=>21816,40484=>21817,40487=>21818,40494=>21819,40496=>21820,40500=>21821,40507=>21822,40508=>21823,40512=>21824,40525=>21825,40528=>21826,40530=>21827,40531=>21828,40532=>21829,40534=>21830,40537=>21831,40541=>21832,40543=>21833,40544=>21834,40545=>21835,40546=>21836,40549=>21837,40558=>21838,40559=>21839,40562=>21840,40564=>21841,40566=>21842,40567=>21843,40568=>21844,40571=>21845,40576=>21846,40577=>21847,40579=>21848,40580=>21849,40581=>21850,40582=>21851,40585=>21852,40586=>21853,40588=>21854,40589=>21855,40590=>21856,40591=>21857,40592=>21858,40593=>21859,40596=>21860,40597=>21861,40598=>21862,40600=>21863,40601=>21864,40602=>21865,40603=>21866,40604=>21867,40606=>21868,40608=>21869,40609=>21870,40610=>21871,40611=>21872,40612=>21873,40615=>21874,40616=>21875,40618=>21876,40619=>21877,40620=>21878,40621=>21879,40622=>21880,40624=>21881,40625=>21882,40626=>21883,40627=>21884,40630=>21885,40631=>21886,40633=>21887,40634=>21888,40636=>21889,40639=>21890,40640=>21891,40641=>21892,40642=>21893,12232=>21894,40643=>21894,40645=>21895,40646=>21896,40647=>21897,40648=>21898,40650=>21899,40651=>21900,40656=>21901,40658=>21902,40659=>21903,40661=>21904,40662=>21905,40663=>21906,40665=>21907,40666=>21908,40673=>21909,40675=>21910,40676=>21911,40678=>21912,40683=>21913,40684=>21914,40685=>21915,40686=>21916,40688=>21917,40689=>21918,40691=>21919,40693=>21920,40694=>21921,40696=>21922,40698=>21923,40704=>21924,40705=>21925,40706=>21926,40707=>21927,40708=>21928,40709=>21929,40710=>21930,40711=>21931,40712=>21932,40714=>21933,40716=>21934,40719=>21935,40721=>21936,40722=>21937,40724=>21938,40726=>21939,40728=>21940,40730=>21941,40731=>21942,40732=>21943,40733=>21944,40734=>21945,40735=>21946,40737=>21947,40739=>21948,40740=>21949,40741=>21950,40742=>21951,40743=>21952,40744=>21953,40745=>21954,40746=>21955,40747=>21956,40749=>21957,40750=>21958,40752=>21959,40753=>21960,40754=>21961,40755=>21962,40756=>21963,40757=>21964,40758=>21965,40760=>21966,40762=>21967,40764=>21968,40767=>21969,40768=>21970,40769=>21971,40770=>21972,40771=>21973,40773=>21974,40774=>21975,40775=>21976,40776=>21977,40777=>21978,40780=>21979,40781=>21980,40782=>21981,40787=>21982,40789=>21983,40790=>21984,40791=>21985,40792=>21986,40794=>21987,40795=>21988,40797=>21989,40798=>21990,40802=>21991,40804=>21992,40805=>21993,40807=>21994,40808=>21995,40809=>21996,40811=>21997,40813=>21998,40814=>21999,40815=>22000,40816=>22001,40817=>22002,40819=>22003,40820=>22004,40821=>22005,40822=>22006,40824=>22007,40825=>22008,40826=>22009,40827=>22010,40828=>22011,40829=>22012,40830=>22013,40833=>22014,40834=>22015,40846=>22016,40847=>22017,40849=>22018,40850=>22019,40851=>22020,40854=>22021,40855=>22022,40856=>22023,40861=>22024,40862=>22025,40865=>22026,40866=>22027,40867=>22028,40868=>22029,40869=>22030,63788=>22031,64013=>22032,64014=>22033,64015=>22034,64017=>22035,64019=>22036,64020=>22037,64024=>22038,64031=>22039,64032=>22040,64033=>22041,64035=>22042,64036=>22043,64039=>22044,64040=>22045,64041=>22046,11905=>22047,59413=>22047,131207=>22048,59414=>22048,131209=>22049,59415=>22049,131276=>22050,59416=>22050,11908=>22051,59417=>22051,13427=>22052,59418=>22052,13383=>22053,59419=>22053,11912=>22054,59420=>22054,11915=>22055,59421=>22055,40884=>22056,59422=>22056,13726=>22057,59423=>22057,13850=>22058,59424=>22058,13838=>22059,59425=>22059,11916=>22060,59426=>22060,11927=>22061,59427=>22061,14702=>22062,59428=>22062,14616=>22063,59429=>22063,40885=>22064,59430=>22064,14799=>22065,59431=>22065,14815=>22066,59432=>22066,14963=>22067,59433=>22067,14800=>22068,59434=>22068,40886=>22069,59435=>22069,40887=>22070,59436=>22070,15182=>22071,59437=>22071,15470=>22072,59438=>22072,15584=>22073,59439=>22073,11943=>22074,59440=>22074,136663=>22075,59441=>22075,40888=>22076,59442=>22076,11946=>22077,59443=>22077,16470=>22078,59444=>22078,16735=>22079,59445=>22079,11950=>22080,59446=>22080,17207=>22081,59447=>22081,11955=>22082,59448=>22082,11958=>22083,59449=>22083,11959=>22084,59450=>22084,141711=>22085,59451=>22085,17329=>22086,59452=>22086,17324=>22087,59453=>22087,11963=>22088,59454=>22088,17373=>22089,59455=>22089,17622=>22090,59456=>22090,18017=>22091,59457=>22091,17996=>22092,59458=>22092,40889=>22093,132361=>22093,59459=>22093,18211=>22094,59460=>22094,18217=>22095,59461=>22095,18300=>22096,59462=>22096,18317=>22097,59463=>22097,11978=>22098,59464=>22098,18759=>22099,59465=>22099,18810=>22100,59466=>22100,18813=>22101,59467=>22101,18818=>22102,59468=>22102,18819=>22103,59469=>22103,18821=>22104,59470=>22104,18822=>22105,59471=>22105,18847=>22106,59472=>22106,18843=>22107,59473=>22107,18871=>22108,59474=>22108,18870=>22109,59475=>22109,40890=>22110,133533=>22110,59476=>22110,147966=>22111,59477=>22111,19619=>22112,59478=>22112,19615=>22113,59479=>22113,19616=>22114,59480=>22114,19617=>22115,59481=>22115,19575=>22116,59482=>22116,19618=>22117,59483=>22117,19731=>22118,59484=>22118,19732=>22119,59485=>22119,19733=>22120,59486=>22120,19734=>22121,59487=>22121,19735=>22122,59488=>22122,19736=>22123,59489=>22123,19737=>22124,59490=>22124,19886=>22125,59491=>22125,40891=>22126,59492=>22126,8364=>22353,59244=>22353,165=>22354,12351=>22357,12436=>22375,12535=>22390,12537=>22391,12536=>22392,12538=>22393,12339=>22395,12340=>22396,12341=>22397,12344=>22398,12345=>22399,12346=>22400,12586=>22401,12587=>22402,12588=>22403,12704=>22404,12705=>22405,12706=>22406,12707=>22407,12708=>22408,12709=>22409,12710=>22410,12711=>22411,12712=>22412,12713=>22413,12714=>22414,12715=>22415,12716=>22416,12717=>22417,12718=>22418,12719=>22419,12720=>22420,12721=>22421,12722=>22422,12723=>22423,12724=>22424,12725=>22425,12726=>22426,12727=>22427,11904=>22428,11906=>22429,11907=>22430,11909=>22431,11910=>22432,11911=>22433,11913=>22434,11914=>22435,11917=>22436,11918=>22437,11919=>22438,11920=>22439,11921=>22440,11922=>22441,11923=>22442,11924=>22443,11925=>22444,11926=>22445,11928=>22446,11929=>22447,11931=>22448,11932=>22449,11933=>22450,11934=>22451,11935=>22452,11936=>22453,11937=>22454,11938=>22455,11939=>22456,11940=>22457,11941=>22458,11942=>22459,11944=>22460,11945=>22461,11947=>22462,11948=>22463,11949=>22464,11951=>22465,11952=>22466,11953=>22467,11954=>22468,11956=>22469,11957=>22470,11960=>22471,11961=>22472,11962=>22473,11964=>22474,11965=>22475,11966=>22476,11967=>22477,11968=>22478,11969=>22479,11970=>22480,11971=>22481,11972=>22482,11973=>22483,11974=>22484,11975=>22485,11976=>22486,11977=>22487,11979=>22488,11980=>22489,11981=>22490,11982=>22491,11983=>22492,11984=>22493,11985=>22494,11986=>22495,11987=>22496,11988=>22497,11989=>22498,11990=>22499,11991=>22500,11992=>22501,11993=>22502,11994=>22503,11995=>22504,11996=>22505,11997=>22506,11998=>22507,11999=>22508,12000=>22509,12001=>22510,12002=>22511,12003=>22512,12004=>22513,12005=>22514,12006=>22515,12007=>22516,12008=>22517,12009=>22518,12010=>22519,12011=>22520,12012=>22521,12013=>22522,12014=>22523,12015=>22524,12016=>22525,12017=>22526,12018=>22527,12019=>22528,13312=>22529,13313=>22530,13314=>22531,13315=>22532,13316=>22533,13317=>22534,13318=>22535,13319=>22536,13320=>22537,13321=>22538,13322=>22539,13323=>22540,13324=>22541,13325=>22542,13326=>22543,13327=>22544,13328=>22545,13329=>22546,13330=>22547,13331=>22548,13332=>22549,13333=>22550,13334=>22551,13335=>22552,13336=>22553,13337=>22554,13338=>22555,13339=>22556,13340=>22557,13341=>22558,13342=>22559,13343=>22560,13344=>22561,13345=>22562,13346=>22563,13347=>22564,13348=>22565,13349=>22566,13350=>22567,13351=>22568,13352=>22569,13353=>22570,13354=>22571,13355=>22572,13356=>22573,13357=>22574,13358=>22575,13359=>22576,13360=>22577,13361=>22578,13362=>22579,13363=>22580,13364=>22581,13365=>22582,13366=>22583,13367=>22584,13368=>22585,13369=>22586,13370=>22587,13371=>22588,13372=>22589,13373=>22590,13374=>22591,13375=>22592,13376=>22593,13377=>22594,13378=>22595,13379=>22596,13380=>22597,13381=>22598,13382=>22599,13384=>22600,13385=>22601,13386=>22602,13387=>22603,13388=>22604,13389=>22605,13390=>22606,13391=>22607,13392=>22608,13393=>22609,13394=>22610,13395=>22611,13396=>22612,13397=>22613,13398=>22614,13399=>22615,13400=>22616,13401=>22617,13402=>22618,13403=>22619,13404=>22620,13405=>22621,13406=>22622,13407=>22623,13408=>22624,13409=>22625,13410=>22626,13411=>22627,13412=>22628,13413=>22629,13414=>22630,13415=>22631,13416=>22632,13417=>22633,13418=>22634,13419=>22635,13420=>22636,13421=>22637,13422=>22638,13423=>22639,13424=>22640,13425=>22641,13426=>22642,13428=>22643,13429=>22644,13430=>22645,13431=>22646,13432=>22647,13433=>22648,13434=>22649,13435=>22650,13436=>22651,13437=>22652,13438=>22653,13439=>22654,13440=>22655,13441=>22656,13442=>22657,13443=>22658,13444=>22659,13445=>22660,13446=>22661,13447=>22662,13448=>22663,13449=>22664,13450=>22665,13451=>22666,13452=>22667,13453=>22668,13454=>22669,13455=>22670,13456=>22671,13457=>22672,13458=>22673,13459=>22674,13460=>22675,13461=>22676,13462=>22677,13463=>22678,13464=>22679,13465=>22680,13466=>22681,13467=>22682,13468=>22683,13469=>22684,13470=>22685,13471=>22686,13472=>22687,13473=>22688,13474=>22689,13475=>22690,13476=>22691,13477=>22692,13478=>22693,13479=>22694,13480=>22695,13481=>22696,13482=>22697,13483=>22698,13484=>22699,13485=>22700,13486=>22701,13487=>22702,13488=>22703,13489=>22704,13490=>22705,13491=>22706,13492=>22707,13493=>22708,13494=>22709,13495=>22710,13496=>22711,13497=>22712,13498=>22713,13499=>22714,13500=>22715,13501=>22716,13502=>22717,13503=>22718,13504=>22719,13505=>22720,13506=>22721,13507=>22722,13508=>22723,13509=>22724,13510=>22725,13511=>22726,13512=>22727,13513=>22728,13514=>22729,13515=>22730,13516=>22731,13517=>22732,13518=>22733,13519=>22734,13520=>22735,13521=>22736,13522=>22737,13523=>22738,13524=>22739,13525=>22740,13526=>22741,13527=>22742,13528=>22743,13529=>22744,13530=>22745,13531=>22746,13532=>22747,13533=>22748,13534=>22749,13535=>22750,13536=>22751,13537=>22752,13538=>22753,13539=>22754,13540=>22755,13541=>22756,13542=>22757,13543=>22758,13544=>22759,13545=>22760,13546=>22761,13547=>22762,13548=>22763,13549=>22764,13550=>22765,13551=>22766,13552=>22767,13553=>22768,13554=>22769,13555=>22770,13556=>22771,13557=>22772,13558=>22773,13559=>22774,13560=>22775,13561=>22776,13562=>22777,13563=>22778,13564=>22779,13565=>22780,13566=>22781,13567=>22782,13568=>22783,13569=>22784,13570=>22785,13571=>22786,13572=>22787,13573=>22788,13574=>22789,13575=>22790,13576=>22791,13577=>22792,13578=>22793,13579=>22794,13580=>22795,13581=>22796,13582=>22797,13583=>22798,13584=>22799,13585=>22800,13586=>22801,13587=>22802,13588=>22803,13589=>22804,13590=>22805,13591=>22806,13592=>22807,13593=>22808,13594=>22809,13595=>22810,13596=>22811,13597=>22812,13598=>22813,13599=>22814,13600=>22815,13601=>22816,13602=>22817,13603=>22818,13604=>22819,13605=>22820,13606=>22821,13607=>22822,13608=>22823,13609=>22824,13610=>22825,13611=>22826,13612=>22827,13613=>22828,13614=>22829,13615=>22830,13616=>22831,13617=>22832,13618=>22833,13619=>22834,13620=>22835,13621=>22836,13622=>22837,13623=>22838,13624=>22839,13625=>22840,13626=>22841,13627=>22842,13628=>22843,13629=>22844,13630=>22845,13631=>22846,13632=>22847,13633=>22848,13634=>22849,13635=>22850,13636=>22851,13637=>22852,13638=>22853,13639=>22854,13640=>22855,13641=>22856,13642=>22857,13643=>22858,13644=>22859,13645=>22860,13646=>22861,13647=>22862,13648=>22863,13649=>22864,13650=>22865,13651=>22866,13652=>22867,13653=>22868,13654=>22869,13655=>22870,13656=>22871,13657=>22872,13658=>22873,13659=>22874,13660=>22875,13661=>22876,13662=>22877,13663=>22878,13664=>22879,13665=>22880,13666=>22881,13667=>22882,13668=>22883,13669=>22884,13670=>22885,13671=>22886,13672=>22887,13673=>22888,13674=>22889,13675=>22890,13676=>22891,13677=>22892,13678=>22893,13679=>22894,13680=>22895,13681=>22896,13682=>22897,13683=>22898,13684=>22899,13685=>22900,13686=>22901,13687=>22902,13688=>22903,13689=>22904,13690=>22905,13691=>22906,13692=>22907,13693=>22908,13694=>22909,13695=>22910,13696=>22911,13697=>22912,13698=>22913,13699=>22914,13700=>22915,13701=>22916,13702=>22917,13703=>22918,13704=>22919,13705=>22920,13706=>22921,13707=>22922,13708=>22923,13709=>22924,13710=>22925,13711=>22926,13712=>22927,13713=>22928,13714=>22929,13715=>22930,13716=>22931,13717=>22932,13718=>22933,13719=>22934,13720=>22935,13721=>22936,13722=>22937,13723=>22938,13724=>22939,13725=>22940,13727=>22941,13728=>22942,13729=>22943,13730=>22944,13731=>22945,13732=>22946,13733=>22947,13734=>22948,13735=>22949,13736=>22950,13737=>22951,13738=>22952,13739=>22953,13740=>22954,13741=>22955,13742=>22956,13743=>22957,13744=>22958,13745=>22959,13746=>22960,13747=>22961,13748=>22962,13749=>22963,13750=>22964,13751=>22965,13752=>22966,13753=>22967,13754=>22968,13755=>22969,13756=>22970,13757=>22971,13758=>22972,13759=>22973,13760=>22974,13761=>22975,13762=>22976,13763=>22977,13764=>22978,13765=>22979,13766=>22980,13767=>22981,13768=>22982,13769=>22983,13770=>22984,13771=>22985,13772=>22986,13773=>22987,13774=>22988,13775=>22989,13776=>22990,13777=>22991,13778=>22992,13779=>22993,13780=>22994,13781=>22995,13782=>22996,13783=>22997,13784=>22998,13785=>22999,13786=>23000,13787=>23001,13788=>23002,13789=>23003,13790=>23004,13791=>23005,13792=>23006,13793=>23007,13794=>23008,13795=>23009,13796=>23010,13797=>23011,13798=>23012,13799=>23013,13800=>23014,13801=>23015,13802=>23016,13803=>23017,13804=>23018,13805=>23019,13806=>23020,13807=>23021,13808=>23022,13809=>23023,13810=>23024,13811=>23025,13812=>23026,13813=>23027,13814=>23028,13815=>23029,13816=>23030,13817=>23031,13818=>23032,13819=>23033,13820=>23034,13821=>23035,13822=>23036,13823=>23037,13824=>23038,13825=>23039,13826=>23040,13827=>23041,13828=>23042,13829=>23043,13830=>23044,13831=>23045,13832=>23046,13833=>23047,13834=>23048,13835=>23049,13836=>23050,13837=>23051,13839=>23052,13840=>23053,13841=>23054,13842=>23055,13843=>23056,13844=>23057,13845=>23058,13846=>23059,13847=>23060,13848=>23061,13849=>23062,13851=>23063,13852=>23064,13853=>23065,13854=>23066,13855=>23067,13856=>23068,13857=>23069,13858=>23070,13859=>23071,13860=>23072,13861=>23073,13862=>23074,13863=>23075,13864=>23076,13865=>23077,13866=>23078,13867=>23079,13868=>23080,13869=>23081,13870=>23082,13871=>23083,13872=>23084,13873=>23085,13874=>23086,13875=>23087,13876=>23088,13877=>23089,13878=>23090,13879=>23091,13880=>23092,13881=>23093,13882=>23094,13883=>23095,13884=>23096,13885=>23097,13886=>23098,13887=>23099,13888=>23100,13889=>23101,13890=>23102,13891=>23103,13892=>23104,13893=>23105,13894=>23106,13895=>23107,13896=>23108,13897=>23109,13898=>23110,13899=>23111,13900=>23112,13901=>23113,13902=>23114,13903=>23115,13904=>23116,13905=>23117,13906=>23118,13907=>23119,13908=>23120,13909=>23121,13910=>23122,13911=>23123,13912=>23124,13913=>23125,13914=>23126,13915=>23127,13916=>23128,13917=>23129,13918=>23130,13919=>23131,13920=>23132,13921=>23133,13922=>23134,13923=>23135,13924=>23136,13925=>23137,13926=>23138,13927=>23139,13928=>23140,13929=>23141,13930=>23142,13931=>23143,13932=>23144,13933=>23145,13934=>23146,13935=>23147,13936=>23148,13937=>23149,13938=>23150,13939=>23151,13940=>23152,13941=>23153,13942=>23154,13943=>23155,13944=>23156,13945=>23157,13946=>23158,13947=>23159,13948=>23160,13949=>23161,13950=>23162,13951=>23163,13952=>23164,13953=>23165,13954=>23166,13955=>23167,13956=>23168,13957=>23169,13958=>23170,13959=>23171,13960=>23172,13961=>23173,13962=>23174,13963=>23175,13964=>23176,13965=>23177,13966=>23178,13967=>23179,13968=>23180,13969=>23181,13970=>23182,13971=>23183,13972=>23184,13973=>23185,13974=>23186,13975=>23187,13976=>23188,13977=>23189,13978=>23190,13979=>23191,13980=>23192,13981=>23193,13982=>23194,13983=>23195,13984=>23196,13985=>23197,13986=>23198,13987=>23199,13988=>23200,13989=>23201,13990=>23202,13991=>23203,13992=>23204,13993=>23205,13994=>23206,13995=>23207,13996=>23208,13997=>23209,13998=>23210,13999=>23211,14000=>23212,14001=>23213,14002=>23214,14003=>23215,14004=>23216,14005=>23217,14006=>23218,14007=>23219,14008=>23220,14009=>23221,14010=>23222,14011=>23223,14012=>23224,14013=>23225,14014=>23226,14015=>23227,14016=>23228,14017=>23229,14018=>23230,14019=>23231,14020=>23232,14021=>23233,14022=>23234,14023=>23235,14024=>23236,14025=>23237,14026=>23238,14027=>23239,14028=>23240,14029=>23241,14030=>23242,14031=>23243,14032=>23244,14033=>23245,14034=>23246,14035=>23247,14036=>23248,14037=>23249,14038=>23250,14039=>23251,14040=>23252,14041=>23253,14042=>23254,14043=>23255,14044=>23256,14045=>23257,14046=>23258,14047=>23259,14048=>23260,14049=>23261,14050=>23262,14051=>23263,14052=>23264,14053=>23265,14054=>23266,14055=>23267,14056=>23268,14057=>23269,14058=>23270,14059=>23271,14060=>23272,14061=>23273,14062=>23274,14063=>23275,14064=>23276,14065=>23277,14066=>23278,14067=>23279,14068=>23280,14069=>23281,14070=>23282,14071=>23283,14072=>23284,14073=>23285,14074=>23286,14075=>23287,14076=>23288,14077=>23289,14078=>23290,14079=>23291,14080=>23292,14081=>23293,14082=>23294,14083=>23295,14084=>23296,14085=>23297,14086=>23298,14087=>23299,14088=>23300,14089=>23301,14090=>23302,14091=>23303,14092=>23304,14093=>23305,14094=>23306,14095=>23307,14096=>23308,14097=>23309,14098=>23310,14099=>23311,14100=>23312,14101=>23313,14102=>23314,14103=>23315,14104=>23316,14105=>23317,14106=>23318,14107=>23319,14108=>23320,14109=>23321,14110=>23322,14111=>23323,14112=>23324,14113=>23325,14114=>23326,14115=>23327,14116=>23328,14117=>23329,14118=>23330,14119=>23331,14120=>23332,14121=>23333,14122=>23334,14123=>23335,14124=>23336,14125=>23337,14126=>23338,14127=>23339,14128=>23340,14129=>23341,14130=>23342,14131=>23343,14132=>23344,14133=>23345,14134=>23346,14135=>23347,14136=>23348,14137=>23349,14138=>23350,14139=>23351,14140=>23352,14141=>23353,14142=>23354,14143=>23355,14144=>23356,14145=>23357,14146=>23358,14147=>23359,14148=>23360,14149=>23361,14150=>23362,14151=>23363,14152=>23364,14153=>23365,14154=>23366,14155=>23367,14156=>23368,14157=>23369,14158=>23370,14159=>23371,14160=>23372,14161=>23373,14162=>23374,14163=>23375,14164=>23376,14165=>23377,14166=>23378,14167=>23379,14168=>23380,14169=>23381,14170=>23382,14171=>23383,14172=>23384,14173=>23385,14174=>23386,14175=>23387,14176=>23388,14177=>23389,14178=>23390,14179=>23391,14180=>23392,14181=>23393,14182=>23394,14183=>23395,14184=>23396,14185=>23397,14186=>23398,14187=>23399,14188=>23400,14189=>23401,14190=>23402,14191=>23403,14192=>23404,14193=>23405,14194=>23406,14195=>23407,14196=>23408,14197=>23409,14198=>23410,14199=>23411,14200=>23412,14201=>23413,14202=>23414,14203=>23415,14204=>23416,14205=>23417,14206=>23418,14207=>23419,14208=>23420,14209=>23421,14210=>23422,14211=>23423,14212=>23424,14213=>23425,14214=>23426,14215=>23427,14216=>23428,14217=>23429,14218=>23430,14219=>23431,14220=>23432,14221=>23433,14222=>23434,14223=>23435,14224=>23436,14225=>23437,14226=>23438,14227=>23439,14228=>23440,14229=>23441,14230=>23442,14231=>23443,14232=>23444,14233=>23445,14234=>23446,14235=>23447,14236=>23448,14237=>23449,14238=>23450,14239=>23451,14240=>23452,14241=>23453,14242=>23454,14243=>23455,14244=>23456,14245=>23457,14246=>23458,14247=>23459,14248=>23460,14249=>23461,14250=>23462,14251=>23463,14252=>23464,14253=>23465,14254=>23466,14255=>23467,14256=>23468,14257=>23469,14258=>23470,14259=>23471,14260=>23472,14261=>23473,14262=>23474,14263=>23475,14264=>23476,14265=>23477,14266=>23478,14267=>23479,14268=>23480,14269=>23481,14270=>23482,14271=>23483,14272=>23484,14273=>23485,14274=>23486,14275=>23487,14276=>23488,14277=>23489,14278=>23490,14279=>23491,14280=>23492,14281=>23493,14282=>23494,14283=>23495,14284=>23496,14285=>23497,14286=>23498,14287=>23499,14288=>23500,14289=>23501,14290=>23502,14291=>23503,14292=>23504,14293=>23505,14294=>23506,14295=>23507,14296=>23508,14297=>23509,14298=>23510,14299=>23511,14300=>23512,14301=>23513,14302=>23514,14303=>23515,14304=>23516,14305=>23517,14306=>23518,14307=>23519,14308=>23520,14309=>23521,14310=>23522,14311=>23523,14312=>23524,14313=>23525,14314=>23526,14315=>23527,14316=>23528,14317=>23529,14318=>23530,14319=>23531,14320=>23532,14321=>23533,14322=>23534,14323=>23535,14324=>23536,14325=>23537,14326=>23538,14327=>23539,14328=>23540,14329=>23541,14330=>23542,14331=>23543,14332=>23544,14333=>23545,14334=>23546,14335=>23547,14336=>23548,14337=>23549,14338=>23550,14339=>23551,14340=>23552,14341=>23553,14342=>23554,14343=>23555,14344=>23556,14345=>23557,14346=>23558,14347=>23559,14348=>23560,14349=>23561,14350=>23562,14351=>23563,14352=>23564,14353=>23565,14354=>23566,14355=>23567,14356=>23568,14357=>23569,14358=>23570,14359=>23571,14360=>23572,14361=>23573,14362=>23574,14363=>23575,14364=>23576,14365=>23577,14366=>23578,14367=>23579,14368=>23580,14369=>23581,14370=>23582,14371=>23583,14372=>23584,14373=>23585,14374=>23586,14375=>23587,14376=>23588,14377=>23589,14378=>23590,14379=>23591,14380=>23592,14381=>23593,14382=>23594,14383=>23595,14384=>23596,14385=>23597,14386=>23598,14387=>23599,14388=>23600,14389=>23601,14390=>23602,14391=>23603,14392=>23604,14393=>23605,14394=>23606,14395=>23607,14396=>23608,14397=>23609,14398=>23610,14399=>23611,14400=>23612,14401=>23613,14402=>23614,14403=>23615,14404=>23616,14405=>23617,14406=>23618,14407=>23619,14408=>23620,14409=>23621,14410=>23622,14411=>23623,14412=>23624,14413=>23625,14414=>23626,14415=>23627,14416=>23628,14417=>23629,14418=>23630,14419=>23631,14420=>23632,14421=>23633,14422=>23634,14423=>23635,14424=>23636,14425=>23637,14426=>23638,14427=>23639,14428=>23640,14429=>23641,14430=>23642,14431=>23643,14432=>23644,14433=>23645,14434=>23646,14435=>23647,14436=>23648,14437=>23649,14438=>23650,14439=>23651,14440=>23652,14441=>23653,14442=>23654,14443=>23655,14444=>23656,14445=>23657,14446=>23658,14447=>23659,14448=>23660,14449=>23661,14450=>23662,14451=>23663,14452=>23664,14453=>23665,14454=>23666,14455=>23667,14456=>23668,14457=>23669,14458=>23670,14459=>23671,14460=>23672,14461=>23673,14462=>23674,14463=>23675,14464=>23676,14465=>23677,14466=>23678,14467=>23679,14468=>23680,14469=>23681,14470=>23682,14471=>23683,14472=>23684,14473=>23685,14474=>23686,14475=>23687,14476=>23688,14477=>23689,14478=>23690,14479=>23691,14480=>23692,14481=>23693,14482=>23694,14483=>23695,14484=>23696,14485=>23697,14486=>23698,14487=>23699,14488=>23700,14489=>23701,14490=>23702,14491=>23703,14492=>23704,14493=>23705,14494=>23706,14495=>23707,14496=>23708,14497=>23709,14498=>23710,14499=>23711,14500=>23712,14501=>23713,14502=>23714,14503=>23715,14504=>23716,14505=>23717,14506=>23718,14507=>23719,14508=>23720,14509=>23721,14510=>23722,14511=>23723,14512=>23724,14513=>23725,14514=>23726,14515=>23727,14516=>23728,14517=>23729,14518=>23730,14519=>23731,14520=>23732,14521=>23733,14522=>23734,14523=>23735,14524=>23736,14525=>23737,14526=>23738,14527=>23739,14528=>23740,14529=>23741,14530=>23742,14531=>23743,14532=>23744,14533=>23745,14534=>23746,14535=>23747,14536=>23748,14537=>23749,14538=>23750,14539=>23751,14540=>23752,14541=>23753,14542=>23754,14543=>23755,14544=>23756,14545=>23757,14546=>23758,14547=>23759,14548=>23760,14549=>23761,14550=>23762,14551=>23763,14552=>23764,14553=>23765,14554=>23766,14555=>23767,14556=>23768,14557=>23769,14558=>23770,14559=>23771,14560=>23772,14561=>23773,14562=>23774,14563=>23775,14564=>23776,14565=>23777,14566=>23778,14567=>23779,14568=>23780,14569=>23781,14570=>23782,14571=>23783,14572=>23784,14573=>23785,14574=>23786,14575=>23787,14576=>23788,14577=>23789,14578=>23790,14579=>23791,14580=>23792,14581=>23793,14582=>23794,14583=>23795,14584=>23796,14585=>23797,14586=>23798,14587=>23799,14588=>23800,14589=>23801,14590=>23802,14591=>23803,14592=>23804,14593=>23805,14594=>23806,14595=>23807,14596=>23808,14597=>23809,14598=>23810,14599=>23811,14600=>23812,14601=>23813,14602=>23814,14603=>23815,14604=>23816,14605=>23817,14606=>23818,14607=>23819,14608=>23820,14609=>23821,14610=>23822,14611=>23823,14612=>23824,14613=>23825,14614=>23826,14615=>23827,14617=>23828,14618=>23829,14619=>23830,14620=>23831,14621=>23832,14622=>23833,14623=>23834,14624=>23835,14625=>23836,14626=>23837,14627=>23838,14628=>23839,14629=>23840,14630=>23841,14631=>23842,14632=>23843,14633=>23844,14634=>23845,14635=>23846,14636=>23847,14637=>23848,14638=>23849,14639=>23850,14640=>23851,14641=>23852,14642=>23853,14643=>23854,14644=>23855,14645=>23856,14646=>23857,14647=>23858,14648=>23859,14649=>23860,14650=>23861,14651=>23862,14652=>23863,14653=>23864,14654=>23865,14655=>23866,14656=>23867,14657=>23868,14658=>23869,14659=>23870,14660=>23871,14661=>23872,14662=>23873,14663=>23874,14664=>23875,14665=>23876,14666=>23877,14667=>23878,14668=>23879,14669=>23880,14670=>23881,14671=>23882,14672=>23883,14673=>23884,14674=>23885,14675=>23886,14676=>23887,14677=>23888,14678=>23889,14679=>23890,14680=>23891,14681=>23892,14682=>23893,14683=>23894,14684=>23895,14685=>23896,14686=>23897,14687=>23898,14688=>23899,14689=>23900,14690=>23901,14691=>23902,14692=>23903,14693=>23904,14694=>23905,14695=>23906,14696=>23907,14697=>23908,14698=>23909,14699=>23910,14700=>23911,14701=>23912,14703=>23913,14704=>23914,14705=>23915,14706=>23916,14707=>23917,14708=>23918,14709=>23919,14710=>23920,14711=>23921,14712=>23922,14713=>23923,14714=>23924,14715=>23925,14716=>23926,14717=>23927,14718=>23928,14719=>23929,14720=>23930,14721=>23931,14722=>23932,14723=>23933,14724=>23934,14725=>23935,14726=>23936,14727=>23937,14728=>23938,14729=>23939,14730=>23940,14731=>23941,14732=>23942,14733=>23943,14734=>23944,14735=>23945,14736=>23946,14737=>23947,14738=>23948,14739=>23949,14740=>23950,14741=>23951,14742=>23952,14743=>23953,14744=>23954,14745=>23955,14746=>23956,14747=>23957,14748=>23958,14749=>23959,14750=>23960,14751=>23961,14752=>23962,14753=>23963,14754=>23964,14755=>23965,14756=>23966,14757=>23967,14758=>23968,14759=>23969,14760=>23970,14761=>23971,14762=>23972,14763=>23973,14764=>23974,14765=>23975,14766=>23976,14767=>23977,14768=>23978,14769=>23979,14770=>23980,14771=>23981,14772=>23982,14773=>23983,14774=>23984,14775=>23985,14776=>23986,14777=>23987,14778=>23988,14779=>23989,14780=>23990,14781=>23991,14782=>23992,14783=>23993,14784=>23994,14785=>23995,14786=>23996,14787=>23997,14788=>23998,14789=>23999,14790=>24000,14791=>24001,14792=>24002,14793=>24003,14794=>24004,14795=>24005,14796=>24006,14797=>24007,14798=>24008,14801=>24009,14802=>24010,14803=>24011,14804=>24012,14805=>24013,14806=>24014,14807=>24015,14808=>24016,14809=>24017,14810=>24018,14811=>24019,14812=>24020,14813=>24021,14814=>24022,14816=>24023,14817=>24024,14818=>24025,14819=>24026,14820=>24027,14821=>24028,14822=>24029,14823=>24030,14824=>24031,14825=>24032,14826=>24033,14827=>24034,14828=>24035,14829=>24036,14830=>24037,14831=>24038,14832=>24039,14833=>24040,14834=>24041,14835=>24042,14836=>24043,14837=>24044,14838=>24045,14839=>24046,14840=>24047,14841=>24048,14842=>24049,14843=>24050,14844=>24051,14845=>24052,14846=>24053,14847=>24054,14848=>24055,14849=>24056,14850=>24057,14851=>24058,14852=>24059,14853=>24060,14854=>24061,14855=>24062,14856=>24063,14857=>24064,14858=>24065,14859=>24066,14860=>24067,14861=>24068,14862=>24069,14863=>24070,14864=>24071,14865=>24072,14866=>24073,14867=>24074,14868=>24075,14869=>24076,14870=>24077,14871=>24078,14872=>24079,14873=>24080,14874=>24081,14875=>24082,14876=>24083,14877=>24084,14878=>24085,14879=>24086,14880=>24087,14881=>24088,14882=>24089,14883=>24090,14884=>24091,14885=>24092,14886=>24093,14887=>24094,14888=>24095,14889=>24096,14890=>24097,14891=>24098,14892=>24099,14893=>24100,14894=>24101,14895=>24102,14896=>24103,14897=>24104,14898=>24105,14899=>24106,14900=>24107,14901=>24108,14902=>24109,14903=>24110,14904=>24111,14905=>24112,14906=>24113,14907=>24114,14908=>24115,14909=>24116,14910=>24117,14911=>24118,14912=>24119,14913=>24120,14914=>24121,14915=>24122,14916=>24123,14917=>24124,14918=>24125,14919=>24126,14920=>24127,14921=>24128,14922=>24129,14923=>24130,14924=>24131,14925=>24132,14926=>24133,14927=>24134,14928=>24135,14929=>24136,14930=>24137,14931=>24138,14932=>24139,14933=>24140,14934=>24141,14935=>24142,14936=>24143,14937=>24144,14938=>24145,14939=>24146,14940=>24147,14941=>24148,14942=>24149,14943=>24150,14944=>24151,14945=>24152,14946=>24153,14947=>24154,14948=>24155,14949=>24156,14950=>24157,14951=>24158,14952=>24159,14953=>24160,14954=>24161,14955=>24162,14956=>24163,14957=>24164,14958=>24165,14959=>24166,14960=>24167,14961=>24168,14962=>24169,14964=>24170,14965=>24171,14966=>24172,14967=>24173,14968=>24174,14969=>24175,14970=>24176,14971=>24177,14972=>24178,14973=>24179,14974=>24180,14975=>24181,14976=>24182,14977=>24183,14978=>24184,14979=>24185,14980=>24186,14981=>24187,14982=>24188,14983=>24189,14984=>24190,14985=>24191,14986=>24192,14987=>24193,14988=>24194,14989=>24195,14990=>24196,14991=>24197,14992=>24198,14993=>24199,14994=>24200,14995=>24201,14996=>24202,14997=>24203,14998=>24204,14999=>24205,15000=>24206,15001=>24207,15002=>24208,15003=>24209,15004=>24210,15005=>24211,15006=>24212,15007=>24213,15008=>24214,15009=>24215,15010=>24216,15011=>24217,15012=>24218,15013=>24219,15014=>24220,15015=>24221,15016=>24222,15017=>24223,15018=>24224,15019=>24225,15020=>24226,15021=>24227,15022=>24228,15023=>24229,15024=>24230,15025=>24231,15026=>24232,15027=>24233,15028=>24234,15029=>24235,15030=>24236,15031=>24237,15032=>24238,15033=>24239,15034=>24240,15035=>24241,15036=>24242,15037=>24243,15038=>24244,15039=>24245,15040=>24246,15041=>24247,15042=>24248,15043=>24249,15044=>24250,15045=>24251,15046=>24252,15047=>24253,15048=>24254,15049=>24255,15050=>24256,15051=>24257,15052=>24258,15053=>24259,15054=>24260,15055=>24261,15056=>24262,15057=>24263,15058=>24264,15059=>24265,15060=>24266,15061=>24267,15062=>24268,15063=>24269,15064=>24270,15065=>24271,15066=>24272,15067=>24273,15068=>24274,15069=>24275,15070=>24276,15071=>24277,15072=>24278,15073=>24279,15074=>24280,15075=>24281,15076=>24282,15077=>24283,15078=>24284,15079=>24285,15080=>24286,15081=>24287,15082=>24288,15083=>24289,15084=>24290,15085=>24291,15086=>24292,15087=>24293,15088=>24294,15089=>24295,15090=>24296,15091=>24297,15092=>24298,15093=>24299,15094=>24300,15095=>24301,15096=>24302,15097=>24303,15098=>24304,15099=>24305,15100=>24306,15101=>24307,15102=>24308,15103=>24309,15104=>24310,15105=>24311,15106=>24312,15107=>24313,15108=>24314,15109=>24315,15110=>24316,15111=>24317,15112=>24318,15113=>24319,15114=>24320,15115=>24321,15116=>24322,15117=>24323,15118=>24324,15119=>24325,15120=>24326,15121=>24327,15122=>24328,15123=>24329,15124=>24330,15125=>24331,15126=>24332,15127=>24333,15128=>24334,15129=>24335,15130=>24336,15131=>24337,15132=>24338,15133=>24339,15134=>24340,15135=>24341,15136=>24342,15137=>24343,15138=>24344,15139=>24345,15140=>24346,15141=>24347,15142=>24348,15143=>24349,15144=>24350,15145=>24351,15146=>24352,15147=>24353,15148=>24354,15149=>24355,15150=>24356,15151=>24357,15152=>24358,15153=>24359,15154=>24360,15155=>24361,15156=>24362,15157=>24363,15158=>24364,15159=>24365,15160=>24366,15161=>24367,15162=>24368,15163=>24369,15164=>24370,15165=>24371,15166=>24372,15167=>24373,15168=>24374,15169=>24375,15170=>24376,15171=>24377,15172=>24378,15173=>24379,15174=>24380,15175=>24381,15176=>24382,15177=>24383,15178=>24384,15179=>24385,15180=>24386,15181=>24387,15183=>24388,15184=>24389,15185=>24390,15186=>24391,15187=>24392,15188=>24393,15189=>24394,15190=>24395,15191=>24396,15192=>24397,15193=>24398,15194=>24399,15195=>24400,15196=>24401,15197=>24402,15198=>24403,15199=>24404,15200=>24405,15201=>24406,15202=>24407,15203=>24408,15204=>24409,15205=>24410,15206=>24411,15207=>24412,15208=>24413,15209=>24414,15210=>24415,15211=>24416,15212=>24417,15213=>24418,15214=>24419,15215=>24420,15216=>24421,15217=>24422,15218=>24423,15219=>24424,15220=>24425,15221=>24426,15222=>24427,15223=>24428,15224=>24429,15225=>24430,15226=>24431,15227=>24432,15228=>24433,15229=>24434,15230=>24435,15231=>24436,15232=>24437,15233=>24438,15234=>24439,15235=>24440,15236=>24441,15237=>24442,15238=>24443,15239=>24444,15240=>24445,15241=>24446,15242=>24447,15243=>24448,15244=>24449,15245=>24450,15246=>24451,15247=>24452,15248=>24453,15249=>24454,15250=>24455,15251=>24456,15252=>24457,15253=>24458,15254=>24459,15255=>24460,15256=>24461,15257=>24462,15258=>24463,15259=>24464,15260=>24465,15261=>24466,15262=>24467,15263=>24468,15264=>24469,15265=>24470,15266=>24471,15267=>24472,15268=>24473,15269=>24474,15270=>24475,15271=>24476,15272=>24477,15273=>24478,15274=>24479,15275=>24480,15276=>24481,15277=>24482,15278=>24483,15279=>24484,15280=>24485,15281=>24486,15282=>24487,15283=>24488,15284=>24489,15285=>24490,15286=>24491,15287=>24492,15288=>24493,15289=>24494,15290=>24495,15291=>24496,15292=>24497,15293=>24498,15294=>24499,15295=>24500,15296=>24501,15297=>24502,15298=>24503,15299=>24504,15300=>24505,15301=>24506,15302=>24507,15303=>24508,15304=>24509,15305=>24510,15306=>24511,15307=>24512,15308=>24513,15309=>24514,15310=>24515,15311=>24516,15312=>24517,15313=>24518,15314=>24519,15315=>24520,15316=>24521,15317=>24522,15318=>24523,15319=>24524,15320=>24525,15321=>24526,15322=>24527,15323=>24528,15324=>24529,15325=>24530,15326=>24531,15327=>24532,15328=>24533,15329=>24534,15330=>24535,15331=>24536,15332=>24537,15333=>24538,15334=>24539,15335=>24540,15336=>24541,15337=>24542,15338=>24543,15339=>24544,15340=>24545,15341=>24546,15342=>24547,15343=>24548,15344=>24549,15345=>24550,15346=>24551,15347=>24552,15348=>24553,15349=>24554,15350=>24555,15351=>24556,15352=>24557,15353=>24558,15354=>24559,15355=>24560,15356=>24561,15357=>24562,15358=>24563,15359=>24564,15360=>24565,15361=>24566,15362=>24567,15363=>24568,15364=>24569,15365=>24570,15366=>24571,15367=>24572,15368=>24573,15369=>24574,15370=>24575,15371=>24576,15372=>24577,15373=>24578,15374=>24579,15375=>24580,15376=>24581,15377=>24582,15378=>24583,15379=>24584,15380=>24585,15381=>24586,15382=>24587,15383=>24588,15384=>24589,15385=>24590,15386=>24591,15387=>24592,15388=>24593,15389=>24594,15390=>24595,15391=>24596,15392=>24597,15393=>24598,15394=>24599,15395=>24600,15396=>24601,15397=>24602,15398=>24603,15399=>24604,15400=>24605,15401=>24606,15402=>24607,15403=>24608,15404=>24609,15405=>24610,15406=>24611,15407=>24612,15408=>24613,15409=>24614,15410=>24615,15411=>24616,15412=>24617,15413=>24618,15414=>24619,15415=>24620,15416=>24621,15417=>24622,15418=>24623,15419=>24624,15420=>24625,15421=>24626,15422=>24627,15423=>24628,15424=>24629,15425=>24630,15426=>24631,15427=>24632,15428=>24633,15429=>24634,15430=>24635,15431=>24636,15432=>24637,15433=>24638,15434=>24639,15435=>24640,15436=>24641,15437=>24642,15438=>24643,15439=>24644,15440=>24645,15441=>24646,15442=>24647,15443=>24648,15444=>24649,15445=>24650,15446=>24651,15447=>24652,15448=>24653,15449=>24654,15450=>24655,15451=>24656,15452=>24657,15453=>24658,15454=>24659,15455=>24660,15456=>24661,15457=>24662,15458=>24663,15459=>24664,15460=>24665,15461=>24666,15462=>24667,15463=>24668,15464=>24669,15465=>24670,15466=>24671,15467=>24672,15468=>24673,15469=>24674,15471=>24675,15472=>24676,15473=>24677,15474=>24678,15475=>24679,15476=>24680,15477=>24681,15478=>24682,15479=>24683,15480=>24684,15481=>24685,15482=>24686,15483=>24687,15484=>24688,15485=>24689,15486=>24690,15487=>24691,15488=>24692,15489=>24693,15490=>24694,15491=>24695,15492=>24696,15493=>24697,15494=>24698,15495=>24699,15496=>24700,15497=>24701,15498=>24702,15499=>24703,15500=>24704,15501=>24705,15502=>24706,15503=>24707,15504=>24708,15505=>24709,15506=>24710,15507=>24711,15508=>24712,15509=>24713,15510=>24714,15511=>24715,15512=>24716,15513=>24717,15514=>24718,15515=>24719,15516=>24720,15517=>24721,15518=>24722,15519=>24723,15520=>24724,15521=>24725,15522=>24726,15523=>24727,15524=>24728,15525=>24729,15526=>24730,15527=>24731,15528=>24732,15529=>24733,15530=>24734,15531=>24735,15532=>24736,15533=>24737,15534=>24738,15535=>24739,15536=>24740,15537=>24741,15538=>24742,15539=>24743,15540=>24744,15541=>24745,15542=>24746,15543=>24747,15544=>24748,15545=>24749,15546=>24750,15547=>24751,15548=>24752,15549=>24753,15550=>24754,15551=>24755,15552=>24756,15553=>24757,15554=>24758,15555=>24759,15556=>24760,15557=>24761,15558=>24762,15559=>24763,15560=>24764,15561=>24765,15562=>24766,15563=>24767,15564=>24768,15565=>24769,15566=>24770,15567=>24771,15568=>24772,15569=>24773,15570=>24774,15571=>24775,15572=>24776,15573=>24777,15574=>24778,15575=>24779,15576=>24780,15577=>24781,15578=>24782,15579=>24783,15580=>24784,15581=>24785,15582=>24786,15583=>24787,15585=>24788,15586=>24789,15587=>24790,15588=>24791,15589=>24792,15590=>24793,15591=>24794,15592=>24795,15593=>24796,15594=>24797,15595=>24798,15596=>24799,15597=>24800,15598=>24801,15599=>24802,15600=>24803,15601=>24804,15602=>24805,15603=>24806,15604=>24807,15605=>24808,15606=>24809,15607=>24810,15608=>24811,15609=>24812,15610=>24813,15611=>24814,15612=>24815,15613=>24816,15614=>24817,15615=>24818,15616=>24819,15617=>24820,15618=>24821,15619=>24822,15620=>24823,15621=>24824,15622=>24825,15623=>24826,15624=>24827,15625=>24828,15626=>24829,15627=>24830,15628=>24831,15629=>24832,15630=>24833,15631=>24834,15632=>24835,15633=>24836,15634=>24837,15635=>24838,15636=>24839,15637=>24840,15638=>24841,15639=>24842,15640=>24843,15641=>24844,15642=>24845,15643=>24846,15644=>24847,15645=>24848,15646=>24849,15647=>24850,15648=>24851,15649=>24852,15650=>24853,15651=>24854,15652=>24855,15653=>24856,15654=>24857,15655=>24858,15656=>24859,15657=>24860,15658=>24861,15659=>24862,15660=>24863,15661=>24864,15662=>24865,15663=>24866,15664=>24867,15665=>24868,15666=>24869,15667=>24870,15668=>24871,15669=>24872,15670=>24873,15671=>24874,15672=>24875,15673=>24876,15674=>24877,15675=>24878,15676=>24879,15677=>24880,15678=>24881,15679=>24882,15680=>24883,15681=>24884,15682=>24885,15683=>24886,15684=>24887,15685=>24888,15686=>24889,15687=>24890,15688=>24891,15689=>24892,15690=>24893,15691=>24894,15692=>24895,15693=>24896,15694=>24897,15695=>24898,15696=>24899,15697=>24900,15698=>24901,15699=>24902,15700=>24903,15701=>24904,15702=>24905,15703=>24906,15704=>24907,15705=>24908,15706=>24909,15707=>24910,15708=>24911,15709=>24912,15710=>24913,15711=>24914,15712=>24915,15713=>24916,15714=>24917,15715=>24918,15716=>24919,15717=>24920,15718=>24921,15719=>24922,15720=>24923,15721=>24924,15722=>24925,15723=>24926,15724=>24927,15725=>24928,15726=>24929,15727=>24930,15728=>24931,15729=>24932,15730=>24933,15731=>24934,15732=>24935,15733=>24936,15734=>24937,15735=>24938,15736=>24939,15737=>24940,15738=>24941,15739=>24942,15740=>24943,15741=>24944,15742=>24945,15743=>24946,15744=>24947,15745=>24948,15746=>24949,15747=>24950,15748=>24951,15749=>24952,15750=>24953,15751=>24954,15752=>24955,15753=>24956,15754=>24957,15755=>24958,15756=>24959,15757=>24960,15758=>24961,15759=>24962,15760=>24963,15761=>24964,15762=>24965,15763=>24966,15764=>24967,15765=>24968,15766=>24969,15767=>24970,15768=>24971,15769=>24972,15770=>24973,15771=>24974,15772=>24975,15773=>24976,15774=>24977,15775=>24978,15776=>24979,15777=>24980,15778=>24981,15779=>24982,15780=>24983,15781=>24984,15782=>24985,15783=>24986,15784=>24987,15785=>24988,15786=>24989,15787=>24990,15788=>24991,15789=>24992,15790=>24993,15791=>24994,15792=>24995,15793=>24996,15794=>24997,15795=>24998,15796=>24999,15797=>25000,15798=>25001,15799=>25002,15800=>25003,15801=>25004,15802=>25005,15803=>25006,15804=>25007,15805=>25008,15806=>25009,15807=>25010,15808=>25011,15809=>25012,15810=>25013,15811=>25014,15812=>25015,15813=>25016,15814=>25017,15815=>25018,15816=>25019,15817=>25020,15818=>25021,15819=>25022,15820=>25023,15821=>25024,15822=>25025,15823=>25026,15824=>25027,15825=>25028,15826=>25029,15827=>25030,15828=>25031,15829=>25032,15830=>25033,15831=>25034,15832=>25035,15833=>25036,15834=>25037,15835=>25038,15836=>25039,15837=>25040,15838=>25041,15839=>25042,15840=>25043,15841=>25044,15842=>25045,15843=>25046,15844=>25047,15845=>25048,15846=>25049,15847=>25050,15848=>25051,15849=>25052,15850=>25053,15851=>25054,15852=>25055,15853=>25056,15854=>25057,15855=>25058,15856=>25059,15857=>25060,15858=>25061,15859=>25062,15860=>25063,15861=>25064,15862=>25065,15863=>25066,15864=>25067,15865=>25068,15866=>25069,15867=>25070,15868=>25071,15869=>25072,15870=>25073,15871=>25074,15872=>25075,15873=>25076,15874=>25077,15875=>25078,15876=>25079,15877=>25080,15878=>25081,15879=>25082,15880=>25083,15881=>25084,15882=>25085,15883=>25086,15884=>25087,15885=>25088,15886=>25089,15887=>25090,15888=>25091,15889=>25092,15890=>25093,15891=>25094,15892=>25095,15893=>25096,15894=>25097,15895=>25098,15896=>25099,15897=>25100,15898=>25101,15899=>25102,15900=>25103,15901=>25104,15902=>25105,15903=>25106,15904=>25107,15905=>25108,15906=>25109,15907=>25110,15908=>25111,15909=>25112,15910=>25113,15911=>25114,15912=>25115,15913=>25116,15914=>25117,15915=>25118,15916=>25119,15917=>25120,15918=>25121,15919=>25122,15920=>25123,15921=>25124,15922=>25125,15923=>25126,15924=>25127,15925=>25128,15926=>25129,15927=>25130,15928=>25131,15929=>25132,15930=>25133,15931=>25134,15932=>25135,15933=>25136,15934=>25137,15935=>25138,15936=>25139,15937=>25140,15938=>25141,15939=>25142,15940=>25143,15941=>25144,15942=>25145,15943=>25146,15944=>25147,15945=>25148,15946=>25149,15947=>25150,15948=>25151,15949=>25152,15950=>25153,15951=>25154,15952=>25155,15953=>25156,15954=>25157,15955=>25158,15956=>25159,15957=>25160,15958=>25161,15959=>25162,15960=>25163,15961=>25164,15962=>25165,15963=>25166,15964=>25167,15965=>25168,15966=>25169,15967=>25170,15968=>25171,15969=>25172,15970=>25173,15971=>25174,15972=>25175,15973=>25176,15974=>25177,15975=>25178,15976=>25179,15977=>25180,15978=>25181,15979=>25182,15980=>25183,15981=>25184,15982=>25185,15983=>25186,15984=>25187,15985=>25188,15986=>25189,15987=>25190,15988=>25191,15989=>25192,15990=>25193,15991=>25194,15992=>25195,15993=>25196,15994=>25197,15995=>25198,15996=>25199,15997=>25200,15998=>25201,15999=>25202,16000=>25203,16001=>25204,16002=>25205,16003=>25206,16004=>25207,16005=>25208,16006=>25209,16007=>25210,16008=>25211,16009=>25212,16010=>25213,16011=>25214,16012=>25215,16013=>25216,16014=>25217,16015=>25218,16016=>25219,16017=>25220,16018=>25221,16019=>25222,16020=>25223,16021=>25224,16022=>25225,16023=>25226,16024=>25227,16025=>25228,16026=>25229,16027=>25230,16028=>25231,16029=>25232,16030=>25233,16031=>25234,16032=>25235,16033=>25236,16034=>25237,16035=>25238,16036=>25239,16037=>25240,16038=>25241,16039=>25242,16040=>25243,16041=>25244,16042=>25245,16043=>25246,16044=>25247,16045=>25248,16046=>25249,16047=>25250,16048=>25251,16049=>25252,16050=>25253,16051=>25254,16052=>25255,16053=>25256,16054=>25257,16055=>25258,16056=>25259,16057=>25260,16058=>25261,16059=>25262,16060=>25263,16061=>25264,16062=>25265,16063=>25266,16064=>25267,16065=>25268,16066=>25269,16067=>25270,16068=>25271,16069=>25272,16070=>25273,16071=>25274,16072=>25275,16073=>25276,16074=>25277,16075=>25278,16076=>25279,16077=>25280,16078=>25281,16079=>25282,16080=>25283,16081=>25284,16082=>25285,16083=>25286,16084=>25287,16085=>25288,16086=>25289,16087=>25290,16088=>25291,16089=>25292,16090=>25293,16091=>25294,16092=>25295,16093=>25296,16094=>25297,16095=>25298,16096=>25299,16097=>25300,16098=>25301,16099=>25302,16100=>25303,16101=>25304,16102=>25305,16103=>25306,16104=>25307,16105=>25308,16106=>25309,16107=>25310,16108=>25311,16109=>25312,16110=>25313,16111=>25314,16112=>25315,16113=>25316,16114=>25317,16115=>25318,16116=>25319,16117=>25320,16118=>25321,16119=>25322,16120=>25323,16121=>25324,16122=>25325,16123=>25326,16124=>25327,16125=>25328,16126=>25329,16127=>25330,16128=>25331,16129=>25332,16130=>25333,16131=>25334,16132=>25335,16133=>25336,16134=>25337,16135=>25338,16136=>25339,16137=>25340,16138=>25341,16139=>25342,16140=>25343,16141=>25344,16142=>25345,16143=>25346,16144=>25347,16145=>25348,16146=>25349,16147=>25350,16148=>25351,16149=>25352,16150=>25353,16151=>25354,16152=>25355,16153=>25356,16154=>25357,16155=>25358,16156=>25359,16157=>25360,16158=>25361,16159=>25362,16160=>25363,16161=>25364,16162=>25365,16163=>25366,16164=>25367,16165=>25368,16166=>25369,16167=>25370,16168=>25371,16169=>25372,16170=>25373,16171=>25374,16172=>25375,16173=>25376,16174=>25377,16175=>25378,16176=>25379,16177=>25380,16178=>25381,16179=>25382,16180=>25383,16181=>25384,16182=>25385,16183=>25386,16184=>25387,16185=>25388,16186=>25389,16187=>25390,16188=>25391,16189=>25392,16190=>25393,16191=>25394,16192=>25395,16193=>25396,16194=>25397,16195=>25398,16196=>25399,16197=>25400,16198=>25401,16199=>25402,16200=>25403,16201=>25404,16202=>25405,16203=>25406,16204=>25407,16205=>25408,16206=>25409,16207=>25410,16208=>25411,16209=>25412,16210=>25413,16211=>25414,16212=>25415,16213=>25416,16214=>25417,16215=>25418,16216=>25419,16217=>25420,16218=>25421,16219=>25422,16220=>25423,16221=>25424,16222=>25425,16223=>25426,16224=>25427,16225=>25428,16226=>25429,16227=>25430,16228=>25431,16229=>25432,16230=>25433,16231=>25434,16232=>25435,16233=>25436,16234=>25437,16235=>25438,16236=>25439,16237=>25440,16238=>25441,16239=>25442,16240=>25443,16241=>25444,16242=>25445,16243=>25446,16244=>25447,16245=>25448,16246=>25449,16247=>25450,16248=>25451,16249=>25452,16250=>25453,16251=>25454,16252=>25455,16253=>25456,16254=>25457,16255=>25458,16256=>25459,16257=>25460,16258=>25461,16259=>25462,16260=>25463,16261=>25464,16262=>25465,16263=>25466,16264=>25467,16265=>25468,16266=>25469,16267=>25470,16268=>25471,16269=>25472,16270=>25473,16271=>25474,16272=>25475,16273=>25476,16274=>25477,16275=>25478,16276=>25479,16277=>25480,16278=>25481,16279=>25482,16280=>25483,16281=>25484,16282=>25485,16283=>25486,16284=>25487,16285=>25488,16286=>25489,16287=>25490,16288=>25491,16289=>25492,16290=>25493,16291=>25494,16292=>25495,16293=>25496,16294=>25497,16295=>25498,16296=>25499,16297=>25500,16298=>25501,16299=>25502,16300=>25503,16301=>25504,16302=>25505,16303=>25506,16304=>25507,16305=>25508,16306=>25509,16307=>25510,16308=>25511,16309=>25512,16310=>25513,16311=>25514,16312=>25515,16313=>25516,16314=>25517,16315=>25518,16316=>25519,16317=>25520,16318=>25521,16319=>25522,16320=>25523,16321=>25524,16322=>25525,16323=>25526,16324=>25527,16325=>25528,16326=>25529,16327=>25530,16328=>25531,16329=>25532,16330=>25533,16331=>25534,16332=>25535,16333=>25536,16334=>25537,16335=>25538,16336=>25539,16337=>25540,16338=>25541,16339=>25542,16340=>25543,16341=>25544,16342=>25545,16343=>25546,16344=>25547,16345=>25548,16346=>25549,16347=>25550,16348=>25551,16349=>25552,16350=>25553,16351=>25554,16352=>25555,16353=>25556,16354=>25557,16355=>25558,16356=>25559,16357=>25560,16358=>25561,16359=>25562,16360=>25563,16361=>25564,16362=>25565,16363=>25566,16364=>25567,16365=>25568,16366=>25569,16367=>25570,16368=>25571,16369=>25572,16370=>25573,16371=>25574,16372=>25575,16373=>25576,16374=>25577,16375=>25578,16376=>25579,16377=>25580,16378=>25581,16379=>25582,16380=>25583,16381=>25584,16382=>25585,16383=>25586,16384=>25587,16385=>25588,16386=>25589,16387=>25590,16388=>25591,16389=>25592,16390=>25593,16391=>25594,16392=>25595,16393=>25596,16394=>25597,16395=>25598,16396=>25599,16397=>25600,16398=>25601,16399=>25602,16400=>25603,16401=>25604,16402=>25605,16403=>25606,16404=>25607,16405=>25608,16406=>25609,16407=>25610,16408=>25611,16409=>25612,16410=>25613,16411=>25614,16412=>25615,16413=>25616,16414=>25617,16415=>25618,16416=>25619,16417=>25620,16418=>25621,16419=>25622,16420=>25623,16421=>25624,16422=>25625,16423=>25626,16424=>25627,16425=>25628,16426=>25629,16427=>25630,16428=>25631,16429=>25632,16430=>25633,16431=>25634,16432=>25635,16433=>25636,16434=>25637,16435=>25638,16436=>25639,16437=>25640,16438=>25641,16439=>25642,16440=>25643,16441=>25644,16442=>25645,16443=>25646,16444=>25647,16445=>25648,16446=>25649,16447=>25650,16448=>25651,16449=>25652,16450=>25653,16451=>25654,16452=>25655,16453=>25656,16454=>25657,16455=>25658,16456=>25659,16457=>25660,16458=>25661,16459=>25662,16460=>25663,16461=>25664,16462=>25665,16463=>25666,16464=>25667,16465=>25668,16466=>25669,16467=>25670,16468=>25671,16469=>25672,16471=>25673,16472=>25674,16473=>25675,16474=>25676,16475=>25677,16476=>25678,16477=>25679,16478=>25680,16479=>25681,16480=>25682,16481=>25683,16482=>25684,16483=>25685,16484=>25686,16485=>25687,16486=>25688,16487=>25689,16488=>25690,16489=>25691,16490=>25692,16491=>25693,16492=>25694,16493=>25695,16494=>25696,16495=>25697,16496=>25698,16497=>25699,16498=>25700,16499=>25701,16500=>25702,16501=>25703,16502=>25704,16503=>25705,16504=>25706,16505=>25707,16506=>25708,16507=>25709,16508=>25710,16509=>25711,16510=>25712,16511=>25713,16512=>25714,16513=>25715,16514=>25716,16515=>25717,16516=>25718,16517=>25719,16518=>25720,16519=>25721,16520=>25722,16521=>25723,16522=>25724,16523=>25725,16524=>25726,16525=>25727,16526=>25728,16527=>25729,16528=>25730,16529=>25731,16530=>25732,16531=>25733,16532=>25734,16533=>25735,16534=>25736,16535=>25737,16536=>25738,16537=>25739,16538=>25740,16539=>25741,16540=>25742,16541=>25743,16542=>25744,16543=>25745,16544=>25746,16545=>25747,16546=>25748,16547=>25749,16548=>25750,16549=>25751,16550=>25752,16551=>25753,16552=>25754,16553=>25755,16554=>25756,16555=>25757,16556=>25758,16557=>25759,16558=>25760,16559=>25761,16560=>25762,16561=>25763,16562=>25764,16563=>25765,16564=>25766,16565=>25767,16566=>25768,16567=>25769,16568=>25770,16569=>25771,16570=>25772,16571=>25773,16572=>25774,16573=>25775,16574=>25776,16575=>25777,16576=>25778,16577=>25779,16578=>25780,16579=>25781,16580=>25782,16581=>25783,16582=>25784,16583=>25785,16584=>25786,16585=>25787,16586=>25788,16587=>25789,16588=>25790,16589=>25791,16590=>25792,16591=>25793,16592=>25794,16593=>25795,16594=>25796,16595=>25797,16596=>25798,16597=>25799,16598=>25800,16599=>25801,16600=>25802,16601=>25803,16602=>25804,16603=>25805,16604=>25806,16605=>25807,16606=>25808,16607=>25809,16608=>25810,16609=>25811,16610=>25812,16611=>25813,16612=>25814,16613=>25815,16614=>25816,16615=>25817,16616=>25818,16617=>25819,16618=>25820,16619=>25821,16620=>25822,16621=>25823,16622=>25824,16623=>25825,16624=>25826,16625=>25827,16626=>25828,16627=>25829,16628=>25830,16629=>25831,16630=>25832,16631=>25833,16632=>25834,16633=>25835,16634=>25836,16635=>25837,16636=>25838,16637=>25839,16638=>25840,16639=>25841,16640=>25842,16641=>25843,16642=>25844,16643=>25845,16644=>25846,16645=>25847,16646=>25848,16647=>25849,16648=>25850,16649=>25851,16650=>25852,16651=>25853,16652=>25854,16653=>25855,16654=>25856,16655=>25857,16656=>25858,16657=>25859,16658=>25860,16659=>25861,16660=>25862,16661=>25863,16662=>25864,16663=>25865,16664=>25866,16665=>25867,16666=>25868,16667=>25869,16668=>25870,16669=>25871,16670=>25872,16671=>25873,16672=>25874,16673=>25875,16674=>25876,16675=>25877,16676=>25878,16677=>25879,16678=>25880,16679=>25881,16680=>25882,16681=>25883,16682=>25884,16683=>25885,16684=>25886,16685=>25887,16686=>25888,16687=>25889,16688=>25890,16689=>25891,16690=>25892,16691=>25893,16692=>25894,16693=>25895,16694=>25896,16695=>25897,16696=>25898,16697=>25899,16698=>25900,16699=>25901,16700=>25902,16701=>25903,16702=>25904,16703=>25905,16704=>25906,16705=>25907,16706=>25908,16707=>25909,16708=>25910,16709=>25911,16710=>25912,16711=>25913,16712=>25914,16713=>25915,16714=>25916,16715=>25917,16716=>25918,16717=>25919,16718=>25920,16719=>25921,16720=>25922,16721=>25923,16722=>25924,16723=>25925,16724=>25926,16725=>25927,16726=>25928,16727=>25929,16728=>25930,16729=>25931,16730=>25932,16731=>25933,16732=>25934,16733=>25935,16734=>25936,16736=>25937,16737=>25938,16738=>25939,16739=>25940,16740=>25941,16741=>25942,16742=>25943,16743=>25944,16744=>25945,16745=>25946,16746=>25947,16747=>25948,16748=>25949,16749=>25950,16750=>25951,16751=>25952,16752=>25953,16753=>25954,16754=>25955,16755=>25956,16756=>25957,16757=>25958,16758=>25959,16759=>25960,16760=>25961,16761=>25962,16762=>25963,16763=>25964,16764=>25965,16765=>25966,16766=>25967,16767=>25968,16768=>25969,16769=>25970,16770=>25971,16771=>25972,16772=>25973,16773=>25974,16774=>25975,16775=>25976,16776=>25977,16777=>25978,16778=>25979,16779=>25980,16780=>25981,16781=>25982,16782=>25983,16783=>25984,16784=>25985,16785=>25986,16786=>25987,16787=>25988,16788=>25989,16789=>25990,16790=>25991,16791=>25992,16792=>25993,16793=>25994,16794=>25995,16795=>25996,16796=>25997,16797=>25998,16798=>25999,16799=>26000,16800=>26001,16801=>26002,16802=>26003,16803=>26004,16804=>26005,16805=>26006,16806=>26007,16807=>26008,16808=>26009,16809=>26010,16810=>26011,16811=>26012,16812=>26013,16813=>26014,16814=>26015,16815=>26016,16816=>26017,16817=>26018,16818=>26019,16819=>26020,16820=>26021,16821=>26022,16822=>26023,16823=>26024,16824=>26025,16825=>26026,16826=>26027,16827=>26028,16828=>26029,16829=>26030,16830=>26031,16831=>26032,16832=>26033,16833=>26034,16834=>26035,16835=>26036,16836=>26037,16837=>26038,16838=>26039,16839=>26040,16840=>26041,16841=>26042,16842=>26043,16843=>26044,16844=>26045,16845=>26046,16846=>26047,16847=>26048,16848=>26049,16849=>26050,16850=>26051,16851=>26052,16852=>26053,16853=>26054,16854=>26055,16855=>26056,16856=>26057,16857=>26058,16858=>26059,16859=>26060,16860=>26061,16861=>26062,16862=>26063,16863=>26064,16864=>26065,16865=>26066,16866=>26067,16867=>26068,16868=>26069,16869=>26070,16870=>26071,16871=>26072,16872=>26073,16873=>26074,16874=>26075,16875=>26076,16876=>26077,16877=>26078,16878=>26079,16879=>26080,16880=>26081,16881=>26082,16882=>26083,16883=>26084,16884=>26085,16885=>26086,16886=>26087,16887=>26088,16888=>26089,16889=>26090,16890=>26091,16891=>26092,16892=>26093,16893=>26094,16894=>26095,16895=>26096,16896=>26097,16897=>26098,16898=>26099,16899=>26100,16900=>26101,16901=>26102,16902=>26103,16903=>26104,16904=>26105,16905=>26106,16906=>26107,16907=>26108,16908=>26109,16909=>26110,16910=>26111,16911=>26112,16912=>26113,16913=>26114,16914=>26115,16915=>26116,16916=>26117,16917=>26118,16918=>26119,16919=>26120,16920=>26121,16921=>26122,16922=>26123,16923=>26124,16924=>26125,16925=>26126,16926=>26127,16927=>26128,16928=>26129,16929=>26130,16930=>26131,16931=>26132,16932=>26133,16933=>26134,16934=>26135,16935=>26136,16936=>26137,16937=>26138,16938=>26139,16939=>26140,16940=>26141,16941=>26142,16942=>26143,16943=>26144,16944=>26145,16945=>26146,16946=>26147,16947=>26148,16948=>26149,16949=>26150,16950=>26151,16951=>26152,16952=>26153,16953=>26154,16954=>26155,16955=>26156,16956=>26157,16957=>26158,16958=>26159,16959=>26160,16960=>26161,16961=>26162,16962=>26163,16963=>26164,16964=>26165,16965=>26166,16966=>26167,16967=>26168,16968=>26169,16969=>26170,16970=>26171,16971=>26172,16972=>26173,16973=>26174,16974=>26175,16975=>26176,16976=>26177,16977=>26178,16978=>26179,16979=>26180,16980=>26181,16981=>26182,16982=>26183,16983=>26184,16984=>26185,16985=>26186,16986=>26187,16987=>26188,16988=>26189,16989=>26190,16990=>26191,16991=>26192,16992=>26193,16993=>26194,16994=>26195,16995=>26196,16996=>26197,16997=>26198,16998=>26199,16999=>26200,17000=>26201,17001=>26202,17002=>26203,17003=>26204,17004=>26205,17005=>26206,17006=>26207,17007=>26208,17008=>26209,17009=>26210,17010=>26211,17011=>26212,17012=>26213,17013=>26214,17014=>26215,17015=>26216,17016=>26217,17017=>26218,17018=>26219,17019=>26220,17020=>26221,17021=>26222,17022=>26223,17023=>26224,17024=>26225,17025=>26226,17026=>26227,17027=>26228,17028=>26229,17029=>26230,17030=>26231,17031=>26232,17032=>26233,17033=>26234,17034=>26235,17035=>26236,17036=>26237,17037=>26238,17038=>26239,17039=>26240,17040=>26241,17041=>26242,17042=>26243,17043=>26244,17044=>26245,17045=>26246,17046=>26247,17047=>26248,17048=>26249,17049=>26250,17050=>26251,17051=>26252,17052=>26253,17053=>26254,17054=>26255,17055=>26256,17056=>26257,17057=>26258,17058=>26259,17059=>26260,17060=>26261,17061=>26262,17062=>26263,17063=>26264,17064=>26265,17065=>26266,17066=>26267,17067=>26268,17068=>26269,17069=>26270,17070=>26271,17071=>26272,17072=>26273,17073=>26274,17074=>26275,17075=>26276,17076=>26277,17077=>26278,17078=>26279,17079=>26280,17080=>26281,17081=>26282,17082=>26283,17083=>26284,17084=>26285,17085=>26286,17086=>26287,17087=>26288,17088=>26289,17089=>26290,17090=>26291,17091=>26292,17092=>26293,17093=>26294,17094=>26295,17095=>26296,17096=>26297,17097=>26298,17098=>26299,17099=>26300,17100=>26301,17101=>26302,17102=>26303,17103=>26304,17104=>26305,17105=>26306,17106=>26307,17107=>26308,17108=>26309,17109=>26310,17110=>26311,17111=>26312,17112=>26313,17113=>26314,17114=>26315,17115=>26316,17116=>26317,17117=>26318,17118=>26319,17119=>26320,17120=>26321,17121=>26322,17122=>26323,17123=>26324,17124=>26325,17125=>26326,17126=>26327,17127=>26328,17128=>26329,17129=>26330,17130=>26331,17131=>26332,17132=>26333,17133=>26334,17134=>26335,17135=>26336,17136=>26337,17137=>26338,17138=>26339,17139=>26340,17140=>26341,17141=>26342,17142=>26343,17143=>26344,17144=>26345,17145=>26346,17146=>26347,17147=>26348,17148=>26349,17149=>26350,17150=>26351,17151=>26352,17152=>26353,17153=>26354,17154=>26355,17155=>26356,17156=>26357,17157=>26358,17158=>26359,17159=>26360,17160=>26361,17161=>26362,17162=>26363,17163=>26364,17164=>26365,17165=>26366,17166=>26367,17167=>26368,17168=>26369,17169=>26370,17170=>26371,17171=>26372,17172=>26373,17173=>26374,17174=>26375,17175=>26376,17176=>26377,17177=>26378,17178=>26379,17179=>26380,17180=>26381,17181=>26382,17182=>26383,17183=>26384,17184=>26385,17185=>26386,17186=>26387,17187=>26388,17188=>26389,17189=>26390,17190=>26391,17191=>26392,17192=>26393,17193=>26394,17194=>26395,17195=>26396,17196=>26397,17197=>26398,17198=>26399,17199=>26400,17200=>26401,17201=>26402,17202=>26403,17203=>26404,17204=>26405,17205=>26406,17206=>26407,17208=>26408,17209=>26409,17210=>26410,17211=>26411,17212=>26412,17213=>26413,17214=>26414,17215=>26415,17216=>26416,17217=>26417,17218=>26418,17219=>26419,17220=>26420,17221=>26421,17222=>26422,17223=>26423,17224=>26424,17225=>26425,17226=>26426,17227=>26427,17228=>26428,17229=>26429,17230=>26430,17231=>26431,17232=>26432,17233=>26433,17234=>26434,17235=>26435,17236=>26436,17237=>26437,17238=>26438,17239=>26439,17240=>26440,17241=>26441,17242=>26442,17243=>26443,17244=>26444,17245=>26445,17246=>26446,17247=>26447,17248=>26448,17249=>26449,17250=>26450,17251=>26451,17252=>26452,17253=>26453,17254=>26454,17255=>26455,17256=>26456,17257=>26457,17258=>26458,17259=>26459,17260=>26460,17261=>26461,17262=>26462,17263=>26463,17264=>26464,17265=>26465,17266=>26466,17267=>26467,17268=>26468,17269=>26469,17270=>26470,17271=>26471,17272=>26472,17273=>26473,17274=>26474,17275=>26475,17276=>26476,17277=>26477,17278=>26478,17279=>26479,17280=>26480,17281=>26481,17282=>26482,17283=>26483,17284=>26484,17285=>26485,17286=>26486,17287=>26487,17288=>26488,17289=>26489,17290=>26490,17291=>26491,17292=>26492,17293=>26493,17294=>26494,17295=>26495,17296=>26496,17297=>26497,17298=>26498,17299=>26499,17300=>26500,17301=>26501,17302=>26502,17303=>26503,17304=>26504,17305=>26505,17306=>26506,17307=>26507,17308=>26508,17309=>26509,17310=>26510,17311=>26511,17312=>26512,17313=>26513,17314=>26514,17315=>26515,17316=>26516,17317=>26517,17318=>26518,17319=>26519,17320=>26520,17321=>26521,17322=>26522,17323=>26523,17325=>26524,17326=>26525,17327=>26526,17328=>26527,17330=>26528,17331=>26529,17332=>26530,17333=>26531,17334=>26532,17335=>26533,17336=>26534,17337=>26535,17338=>26536,17339=>26537,17340=>26538,17341=>26539,17342=>26540,17343=>26541,17344=>26542,17345=>26543,17346=>26544,17347=>26545,17348=>26546,17349=>26547,17350=>26548,17351=>26549,17352=>26550,17353=>26551,17354=>26552,17355=>26553,17356=>26554,17357=>26555,17358=>26556,17359=>26557,17360=>26558,17361=>26559,17362=>26560,17363=>26561,17364=>26562,17365=>26563,17366=>26564,17367=>26565,17368=>26566,17369=>26567,17370=>26568,17371=>26569,17372=>26570,17374=>26571,17375=>26572,17376=>26573,17377=>26574,17378=>26575,17379=>26576,17380=>26577,17381=>26578,17382=>26579,17383=>26580,17384=>26581,17385=>26582,17386=>26583,17387=>26584,17388=>26585,17389=>26586,17390=>26587,17391=>26588,17392=>26589,17393=>26590,17394=>26591,17395=>26592,17396=>26593,17397=>26594,17398=>26595,17399=>26596,17400=>26597,17401=>26598,17402=>26599,17403=>26600,17404=>26601,17405=>26602,17406=>26603,17407=>26604,17408=>26605,17409=>26606,17410=>26607,17411=>26608,17412=>26609,17413=>26610,17414=>26611,17415=>26612,17416=>26613,17417=>26614,17418=>26615,17419=>26616,17420=>26617,17421=>26618,17422=>26619,17423=>26620,17424=>26621,17425=>26622,17426=>26623,17427=>26624,17428=>26625,17429=>26626,17430=>26627,17431=>26628,17432=>26629,17433=>26630,17434=>26631,17435=>26632,17436=>26633,17437=>26634,17438=>26635,17439=>26636,17440=>26637,17441=>26638,17442=>26639,17443=>26640,17444=>26641,17445=>26642,17446=>26643,17447=>26644,17448=>26645,17449=>26646,17450=>26647,17451=>26648,17452=>26649,17453=>26650,17454=>26651,17455=>26652,17456=>26653,17457=>26654,17458=>26655,17459=>26656,17460=>26657,17461=>26658,17462=>26659,17463=>26660,17464=>26661,17465=>26662,17466=>26663,17467=>26664,17468=>26665,17469=>26666,17470=>26667,17471=>26668,17472=>26669,17473=>26670,17474=>26671,17475=>26672,17476=>26673,17477=>26674,17478=>26675,17479=>26676,17480=>26677,17481=>26678,17482=>26679,17483=>26680,17484=>26681,17485=>26682,17486=>26683,17487=>26684,17488=>26685,17489=>26686,17490=>26687,17491=>26688,17492=>26689,17493=>26690,17494=>26691,17495=>26692,17496=>26693,17497=>26694,17498=>26695,17499=>26696,17500=>26697,17501=>26698,17502=>26699,17503=>26700,17504=>26701,17505=>26702,17506=>26703,17507=>26704,17508=>26705,17509=>26706,17510=>26707,17511=>26708,17512=>26709,17513=>26710,17514=>26711,17515=>26712,17516=>26713,17517=>26714,17518=>26715,17519=>26716,17520=>26717,17521=>26718,17522=>26719,17523=>26720,17524=>26721,17525=>26722,17526=>26723,17527=>26724,17528=>26725,17529=>26726,17530=>26727,17531=>26728,17532=>26729,17533=>26730,17534=>26731,17535=>26732,17536=>26733,17537=>26734,17538=>26735,17539=>26736,17540=>26737,17541=>26738,17542=>26739,17543=>26740,17544=>26741,17545=>26742,17546=>26743,17547=>26744,17548=>26745,17549=>26746,17550=>26747,17551=>26748,17552=>26749,17553=>26750,17554=>26751,17555=>26752,17556=>26753,17557=>26754,17558=>26755,17559=>26756,17560=>26757,17561=>26758,17562=>26759,17563=>26760,17564=>26761,17565=>26762,17566=>26763,17567=>26764,17568=>26765,17569=>26766,17570=>26767,17571=>26768,17572=>26769,17573=>26770,17574=>26771,17575=>26772,17576=>26773,17577=>26774,17578=>26775,17579=>26776,17580=>26777,17581=>26778,17582=>26779,17583=>26780,17584=>26781,17585=>26782,17586=>26783,17587=>26784,17588=>26785,17589=>26786,17590=>26787,17591=>26788,17592=>26789,17593=>26790,17594=>26791,17595=>26792,17596=>26793,17597=>26794,17598=>26795,17599=>26796,17600=>26797,17601=>26798,17602=>26799,17603=>26800,17604=>26801,17605=>26802,17606=>26803,17607=>26804,17608=>26805,17609=>26806,17610=>26807,17611=>26808,17612=>26809,17613=>26810,17614=>26811,17615=>26812,17616=>26813,17617=>26814,17618=>26815,17619=>26816,17620=>26817,17621=>26818,17623=>26819,17624=>26820,17625=>26821,17626=>26822,17627=>26823,17628=>26824,17629=>26825,17630=>26826,17631=>26827,17632=>26828,17633=>26829,17634=>26830,17635=>26831,17636=>26832,17637=>26833,17638=>26834,17639=>26835,17640=>26836,17641=>26837,17642=>26838,17643=>26839,17644=>26840,17645=>26841,17646=>26842,17647=>26843,17648=>26844,17649=>26845,17650=>26846,17651=>26847,17652=>26848,17653=>26849,17654=>26850,17655=>26851,17656=>26852,17657=>26853,17658=>26854,17659=>26855,17660=>26856,17661=>26857,17662=>26858,17663=>26859,17664=>26860,17665=>26861,17666=>26862,17667=>26863,17668=>26864,17669=>26865,17670=>26866,17671=>26867,17672=>26868,17673=>26869,17674=>26870,17675=>26871,17676=>26872,17677=>26873,17678=>26874,17679=>26875,17680=>26876,17681=>26877,17682=>26878,17683=>26879,17684=>26880,17685=>26881,17686=>26882,17687=>26883,17688=>26884,17689=>26885,17690=>26886,17691=>26887,17692=>26888,17693=>26889,17694=>26890,17695=>26891,17696=>26892,17697=>26893,17698=>26894,17699=>26895,17700=>26896,17701=>26897,17702=>26898,17703=>26899,17704=>26900,17705=>26901,17706=>26902,17707=>26903,17708=>26904,17709=>26905,17710=>26906,17711=>26907,17712=>26908,17713=>26909,17714=>26910,17715=>26911,17716=>26912,17717=>26913,17718=>26914,17719=>26915,17720=>26916,17721=>26917,17722=>26918,17723=>26919,17724=>26920,17725=>26921,17726=>26922,17727=>26923,17728=>26924,17729=>26925,17730=>26926,17731=>26927,17732=>26928,17733=>26929,17734=>26930,17735=>26931,17736=>26932,17737=>26933,17738=>26934,17739=>26935,17740=>26936,17741=>26937,17742=>26938,17743=>26939,17744=>26940,17745=>26941,17746=>26942,17747=>26943,17748=>26944,17749=>26945,17750=>26946,17751=>26947,17752=>26948,17753=>26949,17754=>26950,17755=>26951,17756=>26952,17757=>26953,17758=>26954,17759=>26955,17760=>26956,17761=>26957,17762=>26958,17763=>26959,17764=>26960,17765=>26961,17766=>26962,17767=>26963,17768=>26964,17769=>26965,17770=>26966,17771=>26967,17772=>26968,17773=>26969,17774=>26970,17775=>26971,17776=>26972,17777=>26973,17778=>26974,17779=>26975,17780=>26976,17781=>26977,17782=>26978,17783=>26979,17784=>26980,17785=>26981,17786=>26982,17787=>26983,17788=>26984,17789=>26985,17790=>26986,17791=>26987,17792=>26988,17793=>26989,17794=>26990,17795=>26991,17796=>26992,17797=>26993,17798=>26994,17799=>26995,17800=>26996,17801=>26997,17802=>26998,17803=>26999,17804=>27000,17805=>27001,17806=>27002,17807=>27003,17808=>27004,17809=>27005,17810=>27006,17811=>27007,17812=>27008,17813=>27009,17814=>27010,17815=>27011,17816=>27012,17817=>27013,17818=>27014,17819=>27015,17820=>27016,17821=>27017,17822=>27018,17823=>27019,17824=>27020,17825=>27021,17826=>27022,17827=>27023,17828=>27024,17829=>27025,17830=>27026,17831=>27027,17832=>27028,17833=>27029,17834=>27030,17835=>27031,17836=>27032,17837=>27033,17838=>27034,17839=>27035,17840=>27036,17841=>27037,17842=>27038,17843=>27039,17844=>27040,17845=>27041,17846=>27042,17847=>27043,17848=>27044,17849=>27045,17850=>27046,17851=>27047,17852=>27048,17853=>27049,17854=>27050,17855=>27051,17856=>27052,17857=>27053,17858=>27054,17859=>27055,17860=>27056,17861=>27057,17862=>27058,17863=>27059,17864=>27060,17865=>27061,17866=>27062,17867=>27063,17868=>27064,17869=>27065,17870=>27066,17871=>27067,17872=>27068,17873=>27069,17874=>27070,17875=>27071,17876=>27072,17877=>27073,17878=>27074,17879=>27075,17880=>27076,17881=>27077,17882=>27078,17883=>27079,17884=>27080,17885=>27081,17886=>27082,17887=>27083,17888=>27084,17889=>27085,17890=>27086,17891=>27087,17892=>27088,17893=>27089,17894=>27090,17895=>27091,17896=>27092,17897=>27093,17898=>27094,17899=>27095,17900=>27096,17901=>27097,17902=>27098,17903=>27099,17904=>27100,17905=>27101,17906=>27102,17907=>27103,17908=>27104,17909=>27105,17910=>27106,17911=>27107,17912=>27108,17913=>27109,17914=>27110,17915=>27111,17916=>27112,17917=>27113,17918=>27114,17919=>27115,17920=>27116,17921=>27117,17922=>27118,17923=>27119,17924=>27120,17925=>27121,17926=>27122,17927=>27123,17928=>27124,17929=>27125,17930=>27126,17931=>27127,17932=>27128,17933=>27129,17934=>27130,17935=>27131,17936=>27132,17937=>27133,17938=>27134,17939=>27135,17940=>27136,17941=>27137,17942=>27138,17943=>27139,17944=>27140,17945=>27141,17946=>27142,17947=>27143,17948=>27144,17949=>27145,17950=>27146,17951=>27147,17952=>27148,17953=>27149,17954=>27150,17955=>27151,17956=>27152,17957=>27153,17958=>27154,17959=>27155,17960=>27156,17961=>27157,17962=>27158,17963=>27159,17964=>27160,17965=>27161,17966=>27162,17967=>27163,17968=>27164,17969=>27165,17970=>27166,17971=>27167,17972=>27168,17973=>27169,17974=>27170,17975=>27171,17976=>27172,17977=>27173,17978=>27174,17979=>27175,17980=>27176,17981=>27177,17982=>27178,17983=>27179,17984=>27180,17985=>27181,17986=>27182,17987=>27183,17988=>27184,17989=>27185,17990=>27186,17991=>27187,17992=>27188,17993=>27189,17994=>27190,17995=>27191,17997=>27192,17998=>27193,17999=>27194,18000=>27195,18001=>27196,18002=>27197,18003=>27198,18004=>27199,18005=>27200,18006=>27201,18007=>27202,18008=>27203,18009=>27204,18010=>27205,18011=>27206,18012=>27207,18013=>27208,18014=>27209,18015=>27210,18016=>27211,18018=>27212,18019=>27213,18020=>27214,18021=>27215,18022=>27216,18023=>27217,18024=>27218,18025=>27219,18026=>27220,18027=>27221,18028=>27222,18029=>27223,18030=>27224,18031=>27225,18032=>27226,18033=>27227,18034=>27228,18035=>27229,18036=>27230,18037=>27231,18038=>27232,18039=>27233,18040=>27234,18041=>27235,18042=>27236,18043=>27237,18044=>27238,18045=>27239,18046=>27240,18047=>27241,18048=>27242,18049=>27243,18050=>27244,18051=>27245,18052=>27246,18053=>27247,18054=>27248,18055=>27249,18056=>27250,18057=>27251,18058=>27252,18059=>27253,18060=>27254,18061=>27255,18062=>27256,18063=>27257,18064=>27258,18065=>27259,18066=>27260,18067=>27261,18068=>27262,18069=>27263,18070=>27264,18071=>27265,18072=>27266,18073=>27267,18074=>27268,18075=>27269,18076=>27270,18077=>27271,18078=>27272,18079=>27273,18080=>27274,18081=>27275,18082=>27276,18083=>27277,18084=>27278,18085=>27279,18086=>27280,18087=>27281,18088=>27282,18089=>27283,18090=>27284,18091=>27285,18092=>27286,18093=>27287,18094=>27288,18095=>27289,18096=>27290,18097=>27291,18098=>27292,18099=>27293,18100=>27294,18101=>27295,18102=>27296,18103=>27297,18104=>27298,18105=>27299,18106=>27300,18107=>27301,18108=>27302,18109=>27303,18110=>27304,18111=>27305,18112=>27306,18113=>27307,18114=>27308,18115=>27309,18116=>27310,18117=>27311,18118=>27312,18119=>27313,18120=>27314,18121=>27315,18122=>27316,18123=>27317,18124=>27318,18125=>27319,18126=>27320,18127=>27321,18128=>27322,18129=>27323,18130=>27324,18131=>27325,18132=>27326,18133=>27327,18134=>27328,18135=>27329,18136=>27330,18137=>27331,18138=>27332,18139=>27333,18140=>27334,18141=>27335,18142=>27336,18143=>27337,18144=>27338,18145=>27339,18146=>27340,18147=>27341,18148=>27342,18149=>27343,18150=>27344,18151=>27345,18152=>27346,18153=>27347,18154=>27348,18155=>27349,18156=>27350,18157=>27351,18158=>27352,18159=>27353,18160=>27354,18161=>27355,18162=>27356,18163=>27357,18164=>27358,18165=>27359,18166=>27360,18167=>27361,18168=>27362,18169=>27363,18170=>27364,18171=>27365,18172=>27366,18173=>27367,18174=>27368,18175=>27369,18176=>27370,18177=>27371,18178=>27372,18179=>27373,18180=>27374,18181=>27375,18182=>27376,18183=>27377,18184=>27378,18185=>27379,18186=>27380,18187=>27381,18188=>27382,18189=>27383,18190=>27384,18191=>27385,18192=>27386,18193=>27387,18194=>27388,18195=>27389,18196=>27390,18197=>27391,18198=>27392,18199=>27393,18200=>27394,18201=>27395,18202=>27396,18203=>27397,18204=>27398,18205=>27399,18206=>27400,18207=>27401,18208=>27402,18209=>27403,18210=>27404,18212=>27405,18213=>27406,18214=>27407,18215=>27408,18216=>27409,18218=>27410,18219=>27411,18220=>27412,18221=>27413,18222=>27414,18223=>27415,18224=>27416,18225=>27417,18226=>27418,18227=>27419,18228=>27420,18229=>27421,18230=>27422,18231=>27423,18232=>27424,18233=>27425,18234=>27426,18235=>27427,18236=>27428,18237=>27429,18238=>27430,18239=>27431,18240=>27432,18241=>27433,18242=>27434,18243=>27435,18244=>27436,18245=>27437,18246=>27438,18247=>27439,18248=>27440,18249=>27441,18250=>27442,18251=>27443,18252=>27444,18253=>27445,18254=>27446,18255=>27447,18256=>27448,18257=>27449,18258=>27450,18259=>27451,18260=>27452,18261=>27453,18262=>27454,18263=>27455,18264=>27456,18265=>27457,18266=>27458,18267=>27459,18268=>27460,18269=>27461,18270=>27462,18271=>27463,18272=>27464,18273=>27465,18274=>27466,18275=>27467,18276=>27468,18277=>27469,18278=>27470,18279=>27471,18280=>27472,18281=>27473,18282=>27474,18283=>27475,18284=>27476,18285=>27477,18286=>27478,18287=>27479,18288=>27480,18289=>27481,18290=>27482,18291=>27483,18292=>27484,18293=>27485,18294=>27486,18295=>27487,18296=>27488,18297=>27489,18298=>27490,18299=>27491,18301=>27492,18302=>27493,18303=>27494,18304=>27495,18305=>27496,18306=>27497,18307=>27498,18308=>27499,18309=>27500,18310=>27501,18311=>27502,18312=>27503,18313=>27504,18314=>27505,18315=>27506,18316=>27507,18318=>27508,18319=>27509,18320=>27510,18321=>27511,18322=>27512,18323=>27513,18324=>27514,18325=>27515,18326=>27516,18327=>27517,18328=>27518,18329=>27519,18330=>27520,18331=>27521,18332=>27522,18333=>27523,18334=>27524,18335=>27525,18336=>27526,18337=>27527,18338=>27528,18339=>27529,18340=>27530,18341=>27531,18342=>27532,18343=>27533,18344=>27534,18345=>27535,18346=>27536,18347=>27537,18348=>27538,18349=>27539,18350=>27540,18351=>27541,18352=>27542,18353=>27543,18354=>27544,18355=>27545,18356=>27546,18357=>27547,18358=>27548,18359=>27549,18360=>27550,18361=>27551,18362=>27552,18363=>27553,18364=>27554,18365=>27555,18366=>27556,18367=>27557,18368=>27558,18369=>27559,18370=>27560,18371=>27561,18372=>27562,18373=>27563,18374=>27564,18375=>27565,18376=>27566,18377=>27567,18378=>27568,18379=>27569,18380=>27570,18381=>27571,18382=>27572,18383=>27573,18384=>27574,18385=>27575,18386=>27576,18387=>27577,18388=>27578,18389=>27579,18390=>27580,18391=>27581,18392=>27582,18393=>27583,18394=>27584,18395=>27585,18396=>27586,18397=>27587,18398=>27588,18399=>27589,18400=>27590,18401=>27591,18402=>27592,18403=>27593,18404=>27594,18405=>27595,18406=>27596,18407=>27597,18408=>27598,18409=>27599,18410=>27600,18411=>27601,18412=>27602,18413=>27603,18414=>27604,18415=>27605,18416=>27606,18417=>27607,18418=>27608,18419=>27609,18420=>27610,18421=>27611,18422=>27612,18423=>27613,18424=>27614,18425=>27615,18426=>27616,18427=>27617,18428=>27618,18429=>27619,18430=>27620,18431=>27621,18432=>27622,18433=>27623,18434=>27624,18435=>27625,18436=>27626,18437=>27627,18438=>27628,18439=>27629,18440=>27630,18441=>27631,18442=>27632,18443=>27633,18444=>27634,18445=>27635,18446=>27636,18447=>27637,18448=>27638,18449=>27639,18450=>27640,18451=>27641,18452=>27642,18453=>27643,18454=>27644,18455=>27645,18456=>27646,18457=>27647,18458=>27648,18459=>27649,18460=>27650,18461=>27651,18462=>27652,18463=>27653,18464=>27654,18465=>27655,18466=>27656,18467=>27657,18468=>27658,18469=>27659,18470=>27660,18471=>27661,18472=>27662,18473=>27663,18474=>27664,18475=>27665,18476=>27666,18477=>27667,18478=>27668,18479=>27669,18480=>27670,18481=>27671,18482=>27672,18483=>27673,18484=>27674,18485=>27675,18486=>27676,18487=>27677,18488=>27678,18489=>27679,18490=>27680,18491=>27681,18492=>27682,18493=>27683,18494=>27684,18495=>27685,18496=>27686,18497=>27687,18498=>27688,18499=>27689,18500=>27690,18501=>27691,18502=>27692,18503=>27693,18504=>27694,18505=>27695,18506=>27696,18507=>27697,18508=>27698,18509=>27699,18510=>27700,18511=>27701,18512=>27702,18513=>27703,18514=>27704,18515=>27705,18516=>27706,18517=>27707,18518=>27708,18519=>27709,18520=>27710,18521=>27711,18522=>27712,18523=>27713,18524=>27714,18525=>27715,18526=>27716,18527=>27717,18528=>27718,18529=>27719,18530=>27720,18531=>27721,18532=>27722,18533=>27723,18534=>27724,18535=>27725,18536=>27726,18537=>27727,18538=>27728,18539=>27729,18540=>27730,18541=>27731,18542=>27732,18543=>27733,18544=>27734,18545=>27735,18546=>27736,18547=>27737,18548=>27738,18549=>27739,18550=>27740,18551=>27741,18552=>27742,18553=>27743,18554=>27744,18555=>27745,18556=>27746,18557=>27747,18558=>27748,18559=>27749,18560=>27750,18561=>27751,18562=>27752,18563=>27753,18564=>27754,18565=>27755,18566=>27756,18567=>27757,18568=>27758,18569=>27759,18570=>27760,18571=>27761,18572=>27762,18573=>27763,18574=>27764,18575=>27765,18576=>27766,18577=>27767,18578=>27768,18579=>27769,18580=>27770,18581=>27771,18582=>27772,18583=>27773,18584=>27774,18585=>27775,18586=>27776,18587=>27777,18588=>27778,18589=>27779,18590=>27780,18591=>27781,18592=>27782,18593=>27783,18594=>27784,18595=>27785,18596=>27786,18597=>27787,18598=>27788,18599=>27789,18600=>27790,18601=>27791,18602=>27792,18603=>27793,18604=>27794,18605=>27795,18606=>27796,18607=>27797,18608=>27798,18609=>27799,18610=>27800,18611=>27801,18612=>27802,18613=>27803,18614=>27804,18615=>27805,18616=>27806,18617=>27807,18618=>27808,18619=>27809,18620=>27810,18621=>27811,18622=>27812,18623=>27813,18624=>27814,18625=>27815,18626=>27816,18627=>27817,18628=>27818,18629=>27819,18630=>27820,18631=>27821,18632=>27822,18633=>27823,18634=>27824,18635=>27825,18636=>27826,18637=>27827,18638=>27828,18639=>27829,18640=>27830,18641=>27831,18642=>27832,18643=>27833,18644=>27834,18645=>27835,18646=>27836,18647=>27837,18648=>27838,18649=>27839,18650=>27840,18651=>27841,18652=>27842,18653=>27843,18654=>27844,18655=>27845,18656=>27846,18657=>27847,18658=>27848,18659=>27849,18660=>27850,18661=>27851,18662=>27852,18663=>27853,18664=>27854,18665=>27855,18666=>27856,18667=>27857,18668=>27858,18669=>27859,18670=>27860,18671=>27861,18672=>27862,18673=>27863,18674=>27864,18675=>27865,18676=>27866,18677=>27867,18678=>27868,18679=>27869,18680=>27870,18681=>27871,18682=>27872,18683=>27873,18684=>27874,18685=>27875,18686=>27876,18687=>27877,18688=>27878,18689=>27879,18690=>27880,18691=>27881,18692=>27882,18693=>27883,18694=>27884,18695=>27885,18696=>27886,18697=>27887,18698=>27888,18699=>27889,18700=>27890,18701=>27891,18702=>27892,18703=>27893,18704=>27894,18705=>27895,18706=>27896,18707=>27897,18708=>27898,18709=>27899,18710=>27900,18711=>27901,18712=>27902,18713=>27903,18714=>27904,18715=>27905,18716=>27906,18717=>27907,18718=>27908,18719=>27909,18720=>27910,18721=>27911,18722=>27912,18723=>27913,18724=>27914,18725=>27915,18726=>27916,18727=>27917,18728=>27918,18729=>27919,18730=>27920,18731=>27921,18732=>27922,18733=>27923,18734=>27924,18735=>27925,18736=>27926,18737=>27927,18738=>27928,18739=>27929,18740=>27930,18741=>27931,18742=>27932,18743=>27933,18744=>27934,18745=>27935,18746=>27936,18747=>27937,18748=>27938,18749=>27939,18750=>27940,18751=>27941,18752=>27942,18753=>27943,18754=>27944,18755=>27945,18756=>27946,18757=>27947,18758=>27948,18760=>27949,18761=>27950,18762=>27951,18763=>27952,18764=>27953,18765=>27954,18766=>27955,18767=>27956,18768=>27957,18769=>27958,18770=>27959,18771=>27960,18772=>27961,18773=>27962,18774=>27963,18775=>27964,18776=>27965,18777=>27966,18778=>27967,18779=>27968,18780=>27969,18781=>27970,18782=>27971,18783=>27972,18784=>27973,18785=>27974,18786=>27975,18787=>27976,18788=>27977,18789=>27978,18790=>27979,18791=>27980,18792=>27981,18793=>27982,18794=>27983,18795=>27984,18796=>27985,18797=>27986,18798=>27987,18799=>27988,18800=>27989,18801=>27990,18802=>27991,18803=>27992,18804=>27993,18805=>27994,18806=>27995,18807=>27996,18808=>27997,18809=>27998,18811=>27999,18812=>28000,18814=>28001,18815=>28002,18816=>28003,18817=>28004,18820=>28005,18823=>28006,18824=>28007,18825=>28008,18826=>28009,18827=>28010,18828=>28011,18829=>28012,18830=>28013,18831=>28014,18832=>28015,18833=>28016,18834=>28017,18835=>28018,18836=>28019,18837=>28020,18838=>28021,18839=>28022,18840=>28023,18841=>28024,18842=>28025,18844=>28026,18845=>28027,18846=>28028,18848=>28029,18849=>28030,18850=>28031,18851=>28032,18852=>28033,18853=>28034,18854=>28035,18855=>28036,18856=>28037,18857=>28038,18858=>28039,18859=>28040,18860=>28041,18861=>28042,18862=>28043,18863=>28044,18864=>28045,18865=>28046,18866=>28047,18867=>28048,18868=>28049,18869=>28050,18872=>28051,18873=>28052,18874=>28053,18875=>28054,18876=>28055,18877=>28056,18878=>28057,18879=>28058,18880=>28059,18881=>28060,18882=>28061,18883=>28062,18884=>28063,18885=>28064,18886=>28065,18887=>28066,18888=>28067,18889=>28068,18890=>28069,18891=>28070,18892=>28071,18893=>28072,18894=>28073,18895=>28074,18896=>28075,18897=>28076,18898=>28077,18899=>28078,18900=>28079,18901=>28080,18902=>28081,18903=>28082,18904=>28083,18905=>28084,18906=>28085,18907=>28086,18908=>28087,18909=>28088,18910=>28089,18911=>28090,18912=>28091,18913=>28092,18914=>28093,18915=>28094,18916=>28095,18917=>28096,18918=>28097,18919=>28098,18920=>28099,18921=>28100,18922=>28101,18923=>28102,18924=>28103,18925=>28104,18926=>28105,18927=>28106,18928=>28107,18929=>28108,18930=>28109,18931=>28110,18932=>28111,18933=>28112,18934=>28113,18935=>28114,18936=>28115,18937=>28116,18938=>28117,18939=>28118,18940=>28119,18941=>28120,18942=>28121,18943=>28122,18944=>28123,18945=>28124,18946=>28125,18947=>28126,18948=>28127,18949=>28128,18950=>28129,18951=>28130,18952=>28131,18953=>28132,18954=>28133,18955=>28134,18956=>28135,18957=>28136,18958=>28137,18959=>28138,18960=>28139,18961=>28140,18962=>28141,18963=>28142,18964=>28143,18965=>28144,18966=>28145,18967=>28146,18968=>28147,18969=>28148,18970=>28149,18971=>28150,18972=>28151,18973=>28152,18974=>28153,18975=>28154,18976=>28155,18977=>28156,18978=>28157,18979=>28158,18980=>28159,18981=>28160,18982=>28161,18983=>28162,18984=>28163,18985=>28164,18986=>28165,18987=>28166,18988=>28167,18989=>28168,18990=>28169,18991=>28170,18992=>28171,18993=>28172,18994=>28173,18995=>28174,18996=>28175,18997=>28176,18998=>28177,18999=>28178,19000=>28179,19001=>28180,19002=>28181,19003=>28182,19004=>28183,19005=>28184,19006=>28185,19007=>28186,19008=>28187,19009=>28188,19010=>28189,19011=>28190,19012=>28191,19013=>28192,19014=>28193,19015=>28194,19016=>28195,19017=>28196,19018=>28197,19019=>28198,19020=>28199,19021=>28200,19022=>28201,19023=>28202,19024=>28203,19025=>28204,19026=>28205,19027=>28206,19028=>28207,19029=>28208,19030=>28209,19031=>28210,19032=>28211,19033=>28212,19034=>28213,19035=>28214,19036=>28215,19037=>28216,19038=>28217,19039=>28218,19040=>28219,19041=>28220,19042=>28221,19043=>28222,19044=>28223,19045=>28224,19046=>28225,19047=>28226,19048=>28227,19049=>28228,19050=>28229,19051=>28230,19052=>28231,19053=>28232,19054=>28233,19055=>28234,19056=>28235,19057=>28236,19058=>28237,19059=>28238,19060=>28239,19061=>28240,19062=>28241,19063=>28242,19064=>28243,19065=>28244,19066=>28245,19067=>28246,19068=>28247,19069=>28248,19070=>28249,19071=>28250,19072=>28251,19073=>28252,19074=>28253,19075=>28254,19076=>28255,19077=>28256,19078=>28257,19079=>28258,19080=>28259,19081=>28260,19082=>28261,19083=>28262,19084=>28263,19085=>28264,19086=>28265,19087=>28266,19088=>28267,19089=>28268,19090=>28269,19091=>28270,19092=>28271,19093=>28272,19094=>28273,19095=>28274,19096=>28275,19097=>28276,19098=>28277,19099=>28278,19100=>28279,19101=>28280,19102=>28281,19103=>28282,19104=>28283,19105=>28284,19106=>28285,19107=>28286,19108=>28287,19109=>28288,19110=>28289,19111=>28290,19112=>28291,19113=>28292,19114=>28293,19115=>28294,19116=>28295,19117=>28296,19118=>28297,19119=>28298,19120=>28299,19121=>28300,19122=>28301,19123=>28302,19124=>28303,19125=>28304,19126=>28305,19127=>28306,19128=>28307,19129=>28308,19130=>28309,19131=>28310,19132=>28311,19133=>28312,19134=>28313,19135=>28314,19136=>28315,19137=>28316,19138=>28317,19139=>28318,19140=>28319,19141=>28320,19142=>28321,19143=>28322,19144=>28323,19145=>28324,19146=>28325,19147=>28326,19148=>28327,19149=>28328,19150=>28329,19151=>28330,19152=>28331,19153=>28332,19154=>28333,19155=>28334,19156=>28335,19157=>28336,19158=>28337,19159=>28338,19160=>28339,19161=>28340,19162=>28341,19163=>28342,19164=>28343,19165=>28344,19166=>28345,19167=>28346,19168=>28347,19169=>28348,19170=>28349,19171=>28350,19172=>28351,19173=>28352,19174=>28353,19175=>28354,19176=>28355,19177=>28356,19178=>28357,19179=>28358,19180=>28359,19181=>28360,19182=>28361,19183=>28362,19184=>28363,19185=>28364,19186=>28365,19187=>28366,19188=>28367,19189=>28368,19190=>28369,19191=>28370,19192=>28371,19193=>28372,19194=>28373,19195=>28374,19196=>28375,19197=>28376,19198=>28377,19199=>28378,19200=>28379,19201=>28380,19202=>28381,19203=>28382,19204=>28383,19205=>28384,19206=>28385,19207=>28386,19208=>28387,19209=>28388,19210=>28389,19211=>28390,19212=>28391,19213=>28392,19214=>28393,19215=>28394,19216=>28395,19217=>28396,19218=>28397,19219=>28398,19220=>28399,19221=>28400,19222=>28401,19223=>28402,19224=>28403,19225=>28404,19226=>28405,19227=>28406,19228=>28407,19229=>28408,19230=>28409,19231=>28410,19232=>28411,19233=>28412,19234=>28413,19235=>28414,19236=>28415,19237=>28416,19238=>28417,19239=>28418,19240=>28419,19241=>28420,19242=>28421,19243=>28422,19244=>28423,19245=>28424,19246=>28425,19247=>28426,19248=>28427,19249=>28428,19250=>28429,19251=>28430,19252=>28431,19253=>28432,19254=>28433,19255=>28434,19256=>28435,19257=>28436,19258=>28437,19259=>28438,19260=>28439,19261=>28440,19262=>28441,19263=>28442,19264=>28443,19265=>28444,19266=>28445,19267=>28446,19268=>28447,19269=>28448,19270=>28449,19271=>28450,19272=>28451,19273=>28452,19274=>28453,19275=>28454,19276=>28455,19277=>28456,19278=>28457,19279=>28458,19280=>28459,19281=>28460,19282=>28461,19283=>28462,19284=>28463,19285=>28464,19286=>28465,19287=>28466,19288=>28467,19289=>28468,19290=>28469,19291=>28470,19292=>28471,19293=>28472,19294=>28473,19295=>28474,19296=>28475,19297=>28476,19298=>28477,19299=>28478,19300=>28479,19301=>28480,19302=>28481,19303=>28482,19304=>28483,19305=>28484,19306=>28485,19307=>28486,19308=>28487,19309=>28488,19310=>28489,19311=>28490,19312=>28491,19313=>28492,19314=>28493,19315=>28494,19316=>28495,19317=>28496,19318=>28497,19319=>28498,19320=>28499,19321=>28500,19322=>28501,19323=>28502,19324=>28503,19325=>28504,19326=>28505,19327=>28506,19328=>28507,19329=>28508,19330=>28509,19331=>28510,19332=>28511,19333=>28512,19334=>28513,19335=>28514,19336=>28515,19337=>28516,19338=>28517,19339=>28518,19340=>28519,19341=>28520,19342=>28521,19343=>28522,19344=>28523,19345=>28524,19346=>28525,19347=>28526,19348=>28527,19349=>28528,19350=>28529,19351=>28530,19352=>28531,19353=>28532,19354=>28533,19355=>28534,19356=>28535,19357=>28536,19358=>28537,19359=>28538,19360=>28539,19361=>28540,19362=>28541,19363=>28542,19364=>28543,19365=>28544,19366=>28545,19367=>28546,19368=>28547,19369=>28548,19370=>28549,19371=>28550,19372=>28551,19373=>28552,19374=>28553,19375=>28554,19376=>28555,19377=>28556,19378=>28557,19379=>28558,19380=>28559,19381=>28560,19382=>28561,19383=>28562,19384=>28563,19385=>28564,19386=>28565,19387=>28566,19388=>28567,19389=>28568,19390=>28569,19391=>28570,19392=>28571,19393=>28572,19394=>28573,19395=>28574,19396=>28575,19397=>28576,19398=>28577,19399=>28578,19400=>28579,19401=>28580,19402=>28581,19403=>28582,19404=>28583,19405=>28584,19406=>28585,19407=>28586,19408=>28587,19409=>28588,19410=>28589,19411=>28590,19412=>28591,19413=>28592,19414=>28593,19415=>28594,19416=>28595,19417=>28596,19418=>28597,19419=>28598,19420=>28599,19421=>28600,19422=>28601,19423=>28602,19424=>28603,19425=>28604,19426=>28605,19427=>28606,19428=>28607,19429=>28608,19430=>28609,19431=>28610,19432=>28611,19433=>28612,19434=>28613,19435=>28614,19436=>28615,19437=>28616,19438=>28617,19439=>28618,19440=>28619,19441=>28620,19442=>28621,19443=>28622,19444=>28623,19445=>28624,19446=>28625,19447=>28626,19448=>28627,19449=>28628,19450=>28629,19451=>28630,19452=>28631,19453=>28632,19454=>28633,19455=>28634,19456=>28635,19457=>28636,19458=>28637,19459=>28638,19460=>28639,19461=>28640,19462=>28641,19463=>28642,19464=>28643,19465=>28644,19466=>28645,19467=>28646,19468=>28647,19469=>28648,19470=>28649,19471=>28650,19472=>28651,19473=>28652,19474=>28653,19475=>28654,19476=>28655,19477=>28656,19478=>28657,19479=>28658,19480=>28659,19481=>28660,19482=>28661,19483=>28662,19484=>28663,19485=>28664,19486=>28665,19487=>28666,19488=>28667,19489=>28668,19490=>28669,19491=>28670,19492=>28671,19493=>28672,19494=>28673,19495=>28674,19496=>28675,19497=>28676,19498=>28677,19499=>28678,19500=>28679,19501=>28680,19502=>28681,19503=>28682,19504=>28683,19505=>28684,19506=>28685,19507=>28686,19508=>28687,19509=>28688,19510=>28689,19511=>28690,19512=>28691,19513=>28692,19514=>28693,19515=>28694,19516=>28695,19517=>28696,19518=>28697,19519=>28698,19520=>28699,19521=>28700,19522=>28701,19523=>28702,19524=>28703,19525=>28704,19526=>28705,19527=>28706,19528=>28707,19529=>28708,19530=>28709,19531=>28710,19532=>28711,19533=>28712,19534=>28713,19535=>28714,19536=>28715,19537=>28716,19538=>28717,19539=>28718,19540=>28719,19541=>28720,19542=>28721,19543=>28722,19544=>28723,19545=>28724,19546=>28725,19547=>28726,19548=>28727,19549=>28728,19550=>28729,19551=>28730,19552=>28731,19553=>28732,19554=>28733,19555=>28734,19556=>28735,19557=>28736,19558=>28737,19559=>28738,19560=>28739,19561=>28740,19562=>28741,19563=>28742,19564=>28743,19565=>28744,19566=>28745,19567=>28746,19568=>28747,19569=>28748,19570=>28749,19571=>28750,19572=>28751,19573=>28752,19574=>28753,19576=>28754,19577=>28755,19578=>28756,19579=>28757,19580=>28758,19581=>28759,19582=>28760,19583=>28761,19584=>28762,19585=>28763,19586=>28764,19587=>28765,19588=>28766,19589=>28767,19590=>28768,19591=>28769,19592=>28770,19593=>28771,19594=>28772,19595=>28773,19596=>28774,19597=>28775,19598=>28776,19599=>28777,19600=>28778,19601=>28779,19602=>28780,19603=>28781,19604=>28782,19605=>28783,19606=>28784,19607=>28785,19608=>28786,19609=>28787,19610=>28788,19611=>28789,19612=>28790,19613=>28791,19614=>28792,19620=>28793,19621=>28794,19622=>28795,19623=>28796,19624=>28797,19625=>28798,19626=>28799,19627=>28800,19628=>28801,19629=>28802,19630=>28803,19631=>28804,19632=>28805,19633=>28806,19634=>28807,19635=>28808,19636=>28809,19637=>28810,19638=>28811,19639=>28812,19640=>28813,19641=>28814,19642=>28815,19643=>28816,19644=>28817,19645=>28818,19646=>28819,19647=>28820,19648=>28821,19649=>28822,19650=>28823,19651=>28824,19652=>28825,19653=>28826,19654=>28827,19655=>28828,19656=>28829,19657=>28830,19658=>28831,19659=>28832,19660=>28833,19661=>28834,19662=>28835,19663=>28836,19664=>28837,19665=>28838,19666=>28839,19667=>28840,19668=>28841,19669=>28842,19670=>28843,19671=>28844,19672=>28845,19673=>28846,19674=>28847,19675=>28848,19676=>28849,19677=>28850,19678=>28851,19679=>28852,19680=>28853,19681=>28854,19682=>28855,19683=>28856,19684=>28857,19685=>28858,19686=>28859,19687=>28860,19688=>28861,19689=>28862,19690=>28863,19691=>28864,19692=>28865,19693=>28866,19694=>28867,19695=>28868,19696=>28869,19697=>28870,19698=>28871,19699=>28872,19700=>28873,19701=>28874,19702=>28875,19703=>28876,19704=>28877,19705=>28878,19706=>28879,19707=>28880,19708=>28881,19709=>28882,19710=>28883,19711=>28884,19712=>28885,19713=>28886,19714=>28887,19715=>28888,19716=>28889,19717=>28890,19718=>28891,19719=>28892,19720=>28893,19721=>28894,19722=>28895,19723=>28896,19724=>28897,19725=>28898,19726=>28899,19727=>28900,19728=>28901,19729=>28902,19730=>28903,19738=>28904,19739=>28905,19740=>28906,19741=>28907,19742=>28908,19743=>28909,19744=>28910,19745=>28911,19746=>28912,19747=>28913,19748=>28914,19749=>28915,19750=>28916,19751=>28917,19752=>28918,19753=>28919,19754=>28920,19755=>28921,19756=>28922,19757=>28923,19758=>28924,19759=>28925,19760=>28926,19761=>28927,19762=>28928,19763=>28929,19764=>28930,19765=>28931,19766=>28932,19767=>28933,19768=>28934,19769=>28935,19770=>28936,19771=>28937,19772=>28938,19773=>28939,19774=>28940,19775=>28941,19776=>28942,19777=>28943,19778=>28944,19779=>28945,19780=>28946,19781=>28947,19782=>28948,19783=>28949,19784=>28950,19785=>28951,19786=>28952,19787=>28953,19788=>28954,19789=>28955,19790=>28956,19791=>28957,19792=>28958,19793=>28959,19794=>28960,19795=>28961,19796=>28962,19797=>28963,19798=>28964,19799=>28965,19800=>28966,19801=>28967,19802=>28968,19803=>28969,19804=>28970,19805=>28971,19806=>28972,19807=>28973,19808=>28974,19809=>28975,19810=>28976,19811=>28977,19812=>28978,19813=>28979,19814=>28980,19815=>28981,19816=>28982,19817=>28983,19818=>28984,19819=>28985,19820=>28986,19821=>28987,19822=>28988,19823=>28989,19824=>28990,19825=>28991,19826=>28992,19827=>28993,19828=>28994,19829=>28995,19830=>28996,19831=>28997,19832=>28998,19833=>28999,19834=>29000,19835=>29001,19836=>29002,19837=>29003,19838=>29004,19839=>29005,19840=>29006,19841=>29007,19842=>29008,19843=>29009,19844=>29010,19845=>29011,19846=>29012,19847=>29013,19848=>29014,19849=>29015,19850=>29016,19851=>29017,19852=>29018,19853=>29019,19854=>29020,19855=>29021,19856=>29022,19857=>29023,19858=>29024,19859=>29025,19860=>29026,19861=>29027,19862=>29028,19863=>29029,19864=>29030,19865=>29031,19866=>29032,19867=>29033,19868=>29034,19869=>29035,19870=>29036,19871=>29037,19872=>29038,19873=>29039,19874=>29040,19875=>29041,19876=>29042,19877=>29043,19878=>29044,19879=>29045,19880=>29046,19881=>29047,19882=>29048,19883=>29049,19884=>29050,19885=>29051,19887=>29052,19888=>29053,19889=>29054,19890=>29055,19891=>29056,19892=>29057,19893=>29058,40960=>29064,40961=>29065,40962=>29066,40963=>29067,40964=>29068,40965=>29069,40966=>29070,40967=>29071,40968=>29072,40969=>29073,40970=>29074,40971=>29075,40972=>29076,40973=>29077,40974=>29078,40975=>29079,40976=>29080,40977=>29081,40978=>29082,40979=>29083,40980=>29084,40981=>29085,40982=>29086,40983=>29087,40984=>29088,40985=>29089,40986=>29090,40987=>29091,40988=>29092,40989=>29093,40990=>29094,40991=>29095,40992=>29096,40993=>29097,40994=>29098,40995=>29099,40996=>29100,40997=>29101,40998=>29102,40999=>29103,41000=>29104,41001=>29105,41002=>29106,41003=>29107,41004=>29108,41005=>29109,41006=>29110,41007=>29111,41008=>29112,41009=>29113,41010=>29114,41011=>29115,41012=>29116,41013=>29117,41014=>29118,41015=>29119,41016=>29120,41017=>29121,41018=>29122,41019=>29123,41020=>29124,41021=>29125,41022=>29126,41023=>29127,41024=>29128,41025=>29129,41026=>29130,41027=>29131,41028=>29132,41029=>29133,41030=>29134,41031=>29135,41032=>29136,41033=>29137,41034=>29138,41035=>29139,41036=>29140,41037=>29141,41038=>29142,41039=>29143,41040=>29144,41041=>29145,41042=>29146,41043=>29147,41044=>29148,41045=>29149,41046=>29150,41047=>29151,41048=>29152,41049=>29153,41050=>29154,41051=>29155,41052=>29156,41053=>29157,41054=>29158,41055=>29159,41056=>29160,41057=>29161,41058=>29162,41059=>29163,41060=>29164,41061=>29165,41062=>29166,41063=>29167,41064=>29168,41065=>29169,41066=>29170,41067=>29171,41068=>29172,41069=>29173,41070=>29174,41071=>29175,41072=>29176,41073=>29177,41074=>29178,41075=>29179,41076=>29180,41077=>29181,41078=>29182,41079=>29183,41080=>29184,41081=>29185,41082=>29186,41083=>29187,41084=>29188,41085=>29189,41086=>29190,41087=>29191,41088=>29192,41089=>29193,41090=>29194,41091=>29195,41092=>29196,41093=>29197,41094=>29198,41095=>29199,41096=>29200,41097=>29201,41098=>29202,41099=>29203,41100=>29204,41101=>29205,41102=>29206,41103=>29207,41104=>29208,41105=>29209,41106=>29210,41107=>29211,41108=>29212,41109=>29213,41110=>29214,41111=>29215,41112=>29216,41113=>29217,41114=>29218,41115=>29219,41116=>29220,41117=>29221,41118=>29222,41119=>29223,41120=>29224,41121=>29225,41122=>29226,41123=>29227,41124=>29228,41125=>29229,41126=>29230,41127=>29231,41128=>29232,41129=>29233,41130=>29234,41131=>29235,41132=>29236,41133=>29237,41134=>29238,41135=>29239,41136=>29240,41137=>29241,41138=>29242,41139=>29243,41140=>29244,41141=>29245,41142=>29246,41143=>29247,41144=>29248,41145=>29249,41146=>29250,41147=>29251,41148=>29252,41149=>29253,41150=>29254,41151=>29255,41152=>29256,41153=>29257,41154=>29258,41155=>29259,41156=>29260,41157=>29261,41158=>29262,41159=>29263,41160=>29264,41161=>29265,41162=>29266,41163=>29267,41164=>29268,41165=>29269,41166=>29270,41167=>29271,41168=>29272,41169=>29273,41170=>29274,41171=>29275,41172=>29276,41173=>29277,41174=>29278,41175=>29279,41176=>29280,41177=>29281,41178=>29282,41179=>29283,41180=>29284,41181=>29285,41182=>29286,41183=>29287,41184=>29288,41185=>29289,41186=>29290,41187=>29291,41188=>29292,41189=>29293,41190=>29294,41191=>29295,41192=>29296,41193=>29297,41194=>29298,41195=>29299,41196=>29300,41197=>29301,41198=>29302,41199=>29303,41200=>29304,41201=>29305,41202=>29306,41203=>29307,41204=>29308,41205=>29309,41206=>29310,41207=>29311,41208=>29312,41209=>29313,41210=>29314,41211=>29315,41212=>29316,41213=>29317,41214=>29318,41215=>29319,41216=>29320,41217=>29321,41218=>29322,41219=>29323,41220=>29324,41221=>29325,41222=>29326,41223=>29327,41224=>29328,41225=>29329,41226=>29330,41227=>29331,41228=>29332,41229=>29333,41230=>29334,41231=>29335,41232=>29336,41233=>29337,41234=>29338,41235=>29339,41236=>29340,41237=>29341,41238=>29342,41239=>29343,41240=>29344,41241=>29345,41242=>29346,41243=>29347,41244=>29348,41245=>29349,41246=>29350,41247=>29351,41248=>29352,41249=>29353,41250=>29354,41251=>29355,41252=>29356,41253=>29357,41254=>29358,41255=>29359,41256=>29360,41257=>29361,41258=>29362,41259=>29363,41260=>29364,41261=>29365,41262=>29366,41263=>29367,41264=>29368,41265=>29369,41266=>29370,41267=>29371,41268=>29372,41269=>29373,41270=>29374,41271=>29375,41272=>29376,41273=>29377,41274=>29378,41275=>29379,41276=>29380,41277=>29381,41278=>29382,41279=>29383,41280=>29384,41281=>29385,41282=>29386,41283=>29387,41284=>29388,41285=>29389,41286=>29390,41287=>29391,41288=>29392,41289=>29393,41290=>29394,41291=>29395,41292=>29396,41293=>29397,41294=>29398,41295=>29399,41296=>29400,41297=>29401,41298=>29402,41299=>29403,41300=>29404,41301=>29405,41302=>29406,41303=>29407,41304=>29408,41305=>29409,41306=>29410,41307=>29411,41308=>29412,41309=>29413,41310=>29414,41311=>29415,41312=>29416,41313=>29417,41314=>29418,41315=>29419,41316=>29420,41317=>29421,41318=>29422,41319=>29423,41320=>29424,41321=>29425,41322=>29426,41323=>29427,41324=>29428,41325=>29429,41326=>29430,41327=>29431,41328=>29432,41329=>29433,41330=>29434,41331=>29435,41332=>29436,41333=>29437,41334=>29438,41335=>29439,41336=>29440,41337=>29441,41338=>29442,41339=>29443,41340=>29444,41341=>29445,41342=>29446,41343=>29447,41344=>29448,41345=>29449,41346=>29450,41347=>29451,41348=>29452,41349=>29453,41350=>29454,41351=>29455,41352=>29456,41353=>29457,41354=>29458,41355=>29459,41356=>29460,41357=>29461,41358=>29462,41359=>29463,41360=>29464,41361=>29465,41362=>29466,41363=>29467,41364=>29468,41365=>29469,41366=>29470,41367=>29471,41368=>29472,41369=>29473,41370=>29474,41371=>29475,41372=>29476,41373=>29477,41374=>29478,41375=>29479,41376=>29480,41377=>29481,41378=>29482,41379=>29483,41380=>29484,41381=>29485,41382=>29486,41383=>29487,41384=>29488,41385=>29489,41386=>29490,41387=>29491,41388=>29492,41389=>29493,41390=>29494,41391=>29495,41392=>29496,41393=>29497,41394=>29498,41395=>29499,41396=>29500,41397=>29501,41398=>29502,41399=>29503,41400=>29504,41401=>29505,41402=>29506,41403=>29507,41404=>29508,41405=>29509,41406=>29510,41407=>29511,41408=>29512,41409=>29513,41410=>29514,41411=>29515,41412=>29516,41413=>29517,41414=>29518,41415=>29519,41416=>29520,41417=>29521,41418=>29522,41419=>29523,41420=>29524,41421=>29525,41422=>29526,41423=>29527,41424=>29528,41425=>29529,41426=>29530,41427=>29531,41428=>29532,41429=>29533,41430=>29534,41431=>29535,41432=>29536,41433=>29537,41434=>29538,41435=>29539,41436=>29540,41437=>29541,41438=>29542,41439=>29543,41440=>29544,41441=>29545,41442=>29546,41443=>29547,41444=>29548,41445=>29549,41446=>29550,41447=>29551,41448=>29552,41449=>29553,41450=>29554,41451=>29555,41452=>29556,41453=>29557,41454=>29558,41455=>29559,41456=>29560,41457=>29561,41458=>29562,41459=>29563,41460=>29564,41461=>29565,41462=>29566,41463=>29567,41464=>29568,41465=>29569,41466=>29570,41467=>29571,41468=>29572,41469=>29573,41470=>29574,41471=>29575,41472=>29576,41473=>29577,41474=>29578,41475=>29579,41476=>29580,41477=>29581,41478=>29582,41479=>29583,41480=>29584,41481=>29585,41482=>29586,41483=>29587,41484=>29588,41485=>29589,41486=>29590,41487=>29591,41488=>29592,41489=>29593,41490=>29594,41491=>29595,41492=>29596,41493=>29597,41494=>29598,41495=>29599,41496=>29600,41497=>29601,41498=>29602,41499=>29603,41500=>29604,41501=>29605,41502=>29606,41503=>29607,41504=>29608,41505=>29609,41506=>29610,41507=>29611,41508=>29612,41509=>29613,41510=>29614,41511=>29615,41512=>29616,41513=>29617,41514=>29618,41515=>29619,41516=>29620,41517=>29621,41518=>29622,41519=>29623,41520=>29624,41521=>29625,41522=>29626,41523=>29627,41524=>29628,41525=>29629,41526=>29630,41527=>29631,41528=>29632,41529=>29633,41530=>29634,41531=>29635,41532=>29636,41533=>29637,41534=>29638,41535=>29639,41536=>29640,41537=>29641,41538=>29642,41539=>29643,41540=>29644,41541=>29645,41542=>29646,41543=>29647,41544=>29648,41545=>29649,41546=>29650,41547=>29651,41548=>29652,41549=>29653,41550=>29654,41551=>29655,41552=>29656,41553=>29657,41554=>29658,41555=>29659,41556=>29660,41557=>29661,41558=>29662,41559=>29663,41560=>29664,41561=>29665,41562=>29666,41563=>29667,41564=>29668,41565=>29669,41566=>29670,41567=>29671,41568=>29672,41569=>29673,41570=>29674,41571=>29675,41572=>29676,41573=>29677,41574=>29678,41575=>29679,41576=>29680,41577=>29681,41578=>29682,41579=>29683,41580=>29684,41581=>29685,41582=>29686,41583=>29687,41584=>29688,41585=>29689,41586=>29690,41587=>29691,41588=>29692,41589=>29693,41590=>29694,41591=>29695,41592=>29696,41593=>29697,41594=>29698,41595=>29699,41596=>29700,41597=>29701,41598=>29702,41599=>29703,41600=>29704,41601=>29705,41602=>29706,41603=>29707,41604=>29708,41605=>29709,41606=>29710,41607=>29711,41608=>29712,41609=>29713,41610=>29714,41611=>29715,41612=>29716,41613=>29717,41614=>29718,41615=>29719,41616=>29720,41617=>29721,41618=>29722,41619=>29723,41620=>29724,41621=>29725,41622=>29726,41623=>29727,41624=>29728,41625=>29729,41626=>29730,41627=>29731,41628=>29732,41629=>29733,41630=>29734,41631=>29735,41632=>29736,41633=>29737,41634=>29738,41635=>29739,41636=>29740,41637=>29741,41638=>29742,41639=>29743,41640=>29744,41641=>29745,41642=>29746,41643=>29747,41644=>29748,41645=>29749,41646=>29750,41647=>29751,41648=>29752,41649=>29753,41650=>29754,41651=>29755,41652=>29756,41653=>29757,41654=>29758,41655=>29759,41656=>29760,41657=>29761,41658=>29762,41659=>29763,41660=>29764,41661=>29765,41662=>29766,41663=>29767,41664=>29768,41665=>29769,41666=>29770,41667=>29771,41668=>29772,41669=>29773,41670=>29774,41671=>29775,41672=>29776,41673=>29777,41674=>29778,41675=>29779,41676=>29780,41677=>29781,41678=>29782,41679=>29783,41680=>29784,41681=>29785,41682=>29786,41683=>29787,41684=>29788,41685=>29789,41686=>29790,41687=>29791,41688=>29792,41689=>29793,41690=>29794,41691=>29795,41692=>29796,41693=>29797,41694=>29798,41695=>29799,41696=>29800,41697=>29801,41698=>29802,41699=>29803,41700=>29804,41701=>29805,41702=>29806,41703=>29807,41704=>29808,41705=>29809,41706=>29810,41707=>29811,41708=>29812,41709=>29813,41710=>29814,41711=>29815,41712=>29816,41713=>29817,41714=>29818,41715=>29819,41716=>29820,41717=>29821,41718=>29822,41719=>29823,41720=>29824,41721=>29825,41722=>29826,41723=>29827,41724=>29828,41725=>29829,41726=>29830,41727=>29831,41728=>29832,41729=>29833,41730=>29834,41731=>29835,41732=>29836,41733=>29837,41734=>29838,41735=>29839,41736=>29840,41737=>29841,41738=>29842,41739=>29843,41740=>29844,41741=>29845,41742=>29846,41743=>29847,41744=>29848,41745=>29849,41746=>29850,41747=>29851,41748=>29852,41749=>29853,41750=>29854,41751=>29855,41752=>29856,41753=>29857,41754=>29858,41755=>29859,41756=>29860,41757=>29861,41758=>29862,41759=>29863,41760=>29864,41761=>29865,41762=>29866,41763=>29867,41764=>29868,41765=>29869,41766=>29870,41767=>29871,41768=>29872,41769=>29873,41770=>29874,41771=>29875,41772=>29876,41773=>29877,41774=>29878,41775=>29879,41776=>29880,41777=>29881,41778=>29882,41779=>29883,41780=>29884,41781=>29885,41782=>29886,41783=>29887,41784=>29888,41785=>29889,41786=>29890,41787=>29891,41788=>29892,41789=>29893,41790=>29894,41791=>29895,41792=>29896,41793=>29897,41794=>29898,41795=>29899,41796=>29900,41797=>29901,41798=>29902,41799=>29903,41800=>29904,41801=>29905,41802=>29906,41803=>29907,41804=>29908,41805=>29909,41806=>29910,41807=>29911,41808=>29912,41809=>29913,41810=>29914,41811=>29915,41812=>29916,41813=>29917,41814=>29918,41815=>29919,41816=>29920,41817=>29921,41818=>29922,41819=>29923,41820=>29924,41821=>29925,41822=>29926,41823=>29927,41824=>29928,41825=>29929,41826=>29930,41827=>29931,41828=>29932,41829=>29933,41830=>29934,41831=>29935,41832=>29936,41833=>29937,41834=>29938,41835=>29939,41836=>29940,41837=>29941,41838=>29942,41839=>29943,41840=>29944,41841=>29945,41842=>29946,41843=>29947,41844=>29948,41845=>29949,41846=>29950,41847=>29951,41848=>29952,41849=>29953,41850=>29954,41851=>29955,41852=>29956,41853=>29957,41854=>29958,41855=>29959,41856=>29960,41857=>29961,41858=>29962,41859=>29963,41860=>29964,41861=>29965,41862=>29966,41863=>29967,41864=>29968,41865=>29969,41866=>29970,41867=>29971,41868=>29972,41869=>29973,41870=>29974,41871=>29975,41872=>29976,41873=>29977,41874=>29978,41875=>29979,41876=>29980,41877=>29981,41878=>29982,41879=>29983,41880=>29984,41881=>29985,41882=>29986,41883=>29987,41884=>29988,41885=>29989,41886=>29990,41887=>29991,41888=>29992,41889=>29993,41890=>29994,41891=>29995,41892=>29996,41893=>29997,41894=>29998,41895=>29999,41896=>30000,41897=>30001,41898=>30002,41899=>30003,41900=>30004,41901=>30005,41902=>30006,41903=>30007,41904=>30008,41905=>30009,41906=>30010,41907=>30011,41908=>30012,41909=>30013,41910=>30014,41911=>30015,41912=>30016,41913=>30017,41914=>30018,41915=>30019,41916=>30020,41917=>30021,41918=>30022,41919=>30023,41920=>30024,41921=>30025,41922=>30026,41923=>30027,41924=>30028,41925=>30029,41926=>30030,41927=>30031,41928=>30032,41929=>30033,41930=>30034,41931=>30035,41932=>30036,41933=>30037,41934=>30038,41935=>30039,41936=>30040,41937=>30041,41938=>30042,41939=>30043,41940=>30044,41941=>30045,41942=>30046,41943=>30047,41944=>30048,41945=>30049,41946=>30050,41947=>30051,41948=>30052,41949=>30053,41950=>30054,41951=>30055,41952=>30056,41953=>30057,41954=>30058,41955=>30059,41956=>30060,41957=>30061,41958=>30062,41959=>30063,41960=>30064,41961=>30065,41962=>30066,41963=>30067,41964=>30068,41965=>30069,41966=>30070,41967=>30071,41968=>30072,41969=>30073,41970=>30074,41971=>30075,41972=>30076,41973=>30077,41974=>30078,41975=>30079,41976=>30080,41977=>30081,41978=>30082,41979=>30083,41980=>30084,41981=>30085,41982=>30086,41983=>30087,41984=>30088,41985=>30089,41986=>30090,41987=>30091,41988=>30092,41989=>30093,41990=>30094,41991=>30095,41992=>30096,41993=>30097,41994=>30098,41995=>30099,41996=>30100,41997=>30101,41998=>30102,41999=>30103,42000=>30104,42001=>30105,42002=>30106,42003=>30107,42004=>30108,42005=>30109,42006=>30110,42007=>30111,42008=>30112,42009=>30113,42010=>30114,42011=>30115,42012=>30116,42013=>30117,42014=>30118,42015=>30119,42016=>30120,42017=>30121,42018=>30122,42019=>30123,42020=>30124,42021=>30125,42022=>30126,42023=>30127,42024=>30128,42025=>30129,42026=>30130,42027=>30131,42028=>30132,42029=>30133,42030=>30134,42031=>30135,42032=>30136,42033=>30137,42034=>30138,42035=>30139,42036=>30140,42037=>30141,42038=>30142,42039=>30143,42040=>30144,42041=>30145,42042=>30146,42043=>30147,42044=>30148,42045=>30149,42046=>30150,42047=>30151,42048=>30152,42049=>30153,42050=>30154,42051=>30155,42052=>30156,42053=>30157,42054=>30158,42055=>30159,42056=>30160,42057=>30161,42058=>30162,42059=>30163,42060=>30164,42061=>30165,42062=>30166,42063=>30167,42064=>30168,42065=>30169,42066=>30170,42067=>30171,42068=>30172,42069=>30173,42070=>30174,42071=>30175,42072=>30176,42073=>30177,42074=>30178,42075=>30179,42076=>30180,42077=>30181,42078=>30182,42079=>30183,42080=>30184,42081=>30185,42082=>30186,42083=>30187,42084=>30188,42085=>30189,42086=>30190,42087=>30191,42088=>30192,42089=>30193,42090=>30194,42091=>30195,42092=>30196,42093=>30197,42094=>30198,42095=>30199,42096=>30200,42097=>30201,42098=>30202,42099=>30203,42100=>30204,42101=>30205,42102=>30206,42103=>30207,42104=>30208,42105=>30209,42106=>30210,42107=>30211,42108=>30212,42109=>30213,42110=>30214,42111=>30215,42112=>30216,42113=>30217,42114=>30218,42115=>30219,42116=>30220,42117=>30221,42118=>30222,42119=>30223,42120=>30224,42121=>30225,42122=>30226,42123=>30227,42124=>30228,42128=>30229,42129=>30230,42130=>30231,42131=>30232,42132=>30233,42133=>30234,42134=>30235,42135=>30236,42136=>30237,42137=>30238,42138=>30239,42139=>30240,42140=>30241,42141=>30242,42142=>30243,42143=>30244,42144=>30245,42145=>30246,42146=>30247,42147=>30248,42148=>30249,42149=>30250,42150=>30251,42151=>30252,42152=>30253,42153=>30254,42154=>30255,42155=>30256,42156=>30257,42157=>30258,42158=>30259,42159=>30260,42160=>30261,42161=>30262,42162=>30263,42163=>30264,42164=>30265,42165=>30266,42166=>30267,42167=>30268,42168=>30269,42169=>30270,42170=>30271,42171=>30272,42172=>30273,42173=>30274,42174=>30275,42175=>30276,42176=>30277,42177=>30278,42178=>30279,42179=>30280,42180=>30281,42181=>30282,42182=>30283);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/uni2cid_aj16.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/uni2cid_aj16.php
new file mode 100644
index 00000000..0c3c148f
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/uni2cid_aj16.php
@@ -0,0 +1,6 @@
+<?php
+// unicode to cid conversion table is from
+// ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/
+// cid2code.txt in aj16.tar.Z
+$cidinfo['uni2cid'] = array(160=>1,32=>1,33=>2,34=>3,35=>4,36=>5,37=>6,38=>7,39=>8,40=>9,41=>10,42=>11,43=>12,44=>13,8209=>14,45=>14,46=>15,47=>16,48=>17,49=>18,50=>19,51=>20,52=>21,53=>22,54=>23,55=>24,56=>25,57=>26,58=>27,59=>28,60=>29,61=>30,62=>31,63=>32,64=>33,65=>34,66=>35,67=>36,68=>37,69=>38,70=>39,71=>40,72=>41,73=>42,74=>43,75=>44,76=>45,77=>46,78=>47,79=>48,80=>49,81=>50,82=>51,83=>52,84=>53,85=>54,86=>55,87=>56,88=>57,89=>58,90=>59,91=>60,165=>61,93=>62,94=>63,818=>64,95=>64,768=>65,96=>65,97=>66,98=>67,99=>68,100=>69,101=>70,102=>71,103=>72,104=>73,105=>74,106=>75,107=>76,108=>77,109=>78,110=>79,111=>80,112=>81,113=>82,114=>83,115=>84,116=>85,117=>86,118=>87,119=>88,120=>89,121=>90,122=>91,123=>92,166=>93,125=>94,732=>95,771=>95,700=>96,8217=>96,92=>97,699=>98,8216=>98,124=>99,126=>100,8764=>100,161=>101,162=>102,163=>103,8260=>104,402=>105,164=>107,8220=>108,171=>109,8249=>110,8250=>111,64257=>112,64258=>113,8210=>114,8211=>114,183=>117,8729=>117,8226=>119,8218=>120,8222=>121,8221=>122,187=>123,191=>126,769=>127,710=>128,770=>128,175=>129,772=>129,774=>130,775=>131,776=>132,730=>133,778=>133,184=>134,807=>134,779=>135,808=>136,780=>137,822=>138,8212=>138,198=>139,170=>140,321=>141,216=>142,338=>143,186=>144,230=>145,305=>146,322=>147,248=>148,339=>149,223=>150,173=>151,169=>152,172=>153,174=>154,178=>157,179=>158,181=>159,185=>160,188=>161,189=>162,190=>163,192=>164,193=>165,194=>166,195=>167,196=>168,197=>169,199=>170,200=>171,201=>172,202=>173,203=>174,204=>175,205=>176,206=>177,207=>178,208=>179,209=>180,210=>181,211=>182,212=>183,213=>184,214=>185,217=>187,218=>188,219=>189,220=>190,221=>191,222=>192,224=>193,225=>194,226=>195,227=>196,228=>197,229=>198,231=>199,232=>200,233=>201,234=>202,235=>203,236=>204,237=>205,238=>206,239=>207,240=>208,241=>209,242=>210,243=>211,244=>212,245=>213,246=>214,249=>216,250=>217,251=>218,252=>219,253=>220,254=>221,255=>222,352=>223,376=>224,381=>225,773=>226,8254=>226,353=>227,8482=>228,382=>229,8194=>231,65512=>323,65377=>327,65378=>328,65379=>329,65380=>330,65381=>331,65382=>332,65383=>333,65384=>334,65385=>335,65386=>336,65387=>337,65388=>338,65389=>339,65390=>340,65391=>341,65392=>342,65393=>343,65394=>344,65395=>345,65396=>346,65397=>347,65398=>348,65399=>349,65400=>350,65401=>351,65402=>352,65403=>353,65404=>354,65405=>355,65406=>356,65407=>357,65408=>358,65409=>359,65410=>360,65411=>361,65412=>362,65413=>363,65414=>364,65415=>365,65416=>366,65417=>367,65418=>368,65419=>369,65420=>370,65421=>371,65422=>372,65423=>373,65424=>374,65425=>375,65426=>376,65427=>377,65428=>378,65429=>379,65430=>380,65431=>381,65432=>382,65433=>383,65434=>384,65435=>385,65436=>386,65437=>387,65438=>388,65439=>389,8195=>633,12288=>633,12289=>634,12290=>635,65292=>636,65294=>637,12539=>638,65306=>639,65307=>640,65311=>641,65281=>642,12443=>643,12444=>644,180=>645,65344=>646,168=>647,65342=>648,65507=>649,65343=>650,12541=>651,12542=>652,12445=>653,12446=>654,12291=>655,20189=>656,12293=>657,12294=>658,12295=>659,12540=>660,8213=>661,8208=>662,65295=>663,65340=>664,12316=>665,65374=>665,8214=>666,65372=>667,8230=>668,8229=>669,65288=>674,65289=>675,12308=>676,12309=>677,65339=>678,65341=>679,65371=>680,65373=>681,12296=>682,12297=>683,12298=>684,12299=>685,12300=>686,12301=>687,12302=>688,12303=>689,12304=>690,12305=>691,65291=>692,8722=>693,65293=>693,177=>694,215=>695,247=>696,65309=>697,8800=>698,65308=>699,65310=>700,8806=>701,8807=>702,8734=>703,8756=>704,9794=>705,9792=>706,176=>707,8242=>708,8243=>709,8451=>710,65509=>711,65284=>712,65504=>713,65505=>714,65285=>715,65283=>716,65286=>717,65290=>718,65312=>719,167=>720,9734=>721,9733=>722,9675=>723,9679=>724,9678=>725,9671=>726,9670=>727,9633=>728,9632=>729,9651=>730,9650=>731,9661=>732,9660=>733,8251=>734,12306=>735,8594=>736,8592=>737,8593=>738,8595=>739,12307=>740,8712=>741,8715=>742,8838=>743,8839=>744,8834=>745,8835=>746,8746=>747,8745=>748,8743=>749,8744=>750,65506=>751,8658=>752,8660=>753,8704=>754,8707=>755,8736=>756,8869=>757,8978=>758,8706=>759,8711=>760,8801=>761,8786=>762,8810=>763,8811=>764,8730=>765,8765=>766,8733=>767,8757=>768,8747=>769,8748=>770,8491=>771,8240=>772,9839=>773,9837=>774,9834=>775,8224=>776,8225=>777,182=>778,9711=>779,65296=>780,65297=>781,65298=>782,65299=>783,65300=>784,65301=>785,65302=>786,65303=>787,65304=>788,65305=>789,65313=>790,65314=>791,65315=>792,65316=>793,65317=>794,65318=>795,65319=>796,65320=>797,65321=>798,65322=>799,65323=>800,65324=>801,65325=>802,65326=>803,65327=>804,65328=>805,65329=>806,65330=>807,65331=>808,65332=>809,65333=>810,65334=>811,65335=>812,65336=>813,65337=>814,65338=>815,65345=>816,65346=>817,65347=>818,65348=>819,65349=>820,65350=>821,65351=>822,65352=>823,65353=>824,65354=>825,65355=>826,65356=>827,65357=>828,65358=>829,65359=>830,65360=>831,65361=>832,65362=>833,65363=>834,65364=>835,65365=>836,65366=>837,65367=>838,65368=>839,65369=>840,65370=>841,12353=>842,12354=>843,12355=>844,12356=>845,12357=>846,12358=>847,12359=>848,12360=>849,12361=>850,12362=>851,12363=>852,12364=>853,12365=>854,12366=>855,12367=>856,12368=>857,12369=>858,12370=>859,12371=>860,12372=>861,12373=>862,12374=>863,12375=>864,12376=>865,12377=>866,12378=>867,12379=>868,12380=>869,12381=>870,12382=>871,12383=>872,12384=>873,12385=>874,12386=>875,12387=>876,12388=>877,12389=>878,12390=>879,12391=>880,12392=>881,12393=>882,12394=>883,12395=>884,12396=>885,12397=>886,12398=>887,12399=>888,12400=>889,12401=>890,12402=>891,12403=>892,12404=>893,12405=>894,12406=>895,12407=>896,12408=>897,12409=>898,12410=>899,12411=>900,12412=>901,12413=>902,12414=>903,12415=>904,12416=>905,12417=>906,12418=>907,12419=>908,12420=>909,12421=>910,12422=>911,12423=>912,12424=>913,12425=>914,12426=>915,12427=>916,12428=>917,12429=>918,12430=>919,12431=>920,12432=>921,12433=>922,12434=>923,12435=>924,12449=>925,12450=>926,12451=>927,12452=>928,12453=>929,12454=>930,12455=>931,12456=>932,12457=>933,12458=>934,12459=>935,12460=>936,12461=>937,12462=>938,12463=>939,12464=>940,12465=>941,12466=>942,12467=>943,12468=>944,12469=>945,12470=>946,12471=>947,12472=>948,12473=>949,12474=>950,12475=>951,12476=>952,12477=>953,12478=>954,12479=>955,12480=>956,12481=>957,12482=>958,12483=>959,12484=>960,12485=>961,12486=>962,12487=>963,12488=>964,12489=>965,12490=>966,12491=>967,12492=>968,12493=>969,12494=>970,12495=>971,12496=>972,12497=>973,12498=>974,12499=>975,12500=>976,12501=>977,12502=>978,12503=>979,12504=>980,12505=>981,12506=>982,12507=>983,12508=>984,12509=>985,12510=>986,12511=>987,12512=>988,12513=>989,12514=>990,12515=>991,12516=>992,12517=>993,12518=>994,12519=>995,12520=>996,12521=>997,12522=>998,12523=>999,12524=>1000,12525=>1001,12526=>1002,12527=>1003,12528=>1004,12529=>1005,12530=>1006,12531=>1007,12532=>1008,12533=>1009,12534=>1010,913=>1011,914=>1012,915=>1013,916=>1014,917=>1015,918=>1016,919=>1017,920=>1018,921=>1019,922=>1020,923=>1021,924=>1022,925=>1023,926=>1024,927=>1025,928=>1026,929=>1027,931=>1028,932=>1029,933=>1030,934=>1031,935=>1032,936=>1033,937=>1034,945=>1035,946=>1036,947=>1037,948=>1038,949=>1039,950=>1040,951=>1041,952=>1042,953=>1043,954=>1044,955=>1045,956=>1046,957=>1047,958=>1048,959=>1049,960=>1050,961=>1051,963=>1052,964=>1053,965=>1054,966=>1055,967=>1056,968=>1057,969=>1058,1040=>1059,1041=>1060,1042=>1061,1043=>1062,1044=>1063,1045=>1064,1025=>1065,1046=>1066,1047=>1067,1048=>1068,1049=>1069,1050=>1070,1051=>1071,1052=>1072,1053=>1073,1054=>1074,1055=>1075,1056=>1076,1057=>1077,1058=>1078,1059=>1079,1060=>1080,1061=>1081,1062=>1082,1063=>1083,1064=>1084,1065=>1085,1066=>1086,1067=>1087,1068=>1088,1069=>1089,1070=>1090,1071=>1091,1072=>1092,1073=>1093,1074=>1094,1075=>1095,1076=>1096,1077=>1097,1105=>1098,1078=>1099,1079=>1100,1080=>1101,1081=>1102,1082=>1103,1083=>1104,1084=>1105,1085=>1106,1086=>1107,1087=>1108,1088=>1109,1089=>1110,1090=>1111,1091=>1112,1092=>1113,1093=>1114,1094=>1115,1095=>1116,1096=>1117,1097=>1118,1098=>1119,1099=>1120,1100=>1121,1101=>1122,1102=>1123,1103=>1124,20124=>1125,21782=>1126,23043=>1127,38463=>1128,21696=>1129,24859=>1130,25384=>1131,23030=>1132,36898=>1133,33909=>1134,33564=>1135,31312=>1136,24746=>1137,25569=>1138,28197=>1139,26093=>1140,33894=>1141,33446=>1142,39925=>1143,26771=>1144,22311=>1145,26017=>1146,25201=>1147,23451=>1148,22992=>1149,34427=>1150,39156=>1151,32098=>1152,32190=>1153,39822=>1154,25110=>1155,31903=>1156,34999=>1157,23433=>1158,24245=>1159,25353=>1160,26263=>1161,26696=>1162,38343=>1163,38797=>1164,26447=>1165,20197=>1166,20234=>1167,20301=>1168,20381=>1169,20553=>1170,22258=>1171,22839=>1172,22996=>1173,23041=>1174,23561=>1175,24799=>1176,24847=>1177,24944=>1178,26131=>1179,26885=>1180,28858=>1181,30031=>1182,30064=>1183,31227=>1184,32173=>1185,32239=>1186,32963=>1187,33806=>1188,12176=>1189,34915=>1189,35586=>1190,36949=>1191,36986=>1192,21307=>1193,20117=>1194,20133=>1195,22495=>1196,32946=>1197,37057=>1198,30959=>1199,12032=>1200,19968=>1200,22769=>1201,28322=>1202,36920=>1203,31282=>1204,33576=>1205,33419=>1206,39983=>1207,20801=>1208,21360=>1209,21693=>1210,21729=>1211,22240=>1212,23035=>1213,24341=>1214,39154=>1215,28139=>1216,32996=>1217,34093=>1218,38498=>1219,38512=>1220,38560=>1221,38907=>1222,21515=>1223,21491=>1224,23431=>1225,28879=>1226,12155=>1227,32701=>1227,36802=>1228,12204=>1229,38632=>1229,21359=>1230,40284=>1231,31418=>1232,19985=>1233,30867=>1234,12165=>1235,33276=>1235,28198=>1236,22040=>1237,21764=>1238,27421=>1239,34074=>1240,39995=>1241,23013=>1242,21417=>1243,28006=>1244,12128=>1245,29916=>1245,38287=>1246,22082=>1247,20113=>1248,36939=>1249,38642=>1250,33615=>1251,39180=>1252,21473=>1253,21942=>1254,23344=>1255,24433=>1256,26144=>1257,26355=>1258,26628=>1259,27704=>1260,27891=>1261,27945=>1262,29787=>1263,30408=>1264,31310=>1265,38964=>1266,33521=>1267,34907=>1268,35424=>1269,37613=>1270,28082=>1271,30123=>1272,30410=>1273,39365=>1274,24742=>1275,35585=>1276,36234=>1277,38322=>1278,27022=>1279,21421=>1280,20870=>1281,22290=>1282,22576=>1283,22852=>1284,23476=>1285,24310=>1286,24616=>1287,25513=>1288,25588=>1289,27839=>1290,28436=>1291,28814=>1292,28948=>1293,29017=>1294,29141=>1295,29503=>1296,32257=>1297,33398=>1298,33489=>1299,34199=>1300,36960=>1301,37467=>1302,40219=>1303,22633=>1304,26044=>1305,27738=>1306,29989=>1307,20985=>1308,22830=>1309,22885=>1310,24448=>1311,24540=>1312,25276=>1313,26106=>1314,27178=>1315,27431=>1316,27572=>1317,29579=>1318,32705=>1319,35158=>1320,40236=>1321,40206=>1322,12009=>1323,40644=>1323,23713=>1324,27798=>1325,33659=>1326,20740=>1327,23627=>1328,25014=>1329,33222=>1330,26742=>1331,29281=>1332,12036=>1333,20057=>1333,20474=>1334,21368=>1335,24681=>1336,28201=>1337,31311=>1338,12211=>1339,38899=>1339,19979=>1340,21270=>1341,20206=>1342,20309=>1343,20285=>1344,20385=>1345,20339=>1346,21152=>1347,21487=>1348,22025=>1349,22799=>1350,23233=>1351,23478=>1352,23521=>1353,31185=>1354,26247=>1355,26524=>1356,26550=>1357,27468=>1358,27827=>1359,12117=>1360,28779=>1360,29634=>1361,31117=>1362,12146=>1363,31166=>1363,31292=>1364,31623=>1365,33457=>1366,33499=>1367,33540=>1368,33655=>1369,33775=>1370,33747=>1371,34662=>1372,35506=>1373,22057=>1374,36008=>1375,36838=>1376,36942=>1377,38686=>1378,34442=>1379,20420=>1380,23784=>1381,25105=>1382,12123=>1383,29273=>1383,30011=>1384,33253=>1385,33469=>1386,34558=>1387,36032=>1388,38597=>1389,39187=>1390,39381=>1391,20171=>1392,20250=>1393,35299=>1394,22238=>1395,22602=>1396,22730=>1397,24315=>1398,24555=>1399,24618=>1400,24724=>1401,24674=>1402,25040=>1403,25106=>1404,25296=>1405,25913=>1406,39745=>1407,26214=>1408,26800=>1409,28023=>1410,28784=>1411,30028=>1412,30342=>1413,32117=>1414,33445=>1415,34809=>1416,38283=>1417,38542=>1418,12185=>1419,35997=>1419,20977=>1420,21182=>1421,22806=>1422,21683=>1423,23475=>1424,23830=>1425,24936=>1426,27010=>1427,28079=>1428,30861=>1429,33995=>1430,34903=>1431,35442=>1432,37799=>1433,39608=>1434,28012=>1435,39336=>1436,34521=>1437,22435=>1438,26623=>1439,34510=>1440,37390=>1441,21123=>1442,22151=>1443,21508=>1444,24275=>1445,25313=>1446,25785=>1447,26684=>1448,26680=>1449,27579=>1450,29554=>1451,30906=>1452,31339=>1453,35226=>1454,12179=>1455,35282=>1455,36203=>1456,36611=>1457,37101=>1458,38307=>1459,38548=>1460,12208=>1461,38761=>1461,23398=>1462,23731=>1463,27005=>1464,38989=>1465,38990=>1466,25499=>1467,31520=>1468,27179=>1469,27263=>1470,26806=>1471,39949=>1472,28511=>1473,21106=>1474,21917=>1475,24688=>1476,25324=>1477,27963=>1478,28167=>1479,28369=>1480,33883=>1481,35088=>1482,36676=>1483,19988=>1484,39993=>1485,21494=>1486,26907=>1487,27194=>1488,38788=>1489,26666=>1490,20828=>1491,31427=>1492,33970=>1493,37340=>1494,37772=>1495,22107=>1496,40232=>1497,26658=>1498,33541=>1499,33841=>1500,31909=>1501,21000=>1502,33477=>1503,12129=>1504,29926=>1504,20094=>1505,20355=>1506,20896=>1507,23506=>1508,21002=>1509,21208=>1510,21223=>1511,24059=>1512,21914=>1513,22570=>1514,23014=>1515,23436=>1516,23448=>1517,23515=>1518,12082=>1519,24178=>1519,24185=>1520,24739=>1521,24863=>1522,24931=>1523,25022=>1524,25563=>1525,25954=>1526,26577=>1527,26707=>1528,26874=>1529,27454=>1530,27475=>1531,27735=>1532,28450=>1533,28567=>1534,28485=>1535,29872=>1536,12130=>1537,29976=>1537,30435=>1538,30475=>1539,31487=>1540,31649=>1541,31777=>1542,32233=>1543,12152=>1544,32566=>1544,32752=>1545,32925=>1546,33382=>1547,33694=>1548,35251=>1549,35532=>1550,36011=>1551,36996=>1552,37969=>1553,38291=>1554,38289=>1555,38306=>1556,38501=>1557,38867=>1558,39208=>1559,33304=>1560,20024=>1561,21547=>1562,23736=>1563,24012=>1564,29609=>1565,30284=>1566,30524=>1567,23721=>1568,32747=>1569,36107=>1570,38593=>1571,38929=>1572,38996=>1573,39000=>1574,20225=>1575,20238=>1576,21361=>1577,21916=>1578,22120=>1579,22522=>1580,22855=>1581,23305=>1582,23492=>1583,23696=>1584,24076=>1585,24190=>1586,24524=>1587,25582=>1588,26426=>1589,26071=>1590,26082=>1591,26399=>1592,26827=>1593,26820=>1594,27231=>1595,24112=>1596,27589=>1597,27671=>1598,27773=>1599,30079=>1600,31048=>1601,23395=>1602,31232=>1603,32000=>1604,24509=>1605,35215=>1606,35352=>1607,36020=>1608,36215=>1609,36556=>1610,36637=>1611,39138=>1612,39438=>1613,12004=>1614,12225=>1614,39740=>1614,12018=>1615,20096=>1615,20605=>1616,20736=>1617,22931=>1618,23452=>1619,25135=>1620,25216=>1621,25836=>1622,27450=>1623,29344=>1624,30097=>1625,31047=>1626,32681=>1627,34811=>1628,35516=>1629,35696=>1630,25516=>1631,33738=>1632,38816=>1633,21513=>1634,21507=>1635,21931=>1636,26708=>1637,27224=>1638,35440=>1639,30759=>1640,26485=>1641,12233=>1642,40653=>1642,21364=>1643,23458=>1644,33050=>1645,34384=>1646,36870=>1647,19992=>1648,20037=>1649,20167=>1650,20241=>1651,21450=>1652,21560=>1653,23470=>1654,12088=>1655,24339=>1655,24613=>1656,25937=>1657,26429=>1658,27714=>1659,27762=>1660,27875=>1661,28792=>1662,29699=>1663,31350=>1664,31406=>1665,31496=>1666,32026=>1667,31998=>1668,32102=>1669,26087=>1670,12124=>1671,29275=>1671,21435=>1672,23621=>1673,24040=>1674,25298=>1675,25312=>1676,25369=>1677,28192=>1678,34394=>1679,35377=>1680,36317=>1681,37624=>1682,28417=>1683,31142=>1684,12226=>1685,39770=>1685,20136=>1686,20139=>1687,20140=>1688,20379=>1689,20384=>1690,20689=>1691,20807=>1692,31478=>1693,20849=>1694,20982=>1695,21332=>1696,21281=>1697,21375=>1698,21483=>1699,21932=>1700,22659=>1701,23777=>1702,24375=>1703,24394=>1704,24623=>1705,24656=>1706,24685=>1707,25375=>1708,25945=>1709,27211=>1710,27841=>1711,29378=>1712,29421=>1713,30703=>1714,33016=>1715,33029=>1716,33288=>1717,34126=>1718,37111=>1719,37857=>1720,38911=>1721,39255=>1722,39514=>1723,20208=>1724,20957=>1725,23597=>1726,26241=>1727,26989=>1728,23616=>1729,26354=>1730,26997=>1731,12127=>1732,29577=>1732,26704=>1733,31873=>1734,20677=>1735,21220=>1736,22343=>1737,12081=>1738,24062=>1738,37670=>1739,12100=>1740,26020=>1740,27427=>1741,27453=>1742,29748=>1743,31105=>1744,31165=>1745,31563=>1746,32202=>1747,33465=>1748,33740=>1749,34943=>1750,35167=>1751,35641=>1752,36817=>1753,12198=>1754,37329=>1754,21535=>1755,37504=>1756,20061=>1757,20534=>1758,21477=>1759,21306=>1760,29399=>1761,29590=>1762,30697=>1763,33510=>1764,36527=>1765,39366=>1766,39368=>1767,39378=>1768,20855=>1769,24858=>1770,34398=>1771,21936=>1772,31354=>1773,20598=>1774,23507=>1775,36935=>1776,38533=>1777,20018=>1778,27355=>1779,37351=>1780,23633=>1781,23624=>1782,25496=>1783,31391=>1784,27795=>1785,38772=>1786,36705=>1787,31402=>1788,29066=>1789,38536=>1790,31874=>1791,26647=>1792,32368=>1793,26705=>1794,37740=>1795,21234=>1796,21531=>1797,34219=>1798,35347=>1799,32676=>1800,36557=>1801,37089=>1802,21350=>1803,34952=>1804,31041=>1805,20418=>1806,20670=>1807,21009=>1808,20804=>1809,21843=>1810,22317=>1811,29674=>1812,22411=>1813,22865=>1814,24418=>1815,24452=>1816,24693=>1817,24950=>1818,24935=>1819,25001=>1820,25522=>1821,25658=>1822,25964=>1823,26223=>1824,26690=>1825,28179=>1826,30054=>1827,31293=>1828,31995=>1829,32076=>1830,32153=>1831,32331=>1832,32619=>1833,33550=>1834,33610=>1835,34509=>1836,35336=>1837,35427=>1838,35686=>1839,36605=>1840,38938=>1841,40335=>1842,33464=>1843,36814=>1844,39912=>1845,21127=>1846,25119=>1847,25731=>1848,28608=>1849,38553=>1850,26689=>1851,20625=>1852,12107=>1853,27424=>1853,27770=>1854,28500=>1855,12147=>1856,31348=>1856,32080=>1857,12174=>1858,34880=>1858,35363=>1859,12105=>1860,26376=>1860,20214=>1861,20537=>1862,20518=>1863,20581=>1864,20860=>1865,21048=>1866,21091=>1867,21927=>1868,22287=>1869,22533=>1870,23244=>1871,24314=>1872,25010=>1873,25080=>1874,25331=>1875,25458=>1876,26908=>1877,27177=>1878,29309=>1879,12125=>1880,29356=>1880,29486=>1881,30740=>1882,30831=>1883,32121=>1884,30476=>1885,32937=>1886,12178=>1887,35211=>1887,35609=>1888,36066=>1889,36562=>1890,36963=>1891,37749=>1892,38522=>1893,38997=>1894,39443=>1895,40568=>1896,20803=>1897,21407=>1898,21427=>1899,24187=>1900,24358=>1901,28187=>1902,28304=>1903,12126=>1904,29572=>1904,29694=>1905,32067=>1906,33335=>1907,12180=>1908,35328=>1908,35578=>1909,38480=>1910,20046=>1911,20491=>1912,21476=>1913,21628=>1914,22266=>1915,22993=>1916,23396=>1917,12080=>1918,24049=>1918,24235=>1919,24359=>1920,12094=>1921,25144=>1921,25925=>1922,26543=>1923,28246=>1924,29392=>1925,31946=>1926,34996=>1927,32929=>1928,32993=>1929,33776=>1930,11969=>1931,34382=>1931,35463=>1932,36328=>1933,37431=>1934,38599=>1935,39015=>1936,12238=>1937,40723=>1937,20116=>1938,20114=>1939,20237=>1940,21320=>1941,21577=>1942,21566=>1943,23087=>1944,24460=>1945,24481=>1946,24735=>1947,26791=>1948,27278=>1949,29786=>1950,30849=>1951,35486=>1952,35492=>1953,35703=>1954,37264=>1955,20062=>1956,39881=>1957,20132=>1958,20348=>1959,20399=>1960,20505=>1961,20502=>1962,20809=>1963,20844=>1964,21151=>1965,21177=>1966,21246=>1967,21402=>1968,12061=>1969,21475=>1969,21521=>1970,21518=>1971,21897=>1972,22353=>1973,22434=>1974,22909=>1975,23380=>1976,23389=>1977,23439=>1978,12079=>1979,24037=>1979,24039=>1980,24055=>1981,24184=>1982,24195=>1983,24218=>1984,24247=>1985,24344=>1986,24658=>1987,24908=>1988,25239=>1989,25304=>1990,25511=>1991,25915=>1992,26114=>1993,26179=>1994,26356=>1995,26477=>1996,26657=>1997,26775=>1998,27083=>1999,27743=>2000,27946=>2001,28009=>2002,28207=>2003,28317=>2004,30002=>2005,30343=>2006,30828=>2007,31295=>2008,31968=>2009,32005=>2010,32024=>2011,32094=>2012,32177=>2013,32789=>2014,32771=>2015,32943=>2016,32945=>2017,33108=>2018,33167=>2019,33322=>2020,33618=>2021,12175=>2022,34892=>2022,34913=>2023,35611=>2024,36002=>2025,36092=>2026,37066=>2027,37237=>2028,37489=>2029,30783=>2030,37628=>2031,38308=>2032,38477=>2033,38917=>2034,12217=>2035,39321=>2035,12220=>2036,39640=>2036,40251=>2037,21083=>2038,21163=>2039,21495=>2040,21512=>2041,22741=>2042,25335=>2043,28640=>2044,35946=>2045,36703=>2046,40633=>2047,20811=>2048,21051=>2049,21578=>2050,22269=>2051,31296=>2052,37239=>2053,40288=>2054,12234=>2055,40658=>2055,29508=>2056,28425=>2057,33136=>2058,29969=>2059,24573=>2060,24794=>2061,12219=>2062,39592=>2062,29403=>2063,36796=>2064,27492=>2065,38915=>2066,20170=>2067,22256=>2068,22372=>2069,22718=>2070,23130=>2071,24680=>2072,25031=>2073,26127=>2074,26118=>2075,26681=>2076,26801=>2077,28151=>2078,30165=>2079,32058=>2080,12169=>2081,33390=>2081,39746=>2082,20123=>2083,20304=>2084,21449=>2085,21766=>2086,23919=>2087,24038=>2088,24046=>2089,26619=>2090,27801=>2091,29811=>2092,30722=>2093,35408=>2094,37782=>2095,35039=>2096,22352=>2097,24231=>2098,25387=>2099,20661=>2100,20652=>2101,20877=>2102,26368=>2103,21705=>2104,22622=>2105,22971=>2106,23472=>2107,24425=>2108,25165=>2109,25505=>2110,26685=>2111,27507=>2112,28168=>2113,28797=>2114,37319=>2115,29312=>2116,30741=>2117,30758=>2118,31085=>2119,25998=>2120,32048=>2121,33756=>2122,35009=>2123,36617=>2124,38555=>2125,21092=>2126,22312=>2127,26448=>2128,32618=>2129,36001=>2130,20916=>2131,22338=>2132,38442=>2133,22586=>2134,27018=>2135,32948=>2136,21682=>2137,23822=>2138,22524=>2139,30869=>2140,40442=>2141,20316=>2142,21066=>2143,21643=>2144,25662=>2145,26152=>2146,26388=>2147,26613=>2148,31364=>2149,31574=>2150,32034=>2151,37679=>2152,26716=>2153,39853=>2154,31545=>2155,21273=>2156,20874=>2157,21047=>2158,23519=>2159,25334=>2160,25774=>2161,25830=>2162,26413=>2163,27578=>2164,34217=>2165,38609=>2166,30352=>2167,39894=>2168,25420=>2169,37638=>2170,39851=>2171,12139=>2172,30399=>2172,26194=>2173,19977=>2174,20632=>2175,21442=>2176,12077=>2177,23665=>2177,24808=>2178,25746=>2179,25955=>2180,26719=>2181,29158=>2182,29642=>2183,29987=>2184,31639=>2185,32386=>2186,34453=>2187,35715=>2188,36059=>2189,37240=>2190,39184=>2191,26028=>2192,26283=>2193,27531=>2194,20181=>2195,20180=>2196,20282=>2197,20351=>2198,21050=>2199,21496=>2200,21490=>2201,21987=>2202,22235=>2203,12064=>2204,22763=>2204,22987=>2205,22985=>2206,23039=>2207,12070=>2208,23376=>2208,23629=>2209,24066=>2210,24107=>2211,24535=>2212,24605=>2213,25351=>2214,12096=>2215,25903=>2215,23388=>2216,26031=>2217,26045=>2218,26088=>2219,26525=>2220,12108=>2221,27490=>2221,27515=>2222,12114=>2223,27663=>2223,29509=>2224,31049=>2225,31169=>2226,12151=>2227,31992=>2227,32025=>2228,32043=>2229,32930=>2230,33026=>2231,12164=>2232,33267=>2232,35222=>2233,35422=>2234,35433=>2235,35430=>2236,35468=>2237,35566=>2238,36039=>2239,36060=>2240,38604=>2241,39164=>2242,12013=>2243,27503=>2243,20107=>2244,20284=>2245,20365=>2246,20816=>2247,23383=>2248,23546=>2249,24904=>2250,25345=>2251,26178=>2252,27425=>2253,28363=>2254,27835=>2255,29246=>2256,29885=>2257,30164=>2258,30913=>2259,12144=>2260,31034=>2260,12157=>2261,32780=>2261,12159=>2262,32819=>2262,12163=>2263,33258=>2263,33940=>2264,36766=>2265,27728=>2266,12229=>2267,40575=>2267,24335=>2268,35672=>2269,40235=>2270,31482=>2271,36600=>2272,23437=>2273,38635=>2274,19971=>2275,21489=>2276,22519=>2277,22833=>2278,23241=>2279,23460=>2280,24713=>2281,28287=>2282,28422=>2283,30142=>2284,36074=>2285,23455=>2286,34048=>2287,31712=>2288,20594=>2289,26612=>2290,33437=>2291,23649=>2292,34122=>2293,32286=>2294,33294=>2295,20889=>2296,23556=>2297,25448=>2298,36198=>2299,26012=>2300,29038=>2301,31038=>2302,32023=>2303,32773=>2304,35613=>2305,12190=>2306,36554=>2306,36974=>2307,34503=>2308,37034=>2309,20511=>2310,21242=>2311,23610=>2312,26451=>2313,28796=>2314,29237=>2315,37196=>2316,37320=>2317,37675=>2318,33509=>2319,23490=>2320,24369=>2321,24825=>2322,20027=>2323,21462=>2324,23432=>2325,12095=>2326,25163=>2326,26417=>2327,27530=>2328,29417=>2329,29664=>2330,31278=>2331,33131=>2332,36259=>2333,37202=>2334,12216=>2335,39318=>2335,20754=>2336,21463=>2337,21610=>2338,23551=>2339,25480=>2340,27193=>2341,32172=>2342,38656=>2343,22234=>2344,21454=>2345,21608=>2346,23447=>2347,23601=>2348,24030=>2349,20462=>2350,24833=>2351,25342=>2352,27954=>2353,31168=>2354,31179=>2355,32066=>2356,32333=>2357,32722=>2358,33261=>2359,12168=>2360,33311=>2360,33936=>2361,34886=>2362,35186=>2363,35728=>2364,36468=>2365,36655=>2366,36913=>2367,37195=>2368,37228=>2369,38598=>2370,37276=>2371,20160=>2372,20303=>2373,20805=>2374,12055=>2375,21313=>2375,24467=>2376,25102=>2377,26580=>2378,27713=>2379,28171=>2380,29539=>2381,32294=>2382,37325=>2383,37507=>2384,21460=>2385,22809=>2386,23487=>2387,28113=>2388,31069=>2389,32302=>2390,31899=>2391,22654=>2392,29087=>2393,20986=>2394,34899=>2395,36848=>2396,20426=>2397,23803=>2398,26149=>2399,30636=>2400,31459=>2401,33308=>2402,39423=>2403,20934=>2404,24490=>2405,26092=>2406,26991=>2407,27529=>2408,28147=>2409,28310=>2410,28516=>2411,30462=>2412,32020=>2413,24033=>2414,36981=>2415,37255=>2416,38918=>2417,20966=>2418,21021=>2419,25152=>2420,26257=>2421,26329=>2422,28186=>2423,24246=>2424,32210=>2425,32626=>2426,26360=>2427,34223=>2428,34295=>2429,35576=>2430,21161=>2431,21465=>2432,12069=>2433,22899=>2433,24207=>2434,24464=>2435,24661=>2436,37604=>2437,38500=>2438,20663=>2439,20767=>2440,21213=>2441,21280=>2442,21319=>2443,21484=>2444,21736=>2445,21830=>2446,21809=>2447,22039=>2448,22888=>2449,22974=>2450,23100=>2451,23477=>2452,23558=>2453,12073=>2454,23567=>2454,23569=>2455,23578=>2456,24196=>2457,24202=>2458,24288=>2459,24432=>2460,25215=>2461,25220=>2462,25307=>2463,25484=>2464,25463=>2465,26119=>2466,26124=>2467,26157=>2468,26230=>2469,26494=>2470,26786=>2471,27167=>2472,27189=>2473,27836=>2474,28040=>2475,28169=>2476,28248=>2477,28988=>2478,28966=>2479,29031=>2480,30151=>2481,30465=>2482,30813=>2483,30977=>2484,31077=>2485,31216=>2486,31456=>2487,31505=>2488,31911=>2489,32057=>2490,32918=>2491,33750=>2492,33931=>2493,34121=>2494,34909=>2495,35059=>2496,35359=>2497,35388=>2498,35412=>2499,35443=>2500,35937=>2501,36062=>2502,37284=>2503,37478=>2504,37758=>2505,37912=>2506,38556=>2507,38808=>2508,19978=>2509,19976=>2510,19998=>2511,20055=>2512,20887=>2513,21104=>2514,22478=>2515,22580=>2516,22732=>2517,23330=>2518,24120=>2519,24773=>2520,25854=>2521,26465=>2522,26454=>2523,27972=>2524,29366=>2525,30067=>2526,31331=>2527,33976=>2528,35698=>2529,37304=>2530,37664=>2531,22065=>2532,22516=>2533,39166=>2534,25325=>2535,26893=>2536,27542=>2537,29165=>2538,32340=>2539,32887=>2540,12170=>2541,33394=>2541,35302=>2542,12215=>2543,39135=>2543,34645=>2544,36785=>2545,23611=>2546,20280=>2547,20449=>2548,20405=>2549,21767=>2550,23072=>2551,23517=>2552,23529=>2553,12092=>2554,24515=>2554,24910=>2555,25391=>2556,26032=>2557,26187=>2558,26862=>2559,27035=>2560,28024=>2561,28145=>2562,30003=>2563,30137=>2564,30495=>2565,31070=>2566,31206=>2567,32051=>2568,12162=>2569,33251=>2569,33455=>2570,34218=>2571,35242=>2572,35386=>2573,12189=>2574,36523=>2574,12191=>2575,36763=>2575,36914=>2576,37341=>2577,38663=>2578,12040=>2579,20154=>2579,20161=>2580,20995=>2581,22645=>2582,22764=>2583,23563=>2584,29978=>2585,23613=>2586,33102=>2587,35338=>2588,36805=>2589,38499=>2590,38765=>2591,31525=>2592,35535=>2593,38920=>2594,37218=>2595,22259=>2596,21416=>2597,36887=>2598,21561=>2599,22402=>2600,24101=>2601,25512=>2602,12116=>2603,27700=>2603,28810=>2604,30561=>2605,31883=>2606,32736=>2607,34928=>2608,36930=>2609,37204=>2610,37648=>2611,37656=>2612,38543=>2613,29790=>2614,39620=>2615,23815=>2616,23913=>2617,25968=>2618,26530=>2619,36264=>2620,38619=>2621,25454=>2622,26441=>2623,26905=>2624,33733=>2625,38935=>2626,38592=>2627,35070=>2628,28548=>2629,25722=>2630,12072=>2631,23544=>2631,19990=>2632,28716=>2633,30045=>2634,26159=>2635,20932=>2636,21046=>2637,21218=>2638,22995=>2639,24449=>2640,24615=>2641,25104=>2642,25919=>2643,25972=>2644,26143=>2645,26228=>2646,26866=>2647,26646=>2648,27491=>2649,28165=>2650,29298=>2651,12131=>2652,29983=>2652,30427=>2653,31934=>2654,32854=>2655,22768=>2656,35069=>2657,11972=>2658,35199=>2658,35488=>2659,35475=>2660,35531=>2661,36893=>2662,37266=>2663,11992=>2664,38738=>2664,38745=>2665,12011=>2666,25993=>2666,31246=>2667,33030=>2668,38587=>2669,24109=>2670,24796=>2671,25114=>2672,26021=>2673,26132=>2674,26512=>2675,12143=>2676,30707=>2676,31309=>2677,31821=>2678,32318=>2679,33034=>2680,36012=>2681,12186=>2682,36196=>2682,36321=>2683,36447=>2684,30889=>2685,20999=>2686,25305=>2687,25509=>2688,25666=>2689,25240=>2690,35373=>2691,31363=>2692,31680=>2693,35500=>2694,38634=>2695,32118=>2696,12166=>2697,33292=>2697,34633=>2698,20185=>2699,20808=>2700,21315=>2701,21344=>2702,23459=>2703,23554=>2704,23574=>2705,24029=>2706,25126=>2707,25159=>2708,25776=>2709,26643=>2710,26676=>2711,27849=>2712,27973=>2713,27927=>2714,26579=>2715,28508=>2716,29006=>2717,29053=>2718,26059=>2719,31359=>2720,31661=>2721,32218=>2722,32330=>2723,32680=>2724,33146=>2725,12167=>2726,33307=>2726,33337=>2727,34214=>2728,35438=>2729,36046=>2730,36341=>2731,36984=>2732,36983=>2733,37549=>2734,37521=>2735,38275=>2736,39854=>2737,21069=>2738,21892=>2739,28472=>2740,28982=>2741,20840=>2742,31109=>2743,32341=>2744,33203=>2745,31950=>2746,22092=>2747,22609=>2748,23720=>2749,25514=>2750,26366=>2751,26365=>2752,26970=>2753,29401=>2754,30095=>2755,30094=>2756,30990=>2757,31062=>2758,31199=>2759,31895=>2760,32032=>2761,32068=>2762,34311=>2763,35380=>2764,38459=>2765,36961=>2766,12239=>2767,40736=>2767,20711=>2768,21109=>2769,21452=>2770,21474=>2771,20489=>2772,21930=>2773,22766=>2774,22863=>2775,29245=>2776,23435=>2777,23652=>2778,21277=>2779,24803=>2780,24819=>2781,25436=>2782,25475=>2783,25407=>2784,25531=>2785,25805=>2786,26089=>2787,26361=>2788,24035=>2789,27085=>2790,27133=>2791,28437=>2792,29157=>2793,20105=>2794,30185=>2795,30456=>2796,31379=>2797,31967=>2798,32207=>2799,32156=>2800,32865=>2801,33609=>2802,33624=>2803,33900=>2804,33980=>2805,34299=>2806,35013=>2807,12187=>2808,36208=>2808,36865=>2809,36973=>2810,37783=>2811,38684=>2812,39442=>2813,20687=>2814,22679=>2815,24974=>2816,33235=>2817,34101=>2818,36104=>2819,36896=>2820,20419=>2821,20596=>2822,21063=>2823,21363=>2824,24687=>2825,25417=>2826,26463=>2827,28204=>2828,12188=>2829,36275=>2829,36895=>2830,20439=>2831,23646=>2832,36042=>2833,26063=>2834,32154=>2835,21330=>2836,34966=>2837,20854=>2838,25539=>2839,23384=>2840,23403=>2841,23562=>2842,25613=>2843,26449=>2844,36956=>2845,20182=>2846,22810=>2847,22826=>2848,27760=>2849,35409=>2850,21822=>2851,22549=>2852,22949=>2853,24816=>2854,25171=>2855,26561=>2856,33333=>2857,26965=>2858,38464=>2859,39364=>2860,39464=>2861,20307=>2862,22534=>2863,23550=>2864,32784=>2865,23729=>2866,24111=>2867,24453=>2868,24608=>2869,24907=>2870,25140=>2871,26367=>2872,27888=>2873,28382=>2874,32974=>2875,33151=>2876,33492=>2877,34955=>2878,36024=>2879,36864=>2880,36910=>2881,38538=>2882,40667=>2883,39899=>2884,20195=>2885,21488=>2886,12068=>2887,22823=>2887,31532=>2888,37261=>2889,38988=>2890,40441=>2891,28381=>2892,28711=>2893,21331=>2894,21828=>2895,23429=>2896,25176=>2897,25246=>2898,25299=>2899,27810=>2900,28655=>2901,29730=>2902,35351=>2903,37944=>2904,28609=>2905,35582=>2906,33592=>2907,20967=>2908,34552=>2909,21482=>2910,21481=>2911,20294=>2912,36948=>2913,12192=>2914,36784=>2914,22890=>2915,33073=>2916,24061=>2917,31466=>2918,36799=>2919,26842=>2920,12181=>2921,35895=>2921,29432=>2922,40008=>2923,27197=>2924,35504=>2925,20025=>2926,21336=>2927,22022=>2928,22374=>2929,25285=>2930,25506=>2931,26086=>2932,27470=>2933,28129=>2934,28251=>2935,28845=>2936,30701=>2937,31471=>2938,31658=>2939,32187=>2940,32829=>2941,32966=>2942,34507=>2943,35477=>2944,37723=>2945,22243=>2946,22727=>2947,24382=>2948,26029=>2949,26262=>2950,27264=>2951,27573=>2952,30007=>2953,35527=>2954,20516=>2955,30693=>2956,22320=>2957,24347=>2958,24677=>2959,26234=>2960,27744=>2961,30196=>2962,31258=>2963,32622=>2964,33268=>2965,34584=>2966,36933=>2967,39347=>2968,31689=>2969,30044=>2970,12149=>2971,31481=>2971,31569=>2972,33988=>2973,36880=>2974,31209=>2975,31378=>2976,33590=>2977,23265=>2978,30528=>2979,20013=>2980,20210=>2981,23449=>2982,24544=>2983,25277=>2984,26172=>2985,26609=>2986,27880=>2987,12173=>2988,34411=>2988,34935=>2989,35387=>2990,37198=>2991,37619=>2992,39376=>2993,27159=>2994,28710=>2995,29482=>2996,33511=>2997,33879=>2998,36015=>2999,19969=>3000,20806=>3001,20939=>3002,21899=>3003,23541=>3004,24086=>3005,24115=>3006,24193=>3007,24340=>3008,24373=>3009,24427=>3010,24500=>3011,25074=>3012,25361=>3013,26274=>3014,26397=>3015,28526=>3016,29266=>3017,30010=>3018,30522=>3019,32884=>3020,33081=>3021,33144=>3022,34678=>3023,35519=>3024,35548=>3025,36229=>3026,36339=>3027,37530=>3028,11985=>3029,12199=>3029,38263=>3029,38914=>3030,12227=>3031,40165=>3031,21189=>3032,25431=>3033,30452=>3034,26389=>3035,27784=>3036,29645=>3037,36035=>3038,37806=>3039,38515=>3040,27941=>3041,22684=>3042,26894=>3043,27084=>3044,36861=>3045,37786=>3046,30171=>3047,36890=>3048,22618=>3049,26626=>3050,25524=>3051,27131=>3052,20291=>3053,28460=>3054,26584=>3055,36795=>3056,34086=>3057,32180=>3058,37716=>3059,26943=>3060,28528=>3061,22378=>3062,22775=>3063,23340=>3064,32044=>3065,12118=>3066,29226=>3066,21514=>3067,37347=>3068,40372=>3069,20141=>3070,20302=>3071,20572=>3072,20597=>3073,21059=>3074,35998=>3075,21576=>3076,22564=>3077,23450=>3078,24093=>3079,24213=>3080,24237=>3081,24311=>3082,24351=>3083,24716=>3084,25269=>3085,25402=>3086,25552=>3087,26799=>3088,27712=>3089,30855=>3090,31118=>3091,31243=>3092,32224=>3093,33351=>3094,35330=>3095,35558=>3096,36420=>3097,36883=>3098,37048=>3099,37165=>3100,37336=>3101,12237=>3102,40718=>3102,27877=>3103,25688=>3104,25826=>3105,25973=>3106,28404=>3107,30340=>3108,31515=>3109,36969=>3110,37841=>3111,28346=>3112,21746=>3113,24505=>3114,25764=>3115,36685=>3116,36845=>3117,37444=>3118,20856=>3119,22635=>3120,22825=>3121,23637=>3122,24215=>3123,28155=>3124,32399=>3125,29980=>3126,36028=>3127,36578=>3128,39003=>3129,28857=>3130,20253=>3131,27583=>3132,28593=>3133,12133=>3134,30000=>3134,38651=>3135,20814=>3136,21520=>3137,22581=>3138,22615=>3139,22956=>3140,23648=>3141,24466=>3142,12099=>3143,26007=>3143,26460=>3144,28193=>3145,30331=>3146,33759=>3147,36077=>3148,36884=>3149,37117=>3150,37709=>3151,30757=>3152,30778=>3153,21162=>3154,24230=>3155,12063=>3156,22303=>3156,22900=>3157,24594=>3158,20498=>3159,20826=>3160,20908=>3161,20941=>3162,12049=>3163,20992=>3163,21776=>3164,22612=>3165,22616=>3166,22871=>3167,23445=>3168,23798=>3169,23947=>3170,24764=>3171,25237=>3172,25645=>3173,26481=>3174,26691=>3175,26812=>3176,26847=>3177,30423=>3178,28120=>3179,28271=>3180,28059=>3181,28783=>3182,29128=>3183,24403=>3184,30168=>3185,31095=>3186,31561=>3187,31572=>3188,31570=>3189,31958=>3190,32113=>3191,21040=>3192,33891=>3193,34153=>3194,34276=>3195,35342=>3196,35588=>3197,12182=>3198,35910=>3198,36367=>3199,36867=>3200,36879=>3201,37913=>3202,38518=>3203,38957=>3204,39472=>3205,38360=>3206,20685=>3207,21205=>3208,21516=>3209,22530=>3210,23566=>3211,24999=>3212,25758=>3213,27934=>3214,30643=>3215,31461=>3216,33012=>3217,33796=>3218,36947=>3219,37509=>3220,23776=>3221,40199=>3222,21311=>3223,24471=>3224,24499=>3225,28060=>3226,29305=>3227,30563=>3228,31167=>3229,31716=>3230,27602=>3231,29420=>3232,35501=>3233,26627=>3234,27233=>3235,20984=>3236,31361=>3237,26932=>3238,23626=>3239,40182=>3240,33515=>3241,23493=>3242,12195=>3243,37193=>3243,28702=>3244,22136=>3245,23663=>3246,24775=>3247,25958=>3248,27788=>3249,35930=>3250,36929=>3251,38931=>3252,21585=>3253,26311=>3254,37389=>3255,22856=>3256,37027=>3257,20869=>3258,20045=>3259,20970=>3260,34201=>3261,35598=>3262,28760=>3263,25466=>3264,37707=>3265,26978=>3266,39348=>3267,32260=>3268,30071=>3269,21335=>3270,26976=>3271,36575=>3272,38627=>3273,27741=>3274,12038=>3275,20108=>3275,23612=>3276,24336=>3277,36841=>3278,21250=>3279,36049=>3280,12161=>3281,32905=>3281,34425=>3282,24319=>3283,12103=>3284,26085=>3284,20083=>3285,12042=>3286,20837=>3286,22914=>3287,23615=>3288,38894=>3289,20219=>3290,22922=>3291,24525=>3292,35469=>3293,28641=>3294,31152=>3295,31074=>3296,23527=>3297,33905=>3298,29483=>3299,29105=>3300,24180=>3301,24565=>3302,25467=>3303,25754=>3304,29123=>3305,31896=>3306,20035=>3307,24316=>3308,20043=>3309,22492=>3310,22178=>3311,24745=>3312,28611=>3313,32013=>3314,33021=>3315,33075=>3316,33215=>3317,36786=>3318,35223=>3319,34468=>3320,24052=>3321,25226=>3322,25773=>3323,35207=>3324,26487=>3325,27874=>3326,27966=>3327,29750=>3328,30772=>3329,23110=>3330,32629=>3331,33453=>3332,12218=>3333,39340=>3333,20467=>3334,24259=>3335,25309=>3336,25490=>3337,25943=>3338,26479=>3339,30403=>3340,29260=>3341,32972=>3342,32954=>3343,36649=>3344,37197=>3345,20493=>3346,22521=>3347,23186=>3348,26757=>3349,26995=>3350,29028=>3351,29437=>3352,36023=>3353,22770=>3354,36064=>3355,38506=>3356,36889=>3357,34687=>3358,31204=>3359,30695=>3360,33833=>3361,20271=>3362,21093=>3363,21338=>3364,25293=>3365,26575=>3366,27850=>3367,12137=>3368,30333=>3368,31636=>3369,31893=>3370,33334=>3371,34180=>3372,36843=>3373,26333=>3374,28448=>3375,29190=>3376,32283=>3377,33707=>3378,39361=>3379,12008=>3380,40614=>3380,20989=>3381,31665=>3382,30834=>3383,31672=>3384,32903=>3385,31560=>3386,27368=>3387,24161=>3388,32908=>3389,30033=>3390,30048=>3391,12043=>3392,20843=>3392,37474=>3393,28300=>3394,30330=>3395,37271=>3396,39658=>3397,20240=>3398,32624=>3399,25244=>3400,31567=>3401,38309=>3402,40169=>3403,22138=>3404,22617=>3405,34532=>3406,38588=>3407,20276=>3408,21028=>3409,21322=>3410,21453=>3411,21467=>3412,24070=>3413,25644=>3414,26001=>3415,26495=>3416,27710=>3417,27726=>3418,29256=>3419,29359=>3420,29677=>3421,30036=>3422,32321=>3423,33324=>3424,34281=>3425,36009=>3426,31684=>3427,12196=>3428,37318=>3428,29033=>3429,38930=>3430,39151=>3431,25405=>3432,26217=>3433,30058=>3434,30436=>3435,30928=>3436,34115=>3437,34542=>3438,21290=>3439,21329=>3440,21542=>3441,22915=>3442,24199=>3443,24444=>3444,24754=>3445,25161=>3446,25209=>3447,25259=>3448,26000=>3449,12112=>3450,27604=>3450,27852=>3451,30130=>3452,12138=>3453,30382=>3453,30865=>3454,31192=>3455,32203=>3456,32631=>3457,32933=>3458,34987=>3459,35513=>3460,36027=>3461,36991=>3462,12206=>3463,38750=>3463,12214=>3464,39131=>3464,27147=>3465,31800=>3466,20633=>3467,23614=>3468,24494=>3469,26503=>3470,27608=>3471,29749=>3472,30473=>3473,32654=>3474,12240=>3475,40763=>3475,26570=>3476,31255=>3477,21305=>3478,12134=>3479,30091=>3479,39661=>3480,24422=>3481,33181=>3482,33777=>3483,32920=>3484,24380=>3485,24517=>3486,30050=>3487,31558=>3488,36924=>3489,26727=>3490,23019=>3491,23195=>3492,32016=>3493,30334=>3494,35628=>3495,20469=>3496,24426=>3497,27161=>3498,27703=>3499,28418=>3500,29922=>3501,31080=>3502,34920=>3503,35413=>3504,35961=>3505,24287=>3506,25551=>3507,30149=>3508,31186=>3509,33495=>3510,37672=>3511,37618=>3512,33948=>3513,34541=>3514,39981=>3515,21697=>3516,24428=>3517,25996=>3518,27996=>3519,28693=>3520,36007=>3521,36051=>3522,38971=>3523,25935=>3524,29942=>3525,19981=>3526,20184=>3527,22496=>3528,22827=>3529,23142=>3530,23500=>3531,20904=>3532,24067=>3533,24220=>3534,24598=>3535,25206=>3536,25975=>3537,26023=>3538,26222=>3539,28014=>3540,12119=>3541,29238=>3541,31526=>3542,33104=>3543,33178=>3544,33433=>3545,35676=>3546,36000=>3547,36070=>3548,36212=>3549,12201=>3550,38428=>3550,38468=>3551,20398=>3552,25771=>3553,27494=>3554,33310=>3555,33889=>3556,34154=>3557,37096=>3558,23553=>3559,26963=>3560,12213=>3561,39080=>3561,33914=>3562,34135=>3563,20239=>3564,21103=>3565,24489=>3566,24133=>3567,26381=>3568,31119=>3569,33145=>3570,35079=>3571,35206=>3572,28149=>3573,24343=>3574,25173=>3575,27832=>3576,20175=>3577,29289=>3578,39826=>3579,20998=>3580,21563=>3581,22132=>3582,22707=>3583,24996=>3584,25198=>3585,28954=>3586,22894=>3587,31881=>3588,31966=>3589,32027=>3590,38640=>3591,12098=>3592,25991=>3592,32862=>3593,19993=>3594,20341=>3595,20853=>3596,22592=>3597,24163=>3598,24179=>3599,24330=>3600,26564=>3601,20006=>3602,34109=>3603,38281=>3604,38491=>3605,12150=>3606,31859=>3606,12212=>3607,38913=>3607,20731=>3608,22721=>3609,30294=>3610,30887=>3611,21029=>3612,30629=>3613,34065=>3614,31622=>3615,20559=>3616,22793=>3617,12122=>3618,29255=>3618,31687=>3619,32232=>3620,36794=>3621,36820=>3622,36941=>3623,20415=>3624,21193=>3625,23081=>3626,24321=>3627,38829=>3628,20445=>3629,33303=>3630,37610=>3631,22275=>3632,25429=>3633,27497=>3634,29995=>3635,35036=>3636,36628=>3637,31298=>3638,21215=>3639,22675=>3640,24917=>3641,25098=>3642,26286=>3643,11935=>3644,27597=>3644,31807=>3645,33769=>3646,20515=>3647,20472=>3648,21253=>3649,21574=>3650,22577=>3651,22857=>3652,23453=>3653,23792=>3654,23791=>3655,23849=>3656,24214=>3657,25265=>3658,25447=>3659,25918=>3660,12101=>3661,26041=>3661,26379=>3662,27861=>3663,27873=>3664,28921=>3665,30770=>3666,32299=>3667,32990=>3668,33459=>3669,33804=>3670,34028=>3671,34562=>3672,35090=>3673,35370=>3674,35914=>3675,37030=>3676,37586=>3677,39165=>3678,40179=>3679,40300=>3680,20047=>3681,20129=>3682,20621=>3683,21078=>3684,22346=>3685,22952=>3686,24125=>3687,24536=>3688,24537=>3689,25151=>3690,26292=>3691,26395=>3692,26576=>3693,26834=>3694,20882=>3695,32033=>3696,32938=>3697,33192=>3698,35584=>3699,35980=>3700,36031=>3701,37502=>3702,38450=>3703,21536=>3704,38956=>3705,21271=>3706,20693=>3707,12056=>3708,21340=>3708,22696=>3709,25778=>3710,26420=>3711,29287=>3712,30566=>3713,31302=>3714,37350=>3715,21187=>3716,27809=>3717,27526=>3718,22528=>3719,24140=>3720,22868=>3721,26412=>3722,32763=>3723,20961=>3724,30406=>3725,25705=>3726,30952=>3727,39764=>3728,12231=>3729,40635=>3729,22475=>3730,22969=>3731,26151=>3732,26522=>3733,27598=>3734,21737=>3735,27097=>3736,24149=>3737,33180=>3738,26517=>3739,39850=>3740,26622=>3741,40018=>3742,26717=>3743,20134=>3744,20451=>3745,12060=>3746,21448=>3746,25273=>3747,26411=>3748,27819=>3749,36804=>3750,20397=>3751,32365=>3752,40639=>3753,19975=>3754,24930=>3755,28288=>3756,28459=>3757,34067=>3758,21619=>3759,26410=>3760,39749=>3761,11922=>3762,24051=>3762,31637=>3763,23724=>3764,23494=>3765,34588=>3766,28234=>3767,34001=>3768,31252=>3769,33032=>3770,22937=>3771,31885=>3772,11936=>3773,27665=>3773,30496=>3774,21209=>3775,22818=>3776,28961=>3777,29279=>3778,12141=>3779,30683=>3779,38695=>3780,40289=>3781,26891=>3782,23167=>3783,23064=>3784,20901=>3785,21517=>3786,21629=>3787,26126=>3788,30431=>3789,36855=>3790,37528=>3791,40180=>3792,23018=>3793,29277=>3794,28357=>3795,20813=>3796,26825=>3797,32191=>3798,32236=>3799,12207=>3800,38754=>3800,40634=>3801,25720=>3802,27169=>3803,33538=>3804,22916=>3805,23391=>3806,12113=>3807,27611=>3807,29467=>3808,30450=>3809,32178=>3810,32791=>3811,33945=>3812,20786=>3813,12106=>3814,26408=>3814,40665=>3815,12140=>3816,30446=>3816,26466=>3817,21247=>3818,39173=>3819,23588=>3820,25147=>3821,31870=>3822,36016=>3823,21839=>3824,24758=>3825,32011=>3826,12200=>3827,38272=>3827,21249=>3828,20063=>3829,20918=>3830,22812=>3831,29242=>3832,32822=>3833,37326=>3834,24357=>3835,12142=>3836,30690=>3836,21380=>3837,24441=>3838,32004=>3839,34220=>3840,35379=>3841,36493=>3842,38742=>3843,26611=>3844,34222=>3845,37971=>3846,24841=>3847,24840=>3848,27833=>3849,30290=>3850,35565=>3851,36664=>3852,21807=>3853,20305=>3854,20778=>3855,21191=>3856,21451=>3857,23461=>3858,24189=>3859,24736=>3860,24962=>3861,25558=>3862,26377=>3863,26586=>3864,28263=>3865,28044=>3866,29494=>3867,29495=>3868,30001=>3869,31056=>3870,35029=>3871,35480=>3872,36938=>3873,12194=>3874,37009=>3874,37109=>3875,38596=>3876,34701=>3877,12067=>3878,22805=>3878,20104=>3879,20313=>3880,19982=>3881,35465=>3882,36671=>3883,38928=>3884,20653=>3885,24188=>3886,22934=>3887,23481=>3888,24248=>3889,25562=>3890,25594=>3891,25793=>3892,26332=>3893,26954=>3894,27096=>3895,27915=>3896,28342=>3897,29076=>3898,12132=>3899,29992=>3899,31407=>3900,12154=>3901,32650=>3901,32768=>3902,33865=>3903,33993=>3904,35201=>3905,35617=>3906,36362=>3907,36965=>3908,38525=>3909,39178=>3910,24958=>3911,25233=>3912,27442=>3913,27779=>3914,28020=>3915,32716=>3916,32764=>3917,28096=>3918,32645=>3919,34746=>3920,35064=>3921,26469=>3922,33713=>3923,38972=>3924,38647=>3925,27931=>3926,32097=>3927,33853=>3928,37226=>3929,20081=>3930,21365=>3931,23888=>3932,27396=>3933,28651=>3934,34253=>3935,34349=>3936,35239=>3937,21033=>3938,21519=>3939,23653=>3940,26446=>3941,26792=>3942,29702=>3943,29827=>3944,30178=>3945,35023=>3946,35041=>3947,12197=>3948,37324=>3948,38626=>3949,38520=>3950,24459=>3951,29575=>3952,12148=>3953,31435=>3953,33870=>3954,25504=>3955,30053=>3956,21129=>3957,27969=>3958,28316=>3959,29705=>3960,30041=>3961,30827=>3962,31890=>3963,38534=>3964,12015=>3965,31452=>3965,12243=>3966,40845=>3966,20406=>3967,24942=>3968,26053=>3969,34396=>3970,20102=>3971,20142=>3972,20698=>3973,20001=>3974,20940=>3975,23534=>3976,26009=>3977,26753=>3978,28092=>3979,29471=>3980,30274=>3981,30637=>3982,31260=>3983,31975=>3984,33391=>3985,35538=>3986,36988=>3987,37327=>3988,38517=>3989,38936=>3990,12050=>3991,21147=>3991,32209=>3992,20523=>3993,21400=>3994,26519=>3995,28107=>3996,29136=>3997,29747=>3998,33256=>3999,36650=>4000,38563=>4001,40023=>4002,40607=>4003,29792=>4004,22593=>4005,28057=>4006,32047=>4007,39006=>4008,20196=>4009,20278=>4010,20363=>4011,20919=>4012,21169=>4013,23994=>4014,24604=>4015,29618=>4016,31036=>4017,33491=>4018,37428=>4019,38583=>4020,38646=>4021,38666=>4022,40599=>4023,40802=>4024,26278=>4025,27508=>4026,21015=>4027,21155=>4028,28872=>4029,35010=>4030,24265=>4031,24651=>4032,24976=>4033,28451=>4034,29001=>4035,31806=>4036,32244=>4037,32879=>4038,34030=>4039,36899=>4040,37676=>4041,21570=>4042,39791=>4043,27347=>4044,28809=>4045,36034=>4046,36335=>4047,38706=>4048,21172=>4049,23105=>4050,24266=>4051,24324=>4052,26391=>4053,27004=>4054,27028=>4055,28010=>4056,28431=>4057,29282=>4058,29436=>4059,31725=>4060,12156=>4061,32769=>4061,32894=>4062,34635=>4063,37070=>4064,20845=>4065,40595=>4066,31108=>4067,32907=>4068,37682=>4069,35542=>4070,20525=>4071,21644=>4072,35441=>4073,27498=>4074,36036=>4075,33031=>4076,24785=>4077,26528=>4078,40434=>4079,20121=>4080,20120=>4081,39952=>4082,35435=>4083,34241=>4084,34152=>4085,26880=>4086,28286=>4087,30871=>4088,33109=>4089,24332=>4090,19984=>4091,19989=>4092,20010=>4093,20017=>4094,12034=>4095,20022=>4095,20028=>4096,12035=>4097,20031=>4097,20034=>4098,20054=>4099,20056=>4100,20098=>4101,12037=>4102,20101=>4102,35947=>4103,20106=>4104,33298=>4105,24333=>4106,20110=>4107,20126=>4108,20127=>4109,12039=>4110,20128=>4110,20130=>4111,20144=>4112,20147=>4113,20150=>4114,20174=>4115,20173=>4116,20164=>4117,20166=>4118,20162=>4119,20183=>4120,20190=>4121,20205=>4122,20191=>4123,20215=>4124,20233=>4125,20314=>4126,20272=>4127,20315=>4128,20317=>4129,20311=>4130,20295=>4131,20342=>4132,20360=>4133,20367=>4134,20376=>4135,20347=>4136,20329=>4137,20336=>4138,20369=>4139,20335=>4140,20358=>4141,20374=>4142,20760=>4143,20436=>4144,20447=>4145,20430=>4146,20440=>4147,20443=>4148,20433=>4149,20442=>4150,20432=>4151,20452=>4152,20453=>4153,20506=>4154,20520=>4155,20500=>4156,20522=>4157,20517=>4158,20485=>4159,20252=>4160,20470=>4161,20513=>4162,20521=>4163,20524=>4164,20478=>4165,20463=>4166,20497=>4167,20486=>4168,20547=>4169,20551=>4170,26371=>4171,20565=>4172,20560=>4173,20552=>4174,20570=>4175,20566=>4176,20588=>4177,20600=>4178,20608=>4179,20634=>4180,20613=>4181,20660=>4182,20658=>4183,20681=>4184,20682=>4185,20659=>4186,20674=>4187,20694=>4188,20702=>4189,20709=>4190,20717=>4191,20707=>4192,20718=>4193,20729=>4194,20725=>4195,20745=>4196,20737=>4197,20738=>4198,20758=>4199,20757=>4200,20756=>4201,20762=>4202,20769=>4203,20794=>4204,20791=>4205,20796=>4206,20795=>4207,12041=>4208,20799=>4208,11918=>4209,20800=>4209,20818=>4210,20812=>4211,20820=>4212,20834=>4213,31480=>4214,20841=>4215,20842=>4216,20846=>4217,20864=>4218,12044=>4219,20866=>4219,22232=>4220,20876=>4221,20873=>4222,20879=>4223,20881=>4224,20883=>4225,20885=>4226,12045=>4227,20886=>4227,20900=>4228,20902=>4229,20898=>4230,20905=>4231,20906=>4232,12046=>4233,20907=>4233,20915=>4234,20913=>4235,20914=>4236,20912=>4237,20917=>4238,20925=>4239,20933=>4240,20937=>4241,20955=>4242,12047=>4243,20960=>4243,34389=>4244,20969=>4245,20973=>4246,20976=>4247,12048=>4248,20981=>4248,20990=>4249,20996=>4250,21003=>4251,21012=>4252,21006=>4253,21031=>4254,21034=>4255,21038=>4256,21043=>4257,21049=>4258,21071=>4259,21060=>4260,21067=>4261,21068=>4262,21086=>4263,21076=>4264,21098=>4265,21108=>4266,21097=>4267,21107=>4268,21119=>4269,21117=>4270,21133=>4271,21140=>4272,21138=>4273,21105=>4274,21128=>4275,21137=>4276,36776=>4277,36775=>4278,21164=>4279,21165=>4280,21180=>4281,21173=>4282,21185=>4283,21197=>4284,21207=>4285,21214=>4286,21219=>4287,21222=>4288,39149=>4289,21216=>4290,21235=>4291,21237=>4292,21240=>4293,12051=>4294,21241=>4294,21254=>4295,21256=>4296,30008=>4297,21261=>4298,21264=>4299,21263=>4300,21269=>4301,12052=>4301,21274=>4302,12053=>4302,21283=>4303,21295=>4304,21297=>4305,21299=>4306,12054=>4307,21304=>4307,21312=>4308,21318=>4309,21317=>4310,19991=>4311,21321=>4312,21325=>4313,20950=>4314,21342=>4315,12057=>4316,21353=>4316,21358=>4317,22808=>4318,21371=>4319,21367=>4320,12058=>4321,21378=>4321,21398=>4322,21408=>4323,21414=>4324,21413=>4325,21422=>4326,21424=>4327,12059=>4328,21430=>4328,21443=>4329,31762=>4330,38617=>4331,21471=>4332,26364=>4333,29166=>4334,21486=>4335,21480=>4336,21485=>4337,21498=>4338,21505=>4339,21565=>4340,21568=>4341,21548=>4342,21549=>4343,21564=>4344,21550=>4345,21558=>4346,21545=>4347,21533=>4348,21582=>4349,21647=>4350,21621=>4351,21646=>4352,21599=>4353,21617=>4354,21623=>4355,21616=>4356,21650=>4357,21627=>4358,21632=>4359,21622=>4360,21636=>4361,21648=>4362,21638=>4363,21703=>4364,21666=>4365,21688=>4366,21669=>4367,21676=>4368,21700=>4369,21704=>4370,21672=>4371,21675=>4372,21698=>4373,21668=>4374,21694=>4375,21692=>4376,21720=>4377,21733=>4378,21734=>4379,21775=>4380,21780=>4381,21757=>4382,21742=>4383,21741=>4384,21754=>4385,21730=>4386,21817=>4387,21824=>4388,21859=>4389,21836=>4390,21806=>4391,21852=>4392,21829=>4393,21846=>4394,21847=>4395,21816=>4396,21811=>4397,21853=>4398,21913=>4399,21888=>4400,21679=>4401,21898=>4402,21919=>4403,21883=>4404,21886=>4405,21912=>4406,21918=>4407,21934=>4408,21884=>4409,21891=>4410,21929=>4411,21895=>4412,21928=>4413,21978=>4414,21957=>4415,21983=>4416,21956=>4417,21980=>4418,21988=>4419,21972=>4420,22036=>4421,22007=>4422,22038=>4423,22014=>4424,22013=>4425,22043=>4426,22009=>4427,22094=>4428,22096=>4429,29151=>4430,22068=>4431,22070=>4432,22066=>4433,22072=>4434,22123=>4435,22116=>4436,22063=>4437,22124=>4438,22122=>4439,22150=>4440,22144=>4441,22154=>4442,22176=>4443,22164=>4444,22159=>4445,22181=>4446,22190=>4447,22198=>4448,22196=>4449,22210=>4450,22204=>4451,22209=>4452,22211=>4453,22208=>4454,22216=>4455,22222=>4456,22225=>4457,22227=>4458,12062=>4459,22231=>4459,22254=>4460,22265=>4461,22272=>4462,22271=>4463,22276=>4464,22281=>4465,22280=>4466,22283=>4467,22285=>4468,22291=>4469,22296=>4470,22294=>4471,21959=>4472,22300=>4473,22310=>4474,22327=>4475,22328=>4476,22350=>4477,22331=>4478,22336=>4479,22351=>4480,22377=>4481,22464=>4482,22408=>4483,22369=>4484,22399=>4485,22409=>4486,22419=>4487,22432=>4488,22451=>4489,22436=>4490,22442=>4491,22448=>4492,22467=>4493,22470=>4494,22484=>4495,22482=>4496,22483=>4497,22538=>4498,22486=>4499,22499=>4500,22539=>4501,22553=>4502,22557=>4503,22642=>4504,22561=>4505,22626=>4506,22603=>4507,22640=>4508,27584=>4509,22610=>4510,22589=>4511,22649=>4512,22661=>4513,22713=>4514,22687=>4515,22699=>4516,22714=>4517,22750=>4518,22715=>4519,22712=>4520,22702=>4521,22725=>4522,22739=>4523,22737=>4524,22743=>4525,22745=>4526,22744=>4527,22757=>4528,22748=>4529,22756=>4530,22751=>4531,22767=>4532,22778=>4533,22777=>4534,22779=>4535,22780=>4536,22781=>4537,22786=>4538,12065=>4538,22794=>4539,12066=>4539,22800=>4540,22811=>4541,26790=>4542,22821=>4543,22828=>4544,22829=>4545,22834=>4546,22840=>4547,22846=>4548,31442=>4549,22869=>4550,22864=>4551,22862=>4552,22874=>4553,22872=>4554,22882=>4555,22880=>4556,22887=>4557,22892=>4558,22889=>4559,22904=>4560,22913=>4561,22941=>4562,20318=>4563,20395=>4564,22947=>4565,22962=>4566,22982=>4567,23016=>4568,23004=>4569,22925=>4570,23001=>4571,23002=>4572,23077=>4573,23071=>4574,23057=>4575,23068=>4576,23049=>4577,23066=>4578,23104=>4579,23148=>4580,23113=>4581,23093=>4582,23094=>4583,23138=>4584,23146=>4585,23194=>4586,23228=>4587,23230=>4588,23243=>4589,23234=>4590,23229=>4591,23267=>4592,23255=>4593,23270=>4594,23273=>4595,23254=>4596,23290=>4597,23291=>4598,23308=>4599,23307=>4600,23318=>4601,23346=>4602,23248=>4603,23338=>4604,23350=>4605,23358=>4606,23363=>4607,23365=>4608,23360=>4609,23377=>4610,23381=>4611,23386=>4612,23387=>4613,23397=>4614,23401=>4615,23408=>4616,23411=>4617,23413=>4618,23416=>4619,25992=>4620,23418=>4621,12071=>4622,23424=>4622,23427=>4623,23462=>4624,23480=>4625,23491=>4626,23495=>4627,23497=>4628,23508=>4629,23504=>4630,23524=>4631,23526=>4632,23522=>4633,23518=>4634,23525=>4635,23531=>4636,23536=>4637,23542=>4638,23539=>4639,23557=>4640,23559=>4641,23560=>4642,23565=>4643,23571=>4644,23584=>4645,11920=>4646,12074=>4646,23586=>4646,23592=>4647,12075=>4648,23608=>4648,23609=>4649,23617=>4650,23622=>4651,23630=>4652,23635=>4653,23632=>4654,23631=>4655,23409=>4656,23660=>4657,12076=>4658,23662=>4658,20066=>4659,23670=>4660,23673=>4661,23692=>4662,23697=>4663,23700=>4664,22939=>4665,23723=>4666,23739=>4667,23734=>4668,23740=>4669,23735=>4670,23749=>4671,23742=>4672,23751=>4673,23769=>4674,23785=>4675,23805=>4676,23802=>4677,23789=>4678,23948=>4679,23786=>4680,23819=>4681,23829=>4682,23831=>4683,23900=>4684,23839=>4685,23835=>4686,23825=>4687,23828=>4688,23842=>4689,23834=>4690,23833=>4691,23832=>4692,23884=>4693,23890=>4694,23886=>4695,23883=>4696,23916=>4697,23923=>4698,23926=>4699,23943=>4700,23940=>4701,23938=>4702,23970=>4703,23965=>4704,23980=>4705,23982=>4706,23997=>4707,23952=>4708,23991=>4709,23996=>4710,24009=>4711,24013=>4712,24019=>4713,24018=>4714,24022=>4715,12078=>4716,24027=>4716,24043=>4717,24050=>4718,24053=>4719,24075=>4720,24090=>4721,24089=>4722,24081=>4723,24091=>4724,24118=>4725,24119=>4726,24132=>4727,24131=>4728,24128=>4729,24142=>4730,24151=>4731,24148=>4732,24159=>4733,24162=>4734,24164=>4735,24135=>4736,24181=>4737,24182=>4738,11923=>4739,12083=>4739,24186=>4739,40636=>4740,12084=>4741,24191=>4741,24224=>4742,24257=>4743,24258=>4744,24264=>4745,24272=>4746,24271=>4747,24278=>4748,24291=>4749,24285=>4750,24282=>4751,24283=>4752,24290=>4753,24289=>4754,24296=>4755,24297=>4756,24300=>4757,24305=>4758,24307=>4759,24304=>4760,12085=>4761,24308=>4761,24312=>4762,12086=>4763,24318=>4763,24323=>4764,24329=>4765,24413=>4766,24412=>4767,12087=>4768,24331=>4768,24337=>4769,24342=>4770,24361=>4771,24365=>4772,24376=>4773,24385=>4774,24392=>4775,24396=>4776,24398=>4777,24367=>4778,11924=>4779,24401=>4779,24406=>4780,24407=>4781,24409=>4782,12090=>4783,24417=>4783,24429=>4784,12091=>4785,24435=>4785,24439=>4786,24451=>4787,24450=>4788,24447=>4789,24458=>4790,24456=>4791,24465=>4792,24455=>4793,24478=>4794,24473=>4795,24472=>4796,24480=>4797,24488=>4798,24493=>4799,24508=>4800,24534=>4801,24571=>4802,24548=>4803,24568=>4804,24561=>4805,24541=>4806,24755=>4807,24575=>4808,24609=>4809,24672=>4810,24601=>4811,24592=>4812,24617=>4813,24590=>4814,24625=>4815,24603=>4816,24597=>4817,24619=>4818,24614=>4819,24591=>4820,24634=>4821,24666=>4822,24641=>4823,24682=>4824,24695=>4825,24671=>4826,24650=>4827,24646=>4828,24653=>4829,24675=>4830,24643=>4831,24676=>4832,24642=>4833,24684=>4834,24683=>4835,24665=>4836,24705=>4837,24717=>4838,24807=>4839,24707=>4840,24730=>4841,24708=>4842,24731=>4843,24726=>4844,24727=>4845,24722=>4846,24743=>4847,24715=>4848,24801=>4849,24760=>4850,24800=>4851,24787=>4852,24756=>4853,24560=>4854,24765=>4855,24774=>4856,24757=>4857,24792=>4858,24909=>4859,24853=>4860,24838=>4861,24822=>4862,24823=>4863,24832=>4864,24820=>4865,24826=>4866,24835=>4867,24865=>4868,24827=>4869,24817=>4870,24845=>4871,24846=>4872,24903=>4873,24894=>4874,24872=>4875,24871=>4876,24906=>4877,24895=>4878,24892=>4879,24876=>4880,24884=>4881,24893=>4882,24898=>4883,24900=>4884,24947=>4885,24951=>4886,24920=>4887,24921=>4888,24922=>4889,24939=>4890,24948=>4891,24943=>4892,24933=>4893,24945=>4894,24927=>4895,24925=>4896,24915=>4897,24949=>4898,24985=>4899,24982=>4900,24967=>4901,25004=>4902,24980=>4903,24986=>4904,24970=>4905,24977=>4906,25003=>4907,25006=>4908,25036=>4909,25034=>4910,25033=>4911,25079=>4912,25032=>4913,25027=>4914,25030=>4915,25018=>4916,25035=>4917,32633=>4918,25037=>4919,25062=>4920,25059=>4921,25078=>4922,25082=>4923,25076=>4924,25087=>4925,25085=>4926,25084=>4927,25086=>4928,25088=>4929,12093=>4930,25096=>4930,25097=>4931,25101=>4932,25100=>4933,25108=>4934,25115=>4935,25118=>4936,25121=>4937,25130=>4938,25134=>4939,25136=>4940,25138=>4941,25139=>4942,25153=>4943,25166=>4944,25182=>4945,25187=>4946,25179=>4947,25184=>4948,25192=>4949,25212=>4950,25218=>4951,25225=>4952,25214=>4953,25234=>4954,25235=>4955,25238=>4956,25300=>4957,25219=>4958,25236=>4959,25303=>4960,25297=>4961,25275=>4962,25295=>4963,25343=>4964,25286=>4965,25812=>4966,25288=>4967,25308=>4968,25292=>4969,25290=>4970,25282=>4971,25287=>4972,25243=>4973,25289=>4974,25356=>4975,25326=>4976,25329=>4977,25383=>4978,25346=>4979,25352=>4980,25327=>4981,25333=>4982,25424=>4983,25406=>4984,25421=>4985,25628=>4986,25423=>4987,25494=>4988,25486=>4989,25472=>4990,25515=>4991,25462=>4992,25507=>4993,25487=>4994,25481=>4995,25503=>4996,25525=>4997,25451=>4998,25449=>4999,25534=>5000,25577=>5001,25536=>5002,25542=>5003,25571=>5004,25545=>5005,25554=>5006,25590=>5007,25540=>5008,25622=>5009,25652=>5010,25606=>5011,25619=>5012,25638=>5013,25654=>5014,25885=>5015,25623=>5016,25640=>5017,25615=>5018,25703=>5019,25711=>5020,25718=>5021,25678=>5022,25898=>5023,25749=>5024,25747=>5025,25765=>5026,25769=>5027,25736=>5028,25788=>5029,25818=>5030,25810=>5031,25797=>5032,25799=>5033,25787=>5034,25816=>5035,25794=>5036,25841=>5037,25831=>5038,33289=>5039,25824=>5040,25825=>5041,25260=>5042,25827=>5043,25839=>5044,25900=>5045,25846=>5046,25844=>5047,25842=>5048,25850=>5049,25856=>5050,25853=>5051,25880=>5052,25884=>5053,25861=>5054,25892=>5055,25891=>5056,25899=>5057,12097=>5058,25908=>5058,11929=>5059,25909=>5059,25911=>5060,25910=>5061,25912=>5062,30027=>5063,25928=>5064,25942=>5065,25941=>5066,25933=>5067,25944=>5068,25950=>5069,25949=>5070,25970=>5071,25976=>5072,25986=>5073,25987=>5074,35722=>5075,26011=>5076,26015=>5077,26027=>5078,26039=>5079,26051=>5080,26054=>5081,26049=>5082,26052=>5083,26060=>5084,26066=>5085,26075=>5086,26073=>5087,12102=>5088,26080=>5088,11931=>5089,26081=>5089,26097=>5090,26482=>5091,26122=>5092,26115=>5093,26107=>5094,26483=>5095,26165=>5096,26166=>5097,26164=>5098,26140=>5099,26191=>5100,26180=>5101,26185=>5102,26177=>5103,26206=>5104,26205=>5105,26212=>5106,26215=>5107,26216=>5108,26207=>5109,26210=>5110,26224=>5111,26243=>5112,26248=>5113,26254=>5114,26249=>5115,26244=>5116,26264=>5117,26269=>5118,26305=>5119,26297=>5120,26313=>5121,26302=>5122,26300=>5123,26308=>5124,26296=>5125,26326=>5126,26330=>5127,26336=>5128,26175=>5129,26342=>5130,26345=>5131,12104=>5132,26352=>5132,26357=>5133,26359=>5134,26383=>5135,26390=>5136,26398=>5137,26406=>5138,26407=>5139,38712=>5140,26414=>5141,26431=>5142,26422=>5143,26433=>5144,26424=>5145,26423=>5146,26438=>5147,26462=>5148,26464=>5149,26457=>5150,26467=>5151,26468=>5152,26505=>5153,26480=>5154,26537=>5155,26492=>5156,26474=>5157,26508=>5158,26507=>5159,26534=>5160,26529=>5161,26501=>5162,26551=>5163,26607=>5164,26548=>5165,26604=>5166,26547=>5167,26601=>5168,26552=>5169,26596=>5170,26590=>5171,26589=>5172,26594=>5173,26606=>5174,26553=>5175,26574=>5176,26566=>5177,26599=>5178,27292=>5179,26654=>5180,26694=>5181,26665=>5182,26688=>5183,26701=>5184,26674=>5185,26702=>5186,26803=>5187,26667=>5188,26713=>5189,26723=>5190,26743=>5191,26751=>5192,26783=>5193,26767=>5194,26797=>5195,26772=>5196,26781=>5197,26779=>5198,26755=>5199,27310=>5200,26809=>5201,26740=>5202,26805=>5203,26784=>5204,26810=>5205,26895=>5206,26765=>5207,26750=>5208,26881=>5209,26826=>5210,26888=>5211,26840=>5212,26914=>5213,26918=>5214,26849=>5215,26892=>5216,26829=>5217,26836=>5218,26855=>5219,26837=>5220,26934=>5221,26898=>5222,26884=>5223,26839=>5224,26851=>5225,26917=>5226,26873=>5227,26848=>5228,26863=>5229,26920=>5230,26922=>5231,26906=>5232,26915=>5233,26913=>5234,26822=>5235,27001=>5236,26999=>5237,26972=>5238,27000=>5239,26987=>5240,26964=>5241,27006=>5242,26990=>5243,26937=>5244,26996=>5245,26941=>5246,26969=>5247,26928=>5248,26977=>5249,26974=>5250,26973=>5251,27009=>5252,26986=>5253,27058=>5254,27054=>5255,27088=>5256,27071=>5257,27073=>5258,27091=>5259,27070=>5260,27086=>5261,23528=>5262,27082=>5263,27101=>5264,27067=>5265,27075=>5266,27047=>5267,27182=>5268,27025=>5269,27040=>5270,27036=>5271,27029=>5272,27060=>5273,27102=>5274,27112=>5275,27138=>5276,27163=>5277,27135=>5278,27402=>5279,27129=>5280,27122=>5281,27111=>5282,27141=>5283,27057=>5284,27166=>5285,27117=>5286,27156=>5287,27115=>5288,27146=>5289,27154=>5290,27329=>5291,27171=>5292,27155=>5293,27204=>5294,27148=>5295,27250=>5296,27190=>5297,27256=>5298,27207=>5299,27234=>5300,27225=>5301,27238=>5302,27208=>5303,27192=>5304,27170=>5305,27280=>5306,27277=>5307,27296=>5308,27268=>5309,27298=>5310,27299=>5311,27287=>5312,34327=>5313,27323=>5314,27331=>5315,27330=>5316,27320=>5317,27315=>5318,27308=>5319,27358=>5320,27345=>5321,27359=>5322,27306=>5323,27354=>5324,27370=>5325,27387=>5326,27397=>5327,34326=>5328,27386=>5329,27410=>5330,27414=>5331,39729=>5332,27423=>5333,27448=>5334,27447=>5335,30428=>5336,27449=>5337,39150=>5338,27463=>5339,27459=>5340,27465=>5341,27472=>5342,27481=>5343,27476=>5344,27483=>5345,27487=>5346,27489=>5347,27512=>5348,12109=>5349,27513=>5349,27519=>5350,27520=>5351,27524=>5352,27523=>5353,27533=>5354,27544=>5355,27541=>5356,27550=>5357,27556=>5358,27562=>5359,27563=>5360,27567=>5361,27570=>5362,27569=>5363,12110=>5364,27571=>5364,27575=>5365,27580=>5366,27590=>5367,12111=>5368,27595=>5368,27603=>5369,27615=>5370,27628=>5371,27627=>5372,27635=>5373,27631=>5374,40638=>5375,27656=>5376,27667=>5377,12115=>5378,27668=>5378,27675=>5379,27684=>5380,27683=>5381,27742=>5382,27733=>5383,27746=>5384,27754=>5385,27778=>5386,27789=>5387,27802=>5388,27777=>5389,27803=>5390,27774=>5391,27752=>5392,27763=>5393,27794=>5394,27792=>5395,27844=>5396,27889=>5397,27859=>5398,27837=>5399,27863=>5400,27845=>5401,27869=>5402,27822=>5403,27825=>5404,27838=>5405,27834=>5406,27867=>5407,27887=>5408,27865=>5409,27882=>5410,27935=>5411,34893=>5412,27958=>5413,27947=>5414,27965=>5415,27960=>5416,27929=>5417,27957=>5418,27955=>5419,27922=>5420,27916=>5421,28003=>5422,28051=>5423,28004=>5424,27994=>5425,28025=>5426,27993=>5427,28046=>5428,28053=>5429,28644=>5430,28037=>5431,28153=>5432,28181=>5433,28170=>5434,28085=>5435,28103=>5436,28134=>5437,28088=>5438,28102=>5439,28140=>5440,28126=>5441,28108=>5442,28136=>5443,28114=>5444,28101=>5445,28154=>5446,28121=>5447,28132=>5448,28117=>5449,28138=>5450,28142=>5451,28205=>5452,28270=>5453,28206=>5454,28185=>5455,28274=>5456,28255=>5457,28222=>5458,28195=>5459,28267=>5460,28203=>5461,28278=>5462,28237=>5463,28191=>5464,28227=>5465,28218=>5466,28238=>5467,28196=>5468,28415=>5469,28189=>5470,28216=>5471,28290=>5472,28330=>5473,28312=>5474,28361=>5475,28343=>5476,28371=>5477,28349=>5478,28335=>5479,28356=>5480,28338=>5481,28372=>5482,28373=>5483,28303=>5484,28325=>5485,28354=>5486,28319=>5487,28481=>5488,28433=>5489,28748=>5490,28396=>5491,28408=>5492,28414=>5493,28479=>5494,28402=>5495,28465=>5496,28399=>5497,28466=>5498,28364=>5499,28478=>5500,28435=>5501,28407=>5502,28550=>5503,28538=>5504,28536=>5505,28545=>5506,28544=>5507,28527=>5508,28507=>5509,28659=>5510,28525=>5511,28546=>5512,28540=>5513,28504=>5514,28558=>5515,28561=>5516,28610=>5517,28518=>5518,28595=>5519,28579=>5520,28577=>5521,28580=>5522,28601=>5523,28614=>5524,28586=>5525,28639=>5526,28629=>5527,28652=>5528,28628=>5529,28632=>5530,28657=>5531,28654=>5532,28635=>5533,28681=>5534,28683=>5535,28666=>5536,28689=>5537,28673=>5538,28687=>5539,28670=>5540,28699=>5541,28698=>5542,28532=>5543,28701=>5544,28696=>5545,28703=>5546,28720=>5547,28734=>5548,28722=>5549,28753=>5550,28771=>5551,28825=>5552,28818=>5553,28847=>5554,28913=>5555,28844=>5556,28856=>5557,28851=>5558,28846=>5559,28895=>5560,28875=>5561,28893=>5562,28889=>5563,28937=>5564,28925=>5565,28956=>5566,28953=>5567,29029=>5568,29013=>5569,29064=>5570,29030=>5571,29026=>5572,29004=>5573,29014=>5574,29036=>5575,29071=>5576,29179=>5577,29060=>5578,29077=>5579,29096=>5580,29100=>5581,29143=>5582,29113=>5583,29118=>5584,29138=>5585,29129=>5586,29140=>5587,29134=>5588,29152=>5589,29164=>5590,29159=>5591,29173=>5592,29180=>5593,29177=>5594,29183=>5595,29197=>5596,29200=>5597,29211=>5598,29224=>5599,29229=>5600,29228=>5601,29232=>5602,29234=>5603,12120=>5604,29243=>5604,29244=>5605,12121=>5606,29247=>5606,29248=>5607,29254=>5608,29259=>5609,29272=>5610,29300=>5611,29310=>5612,29314=>5613,29313=>5614,29319=>5615,29330=>5616,29334=>5617,29346=>5618,29351=>5619,29369=>5620,29362=>5621,29379=>5622,29382=>5623,29380=>5624,29390=>5625,29394=>5626,29410=>5627,29408=>5628,29409=>5629,29433=>5630,29431=>5631,20495=>5632,29463=>5633,29450=>5634,29468=>5635,29462=>5636,29469=>5637,29492=>5638,29487=>5639,29481=>5640,29477=>5641,29502=>5642,29518=>5643,29519=>5644,40664=>5645,29527=>5646,29546=>5647,29544=>5648,29552=>5649,29560=>5650,29557=>5651,29563=>5652,29562=>5653,29640=>5654,29619=>5655,29646=>5656,29627=>5657,29632=>5658,29669=>5659,29678=>5660,29662=>5661,29858=>5662,29701=>5663,29807=>5664,29733=>5665,29688=>5666,29746=>5667,29754=>5668,29781=>5669,29759=>5670,29791=>5671,29785=>5672,29761=>5673,29788=>5674,29801=>5675,29808=>5676,29795=>5677,29802=>5678,29814=>5679,29822=>5680,29835=>5681,29854=>5682,29863=>5683,29898=>5684,29903=>5685,29908=>5686,29681=>5687,29920=>5688,29923=>5689,29927=>5690,29929=>5691,29934=>5692,29938=>5693,29936=>5694,29937=>5695,29944=>5696,29943=>5697,29956=>5698,29955=>5699,29957=>5700,29964=>5701,29966=>5702,29965=>5703,29973=>5704,29971=>5705,29982=>5706,29990=>5707,29996=>5708,30012=>5709,30020=>5710,30029=>5711,30026=>5712,30025=>5713,30043=>5714,30022=>5715,30042=>5716,30057=>5717,30052=>5718,30055=>5719,30059=>5720,30061=>5721,30072=>5722,30070=>5723,30086=>5724,30087=>5725,30068=>5726,30090=>5727,30089=>5728,30082=>5729,30100=>5730,30106=>5731,30109=>5732,30117=>5733,30115=>5734,30146=>5735,30131=>5736,30147=>5737,30133=>5738,30141=>5739,30136=>5740,30140=>5741,30129=>5742,30157=>5743,30154=>5744,30162=>5745,30169=>5746,30179=>5747,30174=>5748,30206=>5749,30207=>5750,30204=>5751,30209=>5752,30192=>5753,30202=>5754,30194=>5755,30195=>5756,30219=>5757,30221=>5758,30217=>5759,30239=>5760,30247=>5761,30240=>5762,30241=>5763,30242=>5764,30244=>5765,30260=>5766,30256=>5767,30267=>5768,30279=>5769,30280=>5770,30278=>5771,30300=>5772,30296=>5773,30305=>5774,30306=>5775,30312=>5776,30313=>5777,30314=>5778,30311=>5779,30316=>5780,30320=>5781,30322=>5782,12136=>5783,30326=>5783,30328=>5784,30332=>5785,30336=>5786,30339=>5787,30344=>5788,30347=>5789,30350=>5790,30358=>5791,30355=>5792,30361=>5793,30362=>5794,30384=>5795,30388=>5796,30392=>5797,30393=>5798,30394=>5799,30402=>5800,30413=>5801,30422=>5802,30418=>5803,30430=>5804,30433=>5805,30437=>5806,30439=>5807,30442=>5808,34351=>5809,30459=>5810,30472=>5811,30471=>5812,30468=>5813,30505=>5814,30500=>5815,30494=>5816,30501=>5817,30502=>5818,30491=>5819,30519=>5820,30520=>5821,30535=>5822,30554=>5823,30568=>5824,30571=>5825,30555=>5826,30565=>5827,30591=>5828,30590=>5829,30585=>5830,30606=>5831,30603=>5832,30609=>5833,30624=>5834,30622=>5835,30640=>5836,30646=>5837,30649=>5838,30655=>5839,30652=>5840,30653=>5841,30651=>5842,30663=>5843,30669=>5844,30679=>5845,30682=>5846,30684=>5847,30691=>5848,30702=>5849,30716=>5850,30732=>5851,30738=>5852,31014=>5853,30752=>5854,31018=>5855,30789=>5856,30862=>5857,30836=>5858,30854=>5859,30844=>5860,30874=>5861,30860=>5862,30883=>5863,30901=>5864,30890=>5865,30895=>5866,30929=>5867,30918=>5868,30923=>5869,30932=>5870,30910=>5871,30908=>5872,30917=>5873,30922=>5874,30956=>5875,30951=>5876,30938=>5877,30973=>5878,30964=>5879,30983=>5880,30994=>5881,30993=>5882,31001=>5883,31020=>5884,31019=>5885,31040=>5886,31072=>5887,31063=>5888,31071=>5889,31066=>5890,31061=>5891,31059=>5892,31098=>5893,31103=>5894,31114=>5895,31133=>5896,31143=>5897,40779=>5898,31146=>5899,31150=>5900,31155=>5901,31161=>5902,31162=>5903,31177=>5904,31189=>5905,31207=>5906,31212=>5907,31201=>5908,31203=>5909,31240=>5910,31245=>5911,31256=>5912,31257=>5913,31264=>5914,31263=>5915,31104=>5916,31281=>5917,31291=>5918,31294=>5919,31287=>5920,31299=>5921,31319=>5922,31305=>5923,31329=>5924,31330=>5925,31337=>5926,40861=>5927,31344=>5928,31353=>5929,31357=>5930,31368=>5931,31383=>5932,31381=>5933,31384=>5934,31382=>5935,31401=>5936,31432=>5937,31408=>5938,31414=>5939,31429=>5940,31428=>5941,31423=>5942,36995=>5943,31431=>5944,31434=>5945,31437=>5946,31439=>5947,31445=>5948,31443=>5949,31449=>5950,31450=>5951,31453=>5952,31457=>5953,31458=>5954,31462=>5955,31469=>5956,31472=>5957,31490=>5958,31503=>5959,31498=>5960,31494=>5961,31539=>5962,31512=>5963,31513=>5964,31518=>5965,31541=>5966,31528=>5967,31542=>5968,31568=>5969,31610=>5970,31492=>5971,31565=>5972,31499=>5973,31564=>5974,31557=>5975,31605=>5976,31589=>5977,31604=>5978,31591=>5979,31600=>5980,31601=>5981,31596=>5982,31598=>5983,31645=>5984,31640=>5985,31647=>5986,31629=>5987,31644=>5988,31642=>5989,31627=>5990,31634=>5991,31631=>5992,31581=>5993,31641=>5994,31691=>5995,31681=>5996,31692=>5997,31695=>5998,31668=>5999,31686=>6000,31709=>6001,31721=>6002,31761=>6003,31764=>6004,31718=>6005,31717=>6006,31840=>6007,31744=>6008,31751=>6009,31763=>6010,31731=>6011,31735=>6012,31767=>6013,31757=>6014,31734=>6015,31779=>6016,31783=>6017,31786=>6018,31775=>6019,31799=>6020,31787=>6021,31805=>6022,31820=>6023,31811=>6024,31828=>6025,31823=>6026,31808=>6027,31824=>6028,31832=>6029,31839=>6030,31844=>6031,31830=>6032,31845=>6033,31852=>6034,31861=>6035,31875=>6036,31888=>6037,31908=>6038,31917=>6039,31906=>6040,31915=>6041,31905=>6042,31912=>6043,31923=>6044,31922=>6045,31921=>6046,31918=>6047,31929=>6048,31933=>6049,31936=>6050,31941=>6051,31938=>6052,31960=>6053,31954=>6054,31964=>6055,31970=>6056,39739=>6057,31983=>6058,31986=>6059,31988=>6060,31990=>6061,31994=>6062,32006=>6063,32002=>6064,32028=>6065,32021=>6066,32010=>6067,32069=>6068,32075=>6069,32046=>6070,32050=>6071,32063=>6072,32053=>6073,32070=>6074,32115=>6075,32086=>6076,32078=>6077,32114=>6078,32104=>6079,32110=>6080,32079=>6081,32099=>6082,32147=>6083,32137=>6084,32091=>6085,32143=>6086,32125=>6087,32155=>6088,32186=>6089,32174=>6090,32163=>6091,32181=>6092,32199=>6093,32189=>6094,32171=>6095,32317=>6096,32162=>6097,32175=>6098,32220=>6099,32184=>6100,32159=>6101,32176=>6102,32216=>6103,32221=>6104,32228=>6105,32222=>6106,32251=>6107,32242=>6108,32225=>6109,32261=>6110,32266=>6111,32291=>6112,32289=>6113,32274=>6114,32305=>6115,32287=>6116,32265=>6117,32267=>6118,32290=>6119,32326=>6120,32358=>6121,32315=>6122,32309=>6123,32313=>6124,32323=>6125,32311=>6126,32306=>6127,32314=>6128,32359=>6129,32349=>6130,32342=>6131,32350=>6132,32345=>6133,32346=>6134,32377=>6135,32362=>6136,32361=>6137,32380=>6138,32379=>6139,32387=>6140,32213=>6141,32381=>6142,36782=>6143,32383=>6144,32392=>6145,32393=>6146,32396=>6147,32402=>6148,32400=>6149,32403=>6150,32404=>6151,32406=>6152,32398=>6153,32411=>6154,32412=>6155,32568=>6156,32570=>6157,32581=>6158,32588=>6159,32589=>6160,32590=>6161,32592=>6162,12153=>6163,32593=>6163,32597=>6164,32596=>6165,32600=>6166,32607=>6167,32608=>6168,32616=>6169,32617=>6170,32615=>6171,32632=>6172,32642=>6173,32646=>6174,32643=>6175,32648=>6176,32647=>6177,32652=>6178,32660=>6179,32670=>6180,32669=>6181,32666=>6182,32675=>6183,32687=>6184,32690=>6185,32697=>6186,32686=>6187,32694=>6188,32696=>6189,35697=>6190,32709=>6191,32710=>6192,32714=>6193,32725=>6194,32724=>6195,32737=>6196,32742=>6197,32745=>6198,32755=>6199,32761=>6200,39132=>6201,32774=>6202,32772=>6203,32779=>6204,12158=>6205,32786=>6205,32792=>6206,32793=>6207,32796=>6208,32801=>6209,32808=>6210,32831=>6211,32827=>6212,32842=>6213,32838=>6214,32850=>6215,32856=>6216,32858=>6217,32863=>6218,32866=>6219,32872=>6220,32883=>6221,32882=>6222,32880=>6223,32886=>6224,32889=>6225,32893=>6226,12160=>6227,32895=>6227,32900=>6228,32902=>6229,32901=>6230,32923=>6231,32915=>6232,32922=>6233,32941=>6234,20880=>6235,32940=>6236,32987=>6237,32997=>6238,32985=>6239,32989=>6240,32964=>6241,32986=>6242,32982=>6243,33033=>6244,33007=>6245,33009=>6246,33051=>6247,33065=>6248,33059=>6249,33071=>6250,33099=>6251,38539=>6252,33094=>6253,33086=>6254,33107=>6255,33105=>6256,33020=>6257,33137=>6258,33134=>6259,33125=>6260,33126=>6261,33140=>6262,33155=>6263,33160=>6264,33162=>6265,33152=>6266,33154=>6267,33184=>6268,33173=>6269,33188=>6270,33187=>6271,33119=>6272,33171=>6273,33193=>6274,33200=>6275,33205=>6276,33214=>6277,33208=>6278,33213=>6279,33216=>6280,33218=>6281,33210=>6282,33225=>6283,33229=>6284,33233=>6285,33241=>6286,33240=>6287,33224=>6288,33242=>6289,33247=>6290,33248=>6291,33255=>6292,33274=>6293,33275=>6294,33278=>6295,33281=>6296,33282=>6297,33285=>6298,33287=>6299,33290=>6300,33293=>6301,33296=>6302,33302=>6303,33321=>6304,33323=>6305,33336=>6306,33331=>6307,33344=>6308,33369=>6309,33368=>6310,33373=>6311,33370=>6312,33375=>6313,33380=>6314,33378=>6315,33384=>6316,33386=>6317,33387=>6318,33326=>6319,33393=>6320,33399=>6321,12171=>6322,33400=>6322,33406=>6323,33421=>6324,33426=>6325,33451=>6326,33439=>6327,33467=>6328,33452=>6329,33505=>6330,33507=>6331,33503=>6332,33490=>6333,33524=>6334,33523=>6335,33530=>6336,33683=>6337,33539=>6338,33531=>6339,33529=>6340,33502=>6341,33542=>6342,33500=>6343,33545=>6344,33497=>6345,33589=>6346,33588=>6347,33558=>6348,33586=>6349,33585=>6350,33600=>6351,33593=>6352,33616=>6353,33605=>6354,33583=>6355,33579=>6356,33559=>6357,33560=>6358,33669=>6359,33690=>6360,33706=>6361,33695=>6362,33698=>6363,33686=>6364,33571=>6365,33678=>6366,33671=>6367,33674=>6368,33660=>6369,33717=>6370,33651=>6371,33653=>6372,33696=>6373,33673=>6374,33704=>6375,33780=>6376,33811=>6377,33771=>6378,33742=>6379,33789=>6380,33795=>6381,33752=>6382,33803=>6383,33729=>6384,33783=>6385,33799=>6386,33760=>6387,33778=>6388,33805=>6389,33826=>6390,33824=>6391,33725=>6392,33848=>6393,34054=>6394,33787=>6395,33901=>6396,33834=>6397,33852=>6398,34138=>6399,33924=>6400,33911=>6401,33899=>6402,33965=>6403,33902=>6404,33922=>6405,33897=>6406,33862=>6407,33836=>6408,33903=>6409,33913=>6410,33845=>6411,33994=>6412,33890=>6413,33977=>6414,33983=>6415,33951=>6416,34009=>6417,33997=>6418,33979=>6419,34010=>6420,34000=>6421,33985=>6422,33990=>6423,34006=>6424,33953=>6425,34081=>6426,34047=>6427,34036=>6428,34071=>6429,34072=>6430,34092=>6431,34079=>6432,34069=>6433,34068=>6434,34044=>6435,34112=>6436,34147=>6437,34136=>6438,34120=>6439,34113=>6440,34306=>6441,34123=>6442,34133=>6443,34176=>6444,34212=>6445,34184=>6446,34193=>6447,34186=>6448,34216=>6449,34157=>6450,34196=>6451,34203=>6452,34282=>6453,34183=>6454,34204=>6455,34167=>6456,34174=>6457,34192=>6458,34249=>6459,34234=>6460,34255=>6461,34233=>6462,34256=>6463,34261=>6464,34269=>6465,34277=>6466,34268=>6467,34297=>6468,34314=>6469,34323=>6470,34315=>6471,34302=>6472,34298=>6473,34310=>6474,34338=>6475,34330=>6476,34352=>6477,34367=>6478,12172=>6479,34381=>6479,20053=>6480,34388=>6481,34399=>6482,34407=>6483,34417=>6484,34451=>6485,34467=>6486,34473=>6487,34474=>6488,34443=>6489,34444=>6490,34486=>6491,34479=>6492,34500=>6493,34502=>6494,34480=>6495,34505=>6496,34851=>6497,34475=>6498,34516=>6499,34526=>6500,34537=>6501,34540=>6502,34527=>6503,34523=>6504,34543=>6505,34578=>6506,34566=>6507,34568=>6508,34560=>6509,34563=>6510,34555=>6511,34577=>6512,34569=>6513,34573=>6514,34553=>6515,34570=>6516,34612=>6517,34623=>6518,34615=>6519,34619=>6520,34597=>6521,34601=>6522,34586=>6523,34656=>6524,34655=>6525,34680=>6526,34636=>6527,34638=>6528,34676=>6529,34647=>6530,34664=>6531,34670=>6532,34649=>6533,34643=>6534,34659=>6535,34666=>6536,34821=>6537,34722=>6538,34719=>6539,34690=>6540,34735=>6541,34763=>6542,34749=>6543,34752=>6544,34768=>6545,38614=>6546,34731=>6547,34756=>6548,34739=>6549,34759=>6550,34758=>6551,34747=>6552,34799=>6553,34802=>6554,34784=>6555,34831=>6556,34829=>6557,34814=>6558,34806=>6559,34807=>6560,34830=>6561,34770=>6562,34833=>6563,34838=>6564,34837=>6565,34850=>6566,34849=>6567,34865=>6568,34870=>6569,34873=>6570,34855=>6571,34875=>6572,34884=>6573,34882=>6574,34898=>6575,34905=>6576,34910=>6577,34914=>6578,34923=>6579,34945=>6580,34942=>6581,34974=>6582,34933=>6583,34941=>6584,34997=>6585,34930=>6586,34946=>6587,34967=>6588,34962=>6589,34990=>6590,34969=>6591,34978=>6592,34957=>6593,34980=>6594,34992=>6595,35007=>6596,34993=>6597,35011=>6598,35012=>6599,35028=>6600,35032=>6601,35033=>6602,35037=>6603,35065=>6604,35074=>6605,35068=>6606,35060=>6607,35048=>6608,35058=>6609,35076=>6610,35084=>6611,35082=>6612,35091=>6613,35139=>6614,35102=>6615,35109=>6616,35114=>6617,35115=>6618,35137=>6619,35140=>6620,35131=>6621,35126=>6622,35128=>6623,35148=>6624,35101=>6625,35168=>6626,35166=>6627,35174=>6628,35172=>6629,35181=>6630,35178=>6631,35183=>6632,35188=>6633,35191=>6634,12177=>6635,35198=>6635,35203=>6636,35208=>6637,35210=>6638,35219=>6639,35224=>6640,35233=>6641,35241=>6642,35238=>6643,35244=>6644,35247=>6645,35250=>6646,35258=>6647,35261=>6648,35263=>6649,35264=>6650,35290=>6651,35292=>6652,35293=>6653,35303=>6654,35316=>6655,35320=>6656,35331=>6657,35350=>6658,35344=>6659,35340=>6660,35355=>6661,35357=>6662,35365=>6663,35382=>6664,35393=>6665,35419=>6666,35410=>6667,35398=>6668,35400=>6669,35452=>6670,35437=>6671,35436=>6672,35426=>6673,35461=>6674,35458=>6675,35460=>6676,35496=>6677,35489=>6678,35473=>6679,35493=>6680,35494=>6681,35482=>6682,35491=>6683,35524=>6684,35533=>6685,35522=>6686,35546=>6687,35563=>6688,35571=>6689,35559=>6690,35556=>6691,35569=>6692,35604=>6693,35552=>6694,35554=>6695,35575=>6696,35550=>6697,35547=>6698,35596=>6699,35591=>6700,35610=>6701,35553=>6702,35606=>6703,35600=>6704,35607=>6705,35616=>6706,35635=>6707,38827=>6708,35622=>6709,35627=>6710,35646=>6711,35624=>6712,35649=>6713,35660=>6714,35663=>6715,35662=>6716,35657=>6717,35670=>6718,35675=>6719,35674=>6720,35691=>6721,35679=>6722,35692=>6723,35695=>6724,35700=>6725,35709=>6726,35712=>6727,35724=>6728,35726=>6729,35730=>6730,35731=>6731,35734=>6732,35737=>6733,35738=>6734,35898=>6735,35905=>6736,35903=>6737,35912=>6738,35916=>6739,35918=>6740,35920=>6741,12183=>6742,35925=>6742,35938=>6743,35948=>6744,12184=>6745,35960=>6745,35962=>6746,35970=>6747,35977=>6748,35973=>6749,35978=>6750,35981=>6751,35982=>6752,35988=>6753,35964=>6754,35992=>6755,25117=>6756,36013=>6757,36010=>6758,36029=>6759,36018=>6760,36019=>6761,36014=>6762,36022=>6763,36040=>6764,36033=>6765,36068=>6766,36067=>6767,36058=>6768,36093=>6769,36090=>6770,36091=>6771,36100=>6772,36101=>6773,36106=>6774,36103=>6775,36111=>6776,36109=>6777,36112=>6778,40782=>6779,36115=>6780,36045=>6781,36116=>6782,36118=>6783,36199=>6784,36205=>6785,36209=>6786,36211=>6787,36225=>6788,36249=>6789,36290=>6790,36286=>6791,36282=>6792,36303=>6793,36314=>6794,36310=>6795,36300=>6796,36315=>6797,36299=>6798,36330=>6799,36331=>6800,36319=>6801,36323=>6802,36348=>6803,36360=>6804,36361=>6805,36351=>6806,36381=>6807,36382=>6808,36368=>6809,36383=>6810,36418=>6811,36405=>6812,36400=>6813,36404=>6814,36426=>6815,36423=>6816,36425=>6817,36428=>6818,36432=>6819,36424=>6820,36441=>6821,36452=>6822,36448=>6823,36394=>6824,36451=>6825,36437=>6826,36470=>6827,36466=>6828,36476=>6829,36481=>6830,36487=>6831,36485=>6832,36484=>6833,36491=>6834,36490=>6835,36499=>6836,36497=>6837,36500=>6838,36505=>6839,36522=>6840,36513=>6841,36524=>6842,36528=>6843,36550=>6844,36529=>6845,36542=>6846,36549=>6847,36552=>6848,36555=>6849,36571=>6850,36579=>6851,36604=>6852,36603=>6853,36587=>6854,36606=>6855,36618=>6856,36613=>6857,36629=>6858,36626=>6859,36633=>6860,36627=>6861,36636=>6862,36639=>6863,36635=>6864,36620=>6865,36646=>6866,36659=>6867,36667=>6868,36665=>6869,36677=>6870,36674=>6871,36670=>6872,36684=>6873,36681=>6874,36678=>6875,36686=>6876,36695=>6877,36700=>6878,36706=>6879,36707=>6880,36708=>6881,36764=>6882,36767=>6883,36771=>6884,36781=>6885,36783=>6886,36791=>6887,36826=>6888,36837=>6889,36834=>6890,36842=>6891,36847=>6892,36999=>6893,36852=>6894,36869=>6895,36857=>6896,36858=>6897,36881=>6898,36885=>6899,36897=>6900,36877=>6901,36894=>6902,36886=>6903,36875=>6904,36903=>6905,36918=>6906,36917=>6907,36921=>6908,36856=>6909,36943=>6910,36944=>6911,36945=>6912,36946=>6913,36878=>6914,36937=>6915,36926=>6916,36950=>6917,36952=>6918,36958=>6919,36968=>6920,36975=>6921,36982=>6922,38568=>6923,36978=>6924,36994=>6925,36989=>6926,36993=>6927,36992=>6928,37002=>6929,37001=>6930,37007=>6931,37032=>6932,37039=>6933,37041=>6934,37045=>6935,37090=>6936,37092=>6937,25160=>6938,37083=>6939,37122=>6940,37138=>6941,37145=>6942,37170=>6943,37168=>6944,37194=>6945,37206=>6946,37208=>6947,37219=>6948,37221=>6949,37225=>6950,37235=>6951,37234=>6952,37259=>6953,37257=>6954,37250=>6955,37282=>6956,37291=>6957,37295=>6958,37290=>6959,37301=>6960,37300=>6961,37306=>6962,37312=>6963,37313=>6964,37321=>6965,37323=>6966,37328=>6967,37334=>6968,37343=>6969,37345=>6970,37339=>6971,37372=>6972,37365=>6973,37366=>6974,37406=>6975,37375=>6976,37396=>6977,37420=>6978,37397=>6979,37393=>6980,37470=>6981,37463=>6982,37445=>6983,37449=>6984,37476=>6985,37448=>6986,37525=>6987,37439=>6988,37451=>6989,37456=>6990,37532=>6991,37526=>6992,37523=>6993,37531=>6994,37466=>6995,37583=>6996,37561=>6997,37559=>6998,37609=>6999,37647=>7000,37626=>7001,37700=>7002,37678=>7003,37657=>7004,37666=>7005,37658=>7006,37667=>7007,37690=>7008,37685=>7009,37691=>7010,37724=>7011,37728=>7012,37756=>7013,37742=>7014,37718=>7015,37808=>7016,37804=>7017,37805=>7018,37780=>7019,37817=>7020,37846=>7021,37847=>7022,37864=>7023,37861=>7024,37848=>7025,37827=>7026,37853=>7027,37840=>7028,37832=>7029,37860=>7030,37914=>7031,37908=>7032,37907=>7033,37891=>7034,37895=>7035,37904=>7036,37942=>7037,37931=>7038,37941=>7039,37921=>7040,37946=>7041,37953=>7042,37970=>7043,37956=>7044,37979=>7045,37984=>7046,37986=>7047,37982=>7048,37994=>7049,37417=>7050,38000=>7051,38005=>7052,38007=>7053,38013=>7054,37978=>7055,38012=>7056,38014=>7057,38017=>7058,38015=>7059,38274=>7060,38279=>7061,38282=>7062,38292=>7063,38294=>7064,38296=>7065,38297=>7066,38304=>7067,38312=>7068,38311=>7069,38317=>7070,38332=>7071,38331=>7072,38329=>7073,38334=>7074,38346=>7075,28662=>7076,38339=>7077,38349=>7078,38348=>7079,38357=>7080,38356=>7081,38358=>7082,38364=>7083,38369=>7084,38373=>7085,38370=>7086,38433=>7087,38440=>7088,38446=>7089,38447=>7090,38466=>7091,38476=>7092,38479=>7093,38475=>7094,38519=>7095,38492=>7096,38494=>7097,38493=>7098,38495=>7099,38502=>7100,38514=>7101,38508=>7102,38541=>7103,38552=>7104,38549=>7105,38551=>7106,38570=>7107,38567=>7108,38577=>7109,38578=>7110,38576=>7111,38580=>7112,12202=>7113,38582=>7113,38584=>7114,12203=>7115,38585=>7115,38606=>7116,38603=>7117,38601=>7118,38605=>7119,35149=>7120,38620=>7121,38669=>7122,38613=>7123,38649=>7124,38660=>7125,38662=>7126,38664=>7127,38675=>7128,38670=>7129,38673=>7130,38671=>7131,38678=>7132,38681=>7133,38692=>7134,38698=>7135,38704=>7136,38713=>7137,38717=>7138,38718=>7139,38724=>7140,38726=>7141,38728=>7142,38722=>7143,38729=>7144,38748=>7145,38752=>7146,38756=>7147,38758=>7148,38760=>7149,21202=>7150,38763=>7151,38769=>7152,38777=>7153,38789=>7154,38780=>7155,38785=>7156,38778=>7157,38790=>7158,38795=>7159,38799=>7160,38800=>7161,38812=>7162,38824=>7163,38822=>7164,38819=>7165,38835=>7166,38836=>7167,38851=>7168,38854=>7169,38856=>7170,12209=>7171,38859=>7171,38876=>7172,12210=>7173,38893=>7173,40783=>7174,38898=>7175,31455=>7176,38902=>7177,38901=>7178,38927=>7179,38924=>7180,38968=>7181,38948=>7182,38945=>7183,38967=>7184,38973=>7185,38982=>7186,38991=>7187,38987=>7188,39019=>7189,39023=>7190,39024=>7191,39025=>7192,39028=>7193,39027=>7194,39082=>7195,39087=>7196,39089=>7197,39094=>7198,39108=>7199,39107=>7200,39110=>7201,39145=>7202,39147=>7203,39171=>7204,39177=>7205,39186=>7206,39188=>7207,39192=>7208,39201=>7209,39197=>7210,39198=>7211,39204=>7212,39200=>7213,39212=>7214,39214=>7215,39229=>7216,39230=>7217,39234=>7218,39241=>7219,39237=>7220,39248=>7221,39243=>7222,39249=>7223,39250=>7224,39244=>7225,39253=>7226,39319=>7227,39320=>7228,39333=>7229,39341=>7230,39342=>7231,39356=>7232,39391=>7233,39387=>7234,39389=>7235,39384=>7236,39377=>7237,39405=>7238,39406=>7239,39409=>7240,39410=>7241,39419=>7242,39416=>7243,39425=>7244,39439=>7245,39429=>7246,39394=>7247,39449=>7248,39467=>7249,39479=>7250,39493=>7251,39490=>7252,39488=>7253,39491=>7254,39486=>7255,39509=>7256,39501=>7257,39515=>7258,39511=>7259,39519=>7260,39522=>7261,39525=>7262,39524=>7263,39529=>7264,39531=>7265,39530=>7266,39597=>7267,39600=>7268,39612=>7269,39616=>7270,39631=>7271,39633=>7272,39635=>7273,39636=>7274,39646=>7275,12221=>7276,39647=>7276,39650=>7277,39651=>7278,39654=>7279,39663=>7280,39659=>7281,39662=>7282,39668=>7283,39665=>7284,39671=>7285,39675=>7286,39686=>7287,39704=>7288,39706=>7289,39711=>7290,39714=>7291,39715=>7292,12222=>7293,39717=>7293,39719=>7294,39720=>7295,39721=>7296,39722=>7297,39726=>7298,12223=>7299,39727=>7299,39730=>7300,12224=>7300,39748=>7301,39747=>7302,39759=>7303,39757=>7304,39758=>7305,39761=>7306,39768=>7307,39796=>7308,39827=>7309,39811=>7310,39825=>7311,39830=>7312,39831=>7313,39839=>7314,39840=>7315,39848=>7316,39860=>7317,39872=>7318,39882=>7319,39865=>7320,39878=>7321,39887=>7322,39889=>7323,39890=>7324,39907=>7325,39906=>7326,39908=>7327,39892=>7328,39905=>7329,39994=>7330,39922=>7331,39921=>7332,39920=>7333,39957=>7334,39956=>7335,39945=>7336,39955=>7337,39948=>7338,39942=>7339,39944=>7340,39954=>7341,39946=>7342,39940=>7343,39982=>7344,39963=>7345,39973=>7346,39972=>7347,39969=>7348,39984=>7349,40007=>7350,39986=>7351,40006=>7352,39998=>7353,40026=>7354,40032=>7355,40039=>7356,40054=>7357,40056=>7358,40167=>7359,40172=>7360,40176=>7361,40201=>7362,40200=>7363,40171=>7364,40195=>7365,40198=>7366,40234=>7367,40230=>7368,40367=>7369,40227=>7370,40223=>7371,40260=>7372,40213=>7373,40210=>7374,40257=>7375,40255=>7376,40254=>7377,40262=>7378,40264=>7379,40285=>7380,40286=>7381,40292=>7382,40273=>7383,40272=>7384,40281=>7385,40306=>7386,40329=>7387,40327=>7388,40363=>7389,40303=>7390,40314=>7391,40346=>7392,40356=>7393,40361=>7394,40370=>7395,40388=>7396,40385=>7397,40379=>7398,40376=>7399,40378=>7400,40390=>7401,40399=>7402,40386=>7403,40409=>7404,40403=>7405,40440=>7406,40422=>7407,40429=>7408,40431=>7409,40445=>7410,40474=>7411,40475=>7412,40478=>7413,12228=>7414,40565=>7414,40569=>7415,40573=>7416,40577=>7417,40584=>7418,40587=>7419,40588=>7420,40594=>7421,40597=>7422,40593=>7423,40605=>7424,12230=>7425,40613=>7425,40617=>7426,40632=>7427,40618=>7428,40621=>7429,38753=>7430,40652=>7431,40654=>7432,40655=>7433,40656=>7434,40660=>7435,40668=>7436,40670=>7437,40669=>7438,40672=>7439,40677=>7440,40680=>7441,40687=>7442,40692=>7443,40694=>7444,40695=>7445,12235=>7446,40697=>7446,40699=>7447,40700=>7448,12236=>7449,40701=>7449,40711=>7450,40712=>7451,30391=>7452,40725=>7453,40737=>7454,40748=>7455,40766=>7456,40778=>7457,12241=>7457,40786=>7458,12242=>7458,40788=>7459,40803=>7460,40799=>7461,40800=>7462,40801=>7463,40806=>7464,40807=>7465,40812=>7466,40810=>7467,40823=>7468,40818=>7469,40822=>7470,40853=>7471,40860=>7472,12244=>7472,40864=>7473,12245=>7473,22575=>7474,27079=>7475,36953=>7476,29796=>7477,9472=>7479,9473=>7480,9474=>7481,9475=>7482,9476=>7483,9477=>7484,9478=>7485,9479=>7486,9480=>7487,9481=>7488,9482=>7489,9483=>7490,9484=>7491,9485=>7492,9486=>7493,9487=>7494,9488=>7495,9489=>7496,9490=>7497,9491=>7498,9492=>7499,9493=>7500,9494=>7501,9495=>7502,9496=>7503,9497=>7504,9498=>7505,9499=>7506,9500=>7507,9501=>7508,9502=>7509,9503=>7510,9504=>7511,9505=>7512,9506=>7513,9507=>7514,9508=>7515,9509=>7516,9510=>7517,9511=>7518,9512=>7519,9513=>7520,9514=>7521,9515=>7522,9516=>7523,9517=>7524,9518=>7525,9519=>7526,9520=>7527,9521=>7528,9522=>7529,9523=>7530,9524=>7531,9525=>7532,9526=>7533,9527=>7534,9528=>7535,9529=>7536,9530=>7537,9531=>7538,9532=>7539,9533=>7540,9534=>7541,9535=>7542,9536=>7543,9537=>7544,9538=>7545,9539=>7546,9540=>7547,9541=>7548,9542=>7549,9543=>7550,9544=>7551,9545=>7552,9546=>7553,9547=>7554,9312=>7555,9313=>7556,9314=>7557,9315=>7558,9316=>7559,9317=>7560,9318=>7561,9319=>7562,9320=>7563,9321=>7564,9322=>7565,9323=>7566,9324=>7567,9325=>7568,9326=>7569,9327=>7570,9328=>7571,9329=>7572,9330=>7573,9331=>7574,8544=>7575,8545=>7576,8546=>7577,8547=>7578,8548=>7579,8549=>7580,8550=>7581,8551=>7582,8552=>7583,8553=>7584,13129=>7585,13076=>7586,13133=>7588,13095=>7590,13110=>7592,13137=>7593,13069=>7595,13094=>7596,13099=>7598,13130=>7599,13212=>7601,13213=>7602,13214=>7603,13198=>7604,13199=>7605,13252=>7606,13217=>7607,12317=>7608,12319=>7609,8470=>7610,13261=>7611,12964=>7613,12965=>7614,12966=>7615,12967=>7616,12968=>7617,12849=>7618,12850=>7619,12857=>7620,13182=>7621,13181=>7622,13180=>7623,8750=>7624,8721=>7625,8735=>7629,8895=>7630,21854=>7633,167133=>7641,28976=>7644,40407=>7646,64054=>7651,22169=>7654,15694=>7655,20448=>7660,36544=>7663,194797=>7665,153716=>7670,32363=>7671,33606=>7672,167670=>7673,40572=>7677,26171=>7680,40628=>7682,26629=>7687,23650=>7693,194780=>7695,32353=>7697,64070=>7700,34083=>7706,37292=>7707,34796=>7715,25620=>7724,39506=>7727,64074=>7732,194692=>7734,31774=>7739,64016=>7746,25681=>7747,63980=>7750,22625=>7751,39002=>7752,194679=>7754,31153=>7758,28678=>7760,22218=>7770,21085=>7774,28497=>7776,37297=>7777,64106=>7788,38960=>7795,40629=>7797,33802=>7807,63939=>7808,63890=>7809,63891=>7810,63897=>7811,34847=>7813,194575=>7814,194771=>7816,194584=>7817,137754=>7825,23643=>7826,25890=>7831,26618=>7834,26766=>7836,148432=>7838,194848=>7839,34110=>7861,30562=>7877,65041=>7887,65042=>7888,65075=>7890,65073=>7892,65074=>7893,8285=>7897,65049=>7897,8282=>7898,65072=>7898,65077=>7899,65078=>7900,65081=>7901,65082=>7902,65095=>7903,65096=>7904,65079=>7905,65080=>7906,65087=>7907,65088=>7908,65085=>7909,65086=>7910,65089=>7911,65090=>7912,65091=>7913,65092=>7914,65083=>7915,65084=>7916,12436=>7958,12437=>7959,12438=>7960,22099=>7963,65508=>8005,65287=>8006,65282=>8007,9665=>8009,9655=>8010,8681=>8011,8679=>8012,8678=>8013,8680=>8014,9634=>8015,9831=>8016,9825=>8017,9828=>8018,9826=>8019,13216=>8020,13218=>8021,13220=>8022,13221=>8023,13207=>8024,8467=>8025,13208=>8026,13235=>8027,13234=>8028,13233=>8029,13232=>8030,13189=>8031,13190=>8032,13191=>8033,13259=>8034,13200=>8035,13268=>8036,13206=>8037,13090=>8038,13078=>8039,13080=>8040,13077=>8041,13059=>8042,13091=>8043,13143=>8044,13122=>8045,13113=>8046,13115=>8047,13056=>8048,13105=>8049,13127=>8050,13086=>8051,13098=>8052,13183=>8054,8481=>8055,9742=>8056,12342=>8057,12320=>8058,9352=>8062,9353=>8063,9354=>8064,9355=>8065,9356=>8066,9357=>8067,9358=>8068,9359=>8069,9360=>8070,9332=>8071,9333=>8072,9334=>8073,9335=>8074,9336=>8075,9337=>8076,9338=>8077,9339=>8078,9340=>8079,9341=>8080,9342=>8081,9343=>8082,9344=>8083,9345=>8084,9346=>8085,9347=>8086,9348=>8087,9349=>8088,9350=>8089,9351=>8090,12881=>8091,8560=>8092,8561=>8093,8562=>8094,8563=>8095,8564=>8096,8565=>8097,8566=>8098,8567=>8099,8568=>8100,8569=>8101,12882=>8102,12883=>8103,12884=>8104,12885=>8105,12886=>8106,12887=>8107,12888=>8108,12889=>8109,12890=>8110,12891=>8111,9372=>8112,9373=>8113,9374=>8114,9375=>8115,9376=>8116,9377=>8117,9378=>8118,9379=>8119,9380=>8120,9381=>8121,9382=>8122,9383=>8123,9384=>8124,9385=>8125,9386=>8126,9387=>8127,9388=>8128,9389=>8129,9390=>8130,9391=>8131,9392=>8132,9393=>8133,9394=>8134,9395=>8135,9396=>8136,9397=>8137,12867=>8138,12861=>8139,12863=>8140,12852=>8141,12856=>8142,12851=>8143,12860=>8144,12866=>8145,12862=>8146,12854=>8147,12853=>8148,12859=>8149,12864=>8150,12858=>8151,12976=>8152,12973=>8153,12969=>8154,12975=>8155,12948=>8156,12970=>8157,12952=>8158,12971=>8159,12946=>8160,12945=>8161,12947=>8162,12972=>8163,12974=>8164,12950=>8165,9131=>8174,9132=>8175,9133=>8176,9127=>8178,9128=>8179,9129=>8180,13260=>8182,13061=>8183,13215=>8186,13219=>8187,13222=>8188,12958=>8191,13192=>8192,13193=>8193,13256=>8194,8749=>8195,12848=>8197,12842=>8198,12843=>8199,12844=>8200,12845=>8201,12846=>8202,12847=>8203,12855=>8204,12865=>8205,10145=>8206,11013=>8207,11014=>8208,11015=>8209,9673=>8210,9824=>8211,9829=>8212,9827=>8213,9830=>8214,9728=>8215,9729=>8216,9730=>8217,9731=>8218,9758=>8219,9756=>8220,9757=>8221,9759=>8222,12953=>8223,9450=>8224,8554=>8225,8555=>8226,9601=>8230,9602=>8231,9603=>8232,9604=>8233,9605=>8234,9606=>8235,9607=>8236,9608=>8237,9615=>8238,9614=>8239,9613=>8240,9612=>8241,9611=>8242,9610=>8243,9609=>8244,9620=>8245,9621=>8246,9581=>8247,9582=>8248,9584=>8249,9583=>8250,9552=>8251,9566=>8252,9578=>8253,9569=>8254,9698=>8255,9699=>8256,9701=>8257,9700=>8258,9585=>8261,9586=>8262,9587=>8263,65040=>8268,20956=>8284,29081=>8285,10102=>8286,10103=>8287,10104=>8288,10105=>8289,10106=>8290,10107=>8291,10108=>8292,10109=>8293,10110=>8294,8570=>8298,8571=>8299,8575=>8303,8458=>8304,8457=>8305,8507=>8307,12292=>8308,8646=>8309,8644=>8310,8645=>8311,12535=>8313,12536=>8314,12537=>8315,12538=>8316,12957=>8319,13179=>8323,13107=>8327,13134=>8328,32394=>8359,35100=>8360,37704=>8361,37512=>8362,34012=>8363,20425=>8364,28859=>8365,26161=>8366,26824=>8367,37625=>8368,26363=>8369,24389=>8370,12033=>8371,20008=>8371,20193=>8372,20220=>8373,20224=>8374,20227=>8375,20281=>8376,20310=>8377,20370=>8378,20362=>8379,20378=>8380,20372=>8381,20429=>8382,20544=>8383,20514=>8384,20479=>8385,20510=>8386,20550=>8387,20592=>8388,20546=>8389,20628=>8390,20724=>8391,20696=>8392,20810=>8393,20836=>8394,20893=>8395,20926=>8396,20972=>8397,21013=>8398,21148=>8399,21158=>8400,21184=>8401,21211=>8402,21248=>8403,21284=>8405,21362=>8406,21395=>8407,21426=>8408,21469=>8409,64014=>8410,21660=>8411,21642=>8412,21673=>8413,21759=>8414,21894=>8415,22361=>8416,22373=>8417,22444=>8418,22472=>8419,22471=>8420,64015=>8421,22686=>8423,22706=>8424,22795=>8425,22867=>8426,22875=>8427,22877=>8428,22883=>8429,22948=>8430,22970=>8431,23382=>8432,23488=>8433,29999=>8434,23512=>8435,23582=>8437,23718=>8438,23738=>8439,23797=>8440,23847=>8441,23891=>8442,23874=>8444,23917=>8445,23992=>8446,23993=>8447,24016=>8448,24353=>8449,24372=>8450,24423=>8451,24503=>8452,24542=>8453,24669=>8454,24709=>8455,24714=>8456,24798=>8457,24789=>8458,24864=>8459,24818=>8460,24849=>8461,24887=>8462,24880=>8463,24984=>8464,25107=>8465,25254=>8466,25589=>8467,25696=>8468,25757=>8469,25806=>8470,25934=>8471,26112=>8472,26133=>8473,26121=>8474,26158=>8475,26148=>8477,26213=>8478,26199=>8479,26201=>8480,64018=>8481,26227=>8482,26265=>8483,26272=>8484,26290=>8485,26303=>8486,26362=>8487,26382=>8488,26470=>8490,26555=>8491,26706=>8492,26560=>8493,26692=>8495,26831=>8496,64019=>8497,26984=>8498,64020=>8499,27032=>8500,27106=>8501,27184=>8502,27243=>8503,27206=>8504,27251=>8505,27262=>8506,27362=>8507,27364=>8508,27606=>8509,27711=>8510,27740=>8511,27782=>8512,27759=>8513,27866=>8514,27908=>8515,28039=>8516,28015=>8517,28054=>8518,28076=>8519,28111=>8520,28152=>8521,28146=>8522,28156=>8523,28217=>8524,28252=>8525,28199=>8526,28220=>8527,28351=>8528,28552=>8529,28597=>8530,28661=>8531,28677=>8532,28679=>8533,28712=>8534,28805=>8535,28843=>8536,28943=>8537,28932=>8538,29020=>8539,28998=>8540,28999=>8541,29121=>8543,29182=>8544,29361=>8545,29374=>8546,29476=>8547,64022=>8548,29559=>8549,29629=>8550,29641=>8551,29654=>8552,29667=>8553,29650=>8554,29703=>8555,29685=>8556,29734=>8557,29738=>8558,29737=>8559,29742=>8560,29833=>8562,29855=>8563,29953=>8564,30063=>8565,30338=>8566,30364=>8567,30366=>8568,30363=>8569,30374=>8570,64023=>8571,30534=>8572,21167=>8573,30753=>8574,30798=>8575,30820=>8576,30842=>8577,31024=>8578,64024=>8579,64025=>8580,64026=>8581,31124=>8582,64027=>8583,31131=>8584,31441=>8585,31463=>8586,64028=>8587,31467=>8588,31646=>8589,64029=>8590,32072=>8591,32183=>8593,32160=>8594,32214=>8595,32338=>8596,32583=>8597,32673=>8598,64030=>8599,33537=>8600,33634=>8601,33663=>8602,33735=>8603,33782=>8604,33864=>8605,33972=>8606,34131=>8607,34137=>8608,34155=>8609,64031=>8610,34224=>8611,64032=>8612,64033=>8613,34823=>8614,35061=>8615,35346=>8616,35383=>8617,35449=>8618,35495=>8619,35518=>8620,35551=>8621,64034=>8622,35574=>8623,35667=>8624,35711=>8625,36080=>8626,36084=>8627,36114=>8628,36214=>8629,64035=>8630,36559=>8631,64037=>8633,36967=>8634,37086=>8635,64038=>8636,37141=>8637,37159=>8638,37338=>8639,37335=>8640,37342=>8641,37357=>8642,37358=>8643,37348=>8644,37349=>8645,37382=>8646,37392=>8647,37386=>8648,37434=>8649,37440=>8650,37436=>8651,37454=>8652,37465=>8653,37457=>8654,37433=>8655,37479=>8656,37543=>8657,37495=>8658,37496=>8659,37607=>8660,37591=>8661,37593=>8662,37584=>8663,64039=>8664,37589=>8665,37600=>8666,37587=>8667,37669=>8668,37665=>8669,37627=>8670,64040=>8671,37662=>8672,37631=>8673,37661=>8674,37634=>8675,37744=>8676,37719=>8677,37796=>8678,37830=>8679,37854=>8680,37880=>8681,37937=>8682,37957=>8683,37960=>8684,38290=>8685,64041=>8687,38557=>8688,38575=>8689,38707=>8690,38715=>8691,38723=>8692,38733=>8693,38735=>8694,12205=>8695,38737=>8695,38999=>8697,39013=>8698,64042=>8699,64043=>8700,39207=>8701,64044=>8702,39326=>8703,39502=>8704,39641=>8705,39644=>8706,39797=>8707,39794=>8708,39823=>8709,39857=>8710,39867=>8711,39936=>8712,40304=>8713,40299=>8714,64045=>8715,40473=>8716,40657=>8717,8364=>9354,8486=>9355,64256=>9358,64259=>9359,64260=>9360,257=>9361,299=>9362,363=>9363,275=>9364,333=>9365,256=>9366,298=>9367,362=>9368,274=>9369,332=>9370,8539=>9371,8540=>9372,8541=>9373,8542=>9374,8531=>9375,8532=>9376,8304=>9377,8308=>9378,8309=>9379,8310=>9380,8311=>9381,8312=>9382,8313=>9383,8320=>9384,8321=>9385,8322=>9386,8323=>9387,8324=>9388,8325=>9389,8326=>9390,8327=>9391,8328=>9392,8329=>9393,461=>9394,282=>9395,7868=>9397,463=>9398,296=>9400,465=>9401,467=>9403,366=>9404,360=>9405,462=>9406,283=>9407,7869=>9409,464=>9410,297=>9412,466=>9413,468=>9415,367=>9416,361=>9417,593=>9418,8049=>9419,8048=>9420,509=>9421,596=>9423,601=>9426,602=>9429,603=>9432,8051=>9433,8050=>9434,567=>9435,331=>9436,629=>9437,652=>9438,658=>9441,643=>9442,720=>9443,8534=>9785,8535=>9786,8536=>9787,8537=>9788,8538=>9789,12832=>10126,12833=>10127,12834=>10128,12835=>10129,12836=>10130,12837=>10131,12838=>10132,12839=>10133,12840=>10134,12841=>10135,12892=>10244,12893=>10245,12894=>10246,12895=>10247,12977=>10248,12978=>10249,12979=>10250,12980=>10251,12981=>10252,12982=>10253,12983=>10254,12984=>10255,12985=>10256,12986=>10257,12987=>10258,12988=>10259,12989=>10260,12990=>10261,12991=>10262,9424=>10313,9425=>10314,9426=>10315,9427=>10316,9428=>10317,9429=>10318,9430=>10319,9431=>10320,9432=>10321,9433=>10322,9434=>10323,9435=>10324,9436=>10325,9437=>10326,9438=>10327,9439=>10328,9440=>10329,9441=>10330,9442=>10331,9443=>10332,9444=>10333,9445=>10334,9446=>10335,9447=>10336,9448=>10337,9449=>10338,9398=>10339,9399=>10340,9400=>10341,9401=>10342,9402=>10343,9403=>10344,9404=>10345,9405=>10346,9406=>10347,9407=>10348,9408=>10349,9409=>10350,9410=>10351,9411=>10352,9412=>10353,9413=>10354,9414=>10355,9415=>10356,9416=>10357,9417=>10358,9418=>10359,9419=>10360,9420=>10361,9421=>10362,9422=>10363,9423=>10364,13008=>10413,13009=>10414,13010=>10415,13011=>10416,13012=>10417,13013=>10418,13014=>10419,13015=>10420,13016=>10421,13017=>10422,13018=>10423,13019=>10424,13020=>10425,13021=>10426,13022=>10427,13023=>10428,13024=>10429,13025=>10430,13026=>10431,13027=>10432,13028=>10433,13029=>10434,13030=>10435,13031=>10436,13032=>10437,13033=>10438,13034=>10439,13035=>10440,13036=>10441,13037=>10442,13038=>10443,13039=>10444,13040=>10445,13041=>10446,13042=>10447,13043=>10448,13044=>10449,13045=>10450,13046=>10451,13047=>10452,13048=>10453,13049=>10454,13050=>10455,13051=>10456,13052=>10457,13053=>10458,13054=>10459,12928=>10461,12929=>10462,12930=>10463,12931=>10464,12932=>10465,12933=>10466,12934=>10467,12935=>10468,12936=>10469,12937=>10470,12944=>10471,12938=>10472,12939=>10473,12940=>10474,12941=>10475,12942=>10476,12943=>10477,12959=>10479,12960=>10486,12961=>10487,12955=>10488,12954=>10489,12963=>10490,12962=>10491,12951=>10492,12956=>10494,12949=>10495,9676=>10502,9471=>10503,10111=>10514,9451=>10515,9452=>10516,9453=>10517,9454=>10518,9455=>10519,9456=>10520,9457=>10521,9458=>10522,9459=>10523,9460=>10524,8414=>11035,13274=>11851,8448=>11855,13250=>11856,8453=>11859,13169=>11861,13197=>11864,13211=>11865,13271=>11869,13272=>11870,13057=>11874,13058=>11875,13060=>11876,13062=>11877,13064=>11879,13063=>11881,13066=>11882,13065=>11884,13067=>11886,13068=>11888,13070=>11889,13071=>11890,13072=>11891,13073=>11892,13074=>11893,13075=>11894,13079=>11896,13081=>11898,13082=>11900,13083=>11901,13084=>11902,13085=>11903,13087=>11904,13088=>11905,13089=>11906,13092=>11907,13093=>11909,13096=>11912,13097=>11913,13101=>11915,13102=>11918,13103=>11919,13104=>11920,13106=>11921,13108=>11924,13109=>11925,13116=>11926,13111=>11930,13112=>11932,13114=>11933,13117=>11934,13121=>11935,13118=>11936,13119=>11937,13120=>11938,13123=>11939,13124=>11940,13125=>11941,13126=>11942,13128=>11943,13131=>11944,13132=>11945,13135=>11946,13136=>11947,13138=>11950,13140=>11951,13139=>11954,13141=>11955,13142=>11956,8501=>12089,976=>12090,8714=>12091,8463=>12092,981=>12094,987=>12095,977=>12096,9832=>12098,9833=>12099,9836=>12100,12347=>12106,12339=>12108,12340=>12109,12341=>12110,8252=>12111,8265=>12112,8723=>12118,8771=>12120,8818=>12121,8819=>12122,12312=>12129,12313=>12130,65375=>12131,65376=>12132,9115=>12143,9117=>12144,9118=>12145,9120=>12146,9121=>12151,9123=>12152,9124=>12153,9126=>12154,9116=>12167,9119=>12167,9122=>12167,9125=>12167,9130=>12167,9986=>12176,12349=>12179,12447=>12181,8709=>12184,8864=>12185,8854=>12186,8856=>12187,8853=>12188,8855=>12189,9888=>12192,9664=>12194,9654=>12195,8656=>12200,8596=>12201,8600=>12202,8601=>12203,8598=>12204,8599=>12205,8652=>12206,8651=>12207,12336=>12218,8967=>12219,10048=>12228,10047=>12229,9643=>12237,9642=>12239,10010=>12241,9702=>12254,10070=>12259,65093=>12639,65094=>12640,64103=>13320,64098=>13321,32227=>13322,12232=>13323,40643=>13323,28331=>13324,64082=>13325,64061=>13326,64069=>13327,64062=>13328,27114=>13329,28212=>13330,64096=>13331,64071=>13332,64056=>13333,64066=>13334,64078=>13335,34395=>13336,64105=>13337,64052=>13338,64099=>13339,25581=>13340,25802=>13341,30799=>13342,64084=>13343,63856=>13344,64077=>13345,64097=>13346,64072=>13347,64076=>13348,64091=>13349,64092=>13350,64081=>13351,64067=>13352,64090=>13353,28041=>13354,29376=>13355,194885=>13357,64086=>13358,64080=>13359,64049=>13360,64059=>13361,24034=>13362,64063=>13363,64101=>13364,21373=>13365,64055=>13366,64095=>13367,24501=>13368,64064=>13369,64083=>13371,64085=>13373,64104=>13374,64068=>13375,64089=>13376,26202=>13377,64053=>13378,64075=>13379,64100=>13380,64065=>13381,64048=>13382,64057=>13384,64051=>13385,27493=>13386,64058=>13387,27599=>13388,64050=>13389,25150=>13390,64079=>13391,63773=>13392,63964=>13393,63798=>13394,28122=>13395,63952=>13396,26310=>13397,27511=>13398,64087=>13399,37706=>13400,37636=>13402,133390=>13523,35999=>13644,11991=>13645,11965=>13646,158033=>13646,37555=>13652,38321=>13653,194812=>13656,194965=>13670,194794=>13679,26478=>13681,11974=>13682,194594=>13684,156194=>13691,13314=>13698,26083=>13701,134071=>13706,171339=>13717,194611=>13719,24378=>13720,11945=>13729,20465=>13731,63753=>13739,11964=>13747,194732=>13750,26435=>13751,133732=>13755,35329=>13756,25142=>13757,21555=>13760,23067=>13761,25221=>13765,194819=>13768,21567=>13775,27506=>13785,29986=>13790,19256=>13791,24063=>13794,194827=>13801,29626=>13802,134047=>13803,194600=>13807,194849=>13809,194623=>13815,194675=>13832,11916=>13833,11917=>13834,23577=>13835,131083=>13839,23426=>13840,194642=>13841,11997=>13847,11999=>13848,39136=>13848,11998=>13849,169599=>13849,14221=>13850,11927=>13852,14586=>13852,194887=>13854,11909=>13856,20155=>13856,131490=>13857,13599=>13865,194738=>13867,11971=>13870,35200=>13870,31237=>13875,35498=>13880,32085=>13882,28568=>13884,25591=>13892,30246=>13893,11978=>13898,163767=>13898,146686=>13904,13351=>13910,33067=>13913,194842=>13916,11950=>13922,154327=>13922,194714=>13928,194831=>13932,22305=>13952,135741=>13953,194586=>13954,64003=>13956,21534=>13964,15240=>13965,20839=>13966,63839=>13971,20023=>13981,11946=>13995,150804=>13995,24421=>13996,23020=>13997,194658=>13998,24217=>14000,13416=>14047,40884=>14048,21200=>14056,38376=>14061,26625=>14066,195024=>14068,195039=>14069,153215=>14075,11959=>14078,36534=>14083,63775=>14084,63875=>14088,31867=>14094,63906=>14095,63898=>14097,11961=>14099,32770=>14099,157360=>14100,11911=>14105,132648=>14105,131210=>14108,133508=>14109,194604=>14109,11915=>14110,13630=>14110,21589=>14115,22841=>14117,23414=>14120,194669=>14121,23572=>14122,14306=>14123,23782=>14124,20040=>14126,194742=>14129,158105=>14134,25371=>14135,26211=>14138,194779=>14140,27126=>14143,27014=>14144,27596=>14148,28183=>14150,27818=>14153,11942=>14157,20012=>14157,29935=>14160,30069=>14161,30188=>14162,30286=>14163,16305=>14164,30570=>14165,30633=>14166,31571=>14173,16996=>14176,194924=>14180,32328=>14183,132415=>14188,11955=>14189,156266=>14189,33089=>14194,17491=>14195,33401=>14197,11966=>14197,64094=>14198,11967=>14198,64093=>14199,11968=>14199,20857=>14201,33626=>14202,17701=>14206,34292=>14208,131248=>14209,34429=>14214,13358=>14216,35014=>14217,18406=>14224,36808=>14233,166279=>14253,167447=>14256,38969=>14259,39432=>14266,39903=>14271,148206=>14282,21385=>14288,64017=>14290,194785=>14291,146622=>14293,132625=>14294,19972=>14296,19973=>14297,19999=>14298,20011=>14299,20015=>14300,20016=>14301,20032=>14302,20033=>14303,20036=>14304,11907=>14305,20058=>14305,20095=>14306,20109=>14307,20118=>14308,20153=>14309,20176=>14310,20192=>14311,20221=>14312,20223=>14313,20235=>14314,20245=>14315,20320=>14316,20283=>14317,20297=>14318,20308=>14319,20346=>14320,20349=>14321,20350=>14322,20375=>14323,20414=>14324,20431=>14325,20477=>14326,20480=>14327,20481=>14328,20496=>14329,20507=>14330,20519=>14331,20526=>14332,20567=>14333,20582=>14334,20586=>14335,20539=>14336,20623=>14337,20630=>14338,20636=>14339,20684=>14340,20710=>14341,20713=>14342,20719=>14343,20744=>14344,20747=>14345,20752=>14346,20763=>14347,20766=>14348,20831=>14349,20897=>14350,20924=>14351,20974=>14353,20980=>14354,20993=>14355,11913=>14356,20994=>14356,21011=>14357,21065=>14358,21089=>14359,21094=>14360,21139=>14361,21192=>14362,21232=>14363,21258=>14364,21259=>14365,21310=>14366,21324=>14367,21323=>14368,21345=>14369,21356=>14370,21419=>14371,21466=>14372,21478=>14373,21493=>14374,21543=>14375,21581=>14376,21606=>14377,21611=>14378,21620=>14379,21645=>14380,21654=>14381,21665=>14382,21677=>14383,21689=>14384,21695=>14385,21702=>14386,21709=>14387,21774=>14388,21803=>14389,21813=>14390,21834=>14391,21856=>14392,21896=>14394,21902=>14395,22024=>14396,22030=>14397,22031=>14398,22071=>14399,22079=>14400,22089=>14401,22091=>14402,22095=>14403,22118=>14404,22121=>14405,22127=>14406,22129=>14407,22130=>14408,22165=>14409,22170=>14410,22188=>14411,22189=>14412,22193=>14413,22217=>14414,22237=>14415,22244=>14416,22282=>14417,22293=>14418,22307=>14419,22319=>14420,22323=>14421,22324=>14422,22348=>14423,22384=>14424,22412=>14425,22428=>14426,22456=>14427,22502=>14428,22509=>14429,22517=>14430,22518=>14431,22527=>14432,22537=>14433,22560=>14434,22578=>14435,22652=>14436,22656=>14437,22697=>14438,22734=>14439,22736=>14440,22740=>14441,22746=>14442,22761=>14443,22796=>14444,22820=>14445,22831=>14446,22881=>14447,22893=>14448,22986=>14449,22994=>14450,23005=>14451,23011=>14452,23012=>14453,23044=>14454,23052=>14455,23075=>14456,23111=>14457,23125=>14458,23139=>14459,23149=>14460,23166=>14461,23198=>14462,23207=>14463,23212=>14464,23219=>14465,23264=>14466,23296=>14467,23321=>14468,23333=>14469,23341=>14470,23361=>14471,23420=>14472,23422=>14473,23423=>14474,23434=>14475,11919=>14476,23587=>14476,23595=>14477,23600=>14478,23651=>14479,23657=>14480,23676=>14481,23755=>14482,23762=>14483,23796=>14484,23844=>14485,23846=>14486,23875=>14487,23878=>14488,23882=>14489,23954=>14490,23956=>14491,23961=>14492,23968=>14493,24024=>14494,24032=>14495,24056=>14496,24064=>14497,24082=>14498,24084=>14499,24085=>14500,24088=>14501,24110=>14502,24152=>14503,24171=>14504,24172=>14505,24232=>14506,24234=>14507,24254=>14508,24255=>14509,24274=>14511,24327=>14512,24334=>14513,24348=>14514,24349=>14515,24354=>14516,24360=>14517,24374=>14518,24379=>14519,24384=>14520,12089=>14521,24400=>14521,24408=>14522,24420=>14523,24457=>14524,24476=>14525,24487=>14526,24484=>14527,24495=>14528,24504=>14529,11926=>14530,24516=>14530,24521=>14531,24545=>14532,24553=>14533,24557=>14534,24572=>14535,24599=>14536,24602=>14537,24627=>14538,24673=>14539,24703=>14540,24734=>14541,24740=>14542,24752=>14543,24779=>14544,24795=>14545,24824=>14546,24850=>14547,24851=>14548,24852=>14549,24860=>14550,24956=>14551,24973=>14552,24991=>14553,25000=>14554,25026=>14555,25055=>14556,25109=>14557,25129=>14558,25155=>14559,25158=>14560,11928=>14561,25164=>14561,25169=>14562,25174=>14563,25284=>14564,25340=>14565,25354=>14566,25357=>14567,25368=>14568,25401=>14569,25410=>14570,25411=>14571,25445=>14572,25460=>14573,25469=>14574,25476=>14575,25479=>14576,25488=>14577,25502=>14578,25553=>14579,25564=>14580,25609=>14581,25616=>14582,25634=>14583,25684=>14584,25691=>14585,25709=>14586,25723=>14587,25790=>14588,25791=>14589,25829=>14590,25847=>14591,25851=>14592,25860=>14593,25878=>14594,25881=>14595,25927=>14596,25959=>14597,25985=>14598,25989=>14599,26050=>14600,26096=>14601,26098=>14602,26156=>14603,26188=>14604,26203=>14605,26204=>14606,26209=>14607,26219=>14608,26276=>14610,26312=>14611,26348=>14612,26373=>14613,26387=>14614,26419=>14615,26440=>14616,26444=>14617,26486=>14618,26491=>14619,26544=>14620,26546=>14621,26617=>14622,26583=>14623,26585=>14624,26608=>14625,26668=>14626,26672=>14627,26673=>14628,26715=>14629,26738=>14630,26741=>14631,26746=>14632,26756=>14633,26789=>14634,26802=>14635,26832=>14636,26838=>14637,26856=>14638,26861=>14639,26864=>14640,26865=>14641,26876=>14642,26897=>14643,26899=>14644,26933=>14645,26939=>14646,26967=>14647,26979=>14648,26994=>14649,27007=>14650,27008=>14651,27046=>14652,27053=>14653,27063=>14654,27094=>14655,27095=>14656,27137=>14657,27151=>14658,27157=>14659,27176=>14660,27188=>14661,27198=>14662,27205=>14663,27216=>14664,27217=>14665,27222=>14666,27227=>14667,27267=>14668,27273=>14669,27281=>14670,27293=>14671,27294=>14672,27295=>14673,27356=>14674,27367=>14675,27372=>14676,27422=>14677,27428=>14678,27445=>14679,27462=>14680,27478=>14681,27488=>14682,27522=>14683,27582=>14684,27617=>14685,27633=>14686,27664=>14687,27699=>14688,27701=>14689,11937=>14689,11938=>14690,27737=>14691,27766=>14692,27771=>14693,27781=>14694,27797=>14695,27804=>14696,27856=>14697,27860=>14698,27862=>14699,27872=>14700,27883=>14701,27884=>14702,27886=>14703,27914=>14704,27918=>14705,27921=>14706,27950=>14707,27991=>14708,27998=>14709,28005=>14710,28034=>14711,28095=>14712,28100=>14713,28106=>14714,28118=>14715,28137=>14716,28194=>14717,28241=>14718,28359=>14719,28362=>14720,28366=>14721,28413=>14722,28442=>14723,28458=>14724,28463=>14725,28467=>14726,28506=>14727,28510=>14728,28514=>14729,28541=>14730,28555=>14731,28557=>14732,28562=>14733,28564=>14734,28570=>14735,28583=>14736,28584=>14737,28598=>14738,28634=>14739,28638=>14740,28729=>14742,28732=>14743,28756=>14745,28765=>14746,28766=>14747,28772=>14748,11939=>14749,28780=>14749,28798=>14750,28801=>14751,28821=>14752,28855=>14753,28883=>14754,28884=>14755,28888=>14756,28892=>14757,28935=>14758,28960=>14759,28977=>14760,29002=>14761,29010=>14762,29024=>14763,29049=>14764,29074=>14765,29131=>14767,29139=>14768,29142=>14769,29184=>14770,29213=>14771,29227=>14772,29240=>14773,29249=>14774,29267=>14775,29269=>14776,29270=>14777,29276=>14778,29325=>14779,11944=>14780,29357=>14780,29364=>14781,29383=>14782,29435=>14783,29444=>14784,29445=>14785,29480=>14786,29489=>14787,29507=>14788,29548=>14789,29564=>14790,29571=>14791,29573=>14792,29574=>14793,29589=>14794,29598=>14795,29599=>14796,29600=>14797,29606=>14798,29611=>14799,29621=>14800,29623=>14801,29628=>14802,29647=>14803,29657=>14804,29673=>14805,29684=>14806,29693=>14807,29700=>14808,29706=>14809,29722=>14810,29723=>14811,29732=>14812,29736=>14813,29740=>14814,29743=>14815,29744=>14816,29745=>14817,29753=>14818,29764=>14819,29767=>14820,29771=>14821,29773=>14822,29777=>14823,29783=>14824,29798=>14825,29803=>14826,29809=>14827,29824=>14828,29829=>14829,29830=>14830,29831=>14831,29840=>14832,29848=>14833,29852=>14834,29856=>14835,29859=>14836,29864=>14837,29867=>14838,29877=>14839,29887=>14840,29896=>14841,29914=>14842,29918=>14843,30030=>14844,30073=>14845,30081=>14846,30096=>14847,12135=>14848,30098=>14848,30099=>14849,30132=>14850,30180=>14851,30201=>14852,30208=>14853,30218=>14854,30229=>14855,30230=>14856,30233=>14857,30238=>14858,30253=>14859,30261=>14860,30275=>14861,30283=>14862,30309=>14863,30317=>14864,30319=>14865,30321=>14866,30324=>14867,30372=>14868,30373=>14869,30405=>14870,30412=>14871,30444=>14872,30460=>14873,30516=>14874,30518=>14875,30556=>14876,30559=>14877,30560=>14878,30578=>14879,30589=>14880,30613=>14881,30634=>14882,30694=>14883,30704=>14884,30708=>14885,30726=>14886,30754=>14887,30765=>14888,30766=>14889,30768=>14890,30773=>14891,30824=>14892,30878=>14893,30920=>14894,30924=>14895,30926=>14896,30948=>14897,30944=>14898,30945=>14899,30962=>14900,30967=>14901,30971=>14902,31025=>14903,11949=>14905,31035=>14905,31037=>14906,31045=>14907,31067=>14908,31068=>14909,31115=>14910,31126=>14911,31128=>14912,12145=>14913,31160=>14913,31163=>14914,31178=>14915,31194=>14916,31235=>14917,31241=>14918,31249=>14919,31262=>14920,31277=>14921,31289=>14922,31301=>14923,31308=>14924,31325=>14925,31341=>14927,31352=>14928,31392=>14929,31395=>14930,31411=>14931,31419=>14932,31420=>14933,31430=>14934,31495=>14935,31508=>14936,31527=>14937,31537=>14938,31559=>14939,31566=>14940,31584=>14941,31593=>14942,31597=>14943,31602=>14944,31633=>14945,31663=>14946,31703=>14947,31705=>14948,31755=>14949,31759=>14950,31776=>14951,31782=>14952,31793=>14953,31798=>14954,31825=>14955,31833=>14956,31847=>14957,31854=>14958,31856=>14959,31932=>14960,31935=>14961,31944=>14962,31945=>14963,31959=>14964,31961=>14965,31965=>14966,31979=>14967,32007=>14968,32008=>14969,32009=>14970,32019=>14971,32029=>14972,32035=>14973,32065=>14974,32083=>14975,32089=>14976,32093=>14977,32122=>14978,32134=>14979,32139=>14980,32140=>14981,32204=>14982,32235=>14983,32241=>14984,32249=>14985,32264=>14986,32273=>14987,32277=>14988,32288=>14989,32327=>14990,32354=>14991,32366=>14992,32371=>14993,32397=>14994,32401=>14995,32408=>14996,32580=>14997,32591=>14998,11947=>14999,11954=>14999,32594=>14999,11953=>15000,32595=>15000,32609=>15001,32657=>15002,32703=>15003,32718=>15004,32735=>15005,32741=>15006,32748=>15007,32750=>15008,32751=>15009,32762=>15010,32782=>15011,32785=>15012,32788=>15013,32804=>15014,32806=>15015,32826=>15016,32828=>15017,32864=>15018,32881=>15019,32885=>15020,32926=>15021,32934=>15022,32939=>15023,32983=>15024,32984=>15025,33046=>15026,33048=>15027,33082=>15028,33098=>15029,33100=>15030,33153=>15031,33156=>15032,33204=>15033,33231=>15034,33273=>15035,33283=>15036,33313=>15037,33330=>15038,33332=>15039,33350=>15040,33355=>15041,33359=>15042,33422=>15043,33454=>15044,33463=>15045,33470=>15046,33478=>15047,33534=>15048,33603=>15049,33617=>15050,33621=>15051,33670=>15052,33677=>15053,33682=>15054,33688=>15055,33705=>15056,33727=>15057,33728=>15058,33770=>15059,33807=>15060,33809=>15061,33866=>15062,33910=>15063,33960=>15064,33967=>15065,33984=>15066,33986=>15067,34032=>15068,34045=>15069,34060=>15070,34100=>15071,34142=>15072,34191=>15073,34231=>15074,34254=>15075,34221=>15076,34322=>15077,34345=>15078,34386=>15079,34403=>15080,34412=>15081,34415=>15082,34426=>15083,34445=>15084,34449=>15085,34456=>15086,34471=>15087,34472=>15088,34554=>15089,34557=>15090,34571=>15091,34579=>15092,34585=>15093,34590=>15094,34600=>15095,34622=>15096,34673=>15097,34696=>15098,34713=>15099,34732=>15100,34733=>15101,34741=>15102,34774=>15103,34795=>15104,34797=>15105,34817=>15106,34822=>15108,34827=>15109,34836=>15110,34844=>15111,34902=>15112,34911=>15113,11970=>15114,34916=>15114,34968=>15115,34986=>15116,35005=>15117,35006=>15118,35018=>15119,35026=>15120,35035=>15121,35056=>15122,35057=>15123,35078=>15124,35096=>15125,35097=>15126,35098=>15127,35111=>15128,35120=>15129,35134=>15130,35195=>15131,35284=>15132,35286=>15133,35301=>15134,35313=>15135,35335=>15136,35343=>15137,35349=>15138,35362=>15139,35406=>15140,35455=>15141,35572=>15142,35615=>15143,35639=>15144,35651=>15145,35652=>15146,35668=>15147,35740=>15148,35742=>15149,35911=>15150,35924=>15151,35955=>15152,36004=>15153,36057=>15154,36065=>15155,36088=>15156,36094=>15157,36123=>15158,36201=>15159,36204=>15160,36228=>15161,36237=>15162,36245=>15163,36262=>15164,36294=>15165,36302=>15166,36324=>15167,36332=>15168,36384=>15169,36427=>15170,36460=>15171,36464=>15172,36474=>15173,36498=>15174,36526=>15175,36531=>15176,36561=>15177,36564=>15178,36601=>15179,36631=>15180,36662=>15181,36774=>15182,12193=>15183,36789=>15183,11981=>15184,36790=>15184,36832=>15186,36836=>15187,36854=>15188,36866=>15189,36908=>15190,36932=>15191,37000=>15192,37013=>15193,37017=>15194,37019=>15195,37026=>15196,37044=>15197,37079=>15198,37085=>15199,37108=>15200,37143=>15201,37148=>15202,37169=>15203,37178=>15204,37181=>15205,37192=>15206,37211=>15207,37217=>15208,37220=>15209,37262=>15210,37278=>15211,37288=>15212,37293=>15213,37294=>15214,37298=>15215,37308=>15216,37360=>15217,37367=>15218,37371=>15219,37383=>15220,37416=>15221,37427=>15222,37432=>15223,37443=>15224,37447=>15225,37455=>15226,37472=>15227,37570=>15228,37579=>15229,37580=>15230,37599=>15231,37645=>15232,37653=>15233,37663=>15234,37671=>15235,37703=>15236,37714=>15237,37738=>15239,37741=>15240,37787=>15241,37818=>15242,37801=>15243,37825=>15244,37834=>15245,37858=>15246,37882=>15247,37885=>15248,37903=>15249,37940=>15250,37951=>15251,37973=>15252,37995=>15253,38002=>15254,11986=>15255,38264=>15255,38310=>15256,38313=>15257,38324=>15259,38333=>15260,38362=>15261,11983=>15262,11990=>15262,38429=>15262,38465=>15263,38488=>15264,38532=>15265,38564=>15266,38569=>15267,38610=>15268,195060=>15269,38622=>15270,38633=>15271,38641=>15272,38658=>15273,38665=>15274,38746=>15275,38755=>15276,38766=>15277,38771=>15278,38810=>15279,38818=>15280,38837=>15281,38838=>15282,38873=>15283,38878=>15284,38900=>15285,38922=>15286,38926=>15287,38942=>15288,38947=>15289,38955=>15290,38974=>15291,38994=>15292,38995=>15293,39001=>15294,39020=>15295,39096=>15296,39098=>15297,39103=>15298,39112=>15299,39141=>15300,39218=>15301,39219=>15302,39232=>15303,39245=>15304,39260=>15305,39263=>15306,39345=>15307,39353=>15308,39354=>15309,39369=>15310,39426=>15311,39446=>15312,39460=>15313,39463=>15314,39469=>15315,39470=>15316,39478=>15317,39480=>15318,39498=>15319,39510=>15320,39605=>15321,39606=>15322,39673=>15323,39683=>15324,39712=>15325,39731=>15326,39732=>15327,39795=>15328,39801=>15329,39847=>15330,39873=>15331,39879=>15332,39895=>15333,39911=>15334,39915=>15335,39927=>15336,39930=>15337,39933=>15338,39947=>15339,39975=>15340,39978=>15341,39990=>15342,40001=>15343,40019=>15344,40035=>15345,40048=>15346,40055=>15347,40194=>15348,40258=>15349,40263=>15350,40291=>15351,40297=>15352,40316=>15353,40318=>15354,40333=>15355,40369=>15356,40387=>15357,40391=>15358,40406=>15359,40415=>15360,40427=>15361,40436=>15362,40469=>15363,40477=>15364,40612=>15365,40616=>15366,40620=>15367,40679=>15368,40686=>15369,40720=>15370,40722=>15371,40727=>15372,40729=>15373,40751=>15374,40759=>15375,40761=>15376,40769=>15377,40773=>15378,40791=>15379,40808=>15380,40817=>15381,40821=>15382,40848=>15383,40852=>15384,40866=>15385,13317=>15387,194564=>15388,22048=>15389,24267=>15390,11925=>15391,144954=>15393,28665=>15395,28390=>15396,29107=>15397,11940=>15398,64073=>15398,11980=>15403,64102=>15403,23986=>15405,20435=>15407,20697=>15408,20720=>15409,20931=>15410,22134=>15411,27220=>15412,27905=>15413,28112=>15414,28226=>15415,28377=>15416,29668=>15417,29729=>15418,30060=>15419,30801=>15420,34805=>15421,144382=>15422,29608=>15423,15091=>15424,13531=>15425,17420=>15426,16010=>15427,40893=>15429,19432=>15430,40892=>15431,16090=>15432,15138=>15433,40894=>15434,17786=>15435,16531=>15436,18021=>15438,16643=>15439,17043=>15440,18094=>15441,13448=>15442,140809=>15443,63584=>15444,63585=>15445,63586=>15446,63610=>15447,63615=>15448,8836=>15472,8837=>15473,8842=>15474,8843=>15475,8713=>15476,8965=>15478,8966=>15479,8741=>15489,8742=>15490,8802=>15505,8773=>15507,8776=>15508,8822=>15509,8823=>15510,8487=>15515,8922=>15725,8923=>15726,8533=>15727,8984=>15728,7742=>15729,7743=>15730,504=>15731,505=>15732,470=>15733,472=>15734,474=>15735,476=>15736,260=>15737,728=>15738,317=>15739,346=>15740,350=>15741,356=>15742,377=>15743,379=>15744,261=>15745,731=>15746,318=>15747,347=>15748,711=>15749,351=>15750,357=>15751,378=>15752,733=>15753,380=>15754,340=>15755,258=>15756,313=>15757,262=>15758,268=>15759,280=>15760,270=>15761,323=>15762,327=>15763,336=>15764,344=>15765,368=>15766,354=>15767,341=>15768,259=>15769,314=>15770,263=>15771,269=>15772,281=>15773,271=>15774,273=>15775,324=>15776,328=>15777,337=>15778,345=>15779,369=>15780,355=>15781,729=>15782,264=>15783,284=>15784,292=>15785,308=>15786,348=>15787,364=>15788,265=>15789,285=>15790,293=>15791,309=>15792,349=>15793,365=>15794,625=>15795,651=>15796,638=>15797,620=>15798,622=>15799,633=>15800,648=>15801,598=>15802,627=>15803,637=>15804,642=>15805,656=>15806,635=>15807,621=>15808,607=>15809,626=>15810,669=>15811,654=>15812,609=>15813,624=>15814,641=>15815,295=>15816,661=>15817,660=>15818,614=>15819,664=>15820,450=>15821,595=>15822,599=>15823,644=>15824,608=>15825,403=>15826,616=>15827,649=>15828,600=>15829,604=>15830,606=>15831,592=>15832,623=>15833,650=>15834,612=>15835,594=>15836,653=>15837,613=>15838,674=>15839,673=>15840,597=>15841,657=>15842,634=>15843,615=>15844,865=>15845,712=>15846,716=>15847,721=>15848,8255=>15849,783=>15850,741=>15851,742=>15852,743=>15853,744=>15854,745=>15855,805=>15858,812=>15859,825=>15860,796=>15861,799=>15862,800=>15863,829=>15864,809=>15865,815=>15866,734=>15867,804=>15868,816=>15869,828=>15870,820=>15871,797=>15872,798=>15873,792=>15874,793=>15875,810=>15876,826=>15877,827=>15878,794=>15879,610=>15883,611=>15884,618=>15885,628=>15886,630=>15887,632=>15888,640=>15889,655=>15890,665=>15891,668=>15892,671=>15893,688=>15894,690=>15895,695=>15896,705=>15897,736=>15898,737=>15899,8862=>15906,12348=>16194,12543=>16195,12310=>16197,12311=>16198,9838=>16199,9835=>16200,10548=>16201,10549=>16202,10687=>16203,12448=>16205,10746=>16207,10747=>16208,962=>16222,9461=>16223,9462=>16224,9463=>16225,9464=>16226,9465=>16227,9466=>16228,9467=>16229,9468=>16230,9469=>16231,9470=>16232,9750=>16233,9751=>16234,9649=>16235,12784=>16236,12785=>16237,12786=>16238,12787=>16239,12788=>16240,12789=>16241,12790=>16242,12791=>16243,12792=>16244,12793=>16245,12794=>16247,12795=>16248,12796=>16249,12797=>16250,12798=>16251,12799=>16252,9150=>16253,9151=>16254,9152=>16255,9153=>16256,9154=>16257,9155=>16258,9156=>16259,9157=>16260,9158=>16261,9159=>16262,9160=>16263,9161=>16264,9162=>16265,9163=>16266,9164=>16267,10003=>16270,9251=>16272,9166=>16273,9680=>16274,9681=>16275,9682=>16276,9683=>16277,8263=>16278,8264=>16279,8273=>16281,8258=>16282,12688=>16283,12689=>16284,12690=>16285,12691=>16286,12692=>16287,12693=>16288,12694=>16289,12695=>16290,12696=>16291,12697=>16292,12698=>16293,12699=>16294,12700=>16295,12701=>16296,12702=>16297,12703=>16298,9136=>16312,9137=>16313,9842=>16314,9843=>16315,9844=>16316,9845=>16317,9846=>16318,9847=>16319,9848=>16320,9849=>16321,9850=>16322,9851=>16323,9852=>16324,9853=>16325,12441=>16326,12442=>16327,8413=>16328,20296=>16779,20319=>16780,20330=>16781,20332=>16782,20494=>16783,20504=>16784,20545=>16785,20722=>16786,20688=>16787,20742=>16788,20739=>16789,20789=>16790,20821=>16791,20823=>16792,13493=>16793,20938=>16794,20962=>16795,21079=>16796,21196=>16797,21206=>16798,21243=>16799,21276=>16800,21347=>16801,21405=>16802,21522=>16803,21631=>16804,21640=>16805,21840=>16806,21889=>16807,21933=>16808,21966=>16809,22075=>16810,22174=>16811,22185=>16812,22195=>16813,22391=>16814,22396=>16815,135963=>16816,22479=>16817,22500=>16818,22628=>16819,22665=>16820,136302=>16821,22738=>16822,22752=>16823,34369=>16824,22923=>16825,22930=>16826,22979=>16827,23059=>16828,23143=>16829,23159=>16830,23172=>16831,23236=>16832,137405=>16833,23421=>16834,23443=>16835,23570=>16836,64060=>16837,136884=>16838,23674=>16839,23695=>16840,23711=>16841,23715=>16842,23722=>16843,23760=>16844,138804=>16845,23821=>16846,23879=>16847,23937=>16848,23972=>16849,23975=>16850,24011=>16851,24158=>16852,24313=>16853,24320=>16854,24322=>16855,24355=>16856,24381=>16857,24404=>16858,24445=>16859,24589=>16860,24596=>16861,24600=>16862,24629=>16863,24647=>16864,24733=>16865,24788=>16866,24797=>16867,24875=>16868,25020=>16869,25017=>16870,25122=>16871,25178=>16872,25199=>16873,25302=>16874,25468=>16875,25573=>16876,25721=>16877,25796=>16878,25808=>16879,25897=>16880,26013=>16881,26170=>16882,26146=>16883,26155=>16884,26160=>16885,26163=>16886,26184=>16887,143812=>16888,26231=>16889,26232=>16890,26253=>16891,26299=>16892,26331=>16893,26344=>16894,26439=>16895,26497=>16896,26515=>16897,26520=>16898,26523=>16899,26620=>16900,26653=>16901,26787=>16902,26890=>16903,26953=>16904,144836=>16905,26946=>16906,26980=>16907,27045=>16908,27087=>16909,15286=>16910,15299=>16911,27113=>16912,27125=>16913,145215=>16914,27195=>16915,145251=>16916,27284=>16917,27301=>16918,15375=>16919,27419=>16920,27436=>16921,27495=>16922,27561=>16923,27565=>16924,27607=>16925,27647=>16926,27653=>16927,27764=>16928,27800=>16929,27899=>16930,27846=>16931,27953=>16932,27961=>16933,27967=>16934,27992=>16935,28052=>16936,28074=>16937,28123=>16938,28125=>16939,28228=>16940,28254=>16941,28337=>16942,28353=>16943,28432=>16944,28505=>16945,28513=>16946,28542=>16947,28556=>16948,28576=>16949,28604=>16950,28615=>16951,28618=>16952,28656=>16953,28750=>16954,28789=>16955,28836=>16956,28900=>16957,28971=>16958,28958=>16959,28974=>16960,29009=>16961,29032=>16962,29061=>16963,29063=>16964,29114=>16965,29124=>16966,29205=>16967,15935=>16968,29339=>16969,149489=>16970,29479=>16971,29520=>16972,29542=>16973,29602=>16974,29739=>16975,29766=>16976,29794=>16977,29805=>16978,29862=>16979,29865=>16980,29897=>16981,29951=>16982,29975=>16983,16242=>16984,30158=>16985,30210=>16986,30216=>16987,30308=>16988,30337=>16989,30365=>16990,30378=>16991,30390=>16992,30414=>16993,30420=>16994,30438=>16995,30449=>16996,30474=>16997,30489=>16998,30541=>16999,30542=>17000,30586=>17001,30592=>17002,30612=>17003,30688=>17004,152718=>17005,30787=>17006,30830=>17007,30896=>17008,152846=>17009,30893=>17010,30976=>17011,31004=>17012,31022=>17013,31028=>17014,31046=>17015,31097=>17016,31176=>17017,153457=>17018,31188=>17019,31198=>17020,31211=>17021,31213=>17022,31365=>17023,154052=>17024,31438=>17025,31485=>17026,31506=>17027,31533=>17028,31547=>17029,31599=>17030,31745=>17031,31795=>17032,155041=>17033,31853=>17034,31865=>17035,31887=>17036,31892=>17037,31904=>17038,31957=>17039,32049=>17040,32092=>17041,32131=>17042,32166=>17043,32194=>17044,32296=>17045,32663=>17046,32731=>17047,32821=>17048,32823=>17049,32970=>17050,32992=>17051,33011=>17052,33120=>17053,33127=>17054,33128=>17055,33133=>17056,33211=>17057,33226=>17058,33239=>17059,17499=>17060,33376=>17061,33396=>17062,158463=>17063,33441=>17064,33443=>17065,33444=>17066,33449=>17067,33471=>17068,33493=>17069,33533=>17070,33536=>17071,33570=>17072,33581=>17073,33594=>17074,33607=>17075,33661=>17076,33703=>17077,33743=>17078,33745=>17079,33761=>17080,33793=>17081,33798=>17082,33887=>17083,33904=>17084,33907=>17085,33925=>17086,33950=>17087,33978=>17088,159296=>17089,34098=>17090,34078=>17091,34095=>17092,34148=>17093,34170=>17094,34188=>17095,34210=>17096,34251=>17097,34285=>17098,34303=>17099,34308=>17100,34309=>17101,34320=>17102,159988=>17103,34328=>17104,34360=>17105,34391=>17106,34402=>17107,17821=>17108,34421=>17109,34488=>17110,34556=>17111,34695=>17112,17898=>17113,34826=>17114,34832=>17115,35022=>17116,161412=>17117,35122=>17118,35129=>17119,35136=>17120,35220=>17121,35318=>17122,35399=>17123,35421=>17124,35425=>17125,35445=>17126,35536=>17127,35654=>17128,35673=>17129,35689=>17130,35741=>17131,35913=>17132,35944=>17133,36271=>17134,36305=>17135,36311=>17136,36387=>17137,36413=>17138,36475=>17139,164471=>17140,18500=>17141,36602=>17142,36638=>17143,36653=>17144,36692=>17145,164813=>17146,36840=>17147,36846=>17148,36872=>17149,36909=>17150,37015=>17151,37043=>17152,37054=>17153,37060=>17154,37061=>17155,37063=>17156,37103=>17157,37140=>17158,37142=>17159,37154=>17160,37155=>17161,37167=>17162,37172=>17163,37251=>17164,37361=>17165,37705=>17166,37732=>17167,37733=>17168,37795=>17169,37855=>17170,37892=>17171,37939=>17172,37962=>17173,37987=>17174,38001=>17175,38286=>17176,38303=>17177,38316=>17178,38326=>17179,38347=>17180,38352=>17181,38355=>17182,18864=>17183,38366=>17184,38565=>17185,38639=>17186,38734=>17187,38805=>17188,38830=>17189,38842=>17190,38849=>17191,38857=>17192,38875=>17193,38998=>17194,39143=>17195,39256=>17196,39427=>17197,39617=>17198,39619=>17199,39630=>17200,39638=>17201,39682=>17202,39688=>17203,19479=>17204,39725=>17205,39774=>17206,39782=>17207,39812=>17208,39818=>17209,39838=>17210,39886=>17211,39909=>17212,39928=>17213,39971=>17214,40015=>17215,40016=>17216,40037=>17217,40221=>17218,40222=>17219,40259=>17220,40274=>17221,40330=>17222,40342=>17223,40384=>17224,40364=>17225,40380=>17226,172432=>17227,40423=>17228,40455=>17229,40606=>17230,40623=>17231,40855=>17232,131209=>17233,19970=>17234,19983=>17235,19986=>17236,20009=>17237,20014=>17238,20039=>17239,131234=>17240,20049=>17241,13318=>17242,131236=>17243,20073=>17244,20125=>17245,13356=>17246,20156=>17247,20163=>17248,20168=>17249,20203=>17250,20186=>17251,20209=>17252,20213=>17253,20246=>17254,20324=>17255,20279=>17256,20286=>17257,20312=>17258,131603=>17259,20343=>17260,20344=>17261,20354=>17262,20357=>17263,20454=>17264,20402=>17265,20421=>17266,20427=>17267,20434=>17268,13418=>17269,20466=>17270,20499=>17271,20508=>17272,20558=>17273,20563=>17274,20579=>17275,20643=>17276,20616=>17277,20626=>17278,20627=>17279,20629=>17280,20650=>17281,131883=>17282,20657=>17283,20666=>17284,20667=>17285,20676=>17286,20679=>17287,20723=>17288,131969=>17289,20686=>17290,131953=>17291,20692=>17292,20705=>17293,13458=>17294,132089=>17295,20759=>17296,132170=>17297,20832=>17298,132361=>17299,20851=>17300,20867=>17301,20875=>17302,13500=>17303,20888=>17304,20899=>17305,20909=>17306,13511=>17307,132566=>17308,20979=>17309,21010=>17310,21014=>17311,132943=>17312,21077=>17313,21084=>17314,21100=>17315,21111=>17316,21124=>17317,21122=>17318,133127=>17319,21144=>17320,133178=>17321,21156=>17322,21178=>17323,21179=>17324,21194=>17325,21201=>17326,133305=>17327,21239=>17328,21301=>17329,21314=>17330,133500=>17331,133533=>17332,21351=>17333,21370=>17334,21412=>17335,21428=>17336,133843=>17337,21431=>17338,21440=>17339,133917=>17340,13661=>17341,13662=>17342,21461=>17343,13667=>17344,21492=>17345,21540=>17346,21544=>17347,13678=>17348,21571=>17349,21602=>17350,21612=>17351,21653=>17352,21664=>17353,21670=>17354,21678=>17355,21687=>17356,21690=>17357,21699=>17358,134469=>17359,21740=>17360,21743=>17361,21745=>17362,21747=>17363,21760=>17364,21761=>17365,21769=>17366,21820=>17367,21825=>17368,13734=>17369,21831=>17370,13736=>17371,21860=>17372,134625=>17373,21885=>17374,21890=>17375,21905=>17376,13765=>17377,21970=>17378,134805=>17379,134765=>17380,21951=>17381,21961=>17382,21964=>17383,21969=>17384,21981=>17385,13786=>17386,21986=>17387,134756=>17388,21993=>17389,22056=>17390,135007=>17391,22023=>17392,22032=>17393,22064=>17394,13812=>17395,22077=>17396,22080=>17397,22087=>17398,22110=>17399,22112=>17400,22125=>17401,13829=>17402,22152=>17403,22156=>17404,22173=>17405,22184=>17406,22194=>17407,22213=>17408,22221=>17409,22239=>17410,22248=>17411,22262=>17412,22263=>17413,135681=>17414,135765=>17415,22313=>17416,135803=>17417,22341=>17418,22342=>17419,22349=>17420,135796=>17421,22376=>17422,22383=>17423,22387=>17424,22388=>17425,22389=>17426,22395=>17427,135908=>17428,135895=>17429,22426=>17430,22429=>17431,22430=>17432,22440=>17433,22487=>17434,135933=>17435,22476=>17436,135990=>17437,136004=>17438,22494=>17439,22512=>17440,13898=>17441,22520=>17442,22523=>17443,22525=>17444,22532=>17445,22558=>17446,22567=>17447,22585=>17448,136132=>17449,22601=>17450,22604=>17451,22631=>17452,22666=>17453,22667=>17454,22669=>17455,22671=>17456,22672=>17457,22676=>17458,22685=>17459,22698=>17460,22705=>17461,136301=>17462,22723=>17463,22733=>17464,22754=>17465,22771=>17466,22772=>17467,22789=>17468,22790=>17469,22797=>17470,22804=>17471,136663=>17472,13969=>17473,22845=>17474,13977=>17475,22854=>17476,13974=>17477,158761=>17478,22879=>17479,136775=>17480,22901=>17481,22902=>17482,22908=>17483,22943=>17484,22958=>17485,22972=>17486,22984=>17487,22989=>17488,23006=>17489,23015=>17490,23022=>17491,136966=>17492,137026=>17493,14031=>17494,23053=>17495,23063=>17496,23079=>17497,23085=>17498,23141=>17499,23162=>17500,23179=>17501,23196=>17502,23199=>17503,23200=>17504,23202=>17505,23217=>17506,23221=>17507,23226=>17508,23231=>17509,23258=>17510,23260=>17511,23269=>17512,23280=>17513,23278=>17514,23285=>17515,23304=>17516,23319=>17517,23348=>17518,23372=>17519,23378=>17520,23400=>17521,23407=>17522,23425=>17523,23428=>17524,137667=>17525,23446=>17526,23468=>17527,14177=>17528,14178=>17529,23502=>17530,23510=>17531,14188=>17532,14187=>17533,23537=>17534,23549=>17535,14197=>17536,23555=>17537,23593=>17538,138326=>17539,23647=>17540,23655=>17541,23656=>17542,23664=>17543,138541=>17544,138565=>17545,138616=>17546,138594=>17547,23688=>17548,23690=>17549,14273=>17550,138657=>17551,138652=>17552,23712=>17553,23714=>17554,23719=>17555,138642=>17556,23725=>17557,23733=>17558,138679=>17559,23753=>17560,138720=>17561,138803=>17562,23814=>17563,23824=>17564,23851=>17565,23837=>17566,23840=>17567,23857=>17568,23865=>17569,14312=>17570,23905=>17571,23914=>17572,14324=>17573,23920=>17574,139038=>17575,14333=>17576,23944=>17577,14336=>17578,23959=>17579,23984=>17580,23988=>17581,139126=>17582,24017=>17583,24023=>17584,139258=>17585,24036=>17586,24041=>17587,14383=>17588,14390=>17589,14400=>17590,24095=>17591,24126=>17592,24137=>17593,14428=>17594,24150=>17595,14433=>17596,24173=>17597,24174=>17598,139643=>17599,24229=>17600,24236=>17601,24249=>17602,24262=>17603,24281=>17604,140062=>17605,24317=>17606,24328=>17607,140205=>17608,24350=>17609,24391=>17610,24419=>17611,24434=>17612,24446=>17613,24463=>17614,24482=>17615,24519=>17616,24523=>17617,24530=>17618,24531=>17619,24532=>17620,24546=>17621,24558=>17622,24559=>17623,24563=>17624,14615=>17625,24610=>17626,24612=>17627,14618=>17628,24652=>17629,24725=>17630,24744=>17631,141043=>17632,24753=>17633,24766=>17634,24776=>17635,24793=>17636,24814=>17637,24821=>17638,24848=>17639,24857=>17640,24862=>17641,24890=>17642,14703=>17643,24897=>17644,24902=>17645,24928=>17646,141403=>17647,24978=>17648,24979=>17649,24983=>17650,24997=>17651,25005=>17652,141483=>17653,25045=>17654,25053=>17655,25077=>17656,141711=>17657,25123=>17658,25170=>17659,25185=>17660,25188=>17661,25211=>17662,25197=>17663,25203=>17664,25241=>17665,25301=>17666,142008=>17667,25341=>17668,25347=>17669,25360=>17670,142159=>17671,142160=>17672,25394=>17673,25397=>17674,25403=>17675,25404=>17676,25409=>17677,25412=>17678,25422=>17679,142150=>17680,25433=>17681,142365=>17682,142246=>17683,25452=>17684,25497=>17685,142372=>17686,25492=>17687,25533=>17688,25556=>17689,25557=>17690,25568=>17691,25579=>17692,25580=>17693,25586=>17694,25630=>17695,25637=>17696,25641=>17697,25647=>17698,25690=>17699,25693=>17700,25715=>17701,25725=>17702,25735=>17703,25745=>17704,25759=>17705,25803=>17706,25804=>17707,25813=>17708,25815=>17709,142817=>17710,25828=>17711,25855=>17712,14958=>17713,25871=>17714,25876=>17715,14963=>17716,25886=>17717,25906=>17718,25924=>17719,25940=>17720,25963=>17721,25978=>17722,25988=>17723,25994=>17724,26034=>17725,26037=>17726,26040=>17727,26047=>17728,26057=>17729,26068=>17730,15062=>17731,26105=>17732,26108=>17733,26116=>17734,26120=>17735,26145=>17736,26154=>17737,26181=>17738,26193=>17739,26190=>17740,15082=>17741,143811=>17742,143861=>17743,143798=>17744,26218=>17745,26220=>17746,26221=>17747,26235=>17748,26240=>17749,26256=>17750,26258=>17751,15118=>17752,26285=>17753,26289=>17754,26293=>17755,15130=>17756,15132=>17757,15063=>17758,26369=>17759,26386=>17760,144242=>17761,26393=>17762,144339=>17763,144338=>17764,26445=>17765,26452=>17766,26461=>17767,144336=>17768,144356=>17769,144341=>17770,26484=>17771,144346=>17772,26514=>17773,144351=>17774,33635=>17775,26640=>17776,26563=>17777,26568=>17778,26578=>17779,26587=>17780,26615=>17781,144458=>17782,144465=>17783,144459=>17784,26648=>17785,26655=>17786,26669=>17787,144485=>17788,26675=>17789,26683=>17790,26686=>17791,26693=>17792,26697=>17793,26700=>17794,26709=>17795,26711=>17796,15223=>17797,26731=>17798,26734=>17799,26748=>17800,26754=>17801,26768=>17802,26774=>17803,15213=>17804,26776=>17805,26777=>17806,26778=>17807,26780=>17808,26794=>17809,26795=>17810,26804=>17811,26811=>17812,26875=>17813,144612=>17814,144730=>17815,26819=>17816,26821=>17817,26828=>17818,26841=>17819,26852=>17820,26853=>17821,26860=>17822,26871=>17823,26883=>17824,26887=>17825,15239=>17826,144788=>17827,15245=>17828,26950=>17829,26985=>17830,26988=>17831,27002=>17832,27026=>17833,15268=>17834,27030=>17835,27056=>17836,27066=>17837,27068=>17838,27072=>17839,27089=>17840,144953=>17841,144967=>17842,144952=>17843,27107=>17844,27118=>17845,27119=>17846,27123=>17847,15309=>17848,27124=>17849,27134=>17850,27153=>17851,27162=>17852,27165=>17853,145180=>17854,27186=>17855,27187=>17856,27199=>17857,27209=>17858,27258=>17859,27214=>17860,27218=>17861,27236=>17862,145164=>17863,27275=>17864,15344=>17865,27297=>17866,145252=>17867,27307=>17868,27325=>17869,27334=>17870,27348=>17871,27344=>17872,27357=>17873,145407=>17874,145383=>17875,27377=>17876,27378=>17877,27379=>17878,27389=>17879,145444=>17880,27403=>17881,27407=>17882,27408=>17883,27409=>17884,145469=>17885,27415=>17886,15398=>17887,27439=>17888,27466=>17889,27480=>17890,27500=>17891,27509=>17892,11934=>17893,27514=>17893,27521=>17894,27547=>17895,27566=>17896,146072=>17897,27581=>17898,27591=>17899,27592=>17900,27593=>17901,27610=>17902,27622=>17903,27623=>17904,27630=>17905,27650=>17906,27658=>17907,27662=>17908,27702=>17909,146559=>17910,27725=>17911,27739=>17912,27757=>17913,27780=>17914,27785=>17915,15555=>17916,27796=>17917,27799=>17918,27821=>17919,27842=>17920,15570=>17921,27868=>17922,27881=>17923,27885=>17924,146688=>17925,27904=>17926,27940=>17927,27942=>17928,27943=>17929,27751=>17930,27951=>17931,27964=>17932,27995=>17933,28000=>17934,28016=>17935,28032=>17936,28033=>17937,28042=>17938,28045=>17939,28049=>17940,28056=>17941,146752=>17942,146938=>17943,146937=>17944,146899=>17945,28075=>17946,28078=>17947,28084=>17948,28098=>17949,27956=>17950,28104=>17951,28110=>17952,28127=>17953,28150=>17954,28214=>17955,28190=>17956,15633=>17957,28210=>17958,28232=>17959,28233=>17960,28235=>17961,28236=>17962,28239=>17963,28243=>17964,28244=>17965,28247=>17966,28259=>17967,15646=>17968,28307=>17969,28327=>17970,28340=>17971,28355=>17972,28469=>17973,28395=>17974,28409=>17975,28411=>17976,28426=>17977,28428=>17978,28440=>17979,28453=>17980,28470=>17981,28476=>17982,147326=>17983,28498=>17984,28503=>17985,28512=>17986,28520=>17987,28560=>17988,28566=>17989,28606=>17990,28575=>17991,28581=>17992,28591=>17993,15716=>17994,28616=>17995,28617=>17996,28649=>17997,147606=>17998,28668=>17999,28672=>18000,28682=>18001,28707=>18002,147715=>18003,28730=>18004,28739=>18005,28743=>18006,28747=>18007,15770=>18008,28773=>18009,28777=>18010,28782=>18011,28790=>18012,28806=>18013,28823=>18014,147910=>18015,28831=>18016,28849=>18017,147966=>18018,28908=>18019,28874=>18020,28881=>18021,28931=>18022,28934=>18023,28936=>18024,28940=>18025,15808=>18026,28975=>18027,29008=>18028,29011=>18029,29022=>18030,15828=>18031,29078=>18032,29056=>18033,29083=>18034,29088=>18035,29090=>18036,29102=>18037,29103=>18038,148412=>18039,29145=>18040,29148=>18041,29191=>18042,15877=>18043,29236=>18044,29241=>18045,29250=>18046,29271=>18047,29283=>18048,149033=>18049,29294=>18050,29295=>18051,29304=>18052,29311=>18053,29326=>18054,149157=>18055,29358=>18056,29360=>18057,29377=>18058,15968=>18059,29388=>18060,15974=>18061,15976=>18062,29427=>18063,29434=>18064,29447=>18065,29458=>18066,29464=>18067,29465=>18068,16003=>18069,29497=>18070,29484=>18071,29491=>18072,29501=>18073,29522=>18074,16020=>18075,29547=>18076,149654=>18077,29550=>18078,29551=>18079,29553=>18080,29569=>18081,29578=>18082,29588=>18083,29592=>18084,29596=>18085,29605=>18086,29625=>18087,29631=>18088,29637=>18089,29643=>18090,29665=>18091,29671=>18092,29689=>18093,29715=>18094,29690=>18095,29697=>18096,29779=>18097,29760=>18098,29763=>18099,29778=>18100,29789=>18101,29825=>18102,29832=>18103,150093=>18104,29842=>18105,29847=>18106,29849=>18107,29857=>18108,29861=>18109,29866=>18110,29881=>18111,29883=>18112,29882=>18113,29910=>18114,29912=>18115,29931=>18116,150358=>18117,29946=>18118,150383=>18119,29984=>18120,29988=>18121,29994=>18122,16215=>18123,150550=>18124,30013=>18125,30014=>18126,30016=>18127,30024=>18128,30032=>18129,30034=>18130,30066=>18131,30065=>18132,30074=>18133,30077=>18134,30078=>18135,30092=>18136,16245=>18137,30114=>18138,16247=>18139,30128=>18140,30135=>18141,30143=>18142,30144=>18143,30150=>18144,30159=>18145,30163=>18146,30173=>18147,30175=>18148,30176=>18149,30183=>18150,30190=>18151,30193=>18152,30211=>18153,30232=>18154,30215=>18155,30223=>18156,16302=>18157,151054=>18158,30227=>18159,30235=>18160,30236=>18161,151095=>18162,30245=>18163,30248=>18164,30268=>18165,30259=>18166,151146=>18167,16329=>18168,30273=>18169,151179=>18170,30281=>18171,30293=>18172,16343=>18173,30318=>18174,30357=>18175,30369=>18176,30368=>18177,30375=>18178,30376=>18179,30383=>18180,151626=>18181,30409=>18182,151637=>18183,30440=>18184,151842=>18185,30487=>18186,30490=>18187,30509=>18188,30517=>18189,151977=>18190,16441=>18191,152037=>18192,152013=>18193,30552=>18194,152094=>18195,30588=>18196,152140=>18197,16472=>18198,30618=>18199,30623=>18200,30626=>18201,30628=>18202,30686=>18203,30687=>18204,30692=>18205,30698=>18206,30700=>18207,30715=>18208,152622=>18209,30725=>18210,30729=>18211,30733=>18212,30745=>18213,30764=>18214,30791=>18215,30826=>18216,152793=>18217,30858=>18218,30868=>18219,30884=>18220,30877=>18221,30879=>18222,30907=>18223,30933=>18224,30950=>18225,30969=>18226,30970=>18227,30974=>18228,152999=>18229,30992=>18230,31003=>18231,31013=>18232,31050=>18233,31064=>18234,16645=>18235,31079=>18236,31090=>18237,31125=>18238,31137=>18239,31145=>18240,31156=>18241,31170=>18242,31175=>18243,31180=>18244,31181=>18245,31190=>18246,16712=>18247,153513=>18248,153524=>18249,16719=>18250,31242=>18251,31253=>18252,31259=>18253,16739=>18254,31288=>18255,31303=>18256,31318=>18257,31321=>18258,31324=>18259,31327=>18260,31335=>18261,31338=>18262,31349=>18263,31362=>18264,31370=>18265,31376=>18266,31404=>18267,154068=>18268,16820=>18269,31417=>18270,31422=>18271,16831=>18272,31436=>18273,31464=>18274,31476=>18275,154340=>18276,154339=>18277,154353=>18278,31549=>18279,31530=>18280,31534=>18281,31535=>18282,16870=>18283,16883=>18284,31615=>18285,31553=>18286,16878=>18287,31573=>18288,31609=>18289,31588=>18290,31590=>18291,31603=>18292,154546=>18293,16903=>18294,31632=>18295,31643=>18296,16910=>18297,31669=>18298,31676=>18299,31685=>18300,31690=>18301,154699=>18302,154724=>18303,31700=>18304,31702=>18305,31706=>18306,31722=>18307,31728=>18308,31747=>18309,31758=>18310,31813=>18311,31818=>18312,31831=>18313,31838=>18314,31841=>18315,31849=>18316,31855=>18317,155182=>18318,155222=>18319,155237=>18320,31910=>18321,155234=>18322,31926=>18323,31927=>18324,155352=>18325,31940=>18326,155330=>18327,31949=>18328,155368=>18329,155427=>18330,31974=>18331,155484=>18332,31989=>18333,32003=>18334,17094=>18335,32018=>18336,32030=>18337,155616=>18338,155604=>18339,32061=>18340,32062=>18341,32064=>18342,32071=>18343,155660=>18344,155643=>18345,17110=>18346,32090=>18347,32106=>18348,32112=>18349,17117=>18350,32127=>18351,155671=>18352,32136=>18353,32151=>18354,155744=>18355,32157=>18356,32167=>18357,32170=>18358,32182=>18359,32192=>18360,32215=>18361,32217=>18362,32230=>18363,17154=>18364,155885=>18365,64088=>18366,32272=>18367,32279=>18368,32285=>18369,32295=>18370,32300=>18371,32325=>18372,32373=>18373,32382=>18374,32390=>18375,32391=>18376,17195=>18377,32410=>18378,17219=>18379,32572=>18380,32571=>18381,32574=>18382,32579=>18383,13505=>18384,156272=>18385,156294=>18386,32611=>18387,32612=>18388,32621=>18389,32637=>18390,32638=>18391,32656=>18392,20859=>18393,146702=>18394,32662=>18395,32668=>18396,32685=>18397,156674=>18398,32707=>18399,32719=>18400,32739=>18401,32754=>18402,32778=>18403,32776=>18404,32790=>18405,32812=>18406,32816=>18407,32835=>18408,32870=>18409,32891=>18410,32921=>18411,32924=>18412,32932=>18413,32935=>18414,32952=>18415,157310=>18416,32965=>18417,32981=>18418,32998=>18419,33037=>18420,33013=>18421,33019=>18422,17390=>18423,33077=>18424,33054=>18425,17392=>18426,33060=>18427,33063=>18428,33068=>18429,157469=>18430,33085=>18431,17416=>18432,33129=>18433,17431=>18434,17436=>18435,33157=>18436,17442=>18437,33176=>18438,33202=>18439,33217=>18440,33219=>18441,33238=>18442,33243=>18443,157917=>18444,33252=>18445,157930=>18446,33260=>18447,33277=>18448,33279=>18449,158063=>18450,33284=>18451,158173=>18452,33305=>18453,33314=>18454,158238=>18455,33340=>18456,33353=>18457,33349=>18458,158296=>18459,17526=>18460,17530=>18461,33367=>18462,158348=>18463,33372=>18464,33379=>18465,158391=>18466,17553=>18467,33405=>18468,33407=>18469,33411=>18470,33418=>18471,33427=>18472,33447=>18473,33448=>18474,33458=>18475,33460=>18476,33466=>18477,33468=>18478,33506=>18479,33512=>18480,33527=>18481,33543=>18482,33544=>18483,33548=>18484,33620=>18485,33563=>18486,33565=>18487,33584=>18488,33596=>18489,33604=>18490,33623=>18491,17598=>18492,17620=>18493,17587=>18494,33684=>18495,33685=>18496,33691=>18497,33693=>18498,33737=>18499,33744=>18500,33748=>18501,33757=>18502,33765=>18503,33785=>18504,33813=>18505,158835=>18506,33815=>18507,33849=>18508,33871=>18509,33873=>18510,33874=>18511,33881=>18512,33882=>18513,33884=>18514,158941=>18515,33893=>18516,33912=>18517,33916=>18518,33921=>18519,17677=>18520,33943=>18521,33958=>18522,33982=>18523,17672=>18524,33998=>18525,33999=>18526,34003=>18527,159333=>18528,34023=>18529,34026=>18530,34031=>18531,34033=>18532,34042=>18533,34075=>18534,34084=>18535,34085=>18536,34091=>18537,34127=>18538,34159=>18539,17731=>18540,34129=>18541,34145=>18542,34146=>18543,159636=>18544,34171=>18545,34173=>18546,34175=>18547,34177=>18548,34182=>18549,34195=>18550,34205=>18551,34207=>18552,159736=>18553,159734=>18554,159735=>18555,34236=>18556,34247=>18557,34250=>18558,34264=>18559,34265=>18560,34271=>18561,34273=>18562,34278=>18563,34294=>18564,34304=>18565,34321=>18566,34334=>18567,34337=>18568,34340=>18569,34343=>18570,160013=>18571,34361=>18572,34364=>18573,160057=>18574,34368=>18575,34387=>18576,34390=>18577,34423=>18578,34439=>18579,34441=>18580,34460=>18581,34461=>18582,34481=>18583,34483=>18584,34497=>18585,34499=>18586,34513=>18587,34517=>18588,34519=>18589,34531=>18590,34534=>18591,17848=>18592,34565=>18593,34567=>18594,34574=>18595,34576=>18596,34591=>18597,34593=>18598,34595=>18599,34609=>18600,34618=>18601,34624=>18602,34627=>18603,34641=>18604,34648=>18605,34660=>18606,34661=>18607,34674=>18608,34684=>18609,160731=>18610,160730=>18611,34727=>18612,34697=>18613,34699=>18614,34707=>18615,34720=>18616,160766=>18617,17893=>18618,34750=>18619,160784=>18620,34753=>18621,34766=>18622,34783=>18623,160841=>18624,34787=>18625,34789=>18626,34790=>18627,34794=>18628,34835=>18629,34856=>18630,34862=>18631,34866=>18632,34876=>18633,17935=>18634,34890=>18635,34904=>18636,161301=>18637,161300=>18638,34921=>18639,161329=>18640,34927=>18641,34976=>18642,35004=>18643,35008=>18644,161427=>18645,35025=>18646,35027=>18647,17985=>18648,35073=>18649,161550=>18650,35127=>18651,161571=>18652,35138=>18653,35141=>18654,35145=>18655,161618=>18656,35170=>18657,35209=>18658,35216=>18659,35231=>18660,35248=>18661,35255=>18662,35288=>18663,35307=>18664,18081=>18665,35315=>18666,35325=>18667,35327=>18668,18095=>18669,35345=>18670,35348=>18671,162181=>18672,35361=>18673,35381=>18674,35390=>18675,35397=>18676,35405=>18677,35416=>18678,35502=>18679,35472=>18680,35511=>18681,35543=>18682,35580=>18683,162436=>18684,35594=>18685,35589=>18686,35597=>18687,35612=>18688,35629=>18689,18188=>18690,35665=>18691,35678=>18692,35702=>18693,35713=>18694,35723=>18695,35732=>18696,35733=>18697,35897=>18698,162739=>18699,35901=>18700,162750=>18701,162759=>18702,35909=>18703,35919=>18704,35927=>18705,35945=>18706,35949=>18707,163000=>18708,35987=>18709,35986=>18710,35993=>18711,18276=>18712,35995=>18713,36054=>18714,36053=>18715,163232=>18716,36081=>18717,163344=>18718,36105=>18719,36110=>18720,36296=>18721,36313=>18722,36364=>18723,18429=>18724,36349=>18725,36358=>18726,163978=>18727,36372=>18728,36374=>18729,36385=>18730,36386=>18731,36391=>18732,164027=>18733,18454=>18734,36406=>18735,36409=>18736,36436=>18737,36450=>18738,36461=>18739,36463=>18740,36504=>18741,36510=>18742,36533=>18743,36539=>18744,164482=>18745,18510=>18746,164595=>18747,36608=>18748,36616=>18749,36651=>18750,36672=>18751,36682=>18752,36696=>18753,164876=>18754,36772=>18755,36788=>18756,164949=>18757,36801=>18758,36806=>18759,64036=>18760,36810=>18761,36813=>18762,36819=>18763,36821=>18764,36849=>18765,36853=>18766,36859=>18767,36876=>18768,36919=>18769,165227=>18770,36931=>18771,36957=>18772,165320=>18773,165321=>18774,36997=>18775,37004=>18776,37008=>18777,37025=>18778,18613=>18779,37040=>18780,37046=>18781,37059=>18782,37064=>18783,165591=>18784,37084=>18785,37087=>18786,165626=>18787,37110=>18788,37106=>18789,37120=>18790,37099=>18791,37118=>18792,37119=>18793,37124=>18794,37126=>18795,37144=>18796,37150=>18797,37175=>18798,37177=>18799,37190=>18800,37191=>18801,37207=>18802,37209=>18803,37236=>18804,37241=>18805,37253=>18806,37299=>18807,37302=>18808,37315=>18809,37316=>18810,166217=>18811,166214=>18812,37356=>18813,37377=>18814,37398=>18815,37399=>18816,166251=>18817,37442=>18818,37450=>18819,37462=>18820,37473=>18821,37477=>18822,37480=>18823,166280=>18824,37500=>18825,37501=>18826,37503=>18827,37513=>18828,37517=>18829,37527=>18830,37529=>18831,37535=>18832,37547=>18833,166330=>18834,166331=>18835,37554=>18836,37567=>18837,37568=>18838,37574=>18839,37582=>18840,37605=>18841,37649=>18842,166430=>18843,166441=>18844,37623=>18845,37673=>18846,166513=>18847,166467=>18848,37713=>18849,37722=>18850,37739=>18851,37745=>18852,37747=>18853,37793=>18854,166553=>18855,166605=>18856,37768=>18857,37771=>18858,37775=>18859,37790=>18860,37877=>18861,166628=>18862,166621=>18863,37873=>18864,37831=>18865,37852=>18866,37863=>18867,37897=>18868,37910=>18869,37911=>18870,37883=>18871,37938=>18872,37947=>18873,166849=>18874,166895=>18875,37997=>18876,37999=>18877,38265=>18878,38278=>18879,38284=>18880,38285=>18881,167184=>18882,167281=>18883,38344=>18884,167419=>18885,167455=>18886,38444=>18887,38451=>18888,38452=>18889,167478=>18890,38460=>18891,38497=>18892,167561=>18893,38530=>18894,167659=>18895,38554=>18896,167730=>18897,18919=>18898,38579=>18899,38586=>18900,38589=>18901,18938=>18902,167928=>18903,38616=>18904,38618=>18905,38621=>18906,18948=>18907,38676=>18908,38691=>18909,18985=>18910,38710=>18911,38721=>18912,38727=>18913,38743=>18914,38747=>18915,38762=>18916,168608=>18917,168625=>18918,38806=>18919,38814=>18920,38833=>18921,38834=>18922,38846=>18923,38860=>18924,38865=>18925,38868=>18926,38872=>18927,38881=>18928,38897=>18929,38916=>18930,38925=>18931,38932=>18932,38934=>18933,19132=>18934,169104=>18935,38962=>18936,38963=>18937,38949=>18938,38983=>18939,39014=>18940,39083=>18941,39085=>18942,39088=>18943,169423=>18944,39095=>18945,39099=>18946,39100=>18947,39106=>18948,39111=>18949,39115=>18950,39137=>18951,39139=>18952,39146=>18953,39152=>18954,39153=>18955,39155=>18956,39176=>18957,19259=>18958,169712=>18959,39190=>18960,39191=>18961,169753=>18962,39194=>18963,39195=>18964,39196=>18965,169808=>18966,39217=>18967,39226=>18968,39227=>18969,39228=>18970,39233=>18971,39238=>18972,39246=>18973,39264=>18974,39331=>18975,39334=>18976,39357=>18977,39359=>18978,39363=>18979,39380=>18980,39385=>18981,39390=>18982,170182=>18983,39408=>18984,39417=>18985,39420=>18986,39434=>18987,39441=>18988,39450=>18989,39456=>18990,39473=>18991,39492=>18992,39500=>18993,39512=>18994,19394=>18995,39599=>18996,19402=>18997,39607=>18998,19410=>18999,39609=>19000,170610=>19001,39622=>19002,39632=>19003,39634=>19004,39637=>19005,39648=>19006,39653=>19007,39657=>19008,39692=>19009,39696=>19010,39698=>19011,39702=>19012,39708=>19013,39723=>19014,39741=>19015,19488=>19016,39755=>19017,39779=>19018,39781=>19019,39787=>19020,39788=>19021,39798=>19022,39799=>19023,39846=>19024,39852=>19025,171483=>19026,39858=>19027,39864=>19028,39870=>19029,39923=>19030,39896=>19031,39901=>19032,39914=>19033,39919=>19034,39918=>19035,171541=>19036,171658=>19037,171593=>19038,39958=>19039,39960=>19040,39961=>19041,39962=>19042,39965=>19043,39970=>19044,39977=>19045,171716=>19046,39985=>19047,39991=>19048,40005=>19049,40028=>19050,171753=>19051,40009=>19052,40010=>19053,171739=>19054,40020=>19055,40024=>19056,40027=>19057,40029=>19058,40031=>19059,40041=>19060,40042=>19061,40043=>19062,40045=>19063,40046=>19064,40050=>19065,40053=>19066,40058=>19067,40166=>19068,40178=>19069,40203=>19070,171982=>19071,171991=>19071,40209=>19072,40215=>19073,40216=>19074,172079=>19075,19652=>19076,172058=>19077,40242=>19078,19665=>19079,40266=>19080,40287=>19081,40290=>19082,172281=>19083,172162=>19084,40307=>19085,40310=>19086,40311=>19087,40324=>19088,40345=>19089,40353=>19090,40383=>19091,40373=>19092,40377=>19093,40381=>19094,40393=>19095,40410=>19096,40416=>19097,40419=>19098,19719=>19099,40458=>19100,40450=>19101,40461=>19102,40476=>19103,40571=>19104,139800=>19105,40576=>19106,40581=>19107,40603=>19108,172940=>19109,40637=>19110,173111=>19111,40671=>19112,40703=>19113,40706=>19114,19831=>19115,40707=>19116,40762=>19117,40765=>19118,40774=>19119,40787=>19120,40789=>19121,40792=>19122,173553=>19123,40797=>19124,173570=>19125,40809=>19126,40813=>19127,40816=>19128,173746=>19129,11948=>19130,13844=>19131,14509=>19132,15820=>19133,16348=>19134,17854=>19135,17936=>19136,19326=>19137,19512=>19138,19681=>19139,19980=>19140,20003=>19141,20004=>19142,20089=>19143,20211=>19144,20236=>19145,20249=>19146,20267=>19147,20270=>19148,20273=>19149,20356=>19150,20382=>19151,20407=>19152,20484=>19153,20492=>19154,20556=>19155,20575=>19156,20578=>19157,20599=>19158,20622=>19159,20638=>19160,20642=>19161,20675=>19162,20712=>19163,20721=>19164,20734=>19165,20743=>19166,20748=>19167,20749=>19168,20750=>19169,20787=>19170,20792=>19171,20852=>19172,20868=>19173,20920=>19174,20922=>19175,20936=>19176,20943=>19177,20945=>19178,20947=>19179,20948=>19180,20952=>19181,20959=>19182,20997=>19183,21030=>19184,21032=>19185,21035=>19186,21041=>19187,21042=>19188,21045=>19189,21052=>19190,21082=>19191,21088=>19192,21102=>19193,21112=>19194,21113=>19195,21130=>19196,21132=>19197,21217=>19198,21225=>19199,21233=>19200,21251=>19201,21265=>19202,21279=>19203,21293=>19204,21298=>19205,21309=>19206,21349=>19207,21357=>19208,21369=>19209,21374=>19210,21396=>19211,21401=>19212,21418=>19213,21423=>19214,21434=>19215,21441=>19216,21444=>19217,21445=>19218,21472=>19219,21523=>19220,21546=>19221,21553=>19222,21556=>19223,21557=>19224,21580=>19225,21671=>19226,21674=>19227,21681=>19228,21691=>19229,21710=>19230,21738=>19231,21756=>19232,21765=>19233,21768=>19234,21781=>19235,21799=>19236,21802=>19237,21814=>19238,21841=>19239,21862=>19240,21903=>19241,21906=>19242,21908=>19243,21924=>19244,21938=>19245,21955=>19246,21958=>19247,21971=>19248,21979=>19249,21996=>19250,21998=>19251,22001=>19252,22006=>19253,22008=>19254,22021=>19255,22029=>19256,22033=>19257,22034=>19258,22060=>19259,22069=>19260,22073=>19261,22093=>19262,22100=>19263,22149=>19264,22175=>19265,22182=>19266,22199=>19267,22220=>19268,22223=>19269,22233=>19270,22241=>19271,22251=>19272,22253=>19273,22257=>19274,22279=>19275,22284=>19276,22298=>19277,22299=>19278,22301=>19279,22316=>19280,22318=>19281,22333=>19282,22334=>19283,22367=>19284,22379=>19285,22381=>19286,22394=>19287,22403=>19288,22423=>19289,22446=>19290,22485=>19291,22503=>19292,22541=>19293,22566=>19294,22605=>19295,22607=>19296,22623=>19297,22637=>19298,22655=>19299,22657=>19300,22680=>19301,22716=>19302,22815=>19303,22819=>19304,22873=>19305,22905=>19306,22935=>19307,22959=>19308,22963=>19309,23007=>19310,23025=>19311,23032=>19312,23218=>19313,23224=>19314,23274=>19315,23286=>19316,23323=>19317,23325=>19318,23329=>19319,23352=>19320,23479=>19321,23511=>19322,23520=>19323,23583=>19324,23594=>19325,23596=>19326,23606=>19327,23641=>19328,23644=>19329,23661=>19330,23773=>19331,23809=>19332,23860=>19333,23869=>19334,23897=>19335,23934=>19336,23939=>19337,24007=>19338,24057=>19339,24104=>19340,24114=>19341,24117=>19342,24155=>19343,24168=>19344,24170=>19345,24183=>19346,24192=>19347,24203=>19348,24243=>19349,24253=>19350,24273=>19351,24276=>19352,24277=>19353,24397=>19354,24492=>19355,24554=>19356,24583=>19357,24649=>19358,24660=>19359,24679=>19360,24763=>19361,24772=>19362,24829=>19363,24842=>19364,24854=>19365,24874=>19366,24886=>19367,24926=>19368,24932=>19369,24955=>19370,24957=>19371,24959=>19372,24989=>19373,25016=>19374,25052=>19375,25058=>19376,25061=>19377,25064=>19378,25092=>19379,25095=>19380,25137=>19381,25145=>19382,25149=>19383,25210=>19384,25232=>19385,25256=>19386,25306=>19387,25332=>19388,25366=>19389,25386=>19390,25398=>19391,25414=>19392,25419=>19393,25427=>19394,25457=>19395,25461=>19396,25471=>19397,25474=>19398,25482=>19399,25518=>19400,25519=>19401,25578=>19402,25592=>19403,25593=>19404,25618=>19405,25624=>19406,25632=>19407,25636=>19408,25642=>19409,25653=>19410,25661=>19411,25663=>19412,25682=>19413,25695=>19414,25716=>19415,25744=>19416,25752=>19417,25753=>19418,25772=>19419,25779=>19420,25837=>19421,25840=>19422,25883=>19423,25887=>19424,25902=>19425,25929=>19426,25952=>19427,26002=>19428,26005=>19429,26036=>19430,26046=>19431,26056=>19432,26062=>19433,26064=>19434,26079=>19435,26238=>19436,26251=>19437,26252=>19438,26291=>19439,26304=>19440,26319=>19441,26405=>19442,26421=>19443,26453=>19444,26496=>19445,26511=>19446,26513=>19447,26532=>19448,26545=>19449,26549=>19450,26558=>19451,26664=>19452,26758=>19453,26859=>19454,26869=>19455,26903=>19456,26931=>19457,26936=>19458,26971=>19459,26981=>19460,27048=>19461,27051=>19462,27055=>19463,27109=>19464,27121=>19465,27210=>19466,27221=>19467,27239=>19468,27249=>19469,27311=>19470,27336=>19471,27337=>19472,27395=>19473,27451=>19474,27455=>19475,27517=>19476,27518=>19477,27568=>19478,27639=>19479,27641=>19480,27652=>19481,27657=>19482,27661=>19483,27692=>19484,27722=>19485,27730=>19486,27732=>19487,27769=>19488,27820=>19489,27828=>19490,27858=>19491,28001=>19492,28028=>19493,28089=>19494,28144=>19495,28229=>19496,28275=>19497,28283=>19498,28285=>19499,28297=>19500,28348=>19501,28378=>19502,28379=>19503,28454=>19504,28457=>19505,28464=>19506,28551=>19507,28573=>19508,28590=>19509,28599=>19510,28685=>19511,28704=>19512,28745=>19513,28824=>19514,28848=>19515,28885=>19516,28886=>19517,28997=>19518,29106=>19519,29172=>19520,29207=>19521,29215=>19522,29251=>19523,29263=>19524,29264=>19525,29274=>19526,29280=>19527,29288=>19528,29303=>19529,29316=>19530,29385=>19531,29413=>19532,29428=>19533,29442=>19534,29451=>19535,29470=>19536,29474=>19537,29498=>19538,29499=>19539,29517=>19540,29528=>19541,29543=>19542,29810=>19543,29871=>19544,29919=>19545,29924=>19546,29940=>19547,29947=>19548,29974=>19549,29985=>19550,30015=>19551,30046=>19552,30105=>19553,30116=>19554,30145=>19555,30148=>19556,30156=>19557,30167=>19558,30172=>19559,30177=>19560,30191=>19561,30212=>19562,30220=>19563,30237=>19564,30258=>19565,30264=>19566,30277=>19567,30282=>19568,30303=>19569,30381=>19570,30397=>19571,30425=>19572,30443=>19573,30448=>19574,30457=>19575,30464=>19576,30478=>19577,30498=>19578,30504=>19579,30511=>19580,30521=>19581,30526=>19582,30533=>19583,30538=>19584,30543=>19585,30558=>19586,30564=>19587,30567=>19588,30572=>19589,30596=>19590,30604=>19591,30605=>19592,30614=>19593,30631=>19594,30639=>19595,30647=>19596,30654=>19597,30665=>19598,30673=>19599,30681=>19600,30705=>19601,30775=>19602,30812=>19603,30846=>19604,30872=>19605,30881=>19606,30897=>19607,30899=>19608,30921=>19609,30931=>19610,30988=>19611,31007=>19612,31015=>19613,31016=>19614,31039=>19615,31042=>19616,31060=>19617,31083=>19618,31100=>19619,31147=>19620,31172=>19621,31210=>19622,31234=>19623,31244=>19624,31280=>19625,31290=>19626,31300=>19627,31360=>19628,31366=>19629,31380=>19630,31413=>19631,31421=>19632,31486=>19633,31531=>19634,31607=>19635,31648=>19636,31660=>19637,31664=>19638,31720=>19639,31730=>19640,31736=>19641,31740=>19642,31742=>19643,31753=>19644,31784=>19645,31791=>19646,31810=>19647,31826=>19648,31827=>19649,31835=>19650,31836=>19651,31837=>19652,31858=>19653,31869=>19654,31879=>19655,31902=>19656,31930=>19657,31943=>19658,31955=>19659,31962=>19660,32060=>19661,32077=>19662,32130=>19663,32133=>19664,32141=>19665,32145=>19666,32158=>19667,32179=>19668,32185=>19669,32208=>19670,32229=>19671,32245=>19672,32246=>19673,32303=>19674,32310=>19675,32324=>19676,32367=>19677,32376=>19678,32385=>19679,32573=>19680,32603=>19681,32605=>19682,32613=>19683,32625=>19684,32639=>19685,32640=>19686,32651=>19687,32674=>19688,32765=>19689,32766=>19690,32767=>19691,32775=>19692,32781=>19693,32798=>19694,32825=>19695,32904=>19696,32910=>19697,32975=>19698,32980=>19699,33005=>19700,33008=>19701,33015=>19702,33018=>19703,33022=>19704,33027=>19705,33047=>19706,33072=>19707,33111=>19708,33135=>19709,33139=>19710,33163=>19711,33168=>19712,33179=>19713,33182=>19714,33227=>19715,33237=>19716,33245=>19717,33246=>19718,33249=>19719,33263=>19720,33270=>19721,33280=>19722,33291=>19723,33299=>19724,33300=>19725,33306=>19726,33338=>19727,33348=>19728,33389=>19729,33412=>19730,33417=>19731,33425=>19732,33450=>19733,33456=>19734,33488=>19735,33514=>19736,33519=>19737,33526=>19738,33622=>19739,33656=>19740,33784=>19741,33788=>19742,33880=>19743,33939=>19744,33969=>19745,33981=>19746,34043=>19747,34118=>19748,34134=>19749,34141=>19750,34181=>19751,34200=>19752,34370=>19753,34374=>19754,34496=>19755,34580=>19756,34594=>19757,34606=>19758,34617=>19759,34653=>19760,34683=>19761,34700=>19762,34702=>19763,34711=>19764,34712=>19765,34718=>19766,34723=>19767,34734=>19768,34751=>19769,34761=>19770,34778=>19771,34840=>19772,34843=>19773,34861=>19774,34874=>19775,34885=>19776,34891=>19777,34894=>19778,34901=>19779,34906=>19780,34926=>19781,34970=>19782,34971=>19783,34972=>19784,35021=>19785,35040=>19786,35055=>19787,35086=>19788,35087=>19789,35110=>19790,35125=>19791,35162=>19792,35164=>19793,35179=>19794,35184=>19795,35196=>19796,35237=>19797,35253=>19798,35260=>19799,35285=>19800,35401=>19801,35415=>19802,35431=>19803,35454=>19804,35462=>19805,35478=>19806,35510=>19807,35529=>19808,35537=>19809,35549=>19810,35564=>19811,35573=>19812,35590=>19813,35599=>19814,35601=>19815,35653=>19816,35666=>19817,35693=>19818,35704=>19819,35708=>19820,35710=>19821,35717=>19822,35743=>19823,35915=>19824,35923=>19825,35963=>19826,36026=>19827,36037=>19828,36041=>19829,36050=>19830,36076=>19831,36085=>19832,36087=>19833,36097=>19834,36099=>19835,36119=>19836,36124=>19837,36206=>19838,36241=>19839,36255=>19840,36267=>19841,36274=>19842,36309=>19843,36327=>19844,36337=>19845,36338=>19846,36340=>19847,36353=>19848,36363=>19849,36390=>19850,36401=>19851,36416=>19852,36417=>19853,36429=>19854,36431=>19855,36444=>19856,36449=>19857,36457=>19858,36465=>19859,36469=>19860,36471=>19861,36489=>19862,36496=>19863,36501=>19864,36506=>19865,36519=>19866,36521=>19867,36525=>19868,36584=>19869,36592=>19870,36615=>19871,36632=>19872,36645=>19873,36647=>19874,36652=>19875,36661=>19876,36666=>19877,36675=>19878,36679=>19879,36689=>19880,36693=>19881,36768=>19882,36769=>19883,36770=>19884,36773=>19885,36868=>19886,36891=>19887,36911=>19888,36940=>19889,36955=>19890,36976=>19891,36980=>19892,36985=>19893,37003=>19894,37016=>19895,37024=>19896,37042=>19897,37053=>19898,37065=>19899,37104=>19900,37125=>19901,37157=>19902,37210=>19903,37223=>19904,37242=>19905,37258=>19906,37265=>19907,37269=>19908,37296=>19909,37307=>19910,37309=>19911,37314=>19912,37317=>19913,37376=>19914,37385=>19915,37411=>19916,37494=>19917,37518=>19918,37551=>19919,37563=>19920,37564=>19921,37569=>19922,37571=>19923,37573=>19924,37576=>19925,37652=>19926,37683=>19927,37686=>19928,37720=>19929,37759=>19930,37762=>19931,37770=>19932,37819=>19933,37836=>19934,37862=>19935,37881=>19936,37890=>19937,37901=>19938,37902=>19939,37934=>19940,37964=>19941,38280=>19942,38305=>19943,38335=>19944,38342=>19945,38345=>19946,38353=>19947,38354=>19948,38368=>19949,38372=>19950,38374=>19951,38436=>19952,38449=>19953,38456=>19954,38461=>19955,38484=>19956,38516=>19957,38523=>19958,38527=>19959,38529=>19960,38531=>19961,38537=>19962,38550=>19963,38574=>19964,38659=>19965,38683=>19966,38689=>19967,38690=>19968,38696=>19969,38705=>19970,38759=>19971,38774=>19972,38781=>19973,38783=>19974,38809=>19975,38815=>19976,38828=>19977,38841=>19978,38861=>19979,38880=>19980,38895=>19981,38919=>19982,38950=>19983,38958=>19984,39010=>19985,39011=>19986,39092=>19987,39109=>19988,39170=>19989,39185=>19990,39189=>19991,39221=>19992,39240=>19993,39252=>19994,39262=>19995,39393=>19996,39436=>19997,39440=>19998,39459=>19999,39489=>20000,39505=>20001,39613=>20002,39614=>20003,39681=>20004,39689=>20005,39691=>20006,39693=>20007,39694=>20008,39705=>20009,39733=>20010,39752=>20011,39765=>20012,39784=>20013,39808=>20014,39814=>20015,39824=>20016,39837=>20017,39856=>20018,39871=>20019,39880=>20020,39935=>20021,39938=>20022,39964=>20023,39989=>20024,40004=>20025,40022=>20026,40033=>20027,40040=>20028,40240=>20029,40253=>20030,40298=>20031,40315=>20032,40421=>20033,40425=>20034,40435=>20035,40570=>20036,40578=>20037,40579=>20038,40580=>20039,40624=>20040,40676=>20041,40688=>20042,40690=>20043,40713=>20044,40719=>20045,40724=>20046,40731=>20047,40738=>20048,40742=>20049,40746=>20050,40747=>20051,40756=>20052,40794=>20053,40815=>20054,40862=>20055,40869=>20056,131317=>20057,151044=>20058,151538=>20059,163187=>20060,194581=>20061,194630=>20062,194713=>20063,194726=>20064,194789=>20065,195038=>20066,13790=>20067,40895=>20068,40896=>20069,40897=>20070,40898=>20071,172722=>20072,131416=>20075,132529=>20080,132844=>20083,134488=>20090,154060=>20112,14756=>20122,14776=>20123,142914=>20124,14940=>20127,133064=>20128,143339=>20130,162228=>20133,15044=>20135,15051=>20136,14981=>20142,15347=>20151,27384=>20152,15665=>20158,147531=>20168,15936=>20170,14497=>20171,158878=>20206,18207=>20219,162876=>20220,18462=>20225,39709=>20297,39724=>20298,20482=>20299,20958=>20300,21255=>20301,23532=>20302,63784=>20303,26142=>20304,63785=>20305,28746=>20306,64021=>20307,21857=>20308,27706=>20309,31328=>20310,156492=>20311,34819=>20312,38315=>20313,38741=>20314,171581=>20315,173594=>20316,900=>20317,901=>20318,272=>20322,294=>20323,306=>20324,319=>20325,330=>20326,358=>20327,307=>20328,312=>20329,320=>20330,329=>20331,359=>20332,266=>20333,278=>20334,286=>20335,290=>20336,288=>20337,304=>20338,302=>20339,310=>20340,315=>20342,325=>20343,342=>20344,370=>20345,471=>20346,475=>20347,473=>20348,469=>20349,372=>20350,374=>20351,267=>20352,279=>20353,501=>20354,287=>20355,289=>20356,303=>20357,311=>20358,316=>20360,326=>20361,343=>20362,371=>20363,373=>20364,375=>20365,8494=>20366,8710=>20367,8719=>20368,8804=>20369,8805=>20370,9674=>20371,902=>20427,904=>20428,905=>20429,906=>20430,938=>20431,908=>20432,910=>20433,939=>20434,911=>20435,940=>20436,941=>20437,942=>20438,943=>20439,970=>20440,912=>20441,972=>20442,973=>20443,971=>20444,944=>20445,974=>20446,1026=>20447,1027=>20448,1028=>20449,1029=>20450,1030=>20451,1031=>20452,1032=>20453,1033=>20454,1034=>20455,1035=>20456,1036=>20457,1038=>20458,1039=>20459,1106=>20460,1107=>20461,1108=>20462,1109=>20463,1110=>20464,1111=>20465,1112=>20466,1113=>20467,1114=>20468,1115=>20469,1116=>20470,1118=>20471,1119=>20472,9361=>20587,9362=>20588,20021=>21075,20060=>21076,20067=>21077,20072=>21078,20084=>21079,20085=>21080,20119=>21081,20143=>21082,20187=>21083,20194=>21084,20200=>21085,20207=>21086,20222=>21087,20226=>21088,20232=>21089,20242=>21090,20247=>21091,20275=>21092,20277=>21093,20288=>21094,20290=>21095,20299=>21096,20300=>21097,20306=>21098,20323=>21099,20334=>21100,20337=>21101,20345=>21102,20353=>21103,20361=>21104,20364=>21105,20366=>21106,20368=>21107,20371=>21108,20377=>21109,20383=>21110,20409=>21111,20411=>21112,20412=>21113,20413=>21114,20416=>21115,20417=>21116,20422=>21117,20424=>21118,20428=>21119,20444=>21120,20450=>21121,20464=>21122,20476=>21123,20487=>21124,20490=>21125,20503=>21126,20509=>21127,20528=>21128,20530=>21129,20531=>21130,20533=>21131,20549=>21132,20554=>21133,20561=>21134,20562=>21135,20569=>21136,20576=>21137,20583=>21138,20589=>21139,20593=>21140,20609=>21141,20611=>21142,20612=>21143,20614=>21144,20618=>21145,20624=>21146,20635=>21147,20639=>21148,20640=>21149,20641=>21150,20655=>21151,20656=>21152,20665=>21153,20669=>21154,20672=>21155,20691=>21156,20700=>21157,20701=>21158,20703=>21159,20706=>21160,20708=>21161,20726=>21162,20730=>21163,20761=>21165,20764=>21166,20765=>21167,20771=>21168,20775=>21169,20776=>21170,20780=>21171,20781=>21172,20783=>21173,20785=>21174,20788=>21175,20793=>21176,20802=>21177,20815=>21178,20819=>21179,20824=>21180,20838=>21181,20862=>21182,20878=>21183,20927=>21184,20930=>21185,20946=>21186,20949=>21187,20965=>21188,20978=>21189,20983=>21190,21016=>21191,21026=>21192,21061=>21193,21080=>21194,21087=>21195,21120=>21196,21125=>21197,21141=>21198,21142=>21199,21143=>21200,21146=>21201,21157=>21202,21159=>21203,21168=>21204,21174=>21205,21175=>21206,21176=>21207,21181=>21208,21188=>21209,21190=>21210,21199=>21211,21204=>21212,21212=>21213,21221=>21214,21224=>21215,21226=>21216,21228=>21217,21236=>21218,21238=>21219,21260=>21220,21267=>21221,21272=>21222,21275=>21223,21278=>21224,21285=>21225,21287=>21226,21288=>21227,21289=>21228,21291=>21229,21292=>21230,21296=>21231,21308=>21232,21337=>21233,21339=>21234,21379=>21236,21383=>21237,21384=>21238,21390=>21239,21409=>21240,21429=>21241,21432=>21242,21437=>21243,21455=>21244,21458=>21245,21459=>21246,21470=>21247,21479=>21249,21506=>21250,21530=>21251,21537=>21252,21551=>21253,21572=>21254,21575=>21255,21583=>21256,21598=>21257,21604=>21258,21607=>21259,21609=>21260,21613=>21261,21614=>21262,21633=>21263,21635=>21264,21637=>21265,21641=>21266,21649=>21267,21663=>21268,21706=>21269,21728=>21270,21750=>21271,21758=>21272,21772=>21273,21773=>21274,21810=>21275,21819=>21276,21821=>21277,21833=>21278,21837=>21279,21848=>21280,21850=>21281,21851=>21282,21887=>21283,21907=>21284,21911=>21285,21923=>21286,21953=>21287,21963=>21288,21975=>21289,21976=>21290,21982=>21291,22015=>21292,22026=>21294,22041=>21295,22067=>21296,22076=>21297,22081=>21298,22083=>21299,22084=>21300,22086=>21301,22113=>21302,22114=>21303,22115=>21304,22133=>21305,22148=>21306,22155=>21307,22183=>21308,22187=>21309,22206=>21310,22219=>21311,22224=>21312,22236=>21313,22245=>21314,22246=>21315,22247=>21316,22273=>21317,22274=>21318,22289=>21319,22304=>21320,22306=>21321,22308=>21322,22309=>21323,22314=>21324,22335=>21325,22354=>21326,22370=>21327,22375=>21328,22382=>21329,22385=>21330,22393=>21331,22398=>21332,22401=>21333,22420=>21334,22425=>21335,22431=>21336,22433=>21337,22421=>21338,22439=>21339,22441=>21340,22461=>21341,22493=>21342,22505=>21343,22526=>21344,22531=>21345,22536=>21346,22497=>21347,22540=>21348,22555=>21349,22559=>21350,22573=>21351,22591=>21352,22608=>21353,22613=>21354,22632=>21355,22648=>21356,22663=>21357,22664=>21358,22668=>21359,22678=>21360,22688=>21361,22689=>21362,22690=>21363,22694=>21364,22724=>21365,22722=>21366,22728=>21367,22742=>21368,22749=>21369,22753=>21370,22802=>21372,22803=>21373,22813=>21374,22817=>21375,22824=>21376,22832=>21377,22835=>21378,22837=>21379,22838=>21380,22847=>21381,22851=>21382,22866=>21383,22878=>21384,22891=>21385,22895=>21386,22898=>21387,22907=>21388,22924=>21389,22926=>21390,22933=>21391,22951=>21392,22957=>21393,22960=>21394,22967=>21395,22977=>21396,22980=>21397,23023=>21398,23026=>21399,23028=>21400,23031=>21401,23040=>21402,23054=>21403,23058=>21404,23070=>21405,23076=>21406,23080=>21407,23082=>21408,23088=>21409,23108=>21410,23109=>21411,23112=>21412,23116=>21413,23120=>21414,23134=>21415,23163=>21416,23184=>21417,23187=>21418,23190=>21419,23193=>21420,23227=>21421,23238=>21422,23240=>21423,23247=>21424,23293=>21425,23297=>21426,23371=>21427,23390=>21428,23406=>21429,23430=>21430,23438=>21431,23440=>21432,23441=>21433,23444=>21434,23464=>21435,23465=>21436,23469=>21437,23471=>21438,23473=>21439,23474=>21440,23482=>21441,23484=>21442,23489=>21443,23501=>21444,23503=>21445,23513=>21446,23514=>21447,23535=>21448,23540=>21449,23564=>21450,23575=>21451,23590=>21452,23598=>21453,23602=>21454,23605=>21455,23642=>21456,23668=>21457,23669=>21458,23675=>21459,23677=>21460,23687=>21461,23698=>21462,23709=>21463,23730=>21464,23732=>21465,23767=>21466,23790=>21467,23793=>21468,23794=>21469,23826=>21470,23843=>21471,23871=>21472,23880=>21473,23893=>21474,23889=>21475,23903=>21476,23904=>21477,23906=>21478,23908=>21479,23929=>21480,23930=>21481,23935=>21482,23946=>21483,23955=>21484,23957=>21485,23963=>21486,23967=>21487,23979=>21488,24003=>21489,24014=>21490,24025=>21491,24071=>21492,24077=>21493,24096=>21494,24139=>21495,24144=>21496,24145=>21497,24156=>21498,24176=>21499,24206=>21500,24226=>21501,24228=>21502,24241=>21503,24268=>21504,24270=>21505,24284=>21506,24286=>21507,24293=>21508,24299=>21509,24326=>21510,24345=>21511,24356=>21512,24363=>21513,24364=>21514,24366=>21515,24368=>21516,24383=>21517,24388=>21518,24411=>21519,24416=>21520,24431=>21521,24436=>21522,24437=>21523,24440=>21524,24442=>21525,24461=>21526,24470=>21527,24477=>21528,24491=>21529,24496=>21530,24497=>21531,24520=>21532,24528=>21533,24529=>21534,24552=>21535,24556=>21536,24562=>21537,24566=>21538,24570=>21539,24586=>21540,24595=>21541,24607=>21542,24621=>21543,24640=>21544,24648=>21545,24657=>21546,24662=>21547,24663=>21548,24689=>21549,24702=>21550,24706=>21551,24710=>21552,24712=>21553,24718=>21554,24721=>21555,24723=>21556,24728=>21557,24738=>21559,24741=>21560,24759=>21561,24770=>21562,24777=>21563,24778=>21564,24782=>21565,24783=>21566,24802=>21567,24805=>21568,24828=>21569,24834=>21570,24839=>21571,24844=>21572,24855=>21573,24866=>21574,24881=>21575,24885=>21576,24889=>21577,24901=>21578,24905=>21579,24940=>21580,24946=>21581,24952=>21582,24960=>21583,24961=>21584,24963=>21585,24964=>21586,24971=>21587,24988=>21588,24992=>21589,25002=>21590,25024=>21591,25025=>21592,25038=>21593,25039=>21594,25054=>21595,25057=>21596,25063=>21597,25065=>21598,25068=>21599,25069=>21600,25071=>21601,25089=>21602,25091=>21603,25116=>21604,25120=>21605,25127=>21606,25131=>21607,25154=>21608,25156=>21609,25168=>21610,25172=>21611,25180=>21612,25213=>21613,25229=>21614,25230=>21615,25231=>21616,25267=>21617,25270=>21618,25271=>21619,25274=>21620,25278=>21621,25279=>21622,25294=>21623,25322=>21624,25330=>21625,25348=>21626,25355=>21627,25363=>21628,25385=>21629,25389=>21630,25418=>21631,25426=>21632,25428=>21633,25432=>21634,25435=>21635,25446=>21636,25453=>21637,25464=>21638,25493=>21639,25498=>21640,25508=>21641,25510=>21642,25517=>21643,25537=>21644,25541=>21645,25544=>21646,25550=>21647,25555=>21648,25587=>21649,25610=>21650,25648=>21651,25675=>21652,25679=>21653,25683=>21654,25692=>21655,25697=>21656,25699=>21657,25733=>21658,25743=>21659,25755=>21660,25761=>21661,25763=>21662,25766=>21663,25768=>21664,25789=>21665,25801=>21666,25809=>21667,25833=>21668,25834=>21669,25845=>21670,25857=>21671,25864=>21672,25865=>21673,25866=>21674,25875=>21675,25894=>21676,25905=>21677,25914=>21678,25916=>21679,25917=>21680,25923=>21681,25936=>21682,25938=>21683,25951=>21684,25981=>21685,26008=>21686,26016=>21687,26019=>21688,26022=>21689,26030=>21690,26035=>21691,26070=>21692,26072=>21693,26100=>21695,26101=>21696,26110=>21697,26111=>21698,26125=>21699,26129=>21700,26130=>21701,26134=>21702,26141=>21703,26147=>21704,26150=>21705,26153=>21706,26169=>21707,26167=>21708,26176=>21709,26182=>21710,26186=>21711,26200=>21712,26208=>21713,26229=>21714,26239=>21715,26233=>21716,26236=>21717,26266=>21718,26267=>21719,26268=>21720,26271=>21721,26306=>21723,26307=>21724,26316=>21725,26318=>21726,26324=>21727,26335=>21728,26347=>21729,26350=>21730,26375=>21731,26396=>21732,26400=>21733,26402=>21734,26430=>21735,26437=>21736,26476=>21737,26500=>21738,26510=>21739,26518=>21740,26521=>21741,26556=>21742,26557=>21743,26562=>21744,26565=>21745,26569=>21746,26588=>21747,26593=>21748,26598=>21749,26610=>21750,26614=>21751,26644=>21752,26649=>21753,26663=>21754,26671=>21755,26687=>21756,26698=>21757,26712=>21758,26735=>21759,26736=>21760,26737=>21761,26745=>21762,26747=>21763,26760=>21764,26785=>21765,26793=>21766,26798=>21767,26833=>21768,26835=>21769,26844=>21770,26845=>21771,26858=>21772,26870=>21773,26877=>21774,26886=>21775,26889=>21776,26896=>21777,26902=>21778,26929=>21779,26949=>21780,26958=>21781,26982=>21782,26992=>21783,26993=>21784,27003=>21785,27021=>21786,27041=>21787,27064=>21788,27077=>21789,27080=>21790,27136=>21792,27139=>21793,27168=>21794,27172=>21795,27191=>21796,27242=>21798,27265=>21799,27270=>21800,27271=>21801,27291=>21802,27312=>21803,27313=>21804,27316=>21805,27326=>21806,27327=>21807,27340=>21808,27349=>21809,27350=>21810,27376=>21811,27388=>21812,27394=>21813,27398=>21814,27399=>21815,27401=>21816,27432=>21817,27435=>21818,27446=>21819,27469=>21820,27474=>21821,27485=>21822,27499=>21823,27502=>21824,27504=>21825,27525=>21826,27543=>21827,27551=>21828,27552=>21829,27554=>21830,27555=>21831,27560=>21832,27564=>21833,27576=>21834,27577=>21835,27587=>21836,27588=>21837,27619=>21838,27666=>21839,27673=>21840,27679=>21841,27686=>21842,27687=>21843,27688=>21844,27694=>21845,27707=>21846,27723=>21847,27727=>21848,27755=>21849,27768=>21850,27783=>21851,27807=>21852,27824=>21853,27826=>21854,27853=>21855,27855=>21856,27857=>21857,27879=>21858,27890=>21859,27892=>21860,27911=>21861,27919=>21862,27923=>21863,27930=>21864,27944=>21865,27999=>21866,28007=>21867,28050=>21868,28055=>21869,28087=>21870,28093=>21871,28128=>21872,28130=>21873,28133=>21874,28143=>21875,28148=>21876,28160=>21877,28164=>21878,28219=>21879,28242=>21880,28253=>21881,28258=>21882,28264=>21883,28301=>21884,28313=>21885,28320=>21886,28333=>21887,28334=>21888,28339=>21889,28347=>21890,28352=>21891,28360=>21892,28365=>21893,28367=>21894,28397=>21895,28398=>21896,28420=>21897,28424=>21898,28429=>21899,28438=>21900,28443=>21901,28475=>21902,28461=>21903,28495=>21904,28499=>21905,28509=>21906,28524=>21907,28547=>21908,28563=>21909,28582=>21910,28592=>21911,28613=>21912,28648=>21913,28669=>21914,28695=>21915,28719=>21916,28724=>21917,28727=>21918,28740=>21919,28744=>21920,28757=>21921,28820=>21922,28822=>21923,28827=>21924,28852=>21925,28922=>21926,28933=>21927,28939=>21928,28973=>21929,28984=>21930,28993=>21931,29003=>21932,29015=>21934,29018=>21935,29068=>21936,29082=>21937,29104=>21938,29119=>21939,29120=>21940,29132=>21941,29146=>21942,29176=>21943,29192=>21944,29193=>21945,29203=>21946,29210=>21947,29220=>21948,29231=>21949,29253=>21950,29262=>21951,29278=>21952,29291=>21953,29297=>21954,29307=>21955,29308=>21956,29321=>21957,29331=>21958,29352=>21959,29397=>21960,29398=>21961,29400=>21962,29407=>21963,29438=>21964,29453=>21965,29459=>21966,29490=>21967,29493=>21968,29526=>21969,29533=>21970,29534=>21971,29535=>21972,29536=>21973,29545=>21974,29561=>21975,29568=>21976,29582=>21977,29584=>21978,29587=>21979,29591=>21980,29610=>21981,29613=>21982,29638=>21983,29644=>21984,29651=>21985,29661=>21986,29670=>21987,29687=>21988,29691=>21989,29695=>21990,29696=>21991,29713=>21992,29741=>21993,29799=>21994,29800=>21995,29806=>21996,29839=>21997,29841=>21998,29850=>21999,29870=>22000,29873=>22001,29874=>22002,29900=>22003,29904=>22004,29907=>22005,29915=>22007,29928=>22008,29930=>22009,29948=>22011,29958=>22012,29970=>22013,29991=>22014,29993=>22015,30006=>22016,30009=>22017,30019=>22018,30023=>22019,30039=>22020,30047=>22021,30049=>22022,30075=>22023,30076=>22024,30085=>22025,30101=>22026,30108=>22027,30138=>22028,30226=>22029,30243=>22030,30249=>22031,30265=>22032,30266=>22033,30272=>22034,30276=>22035,30297=>22036,30341=>22037,30348=>22038,30349=>22039,30367=>22040,30370=>22041,30371=>22042,30401=>22043,30411=>22044,30432=>22046,30454=>22047,30470=>22048,30482=>22049,30484=>22050,30485=>22051,30492=>22052,30510=>22053,30525=>22054,30530=>22055,30546=>22056,30550=>22057,30551=>22058,30576=>22059,30579=>22060,30580=>22061,30638=>22064,30641=>22065,30645=>22066,30659=>22067,30674=>22068,30677=>22069,30712=>22070,30734=>22071,30737=>22072,30749=>22073,30755=>22074,30788=>22075,30792=>22076,30796=>22077,30802=>22078,30814=>22079,30816=>22080,30817=>22081,30819=>22082,30863=>22083,30888=>22084,30892=>22085,30898=>22086,30909=>22087,30911=>22088,30919=>22089,30930=>22090,30934=>22091,30939=>22092,30943=>22093,30954=>22094,30963=>22095,30966=>22096,30975=>22097,30982=>22098,31002=>22099,31006=>22100,31008=>22101,31017=>22102,31021=>22103,31029=>22104,31044=>22105,31051=>22106,31055=>22107,31057=>22108,31081=>22109,31099=>22110,31102=>22111,31116=>22112,31121=>22113,31123=>22114,31132=>22115,31144=>22116,31151=>22117,31183=>22118,31197=>22119,31200=>22120,31202=>22121,31205=>22122,31217=>22123,31224=>22124,31228=>22125,31239=>22126,31265=>22127,31271=>22128,31275=>22129,31279=>22130,31284=>22131,31285=>22132,31304=>22133,31317=>22134,31333=>22135,31358=>22136,31371=>22137,31377=>22138,31390=>22139,31433=>22140,31451=>22141,31465=>22142,31468=>22143,31473=>22144,31483=>22145,31519=>22146,31523=>22147,31529=>22148,31536=>22149,31540=>22150,31551=>22151,31552=>22152,31594=>22153,31620=>22154,31625=>22155,31630=>22156,31638=>22157,31653=>22158,31666=>22159,31670=>22160,31674=>22161,31675=>22162,31677=>22163,31682=>22164,31688=>22165,31707=>22166,31732=>22167,31733=>22168,31737=>22169,31738=>22170,31746=>22171,31748=>22172,31750=>22173,31756=>22174,31769=>22175,31771=>22176,31781=>22177,31788=>22178,31796=>22179,31801=>22180,31802=>22181,31814=>22182,31829=>22183,31834=>22184,31843=>22185,31868=>22187,31878=>22188,31920=>22189,31931=>22190,31951=>22191,31956=>22192,31977=>22193,32015=>22194,32017=>22195,32022=>22196,32038=>22197,32042=>22198,32045=>22199,32081=>22200,32087=>22201,32101=>22202,32103=>22203,32120=>22204,32123=>22205,32129=>22206,32150=>22207,32195=>22208,32196=>22209,32197=>22210,32198=>22211,32205=>22212,32206=>22213,32256=>22214,32226=>22215,32234=>22216,32237=>22217,32250=>22218,32284=>22219,32301=>22220,32307=>22221,32319=>22222,32334=>22223,32336=>22224,32344=>22225,32351=>22226,32357=>22227,32405=>22228,32413=>22229,32414=>22230,32575=>22231,32604=>22232,32614=>22233,32653=>22235,32655=>22236,32678=>22237,32682=>22238,32692=>22239,32700=>22240,32704=>22241,32712=>22242,32744=>22243,32783=>22244,32787=>22245,32797=>22246,32799=>22247,32800=>22248,32814=>22249,32820=>22250,32830=>22251,32832=>22252,32836=>22253,32868=>22254,32877=>22255,32897=>22256,32953=>22257,32968=>22258,32973=>22259,32978=>22260,33006=>22261,33010=>22262,33014=>22263,33017=>22264,33035=>22265,33052=>22266,33056=>22267,33084=>22268,33093=>22269,33095=>22270,33106=>22271,33121=>22272,33143=>22273,33158=>22274,33166=>22275,33174=>22276,33186=>22277,33198=>22278,33221=>22279,33230=>22280,33259=>22281,33264=>22282,33265=>22283,33266=>22284,33269=>22285,33272=>22286,33295=>22288,33309=>22289,33320=>22290,33347=>22291,33358=>22292,33361=>22293,33366=>22294,33383=>22295,33403=>22296,33408=>22297,33409=>22298,33415=>22299,33428=>22300,33430=>22301,33432=>22302,33434=>22303,33435=>22304,33440=>22305,33498=>22306,33504=>22307,33508=>22308,33517=>22309,33546=>22310,33547=>22311,33566=>22312,33567=>22313,33569=>22314,33580=>22315,33582=>22316,33587=>22317,33591=>22318,33597=>22319,33602=>22320,33613=>22321,33614=>22322,33648=>22323,33664=>22324,33666=>22325,33668=>22326,33689=>22327,33692=>22328,33702=>22329,33708=>22330,33726=>22331,33619=>22332,33768=>22333,33817=>22334,33709=>22335,33839=>22336,33861=>22337,33863=>22338,33869=>22339,33878=>22340,33888=>22342,33892=>22343,33895=>22344,33898=>22345,33908=>22346,33917=>22347,33938=>22348,33941=>22349,33961=>22350,33962=>22351,33991=>22352,33992=>22353,33996=>22354,34034=>22355,34039=>22356,34050=>22357,34051=>22358,34055=>22359,34062=>22360,34064=>22361,34076=>22362,34082=>22363,34087=>22364,34090=>22365,34099=>22366,34102=>22367,34111=>22368,34128=>22369,34130=>22370,34140=>22371,34143=>22373,34144=>22374,34169=>22375,34185=>22376,34187=>22377,34208=>22378,34213=>22379,34215=>22380,34228=>22381,34230=>22382,34232=>22383,34237=>22384,34238=>22385,34239=>22386,34242=>22387,34266=>22388,34272=>22389,34280=>22390,34291=>22391,34300=>22392,34317=>22393,34318=>22394,34329=>22395,34331=>22396,34358=>22397,34362=>22398,34365=>22399,34392=>22400,34393=>22401,34397=>22402,34400=>22403,34401=>22404,34404=>22405,34409=>22406,34422=>22407,34454=>22408,34458=>22409,34465=>22410,34470=>22411,34477=>22412,34484=>22413,34485=>22414,34487=>22415,34489=>22416,34495=>22417,34501=>22418,34514=>22419,34522=>22420,34524=>22421,34528=>22422,34533=>22423,34535=>22424,34440=>22425,34564=>22426,34575=>22427,34607=>22428,34610=>22429,34620=>22430,34621=>22431,34629=>22432,34637=>22433,34657=>22434,34671=>22435,34691=>22436,34692=>22437,34693=>22438,34694=>22439,34704=>22440,34709=>22441,34737=>22443,34760=>22444,34762=>22445,34773=>22446,34777=>22447,34780=>22448,34786=>22449,34788=>22450,34801=>22451,34803=>22452,34808=>22453,34810=>22454,34815=>22455,34825=>22456,34841=>22457,34834=>22458,34842=>22459,34846=>22460,34864=>22461,34869=>22462,34881=>22463,34883=>22464,34888=>22465,34889=>22466,34897=>22468,34908=>22469,34912=>22470,34929=>22471,34937=>22472,34939=>22473,34944=>22474,34975=>22475,34984=>22476,35002=>22477,35019=>22478,35020=>22479,35038=>22480,35047=>22481,35063=>22482,35085=>22483,35093=>22484,35094=>22485,35104=>22486,35112=>22487,35121=>22488,35130=>22489,35142=>22490,35151=>22491,35154=>22492,35159=>22493,35163=>22494,35169=>22495,35171=>22496,35182=>22497,35187=>22498,35189=>22499,35194=>22500,35197=>22501,35213=>22502,35221=>22503,35227=>22504,35228=>22505,35232=>22506,35252=>22507,35254=>22508,35287=>22509,35305=>22510,35309=>22511,35321=>22512,35332=>22513,35333=>22514,35358=>22515,35360=>22516,35364=>22517,35366=>22518,35371=>22519,35372=>22520,35375=>22521,35389=>22522,35392=>22523,35395=>22524,35411=>22525,35414=>22526,35420=>22527,35429=>22528,35446=>22529,35447=>22530,35450=>22531,35451=>22532,35456=>22533,35459=>22534,35467=>22535,35471=>22536,35474=>22537,35479=>22538,35481=>22539,35487=>22540,35497=>22541,35503=>22542,35507=>22543,35515=>22544,35523=>22545,35526=>22546,35528=>22547,35530=>22548,35539=>22549,35540=>22550,35541=>22551,35568=>22552,35583=>22553,35595=>22554,35614=>22555,35632=>22556,35644=>22557,35650=>22558,35656=>22559,35661=>22560,35683=>22561,35705=>22562,35716=>22563,35725=>22564,35727=>22565,35896=>22566,35902=>22567,35921=>22568,35928=>22569,35931=>22570,35933=>22571,35929=>22572,35939=>22573,35940=>22574,35942=>22575,35957=>22576,35958=>22577,35966=>22578,35974=>22579,35975=>22580,35979=>22581,35984=>22582,35996=>22584,36025=>22585,36038=>22586,36043=>22587,36047=>22588,36061=>22589,36072=>22590,36079=>22591,36082=>22592,36095=>22593,36197=>22594,36223=>22595,36226=>22596,36232=>22597,36240=>22598,36254=>22599,36256=>22600,36268=>22601,36277=>22602,36279=>22603,36281=>22604,36283=>22605,36288=>22606,36293=>22607,36295=>22608,36298=>22609,36308=>22610,36325=>22611,36336=>22612,36284=>22613,36356=>22614,36357=>22615,36369=>22616,36403=>22617,36407=>22618,36408=>22619,36430=>22620,36443=>22621,36445=>22622,36446=>22623,36473=>22624,36482=>22625,36483=>22626,36507=>22627,36509=>22628,36514=>22629,36538=>22630,36545=>22631,36547=>22632,36548=>22633,36551=>22634,36572=>22635,36590=>22636,36593=>22637,36599=>22638,36589=>22639,36610=>22640,36623=>22641,36624=>22642,36630=>22643,36640=>22644,36641=>22645,36643=>22646,36648=>22647,36654=>22648,36660=>22649,36663=>22650,36673=>22651,36687=>22652,36690=>22653,36691=>22654,36701=>22655,36702=>22656,36709=>22657,36765=>22658,36792=>22659,36798=>22660,36800=>22661,36811=>22662,36816=>22663,36818=>22664,36835=>22665,36862=>22666,36888=>22667,36904=>22668,36905=>22669,36906=>22670,36915=>22671,36916=>22672,36927=>22673,36962=>22674,36966=>22675,36972=>22676,37006=>22677,37029=>22678,37068=>22679,37077=>22680,37080=>22681,37081=>22682,37093=>22683,37074=>22684,37128=>22685,37133=>22686,37136=>22687,37146=>22688,37152=>22689,37161=>22690,37166=>22691,37174=>22692,37180=>22693,37187=>22694,37199=>22695,37203=>22696,37229=>22697,37243=>22698,37249=>22699,37254=>22700,37267=>22701,37268=>22702,37272=>22703,37281=>22704,37286=>22705,37311=>22706,37331=>22707,37332=>22708,37337=>22709,37353=>22710,37354=>22711,37359=>22712,37369=>22713,37373=>22714,37380=>22715,37381=>22716,37388=>22717,37394=>22718,37395=>22719,37400=>22720,37404=>22721,37405=>22722,37412=>22723,37413=>22724,37414=>22725,37422=>22726,37423=>22727,37424=>22728,37429=>22729,37430=>22730,37438=>22731,37446=>22732,37453=>22733,37464=>22734,37468=>22735,37469=>22736,37481=>22737,37486=>22738,37487=>22739,37488=>22740,37493=>22741,37497=>22742,37499=>22743,37514=>22744,37522=>22745,37536=>22746,37540=>22747,37541=>22748,37544=>22749,37558=>22750,37560=>22751,37562=>22752,37565=>22753,37575=>22754,37581=>22755,37592=>22756,37596=>22757,37597=>22758,37601=>22759,37603=>22760,37608=>22761,37612=>22762,37614=>22763,37616=>22764,37632=>22765,37640=>22766,37660=>22767,37668=>22768,37674=>22769,37684=>22770,37687=>22771,37712=>22772,37717=>22773,37726=>22774,37735=>22775,37737=>22776,37743=>22777,37748=>22778,37750=>22779,37754=>22780,37757=>22781,37760=>22782,37761=>22783,37773=>22784,37778=>22785,37781=>22786,37784=>22787,37798=>22789,37800=>22790,37803=>22791,37812=>22792,37813=>22793,37814=>22794,37828=>22795,37829=>22796,37833=>22797,37835=>22798,37837=>22799,37843=>22800,37849=>22801,37879=>22802,37889=>22803,37896=>22804,37909=>22805,37919=>22806,37935=>22807,37949=>22808,37955=>22809,37977=>22810,37980=>22811,37983=>22812,37985=>22813,37992=>22814,37998=>22815,38020=>22816,38019=>22817,38270=>22818,38276=>22819,38301=>22820,38302=>22821,38330=>22822,38361=>22823,38365=>22824,38367=>22825,38430=>22826,38434=>22827,38437=>22828,38438=>22829,38455=>22830,38457=>22831,38458=>22832,38482=>22833,38486=>22834,38487=>22835,38510=>22836,38524=>22837,38526=>22838,38545=>22839,38559=>22840,38566=>22841,38602=>22842,38623=>22844,38650=>22845,38661=>22846,38682=>22847,38685=>22848,38730=>22850,38744=>22851,38775=>22852,38776=>22853,38779=>22854,38784=>22855,38793=>22856,38807=>22857,38840=>22858,38844=>22859,38847=>22860,38852=>22861,38853=>22862,38855=>22863,38858=>22864,38862=>22865,38864=>22866,38871=>22867,38877=>22868,38884=>22869,38903=>22870,38904=>22871,38906=>22872,38937=>22873,38940=>22874,38944=>22875,38959=>22876,38965=>22877,38980=>22878,38986=>22879,38993=>22880,39018=>22881,39086=>22882,39116=>22883,39142=>22884,39158=>22885,39175=>22886,39199=>22887,39202=>22888,39206=>22889,39211=>22890,39220=>22891,39225=>22892,39239=>22893,39257=>22894,39259=>22895,39323=>22896,39325=>22897,39327=>22898,39344=>22899,39346=>22900,39349=>22901,39379=>22902,39386=>22903,39388=>22904,39399=>22905,39402=>22906,39403=>22907,39404=>22908,39412=>22909,39413=>22910,39421=>22911,39422=>22912,39428=>22913,39435=>22914,39454=>22915,39458=>22916,39475=>22917,39477=>22918,39495=>22919,39499=>22921,39508=>22922,39517=>22923,39594=>22924,39596=>22925,39598=>22926,39602=>22927,39604=>22928,39611=>22929,39615=>22930,39624=>22931,39639=>22932,39643=>22933,39652=>22934,39655=>22935,39660=>22936,39666=>22937,39667=>22938,39669=>22939,39674=>22940,39677=>22941,39679=>22942,39680=>22943,39684=>22944,39685=>22945,39707=>22946,39718=>22947,39735=>22949,39737=>22950,39738=>22951,39756=>22952,39766=>22953,39767=>22954,39771=>22955,39777=>22956,39786=>22957,39789=>22958,39790=>22959,39800=>22960,39807=>22961,39813=>22962,39815=>22963,39817=>22964,39819=>22965,39821=>22966,39828=>22967,39834=>22968,39849=>22969,39863=>22970,39868=>22971,39888=>22972,39929=>22973,39951=>22974,39953=>22975,39966=>22976,39974=>22977,39976=>22978,39997=>22979,40003=>22980,40014=>22981,40030=>22982,40059=>22983,40183=>22984,40185=>22985,40220=>22986,40239=>22987,40243=>22988,40244=>22989,40250=>22990,40252=>22991,40261=>22992,40275=>22993,40276=>22994,40293=>22995,40323=>22996,40326=>22997,40334=>22998,40338=>22999,40339=>23000,40341=>23001,40343=>23002,40344=>23003,40362=>23004,40366=>23005,40394=>23007,40404=>23008,40405=>23009,40414=>23010,40430=>23011,40432=>23012,40446=>23013,40462=>23014,40464=>23015,40465=>23016,40466=>23017,40470=>23018,40583=>23019,40590=>23020,40591=>23021,40598=>23022,40600=>23023,40622=>23024,40627=>23025,40646=>23026,40648=>23027,40651=>23028,40661=>23029,40684=>23030,40685=>23031,40689=>23032,40693=>23033,40696=>23034,40721=>23035,40726=>23036,40730=>23037,40735=>23038,40753=>23039,40754=>23040,40764=>23041,40767=>23042,40771=>23043,40772=>23044,40775=>23045,40790=>23046,40798=>23047,40814=>23048,40819=>23049,40826=>23050,40829=>23051,40847=>23052,40849=>23053,40850=>23054,40854=>23055,40865=>23056,40867=>23057);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/uni2cid_ak12.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/uni2cid_ak12.php
new file mode 100644
index 00000000..6706723d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/uni2cid_ak12.php
@@ -0,0 +1,6 @@
+<?php
+// unicode to cid conversion table is from
+// ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/
+// cid2code.txt in ak12.tar.Z
+$cidinfo['uni2cid'] = array(32=>1,33=>2,34=>3,35=>4,36=>5,37=>6,38=>7,39=>8,40=>9,41=>10,42=>11,43=>12,44=>13,45=>14,46=>15,47=>16,48=>17,49=>18,50=>19,51=>20,52=>21,53=>22,54=>23,55=>24,56=>25,57=>26,58=>27,59=>28,60=>29,61=>30,62=>31,63=>32,64=>33,65=>34,66=>35,67=>36,68=>37,69=>38,70=>39,71=>40,72=>41,73=>42,74=>43,75=>44,76=>45,77=>46,78=>47,79=>48,80=>49,81=>50,82=>51,83=>52,84=>53,85=>54,86=>55,87=>56,88=>57,89=>58,90=>59,91=>60,92=>61,93=>62,94=>63,95=>64,96=>65,97=>66,98=>67,99=>68,100=>69,101=>70,102=>71,103=>72,104=>73,105=>74,106=>75,107=>76,108=>77,109=>78,110=>79,111=>80,112=>81,113=>82,114=>83,115=>84,116=>85,117=>86,118=>87,119=>88,120=>89,121=>90,122=>91,123=>92,124=>93,125=>94,126=>95,8361=>96,8208=>97,169=>98,12644=>101,12288=>101,12289=>102,12290=>103,183=>104,12539=>104,8229=>105,8943=>106,8230=>106,168=>107,12291=>108,8211=>109,8212=>110,8214=>111,65340=>112,65374=>113,8216=>114,8217=>115,8220=>116,8221=>117,12308=>118,12309=>119,12296=>120,12297=>121,12298=>122,12299=>123,12300=>124,12301=>125,12302=>126,12303=>127,12304=>128,12305=>129,177=>130,215=>131,247=>132,8800=>133,8804=>134,8805=>135,8734=>136,8756=>137,176=>138,8242=>139,8243=>140,8451=>141,8491=>142,65504=>143,65505=>144,65509=>145,9794=>146,9792=>147,8736=>148,8869=>149,8978=>150,8706=>151,8711=>152,8801=>153,8786=>154,167=>155,8251=>156,9734=>157,9733=>158,9675=>159,9679=>160,9678=>161,9671=>162,9670=>163,9633=>164,9632=>165,9651=>166,9650=>167,9661=>168,9660=>169,8594=>170,8592=>171,8593=>172,8595=>173,8596=>174,12307=>175,171=>176,187=>177,8730=>178,8765=>179,8733=>180,8757=>181,8747=>182,8748=>183,8712=>184,8715=>185,8838=>186,8839=>187,8834=>188,8835=>189,8746=>190,8745=>191,8743=>192,8744=>193,65506=>194,8658=>195,8660=>196,8704=>197,8707=>198,180=>199,732=>200,711=>201,728=>202,733=>203,730=>204,729=>205,184=>206,731=>207,161=>208,191=>209,8758=>210,8750=>211,8721=>212,8719=>213,164=>214,8457=>215,8240=>216,9665=>217,9664=>218,9655=>219,9654=>220,9828=>221,9824=>222,9825=>223,9829=>224,9831=>225,9827=>226,9673=>227,9672=>228,9635=>229,9680=>230,9681=>231,9618=>232,9636=>233,9637=>234,9640=>235,9639=>236,9638=>237,9641=>238,9832=>239,9743=>240,9742=>241,9756=>242,9758=>243,182=>244,8224=>245,8225=>246,8597=>247,8599=>248,8601=>249,8598=>250,8600=>251,9837=>252,9833=>253,9834=>254,9836=>255,12927=>256,12828=>257,8470=>258,13255=>259,8482=>260,13250=>261,13272=>262,8481=>263,65281=>264,65282=>265,65283=>266,65284=>267,65285=>268,65286=>269,65287=>270,65288=>271,65289=>272,65290=>273,65291=>274,65292=>275,65293=>276,65294=>277,65295=>278,65296=>279,65297=>280,65298=>281,65299=>282,65300=>283,65301=>284,65302=>285,65303=>286,65304=>287,65305=>288,65306=>289,65307=>290,65308=>291,65309=>292,65310=>293,65311=>294,65312=>295,65313=>296,65314=>297,65315=>298,65316=>299,65317=>300,65318=>301,65319=>302,65320=>303,65321=>304,65322=>305,65323=>306,65324=>307,65325=>308,65326=>309,65327=>310,65328=>311,65329=>312,65330=>313,65331=>314,65332=>315,65333=>316,65334=>317,65335=>318,65336=>319,65337=>320,65338=>321,65339=>322,65510=>323,65341=>324,65342=>325,65343=>326,65344=>327,65345=>328,65346=>329,65347=>330,65348=>331,65349=>332,65350=>333,65351=>334,65352=>335,65353=>336,65354=>337,65355=>338,65356=>339,65357=>340,65358=>341,65359=>342,65360=>343,65361=>344,65362=>345,65363=>346,65364=>347,65365=>348,65366=>349,65367=>350,65368=>351,65369=>352,65370=>353,65371=>354,65372=>355,65373=>356,65507=>357,12593=>358,12594=>359,12595=>360,12596=>361,12597=>362,12598=>363,12599=>364,12600=>365,12601=>366,12602=>367,12603=>368,12604=>369,12605=>370,12606=>371,12607=>372,12608=>373,12609=>374,12610=>375,12611=>376,12612=>377,12613=>378,12614=>379,12615=>380,12616=>381,12617=>382,12618=>383,12619=>384,12620=>385,12621=>386,12622=>387,12623=>388,12624=>389,12625=>390,12626=>391,12627=>392,12628=>393,12629=>394,12630=>395,12631=>396,12632=>397,12633=>398,12634=>399,12635=>400,12636=>401,12637=>402,12638=>403,12639=>404,12640=>405,12641=>406,12642=>407,12643=>408,12645=>409,12646=>410,12647=>411,12648=>412,12649=>413,12650=>414,12651=>415,12652=>416,12653=>417,12654=>418,12655=>419,12656=>420,12657=>421,12658=>422,12659=>423,12660=>424,12661=>425,12662=>426,12663=>427,12664=>428,12665=>429,12666=>430,12667=>431,12668=>432,12669=>433,12670=>434,12671=>435,12672=>436,12673=>437,12674=>438,12675=>439,12676=>440,12677=>441,12678=>442,12679=>443,12680=>444,12681=>445,12682=>446,12683=>447,12684=>448,12685=>449,12686=>450,8560=>451,8561=>452,8562=>453,8563=>454,8564=>455,8565=>456,8566=>457,8567=>458,8568=>459,8569=>460,8544=>461,8545=>462,8546=>463,8547=>464,8548=>465,8549=>466,8550=>467,8551=>468,8552=>469,8553=>470,913=>471,914=>472,915=>473,916=>474,917=>475,918=>476,919=>477,920=>478,921=>479,922=>480,923=>481,924=>482,925=>483,926=>484,927=>485,928=>486,929=>487,931=>488,932=>489,933=>490,934=>491,935=>492,936=>493,937=>494,945=>495,946=>496,947=>497,948=>498,949=>499,950=>500,951=>501,952=>502,953=>503,954=>504,955=>505,956=>506,957=>507,958=>508,959=>509,960=>510,961=>511,963=>512,964=>513,965=>514,966=>515,967=>516,968=>517,969=>518,9472=>519,9474=>520,9484=>521,9488=>522,9496=>523,9492=>524,9500=>525,9516=>526,9508=>527,9524=>528,9532=>529,9473=>530,9475=>531,9487=>532,9491=>533,9499=>534,9495=>535,9507=>536,9523=>537,9515=>538,9531=>539,9547=>540,9504=>541,9519=>542,9512=>543,9527=>544,9535=>545,9501=>546,9520=>547,9509=>548,9528=>549,9538=>550,9490=>551,9489=>552,9498=>553,9497=>554,9494=>555,9493=>556,9486=>557,9485=>558,9502=>559,9503=>560,9505=>561,9506=>562,9510=>563,9511=>564,9513=>565,9514=>566,9517=>567,9518=>568,9521=>569,9522=>570,9525=>571,9526=>572,9529=>573,9530=>574,9533=>575,9534=>576,9536=>577,9537=>578,9539=>579,9540=>580,9541=>581,9542=>582,9543=>583,9544=>584,9545=>585,9546=>586,13205=>587,13206=>588,13207=>589,8467=>590,13208=>591,13252=>592,13219=>593,13220=>594,13221=>595,13222=>596,13209=>597,13210=>598,13211=>599,13212=>600,13213=>601,13214=>602,13215=>603,13216=>604,13217=>605,13218=>606,13258=>607,13197=>608,13198=>609,13199=>610,13263=>611,13192=>612,13193=>613,13256=>614,13223=>615,13224=>616,13232=>617,13233=>618,13234=>619,13235=>620,13236=>621,13237=>622,13238=>623,13239=>624,13240=>625,13241=>626,13184=>627,13185=>628,13186=>629,13187=>630,13188=>631,13242=>632,13243=>633,13244=>634,13245=>635,13246=>636,13247=>637,13200=>638,13201=>639,13202=>640,13203=>641,13204=>642,8486=>643,13248=>644,13249=>645,13194=>646,13195=>647,13196=>648,13270=>649,13253=>650,13229=>651,13230=>652,13231=>653,13275=>654,13225=>655,13226=>656,13227=>657,13228=>658,13277=>659,13264=>660,13267=>661,13251=>662,13257=>663,13276=>664,13254=>665,198=>666,208=>667,170=>668,294=>669,306=>670,319=>671,321=>672,216=>673,338=>674,186=>675,222=>676,358=>677,330=>678,12896=>679,12897=>680,12898=>681,12899=>682,12900=>683,12901=>684,12902=>685,12903=>686,12904=>687,12905=>688,12906=>689,12907=>690,12908=>691,12909=>692,12910=>693,12911=>694,12912=>695,12913=>696,12914=>697,12915=>698,12916=>699,12917=>700,12918=>701,12919=>702,12920=>703,12921=>704,12922=>705,12923=>706,9424=>707,9425=>708,9426=>709,9427=>710,9428=>711,9429=>712,9430=>713,9431=>714,9432=>715,9433=>716,9434=>717,9435=>718,9436=>719,9437=>720,9438=>721,9439=>722,9440=>723,9441=>724,9442=>725,9443=>726,9444=>727,9445=>728,9446=>729,9447=>730,9448=>731,9449=>732,9312=>733,9313=>734,9314=>735,9315=>736,9316=>737,9317=>738,9318=>739,9319=>740,9320=>741,9321=>742,9322=>743,9323=>744,9324=>745,9325=>746,9326=>747,189=>748,8531=>749,8532=>750,188=>751,190=>752,8539=>753,8540=>754,8541=>755,8542=>756,230=>757,273=>758,240=>759,295=>760,305=>761,307=>762,312=>763,320=>764,322=>765,248=>766,339=>767,223=>768,254=>769,359=>770,331=>771,329=>772,12800=>773,12801=>774,12802=>775,12803=>776,12804=>777,12805=>778,12806=>779,12807=>780,12808=>781,12809=>782,12810=>783,12811=>784,12812=>785,12813=>786,12814=>787,12815=>788,12816=>789,12817=>790,12818=>791,12819=>792,12820=>793,12821=>794,12822=>795,12823=>796,12824=>797,12825=>798,12826=>799,12827=>800,9372=>801,9373=>802,9374=>803,9375=>804,9376=>805,9377=>806,9378=>807,9379=>808,9380=>809,9381=>810,9382=>811,9383=>812,9384=>813,9385=>814,9386=>815,9387=>816,9388=>817,9389=>818,9390=>819,9391=>820,9392=>821,9393=>822,9394=>823,9395=>824,9396=>825,9397=>826,9332=>827,9333=>828,9334=>829,9335=>830,9336=>831,9337=>832,9338=>833,9339=>834,9340=>835,9341=>836,9342=>837,9343=>838,9344=>839,9345=>840,9346=>841,185=>842,178=>843,179=>844,8308=>845,8319=>846,8321=>847,8322=>848,8323=>849,8324=>850,12353=>851,12354=>852,12355=>853,12356=>854,12357=>855,12358=>856,12359=>857,12360=>858,12361=>859,12362=>860,12363=>861,12364=>862,12365=>863,12366=>864,12367=>865,12368=>866,12369=>867,12370=>868,12371=>869,12372=>870,12373=>871,12374=>872,12375=>873,12376=>874,12377=>875,12378=>876,12379=>877,12380=>878,12381=>879,12382=>880,12383=>881,12384=>882,12385=>883,12386=>884,12387=>885,12388=>886,12389=>887,12390=>888,12391=>889,12392=>890,12393=>891,12394=>892,12395=>893,12396=>894,12397=>895,12398=>896,12399=>897,12400=>898,12401=>899,12402=>900,12403=>901,12404=>902,12405=>903,12406=>904,12407=>905,12408=>906,12409=>907,12410=>908,12411=>909,12412=>910,12413=>911,12414=>912,12415=>913,12416=>914,12417=>915,12418=>916,12419=>917,12420=>918,12421=>919,12422=>920,12423=>921,12424=>922,12425=>923,12426=>924,12427=>925,12428=>926,12429=>927,12430=>928,12431=>929,12432=>930,12433=>931,12434=>932,12435=>933,12449=>934,12450=>935,12451=>936,12452=>937,12453=>938,12454=>939,12455=>940,12456=>941,12457=>942,12458=>943,12459=>944,12460=>945,12461=>946,12462=>947,12463=>948,12464=>949,12465=>950,12466=>951,12467=>952,12468=>953,12469=>954,12470=>955,12471=>956,12472=>957,12473=>958,12474=>959,12475=>960,12476=>961,12477=>962,12478=>963,12479=>964,12480=>965,12481=>966,12482=>967,12483=>968,12484=>969,12485=>970,12486=>971,12487=>972,12488=>973,12489=>974,12490=>975,12491=>976,12492=>977,12493=>978,12494=>979,12495=>980,12496=>981,12497=>982,12498=>983,12499=>984,12500=>985,12501=>986,12502=>987,12503=>988,12504=>989,12505=>990,12506=>991,12507=>992,12508=>993,12509=>994,12510=>995,12511=>996,12512=>997,12513=>998,12514=>999,12515=>1000,12516=>1001,12517=>1002,12518=>1003,12519=>1004,12520=>1005,12521=>1006,12522=>1007,12523=>1008,12524=>1009,12525=>1010,12526=>1011,12527=>1012,12528=>1013,12529=>1014,12530=>1015,12531=>1016,12532=>1017,12533=>1018,12534=>1019,1040=>1020,1041=>1021,1042=>1022,1043=>1023,1044=>1024,1045=>1025,1025=>1026,1046=>1027,1047=>1028,1048=>1029,1049=>1030,1050=>1031,1051=>1032,1052=>1033,1053=>1034,1054=>1035,1055=>1036,1056=>1037,1057=>1038,1058=>1039,1059=>1040,1060=>1041,1061=>1042,1062=>1043,1063=>1044,1064=>1045,1065=>1046,1066=>1047,1067=>1048,1068=>1049,1069=>1050,1070=>1051,1071=>1052,1072=>1053,1073=>1054,1074=>1055,1075=>1056,1076=>1057,1077=>1058,1105=>1059,1078=>1060,1079=>1061,1080=>1062,1081=>1063,1082=>1064,1083=>1065,1084=>1066,1085=>1067,1086=>1068,1087=>1069,1088=>1070,1089=>1071,1090=>1072,1091=>1073,1092=>1074,1093=>1075,1094=>1076,1095=>1077,1096=>1078,1097=>1079,1098=>1080,1099=>1081,1100=>1082,1101=>1083,1102=>1084,1103=>1085,44032=>1086,44033=>1087,44036=>1088,44039=>1089,44040=>1090,44041=>1091,44042=>1092,44048=>1093,44049=>1094,44050=>1095,44051=>1096,44052=>1097,44053=>1098,44054=>1099,44055=>1100,44057=>1101,44058=>1102,44059=>1103,44060=>1104,44061=>1105,44064=>1106,44068=>1107,44076=>1108,44077=>1109,44079=>1110,44080=>1111,44081=>1112,44088=>1113,44089=>1114,44092=>1115,44096=>1116,44107=>1117,44109=>1118,44116=>1119,44120=>1120,44124=>1121,44144=>1122,44145=>1123,44148=>1124,44151=>1125,44152=>1126,44154=>1127,44160=>1128,44161=>1129,44163=>1130,44164=>1131,44165=>1132,44166=>1133,44169=>1134,44170=>1135,44171=>1136,44172=>1137,44176=>1138,44180=>1139,44188=>1140,44189=>1141,44191=>1142,44192=>1143,44193=>1144,44200=>1145,44201=>1146,44202=>1147,44204=>1148,44207=>1149,44208=>1150,44216=>1151,44217=>1152,44219=>1153,44220=>1154,44221=>1155,44225=>1156,44228=>1157,44232=>1158,44236=>1159,44245=>1160,44247=>1161,44256=>1162,44257=>1163,44260=>1164,44263=>1165,44264=>1166,44266=>1167,44268=>1168,44271=>1169,44272=>1170,44273=>1171,44275=>1172,44277=>1173,44278=>1174,44284=>1175,44285=>1176,44288=>1177,44292=>1178,44294=>1179,44300=>1180,44301=>1181,44303=>1182,44305=>1183,44312=>1184,44316=>1185,44320=>1186,44329=>1187,44332=>1188,44333=>1189,44340=>1190,44341=>1191,44344=>1192,44348=>1193,44356=>1194,44357=>1195,44359=>1196,44361=>1197,44368=>1198,44372=>1199,44376=>1200,44385=>1201,44387=>1202,44396=>1203,44397=>1204,44400=>1205,44403=>1206,44404=>1207,44405=>1208,44406=>1209,44411=>1210,44412=>1211,44413=>1212,44415=>1213,44417=>1214,44418=>1215,44424=>1216,44425=>1217,44428=>1218,44432=>1219,44444=>1220,44445=>1221,44452=>1222,44471=>1223,44480=>1224,44481=>1225,44484=>1226,44488=>1227,44496=>1228,44497=>1229,44499=>1230,44508=>1231,44512=>1232,44516=>1233,44536=>1234,44537=>1235,44540=>1236,44543=>1237,44544=>1238,44545=>1239,44552=>1240,44553=>1241,44555=>1242,44557=>1243,44564=>1244,44592=>1245,44593=>1246,44596=>1247,44599=>1248,44600=>1249,44602=>1250,44608=>1251,44609=>1252,44611=>1253,44613=>1254,44614=>1255,44618=>1256,44620=>1257,44621=>1258,44622=>1259,44624=>1260,44628=>1261,44630=>1262,44636=>1263,44637=>1264,44639=>1265,44640=>1266,44641=>1267,44645=>1268,44648=>1269,44649=>1270,44652=>1271,44656=>1272,44664=>1273,44665=>1274,44667=>1275,44668=>1276,44669=>1277,44676=>1278,44677=>1279,44684=>1280,44732=>1281,44733=>1282,44734=>1283,44736=>1284,44740=>1285,44748=>1286,44749=>1287,44751=>1288,44752=>1289,44753=>1290,44760=>1291,44761=>1292,44764=>1293,44776=>1294,44779=>1295,44781=>1296,44788=>1297,44792=>1298,44796=>1299,44807=>1300,44808=>1301,44813=>1302,44816=>1303,44844=>1304,44845=>1305,44848=>1306,44850=>1307,44852=>1308,44860=>1309,44861=>1310,44863=>1311,44865=>1312,44866=>1313,44867=>1314,44872=>1315,44873=>1316,44880=>1317,44892=>1318,44893=>1319,44900=>1320,44901=>1321,44921=>1322,44928=>1323,44932=>1324,44936=>1325,44944=>1326,44945=>1327,44949=>1328,44956=>1329,44984=>1330,44985=>1331,44988=>1332,44992=>1333,44999=>1334,45000=>1335,45001=>1336,45003=>1337,45005=>1338,45006=>1339,45012=>1340,45020=>1341,45032=>1342,45033=>1343,45040=>1344,45041=>1345,45044=>1346,45048=>1347,45056=>1348,45057=>1349,45060=>1350,45068=>1351,45072=>1352,45076=>1353,45084=>1354,45085=>1355,45096=>1356,45124=>1357,45125=>1358,45128=>1359,45130=>1360,45132=>1361,45134=>1362,45139=>1363,45140=>1364,45141=>1365,45143=>1366,45145=>1367,45149=>1368,45180=>1369,45181=>1370,45184=>1371,45188=>1372,45196=>1373,45197=>1374,45199=>1375,45201=>1376,45208=>1377,45209=>1378,45210=>1379,45212=>1380,45215=>1381,45216=>1382,45217=>1383,45218=>1384,45224=>1385,45225=>1386,45227=>1387,45228=>1388,45229=>1389,45230=>1390,45231=>1391,45233=>1392,45235=>1393,45236=>1394,45237=>1395,45240=>1396,45244=>1397,45252=>1398,45253=>1399,45255=>1400,45256=>1401,45257=>1402,45264=>1403,45265=>1404,45268=>1405,45272=>1406,45280=>1407,45285=>1408,45320=>1409,45321=>1410,45323=>1411,45324=>1412,45328=>1413,45330=>1414,45331=>1415,45336=>1416,45337=>1417,45339=>1418,45340=>1419,45341=>1420,45347=>1421,45348=>1422,45349=>1423,45352=>1424,45356=>1425,45364=>1426,45365=>1427,45367=>1428,45368=>1429,45369=>1430,45376=>1431,45377=>1432,45380=>1433,45384=>1434,45392=>1435,45393=>1436,45396=>1437,45397=>1438,45400=>1439,45404=>1440,45408=>1441,45432=>1442,45433=>1443,45436=>1444,45440=>1445,45442=>1446,45448=>1447,45449=>1448,45451=>1449,45453=>1450,45458=>1451,45459=>1452,45460=>1453,45464=>1454,45468=>1455,45480=>1456,45516=>1457,45520=>1458,45524=>1459,45532=>1460,45533=>1461,45535=>1462,45544=>1463,45545=>1464,45548=>1465,45552=>1466,45561=>1467,45563=>1468,45565=>1469,45572=>1470,45573=>1471,45576=>1472,45579=>1473,45580=>1474,45588=>1475,45589=>1476,45591=>1477,45593=>1478,45600=>1479,45620=>1480,45628=>1481,45656=>1482,45660=>1483,45664=>1484,45672=>1485,45673=>1486,45684=>1487,45685=>1488,45692=>1489,45700=>1490,45701=>1491,45705=>1492,45712=>1493,45713=>1494,45716=>1495,45720=>1496,45721=>1497,45722=>1498,45728=>1499,45729=>1500,45731=>1501,45733=>1502,45734=>1503,45738=>1504,45740=>1505,45744=>1506,45748=>1507,45768=>1508,45769=>1509,45772=>1510,45776=>1511,45778=>1512,45784=>1513,45785=>1514,45787=>1515,45789=>1516,45794=>1517,45796=>1518,45797=>1519,45798=>1520,45800=>1521,45803=>1522,45804=>1523,45805=>1524,45806=>1525,45807=>1526,45811=>1527,45812=>1528,45813=>1529,45815=>1530,45816=>1531,45817=>1532,45818=>1533,45819=>1534,45823=>1535,45824=>1536,45825=>1537,45828=>1538,45832=>1539,45840=>1540,45841=>1541,45843=>1542,45844=>1543,45845=>1544,45852=>1545,45908=>1546,45909=>1547,45910=>1548,45912=>1549,45915=>1550,45916=>1551,45918=>1552,45919=>1553,45924=>1554,45925=>1555,45927=>1556,45929=>1557,45931=>1558,45934=>1559,45936=>1560,45937=>1561,45940=>1562,45944=>1563,45952=>1564,45953=>1565,45955=>1566,45956=>1567,45957=>1568,45964=>1569,45968=>1570,45972=>1571,45984=>1572,45985=>1573,45992=>1574,45996=>1575,46020=>1576,46021=>1577,46024=>1578,46027=>1579,46028=>1580,46030=>1581,46032=>1582,46036=>1583,46037=>1584,46039=>1585,46041=>1586,46043=>1587,46045=>1588,46048=>1589,46052=>1590,46056=>1591,46076=>1592,46096=>1593,46104=>1594,46108=>1595,46112=>1596,46120=>1597,46121=>1598,46123=>1599,46132=>1600,46160=>1601,46161=>1602,46164=>1603,46168=>1604,46176=>1605,46177=>1606,46179=>1607,46181=>1608,46188=>1609,46208=>1610,46216=>1611,46237=>1612,46244=>1613,46248=>1614,46252=>1615,46261=>1616,46263=>1617,46265=>1618,46272=>1619,46276=>1620,46280=>1621,46288=>1622,46293=>1623,46300=>1624,46301=>1625,46304=>1626,46307=>1627,46308=>1628,46310=>1629,46316=>1630,46317=>1631,46319=>1632,46321=>1633,46328=>1634,46356=>1635,46357=>1636,46360=>1637,46363=>1638,46364=>1639,46372=>1640,46373=>1641,46375=>1642,46376=>1643,46377=>1644,46378=>1645,46384=>1646,46385=>1647,46388=>1648,46392=>1649,46400=>1650,46401=>1651,46403=>1652,46404=>1653,46405=>1654,46411=>1655,46412=>1656,46413=>1657,46416=>1658,46420=>1659,46428=>1660,46429=>1661,46431=>1662,46432=>1663,46433=>1664,46496=>1665,46497=>1666,46500=>1667,46504=>1668,46506=>1669,46507=>1670,46512=>1671,46513=>1672,46515=>1673,46516=>1674,46517=>1675,46523=>1676,46524=>1677,46525=>1678,46528=>1679,46532=>1680,46540=>1681,46541=>1682,46543=>1683,46544=>1684,46545=>1685,46552=>1686,46572=>1687,46608=>1688,46609=>1689,46612=>1690,46616=>1691,46629=>1692,46636=>1693,46644=>1694,46664=>1695,46692=>1696,46696=>1697,46748=>1698,46749=>1699,46752=>1700,46756=>1701,46763=>1702,46764=>1703,46769=>1704,46804=>1705,46832=>1706,46836=>1707,46840=>1708,46848=>1709,46849=>1710,46853=>1711,46888=>1712,46889=>1713,46892=>1714,46895=>1715,46896=>1716,46904=>1717,46905=>1718,46907=>1719,46916=>1720,46920=>1721,46924=>1722,46932=>1723,46933=>1724,46944=>1725,46948=>1726,46952=>1727,46960=>1728,46961=>1729,46963=>1730,46965=>1731,46972=>1732,46973=>1733,46976=>1734,46980=>1735,46988=>1736,46989=>1737,46991=>1738,46992=>1739,46993=>1740,46994=>1741,46998=>1742,46999=>1743,47000=>1744,47001=>1745,47004=>1746,47008=>1747,47016=>1748,47017=>1749,47019=>1750,47020=>1751,47021=>1752,47028=>1753,47029=>1754,47032=>1755,47047=>1756,47049=>1757,47084=>1758,47085=>1759,47088=>1760,47092=>1761,47100=>1762,47101=>1763,47103=>1764,47104=>1765,47105=>1766,47111=>1767,47112=>1768,47113=>1769,47116=>1770,47120=>1771,47128=>1772,47129=>1773,47131=>1774,47133=>1775,47140=>1776,47141=>1777,47144=>1778,47148=>1779,47156=>1780,47157=>1781,47159=>1782,47160=>1783,47161=>1784,47168=>1785,47172=>1786,47185=>1787,47187=>1788,47196=>1789,47197=>1790,47200=>1791,47204=>1792,47212=>1793,47213=>1794,47215=>1795,47217=>1796,47224=>1797,47228=>1798,47245=>1799,47272=>1800,47280=>1801,47284=>1802,47288=>1803,47296=>1804,47297=>1805,47299=>1806,47301=>1807,47308=>1808,47312=>1809,47316=>1810,47325=>1811,47327=>1812,47329=>1813,47336=>1814,47337=>1815,47340=>1816,47344=>1817,47352=>1818,47353=>1819,47355=>1820,47357=>1821,47364=>1822,47384=>1823,47392=>1824,47420=>1825,47421=>1826,47424=>1827,47428=>1828,47436=>1829,47439=>1830,47441=>1831,47448=>1832,47449=>1833,47452=>1834,47456=>1835,47464=>1836,47465=>1837,47467=>1838,47469=>1839,47476=>1840,47477=>1841,47480=>1842,47484=>1843,47492=>1844,47493=>1845,47495=>1846,47497=>1847,47498=>1848,47501=>1849,47502=>1850,47532=>1851,47533=>1852,47536=>1853,47540=>1854,47548=>1855,47549=>1856,47551=>1857,47553=>1858,47560=>1859,47561=>1860,47564=>1861,47566=>1862,47567=>1863,47568=>1864,47569=>1865,47570=>1866,47576=>1867,47577=>1868,47579=>1869,47581=>1870,47582=>1871,47585=>1872,47587=>1873,47588=>1874,47589=>1875,47592=>1876,47596=>1877,47604=>1878,47605=>1879,47607=>1880,47608=>1881,47609=>1882,47610=>1883,47616=>1884,47617=>1885,47624=>1886,47637=>1887,47672=>1888,47673=>1889,47676=>1890,47680=>1891,47682=>1892,47688=>1893,47689=>1894,47691=>1895,47693=>1896,47694=>1897,47699=>1898,47700=>1899,47701=>1900,47704=>1901,47708=>1902,47716=>1903,47717=>1904,47719=>1905,47720=>1906,47721=>1907,47728=>1908,47729=>1909,47732=>1910,47736=>1911,47747=>1912,47748=>1913,47749=>1914,47751=>1915,47756=>1916,47784=>1917,47785=>1918,47787=>1919,47788=>1920,47792=>1921,47794=>1922,47800=>1923,47801=>1924,47803=>1925,47805=>1926,47812=>1927,47816=>1928,47832=>1929,47833=>1930,47868=>1931,47872=>1932,47876=>1933,47885=>1934,47887=>1935,47889=>1936,47896=>1937,47900=>1938,47904=>1939,47913=>1940,47915=>1941,47924=>1942,47925=>1943,47926=>1944,47928=>1945,47931=>1946,47932=>1947,47933=>1948,47934=>1949,47940=>1950,47941=>1951,47943=>1952,47945=>1953,47949=>1954,47951=>1955,47952=>1956,47956=>1957,47960=>1958,47969=>1959,47971=>1960,47980=>1961,48008=>1962,48012=>1963,48016=>1964,48036=>1965,48040=>1966,48044=>1967,48052=>1968,48055=>1969,48064=>1970,48068=>1971,48072=>1972,48080=>1973,48083=>1974,48120=>1975,48121=>1976,48124=>1977,48127=>1978,48128=>1979,48130=>1980,48136=>1981,48137=>1982,48139=>1983,48140=>1984,48141=>1985,48143=>1986,48145=>1987,48148=>1988,48149=>1989,48150=>1990,48151=>1991,48152=>1992,48155=>1993,48156=>1994,48157=>1995,48158=>1996,48159=>1997,48164=>1998,48165=>1999,48167=>2000,48169=>2001,48173=>2002,48176=>2003,48177=>2004,48180=>2005,48184=>2006,48192=>2007,48193=>2008,48195=>2009,48196=>2010,48197=>2011,48201=>2012,48204=>2013,48205=>2014,48208=>2015,48221=>2016,48260=>2017,48261=>2018,48264=>2019,48267=>2020,48268=>2021,48270=>2022,48276=>2023,48277=>2024,48279=>2025,48281=>2026,48282=>2027,48288=>2028,48289=>2029,48292=>2030,48295=>2031,48296=>2032,48304=>2033,48305=>2034,48307=>2035,48308=>2036,48309=>2037,48316=>2038,48317=>2039,48320=>2040,48324=>2041,48333=>2042,48335=>2043,48336=>2044,48337=>2045,48341=>2046,48344=>2047,48348=>2048,48372=>2049,48373=>2050,48374=>2051,48376=>2052,48380=>2053,48388=>2054,48389=>2055,48391=>2056,48393=>2057,48400=>2058,48404=>2059,48420=>2060,48428=>2061,48448=>2062,48456=>2063,48457=>2064,48460=>2065,48464=>2066,48472=>2067,48473=>2068,48484=>2069,48488=>2070,48512=>2071,48513=>2072,48516=>2073,48519=>2074,48520=>2075,48521=>2076,48522=>2077,48528=>2078,48529=>2079,48531=>2080,48533=>2081,48537=>2082,48538=>2083,48540=>2084,48548=>2085,48560=>2086,48568=>2087,48596=>2088,48597=>2089,48600=>2090,48604=>2091,48617=>2092,48624=>2093,48628=>2094,48632=>2095,48640=>2096,48643=>2097,48645=>2098,48652=>2099,48653=>2100,48656=>2101,48660=>2102,48668=>2103,48669=>2104,48671=>2105,48708=>2106,48709=>2107,48712=>2108,48716=>2109,48718=>2110,48724=>2111,48725=>2112,48727=>2113,48729=>2114,48730=>2115,48731=>2116,48736=>2117,48737=>2118,48740=>2119,48744=>2120,48746=>2121,48752=>2122,48753=>2123,48755=>2124,48756=>2125,48757=>2126,48763=>2127,48764=>2128,48765=>2129,48768=>2130,48772=>2131,48780=>2132,48781=>2133,48783=>2134,48784=>2135,48785=>2136,48792=>2137,48793=>2138,48808=>2139,48848=>2140,48849=>2141,48852=>2142,48855=>2143,48856=>2144,48864=>2145,48867=>2146,48868=>2147,48869=>2148,48876=>2149,48897=>2150,48904=>2151,48905=>2152,48920=>2153,48921=>2154,48923=>2155,48924=>2156,48925=>2157,48960=>2158,48961=>2159,48964=>2160,48968=>2161,48976=>2162,48977=>2163,48981=>2164,49044=>2165,49072=>2166,49093=>2167,49100=>2168,49101=>2169,49104=>2170,49108=>2171,49116=>2172,49119=>2173,49121=>2174,49212=>2175,49233=>2176,49240=>2177,49244=>2178,49248=>2179,49256=>2180,49257=>2181,49296=>2182,49297=>2183,49300=>2184,49304=>2185,49312=>2186,49313=>2187,49315=>2188,49317=>2189,49324=>2190,49325=>2191,49327=>2192,49328=>2193,49331=>2194,49332=>2195,49333=>2196,49334=>2197,49340=>2198,49341=>2199,49343=>2200,49344=>2201,49345=>2202,49349=>2203,49352=>2204,49353=>2205,49356=>2206,49360=>2207,49368=>2208,49369=>2209,49371=>2210,49372=>2211,49373=>2212,49380=>2213,49381=>2214,49384=>2215,49388=>2216,49396=>2217,49397=>2218,49399=>2219,49401=>2220,49408=>2221,49412=>2222,49416=>2223,49424=>2224,49429=>2225,49436=>2226,49437=>2227,49438=>2228,49439=>2229,49440=>2230,49443=>2231,49444=>2232,49446=>2233,49447=>2234,49452=>2235,49453=>2236,49455=>2237,49456=>2238,49457=>2239,49462=>2240,49464=>2241,49465=>2242,49468=>2243,49472=>2244,49480=>2245,49481=>2246,49483=>2247,49484=>2248,49485=>2249,49492=>2250,49493=>2251,49496=>2252,49500=>2253,49508=>2254,49509=>2255,49511=>2256,49512=>2257,49513=>2258,49520=>2259,49524=>2260,49528=>2261,49541=>2262,49548=>2263,49549=>2264,49550=>2265,49552=>2266,49556=>2267,49558=>2268,49564=>2269,49565=>2270,49567=>2271,49569=>2272,49573=>2273,49576=>2274,49577=>2275,49580=>2276,49584=>2277,49597=>2278,49604=>2279,49608=>2280,49612=>2281,49620=>2282,49623=>2283,49624=>2284,49632=>2285,49636=>2286,49640=>2287,49648=>2288,49649=>2289,49651=>2290,49660=>2291,49661=>2292,49664=>2293,49668=>2294,49676=>2295,49677=>2296,49679=>2297,49681=>2298,49688=>2299,49689=>2300,49692=>2301,49695=>2302,49696=>2303,49704=>2304,49705=>2305,49707=>2306,49709=>2307,49711=>2308,49713=>2309,49714=>2310,49716=>2311,49736=>2312,49744=>2313,49745=>2314,49748=>2315,49752=>2316,49760=>2317,49765=>2318,49772=>2319,49773=>2320,49776=>2321,49780=>2322,49788=>2323,49789=>2324,49791=>2325,49793=>2326,49800=>2327,49801=>2328,49808=>2329,49816=>2330,49819=>2331,49821=>2332,49828=>2333,49829=>2334,49832=>2335,49836=>2336,49837=>2337,49844=>2338,49845=>2339,49847=>2340,49849=>2341,49884=>2342,49885=>2343,49888=>2344,49891=>2345,49892=>2346,49899=>2347,49900=>2348,49901=>2349,49903=>2350,49905=>2351,49910=>2352,49912=>2353,49913=>2354,49915=>2355,49916=>2356,49920=>2357,49928=>2358,49929=>2359,49932=>2360,49933=>2361,49939=>2362,49940=>2363,49941=>2364,49944=>2365,49948=>2366,49956=>2367,49957=>2368,49960=>2369,49961=>2370,49989=>2371,50024=>2372,50025=>2373,50028=>2374,50032=>2375,50034=>2376,50040=>2377,50041=>2378,50044=>2379,50045=>2380,50052=>2381,50056=>2382,50060=>2383,50112=>2384,50136=>2385,50137=>2386,50140=>2387,50143=>2388,50144=>2389,50146=>2390,50152=>2391,50153=>2392,50157=>2393,50164=>2394,50165=>2395,50168=>2396,50184=>2397,50192=>2398,50212=>2399,50220=>2400,50224=>2401,50228=>2402,50236=>2403,50237=>2404,50248=>2405,50276=>2406,50277=>2407,50280=>2408,50284=>2409,50292=>2410,50293=>2411,50297=>2412,50304=>2413,50324=>2414,50332=>2415,50360=>2416,50364=>2417,50409=>2418,50416=>2419,50417=>2420,50420=>2421,50424=>2422,50426=>2423,50431=>2424,50432=>2425,50433=>2426,50444=>2427,50448=>2428,50452=>2429,50460=>2430,50472=>2431,50473=>2432,50476=>2433,50480=>2434,50488=>2435,50489=>2436,50491=>2437,50493=>2438,50500=>2439,50501=>2440,50504=>2441,50505=>2442,50506=>2443,50508=>2444,50509=>2445,50510=>2446,50515=>2447,50516=>2448,50517=>2449,50519=>2450,50520=>2451,50521=>2452,50525=>2453,50526=>2454,50528=>2455,50529=>2456,50532=>2457,50536=>2458,50544=>2459,50545=>2460,50547=>2461,50548=>2462,50549=>2463,50556=>2464,50557=>2465,50560=>2466,50564=>2467,50567=>2468,50572=>2469,50573=>2470,50575=>2471,50577=>2472,50581=>2473,50583=>2474,50584=>2475,50588=>2476,50592=>2477,50601=>2478,50612=>2479,50613=>2480,50616=>2481,50617=>2482,50619=>2483,50620=>2484,50621=>2485,50622=>2486,50628=>2487,50629=>2488,50630=>2489,50631=>2490,50632=>2491,50633=>2492,50634=>2493,50636=>2494,50638=>2495,50640=>2496,50641=>2497,50644=>2498,50648=>2499,50656=>2500,50657=>2501,50659=>2502,50661=>2503,50668=>2504,50669=>2505,50670=>2506,50672=>2507,50676=>2508,50678=>2509,50679=>2510,50684=>2511,50685=>2512,50686=>2513,50687=>2514,50688=>2515,50689=>2516,50693=>2517,50694=>2518,50695=>2519,50696=>2520,50700=>2521,50704=>2522,50712=>2523,50713=>2524,50715=>2525,50716=>2526,50724=>2527,50725=>2528,50728=>2529,50732=>2530,50733=>2531,50734=>2532,50736=>2533,50739=>2534,50740=>2535,50741=>2536,50743=>2537,50745=>2538,50747=>2539,50752=>2540,50753=>2541,50756=>2542,50760=>2543,50768=>2544,50769=>2545,50771=>2546,50772=>2547,50773=>2548,50780=>2549,50781=>2550,50784=>2551,50796=>2552,50799=>2553,50801=>2554,50808=>2555,50809=>2556,50812=>2557,50816=>2558,50824=>2559,50825=>2560,50827=>2561,50829=>2562,50836=>2563,50837=>2564,50840=>2565,50844=>2566,50852=>2567,50853=>2568,50855=>2569,50857=>2570,50864=>2571,50865=>2572,50868=>2573,50872=>2574,50873=>2575,50874=>2576,50880=>2577,50881=>2578,50883=>2579,50885=>2580,50892=>2581,50893=>2582,50896=>2583,50900=>2584,50908=>2585,50909=>2586,50912=>2587,50913=>2588,50920=>2589,50921=>2590,50924=>2591,50928=>2592,50936=>2593,50937=>2594,50941=>2595,50948=>2596,50949=>2597,50952=>2598,50956=>2599,50964=>2600,50965=>2601,50967=>2602,50969=>2603,50976=>2604,50977=>2605,50980=>2606,50984=>2607,50992=>2608,50993=>2609,50995=>2610,50997=>2611,50999=>2612,51004=>2613,51005=>2614,51008=>2615,51012=>2616,51018=>2617,51020=>2618,51021=>2619,51023=>2620,51025=>2621,51026=>2622,51027=>2623,51028=>2624,51029=>2625,51030=>2626,51031=>2627,51032=>2628,51036=>2629,51040=>2630,51048=>2631,51051=>2632,51060=>2633,51061=>2634,51064=>2635,51068=>2636,51069=>2637,51070=>2638,51075=>2639,51076=>2640,51077=>2641,51079=>2642,51080=>2643,51081=>2644,51082=>2645,51086=>2646,51088=>2647,51089=>2648,51092=>2649,51094=>2650,51095=>2651,51096=>2652,51098=>2653,51104=>2654,51105=>2655,51107=>2656,51108=>2657,51109=>2658,51110=>2659,51116=>2660,51117=>2661,51120=>2662,51124=>2663,51132=>2664,51133=>2665,51135=>2666,51136=>2667,51137=>2668,51144=>2669,51145=>2670,51148=>2671,51150=>2672,51152=>2673,51160=>2674,51165=>2675,51172=>2676,51176=>2677,51180=>2678,51200=>2679,51201=>2680,51204=>2681,51208=>2682,51210=>2683,51216=>2684,51217=>2685,51219=>2686,51221=>2687,51222=>2688,51228=>2689,51229=>2690,51232=>2691,51236=>2692,51244=>2693,51245=>2694,51247=>2695,51249=>2696,51256=>2697,51260=>2698,51264=>2699,51272=>2700,51273=>2701,51276=>2702,51277=>2703,51284=>2704,51312=>2705,51313=>2706,51316=>2707,51320=>2708,51322=>2709,51328=>2710,51329=>2711,51331=>2712,51333=>2713,51334=>2714,51335=>2715,51339=>2716,51340=>2717,51341=>2718,51348=>2719,51357=>2720,51359=>2721,51361=>2722,51368=>2723,51388=>2724,51389=>2725,51396=>2726,51400=>2727,51404=>2728,51412=>2729,51413=>2730,51415=>2731,51417=>2732,51424=>2733,51425=>2734,51428=>2735,51445=>2736,51452=>2737,51453=>2738,51456=>2739,51460=>2740,51461=>2741,51462=>2742,51468=>2743,51469=>2744,51471=>2745,51473=>2746,51480=>2747,51500=>2748,51508=>2749,51536=>2750,51537=>2751,51540=>2752,51544=>2753,51552=>2754,51553=>2755,51555=>2756,51564=>2757,51568=>2758,51572=>2759,51580=>2760,51592=>2761,51593=>2762,51596=>2763,51600=>2764,51608=>2765,51609=>2766,51611=>2767,51613=>2768,51648=>2769,51649=>2770,51652=>2771,51655=>2772,51656=>2773,51658=>2774,51664=>2775,51665=>2776,51667=>2777,51669=>2778,51670=>2779,51673=>2780,51674=>2781,51676=>2782,51677=>2783,51680=>2784,51682=>2785,51684=>2786,51687=>2787,51692=>2788,51693=>2789,51695=>2790,51696=>2791,51697=>2792,51704=>2793,51705=>2794,51708=>2795,51712=>2796,51720=>2797,51721=>2798,51723=>2799,51724=>2800,51725=>2801,51732=>2802,51736=>2803,51753=>2804,51788=>2805,51789=>2806,51792=>2807,51796=>2808,51804=>2809,51805=>2810,51807=>2811,51808=>2812,51809=>2813,51816=>2814,51837=>2815,51844=>2816,51864=>2817,51900=>2818,51901=>2819,51904=>2820,51908=>2821,51916=>2822,51917=>2823,51919=>2824,51921=>2825,51923=>2826,51928=>2827,51929=>2828,51936=>2829,51948=>2830,51956=>2831,51976=>2832,51984=>2833,51988=>2834,51992=>2835,52000=>2836,52001=>2837,52033=>2838,52040=>2839,52041=>2840,52044=>2841,52048=>2842,52056=>2843,52057=>2844,52061=>2845,52068=>2846,52088=>2847,52089=>2848,52124=>2849,52152=>2850,52180=>2851,52196=>2852,52199=>2853,52201=>2854,52236=>2855,52237=>2856,52240=>2857,52244=>2858,52252=>2859,52253=>2860,52257=>2861,52258=>2862,52263=>2863,52264=>2864,52265=>2865,52268=>2866,52270=>2867,52272=>2868,52280=>2869,52281=>2870,52283=>2871,52284=>2872,52285=>2873,52286=>2874,52292=>2875,52293=>2876,52296=>2877,52300=>2878,52308=>2879,52309=>2880,52311=>2881,52312=>2882,52313=>2883,52320=>2884,52324=>2885,52326=>2886,52328=>2887,52336=>2888,52341=>2889,52376=>2890,52377=>2891,52380=>2892,52384=>2893,52392=>2894,52393=>2895,52395=>2896,52396=>2897,52397=>2898,52404=>2899,52405=>2900,52408=>2901,52412=>2902,52420=>2903,52421=>2904,52423=>2905,52425=>2906,52432=>2907,52436=>2908,52452=>2909,52460=>2910,52464=>2911,52481=>2912,52488=>2913,52489=>2914,52492=>2915,52496=>2916,52504=>2917,52505=>2918,52507=>2919,52509=>2920,52516=>2921,52520=>2922,52524=>2923,52537=>2924,52572=>2925,52576=>2926,52580=>2927,52588=>2928,52589=>2929,52591=>2930,52593=>2931,52600=>2932,52616=>2933,52628=>2934,52629=>2935,52632=>2936,52636=>2937,52644=>2938,52645=>2939,52647=>2940,52649=>2941,52656=>2942,52676=>2943,52684=>2944,52688=>2945,52712=>2946,52716=>2947,52720=>2948,52728=>2949,52729=>2950,52731=>2951,52733=>2952,52740=>2953,52744=>2954,52748=>2955,52756=>2956,52761=>2957,52768=>2958,52769=>2959,52772=>2960,52776=>2961,52784=>2962,52785=>2963,52787=>2964,52789=>2965,52824=>2966,52825=>2967,52828=>2968,52831=>2969,52832=>2970,52833=>2971,52840=>2972,52841=>2973,52843=>2974,52845=>2975,52852=>2976,52853=>2977,52856=>2978,52860=>2979,52868=>2980,52869=>2981,52871=>2982,52873=>2983,52880=>2984,52881=>2985,52884=>2986,52888=>2987,52896=>2988,52897=>2989,52899=>2990,52900=>2991,52901=>2992,52908=>2993,52909=>2994,52929=>2995,52964=>2996,52965=>2997,52968=>2998,52971=>2999,52972=>3000,52980=>3001,52981=>3002,52983=>3003,52984=>3004,52985=>3005,52992=>3006,52993=>3007,52996=>3008,53000=>3009,53008=>3010,53009=>3011,53011=>3012,53013=>3013,53020=>3014,53024=>3015,53028=>3016,53036=>3017,53037=>3018,53039=>3019,53040=>3020,53041=>3021,53048=>3022,53076=>3023,53077=>3024,53080=>3025,53084=>3026,53092=>3027,53093=>3028,53095=>3029,53097=>3030,53104=>3031,53105=>3032,53108=>3033,53112=>3034,53120=>3035,53125=>3036,53132=>3037,53153=>3038,53160=>3039,53168=>3040,53188=>3041,53216=>3042,53217=>3043,53220=>3044,53224=>3045,53232=>3046,53233=>3047,53235=>3048,53237=>3049,53244=>3050,53248=>3051,53252=>3052,53265=>3053,53272=>3054,53293=>3055,53300=>3056,53301=>3057,53304=>3058,53308=>3059,53316=>3060,53317=>3061,53319=>3062,53321=>3063,53328=>3064,53332=>3065,53336=>3066,53344=>3067,53356=>3068,53357=>3069,53360=>3070,53364=>3071,53372=>3072,53373=>3073,53377=>3074,53412=>3075,53413=>3076,53416=>3077,53420=>3078,53428=>3079,53429=>3080,53431=>3081,53433=>3082,53440=>3083,53441=>3084,53444=>3085,53448=>3086,53449=>3087,53456=>3088,53457=>3089,53459=>3090,53460=>3091,53461=>3092,53468=>3093,53469=>3094,53472=>3095,53476=>3096,53484=>3097,53485=>3098,53487=>3099,53488=>3100,53489=>3101,53496=>3102,53517=>3103,53552=>3104,53553=>3105,53556=>3106,53560=>3107,53562=>3108,53568=>3109,53569=>3110,53571=>3111,53572=>3112,53573=>3113,53580=>3114,53581=>3115,53584=>3116,53588=>3117,53596=>3118,53597=>3119,53599=>3120,53601=>3121,53608=>3122,53612=>3123,53628=>3124,53636=>3125,53640=>3126,53664=>3127,53665=>3128,53668=>3129,53672=>3130,53680=>3131,53681=>3132,53683=>3133,53685=>3134,53690=>3135,53692=>3136,53696=>3137,53720=>3138,53748=>3139,53752=>3140,53767=>3141,53769=>3142,53776=>3143,53804=>3144,53805=>3145,53808=>3146,53812=>3147,53820=>3148,53821=>3149,53823=>3150,53825=>3151,53832=>3152,53852=>3153,53860=>3154,53888=>3155,53889=>3156,53892=>3157,53896=>3158,53904=>3159,53905=>3160,53909=>3161,53916=>3162,53920=>3163,53924=>3164,53932=>3165,53937=>3166,53944=>3167,53945=>3168,53948=>3169,53951=>3170,53952=>3171,53954=>3172,53960=>3173,53961=>3174,53963=>3175,53972=>3176,53976=>3177,53980=>3178,53988=>3179,53989=>3180,54000=>3181,54001=>3182,54004=>3183,54008=>3184,54016=>3185,54017=>3186,54019=>3187,54021=>3188,54028=>3189,54029=>3190,54030=>3191,54032=>3192,54036=>3193,54038=>3194,54044=>3195,54045=>3196,54047=>3197,54048=>3198,54049=>3199,54053=>3200,54056=>3201,54057=>3202,54060=>3203,54064=>3204,54072=>3205,54073=>3206,54075=>3207,54076=>3208,54077=>3209,54084=>3210,54085=>3211,54140=>3212,54141=>3213,54144=>3214,54148=>3215,54156=>3216,54157=>3217,54159=>3218,54160=>3219,54161=>3220,54168=>3221,54169=>3222,54172=>3223,54176=>3224,54184=>3225,54185=>3226,54187=>3227,54189=>3228,54196=>3229,54200=>3230,54204=>3231,54212=>3232,54213=>3233,54216=>3234,54217=>3235,54224=>3236,54232=>3237,54241=>3238,54243=>3239,54252=>3240,54253=>3241,54256=>3242,54260=>3243,54268=>3244,54269=>3245,54271=>3246,54273=>3247,54280=>3248,54301=>3249,54336=>3250,54340=>3251,54364=>3252,54368=>3253,54372=>3254,54381=>3255,54383=>3256,54392=>3257,54393=>3258,54396=>3259,54399=>3260,54400=>3261,54402=>3262,54408=>3263,54409=>3264,54411=>3265,54413=>3266,54420=>3267,54441=>3268,54476=>3269,54480=>3270,54484=>3271,54492=>3272,54495=>3273,54504=>3274,54508=>3275,54512=>3276,54520=>3277,54523=>3278,54525=>3279,54532=>3280,54536=>3281,54540=>3282,54548=>3283,54549=>3284,54551=>3285,54588=>3286,54589=>3287,54592=>3288,54596=>3289,54604=>3290,54605=>3291,54607=>3292,54609=>3293,54616=>3294,54617=>3295,54620=>3296,54624=>3297,54629=>3298,54632=>3299,54633=>3300,54635=>3301,54637=>3302,54644=>3303,54645=>3304,54648=>3305,54652=>3306,54660=>3307,54661=>3308,54663=>3309,54664=>3310,54665=>3311,54672=>3312,54693=>3313,54728=>3314,54729=>3315,54732=>3316,54736=>3317,54738=>3318,54744=>3319,54745=>3320,54747=>3321,54749=>3322,54756=>3323,54757=>3324,54760=>3325,54764=>3326,54772=>3327,54773=>3328,54775=>3329,54777=>3330,54784=>3331,54785=>3332,54788=>3333,54792=>3334,54800=>3335,54801=>3336,54803=>3337,54804=>3338,54805=>3339,54812=>3340,54816=>3341,54820=>3342,54829=>3343,54840=>3344,54841=>3345,54844=>3346,54848=>3347,54853=>3348,54856=>3349,54857=>3350,54859=>3351,54861=>3352,54865=>3353,54868=>3354,54869=>3355,54872=>3356,54876=>3357,54887=>3358,54889=>3359,54896=>3360,54897=>3361,54900=>3362,54915=>3363,54917=>3364,54924=>3365,54925=>3366,54928=>3367,54932=>3368,54941=>3369,54943=>3370,54945=>3371,54952=>3372,54956=>3373,54960=>3374,54969=>3375,54971=>3376,54980=>3377,54981=>3378,54984=>3379,54988=>3380,54993=>3381,54996=>3382,54999=>3383,55001=>3384,55008=>3385,55012=>3386,55016=>3387,55024=>3388,55029=>3389,55036=>3390,55037=>3391,55040=>3392,55044=>3393,55057=>3394,55064=>3395,55065=>3396,55068=>3397,55072=>3398,55080=>3399,55081=>3400,55083=>3401,55085=>3402,55092=>3403,55093=>3404,55096=>3405,55100=>3406,55108=>3407,55111=>3408,55113=>3409,55120=>3410,55121=>3411,55124=>3412,55126=>3413,55127=>3414,55128=>3415,55129=>3416,55136=>3417,55137=>3418,55139=>3419,55141=>3420,55145=>3421,55148=>3422,55152=>3423,55156=>3424,55164=>3425,55165=>3426,55169=>3427,55176=>3428,55177=>3429,55180=>3430,55184=>3431,55192=>3432,55193=>3433,55195=>3434,55197=>3435,20285=>3436,20339=>3437,20551=>3438,20729=>3439,21152=>3440,21487=>3441,21621=>3442,21733=>3443,22025=>3444,23233=>3445,23478=>3446,26247=>3447,26550=>3448,26551=>3449,26607=>3450,27468=>3451,29634=>3452,30146=>3453,31292=>3454,33499=>3455,33540=>3456,34903=>3457,34952=>3458,35382=>3459,36040=>3460,63747=>3460,36303=>3461,36603=>3462,36838=>3463,39381=>3464,21051=>3465,21364=>3466,21508=>3467,24682=>3468,24932=>3469,27580=>3470,29647=>3471,33050=>3472,35258=>3473,12179=>3474,35282=>3474,38307=>3475,20355=>3476,21002=>3477,22718=>3478,22904=>3479,23014=>3480,12082=>3481,24178=>3481,24185=>3482,25031=>3483,25536=>3484,26438=>3485,26604=>3486,26751=>3487,28567=>3488,30286=>3489,30475=>3490,30965=>3491,31240=>3492,31487=>3493,31777=>3494,32925=>3495,12169=>3496,33390=>3496,33393=>3497,35563=>3498,38291=>3499,20075=>3500,21917=>3501,26359=>3502,28212=>3503,30883=>3504,31469=>3505,33883=>3506,35088=>3507,34638=>3508,38824=>3509,21208=>3510,22350=>3511,22570=>3512,23884=>3513,24863=>3514,25022=>3515,25121=>3516,25954=>3517,26577=>3518,27204=>3519,28187=>3520,12130=>3521,29976=>3521,30131=>3522,30435=>3523,30640=>3524,32058=>3525,37039=>3526,37969=>3527,37970=>3528,40853=>3529,21283=>3530,23724=>3531,30002=>3532,32987=>3533,37440=>3534,38296=>3535,21083=>3536,22536=>3537,23004=>3538,23713=>3539,23831=>3540,24247=>3541,24378=>3542,24394=>3543,24951=>3544,27743=>3545,30074=>3546,30086=>3547,31968=>3548,32115=>3549,32177=>3550,32652=>3551,33108=>3552,33313=>3553,34193=>3554,35137=>3555,35611=>3556,37628=>3557,38477=>3558,64009=>3558,40007=>3559,20171=>3560,20215=>3561,20491=>3562,20977=>3563,22607=>3564,24887=>3565,24894=>3566,24936=>3567,25913=>3568,27114=>3569,28433=>3570,30117=>3571,30342=>3572,30422=>3573,31623=>3574,33445=>3575,33995=>3576,37799=>3577,38283=>3578,21888=>3579,23458=>3580,22353=>3581,31923=>3582,32697=>3583,37301=>3584,20520=>3585,21435=>3586,23621=>3587,24040=>3588,25298=>3589,25454=>3590,25818=>3591,25831=>3592,28192=>3593,28844=>3594,31067=>3595,36317=>3596,36382=>3597,36989=>3598,37445=>3599,37624=>3600,20094=>3601,20214=>3602,20581=>3603,12081=>3604,24062=>3604,24314=>3605,24838=>3606,26967=>3607,33137=>3608,34388=>3609,36423=>3610,37749=>3611,39467=>3612,20062=>3613,20625=>3614,26480=>3615,26688=>3616,20745=>3617,21133=>3618,21138=>3619,27298=>3620,30652=>3621,37392=>3622,40660=>3623,21163=>3624,24623=>3625,36850=>3626,20552=>3627,25001=>3628,25581=>3629,25802=>3630,26684=>3631,27268=>3632,28608=>3633,33160=>3634,35233=>3635,38548=>3636,22533=>3637,29309=>3638,12125=>3639,29356=>3639,29956=>3640,32121=>3641,32365=>3642,32937=>3643,12178=>3644,35211=>3644,64010=>3644,35700=>3645,36963=>3646,40273=>3647,25225=>3648,27770=>3649,28500=>3650,32080=>3651,32570=>3652,35363=>3653,20860=>3654,24906=>3655,31645=>3656,35609=>3657,37463=>3658,37772=>3659,20140=>3660,20435=>3661,20510=>3662,20670=>3663,20742=>3664,21185=>3665,21197=>3666,21375=>3667,22384=>3668,22659=>3669,24218=>3670,24465=>3671,24950=>3672,25004=>3673,25806=>3674,25964=>3675,26223=>3676,26299=>3677,26356=>3678,63745=>3678,26775=>3679,28039=>3680,28805=>3681,28913=>3682,29855=>3683,29861=>3684,29898=>3685,30169=>3686,30828=>3687,30956=>3688,31455=>3689,31478=>3690,32069=>3691,32147=>3692,32789=>3693,32831=>3694,33051=>3695,33686=>3696,35686=>3697,36629=>3698,36885=>3699,37857=>3700,38915=>3701,38968=>3702,39514=>3703,39912=>3704,20418=>3705,21843=>3706,22586=>3707,22865=>3708,63753=>3708,23395=>3709,23622=>3710,24760=>3711,25106=>3712,26690=>3713,26800=>3714,26856=>3715,28330=>3716,30028=>3717,30328=>3718,30926=>3719,31293=>3720,31995=>3721,32363=>3722,32380=>3723,35336=>3724,35489=>3725,35903=>3726,38542=>3727,40388=>3728,21476=>3729,21481=>3730,21578=>3731,21617=>3732,22266=>3733,22993=>3734,23396=>3735,23611=>3736,24235=>3737,25335=>3738,25911=>3739,25925=>3740,25970=>3741,26272=>3742,26543=>3743,27073=>3744,27837=>3745,30204=>3746,30352=>3747,30590=>3748,31295=>3749,32660=>3750,32771=>3751,32929=>3752,33167=>3753,33510=>3754,33533=>3755,33776=>3756,34241=>3757,34865=>3758,34996=>3759,35493=>3760,36764=>3761,37678=>3762,38599=>3763,39015=>3764,12220=>3765,39640=>3765,12238=>3766,40723=>3766,21741=>3767,26011=>3768,26354=>3769,26767=>3770,31296=>3771,12181=>3772,35895=>3772,40288=>3773,22256=>3774,22372=>3775,23825=>3776,26118=>3777,26801=>3778,26829=>3779,28414=>3780,29736=>3781,34974=>3782,39908=>3783,27752=>3784,12219=>3785,39592=>3785,20379=>3786,20844=>3787,20849=>3788,21151=>3789,23380=>3790,12079=>3791,24037=>3791,24656=>3792,24685=>3793,25329=>3794,25511=>3795,25915=>3796,29657=>3797,31354=>3798,34467=>3799,36002=>3800,38799=>3801,20018=>3802,63749=>3802,23521=>3803,12093=>3804,25096=>3804,26524=>3805,12128=>3806,29916=>3806,31185=>3807,33747=>3808,35463=>3809,35506=>3810,36328=>3811,36942=>3812,37707=>3813,38982=>3814,24275=>3815,64011=>3815,27112=>3816,34303=>3817,37101=>3818,20896=>3819,23448=>3820,23532=>3821,24931=>3822,26874=>3823,27454=>3824,28748=>3825,29743=>3826,29912=>3827,31649=>3828,32592=>3829,33733=>3830,35264=>3831,36011=>3832,38364=>3833,39208=>3834,21038=>3835,24669=>3836,25324=>3837,36866=>3838,20362=>3839,20809=>3840,21281=>3841,22745=>3842,24291=>3843,26336=>3844,27960=>3845,28826=>3846,29378=>3847,29654=>3848,31568=>3849,33009=>3850,37979=>3851,21350=>3852,25499=>3853,32619=>3854,20054=>3855,20608=>3856,22602=>3857,22750=>3858,24618=>3859,24871=>3860,25296=>3861,27088=>3862,39745=>3863,23439=>3864,32024=>3865,32945=>3866,36703=>3867,20132=>3868,20689=>3869,21676=>3870,21932=>3871,23308=>3872,23968=>3873,24039=>3874,25898=>3875,25934=>3876,26657=>3877,27211=>3878,29409=>3879,30350=>3880,30703=>3881,32094=>3882,32761=>3883,33184=>3884,34126=>3885,34527=>3886,36611=>3887,36686=>3888,37066=>3889,39171=>3890,39509=>3891,39851=>3892,19992=>3893,20037=>3894,20061=>3895,20167=>3896,20465=>3897,20855=>3898,21246=>3899,21312=>3900,12061=>3901,21475=>3901,21477=>3902,63750=>3902,21646=>3903,22036=>3904,22389=>3905,22434=>3906,23495=>3907,23943=>3908,24272=>3909,25084=>3910,25304=>3911,25937=>3912,26552=>3913,26601=>3914,27083=>3915,27472=>3916,27590=>3917,27628=>3918,27714=>3919,28317=>3920,28792=>3921,29399=>3922,29590=>3923,29699=>3924,30655=>3925,30697=>3926,31350=>3927,32127=>3928,32777=>3929,12165=>3930,33276=>3930,33285=>3931,33290=>3932,33503=>3933,34914=>3934,35635=>3935,36092=>3936,36544=>3937,36881=>3938,37041=>3939,37476=>3940,37558=>3941,39378=>3942,39493=>3943,40169=>3944,40407=>3945,12244=>3946,40860=>3946,63751=>3946,63752=>3946,22283=>3947,23616=>3948,33738=>3949,38816=>3950,38827=>3951,40628=>3952,21531=>3953,31384=>3954,32676=>3955,35033=>3956,36557=>3957,37089=>3958,22528=>3959,23624=>3960,25496=>3961,31391=>3962,23470=>3963,12088=>3964,24339=>3964,31353=>3965,31406=>3966,33422=>3967,36524=>3968,20518=>3969,21048=>3970,21240=>3971,21367=>3972,22280=>3973,25331=>3974,25458=>3975,27402=>3976,28099=>3977,30519=>3978,21413=>3979,29527=>3980,34152=>3981,36470=>3982,38357=>3983,26426=>3984,27331=>3985,28528=>3986,35437=>3987,36556=>3988,39243=>3989,26231=>3990,27512=>3991,36020=>3992,12225=>3993,39740=>3993,21483=>3994,22317=>3995,22862=>3996,25542=>3997,27131=>3998,29674=>3999,30789=>4000,31418=>4001,31429=>4002,31998=>4003,33909=>4004,35215=>4005,36211=>4006,36917=>4007,38312=>4008,21243=>4009,22343=>4010,30023=>4011,31584=>4012,33740=>4013,37406=>4014,27224=>4015,20811=>4016,21067=>4017,21127=>4018,25119=>4019,26840=>4020,26997=>4021,38553=>4022,20677=>4023,21156=>4024,21220=>4025,25027=>4026,12100=>4027,26020=>4027,26681=>4028,27135=>4029,29822=>4030,31563=>4031,33465=>4032,33771=>4033,35250=>4034,35641=>4035,36817=>4036,39241=>4037,20170=>4038,22935=>4039,25810=>4040,26129=>4041,27278=>4042,29748=>4043,31105=>4044,31165=>4045,33449=>4046,34942=>4047,34943=>4048,35167=>4049,37670=>4050,20235=>4051,21450=>4052,24613=>4053,25201=>4054,27762=>4055,32026=>4056,32102=>4057,20120=>4058,20834=>4059,30684=>4060,32943=>4061,20225=>4062,20238=>4063,20854=>4064,20864=>4065,21980=>4066,22120=>4067,22331=>4068,22522=>4069,22524=>4070,22804=>4071,22855=>4072,22931=>4073,23492=>4074,23696=>4075,23822=>4076,12080=>4077,24049=>4077,24190=>4078,24524=>4079,25216=>4080,26071=>4081,26083=>4082,26398=>4083,26399=>4084,26462=>4085,26827=>4086,26820=>4087,27231=>4088,27450=>4089,27683=>4090,27773=>4091,27778=>4092,28103=>4093,29592=>4094,29734=>4095,29738=>4096,29826=>4097,29859=>4098,30072=>4099,30079=>4100,30849=>4101,30959=>4102,31041=>4103,31047=>4104,31048=>4105,31098=>4106,31637=>4107,32000=>4108,32186=>4109,32648=>4110,32774=>4111,32813=>4112,32908=>4113,35352=>4114,35663=>4115,35912=>4116,63744=>4116,36215=>4117,37665=>4118,37668=>4119,39138=>4120,39249=>4121,39438=>4122,39439=>4123,39525=>4124,40594=>4125,32202=>4126,20342=>4127,21513=>4128,25326=>4129,26708=>4130,12198=>4131,37329=>4131,63754=>4131,21931=>4132,20794=>4133,23068=>4134,25062=>4135,25295=>4136,63835=>4136,25343=>4137,37027=>4138,35582=>4139,63837=>4139,26262=>4140,29014=>4141,38627=>4142,25423=>4143,25466=>4144,21335=>4145,26511=>4146,26976=>4147,28275=>4148,30007=>4149,32013=>4150,34930=>4151,22218=>4152,23064=>4153,20035=>4154,20839=>4155,22856=>4156,63756=>4156,26608=>4157,32784=>4158,12069=>4159,22899=>4159,63873=>4159,24180=>4160,63886=>4160,25754=>4161,63889=>4161,31178=>4162,63893=>4162,24565=>4163,63907=>4163,24684=>4164,25288=>4165,25467=>4166,63908=>4166,23527=>4167,63839=>4167,63914=>4167,23511=>4168,21162=>4169,22900=>4170,24361=>4171,24594=>4172,63840=>4172,29785=>4173,39377=>4174,28611=>4175,33215=>4176,36786=>4177,24817=>4178,33126=>4179,23615=>4180,63933=>4180,23273=>4181,35365=>4182,26491=>4183,63944=>4183,32016=>4184,63951=>4184,33021=>4185,23612=>4186,27877=>4187,63971=>4187,21311=>4188,63979=>4188,28346=>4189,63980=>4189,22810=>4190,33590=>4191,63998=>4191,20025=>4192,63838=>4192,20150=>4193,20294=>4194,21934=>4195,22296=>4196,22727=>4197,24406=>4198,26039=>4199,26086=>4200,27264=>4201,27573=>4202,28237=>4203,30701=>4204,31471=>4205,31774=>4206,32222=>4207,34507=>4208,34962=>4209,37170=>4210,37723=>4211,25787=>4212,28606=>4213,29562=>4214,30136=>4215,36948=>4216,21846=>4217,22349=>4218,25018=>4219,25812=>4220,26311=>4221,28129=>4222,28251=>4223,28525=>4224,28601=>4225,30192=>4226,32835=>4227,33213=>4228,34113=>4229,35203=>4230,35527=>4231,35674=>4232,37663=>4233,27795=>4234,30035=>4235,31572=>4236,36367=>4237,36957=>4238,21776=>4239,22530=>4240,22616=>4241,24162=>4242,25095=>4243,25758=>4244,26848=>4245,30070=>4246,31958=>4247,64003=>4247,34739=>4248,40680=>4249,20195=>4250,22408=>4251,22382=>4252,12068=>4253,22823=>4253,23565=>4254,23729=>4255,24118=>4256,24453=>4257,25140=>4258,25825=>4259,29619=>4260,33274=>4261,34955=>4262,36024=>4263,38538=>4264,40667=>4265,23429=>4266,64004=>4266,24503=>4267,24755=>4268,20498=>4269,12049=>4270,20992=>4270,21040=>4271,22294=>4272,22581=>4273,22615=>4274,23566=>4275,23648=>4276,23798=>4277,23947=>4278,24230=>4279,64001=>4279,24466=>4280,24764=>4281,25361=>4282,25481=>4283,25623=>4284,26691=>4285,26873=>4286,27330=>4287,28120=>4288,28193=>4289,28372=>4290,28644=>4291,29182=>4292,30428=>4293,30585=>4294,31153=>4295,31291=>4296,33796=>4297,35241=>4298,36077=>4299,36339=>4300,36424=>4301,36867=>4302,36884=>4303,36947=>4304,37117=>4305,37709=>4306,38518=>4307,38876=>4308,27602=>4309,28678=>4310,29272=>4311,29346=>4312,29544=>4313,30563=>4314,31167=>4315,31716=>4316,32411=>4317,35712=>4318,63834=>4318,22697=>4319,24775=>4320,25958=>4321,26109=>4322,26302=>4323,27788=>4324,28958=>4325,29129=>4326,35930=>4327,38931=>4328,20077=>4329,31361=>4330,20189=>4331,20908=>4332,20941=>4333,21205=>4334,21516=>4335,24999=>4336,26481=>4337,26704=>4338,26847=>4339,27934=>4340,64005=>4340,28540=>4341,30140=>4342,30643=>4343,31461=>4344,33012=>4345,33891=>4346,37509=>4347,20828=>4348,12099=>4349,26007=>4349,26460=>4350,26515=>4351,30168=>4352,31431=>4353,33651=>4354,12182=>4355,35910=>4355,36887=>4356,38957=>4357,23663=>4358,33216=>4359,33434=>4360,36929=>4361,36975=>4362,37389=>4363,24471=>4364,23965=>4365,27225=>4366,29128=>4367,30331=>4368,31561=>4369,34276=>4370,35588=>4371,37159=>4372,39472=>4373,21895=>4374,63755=>4374,25078=>4375,63757=>4375,30313=>4376,63758=>4376,32645=>4377,63759=>4377,34367=>4378,63760=>4378,34746=>4379,63761=>4379,35064=>4380,63762=>4380,37007=>4381,63763=>4381,27931=>4382,63765=>4382,28889=>4383,63766=>4383,29662=>4384,63767=>4384,32097=>4385,33853=>4386,63768=>4386,37226=>4387,63769=>4387,39409=>4388,63770=>4388,20098=>4389,63771=>4389,21365=>4390,63772=>4390,27396=>4391,63773=>4391,27410=>4392,28734=>4393,29211=>4394,63774=>4394,34349=>4395,63775=>4395,40478=>4396,63776=>4396,21068=>4397,36771=>4398,23888=>4399,63777=>4399,25829=>4400,25900=>4401,27414=>4402,28651=>4403,63778=>4403,31811=>4404,32412=>4405,34253=>4406,63779=>4406,35172=>4407,63780=>4407,35261=>4408,25289=>4409,63781=>4409,33240=>4410,63782=>4410,34847=>4411,63783=>4411,24266=>4412,63784=>4412,26391=>4413,63785=>4413,28010=>4414,63786=>4414,29436=>4415,63787=>4415,29701=>4416,29807=>4417,34690=>4418,37086=>4419,63788=>4419,20358=>4420,63789=>4420,23821=>4421,24480=>4422,33802=>4423,20919=>4424,63790=>4424,25504=>4425,63861=>4425,30053=>4426,63862=>4426,20142=>4427,63863=>4427,20486=>4428,20841=>4429,63864=>4429,20937=>4430,63865=>4430,26753=>4431,63866=>4431,27153=>4432,31918=>4433,31921=>4434,31975=>4435,63867=>4435,33391=>4436,63868=>4436,35538=>4437,63869=>4437,36635=>4438,37327=>4439,63870=>4439,20406=>4440,20791=>4441,21237=>4442,63871=>4442,21570=>4443,63872=>4443,24300=>4444,63874=>4444,24942=>4445,25150=>4446,26053=>4447,63875=>4447,27354=>4448,28670=>4449,63876=>4449,31018=>4450,63877=>4450,34268=>4451,34851=>4452,38317=>4453,63878=>4453,39522=>4454,39530=>4455,63879=>4455,40599=>4456,63880=>4456,40654=>4457,63881=>4457,12050=>4458,21147=>4458,63882=>4458,26310=>4459,63883=>4459,27511=>4460,63884=>4460,28701=>4461,31019=>4462,36706=>4463,63885=>4463,38722=>4464,24976=>4465,63887=>4465,25088=>4466,63888=>4466,25891=>4467,28451=>4468,63890=>4468,29001=>4469,63891=>4469,29833=>4470,63892=>4470,32244=>4471,63894=>4471,32879=>4472,63895=>4472,34030=>4473,63897=>4473,36646=>4474,63896=>4474,36899=>4475,63898=>4475,37706=>4476,63899=>4476,20925=>4477,21015=>4478,63900=>4478,21155=>4479,63901=>4479,27916=>4480,28872=>4481,63903=>4481,35010=>4482,63904=>4482,24265=>4483,63906=>4483,25986=>4484,27566=>4485,63909=>4485,28610=>4486,31806=>4487,63910=>4487,29557=>4488,63911=>4488,20196=>4489,63912=>4489,20278=>4490,22265=>4491,63913=>4491,23738=>4492,23994=>4493,63915=>4493,24604=>4494,63916=>4494,29618=>4495,63917=>4495,31533=>4496,32666=>4497,63919=>4497,32718=>4498,32838=>4499,63920=>4499,36894=>4500,37428=>4501,63921=>4501,38646=>4502,63922=>4502,38728=>4503,63923=>4503,38936=>4504,63924=>4504,40801=>4505,20363=>4506,63925=>4506,28583=>4507,31150=>4508,63926=>4508,37300=>4509,63927=>4509,38583=>4510,63928=>4510,21214=>4511,63791=>4511,25736=>4512,25796=>4513,63792=>4513,27347=>4514,63793=>4514,28510=>4515,28696=>4516,29200=>4517,63794=>4517,30439=>4518,63795=>4518,12156=>4519,32769=>4519,63796=>4519,34310=>4520,63797=>4520,34396=>4521,63798=>4521,36335=>4522,63799=>4522,36613=>4523,38706=>4524,63800=>4524,39791=>4525,63801=>4525,40442=>4526,63802=>4526,12228=>4527,40565=>4527,30860=>4528,63803=>4528,31103=>4529,63804=>4529,32160=>4530,63805=>4530,33737=>4531,63806=>4531,37636=>4532,63807=>4532,12229=>4533,40575=>4533,63808=>4533,40595=>4534,35542=>4535,63809=>4535,22751=>4536,63810=>4536,24324=>4537,63811=>4537,26407=>4538,28711=>4539,29903=>4540,31840=>4541,63812=>4541,32894=>4542,63813=>4542,20769=>4543,28712=>4544,29282=>4545,63814=>4545,30922=>4546,63815=>4546,36034=>4547,63816=>4547,36058=>4548,36084=>4549,38647=>4550,63817=>4550,20102=>4551,63930=>4551,20698=>4552,63931=>4552,23534=>4553,63932=>4553,24278=>4554,26009=>4555,63934=>4555,29134=>4556,63936=>4556,30274=>4557,63937=>4557,30637=>4558,32842=>4559,34044=>4560,63938=>4560,36988=>4561,63939=>4561,39719=>4562,12243=>4563,40845=>4563,63940=>4563,22744=>4564,63818=>4564,23105=>4565,23650=>4566,63819=>4566,27155=>4567,63820=>4567,28122=>4568,63821=>4568,28431=>4569,63822=>4569,30267=>4570,32047=>4571,63823=>4571,32311=>4572,63824=>4572,34078=>4573,35128=>4574,37860=>4575,38475=>4576,63825=>4576,21129=>4577,63943=>4577,26066=>4578,26611=>4579,63945=>4579,27060=>4580,27969=>4581,63946=>4581,28316=>4582,63947=>4582,28687=>4583,29705=>4584,63948=>4584,29792=>4585,30041=>4586,63949=>4586,30244=>4587,30827=>4588,63950=>4588,35628=>4589,39006=>4590,63952=>4590,20845=>4591,63953=>4591,25134=>4592,63954=>4592,38520=>4593,63955=>4593,20374=>4594,20523=>4595,63956=>4595,23833=>4596,63957=>4596,28138=>4597,63958=>4597,32184=>4598,36650=>4599,63959=>4599,24459=>4600,63960=>4600,24900=>4601,63961=>4601,26647=>4602,63962=>4602,38534=>4603,63964=>4603,21202=>4604,63826=>4604,32907=>4605,63827=>4605,20956=>4606,63828=>4606,20940=>4607,63829=>4607,26974=>4608,31260=>4609,63830=>4609,32190=>4610,63831=>4610,33777=>4611,63832=>4611,38517=>4612,63833=>4612,20442=>4613,21033=>4614,63965=>4614,21400=>4615,21519=>4616,63966=>4616,21774=>4617,23653=>4618,63967=>4618,24743=>4619,26446=>4620,63969=>4620,26792=>4621,63970=>4621,28012=>4622,29313=>4623,29432=>4624,29702=>4625,63972=>4625,29827=>4626,30178=>4627,63973=>4627,31852=>4628,32633=>4629,63974=>4629,32696=>4630,33673=>4631,35023=>4632,63975=>4632,35041=>4633,63976=>4633,12197=>4634,37324=>4634,63977=>4634,37328=>4635,38626=>4636,63978=>4636,39881=>4637,21533=>4638,63981=>4638,28542=>4639,29136=>4640,63982=>4640,29848=>4641,63983=>4641,34298=>4642,63984=>4642,36522=>4643,38563=>4644,63985=>4644,40023=>4645,63986=>4645,40607=>4646,63987=>4646,26519=>4647,63988=>4647,28107=>4648,63989=>4648,29747=>4649,33256=>4650,63990=>4650,38678=>4651,30764=>4652,12148=>4653,31435=>4653,63991=>4653,31520=>4654,63992=>4654,31890=>4655,63993=>4655,25705=>4656,29802=>4657,30194=>4658,30908=>4659,30952=>4660,12218=>4661,39340=>4661,39764=>4662,12231=>4663,40635=>4663,23518=>4664,24149=>4665,28448=>4666,33180=>4667,33707=>4668,37000=>4669,19975=>4670,21325=>4671,23081=>4672,24018=>4673,24398=>4674,24930=>4675,25405=>4676,26217=>4677,26364=>4678,28415=>4679,28459=>4680,28771=>4681,30622=>4682,33836=>4683,34067=>4684,34875=>4685,36627=>4686,39237=>4687,39995=>4688,21788=>4689,25273=>4690,26411=>4691,27819=>4692,33545=>4693,35178=>4694,38778=>4695,20129=>4696,22916=>4697,24536=>4698,24537=>4699,26395=>4700,32178=>4701,32596=>4702,33426=>4703,33579=>4704,33725=>4705,36638=>4706,37017=>4707,22475=>4708,22969=>4709,23186=>4710,23504=>4711,26151=>4712,26522=>4713,26757=>4714,27599=>4715,29028=>4716,32629=>4717,36023=>4718,36067=>4719,36993=>4720,39749=>4721,33032=>4722,35978=>4723,38476=>4724,39488=>4725,12230=>4726,40613=>4726,23391=>4727,27667=>4728,29467=>4729,30450=>4730,30431=>4731,33804=>4732,20906=>4733,35219=>4734,20813=>4735,20885=>4736,21193=>4737,26825=>4738,27796=>4739,30468=>4740,30496=>4741,32191=>4742,32236=>4743,12207=>4744,38754=>4744,40629=>4745,28357=>4746,34065=>4747,20901=>4748,21517=>4749,21629=>4750,26126=>4751,26269=>4752,26919=>4753,28319=>4754,12139=>4755,30399=>4755,30609=>4756,33559=>4757,33986=>4758,34719=>4759,37225=>4760,37528=>4761,40180=>4762,34946=>4763,20398=>4764,20882=>4765,21215=>4766,22982=>4767,24125=>4768,24917=>4769,25720=>4770,25721=>4771,26286=>4772,26576=>4773,27169=>4774,27597=>4775,12113=>4776,27611=>4776,29279=>4777,29281=>4778,29761=>4779,30520=>4780,12141=>4781,30683=>4781,32791=>4782,33468=>4783,33541=>4784,35584=>4785,35624=>4786,35980=>4787,12106=>4788,26408=>4788,27792=>4789,29287=>4790,12140=>4791,30446=>4791,30566=>4792,31302=>4793,40361=>4794,27519=>4795,27794=>4796,22818=>4797,26406=>4798,33945=>4799,21359=>4800,22675=>4801,22937=>4802,24287=>4803,25551=>4804,26164=>4805,26483=>4806,28218=>4807,29483=>4808,31447=>4809,33495=>4810,37672=>4811,21209=>4812,24043=>4813,25006=>4814,25035=>4815,25098=>4816,25287=>4817,25771=>4818,12102=>4819,26080=>4819,26969=>4820,27494=>4821,12111=>4822,27595=>4822,28961=>4823,29687=>4824,30045=>4825,32326=>4826,33310=>4827,33538=>4828,34154=>4829,35491=>4830,36031=>4831,38695=>4832,40289=>4833,22696=>4834,40664=>4835,20497=>4836,21006=>4837,21563=>4838,21839=>4839,12098=>4840,25991=>4840,27766=>4841,32010=>4842,32011=>4843,32862=>4844,34442=>4845,12200=>4846,38272=>4846,38639=>4847,21247=>4848,27797=>4849,29289=>4850,21619=>4851,23194=>4852,23614=>4853,23883=>4854,24396=>4855,24494=>4856,26410=>4857,26806=>4858,26979=>4859,28220=>4860,28228=>4861,30473=>4862,12150=>4863,31859=>4863,32654=>4864,34183=>4865,35598=>4866,36855=>4867,38753=>4868,40692=>4869,23735=>4870,24758=>4871,24845=>4872,25003=>4873,25935=>4874,26107=>4875,26108=>4876,27665=>4877,27887=>4878,29599=>4879,29641=>4880,32225=>4881,38292=>4882,23494=>4883,34588=>4884,35600=>4885,21085=>4886,21338=>4887,25293=>4888,25615=>4889,25778=>4890,26420=>4891,27192=>4892,27850=>4893,29632=>4894,29854=>4895,31636=>4896,31893=>4897,32283=>4898,33162=>4899,33334=>4900,34180=>4901,36843=>4902,38649=>4903,39361=>4904,20276=>4905,21322=>4906,21453=>4907,21467=>4908,25292=>4909,25644=>4910,25856=>4911,26001=>4912,27075=>4913,27886=>4914,28504=>4915,29677=>4916,30036=>4917,30242=>4918,30436=>4919,30460=>4920,30928=>4921,30971=>4922,63844=>4922,31020=>4923,32070=>4924,33324=>4925,34784=>4926,36820=>4927,38930=>4928,39151=>4929,21187=>4930,25300=>4931,25765=>4932,28196=>4933,28497=>4934,30332=>4935,36299=>4936,37297=>4937,37474=>4938,39662=>4939,39747=>4940,20515=>4941,20621=>4942,22346=>4943,22952=>4944,23592=>4945,24135=>4946,24439=>4947,25151=>4948,25918=>4949,12101=>4950,26041=>4950,26049=>4951,26121=>4952,26507=>4953,27036=>4954,28354=>4955,30917=>4956,32033=>4957,32938=>4958,33152=>4959,33323=>4960,33459=>4961,33953=>4962,34444=>4963,35370=>4964,35607=>4965,37030=>4966,38450=>4967,40848=>4968,20493=>4969,20467=>4970,22521=>4971,24472=>4972,25308=>4973,25490=>4974,26479=>4975,28227=>4976,28953=>4977,30403=>4978,32972=>4979,32986=>4980,35060=>4981,35061=>4982,35097=>4983,36064=>4984,36649=>4985,37197=>4986,38506=>4987,20271=>4988,20336=>4989,24091=>4990,26575=>4991,26658=>4992,12137=>4993,30333=>4993,30334=>4994,39748=>4995,24161=>4996,27146=>4997,29033=>4998,29140=>4999,30058=>5000,32321=>5001,34115=>5002,34281=>5003,39132=>5004,20240=>5005,31567=>5006,32624=>5007,38309=>5008,20961=>5009,24070=>5010,26805=>5011,27710=>5012,27726=>5013,27867=>5014,29359=>5015,31684=>5016,33539=>5017,27861=>5018,29754=>5019,20731=>5020,21128=>5021,22721=>5022,25816=>5023,27287=>5024,29863=>5025,30294=>5026,30887=>5027,34327=>5028,38370=>5029,38713=>5030,21342=>5031,24321=>5032,35722=>5033,36776=>5034,36783=>5035,37002=>5036,21029=>5037,30629=>5038,40009=>5039,40712=>5040,19993=>5041,20482=>5042,20853=>5043,23643=>5044,24183=>5045,26142=>5046,26170=>5047,26564=>5048,26821=>5049,28851=>5050,29953=>5051,30149=>5052,31177=>5053,31453=>5054,36647=>5055,39200=>5056,39432=>5057,20445=>5058,22561=>5059,22577=>5060,23542=>5061,26222=>5062,27493=>5063,27921=>5064,28282=>5065,28541=>5066,29668=>5067,29995=>5068,33769=>5069,35036=>5070,35091=>5071,35676=>5072,36628=>5073,20239=>5074,20693=>5075,21264=>5076,12056=>5077,21340=>5077,23443=>5078,24489=>5079,63846=>5079,26381=>5080,31119=>5081,33145=>5082,33583=>5083,34068=>5084,35079=>5085,35206=>5086,36665=>5087,36667=>5088,64007=>5088,39333=>5089,39954=>5090,26412=>5091,20086=>5092,20472=>5093,22857=>5094,23553=>5095,23791=>5096,23792=>5097,25447=>5098,26834=>5099,28925=>5100,29090=>5101,29739=>5102,32299=>5103,34028=>5104,34562=>5105,36898=>5106,37586=>5107,40179=>5108,19981=>5109,63847=>5109,20184=>5110,20463=>5111,20613=>5112,21078=>5113,21103=>5114,21542=>5115,21648=>5116,22496=>5117,22827=>5118,23142=>5119,23386=>5120,23413=>5121,23500=>5122,24220=>5123,25206=>5124,25975=>5125,26023=>5126,28014=>5127,28325=>5128,12119=>5129,29238=>5129,31526=>5130,31807=>5131,12152=>5132,32566=>5132,33104=>5133,33105=>5134,33178=>5135,33344=>5136,33433=>5137,33705=>5138,35331=>5139,36000=>5140,36070=>5141,36091=>5142,36212=>5143,36282=>5144,37096=>5145,37340=>5146,12201=>5147,38428=>5147,38468=>5148,39385=>5149,40167=>5150,21271=>5151,63843=>5151,20998=>5152,21545=>5153,22132=>5154,22707=>5155,22868=>5156,22894=>5157,24575=>5158,24996=>5159,25198=>5160,26128=>5161,27774=>5162,28954=>5163,30406=>5164,31881=>5165,31966=>5166,32027=>5167,33452=>5168,36033=>5169,38640=>5170,20315=>5171,24343=>5172,24447=>5173,25282=>5174,23849=>5175,26379=>5176,26842=>5177,30844=>5178,32323=>5179,40300=>5180,19989=>5181,20633=>5182,12052=>5183,21269=>5183,21290=>5184,21329=>5185,22915=>5186,23138=>5187,24199=>5188,24754=>5189,24970=>5190,25161=>5191,25209=>5192,26000=>5193,26503=>5194,27047=>5195,12112=>5196,27604=>5196,27606=>5197,27607=>5198,27608=>5199,27832=>5200,29749=>5201,30202=>5202,30738=>5203,30865=>5204,31189=>5205,31192=>5206,31875=>5207,32203=>5208,32737=>5209,32933=>5210,33086=>5211,33218=>5212,33778=>5213,34586=>5214,35048=>5215,35513=>5216,35692=>5217,36027=>5218,37145=>5219,12206=>5220,38750=>5220,12214=>5221,39131=>5221,12240=>5222,40763=>5222,22188=>5223,23338=>5224,24428=>5225,25996=>5226,27315=>5227,27567=>5228,27996=>5229,28657=>5230,28693=>5231,29277=>5232,29613=>5233,36007=>5234,36051=>5235,38971=>5236,24977=>5237,27703=>5238,32856=>5239,39425=>5240,20045=>5241,20107=>5242,20123=>5243,20181=>5244,20282=>5245,20284=>5246,20351=>5247,20447=>5248,20735=>5249,21490=>5250,21496=>5251,21766=>5252,21987=>5253,22235=>5254,12064=>5255,22763=>5255,22882=>5256,23057=>5257,23531=>5258,23546=>5259,23556=>5260,24051=>5261,24107=>5262,24473=>5263,24605=>5264,25448=>5265,26012=>5266,26031=>5267,26614=>5268,26619=>5269,26797=>5270,27515=>5271,27801=>5272,27863=>5273,28195=>5274,28681=>5275,29509=>5276,30722=>5277,31038=>5278,31040=>5279,31072=>5280,31169=>5281,31721=>5282,32023=>5283,32114=>5284,32902=>5285,33293=>5286,33678=>5287,34001=>5288,34503=>5289,35039=>5290,35408=>5291,35422=>5292,35613=>5293,36060=>5294,36198=>5295,36781=>5296,37034=>5297,39164=>5298,39391=>5299,40605=>5300,21066=>5301,26388=>5302,20632=>5303,21034=>5304,12077=>5305,23665=>5305,25955=>5306,27733=>5307,29642=>5308,29987=>5309,30109=>5310,31639=>5311,33948=>5312,37240=>5313,38704=>5314,20087=>5315,25746=>5316,27578=>5317,63856=>5317,29022=>5318,34217=>5319,19977=>5320,26441=>5321,26862=>5322,28183=>5323,33439=>5324,34072=>5325,34923=>5326,25591=>5327,28545=>5328,37394=>5329,39087=>5330,19978=>5331,20663=>5332,20687=>5333,20767=>5334,21830=>5335,21930=>5336,22039=>5337,23360=>5338,23577=>5339,23776=>5340,24120=>5341,24202=>5342,24224=>5343,24258=>5344,24819=>5345,26705=>5346,27233=>5347,28248=>5348,29245=>5349,29248=>5350,29376=>5351,63994=>5351,30456=>5352,31077=>5353,31665=>5354,32724=>5355,35059=>5356,35316=>5357,35443=>5358,35937=>5359,36062=>5360,38684=>5361,22622=>5362,63852=>5362,29885=>5363,36093=>5364,21959=>5365,31329=>5366,32034=>5367,63850=>5367,12170=>5368,33394=>5368,29298=>5369,12131=>5370,29983=>5370,29989=>5371,31513=>5372,22661=>5373,22779=>5374,23996=>5375,24207=>5376,24246=>5377,24464=>5378,24661=>5379,25234=>5380,25471=>5381,25933=>5382,26257=>5383,26329=>5384,26360=>5385,26646=>5386,26866=>5387,29312=>5388,29790=>5389,31598=>5390,32110=>5391,32214=>5392,32626=>5393,32997=>5394,33298=>5395,34223=>5396,35199=>5397,35475=>5398,36893=>5399,37604=>5400,12233=>5401,40653=>5401,12239=>5402,40736=>5402,12067=>5403,22805=>5403,22893=>5404,24109=>5405,24796=>5406,26132=>5407,26227=>5408,26512=>5409,27728=>5410,28101=>5411,28511=>5412,12143=>5413,30707=>5413,30889=>5414,33990=>5415,37323=>5416,37675=>5417,20185=>5418,20682=>5419,20808=>5420,21892=>5421,23307=>5422,23459=>5423,25159=>5424,25982=>5425,26059=>5426,28210=>5427,29053=>5428,29697=>5429,29764=>5430,29831=>5431,29887=>5432,30316=>5433,31146=>5434,32218=>5435,32341=>5436,32680=>5437,33146=>5438,33203=>5439,33337=>5440,34330=>5441,34796=>5442,35445=>5443,36323=>5444,36984=>5445,37521=>5446,37925=>5447,39245=>5448,39854=>5449,21352=>5450,23633=>5451,26964=>5452,27844=>5453,27945=>5454,28203=>5455,12166=>5456,33292=>5456,34203=>5457,35131=>5458,35373=>5459,35498=>5460,63855=>5460,63905=>5460,38634=>5461,40807=>5462,21089=>5463,26297=>5464,27570=>5465,32406=>5466,34814=>5467,36109=>5468,38275=>5469,38493=>5470,25885=>5471,28041=>5472,29166=>5473,22478=>5474,22995=>5475,23468=>5476,24615=>5477,24826=>5478,25104=>5479,26143=>5480,26207=>5481,29481=>5482,29689=>5483,30427=>5484,30465=>5485,63853=>5485,31596=>5486,32854=>5487,32882=>5488,33125=>5489,35488=>5490,37266=>5491,19990=>5492,21218=>5493,27506=>5494,27927=>5495,31237=>5496,31545=>5497,32048=>5498,36016=>5499,21484=>5500,22063=>5501,22609=>5502,23477=>5503,12073=>5504,23567=>5504,23569=>5505,24034=>5506,25152=>5507,25475=>5508,25620=>5509,26157=>5510,26803=>5511,27836=>5512,28040=>5513,28335=>5514,28703=>5515,28836=>5516,29138=>5517,29990=>5518,30095=>5519,30094=>5520,30233=>5521,31505=>5522,31712=>5523,31787=>5524,32032=>5525,32057=>5526,34092=>5527,34157=>5528,34311=>5529,35380=>5530,36877=>5531,36961=>5532,37045=>5533,37559=>5534,38902=>5535,39479=>5536,20439=>5537,23660=>5538,26463=>5539,28049=>5540,31903=>5541,32396=>5542,35606=>5543,36118=>5544,36895=>5545,23403=>5546,24061=>5547,25613=>5548,33984=>5549,36956=>5550,39137=>5551,29575=>5552,63841=>5552,63963=>5552,23435=>5553,24730=>5554,26494=>5555,28126=>5556,35359=>5557,35494=>5558,36865=>5559,38924=>5560,21047=>5561,28753=>5562,30862=>5563,37782=>5564,34928=>5565,37335=>5566,20462=>5567,21463=>5568,22013=>5569,22234=>5570,22402=>5571,22781=>5572,23234=>5573,23432=>5574,23723=>5575,23744=>5576,24101=>5577,24833=>5578,25101=>5579,12095=>5580,25163=>5580,25480=>5581,25628=>5582,25910=>5583,25976=>5584,63849=>5584,27193=>5585,27530=>5586,12116=>5587,27700=>5587,27929=>5588,28465=>5589,29159=>5590,29417=>5591,29560=>5592,29703=>5593,29874=>5594,30246=>5595,30561=>5596,31168=>5597,31319=>5598,31466=>5599,31929=>5600,32143=>5601,32172=>5602,32353=>5603,32670=>5604,33065=>5605,33585=>5606,33936=>5607,34010=>5608,34282=>5609,34966=>5610,35504=>5611,35728=>5612,36664=>5613,36930=>5614,36995=>5615,37228=>5616,37526=>5617,37561=>5618,38539=>5619,38567=>5620,38568=>5621,38614=>5622,38656=>5623,38920=>5624,12216=>5625,39318=>5625,39635=>5626,39706=>5627,21460=>5628,22654=>5629,22809=>5630,23408=>5631,23487=>5632,28113=>5633,28506=>5634,29087=>5635,29729=>5636,29881=>5637,32901=>5638,33789=>5639,24033=>5640,24455=>5641,24490=>5642,24642=>5643,26092=>5644,26642=>5645,26991=>5646,27219=>5647,27529=>5648,27957=>5649,28147=>5650,29667=>5651,30462=>5652,30636=>5653,31565=>5654,32020=>5655,33059=>5656,33308=>5657,33600=>5658,34036=>5659,34147=>5660,35426=>5661,35524=>5662,37255=>5663,37662=>5664,38918=>5665,39348=>5666,25100=>5667,34899=>5668,36848=>5669,37477=>5670,23815=>5671,23847=>5672,23913=>5673,29791=>5674,33181=>5675,34664=>5676,28629=>5677,25342=>5678,63859=>5678,32722=>5679,35126=>5680,35186=>5681,19998=>5682,20056=>5683,20711=>5684,21213=>5685,21319=>5686,25215=>5687,26119=>5688,32361=>5689,34821=>5690,38494=>5691,20365=>5692,21273=>5693,22070=>5694,22987=>5695,23204=>5696,12075=>5697,23608=>5697,23630=>5698,23629=>5699,24066=>5700,24337=>5701,24643=>5702,26045=>5703,26159=>5704,26178=>5705,26558=>5706,26612=>5707,29468=>5708,12142=>5709,30690=>5709,12144=>5710,31034=>5710,32709=>5711,33940=>5712,33997=>5713,35222=>5714,35430=>5715,35433=>5716,35553=>5717,12183=>5718,35925=>5718,35962=>5719,22516=>5720,23508=>5721,24335=>5722,24687=>5723,25325=>5724,26893=>5725,27542=>5726,28252=>5727,29060=>5728,31698=>5729,34645=>5730,35672=>5731,63996=>5731,36606=>5732,12215=>5733,39135=>5733,39166=>5734,20280=>5735,20353=>5736,20449=>5737,21627=>5738,23072=>5739,23480=>5740,24892=>5741,26032=>5742,26216=>5743,29180=>5744,30003=>5745,31070=>5746,32051=>5747,33102=>5748,12162=>5749,33251=>5749,33688=>5750,34218=>5751,34254=>5752,34563=>5753,35338=>5754,12189=>5755,36523=>5755,12191=>5756,36763=>5756,36805=>5757,22833=>5758,23460=>5759,23526=>5760,24713=>5761,23529=>5762,23563=>5763,12092=>5764,24515=>5764,27777=>5765,28145=>5766,28683=>5767,29978=>5768,33455=>5769,35574=>5770,20160=>5771,63997=>5771,12055=>5772,21313=>5772,38617=>5773,12114=>5774,27663=>5774,20126=>5775,20420=>5776,20818=>5777,21854=>5778,23077=>5779,23784=>5780,25105=>5781,12123=>5782,29273=>5782,33469=>5783,33706=>5784,34558=>5785,34905=>5786,35357=>5787,38463=>5788,38597=>5789,39187=>5790,40201=>5791,40285=>5792,22538=>5793,23731=>5794,23997=>5795,24132=>5796,24801=>5797,63929=>5797,24853=>5798,25569=>5799,27138=>5800,63764=>5800,63836=>5800,63935=>5800,28197=>5801,37122=>5802,37716=>5803,38990=>5804,39952=>5805,40823=>5806,23433=>5807,23736=>5808,25353=>5809,26191=>5810,26696=>5811,30524=>5812,38593=>5813,38797=>5814,38996=>5815,39839=>5816,26017=>5817,35585=>5818,36555=>5819,38332=>5820,21813=>5821,23721=>5822,24022=>5823,24245=>5824,26263=>5825,30284=>5826,33780=>5827,38343=>5828,22739=>5829,25276=>5830,29390=>5831,40232=>5832,20208=>5833,22830=>5834,24591=>5835,26171=>5836,27523=>5837,31207=>5838,40230=>5839,21395=>5840,21696=>5841,22467=>5842,23830=>5843,24859=>5844,26326=>5845,28079=>5846,30861=>5847,33406=>5848,38552=>5849,38724=>5850,21380=>5851,25212=>5852,25494=>5853,28082=>5854,32266=>5855,33099=>5856,38989=>5857,27387=>5858,32588=>5859,40367=>5860,40474=>5861,20063=>5862,20539=>5863,20918=>5864,22812=>5865,24825=>5866,25590=>5867,26928=>5868,29242=>5869,32822=>5870,37326=>5871,24369=>5872,32004=>5873,33509=>5874,63860=>5874,33903=>5875,33979=>5876,34277=>5877,36493=>5878,20335=>5879,22756=>5880,23363=>5881,24665=>5882,25562=>5883,25880=>5884,25965=>5885,26264=>5886,26954=>5887,27171=>5888,27915=>5889,28673=>5890,29036=>5891,30162=>5892,30221=>5893,31155=>5894,31344=>5895,12154=>5896,32650=>5896,35140=>5897,35731=>5898,37312=>5899,38525=>5900,39178=>5901,22276=>5902,24481=>5903,26044=>5904,28417=>5905,30208=>5906,31142=>5907,35486=>5908,39341=>5909,12226=>5910,39770=>5910,40812=>5911,20740=>5912,25014=>5913,25233=>5914,27277=>5915,33222=>5916,20547=>5917,22576=>5918,24422=>5919,28937=>5920,12180=>5921,35328=>5921,35578=>5922,23420=>5923,34326=>5924,20474=>5925,20796=>5926,22196=>5927,22852=>5928,25513=>5929,28153=>5930,23978=>5931,26989=>5932,20870=>5933,20104=>5934,20313=>5935,22914=>5936,27487=>5937,27741=>5938,29877=>5939,30998=>5940,33287=>5941,33349=>5942,33593=>5943,36671=>5944,36701=>5945,39192=>5946,20134=>5947,22495=>5948,24441=>5949,26131=>5950,63968=>5950,30123=>5951,32377=>5952,35695=>5953,36870=>5954,39515=>5955,22181=>5956,22567=>5957,23032=>5958,23071=>5959,23476=>5960,24310=>5961,25424=>5962,25403=>5963,26941=>5964,27783=>5965,27839=>5966,28046=>5967,28051=>5968,28149=>5969,28436=>5970,28895=>5971,28982=>5972,29017=>5973,29123=>5974,29141=>5975,30799=>5976,30831=>5977,31605=>5978,32227=>5979,32303=>5980,34893=>5981,36575=>5982,37467=>5983,40182=>5984,24709=>5985,28037=>5986,29105=>5987,38321=>5988,21421=>5989,26579=>5990,28814=>5991,28976=>5992,29744=>5993,33398=>5994,33490=>5995,38331=>5996,39653=>5997,40573=>5998,26308=>5999,29121=>6000,33865=>6001,63854=>6001,22603=>6002,23992=>6003,24433=>6004,26144=>6005,26254=>6006,27001=>6007,27054=>6008,27704=>6009,27891=>6010,28214=>6011,28481=>6012,28634=>6013,28699=>6014,28719=>6015,29008=>6016,29151=>6017,29552=>6018,29787=>6019,29908=>6020,30408=>6021,31310=>6022,32403=>6023,33521=>6024,35424=>6025,36814=>6026,37704=>6027,38681=>6028,20034=>6029,20522=>6030,21000=>6031,21473=>6032,26355=>6033,27757=>6034,28618=>6035,29450=>6036,30591=>6037,31330=>6038,33454=>6039,34269=>6040,34306=>6041,35028=>6042,35427=>6043,35709=>6044,35947=>6045,37555=>6046,38675=>6047,38928=>6048,20116=>6049,20237=>6050,20425=>6051,20658=>6052,21320=>6053,21566=>6054,21555=>6055,21978=>6056,22626=>6057,22714=>6058,22887=>6059,23067=>6060,23524=>6061,24735=>6062,25034=>6063,25942=>6064,26111=>6065,26212=>6066,26791=>6067,27738=>6068,28595=>6069,28879=>6070,29100=>6071,29522=>6072,31613=>6073,34568=>6074,35492=>6075,39986=>6076,40711=>6077,23627=>6078,27779=>6079,29508=>6080,12127=>6081,29577=>6081,37434=>6082,28331=>6083,29797=>6084,30239=>6085,31337=>6086,32277=>6087,34314=>6088,20800=>6089,22725=>6090,25793=>6091,29934=>6092,29973=>6093,30320=>6094,32705=>6095,37013=>6096,38605=>6097,39252=>6098,28198=>6099,12129=>6100,29926=>6100,31401=>6101,31402=>6102,33253=>6103,34521=>6104,34680=>6105,35355=>6106,23113=>6107,23436=>6108,23451=>6109,26785=>6110,26880=>6111,28003=>6112,29609=>6113,29715=>6114,29740=>6115,30871=>6116,32233=>6117,32747=>6118,33048=>6119,33109=>6120,33694=>6121,35916=>6122,38446=>6123,63942=>6123,38929=>6124,12104=>6125,26352=>6125,24448=>6126,26106=>6127,26505=>6128,27754=>6129,29579=>6130,20525=>6131,23043=>6132,27498=>6133,30702=>6134,22806=>6135,23916=>6136,24013=>6137,29477=>6138,30031=>6139,20709=>6140,20985=>6141,22575=>6142,22829=>6143,22934=>6144,23002=>6145,23525=>6146,23970=>6147,25303=>6148,25622=>6149,25747=>6150,25854=>6151,26332=>6152,27208=>6153,29183=>6154,29796=>6155,31368=>6156,31407=>6157,32327=>6158,32350=>6159,32768=>6160,33136=>6161,34799=>6162,35201=>6163,35616=>6164,36953=>6165,36992=>6166,39250=>6167,24958=>6168,27442=>6169,28020=>6170,32287=>6171,35109=>6172,36785=>6173,20433=>6174,20653=>6175,20887=>6176,21191=>6177,22471=>6178,22665=>6179,23481=>6180,24248=>6181,24898=>6182,27029=>6183,28044=>6184,28263=>6185,28342=>6186,29076=>6187,29794=>6188,12132=>6189,29992=>6189,29996=>6190,32883=>6191,33592=>6192,33993=>6193,36362=>6194,37780=>6195,37854=>6196,20110=>6197,20305=>6198,20598=>6199,20778=>6200,12060=>6201,21448=>6201,21451=>6202,21491=>6203,23431=>6204,23507=>6205,23588=>6206,24858=>6207,24962=>6208,26100=>6209,12124=>6210,29275=>6210,29591=>6211,29760=>6212,30402=>6213,31056=>6214,31121=>6215,31161=>6216,32006=>6217,12155=>6218,32701=>6218,33419=>6219,34261=>6220,34398=>6221,36802=>6222,36935=>6223,37109=>6224,37354=>6225,38533=>6226,12204=>6227,38632=>6227,38633=>6228,21206=>6229,24423=>6230,26093=>6231,26161=>6232,26671=>6233,29020=>6234,31286=>6235,37057=>6236,38922=>6237,20113=>6238,27218=>6239,27550=>6240,28560=>6241,29065=>6242,32792=>6243,33464=>6244,34131=>6245,36939=>6246,38549=>6247,38642=>6248,38907=>6249,34074=>6250,39729=>6251,20112=>6252,29066=>6253,38596=>6254,20803=>6255,21407=>6256,21729=>6257,22291=>6258,22290=>6259,22435=>6260,23195=>6261,23236=>6262,23491=>6263,24616=>6264,24895=>6265,25588=>6266,27781=>6267,27961=>6268,28274=>6269,28304=>6270,29232=>6271,29503=>6272,29783=>6273,33489=>6274,34945=>6275,36677=>6276,36960=>6277,38498=>6278,39000=>6279,40219=>6280,12105=>6281,26376=>6281,36234=>6282,37470=>6283,20301=>6284,20553=>6285,20702=>6286,21361=>6287,22285=>6288,22996=>6289,23041=>6290,23561=>6291,24944=>6292,26256=>6293,28205=>6294,29234=>6295,29771=>6296,32239=>6297,32963=>6298,33806=>6299,33894=>6300,34111=>6301,34655=>6302,34907=>6303,35096=>6304,35586=>6305,36949=>6306,12209=>6307,38859=>6307,39759=>6308,20083=>6309,20369=>6310,20754=>6311,20842=>6312,21807=>6313,21929=>6314,23418=>6315,23461=>6316,24188=>6317,24189=>6318,24254=>6319,24736=>6320,24799=>6321,24840=>6322,24841=>6323,25540=>6324,25912=>6325,26377=>6326,26580=>6327,26586=>6328,26977=>6329,26978=>6330,27833=>6331,27943=>6332,28216=>6333,28641=>6334,29494=>6335,29495=>6336,29788=>6337,30001=>6338,30290=>6339,32173=>6340,33278=>6341,33848=>6342,35029=>6343,35480=>6344,35547=>6345,35565=>6346,36400=>6347,36418=>6348,36938=>6349,36926=>6350,36986=>6351,12195=>6352,37193=>6352,37321=>6353,37742=>6354,22537=>6355,27603=>6356,12161=>6357,32905=>6357,32946=>6358,20801=>6359,22891=>6360,23609=>6361,28516=>6362,29607=>6363,32996=>6364,36103=>6365,37399=>6366,38287=>6367,12160=>6368,32895=>6368,25102=>6369,28700=>6370,32104=>6371,34701=>6372,22432=>6373,24681=>6374,24903=>6375,27575=>6376,35518=>6377,37504=>6378,38577=>6379,12036=>6380,20057=>6380,21535=>6381,28139=>6382,34093=>6383,38512=>6384,12211=>6385,38899=>6385,39150=>6386,25558=>6387,27875=>6388,12194=>6389,37009=>6389,20957=>6390,25033=>6391,33210=>6392,40441=>6393,20381=>6394,20506=>6395,20736=>6396,23452=>6397,24847=>6398,25087=>6399,25836=>6400,26885=>6401,27589=>6402,30097=>6403,30691=>6404,32681=>6405,33380=>6406,34191=>6407,34811=>6408,12176=>6409,34915=>6409,35516=>6410,35696=>6411,37291=>6412,12038=>6413,20108=>6413,20197=>6414,20234=>6415,22839=>6416,23016=>6417,24050=>6418,24347=>6419,24411=>6420,24609=>6421,29246=>6422,29669=>6423,30064=>6424,63842=>6424,30157=>6425,31227=>6426,12157=>6427,32780=>6427,12159=>6428,32819=>6428,32900=>6429,33505=>6430,33617=>6431,36029=>6432,36019=>6433,36999=>6434,39156=>6435,39180=>6436,28727=>6437,30410=>6438,32714=>6439,32716=>6440,32764=>6441,35610=>6442,12040=>6443,20154=>6443,20161=>6444,20995=>6445,21360=>6446,21693=>6447,63902=>6447,22240=>6448,23035=>6449,23493=>6450,24341=>6451,24525=>6452,28270=>6453,32106=>6454,33589=>6455,34451=>6456,35469=>6457,38765=>6458,38775=>6459,12032=>6460,19968=>6460,20314=>6461,20350=>6462,22777=>6463,12103=>6464,26085=>6464,28322=>6465,36920=>6466,37808=>6467,39353=>6468,20219=>6469,22764=>6470,22922=>6471,23001=>6472,24641=>6473,31252=>6474,33615=>6475,36035=>6476,12042=>6477,20837=>6477,21316=>6478,20173=>6479,21097=>6480,23381=>6481,33471=>6482,20180=>6483,21050=>6484,63999=>6484,21672=>6485,22985=>6486,23039=>6487,12070=>6488,23376=>6488,23383=>6489,23388=>6490,24675=>6491,24904=>6492,28363=>6493,28825=>6494,63995=>6494,29038=>6495,29574=>6496,29943=>6497,30133=>6498,30913=>6499,32043=>6500,32773=>6501,12163=>6502,33258=>6502,33576=>6503,34071=>6504,34249=>6505,35566=>6506,36039=>6507,38604=>6508,20316=>6509,21242=>6510,22204=>6511,26027=>6512,26152=>6513,28796=>6514,28856=>6515,29237=>6516,32189=>6517,33421=>6518,37196=>6519,38592=>6520,40306=>6521,23409=>6522,26855=>6523,27544=>6524,28538=>6525,30430=>6526,23697=>6527,26283=>6528,28507=>6529,31668=>6530,31786=>6531,34870=>6532,38620=>6533,19976=>6534,20183=>6535,21280=>6536,22580=>6537,22715=>6538,22767=>6539,22892=>6540,23559=>6541,24115=>6542,24196=>6543,24373=>6544,25484=>6545,26290=>6546,26454=>6547,27167=>6548,27299=>6549,27404=>6550,28479=>6551,29254=>6552,29520=>6553,29835=>6554,31456=>6555,31911=>6556,33144=>6557,33247=>6558,33255=>6559,33674=>6560,33900=>6561,34083=>6562,34196=>6563,34255=>6564,35037=>6565,36115=>6566,37292=>6567,12199=>6568,38263=>6568,38556=>6569,20877=>6570,21705=>6571,22312=>6572,23472=>6573,25165=>6574,26448=>6575,26685=>6576,26771=>6577,28221=>6578,28371=>6579,28797=>6580,32289=>6581,35009=>6582,36001=>6583,36617=>6584,40779=>6585,40782=>6586,29229=>6587,31631=>6588,35533=>6589,37658=>6590,20295=>6591,20302=>6592,20786=>6593,21632=>6594,22992=>6595,24213=>6596,25269=>6597,26485=>6598,26990=>6599,27159=>6600,27822=>6601,28186=>6602,29401=>6603,29482=>6604,30141=>6605,31672=>6606,32053=>6607,33511=>6608,33785=>6609,33879=>6610,34295=>6611,35419=>6612,36015=>6613,36487=>6614,36889=>6615,37048=>6616,38606=>6617,40799=>6618,21219=>6619,21514=>6620,23265=>6621,23490=>6622,25688=>6623,25973=>6624,28404=>6625,29380=>6626,30340=>6627,31309=>6628,31515=>6629,31821=>6630,32318=>6631,32735=>6632,33659=>6633,35627=>6634,36042=>6635,12186=>6636,36196=>6636,36321=>6637,36447=>6638,36842=>6639,36857=>6640,36969=>6641,37841=>6642,20291=>6643,20346=>6644,20659=>6645,20840=>6646,20856=>6647,21069=>6648,21098=>6649,22625=>6650,22652=>6651,22880=>6652,23560=>6653,23637=>6654,24283=>6655,24731=>6656,25136=>6657,26643=>6658,27583=>6659,27656=>6660,28593=>6661,29006=>6662,29728=>6663,12133=>6664,30000=>6664,30008=>6665,30033=>6666,30322=>6667,31564=>6668,31627=>6669,31661=>6670,31686=>6671,32399=>6672,35438=>6673,36670=>6674,36681=>6675,37439=>6676,37523=>6677,37666=>6678,37931=>6679,38651=>6680,39002=>6681,39019=>6682,39198=>6683,20999=>6684,64000=>6684,25130=>6685,25240=>6686,27993=>6687,30308=>6688,31434=>6689,31680=>6690,32118=>6691,21344=>6692,23742=>6693,24215=>6694,28472=>6695,28857=>6696,31896=>6697,38673=>6698,39822=>6699,40670=>6700,25509=>6701,25722=>6702,34678=>6703,19969=>6704,20117=>6705,20141=>6706,20572=>6707,20597=>6708,21576=>6709,22979=>6710,23450=>6711,24128=>6712,24237=>6713,24311=>6714,24449=>6715,24773=>6716,25402=>6717,25919=>6718,25972=>6719,26060=>6720,26230=>6721,26232=>6722,26622=>6723,26984=>6724,27273=>6725,27491=>6726,27712=>6727,28096=>6728,28136=>6729,28191=>6730,28254=>6731,28702=>6732,28833=>6733,29582=>6734,29693=>6735,30010=>6736,30555=>6737,30855=>6738,31118=>6739,31243=>6740,31357=>6741,31934=>6742,32142=>6743,33351=>6744,35330=>6745,35562=>6746,35998=>6747,37165=>6748,37194=>6749,37336=>6750,37478=>6751,37580=>6752,37664=>6753,38662=>6754,38742=>6755,38748=>6756,38914=>6757,12237=>6758,40718=>6758,21046=>6759,21137=>6760,21884=>6761,22564=>6762,24093=>6763,24351=>6764,24716=>6765,25552=>6766,26799=>6767,28639=>6768,31085=>6769,31532=>6770,33229=>6771,34234=>6772,35069=>6773,35576=>6774,36420=>6775,37261=>6776,38500=>6777,38555=>6778,38717=>6779,38988=>6780,12241=>6781,40778=>6781,20430=>6782,20806=>6783,20939=>6784,21161=>6785,22066=>6786,24340=>6787,24427=>6788,25514=>6789,25805=>6790,26089=>6791,26177=>6792,26362=>6793,26361=>6794,26397=>6795,26781=>6796,26839=>6797,27133=>6798,28437=>6799,28526=>6800,29031=>6801,29157=>6802,12118=>6803,29226=>6803,29866=>6804,30522=>6805,31062=>6806,31066=>6807,31199=>6808,31264=>6809,31381=>6810,31895=>6811,31967=>6812,32068=>6813,32368=>6814,32903=>6815,34299=>6816,34468=>6817,35412=>6818,35519=>6819,36249=>6820,36481=>6821,36896=>6822,36973=>6823,37347=>6824,38459=>6825,38613=>6826,12227=>6827,40165=>6827,26063=>6828,31751=>6829,12188=>6830,36275=>6830,37827=>6831,23384=>6832,23562=>6833,21330=>6834,25305=>6835,29469=>6836,20519=>6837,23447=>6838,24478=>6839,24752=>6840,24939=>6841,26837=>6842,28121=>6843,29742=>6844,31278=>6845,32066=>6846,32156=>6847,32305=>6848,33131=>6849,36394=>6850,36405=>6851,37758=>6852,37912=>6853,20304=>6854,22352=>6855,24038=>6856,24231=>6857,25387=>6858,32618=>6859,20027=>6860,20303=>6861,20367=>6862,20570=>6863,23005=>6864,32964=>6865,21610=>6866,21608=>6867,22014=>6868,22863=>6869,23449=>6870,24030=>6871,24282=>6872,26205=>6873,26417=>6874,26609=>6875,26666=>6876,27880=>6877,27954=>6878,28234=>6879,28557=>6880,28855=>6881,29664=>6882,30087=>6883,31820=>6884,32002=>6885,32044=>6886,32162=>6887,12168=>6888,33311=>6888,34523=>6889,35387=>6890,35461=>6891,12187=>6892,36208=>6892,36490=>6893,36659=>6894,36913=>6895,37198=>6896,37202=>6897,37956=>6898,39376=>6899,12149=>6900,31481=>6900,31909=>6901,20426=>6902,20737=>6903,20934=>6904,22472=>6905,23535=>6906,23803=>6907,26201=>6908,27197=>6909,27994=>6910,28310=>6911,28652=>6912,28940=>6913,30063=>6914,31459=>6915,34850=>6916,36897=>6917,36981=>6918,38603=>6919,39423=>6920,33537=>6921,20013=>6922,20210=>6923,34886=>6924,37325=>6925,21373=>6926,27355=>6927,26987=>6928,27713=>6929,33914=>6930,22686=>6931,24974=>6932,26366=>6933,25327=>6934,28893=>6935,29969=>6936,30151=>6937,32338=>6938,33976=>6939,35657=>6940,36104=>6941,20043=>6942,21482=>6943,21675=>6944,22320=>6945,22336=>6946,24535=>6947,25345=>6948,25351=>6949,25711=>6950,12096=>6951,25903=>6951,26088=>6952,26234=>6953,26525=>6954,26547=>6955,12108=>6956,27490=>6956,27744=>6957,27802=>6958,28460=>6959,30693=>6960,30757=>6961,31049=>6962,31063=>6963,32025=>6964,32930=>6965,33026=>6966,12164=>6967,33267=>6967,33437=>6968,33463=>6969,34584=>6970,35468=>6971,36100=>6972,36286=>6973,36978=>6974,30452=>6975,31257=>6976,31287=>6977,32340=>6978,32887=>6979,21767=>6980,21972=>6981,22645=>6982,25391=>6983,25634=>6984,26185=>6985,26187=>6986,26733=>6987,27035=>6988,27524=>6989,27941=>6990,28337=>6991,29645=>6992,29800=>6993,29857=>6994,30043=>6995,30137=>6996,30433=>6997,30494=>6998,30603=>6999,31206=>7000,32265=>7001,32285=>7002,33275=>7003,34095=>7004,34967=>7005,35386=>7006,36049=>7007,36587=>7008,12192=>7009,36784=>7009,63857=>7009,36914=>7010,37805=>7011,38499=>7012,38515=>7013,38663=>7014,20356=>7015,21489=>7016,23018=>7017,23241=>7018,24089=>7019,26702=>7020,29894=>7021,30142=>7022,31209=>7023,31378=>7024,33187=>7025,34541=>7026,36074=>7027,36300=>7028,36845=>7029,26015=>7030,26389=>7031,22519=>7032,28503=>7033,32221=>7034,36655=>7035,37878=>7036,38598=>7037,24501=>7038,25074=>7039,28548=>7040,19988=>7041,20376=>7042,20511=>7043,21449=>7044,21983=>7045,23919=>7046,24046=>7047,27425=>7048,27492=>7049,30923=>7050,31642=>7051,36425=>7052,12190=>7053,36554=>7053,63746=>7053,36974=>7054,25417=>7055,25662=>7056,30528=>7057,31364=>7058,37679=>7059,38015=>7060,40810=>7061,25776=>7062,28591=>7063,29158=>7064,29864=>7065,29914=>7066,31428=>7067,31762=>7068,32386=>7069,31922=>7070,32408=>7071,35738=>7072,36106=>7073,38013=>7074,39184=>7075,39244=>7076,21049=>7077,23519=>7078,25830=>7079,26413=>7080,32046=>7081,20717=>7082,21443=>7083,63851=>7083,22649=>7084,24920=>7085,24921=>7086,25082=>7087,26028=>7088,31449=>7089,35730=>7090,35734=>7091,20489=>7092,20513=>7093,21109=>7094,21809=>7095,23100=>7096,24288=>7097,24432=>7098,24884=>7099,25950=>7100,26124=>7101,26166=>7102,26274=>7103,27085=>7104,28356=>7105,28466=>7106,29462=>7107,30241=>7108,31379=>7109,33081=>7110,33369=>7111,33750=>7112,33980=>7113,20661=>7114,22512=>7115,23488=>7116,23528=>7117,24425=>7118,25505=>7119,30758=>7120,32181=>7121,33756=>7122,34081=>7123,37319=>7124,37365=>7125,20874=>7126,26613=>7127,31574=>7128,36012=>7129,20932=>7130,22971=>7131,24765=>7132,34389=>7133,20508=>7134,21076=>7135,23610=>7136,24957=>7137,25114=>7138,25299=>7139,64002=>7139,25842=>7140,26021=>7141,28364=>7142,30240=>7143,33034=>7144,36448=>7145,38495=>7146,38587=>7147,20191=>7148,21315=>7149,21912=>7150,22825=>7151,24029=>7152,25797=>7153,27849=>7154,28154=>7155,29588=>7156,31359=>7157,12167=>7158,33307=>7158,34214=>7159,36068=>7160,36368=>7161,36983=>7162,37351=>7163,38369=>7164,38433=>7165,38854=>7166,20984=>7167,21746=>7168,21894=>7169,24505=>7170,25764=>7171,28552=>7172,32180=>7173,36639=>7174,36685=>7175,37941=>7176,20681=>7177,23574=>7178,27838=>7179,28155=>7180,29979=>7181,30651=>7182,31805=>7183,31844=>7184,35449=>7185,35522=>7186,22558=>7187,22974=>7188,24086=>7189,25463=>7190,29266=>7191,30090=>7192,30571=>7193,35548=>7194,36028=>7195,36626=>7196,24307=>7197,26228=>7198,28152=>7199,32893=>7200,33729=>7201,35531=>7202,12205=>7203,38737=>7203,39894=>7204,21059=>7205,26367=>7206,28053=>7207,28399=>7208,32224=>7209,35558=>7210,36910=>7211,36958=>7212,39636=>7213,21021=>7214,21119=>7215,21736=>7216,24980=>7217,25220=>7218,25307=>7219,26786=>7220,26898=>7221,26970=>7222,27189=>7223,28818=>7224,28966=>7225,30813=>7226,30977=>7227,30990=>7228,31186=>7229,31245=>7230,32918=>7231,12171=>7232,33400=>7232,33493=>7233,33609=>7234,34121=>7235,35970=>7236,36229=>7237,37218=>7238,37259=>7239,37294=>7240,20419=>7241,22225=>7242,29165=>7243,30679=>7244,34560=>7245,35320=>7246,12072=>7247,23544=>7247,24534=>7248,26449=>7249,37032=>7250,21474=>7251,22618=>7252,23541=>7253,24740=>7254,24961=>7255,25696=>7256,32317=>7257,32880=>7258,34085=>7259,37507=>7260,25774=>7261,20652=>7262,23828=>7263,26368=>7264,22684=>7265,25277=>7266,25512=>7267,26894=>7268,27000=>7269,27166=>7270,28267=>7271,30394=>7272,31179=>7273,33467=>7274,33833=>7275,35535=>7276,36264=>7277,36861=>7278,37138=>7279,37195=>7280,37276=>7281,37648=>7282,37656=>7283,37786=>7284,38619=>7285,39478=>7286,39949=>7287,19985=>7288,30044=>7289,31069=>7290,31482=>7291,31569=>7292,31689=>7293,32302=>7294,33988=>7295,36441=>7296,36468=>7297,36600=>7298,36880=>7299,26149=>7300,26943=>7301,29763=>7302,20986=>7303,26414=>7304,40668=>7305,20805=>7306,24544=>7307,27798=>7308,34802=>7309,34909=>7310,34935=>7311,24756=>7312,33205=>7313,33795=>7314,36101=>7315,21462=>7316,21561=>7317,22068=>7318,23094=>7319,23601=>7320,28810=>7321,32736=>7322,32858=>7323,33030=>7324,33261=>7325,36259=>7326,37257=>7327,39519=>7328,40434=>7329,20596=>7330,20164=>7331,21408=>7332,24827=>7333,28204=>7334,23652=>7335,20360=>7336,20516=>7337,21988=>7338,23769=>7339,24159=>7340,24677=>7341,26772=>7342,27835=>7343,28100=>7344,29118=>7345,30164=>7346,30196=>7347,30305=>7348,31258=>7349,31305=>7350,32199=>7351,32251=>7352,32622=>7353,33268=>7354,34473=>7355,36636=>7356,38601=>7357,39347=>7358,12242=>7359,40786=>7359,21063=>7360,21189=>7361,39149=>7362,35242=>7363,19971=>7364,26578=>7365,28422=>7366,20405=>7367,23522=>7368,26517=>7369,27784=>7370,63858=>7370,28024=>7371,29723=>7372,30759=>7373,37341=>7374,37756=>7375,34756=>7376,31204=>7377,31281=>7378,24555=>7379,20182=>7380,21668=>7381,21822=>7382,22702=>7383,22949=>7384,24816=>7385,25171=>7386,25302=>7387,26422=>7388,26965=>7389,33333=>7390,38464=>7391,39345=>7392,39389=>7393,20524=>7394,21331=>7395,21828=>7396,22396=>7397,25176=>7398,25826=>7399,26219=>7400,26589=>7401,28609=>7402,28655=>7403,29730=>7404,29752=>7405,35351=>7406,37944=>7407,21585=>7408,22022=>7409,22374=>7410,24392=>7411,24986=>7412,27470=>7413,28760=>7414,28845=>7415,32187=>7416,35477=>7417,22890=>7418,33067=>7419,25506=>7420,30472=>7421,32829=>7422,36010=>7423,22612=>7424,25645=>7425,27067=>7426,23445=>7427,24081=>7428,28271=>7429,34153=>7430,20812=>7431,21488=>7432,22826=>7433,24608=>7434,24907=>7435,27526=>7436,27760=>7437,27888=>7438,31518=>7439,32974=>7440,33492=>7441,36294=>7442,37040=>7443,39089=>7444,25799=>7445,28580=>7446,25745=>7447,25860=>7448,20814=>7449,21520=>7450,12063=>7451,22303=>7451,35342=>7452,24927=>7453,26742=>7454,30171=>7455,31570=>7456,32113=>7457,36890=>7458,22534=>7459,27084=>7460,33151=>7461,35114=>7462,36864=>7463,38969=>7464,20600=>7465,22871=>7466,22956=>7467,25237=>7468,36879=>7469,39722=>7470,24925=>7471,29305=>7472,38358=>7473,22369=>7474,23110=>7475,24052=>7476,25226=>7477,25773=>7478,25850=>7479,26487=>7480,27874=>7481,27966=>7482,29228=>7483,29750=>7484,30772=>7485,32631=>7486,33453=>7487,36315=>7488,38935=>7489,21028=>7490,22338=>7491,26495=>7492,29256=>7493,29923=>7494,36009=>7495,36774=>7496,37393=>7497,38442=>7498,12043=>7499,20843=>7499,21485=>7500,25420=>7501,20329=>7502,21764=>7503,24726=>7504,25943=>7505,27803=>7506,28031=>7507,29260=>7508,29437=>7509,31255=>7510,35207=>7511,12185=>7512,35997=>7512,24429=>7513,28558=>7514,28921=>7515,33192=>7516,24846=>7517,20415=>7518,63845=>7518,20559=>7519,25153=>7520,12122=>7521,29255=>7521,31687=>7522,32232=>7523,32745=>7524,36941=>7525,38829=>7526,39449=>7527,36022=>7528,22378=>7529,24179=>7530,26544=>7531,33805=>7532,35413=>7533,21536=>7534,23318=>7535,24163=>7536,24290=>7537,24330=>7538,25987=>7539,32954=>7540,34109=>7541,38281=>7542,38491=>7543,20296=>7544,21253=>7545,21261=>7546,21263=>7547,21638=>7548,21754=>7549,22275=>7550,24067=>7551,24598=>7552,25243=>7553,25265=>7554,25429=>7555,27873=>7556,28006=>7557,30129=>7558,30770=>7559,32990=>7560,33071=>7561,33502=>7562,33889=>7563,33970=>7564,34957=>7565,35090=>7566,36875=>7567,37610=>7568,39165=>7569,39825=>7570,24133=>7571,26292=>7572,64006=>7572,26333=>7573,28689=>7574,29190=>7575,20469=>7576,21117=>7577,24426=>7578,24915=>7579,26451=>7580,27161=>7581,28418=>7582,29922=>7583,31080=>7584,34920=>7585,35961=>7586,39111=>7587,39108=>7588,39491=>7589,21697=>7590,31263=>7591,26963=>7592,35575=>7593,35914=>7594,12213=>7595,39080=>7595,39342=>7596,24444=>7597,25259=>7598,30130=>7599,12138=>7600,30382=>7600,34987=>7601,36991=>7602,38466=>7603,21305=>7604,24380=>7605,24517=>7606,27852=>7607,63848=>7607,29644=>7608,30050=>7609,12134=>7610,30091=>7610,31558=>7611,33534=>7612,39325=>7613,20047=>7614,36924=>7615,19979=>7616,20309=>7617,21414=>7618,22799=>7619,24264=>7620,26160=>7621,27827=>7622,29781=>7623,33655=>7624,34662=>7625,36032=>7626,36944=>7627,38686=>7628,39957=>7629,22737=>7630,23416=>7631,34384=>7632,35604=>7633,40372=>7634,23506=>7635,24680=>7636,24717=>7637,26097=>7638,27735=>7639,28450=>7640,28579=>7641,28698=>7642,32597=>7643,32752=>7644,38289=>7645,38290=>7646,38480=>7647,38867=>7648,21106=>7649,36676=>7650,20989=>7651,21547=>7652,21688=>7653,21859=>7654,21898=>7655,27323=>7656,28085=>7657,32216=>7658,33382=>7659,37532=>7660,38519=>7661,40569=>7662,21512=>7663,21704=>7664,30418=>7665,34532=>7666,38308=>7667,38356=>7668,38492=>7669,20130=>7670,20233=>7671,23022=>7672,23270=>7673,24055=>7674,24658=>7675,25239=>7676,26477=>7677,26689=>7678,27782=>7679,28207=>7680,32568=>7681,32923=>7682,33322=>7683,38917=>7684,20133=>7685,20565=>7686,21683=>7687,22419=>7688,22874=>7689,23401=>7690,23475=>7691,25032=>7692,26999=>7693,28023=>7694,28707=>7695,34809=>7696,35299=>7697,35442=>7698,35559=>7699,36994=>7700,39405=>7701,39608=>7702,21182=>7703,26680=>7704,20502=>7705,24184=>7706,26447=>7707,33607=>7708,12175=>7709,34892=>7709,64008=>7709,20139=>7710,21521=>7711,22190=>7712,29670=>7713,37141=>7714,38911=>7715,39177=>7716,39255=>7717,12217=>7718,39321=>7718,22099=>7719,22687=>7720,34395=>7721,35377=>7722,25010=>7723,27382=>7724,29563=>7725,36562=>7726,27463=>7727,38570=>7728,39511=>7729,22869=>7730,29184=>7731,36203=>7732,12208=>7733,38761=>7733,20436=>7734,23796=>7735,24358=>7736,25080=>7737,26203=>7738,27883=>7739,28843=>7740,12126=>7741,29572=>7741,29625=>7742,29694=>7743,30505=>7744,30541=>7745,32067=>7746,32098=>7747,32291=>7748,33335=>7749,34898=>7750,36066=>7751,37449=>7752,39023=>7753,23377=>7754,12147=>7755,31348=>7755,12174=>7756,34880=>7756,12212=>7757,38913=>7757,23244=>7758,20448=>7759,21332=>7760,22846=>7761,23805=>7762,25406=>7763,28025=>7764,29433=>7765,33029=>7766,33031=>7767,33698=>7768,37583=>7769,38960=>7770,20136=>7771,20804=>7772,21009=>7773,22411=>7774,24418=>7775,27842=>7776,28366=>7777,28677=>7778,28752=>7779,28847=>7780,29074=>7781,29673=>7782,29801=>7783,63918=>7783,33610=>7784,34722=>7785,34913=>7786,36872=>7787,37026=>7788,37795=>7789,39336=>7790,20846=>7791,24407=>7792,24800=>7793,24935=>7794,26291=>7795,34137=>7796,36426=>7797,37295=>7798,38795=>7799,20046=>7800,20114=>7801,21628=>7802,22741=>7803,22778=>7804,22909=>7805,23733=>7806,24359=>7807,12094=>7808,25142=>7808,25160=>7809,26122=>7810,26215=>7811,27627=>7812,28009=>7813,28111=>7814,28246=>7815,28408=>7816,28564=>7817,28640=>7818,28649=>7819,28765=>7820,29392=>7821,29733=>7822,29786=>7823,29920=>7824,30355=>7825,31068=>7826,31946=>7827,32286=>7828,32993=>7829,33446=>7830,33899=>7831,33983=>7832,34382=>7833,34399=>7834,34676=>7835,35703=>7836,35946=>7837,37804=>7838,38912=>7839,39013=>7840,24785=>7841,25110=>7842,37239=>7843,23130=>7844,26127=>7845,28151=>7846,28222=>7847,29759=>7848,39746=>7849,24573=>7850,24794=>7851,31503=>7852,21700=>7853,24344=>7854,27742=>7855,27859=>7856,27946=>7857,28888=>7858,32005=>7859,34425=>7860,35340=>7861,40251=>7862,21270=>7863,21644=>7864,23301=>7865,27194=>7866,12117=>7867,28779=>7867,30069=>7868,31117=>7869,12146=>7870,31166=>7870,33457=>7871,33775=>7872,35441=>7873,35649=>7874,36008=>7875,38772=>7876,25844=>7877,25899=>7878,30906=>7879,30907=>7880,31339=>7881,20024=>7882,21914=>7883,22864=>7884,23462=>7885,24187=>7886,24739=>7887,25563=>7888,27489=>7889,26213=>7890,26707=>7891,28185=>7892,29029=>7893,29872=>7894,32008=>7895,36996=>7896,39529=>7897,39973=>7898,27963=>7899,28369=>7900,63748=>7900,29502=>7901,35905=>7902,38346=>7903,20976=>7904,24140=>7905,24488=>7906,24653=>7907,24822=>7908,24880=>7909,24908=>7910,26179=>7911,26180=>7912,27045=>7913,27841=>7914,28255=>7915,28361=>7916,28514=>7917,29004=>7918,29852=>7919,30343=>7920,31681=>7921,31783=>7922,33618=>7923,34647=>7924,36945=>7925,38541=>7926,12232=>7927,40643=>7927,21295=>7928,22238=>7929,24315=>7930,24458=>7931,24674=>7932,24724=>7933,25079=>7934,26214=>7935,26371=>7936,27292=>7937,28142=>7938,28590=>7939,28784=>7940,29546=>7941,32362=>7942,33214=>7943,33588=>7944,34516=>7945,35496=>7946,36036=>7947,21123=>7948,29554=>7949,23446=>7950,27243=>7951,37892=>7952,21742=>7953,22150=>7954,23389=>7955,25928=>7956,25989=>7957,26313=>7958,26783=>7959,28045=>7960,28102=>7961,12120=>7962,29243=>7962,32948=>7963,37237=>7964,39501=>7965,20399=>7966,20505=>7967,21402=>7968,21518=>7969,21564=>7970,21897=>7971,21957=>7972,24127=>7973,24460=>7974,26429=>7975,29030=>7976,29661=>7977,36869=>7978,21211=>7979,21235=>7980,22628=>7981,22734=>7982,28932=>7983,29071=>7984,29179=>7985,34224=>7986,35347=>7987,26248=>7988,63941=>7988,34216=>7989,21927=>7990,26244=>7991,29002=>7992,33841=>7993,21321=>7994,21913=>7995,27585=>7996,24409=>7997,24509=>7998,25582=>7999,26249=>8000,28999=>8001,35569=>8002,36637=>8003,40638=>8004,20241=>8005,25658=>8006,28875=>8007,30054=>8008,34407=>8009,24676=>8010,35662=>8011,40440=>8012,20807=>8013,20982=>8014,21256=>8015,27958=>8016,33016=>8017,12234=>8018,40657=>8018,26133=>8019,27427=>8020,28824=>8021,30165=>8022,21507=>8023,23673=>8024,32007=>8025,35350=>8026,12107=>8027,27424=>8027,27453=>8028,27462=>8029,21560=>8030,24688=>8031,27965=>8032,32725=>8033,33288=>8034,20694=>8035,20958=>8036,21916=>8037,22123=>8038,22221=>8039,23020=>8040,23305=>8041,24076=>8042,24985=>8043,24984=>8044,25137=>8045,26206=>8046,26342=>8047,29081=>8048,29113=>8049,29114=>8050,29351=>8051,31143=>8052,31232=>8053,32690=>8054,35440=>8055,12310=>8219,12311=>8220,12312=>8221,12313=>8222,8223=>8237,8219=>8238,8314=>8239,8315=>8240,8316=>8248,8317=>8250,8318=>8251,700=>8275,8942=>8320,8759=>8321,10122=>8342,10123=>8343,10124=>8344,10125=>8345,10126=>8346,10127=>8347,10128=>8348,10129=>8349,10130=>8350,10131=>8351,9398=>8388,9399=>8389,9400=>8390,9401=>8391,9402=>8392,9403=>8393,9404=>8394,9405=>8395,9406=>8396,9407=>8397,9408=>8398,9409=>8399,9410=>8400,9411=>8401,9412=>8402,9413=>8403,9414=>8404,9415=>8405,9416=>8406,9417=>8407,9418=>8408,9419=>8409,9420=>8410,9421=>8411,9422=>8412,9423=>8413,8826=>8475,8827=>8476,8910=>8477,8911=>8478,8832=>8479,8833=>8480,8816=>8481,8817=>8482,8818=>8483,8819=>8484,8842=>8486,8843=>8488,8822=>8489,8823=>8490,8825=>8491,8922=>8492,8923=>8493,8773=>8499,8771=>8500,8776=>8501,8868=>8503,8244=>8582,9839=>8594,8258=>8599,10045=>8604,8226=>8607,8249=>8612,8250=>8613,10010=>8630,10006=>8631,9711=>8633,10070=>8637,9676=>8639,9775=>8664,12320=>8671,10102=>8673,10103=>8674,10104=>8675,10105=>8676,10106=>8677,10107=>8678,10108=>8679,10109=>8680,10110=>8681,10111=>8682,12306=>8700,12342=>8701,8710=>8715,8735=>8717,8741=>8719,8742=>8720,8787=>8722,8785=>8723,8806=>8724,8807=>8725,8723=>8726,8853=>8727,8854=>8728,8855=>8729,8980=>8731,8802=>8734,9649=>8736,8738=>8738,8784=>8739,8867=>8742,8814=>8745,8815=>8746,8837=>8747,8836=>8748,8713=>8749,8716=>8750,8891=>8751,8892=>8752,8794=>8753,8966=>8754,12958=>8761,8252=>8763,9702=>8775,9663=>8779,9653=>8780,9657=>8781,9667=>8782,9674=>8787,12849=>8788,12857=>8789,13259=>8790,9327=>8791,9328=>8792,9329=>8793,9330=>8794,9331=>8795,8656=>8814,8655=>8815,8653=>8816,8657=>8854,8659=>8855,8626=>8864,8625=>8865,8628=>8867,8624=>8868,8627=>8869,8636=>8884,8640=>8885,8644=>8896,8645=>8897,9347=>9042,9348=>9043,9349=>9044,9350=>9045,9351=>9046,12948=>9080,12965=>9096,8672=>9190,8674=>9191,8673=>9192,8675=>9193,8678=>9198,8680=>9199,8679=>9200,8681=>9201,9757=>9222,9759=>9223,12944=>9300,12938=>9301,12939=>9302,12940=>9303,12941=>9304,12942=>9305,12943=>9306,12318=>9322,12319=>9323,8246=>9324,8245=>9326,12540=>9330,44034=>9333,44035=>9334,44037=>9335,44038=>9336,44043=>9337,44044=>9338,44045=>9339,44046=>9340,44047=>9341,44056=>9342,44062=>9343,44063=>9344,44065=>9345,44066=>9346,44067=>9347,44069=>9348,44070=>9349,44071=>9350,44072=>9351,44073=>9352,44074=>9353,44075=>9354,44078=>9355,44082=>9356,44083=>9357,44084=>9358,44085=>9359,44086=>9360,44087=>9361,44090=>9362,44091=>9363,44093=>9364,44094=>9365,44095=>9366,44097=>9367,44098=>9368,44099=>9369,44100=>9370,44101=>9371,44102=>9372,44103=>9373,44104=>9374,44105=>9375,44106=>9376,44108=>9377,44110=>9378,44111=>9379,44112=>9380,44113=>9381,44114=>9382,44115=>9383,44117=>9384,44118=>9385,44119=>9386,44121=>9387,44122=>9388,44123=>9389,44125=>9390,44126=>9391,44127=>9392,44128=>9393,44129=>9394,44130=>9395,44131=>9396,44132=>9397,44133=>9398,44134=>9399,44135=>9400,44136=>9401,44137=>9402,44138=>9403,44139=>9404,44140=>9405,44141=>9406,44142=>9407,44143=>9408,44146=>9409,44147=>9410,44149=>9411,44150=>9412,44153=>9413,44155=>9414,44156=>9415,44157=>9416,44158=>9417,44159=>9418,44162=>9419,44167=>9420,44168=>9421,44173=>9422,44174=>9423,44175=>9424,44177=>9425,44178=>9426,44179=>9427,44181=>9428,44182=>9429,44183=>9430,44184=>9431,44185=>9432,44186=>9433,44187=>9434,44190=>9435,44194=>9436,44195=>9437,44196=>9438,44197=>9439,44198=>9440,44199=>9441,44203=>9442,44205=>9443,44206=>9444,44209=>9445,44210=>9446,44211=>9447,44212=>9448,44213=>9449,44214=>9450,44215=>9451,44218=>9452,44222=>9453,44223=>9454,44224=>9455,44226=>9456,44227=>9457,44229=>9458,44230=>9459,44231=>9460,44233=>9461,44234=>9462,44235=>9463,44237=>9464,44238=>9465,44239=>9466,44240=>9467,44241=>9468,44242=>9469,44243=>9470,44244=>9471,44246=>9472,44248=>9473,44249=>9474,44250=>9475,44251=>9476,44252=>9477,44253=>9478,44254=>9479,44255=>9480,44258=>9481,44259=>9482,44261=>9483,44262=>9484,44265=>9485,44267=>9486,44269=>9487,44270=>9488,44274=>9489,44276=>9490,44279=>9491,44280=>9492,44281=>9493,44282=>9494,44283=>9495,44286=>9496,44287=>9497,44289=>9498,44290=>9499,44291=>9500,44293=>9501,44295=>9502,44296=>9503,44297=>9504,44298=>9505,44299=>9506,44302=>9507,44304=>9508,44306=>9509,44307=>9510,44308=>9511,44309=>9512,44310=>9513,44311=>9514,44313=>9515,44314=>9516,44315=>9517,44317=>9518,44318=>9519,44319=>9520,44321=>9521,44322=>9522,44323=>9523,44324=>9524,44325=>9525,44326=>9526,44327=>9527,44328=>9528,44330=>9529,44331=>9530,44334=>9531,44335=>9532,44336=>9533,44337=>9534,44338=>9535,44339=>9536,44342=>9537,44343=>9538,44345=>9539,44346=>9540,44347=>9541,44349=>9542,44350=>9543,44351=>9544,44352=>9545,44353=>9546,44354=>9547,44355=>9548,44358=>9549,44360=>9550,44362=>9551,44363=>9552,44364=>9553,44365=>9554,44366=>9555,44367=>9556,44369=>9557,44370=>9558,44371=>9559,44373=>9560,44374=>9561,44375=>9562,44377=>9563,44378=>9564,44379=>9565,44380=>9566,44381=>9567,44382=>9568,44383=>9569,44384=>9570,44386=>9571,44388=>9572,44389=>9573,44390=>9574,44391=>9575,44392=>9576,44393=>9577,44394=>9578,44395=>9579,44398=>9580,44399=>9581,44401=>9582,44402=>9583,44407=>9584,44408=>9585,44409=>9586,44410=>9587,44414=>9588,44416=>9589,44419=>9590,44420=>9591,44421=>9592,44422=>9593,44423=>9594,44426=>9595,44427=>9596,44429=>9597,44430=>9598,44431=>9599,44433=>9600,44434=>9601,44435=>9602,44436=>9603,44437=>9604,44438=>9605,44439=>9606,44440=>9607,44441=>9608,44442=>9609,44443=>9610,44446=>9611,44447=>9612,44448=>9613,44449=>9614,44450=>9615,44451=>9616,44453=>9617,44454=>9618,44455=>9619,44456=>9620,44457=>9621,44458=>9622,44459=>9623,44460=>9624,44461=>9625,44462=>9626,44463=>9627,44464=>9628,44465=>9629,44466=>9630,44467=>9631,44468=>9632,44469=>9633,44470=>9634,44472=>9635,44473=>9636,44474=>9637,44475=>9638,44476=>9639,44477=>9640,44478=>9641,44479=>9642,44482=>9643,44483=>9644,44485=>9645,44486=>9646,44487=>9647,44489=>9648,44490=>9649,44491=>9650,44492=>9651,44493=>9652,44494=>9653,44495=>9654,44498=>9655,44500=>9656,44501=>9657,44502=>9658,44503=>9659,44504=>9660,44505=>9661,44506=>9662,44507=>9663,44509=>9664,44510=>9665,44511=>9666,44513=>9667,44514=>9668,44515=>9669,44517=>9670,44518=>9671,44519=>9672,44520=>9673,44521=>9674,44522=>9675,44523=>9676,44524=>9677,44525=>9678,44526=>9679,44527=>9680,44528=>9681,44529=>9682,44530=>9683,44531=>9684,44532=>9685,44533=>9686,44534=>9687,44535=>9688,44538=>9689,44539=>9690,44541=>9691,44542=>9692,44546=>9693,44547=>9694,44548=>9695,44549=>9696,44550=>9697,44551=>9698,44554=>9699,44556=>9700,44558=>9701,44559=>9702,44560=>9703,44561=>9704,44562=>9705,44563=>9706,44565=>9707,44566=>9708,44567=>9709,44568=>9710,44569=>9711,44570=>9712,44571=>9713,44572=>9714,44573=>9715,44574=>9716,44575=>9717,44576=>9718,44577=>9719,44578=>9720,44579=>9721,44580=>9722,44581=>9723,44582=>9724,44583=>9725,44584=>9726,44585=>9727,44586=>9728,44587=>9729,44588=>9730,44589=>9731,44590=>9732,44591=>9733,44594=>9734,44595=>9735,44597=>9736,44598=>9737,44601=>9738,44603=>9739,44604=>9740,44605=>9741,44606=>9742,44607=>9743,44610=>9744,44612=>9745,44615=>9746,44616=>9747,44617=>9748,44619=>9749,44623=>9750,44625=>9751,44626=>9752,44627=>9753,44629=>9754,44631=>9755,44632=>9756,44633=>9757,44634=>9758,44635=>9759,44638=>9760,44642=>9761,44643=>9762,44644=>9763,44646=>9764,44647=>9765,44650=>9766,44651=>9767,44653=>9768,44654=>9769,44655=>9770,44657=>9771,44658=>9772,44659=>9773,44660=>9774,44661=>9775,44662=>9776,44663=>9777,44666=>9778,44670=>9779,44671=>9780,44672=>9781,44673=>9782,44674=>9783,44675=>9784,44678=>9785,44679=>9786,44680=>9787,44681=>9788,44682=>9789,44683=>9790,44685=>9791,44686=>9792,44687=>9793,44688=>9794,44689=>9795,44690=>9796,44691=>9797,44692=>9798,44693=>9799,44694=>9800,44695=>9801,44696=>9802,44697=>9803,44698=>9804,44699=>9805,44700=>9806,44701=>9807,44702=>9808,44703=>9809,44704=>9810,44705=>9811,44706=>9812,44707=>9813,44708=>9814,44709=>9815,44710=>9816,44711=>9817,44712=>9818,44713=>9819,44714=>9820,44715=>9821,44716=>9822,44717=>9823,44718=>9824,44719=>9825,44720=>9826,44721=>9827,44722=>9828,44723=>9829,44724=>9830,44725=>9831,44726=>9832,44727=>9833,44728=>9834,44729=>9835,44730=>9836,44731=>9837,44735=>9838,44737=>9839,44738=>9840,44739=>9841,44741=>9842,44742=>9843,44743=>9844,44744=>9845,44745=>9846,44746=>9847,44747=>9848,44750=>9849,44754=>9850,44755=>9851,44756=>9852,44757=>9853,44758=>9854,44759=>9855,44762=>9856,44763=>9857,44765=>9858,44766=>9859,44767=>9860,44768=>9861,44769=>9862,44770=>9863,44771=>9864,44772=>9865,44773=>9866,44774=>9867,44775=>9868,44777=>9869,44778=>9870,44780=>9871,44782=>9872,44783=>9873,44784=>9874,44785=>9875,44786=>9876,44787=>9877,44789=>9878,44790=>9879,44791=>9880,44793=>9881,44794=>9882,44795=>9883,44797=>9884,44798=>9885,44799=>9886,44800=>9887,44801=>9888,44802=>9889,44803=>9890,44804=>9891,44805=>9892,44806=>9893,44809=>9894,44810=>9895,44811=>9896,44812=>9897,44814=>9898,44815=>9899,44817=>9900,44818=>9901,44819=>9902,44820=>9903,44821=>9904,44822=>9905,44823=>9906,44824=>9907,44825=>9908,44826=>9909,44827=>9910,44828=>9911,44829=>9912,44830=>9913,44831=>9914,44832=>9915,44833=>9916,44834=>9917,44835=>9918,44836=>9919,44837=>9920,44838=>9921,44839=>9922,44840=>9923,44841=>9924,44842=>9925,44843=>9926,44846=>9927,44847=>9928,44849=>9929,44851=>9930,44853=>9931,44854=>9932,44855=>9933,44856=>9934,44857=>9935,44858=>9936,44859=>9937,44862=>9938,44864=>9939,44868=>9940,44869=>9941,44870=>9942,44871=>9943,44874=>9944,44875=>9945,44876=>9946,44877=>9947,44878=>9948,44879=>9949,44881=>9950,44882=>9951,44883=>9952,44884=>9953,44885=>9954,44886=>9955,44887=>9956,44888=>9957,44889=>9958,44890=>9959,44891=>9960,44894=>9961,44895=>9962,44896=>9963,44897=>9964,44898=>9965,44899=>9966,44902=>9967,44903=>9968,44904=>9969,44905=>9970,44906=>9971,44907=>9972,44908=>9973,44909=>9974,44910=>9975,44911=>9976,44912=>9977,44913=>9978,44914=>9979,44915=>9980,44916=>9981,44917=>9982,44918=>9983,44919=>9984,44920=>9985,44922=>9986,44923=>9987,44924=>9988,44925=>9989,44926=>9990,44927=>9991,44929=>9992,44930=>9993,44931=>9994,44933=>9995,44934=>9996,44935=>9997,44937=>9998,44938=>9999,44939=>10000,44940=>10001,44941=>10002,44942=>10003,44943=>10004,44946=>10005,44947=>10006,44948=>10007,44950=>10008,44951=>10009,44952=>10010,44953=>10011,44954=>10012,44955=>10013,44957=>10014,44958=>10015,44959=>10016,44960=>10017,44961=>10018,44962=>10019,44963=>10020,44964=>10021,44965=>10022,44966=>10023,44967=>10024,44968=>10025,44969=>10026,44970=>10027,44971=>10028,44972=>10029,44973=>10030,44974=>10031,44975=>10032,44976=>10033,44977=>10034,44978=>10035,44979=>10036,44980=>10037,44981=>10038,44982=>10039,44983=>10040,44986=>10041,44987=>10042,44989=>10043,44990=>10044,44991=>10045,44993=>10046,44994=>10047,44995=>10048,44996=>10049,44997=>10050,44998=>10051,45002=>10052,45004=>10053,45007=>10054,45008=>10055,45009=>10056,45010=>10057,45011=>10058,45013=>10059,45014=>10060,45015=>10061,45016=>10062,45017=>10063,45018=>10064,45019=>10065,45021=>10066,45022=>10067,45023=>10068,45024=>10069,45025=>10070,45026=>10071,45027=>10072,45028=>10073,45029=>10074,45030=>10075,45031=>10076,45034=>10077,45035=>10078,45036=>10079,45037=>10080,45038=>10081,45039=>10082,45042=>10083,45043=>10084,45045=>10085,45046=>10086,45047=>10087,45049=>10088,45050=>10089,45051=>10090,45052=>10091,45053=>10092,45054=>10093,45055=>10094,45058=>10095,45059=>10096,45061=>10097,45062=>10098,45063=>10099,45064=>10100,45065=>10101,45066=>10102,45067=>10103,45069=>10104,45070=>10105,45071=>10106,45073=>10107,45074=>10108,45075=>10109,45077=>10110,45078=>10111,45079=>10112,45080=>10113,45081=>10114,45082=>10115,45083=>10116,45086=>10117,45087=>10118,45088=>10119,45089=>10120,45090=>10121,45091=>10122,45092=>10123,45093=>10124,45094=>10125,45095=>10126,45097=>10127,45098=>10128,45099=>10129,45100=>10130,45101=>10131,45102=>10132,45103=>10133,45104=>10134,45105=>10135,45106=>10136,45107=>10137,45108=>10138,45109=>10139,45110=>10140,45111=>10141,45112=>10142,45113=>10143,45114=>10144,45115=>10145,45116=>10146,45117=>10147,45118=>10148,45119=>10149,45120=>10150,45121=>10151,45122=>10152,45123=>10153,45126=>10154,45127=>10155,45129=>10156,45131=>10157,45133=>10158,45135=>10159,45136=>10160,45137=>10161,45138=>10162,45142=>10163,45144=>10164,45146=>10165,45147=>10166,45148=>10167,45150=>10168,45151=>10169,45152=>10170,45153=>10171,45154=>10172,45155=>10173,45156=>10174,45157=>10175,45158=>10176,45159=>10177,45160=>10178,45161=>10179,45162=>10180,45163=>10181,45164=>10182,45165=>10183,45166=>10184,45167=>10185,45168=>10186,45169=>10187,45170=>10188,45171=>10189,45172=>10190,45173=>10191,45174=>10192,45175=>10193,45176=>10194,45177=>10195,45178=>10196,45179=>10197,45182=>10198,45183=>10199,45185=>10200,45186=>10201,45187=>10202,45189=>10203,45190=>10204,45191=>10205,45192=>10206,45193=>10207,45194=>10208,45195=>10209,45198=>10210,45200=>10211,45202=>10212,45203=>10213,45204=>10214,45205=>10215,45206=>10216,45207=>10217,45211=>10218,45213=>10219,45214=>10220,45219=>10221,45220=>10222,45221=>10223,45222=>10224,45223=>10225,45226=>10226,45232=>10227,45234=>10228,45238=>10229,45239=>10230,45241=>10231,45242=>10232,45243=>10233,45245=>10234,45246=>10235,45247=>10236,45248=>10237,45249=>10238,45250=>10239,45251=>10240,45254=>10241,45258=>10242,45259=>10243,45260=>10244,45261=>10245,45262=>10246,45263=>10247,45266=>10248,45267=>10249,45269=>10250,45270=>10251,45271=>10252,45273=>10253,45274=>10254,45275=>10255,45276=>10256,45277=>10257,45278=>10258,45279=>10259,45281=>10260,45282=>10261,45283=>10262,45284=>10263,45286=>10264,45287=>10265,45288=>10266,45289=>10267,45290=>10268,45291=>10269,45292=>10270,45293=>10271,45294=>10272,45295=>10273,45296=>10274,45297=>10275,45298=>10276,45299=>10277,45300=>10278,45301=>10279,45302=>10280,45303=>10281,45304=>10282,45305=>10283,45306=>10284,45307=>10285,45308=>10286,45309=>10287,45310=>10288,45311=>10289,45312=>10290,45313=>10291,45314=>10292,45315=>10293,45316=>10294,45317=>10295,45318=>10296,45319=>10297,45322=>10298,45325=>10299,45326=>10300,45327=>10301,45329=>10302,45332=>10303,45333=>10304,45334=>10305,45335=>10306,45338=>10307,45342=>10308,45343=>10309,45344=>10310,45345=>10311,45346=>10312,45350=>10313,45351=>10314,45353=>10315,45354=>10316,45355=>10317,45357=>10318,45358=>10319,45359=>10320,45360=>10321,45361=>10322,45362=>10323,45363=>10324,45366=>10325,45370=>10326,45371=>10327,45372=>10328,45373=>10329,45374=>10330,45375=>10331,45378=>10332,45379=>10333,45381=>10334,45382=>10335,45383=>10336,45385=>10337,45386=>10338,45387=>10339,45388=>10340,45389=>10341,45390=>10342,45391=>10343,45394=>10344,45395=>10345,45398=>10346,45399=>10347,45401=>10348,45402=>10349,45403=>10350,45405=>10351,45406=>10352,45407=>10353,45409=>10354,45410=>10355,45411=>10356,45412=>10357,45413=>10358,45414=>10359,45415=>10360,45416=>10361,45417=>10362,45418=>10363,45419=>10364,45420=>10365,45421=>10366,45422=>10367,45423=>10368,45424=>10369,45425=>10370,45426=>10371,45427=>10372,45428=>10373,45429=>10374,45430=>10375,45431=>10376,45434=>10377,45435=>10378,45437=>10379,45438=>10380,45439=>10381,45441=>10382,45443=>10383,45444=>10384,45445=>10385,45446=>10386,45447=>10387,45450=>10388,45452=>10389,45454=>10390,45455=>10391,45456=>10392,45457=>10393,45461=>10394,45462=>10395,45463=>10396,45465=>10397,45466=>10398,45467=>10399,45469=>10400,45470=>10401,45471=>10402,45472=>10403,45473=>10404,45474=>10405,45475=>10406,45476=>10407,45477=>10408,45478=>10409,45479=>10410,45481=>10411,45482=>10412,45483=>10413,45484=>10414,45485=>10415,45486=>10416,45487=>10417,45488=>10418,45489=>10419,45490=>10420,45491=>10421,45492=>10422,45493=>10423,45494=>10424,45495=>10425,45496=>10426,45497=>10427,45498=>10428,45499=>10429,45500=>10430,45501=>10431,45502=>10432,45503=>10433,45504=>10434,45505=>10435,45506=>10436,45507=>10437,45508=>10438,45509=>10439,45510=>10440,45511=>10441,45512=>10442,45513=>10443,45514=>10444,45515=>10445,45517=>10446,45518=>10447,45519=>10448,45521=>10449,45522=>10450,45523=>10451,45525=>10452,45526=>10453,45527=>10454,45528=>10455,45529=>10456,45530=>10457,45531=>10458,45534=>10459,45536=>10460,45537=>10461,45538=>10462,45539=>10463,45540=>10464,45541=>10465,45542=>10466,45543=>10467,45546=>10468,45547=>10469,45549=>10470,45550=>10471,45551=>10472,45553=>10473,45554=>10474,45555=>10475,45556=>10476,45557=>10477,45558=>10478,45559=>10479,45560=>10480,45562=>10481,45564=>10482,45566=>10483,45567=>10484,45568=>10485,45569=>10486,45570=>10487,45571=>10488,45574=>10489,45575=>10490,45577=>10491,45578=>10492,45581=>10493,45582=>10494,45583=>10495,45584=>10496,45585=>10497,45586=>10498,45587=>10499,45590=>10500,45592=>10501,45594=>10502,45595=>10503,45596=>10504,45597=>10505,45598=>10506,45599=>10507,45601=>10508,45602=>10509,45603=>10510,45604=>10511,45605=>10512,45606=>10513,45607=>10514,45608=>10515,45609=>10516,45610=>10517,45611=>10518,45612=>10519,45613=>10520,45614=>10521,45615=>10522,45616=>10523,45617=>10524,45618=>10525,45619=>10526,45621=>10527,45622=>10528,45623=>10529,45624=>10530,45625=>10531,45626=>10532,45627=>10533,45629=>10534,45630=>10535,45631=>10536,45632=>10537,45633=>10538,45634=>10539,45635=>10540,45636=>10541,45637=>10542,45638=>10543,45639=>10544,45640=>10545,45641=>10546,45642=>10547,45643=>10548,45644=>10549,45645=>10550,45646=>10551,45647=>10552,45648=>10553,45649=>10554,45650=>10555,45651=>10556,45652=>10557,45653=>10558,45654=>10559,45655=>10560,45657=>10561,45658=>10562,45659=>10563,45661=>10564,45662=>10565,45663=>10566,45665=>10567,45666=>10568,45667=>10569,45668=>10570,45669=>10571,45670=>10572,45671=>10573,45674=>10574,45675=>10575,45676=>10576,45677=>10577,45678=>10578,45679=>10579,45680=>10580,45681=>10581,45682=>10582,45683=>10583,45686=>10584,45687=>10585,45688=>10586,45689=>10587,45690=>10588,45691=>10589,45693=>10590,45694=>10591,45695=>10592,45696=>10593,45697=>10594,45698=>10595,45699=>10596,45702=>10597,45703=>10598,45704=>10599,45706=>10600,45707=>10601,45708=>10602,45709=>10603,45710=>10604,45711=>10605,45714=>10606,45715=>10607,45717=>10608,45718=>10609,45719=>10610,45723=>10611,45724=>10612,45725=>10613,45726=>10614,45727=>10615,45730=>10616,45732=>10617,45735=>10618,45736=>10619,45737=>10620,45739=>10621,45741=>10622,45742=>10623,45743=>10624,45745=>10625,45746=>10626,45747=>10627,45749=>10628,45750=>10629,45751=>10630,45752=>10631,45753=>10632,45754=>10633,45755=>10634,45756=>10635,45757=>10636,45758=>10637,45759=>10638,45760=>10639,45761=>10640,45762=>10641,45763=>10642,45764=>10643,45765=>10644,45766=>10645,45767=>10646,45770=>10647,45771=>10648,45773=>10649,45774=>10650,45775=>10651,45777=>10652,45779=>10653,45780=>10654,45781=>10655,45782=>10656,45783=>10657,45786=>10658,45788=>10659,45790=>10660,45791=>10661,45792=>10662,45793=>10663,45795=>10664,45799=>10665,45801=>10666,45802=>10667,45808=>10668,45809=>10669,45810=>10670,45814=>10671,45820=>10672,45821=>10673,45822=>10674,45826=>10675,45827=>10676,45829=>10677,45830=>10678,45831=>10679,45833=>10680,45834=>10681,45835=>10682,45836=>10683,45837=>10684,45838=>10685,45839=>10686,45842=>10687,45846=>10688,45847=>10689,45848=>10690,45849=>10691,45850=>10692,45851=>10693,45853=>10694,45854=>10695,45855=>10696,45856=>10697,45857=>10698,45858=>10699,45859=>10700,45860=>10701,45861=>10702,45862=>10703,45863=>10704,45864=>10705,45865=>10706,45866=>10707,45867=>10708,45868=>10709,45869=>10710,45870=>10711,45871=>10712,45872=>10713,45873=>10714,45874=>10715,45875=>10716,45876=>10717,45877=>10718,45878=>10719,45879=>10720,45880=>10721,45881=>10722,45882=>10723,45883=>10724,45884=>10725,45885=>10726,45886=>10727,45887=>10728,45888=>10729,45889=>10730,45890=>10731,45891=>10732,45892=>10733,45893=>10734,45894=>10735,45895=>10736,45896=>10737,45897=>10738,45898=>10739,45899=>10740,45900=>10741,45901=>10742,45902=>10743,45903=>10744,45904=>10745,45905=>10746,45906=>10747,45907=>10748,45911=>10749,45913=>10750,45914=>10751,45917=>10752,45920=>10753,45921=>10754,45922=>10755,45923=>10756,45926=>10757,45928=>10758,45930=>10759,45932=>10760,45933=>10761,45935=>10762,45938=>10763,45939=>10764,45941=>10765,45942=>10766,45943=>10767,45945=>10768,45946=>10769,45947=>10770,45948=>10771,45949=>10772,45950=>10773,45951=>10774,45954=>10775,45958=>10776,45959=>10777,45960=>10778,45961=>10779,45962=>10780,45963=>10781,45965=>10782,45966=>10783,45967=>10784,45969=>10785,45970=>10786,45971=>10787,45973=>10788,45974=>10789,45975=>10790,45976=>10791,45977=>10792,45978=>10793,45979=>10794,45980=>10795,45981=>10796,45982=>10797,45983=>10798,45986=>10799,45987=>10800,45988=>10801,45989=>10802,45990=>10803,45991=>10804,45993=>10805,45994=>10806,45995=>10807,45997=>10808,45998=>10809,45999=>10810,46000=>10811,46001=>10812,46002=>10813,46003=>10814,46004=>10815,46005=>10816,46006=>10817,46007=>10818,46008=>10819,46009=>10820,46010=>10821,46011=>10822,46012=>10823,46013=>10824,46014=>10825,46015=>10826,46016=>10827,46017=>10828,46018=>10829,46019=>10830,46022=>10831,46023=>10832,46025=>10833,46026=>10834,46029=>10835,46031=>10836,46033=>10837,46034=>10838,46035=>10839,46038=>10840,46040=>10841,46042=>10842,46044=>10843,46046=>10844,46047=>10845,46049=>10846,46050=>10847,46051=>10848,46053=>10849,46054=>10850,46055=>10851,46057=>10852,46058=>10853,46059=>10854,46060=>10855,46061=>10856,46062=>10857,46063=>10858,46064=>10859,46065=>10860,46066=>10861,46067=>10862,46068=>10863,46069=>10864,46070=>10865,46071=>10866,46072=>10867,46073=>10868,46074=>10869,46075=>10870,46077=>10871,46078=>10872,46079=>10873,46080=>10874,46081=>10875,46082=>10876,46083=>10877,46084=>10878,46085=>10879,46086=>10880,46087=>10881,46088=>10882,46089=>10883,46090=>10884,46091=>10885,46092=>10886,46093=>10887,46094=>10888,46095=>10889,46097=>10890,46098=>10891,46099=>10892,46100=>10893,46101=>10894,46102=>10895,46103=>10896,46105=>10897,46106=>10898,46107=>10899,46109=>10900,46110=>10901,46111=>10902,46113=>10903,46114=>10904,46115=>10905,46116=>10906,46117=>10907,46118=>10908,46119=>10909,46122=>10910,46124=>10911,46125=>10912,46126=>10913,46127=>10914,46128=>10915,46129=>10916,46130=>10917,46131=>10918,46133=>10919,46134=>10920,46135=>10921,46136=>10922,46137=>10923,46138=>10924,46139=>10925,46140=>10926,46141=>10927,46142=>10928,46143=>10929,46144=>10930,46145=>10931,46146=>10932,46147=>10933,46148=>10934,46149=>10935,46150=>10936,46151=>10937,46152=>10938,46153=>10939,46154=>10940,46155=>10941,46156=>10942,46157=>10943,46158=>10944,46159=>10945,46162=>10946,46163=>10947,46165=>10948,46166=>10949,46167=>10950,46169=>10951,46170=>10952,46171=>10953,46172=>10954,46173=>10955,46174=>10956,46175=>10957,46178=>10958,46180=>10959,46182=>10960,46183=>10961,46184=>10962,46185=>10963,46186=>10964,46187=>10965,46189=>10966,46190=>10967,46191=>10968,46192=>10969,46193=>10970,46194=>10971,46195=>10972,46196=>10973,46197=>10974,46198=>10975,46199=>10976,46200=>10977,46201=>10978,46202=>10979,46203=>10980,46204=>10981,46205=>10982,46206=>10983,46207=>10984,46209=>10985,46210=>10986,46211=>10987,46212=>10988,46213=>10989,46214=>10990,46215=>10991,46217=>10992,46218=>10993,46219=>10994,46220=>10995,46221=>10996,46222=>10997,46223=>10998,46224=>10999,46225=>11000,46226=>11001,46227=>11002,46228=>11003,46229=>11004,46230=>11005,46231=>11006,46232=>11007,46233=>11008,46234=>11009,46235=>11010,46236=>11011,46238=>11012,46239=>11013,46240=>11014,46241=>11015,46242=>11016,46243=>11017,46245=>11018,46246=>11019,46247=>11020,46249=>11021,46250=>11022,46251=>11023,46253=>11024,46254=>11025,46255=>11026,46256=>11027,46257=>11028,46258=>11029,46259=>11030,46260=>11031,46262=>11032,46264=>11033,46266=>11034,46267=>11035,46268=>11036,46269=>11037,46270=>11038,46271=>11039,46273=>11040,46274=>11041,46275=>11042,46277=>11043,46278=>11044,46279=>11045,46281=>11046,46282=>11047,46283=>11048,46284=>11049,46285=>11050,46286=>11051,46287=>11052,46289=>11053,46290=>11054,46291=>11055,46292=>11056,46294=>11057,46295=>11058,46296=>11059,46297=>11060,46298=>11061,46299=>11062,46302=>11063,46303=>11064,46305=>11065,46306=>11066,46309=>11067,46311=>11068,46312=>11069,46313=>11070,46314=>11071,46315=>11072,46318=>11073,46320=>11074,46322=>11075,46323=>11076,46324=>11077,46325=>11078,46326=>11079,46327=>11080,46329=>11081,46330=>11082,46331=>11083,46332=>11084,46333=>11085,46334=>11086,46335=>11087,46336=>11088,46337=>11089,46338=>11090,46339=>11091,46340=>11092,46341=>11093,46342=>11094,46343=>11095,46344=>11096,46345=>11097,46346=>11098,46347=>11099,46348=>11100,46349=>11101,46350=>11102,46351=>11103,46352=>11104,46353=>11105,46354=>11106,46355=>11107,46358=>11108,46359=>11109,46361=>11110,46362=>11111,46365=>11112,46366=>11113,46367=>11114,46368=>11115,46369=>11116,46370=>11117,46371=>11118,46374=>11119,46379=>11120,46380=>11121,46381=>11122,46382=>11123,46383=>11124,46386=>11125,46387=>11126,46389=>11127,46390=>11128,46391=>11129,46393=>11130,46394=>11131,46395=>11132,46396=>11133,46397=>11134,46398=>11135,46399=>11136,46402=>11137,46406=>11138,46407=>11139,46408=>11140,46409=>11141,46410=>11142,46414=>11143,46415=>11144,46417=>11145,46418=>11146,46419=>11147,46421=>11148,46422=>11149,46423=>11150,46424=>11151,46425=>11152,46426=>11153,46427=>11154,46430=>11155,46434=>11156,46435=>11157,46436=>11158,46437=>11159,46438=>11160,46439=>11161,46440=>11162,46441=>11163,46442=>11164,46443=>11165,46444=>11166,46445=>11167,46446=>11168,46447=>11169,46448=>11170,46449=>11171,46450=>11172,46451=>11173,46452=>11174,46453=>11175,46454=>11176,46455=>11177,46456=>11178,46457=>11179,46458=>11180,46459=>11181,46460=>11182,46461=>11183,46462=>11184,46463=>11185,46464=>11186,46465=>11187,46466=>11188,46467=>11189,46468=>11190,46469=>11191,46470=>11192,46471=>11193,46472=>11194,46473=>11195,46474=>11196,46475=>11197,46476=>11198,46477=>11199,46478=>11200,46479=>11201,46480=>11202,46481=>11203,46482=>11204,46483=>11205,46484=>11206,46485=>11207,46486=>11208,46487=>11209,46488=>11210,46489=>11211,46490=>11212,46491=>11213,46492=>11214,46493=>11215,46494=>11216,46495=>11217,46498=>11218,46499=>11219,46501=>11220,46502=>11221,46503=>11222,46505=>11223,46508=>11224,46509=>11225,46510=>11226,46511=>11227,46514=>11228,46518=>11229,46519=>11230,46520=>11231,46521=>11232,46522=>11233,46526=>11234,46527=>11235,46529=>11236,46530=>11237,46531=>11238,46533=>11239,46534=>11240,46535=>11241,46536=>11242,46537=>11243,46538=>11244,46539=>11245,46542=>11246,46546=>11247,46547=>11248,46548=>11249,46549=>11250,46550=>11251,46551=>11252,46553=>11253,46554=>11254,46555=>11255,46556=>11256,46557=>11257,46558=>11258,46559=>11259,46560=>11260,46561=>11261,46562=>11262,46563=>11263,46564=>11264,46565=>11265,46566=>11266,46567=>11267,46568=>11268,46569=>11269,46570=>11270,46571=>11271,46573=>11272,46574=>11273,46575=>11274,46576=>11275,46577=>11276,46578=>11277,46579=>11278,46580=>11279,46581=>11280,46582=>11281,46583=>11282,46584=>11283,46585=>11284,46586=>11285,46587=>11286,46588=>11287,46589=>11288,46590=>11289,46591=>11290,46592=>11291,46593=>11292,46594=>11293,46595=>11294,46596=>11295,46597=>11296,46598=>11297,46599=>11298,46600=>11299,46601=>11300,46602=>11301,46603=>11302,46604=>11303,46605=>11304,46606=>11305,46607=>11306,46610=>11307,46611=>11308,46613=>11309,46614=>11310,46615=>11311,46617=>11312,46618=>11313,46619=>11314,46620=>11315,46621=>11316,46622=>11317,46623=>11318,46624=>11319,46625=>11320,46626=>11321,46627=>11322,46628=>11323,46630=>11324,46631=>11325,46632=>11326,46633=>11327,46634=>11328,46635=>11329,46637=>11330,46638=>11331,46639=>11332,46640=>11333,46641=>11334,46642=>11335,46643=>11336,46645=>11337,46646=>11338,46647=>11339,46648=>11340,46649=>11341,46650=>11342,46651=>11343,46652=>11344,46653=>11345,46654=>11346,46655=>11347,46656=>11348,46657=>11349,46658=>11350,46659=>11351,46660=>11352,46661=>11353,46662=>11354,46663=>11355,46665=>11356,46666=>11357,46667=>11358,46668=>11359,46669=>11360,46670=>11361,46671=>11362,46672=>11363,46673=>11364,46674=>11365,46675=>11366,46676=>11367,46677=>11368,46678=>11369,46679=>11370,46680=>11371,46681=>11372,46682=>11373,46683=>11374,46684=>11375,46685=>11376,46686=>11377,46687=>11378,46688=>11379,46689=>11380,46690=>11381,46691=>11382,46693=>11383,46694=>11384,46695=>11385,46697=>11386,46698=>11387,46699=>11388,46700=>11389,46701=>11390,46702=>11391,46703=>11392,46704=>11393,46705=>11394,46706=>11395,46707=>11396,46708=>11397,46709=>11398,46710=>11399,46711=>11400,46712=>11401,46713=>11402,46714=>11403,46715=>11404,46716=>11405,46717=>11406,46718=>11407,46719=>11408,46720=>11409,46721=>11410,46722=>11411,46723=>11412,46724=>11413,46725=>11414,46726=>11415,46727=>11416,46728=>11417,46729=>11418,46730=>11419,46731=>11420,46732=>11421,46733=>11422,46734=>11423,46735=>11424,46736=>11425,46737=>11426,46738=>11427,46739=>11428,46740=>11429,46741=>11430,46742=>11431,46743=>11432,46744=>11433,46745=>11434,46746=>11435,46747=>11436,46750=>11437,46751=>11438,46753=>11439,46754=>11440,46755=>11441,46757=>11442,46758=>11443,46759=>11444,46760=>11445,46761=>11446,46762=>11447,46765=>11448,46766=>11449,46767=>11450,46768=>11451,46770=>11452,46771=>11453,46772=>11454,46773=>11455,46774=>11456,46775=>11457,46776=>11458,46777=>11459,46778=>11460,46779=>11461,46780=>11462,46781=>11463,46782=>11464,46783=>11465,46784=>11466,46785=>11467,46786=>11468,46787=>11469,46788=>11470,46789=>11471,46790=>11472,46791=>11473,46792=>11474,46793=>11475,46794=>11476,46795=>11477,46796=>11478,46797=>11479,46798=>11480,46799=>11481,46800=>11482,46801=>11483,46802=>11484,46803=>11485,46805=>11486,46806=>11487,46807=>11488,46808=>11489,46809=>11490,46810=>11491,46811=>11492,46812=>11493,46813=>11494,46814=>11495,46815=>11496,46816=>11497,46817=>11498,46818=>11499,46819=>11500,46820=>11501,46821=>11502,46822=>11503,46823=>11504,46824=>11505,46825=>11506,46826=>11507,46827=>11508,46828=>11509,46829=>11510,46830=>11511,46831=>11512,46833=>11513,46834=>11514,46835=>11515,46837=>11516,46838=>11517,46839=>11518,46841=>11519,46842=>11520,46843=>11521,46844=>11522,46845=>11523,46846=>11524,46847=>11525,46850=>11526,46851=>11527,46852=>11528,46854=>11529,46855=>11530,46856=>11531,46857=>11532,46858=>11533,46859=>11534,46860=>11535,46861=>11536,46862=>11537,46863=>11538,46864=>11539,46865=>11540,46866=>11541,46867=>11542,46868=>11543,46869=>11544,46870=>11545,46871=>11546,46872=>11547,46873=>11548,46874=>11549,46875=>11550,46876=>11551,46877=>11552,46878=>11553,46879=>11554,46880=>11555,46881=>11556,46882=>11557,46883=>11558,46884=>11559,46885=>11560,46886=>11561,46887=>11562,46890=>11563,46891=>11564,46893=>11565,46894=>11566,46897=>11567,46898=>11568,46899=>11569,46900=>11570,46901=>11571,46902=>11572,46903=>11573,46906=>11574,46908=>11575,46909=>11576,46910=>11577,46911=>11578,46912=>11579,46913=>11580,46914=>11581,46915=>11582,46917=>11583,46918=>11584,46919=>11585,46921=>11586,46922=>11587,46923=>11588,46925=>11589,46926=>11590,46927=>11591,46928=>11592,46929=>11593,46930=>11594,46931=>11595,46934=>11596,46935=>11597,46936=>11598,46937=>11599,46938=>11600,46939=>11601,46940=>11602,46941=>11603,46942=>11604,46943=>11605,46945=>11606,46946=>11607,46947=>11608,46949=>11609,46950=>11610,46951=>11611,46953=>11612,46954=>11613,46955=>11614,46956=>11615,46957=>11616,46958=>11617,46959=>11618,46962=>11619,46964=>11620,46966=>11621,46967=>11622,46968=>11623,46969=>11624,46970=>11625,46971=>11626,46974=>11627,46975=>11628,46977=>11629,46978=>11630,46979=>11631,46981=>11632,46982=>11633,46983=>11634,46984=>11635,46985=>11636,46986=>11637,46987=>11638,46990=>11639,46995=>11640,46996=>11641,46997=>11642,47002=>11643,47003=>11644,47005=>11645,47006=>11646,47007=>11647,47009=>11648,47010=>11649,47011=>11650,47012=>11651,47013=>11652,47014=>11653,47015=>11654,47018=>11655,47022=>11656,47023=>11657,47024=>11658,47025=>11659,47026=>11660,47027=>11661,47030=>11662,47031=>11663,47033=>11664,47034=>11665,47035=>11666,47036=>11667,47037=>11668,47038=>11669,47039=>11670,47040=>11671,47041=>11672,47042=>11673,47043=>11674,47044=>11675,47045=>11676,47046=>11677,47048=>11678,47050=>11679,47051=>11680,47052=>11681,47053=>11682,47054=>11683,47055=>11684,47056=>11685,47057=>11686,47058=>11687,47059=>11688,47060=>11689,47061=>11690,47062=>11691,47063=>11692,47064=>11693,47065=>11694,47066=>11695,47067=>11696,47068=>11697,47069=>11698,47070=>11699,47071=>11700,47072=>11701,47073=>11702,47074=>11703,47075=>11704,47076=>11705,47077=>11706,47078=>11707,47079=>11708,47080=>11709,47081=>11710,47082=>11711,47083=>11712,47086=>11713,47087=>11714,47089=>11715,47090=>11716,47091=>11717,47093=>11718,47094=>11719,47095=>11720,47096=>11721,47097=>11722,47098=>11723,47099=>11724,47102=>11725,47106=>11726,47107=>11727,47108=>11728,47109=>11729,47110=>11730,47114=>11731,47115=>11732,47117=>11733,47118=>11734,47119=>11735,47121=>11736,47122=>11737,47123=>11738,47124=>11739,47125=>11740,47126=>11741,47127=>11742,47130=>11743,47132=>11744,47134=>11745,47135=>11746,47136=>11747,47137=>11748,47138=>11749,47139=>11750,47142=>11751,47143=>11752,47145=>11753,47146=>11754,47147=>11755,47149=>11756,47150=>11757,47151=>11758,47152=>11759,47153=>11760,47154=>11761,47155=>11762,47158=>11763,47162=>11764,47163=>11765,47164=>11766,47165=>11767,47166=>11768,47167=>11769,47169=>11770,47170=>11771,47171=>11772,47173=>11773,47174=>11774,47175=>11775,47176=>11776,47177=>11777,47178=>11778,47179=>11779,47180=>11780,47181=>11781,47182=>11782,47183=>11783,47184=>11784,47186=>11785,47188=>11786,47189=>11787,47190=>11788,47191=>11789,47192=>11790,47193=>11791,47194=>11792,47195=>11793,47198=>11794,47199=>11795,47201=>11796,47202=>11797,47203=>11798,47205=>11799,47206=>11800,47207=>11801,47208=>11802,47209=>11803,47210=>11804,47211=>11805,47214=>11806,47216=>11807,47218=>11808,47219=>11809,47220=>11810,47221=>11811,47222=>11812,47223=>11813,47225=>11814,47226=>11815,47227=>11816,47229=>11817,47230=>11818,47231=>11819,47232=>11820,47233=>11821,47234=>11822,47235=>11823,47236=>11824,47237=>11825,47238=>11826,47239=>11827,47240=>11828,47241=>11829,47242=>11830,47243=>11831,47244=>11832,47246=>11833,47247=>11834,47248=>11835,47249=>11836,47250=>11837,47251=>11838,47252=>11839,47253=>11840,47254=>11841,47255=>11842,47256=>11843,47257=>11844,47258=>11845,47259=>11846,47260=>11847,47261=>11848,47262=>11849,47263=>11850,47264=>11851,47265=>11852,47266=>11853,47267=>11854,47268=>11855,47269=>11856,47270=>11857,47271=>11858,47273=>11859,47274=>11860,47275=>11861,47276=>11862,47277=>11863,47278=>11864,47279=>11865,47281=>11866,47282=>11867,47283=>11868,47285=>11869,47286=>11870,47287=>11871,47289=>11872,47290=>11873,47291=>11874,47292=>11875,47293=>11876,47294=>11877,47295=>11878,47298=>11879,47300=>11880,47302=>11881,47303=>11882,47304=>11883,47305=>11884,47306=>11885,47307=>11886,47309=>11887,47310=>11888,47311=>11889,47313=>11890,47314=>11891,47315=>11892,47317=>11893,47318=>11894,47319=>11895,47320=>11896,47321=>11897,47322=>11898,47323=>11899,47324=>11900,47326=>11901,47328=>11902,47330=>11903,47331=>11904,47332=>11905,47333=>11906,47334=>11907,47335=>11908,47338=>11909,47339=>11910,47341=>11911,47342=>11912,47343=>11913,47345=>11914,47346=>11915,47347=>11916,47348=>11917,47349=>11918,47350=>11919,47351=>11920,47354=>11921,47356=>11922,47358=>11923,47359=>11924,47360=>11925,47361=>11926,47362=>11927,47363=>11928,47365=>11929,47366=>11930,47367=>11931,47368=>11932,47369=>11933,47370=>11934,47371=>11935,47372=>11936,47373=>11937,47374=>11938,47375=>11939,47376=>11940,47377=>11941,47378=>11942,47379=>11943,47380=>11944,47381=>11945,47382=>11946,47383=>11947,47385=>11948,47386=>11949,47387=>11950,47388=>11951,47389=>11952,47390=>11953,47391=>11954,47393=>11955,47394=>11956,47395=>11957,47396=>11958,47397=>11959,47398=>11960,47399=>11961,47400=>11962,47401=>11963,47402=>11964,47403=>11965,47404=>11966,47405=>11967,47406=>11968,47407=>11969,47408=>11970,47409=>11971,47410=>11972,47411=>11973,47412=>11974,47413=>11975,47414=>11976,47415=>11977,47416=>11978,47417=>11979,47418=>11980,47419=>11981,47422=>11982,47423=>11983,47425=>11984,47426=>11985,47427=>11986,47429=>11987,47430=>11988,47431=>11989,47432=>11990,47433=>11991,47434=>11992,47435=>11993,47437=>11994,47438=>11995,47440=>11996,47442=>11997,47443=>11998,47444=>11999,47445=>12000,47446=>12001,47447=>12002,47450=>12003,47451=>12004,47453=>12005,47454=>12006,47455=>12007,47457=>12008,47458=>12009,47459=>12010,47460=>12011,47461=>12012,47462=>12013,47463=>12014,47466=>12015,47468=>12016,47470=>12017,47471=>12018,47472=>12019,47473=>12020,47474=>12021,47475=>12022,47478=>12023,47479=>12024,47481=>12025,47482=>12026,47483=>12027,47485=>12028,47486=>12029,47487=>12030,47488=>12031,47489=>12032,47490=>12033,47491=>12034,47494=>12035,47496=>12036,47499=>12037,47500=>12038,47503=>12039,47504=>12040,47505=>12041,47506=>12042,47507=>12043,47508=>12044,47509=>12045,47510=>12046,47511=>12047,47512=>12048,47513=>12049,47514=>12050,47515=>12051,47516=>12052,47517=>12053,47518=>12054,47519=>12055,47520=>12056,47521=>12057,47522=>12058,47523=>12059,47524=>12060,47525=>12061,47526=>12062,47527=>12063,47528=>12064,47529=>12065,47530=>12066,47531=>12067,47534=>12068,47535=>12069,47537=>12070,47538=>12071,47539=>12072,47541=>12073,47542=>12074,47543=>12075,47544=>12076,47545=>12077,47546=>12078,47547=>12079,47550=>12080,47552=>12081,47554=>12082,47555=>12083,47556=>12084,47557=>12085,47558=>12086,47559=>12087,47562=>12088,47563=>12089,47565=>12090,47571=>12091,47572=>12092,47573=>12093,47574=>12094,47575=>12095,47578=>12096,47580=>12097,47583=>12098,47584=>12099,47586=>12100,47590=>12101,47591=>12102,47593=>12103,47594=>12104,47595=>12105,47597=>12106,47598=>12107,47599=>12108,47600=>12109,47601=>12110,47602=>12111,47603=>12112,47606=>12113,47611=>12114,47612=>12115,47613=>12116,47614=>12117,47615=>12118,47618=>12119,47619=>12120,47620=>12121,47621=>12122,47622=>12123,47623=>12124,47625=>12125,47626=>12126,47627=>12127,47628=>12128,47629=>12129,47630=>12130,47631=>12131,47632=>12132,47633=>12133,47634=>12134,47635=>12135,47636=>12136,47638=>12137,47639=>12138,47640=>12139,47641=>12140,47642=>12141,47643=>12142,47644=>12143,47645=>12144,47646=>12145,47647=>12146,47648=>12147,47649=>12148,47650=>12149,47651=>12150,47652=>12151,47653=>12152,47654=>12153,47655=>12154,47656=>12155,47657=>12156,47658=>12157,47659=>12158,47660=>12159,47661=>12160,47662=>12161,47663=>12162,47664=>12163,47665=>12164,47666=>12165,47667=>12166,47668=>12167,47669=>12168,47670=>12169,47671=>12170,47674=>12171,47675=>12172,47677=>12173,47678=>12174,47679=>12175,47681=>12176,47683=>12177,47684=>12178,47685=>12179,47686=>12180,47687=>12181,47690=>12182,47692=>12183,47695=>12184,47696=>12185,47697=>12186,47698=>12187,47702=>12188,47703=>12189,47705=>12190,47706=>12191,47707=>12192,47709=>12193,47710=>12194,47711=>12195,47712=>12196,47713=>12197,47714=>12198,47715=>12199,47718=>12200,47722=>12201,47723=>12202,47724=>12203,47725=>12204,47726=>12205,47727=>12206,47730=>12207,47731=>12208,47733=>12209,47734=>12210,47735=>12211,47737=>12212,47738=>12213,47739=>12214,47740=>12215,47741=>12216,47742=>12217,47743=>12218,47744=>12219,47745=>12220,47746=>12221,47750=>12222,47752=>12223,47753=>12224,47754=>12225,47755=>12226,47757=>12227,47758=>12228,47759=>12229,47760=>12230,47761=>12231,47762=>12232,47763=>12233,47764=>12234,47765=>12235,47766=>12236,47767=>12237,47768=>12238,47769=>12239,47770=>12240,47771=>12241,47772=>12242,47773=>12243,47774=>12244,47775=>12245,47776=>12246,47777=>12247,47778=>12248,47779=>12249,47780=>12250,47781=>12251,47782=>12252,47783=>12253,47786=>12254,47789=>12255,47790=>12256,47791=>12257,47793=>12258,47795=>12259,47796=>12260,47797=>12261,47798=>12262,47799=>12263,47802=>12264,47804=>12265,47806=>12266,47807=>12267,47808=>12268,47809=>12269,47810=>12270,47811=>12271,47813=>12272,47814=>12273,47815=>12274,47817=>12275,47818=>12276,47819=>12277,47820=>12278,47821=>12279,47822=>12280,47823=>12281,47824=>12282,47825=>12283,47826=>12284,47827=>12285,47828=>12286,47829=>12287,47830=>12288,47831=>12289,47834=>12290,47835=>12291,47836=>12292,47837=>12293,47838=>12294,47839=>12295,47840=>12296,47841=>12297,47842=>12298,47843=>12299,47844=>12300,47845=>12301,47846=>12302,47847=>12303,47848=>12304,47849=>12305,47850=>12306,47851=>12307,47852=>12308,47853=>12309,47854=>12310,47855=>12311,47856=>12312,47857=>12313,47858=>12314,47859=>12315,47860=>12316,47861=>12317,47862=>12318,47863=>12319,47864=>12320,47865=>12321,47866=>12322,47867=>12323,47869=>12324,47870=>12325,47871=>12326,47873=>12327,47874=>12328,47875=>12329,47877=>12330,47878=>12331,47879=>12332,47880=>12333,47881=>12334,47882=>12335,47883=>12336,47884=>12337,47886=>12338,47888=>12339,47890=>12340,47891=>12341,47892=>12342,47893=>12343,47894=>12344,47895=>12345,47897=>12346,47898=>12347,47899=>12348,47901=>12349,47902=>12350,47903=>12351,47905=>12352,47906=>12353,47907=>12354,47908=>12355,47909=>12356,47910=>12357,47911=>12358,47912=>12359,47914=>12360,47916=>12361,47917=>12362,47918=>12363,47919=>12364,47920=>12365,47921=>12366,47922=>12367,47923=>12368,47927=>12369,47929=>12370,47930=>12371,47935=>12372,47936=>12373,47937=>12374,47938=>12375,47939=>12376,47942=>12377,47944=>12378,47946=>12379,47947=>12380,47948=>12381,47950=>12382,47953=>12383,47954=>12384,47955=>12385,47957=>12386,47958=>12387,47959=>12388,47961=>12389,47962=>12390,47963=>12391,47964=>12392,47965=>12393,47966=>12394,47967=>12395,47968=>12396,47970=>12397,47972=>12398,47973=>12399,47974=>12400,47975=>12401,47976=>12402,47977=>12403,47978=>12404,47979=>12405,47981=>12406,47982=>12407,47983=>12408,47984=>12409,47985=>12410,47986=>12411,47987=>12412,47988=>12413,47989=>12414,47990=>12415,47991=>12416,47992=>12417,47993=>12418,47994=>12419,47995=>12420,47996=>12421,47997=>12422,47998=>12423,47999=>12424,48000=>12425,48001=>12426,48002=>12427,48003=>12428,48004=>12429,48005=>12430,48006=>12431,48007=>12432,48009=>12433,48010=>12434,48011=>12435,48013=>12436,48014=>12437,48015=>12438,48017=>12439,48018=>12440,48019=>12441,48020=>12442,48021=>12443,48022=>12444,48023=>12445,48024=>12446,48025=>12447,48026=>12448,48027=>12449,48028=>12450,48029=>12451,48030=>12452,48031=>12453,48032=>12454,48033=>12455,48034=>12456,48035=>12457,48037=>12458,48038=>12459,48039=>12460,48041=>12461,48042=>12462,48043=>12463,48045=>12464,48046=>12465,48047=>12466,48048=>12467,48049=>12468,48050=>12469,48051=>12470,48053=>12471,48054=>12472,48056=>12473,48057=>12474,48058=>12475,48059=>12476,48060=>12477,48061=>12478,48062=>12479,48063=>12480,48065=>12481,48066=>12482,48067=>12483,48069=>12484,48070=>12485,48071=>12486,48073=>12487,48074=>12488,48075=>12489,48076=>12490,48077=>12491,48078=>12492,48079=>12493,48081=>12494,48082=>12495,48084=>12496,48085=>12497,48086=>12498,48087=>12499,48088=>12500,48089=>12501,48090=>12502,48091=>12503,48092=>12504,48093=>12505,48094=>12506,48095=>12507,48096=>12508,48097=>12509,48098=>12510,48099=>12511,48100=>12512,48101=>12513,48102=>12514,48103=>12515,48104=>12516,48105=>12517,48106=>12518,48107=>12519,48108=>12520,48109=>12521,48110=>12522,48111=>12523,48112=>12524,48113=>12525,48114=>12526,48115=>12527,48116=>12528,48117=>12529,48118=>12530,48119=>12531,48122=>12532,48123=>12533,48125=>12534,48126=>12535,48129=>12536,48131=>12537,48132=>12538,48133=>12539,48134=>12540,48135=>12541,48138=>12542,48142=>12543,48144=>12544,48146=>12545,48147=>12546,48153=>12547,48154=>12548,48160=>12549,48161=>12550,48162=>12551,48163=>12552,48166=>12553,48168=>12554,48170=>12555,48171=>12556,48172=>12557,48174=>12558,48175=>12559,48178=>12560,48179=>12561,48181=>12562,48182=>12563,48183=>12564,48185=>12565,48186=>12566,48187=>12567,48188=>12568,48189=>12569,48190=>12570,48191=>12571,48194=>12572,48198=>12573,48199=>12574,48200=>12575,48202=>12576,48203=>12577,48206=>12578,48207=>12579,48209=>12580,48210=>12581,48211=>12582,48212=>12583,48213=>12584,48214=>12585,48215=>12586,48216=>12587,48217=>12588,48218=>12589,48219=>12590,48220=>12591,48222=>12592,48223=>12593,48224=>12594,48225=>12595,48226=>12596,48227=>12597,48228=>12598,48229=>12599,48230=>12600,48231=>12601,48232=>12602,48233=>12603,48234=>12604,48235=>12605,48236=>12606,48237=>12607,48238=>12608,48239=>12609,48240=>12610,48241=>12611,48242=>12612,48243=>12613,48244=>12614,48245=>12615,48246=>12616,48247=>12617,48248=>12618,48249=>12619,48250=>12620,48251=>12621,48252=>12622,48253=>12623,48254=>12624,48255=>12625,48256=>12626,48257=>12627,48258=>12628,48259=>12629,48262=>12630,48263=>12631,48265=>12632,48266=>12633,48269=>12634,48271=>12635,48272=>12636,48273=>12637,48274=>12638,48275=>12639,48278=>12640,48280=>12641,48283=>12642,48284=>12643,48285=>12644,48286=>12645,48287=>12646,48290=>12647,48291=>12648,48293=>12649,48294=>12650,48297=>12651,48298=>12652,48299=>12653,48300=>12654,48301=>12655,48302=>12656,48303=>12657,48306=>12658,48310=>12659,48311=>12660,48312=>12661,48313=>12662,48314=>12663,48315=>12664,48318=>12665,48319=>12666,48321=>12667,48322=>12668,48323=>12669,48325=>12670,48326=>12671,48327=>12672,48328=>12673,48329=>12674,48330=>12675,48331=>12676,48332=>12677,48334=>12678,48338=>12679,48339=>12680,48340=>12681,48342=>12682,48343=>12683,48345=>12684,48346=>12685,48347=>12686,48349=>12687,48350=>12688,48351=>12689,48352=>12690,48353=>12691,48354=>12692,48355=>12693,48356=>12694,48357=>12695,48358=>12696,48359=>12697,48360=>12698,48361=>12699,48362=>12700,48363=>12701,48364=>12702,48365=>12703,48366=>12704,48367=>12705,48368=>12706,48369=>12707,48370=>12708,48371=>12709,48375=>12710,48377=>12711,48378=>12712,48379=>12713,48381=>12714,48382=>12715,48383=>12716,48384=>12717,48385=>12718,48386=>12719,48387=>12720,48390=>12721,48392=>12722,48394=>12723,48395=>12724,48396=>12725,48397=>12726,48398=>12727,48399=>12728,48401=>12729,48402=>12730,48403=>12731,48405=>12732,48406=>12733,48407=>12734,48408=>12735,48409=>12736,48410=>12737,48411=>12738,48412=>12739,48413=>12740,48414=>12741,48415=>12742,48416=>12743,48417=>12744,48418=>12745,48419=>12746,48421=>12747,48422=>12748,48423=>12749,48424=>12750,48425=>12751,48426=>12752,48427=>12753,48429=>12754,48430=>12755,48431=>12756,48432=>12757,48433=>12758,48434=>12759,48435=>12760,48436=>12761,48437=>12762,48438=>12763,48439=>12764,48440=>12765,48441=>12766,48442=>12767,48443=>12768,48444=>12769,48445=>12770,48446=>12771,48447=>12772,48449=>12773,48450=>12774,48451=>12775,48452=>12776,48453=>12777,48454=>12778,48455=>12779,48458=>12780,48459=>12781,48461=>12782,48462=>12783,48463=>12784,48465=>12785,48466=>12786,48467=>12787,48468=>12788,48469=>12789,48470=>12790,48471=>12791,48474=>12792,48475=>12793,48476=>12794,48477=>12795,48478=>12796,48479=>12797,48480=>12798,48481=>12799,48482=>12800,48483=>12801,48485=>12802,48486=>12803,48487=>12804,48489=>12805,48490=>12806,48491=>12807,48492=>12808,48493=>12809,48494=>12810,48495=>12811,48496=>12812,48497=>12813,48498=>12814,48499=>12815,48500=>12816,48501=>12817,48502=>12818,48503=>12819,48504=>12820,48505=>12821,48506=>12822,48507=>12823,48508=>12824,48509=>12825,48510=>12826,48511=>12827,48514=>12828,48515=>12829,48517=>12830,48518=>12831,48523=>12832,48524=>12833,48525=>12834,48526=>12835,48527=>12836,48530=>12837,48532=>12838,48534=>12839,48535=>12840,48536=>12841,48539=>12842,48541=>12843,48542=>12844,48543=>12845,48544=>12846,48545=>12847,48546=>12848,48547=>12849,48549=>12850,48550=>12851,48551=>12852,48552=>12853,48553=>12854,48554=>12855,48555=>12856,48556=>12857,48557=>12858,48558=>12859,48559=>12860,48561=>12861,48562=>12862,48563=>12863,48564=>12864,48565=>12865,48566=>12866,48567=>12867,48569=>12868,48570=>12869,48571=>12870,48572=>12871,48573=>12872,48574=>12873,48575=>12874,48576=>12875,48577=>12876,48578=>12877,48579=>12878,48580=>12879,48581=>12880,48582=>12881,48583=>12882,48584=>12883,48585=>12884,48586=>12885,48587=>12886,48588=>12887,48589=>12888,48590=>12889,48591=>12890,48592=>12891,48593=>12892,48594=>12893,48595=>12894,48598=>12895,48599=>12896,48601=>12897,48602=>12898,48603=>12899,48605=>12900,48606=>12901,48607=>12902,48608=>12903,48609=>12904,48610=>12905,48611=>12906,48612=>12907,48613=>12908,48614=>12909,48615=>12910,48616=>12911,48618=>12912,48619=>12913,48620=>12914,48621=>12915,48622=>12916,48623=>12917,48625=>12918,48626=>12919,48627=>12920,48629=>12921,48630=>12922,48631=>12923,48633=>12924,48634=>12925,48635=>12926,48636=>12927,48637=>12928,48638=>12929,48639=>12930,48641=>12931,48642=>12932,48644=>12933,48646=>12934,48647=>12935,48648=>12936,48649=>12937,48650=>12938,48651=>12939,48654=>12940,48655=>12941,48657=>12942,48658=>12943,48659=>12944,48661=>12945,48662=>12946,48663=>12947,48664=>12948,48665=>12949,48666=>12950,48667=>12951,48670=>12952,48672=>12953,48673=>12954,48674=>12955,48675=>12956,48676=>12957,48677=>12958,48678=>12959,48679=>12960,48680=>12961,48681=>12962,48682=>12963,48683=>12964,48684=>12965,48685=>12966,48686=>12967,48687=>12968,48688=>12969,48689=>12970,48690=>12971,48691=>12972,48692=>12973,48693=>12974,48694=>12975,48695=>12976,48696=>12977,48697=>12978,48698=>12979,48699=>12980,48700=>12981,48701=>12982,48702=>12983,48703=>12984,48704=>12985,48705=>12986,48706=>12987,48707=>12988,48710=>12989,48711=>12990,48713=>12991,48714=>12992,48715=>12993,48717=>12994,48719=>12995,48720=>12996,48721=>12997,48722=>12998,48723=>12999,48726=>13000,48728=>13001,48732=>13002,48733=>13003,48734=>13004,48735=>13005,48738=>13006,48739=>13007,48741=>13008,48742=>13009,48743=>13010,48745=>13011,48747=>13012,48748=>13013,48749=>13014,48750=>13015,48751=>13016,48754=>13017,48758=>13018,48759=>13019,48760=>13020,48761=>13021,48762=>13022,48766=>13023,48767=>13024,48769=>13025,48770=>13026,48771=>13027,48773=>13028,48774=>13029,48775=>13030,48776=>13031,48777=>13032,48778=>13033,48779=>13034,48782=>13035,48786=>13036,48787=>13037,48788=>13038,48789=>13039,48790=>13040,48791=>13041,48794=>13042,48795=>13043,48796=>13044,48797=>13045,48798=>13046,48799=>13047,48800=>13048,48801=>13049,48802=>13050,48803=>13051,48804=>13052,48805=>13053,48806=>13054,48807=>13055,48809=>13056,48810=>13057,48811=>13058,48812=>13059,48813=>13060,48814=>13061,48815=>13062,48816=>13063,48817=>13064,48818=>13065,48819=>13066,48820=>13067,48821=>13068,48822=>13069,48823=>13070,48824=>13071,48825=>13072,48826=>13073,48827=>13074,48828=>13075,48829=>13076,48830=>13077,48831=>13078,48832=>13079,48833=>13080,48834=>13081,48835=>13082,48836=>13083,48837=>13084,48838=>13085,48839=>13086,48840=>13087,48841=>13088,48842=>13089,48843=>13090,48844=>13091,48845=>13092,48846=>13093,48847=>13094,48850=>13095,48851=>13096,48853=>13097,48854=>13098,48857=>13099,48858=>13100,48859=>13101,48860=>13102,48861=>13103,48862=>13104,48863=>13105,48865=>13106,48866=>13107,48870=>13108,48871=>13109,48872=>13110,48873=>13111,48874=>13112,48875=>13113,48877=>13114,48878=>13115,48879=>13116,48880=>13117,48881=>13118,48882=>13119,48883=>13120,48884=>13121,48885=>13122,48886=>13123,48887=>13124,48888=>13125,48889=>13126,48890=>13127,48891=>13128,48892=>13129,48893=>13130,48894=>13131,48895=>13132,48896=>13133,48898=>13134,48899=>13135,48900=>13136,48901=>13137,48902=>13138,48903=>13139,48906=>13140,48907=>13141,48908=>13142,48909=>13143,48910=>13144,48911=>13145,48912=>13146,48913=>13147,48914=>13148,48915=>13149,48916=>13150,48917=>13151,48918=>13152,48919=>13153,48922=>13154,48926=>13155,48927=>13156,48928=>13157,48929=>13158,48930=>13159,48931=>13160,48932=>13161,48933=>13162,48934=>13163,48935=>13164,48936=>13165,48937=>13166,48938=>13167,48939=>13168,48940=>13169,48941=>13170,48942=>13171,48943=>13172,48944=>13173,48945=>13174,48946=>13175,48947=>13176,48948=>13177,48949=>13178,48950=>13179,48951=>13180,48952=>13181,48953=>13182,48954=>13183,48955=>13184,48956=>13185,48957=>13186,48958=>13187,48959=>13188,48962=>13189,48963=>13190,48965=>13191,48966=>13192,48967=>13193,48969=>13194,48970=>13195,48971=>13196,48972=>13197,48973=>13198,48974=>13199,48975=>13200,48978=>13201,48979=>13202,48980=>13203,48982=>13204,48983=>13205,48984=>13206,48985=>13207,48986=>13208,48987=>13209,48988=>13210,48989=>13211,48990=>13212,48991=>13213,48992=>13214,48993=>13215,48994=>13216,48995=>13217,48996=>13218,48997=>13219,48998=>13220,48999=>13221,49000=>13222,49001=>13223,49002=>13224,49003=>13225,49004=>13226,49005=>13227,49006=>13228,49007=>13229,49008=>13230,49009=>13231,49010=>13232,49011=>13233,49012=>13234,49013=>13235,49014=>13236,49015=>13237,49016=>13238,49017=>13239,49018=>13240,49019=>13241,49020=>13242,49021=>13243,49022=>13244,49023=>13245,49024=>13246,49025=>13247,49026=>13248,49027=>13249,49028=>13250,49029=>13251,49030=>13252,49031=>13253,49032=>13254,49033=>13255,49034=>13256,49035=>13257,49036=>13258,49037=>13259,49038=>13260,49039=>13261,49040=>13262,49041=>13263,49042=>13264,49043=>13265,49045=>13266,49046=>13267,49047=>13268,49048=>13269,49049=>13270,49050=>13271,49051=>13272,49052=>13273,49053=>13274,49054=>13275,49055=>13276,49056=>13277,49057=>13278,49058=>13279,49059=>13280,49060=>13281,49061=>13282,49062=>13283,49063=>13284,49064=>13285,49065=>13286,49066=>13287,49067=>13288,49068=>13289,49069=>13290,49070=>13291,49071=>13292,49073=>13293,49074=>13294,49075=>13295,49076=>13296,49077=>13297,49078=>13298,49079=>13299,49080=>13300,49081=>13301,49082=>13302,49083=>13303,49084=>13304,49085=>13305,49086=>13306,49087=>13307,49088=>13308,49089=>13309,49090=>13310,49091=>13311,49092=>13312,49094=>13313,49095=>13314,49096=>13315,49097=>13316,49098=>13317,49099=>13318,49102=>13319,49103=>13320,49105=>13321,49106=>13322,49107=>13323,49109=>13324,49110=>13325,49111=>13326,49112=>13327,49113=>13328,49114=>13329,49115=>13330,49117=>13331,49118=>13332,49120=>13333,49122=>13334,49123=>13335,49124=>13336,49125=>13337,49126=>13338,49127=>13339,49128=>13340,49129=>13341,49130=>13342,49131=>13343,49132=>13344,49133=>13345,49134=>13346,49135=>13347,49136=>13348,49137=>13349,49138=>13350,49139=>13351,49140=>13352,49141=>13353,49142=>13354,49143=>13355,49144=>13356,49145=>13357,49146=>13358,49147=>13359,49148=>13360,49149=>13361,49150=>13362,49151=>13363,49152=>13364,49153=>13365,49154=>13366,49155=>13367,49156=>13368,49157=>13369,49158=>13370,49159=>13371,49160=>13372,49161=>13373,49162=>13374,49163=>13375,49164=>13376,49165=>13377,49166=>13378,49167=>13379,49168=>13380,49169=>13381,49170=>13382,49171=>13383,49172=>13384,49173=>13385,49174=>13386,49175=>13387,49176=>13388,49177=>13389,49178=>13390,49179=>13391,49180=>13392,49181=>13393,49182=>13394,49183=>13395,49184=>13396,49185=>13397,49186=>13398,49187=>13399,49188=>13400,49189=>13401,49190=>13402,49191=>13403,49192=>13404,49193=>13405,49194=>13406,49195=>13407,49196=>13408,49197=>13409,49198=>13410,49199=>13411,49200=>13412,49201=>13413,49202=>13414,49203=>13415,49204=>13416,49205=>13417,49206=>13418,49207=>13419,49208=>13420,49209=>13421,49210=>13422,49211=>13423,49213=>13424,49214=>13425,49215=>13426,49216=>13427,49217=>13428,49218=>13429,49219=>13430,49220=>13431,49221=>13432,49222=>13433,49223=>13434,49224=>13435,49225=>13436,49226=>13437,49227=>13438,49228=>13439,49229=>13440,49230=>13441,49231=>13442,49232=>13443,49234=>13444,49235=>13445,49236=>13446,49237=>13447,49238=>13448,49239=>13449,49241=>13450,49242=>13451,49243=>13452,49245=>13453,49246=>13454,49247=>13455,49249=>13456,49250=>13457,49251=>13458,49252=>13459,49253=>13460,49254=>13461,49255=>13462,49258=>13463,49259=>13464,49260=>13465,49261=>13466,49262=>13467,49263=>13468,49264=>13469,49265=>13470,49266=>13471,49267=>13472,49268=>13473,49269=>13474,49270=>13475,49271=>13476,49272=>13477,49273=>13478,49274=>13479,49275=>13480,49276=>13481,49277=>13482,49278=>13483,49279=>13484,49280=>13485,49281=>13486,49282=>13487,49283=>13488,49284=>13489,49285=>13490,49286=>13491,49287=>13492,49288=>13493,49289=>13494,49290=>13495,49291=>13496,49292=>13497,49293=>13498,49294=>13499,49295=>13500,49298=>13501,49299=>13502,49301=>13503,49302=>13504,49303=>13505,49305=>13506,49306=>13507,49307=>13508,49308=>13509,49309=>13510,49310=>13511,49311=>13512,49314=>13513,49316=>13514,49318=>13515,49319=>13516,49320=>13517,49321=>13518,49322=>13519,49323=>13520,49326=>13521,49329=>13522,49330=>13523,49335=>13524,49336=>13525,49337=>13526,49338=>13527,49339=>13528,49342=>13529,49346=>13530,49347=>13531,49348=>13532,49350=>13533,49351=>13534,49354=>13535,49355=>13536,49357=>13537,49358=>13538,49359=>13539,49361=>13540,49362=>13541,49363=>13542,49364=>13543,49365=>13544,49366=>13545,49367=>13546,49370=>13547,49374=>13548,49375=>13549,49376=>13550,49377=>13551,49378=>13552,49379=>13553,49382=>13554,49383=>13555,49385=>13556,49386=>13557,49387=>13558,49389=>13559,49390=>13560,49391=>13561,49392=>13562,49393=>13563,49394=>13564,49395=>13565,49398=>13566,49400=>13567,49402=>13568,49403=>13569,49404=>13570,49405=>13571,49406=>13572,49407=>13573,49409=>13574,49410=>13575,49411=>13576,49413=>13577,49414=>13578,49415=>13579,49417=>13580,49418=>13581,49419=>13582,49420=>13583,49421=>13584,49422=>13585,49423=>13586,49425=>13587,49426=>13588,49427=>13589,49428=>13590,49430=>13591,49431=>13592,49432=>13593,49433=>13594,49434=>13595,49435=>13596,49441=>13597,49442=>13598,49445=>13599,49448=>13600,49449=>13601,49450=>13602,49451=>13603,49454=>13604,49458=>13605,49459=>13606,49460=>13607,49461=>13608,49463=>13609,49466=>13610,49467=>13611,49469=>13612,49470=>13613,49471=>13614,49473=>13615,49474=>13616,49475=>13617,49476=>13618,49477=>13619,49478=>13620,49479=>13621,49482=>13622,49486=>13623,49487=>13624,49488=>13625,49489=>13626,49490=>13627,49491=>13628,49494=>13629,49495=>13630,49497=>13631,49498=>13632,49499=>13633,49501=>13634,49502=>13635,49503=>13636,49504=>13637,49505=>13638,49506=>13639,49507=>13640,49510=>13641,49514=>13642,49515=>13643,49516=>13644,49517=>13645,49518=>13646,49519=>13647,49521=>13648,49522=>13649,49523=>13650,49525=>13651,49526=>13652,49527=>13653,49529=>13654,49530=>13655,49531=>13656,49532=>13657,49533=>13658,49534=>13659,49535=>13660,49536=>13661,49537=>13662,49538=>13663,49539=>13664,49540=>13665,49542=>13666,49543=>13667,49544=>13668,49545=>13669,49546=>13670,49547=>13671,49551=>13672,49553=>13673,49554=>13674,49555=>13675,49557=>13676,49559=>13677,49560=>13678,49561=>13679,49562=>13680,49563=>13681,49566=>13682,49568=>13683,49570=>13684,49571=>13685,49572=>13686,49574=>13687,49575=>13688,49578=>13689,49579=>13690,49581=>13691,49582=>13692,49583=>13693,49585=>13694,49586=>13695,49587=>13696,49588=>13697,49589=>13698,49590=>13699,49591=>13700,49592=>13701,49593=>13702,49594=>13703,49595=>13704,49596=>13705,49598=>13706,49599=>13707,49600=>13708,49601=>13709,49602=>13710,49603=>13711,49605=>13712,49606=>13713,49607=>13714,49609=>13715,49610=>13716,49611=>13717,49613=>13718,49614=>13719,49615=>13720,49616=>13721,49617=>13722,49618=>13723,49619=>13724,49621=>13725,49622=>13726,49625=>13727,49626=>13728,49627=>13729,49628=>13730,49629=>13731,49630=>13732,49631=>13733,49633=>13734,49634=>13735,49635=>13736,49637=>13737,49638=>13738,49639=>13739,49641=>13740,49642=>13741,49643=>13742,49644=>13743,49645=>13744,49646=>13745,49647=>13746,49650=>13747,49652=>13748,49653=>13749,49654=>13750,49655=>13751,49656=>13752,49657=>13753,49658=>13754,49659=>13755,49662=>13756,49663=>13757,49665=>13758,49666=>13759,49667=>13760,49669=>13761,49670=>13762,49671=>13763,49672=>13764,49673=>13765,49674=>13766,49675=>13767,49678=>13768,49680=>13769,49682=>13770,49683=>13771,49684=>13772,49685=>13773,49686=>13774,49687=>13775,49690=>13776,49691=>13777,49693=>13778,49694=>13779,49697=>13780,49698=>13781,49699=>13782,49700=>13783,49701=>13784,49702=>13785,49703=>13786,49706=>13787,49708=>13788,49710=>13789,49712=>13790,49715=>13791,49717=>13792,49718=>13793,49719=>13794,49720=>13795,49721=>13796,49722=>13797,49723=>13798,49724=>13799,49725=>13800,49726=>13801,49727=>13802,49728=>13803,49729=>13804,49730=>13805,49731=>13806,49732=>13807,49733=>13808,49734=>13809,49735=>13810,49737=>13811,49738=>13812,49739=>13813,49740=>13814,49741=>13815,49742=>13816,49743=>13817,49746=>13818,49747=>13819,49749=>13820,49750=>13821,49751=>13822,49753=>13823,49754=>13824,49755=>13825,49756=>13826,49757=>13827,49758=>13828,49759=>13829,49761=>13830,49762=>13831,49763=>13832,49764=>13833,49766=>13834,49767=>13835,49768=>13836,49769=>13837,49770=>13838,49771=>13839,49774=>13840,49775=>13841,49777=>13842,49778=>13843,49779=>13844,49781=>13845,49782=>13846,49783=>13847,49784=>13848,49785=>13849,49786=>13850,49787=>13851,49790=>13852,49792=>13853,49794=>13854,49795=>13855,49796=>13856,49797=>13857,49798=>13858,49799=>13859,49802=>13860,49803=>13861,49804=>13862,49805=>13863,49806=>13864,49807=>13865,49809=>13866,49810=>13867,49811=>13868,49812=>13869,49813=>13870,49814=>13871,49815=>13872,49817=>13873,49818=>13874,49820=>13875,49822=>13876,49823=>13877,49824=>13878,49825=>13879,49826=>13880,49827=>13881,49830=>13882,49831=>13883,49833=>13884,49834=>13885,49835=>13886,49838=>13887,49839=>13888,49840=>13889,49841=>13890,49842=>13891,49843=>13892,49846=>13893,49848=>13894,49850=>13895,49851=>13896,49852=>13897,49853=>13898,49854=>13899,49855=>13900,49856=>13901,49857=>13902,49858=>13903,49859=>13904,49860=>13905,49861=>13906,49862=>13907,49863=>13908,49864=>13909,49865=>13910,49866=>13911,49867=>13912,49868=>13913,49869=>13914,49870=>13915,49871=>13916,49872=>13917,49873=>13918,49874=>13919,49875=>13920,49876=>13921,49877=>13922,49878=>13923,49879=>13924,49880=>13925,49881=>13926,49882=>13927,49883=>13928,49886=>13929,49887=>13930,49889=>13931,49890=>13932,49893=>13933,49894=>13934,49895=>13935,49896=>13936,49897=>13937,49898=>13938,49902=>13939,49904=>13940,49906=>13941,49907=>13942,49908=>13943,49909=>13944,49911=>13945,49914=>13946,49917=>13947,49918=>13948,49919=>13949,49921=>13950,49922=>13951,49923=>13952,49924=>13953,49925=>13954,49926=>13955,49927=>13956,49930=>13957,49931=>13958,49934=>13959,49935=>13960,49936=>13961,49937=>13962,49938=>13963,49942=>13964,49943=>13965,49945=>13966,49946=>13967,49947=>13968,49949=>13969,49950=>13970,49951=>13971,49952=>13972,49953=>13973,49954=>13974,49955=>13975,49958=>13976,49959=>13977,49962=>13978,49963=>13979,49964=>13980,49965=>13981,49966=>13982,49967=>13983,49968=>13984,49969=>13985,49970=>13986,49971=>13987,49972=>13988,49973=>13989,49974=>13990,49975=>13991,49976=>13992,49977=>13993,49978=>13994,49979=>13995,49980=>13996,49981=>13997,49982=>13998,49983=>13999,49984=>14000,49985=>14001,49986=>14002,49987=>14003,49988=>14004,49990=>14005,49991=>14006,49992=>14007,49993=>14008,49994=>14009,49995=>14010,49996=>14011,49997=>14012,49998=>14013,49999=>14014,50000=>14015,50001=>14016,50002=>14017,50003=>14018,50004=>14019,50005=>14020,50006=>14021,50007=>14022,50008=>14023,50009=>14024,50010=>14025,50011=>14026,50012=>14027,50013=>14028,50014=>14029,50015=>14030,50016=>14031,50017=>14032,50018=>14033,50019=>14034,50020=>14035,50021=>14036,50022=>14037,50023=>14038,50026=>14039,50027=>14040,50029=>14041,50030=>14042,50031=>14043,50033=>14044,50035=>14045,50036=>14046,50037=>14047,50038=>14048,50039=>14049,50042=>14050,50043=>14051,50046=>14052,50047=>14053,50048=>14054,50049=>14055,50050=>14056,50051=>14057,50053=>14058,50054=>14059,50055=>14060,50057=>14061,50058=>14062,50059=>14063,50061=>14064,50062=>14065,50063=>14066,50064=>14067,50065=>14068,50066=>14069,50067=>14070,50068=>14071,50069=>14072,50070=>14073,50071=>14074,50072=>14075,50073=>14076,50074=>14077,50075=>14078,50076=>14079,50077=>14080,50078=>14081,50079=>14082,50080=>14083,50081=>14084,50082=>14085,50083=>14086,50084=>14087,50085=>14088,50086=>14089,50087=>14090,50088=>14091,50089=>14092,50090=>14093,50091=>14094,50092=>14095,50093=>14096,50094=>14097,50095=>14098,50096=>14099,50097=>14100,50098=>14101,50099=>14102,50100=>14103,50101=>14104,50102=>14105,50103=>14106,50104=>14107,50105=>14108,50106=>14109,50107=>14110,50108=>14111,50109=>14112,50110=>14113,50111=>14114,50113=>14115,50114=>14116,50115=>14117,50116=>14118,50117=>14119,50118=>14120,50119=>14121,50120=>14122,50121=>14123,50122=>14124,50123=>14125,50124=>14126,50125=>14127,50126=>14128,50127=>14129,50128=>14130,50129=>14131,50130=>14132,50131=>14133,50132=>14134,50133=>14135,50134=>14136,50135=>14137,50138=>14138,50139=>14139,50141=>14140,50142=>14141,50145=>14142,50147=>14143,50148=>14144,50149=>14145,50150=>14146,50151=>14147,50154=>14148,50155=>14149,50156=>14150,50158=>14151,50159=>14152,50160=>14153,50161=>14154,50162=>14155,50163=>14156,50166=>14157,50167=>14158,50169=>14159,50170=>14160,50171=>14161,50172=>14162,50173=>14163,50174=>14164,50175=>14165,50176=>14166,50177=>14167,50178=>14168,50179=>14169,50180=>14170,50181=>14171,50182=>14172,50183=>14173,50185=>14174,50186=>14175,50187=>14176,50188=>14177,50189=>14178,50190=>14179,50191=>14180,50193=>14181,50194=>14182,50195=>14183,50196=>14184,50197=>14185,50198=>14186,50199=>14187,50200=>14188,50201=>14189,50202=>14190,50203=>14191,50204=>14192,50205=>14193,50206=>14194,50207=>14195,50208=>14196,50209=>14197,50210=>14198,50211=>14199,50213=>14200,50214=>14201,50215=>14202,50216=>14203,50217=>14204,50218=>14205,50219=>14206,50221=>14207,50222=>14208,50223=>14209,50225=>14210,50226=>14211,50227=>14212,50229=>14213,50230=>14214,50231=>14215,50232=>14216,50233=>14217,50234=>14218,50235=>14219,50238=>14220,50239=>14221,50240=>14222,50241=>14223,50242=>14224,50243=>14225,50244=>14226,50245=>14227,50246=>14228,50247=>14229,50249=>14230,50250=>14231,50251=>14232,50252=>14233,50253=>14234,50254=>14235,50255=>14236,50256=>14237,50257=>14238,50258=>14239,50259=>14240,50260=>14241,50261=>14242,50262=>14243,50263=>14244,50264=>14245,50265=>14246,50266=>14247,50267=>14248,50268=>14249,50269=>14250,50270=>14251,50271=>14252,50272=>14253,50273=>14254,50274=>14255,50275=>14256,50278=>14257,50279=>14258,50281=>14259,50282=>14260,50283=>14261,50285=>14262,50286=>14263,50287=>14264,50288=>14265,50289=>14266,50290=>14267,50291=>14268,50294=>14269,50295=>14270,50296=>14271,50298=>14272,50299=>14273,50300=>14274,50301=>14275,50302=>14276,50303=>14277,50305=>14278,50306=>14279,50307=>14280,50308=>14281,50309=>14282,50310=>14283,50311=>14284,50312=>14285,50313=>14286,50314=>14287,50315=>14288,50316=>14289,50317=>14290,50318=>14291,50319=>14292,50320=>14293,50321=>14294,50322=>14295,50323=>14296,50325=>14297,50326=>14298,50327=>14299,50328=>14300,50329=>14301,50330=>14302,50331=>14303,50333=>14304,50334=>14305,50335=>14306,50336=>14307,50337=>14308,50338=>14309,50339=>14310,50340=>14311,50341=>14312,50342=>14313,50343=>14314,50344=>14315,50345=>14316,50346=>14317,50347=>14318,50348=>14319,50349=>14320,50350=>14321,50351=>14322,50352=>14323,50353=>14324,50354=>14325,50355=>14326,50356=>14327,50357=>14328,50358=>14329,50359=>14330,50361=>14331,50362=>14332,50363=>14333,50365=>14334,50366=>14335,50367=>14336,50368=>14337,50369=>14338,50370=>14339,50371=>14340,50372=>14341,50373=>14342,50374=>14343,50375=>14344,50376=>14345,50377=>14346,50378=>14347,50379=>14348,50380=>14349,50381=>14350,50382=>14351,50383=>14352,50384=>14353,50385=>14354,50386=>14355,50387=>14356,50388=>14357,50389=>14358,50390=>14359,50391=>14360,50392=>14361,50393=>14362,50394=>14363,50395=>14364,50396=>14365,50397=>14366,50398=>14367,50399=>14368,50400=>14369,50401=>14370,50402=>14371,50403=>14372,50404=>14373,50405=>14374,50406=>14375,50407=>14376,50408=>14377,50410=>14378,50411=>14379,50412=>14380,50413=>14381,50414=>14382,50415=>14383,50418=>14384,50419=>14385,50421=>14386,50422=>14387,50423=>14388,50425=>14389,50427=>14390,50428=>14391,50429=>14392,50430=>14393,50434=>14394,50435=>14395,50436=>14396,50437=>14397,50438=>14398,50439=>14399,50440=>14400,50441=>14401,50442=>14402,50443=>14403,50445=>14404,50446=>14405,50447=>14406,50449=>14407,50450=>14408,50451=>14409,50453=>14410,50454=>14411,50455=>14412,50456=>14413,50457=>14414,50458=>14415,50459=>14416,50461=>14417,50462=>14418,50463=>14419,50464=>14420,50465=>14421,50466=>14422,50467=>14423,50468=>14424,50469=>14425,50470=>14426,50471=>14427,50474=>14428,50475=>14429,50477=>14430,50478=>14431,50479=>14432,50481=>14433,50482=>14434,50483=>14435,50484=>14436,50485=>14437,50486=>14438,50487=>14439,50490=>14440,50492=>14441,50494=>14442,50495=>14443,50496=>14444,50497=>14445,50498=>14446,50499=>14447,50502=>14448,50503=>14449,50507=>14450,50511=>14451,50512=>14452,50513=>14453,50514=>14454,50518=>14455,50522=>14456,50523=>14457,50524=>14458,50527=>14459,50530=>14460,50531=>14461,50533=>14462,50534=>14463,50535=>14464,50537=>14465,50538=>14466,50539=>14467,50540=>14468,50541=>14469,50542=>14470,50543=>14471,50546=>14472,50550=>14473,50551=>14474,50552=>14475,50553=>14476,50554=>14477,50555=>14478,50558=>14479,50559=>14480,50561=>14481,50562=>14482,50563=>14483,50565=>14484,50566=>14485,50568=>14486,50569=>14487,50570=>14488,50571=>14489,50574=>14490,50576=>14491,50578=>14492,50579=>14493,50580=>14494,50582=>14495,50585=>14496,50586=>14497,50587=>14498,50589=>14499,50590=>14500,50591=>14501,50593=>14502,50594=>14503,50595=>14504,50596=>14505,50597=>14506,50598=>14507,50599=>14508,50600=>14509,50602=>14510,50603=>14511,50604=>14512,50605=>14513,50606=>14514,50607=>14515,50608=>14516,50609=>14517,50610=>14518,50611=>14519,50614=>14520,50615=>14521,50618=>14522,50623=>14523,50624=>14524,50625=>14525,50626=>14526,50627=>14527,50635=>14528,50637=>14529,50639=>14530,50642=>14531,50643=>14532,50645=>14533,50646=>14534,50647=>14535,50649=>14536,50650=>14537,50651=>14538,50652=>14539,50653=>14540,50654=>14541,50655=>14542,50658=>14543,50660=>14544,50662=>14545,50663=>14546,50664=>14547,50665=>14548,50666=>14549,50667=>14550,50671=>14551,50673=>14552,50674=>14553,50675=>14554,50677=>14555,50680=>14556,50681=>14557,50682=>14558,50683=>14559,50690=>14560,50691=>14561,50692=>14562,50697=>14563,50698=>14564,50699=>14565,50701=>14566,50702=>14567,50703=>14568,50705=>14569,50706=>14570,50707=>14571,50708=>14572,50709=>14573,50710=>14574,50711=>14575,50714=>14576,50717=>14577,50718=>14578,50719=>14579,50720=>14580,50721=>14581,50722=>14582,50723=>14583,50726=>14584,50727=>14585,50729=>14586,50730=>14587,50731=>14588,50735=>14589,50737=>14590,50738=>14591,50742=>14592,50744=>14593,50746=>14594,50748=>14595,50749=>14596,50750=>14597,50751=>14598,50754=>14599,50755=>14600,50757=>14601,50758=>14602,50759=>14603,50761=>14604,50762=>14605,50763=>14606,50764=>14607,50765=>14608,50766=>14609,50767=>14610,50770=>14611,50774=>14612,50775=>14613,50776=>14614,50777=>14615,50778=>14616,50779=>14617,50782=>14618,50783=>14619,50785=>14620,50786=>14621,50787=>14622,50788=>14623,50789=>14624,50790=>14625,50791=>14626,50792=>14627,50793=>14628,50794=>14629,50795=>14630,50797=>14631,50798=>14632,50800=>14633,50802=>14634,50803=>14635,50804=>14636,50805=>14637,50806=>14638,50807=>14639,50810=>14640,50811=>14641,50813=>14642,50814=>14643,50815=>14644,50817=>14645,50818=>14646,50819=>14647,50820=>14648,50821=>14649,50822=>14650,50823=>14651,50826=>14652,50828=>14653,50830=>14654,50831=>14655,50832=>14656,50833=>14657,50834=>14658,50835=>14659,50838=>14660,50839=>14661,50841=>14662,50842=>14663,50843=>14664,50845=>14665,50846=>14666,50847=>14667,50848=>14668,50849=>14669,50850=>14670,50851=>14671,50854=>14672,50856=>14673,50858=>14674,50859=>14675,50860=>14676,50861=>14677,50862=>14678,50863=>14679,50866=>14680,50867=>14681,50869=>14682,50870=>14683,50871=>14684,50875=>14685,50876=>14686,50877=>14687,50878=>14688,50879=>14689,50882=>14690,50884=>14691,50886=>14692,50887=>14693,50888=>14694,50889=>14695,50890=>14696,50891=>14697,50894=>14698,50895=>14699,50897=>14700,50898=>14701,50899=>14702,50901=>14703,50902=>14704,50903=>14705,50904=>14706,50905=>14707,50906=>14708,50907=>14709,50910=>14710,50911=>14711,50914=>14712,50915=>14713,50916=>14714,50917=>14715,50918=>14716,50919=>14717,50922=>14718,50923=>14719,50925=>14720,50926=>14721,50927=>14722,50929=>14723,50930=>14724,50931=>14725,50932=>14726,50933=>14727,50934=>14728,50935=>14729,50938=>14730,50939=>14731,50940=>14732,50942=>14733,50943=>14734,50944=>14735,50945=>14736,50946=>14737,50947=>14738,50950=>14739,50951=>14740,50953=>14741,50954=>14742,50955=>14743,50957=>14744,50958=>14745,50959=>14746,50960=>14747,50961=>14748,50962=>14749,50963=>14750,50966=>14751,50968=>14752,50970=>14753,50971=>14754,50972=>14755,50973=>14756,50974=>14757,50975=>14758,50978=>14759,50979=>14760,50981=>14761,50982=>14762,50983=>14763,50985=>14764,50986=>14765,50987=>14766,50988=>14767,50989=>14768,50990=>14769,50991=>14770,50994=>14771,50996=>14772,50998=>14773,51000=>14774,51001=>14775,51002=>14776,51003=>14777,51006=>14778,51007=>14779,51009=>14780,51010=>14781,51011=>14782,51013=>14783,51014=>14784,51015=>14785,51016=>14786,51017=>14787,51019=>14788,51022=>14789,51024=>14790,51033=>14791,51034=>14792,51035=>14793,51037=>14794,51038=>14795,51039=>14796,51041=>14797,51042=>14798,51043=>14799,51044=>14800,51045=>14801,51046=>14802,51047=>14803,51049=>14804,51050=>14805,51052=>14806,51053=>14807,51054=>14808,51055=>14809,51056=>14810,51057=>14811,51058=>14812,51059=>14813,51062=>14814,51063=>14815,51065=>14816,51066=>14817,51067=>14818,51071=>14819,51072=>14820,51073=>14821,51074=>14822,51078=>14823,51083=>14824,51084=>14825,51085=>14826,51087=>14827,51090=>14828,51091=>14829,51093=>14830,51097=>14831,51099=>14832,51100=>14833,51101=>14834,51102=>14835,51103=>14836,51106=>14837,51111=>14838,51112=>14839,51113=>14840,51114=>14841,51115=>14842,51118=>14843,51119=>14844,51121=>14845,51122=>14846,51123=>14847,51125=>14848,51126=>14849,51127=>14850,51128=>14851,51129=>14852,51130=>14853,51131=>14854,51134=>14855,51138=>14856,51139=>14857,51140=>14858,51141=>14859,51142=>14860,51143=>14861,51146=>14862,51147=>14863,51149=>14864,51151=>14865,51153=>14866,51154=>14867,51155=>14868,51156=>14869,51157=>14870,51158=>14871,51159=>14872,51161=>14873,51162=>14874,51163=>14875,51164=>14876,51166=>14877,51167=>14878,51168=>14879,51169=>14880,51170=>14881,51171=>14882,51173=>14883,51174=>14884,51175=>14885,51177=>14886,51178=>14887,51179=>14888,51181=>14889,51182=>14890,51183=>14891,51184=>14892,51185=>14893,51186=>14894,51187=>14895,51188=>14896,51189=>14897,51190=>14898,51191=>14899,51192=>14900,51193=>14901,51194=>14902,51195=>14903,51196=>14904,51197=>14905,51198=>14906,51199=>14907,51202=>14908,51203=>14909,51205=>14910,51206=>14911,51207=>14912,51209=>14913,51211=>14914,51212=>14915,51213=>14916,51214=>14917,51215=>14918,51218=>14919,51220=>14920,51223=>14921,51224=>14922,51225=>14923,51226=>14924,51227=>14925,51230=>14926,51231=>14927,51233=>14928,51234=>14929,51235=>14930,51237=>14931,51238=>14932,51239=>14933,51240=>14934,51241=>14935,51242=>14936,51243=>14937,51246=>14938,51248=>14939,51250=>14940,51251=>14941,51252=>14942,51253=>14943,51254=>14944,51255=>14945,51257=>14946,51258=>14947,51259=>14948,51261=>14949,51262=>14950,51263=>14951,51265=>14952,51266=>14953,51267=>14954,51268=>14955,51269=>14956,51270=>14957,51271=>14958,51274=>14959,51275=>14960,51278=>14961,51279=>14962,51280=>14963,51281=>14964,51282=>14965,51283=>14966,51285=>14967,51286=>14968,51287=>14969,51288=>14970,51289=>14971,51290=>14972,51291=>14973,51292=>14974,51293=>14975,51294=>14976,51295=>14977,51296=>14978,51297=>14979,51298=>14980,51299=>14981,51300=>14982,51301=>14983,51302=>14984,51303=>14985,51304=>14986,51305=>14987,51306=>14988,51307=>14989,51308=>14990,51309=>14991,51310=>14992,51311=>14993,51314=>14994,51315=>14995,51317=>14996,51318=>14997,51319=>14998,51321=>14999,51323=>15000,51324=>15001,51325=>15002,51326=>15003,51327=>15004,51330=>15005,51332=>15006,51336=>15007,51337=>15008,51338=>15009,51342=>15010,51343=>15011,51344=>15012,51345=>15013,51346=>15014,51347=>15015,51349=>15016,51350=>15017,51351=>15018,51352=>15019,51353=>15020,51354=>15021,51355=>15022,51356=>15023,51358=>15024,51360=>15025,51362=>15026,51363=>15027,51364=>15028,51365=>15029,51366=>15030,51367=>15031,51369=>15032,51370=>15033,51371=>15034,51372=>15035,51373=>15036,51374=>15037,51375=>15038,51376=>15039,51377=>15040,51378=>15041,51379=>15042,51380=>15043,51381=>15044,51382=>15045,51383=>15046,51384=>15047,51385=>15048,51386=>15049,51387=>15050,51390=>15051,51391=>15052,51392=>15053,51393=>15054,51394=>15055,51395=>15056,51397=>15057,51398=>15058,51399=>15059,51401=>15060,51402=>15061,51403=>15062,51405=>15063,51406=>15064,51407=>15065,51408=>15066,51409=>15067,51410=>15068,51411=>15069,51414=>15070,51416=>15071,51418=>15072,51419=>15073,51420=>15074,51421=>15075,51422=>15076,51423=>15077,51426=>15078,51427=>15079,51429=>15080,51430=>15081,51431=>15082,51432=>15083,51433=>15084,51434=>15085,51435=>15086,51436=>15087,51437=>15088,51438=>15089,51439=>15090,51440=>15091,51441=>15092,51442=>15093,51443=>15094,51444=>15095,51446=>15096,51447=>15097,51448=>15098,51449=>15099,51450=>15100,51451=>15101,51454=>15102,51455=>15103,51457=>15104,51458=>15105,51459=>15106,51463=>15107,51464=>15108,51465=>15109,51466=>15110,51467=>15111,51470=>15112,51472=>15113,51474=>15114,51475=>15115,51476=>15116,51477=>15117,51478=>15118,51479=>15119,51481=>15120,51482=>15121,51483=>15122,51484=>15123,51485=>15124,51486=>15125,51487=>15126,51488=>15127,51489=>15128,51490=>15129,51491=>15130,51492=>15131,51493=>15132,51494=>15133,51495=>15134,51496=>15135,51497=>15136,51498=>15137,51499=>15138,51501=>15139,51502=>15140,51503=>15141,51504=>15142,51505=>15143,51506=>15144,51507=>15145,51509=>15146,51510=>15147,51511=>15148,51512=>15149,51513=>15150,51514=>15151,51515=>15152,51516=>15153,51517=>15154,51518=>15155,51519=>15156,51520=>15157,51521=>15158,51522=>15159,51523=>15160,51524=>15161,51525=>15162,51526=>15163,51527=>15164,51528=>15165,51529=>15166,51530=>15167,51531=>15168,51532=>15169,51533=>15170,51534=>15171,51535=>15172,51538=>15173,51539=>15174,51541=>15175,51542=>15176,51543=>15177,51545=>15178,51546=>15179,51547=>15180,51548=>15181,51549=>15182,51550=>15183,51551=>15184,51554=>15185,51556=>15186,51557=>15187,51558=>15188,51559=>15189,51560=>15190,51561=>15191,51562=>15192,51563=>15193,51565=>15194,51566=>15195,51567=>15196,51569=>15197,51570=>15198,51571=>15199,51573=>15200,51574=>15201,51575=>15202,51576=>15203,51577=>15204,51578=>15205,51579=>15206,51581=>15207,51582=>15208,51583=>15209,51584=>15210,51585=>15211,51586=>15212,51587=>15213,51588=>15214,51589=>15215,51590=>15216,51591=>15217,51594=>15218,51595=>15219,51597=>15220,51598=>15221,51599=>15222,51601=>15223,51602=>15224,51603=>15225,51604=>15226,51605=>15227,51606=>15228,51607=>15229,51610=>15230,51612=>15231,51614=>15232,51615=>15233,51616=>15234,51617=>15235,51618=>15236,51619=>15237,51620=>15238,51621=>15239,51622=>15240,51623=>15241,51624=>15242,51625=>15243,51626=>15244,51627=>15245,51628=>15246,51629=>15247,51630=>15248,51631=>15249,51632=>15250,51633=>15251,51634=>15252,51635=>15253,51636=>15254,51637=>15255,51638=>15256,51639=>15257,51640=>15258,51641=>15259,51642=>15260,51643=>15261,51644=>15262,51645=>15263,51646=>15264,51647=>15265,51650=>15266,51651=>15267,51653=>15268,51654=>15269,51657=>15270,51659=>15271,51660=>15272,51661=>15273,51662=>15274,51663=>15275,51666=>15276,51668=>15277,51671=>15278,51672=>15279,51675=>15280,51678=>15281,51679=>15282,51681=>15283,51683=>15284,51685=>15285,51686=>15286,51688=>15287,51689=>15288,51690=>15289,51691=>15290,51694=>15291,51698=>15292,51699=>15293,51700=>15294,51701=>15295,51702=>15296,51703=>15297,51706=>15298,51707=>15299,51709=>15300,51710=>15301,51711=>15302,51713=>15303,51714=>15304,51715=>15305,51716=>15306,51717=>15307,51718=>15308,51719=>15309,51722=>15310,51726=>15311,51727=>15312,51728=>15313,51729=>15314,51730=>15315,51731=>15316,51733=>15317,51734=>15318,51735=>15319,51737=>15320,51738=>15321,51739=>15322,51740=>15323,51741=>15324,51742=>15325,51743=>15326,51744=>15327,51745=>15328,51746=>15329,51747=>15330,51748=>15331,51749=>15332,51750=>15333,51751=>15334,51752=>15335,51754=>15336,51755=>15337,51756=>15338,51757=>15339,51758=>15340,51759=>15341,51760=>15342,51761=>15343,51762=>15344,51763=>15345,51764=>15346,51765=>15347,51766=>15348,51767=>15349,51768=>15350,51769=>15351,51770=>15352,51771=>15353,51772=>15354,51773=>15355,51774=>15356,51775=>15357,51776=>15358,51777=>15359,51778=>15360,51779=>15361,51780=>15362,51781=>15363,51782=>15364,51783=>15365,51784=>15366,51785=>15367,51786=>15368,51787=>15369,51790=>15370,51791=>15371,51793=>15372,51794=>15373,51795=>15374,51797=>15375,51798=>15376,51799=>15377,51800=>15378,51801=>15379,51802=>15380,51803=>15381,51806=>15382,51810=>15383,51811=>15384,51812=>15385,51813=>15386,51814=>15387,51815=>15388,51817=>15389,51818=>15390,51819=>15391,51820=>15392,51821=>15393,51822=>15394,51823=>15395,51824=>15396,51825=>15397,51826=>15398,51827=>15399,51828=>15400,51829=>15401,51830=>15402,51831=>15403,51832=>15404,51833=>15405,51834=>15406,51835=>15407,51836=>15408,51838=>15409,51839=>15410,51840=>15411,51841=>15412,51842=>15413,51843=>15414,51845=>15415,51846=>15416,51847=>15417,51848=>15418,51849=>15419,51850=>15420,51851=>15421,51852=>15422,51853=>15423,51854=>15424,51855=>15425,51856=>15426,51857=>15427,51858=>15428,51859=>15429,51860=>15430,51861=>15431,51862=>15432,51863=>15433,51865=>15434,51866=>15435,51867=>15436,51868=>15437,51869=>15438,51870=>15439,51871=>15440,51872=>15441,51873=>15442,51874=>15443,51875=>15444,51876=>15445,51877=>15446,51878=>15447,51879=>15448,51880=>15449,51881=>15450,51882=>15451,51883=>15452,51884=>15453,51885=>15454,51886=>15455,51887=>15456,51888=>15457,51889=>15458,51890=>15459,51891=>15460,51892=>15461,51893=>15462,51894=>15463,51895=>15464,51896=>15465,51897=>15466,51898=>15467,51899=>15468,51902=>15469,51903=>15470,51905=>15471,51906=>15472,51907=>15473,51909=>15474,51910=>15475,51911=>15476,51912=>15477,51913=>15478,51914=>15479,51915=>15480,51918=>15481,51920=>15482,51922=>15483,51924=>15484,51925=>15485,51926=>15486,51927=>15487,51930=>15488,51931=>15489,51932=>15490,51933=>15491,51934=>15492,51935=>15493,51937=>15494,51938=>15495,51939=>15496,51940=>15497,51941=>15498,51942=>15499,51943=>15500,51944=>15501,51945=>15502,51946=>15503,51947=>15504,51949=>15505,51950=>15506,51951=>15507,51952=>15508,51953=>15509,51954=>15510,51955=>15511,51957=>15512,51958=>15513,51959=>15514,51960=>15515,51961=>15516,51962=>15517,51963=>15518,51964=>15519,51965=>15520,51966=>15521,51967=>15522,51968=>15523,51969=>15524,51970=>15525,51971=>15526,51972=>15527,51973=>15528,51974=>15529,51975=>15530,51977=>15531,51978=>15532,51979=>15533,51980=>15534,51981=>15535,51982=>15536,51983=>15537,51985=>15538,51986=>15539,51987=>15540,51989=>15541,51990=>15542,51991=>15543,51993=>15544,51994=>15545,51995=>15546,51996=>15547,51997=>15548,51998=>15549,51999=>15550,52002=>15551,52003=>15552,52004=>15553,52005=>15554,52006=>15555,52007=>15556,52008=>15557,52009=>15558,52010=>15559,52011=>15560,52012=>15561,52013=>15562,52014=>15563,52015=>15564,52016=>15565,52017=>15566,52018=>15567,52019=>15568,52020=>15569,52021=>15570,52022=>15571,52023=>15572,52024=>15573,52025=>15574,52026=>15575,52027=>15576,52028=>15577,52029=>15578,52030=>15579,52031=>15580,52032=>15581,52034=>15582,52035=>15583,52036=>15584,52037=>15585,52038=>15586,52039=>15587,52042=>15588,52043=>15589,52045=>15590,52046=>15591,52047=>15592,52049=>15593,52050=>15594,52051=>15595,52052=>15596,52053=>15597,52054=>15598,52055=>15599,52058=>15600,52059=>15601,52060=>15602,52062=>15603,52063=>15604,52064=>15605,52065=>15606,52066=>15607,52067=>15608,52069=>15609,52070=>15610,52071=>15611,52072=>15612,52073=>15613,52074=>15614,52075=>15615,52076=>15616,52077=>15617,52078=>15618,52079=>15619,52080=>15620,52081=>15621,52082=>15622,52083=>15623,52084=>15624,52085=>15625,52086=>15626,52087=>15627,52090=>15628,52091=>15629,52092=>15630,52093=>15631,52094=>15632,52095=>15633,52096=>15634,52097=>15635,52098=>15636,52099=>15637,52100=>15638,52101=>15639,52102=>15640,52103=>15641,52104=>15642,52105=>15643,52106=>15644,52107=>15645,52108=>15646,52109=>15647,52110=>15648,52111=>15649,52112=>15650,52113=>15651,52114=>15652,52115=>15653,52116=>15654,52117=>15655,52118=>15656,52119=>15657,52120=>15658,52121=>15659,52122=>15660,52123=>15661,52125=>15662,52126=>15663,52127=>15664,52128=>15665,52129=>15666,52130=>15667,52131=>15668,52132=>15669,52133=>15670,52134=>15671,52135=>15672,52136=>15673,52137=>15674,52138=>15675,52139=>15676,52140=>15677,52141=>15678,52142=>15679,52143=>15680,52144=>15681,52145=>15682,52146=>15683,52147=>15684,52148=>15685,52149=>15686,52150=>15687,52151=>15688,52153=>15689,52154=>15690,52155=>15691,52156=>15692,52157=>15693,52158=>15694,52159=>15695,52160=>15696,52161=>15697,52162=>15698,52163=>15699,52164=>15700,52165=>15701,52166=>15702,52167=>15703,52168=>15704,52169=>15705,52170=>15706,52171=>15707,52172=>15708,52173=>15709,52174=>15710,52175=>15711,52176=>15712,52177=>15713,52178=>15714,52179=>15715,52181=>15716,52182=>15717,52183=>15718,52184=>15719,52185=>15720,52186=>15721,52187=>15722,52188=>15723,52189=>15724,52190=>15725,52191=>15726,52192=>15727,52193=>15728,52194=>15729,52195=>15730,52197=>15731,52198=>15732,52200=>15733,52202=>15734,52203=>15735,52204=>15736,52205=>15737,52206=>15738,52207=>15739,52208=>15740,52209=>15741,52210=>15742,52211=>15743,52212=>15744,52213=>15745,52214=>15746,52215=>15747,52216=>15748,52217=>15749,52218=>15750,52219=>15751,52220=>15752,52221=>15753,52222=>15754,52223=>15755,52224=>15756,52225=>15757,52226=>15758,52227=>15759,52228=>15760,52229=>15761,52230=>15762,52231=>15763,52232=>15764,52233=>15765,52234=>15766,52235=>15767,52238=>15768,52239=>15769,52241=>15770,52242=>15771,52243=>15772,52245=>15773,52246=>15774,52247=>15775,52248=>15776,52249=>15777,52250=>15778,52251=>15779,52254=>15780,52255=>15781,52256=>15782,52259=>15783,52260=>15784,52261=>15785,52262=>15786,52266=>15787,52267=>15788,52269=>15789,52271=>15790,52273=>15791,52274=>15792,52275=>15793,52276=>15794,52277=>15795,52278=>15796,52279=>15797,52282=>15798,52287=>15799,52288=>15800,52289=>15801,52290=>15802,52291=>15803,52294=>15804,52295=>15805,52297=>15806,52298=>15807,52299=>15808,52301=>15809,52302=>15810,52303=>15811,52304=>15812,52305=>15813,52306=>15814,52307=>15815,52310=>15816,52314=>15817,52315=>15818,52316=>15819,52317=>15820,52318=>15821,52319=>15822,52321=>15823,52322=>15824,52323=>15825,52325=>15826,52327=>15827,52329=>15828,52330=>15829,52331=>15830,52332=>15831,52333=>15832,52334=>15833,52335=>15834,52337=>15835,52338=>15836,52339=>15837,52340=>15838,52342=>15839,52343=>15840,52344=>15841,52345=>15842,52346=>15843,52347=>15844,52348=>15845,52349=>15846,52350=>15847,52351=>15848,52352=>15849,52353=>15850,52354=>15851,52355=>15852,52356=>15853,52357=>15854,52358=>15855,52359=>15856,52360=>15857,52361=>15858,52362=>15859,52363=>15860,52364=>15861,52365=>15862,52366=>15863,52367=>15864,52368=>15865,52369=>15866,52370=>15867,52371=>15868,52372=>15869,52373=>15870,52374=>15871,52375=>15872,52378=>15873,52379=>15874,52381=>15875,52382=>15876,52383=>15877,52385=>15878,52386=>15879,52387=>15880,52388=>15881,52389=>15882,52390=>15883,52391=>15884,52394=>15885,52398=>15886,52399=>15887,52400=>15888,52401=>15889,52402=>15890,52403=>15891,52406=>15892,52407=>15893,52409=>15894,52410=>15895,52411=>15896,52413=>15897,52414=>15898,52415=>15899,52416=>15900,52417=>15901,52418=>15902,52419=>15903,52422=>15904,52424=>15905,52426=>15906,52427=>15907,52428=>15908,52429=>15909,52430=>15910,52431=>15911,52433=>15912,52434=>15913,52435=>15914,52437=>15915,52438=>15916,52439=>15917,52440=>15918,52441=>15919,52442=>15920,52443=>15921,52444=>15922,52445=>15923,52446=>15924,52447=>15925,52448=>15926,52449=>15927,52450=>15928,52451=>15929,52453=>15930,52454=>15931,52455=>15932,52456=>15933,52457=>15934,52458=>15935,52459=>15936,52461=>15937,52462=>15938,52463=>15939,52465=>15940,52466=>15941,52467=>15942,52468=>15943,52469=>15944,52470=>15945,52471=>15946,52472=>15947,52473=>15948,52474=>15949,52475=>15950,52476=>15951,52477=>15952,52478=>15953,52479=>15954,52480=>15955,52482=>15956,52483=>15957,52484=>15958,52485=>15959,52486=>15960,52487=>15961,52490=>15962,52491=>15963,52493=>15964,52494=>15965,52495=>15966,52497=>15967,52498=>15968,52499=>15969,52500=>15970,52501=>15971,52502=>15972,52503=>15973,52506=>15974,52508=>15975,52510=>15976,52511=>15977,52512=>15978,52513=>15979,52514=>15980,52515=>15981,52517=>15982,52518=>15983,52519=>15984,52521=>15985,52522=>15986,52523=>15987,52525=>15988,52526=>15989,52527=>15990,52528=>15991,52529=>15992,52530=>15993,52531=>15994,52532=>15995,52533=>15996,52534=>15997,52535=>15998,52536=>15999,52538=>16000,52539=>16001,52540=>16002,52541=>16003,52542=>16004,52543=>16005,52544=>16006,52545=>16007,52546=>16008,52547=>16009,52548=>16010,52549=>16011,52550=>16012,52551=>16013,52552=>16014,52553=>16015,52554=>16016,52555=>16017,52556=>16018,52557=>16019,52558=>16020,52559=>16021,52560=>16022,52561=>16023,52562=>16024,52563=>16025,52564=>16026,52565=>16027,52566=>16028,52567=>16029,52568=>16030,52569=>16031,52570=>16032,52571=>16033,52573=>16034,52574=>16035,52575=>16036,52577=>16037,52578=>16038,52579=>16039,52581=>16040,52582=>16041,52583=>16042,52584=>16043,52585=>16044,52586=>16045,52587=>16046,52590=>16047,52592=>16048,52594=>16049,52595=>16050,52596=>16051,52597=>16052,52598=>16053,52599=>16054,52601=>16055,52602=>16056,52603=>16057,52604=>16058,52605=>16059,52606=>16060,52607=>16061,52608=>16062,52609=>16063,52610=>16064,52611=>16065,52612=>16066,52613=>16067,52614=>16068,52615=>16069,52617=>16070,52618=>16071,52619=>16072,52620=>16073,52621=>16074,52622=>16075,52623=>16076,52624=>16077,52625=>16078,52626=>16079,52627=>16080,52630=>16081,52631=>16082,52633=>16083,52634=>16084,52635=>16085,52637=>16086,52638=>16087,52639=>16088,52640=>16089,52641=>16090,52642=>16091,52643=>16092,52646=>16093,52648=>16094,52650=>16095,52651=>16096,52652=>16097,52653=>16098,52654=>16099,52655=>16100,52657=>16101,52658=>16102,52659=>16103,52660=>16104,52661=>16105,52662=>16106,52663=>16107,52664=>16108,52665=>16109,52666=>16110,52667=>16111,52668=>16112,52669=>16113,52670=>16114,52671=>16115,52672=>16116,52673=>16117,52674=>16118,52675=>16119,52677=>16120,52678=>16121,52679=>16122,52680=>16123,52681=>16124,52682=>16125,52683=>16126,52685=>16127,52686=>16128,52687=>16129,52689=>16130,52690=>16131,52691=>16132,52692=>16133,52693=>16134,52694=>16135,52695=>16136,52696=>16137,52697=>16138,52698=>16139,52699=>16140,52700=>16141,52701=>16142,52702=>16143,52703=>16144,52704=>16145,52705=>16146,52706=>16147,52707=>16148,52708=>16149,52709=>16150,52710=>16151,52711=>16152,52713=>16153,52714=>16154,52715=>16155,52717=>16156,52718=>16157,52719=>16158,52721=>16159,52722=>16160,52723=>16161,52724=>16162,52725=>16163,52726=>16164,52727=>16165,52730=>16166,52732=>16167,52734=>16168,52735=>16169,52736=>16170,52737=>16171,52738=>16172,52739=>16173,52741=>16174,52742=>16175,52743=>16176,52745=>16177,52746=>16178,52747=>16179,52749=>16180,52750=>16181,52751=>16182,52752=>16183,52753=>16184,52754=>16185,52755=>16186,52757=>16187,52758=>16188,52759=>16189,52760=>16190,52762=>16191,52763=>16192,52764=>16193,52765=>16194,52766=>16195,52767=>16196,52770=>16197,52771=>16198,52773=>16199,52774=>16200,52775=>16201,52777=>16202,52778=>16203,52779=>16204,52780=>16205,52781=>16206,52782=>16207,52783=>16208,52786=>16209,52788=>16210,52790=>16211,52791=>16212,52792=>16213,52793=>16214,52794=>16215,52795=>16216,52796=>16217,52797=>16218,52798=>16219,52799=>16220,52800=>16221,52801=>16222,52802=>16223,52803=>16224,52804=>16225,52805=>16226,52806=>16227,52807=>16228,52808=>16229,52809=>16230,52810=>16231,52811=>16232,52812=>16233,52813=>16234,52814=>16235,52815=>16236,52816=>16237,52817=>16238,52818=>16239,52819=>16240,52820=>16241,52821=>16242,52822=>16243,52823=>16244,52826=>16245,52827=>16246,52829=>16247,52830=>16248,52834=>16249,52835=>16250,52836=>16251,52837=>16252,52838=>16253,52839=>16254,52842=>16255,52844=>16256,52846=>16257,52847=>16258,52848=>16259,52849=>16260,52850=>16261,52851=>16262,52854=>16263,52855=>16264,52857=>16265,52858=>16266,52859=>16267,52861=>16268,52862=>16269,52863=>16270,52864=>16271,52865=>16272,52866=>16273,52867=>16274,52870=>16275,52872=>16276,52874=>16277,52875=>16278,52876=>16279,52877=>16280,52878=>16281,52879=>16282,52882=>16283,52883=>16284,52885=>16285,52886=>16286,52887=>16287,52889=>16288,52890=>16289,52891=>16290,52892=>16291,52893=>16292,52894=>16293,52895=>16294,52898=>16295,52902=>16296,52903=>16297,52904=>16298,52905=>16299,52906=>16300,52907=>16301,52910=>16302,52911=>16303,52912=>16304,52913=>16305,52914=>16306,52915=>16307,52916=>16308,52917=>16309,52918=>16310,52919=>16311,52920=>16312,52921=>16313,52922=>16314,52923=>16315,52924=>16316,52925=>16317,52926=>16318,52927=>16319,52928=>16320,52930=>16321,52931=>16322,52932=>16323,52933=>16324,52934=>16325,52935=>16326,52936=>16327,52937=>16328,52938=>16329,52939=>16330,52940=>16331,52941=>16332,52942=>16333,52943=>16334,52944=>16335,52945=>16336,52946=>16337,52947=>16338,52948=>16339,52949=>16340,52950=>16341,52951=>16342,52952=>16343,52953=>16344,52954=>16345,52955=>16346,52956=>16347,52957=>16348,52958=>16349,52959=>16350,52960=>16351,52961=>16352,52962=>16353,52963=>16354,52966=>16355,52967=>16356,52969=>16357,52970=>16358,52973=>16359,52974=>16360,52975=>16361,52976=>16362,52977=>16363,52978=>16364,52979=>16365,52982=>16366,52986=>16367,52987=>16368,52988=>16369,52989=>16370,52990=>16371,52991=>16372,52994=>16373,52995=>16374,52997=>16375,52998=>16376,52999=>16377,53001=>16378,53002=>16379,53003=>16380,53004=>16381,53005=>16382,53006=>16383,53007=>16384,53010=>16385,53012=>16386,53014=>16387,53015=>16388,53016=>16389,53017=>16390,53018=>16391,53019=>16392,53021=>16393,53022=>16394,53023=>16395,53025=>16396,53026=>16397,53027=>16398,53029=>16399,53030=>16400,53031=>16401,53032=>16402,53033=>16403,53034=>16404,53035=>16405,53038=>16406,53042=>16407,53043=>16408,53044=>16409,53045=>16410,53046=>16411,53047=>16412,53049=>16413,53050=>16414,53051=>16415,53052=>16416,53053=>16417,53054=>16418,53055=>16419,53056=>16420,53057=>16421,53058=>16422,53059=>16423,53060=>16424,53061=>16425,53062=>16426,53063=>16427,53064=>16428,53065=>16429,53066=>16430,53067=>16431,53068=>16432,53069=>16433,53070=>16434,53071=>16435,53072=>16436,53073=>16437,53074=>16438,53075=>16439,53078=>16440,53079=>16441,53081=>16442,53082=>16443,53083=>16444,53085=>16445,53086=>16446,53087=>16447,53088=>16448,53089=>16449,53090=>16450,53091=>16451,53094=>16452,53096=>16453,53098=>16454,53099=>16455,53100=>16456,53101=>16457,53102=>16458,53103=>16459,53106=>16460,53107=>16461,53109=>16462,53110=>16463,53111=>16464,53113=>16465,53114=>16466,53115=>16467,53116=>16468,53117=>16469,53118=>16470,53119=>16471,53121=>16472,53122=>16473,53123=>16474,53124=>16475,53126=>16476,53127=>16477,53128=>16478,53129=>16479,53130=>16480,53131=>16481,53133=>16482,53134=>16483,53135=>16484,53136=>16485,53137=>16486,53138=>16487,53139=>16488,53140=>16489,53141=>16490,53142=>16491,53143=>16492,53144=>16493,53145=>16494,53146=>16495,53147=>16496,53148=>16497,53149=>16498,53150=>16499,53151=>16500,53152=>16501,53154=>16502,53155=>16503,53156=>16504,53157=>16505,53158=>16506,53159=>16507,53161=>16508,53162=>16509,53163=>16510,53164=>16511,53165=>16512,53166=>16513,53167=>16514,53169=>16515,53170=>16516,53171=>16517,53172=>16518,53173=>16519,53174=>16520,53175=>16521,53176=>16522,53177=>16523,53178=>16524,53179=>16525,53180=>16526,53181=>16527,53182=>16528,53183=>16529,53184=>16530,53185=>16531,53186=>16532,53187=>16533,53189=>16534,53190=>16535,53191=>16536,53192=>16537,53193=>16538,53194=>16539,53195=>16540,53196=>16541,53197=>16542,53198=>16543,53199=>16544,53200=>16545,53201=>16546,53202=>16547,53203=>16548,53204=>16549,53205=>16550,53206=>16551,53207=>16552,53208=>16553,53209=>16554,53210=>16555,53211=>16556,53212=>16557,53213=>16558,53214=>16559,53215=>16560,53218=>16561,53219=>16562,53221=>16563,53222=>16564,53223=>16565,53225=>16566,53226=>16567,53227=>16568,53228=>16569,53229=>16570,53230=>16571,53231=>16572,53234=>16573,53236=>16574,53238=>16575,53239=>16576,53240=>16577,53241=>16578,53242=>16579,53243=>16580,53245=>16581,53246=>16582,53247=>16583,53249=>16584,53250=>16585,53251=>16586,53253=>16587,53254=>16588,53255=>16589,53256=>16590,53257=>16591,53258=>16592,53259=>16593,53260=>16594,53261=>16595,53262=>16596,53263=>16597,53264=>16598,53266=>16599,53267=>16600,53268=>16601,53269=>16602,53270=>16603,53271=>16604,53273=>16605,53274=>16606,53275=>16607,53276=>16608,53277=>16609,53278=>16610,53279=>16611,53280=>16612,53281=>16613,53282=>16614,53283=>16615,53284=>16616,53285=>16617,53286=>16618,53287=>16619,53288=>16620,53289=>16621,53290=>16622,53291=>16623,53292=>16624,53294=>16625,53295=>16626,53296=>16627,53297=>16628,53298=>16629,53299=>16630,53302=>16631,53303=>16632,53305=>16633,53306=>16634,53307=>16635,53309=>16636,53310=>16637,53311=>16638,53312=>16639,53313=>16640,53314=>16641,53315=>16642,53318=>16643,53320=>16644,53322=>16645,53323=>16646,53324=>16647,53325=>16648,53326=>16649,53327=>16650,53329=>16651,53330=>16652,53331=>16653,53333=>16654,53334=>16655,53335=>16656,53337=>16657,53338=>16658,53339=>16659,53340=>16660,53341=>16661,53342=>16662,53343=>16663,53345=>16664,53346=>16665,53347=>16666,53348=>16667,53349=>16668,53350=>16669,53351=>16670,53352=>16671,53353=>16672,53354=>16673,53355=>16674,53358=>16675,53359=>16676,53361=>16677,53362=>16678,53363=>16679,53365=>16680,53366=>16681,53367=>16682,53368=>16683,53369=>16684,53370=>16685,53371=>16686,53374=>16687,53375=>16688,53376=>16689,53378=>16690,53379=>16691,53380=>16692,53381=>16693,53382=>16694,53383=>16695,53384=>16696,53385=>16697,53386=>16698,53387=>16699,53388=>16700,53389=>16701,53390=>16702,53391=>16703,53392=>16704,53393=>16705,53394=>16706,53395=>16707,53396=>16708,53397=>16709,53398=>16710,53399=>16711,53400=>16712,53401=>16713,53402=>16714,53403=>16715,53404=>16716,53405=>16717,53406=>16718,53407=>16719,53408=>16720,53409=>16721,53410=>16722,53411=>16723,53414=>16724,53415=>16725,53417=>16726,53418=>16727,53419=>16728,53421=>16729,53422=>16730,53423=>16731,53424=>16732,53425=>16733,53426=>16734,53427=>16735,53430=>16736,53432=>16737,53434=>16738,53435=>16739,53436=>16740,53437=>16741,53438=>16742,53439=>16743,53442=>16744,53443=>16745,53445=>16746,53446=>16747,53447=>16748,53450=>16749,53451=>16750,53452=>16751,53453=>16752,53454=>16753,53455=>16754,53458=>16755,53462=>16756,53463=>16757,53464=>16758,53465=>16759,53466=>16760,53467=>16761,53470=>16762,53471=>16763,53473=>16764,53474=>16765,53475=>16766,53477=>16767,53478=>16768,53479=>16769,53480=>16770,53481=>16771,53482=>16772,53483=>16773,53486=>16774,53490=>16775,53491=>16776,53492=>16777,53493=>16778,53494=>16779,53495=>16780,53497=>16781,53498=>16782,53499=>16783,53500=>16784,53501=>16785,53502=>16786,53503=>16787,53504=>16788,53505=>16789,53506=>16790,53507=>16791,53508=>16792,53509=>16793,53510=>16794,53511=>16795,53512=>16796,53513=>16797,53514=>16798,53515=>16799,53516=>16800,53518=>16801,53519=>16802,53520=>16803,53521=>16804,53522=>16805,53523=>16806,53524=>16807,53525=>16808,53526=>16809,53527=>16810,53528=>16811,53529=>16812,53530=>16813,53531=>16814,53532=>16815,53533=>16816,53534=>16817,53535=>16818,53536=>16819,53537=>16820,53538=>16821,53539=>16822,53540=>16823,53541=>16824,53542=>16825,53543=>16826,53544=>16827,53545=>16828,53546=>16829,53547=>16830,53548=>16831,53549=>16832,53550=>16833,53551=>16834,53554=>16835,53555=>16836,53557=>16837,53558=>16838,53559=>16839,53561=>16840,53563=>16841,53564=>16842,53565=>16843,53566=>16844,53567=>16845,53570=>16846,53574=>16847,53575=>16848,53576=>16849,53577=>16850,53578=>16851,53579=>16852,53582=>16853,53583=>16854,53585=>16855,53586=>16856,53587=>16857,53589=>16858,53590=>16859,53591=>16860,53592=>16861,53593=>16862,53594=>16863,53595=>16864,53598=>16865,53600=>16866,53602=>16867,53603=>16868,53604=>16869,53605=>16870,53606=>16871,53607=>16872,53609=>16873,53610=>16874,53611=>16875,53613=>16876,53614=>16877,53615=>16878,53616=>16879,53617=>16880,53618=>16881,53619=>16882,53620=>16883,53621=>16884,53622=>16885,53623=>16886,53624=>16887,53625=>16888,53626=>16889,53627=>16890,53629=>16891,53630=>16892,53631=>16893,53632=>16894,53633=>16895,53634=>16896,53635=>16897,53637=>16898,53638=>16899,53639=>16900,53641=>16901,53642=>16902,53643=>16903,53644=>16904,53645=>16905,53646=>16906,53647=>16907,53648=>16908,53649=>16909,53650=>16910,53651=>16911,53652=>16912,53653=>16913,53654=>16914,53655=>16915,53656=>16916,53657=>16917,53658=>16918,53659=>16919,53660=>16920,53661=>16921,53662=>16922,53663=>16923,53666=>16924,53667=>16925,53669=>16926,53670=>16927,53671=>16928,53673=>16929,53674=>16930,53675=>16931,53676=>16932,53677=>16933,53678=>16934,53679=>16935,53682=>16936,53684=>16937,53686=>16938,53687=>16939,53688=>16940,53689=>16941,53691=>16942,53693=>16943,53694=>16944,53695=>16945,53697=>16946,53698=>16947,53699=>16948,53700=>16949,53701=>16950,53702=>16951,53703=>16952,53704=>16953,53705=>16954,53706=>16955,53707=>16956,53708=>16957,53709=>16958,53710=>16959,53711=>16960,53712=>16961,53713=>16962,53714=>16963,53715=>16964,53716=>16965,53717=>16966,53718=>16967,53719=>16968,53721=>16969,53722=>16970,53723=>16971,53724=>16972,53725=>16973,53726=>16974,53727=>16975,53728=>16976,53729=>16977,53730=>16978,53731=>16979,53732=>16980,53733=>16981,53734=>16982,53735=>16983,53736=>16984,53737=>16985,53738=>16986,53739=>16987,53740=>16988,53741=>16989,53742=>16990,53743=>16991,53744=>16992,53745=>16993,53746=>16994,53747=>16995,53749=>16996,53750=>16997,53751=>16998,53753=>16999,53754=>17000,53755=>17001,53756=>17002,53757=>17003,53758=>17004,53759=>17005,53760=>17006,53761=>17007,53762=>17008,53763=>17009,53764=>17010,53765=>17011,53766=>17012,53768=>17013,53770=>17014,53771=>17015,53772=>17016,53773=>17017,53774=>17018,53775=>17019,53777=>17020,53778=>17021,53779=>17022,53780=>17023,53781=>17024,53782=>17025,53783=>17026,53784=>17027,53785=>17028,53786=>17029,53787=>17030,53788=>17031,53789=>17032,53790=>17033,53791=>17034,53792=>17035,53793=>17036,53794=>17037,53795=>17038,53796=>17039,53797=>17040,53798=>17041,53799=>17042,53800=>17043,53801=>17044,53802=>17045,53803=>17046,53806=>17047,53807=>17048,53809=>17049,53810=>17050,53811=>17051,53813=>17052,53814=>17053,53815=>17054,53816=>17055,53817=>17056,53818=>17057,53819=>17058,53822=>17059,53824=>17060,53826=>17061,53827=>17062,53828=>17063,53829=>17064,53830=>17065,53831=>17066,53833=>17067,53834=>17068,53835=>17069,53836=>17070,53837=>17071,53838=>17072,53839=>17073,53840=>17074,53841=>17075,53842=>17076,53843=>17077,53844=>17078,53845=>17079,53846=>17080,53847=>17081,53848=>17082,53849=>17083,53850=>17084,53851=>17085,53853=>17086,53854=>17087,53855=>17088,53856=>17089,53857=>17090,53858=>17091,53859=>17092,53861=>17093,53862=>17094,53863=>17095,53864=>17096,53865=>17097,53866=>17098,53867=>17099,53868=>17100,53869=>17101,53870=>17102,53871=>17103,53872=>17104,53873=>17105,53874=>17106,53875=>17107,53876=>17108,53877=>17109,53878=>17110,53879=>17111,53880=>17112,53881=>17113,53882=>17114,53883=>17115,53884=>17116,53885=>17117,53886=>17118,53887=>17119,53890=>17120,53891=>17121,53893=>17122,53894=>17123,53895=>17124,53897=>17125,53898=>17126,53899=>17127,53900=>17128,53901=>17129,53902=>17130,53903=>17131,53906=>17132,53907=>17133,53908=>17134,53910=>17135,53911=>17136,53912=>17137,53913=>17138,53914=>17139,53915=>17140,53917=>17141,53918=>17142,53919=>17143,53921=>17144,53922=>17145,53923=>17146,53925=>17147,53926=>17148,53927=>17149,53928=>17150,53929=>17151,53930=>17152,53931=>17153,53933=>17154,53934=>17155,53935=>17156,53936=>17157,53938=>17158,53939=>17159,53940=>17160,53941=>17161,53942=>17162,53943=>17163,53946=>17164,53947=>17165,53949=>17166,53950=>17167,53953=>17168,53955=>17169,53956=>17170,53957=>17171,53958=>17172,53959=>17173,53962=>17174,53964=>17175,53965=>17176,53966=>17177,53967=>17178,53968=>17179,53969=>17180,53970=>17181,53971=>17182,53973=>17183,53974=>17184,53975=>17185,53977=>17186,53978=>17187,53979=>17188,53981=>17189,53982=>17190,53983=>17191,53984=>17192,53985=>17193,53986=>17194,53987=>17195,53990=>17196,53991=>17197,53992=>17198,53993=>17199,53994=>17200,53995=>17201,53996=>17202,53997=>17203,53998=>17204,53999=>17205,54002=>17206,54003=>17207,54005=>17208,54006=>17209,54007=>17210,54009=>17211,54010=>17212,54011=>17213,54012=>17214,54013=>17215,54014=>17216,54015=>17217,54018=>17218,54020=>17219,54022=>17220,54023=>17221,54024=>17222,54025=>17223,54026=>17224,54027=>17225,54031=>17226,54033=>17227,54034=>17228,54035=>17229,54037=>17230,54039=>17231,54040=>17232,54041=>17233,54042=>17234,54043=>17235,54046=>17236,54050=>17237,54051=>17238,54052=>17239,54054=>17240,54055=>17241,54058=>17242,54059=>17243,54061=>17244,54062=>17245,54063=>17246,54065=>17247,54066=>17248,54067=>17249,54068=>17250,54069=>17251,54070=>17252,54071=>17253,54074=>17254,54078=>17255,54079=>17256,54080=>17257,54081=>17258,54082=>17259,54083=>17260,54086=>17261,54087=>17262,54088=>17263,54089=>17264,54090=>17265,54091=>17266,54092=>17267,54093=>17268,54094=>17269,54095=>17270,54096=>17271,54097=>17272,54098=>17273,54099=>17274,54100=>17275,54101=>17276,54102=>17277,54103=>17278,54104=>17279,54105=>17280,54106=>17281,54107=>17282,54108=>17283,54109=>17284,54110=>17285,54111=>17286,54112=>17287,54113=>17288,54114=>17289,54115=>17290,54116=>17291,54117=>17292,54118=>17293,54119=>17294,54120=>17295,54121=>17296,54122=>17297,54123=>17298,54124=>17299,54125=>17300,54126=>17301,54127=>17302,54128=>17303,54129=>17304,54130=>17305,54131=>17306,54132=>17307,54133=>17308,54134=>17309,54135=>17310,54136=>17311,54137=>17312,54138=>17313,54139=>17314,54142=>17315,54143=>17316,54145=>17317,54146=>17318,54147=>17319,54149=>17320,54150=>17321,54151=>17322,54152=>17323,54153=>17324,54154=>17325,54155=>17326,54158=>17327,54162=>17328,54163=>17329,54164=>17330,54165=>17331,54166=>17332,54167=>17333,54170=>17334,54171=>17335,54173=>17336,54174=>17337,54175=>17338,54177=>17339,54178=>17340,54179=>17341,54180=>17342,54181=>17343,54182=>17344,54183=>17345,54186=>17346,54188=>17347,54190=>17348,54191=>17349,54192=>17350,54193=>17351,54194=>17352,54195=>17353,54197=>17354,54198=>17355,54199=>17356,54201=>17357,54202=>17358,54203=>17359,54205=>17360,54206=>17361,54207=>17362,54208=>17363,54209=>17364,54210=>17365,54211=>17366,54214=>17367,54215=>17368,54218=>17369,54219=>17370,54220=>17371,54221=>17372,54222=>17373,54223=>17374,54225=>17375,54226=>17376,54227=>17377,54228=>17378,54229=>17379,54230=>17380,54231=>17381,54233=>17382,54234=>17383,54235=>17384,54236=>17385,54237=>17386,54238=>17387,54239=>17388,54240=>17389,54242=>17390,54244=>17391,54245=>17392,54246=>17393,54247=>17394,54248=>17395,54249=>17396,54250=>17397,54251=>17398,54254=>17399,54255=>17400,54257=>17401,54258=>17402,54259=>17403,54261=>17404,54262=>17405,54263=>17406,54264=>17407,54265=>17408,54266=>17409,54267=>17410,54270=>17411,54272=>17412,54274=>17413,54275=>17414,54276=>17415,54277=>17416,54278=>17417,54279=>17418,54281=>17419,54282=>17420,54283=>17421,54284=>17422,54285=>17423,54286=>17424,54287=>17425,54288=>17426,54289=>17427,54290=>17428,54291=>17429,54292=>17430,54293=>17431,54294=>17432,54295=>17433,54296=>17434,54297=>17435,54298=>17436,54299=>17437,54300=>17438,54302=>17439,54303=>17440,54304=>17441,54305=>17442,54306=>17443,54307=>17444,54308=>17445,54309=>17446,54310=>17447,54311=>17448,54312=>17449,54313=>17450,54314=>17451,54315=>17452,54316=>17453,54317=>17454,54318=>17455,54319=>17456,54320=>17457,54321=>17458,54322=>17459,54323=>17460,54324=>17461,54325=>17462,54326=>17463,54327=>17464,54328=>17465,54329=>17466,54330=>17467,54331=>17468,54332=>17469,54333=>17470,54334=>17471,54335=>17472,54337=>17473,54338=>17474,54339=>17475,54341=>17476,54342=>17477,54343=>17478,54344=>17479,54345=>17480,54346=>17481,54347=>17482,54348=>17483,54349=>17484,54350=>17485,54351=>17486,54352=>17487,54353=>17488,54354=>17489,54355=>17490,54356=>17491,54357=>17492,54358=>17493,54359=>17494,54360=>17495,54361=>17496,54362=>17497,54363=>17498,54365=>17499,54366=>17500,54367=>17501,54369=>17502,54370=>17503,54371=>17504,54373=>17505,54374=>17506,54375=>17507,54376=>17508,54377=>17509,54378=>17510,54379=>17511,54380=>17512,54382=>17513,54384=>17514,54385=>17515,54386=>17516,54387=>17517,54388=>17518,54389=>17519,54390=>17520,54391=>17521,54394=>17522,54395=>17523,54397=>17524,54398=>17525,54401=>17526,54403=>17527,54404=>17528,54405=>17529,54406=>17530,54407=>17531,54410=>17532,54412=>17533,54414=>17534,54415=>17535,54416=>17536,54417=>17537,54418=>17538,54419=>17539,54421=>17540,54422=>17541,54423=>17542,54424=>17543,54425=>17544,54426=>17545,54427=>17546,54428=>17547,54429=>17548,54430=>17549,54431=>17550,54432=>17551,54433=>17552,54434=>17553,54435=>17554,54436=>17555,54437=>17556,54438=>17557,54439=>17558,54440=>17559,54442=>17560,54443=>17561,54444=>17562,54445=>17563,54446=>17564,54447=>17565,54448=>17566,54449=>17567,54450=>17568,54451=>17569,54452=>17570,54453=>17571,54454=>17572,54455=>17573,54456=>17574,54457=>17575,54458=>17576,54459=>17577,54460=>17578,54461=>17579,54462=>17580,54463=>17581,54464=>17582,54465=>17583,54466=>17584,54467=>17585,54468=>17586,54469=>17587,54470=>17588,54471=>17589,54472=>17590,54473=>17591,54474=>17592,54475=>17593,54477=>17594,54478=>17595,54479=>17596,54481=>17597,54482=>17598,54483=>17599,54485=>17600,54486=>17601,54487=>17602,54488=>17603,54489=>17604,54490=>17605,54491=>17606,54493=>17607,54494=>17608,54496=>17609,54497=>17610,54498=>17611,54499=>17612,54500=>17613,54501=>17614,54502=>17615,54503=>17616,54505=>17617,54506=>17618,54507=>17619,54509=>17620,54510=>17621,54511=>17622,54513=>17623,54514=>17624,54515=>17625,54516=>17626,54517=>17627,54518=>17628,54519=>17629,54521=>17630,54522=>17631,54524=>17632,54526=>17633,54527=>17634,54528=>17635,54529=>17636,54530=>17637,54531=>17638,54533=>17639,54534=>17640,54535=>17641,54537=>17642,54538=>17643,54539=>17644,54541=>17645,54542=>17646,54543=>17647,54544=>17648,54545=>17649,54546=>17650,54547=>17651,54550=>17652,54552=>17653,54553=>17654,54554=>17655,54555=>17656,54556=>17657,54557=>17658,54558=>17659,54559=>17660,54560=>17661,54561=>17662,54562=>17663,54563=>17664,54564=>17665,54565=>17666,54566=>17667,54567=>17668,54568=>17669,54569=>17670,54570=>17671,54571=>17672,54572=>17673,54573=>17674,54574=>17675,54575=>17676,54576=>17677,54577=>17678,54578=>17679,54579=>17680,54580=>17681,54581=>17682,54582=>17683,54583=>17684,54584=>17685,54585=>17686,54586=>17687,54587=>17688,54590=>17689,54591=>17690,54593=>17691,54594=>17692,54595=>17693,54597=>17694,54598=>17695,54599=>17696,54600=>17697,54601=>17698,54602=>17699,54603=>17700,54606=>17701,54608=>17702,54610=>17703,54611=>17704,54612=>17705,54613=>17706,54614=>17707,54615=>17708,54618=>17709,54619=>17710,54621=>17711,54622=>17712,54623=>17713,54625=>17714,54626=>17715,54627=>17716,54628=>17717,54630=>17718,54631=>17719,54634=>17720,54636=>17721,54638=>17722,54639=>17723,54640=>17724,54641=>17725,54642=>17726,54643=>17727,54646=>17728,54647=>17729,54649=>17730,54650=>17731,54651=>17732,54653=>17733,54654=>17734,54655=>17735,54656=>17736,54657=>17737,54658=>17738,54659=>17739,54662=>17740,54666=>17741,54667=>17742,54668=>17743,54669=>17744,54670=>17745,54671=>17746,54673=>17747,54674=>17748,54675=>17749,54676=>17750,54677=>17751,54678=>17752,54679=>17753,54680=>17754,54681=>17755,54682=>17756,54683=>17757,54684=>17758,54685=>17759,54686=>17760,54687=>17761,54688=>17762,54689=>17763,54690=>17764,54691=>17765,54692=>17766,54694=>17767,54695=>17768,54696=>17769,54697=>17770,54698=>17771,54699=>17772,54700=>17773,54701=>17774,54702=>17775,54703=>17776,54704=>17777,54705=>17778,54706=>17779,54707=>17780,54708=>17781,54709=>17782,54710=>17783,54711=>17784,54712=>17785,54713=>17786,54714=>17787,54715=>17788,54716=>17789,54717=>17790,54718=>17791,54719=>17792,54720=>17793,54721=>17794,54722=>17795,54723=>17796,54724=>17797,54725=>17798,54726=>17799,54727=>17800,54730=>17801,54731=>17802,54733=>17803,54734=>17804,54735=>17805,54737=>17806,54739=>17807,54740=>17808,54741=>17809,54742=>17810,54743=>17811,54746=>17812,54748=>17813,54750=>17814,54751=>17815,54752=>17816,54753=>17817,54754=>17818,54755=>17819,54758=>17820,54759=>17821,54761=>17822,54762=>17823,54763=>17824,54765=>17825,54766=>17826,54767=>17827,54768=>17828,54769=>17829,54770=>17830,54771=>17831,54774=>17832,54776=>17833,54778=>17834,54779=>17835,54780=>17836,54781=>17837,54782=>17838,54783=>17839,54786=>17840,54787=>17841,54789=>17842,54790=>17843,54791=>17844,54793=>17845,54794=>17846,54795=>17847,54796=>17848,54797=>17849,54798=>17850,54799=>17851,54802=>17852,54806=>17853,54807=>17854,54808=>17855,54809=>17856,54810=>17857,54811=>17858,54813=>17859,54814=>17860,54815=>17861,54817=>17862,54818=>17863,54819=>17864,54821=>17865,54822=>17866,54823=>17867,54824=>17868,54825=>17869,54826=>17870,54827=>17871,54828=>17872,54830=>17873,54831=>17874,54832=>17875,54833=>17876,54834=>17877,54835=>17878,54836=>17879,54837=>17880,54838=>17881,54839=>17882,54842=>17883,54843=>17884,54845=>17885,54846=>17886,54847=>17887,54849=>17888,54850=>17889,54851=>17890,54852=>17891,54854=>17892,54855=>17893,54858=>17894,54860=>17895,54862=>17896,54863=>17897,54864=>17898,54866=>17899,54867=>17900,54870=>17901,54871=>17902,54873=>17903,54874=>17904,54875=>17905,54877=>17906,54878=>17907,54879=>17908,54880=>17909,54881=>17910,54882=>17911,54883=>17912,54884=>17913,54885=>17914,54886=>17915,54888=>17916,54890=>17917,54891=>17918,54892=>17919,54893=>17920,54894=>17921,54895=>17922,54898=>17923,54899=>17924,54901=>17925,54902=>17926,54903=>17927,54904=>17928,54905=>17929,54906=>17930,54907=>17931,54908=>17932,54909=>17933,54910=>17934,54911=>17935,54912=>17936,54913=>17937,54914=>17938,54916=>17939,54918=>17940,54919=>17941,54920=>17942,54921=>17943,54922=>17944,54923=>17945,54926=>17946,54927=>17947,54929=>17948,54930=>17949,54931=>17950,54933=>17951,54934=>17952,54935=>17953,54936=>17954,54937=>17955,54938=>17956,54939=>17957,54940=>17958,54942=>17959,54944=>17960,54946=>17961,54947=>17962,54948=>17963,54949=>17964,54950=>17965,54951=>17966,54953=>17967,54954=>17968,54955=>17969,54957=>17970,54958=>17971,54959=>17972,54961=>17973,54962=>17974,54963=>17975,54964=>17976,54965=>17977,54966=>17978,54967=>17979,54968=>17980,54970=>17981,54972=>17982,54973=>17983,54974=>17984,54975=>17985,54976=>17986,54977=>17987,54978=>17988,54979=>17989,54982=>17990,54983=>17991,54985=>17992,54986=>17993,54987=>17994,54989=>17995,54990=>17996,54991=>17997,54992=>17998,54994=>17999,54995=>18000,54997=>18001,54998=>18002,55000=>18003,55002=>18004,55003=>18005,55004=>18006,55005=>18007,55006=>18008,55007=>18009,55009=>18010,55010=>18011,55011=>18012,55013=>18013,55014=>18014,55015=>18015,55017=>18016,55018=>18017,55019=>18018,55020=>18019,55021=>18020,55022=>18021,55023=>18022,55025=>18023,55026=>18024,55027=>18025,55028=>18026,55030=>18027,55031=>18028,55032=>18029,55033=>18030,55034=>18031,55035=>18032,55038=>18033,55039=>18034,55041=>18035,55042=>18036,55043=>18037,55045=>18038,55046=>18039,55047=>18040,55048=>18041,55049=>18042,55050=>18043,55051=>18044,55052=>18045,55053=>18046,55054=>18047,55055=>18048,55056=>18049,55058=>18050,55059=>18051,55060=>18052,55061=>18053,55062=>18054,55063=>18055,55066=>18056,55067=>18057,55069=>18058,55070=>18059,55071=>18060,55073=>18061,55074=>18062,55075=>18063,55076=>18064,55077=>18065,55078=>18066,55079=>18067,55082=>18068,55084=>18069,55086=>18070,55087=>18071,55088=>18072,55089=>18073,55090=>18074,55091=>18075,55094=>18076,55095=>18077,55097=>18078,55098=>18079,55099=>18080,55101=>18081,55102=>18082,55103=>18083,55104=>18084,55105=>18085,55106=>18086,55107=>18087,55109=>18088,55110=>18089,55112=>18090,55114=>18091,55115=>18092,55116=>18093,55117=>18094,55118=>18095,55119=>18096,55122=>18097,55123=>18098,55125=>18099,55130=>18100,55131=>18101,55132=>18102,55133=>18103,55134=>18104,55135=>18105,55138=>18106,55140=>18107,55142=>18108,55143=>18109,55144=>18110,55146=>18111,55147=>18112,55149=>18113,55150=>18114,55151=>18115,55153=>18116,55154=>18117,55155=>18118,55157=>18119,55158=>18120,55159=>18121,55160=>18122,55161=>18123,55162=>18124,55163=>18125,55166=>18126,55167=>18127,55168=>18128,55170=>18129,55171=>18130,55172=>18131,55173=>18132,55174=>18133,55175=>18134,55178=>18135,55179=>18136,55181=>18137,55182=>18138,55183=>18139,55185=>18140,55186=>18141,55187=>18142,55188=>18143,55189=>18144,55190=>18145,55191=>18146,55194=>18147,55196=>18148,55198=>18149,55199=>18150,55200=>18151,55201=>18152,55202=>18153,55203=>18154);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/fonts/zapfdingbats.php b/htmltest/sites/all/libraries/tcpdf-version/fonts/zapfdingbats.php
new file mode 100644
index 00000000..4c0bd75d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/fonts/zapfdingbats.php
@@ -0,0 +1,12 @@
+<?php
+// TCPDF FONT FILE DESCRIPTION
+$type='core';
+$name='ZapfDingbats';
+$up=-100;
+$ut=50;
+$dw=746;
+$diff='';
+$enc='';
+$desc=array('Flags'=>4,'FontBBox'=>'[-1 -143 981 820]','ItalicAngle'=>0,'Ascent'=>820,'Descent'=>-143,'Leading'=>0,'CapHeight'=>820,'StemV'=>90,'StemH'=>28,'AvgWidth'=>746,'MaxWidth'=>1016,'MissingWidth'=>746);
+$cw=array(0=>746,1=>746,2=>746,3=>746,4=>746,5=>746,6=>746,7=>746,8=>746,9=>746,10=>746,11=>746,12=>746,13=>746,14=>746,15=>746,16=>746,17=>746,18=>746,19=>746,20=>746,21=>746,22=>746,23=>746,24=>746,25=>746,26=>746,27=>746,28=>746,29=>746,30=>746,31=>746,32=>278,33=>974,34=>961,35=>974,36=>980,37=>719,38=>789,39=>790,40=>791,41=>690,42=>960,43=>939,44=>549,45=>855,46=>911,47=>933,48=>911,49=>945,50=>974,51=>755,52=>846,53=>762,54=>761,55=>571,56=>677,57=>763,58=>760,59=>759,60=>754,61=>494,62=>552,63=>537,64=>577,65=>692,66=>786,67=>788,68=>788,69=>790,70=>793,71=>794,72=>816,73=>823,74=>789,75=>841,76=>823,77=>833,78=>816,79=>831,80=>923,81=>744,82=>723,83=>749,84=>790,85=>792,86=>695,87=>776,88=>768,89=>792,90=>759,91=>707,92=>708,93=>682,94=>701,95=>826,96=>815,97=>789,98=>789,99=>707,100=>687,101=>696,102=>689,103=>786,104=>787,105=>713,106=>791,107=>785,108=>791,109=>873,110=>761,111=>762,112=>762,113=>759,114=>759,115=>892,116=>892,117=>788,118=>784,119=>438,120=>138,121=>277,122=>415,123=>392,124=>392,125=>668,126=>668,127=>746,128=>390,129=>390,130=>317,131=>317,132=>276,133=>276,134=>509,135=>509,136=>410,137=>410,138=>234,139=>234,140=>334,141=>334,142=>746,143=>746,144=>746,145=>746,146=>746,147=>746,148=>746,149=>746,150=>746,151=>746,152=>746,153=>746,154=>746,155=>746,156=>746,157=>746,158=>746,159=>746,160=>746,161=>732,162=>544,163=>544,164=>910,165=>667,166=>760,167=>760,168=>776,169=>595,170=>694,171=>626,172=>788,173=>788,174=>788,175=>788,176=>788,177=>788,178=>788,179=>788,180=>788,181=>788,182=>788,183=>788,184=>788,185=>788,186=>788,187=>788,188=>788,189=>788,190=>788,191=>788,192=>788,193=>788,194=>788,195=>788,196=>788,197=>788,198=>788,199=>788,200=>788,201=>788,202=>788,203=>788,204=>788,205=>788,206=>788,207=>788,208=>788,209=>788,210=>788,211=>788,212=>894,213=>838,214=>1016,215=>458,216=>748,217=>924,218=>748,219=>918,220=>927,221=>928,222=>928,223=>834,224=>873,225=>828,226=>924,227=>924,228=>917,229=>930,230=>931,231=>463,232=>883,233=>836,234=>836,235=>867,236=>867,237=>696,238=>696,239=>874,240=>746,241=>874,242=>760,243=>946,244=>771,245=>865,246=>771,247=>888,248=>967,249=>888,250=>831,251=>873,252=>927,253=>970,254=>918,255=>746);
+// --- EOF ---
diff --git a/htmltest/sites/all/libraries/tcpdf-version/include/barcodes/datamatrix.php b/htmltest/sites/all/libraries/tcpdf-version/include/barcodes/datamatrix.php
new file mode 100644
index 00000000..775e5cb1
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/include/barcodes/datamatrix.php
@@ -0,0 +1,1149 @@
+<?php
+//============================================================+
+// File name   : datamatrix.php
+// Version     : 1.0.004
+// Begin       : 2010-06-07
+// Last Update : 2013-02-04
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2010-2012  Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// DESCRIPTION :
+//
+// Class to create DataMatrix ECC 200 barcode arrays for TCPDF class.
+// DataMatrix (ISO/IEC 16022:2006) is a 2-dimensional bar code.
+//============================================================+
+
+/**
+* @file
+* Class to create DataMatrix ECC 200 barcode arrays for TCPDF class.
+* DataMatrix (ISO/IEC 16022:2006) is a 2-dimensional bar code.
+*
+* @package com.tecnick.tcpdf
+* @author Nicola Asuni
+* @version 1.0.004
+*/
+
+// custom definitions
+if (!defined('DATAMATRIXDEFS')) {
+
+	/**
+	 * Indicate that definitions for this class are set
+	 */
+	define('DATAMATRIXDEFS', true);
+
+	// -----------------------------------------------------
+
+} // end of custom definitions
+
+// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
+
+
+/**
+* ASCII encoding: ASCII character 0 to 127 (1 byte per CW)
+*/
+define('ENC_ASCII', 0);
+
+/**
+* C40 encoding: Upper-case alphanumeric (3/2 bytes per CW)
+*/
+define('ENC_C40', 1);
+
+/**
+* TEXT encoding: Lower-case alphanumeric (3/2 bytes per CW)
+*/
+define('ENC_TXT', 2);
+
+/**
+* X12 encoding: ANSI X12 (3/2 byte per CW)
+*/
+define('ENC_X12', 3);
+
+/**
+* EDIFACT encoding: ASCII character 32 to 94 (4/3 bytes per CW)
+*/
+define('ENC_EDF', 4);
+
+/**
+* BASE 256 encoding: ASCII character 0 to 255 (1 byte per CW)
+*/
+define('ENC_BASE256', 5);
+
+/**
+* ASCII extended encoding: ASCII character 128 to 255 (1/2 byte per CW)
+*/
+define('ENC_ASCII_EXT', 6);
+
+/**
+* ASCII number encoding: ASCII digits (2 bytes per CW)
+*/
+define('ENC_ASCII_NUM', 7);
+
+/**
+* @class Datamatrix
+* Class to create DataMatrix ECC 200 barcode arrays for TCPDF class.
+* DataMatrix (ISO/IEC 16022:2006) is a 2-dimensional bar code.
+*
+* @package com.tecnick.tcpdf
+* @author Nicola Asuni
+* @version 1.0.004
+*/
+class Datamatrix {
+
+	/**
+	 * Barcode array to be returned which is readable by TCPDF.
+	 * @protected
+	 */
+	protected $barcode_array = array();
+
+	/**
+	 * Store last used encoding for data codewords.
+	 * @protected
+	 */
+	protected $last_enc = ENC_ASCII;
+
+	/**
+	 * Table of Data Matrix ECC 200 Symbol Attributes:<ul>
+	 * <li>total matrix rows (including finder pattern)</li>
+	 * <li>total matrix cols (including finder pattern)</li>
+	 * <li>total matrix rows (without finder pattern)</li>
+	 * <li>total matrix cols (without finder pattern)</li>
+	 * <li>region data rows (with finder pattern)</li>
+	 * <li>region data col (with finder pattern)</li>
+	 * <li>region data rows (without finder pattern)</li>
+	 * <li>region data col (without finder pattern)</li>
+	 * <li>horizontal regions</li>
+	 * <li>vertical regions</li>
+	 * <li>regions</li>
+	 * <li>data codewords</li>
+	 * <li>error codewords</li>
+	 * <li>blocks</li>
+	 * <li>data codewords per block</li>
+	 * <li>error codewords per block</li>
+	 * </ul>
+	 * @protected
+	 */
+	protected $symbattr = array(
+		// square form ---------------------------------------------------------------------------------------
+		array(0x00a,0x00a,0x008,0x008,0x00a,0x00a,0x008,0x008,0x001,0x001,0x001,0x003,0x005,0x001,0x003,0x005), // 10x10
+		array(0x00c,0x00c,0x00a,0x00a,0x00c,0x00c,0x00a,0x00a,0x001,0x001,0x001,0x005,0x007,0x001,0x005,0x007), // 12x12
+		array(0x00e,0x00e,0x00c,0x00c,0x00e,0x00e,0x00c,0x00c,0x001,0x001,0x001,0x008,0x00a,0x001,0x008,0x00a), // 14x14
+		array(0x010,0x010,0x00e,0x00e,0x010,0x010,0x00e,0x00e,0x001,0x001,0x001,0x00c,0x00c,0x001,0x00c,0x00c), // 16x16
+		array(0x012,0x012,0x010,0x010,0x012,0x012,0x010,0x010,0x001,0x001,0x001,0x012,0x00e,0x001,0x012,0x00e), // 18x18
+		array(0x014,0x014,0x012,0x012,0x014,0x014,0x012,0x012,0x001,0x001,0x001,0x016,0x012,0x001,0x016,0x012), // 20x20
+		array(0x016,0x016,0x014,0x014,0x016,0x016,0x014,0x014,0x001,0x001,0x001,0x01e,0x014,0x001,0x01e,0x014), // 22x22
+		array(0x018,0x018,0x016,0x016,0x018,0x018,0x016,0x016,0x001,0x001,0x001,0x024,0x018,0x001,0x024,0x018), // 24x24
+		array(0x01a,0x01a,0x018,0x018,0x01a,0x01a,0x018,0x018,0x001,0x001,0x001,0x02c,0x01c,0x001,0x02c,0x01c), // 26x26
+		array(0x020,0x020,0x01c,0x01c,0x010,0x010,0x00e,0x00e,0x002,0x002,0x004,0x03e,0x024,0x001,0x03e,0x024), // 32x32
+		array(0x024,0x024,0x020,0x020,0x012,0x012,0x010,0x010,0x002,0x002,0x004,0x056,0x02a,0x001,0x056,0x02a), // 36x36
+		array(0x028,0x028,0x024,0x024,0x014,0x014,0x012,0x012,0x002,0x002,0x004,0x072,0x030,0x001,0x072,0x030), // 40x40
+		array(0x02c,0x02c,0x028,0x028,0x016,0x016,0x014,0x014,0x002,0x002,0x004,0x090,0x038,0x001,0x090,0x038), // 44x44
+		array(0x030,0x030,0x02c,0x02c,0x018,0x018,0x016,0x016,0x002,0x002,0x004,0x0ae,0x044,0x001,0x0ae,0x044), // 48x48
+		array(0x034,0x034,0x030,0x030,0x01a,0x01a,0x018,0x018,0x002,0x002,0x004,0x0cc,0x054,0x002,0x066,0x02a), // 52x52
+		array(0x040,0x040,0x038,0x038,0x010,0x010,0x00e,0x00e,0x004,0x004,0x010,0x118,0x070,0x002,0x08c,0x038), // 64x64
+		array(0x048,0x048,0x040,0x040,0x012,0x012,0x010,0x010,0x004,0x004,0x010,0x170,0x090,0x004,0x05c,0x024), // 72x72
+		array(0x050,0x050,0x048,0x048,0x014,0x014,0x012,0x012,0x004,0x004,0x010,0x1c8,0x0c0,0x004,0x072,0x030), // 80x80
+		array(0x058,0x058,0x050,0x050,0x016,0x016,0x014,0x014,0x004,0x004,0x010,0x240,0x0e0,0x004,0x090,0x038), // 88x88
+		array(0x060,0x060,0x058,0x058,0x018,0x018,0x016,0x016,0x004,0x004,0x010,0x2b8,0x110,0x004,0x0ae,0x044), // 96x96
+		array(0x068,0x068,0x060,0x060,0x01a,0x01a,0x018,0x018,0x004,0x004,0x010,0x330,0x150,0x006,0x088,0x038), // 104x104
+		array(0x078,0x078,0x06c,0x06c,0x014,0x014,0x012,0x012,0x006,0x006,0x024,0x41a,0x198,0x006,0x0af,0x044), // 120x120
+		array(0x084,0x084,0x078,0x078,0x016,0x016,0x014,0x014,0x006,0x006,0x024,0x518,0x1f0,0x008,0x0a3,0x03e), // 132x132
+		array(0x090,0x090,0x084,0x084,0x018,0x018,0x016,0x016,0x006,0x006,0x024,0x616,0x26c,0x00a,0x09c,0x03e), // 144x144
+		// rectangular form (currently unused) ---------------------------------------------------------------------------
+		array(0x008,0x012,0x006,0x010,0x008,0x012,0x006,0x010,0x001,0x001,0x001,0x005,0x007,0x001,0x005,0x007), // 8x18
+		array(0x008,0x020,0x006,0x01c,0x008,0x010,0x006,0x00e,0x001,0x002,0x002,0x00a,0x00b,0x001,0x00a,0x00b), // 8x32
+		array(0x00c,0x01a,0x00a,0x018,0x00c,0x01a,0x00a,0x018,0x001,0x001,0x001,0x010,0x00e,0x001,0x010,0x00e), // 12x26
+		array(0x00c,0x024,0x00a,0x020,0x00c,0x012,0x00a,0x010,0x001,0x002,0x002,0x00c,0x012,0x001,0x00c,0x012), // 12x36
+		array(0x010,0x024,0x00e,0x020,0x010,0x012,0x00e,0x010,0x001,0x002,0x002,0x020,0x018,0x001,0x020,0x018), // 16x36
+		array(0x010,0x030,0x00e,0x02c,0x010,0x018,0x00e,0x016,0x001,0x002,0x002,0x031,0x01c,0x001,0x031,0x01c)  // 16x48
+	);
+
+	/**
+	 * Map encodation modes whit character sets.
+	 * @protected
+	 */
+	protected $chset_id = array(ENC_C40 => 'C40', ENC_TXT => 'TXT', ENC_X12 =>'X12');
+
+	/**
+	 * Basic set of characters for each encodation mode.
+	 * @protected
+	 */
+	protected $chset = array(
+		'C40' => array( // Basic set for C40 ----------------------------------------------------------------------------
+			'S1'=>0x00,'S2'=>0x01,'S3'=>0x02,0x20=>0x03,0x30=>0x04,0x31=>0x05,0x32=>0x06,0x33=>0x07,0x34=>0x08,0x35=>0x09, //
+			0x36=>0x0a,0x37=>0x0b,0x38=>0x0c,0x39=>0x0d,0x41=>0x0e,0x42=>0x0f,0x43=>0x10,0x44=>0x11,0x45=>0x12,0x46=>0x13, //
+			0x47=>0x14,0x48=>0x15,0x49=>0x16,0x4a=>0x17,0x4b=>0x18,0x4c=>0x19,0x4d=>0x1a,0x4e=>0x1b,0x4f=>0x1c,0x50=>0x1d, //
+			0x51=>0x1e,0x52=>0x1f,0x53=>0x20,0x54=>0x21,0x55=>0x22,0x56=>0x23,0x57=>0x24,0x58=>0x25,0x59=>0x26,0x5a=>0x27),//
+		'TXT' => array( // Basic set for TEXT ---------------------------------------------------------------------------
+			'S1'=>0x00,'S2'=>0x01,'S3'=>0x02,0x20=>0x03,0x30=>0x04,0x31=>0x05,0x32=>0x06,0x33=>0x07,0x34=>0x08,0x35=>0x09, //
+			0x36=>0x0a,0x37=>0x0b,0x38=>0x0c,0x39=>0x0d,0x61=>0x0e,0x62=>0x0f,0x63=>0x10,0x64=>0x11,0x65=>0x12,0x66=>0x13, //
+			0x67=>0x14,0x68=>0x15,0x69=>0x16,0x6a=>0x17,0x6b=>0x18,0x6c=>0x19,0x6d=>0x1a,0x6e=>0x1b,0x6f=>0x1c,0x70=>0x1d, //
+			0x71=>0x1e,0x72=>0x1f,0x73=>0x20,0x74=>0x21,0x75=>0x22,0x76=>0x23,0x77=>0x24,0x78=>0x25,0x79=>0x26,0x7a=>0x27),//
+		'SH1' => array( // Shift 1 set ----------------------------------------------------------------------------------
+			0x00=>0x00,0x01=>0x01,0x02=>0x02,0x03=>0x03,0x04=>0x04,0x05=>0x05,0x06=>0x06,0x07=>0x07,0x08=>0x08,0x09=>0x09, //
+			0x0a=>0x0a,0x0b=>0x0b,0x0c=>0x0c,0x0d=>0x0d,0x0e=>0x0e,0x0f=>0x0f,0x10=>0x10,0x11=>0x11,0x12=>0x12,0x13=>0x13, //
+			0x14=>0x14,0x15=>0x15,0x16=>0x16,0x17=>0x17,0x18=>0x18,0x19=>0x19,0x1a=>0x1a,0x1b=>0x1b,0x1c=>0x1c,0x1d=>0x1d, //
+			0x1e=>0x1e,0x1f=>0x1f),                                                                                        //
+		'SH2' => array( // Shift 2 set ----------------------------------------------------------------------------------
+			0x21=>0x00,0x22=>0x01,0x23=>0x02,0x24=>0x03,0x25=>0x04,0x26=>0x05,0x27=>0x06,0x28=>0x07,0x29=>0x08,0x2a=>0x09, //
+			0x2b=>0x0a,0x2c=>0x0b,0x2d=>0x0c,0x2e=>0x0d,0x2f=>0x0e,0x3a=>0x0f,0x3b=>0x10,0x3c=>0x11,0x3d=>0x12,0x3e=>0x13, //
+			0x3f=>0x14,0x40=>0x15,0x5b=>0x16,0x5c=>0x17,0x5d=>0x18,0x5e=>0x19,0x5f=>0x1a,'F1'=>0x1b,'US'=>0x1e),           //
+		'S3C' => array( // Shift 3 set for C40 --------------------------------------------------------------------------
+			0x60=>0x00,0x61=>0x01,0x62=>0x02,0x63=>0x03,0x64=>0x04,0x65=>0x05,0x66=>0x06,0x67=>0x07,0x68=>0x08,0x69=>0x09, //
+			0x6a=>0x0a,0x6b=>0x0b,0x6c=>0x0c,0x6d=>0x0d,0x6e=>0x0e,0x6f=>0x0f,0x70=>0x10,0x71=>0x11,0x72=>0x12,0x73=>0x13, //
+			0x74=>0x14,0x75=>0x15,0x76=>0x16,0x77=>0x17,0x78=>0x18,0x79=>0x19,0x7a=>0x1a,0x7b=>0x1b,0x7c=>0x1c,0x7d=>0x1d, //
+			0x7e=>0x1e,0x7f=>0x1f),
+		'S3T' => array( // Shift 3 set for TEXT -------------------------------------------------------------------------
+			0x60=>0x00,0x41=>0x01,0x42=>0x02,0x43=>0x03,0x44=>0x04,0x45=>0x05,0x46=>0x06,0x47=>0x07,0x48=>0x08,0x49=>0x09, //
+			0x4a=>0x0a,0x4b=>0x0b,0x4c=>0x0c,0x4d=>0x0d,0x4e=>0x0e,0x4f=>0x0f,0x50=>0x10,0x51=>0x11,0x52=>0x12,0x53=>0x13, //
+			0x54=>0x14,0x55=>0x15,0x56=>0x16,0x57=>0x17,0x58=>0x18,0x59=>0x19,0x5a=>0x1a,0x7b=>0x1b,0x7c=>0x1c,0x7d=>0x1d, //
+			0x7e=>0x1e,0x7f=>0x1f),                                                                                        //
+		'X12' => array( // Set for X12 ----------------------------------------------------------------------------------
+			0x0d=>0x00,0x2a=>0x01,0x3e=>0x02,0x20=>0x03,0x30=>0x04,0x31=>0x05,0x32=>0x06,0x33=>0x07,0x34=>0x08,0x35=>0x09, //
+			0x36=>0x0a,0x37=>0x0b,0x38=>0x0c,0x39=>0x0d,0x41=>0x0e,0x42=>0x0f,0x43=>0x10,0x44=>0x11,0x45=>0x12,0x46=>0x13, //
+			0x47=>0x14,0x48=>0x15,0x49=>0x16,0x4a=>0x17,0x4b=>0x18,0x4c=>0x19,0x4d=>0x1a,0x4e=>0x1b,0x4f=>0x1c,0x50=>0x1d, //
+			0x51=>0x1e,0x52=>0x1f,0x53=>0x20,0x54=>0x21,0x55=>0x22,0x56=>0x23,0x57=>0x24,0x58=>0x25,0x59=>0x26,0x5a=>0x27) //
+		);
+
+// -----------------------------------------------------------------------------
+
+	/**
+	 * This is the class constructor.
+	 * Creates a datamatrix object
+	 * @param $code (string) Code to represent using Datamatrix.
+	 * @public
+	 */
+	public function __construct($code) {
+		$barcode_array = array();
+		if ((is_null($code)) OR ($code == '\0') OR ($code == '')) {
+			return false;
+		}
+		// get data codewords
+		$cw = $this->getHighLevelEncoding($code);
+		// number of data codewords
+		$nd = count($cw);
+		// check size
+		if ($nd > 1558) {
+			return false;
+		}
+		// get minimum required matrix size.
+		foreach ($this->symbattr as $params) {
+			if ($params[11] >= $nd) {
+				break;
+			}
+		}
+		if ($params[11] < $nd) {
+			// too much data
+			return false;
+		} elseif ($params[11] > $nd) {
+			// add padding
+			if ($this->last_enc == ENC_EDF) {
+				// switch to ASCII encoding
+				$cw[] = 124;
+				++$nd;
+			} elseif (($this->last_enc != ENC_ASCII) AND ($this->last_enc != ENC_BASE256)) {
+				// switch to ASCII encoding
+				$cw[] = 254;
+				++$nd;
+			}
+			if ($params[11] > $nd) {
+				// add first pad
+				$cw[] = 129;
+				++$nd;
+				// add remaining pads
+				for ($i = $nd; $i < $params[11]; ++$i) {
+					$cw[] = $this->get253StateCodeword(129, $i);
+				}
+			}
+		}
+		// add error correction codewords
+		$cw = $this->getErrorCorrection($cw, $params[13], $params[14], $params[15]);
+		// initialize empty arrays
+		$grid = array_fill(0, ($params[2] * $params[3]), 0);
+		// get placement map
+		$places = $this->getPlacementMap($params[2], $params[3]);
+		// fill the grid with data
+		$grid = array();
+		$i = 0;
+		// region data row max index
+		$rdri = ($params[4] - 1);
+		// region data column max index
+		$rdci = ($params[5] - 1);
+		// for each vertical region
+		for ($vr = 0; $vr < $params[9]; ++$vr) {
+			// for each row on region
+			for ($r = 0; $r < $params[4]; ++$r) {
+				// get row
+				$row = (($vr * $params[4]) + $r);
+				// for each horizontal region
+				for ($hr = 0; $hr < $params[8]; ++$hr) {
+					// for each column on region
+					for ($c = 0; $c < $params[5]; ++$c) {
+						// get column
+						$col = (($hr * $params[5]) + $c);
+						// braw bits by case
+						if ($r == 0) {
+							// top finder pattern
+							if ($c % 2) {
+								$grid[$row][$col] = 0;
+							} else {
+								$grid[$row][$col] = 1;
+							}
+						} elseif ($r == $rdri) {
+							// bottom finder pattern
+							$grid[$row][$col] = 1;
+						} elseif ($c == 0) {
+							// left finder pattern
+							$grid[$row][$col] = 1;
+						} elseif ($c == $rdci) {
+							// right finder pattern
+							if ($r % 2) {
+								$grid[$row][$col] = 1;
+							} else {
+								$grid[$row][$col] = 0;
+							}
+						} else { // data bit
+							if ($places[$i] < 2) {
+								$grid[$row][$col] = $places[$i];
+							} else {
+								// codeword ID
+								$cw_id = (floor($places[$i] / 10) - 1);
+								// codeword BIT mask
+								$cw_bit = pow(2, (8 - ($places[$i] % 10)));
+								$grid[$row][$col] = (($cw[$cw_id] & $cw_bit) == 0) ? 0 : 1;
+							}
+							++$i;
+						}
+					}
+				}
+			}
+		}
+		$this->barcode_array['num_rows'] = $params[0];
+		$this->barcode_array['num_cols'] = $params[1];
+		$this->barcode_array['bcode'] = $grid;
+	}
+
+	/**
+	 * Returns a barcode array which is readable by TCPDF
+	 * @return array barcode array readable by TCPDF;
+	 * @public
+	 */
+	public function getBarcodeArray() {
+		return $this->barcode_array;
+	}
+
+	/**
+	 * Product of two numbers in a Power-of-Two Galois Field
+	 * @param $a (int) first number to multiply.
+	 * @param $b (int) second number to multiply.
+	 * @param $log (array) Log table.
+	 * @param $alog (array) Anti-Log table.
+	 * @param $gf (array) Number of Factors of the Reed-Solomon polynomial.
+	 * @return int product
+	 * @protected
+	 */
+	protected function getGFProduct($a, $b, $log, $alog, $gf) {
+		if (($a == 0) OR ($b == 0)) {
+			return 0;
+		}
+		return ($alog[($log[$a] + $log[$b]) % ($gf - 1)]);
+	}
+
+	/**
+	 * Add error correction codewords to data codewords array (ANNEX E).
+	 * @param $wd (array) Array of datacodewords.
+	 * @param $nb (int) Number of blocks.
+	 * @param $nd (int) Number of data codewords per block.
+	 * @param $nc (int) Number of correction codewords per block.
+	 * @param $gf (int) numner of fields on log/antilog table (power of 2).
+	 * @param $pp (int) The value of its prime modulus polynomial (301 for ECC200).
+	 * @return array data codewords + error codewords
+	 * @protected
+	 */
+	protected function getErrorCorrection($wd, $nb, $nd, $nc, $gf=256, $pp=301) {
+		// generate the log ($log) and antilog ($alog) tables
+		$log[0] = 0;
+		$alog[0] = 1;
+		for ($i = 1; $i < $gf; ++$i) {
+			$alog[$i] = ($alog[($i - 1)] * 2);
+			if ($alog[$i] >= $gf) {
+				$alog[$i] ^= $pp;
+			}
+			$log[$alog[$i]] = $i;
+		}
+		ksort($log);
+		// generate the polynomial coefficients (c)
+		$c = array_fill(0, ($nc + 1), 0);
+		$c[0] = 1;
+		for ($i = 1; $i <= $nc; ++$i) {
+			$c[$i] = $c[($i-1)];
+			for ($j = ($i - 1); $j >= 1; --$j) {
+				$c[$j] = $c[($j - 1)] ^ $this->getGFProduct($c[$j], $alog[$i], $log, $alog, $gf);
+			}
+			$c[0] = $this->getGFProduct($c[0], $alog[$i], $log, $alog, $gf);
+		}
+		ksort($c);
+		// total number of data codewords
+		$num_wd = ($nb * $nd);
+		// total number of error codewords
+		$num_we = ($nb * $nc);
+		// for each block
+		for ($b = 0; $b < $nb; ++$b) {
+			// create interleaved data block
+			$block = array();
+			for ($n = $b; $n < $num_wd; $n += $nb) {
+				$block[] = $wd[$n];
+			}
+			// initialize error codewords
+			$we = array_fill(0, ($nc + 1), 0);
+			// calculate error correction codewords for this block
+			for ($i = 0; $i < $nd; ++$i) {
+				$k = ($we[0] ^ $block[$i]);
+				for ($j = 0; $j < $nc; ++$j) {
+					$we[$j] = ($we[($j + 1)] ^ $this->getGFProduct($k, $c[($nc - $j - 1)], $log, $alog, $gf));
+				}
+			}
+			// add error codewords at the end of data codewords
+			$j = 0;
+			for ($i = $b; $i < $num_we; $i += $nb) {
+				$wd[($num_wd + $i)] = $we[$j];
+				++$j;
+			}
+		}
+		// reorder codewords
+		ksort($wd);
+		return $wd;
+	}
+
+	/**
+	 * Return the 253-state codeword
+	 * @param $cwpad (int) Pad codeword.
+	 * @param $cwpos (int) Number of data codewords from the beginning of encoded data.
+	 * @return pad codeword
+	 * @protected
+	 */
+	protected function get253StateCodeword($cwpad, $cwpos) {
+		$pad = ($cwpad + (((149 * $cwpos) % 253) + 1));
+		if ($pad > 254) {
+			$pad -= 254;
+		}
+		return $pad;
+	}
+
+	/**
+	 * Return the 255-state codeword
+	 * @param $cwpad (int) Pad codeword.
+	 * @param $cwpos (int) Number of data codewords from the beginning of encoded data.
+	 * @return pad codeword
+	 * @protected
+	 */
+	protected function get255StateCodeword($cwpad, $cwpos) {
+		$pad = ($cwpad + (((149 * $cwpos) % 255) + 1));
+		if ($pad > 255) {
+			$pad -= 256;
+		}
+		return $pad;
+	}
+
+	/**
+	 * Returns true if the char belongs to the selected mode
+	 * @param $chr (int) Character (byte) to check.
+	 * @param $mode (int) Current encoding mode.
+	 * @return boolean true if the char is of the selected mode.
+	 * @protected
+	 */
+	protected function isCharMode($chr, $mode) {
+		$status = false;
+		switch ($mode) {
+			case ENC_ASCII: { // ASCII character 0 to 127
+				$status = (($chr >= 0) AND ($chr <= 127));
+				break;
+			}
+			case ENC_C40: { // Upper-case alphanumeric
+				$status = (($chr == 32) OR (($chr >= 48) AND ($chr <= 57)) OR (($chr >= 65) AND ($chr <= 90)));
+				break;
+			}
+			case ENC_TXT: { // Lower-case alphanumeric
+				$status = (($chr == 32) OR (($chr >= 48) AND ($chr <= 57)) OR (($chr >= 97) AND ($chr <= 122)));
+				break;
+			}
+			case ENC_X12: { // ANSI X12
+				$status = (($chr == 13) OR ($chr == 42) OR ($chr == 62));
+				break;
+			}
+			case ENC_EDF: { // ASCII character 32 to 94
+				$status = (($chr >= 32) AND ($chr <= 94));
+				break;
+			}
+			case ENC_BASE256: { // Function character (FNC1, Structured Append, Reader Program, or Code Page)
+				$status = (($chr == 232) OR ($chr == 233) OR ($chr == 234) OR ($chr == 241));
+				break;
+			}
+			case ENC_ASCII_EXT: { // ASCII character 128 to 255
+				$status = (($chr >= 128) AND ($chr <= 255));
+				break;
+			}
+			case ENC_ASCII_NUM: { // ASCII digits
+				$status = (($chr >= 48) AND ($chr <= 57));
+				break;
+			}
+		}
+		return $status;
+	}
+
+	/**
+	 * The look-ahead test scans the data to be encoded to find the best mode (Annex P - steps from J to S).
+	 * @param $data (string) data to encode
+	 * @param $pos (int) current position
+	 * @param $mode (int) current encoding mode
+	 * @return int encoding mode
+	 * @protected
+	 */
+	protected function lookAheadTest($data, $pos, $mode) {
+		$data_length = strlen($data);
+		if ($pos >= $data_length) {
+			return $mode;
+		}
+		$charscount = 0; // count processed chars
+		// STEP J
+		if ($mode == ENC_ASCII) {
+			$numch = array(0, 1, 1, 1, 1, 1.25);
+		} else {
+			$numch = array(1, 2, 2, 2, 2, 2.25);
+			$numch[$mode] = 0;
+		}
+		while (true) {
+			// STEP K
+			if (($pos + $charscount) == $data_length) {
+				if ($numch[ENC_ASCII] <= ceil(min($numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_EDF], $numch[ENC_BASE256]))) {
+					return ENC_ASCII;
+				}
+				if ($numch[ENC_BASE256] < ceil(min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_EDF]))) {
+					return ENC_BASE256;
+				}
+				if ($numch[ENC_EDF] < ceil(min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_BASE256]))) {
+					return ENC_EDF;
+				}
+				if ($numch[ENC_TXT] < ceil(min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_X12], $numch[ENC_EDF], $numch[ENC_BASE256]))) {
+					return ENC_TXT;
+				}
+				if ($numch[ENC_X12] < ceil(min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_EDF], $numch[ENC_BASE256]))) {
+					return ENC_X12;
+				}
+				return ENC_C40;
+			}
+			// get char
+			$chr = ord($data[$pos + $charscount]);
+			$charscount++;
+			// STEP L
+			if ($this->isCharMode($chr, ENC_ASCII_NUM)) {
+				$numch[ENC_ASCII] += (1 / 2);
+			} elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
+				$numch[ENC_ASCII] = ceil($numch[ENC_ASCII]);
+				$numch[ENC_ASCII] += 2;
+			} else {
+				$numch[ENC_ASCII] = ceil($numch[ENC_ASCII]);
+				$numch[ENC_ASCII] += 1;
+			}
+			// STEP M
+			if ($this->isCharMode($chr, ENC_C40)) {
+				$numch[ENC_C40] += (2 / 3);
+			} elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
+				$numch[ENC_C40] += (8 / 3);
+			} else {
+				$numch[ENC_C40] += (4 / 3);
+			}
+			// STEP N
+			if ($this->isCharMode($chr, ENC_TXT)) {
+				$numch[ENC_TXT] += (2 / 3);
+			} elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
+				$numch[ENC_TXT] += (8 / 3);
+			} else {
+				$numch[ENC_TXT] += (4 / 3);
+			}
+			// STEP O
+			if ($this->isCharMode($chr, ENC_X12) OR $this->isCharMode($chr, ENC_C40)) {
+				$numch[ENC_X12] += (2 / 3);
+			} elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
+				$numch[ENC_X12] += (13 / 3);
+			} else {
+				$numch[ENC_X12] += (10 / 3);
+			}
+			// STEP P
+			if ($this->isCharMode($chr, ENC_EDF)) {
+				$numch[ENC_EDF] += (3 / 4);
+			} elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
+				$numch[ENC_EDF] += (17 / 4);
+			} else {
+				$numch[ENC_EDF] += (13 / 4);
+			}
+			// STEP Q
+			if ($this->isCharMode($chr, ENC_BASE256)) {
+				$numch[ENC_BASE256] += 4;
+			} else {
+				$numch[ENC_BASE256] += 1;
+			}
+			// STEP R
+			if ($charscount >= 4) {
+				if (($numch[ENC_ASCII] + 1) <= min($numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_EDF], $numch[ENC_BASE256])) {
+					return ENC_ASCII;
+				}
+				if ((($numch[ENC_BASE256] + 1) <= $numch[ENC_ASCII])
+					OR (($numch[ENC_BASE256] + 1) < min($numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_EDF]))) {
+					return ENC_BASE256;
+				}
+				if (($numch[ENC_EDF] + 1) < min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_BASE256])) {
+					return ENC_EDF;
+				}
+				if (($numch[ENC_TXT] + 1) < min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_X12], $numch[ENC_EDF], $numch[ENC_BASE256])) {
+					return ENC_TXT;
+				}
+				if (($numch[ENC_X12] + 1) < min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_EDF], $numch[ENC_BASE256])) {
+					return ENC_X12;
+				}
+				if (($numch[ENC_C40] + 1) < min($numch[ENC_ASCII], $numch[ENC_TXT], $numch[ENC_EDF], $numch[ENC_BASE256])) {
+					if ($numch[ENC_C40] < $numch[ENC_X12]) {
+						return ENC_C40;
+					}
+					if ($numch[ENC_C40] == $numch[ENC_X12]) {
+						$k = ($pos + $charscount + 1);
+						while ($k < $data_length) {
+							$tmpchr = ord($data{$k});
+							if ($this->isCharMode($tmpchr, ENC_X12)) {
+								return ENC_X12;
+							} elseif (!($this->isCharMode($tmpchr, ENC_X12) OR $this->isCharMode($tmpchr, ENC_C40))) {
+								break;
+							}
+							++$k;
+						}
+						return ENC_C40;
+					}
+				}
+			}
+		} // end of while
+	}
+
+	/**
+	 * Get the switching codeword to a new encoding mode (latch codeword)
+	 * @param $mode (int) New encoding mode.
+	 * @return (int) Switch codeword.
+	 * @protected
+	 */
+	protected function getSwitchEncodingCodeword($mode) {
+		switch ($mode) {
+			case ENC_ASCII: { // ASCII character 0 to 127
+				$cw = 254;
+				break;
+			}
+			case ENC_C40: { // Upper-case alphanumeric
+				$cw = 230;
+				break;
+			}
+			case ENC_TXT: { // Lower-case alphanumeric
+				$cw = 239;
+				break;
+			}
+			case ENC_X12: { // ANSI X12
+				$cw = 238;
+				break;
+			}
+			case ENC_EDF: { // ASCII character 32 to 94
+				$cw = 240;
+				break;
+			}
+			case ENC_BASE256: { // Function character (FNC1, Structured Append, Reader Program, or Code Page)
+				$cw = 231;
+				break;
+			}
+		}
+		return $cw;
+	}
+
+	/**
+	 * Choose the minimum matrix size and return the max number of data codewords.
+	 * @param $numcw (int) Number of current codewords.
+	 * @return number of data codewords in matrix
+	 * @protected
+	 */
+	protected function getMaxDataCodewords($numcw) {
+		foreach ($this->symbattr as $key => $matrix) {
+			if ($matrix[11] >= $numcw) {
+				return $matrix[11];
+			}
+		}
+		return 0;
+	}
+
+	/**
+	 * Get high level encoding using the minimum symbol data characters for ECC 200
+	 * @param $data (string) data to encode
+	 * @return array of codewords
+	 * @protected
+	 */
+	protected function getHighLevelEncoding($data) {
+		// STEP A. Start in ASCII encodation.
+		$enc = ENC_ASCII; // current encoding mode
+		$pos = 0; // current position
+		$cw = array(); // array of codewords to be returned
+		$cw_num = 0; // number of data codewords
+		$data_lenght = strlen($data); // number of chars
+		while ($pos < $data_lenght) {
+			switch ($enc) {
+				case ENC_ASCII: { // STEP B. While in ASCII encodation
+					if (($data_lenght > 1) AND ($pos < ($data_lenght - 1)) AND ($this->isCharMode(ord($data[$pos]), ENC_ASCII_NUM) AND $this->isCharMode(ord($data[$pos + 1]), ENC_ASCII_NUM))) {
+						// 1. If the next data sequence is at least 2 consecutive digits, encode the next two digits as a double digit in ASCII mode.
+						$cw[] = (intval(substr($data, $pos, 2)) + 130);
+						++$cw_num;
+						$pos += 2;
+					} else {
+						// 2. If the look-ahead test (starting at step J) indicates another mode, switch to that mode.
+						$newenc = $this->lookAheadTest($data, $pos, $enc);
+						if ($newenc != $enc) {
+							// switch to new encoding
+							$enc = $newenc;
+							$cw[] = $this->getSwitchEncodingCodeword($enc);
+							++$cw_num;
+						} else {
+							// get new byte
+							$chr = ord($data[$pos]);
+							++$pos;
+							if ($this->isCharMode($chr, ENC_ASCII_EXT)) {
+								// 3. If the next data character is extended ASCII (greater than 127) encode it in ASCII mode first using the Upper Shift (value 235) character.
+								$cw[] = 235;
+								$cw[] = ($chr - 127);
+								$cw_num += 2;
+							} else {
+								// 4. Otherwise process the next data character in ASCII encodation.
+								$cw[] = ($chr + 1);
+								++$cw_num;
+							}
+						}
+					}
+					break;
+				}
+				case ENC_C40 :   // Upper-case alphanumeric
+				case ENC_TXT :   // Lower-case alphanumeric
+				case ENC_X12 : { // ANSI X12
+					$temp_cw = array();
+					$p = 0;
+					$epos = $pos;
+					// get charset ID
+					$set_id = $this->chset_id[$enc];
+					// get basic charset for current encoding
+					$charset = $this->chset[$set_id];
+					do {
+						// 2. process the next character in C40 encodation.
+						$chr = ord($data[$epos]);
+						++$epos;
+						// check for extended character
+						if ($chr & 0x80) {
+							if ($enc == ENC_X12) {
+								return false;
+							}
+							$chr = ($chr & 0x7f);
+							$temp_cw[] = 1; // shift 2
+							$temp_cw[] = 30; // upper shift
+							$p += 2;
+						}
+						if (isset($charset[$chr])) {
+							$temp_cw[] = $charset[$chr];
+							++$p;
+						} else {
+							if (isset($this->chset['SH1'][$chr])) {
+								$temp_cw[] = 0; // shift 1
+								$shiftset = $this->chset['SH1'];
+							} elseif (isset($chr, $this->chset['SH2'][$chr])) {
+								$temp_cw[] = 1; // shift 2
+								$shiftset = $this->chset['SH2'];
+							} elseif (($enc == ENC_C40) AND isset($this->chset['S3C'][$chr])) {
+								$temp_cw[] = 2; // shift 3
+								$shiftset = $this->chset['S3C'];
+							} elseif (($enc == ENC_TXT) AND isset($this->chset['S3T'][$chr])) {
+								$temp_cw[] = 2; // shift 3
+								$shiftset = $this->chset['S3T'];
+							} else {
+								return false;
+							}
+							$temp_cw[] = $shiftset[$chr];
+							$p += 2;
+						}
+						if ($p >= 3) {
+							$c1 = array_shift($temp_cw);
+							$c2 = array_shift($temp_cw);
+							$c3 = array_shift($temp_cw);
+							$p -= 3;
+							$tmp = ((1600 * $c1) + (40 * $c2) + $c3 + 1);
+							$cw[] = ($tmp >> 8);
+							$cw[] = ($tmp % 256);
+							$cw_num += 2;
+							$pos = $epos;
+							// 1. If the C40 encoding is at the point of starting a new double symbol character and if the look-ahead test (starting at step J) indicates another mode, switch to that mode.
+							$newenc = $this->lookAheadTest($data, $pos, $enc);
+							if ($newenc != $enc) {
+								$enc = $newenc;
+								$cw[] = $this->getSwitchEncodingCodeword($enc);
+								++$cw_num;
+								$pos -= $p;
+								$p = 0;
+								break;
+							}
+						}
+					} while (($p > 0) AND ($epos < $data_lenght));
+					// process last data (if any)
+					if ($p > 0) {
+						// get remaining number of data symbols
+						$cwr = ($this->getMaxDataCodewords($cw_num + 2) - $cw_num);
+						if (($cwr == 1) AND ($p == 1)) {
+							// d. If one symbol character remains and one C40 value (data character) remains to be encoded
+							$c1 = array_shift($temp_cw);
+							--$p;
+							$cw[] = ($c1 + 1);
+							++$cw_num;
+						} elseif (($cwr == 2) AND ($p == 1)) {
+							// c. If two symbol characters remain and only one C40 value (data character) remains to be encoded
+							$c1 = array_shift($temp_cw);
+							--$p;
+							$cw[] = 254;
+							$cw[] = ($c1 + 1);
+							$cw_num += 2;
+						} elseif (($cwr == 2) AND ($p == 2)) {
+							// b. If two symbol characters remain and two C40 values remain to be encoded
+							$c1 = array_shift($temp_cw);
+							$c2 = array_shift($temp_cw);
+							$p -= 2;
+							$tmp = ((1600 * $c1) + (40 * $c2) + 1);
+							$cw[] = ($tmp >> 8);
+							$cw[] = ($tmp % 256);
+							$cw_num += 2;
+						} else {
+							// switch to ASCII encoding
+							if ($enc != ENC_ASCII) {
+								$enc = ENC_ASCII;
+								$cw[] = $this->getSwitchEncodingCodeword($enc);
+								++$cw_num;
+							}
+						}
+					}
+					break;
+				}
+				case ENC_EDF: { // F. While in EDIFACT (EDF) encodation
+					// initialize temporary array with 0 lenght
+					$temp_cw = array();
+					$epos = $pos;
+					$field_lenght = 0;
+					$newenc = $enc;
+					do {
+						// 2. process the next character in EDIFACT encodation.
+						$chr = ord($data[$epos]);
+						if ($this->isCharMode($chr, ENC_EDF)) {
+							++$epos;
+							$temp_cw[] = $chr;
+							++$field_lenght;
+						}
+						if (($field_lenght == 4) OR ($epos == $data_lenght) OR !$this->isCharMode($chr, ENC_EDF)) {
+							if ($field_lenght < 4) {
+								// set unlatch character
+								$temp_cw[] = 0x1f;
+								++$field_lenght;
+								// fill empty characters
+								for ($i = $field_lenght; $i < 4; ++$i) {
+									$temp_cw[] = 0;
+								}
+								$enc = ENC_ASCII;
+							}
+							// encodes four data characters in three codewords
+							$tcw = (($temp_cw[0] & 0x3F) << 2) + (($temp_cw[1] & 0x30) >> 4);
+							if ($tcw > 0) {
+								$cw[] = $tcw;
+								$cw_num++;
+							}
+							$tcw= (($temp_cw[1] & 0x0F) << 4) + (($temp_cw[2] & 0x3C) >> 2);
+							if ($tcw > 0) {
+								$cw[] = $tcw;
+								$cw_num++;
+							}
+							$tcw = (($temp_cw[2] & 0x03) << 6) + ($temp_cw[3] & 0x3F);
+							if ($tcw > 0) {
+								$cw[] = $tcw;
+								$cw_num++;
+							}
+							$temp_cw = array();
+							$pos = $epos;
+							$field_lenght = 0;
+							if ($enc == ENC_ASCII) {
+								break; // exit from EDIFACT mode
+							}
+						}
+					} while ($epos < $data_lenght);
+					break;
+				}
+				case ENC_BASE256: { // G. While in Base 256 (B256) encodation
+					// initialize temporary array with 0 lenght
+					$temp_cw = array();
+					$field_lenght = 0;
+					while (($pos < $data_lenght) AND ($field_lenght <= 1555)) {
+						$newenc = $this->lookAheadTest($data, $pos, $enc);
+						if ($newenc != $enc) {
+							// 1. If the look-ahead test (starting at step J) indicates another mode, switch to that mode.
+							$enc = $newenc;
+							$cw[] = $this->getSwitchEncodingCodeword($enc);
+							++$cw_num;
+							break; // exit from B256 mode
+						} else {
+							// 2. Otherwise, process the next character in Base 256 encodation.
+							$chr = ord($data[$pos]);
+							++$pos;
+							$temp_cw[] = $chr;
+							++$field_lenght;
+						}
+					}
+					// set field lenght
+					if ($field_lenght <= 249) {
+						$cw[] = $field_lenght;
+						++$cw_num;
+					} else {
+						$cw[] = (floor($field_lenght / 250) + 249);
+						$cw[] = ($field_lenght % 250);
+						$cw_num += 2;
+					}
+					if (!empty($temp_cw)) {
+						// add B256 field
+						foreach ($temp_cw as $p => $cht) {
+							$cw[] = $this->get255StateCodeword($chr, ($cw_num + $p));
+						}
+					}
+					break;
+				}
+			} // end of switch enc
+		} // end of while
+		// set last used encoding
+		$this->last_enc = $enc;
+		return $cw;
+	}
+
+	/**
+	 * Places "chr+bit" with appropriate wrapping within array[].
+	 * (Annex F - ECC 200 symbol character placement)
+	 * @param $marr (array) Array of symbols.
+	 * @param $nrow (int) Number of rows.
+	 * @param $ncol (int) Number of columns.
+	 * @param $row (int) Row number.
+	 * @param $col (int) Column number.
+	 * @param $chr (int) Char byte.
+	 * @param $bit (int) Bit.
+	 * @return array
+	 * @protected
+	 */
+	protected function placeModule($marr, $nrow, $ncol, $row, $col, $chr, $bit) {
+		if ($row < 0) {
+			$row += $nrow;
+			$col += (4 - (($nrow + 4) % 8));
+		}
+		if ($col < 0) {
+			$col += $ncol;
+			$row += (4 - (($ncol + 4) % 8));
+		}
+		$marr[(($row * $ncol) + $col)] = ((10 * $chr) + $bit);
+		return $marr;
+	}
+
+	/**
+	 * Places the 8 bits of a utah-shaped symbol character.
+	 * (Annex F - ECC 200 symbol character placement)
+	 * @param $marr (array) Array of symbols.
+	 * @param $nrow (int) Number of rows.
+	 * @param $ncol (int) Number of columns.
+	 * @param $row (int) Row number.
+	 * @param $col (int) Column number.
+	 * @param $chr (int) Char byte.
+	 * @return array
+	 * @protected
+	 */
+	protected function placeUtah($marr, $nrow, $ncol, $row, $col, $chr) {
+		$marr = $this->placeModule($marr, $nrow, $ncol, $row-2, $col-2, $chr, 1);
+		$marr = $this->placeModule($marr, $nrow, $ncol, $row-2, $col-1, $chr, 2);
+		$marr = $this->placeModule($marr, $nrow, $ncol, $row-1, $col-2, $chr, 3);
+		$marr = $this->placeModule($marr, $nrow, $ncol, $row-1, $col-1, $chr, 4);
+		$marr = $this->placeModule($marr, $nrow, $ncol, $row-1, $col,   $chr, 5);
+		$marr = $this->placeModule($marr, $nrow, $ncol, $row,   $col-2, $chr, 6);
+		$marr = $this->placeModule($marr, $nrow, $ncol, $row,   $col-1, $chr, 7);
+		$marr = $this->placeModule($marr, $nrow, $ncol, $row,   $col,   $chr, 8);
+		return $marr;
+	}
+
+	/**
+	 * Places the 8 bits of the first special corner case.
+	 * (Annex F - ECC 200 symbol character placement)
+	 * @param $marr (array) Array of symbols.
+	 * @param $nrow (int) Number of rows.
+	 * @param $ncol (int) Number of columns.
+	 * @param $chr (int) Char byte.
+	 * @return array
+	 * @protected
+	 */
+	protected function placeCornerA($marr, $nrow, $ncol, $chr) {
+		$marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 0,       $chr, 1);
+		$marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 1,       $chr, 2);
+		$marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 2,       $chr, 3);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 0,       $ncol-2, $chr, 4);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 0,       $ncol-1, $chr, 5);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 1,       $ncol-1, $chr, 6);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 2,       $ncol-1, $chr, 7);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 3,       $ncol-1, $chr, 8);
+		return $marr;
+	}
+
+	/**
+	 * Places the 8 bits of the second special corner case.
+	 * (Annex F - ECC 200 symbol character placement)
+	 * @param $marr (array) Array of symbols.
+	 * @param $nrow (int) Number of rows.
+	 * @param $ncol (int) Number of columns.
+	 * @param $chr (int) Char byte.
+	 * @return array
+	 * @protected
+	 */
+	protected function placeCornerB($marr, $nrow, $ncol, $chr) {
+		$marr = $this->placeModule($marr, $nrow, $ncol, $nrow-3, 0,       $chr, 1);
+		$marr = $this->placeModule($marr, $nrow, $ncol, $nrow-2, 0,       $chr, 2);
+		$marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 0,       $chr, 3);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 0,       $ncol-4, $chr, 4);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 0,       $ncol-3, $chr, 5);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 0,       $ncol-2, $chr, 6);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 0,       $ncol-1, $chr, 7);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 1,       $ncol-1, $chr, 8);
+		return $marr;
+	}
+
+	/**
+	 * Places the 8 bits of the third special corner case.
+	 * (Annex F - ECC 200 symbol character placement)
+	 * @param $marr (array) Array of symbols.
+	 * @param $nrow (int) Number of rows.
+	 * @param $ncol (int) Number of columns.
+	 * @param $chr (int) Char byte.
+	 * @return array
+	 * @protected
+	 */
+	protected function placeCornerC($marr, $nrow, $ncol, $chr) {
+		$marr = $this->placeModule($marr, $nrow, $ncol, $nrow-3, 0,       $chr, 1);
+		$marr = $this->placeModule($marr, $nrow, $ncol, $nrow-2, 0,       $chr, 2);
+		$marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 0,       $chr, 3);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 0,       $ncol-2, $chr, 4);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 0,       $ncol-1, $chr, 5);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 1,       $ncol-1, $chr, 6);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 2,       $ncol-1, $chr, 7);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 3,       $ncol-1, $chr, 8);
+		return $marr;
+	}
+
+	/**
+	 * Places the 8 bits of the fourth special corner case.
+	 * (Annex F - ECC 200 symbol character placement)
+	 * @param $marr (array) Array of symbols.
+	 * @param $nrow (int) Number of rows.
+	 * @param $ncol (int) Number of columns.
+	 * @param $chr (int) Char byte.
+	 * @return array
+	 * @protected
+	 */
+	protected function placeCornerD($marr, $nrow, $ncol, $chr) {
+		$marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 0,       $chr, 1);
+		$marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, $ncol-1, $chr, 2);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 0,       $ncol-3, $chr, 3);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 0,       $ncol-2, $chr, 4);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 0,       $ncol-1, $chr, 5);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 1,       $ncol-3, $chr, 6);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 1,       $ncol-2, $chr, 7);
+		$marr = $this->placeModule($marr, $nrow, $ncol, 1,       $ncol-1, $chr, 8);
+		return $marr;
+	}
+
+	/**
+	 * Build a placement map.
+	 * (Annex F - ECC 200 symbol character placement)
+	 * @param $nrow (int) Number of rows.
+	 * @param $ncol (int) Number of columns.
+	 * @return array
+	 * @protected
+	 */
+	protected function getPlacementMap($nrow, $ncol) {
+		// initialize array with zeros
+		$marr = array_fill(0, ($nrow * $ncol), 0);
+		// set starting values
+		$chr = 1;
+		$row = 4;
+		$col = 0;
+		do {
+			// repeatedly first check for one of the special corner cases, then
+			if (($row == $nrow) AND ($col == 0)) {
+				$marr = $this->placeCornerA($marr, $nrow, $ncol, $chr);
+				++$chr;
+			}
+			if (($row == ($nrow - 2)) AND ($col == 0) AND ($ncol % 4)) {
+				$marr = $this->placeCornerB($marr, $nrow, $ncol, $chr);
+				++$chr;
+			}
+			if (($row == ($nrow - 2)) AND ($col == 0) AND (($ncol % 8) == 4)) {
+				$marr = $this->placeCornerC($marr, $nrow, $ncol, $chr);
+				++$chr;
+			}
+			if (($row == ($nrow + 4)) AND ($col == 2) AND (!($ncol % 8))) {
+				$marr = $this->placeCornerD($marr, $nrow, $ncol, $chr);
+				++$chr;
+			}
+			// sweep upward diagonally, inserting successive characters,
+			do {
+				if (($row < $nrow) AND ($col >= 0) AND (!$marr[(($row * $ncol) + $col)])) {
+					$marr = $this->placeUtah($marr, $nrow, $ncol, $row, $col, $chr);
+					++$chr;
+				}
+				$row -= 2;
+				$col += 2;
+			} while (($row >= 0) AND ($col < $ncol));
+			++$row;
+			$col += 3;
+			// & then sweep downward diagonally, inserting successive characters,...
+			do {
+				if (($row >= 0) AND ($col < $ncol) AND (!$marr[(($row * $ncol) + $col)])) {
+					$marr = $this->placeUtah($marr, $nrow, $ncol, $row, $col, $chr);
+					++$chr;
+				}
+				$row += 2;
+				$col -= 2;
+			} while (($row < $nrow) AND ($col >= 0));
+			$row += 3;
+			++$col;
+			// ... until the entire array is scanned
+		} while (($row < $nrow) OR ($col < $ncol));
+		// lastly, if the lower righthand corner is untouched, fill in fixed pattern
+		if (!$marr[(($nrow * $ncol) - 1)]) {
+			$marr[(($nrow * $ncol) - 1)] = 1;
+			$marr[(($nrow * $ncol) - $ncol - 2)] = 1;
+		}
+		return $marr;
+	}
+
+} // end DataMatrix class
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/include/barcodes/pdf417.php b/htmltest/sites/all/libraries/tcpdf-version/include/barcodes/pdf417.php
new file mode 100644
index 00000000..42652990
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/include/barcodes/pdf417.php
@@ -0,0 +1,996 @@
+<?php
+//============================================================+
+// File name   : pdf417.php
+// Version     : 1.0.005
+// Begin       : 2010-06-03
+// Last Update : 2013-09-17
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2010-2013  Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// DESCRIPTION :
+//
+// Class to create PDF417 barcode arrays for TCPDF class.
+// PDF417 (ISO/IEC 15438:2006) is a 2-dimensional stacked bar code created by Symbol Technologies in 1991.
+// It is one of the most popular 2D codes because of its ability to be read with slightly modified handheld laser or linear CCD scanners.
+// TECHNICAL DATA / FEATURES OF PDF417:
+//		Encodable Character Set:     All 128 ASCII Characters (including extended)
+//		Code Type:                   Continuous, Multi-Row
+//		Symbol Height:               3 - 90 Rows
+//		Symbol Width:                90X - 583X
+//		Bidirectional Decoding:      Yes
+//		Error Correction Characters: 2 - 512
+//		Maximum Data Characters:     1850 text, 2710 digits, 1108 bytes
+//
+//============================================================+
+
+/**
+ * @file
+ * Class to create PDF417 barcode arrays for TCPDF class.
+ * PDF417 (ISO/IEC 15438:2006) is a 2-dimensional stacked bar code created by Symbol Technologies in 1991.
+ * (requires PHP bcmath extension)
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.005
+ */
+
+// definitions
+if (!defined('PDF417DEFS')) {
+
+	/**
+	 * Indicate that definitions for this class are set
+	 */
+	define('PDF417DEFS', true);
+
+	// -----------------------------------------------------
+
+	/**
+	 * Row height respect X dimension of single module
+	 */
+	define('ROWHEIGHT', 4);
+
+	/**
+	 * Horizontal quiet zone in modules
+	 */
+	define('QUIETH', 2);
+
+	/**
+	 * Vertical quiet zone in modules
+	 */
+	define('QUIETV', 2);
+
+} // end of definitions
+
+// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
+
+/**
+ * @class PDF417
+ * Class to create PDF417 barcode arrays for TCPDF class.
+ * PDF417 (ISO/IEC 15438:2006) is a 2-dimensional stacked bar code created by Symbol Technologies in 1991.
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.003
+ */
+class PDF417 {
+
+	/**
+	 * Barcode array to be returned which is readable by TCPDF.
+	 * @protected
+	 */
+	protected $barcode_array = array();
+
+	/**
+	 * Start pattern.
+	 * @protected
+	 */
+	protected $start_pattern = '11111111010101000';
+
+	/**
+	 * Stop pattern.
+	 * @protected
+	 */
+	protected $stop_pattern = '111111101000101001';
+
+	/**
+	 * Array of text Compaction Sub-Modes (values 0xFB - 0xFF are used for submode changers).
+	 * @protected
+	 */
+	protected $textsubmodes = array(
+		array(0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x20,0xFD,0xFE,0xFF), // Alpha
+		array(0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x20,0xFD,0xFE,0xFF), // Lower
+		array(0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x26,0x0d,0x09,0x2c,0x3a,0x23,0x2d,0x2e,0x24,0x2f,0x2b,0x25,0x2a,0x3d,0x5e,0xFB,0x20,0xFD,0xFE,0xFF), // Mixed
+		array(0x3b,0x3c,0x3e,0x40,0x5b,0x5c,0x5d,0x5f,0x60,0x7e,0x21,0x0d,0x09,0x2c,0x3a,0x0a,0x2d,0x2e,0x24,0x2f,0x22,0x7c,0x2a,0x28,0x29,0x3f,0x7b,0x7d,0x27,0xFF) // Puntuaction
+	);
+
+	/**
+	 * Array of switching codes for Text Compaction Sub-Modes.
+	 * @protected
+	 */
+	protected $textlatch = array(
+		'01' => array(27), '02' => array(28), '03' => array(28,25), //
+		'10' => array(28,28), '12' => array(28), '13' => array(28,25), //
+		'20' => array(28), '21' => array(27), '23' => array(25), //
+		'30' => array(29), '31' => array(29,27), '32' => array(29,28) //
+	);
+
+	/**
+	 * Clusters of codewords (0, 3, 6)<br/>
+	 * Values are hex equivalents of binary representation of bars (1 = bar, 0 = space).<br/>
+	 * The codewords numbered from 900 to 928 have special meaning, some enable to switch between modes in order to optimise the code:<ul>
+	 * <li>900 : Switch to "Text" mode</li>
+	 * <li>901 : Switch to "Byte" mode</li>
+	 * <li>902 : Switch to "Numeric" mode</li>
+	 * <li>903 - 912 : Reserved</li>
+	 * <li>913 : Switch to "Octet" only for the next codeword</li>
+	 * <li>914 - 920 : Reserved</li>
+	 * <li>921 : Initialization</li>
+	 * <li>922 : Terminator codeword for Macro PDF control block</li>
+	 * <li>923 : Sequence tag to identify the beginning of optional fields in the Macro PDF control block</li>
+	 * <li>924 : Switch to "Byte" mode (If the total number of byte is multiple of 6)</li>
+	 * <li>925 : Identifier for a user defined Extended Channel Interpretation (ECI)</li>
+	 * <li>926 : Identifier for a general purpose ECI format</li>
+	 * <li>927 : Identifier for an ECI of a character set or code page</li>
+	 * <li>928 : Macro marker codeword to indicate the beginning of a Macro PDF Control Block</li>
+	 * </ul>
+	 * @protected
+	 */
+	protected $clusters = array(
+		array( // cluster 0 -----------------------------------------------------------------------
+			0x1d5c0,0x1eaf0,0x1f57c,0x1d4e0,0x1ea78,0x1f53e,0x1a8c0,0x1d470,0x1a860,0x15040, //  10
+			0x1a830,0x15020,0x1adc0,0x1d6f0,0x1eb7c,0x1ace0,0x1d678,0x1eb3e,0x158c0,0x1ac70, //  20
+			0x15860,0x15dc0,0x1aef0,0x1d77c,0x15ce0,0x1ae78,0x1d73e,0x15c70,0x1ae3c,0x15ef0, //  30
+			0x1af7c,0x15e78,0x1af3e,0x15f7c,0x1f5fa,0x1d2e0,0x1e978,0x1f4be,0x1a4c0,0x1d270, //  40
+			0x1e93c,0x1a460,0x1d238,0x14840,0x1a430,0x1d21c,0x14820,0x1a418,0x14810,0x1a6e0, //  50
+			0x1d378,0x1e9be,0x14cc0,0x1a670,0x1d33c,0x14c60,0x1a638,0x1d31e,0x14c30,0x1a61c, //  60
+			0x14ee0,0x1a778,0x1d3be,0x14e70,0x1a73c,0x14e38,0x1a71e,0x14f78,0x1a7be,0x14f3c, //  70
+			0x14f1e,0x1a2c0,0x1d170,0x1e8bc,0x1a260,0x1d138,0x1e89e,0x14440,0x1a230,0x1d11c, //  80
+			0x14420,0x1a218,0x14410,0x14408,0x146c0,0x1a370,0x1d1bc,0x14660,0x1a338,0x1d19e, //  90
+			0x14630,0x1a31c,0x14618,0x1460c,0x14770,0x1a3bc,0x14738,0x1a39e,0x1471c,0x147bc, // 100
+			0x1a160,0x1d0b8,0x1e85e,0x14240,0x1a130,0x1d09c,0x14220,0x1a118,0x1d08e,0x14210, // 110
+			0x1a10c,0x14208,0x1a106,0x14360,0x1a1b8,0x1d0de,0x14330,0x1a19c,0x14318,0x1a18e, // 120
+			0x1430c,0x14306,0x1a1de,0x1438e,0x14140,0x1a0b0,0x1d05c,0x14120,0x1a098,0x1d04e, // 130
+			0x14110,0x1a08c,0x14108,0x1a086,0x14104,0x141b0,0x14198,0x1418c,0x140a0,0x1d02e, // 140
+			0x1a04c,0x1a046,0x14082,0x1cae0,0x1e578,0x1f2be,0x194c0,0x1ca70,0x1e53c,0x19460, // 150
+			0x1ca38,0x1e51e,0x12840,0x19430,0x12820,0x196e0,0x1cb78,0x1e5be,0x12cc0,0x19670, // 160
+			0x1cb3c,0x12c60,0x19638,0x12c30,0x12c18,0x12ee0,0x19778,0x1cbbe,0x12e70,0x1973c, // 170
+			0x12e38,0x12e1c,0x12f78,0x197be,0x12f3c,0x12fbe,0x1dac0,0x1ed70,0x1f6bc,0x1da60, // 180
+			0x1ed38,0x1f69e,0x1b440,0x1da30,0x1ed1c,0x1b420,0x1da18,0x1ed0e,0x1b410,0x1da0c, // 190
+			0x192c0,0x1c970,0x1e4bc,0x1b6c0,0x19260,0x1c938,0x1e49e,0x1b660,0x1db38,0x1ed9e, // 200
+			0x16c40,0x12420,0x19218,0x1c90e,0x16c20,0x1b618,0x16c10,0x126c0,0x19370,0x1c9bc, // 210
+			0x16ec0,0x12660,0x19338,0x1c99e,0x16e60,0x1b738,0x1db9e,0x16e30,0x12618,0x16e18, // 220
+			0x12770,0x193bc,0x16f70,0x12738,0x1939e,0x16f38,0x1b79e,0x16f1c,0x127bc,0x16fbc, // 230
+			0x1279e,0x16f9e,0x1d960,0x1ecb8,0x1f65e,0x1b240,0x1d930,0x1ec9c,0x1b220,0x1d918, // 240
+			0x1ec8e,0x1b210,0x1d90c,0x1b208,0x1b204,0x19160,0x1c8b8,0x1e45e,0x1b360,0x19130, // 250
+			0x1c89c,0x16640,0x12220,0x1d99c,0x1c88e,0x16620,0x12210,0x1910c,0x16610,0x1b30c, // 260
+			0x19106,0x12204,0x12360,0x191b8,0x1c8de,0x16760,0x12330,0x1919c,0x16730,0x1b39c, // 270
+			0x1918e,0x16718,0x1230c,0x12306,0x123b8,0x191de,0x167b8,0x1239c,0x1679c,0x1238e, // 280
+			0x1678e,0x167de,0x1b140,0x1d8b0,0x1ec5c,0x1b120,0x1d898,0x1ec4e,0x1b110,0x1d88c, // 290
+			0x1b108,0x1d886,0x1b104,0x1b102,0x12140,0x190b0,0x1c85c,0x16340,0x12120,0x19098, // 300
+			0x1c84e,0x16320,0x1b198,0x1d8ce,0x16310,0x12108,0x19086,0x16308,0x1b186,0x16304, // 310
+			0x121b0,0x190dc,0x163b0,0x12198,0x190ce,0x16398,0x1b1ce,0x1638c,0x12186,0x16386, // 320
+			0x163dc,0x163ce,0x1b0a0,0x1d858,0x1ec2e,0x1b090,0x1d84c,0x1b088,0x1d846,0x1b084, // 330
+			0x1b082,0x120a0,0x19058,0x1c82e,0x161a0,0x12090,0x1904c,0x16190,0x1b0cc,0x19046, // 340
+			0x16188,0x12084,0x16184,0x12082,0x120d8,0x161d8,0x161cc,0x161c6,0x1d82c,0x1d826, // 350
+			0x1b042,0x1902c,0x12048,0x160c8,0x160c4,0x160c2,0x18ac0,0x1c570,0x1e2bc,0x18a60, // 360
+			0x1c538,0x11440,0x18a30,0x1c51c,0x11420,0x18a18,0x11410,0x11408,0x116c0,0x18b70, // 370
+			0x1c5bc,0x11660,0x18b38,0x1c59e,0x11630,0x18b1c,0x11618,0x1160c,0x11770,0x18bbc, // 380
+			0x11738,0x18b9e,0x1171c,0x117bc,0x1179e,0x1cd60,0x1e6b8,0x1f35e,0x19a40,0x1cd30, // 390
+			0x1e69c,0x19a20,0x1cd18,0x1e68e,0x19a10,0x1cd0c,0x19a08,0x1cd06,0x18960,0x1c4b8, // 400
+			0x1e25e,0x19b60,0x18930,0x1c49c,0x13640,0x11220,0x1cd9c,0x1c48e,0x13620,0x19b18, // 410
+			0x1890c,0x13610,0x11208,0x13608,0x11360,0x189b8,0x1c4de,0x13760,0x11330,0x1cdde, // 420
+			0x13730,0x19b9c,0x1898e,0x13718,0x1130c,0x1370c,0x113b8,0x189de,0x137b8,0x1139c, // 430
+			0x1379c,0x1138e,0x113de,0x137de,0x1dd40,0x1eeb0,0x1f75c,0x1dd20,0x1ee98,0x1f74e, // 440
+			0x1dd10,0x1ee8c,0x1dd08,0x1ee86,0x1dd04,0x19940,0x1ccb0,0x1e65c,0x1bb40,0x19920, // 450
+			0x1eedc,0x1e64e,0x1bb20,0x1dd98,0x1eece,0x1bb10,0x19908,0x1cc86,0x1bb08,0x1dd86, // 460
+			0x19902,0x11140,0x188b0,0x1c45c,0x13340,0x11120,0x18898,0x1c44e,0x17740,0x13320, // 470
+			0x19998,0x1ccce,0x17720,0x1bb98,0x1ddce,0x18886,0x17710,0x13308,0x19986,0x17708, // 480
+			0x11102,0x111b0,0x188dc,0x133b0,0x11198,0x188ce,0x177b0,0x13398,0x199ce,0x17798, // 490
+			0x1bbce,0x11186,0x13386,0x111dc,0x133dc,0x111ce,0x177dc,0x133ce,0x1dca0,0x1ee58, // 500
+			0x1f72e,0x1dc90,0x1ee4c,0x1dc88,0x1ee46,0x1dc84,0x1dc82,0x198a0,0x1cc58,0x1e62e, // 510
+			0x1b9a0,0x19890,0x1ee6e,0x1b990,0x1dccc,0x1cc46,0x1b988,0x19884,0x1b984,0x19882, // 520
+			0x1b982,0x110a0,0x18858,0x1c42e,0x131a0,0x11090,0x1884c,0x173a0,0x13190,0x198cc, // 530
+			0x18846,0x17390,0x1b9cc,0x11084,0x17388,0x13184,0x11082,0x13182,0x110d8,0x1886e, // 540
+			0x131d8,0x110cc,0x173d8,0x131cc,0x110c6,0x173cc,0x131c6,0x110ee,0x173ee,0x1dc50, // 550
+			0x1ee2c,0x1dc48,0x1ee26,0x1dc44,0x1dc42,0x19850,0x1cc2c,0x1b8d0,0x19848,0x1cc26, // 560
+			0x1b8c8,0x1dc66,0x1b8c4,0x19842,0x1b8c2,0x11050,0x1882c,0x130d0,0x11048,0x18826, // 570
+			0x171d0,0x130c8,0x19866,0x171c8,0x1b8e6,0x11042,0x171c4,0x130c2,0x171c2,0x130ec, // 580
+			0x171ec,0x171e6,0x1ee16,0x1dc22,0x1cc16,0x19824,0x19822,0x11028,0x13068,0x170e8, // 590
+			0x11022,0x13062,0x18560,0x10a40,0x18530,0x10a20,0x18518,0x1c28e,0x10a10,0x1850c, // 600
+			0x10a08,0x18506,0x10b60,0x185b8,0x1c2de,0x10b30,0x1859c,0x10b18,0x1858e,0x10b0c, // 610
+			0x10b06,0x10bb8,0x185de,0x10b9c,0x10b8e,0x10bde,0x18d40,0x1c6b0,0x1e35c,0x18d20, // 620
+			0x1c698,0x18d10,0x1c68c,0x18d08,0x1c686,0x18d04,0x10940,0x184b0,0x1c25c,0x11b40, // 630
+			0x10920,0x1c6dc,0x1c24e,0x11b20,0x18d98,0x1c6ce,0x11b10,0x10908,0x18486,0x11b08, // 640
+			0x18d86,0x10902,0x109b0,0x184dc,0x11bb0,0x10998,0x184ce,0x11b98,0x18dce,0x11b8c, // 650
+			0x10986,0x109dc,0x11bdc,0x109ce,0x11bce,0x1cea0,0x1e758,0x1f3ae,0x1ce90,0x1e74c, // 660
+			0x1ce88,0x1e746,0x1ce84,0x1ce82,0x18ca0,0x1c658,0x19da0,0x18c90,0x1c64c,0x19d90, // 670
+			0x1cecc,0x1c646,0x19d88,0x18c84,0x19d84,0x18c82,0x19d82,0x108a0,0x18458,0x119a0, // 680
+			0x10890,0x1c66e,0x13ba0,0x11990,0x18ccc,0x18446,0x13b90,0x19dcc,0x10884,0x13b88, // 690
+			0x11984,0x10882,0x11982,0x108d8,0x1846e,0x119d8,0x108cc,0x13bd8,0x119cc,0x108c6, // 700
+			0x13bcc,0x119c6,0x108ee,0x119ee,0x13bee,0x1ef50,0x1f7ac,0x1ef48,0x1f7a6,0x1ef44, // 710
+			0x1ef42,0x1ce50,0x1e72c,0x1ded0,0x1ef6c,0x1e726,0x1dec8,0x1ef66,0x1dec4,0x1ce42, // 720
+			0x1dec2,0x18c50,0x1c62c,0x19cd0,0x18c48,0x1c626,0x1bdd0,0x19cc8,0x1ce66,0x1bdc8, // 730
+			0x1dee6,0x18c42,0x1bdc4,0x19cc2,0x1bdc2,0x10850,0x1842c,0x118d0,0x10848,0x18426, // 740
+			0x139d0,0x118c8,0x18c66,0x17bd0,0x139c8,0x19ce6,0x10842,0x17bc8,0x1bde6,0x118c2, // 750
+			0x17bc4,0x1086c,0x118ec,0x10866,0x139ec,0x118e6,0x17bec,0x139e6,0x17be6,0x1ef28, // 760
+			0x1f796,0x1ef24,0x1ef22,0x1ce28,0x1e716,0x1de68,0x1ef36,0x1de64,0x1ce22,0x1de62, // 770
+			0x18c28,0x1c616,0x19c68,0x18c24,0x1bce8,0x19c64,0x18c22,0x1bce4,0x19c62,0x1bce2, // 780
+			0x10828,0x18416,0x11868,0x18c36,0x138e8,0x11864,0x10822,0x179e8,0x138e4,0x11862, // 790
+			0x179e4,0x138e2,0x179e2,0x11876,0x179f6,0x1ef12,0x1de34,0x1de32,0x19c34,0x1bc74, // 800
+			0x1bc72,0x11834,0x13874,0x178f4,0x178f2,0x10540,0x10520,0x18298,0x10510,0x10508, // 810
+			0x10504,0x105b0,0x10598,0x1058c,0x10586,0x105dc,0x105ce,0x186a0,0x18690,0x1c34c, // 820
+			0x18688,0x1c346,0x18684,0x18682,0x104a0,0x18258,0x10da0,0x186d8,0x1824c,0x10d90, // 830
+			0x186cc,0x10d88,0x186c6,0x10d84,0x10482,0x10d82,0x104d8,0x1826e,0x10dd8,0x186ee, // 840
+			0x10dcc,0x104c6,0x10dc6,0x104ee,0x10dee,0x1c750,0x1c748,0x1c744,0x1c742,0x18650, // 850
+			0x18ed0,0x1c76c,0x1c326,0x18ec8,0x1c766,0x18ec4,0x18642,0x18ec2,0x10450,0x10cd0, // 860
+			0x10448,0x18226,0x11dd0,0x10cc8,0x10444,0x11dc8,0x10cc4,0x10442,0x11dc4,0x10cc2, // 870
+			0x1046c,0x10cec,0x10466,0x11dec,0x10ce6,0x11de6,0x1e7a8,0x1e7a4,0x1e7a2,0x1c728, // 880
+			0x1cf68,0x1e7b6,0x1cf64,0x1c722,0x1cf62,0x18628,0x1c316,0x18e68,0x1c736,0x19ee8, // 890
+			0x18e64,0x18622,0x19ee4,0x18e62,0x19ee2,0x10428,0x18216,0x10c68,0x18636,0x11ce8, // 900
+			0x10c64,0x10422,0x13de8,0x11ce4,0x10c62,0x13de4,0x11ce2,0x10436,0x10c76,0x11cf6, // 910
+			0x13df6,0x1f7d4,0x1f7d2,0x1e794,0x1efb4,0x1e792,0x1efb2,0x1c714,0x1cf34,0x1c712, // 920
+			0x1df74,0x1cf32,0x1df72,0x18614,0x18e34,0x18612,0x19e74,0x18e32,0x1bef4),        // 929
+		array( // cluster 3 -----------------------------------------------------------------------
+			0x1f560,0x1fab8,0x1ea40,0x1f530,0x1fa9c,0x1ea20,0x1f518,0x1fa8e,0x1ea10,0x1f50c, //  10
+			0x1ea08,0x1f506,0x1ea04,0x1eb60,0x1f5b8,0x1fade,0x1d640,0x1eb30,0x1f59c,0x1d620, //  20
+			0x1eb18,0x1f58e,0x1d610,0x1eb0c,0x1d608,0x1eb06,0x1d604,0x1d760,0x1ebb8,0x1f5de, //  30
+			0x1ae40,0x1d730,0x1eb9c,0x1ae20,0x1d718,0x1eb8e,0x1ae10,0x1d70c,0x1ae08,0x1d706, //  40
+			0x1ae04,0x1af60,0x1d7b8,0x1ebde,0x15e40,0x1af30,0x1d79c,0x15e20,0x1af18,0x1d78e, //  50
+			0x15e10,0x1af0c,0x15e08,0x1af06,0x15f60,0x1afb8,0x1d7de,0x15f30,0x1af9c,0x15f18, //  60
+			0x1af8e,0x15f0c,0x15fb8,0x1afde,0x15f9c,0x15f8e,0x1e940,0x1f4b0,0x1fa5c,0x1e920, //  70
+			0x1f498,0x1fa4e,0x1e910,0x1f48c,0x1e908,0x1f486,0x1e904,0x1e902,0x1d340,0x1e9b0, //  80
+			0x1f4dc,0x1d320,0x1e998,0x1f4ce,0x1d310,0x1e98c,0x1d308,0x1e986,0x1d304,0x1d302, //  90
+			0x1a740,0x1d3b0,0x1e9dc,0x1a720,0x1d398,0x1e9ce,0x1a710,0x1d38c,0x1a708,0x1d386, // 100
+			0x1a704,0x1a702,0x14f40,0x1a7b0,0x1d3dc,0x14f20,0x1a798,0x1d3ce,0x14f10,0x1a78c, // 110
+			0x14f08,0x1a786,0x14f04,0x14fb0,0x1a7dc,0x14f98,0x1a7ce,0x14f8c,0x14f86,0x14fdc, // 120
+			0x14fce,0x1e8a0,0x1f458,0x1fa2e,0x1e890,0x1f44c,0x1e888,0x1f446,0x1e884,0x1e882, // 130
+			0x1d1a0,0x1e8d8,0x1f46e,0x1d190,0x1e8cc,0x1d188,0x1e8c6,0x1d184,0x1d182,0x1a3a0, // 140
+			0x1d1d8,0x1e8ee,0x1a390,0x1d1cc,0x1a388,0x1d1c6,0x1a384,0x1a382,0x147a0,0x1a3d8, // 150
+			0x1d1ee,0x14790,0x1a3cc,0x14788,0x1a3c6,0x14784,0x14782,0x147d8,0x1a3ee,0x147cc, // 160
+			0x147c6,0x147ee,0x1e850,0x1f42c,0x1e848,0x1f426,0x1e844,0x1e842,0x1d0d0,0x1e86c, // 170
+			0x1d0c8,0x1e866,0x1d0c4,0x1d0c2,0x1a1d0,0x1d0ec,0x1a1c8,0x1d0e6,0x1a1c4,0x1a1c2, // 180
+			0x143d0,0x1a1ec,0x143c8,0x1a1e6,0x143c4,0x143c2,0x143ec,0x143e6,0x1e828,0x1f416, // 190
+			0x1e824,0x1e822,0x1d068,0x1e836,0x1d064,0x1d062,0x1a0e8,0x1d076,0x1a0e4,0x1a0e2, // 200
+			0x141e8,0x1a0f6,0x141e4,0x141e2,0x1e814,0x1e812,0x1d034,0x1d032,0x1a074,0x1a072, // 210
+			0x1e540,0x1f2b0,0x1f95c,0x1e520,0x1f298,0x1f94e,0x1e510,0x1f28c,0x1e508,0x1f286, // 220
+			0x1e504,0x1e502,0x1cb40,0x1e5b0,0x1f2dc,0x1cb20,0x1e598,0x1f2ce,0x1cb10,0x1e58c, // 230
+			0x1cb08,0x1e586,0x1cb04,0x1cb02,0x19740,0x1cbb0,0x1e5dc,0x19720,0x1cb98,0x1e5ce, // 240
+			0x19710,0x1cb8c,0x19708,0x1cb86,0x19704,0x19702,0x12f40,0x197b0,0x1cbdc,0x12f20, // 250
+			0x19798,0x1cbce,0x12f10,0x1978c,0x12f08,0x19786,0x12f04,0x12fb0,0x197dc,0x12f98, // 260
+			0x197ce,0x12f8c,0x12f86,0x12fdc,0x12fce,0x1f6a0,0x1fb58,0x16bf0,0x1f690,0x1fb4c, // 270
+			0x169f8,0x1f688,0x1fb46,0x168fc,0x1f684,0x1f682,0x1e4a0,0x1f258,0x1f92e,0x1eda0, // 280
+			0x1e490,0x1fb6e,0x1ed90,0x1f6cc,0x1f246,0x1ed88,0x1e484,0x1ed84,0x1e482,0x1ed82, // 290
+			0x1c9a0,0x1e4d8,0x1f26e,0x1dba0,0x1c990,0x1e4cc,0x1db90,0x1edcc,0x1e4c6,0x1db88, // 300
+			0x1c984,0x1db84,0x1c982,0x1db82,0x193a0,0x1c9d8,0x1e4ee,0x1b7a0,0x19390,0x1c9cc, // 310
+			0x1b790,0x1dbcc,0x1c9c6,0x1b788,0x19384,0x1b784,0x19382,0x1b782,0x127a0,0x193d8, // 320
+			0x1c9ee,0x16fa0,0x12790,0x193cc,0x16f90,0x1b7cc,0x193c6,0x16f88,0x12784,0x16f84, // 330
+			0x12782,0x127d8,0x193ee,0x16fd8,0x127cc,0x16fcc,0x127c6,0x16fc6,0x127ee,0x1f650, // 340
+			0x1fb2c,0x165f8,0x1f648,0x1fb26,0x164fc,0x1f644,0x1647e,0x1f642,0x1e450,0x1f22c, // 350
+			0x1ecd0,0x1e448,0x1f226,0x1ecc8,0x1f666,0x1ecc4,0x1e442,0x1ecc2,0x1c8d0,0x1e46c, // 360
+			0x1d9d0,0x1c8c8,0x1e466,0x1d9c8,0x1ece6,0x1d9c4,0x1c8c2,0x1d9c2,0x191d0,0x1c8ec, // 370
+			0x1b3d0,0x191c8,0x1c8e6,0x1b3c8,0x1d9e6,0x1b3c4,0x191c2,0x1b3c2,0x123d0,0x191ec, // 380
+			0x167d0,0x123c8,0x191e6,0x167c8,0x1b3e6,0x167c4,0x123c2,0x167c2,0x123ec,0x167ec, // 390
+			0x123e6,0x167e6,0x1f628,0x1fb16,0x162fc,0x1f624,0x1627e,0x1f622,0x1e428,0x1f216, // 400
+			0x1ec68,0x1f636,0x1ec64,0x1e422,0x1ec62,0x1c868,0x1e436,0x1d8e8,0x1c864,0x1d8e4, // 410
+			0x1c862,0x1d8e2,0x190e8,0x1c876,0x1b1e8,0x1d8f6,0x1b1e4,0x190e2,0x1b1e2,0x121e8, // 420
+			0x190f6,0x163e8,0x121e4,0x163e4,0x121e2,0x163e2,0x121f6,0x163f6,0x1f614,0x1617e, // 430
+			0x1f612,0x1e414,0x1ec34,0x1e412,0x1ec32,0x1c834,0x1d874,0x1c832,0x1d872,0x19074, // 440
+			0x1b0f4,0x19072,0x1b0f2,0x120f4,0x161f4,0x120f2,0x161f2,0x1f60a,0x1e40a,0x1ec1a, // 450
+			0x1c81a,0x1d83a,0x1903a,0x1b07a,0x1e2a0,0x1f158,0x1f8ae,0x1e290,0x1f14c,0x1e288, // 460
+			0x1f146,0x1e284,0x1e282,0x1c5a0,0x1e2d8,0x1f16e,0x1c590,0x1e2cc,0x1c588,0x1e2c6, // 470
+			0x1c584,0x1c582,0x18ba0,0x1c5d8,0x1e2ee,0x18b90,0x1c5cc,0x18b88,0x1c5c6,0x18b84, // 480
+			0x18b82,0x117a0,0x18bd8,0x1c5ee,0x11790,0x18bcc,0x11788,0x18bc6,0x11784,0x11782, // 490
+			0x117d8,0x18bee,0x117cc,0x117c6,0x117ee,0x1f350,0x1f9ac,0x135f8,0x1f348,0x1f9a6, // 500
+			0x134fc,0x1f344,0x1347e,0x1f342,0x1e250,0x1f12c,0x1e6d0,0x1e248,0x1f126,0x1e6c8, // 510
+			0x1f366,0x1e6c4,0x1e242,0x1e6c2,0x1c4d0,0x1e26c,0x1cdd0,0x1c4c8,0x1e266,0x1cdc8, // 520
+			0x1e6e6,0x1cdc4,0x1c4c2,0x1cdc2,0x189d0,0x1c4ec,0x19bd0,0x189c8,0x1c4e6,0x19bc8, // 530
+			0x1cde6,0x19bc4,0x189c2,0x19bc2,0x113d0,0x189ec,0x137d0,0x113c8,0x189e6,0x137c8, // 540
+			0x19be6,0x137c4,0x113c2,0x137c2,0x113ec,0x137ec,0x113e6,0x137e6,0x1fba8,0x175f0, // 550
+			0x1bafc,0x1fba4,0x174f8,0x1ba7e,0x1fba2,0x1747c,0x1743e,0x1f328,0x1f996,0x132fc, // 560
+			0x1f768,0x1fbb6,0x176fc,0x1327e,0x1f764,0x1f322,0x1767e,0x1f762,0x1e228,0x1f116, // 570
+			0x1e668,0x1e224,0x1eee8,0x1f776,0x1e222,0x1eee4,0x1e662,0x1eee2,0x1c468,0x1e236, // 580
+			0x1cce8,0x1c464,0x1dde8,0x1cce4,0x1c462,0x1dde4,0x1cce2,0x1dde2,0x188e8,0x1c476, // 590
+			0x199e8,0x188e4,0x1bbe8,0x199e4,0x188e2,0x1bbe4,0x199e2,0x1bbe2,0x111e8,0x188f6, // 600
+			0x133e8,0x111e4,0x177e8,0x133e4,0x111e2,0x177e4,0x133e2,0x177e2,0x111f6,0x133f6, // 610
+			0x1fb94,0x172f8,0x1b97e,0x1fb92,0x1727c,0x1723e,0x1f314,0x1317e,0x1f734,0x1f312, // 620
+			0x1737e,0x1f732,0x1e214,0x1e634,0x1e212,0x1ee74,0x1e632,0x1ee72,0x1c434,0x1cc74, // 630
+			0x1c432,0x1dcf4,0x1cc72,0x1dcf2,0x18874,0x198f4,0x18872,0x1b9f4,0x198f2,0x1b9f2, // 640
+			0x110f4,0x131f4,0x110f2,0x173f4,0x131f2,0x173f2,0x1fb8a,0x1717c,0x1713e,0x1f30a, // 650
+			0x1f71a,0x1e20a,0x1e61a,0x1ee3a,0x1c41a,0x1cc3a,0x1dc7a,0x1883a,0x1987a,0x1b8fa, // 660
+			0x1107a,0x130fa,0x171fa,0x170be,0x1e150,0x1f0ac,0x1e148,0x1f0a6,0x1e144,0x1e142, // 670
+			0x1c2d0,0x1e16c,0x1c2c8,0x1e166,0x1c2c4,0x1c2c2,0x185d0,0x1c2ec,0x185c8,0x1c2e6, // 680
+			0x185c4,0x185c2,0x10bd0,0x185ec,0x10bc8,0x185e6,0x10bc4,0x10bc2,0x10bec,0x10be6, // 690
+			0x1f1a8,0x1f8d6,0x11afc,0x1f1a4,0x11a7e,0x1f1a2,0x1e128,0x1f096,0x1e368,0x1e124, // 700
+			0x1e364,0x1e122,0x1e362,0x1c268,0x1e136,0x1c6e8,0x1c264,0x1c6e4,0x1c262,0x1c6e2, // 710
+			0x184e8,0x1c276,0x18de8,0x184e4,0x18de4,0x184e2,0x18de2,0x109e8,0x184f6,0x11be8, // 720
+			0x109e4,0x11be4,0x109e2,0x11be2,0x109f6,0x11bf6,0x1f9d4,0x13af8,0x19d7e,0x1f9d2, // 730
+			0x13a7c,0x13a3e,0x1f194,0x1197e,0x1f3b4,0x1f192,0x13b7e,0x1f3b2,0x1e114,0x1e334, // 740
+			0x1e112,0x1e774,0x1e332,0x1e772,0x1c234,0x1c674,0x1c232,0x1cef4,0x1c672,0x1cef2, // 750
+			0x18474,0x18cf4,0x18472,0x19df4,0x18cf2,0x19df2,0x108f4,0x119f4,0x108f2,0x13bf4, // 760
+			0x119f2,0x13bf2,0x17af0,0x1bd7c,0x17a78,0x1bd3e,0x17a3c,0x17a1e,0x1f9ca,0x1397c, // 770
+			0x1fbda,0x17b7c,0x1393e,0x17b3e,0x1f18a,0x1f39a,0x1f7ba,0x1e10a,0x1e31a,0x1e73a, // 780
+			0x1ef7a,0x1c21a,0x1c63a,0x1ce7a,0x1defa,0x1843a,0x18c7a,0x19cfa,0x1bdfa,0x1087a, // 790
+			0x118fa,0x139fa,0x17978,0x1bcbe,0x1793c,0x1791e,0x138be,0x179be,0x178bc,0x1789e, // 800
+			0x1785e,0x1e0a8,0x1e0a4,0x1e0a2,0x1c168,0x1e0b6,0x1c164,0x1c162,0x182e8,0x1c176, // 810
+			0x182e4,0x182e2,0x105e8,0x182f6,0x105e4,0x105e2,0x105f6,0x1f0d4,0x10d7e,0x1f0d2, // 820
+			0x1e094,0x1e1b4,0x1e092,0x1e1b2,0x1c134,0x1c374,0x1c132,0x1c372,0x18274,0x186f4, // 830
+			0x18272,0x186f2,0x104f4,0x10df4,0x104f2,0x10df2,0x1f8ea,0x11d7c,0x11d3e,0x1f0ca, // 840
+			0x1f1da,0x1e08a,0x1e19a,0x1e3ba,0x1c11a,0x1c33a,0x1c77a,0x1823a,0x1867a,0x18efa, // 850
+			0x1047a,0x10cfa,0x11dfa,0x13d78,0x19ebe,0x13d3c,0x13d1e,0x11cbe,0x13dbe,0x17d70, // 860
+			0x1bebc,0x17d38,0x1be9e,0x17d1c,0x17d0e,0x13cbc,0x17dbc,0x13c9e,0x17d9e,0x17cb8, // 870
+			0x1be5e,0x17c9c,0x17c8e,0x13c5e,0x17cde,0x17c5c,0x17c4e,0x17c2e,0x1c0b4,0x1c0b2, // 880
+			0x18174,0x18172,0x102f4,0x102f2,0x1e0da,0x1c09a,0x1c1ba,0x1813a,0x1837a,0x1027a, // 890
+			0x106fa,0x10ebe,0x11ebc,0x11e9e,0x13eb8,0x19f5e,0x13e9c,0x13e8e,0x11e5e,0x13ede, // 900
+			0x17eb0,0x1bf5c,0x17e98,0x1bf4e,0x17e8c,0x17e86,0x13e5c,0x17edc,0x13e4e,0x17ece, // 910
+			0x17e58,0x1bf2e,0x17e4c,0x17e46,0x13e2e,0x17e6e,0x17e2c,0x17e26,0x10f5e,0x11f5c, // 920
+			0x11f4e,0x13f58,0x19fae,0x13f4c,0x13f46,0x11f2e,0x13f6e,0x13f2c,0x13f26),        // 929
+		array( // cluster 6 -----------------------------------------------------------------------
+			0x1abe0,0x1d5f8,0x153c0,0x1a9f0,0x1d4fc,0x151e0,0x1a8f8,0x1d47e,0x150f0,0x1a87c, //  10
+			0x15078,0x1fad0,0x15be0,0x1adf8,0x1fac8,0x159f0,0x1acfc,0x1fac4,0x158f8,0x1ac7e, //  20
+			0x1fac2,0x1587c,0x1f5d0,0x1faec,0x15df8,0x1f5c8,0x1fae6,0x15cfc,0x1f5c4,0x15c7e, //  30
+			0x1f5c2,0x1ebd0,0x1f5ec,0x1ebc8,0x1f5e6,0x1ebc4,0x1ebc2,0x1d7d0,0x1ebec,0x1d7c8, //  40
+			0x1ebe6,0x1d7c4,0x1d7c2,0x1afd0,0x1d7ec,0x1afc8,0x1d7e6,0x1afc4,0x14bc0,0x1a5f0, //  50
+			0x1d2fc,0x149e0,0x1a4f8,0x1d27e,0x148f0,0x1a47c,0x14878,0x1a43e,0x1483c,0x1fa68, //  60
+			0x14df0,0x1a6fc,0x1fa64,0x14cf8,0x1a67e,0x1fa62,0x14c7c,0x14c3e,0x1f4e8,0x1fa76, //  70
+			0x14efc,0x1f4e4,0x14e7e,0x1f4e2,0x1e9e8,0x1f4f6,0x1e9e4,0x1e9e2,0x1d3e8,0x1e9f6, //  80
+			0x1d3e4,0x1d3e2,0x1a7e8,0x1d3f6,0x1a7e4,0x1a7e2,0x145e0,0x1a2f8,0x1d17e,0x144f0, //  90
+			0x1a27c,0x14478,0x1a23e,0x1443c,0x1441e,0x1fa34,0x146f8,0x1a37e,0x1fa32,0x1467c, // 100
+			0x1463e,0x1f474,0x1477e,0x1f472,0x1e8f4,0x1e8f2,0x1d1f4,0x1d1f2,0x1a3f4,0x1a3f2, // 110
+			0x142f0,0x1a17c,0x14278,0x1a13e,0x1423c,0x1421e,0x1fa1a,0x1437c,0x1433e,0x1f43a, // 120
+			0x1e87a,0x1d0fa,0x14178,0x1a0be,0x1413c,0x1411e,0x141be,0x140bc,0x1409e,0x12bc0, // 130
+			0x195f0,0x1cafc,0x129e0,0x194f8,0x1ca7e,0x128f0,0x1947c,0x12878,0x1943e,0x1283c, // 140
+			0x1f968,0x12df0,0x196fc,0x1f964,0x12cf8,0x1967e,0x1f962,0x12c7c,0x12c3e,0x1f2e8, // 150
+			0x1f976,0x12efc,0x1f2e4,0x12e7e,0x1f2e2,0x1e5e8,0x1f2f6,0x1e5e4,0x1e5e2,0x1cbe8, // 160
+			0x1e5f6,0x1cbe4,0x1cbe2,0x197e8,0x1cbf6,0x197e4,0x197e2,0x1b5e0,0x1daf8,0x1ed7e, // 170
+			0x169c0,0x1b4f0,0x1da7c,0x168e0,0x1b478,0x1da3e,0x16870,0x1b43c,0x16838,0x1b41e, // 180
+			0x1681c,0x125e0,0x192f8,0x1c97e,0x16de0,0x124f0,0x1927c,0x16cf0,0x1b67c,0x1923e, // 190
+			0x16c78,0x1243c,0x16c3c,0x1241e,0x16c1e,0x1f934,0x126f8,0x1937e,0x1fb74,0x1f932, // 200
+			0x16ef8,0x1267c,0x1fb72,0x16e7c,0x1263e,0x16e3e,0x1f274,0x1277e,0x1f6f4,0x1f272, // 210
+			0x16f7e,0x1f6f2,0x1e4f4,0x1edf4,0x1e4f2,0x1edf2,0x1c9f4,0x1dbf4,0x1c9f2,0x1dbf2, // 220
+			0x193f4,0x193f2,0x165c0,0x1b2f0,0x1d97c,0x164e0,0x1b278,0x1d93e,0x16470,0x1b23c, // 230
+			0x16438,0x1b21e,0x1641c,0x1640e,0x122f0,0x1917c,0x166f0,0x12278,0x1913e,0x16678, // 240
+			0x1b33e,0x1663c,0x1221e,0x1661e,0x1f91a,0x1237c,0x1fb3a,0x1677c,0x1233e,0x1673e, // 250
+			0x1f23a,0x1f67a,0x1e47a,0x1ecfa,0x1c8fa,0x1d9fa,0x191fa,0x162e0,0x1b178,0x1d8be, // 260
+			0x16270,0x1b13c,0x16238,0x1b11e,0x1621c,0x1620e,0x12178,0x190be,0x16378,0x1213c, // 270
+			0x1633c,0x1211e,0x1631e,0x121be,0x163be,0x16170,0x1b0bc,0x16138,0x1b09e,0x1611c, // 280
+			0x1610e,0x120bc,0x161bc,0x1209e,0x1619e,0x160b8,0x1b05e,0x1609c,0x1608e,0x1205e, // 290
+			0x160de,0x1605c,0x1604e,0x115e0,0x18af8,0x1c57e,0x114f0,0x18a7c,0x11478,0x18a3e, // 300
+			0x1143c,0x1141e,0x1f8b4,0x116f8,0x18b7e,0x1f8b2,0x1167c,0x1163e,0x1f174,0x1177e, // 310
+			0x1f172,0x1e2f4,0x1e2f2,0x1c5f4,0x1c5f2,0x18bf4,0x18bf2,0x135c0,0x19af0,0x1cd7c, // 320
+			0x134e0,0x19a78,0x1cd3e,0x13470,0x19a3c,0x13438,0x19a1e,0x1341c,0x1340e,0x112f0, // 330
+			0x1897c,0x136f0,0x11278,0x1893e,0x13678,0x19b3e,0x1363c,0x1121e,0x1361e,0x1f89a, // 340
+			0x1137c,0x1f9ba,0x1377c,0x1133e,0x1373e,0x1f13a,0x1f37a,0x1e27a,0x1e6fa,0x1c4fa, // 350
+			0x1cdfa,0x189fa,0x1bae0,0x1dd78,0x1eebe,0x174c0,0x1ba70,0x1dd3c,0x17460,0x1ba38, // 360
+			0x1dd1e,0x17430,0x1ba1c,0x17418,0x1ba0e,0x1740c,0x132e0,0x19978,0x1ccbe,0x176e0, // 370
+			0x13270,0x1993c,0x17670,0x1bb3c,0x1991e,0x17638,0x1321c,0x1761c,0x1320e,0x1760e, // 380
+			0x11178,0x188be,0x13378,0x1113c,0x17778,0x1333c,0x1111e,0x1773c,0x1331e,0x1771e, // 390
+			0x111be,0x133be,0x177be,0x172c0,0x1b970,0x1dcbc,0x17260,0x1b938,0x1dc9e,0x17230, // 400
+			0x1b91c,0x17218,0x1b90e,0x1720c,0x17206,0x13170,0x198bc,0x17370,0x13138,0x1989e, // 410
+			0x17338,0x1b99e,0x1731c,0x1310e,0x1730e,0x110bc,0x131bc,0x1109e,0x173bc,0x1319e, // 420
+			0x1739e,0x17160,0x1b8b8,0x1dc5e,0x17130,0x1b89c,0x17118,0x1b88e,0x1710c,0x17106, // 430
+			0x130b8,0x1985e,0x171b8,0x1309c,0x1719c,0x1308e,0x1718e,0x1105e,0x130de,0x171de, // 440
+			0x170b0,0x1b85c,0x17098,0x1b84e,0x1708c,0x17086,0x1305c,0x170dc,0x1304e,0x170ce, // 450
+			0x17058,0x1b82e,0x1704c,0x17046,0x1302e,0x1706e,0x1702c,0x17026,0x10af0,0x1857c, // 460
+			0x10a78,0x1853e,0x10a3c,0x10a1e,0x10b7c,0x10b3e,0x1f0ba,0x1e17a,0x1c2fa,0x185fa, // 470
+			0x11ae0,0x18d78,0x1c6be,0x11a70,0x18d3c,0x11a38,0x18d1e,0x11a1c,0x11a0e,0x10978, // 480
+			0x184be,0x11b78,0x1093c,0x11b3c,0x1091e,0x11b1e,0x109be,0x11bbe,0x13ac0,0x19d70, // 490
+			0x1cebc,0x13a60,0x19d38,0x1ce9e,0x13a30,0x19d1c,0x13a18,0x19d0e,0x13a0c,0x13a06, // 500
+			0x11970,0x18cbc,0x13b70,0x11938,0x18c9e,0x13b38,0x1191c,0x13b1c,0x1190e,0x13b0e, // 510
+			0x108bc,0x119bc,0x1089e,0x13bbc,0x1199e,0x13b9e,0x1bd60,0x1deb8,0x1ef5e,0x17a40, // 520
+			0x1bd30,0x1de9c,0x17a20,0x1bd18,0x1de8e,0x17a10,0x1bd0c,0x17a08,0x1bd06,0x17a04, // 530
+			0x13960,0x19cb8,0x1ce5e,0x17b60,0x13930,0x19c9c,0x17b30,0x1bd9c,0x19c8e,0x17b18, // 540
+			0x1390c,0x17b0c,0x13906,0x17b06,0x118b8,0x18c5e,0x139b8,0x1189c,0x17bb8,0x1399c, // 550
+			0x1188e,0x17b9c,0x1398e,0x17b8e,0x1085e,0x118de,0x139de,0x17bde,0x17940,0x1bcb0, // 560
+			0x1de5c,0x17920,0x1bc98,0x1de4e,0x17910,0x1bc8c,0x17908,0x1bc86,0x17904,0x17902, // 570
+			0x138b0,0x19c5c,0x179b0,0x13898,0x19c4e,0x17998,0x1bcce,0x1798c,0x13886,0x17986, // 580
+			0x1185c,0x138dc,0x1184e,0x179dc,0x138ce,0x179ce,0x178a0,0x1bc58,0x1de2e,0x17890, // 590
+			0x1bc4c,0x17888,0x1bc46,0x17884,0x17882,0x13858,0x19c2e,0x178d8,0x1384c,0x178cc, // 600
+			0x13846,0x178c6,0x1182e,0x1386e,0x178ee,0x17850,0x1bc2c,0x17848,0x1bc26,0x17844, // 610
+			0x17842,0x1382c,0x1786c,0x13826,0x17866,0x17828,0x1bc16,0x17824,0x17822,0x13816, // 620
+			0x17836,0x10578,0x182be,0x1053c,0x1051e,0x105be,0x10d70,0x186bc,0x10d38,0x1869e, // 630
+			0x10d1c,0x10d0e,0x104bc,0x10dbc,0x1049e,0x10d9e,0x11d60,0x18eb8,0x1c75e,0x11d30, // 640
+			0x18e9c,0x11d18,0x18e8e,0x11d0c,0x11d06,0x10cb8,0x1865e,0x11db8,0x10c9c,0x11d9c, // 650
+			0x10c8e,0x11d8e,0x1045e,0x10cde,0x11dde,0x13d40,0x19eb0,0x1cf5c,0x13d20,0x19e98, // 660
+			0x1cf4e,0x13d10,0x19e8c,0x13d08,0x19e86,0x13d04,0x13d02,0x11cb0,0x18e5c,0x13db0, // 670
+			0x11c98,0x18e4e,0x13d98,0x19ece,0x13d8c,0x11c86,0x13d86,0x10c5c,0x11cdc,0x10c4e, // 680
+			0x13ddc,0x11cce,0x13dce,0x1bea0,0x1df58,0x1efae,0x1be90,0x1df4c,0x1be88,0x1df46, // 690
+			0x1be84,0x1be82,0x13ca0,0x19e58,0x1cf2e,0x17da0,0x13c90,0x19e4c,0x17d90,0x1becc, // 700
+			0x19e46,0x17d88,0x13c84,0x17d84,0x13c82,0x17d82,0x11c58,0x18e2e,0x13cd8,0x11c4c, // 710
+			0x17dd8,0x13ccc,0x11c46,0x17dcc,0x13cc6,0x17dc6,0x10c2e,0x11c6e,0x13cee,0x17dee, // 720
+			0x1be50,0x1df2c,0x1be48,0x1df26,0x1be44,0x1be42,0x13c50,0x19e2c,0x17cd0,0x13c48, // 730
+			0x19e26,0x17cc8,0x1be66,0x17cc4,0x13c42,0x17cc2,0x11c2c,0x13c6c,0x11c26,0x17cec, // 740
+			0x13c66,0x17ce6,0x1be28,0x1df16,0x1be24,0x1be22,0x13c28,0x19e16,0x17c68,0x13c24, // 750
+			0x17c64,0x13c22,0x17c62,0x11c16,0x13c36,0x17c76,0x1be14,0x1be12,0x13c14,0x17c34, // 760
+			0x13c12,0x17c32,0x102bc,0x1029e,0x106b8,0x1835e,0x1069c,0x1068e,0x1025e,0x106de, // 770
+			0x10eb0,0x1875c,0x10e98,0x1874e,0x10e8c,0x10e86,0x1065c,0x10edc,0x1064e,0x10ece, // 780
+			0x11ea0,0x18f58,0x1c7ae,0x11e90,0x18f4c,0x11e88,0x18f46,0x11e84,0x11e82,0x10e58, // 790
+			0x1872e,0x11ed8,0x18f6e,0x11ecc,0x10e46,0x11ec6,0x1062e,0x10e6e,0x11eee,0x19f50, // 800
+			0x1cfac,0x19f48,0x1cfa6,0x19f44,0x19f42,0x11e50,0x18f2c,0x13ed0,0x19f6c,0x18f26, // 810
+			0x13ec8,0x11e44,0x13ec4,0x11e42,0x13ec2,0x10e2c,0x11e6c,0x10e26,0x13eec,0x11e66, // 820
+			0x13ee6,0x1dfa8,0x1efd6,0x1dfa4,0x1dfa2,0x19f28,0x1cf96,0x1bf68,0x19f24,0x1bf64, // 830
+			0x19f22,0x1bf62,0x11e28,0x18f16,0x13e68,0x11e24,0x17ee8,0x13e64,0x11e22,0x17ee4, // 840
+			0x13e62,0x17ee2,0x10e16,0x11e36,0x13e76,0x17ef6,0x1df94,0x1df92,0x19f14,0x1bf34, // 850
+			0x19f12,0x1bf32,0x11e14,0x13e34,0x11e12,0x17e74,0x13e32,0x17e72,0x1df8a,0x19f0a, // 860
+			0x1bf1a,0x11e0a,0x13e1a,0x17e3a,0x1035c,0x1034e,0x10758,0x183ae,0x1074c,0x10746, // 870
+			0x1032e,0x1076e,0x10f50,0x187ac,0x10f48,0x187a6,0x10f44,0x10f42,0x1072c,0x10f6c, // 880
+			0x10726,0x10f66,0x18fa8,0x1c7d6,0x18fa4,0x18fa2,0x10f28,0x18796,0x11f68,0x18fb6, // 890
+			0x11f64,0x10f22,0x11f62,0x10716,0x10f36,0x11f76,0x1cfd4,0x1cfd2,0x18f94,0x19fb4, // 900
+			0x18f92,0x19fb2,0x10f14,0x11f34,0x10f12,0x13f74,0x11f32,0x13f72,0x1cfca,0x18f8a, // 910
+			0x19f9a,0x10f0a,0x11f1a,0x13f3a,0x103ac,0x103a6,0x107a8,0x183d6,0x107a4,0x107a2, // 920
+			0x10396,0x107b6,0x187d4,0x187d2,0x10794,0x10fb4,0x10792,0x10fb2,0x1c7ea)         // 929
+	); // end of $clusters array
+
+	/**
+	 * Array of factors of the Reed-Solomon polynomial equations used for error correction; one sub array for each correction level (0-8).
+	 * @protected
+	 */
+	protected $rsfactors = array(
+		array( // ECL 0 (2 factors) -------------------------------------------------------------------------------
+			0x01b,0x395),                                                                                    //   2
+		array( // ECL 1 (4 factors) -------------------------------------------------------------------------------
+			0x20a,0x238,0x2d3,0x329),                                                                        //   4
+		array( // ECL 2 (8 factors) -------------------------------------------------------------------------------
+			0x0ed,0x134,0x1b4,0x11c,0x286,0x28d,0x1ac,0x17b),                                                //   8
+		array( // ECL 3 (16 factors) ------------------------------------------------------------------------------
+			0x112,0x232,0x0e8,0x2f3,0x257,0x20c,0x321,0x084,0x127,0x074,0x1ba,0x1ac,0x127,0x02a,0x0b0,0x041),//  16
+		array( // ECL 4 (32 factors) ------------------------------------------------------------------------------
+			0x169,0x23f,0x39a,0x20d,0x0b0,0x24a,0x280,0x141,0x218,0x2e6,0x2a5,0x2e6,0x2af,0x11c,0x0c1,0x205, //  16
+			0x111,0x1ee,0x107,0x093,0x251,0x320,0x23b,0x140,0x323,0x085,0x0e7,0x186,0x2ad,0x14a,0x03f,0x19a),//  32
+		array( // ECL 5 (64 factors) ------------------------------------------------------------------------------
+			0x21b,0x1a6,0x006,0x05d,0x35e,0x303,0x1c5,0x06a,0x262,0x11f,0x06b,0x1f9,0x2dd,0x36d,0x17d,0x264, //  16
+			0x2d3,0x1dc,0x1ce,0x0ac,0x1ae,0x261,0x35a,0x336,0x21f,0x178,0x1ff,0x190,0x2a0,0x2fa,0x11b,0x0b8, //  32
+			0x1b8,0x023,0x207,0x01f,0x1cc,0x252,0x0e1,0x217,0x205,0x160,0x25d,0x09e,0x28b,0x0c9,0x1e8,0x1f6, //  48
+			0x288,0x2dd,0x2cd,0x053,0x194,0x061,0x118,0x303,0x348,0x275,0x004,0x17d,0x34b,0x26f,0x108,0x21f),//  64
+		array( // ECL 6 (128 factors) -----------------------------------------------------------------------------
+			0x209,0x136,0x360,0x223,0x35a,0x244,0x128,0x17b,0x035,0x30b,0x381,0x1bc,0x190,0x39d,0x2ed,0x19f, //  16
+			0x336,0x05d,0x0d9,0x0d0,0x3a0,0x0f4,0x247,0x26c,0x0f6,0x094,0x1bf,0x277,0x124,0x38c,0x1ea,0x2c0, //  32
+			0x204,0x102,0x1c9,0x38b,0x252,0x2d3,0x2a2,0x124,0x110,0x060,0x2ac,0x1b0,0x2ae,0x25e,0x35c,0x239, //  48
+			0x0c1,0x0db,0x081,0x0ba,0x0ec,0x11f,0x0c0,0x307,0x116,0x0ad,0x028,0x17b,0x2c8,0x1cf,0x286,0x308, //  64
+			0x0ab,0x1eb,0x129,0x2fb,0x09c,0x2dc,0x05f,0x10e,0x1bf,0x05a,0x1fb,0x030,0x0e4,0x335,0x328,0x382, //  80
+			0x310,0x297,0x273,0x17a,0x17e,0x106,0x17c,0x25a,0x2f2,0x150,0x059,0x266,0x057,0x1b0,0x29e,0x268, //  96
+			0x09d,0x176,0x0f2,0x2d6,0x258,0x10d,0x177,0x382,0x34d,0x1c6,0x162,0x082,0x32e,0x24b,0x324,0x022, // 112
+			0x0d3,0x14a,0x21b,0x129,0x33b,0x361,0x025,0x205,0x342,0x13b,0x226,0x056,0x321,0x004,0x06c,0x21b),// 128
+		array( // ECL 7 (256 factors) -----------------------------------------------------------------------------
+			0x20c,0x37e,0x04b,0x2fe,0x372,0x359,0x04a,0x0cc,0x052,0x24a,0x2c4,0x0fa,0x389,0x312,0x08a,0x2d0, //  16
+			0x35a,0x0c2,0x137,0x391,0x113,0x0be,0x177,0x352,0x1b6,0x2dd,0x0c2,0x118,0x0c9,0x118,0x33c,0x2f5, //  32
+			0x2c6,0x32e,0x397,0x059,0x044,0x239,0x00b,0x0cc,0x31c,0x25d,0x21c,0x391,0x321,0x2bc,0x31f,0x089, //  48
+			0x1b7,0x1a2,0x250,0x29c,0x161,0x35b,0x172,0x2b6,0x145,0x0f0,0x0d8,0x101,0x11c,0x225,0x0d1,0x374, //  64
+			0x13b,0x046,0x149,0x319,0x1ea,0x112,0x36d,0x0a2,0x2ed,0x32c,0x2ac,0x1cd,0x14e,0x178,0x351,0x209, //  80
+			0x133,0x123,0x323,0x2c8,0x013,0x166,0x18f,0x38c,0x067,0x1ff,0x033,0x008,0x205,0x0e1,0x121,0x1d6, //  96
+			0x27d,0x2db,0x042,0x0ff,0x395,0x10d,0x1cf,0x33e,0x2da,0x1b1,0x350,0x249,0x088,0x21a,0x38a,0x05a, // 112
+			0x002,0x122,0x2e7,0x0c7,0x28f,0x387,0x149,0x031,0x322,0x244,0x163,0x24c,0x0bc,0x1ce,0x00a,0x086, // 128
+			0x274,0x140,0x1df,0x082,0x2e3,0x047,0x107,0x13e,0x176,0x259,0x0c0,0x25d,0x08e,0x2a1,0x2af,0x0ea, // 144
+			0x2d2,0x180,0x0b1,0x2f0,0x25f,0x280,0x1c7,0x0c1,0x2b1,0x2c3,0x325,0x281,0x030,0x03c,0x2dc,0x26d, // 160
+			0x37f,0x220,0x105,0x354,0x28f,0x135,0x2b9,0x2f3,0x2f4,0x03c,0x0e7,0x305,0x1b2,0x1a5,0x2d6,0x210, // 176
+			0x1f7,0x076,0x031,0x31b,0x020,0x090,0x1f4,0x0ee,0x344,0x18a,0x118,0x236,0x13f,0x009,0x287,0x226, // 192
+			0x049,0x392,0x156,0x07e,0x020,0x2a9,0x14b,0x318,0x26c,0x03c,0x261,0x1b9,0x0b4,0x317,0x37d,0x2f2, // 208
+			0x25d,0x17f,0x0e4,0x2ed,0x2f8,0x0d5,0x036,0x129,0x086,0x036,0x342,0x12b,0x39a,0x0bf,0x38e,0x214, // 224
+			0x261,0x33d,0x0bd,0x014,0x0a7,0x01d,0x368,0x1c1,0x053,0x192,0x029,0x290,0x1f9,0x243,0x1e1,0x0ad, // 240
+			0x194,0x0fb,0x2b0,0x05f,0x1f1,0x22b,0x282,0x21f,0x133,0x09f,0x39c,0x22e,0x288,0x037,0x1f1,0x00a),// 256
+		array( // ECL 8 (512 factors) -----------------------------------------------------------------------------
+			0x160,0x04d,0x175,0x1f8,0x023,0x257,0x1ac,0x0cf,0x199,0x23e,0x076,0x1f2,0x11d,0x17c,0x15e,0x1ec, //  16
+			0x0c5,0x109,0x398,0x09b,0x392,0x12b,0x0e5,0x283,0x126,0x367,0x132,0x058,0x057,0x0c1,0x160,0x30d, //  32
+			0x34e,0x04b,0x147,0x208,0x1b3,0x21f,0x0cb,0x29a,0x0f9,0x15a,0x30d,0x26d,0x280,0x10c,0x31a,0x216, //  48
+			0x21b,0x30d,0x198,0x186,0x284,0x066,0x1dc,0x1f3,0x122,0x278,0x221,0x025,0x35a,0x394,0x228,0x029, //  64
+			0x21e,0x121,0x07a,0x110,0x17f,0x320,0x1e5,0x062,0x2f0,0x1d8,0x2f9,0x06b,0x310,0x35c,0x292,0x2e5, //  80
+			0x122,0x0cc,0x2a9,0x197,0x357,0x055,0x063,0x03e,0x1e2,0x0b4,0x014,0x129,0x1c3,0x251,0x391,0x08e, //  96
+			0x328,0x2ac,0x11f,0x218,0x231,0x04c,0x28d,0x383,0x2d9,0x237,0x2e8,0x186,0x201,0x0c0,0x204,0x102, // 112
+			0x0f0,0x206,0x31a,0x18b,0x300,0x350,0x033,0x262,0x180,0x0a8,0x0be,0x33a,0x148,0x254,0x312,0x12f, // 128
+			0x23a,0x17d,0x19f,0x281,0x09c,0x0ed,0x097,0x1ad,0x213,0x0cf,0x2a4,0x2c6,0x059,0x0a8,0x130,0x192, // 144
+			0x028,0x2c4,0x23f,0x0a2,0x360,0x0e5,0x041,0x35d,0x349,0x200,0x0a4,0x1dd,0x0dd,0x05c,0x166,0x311, // 160
+			0x120,0x165,0x352,0x344,0x33b,0x2e0,0x2c3,0x05e,0x008,0x1ee,0x072,0x209,0x002,0x1f3,0x353,0x21f, // 176
+			0x098,0x2d9,0x303,0x05f,0x0f8,0x169,0x242,0x143,0x358,0x31d,0x121,0x033,0x2ac,0x1d2,0x215,0x334, // 192
+			0x29d,0x02d,0x386,0x1c4,0x0a7,0x156,0x0f4,0x0ad,0x023,0x1cf,0x28b,0x033,0x2bb,0x24f,0x1c4,0x242, // 208
+			0x025,0x07c,0x12a,0x14c,0x228,0x02b,0x1ab,0x077,0x296,0x309,0x1db,0x352,0x2fc,0x16c,0x242,0x38f, // 224
+			0x11b,0x2c7,0x1d8,0x1a4,0x0f5,0x120,0x252,0x18a,0x1ff,0x147,0x24d,0x309,0x2bb,0x2b0,0x02b,0x198, // 240
+			0x34a,0x17f,0x2d1,0x209,0x230,0x284,0x2ca,0x22f,0x03e,0x091,0x369,0x297,0x2c9,0x09f,0x2a0,0x2d9, // 256
+			0x270,0x03b,0x0c1,0x1a1,0x09e,0x0d1,0x233,0x234,0x157,0x2b5,0x06d,0x260,0x233,0x16d,0x0b5,0x304, // 272
+			0x2a5,0x136,0x0f8,0x161,0x2c4,0x19a,0x243,0x366,0x269,0x349,0x278,0x35c,0x121,0x218,0x023,0x309, // 288
+			0x26a,0x24a,0x1a8,0x341,0x04d,0x255,0x15a,0x10d,0x2f5,0x278,0x2b7,0x2ef,0x14b,0x0f7,0x0b8,0x02d, // 304
+			0x313,0x2a8,0x012,0x042,0x197,0x171,0x036,0x1ec,0x0e4,0x265,0x33e,0x39a,0x1b5,0x207,0x284,0x389, // 320
+			0x315,0x1a4,0x131,0x1b9,0x0cf,0x12c,0x37c,0x33b,0x08d,0x219,0x17d,0x296,0x201,0x038,0x0fc,0x155, // 336
+			0x0f2,0x31d,0x346,0x345,0x2d0,0x0e0,0x133,0x277,0x03d,0x057,0x230,0x136,0x2f4,0x299,0x18d,0x328, // 352
+			0x353,0x135,0x1d9,0x31b,0x17a,0x01f,0x287,0x393,0x1cb,0x326,0x24e,0x2db,0x1a9,0x0d8,0x224,0x0f9, // 368
+			0x141,0x371,0x2bb,0x217,0x2a1,0x30e,0x0d2,0x32f,0x389,0x12f,0x34b,0x39a,0x119,0x049,0x1d5,0x317, // 384
+			0x294,0x0a2,0x1f2,0x134,0x09b,0x1a6,0x38b,0x331,0x0bb,0x03e,0x010,0x1a9,0x217,0x150,0x11e,0x1b5, // 400
+			0x177,0x111,0x262,0x128,0x0b7,0x39b,0x074,0x29b,0x2ef,0x161,0x03e,0x16e,0x2b3,0x17b,0x2af,0x34a, // 416
+			0x025,0x165,0x2d0,0x2e6,0x14a,0x005,0x027,0x39b,0x137,0x1a8,0x0f2,0x2ed,0x141,0x036,0x29d,0x13c, // 432
+			0x156,0x12b,0x216,0x069,0x29b,0x1e8,0x280,0x2a0,0x240,0x21c,0x13c,0x1e6,0x2d1,0x262,0x02e,0x290, // 448
+			0x1bf,0x0ab,0x268,0x1d0,0x0be,0x213,0x129,0x141,0x2fa,0x2f0,0x215,0x0af,0x086,0x00e,0x17d,0x1b1, // 464
+			0x2cd,0x02d,0x06f,0x014,0x254,0x11c,0x2e0,0x08a,0x286,0x19b,0x36d,0x29d,0x08d,0x397,0x02d,0x30c, // 480
+			0x197,0x0a4,0x14c,0x383,0x0a5,0x2d6,0x258,0x145,0x1f2,0x28f,0x165,0x2f0,0x300,0x0df,0x351,0x287, // 496
+			0x03f,0x136,0x35f,0x0fb,0x16e,0x130,0x11a,0x2e2,0x2a3,0x19a,0x185,0x0f4,0x01f,0x079,0x12f,0x107) // 512
+	);
+
+	/**
+	 * This is the class constructor.
+	 * Creates a PDF417 object
+	 * @param $code (string) code to represent using PDF417
+	 * @param $ecl (int) error correction level (0-8); default -1 = automatic correction level
+	 * @param $aspectratio (float) the width to height of the symbol (excluding quiet zones)
+	 * @param $macro (array) information for macro block
+	 * @public
+	 */
+	public function __construct($code, $ecl=-1, $aspectratio=2, $macro=array()) {
+		$barcode_array = array();
+		if ((is_null($code)) OR ($code == '\0') OR ($code == '')) {
+			return false;
+		}
+		// get the input sequence array
+		$sequence = $this->getInputSequences($code);
+		$codewords = array(); // array of code-words
+		foreach($sequence as $seq) {
+			$cw = $this->getCompaction($seq[0], $seq[1], true);
+			$codewords = array_merge($codewords, $cw);
+		}
+		if ($codewords[0] == 900) {
+			// Text Alpha is the default mode, so remove the first code
+			array_shift($codewords);
+		}
+		// count number of codewords
+		$numcw = count($codewords);
+		if ($numcw > 925) {
+			// reached maximum data codeword capacity
+			return false;
+		}
+		// build macro control block codewords
+		if (!empty($macro)) {
+			$macrocw = array();
+			// beginning of macro control block
+			$macrocw[] = 928;
+			// segment index
+			$cw = $this->getCompaction(902, sprintf('%05d', $macro['segment_index']), false);
+			$macrocw = array_merge($macrocw, $cw);
+			// file ID
+			$cw = $this->getCompaction(900, $macro['file_id'], false);
+			$macrocw = array_merge($macrocw, $cw);
+			// optional fields
+			$optmodes = array(900,902,902,900,900,902,902);
+			$optsize = array(-1,2,4,-1,-1,-1,2);
+			foreach ($optmodes as $k => $omode) {
+				if (isset($macro['option_'.$k])) {
+					$macrocw[] = 923;
+					$macrocw[] = $k;
+					if ($optsize[$k] == 2) {
+						$macro['option_'.$k] = sprintf('%05d', $macro['option_'.$k]);
+					} elseif ($optsize[$k] == 4) {
+						$macro['option_'.$k] = sprintf('%010d', $macro['option_'.$k]);
+					}
+					$cw = $this->getCompaction($omode, $macro['option_'.$k], false);
+					$macrocw = array_merge($macrocw, $cw);
+				}
+			}
+			if ($macro['segment_index'] == ($macro['segment_total'] - 1)) {
+				// end of control block
+				$macrocw[] = 922;
+			}
+			// update total codewords
+			$numcw += count($macrocw);
+		}
+		// set error correction level
+		$ecl = $this->getErrorCorrectionLevel($ecl, $numcw);
+		// number of codewords for error correction
+		$errsize = (2 << $ecl);
+		// calculate number of columns (number of codewords per row) and rows
+		$nce = ($numcw + $errsize + 1);
+		$cols = round((sqrt(4761 + (68 * $aspectratio * ROWHEIGHT * $nce)) - 69) / 34);
+		// adjust cols
+		if ($cols < 1) {
+			$cols = 1;
+		} elseif ($cols > 30) {
+			$cols = 30;
+		}
+		$rows = ceil($nce / $cols);
+		$size = ($cols * $rows);
+		// adjust rows
+		if (($rows < 3) OR ($rows > 90)) {
+			if ($rows < 3) {
+				$rows = 3;
+			} elseif ($rows > 90) {
+				$rows = 90;
+			}
+			$cols = ceil($size / $rows);
+			$size = ($cols * $rows);
+		}
+		if ($size > 928) {
+			// set dimensions to get maximum capacity
+			if (abs($aspectratio - (17 * 29 / 32)) < abs($aspectratio - (17 * 16 / 58))) {
+				$cols = 29;
+				$rows = 32;
+			} else {
+				$cols = 16;
+				$rows = 58;
+			}
+			$size = 928;
+		}
+		// calculate padding
+		$pad = ($size - $nce);
+		if ($pad > 0) {
+			if (($size - $rows) == $nce) {
+				--$rows;
+				$size -= $rows;
+			} else {
+				// add pading
+				$codewords = array_merge($codewords, array_fill(0, $pad, 900));
+			}
+		}
+		if (!empty($macro)) {
+			// add macro section
+			$codewords = array_merge($codewords, $macrocw);
+		}
+		// Symbol Lenght Descriptor (number of data codewords including Symbol Lenght Descriptor and pad codewords)
+		$sld = $size - $errsize;
+		// add symbol length description
+		array_unshift($codewords, $sld);
+		// calculate error correction
+		$ecw = $this->getErrorCorrection($codewords, $ecl);
+		// add error correction codewords
+		$codewords = array_merge($codewords, $ecw);
+		// add horizontal quiet zones to start and stop patterns
+		$pstart = str_repeat('0', QUIETH).$this->start_pattern;
+		$pstop = $this->stop_pattern.str_repeat('0', QUIETH);
+		$barcode_array['num_rows'] = ($rows * ROWHEIGHT) + (2 * QUIETV);
+		$barcode_array['num_cols'] = (($cols + 2) * 17) + 35 + (2 * QUIETH);
+		$barcode_array['bcode'] = array();
+		// build rows for vertical quiet zone
+		if (QUIETV > 0) {
+			$empty_row = array_fill(0, $barcode_array['num_cols'], 0);
+			for ($i = 0; $i < QUIETV; ++$i) {
+				// add vertical quiet rows
+				$barcode_array['bcode'][] = $empty_row;
+			}
+		}
+		$k = 0; // codeword index
+		$cid = 0; // initial cluster
+		// for each row
+		for ($r = 0; $r < $rows; ++$r) {
+			// row start code
+			$row = $pstart;
+			switch ($cid) {
+				case 0: {
+					$L = ((30 * intval($r / 3)) + intval(($rows - 1) / 3));
+					break;
+				}
+				case 1: {
+					$L = ((30 * intval($r / 3)) + ($ecl * 3) + (($rows - 1) % 3));
+					break;
+				}
+				case 2: {
+					$L = ((30 * intval($r / 3)) + ($cols - 1));
+					break;
+				}
+			}
+			// left row indicator
+			$row .= sprintf('%17b', $this->clusters[$cid][$L]);
+			// for each column
+			for ($c = 0; $c < $cols; ++$c) {
+				$row .= sprintf('%17b', $this->clusters[$cid][$codewords[$k]]);
+				++$k;
+			}
+			switch ($cid) {
+				case 0: {
+					$L = ((30 * intval($r / 3)) + ($cols - 1));
+					break;
+				}
+				case 1: {
+					$L = ((30 * intval($r / 3)) + intval(($rows - 1) / 3));
+					break;
+				}
+				case 2: {
+					$L = ((30 * intval($r / 3)) + ($ecl * 3) + (($rows - 1) % 3));
+					break;
+				}
+			}
+			// right row indicator
+			$row .= sprintf('%17b', $this->clusters[$cid][$L]);
+			// row stop code
+			$row .= $pstop;
+			// convert the string to array
+			$arow = preg_split('//', $row, -1, PREG_SPLIT_NO_EMPTY);
+			// duplicate row to get the desired height
+			for ($h = 0; $h < ROWHEIGHT; ++$h) {
+				$barcode_array['bcode'][] = $arow;
+			}
+			++$cid;
+			if ($cid > 2) {
+				$cid = 0;
+			}
+		}
+		if (QUIETV > 0) {
+			for ($i = 0; $i < QUIETV; ++$i) {
+				// add vertical quiet rows
+				$barcode_array['bcode'][] = $empty_row;
+			}
+		}
+		$this->barcode_array = $barcode_array;
+	}
+
+	/**
+	 * Returns a barcode array which is readable by TCPDF
+	 * @return array barcode array readable by TCPDF;
+	 * @public
+	 */
+	public function getBarcodeArray() {
+		return $this->barcode_array;
+	}
+
+	/**
+	 * Returns the error correction level (0-8) to be used
+	 * @param $ecl (int) error correction level
+	 * @param $numcw (int) number of data codewords
+	 * @return int error correction level
+	 * @protected
+	 */
+	protected function getErrorCorrectionLevel($ecl, $numcw) {
+		// get maximum correction level
+		$maxecl = 8; // starting error level
+		$maxerrsize = (928 - $numcw); // available codewords for error
+		while ($maxecl > 0) {
+			$errsize = (2 << $ecl);
+			if ($maxerrsize >= $errsize) {
+				break;
+			}
+			--$maxecl;
+		}
+		// check for automatic levels
+		if (($ecl < 0) OR ($ecl > 8)) {
+			if ($numcw < 41) {
+				$ecl = 2;
+			} elseif ($numcw < 161) {
+				$ecl = 3;
+			} elseif ($numcw < 321) {
+				$ecl = 4;
+			} elseif ($numcw < 864) {
+				$ecl = 5;
+			} else {
+				$ecl = $maxecl;
+			}
+		}
+		if ($ecl > $maxecl) {
+			$ecl = $maxecl;
+		}
+		return $ecl;
+	}
+
+	/**
+	 * Returns the error correction codewords
+	 * @param $cw (array) array of codewords including Symbol Lenght Descriptor and pad
+	 * @param $ecl (int) error correction level 0-8
+	 * @return array of error correction codewords
+	 * @protected
+	 */
+	protected function getErrorCorrection($cw, $ecl) {
+		// get error correction coefficients
+		$ecc = $this->rsfactors[$ecl];
+		// number of error correction factors
+		$eclsize = (2 << $ecl);
+		// maximum index for $rsfactors[$ecl]
+		$eclmaxid = ($eclsize - 1);
+		// initialize array of error correction codewords
+		$ecw = array_fill(0, $eclsize, 0);
+		// for each data codeword
+		foreach($cw as $k => $d) {
+			$t1 = ($d + $ecw[$eclmaxid]) % 929;
+			for ($j = $eclmaxid; $j > 0; --$j) {
+				$t2 = ($t1 * $ecc[$j]) % 929;
+				$t3 = 929 - $t2;
+				$ecw[$j] = ($ecw[($j - 1)] + $t3) % 929;
+			}
+			$t2 = ($t1 * $ecc[0]) % 929;
+			$t3 = 929 - $t2;
+			$ecw[0] = $t3 % 929;
+		}
+		foreach($ecw as $j => $e) {
+			if ($e != 0) {
+				$ecw[$j] = 929 - $e;
+			}
+		}
+		$ecw = array_reverse($ecw);
+		return $ecw;
+	}
+
+	/**
+	 * Create array of sequences from input
+	 * @param $code (string) code
+	 * @return bidimensional array containing characters and classification
+	 * @protected
+	 */
+	protected function getInputSequences($code) {
+		$sequence_array = array(); // array to be returned
+		$numseq = array();
+		// get numeric sequences
+		preg_match_all('/([0-9]{13,44})/', $code, $numseq, PREG_OFFSET_CAPTURE);
+		$numseq[1][] = array('', strlen($code));
+		$offset = 0;
+		foreach($numseq[1] as $seq) {
+			$seqlen = strlen($seq[0]);
+			if ($seq[1] > 0) {
+				// extract text sequence before the number sequence
+				$prevseq = substr($code, $offset, ($seq[1] - $offset));
+				$textseq = array();
+				// get text sequences
+				preg_match_all('/([\x09\x0a\x0d\x20-\x7e]{5,})/', $prevseq, $textseq, PREG_OFFSET_CAPTURE);
+				$textseq[1][] = array('', strlen($prevseq));
+				$txtoffset = 0;
+				foreach($textseq[1] as $txtseq) {
+					$txtseqlen = strlen($txtseq[0]);
+					if ($txtseq[1] > 0) {
+						// extract byte sequence before the text sequence
+						$prevtxtseq = substr($prevseq, $txtoffset, ($txtseq[1] - $txtoffset));
+						if (strlen($prevtxtseq) > 0) {
+							// add BYTE sequence
+							if ((strlen($prevtxtseq) == 1) AND ((count($sequence_array) > 0) AND ($sequence_array[(count($sequence_array) - 1)][0] == 900))) {
+								$sequence_array[] = array(913, $prevtxtseq);
+							} elseif ((strlen($prevtxtseq) % 6) == 0) {
+								$sequence_array[] = array(924, $prevtxtseq);
+							} else {
+								$sequence_array[] = array(901, $prevtxtseq);
+							}
+						}
+					}
+					if ($txtseqlen > 0) {
+						// add numeric sequence
+						$sequence_array[] = array(900, $txtseq[0]);
+					}
+					$txtoffset = $txtseq[1] + $txtseqlen;
+				}
+			}
+			if ($seqlen > 0) {
+				// add numeric sequence
+				$sequence_array[] = array(902, $seq[0]);
+			}
+			$offset = $seq[1] + $seqlen;
+		}
+		return $sequence_array;
+	}
+
+	/**
+	 * Compact data by mode.
+	 * @param $mode (int) compaction mode number
+	 * @param $code (string) data to compact
+	 * @param $addmode (boolean) if true add the mode codeword at first position
+	 * @return array of codewords
+	 * @protected
+	 */
+	protected function getCompaction($mode, $code, $addmode=true) {
+		$cw = array(); // array of codewords to return
+		switch($mode) {
+			case 900: { // Text Compaction mode latch
+				$submode = 0; // default Alpha sub-mode
+				$txtarr = array(); // array of characters and sub-mode switching characters
+				$codelen = strlen($code);
+				for ($i = 0; $i < $codelen; ++$i) {
+					$chval = ord($code{$i});
+					if (($k = array_search($chval, $this->textsubmodes[$submode])) !== false) {
+						// we are on the same sub-mode
+						$txtarr[] = $k;
+					} else {
+						// the sub-mode is changed
+						for ($s = 0; $s < 4; ++$s) {
+							// search new sub-mode
+							if (($s != $submode) AND (($k = array_search($chval, $this->textsubmodes[$s])) !== false)) {
+								// $s is the new submode
+								if (((($i + 1) == $codelen) OR ((($i + 1) < $codelen) AND (array_search(ord($code{($i + 1)}), $this->textsubmodes[$submode]) !== false))) AND (($s == 3) OR (($s == 0) AND ($submode == 1)))) {
+									// shift (temporary change only for this char)
+									if ($s == 3) {
+										// shift to puntuaction
+										$txtarr[] = 29;
+									} else {
+										// shift from lower to alpha
+										$txtarr[] = 27;
+									}
+								} else {
+									// latch
+									$txtarr	= array_merge($txtarr, $this->textlatch[''.$submode.$s]);
+									// set new submode
+									$submode = $s;
+								}
+								// add characted code to array
+								$txtarr[] = $k;
+								break;
+							}
+						}
+					}
+				}
+				$txtarrlen = count($txtarr);
+				if (($txtarrlen % 2) != 0) {
+					// add padding
+					$txtarr[] = 29;
+					++$txtarrlen;
+				}
+				// calculate codewords
+				for ($i = 0; $i < $txtarrlen; $i += 2) {
+					$cw[] = (30 * $txtarr[$i]) + $txtarr[($i + 1)];
+				}
+				break;
+			}
+			case 901:
+			case 924: { // Byte Compaction mode latch
+				while (($codelen = strlen($code)) > 0) {
+					if ($codelen > 6) {
+						$rest = substr($code, 6);
+						$code = substr($code, 0, 6);
+						$sublen = 6;
+					} else {
+						$rest = '';
+						$sublen = strlen($code);
+					}
+					if ($sublen == 6) {
+						$t = bcmul(''.ord($code{0}), '1099511627776');
+						$t = bcadd($t, bcmul(''.ord($code{1}), '4294967296'));
+						$t = bcadd($t, bcmul(''.ord($code{2}), '16777216'));
+						$t = bcadd($t, bcmul(''.ord($code{3}), '65536'));
+						$t = bcadd($t, bcmul(''.ord($code{4}), '256'));
+						$t = bcadd($t, ''.ord($code{5}));
+						// tmp array for the 6 bytes block
+						$cw6 = array();
+						do {
+							$d = bcmod($t, '900');
+							$t = bcdiv($t, '900');
+							// prepend the value to the beginning of the array
+							array_unshift($cw6, $d);
+						} while ($t != '0');
+						// append the result array at the end
+						$cw = array_merge($cw, $cw6);
+					} else {
+						for ($i = 0; $i < $sublen; ++$i) {
+							$cw[] = ord($code{$i});
+						}
+					}
+					$code = $rest;
+				}
+				break;
+			}
+			case 902: { // Numeric Compaction mode latch
+				while (($codelen = strlen($code)) > 0) {
+					if ($codelen > 44) {
+						$rest = substr($code, 44);
+						$code = substr($code, 0, 44);
+					} else {
+						$rest = '';
+					}
+					$t = '1'.$code;
+					do {
+						$d = bcmod($t, '900');
+						$t = bcdiv($t, '900');
+						array_unshift($cw, $d);
+					} while ($t != '0');
+					$code = $rest;
+				}
+				break;
+			}
+			case 913: { // Byte Compaction mode shift
+				$cw[] = ord($code);
+				break;
+			}
+		}
+		if ($addmode) {
+			// add the compaction mode codeword at the beginning
+			array_unshift($cw, $mode);
+		}
+		return $cw;
+	}
+
+} // end PDF417 class
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/include/barcodes/qrcode.php b/htmltest/sites/all/libraries/tcpdf-version/include/barcodes/qrcode.php
new file mode 100644
index 00000000..3127fe68
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/include/barcodes/qrcode.php
@@ -0,0 +1,2866 @@
+<?php
+//============================================================+
+// File name   : qrcode.php
+// Version     : 1.0.010
+// Begin       : 2010-03-22
+// Last Update : 2012-07-25
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2010-2012 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// DESCRIPTION :
+//
+// Class to create QR-code arrays for TCPDF class.
+// QR Code symbol is a 2D barcode that can be scanned by
+// handy terminals such as a mobile phone with CCD.
+// The capacity of QR Code is up to 7000 digits or 4000
+// characters, and has high robustness.
+// This class supports QR Code model 2, described in
+// JIS (Japanese Industrial Standards) X0510:2004
+// or ISO/IEC 18004.
+// Currently the following features are not supported:
+// ECI and FNC1 mode, Micro QR Code, QR Code model 1,
+// Structured mode.
+//
+// This class is derived from the following projects:
+// ---------------------------------------------------------
+// "PHP QR Code encoder"
+// License: GNU-LGPLv3
+// Copyright (C) 2010 by Dominik Dzienia <deltalab at poczta dot fm>
+// http://phpqrcode.sourceforge.net/
+// https://sourceforge.net/projects/phpqrcode/
+//
+// The "PHP QR Code encoder" is based on
+// "C libqrencode library" (ver. 3.1.1)
+// License: GNU-LGPL 2.1
+// Copyright (C) 2006-2010 by Kentaro Fukuchi
+// http://megaui.net/fukuchi/works/qrencode/index.en.html
+//
+// Reed-Solomon code encoder is written by Phil Karn, KA9Q.
+// Copyright (C) 2002-2006 Phil Karn, KA9Q
+//
+// QR Code is registered trademark of DENSO WAVE INCORPORATED
+// http://www.denso-wave.com/qrcode/index-e.html
+// ---------------------------------------------------------
+//============================================================+
+
+/**
+ * @file
+ * Class to create QR-code arrays for TCPDF class.
+ * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD.
+ * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness.
+ * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004.
+ * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode.
+ *
+ * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html).
+ * Please read comments on this class source file for full copyright and license information.
+ *
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.010
+ */
+
+// definitions
+if (!defined('QRCODEDEFS')) {
+
+	/**
+	 * Indicate that definitions for this class are set
+	 */
+	define('QRCODEDEFS', true);
+
+	// -----------------------------------------------------
+
+	// Encoding modes (characters which can be encoded in QRcode)
+
+	/**
+	 * Encoding mode
+	 */
+	define('QR_MODE_NL', -1);
+
+	/**
+	 * Encoding mode numeric (0-9). 3 characters are encoded to 10bit length. In theory, 7089 characters or less can be stored in a QRcode.
+	 */
+	define('QR_MODE_NM', 0);
+
+	/**
+	 * Encoding mode alphanumeric (0-9A-Z $%*+-./:) 45characters. 2 characters are encoded to 11bit length. In theory, 4296 characters or less can be stored in a QRcode.
+	 */
+	define('QR_MODE_AN', 1);
+
+	/**
+	 * Encoding mode 8bit byte data. In theory, 2953 characters or less can be stored in a QRcode.
+	 */
+	define('QR_MODE_8B', 2);
+
+	/**
+	 * Encoding mode KANJI. A KANJI character (multibyte character) is encoded to 13bit length. In theory, 1817 characters or less can be stored in a QRcode.
+	 */
+	define('QR_MODE_KJ', 3);
+
+	/**
+	 * Encoding mode STRUCTURED (currently unsupported)
+	 */
+	define('QR_MODE_ST', 4);
+
+	// -----------------------------------------------------
+
+	// Levels of error correction.
+	// QRcode has a function of an error correcting for miss reading that white is black.
+	// Error correcting is defined in 4 level as below.
+
+	/**
+	 * Error correction level L : About 7% or less errors can be corrected.
+	 */
+	define('QR_ECLEVEL_L', 0);
+
+	/**
+	 * Error correction level M : About 15% or less errors can be corrected.
+	 */
+	define('QR_ECLEVEL_M', 1);
+
+	/**
+	 * Error correction level Q : About 25% or less errors can be corrected.
+	 */
+	define('QR_ECLEVEL_Q', 2);
+
+	/**
+	 * Error correction level H : About 30% or less errors can be corrected.
+	 */
+	define('QR_ECLEVEL_H', 3);
+
+	// -----------------------------------------------------
+
+	// Version. Size of QRcode is defined as version.
+	// Version is from 1 to 40.
+	// Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases.
+	// So version 40 is 177*177 matrix.
+
+	/**
+	 * Maximum QR Code version.
+	 */
+	define('QRSPEC_VERSION_MAX', 40);
+
+	/**
+	 * Maximum matrix size for maximum version (version 40 is 177*177 matrix).
+	 */
+    define('QRSPEC_WIDTH_MAX', 177);
+
+	// -----------------------------------------------------
+
+	/**
+	 * Matrix index to get width from $capacity array.
+	 */
+    define('QRCAP_WIDTH',    0);
+
+    /**
+	 * Matrix index to get number of words from $capacity array.
+	 */
+    define('QRCAP_WORDS',    1);
+
+    /**
+	 * Matrix index to get remainder from $capacity array.
+	 */
+    define('QRCAP_REMINDER', 2);
+
+    /**
+	 * Matrix index to get error correction level from $capacity array.
+	 */
+    define('QRCAP_EC',       3);
+
+	// -----------------------------------------------------
+
+	// Structure (currently usupported)
+
+	/**
+	 * Number of header bits for structured mode
+	 */
+    define('STRUCTURE_HEADER_BITS',  20);
+
+    /**
+	 * Max number of symbols for structured mode
+	 */
+    define('MAX_STRUCTURED_SYMBOLS', 16);
+
+	// -----------------------------------------------------
+
+    // Masks
+
+    /**
+	 * Down point base value for case 1 mask pattern (concatenation of same color in a line or a column)
+	 */
+    define('N1',  3);
+
+    /**
+	 * Down point base value for case 2 mask pattern (module block of same color)
+	 */
+	define('N2',  3);
+
+    /**
+	 * Down point base value for case 3 mask pattern (1:1:3:1:1(dark:bright:dark:bright:dark)pattern in a line or a column)
+	 */
+	define('N3', 40);
+
+    /**
+	 * Down point base value for case 4 mask pattern (ration of dark modules in whole)
+	 */
+	define('N4', 10);
+
+	// -----------------------------------------------------
+
+	// Optimization settings
+
+	/**
+	 * if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
+	 */
+	define('QR_FIND_BEST_MASK', true);
+
+	/**
+	 * if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
+	 */
+	define('QR_FIND_FROM_RANDOM', 2);
+
+	/**
+	 * when QR_FIND_BEST_MASK === false
+	 */
+	define('QR_DEFAULT_MASK', 2);
+
+	// -----------------------------------------------------
+
+} // end of definitions
+
+// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
+
+// for compatibility with PHP4
+if (!function_exists('str_split')) {
+	/**
+	 * Convert a string to an array (needed for PHP4 compatibility)
+	 * @param $string (string) The input string.
+	 * @param $split_length (int) Maximum length of the chunk.
+	 * @return  If the optional split_length  parameter is specified, the returned array will be broken down into chunks with each being split_length  in length, otherwise each chunk will be one character in length. FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string , the entire string is returned as the first (and only) array element.
+	 */
+	function str_split($string, $split_length=1) {
+		if ((strlen($string) > $split_length) OR (!$split_length)) {
+			do {
+				$c = strlen($string);
+				$parts[] = substr($string, 0, $split_length);
+				$string = substr($string, $split_length);
+			} while ($string !== false);
+		} else {
+			$parts = array($string);
+		}
+		return $parts;
+	}
+}
+
+// #####################################################
+
+/**
+ * @class QRcode
+ * Class to create QR-code arrays for TCPDF class.
+ * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD.
+ * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness.
+ * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004.
+ * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode.
+ *
+ * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html).
+ * Please read comments on this class source file for full copyright and license information.
+ *
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.010
+ */
+class QRcode {
+
+	/**
+	 * Barcode array to be returned which is readable by TCPDF.
+	 * @protected
+	 */
+	protected $barcode_array = array();
+
+	/**
+	 * QR code version. Size of QRcode is defined as version. Version is from 1 to 40. Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. So version 40 is 177*177 matrix.
+	 * @protected
+	 */
+	protected $version = 0;
+
+	/**
+	 * Levels of error correction. See definitions for possible values.
+	 * @protected
+	 */
+	protected $level = QR_ECLEVEL_L;
+
+	/**
+	 * Encoding mode.
+	 * @protected
+	 */
+	protected $hint = QR_MODE_8B;
+
+	/**
+	 * Boolean flag, if true the input string will be converted to uppercase.
+	 * @protected
+	 */
+	protected $casesensitive = true;
+
+	/**
+	 * Structured QR code (not supported yet).
+	 * @protected
+	 */
+	protected $structured = 0;
+
+	/**
+	 * Mask data.
+	 * @protected
+	 */
+	protected $data;
+
+	// FrameFiller
+
+	/**
+	 * Width.
+	 * @protected
+	 */
+	protected $width;
+
+	/**
+	 * Frame.
+	 * @protected
+	 */
+	protected $frame;
+
+	/**
+	 * X position of bit.
+	 * @protected
+	 */
+	protected $x;
+
+	/**
+	 * Y position of bit.
+	 * @protected
+	 */
+	protected $y;
+
+	/**
+	 * Direction.
+	 * @protected
+	 */
+	protected $dir;
+
+	/**
+	 * Single bit value.
+	 * @protected
+	 */
+	protected $bit;
+
+	// ---- QRrawcode ----
+
+	/**
+	 * Data code.
+	 * @protected
+	 */
+	protected $datacode = array();
+
+	/**
+	 * Error correction code.
+	 * @protected
+	 */
+	protected $ecccode = array();
+
+	/**
+	 * Blocks.
+	 * @protected
+	 */
+	protected $blocks;
+
+	/**
+	 * Reed-Solomon blocks.
+	 * @protected
+	 */
+	protected $rsblocks = array(); //of RSblock
+
+	/**
+	 * Counter.
+	 * @protected
+	 */
+	protected $count;
+
+	/**
+	 * Data length.
+	 * @protected
+	 */
+	protected $dataLength;
+
+	/**
+	 * Error correction length.
+	 * @protected
+	 */
+	protected $eccLength;
+
+	/**
+	 * Value b1.
+	 * @protected
+	 */
+	protected $b1;
+
+	// ---- QRmask ----
+
+	/**
+	 * Run length.
+	 * @protected
+	 */
+	protected $runLength = array();
+
+	// ---- QRsplit ----
+
+	/**
+	 * Input data string.
+	 * @protected
+	 */
+	protected $dataStr = '';
+
+	/**
+	 * Input items.
+	 * @protected
+	 */
+	protected $items;
+
+	// Reed-Solomon items
+
+	/**
+	 * Reed-Solomon items.
+	 * @protected
+	 */
+	protected $rsitems = array();
+
+	/**
+	 * Array of frames.
+	 * @protected
+	 */
+	protected $frames = array();
+
+	/**
+	 * Alphabet-numeric convesion table.
+	 * @protected
+	 */
+	protected $anTable = array(
+		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
+		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
+		36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, //
+		 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 44, -1, -1, -1, -1, -1, //
+		-1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, //
+		25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, //
+		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
+		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1  //
+		);
+
+	/**
+	 * Array Table of the capacity of symbols.
+	 * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004.
+	 * @protected
+	 */
+	protected $capacity = array(
+		array(  0,    0, 0, array(   0,    0,    0,    0)), //
+		array( 21,   26, 0, array(   7,   10,   13,   17)), //  1
+		array( 25,   44, 7, array(  10,   16,   22,   28)), //
+		array( 29,   70, 7, array(  15,   26,   36,   44)), //
+		array( 33,  100, 7, array(  20,   36,   52,   64)), //
+		array( 37,  134, 7, array(  26,   48,   72,   88)), //  5
+		array( 41,  172, 7, array(  36,   64,   96,  112)), //
+		array( 45,  196, 0, array(  40,   72,  108,  130)), //
+		array( 49,  242, 0, array(  48,   88,  132,  156)), //
+		array( 53,  292, 0, array(  60,  110,  160,  192)), //
+		array( 57,  346, 0, array(  72,  130,  192,  224)), // 10
+		array( 61,  404, 0, array(  80,  150,  224,  264)), //
+		array( 65,  466, 0, array(  96,  176,  260,  308)), //
+		array( 69,  532, 0, array( 104,  198,  288,  352)), //
+		array( 73,  581, 3, array( 120,  216,  320,  384)), //
+		array( 77,  655, 3, array( 132,  240,  360,  432)), // 15
+		array( 81,  733, 3, array( 144,  280,  408,  480)), //
+		array( 85,  815, 3, array( 168,  308,  448,  532)), //
+		array( 89,  901, 3, array( 180,  338,  504,  588)), //
+		array( 93,  991, 3, array( 196,  364,  546,  650)), //
+		array( 97, 1085, 3, array( 224,  416,  600,  700)), // 20
+		array(101, 1156, 4, array( 224,  442,  644,  750)), //
+		array(105, 1258, 4, array( 252,  476,  690,  816)), //
+		array(109, 1364, 4, array( 270,  504,  750,  900)), //
+		array(113, 1474, 4, array( 300,  560,  810,  960)), //
+		array(117, 1588, 4, array( 312,  588,  870, 1050)), // 25
+		array(121, 1706, 4, array( 336,  644,  952, 1110)), //
+		array(125, 1828, 4, array( 360,  700, 1020, 1200)), //
+		array(129, 1921, 3, array( 390,  728, 1050, 1260)), //
+		array(133, 2051, 3, array( 420,  784, 1140, 1350)), //
+		array(137, 2185, 3, array( 450,  812, 1200, 1440)), // 30
+		array(141, 2323, 3, array( 480,  868, 1290, 1530)), //
+		array(145, 2465, 3, array( 510,  924, 1350, 1620)), //
+		array(149, 2611, 3, array( 540,  980, 1440, 1710)), //
+		array(153, 2761, 3, array( 570, 1036, 1530, 1800)), //
+		array(157, 2876, 0, array( 570, 1064, 1590, 1890)), // 35
+		array(161, 3034, 0, array( 600, 1120, 1680, 1980)), //
+		array(165, 3196, 0, array( 630, 1204, 1770, 2100)), //
+		array(169, 3362, 0, array( 660, 1260, 1860, 2220)), //
+		array(173, 3532, 0, array( 720, 1316, 1950, 2310)), //
+		array(177, 3706, 0, array( 750, 1372, 2040, 2430))  // 40
+	);
+
+	/**
+	 * Array Length indicator.
+	 * @protected
+	 */
+	protected $lengthTableBits = array(
+		array(10, 12, 14),
+		array( 9, 11, 13),
+		array( 8, 16, 16),
+		array( 8, 10, 12)
+	);
+
+	/**
+	 * Array Table of the error correction code (Reed-Solomon block).
+	 * See Table 12-16 (pp.30-36), JIS X0510:2004.
+	 * @protected
+	 */
+	protected $eccTable = array(
+		array(array( 0,  0), array( 0,  0), array( 0,  0), array( 0,  0)), //
+		array(array( 1,  0), array( 1,  0), array( 1,  0), array( 1,  0)), //  1
+		array(array( 1,  0), array( 1,  0), array( 1,  0), array( 1,  0)), //
+		array(array( 1,  0), array( 1,  0), array( 2,  0), array( 2,  0)), //
+		array(array( 1,  0), array( 2,  0), array( 2,  0), array( 4,  0)), //
+		array(array( 1,  0), array( 2,  0), array( 2,  2), array( 2,  2)), //  5
+		array(array( 2,  0), array( 4,  0), array( 4,  0), array( 4,  0)), //
+		array(array( 2,  0), array( 4,  0), array( 2,  4), array( 4,  1)), //
+		array(array( 2,  0), array( 2,  2), array( 4,  2), array( 4,  2)), //
+		array(array( 2,  0), array( 3,  2), array( 4,  4), array( 4,  4)), //
+		array(array( 2,  2), array( 4,  1), array( 6,  2), array( 6,  2)), // 10
+		array(array( 4,  0), array( 1,  4), array( 4,  4), array( 3,  8)), //
+		array(array( 2,  2), array( 6,  2), array( 4,  6), array( 7,  4)), //
+		array(array( 4,  0), array( 8,  1), array( 8,  4), array(12,  4)), //
+		array(array( 3,  1), array( 4,  5), array(11,  5), array(11,  5)), //
+		array(array( 5,  1), array( 5,  5), array( 5,  7), array(11,  7)), // 15
+		array(array( 5,  1), array( 7,  3), array(15,  2), array( 3, 13)), //
+		array(array( 1,  5), array(10,  1), array( 1, 15), array( 2, 17)), //
+		array(array( 5,  1), array( 9,  4), array(17,  1), array( 2, 19)), //
+		array(array( 3,  4), array( 3, 11), array(17,  4), array( 9, 16)), //
+		array(array( 3,  5), array( 3, 13), array(15,  5), array(15, 10)), // 20
+		array(array( 4,  4), array(17,  0), array(17,  6), array(19,  6)), //
+		array(array( 2,  7), array(17,  0), array( 7, 16), array(34,  0)), //
+		array(array( 4,  5), array( 4, 14), array(11, 14), array(16, 14)), //
+		array(array( 6,  4), array( 6, 14), array(11, 16), array(30,  2)), //
+		array(array( 8,  4), array( 8, 13), array( 7, 22), array(22, 13)), // 25
+		array(array(10,  2), array(19,  4), array(28,  6), array(33,  4)), //
+		array(array( 8,  4), array(22,  3), array( 8, 26), array(12, 28)), //
+		array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), //
+		array(array( 7,  7), array(21,  7), array( 1, 37), array(19, 26)), //
+		array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), // 30
+		array(array(13,  3), array( 2, 29), array(42,  1), array(23, 28)), //
+		array(array(17,  0), array(10, 23), array(10, 35), array(19, 35)), //
+		array(array(17,  1), array(14, 21), array(29, 19), array(11, 46)), //
+		array(array(13,  6), array(14, 23), array(44,  7), array(59,  1)), //
+		array(array(12,  7), array(12, 26), array(39, 14), array(22, 41)), // 35
+		array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), //
+		array(array(17,  4), array(29, 14), array(49, 10), array(24, 46)), //
+		array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), //
+		array(array(20,  4), array(40,  7), array(43, 22), array(10, 67)), //
+		array(array(19,  6), array(18, 31), array(34, 34), array(20, 61))  // 40
+	);
+
+	/**
+	 * Array Positions of alignment patterns.
+	 * This array includes only the second and the third position of the alignment patterns. Rest of them can be calculated from the distance between them.
+	 * See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
+	 * @protected
+	 */
+	protected $alignmentPattern = array(
+		array( 0,  0),
+		array( 0,  0), array(18,  0), array(22,  0), array(26,  0), array(30,  0), //  1- 5
+		array(34,  0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), //  6-10
+		array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), // 11-15
+		array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), // 16-20
+		array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), // 21-25
+		array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), // 26-30
+		array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), // 31-35
+		array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58)  // 35-40
+	);
+
+	/**
+	 * Array Version information pattern (BCH coded).
+	 * See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
+	 * size: [QRSPEC_VERSION_MAX - 6]
+	 * @protected
+	 */
+	protected $versionPattern = array(
+		0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, //
+		0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, //
+		0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, //
+		0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, //
+		0x27541, 0x28c69
+	);
+
+	/**
+	 * Array Format information
+	 * @protected
+	 */
+	protected $formatInfo = array(
+		array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), //
+		array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), //
+		array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), //
+		array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b)  //
+	);
+
+
+	// -------------------------------------------------
+	// -------------------------------------------------
+
+
+	/**
+	 * This is the class constructor.
+	 * Creates a QRcode object
+	 * @param $code (string) code to represent using QRcode
+	 * @param $eclevel (string) error level: <ul><li>L : About 7% or less errors can be corrected.</li><li>M : About 15% or less errors can be corrected.</li><li>Q : About 25% or less errors can be corrected.</li><li>H : About 30% or less errors can be corrected.</li></ul>
+	 * @public
+	 * @since 1.0.000
+	 */
+	public function __construct($code, $eclevel = 'L') {
+		$barcode_array = array();
+		if ((is_null($code)) OR ($code == '\0') OR ($code == '')) {
+			return false;
+		}
+		// set error correction level
+		$this->level = array_search($eclevel, array('L', 'M', 'Q', 'H'));
+		if ($this->level === false) {
+			$this->level = QR_ECLEVEL_L;
+		}
+		if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) {
+			return false;
+		}
+		if (($this->version < 0) OR ($this->version > QRSPEC_VERSION_MAX)) {
+			return false;
+		}
+		$this->items = array();
+		$this->encodeString($code);
+		if (is_null($this->data)) {
+			return false;
+		}
+		$qrTab = $this->binarize($this->data);
+		$size = count($qrTab);
+		$barcode_array['num_rows'] = $size;
+		$barcode_array['num_cols'] = $size;
+		$barcode_array['bcode'] = array();
+		foreach ($qrTab as $line) {
+			$arrAdd = array();
+			foreach (str_split($line) as $char) {
+				$arrAdd[] = ($char=='1')?1:0;
+			}
+			$barcode_array['bcode'][] = $arrAdd;
+		}
+		$this->barcode_array = $barcode_array;
+	}
+
+	/**
+	 * Returns a barcode array which is readable by TCPDF
+	 * @return array barcode array readable by TCPDF;
+	 * @public
+	 */
+	public function getBarcodeArray() {
+		return $this->barcode_array;
+	}
+
+	/**
+	 * Convert the frame in binary form
+	 * @param $frame (array) array to binarize
+	 * @return array frame in binary form
+	 */
+	protected function binarize($frame) {
+		$len = count($frame);
+		// the frame is square (width = height)
+		foreach ($frame as &$frameLine) {
+			for ($i=0; $i<$len; $i++) {
+				$frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
+			}
+		}
+		return $frame;
+	}
+
+	/**
+	 * Encode the input string to QR code
+	 * @param $string (string) input string to encode
+	 */
+	protected function encodeString($string) {
+		$this->dataStr = $string;
+		if (!$this->casesensitive) {
+			$this->toUpper();
+		}
+		$ret = $this->splitString();
+		if ($ret < 0) {
+			return NULL;
+		}
+		$this->encodeMask(-1);
+	}
+
+	/**
+	 * Encode mask
+	 * @param $mask (int) masking mode
+	 */
+	protected function encodeMask($mask) {
+		$spec = array(0, 0, 0, 0, 0);
+		$this->datacode = $this->getByteStream($this->items);
+		if (is_null($this->datacode)) {
+			return NULL;
+		}
+		$spec = $this->getEccSpec($this->version, $this->level, $spec);
+		$this->b1 = $this->rsBlockNum1($spec);
+		$this->dataLength = $this->rsDataLength($spec);
+		$this->eccLength = $this->rsEccLength($spec);
+		$this->ecccode = array_fill(0, $this->eccLength, 0);
+		$this->blocks = $this->rsBlockNum($spec);
+		$ret = $this->init($spec);
+		if ($ret < 0) {
+			return NULL;
+		}
+		$this->count = 0;
+		$this->width = $this->getWidth($this->version);
+		$this->frame = $this->newFrame($this->version);
+		$this->x = $this->width - 1;
+		$this->y = $this->width - 1;
+		$this->dir = -1;
+		$this->bit = -1;
+		// inteleaved data and ecc codes
+		for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) {
+			$code = $this->getCode();
+			$bit = 0x80;
+			for ($j=0; $j<8; $j++) {
+				$addr = $this->getNextPosition();
+				$this->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
+				$bit = $bit >> 1;
+			}
+		}
+		// remainder bits
+		$j = $this->getRemainder($this->version);
+		for ($i=0; $i<$j; $i++) {
+			$addr = $this->getNextPosition();
+			$this->setFrameAt($addr, 0x02);
+		}
+		// masking
+		$this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
+		if ($mask < 0) {
+			if (QR_FIND_BEST_MASK) {
+				$masked = $this->mask($this->width, $this->frame, $this->level);
+			} else {
+				$masked = $this->makeMask($this->width, $this->frame, (intval(QR_DEFAULT_MASK) % 8), $this->level);
+			}
+		} else {
+			$masked = $this->makeMask($this->width, $this->frame, $mask, $this->level);
+		}
+		if ($masked == NULL) {
+			return NULL;
+		}
+		$this->data = $masked;
+	}
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	// FrameFiller
+
+	/**
+	 * Set frame value at specified position
+	 * @param $at (array) x,y position
+	 * @param $val (int) value of the character to set
+	 */
+	protected function setFrameAt($at, $val) {
+		$this->frame[$at['y']][$at['x']] = chr($val);
+	}
+
+	/**
+	 * Get frame value at specified position
+	 * @param $at (array) x,y position
+	 * @return value at specified position
+	 */
+	protected function getFrameAt($at) {
+		return ord($this->frame[$at['y']][$at['x']]);
+	}
+
+	/**
+	 * Return the next frame position
+	 * @return array of x,y coordinates
+	 */
+	protected function getNextPosition() {
+		do {
+			if ($this->bit == -1) {
+				$this->bit = 0;
+				return array('x'=>$this->x, 'y'=>$this->y);
+			}
+			$x = $this->x;
+			$y = $this->y;
+			$w = $this->width;
+			if ($this->bit == 0) {
+				$x--;
+				$this->bit++;
+			} else {
+				$x++;
+				$y += $this->dir;
+				$this->bit--;
+			}
+			if ($this->dir < 0) {
+				if ($y < 0) {
+					$y = 0;
+					$x -= 2;
+					$this->dir = 1;
+					if ($x == 6) {
+						$x--;
+						$y = 9;
+					}
+				}
+			} else {
+				if ($y == $w) {
+					$y = $w - 1;
+					$x -= 2;
+					$this->dir = -1;
+					if ($x == 6) {
+						$x--;
+						$y -= 8;
+					}
+				}
+			}
+			if (($x < 0) OR ($y < 0)) {
+				return NULL;
+			}
+			$this->x = $x;
+			$this->y = $y;
+		} while(ord($this->frame[$y][$x]) & 0x80);
+		return array('x'=>$x, 'y'=>$y);
+	}
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	// QRrawcode
+
+	/**
+	 * Initialize code.
+	 * @param $spec (array) array of ECC specification
+	 * @return 0 in case of success, -1 in case of error
+	 */
+	protected function init($spec) {
+		$dl = $this->rsDataCodes1($spec);
+		$el = $this->rsEccCodes1($spec);
+		$rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+		$blockNo = 0;
+		$dataPos = 0;
+		$eccPos = 0;
+		$endfor = $this->rsBlockNum1($spec);
+		for ($i=0; $i < $endfor; ++$i) {
+			$ecc = array_slice($this->ecccode, $eccPos);
+			$this->rsblocks[$blockNo] = array();
+			$this->rsblocks[$blockNo]['dataLength'] = $dl;
+			$this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
+			$this->rsblocks[$blockNo]['eccLength'] = $el;
+			$ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
+			$this->rsblocks[$blockNo]['ecc'] = $ecc;
+			$this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
+			$dataPos += $dl;
+			$eccPos += $el;
+			$blockNo++;
+		}
+		if ($this->rsBlockNum2($spec) == 0) {
+			return 0;
+		}
+		$dl = $this->rsDataCodes2($spec);
+		$el = $this->rsEccCodes2($spec);
+		$rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+		if ($rs == NULL) {
+			return -1;
+		}
+		$endfor = $this->rsBlockNum2($spec);
+		for ($i=0; $i < $endfor; ++$i) {
+			$ecc = array_slice($this->ecccode, $eccPos);
+			$this->rsblocks[$blockNo] = array();
+			$this->rsblocks[$blockNo]['dataLength'] = $dl;
+			$this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
+			$this->rsblocks[$blockNo]['eccLength'] = $el;
+			$ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
+			$this->rsblocks[$blockNo]['ecc'] = $ecc;
+			$this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc);
+			$dataPos += $dl;
+			$eccPos += $el;
+			$blockNo++;
+		}
+		return 0;
+	}
+
+	/**
+	 * Return Reed-Solomon block code.
+	 * @return array rsblocks
+	 */
+	protected function getCode() {
+		if ($this->count < $this->dataLength) {
+			$row = $this->count % $this->blocks;
+			$col = $this->count / $this->blocks;
+			if ($col >= $this->rsblocks[0]['dataLength']) {
+				$row += $this->b1;
+			}
+			$ret = $this->rsblocks[$row]['data'][$col];
+		} elseif ($this->count < $this->dataLength + $this->eccLength) {
+			$row = ($this->count - $this->dataLength) % $this->blocks;
+			$col = ($this->count - $this->dataLength) / $this->blocks;
+			$ret = $this->rsblocks[$row]['ecc'][$col];
+		} else {
+			return 0;
+		}
+		$this->count++;
+		return $ret;
+	}
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	// QRmask
+
+	/**
+	 * Write Format Information on frame and returns the number of black bits
+	 * @param $width (int) frame width
+	 * @param $frame (array) frame
+	 * @param $mask (array) masking mode
+	 * @param $level (int) error correction level
+	 * @return int blacks
+	 */
+	 protected function writeFormatInformation($width, &$frame, $mask, $level) {
+		$blacks = 0;
+		$format =  $this->getFormatInfo($mask, $level);
+		for ($i=0; $i<8; ++$i) {
+			if ($format & 1) {
+				$blacks += 2;
+				$v = 0x85;
+			} else {
+				$v = 0x84;
+			}
+			$frame[8][$width - 1 - $i] = chr($v);
+			if ($i < 6) {
+				$frame[$i][8] = chr($v);
+			} else {
+				$frame[$i + 1][8] = chr($v);
+			}
+			$format = $format >> 1;
+		}
+		for ($i=0; $i<7; ++$i) {
+		if ($format & 1) {
+			$blacks += 2;
+			$v = 0x85;
+		} else {
+			$v = 0x84;
+		}
+		$frame[$width - 7 + $i][8] = chr($v);
+		if ($i == 0) {
+			$frame[8][7] = chr($v);
+		} else {
+			$frame[8][6 - $i] = chr($v);
+		}
+		$format = $format >> 1;
+		}
+		return $blacks;
+	}
+
+	/**
+	 * mask0
+	 * @param $x (int) X position
+	 * @param $y (int) Y position
+	 * @return int mask
+	 */
+	 protected function mask0($x, $y) {
+		return ($x + $y) & 1;
+	}
+
+	/**
+	 * mask1
+	 * @param $x (int) X position
+	 * @param $y (int) Y position
+	 * @return int mask
+	 */
+	 protected function mask1($x, $y) {
+		return ($y & 1);
+	}
+
+	/**
+	 * mask2
+	 * @param $x (int) X position
+	 * @param $y (int) Y position
+	 * @return int mask
+	 */
+	 protected function mask2($x, $y) {
+		return ($x % 3);
+	}
+
+	/**
+	 * mask3
+	 * @param $x (int) X position
+	 * @param $y (int) Y position
+	 * @return int mask
+	 */
+	 protected function mask3($x, $y) {
+		return ($x + $y) % 3;
+	}
+
+	/**
+	 * mask4
+	 * @param $x (int) X position
+	 * @param $y (int) Y position
+	 * @return int mask
+	 */
+	 protected function mask4($x, $y) {
+		return (((int)($y / 2)) + ((int)($x / 3))) & 1;
+	}
+
+	/**
+	 * mask5
+	 * @param $x (int) X position
+	 * @param $y (int) Y position
+	 * @return int mask
+	 */
+	 protected function mask5($x, $y) {
+		return (($x * $y) & 1) + ($x * $y) % 3;
+	}
+
+	/**
+	 * mask6
+	 * @param $x (int) X position
+	 * @param $y (int) Y position
+	 * @return int mask
+	 */
+	 protected function mask6($x, $y) {
+		return ((($x * $y) & 1) + ($x * $y) % 3) & 1;
+	}
+
+	/**
+	 * mask7
+	 * @param $x (int) X position
+	 * @param $y (int) Y position
+	 * @return int mask
+	 */
+	 protected function mask7($x, $y) {
+		return ((($x * $y) % 3) + (($x + $y) & 1)) & 1;
+	}
+
+	/**
+	 * Return bitmask
+	 * @param $maskNo (int) mask number
+	 * @param $width (int) width
+	 * @param $frame (array) frame
+	 * @return array bitmask
+	 */
+	protected function generateMaskNo($maskNo, $width, $frame) {
+		$bitMask = array_fill(0, $width, array_fill(0, $width, 0));
+		for ($y=0; $y<$width; ++$y) {
+			for ($x=0; $x<$width; ++$x) {
+				if (ord($frame[$y][$x]) & 0x80) {
+					$bitMask[$y][$x] = 0;
+				} else {
+					$maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);
+					$bitMask[$y][$x] = ($maskFunc == 0)?1:0;
+				}
+			}
+		}
+		return $bitMask;
+	}
+
+	/**
+	 * makeMaskNo
+	 * @param $maskNo (int)
+	 * @param $width (int)
+	 * @param $s (int)
+	 * @param $d (int)
+	 * @param $maskGenOnly (boolean)
+	 * @return int b
+	 */
+	 protected function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly=false) {
+		$b = 0;
+		$bitMask = array();
+		$bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
+		if ($maskGenOnly) {
+			return;
+		}
+		$d = $s;
+		for ($y=0; $y<$width; ++$y) {
+			for ($x=0; $x<$width; ++$x) {
+				if ($bitMask[$y][$x] == 1) {
+					$d[$y][$x] = chr(ord($s[$y][$x]) ^ ((int)($bitMask[$y][$x])));
+				}
+				$b += (int)(ord($d[$y][$x]) & 1);
+			}
+		}
+		return $b;
+	}
+
+	/**
+	 * makeMask
+	 * @param $width (int)
+	 * @param $frame (array)
+	 * @param $maskNo (int)
+	 * @param $level (int)
+	 * @return array mask
+	 */
+	 protected function makeMask($width, $frame, $maskNo, $level) {
+		$masked = array_fill(0, $width, str_repeat("\0", $width));
+		$this->makeMaskNo($maskNo, $width, $frame, $masked);
+		$this->writeFormatInformation($width, $masked, $maskNo, $level);
+		return $masked;
+	}
+
+	/**
+	 * calcN1N3
+	 * @param $length (int)
+	 * @return int demerit
+	 */
+	 protected function calcN1N3($length) {
+		$demerit = 0;
+		for ($i=0; $i<$length; ++$i) {
+			if ($this->runLength[$i] >= 5) {
+				$demerit += (N1 + ($this->runLength[$i] - 5));
+			}
+			if ($i & 1) {
+				if (($i >= 3) AND ($i < ($length-2)) AND ($this->runLength[$i] % 3 == 0)) {
+					$fact = (int)($this->runLength[$i] / 3);
+					if (($this->runLength[$i-2] == $fact)
+						AND ($this->runLength[$i-1] == $fact)
+						AND ($this->runLength[$i+1] == $fact)
+						AND ($this->runLength[$i+2] == $fact)) {
+						if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3] >= (4 * $fact))) {
+							$demerit += N3;
+						} elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >= (4 * $fact))) {
+							$demerit += N3;
+						}
+					}
+				}
+			}
+		}
+		return $demerit;
+	}
+
+	/**
+	 * evaluateSymbol
+	 * @param $width (int)
+	 * @param $frame (array)
+	 * @return int demerit
+	 */
+	 protected function evaluateSymbol($width, $frame) {
+		$head = 0;
+		$demerit = 0;
+		for ($y=0; $y<$width; ++$y) {
+			$head = 0;
+			$this->runLength[0] = 1;
+			$frameY = $frame[$y];
+			if ($y > 0) {
+				$frameYM = $frame[$y-1];
+			}
+			for ($x=0; $x<$width; ++$x) {
+				if (($x > 0) AND ($y > 0)) {
+					$b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);
+					$w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);
+					if (($b22 | ($w22 ^ 1)) & 1) {
+						$demerit += N2;
+					}
+				}
+				if (($x == 0) AND (ord($frameY[$x]) & 1)) {
+					$this->runLength[0] = -1;
+					$head = 1;
+					$this->runLength[$head] = 1;
+				} elseif ($x > 0) {
+					if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
+						$head++;
+						$this->runLength[$head] = 1;
+					} else {
+						$this->runLength[$head]++;
+					}
+				}
+			}
+			$demerit += $this->calcN1N3($head+1);
+		}
+		for ($x=0; $x<$width; ++$x) {
+			$head = 0;
+			$this->runLength[0] = 1;
+			for ($y=0; $y<$width; ++$y) {
+				if (($y == 0) AND (ord($frame[$y][$x]) & 1)) {
+					$this->runLength[0] = -1;
+					$head = 1;
+					$this->runLength[$head] = 1;
+				} elseif ($y > 0) {
+					if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
+						$head++;
+						$this->runLength[$head] = 1;
+					} else {
+						$this->runLength[$head]++;
+					}
+				}
+			}
+			$demerit += $this->calcN1N3($head+1);
+		}
+		return $demerit;
+	}
+
+	/**
+	 * mask
+	 * @param $width (int)
+	 * @param $frame (array)
+	 * @param $level (int)
+	 * @return array best mask
+	 */
+	 protected function mask($width, $frame, $level) {
+		$minDemerit = PHP_INT_MAX;
+		$bestMaskNum = 0;
+		$bestMask = array();
+		$checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7);
+		if (QR_FIND_FROM_RANDOM !== false) {
+			$howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9);
+			for ($i = 0; $i <  $howManuOut; ++$i) {
+				$remPos = rand (0, count($checked_masks)-1);
+				unset($checked_masks[$remPos]);
+				$checked_masks = array_values($checked_masks);
+			}
+		}
+		$bestMask = $frame;
+		foreach ($checked_masks as $i) {
+			$mask = array_fill(0, $width, str_repeat("\0", $width));
+			$demerit = 0;
+			$blacks = 0;
+			$blacks  = $this->makeMaskNo($i, $width, $frame, $mask);
+			$blacks += $this->writeFormatInformation($width, $mask, $i, $level);
+			$blacks  = (int)(100 * $blacks / ($width * $width));
+			$demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
+			$demerit += $this->evaluateSymbol($width, $mask);
+			if ($demerit < $minDemerit) {
+				$minDemerit = $demerit;
+				$bestMask = $mask;
+				$bestMaskNum = $i;
+			}
+		}
+		return $bestMask;
+	}
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	// QRsplit
+
+	/**
+	 * Return true if the character at specified position is a number
+	 * @param $str (string) string
+	 * @param $pos (int) characted position
+	 * @return boolean true of false
+	 */
+	 protected function isdigitat($str, $pos) {
+		if ($pos >= strlen($str)) {
+			return false;
+		}
+		return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));
+	}
+
+	/**
+	 * Return true if the character at specified position is an alphanumeric character
+	 * @param $str (string) string
+	 * @param $pos (int) characted position
+	 * @return boolean true of false
+	 */
+	 protected function isalnumat($str, $pos) {
+		if ($pos >= strlen($str)) {
+			return false;
+		}
+		return ($this->lookAnTable(ord($str[$pos])) >= 0);
+	}
+
+	/**
+	 * identifyMode
+	 * @param $pos (int)
+	 * @return int mode
+	 */
+	 protected function identifyMode($pos) {
+		if ($pos >= strlen($this->dataStr)) {
+			return QR_MODE_NL;
+		}
+		$c = $this->dataStr[$pos];
+		if ($this->isdigitat($this->dataStr, $pos)) {
+			return QR_MODE_NM;
+		} elseif ($this->isalnumat($this->dataStr, $pos)) {
+			return QR_MODE_AN;
+		} elseif ($this->hint == QR_MODE_KJ) {
+			if ($pos+1 < strlen($this->dataStr)) {
+				$d = $this->dataStr[$pos+1];
+				$word = (ord($c) << 8) | ord($d);
+				if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >= 0xe040 && $word <= 0xebbf)) {
+					return QR_MODE_KJ;
+				}
+			}
+		}
+		return QR_MODE_8B;
+	}
+
+	/**
+	 * eatNum
+	 * @return int run
+	 */
+	 protected function eatNum() {
+		$ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
+		$p = 0;
+		while($this->isdigitat($this->dataStr, $p)) {
+			$p++;
+		}
+		$run = $p;
+		$mode = $this->identifyMode($p);
+		if ($mode == QR_MODE_8B) {
+			$dif = $this->estimateBitsModeNum($run) + 4 + $ln
+			+ $this->estimateBitsMode8(1)         // + 4 + l8
+			- $this->estimateBitsMode8($run + 1); // - 4 - l8
+			if ($dif > 0) {
+				return $this->eat8();
+			}
+		}
+		if ($mode == QR_MODE_AN) {
+			$dif = $this->estimateBitsModeNum($run) + 4 + $ln
+			+ $this->estimateBitsModeAn(1)        // + 4 + la
+			- $this->estimateBitsModeAn($run + 1);// - 4 - la
+			if ($dif > 0) {
+				return $this->eatAn();
+			}
+		}
+		$this->items = $this->appendNewInputItem($this->items, QR_MODE_NM, $run, str_split($this->dataStr));
+		return $run;
+	}
+
+	/**
+	 * eatAn
+	 * @return int run
+	 */
+	 protected function eatAn() {
+		$la = $this->lengthIndicator(QR_MODE_AN,  $this->version);
+		$ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
+		$p =1 ;
+		while($this->isalnumat($this->dataStr, $p)) {
+			if ($this->isdigitat($this->dataStr, $p)) {
+				$q = $p;
+				while($this->isdigitat($this->dataStr, $q)) {
+					$q++;
+				}
+				$dif = $this->estimateBitsModeAn($p) // + 4 + la
+				+ $this->estimateBitsModeNum($q - $p) + 4 + $ln
+				- $this->estimateBitsModeAn($q); // - 4 - la
+				if ($dif < 0) {
+					break;
+				} else {
+					$p = $q;
+				}
+			} else {
+				$p++;
+			}
+		}
+		$run = $p;
+		if (!$this->isalnumat($this->dataStr, $p)) {
+			$dif = $this->estimateBitsModeAn($run) + 4 + $la
+			+ $this->estimateBitsMode8(1) // + 4 + l8
+			- $this->estimateBitsMode8($run + 1); // - 4 - l8
+			if ($dif > 0) {
+				return $this->eat8();
+			}
+		}
+		$this->items = $this->appendNewInputItem($this->items, QR_MODE_AN, $run, str_split($this->dataStr));
+		return $run;
+	}
+
+	/**
+	 * eatKanji
+	 * @return int run
+	 */
+	 protected function eatKanji() {
+		$p = 0;
+		while($this->identifyMode($p) == QR_MODE_KJ) {
+			$p += 2;
+		}
+		$this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr));
+		return $run;
+	}
+
+	/**
+	 * eat8
+	 * @return int run
+	 */
+	 protected function eat8() {
+		$la = $this->lengthIndicator(QR_MODE_AN, $this->version);
+		$ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
+		$p = 1;
+		$dataStrLen = strlen($this->dataStr);
+		while($p < $dataStrLen) {
+			$mode = $this->identifyMode($p);
+			if ($mode == QR_MODE_KJ) {
+				break;
+			}
+			if ($mode == QR_MODE_NM) {
+				$q = $p;
+				while($this->isdigitat($this->dataStr, $q)) {
+					$q++;
+				}
+				$dif = $this->estimateBitsMode8($p) // + 4 + l8
+				+ $this->estimateBitsModeNum($q - $p) + 4 + $ln
+				- $this->estimateBitsMode8($q); // - 4 - l8
+				if ($dif < 0) {
+					break;
+				} else {
+					$p = $q;
+				}
+			} elseif ($mode == QR_MODE_AN) {
+				$q = $p;
+				while($this->isalnumat($this->dataStr, $q)) {
+					$q++;
+				}
+				$dif = $this->estimateBitsMode8($p)  // + 4 + l8
+				+ $this->estimateBitsModeAn($q - $p) + 4 + $la
+				- $this->estimateBitsMode8($q); // - 4 - l8
+				if ($dif < 0) {
+					break;
+				} else {
+					$p = $q;
+				}
+			} else {
+				$p++;
+			}
+		}
+		$run = $p;
+		$this->items = $this->appendNewInputItem($this->items, QR_MODE_8B, $run, str_split($this->dataStr));
+		return $run;
+	}
+
+	/**
+	 * splitString
+	 * @return (int)
+	 */
+	 protected function splitString() {
+		while (strlen($this->dataStr) > 0) {
+			$mode = $this->identifyMode(0);
+			switch ($mode) {
+				case QR_MODE_NM: {
+					$length = $this->eatNum();
+					break;
+				}
+				case QR_MODE_AN: {
+					$length = $this->eatAn();
+					break;
+				}
+				case QR_MODE_KJ: {
+					if ($hint == QR_MODE_KJ) {
+						$length = $this->eatKanji();
+					} else {
+						$length = $this->eat8();
+					}
+					break;
+				}
+				default: {
+					$length = $this->eat8();
+					break;
+				}
+			}
+			if ($length == 0) {
+				return 0;
+			}
+			if ($length < 0) {
+				return -1;
+			}
+			$this->dataStr = substr($this->dataStr, $length);
+		}
+		return 0;
+	}
+
+	/**
+	 * toUpper
+	 */
+	 protected function toUpper() {
+		$stringLen = strlen($this->dataStr);
+		$p = 0;
+		while ($p < $stringLen) {
+			$mode = $this->identifyMode(substr($this->dataStr, $p), $this->hint);
+			if ($mode == QR_MODE_KJ) {
+				$p += 2;
+			} else {
+				if ((ord($this->dataStr[$p]) >= ord('a')) AND (ord($this->dataStr[$p]) <= ord('z'))) {
+					$this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
+				}
+				$p++;
+			}
+		}
+		return $this->dataStr;
+	}
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	// QRinputItem
+
+	/**
+	 * newInputItem
+	 * @param $mode (int)
+	 * @param $size (int)
+	 * @param $data (array)
+	 * @param $bstream (array)
+	 * @return array input item
+	 */
+	 protected function newInputItem($mode, $size, $data, $bstream=null) {
+		$setData = array_slice($data, 0, $size);
+		if (count($setData) < $size) {
+			$setData = array_merge($setData, array_fill(0, ($size - count($setData)), 0));
+		}
+		if (!$this->check($mode, $size, $setData)) {
+			return NULL;
+		}
+		$inputitem = array();
+		$inputitem['mode'] = $mode;
+		$inputitem['size'] = $size;
+		$inputitem['data'] = $setData;
+		$inputitem['bstream'] = $bstream;
+		return $inputitem;
+	}
+
+	/**
+	 * encodeModeNum
+	 * @param $inputitem (array)
+	 * @param $version (int)
+	 * @return array input item
+	 */
+	 protected function encodeModeNum($inputitem, $version) {
+		$words = (int)($inputitem['size'] / 3);
+		$inputitem['bstream'] = array();
+		$val = 0x1;
+		$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
+		$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_NM, $version), $inputitem['size']);
+		for ($i=0; $i < $words; ++$i) {
+			$val  = (ord($inputitem['data'][$i*3  ]) - ord('0')) * 100;
+			$val += (ord($inputitem['data'][$i*3+1]) - ord('0')) * 10;
+			$val += (ord($inputitem['data'][$i*3+2]) - ord('0'));
+			$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 10, $val);
+		}
+		if ($inputitem['size'] - $words * 3 == 1) {
+			$val = ord($inputitem['data'][$words*3]) - ord('0');
+			$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
+		} elseif (($inputitem['size'] - ($words * 3)) == 2) {
+			$val  = (ord($inputitem['data'][$words*3  ]) - ord('0')) * 10;
+			$val += (ord($inputitem['data'][$words*3+1]) - ord('0'));
+			$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 7, $val);
+		}
+		return $inputitem;
+	}
+
+	/**
+	 * encodeModeAn
+	 * @param $inputitem (array)
+	 * @param $version (int)
+	 * @return array input item
+	 */
+	 protected function encodeModeAn($inputitem, $version) {
+		$words = (int)($inputitem['size'] / 2);
+		$inputitem['bstream'] = array();
+		$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x02);
+		$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_AN, $version), $inputitem['size']);
+		for ($i=0; $i < $words; ++$i) {
+			$val  = (int)($this->lookAnTable(ord($inputitem['data'][$i*2])) * 45);
+			$val += (int)($this->lookAnTable(ord($inputitem['data'][($i*2)+1])));
+			$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 11, $val);
+		}
+		if ($inputitem['size'] & 1) {
+			$val = $this->lookAnTable(ord($inputitem['data'][($words * 2)]));
+			$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 6, $val);
+		}
+		return $inputitem;
+	}
+
+	/**
+	 * encodeMode8
+	 * @param $inputitem (array)
+	 * @param $version (int)
+	 * @return array input item
+	 */
+	 protected function encodeMode8($inputitem, $version) {
+		$inputitem['bstream'] = array();
+		$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x4);
+		$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_8B, $version), $inputitem['size']);
+		for ($i=0; $i < $inputitem['size']; ++$i) {
+			$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][$i]));
+		}
+		return $inputitem;
+	}
+
+	/**
+	 * encodeModeKanji
+	 * @param $inputitem (array)
+	 * @param $version (int)
+	 * @return array input item
+	 */
+	 protected function encodeModeKanji($inputitem, $version) {
+		$inputitem['bstream'] = array();
+		$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x8);
+		$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_KJ, $version), (int)($inputitem['size'] / 2));
+		for ($i=0; $i<$inputitem['size']; $i+=2) {
+			$val = (ord($inputitem['data'][$i]) << 8) | ord($inputitem['data'][$i+1]);
+			if ($val <= 0x9ffc) {
+				$val -= 0x8140;
+			} else {
+				$val -= 0xc140;
+			}
+			$h = ($val >> 8) * 0xc0;
+			$val = ($val & 0xff) + $h;
+			$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 13, $val);
+		}
+		return $inputitem;
+	}
+
+	/**
+	 * encodeModeStructure
+	 * @param $inputitem (array)
+	 * @return array input item
+	 */
+	 protected function encodeModeStructure($inputitem) {
+		$inputitem['bstream'] = array();
+		$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x03);
+		$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][1]) - 1);
+		$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][0]) - 1);
+		$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][2]));
+		return $inputitem;
+	}
+
+	/**
+	 * encodeBitStream
+	 * @param $inputitem (array)
+	 * @param $version (int)
+	 * @return array input item
+	 */
+	 protected function encodeBitStream($inputitem, $version) {
+		$inputitem['bstream'] = array();
+		$words = $this->maximumWords($inputitem['mode'], $version);
+		if ($inputitem['size'] > $words) {
+			$st1 = $this->newInputItem($inputitem['mode'], $words, $inputitem['data']);
+			$st2 = $this->newInputItem($inputitem['mode'], $inputitem['size'] - $words, array_slice($inputitem['data'], $words));
+			$st1 = $this->encodeBitStream($st1, $version);
+			$st2 = $this->encodeBitStream($st2, $version);
+			$inputitem['bstream'] = array();
+			$inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st1['bstream']);
+			$inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st2['bstream']);
+		} else {
+			switch($inputitem['mode']) {
+				case QR_MODE_NM: {
+					$inputitem = $this->encodeModeNum($inputitem, $version);
+					break;
+				}
+				case QR_MODE_AN: {
+					$inputitem = $this->encodeModeAn($inputitem, $version);
+					break;
+				}
+				case QR_MODE_8B: {
+					$inputitem = $this->encodeMode8($inputitem, $version);
+					break;
+				}
+				case QR_MODE_KJ: {
+					$inputitem = $this->encodeModeKanji($inputitem, $version);
+					break;
+				}
+				case QR_MODE_ST: {
+					$inputitem = $this->encodeModeStructure($inputitem);
+					break;
+				}
+				default: {
+					break;
+				}
+			}
+		}
+		return $inputitem;
+	}
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	// QRinput
+
+	/**
+	 * Append data to an input object.
+	 * The data is copied and appended to the input object.
+	 * @param $items (arrray) input items
+	 * @param $mode (int) encoding mode.
+	 * @param $size (int) size of data (byte).
+	 * @param $data (array) array of input data.
+	 * @return items
+	 *
+	 */
+	protected function appendNewInputItem($items, $mode, $size, $data) {
+		$newitem = $this->newInputItem($mode, $size, $data);
+		if (!empty($newitem)) {
+			$items[] = $newitem;
+		}
+		return $items;
+	}
+
+	/**
+	 * insertStructuredAppendHeader
+	 * @param $items (array)
+	 * @param $size (int)
+	 * @param $index (int)
+	 * @param $parity (int)
+	 * @return array items
+	 */
+	 protected function insertStructuredAppendHeader($items, $size, $index, $parity) {
+		if ($size > MAX_STRUCTURED_SYMBOLS) {
+			return -1;
+		}
+		if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) {
+			return -1;
+		}
+		$buf = array($size, $index, $parity);
+		$entry = $this->newInputItem(QR_MODE_ST, 3, buf);
+		array_unshift($items, $entry);
+		return $items;
+	}
+
+	/**
+	 * calcParity
+	 * @param $items (array)
+	 * @return int parity
+	 */
+	 protected function calcParity($items) {
+		$parity = 0;
+		foreach ($items as $item) {
+			if ($item['mode'] != QR_MODE_ST) {
+				for ($i=$item['size']-1; $i>=0; --$i) {
+					$parity ^= $item['data'][$i];
+				}
+			}
+		}
+		return $parity;
+	}
+
+	/**
+	 * checkModeNum
+	 * @param $size (int)
+	 * @param $data (array)
+	 * @return boolean true or false
+	 */
+	 protected function checkModeNum($size, $data) {
+		for ($i=0; $i<$size; ++$i) {
+			if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) > ord('9'))){
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19).
+	 * @param $c (int) character value
+	 * @return value
+	 */
+	protected function lookAnTable($c) {
+		return (($c > 127)?-1:$this->anTable[$c]);
+	}
+
+	/**
+	 * checkModeAn
+	 * @param $size (int)
+	 * @param $data (array)
+	 * @return boolean true or false
+	 */
+	 protected function checkModeAn($size, $data) {
+		for ($i=0; $i<$size; ++$i) {
+			if ($this->lookAnTable(ord($data[$i])) == -1) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * estimateBitsModeNum
+	 * @param $size (int)
+	 * @return int number of bits
+	 */
+	 protected function estimateBitsModeNum($size) {
+		$w = (int)($size / 3);
+		$bits = ($w * 10);
+		switch($size - ($w * 3)) {
+			case 1: {
+				$bits += 4;
+				break;
+			}
+			case 2: {
+				$bits += 7;
+				break;
+			}
+		}
+		return $bits;
+	}
+
+	/**
+	 * estimateBitsModeAn
+	 * @param $size (int)
+	 * @return int number of bits
+	 */
+	 protected function estimateBitsModeAn($size) {
+		$bits = (int)($size * 5.5); // (size / 2 ) * 11
+		if ($size & 1) {
+			$bits += 6;
+		}
+		return $bits;
+	}
+
+	/**
+	 * estimateBitsMode8
+	 * @param $size (int)
+	 * @return int number of bits
+	 */
+	 protected function estimateBitsMode8($size) {
+		return (int)($size * 8);
+	}
+
+	/**
+	 * estimateBitsModeKanji
+	 * @param $size (int)
+	 * @return int number of bits
+	 */
+	 protected function estimateBitsModeKanji($size) {
+		return (int)($size * 6.5); // (size / 2 ) * 13
+	}
+
+	/**
+	 * checkModeKanji
+	 * @param $size (int)
+	 * @param $data (array)
+	 * @return boolean true or false
+	 */
+	 protected function checkModeKanji($size, $data) {
+		if ($size & 1) {
+			return false;
+		}
+		for ($i=0; $i<$size; $i+=2) {
+			$val = (ord($data[$i]) << 8) | ord($data[$i+1]);
+			if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040)) OR ($val > 0xebbf)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * Validate the input data.
+	 * @param $mode (int) encoding mode.
+	 * @param $size (int) size of data (byte).
+	 * @param $data (array) data to validate
+	 * @return boolean true in case of valid data, false otherwise
+	 */
+	protected function check($mode, $size, $data) {
+		if ($size <= 0) {
+			return false;
+		}
+		switch($mode) {
+			case QR_MODE_NM: {
+				return $this->checkModeNum($size, $data);
+			}
+			case QR_MODE_AN: {
+				return $this->checkModeAn($size, $data);
+			}
+			case QR_MODE_KJ: {
+				return $this->checkModeKanji($size, $data);
+			}
+			case QR_MODE_8B: {
+				return true;
+			}
+			case QR_MODE_ST: {
+				return true;
+			}
+			default: {
+				break;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * estimateBitStreamSize
+	 * @param $items (array)
+	 * @param $version (int)
+	 * @return int bits
+	 */
+	 protected function estimateBitStreamSize($items, $version) {
+		$bits = 0;
+		if ($version == 0) {
+			$version = 1;
+		}
+		foreach ($items as $item) {
+			switch($item['mode']) {
+				case QR_MODE_NM: {
+					$bits = $this->estimateBitsModeNum($item['size']);
+					break;
+				}
+				case QR_MODE_AN: {
+					$bits = $this->estimateBitsModeAn($item['size']);
+					break;
+				}
+				case QR_MODE_8B: {
+					$bits = $this->estimateBitsMode8($item['size']);
+					break;
+				}
+				case QR_MODE_KJ: {
+					$bits = $this->estimateBitsModeKanji($item['size']);
+					break;
+				}
+				case QR_MODE_ST: {
+					return STRUCTURE_HEADER_BITS;
+				}
+				default: {
+					return 0;
+				}
+			}
+			$l = $this->lengthIndicator($item['mode'], $version);
+			$m = 1 << $l;
+			$num = (int)(($item['size'] + $m - 1) / $m);
+			$bits += $num * (4 + $l);
+		}
+		return $bits;
+	}
+
+	/**
+	 * estimateVersion
+	 * @param $items (array)
+	 * @return int version
+	 */
+	 protected function estimateVersion($items) {
+		$version = 0;
+		$prev = 0;
+		do {
+			$prev = $version;
+			$bits = $this->estimateBitStreamSize($items, $prev);
+			$version = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+			if ($version < 0) {
+				return -1;
+			}
+		} while ($version > $prev);
+		return $version;
+	}
+
+	/**
+	 * lengthOfCode
+	 * @param $mode (int)
+	 * @param $version (int)
+	 * @param $bits (int)
+	 * @return int size
+	 */
+	 protected function lengthOfCode($mode, $version, $bits) {
+		$payload = $bits - 4 - $this->lengthIndicator($mode, $version);
+		switch($mode) {
+			case QR_MODE_NM: {
+				$chunks = (int)($payload / 10);
+				$remain = $payload - $chunks * 10;
+				$size = $chunks * 3;
+				if ($remain >= 7) {
+					$size += 2;
+				} elseif ($remain >= 4) {
+					$size += 1;
+				}
+				break;
+			}
+			case QR_MODE_AN: {
+				$chunks = (int)($payload / 11);
+				$remain = $payload - $chunks * 11;
+				$size = $chunks * 2;
+				if ($remain >= 6) {
+					++$size;
+				}
+				break;
+			}
+			case QR_MODE_8B: {
+				$size = (int)($payload / 8);
+				break;
+			}
+			case QR_MODE_KJ: {
+				$size = (int)(($payload / 13) * 2);
+				break;
+			}
+			case QR_MODE_ST: {
+				$size = (int)($payload / 8);
+				break;
+			}
+			default: {
+				$size = 0;
+				break;
+			}
+		}
+		$maxsize = $this->maximumWords($mode, $version);
+		if ($size < 0) {
+			$size = 0;
+		}
+		if ($size > $maxsize) {
+			$size = $maxsize;
+		}
+		return $size;
+	}
+
+	/**
+	 * createBitStream
+	 * @param $items (array)
+	 * @return array of items and total bits
+	 */
+	 protected function createBitStream($items) {
+		$total = 0;
+		foreach ($items as $key => $item) {
+			$items[$key] = $this->encodeBitStream($item, $this->version);
+			$bits = count($items[$key]['bstream']);
+			$total += $bits;
+		}
+		return array($items, $total);
+	}
+
+	/**
+	 * convertData
+	 * @param $items (array)
+	 * @return array items
+	 */
+	 protected function convertData($items) {
+		$ver = $this->estimateVersion($items);
+		if ($ver > $this->version) {
+			$this->version = $ver;
+		}
+		while (true) {
+			$cbs = $this->createBitStream($items);
+			$items = $cbs[0];
+			$bits = $cbs[1];
+			if ($bits < 0) {
+				return -1;
+			}
+			$ver = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+			if ($ver < 0) {
+				return -1;
+			} elseif ($ver > $this->version) {
+				$this->version = $ver;
+			} else {
+				break;
+			}
+		}
+		return $items;
+	}
+
+	/**
+	 * Append Padding Bit to bitstream
+	 * @param $bstream (array)
+	 * @return array bitstream
+	 */
+	 protected function appendPaddingBit($bstream) {
+	 	if (is_null($bstream)) {
+	 		return null;
+	 	}
+		$bits = count($bstream);
+		$maxwords = $this->getDataLength($this->version, $this->level);
+		$maxbits = $maxwords * 8;
+		if ($maxbits == $bits) {
+			return $bstream;
+		}
+		if ($maxbits - $bits < 5) {
+			return $this->appendNum($bstream, $maxbits - $bits, 0);
+		}
+		$bits += 4;
+		$words = (int)(($bits + 7) / 8);
+		$padding = array();
+		$padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0);
+		$padlen = $maxwords - $words;
+		if ($padlen > 0) {
+			$padbuf = array();
+			for ($i=0; $i<$padlen; ++$i) {
+				$padbuf[$i] = ($i&1)?0x11:0xec;
+			}
+			$padding = $this->appendBytes($padding, $padlen, $padbuf);
+		}
+		return $this->appendBitstream($bstream, $padding);
+	}
+
+	/**
+	 * mergeBitStream
+	 * @param $items (array) items
+	 * @return array bitstream
+	 */
+	 protected function mergeBitStream($items) {
+		$items = $this->convertData($items);
+		if (!is_array($items)) {
+			return null;
+		}
+		$bstream = array();
+		foreach ($items as $item) {
+			$bstream = $this->appendBitstream($bstream, $item['bstream']);
+		}
+		return $bstream;
+	}
+
+	/**
+	 * Returns a stream of bits.
+	 * @param $items (int)
+	 * @return array padded merged byte stream
+	 */
+	protected function getBitStream($items) {
+		$bstream = $this->mergeBitStream($items);
+		return $this->appendPaddingBit($bstream);
+	}
+
+	/**
+	 * Pack all bit streams padding bits into a byte array.
+	 * @param $items (int)
+	 * @return array padded merged byte stream
+	 */
+	protected function getByteStream($items) {
+		$bstream = $this->getBitStream($items);
+		return $this->bitstreamToByte($bstream);
+	}
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	// QRbitstream
+
+	/**
+	 * Return an array with zeros
+	 * @param $setLength (int) array size
+	 * @return array
+	 */
+	 protected function allocate($setLength) {
+		return array_fill(0, $setLength, 0);
+	}
+
+	/**
+	 * Return new bitstream from number
+	 * @param $bits (int) number of bits
+	 * @param $num (int) number
+	 * @return array bitstream
+	 */
+	 protected function newFromNum($bits, $num) {
+		$bstream = $this->allocate($bits);
+		$mask = 1 << ($bits - 1);
+		for ($i=0; $i<$bits; ++$i) {
+			if ($num & $mask) {
+				$bstream[$i] = 1;
+			} else {
+				$bstream[$i] = 0;
+			}
+			$mask = $mask >> 1;
+		}
+		return $bstream;
+	}
+
+	/**
+	 * Return new bitstream from bytes
+	 * @param $size (int) size
+	 * @param $data (array) bytes
+	 * @return array bitstream
+	 */
+	 protected function newFromBytes($size, $data) {
+		$bstream = $this->allocate($size * 8);
+		$p=0;
+		for ($i=0; $i<$size; ++$i) {
+			$mask = 0x80;
+			for ($j=0; $j<8; ++$j) {
+				if ($data[$i] & $mask) {
+					$bstream[$p] = 1;
+				} else {
+					$bstream[$p] = 0;
+				}
+				$p++;
+				$mask = $mask >> 1;
+			}
+		}
+		return $bstream;
+	}
+
+	/**
+	 * Append one bitstream to another
+	 * @param $bitstream (array) original bitstream
+	 * @param $append (array) bitstream to append
+	 * @return array bitstream
+	 */
+	 protected function appendBitstream($bitstream, $append) {
+		if ((!is_array($append)) OR (count($append) == 0)) {
+			return $bitstream;
+		}
+		if (count($bitstream) == 0) {
+			return $append;
+		}
+		return array_values(array_merge($bitstream, $append));
+	}
+
+	/**
+	 * Append one bitstream created from number to another
+	 * @param $bitstream (array) original bitstream
+	 * @param $bits (int) number of bits
+	 * @param $num (int) number
+	 * @return array bitstream
+	 */
+	 protected function appendNum($bitstream, $bits, $num) {
+		if ($bits == 0) {
+			return 0;
+		}
+		$b = $this->newFromNum($bits, $num);
+		return $this->appendBitstream($bitstream, $b);
+	}
+
+	/**
+	 * Append one bitstream created from bytes to another
+	 * @param $bitstream (array) original bitstream
+	 * @param $size (int) size
+	 * @param $data (array) bytes
+	 * @return array bitstream
+	 */
+	 protected function appendBytes($bitstream, $size, $data) {
+		if ($size == 0) {
+			return 0;
+		}
+		$b = $this->newFromBytes($size, $data);
+		return $this->appendBitstream($bitstream, $b);
+	}
+
+	/**
+	 * Convert bitstream to bytes
+	 * @param $bstream (array) original bitstream
+	 * @return array of bytes
+	 */
+	 protected function bitstreamToByte($bstream) {
+		if (is_null($bstream)) {
+	 		return null;
+	 	}
+		$size = count($bstream);
+		if ($size == 0) {
+			return array();
+		}
+		$data = array_fill(0, (int)(($size + 7) / 8), 0);
+		$bytes = (int)($size / 8);
+		$p = 0;
+		for ($i=0; $i<$bytes; $i++) {
+			$v = 0;
+			for ($j=0; $j<8; $j++) {
+				$v = $v << 1;
+				$v |= $bstream[$p];
+				$p++;
+			}
+			$data[$i] = $v;
+		}
+		if ($size & 7) {
+			$v = 0;
+			for ($j=0; $j<($size & 7); $j++) {
+				$v = $v << 1;
+				$v |= $bstream[$p];
+				$p++;
+			}
+			$data[$bytes] = $v;
+		}
+		return $data;
+	}
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	// QRspec
+
+	/**
+	 * Replace a value on the array at the specified position
+	 * @param $srctab (array)
+	 * @param $x (int) X position
+	 * @param $y (int) Y position
+	 * @param $repl (string) value to replace
+	 * @param $replLen (int) length of the repl string
+	 * @return array srctab
+	 */
+	 protected function qrstrset($srctab, $x, $y, $repl, $replLen=false) {
+		$srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));
+		return $srctab;
+	}
+
+	/**
+	 * Return maximum data code length (bytes) for the version.
+	 * @param $version (int) version
+	 * @param $level (int) error correction level
+	 * @return int maximum size (bytes)
+	 */
+	protected function getDataLength($version, $level) {
+		return $this->capacity[$version][QRCAP_WORDS] - $this->capacity[$version][QRCAP_EC][$level];
+	}
+
+	/**
+	 * Return maximum error correction code length (bytes) for the version.
+	 * @param $version (int) version
+	 * @param $level (int) error correction level
+	 * @return int ECC size (bytes)
+	 */
+	protected function getECCLength($version, $level){
+		return $this->capacity[$version][QRCAP_EC][$level];
+	}
+
+	/**
+	 * Return the width of the symbol for the version.
+	 * @param $version (int) version
+	 * @return int width
+	 */
+	protected function getWidth($version) {
+		return $this->capacity[$version][QRCAP_WIDTH];
+	}
+
+	/**
+	 * Return the numer of remainder bits.
+	 * @param $version (int) version
+	 * @return int number of remainder bits
+	 */
+	protected function getRemainder($version) {
+		return $this->capacity[$version][QRCAP_REMINDER];
+	}
+
+	/**
+	 * Return a version number that satisfies the input code length.
+	 * @param $size (int) input code length (bytes)
+	 * @param $level (int) error correction level
+	 * @return int version number
+	 */
+	protected function getMinimumVersion($size, $level) {
+		for ($i = 1; $i <= QRSPEC_VERSION_MAX; ++$i) {
+			$words = ($this->capacity[$i][QRCAP_WORDS] - $this->capacity[$i][QRCAP_EC][$level]);
+			if ($words >= $size) {
+				return $i;
+			}
+		}
+		// the size of input data is greater than QR capacity, try to lover the error correction mode
+		return -1;
+	}
+
+	/**
+	 * Return the size of length indicator for the mode and version.
+	 * @param $mode (int) encoding mode
+	 * @param $version (int) version
+	 * @return int the size of the appropriate length indicator (bits).
+	 */
+	protected function lengthIndicator($mode, $version) {
+		if ($mode == QR_MODE_ST) {
+			return 0;
+		}
+		if ($version <= 9) {
+			$l = 0;
+		} elseif ($version <= 26) {
+			$l = 1;
+		} else {
+			$l = 2;
+		}
+		return $this->lengthTableBits[$mode][$l];
+	}
+
+	/**
+	 * Return the maximum length for the mode and version.
+	 * @param $mode (int) encoding mode
+	 * @param $version (int) version
+	 * @return int the maximum length (bytes)
+	 */
+	protected function maximumWords($mode, $version) {
+		if ($mode == QR_MODE_ST) {
+			return 3;
+		}
+		if ($version <= 9) {
+			$l = 0;
+		} else if ($version <= 26) {
+			$l = 1;
+		} else {
+			$l = 2;
+		}
+		$bits = $this->lengthTableBits[$mode][$l];
+		$words = (1 << $bits) - 1;
+		if ($mode == QR_MODE_KJ) {
+			$words *= 2; // the number of bytes is required
+		}
+		return $words;
+	}
+
+	/**
+	 * Return an array of ECC specification.
+	 * @param $version (int) version
+	 * @param $level (int) error correction level
+	 * @param $spec (array) an array of ECC specification contains as following: {# of type1 blocks, # of data code, # of ecc code, # of type2 blocks, # of data code}
+	 * @return array spec
+	 */
+	protected function getEccSpec($version, $level, $spec) {
+		if (count($spec) < 5) {
+			$spec = array(0, 0, 0, 0, 0);
+		}
+		$b1 = $this->eccTable[$version][$level][0];
+		$b2 = $this->eccTable[$version][$level][1];
+		$data = $this->getDataLength($version, $level);
+		$ecc = $this->getECCLength($version, $level);
+		if ($b2 == 0) {
+			$spec[0] = $b1;
+			$spec[1] = (int)($data / $b1);
+			$spec[2] = (int)($ecc / $b1);
+			$spec[3] = 0;
+			$spec[4] = 0;
+		} else {
+			$spec[0] = $b1;
+			$spec[1] = (int)($data / ($b1 + $b2));
+			$spec[2] = (int)($ecc  / ($b1 + $b2));
+			$spec[3] = $b2;
+			$spec[4] = $spec[1] + 1;
+		}
+		return $spec;
+	}
+
+	/**
+	 * Put an alignment marker.
+	 * @param $frame (array) frame
+	 * @param $ox (int) X center coordinate of the pattern
+	 * @param $oy (int) Y center coordinate of the pattern
+	 * @return array frame
+	 */
+	protected function putAlignmentMarker($frame, $ox, $oy) {
+		$finder = array(
+			"\xa1\xa1\xa1\xa1\xa1",
+			"\xa1\xa0\xa0\xa0\xa1",
+			"\xa1\xa0\xa1\xa0\xa1",
+			"\xa1\xa0\xa0\xa0\xa1",
+			"\xa1\xa1\xa1\xa1\xa1"
+			);
+		$yStart = $oy - 2;
+		$xStart = $ox - 2;
+		for ($y=0; $y < 5; $y++) {
+			$frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]);
+		}
+		return $frame;
+	}
+
+	/**
+	 * Put an alignment pattern.
+	 * @param $version (int) version
+	 * @param $frame (array) frame
+	 * @param $width (int) width
+	 * @return array frame
+	 */
+	 protected function putAlignmentPattern($version, $frame, $width) {
+		if ($version < 2) {
+			return $frame;
+		}
+		$d = $this->alignmentPattern[$version][1] - $this->alignmentPattern[$version][0];
+		if ($d < 0) {
+			$w = 2;
+		} else {
+			$w = (int)(($width - $this->alignmentPattern[$version][0]) / $d + 2);
+		}
+		if ($w * $w - 3 == 1) {
+			$x = $this->alignmentPattern[$version][0];
+			$y = $this->alignmentPattern[$version][0];
+			$frame = $this->putAlignmentMarker($frame, $x, $y);
+			return $frame;
+		}
+		$cx = $this->alignmentPattern[$version][0];
+		$wo = $w - 1;
+		for ($x=1; $x < $wo; ++$x) {
+			$frame = $this->putAlignmentMarker($frame, 6, $cx);
+			$frame = $this->putAlignmentMarker($frame, $cx,  6);
+			$cx += $d;
+		}
+		$cy = $this->alignmentPattern[$version][0];
+		for ($y=0; $y < $wo; ++$y) {
+			$cx = $this->alignmentPattern[$version][0];
+			for ($x=0; $x < $wo; ++$x) {
+				$frame = $this->putAlignmentMarker($frame, $cx, $cy);
+				$cx += $d;
+			}
+			$cy += $d;
+		}
+		return $frame;
+	}
+
+	/**
+	 * Return BCH encoded version information pattern that is used for the symbol of version 7 or greater. Use lower 18 bits.
+	 * @param $version (int) version
+	 * @return BCH encoded version information pattern
+	 */
+	protected function getVersionPattern($version) {
+		if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) {
+			return 0;
+		}
+		return $this->versionPattern[($version - 7)];
+	}
+
+	/**
+	 * Return BCH encoded format information pattern.
+	 * @param $mask (array)
+	 * @param $level (int) error correction level
+	 * @return BCH encoded format information pattern
+	 */
+	protected function getFormatInfo($mask, $level) {
+		if (($mask < 0) OR ($mask > 7)) {
+			return 0;
+		}
+		if (($level < 0) OR ($level > 3)) {
+			return 0;
+		}
+		return $this->formatInfo[$level][$mask];
+	}
+
+	/**
+	 * Put a finder pattern.
+	 * @param $frame (array) frame
+	 * @param $ox (int) X center coordinate of the pattern
+	 * @param $oy (int) Y center coordinate of the pattern
+	 * @return array frame
+	 */
+	protected function putFinderPattern($frame, $ox, $oy) {
+		$finder = array(
+		"\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
+		"\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+		"\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+		"\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+		"\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+		"\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+		"\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
+		);
+		for ($y=0; $y < 7; $y++) {
+			$frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]);
+		}
+		return $frame;
+	}
+
+	/**
+	 * Return a copy of initialized frame.
+	 * @param $version (int) version
+	 * @return Array of unsigned char.
+	 */
+	protected function createFrame($version) {
+		$width = $this->capacity[$version][QRCAP_WIDTH];
+		$frameLine = str_repeat ("\0", $width);
+		$frame = array_fill(0, $width, $frameLine);
+		// Finder pattern
+		$frame = $this->putFinderPattern($frame, 0, 0);
+		$frame = $this->putFinderPattern($frame, $width - 7, 0);
+		$frame = $this->putFinderPattern($frame, 0, $width - 7);
+		// Separator
+		$yOffset = $width - 7;
+		for ($y=0; $y < 7; ++$y) {
+			$frame[$y][7] = "\xc0";
+			$frame[$y][$width - 8] = "\xc0";
+			$frame[$yOffset][7] = "\xc0";
+			++$yOffset;
+		}
+		$setPattern = str_repeat("\xc0", 8);
+		$frame = $this->qrstrset($frame, 0, 7, $setPattern);
+		$frame = $this->qrstrset($frame, $width-8, 7, $setPattern);
+		$frame = $this->qrstrset($frame, 0, $width - 8, $setPattern);
+		// Format info
+		$setPattern = str_repeat("\x84", 9);
+		$frame = $this->qrstrset($frame, 0, 8, $setPattern);
+		$frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8);
+		$yOffset = $width - 8;
+		for ($y=0; $y < 8; ++$y,++$yOffset) {
+			$frame[$y][8] = "\x84";
+			$frame[$yOffset][8] = "\x84";
+		}
+		// Timing pattern
+		$wo = $width - 15;
+		for ($i=1; $i < $wo; ++$i) {
+			$frame[6][7+$i] = chr(0x90 | ($i & 1));
+			$frame[7+$i][6] = chr(0x90 | ($i & 1));
+		}
+		// Alignment pattern
+		$frame = $this->putAlignmentPattern($version, $frame, $width);
+		// Version information
+		if ($version >= 7) {
+			$vinf = $this->getVersionPattern($version);
+			$v = $vinf;
+			for ($x=0; $x<6; ++$x) {
+				for ($y=0; $y<3; ++$y) {
+					$frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
+					$v = $v >> 1;
+				}
+			}
+			$v = $vinf;
+			for ($y=0; $y<6; ++$y) {
+				for ($x=0; $x<3; ++$x) {
+					$frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
+					$v = $v >> 1;
+				}
+			}
+		}
+		// and a little bit...
+		$frame[$width - 8][8] = "\x81";
+		return $frame;
+	}
+
+	/**
+	 * Set new frame for the specified version.
+	 * @param $version (int) version
+	 * @return Array of unsigned char.
+	 */
+	protected function newFrame($version) {
+		if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) {
+			return NULL;
+		}
+		if (!isset($this->frames[$version])) {
+			$this->frames[$version] = $this->createFrame($version);
+		}
+		if (is_null($this->frames[$version])) {
+			return NULL;
+		}
+		return $this->frames[$version];
+	}
+
+	/**
+	 * Return block number 0
+	 * @param $spec (array)
+	 * @return int value
+	 */
+	 protected function rsBlockNum($spec) {
+		return ($spec[0] + $spec[3]);
+	}
+
+	/**
+	* Return block number 1
+	 * @param $spec (array)
+	 * @return int value
+	 */
+	 protected function rsBlockNum1($spec) {
+		return $spec[0];
+	}
+
+	/**
+	 * Return data codes 1
+	 * @param $spec (array)
+	 * @return int value
+	 */
+	 protected function rsDataCodes1($spec) {
+		return $spec[1];
+	}
+
+	/**
+	 * Return ecc codes 1
+	 * @param $spec (array)
+	 * @return int value
+	 */
+	 protected function rsEccCodes1($spec) {
+		return $spec[2];
+	}
+
+	/**
+	 * Return block number 2
+	 * @param $spec (array)
+	 * @return int value
+	 */
+	 protected function rsBlockNum2($spec) {
+		return $spec[3];
+	}
+
+	/**
+	 * Return data codes 2
+	 * @param $spec (array)
+	 * @return int value
+	 */
+	 protected function rsDataCodes2($spec) {
+		return $spec[4];
+	}
+
+	/**
+	 * Return ecc codes 2
+	 * @param $spec (array)
+	 * @return int value
+	 */
+	 protected function rsEccCodes2($spec) {
+		return $spec[2];
+	}
+
+	/**
+	 * Return data length
+	 * @param $spec (array)
+	 * @return int value
+	 */
+	 protected function rsDataLength($spec) {
+		return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]);
+	}
+
+	/**
+	 * Return ecc length
+	 * @param $spec (array)
+	 * @return int value
+	 */
+	 protected function rsEccLength($spec) {
+		return ($spec[0] + $spec[3]) * $spec[2];
+	}
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	// QRrs
+
+	/**
+	 * Initialize a Reed-Solomon codec and add it to existing rsitems
+	 * @param $symsize (int) symbol size, bits
+	 * @param $gfpoly (int)  Field generator polynomial coefficients
+	 * @param $fcr (int)  first root of RS code generator polynomial, index form
+	 * @param $prim (int)  primitive element to generate polynomial roots
+	 * @param $nroots (int) RS code generator polynomial degree (number of roots)
+	 * @param $pad (int)  padding bytes at front of shortened block
+	 * @return array Array of RS values:<ul><li>mm = Bits per symbol;</li><li>nn = Symbols per block;</li><li>alpha_to = log lookup table array;</li><li>index_of = Antilog lookup table array;</li><li>genpoly = Generator polynomial array;</li><li>nroots = Number of generator;</li><li>roots = number of parity symbols;</li><li>fcr = First consecutive root, index form;</li><li>prim = Primitive element, index form;</li><li>iprim = prim-th root of 1, index form;</li><li>pad = Padding bytes in shortened block;</li><li>gfpoly</ul>.
+	 */
+	 protected function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) {
+		foreach ($this->rsitems as $rs) {
+			if (($rs['pad'] != $pad) OR ($rs['nroots'] != $nroots) OR ($rs['mm'] != $symsize)
+				OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] != $fcr) OR ($rs['prim'] != $prim)) {
+				continue;
+			}
+			return $rs;
+		}
+		$rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
+		array_unshift($this->rsitems, $rs);
+		return $rs;
+	}
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	// QRrsItem
+
+	/**
+	 * modnn
+	 * @param $rs (array) RS values
+	 * @param $x (int) X position
+	 * @return int X osition
+	 */
+	 protected function modnn($rs, $x) {
+		while ($x >= $rs['nn']) {
+			$x -= $rs['nn'];
+			$x = ($x >> $rs['mm']) + ($x & $rs['nn']);
+		}
+		return $x;
+	}
+
+	/**
+	 * Initialize a Reed-Solomon codec and returns an array of values.
+	 * @param $symsize (int) symbol size, bits
+	 * @param $gfpoly (int)  Field generator polynomial coefficients
+	 * @param $fcr (int)  first root of RS code generator polynomial, index form
+	 * @param $prim (int)  primitive element to generate polynomial roots
+	 * @param $nroots (int) RS code generator polynomial degree (number of roots)
+	 * @param $pad (int)  padding bytes at front of shortened block
+	 * @return array Array of RS values:<ul><li>mm = Bits per symbol;</li><li>nn = Symbols per block;</li><li>alpha_to = log lookup table array;</li><li>index_of = Antilog lookup table array;</li><li>genpoly = Generator polynomial array;</li><li>nroots = Number of generator;</li><li>roots = number of parity symbols;</li><li>fcr = First consecutive root, index form;</li><li>prim = Primitive element, index form;</li><li>iprim = prim-th root of 1, index form;</li><li>pad = Padding bytes in shortened block;</li><li>gfpoly</ul>.
+	 */
+	protected function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) {
+		// Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2)
+		$rs = null;
+		// Check parameter ranges
+		if (($symsize < 0) OR ($symsize > 8)) {
+			return $rs;
+		}
+		if (($fcr < 0) OR ($fcr >= (1<<$symsize))) {
+			return $rs;
+		}
+		if (($prim <= 0) OR ($prim >= (1<<$symsize))) {
+			return $rs;
+		}
+		if (($nroots < 0) OR ($nroots >= (1<<$symsize))) {
+			return $rs;
+		}
+		if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) {
+			return $rs;
+		}
+		$rs = array();
+		$rs['mm'] = $symsize;
+		$rs['nn'] = (1 << $symsize) - 1;
+		$rs['pad'] = $pad;
+		$rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0);
+		$rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0);
+		// PHP style macro replacement ;)
+		$NN =& $rs['nn'];
+		$A0 =& $NN;
+		// Generate Galois field lookup tables
+		$rs['index_of'][0] = $A0; // log(zero) = -inf
+		$rs['alpha_to'][$A0] = 0; // alpha**-inf = 0
+		$sr = 1;
+		for ($i=0; $i<$rs['nn']; ++$i) {
+			$rs['index_of'][$sr] = $i;
+			$rs['alpha_to'][$i] = $sr;
+			$sr <<= 1;
+			if ($sr & (1 << $symsize)) {
+				$sr ^= $gfpoly;
+			}
+			$sr &= $rs['nn'];
+		}
+		if ($sr != 1) {
+			// field generator polynomial is not primitive!
+			return NULL;
+		}
+		// Form RS code generator polynomial from its roots
+		$rs['genpoly'] = array_fill(0, ($nroots + 1), 0);
+		$rs['fcr'] = $fcr;
+		$rs['prim'] = $prim;
+		$rs['nroots'] = $nroots;
+		$rs['gfpoly'] = $gfpoly;
+		// Find prim-th root of 1, used in decoding
+		for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) {
+			; // intentional empty-body loop!
+		}
+		$rs['iprim'] = (int)($iprim / $prim);
+		$rs['genpoly'][0] = 1;
+		for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
+			$rs['genpoly'][$i+1] = 1;
+			// Multiply rs->genpoly[] by  @**(root + x)
+			for ($j = $i; $j > 0; --$j) {
+				if ($rs['genpoly'][$j] != 0) {
+					$rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^ $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][$j]] + $root)];
+				} else {
+					$rs['genpoly'][$j] = $rs['genpoly'][$j-1];
+				}
+			}
+			// rs->genpoly[0] can never be zero
+			$rs['genpoly'][0] = $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][0]] + $root)];
+		}
+		// convert rs->genpoly[] to index form for quicker encoding
+		for ($i = 0; $i <= $nroots; ++$i) {
+			$rs['genpoly'][$i] = $rs['index_of'][$rs['genpoly'][$i]];
+		}
+		return $rs;
+	}
+
+	/**
+	 * Encode a Reed-Solomon codec and returns the parity array
+	 * @param $rs (array) RS values
+	 * @param $data (array) data
+	 * @param $parity (array) parity
+	 * @return parity array
+	 */
+	 protected function encode_rs_char($rs, $data, $parity) {
+		$MM       =& $rs['mm']; // bits per symbol
+		$NN       =& $rs['nn']; // the total number of symbols in a RS block
+		$ALPHA_TO =& $rs['alpha_to']; // the address of an array of NN elements to convert Galois field elements in index (log) form to polynomial form
+		$INDEX_OF =& $rs['index_of']; // the address of an array of NN elements to convert Galois field elements in polynomial form to index (log) form
+		$GENPOLY  =& $rs['genpoly']; // an array of NROOTS+1 elements containing the generator polynomial in index form
+		$NROOTS   =& $rs['nroots']; // the number of roots in the RS code generator polynomial, which is the same as the number of parity symbols in a block
+		$FCR      =& $rs['fcr']; // first consecutive root, index form
+		$PRIM     =& $rs['prim']; // primitive element, index form
+		$IPRIM    =& $rs['iprim']; // prim-th root of 1, index form
+		$PAD      =& $rs['pad']; // the number of pad symbols in a block
+		$A0       =& $NN;
+		$parity = array_fill(0, $NROOTS, 0);
+		for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) {
+			$feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
+			if ($feedback != $A0) {
+				// feedback term is non-zero
+				// This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
+				// always be for the polynomials constructed by init_rs()
+				$feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback);
+				for ($j=1; $j < $NROOTS; ++$j) {
+				$parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[($NROOTS - $j)])];
+				}
+			}
+			// Shift
+			array_shift($parity);
+			if ($feedback != $A0) {
+				array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[0])]);
+			} else {
+				array_push($parity, 0);
+			}
+		}
+		return $parity;
+	}
+
+} // end QRcode class
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/include/sRGB.icc b/htmltest/sites/all/libraries/tcpdf-version/include/sRGB.icc
new file mode 100644
index 00000000..71e33830
Binary files /dev/null and b/htmltest/sites/all/libraries/tcpdf-version/include/sRGB.icc differ
diff --git a/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_colors.php b/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_colors.php
new file mode 100644
index 00000000..64752852
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_colors.php
@@ -0,0 +1,462 @@
+<?php
+//============================================================+
+// File name   : tcpdf_colors.php
+// Version     : 1.0.002
+// Begin       : 2002-04-09
+// Last Update : 2013-09-30
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2002-2013  Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Array of WEB safe colors
+//
+//============================================================+
+
+/**
+ * @file
+ * PHP color class for TCPDF
+ * @author Nicola Asuni
+ * @package com.tecnick.tcpdf
+ */
+
+/**
+ * @class TCPDF_COLORS
+ * PHP color class for TCPDF
+ * @package com.tecnick.tcpdf
+ * @version 1.0.002
+ * @author Nicola Asuni - info@tecnick.com
+ */
+class TCPDF_COLORS {
+
+	/**
+	 * Array of WEB safe colors
+	 * @public static
+	 */
+	public static $webcolor = array (
+		'aliceblue' => 'f0f8ff',
+		'antiquewhite' => 'faebd7',
+		'aqua' => '00ffff',
+		'aquamarine' => '7fffd4',
+		'azure' => 'f0ffff',
+		'beige' => 'f5f5dc',
+		'bisque' => 'ffe4c4',
+		'black' => '000000',
+		'blanchedalmond' => 'ffebcd',
+		'blue' => '0000ff',
+		'blueviolet' => '8a2be2',
+		'brown' => 'a52a2a',
+		'burlywood' => 'deb887',
+		'cadetblue' => '5f9ea0',
+		'chartreuse' => '7fff00',
+		'chocolate' => 'd2691e',
+		'coral' => 'ff7f50',
+		'cornflowerblue' => '6495ed',
+		'cornsilk' => 'fff8dc',
+		'crimson' => 'dc143c',
+		'cyan' => '00ffff',
+		'darkblue' => '00008b',
+		'darkcyan' => '008b8b',
+		'darkgoldenrod' => 'b8860b',
+		'dkgray' => 'a9a9a9',
+		'darkgray' => 'a9a9a9',
+		'darkgrey' => 'a9a9a9',
+		'darkgreen' => '006400',
+		'darkkhaki' => 'bdb76b',
+		'darkmagenta' => '8b008b',
+		'darkolivegreen' => '556b2f',
+		'darkorange' => 'ff8c00',
+		'darkorchid' => '9932cc',
+		'darkred' => '8b0000',
+		'darksalmon' => 'e9967a',
+		'darkseagreen' => '8fbc8f',
+		'darkslateblue' => '483d8b',
+		'darkslategray' => '2f4f4f',
+		'darkslategrey' => '2f4f4f',
+		'darkturquoise' => '00ced1',
+		'darkviolet' => '9400d3',
+		'deeppink' => 'ff1493',
+		'deepskyblue' => '00bfff',
+		'dimgray' => '696969',
+		'dimgrey' => '696969',
+		'dodgerblue' => '1e90ff',
+		'firebrick' => 'b22222',
+		'floralwhite' => 'fffaf0',
+		'forestgreen' => '228b22',
+		'fuchsia' => 'ff00ff',
+		'gainsboro' => 'dcdcdc',
+		'ghostwhite' => 'f8f8ff',
+		'gold' => 'ffd700',
+		'goldenrod' => 'daa520',
+		'gray' => '808080',
+		'grey' => '808080',
+		'green' => '008000',
+		'greenyellow' => 'adff2f',
+		'honeydew' => 'f0fff0',
+		'hotpink' => 'ff69b4',
+		'indianred' => 'cd5c5c',
+		'indigo' => '4b0082',
+		'ivory' => 'fffff0',
+		'khaki' => 'f0e68c',
+		'lavender' => 'e6e6fa',
+		'lavenderblush' => 'fff0f5',
+		'lawngreen' => '7cfc00',
+		'lemonchiffon' => 'fffacd',
+		'lightblue' => 'add8e6',
+		'lightcoral' => 'f08080',
+		'lightcyan' => 'e0ffff',
+		'lightgoldenrodyellow' => 'fafad2',
+		'ltgray' => 'd3d3d3',
+		'lightgray' => 'd3d3d3',
+		'lightgrey' => 'd3d3d3',
+		'lightgreen' => '90ee90',
+		'lightpink' => 'ffb6c1',
+		'lightsalmon' => 'ffa07a',
+		'lightseagreen' => '20b2aa',
+		'lightskyblue' => '87cefa',
+		'lightslategray' => '778899',
+		'lightslategrey' => '778899',
+		'lightsteelblue' => 'b0c4de',
+		'lightyellow' => 'ffffe0',
+		'lime' => '00ff00',
+		'limegreen' => '32cd32',
+		'linen' => 'faf0e6',
+		'magenta' => 'ff00ff',
+		'maroon' => '800000',
+		'mediumaquamarine' => '66cdaa',
+		'mediumblue' => '0000cd',
+		'mediumorchid' => 'ba55d3',
+		'mediumpurple' => '9370d8',
+		'mediumseagreen' => '3cb371',
+		'mediumslateblue' => '7b68ee',
+		'mediumspringgreen' => '00fa9a',
+		'mediumturquoise' => '48d1cc',
+		'mediumvioletred' => 'c71585',
+		'midnightblue' => '191970',
+		'mintcream' => 'f5fffa',
+		'mistyrose' => 'ffe4e1',
+		'moccasin' => 'ffe4b5',
+		'navajowhite' => 'ffdead',
+		'navy' => '000080',
+		'oldlace' => 'fdf5e6',
+		'olive' => '808000',
+		'olivedrab' => '6b8e23',
+		'orange' => 'ffa500',
+		'orangered' => 'ff4500',
+		'orchid' => 'da70d6',
+		'palegoldenrod' => 'eee8aa',
+		'palegreen' => '98fb98',
+		'paleturquoise' => 'afeeee',
+		'palevioletred' => 'd87093',
+		'papayawhip' => 'ffefd5',
+		'peachpuff' => 'ffdab9',
+		'peru' => 'cd853f',
+		'pink' => 'ffc0cb',
+		'plum' => 'dda0dd',
+		'powderblue' => 'b0e0e6',
+		'purple' => '800080',
+		'red' => 'ff0000',
+		'rosybrown' => 'bc8f8f',
+		'royalblue' => '4169e1',
+		'saddlebrown' => '8b4513',
+		'salmon' => 'fa8072',
+		'sandybrown' => 'f4a460',
+		'seagreen' => '2e8b57',
+		'seashell' => 'fff5ee',
+		'sienna' => 'a0522d',
+		'silver' => 'c0c0c0',
+		'skyblue' => '87ceeb',
+		'slateblue' => '6a5acd',
+		'slategray' => '708090',
+		'slategrey' => '708090',
+		'snow' => 'fffafa',
+		'springgreen' => '00ff7f',
+		'steelblue' => '4682b4',
+		'tan' => 'd2b48c',
+		'teal' => '008080',
+		'thistle' => 'd8bfd8',
+		'tomato' => 'ff6347',
+		'turquoise' => '40e0d0',
+		'violet' => 'ee82ee',
+		'wheat' => 'f5deb3',
+		'white' => 'ffffff',
+		'whitesmoke' => 'f5f5f5',
+		'yellow' => 'ffff00',
+		'yellowgreen' => '9acd32'
+	); // end of web colors
+
+	/**
+	 * Array of valid JavaScript color names
+	 * @public static
+	 */
+	public static $jscolor = array ('transparent', 'black', 'white', 'red', 'green', 'blue', 'cyan', 'magenta', 'yellow', 'dkGray', 'gray', 'ltGray');
+
+	/**
+	 * Array of Spot colors (C,M,Y,K,name)
+	 * Color keys must be in lowercase and without spaces.
+	 * As long as no open standard for spot colours exists, you have to buy a colour book by one of the colour manufacturers and insert the values and names of spot colours directly.
+	 * Common industry standard spot colors are: ANPA-COLOR, DIC, FOCOLTONE, GCMI, HKS, PANTONE, TOYO, TRUMATCH.
+	 * @public static
+	 */
+	public static $spotcolor = array (
+		// special registration colors
+		'none'    => array(  0,   0,   0,   0, 'None'),
+		'all'     => array(100, 100, 100, 100, 'All'),
+		// standard CMYK colors
+		'cyan'    => array(100,   0,   0,   0, 'Cyan'),
+		'magenta' => array(  0, 100,   0,   0, 'Magenta'),
+		'yellow'  => array(  0,   0, 100,   0, 'Yellow'),
+		'key'     => array(  0,   0,   0, 100, 'Key'),
+		// alias
+		'white'   => array(  0,   0,   0,   0, 'White'),
+		'black'   => array(  0,   0,   0, 100, 'Black'),
+		// standard RGB colors
+		'red'     => array(  0, 100, 100,   0, 'Red'),
+		'green'   => array(100,   0, 100,   0, 'Green'),
+		'blue'    => array(100, 100,   0,   0, 'Blue'),
+		// Add here standard spot colors or dynamically define them with AddSpotColor()
+		// ...
+	); // end of spot colors
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	/**
+	 * Return the Spot color array.
+	 * @param $name (string) Name of the spot color.
+	 * @param $spotc (array) Reference to an array of spot colors.
+	 * @return (array) Spot color array or false if not defined.
+	 * @since 5.9.125 (2011-10-03)
+	 * @public static
+	 */
+	public static function getSpotColor($name, &$spotc) {
+		if (isset($spotc[$name])) {
+			return $spotc[$name];
+		}
+		$color = preg_replace('/[\s]*/', '', $name); // remove extra spaces
+		$color = strtolower($color);
+		if (isset(self::$spotcolor[$color])) {
+			if (!isset($spotc[$name])) {
+				$i = (1 + count($spotc));
+				$spotc[$name] = array('C' => self::$spotcolor[$color][0], 'M' => self::$spotcolor[$color][1], 'Y' => self::$spotcolor[$color][2], 'K' => self::$spotcolor[$color][3], 'name' => self::$spotcolor[$color][4], 'i' => $i);
+			}
+			return $spotc[self::$spotcolor[$color][4]];
+		}
+		return false;
+	}
+
+	/**
+	 * Returns an array (RGB or CMYK) from an html color name, or a six-digit (i.e. #3FE5AA), or three-digit (i.e. #7FF) hexadecimal color, or a javascript color array, or javascript color name.
+	 * @param $hcolor (string) HTML color.
+	 * @param $spotc (array) Reference to an array of spot colors.
+	 * @param $defcol (array) Color to return in case of error.
+	 * @return array RGB or CMYK color, or false in case of error.
+	 * @public static
+	 */
+	public static function convertHTMLColorToDec($hcolor, &$spotc, $defcol=array('R'=>128,'G'=>128,'B'=>128)) {
+		$color = preg_replace('/[\s]*/', '', $hcolor); // remove extra spaces
+		$color = strtolower($color);
+		// check for javascript color array syntax
+		if (strpos($color, '[') !== false) {
+			if (preg_match('/[\[][\"\'](t|g|rgb|cmyk)[\"\'][\,]?([0-9\.]*)[\,]?([0-9\.]*)[\,]?([0-9\.]*)[\,]?([0-9\.]*)[\]]/', $color, $m) > 0) {
+				$returncolor = array();
+				switch ($m[1]) {
+					case 'cmyk': {
+						// RGB
+						$returncolor['C'] = max(0, min(100, (floatval($m[2]) * 100)));
+						$returncolor['M'] = max(0, min(100, (floatval($m[3]) * 100)));
+						$returncolor['Y'] = max(0, min(100, (floatval($m[4]) * 100)));
+						$returncolor['K'] = max(0, min(100, (floatval($m[5]) * 100)));
+						break;
+					}
+					case 'rgb': {
+						// RGB
+						$returncolor['R'] = max(0, min(255, (floatval($m[2]) * 255)));
+						$returncolor['G'] = max(0, min(255, (floatval($m[3]) * 255)));
+						$returncolor['B'] = max(0, min(255, (floatval($m[4]) * 255)));
+						break;
+					}
+					case 'g': {
+						// grayscale
+						$returncolor['G'] = max(0, min(255, (floatval($m[2]) * 255)));
+						break;
+					}
+					case 't':
+					default: {
+						// transparent (empty array)
+						break;
+					}
+				}
+				return $returncolor;
+			}
+		} elseif (($dotpos = strpos($color, '.')) !== false) {
+			// remove class parent (i.e.: color.red)
+			$color = substr($color, ($dotpos + 1));
+			if ($color == 'transparent') {
+				// transparent (empty array)
+				return array();
+			}
+		}
+		if (strlen($color) == 0) {
+			return $defcol;
+		}
+		// RGB ARRAY
+		if (substr($color, 0, 3) == 'rgb') {
+			$codes = substr($color, 4);
+			$codes = str_replace(')', '', $codes);
+			$returncolor = explode(',', $codes);
+			foreach ($returncolor as $key => $val) {
+				if (strpos($val, '%') > 0) {
+					// percentage
+					$returncolor[$key] = (255 * intval($val) / 100);
+				} else {
+					$returncolor[$key] = intval($val);
+				}
+				// normalize value
+				$returncolor[$key] = max(0, min(255, $returncolor[$key]));
+			}
+			return $returncolor;
+		}
+		// CMYK ARRAY
+		if (substr($color, 0, 4) == 'cmyk') {
+			$codes = substr($color, 5);
+			$codes = str_replace(')', '', $codes);
+			$returncolor = explode(',', $codes);
+			foreach ($returncolor as $key => $val) {
+				if (strpos($val, '%') !== false) {
+					// percentage
+					$returncolor[$key] = (100 * intval($val) / 100);
+				} else {
+					$returncolor[$key] = intval($val);
+				}
+				// normalize value
+				$returncolor[$key] = max(0, min(100, $returncolor[$key]));
+			}
+			return $returncolor;
+		}
+		if ($color{0} != '#') {
+			// COLOR NAME
+			if (isset(self::$webcolor[$color])) {
+				// web color
+				$color_code = self::$webcolor[$color];
+			} else {
+				// spot color
+				$returncolor = self::getSpotColor($color, $spotc);
+				if ($returncolor === false) {
+					$returncolor = $defcol;
+				}
+				return $returncolor;
+			}
+		} else {
+			$color_code = substr($color, 1);
+		}
+		// HEXADECIMAL REPRESENTATION
+		switch (strlen($color_code)) {
+			case 3: {
+				// 3-digit RGB hexadecimal representation
+				$r = substr($color_code, 0, 1);
+				$g = substr($color_code, 1, 1);
+				$b = substr($color_code, 2, 1);
+				$returncolor = array();
+				$returncolor['R'] = max(0, min(255, hexdec($r.$r)));
+				$returncolor['G'] = max(0, min(255, hexdec($g.$g)));
+				$returncolor['B'] = max(0, min(255, hexdec($b.$b)));
+				break;
+			}
+			case 6: {
+				// 6-digit RGB hexadecimal representation
+				$returncolor = array();
+				$returncolor['R'] = max(0, min(255, hexdec(substr($color_code, 0, 2))));
+				$returncolor['G'] = max(0, min(255, hexdec(substr($color_code, 2, 2))));
+				$returncolor['B'] = max(0, min(255, hexdec(substr($color_code, 4, 2))));
+				break;
+			}
+			case 8: {
+				// 8-digit CMYK hexadecimal representation
+				$returncolor = array();
+				$returncolor['C'] = max(0, min(100, round(hexdec(substr($color_code, 0, 2)) / 2.55)));
+				$returncolor['M'] = max(0, min(100, round(hexdec(substr($color_code, 2, 2)) / 2.55)));
+				$returncolor['Y'] = max(0, min(100, round(hexdec(substr($color_code, 4, 2)) / 2.55)));
+				$returncolor['K'] = max(0, min(100, round(hexdec(substr($color_code, 6, 2)) / 2.55)));
+				break;
+			}
+			default: {
+				$returncolor = $defcol;
+				break;
+			}
+		}
+		return $returncolor;
+	}
+
+	/**
+	 * Convert a color array into a string representation.
+	 * @param $c (array) Array of colors.
+	 * @return (string) The color array representation.
+	 * @since 5.9.137 (2011-12-01)
+	 * @public static
+	 */
+	public static function getColorStringFromArray($c) {
+		$c = array_values($c);
+		$color = '[';
+		switch (count($c)) {
+			case 4: {
+				// CMYK
+				$color .= sprintf('%F %F %F %F', (max(0, min(100, floatval($c[0]))) / 100), (max(0, min(100, floatval($c[1]))) / 100), (max(0, min(100, floatval($c[2]))) / 100), (max(0, min(100, floatval($c[3]))) / 100));
+				break;
+			}
+			case 3: {
+				// RGB
+				$color .= sprintf('%F %F %F', (max(0, min(255, floatval($c[0]))) / 255), (max(0, min(255, floatval($c[1]))) / 255), (max(0, min(255, floatval($c[2]))) / 255));
+				break;
+			}
+			case 1: {
+				// grayscale
+				$color .= sprintf('%F', (max(0, min(255, floatval($c[0]))) / 255));
+				break;
+			}
+		}
+		$color .= ']';
+		return $color;
+	}
+
+	/**
+	 * Convert color to javascript color.
+	 * @param $color (string) color name or "#RRGGBB"
+	 * @protected
+	 * @since 2.1.002 (2008-02-12)
+	 * @public static
+	 */
+	public static function _JScolor($color) {
+		if (substr($color, 0, 1) == '#') {
+			return sprintf("['RGB',%F,%F,%F]", (hexdec(substr($color, 1, 2)) / 255), (hexdec(substr($color, 3, 2)) / 255), (hexdec(substr($color, 5, 2)) / 255));
+		}
+		if (!in_array($color, self::$jscolor)) {
+			// default transparent color
+			$color = $jscolor[0];
+		}
+		return 'color.'.$color;
+	}
+
+
+} // END OF TCPDF_COLORS CLASS
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_filters.php b/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_filters.php
new file mode 100644
index 00000000..28556e4c
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_filters.php
@@ -0,0 +1,481 @@
+<?php
+//============================================================+
+// File name   : tcpdf_filters.php
+// Version     : 1.0.001
+// Begin       : 2011-05-23
+// Last Update : 2013-09-15
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2011-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 License
+// along with TCPDF. If not, see
+// <http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : This is a PHP class for decoding common PDF filters (PDF 32000-2008 - 7.4 Filters).
+//
+//============================================================+
+
+/**
+ * @file
+ * This is a PHP class for decoding common PDF filters (PDF 32000-2008 - 7.4 Filters).<br>
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.001
+ */
+
+/**
+ * @class TCPDF_FILTERS
+ * This is a PHP class for decoding common PDF filters (PDF 32000-2008 - 7.4 Filters).<br>
+ * @package com.tecnick.tcpdf
+ * @brief This is a PHP class for decoding common PDF filters.
+ * @version 1.0.001
+ * @author Nicola Asuni - info@tecnick.com
+ */
+class TCPDF_FILTERS {
+
+	/**
+	 * Define a list of available filter decoders.
+	 * @private static
+	 */
+	private static $available_filters = array('ASCIIHexDecode', 'ASCII85Decode', 'LZWDecode', 'FlateDecode', 'RunLengthDecode');
+
+// -----------------------------------------------------------------------------
+
+	/**
+	 * Get a list of available decoding filters.
+	 * @return (array) Array of available filter decoders.
+	 * @since 1.0.000 (2011-05-23)
+	 * @public static
+	 */
+	public static function getAvailableFilters() {
+		return self::$available_filters;
+	}
+
+	/**
+	 * Decode data using the specified filter type.
+	 * @param $filter (string) Filter name.
+	 * @param $data (string) Data to decode.
+	 * @return Decoded data string.
+	 * @since 1.0.000 (2011-05-23)
+	 * @public static
+	 */
+	public static function decodeFilter($filter, $data) {
+		switch ($filter) {
+			case 'ASCIIHexDecode': {
+				return self::decodeFilterASCIIHexDecode($data);
+				break;
+			}
+			case 'ASCII85Decode': {
+				return self::decodeFilterASCII85Decode($data);
+				break;
+			}
+			case 'LZWDecode': {
+				return self::decodeFilterLZWDecode($data);
+				break;
+			}
+			case 'FlateDecode': {
+				return self::decodeFilterFlateDecode($data);
+				break;
+			}
+			case 'RunLengthDecode': {
+				return self::decodeFilterRunLengthDecode($data);
+				break;
+			}
+			case 'CCITTFaxDecode': {
+				return self::decodeFilterCCITTFaxDecode($data);
+				break;
+			}
+			case 'JBIG2Decode': {
+				return self::decodeFilterJBIG2Decode($data);
+				break;
+			}
+			case 'DCTDecode': {
+				return self::decodeFilterDCTDecode($data);
+				break;
+			}
+			case 'JPXDecode': {
+				return self::decodeFilterJPXDecode($data);
+				break;
+			}
+			case 'Crypt': {
+				return self::decodeFilterCrypt($data);
+				break;
+			}
+			default: {
+				return self::decodeFilterStandard($data);
+				break;
+			}
+		}
+	}
+
+	// --- FILTERS (PDF 32000-2008 - 7.4 Filters) ------------------------------
+
+	/**
+	 * Standard
+	 * Default decoding filter (leaves data unchanged).
+	 * @param $data (string) Data to decode.
+	 * @return Decoded data string.
+	 * @since 1.0.000 (2011-05-23)
+	 * @public static
+	 */
+	public static function decodeFilterStandard($data) {
+		return $data;
+	}
+
+	/**
+	 * ASCIIHexDecode
+	 * Decodes data encoded in an ASCII hexadecimal representation, reproducing the original binary data.
+	 * @param $data (string) Data to decode.
+	 * @return Decoded data string.
+	 * @since 1.0.000 (2011-05-23)
+	 * @public static
+	 */
+	public static function decodeFilterASCIIHexDecode($data) {
+		// intialize string to return
+		$decoded = '';
+		// all white-space characters shall be ignored
+		$data = preg_replace('/[\s]/', '', $data);
+		// check for EOD character: GREATER-THAN SIGN (3Eh)
+		$eod = strpos($data, '>');
+		if ($eod !== false) {
+			// remove EOD and extra data (if any)
+			$data = substr($data, 0, $eod);
+			$eod = true;
+		}
+		// get data length
+		$data_length = strlen($data);
+		if (($data_length % 2) != 0) {
+			// odd number of hexadecimal digits
+			if ($eod) {
+				// EOD shall behave as if a 0 (zero) followed the last digit
+				$data = substr($data, 0, -1).'0'.substr($data, -1);
+			} else {
+				self::Error('decodeFilterASCIIHexDecode: invalid code');
+			}
+		}
+		// check for invalid characters
+		if (preg_match('/[^a-fA-F\d]/', $data) > 0) {
+			self::Error('decodeFilterASCIIHexDecode: invalid code');
+		}
+		// get one byte of binary data for each pair of ASCII hexadecimal digits
+		$decoded = pack('H*', $data);
+		return $decoded;
+	}
+
+	/**
+	 * ASCII85Decode
+	 * Decodes data encoded in an ASCII base-85 representation, reproducing the original binary data.
+	 * @param $data (string) Data to decode.
+	 * @return Decoded data string.
+	 * @since 1.0.000 (2011-05-23)
+	 * @public static
+	 */
+	public static function decodeFilterASCII85Decode($data) {
+		// intialize string to return
+		$decoded = '';
+		// all white-space characters shall be ignored
+		$data = preg_replace('/[\s]/', '', $data);
+		// remove start sequence 2-character sequence <~ (3Ch)(7Eh)
+		if (strpos($data, '<~') !== false) {
+			// remove EOD and extra data (if any)
+			$data = substr($data, 2);
+		}
+		// check for EOD: 2-character sequence ~> (7Eh)(3Eh)
+		$eod = strpos($data, '~>');
+		if ($eod !== false) {
+			// remove EOD and extra data (if any)
+			$data = substr($data, 0, $eod);
+		}
+		// data length
+		$data_length = strlen($data);
+		// check for invalid characters
+		if (preg_match('/[^\x21-\x75,\x74]/', $data) > 0) {
+			self::Error('decodeFilterASCII85Decode: invalid code');
+		}
+		// z sequence
+		$zseq = chr(0).chr(0).chr(0).chr(0);
+		// position inside a group of 4 bytes (0-3)
+		$group_pos = 0;
+		$tuple = 0;
+		$pow85 = array((85*85*85*85), (85*85*85), (85*85), 85, 1);
+		$last_pos = ($data_length - 1);
+		// for each byte
+		for ($i = 0; $i < $data_length; ++$i) {
+			// get char value
+			$char = ord($data[$i]);
+			if ($char == 122) { // 'z'
+				if ($group_pos == 0) {
+					$decoded .= $zseq;
+				} else {
+					self::Error('decodeFilterASCII85Decode: invalid code');
+				}
+			} else {
+				// the value represented by a group of 5 characters should never be greater than 2^32 - 1
+				$tuple += (($char - 33) * $pow85[$group_pos]);
+				if ($group_pos == 4) {
+					$decoded .= chr($tuple >> 24).chr($tuple >> 16).chr($tuple >> 8).chr($tuple);
+					$tuple = 0;
+					$group_pos = 0;
+				} else {
+					++$group_pos;
+				}
+			}
+		}
+		if ($group_pos > 1) {
+			$tuple += $pow85[($group_pos - 1)];
+		}
+		// last tuple (if any)
+		switch ($group_pos) {
+			case 4: {
+				$decoded .= chr($tuple >> 24).chr($tuple >> 16).chr($tuple >> 8);
+				break;
+			}
+			case 3: {
+				$decoded .= chr($tuple >> 24).chr($tuple >> 16);
+				break;
+			}
+			case 2: {
+				$decoded .= chr($tuple >> 24);
+				break;
+			}
+			case 1: {
+				self::Error('decodeFilterASCII85Decode: invalid code');
+				break;
+			}
+		}
+		return $decoded;
+	}
+
+	/**
+	 * LZWDecode
+	 * Decompresses data encoded using the LZW (Lempel-Ziv-Welch) adaptive compression method, reproducing the original text or binary data.
+	 * @param $data (string) Data to decode.
+	 * @return Decoded data string.
+	 * @since 1.0.000 (2011-05-23)
+	 * @public static
+	 */
+	public static function decodeFilterLZWDecode($data) {
+		// intialize string to return
+		$decoded = '';
+		// data length
+		$data_length = strlen($data);
+		// convert string to binary string
+		$bitstring = '';
+		for ($i = 0; $i < $data_length; ++$i) {
+			$bitstring .= sprintf('%08b', ord($data{$i}));
+		}
+		// get the number of bits
+		$data_length = strlen($bitstring);
+		// initialize code length in bits
+		$bitlen = 9;
+		// initialize dictionary index
+		$dix = 258;
+		// initialize the dictionary (with the first 256 entries).
+		$dictionary = array();
+		for ($i = 0; $i < 256; ++$i) {
+			$dictionary[$i] = chr($i);
+		}
+		// previous val
+		$prev_index = 0;
+		// while we encounter EOD marker (257), read code_length bits
+		while (($data_length > 0) AND (($index = bindec(substr($bitstring, 0, $bitlen))) != 257)) {
+			// remove read bits from string
+			$bitstring = substr($bitstring, $bitlen);
+			// update number of bits
+			$data_length -= $bitlen;
+			if ($index == 256) { // clear-table marker
+				// reset code length in bits
+				$bitlen = 9;
+				// reset dictionary index
+				$dix = 258;
+				$prev_index = 256;
+				// reset the dictionary (with the first 256 entries).
+				$dictionary = array();
+				for ($i = 0; $i < 256; ++$i) {
+					$dictionary[$i] = chr($i);
+				}
+			} elseif ($prev_index == 256) {
+				// first entry
+				$decoded .= $dictionary[$index];
+				$prev_index = $index;
+			} else {
+				// check if index exist in the dictionary
+				if ($index < $dix) {
+					// index exist on dictionary
+					$decoded .= $dictionary[$index];
+					$dic_val = $dictionary[$prev_index].$dictionary[$index]{0};
+					// store current index
+					$prev_index = $index;
+				} else {
+					// index do not exist on dictionary
+					$dic_val = $dictionary[$prev_index].$dictionary[$prev_index]{0};
+					$decoded .= $dic_val;
+				}
+				// update dictionary
+				$dictionary[$dix] = $dic_val;
+				++$dix;
+				// change bit length by case
+				if ($dix == 2047) {
+					$bitlen = 12;
+				} elseif ($dix == 1023) {
+					$bitlen = 11;
+				} elseif ($dix == 511) {
+					$bitlen = 10;
+				}
+			}
+		}
+		return $decoded;
+	}
+
+	/**
+	 * FlateDecode
+	 * Decompresses data encoded using the zlib/deflate compression method, reproducing the original text or binary data.
+	 * @param $data (string) Data to decode.
+	 * @return Decoded data string.
+	 * @since 1.0.000 (2011-05-23)
+	 * @public static
+	 */
+	public static function decodeFilterFlateDecode($data) {
+		// intialize string to return
+		$decoded = @gzuncompress($data);
+		if ($decoded === false) {
+			self::Error('decodeFilterFlateDecode: invalid code');
+		}
+		return $decoded;
+	}
+
+	/**
+	 * RunLengthDecode
+	 * Decompresses data encoded using a byte-oriented run-length encoding algorithm.
+	 * @param $data (string) Data to decode.
+	 * @since 1.0.000 (2011-05-23)
+	 * @public static
+	 */
+	public static function decodeFilterRunLengthDecode($data) {
+		// intialize string to return
+		$decoded = '';
+		// data length
+		$data_length = strlen($data);
+		$i = 0;
+		while($i < $data_length) {
+			// get current byte value
+			$byte = ord($data{$i});
+			if ($byte == 128) {
+				// a length value of 128 denote EOD
+				break;
+			} elseif ($byte < 128) {
+				// if the length byte is in the range 0 to 127
+				// the following length + 1 (1 to 128) bytes shall be copied literally during decompression
+				$decoded .= substr($data, ($i + 1), ($byte + 1));
+				// move to next block
+				$i += ($byte + 2);
+			} else {
+				// if length is in the range 129 to 255,
+				// the following single byte shall be copied 257 - length (2 to 128) times during decompression
+				$decoded .= str_repeat($data{($i + 1)}, (257 - $byte));
+				// move to next block
+				$i += 2;
+			}
+		}
+		return $decoded;
+	}
+
+	/**
+	 * CCITTFaxDecode (NOT IMPLEMETED - RETURN AN EXCEPTION)
+	 * Decompresses data encoded using the CCITT facsimile standard, reproducing the original data (typically monochrome image data at 1 bit per pixel).
+	 * @param $data (string) Data to decode.
+	 * @return Decoded data string.
+	 * @since 1.0.000 (2011-05-23)
+	 * @public static
+	 */
+	public static function decodeFilterCCITTFaxDecode($data) {
+		self::Error('~decodeFilterCCITTFaxDecode: this method has not been yet implemented');
+		//return $data;
+	}
+
+	/**
+	 * JBIG2Decode (NOT IMPLEMETED - RETURN AN EXCEPTION)
+	 * Decompresses data encoded using the JBIG2 standard, reproducing the original monochrome (1 bit per pixel) image data (or an approximation of that data).
+	 * @param $data (string) Data to decode.
+	 * @return Decoded data string.
+	 * @since 1.0.000 (2011-05-23)
+	 * @public static
+	 */
+	public static function decodeFilterJBIG2Decode($data) {
+		self::Error('~decodeFilterJBIG2Decode: this method has not been yet implemented');
+		//return $data;
+	}
+
+	/**
+	 * DCTDecode (NOT IMPLEMETED - RETURN AN EXCEPTION)
+	 * Decompresses data encoded using a DCT (discrete cosine transform) technique based on the JPEG standard, reproducing image sample data that approximates the original data.
+	 * @param $data (string) Data to decode.
+	 * @return Decoded data string.
+	 * @since 1.0.000 (2011-05-23)
+	 * @public static
+	 */
+	public static function decodeFilterDCTDecode($data) {
+		self::Error('~decodeFilterDCTDecode: this method has not been yet implemented');
+		//return $data;
+	}
+
+	/**
+	 * JPXDecode (NOT IMPLEMETED - RETURN AN EXCEPTION)
+	 * Decompresses data encoded using the wavelet-based JPEG2000 standard, reproducing the original image data.
+	 * @param $data (string) Data to decode.
+	 * @return Decoded data string.
+	 * @since 1.0.000 (2011-05-23)
+	 * @public static
+	 */
+	public static function decodeFilterJPXDecode($data) {
+		self::Error('~decodeFilterJPXDecode: this method has not been yet implemented');
+		//return $data;
+	}
+
+	/**
+	 * Crypt (NOT IMPLEMETED - RETURN AN EXCEPTION)
+	 * Decrypts data encrypted by a security handler, reproducing the data as it was before encryption.
+	 * @param $data (string) Data to decode.
+	 * @return Decoded data string.
+	 * @since 1.0.000 (2011-05-23)
+	 * @public static
+	 */
+	public static function decodeFilterCrypt($data) {
+		self::Error('~decodeFilterCrypt: this method has not been yet implemented');
+		//return $data;
+	}
+
+	// --- END FILTERS SECTION -------------------------------------------------
+
+	/**
+	 * Throw an exception.
+	 * @param $msg (string) The error message
+	 * @since 1.0.000 (2011-05-23)
+	 * @public static
+	 */
+	public static function Error($msg) {
+		throw new Exception('TCPDF_PARSER ERROR: '.$msg);
+	}
+
+} // END OF TCPDF_FILTERS CLASS
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_font_data.php b/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_font_data.php
new file mode 100644
index 00000000..974e72ec
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_font_data.php
@@ -0,0 +1,18447 @@
+<?php
+//============================================================+
+// File name   : tcpdf_font_data.php
+// Version     : 1.0.001
+// Begin       : 2008-01-01
+// Last Update : 2013-04-01
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2008-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Unicode data and encoding maps for TCPDF.
+//
+//============================================================+
+
+/**
+ * @file
+ * Unicode data and encoding maps for TCPDF.
+ * @author Nicola Asuni
+ * @package com.tecnick.tcpdf
+ */
+
+/**
+ * @class TCPDF_FONT_DATA
+ * Unicode data and encoding maps for TCPDF.
+ * @package com.tecnick.tcpdf
+ * @version 1.0.001
+ * @author Nicola Asuni - info@tecnick.com
+ */
+class TCPDF_FONT_DATA {
+
+/**
+ * Unicode code for Left-to-Right Mark.
+ * @public
+ */
+public static $uni_LRM = 8206;
+
+/**
+ * Unicode code for Right-to-Left Mark.
+ * @public
+ */
+public static $uni_RLM = 8207;
+
+/**
+ * Unicode code for Left-to-Right Embedding.
+ * @public
+ */
+public static $uni_LRE = 8234;
+
+/**
+ * Unicode code for Right-to-Left Embedding.
+ * @public
+ */
+public static $uni_RLE = 8235;
+
+/**
+ * Unicode code for Pop Directional Format.
+ * @public
+ */
+public static $uni_PDF = 8236;
+
+/**
+ * Unicode code for Left-to-Right Override.
+ * @public
+ */
+public static $uni_LRO = 8237;
+
+/**
+ * Unicode code for Right-to-Left Override.
+ * @public
+ */
+public static $uni_RLO = 8238;
+
+/**
+ * Pattern to test RTL (Righ-To-Left) strings using regular expressions.
+ * @public
+ */
+public static $uni_RE_PATTERN_RTL = "/(
+	  \xD6\xBE                                             # R
+	| \xD7[\x80\x83\x86\x90-\xAA\xB0-\xB4]                 # R
+	| \xDF[\x80-\xAA\xB4\xB5\xBA]                          # R
+	| \xE2\x80\x8F                                         # R
+	| \xEF\xAC[\x9D\x9F\xA0-\xA8\xAA-\xB6\xB8-\xBC\xBE]    # R
+	| \xEF\xAD[\x80\x81\x83\x84\x86-\x8F]                  # R
+	| \xF0\x90\xA0[\x80-\x85\x88\x8A-\xB5\xB7\xB8\xBC\xBF] # R
+	| \xF0\x90\xA4[\x80-\x99]                              # R
+	| \xF0\x90\xA8[\x80\x90-\x93\x95-\x97\x99-\xB3]        # R
+	| \xF0\x90\xA9[\x80-\x87\x90-\x98]                     # R
+	| \xE2\x80[\xAB\xAE]                                   # RLE & RLO
+	)/x";
+
+/**
+ * Pattern to test Arabic strings using regular expressions. Source: http://www.w3.org/International/questions/qa-forms-utf-8
+ * @public
+ */
+public static $uni_RE_PATTERN_ARABIC = "/(
+		  \xD8[\x80-\x83\x8B\x8D\x9B\x9E\x9F\xA1-\xBA]  # AL
+		| \xD9[\x80-\x8A\xAD-\xAF\xB1-\xBF]             # AL
+		| \xDA[\x80-\xBF]                               # AL
+		| \xDB[\x80-\x95\x9D\xA5\xA6\xAE\xAF\xBA-\xBF]  # AL
+		| \xDC[\x80-\x8D\x90\x92-\xAF]                  # AL
+		| \xDD[\x8D-\xAD]                               # AL
+		| \xDE[\x80-\xA5\xB1]                           # AL
+		| \xEF\xAD[\x90-\xBF]                           # AL
+		| \xEF\xAE[\x80-\xB1]                           # AL
+		| \xEF\xAF[\x93-\xBF]                           # AL
+		| \xEF[\xB0-\xB3][\x80-\xBF]                    # AL
+		| \xEF\xB4[\x80-\xBD]                           # AL
+		| \xEF\xB5[\x90-\xBF]                           # AL
+		| \xEF\xB6[\x80-\x8F\x92-\xBF]                  # AL
+		| \xEF\xB7[\x80-\x87\xB0-\xBC]                  # AL
+		| \xEF\xB9[\xB0-\xB4\xB6-\xBF]                  # AL
+		| \xEF\xBA[\x80-\xBF]                           # AL
+		| \xEF\xBB[\x80-\xBC]                           # AL
+		| \xD9[\xA0-\xA9\xAB\xAC]                       # AN
+		)/x";
+
+/**
+ * Array of Unicode types.
+ * @public
+ */
+public static $uni_type = array(
+0=>'BN',
+1=>'BN',
+2=>'BN',
+3=>'BN',
+4=>'BN',
+5=>'BN',
+6=>'BN',
+7=>'BN',
+8=>'BN',
+9=>'S',
+10=>'B',
+11=>'S',
+12=>'WS',
+13=>'B',
+14=>'BN',
+15=>'BN',
+16=>'BN',
+17=>'BN',
+18=>'BN',
+19=>'BN',
+20=>'BN',
+21=>'BN',
+22=>'BN',
+23=>'BN',
+24=>'BN',
+25=>'BN',
+26=>'BN',
+27=>'BN',
+28=>'B',
+29=>'B',
+30=>'B',
+31=>'S',
+32=>'WS',
+33=>'ON',
+34=>'ON',
+35=>'ET',
+36=>'ET',
+37=>'ET',
+38=>'ON',
+39=>'ON',
+40=>'ON',
+41=>'ON',
+42=>'ON',
+43=>'ES',
+44=>'CS',
+45=>'ES',
+46=>'CS',
+47=>'CS',
+48=>'EN',
+49=>'EN',
+50=>'EN',
+51=>'EN',
+52=>'EN',
+53=>'EN',
+54=>'EN',
+55=>'EN',
+56=>'EN',
+57=>'EN',
+58=>'CS',
+59=>'ON',
+60=>'ON',
+61=>'ON',
+62=>'ON',
+63=>'ON',
+64=>'ON',
+65=>'L',
+66=>'L',
+67=>'L',
+68=>'L',
+69=>'L',
+70=>'L',
+71=>'L',
+72=>'L',
+73=>'L',
+74=>'L',
+75=>'L',
+76=>'L',
+77=>'L',
+78=>'L',
+79=>'L',
+80=>'L',
+81=>'L',
+82=>'L',
+83=>'L',
+84=>'L',
+85=>'L',
+86=>'L',
+87=>'L',
+88=>'L',
+89=>'L',
+90=>'L',
+91=>'ON',
+92=>'ON',
+93=>'ON',
+94=>'ON',
+95=>'ON',
+96=>'ON',
+97=>'L',
+98=>'L',
+99=>'L',
+100=>'L',
+101=>'L',
+102=>'L',
+103=>'L',
+104=>'L',
+105=>'L',
+106=>'L',
+107=>'L',
+108=>'L',
+109=>'L',
+110=>'L',
+111=>'L',
+112=>'L',
+113=>'L',
+114=>'L',
+115=>'L',
+116=>'L',
+117=>'L',
+118=>'L',
+119=>'L',
+120=>'L',
+121=>'L',
+122=>'L',
+123=>'ON',
+124=>'ON',
+125=>'ON',
+126=>'ON',
+127=>'BN',
+128=>'BN',
+129=>'BN',
+130=>'BN',
+131=>'BN',
+132=>'BN',
+133=>'B',
+134=>'BN',
+135=>'BN',
+136=>'BN',
+137=>'BN',
+138=>'BN',
+139=>'BN',
+140=>'BN',
+141=>'BN',
+142=>'BN',
+143=>'BN',
+144=>'BN',
+145=>'BN',
+146=>'BN',
+147=>'BN',
+148=>'BN',
+149=>'BN',
+150=>'BN',
+151=>'BN',
+152=>'BN',
+153=>'BN',
+154=>'BN',
+155=>'BN',
+156=>'BN',
+157=>'BN',
+158=>'BN',
+159=>'BN',
+160=>'CS',
+161=>'ON',
+162=>'ET',
+163=>'ET',
+164=>'ET',
+165=>'ET',
+166=>'ON',
+167=>'ON',
+168=>'ON',
+169=>'ON',
+170=>'L',
+171=>'ON',
+172=>'ON',
+173=>'BN',
+174=>'ON',
+175=>'ON',
+176=>'ET',
+177=>'ET',
+178=>'EN',
+179=>'EN',
+180=>'ON',
+181=>'L',
+182=>'ON',
+183=>'ON',
+184=>'ON',
+185=>'EN',
+186=>'L',
+187=>'ON',
+188=>'ON',
+189=>'ON',
+190=>'ON',
+191=>'ON',
+192=>'L',
+193=>'L',
+194=>'L',
+195=>'L',
+196=>'L',
+197=>'L',
+198=>'L',
+199=>'L',
+200=>'L',
+201=>'L',
+202=>'L',
+203=>'L',
+204=>'L',
+205=>'L',
+206=>'L',
+207=>'L',
+208=>'L',
+209=>'L',
+210=>'L',
+211=>'L',
+212=>'L',
+213=>'L',
+214=>'L',
+215=>'ON',
+216=>'L',
+217=>'L',
+218=>'L',
+219=>'L',
+220=>'L',
+221=>'L',
+222=>'L',
+223=>'L',
+224=>'L',
+225=>'L',
+226=>'L',
+227=>'L',
+228=>'L',
+229=>'L',
+230=>'L',
+231=>'L',
+232=>'L',
+233=>'L',
+234=>'L',
+235=>'L',
+236=>'L',
+237=>'L',
+238=>'L',
+239=>'L',
+240=>'L',
+241=>'L',
+242=>'L',
+243=>'L',
+244=>'L',
+245=>'L',
+246=>'L',
+247=>'ON',
+248=>'L',
+249=>'L',
+250=>'L',
+251=>'L',
+252=>'L',
+253=>'L',
+254=>'L',
+255=>'L',
+256=>'L',
+257=>'L',
+258=>'L',
+259=>'L',
+260=>'L',
+261=>'L',
+262=>'L',
+263=>'L',
+264=>'L',
+265=>'L',
+266=>'L',
+267=>'L',
+268=>'L',
+269=>'L',
+270=>'L',
+271=>'L',
+272=>'L',
+273=>'L',
+274=>'L',
+275=>'L',
+276=>'L',
+277=>'L',
+278=>'L',
+279=>'L',
+280=>'L',
+281=>'L',
+282=>'L',
+283=>'L',
+284=>'L',
+285=>'L',
+286=>'L',
+287=>'L',
+288=>'L',
+289=>'L',
+290=>'L',
+291=>'L',
+292=>'L',
+293=>'L',
+294=>'L',
+295=>'L',
+296=>'L',
+297=>'L',
+298=>'L',
+299=>'L',
+300=>'L',
+301=>'L',
+302=>'L',
+303=>'L',
+304=>'L',
+305=>'L',
+306=>'L',
+307=>'L',
+308=>'L',
+309=>'L',
+310=>'L',
+311=>'L',
+312=>'L',
+313=>'L',
+314=>'L',
+315=>'L',
+316=>'L',
+317=>'L',
+318=>'L',
+319=>'L',
+320=>'L',
+321=>'L',
+322=>'L',
+323=>'L',
+324=>'L',
+325=>'L',
+326=>'L',
+327=>'L',
+328=>'L',
+329=>'L',
+330=>'L',
+331=>'L',
+332=>'L',
+333=>'L',
+334=>'L',
+335=>'L',
+336=>'L',
+337=>'L',
+338=>'L',
+339=>'L',
+340=>'L',
+341=>'L',
+342=>'L',
+343=>'L',
+344=>'L',
+345=>'L',
+346=>'L',
+347=>'L',
+348=>'L',
+349=>'L',
+350=>'L',
+351=>'L',
+352=>'L',
+353=>'L',
+354=>'L',
+355=>'L',
+356=>'L',
+357=>'L',
+358=>'L',
+359=>'L',
+360=>'L',
+361=>'L',
+362=>'L',
+363=>'L',
+364=>'L',
+365=>'L',
+366=>'L',
+367=>'L',
+368=>'L',
+369=>'L',
+370=>'L',
+371=>'L',
+372=>'L',
+373=>'L',
+374=>'L',
+375=>'L',
+376=>'L',
+377=>'L',
+378=>'L',
+379=>'L',
+380=>'L',
+381=>'L',
+382=>'L',
+383=>'L',
+384=>'L',
+385=>'L',
+386=>'L',
+387=>'L',
+388=>'L',
+389=>'L',
+390=>'L',
+391=>'L',
+392=>'L',
+393=>'L',
+394=>'L',
+395=>'L',
+396=>'L',
+397=>'L',
+398=>'L',
+399=>'L',
+400=>'L',
+401=>'L',
+402=>'L',
+403=>'L',
+404=>'L',
+405=>'L',
+406=>'L',
+407=>'L',
+408=>'L',
+409=>'L',
+410=>'L',
+411=>'L',
+412=>'L',
+413=>'L',
+414=>'L',
+415=>'L',
+416=>'L',
+417=>'L',
+418=>'L',
+419=>'L',
+420=>'L',
+421=>'L',
+422=>'L',
+423=>'L',
+424=>'L',
+425=>'L',
+426=>'L',
+427=>'L',
+428=>'L',
+429=>'L',
+430=>'L',
+431=>'L',
+432=>'L',
+433=>'L',
+434=>'L',
+435=>'L',
+436=>'L',
+437=>'L',
+438=>'L',
+439=>'L',
+440=>'L',
+441=>'L',
+442=>'L',
+443=>'L',
+444=>'L',
+445=>'L',
+446=>'L',
+447=>'L',
+448=>'L',
+449=>'L',
+450=>'L',
+451=>'L',
+452=>'L',
+453=>'L',
+454=>'L',
+455=>'L',
+456=>'L',
+457=>'L',
+458=>'L',
+459=>'L',
+460=>'L',
+461=>'L',
+462=>'L',
+463=>'L',
+464=>'L',
+465=>'L',
+466=>'L',
+467=>'L',
+468=>'L',
+469=>'L',
+470=>'L',
+471=>'L',
+472=>'L',
+473=>'L',
+474=>'L',
+475=>'L',
+476=>'L',
+477=>'L',
+478=>'L',
+479=>'L',
+480=>'L',
+481=>'L',
+482=>'L',
+483=>'L',
+484=>'L',
+485=>'L',
+486=>'L',
+487=>'L',
+488=>'L',
+489=>'L',
+490=>'L',
+491=>'L',
+492=>'L',
+493=>'L',
+494=>'L',
+495=>'L',
+496=>'L',
+497=>'L',
+498=>'L',
+499=>'L',
+500=>'L',
+501=>'L',
+502=>'L',
+503=>'L',
+504=>'L',
+505=>'L',
+506=>'L',
+507=>'L',
+508=>'L',
+509=>'L',
+510=>'L',
+511=>'L',
+512=>'L',
+513=>'L',
+514=>'L',
+515=>'L',
+516=>'L',
+517=>'L',
+518=>'L',
+519=>'L',
+520=>'L',
+521=>'L',
+522=>'L',
+523=>'L',
+524=>'L',
+525=>'L',
+526=>'L',
+527=>'L',
+528=>'L',
+529=>'L',
+530=>'L',
+531=>'L',
+532=>'L',
+533=>'L',
+534=>'L',
+535=>'L',
+536=>'L',
+537=>'L',
+538=>'L',
+539=>'L',
+540=>'L',
+541=>'L',
+542=>'L',
+543=>'L',
+544=>'L',
+545=>'L',
+546=>'L',
+547=>'L',
+548=>'L',
+549=>'L',
+550=>'L',
+551=>'L',
+552=>'L',
+553=>'L',
+554=>'L',
+555=>'L',
+556=>'L',
+557=>'L',
+558=>'L',
+559=>'L',
+560=>'L',
+561=>'L',
+562=>'L',
+563=>'L',
+564=>'L',
+565=>'L',
+566=>'L',
+567=>'L',
+568=>'L',
+569=>'L',
+570=>'L',
+571=>'L',
+572=>'L',
+573=>'L',
+574=>'L',
+575=>'L',
+576=>'L',
+577=>'L',
+578=>'L',
+579=>'L',
+580=>'L',
+581=>'L',
+582=>'L',
+583=>'L',
+584=>'L',
+585=>'L',
+586=>'L',
+587=>'L',
+588=>'L',
+589=>'L',
+590=>'L',
+591=>'L',
+592=>'L',
+593=>'L',
+594=>'L',
+595=>'L',
+596=>'L',
+597=>'L',
+598=>'L',
+599=>'L',
+600=>'L',
+601=>'L',
+602=>'L',
+603=>'L',
+604=>'L',
+605=>'L',
+606=>'L',
+607=>'L',
+608=>'L',
+609=>'L',
+610=>'L',
+611=>'L',
+612=>'L',
+613=>'L',
+614=>'L',
+615=>'L',
+616=>'L',
+617=>'L',
+618=>'L',
+619=>'L',
+620=>'L',
+621=>'L',
+622=>'L',
+623=>'L',
+624=>'L',
+625=>'L',
+626=>'L',
+627=>'L',
+628=>'L',
+629=>'L',
+630=>'L',
+631=>'L',
+632=>'L',
+633=>'L',
+634=>'L',
+635=>'L',
+636=>'L',
+637=>'L',
+638=>'L',
+639=>'L',
+640=>'L',
+641=>'L',
+642=>'L',
+643=>'L',
+644=>'L',
+645=>'L',
+646=>'L',
+647=>'L',
+648=>'L',
+649=>'L',
+650=>'L',
+651=>'L',
+652=>'L',
+653=>'L',
+654=>'L',
+655=>'L',
+656=>'L',
+657=>'L',
+658=>'L',
+659=>'L',
+660=>'L',
+661=>'L',
+662=>'L',
+663=>'L',
+664=>'L',
+665=>'L',
+666=>'L',
+667=>'L',
+668=>'L',
+669=>'L',
+670=>'L',
+671=>'L',
+672=>'L',
+673=>'L',
+674=>'L',
+675=>'L',
+676=>'L',
+677=>'L',
+678=>'L',
+679=>'L',
+680=>'L',
+681=>'L',
+682=>'L',
+683=>'L',
+684=>'L',
+685=>'L',
+686=>'L',
+687=>'L',
+688=>'L',
+689=>'L',
+690=>'L',
+691=>'L',
+692=>'L',
+693=>'L',
+694=>'L',
+695=>'L',
+696=>'L',
+697=>'ON',
+698=>'ON',
+699=>'L',
+700=>'L',
+701=>'L',
+702=>'L',
+703=>'L',
+704=>'L',
+705=>'L',
+706=>'ON',
+707=>'ON',
+708=>'ON',
+709=>'ON',
+710=>'ON',
+711=>'ON',
+712=>'ON',
+713=>'ON',
+714=>'ON',
+715=>'ON',
+716=>'ON',
+717=>'ON',
+718=>'ON',
+719=>'ON',
+720=>'L',
+721=>'L',
+722=>'ON',
+723=>'ON',
+724=>'ON',
+725=>'ON',
+726=>'ON',
+727=>'ON',
+728=>'ON',
+729=>'ON',
+730=>'ON',
+731=>'ON',
+732=>'ON',
+733=>'ON',
+734=>'ON',
+735=>'ON',
+736=>'L',
+737=>'L',
+738=>'L',
+739=>'L',
+740=>'L',
+741=>'ON',
+742=>'ON',
+743=>'ON',
+744=>'ON',
+745=>'ON',
+746=>'ON',
+747=>'ON',
+748=>'ON',
+749=>'ON',
+750=>'L',
+751=>'ON',
+752=>'ON',
+753=>'ON',
+754=>'ON',
+755=>'ON',
+756=>'ON',
+757=>'ON',
+758=>'ON',
+759=>'ON',
+760=>'ON',
+761=>'ON',
+762=>'ON',
+763=>'ON',
+764=>'ON',
+765=>'ON',
+766=>'ON',
+767=>'ON',
+768=>'NSM',
+769=>'NSM',
+770=>'NSM',
+771=>'NSM',
+772=>'NSM',
+773=>'NSM',
+774=>'NSM',
+775=>'NSM',
+776=>'NSM',
+777=>'NSM',
+778=>'NSM',
+779=>'NSM',
+780=>'NSM',
+781=>'NSM',
+782=>'NSM',
+783=>'NSM',
+784=>'NSM',
+785=>'NSM',
+786=>'NSM',
+787=>'NSM',
+788=>'NSM',
+789=>'NSM',
+790=>'NSM',
+791=>'NSM',
+792=>'NSM',
+793=>'NSM',
+794=>'NSM',
+795=>'NSM',
+796=>'NSM',
+797=>'NSM',
+798=>'NSM',
+799=>'NSM',
+800=>'NSM',
+801=>'NSM',
+802=>'NSM',
+803=>'NSM',
+804=>'NSM',
+805=>'NSM',
+806=>'NSM',
+807=>'NSM',
+808=>'NSM',
+809=>'NSM',
+810=>'NSM',
+811=>'NSM',
+812=>'NSM',
+813=>'NSM',
+814=>'NSM',
+815=>'NSM',
+816=>'NSM',
+817=>'NSM',
+818=>'NSM',
+819=>'NSM',
+820=>'NSM',
+821=>'NSM',
+822=>'NSM',
+823=>'NSM',
+824=>'NSM',
+825=>'NSM',
+826=>'NSM',
+827=>'NSM',
+828=>'NSM',
+829=>'NSM',
+830=>'NSM',
+831=>'NSM',
+832=>'NSM',
+833=>'NSM',
+834=>'NSM',
+835=>'NSM',
+836=>'NSM',
+837=>'NSM',
+838=>'NSM',
+839=>'NSM',
+840=>'NSM',
+841=>'NSM',
+842=>'NSM',
+843=>'NSM',
+844=>'NSM',
+845=>'NSM',
+846=>'NSM',
+847=>'NSM',
+848=>'NSM',
+849=>'NSM',
+850=>'NSM',
+851=>'NSM',
+852=>'NSM',
+853=>'NSM',
+854=>'NSM',
+855=>'NSM',
+856=>'NSM',
+857=>'NSM',
+858=>'NSM',
+859=>'NSM',
+860=>'NSM',
+861=>'NSM',
+862=>'NSM',
+863=>'NSM',
+864=>'NSM',
+865=>'NSM',
+866=>'NSM',
+867=>'NSM',
+868=>'NSM',
+869=>'NSM',
+870=>'NSM',
+871=>'NSM',
+872=>'NSM',
+873=>'NSM',
+874=>'NSM',
+875=>'NSM',
+876=>'NSM',
+877=>'NSM',
+878=>'NSM',
+879=>'NSM',
+884=>'ON',
+885=>'ON',
+890=>'L',
+891=>'L',
+892=>'L',
+893=>'L',
+894=>'ON',
+900=>'ON',
+901=>'ON',
+902=>'L',
+903=>'ON',
+904=>'L',
+905=>'L',
+906=>'L',
+908=>'L',
+910=>'L',
+911=>'L',
+912=>'L',
+913=>'L',
+914=>'L',
+915=>'L',
+916=>'L',
+917=>'L',
+918=>'L',
+919=>'L',
+920=>'L',
+921=>'L',
+922=>'L',
+923=>'L',
+924=>'L',
+925=>'L',
+926=>'L',
+927=>'L',
+928=>'L',
+929=>'L',
+931=>'L',
+932=>'L',
+933=>'L',
+934=>'L',
+935=>'L',
+936=>'L',
+937=>'L',
+938=>'L',
+939=>'L',
+940=>'L',
+941=>'L',
+942=>'L',
+943=>'L',
+944=>'L',
+945=>'L',
+946=>'L',
+947=>'L',
+948=>'L',
+949=>'L',
+950=>'L',
+951=>'L',
+952=>'L',
+953=>'L',
+954=>'L',
+955=>'L',
+956=>'L',
+957=>'L',
+958=>'L',
+959=>'L',
+960=>'L',
+961=>'L',
+962=>'L',
+963=>'L',
+964=>'L',
+965=>'L',
+966=>'L',
+967=>'L',
+968=>'L',
+969=>'L',
+970=>'L',
+971=>'L',
+972=>'L',
+973=>'L',
+974=>'L',
+976=>'L',
+977=>'L',
+978=>'L',
+979=>'L',
+980=>'L',
+981=>'L',
+982=>'L',
+983=>'L',
+984=>'L',
+985=>'L',
+986=>'L',
+987=>'L',
+988=>'L',
+989=>'L',
+990=>'L',
+991=>'L',
+992=>'L',
+993=>'L',
+994=>'L',
+995=>'L',
+996=>'L',
+997=>'L',
+998=>'L',
+999=>'L',
+1000=>'L',
+1001=>'L',
+1002=>'L',
+1003=>'L',
+1004=>'L',
+1005=>'L',
+1006=>'L',
+1007=>'L',
+1008=>'L',
+1009=>'L',
+1010=>'L',
+1011=>'L',
+1012=>'L',
+1013=>'L',
+1014=>'ON',
+1015=>'L',
+1016=>'L',
+1017=>'L',
+1018=>'L',
+1019=>'L',
+1020=>'L',
+1021=>'L',
+1022=>'L',
+1023=>'L',
+1024=>'L',
+1025=>'L',
+1026=>'L',
+1027=>'L',
+1028=>'L',
+1029=>'L',
+1030=>'L',
+1031=>'L',
+1032=>'L',
+1033=>'L',
+1034=>'L',
+1035=>'L',
+1036=>'L',
+1037=>'L',
+1038=>'L',
+1039=>'L',
+1040=>'L',
+1041=>'L',
+1042=>'L',
+1043=>'L',
+1044=>'L',
+1045=>'L',
+1046=>'L',
+1047=>'L',
+1048=>'L',
+1049=>'L',
+1050=>'L',
+1051=>'L',
+1052=>'L',
+1053=>'L',
+1054=>'L',
+1055=>'L',
+1056=>'L',
+1057=>'L',
+1058=>'L',
+1059=>'L',
+1060=>'L',
+1061=>'L',
+1062=>'L',
+1063=>'L',
+1064=>'L',
+1065=>'L',
+1066=>'L',
+1067=>'L',
+1068=>'L',
+1069=>'L',
+1070=>'L',
+1071=>'L',
+1072=>'L',
+1073=>'L',
+1074=>'L',
+1075=>'L',
+1076=>'L',
+1077=>'L',
+1078=>'L',
+1079=>'L',
+1080=>'L',
+1081=>'L',
+1082=>'L',
+1083=>'L',
+1084=>'L',
+1085=>'L',
+1086=>'L',
+1087=>'L',
+1088=>'L',
+1089=>'L',
+1090=>'L',
+1091=>'L',
+1092=>'L',
+1093=>'L',
+1094=>'L',
+1095=>'L',
+1096=>'L',
+1097=>'L',
+1098=>'L',
+1099=>'L',
+1100=>'L',
+1101=>'L',
+1102=>'L',
+1103=>'L',
+1104=>'L',
+1105=>'L',
+1106=>'L',
+1107=>'L',
+1108=>'L',
+1109=>'L',
+1110=>'L',
+1111=>'L',
+1112=>'L',
+1113=>'L',
+1114=>'L',
+1115=>'L',
+1116=>'L',
+1117=>'L',
+1118=>'L',
+1119=>'L',
+1120=>'L',
+1121=>'L',
+1122=>'L',
+1123=>'L',
+1124=>'L',
+1125=>'L',
+1126=>'L',
+1127=>'L',
+1128=>'L',
+1129=>'L',
+1130=>'L',
+1131=>'L',
+1132=>'L',
+1133=>'L',
+1134=>'L',
+1135=>'L',
+1136=>'L',
+1137=>'L',
+1138=>'L',
+1139=>'L',
+1140=>'L',
+1141=>'L',
+1142=>'L',
+1143=>'L',
+1144=>'L',
+1145=>'L',
+1146=>'L',
+1147=>'L',
+1148=>'L',
+1149=>'L',
+1150=>'L',
+1151=>'L',
+1152=>'L',
+1153=>'L',
+1154=>'L',
+1155=>'NSM',
+1156=>'NSM',
+1157=>'NSM',
+1158=>'NSM',
+1160=>'NSM',
+1161=>'NSM',
+1162=>'L',
+1163=>'L',
+1164=>'L',
+1165=>'L',
+1166=>'L',
+1167=>'L',
+1168=>'L',
+1169=>'L',
+1170=>'L',
+1171=>'L',
+1172=>'L',
+1173=>'L',
+1174=>'L',
+1175=>'L',
+1176=>'L',
+1177=>'L',
+1178=>'L',
+1179=>'L',
+1180=>'L',
+1181=>'L',
+1182=>'L',
+1183=>'L',
+1184=>'L',
+1185=>'L',
+1186=>'L',
+1187=>'L',
+1188=>'L',
+1189=>'L',
+1190=>'L',
+1191=>'L',
+1192=>'L',
+1193=>'L',
+1194=>'L',
+1195=>'L',
+1196=>'L',
+1197=>'L',
+1198=>'L',
+1199=>'L',
+1200=>'L',
+1201=>'L',
+1202=>'L',
+1203=>'L',
+1204=>'L',
+1205=>'L',
+1206=>'L',
+1207=>'L',
+1208=>'L',
+1209=>'L',
+1210=>'L',
+1211=>'L',
+1212=>'L',
+1213=>'L',
+1214=>'L',
+1215=>'L',
+1216=>'L',
+1217=>'L',
+1218=>'L',
+1219=>'L',
+1220=>'L',
+1221=>'L',
+1222=>'L',
+1223=>'L',
+1224=>'L',
+1225=>'L',
+1226=>'L',
+1227=>'L',
+1228=>'L',
+1229=>'L',
+1230=>'L',
+1231=>'L',
+1232=>'L',
+1233=>'L',
+1234=>'L',
+1235=>'L',
+1236=>'L',
+1237=>'L',
+1238=>'L',
+1239=>'L',
+1240=>'L',
+1241=>'L',
+1242=>'L',
+1243=>'L',
+1244=>'L',
+1245=>'L',
+1246=>'L',
+1247=>'L',
+1248=>'L',
+1249=>'L',
+1250=>'L',
+1251=>'L',
+1252=>'L',
+1253=>'L',
+1254=>'L',
+1255=>'L',
+1256=>'L',
+1257=>'L',
+1258=>'L',
+1259=>'L',
+1260=>'L',
+1261=>'L',
+1262=>'L',
+1263=>'L',
+1264=>'L',
+1265=>'L',
+1266=>'L',
+1267=>'L',
+1268=>'L',
+1269=>'L',
+1270=>'L',
+1271=>'L',
+1272=>'L',
+1273=>'L',
+1274=>'L',
+1275=>'L',
+1276=>'L',
+1277=>'L',
+1278=>'L',
+1279=>'L',
+1280=>'L',
+1281=>'L',
+1282=>'L',
+1283=>'L',
+1284=>'L',
+1285=>'L',
+1286=>'L',
+1287=>'L',
+1288=>'L',
+1289=>'L',
+1290=>'L',
+1291=>'L',
+1292=>'L',
+1293=>'L',
+1294=>'L',
+1295=>'L',
+1296=>'L',
+1297=>'L',
+1298=>'L',
+1299=>'L',
+1329=>'L',
+1330=>'L',
+1331=>'L',
+1332=>'L',
+1333=>'L',
+1334=>'L',
+1335=>'L',
+1336=>'L',
+1337=>'L',
+1338=>'L',
+1339=>'L',
+1340=>'L',
+1341=>'L',
+1342=>'L',
+1343=>'L',
+1344=>'L',
+1345=>'L',
+1346=>'L',
+1347=>'L',
+1348=>'L',
+1349=>'L',
+1350=>'L',
+1351=>'L',
+1352=>'L',
+1353=>'L',
+1354=>'L',
+1355=>'L',
+1356=>'L',
+1357=>'L',
+1358=>'L',
+1359=>'L',
+1360=>'L',
+1361=>'L',
+1362=>'L',
+1363=>'L',
+1364=>'L',
+1365=>'L',
+1366=>'L',
+1369=>'L',
+1370=>'L',
+1371=>'L',
+1372=>'L',
+1373=>'L',
+1374=>'L',
+1375=>'L',
+1377=>'L',
+1378=>'L',
+1379=>'L',
+1380=>'L',
+1381=>'L',
+1382=>'L',
+1383=>'L',
+1384=>'L',
+1385=>'L',
+1386=>'L',
+1387=>'L',
+1388=>'L',
+1389=>'L',
+1390=>'L',
+1391=>'L',
+1392=>'L',
+1393=>'L',
+1394=>'L',
+1395=>'L',
+1396=>'L',
+1397=>'L',
+1398=>'L',
+1399=>'L',
+1400=>'L',
+1401=>'L',
+1402=>'L',
+1403=>'L',
+1404=>'L',
+1405=>'L',
+1406=>'L',
+1407=>'L',
+1408=>'L',
+1409=>'L',
+1410=>'L',
+1411=>'L',
+1412=>'L',
+1413=>'L',
+1414=>'L',
+1415=>'L',
+1417=>'L',
+1418=>'ON',
+1425=>'NSM',
+1426=>'NSM',
+1427=>'NSM',
+1428=>'NSM',
+1429=>'NSM',
+1430=>'NSM',
+1431=>'NSM',
+1432=>'NSM',
+1433=>'NSM',
+1434=>'NSM',
+1435=>'NSM',
+1436=>'NSM',
+1437=>'NSM',
+1438=>'NSM',
+1439=>'NSM',
+1440=>'NSM',
+1441=>'NSM',
+1442=>'NSM',
+1443=>'NSM',
+1444=>'NSM',
+1445=>'NSM',
+1446=>'NSM',
+1447=>'NSM',
+1448=>'NSM',
+1449=>'NSM',
+1450=>'NSM',
+1451=>'NSM',
+1452=>'NSM',
+1453=>'NSM',
+1454=>'NSM',
+1455=>'NSM',
+1456=>'NSM',
+1457=>'NSM',
+1458=>'NSM',
+1459=>'NSM',
+1460=>'NSM',
+1461=>'NSM',
+1462=>'NSM',
+1463=>'NSM',
+1464=>'NSM',
+1465=>'NSM',
+1466=>'NSM',
+1467=>'NSM',
+1468=>'NSM',
+1469=>'NSM',
+1470=>'R',
+1471=>'NSM',
+1472=>'R',
+1473=>'NSM',
+1474=>'NSM',
+1475=>'R',
+1476=>'NSM',
+1477=>'NSM',
+1478=>'R',
+1479=>'NSM',
+1488=>'R',
+1489=>'R',
+1490=>'R',
+1491=>'R',
+1492=>'R',
+1493=>'R',
+1494=>'R',
+1495=>'R',
+1496=>'R',
+1497=>'R',
+1498=>'R',
+1499=>'R',
+1500=>'R',
+1501=>'R',
+1502=>'R',
+1503=>'R',
+1504=>'R',
+1505=>'R',
+1506=>'R',
+1507=>'R',
+1508=>'R',
+1509=>'R',
+1510=>'R',
+1511=>'R',
+1512=>'R',
+1513=>'R',
+1514=>'R',
+1520=>'R',
+1521=>'R',
+1522=>'R',
+1523=>'R',
+1524=>'R',
+1536=>'AL',
+1537=>'AL',
+1538=>'AL',
+1539=>'AL',
+1547=>'AL',
+1548=>'CS',
+1549=>'AL',
+1550=>'ON',
+1551=>'ON',
+1552=>'NSM',
+1553=>'NSM',
+1554=>'NSM',
+1555=>'NSM',
+1556=>'NSM',
+1557=>'NSM',
+1563=>'AL',
+1566=>'AL',
+1567=>'AL',
+1569=>'AL',
+1570=>'AL',
+1571=>'AL',
+1572=>'AL',
+1573=>'AL',
+1574=>'AL',
+1575=>'AL',
+1576=>'AL',
+1577=>'AL',
+1578=>'AL',
+1579=>'AL',
+1580=>'AL',
+1581=>'AL',
+1582=>'AL',
+1583=>'AL',
+1584=>'AL',
+1585=>'AL',
+1586=>'AL',
+1587=>'AL',
+1588=>'AL',
+1589=>'AL',
+1590=>'AL',
+1591=>'AL',
+1592=>'AL',
+1593=>'AL',
+1594=>'AL',
+1600=>'AL',
+1601=>'AL',
+1602=>'AL',
+1603=>'AL',
+1604=>'AL',
+1605=>'AL',
+1606=>'AL',
+1607=>'AL',
+1608=>'AL',
+1609=>'AL',
+1610=>'AL',
+1611=>'NSM',
+1612=>'NSM',
+1613=>'NSM',
+1614=>'NSM',
+1615=>'NSM',
+1616=>'NSM',
+1617=>'NSM',
+1618=>'NSM',
+1619=>'NSM',
+1620=>'NSM',
+1621=>'NSM',
+1622=>'NSM',
+1623=>'NSM',
+1624=>'NSM',
+1625=>'NSM',
+1626=>'NSM',
+1627=>'NSM',
+1628=>'NSM',
+1629=>'NSM',
+1630=>'NSM',
+1632=>'AN',
+1633=>'AN',
+1634=>'AN',
+1635=>'AN',
+1636=>'AN',
+1637=>'AN',
+1638=>'AN',
+1639=>'AN',
+1640=>'AN',
+1641=>'AN',
+1642=>'ET',
+1643=>'AN',
+1644=>'AN',
+1645=>'AL',
+1646=>'AL',
+1647=>'AL',
+1648=>'NSM',
+1649=>'AL',
+1650=>'AL',
+1651=>'AL',
+1652=>'AL',
+1653=>'AL',
+1654=>'AL',
+1655=>'AL',
+1656=>'AL',
+1657=>'AL',
+1658=>'AL',
+1659=>'AL',
+1660=>'AL',
+1661=>'AL',
+1662=>'AL',
+1663=>'AL',
+1664=>'AL',
+1665=>'AL',
+1666=>'AL',
+1667=>'AL',
+1668=>'AL',
+1669=>'AL',
+1670=>'AL',
+1671=>'AL',
+1672=>'AL',
+1673=>'AL',
+1674=>'AL',
+1675=>'AL',
+1676=>'AL',
+1677=>'AL',
+1678=>'AL',
+1679=>'AL',
+1680=>'AL',
+1681=>'AL',
+1682=>'AL',
+1683=>'AL',
+1684=>'AL',
+1685=>'AL',
+1686=>'AL',
+1687=>'AL',
+1688=>'AL',
+1689=>'AL',
+1690=>'AL',
+1691=>'AL',
+1692=>'AL',
+1693=>'AL',
+1694=>'AL',
+1695=>'AL',
+1696=>'AL',
+1697=>'AL',
+1698=>'AL',
+1699=>'AL',
+1700=>'AL',
+1701=>'AL',
+1702=>'AL',
+1703=>'AL',
+1704=>'AL',
+1705=>'AL',
+1706=>'AL',
+1707=>'AL',
+1708=>'AL',
+1709=>'AL',
+1710=>'AL',
+1711=>'AL',
+1712=>'AL',
+1713=>'AL',
+1714=>'AL',
+1715=>'AL',
+1716=>'AL',
+1717=>'AL',
+1718=>'AL',
+1719=>'AL',
+1720=>'AL',
+1721=>'AL',
+1722=>'AL',
+1723=>'AL',
+1724=>'AL',
+1725=>'AL',
+1726=>'AL',
+1727=>'AL',
+1728=>'AL',
+1729=>'AL',
+1730=>'AL',
+1731=>'AL',
+1732=>'AL',
+1733=>'AL',
+1734=>'AL',
+1735=>'AL',
+1736=>'AL',
+1737=>'AL',
+1738=>'AL',
+1739=>'AL',
+1740=>'AL',
+1741=>'AL',
+1742=>'AL',
+1743=>'AL',
+1744=>'AL',
+1745=>'AL',
+1746=>'AL',
+1747=>'AL',
+1748=>'AL',
+1749=>'AL',
+1750=>'NSM',
+1751=>'NSM',
+1752=>'NSM',
+1753=>'NSM',
+1754=>'NSM',
+1755=>'NSM',
+1756=>'NSM',
+1757=>'AL',
+1758=>'NSM',
+1759=>'NSM',
+1760=>'NSM',
+1761=>'NSM',
+1762=>'NSM',
+1763=>'NSM',
+1764=>'NSM',
+1765=>'AL',
+1766=>'AL',
+1767=>'NSM',
+1768=>'NSM',
+1769=>'ON',
+1770=>'NSM',
+1771=>'NSM',
+1772=>'NSM',
+1773=>'NSM',
+1774=>'AL',
+1775=>'AL',
+1776=>'EN',
+1777=>'EN',
+1778=>'EN',
+1779=>'EN',
+1780=>'EN',
+1781=>'EN',
+1782=>'EN',
+1783=>'EN',
+1784=>'EN',
+1785=>'EN',
+1786=>'AL',
+1787=>'AL',
+1788=>'AL',
+1789=>'AL',
+1790=>'AL',
+1791=>'AL',
+1792=>'AL',
+1793=>'AL',
+1794=>'AL',
+1795=>'AL',
+1796=>'AL',
+1797=>'AL',
+1798=>'AL',
+1799=>'AL',
+1800=>'AL',
+1801=>'AL',
+1802=>'AL',
+1803=>'AL',
+1804=>'AL',
+1805=>'AL',
+1807=>'BN',
+1808=>'AL',
+1809=>'NSM',
+1810=>'AL',
+1811=>'AL',
+1812=>'AL',
+1813=>'AL',
+1814=>'AL',
+1815=>'AL',
+1816=>'AL',
+1817=>'AL',
+1818=>'AL',
+1819=>'AL',
+1820=>'AL',
+1821=>'AL',
+1822=>'AL',
+1823=>'AL',
+1824=>'AL',
+1825=>'AL',
+1826=>'AL',
+1827=>'AL',
+1828=>'AL',
+1829=>'AL',
+1830=>'AL',
+1831=>'AL',
+1832=>'AL',
+1833=>'AL',
+1834=>'AL',
+1835=>'AL',
+1836=>'AL',
+1837=>'AL',
+1838=>'AL',
+1839=>'AL',
+1840=>'NSM',
+1841=>'NSM',
+1842=>'NSM',
+1843=>'NSM',
+1844=>'NSM',
+1845=>'NSM',
+1846=>'NSM',
+1847=>'NSM',
+1848=>'NSM',
+1849=>'NSM',
+1850=>'NSM',
+1851=>'NSM',
+1852=>'NSM',
+1853=>'NSM',
+1854=>'NSM',
+1855=>'NSM',
+1856=>'NSM',
+1857=>'NSM',
+1858=>'NSM',
+1859=>'NSM',
+1860=>'NSM',
+1861=>'NSM',
+1862=>'NSM',
+1863=>'NSM',
+1864=>'NSM',
+1865=>'NSM',
+1866=>'NSM',
+1869=>'AL',
+1870=>'AL',
+1871=>'AL',
+1872=>'AL',
+1873=>'AL',
+1874=>'AL',
+1875=>'AL',
+1876=>'AL',
+1877=>'AL',
+1878=>'AL',
+1879=>'AL',
+1880=>'AL',
+1881=>'AL',
+1882=>'AL',
+1883=>'AL',
+1884=>'AL',
+1885=>'AL',
+1886=>'AL',
+1887=>'AL',
+1888=>'AL',
+1889=>'AL',
+1890=>'AL',
+1891=>'AL',
+1892=>'AL',
+1893=>'AL',
+1894=>'AL',
+1895=>'AL',
+1896=>'AL',
+1897=>'AL',
+1898=>'AL',
+1899=>'AL',
+1900=>'AL',
+1901=>'AL',
+1920=>'AL',
+1921=>'AL',
+1922=>'AL',
+1923=>'AL',
+1924=>'AL',
+1925=>'AL',
+1926=>'AL',
+1927=>'AL',
+1928=>'AL',
+1929=>'AL',
+1930=>'AL',
+1931=>'AL',
+1932=>'AL',
+1933=>'AL',
+1934=>'AL',
+1935=>'AL',
+1936=>'AL',
+1937=>'AL',
+1938=>'AL',
+1939=>'AL',
+1940=>'AL',
+1941=>'AL',
+1942=>'AL',
+1943=>'AL',
+1944=>'AL',
+1945=>'AL',
+1946=>'AL',
+1947=>'AL',
+1948=>'AL',
+1949=>'AL',
+1950=>'AL',
+1951=>'AL',
+1952=>'AL',
+1953=>'AL',
+1954=>'AL',
+1955=>'AL',
+1956=>'AL',
+1957=>'AL',
+1958=>'NSM',
+1959=>'NSM',
+1960=>'NSM',
+1961=>'NSM',
+1962=>'NSM',
+1963=>'NSM',
+1964=>'NSM',
+1965=>'NSM',
+1966=>'NSM',
+1967=>'NSM',
+1968=>'NSM',
+1969=>'AL',
+1984=>'R',
+1985=>'R',
+1986=>'R',
+1987=>'R',
+1988=>'R',
+1989=>'R',
+1990=>'R',
+1991=>'R',
+1992=>'R',
+1993=>'R',
+1994=>'R',
+1995=>'R',
+1996=>'R',
+1997=>'R',
+1998=>'R',
+1999=>'R',
+2000=>'R',
+2001=>'R',
+2002=>'R',
+2003=>'R',
+2004=>'R',
+2005=>'R',
+2006=>'R',
+2007=>'R',
+2008=>'R',
+2009=>'R',
+2010=>'R',
+2011=>'R',
+2012=>'R',
+2013=>'R',
+2014=>'R',
+2015=>'R',
+2016=>'R',
+2017=>'R',
+2018=>'R',
+2019=>'R',
+2020=>'R',
+2021=>'R',
+2022=>'R',
+2023=>'R',
+2024=>'R',
+2025=>'R',
+2026=>'R',
+2027=>'NSM',
+2028=>'NSM',
+2029=>'NSM',
+2030=>'NSM',
+2031=>'NSM',
+2032=>'NSM',
+2033=>'NSM',
+2034=>'NSM',
+2035=>'NSM',
+2036=>'R',
+2037=>'R',
+2038=>'ON',
+2039=>'ON',
+2040=>'ON',
+2041=>'ON',
+2042=>'R',
+2305=>'NSM',
+2306=>'NSM',
+2307=>'L',
+2308=>'L',
+2309=>'L',
+2310=>'L',
+2311=>'L',
+2312=>'L',
+2313=>'L',
+2314=>'L',
+2315=>'L',
+2316=>'L',
+2317=>'L',
+2318=>'L',
+2319=>'L',
+2320=>'L',
+2321=>'L',
+2322=>'L',
+2323=>'L',
+2324=>'L',
+2325=>'L',
+2326=>'L',
+2327=>'L',
+2328=>'L',
+2329=>'L',
+2330=>'L',
+2331=>'L',
+2332=>'L',
+2333=>'L',
+2334=>'L',
+2335=>'L',
+2336=>'L',
+2337=>'L',
+2338=>'L',
+2339=>'L',
+2340=>'L',
+2341=>'L',
+2342=>'L',
+2343=>'L',
+2344=>'L',
+2345=>'L',
+2346=>'L',
+2347=>'L',
+2348=>'L',
+2349=>'L',
+2350=>'L',
+2351=>'L',
+2352=>'L',
+2353=>'L',
+2354=>'L',
+2355=>'L',
+2356=>'L',
+2357=>'L',
+2358=>'L',
+2359=>'L',
+2360=>'L',
+2361=>'L',
+2364=>'NSM',
+2365=>'L',
+2366=>'L',
+2367=>'L',
+2368=>'L',
+2369=>'NSM',
+2370=>'NSM',
+2371=>'NSM',
+2372=>'NSM',
+2373=>'NSM',
+2374=>'NSM',
+2375=>'NSM',
+2376=>'NSM',
+2377=>'L',
+2378=>'L',
+2379=>'L',
+2380=>'L',
+2381=>'NSM',
+2384=>'L',
+2385=>'NSM',
+2386=>'NSM',
+2387=>'NSM',
+2388=>'NSM',
+2392=>'L',
+2393=>'L',
+2394=>'L',
+2395=>'L',
+2396=>'L',
+2397=>'L',
+2398=>'L',
+2399=>'L',
+2400=>'L',
+2401=>'L',
+2402=>'NSM',
+2403=>'NSM',
+2404=>'L',
+2405=>'L',
+2406=>'L',
+2407=>'L',
+2408=>'L',
+2409=>'L',
+2410=>'L',
+2411=>'L',
+2412=>'L',
+2413=>'L',
+2414=>'L',
+2415=>'L',
+2416=>'L',
+2427=>'L',
+2428=>'L',
+2429=>'L',
+2430=>'L',
+2431=>'L',
+2433=>'NSM',
+2434=>'L',
+2435=>'L',
+2437=>'L',
+2438=>'L',
+2439=>'L',
+2440=>'L',
+2441=>'L',
+2442=>'L',
+2443=>'L',
+2444=>'L',
+2447=>'L',
+2448=>'L',
+2451=>'L',
+2452=>'L',
+2453=>'L',
+2454=>'L',
+2455=>'L',
+2456=>'L',
+2457=>'L',
+2458=>'L',
+2459=>'L',
+2460=>'L',
+2461=>'L',
+2462=>'L',
+2463=>'L',
+2464=>'L',
+2465=>'L',
+2466=>'L',
+2467=>'L',
+2468=>'L',
+2469=>'L',
+2470=>'L',
+2471=>'L',
+2472=>'L',
+2474=>'L',
+2475=>'L',
+2476=>'L',
+2477=>'L',
+2478=>'L',
+2479=>'L',
+2480=>'L',
+2482=>'L',
+2486=>'L',
+2487=>'L',
+2488=>'L',
+2489=>'L',
+2492=>'NSM',
+2493=>'L',
+2494=>'L',
+2495=>'L',
+2496=>'L',
+2497=>'NSM',
+2498=>'NSM',
+2499=>'NSM',
+2500=>'NSM',
+2503=>'L',
+2504=>'L',
+2507=>'L',
+2508=>'L',
+2509=>'NSM',
+2510=>'L',
+2519=>'L',
+2524=>'L',
+2525=>'L',
+2527=>'L',
+2528=>'L',
+2529=>'L',
+2530=>'NSM',
+2531=>'NSM',
+2534=>'L',
+2535=>'L',
+2536=>'L',
+2537=>'L',
+2538=>'L',
+2539=>'L',
+2540=>'L',
+2541=>'L',
+2542=>'L',
+2543=>'L',
+2544=>'L',
+2545=>'L',
+2546=>'ET',
+2547=>'ET',
+2548=>'L',
+2549=>'L',
+2550=>'L',
+2551=>'L',
+2552=>'L',
+2553=>'L',
+2554=>'L',
+2561=>'NSM',
+2562=>'NSM',
+2563=>'L',
+2565=>'L',
+2566=>'L',
+2567=>'L',
+2568=>'L',
+2569=>'L',
+2570=>'L',
+2575=>'L',
+2576=>'L',
+2579=>'L',
+2580=>'L',
+2581=>'L',
+2582=>'L',
+2583=>'L',
+2584=>'L',
+2585=>'L',
+2586=>'L',
+2587=>'L',
+2588=>'L',
+2589=>'L',
+2590=>'L',
+2591=>'L',
+2592=>'L',
+2593=>'L',
+2594=>'L',
+2595=>'L',
+2596=>'L',
+2597=>'L',
+2598=>'L',
+2599=>'L',
+2600=>'L',
+2602=>'L',
+2603=>'L',
+2604=>'L',
+2605=>'L',
+2606=>'L',
+2607=>'L',
+2608=>'L',
+2610=>'L',
+2611=>'L',
+2613=>'L',
+2614=>'L',
+2616=>'L',
+2617=>'L',
+2620=>'NSM',
+2622=>'L',
+2623=>'L',
+2624=>'L',
+2625=>'NSM',
+2626=>'NSM',
+2631=>'NSM',
+2632=>'NSM',
+2635=>'NSM',
+2636=>'NSM',
+2637=>'NSM',
+2649=>'L',
+2650=>'L',
+2651=>'L',
+2652=>'L',
+2654=>'L',
+2662=>'L',
+2663=>'L',
+2664=>'L',
+2665=>'L',
+2666=>'L',
+2667=>'L',
+2668=>'L',
+2669=>'L',
+2670=>'L',
+2671=>'L',
+2672=>'NSM',
+2673=>'NSM',
+2674=>'L',
+2675=>'L',
+2676=>'L',
+2689=>'NSM',
+2690=>'NSM',
+2691=>'L',
+2693=>'L',
+2694=>'L',
+2695=>'L',
+2696=>'L',
+2697=>'L',
+2698=>'L',
+2699=>'L',
+2700=>'L',
+2701=>'L',
+2703=>'L',
+2704=>'L',
+2705=>'L',
+2707=>'L',
+2708=>'L',
+2709=>'L',
+2710=>'L',
+2711=>'L',
+2712=>'L',
+2713=>'L',
+2714=>'L',
+2715=>'L',
+2716=>'L',
+2717=>'L',
+2718=>'L',
+2719=>'L',
+2720=>'L',
+2721=>'L',
+2722=>'L',
+2723=>'L',
+2724=>'L',
+2725=>'L',
+2726=>'L',
+2727=>'L',
+2728=>'L',
+2730=>'L',
+2731=>'L',
+2732=>'L',
+2733=>'L',
+2734=>'L',
+2735=>'L',
+2736=>'L',
+2738=>'L',
+2739=>'L',
+2741=>'L',
+2742=>'L',
+2743=>'L',
+2744=>'L',
+2745=>'L',
+2748=>'NSM',
+2749=>'L',
+2750=>'L',
+2751=>'L',
+2752=>'L',
+2753=>'NSM',
+2754=>'NSM',
+2755=>'NSM',
+2756=>'NSM',
+2757=>'NSM',
+2759=>'NSM',
+2760=>'NSM',
+2761=>'L',
+2763=>'L',
+2764=>'L',
+2765=>'NSM',
+2768=>'L',
+2784=>'L',
+2785=>'L',
+2786=>'NSM',
+2787=>'NSM',
+2790=>'L',
+2791=>'L',
+2792=>'L',
+2793=>'L',
+2794=>'L',
+2795=>'L',
+2796=>'L',
+2797=>'L',
+2798=>'L',
+2799=>'L',
+2801=>'ET',
+2817=>'NSM',
+2818=>'L',
+2819=>'L',
+2821=>'L',
+2822=>'L',
+2823=>'L',
+2824=>'L',
+2825=>'L',
+2826=>'L',
+2827=>'L',
+2828=>'L',
+2831=>'L',
+2832=>'L',
+2835=>'L',
+2836=>'L',
+2837=>'L',
+2838=>'L',
+2839=>'L',
+2840=>'L',
+2841=>'L',
+2842=>'L',
+2843=>'L',
+2844=>'L',
+2845=>'L',
+2846=>'L',
+2847=>'L',
+2848=>'L',
+2849=>'L',
+2850=>'L',
+2851=>'L',
+2852=>'L',
+2853=>'L',
+2854=>'L',
+2855=>'L',
+2856=>'L',
+2858=>'L',
+2859=>'L',
+2860=>'L',
+2861=>'L',
+2862=>'L',
+2863=>'L',
+2864=>'L',
+2866=>'L',
+2867=>'L',
+2869=>'L',
+2870=>'L',
+2871=>'L',
+2872=>'L',
+2873=>'L',
+2876=>'NSM',
+2877=>'L',
+2878=>'L',
+2879=>'NSM',
+2880=>'L',
+2881=>'NSM',
+2882=>'NSM',
+2883=>'NSM',
+2887=>'L',
+2888=>'L',
+2891=>'L',
+2892=>'L',
+2893=>'NSM',
+2902=>'NSM',
+2903=>'L',
+2908=>'L',
+2909=>'L',
+2911=>'L',
+2912=>'L',
+2913=>'L',
+2918=>'L',
+2919=>'L',
+2920=>'L',
+2921=>'L',
+2922=>'L',
+2923=>'L',
+2924=>'L',
+2925=>'L',
+2926=>'L',
+2927=>'L',
+2928=>'L',
+2929=>'L',
+2946=>'NSM',
+2947=>'L',
+2949=>'L',
+2950=>'L',
+2951=>'L',
+2952=>'L',
+2953=>'L',
+2954=>'L',
+2958=>'L',
+2959=>'L',
+2960=>'L',
+2962=>'L',
+2963=>'L',
+2964=>'L',
+2965=>'L',
+2969=>'L',
+2970=>'L',
+2972=>'L',
+2974=>'L',
+2975=>'L',
+2979=>'L',
+2980=>'L',
+2984=>'L',
+2985=>'L',
+2986=>'L',
+2990=>'L',
+2991=>'L',
+2992=>'L',
+2993=>'L',
+2994=>'L',
+2995=>'L',
+2996=>'L',
+2997=>'L',
+2998=>'L',
+2999=>'L',
+3000=>'L',
+3001=>'L',
+3006=>'L',
+3007=>'L',
+3008=>'NSM',
+3009=>'L',
+3010=>'L',
+3014=>'L',
+3015=>'L',
+3016=>'L',
+3018=>'L',
+3019=>'L',
+3020=>'L',
+3021=>'NSM',
+3031=>'L',
+3046=>'L',
+3047=>'L',
+3048=>'L',
+3049=>'L',
+3050=>'L',
+3051=>'L',
+3052=>'L',
+3053=>'L',
+3054=>'L',
+3055=>'L',
+3056=>'L',
+3057=>'L',
+3058=>'L',
+3059=>'ON',
+3060=>'ON',
+3061=>'ON',
+3062=>'ON',
+3063=>'ON',
+3064=>'ON',
+3065=>'ET',
+3066=>'ON',
+3073=>'L',
+3074=>'L',
+3075=>'L',
+3077=>'L',
+3078=>'L',
+3079=>'L',
+3080=>'L',
+3081=>'L',
+3082=>'L',
+3083=>'L',
+3084=>'L',
+3086=>'L',
+3087=>'L',
+3088=>'L',
+3090=>'L',
+3091=>'L',
+3092=>'L',
+3093=>'L',
+3094=>'L',
+3095=>'L',
+3096=>'L',
+3097=>'L',
+3098=>'L',
+3099=>'L',
+3100=>'L',
+3101=>'L',
+3102=>'L',
+3103=>'L',
+3104=>'L',
+3105=>'L',
+3106=>'L',
+3107=>'L',
+3108=>'L',
+3109=>'L',
+3110=>'L',
+3111=>'L',
+3112=>'L',
+3114=>'L',
+3115=>'L',
+3116=>'L',
+3117=>'L',
+3118=>'L',
+3119=>'L',
+3120=>'L',
+3121=>'L',
+3122=>'L',
+3123=>'L',
+3125=>'L',
+3126=>'L',
+3127=>'L',
+3128=>'L',
+3129=>'L',
+3134=>'NSM',
+3135=>'NSM',
+3136=>'NSM',
+3137=>'L',
+3138=>'L',
+3139=>'L',
+3140=>'L',
+3142=>'NSM',
+3143=>'NSM',
+3144=>'NSM',
+3146=>'NSM',
+3147=>'NSM',
+3148=>'NSM',
+3149=>'NSM',
+3157=>'NSM',
+3158=>'NSM',
+3168=>'L',
+3169=>'L',
+3174=>'L',
+3175=>'L',
+3176=>'L',
+3177=>'L',
+3178=>'L',
+3179=>'L',
+3180=>'L',
+3181=>'L',
+3182=>'L',
+3183=>'L',
+3202=>'L',
+3203=>'L',
+3205=>'L',
+3206=>'L',
+3207=>'L',
+3208=>'L',
+3209=>'L',
+3210=>'L',
+3211=>'L',
+3212=>'L',
+3214=>'L',
+3215=>'L',
+3216=>'L',
+3218=>'L',
+3219=>'L',
+3220=>'L',
+3221=>'L',
+3222=>'L',
+3223=>'L',
+3224=>'L',
+3225=>'L',
+3226=>'L',
+3227=>'L',
+3228=>'L',
+3229=>'L',
+3230=>'L',
+3231=>'L',
+3232=>'L',
+3233=>'L',
+3234=>'L',
+3235=>'L',
+3236=>'L',
+3237=>'L',
+3238=>'L',
+3239=>'L',
+3240=>'L',
+3242=>'L',
+3243=>'L',
+3244=>'L',
+3245=>'L',
+3246=>'L',
+3247=>'L',
+3248=>'L',
+3249=>'L',
+3250=>'L',
+3251=>'L',
+3253=>'L',
+3254=>'L',
+3255=>'L',
+3256=>'L',
+3257=>'L',
+3260=>'NSM',
+3261=>'L',
+3262=>'L',
+3263=>'L',
+3264=>'L',
+3265=>'L',
+3266=>'L',
+3267=>'L',
+3268=>'L',
+3270=>'L',
+3271=>'L',
+3272=>'L',
+3274=>'L',
+3275=>'L',
+3276=>'NSM',
+3277=>'NSM',
+3285=>'L',
+3286=>'L',
+3294=>'L',
+3296=>'L',
+3297=>'L',
+3298=>'NSM',
+3299=>'NSM',
+3302=>'L',
+3303=>'L',
+3304=>'L',
+3305=>'L',
+3306=>'L',
+3307=>'L',
+3308=>'L',
+3309=>'L',
+3310=>'L',
+3311=>'L',
+3313=>'ON',
+3314=>'ON',
+3330=>'L',
+3331=>'L',
+3333=>'L',
+3334=>'L',
+3335=>'L',
+3336=>'L',
+3337=>'L',
+3338=>'L',
+3339=>'L',
+3340=>'L',
+3342=>'L',
+3343=>'L',
+3344=>'L',
+3346=>'L',
+3347=>'L',
+3348=>'L',
+3349=>'L',
+3350=>'L',
+3351=>'L',
+3352=>'L',
+3353=>'L',
+3354=>'L',
+3355=>'L',
+3356=>'L',
+3357=>'L',
+3358=>'L',
+3359=>'L',
+3360=>'L',
+3361=>'L',
+3362=>'L',
+3363=>'L',
+3364=>'L',
+3365=>'L',
+3366=>'L',
+3367=>'L',
+3368=>'L',
+3370=>'L',
+3371=>'L',
+3372=>'L',
+3373=>'L',
+3374=>'L',
+3375=>'L',
+3376=>'L',
+3377=>'L',
+3378=>'L',
+3379=>'L',
+3380=>'L',
+3381=>'L',
+3382=>'L',
+3383=>'L',
+3384=>'L',
+3385=>'L',
+3390=>'L',
+3391=>'L',
+3392=>'L',
+3393=>'NSM',
+3394=>'NSM',
+3395=>'NSM',
+3398=>'L',
+3399=>'L',
+3400=>'L',
+3402=>'L',
+3403=>'L',
+3404=>'L',
+3405=>'NSM',
+3415=>'L',
+3424=>'L',
+3425=>'L',
+3430=>'L',
+3431=>'L',
+3432=>'L',
+3433=>'L',
+3434=>'L',
+3435=>'L',
+3436=>'L',
+3437=>'L',
+3438=>'L',
+3439=>'L',
+3458=>'L',
+3459=>'L',
+3461=>'L',
+3462=>'L',
+3463=>'L',
+3464=>'L',
+3465=>'L',
+3466=>'L',
+3467=>'L',
+3468=>'L',
+3469=>'L',
+3470=>'L',
+3471=>'L',
+3472=>'L',
+3473=>'L',
+3474=>'L',
+3475=>'L',
+3476=>'L',
+3477=>'L',
+3478=>'L',
+3482=>'L',
+3483=>'L',
+3484=>'L',
+3485=>'L',
+3486=>'L',
+3487=>'L',
+3488=>'L',
+3489=>'L',
+3490=>'L',
+3491=>'L',
+3492=>'L',
+3493=>'L',
+3494=>'L',
+3495=>'L',
+3496=>'L',
+3497=>'L',
+3498=>'L',
+3499=>'L',
+3500=>'L',
+3501=>'L',
+3502=>'L',
+3503=>'L',
+3504=>'L',
+3505=>'L',
+3507=>'L',
+3508=>'L',
+3509=>'L',
+3510=>'L',
+3511=>'L',
+3512=>'L',
+3513=>'L',
+3514=>'L',
+3515=>'L',
+3517=>'L',
+3520=>'L',
+3521=>'L',
+3522=>'L',
+3523=>'L',
+3524=>'L',
+3525=>'L',
+3526=>'L',
+3530=>'NSM',
+3535=>'L',
+3536=>'L',
+3537=>'L',
+3538=>'NSM',
+3539=>'NSM',
+3540=>'NSM',
+3542=>'NSM',
+3544=>'L',
+3545=>'L',
+3546=>'L',
+3547=>'L',
+3548=>'L',
+3549=>'L',
+3550=>'L',
+3551=>'L',
+3570=>'L',
+3571=>'L',
+3572=>'L',
+3585=>'L',
+3586=>'L',
+3587=>'L',
+3588=>'L',
+3589=>'L',
+3590=>'L',
+3591=>'L',
+3592=>'L',
+3593=>'L',
+3594=>'L',
+3595=>'L',
+3596=>'L',
+3597=>'L',
+3598=>'L',
+3599=>'L',
+3600=>'L',
+3601=>'L',
+3602=>'L',
+3603=>'L',
+3604=>'L',
+3605=>'L',
+3606=>'L',
+3607=>'L',
+3608=>'L',
+3609=>'L',
+3610=>'L',
+3611=>'L',
+3612=>'L',
+3613=>'L',
+3614=>'L',
+3615=>'L',
+3616=>'L',
+3617=>'L',
+3618=>'L',
+3619=>'L',
+3620=>'L',
+3621=>'L',
+3622=>'L',
+3623=>'L',
+3624=>'L',
+3625=>'L',
+3626=>'L',
+3627=>'L',
+3628=>'L',
+3629=>'L',
+3630=>'L',
+3631=>'L',
+3632=>'L',
+3633=>'NSM',
+3634=>'L',
+3635=>'L',
+3636=>'NSM',
+3637=>'NSM',
+3638=>'NSM',
+3639=>'NSM',
+3640=>'NSM',
+3641=>'NSM',
+3642=>'NSM',
+3647=>'ET',
+3648=>'L',
+3649=>'L',
+3650=>'L',
+3651=>'L',
+3652=>'L',
+3653=>'L',
+3654=>'L',
+3655=>'NSM',
+3656=>'NSM',
+3657=>'NSM',
+3658=>'NSM',
+3659=>'NSM',
+3660=>'NSM',
+3661=>'NSM',
+3662=>'NSM',
+3663=>'L',
+3664=>'L',
+3665=>'L',
+3666=>'L',
+3667=>'L',
+3668=>'L',
+3669=>'L',
+3670=>'L',
+3671=>'L',
+3672=>'L',
+3673=>'L',
+3674=>'L',
+3675=>'L',
+3713=>'L',
+3714=>'L',
+3716=>'L',
+3719=>'L',
+3720=>'L',
+3722=>'L',
+3725=>'L',
+3732=>'L',
+3733=>'L',
+3734=>'L',
+3735=>'L',
+3737=>'L',
+3738=>'L',
+3739=>'L',
+3740=>'L',
+3741=>'L',
+3742=>'L',
+3743=>'L',
+3745=>'L',
+3746=>'L',
+3747=>'L',
+3749=>'L',
+3751=>'L',
+3754=>'L',
+3755=>'L',
+3757=>'L',
+3758=>'L',
+3759=>'L',
+3760=>'L',
+3761=>'NSM',
+3762=>'L',
+3763=>'L',
+3764=>'NSM',
+3765=>'NSM',
+3766=>'NSM',
+3767=>'NSM',
+3768=>'NSM',
+3769=>'NSM',
+3771=>'NSM',
+3772=>'NSM',
+3773=>'L',
+3776=>'L',
+3777=>'L',
+3778=>'L',
+3779=>'L',
+3780=>'L',
+3782=>'L',
+3784=>'NSM',
+3785=>'NSM',
+3786=>'NSM',
+3787=>'NSM',
+3788=>'NSM',
+3789=>'NSM',
+3792=>'L',
+3793=>'L',
+3794=>'L',
+3795=>'L',
+3796=>'L',
+3797=>'L',
+3798=>'L',
+3799=>'L',
+3800=>'L',
+3801=>'L',
+3804=>'L',
+3805=>'L',
+3840=>'L',
+3841=>'L',
+3842=>'L',
+3843=>'L',
+3844=>'L',
+3845=>'L',
+3846=>'L',
+3847=>'L',
+3848=>'L',
+3849=>'L',
+3850=>'L',
+3851=>'L',
+3852=>'L',
+3853=>'L',
+3854=>'L',
+3855=>'L',
+3856=>'L',
+3857=>'L',
+3858=>'L',
+3859=>'L',
+3860=>'L',
+3861=>'L',
+3862=>'L',
+3863=>'L',
+3864=>'NSM',
+3865=>'NSM',
+3866=>'L',
+3867=>'L',
+3868=>'L',
+3869=>'L',
+3870=>'L',
+3871=>'L',
+3872=>'L',
+3873=>'L',
+3874=>'L',
+3875=>'L',
+3876=>'L',
+3877=>'L',
+3878=>'L',
+3879=>'L',
+3880=>'L',
+3881=>'L',
+3882=>'L',
+3883=>'L',
+3884=>'L',
+3885=>'L',
+3886=>'L',
+3887=>'L',
+3888=>'L',
+3889=>'L',
+3890=>'L',
+3891=>'L',
+3892=>'L',
+3893=>'NSM',
+3894=>'L',
+3895=>'NSM',
+3896=>'L',
+3897=>'NSM',
+3898=>'ON',
+3899=>'ON',
+3900=>'ON',
+3901=>'ON',
+3902=>'L',
+3903=>'L',
+3904=>'L',
+3905=>'L',
+3906=>'L',
+3907=>'L',
+3908=>'L',
+3909=>'L',
+3910=>'L',
+3911=>'L',
+3913=>'L',
+3914=>'L',
+3915=>'L',
+3916=>'L',
+3917=>'L',
+3918=>'L',
+3919=>'L',
+3920=>'L',
+3921=>'L',
+3922=>'L',
+3923=>'L',
+3924=>'L',
+3925=>'L',
+3926=>'L',
+3927=>'L',
+3928=>'L',
+3929=>'L',
+3930=>'L',
+3931=>'L',
+3932=>'L',
+3933=>'L',
+3934=>'L',
+3935=>'L',
+3936=>'L',
+3937=>'L',
+3938=>'L',
+3939=>'L',
+3940=>'L',
+3941=>'L',
+3942=>'L',
+3943=>'L',
+3944=>'L',
+3945=>'L',
+3946=>'L',
+3953=>'NSM',
+3954=>'NSM',
+3955=>'NSM',
+3956=>'NSM',
+3957=>'NSM',
+3958=>'NSM',
+3959=>'NSM',
+3960=>'NSM',
+3961=>'NSM',
+3962=>'NSM',
+3963=>'NSM',
+3964=>'NSM',
+3965=>'NSM',
+3966=>'NSM',
+3967=>'L',
+3968=>'NSM',
+3969=>'NSM',
+3970=>'NSM',
+3971=>'NSM',
+3972=>'NSM',
+3973=>'L',
+3974=>'NSM',
+3975=>'NSM',
+3976=>'L',
+3977=>'L',
+3978=>'L',
+3979=>'L',
+3984=>'NSM',
+3985=>'NSM',
+3986=>'NSM',
+3987=>'NSM',
+3988=>'NSM',
+3989=>'NSM',
+3990=>'NSM',
+3991=>'NSM',
+3993=>'NSM',
+3994=>'NSM',
+3995=>'NSM',
+3996=>'NSM',
+3997=>'NSM',
+3998=>'NSM',
+3999=>'NSM',
+4000=>'NSM',
+4001=>'NSM',
+4002=>'NSM',
+4003=>'NSM',
+4004=>'NSM',
+4005=>'NSM',
+4006=>'NSM',
+4007=>'NSM',
+4008=>'NSM',
+4009=>'NSM',
+4010=>'NSM',
+4011=>'NSM',
+4012=>'NSM',
+4013=>'NSM',
+4014=>'NSM',
+4015=>'NSM',
+4016=>'NSM',
+4017=>'NSM',
+4018=>'NSM',
+4019=>'NSM',
+4020=>'NSM',
+4021=>'NSM',
+4022=>'NSM',
+4023=>'NSM',
+4024=>'NSM',
+4025=>'NSM',
+4026=>'NSM',
+4027=>'NSM',
+4028=>'NSM',
+4030=>'L',
+4031=>'L',
+4032=>'L',
+4033=>'L',
+4034=>'L',
+4035=>'L',
+4036=>'L',
+4037=>'L',
+4038=>'NSM',
+4039=>'L',
+4040=>'L',
+4041=>'L',
+4042=>'L',
+4043=>'L',
+4044=>'L',
+4047=>'L',
+4048=>'L',
+4049=>'L',
+4096=>'L',
+4097=>'L',
+4098=>'L',
+4099=>'L',
+4100=>'L',
+4101=>'L',
+4102=>'L',
+4103=>'L',
+4104=>'L',
+4105=>'L',
+4106=>'L',
+4107=>'L',
+4108=>'L',
+4109=>'L',
+4110=>'L',
+4111=>'L',
+4112=>'L',
+4113=>'L',
+4114=>'L',
+4115=>'L',
+4116=>'L',
+4117=>'L',
+4118=>'L',
+4119=>'L',
+4120=>'L',
+4121=>'L',
+4122=>'L',
+4123=>'L',
+4124=>'L',
+4125=>'L',
+4126=>'L',
+4127=>'L',
+4128=>'L',
+4129=>'L',
+4131=>'L',
+4132=>'L',
+4133=>'L',
+4134=>'L',
+4135=>'L',
+4137=>'L',
+4138=>'L',
+4140=>'L',
+4141=>'NSM',
+4142=>'NSM',
+4143=>'NSM',
+4144=>'NSM',
+4145=>'L',
+4146=>'NSM',
+4150=>'NSM',
+4151=>'NSM',
+4152=>'L',
+4153=>'NSM',
+4160=>'L',
+4161=>'L',
+4162=>'L',
+4163=>'L',
+4164=>'L',
+4165=>'L',
+4166=>'L',
+4167=>'L',
+4168=>'L',
+4169=>'L',
+4170=>'L',
+4171=>'L',
+4172=>'L',
+4173=>'L',
+4174=>'L',
+4175=>'L',
+4176=>'L',
+4177=>'L',
+4178=>'L',
+4179=>'L',
+4180=>'L',
+4181=>'L',
+4182=>'L',
+4183=>'L',
+4184=>'NSM',
+4185=>'NSM',
+4256=>'L',
+4257=>'L',
+4258=>'L',
+4259=>'L',
+4260=>'L',
+4261=>'L',
+4262=>'L',
+4263=>'L',
+4264=>'L',
+4265=>'L',
+4266=>'L',
+4267=>'L',
+4268=>'L',
+4269=>'L',
+4270=>'L',
+4271=>'L',
+4272=>'L',
+4273=>'L',
+4274=>'L',
+4275=>'L',
+4276=>'L',
+4277=>'L',
+4278=>'L',
+4279=>'L',
+4280=>'L',
+4281=>'L',
+4282=>'L',
+4283=>'L',
+4284=>'L',
+4285=>'L',
+4286=>'L',
+4287=>'L',
+4288=>'L',
+4289=>'L',
+4290=>'L',
+4291=>'L',
+4292=>'L',
+4293=>'L',
+4304=>'L',
+4305=>'L',
+4306=>'L',
+4307=>'L',
+4308=>'L',
+4309=>'L',
+4310=>'L',
+4311=>'L',
+4312=>'L',
+4313=>'L',
+4314=>'L',
+4315=>'L',
+4316=>'L',
+4317=>'L',
+4318=>'L',
+4319=>'L',
+4320=>'L',
+4321=>'L',
+4322=>'L',
+4323=>'L',
+4324=>'L',
+4325=>'L',
+4326=>'L',
+4327=>'L',
+4328=>'L',
+4329=>'L',
+4330=>'L',
+4331=>'L',
+4332=>'L',
+4333=>'L',
+4334=>'L',
+4335=>'L',
+4336=>'L',
+4337=>'L',
+4338=>'L',
+4339=>'L',
+4340=>'L',
+4341=>'L',
+4342=>'L',
+4343=>'L',
+4344=>'L',
+4345=>'L',
+4346=>'L',
+4347=>'L',
+4348=>'L',
+4352=>'L',
+4353=>'L',
+4354=>'L',
+4355=>'L',
+4356=>'L',
+4357=>'L',
+4358=>'L',
+4359=>'L',
+4360=>'L',
+4361=>'L',
+4362=>'L',
+4363=>'L',
+4364=>'L',
+4365=>'L',
+4366=>'L',
+4367=>'L',
+4368=>'L',
+4369=>'L',
+4370=>'L',
+4371=>'L',
+4372=>'L',
+4373=>'L',
+4374=>'L',
+4375=>'L',
+4376=>'L',
+4377=>'L',
+4378=>'L',
+4379=>'L',
+4380=>'L',
+4381=>'L',
+4382=>'L',
+4383=>'L',
+4384=>'L',
+4385=>'L',
+4386=>'L',
+4387=>'L',
+4388=>'L',
+4389=>'L',
+4390=>'L',
+4391=>'L',
+4392=>'L',
+4393=>'L',
+4394=>'L',
+4395=>'L',
+4396=>'L',
+4397=>'L',
+4398=>'L',
+4399=>'L',
+4400=>'L',
+4401=>'L',
+4402=>'L',
+4403=>'L',
+4404=>'L',
+4405=>'L',
+4406=>'L',
+4407=>'L',
+4408=>'L',
+4409=>'L',
+4410=>'L',
+4411=>'L',
+4412=>'L',
+4413=>'L',
+4414=>'L',
+4415=>'L',
+4416=>'L',
+4417=>'L',
+4418=>'L',
+4419=>'L',
+4420=>'L',
+4421=>'L',
+4422=>'L',
+4423=>'L',
+4424=>'L',
+4425=>'L',
+4426=>'L',
+4427=>'L',
+4428=>'L',
+4429=>'L',
+4430=>'L',
+4431=>'L',
+4432=>'L',
+4433=>'L',
+4434=>'L',
+4435=>'L',
+4436=>'L',
+4437=>'L',
+4438=>'L',
+4439=>'L',
+4440=>'L',
+4441=>'L',
+4447=>'L',
+4448=>'L',
+4449=>'L',
+4450=>'L',
+4451=>'L',
+4452=>'L',
+4453=>'L',
+4454=>'L',
+4455=>'L',
+4456=>'L',
+4457=>'L',
+4458=>'L',
+4459=>'L',
+4460=>'L',
+4461=>'L',
+4462=>'L',
+4463=>'L',
+4464=>'L',
+4465=>'L',
+4466=>'L',
+4467=>'L',
+4468=>'L',
+4469=>'L',
+4470=>'L',
+4471=>'L',
+4472=>'L',
+4473=>'L',
+4474=>'L',
+4475=>'L',
+4476=>'L',
+4477=>'L',
+4478=>'L',
+4479=>'L',
+4480=>'L',
+4481=>'L',
+4482=>'L',
+4483=>'L',
+4484=>'L',
+4485=>'L',
+4486=>'L',
+4487=>'L',
+4488=>'L',
+4489=>'L',
+4490=>'L',
+4491=>'L',
+4492=>'L',
+4493=>'L',
+4494=>'L',
+4495=>'L',
+4496=>'L',
+4497=>'L',
+4498=>'L',
+4499=>'L',
+4500=>'L',
+4501=>'L',
+4502=>'L',
+4503=>'L',
+4504=>'L',
+4505=>'L',
+4506=>'L',
+4507=>'L',
+4508=>'L',
+4509=>'L',
+4510=>'L',
+4511=>'L',
+4512=>'L',
+4513=>'L',
+4514=>'L',
+4520=>'L',
+4521=>'L',
+4522=>'L',
+4523=>'L',
+4524=>'L',
+4525=>'L',
+4526=>'L',
+4527=>'L',
+4528=>'L',
+4529=>'L',
+4530=>'L',
+4531=>'L',
+4532=>'L',
+4533=>'L',
+4534=>'L',
+4535=>'L',
+4536=>'L',
+4537=>'L',
+4538=>'L',
+4539=>'L',
+4540=>'L',
+4541=>'L',
+4542=>'L',
+4543=>'L',
+4544=>'L',
+4545=>'L',
+4546=>'L',
+4547=>'L',
+4548=>'L',
+4549=>'L',
+4550=>'L',
+4551=>'L',
+4552=>'L',
+4553=>'L',
+4554=>'L',
+4555=>'L',
+4556=>'L',
+4557=>'L',
+4558=>'L',
+4559=>'L',
+4560=>'L',
+4561=>'L',
+4562=>'L',
+4563=>'L',
+4564=>'L',
+4565=>'L',
+4566=>'L',
+4567=>'L',
+4568=>'L',
+4569=>'L',
+4570=>'L',
+4571=>'L',
+4572=>'L',
+4573=>'L',
+4574=>'L',
+4575=>'L',
+4576=>'L',
+4577=>'L',
+4578=>'L',
+4579=>'L',
+4580=>'L',
+4581=>'L',
+4582=>'L',
+4583=>'L',
+4584=>'L',
+4585=>'L',
+4586=>'L',
+4587=>'L',
+4588=>'L',
+4589=>'L',
+4590=>'L',
+4591=>'L',
+4592=>'L',
+4593=>'L',
+4594=>'L',
+4595=>'L',
+4596=>'L',
+4597=>'L',
+4598=>'L',
+4599=>'L',
+4600=>'L',
+4601=>'L',
+4608=>'L',
+4609=>'L',
+4610=>'L',
+4611=>'L',
+4612=>'L',
+4613=>'L',
+4614=>'L',
+4615=>'L',
+4616=>'L',
+4617=>'L',
+4618=>'L',
+4619=>'L',
+4620=>'L',
+4621=>'L',
+4622=>'L',
+4623=>'L',
+4624=>'L',
+4625=>'L',
+4626=>'L',
+4627=>'L',
+4628=>'L',
+4629=>'L',
+4630=>'L',
+4631=>'L',
+4632=>'L',
+4633=>'L',
+4634=>'L',
+4635=>'L',
+4636=>'L',
+4637=>'L',
+4638=>'L',
+4639=>'L',
+4640=>'L',
+4641=>'L',
+4642=>'L',
+4643=>'L',
+4644=>'L',
+4645=>'L',
+4646=>'L',
+4647=>'L',
+4648=>'L',
+4649=>'L',
+4650=>'L',
+4651=>'L',
+4652=>'L',
+4653=>'L',
+4654=>'L',
+4655=>'L',
+4656=>'L',
+4657=>'L',
+4658=>'L',
+4659=>'L',
+4660=>'L',
+4661=>'L',
+4662=>'L',
+4663=>'L',
+4664=>'L',
+4665=>'L',
+4666=>'L',
+4667=>'L',
+4668=>'L',
+4669=>'L',
+4670=>'L',
+4671=>'L',
+4672=>'L',
+4673=>'L',
+4674=>'L',
+4675=>'L',
+4676=>'L',
+4677=>'L',
+4678=>'L',
+4679=>'L',
+4680=>'L',
+4682=>'L',
+4683=>'L',
+4684=>'L',
+4685=>'L',
+4688=>'L',
+4689=>'L',
+4690=>'L',
+4691=>'L',
+4692=>'L',
+4693=>'L',
+4694=>'L',
+4696=>'L',
+4698=>'L',
+4699=>'L',
+4700=>'L',
+4701=>'L',
+4704=>'L',
+4705=>'L',
+4706=>'L',
+4707=>'L',
+4708=>'L',
+4709=>'L',
+4710=>'L',
+4711=>'L',
+4712=>'L',
+4713=>'L',
+4714=>'L',
+4715=>'L',
+4716=>'L',
+4717=>'L',
+4718=>'L',
+4719=>'L',
+4720=>'L',
+4721=>'L',
+4722=>'L',
+4723=>'L',
+4724=>'L',
+4725=>'L',
+4726=>'L',
+4727=>'L',
+4728=>'L',
+4729=>'L',
+4730=>'L',
+4731=>'L',
+4732=>'L',
+4733=>'L',
+4734=>'L',
+4735=>'L',
+4736=>'L',
+4737=>'L',
+4738=>'L',
+4739=>'L',
+4740=>'L',
+4741=>'L',
+4742=>'L',
+4743=>'L',
+4744=>'L',
+4746=>'L',
+4747=>'L',
+4748=>'L',
+4749=>'L',
+4752=>'L',
+4753=>'L',
+4754=>'L',
+4755=>'L',
+4756=>'L',
+4757=>'L',
+4758=>'L',
+4759=>'L',
+4760=>'L',
+4761=>'L',
+4762=>'L',
+4763=>'L',
+4764=>'L',
+4765=>'L',
+4766=>'L',
+4767=>'L',
+4768=>'L',
+4769=>'L',
+4770=>'L',
+4771=>'L',
+4772=>'L',
+4773=>'L',
+4774=>'L',
+4775=>'L',
+4776=>'L',
+4777=>'L',
+4778=>'L',
+4779=>'L',
+4780=>'L',
+4781=>'L',
+4782=>'L',
+4783=>'L',
+4784=>'L',
+4786=>'L',
+4787=>'L',
+4788=>'L',
+4789=>'L',
+4792=>'L',
+4793=>'L',
+4794=>'L',
+4795=>'L',
+4796=>'L',
+4797=>'L',
+4798=>'L',
+4800=>'L',
+4802=>'L',
+4803=>'L',
+4804=>'L',
+4805=>'L',
+4808=>'L',
+4809=>'L',
+4810=>'L',
+4811=>'L',
+4812=>'L',
+4813=>'L',
+4814=>'L',
+4815=>'L',
+4816=>'L',
+4817=>'L',
+4818=>'L',
+4819=>'L',
+4820=>'L',
+4821=>'L',
+4822=>'L',
+4824=>'L',
+4825=>'L',
+4826=>'L',
+4827=>'L',
+4828=>'L',
+4829=>'L',
+4830=>'L',
+4831=>'L',
+4832=>'L',
+4833=>'L',
+4834=>'L',
+4835=>'L',
+4836=>'L',
+4837=>'L',
+4838=>'L',
+4839=>'L',
+4840=>'L',
+4841=>'L',
+4842=>'L',
+4843=>'L',
+4844=>'L',
+4845=>'L',
+4846=>'L',
+4847=>'L',
+4848=>'L',
+4849=>'L',
+4850=>'L',
+4851=>'L',
+4852=>'L',
+4853=>'L',
+4854=>'L',
+4855=>'L',
+4856=>'L',
+4857=>'L',
+4858=>'L',
+4859=>'L',
+4860=>'L',
+4861=>'L',
+4862=>'L',
+4863=>'L',
+4864=>'L',
+4865=>'L',
+4866=>'L',
+4867=>'L',
+4868=>'L',
+4869=>'L',
+4870=>'L',
+4871=>'L',
+4872=>'L',
+4873=>'L',
+4874=>'L',
+4875=>'L',
+4876=>'L',
+4877=>'L',
+4878=>'L',
+4879=>'L',
+4880=>'L',
+4882=>'L',
+4883=>'L',
+4884=>'L',
+4885=>'L',
+4888=>'L',
+4889=>'L',
+4890=>'L',
+4891=>'L',
+4892=>'L',
+4893=>'L',
+4894=>'L',
+4895=>'L',
+4896=>'L',
+4897=>'L',
+4898=>'L',
+4899=>'L',
+4900=>'L',
+4901=>'L',
+4902=>'L',
+4903=>'L',
+4904=>'L',
+4905=>'L',
+4906=>'L',
+4907=>'L',
+4908=>'L',
+4909=>'L',
+4910=>'L',
+4911=>'L',
+4912=>'L',
+4913=>'L',
+4914=>'L',
+4915=>'L',
+4916=>'L',
+4917=>'L',
+4918=>'L',
+4919=>'L',
+4920=>'L',
+4921=>'L',
+4922=>'L',
+4923=>'L',
+4924=>'L',
+4925=>'L',
+4926=>'L',
+4927=>'L',
+4928=>'L',
+4929=>'L',
+4930=>'L',
+4931=>'L',
+4932=>'L',
+4933=>'L',
+4934=>'L',
+4935=>'L',
+4936=>'L',
+4937=>'L',
+4938=>'L',
+4939=>'L',
+4940=>'L',
+4941=>'L',
+4942=>'L',
+4943=>'L',
+4944=>'L',
+4945=>'L',
+4946=>'L',
+4947=>'L',
+4948=>'L',
+4949=>'L',
+4950=>'L',
+4951=>'L',
+4952=>'L',
+4953=>'L',
+4954=>'L',
+4959=>'NSM',
+4960=>'L',
+4961=>'L',
+4962=>'L',
+4963=>'L',
+4964=>'L',
+4965=>'L',
+4966=>'L',
+4967=>'L',
+4968=>'L',
+4969=>'L',
+4970=>'L',
+4971=>'L',
+4972=>'L',
+4973=>'L',
+4974=>'L',
+4975=>'L',
+4976=>'L',
+4977=>'L',
+4978=>'L',
+4979=>'L',
+4980=>'L',
+4981=>'L',
+4982=>'L',
+4983=>'L',
+4984=>'L',
+4985=>'L',
+4986=>'L',
+4987=>'L',
+4988=>'L',
+4992=>'L',
+4993=>'L',
+4994=>'L',
+4995=>'L',
+4996=>'L',
+4997=>'L',
+4998=>'L',
+4999=>'L',
+5000=>'L',
+5001=>'L',
+5002=>'L',
+5003=>'L',
+5004=>'L',
+5005=>'L',
+5006=>'L',
+5007=>'L',
+5008=>'ON',
+5009=>'ON',
+5010=>'ON',
+5011=>'ON',
+5012=>'ON',
+5013=>'ON',
+5014=>'ON',
+5015=>'ON',
+5016=>'ON',
+5017=>'ON',
+5024=>'L',
+5025=>'L',
+5026=>'L',
+5027=>'L',
+5028=>'L',
+5029=>'L',
+5030=>'L',
+5031=>'L',
+5032=>'L',
+5033=>'L',
+5034=>'L',
+5035=>'L',
+5036=>'L',
+5037=>'L',
+5038=>'L',
+5039=>'L',
+5040=>'L',
+5041=>'L',
+5042=>'L',
+5043=>'L',
+5044=>'L',
+5045=>'L',
+5046=>'L',
+5047=>'L',
+5048=>'L',
+5049=>'L',
+5050=>'L',
+5051=>'L',
+5052=>'L',
+5053=>'L',
+5054=>'L',
+5055=>'L',
+5056=>'L',
+5057=>'L',
+5058=>'L',
+5059=>'L',
+5060=>'L',
+5061=>'L',
+5062=>'L',
+5063=>'L',
+5064=>'L',
+5065=>'L',
+5066=>'L',
+5067=>'L',
+5068=>'L',
+5069=>'L',
+5070=>'L',
+5071=>'L',
+5072=>'L',
+5073=>'L',
+5074=>'L',
+5075=>'L',
+5076=>'L',
+5077=>'L',
+5078=>'L',
+5079=>'L',
+5080=>'L',
+5081=>'L',
+5082=>'L',
+5083=>'L',
+5084=>'L',
+5085=>'L',
+5086=>'L',
+5087=>'L',
+5088=>'L',
+5089=>'L',
+5090=>'L',
+5091=>'L',
+5092=>'L',
+5093=>'L',
+5094=>'L',
+5095=>'L',
+5096=>'L',
+5097=>'L',
+5098=>'L',
+5099=>'L',
+5100=>'L',
+5101=>'L',
+5102=>'L',
+5103=>'L',
+5104=>'L',
+5105=>'L',
+5106=>'L',
+5107=>'L',
+5108=>'L',
+5121=>'L',
+5122=>'L',
+5123=>'L',
+5124=>'L',
+5125=>'L',
+5126=>'L',
+5127=>'L',
+5128=>'L',
+5129=>'L',
+5130=>'L',
+5131=>'L',
+5132=>'L',
+5133=>'L',
+5134=>'L',
+5135=>'L',
+5136=>'L',
+5137=>'L',
+5138=>'L',
+5139=>'L',
+5140=>'L',
+5141=>'L',
+5142=>'L',
+5143=>'L',
+5144=>'L',
+5145=>'L',
+5146=>'L',
+5147=>'L',
+5148=>'L',
+5149=>'L',
+5150=>'L',
+5151=>'L',
+5152=>'L',
+5153=>'L',
+5154=>'L',
+5155=>'L',
+5156=>'L',
+5157=>'L',
+5158=>'L',
+5159=>'L',
+5160=>'L',
+5161=>'L',
+5162=>'L',
+5163=>'L',
+5164=>'L',
+5165=>'L',
+5166=>'L',
+5167=>'L',
+5168=>'L',
+5169=>'L',
+5170=>'L',
+5171=>'L',
+5172=>'L',
+5173=>'L',
+5174=>'L',
+5175=>'L',
+5176=>'L',
+5177=>'L',
+5178=>'L',
+5179=>'L',
+5180=>'L',
+5181=>'L',
+5182=>'L',
+5183=>'L',
+5184=>'L',
+5185=>'L',
+5186=>'L',
+5187=>'L',
+5188=>'L',
+5189=>'L',
+5190=>'L',
+5191=>'L',
+5192=>'L',
+5193=>'L',
+5194=>'L',
+5195=>'L',
+5196=>'L',
+5197=>'L',
+5198=>'L',
+5199=>'L',
+5200=>'L',
+5201=>'L',
+5202=>'L',
+5203=>'L',
+5204=>'L',
+5205=>'L',
+5206=>'L',
+5207=>'L',
+5208=>'L',
+5209=>'L',
+5210=>'L',
+5211=>'L',
+5212=>'L',
+5213=>'L',
+5214=>'L',
+5215=>'L',
+5216=>'L',
+5217=>'L',
+5218=>'L',
+5219=>'L',
+5220=>'L',
+5221=>'L',
+5222=>'L',
+5223=>'L',
+5224=>'L',
+5225=>'L',
+5226=>'L',
+5227=>'L',
+5228=>'L',
+5229=>'L',
+5230=>'L',
+5231=>'L',
+5232=>'L',
+5233=>'L',
+5234=>'L',
+5235=>'L',
+5236=>'L',
+5237=>'L',
+5238=>'L',
+5239=>'L',
+5240=>'L',
+5241=>'L',
+5242=>'L',
+5243=>'L',
+5244=>'L',
+5245=>'L',
+5246=>'L',
+5247=>'L',
+5248=>'L',
+5249=>'L',
+5250=>'L',
+5251=>'L',
+5252=>'L',
+5253=>'L',
+5254=>'L',
+5255=>'L',
+5256=>'L',
+5257=>'L',
+5258=>'L',
+5259=>'L',
+5260=>'L',
+5261=>'L',
+5262=>'L',
+5263=>'L',
+5264=>'L',
+5265=>'L',
+5266=>'L',
+5267=>'L',
+5268=>'L',
+5269=>'L',
+5270=>'L',
+5271=>'L',
+5272=>'L',
+5273=>'L',
+5274=>'L',
+5275=>'L',
+5276=>'L',
+5277=>'L',
+5278=>'L',
+5279=>'L',
+5280=>'L',
+5281=>'L',
+5282=>'L',
+5283=>'L',
+5284=>'L',
+5285=>'L',
+5286=>'L',
+5287=>'L',
+5288=>'L',
+5289=>'L',
+5290=>'L',
+5291=>'L',
+5292=>'L',
+5293=>'L',
+5294=>'L',
+5295=>'L',
+5296=>'L',
+5297=>'L',
+5298=>'L',
+5299=>'L',
+5300=>'L',
+5301=>'L',
+5302=>'L',
+5303=>'L',
+5304=>'L',
+5305=>'L',
+5306=>'L',
+5307=>'L',
+5308=>'L',
+5309=>'L',
+5310=>'L',
+5311=>'L',
+5312=>'L',
+5313=>'L',
+5314=>'L',
+5315=>'L',
+5316=>'L',
+5317=>'L',
+5318=>'L',
+5319=>'L',
+5320=>'L',
+5321=>'L',
+5322=>'L',
+5323=>'L',
+5324=>'L',
+5325=>'L',
+5326=>'L',
+5327=>'L',
+5328=>'L',
+5329=>'L',
+5330=>'L',
+5331=>'L',
+5332=>'L',
+5333=>'L',
+5334=>'L',
+5335=>'L',
+5336=>'L',
+5337=>'L',
+5338=>'L',
+5339=>'L',
+5340=>'L',
+5341=>'L',
+5342=>'L',
+5343=>'L',
+5344=>'L',
+5345=>'L',
+5346=>'L',
+5347=>'L',
+5348=>'L',
+5349=>'L',
+5350=>'L',
+5351=>'L',
+5352=>'L',
+5353=>'L',
+5354=>'L',
+5355=>'L',
+5356=>'L',
+5357=>'L',
+5358=>'L',
+5359=>'L',
+5360=>'L',
+5361=>'L',
+5362=>'L',
+5363=>'L',
+5364=>'L',
+5365=>'L',
+5366=>'L',
+5367=>'L',
+5368=>'L',
+5369=>'L',
+5370=>'L',
+5371=>'L',
+5372=>'L',
+5373=>'L',
+5374=>'L',
+5375=>'L',
+5376=>'L',
+5377=>'L',
+5378=>'L',
+5379=>'L',
+5380=>'L',
+5381=>'L',
+5382=>'L',
+5383=>'L',
+5384=>'L',
+5385=>'L',
+5386=>'L',
+5387=>'L',
+5388=>'L',
+5389=>'L',
+5390=>'L',
+5391=>'L',
+5392=>'L',
+5393=>'L',
+5394=>'L',
+5395=>'L',
+5396=>'L',
+5397=>'L',
+5398=>'L',
+5399=>'L',
+5400=>'L',
+5401=>'L',
+5402=>'L',
+5403=>'L',
+5404=>'L',
+5405=>'L',
+5406=>'L',
+5407=>'L',
+5408=>'L',
+5409=>'L',
+5410=>'L',
+5411=>'L',
+5412=>'L',
+5413=>'L',
+5414=>'L',
+5415=>'L',
+5416=>'L',
+5417=>'L',
+5418=>'L',
+5419=>'L',
+5420=>'L',
+5421=>'L',
+5422=>'L',
+5423=>'L',
+5424=>'L',
+5425=>'L',
+5426=>'L',
+5427=>'L',
+5428=>'L',
+5429=>'L',
+5430=>'L',
+5431=>'L',
+5432=>'L',
+5433=>'L',
+5434=>'L',
+5435=>'L',
+5436=>'L',
+5437=>'L',
+5438=>'L',
+5439=>'L',
+5440=>'L',
+5441=>'L',
+5442=>'L',
+5443=>'L',
+5444=>'L',
+5445=>'L',
+5446=>'L',
+5447=>'L',
+5448=>'L',
+5449=>'L',
+5450=>'L',
+5451=>'L',
+5452=>'L',
+5453=>'L',
+5454=>'L',
+5455=>'L',
+5456=>'L',
+5457=>'L',
+5458=>'L',
+5459=>'L',
+5460=>'L',
+5461=>'L',
+5462=>'L',
+5463=>'L',
+5464=>'L',
+5465=>'L',
+5466=>'L',
+5467=>'L',
+5468=>'L',
+5469=>'L',
+5470=>'L',
+5471=>'L',
+5472=>'L',
+5473=>'L',
+5474=>'L',
+5475=>'L',
+5476=>'L',
+5477=>'L',
+5478=>'L',
+5479=>'L',
+5480=>'L',
+5481=>'L',
+5482=>'L',
+5483=>'L',
+5484=>'L',
+5485=>'L',
+5486=>'L',
+5487=>'L',
+5488=>'L',
+5489=>'L',
+5490=>'L',
+5491=>'L',
+5492=>'L',
+5493=>'L',
+5494=>'L',
+5495=>'L',
+5496=>'L',
+5497=>'L',
+5498=>'L',
+5499=>'L',
+5500=>'L',
+5501=>'L',
+5502=>'L',
+5503=>'L',
+5504=>'L',
+5505=>'L',
+5506=>'L',
+5507=>'L',
+5508=>'L',
+5509=>'L',
+5510=>'L',
+5511=>'L',
+5512=>'L',
+5513=>'L',
+5514=>'L',
+5515=>'L',
+5516=>'L',
+5517=>'L',
+5518=>'L',
+5519=>'L',
+5520=>'L',
+5521=>'L',
+5522=>'L',
+5523=>'L',
+5524=>'L',
+5525=>'L',
+5526=>'L',
+5527=>'L',
+5528=>'L',
+5529=>'L',
+5530=>'L',
+5531=>'L',
+5532=>'L',
+5533=>'L',
+5534=>'L',
+5535=>'L',
+5536=>'L',
+5537=>'L',
+5538=>'L',
+5539=>'L',
+5540=>'L',
+5541=>'L',
+5542=>'L',
+5543=>'L',
+5544=>'L',
+5545=>'L',
+5546=>'L',
+5547=>'L',
+5548=>'L',
+5549=>'L',
+5550=>'L',
+5551=>'L',
+5552=>'L',
+5553=>'L',
+5554=>'L',
+5555=>'L',
+5556=>'L',
+5557=>'L',
+5558=>'L',
+5559=>'L',
+5560=>'L',
+5561=>'L',
+5562=>'L',
+5563=>'L',
+5564=>'L',
+5565=>'L',
+5566=>'L',
+5567=>'L',
+5568=>'L',
+5569=>'L',
+5570=>'L',
+5571=>'L',
+5572=>'L',
+5573=>'L',
+5574=>'L',
+5575=>'L',
+5576=>'L',
+5577=>'L',
+5578=>'L',
+5579=>'L',
+5580=>'L',
+5581=>'L',
+5582=>'L',
+5583=>'L',
+5584=>'L',
+5585=>'L',
+5586=>'L',
+5587=>'L',
+5588=>'L',
+5589=>'L',
+5590=>'L',
+5591=>'L',
+5592=>'L',
+5593=>'L',
+5594=>'L',
+5595=>'L',
+5596=>'L',
+5597=>'L',
+5598=>'L',
+5599=>'L',
+5600=>'L',
+5601=>'L',
+5602=>'L',
+5603=>'L',
+5604=>'L',
+5605=>'L',
+5606=>'L',
+5607=>'L',
+5608=>'L',
+5609=>'L',
+5610=>'L',
+5611=>'L',
+5612=>'L',
+5613=>'L',
+5614=>'L',
+5615=>'L',
+5616=>'L',
+5617=>'L',
+5618=>'L',
+5619=>'L',
+5620=>'L',
+5621=>'L',
+5622=>'L',
+5623=>'L',
+5624=>'L',
+5625=>'L',
+5626=>'L',
+5627=>'L',
+5628=>'L',
+5629=>'L',
+5630=>'L',
+5631=>'L',
+5632=>'L',
+5633=>'L',
+5634=>'L',
+5635=>'L',
+5636=>'L',
+5637=>'L',
+5638=>'L',
+5639=>'L',
+5640=>'L',
+5641=>'L',
+5642=>'L',
+5643=>'L',
+5644=>'L',
+5645=>'L',
+5646=>'L',
+5647=>'L',
+5648=>'L',
+5649=>'L',
+5650=>'L',
+5651=>'L',
+5652=>'L',
+5653=>'L',
+5654=>'L',
+5655=>'L',
+5656=>'L',
+5657=>'L',
+5658=>'L',
+5659=>'L',
+5660=>'L',
+5661=>'L',
+5662=>'L',
+5663=>'L',
+5664=>'L',
+5665=>'L',
+5666=>'L',
+5667=>'L',
+5668=>'L',
+5669=>'L',
+5670=>'L',
+5671=>'L',
+5672=>'L',
+5673=>'L',
+5674=>'L',
+5675=>'L',
+5676=>'L',
+5677=>'L',
+5678=>'L',
+5679=>'L',
+5680=>'L',
+5681=>'L',
+5682=>'L',
+5683=>'L',
+5684=>'L',
+5685=>'L',
+5686=>'L',
+5687=>'L',
+5688=>'L',
+5689=>'L',
+5690=>'L',
+5691=>'L',
+5692=>'L',
+5693=>'L',
+5694=>'L',
+5695=>'L',
+5696=>'L',
+5697=>'L',
+5698=>'L',
+5699=>'L',
+5700=>'L',
+5701=>'L',
+5702=>'L',
+5703=>'L',
+5704=>'L',
+5705=>'L',
+5706=>'L',
+5707=>'L',
+5708=>'L',
+5709=>'L',
+5710=>'L',
+5711=>'L',
+5712=>'L',
+5713=>'L',
+5714=>'L',
+5715=>'L',
+5716=>'L',
+5717=>'L',
+5718=>'L',
+5719=>'L',
+5720=>'L',
+5721=>'L',
+5722=>'L',
+5723=>'L',
+5724=>'L',
+5725=>'L',
+5726=>'L',
+5727=>'L',
+5728=>'L',
+5729=>'L',
+5730=>'L',
+5731=>'L',
+5732=>'L',
+5733=>'L',
+5734=>'L',
+5735=>'L',
+5736=>'L',
+5737=>'L',
+5738=>'L',
+5739=>'L',
+5740=>'L',
+5741=>'L',
+5742=>'L',
+5743=>'L',
+5744=>'L',
+5745=>'L',
+5746=>'L',
+5747=>'L',
+5748=>'L',
+5749=>'L',
+5750=>'L',
+5760=>'WS',
+5761=>'L',
+5762=>'L',
+5763=>'L',
+5764=>'L',
+5765=>'L',
+5766=>'L',
+5767=>'L',
+5768=>'L',
+5769=>'L',
+5770=>'L',
+5771=>'L',
+5772=>'L',
+5773=>'L',
+5774=>'L',
+5775=>'L',
+5776=>'L',
+5777=>'L',
+5778=>'L',
+5779=>'L',
+5780=>'L',
+5781=>'L',
+5782=>'L',
+5783=>'L',
+5784=>'L',
+5785=>'L',
+5786=>'L',
+5787=>'ON',
+5788=>'ON',
+5792=>'L',
+5793=>'L',
+5794=>'L',
+5795=>'L',
+5796=>'L',
+5797=>'L',
+5798=>'L',
+5799=>'L',
+5800=>'L',
+5801=>'L',
+5802=>'L',
+5803=>'L',
+5804=>'L',
+5805=>'L',
+5806=>'L',
+5807=>'L',
+5808=>'L',
+5809=>'L',
+5810=>'L',
+5811=>'L',
+5812=>'L',
+5813=>'L',
+5814=>'L',
+5815=>'L',
+5816=>'L',
+5817=>'L',
+5818=>'L',
+5819=>'L',
+5820=>'L',
+5821=>'L',
+5822=>'L',
+5823=>'L',
+5824=>'L',
+5825=>'L',
+5826=>'L',
+5827=>'L',
+5828=>'L',
+5829=>'L',
+5830=>'L',
+5831=>'L',
+5832=>'L',
+5833=>'L',
+5834=>'L',
+5835=>'L',
+5836=>'L',
+5837=>'L',
+5838=>'L',
+5839=>'L',
+5840=>'L',
+5841=>'L',
+5842=>'L',
+5843=>'L',
+5844=>'L',
+5845=>'L',
+5846=>'L',
+5847=>'L',
+5848=>'L',
+5849=>'L',
+5850=>'L',
+5851=>'L',
+5852=>'L',
+5853=>'L',
+5854=>'L',
+5855=>'L',
+5856=>'L',
+5857=>'L',
+5858=>'L',
+5859=>'L',
+5860=>'L',
+5861=>'L',
+5862=>'L',
+5863=>'L',
+5864=>'L',
+5865=>'L',
+5866=>'L',
+5867=>'L',
+5868=>'L',
+5869=>'L',
+5870=>'L',
+5871=>'L',
+5872=>'L',
+5888=>'L',
+5889=>'L',
+5890=>'L',
+5891=>'L',
+5892=>'L',
+5893=>'L',
+5894=>'L',
+5895=>'L',
+5896=>'L',
+5897=>'L',
+5898=>'L',
+5899=>'L',
+5900=>'L',
+5902=>'L',
+5903=>'L',
+5904=>'L',
+5905=>'L',
+5906=>'NSM',
+5907=>'NSM',
+5908=>'NSM',
+5920=>'L',
+5921=>'L',
+5922=>'L',
+5923=>'L',
+5924=>'L',
+5925=>'L',
+5926=>'L',
+5927=>'L',
+5928=>'L',
+5929=>'L',
+5930=>'L',
+5931=>'L',
+5932=>'L',
+5933=>'L',
+5934=>'L',
+5935=>'L',
+5936=>'L',
+5937=>'L',
+5938=>'NSM',
+5939=>'NSM',
+5940=>'NSM',
+5941=>'L',
+5942=>'L',
+5952=>'L',
+5953=>'L',
+5954=>'L',
+5955=>'L',
+5956=>'L',
+5957=>'L',
+5958=>'L',
+5959=>'L',
+5960=>'L',
+5961=>'L',
+5962=>'L',
+5963=>'L',
+5964=>'L',
+5965=>'L',
+5966=>'L',
+5967=>'L',
+5968=>'L',
+5969=>'L',
+5970=>'NSM',
+5971=>'NSM',
+5984=>'L',
+5985=>'L',
+5986=>'L',
+5987=>'L',
+5988=>'L',
+5989=>'L',
+5990=>'L',
+5991=>'L',
+5992=>'L',
+5993=>'L',
+5994=>'L',
+5995=>'L',
+5996=>'L',
+5998=>'L',
+5999=>'L',
+6000=>'L',
+6002=>'NSM',
+6003=>'NSM',
+6016=>'L',
+6017=>'L',
+6018=>'L',
+6019=>'L',
+6020=>'L',
+6021=>'L',
+6022=>'L',
+6023=>'L',
+6024=>'L',
+6025=>'L',
+6026=>'L',
+6027=>'L',
+6028=>'L',
+6029=>'L',
+6030=>'L',
+6031=>'L',
+6032=>'L',
+6033=>'L',
+6034=>'L',
+6035=>'L',
+6036=>'L',
+6037=>'L',
+6038=>'L',
+6039=>'L',
+6040=>'L',
+6041=>'L',
+6042=>'L',
+6043=>'L',
+6044=>'L',
+6045=>'L',
+6046=>'L',
+6047=>'L',
+6048=>'L',
+6049=>'L',
+6050=>'L',
+6051=>'L',
+6052=>'L',
+6053=>'L',
+6054=>'L',
+6055=>'L',
+6056=>'L',
+6057=>'L',
+6058=>'L',
+6059=>'L',
+6060=>'L',
+6061=>'L',
+6062=>'L',
+6063=>'L',
+6064=>'L',
+6065=>'L',
+6066=>'L',
+6067=>'L',
+6068=>'L',
+6069=>'L',
+6070=>'L',
+6071=>'NSM',
+6072=>'NSM',
+6073=>'NSM',
+6074=>'NSM',
+6075=>'NSM',
+6076=>'NSM',
+6077=>'NSM',
+6078=>'L',
+6079=>'L',
+6080=>'L',
+6081=>'L',
+6082=>'L',
+6083=>'L',
+6084=>'L',
+6085=>'L',
+6086=>'NSM',
+6087=>'L',
+6088=>'L',
+6089=>'NSM',
+6090=>'NSM',
+6091=>'NSM',
+6092=>'NSM',
+6093=>'NSM',
+6094=>'NSM',
+6095=>'NSM',
+6096=>'NSM',
+6097=>'NSM',
+6098=>'NSM',
+6099=>'NSM',
+6100=>'L',
+6101=>'L',
+6102=>'L',
+6103=>'L',
+6104=>'L',
+6105=>'L',
+6106=>'L',
+6107=>'ET',
+6108=>'L',
+6109=>'NSM',
+6112=>'L',
+6113=>'L',
+6114=>'L',
+6115=>'L',
+6116=>'L',
+6117=>'L',
+6118=>'L',
+6119=>'L',
+6120=>'L',
+6121=>'L',
+6128=>'ON',
+6129=>'ON',
+6130=>'ON',
+6131=>'ON',
+6132=>'ON',
+6133=>'ON',
+6134=>'ON',
+6135=>'ON',
+6136=>'ON',
+6137=>'ON',
+6144=>'ON',
+6145=>'ON',
+6146=>'ON',
+6147=>'ON',
+6148=>'ON',
+6149=>'ON',
+6150=>'ON',
+6151=>'ON',
+6152=>'ON',
+6153=>'ON',
+6154=>'ON',
+6155=>'NSM',
+6156=>'NSM',
+6157=>'NSM',
+6158=>'WS',
+6160=>'L',
+6161=>'L',
+6162=>'L',
+6163=>'L',
+6164=>'L',
+6165=>'L',
+6166=>'L',
+6167=>'L',
+6168=>'L',
+6169=>'L',
+6176=>'L',
+6177=>'L',
+6178=>'L',
+6179=>'L',
+6180=>'L',
+6181=>'L',
+6182=>'L',
+6183=>'L',
+6184=>'L',
+6185=>'L',
+6186=>'L',
+6187=>'L',
+6188=>'L',
+6189=>'L',
+6190=>'L',
+6191=>'L',
+6192=>'L',
+6193=>'L',
+6194=>'L',
+6195=>'L',
+6196=>'L',
+6197=>'L',
+6198=>'L',
+6199=>'L',
+6200=>'L',
+6201=>'L',
+6202=>'L',
+6203=>'L',
+6204=>'L',
+6205=>'L',
+6206=>'L',
+6207=>'L',
+6208=>'L',
+6209=>'L',
+6210=>'L',
+6211=>'L',
+6212=>'L',
+6213=>'L',
+6214=>'L',
+6215=>'L',
+6216=>'L',
+6217=>'L',
+6218=>'L',
+6219=>'L',
+6220=>'L',
+6221=>'L',
+6222=>'L',
+6223=>'L',
+6224=>'L',
+6225=>'L',
+6226=>'L',
+6227=>'L',
+6228=>'L',
+6229=>'L',
+6230=>'L',
+6231=>'L',
+6232=>'L',
+6233=>'L',
+6234=>'L',
+6235=>'L',
+6236=>'L',
+6237=>'L',
+6238=>'L',
+6239=>'L',
+6240=>'L',
+6241=>'L',
+6242=>'L',
+6243=>'L',
+6244=>'L',
+6245=>'L',
+6246=>'L',
+6247=>'L',
+6248=>'L',
+6249=>'L',
+6250=>'L',
+6251=>'L',
+6252=>'L',
+6253=>'L',
+6254=>'L',
+6255=>'L',
+6256=>'L',
+6257=>'L',
+6258=>'L',
+6259=>'L',
+6260=>'L',
+6261=>'L',
+6262=>'L',
+6263=>'L',
+6272=>'L',
+6273=>'L',
+6274=>'L',
+6275=>'L',
+6276=>'L',
+6277=>'L',
+6278=>'L',
+6279=>'L',
+6280=>'L',
+6281=>'L',
+6282=>'L',
+6283=>'L',
+6284=>'L',
+6285=>'L',
+6286=>'L',
+6287=>'L',
+6288=>'L',
+6289=>'L',
+6290=>'L',
+6291=>'L',
+6292=>'L',
+6293=>'L',
+6294=>'L',
+6295=>'L',
+6296=>'L',
+6297=>'L',
+6298=>'L',
+6299=>'L',
+6300=>'L',
+6301=>'L',
+6302=>'L',
+6303=>'L',
+6304=>'L',
+6305=>'L',
+6306=>'L',
+6307=>'L',
+6308=>'L',
+6309=>'L',
+6310=>'L',
+6311=>'L',
+6312=>'L',
+6313=>'NSM',
+6400=>'L',
+6401=>'L',
+6402=>'L',
+6403=>'L',
+6404=>'L',
+6405=>'L',
+6406=>'L',
+6407=>'L',
+6408=>'L',
+6409=>'L',
+6410=>'L',
+6411=>'L',
+6412=>'L',
+6413=>'L',
+6414=>'L',
+6415=>'L',
+6416=>'L',
+6417=>'L',
+6418=>'L',
+6419=>'L',
+6420=>'L',
+6421=>'L',
+6422=>'L',
+6423=>'L',
+6424=>'L',
+6425=>'L',
+6426=>'L',
+6427=>'L',
+6428=>'L',
+6432=>'NSM',
+6433=>'NSM',
+6434=>'NSM',
+6435=>'L',
+6436=>'L',
+6437=>'L',
+6438=>'L',
+6439=>'NSM',
+6440=>'NSM',
+6441=>'NSM',
+6442=>'NSM',
+6443=>'NSM',
+6448=>'L',
+6449=>'L',
+6450=>'NSM',
+6451=>'L',
+6452=>'L',
+6453=>'L',
+6454=>'L',
+6455=>'L',
+6456=>'L',
+6457=>'NSM',
+6458=>'NSM',
+6459=>'NSM',
+6464=>'ON',
+6468=>'ON',
+6469=>'ON',
+6470=>'L',
+6471=>'L',
+6472=>'L',
+6473=>'L',
+6474=>'L',
+6475=>'L',
+6476=>'L',
+6477=>'L',
+6478=>'L',
+6479=>'L',
+6480=>'L',
+6481=>'L',
+6482=>'L',
+6483=>'L',
+6484=>'L',
+6485=>'L',
+6486=>'L',
+6487=>'L',
+6488=>'L',
+6489=>'L',
+6490=>'L',
+6491=>'L',
+6492=>'L',
+6493=>'L',
+6494=>'L',
+6495=>'L',
+6496=>'L',
+6497=>'L',
+6498=>'L',
+6499=>'L',
+6500=>'L',
+6501=>'L',
+6502=>'L',
+6503=>'L',
+6504=>'L',
+6505=>'L',
+6506=>'L',
+6507=>'L',
+6508=>'L',
+6509=>'L',
+6512=>'L',
+6513=>'L',
+6514=>'L',
+6515=>'L',
+6516=>'L',
+6528=>'L',
+6529=>'L',
+6530=>'L',
+6531=>'L',
+6532=>'L',
+6533=>'L',
+6534=>'L',
+6535=>'L',
+6536=>'L',
+6537=>'L',
+6538=>'L',
+6539=>'L',
+6540=>'L',
+6541=>'L',
+6542=>'L',
+6543=>'L',
+6544=>'L',
+6545=>'L',
+6546=>'L',
+6547=>'L',
+6548=>'L',
+6549=>'L',
+6550=>'L',
+6551=>'L',
+6552=>'L',
+6553=>'L',
+6554=>'L',
+6555=>'L',
+6556=>'L',
+6557=>'L',
+6558=>'L',
+6559=>'L',
+6560=>'L',
+6561=>'L',
+6562=>'L',
+6563=>'L',
+6564=>'L',
+6565=>'L',
+6566=>'L',
+6567=>'L',
+6568=>'L',
+6569=>'L',
+6576=>'L',
+6577=>'L',
+6578=>'L',
+6579=>'L',
+6580=>'L',
+6581=>'L',
+6582=>'L',
+6583=>'L',
+6584=>'L',
+6585=>'L',
+6586=>'L',
+6587=>'L',
+6588=>'L',
+6589=>'L',
+6590=>'L',
+6591=>'L',
+6592=>'L',
+6593=>'L',
+6594=>'L',
+6595=>'L',
+6596=>'L',
+6597=>'L',
+6598=>'L',
+6599=>'L',
+6600=>'L',
+6601=>'L',
+6608=>'L',
+6609=>'L',
+6610=>'L',
+6611=>'L',
+6612=>'L',
+6613=>'L',
+6614=>'L',
+6615=>'L',
+6616=>'L',
+6617=>'L',
+6622=>'ON',
+6623=>'ON',
+6624=>'ON',
+6625=>'ON',
+6626=>'ON',
+6627=>'ON',
+6628=>'ON',
+6629=>'ON',
+6630=>'ON',
+6631=>'ON',
+6632=>'ON',
+6633=>'ON',
+6634=>'ON',
+6635=>'ON',
+6636=>'ON',
+6637=>'ON',
+6638=>'ON',
+6639=>'ON',
+6640=>'ON',
+6641=>'ON',
+6642=>'ON',
+6643=>'ON',
+6644=>'ON',
+6645=>'ON',
+6646=>'ON',
+6647=>'ON',
+6648=>'ON',
+6649=>'ON',
+6650=>'ON',
+6651=>'ON',
+6652=>'ON',
+6653=>'ON',
+6654=>'ON',
+6655=>'ON',
+6656=>'L',
+6657=>'L',
+6658=>'L',
+6659=>'L',
+6660=>'L',
+6661=>'L',
+6662=>'L',
+6663=>'L',
+6664=>'L',
+6665=>'L',
+6666=>'L',
+6667=>'L',
+6668=>'L',
+6669=>'L',
+6670=>'L',
+6671=>'L',
+6672=>'L',
+6673=>'L',
+6674=>'L',
+6675=>'L',
+6676=>'L',
+6677=>'L',
+6678=>'L',
+6679=>'NSM',
+6680=>'NSM',
+6681=>'L',
+6682=>'L',
+6683=>'L',
+6686=>'L',
+6687=>'L',
+6912=>'NSM',
+6913=>'NSM',
+6914=>'NSM',
+6915=>'NSM',
+6916=>'L',
+6917=>'L',
+6918=>'L',
+6919=>'L',
+6920=>'L',
+6921=>'L',
+6922=>'L',
+6923=>'L',
+6924=>'L',
+6925=>'L',
+6926=>'L',
+6927=>'L',
+6928=>'L',
+6929=>'L',
+6930=>'L',
+6931=>'L',
+6932=>'L',
+6933=>'L',
+6934=>'L',
+6935=>'L',
+6936=>'L',
+6937=>'L',
+6938=>'L',
+6939=>'L',
+6940=>'L',
+6941=>'L',
+6942=>'L',
+6943=>'L',
+6944=>'L',
+6945=>'L',
+6946=>'L',
+6947=>'L',
+6948=>'L',
+6949=>'L',
+6950=>'L',
+6951=>'L',
+6952=>'L',
+6953=>'L',
+6954=>'L',
+6955=>'L',
+6956=>'L',
+6957=>'L',
+6958=>'L',
+6959=>'L',
+6960=>'L',
+6961=>'L',
+6962=>'L',
+6963=>'L',
+6964=>'NSM',
+6965=>'L',
+6966=>'NSM',
+6967=>'NSM',
+6968=>'NSM',
+6969=>'NSM',
+6970=>'NSM',
+6971=>'L',
+6972=>'NSM',
+6973=>'L',
+6974=>'L',
+6975=>'L',
+6976=>'L',
+6977=>'L',
+6978=>'NSM',
+6979=>'L',
+6980=>'L',
+6981=>'L',
+6982=>'L',
+6983=>'L',
+6984=>'L',
+6985=>'L',
+6986=>'L',
+6987=>'L',
+6992=>'L',
+6993=>'L',
+6994=>'L',
+6995=>'L',
+6996=>'L',
+6997=>'L',
+6998=>'L',
+6999=>'L',
+7000=>'L',
+7001=>'L',
+7002=>'L',
+7003=>'L',
+7004=>'L',
+7005=>'L',
+7006=>'L',
+7007=>'L',
+7008=>'L',
+7009=>'L',
+7010=>'L',
+7011=>'L',
+7012=>'L',
+7013=>'L',
+7014=>'L',
+7015=>'L',
+7016=>'L',
+7017=>'L',
+7018=>'L',
+7019=>'NSM',
+7020=>'NSM',
+7021=>'NSM',
+7022=>'NSM',
+7023=>'NSM',
+7024=>'NSM',
+7025=>'NSM',
+7026=>'NSM',
+7027=>'NSM',
+7028=>'L',
+7029=>'L',
+7030=>'L',
+7031=>'L',
+7032=>'L',
+7033=>'L',
+7034=>'L',
+7035=>'L',
+7036=>'L',
+7424=>'L',
+7425=>'L',
+7426=>'L',
+7427=>'L',
+7428=>'L',
+7429=>'L',
+7430=>'L',
+7431=>'L',
+7432=>'L',
+7433=>'L',
+7434=>'L',
+7435=>'L',
+7436=>'L',
+7437=>'L',
+7438=>'L',
+7439=>'L',
+7440=>'L',
+7441=>'L',
+7442=>'L',
+7443=>'L',
+7444=>'L',
+7445=>'L',
+7446=>'L',
+7447=>'L',
+7448=>'L',
+7449=>'L',
+7450=>'L',
+7451=>'L',
+7452=>'L',
+7453=>'L',
+7454=>'L',
+7455=>'L',
+7456=>'L',
+7457=>'L',
+7458=>'L',
+7459=>'L',
+7460=>'L',
+7461=>'L',
+7462=>'L',
+7463=>'L',
+7464=>'L',
+7465=>'L',
+7466=>'L',
+7467=>'L',
+7468=>'L',
+7469=>'L',
+7470=>'L',
+7471=>'L',
+7472=>'L',
+7473=>'L',
+7474=>'L',
+7475=>'L',
+7476=>'L',
+7477=>'L',
+7478=>'L',
+7479=>'L',
+7480=>'L',
+7481=>'L',
+7482=>'L',
+7483=>'L',
+7484=>'L',
+7485=>'L',
+7486=>'L',
+7487=>'L',
+7488=>'L',
+7489=>'L',
+7490=>'L',
+7491=>'L',
+7492=>'L',
+7493=>'L',
+7494=>'L',
+7495=>'L',
+7496=>'L',
+7497=>'L',
+7498=>'L',
+7499=>'L',
+7500=>'L',
+7501=>'L',
+7502=>'L',
+7503=>'L',
+7504=>'L',
+7505=>'L',
+7506=>'L',
+7507=>'L',
+7508=>'L',
+7509=>'L',
+7510=>'L',
+7511=>'L',
+7512=>'L',
+7513=>'L',
+7514=>'L',
+7515=>'L',
+7516=>'L',
+7517=>'L',
+7518=>'L',
+7519=>'L',
+7520=>'L',
+7521=>'L',
+7522=>'L',
+7523=>'L',
+7524=>'L',
+7525=>'L',
+7526=>'L',
+7527=>'L',
+7528=>'L',
+7529=>'L',
+7530=>'L',
+7531=>'L',
+7532=>'L',
+7533=>'L',
+7534=>'L',
+7535=>'L',
+7536=>'L',
+7537=>'L',
+7538=>'L',
+7539=>'L',
+7540=>'L',
+7541=>'L',
+7542=>'L',
+7543=>'L',
+7544=>'L',
+7545=>'L',
+7546=>'L',
+7547=>'L',
+7548=>'L',
+7549=>'L',
+7550=>'L',
+7551=>'L',
+7552=>'L',
+7553=>'L',
+7554=>'L',
+7555=>'L',
+7556=>'L',
+7557=>'L',
+7558=>'L',
+7559=>'L',
+7560=>'L',
+7561=>'L',
+7562=>'L',
+7563=>'L',
+7564=>'L',
+7565=>'L',
+7566=>'L',
+7567=>'L',
+7568=>'L',
+7569=>'L',
+7570=>'L',
+7571=>'L',
+7572=>'L',
+7573=>'L',
+7574=>'L',
+7575=>'L',
+7576=>'L',
+7577=>'L',
+7578=>'L',
+7579=>'L',
+7580=>'L',
+7581=>'L',
+7582=>'L',
+7583=>'L',
+7584=>'L',
+7585=>'L',
+7586=>'L',
+7587=>'L',
+7588=>'L',
+7589=>'L',
+7590=>'L',
+7591=>'L',
+7592=>'L',
+7593=>'L',
+7594=>'L',
+7595=>'L',
+7596=>'L',
+7597=>'L',
+7598=>'L',
+7599=>'L',
+7600=>'L',
+7601=>'L',
+7602=>'L',
+7603=>'L',
+7604=>'L',
+7605=>'L',
+7606=>'L',
+7607=>'L',
+7608=>'L',
+7609=>'L',
+7610=>'L',
+7611=>'L',
+7612=>'L',
+7613=>'L',
+7614=>'L',
+7615=>'L',
+7616=>'NSM',
+7617=>'NSM',
+7618=>'NSM',
+7619=>'NSM',
+7620=>'NSM',
+7621=>'NSM',
+7622=>'NSM',
+7623=>'NSM',
+7624=>'NSM',
+7625=>'NSM',
+7626=>'NSM',
+7678=>'NSM',
+7679=>'NSM',
+7680=>'L',
+7681=>'L',
+7682=>'L',
+7683=>'L',
+7684=>'L',
+7685=>'L',
+7686=>'L',
+7687=>'L',
+7688=>'L',
+7689=>'L',
+7690=>'L',
+7691=>'L',
+7692=>'L',
+7693=>'L',
+7694=>'L',
+7695=>'L',
+7696=>'L',
+7697=>'L',
+7698=>'L',
+7699=>'L',
+7700=>'L',
+7701=>'L',
+7702=>'L',
+7703=>'L',
+7704=>'L',
+7705=>'L',
+7706=>'L',
+7707=>'L',
+7708=>'L',
+7709=>'L',
+7710=>'L',
+7711=>'L',
+7712=>'L',
+7713=>'L',
+7714=>'L',
+7715=>'L',
+7716=>'L',
+7717=>'L',
+7718=>'L',
+7719=>'L',
+7720=>'L',
+7721=>'L',
+7722=>'L',
+7723=>'L',
+7724=>'L',
+7725=>'L',
+7726=>'L',
+7727=>'L',
+7728=>'L',
+7729=>'L',
+7730=>'L',
+7731=>'L',
+7732=>'L',
+7733=>'L',
+7734=>'L',
+7735=>'L',
+7736=>'L',
+7737=>'L',
+7738=>'L',
+7739=>'L',
+7740=>'L',
+7741=>'L',
+7742=>'L',
+7743=>'L',
+7744=>'L',
+7745=>'L',
+7746=>'L',
+7747=>'L',
+7748=>'L',
+7749=>'L',
+7750=>'L',
+7751=>'L',
+7752=>'L',
+7753=>'L',
+7754=>'L',
+7755=>'L',
+7756=>'L',
+7757=>'L',
+7758=>'L',
+7759=>'L',
+7760=>'L',
+7761=>'L',
+7762=>'L',
+7763=>'L',
+7764=>'L',
+7765=>'L',
+7766=>'L',
+7767=>'L',
+7768=>'L',
+7769=>'L',
+7770=>'L',
+7771=>'L',
+7772=>'L',
+7773=>'L',
+7774=>'L',
+7775=>'L',
+7776=>'L',
+7777=>'L',
+7778=>'L',
+7779=>'L',
+7780=>'L',
+7781=>'L',
+7782=>'L',
+7783=>'L',
+7784=>'L',
+7785=>'L',
+7786=>'L',
+7787=>'L',
+7788=>'L',
+7789=>'L',
+7790=>'L',
+7791=>'L',
+7792=>'L',
+7793=>'L',
+7794=>'L',
+7795=>'L',
+7796=>'L',
+7797=>'L',
+7798=>'L',
+7799=>'L',
+7800=>'L',
+7801=>'L',
+7802=>'L',
+7803=>'L',
+7804=>'L',
+7805=>'L',
+7806=>'L',
+7807=>'L',
+7808=>'L',
+7809=>'L',
+7810=>'L',
+7811=>'L',
+7812=>'L',
+7813=>'L',
+7814=>'L',
+7815=>'L',
+7816=>'L',
+7817=>'L',
+7818=>'L',
+7819=>'L',
+7820=>'L',
+7821=>'L',
+7822=>'L',
+7823=>'L',
+7824=>'L',
+7825=>'L',
+7826=>'L',
+7827=>'L',
+7828=>'L',
+7829=>'L',
+7830=>'L',
+7831=>'L',
+7832=>'L',
+7833=>'L',
+7834=>'L',
+7835=>'L',
+7840=>'L',
+7841=>'L',
+7842=>'L',
+7843=>'L',
+7844=>'L',
+7845=>'L',
+7846=>'L',
+7847=>'L',
+7848=>'L',
+7849=>'L',
+7850=>'L',
+7851=>'L',
+7852=>'L',
+7853=>'L',
+7854=>'L',
+7855=>'L',
+7856=>'L',
+7857=>'L',
+7858=>'L',
+7859=>'L',
+7860=>'L',
+7861=>'L',
+7862=>'L',
+7863=>'L',
+7864=>'L',
+7865=>'L',
+7866=>'L',
+7867=>'L',
+7868=>'L',
+7869=>'L',
+7870=>'L',
+7871=>'L',
+7872=>'L',
+7873=>'L',
+7874=>'L',
+7875=>'L',
+7876=>'L',
+7877=>'L',
+7878=>'L',
+7879=>'L',
+7880=>'L',
+7881=>'L',
+7882=>'L',
+7883=>'L',
+7884=>'L',
+7885=>'L',
+7886=>'L',
+7887=>'L',
+7888=>'L',
+7889=>'L',
+7890=>'L',
+7891=>'L',
+7892=>'L',
+7893=>'L',
+7894=>'L',
+7895=>'L',
+7896=>'L',
+7897=>'L',
+7898=>'L',
+7899=>'L',
+7900=>'L',
+7901=>'L',
+7902=>'L',
+7903=>'L',
+7904=>'L',
+7905=>'L',
+7906=>'L',
+7907=>'L',
+7908=>'L',
+7909=>'L',
+7910=>'L',
+7911=>'L',
+7912=>'L',
+7913=>'L',
+7914=>'L',
+7915=>'L',
+7916=>'L',
+7917=>'L',
+7918=>'L',
+7919=>'L',
+7920=>'L',
+7921=>'L',
+7922=>'L',
+7923=>'L',
+7924=>'L',
+7925=>'L',
+7926=>'L',
+7927=>'L',
+7928=>'L',
+7929=>'L',
+7936=>'L',
+7937=>'L',
+7938=>'L',
+7939=>'L',
+7940=>'L',
+7941=>'L',
+7942=>'L',
+7943=>'L',
+7944=>'L',
+7945=>'L',
+7946=>'L',
+7947=>'L',
+7948=>'L',
+7949=>'L',
+7950=>'L',
+7951=>'L',
+7952=>'L',
+7953=>'L',
+7954=>'L',
+7955=>'L',
+7956=>'L',
+7957=>'L',
+7960=>'L',
+7961=>'L',
+7962=>'L',
+7963=>'L',
+7964=>'L',
+7965=>'L',
+7968=>'L',
+7969=>'L',
+7970=>'L',
+7971=>'L',
+7972=>'L',
+7973=>'L',
+7974=>'L',
+7975=>'L',
+7976=>'L',
+7977=>'L',
+7978=>'L',
+7979=>'L',
+7980=>'L',
+7981=>'L',
+7982=>'L',
+7983=>'L',
+7984=>'L',
+7985=>'L',
+7986=>'L',
+7987=>'L',
+7988=>'L',
+7989=>'L',
+7990=>'L',
+7991=>'L',
+7992=>'L',
+7993=>'L',
+7994=>'L',
+7995=>'L',
+7996=>'L',
+7997=>'L',
+7998=>'L',
+7999=>'L',
+8000=>'L',
+8001=>'L',
+8002=>'L',
+8003=>'L',
+8004=>'L',
+8005=>'L',
+8008=>'L',
+8009=>'L',
+8010=>'L',
+8011=>'L',
+8012=>'L',
+8013=>'L',
+8016=>'L',
+8017=>'L',
+8018=>'L',
+8019=>'L',
+8020=>'L',
+8021=>'L',
+8022=>'L',
+8023=>'L',
+8025=>'L',
+8027=>'L',
+8029=>'L',
+8031=>'L',
+8032=>'L',
+8033=>'L',
+8034=>'L',
+8035=>'L',
+8036=>'L',
+8037=>'L',
+8038=>'L',
+8039=>'L',
+8040=>'L',
+8041=>'L',
+8042=>'L',
+8043=>'L',
+8044=>'L',
+8045=>'L',
+8046=>'L',
+8047=>'L',
+8048=>'L',
+8049=>'L',
+8050=>'L',
+8051=>'L',
+8052=>'L',
+8053=>'L',
+8054=>'L',
+8055=>'L',
+8056=>'L',
+8057=>'L',
+8058=>'L',
+8059=>'L',
+8060=>'L',
+8061=>'L',
+8064=>'L',
+8065=>'L',
+8066=>'L',
+8067=>'L',
+8068=>'L',
+8069=>'L',
+8070=>'L',
+8071=>'L',
+8072=>'L',
+8073=>'L',
+8074=>'L',
+8075=>'L',
+8076=>'L',
+8077=>'L',
+8078=>'L',
+8079=>'L',
+8080=>'L',
+8081=>'L',
+8082=>'L',
+8083=>'L',
+8084=>'L',
+8085=>'L',
+8086=>'L',
+8087=>'L',
+8088=>'L',
+8089=>'L',
+8090=>'L',
+8091=>'L',
+8092=>'L',
+8093=>'L',
+8094=>'L',
+8095=>'L',
+8096=>'L',
+8097=>'L',
+8098=>'L',
+8099=>'L',
+8100=>'L',
+8101=>'L',
+8102=>'L',
+8103=>'L',
+8104=>'L',
+8105=>'L',
+8106=>'L',
+8107=>'L',
+8108=>'L',
+8109=>'L',
+8110=>'L',
+8111=>'L',
+8112=>'L',
+8113=>'L',
+8114=>'L',
+8115=>'L',
+8116=>'L',
+8118=>'L',
+8119=>'L',
+8120=>'L',
+8121=>'L',
+8122=>'L',
+8123=>'L',
+8124=>'L',
+8125=>'ON',
+8126=>'L',
+8127=>'ON',
+8128=>'ON',
+8129=>'ON',
+8130=>'L',
+8131=>'L',
+8132=>'L',
+8134=>'L',
+8135=>'L',
+8136=>'L',
+8137=>'L',
+8138=>'L',
+8139=>'L',
+8140=>'L',
+8141=>'ON',
+8142=>'ON',
+8143=>'ON',
+8144=>'L',
+8145=>'L',
+8146=>'L',
+8147=>'L',
+8150=>'L',
+8151=>'L',
+8152=>'L',
+8153=>'L',
+8154=>'L',
+8155=>'L',
+8157=>'ON',
+8158=>'ON',
+8159=>'ON',
+8160=>'L',
+8161=>'L',
+8162=>'L',
+8163=>'L',
+8164=>'L',
+8165=>'L',
+8166=>'L',
+8167=>'L',
+8168=>'L',
+8169=>'L',
+8170=>'L',
+8171=>'L',
+8172=>'L',
+8173=>'ON',
+8174=>'ON',
+8175=>'ON',
+8178=>'L',
+8179=>'L',
+8180=>'L',
+8182=>'L',
+8183=>'L',
+8184=>'L',
+8185=>'L',
+8186=>'L',
+8187=>'L',
+8188=>'L',
+8189=>'ON',
+8190=>'ON',
+8192=>'WS',
+8193=>'WS',
+8194=>'WS',
+8195=>'WS',
+8196=>'WS',
+8197=>'WS',
+8198=>'WS',
+8199=>'WS',
+8200=>'WS',
+8201=>'WS',
+8202=>'WS',
+8203=>'BN',
+8204=>'BN',
+8205=>'BN',
+8206=>'L',
+8207=>'R',
+8208=>'ON',
+8209=>'ON',
+8210=>'ON',
+8211=>'ON',
+8212=>'ON',
+8213=>'ON',
+8214=>'ON',
+8215=>'ON',
+8216=>'ON',
+8217=>'ON',
+8218=>'ON',
+8219=>'ON',
+8220=>'ON',
+8221=>'ON',
+8222=>'ON',
+8223=>'ON',
+8224=>'ON',
+8225=>'ON',
+8226=>'ON',
+8227=>'ON',
+8228=>'ON',
+8229=>'ON',
+8230=>'ON',
+8231=>'ON',
+8232=>'WS',
+8233=>'B',
+8234=>'LRE',
+8235=>'RLE',
+8236=>'PDF',
+8237=>'LRO',
+8238=>'RLO',
+8239=>'CS',
+8240=>'ET',
+8241=>'ET',
+8242=>'ET',
+8243=>'ET',
+8244=>'ET',
+8245=>'ON',
+8246=>'ON',
+8247=>'ON',
+8248=>'ON',
+8249=>'ON',
+8250=>'ON',
+8251=>'ON',
+8252=>'ON',
+8253=>'ON',
+8254=>'ON',
+8255=>'ON',
+8256=>'ON',
+8257=>'ON',
+8258=>'ON',
+8259=>'ON',
+8260=>'CS',
+8261=>'ON',
+8262=>'ON',
+8263=>'ON',
+8264=>'ON',
+8265=>'ON',
+8266=>'ON',
+8267=>'ON',
+8268=>'ON',
+8269=>'ON',
+8270=>'ON',
+8271=>'ON',
+8272=>'ON',
+8273=>'ON',
+8274=>'ON',
+8275=>'ON',
+8276=>'ON',
+8277=>'ON',
+8278=>'ON',
+8279=>'ON',
+8280=>'ON',
+8281=>'ON',
+8282=>'ON',
+8283=>'ON',
+8284=>'ON',
+8285=>'ON',
+8286=>'ON',
+8287=>'WS',
+8288=>'BN',
+8289=>'BN',
+8290=>'BN',
+8291=>'BN',
+8298=>'BN',
+8299=>'BN',
+8300=>'BN',
+8301=>'BN',
+8302=>'BN',
+8303=>'BN',
+8304=>'EN',
+8305=>'L',
+8308=>'EN',
+8309=>'EN',
+8310=>'EN',
+8311=>'EN',
+8312=>'EN',
+8313=>'EN',
+8314=>'ES',
+8315=>'ES',
+8316=>'ON',
+8317=>'ON',
+8318=>'ON',
+8319=>'L',
+8320=>'EN',
+8321=>'EN',
+8322=>'EN',
+8323=>'EN',
+8324=>'EN',
+8325=>'EN',
+8326=>'EN',
+8327=>'EN',
+8328=>'EN',
+8329=>'EN',
+8330=>'ES',
+8331=>'ES',
+8332=>'ON',
+8333=>'ON',
+8334=>'ON',
+8336=>'L',
+8337=>'L',
+8338=>'L',
+8339=>'L',
+8340=>'L',
+8352=>'ET',
+8353=>'ET',
+8354=>'ET',
+8355=>'ET',
+8356=>'ET',
+8357=>'ET',
+8358=>'ET',
+8359=>'ET',
+8360=>'ET',
+8361=>'ET',
+8362=>'ET',
+8363=>'ET',
+8364=>'ET',
+8365=>'ET',
+8366=>'ET',
+8367=>'ET',
+8368=>'ET',
+8369=>'ET',
+8370=>'ET',
+8371=>'ET',
+8372=>'ET',
+8373=>'ET',
+8400=>'NSM',
+8401=>'NSM',
+8402=>'NSM',
+8403=>'NSM',
+8404=>'NSM',
+8405=>'NSM',
+8406=>'NSM',
+8407=>'NSM',
+8408=>'NSM',
+8409=>'NSM',
+8410=>'NSM',
+8411=>'NSM',
+8412=>'NSM',
+8413=>'NSM',
+8414=>'NSM',
+8415=>'NSM',
+8416=>'NSM',
+8417=>'NSM',
+8418=>'NSM',
+8419=>'NSM',
+8420=>'NSM',
+8421=>'NSM',
+8422=>'NSM',
+8423=>'NSM',
+8424=>'NSM',
+8425=>'NSM',
+8426=>'NSM',
+8427=>'NSM',
+8428=>'NSM',
+8429=>'NSM',
+8430=>'NSM',
+8431=>'NSM',
+8448=>'ON',
+8449=>'ON',
+8450=>'L',
+8451=>'ON',
+8452=>'ON',
+8453=>'ON',
+8454=>'ON',
+8455=>'L',
+8456=>'ON',
+8457=>'ON',
+8458=>'L',
+8459=>'L',
+8460=>'L',
+8461=>'L',
+8462=>'L',
+8463=>'L',
+8464=>'L',
+8465=>'L',
+8466=>'L',
+8467=>'L',
+8468=>'ON',
+8469=>'L',
+8470=>'ON',
+8471=>'ON',
+8472=>'ON',
+8473=>'L',
+8474=>'L',
+8475=>'L',
+8476=>'L',
+8477=>'L',
+8478=>'ON',
+8479=>'ON',
+8480=>'ON',
+8481=>'ON',
+8482=>'ON',
+8483=>'ON',
+8484=>'L',
+8485=>'ON',
+8486=>'L',
+8487=>'ON',
+8488=>'L',
+8489=>'ON',
+8490=>'L',
+8491=>'L',
+8492=>'L',
+8493=>'L',
+8494=>'ET',
+8495=>'L',
+8496=>'L',
+8497=>'L',
+8498=>'L',
+8499=>'L',
+8500=>'L',
+8501=>'L',
+8502=>'L',
+8503=>'L',
+8504=>'L',
+8505=>'L',
+8506=>'ON',
+8507=>'ON',
+8508=>'L',
+8509=>'L',
+8510=>'L',
+8511=>'L',
+8512=>'ON',
+8513=>'ON',
+8514=>'ON',
+8515=>'ON',
+8516=>'ON',
+8517=>'L',
+8518=>'L',
+8519=>'L',
+8520=>'L',
+8521=>'L',
+8522=>'ON',
+8523=>'ON',
+8524=>'ON',
+8525=>'ON',
+8526=>'L',
+8531=>'ON',
+8532=>'ON',
+8533=>'ON',
+8534=>'ON',
+8535=>'ON',
+8536=>'ON',
+8537=>'ON',
+8538=>'ON',
+8539=>'ON',
+8540=>'ON',
+8541=>'ON',
+8542=>'ON',
+8543=>'ON',
+8544=>'L',
+8545=>'L',
+8546=>'L',
+8547=>'L',
+8548=>'L',
+8549=>'L',
+8550=>'L',
+8551=>'L',
+8552=>'L',
+8553=>'L',
+8554=>'L',
+8555=>'L',
+8556=>'L',
+8557=>'L',
+8558=>'L',
+8559=>'L',
+8560=>'L',
+8561=>'L',
+8562=>'L',
+8563=>'L',
+8564=>'L',
+8565=>'L',
+8566=>'L',
+8567=>'L',
+8568=>'L',
+8569=>'L',
+8570=>'L',
+8571=>'L',
+8572=>'L',
+8573=>'L',
+8574=>'L',
+8575=>'L',
+8576=>'L',
+8577=>'L',
+8578=>'L',
+8579=>'L',
+8580=>'L',
+8592=>'ON',
+8593=>'ON',
+8594=>'ON',
+8595=>'ON',
+8596=>'ON',
+8597=>'ON',
+8598=>'ON',
+8599=>'ON',
+8600=>'ON',
+8601=>'ON',
+8602=>'ON',
+8603=>'ON',
+8604=>'ON',
+8605=>'ON',
+8606=>'ON',
+8607=>'ON',
+8608=>'ON',
+8609=>'ON',
+8610=>'ON',
+8611=>'ON',
+8612=>'ON',
+8613=>'ON',
+8614=>'ON',
+8615=>'ON',
+8616=>'ON',
+8617=>'ON',
+8618=>'ON',
+8619=>'ON',
+8620=>'ON',
+8621=>'ON',
+8622=>'ON',
+8623=>'ON',
+8624=>'ON',
+8625=>'ON',
+8626=>'ON',
+8627=>'ON',
+8628=>'ON',
+8629=>'ON',
+8630=>'ON',
+8631=>'ON',
+8632=>'ON',
+8633=>'ON',
+8634=>'ON',
+8635=>'ON',
+8636=>'ON',
+8637=>'ON',
+8638=>'ON',
+8639=>'ON',
+8640=>'ON',
+8641=>'ON',
+8642=>'ON',
+8643=>'ON',
+8644=>'ON',
+8645=>'ON',
+8646=>'ON',
+8647=>'ON',
+8648=>'ON',
+8649=>'ON',
+8650=>'ON',
+8651=>'ON',
+8652=>'ON',
+8653=>'ON',
+8654=>'ON',
+8655=>'ON',
+8656=>'ON',
+8657=>'ON',
+8658=>'ON',
+8659=>'ON',
+8660=>'ON',
+8661=>'ON',
+8662=>'ON',
+8663=>'ON',
+8664=>'ON',
+8665=>'ON',
+8666=>'ON',
+8667=>'ON',
+8668=>'ON',
+8669=>'ON',
+8670=>'ON',
+8671=>'ON',
+8672=>'ON',
+8673=>'ON',
+8674=>'ON',
+8675=>'ON',
+8676=>'ON',
+8677=>'ON',
+8678=>'ON',
+8679=>'ON',
+8680=>'ON',
+8681=>'ON',
+8682=>'ON',
+8683=>'ON',
+8684=>'ON',
+8685=>'ON',
+8686=>'ON',
+8687=>'ON',
+8688=>'ON',
+8689=>'ON',
+8690=>'ON',
+8691=>'ON',
+8692=>'ON',
+8693=>'ON',
+8694=>'ON',
+8695=>'ON',
+8696=>'ON',
+8697=>'ON',
+8698=>'ON',
+8699=>'ON',
+8700=>'ON',
+8701=>'ON',
+8702=>'ON',
+8703=>'ON',
+8704=>'ON',
+8705=>'ON',
+8706=>'ON',
+8707=>'ON',
+8708=>'ON',
+8709=>'ON',
+8710=>'ON',
+8711=>'ON',
+8712=>'ON',
+8713=>'ON',
+8714=>'ON',
+8715=>'ON',
+8716=>'ON',
+8717=>'ON',
+8718=>'ON',
+8719=>'ON',
+8720=>'ON',
+8721=>'ON',
+8722=>'ES',
+8723=>'ET',
+8724=>'ON',
+8725=>'ON',
+8726=>'ON',
+8727=>'ON',
+8728=>'ON',
+8729=>'ON',
+8730=>'ON',
+8731=>'ON',
+8732=>'ON',
+8733=>'ON',
+8734=>'ON',
+8735=>'ON',
+8736=>'ON',
+8737=>'ON',
+8738=>'ON',
+8739=>'ON',
+8740=>'ON',
+8741=>'ON',
+8742=>'ON',
+8743=>'ON',
+8744=>'ON',
+8745=>'ON',
+8746=>'ON',
+8747=>'ON',
+8748=>'ON',
+8749=>'ON',
+8750=>'ON',
+8751=>'ON',
+8752=>'ON',
+8753=>'ON',
+8754=>'ON',
+8755=>'ON',
+8756=>'ON',
+8757=>'ON',
+8758=>'ON',
+8759=>'ON',
+8760=>'ON',
+8761=>'ON',
+8762=>'ON',
+8763=>'ON',
+8764=>'ON',
+8765=>'ON',
+8766=>'ON',
+8767=>'ON',
+8768=>'ON',
+8769=>'ON',
+8770=>'ON',
+8771=>'ON',
+8772=>'ON',
+8773=>'ON',
+8774=>'ON',
+8775=>'ON',
+8776=>'ON',
+8777=>'ON',
+8778=>'ON',
+8779=>'ON',
+8780=>'ON',
+8781=>'ON',
+8782=>'ON',
+8783=>'ON',
+8784=>'ON',
+8785=>'ON',
+8786=>'ON',
+8787=>'ON',
+8788=>'ON',
+8789=>'ON',
+8790=>'ON',
+8791=>'ON',
+8792=>'ON',
+8793=>'ON',
+8794=>'ON',
+8795=>'ON',
+8796=>'ON',
+8797=>'ON',
+8798=>'ON',
+8799=>'ON',
+8800=>'ON',
+8801=>'ON',
+8802=>'ON',
+8803=>'ON',
+8804=>'ON',
+8805=>'ON',
+8806=>'ON',
+8807=>'ON',
+8808=>'ON',
+8809=>'ON',
+8810=>'ON',
+8811=>'ON',
+8812=>'ON',
+8813=>'ON',
+8814=>'ON',
+8815=>'ON',
+8816=>'ON',
+8817=>'ON',
+8818=>'ON',
+8819=>'ON',
+8820=>'ON',
+8821=>'ON',
+8822=>'ON',
+8823=>'ON',
+8824=>'ON',
+8825=>'ON',
+8826=>'ON',
+8827=>'ON',
+8828=>'ON',
+8829=>'ON',
+8830=>'ON',
+8831=>'ON',
+8832=>'ON',
+8833=>'ON',
+8834=>'ON',
+8835=>'ON',
+8836=>'ON',
+8837=>'ON',
+8838=>'ON',
+8839=>'ON',
+8840=>'ON',
+8841=>'ON',
+8842=>'ON',
+8843=>'ON',
+8844=>'ON',
+8845=>'ON',
+8846=>'ON',
+8847=>'ON',
+8848=>'ON',
+8849=>'ON',
+8850=>'ON',
+8851=>'ON',
+8852=>'ON',
+8853=>'ON',
+8854=>'ON',
+8855=>'ON',
+8856=>'ON',
+8857=>'ON',
+8858=>'ON',
+8859=>'ON',
+8860=>'ON',
+8861=>'ON',
+8862=>'ON',
+8863=>'ON',
+8864=>'ON',
+8865=>'ON',
+8866=>'ON',
+8867=>'ON',
+8868=>'ON',
+8869=>'ON',
+8870=>'ON',
+8871=>'ON',
+8872=>'ON',
+8873=>'ON',
+8874=>'ON',
+8875=>'ON',
+8876=>'ON',
+8877=>'ON',
+8878=>'ON',
+8879=>'ON',
+8880=>'ON',
+8881=>'ON',
+8882=>'ON',
+8883=>'ON',
+8884=>'ON',
+8885=>'ON',
+8886=>'ON',
+8887=>'ON',
+8888=>'ON',
+8889=>'ON',
+8890=>'ON',
+8891=>'ON',
+8892=>'ON',
+8893=>'ON',
+8894=>'ON',
+8895=>'ON',
+8896=>'ON',
+8897=>'ON',
+8898=>'ON',
+8899=>'ON',
+8900=>'ON',
+8901=>'ON',
+8902=>'ON',
+8903=>'ON',
+8904=>'ON',
+8905=>'ON',
+8906=>'ON',
+8907=>'ON',
+8908=>'ON',
+8909=>'ON',
+8910=>'ON',
+8911=>'ON',
+8912=>'ON',
+8913=>'ON',
+8914=>'ON',
+8915=>'ON',
+8916=>'ON',
+8917=>'ON',
+8918=>'ON',
+8919=>'ON',
+8920=>'ON',
+8921=>'ON',
+8922=>'ON',
+8923=>'ON',
+8924=>'ON',
+8925=>'ON',
+8926=>'ON',
+8927=>'ON',
+8928=>'ON',
+8929=>'ON',
+8930=>'ON',
+8931=>'ON',
+8932=>'ON',
+8933=>'ON',
+8934=>'ON',
+8935=>'ON',
+8936=>'ON',
+8937=>'ON',
+8938=>'ON',
+8939=>'ON',
+8940=>'ON',
+8941=>'ON',
+8942=>'ON',
+8943=>'ON',
+8944=>'ON',
+8945=>'ON',
+8946=>'ON',
+8947=>'ON',
+8948=>'ON',
+8949=>'ON',
+8950=>'ON',
+8951=>'ON',
+8952=>'ON',
+8953=>'ON',
+8954=>'ON',
+8955=>'ON',
+8956=>'ON',
+8957=>'ON',
+8958=>'ON',
+8959=>'ON',
+8960=>'ON',
+8961=>'ON',
+8962=>'ON',
+8963=>'ON',
+8964=>'ON',
+8965=>'ON',
+8966=>'ON',
+8967=>'ON',
+8968=>'ON',
+8969=>'ON',
+8970=>'ON',
+8971=>'ON',
+8972=>'ON',
+8973=>'ON',
+8974=>'ON',
+8975=>'ON',
+8976=>'ON',
+8977=>'ON',
+8978=>'ON',
+8979=>'ON',
+8980=>'ON',
+8981=>'ON',
+8982=>'ON',
+8983=>'ON',
+8984=>'ON',
+8985=>'ON',
+8986=>'ON',
+8987=>'ON',
+8988=>'ON',
+8989=>'ON',
+8990=>'ON',
+8991=>'ON',
+8992=>'ON',
+8993=>'ON',
+8994=>'ON',
+8995=>'ON',
+8996=>'ON',
+8997=>'ON',
+8998=>'ON',
+8999=>'ON',
+9000=>'ON',
+9001=>'ON',
+9002=>'ON',
+9003=>'ON',
+9004=>'ON',
+9005=>'ON',
+9006=>'ON',
+9007=>'ON',
+9008=>'ON',
+9009=>'ON',
+9010=>'ON',
+9011=>'ON',
+9012=>'ON',
+9013=>'ON',
+9014=>'L',
+9015=>'L',
+9016=>'L',
+9017=>'L',
+9018=>'L',
+9019=>'L',
+9020=>'L',
+9021=>'L',
+9022=>'L',
+9023=>'L',
+9024=>'L',
+9025=>'L',
+9026=>'L',
+9027=>'L',
+9028=>'L',
+9029=>'L',
+9030=>'L',
+9031=>'L',
+9032=>'L',
+9033=>'L',
+9034=>'L',
+9035=>'L',
+9036=>'L',
+9037=>'L',
+9038=>'L',
+9039=>'L',
+9040=>'L',
+9041=>'L',
+9042=>'L',
+9043=>'L',
+9044=>'L',
+9045=>'L',
+9046=>'L',
+9047=>'L',
+9048=>'L',
+9049=>'L',
+9050=>'L',
+9051=>'L',
+9052=>'L',
+9053=>'L',
+9054=>'L',
+9055=>'L',
+9056=>'L',
+9057=>'L',
+9058=>'L',
+9059=>'L',
+9060=>'L',
+9061=>'L',
+9062=>'L',
+9063=>'L',
+9064=>'L',
+9065=>'L',
+9066=>'L',
+9067=>'L',
+9068=>'L',
+9069=>'L',
+9070=>'L',
+9071=>'L',
+9072=>'L',
+9073=>'L',
+9074=>'L',
+9075=>'L',
+9076=>'L',
+9077=>'L',
+9078=>'L',
+9079=>'L',
+9080=>'L',
+9081=>'L',
+9082=>'L',
+9083=>'ON',
+9084=>'ON',
+9085=>'ON',
+9086=>'ON',
+9087=>'ON',
+9088=>'ON',
+9089=>'ON',
+9090=>'ON',
+9091=>'ON',
+9092=>'ON',
+9093=>'ON',
+9094=>'ON',
+9095=>'ON',
+9096=>'ON',
+9097=>'ON',
+9098=>'ON',
+9099=>'ON',
+9100=>'ON',
+9101=>'ON',
+9102=>'ON',
+9103=>'ON',
+9104=>'ON',
+9105=>'ON',
+9106=>'ON',
+9107=>'ON',
+9108=>'ON',
+9109=>'L',
+9110=>'ON',
+9111=>'ON',
+9112=>'ON',
+9113=>'ON',
+9114=>'ON',
+9115=>'ON',
+9116=>'ON',
+9117=>'ON',
+9118=>'ON',
+9119=>'ON',
+9120=>'ON',
+9121=>'ON',
+9122=>'ON',
+9123=>'ON',
+9124=>'ON',
+9125=>'ON',
+9126=>'ON',
+9127=>'ON',
+9128=>'ON',
+9129=>'ON',
+9130=>'ON',
+9131=>'ON',
+9132=>'ON',
+9133=>'ON',
+9134=>'ON',
+9135=>'ON',
+9136=>'ON',
+9137=>'ON',
+9138=>'ON',
+9139=>'ON',
+9140=>'ON',
+9141=>'ON',
+9142=>'ON',
+9143=>'ON',
+9144=>'ON',
+9145=>'ON',
+9146=>'ON',
+9147=>'ON',
+9148=>'ON',
+9149=>'ON',
+9150=>'ON',
+9151=>'ON',
+9152=>'ON',
+9153=>'ON',
+9154=>'ON',
+9155=>'ON',
+9156=>'ON',
+9157=>'ON',
+9158=>'ON',
+9159=>'ON',
+9160=>'ON',
+9161=>'ON',
+9162=>'ON',
+9163=>'ON',
+9164=>'ON',
+9165=>'ON',
+9166=>'ON',
+9167=>'ON',
+9168=>'ON',
+9169=>'ON',
+9170=>'ON',
+9171=>'ON',
+9172=>'ON',
+9173=>'ON',
+9174=>'ON',
+9175=>'ON',
+9176=>'ON',
+9177=>'ON',
+9178=>'ON',
+9179=>'ON',
+9180=>'ON',
+9181=>'ON',
+9182=>'ON',
+9183=>'ON',
+9184=>'ON',
+9185=>'ON',
+9186=>'ON',
+9187=>'ON',
+9188=>'ON',
+9189=>'ON',
+9190=>'ON',
+9191=>'ON',
+9216=>'ON',
+9217=>'ON',
+9218=>'ON',
+9219=>'ON',
+9220=>'ON',
+9221=>'ON',
+9222=>'ON',
+9223=>'ON',
+9224=>'ON',
+9225=>'ON',
+9226=>'ON',
+9227=>'ON',
+9228=>'ON',
+9229=>'ON',
+9230=>'ON',
+9231=>'ON',
+9232=>'ON',
+9233=>'ON',
+9234=>'ON',
+9235=>'ON',
+9236=>'ON',
+9237=>'ON',
+9238=>'ON',
+9239=>'ON',
+9240=>'ON',
+9241=>'ON',
+9242=>'ON',
+9243=>'ON',
+9244=>'ON',
+9245=>'ON',
+9246=>'ON',
+9247=>'ON',
+9248=>'ON',
+9249=>'ON',
+9250=>'ON',
+9251=>'ON',
+9252=>'ON',
+9253=>'ON',
+9254=>'ON',
+9280=>'ON',
+9281=>'ON',
+9282=>'ON',
+9283=>'ON',
+9284=>'ON',
+9285=>'ON',
+9286=>'ON',
+9287=>'ON',
+9288=>'ON',
+9289=>'ON',
+9290=>'ON',
+9312=>'ON',
+9313=>'ON',
+9314=>'ON',
+9315=>'ON',
+9316=>'ON',
+9317=>'ON',
+9318=>'ON',
+9319=>'ON',
+9320=>'ON',
+9321=>'ON',
+9322=>'ON',
+9323=>'ON',
+9324=>'ON',
+9325=>'ON',
+9326=>'ON',
+9327=>'ON',
+9328=>'ON',
+9329=>'ON',
+9330=>'ON',
+9331=>'ON',
+9332=>'ON',
+9333=>'ON',
+9334=>'ON',
+9335=>'ON',
+9336=>'ON',
+9337=>'ON',
+9338=>'ON',
+9339=>'ON',
+9340=>'ON',
+9341=>'ON',
+9342=>'ON',
+9343=>'ON',
+9344=>'ON',
+9345=>'ON',
+9346=>'ON',
+9347=>'ON',
+9348=>'ON',
+9349=>'ON',
+9350=>'ON',
+9351=>'ON',
+9352=>'EN',
+9353=>'EN',
+9354=>'EN',
+9355=>'EN',
+9356=>'EN',
+9357=>'EN',
+9358=>'EN',
+9359=>'EN',
+9360=>'EN',
+9361=>'EN',
+9362=>'EN',
+9363=>'EN',
+9364=>'EN',
+9365=>'EN',
+9366=>'EN',
+9367=>'EN',
+9368=>'EN',
+9369=>'EN',
+9370=>'EN',
+9371=>'EN',
+9372=>'L',
+9373=>'L',
+9374=>'L',
+9375=>'L',
+9376=>'L',
+9377=>'L',
+9378=>'L',
+9379=>'L',
+9380=>'L',
+9381=>'L',
+9382=>'L',
+9383=>'L',
+9384=>'L',
+9385=>'L',
+9386=>'L',
+9387=>'L',
+9388=>'L',
+9389=>'L',
+9390=>'L',
+9391=>'L',
+9392=>'L',
+9393=>'L',
+9394=>'L',
+9395=>'L',
+9396=>'L',
+9397=>'L',
+9398=>'L',
+9399=>'L',
+9400=>'L',
+9401=>'L',
+9402=>'L',
+9403=>'L',
+9404=>'L',
+9405=>'L',
+9406=>'L',
+9407=>'L',
+9408=>'L',
+9409=>'L',
+9410=>'L',
+9411=>'L',
+9412=>'L',
+9413=>'L',
+9414=>'L',
+9415=>'L',
+9416=>'L',
+9417=>'L',
+9418=>'L',
+9419=>'L',
+9420=>'L',
+9421=>'L',
+9422=>'L',
+9423=>'L',
+9424=>'L',
+9425=>'L',
+9426=>'L',
+9427=>'L',
+9428=>'L',
+9429=>'L',
+9430=>'L',
+9431=>'L',
+9432=>'L',
+9433=>'L',
+9434=>'L',
+9435=>'L',
+9436=>'L',
+9437=>'L',
+9438=>'L',
+9439=>'L',
+9440=>'L',
+9441=>'L',
+9442=>'L',
+9443=>'L',
+9444=>'L',
+9445=>'L',
+9446=>'L',
+9447=>'L',
+9448=>'L',
+9449=>'L',
+9450=>'ON',
+9451=>'ON',
+9452=>'ON',
+9453=>'ON',
+9454=>'ON',
+9455=>'ON',
+9456=>'ON',
+9457=>'ON',
+9458=>'ON',
+9459=>'ON',
+9460=>'ON',
+9461=>'ON',
+9462=>'ON',
+9463=>'ON',
+9464=>'ON',
+9465=>'ON',
+9466=>'ON',
+9467=>'ON',
+9468=>'ON',
+9469=>'ON',
+9470=>'ON',
+9471=>'ON',
+9472=>'ON',
+9473=>'ON',
+9474=>'ON',
+9475=>'ON',
+9476=>'ON',
+9477=>'ON',
+9478=>'ON',
+9479=>'ON',
+9480=>'ON',
+9481=>'ON',
+9482=>'ON',
+9483=>'ON',
+9484=>'ON',
+9485=>'ON',
+9486=>'ON',
+9487=>'ON',
+9488=>'ON',
+9489=>'ON',
+9490=>'ON',
+9491=>'ON',
+9492=>'ON',
+9493=>'ON',
+9494=>'ON',
+9495=>'ON',
+9496=>'ON',
+9497=>'ON',
+9498=>'ON',
+9499=>'ON',
+9500=>'ON',
+9501=>'ON',
+9502=>'ON',
+9503=>'ON',
+9504=>'ON',
+9505=>'ON',
+9506=>'ON',
+9507=>'ON',
+9508=>'ON',
+9509=>'ON',
+9510=>'ON',
+9511=>'ON',
+9512=>'ON',
+9513=>'ON',
+9514=>'ON',
+9515=>'ON',
+9516=>'ON',
+9517=>'ON',
+9518=>'ON',
+9519=>'ON',
+9520=>'ON',
+9521=>'ON',
+9522=>'ON',
+9523=>'ON',
+9524=>'ON',
+9525=>'ON',
+9526=>'ON',
+9527=>'ON',
+9528=>'ON',
+9529=>'ON',
+9530=>'ON',
+9531=>'ON',
+9532=>'ON',
+9533=>'ON',
+9534=>'ON',
+9535=>'ON',
+9536=>'ON',
+9537=>'ON',
+9538=>'ON',
+9539=>'ON',
+9540=>'ON',
+9541=>'ON',
+9542=>'ON',
+9543=>'ON',
+9544=>'ON',
+9545=>'ON',
+9546=>'ON',
+9547=>'ON',
+9548=>'ON',
+9549=>'ON',
+9550=>'ON',
+9551=>'ON',
+9552=>'ON',
+9553=>'ON',
+9554=>'ON',
+9555=>'ON',
+9556=>'ON',
+9557=>'ON',
+9558=>'ON',
+9559=>'ON',
+9560=>'ON',
+9561=>'ON',
+9562=>'ON',
+9563=>'ON',
+9564=>'ON',
+9565=>'ON',
+9566=>'ON',
+9567=>'ON',
+9568=>'ON',
+9569=>'ON',
+9570=>'ON',
+9571=>'ON',
+9572=>'ON',
+9573=>'ON',
+9574=>'ON',
+9575=>'ON',
+9576=>'ON',
+9577=>'ON',
+9578=>'ON',
+9579=>'ON',
+9580=>'ON',
+9581=>'ON',
+9582=>'ON',
+9583=>'ON',
+9584=>'ON',
+9585=>'ON',
+9586=>'ON',
+9587=>'ON',
+9588=>'ON',
+9589=>'ON',
+9590=>'ON',
+9591=>'ON',
+9592=>'ON',
+9593=>'ON',
+9594=>'ON',
+9595=>'ON',
+9596=>'ON',
+9597=>'ON',
+9598=>'ON',
+9599=>'ON',
+9600=>'ON',
+9601=>'ON',
+9602=>'ON',
+9603=>'ON',
+9604=>'ON',
+9605=>'ON',
+9606=>'ON',
+9607=>'ON',
+9608=>'ON',
+9609=>'ON',
+9610=>'ON',
+9611=>'ON',
+9612=>'ON',
+9613=>'ON',
+9614=>'ON',
+9615=>'ON',
+9616=>'ON',
+9617=>'ON',
+9618=>'ON',
+9619=>'ON',
+9620=>'ON',
+9621=>'ON',
+9622=>'ON',
+9623=>'ON',
+9624=>'ON',
+9625=>'ON',
+9626=>'ON',
+9627=>'ON',
+9628=>'ON',
+9629=>'ON',
+9630=>'ON',
+9631=>'ON',
+9632=>'ON',
+9633=>'ON',
+9634=>'ON',
+9635=>'ON',
+9636=>'ON',
+9637=>'ON',
+9638=>'ON',
+9639=>'ON',
+9640=>'ON',
+9641=>'ON',
+9642=>'ON',
+9643=>'ON',
+9644=>'ON',
+9645=>'ON',
+9646=>'ON',
+9647=>'ON',
+9648=>'ON',
+9649=>'ON',
+9650=>'ON',
+9651=>'ON',
+9652=>'ON',
+9653=>'ON',
+9654=>'ON',
+9655=>'ON',
+9656=>'ON',
+9657=>'ON',
+9658=>'ON',
+9659=>'ON',
+9660=>'ON',
+9661=>'ON',
+9662=>'ON',
+9663=>'ON',
+9664=>'ON',
+9665=>'ON',
+9666=>'ON',
+9667=>'ON',
+9668=>'ON',
+9669=>'ON',
+9670=>'ON',
+9671=>'ON',
+9672=>'ON',
+9673=>'ON',
+9674=>'ON',
+9675=>'ON',
+9676=>'ON',
+9677=>'ON',
+9678=>'ON',
+9679=>'ON',
+9680=>'ON',
+9681=>'ON',
+9682=>'ON',
+9683=>'ON',
+9684=>'ON',
+9685=>'ON',
+9686=>'ON',
+9687=>'ON',
+9688=>'ON',
+9689=>'ON',
+9690=>'ON',
+9691=>'ON',
+9692=>'ON',
+9693=>'ON',
+9694=>'ON',
+9695=>'ON',
+9696=>'ON',
+9697=>'ON',
+9698=>'ON',
+9699=>'ON',
+9700=>'ON',
+9701=>'ON',
+9702=>'ON',
+9703=>'ON',
+9704=>'ON',
+9705=>'ON',
+9706=>'ON',
+9707=>'ON',
+9708=>'ON',
+9709=>'ON',
+9710=>'ON',
+9711=>'ON',
+9712=>'ON',
+9713=>'ON',
+9714=>'ON',
+9715=>'ON',
+9716=>'ON',
+9717=>'ON',
+9718=>'ON',
+9719=>'ON',
+9720=>'ON',
+9721=>'ON',
+9722=>'ON',
+9723=>'ON',
+9724=>'ON',
+9725=>'ON',
+9726=>'ON',
+9727=>'ON',
+9728=>'ON',
+9729=>'ON',
+9730=>'ON',
+9731=>'ON',
+9732=>'ON',
+9733=>'ON',
+9734=>'ON',
+9735=>'ON',
+9736=>'ON',
+9737=>'ON',
+9738=>'ON',
+9739=>'ON',
+9740=>'ON',
+9741=>'ON',
+9742=>'ON',
+9743=>'ON',
+9744=>'ON',
+9745=>'ON',
+9746=>'ON',
+9747=>'ON',
+9748=>'ON',
+9749=>'ON',
+9750=>'ON',
+9751=>'ON',
+9752=>'ON',
+9753=>'ON',
+9754=>'ON',
+9755=>'ON',
+9756=>'ON',
+9757=>'ON',
+9758=>'ON',
+9759=>'ON',
+9760=>'ON',
+9761=>'ON',
+9762=>'ON',
+9763=>'ON',
+9764=>'ON',
+9765=>'ON',
+9766=>'ON',
+9767=>'ON',
+9768=>'ON',
+9769=>'ON',
+9770=>'ON',
+9771=>'ON',
+9772=>'ON',
+9773=>'ON',
+9774=>'ON',
+9775=>'ON',
+9776=>'ON',
+9777=>'ON',
+9778=>'ON',
+9779=>'ON',
+9780=>'ON',
+9781=>'ON',
+9782=>'ON',
+9783=>'ON',
+9784=>'ON',
+9785=>'ON',
+9786=>'ON',
+9787=>'ON',
+9788=>'ON',
+9789=>'ON',
+9790=>'ON',
+9791=>'ON',
+9792=>'ON',
+9793=>'ON',
+9794=>'ON',
+9795=>'ON',
+9796=>'ON',
+9797=>'ON',
+9798=>'ON',
+9799=>'ON',
+9800=>'ON',
+9801=>'ON',
+9802=>'ON',
+9803=>'ON',
+9804=>'ON',
+9805=>'ON',
+9806=>'ON',
+9807=>'ON',
+9808=>'ON',
+9809=>'ON',
+9810=>'ON',
+9811=>'ON',
+9812=>'ON',
+9813=>'ON',
+9814=>'ON',
+9815=>'ON',
+9816=>'ON',
+9817=>'ON',
+9818=>'ON',
+9819=>'ON',
+9820=>'ON',
+9821=>'ON',
+9822=>'ON',
+9823=>'ON',
+9824=>'ON',
+9825=>'ON',
+9826=>'ON',
+9827=>'ON',
+9828=>'ON',
+9829=>'ON',
+9830=>'ON',
+9831=>'ON',
+9832=>'ON',
+9833=>'ON',
+9834=>'ON',
+9835=>'ON',
+9836=>'ON',
+9837=>'ON',
+9838=>'ON',
+9839=>'ON',
+9840=>'ON',
+9841=>'ON',
+9842=>'ON',
+9843=>'ON',
+9844=>'ON',
+9845=>'ON',
+9846=>'ON',
+9847=>'ON',
+9848=>'ON',
+9849=>'ON',
+9850=>'ON',
+9851=>'ON',
+9852=>'ON',
+9853=>'ON',
+9854=>'ON',
+9855=>'ON',
+9856=>'ON',
+9857=>'ON',
+9858=>'ON',
+9859=>'ON',
+9860=>'ON',
+9861=>'ON',
+9862=>'ON',
+9863=>'ON',
+9864=>'ON',
+9865=>'ON',
+9866=>'ON',
+9867=>'ON',
+9868=>'ON',
+9869=>'ON',
+9870=>'ON',
+9871=>'ON',
+9872=>'ON',
+9873=>'ON',
+9874=>'ON',
+9875=>'ON',
+9876=>'ON',
+9877=>'ON',
+9878=>'ON',
+9879=>'ON',
+9880=>'ON',
+9881=>'ON',
+9882=>'ON',
+9883=>'ON',
+9884=>'ON',
+9888=>'ON',
+9889=>'ON',
+9890=>'ON',
+9891=>'ON',
+9892=>'ON',
+9893=>'ON',
+9894=>'ON',
+9895=>'ON',
+9896=>'ON',
+9897=>'ON',
+9898=>'ON',
+9899=>'ON',
+9900=>'L',
+9901=>'ON',
+9902=>'ON',
+9903=>'ON',
+9904=>'ON',
+9905=>'ON',
+9906=>'ON',
+9985=>'ON',
+9986=>'ON',
+9987=>'ON',
+9988=>'ON',
+9990=>'ON',
+9991=>'ON',
+9992=>'ON',
+9993=>'ON',
+9996=>'ON',
+9997=>'ON',
+9998=>'ON',
+9999=>'ON',
+10000=>'ON',
+10001=>'ON',
+10002=>'ON',
+10003=>'ON',
+10004=>'ON',
+10005=>'ON',
+10006=>'ON',
+10007=>'ON',
+10008=>'ON',
+10009=>'ON',
+10010=>'ON',
+10011=>'ON',
+10012=>'ON',
+10013=>'ON',
+10014=>'ON',
+10015=>'ON',
+10016=>'ON',
+10017=>'ON',
+10018=>'ON',
+10019=>'ON',
+10020=>'ON',
+10021=>'ON',
+10022=>'ON',
+10023=>'ON',
+10025=>'ON',
+10026=>'ON',
+10027=>'ON',
+10028=>'ON',
+10029=>'ON',
+10030=>'ON',
+10031=>'ON',
+10032=>'ON',
+10033=>'ON',
+10034=>'ON',
+10035=>'ON',
+10036=>'ON',
+10037=>'ON',
+10038=>'ON',
+10039=>'ON',
+10040=>'ON',
+10041=>'ON',
+10042=>'ON',
+10043=>'ON',
+10044=>'ON',
+10045=>'ON',
+10046=>'ON',
+10047=>'ON',
+10048=>'ON',
+10049=>'ON',
+10050=>'ON',
+10051=>'ON',
+10052=>'ON',
+10053=>'ON',
+10054=>'ON',
+10055=>'ON',
+10056=>'ON',
+10057=>'ON',
+10058=>'ON',
+10059=>'ON',
+10061=>'ON',
+10063=>'ON',
+10064=>'ON',
+10065=>'ON',
+10066=>'ON',
+10070=>'ON',
+10072=>'ON',
+10073=>'ON',
+10074=>'ON',
+10075=>'ON',
+10076=>'ON',
+10077=>'ON',
+10078=>'ON',
+10081=>'ON',
+10082=>'ON',
+10083=>'ON',
+10084=>'ON',
+10085=>'ON',
+10086=>'ON',
+10087=>'ON',
+10088=>'ON',
+10089=>'ON',
+10090=>'ON',
+10091=>'ON',
+10092=>'ON',
+10093=>'ON',
+10094=>'ON',
+10095=>'ON',
+10096=>'ON',
+10097=>'ON',
+10098=>'ON',
+10099=>'ON',
+10100=>'ON',
+10101=>'ON',
+10102=>'ON',
+10103=>'ON',
+10104=>'ON',
+10105=>'ON',
+10106=>'ON',
+10107=>'ON',
+10108=>'ON',
+10109=>'ON',
+10110=>'ON',
+10111=>'ON',
+10112=>'ON',
+10113=>'ON',
+10114=>'ON',
+10115=>'ON',
+10116=>'ON',
+10117=>'ON',
+10118=>'ON',
+10119=>'ON',
+10120=>'ON',
+10121=>'ON',
+10122=>'ON',
+10123=>'ON',
+10124=>'ON',
+10125=>'ON',
+10126=>'ON',
+10127=>'ON',
+10128=>'ON',
+10129=>'ON',
+10130=>'ON',
+10131=>'ON',
+10132=>'ON',
+10136=>'ON',
+10137=>'ON',
+10138=>'ON',
+10139=>'ON',
+10140=>'ON',
+10141=>'ON',
+10142=>'ON',
+10143=>'ON',
+10144=>'ON',
+10145=>'ON',
+10146=>'ON',
+10147=>'ON',
+10148=>'ON',
+10149=>'ON',
+10150=>'ON',
+10151=>'ON',
+10152=>'ON',
+10153=>'ON',
+10154=>'ON',
+10155=>'ON',
+10156=>'ON',
+10157=>'ON',
+10158=>'ON',
+10159=>'ON',
+10161=>'ON',
+10162=>'ON',
+10163=>'ON',
+10164=>'ON',
+10165=>'ON',
+10166=>'ON',
+10167=>'ON',
+10168=>'ON',
+10169=>'ON',
+10170=>'ON',
+10171=>'ON',
+10172=>'ON',
+10173=>'ON',
+10174=>'ON',
+10176=>'ON',
+10177=>'ON',
+10178=>'ON',
+10179=>'ON',
+10180=>'ON',
+10181=>'ON',
+10182=>'ON',
+10183=>'ON',
+10184=>'ON',
+10185=>'ON',
+10186=>'ON',
+10192=>'ON',
+10193=>'ON',
+10194=>'ON',
+10195=>'ON',
+10196=>'ON',
+10197=>'ON',
+10198=>'ON',
+10199=>'ON',
+10200=>'ON',
+10201=>'ON',
+10202=>'ON',
+10203=>'ON',
+10204=>'ON',
+10205=>'ON',
+10206=>'ON',
+10207=>'ON',
+10208=>'ON',
+10209=>'ON',
+10210=>'ON',
+10211=>'ON',
+10212=>'ON',
+10213=>'ON',
+10214=>'ON',
+10215=>'ON',
+10216=>'ON',
+10217=>'ON',
+10218=>'ON',
+10219=>'ON',
+10224=>'ON',
+10225=>'ON',
+10226=>'ON',
+10227=>'ON',
+10228=>'ON',
+10229=>'ON',
+10230=>'ON',
+10231=>'ON',
+10232=>'ON',
+10233=>'ON',
+10234=>'ON',
+10235=>'ON',
+10236=>'ON',
+10237=>'ON',
+10238=>'ON',
+10239=>'ON',
+10240=>'L',
+10241=>'L',
+10242=>'L',
+10243=>'L',
+10244=>'L',
+10245=>'L',
+10246=>'L',
+10247=>'L',
+10248=>'L',
+10249=>'L',
+10250=>'L',
+10251=>'L',
+10252=>'L',
+10253=>'L',
+10254=>'L',
+10255=>'L',
+10256=>'L',
+10257=>'L',
+10258=>'L',
+10259=>'L',
+10260=>'L',
+10261=>'L',
+10262=>'L',
+10263=>'L',
+10264=>'L',
+10265=>'L',
+10266=>'L',
+10267=>'L',
+10268=>'L',
+10269=>'L',
+10270=>'L',
+10271=>'L',
+10272=>'L',
+10273=>'L',
+10274=>'L',
+10275=>'L',
+10276=>'L',
+10277=>'L',
+10278=>'L',
+10279=>'L',
+10280=>'L',
+10281=>'L',
+10282=>'L',
+10283=>'L',
+10284=>'L',
+10285=>'L',
+10286=>'L',
+10287=>'L',
+10288=>'L',
+10289=>'L',
+10290=>'L',
+10291=>'L',
+10292=>'L',
+10293=>'L',
+10294=>'L',
+10295=>'L',
+10296=>'L',
+10297=>'L',
+10298=>'L',
+10299=>'L',
+10300=>'L',
+10301=>'L',
+10302=>'L',
+10303=>'L',
+10304=>'L',
+10305=>'L',
+10306=>'L',
+10307=>'L',
+10308=>'L',
+10309=>'L',
+10310=>'L',
+10311=>'L',
+10312=>'L',
+10313=>'L',
+10314=>'L',
+10315=>'L',
+10316=>'L',
+10317=>'L',
+10318=>'L',
+10319=>'L',
+10320=>'L',
+10321=>'L',
+10322=>'L',
+10323=>'L',
+10324=>'L',
+10325=>'L',
+10326=>'L',
+10327=>'L',
+10328=>'L',
+10329=>'L',
+10330=>'L',
+10331=>'L',
+10332=>'L',
+10333=>'L',
+10334=>'L',
+10335=>'L',
+10336=>'L',
+10337=>'L',
+10338=>'L',
+10339=>'L',
+10340=>'L',
+10341=>'L',
+10342=>'L',
+10343=>'L',
+10344=>'L',
+10345=>'L',
+10346=>'L',
+10347=>'L',
+10348=>'L',
+10349=>'L',
+10350=>'L',
+10351=>'L',
+10352=>'L',
+10353=>'L',
+10354=>'L',
+10355=>'L',
+10356=>'L',
+10357=>'L',
+10358=>'L',
+10359=>'L',
+10360=>'L',
+10361=>'L',
+10362=>'L',
+10363=>'L',
+10364=>'L',
+10365=>'L',
+10366=>'L',
+10367=>'L',
+10368=>'L',
+10369=>'L',
+10370=>'L',
+10371=>'L',
+10372=>'L',
+10373=>'L',
+10374=>'L',
+10375=>'L',
+10376=>'L',
+10377=>'L',
+10378=>'L',
+10379=>'L',
+10380=>'L',
+10381=>'L',
+10382=>'L',
+10383=>'L',
+10384=>'L',
+10385=>'L',
+10386=>'L',
+10387=>'L',
+10388=>'L',
+10389=>'L',
+10390=>'L',
+10391=>'L',
+10392=>'L',
+10393=>'L',
+10394=>'L',
+10395=>'L',
+10396=>'L',
+10397=>'L',
+10398=>'L',
+10399=>'L',
+10400=>'L',
+10401=>'L',
+10402=>'L',
+10403=>'L',
+10404=>'L',
+10405=>'L',
+10406=>'L',
+10407=>'L',
+10408=>'L',
+10409=>'L',
+10410=>'L',
+10411=>'L',
+10412=>'L',
+10413=>'L',
+10414=>'L',
+10415=>'L',
+10416=>'L',
+10417=>'L',
+10418=>'L',
+10419=>'L',
+10420=>'L',
+10421=>'L',
+10422=>'L',
+10423=>'L',
+10424=>'L',
+10425=>'L',
+10426=>'L',
+10427=>'L',
+10428=>'L',
+10429=>'L',
+10430=>'L',
+10431=>'L',
+10432=>'L',
+10433=>'L',
+10434=>'L',
+10435=>'L',
+10436=>'L',
+10437=>'L',
+10438=>'L',
+10439=>'L',
+10440=>'L',
+10441=>'L',
+10442=>'L',
+10443=>'L',
+10444=>'L',
+10445=>'L',
+10446=>'L',
+10447=>'L',
+10448=>'L',
+10449=>'L',
+10450=>'L',
+10451=>'L',
+10452=>'L',
+10453=>'L',
+10454=>'L',
+10455=>'L',
+10456=>'L',
+10457=>'L',
+10458=>'L',
+10459=>'L',
+10460=>'L',
+10461=>'L',
+10462=>'L',
+10463=>'L',
+10464=>'L',
+10465=>'L',
+10466=>'L',
+10467=>'L',
+10468=>'L',
+10469=>'L',
+10470=>'L',
+10471=>'L',
+10472=>'L',
+10473=>'L',
+10474=>'L',
+10475=>'L',
+10476=>'L',
+10477=>'L',
+10478=>'L',
+10479=>'L',
+10480=>'L',
+10481=>'L',
+10482=>'L',
+10483=>'L',
+10484=>'L',
+10485=>'L',
+10486=>'L',
+10487=>'L',
+10488=>'L',
+10489=>'L',
+10490=>'L',
+10491=>'L',
+10492=>'L',
+10493=>'L',
+10494=>'L',
+10495=>'L',
+10496=>'ON',
+10497=>'ON',
+10498=>'ON',
+10499=>'ON',
+10500=>'ON',
+10501=>'ON',
+10502=>'ON',
+10503=>'ON',
+10504=>'ON',
+10505=>'ON',
+10506=>'ON',
+10507=>'ON',
+10508=>'ON',
+10509=>'ON',
+10510=>'ON',
+10511=>'ON',
+10512=>'ON',
+10513=>'ON',
+10514=>'ON',
+10515=>'ON',
+10516=>'ON',
+10517=>'ON',
+10518=>'ON',
+10519=>'ON',
+10520=>'ON',
+10521=>'ON',
+10522=>'ON',
+10523=>'ON',
+10524=>'ON',
+10525=>'ON',
+10526=>'ON',
+10527=>'ON',
+10528=>'ON',
+10529=>'ON',
+10530=>'ON',
+10531=>'ON',
+10532=>'ON',
+10533=>'ON',
+10534=>'ON',
+10535=>'ON',
+10536=>'ON',
+10537=>'ON',
+10538=>'ON',
+10539=>'ON',
+10540=>'ON',
+10541=>'ON',
+10542=>'ON',
+10543=>'ON',
+10544=>'ON',
+10545=>'ON',
+10546=>'ON',
+10547=>'ON',
+10548=>'ON',
+10549=>'ON',
+10550=>'ON',
+10551=>'ON',
+10552=>'ON',
+10553=>'ON',
+10554=>'ON',
+10555=>'ON',
+10556=>'ON',
+10557=>'ON',
+10558=>'ON',
+10559=>'ON',
+10560=>'ON',
+10561=>'ON',
+10562=>'ON',
+10563=>'ON',
+10564=>'ON',
+10565=>'ON',
+10566=>'ON',
+10567=>'ON',
+10568=>'ON',
+10569=>'ON',
+10570=>'ON',
+10571=>'ON',
+10572=>'ON',
+10573=>'ON',
+10574=>'ON',
+10575=>'ON',
+10576=>'ON',
+10577=>'ON',
+10578=>'ON',
+10579=>'ON',
+10580=>'ON',
+10581=>'ON',
+10582=>'ON',
+10583=>'ON',
+10584=>'ON',
+10585=>'ON',
+10586=>'ON',
+10587=>'ON',
+10588=>'ON',
+10589=>'ON',
+10590=>'ON',
+10591=>'ON',
+10592=>'ON',
+10593=>'ON',
+10594=>'ON',
+10595=>'ON',
+10596=>'ON',
+10597=>'ON',
+10598=>'ON',
+10599=>'ON',
+10600=>'ON',
+10601=>'ON',
+10602=>'ON',
+10603=>'ON',
+10604=>'ON',
+10605=>'ON',
+10606=>'ON',
+10607=>'ON',
+10608=>'ON',
+10609=>'ON',
+10610=>'ON',
+10611=>'ON',
+10612=>'ON',
+10613=>'ON',
+10614=>'ON',
+10615=>'ON',
+10616=>'ON',
+10617=>'ON',
+10618=>'ON',
+10619=>'ON',
+10620=>'ON',
+10621=>'ON',
+10622=>'ON',
+10623=>'ON',
+10624=>'ON',
+10625=>'ON',
+10626=>'ON',
+10627=>'ON',
+10628=>'ON',
+10629=>'ON',
+10630=>'ON',
+10631=>'ON',
+10632=>'ON',
+10633=>'ON',
+10634=>'ON',
+10635=>'ON',
+10636=>'ON',
+10637=>'ON',
+10638=>'ON',
+10639=>'ON',
+10640=>'ON',
+10641=>'ON',
+10642=>'ON',
+10643=>'ON',
+10644=>'ON',
+10645=>'ON',
+10646=>'ON',
+10647=>'ON',
+10648=>'ON',
+10649=>'ON',
+10650=>'ON',
+10651=>'ON',
+10652=>'ON',
+10653=>'ON',
+10654=>'ON',
+10655=>'ON',
+10656=>'ON',
+10657=>'ON',
+10658=>'ON',
+10659=>'ON',
+10660=>'ON',
+10661=>'ON',
+10662=>'ON',
+10663=>'ON',
+10664=>'ON',
+10665=>'ON',
+10666=>'ON',
+10667=>'ON',
+10668=>'ON',
+10669=>'ON',
+10670=>'ON',
+10671=>'ON',
+10672=>'ON',
+10673=>'ON',
+10674=>'ON',
+10675=>'ON',
+10676=>'ON',
+10677=>'ON',
+10678=>'ON',
+10679=>'ON',
+10680=>'ON',
+10681=>'ON',
+10682=>'ON',
+10683=>'ON',
+10684=>'ON',
+10685=>'ON',
+10686=>'ON',
+10687=>'ON',
+10688=>'ON',
+10689=>'ON',
+10690=>'ON',
+10691=>'ON',
+10692=>'ON',
+10693=>'ON',
+10694=>'ON',
+10695=>'ON',
+10696=>'ON',
+10697=>'ON',
+10698=>'ON',
+10699=>'ON',
+10700=>'ON',
+10701=>'ON',
+10702=>'ON',
+10703=>'ON',
+10704=>'ON',
+10705=>'ON',
+10706=>'ON',
+10707=>'ON',
+10708=>'ON',
+10709=>'ON',
+10710=>'ON',
+10711=>'ON',
+10712=>'ON',
+10713=>'ON',
+10714=>'ON',
+10715=>'ON',
+10716=>'ON',
+10717=>'ON',
+10718=>'ON',
+10719=>'ON',
+10720=>'ON',
+10721=>'ON',
+10722=>'ON',
+10723=>'ON',
+10724=>'ON',
+10725=>'ON',
+10726=>'ON',
+10727=>'ON',
+10728=>'ON',
+10729=>'ON',
+10730=>'ON',
+10731=>'ON',
+10732=>'ON',
+10733=>'ON',
+10734=>'ON',
+10735=>'ON',
+10736=>'ON',
+10737=>'ON',
+10738=>'ON',
+10739=>'ON',
+10740=>'ON',
+10741=>'ON',
+10742=>'ON',
+10743=>'ON',
+10744=>'ON',
+10745=>'ON',
+10746=>'ON',
+10747=>'ON',
+10748=>'ON',
+10749=>'ON',
+10750=>'ON',
+10751=>'ON',
+10752=>'ON',
+10753=>'ON',
+10754=>'ON',
+10755=>'ON',
+10756=>'ON',
+10757=>'ON',
+10758=>'ON',
+10759=>'ON',
+10760=>'ON',
+10761=>'ON',
+10762=>'ON',
+10763=>'ON',
+10764=>'ON',
+10765=>'ON',
+10766=>'ON',
+10767=>'ON',
+10768=>'ON',
+10769=>'ON',
+10770=>'ON',
+10771=>'ON',
+10772=>'ON',
+10773=>'ON',
+10774=>'ON',
+10775=>'ON',
+10776=>'ON',
+10777=>'ON',
+10778=>'ON',
+10779=>'ON',
+10780=>'ON',
+10781=>'ON',
+10782=>'ON',
+10783=>'ON',
+10784=>'ON',
+10785=>'ON',
+10786=>'ON',
+10787=>'ON',
+10788=>'ON',
+10789=>'ON',
+10790=>'ON',
+10791=>'ON',
+10792=>'ON',
+10793=>'ON',
+10794=>'ON',
+10795=>'ON',
+10796=>'ON',
+10797=>'ON',
+10798=>'ON',
+10799=>'ON',
+10800=>'ON',
+10801=>'ON',
+10802=>'ON',
+10803=>'ON',
+10804=>'ON',
+10805=>'ON',
+10806=>'ON',
+10807=>'ON',
+10808=>'ON',
+10809=>'ON',
+10810=>'ON',
+10811=>'ON',
+10812=>'ON',
+10813=>'ON',
+10814=>'ON',
+10815=>'ON',
+10816=>'ON',
+10817=>'ON',
+10818=>'ON',
+10819=>'ON',
+10820=>'ON',
+10821=>'ON',
+10822=>'ON',
+10823=>'ON',
+10824=>'ON',
+10825=>'ON',
+10826=>'ON',
+10827=>'ON',
+10828=>'ON',
+10829=>'ON',
+10830=>'ON',
+10831=>'ON',
+10832=>'ON',
+10833=>'ON',
+10834=>'ON',
+10835=>'ON',
+10836=>'ON',
+10837=>'ON',
+10838=>'ON',
+10839=>'ON',
+10840=>'ON',
+10841=>'ON',
+10842=>'ON',
+10843=>'ON',
+10844=>'ON',
+10845=>'ON',
+10846=>'ON',
+10847=>'ON',
+10848=>'ON',
+10849=>'ON',
+10850=>'ON',
+10851=>'ON',
+10852=>'ON',
+10853=>'ON',
+10854=>'ON',
+10855=>'ON',
+10856=>'ON',
+10857=>'ON',
+10858=>'ON',
+10859=>'ON',
+10860=>'ON',
+10861=>'ON',
+10862=>'ON',
+10863=>'ON',
+10864=>'ON',
+10865=>'ON',
+10866=>'ON',
+10867=>'ON',
+10868=>'ON',
+10869=>'ON',
+10870=>'ON',
+10871=>'ON',
+10872=>'ON',
+10873=>'ON',
+10874=>'ON',
+10875=>'ON',
+10876=>'ON',
+10877=>'ON',
+10878=>'ON',
+10879=>'ON',
+10880=>'ON',
+10881=>'ON',
+10882=>'ON',
+10883=>'ON',
+10884=>'ON',
+10885=>'ON',
+10886=>'ON',
+10887=>'ON',
+10888=>'ON',
+10889=>'ON',
+10890=>'ON',
+10891=>'ON',
+10892=>'ON',
+10893=>'ON',
+10894=>'ON',
+10895=>'ON',
+10896=>'ON',
+10897=>'ON',
+10898=>'ON',
+10899=>'ON',
+10900=>'ON',
+10901=>'ON',
+10902=>'ON',
+10903=>'ON',
+10904=>'ON',
+10905=>'ON',
+10906=>'ON',
+10907=>'ON',
+10908=>'ON',
+10909=>'ON',
+10910=>'ON',
+10911=>'ON',
+10912=>'ON',
+10913=>'ON',
+10914=>'ON',
+10915=>'ON',
+10916=>'ON',
+10917=>'ON',
+10918=>'ON',
+10919=>'ON',
+10920=>'ON',
+10921=>'ON',
+10922=>'ON',
+10923=>'ON',
+10924=>'ON',
+10925=>'ON',
+10926=>'ON',
+10927=>'ON',
+10928=>'ON',
+10929=>'ON',
+10930=>'ON',
+10931=>'ON',
+10932=>'ON',
+10933=>'ON',
+10934=>'ON',
+10935=>'ON',
+10936=>'ON',
+10937=>'ON',
+10938=>'ON',
+10939=>'ON',
+10940=>'ON',
+10941=>'ON',
+10942=>'ON',
+10943=>'ON',
+10944=>'ON',
+10945=>'ON',
+10946=>'ON',
+10947=>'ON',
+10948=>'ON',
+10949=>'ON',
+10950=>'ON',
+10951=>'ON',
+10952=>'ON',
+10953=>'ON',
+10954=>'ON',
+10955=>'ON',
+10956=>'ON',
+10957=>'ON',
+10958=>'ON',
+10959=>'ON',
+10960=>'ON',
+10961=>'ON',
+10962=>'ON',
+10963=>'ON',
+10964=>'ON',
+10965=>'ON',
+10966=>'ON',
+10967=>'ON',
+10968=>'ON',
+10969=>'ON',
+10970=>'ON',
+10971=>'ON',
+10972=>'ON',
+10973=>'ON',
+10974=>'ON',
+10975=>'ON',
+10976=>'ON',
+10977=>'ON',
+10978=>'ON',
+10979=>'ON',
+10980=>'ON',
+10981=>'ON',
+10982=>'ON',
+10983=>'ON',
+10984=>'ON',
+10985=>'ON',
+10986=>'ON',
+10987=>'ON',
+10988=>'ON',
+10989=>'ON',
+10990=>'ON',
+10991=>'ON',
+10992=>'ON',
+10993=>'ON',
+10994=>'ON',
+10995=>'ON',
+10996=>'ON',
+10997=>'ON',
+10998=>'ON',
+10999=>'ON',
+11000=>'ON',
+11001=>'ON',
+11002=>'ON',
+11003=>'ON',
+11004=>'ON',
+11005=>'ON',
+11006=>'ON',
+11007=>'ON',
+11008=>'ON',
+11009=>'ON',
+11010=>'ON',
+11011=>'ON',
+11012=>'ON',
+11013=>'ON',
+11014=>'ON',
+11015=>'ON',
+11016=>'ON',
+11017=>'ON',
+11018=>'ON',
+11019=>'ON',
+11020=>'ON',
+11021=>'ON',
+11022=>'ON',
+11023=>'ON',
+11024=>'ON',
+11025=>'ON',
+11026=>'ON',
+11027=>'ON',
+11028=>'ON',
+11029=>'ON',
+11030=>'ON',
+11031=>'ON',
+11032=>'ON',
+11033=>'ON',
+11034=>'ON',
+11040=>'ON',
+11041=>'ON',
+11042=>'ON',
+11043=>'ON',
+11264=>'L',
+11265=>'L',
+11266=>'L',
+11267=>'L',
+11268=>'L',
+11269=>'L',
+11270=>'L',
+11271=>'L',
+11272=>'L',
+11273=>'L',
+11274=>'L',
+11275=>'L',
+11276=>'L',
+11277=>'L',
+11278=>'L',
+11279=>'L',
+11280=>'L',
+11281=>'L',
+11282=>'L',
+11283=>'L',
+11284=>'L',
+11285=>'L',
+11286=>'L',
+11287=>'L',
+11288=>'L',
+11289=>'L',
+11290=>'L',
+11291=>'L',
+11292=>'L',
+11293=>'L',
+11294=>'L',
+11295=>'L',
+11296=>'L',
+11297=>'L',
+11298=>'L',
+11299=>'L',
+11300=>'L',
+11301=>'L',
+11302=>'L',
+11303=>'L',
+11304=>'L',
+11305=>'L',
+11306=>'L',
+11307=>'L',
+11308=>'L',
+11309=>'L',
+11310=>'L',
+11312=>'L',
+11313=>'L',
+11314=>'L',
+11315=>'L',
+11316=>'L',
+11317=>'L',
+11318=>'L',
+11319=>'L',
+11320=>'L',
+11321=>'L',
+11322=>'L',
+11323=>'L',
+11324=>'L',
+11325=>'L',
+11326=>'L',
+11327=>'L',
+11328=>'L',
+11329=>'L',
+11330=>'L',
+11331=>'L',
+11332=>'L',
+11333=>'L',
+11334=>'L',
+11335=>'L',
+11336=>'L',
+11337=>'L',
+11338=>'L',
+11339=>'L',
+11340=>'L',
+11341=>'L',
+11342=>'L',
+11343=>'L',
+11344=>'L',
+11345=>'L',
+11346=>'L',
+11347=>'L',
+11348=>'L',
+11349=>'L',
+11350=>'L',
+11351=>'L',
+11352=>'L',
+11353=>'L',
+11354=>'L',
+11355=>'L',
+11356=>'L',
+11357=>'L',
+11358=>'L',
+11360=>'L',
+11361=>'L',
+11362=>'L',
+11363=>'L',
+11364=>'L',
+11365=>'L',
+11366=>'L',
+11367=>'L',
+11368=>'L',
+11369=>'L',
+11370=>'L',
+11371=>'L',
+11372=>'L',
+11380=>'L',
+11381=>'L',
+11382=>'L',
+11383=>'L',
+11392=>'L',
+11393=>'L',
+11394=>'L',
+11395=>'L',
+11396=>'L',
+11397=>'L',
+11398=>'L',
+11399=>'L',
+11400=>'L',
+11401=>'L',
+11402=>'L',
+11403=>'L',
+11404=>'L',
+11405=>'L',
+11406=>'L',
+11407=>'L',
+11408=>'L',
+11409=>'L',
+11410=>'L',
+11411=>'L',
+11412=>'L',
+11413=>'L',
+11414=>'L',
+11415=>'L',
+11416=>'L',
+11417=>'L',
+11418=>'L',
+11419=>'L',
+11420=>'L',
+11421=>'L',
+11422=>'L',
+11423=>'L',
+11424=>'L',
+11425=>'L',
+11426=>'L',
+11427=>'L',
+11428=>'L',
+11429=>'L',
+11430=>'L',
+11431=>'L',
+11432=>'L',
+11433=>'L',
+11434=>'L',
+11435=>'L',
+11436=>'L',
+11437=>'L',
+11438=>'L',
+11439=>'L',
+11440=>'L',
+11441=>'L',
+11442=>'L',
+11443=>'L',
+11444=>'L',
+11445=>'L',
+11446=>'L',
+11447=>'L',
+11448=>'L',
+11449=>'L',
+11450=>'L',
+11451=>'L',
+11452=>'L',
+11453=>'L',
+11454=>'L',
+11455=>'L',
+11456=>'L',
+11457=>'L',
+11458=>'L',
+11459=>'L',
+11460=>'L',
+11461=>'L',
+11462=>'L',
+11463=>'L',
+11464=>'L',
+11465=>'L',
+11466=>'L',
+11467=>'L',
+11468=>'L',
+11469=>'L',
+11470=>'L',
+11471=>'L',
+11472=>'L',
+11473=>'L',
+11474=>'L',
+11475=>'L',
+11476=>'L',
+11477=>'L',
+11478=>'L',
+11479=>'L',
+11480=>'L',
+11481=>'L',
+11482=>'L',
+11483=>'L',
+11484=>'L',
+11485=>'L',
+11486=>'L',
+11487=>'L',
+11488=>'L',
+11489=>'L',
+11490=>'L',
+11491=>'L',
+11492=>'L',
+11493=>'ON',
+11494=>'ON',
+11495=>'ON',
+11496=>'ON',
+11497=>'ON',
+11498=>'ON',
+11513=>'ON',
+11514=>'ON',
+11515=>'ON',
+11516=>'ON',
+11517=>'ON',
+11518=>'ON',
+11519=>'ON',
+11520=>'L',
+11521=>'L',
+11522=>'L',
+11523=>'L',
+11524=>'L',
+11525=>'L',
+11526=>'L',
+11527=>'L',
+11528=>'L',
+11529=>'L',
+11530=>'L',
+11531=>'L',
+11532=>'L',
+11533=>'L',
+11534=>'L',
+11535=>'L',
+11536=>'L',
+11537=>'L',
+11538=>'L',
+11539=>'L',
+11540=>'L',
+11541=>'L',
+11542=>'L',
+11543=>'L',
+11544=>'L',
+11545=>'L',
+11546=>'L',
+11547=>'L',
+11548=>'L',
+11549=>'L',
+11550=>'L',
+11551=>'L',
+11552=>'L',
+11553=>'L',
+11554=>'L',
+11555=>'L',
+11556=>'L',
+11557=>'L',
+11568=>'L',
+11569=>'L',
+11570=>'L',
+11571=>'L',
+11572=>'L',
+11573=>'L',
+11574=>'L',
+11575=>'L',
+11576=>'L',
+11577=>'L',
+11578=>'L',
+11579=>'L',
+11580=>'L',
+11581=>'L',
+11582=>'L',
+11583=>'L',
+11584=>'L',
+11585=>'L',
+11586=>'L',
+11587=>'L',
+11588=>'L',
+11589=>'L',
+11590=>'L',
+11591=>'L',
+11592=>'L',
+11593=>'L',
+11594=>'L',
+11595=>'L',
+11596=>'L',
+11597=>'L',
+11598=>'L',
+11599=>'L',
+11600=>'L',
+11601=>'L',
+11602=>'L',
+11603=>'L',
+11604=>'L',
+11605=>'L',
+11606=>'L',
+11607=>'L',
+11608=>'L',
+11609=>'L',
+11610=>'L',
+11611=>'L',
+11612=>'L',
+11613=>'L',
+11614=>'L',
+11615=>'L',
+11616=>'L',
+11617=>'L',
+11618=>'L',
+11619=>'L',
+11620=>'L',
+11621=>'L',
+11631=>'L',
+11648=>'L',
+11649=>'L',
+11650=>'L',
+11651=>'L',
+11652=>'L',
+11653=>'L',
+11654=>'L',
+11655=>'L',
+11656=>'L',
+11657=>'L',
+11658=>'L',
+11659=>'L',
+11660=>'L',
+11661=>'L',
+11662=>'L',
+11663=>'L',
+11664=>'L',
+11665=>'L',
+11666=>'L',
+11667=>'L',
+11668=>'L',
+11669=>'L',
+11670=>'L',
+11680=>'L',
+11681=>'L',
+11682=>'L',
+11683=>'L',
+11684=>'L',
+11685=>'L',
+11686=>'L',
+11688=>'L',
+11689=>'L',
+11690=>'L',
+11691=>'L',
+11692=>'L',
+11693=>'L',
+11694=>'L',
+11696=>'L',
+11697=>'L',
+11698=>'L',
+11699=>'L',
+11700=>'L',
+11701=>'L',
+11702=>'L',
+11704=>'L',
+11705=>'L',
+11706=>'L',
+11707=>'L',
+11708=>'L',
+11709=>'L',
+11710=>'L',
+11712=>'L',
+11713=>'L',
+11714=>'L',
+11715=>'L',
+11716=>'L',
+11717=>'L',
+11718=>'L',
+11720=>'L',
+11721=>'L',
+11722=>'L',
+11723=>'L',
+11724=>'L',
+11725=>'L',
+11726=>'L',
+11728=>'L',
+11729=>'L',
+11730=>'L',
+11731=>'L',
+11732=>'L',
+11733=>'L',
+11734=>'L',
+11736=>'L',
+11737=>'L',
+11738=>'L',
+11739=>'L',
+11740=>'L',
+11741=>'L',
+11742=>'L',
+11776=>'ON',
+11777=>'ON',
+11778=>'ON',
+11779=>'ON',
+11780=>'ON',
+11781=>'ON',
+11782=>'ON',
+11783=>'ON',
+11784=>'ON',
+11785=>'ON',
+11786=>'ON',
+11787=>'ON',
+11788=>'ON',
+11789=>'ON',
+11790=>'ON',
+11791=>'ON',
+11792=>'ON',
+11793=>'ON',
+11794=>'ON',
+11795=>'ON',
+11796=>'ON',
+11797=>'ON',
+11798=>'ON',
+11799=>'ON',
+11804=>'ON',
+11805=>'ON',
+11904=>'ON',
+11905=>'ON',
+11906=>'ON',
+11907=>'ON',
+11908=>'ON',
+11909=>'ON',
+11910=>'ON',
+11911=>'ON',
+11912=>'ON',
+11913=>'ON',
+11914=>'ON',
+11915=>'ON',
+11916=>'ON',
+11917=>'ON',
+11918=>'ON',
+11919=>'ON',
+11920=>'ON',
+11921=>'ON',
+11922=>'ON',
+11923=>'ON',
+11924=>'ON',
+11925=>'ON',
+11926=>'ON',
+11927=>'ON',
+11928=>'ON',
+11929=>'ON',
+11931=>'ON',
+11932=>'ON',
+11933=>'ON',
+11934=>'ON',
+11935=>'ON',
+11936=>'ON',
+11937=>'ON',
+11938=>'ON',
+11939=>'ON',
+11940=>'ON',
+11941=>'ON',
+11942=>'ON',
+11943=>'ON',
+11944=>'ON',
+11945=>'ON',
+11946=>'ON',
+11947=>'ON',
+11948=>'ON',
+11949=>'ON',
+11950=>'ON',
+11951=>'ON',
+11952=>'ON',
+11953=>'ON',
+11954=>'ON',
+11955=>'ON',
+11956=>'ON',
+11957=>'ON',
+11958=>'ON',
+11959=>'ON',
+11960=>'ON',
+11961=>'ON',
+11962=>'ON',
+11963=>'ON',
+11964=>'ON',
+11965=>'ON',
+11966=>'ON',
+11967=>'ON',
+11968=>'ON',
+11969=>'ON',
+11970=>'ON',
+11971=>'ON',
+11972=>'ON',
+11973=>'ON',
+11974=>'ON',
+11975=>'ON',
+11976=>'ON',
+11977=>'ON',
+11978=>'ON',
+11979=>'ON',
+11980=>'ON',
+11981=>'ON',
+11982=>'ON',
+11983=>'ON',
+11984=>'ON',
+11985=>'ON',
+11986=>'ON',
+11987=>'ON',
+11988=>'ON',
+11989=>'ON',
+11990=>'ON',
+11991=>'ON',
+11992=>'ON',
+11993=>'ON',
+11994=>'ON',
+11995=>'ON',
+11996=>'ON',
+11997=>'ON',
+11998=>'ON',
+11999=>'ON',
+12000=>'ON',
+12001=>'ON',
+12002=>'ON',
+12003=>'ON',
+12004=>'ON',
+12005=>'ON',
+12006=>'ON',
+12007=>'ON',
+12008=>'ON',
+12009=>'ON',
+12010=>'ON',
+12011=>'ON',
+12012=>'ON',
+12013=>'ON',
+12014=>'ON',
+12015=>'ON',
+12016=>'ON',
+12017=>'ON',
+12018=>'ON',
+12019=>'ON',
+12032=>'ON',
+12033=>'ON',
+12034=>'ON',
+12035=>'ON',
+12036=>'ON',
+12037=>'ON',
+12038=>'ON',
+12039=>'ON',
+12040=>'ON',
+12041=>'ON',
+12042=>'ON',
+12043=>'ON',
+12044=>'ON',
+12045=>'ON',
+12046=>'ON',
+12047=>'ON',
+12048=>'ON',
+12049=>'ON',
+12050=>'ON',
+12051=>'ON',
+12052=>'ON',
+12053=>'ON',
+12054=>'ON',
+12055=>'ON',
+12056=>'ON',
+12057=>'ON',
+12058=>'ON',
+12059=>'ON',
+12060=>'ON',
+12061=>'ON',
+12062=>'ON',
+12063=>'ON',
+12064=>'ON',
+12065=>'ON',
+12066=>'ON',
+12067=>'ON',
+12068=>'ON',
+12069=>'ON',
+12070=>'ON',
+12071=>'ON',
+12072=>'ON',
+12073=>'ON',
+12074=>'ON',
+12075=>'ON',
+12076=>'ON',
+12077=>'ON',
+12078=>'ON',
+12079=>'ON',
+12080=>'ON',
+12081=>'ON',
+12082=>'ON',
+12083=>'ON',
+12084=>'ON',
+12085=>'ON',
+12086=>'ON',
+12087=>'ON',
+12088=>'ON',
+12089=>'ON',
+12090=>'ON',
+12091=>'ON',
+12092=>'ON',
+12093=>'ON',
+12094=>'ON',
+12095=>'ON',
+12096=>'ON',
+12097=>'ON',
+12098=>'ON',
+12099=>'ON',
+12100=>'ON',
+12101=>'ON',
+12102=>'ON',
+12103=>'ON',
+12104=>'ON',
+12105=>'ON',
+12106=>'ON',
+12107=>'ON',
+12108=>'ON',
+12109=>'ON',
+12110=>'ON',
+12111=>'ON',
+12112=>'ON',
+12113=>'ON',
+12114=>'ON',
+12115=>'ON',
+12116=>'ON',
+12117=>'ON',
+12118=>'ON',
+12119=>'ON',
+12120=>'ON',
+12121=>'ON',
+12122=>'ON',
+12123=>'ON',
+12124=>'ON',
+12125=>'ON',
+12126=>'ON',
+12127=>'ON',
+12128=>'ON',
+12129=>'ON',
+12130=>'ON',
+12131=>'ON',
+12132=>'ON',
+12133=>'ON',
+12134=>'ON',
+12135=>'ON',
+12136=>'ON',
+12137=>'ON',
+12138=>'ON',
+12139=>'ON',
+12140=>'ON',
+12141=>'ON',
+12142=>'ON',
+12143=>'ON',
+12144=>'ON',
+12145=>'ON',
+12146=>'ON',
+12147=>'ON',
+12148=>'ON',
+12149=>'ON',
+12150=>'ON',
+12151=>'ON',
+12152=>'ON',
+12153=>'ON',
+12154=>'ON',
+12155=>'ON',
+12156=>'ON',
+12157=>'ON',
+12158=>'ON',
+12159=>'ON',
+12160=>'ON',
+12161=>'ON',
+12162=>'ON',
+12163=>'ON',
+12164=>'ON',
+12165=>'ON',
+12166=>'ON',
+12167=>'ON',
+12168=>'ON',
+12169=>'ON',
+12170=>'ON',
+12171=>'ON',
+12172=>'ON',
+12173=>'ON',
+12174=>'ON',
+12175=>'ON',
+12176=>'ON',
+12177=>'ON',
+12178=>'ON',
+12179=>'ON',
+12180=>'ON',
+12181=>'ON',
+12182=>'ON',
+12183=>'ON',
+12184=>'ON',
+12185=>'ON',
+12186=>'ON',
+12187=>'ON',
+12188=>'ON',
+12189=>'ON',
+12190=>'ON',
+12191=>'ON',
+12192=>'ON',
+12193=>'ON',
+12194=>'ON',
+12195=>'ON',
+12196=>'ON',
+12197=>'ON',
+12198=>'ON',
+12199=>'ON',
+12200=>'ON',
+12201=>'ON',
+12202=>'ON',
+12203=>'ON',
+12204=>'ON',
+12205=>'ON',
+12206=>'ON',
+12207=>'ON',
+12208=>'ON',
+12209=>'ON',
+12210=>'ON',
+12211=>'ON',
+12212=>'ON',
+12213=>'ON',
+12214=>'ON',
+12215=>'ON',
+12216=>'ON',
+12217=>'ON',
+12218=>'ON',
+12219=>'ON',
+12220=>'ON',
+12221=>'ON',
+12222=>'ON',
+12223=>'ON',
+12224=>'ON',
+12225=>'ON',
+12226=>'ON',
+12227=>'ON',
+12228=>'ON',
+12229=>'ON',
+12230=>'ON',
+12231=>'ON',
+12232=>'ON',
+12233=>'ON',
+12234=>'ON',
+12235=>'ON',
+12236=>'ON',
+12237=>'ON',
+12238=>'ON',
+12239=>'ON',
+12240=>'ON',
+12241=>'ON',
+12242=>'ON',
+12243=>'ON',
+12244=>'ON',
+12245=>'ON',
+12272=>'ON',
+12273=>'ON',
+12274=>'ON',
+12275=>'ON',
+12276=>'ON',
+12277=>'ON',
+12278=>'ON',
+12279=>'ON',
+12280=>'ON',
+12281=>'ON',
+12282=>'ON',
+12283=>'ON',
+12288=>'WS',
+12289=>'ON',
+12290=>'ON',
+12291=>'ON',
+12292=>'ON',
+12293=>'L',
+12294=>'L',
+12295=>'L',
+12296=>'ON',
+12297=>'ON',
+12298=>'ON',
+12299=>'ON',
+12300=>'ON',
+12301=>'ON',
+12302=>'ON',
+12303=>'ON',
+12304=>'ON',
+12305=>'ON',
+12306=>'ON',
+12307=>'ON',
+12308=>'ON',
+12309=>'ON',
+12310=>'ON',
+12311=>'ON',
+12312=>'ON',
+12313=>'ON',
+12314=>'ON',
+12315=>'ON',
+12316=>'ON',
+12317=>'ON',
+12318=>'ON',
+12319=>'ON',
+12320=>'ON',
+12321=>'L',
+12322=>'L',
+12323=>'L',
+12324=>'L',
+12325=>'L',
+12326=>'L',
+12327=>'L',
+12328=>'L',
+12329=>'L',
+12330=>'NSM',
+12331=>'NSM',
+12332=>'NSM',
+12333=>'NSM',
+12334=>'NSM',
+12335=>'NSM',
+12336=>'ON',
+12337=>'L',
+12338=>'L',
+12339=>'L',
+12340=>'L',
+12341=>'L',
+12342=>'ON',
+12343=>'ON',
+12344=>'L',
+12345=>'L',
+12346=>'L',
+12347=>'L',
+12348=>'L',
+12349=>'ON',
+12350=>'ON',
+12351=>'ON',
+12353=>'L',
+12354=>'L',
+12355=>'L',
+12356=>'L',
+12357=>'L',
+12358=>'L',
+12359=>'L',
+12360=>'L',
+12361=>'L',
+12362=>'L',
+12363=>'L',
+12364=>'L',
+12365=>'L',
+12366=>'L',
+12367=>'L',
+12368=>'L',
+12369=>'L',
+12370=>'L',
+12371=>'L',
+12372=>'L',
+12373=>'L',
+12374=>'L',
+12375=>'L',
+12376=>'L',
+12377=>'L',
+12378=>'L',
+12379=>'L',
+12380=>'L',
+12381=>'L',
+12382=>'L',
+12383=>'L',
+12384=>'L',
+12385=>'L',
+12386=>'L',
+12387=>'L',
+12388=>'L',
+12389=>'L',
+12390=>'L',
+12391=>'L',
+12392=>'L',
+12393=>'L',
+12394=>'L',
+12395=>'L',
+12396=>'L',
+12397=>'L',
+12398=>'L',
+12399=>'L',
+12400=>'L',
+12401=>'L',
+12402=>'L',
+12403=>'L',
+12404=>'L',
+12405=>'L',
+12406=>'L',
+12407=>'L',
+12408=>'L',
+12409=>'L',
+12410=>'L',
+12411=>'L',
+12412=>'L',
+12413=>'L',
+12414=>'L',
+12415=>'L',
+12416=>'L',
+12417=>'L',
+12418=>'L',
+12419=>'L',
+12420=>'L',
+12421=>'L',
+12422=>'L',
+12423=>'L',
+12424=>'L',
+12425=>'L',
+12426=>'L',
+12427=>'L',
+12428=>'L',
+12429=>'L',
+12430=>'L',
+12431=>'L',
+12432=>'L',
+12433=>'L',
+12434=>'L',
+12435=>'L',
+12436=>'L',
+12437=>'L',
+12438=>'L',
+12441=>'NSM',
+12442=>'NSM',
+12443=>'ON',
+12444=>'ON',
+12445=>'L',
+12446=>'L',
+12447=>'L',
+12448=>'ON',
+12449=>'L',
+12450=>'L',
+12451=>'L',
+12452=>'L',
+12453=>'L',
+12454=>'L',
+12455=>'L',
+12456=>'L',
+12457=>'L',
+12458=>'L',
+12459=>'L',
+12460=>'L',
+12461=>'L',
+12462=>'L',
+12463=>'L',
+12464=>'L',
+12465=>'L',
+12466=>'L',
+12467=>'L',
+12468=>'L',
+12469=>'L',
+12470=>'L',
+12471=>'L',
+12472=>'L',
+12473=>'L',
+12474=>'L',
+12475=>'L',
+12476=>'L',
+12477=>'L',
+12478=>'L',
+12479=>'L',
+12480=>'L',
+12481=>'L',
+12482=>'L',
+12483=>'L',
+12484=>'L',
+12485=>'L',
+12486=>'L',
+12487=>'L',
+12488=>'L',
+12489=>'L',
+12490=>'L',
+12491=>'L',
+12492=>'L',
+12493=>'L',
+12494=>'L',
+12495=>'L',
+12496=>'L',
+12497=>'L',
+12498=>'L',
+12499=>'L',
+12500=>'L',
+12501=>'L',
+12502=>'L',
+12503=>'L',
+12504=>'L',
+12505=>'L',
+12506=>'L',
+12507=>'L',
+12508=>'L',
+12509=>'L',
+12510=>'L',
+12511=>'L',
+12512=>'L',
+12513=>'L',
+12514=>'L',
+12515=>'L',
+12516=>'L',
+12517=>'L',
+12518=>'L',
+12519=>'L',
+12520=>'L',
+12521=>'L',
+12522=>'L',
+12523=>'L',
+12524=>'L',
+12525=>'L',
+12526=>'L',
+12527=>'L',
+12528=>'L',
+12529=>'L',
+12530=>'L',
+12531=>'L',
+12532=>'L',
+12533=>'L',
+12534=>'L',
+12535=>'L',
+12536=>'L',
+12537=>'L',
+12538=>'L',
+12539=>'ON',
+12540=>'L',
+12541=>'L',
+12542=>'L',
+12543=>'L',
+12549=>'L',
+12550=>'L',
+12551=>'L',
+12552=>'L',
+12553=>'L',
+12554=>'L',
+12555=>'L',
+12556=>'L',
+12557=>'L',
+12558=>'L',
+12559=>'L',
+12560=>'L',
+12561=>'L',
+12562=>'L',
+12563=>'L',
+12564=>'L',
+12565=>'L',
+12566=>'L',
+12567=>'L',
+12568=>'L',
+12569=>'L',
+12570=>'L',
+12571=>'L',
+12572=>'L',
+12573=>'L',
+12574=>'L',
+12575=>'L',
+12576=>'L',
+12577=>'L',
+12578=>'L',
+12579=>'L',
+12580=>'L',
+12581=>'L',
+12582=>'L',
+12583=>'L',
+12584=>'L',
+12585=>'L',
+12586=>'L',
+12587=>'L',
+12588=>'L',
+12593=>'L',
+12594=>'L',
+12595=>'L',
+12596=>'L',
+12597=>'L',
+12598=>'L',
+12599=>'L',
+12600=>'L',
+12601=>'L',
+12602=>'L',
+12603=>'L',
+12604=>'L',
+12605=>'L',
+12606=>'L',
+12607=>'L',
+12608=>'L',
+12609=>'L',
+12610=>'L',
+12611=>'L',
+12612=>'L',
+12613=>'L',
+12614=>'L',
+12615=>'L',
+12616=>'L',
+12617=>'L',
+12618=>'L',
+12619=>'L',
+12620=>'L',
+12621=>'L',
+12622=>'L',
+12623=>'L',
+12624=>'L',
+12625=>'L',
+12626=>'L',
+12627=>'L',
+12628=>'L',
+12629=>'L',
+12630=>'L',
+12631=>'L',
+12632=>'L',
+12633=>'L',
+12634=>'L',
+12635=>'L',
+12636=>'L',
+12637=>'L',
+12638=>'L',
+12639=>'L',
+12640=>'L',
+12641=>'L',
+12642=>'L',
+12643=>'L',
+12644=>'L',
+12645=>'L',
+12646=>'L',
+12647=>'L',
+12648=>'L',
+12649=>'L',
+12650=>'L',
+12651=>'L',
+12652=>'L',
+12653=>'L',
+12654=>'L',
+12655=>'L',
+12656=>'L',
+12657=>'L',
+12658=>'L',
+12659=>'L',
+12660=>'L',
+12661=>'L',
+12662=>'L',
+12663=>'L',
+12664=>'L',
+12665=>'L',
+12666=>'L',
+12667=>'L',
+12668=>'L',
+12669=>'L',
+12670=>'L',
+12671=>'L',
+12672=>'L',
+12673=>'L',
+12674=>'L',
+12675=>'L',
+12676=>'L',
+12677=>'L',
+12678=>'L',
+12679=>'L',
+12680=>'L',
+12681=>'L',
+12682=>'L',
+12683=>'L',
+12684=>'L',
+12685=>'L',
+12686=>'L',
+12688=>'L',
+12689=>'L',
+12690=>'L',
+12691=>'L',
+12692=>'L',
+12693=>'L',
+12694=>'L',
+12695=>'L',
+12696=>'L',
+12697=>'L',
+12698=>'L',
+12699=>'L',
+12700=>'L',
+12701=>'L',
+12702=>'L',
+12703=>'L',
+12704=>'L',
+12705=>'L',
+12706=>'L',
+12707=>'L',
+12708=>'L',
+12709=>'L',
+12710=>'L',
+12711=>'L',
+12712=>'L',
+12713=>'L',
+12714=>'L',
+12715=>'L',
+12716=>'L',
+12717=>'L',
+12718=>'L',
+12719=>'L',
+12720=>'L',
+12721=>'L',
+12722=>'L',
+12723=>'L',
+12724=>'L',
+12725=>'L',
+12726=>'L',
+12727=>'L',
+12736=>'ON',
+12737=>'ON',
+12738=>'ON',
+12739=>'ON',
+12740=>'ON',
+12741=>'ON',
+12742=>'ON',
+12743=>'ON',
+12744=>'ON',
+12745=>'ON',
+12746=>'ON',
+12747=>'ON',
+12748=>'ON',
+12749=>'ON',
+12750=>'ON',
+12751=>'ON',
+12784=>'L',
+12785=>'L',
+12786=>'L',
+12787=>'L',
+12788=>'L',
+12789=>'L',
+12790=>'L',
+12791=>'L',
+12792=>'L',
+12793=>'L',
+12794=>'L',
+12795=>'L',
+12796=>'L',
+12797=>'L',
+12798=>'L',
+12799=>'L',
+12800=>'L',
+12801=>'L',
+12802=>'L',
+12803=>'L',
+12804=>'L',
+12805=>'L',
+12806=>'L',
+12807=>'L',
+12808=>'L',
+12809=>'L',
+12810=>'L',
+12811=>'L',
+12812=>'L',
+12813=>'L',
+12814=>'L',
+12815=>'L',
+12816=>'L',
+12817=>'L',
+12818=>'L',
+12819=>'L',
+12820=>'L',
+12821=>'L',
+12822=>'L',
+12823=>'L',
+12824=>'L',
+12825=>'L',
+12826=>'L',
+12827=>'L',
+12828=>'L',
+12829=>'ON',
+12830=>'ON',
+12832=>'L',
+12833=>'L',
+12834=>'L',
+12835=>'L',
+12836=>'L',
+12837=>'L',
+12838=>'L',
+12839=>'L',
+12840=>'L',
+12841=>'L',
+12842=>'L',
+12843=>'L',
+12844=>'L',
+12845=>'L',
+12846=>'L',
+12847=>'L',
+12848=>'L',
+12849=>'L',
+12850=>'L',
+12851=>'L',
+12852=>'L',
+12853=>'L',
+12854=>'L',
+12855=>'L',
+12856=>'L',
+12857=>'L',
+12858=>'L',
+12859=>'L',
+12860=>'L',
+12861=>'L',
+12862=>'L',
+12863=>'L',
+12864=>'L',
+12865=>'L',
+12866=>'L',
+12867=>'L',
+12880=>'ON',
+12881=>'ON',
+12882=>'ON',
+12883=>'ON',
+12884=>'ON',
+12885=>'ON',
+12886=>'ON',
+12887=>'ON',
+12888=>'ON',
+12889=>'ON',
+12890=>'ON',
+12891=>'ON',
+12892=>'ON',
+12893=>'ON',
+12894=>'ON',
+12895=>'ON',
+12896=>'L',
+12897=>'L',
+12898=>'L',
+12899=>'L',
+12900=>'L',
+12901=>'L',
+12902=>'L',
+12903=>'L',
+12904=>'L',
+12905=>'L',
+12906=>'L',
+12907=>'L',
+12908=>'L',
+12909=>'L',
+12910=>'L',
+12911=>'L',
+12912=>'L',
+12913=>'L',
+12914=>'L',
+12915=>'L',
+12916=>'L',
+12917=>'L',
+12918=>'L',
+12919=>'L',
+12920=>'L',
+12921=>'L',
+12922=>'L',
+12923=>'L',
+12924=>'ON',
+12925=>'ON',
+12926=>'ON',
+12927=>'L',
+12928=>'L',
+12929=>'L',
+12930=>'L',
+12931=>'L',
+12932=>'L',
+12933=>'L',
+12934=>'L',
+12935=>'L',
+12936=>'L',
+12937=>'L',
+12938=>'L',
+12939=>'L',
+12940=>'L',
+12941=>'L',
+12942=>'L',
+12943=>'L',
+12944=>'L',
+12945=>'L',
+12946=>'L',
+12947=>'L',
+12948=>'L',
+12949=>'L',
+12950=>'L',
+12951=>'L',
+12952=>'L',
+12953=>'L',
+12954=>'L',
+12955=>'L',
+12956=>'L',
+12957=>'L',
+12958=>'L',
+12959=>'L',
+12960=>'L',
+12961=>'L',
+12962=>'L',
+12963=>'L',
+12964=>'L',
+12965=>'L',
+12966=>'L',
+12967=>'L',
+12968=>'L',
+12969=>'L',
+12970=>'L',
+12971=>'L',
+12972=>'L',
+12973=>'L',
+12974=>'L',
+12975=>'L',
+12976=>'L',
+12977=>'ON',
+12978=>'ON',
+12979=>'ON',
+12980=>'ON',
+12981=>'ON',
+12982=>'ON',
+12983=>'ON',
+12984=>'ON',
+12985=>'ON',
+12986=>'ON',
+12987=>'ON',
+12988=>'ON',
+12989=>'ON',
+12990=>'ON',
+12991=>'ON',
+12992=>'L',
+12993=>'L',
+12994=>'L',
+12995=>'L',
+12996=>'L',
+12997=>'L',
+12998=>'L',
+12999=>'L',
+13000=>'L',
+13001=>'L',
+13002=>'L',
+13003=>'L',
+13004=>'ON',
+13005=>'ON',
+13006=>'ON',
+13007=>'ON',
+13008=>'L',
+13009=>'L',
+13010=>'L',
+13011=>'L',
+13012=>'L',
+13013=>'L',
+13014=>'L',
+13015=>'L',
+13016=>'L',
+13017=>'L',
+13018=>'L',
+13019=>'L',
+13020=>'L',
+13021=>'L',
+13022=>'L',
+13023=>'L',
+13024=>'L',
+13025=>'L',
+13026=>'L',
+13027=>'L',
+13028=>'L',
+13029=>'L',
+13030=>'L',
+13031=>'L',
+13032=>'L',
+13033=>'L',
+13034=>'L',
+13035=>'L',
+13036=>'L',
+13037=>'L',
+13038=>'L',
+13039=>'L',
+13040=>'L',
+13041=>'L',
+13042=>'L',
+13043=>'L',
+13044=>'L',
+13045=>'L',
+13046=>'L',
+13047=>'L',
+13048=>'L',
+13049=>'L',
+13050=>'L',
+13051=>'L',
+13052=>'L',
+13053=>'L',
+13054=>'L',
+13056=>'L',
+13057=>'L',
+13058=>'L',
+13059=>'L',
+13060=>'L',
+13061=>'L',
+13062=>'L',
+13063=>'L',
+13064=>'L',
+13065=>'L',
+13066=>'L',
+13067=>'L',
+13068=>'L',
+13069=>'L',
+13070=>'L',
+13071=>'L',
+13072=>'L',
+13073=>'L',
+13074=>'L',
+13075=>'L',
+13076=>'L',
+13077=>'L',
+13078=>'L',
+13079=>'L',
+13080=>'L',
+13081=>'L',
+13082=>'L',
+13083=>'L',
+13084=>'L',
+13085=>'L',
+13086=>'L',
+13087=>'L',
+13088=>'L',
+13089=>'L',
+13090=>'L',
+13091=>'L',
+13092=>'L',
+13093=>'L',
+13094=>'L',
+13095=>'L',
+13096=>'L',
+13097=>'L',
+13098=>'L',
+13099=>'L',
+13100=>'L',
+13101=>'L',
+13102=>'L',
+13103=>'L',
+13104=>'L',
+13105=>'L',
+13106=>'L',
+13107=>'L',
+13108=>'L',
+13109=>'L',
+13110=>'L',
+13111=>'L',
+13112=>'L',
+13113=>'L',
+13114=>'L',
+13115=>'L',
+13116=>'L',
+13117=>'L',
+13118=>'L',
+13119=>'L',
+13120=>'L',
+13121=>'L',
+13122=>'L',
+13123=>'L',
+13124=>'L',
+13125=>'L',
+13126=>'L',
+13127=>'L',
+13128=>'L',
+13129=>'L',
+13130=>'L',
+13131=>'L',
+13132=>'L',
+13133=>'L',
+13134=>'L',
+13135=>'L',
+13136=>'L',
+13137=>'L',
+13138=>'L',
+13139=>'L',
+13140=>'L',
+13141=>'L',
+13142=>'L',
+13143=>'L',
+13144=>'L',
+13145=>'L',
+13146=>'L',
+13147=>'L',
+13148=>'L',
+13149=>'L',
+13150=>'L',
+13151=>'L',
+13152=>'L',
+13153=>'L',
+13154=>'L',
+13155=>'L',
+13156=>'L',
+13157=>'L',
+13158=>'L',
+13159=>'L',
+13160=>'L',
+13161=>'L',
+13162=>'L',
+13163=>'L',
+13164=>'L',
+13165=>'L',
+13166=>'L',
+13167=>'L',
+13168=>'L',
+13169=>'L',
+13170=>'L',
+13171=>'L',
+13172=>'L',
+13173=>'L',
+13174=>'L',
+13175=>'ON',
+13176=>'ON',
+13177=>'ON',
+13178=>'ON',
+13179=>'L',
+13180=>'L',
+13181=>'L',
+13182=>'L',
+13183=>'L',
+13184=>'L',
+13185=>'L',
+13186=>'L',
+13187=>'L',
+13188=>'L',
+13189=>'L',
+13190=>'L',
+13191=>'L',
+13192=>'L',
+13193=>'L',
+13194=>'L',
+13195=>'L',
+13196=>'L',
+13197=>'L',
+13198=>'L',
+13199=>'L',
+13200=>'L',
+13201=>'L',
+13202=>'L',
+13203=>'L',
+13204=>'L',
+13205=>'L',
+13206=>'L',
+13207=>'L',
+13208=>'L',
+13209=>'L',
+13210=>'L',
+13211=>'L',
+13212=>'L',
+13213=>'L',
+13214=>'L',
+13215=>'L',
+13216=>'L',
+13217=>'L',
+13218=>'L',
+13219=>'L',
+13220=>'L',
+13221=>'L',
+13222=>'L',
+13223=>'L',
+13224=>'L',
+13225=>'L',
+13226=>'L',
+13227=>'L',
+13228=>'L',
+13229=>'L',
+13230=>'L',
+13231=>'L',
+13232=>'L',
+13233=>'L',
+13234=>'L',
+13235=>'L',
+13236=>'L',
+13237=>'L',
+13238=>'L',
+13239=>'L',
+13240=>'L',
+13241=>'L',
+13242=>'L',
+13243=>'L',
+13244=>'L',
+13245=>'L',
+13246=>'L',
+13247=>'L',
+13248=>'L',
+13249=>'L',
+13250=>'L',
+13251=>'L',
+13252=>'L',
+13253=>'L',
+13254=>'L',
+13255=>'L',
+13256=>'L',
+13257=>'L',
+13258=>'L',
+13259=>'L',
+13260=>'L',
+13261=>'L',
+13262=>'L',
+13263=>'L',
+13264=>'L',
+13265=>'L',
+13266=>'L',
+13267=>'L',
+13268=>'L',
+13269=>'L',
+13270=>'L',
+13271=>'L',
+13272=>'L',
+13273=>'L',
+13274=>'L',
+13275=>'L',
+13276=>'L',
+13277=>'L',
+13278=>'ON',
+13279=>'ON',
+13280=>'L',
+13281=>'L',
+13282=>'L',
+13283=>'L',
+13284=>'L',
+13285=>'L',
+13286=>'L',
+13287=>'L',
+13288=>'L',
+13289=>'L',
+13290=>'L',
+13291=>'L',
+13292=>'L',
+13293=>'L',
+13294=>'L',
+13295=>'L',
+13296=>'L',
+13297=>'L',
+13298=>'L',
+13299=>'L',
+13300=>'L',
+13301=>'L',
+13302=>'L',
+13303=>'L',
+13304=>'L',
+13305=>'L',
+13306=>'L',
+13307=>'L',
+13308=>'L',
+13309=>'L',
+13310=>'L',
+13311=>'ON',
+13312=>'L',
+19893=>'L',
+19904=>'ON',
+19905=>'ON',
+19906=>'ON',
+19907=>'ON',
+19908=>'ON',
+19909=>'ON',
+19910=>'ON',
+19911=>'ON',
+19912=>'ON',
+19913=>'ON',
+19914=>'ON',
+19915=>'ON',
+19916=>'ON',
+19917=>'ON',
+19918=>'ON',
+19919=>'ON',
+19920=>'ON',
+19921=>'ON',
+19922=>'ON',
+19923=>'ON',
+19924=>'ON',
+19925=>'ON',
+19926=>'ON',
+19927=>'ON',
+19928=>'ON',
+19929=>'ON',
+19930=>'ON',
+19931=>'ON',
+19932=>'ON',
+19933=>'ON',
+19934=>'ON',
+19935=>'ON',
+19936=>'ON',
+19937=>'ON',
+19938=>'ON',
+19939=>'ON',
+19940=>'ON',
+19941=>'ON',
+19942=>'ON',
+19943=>'ON',
+19944=>'ON',
+19945=>'ON',
+19946=>'ON',
+19947=>'ON',
+19948=>'ON',
+19949=>'ON',
+19950=>'ON',
+19951=>'ON',
+19952=>'ON',
+19953=>'ON',
+19954=>'ON',
+19955=>'ON',
+19956=>'ON',
+19957=>'ON',
+19958=>'ON',
+19959=>'ON',
+19960=>'ON',
+19961=>'ON',
+19962=>'ON',
+19963=>'ON',
+19964=>'ON',
+19965=>'ON',
+19966=>'ON',
+19967=>'ON',
+19968=>'L',
+40891=>'L',
+40960=>'L',
+40961=>'L',
+40962=>'L',
+40963=>'L',
+40964=>'L',
+40965=>'L',
+40966=>'L',
+40967=>'L',
+40968=>'L',
+40969=>'L',
+40970=>'L',
+40971=>'L',
+40972=>'L',
+40973=>'L',
+40974=>'L',
+40975=>'L',
+40976=>'L',
+40977=>'L',
+40978=>'L',
+40979=>'L',
+40980=>'L',
+40981=>'L',
+40982=>'L',
+40983=>'L',
+40984=>'L',
+40985=>'L',
+40986=>'L',
+40987=>'L',
+40988=>'L',
+40989=>'L',
+40990=>'L',
+40991=>'L',
+40992=>'L',
+40993=>'L',
+40994=>'L',
+40995=>'L',
+40996=>'L',
+40997=>'L',
+40998=>'L',
+40999=>'L',
+41000=>'L',
+41001=>'L',
+41002=>'L',
+41003=>'L',
+41004=>'L',
+41005=>'L',
+41006=>'L',
+41007=>'L',
+41008=>'L',
+41009=>'L',
+41010=>'L',
+41011=>'L',
+41012=>'L',
+41013=>'L',
+41014=>'L',
+41015=>'L',
+41016=>'L',
+41017=>'L',
+41018=>'L',
+41019=>'L',
+41020=>'L',
+41021=>'L',
+41022=>'L',
+41023=>'L',
+41024=>'L',
+41025=>'L',
+41026=>'L',
+41027=>'L',
+41028=>'L',
+41029=>'L',
+41030=>'L',
+41031=>'L',
+41032=>'L',
+41033=>'L',
+41034=>'L',
+41035=>'L',
+41036=>'L',
+41037=>'L',
+41038=>'L',
+41039=>'L',
+41040=>'L',
+41041=>'L',
+41042=>'L',
+41043=>'L',
+41044=>'L',
+41045=>'L',
+41046=>'L',
+41047=>'L',
+41048=>'L',
+41049=>'L',
+41050=>'L',
+41051=>'L',
+41052=>'L',
+41053=>'L',
+41054=>'L',
+41055=>'L',
+41056=>'L',
+41057=>'L',
+41058=>'L',
+41059=>'L',
+41060=>'L',
+41061=>'L',
+41062=>'L',
+41063=>'L',
+41064=>'L',
+41065=>'L',
+41066=>'L',
+41067=>'L',
+41068=>'L',
+41069=>'L',
+41070=>'L',
+41071=>'L',
+41072=>'L',
+41073=>'L',
+41074=>'L',
+41075=>'L',
+41076=>'L',
+41077=>'L',
+41078=>'L',
+41079=>'L',
+41080=>'L',
+41081=>'L',
+41082=>'L',
+41083=>'L',
+41084=>'L',
+41085=>'L',
+41086=>'L',
+41087=>'L',
+41088=>'L',
+41089=>'L',
+41090=>'L',
+41091=>'L',
+41092=>'L',
+41093=>'L',
+41094=>'L',
+41095=>'L',
+41096=>'L',
+41097=>'L',
+41098=>'L',
+41099=>'L',
+41100=>'L',
+41101=>'L',
+41102=>'L',
+41103=>'L',
+41104=>'L',
+41105=>'L',
+41106=>'L',
+41107=>'L',
+41108=>'L',
+41109=>'L',
+41110=>'L',
+41111=>'L',
+41112=>'L',
+41113=>'L',
+41114=>'L',
+41115=>'L',
+41116=>'L',
+41117=>'L',
+41118=>'L',
+41119=>'L',
+41120=>'L',
+41121=>'L',
+41122=>'L',
+41123=>'L',
+41124=>'L',
+41125=>'L',
+41126=>'L',
+41127=>'L',
+41128=>'L',
+41129=>'L',
+41130=>'L',
+41131=>'L',
+41132=>'L',
+41133=>'L',
+41134=>'L',
+41135=>'L',
+41136=>'L',
+41137=>'L',
+41138=>'L',
+41139=>'L',
+41140=>'L',
+41141=>'L',
+41142=>'L',
+41143=>'L',
+41144=>'L',
+41145=>'L',
+41146=>'L',
+41147=>'L',
+41148=>'L',
+41149=>'L',
+41150=>'L',
+41151=>'L',
+41152=>'L',
+41153=>'L',
+41154=>'L',
+41155=>'L',
+41156=>'L',
+41157=>'L',
+41158=>'L',
+41159=>'L',
+41160=>'L',
+41161=>'L',
+41162=>'L',
+41163=>'L',
+41164=>'L',
+41165=>'L',
+41166=>'L',
+41167=>'L',
+41168=>'L',
+41169=>'L',
+41170=>'L',
+41171=>'L',
+41172=>'L',
+41173=>'L',
+41174=>'L',
+41175=>'L',
+41176=>'L',
+41177=>'L',
+41178=>'L',
+41179=>'L',
+41180=>'L',
+41181=>'L',
+41182=>'L',
+41183=>'L',
+41184=>'L',
+41185=>'L',
+41186=>'L',
+41187=>'L',
+41188=>'L',
+41189=>'L',
+41190=>'L',
+41191=>'L',
+41192=>'L',
+41193=>'L',
+41194=>'L',
+41195=>'L',
+41196=>'L',
+41197=>'L',
+41198=>'L',
+41199=>'L',
+41200=>'L',
+41201=>'L',
+41202=>'L',
+41203=>'L',
+41204=>'L',
+41205=>'L',
+41206=>'L',
+41207=>'L',
+41208=>'L',
+41209=>'L',
+41210=>'L',
+41211=>'L',
+41212=>'L',
+41213=>'L',
+41214=>'L',
+41215=>'L',
+41216=>'L',
+41217=>'L',
+41218=>'L',
+41219=>'L',
+41220=>'L',
+41221=>'L',
+41222=>'L',
+41223=>'L',
+41224=>'L',
+41225=>'L',
+41226=>'L',
+41227=>'L',
+41228=>'L',
+41229=>'L',
+41230=>'L',
+41231=>'L',
+41232=>'L',
+41233=>'L',
+41234=>'L',
+41235=>'L',
+41236=>'L',
+41237=>'L',
+41238=>'L',
+41239=>'L',
+41240=>'L',
+41241=>'L',
+41242=>'L',
+41243=>'L',
+41244=>'L',
+41245=>'L',
+41246=>'L',
+41247=>'L',
+41248=>'L',
+41249=>'L',
+41250=>'L',
+41251=>'L',
+41252=>'L',
+41253=>'L',
+41254=>'L',
+41255=>'L',
+41256=>'L',
+41257=>'L',
+41258=>'L',
+41259=>'L',
+41260=>'L',
+41261=>'L',
+41262=>'L',
+41263=>'L',
+41264=>'L',
+41265=>'L',
+41266=>'L',
+41267=>'L',
+41268=>'L',
+41269=>'L',
+41270=>'L',
+41271=>'L',
+41272=>'L',
+41273=>'L',
+41274=>'L',
+41275=>'L',
+41276=>'L',
+41277=>'L',
+41278=>'L',
+41279=>'L',
+41280=>'L',
+41281=>'L',
+41282=>'L',
+41283=>'L',
+41284=>'L',
+41285=>'L',
+41286=>'L',
+41287=>'L',
+41288=>'L',
+41289=>'L',
+41290=>'L',
+41291=>'L',
+41292=>'L',
+41293=>'L',
+41294=>'L',
+41295=>'L',
+41296=>'L',
+41297=>'L',
+41298=>'L',
+41299=>'L',
+41300=>'L',
+41301=>'L',
+41302=>'L',
+41303=>'L',
+41304=>'L',
+41305=>'L',
+41306=>'L',
+41307=>'L',
+41308=>'L',
+41309=>'L',
+41310=>'L',
+41311=>'L',
+41312=>'L',
+41313=>'L',
+41314=>'L',
+41315=>'L',
+41316=>'L',
+41317=>'L',
+41318=>'L',
+41319=>'L',
+41320=>'L',
+41321=>'L',
+41322=>'L',
+41323=>'L',
+41324=>'L',
+41325=>'L',
+41326=>'L',
+41327=>'L',
+41328=>'L',
+41329=>'L',
+41330=>'L',
+41331=>'L',
+41332=>'L',
+41333=>'L',
+41334=>'L',
+41335=>'L',
+41336=>'L',
+41337=>'L',
+41338=>'L',
+41339=>'L',
+41340=>'L',
+41341=>'L',
+41342=>'L',
+41343=>'L',
+41344=>'L',
+41345=>'L',
+41346=>'L',
+41347=>'L',
+41348=>'L',
+41349=>'L',
+41350=>'L',
+41351=>'L',
+41352=>'L',
+41353=>'L',
+41354=>'L',
+41355=>'L',
+41356=>'L',
+41357=>'L',
+41358=>'L',
+41359=>'L',
+41360=>'L',
+41361=>'L',
+41362=>'L',
+41363=>'L',
+41364=>'L',
+41365=>'L',
+41366=>'L',
+41367=>'L',
+41368=>'L',
+41369=>'L',
+41370=>'L',
+41371=>'L',
+41372=>'L',
+41373=>'L',
+41374=>'L',
+41375=>'L',
+41376=>'L',
+41377=>'L',
+41378=>'L',
+41379=>'L',
+41380=>'L',
+41381=>'L',
+41382=>'L',
+41383=>'L',
+41384=>'L',
+41385=>'L',
+41386=>'L',
+41387=>'L',
+41388=>'L',
+41389=>'L',
+41390=>'L',
+41391=>'L',
+41392=>'L',
+41393=>'L',
+41394=>'L',
+41395=>'L',
+41396=>'L',
+41397=>'L',
+41398=>'L',
+41399=>'L',
+41400=>'L',
+41401=>'L',
+41402=>'L',
+41403=>'L',
+41404=>'L',
+41405=>'L',
+41406=>'L',
+41407=>'L',
+41408=>'L',
+41409=>'L',
+41410=>'L',
+41411=>'L',
+41412=>'L',
+41413=>'L',
+41414=>'L',
+41415=>'L',
+41416=>'L',
+41417=>'L',
+41418=>'L',
+41419=>'L',
+41420=>'L',
+41421=>'L',
+41422=>'L',
+41423=>'L',
+41424=>'L',
+41425=>'L',
+41426=>'L',
+41427=>'L',
+41428=>'L',
+41429=>'L',
+41430=>'L',
+41431=>'L',
+41432=>'L',
+41433=>'L',
+41434=>'L',
+41435=>'L',
+41436=>'L',
+41437=>'L',
+41438=>'L',
+41439=>'L',
+41440=>'L',
+41441=>'L',
+41442=>'L',
+41443=>'L',
+41444=>'L',
+41445=>'L',
+41446=>'L',
+41447=>'L',
+41448=>'L',
+41449=>'L',
+41450=>'L',
+41451=>'L',
+41452=>'L',
+41453=>'L',
+41454=>'L',
+41455=>'L',
+41456=>'L',
+41457=>'L',
+41458=>'L',
+41459=>'L',
+41460=>'L',
+41461=>'L',
+41462=>'L',
+41463=>'L',
+41464=>'L',
+41465=>'L',
+41466=>'L',
+41467=>'L',
+41468=>'L',
+41469=>'L',
+41470=>'L',
+41471=>'L',
+41472=>'L',
+41473=>'L',
+41474=>'L',
+41475=>'L',
+41476=>'L',
+41477=>'L',
+41478=>'L',
+41479=>'L',
+41480=>'L',
+41481=>'L',
+41482=>'L',
+41483=>'L',
+41484=>'L',
+41485=>'L',
+41486=>'L',
+41487=>'L',
+41488=>'L',
+41489=>'L',
+41490=>'L',
+41491=>'L',
+41492=>'L',
+41493=>'L',
+41494=>'L',
+41495=>'L',
+41496=>'L',
+41497=>'L',
+41498=>'L',
+41499=>'L',
+41500=>'L',
+41501=>'L',
+41502=>'L',
+41503=>'L',
+41504=>'L',
+41505=>'L',
+41506=>'L',
+41507=>'L',
+41508=>'L',
+41509=>'L',
+41510=>'L',
+41511=>'L',
+41512=>'L',
+41513=>'L',
+41514=>'L',
+41515=>'L',
+41516=>'L',
+41517=>'L',
+41518=>'L',
+41519=>'L',
+41520=>'L',
+41521=>'L',
+41522=>'L',
+41523=>'L',
+41524=>'L',
+41525=>'L',
+41526=>'L',
+41527=>'L',
+41528=>'L',
+41529=>'L',
+41530=>'L',
+41531=>'L',
+41532=>'L',
+41533=>'L',
+41534=>'L',
+41535=>'L',
+41536=>'L',
+41537=>'L',
+41538=>'L',
+41539=>'L',
+41540=>'L',
+41541=>'L',
+41542=>'L',
+41543=>'L',
+41544=>'L',
+41545=>'L',
+41546=>'L',
+41547=>'L',
+41548=>'L',
+41549=>'L',
+41550=>'L',
+41551=>'L',
+41552=>'L',
+41553=>'L',
+41554=>'L',
+41555=>'L',
+41556=>'L',
+41557=>'L',
+41558=>'L',
+41559=>'L',
+41560=>'L',
+41561=>'L',
+41562=>'L',
+41563=>'L',
+41564=>'L',
+41565=>'L',
+41566=>'L',
+41567=>'L',
+41568=>'L',
+41569=>'L',
+41570=>'L',
+41571=>'L',
+41572=>'L',
+41573=>'L',
+41574=>'L',
+41575=>'L',
+41576=>'L',
+41577=>'L',
+41578=>'L',
+41579=>'L',
+41580=>'L',
+41581=>'L',
+41582=>'L',
+41583=>'L',
+41584=>'L',
+41585=>'L',
+41586=>'L',
+41587=>'L',
+41588=>'L',
+41589=>'L',
+41590=>'L',
+41591=>'L',
+41592=>'L',
+41593=>'L',
+41594=>'L',
+41595=>'L',
+41596=>'L',
+41597=>'L',
+41598=>'L',
+41599=>'L',
+41600=>'L',
+41601=>'L',
+41602=>'L',
+41603=>'L',
+41604=>'L',
+41605=>'L',
+41606=>'L',
+41607=>'L',
+41608=>'L',
+41609=>'L',
+41610=>'L',
+41611=>'L',
+41612=>'L',
+41613=>'L',
+41614=>'L',
+41615=>'L',
+41616=>'L',
+41617=>'L',
+41618=>'L',
+41619=>'L',
+41620=>'L',
+41621=>'L',
+41622=>'L',
+41623=>'L',
+41624=>'L',
+41625=>'L',
+41626=>'L',
+41627=>'L',
+41628=>'L',
+41629=>'L',
+41630=>'L',
+41631=>'L',
+41632=>'L',
+41633=>'L',
+41634=>'L',
+41635=>'L',
+41636=>'L',
+41637=>'L',
+41638=>'L',
+41639=>'L',
+41640=>'L',
+41641=>'L',
+41642=>'L',
+41643=>'L',
+41644=>'L',
+41645=>'L',
+41646=>'L',
+41647=>'L',
+41648=>'L',
+41649=>'L',
+41650=>'L',
+41651=>'L',
+41652=>'L',
+41653=>'L',
+41654=>'L',
+41655=>'L',
+41656=>'L',
+41657=>'L',
+41658=>'L',
+41659=>'L',
+41660=>'L',
+41661=>'L',
+41662=>'L',
+41663=>'L',
+41664=>'L',
+41665=>'L',
+41666=>'L',
+41667=>'L',
+41668=>'L',
+41669=>'L',
+41670=>'L',
+41671=>'L',
+41672=>'L',
+41673=>'L',
+41674=>'L',
+41675=>'L',
+41676=>'L',
+41677=>'L',
+41678=>'L',
+41679=>'L',
+41680=>'L',
+41681=>'L',
+41682=>'L',
+41683=>'L',
+41684=>'L',
+41685=>'L',
+41686=>'L',
+41687=>'L',
+41688=>'L',
+41689=>'L',
+41690=>'L',
+41691=>'L',
+41692=>'L',
+41693=>'L',
+41694=>'L',
+41695=>'L',
+41696=>'L',
+41697=>'L',
+41698=>'L',
+41699=>'L',
+41700=>'L',
+41701=>'L',
+41702=>'L',
+41703=>'L',
+41704=>'L',
+41705=>'L',
+41706=>'L',
+41707=>'L',
+41708=>'L',
+41709=>'L',
+41710=>'L',
+41711=>'L',
+41712=>'L',
+41713=>'L',
+41714=>'L',
+41715=>'L',
+41716=>'L',
+41717=>'L',
+41718=>'L',
+41719=>'L',
+41720=>'L',
+41721=>'L',
+41722=>'L',
+41723=>'L',
+41724=>'L',
+41725=>'L',
+41726=>'L',
+41727=>'L',
+41728=>'L',
+41729=>'L',
+41730=>'L',
+41731=>'L',
+41732=>'L',
+41733=>'L',
+41734=>'L',
+41735=>'L',
+41736=>'L',
+41737=>'L',
+41738=>'L',
+41739=>'L',
+41740=>'L',
+41741=>'L',
+41742=>'L',
+41743=>'L',
+41744=>'L',
+41745=>'L',
+41746=>'L',
+41747=>'L',
+41748=>'L',
+41749=>'L',
+41750=>'L',
+41751=>'L',
+41752=>'L',
+41753=>'L',
+41754=>'L',
+41755=>'L',
+41756=>'L',
+41757=>'L',
+41758=>'L',
+41759=>'L',
+41760=>'L',
+41761=>'L',
+41762=>'L',
+41763=>'L',
+41764=>'L',
+41765=>'L',
+41766=>'L',
+41767=>'L',
+41768=>'L',
+41769=>'L',
+41770=>'L',
+41771=>'L',
+41772=>'L',
+41773=>'L',
+41774=>'L',
+41775=>'L',
+41776=>'L',
+41777=>'L',
+41778=>'L',
+41779=>'L',
+41780=>'L',
+41781=>'L',
+41782=>'L',
+41783=>'L',
+41784=>'L',
+41785=>'L',
+41786=>'L',
+41787=>'L',
+41788=>'L',
+41789=>'L',
+41790=>'L',
+41791=>'L',
+41792=>'L',
+41793=>'L',
+41794=>'L',
+41795=>'L',
+41796=>'L',
+41797=>'L',
+41798=>'L',
+41799=>'L',
+41800=>'L',
+41801=>'L',
+41802=>'L',
+41803=>'L',
+41804=>'L',
+41805=>'L',
+41806=>'L',
+41807=>'L',
+41808=>'L',
+41809=>'L',
+41810=>'L',
+41811=>'L',
+41812=>'L',
+41813=>'L',
+41814=>'L',
+41815=>'L',
+41816=>'L',
+41817=>'L',
+41818=>'L',
+41819=>'L',
+41820=>'L',
+41821=>'L',
+41822=>'L',
+41823=>'L',
+41824=>'L',
+41825=>'L',
+41826=>'L',
+41827=>'L',
+41828=>'L',
+41829=>'L',
+41830=>'L',
+41831=>'L',
+41832=>'L',
+41833=>'L',
+41834=>'L',
+41835=>'L',
+41836=>'L',
+41837=>'L',
+41838=>'L',
+41839=>'L',
+41840=>'L',
+41841=>'L',
+41842=>'L',
+41843=>'L',
+41844=>'L',
+41845=>'L',
+41846=>'L',
+41847=>'L',
+41848=>'L',
+41849=>'L',
+41850=>'L',
+41851=>'L',
+41852=>'L',
+41853=>'L',
+41854=>'L',
+41855=>'L',
+41856=>'L',
+41857=>'L',
+41858=>'L',
+41859=>'L',
+41860=>'L',
+41861=>'L',
+41862=>'L',
+41863=>'L',
+41864=>'L',
+41865=>'L',
+41866=>'L',
+41867=>'L',
+41868=>'L',
+41869=>'L',
+41870=>'L',
+41871=>'L',
+41872=>'L',
+41873=>'L',
+41874=>'L',
+41875=>'L',
+41876=>'L',
+41877=>'L',
+41878=>'L',
+41879=>'L',
+41880=>'L',
+41881=>'L',
+41882=>'L',
+41883=>'L',
+41884=>'L',
+41885=>'L',
+41886=>'L',
+41887=>'L',
+41888=>'L',
+41889=>'L',
+41890=>'L',
+41891=>'L',
+41892=>'L',
+41893=>'L',
+41894=>'L',
+41895=>'L',
+41896=>'L',
+41897=>'L',
+41898=>'L',
+41899=>'L',
+41900=>'L',
+41901=>'L',
+41902=>'L',
+41903=>'L',
+41904=>'L',
+41905=>'L',
+41906=>'L',
+41907=>'L',
+41908=>'L',
+41909=>'L',
+41910=>'L',
+41911=>'L',
+41912=>'L',
+41913=>'L',
+41914=>'L',
+41915=>'L',
+41916=>'L',
+41917=>'L',
+41918=>'L',
+41919=>'L',
+41920=>'L',
+41921=>'L',
+41922=>'L',
+41923=>'L',
+41924=>'L',
+41925=>'L',
+41926=>'L',
+41927=>'L',
+41928=>'L',
+41929=>'L',
+41930=>'L',
+41931=>'L',
+41932=>'L',
+41933=>'L',
+41934=>'L',
+41935=>'L',
+41936=>'L',
+41937=>'L',
+41938=>'L',
+41939=>'L',
+41940=>'L',
+41941=>'L',
+41942=>'L',
+41943=>'L',
+41944=>'L',
+41945=>'L',
+41946=>'L',
+41947=>'L',
+41948=>'L',
+41949=>'L',
+41950=>'L',
+41951=>'L',
+41952=>'L',
+41953=>'L',
+41954=>'L',
+41955=>'L',
+41956=>'L',
+41957=>'L',
+41958=>'L',
+41959=>'L',
+41960=>'L',
+41961=>'L',
+41962=>'L',
+41963=>'L',
+41964=>'L',
+41965=>'L',
+41966=>'L',
+41967=>'L',
+41968=>'L',
+41969=>'L',
+41970=>'L',
+41971=>'L',
+41972=>'L',
+41973=>'L',
+41974=>'L',
+41975=>'L',
+41976=>'L',
+41977=>'L',
+41978=>'L',
+41979=>'L',
+41980=>'L',
+41981=>'L',
+41982=>'L',
+41983=>'L',
+41984=>'L',
+41985=>'L',
+41986=>'L',
+41987=>'L',
+41988=>'L',
+41989=>'L',
+41990=>'L',
+41991=>'L',
+41992=>'L',
+41993=>'L',
+41994=>'L',
+41995=>'L',
+41996=>'L',
+41997=>'L',
+41998=>'L',
+41999=>'L',
+42000=>'L',
+42001=>'L',
+42002=>'L',
+42003=>'L',
+42004=>'L',
+42005=>'L',
+42006=>'L',
+42007=>'L',
+42008=>'L',
+42009=>'L',
+42010=>'L',
+42011=>'L',
+42012=>'L',
+42013=>'L',
+42014=>'L',
+42015=>'L',
+42016=>'L',
+42017=>'L',
+42018=>'L',
+42019=>'L',
+42020=>'L',
+42021=>'L',
+42022=>'L',
+42023=>'L',
+42024=>'L',
+42025=>'L',
+42026=>'L',
+42027=>'L',
+42028=>'L',
+42029=>'L',
+42030=>'L',
+42031=>'L',
+42032=>'L',
+42033=>'L',
+42034=>'L',
+42035=>'L',
+42036=>'L',
+42037=>'L',
+42038=>'L',
+42039=>'L',
+42040=>'L',
+42041=>'L',
+42042=>'L',
+42043=>'L',
+42044=>'L',
+42045=>'L',
+42046=>'L',
+42047=>'L',
+42048=>'L',
+42049=>'L',
+42050=>'L',
+42051=>'L',
+42052=>'L',
+42053=>'L',
+42054=>'L',
+42055=>'L',
+42056=>'L',
+42057=>'L',
+42058=>'L',
+42059=>'L',
+42060=>'L',
+42061=>'L',
+42062=>'L',
+42063=>'L',
+42064=>'L',
+42065=>'L',
+42066=>'L',
+42067=>'L',
+42068=>'L',
+42069=>'L',
+42070=>'L',
+42071=>'L',
+42072=>'L',
+42073=>'L',
+42074=>'L',
+42075=>'L',
+42076=>'L',
+42077=>'L',
+42078=>'L',
+42079=>'L',
+42080=>'L',
+42081=>'L',
+42082=>'L',
+42083=>'L',
+42084=>'L',
+42085=>'L',
+42086=>'L',
+42087=>'L',
+42088=>'L',
+42089=>'L',
+42090=>'L',
+42091=>'L',
+42092=>'L',
+42093=>'L',
+42094=>'L',
+42095=>'L',
+42096=>'L',
+42097=>'L',
+42098=>'L',
+42099=>'L',
+42100=>'L',
+42101=>'L',
+42102=>'L',
+42103=>'L',
+42104=>'L',
+42105=>'L',
+42106=>'L',
+42107=>'L',
+42108=>'L',
+42109=>'L',
+42110=>'L',
+42111=>'L',
+42112=>'L',
+42113=>'L',
+42114=>'L',
+42115=>'L',
+42116=>'L',
+42117=>'L',
+42118=>'L',
+42119=>'L',
+42120=>'L',
+42121=>'L',
+42122=>'L',
+42123=>'L',
+42124=>'L',
+42128=>'ON',
+42129=>'ON',
+42130=>'ON',
+42131=>'ON',
+42132=>'ON',
+42133=>'ON',
+42134=>'ON',
+42135=>'ON',
+42136=>'ON',
+42137=>'ON',
+42138=>'ON',
+42139=>'ON',
+42140=>'ON',
+42141=>'ON',
+42142=>'ON',
+42143=>'ON',
+42144=>'ON',
+42145=>'ON',
+42146=>'ON',
+42147=>'ON',
+42148=>'ON',
+42149=>'ON',
+42150=>'ON',
+42151=>'ON',
+42152=>'ON',
+42153=>'ON',
+42154=>'ON',
+42155=>'ON',
+42156=>'ON',
+42157=>'ON',
+42158=>'ON',
+42159=>'ON',
+42160=>'ON',
+42161=>'ON',
+42162=>'ON',
+42163=>'ON',
+42164=>'ON',
+42165=>'ON',
+42166=>'ON',
+42167=>'ON',
+42168=>'ON',
+42169=>'ON',
+42170=>'ON',
+42171=>'ON',
+42172=>'ON',
+42173=>'ON',
+42174=>'ON',
+42175=>'ON',
+42176=>'ON',
+42177=>'ON',
+42178=>'ON',
+42179=>'ON',
+42180=>'ON',
+42181=>'ON',
+42182=>'ON',
+42752=>'ON',
+42753=>'ON',
+42754=>'ON',
+42755=>'ON',
+42756=>'ON',
+42757=>'ON',
+42758=>'ON',
+42759=>'ON',
+42760=>'ON',
+42761=>'ON',
+42762=>'ON',
+42763=>'ON',
+42764=>'ON',
+42765=>'ON',
+42766=>'ON',
+42767=>'ON',
+42768=>'ON',
+42769=>'ON',
+42770=>'ON',
+42771=>'ON',
+42772=>'ON',
+42773=>'ON',
+42774=>'ON',
+42775=>'ON',
+42776=>'ON',
+42777=>'ON',
+42778=>'ON',
+42784=>'ON',
+42785=>'ON',
+43008=>'L',
+43009=>'L',
+43010=>'NSM',
+43011=>'L',
+43012=>'L',
+43013=>'L',
+43014=>'NSM',
+43015=>'L',
+43016=>'L',
+43017=>'L',
+43018=>'L',
+43019=>'NSM',
+43020=>'L',
+43021=>'L',
+43022=>'L',
+43023=>'L',
+43024=>'L',
+43025=>'L',
+43026=>'L',
+43027=>'L',
+43028=>'L',
+43029=>'L',
+43030=>'L',
+43031=>'L',
+43032=>'L',
+43033=>'L',
+43034=>'L',
+43035=>'L',
+43036=>'L',
+43037=>'L',
+43038=>'L',
+43039=>'L',
+43040=>'L',
+43041=>'L',
+43042=>'L',
+43043=>'L',
+43044=>'L',
+43045=>'NSM',
+43046=>'NSM',
+43047=>'L',
+43048=>'ON',
+43049=>'ON',
+43050=>'ON',
+43051=>'ON',
+43072=>'L',
+43073=>'L',
+43074=>'L',
+43075=>'L',
+43076=>'L',
+43077=>'L',
+43078=>'L',
+43079=>'L',
+43080=>'L',
+43081=>'L',
+43082=>'L',
+43083=>'L',
+43084=>'L',
+43085=>'L',
+43086=>'L',
+43087=>'L',
+43088=>'L',
+43089=>'L',
+43090=>'L',
+43091=>'L',
+43092=>'L',
+43093=>'L',
+43094=>'L',
+43095=>'L',
+43096=>'L',
+43097=>'L',
+43098=>'L',
+43099=>'L',
+43100=>'L',
+43101=>'L',
+43102=>'L',
+43103=>'L',
+43104=>'L',
+43105=>'L',
+43106=>'L',
+43107=>'L',
+43108=>'L',
+43109=>'L',
+43110=>'L',
+43111=>'L',
+43112=>'L',
+43113=>'L',
+43114=>'L',
+43115=>'L',
+43116=>'L',
+43117=>'L',
+43118=>'L',
+43119=>'L',
+43120=>'L',
+43121=>'L',
+43122=>'L',
+43123=>'L',
+43124=>'ON',
+43125=>'ON',
+43126=>'ON',
+43127=>'ON',
+44032=>'L',
+55203=>'L',
+55296=>'L',
+56191=>'L',
+56192=>'L',
+56319=>'L',
+56320=>'L',
+57343=>'L',
+57344=>'L',
+63743=>'L',
+63744=>'L',
+63745=>'L',
+63746=>'L',
+63747=>'L',
+63748=>'L',
+63749=>'L',
+63750=>'L',
+63751=>'L',
+63752=>'L',
+63753=>'L',
+63754=>'L',
+63755=>'L',
+63756=>'L',
+63757=>'L',
+63758=>'L',
+63759=>'L',
+63760=>'L',
+63761=>'L',
+63762=>'L',
+63763=>'L',
+63764=>'L',
+63765=>'L',
+63766=>'L',
+63767=>'L',
+63768=>'L',
+63769=>'L',
+63770=>'L',
+63771=>'L',
+63772=>'L',
+63773=>'L',
+63774=>'L',
+63775=>'L',
+63776=>'L',
+63777=>'L',
+63778=>'L',
+63779=>'L',
+63780=>'L',
+63781=>'L',
+63782=>'L',
+63783=>'L',
+63784=>'L',
+63785=>'L',
+63786=>'L',
+63787=>'L',
+63788=>'L',
+63789=>'L',
+63790=>'L',
+63791=>'L',
+63792=>'L',
+63793=>'L',
+63794=>'L',
+63795=>'L',
+63796=>'L',
+63797=>'L',
+63798=>'L',
+63799=>'L',
+63800=>'L',
+63801=>'L',
+63802=>'L',
+63803=>'L',
+63804=>'L',
+63805=>'L',
+63806=>'L',
+63807=>'L',
+63808=>'L',
+63809=>'L',
+63810=>'L',
+63811=>'L',
+63812=>'L',
+63813=>'L',
+63814=>'L',
+63815=>'L',
+63816=>'L',
+63817=>'L',
+63818=>'L',
+63819=>'L',
+63820=>'L',
+63821=>'L',
+63822=>'L',
+63823=>'L',
+63824=>'L',
+63825=>'L',
+63826=>'L',
+63827=>'L',
+63828=>'L',
+63829=>'L',
+63830=>'L',
+63831=>'L',
+63832=>'L',
+63833=>'L',
+63834=>'L',
+63835=>'L',
+63836=>'L',
+63837=>'L',
+63838=>'L',
+63839=>'L',
+63840=>'L',
+63841=>'L',
+63842=>'L',
+63843=>'L',
+63844=>'L',
+63845=>'L',
+63846=>'L',
+63847=>'L',
+63848=>'L',
+63849=>'L',
+63850=>'L',
+63851=>'L',
+63852=>'L',
+63853=>'L',
+63854=>'L',
+63855=>'L',
+63856=>'L',
+63857=>'L',
+63858=>'L',
+63859=>'L',
+63860=>'L',
+63861=>'L',
+63862=>'L',
+63863=>'L',
+63864=>'L',
+63865=>'L',
+63866=>'L',
+63867=>'L',
+63868=>'L',
+63869=>'L',
+63870=>'L',
+63871=>'L',
+63872=>'L',
+63873=>'L',
+63874=>'L',
+63875=>'L',
+63876=>'L',
+63877=>'L',
+63878=>'L',
+63879=>'L',
+63880=>'L',
+63881=>'L',
+63882=>'L',
+63883=>'L',
+63884=>'L',
+63885=>'L',
+63886=>'L',
+63887=>'L',
+63888=>'L',
+63889=>'L',
+63890=>'L',
+63891=>'L',
+63892=>'L',
+63893=>'L',
+63894=>'L',
+63895=>'L',
+63896=>'L',
+63897=>'L',
+63898=>'L',
+63899=>'L',
+63900=>'L',
+63901=>'L',
+63902=>'L',
+63903=>'L',
+63904=>'L',
+63905=>'L',
+63906=>'L',
+63907=>'L',
+63908=>'L',
+63909=>'L',
+63910=>'L',
+63911=>'L',
+63912=>'L',
+63913=>'L',
+63914=>'L',
+63915=>'L',
+63916=>'L',
+63917=>'L',
+63918=>'L',
+63919=>'L',
+63920=>'L',
+63921=>'L',
+63922=>'L',
+63923=>'L',
+63924=>'L',
+63925=>'L',
+63926=>'L',
+63927=>'L',
+63928=>'L',
+63929=>'L',
+63930=>'L',
+63931=>'L',
+63932=>'L',
+63933=>'L',
+63934=>'L',
+63935=>'L',
+63936=>'L',
+63937=>'L',
+63938=>'L',
+63939=>'L',
+63940=>'L',
+63941=>'L',
+63942=>'L',
+63943=>'L',
+63944=>'L',
+63945=>'L',
+63946=>'L',
+63947=>'L',
+63948=>'L',
+63949=>'L',
+63950=>'L',
+63951=>'L',
+63952=>'L',
+63953=>'L',
+63954=>'L',
+63955=>'L',
+63956=>'L',
+63957=>'L',
+63958=>'L',
+63959=>'L',
+63960=>'L',
+63961=>'L',
+63962=>'L',
+63963=>'L',
+63964=>'L',
+63965=>'L',
+63966=>'L',
+63967=>'L',
+63968=>'L',
+63969=>'L',
+63970=>'L',
+63971=>'L',
+63972=>'L',
+63973=>'L',
+63974=>'L',
+63975=>'L',
+63976=>'L',
+63977=>'L',
+63978=>'L',
+63979=>'L',
+63980=>'L',
+63981=>'L',
+63982=>'L',
+63983=>'L',
+63984=>'L',
+63985=>'L',
+63986=>'L',
+63987=>'L',
+63988=>'L',
+63989=>'L',
+63990=>'L',
+63991=>'L',
+63992=>'L',
+63993=>'L',
+63994=>'L',
+63995=>'L',
+63996=>'L',
+63997=>'L',
+63998=>'L',
+63999=>'L',
+64000=>'L',
+64001=>'L',
+64002=>'L',
+64003=>'L',
+64004=>'L',
+64005=>'L',
+64006=>'L',
+64007=>'L',
+64008=>'L',
+64009=>'L',
+64010=>'L',
+64011=>'L',
+64012=>'L',
+64013=>'L',
+64014=>'L',
+64015=>'L',
+64016=>'L',
+64017=>'L',
+64018=>'L',
+64019=>'L',
+64020=>'L',
+64021=>'L',
+64022=>'L',
+64023=>'L',
+64024=>'L',
+64025=>'L',
+64026=>'L',
+64027=>'L',
+64028=>'L',
+64029=>'L',
+64030=>'L',
+64031=>'L',
+64032=>'L',
+64033=>'L',
+64034=>'L',
+64035=>'L',
+64036=>'L',
+64037=>'L',
+64038=>'L',
+64039=>'L',
+64040=>'L',
+64041=>'L',
+64042=>'L',
+64043=>'L',
+64044=>'L',
+64045=>'L',
+64048=>'L',
+64049=>'L',
+64050=>'L',
+64051=>'L',
+64052=>'L',
+64053=>'L',
+64054=>'L',
+64055=>'L',
+64056=>'L',
+64057=>'L',
+64058=>'L',
+64059=>'L',
+64060=>'L',
+64061=>'L',
+64062=>'L',
+64063=>'L',
+64064=>'L',
+64065=>'L',
+64066=>'L',
+64067=>'L',
+64068=>'L',
+64069=>'L',
+64070=>'L',
+64071=>'L',
+64072=>'L',
+64073=>'L',
+64074=>'L',
+64075=>'L',
+64076=>'L',
+64077=>'L',
+64078=>'L',
+64079=>'L',
+64080=>'L',
+64081=>'L',
+64082=>'L',
+64083=>'L',
+64084=>'L',
+64085=>'L',
+64086=>'L',
+64087=>'L',
+64088=>'L',
+64089=>'L',
+64090=>'L',
+64091=>'L',
+64092=>'L',
+64093=>'L',
+64094=>'L',
+64095=>'L',
+64096=>'L',
+64097=>'L',
+64098=>'L',
+64099=>'L',
+64100=>'L',
+64101=>'L',
+64102=>'L',
+64103=>'L',
+64104=>'L',
+64105=>'L',
+64106=>'L',
+64112=>'L',
+64113=>'L',
+64114=>'L',
+64115=>'L',
+64116=>'L',
+64117=>'L',
+64118=>'L',
+64119=>'L',
+64120=>'L',
+64121=>'L',
+64122=>'L',
+64123=>'L',
+64124=>'L',
+64125=>'L',
+64126=>'L',
+64127=>'L',
+64128=>'L',
+64129=>'L',
+64130=>'L',
+64131=>'L',
+64132=>'L',
+64133=>'L',
+64134=>'L',
+64135=>'L',
+64136=>'L',
+64137=>'L',
+64138=>'L',
+64139=>'L',
+64140=>'L',
+64141=>'L',
+64142=>'L',
+64143=>'L',
+64144=>'L',
+64145=>'L',
+64146=>'L',
+64147=>'L',
+64148=>'L',
+64149=>'L',
+64150=>'L',
+64151=>'L',
+64152=>'L',
+64153=>'L',
+64154=>'L',
+64155=>'L',
+64156=>'L',
+64157=>'L',
+64158=>'L',
+64159=>'L',
+64160=>'L',
+64161=>'L',
+64162=>'L',
+64163=>'L',
+64164=>'L',
+64165=>'L',
+64166=>'L',
+64167=>'L',
+64168=>'L',
+64169=>'L',
+64170=>'L',
+64171=>'L',
+64172=>'L',
+64173=>'L',
+64174=>'L',
+64175=>'L',
+64176=>'L',
+64177=>'L',
+64178=>'L',
+64179=>'L',
+64180=>'L',
+64181=>'L',
+64182=>'L',
+64183=>'L',
+64184=>'L',
+64185=>'L',
+64186=>'L',
+64187=>'L',
+64188=>'L',
+64189=>'L',
+64190=>'L',
+64191=>'L',
+64192=>'L',
+64193=>'L',
+64194=>'L',
+64195=>'L',
+64196=>'L',
+64197=>'L',
+64198=>'L',
+64199=>'L',
+64200=>'L',
+64201=>'L',
+64202=>'L',
+64203=>'L',
+64204=>'L',
+64205=>'L',
+64206=>'L',
+64207=>'L',
+64208=>'L',
+64209=>'L',
+64210=>'L',
+64211=>'L',
+64212=>'L',
+64213=>'L',
+64214=>'L',
+64215=>'L',
+64216=>'L',
+64217=>'L',
+64256=>'L',
+64257=>'L',
+64258=>'L',
+64259=>'L',
+64260=>'L',
+64261=>'L',
+64262=>'L',
+64275=>'L',
+64276=>'L',
+64277=>'L',
+64278=>'L',
+64279=>'L',
+64285=>'R',
+64286=>'NSM',
+64287=>'R',
+64288=>'R',
+64289=>'R',
+64290=>'R',
+64291=>'R',
+64292=>'R',
+64293=>'R',
+64294=>'R',
+64295=>'R',
+64296=>'R',
+64297=>'ES',
+64298=>'R',
+64299=>'R',
+64300=>'R',
+64301=>'R',
+64302=>'R',
+64303=>'R',
+64304=>'R',
+64305=>'R',
+64306=>'R',
+64307=>'R',
+64308=>'R',
+64309=>'R',
+64310=>'R',
+64312=>'R',
+64313=>'R',
+64314=>'R',
+64315=>'R',
+64316=>'R',
+64318=>'R',
+64320=>'R',
+64321=>'R',
+64323=>'R',
+64324=>'R',
+64326=>'R',
+64327=>'R',
+64328=>'R',
+64329=>'R',
+64330=>'R',
+64331=>'R',
+64332=>'R',
+64333=>'R',
+64334=>'R',
+64335=>'R',
+64336=>'AL',
+64337=>'AL',
+64338=>'AL',
+64339=>'AL',
+64340=>'AL',
+64341=>'AL',
+64342=>'AL',
+64343=>'AL',
+64344=>'AL',
+64345=>'AL',
+64346=>'AL',
+64347=>'AL',
+64348=>'AL',
+64349=>'AL',
+64350=>'AL',
+64351=>'AL',
+64352=>'AL',
+64353=>'AL',
+64354=>'AL',
+64355=>'AL',
+64356=>'AL',
+64357=>'AL',
+64358=>'AL',
+64359=>'AL',
+64360=>'AL',
+64361=>'AL',
+64362=>'AL',
+64363=>'AL',
+64364=>'AL',
+64365=>'AL',
+64366=>'AL',
+64367=>'AL',
+64368=>'AL',
+64369=>'AL',
+64370=>'AL',
+64371=>'AL',
+64372=>'AL',
+64373=>'AL',
+64374=>'AL',
+64375=>'AL',
+64376=>'AL',
+64377=>'AL',
+64378=>'AL',
+64379=>'AL',
+64380=>'AL',
+64381=>'AL',
+64382=>'AL',
+64383=>'AL',
+64384=>'AL',
+64385=>'AL',
+64386=>'AL',
+64387=>'AL',
+64388=>'AL',
+64389=>'AL',
+64390=>'AL',
+64391=>'AL',
+64392=>'AL',
+64393=>'AL',
+64394=>'AL',
+64395=>'AL',
+64396=>'AL',
+64397=>'AL',
+64398=>'AL',
+64399=>'AL',
+64400=>'AL',
+64401=>'AL',
+64402=>'AL',
+64403=>'AL',
+64404=>'AL',
+64405=>'AL',
+64406=>'AL',
+64407=>'AL',
+64408=>'AL',
+64409=>'AL',
+64410=>'AL',
+64411=>'AL',
+64412=>'AL',
+64413=>'AL',
+64414=>'AL',
+64415=>'AL',
+64416=>'AL',
+64417=>'AL',
+64418=>'AL',
+64419=>'AL',
+64420=>'AL',
+64421=>'AL',
+64422=>'AL',
+64423=>'AL',
+64424=>'AL',
+64425=>'AL',
+64426=>'AL',
+64427=>'AL',
+64428=>'AL',
+64429=>'AL',
+64430=>'AL',
+64431=>'AL',
+64432=>'AL',
+64433=>'AL',
+64467=>'AL',
+64468=>'AL',
+64469=>'AL',
+64470=>'AL',
+64471=>'AL',
+64472=>'AL',
+64473=>'AL',
+64474=>'AL',
+64475=>'AL',
+64476=>'AL',
+64477=>'AL',
+64478=>'AL',
+64479=>'AL',
+64480=>'AL',
+64481=>'AL',
+64482=>'AL',
+64483=>'AL',
+64484=>'AL',
+64485=>'AL',
+64486=>'AL',
+64487=>'AL',
+64488=>'AL',
+64489=>'AL',
+64490=>'AL',
+64491=>'AL',
+64492=>'AL',
+64493=>'AL',
+64494=>'AL',
+64495=>'AL',
+64496=>'AL',
+64497=>'AL',
+64498=>'AL',
+64499=>'AL',
+64500=>'AL',
+64501=>'AL',
+64502=>'AL',
+64503=>'AL',
+64504=>'AL',
+64505=>'AL',
+64506=>'AL',
+64507=>'AL',
+64508=>'AL',
+64509=>'AL',
+64510=>'AL',
+64511=>'AL',
+64512=>'AL',
+64513=>'AL',
+64514=>'AL',
+64515=>'AL',
+64516=>'AL',
+64517=>'AL',
+64518=>'AL',
+64519=>'AL',
+64520=>'AL',
+64521=>'AL',
+64522=>'AL',
+64523=>'AL',
+64524=>'AL',
+64525=>'AL',
+64526=>'AL',
+64527=>'AL',
+64528=>'AL',
+64529=>'AL',
+64530=>'AL',
+64531=>'AL',
+64532=>'AL',
+64533=>'AL',
+64534=>'AL',
+64535=>'AL',
+64536=>'AL',
+64537=>'AL',
+64538=>'AL',
+64539=>'AL',
+64540=>'AL',
+64541=>'AL',
+64542=>'AL',
+64543=>'AL',
+64544=>'AL',
+64545=>'AL',
+64546=>'AL',
+64547=>'AL',
+64548=>'AL',
+64549=>'AL',
+64550=>'AL',
+64551=>'AL',
+64552=>'AL',
+64553=>'AL',
+64554=>'AL',
+64555=>'AL',
+64556=>'AL',
+64557=>'AL',
+64558=>'AL',
+64559=>'AL',
+64560=>'AL',
+64561=>'AL',
+64562=>'AL',
+64563=>'AL',
+64564=>'AL',
+64565=>'AL',
+64566=>'AL',
+64567=>'AL',
+64568=>'AL',
+64569=>'AL',
+64570=>'AL',
+64571=>'AL',
+64572=>'AL',
+64573=>'AL',
+64574=>'AL',
+64575=>'AL',
+64576=>'AL',
+64577=>'AL',
+64578=>'AL',
+64579=>'AL',
+64580=>'AL',
+64581=>'AL',
+64582=>'AL',
+64583=>'AL',
+64584=>'AL',
+64585=>'AL',
+64586=>'AL',
+64587=>'AL',
+64588=>'AL',
+64589=>'AL',
+64590=>'AL',
+64591=>'AL',
+64592=>'AL',
+64593=>'AL',
+64594=>'AL',
+64595=>'AL',
+64596=>'AL',
+64597=>'AL',
+64598=>'AL',
+64599=>'AL',
+64600=>'AL',
+64601=>'AL',
+64602=>'AL',
+64603=>'AL',
+64604=>'AL',
+64605=>'AL',
+64606=>'AL',
+64607=>'AL',
+64608=>'AL',
+64609=>'AL',
+64610=>'AL',
+64611=>'AL',
+64612=>'AL',
+64613=>'AL',
+64614=>'AL',
+64615=>'AL',
+64616=>'AL',
+64617=>'AL',
+64618=>'AL',
+64619=>'AL',
+64620=>'AL',
+64621=>'AL',
+64622=>'AL',
+64623=>'AL',
+64624=>'AL',
+64625=>'AL',
+64626=>'AL',
+64627=>'AL',
+64628=>'AL',
+64629=>'AL',
+64630=>'AL',
+64631=>'AL',
+64632=>'AL',
+64633=>'AL',
+64634=>'AL',
+64635=>'AL',
+64636=>'AL',
+64637=>'AL',
+64638=>'AL',
+64639=>'AL',
+64640=>'AL',
+64641=>'AL',
+64642=>'AL',
+64643=>'AL',
+64644=>'AL',
+64645=>'AL',
+64646=>'AL',
+64647=>'AL',
+64648=>'AL',
+64649=>'AL',
+64650=>'AL',
+64651=>'AL',
+64652=>'AL',
+64653=>'AL',
+64654=>'AL',
+64655=>'AL',
+64656=>'AL',
+64657=>'AL',
+64658=>'AL',
+64659=>'AL',
+64660=>'AL',
+64661=>'AL',
+64662=>'AL',
+64663=>'AL',
+64664=>'AL',
+64665=>'AL',
+64666=>'AL',
+64667=>'AL',
+64668=>'AL',
+64669=>'AL',
+64670=>'AL',
+64671=>'AL',
+64672=>'AL',
+64673=>'AL',
+64674=>'AL',
+64675=>'AL',
+64676=>'AL',
+64677=>'AL',
+64678=>'AL',
+64679=>'AL',
+64680=>'AL',
+64681=>'AL',
+64682=>'AL',
+64683=>'AL',
+64684=>'AL',
+64685=>'AL',
+64686=>'AL',
+64687=>'AL',
+64688=>'AL',
+64689=>'AL',
+64690=>'AL',
+64691=>'AL',
+64692=>'AL',
+64693=>'AL',
+64694=>'AL',
+64695=>'AL',
+64696=>'AL',
+64697=>'AL',
+64698=>'AL',
+64699=>'AL',
+64700=>'AL',
+64701=>'AL',
+64702=>'AL',
+64703=>'AL',
+64704=>'AL',
+64705=>'AL',
+64706=>'AL',
+64707=>'AL',
+64708=>'AL',
+64709=>'AL',
+64710=>'AL',
+64711=>'AL',
+64712=>'AL',
+64713=>'AL',
+64714=>'AL',
+64715=>'AL',
+64716=>'AL',
+64717=>'AL',
+64718=>'AL',
+64719=>'AL',
+64720=>'AL',
+64721=>'AL',
+64722=>'AL',
+64723=>'AL',
+64724=>'AL',
+64725=>'AL',
+64726=>'AL',
+64727=>'AL',
+64728=>'AL',
+64729=>'AL',
+64730=>'AL',
+64731=>'AL',
+64732=>'AL',
+64733=>'AL',
+64734=>'AL',
+64735=>'AL',
+64736=>'AL',
+64737=>'AL',
+64738=>'AL',
+64739=>'AL',
+64740=>'AL',
+64741=>'AL',
+64742=>'AL',
+64743=>'AL',
+64744=>'AL',
+64745=>'AL',
+64746=>'AL',
+64747=>'AL',
+64748=>'AL',
+64749=>'AL',
+64750=>'AL',
+64751=>'AL',
+64752=>'AL',
+64753=>'AL',
+64754=>'AL',
+64755=>'AL',
+64756=>'AL',
+64757=>'AL',
+64758=>'AL',
+64759=>'AL',
+64760=>'AL',
+64761=>'AL',
+64762=>'AL',
+64763=>'AL',
+64764=>'AL',
+64765=>'AL',
+64766=>'AL',
+64767=>'AL',
+64768=>'AL',
+64769=>'AL',
+64770=>'AL',
+64771=>'AL',
+64772=>'AL',
+64773=>'AL',
+64774=>'AL',
+64775=>'AL',
+64776=>'AL',
+64777=>'AL',
+64778=>'AL',
+64779=>'AL',
+64780=>'AL',
+64781=>'AL',
+64782=>'AL',
+64783=>'AL',
+64784=>'AL',
+64785=>'AL',
+64786=>'AL',
+64787=>'AL',
+64788=>'AL',
+64789=>'AL',
+64790=>'AL',
+64791=>'AL',
+64792=>'AL',
+64793=>'AL',
+64794=>'AL',
+64795=>'AL',
+64796=>'AL',
+64797=>'AL',
+64798=>'AL',
+64799=>'AL',
+64800=>'AL',
+64801=>'AL',
+64802=>'AL',
+64803=>'AL',
+64804=>'AL',
+64805=>'AL',
+64806=>'AL',
+64807=>'AL',
+64808=>'AL',
+64809=>'AL',
+64810=>'AL',
+64811=>'AL',
+64812=>'AL',
+64813=>'AL',
+64814=>'AL',
+64815=>'AL',
+64816=>'AL',
+64817=>'AL',
+64818=>'AL',
+64819=>'AL',
+64820=>'AL',
+64821=>'AL',
+64822=>'AL',
+64823=>'AL',
+64824=>'AL',
+64825=>'AL',
+64826=>'AL',
+64827=>'AL',
+64828=>'AL',
+64829=>'AL',
+64830=>'ON',
+64831=>'ON',
+64848=>'AL',
+64849=>'AL',
+64850=>'AL',
+64851=>'AL',
+64852=>'AL',
+64853=>'AL',
+64854=>'AL',
+64855=>'AL',
+64856=>'AL',
+64857=>'AL',
+64858=>'AL',
+64859=>'AL',
+64860=>'AL',
+64861=>'AL',
+64862=>'AL',
+64863=>'AL',
+64864=>'AL',
+64865=>'AL',
+64866=>'AL',
+64867=>'AL',
+64868=>'AL',
+64869=>'AL',
+64870=>'AL',
+64871=>'AL',
+64872=>'AL',
+64873=>'AL',
+64874=>'AL',
+64875=>'AL',
+64876=>'AL',
+64877=>'AL',
+64878=>'AL',
+64879=>'AL',
+64880=>'AL',
+64881=>'AL',
+64882=>'AL',
+64883=>'AL',
+64884=>'AL',
+64885=>'AL',
+64886=>'AL',
+64887=>'AL',
+64888=>'AL',
+64889=>'AL',
+64890=>'AL',
+64891=>'AL',
+64892=>'AL',
+64893=>'AL',
+64894=>'AL',
+64895=>'AL',
+64896=>'AL',
+64897=>'AL',
+64898=>'AL',
+64899=>'AL',
+64900=>'AL',
+64901=>'AL',
+64902=>'AL',
+64903=>'AL',
+64904=>'AL',
+64905=>'AL',
+64906=>'AL',
+64907=>'AL',
+64908=>'AL',
+64909=>'AL',
+64910=>'AL',
+64911=>'AL',
+64914=>'AL',
+64915=>'AL',
+64916=>'AL',
+64917=>'AL',
+64918=>'AL',
+64919=>'AL',
+64920=>'AL',
+64921=>'AL',
+64922=>'AL',
+64923=>'AL',
+64924=>'AL',
+64925=>'AL',
+64926=>'AL',
+64927=>'AL',
+64928=>'AL',
+64929=>'AL',
+64930=>'AL',
+64931=>'AL',
+64932=>'AL',
+64933=>'AL',
+64934=>'AL',
+64935=>'AL',
+64936=>'AL',
+64937=>'AL',
+64938=>'AL',
+64939=>'AL',
+64940=>'AL',
+64941=>'AL',
+64942=>'AL',
+64943=>'AL',
+64944=>'AL',
+64945=>'AL',
+64946=>'AL',
+64947=>'AL',
+64948=>'AL',
+64949=>'AL',
+64950=>'AL',
+64951=>'AL',
+64952=>'AL',
+64953=>'AL',
+64954=>'AL',
+64955=>'AL',
+64956=>'AL',
+64957=>'AL',
+64958=>'AL',
+64959=>'AL',
+64960=>'AL',
+64961=>'AL',
+64962=>'AL',
+64963=>'AL',
+64964=>'AL',
+64965=>'AL',
+64966=>'AL',
+64967=>'AL',
+65008=>'AL',
+65009=>'AL',
+65010=>'AL',
+65011=>'AL',
+65012=>'AL',
+65013=>'AL',
+65014=>'AL',
+65015=>'AL',
+65016=>'AL',
+65017=>'AL',
+65018=>'AL',
+65019=>'AL',
+65020=>'AL',
+65021=>'ON',
+65024=>'NSM',
+65025=>'NSM',
+65026=>'NSM',
+65027=>'NSM',
+65028=>'NSM',
+65029=>'NSM',
+65030=>'NSM',
+65031=>'NSM',
+65032=>'NSM',
+65033=>'NSM',
+65034=>'NSM',
+65035=>'NSM',
+65036=>'NSM',
+65037=>'NSM',
+65038=>'NSM',
+65039=>'NSM',
+65040=>'ON',
+65041=>'ON',
+65042=>'ON',
+65043=>'ON',
+65044=>'ON',
+65045=>'ON',
+65046=>'ON',
+65047=>'ON',
+65048=>'ON',
+65049=>'ON',
+65056=>'NSM',
+65057=>'NSM',
+65058=>'NSM',
+65059=>'NSM',
+65072=>'ON',
+65073=>'ON',
+65074=>'ON',
+65075=>'ON',
+65076=>'ON',
+65077=>'ON',
+65078=>'ON',
+65079=>'ON',
+65080=>'ON',
+65081=>'ON',
+65082=>'ON',
+65083=>'ON',
+65084=>'ON',
+65085=>'ON',
+65086=>'ON',
+65087=>'ON',
+65088=>'ON',
+65089=>'ON',
+65090=>'ON',
+65091=>'ON',
+65092=>'ON',
+65093=>'ON',
+65094=>'ON',
+65095=>'ON',
+65096=>'ON',
+65097=>'ON',
+65098=>'ON',
+65099=>'ON',
+65100=>'ON',
+65101=>'ON',
+65102=>'ON',
+65103=>'ON',
+65104=>'CS',
+65105=>'ON',
+65106=>'CS',
+65108=>'ON',
+65109=>'CS',
+65110=>'ON',
+65111=>'ON',
+65112=>'ON',
+65113=>'ON',
+65114=>'ON',
+65115=>'ON',
+65116=>'ON',
+65117=>'ON',
+65118=>'ON',
+65119=>'ET',
+65120=>'ON',
+65121=>'ON',
+65122=>'ES',
+65123=>'ES',
+65124=>'ON',
+65125=>'ON',
+65126=>'ON',
+65128=>'ON',
+65129=>'ET',
+65130=>'ET',
+65131=>'ON',
+65136=>'AL',
+65137=>'AL',
+65138=>'AL',
+65139=>'AL',
+65140=>'AL',
+65142=>'AL',
+65143=>'AL',
+65144=>'AL',
+65145=>'AL',
+65146=>'AL',
+65147=>'AL',
+65148=>'AL',
+65149=>'AL',
+65150=>'AL',
+65151=>'AL',
+65152=>'AL',
+65153=>'AL',
+65154=>'AL',
+65155=>'AL',
+65156=>'AL',
+65157=>'AL',
+65158=>'AL',
+65159=>'AL',
+65160=>'AL',
+65161=>'AL',
+65162=>'AL',
+65163=>'AL',
+65164=>'AL',
+65165=>'AL',
+65166=>'AL',
+65167=>'AL',
+65168=>'AL',
+65169=>'AL',
+65170=>'AL',
+65171=>'AL',
+65172=>'AL',
+65173=>'AL',
+65174=>'AL',
+65175=>'AL',
+65176=>'AL',
+65177=>'AL',
+65178=>'AL',
+65179=>'AL',
+65180=>'AL',
+65181=>'AL',
+65182=>'AL',
+65183=>'AL',
+65184=>'AL',
+65185=>'AL',
+65186=>'AL',
+65187=>'AL',
+65188=>'AL',
+65189=>'AL',
+65190=>'AL',
+65191=>'AL',
+65192=>'AL',
+65193=>'AL',
+65194=>'AL',
+65195=>'AL',
+65196=>'AL',
+65197=>'AL',
+65198=>'AL',
+65199=>'AL',
+65200=>'AL',
+65201=>'AL',
+65202=>'AL',
+65203=>'AL',
+65204=>'AL',
+65205=>'AL',
+65206=>'AL',
+65207=>'AL',
+65208=>'AL',
+65209=>'AL',
+65210=>'AL',
+65211=>'AL',
+65212=>'AL',
+65213=>'AL',
+65214=>'AL',
+65215=>'AL',
+65216=>'AL',
+65217=>'AL',
+65218=>'AL',
+65219=>'AL',
+65220=>'AL',
+65221=>'AL',
+65222=>'AL',
+65223=>'AL',
+65224=>'AL',
+65225=>'AL',
+65226=>'AL',
+65227=>'AL',
+65228=>'AL',
+65229=>'AL',
+65230=>'AL',
+65231=>'AL',
+65232=>'AL',
+65233=>'AL',
+65234=>'AL',
+65235=>'AL',
+65236=>'AL',
+65237=>'AL',
+65238=>'AL',
+65239=>'AL',
+65240=>'AL',
+65241=>'AL',
+65242=>'AL',
+65243=>'AL',
+65244=>'AL',
+65245=>'AL',
+65246=>'AL',
+65247=>'AL',
+65248=>'AL',
+65249=>'AL',
+65250=>'AL',
+65251=>'AL',
+65252=>'AL',
+65253=>'AL',
+65254=>'AL',
+65255=>'AL',
+65256=>'AL',
+65257=>'AL',
+65258=>'AL',
+65259=>'AL',
+65260=>'AL',
+65261=>'AL',
+65262=>'AL',
+65263=>'AL',
+65264=>'AL',
+65265=>'AL',
+65266=>'AL',
+65267=>'AL',
+65268=>'AL',
+65269=>'AL',
+65270=>'AL',
+65271=>'AL',
+65272=>'AL',
+65273=>'AL',
+65274=>'AL',
+65275=>'AL',
+65276=>'AL',
+65279=>'BN',
+65281=>'ON',
+65282=>'ON',
+65283=>'ET',
+65284=>'ET',
+65285=>'ET',
+65286=>'ON',
+65287=>'ON',
+65288=>'ON',
+65289=>'ON',
+65290=>'ON',
+65291=>'ES',
+65292=>'CS',
+65293=>'ES',
+65294=>'CS',
+65295=>'CS',
+65296=>'EN',
+65297=>'EN',
+65298=>'EN',
+65299=>'EN',
+65300=>'EN',
+65301=>'EN',
+65302=>'EN',
+65303=>'EN',
+65304=>'EN',
+65305=>'EN',
+65306=>'CS',
+65307=>'ON',
+65308=>'ON',
+65309=>'ON',
+65310=>'ON',
+65311=>'ON',
+65312=>'ON',
+65313=>'L',
+65314=>'L',
+65315=>'L',
+65316=>'L',
+65317=>'L',
+65318=>'L',
+65319=>'L',
+65320=>'L',
+65321=>'L',
+65322=>'L',
+65323=>'L',
+65324=>'L',
+65325=>'L',
+65326=>'L',
+65327=>'L',
+65328=>'L',
+65329=>'L',
+65330=>'L',
+65331=>'L',
+65332=>'L',
+65333=>'L',
+65334=>'L',
+65335=>'L',
+65336=>'L',
+65337=>'L',
+65338=>'L',
+65339=>'ON',
+65340=>'ON',
+65341=>'ON',
+65342=>'ON',
+65343=>'ON',
+65344=>'ON',
+65345=>'L',
+65346=>'L',
+65347=>'L',
+65348=>'L',
+65349=>'L',
+65350=>'L',
+65351=>'L',
+65352=>'L',
+65353=>'L',
+65354=>'L',
+65355=>'L',
+65356=>'L',
+65357=>'L',
+65358=>'L',
+65359=>'L',
+65360=>'L',
+65361=>'L',
+65362=>'L',
+65363=>'L',
+65364=>'L',
+65365=>'L',
+65366=>'L',
+65367=>'L',
+65368=>'L',
+65369=>'L',
+65370=>'L',
+65371=>'ON',
+65372=>'ON',
+65373=>'ON',
+65374=>'ON',
+65375=>'ON',
+65376=>'ON',
+65377=>'ON',
+65378=>'ON',
+65379=>'ON',
+65380=>'ON',
+65381=>'ON',
+65382=>'L',
+65383=>'L',
+65384=>'L',
+65385=>'L',
+65386=>'L',
+65387=>'L',
+65388=>'L',
+65389=>'L',
+65390=>'L',
+65391=>'L',
+65392=>'L',
+65393=>'L',
+65394=>'L',
+65395=>'L',
+65396=>'L',
+65397=>'L',
+65398=>'L',
+65399=>'L',
+65400=>'L',
+65401=>'L',
+65402=>'L',
+65403=>'L',
+65404=>'L',
+65405=>'L',
+65406=>'L',
+65407=>'L',
+65408=>'L',
+65409=>'L',
+65410=>'L',
+65411=>'L',
+65412=>'L',
+65413=>'L',
+65414=>'L',
+65415=>'L',
+65416=>'L',
+65417=>'L',
+65418=>'L',
+65419=>'L',
+65420=>'L',
+65421=>'L',
+65422=>'L',
+65423=>'L',
+65424=>'L',
+65425=>'L',
+65426=>'L',
+65427=>'L',
+65428=>'L',
+65429=>'L',
+65430=>'L',
+65431=>'L',
+65432=>'L',
+65433=>'L',
+65434=>'L',
+65435=>'L',
+65436=>'L',
+65437=>'L',
+65438=>'L',
+65439=>'L',
+65440=>'L',
+65441=>'L',
+65442=>'L',
+65443=>'L',
+65444=>'L',
+65445=>'L',
+65446=>'L',
+65447=>'L',
+65448=>'L',
+65449=>'L',
+65450=>'L',
+65451=>'L',
+65452=>'L',
+65453=>'L',
+65454=>'L',
+65455=>'L',
+65456=>'L',
+65457=>'L',
+65458=>'L',
+65459=>'L',
+65460=>'L',
+65461=>'L',
+65462=>'L',
+65463=>'L',
+65464=>'L',
+65465=>'L',
+65466=>'L',
+65467=>'L',
+65468=>'L',
+65469=>'L',
+65470=>'L',
+65474=>'L',
+65475=>'L',
+65476=>'L',
+65477=>'L',
+65478=>'L',
+65479=>'L',
+65482=>'L',
+65483=>'L',
+65484=>'L',
+65485=>'L',
+65486=>'L',
+65487=>'L',
+65490=>'L',
+65491=>'L',
+65492=>'L',
+65493=>'L',
+65494=>'L',
+65495=>'L',
+65498=>'L',
+65499=>'L',
+65500=>'L',
+65504=>'ET',
+65505=>'ET',
+65506=>'ON',
+65507=>'ON',
+65508=>'ON',
+65509=>'ET',
+65510=>'ET',
+65512=>'ON',
+65513=>'ON',
+65514=>'ON',
+65515=>'ON',
+65516=>'ON',
+65517=>'ON',
+65518=>'ON',
+65529=>'ON',
+65530=>'ON',
+65531=>'ON',
+65532=>'ON',
+65533=>'ON',
+65536=>'L',
+65537=>'L',
+65538=>'L',
+65539=>'L',
+65540=>'L',
+65541=>'L',
+65542=>'L',
+65543=>'L',
+65544=>'L',
+65545=>'L',
+65546=>'L',
+65547=>'L',
+65549=>'L',
+65550=>'L',
+65551=>'L',
+65552=>'L',
+65553=>'L',
+65554=>'L',
+65555=>'L',
+65556=>'L',
+65557=>'L',
+65558=>'L',
+65559=>'L',
+65560=>'L',
+65561=>'L',
+65562=>'L',
+65563=>'L',
+65564=>'L',
+65565=>'L',
+65566=>'L',
+65567=>'L',
+65568=>'L',
+65569=>'L',
+65570=>'L',
+65571=>'L',
+65572=>'L',
+65573=>'L',
+65574=>'L',
+65576=>'L',
+65577=>'L',
+65578=>'L',
+65579=>'L',
+65580=>'L',
+65581=>'L',
+65582=>'L',
+65583=>'L',
+65584=>'L',
+65585=>'L',
+65586=>'L',
+65587=>'L',
+65588=>'L',
+65589=>'L',
+65590=>'L',
+65591=>'L',
+65592=>'L',
+65593=>'L',
+65594=>'L',
+65596=>'L',
+65597=>'L',
+65599=>'L',
+65600=>'L',
+65601=>'L',
+65602=>'L',
+65603=>'L',
+65604=>'L',
+65605=>'L',
+65606=>'L',
+65607=>'L',
+65608=>'L',
+65609=>'L',
+65610=>'L',
+65611=>'L',
+65612=>'L',
+65613=>'L',
+65616=>'L',
+65617=>'L',
+65618=>'L',
+65619=>'L',
+65620=>'L',
+65621=>'L',
+65622=>'L',
+65623=>'L',
+65624=>'L',
+65625=>'L',
+65626=>'L',
+65627=>'L',
+65628=>'L',
+65629=>'L',
+65664=>'L',
+65665=>'L',
+65666=>'L',
+65667=>'L',
+65668=>'L',
+65669=>'L',
+65670=>'L',
+65671=>'L',
+65672=>'L',
+65673=>'L',
+65674=>'L',
+65675=>'L',
+65676=>'L',
+65677=>'L',
+65678=>'L',
+65679=>'L',
+65680=>'L',
+65681=>'L',
+65682=>'L',
+65683=>'L',
+65684=>'L',
+65685=>'L',
+65686=>'L',
+65687=>'L',
+65688=>'L',
+65689=>'L',
+65690=>'L',
+65691=>'L',
+65692=>'L',
+65693=>'L',
+65694=>'L',
+65695=>'L',
+65696=>'L',
+65697=>'L',
+65698=>'L',
+65699=>'L',
+65700=>'L',
+65701=>'L',
+65702=>'L',
+65703=>'L',
+65704=>'L',
+65705=>'L',
+65706=>'L',
+65707=>'L',
+65708=>'L',
+65709=>'L',
+65710=>'L',
+65711=>'L',
+65712=>'L',
+65713=>'L',
+65714=>'L',
+65715=>'L',
+65716=>'L',
+65717=>'L',
+65718=>'L',
+65719=>'L',
+65720=>'L',
+65721=>'L',
+65722=>'L',
+65723=>'L',
+65724=>'L',
+65725=>'L',
+65726=>'L',
+65727=>'L',
+65728=>'L',
+65729=>'L',
+65730=>'L',
+65731=>'L',
+65732=>'L',
+65733=>'L',
+65734=>'L',
+65735=>'L',
+65736=>'L',
+65737=>'L',
+65738=>'L',
+65739=>'L',
+65740=>'L',
+65741=>'L',
+65742=>'L',
+65743=>'L',
+65744=>'L',
+65745=>'L',
+65746=>'L',
+65747=>'L',
+65748=>'L',
+65749=>'L',
+65750=>'L',
+65751=>'L',
+65752=>'L',
+65753=>'L',
+65754=>'L',
+65755=>'L',
+65756=>'L',
+65757=>'L',
+65758=>'L',
+65759=>'L',
+65760=>'L',
+65761=>'L',
+65762=>'L',
+65763=>'L',
+65764=>'L',
+65765=>'L',
+65766=>'L',
+65767=>'L',
+65768=>'L',
+65769=>'L',
+65770=>'L',
+65771=>'L',
+65772=>'L',
+65773=>'L',
+65774=>'L',
+65775=>'L',
+65776=>'L',
+65777=>'L',
+65778=>'L',
+65779=>'L',
+65780=>'L',
+65781=>'L',
+65782=>'L',
+65783=>'L',
+65784=>'L',
+65785=>'L',
+65786=>'L',
+65792=>'L',
+65793=>'ON',
+65794=>'L',
+65799=>'L',
+65800=>'L',
+65801=>'L',
+65802=>'L',
+65803=>'L',
+65804=>'L',
+65805=>'L',
+65806=>'L',
+65807=>'L',
+65808=>'L',
+65809=>'L',
+65810=>'L',
+65811=>'L',
+65812=>'L',
+65813=>'L',
+65814=>'L',
+65815=>'L',
+65816=>'L',
+65817=>'L',
+65818=>'L',
+65819=>'L',
+65820=>'L',
+65821=>'L',
+65822=>'L',
+65823=>'L',
+65824=>'L',
+65825=>'L',
+65826=>'L',
+65827=>'L',
+65828=>'L',
+65829=>'L',
+65830=>'L',
+65831=>'L',
+65832=>'L',
+65833=>'L',
+65834=>'L',
+65835=>'L',
+65836=>'L',
+65837=>'L',
+65838=>'L',
+65839=>'L',
+65840=>'L',
+65841=>'L',
+65842=>'L',
+65843=>'L',
+65847=>'L',
+65848=>'L',
+65849=>'L',
+65850=>'L',
+65851=>'L',
+65852=>'L',
+65853=>'L',
+65854=>'L',
+65855=>'L',
+65856=>'ON',
+65857=>'ON',
+65858=>'ON',
+65859=>'ON',
+65860=>'ON',
+65861=>'ON',
+65862=>'ON',
+65863=>'ON',
+65864=>'ON',
+65865=>'ON',
+65866=>'ON',
+65867=>'ON',
+65868=>'ON',
+65869=>'ON',
+65870=>'ON',
+65871=>'ON',
+65872=>'ON',
+65873=>'ON',
+65874=>'ON',
+65875=>'ON',
+65876=>'ON',
+65877=>'ON',
+65878=>'ON',
+65879=>'ON',
+65880=>'ON',
+65881=>'ON',
+65882=>'ON',
+65883=>'ON',
+65884=>'ON',
+65885=>'ON',
+65886=>'ON',
+65887=>'ON',
+65888=>'ON',
+65889=>'ON',
+65890=>'ON',
+65891=>'ON',
+65892=>'ON',
+65893=>'ON',
+65894=>'ON',
+65895=>'ON',
+65896=>'ON',
+65897=>'ON',
+65898=>'ON',
+65899=>'ON',
+65900=>'ON',
+65901=>'ON',
+65902=>'ON',
+65903=>'ON',
+65904=>'ON',
+65905=>'ON',
+65906=>'ON',
+65907=>'ON',
+65908=>'ON',
+65909=>'ON',
+65910=>'ON',
+65911=>'ON',
+65912=>'ON',
+65913=>'ON',
+65914=>'ON',
+65915=>'ON',
+65916=>'ON',
+65917=>'ON',
+65918=>'ON',
+65919=>'ON',
+65920=>'ON',
+65921=>'ON',
+65922=>'ON',
+65923=>'ON',
+65924=>'ON',
+65925=>'ON',
+65926=>'ON',
+65927=>'ON',
+65928=>'ON',
+65929=>'ON',
+65930=>'ON',
+66304=>'L',
+66305=>'L',
+66306=>'L',
+66307=>'L',
+66308=>'L',
+66309=>'L',
+66310=>'L',
+66311=>'L',
+66312=>'L',
+66313=>'L',
+66314=>'L',
+66315=>'L',
+66316=>'L',
+66317=>'L',
+66318=>'L',
+66319=>'L',
+66320=>'L',
+66321=>'L',
+66322=>'L',
+66323=>'L',
+66324=>'L',
+66325=>'L',
+66326=>'L',
+66327=>'L',
+66328=>'L',
+66329=>'L',
+66330=>'L',
+66331=>'L',
+66332=>'L',
+66333=>'L',
+66334=>'L',
+66336=>'L',
+66337=>'L',
+66338=>'L',
+66339=>'L',
+66352=>'L',
+66353=>'L',
+66354=>'L',
+66355=>'L',
+66356=>'L',
+66357=>'L',
+66358=>'L',
+66359=>'L',
+66360=>'L',
+66361=>'L',
+66362=>'L',
+66363=>'L',
+66364=>'L',
+66365=>'L',
+66366=>'L',
+66367=>'L',
+66368=>'L',
+66369=>'L',
+66370=>'L',
+66371=>'L',
+66372=>'L',
+66373=>'L',
+66374=>'L',
+66375=>'L',
+66376=>'L',
+66377=>'L',
+66378=>'L',
+66432=>'L',
+66433=>'L',
+66434=>'L',
+66435=>'L',
+66436=>'L',
+66437=>'L',
+66438=>'L',
+66439=>'L',
+66440=>'L',
+66441=>'L',
+66442=>'L',
+66443=>'L',
+66444=>'L',
+66445=>'L',
+66446=>'L',
+66447=>'L',
+66448=>'L',
+66449=>'L',
+66450=>'L',
+66451=>'L',
+66452=>'L',
+66453=>'L',
+66454=>'L',
+66455=>'L',
+66456=>'L',
+66457=>'L',
+66458=>'L',
+66459=>'L',
+66460=>'L',
+66461=>'L',
+66463=>'L',
+66464=>'L',
+66465=>'L',
+66466=>'L',
+66467=>'L',
+66468=>'L',
+66469=>'L',
+66470=>'L',
+66471=>'L',
+66472=>'L',
+66473=>'L',
+66474=>'L',
+66475=>'L',
+66476=>'L',
+66477=>'L',
+66478=>'L',
+66479=>'L',
+66480=>'L',
+66481=>'L',
+66482=>'L',
+66483=>'L',
+66484=>'L',
+66485=>'L',
+66486=>'L',
+66487=>'L',
+66488=>'L',
+66489=>'L',
+66490=>'L',
+66491=>'L',
+66492=>'L',
+66493=>'L',
+66494=>'L',
+66495=>'L',
+66496=>'L',
+66497=>'L',
+66498=>'L',
+66499=>'L',
+66504=>'L',
+66505=>'L',
+66506=>'L',
+66507=>'L',
+66508=>'L',
+66509=>'L',
+66510=>'L',
+66511=>'L',
+66512=>'L',
+66513=>'L',
+66514=>'L',
+66515=>'L',
+66516=>'L',
+66517=>'L',
+66560=>'L',
+66561=>'L',
+66562=>'L',
+66563=>'L',
+66564=>'L',
+66565=>'L',
+66566=>'L',
+66567=>'L',
+66568=>'L',
+66569=>'L',
+66570=>'L',
+66571=>'L',
+66572=>'L',
+66573=>'L',
+66574=>'L',
+66575=>'L',
+66576=>'L',
+66577=>'L',
+66578=>'L',
+66579=>'L',
+66580=>'L',
+66581=>'L',
+66582=>'L',
+66583=>'L',
+66584=>'L',
+66585=>'L',
+66586=>'L',
+66587=>'L',
+66588=>'L',
+66589=>'L',
+66590=>'L',
+66591=>'L',
+66592=>'L',
+66593=>'L',
+66594=>'L',
+66595=>'L',
+66596=>'L',
+66597=>'L',
+66598=>'L',
+66599=>'L',
+66600=>'L',
+66601=>'L',
+66602=>'L',
+66603=>'L',
+66604=>'L',
+66605=>'L',
+66606=>'L',
+66607=>'L',
+66608=>'L',
+66609=>'L',
+66610=>'L',
+66611=>'L',
+66612=>'L',
+66613=>'L',
+66614=>'L',
+66615=>'L',
+66616=>'L',
+66617=>'L',
+66618=>'L',
+66619=>'L',
+66620=>'L',
+66621=>'L',
+66622=>'L',
+66623=>'L',
+66624=>'L',
+66625=>'L',
+66626=>'L',
+66627=>'L',
+66628=>'L',
+66629=>'L',
+66630=>'L',
+66631=>'L',
+66632=>'L',
+66633=>'L',
+66634=>'L',
+66635=>'L',
+66636=>'L',
+66637=>'L',
+66638=>'L',
+66639=>'L',
+66640=>'L',
+66641=>'L',
+66642=>'L',
+66643=>'L',
+66644=>'L',
+66645=>'L',
+66646=>'L',
+66647=>'L',
+66648=>'L',
+66649=>'L',
+66650=>'L',
+66651=>'L',
+66652=>'L',
+66653=>'L',
+66654=>'L',
+66655=>'L',
+66656=>'L',
+66657=>'L',
+66658=>'L',
+66659=>'L',
+66660=>'L',
+66661=>'L',
+66662=>'L',
+66663=>'L',
+66664=>'L',
+66665=>'L',
+66666=>'L',
+66667=>'L',
+66668=>'L',
+66669=>'L',
+66670=>'L',
+66671=>'L',
+66672=>'L',
+66673=>'L',
+66674=>'L',
+66675=>'L',
+66676=>'L',
+66677=>'L',
+66678=>'L',
+66679=>'L',
+66680=>'L',
+66681=>'L',
+66682=>'L',
+66683=>'L',
+66684=>'L',
+66685=>'L',
+66686=>'L',
+66687=>'L',
+66688=>'L',
+66689=>'L',
+66690=>'L',
+66691=>'L',
+66692=>'L',
+66693=>'L',
+66694=>'L',
+66695=>'L',
+66696=>'L',
+66697=>'L',
+66698=>'L',
+66699=>'L',
+66700=>'L',
+66701=>'L',
+66702=>'L',
+66703=>'L',
+66704=>'L',
+66705=>'L',
+66706=>'L',
+66707=>'L',
+66708=>'L',
+66709=>'L',
+66710=>'L',
+66711=>'L',
+66712=>'L',
+66713=>'L',
+66714=>'L',
+66715=>'L',
+66716=>'L',
+66717=>'L',
+66720=>'L',
+66721=>'L',
+66722=>'L',
+66723=>'L',
+66724=>'L',
+66725=>'L',
+66726=>'L',
+66727=>'L',
+66728=>'L',
+66729=>'L',
+67584=>'R',
+67585=>'R',
+67586=>'R',
+67587=>'R',
+67588=>'R',
+67589=>'R',
+67592=>'R',
+67594=>'R',
+67595=>'R',
+67596=>'R',
+67597=>'R',
+67598=>'R',
+67599=>'R',
+67600=>'R',
+67601=>'R',
+67602=>'R',
+67603=>'R',
+67604=>'R',
+67605=>'R',
+67606=>'R',
+67607=>'R',
+67608=>'R',
+67609=>'R',
+67610=>'R',
+67611=>'R',
+67612=>'R',
+67613=>'R',
+67614=>'R',
+67615=>'R',
+67616=>'R',
+67617=>'R',
+67618=>'R',
+67619=>'R',
+67620=>'R',
+67621=>'R',
+67622=>'R',
+67623=>'R',
+67624=>'R',
+67625=>'R',
+67626=>'R',
+67627=>'R',
+67628=>'R',
+67629=>'R',
+67630=>'R',
+67631=>'R',
+67632=>'R',
+67633=>'R',
+67634=>'R',
+67635=>'R',
+67636=>'R',
+67637=>'R',
+67639=>'R',
+67640=>'R',
+67644=>'R',
+67647=>'R',
+67840=>'R',
+67841=>'R',
+67842=>'R',
+67843=>'R',
+67844=>'R',
+67845=>'R',
+67846=>'R',
+67847=>'R',
+67848=>'R',
+67849=>'R',
+67850=>'R',
+67851=>'R',
+67852=>'R',
+67853=>'R',
+67854=>'R',
+67855=>'R',
+67856=>'R',
+67857=>'R',
+67858=>'R',
+67859=>'R',
+67860=>'R',
+67861=>'R',
+67862=>'R',
+67863=>'R',
+67864=>'R',
+67865=>'R',
+67871=>'ON',
+68096=>'R',
+68097=>'NSM',
+68098=>'NSM',
+68099=>'NSM',
+68101=>'NSM',
+68102=>'NSM',
+68108=>'NSM',
+68109=>'NSM',
+68110=>'NSM',
+68111=>'NSM',
+68112=>'R',
+68113=>'R',
+68114=>'R',
+68115=>'R',
+68117=>'R',
+68118=>'R',
+68119=>'R',
+68121=>'R',
+68122=>'R',
+68123=>'R',
+68124=>'R',
+68125=>'R',
+68126=>'R',
+68127=>'R',
+68128=>'R',
+68129=>'R',
+68130=>'R',
+68131=>'R',
+68132=>'R',
+68133=>'R',
+68134=>'R',
+68135=>'R',
+68136=>'R',
+68137=>'R',
+68138=>'R',
+68139=>'R',
+68140=>'R',
+68141=>'R',
+68142=>'R',
+68143=>'R',
+68144=>'R',
+68145=>'R',
+68146=>'R',
+68147=>'R',
+68152=>'NSM',
+68153=>'NSM',
+68154=>'NSM',
+68159=>'NSM',
+68160=>'R',
+68161=>'R',
+68162=>'R',
+68163=>'R',
+68164=>'R',
+68165=>'R',
+68166=>'R',
+68167=>'R',
+68176=>'R',
+68177=>'R',
+68178=>'R',
+68179=>'R',
+68180=>'R',
+68181=>'R',
+68182=>'R',
+68183=>'R',
+68184=>'R',
+73728=>'L',
+73729=>'L',
+73730=>'L',
+73731=>'L',
+73732=>'L',
+73733=>'L',
+73734=>'L',
+73735=>'L',
+73736=>'L',
+73737=>'L',
+73738=>'L',
+73739=>'L',
+73740=>'L',
+73741=>'L',
+73742=>'L',
+73743=>'L',
+73744=>'L',
+73745=>'L',
+73746=>'L',
+73747=>'L',
+73748=>'L',
+73749=>'L',
+73750=>'L',
+73751=>'L',
+73752=>'L',
+73753=>'L',
+73754=>'L',
+73755=>'L',
+73756=>'L',
+73757=>'L',
+73758=>'L',
+73759=>'L',
+73760=>'L',
+73761=>'L',
+73762=>'L',
+73763=>'L',
+73764=>'L',
+73765=>'L',
+73766=>'L',
+73767=>'L',
+73768=>'L',
+73769=>'L',
+73770=>'L',
+73771=>'L',
+73772=>'L',
+73773=>'L',
+73774=>'L',
+73775=>'L',
+73776=>'L',
+73777=>'L',
+73778=>'L',
+73779=>'L',
+73780=>'L',
+73781=>'L',
+73782=>'L',
+73783=>'L',
+73784=>'L',
+73785=>'L',
+73786=>'L',
+73787=>'L',
+73788=>'L',
+73789=>'L',
+73790=>'L',
+73791=>'L',
+73792=>'L',
+73793=>'L',
+73794=>'L',
+73795=>'L',
+73796=>'L',
+73797=>'L',
+73798=>'L',
+73799=>'L',
+73800=>'L',
+73801=>'L',
+73802=>'L',
+73803=>'L',
+73804=>'L',
+73805=>'L',
+73806=>'L',
+73807=>'L',
+73808=>'L',
+73809=>'L',
+73810=>'L',
+73811=>'L',
+73812=>'L',
+73813=>'L',
+73814=>'L',
+73815=>'L',
+73816=>'L',
+73817=>'L',
+73818=>'L',
+73819=>'L',
+73820=>'L',
+73821=>'L',
+73822=>'L',
+73823=>'L',
+73824=>'L',
+73825=>'L',
+73826=>'L',
+73827=>'L',
+73828=>'L',
+73829=>'L',
+73830=>'L',
+73831=>'L',
+73832=>'L',
+73833=>'L',
+73834=>'L',
+73835=>'L',
+73836=>'L',
+73837=>'L',
+73838=>'L',
+73839=>'L',
+73840=>'L',
+73841=>'L',
+73842=>'L',
+73843=>'L',
+73844=>'L',
+73845=>'L',
+73846=>'L',
+73847=>'L',
+73848=>'L',
+73849=>'L',
+73850=>'L',
+73851=>'L',
+73852=>'L',
+73853=>'L',
+73854=>'L',
+73855=>'L',
+73856=>'L',
+73857=>'L',
+73858=>'L',
+73859=>'L',
+73860=>'L',
+73861=>'L',
+73862=>'L',
+73863=>'L',
+73864=>'L',
+73865=>'L',
+73866=>'L',
+73867=>'L',
+73868=>'L',
+73869=>'L',
+73870=>'L',
+73871=>'L',
+73872=>'L',
+73873=>'L',
+73874=>'L',
+73875=>'L',
+73876=>'L',
+73877=>'L',
+73878=>'L',
+73879=>'L',
+73880=>'L',
+73881=>'L',
+73882=>'L',
+73883=>'L',
+73884=>'L',
+73885=>'L',
+73886=>'L',
+73887=>'L',
+73888=>'L',
+73889=>'L',
+73890=>'L',
+73891=>'L',
+73892=>'L',
+73893=>'L',
+73894=>'L',
+73895=>'L',
+73896=>'L',
+73897=>'L',
+73898=>'L',
+73899=>'L',
+73900=>'L',
+73901=>'L',
+73902=>'L',
+73903=>'L',
+73904=>'L',
+73905=>'L',
+73906=>'L',
+73907=>'L',
+73908=>'L',
+73909=>'L',
+73910=>'L',
+73911=>'L',
+73912=>'L',
+73913=>'L',
+73914=>'L',
+73915=>'L',
+73916=>'L',
+73917=>'L',
+73918=>'L',
+73919=>'L',
+73920=>'L',
+73921=>'L',
+73922=>'L',
+73923=>'L',
+73924=>'L',
+73925=>'L',
+73926=>'L',
+73927=>'L',
+73928=>'L',
+73929=>'L',
+73930=>'L',
+73931=>'L',
+73932=>'L',
+73933=>'L',
+73934=>'L',
+73935=>'L',
+73936=>'L',
+73937=>'L',
+73938=>'L',
+73939=>'L',
+73940=>'L',
+73941=>'L',
+73942=>'L',
+73943=>'L',
+73944=>'L',
+73945=>'L',
+73946=>'L',
+73947=>'L',
+73948=>'L',
+73949=>'L',
+73950=>'L',
+73951=>'L',
+73952=>'L',
+73953=>'L',
+73954=>'L',
+73955=>'L',
+73956=>'L',
+73957=>'L',
+73958=>'L',
+73959=>'L',
+73960=>'L',
+73961=>'L',
+73962=>'L',
+73963=>'L',
+73964=>'L',
+73965=>'L',
+73966=>'L',
+73967=>'L',
+73968=>'L',
+73969=>'L',
+73970=>'L',
+73971=>'L',
+73972=>'L',
+73973=>'L',
+73974=>'L',
+73975=>'L',
+73976=>'L',
+73977=>'L',
+73978=>'L',
+73979=>'L',
+73980=>'L',
+73981=>'L',
+73982=>'L',
+73983=>'L',
+73984=>'L',
+73985=>'L',
+73986=>'L',
+73987=>'L',
+73988=>'L',
+73989=>'L',
+73990=>'L',
+73991=>'L',
+73992=>'L',
+73993=>'L',
+73994=>'L',
+73995=>'L',
+73996=>'L',
+73997=>'L',
+73998=>'L',
+73999=>'L',
+74000=>'L',
+74001=>'L',
+74002=>'L',
+74003=>'L',
+74004=>'L',
+74005=>'L',
+74006=>'L',
+74007=>'L',
+74008=>'L',
+74009=>'L',
+74010=>'L',
+74011=>'L',
+74012=>'L',
+74013=>'L',
+74014=>'L',
+74015=>'L',
+74016=>'L',
+74017=>'L',
+74018=>'L',
+74019=>'L',
+74020=>'L',
+74021=>'L',
+74022=>'L',
+74023=>'L',
+74024=>'L',
+74025=>'L',
+74026=>'L',
+74027=>'L',
+74028=>'L',
+74029=>'L',
+74030=>'L',
+74031=>'L',
+74032=>'L',
+74033=>'L',
+74034=>'L',
+74035=>'L',
+74036=>'L',
+74037=>'L',
+74038=>'L',
+74039=>'L',
+74040=>'L',
+74041=>'L',
+74042=>'L',
+74043=>'L',
+74044=>'L',
+74045=>'L',
+74046=>'L',
+74047=>'L',
+74048=>'L',
+74049=>'L',
+74050=>'L',
+74051=>'L',
+74052=>'L',
+74053=>'L',
+74054=>'L',
+74055=>'L',
+74056=>'L',
+74057=>'L',
+74058=>'L',
+74059=>'L',
+74060=>'L',
+74061=>'L',
+74062=>'L',
+74063=>'L',
+74064=>'L',
+74065=>'L',
+74066=>'L',
+74067=>'L',
+74068=>'L',
+74069=>'L',
+74070=>'L',
+74071=>'L',
+74072=>'L',
+74073=>'L',
+74074=>'L',
+74075=>'L',
+74076=>'L',
+74077=>'L',
+74078=>'L',
+74079=>'L',
+74080=>'L',
+74081=>'L',
+74082=>'L',
+74083=>'L',
+74084=>'L',
+74085=>'L',
+74086=>'L',
+74087=>'L',
+74088=>'L',
+74089=>'L',
+74090=>'L',
+74091=>'L',
+74092=>'L',
+74093=>'L',
+74094=>'L',
+74095=>'L',
+74096=>'L',
+74097=>'L',
+74098=>'L',
+74099=>'L',
+74100=>'L',
+74101=>'L',
+74102=>'L',
+74103=>'L',
+74104=>'L',
+74105=>'L',
+74106=>'L',
+74107=>'L',
+74108=>'L',
+74109=>'L',
+74110=>'L',
+74111=>'L',
+74112=>'L',
+74113=>'L',
+74114=>'L',
+74115=>'L',
+74116=>'L',
+74117=>'L',
+74118=>'L',
+74119=>'L',
+74120=>'L',
+74121=>'L',
+74122=>'L',
+74123=>'L',
+74124=>'L',
+74125=>'L',
+74126=>'L',
+74127=>'L',
+74128=>'L',
+74129=>'L',
+74130=>'L',
+74131=>'L',
+74132=>'L',
+74133=>'L',
+74134=>'L',
+74135=>'L',
+74136=>'L',
+74137=>'L',
+74138=>'L',
+74139=>'L',
+74140=>'L',
+74141=>'L',
+74142=>'L',
+74143=>'L',
+74144=>'L',
+74145=>'L',
+74146=>'L',
+74147=>'L',
+74148=>'L',
+74149=>'L',
+74150=>'L',
+74151=>'L',
+74152=>'L',
+74153=>'L',
+74154=>'L',
+74155=>'L',
+74156=>'L',
+74157=>'L',
+74158=>'L',
+74159=>'L',
+74160=>'L',
+74161=>'L',
+74162=>'L',
+74163=>'L',
+74164=>'L',
+74165=>'L',
+74166=>'L',
+74167=>'L',
+74168=>'L',
+74169=>'L',
+74170=>'L',
+74171=>'L',
+74172=>'L',
+74173=>'L',
+74174=>'L',
+74175=>'L',
+74176=>'L',
+74177=>'L',
+74178=>'L',
+74179=>'L',
+74180=>'L',
+74181=>'L',
+74182=>'L',
+74183=>'L',
+74184=>'L',
+74185=>'L',
+74186=>'L',
+74187=>'L',
+74188=>'L',
+74189=>'L',
+74190=>'L',
+74191=>'L',
+74192=>'L',
+74193=>'L',
+74194=>'L',
+74195=>'L',
+74196=>'L',
+74197=>'L',
+74198=>'L',
+74199=>'L',
+74200=>'L',
+74201=>'L',
+74202=>'L',
+74203=>'L',
+74204=>'L',
+74205=>'L',
+74206=>'L',
+74207=>'L',
+74208=>'L',
+74209=>'L',
+74210=>'L',
+74211=>'L',
+74212=>'L',
+74213=>'L',
+74214=>'L',
+74215=>'L',
+74216=>'L',
+74217=>'L',
+74218=>'L',
+74219=>'L',
+74220=>'L',
+74221=>'L',
+74222=>'L',
+74223=>'L',
+74224=>'L',
+74225=>'L',
+74226=>'L',
+74227=>'L',
+74228=>'L',
+74229=>'L',
+74230=>'L',
+74231=>'L',
+74232=>'L',
+74233=>'L',
+74234=>'L',
+74235=>'L',
+74236=>'L',
+74237=>'L',
+74238=>'L',
+74239=>'L',
+74240=>'L',
+74241=>'L',
+74242=>'L',
+74243=>'L',
+74244=>'L',
+74245=>'L',
+74246=>'L',
+74247=>'L',
+74248=>'L',
+74249=>'L',
+74250=>'L',
+74251=>'L',
+74252=>'L',
+74253=>'L',
+74254=>'L',
+74255=>'L',
+74256=>'L',
+74257=>'L',
+74258=>'L',
+74259=>'L',
+74260=>'L',
+74261=>'L',
+74262=>'L',
+74263=>'L',
+74264=>'L',
+74265=>'L',
+74266=>'L',
+74267=>'L',
+74268=>'L',
+74269=>'L',
+74270=>'L',
+74271=>'L',
+74272=>'L',
+74273=>'L',
+74274=>'L',
+74275=>'L',
+74276=>'L',
+74277=>'L',
+74278=>'L',
+74279=>'L',
+74280=>'L',
+74281=>'L',
+74282=>'L',
+74283=>'L',
+74284=>'L',
+74285=>'L',
+74286=>'L',
+74287=>'L',
+74288=>'L',
+74289=>'L',
+74290=>'L',
+74291=>'L',
+74292=>'L',
+74293=>'L',
+74294=>'L',
+74295=>'L',
+74296=>'L',
+74297=>'L',
+74298=>'L',
+74299=>'L',
+74300=>'L',
+74301=>'L',
+74302=>'L',
+74303=>'L',
+74304=>'L',
+74305=>'L',
+74306=>'L',
+74307=>'L',
+74308=>'L',
+74309=>'L',
+74310=>'L',
+74311=>'L',
+74312=>'L',
+74313=>'L',
+74314=>'L',
+74315=>'L',
+74316=>'L',
+74317=>'L',
+74318=>'L',
+74319=>'L',
+74320=>'L',
+74321=>'L',
+74322=>'L',
+74323=>'L',
+74324=>'L',
+74325=>'L',
+74326=>'L',
+74327=>'L',
+74328=>'L',
+74329=>'L',
+74330=>'L',
+74331=>'L',
+74332=>'L',
+74333=>'L',
+74334=>'L',
+74335=>'L',
+74336=>'L',
+74337=>'L',
+74338=>'L',
+74339=>'L',
+74340=>'L',
+74341=>'L',
+74342=>'L',
+74343=>'L',
+74344=>'L',
+74345=>'L',
+74346=>'L',
+74347=>'L',
+74348=>'L',
+74349=>'L',
+74350=>'L',
+74351=>'L',
+74352=>'L',
+74353=>'L',
+74354=>'L',
+74355=>'L',
+74356=>'L',
+74357=>'L',
+74358=>'L',
+74359=>'L',
+74360=>'L',
+74361=>'L',
+74362=>'L',
+74363=>'L',
+74364=>'L',
+74365=>'L',
+74366=>'L',
+74367=>'L',
+74368=>'L',
+74369=>'L',
+74370=>'L',
+74371=>'L',
+74372=>'L',
+74373=>'L',
+74374=>'L',
+74375=>'L',
+74376=>'L',
+74377=>'L',
+74378=>'L',
+74379=>'L',
+74380=>'L',
+74381=>'L',
+74382=>'L',
+74383=>'L',
+74384=>'L',
+74385=>'L',
+74386=>'L',
+74387=>'L',
+74388=>'L',
+74389=>'L',
+74390=>'L',
+74391=>'L',
+74392=>'L',
+74393=>'L',
+74394=>'L',
+74395=>'L',
+74396=>'L',
+74397=>'L',
+74398=>'L',
+74399=>'L',
+74400=>'L',
+74401=>'L',
+74402=>'L',
+74403=>'L',
+74404=>'L',
+74405=>'L',
+74406=>'L',
+74407=>'L',
+74408=>'L',
+74409=>'L',
+74410=>'L',
+74411=>'L',
+74412=>'L',
+74413=>'L',
+74414=>'L',
+74415=>'L',
+74416=>'L',
+74417=>'L',
+74418=>'L',
+74419=>'L',
+74420=>'L',
+74421=>'L',
+74422=>'L',
+74423=>'L',
+74424=>'L',
+74425=>'L',
+74426=>'L',
+74427=>'L',
+74428=>'L',
+74429=>'L',
+74430=>'L',
+74431=>'L',
+74432=>'L',
+74433=>'L',
+74434=>'L',
+74435=>'L',
+74436=>'L',
+74437=>'L',
+74438=>'L',
+74439=>'L',
+74440=>'L',
+74441=>'L',
+74442=>'L',
+74443=>'L',
+74444=>'L',
+74445=>'L',
+74446=>'L',
+74447=>'L',
+74448=>'L',
+74449=>'L',
+74450=>'L',
+74451=>'L',
+74452=>'L',
+74453=>'L',
+74454=>'L',
+74455=>'L',
+74456=>'L',
+74457=>'L',
+74458=>'L',
+74459=>'L',
+74460=>'L',
+74461=>'L',
+74462=>'L',
+74463=>'L',
+74464=>'L',
+74465=>'L',
+74466=>'L',
+74467=>'L',
+74468=>'L',
+74469=>'L',
+74470=>'L',
+74471=>'L',
+74472=>'L',
+74473=>'L',
+74474=>'L',
+74475=>'L',
+74476=>'L',
+74477=>'L',
+74478=>'L',
+74479=>'L',
+74480=>'L',
+74481=>'L',
+74482=>'L',
+74483=>'L',
+74484=>'L',
+74485=>'L',
+74486=>'L',
+74487=>'L',
+74488=>'L',
+74489=>'L',
+74490=>'L',
+74491=>'L',
+74492=>'L',
+74493=>'L',
+74494=>'L',
+74495=>'L',
+74496=>'L',
+74497=>'L',
+74498=>'L',
+74499=>'L',
+74500=>'L',
+74501=>'L',
+74502=>'L',
+74503=>'L',
+74504=>'L',
+74505=>'L',
+74506=>'L',
+74507=>'L',
+74508=>'L',
+74509=>'L',
+74510=>'L',
+74511=>'L',
+74512=>'L',
+74513=>'L',
+74514=>'L',
+74515=>'L',
+74516=>'L',
+74517=>'L',
+74518=>'L',
+74519=>'L',
+74520=>'L',
+74521=>'L',
+74522=>'L',
+74523=>'L',
+74524=>'L',
+74525=>'L',
+74526=>'L',
+74527=>'L',
+74528=>'L',
+74529=>'L',
+74530=>'L',
+74531=>'L',
+74532=>'L',
+74533=>'L',
+74534=>'L',
+74535=>'L',
+74536=>'L',
+74537=>'L',
+74538=>'L',
+74539=>'L',
+74540=>'L',
+74541=>'L',
+74542=>'L',
+74543=>'L',
+74544=>'L',
+74545=>'L',
+74546=>'L',
+74547=>'L',
+74548=>'L',
+74549=>'L',
+74550=>'L',
+74551=>'L',
+74552=>'L',
+74553=>'L',
+74554=>'L',
+74555=>'L',
+74556=>'L',
+74557=>'L',
+74558=>'L',
+74559=>'L',
+74560=>'L',
+74561=>'L',
+74562=>'L',
+74563=>'L',
+74564=>'L',
+74565=>'L',
+74566=>'L',
+74567=>'L',
+74568=>'L',
+74569=>'L',
+74570=>'L',
+74571=>'L',
+74572=>'L',
+74573=>'L',
+74574=>'L',
+74575=>'L',
+74576=>'L',
+74577=>'L',
+74578=>'L',
+74579=>'L',
+74580=>'L',
+74581=>'L',
+74582=>'L',
+74583=>'L',
+74584=>'L',
+74585=>'L',
+74586=>'L',
+74587=>'L',
+74588=>'L',
+74589=>'L',
+74590=>'L',
+74591=>'L',
+74592=>'L',
+74593=>'L',
+74594=>'L',
+74595=>'L',
+74596=>'L',
+74597=>'L',
+74598=>'L',
+74599=>'L',
+74600=>'L',
+74601=>'L',
+74602=>'L',
+74603=>'L',
+74604=>'L',
+74605=>'L',
+74606=>'L',
+74752=>'L',
+74753=>'L',
+74754=>'L',
+74755=>'L',
+74756=>'L',
+74757=>'L',
+74758=>'L',
+74759=>'L',
+74760=>'L',
+74761=>'L',
+74762=>'L',
+74763=>'L',
+74764=>'L',
+74765=>'L',
+74766=>'L',
+74767=>'L',
+74768=>'L',
+74769=>'L',
+74770=>'L',
+74771=>'L',
+74772=>'L',
+74773=>'L',
+74774=>'L',
+74775=>'L',
+74776=>'L',
+74777=>'L',
+74778=>'L',
+74779=>'L',
+74780=>'L',
+74781=>'L',
+74782=>'L',
+74783=>'L',
+74784=>'L',
+74785=>'L',
+74786=>'L',
+74787=>'L',
+74788=>'L',
+74789=>'L',
+74790=>'L',
+74791=>'L',
+74792=>'L',
+74793=>'L',
+74794=>'L',
+74795=>'L',
+74796=>'L',
+74797=>'L',
+74798=>'L',
+74799=>'L',
+74800=>'L',
+74801=>'L',
+74802=>'L',
+74803=>'L',
+74804=>'L',
+74805=>'L',
+74806=>'L',
+74807=>'L',
+74808=>'L',
+74809=>'L',
+74810=>'L',
+74811=>'L',
+74812=>'L',
+74813=>'L',
+74814=>'L',
+74815=>'L',
+74816=>'L',
+74817=>'L',
+74818=>'L',
+74819=>'L',
+74820=>'L',
+74821=>'L',
+74822=>'L',
+74823=>'L',
+74824=>'L',
+74825=>'L',
+74826=>'L',
+74827=>'L',
+74828=>'L',
+74829=>'L',
+74830=>'L',
+74831=>'L',
+74832=>'L',
+74833=>'L',
+74834=>'L',
+74835=>'L',
+74836=>'L',
+74837=>'L',
+74838=>'L',
+74839=>'L',
+74840=>'L',
+74841=>'L',
+74842=>'L',
+74843=>'L',
+74844=>'L',
+74845=>'L',
+74846=>'L',
+74847=>'L',
+74848=>'L',
+74849=>'L',
+74850=>'L',
+74864=>'L',
+74865=>'L',
+74866=>'L',
+74867=>'L',
+118784=>'L',
+118785=>'L',
+118786=>'L',
+118787=>'L',
+118788=>'L',
+118789=>'L',
+118790=>'L',
+118791=>'L',
+118792=>'L',
+118793=>'L',
+118794=>'L',
+118795=>'L',
+118796=>'L',
+118797=>'L',
+118798=>'L',
+118799=>'L',
+118800=>'L',
+118801=>'L',
+118802=>'L',
+118803=>'L',
+118804=>'L',
+118805=>'L',
+118806=>'L',
+118807=>'L',
+118808=>'L',
+118809=>'L',
+118810=>'L',
+118811=>'L',
+118812=>'L',
+118813=>'L',
+118814=>'L',
+118815=>'L',
+118816=>'L',
+118817=>'L',
+118818=>'L',
+118819=>'L',
+118820=>'L',
+118821=>'L',
+118822=>'L',
+118823=>'L',
+118824=>'L',
+118825=>'L',
+118826=>'L',
+118827=>'L',
+118828=>'L',
+118829=>'L',
+118830=>'L',
+118831=>'L',
+118832=>'L',
+118833=>'L',
+118834=>'L',
+118835=>'L',
+118836=>'L',
+118837=>'L',
+118838=>'L',
+118839=>'L',
+118840=>'L',
+118841=>'L',
+118842=>'L',
+118843=>'L',
+118844=>'L',
+118845=>'L',
+118846=>'L',
+118847=>'L',
+118848=>'L',
+118849=>'L',
+118850=>'L',
+118851=>'L',
+118852=>'L',
+118853=>'L',
+118854=>'L',
+118855=>'L',
+118856=>'L',
+118857=>'L',
+118858=>'L',
+118859=>'L',
+118860=>'L',
+118861=>'L',
+118862=>'L',
+118863=>'L',
+118864=>'L',
+118865=>'L',
+118866=>'L',
+118867=>'L',
+118868=>'L',
+118869=>'L',
+118870=>'L',
+118871=>'L',
+118872=>'L',
+118873=>'L',
+118874=>'L',
+118875=>'L',
+118876=>'L',
+118877=>'L',
+118878=>'L',
+118879=>'L',
+118880=>'L',
+118881=>'L',
+118882=>'L',
+118883=>'L',
+118884=>'L',
+118885=>'L',
+118886=>'L',
+118887=>'L',
+118888=>'L',
+118889=>'L',
+118890=>'L',
+118891=>'L',
+118892=>'L',
+118893=>'L',
+118894=>'L',
+118895=>'L',
+118896=>'L',
+118897=>'L',
+118898=>'L',
+118899=>'L',
+118900=>'L',
+118901=>'L',
+118902=>'L',
+118903=>'L',
+118904=>'L',
+118905=>'L',
+118906=>'L',
+118907=>'L',
+118908=>'L',
+118909=>'L',
+118910=>'L',
+118911=>'L',
+118912=>'L',
+118913=>'L',
+118914=>'L',
+118915=>'L',
+118916=>'L',
+118917=>'L',
+118918=>'L',
+118919=>'L',
+118920=>'L',
+118921=>'L',
+118922=>'L',
+118923=>'L',
+118924=>'L',
+118925=>'L',
+118926=>'L',
+118927=>'L',
+118928=>'L',
+118929=>'L',
+118930=>'L',
+118931=>'L',
+118932=>'L',
+118933=>'L',
+118934=>'L',
+118935=>'L',
+118936=>'L',
+118937=>'L',
+118938=>'L',
+118939=>'L',
+118940=>'L',
+118941=>'L',
+118942=>'L',
+118943=>'L',
+118944=>'L',
+118945=>'L',
+118946=>'L',
+118947=>'L',
+118948=>'L',
+118949=>'L',
+118950=>'L',
+118951=>'L',
+118952=>'L',
+118953=>'L',
+118954=>'L',
+118955=>'L',
+118956=>'L',
+118957=>'L',
+118958=>'L',
+118959=>'L',
+118960=>'L',
+118961=>'L',
+118962=>'L',
+118963=>'L',
+118964=>'L',
+118965=>'L',
+118966=>'L',
+118967=>'L',
+118968=>'L',
+118969=>'L',
+118970=>'L',
+118971=>'L',
+118972=>'L',
+118973=>'L',
+118974=>'L',
+118975=>'L',
+118976=>'L',
+118977=>'L',
+118978=>'L',
+118979=>'L',
+118980=>'L',
+118981=>'L',
+118982=>'L',
+118983=>'L',
+118984=>'L',
+118985=>'L',
+118986=>'L',
+118987=>'L',
+118988=>'L',
+118989=>'L',
+118990=>'L',
+118991=>'L',
+118992=>'L',
+118993=>'L',
+118994=>'L',
+118995=>'L',
+118996=>'L',
+118997=>'L',
+118998=>'L',
+118999=>'L',
+119000=>'L',
+119001=>'L',
+119002=>'L',
+119003=>'L',
+119004=>'L',
+119005=>'L',
+119006=>'L',
+119007=>'L',
+119008=>'L',
+119009=>'L',
+119010=>'L',
+119011=>'L',
+119012=>'L',
+119013=>'L',
+119014=>'L',
+119015=>'L',
+119016=>'L',
+119017=>'L',
+119018=>'L',
+119019=>'L',
+119020=>'L',
+119021=>'L',
+119022=>'L',
+119023=>'L',
+119024=>'L',
+119025=>'L',
+119026=>'L',
+119027=>'L',
+119028=>'L',
+119029=>'L',
+119040=>'L',
+119041=>'L',
+119042=>'L',
+119043=>'L',
+119044=>'L',
+119045=>'L',
+119046=>'L',
+119047=>'L',
+119048=>'L',
+119049=>'L',
+119050=>'L',
+119051=>'L',
+119052=>'L',
+119053=>'L',
+119054=>'L',
+119055=>'L',
+119056=>'L',
+119057=>'L',
+119058=>'L',
+119059=>'L',
+119060=>'L',
+119061=>'L',
+119062=>'L',
+119063=>'L',
+119064=>'L',
+119065=>'L',
+119066=>'L',
+119067=>'L',
+119068=>'L',
+119069=>'L',
+119070=>'L',
+119071=>'L',
+119072=>'L',
+119073=>'L',
+119074=>'L',
+119075=>'L',
+119076=>'L',
+119077=>'L',
+119078=>'L',
+119082=>'L',
+119083=>'L',
+119084=>'L',
+119085=>'L',
+119086=>'L',
+119087=>'L',
+119088=>'L',
+119089=>'L',
+119090=>'L',
+119091=>'L',
+119092=>'L',
+119093=>'L',
+119094=>'L',
+119095=>'L',
+119096=>'L',
+119097=>'L',
+119098=>'L',
+119099=>'L',
+119100=>'L',
+119101=>'L',
+119102=>'L',
+119103=>'L',
+119104=>'L',
+119105=>'L',
+119106=>'L',
+119107=>'L',
+119108=>'L',
+119109=>'L',
+119110=>'L',
+119111=>'L',
+119112=>'L',
+119113=>'L',
+119114=>'L',
+119115=>'L',
+119116=>'L',
+119117=>'L',
+119118=>'L',
+119119=>'L',
+119120=>'L',
+119121=>'L',
+119122=>'L',
+119123=>'L',
+119124=>'L',
+119125=>'L',
+119126=>'L',
+119127=>'L',
+119128=>'L',
+119129=>'L',
+119130=>'L',
+119131=>'L',
+119132=>'L',
+119133=>'L',
+119134=>'L',
+119135=>'L',
+119136=>'L',
+119137=>'L',
+119138=>'L',
+119139=>'L',
+119140=>'L',
+119141=>'L',
+119142=>'L',
+119143=>'NSM',
+119144=>'NSM',
+119145=>'NSM',
+119146=>'L',
+119147=>'L',
+119148=>'L',
+119149=>'L',
+119150=>'L',
+119151=>'L',
+119152=>'L',
+119153=>'L',
+119154=>'L',
+119155=>'BN',
+119156=>'BN',
+119157=>'BN',
+119158=>'BN',
+119159=>'BN',
+119160=>'BN',
+119161=>'BN',
+119162=>'BN',
+119163=>'NSM',
+119164=>'NSM',
+119165=>'NSM',
+119166=>'NSM',
+119167=>'NSM',
+119168=>'NSM',
+119169=>'NSM',
+119170=>'NSM',
+119171=>'L',
+119172=>'L',
+119173=>'NSM',
+119174=>'NSM',
+119175=>'NSM',
+119176=>'NSM',
+119177=>'NSM',
+119178=>'NSM',
+119179=>'NSM',
+119180=>'L',
+119181=>'L',
+119182=>'L',
+119183=>'L',
+119184=>'L',
+119185=>'L',
+119186=>'L',
+119187=>'L',
+119188=>'L',
+119189=>'L',
+119190=>'L',
+119191=>'L',
+119192=>'L',
+119193=>'L',
+119194=>'L',
+119195=>'L',
+119196=>'L',
+119197=>'L',
+119198=>'L',
+119199=>'L',
+119200=>'L',
+119201=>'L',
+119202=>'L',
+119203=>'L',
+119204=>'L',
+119205=>'L',
+119206=>'L',
+119207=>'L',
+119208=>'L',
+119209=>'L',
+119210=>'NSM',
+119211=>'NSM',
+119212=>'NSM',
+119213=>'NSM',
+119214=>'L',
+119215=>'L',
+119216=>'L',
+119217=>'L',
+119218=>'L',
+119219=>'L',
+119220=>'L',
+119221=>'L',
+119222=>'L',
+119223=>'L',
+119224=>'L',
+119225=>'L',
+119226=>'L',
+119227=>'L',
+119228=>'L',
+119229=>'L',
+119230=>'L',
+119231=>'L',
+119232=>'L',
+119233=>'L',
+119234=>'L',
+119235=>'L',
+119236=>'L',
+119237=>'L',
+119238=>'L',
+119239=>'L',
+119240=>'L',
+119241=>'L',
+119242=>'L',
+119243=>'L',
+119244=>'L',
+119245=>'L',
+119246=>'L',
+119247=>'L',
+119248=>'L',
+119249=>'L',
+119250=>'L',
+119251=>'L',
+119252=>'L',
+119253=>'L',
+119254=>'L',
+119255=>'L',
+119256=>'L',
+119257=>'L',
+119258=>'L',
+119259=>'L',
+119260=>'L',
+119261=>'L',
+119296=>'ON',
+119297=>'ON',
+119298=>'ON',
+119299=>'ON',
+119300=>'ON',
+119301=>'ON',
+119302=>'ON',
+119303=>'ON',
+119304=>'ON',
+119305=>'ON',
+119306=>'ON',
+119307=>'ON',
+119308=>'ON',
+119309=>'ON',
+119310=>'ON',
+119311=>'ON',
+119312=>'ON',
+119313=>'ON',
+119314=>'ON',
+119315=>'ON',
+119316=>'ON',
+119317=>'ON',
+119318=>'ON',
+119319=>'ON',
+119320=>'ON',
+119321=>'ON',
+119322=>'ON',
+119323=>'ON',
+119324=>'ON',
+119325=>'ON',
+119326=>'ON',
+119327=>'ON',
+119328=>'ON',
+119329=>'ON',
+119330=>'ON',
+119331=>'ON',
+119332=>'ON',
+119333=>'ON',
+119334=>'ON',
+119335=>'ON',
+119336=>'ON',
+119337=>'ON',
+119338=>'ON',
+119339=>'ON',
+119340=>'ON',
+119341=>'ON',
+119342=>'ON',
+119343=>'ON',
+119344=>'ON',
+119345=>'ON',
+119346=>'ON',
+119347=>'ON',
+119348=>'ON',
+119349=>'ON',
+119350=>'ON',
+119351=>'ON',
+119352=>'ON',
+119353=>'ON',
+119354=>'ON',
+119355=>'ON',
+119356=>'ON',
+119357=>'ON',
+119358=>'ON',
+119359=>'ON',
+119360=>'ON',
+119361=>'ON',
+119362=>'NSM',
+119363=>'NSM',
+119364=>'NSM',
+119365=>'ON',
+119552=>'ON',
+119553=>'ON',
+119554=>'ON',
+119555=>'ON',
+119556=>'ON',
+119557=>'ON',
+119558=>'ON',
+119559=>'ON',
+119560=>'ON',
+119561=>'ON',
+119562=>'ON',
+119563=>'ON',
+119564=>'ON',
+119565=>'ON',
+119566=>'ON',
+119567=>'ON',
+119568=>'ON',
+119569=>'ON',
+119570=>'ON',
+119571=>'ON',
+119572=>'ON',
+119573=>'ON',
+119574=>'ON',
+119575=>'ON',
+119576=>'ON',
+119577=>'ON',
+119578=>'ON',
+119579=>'ON',
+119580=>'ON',
+119581=>'ON',
+119582=>'ON',
+119583=>'ON',
+119584=>'ON',
+119585=>'ON',
+119586=>'ON',
+119587=>'ON',
+119588=>'ON',
+119589=>'ON',
+119590=>'ON',
+119591=>'ON',
+119592=>'ON',
+119593=>'ON',
+119594=>'ON',
+119595=>'ON',
+119596=>'ON',
+119597=>'ON',
+119598=>'ON',
+119599=>'ON',
+119600=>'ON',
+119601=>'ON',
+119602=>'ON',
+119603=>'ON',
+119604=>'ON',
+119605=>'ON',
+119606=>'ON',
+119607=>'ON',
+119608=>'ON',
+119609=>'ON',
+119610=>'ON',
+119611=>'ON',
+119612=>'ON',
+119613=>'ON',
+119614=>'ON',
+119615=>'ON',
+119616=>'ON',
+119617=>'ON',
+119618=>'ON',
+119619=>'ON',
+119620=>'ON',
+119621=>'ON',
+119622=>'ON',
+119623=>'ON',
+119624=>'ON',
+119625=>'ON',
+119626=>'ON',
+119627=>'ON',
+119628=>'ON',
+119629=>'ON',
+119630=>'ON',
+119631=>'ON',
+119632=>'ON',
+119633=>'ON',
+119634=>'ON',
+119635=>'ON',
+119636=>'ON',
+119637=>'ON',
+119638=>'ON',
+119648=>'L',
+119649=>'L',
+119650=>'L',
+119651=>'L',
+119652=>'L',
+119653=>'L',
+119654=>'L',
+119655=>'L',
+119656=>'L',
+119657=>'L',
+119658=>'L',
+119659=>'L',
+119660=>'L',
+119661=>'L',
+119662=>'L',
+119663=>'L',
+119664=>'L',
+119665=>'L',
+119808=>'L',
+119809=>'L',
+119810=>'L',
+119811=>'L',
+119812=>'L',
+119813=>'L',
+119814=>'L',
+119815=>'L',
+119816=>'L',
+119817=>'L',
+119818=>'L',
+119819=>'L',
+119820=>'L',
+119821=>'L',
+119822=>'L',
+119823=>'L',
+119824=>'L',
+119825=>'L',
+119826=>'L',
+119827=>'L',
+119828=>'L',
+119829=>'L',
+119830=>'L',
+119831=>'L',
+119832=>'L',
+119833=>'L',
+119834=>'L',
+119835=>'L',
+119836=>'L',
+119837=>'L',
+119838=>'L',
+119839=>'L',
+119840=>'L',
+119841=>'L',
+119842=>'L',
+119843=>'L',
+119844=>'L',
+119845=>'L',
+119846=>'L',
+119847=>'L',
+119848=>'L',
+119849=>'L',
+119850=>'L',
+119851=>'L',
+119852=>'L',
+119853=>'L',
+119854=>'L',
+119855=>'L',
+119856=>'L',
+119857=>'L',
+119858=>'L',
+119859=>'L',
+119860=>'L',
+119861=>'L',
+119862=>'L',
+119863=>'L',
+119864=>'L',
+119865=>'L',
+119866=>'L',
+119867=>'L',
+119868=>'L',
+119869=>'L',
+119870=>'L',
+119871=>'L',
+119872=>'L',
+119873=>'L',
+119874=>'L',
+119875=>'L',
+119876=>'L',
+119877=>'L',
+119878=>'L',
+119879=>'L',
+119880=>'L',
+119881=>'L',
+119882=>'L',
+119883=>'L',
+119884=>'L',
+119885=>'L',
+119886=>'L',
+119887=>'L',
+119888=>'L',
+119889=>'L',
+119890=>'L',
+119891=>'L',
+119892=>'L',
+119894=>'L',
+119895=>'L',
+119896=>'L',
+119897=>'L',
+119898=>'L',
+119899=>'L',
+119900=>'L',
+119901=>'L',
+119902=>'L',
+119903=>'L',
+119904=>'L',
+119905=>'L',
+119906=>'L',
+119907=>'L',
+119908=>'L',
+119909=>'L',
+119910=>'L',
+119911=>'L',
+119912=>'L',
+119913=>'L',
+119914=>'L',
+119915=>'L',
+119916=>'L',
+119917=>'L',
+119918=>'L',
+119919=>'L',
+119920=>'L',
+119921=>'L',
+119922=>'L',
+119923=>'L',
+119924=>'L',
+119925=>'L',
+119926=>'L',
+119927=>'L',
+119928=>'L',
+119929=>'L',
+119930=>'L',
+119931=>'L',
+119932=>'L',
+119933=>'L',
+119934=>'L',
+119935=>'L',
+119936=>'L',
+119937=>'L',
+119938=>'L',
+119939=>'L',
+119940=>'L',
+119941=>'L',
+119942=>'L',
+119943=>'L',
+119944=>'L',
+119945=>'L',
+119946=>'L',
+119947=>'L',
+119948=>'L',
+119949=>'L',
+119950=>'L',
+119951=>'L',
+119952=>'L',
+119953=>'L',
+119954=>'L',
+119955=>'L',
+119956=>'L',
+119957=>'L',
+119958=>'L',
+119959=>'L',
+119960=>'L',
+119961=>'L',
+119962=>'L',
+119963=>'L',
+119964=>'L',
+119966=>'L',
+119967=>'L',
+119970=>'L',
+119973=>'L',
+119974=>'L',
+119977=>'L',
+119978=>'L',
+119979=>'L',
+119980=>'L',
+119982=>'L',
+119983=>'L',
+119984=>'L',
+119985=>'L',
+119986=>'L',
+119987=>'L',
+119988=>'L',
+119989=>'L',
+119990=>'L',
+119991=>'L',
+119992=>'L',
+119993=>'L',
+119995=>'L',
+119997=>'L',
+119998=>'L',
+119999=>'L',
+120000=>'L',
+120001=>'L',
+120002=>'L',
+120003=>'L',
+120005=>'L',
+120006=>'L',
+120007=>'L',
+120008=>'L',
+120009=>'L',
+120010=>'L',
+120011=>'L',
+120012=>'L',
+120013=>'L',
+120014=>'L',
+120015=>'L',
+120016=>'L',
+120017=>'L',
+120018=>'L',
+120019=>'L',
+120020=>'L',
+120021=>'L',
+120022=>'L',
+120023=>'L',
+120024=>'L',
+120025=>'L',
+120026=>'L',
+120027=>'L',
+120028=>'L',
+120029=>'L',
+120030=>'L',
+120031=>'L',
+120032=>'L',
+120033=>'L',
+120034=>'L',
+120035=>'L',
+120036=>'L',
+120037=>'L',
+120038=>'L',
+120039=>'L',
+120040=>'L',
+120041=>'L',
+120042=>'L',
+120043=>'L',
+120044=>'L',
+120045=>'L',
+120046=>'L',
+120047=>'L',
+120048=>'L',
+120049=>'L',
+120050=>'L',
+120051=>'L',
+120052=>'L',
+120053=>'L',
+120054=>'L',
+120055=>'L',
+120056=>'L',
+120057=>'L',
+120058=>'L',
+120059=>'L',
+120060=>'L',
+120061=>'L',
+120062=>'L',
+120063=>'L',
+120064=>'L',
+120065=>'L',
+120066=>'L',
+120067=>'L',
+120068=>'L',
+120069=>'L',
+120071=>'L',
+120072=>'L',
+120073=>'L',
+120074=>'L',
+120077=>'L',
+120078=>'L',
+120079=>'L',
+120080=>'L',
+120081=>'L',
+120082=>'L',
+120083=>'L',
+120084=>'L',
+120086=>'L',
+120087=>'L',
+120088=>'L',
+120089=>'L',
+120090=>'L',
+120091=>'L',
+120092=>'L',
+120094=>'L',
+120095=>'L',
+120096=>'L',
+120097=>'L',
+120098=>'L',
+120099=>'L',
+120100=>'L',
+120101=>'L',
+120102=>'L',
+120103=>'L',
+120104=>'L',
+120105=>'L',
+120106=>'L',
+120107=>'L',
+120108=>'L',
+120109=>'L',
+120110=>'L',
+120111=>'L',
+120112=>'L',
+120113=>'L',
+120114=>'L',
+120115=>'L',
+120116=>'L',
+120117=>'L',
+120118=>'L',
+120119=>'L',
+120120=>'L',
+120121=>'L',
+120123=>'L',
+120124=>'L',
+120125=>'L',
+120126=>'L',
+120128=>'L',
+120129=>'L',
+120130=>'L',
+120131=>'L',
+120132=>'L',
+120134=>'L',
+120138=>'L',
+120139=>'L',
+120140=>'L',
+120141=>'L',
+120142=>'L',
+120143=>'L',
+120144=>'L',
+120146=>'L',
+120147=>'L',
+120148=>'L',
+120149=>'L',
+120150=>'L',
+120151=>'L',
+120152=>'L',
+120153=>'L',
+120154=>'L',
+120155=>'L',
+120156=>'L',
+120157=>'L',
+120158=>'L',
+120159=>'L',
+120160=>'L',
+120161=>'L',
+120162=>'L',
+120163=>'L',
+120164=>'L',
+120165=>'L',
+120166=>'L',
+120167=>'L',
+120168=>'L',
+120169=>'L',
+120170=>'L',
+120171=>'L',
+120172=>'L',
+120173=>'L',
+120174=>'L',
+120175=>'L',
+120176=>'L',
+120177=>'L',
+120178=>'L',
+120179=>'L',
+120180=>'L',
+120181=>'L',
+120182=>'L',
+120183=>'L',
+120184=>'L',
+120185=>'L',
+120186=>'L',
+120187=>'L',
+120188=>'L',
+120189=>'L',
+120190=>'L',
+120191=>'L',
+120192=>'L',
+120193=>'L',
+120194=>'L',
+120195=>'L',
+120196=>'L',
+120197=>'L',
+120198=>'L',
+120199=>'L',
+120200=>'L',
+120201=>'L',
+120202=>'L',
+120203=>'L',
+120204=>'L',
+120205=>'L',
+120206=>'L',
+120207=>'L',
+120208=>'L',
+120209=>'L',
+120210=>'L',
+120211=>'L',
+120212=>'L',
+120213=>'L',
+120214=>'L',
+120215=>'L',
+120216=>'L',
+120217=>'L',
+120218=>'L',
+120219=>'L',
+120220=>'L',
+120221=>'L',
+120222=>'L',
+120223=>'L',
+120224=>'L',
+120225=>'L',
+120226=>'L',
+120227=>'L',
+120228=>'L',
+120229=>'L',
+120230=>'L',
+120231=>'L',
+120232=>'L',
+120233=>'L',
+120234=>'L',
+120235=>'L',
+120236=>'L',
+120237=>'L',
+120238=>'L',
+120239=>'L',
+120240=>'L',
+120241=>'L',
+120242=>'L',
+120243=>'L',
+120244=>'L',
+120245=>'L',
+120246=>'L',
+120247=>'L',
+120248=>'L',
+120249=>'L',
+120250=>'L',
+120251=>'L',
+120252=>'L',
+120253=>'L',
+120254=>'L',
+120255=>'L',
+120256=>'L',
+120257=>'L',
+120258=>'L',
+120259=>'L',
+120260=>'L',
+120261=>'L',
+120262=>'L',
+120263=>'L',
+120264=>'L',
+120265=>'L',
+120266=>'L',
+120267=>'L',
+120268=>'L',
+120269=>'L',
+120270=>'L',
+120271=>'L',
+120272=>'L',
+120273=>'L',
+120274=>'L',
+120275=>'L',
+120276=>'L',
+120277=>'L',
+120278=>'L',
+120279=>'L',
+120280=>'L',
+120281=>'L',
+120282=>'L',
+120283=>'L',
+120284=>'L',
+120285=>'L',
+120286=>'L',
+120287=>'L',
+120288=>'L',
+120289=>'L',
+120290=>'L',
+120291=>'L',
+120292=>'L',
+120293=>'L',
+120294=>'L',
+120295=>'L',
+120296=>'L',
+120297=>'L',
+120298=>'L',
+120299=>'L',
+120300=>'L',
+120301=>'L',
+120302=>'L',
+120303=>'L',
+120304=>'L',
+120305=>'L',
+120306=>'L',
+120307=>'L',
+120308=>'L',
+120309=>'L',
+120310=>'L',
+120311=>'L',
+120312=>'L',
+120313=>'L',
+120314=>'L',
+120315=>'L',
+120316=>'L',
+120317=>'L',
+120318=>'L',
+120319=>'L',
+120320=>'L',
+120321=>'L',
+120322=>'L',
+120323=>'L',
+120324=>'L',
+120325=>'L',
+120326=>'L',
+120327=>'L',
+120328=>'L',
+120329=>'L',
+120330=>'L',
+120331=>'L',
+120332=>'L',
+120333=>'L',
+120334=>'L',
+120335=>'L',
+120336=>'L',
+120337=>'L',
+120338=>'L',
+120339=>'L',
+120340=>'L',
+120341=>'L',
+120342=>'L',
+120343=>'L',
+120344=>'L',
+120345=>'L',
+120346=>'L',
+120347=>'L',
+120348=>'L',
+120349=>'L',
+120350=>'L',
+120351=>'L',
+120352=>'L',
+120353=>'L',
+120354=>'L',
+120355=>'L',
+120356=>'L',
+120357=>'L',
+120358=>'L',
+120359=>'L',
+120360=>'L',
+120361=>'L',
+120362=>'L',
+120363=>'L',
+120364=>'L',
+120365=>'L',
+120366=>'L',
+120367=>'L',
+120368=>'L',
+120369=>'L',
+120370=>'L',
+120371=>'L',
+120372=>'L',
+120373=>'L',
+120374=>'L',
+120375=>'L',
+120376=>'L',
+120377=>'L',
+120378=>'L',
+120379=>'L',
+120380=>'L',
+120381=>'L',
+120382=>'L',
+120383=>'L',
+120384=>'L',
+120385=>'L',
+120386=>'L',
+120387=>'L',
+120388=>'L',
+120389=>'L',
+120390=>'L',
+120391=>'L',
+120392=>'L',
+120393=>'L',
+120394=>'L',
+120395=>'L',
+120396=>'L',
+120397=>'L',
+120398=>'L',
+120399=>'L',
+120400=>'L',
+120401=>'L',
+120402=>'L',
+120403=>'L',
+120404=>'L',
+120405=>'L',
+120406=>'L',
+120407=>'L',
+120408=>'L',
+120409=>'L',
+120410=>'L',
+120411=>'L',
+120412=>'L',
+120413=>'L',
+120414=>'L',
+120415=>'L',
+120416=>'L',
+120417=>'L',
+120418=>'L',
+120419=>'L',
+120420=>'L',
+120421=>'L',
+120422=>'L',
+120423=>'L',
+120424=>'L',
+120425=>'L',
+120426=>'L',
+120427=>'L',
+120428=>'L',
+120429=>'L',
+120430=>'L',
+120431=>'L',
+120432=>'L',
+120433=>'L',
+120434=>'L',
+120435=>'L',
+120436=>'L',
+120437=>'L',
+120438=>'L',
+120439=>'L',
+120440=>'L',
+120441=>'L',
+120442=>'L',
+120443=>'L',
+120444=>'L',
+120445=>'L',
+120446=>'L',
+120447=>'L',
+120448=>'L',
+120449=>'L',
+120450=>'L',
+120451=>'L',
+120452=>'L',
+120453=>'L',
+120454=>'L',
+120455=>'L',
+120456=>'L',
+120457=>'L',
+120458=>'L',
+120459=>'L',
+120460=>'L',
+120461=>'L',
+120462=>'L',
+120463=>'L',
+120464=>'L',
+120465=>'L',
+120466=>'L',
+120467=>'L',
+120468=>'L',
+120469=>'L',
+120470=>'L',
+120471=>'L',
+120472=>'L',
+120473=>'L',
+120474=>'L',
+120475=>'L',
+120476=>'L',
+120477=>'L',
+120478=>'L',
+120479=>'L',
+120480=>'L',
+120481=>'L',
+120482=>'L',
+120483=>'L',
+120484=>'L',
+120485=>'L',
+120488=>'L',
+120489=>'L',
+120490=>'L',
+120491=>'L',
+120492=>'L',
+120493=>'L',
+120494=>'L',
+120495=>'L',
+120496=>'L',
+120497=>'L',
+120498=>'L',
+120499=>'L',
+120500=>'L',
+120501=>'L',
+120502=>'L',
+120503=>'L',
+120504=>'L',
+120505=>'L',
+120506=>'L',
+120507=>'L',
+120508=>'L',
+120509=>'L',
+120510=>'L',
+120511=>'L',
+120512=>'L',
+120513=>'L',
+120514=>'L',
+120515=>'L',
+120516=>'L',
+120517=>'L',
+120518=>'L',
+120519=>'L',
+120520=>'L',
+120521=>'L',
+120522=>'L',
+120523=>'L',
+120524=>'L',
+120525=>'L',
+120526=>'L',
+120527=>'L',
+120528=>'L',
+120529=>'L',
+120530=>'L',
+120531=>'L',
+120532=>'L',
+120533=>'L',
+120534=>'L',
+120535=>'L',
+120536=>'L',
+120537=>'L',
+120538=>'L',
+120539=>'L',
+120540=>'L',
+120541=>'L',
+120542=>'L',
+120543=>'L',
+120544=>'L',
+120545=>'L',
+120546=>'L',
+120547=>'L',
+120548=>'L',
+120549=>'L',
+120550=>'L',
+120551=>'L',
+120552=>'L',
+120553=>'L',
+120554=>'L',
+120555=>'L',
+120556=>'L',
+120557=>'L',
+120558=>'L',
+120559=>'L',
+120560=>'L',
+120561=>'L',
+120562=>'L',
+120563=>'L',
+120564=>'L',
+120565=>'L',
+120566=>'L',
+120567=>'L',
+120568=>'L',
+120569=>'L',
+120570=>'L',
+120571=>'L',
+120572=>'L',
+120573=>'L',
+120574=>'L',
+120575=>'L',
+120576=>'L',
+120577=>'L',
+120578=>'L',
+120579=>'L',
+120580=>'L',
+120581=>'L',
+120582=>'L',
+120583=>'L',
+120584=>'L',
+120585=>'L',
+120586=>'L',
+120587=>'L',
+120588=>'L',
+120589=>'L',
+120590=>'L',
+120591=>'L',
+120592=>'L',
+120593=>'L',
+120594=>'L',
+120595=>'L',
+120596=>'L',
+120597=>'L',
+120598=>'L',
+120599=>'L',
+120600=>'L',
+120601=>'L',
+120602=>'L',
+120603=>'L',
+120604=>'L',
+120605=>'L',
+120606=>'L',
+120607=>'L',
+120608=>'L',
+120609=>'L',
+120610=>'L',
+120611=>'L',
+120612=>'L',
+120613=>'L',
+120614=>'L',
+120615=>'L',
+120616=>'L',
+120617=>'L',
+120618=>'L',
+120619=>'L',
+120620=>'L',
+120621=>'L',
+120622=>'L',
+120623=>'L',
+120624=>'L',
+120625=>'L',
+120626=>'L',
+120627=>'L',
+120628=>'L',
+120629=>'L',
+120630=>'L',
+120631=>'L',
+120632=>'L',
+120633=>'L',
+120634=>'L',
+120635=>'L',
+120636=>'L',
+120637=>'L',
+120638=>'L',
+120639=>'L',
+120640=>'L',
+120641=>'L',
+120642=>'L',
+120643=>'L',
+120644=>'L',
+120645=>'L',
+120646=>'L',
+120647=>'L',
+120648=>'L',
+120649=>'L',
+120650=>'L',
+120651=>'L',
+120652=>'L',
+120653=>'L',
+120654=>'L',
+120655=>'L',
+120656=>'L',
+120657=>'L',
+120658=>'L',
+120659=>'L',
+120660=>'L',
+120661=>'L',
+120662=>'L',
+120663=>'L',
+120664=>'L',
+120665=>'L',
+120666=>'L',
+120667=>'L',
+120668=>'L',
+120669=>'L',
+120670=>'L',
+120671=>'L',
+120672=>'L',
+120673=>'L',
+120674=>'L',
+120675=>'L',
+120676=>'L',
+120677=>'L',
+120678=>'L',
+120679=>'L',
+120680=>'L',
+120681=>'L',
+120682=>'L',
+120683=>'L',
+120684=>'L',
+120685=>'L',
+120686=>'L',
+120687=>'L',
+120688=>'L',
+120689=>'L',
+120690=>'L',
+120691=>'L',
+120692=>'L',
+120693=>'L',
+120694=>'L',
+120695=>'L',
+120696=>'L',
+120697=>'L',
+120698=>'L',
+120699=>'L',
+120700=>'L',
+120701=>'L',
+120702=>'L',
+120703=>'L',
+120704=>'L',
+120705=>'L',
+120706=>'L',
+120707=>'L',
+120708=>'L',
+120709=>'L',
+120710=>'L',
+120711=>'L',
+120712=>'L',
+120713=>'L',
+120714=>'L',
+120715=>'L',
+120716=>'L',
+120717=>'L',
+120718=>'L',
+120719=>'L',
+120720=>'L',
+120721=>'L',
+120722=>'L',
+120723=>'L',
+120724=>'L',
+120725=>'L',
+120726=>'L',
+120727=>'L',
+120728=>'L',
+120729=>'L',
+120730=>'L',
+120731=>'L',
+120732=>'L',
+120733=>'L',
+120734=>'L',
+120735=>'L',
+120736=>'L',
+120737=>'L',
+120738=>'L',
+120739=>'L',
+120740=>'L',
+120741=>'L',
+120742=>'L',
+120743=>'L',
+120744=>'L',
+120745=>'L',
+120746=>'L',
+120747=>'L',
+120748=>'L',
+120749=>'L',
+120750=>'L',
+120751=>'L',
+120752=>'L',
+120753=>'L',
+120754=>'L',
+120755=>'L',
+120756=>'L',
+120757=>'L',
+120758=>'L',
+120759=>'L',
+120760=>'L',
+120761=>'L',
+120762=>'L',
+120763=>'L',
+120764=>'L',
+120765=>'L',
+120766=>'L',
+120767=>'L',
+120768=>'L',
+120769=>'L',
+120770=>'L',
+120771=>'L',
+120772=>'L',
+120773=>'L',
+120774=>'L',
+120775=>'L',
+120776=>'L',
+120777=>'L',
+120778=>'L',
+120779=>'L',
+120782=>'EN',
+120783=>'EN',
+120784=>'EN',
+120785=>'EN',
+120786=>'EN',
+120787=>'EN',
+120788=>'EN',
+120789=>'EN',
+120790=>'EN',
+120791=>'EN',
+120792=>'EN',
+120793=>'EN',
+120794=>'EN',
+120795=>'EN',
+120796=>'EN',
+120797=>'EN',
+120798=>'EN',
+120799=>'EN',
+120800=>'EN',
+120801=>'EN',
+120802=>'EN',
+120803=>'EN',
+120804=>'EN',
+120805=>'EN',
+120806=>'EN',
+120807=>'EN',
+120808=>'EN',
+120809=>'EN',
+120810=>'EN',
+120811=>'EN',
+120812=>'EN',
+120813=>'EN',
+120814=>'EN',
+120815=>'EN',
+120816=>'EN',
+120817=>'EN',
+120818=>'EN',
+120819=>'EN',
+120820=>'EN',
+120821=>'EN',
+120822=>'EN',
+120823=>'EN',
+120824=>'EN',
+120825=>'EN',
+120826=>'EN',
+120827=>'EN',
+120828=>'EN',
+120829=>'EN',
+120830=>'EN',
+120831=>'EN',
+131072=>'L',
+173782=>'L',
+194560=>'L',
+194561=>'L',
+194562=>'L',
+194563=>'L',
+194564=>'L',
+194565=>'L',
+194566=>'L',
+194567=>'L',
+194568=>'L',
+194569=>'L',
+194570=>'L',
+194571=>'L',
+194572=>'L',
+194573=>'L',
+194574=>'L',
+194575=>'L',
+194576=>'L',
+194577=>'L',
+194578=>'L',
+194579=>'L',
+194580=>'L',
+194581=>'L',
+194582=>'L',
+194583=>'L',
+194584=>'L',
+194585=>'L',
+194586=>'L',
+194587=>'L',
+194588=>'L',
+194589=>'L',
+194590=>'L',
+194591=>'L',
+194592=>'L',
+194593=>'L',
+194594=>'L',
+194595=>'L',
+194596=>'L',
+194597=>'L',
+194598=>'L',
+194599=>'L',
+194600=>'L',
+194601=>'L',
+194602=>'L',
+194603=>'L',
+194604=>'L',
+194605=>'L',
+194606=>'L',
+194607=>'L',
+194608=>'L',
+194609=>'L',
+194610=>'L',
+194611=>'L',
+194612=>'L',
+194613=>'L',
+194614=>'L',
+194615=>'L',
+194616=>'L',
+194617=>'L',
+194618=>'L',
+194619=>'L',
+194620=>'L',
+194621=>'L',
+194622=>'L',
+194623=>'L',
+194624=>'L',
+194625=>'L',
+194626=>'L',
+194627=>'L',
+194628=>'L',
+194629=>'L',
+194630=>'L',
+194631=>'L',
+194632=>'L',
+194633=>'L',
+194634=>'L',
+194635=>'L',
+194636=>'L',
+194637=>'L',
+194638=>'L',
+194639=>'L',
+194640=>'L',
+194641=>'L',
+194642=>'L',
+194643=>'L',
+194644=>'L',
+194645=>'L',
+194646=>'L',
+194647=>'L',
+194648=>'L',
+194649=>'L',
+194650=>'L',
+194651=>'L',
+194652=>'L',
+194653=>'L',
+194654=>'L',
+194655=>'L',
+194656=>'L',
+194657=>'L',
+194658=>'L',
+194659=>'L',
+194660=>'L',
+194661=>'L',
+194662=>'L',
+194663=>'L',
+194664=>'L',
+194665=>'L',
+194666=>'L',
+194667=>'L',
+194668=>'L',
+194669=>'L',
+194670=>'L',
+194671=>'L',
+194672=>'L',
+194673=>'L',
+194674=>'L',
+194675=>'L',
+194676=>'L',
+194677=>'L',
+194678=>'L',
+194679=>'L',
+194680=>'L',
+194681=>'L',
+194682=>'L',
+194683=>'L',
+194684=>'L',
+194685=>'L',
+194686=>'L',
+194687=>'L',
+194688=>'L',
+194689=>'L',
+194690=>'L',
+194691=>'L',
+194692=>'L',
+194693=>'L',
+194694=>'L',
+194695=>'L',
+194696=>'L',
+194697=>'L',
+194698=>'L',
+194699=>'L',
+194700=>'L',
+194701=>'L',
+194702=>'L',
+194703=>'L',
+194704=>'L',
+194705=>'L',
+194706=>'L',
+194707=>'L',
+194708=>'L',
+194709=>'L',
+194710=>'L',
+194711=>'L',
+194712=>'L',
+194713=>'L',
+194714=>'L',
+194715=>'L',
+194716=>'L',
+194717=>'L',
+194718=>'L',
+194719=>'L',
+194720=>'L',
+194721=>'L',
+194722=>'L',
+194723=>'L',
+194724=>'L',
+194725=>'L',
+194726=>'L',
+194727=>'L',
+194728=>'L',
+194729=>'L',
+194730=>'L',
+194731=>'L',
+194732=>'L',
+194733=>'L',
+194734=>'L',
+194735=>'L',
+194736=>'L',
+194737=>'L',
+194738=>'L',
+194739=>'L',
+194740=>'L',
+194741=>'L',
+194742=>'L',
+194743=>'L',
+194744=>'L',
+194745=>'L',
+194746=>'L',
+194747=>'L',
+194748=>'L',
+194749=>'L',
+194750=>'L',
+194751=>'L',
+194752=>'L',
+194753=>'L',
+194754=>'L',
+194755=>'L',
+194756=>'L',
+194757=>'L',
+194758=>'L',
+194759=>'L',
+194760=>'L',
+194761=>'L',
+194762=>'L',
+194763=>'L',
+194764=>'L',
+194765=>'L',
+194766=>'L',
+194767=>'L',
+194768=>'L',
+194769=>'L',
+194770=>'L',
+194771=>'L',
+194772=>'L',
+194773=>'L',
+194774=>'L',
+194775=>'L',
+194776=>'L',
+194777=>'L',
+194778=>'L',
+194779=>'L',
+194780=>'L',
+194781=>'L',
+194782=>'L',
+194783=>'L',
+194784=>'L',
+194785=>'L',
+194786=>'L',
+194787=>'L',
+194788=>'L',
+194789=>'L',
+194790=>'L',
+194791=>'L',
+194792=>'L',
+194793=>'L',
+194794=>'L',
+194795=>'L',
+194796=>'L',
+194797=>'L',
+194798=>'L',
+194799=>'L',
+194800=>'L',
+194801=>'L',
+194802=>'L',
+194803=>'L',
+194804=>'L',
+194805=>'L',
+194806=>'L',
+194807=>'L',
+194808=>'L',
+194809=>'L',
+194810=>'L',
+194811=>'L',
+194812=>'L',
+194813=>'L',
+194814=>'L',
+194815=>'L',
+194816=>'L',
+194817=>'L',
+194818=>'L',
+194819=>'L',
+194820=>'L',
+194821=>'L',
+194822=>'L',
+194823=>'L',
+194824=>'L',
+194825=>'L',
+194826=>'L',
+194827=>'L',
+194828=>'L',
+194829=>'L',
+194830=>'L',
+194831=>'L',
+194832=>'L',
+194833=>'L',
+194834=>'L',
+194835=>'L',
+194836=>'L',
+194837=>'L',
+194838=>'L',
+194839=>'L',
+194840=>'L',
+194841=>'L',
+194842=>'L',
+194843=>'L',
+194844=>'L',
+194845=>'L',
+194846=>'L',
+194847=>'L',
+194848=>'L',
+194849=>'L',
+194850=>'L',
+194851=>'L',
+194852=>'L',
+194853=>'L',
+194854=>'L',
+194855=>'L',
+194856=>'L',
+194857=>'L',
+194858=>'L',
+194859=>'L',
+194860=>'L',
+194861=>'L',
+194862=>'L',
+194863=>'L',
+194864=>'L',
+194865=>'L',
+194866=>'L',
+194867=>'L',
+194868=>'L',
+194869=>'L',
+194870=>'L',
+194871=>'L',
+194872=>'L',
+194873=>'L',
+194874=>'L',
+194875=>'L',
+194876=>'L',
+194877=>'L',
+194878=>'L',
+194879=>'L',
+194880=>'L',
+194881=>'L',
+194882=>'L',
+194883=>'L',
+194884=>'L',
+194885=>'L',
+194886=>'L',
+194887=>'L',
+194888=>'L',
+194889=>'L',
+194890=>'L',
+194891=>'L',
+194892=>'L',
+194893=>'L',
+194894=>'L',
+194895=>'L',
+194896=>'L',
+194897=>'L',
+194898=>'L',
+194899=>'L',
+194900=>'L',
+194901=>'L',
+194902=>'L',
+194903=>'L',
+194904=>'L',
+194905=>'L',
+194906=>'L',
+194907=>'L',
+194908=>'L',
+194909=>'L',
+194910=>'L',
+194911=>'L',
+194912=>'L',
+194913=>'L',
+194914=>'L',
+194915=>'L',
+194916=>'L',
+194917=>'L',
+194918=>'L',
+194919=>'L',
+194920=>'L',
+194921=>'L',
+194922=>'L',
+194923=>'L',
+194924=>'L',
+194925=>'L',
+194926=>'L',
+194927=>'L',
+194928=>'L',
+194929=>'L',
+194930=>'L',
+194931=>'L',
+194932=>'L',
+194933=>'L',
+194934=>'L',
+194935=>'L',
+194936=>'L',
+194937=>'L',
+194938=>'L',
+194939=>'L',
+194940=>'L',
+194941=>'L',
+194942=>'L',
+194943=>'L',
+194944=>'L',
+194945=>'L',
+194946=>'L',
+194947=>'L',
+194948=>'L',
+194949=>'L',
+194950=>'L',
+194951=>'L',
+194952=>'L',
+194953=>'L',
+194954=>'L',
+194955=>'L',
+194956=>'L',
+194957=>'L',
+194958=>'L',
+194959=>'L',
+194960=>'L',
+194961=>'L',
+194962=>'L',
+194963=>'L',
+194964=>'L',
+194965=>'L',
+194966=>'L',
+194967=>'L',
+194968=>'L',
+194969=>'L',
+194970=>'L',
+194971=>'L',
+194972=>'L',
+194973=>'L',
+194974=>'L',
+194975=>'L',
+194976=>'L',
+194977=>'L',
+194978=>'L',
+194979=>'L',
+194980=>'L',
+194981=>'L',
+194982=>'L',
+194983=>'L',
+194984=>'L',
+194985=>'L',
+194986=>'L',
+194987=>'L',
+194988=>'L',
+194989=>'L',
+194990=>'L',
+194991=>'L',
+194992=>'L',
+194993=>'L',
+194994=>'L',
+194995=>'L',
+194996=>'L',
+194997=>'L',
+194998=>'L',
+194999=>'L',
+195000=>'L',
+195001=>'L',
+195002=>'L',
+195003=>'L',
+195004=>'L',
+195005=>'L',
+195006=>'L',
+195007=>'L',
+195008=>'L',
+195009=>'L',
+195010=>'L',
+195011=>'L',
+195012=>'L',
+195013=>'L',
+195014=>'L',
+195015=>'L',
+195016=>'L',
+195017=>'L',
+195018=>'L',
+195019=>'L',
+195020=>'L',
+195021=>'L',
+195022=>'L',
+195023=>'L',
+195024=>'L',
+195025=>'L',
+195026=>'L',
+195027=>'L',
+195028=>'L',
+195029=>'L',
+195030=>'L',
+195031=>'L',
+195032=>'L',
+195033=>'L',
+195034=>'L',
+195035=>'L',
+195036=>'L',
+195037=>'L',
+195038=>'L',
+195039=>'L',
+195040=>'L',
+195041=>'L',
+195042=>'L',
+195043=>'L',
+195044=>'L',
+195045=>'L',
+195046=>'L',
+195047=>'L',
+195048=>'L',
+195049=>'L',
+195050=>'L',
+195051=>'L',
+195052=>'L',
+195053=>'L',
+195054=>'L',
+195055=>'L',
+195056=>'L',
+195057=>'L',
+195058=>'L',
+195059=>'L',
+195060=>'L',
+195061=>'L',
+195062=>'L',
+195063=>'L',
+195064=>'L',
+195065=>'L',
+195066=>'L',
+195067=>'L',
+195068=>'L',
+195069=>'L',
+195070=>'L',
+195071=>'L',
+195072=>'L',
+195073=>'L',
+195074=>'L',
+195075=>'L',
+195076=>'L',
+195077=>'L',
+195078=>'L',
+195079=>'L',
+195080=>'L',
+195081=>'L',
+195082=>'L',
+195083=>'L',
+195084=>'L',
+195085=>'L',
+195086=>'L',
+195087=>'L',
+195088=>'L',
+195089=>'L',
+195090=>'L',
+195091=>'L',
+195092=>'L',
+195093=>'L',
+195094=>'L',
+195095=>'L',
+195096=>'L',
+195097=>'L',
+195098=>'L',
+195099=>'L',
+195100=>'L',
+195101=>'L',
+917505=>'BN',
+917536=>'BN',
+917537=>'BN',
+917538=>'BN',
+917539=>'BN',
+917540=>'BN',
+917541=>'BN',
+917542=>'BN',
+917543=>'BN',
+917544=>'BN',
+917545=>'BN',
+917546=>'BN',
+917547=>'BN',
+917548=>'BN',
+917549=>'BN',
+917550=>'BN',
+917551=>'BN',
+917552=>'BN',
+917553=>'BN',
+917554=>'BN',
+917555=>'BN',
+917556=>'BN',
+917557=>'BN',
+917558=>'BN',
+917559=>'BN',
+917560=>'BN',
+917561=>'BN',
+917562=>'BN',
+917563=>'BN',
+917564=>'BN',
+917565=>'BN',
+917566=>'BN',
+917567=>'BN',
+917568=>'BN',
+917569=>'BN',
+917570=>'BN',
+917571=>'BN',
+917572=>'BN',
+917573=>'BN',
+917574=>'BN',
+917575=>'BN',
+917576=>'BN',
+917577=>'BN',
+917578=>'BN',
+917579=>'BN',
+917580=>'BN',
+917581=>'BN',
+917582=>'BN',
+917583=>'BN',
+917584=>'BN',
+917585=>'BN',
+917586=>'BN',
+917587=>'BN',
+917588=>'BN',
+917589=>'BN',
+917590=>'BN',
+917591=>'BN',
+917592=>'BN',
+917593=>'BN',
+917594=>'BN',
+917595=>'BN',
+917596=>'BN',
+917597=>'BN',
+917598=>'BN',
+917599=>'BN',
+917600=>'BN',
+917601=>'BN',
+917602=>'BN',
+917603=>'BN',
+917604=>'BN',
+917605=>'BN',
+917606=>'BN',
+917607=>'BN',
+917608=>'BN',
+917609=>'BN',
+917610=>'BN',
+917611=>'BN',
+917612=>'BN',
+917613=>'BN',
+917614=>'BN',
+917615=>'BN',
+917616=>'BN',
+917617=>'BN',
+917618=>'BN',
+917619=>'BN',
+917620=>'BN',
+917621=>'BN',
+917622=>'BN',
+917623=>'BN',
+917624=>'BN',
+917625=>'BN',
+917626=>'BN',
+917627=>'BN',
+917628=>'BN',
+917629=>'BN',
+917630=>'BN',
+917631=>'BN',
+917760=>'NSM',
+917761=>'NSM',
+917762=>'NSM',
+917763=>'NSM',
+917764=>'NSM',
+917765=>'NSM',
+917766=>'NSM',
+917767=>'NSM',
+917768=>'NSM',
+917769=>'NSM',
+917770=>'NSM',
+917771=>'NSM',
+917772=>'NSM',
+917773=>'NSM',
+917774=>'NSM',
+917775=>'NSM',
+917776=>'NSM',
+917777=>'NSM',
+917778=>'NSM',
+917779=>'NSM',
+917780=>'NSM',
+917781=>'NSM',
+917782=>'NSM',
+917783=>'NSM',
+917784=>'NSM',
+917785=>'NSM',
+917786=>'NSM',
+917787=>'NSM',
+917788=>'NSM',
+917789=>'NSM',
+917790=>'NSM',
+917791=>'NSM',
+917792=>'NSM',
+917793=>'NSM',
+917794=>'NSM',
+917795=>'NSM',
+917796=>'NSM',
+917797=>'NSM',
+917798=>'NSM',
+917799=>'NSM',
+917800=>'NSM',
+917801=>'NSM',
+917802=>'NSM',
+917803=>'NSM',
+917804=>'NSM',
+917805=>'NSM',
+917806=>'NSM',
+917807=>'NSM',
+917808=>'NSM',
+917809=>'NSM',
+917810=>'NSM',
+917811=>'NSM',
+917812=>'NSM',
+917813=>'NSM',
+917814=>'NSM',
+917815=>'NSM',
+917816=>'NSM',
+917817=>'NSM',
+917818=>'NSM',
+917819=>'NSM',
+917820=>'NSM',
+917821=>'NSM',
+917822=>'NSM',
+917823=>'NSM',
+917824=>'NSM',
+917825=>'NSM',
+917826=>'NSM',
+917827=>'NSM',
+917828=>'NSM',
+917829=>'NSM',
+917830=>'NSM',
+917831=>'NSM',
+917832=>'NSM',
+917833=>'NSM',
+917834=>'NSM',
+917835=>'NSM',
+917836=>'NSM',
+917837=>'NSM',
+917838=>'NSM',
+917839=>'NSM',
+917840=>'NSM',
+917841=>'NSM',
+917842=>'NSM',
+917843=>'NSM',
+917844=>'NSM',
+917845=>'NSM',
+917846=>'NSM',
+917847=>'NSM',
+917848=>'NSM',
+917849=>'NSM',
+917850=>'NSM',
+917851=>'NSM',
+917852=>'NSM',
+917853=>'NSM',
+917854=>'NSM',
+917855=>'NSM',
+917856=>'NSM',
+917857=>'NSM',
+917858=>'NSM',
+917859=>'NSM',
+917860=>'NSM',
+917861=>'NSM',
+917862=>'NSM',
+917863=>'NSM',
+917864=>'NSM',
+917865=>'NSM',
+917866=>'NSM',
+917867=>'NSM',
+917868=>'NSM',
+917869=>'NSM',
+917870=>'NSM',
+917871=>'NSM',
+917872=>'NSM',
+917873=>'NSM',
+917874=>'NSM',
+917875=>'NSM',
+917876=>'NSM',
+917877=>'NSM',
+917878=>'NSM',
+917879=>'NSM',
+917880=>'NSM',
+917881=>'NSM',
+917882=>'NSM',
+917883=>'NSM',
+917884=>'NSM',
+917885=>'NSM',
+917886=>'NSM',
+917887=>'NSM',
+917888=>'NSM',
+917889=>'NSM',
+917890=>'NSM',
+917891=>'NSM',
+917892=>'NSM',
+917893=>'NSM',
+917894=>'NSM',
+917895=>'NSM',
+917896=>'NSM',
+917897=>'NSM',
+917898=>'NSM',
+917899=>'NSM',
+917900=>'NSM',
+917901=>'NSM',
+917902=>'NSM',
+917903=>'NSM',
+917904=>'NSM',
+917905=>'NSM',
+917906=>'NSM',
+917907=>'NSM',
+917908=>'NSM',
+917909=>'NSM',
+917910=>'NSM',
+917911=>'NSM',
+917912=>'NSM',
+917913=>'NSM',
+917914=>'NSM',
+917915=>'NSM',
+917916=>'NSM',
+917917=>'NSM',
+917918=>'NSM',
+917919=>'NSM',
+917920=>'NSM',
+917921=>'NSM',
+917922=>'NSM',
+917923=>'NSM',
+917924=>'NSM',
+917925=>'NSM',
+917926=>'NSM',
+917927=>'NSM',
+917928=>'NSM',
+917929=>'NSM',
+917930=>'NSM',
+917931=>'NSM',
+917932=>'NSM',
+917933=>'NSM',
+917934=>'NSM',
+917935=>'NSM',
+917936=>'NSM',
+917937=>'NSM',
+917938=>'NSM',
+917939=>'NSM',
+917940=>'NSM',
+917941=>'NSM',
+917942=>'NSM',
+917943=>'NSM',
+917944=>'NSM',
+917945=>'NSM',
+917946=>'NSM',
+917947=>'NSM',
+917948=>'NSM',
+917949=>'NSM',
+917950=>'NSM',
+917951=>'NSM',
+917952=>'NSM',
+917953=>'NSM',
+917954=>'NSM',
+917955=>'NSM',
+917956=>'NSM',
+917957=>'NSM',
+917958=>'NSM',
+917959=>'NSM',
+917960=>'NSM',
+917961=>'NSM',
+917962=>'NSM',
+917963=>'NSM',
+917964=>'NSM',
+917965=>'NSM',
+917966=>'NSM',
+917967=>'NSM',
+917968=>'NSM',
+917969=>'NSM',
+917970=>'NSM',
+917971=>'NSM',
+917972=>'NSM',
+917973=>'NSM',
+917974=>'NSM',
+917975=>'NSM',
+917976=>'NSM',
+917977=>'NSM',
+917978=>'NSM',
+917979=>'NSM',
+917980=>'NSM',
+917981=>'NSM',
+917982=>'NSM',
+917983=>'NSM',
+917984=>'NSM',
+917985=>'NSM',
+917986=>'NSM',
+917987=>'NSM',
+917988=>'NSM',
+917989=>'NSM',
+917990=>'NSM',
+917991=>'NSM',
+917992=>'NSM',
+917993=>'NSM',
+917994=>'NSM',
+917995=>'NSM',
+917996=>'NSM',
+917997=>'NSM',
+917998=>'NSM',
+917999=>'NSM',
+983040=>'L',
+1048573=>'L',
+1048576=>'L',
+1114109=>'L'
+);
+
+/**
+ * Mirror unicode characters. For information on bidi mirroring, see UAX #9: Bidirectional Algorithm, at http://www.unicode.org/unicode/reports/tr9/
+ * @public
+ */
+public static $uni_mirror = array (
+0x0028=>0x0029,
+0x0029=>0x0028,
+0x003C=>0x003E,
+0x003E=>0x003C,
+0x005B=>0x005D,
+0x005D=>0x005B,
+0x007B=>0x007D,
+0x007D=>0x007B,
+0x00AB=>0x00BB,
+0x00BB=>0x00AB,
+0x0F3A=>0x0F3B,
+0x0F3B=>0x0F3A,
+0x0F3C=>0x0F3D,
+0x0F3D=>0x0F3C,
+0x169B=>0x169C,
+0x169C=>0x169B,
+0x2018=>0x2019,
+0x2019=>0x2018,
+0x201C=>0x201D,
+0x201D=>0x201C,
+0x2039=>0x203A,
+0x203A=>0x2039,
+0x2045=>0x2046,
+0x2046=>0x2045,
+0x207D=>0x207E,
+0x207E=>0x207D,
+0x208D=>0x208E,
+0x208E=>0x208D,
+0x2208=>0x220B,
+0x2209=>0x220C,
+0x220A=>0x220D,
+0x220B=>0x2208,
+0x220C=>0x2209,
+0x220D=>0x220A,
+0x2215=>0x29F5,
+0x223C=>0x223D,
+0x223D=>0x223C,
+0x2243=>0x22CD,
+0x2252=>0x2253,
+0x2253=>0x2252,
+0x2254=>0x2255,
+0x2255=>0x2254,
+0x2264=>0x2265,
+0x2265=>0x2264,
+0x2266=>0x2267,
+0x2267=>0x2266,
+0x2268=>0x2269,
+0x2269=>0x2268,
+0x226A=>0x226B,
+0x226B=>0x226A,
+0x226E=>0x226F,
+0x226F=>0x226E,
+0x2270=>0x2271,
+0x2271=>0x2270,
+0x2272=>0x2273,
+0x2273=>0x2272,
+0x2274=>0x2275,
+0x2275=>0x2274,
+0x2276=>0x2277,
+0x2277=>0x2276,
+0x2278=>0x2279,
+0x2279=>0x2278,
+0x227A=>0x227B,
+0x227B=>0x227A,
+0x227C=>0x227D,
+0x227D=>0x227C,
+0x227E=>0x227F,
+0x227F=>0x227E,
+0x2280=>0x2281,
+0x2281=>0x2280,
+0x2282=>0x2283,
+0x2283=>0x2282,
+0x2284=>0x2285,
+0x2285=>0x2284,
+0x2286=>0x2287,
+0x2287=>0x2286,
+0x2288=>0x2289,
+0x2289=>0x2288,
+0x228A=>0x228B,
+0x228B=>0x228A,
+0x228F=>0x2290,
+0x2290=>0x228F,
+0x2291=>0x2292,
+0x2292=>0x2291,
+0x2298=>0x29B8,
+0x22A2=>0x22A3,
+0x22A3=>0x22A2,
+0x22A6=>0x2ADE,
+0x22A8=>0x2AE4,
+0x22A9=>0x2AE3,
+0x22AB=>0x2AE5,
+0x22B0=>0x22B1,
+0x22B1=>0x22B0,
+0x22B2=>0x22B3,
+0x22B3=>0x22B2,
+0x22B4=>0x22B5,
+0x22B5=>0x22B4,
+0x22B6=>0x22B7,
+0x22B7=>0x22B6,
+0x22C9=>0x22CA,
+0x22CA=>0x22C9,
+0x22CB=>0x22CC,
+0x22CC=>0x22CB,
+0x22CD=>0x2243,
+0x22D0=>0x22D1,
+0x22D1=>0x22D0,
+0x22D6=>0x22D7,
+0x22D7=>0x22D6,
+0x22D8=>0x22D9,
+0x22D9=>0x22D8,
+0x22DA=>0x22DB,
+0x22DB=>0x22DA,
+0x22DC=>0x22DD,
+0x22DD=>0x22DC,
+0x22DE=>0x22DF,
+0x22DF=>0x22DE,
+0x22E0=>0x22E1,
+0x22E1=>0x22E0,
+0x22E2=>0x22E3,
+0x22E3=>0x22E2,
+0x22E4=>0x22E5,
+0x22E5=>0x22E4,
+0x22E6=>0x22E7,
+0x22E7=>0x22E6,
+0x22E8=>0x22E9,
+0x22E9=>0x22E8,
+0x22EA=>0x22EB,
+0x22EB=>0x22EA,
+0x22EC=>0x22ED,
+0x22ED=>0x22EC,
+0x22F0=>0x22F1,
+0x22F1=>0x22F0,
+0x22F2=>0x22FA,
+0x22F3=>0x22FB,
+0x22F4=>0x22FC,
+0x22F6=>0x22FD,
+0x22F7=>0x22FE,
+0x22FA=>0x22F2,
+0x22FB=>0x22F3,
+0x22FC=>0x22F4,
+0x22FD=>0x22F6,
+0x22FE=>0x22F7,
+0x2308=>0x2309,
+0x2309=>0x2308,
+0x230A=>0x230B,
+0x230B=>0x230A,
+0x2329=>0x232A,
+0x232A=>0x2329,
+0x2768=>0x2769,
+0x2769=>0x2768,
+0x276A=>0x276B,
+0x276B=>0x276A,
+0x276C=>0x276D,
+0x276D=>0x276C,
+0x276E=>0x276F,
+0x276F=>0x276E,
+0x2770=>0x2771,
+0x2771=>0x2770,
+0x2772=>0x2773,
+0x2773=>0x2772,
+0x2774=>0x2775,
+0x2775=>0x2774,
+0x27C3=>0x27C4,
+0x27C4=>0x27C3,
+0x27C5=>0x27C6,
+0x27C6=>0x27C5,
+0x27D5=>0x27D6,
+0x27D6=>0x27D5,
+0x27DD=>0x27DE,
+0x27DE=>0x27DD,
+0x27E2=>0x27E3,
+0x27E3=>0x27E2,
+0x27E4=>0x27E5,
+0x27E5=>0x27E4,
+0x27E6=>0x27E7,
+0x27E7=>0x27E6,
+0x27E8=>0x27E9,
+0x27E9=>0x27E8,
+0x27EA=>0x27EB,
+0x27EB=>0x27EA,
+0x2983=>0x2984,
+0x2984=>0x2983,
+0x2985=>0x2986,
+0x2986=>0x2985,
+0x2987=>0x2988,
+0x2988=>0x2987,
+0x2989=>0x298A,
+0x298A=>0x2989,
+0x298B=>0x298C,
+0x298C=>0x298B,
+0x298D=>0x2990,
+0x298E=>0x298F,
+0x298F=>0x298E,
+0x2990=>0x298D,
+0x2991=>0x2992,
+0x2992=>0x2991,
+0x2993=>0x2994,
+0x2994=>0x2993,
+0x2995=>0x2996,
+0x2996=>0x2995,
+0x2997=>0x2998,
+0x2998=>0x2997,
+0x29B8=>0x2298,
+0x29C0=>0x29C1,
+0x29C1=>0x29C0,
+0x29C4=>0x29C5,
+0x29C5=>0x29C4,
+0x29CF=>0x29D0,
+0x29D0=>0x29CF,
+0x29D1=>0x29D2,
+0x29D2=>0x29D1,
+0x29D4=>0x29D5,
+0x29D5=>0x29D4,
+0x29D8=>0x29D9,
+0x29D9=>0x29D8,
+0x29DA=>0x29DB,
+0x29DB=>0x29DA,
+0x29F5=>0x2215,
+0x29F8=>0x29F9,
+0x29F9=>0x29F8,
+0x29FC=>0x29FD,
+0x29FD=>0x29FC,
+0x2A2B=>0x2A2C,
+0x2A2C=>0x2A2B,
+0x2A2D=>0x2A2E,
+0x2A2E=>0x2A2D,
+0x2A34=>0x2A35,
+0x2A35=>0x2A34,
+0x2A3C=>0x2A3D,
+0x2A3D=>0x2A3C,
+0x2A64=>0x2A65,
+0x2A65=>0x2A64,
+0x2A79=>0x2A7A,
+0x2A7A=>0x2A79,
+0x2A7D=>0x2A7E,
+0x2A7E=>0x2A7D,
+0x2A7F=>0x2A80,
+0x2A80=>0x2A7F,
+0x2A81=>0x2A82,
+0x2A82=>0x2A81,
+0x2A83=>0x2A84,
+0x2A84=>0x2A83,
+0x2A8B=>0x2A8C,
+0x2A8C=>0x2A8B,
+0x2A91=>0x2A92,
+0x2A92=>0x2A91,
+0x2A93=>0x2A94,
+0x2A94=>0x2A93,
+0x2A95=>0x2A96,
+0x2A96=>0x2A95,
+0x2A97=>0x2A98,
+0x2A98=>0x2A97,
+0x2A99=>0x2A9A,
+0x2A9A=>0x2A99,
+0x2A9B=>0x2A9C,
+0x2A9C=>0x2A9B,
+0x2AA1=>0x2AA2,
+0x2AA2=>0x2AA1,
+0x2AA6=>0x2AA7,
+0x2AA7=>0x2AA6,
+0x2AA8=>0x2AA9,
+0x2AA9=>0x2AA8,
+0x2AAA=>0x2AAB,
+0x2AAB=>0x2AAA,
+0x2AAC=>0x2AAD,
+0x2AAD=>0x2AAC,
+0x2AAF=>0x2AB0,
+0x2AB0=>0x2AAF,
+0x2AB3=>0x2AB4,
+0x2AB4=>0x2AB3,
+0x2ABB=>0x2ABC,
+0x2ABC=>0x2ABB,
+0x2ABD=>0x2ABE,
+0x2ABE=>0x2ABD,
+0x2ABF=>0x2AC0,
+0x2AC0=>0x2ABF,
+0x2AC1=>0x2AC2,
+0x2AC2=>0x2AC1,
+0x2AC3=>0x2AC4,
+0x2AC4=>0x2AC3,
+0x2AC5=>0x2AC6,
+0x2AC6=>0x2AC5,
+0x2ACD=>0x2ACE,
+0x2ACE=>0x2ACD,
+0x2ACF=>0x2AD0,
+0x2AD0=>0x2ACF,
+0x2AD1=>0x2AD2,
+0x2AD2=>0x2AD1,
+0x2AD3=>0x2AD4,
+0x2AD4=>0x2AD3,
+0x2AD5=>0x2AD6,
+0x2AD6=>0x2AD5,
+0x2ADE=>0x22A6,
+0x2AE3=>0x22A9,
+0x2AE4=>0x22A8,
+0x2AE5=>0x22AB,
+0x2AEC=>0x2AED,
+0x2AED=>0x2AEC,
+0x2AF7=>0x2AF8,
+0x2AF8=>0x2AF7,
+0x2AF9=>0x2AFA,
+0x2AFA=>0x2AF9,
+0x2E02=>0x2E03,
+0x2E03=>0x2E02,
+0x2E04=>0x2E05,
+0x2E05=>0x2E04,
+0x2E09=>0x2E0A,
+0x2E0A=>0x2E09,
+0x2E0C=>0x2E0D,
+0x2E0D=>0x2E0C,
+0x2E1C=>0x2E1D,
+0x2E1D=>0x2E1C,
+0x3008=>0x3009,
+0x3009=>0x3008,
+0x300A=>0x300B,
+0x300B=>0x300A,
+0x300C=>0x300D,
+0x300D=>0x300C,
+0x300E=>0x300F,
+0x300F=>0x300E,
+0x3010=>0x3011,
+0x3011=>0x3010,
+0x3014=>0x3015,
+0x3015=>0x3014,
+0x3016=>0x3017,
+0x3017=>0x3016,
+0x3018=>0x3019,
+0x3019=>0x3018,
+0x301A=>0x301B,
+0x301B=>0x301A,
+0x301D=>0x301E,
+0x301E=>0x301D,
+0xFE59=>0xFE5A,
+0xFE5A=>0xFE59,
+0xFE5B=>0xFE5C,
+0xFE5C=>0xFE5B,
+0xFE5D=>0xFE5E,
+0xFE5E=>0xFE5D,
+0xFE64=>0xFE65,
+0xFE65=>0xFE64,
+0xFF08=>0xFF09,
+0xFF09=>0xFF08,
+0xFF1C=>0xFF1E,
+0xFF1E=>0xFF1C,
+0xFF3B=>0xFF3D,
+0xFF3D=>0xFF3B,
+0xFF5B=>0xFF5D,
+0xFF5D=>0xFF5B,
+0xFF5F=>0xFF60,
+0xFF60=>0xFF5F,
+0xFF62=>0xFF63,
+0xFF63=>0xFF62);
+
+/**
+ * Arabic shape substitutions: char code => (isolated, final, initial, medial).
+ * @public
+ */
+public static $uni_arabicsubst = array(
+1569=>array(65152),
+1570=>array(65153, 65154, 65153, 65154),
+1571=>array(65155, 65156, 65155, 65156),
+1572=>array(65157, 65158),
+1573=>array(65159, 65160, 65159, 65160),
+1574=>array(65161, 65162, 65163, 65164),
+1575=>array(65165, 65166, 65165, 65166),
+1576=>array(65167, 65168, 65169, 65170),
+1577=>array(65171, 65172),
+1578=>array(65173, 65174, 65175, 65176),
+1579=>array(65177, 65178, 65179, 65180),
+1580=>array(65181, 65182, 65183, 65184),
+1581=>array(65185, 65186, 65187, 65188),
+1582=>array(65189, 65190, 65191, 65192),
+1583=>array(65193, 65194, 65193, 65194),
+1584=>array(65195, 65196, 65195, 65196),
+1585=>array(65197, 65198, 65197, 65198),
+1586=>array(65199, 65200, 65199, 65200),
+1587=>array(65201, 65202, 65203, 65204),
+1588=>array(65205, 65206, 65207, 65208),
+1589=>array(65209, 65210, 65211, 65212),
+1590=>array(65213, 65214, 65215, 65216),
+1591=>array(65217, 65218, 65219, 65220),
+1592=>array(65221, 65222, 65223, 65224),
+1593=>array(65225, 65226, 65227, 65228),
+1594=>array(65229, 65230, 65231, 65232),
+1601=>array(65233, 65234, 65235, 65236),
+1602=>array(65237, 65238, 65239, 65240),
+1603=>array(65241, 65242, 65243, 65244),
+1604=>array(65245, 65246, 65247, 65248),
+1605=>array(65249, 65250, 65251, 65252),
+1606=>array(65253, 65254, 65255, 65256),
+1607=>array(65257, 65258, 65259, 65260),
+1608=>array(65261, 65262, 65261, 65262),
+1609=>array(65263, 65264, 64488, 64489),
+1610=>array(65265, 65266, 65267, 65268),
+1649=>array(64336, 64337),
+1655=>array(64477),
+1657=>array(64358, 64359, 64360, 64361),
+1658=>array(64350, 64351, 64352, 64353),
+1659=>array(64338, 64339, 64340, 64341),
+1662=>array(64342, 64343, 64344, 64345),
+1663=>array(64354, 64355, 64356, 64357),
+1664=>array(64346, 64347, 64348, 64349),
+1667=>array(64374, 64375, 64376, 64377),
+1668=>array(64370, 64371, 64372, 64373),
+1670=>array(64378, 64379, 64380, 64381),
+1671=>array(64382, 64383, 64384, 64385),
+1672=>array(64392, 64393),
+1676=>array(64388, 64389),
+1677=>array(64386, 64387),
+1678=>array(64390, 64391),
+1681=>array(64396, 64397),
+1688=>array(64394, 64395, 64394, 64395),
+1700=>array(64362, 64363, 64364, 64365),
+1702=>array(64366, 64367, 64368, 64369),
+1705=>array(64398, 64399, 64400, 64401),
+1709=>array(64467, 64468, 64469, 64470),
+1711=>array(64402, 64403, 64404, 64405),
+1713=>array(64410, 64411, 64412, 64413),
+1715=>array(64406, 64407, 64408, 64409),
+1722=>array(64414, 64415),
+1723=>array(64416, 64417, 64418, 64419),
+1726=>array(64426, 64427, 64428, 64429),
+1728=>array(64420, 64421),
+1729=>array(64422, 64423, 64424, 64425),
+1733=>array(64480, 64481),
+1734=>array(64473, 64474),
+1735=>array(64471, 64472),
+1736=>array(64475, 64476),
+1737=>array(64482, 64483),
+1739=>array(64478, 64479),
+1740=>array(64508, 64509, 64510, 64511),
+1744=>array(64484, 64485, 64486, 64487),
+1746=>array(64430, 64431),
+1747=>array(64432, 64433)
+);
+
+/**
+ * Arabic laa letter: (char code => isolated, final, initial, medial).
+ * @public
+ */
+public static $uni_laa_array = array (
+1570 =>array(65269, 65270, 65269, 65270),
+1571 =>array(65271, 65272, 65271, 65272),
+1573 =>array(65273, 65274, 65273, 65274),
+1575 =>array(65275, 65276, 65275, 65276)
+);
+
+/**
+ * Array of character substitutions for sequences of two diacritics symbols.
+ * Putting the combining mark and character in the same glyph allows us to avoid the two marks overlapping each other in an illegible manner.
+ * second NSM char code => substitution char
+ * @public
+ */
+public static $uni_diacritics = array (
+1612=>64606, # Shadda + Dammatan
+1613=>64607, # Shadda + Kasratan
+1614=>64608, # Shadda + Fatha
+1615=>64609, # Shadda + Damma
+1616=>64610  # Shadda + Kasra
+);
+
+/**
+ * Array of character substitutions from UTF-8 Unicode to Latin1.
+ * @public
+ */
+public static $uni_utf8tolatin = array (
+8364=>128, # Euro1
+338=>140,  # OE
+352=>138,  # Scaron
+376=>159,  # Ydieresis
+381=>142,  # Zcaron2
+8226=>149, # bullet3
+710=>136,  # circumflex
+8224=>134, # dagger
+8225=>135, # daggerdbl
+8230=>133, # ellipsis
+8212=>151, # emdash
+8211=>150, # endash
+402=>131,  # florin
+8249=>139, # guilsinglleft
+8250=>155, # guilsinglright
+339=>156,  # oe
+8240=>137, # perthousand
+8222=>132, # quotedblbase
+8220=>147, # quotedblleft
+8221=>148, # quotedblright
+8216=>145, # quoteleft
+8217=>146, # quoteright
+8218=>130, # quotesinglbase
+353=>154,  # scaron
+732=>152,  # tilde
+8482=>153, # trademark
+382=>158   # zcaron2
+);
+
+/**
+ * Array of Encoding Maps.
+ * @public static
+ */
+public static $encmap = array(
+
+// encoding map for: cp874
+'cp874' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'ellipsis',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'kokaithai',162=>'khokhaithai',163=>'khokhuatthai',164=>'khokhwaithai',165=>'khokhonthai',166=>'khorakhangthai',167=>'ngonguthai',168=>'chochanthai',169=>'chochingthai',170=>'chochangthai',171=>'sosothai',172=>'chochoethai',173=>'yoyingthai',174=>'dochadathai',175=>'topatakthai',176=>'thothanthai',177=>'thonangmonthothai',178=>'thophuthaothai',179=>'nonenthai',180=>'dodekthai',181=>'totaothai',182=>'thothungthai',183=>'thothahanthai',184=>'thothongthai',185=>'nonuthai',186=>'bobaimaithai',187=>'poplathai',188=>'phophungthai',189=>'fofathai',190=>'phophanthai',191=>'fofanthai',192=>'phosamphaothai',193=>'momathai',194=>'yoyakthai',195=>'roruathai',196=>'ruthai',197=>'lolingthai',198=>'luthai',199=>'wowaenthai',200=>'sosalathai',201=>'sorusithai',202=>'sosuathai',203=>'hohipthai',204=>'lochulathai',205=>'oangthai',206=>'honokhukthai',207=>'paiyannoithai',208=>'saraathai',209=>'maihanakatthai',210=>'saraaathai',211=>'saraamthai',212=>'saraithai',213=>'saraiithai',214=>'sarauethai',215=>'saraueethai',216=>'sarauthai',217=>'sarauuthai',218=>'phinthuthai',219=>'.notdef',220=>'.notdef',221=>'.notdef',222=>'.notdef',223=>'bahtthai',224=>'saraethai',225=>'saraaethai',226=>'saraothai',227=>'saraaimaimuanthai',228=>'saraaimaimalaithai',229=>'lakkhangyaothai',230=>'maiyamokthai',231=>'maitaikhuthai',232=>'maiekthai',233=>'maithothai',234=>'maitrithai',235=>'maichattawathai',236=>'thanthakhatthai',237=>'nikhahitthai',238=>'yamakkanthai',239=>'fongmanthai',240=>'zerothai',241=>'onethai',242=>'twothai',243=>'threethai',244=>'fourthai',245=>'fivethai',246=>'sixthai',247=>'seventhai',248=>'eightthai',249=>'ninethai',250=>'angkhankhuthai',251=>'khomutthai',252=>'.notdef',253=>'.notdef',254=>'.notdef',255=>'.notdef'),
+
+// encoding map for: cp1250
+'cp1250' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'quotesinglbase',131=>'.notdef',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'.notdef',137=>'perthousand',138=>'Scaron',139=>'guilsinglleft',140=>'Sacute',141=>'Tcaron',142=>'Zcaron',143=>'Zacute',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'.notdef',153=>'trademark',154=>'scaron',155=>'guilsinglright',156=>'sacute',157=>'tcaron',158=>'zcaron',159=>'zacute',160=>'space',161=>'caron',162=>'breve',163=>'Lslash',164=>'currency',165=>'Aogonek',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'Scedilla',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'Zdotaccent',176=>'degree',177=>'plusminus',178=>'ogonek',179=>'lslash',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'cedilla',185=>'aogonek',186=>'scedilla',187=>'guillemotright',188=>'Lcaron',189=>'hungarumlaut',190=>'lcaron',191=>'zdotaccent',192=>'Racute',193=>'Aacute',194=>'Acircumflex',195=>'Abreve',196=>'Adieresis',197=>'Lacute',198=>'Cacute',199=>'Ccedilla',200=>'Ccaron',201=>'Eacute',202=>'Eogonek',203=>'Edieresis',204=>'Ecaron',205=>'Iacute',206=>'Icircumflex',207=>'Dcaron',208=>'Dcroat',209=>'Nacute',210=>'Ncaron',211=>'Oacute',212=>'Ocircumflex',213=>'Ohungarumlaut',214=>'Odieresis',215=>'multiply',216=>'Rcaron',217=>'Uring',218=>'Uacute',219=>'Uhungarumlaut',220=>'Udieresis',221=>'Yacute',222=>'Tcommaaccent',223=>'germandbls',224=>'racute',225=>'aacute',226=>'acircumflex',227=>'abreve',228=>'adieresis',229=>'lacute',230=>'cacute',231=>'ccedilla',232=>'ccaron',233=>'eacute',234=>'eogonek',235=>'edieresis',236=>'ecaron',237=>'iacute',238=>'icircumflex',239=>'dcaron',240=>'dcroat',241=>'nacute',242=>'ncaron',243=>'oacute',244=>'ocircumflex',245=>'ohungarumlaut',246=>'odieresis',247=>'divide',248=>'rcaron',249=>'uring',250=>'uacute',251=>'uhungarumlaut',252=>'udieresis',253=>'yacute',254=>'tcommaaccent',255=>'dotaccent'),
+
+// encoding map for: cp1251
+'cp1251' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'afii10051',129=>'afii10052',130=>'quotesinglbase',131=>'afii10100',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'Euro',137=>'perthousand',138=>'afii10058',139=>'guilsinglleft',140=>'afii10059',141=>'afii10061',142=>'afii10060',143=>'afii10145',144=>'afii10099',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'.notdef',153=>'trademark',154=>'afii10106',155=>'guilsinglright',156=>'afii10107',157=>'afii10109',158=>'afii10108',159=>'afii10193',160=>'space',161=>'afii10062',162=>'afii10110',163=>'afii10057',164=>'currency',165=>'afii10050',166=>'brokenbar',167=>'section',168=>'afii10023',169=>'copyright',170=>'afii10053',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'afii10056',176=>'degree',177=>'plusminus',178=>'afii10055',179=>'afii10103',180=>'afii10098',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'afii10071',185=>'afii61352',186=>'afii10101',187=>'guillemotright',188=>'afii10105',189=>'afii10054',190=>'afii10102',191=>'afii10104',192=>'afii10017',193=>'afii10018',194=>'afii10019',195=>'afii10020',196=>'afii10021',197=>'afii10022',198=>'afii10024',199=>'afii10025',200=>'afii10026',201=>'afii10027',202=>'afii10028',203=>'afii10029',204=>'afii10030',205=>'afii10031',206=>'afii10032',207=>'afii10033',208=>'afii10034',209=>'afii10035',210=>'afii10036',211=>'afii10037',212=>'afii10038',213=>'afii10039',214=>'afii10040',215=>'afii10041',216=>'afii10042',217=>'afii10043',218=>'afii10044',219=>'afii10045',220=>'afii10046',221=>'afii10047',222=>'afii10048',223=>'afii10049',224=>'afii10065',225=>'afii10066',226=>'afii10067',227=>'afii10068',228=>'afii10069',229=>'afii10070',230=>'afii10072',231=>'afii10073',232=>'afii10074',233=>'afii10075',234=>'afii10076',235=>'afii10077',236=>'afii10078',237=>'afii10079',238=>'afii10080',239=>'afii10081',240=>'afii10082',241=>'afii10083',242=>'afii10084',243=>'afii10085',244=>'afii10086',245=>'afii10087',246=>'afii10088',247=>'afii10089',248=>'afii10090',249=>'afii10091',250=>'afii10092',251=>'afii10093',252=>'afii10094',253=>'afii10095',254=>'afii10096',255=>'afii10097'),
+
+// encoding map for: cp1252
+'cp1252' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'quotesinglbase',131=>'florin',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'circumflex',137=>'perthousand',138=>'Scaron',139=>'guilsinglleft',140=>'OE',141=>'.notdef',142=>'Zcaron',143=>'.notdef',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'tilde',153=>'trademark',154=>'scaron',155=>'guilsinglright',156=>'oe',157=>'.notdef',158=>'zcaron',159=>'Ydieresis',160=>'space',161=>'exclamdown',162=>'cent',163=>'sterling',164=>'currency',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'ordfeminine',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'cedilla',185=>'onesuperior',186=>'ordmasculine',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'questiondown',192=>'Agrave',193=>'Aacute',194=>'Acircumflex',195=>'Atilde',196=>'Adieresis',197=>'Aring',198=>'AE',199=>'Ccedilla',200=>'Egrave',201=>'Eacute',202=>'Ecircumflex',203=>'Edieresis',204=>'Igrave',205=>'Iacute',206=>'Icircumflex',207=>'Idieresis',208=>'Eth',209=>'Ntilde',210=>'Ograve',211=>'Oacute',212=>'Ocircumflex',213=>'Otilde',214=>'Odieresis',215=>'multiply',216=>'Oslash',217=>'Ugrave',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Yacute',222=>'Thorn',223=>'germandbls',224=>'agrave',225=>'aacute',226=>'acircumflex',227=>'atilde',228=>'adieresis',229=>'aring',230=>'ae',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'igrave',237=>'iacute',238=>'icircumflex',239=>'idieresis',240=>'eth',241=>'ntilde',242=>'ograve',243=>'oacute',244=>'ocircumflex',245=>'otilde',246=>'odieresis',247=>'divide',248=>'oslash',249=>'ugrave',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'yacute',254=>'thorn',255=>'ydieresis'),
+
+// encoding map for: cp1253
+'cp1253' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'quotesinglbase',131=>'florin',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'.notdef',137=>'perthousand',138=>'.notdef',139=>'guilsinglleft',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'.notdef',153=>'trademark',154=>'.notdef',155=>'guilsinglright',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'dieresistonos',162=>'Alphatonos',163=>'sterling',164=>'currency',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'.notdef',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'afii00208',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'tonos',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'Epsilontonos',185=>'Etatonos',186=>'Iotatonos',187=>'guillemotright',188=>'Omicrontonos',189=>'onehalf',190=>'Upsilontonos',191=>'Omegatonos',192=>'iotadieresistonos',193=>'Alpha',194=>'Beta',195=>'Gamma',196=>'Delta',197=>'Epsilon',198=>'Zeta',199=>'Eta',200=>'Theta',201=>'Iota',202=>'Kappa',203=>'Lambda',204=>'Mu',205=>'Nu',206=>'Xi',207=>'Omicron',208=>'Pi',209=>'Rho',210=>'.notdef',211=>'Sigma',212=>'Tau',213=>'Upsilon',214=>'Phi',215=>'Chi',216=>'Psi',217=>'Omega',218=>'Iotadieresis',219=>'Upsilondieresis',220=>'alphatonos',221=>'epsilontonos',222=>'etatonos',223=>'iotatonos',224=>'upsilondieresistonos',225=>'alpha',226=>'beta',227=>'gamma',228=>'delta',229=>'epsilon',230=>'zeta',231=>'eta',232=>'theta',233=>'iota',234=>'kappa',235=>'lambda',236=>'mu',237=>'nu',238=>'xi',239=>'omicron',240=>'pi',241=>'rho',242=>'sigma1',243=>'sigma',244=>'tau',245=>'upsilon',246=>'phi',247=>'chi',248=>'psi',249=>'omega',250=>'iotadieresis',251=>'upsilondieresis',252=>'omicrontonos',253=>'upsilontonos',254=>'omegatonos',255=>'.notdef'),
+
+// encoding map for: cp1254
+'cp1254' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'quotesinglbase',131=>'florin',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'circumflex',137=>'perthousand',138=>'Scaron',139=>'guilsinglleft',140=>'OE',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'tilde',153=>'trademark',154=>'scaron',155=>'guilsinglright',156=>'oe',157=>'.notdef',158=>'.notdef',159=>'Ydieresis',160=>'space',161=>'exclamdown',162=>'cent',163=>'sterling',164=>'currency',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'ordfeminine',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'cedilla',185=>'onesuperior',186=>'ordmasculine',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'questiondown',192=>'Agrave',193=>'Aacute',194=>'Acircumflex',195=>'Atilde',196=>'Adieresis',197=>'Aring',198=>'AE',199=>'Ccedilla',200=>'Egrave',201=>'Eacute',202=>'Ecircumflex',203=>'Edieresis',204=>'Igrave',205=>'Iacute',206=>'Icircumflex',207=>'Idieresis',208=>'Gbreve',209=>'Ntilde',210=>'Ograve',211=>'Oacute',212=>'Ocircumflex',213=>'Otilde',214=>'Odieresis',215=>'multiply',216=>'Oslash',217=>'Ugrave',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Idotaccent',222=>'Scedilla',223=>'germandbls',224=>'agrave',225=>'aacute',226=>'acircumflex',227=>'atilde',228=>'adieresis',229=>'aring',230=>'ae',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'igrave',237=>'iacute',238=>'icircumflex',239=>'idieresis',240=>'gbreve',241=>'ntilde',242=>'ograve',243=>'oacute',244=>'ocircumflex',245=>'otilde',246=>'odieresis',247=>'divide',248=>'oslash',249=>'ugrave',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'dotlessi',254=>'scedilla',255=>'ydieresis'),
+
+// encoding map for: cp1255
+'cp1255' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'quotesinglbase',131=>'florin',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'circumflex',137=>'perthousand',138=>'.notdef',139=>'guilsinglleft',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'tilde',153=>'trademark',154=>'.notdef',155=>'guilsinglright',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'exclamdown',162=>'cent',163=>'sterling',164=>'afii57636',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'multiply',171=>'guillemotleft',172=>'logicalnot',173=>'sfthyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'middot',184=>'cedilla',185=>'onesuperior',186=>'divide',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'questiondown',192=>'afii57799',193=>'afii57801',194=>'afii57800',195=>'afii57802',196=>'afii57793',197=>'afii57794',198=>'afii57795',199=>'afii57798',200=>'afii57797',201=>'afii57806',202=>'.notdef',203=>'afii57796',204=>'afii57807',205=>'afii57839',206=>'afii57645',207=>'afii57841',208=>'afii57842',209=>'afii57804',210=>'afii57803',211=>'afii57658',212=>'afii57716',213=>'afii57717',214=>'afii57718',215=>'gereshhebrew',216=>'gershayimhebrew',217=>'.notdef',218=>'.notdef',219=>'.notdef',220=>'.notdef',221=>'.notdef',222=>'.notdef',223=>'.notdef',224=>'afii57664',225=>'afii57665',226=>'afii57666',227=>'afii57667',228=>'afii57668',229=>'afii57669',230=>'afii57670',231=>'afii57671',232=>'afii57672',233=>'afii57673',234=>'afii57674',235=>'afii57675',236=>'afii57676',237=>'afii57677',238=>'afii57678',239=>'afii57679',240=>'afii57680',241=>'afii57681',242=>'afii57682',243=>'afii57683',244=>'afii57684',245=>'afii57685',246=>'afii57686',247=>'afii57687',248=>'afii57688',249=>'afii57689',250=>'afii57690',251=>'.notdef',252=>'.notdef',253=>'afii299',254=>'afii300',255=>'.notdef'),
+
+// encoding map for: cp1256
+'cp1256' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'afii57506',130=>'quotesinglbase',131=>'florin',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'circumflex',137=>'perthousand',138=>'afii57511',139=>'guilsinglleft',140=>'OE',141=>'afii57507',142=>'afii57508',143=>'afii57512',144=>'afii57509',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'.notdef',153=>'trademark',154=>'afii57513',155=>'guilsinglright',156=>'oe',157=>'afii61664',158=>'afii301',159=>'afii57514',160=>'space',161=>'afii57388',162=>'cent',163=>'sterling',164=>'currency',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'.notdef',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'cedilla',185=>'onesuperior',186=>'afii57403',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'afii57407',192=>'.notdef',193=>'afii57409',194=>'afii57410',195=>'afii57411',196=>'afii57412',197=>'afii57413',198=>'afii57414',199=>'afii57415',200=>'afii57416',201=>'afii57417',202=>'afii57418',203=>'afii57419',204=>'afii57420',205=>'afii57421',206=>'afii57422',207=>'afii57423',208=>'afii57424',209=>'afii57425',210=>'afii57426',211=>'afii57427',212=>'afii57428',213=>'afii57429',214=>'afii57430',215=>'multiply',216=>'afii57431',217=>'afii57432',218=>'afii57433',219=>'afii57434',220=>'afii57440',221=>'afii57441',222=>'afii57442',223=>'afii57443',224=>'agrave',225=>'afii57444',226=>'acircumflex',227=>'afii57445',228=>'afii57446',229=>'afii57470',230=>'afii57448',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'afii57449',237=>'afii57450',238=>'icircumflex',239=>'idieresis',240=>'afii57451',241=>'afii57452',242=>'afii57453',243=>'afii57454',244=>'ocircumflex',245=>'afii57455',246=>'afii57456',247=>'divide',248=>'afii57457',249=>'ugrave',250=>'afii57458',251=>'ucircumflex',252=>'udieresis',253=>'afii299',254=>'afii300',255=>'afii57519'),
+
+// encoding map for: cp1257
+'cp1257' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'quotesinglbase',131=>'.notdef',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'.notdef',137=>'perthousand',138=>'.notdef',139=>'guilsinglleft',140=>'.notdef',141=>'dieresis',142=>'caron',143=>'cedilla',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'.notdef',153=>'trademark',154=>'.notdef',155=>'guilsinglright',156=>'.notdef',157=>'macron',158=>'ogonek',159=>'.notdef',160=>'space',161=>'.notdef',162=>'cent',163=>'sterling',164=>'currency',165=>'.notdef',166=>'brokenbar',167=>'section',168=>'Oslash',169=>'copyright',170=>'Rcommaaccent',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'AE',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'oslash',185=>'onesuperior',186=>'rcommaaccent',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'ae',192=>'Aogonek',193=>'Iogonek',194=>'Amacron',195=>'Cacute',196=>'Adieresis',197=>'Aring',198=>'Eogonek',199=>'Emacron',200=>'Ccaron',201=>'Eacute',202=>'Zacute',203=>'Edotaccent',204=>'Gcommaaccent',205=>'Kcommaaccent',206=>'Imacron',207=>'Lcommaaccent',208=>'Scaron',209=>'Nacute',210=>'Ncommaaccent',211=>'Oacute',212=>'Omacron',213=>'Otilde',214=>'Odieresis',215=>'multiply',216=>'Uogonek',217=>'Lslash',218=>'Sacute',219=>'Umacron',220=>'Udieresis',221=>'Zdotaccent',222=>'Zcaron',223=>'germandbls',224=>'aogonek',225=>'iogonek',226=>'amacron',227=>'cacute',228=>'adieresis',229=>'aring',230=>'eogonek',231=>'emacron',232=>'ccaron',233=>'eacute',234=>'zacute',235=>'edotaccent',236=>'gcommaaccent',237=>'kcommaaccent',238=>'imacron',239=>'lcommaaccent',240=>'scaron',241=>'nacute',242=>'ncommaaccent',243=>'oacute',244=>'omacron',245=>'otilde',246=>'odieresis',247=>'divide',248=>'uogonek',249=>'lslash',250=>'sacute',251=>'umacron',252=>'udieresis',253=>'zdotaccent',254=>'zcaron',255=>'dotaccent'),
+
+// encoding map for: cp1258
+'cp1258' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'quotesinglbase',131=>'florin',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'circumflex',137=>'perthousand',138=>'.notdef',139=>'guilsinglleft',140=>'OE',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'tilde',153=>'trademark',154=>'.notdef',155=>'guilsinglright',156=>'oe',157=>'.notdef',158=>'.notdef',159=>'Ydieresis',160=>'space',161=>'exclamdown',162=>'cent',163=>'sterling',164=>'currency',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'ordfeminine',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'cedilla',185=>'onesuperior',186=>'ordmasculine',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'questiondown',192=>'Agrave',193=>'Aacute',194=>'Acircumflex',195=>'Abreve',196=>'Adieresis',197=>'Aring',198=>'AE',199=>'Ccedilla',200=>'Egrave',201=>'Eacute',202=>'Ecircumflex',203=>'Edieresis',204=>'gravecomb',205=>'Iacute',206=>'Icircumflex',207=>'Idieresis',208=>'Dcroat',209=>'Ntilde',210=>'hookabovecomb',211=>'Oacute',212=>'Ocircumflex',213=>'Ohorn',214=>'Odieresis',215=>'multiply',216=>'Oslash',217=>'Ugrave',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Uhorn',222=>'tildecomb',223=>'germandbls',224=>'agrave',225=>'aacute',226=>'acircumflex',227=>'abreve',228=>'adieresis',229=>'aring',230=>'ae',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'acutecomb',237=>'iacute',238=>'icircumflex',239=>'idieresis',240=>'dcroat',241=>'ntilde',242=>'dotbelowcomb',243=>'oacute',244=>'ocircumflex',245=>'ohorn',246=>'odieresis',247=>'divide',248=>'oslash',249=>'ugrave',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'uhorn',254=>'dong',255=>'ydieresis'),
+
+// encoding map for: iso-8859-1
+'iso-8859-1' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'exclamdown',162=>'cent',163=>'sterling',164=>'currency',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'ordfeminine',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'cedilla',185=>'onesuperior',186=>'ordmasculine',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'questiondown',192=>'Agrave',193=>'Aacute',194=>'Acircumflex',195=>'Atilde',196=>'Adieresis',197=>'Aring',198=>'AE',199=>'Ccedilla',200=>'Egrave',201=>'Eacute',202=>'Ecircumflex',203=>'Edieresis',204=>'Igrave',205=>'Iacute',206=>'Icircumflex',207=>'Idieresis',208=>'Eth',209=>'Ntilde',210=>'Ograve',211=>'Oacute',212=>'Ocircumflex',213=>'Otilde',214=>'Odieresis',215=>'multiply',216=>'Oslash',217=>'Ugrave',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Yacute',222=>'Thorn',223=>'germandbls',224=>'agrave',225=>'aacute',226=>'acircumflex',227=>'atilde',228=>'adieresis',229=>'aring',230=>'ae',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'igrave',237=>'iacute',238=>'icircumflex',239=>'idieresis',240=>'eth',241=>'ntilde',242=>'ograve',243=>'oacute',244=>'ocircumflex',245=>'otilde',246=>'odieresis',247=>'divide',248=>'oslash',249=>'ugrave',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'yacute',254=>'thorn',255=>'ydieresis'),
+
+// encoding map for: iso-8859-2
+'iso-8859-2' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'Aogonek',162=>'breve',163=>'Lslash',164=>'currency',165=>'Lcaron',166=>'Sacute',167=>'section',168=>'dieresis',169=>'Scaron',170=>'Scedilla',171=>'Tcaron',172=>'Zacute',173=>'hyphen',174=>'Zcaron',175=>'Zdotaccent',176=>'degree',177=>'aogonek',178=>'ogonek',179=>'lslash',180=>'acute',181=>'lcaron',182=>'sacute',183=>'caron',184=>'cedilla',185=>'scaron',186=>'scedilla',187=>'tcaron',188=>'zacute',189=>'hungarumlaut',190=>'zcaron',191=>'zdotaccent',192=>'Racute',193=>'Aacute',194=>'Acircumflex',195=>'Abreve',196=>'Adieresis',197=>'Lacute',198=>'Cacute',199=>'Ccedilla',200=>'Ccaron',201=>'Eacute',202=>'Eogonek',203=>'Edieresis',204=>'Ecaron',205=>'Iacute',206=>'Icircumflex',207=>'Dcaron',208=>'Dcroat',209=>'Nacute',210=>'Ncaron',211=>'Oacute',212=>'Ocircumflex',213=>'Ohungarumlaut',214=>'Odieresis',215=>'multiply',216=>'Rcaron',217=>'Uring',218=>'Uacute',219=>'Uhungarumlaut',220=>'Udieresis',221=>'Yacute',222=>'Tcommaaccent',223=>'germandbls',224=>'racute',225=>'aacute',226=>'acircumflex',227=>'abreve',228=>'adieresis',229=>'lacute',230=>'cacute',231=>'ccedilla',232=>'ccaron',233=>'eacute',234=>'eogonek',235=>'edieresis',236=>'ecaron',237=>'iacute',238=>'icircumflex',239=>'dcaron',240=>'dcroat',241=>'nacute',242=>'ncaron',243=>'oacute',244=>'ocircumflex',245=>'ohungarumlaut',246=>'odieresis',247=>'divide',248=>'rcaron',249=>'uring',250=>'uacute',251=>'uhungarumlaut',252=>'udieresis',253=>'yacute',254=>'tcommaaccent',255=>'dotaccent'),
+
+// encoding map for: iso-8859-4
+'iso-8859-4' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'Aogonek',162=>'kgreenlandic',163=>'Rcommaaccent',164=>'currency',165=>'Itilde',166=>'Lcommaaccent',167=>'section',168=>'dieresis',169=>'Scaron',170=>'Emacron',171=>'Gcommaaccent',172=>'Tbar',173=>'hyphen',174=>'Zcaron',175=>'macron',176=>'degree',177=>'aogonek',178=>'ogonek',179=>'rcommaaccent',180=>'acute',181=>'itilde',182=>'lcommaaccent',183=>'caron',184=>'cedilla',185=>'scaron',186=>'emacron',187=>'gcommaaccent',188=>'tbar',189=>'Eng',190=>'zcaron',191=>'eng',192=>'Amacron',193=>'Aacute',194=>'Acircumflex',195=>'Atilde',196=>'Adieresis',197=>'Aring',198=>'AE',199=>'Iogonek',200=>'Ccaron',201=>'Eacute',202=>'Eogonek',203=>'Edieresis',204=>'Edotaccent',205=>'Iacute',206=>'Icircumflex',207=>'Imacron',208=>'Dcroat',209=>'Ncommaaccent',210=>'Omacron',211=>'Kcommaaccent',212=>'Ocircumflex',213=>'Otilde',214=>'Odieresis',215=>'multiply',216=>'Oslash',217=>'Uogonek',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Utilde',222=>'Umacron',223=>'germandbls',224=>'amacron',225=>'aacute',226=>'acircumflex',227=>'atilde',228=>'adieresis',229=>'aring',230=>'ae',231=>'iogonek',232=>'ccaron',233=>'eacute',234=>'eogonek',235=>'edieresis',236=>'edotaccent',237=>'iacute',238=>'icircumflex',239=>'imacron',240=>'dcroat',241=>'ncommaaccent',242=>'omacron',243=>'kcommaaccent',244=>'ocircumflex',245=>'otilde',246=>'odieresis',247=>'divide',248=>'oslash',249=>'uogonek',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'utilde',254=>'umacron',255=>'dotaccent'),
+
+// encoding map for: iso-8859-5
+'iso-8859-5' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'afii10023',162=>'afii10051',163=>'afii10052',164=>'afii10053',165=>'afii10054',166=>'afii10055',167=>'afii10056',168=>'afii10057',169=>'afii10058',170=>'afii10059',171=>'afii10060',172=>'afii10061',173=>'hyphen',174=>'afii10062',175=>'afii10145',176=>'afii10017',177=>'afii10018',178=>'afii10019',179=>'afii10020',180=>'afii10021',181=>'afii10022',182=>'afii10024',183=>'afii10025',184=>'afii10026',185=>'afii10027',186=>'afii10028',187=>'afii10029',188=>'afii10030',189=>'afii10031',190=>'afii10032',191=>'afii10033',192=>'afii10034',193=>'afii10035',194=>'afii10036',195=>'afii10037',196=>'afii10038',197=>'afii10039',198=>'afii10040',199=>'afii10041',200=>'afii10042',201=>'afii10043',202=>'afii10044',203=>'afii10045',204=>'afii10046',205=>'afii10047',206=>'afii10048',207=>'afii10049',208=>'afii10065',209=>'afii10066',210=>'afii10067',211=>'afii10068',212=>'afii10069',213=>'afii10070',214=>'afii10072',215=>'afii10073',216=>'afii10074',217=>'afii10075',218=>'afii10076',219=>'afii10077',220=>'afii10078',221=>'afii10079',222=>'afii10080',223=>'afii10081',224=>'afii10082',225=>'afii10083',226=>'afii10084',227=>'afii10085',228=>'afii10086',229=>'afii10087',230=>'afii10088',231=>'afii10089',232=>'afii10090',233=>'afii10091',234=>'afii10092',235=>'afii10093',236=>'afii10094',237=>'afii10095',238=>'afii10096',239=>'afii10097',240=>'afii61352',241=>'afii10071',242=>'afii10099',243=>'afii10100',244=>'afii10101',245=>'afii10102',246=>'afii10103',247=>'afii10104',248=>'afii10105',249=>'afii10106',250=>'afii10107',251=>'afii10108',252=>'afii10109',253=>'section',254=>'afii10110',255=>'afii10193'),
+
+// encoding map for: iso-8859-7
+'iso-8859-7' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'quoteleft',162=>'quoteright',163=>'sterling',164=>'.notdef',165=>'.notdef',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'.notdef',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'.notdef',175=>'afii00208',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'tonos',181=>'dieresistonos',182=>'Alphatonos',183=>'periodcentered',184=>'Epsilontonos',185=>'Etatonos',186=>'Iotatonos',187=>'guillemotright',188=>'Omicrontonos',189=>'onehalf',190=>'Upsilontonos',191=>'Omegatonos',192=>'iotadieresistonos',193=>'Alpha',194=>'Beta',195=>'Gamma',196=>'Delta',197=>'Epsilon',198=>'Zeta',199=>'Eta',200=>'Theta',201=>'Iota',202=>'Kappa',203=>'Lambda',204=>'Mu',205=>'Nu',206=>'Xi',207=>'Omicron',208=>'Pi',209=>'Rho',210=>'.notdef',211=>'Sigma',212=>'Tau',213=>'Upsilon',214=>'Phi',215=>'Chi',216=>'Psi',217=>'Omega',218=>'Iotadieresis',219=>'Upsilondieresis',220=>'alphatonos',221=>'epsilontonos',222=>'etatonos',223=>'iotatonos',224=>'upsilondieresistonos',225=>'alpha',226=>'beta',227=>'gamma',228=>'delta',229=>'epsilon',230=>'zeta',231=>'eta',232=>'theta',233=>'iota',234=>'kappa',235=>'lambda',236=>'mu',237=>'nu',238=>'xi',239=>'omicron',240=>'pi',241=>'rho',242=>'sigma1',243=>'sigma',244=>'tau',245=>'upsilon',246=>'phi',247=>'chi',248=>'psi',249=>'omega',250=>'iotadieresis',251=>'upsilondieresis',252=>'omicrontonos',253=>'upsilontonos',254=>'omegatonos',255=>'.notdef'),
+
+// encoding map for: iso-8859-9
+'iso-8859-9' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'exclamdown',162=>'cent',163=>'sterling',164=>'currency',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'ordfeminine',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'cedilla',185=>'onesuperior',186=>'ordmasculine',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'questiondown',192=>'Agrave',193=>'Aacute',194=>'Acircumflex',195=>'Atilde',196=>'Adieresis',197=>'Aring',198=>'AE',199=>'Ccedilla',200=>'Egrave',201=>'Eacute',202=>'Ecircumflex',203=>'Edieresis',204=>'Igrave',205=>'Iacute',206=>'Icircumflex',207=>'Idieresis',208=>'Gbreve',209=>'Ntilde',210=>'Ograve',211=>'Oacute',212=>'Ocircumflex',213=>'Otilde',214=>'Odieresis',215=>'multiply',216=>'Oslash',217=>'Ugrave',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Idotaccent',222=>'Scedilla',223=>'germandbls',224=>'agrave',225=>'aacute',226=>'acircumflex',227=>'atilde',228=>'adieresis',229=>'aring',230=>'ae',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'igrave',237=>'iacute',238=>'icircumflex',239=>'idieresis',240=>'gbreve',241=>'ntilde',242=>'ograve',243=>'oacute',244=>'ocircumflex',245=>'otilde',246=>'odieresis',247=>'divide',248=>'oslash',249=>'ugrave',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'dotlessi',254=>'scedilla',255=>'ydieresis'),
+
+// encoding map for: iso-8859-11
+'iso-8859-11' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'kokaithai',162=>'khokhaithai',163=>'khokhuatthai',164=>'khokhwaithai',165=>'khokhonthai',166=>'khorakhangthai',167=>'ngonguthai',168=>'chochanthai',169=>'chochingthai',170=>'chochangthai',171=>'sosothai',172=>'chochoethai',173=>'yoyingthai',174=>'dochadathai',175=>'topatakthai',176=>'thothanthai',177=>'thonangmonthothai',178=>'thophuthaothai',179=>'nonenthai',180=>'dodekthai',181=>'totaothai',182=>'thothungthai',183=>'thothahanthai',184=>'thothongthai',185=>'nonuthai',186=>'bobaimaithai',187=>'poplathai',188=>'phophungthai',189=>'fofathai',190=>'phophanthai',191=>'fofanthai',192=>'phosamphaothai',193=>'momathai',194=>'yoyakthai',195=>'roruathai',196=>'ruthai',197=>'lolingthai',198=>'luthai',199=>'wowaenthai',200=>'sosalathai',201=>'sorusithai',202=>'sosuathai',203=>'hohipthai',204=>'lochulathai',205=>'oangthai',206=>'honokhukthai',207=>'paiyannoithai',208=>'saraathai',209=>'maihanakatthai',210=>'saraaathai',211=>'saraamthai',212=>'saraithai',213=>'saraiithai',214=>'sarauethai',215=>'saraueethai',216=>'sarauthai',217=>'sarauuthai',218=>'phinthuthai',219=>'.notdef',220=>'.notdef',221=>'.notdef',222=>'.notdef',223=>'bahtthai',224=>'saraethai',225=>'saraaethai',226=>'saraothai',227=>'saraaimaimuanthai',228=>'saraaimaimalaithai',229=>'lakkhangyaothai',230=>'maiyamokthai',231=>'maitaikhuthai',232=>'maiekthai',233=>'maithothai',234=>'maitrithai',235=>'maichattawathai',236=>'thanthakhatthai',237=>'nikhahitthai',238=>'yamakkanthai',239=>'fongmanthai',240=>'zerothai',241=>'onethai',242=>'twothai',243=>'threethai',244=>'fourthai',245=>'fivethai',246=>'sixthai',247=>'seventhai',248=>'eightthai',249=>'ninethai',250=>'angkhankhuthai',251=>'khomutthai',252=>'.notdef',253=>'.notdef',254=>'.notdef',255=>'.notdef'),
+
+// encoding map for: iso-8859-15
+'iso-8859-15' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'exclamdown',162=>'cent',163=>'sterling',164=>'Euro',165=>'yen',166=>'Scaron',167=>'section',168=>'scaron',169=>'copyright',170=>'ordfeminine',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'Zcaron',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'zcaron',185=>'onesuperior',186=>'ordmasculine',187=>'guillemotright',188=>'OE',189=>'oe',190=>'Ydieresis',191=>'questiondown',192=>'Agrave',193=>'Aacute',194=>'Acircumflex',195=>'Atilde',196=>'Adieresis',197=>'Aring',198=>'AE',199=>'Ccedilla',200=>'Egrave',201=>'Eacute',202=>'Ecircumflex',203=>'Edieresis',204=>'Igrave',205=>'Iacute',206=>'Icircumflex',207=>'Idieresis',208=>'Eth',209=>'Ntilde',210=>'Ograve',211=>'Oacute',212=>'Ocircumflex',213=>'Otilde',214=>'Odieresis',215=>'multiply',216=>'Oslash',217=>'Ugrave',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Yacute',222=>'Thorn',223=>'germandbls',224=>'agrave',225=>'aacute',226=>'acircumflex',227=>'atilde',228=>'adieresis',229=>'aring',230=>'ae',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'igrave',237=>'iacute',238=>'icircumflex',239=>'idieresis',240=>'eth',241=>'ntilde',242=>'ograve',243=>'oacute',244=>'ocircumflex',245=>'otilde',246=>'odieresis',247=>'divide',248=>'oslash',249=>'ugrave',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'yacute',254=>'thorn',255=>'ydieresis'),
+
+// encoding map for: iso-8859-16
+'iso-8859-16' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'Aogonek',162=>'aogonek',163=>'Lslash',164=>'Euro',165=>'quotedblbase',166=>'Scaron',167=>'section',168=>'scaron',169=>'copyright',170=>'Scommaaccent',171=>'guillemotleft',172=>'Zacute',173=>'hyphen',174=>'zacute',175=>'Zdotaccent',176=>'degree',177=>'plusminus',178=>'Ccaron',179=>'lslash',180=>'Zcaron',181=>'quotedblright',182=>'paragraph',183=>'periodcentered',184=>'zcaron',185=>'ccaron',186=>'scommaaccent',187=>'guillemotright',188=>'OE',189=>'oe',190=>'Ydieresis',191=>'zdotaccent',192=>'Agrave',193=>'Aacute',194=>'Acircumflex',195=>'Abreve',196=>'Adieresis',197=>'Cacute',198=>'AE',199=>'Ccedilla',200=>'Egrave',201=>'Eacute',202=>'Ecircumflex',203=>'Edieresis',204=>'Igrave',205=>'Iacute',206=>'Icircumflex',207=>'Idieresis',208=>'Dcroat',209=>'Nacute',210=>'Ograve',211=>'Oacute',212=>'Ocircumflex',213=>'Ohungarumlaut',214=>'Odieresis',215=>'Sacute',216=>'Uhungarumlaut',217=>'Ugrave',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Eogonek',222=>'Tcommaaccent',223=>'germandbls',224=>'agrave',225=>'aacute',226=>'acircumflex',227=>'abreve',228=>'adieresis',229=>'cacute',230=>'ae',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'igrave',237=>'iacute',238=>'icircumflex',239=>'idieresis',240=>'dcroat',241=>'nacute',242=>'ograve',243=>'oacute',244=>'ocircumflex',245=>'ohungarumlaut',246=>'odieresis',247=>'sacute',248=>'uhungarumlaut',249=>'ugrave',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'eogonek',254=>'tcommaaccent',255=>'ydieresis'),
+
+// encoding map for: koi8-r
+'koi8-r' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'SF100000',129=>'SF110000',130=>'SF010000',131=>'SF030000',132=>'SF020000',133=>'SF040000',134=>'SF080000',135=>'SF090000',136=>'SF060000',137=>'SF070000',138=>'SF050000',139=>'upblock',140=>'dnblock',141=>'block',142=>'lfblock',143=>'rtblock',144=>'ltshade',145=>'shade',146=>'dkshade',147=>'integraltp',148=>'filledbox',149=>'periodcentered',150=>'radical',151=>'approxequal',152=>'lessequal',153=>'greaterequal',154=>'space',155=>'integralbt',156=>'degree',157=>'twosuperior',158=>'periodcentered',159=>'divide',160=>'SF430000',161=>'SF240000',162=>'SF510000',163=>'afii10071',164=>'SF520000',165=>'SF390000',166=>'SF220000',167=>'SF210000',168=>'SF250000',169=>'SF500000',170=>'SF490000',171=>'SF380000',172=>'SF280000',173=>'SF270000',174=>'SF260000',175=>'SF360000',176=>'SF370000',177=>'SF420000',178=>'SF190000',179=>'afii10023',180=>'SF200000',181=>'SF230000',182=>'SF470000',183=>'SF480000',184=>'SF410000',185=>'SF450000',186=>'SF460000',187=>'SF400000',188=>'SF540000',189=>'SF530000',190=>'SF440000',191=>'copyright',192=>'afii10096',193=>'afii10065',194=>'afii10066',195=>'afii10088',196=>'afii10069',197=>'afii10070',198=>'afii10086',199=>'afii10068',200=>'afii10087',201=>'afii10074',202=>'afii10075',203=>'afii10076',204=>'afii10077',205=>'afii10078',206=>'afii10079',207=>'afii10080',208=>'afii10081',209=>'afii10097',210=>'afii10082',211=>'afii10083',212=>'afii10084',213=>'afii10085',214=>'afii10072',215=>'afii10067',216=>'afii10094',217=>'afii10093',218=>'afii10073',219=>'afii10090',220=>'afii10095',221=>'afii10091',222=>'afii10089',223=>'afii10092',224=>'afii10048',225=>'afii10017',226=>'afii10018',227=>'afii10040',228=>'afii10021',229=>'afii10022',230=>'afii10038',231=>'afii10020',232=>'afii10039',233=>'afii10026',234=>'afii10027',235=>'afii10028',236=>'afii10029',237=>'afii10030',238=>'afii10031',239=>'afii10032',240=>'afii10033',241=>'afii10049',242=>'afii10034',243=>'afii10035',244=>'afii10036',245=>'afii10037',246=>'afii10024',247=>'afii10019',248=>'afii10046',249=>'afii10045',250=>'afii10025',251=>'afii10042',252=>'afii10047',253=>'afii10043',254=>'afii10041',255=>'afii10044'),
+
+// encoding map for: koi8-u
+'koi8-u' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'SF100000',129=>'SF110000',130=>'SF010000',131=>'SF030000',132=>'SF020000',133=>'SF040000',134=>'SF080000',135=>'SF090000',136=>'SF060000',137=>'SF070000',138=>'SF050000',139=>'upblock',140=>'dnblock',141=>'block',142=>'lfblock',143=>'rtblock',144=>'ltshade',145=>'shade',146=>'dkshade',147=>'integraltp',148=>'filledbox',149=>'bullet',150=>'radical',151=>'approxequal',152=>'lessequal',153=>'greaterequal',154=>'space',155=>'integralbt',156=>'degree',157=>'twosuperior',158=>'periodcentered',159=>'divide',160=>'SF430000',161=>'SF240000',162=>'SF510000',163=>'afii10071',164=>'afii10101',165=>'SF390000',166=>'afii10103',167=>'afii10104',168=>'SF250000',169=>'SF500000',170=>'SF490000',171=>'SF380000',172=>'SF280000',173=>'afii10098',174=>'SF260000',175=>'SF360000',176=>'SF370000',177=>'SF420000',178=>'SF190000',179=>'afii10023',180=>'afii10053',181=>'SF230000',182=>'afii10055',183=>'afii10056',184=>'SF410000',185=>'SF450000',186=>'SF460000',187=>'SF400000',188=>'SF540000',189=>'afii10050',190=>'SF440000',191=>'copyright',192=>'afii10096',193=>'afii10065',194=>'afii10066',195=>'afii10088',196=>'afii10069',197=>'afii10070',198=>'afii10086',199=>'afii10068',200=>'afii10087',201=>'afii10074',202=>'afii10075',203=>'afii10076',204=>'afii10077',205=>'afii10078',206=>'afii10079',207=>'afii10080',208=>'afii10081',209=>'afii10097',210=>'afii10082',211=>'afii10083',212=>'afii10084',213=>'afii10085',214=>'afii10072',215=>'afii10067',216=>'afii10094',217=>'afii10093',218=>'afii10073',219=>'afii10090',220=>'afii10095',221=>'afii10091',222=>'afii10089',223=>'afii10092',224=>'afii10048',225=>'afii10017',226=>'afii10018',227=>'afii10040',228=>'afii10021',229=>'afii10022',230=>'afii10038',231=>'afii10020',232=>'afii10039',233=>'afii10026',234=>'afii10027',235=>'afii10028',236=>'afii10029',237=>'afii10030',238=>'afii10031',239=>'afii10032',240=>'afii10033',241=>'afii10049',242=>'afii10034',243=>'afii10035',244=>'afii10036',245=>'afii10037',246=>'afii10024',247=>'afii10019',248=>'afii10046',249=>'afii10045',250=>'afii10025',251=>'afii10042',252=>'afii10047',253=>'afii10043',254=>'afii10041',255=>'afii10044'),
+
+// encoding map for: symbol
+'symbol' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'universal',35=>'numbersign',36=>'existential',37=>'percent',38=>'ampersand',39=>'suchthat',40=>'parenleft',41=>'parenright',42=>'asteriskmath',43=>'plus',44=>'comma',45=>'minus',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'congruent',65=>'Alpha',66=>'Beta',67=>'Chi',68=>'Delta',69=>'Epsilon',70=>'Phi',71=>'Gamma',72=>'Eta',73=>'Iota',74=>'theta1',75=>'Kappa',76=>'Lambda',77=>'Mu',78=>'Nu',79=>'Omicron',80=>'Pi',81=>'Theta',82=>'Rho',83=>'Sigma',84=>'Tau',85=>'Upsilon',86=>'sigma1',87=>'Omega',88=>'Xi',89=>'Psi',90=>'Zeta',91=>'bracketleft',92=>'therefore',93=>'bracketright',94=>'perpendicular',95=>'underscore',96=>'radicalex',97=>'alpha',98=>'beta',99=>'chi',100=>'delta',101=>'epsilon',102=>'phi',103=>'gamma',104=>'eta',105=>'iota',106=>'phi1',107=>'kappa',108=>'lambda',109=>'mu',110=>'nu',111=>'omicron',112=>'pi',113=>'theta',114=>'rho',115=>'sigma',116=>'tau',117=>'upsilon',118=>'omega1',119=>'omega',120=>'xi',121=>'psi',122=>'zeta',123=>'braceleft',124=>'bar',125=>'braceright',126=>'similar',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'Euro',161=>'Upsilon1',162=>'minute',163=>'lessequal',164=>'fraction',165=>'infinity',166=>'florin',167=>'club',168=>'diamond',169=>'heart',170=>'spade',171=>'arrowboth',172=>'arrowleft',173=>'arrowup',174=>'arrowright',175=>'arrowdown',176=>'degree',177=>'plusminus',178=>'second',179=>'greaterequal',180=>'multiply',181=>'proportional',182=>'partialdiff',183=>'bullet',184=>'divide',185=>'notequal',186=>'equivalence',187=>'approxequal',188=>'ellipsis',189=>'arrowvertex',190=>'arrowhorizex',191=>'carriagereturn',192=>'aleph',193=>'Ifraktur',194=>'Rfraktur',195=>'weierstrass',196=>'circlemultiply',197=>'circleplus',198=>'emptyset',199=>'intersection',200=>'union',201=>'propersuperset',202=>'reflexsuperset',203=>'notsubset',204=>'propersubset',205=>'reflexsubset',206=>'element',207=>'notelement',208=>'angle',209=>'gradient',210=>'registerserif',211=>'copyrightserif',212=>'trademarkserif',213=>'product',214=>'radical',215=>'dotmath',216=>'logicalnot',217=>'logicaland',218=>'logicalor',219=>'arrowdblboth',220=>'arrowdblleft',221=>'arrowdblup',222=>'arrowdblright',223=>'arrowdbldown',224=>'lozenge',225=>'angleleft',226=>'registersans',227=>'copyrightsans',228=>'trademarksans',229=>'summation',230=>'parenlefttp',231=>'parenleftex',232=>'parenleftbt',233=>'bracketlefttp',234=>'bracketleftex',235=>'bracketleftbt',236=>'bracelefttp',237=>'braceleftmid',238=>'braceleftbt',239=>'braceex',240=>'.notdef',241=>'angleright',242=>'integral',243=>'integraltp',244=>'integralex',245=>'integralbt',246=>'parenrighttp',247=>'parenrightex',248=>'parenrightbt',249=>'bracketrighttp',250=>'bracketrightex',251=>'bracketrightbt',252=>'bracerighttp',253=>'bracerightmid',254=>'bracerightbt',255=>'.notdef',1226=>'registered',1227=>'copyright',1228=>'trademark')
+
+); // end of encoding maps
+
+/**
+ * ToUnicode map for Identity-H stream
+ * @public static
+ */
+public static $uni_identity_h = "/CIDInit /ProcSet findresource begin\n12 dict begin\nbegincmap\n/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def\n/CMapName /Adobe-Identity-UCS def\n/CMapType 2 def\n/WMode 0 def\n1 begincodespacerange\n<0000> <FFFF>\nendcodespacerange\n100 beginbfrange\n<0000> <00ff> <0000>\n<0100> <01ff> <0100>\n<0200> <02ff> <0200>\n<0300> <03ff> <0300>\n<0400> <04ff> <0400>\n<0500> <05ff> <0500>\n<0600> <06ff> <0600>\n<0700> <07ff> <0700>\n<0800> <08ff> <0800>\n<0900> <09ff> <0900>\n<0a00> <0aff> <0a00>\n<0b00> <0bff> <0b00>\n<0c00> <0cff> <0c00>\n<0d00> <0dff> <0d00>\n<0e00> <0eff> <0e00>\n<0f00> <0fff> <0f00>\n<1000> <10ff> <1000>\n<1100> <11ff> <1100>\n<1200> <12ff> <1200>\n<1300> <13ff> <1300>\n<1400> <14ff> <1400>\n<1500> <15ff> <1500>\n<1600> <16ff> <1600>\n<1700> <17ff> <1700>\n<1800> <18ff> <1800>\n<1900> <19ff> <1900>\n<1a00> <1aff> <1a00>\n<1b00> <1bff> <1b00>\n<1c00> <1cff> <1c00>\n<1d00> <1dff> <1d00>\n<1e00> <1eff> <1e00>\n<1f00> <1fff> <1f00>\n<2000> <20ff> <2000>\n<2100> <21ff> <2100>\n<2200> <22ff> <2200>\n<2300> <23ff> <2300>\n<2400> <24ff> <2400>\n<2500> <25ff> <2500>\n<2600> <26ff> <2600>\n<2700> <27ff> <2700>\n<2800> <28ff> <2800>\n<2900> <29ff> <2900>\n<2a00> <2aff> <2a00>\n<2b00> <2bff> <2b00>\n<2c00> <2cff> <2c00>\n<2d00> <2dff> <2d00>\n<2e00> <2eff> <2e00>\n<2f00> <2fff> <2f00>\n<3000> <30ff> <3000>\n<3100> <31ff> <3100>\n<3200> <32ff> <3200>\n<3300> <33ff> <3300>\n<3400> <34ff> <3400>\n<3500> <35ff> <3500>\n<3600> <36ff> <3600>\n<3700> <37ff> <3700>\n<3800> <38ff> <3800>\n<3900> <39ff> <3900>\n<3a00> <3aff> <3a00>\n<3b00> <3bff> <3b00>\n<3c00> <3cff> <3c00>\n<3d00> <3dff> <3d00>\n<3e00> <3eff> <3e00>\n<3f00> <3fff> <3f00>\n<4000> <40ff> <4000>\n<4100> <41ff> <4100>\n<4200> <42ff> <4200>\n<4300> <43ff> <4300>\n<4400> <44ff> <4400>\n<4500> <45ff> <4500>\n<4600> <46ff> <4600>\n<4700> <47ff> <4700>\n<4800> <48ff> <4800>\n<4900> <49ff> <4900>\n<4a00> <4aff> <4a00>\n<4b00> <4bff> <4b00>\n<4c00> <4cff> <4c00>\n<4d00> <4dff> <4d00>\n<4e00> <4eff> <4e00>\n<4f00> <4fff> <4f00>\n<5000> <50ff> <5000>\n<5100> <51ff> <5100>\n<5200> <52ff> <5200>\n<5300> <53ff> <5300>\n<5400> <54ff> <5400>\n<5500> <55ff> <5500>\n<5600> <56ff> <5600>\n<5700> <57ff> <5700>\n<5800> <58ff> <5800>\n<5900> <59ff> <5900>\n<5a00> <5aff> <5a00>\n<5b00> <5bff> <5b00>\n<5c00> <5cff> <5c00>\n<5d00> <5dff> <5d00>\n<5e00> <5eff> <5e00>\n<5f00> <5fff> <5f00>\n<6000> <60ff> <6000>\n<6100> <61ff> <6100>\n<6200> <62ff> <6200>\n<6300> <63ff> <6300>\nendbfrange\n100 beginbfrange\n<6400> <64ff> <6400>\n<6500> <65ff> <6500>\n<6600> <66ff> <6600>\n<6700> <67ff> <6700>\n<6800> <68ff> <6800>\n<6900> <69ff> <6900>\n<6a00> <6aff> <6a00>\n<6b00> <6bff> <6b00>\n<6c00> <6cff> <6c00>\n<6d00> <6dff> <6d00>\n<6e00> <6eff> <6e00>\n<6f00> <6fff> <6f00>\n<7000> <70ff> <7000>\n<7100> <71ff> <7100>\n<7200> <72ff> <7200>\n<7300> <73ff> <7300>\n<7400> <74ff> <7400>\n<7500> <75ff> <7500>\n<7600> <76ff> <7600>\n<7700> <77ff> <7700>\n<7800> <78ff> <7800>\n<7900> <79ff> <7900>\n<7a00> <7aff> <7a00>\n<7b00> <7bff> <7b00>\n<7c00> <7cff> <7c00>\n<7d00> <7dff> <7d00>\n<7e00> <7eff> <7e00>\n<7f00> <7fff> <7f00>\n<8000> <80ff> <8000>\n<8100> <81ff> <8100>\n<8200> <82ff> <8200>\n<8300> <83ff> <8300>\n<8400> <84ff> <8400>\n<8500> <85ff> <8500>\n<8600> <86ff> <8600>\n<8700> <87ff> <8700>\n<8800> <88ff> <8800>\n<8900> <89ff> <8900>\n<8a00> <8aff> <8a00>\n<8b00> <8bff> <8b00>\n<8c00> <8cff> <8c00>\n<8d00> <8dff> <8d00>\n<8e00> <8eff> <8e00>\n<8f00> <8fff> <8f00>\n<9000> <90ff> <9000>\n<9100> <91ff> <9100>\n<9200> <92ff> <9200>\n<9300> <93ff> <9300>\n<9400> <94ff> <9400>\n<9500> <95ff> <9500>\n<9600> <96ff> <9600>\n<9700> <97ff> <9700>\n<9800> <98ff> <9800>\n<9900> <99ff> <9900>\n<9a00> <9aff> <9a00>\n<9b00> <9bff> <9b00>\n<9c00> <9cff> <9c00>\n<9d00> <9dff> <9d00>\n<9e00> <9eff> <9e00>\n<9f00> <9fff> <9f00>\n<a000> <a0ff> <a000>\n<a100> <a1ff> <a100>\n<a200> <a2ff> <a200>\n<a300> <a3ff> <a300>\n<a400> <a4ff> <a400>\n<a500> <a5ff> <a500>\n<a600> <a6ff> <a600>\n<a700> <a7ff> <a700>\n<a800> <a8ff> <a800>\n<a900> <a9ff> <a900>\n<aa00> <aaff> <aa00>\n<ab00> <abff> <ab00>\n<ac00> <acff> <ac00>\n<ad00> <adff> <ad00>\n<ae00> <aeff> <ae00>\n<af00> <afff> <af00>\n<b000> <b0ff> <b000>\n<b100> <b1ff> <b100>\n<b200> <b2ff> <b200>\n<b300> <b3ff> <b300>\n<b400> <b4ff> <b400>\n<b500> <b5ff> <b500>\n<b600> <b6ff> <b600>\n<b700> <b7ff> <b700>\n<b800> <b8ff> <b800>\n<b900> <b9ff> <b900>\n<ba00> <baff> <ba00>\n<bb00> <bbff> <bb00>\n<bc00> <bcff> <bc00>\n<bd00> <bdff> <bd00>\n<be00> <beff> <be00>\n<bf00> <bfff> <bf00>\n<c000> <c0ff> <c000>\n<c100> <c1ff> <c100>\n<c200> <c2ff> <c200>\n<c300> <c3ff> <c300>\n<c400> <c4ff> <c400>\n<c500> <c5ff> <c500>\n<c600> <c6ff> <c600>\n<c700> <c7ff> <c700>\nendbfrange\n56 beginbfrange\n<c800> <c8ff> <c800>\n<c900> <c9ff> <c900>\n<ca00> <caff> <ca00>\n<cb00> <cbff> <cb00>\n<cc00> <ccff> <cc00>\n<cd00> <cdff> <cd00>\n<ce00> <ceff> <ce00>\n<cf00> <cfff> <cf00>\n<d000> <d0ff> <d000>\n<d100> <d1ff> <d100>\n<d200> <d2ff> <d200>\n<d300> <d3ff> <d300>\n<d400> <d4ff> <d400>\n<d500> <d5ff> <d500>\n<d600> <d6ff> <d600>\n<d700> <d7ff> <d700>\n<d800> <d8ff> <d800>\n<d900> <d9ff> <d900>\n<da00> <daff> <da00>\n<db00> <dbff> <db00>\n<dc00> <dcff> <dc00>\n<dd00> <ddff> <dd00>\n<de00> <deff> <de00>\n<df00> <dfff> <df00>\n<e000> <e0ff> <e000>\n<e100> <e1ff> <e100>\n<e200> <e2ff> <e200>\n<e300> <e3ff> <e300>\n<e400> <e4ff> <e400>\n<e500> <e5ff> <e500>\n<e600> <e6ff> <e600>\n<e700> <e7ff> <e700>\n<e800> <e8ff> <e800>\n<e900> <e9ff> <e900>\n<ea00> <eaff> <ea00>\n<eb00> <ebff> <eb00>\n<ec00> <ecff> <ec00>\n<ed00> <edff> <ed00>\n<ee00> <eeff> <ee00>\n<ef00> <efff> <ef00>\n<f000> <f0ff> <f000>\n<f100> <f1ff> <f100>\n<f200> <f2ff> <f200>\n<f300> <f3ff> <f300>\n<f400> <f4ff> <f400>\n<f500> <f5ff> <f500>\n<f600> <f6ff> <f600>\n<f700> <f7ff> <f700>\n<f800> <f8ff> <f800>\n<f900> <f9ff> <f900>\n<fa00> <faff> <fa00>\n<fb00> <fbff> <fb00>\n<fc00> <fcff> <fc00>\n<fd00> <fdff> <fd00>\n<fe00> <feff> <fe00>\n<ff00> <ffff> <ff00>\nendbfrange\nendcmap\nCMapName currentdict /CMap defineresource pop\nend\nend";
+
+} // END OF TCPDF_FONT_DATA CLASS
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_fonts.php b/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_fonts.php
new file mode 100644
index 00000000..53f4eb5d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_fonts.php
@@ -0,0 +1,2562 @@
+<?php
+//============================================================+
+// File name   : tcpdf_fonts.php
+// Version     : 1.0.009
+// Begin       : 2008-01-01
+// Last Update : 2013-09-04
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2008-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description :Font methods for TCPDF library.
+//
+//============================================================+
+
+/**
+ * @file
+ * Unicode data and font methods for TCPDF library.
+ * @author Nicola Asuni
+ * @package com.tecnick.tcpdf
+ */
+
+/**
+ * @class TCPDF_FONTS
+ * Font methods for TCPDF library.
+ * @package com.tecnick.tcpdf
+ * @version 1.0.009
+ * @author Nicola Asuni - info@tecnick.com
+ */
+class TCPDF_FONTS {
+
+	/**
+	 * Convert and add the selected TrueType or Type1 font to the fonts folder (that must be writeable).
+	 * @param $fontfile (string) Font file (full path).
+	 * @param $fonttype (string) Font type. Leave empty for autodetect mode. Valid values are: TrueTypeUnicode, TrueType, Type1, CID0JP = CID-0 Japanese, CID0KR = CID-0 Korean, CID0CS = CID-0 Chinese Simplified, CID0CT = CID-0 Chinese Traditional.
+	 * @param $enc (string) Name of the encoding table to use. Leave empty for default mode. Omit this parameter for TrueType Unicode and symbolic fonts like Symbol or ZapfDingBats.
+	 * @param $flags (int) Unsigned 32-bit integer containing flags specifying various characteristics of the font (PDF32000:2008 - 9.8.2 Font Descriptor Flags): +1 for fixed font; +4 for symbol or +32 for non-symbol; +64 for italic. Fixed and Italic mode are generally autodetected so you have to set it to 32 = non-symbolic font (default) or 4 = symbolic font.
+	 * @param $outpath (string) Output path for generated font files (must be writeable by the web server). Leave empty for default font folder.
+	 * @param $platid (int) Platform ID for CMAP table to extract (when building a Unicode font for Windows this value should be 3, for Macintosh should be 1).
+	 * @param $encid (int) Encoding ID for CMAP table to extract (when building a Unicode font for Windows this value should be 1, for Macintosh should be 0). When Platform ID is 3, legal values for Encoding ID are: 0=Symbol, 1=Unicode, 2=ShiftJIS, 3=PRC, 4=Big5, 5=Wansung, 6=Johab, 7=Reserved, 8=Reserved, 9=Reserved, 10=UCS-4.
+	 * @param $addcbbox (boolean) If true includes the character bounding box information on the php font file.
+	 * @param $link (boolean) If true link to system font instead of copying the font data (not transportable) - Note: do not work with Type1 fonts.
+	 * @return (string) TCPDF font name or boolean false in case of error.
+	 * @author Nicola Asuni
+	 * @since 5.9.123 (2010-09-30)
+	 * @public static
+	 */
+	public static function addTTFfont($fontfile, $fonttype='', $enc='', $flags=32, $outpath='', $platid=3, $encid=1, $addcbbox=false, $link=false) {
+		if (!file_exists($fontfile)) {
+			// Could not find file
+			return false;
+		}
+		// font metrics
+		$fmetric = array();
+		// build new font name for TCPDF compatibility
+		$font_path_parts = pathinfo($fontfile);
+		if (!isset($font_path_parts['filename'])) {
+			$font_path_parts['filename'] = substr($font_path_parts['basename'], 0, -(strlen($font_path_parts['extension']) + 1));
+		}
+		$font_name = strtolower($font_path_parts['filename']);
+		$font_name = preg_replace('/[^a-z0-9_]/', '', $font_name);
+		$search  = array('bold', 'oblique', 'italic', 'regular');
+		$replace = array('b', 'i', 'i', '');
+		$font_name = str_replace($search, $replace, $font_name);
+		if (empty($font_name)) {
+			// set generic name
+			$font_name = 'tcpdffont';
+		}
+		// set output path
+		if (empty($outpath)) {
+			$outpath = self::_getfontpath();
+		}
+		// check if this font already exist
+		if (@file_exists($outpath.$font_name.'.php')) {
+			// this font already exist (delete it from fonts folder to rebuild it)
+			return $font_name;
+		}
+		$fmetric['file'] = $font_name;
+		$fmetric['ctg'] = $font_name.'.ctg.z';
+		// get font data
+		$font = file_get_contents($fontfile);
+		$fmetric['originalsize'] = strlen($font);
+		// autodetect font type
+		if (empty($fonttype)) {
+			if (TCPDF_STATIC::_getULONG($font, 0) == 0x10000) {
+				// True Type (Unicode or not)
+				$fonttype = 'TrueTypeUnicode';
+			} elseif (substr($font, 0, 4) == 'OTTO') {
+				// Open Type (Unicode or not)
+				//Unsupported font format: OpenType with CFF data
+				return false;
+			} else {
+				// Type 1
+				$fonttype = 'Type1';
+			}
+		}
+		// set font type
+		switch ($fonttype) {
+			case 'CID0CT':
+			case 'CID0CS':
+			case 'CID0KR':
+			case 'CID0JP': {
+				$fmetric['type'] = 'cidfont0';
+				break;
+			}
+			case 'Type1': {
+				$fmetric['type'] = 'Type1';
+				if (empty($enc) AND (($flags & 4) == 0)) {
+					$enc = 'cp1252';
+				}
+				break;
+			}
+			case 'TrueType': {
+				$fmetric['type'] = 'TrueType';
+				break;
+			}
+			case 'TrueTypeUnicode':
+			default: {
+				$fmetric['type'] = 'TrueTypeUnicode';
+				break;
+			}
+		}
+		// set encoding maps (if any)
+		$fmetric['enc'] = preg_replace('/[^A-Za-z0-9_\-]/', '', $enc);
+		$fmetric['diff'] = '';
+		if (($fmetric['type'] == 'TrueType') OR ($fmetric['type'] == 'Type1')) {
+			if (!empty($enc) AND ($enc != 'cp1252') AND isset(TCPDF_FONT_DATA::$encmap[$enc])) {
+				// build differences from reference encoding
+				$enc_ref = TCPDF_FONT_DATA::$encmap['cp1252'];
+				$enc_target = TCPDF_FONT_DATA::$encmap[$enc];
+				$last = 0;
+				for ($i = 32; $i <= 255; ++$i) {
+					if ($enc_target != $enc_ref[$i]) {
+						if ($i != ($last + 1)) {
+							$fmetric['diff'] .= $i.' ';
+						}
+						$last = $i;
+						$fmetric['diff'] .= '/'.$enc_target[$i].' ';
+					}
+				}
+			}
+		}
+		// parse the font by type
+		if ($fmetric['type'] == 'Type1') {
+			// ---------- TYPE 1 ----------
+			// read first segment
+			$a = unpack('Cmarker/Ctype/Vsize', substr($font, 0, 6));
+			if ($a['marker'] != 128) {
+				// Font file is not a valid binary Type1
+				return false;
+			}
+			$fmetric['size1'] = $a['size'];
+			$data = substr($font, 6, $fmetric['size1']);
+			// read second segment
+			$a = unpack('Cmarker/Ctype/Vsize', substr($font, (6 + $fmetric['size1']), 6));
+			if ($a['marker'] != 128) {
+				// Font file is not a valid binary Type1
+				return false;
+			}
+			$fmetric['size2'] = $a['size'];
+			$encrypted = substr($font, (12 + $fmetric['size1']), $fmetric['size2']);
+			$data .= $encrypted;
+			// store compressed font
+			$fmetric['file'] .= '.z';
+			$fp = fopen($outpath.$fmetric['file'], 'wb');
+			fwrite($fp, gzcompress($data));
+			fclose($fp);
+			// get font info
+			$fmetric['Flags'] = $flags;
+			preg_match ('#/FullName[\s]*\(([^\)]*)#', $font, $matches);
+			$fmetric['name'] = preg_replace('/[^a-zA-Z0-9_\-]/', '', $matches[1]);
+			preg_match('#/FontBBox[\s]*{([^}]*)#', $font, $matches);
+			$fmetric['bbox'] = trim($matches[1]);
+			$bv = explode(' ', $fmetric['bbox']);
+			$fmetric['Ascent'] = intval($bv[3]);
+			$fmetric['Descent'] = intval($bv[1]);
+			preg_match('#/ItalicAngle[\s]*([0-9\+\-]*)#', $font, $matches);
+			$fmetric['italicAngle'] = intval($matches[1]);
+			if ($fmetric['italicAngle'] != 0) {
+				$fmetric['Flags'] |= 64;
+			}
+			preg_match('#/UnderlinePosition[\s]*([0-9\+\-]*)#', $font, $matches);
+			$fmetric['underlinePosition'] = intval($matches[1]);
+			preg_match('#/UnderlineThickness[\s]*([0-9\+\-]*)#', $font, $matches);
+			$fmetric['underlineThickness'] = intval($matches[1]);
+			preg_match('#/isFixedPitch[\s]*([^\s]*)#', $font, $matches);
+			if ($matches[1] == 'true') {
+				$fmetric['Flags'] |= 1;
+			}
+			// get internal map
+			$imap = array();
+			if (preg_match_all('#dup[\s]([0-9]+)[\s]*/([^\s]*)[\s]put#sU', $font, $fmap, PREG_SET_ORDER) > 0) {
+				foreach ($fmap as $v) {
+					$imap[$v[2]] = $v[1];
+				}
+			}
+			// decrypt eexec encrypted part
+			$r = 55665; // eexec encryption constant
+			$c1 = 52845;
+			$c2 = 22719;
+			$elen = strlen($encrypted);
+			$eplain = '';
+			for ($i = 0; $i < $elen; ++$i) {
+				$chr = ord($encrypted[$i]);
+				$eplain .= chr($chr ^ ($r >> 8));
+				$r = ((($chr + $r) * $c1 + $c2) % 65536);
+			}
+			if (preg_match('#/ForceBold[\s]*([^\s]*)#', $eplain, $matches) > 0) {
+				if ($matches[1] == 'true') {
+					$fmetric['Flags'] |= 0x40000;
+				}
+			}
+			if (preg_match('#/StdVW[\s]*\[([^\]]*)#', $eplain, $matches) > 0) {
+				$fmetric['StemV'] = intval($matches[1]);
+			} else {
+				$fmetric['StemV'] = 70;
+			}
+			if (preg_match('#/StdHW[\s]*\[([^\]]*)#', $eplain, $matches) > 0) {
+				$fmetric['StemH'] = intval($matches[1]);
+			} else {
+				$fmetric['StemH'] = 30;
+			}
+			if (preg_match('#/BlueValues[\s]*\[([^\]]*)#', $eplain, $matches) > 0) {
+				$bv = explode(' ', $matches[1]);
+				if (count($bv) >= 6) {
+					$v1 = intval($bv[2]);
+					$v2 = intval($bv[4]);
+					if ($v1 <= $v2) {
+						$fmetric['XHeight'] = $v1;
+						$fmetric['CapHeight'] = $v2;
+					} else {
+						$fmetric['XHeight'] = $v2;
+						$fmetric['CapHeight'] = $v1;
+					}
+				} else {
+					$fmetric['XHeight'] = 450;
+					$fmetric['CapHeight'] = 700;
+				}
+			} else {
+				$fmetric['XHeight'] = 450;
+				$fmetric['CapHeight'] = 700;
+			}
+			// get the number of random bytes at the beginning of charstrings
+			if (preg_match('#/lenIV[\s]*([0-9]*)#', $eplain, $matches) > 0) {
+				$lenIV = intval($matches[1]);
+			} else {
+				$lenIV = 4;
+			}
+			$fmetric['Leading'] = 0;
+			// get charstring data
+			$eplain = substr($eplain, (strpos($eplain, '/CharStrings') + 1));
+			preg_match_all('#/([A-Za-z0-9\.]*)[\s][0-9]+[\s]RD[\s](.*)[\s]ND#sU', $eplain, $matches, PREG_SET_ORDER);
+			if (!empty($enc) AND isset(TCPDF_FONT_DATA::$encmap[$enc])) {
+				$enc_map = TCPDF_FONT_DATA::$encmap[$enc];
+			} else {
+				$enc_map = false;
+			}
+			$fmetric['cw'] = '';
+			$fmetric['MaxWidth'] = 0;
+			$cwidths = array();
+			foreach ($matches as $k => $v) {
+				$cid = 0;
+				if (isset($imap[$v[1]])) {
+					$cid = $imap[$v[1]];
+				} elseif ($enc_map !== false) {
+					$cid = array_search($v[1], $enc_map);
+					if ($cid === false) {
+						$cid = 0;
+					} elseif ($cid > 1000) {
+						$cid -= 1000;
+					}
+				}
+				// decrypt charstring encrypted part
+				$r = 4330; // charstring encryption constant
+				$c1 = 52845;
+				$c2 = 22719;
+				$cd = $v[2];
+				$clen = strlen($cd);
+				$ccom = array();
+				for ($i = 0; $i < $clen; ++$i) {
+					$chr = ord($cd[$i]);
+					$ccom[] = ($chr ^ ($r >> 8));
+					$r = ((($chr + $r) * $c1 + $c2) % 65536);
+				}
+				// decode numbers
+				$cdec = array();
+				$ck = 0;
+				$i = $lenIV;
+				while ($i < $clen) {
+					if ($ccom[$i] < 32) {
+						$cdec[$ck] = $ccom[$i];
+						if (($ck > 0) AND ($cdec[$ck] == 13)) {
+							// hsbw command: update width
+							$cwidths[$cid] = $cdec[($ck - 1)];
+						}
+						++$i;
+					} elseif (($ccom[$i] >= 32) AND ($ccom[$i] <= 246)) {
+						$cdec[$ck] = ($ccom[$i] - 139);
+						++$i;
+					} elseif (($ccom[$i] >= 247) AND ($ccom[$i] <= 250)) {
+						$cdec[$ck] = ((($ccom[$i] - 247) * 256) + $ccom[($i + 1)] + 108);
+						$i += 2;
+					} elseif (($ccom[$i] >= 251) AND ($ccom[$i] <= 254)) {
+						$cdec[$ck] = ((-($ccom[$i] - 251) * 256) - $ccom[($i + 1)] - 108);
+						$i += 2;
+					} elseif ($ccom[$i] == 255) {
+						$sval = chr($ccom[($i + 1)]).chr($ccom[($i + 2)]).chr($ccom[($i + 3)]).chr($ccom[($i + 4)]);
+						$vsval = unpack('li', $sval);
+						$cdec[$ck] = $vsval['i'];
+						$i += 5;
+					}
+					++$ck;
+				}
+			} // end for each matches
+			$fmetric['MissingWidth'] = $cwidths[0];
+			$fmetric['MaxWidth'] = $fmetric['MissingWidth'];
+			$fmetric['AvgWidth'] = 0;
+			// set chars widths
+			for ($cid = 0; $cid <= 255; ++$cid) {
+				if (isset($cwidths[$cid])) {
+					if ($cwidths[$cid] > $fmetric['MaxWidth']) {
+						$fmetric['MaxWidth'] = $cwidths[$cid];
+					}
+					$fmetric['AvgWidth'] += $cwidths[$cid];
+					$fmetric['cw'] .= ','.$cid.'=>'.$cwidths[$cid];
+				} else {
+					$fmetric['cw'] .= ','.$cid.'=>'.$fmetric['MissingWidth'];
+				}
+			}
+			$fmetric['AvgWidth'] = round($fmetric['AvgWidth'] / count($cwidths));
+		} else {
+			// ---------- TRUE TYPE ----------
+			if ($fmetric['type'] != 'cidfont0') {
+				if ($link) {
+					// creates a symbolic link to the existing font
+					symlink($fontfile, $outpath.$fmetric['file']);
+				} else {
+					// store compressed font
+					$fmetric['file'] .= '.z';
+					$fp = fopen($outpath.$fmetric['file'], 'wb');
+					fwrite($fp, gzcompress($font));
+					fclose($fp);
+				}
+			}
+			$offset = 0; // offset position of the font data
+			if (TCPDF_STATIC::_getULONG($font, $offset) != 0x10000) {
+				// sfnt version must be 0x00010000 for TrueType version 1.0.
+				return false;
+			}
+			$offset += 4;
+			// get number of tables
+			$numTables = TCPDF_STATIC::_getUSHORT($font, $offset);
+			$offset += 2;
+			// skip searchRange, entrySelector and rangeShift
+			$offset += 6;
+			// tables array
+			$table = array();
+			// ---------- get tables ----------
+			for ($i = 0; $i < $numTables; ++$i) {
+				// get table info
+				$tag = substr($font, $offset, 4);
+				$offset += 4;
+				$table[$tag] = array();
+				$table[$tag]['checkSum'] = TCPDF_STATIC::_getULONG($font, $offset);
+				$offset += 4;
+				$table[$tag]['offset'] = TCPDF_STATIC::_getULONG($font, $offset);
+				$offset += 4;
+				$table[$tag]['length'] = TCPDF_STATIC::_getULONG($font, $offset);
+				$offset += 4;
+			}
+			// check magicNumber
+			$offset = $table['head']['offset'] + 12;
+			if (TCPDF_STATIC::_getULONG($font, $offset) != 0x5F0F3CF5) {
+				// magicNumber must be 0x5F0F3CF5
+				return false;
+			}
+			$offset += 4;
+			$offset += 2; // skip flags
+			// get FUnits
+			$fmetric['unitsPerEm'] = TCPDF_STATIC::_getUSHORT($font, $offset);
+			$offset += 2;
+			// units ratio constant
+			$urk = (1000 / $fmetric['unitsPerEm']);
+			$offset += 16; // skip created, modified
+			$xMin = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
+			$offset += 2;
+			$yMin = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
+			$offset += 2;
+			$xMax = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
+			$offset += 2;
+			$yMax = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
+			$offset += 2;
+			$fmetric['bbox'] = ''.$xMin.' '.$yMin.' '.$xMax.' '.$yMax.'';
+			$macStyle = TCPDF_STATIC::_getUSHORT($font, $offset);
+			$offset += 2;
+			// PDF font flags
+			$fmetric['Flags'] = $flags;
+			if (($macStyle & 2) == 2) {
+				// italic flag
+				$fmetric['Flags'] |= 64;
+			}
+			// get offset mode (indexToLocFormat : 0 = short, 1 = long)
+			$offset = $table['head']['offset'] + 50;
+			$short_offset = (TCPDF_STATIC::_getSHORT($font, $offset) == 0);
+			$offset += 2;
+			// get the offsets to the locations of the glyphs in the font, relative to the beginning of the glyphData table
+			$indexToLoc = array();
+			$offset = $table['loca']['offset'];
+			if ($short_offset) {
+				// short version
+				$tot_num_glyphs = floor($table['loca']['length'] / 2); // numGlyphs + 1
+				for ($i = 0; $i < $tot_num_glyphs; ++$i) {
+					$indexToLoc[$i] = TCPDF_STATIC::_getUSHORT($font, $offset) * 2;
+					$offset += 2;
+				}
+			} else {
+				// long version
+				$tot_num_glyphs = floor($table['loca']['length'] / 4); // numGlyphs + 1
+				for ($i = 0; $i < $tot_num_glyphs; ++$i) {
+					$indexToLoc[$i] = TCPDF_STATIC::_getULONG($font, $offset);
+					$offset += 4;
+				}
+			}
+			// get glyphs indexes of chars from cmap table
+			$offset = $table['cmap']['offset'] + 2;
+			$numEncodingTables = TCPDF_STATIC::_getUSHORT($font, $offset);
+			$offset += 2;
+			$encodingTables = array();
+			for ($i = 0; $i < $numEncodingTables; ++$i) {
+				$encodingTables[$i]['platformID'] = TCPDF_STATIC::_getUSHORT($font, $offset);
+				$offset += 2;
+				$encodingTables[$i]['encodingID'] = TCPDF_STATIC::_getUSHORT($font, $offset);
+				$offset += 2;
+				$encodingTables[$i]['offset'] = TCPDF_STATIC::_getULONG($font, $offset);
+				$offset += 4;
+			}
+			// ---------- get os/2 metrics ----------
+			$offset = $table['OS/2']['offset'];
+			$offset += 2; // skip version
+			// xAvgCharWidth
+			$fmetric['AvgWidth'] = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
+			$offset += 2;
+			// usWeightClass
+			$usWeightClass = round(TCPDF_STATIC::_getUFWORD($font, $offset) * $urk);
+			// estimate StemV and StemH (400 = usWeightClass for Normal - Regular font)
+			$fmetric['StemV'] = round((70 * $usWeightClass) / 400);
+			$fmetric['StemH'] = round((30 * $usWeightClass) / 400);
+			$offset += 2;
+			$offset += 2; // usWidthClass
+			$fsType = TCPDF_STATIC::_getSHORT($font, $offset);
+			$offset += 2;
+			if ($fsType == 2) {
+				// This Font cannot be modified, embedded or exchanged in any manner without first obtaining permission of the legal owner.
+				return false;
+			}
+			// ---------- get font name ----------
+			$fmetric['name'] = '';
+			$offset = $table['name']['offset'];
+			$offset += 2; // skip Format selector (=0).
+			// Number of NameRecords that follow n.
+			$numNameRecords = TCPDF_STATIC::_getUSHORT($font, $offset);
+			$offset += 2;
+			// Offset to start of string storage (from start of table).
+			$stringStorageOffset = TCPDF_STATIC::_getUSHORT($font, $offset);
+			$offset += 2;
+			for ($i = 0; $i < $numNameRecords; ++$i) {
+				$offset += 6; // skip Platform ID, Platform-specific encoding ID, Language ID.
+				// Name ID.
+				$nameID = TCPDF_STATIC::_getUSHORT($font, $offset);
+				$offset += 2;
+				if ($nameID == 6) {
+					// String length (in bytes).
+					$stringLength = TCPDF_STATIC::_getUSHORT($font, $offset);
+					$offset += 2;
+					// String offset from start of storage area (in bytes).
+					$stringOffset = TCPDF_STATIC::_getUSHORT($font, $offset);
+					$offset += 2;
+					$offset = ($table['name']['offset'] + $stringStorageOffset + $stringOffset);
+					$fmetric['name'] = substr($font, $offset, $stringLength);
+					$fmetric['name'] = preg_replace('/[^a-zA-Z0-9_\-]/', '', $fmetric['name']);
+					break;
+				} else {
+					$offset += 4; // skip String length, String offset
+				}
+			}
+			if (empty($fmetric['name'])) {
+				$fmetric['name'] = $font_name;
+			}
+			// ---------- get post data ----------
+			$offset = $table['post']['offset'];
+			$offset += 4; // skip Format Type
+			$fmetric['italicAngle'] = TCPDF_STATIC::_getFIXED($font, $offset);
+			$offset += 4;
+			$fmetric['underlinePosition'] = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
+			$offset += 2;
+			$fmetric['underlineThickness'] = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
+			$offset += 2;
+			$isFixedPitch = (TCPDF_STATIC::_getULONG($font, $offset) == 0) ? false : true;
+			$offset += 2;
+			if ($isFixedPitch) {
+				$fmetric['Flags'] |= 1;
+			}
+			// ---------- get hhea data ----------
+			$offset = $table['hhea']['offset'];
+			$offset += 4; // skip Table version number
+			// Ascender
+			$fmetric['Ascent'] = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
+			$offset += 2;
+			// Descender
+			$fmetric['Descent'] = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
+			$offset += 2;
+			// LineGap
+			$fmetric['Leading'] = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
+			$offset += 2;
+			// advanceWidthMax
+			$fmetric['MaxWidth'] = round(TCPDF_STATIC::_getUFWORD($font, $offset) * $urk);
+			$offset += 2;
+			$offset += 22; // skip some values
+			// get the number of hMetric entries in hmtx table
+			$numberOfHMetrics = TCPDF_STATIC::_getUSHORT($font, $offset);
+			// ---------- get maxp data ----------
+			$offset = $table['maxp']['offset'];
+			$offset += 4; // skip Table version number
+			// get the the number of glyphs in the font.
+			$numGlyphs = TCPDF_STATIC::_getUSHORT($font, $offset);
+			// ---------- get CIDToGIDMap ----------
+			$ctg = array();
+			foreach ($encodingTables as $enctable) {
+				// get only specified Platform ID and Encoding ID
+				if (($enctable['platformID'] == $platid) AND ($enctable['encodingID'] == $encid)) {
+					$offset = $table['cmap']['offset'] + $enctable['offset'];
+					$format = TCPDF_STATIC::_getUSHORT($font, $offset);
+					$offset += 2;
+					switch ($format) {
+						case 0: { // Format 0: Byte encoding table
+							$offset += 4; // skip length and version/language
+							for ($c = 0; $c < 256; ++$c) {
+								$g = TCPDF_STATIC::_getBYTE($font, $offset);
+								$ctg[$c] = $g;
+								++$offset;
+							}
+							break;
+						}
+						case 2: { // Format 2: High-byte mapping through table
+							$offset += 4; // skip length and version/language
+							$numSubHeaders = 0;
+							for ($i = 0; $i < 256; ++$i) {
+								// Array that maps high bytes to subHeaders: value is subHeader index * 8.
+								$subHeaderKeys[$i] = (TCPDF_STATIC::_getUSHORT($font, $offset) / 8);
+								$offset += 2;
+								if ($numSubHeaders < $subHeaderKeys[$i]) {
+									$numSubHeaders = $subHeaderKeys[$i];
+								}
+							}
+							// the number of subHeaders is equal to the max of subHeaderKeys + 1
+							++$numSubHeaders;
+							// read subHeader structures
+							$subHeaders = array();
+							$numGlyphIndexArray = 0;
+							for ($k = 0; $k < $numSubHeaders; ++$k) {
+								$subHeaders[$k]['firstCode'] = TCPDF_STATIC::_getUSHORT($font, $offset);
+								$offset += 2;
+								$subHeaders[$k]['entryCount'] = TCPDF_STATIC::_getUSHORT($font, $offset);
+								$offset += 2;
+								$subHeaders[$k]['idDelta'] = TCPDF_STATIC::_getUSHORT($font, $offset);
+								$offset += 2;
+								$subHeaders[$k]['idRangeOffset'] = TCPDF_STATIC::_getUSHORT($font, $offset);
+								$offset += 2;
+								$subHeaders[$k]['idRangeOffset'] -= (2 + (($numSubHeaders - $k - 1) * 8));
+								$subHeaders[$k]['idRangeOffset'] /= 2;
+								$numGlyphIndexArray += $subHeaders[$k]['entryCount'];
+							}
+							for ($k = 0; $k < $numGlyphIndexArray; ++$k) {
+								$glyphIndexArray[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
+								$offset += 2;
+							}
+							for ($i = 0; $i < 256; ++$i) {
+								$k = $subHeaderKeys[$i];
+								if ($k == 0) {
+									// one byte code
+									$c = $i;
+									$g = $glyphIndexArray[0];
+									$ctg[$c] = $g;
+								} else {
+									// two bytes code
+									$start_byte = $subHeaders[$k]['firstCode'];
+									$end_byte = $start_byte + $subHeaders[$k]['entryCount'];
+									for ($j = $start_byte; $j < $end_byte; ++$j) {
+										// combine high and low bytes
+										$c = (($i << 8) + $j);
+										$idRangeOffset = ($subHeaders[$k]['idRangeOffset'] + $j - $subHeaders[$k]['firstCode']);
+										$g = ($glyphIndexArray[$idRangeOffset] + $idDelta[$k]) % 65536;
+										if ($g < 0) {
+											$g = 0;
+										}
+										$ctg[$c] = $g;
+									}
+								}
+							}
+							break;
+						}
+						case 4: { // Format 4: Segment mapping to delta values
+							$length = TCPDF_STATIC::_getUSHORT($font, $offset);
+							$offset += 2;
+							$offset += 2; // skip version/language
+							$segCount = floor(TCPDF_STATIC::_getUSHORT($font, $offset) / 2);
+							$offset += 2;
+							$offset += 6; // skip searchRange, entrySelector, rangeShift
+							$endCount = array(); // array of end character codes for each segment
+							for ($k = 0; $k < $segCount; ++$k) {
+								$endCount[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
+								$offset += 2;
+							}
+							$offset += 2; // skip reservedPad
+							$startCount = array(); // array of start character codes for each segment
+							for ($k = 0; $k < $segCount; ++$k) {
+								$startCount[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
+								$offset += 2;
+							}
+							$idDelta = array(); // delta for all character codes in segment
+							for ($k = 0; $k < $segCount; ++$k) {
+								$idDelta[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
+								$offset += 2;
+							}
+							$idRangeOffset = array(); // Offsets into glyphIdArray or 0
+							for ($k = 0; $k < $segCount; ++$k) {
+								$idRangeOffset[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
+								$offset += 2;
+							}
+							$gidlen = (floor($length / 2) - 8 - (4 * $segCount));
+							$glyphIdArray = array(); // glyph index array
+							for ($k = 0; $k < $gidlen; ++$k) {
+								$glyphIdArray[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
+								$offset += 2;
+							}
+							for ($k = 0; $k < $segCount; ++$k) {
+								for ($c = $startCount[$k]; $c <= $endCount[$k]; ++$c) {
+									if ($idRangeOffset[$k] == 0) {
+										$g = ($idDelta[$k] + $c) % 65536;
+									} else {
+										$gid = (floor($idRangeOffset[$k] / 2) + ($c - $startCount[$k]) - ($segCount - $k));
+										$g = ($glyphIdArray[$gid] + $idDelta[$k]) % 65536;
+									}
+									if ($g < 0) {
+										$g = 0;
+									}
+									$ctg[$c] = $g;
+								}
+							}
+							break;
+						}
+						case 6: { // Format 6: Trimmed table mapping
+							$offset += 4; // skip length and version/language
+							$firstCode = TCPDF_STATIC::_getUSHORT($font, $offset);
+							$offset += 2;
+							$entryCount = TCPDF_STATIC::_getUSHORT($font, $offset);
+							$offset += 2;
+							for ($k = 0; $k < $entryCount; ++$k) {
+								$c = ($k + $firstCode);
+								$g = TCPDF_STATIC::_getUSHORT($font, $offset);
+								$offset += 2;
+								$ctg[$c] = $g;
+							}
+							break;
+						}
+						case 8: { // Format 8: Mixed 16-bit and 32-bit coverage
+							$offset += 10; // skip reserved, length and version/language
+							for ($k = 0; $k < 8192; ++$k) {
+								$is32[$k] = TCPDF_STATIC::_getBYTE($font, $offset);
+								++$offset;
+							}
+							$nGroups = TCPDF_STATIC::_getULONG($font, $offset);
+							$offset += 4;
+							for ($i = 0; $i < $nGroups; ++$i) {
+								$startCharCode = TCPDF_STATIC::_getULONG($font, $offset);
+								$offset += 4;
+								$endCharCode = TCPDF_STATIC::_getULONG($font, $offset);
+								$offset += 4;
+								$startGlyphID = TCPDF_STATIC::_getULONG($font, $offset);
+								$offset += 4;
+								for ($k = $startCharCode; $k <= $endCharCode; ++$k) {
+									$is32idx = floor($c / 8);
+									if ((isset($is32[$is32idx])) AND (($is32[$is32idx] & (1 << (7 - ($c % 8)))) == 0)) {
+										$c = $k;
+									} else {
+										// 32 bit format
+										// convert to decimal (http://www.unicode.org/faq//utf_bom.html#utf16-4)
+										//LEAD_OFFSET = (0xD800 - (0x10000 >> 10)) = 55232
+										//SURROGATE_OFFSET = (0x10000 - (0xD800 << 10) - 0xDC00) = -56613888
+										$c = ((55232 + ($k >> 10)) << 10) + (0xDC00 + ($k & 0x3FF)) -56613888;
+									}
+									$ctg[$c] = 0;
+									++$startGlyphID;
+								}
+							}
+							break;
+						}
+						case 10: { // Format 10: Trimmed array
+							$offset += 10; // skip reserved, length and version/language
+							$startCharCode = TCPDF_STATIC::_getULONG($font, $offset);
+							$offset += 4;
+							$numChars = TCPDF_STATIC::_getULONG($font, $offset);
+							$offset += 4;
+							for ($k = 0; $k < $numChars; ++$k) {
+								$c = ($k + $startCharCode);
+								$g = TCPDF_STATIC::_getUSHORT($font, $offset);
+								$ctg[$c] = $g;
+								$offset += 2;
+							}
+							break;
+						}
+						case 12: { // Format 12: Segmented coverage
+							$offset += 10; // skip length and version/language
+							$nGroups = TCPDF_STATIC::_getULONG($font, $offset);
+							$offset += 4;
+							for ($k = 0; $k < $nGroups; ++$k) {
+								$startCharCode = TCPDF_STATIC::_getULONG($font, $offset);
+								$offset += 4;
+								$endCharCode = TCPDF_STATIC::_getULONG($font, $offset);
+								$offset += 4;
+								$startGlyphCode = TCPDF_STATIC::_getULONG($font, $offset);
+								$offset += 4;
+								for ($c = $startCharCode; $c <= $endCharCode; ++$c) {
+									$ctg[$c] = $startGlyphCode;
+									++$startGlyphCode;
+								}
+							}
+							break;
+						}
+						case 13: { // Format 13: Many-to-one range mappings
+							// to be implemented ...
+							break;
+						}
+						case 14: { // Format 14: Unicode Variation Sequences
+							// to be implemented ...
+							break;
+						}
+					}
+				}
+			}
+			if (!isset($ctg[0])) {
+				$ctg[0] = 0;
+			}
+			// get xHeight (height of x)
+			$offset = ($table['glyf']['offset'] + $indexToLoc[$ctg[120]] + 4);
+			$yMin = TCPDF_STATIC::_getFWORD($font, $offset);
+			$offset += 4;
+			$yMax = TCPDF_STATIC::_getFWORD($font, $offset);
+			$offset += 2;
+			$fmetric['XHeight'] = round(($yMax - $yMin) * $urk);
+			// get CapHeight (height of H)
+			$offset = ($table['glyf']['offset'] + $indexToLoc[$ctg[72]] + 4);
+			$yMin = TCPDF_STATIC::_getFWORD($font, $offset);
+			$offset += 4;
+			$yMax = TCPDF_STATIC::_getFWORD($font, $offset);
+			$offset += 2;
+			$fmetric['CapHeight'] = round(($yMax - $yMin) * $urk);
+			// ceate widths array
+			$cw = array();
+			$offset = $table['hmtx']['offset'];
+			for ($i = 0 ; $i < $numberOfHMetrics; ++$i) {
+				$cw[$i] = round(TCPDF_STATIC::_getUFWORD($font, $offset) * $urk);
+				$offset += 4; // skip lsb
+			}
+			if ($numberOfHMetrics < $numGlyphs) {
+				// fill missing widths with the last value
+				$cw = array_pad($cw, $numGlyphs, $cw[($numberOfHMetrics - 1)]);
+			}
+			$fmetric['MissingWidth'] = $cw[0];
+			$fmetric['cw'] = '';
+			for ($cid = 0; $cid <= 65535; ++$cid) {
+				if (isset($ctg[$cid])) {
+					if (isset($cw[$ctg[$cid]])) {
+						$fmetric['cw'] .= ','.$cid.'=>'.$cw[$ctg[$cid]];
+					}
+					if ($addcbbox AND isset($indexToLoc[$ctg[$cid]])) {
+						$offset = ($table['glyf']['offset'] + $indexToLoc[$ctg[$cid]]);
+						$xMin = round(TCPDF_STATIC::_getFWORD($font, $offset + 2)) * $urk;
+						$yMin = round(TCPDF_STATIC::_getFWORD($font, $offset + 4)) * $urk;
+						$xMax = round(TCPDF_STATIC::_getFWORD($font, $offset + 6)) * $urk;
+						$yMax = round(TCPDF_STATIC::_getFWORD($font, $offset + 8)) * $urk;
+						$fmetric['cbbox'] .= ','.$cid.'=>array('.$xMin.','.$yMin.','.$xMax.','.$yMax.')';
+					}
+				}
+			}
+		} // end of true type
+		if (($fmetric['type'] == 'TrueTypeUnicode') AND (count($ctg) == 256)) {
+			$fmetric['type'] == 'TrueType';
+		}
+		// ---------- create php font file ----------
+		$pfile = '<'.'?'.'php'."\n";
+		$pfile .= '// TCPDF FONT FILE DESCRIPTION'."\n";
+		$pfile .= '$type=\''.$fmetric['type'].'\';'."\n";
+		$pfile .= '$name=\''.$fmetric['name'].'\';'."\n";
+		$pfile .= '$up='.$fmetric['underlinePosition'].';'."\n";
+		$pfile .= '$ut='.$fmetric['underlineThickness'].';'."\n";
+		if ($fmetric['MissingWidth'] > 0) {
+			$pfile .= '$dw='.$fmetric['MissingWidth'].';'."\n";
+		} else {
+			$pfile .= '$dw='.$fmetric['AvgWidth'].';'."\n";
+		}
+		$pfile .= '$diff=\''.$fmetric['diff'].'\';'."\n";
+		if ($fmetric['type'] == 'Type1') {
+			// Type 1
+			$pfile .= '$enc=\''.$fmetric['enc'].'\';'."\n";
+			$pfile .= '$file=\''.$fmetric['file'].'\';'."\n";
+			$pfile .= '$size1='.$fmetric['size1'].';'."\n";
+			$pfile .= '$size2='.$fmetric['size2'].';'."\n";
+		} else {
+			$pfile .= '$originalsize='.$fmetric['originalsize'].';'."\n";
+			if ($fmetric['type'] == 'cidfont0') {
+				// CID-0
+				switch ($fonttype) {
+					case 'CID0JP': {
+						$pfile .= '// Japanese'."\n";
+						$pfile .= '$enc=\'UniJIS-UTF16-H\';'."\n";
+						$pfile .= '$cidinfo=array(\'Registry\'=>\'Adobe\', \'Ordering\'=>\'Japan1\',\'Supplement\'=>5);'."\n";
+						$pfile .= 'include(dirname(__FILE__).\'/uni2cid_aj16.php\');'."\n";
+						break;
+					}
+					case 'CID0KR': {
+						$pfile .= '// Korean'."\n";
+						$pfile .= '$enc=\'UniKS-UTF16-H\';'."\n";
+						$pfile .= '$cidinfo=array(\'Registry\'=>\'Adobe\', \'Ordering\'=>\'Korea1\',\'Supplement\'=>0);'."\n";
+						$pfile .= 'include(dirname(__FILE__).\'/uni2cid_ak12.php\');'."\n";
+						break;
+					}
+					case 'CID0CS': {
+						$pfile .= '// Chinese Simplified'."\n";
+						$pfile .= '$enc=\'UniGB-UTF16-H\';'."\n";
+						$pfile .= '$cidinfo=array(\'Registry\'=>\'Adobe\', \'Ordering\'=>\'GB1\',\'Supplement\'=>2);'."\n";
+						$pfile .= 'include(dirname(__FILE__).\'/uni2cid_ag15.php\');'."\n";
+						break;
+					}
+					case 'CID0CT':
+					default: {
+						$pfile .= '// Chinese Traditional'."\n";
+						$pfile .= '$enc=\'UniCNS-UTF16-H\';'."\n";
+						$pfile .= '$cidinfo=array(\'Registry\'=>\'Adobe\', \'Ordering\'=>\'CNS1\',\'Supplement\'=>0);'."\n";
+						$pfile .= 'include(dirname(__FILE__).\'/uni2cid_aj16.php\');'."\n";
+						break;
+					}
+				}
+			} else {
+				// TrueType
+				$pfile .= '$enc=\''.$fmetric['enc'].'\';'."\n";
+				$pfile .= '$file=\''.$fmetric['file'].'\';'."\n";
+				$pfile .= '$ctg=\''.$fmetric['ctg'].'\';'."\n";
+				// create CIDToGIDMap
+				$cidtogidmap = str_pad('', 131072, "\x00"); // (256 * 256 * 2) = 131072
+				foreach ($ctg as $cid => $gid) {
+					$cidtogidmap = self::updateCIDtoGIDmap($cidtogidmap, $cid, $ctg[$cid]);
+				}
+				// store compressed CIDToGIDMap
+				$fp = fopen($outpath.$fmetric['ctg'], 'wb');
+				fwrite($fp, gzcompress($cidtogidmap));
+				fclose($fp);
+			}
+		}
+		$pfile .= '$desc=array(';
+		$pfile .= '\'Flags\'=>'.$fmetric['Flags'].',';
+		$pfile .= '\'FontBBox\'=>\'['.$fmetric['bbox'].']\',';
+		$pfile .= '\'ItalicAngle\'=>'.$fmetric['italicAngle'].',';
+		$pfile .= '\'Ascent\'=>'.$fmetric['Ascent'].',';
+		$pfile .= '\'Descent\'=>'.$fmetric['Descent'].',';
+		$pfile .= '\'Leading\'=>'.$fmetric['Leading'].',';
+		$pfile .= '\'CapHeight\'=>'.$fmetric['CapHeight'].',';
+		$pfile .= '\'XHeight\'=>'.$fmetric['XHeight'].',';
+		$pfile .= '\'StemV\'=>'.$fmetric['StemV'].',';
+		$pfile .= '\'StemH\'=>'.$fmetric['StemH'].',';
+		$pfile .= '\'AvgWidth\'=>'.$fmetric['AvgWidth'].',';
+		$pfile .= '\'MaxWidth\'=>'.$fmetric['MaxWidth'].',';
+		$pfile .= '\'MissingWidth\'=>'.$fmetric['MissingWidth'].'';
+		$pfile .= ');'."\n";
+		if (isset($fmetric['cbbox'])) {
+			$pfile .= '$cbbox=array('.substr($fmetric['cbbox'], 1).');'."\n";
+		}
+		$pfile .= '$cw=array('.substr($fmetric['cw'], 1).');'."\n";
+		$pfile .= '// --- EOF ---'."\n";
+		// store file
+		$fp = fopen($outpath.$font_name.'.php', 'w');
+		fwrite($fp, $pfile);
+		fclose($fp);
+		// return TCPDF font name
+		return $font_name;
+	}
+
+	/**
+	 * Returs the checksum of a TTF table.
+	 * @param $table (string) table to check
+	 * @param $length (int) length of table in bytes
+	 * @return int checksum
+	 * @author Nicola Asuni
+	 * @since 5.2.000 (2010-06-02)
+	 * @public static
+	 */
+	public static function _getTTFtableChecksum($table, $length) {
+		$sum = 0;
+		$tlen = ($length / 4);
+		$offset = 0;
+		for ($i = 0; $i < $tlen; ++$i) {
+			$v = unpack('Ni', substr($table, $offset, 4));
+			$sum += $v['i'];
+			$offset += 4;
+		}
+		$sum = unpack('Ni', pack('N', $sum));
+		return $sum['i'];
+	}
+
+	/**
+	 * Returns a subset of the TrueType font data without the unused glyphs.
+	 * @param $font (string) TrueType font data.
+	 * @param $subsetchars (array) Array of used characters (the glyphs to keep).
+	 * @return (string) A subset of TrueType font data without the unused glyphs.
+	 * @author Nicola Asuni
+	 * @since 5.2.000 (2010-06-02)
+	 * @public static
+	 */
+	public static function _getTrueTypeFontSubset($font, $subsetchars) {
+		ksort($subsetchars);
+		$offset = 0; // offset position of the font data
+		if (TCPDF_STATIC::_getULONG($font, $offset) != 0x10000) {
+			// sfnt version must be 0x00010000 for TrueType version 1.0.
+			return $font;
+		}
+		$offset += 4;
+		// get number of tables
+		$numTables = TCPDF_STATIC::_getUSHORT($font, $offset);
+		$offset += 2;
+		// skip searchRange, entrySelector and rangeShift
+		$offset += 6;
+		// tables array
+		$table = array();
+		// for each table
+		for ($i = 0; $i < $numTables; ++$i) {
+			// get table info
+			$tag = substr($font, $offset, 4);
+			$offset += 4;
+			$table[$tag] = array();
+			$table[$tag]['checkSum'] = TCPDF_STATIC::_getULONG($font, $offset);
+			$offset += 4;
+			$table[$tag]['offset'] = TCPDF_STATIC::_getULONG($font, $offset);
+			$offset += 4;
+			$table[$tag]['length'] = TCPDF_STATIC::_getULONG($font, $offset);
+			$offset += 4;
+		}
+		// check magicNumber
+		$offset = $table['head']['offset'] + 12;
+		if (TCPDF_STATIC::_getULONG($font, $offset) != 0x5F0F3CF5) {
+			// magicNumber must be 0x5F0F3CF5
+			return $font;
+		}
+		$offset += 4;
+		// get offset mode (indexToLocFormat : 0 = short, 1 = long)
+		$offset = $table['head']['offset'] + 50;
+		$short_offset = (TCPDF_STATIC::_getSHORT($font, $offset) == 0);
+		$offset += 2;
+		// get the offsets to the locations of the glyphs in the font, relative to the beginning of the glyphData table
+		$indexToLoc = array();
+		$offset = $table['loca']['offset'];
+		if ($short_offset) {
+			// short version
+			$tot_num_glyphs = floor($table['loca']['length'] / 2); // numGlyphs + 1
+			for ($i = 0; $i < $tot_num_glyphs; ++$i) {
+				$indexToLoc[$i] = TCPDF_STATIC::_getUSHORT($font, $offset) * 2;
+				$offset += 2;
+			}
+		} else {
+			// long version
+			$tot_num_glyphs = ($table['loca']['length'] / 4); // numGlyphs + 1
+			for ($i = 0; $i < $tot_num_glyphs; ++$i) {
+				$indexToLoc[$i] = TCPDF_STATIC::_getULONG($font, $offset);
+				$offset += 4;
+			}
+		}
+		// get glyphs indexes of chars from cmap table
+		$subsetglyphs = array(); // glyph IDs on key
+		$subsetglyphs[0] = true; // character codes that do not correspond to any glyph in the font should be mapped to glyph index 0
+		$offset = $table['cmap']['offset'] + 2;
+		$numEncodingTables = TCPDF_STATIC::_getUSHORT($font, $offset);
+		$offset += 2;
+		$encodingTables = array();
+		for ($i = 0; $i < $numEncodingTables; ++$i) {
+			$encodingTables[$i]['platformID'] = TCPDF_STATIC::_getUSHORT($font, $offset);
+			$offset += 2;
+			$encodingTables[$i]['encodingID'] = TCPDF_STATIC::_getUSHORT($font, $offset);
+			$offset += 2;
+			$encodingTables[$i]['offset'] = TCPDF_STATIC::_getULONG($font, $offset);
+			$offset += 4;
+		}
+		foreach ($encodingTables as $enctable) {
+			// get all platforms and encodings
+			$offset = $table['cmap']['offset'] + $enctable['offset'];
+			$format = TCPDF_STATIC::_getUSHORT($font, $offset);
+			$offset += 2;
+			switch ($format) {
+				case 0: { // Format 0: Byte encoding table
+					$offset += 4; // skip length and version/language
+					for ($c = 0; $c < 256; ++$c) {
+						if (isset($subsetchars[$c])) {
+							$g = TCPDF_STATIC::_getBYTE($font, $offset);
+							$subsetglyphs[$g] = true;
+						}
+						++$offset;
+					}
+					break;
+				}
+				case 2: { // Format 2: High-byte mapping through table
+					$offset += 4; // skip length and version/language
+					$numSubHeaders = 0;
+					for ($i = 0; $i < 256; ++$i) {
+						// Array that maps high bytes to subHeaders: value is subHeader index * 8.
+						$subHeaderKeys[$i] = (TCPDF_STATIC::_getUSHORT($font, $offset) / 8);
+						$offset += 2;
+						if ($numSubHeaders < $subHeaderKeys[$i]) {
+							$numSubHeaders = $subHeaderKeys[$i];
+						}
+					}
+					// the number of subHeaders is equal to the max of subHeaderKeys + 1
+					++$numSubHeaders;
+					// read subHeader structures
+					$subHeaders = array();
+					$numGlyphIndexArray = 0;
+					for ($k = 0; $k < $numSubHeaders; ++$k) {
+						$subHeaders[$k]['firstCode'] = TCPDF_STATIC::_getUSHORT($font, $offset);
+						$offset += 2;
+						$subHeaders[$k]['entryCount'] = TCPDF_STATIC::_getUSHORT($font, $offset);
+						$offset += 2;
+						$subHeaders[$k]['idDelta'] = TCPDF_STATIC::_getUSHORT($font, $offset);
+						$offset += 2;
+						$subHeaders[$k]['idRangeOffset'] = TCPDF_STATIC::_getUSHORT($font, $offset);
+						$offset += 2;
+						$subHeaders[$k]['idRangeOffset'] -= (2 + (($numSubHeaders - $k - 1) * 8));
+						$subHeaders[$k]['idRangeOffset'] /= 2;
+						$numGlyphIndexArray += $subHeaders[$k]['entryCount'];
+					}
+					for ($k = 0; $k < $numGlyphIndexArray; ++$k) {
+						$glyphIndexArray[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
+						$offset += 2;
+					}
+					for ($i = 0; $i < 256; ++$i) {
+						$k = $subHeaderKeys[$i];
+						if ($k == 0) {
+							// one byte code
+							$c = $i;
+							if (isset($subsetchars[$c])) {
+								$g = $glyphIndexArray[0];
+								$subsetglyphs[$g] = true;
+							}
+						} else {
+							// two bytes code
+							$start_byte = $subHeaders[$k]['firstCode'];
+							$end_byte = $start_byte + $subHeaders[$k]['entryCount'];
+							for ($j = $start_byte; $j < $end_byte; ++$j) {
+								// combine high and low bytes
+								$c = (($i << 8) + $j);
+								if (isset($subsetchars[$c])) {
+									$idRangeOffset = ($subHeaders[$k]['idRangeOffset'] + $j - $subHeaders[$k]['firstCode']);
+									$g = ($glyphIndexArray[$idRangeOffset] + $idDelta[$k]) % 65536;
+									if ($g < 0) {
+										$g = 0;
+									}
+									$subsetglyphs[$g] = true;
+								}
+							}
+						}
+					}
+					break;
+				}
+				case 4: { // Format 4: Segment mapping to delta values
+					$length = TCPDF_STATIC::_getUSHORT($font, $offset);
+					$offset += 2;
+					$offset += 2; // skip version/language
+					$segCount = floor(TCPDF_STATIC::_getUSHORT($font, $offset) / 2);
+					$offset += 2;
+					$offset += 6; // skip searchRange, entrySelector, rangeShift
+					$endCount = array(); // array of end character codes for each segment
+					for ($k = 0; $k < $segCount; ++$k) {
+						$endCount[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
+						$offset += 2;
+					}
+					$offset += 2; // skip reservedPad
+					$startCount = array(); // array of start character codes for each segment
+					for ($k = 0; $k < $segCount; ++$k) {
+						$startCount[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
+						$offset += 2;
+					}
+					$idDelta = array(); // delta for all character codes in segment
+					for ($k = 0; $k < $segCount; ++$k) {
+						$idDelta[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
+						$offset += 2;
+					}
+					$idRangeOffset = array(); // Offsets into glyphIdArray or 0
+					for ($k = 0; $k < $segCount; ++$k) {
+						$idRangeOffset[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
+						$offset += 2;
+					}
+					$gidlen = (floor($length / 2) - 8 - (4 * $segCount));
+					$glyphIdArray = array(); // glyph index array
+					for ($k = 0; $k < $gidlen; ++$k) {
+						$glyphIdArray[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
+						$offset += 2;
+					}
+					for ($k = 0; $k < $segCount; ++$k) {
+						for ($c = $startCount[$k]; $c <= $endCount[$k]; ++$c) {
+							if (isset($subsetchars[$c])) {
+								if ($idRangeOffset[$k] == 0) {
+									$g = ($idDelta[$k] + $c) % 65536;
+								} else {
+									$gid = (floor($idRangeOffset[$k] / 2) + ($c - $startCount[$k]) - ($segCount - $k));
+									$g = ($glyphIdArray[$gid] + $idDelta[$k]) % 65536;
+								}
+								if ($g < 0) {
+									$g = 0;
+								}
+								$subsetglyphs[$g] = true;
+							}
+						}
+					}
+					break;
+				}
+				case 6: { // Format 6: Trimmed table mapping
+					$offset += 4; // skip length and version/language
+					$firstCode = TCPDF_STATIC::_getUSHORT($font, $offset);
+					$offset += 2;
+					$entryCount = TCPDF_STATIC::_getUSHORT($font, $offset);
+					$offset += 2;
+					for ($k = 0; $k < $entryCount; ++$k) {
+						$c = ($k + $firstCode);
+						if (isset($subsetchars[$c])) {
+							$g = TCPDF_STATIC::_getUSHORT($font, $offset);
+							$subsetglyphs[$g] = true;
+						}
+						$offset += 2;
+					}
+					break;
+				}
+				case 8: { // Format 8: Mixed 16-bit and 32-bit coverage
+					$offset += 10; // skip reserved, length and version/language
+					for ($k = 0; $k < 8192; ++$k) {
+						$is32[$k] = TCPDF_STATIC::_getBYTE($font, $offset);
+						++$offset;
+					}
+					$nGroups = TCPDF_STATIC::_getULONG($font, $offset);
+					$offset += 4;
+					for ($i = 0; $i < $nGroups; ++$i) {
+						$startCharCode = TCPDF_STATIC::_getULONG($font, $offset);
+						$offset += 4;
+						$endCharCode = TCPDF_STATIC::_getULONG($font, $offset);
+						$offset += 4;
+						$startGlyphID = TCPDF_STATIC::_getULONG($font, $offset);
+						$offset += 4;
+						for ($k = $startCharCode; $k <= $endCharCode; ++$k) {
+							$is32idx = floor($c / 8);
+							if ((isset($is32[$is32idx])) AND (($is32[$is32idx] & (1 << (7 - ($c % 8)))) == 0)) {
+								$c = $k;
+							} else {
+								// 32 bit format
+								// convert to decimal (http://www.unicode.org/faq//utf_bom.html#utf16-4)
+								//LEAD_OFFSET = (0xD800 - (0x10000 >> 10)) = 55232
+								//SURROGATE_OFFSET = (0x10000 - (0xD800 << 10) - 0xDC00) = -56613888
+								$c = ((55232 + ($k >> 10)) << 10) + (0xDC00 + ($k & 0x3FF)) -56613888;
+							}
+							if (isset($subsetchars[$c])) {
+								$subsetglyphs[$startGlyphID] = true;
+							}
+							++$startGlyphID;
+						}
+					}
+					break;
+				}
+				case 10: { // Format 10: Trimmed array
+					$offset += 10; // skip reserved, length and version/language
+					$startCharCode = TCPDF_STATIC::_getULONG($font, $offset);
+					$offset += 4;
+					$numChars = TCPDF_STATIC::_getULONG($font, $offset);
+					$offset += 4;
+					for ($k = 0; $k < $numChars; ++$k) {
+						$c = ($k + $startCharCode);
+						if (isset($subsetchars[$c])) {
+							$g = TCPDF_STATIC::_getUSHORT($font, $offset);
+							$subsetglyphs[$g] = true;
+						}
+						$offset += 2;
+					}
+					break;
+				}
+				case 12: { // Format 12: Segmented coverage
+					$offset += 10; // skip length and version/language
+					$nGroups = TCPDF_STATIC::_getULONG($font, $offset);
+					$offset += 4;
+					for ($k = 0; $k < $nGroups; ++$k) {
+						$startCharCode = TCPDF_STATIC::_getULONG($font, $offset);
+						$offset += 4;
+						$endCharCode = TCPDF_STATIC::_getULONG($font, $offset);
+						$offset += 4;
+						$startGlyphCode = TCPDF_STATIC::_getULONG($font, $offset);
+						$offset += 4;
+						for ($c = $startCharCode; $c <= $endCharCode; ++$c) {
+							if (isset($subsetchars[$c])) {
+								$subsetglyphs[$startGlyphCode] = true;
+							}
+							++$startGlyphCode;
+						}
+					}
+					break;
+				}
+				case 13: { // Format 13: Many-to-one range mappings
+					// to be implemented ...
+					break;
+				}
+				case 14: { // Format 14: Unicode Variation Sequences
+					// to be implemented ...
+					break;
+				}
+			}
+		}
+		// include all parts of composite glyphs
+		$new_sga = $subsetglyphs;
+		while (!empty($new_sga)) {
+			$sga = $new_sga;
+			$new_sga = array();
+			foreach ($sga as $key => $val) {
+				if (isset($indexToLoc[$key])) {
+					$offset = ($table['glyf']['offset'] + $indexToLoc[$key]);
+					$numberOfContours = TCPDF_STATIC::_getSHORT($font, $offset);
+					$offset += 2;
+					if ($numberOfContours < 0) { // composite glyph
+						$offset += 8; // skip xMin, yMin, xMax, yMax
+						do {
+							$flags = TCPDF_STATIC::_getUSHORT($font, $offset);
+							$offset += 2;
+							$glyphIndex = TCPDF_STATIC::_getUSHORT($font, $offset);
+							$offset += 2;
+							if (!isset($subsetglyphs[$glyphIndex])) {
+								// add missing glyphs
+								$new_sga[$glyphIndex] = true;
+							}
+							// skip some bytes by case
+							if ($flags & 1) {
+								$offset += 4;
+							} else {
+								$offset += 2;
+							}
+							if ($flags & 8) {
+								$offset += 2;
+							} elseif ($flags & 64) {
+								$offset += 4;
+							} elseif ($flags & 128) {
+								$offset += 8;
+							}
+						} while ($flags & 32);
+					}
+				}
+			}
+			$subsetglyphs += $new_sga;
+		}
+		// sort glyphs by key (and remove duplicates)
+		ksort($subsetglyphs);
+		// build new glyf and loca tables
+		$glyf = '';
+		$loca = '';
+		$offset = 0;
+		$glyf_offset = $table['glyf']['offset'];
+		for ($i = 0; $i < $tot_num_glyphs; ++$i) {
+			if (isset($subsetglyphs[$i])) {
+				$length = ($indexToLoc[($i + 1)] - $indexToLoc[$i]);
+				$glyf .= substr($font, ($glyf_offset + $indexToLoc[$i]), $length);
+			} else {
+				$length = 0;
+			}
+			if ($short_offset) {
+				$loca .= pack('n', floor($offset / 2));
+			} else {
+				$loca .= pack('N', $offset);
+			}
+			$offset += $length;
+		}
+		// array of table names to preserve (loca and glyf tables will be added later)
+		// the cmap table is not needed and shall not be present, since the mapping from character codes to glyph descriptions is provided separately
+		$table_names = array ('head', 'hhea', 'hmtx', 'maxp', 'cvt ', 'fpgm', 'prep'); // minimum required table names
+		// get the tables to preserve
+		$offset = 12;
+		foreach ($table as $tag => $val) {
+			if (in_array($tag, $table_names)) {
+				$table[$tag]['data'] = substr($font, $table[$tag]['offset'], $table[$tag]['length']);
+				if ($tag == 'head') {
+					// set the checkSumAdjustment to 0
+					$table[$tag]['data'] = substr($table[$tag]['data'], 0, 8)."\x0\x0\x0\x0".substr($table[$tag]['data'], 12);
+				}
+				$pad = 4 - ($table[$tag]['length'] % 4);
+				if ($pad != 4) {
+					// the length of a table must be a multiple of four bytes
+					$table[$tag]['length'] += $pad;
+					$table[$tag]['data'] .= str_repeat("\x0", $pad);
+				}
+				$table[$tag]['offset'] = $offset;
+				$offset += $table[$tag]['length'];
+				// check sum is not changed (so keep the following line commented)
+				//$table[$tag]['checkSum'] = self::_getTTFtableChecksum($table[$tag]['data'], $table[$tag]['length']);
+			} else {
+				unset($table[$tag]);
+			}
+		}
+		// add loca
+		$table['loca']['data'] = $loca;
+		$table['loca']['length'] = strlen($loca);
+		$pad = 4 - ($table['loca']['length'] % 4);
+		if ($pad != 4) {
+			// the length of a table must be a multiple of four bytes
+			$table['loca']['length'] += $pad;
+			$table['loca']['data'] .= str_repeat("\x0", $pad);
+		}
+		$table['loca']['offset'] = $offset;
+		$table['loca']['checkSum'] = self::_getTTFtableChecksum($table['loca']['data'], $table['loca']['length']);
+		$offset += $table['loca']['length'];
+		// add glyf
+		$table['glyf']['data'] = $glyf;
+		$table['glyf']['length'] = strlen($glyf);
+		$pad = 4 - ($table['glyf']['length'] % 4);
+		if ($pad != 4) {
+			// the length of a table must be a multiple of four bytes
+			$table['glyf']['length'] += $pad;
+			$table['glyf']['data'] .= str_repeat("\x0", $pad);
+		}
+		$table['glyf']['offset'] = $offset;
+		$table['glyf']['checkSum'] = self::_getTTFtableChecksum($table['glyf']['data'], $table['glyf']['length']);
+		// rebuild font
+		$font = '';
+		$font .= pack('N', 0x10000); // sfnt version
+		$numTables = count($table);
+		$font .= pack('n', $numTables); // numTables
+		$entrySelector = floor(log($numTables, 2));
+		$searchRange = pow(2, $entrySelector) * 16;
+		$rangeShift = ($numTables * 16) - $searchRange;
+		$font .= pack('n', $searchRange); // searchRange
+		$font .= pack('n', $entrySelector); // entrySelector
+		$font .= pack('n', $rangeShift); // rangeShift
+		$offset = ($numTables * 16);
+		foreach ($table as $tag => $data) {
+			$font .= $tag; // tag
+			$font .= pack('N', $data['checkSum']); // checkSum
+			$font .= pack('N', ($data['offset'] + $offset)); // offset
+			$font .= pack('N', $data['length']); // length
+		}
+		foreach ($table as $data) {
+			$font .= $data['data'];
+		}
+		// set checkSumAdjustment on head table
+		$checkSumAdjustment = 0xB1B0AFBA - self::_getTTFtableChecksum($font, strlen($font));
+		$font = substr($font, 0, $table['head']['offset'] + 8).pack('N', $checkSumAdjustment).substr($font, $table['head']['offset'] + 12);
+		return $font;
+	}
+
+	/**
+	 * Outputs font widths
+	 * @param $font (array) font data
+	 * @param $cidoffset (int) offset for CID values
+	 * @return PDF command string for font widths
+	 * @author Nicola Asuni
+	 * @since 4.4.000 (2008-12-07)
+	 * @public static
+	 */
+	public static function _putfontwidths($font, $cidoffset=0) {
+		ksort($font['cw']);
+		$rangeid = 0;
+		$range = array();
+		$prevcid = -2;
+		$prevwidth = -1;
+		$interval = false;
+		// for each character
+		foreach ($font['cw'] as $cid => $width) {
+			$cid -= $cidoffset;
+			if ($font['subset'] AND (!isset($font['subsetchars'][$cid]))) {
+				// ignore the unused characters (font subsetting)
+				continue;
+			}
+			if ($width != $font['dw']) {
+				if ($cid == ($prevcid + 1)) {
+					// consecutive CID
+					if ($width == $prevwidth) {
+						if ($width == $range[$rangeid][0]) {
+							$range[$rangeid][] = $width;
+						} else {
+							array_pop($range[$rangeid]);
+							// new range
+							$rangeid = $prevcid;
+							$range[$rangeid] = array();
+							$range[$rangeid][] = $prevwidth;
+							$range[$rangeid][] = $width;
+						}
+						$interval = true;
+						$range[$rangeid]['interval'] = true;
+					} else {
+						if ($interval) {
+							// new range
+							$rangeid = $cid;
+							$range[$rangeid] = array();
+							$range[$rangeid][] = $width;
+						} else {
+							$range[$rangeid][] = $width;
+						}
+						$interval = false;
+					}
+				} else {
+					// new range
+					$rangeid = $cid;
+					$range[$rangeid] = array();
+					$range[$rangeid][] = $width;
+					$interval = false;
+				}
+				$prevcid = $cid;
+				$prevwidth = $width;
+			}
+		}
+		// optimize ranges
+		$prevk = -1;
+		$nextk = -1;
+		$prevint = false;
+		foreach ($range as $k => $ws) {
+			$cws = count($ws);
+			if (($k == $nextk) AND (!$prevint) AND ((!isset($ws['interval'])) OR ($cws < 4))) {
+				if (isset($range[$k]['interval'])) {
+					unset($range[$k]['interval']);
+				}
+				$range[$prevk] = array_merge($range[$prevk], $range[$k]);
+				unset($range[$k]);
+			} else {
+				$prevk = $k;
+			}
+			$nextk = $k + $cws;
+			if (isset($ws['interval'])) {
+				if ($cws > 3) {
+					$prevint = true;
+				} else {
+					$prevint = false;
+				}
+				if (isset($range[$k]['interval'])) {
+					unset($range[$k]['interval']);
+				}
+				--$nextk;
+			} else {
+				$prevint = false;
+			}
+		}
+		// output data
+		$w = '';
+		foreach ($range as $k => $ws) {
+			if (count(array_count_values($ws)) == 1) {
+				// interval mode is more compact
+				$w .= ' '.$k.' '.($k + count($ws) - 1).' '.$ws[0];
+			} else {
+				// range mode
+				$w .= ' '.$k.' [ '.implode(' ', $ws).' ]';
+			}
+		}
+		return '/W ['.$w.' ]';
+	}
+
+	/**
+	 * Returns the unicode caracter specified by the value
+	 * @param $c (int) UTF-8 value
+	 * @param $unicode (boolean) True if we are in unicode mode, false otherwise.
+	 * @return Returns the specified character.
+	 * @since 2.3.000 (2008-03-05)
+	 * @public static
+	 */
+	public static function unichr($c, $unicode=true) {
+		if (!$unicode) {
+			return chr($c);
+		} elseif ($c <= 0x7F) {
+			// one byte
+			return chr($c);
+		} elseif ($c <= 0x7FF) {
+			// two bytes
+			return chr(0xC0 | $c >> 6).chr(0x80 | $c & 0x3F);
+		} elseif ($c <= 0xFFFF) {
+			// three bytes
+			return chr(0xE0 | $c >> 12).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
+		} elseif ($c <= 0x10FFFF) {
+			// four bytes
+			return chr(0xF0 | $c >> 18).chr(0x80 | $c >> 12 & 0x3F).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
+		} else {
+			return '';
+		}
+	}
+
+	/**
+	 * Returns the unicode caracter specified by UTF-8 value
+	 * @param $c (int) UTF-8 value
+	 * @return Returns the specified character.
+	 * @public static
+	 */
+	public static function unichrUnicode($c) {
+		return self::unichr($c, true);
+	}
+
+	/**
+	 * Returns the unicode caracter specified by ASCII value
+	 * @param $c (int) UTF-8 value
+	 * @return Returns the specified character.
+	 * @public static
+	 */
+	public static function unichrASCII($c) {
+		return self::unichr($c, false);
+	}
+
+	/**
+	 * Converts array of UTF-8 characters to UTF16-BE string.<br>
+	 * Based on: http://www.faqs.org/rfcs/rfc2781.html
+	 * <pre>
+	 *   Encoding UTF-16:
+	 *
+	 *   Encoding of a single character from an ISO 10646 character value to
+	 *    UTF-16 proceeds as follows. Let U be the character number, no greater
+	 *    than 0x10FFFF.
+	 *
+	 *    1) If U < 0x10000, encode U as a 16-bit unsigned integer and
+	 *       terminate.
+	 *
+	 *    2) Let U' = U - 0x10000. Because U is less than or equal to 0x10FFFF,
+	 *       U' must be less than or equal to 0xFFFFF. That is, U' can be
+	 *       represented in 20 bits.
+	 *
+	 *    3) Initialize two 16-bit unsigned integers, W1 and W2, to 0xD800 and
+	 *       0xDC00, respectively. These integers each have 10 bits free to
+	 *       encode the character value, for a total of 20 bits.
+	 *
+	 *    4) Assign the 10 high-order bits of the 20-bit U' to the 10 low-order
+	 *       bits of W1 and the 10 low-order bits of U' to the 10 low-order
+	 *       bits of W2. Terminate.
+	 *
+	 *    Graphically, steps 2 through 4 look like:
+	 *    U' = yyyyyyyyyyxxxxxxxxxx
+	 *    W1 = 110110yyyyyyyyyy
+	 *    W2 = 110111xxxxxxxxxx
+	 * </pre>
+	 * @param $unicode (array) array containing UTF-8 unicode values
+	 * @param $setbom (boolean) if true set the Byte Order Mark (BOM = 0xFEFF)
+	 * @return string
+	 * @protected
+	 * @author Nicola Asuni
+	 * @since 2.1.000 (2008-01-08)
+	 * @public static
+	 */
+	public static function arrUTF8ToUTF16BE($unicode, $setbom=false) {
+		$outstr = ''; // string to be returned
+		if ($setbom) {
+			$outstr .= "\xFE\xFF"; // Byte Order Mark (BOM)
+		}
+		foreach ($unicode as $char) {
+			if ($char == 0x200b) {
+				// skip Unicode Character 'ZERO WIDTH SPACE' (DEC:8203, U+200B)
+			} elseif ($char == 0xFFFD) {
+				$outstr .= "\xFF\xFD"; // replacement character
+			} elseif ($char < 0x10000) {
+				$outstr .= chr($char >> 0x08);
+				$outstr .= chr($char & 0xFF);
+			} else {
+				$char -= 0x10000;
+				$w1 = 0xD800 | ($char >> 0x0a);
+				$w2 = 0xDC00 | ($char & 0x3FF);
+				$outstr .= chr($w1 >> 0x08);
+				$outstr .= chr($w1 & 0xFF);
+				$outstr .= chr($w2 >> 0x08);
+				$outstr .= chr($w2 & 0xFF);
+			}
+		}
+		return $outstr;
+	}
+
+	/**
+	 * Convert an array of UTF8 values to array of unicode characters
+	 * @param $ta (array) The input array of UTF8 values.
+	 * @param $isunicode (boolean) True for Unicode mode, false otherwise.
+	 * @return Return array of unicode characters
+	 * @since 4.5.037 (2009-04-07)
+	 * @public static
+	 */
+	public static function UTF8ArrayToUniArray($ta, $isunicode=true) {
+		if ($isunicode) {
+			return array_map(array('self', 'unichrUnicode'), $ta);
+		}
+		return array_map(array('self', 'unichrASCII'), $ta);
+	}
+
+	/**
+	 * Extract a slice of the $strarr array and return it as string.
+	 * @param $strarr (string) The input array of characters.
+	 * @param $start (int) the starting element of $strarr.
+	 * @param $end (int) first element that will not be returned.
+	 * @param $unicode (boolean) True if we are in unicode mode, false otherwise.
+	 * @return Return part of a string
+	 * @public static
+	 */
+	public static function UTF8ArrSubString($strarr, $start='', $end='', $unicode=true) {
+		if (strlen($start) == 0) {
+			$start = 0;
+		}
+		if (strlen($end) == 0) {
+			$end = count($strarr);
+		}
+		$string = '';
+		for ($i = $start; $i < $end; ++$i) {
+			$string .= self::unichr($strarr[$i], $unicode);
+		}
+		return $string;
+	}
+
+	/**
+	 * Extract a slice of the $uniarr array and return it as string.
+	 * @param $uniarr (string) The input array of characters.
+	 * @param $start (int) the starting element of $strarr.
+	 * @param $end (int) first element that will not be returned.
+	 * @return Return part of a string
+	 * @since 4.5.037 (2009-04-07)
+	 * @public static
+	 */
+	public static function UniArrSubString($uniarr, $start='', $end='') {
+		if (strlen($start) == 0) {
+			$start = 0;
+		}
+		if (strlen($end) == 0) {
+			$end = count($uniarr);
+		}
+		$string = '';
+		for ($i=$start; $i < $end; ++$i) {
+			$string .= $uniarr[$i];
+		}
+		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<br>
+	 * @param $unicode (array) array containing UTF-8 unicode values
+	 * @return array
+	 * @author Nicola Asuni
+	 * @since 4.8.023 (2010-01-15)
+	 * @public static
+	 */
+	public static function UTF8ArrToLatin1Arr($unicode) {
+		$outarr = array(); // array to be returned
+		foreach ($unicode as $char) {
+			if ($char < 256) {
+				$outarr[] = $char;
+			} elseif (array_key_exists($char, TCPDF_FONT_DATA::$uni_utf8tolatin)) {
+				// map from UTF-8
+				$outarr[] = TCPDF_FONT_DATA::$uni_utf8tolatin[$char];
+			} elseif ($char == 0xFFFD) {
+				// skip
+			} else {
+				$outarr[] = 63; // '?' character
+			}
+		}
+		return $outarr;
+	}
+
+	/**
+	 * Converts UTF-8 characters array to array of Latin1 string<br>
+	 * @param $unicode (array) array containing UTF-8 unicode values
+	 * @return array
+	 * @author Nicola Asuni
+	 * @since 4.8.023 (2010-01-15)
+	 * @public static
+	 */
+	public static function UTF8ArrToLatin1($unicode) {
+		$outstr = ''; // string to be returned
+		foreach ($unicode as $char) {
+			if ($char < 256) {
+				$outstr .= chr($char);
+			} elseif (array_key_exists($char, TCPDF_FONT_DATA::$uni_utf8tolatin)) {
+				// map from UTF-8
+				$outstr .= chr(TCPDF_FONT_DATA::$uni_utf8tolatin[$char]);
+			} elseif ($char == 0xFFFD) {
+				// skip
+			} else {
+				$outstr .= '?';
+			}
+		}
+		return $outstr;
+	}
+
+	/**
+	 * Converts UTF-8 character to integer value.<br>
+	 * Invalid byte sequences will be replaced with 0xFFFD (replacement character)<br>
+	 * Based on: http://www.faqs.org/rfcs/rfc3629.html
+	 * <pre>
+	 *    Char. number range  |        UTF-8 octet sequence
+	 *       (hexadecimal)    |              (binary)
+	 *    --------------------+-----------------------------------------------
+	 *    0000 0000-0000 007F | 0xxxxxxx
+	 *    0000 0080-0000 07FF | 110xxxxx 10xxxxxx
+	 *    0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
+	 *    0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+	 *    ---------------------------------------------------------------------
+	 *
+	 *   ABFN notation:
+	 *   ---------------------------------------------------------------------
+	 *   UTF8-octets = *( UTF8-char )
+	 *   UTF8-char   = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4
+	 *   UTF8-1      = %x00-7F
+	 *   UTF8-2      = %xC2-DF UTF8-tail
+	 *
+	 *   UTF8-3      = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
+	 *                 %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
+	 *   UTF8-4      = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
+	 *                 %xF4 %x80-8F 2( UTF8-tail )
+	 *   UTF8-tail   = %x80-BF
+	 *   ---------------------------------------------------------------------
+	 * </pre>
+	 * @param $uch (string) character string to process.
+	 * @return integer Unicode value
+	 * @author Nicola Asuni
+	 * @public static
+	 */
+	public static function uniord($uch) {
+		if (function_exists('mb_convert_encoding')) {
+			list(, $char) = @unpack('N', mb_convert_encoding($uch, 'UCS-4BE', 'UTF-8'));
+			if ($char >= 0) {
+				return $char;
+			}
+		}
+		$bytes = array(); // array containing single character byte sequences
+		$countbytes = 0;
+		$numbytes = 1; // number of octetc needed to represent the UTF-8 character
+		$length = strlen($uch);
+		for ($i = 0; $i < $length; ++$i) {
+			$char = ord($uch[$i]); // get one string character at time
+			if ($countbytes == 0) { // get starting octect
+				if ($char <= 0x7F) {
+					return $char; // use the character "as is" because is ASCII
+				} elseif (($char >> 0x05) == 0x06) { // 2 bytes character (0x06 = 110 BIN)
+					$bytes[] = ($char - 0xC0) << 0x06;
+					++$countbytes;
+					$numbytes = 2;
+				} elseif (($char >> 0x04) == 0x0E) { // 3 bytes character (0x0E = 1110 BIN)
+					$bytes[] = ($char - 0xE0) << 0x0C;
+					++$countbytes;
+					$numbytes = 3;
+				} elseif (($char >> 0x03) == 0x1E) { // 4 bytes character (0x1E = 11110 BIN)
+					$bytes[] = ($char - 0xF0) << 0x12;
+					++$countbytes;
+					$numbytes = 4;
+				} else {
+					// use replacement character for other invalid sequences
+					return 0xFFFD;
+				}
+			} elseif (($char >> 0x06) == 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN
+				$bytes[] = $char - 0x80;
+				++$countbytes;
+				if ($countbytes == $numbytes) {
+					// compose UTF-8 bytes to a single unicode value
+					$char = $bytes[0];
+					for ($j = 1; $j < $numbytes; ++$j) {
+						$char += ($bytes[$j] << (($numbytes - $j - 1) * 0x06));
+					}
+					if ((($char >= 0xD800) AND ($char <= 0xDFFF)) OR ($char >= 0x10FFFF)) {
+						// The definition of UTF-8 prohibits encoding character numbers between
+						// U+D800 and U+DFFF, which are reserved for use with the UTF-16
+						// encoding form (as surrogate pairs) and do not directly represent
+						// characters.
+						return 0xFFFD; // use replacement character
+					} else {
+						return $char;
+					}
+				}
+			} else {
+				// use replacement character for other invalid sequences
+				return 0xFFFD;
+			}
+		}
+		return 0xFFFD;
+	}
+
+	/**
+	 * Converts UTF-8 strings to codepoints array.<br>
+	 * Invalid byte sequences will be replaced with 0xFFFD (replacement character)<br>
+	 * @param $str (string) string to process.
+	 * @param $isunicode (boolean) True when the documetn is in Unicode mode, false otherwise.
+	 * @param $currentfont (array) Reference to current font array.
+	 * @return array containing codepoints (UTF-8 characters values)
+	 * @author Nicola Asuni
+	 * @public static
+	 */
+	public static function UTF8StringToArray($str, $isunicode=true, &$currentfont) {
+		if ($isunicode) {
+			// requires PCRE unicode support turned on
+			$chars = TCPDF_STATIC::pregSplit('//','u', $str, -1, PREG_SPLIT_NO_EMPTY);
+			$carr = array_map(array('self', 'uniord'), $chars);
+		} else {
+			$chars = str_split($str);
+			$carr = array_map('ord', $chars);
+		}
+		$currentfont['subsetchars'] += array_fill_keys($carr, true);
+		return $carr;
+	}
+
+	/**
+	 * Converts UTF-8 strings to Latin1 when using the standard 14 core fonts.<br>
+	 * @param $str (string) string to process.
+	 * @param $isunicode (boolean) True when the documetn is in Unicode mode, false otherwise.
+	 * @param $currentfont (array) Reference to current font array.
+	 * @return string
+	 * @since 3.2.000 (2008-06-23)
+	 * @public static
+	 */
+	public static function UTF8ToLatin1($str, $isunicode=true, &$currentfont) {
+		$unicode = self::UTF8StringToArray($str, $isunicode, $currentfont); // array containing UTF-8 unicode values
+		return self::UTF8ArrToLatin1($unicode);
+	}
+
+	/**
+	 * Converts UTF-8 strings to UTF16-BE.<br>
+	 * @param $str (string) string to process.
+	 * @param $setbom (boolean) if true set the Byte Order Mark (BOM = 0xFEFF)
+	 * @param $isunicode (boolean) True when the documetn is in Unicode mode, false otherwise.
+	 * @param $currentfont (array) Reference to current font array.
+	 * @return string
+	 * @author Nicola Asuni
+	 * @since 1.53.0.TC005 (2005-01-05)
+	 * @public static
+	 */
+	public static function UTF8ToUTF16BE($str, $setbom=false, $isunicode=true, &$currentfont) {
+		if (!$isunicode) {
+			return $str; // string is not in unicode
+		}
+		$unicode = self::UTF8StringToArray($str, $isunicode, $currentfont); // array containing UTF-8 unicode values
+		return self::arrUTF8ToUTF16BE($unicode, $setbom);
+	}
+
+	/**
+	 * Reverse the RLT substrings using the Bidirectional Algorithm (http://unicode.org/reports/tr9/).
+	 * @param $str (string) string to manipulate.
+	 * @param $setbom (bool) if true set the Byte Order Mark (BOM = 0xFEFF)
+	 * @param $forcertl (bool) if true forces RTL text direction
+	 * @param $isunicode (boolean) True if the document is in Unicode mode, false otherwise.
+	 * @param $currentfont (array) Reference to current font array.
+	 * @return string
+	 * @author Nicola Asuni
+	 * @since 2.1.000 (2008-01-08)
+	 * @public static
+	 */
+	public static function utf8StrRev($str, $setbom=false, $forcertl=false, $isunicode=true, &$currentfont) {
+		return self::utf8StrArrRev(self::UTF8StringToArray($str, $isunicode, $currentfont), $str, $setbom, $forcertl, $isunicode, $currentfont);
+	}
+
+	/**
+	 * Reverse the RLT substrings array using the Bidirectional Algorithm (http://unicode.org/reports/tr9/).
+	 * @param $arr (array) array of unicode values.
+	 * @param $str (string) string to manipulate (or empty value).
+	 * @param $setbom (bool) if true set the Byte Order Mark (BOM = 0xFEFF)
+	 * @param $forcertl (bool) if true forces RTL text direction
+	 * @param $isunicode (boolean) True if the document is in Unicode mode, false otherwise.
+	 * @param $currentfont (array) Reference to current font array.
+	 * @return string
+	 * @author Nicola Asuni
+	 * @since 4.9.000 (2010-03-27)
+	 * @public static
+	 */
+	public static function utf8StrArrRev($arr, $str='', $setbom=false, $forcertl=false, $isunicode=true, &$currentfont) {
+		return self::arrUTF8ToUTF16BE(self::utf8Bidi($arr, $str, $forcertl, $isunicode, $currentfont), $setbom);
+	}
+
+	/**
+	 * Reverse the RLT substrings using the Bidirectional Algorithm (http://unicode.org/reports/tr9/).
+	 * @param $ta (array) array of characters composing the string.
+	 * @param $str (string) string to process
+	 * @param $forcertl (bool) if 'R' forces RTL, if 'L' forces LTR
+	 * @param $isunicode (boolean) True if the document is in Unicode mode, false otherwise.
+	 * @param $currentfont (array) Reference to current font array.
+	 * @return array of unicode chars
+	 * @author Nicola Asuni
+	 * @since 2.4.000 (2008-03-06)
+	 * @public static
+	 */
+	public static function utf8Bidi($ta, $str='', $forcertl=false, $isunicode=true, &$currentfont) {
+		// paragraph embedding level
+		$pel = 0;
+		// max level
+		$maxlevel = 0;
+		if (TCPDF_STATIC::empty_string($str)) {
+			// create string from array
+			$str = self::UTF8ArrSubString($ta, '', '', $isunicode);
+		}
+		// check if string contains arabic text
+		if (preg_match(TCPDF_FONT_DATA::$uni_RE_PATTERN_ARABIC, $str)) {
+			$arabic = true;
+		} else {
+			$arabic = false;
+		}
+		// check if string contains RTL text
+		if (!($forcertl OR $arabic OR preg_match(TCPDF_FONT_DATA::$uni_RE_PATTERN_RTL, $str))) {
+			return $ta;
+		}
+
+		// get number of chars
+		$numchars = count($ta);
+
+		if ($forcertl == 'R') {
+			$pel = 1;
+		} elseif ($forcertl == 'L') {
+			$pel = 0;
+		} else {
+			// P2. In each paragraph, find the first character of type L, AL, or R.
+			// P3. If a character is found in P2 and it is of type AL or R, then set the paragraph embedding level to one; otherwise, set it to zero.
+			for ($i=0; $i < $numchars; ++$i) {
+				$type = TCPDF_FONT_DATA::$uni_type[$ta[$i]];
+				if ($type == 'L') {
+					$pel = 0;
+					break;
+				} elseif (($type == 'AL') OR ($type == 'R')) {
+					$pel = 1;
+					break;
+				}
+			}
+		}
+
+		// Current Embedding Level
+		$cel = $pel;
+		// directional override status
+		$dos = 'N';
+		$remember = array();
+		// start-of-level-run
+		$sor = $pel % 2 ? 'R' : 'L';
+		$eor = $sor;
+
+		// Array of characters data
+		$chardata = Array();
+
+		// X1. Begin by setting the current embedding level to the paragraph embedding level. Set the directional override status to neutral. Process each character iteratively, applying rules X2 through X9. Only embedding levels from 0 to 61 are valid in this phase.
+		// In the resolution of levels in rules I1 and I2, the maximum embedding level of 62 can be reached.
+		for ($i=0; $i < $numchars; ++$i) {
+			if ($ta[$i] == TCPDF_FONT_DATA::$uni_RLE) {
+				// X2. With each RLE, compute the least greater odd embedding level.
+				//	a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral.
+				//	b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status.
+				$next_level = $cel + ($cel % 2) + 1;
+				if ($next_level < 62) {
+					$remember[] = array('num' => TCPDF_FONT_DATA::$uni_RLE, 'cel' => $cel, 'dos' => $dos);
+					$cel = $next_level;
+					$dos = 'N';
+					$sor = $eor;
+					$eor = $cel % 2 ? 'R' : 'L';
+				}
+			} elseif ($ta[$i] == TCPDF_FONT_DATA::$uni_LRE) {
+				// X3. With each LRE, compute the least greater even embedding level.
+				//	a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral.
+				//	b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status.
+				$next_level = $cel + 2 - ($cel % 2);
+				if ( $next_level < 62 ) {
+					$remember[] = array('num' => TCPDF_FONT_DATA::$uni_LRE, 'cel' => $cel, 'dos' => $dos);
+					$cel = $next_level;
+					$dos = 'N';
+					$sor = $eor;
+					$eor = $cel % 2 ? 'R' : 'L';
+				}
+			} elseif ($ta[$i] == TCPDF_FONT_DATA::$uni_RLO) {
+				// X4. With each RLO, compute the least greater odd embedding level.
+				//	a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to right-to-left.
+				//	b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status.
+				$next_level = $cel + ($cel % 2) + 1;
+				if ($next_level < 62) {
+					$remember[] = array('num' => TCPDF_FONT_DATA::$uni_RLO, 'cel' => $cel, 'dos' => $dos);
+					$cel = $next_level;
+					$dos = 'R';
+					$sor = $eor;
+					$eor = $cel % 2 ? 'R' : 'L';
+				}
+			} elseif ($ta[$i] == TCPDF_FONT_DATA::$uni_LRO) {
+				// X5. With each LRO, compute the least greater even embedding level.
+				//	a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to left-to-right.
+				//	b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status.
+				$next_level = $cel + 2 - ($cel % 2);
+				if ( $next_level < 62 ) {
+					$remember[] = array('num' => TCPDF_FONT_DATA::$uni_LRO, 'cel' => $cel, 'dos' => $dos);
+					$cel = $next_level;
+					$dos = 'L';
+					$sor = $eor;
+					$eor = $cel % 2 ? 'R' : 'L';
+				}
+			} elseif ($ta[$i] == TCPDF_FONT_DATA::$uni_PDF) {
+				// X7. With each PDF, determine the matching embedding or override code. If there was a valid matching code, restore (pop) the last remembered (pushed) embedding level and directional override.
+				if (count($remember)) {
+					$last = count($remember ) - 1;
+					if (($remember[$last]['num'] == TCPDF_FONT_DATA::$uni_RLE) OR
+						($remember[$last]['num'] == TCPDF_FONT_DATA::$uni_LRE) OR
+						($remember[$last]['num'] == TCPDF_FONT_DATA::$uni_RLO) OR
+						($remember[$last]['num'] == TCPDF_FONT_DATA::$uni_LRO)) {
+						$match = array_pop($remember);
+						$cel = $match['cel'];
+						$dos = $match['dos'];
+						$sor = $eor;
+						$eor = ($cel > $match['cel'] ? $cel : $match['cel']) % 2 ? 'R' : 'L';
+					}
+				}
+			} elseif (($ta[$i] != TCPDF_FONT_DATA::$uni_RLE) AND
+							 ($ta[$i] != TCPDF_FONT_DATA::$uni_LRE) AND
+							 ($ta[$i] != TCPDF_FONT_DATA::$uni_RLO) AND
+							 ($ta[$i] != TCPDF_FONT_DATA::$uni_LRO) AND
+							 ($ta[$i] != TCPDF_FONT_DATA::$uni_PDF)) {
+				// X6. For all types besides RLE, LRE, RLO, LRO, and PDF:
+				//	a. Set the level of the current character to the current embedding level.
+				//	b. Whenever the directional override status is not neutral, reset the current character type to the directional override status.
+				if ($dos != 'N') {
+					$chardir = $dos;
+				} else {
+					if (isset(TCPDF_FONT_DATA::$uni_type[$ta[$i]])) {
+						$chardir = TCPDF_FONT_DATA::$uni_type[$ta[$i]];
+					} else {
+						$chardir = 'L';
+					}
+				}
+				// stores string characters and other information
+				$chardata[] = array('char' => $ta[$i], 'level' => $cel, 'type' => $chardir, 'sor' => $sor, 'eor' => $eor);
+			}
+		} // end for each char
+
+		// X8. All explicit directional embeddings and overrides are completely terminated at the end of each paragraph. Paragraph separators are not included in the embedding.
+		// X9. Remove all RLE, LRE, RLO, LRO, PDF, and BN codes.
+		// X10. The remaining rules are applied to each run of characters at the same level. For each run, determine the start-of-level-run (sor) and end-of-level-run (eor) type, either L or R. This depends on the higher of the two levels on either side of the boundary (at the start or end of the paragraph, the level of the 'other' run is the base embedding level). If the higher level is odd, the type is R; otherwise, it is L.
+
+		// 3.3.3 Resolving Weak Types
+		// Weak types are now resolved one level run at a time. At level run boundaries where the type of the character on the other side of the boundary is required, the type assigned to sor or eor is used.
+		// Nonspacing marks are now resolved based on the previous characters.
+		$numchars = count($chardata);
+
+		// W1. Examine each nonspacing mark (NSM) in the level run, and change the type of the NSM to the type of the previous character. If the NSM is at the start of the level run, it will get the type of sor.
+		$prevlevel = -1; // track level changes
+		$levcount = 0; // counts consecutive chars at the same level
+		for ($i=0; $i < $numchars; ++$i) {
+			if ($chardata[$i]['type'] == 'NSM') {
+				if ($levcount) {
+					$chardata[$i]['type'] = $chardata[$i]['sor'];
+				} elseif ($i > 0) {
+					$chardata[$i]['type'] = $chardata[($i-1)]['type'];
+				}
+			}
+			if ($chardata[$i]['level'] != $prevlevel) {
+				$levcount = 0;
+			} else {
+				++$levcount;
+			}
+			$prevlevel = $chardata[$i]['level'];
+		}
+
+		// W2. Search backward from each instance of a European number until the first strong type (R, L, AL, or sor) is found. If an AL is found, change the type of the European number to Arabic number.
+		$prevlevel = -1;
+		$levcount = 0;
+		for ($i=0; $i < $numchars; ++$i) {
+			if ($chardata[$i]['char'] == 'EN') {
+				for ($j=$levcount; $j >= 0; $j--) {
+					if ($chardata[$j]['type'] == 'AL') {
+						$chardata[$i]['type'] = 'AN';
+					} elseif (($chardata[$j]['type'] == 'L') OR ($chardata[$j]['type'] == 'R')) {
+						break;
+					}
+				}
+			}
+			if ($chardata[$i]['level'] != $prevlevel) {
+				$levcount = 0;
+			} else {
+				++$levcount;
+			}
+			$prevlevel = $chardata[$i]['level'];
+		}
+
+		// W3. Change all ALs to R.
+		for ($i=0; $i < $numchars; ++$i) {
+			if ($chardata[$i]['type'] == 'AL') {
+				$chardata[$i]['type'] = 'R';
+			}
+		}
+
+		// W4. A single European separator between two European numbers changes to a European number. A single common separator between two numbers of the same type changes to that type.
+		$prevlevel = -1;
+		$levcount = 0;
+		for ($i=0; $i < $numchars; ++$i) {
+			if (($levcount > 0) AND (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] == $prevlevel)) {
+				if (($chardata[$i]['type'] == 'ES') AND ($chardata[($i-1)]['type'] == 'EN') AND ($chardata[($i+1)]['type'] == 'EN')) {
+					$chardata[$i]['type'] = 'EN';
+				} elseif (($chardata[$i]['type'] == 'CS') AND ($chardata[($i-1)]['type'] == 'EN') AND ($chardata[($i+1)]['type'] == 'EN')) {
+					$chardata[$i]['type'] = 'EN';
+				} elseif (($chardata[$i]['type'] == 'CS') AND ($chardata[($i-1)]['type'] == 'AN') AND ($chardata[($i+1)]['type'] == 'AN')) {
+					$chardata[$i]['type'] = 'AN';
+				}
+			}
+			if ($chardata[$i]['level'] != $prevlevel) {
+				$levcount = 0;
+			} else {
+				++$levcount;
+			}
+			$prevlevel = $chardata[$i]['level'];
+		}
+
+		// W5. A sequence of European terminators adjacent to European numbers changes to all European numbers.
+		$prevlevel = -1;
+		$levcount = 0;
+		for ($i=0; $i < $numchars; ++$i) {
+			if ($chardata[$i]['type'] == 'ET') {
+				if (($levcount > 0) AND ($chardata[($i-1)]['type'] == 'EN')) {
+					$chardata[$i]['type'] = 'EN';
+				} else {
+					$j = $i+1;
+					while (($j < $numchars) AND ($chardata[$j]['level'] == $prevlevel)) {
+						if ($chardata[$j]['type'] == 'EN') {
+							$chardata[$i]['type'] = 'EN';
+							break;
+						} elseif ($chardata[$j]['type'] != 'ET') {
+							break;
+						}
+						++$j;
+					}
+				}
+			}
+			if ($chardata[$i]['level'] != $prevlevel) {
+				$levcount = 0;
+			} else {
+				++$levcount;
+			}
+			$prevlevel = $chardata[$i]['level'];
+		}
+
+		// W6. Otherwise, separators and terminators change to Other Neutral.
+		$prevlevel = -1;
+		$levcount = 0;
+		for ($i=0; $i < $numchars; ++$i) {
+			if (($chardata[$i]['type'] == 'ET') OR ($chardata[$i]['type'] == 'ES') OR ($chardata[$i]['type'] == 'CS')) {
+				$chardata[$i]['type'] = 'ON';
+			}
+			if ($chardata[$i]['level'] != $prevlevel) {
+				$levcount = 0;
+			} else {
+				++$levcount;
+			}
+			$prevlevel = $chardata[$i]['level'];
+		}
+
+		//W7. Search backward from each instance of a European number until the first strong type (R, L, or sor) is found. If an L is found, then change the type of the European number to L.
+		$prevlevel = -1;
+		$levcount = 0;
+		for ($i=0; $i < $numchars; ++$i) {
+			if ($chardata[$i]['char'] == 'EN') {
+				for ($j=$levcount; $j >= 0; $j--) {
+					if ($chardata[$j]['type'] == 'L') {
+						$chardata[$i]['type'] = 'L';
+					} elseif ($chardata[$j]['type'] == 'R') {
+						break;
+					}
+				}
+			}
+			if ($chardata[$i]['level'] != $prevlevel) {
+				$levcount = 0;
+			} else {
+				++$levcount;
+			}
+			$prevlevel = $chardata[$i]['level'];
+		}
+
+		// N1. A sequence of neutrals takes the direction of the surrounding strong text if the text on both sides has the same direction. European and Arabic numbers act as if they were R in terms of their influence on neutrals. Start-of-level-run (sor) and end-of-level-run (eor) are used at level run boundaries.
+		$prevlevel = -1;
+		$levcount = 0;
+		for ($i=0; $i < $numchars; ++$i) {
+			if (($levcount > 0) AND (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] == $prevlevel)) {
+				if (($chardata[$i]['type'] == 'N') AND ($chardata[($i-1)]['type'] == 'L') AND ($chardata[($i+1)]['type'] == 'L')) {
+					$chardata[$i]['type'] = 'L';
+				} elseif (($chardata[$i]['type'] == 'N') AND
+				 (($chardata[($i-1)]['type'] == 'R') OR ($chardata[($i-1)]['type'] == 'EN') OR ($chardata[($i-1)]['type'] == 'AN')) AND
+				 (($chardata[($i+1)]['type'] == 'R') OR ($chardata[($i+1)]['type'] == 'EN') OR ($chardata[($i+1)]['type'] == 'AN'))) {
+					$chardata[$i]['type'] = 'R';
+				} elseif ($chardata[$i]['type'] == 'N') {
+					// N2. Any remaining neutrals take the embedding direction
+					$chardata[$i]['type'] = $chardata[$i]['sor'];
+				}
+			} elseif (($levcount == 0) AND (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] == $prevlevel)) {
+				// first char
+				if (($chardata[$i]['type'] == 'N') AND ($chardata[$i]['sor'] == 'L') AND ($chardata[($i+1)]['type'] == 'L')) {
+					$chardata[$i]['type'] = 'L';
+				} elseif (($chardata[$i]['type'] == 'N') AND
+				 (($chardata[$i]['sor'] == 'R') OR ($chardata[$i]['sor'] == 'EN') OR ($chardata[$i]['sor'] == 'AN')) AND
+				 (($chardata[($i+1)]['type'] == 'R') OR ($chardata[($i+1)]['type'] == 'EN') OR ($chardata[($i+1)]['type'] == 'AN'))) {
+					$chardata[$i]['type'] = 'R';
+				} elseif ($chardata[$i]['type'] == 'N') {
+					// N2. Any remaining neutrals take the embedding direction
+					$chardata[$i]['type'] = $chardata[$i]['sor'];
+				}
+			} elseif (($levcount > 0) AND ((($i+1) == $numchars) OR (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] != $prevlevel))) {
+				//last char
+				if (($chardata[$i]['type'] == 'N') AND ($chardata[($i-1)]['type'] == 'L') AND ($chardata[$i]['eor'] == 'L')) {
+					$chardata[$i]['type'] = 'L';
+				} elseif (($chardata[$i]['type'] == 'N') AND
+				 (($chardata[($i-1)]['type'] == 'R') OR ($chardata[($i-1)]['type'] == 'EN') OR ($chardata[($i-1)]['type'] == 'AN')) AND
+				 (($chardata[$i]['eor'] == 'R') OR ($chardata[$i]['eor'] == 'EN') OR ($chardata[$i]['eor'] == 'AN'))) {
+					$chardata[$i]['type'] = 'R';
+				} elseif ($chardata[$i]['type'] == 'N') {
+					// N2. Any remaining neutrals take the embedding direction
+					$chardata[$i]['type'] = $chardata[$i]['sor'];
+				}
+			} elseif ($chardata[$i]['type'] == 'N') {
+				// N2. Any remaining neutrals take the embedding direction
+				$chardata[$i]['type'] = $chardata[$i]['sor'];
+			}
+			if ($chardata[$i]['level'] != $prevlevel) {
+				$levcount = 0;
+			} else {
+				++$levcount;
+			}
+			$prevlevel = $chardata[$i]['level'];
+		}
+
+		// I1. For all characters with an even (left-to-right) embedding direction, those of type R go up one level and those of type AN or EN go up two levels.
+		// I2. For all characters with an odd (right-to-left) embedding direction, those of type L, EN or AN go up one level.
+		for ($i=0; $i < $numchars; ++$i) {
+			$odd = $chardata[$i]['level'] % 2;
+			if ($odd) {
+				if (($chardata[$i]['type'] == 'L') OR ($chardata[$i]['type'] == 'AN') OR ($chardata[$i]['type'] == 'EN')) {
+					$chardata[$i]['level'] += 1;
+				}
+			} else {
+				if ($chardata[$i]['type'] == 'R') {
+					$chardata[$i]['level'] += 1;
+				} elseif (($chardata[$i]['type'] == 'AN') OR ($chardata[$i]['type'] == 'EN')) {
+					$chardata[$i]['level'] += 2;
+				}
+			}
+			$maxlevel = max($chardata[$i]['level'],$maxlevel);
+		}
+
+		// L1. On each line, reset the embedding level of the following characters to the paragraph embedding level:
+		//	1. Segment separators,
+		//	2. Paragraph separators,
+		//	3. Any sequence of whitespace characters preceding a segment separator or paragraph separator, and
+		//	4. Any sequence of white space characters at the end of the line.
+		for ($i=0; $i < $numchars; ++$i) {
+			if (($chardata[$i]['type'] == 'B') OR ($chardata[$i]['type'] == 'S')) {
+				$chardata[$i]['level'] = $pel;
+			} elseif ($chardata[$i]['type'] == 'WS') {
+				$j = $i+1;
+				while ($j < $numchars) {
+					if ((($chardata[$j]['type'] == 'B') OR ($chardata[$j]['type'] == 'S')) OR
+						(($j == ($numchars-1)) AND ($chardata[$j]['type'] == 'WS'))) {
+						$chardata[$i]['level'] = $pel;
+						break;
+					} elseif ($chardata[$j]['type'] != 'WS') {
+						break;
+					}
+					++$j;
+				}
+			}
+		}
+
+		// Arabic Shaping
+		// Cursively connected scripts, such as Arabic or Syriac, require the selection of positional character shapes that depend on adjacent characters. Shaping is logically applied after the Bidirectional Algorithm is used and is limited to characters within the same directional run.
+		if ($arabic) {
+			$endedletter = array(1569,1570,1571,1572,1573,1575,1577,1583,1584,1585,1586,1608,1688);
+			$alfletter = array(1570,1571,1573,1575);
+			$chardata2 = $chardata;
+			$laaletter = false;
+			$charAL = array();
+			$x = 0;
+			for ($i=0; $i < $numchars; ++$i) {
+				if ((TCPDF_FONT_DATA::$uni_type[$chardata[$i]['char']] == 'AL') OR ($chardata[$i]['char'] == 32) OR ($chardata[$i]['char'] == 8204)) {
+					$charAL[$x] = $chardata[$i];
+					$charAL[$x]['i'] = $i;
+					$chardata[$i]['x'] = $x;
+					++$x;
+				}
+			}
+			$numAL = $x;
+			for ($i=0; $i < $numchars; ++$i) {
+				$thischar = $chardata[$i];
+				if ($i > 0) {
+					$prevchar = $chardata[($i-1)];
+				} else {
+					$prevchar = false;
+				}
+				if (($i+1) < $numchars) {
+					$nextchar = $chardata[($i+1)];
+				} else {
+					$nextchar = false;
+				}
+				if (TCPDF_FONT_DATA::$uni_type[$thischar['char']] == 'AL') {
+					$x = $thischar['x'];
+					if ($x > 0) {
+						$prevchar = $charAL[($x-1)];
+					} else {
+						$prevchar = false;
+					}
+					if (($x+1) < $numAL) {
+						$nextchar = $charAL[($x+1)];
+					} else {
+						$nextchar = false;
+					}
+					// if laa letter
+					if (($prevchar !== false) AND ($prevchar['char'] == 1604) AND (in_array($thischar['char'], $alfletter))) {
+						$arabicarr = TCPDF_FONT_DATA::$uni_laa_array;
+						$laaletter = true;
+						if ($x > 1) {
+							$prevchar = $charAL[($x-2)];
+						} else {
+							$prevchar = false;
+						}
+					} else {
+						$arabicarr = TCPDF_FONT_DATA::$uni_arabicsubst;
+						$laaletter = false;
+					}
+					if (($prevchar !== false) AND ($nextchar !== false) AND
+						((TCPDF_FONT_DATA::$uni_type[$prevchar['char']] == 'AL') OR (TCPDF_FONT_DATA::$uni_type[$prevchar['char']] == 'NSM')) AND
+						((TCPDF_FONT_DATA::$uni_type[$nextchar['char']] == 'AL') OR (TCPDF_FONT_DATA::$uni_type[$nextchar['char']] == 'NSM')) AND
+						($prevchar['type'] == $thischar['type']) AND
+						($nextchar['type'] == $thischar['type']) AND
+						($nextchar['char'] != 1567)) {
+						if (in_array($prevchar['char'], $endedletter)) {
+							if (isset($arabicarr[$thischar['char']][2])) {
+								// initial
+								$chardata2[$i]['char'] = $arabicarr[$thischar['char']][2];
+							}
+						} else {
+							if (isset($arabicarr[$thischar['char']][3])) {
+								// medial
+								$chardata2[$i]['char'] = $arabicarr[$thischar['char']][3];
+							}
+						}
+					} elseif (($nextchar !== false) AND
+						((TCPDF_FONT_DATA::$uni_type[$nextchar['char']] == 'AL') OR (TCPDF_FONT_DATA::$uni_type[$nextchar['char']] == 'NSM')) AND
+						($nextchar['type'] == $thischar['type']) AND
+						($nextchar['char'] != 1567)) {
+						if (isset($arabicarr[$chardata[$i]['char']][2])) {
+							// initial
+							$chardata2[$i]['char'] = $arabicarr[$thischar['char']][2];
+						}
+					} elseif ((($prevchar !== false) AND
+						((TCPDF_FONT_DATA::$uni_type[$prevchar['char']] == 'AL') OR (TCPDF_FONT_DATA::$uni_type[$prevchar['char']] == 'NSM')) AND
+						($prevchar['type'] == $thischar['type'])) OR
+						(($nextchar !== false) AND ($nextchar['char'] == 1567))) {
+						// final
+						if (($i > 1) AND ($thischar['char'] == 1607) AND
+							($chardata[$i-1]['char'] == 1604) AND
+							($chardata[$i-2]['char'] == 1604)) {
+							//Allah Word
+							// mark characters to delete with false
+							$chardata2[$i-2]['char'] = false;
+							$chardata2[$i-1]['char'] = false;
+							$chardata2[$i]['char'] = 65010;
+						} else {
+							if (($prevchar !== false) AND in_array($prevchar['char'], $endedletter)) {
+								if (isset($arabicarr[$thischar['char']][0])) {
+									// isolated
+									$chardata2[$i]['char'] = $arabicarr[$thischar['char']][0];
+								}
+							} else {
+								if (isset($arabicarr[$thischar['char']][1])) {
+									// final
+									$chardata2[$i]['char'] = $arabicarr[$thischar['char']][1];
+								}
+							}
+						}
+					} elseif (isset($arabicarr[$thischar['char']][0])) {
+						// isolated
+						$chardata2[$i]['char'] = $arabicarr[$thischar['char']][0];
+					}
+					// if laa letter
+					if ($laaletter) {
+						// mark characters to delete with false
+						$chardata2[($charAL[($x-1)]['i'])]['char'] = false;
+					}
+				} // end if AL (Arabic Letter)
+			} // end for each char
+			/*
+			 * Combining characters that can occur with Arabic Shadda (0651 HEX, 1617 DEC) are replaced.
+			 * Putting the combining mark and shadda in the same glyph allows us to avoid the two marks overlapping each other in an illegible manner.
+			 */
+			for ($i = 0; $i < ($numchars-1); ++$i) {
+				if (($chardata2[$i]['char'] == 1617) AND (isset(TCPDF_FONT_DATA::$uni_diacritics[($chardata2[$i+1]['char'])]))) {
+					// check if the subtitution font is defined on current font
+					if (isset($currentfont['cw'][(TCPDF_FONT_DATA::$uni_diacritics[($chardata2[$i+1]['char'])])])) {
+						$chardata2[$i]['char'] = false;
+						$chardata2[$i+1]['char'] = TCPDF_FONT_DATA::$uni_diacritics[($chardata2[$i+1]['char'])];
+					}
+				}
+			}
+			// remove marked characters
+			foreach ($chardata2 as $key => $value) {
+				if ($value['char'] === false) {
+					unset($chardata2[$key]);
+				}
+			}
+			$chardata = array_values($chardata2);
+			$numchars = count($chardata);
+			unset($chardata2);
+			unset($arabicarr);
+			unset($laaletter);
+			unset($charAL);
+		}
+
+		// L2. From the highest level found in the text to the lowest odd level on each line, including intermediate levels not actually present in the text, reverse any contiguous sequence of characters that are at that level or higher.
+		for ($j=$maxlevel; $j > 0; $j--) {
+			$ordarray = Array();
+			$revarr = Array();
+			$onlevel = false;
+			for ($i=0; $i < $numchars; ++$i) {
+				if ($chardata[$i]['level'] >= $j) {
+					$onlevel = true;
+					if (isset(TCPDF_FONT_DATA::$uni_mirror[$chardata[$i]['char']])) {
+						// L4. A character is depicted by a mirrored glyph if and only if (a) the resolved directionality of that character is R, and (b) the Bidi_Mirrored property value of that character is true.
+						$chardata[$i]['char'] = TCPDF_FONT_DATA::$uni_mirror[$chardata[$i]['char']];
+					}
+					$revarr[] = $chardata[$i];
+				} else {
+					if ($onlevel) {
+						$revarr = array_reverse($revarr);
+						$ordarray = array_merge($ordarray, $revarr);
+						$revarr = Array();
+						$onlevel = false;
+					}
+					$ordarray[] = $chardata[$i];
+				}
+			}
+			if ($onlevel) {
+				$revarr = array_reverse($revarr);
+				$ordarray = array_merge($ordarray, $revarr);
+			}
+			$chardata = $ordarray;
+		}
+		$ordarray = array();
+		foreach ($chardata as $cd) {
+			$ordarray[] = $cd['char'];
+			// store char values for subsetting
+			$currentfont['subsetchars'][$cd['char']] = true;
+		}
+		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
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_images.php b/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_images.php
new file mode 100644
index 00000000..525649cb
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_images.php
@@ -0,0 +1,355 @@
+<?php
+//============================================================+
+// File name   : tcpdf_images.php
+// Version     : 1.0.001
+// Begin       : 2002-08-03
+// Last Update : 2013-08-05
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2002-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 License
+// along with TCPDF. If not, see
+// <http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description :
+//   Static image methods used by the TCPDF class.
+//
+//============================================================+
+
+/**
+ * @file
+ * This is a PHP class that contains static image methods for the TCPDF class.<br>
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.001
+ */
+
+/**
+ * @class TCPDF_IMAGES
+ * Static image methods used by the TCPDF class.
+ * @package com.tecnick.tcpdf
+ * @brief PHP class for generating PDF documents without requiring external extensions.
+ * @version 1.0.000
+ * @author Nicola Asuni - info@tecnick.com
+ */
+class TCPDF_IMAGES {
+
+	/**
+	 * Array of hinheritable SVG properties.
+	 * @since 5.0.000 (2010-05-02)
+	 * @public static
+	 */
+	public static $svginheritprop = array('clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cursor', 'direction', 'fill', 'fill-opacity', 'fill-rule', 'font', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'image-rendering', 'kerning', 'letter-spacing', 'marker', 'marker-end', 'marker-mid', 'marker-start', 'pointer-events', 'shape-rendering', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-rendering', 'visibility', 'word-spacing', 'writing-mode');
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	/**
+	 * Return the image type given the file name or array returned by getimagesize() function.
+	 * @param $imgfile (string) image file name
+	 * @param $iminfo (array) array of image information returned by getimagesize() function.
+	 * @return string image type
+	 * @since 4.8.017 (2009-11-27)
+	 * @public static
+	 */
+	public static function getImageFileType($imgfile, $iminfo=array()) {
+		$type = '';
+		if (isset($iminfo['mime']) AND !empty($iminfo['mime'])) {
+			$mime = explode('/', $iminfo['mime']);
+			if ((count($mime) > 1) AND ($mime[0] == 'image') AND (!empty($mime[1]))) {
+				$type = strtolower(trim($mime[1]));
+			}
+		}
+		if (empty($type)) {
+			$fileinfo = pathinfo($imgfile);
+			if (isset($fileinfo['extension']) AND (!TCPDF_STATIC::empty_string($fileinfo['extension']))) {
+				$type = strtolower(trim($fileinfo['extension']));
+			}
+		}
+		if ($type == 'jpg') {
+			$type = 'jpeg';
+		}
+		return $type;
+	}
+
+	/**
+	 * Set the transparency for the given GD image.
+	 * @param $new_image (image) GD image object
+	 * @param $image (image) GD image object.
+	 * return GD image object.
+	 * @since 4.9.016 (2010-04-20)
+	 * @public static
+	 */
+	public static function setGDImageTransparency($new_image, $image) {
+		// transparency index
+		$tid = imagecolortransparent($image);
+		// default transparency color
+		$tcol = array('red' => 255, 'green' => 255, 'blue' => 255);
+		if ($tid >= 0) {
+			// get the colors for the transparency index
+			$tcol = imagecolorsforindex($image, $tid);
+		}
+		$tid = imagecolorallocate($new_image, $tcol['red'], $tcol['green'], $tcol['blue']);
+		imagefill($new_image, 0, 0, $tid);
+		imagecolortransparent($new_image, $tid);
+		return $new_image;
+	}
+
+	/**
+	 * Convert the loaded image to a PNG and then return a structure for the PDF creator.
+	 * This function requires GD library and write access to the directory defined on K_PATH_CACHE constant.
+	 * @param $image (image) Image object.
+	 * return image PNG image object.
+	 * @since 4.9.016 (2010-04-20)
+	 * @public static
+	 */
+	public static function _toPNG($image) {
+		// set temporary image file name
+		$tempname = TCPDF_STATIC::getObjFilename('png');
+		// turn off interlaced mode
+		imageinterlace($image, 0);
+		// create temporary PNG image
+		imagepng($image, $tempname);
+		// remove image from memory
+		imagedestroy($image);
+		// get PNG image data
+		$retvars = self::_parsepng($tempname);
+		// tidy up by removing temporary image
+		unlink($tempname);
+		return $retvars;
+	}
+
+	/**
+	 * Convert the loaded image to a JPEG and then return a structure for the PDF creator.
+	 * This function requires GD library and write access to the directory defined on K_PATH_CACHE constant.
+	 * @param $image (image) Image object.
+	 * @param $quality (int) JPEG quality.
+	 * return image JPEG image object.
+	 * @public static
+	 */
+	public static function _toJPEG($image, $quality) {
+		$tempname = TCPDF_STATIC::getObjFilename('jpg');
+		imagejpeg($image, $tempname, $quality);
+		imagedestroy($image);
+		$retvars = self::_parsejpeg($tempname);
+		// tidy up by removing temporary image
+		unlink($tempname);
+		return $retvars;
+	}
+
+	/**
+	 * Extract info from a JPEG file without using the GD library.
+	 * @param $file (string) image file to parse
+	 * @return array structure containing the image data
+	 * @public static
+	 */
+	public static function _parsejpeg($file) {
+		$a = getimagesize($file);
+		if (empty($a)) {
+			//Missing or incorrect image file
+			return false;
+		}
+		if ($a[2] != 2) {
+			// Not a JPEG file
+			return false;
+		}
+		// bits per pixel
+		$bpc = isset($a['bits']) ? intval($a['bits']) : 8;
+		// number of image channels
+		if (!isset($a['channels'])) {
+			$channels = 3;
+		} else {
+			$channels = intval($a['channels']);
+		}
+		// default colour space
+		switch ($channels) {
+			case 1: {
+				$colspace = 'DeviceGray';
+				break;
+			}
+			case 3: {
+				$colspace = 'DeviceRGB';
+				break;
+			}
+			case 4: {
+				$colspace = 'DeviceCMYK';
+				break;
+			}
+			default: {
+				$channels = 3;
+				$colspace = 'DeviceRGB';
+				break;
+			}
+		}
+		// get file content
+		$data = file_get_contents($file);
+		// check for embedded ICC profile
+		$icc = array();
+		$offset = 0;
+		while (($pos = strpos($data, "ICC_PROFILE\0", $offset)) !== false) {
+			// get ICC sequence length
+			$length = (TCPDF_STATIC::_getUSHORT($data, ($pos - 2)) - 16);
+			// marker sequence number
+			$msn = max(1, ord($data[($pos + 12)]));
+			// number of markers (total of APP2 used)
+			$nom = max(1, ord($data[($pos + 13)]));
+			// get sequence segment
+			$icc[($msn - 1)] = substr($data, ($pos + 14), $length);
+			// move forward to next sequence
+			$offset = ($pos + 14 + $length);
+		}
+		// order and compact ICC segments
+		if (count($icc) > 0) {
+			ksort($icc);
+			$icc = implode('', $icc);
+			if ((ord($icc{36}) != 0x61) OR (ord($icc{37}) != 0x63) OR (ord($icc{38}) != 0x73) OR (ord($icc{39}) != 0x70)) {
+				// invalid ICC profile
+				$icc = false;
+			}
+		} else {
+			$icc = false;
+		}
+		return array('w' => $a[0], 'h' => $a[1], 'ch' => $channels, 'icc' => $icc, 'cs' => $colspace, 'bpc' => $bpc, 'f' => 'DCTDecode', 'data' => $data);
+	}
+
+	/**
+	 * Extract info from a PNG file without using the GD library.
+	 * @param $file (string) image file to parse
+	 * @return array structure containing the image data
+	 * @public static
+	 */
+	public static function _parsepng($file) {
+		$f = fopen($file, 'rb');
+		if ($f === false) {
+			// Can't open image file
+			return false;
+		}
+		//Check signature
+		if (fread($f, 8) != chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) {
+			// Not a PNG file
+			return false;
+		}
+		//Read header chunk
+		fread($f, 4);
+		if (fread($f, 4) != 'IHDR') {
+			//Incorrect PNG file
+			return false;
+		}
+		$w = TCPDF_STATIC::_freadint($f);
+		$h = TCPDF_STATIC::_freadint($f);
+		$bpc = ord(fread($f, 1));
+		$ct = ord(fread($f, 1));
+		if ($ct == 0) {
+			$colspace = 'DeviceGray';
+		} elseif ($ct == 2) {
+			$colspace = 'DeviceRGB';
+		} elseif ($ct == 3) {
+			$colspace = 'Indexed';
+		} else {
+			// alpha channel
+			fclose($f);
+			return 'pngalpha';
+		}
+		if (ord(fread($f, 1)) != 0) {
+			// Unknown compression method
+			fclose($f);
+			return false;
+		}
+		if (ord(fread($f, 1)) != 0) {
+			// Unknown filter method
+			fclose($f);
+			return false;
+		}
+		if (ord(fread($f, 1)) != 0) {
+			// Interlacing not supported
+			fclose($f);
+			return false;
+		}
+		fread($f, 4);
+		$channels = ($ct == 2 ? 3 : 1);
+		$parms = '/DecodeParms << /Predictor 15 /Colors '.$channels.' /BitsPerComponent '.$bpc.' /Columns '.$w.' >>';
+		//Scan chunks looking for palette, transparency and image data
+		$pal = '';
+		$trns = '';
+		$data = '';
+		$icc = false;
+		do {
+			$n = TCPDF_STATIC::_freadint($f);
+			$type = fread($f, 4);
+			if ($type == 'PLTE') {
+				// read palette
+				$pal = TCPDF_STATIC::rfread($f, $n);
+				fread($f, 4);
+			} elseif ($type == 'tRNS') {
+				// read transparency info
+				$t = TCPDF_STATIC::rfread($f, $n);
+				if ($ct == 0) {
+					$trns = array(ord($t{1}));
+				} elseif ($ct == 2) {
+					$trns = array(ord($t{1}), ord($t{3}), ord($t{5}));
+				} else {
+					$pos = strpos($t, chr(0));
+					if ($pos !== false) {
+						$trns = array($pos);
+					}
+				}
+				fread($f, 4);
+			} elseif ($type == 'IDAT') {
+				// read image data block
+				$data .= TCPDF_STATIC::rfread($f, $n);
+				fread($f, 4);
+			} elseif ($type == 'iCCP') {
+				// skip profile name
+				$len = 0;
+				while ((ord(fread($f, 1)) > 0) AND ($len < 80)) {
+					++$len;
+				}
+				// skip null separator
+				fread($f, 1);
+				// get compression method
+				if (ord(fread($f, 1)) != 0) {
+					// Unknown filter method
+					fclose($f);
+					return false;
+				}
+				// read ICC Color Profile
+				$icc = TCPDF_STATIC::rfread($f, ($n - $len - 2));
+				// decompress profile
+				$icc = gzuncompress($icc);
+				fread($f, 4);
+			} elseif ($type == 'IEND') {
+				break;
+			} else {
+				TCPDF_STATIC::rfread($f, $n + 4);
+			}
+		} while ($n);
+		if (($colspace == 'Indexed') AND (empty($pal))) {
+			// Missing palette
+			fclose($f);
+			return false;
+		}
+		fclose($f);
+		return array('w' => $w, 'h' => $h, 'ch' => $channels, 'icc' => $icc, 'cs' => $colspace, 'bpc' => $bpc, 'f' => 'FlateDecode', 'parms' => $parms, 'pal' => $pal, 'trns' => $trns, 'data' => $data);
+	}
+
+} // END OF TCPDF_IMAGES CLASS
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_static.php b/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_static.php
new file mode 100644
index 00000000..9fb3c99b
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/include/tcpdf_static.php
@@ -0,0 +1,2837 @@
+<?php
+//============================================================+
+// File name   : tcpdf_static.php
+// Version     : 1.0.002
+// Begin       : 2002-08-03
+// Last Update : 2013-09-14
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2002-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 License
+// along with TCPDF. If not, see
+// <http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description :
+//   Static methods used by the TCPDF class.
+//
+//============================================================+
+
+/**
+ * @file
+ * This is a PHP class that contains static methods for the TCPDF class.<br>
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.002
+ */
+
+/**
+ * @class TCPDF_STATIC
+ * Static methods used by the TCPDF class.
+ * @package com.tecnick.tcpdf
+ * @brief PHP class for generating PDF documents without requiring external extensions.
+ * @version 1.0.002
+ * @author Nicola Asuni - info@tecnick.com
+ */
+class TCPDF_STATIC {
+
+	/**
+	 * Current TCPDF version.
+	 * @private static
+	 */
+	private static $tcpdf_version = '6.0.038';
+
+	/**
+	 * String alias for total number of pages.
+	 * @public static
+	 */
+	public static $alias_tot_pages = '{:ptp:}';
+
+	/**
+	 * String alias for page number.
+	 * @public static
+	 */
+	public static $alias_num_page = '{:pnp:}';
+
+	/**
+	 * String alias for total number of pages in a single group.
+	 * @public static
+	 */
+	public static $alias_group_tot_pages = '{:ptg:}';
+
+	/**
+	 * String alias for group page number.
+	 * @public static
+	 */
+	public static $alias_group_num_page = '{:png:}';
+
+	/**
+	 * String alias for right shift compensation used to correctly align page numbers on the right.
+	 * @public static
+	 */
+	public static $alias_right_shift = '{rsc:';
+
+	/**
+	 * Encryption padding string.
+	 * @public static
+	 */
+	public static $enc_padding = "\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A";
+
+	/**
+	 * ByteRange placemark used during digital signature process.
+	 * @since 4.6.028 (2009-08-25)
+	 * @public static
+	 */
+	public static $byterange_string = '/ByteRange[0 ********** ********** **********]';
+
+	/**
+	 * Array page boxes names
+	 * @public static
+	 */
+	public static $pageboxes = array('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox');
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	/**
+	 * Return the current TCPDF version.
+	 * @return TCPDF version string
+	 * @since 5.9.012 (2010-11-10)
+	 * @public static
+	 */
+	public static function getTCPDFVersion() {
+		return self::$tcpdf_version;
+	}
+
+	/**
+	 * Return the current TCPDF producer.
+	 * @return TCPDF producer string
+	 * @since 6.0.000 (2013-03-16)
+	 * @public static
+	 */
+	public static function getTCPDFProducer() {
+		return "\x54\x43\x50\x44\x46\x20".self::getTCPDFVersion()."\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67\x29";
+	}
+
+	/**
+	 * Sets the current active configuration setting of magic_quotes_runtime (if the set_magic_quotes_runtime function exist)
+	 * @param $mqr (boolean) FALSE for off, TRUE for on.
+	 * @since 4.6.025 (2009-08-17)
+	 * @public static
+	 */
+	public static function set_mqr($mqr) {
+		if (!defined('PHP_VERSION_ID')) {
+			$version = PHP_VERSION;
+			define('PHP_VERSION_ID', (($version{0} * 10000) + ($version{2} * 100) + $version{4}));
+		}
+		if (PHP_VERSION_ID < 50300) {
+			@set_magic_quotes_runtime($mqr);
+		}
+	}
+
+	/**
+	 * Gets the current active configuration setting of magic_quotes_runtime (if the get_magic_quotes_runtime function exist)
+	 * @return Returns 0 if magic quotes runtime is off or get_magic_quotes_runtime doesn't exist, 1 otherwise.
+	 * @since 4.6.025 (2009-08-17)
+	 * @public static
+	 */
+	public static function get_mqr() {
+		if (!defined('PHP_VERSION_ID')) {
+			$version = PHP_VERSION;
+			define('PHP_VERSION_ID', (($version{0} * 10000) + ($version{2} * 100) + $version{4}));
+		}
+		if (PHP_VERSION_ID < 50300) {
+			return @get_magic_quotes_runtime();
+		}
+		return 0;
+	}
+
+	/**
+	 * Get page dimensions from format name.
+	 * @param $format (mixed) The format name. It can be: <ul>
+	 * <li><b>ISO 216 A Series + 2 SIS 014711 extensions</b></li>
+	 * <li>A0 (841x1189 mm ; 33.11x46.81 in)</li>
+	 * <li>A1 (594x841 mm ; 23.39x33.11 in)</li>
+	 * <li>A2 (420x594 mm ; 16.54x23.39 in)</li>
+	 * <li>A3 (297x420 mm ; 11.69x16.54 in)</li>
+	 * <li>A4 (210x297 mm ; 8.27x11.69 in)</li>
+	 * <li>A5 (148x210 mm ; 5.83x8.27 in)</li>
+	 * <li>A6 (105x148 mm ; 4.13x5.83 in)</li>
+	 * <li>A7 (74x105 mm ; 2.91x4.13 in)</li>
+	 * <li>A8 (52x74 mm ; 2.05x2.91 in)</li>
+	 * <li>A9 (37x52 mm ; 1.46x2.05 in)</li>
+	 * <li>A10 (26x37 mm ; 1.02x1.46 in)</li>
+	 * <li>A11 (18x26 mm ; 0.71x1.02 in)</li>
+	 * <li>A12 (13x18 mm ; 0.51x0.71 in)</li>
+	 * <li><b>ISO 216 B Series + 2 SIS 014711 extensions</b></li>
+	 * <li>B0 (1000x1414 mm ; 39.37x55.67 in)</li>
+	 * <li>B1 (707x1000 mm ; 27.83x39.37 in)</li>
+	 * <li>B2 (500x707 mm ; 19.69x27.83 in)</li>
+	 * <li>B3 (353x500 mm ; 13.90x19.69 in)</li>
+	 * <li>B4 (250x353 mm ; 9.84x13.90 in)</li>
+	 * <li>B5 (176x250 mm ; 6.93x9.84 in)</li>
+	 * <li>B6 (125x176 mm ; 4.92x6.93 in)</li>
+	 * <li>B7 (88x125 mm ; 3.46x4.92 in)</li>
+	 * <li>B8 (62x88 mm ; 2.44x3.46 in)</li>
+	 * <li>B9 (44x62 mm ; 1.73x2.44 in)</li>
+	 * <li>B10 (31x44 mm ; 1.22x1.73 in)</li>
+	 * <li>B11 (22x31 mm ; 0.87x1.22 in)</li>
+	 * <li>B12 (15x22 mm ; 0.59x0.87 in)</li>
+	 * <li><b>ISO 216 C Series + 2 SIS 014711 extensions + 2 EXTENSION</b></li>
+	 * <li>C0 (917x1297 mm ; 36.10x51.06 in)</li>
+	 * <li>C1 (648x917 mm ; 25.51x36.10 in)</li>
+	 * <li>C2 (458x648 mm ; 18.03x25.51 in)</li>
+	 * <li>C3 (324x458 mm ; 12.76x18.03 in)</li>
+	 * <li>C4 (229x324 mm ; 9.02x12.76 in)</li>
+	 * <li>C5 (162x229 mm ; 6.38x9.02 in)</li>
+	 * <li>C6 (114x162 mm ; 4.49x6.38 in)</li>
+	 * <li>C7 (81x114 mm ; 3.19x4.49 in)</li>
+	 * <li>C8 (57x81 mm ; 2.24x3.19 in)</li>
+	 * <li>C9 (40x57 mm ; 1.57x2.24 in)</li>
+	 * <li>C10 (28x40 mm ; 1.10x1.57 in)</li>
+	 * <li>C11 (20x28 mm ; 0.79x1.10 in)</li>
+	 * <li>C12 (14x20 mm ; 0.55x0.79 in)</li>
+	 * <li>C76 (81x162 mm ; 3.19x6.38 in)</li>
+	 * <li>DL (110x220 mm ; 4.33x8.66 in)</li>
+	 * <li><b>SIS 014711 E Series</b></li>
+	 * <li>E0 (879x1241 mm ; 34.61x48.86 in)</li>
+	 * <li>E1 (620x879 mm ; 24.41x34.61 in)</li>
+	 * <li>E2 (440x620 mm ; 17.32x24.41 in)</li>
+	 * <li>E3 (310x440 mm ; 12.20x17.32 in)</li>
+	 * <li>E4 (220x310 mm ; 8.66x12.20 in)</li>
+	 * <li>E5 (155x220 mm ; 6.10x8.66 in)</li>
+	 * <li>E6 (110x155 mm ; 4.33x6.10 in)</li>
+	 * <li>E7 (78x110 mm ; 3.07x4.33 in)</li>
+	 * <li>E8 (55x78 mm ; 2.17x3.07 in)</li>
+	 * <li>E9 (39x55 mm ; 1.54x2.17 in)</li>
+	 * <li>E10 (27x39 mm ; 1.06x1.54 in)</li>
+	 * <li>E11 (19x27 mm ; 0.75x1.06 in)</li>
+	 * <li>E12 (13x19 mm ; 0.51x0.75 in)</li>
+	 * <li><b>SIS 014711 G Series</b></li>
+	 * <li>G0 (958x1354 mm ; 37.72x53.31 in)</li>
+	 * <li>G1 (677x958 mm ; 26.65x37.72 in)</li>
+	 * <li>G2 (479x677 mm ; 18.86x26.65 in)</li>
+	 * <li>G3 (338x479 mm ; 13.31x18.86 in)</li>
+	 * <li>G4 (239x338 mm ; 9.41x13.31 in)</li>
+	 * <li>G5 (169x239 mm ; 6.65x9.41 in)</li>
+	 * <li>G6 (119x169 mm ; 4.69x6.65 in)</li>
+	 * <li>G7 (84x119 mm ; 3.31x4.69 in)</li>
+	 * <li>G8 (59x84 mm ; 2.32x3.31 in)</li>
+	 * <li>G9 (42x59 mm ; 1.65x2.32 in)</li>
+	 * <li>G10 (29x42 mm ; 1.14x1.65 in)</li>
+	 * <li>G11 (21x29 mm ; 0.83x1.14 in)</li>
+	 * <li>G12 (14x21 mm ; 0.55x0.83 in)</li>
+	 * <li><b>ISO Press</b></li>
+	 * <li>RA0 (860x1220 mm ; 33.86x48.03 in)</li>
+	 * <li>RA1 (610x860 mm ; 24.02x33.86 in)</li>
+	 * <li>RA2 (430x610 mm ; 16.93x24.02 in)</li>
+	 * <li>RA3 (305x430 mm ; 12.01x16.93 in)</li>
+	 * <li>RA4 (215x305 mm ; 8.46x12.01 in)</li>
+	 * <li>SRA0 (900x1280 mm ; 35.43x50.39 in)</li>
+	 * <li>SRA1 (640x900 mm ; 25.20x35.43 in)</li>
+	 * <li>SRA2 (450x640 mm ; 17.72x25.20 in)</li>
+	 * <li>SRA3 (320x450 mm ; 12.60x17.72 in)</li>
+	 * <li>SRA4 (225x320 mm ; 8.86x12.60 in)</li>
+	 * <li><b>German DIN 476</b></li>
+	 * <li>4A0 (1682x2378 mm ; 66.22x93.62 in)</li>
+	 * <li>2A0 (1189x1682 mm ; 46.81x66.22 in)</li>
+	 * <li><b>Variations on the ISO Standard</b></li>
+	 * <li>A2_EXTRA (445x619 mm ; 17.52x24.37 in)</li>
+	 * <li>A3+ (329x483 mm ; 12.95x19.02 in)</li>
+	 * <li>A3_EXTRA (322x445 mm ; 12.68x17.52 in)</li>
+	 * <li>A3_SUPER (305x508 mm ; 12.01x20.00 in)</li>
+	 * <li>SUPER_A3 (305x487 mm ; 12.01x19.17 in)</li>
+	 * <li>A4_EXTRA (235x322 mm ; 9.25x12.68 in)</li>
+	 * <li>A4_SUPER (229x322 mm ; 9.02x12.68 in)</li>
+	 * <li>SUPER_A4 (227x356 mm ; 8.94x14.02 in)</li>
+	 * <li>A4_LONG (210x348 mm ; 8.27x13.70 in)</li>
+	 * <li>F4 (210x330 mm ; 8.27x12.99 in)</li>
+	 * <li>SO_B5_EXTRA (202x276 mm ; 7.95x10.87 in)</li>
+	 * <li>A5_EXTRA (173x235 mm ; 6.81x9.25 in)</li>
+	 * <li><b>ANSI Series</b></li>
+	 * <li>ANSI_E (864x1118 mm ; 34.00x44.00 in)</li>
+	 * <li>ANSI_D (559x864 mm ; 22.00x34.00 in)</li>
+	 * <li>ANSI_C (432x559 mm ; 17.00x22.00 in)</li>
+	 * <li>ANSI_B (279x432 mm ; 11.00x17.00 in)</li>
+	 * <li>ANSI_A (216x279 mm ; 8.50x11.00 in)</li>
+	 * <li><b>Traditional 'Loose' North American Paper Sizes</b></li>
+	 * <li>LEDGER, USLEDGER (432x279 mm ; 17.00x11.00 in)</li>
+	 * <li>TABLOID, USTABLOID, BIBLE, ORGANIZERK (279x432 mm ; 11.00x17.00 in)</li>
+	 * <li>LETTER, USLETTER, ORGANIZERM (216x279 mm ; 8.50x11.00 in)</li>
+	 * <li>LEGAL, USLEGAL (216x356 mm ; 8.50x14.00 in)</li>
+	 * <li>GLETTER, GOVERNMENTLETTER (203x267 mm ; 8.00x10.50 in)</li>
+	 * <li>JLEGAL, JUNIORLEGAL (203x127 mm ; 8.00x5.00 in)</li>
+	 * <li><b>Other North American Paper Sizes</b></li>
+	 * <li>QUADDEMY (889x1143 mm ; 35.00x45.00 in)</li>
+	 * <li>SUPER_B (330x483 mm ; 13.00x19.00 in)</li>
+	 * <li>QUARTO (229x279 mm ; 9.00x11.00 in)</li>
+	 * <li>FOLIO, GOVERNMENTLEGAL (216x330 mm ; 8.50x13.00 in)</li>
+	 * <li>EXECUTIVE, MONARCH (184x267 mm ; 7.25x10.50 in)</li>
+	 * <li>MEMO, STATEMENT, ORGANIZERL (140x216 mm ; 5.50x8.50 in)</li>
+	 * <li>FOOLSCAP (210x330 mm ; 8.27x13.00 in)</li>
+	 * <li>COMPACT (108x171 mm ; 4.25x6.75 in)</li>
+	 * <li>ORGANIZERJ (70x127 mm ; 2.75x5.00 in)</li>
+	 * <li><b>Canadian standard CAN 2-9.60M</b></li>
+	 * <li>P1 (560x860 mm ; 22.05x33.86 in)</li>
+	 * <li>P2 (430x560 mm ; 16.93x22.05 in)</li>
+	 * <li>P3 (280x430 mm ; 11.02x16.93 in)</li>
+	 * <li>P4 (215x280 mm ; 8.46x11.02 in)</li>
+	 * <li>P5 (140x215 mm ; 5.51x8.46 in)</li>
+	 * <li>P6 (107x140 mm ; 4.21x5.51 in)</li>
+	 * <li><b>North American Architectural Sizes</b></li>
+	 * <li>ARCH_E (914x1219 mm ; 36.00x48.00 in)</li>
+	 * <li>ARCH_E1 (762x1067 mm ; 30.00x42.00 in)</li>
+	 * <li>ARCH_D (610x914 mm ; 24.00x36.00 in)</li>
+	 * <li>ARCH_C, BROADSHEET (457x610 mm ; 18.00x24.00 in)</li>
+	 * <li>ARCH_B (305x457 mm ; 12.00x18.00 in)</li>
+	 * <li>ARCH_A (229x305 mm ; 9.00x12.00 in)</li>
+	 * <li><b>Announcement Envelopes</b></li>
+	 * <li>ANNENV_A2 (111x146 mm ; 4.37x5.75 in)</li>
+	 * <li>ANNENV_A6 (121x165 mm ; 4.75x6.50 in)</li>
+	 * <li>ANNENV_A7 (133x184 mm ; 5.25x7.25 in)</li>
+	 * <li>ANNENV_A8 (140x206 mm ; 5.50x8.12 in)</li>
+	 * <li>ANNENV_A10 (159x244 mm ; 6.25x9.62 in)</li>
+	 * <li>ANNENV_SLIM (98x225 mm ; 3.87x8.87 in)</li>
+	 * <li><b>Commercial Envelopes</b></li>
+	 * <li>COMMENV_N6_1/4 (89x152 mm ; 3.50x6.00 in)</li>
+	 * <li>COMMENV_N6_3/4 (92x165 mm ; 3.62x6.50 in)</li>
+	 * <li>COMMENV_N8 (98x191 mm ; 3.87x7.50 in)</li>
+	 * <li>COMMENV_N9 (98x225 mm ; 3.87x8.87 in)</li>
+	 * <li>COMMENV_N10 (105x241 mm ; 4.12x9.50 in)</li>
+	 * <li>COMMENV_N11 (114x263 mm ; 4.50x10.37 in)</li>
+	 * <li>COMMENV_N12 (121x279 mm ; 4.75x11.00 in)</li>
+	 * <li>COMMENV_N14 (127x292 mm ; 5.00x11.50 in)</li>
+	 * <li><b>Catalogue Envelopes</b></li>
+	 * <li>CATENV_N1 (152x229 mm ; 6.00x9.00 in)</li>
+	 * <li>CATENV_N1_3/4 (165x241 mm ; 6.50x9.50 in)</li>
+	 * <li>CATENV_N2 (165x254 mm ; 6.50x10.00 in)</li>
+	 * <li>CATENV_N3 (178x254 mm ; 7.00x10.00 in)</li>
+	 * <li>CATENV_N6 (191x267 mm ; 7.50x10.50 in)</li>
+	 * <li>CATENV_N7 (203x279 mm ; 8.00x11.00 in)</li>
+	 * <li>CATENV_N8 (210x286 mm ; 8.25x11.25 in)</li>
+	 * <li>CATENV_N9_1/2 (216x267 mm ; 8.50x10.50 in)</li>
+	 * <li>CATENV_N9_3/4 (222x286 mm ; 8.75x11.25 in)</li>
+	 * <li>CATENV_N10_1/2 (229x305 mm ; 9.00x12.00 in)</li>
+	 * <li>CATENV_N12_1/2 (241x318 mm ; 9.50x12.50 in)</li>
+	 * <li>CATENV_N13_1/2 (254x330 mm ; 10.00x13.00 in)</li>
+	 * <li>CATENV_N14_1/4 (286x311 mm ; 11.25x12.25 in)</li>
+	 * <li>CATENV_N14_1/2 (292x368 mm ; 11.50x14.50 in)</li>
+	 * <li><b>Japanese (JIS P 0138-61) Standard B-Series</b></li>
+	 * <li>JIS_B0 (1030x1456 mm ; 40.55x57.32 in)</li>
+	 * <li>JIS_B1 (728x1030 mm ; 28.66x40.55 in)</li>
+	 * <li>JIS_B2 (515x728 mm ; 20.28x28.66 in)</li>
+	 * <li>JIS_B3 (364x515 mm ; 14.33x20.28 in)</li>
+	 * <li>JIS_B4 (257x364 mm ; 10.12x14.33 in)</li>
+	 * <li>JIS_B5 (182x257 mm ; 7.17x10.12 in)</li>
+	 * <li>JIS_B6 (128x182 mm ; 5.04x7.17 in)</li>
+	 * <li>JIS_B7 (91x128 mm ; 3.58x5.04 in)</li>
+	 * <li>JIS_B8 (64x91 mm ; 2.52x3.58 in)</li>
+	 * <li>JIS_B9 (45x64 mm ; 1.77x2.52 in)</li>
+	 * <li>JIS_B10 (32x45 mm ; 1.26x1.77 in)</li>
+	 * <li>JIS_B11 (22x32 mm ; 0.87x1.26 in)</li>
+	 * <li>JIS_B12 (16x22 mm ; 0.63x0.87 in)</li>
+	 * <li><b>PA Series</b></li>
+	 * <li>PA0 (840x1120 mm ; 33.07x44.09 in)</li>
+	 * <li>PA1 (560x840 mm ; 22.05x33.07 in)</li>
+	 * <li>PA2 (420x560 mm ; 16.54x22.05 in)</li>
+	 * <li>PA3 (280x420 mm ; 11.02x16.54 in)</li>
+	 * <li>PA4 (210x280 mm ; 8.27x11.02 in)</li>
+	 * <li>PA5 (140x210 mm ; 5.51x8.27 in)</li>
+	 * <li>PA6 (105x140 mm ; 4.13x5.51 in)</li>
+	 * <li>PA7 (70x105 mm ; 2.76x4.13 in)</li>
+	 * <li>PA8 (52x70 mm ; 2.05x2.76 in)</li>
+	 * <li>PA9 (35x52 mm ; 1.38x2.05 in)</li>
+	 * <li>PA10 (26x35 mm ; 1.02x1.38 in)</li>
+	 * <li><b>Standard Photographic Print Sizes</b></li>
+	 * <li>PASSPORT_PHOTO (35x45 mm ; 1.38x1.77 in)</li>
+	 * <li>E (82x120 mm ; 3.25x4.72 in)</li>
+	 * <li>3R, L (89x127 mm ; 3.50x5.00 in)</li>
+	 * <li>4R, KG (102x152 mm ; 4.02x5.98 in)</li>
+	 * <li>4D (120x152 mm ; 4.72x5.98 in)</li>
+	 * <li>5R, 2L (127x178 mm ; 5.00x7.01 in)</li>
+	 * <li>6R, 8P (152x203 mm ; 5.98x7.99 in)</li>
+	 * <li>8R, 6P (203x254 mm ; 7.99x10.00 in)</li>
+	 * <li>S8R, 6PW (203x305 mm ; 7.99x12.01 in)</li>
+	 * <li>10R, 4P (254x305 mm ; 10.00x12.01 in)</li>
+	 * <li>S10R, 4PW (254x381 mm ; 10.00x15.00 in)</li>
+	 * <li>11R (279x356 mm ; 10.98x14.02 in)</li>
+	 * <li>S11R (279x432 mm ; 10.98x17.01 in)</li>
+	 * <li>12R (305x381 mm ; 12.01x15.00 in)</li>
+	 * <li>S12R (305x456 mm ; 12.01x17.95 in)</li>
+	 * <li><b>Common Newspaper Sizes</b></li>
+	 * <li>NEWSPAPER_BROADSHEET (750x600 mm ; 29.53x23.62 in)</li>
+	 * <li>NEWSPAPER_BERLINER (470x315 mm ; 18.50x12.40 in)</li>
+	 * <li>NEWSPAPER_COMPACT, NEWSPAPER_TABLOID (430x280 mm ; 16.93x11.02 in)</li>
+	 * <li><b>Business Cards</b></li>
+	 * <li>CREDIT_CARD, BUSINESS_CARD, BUSINESS_CARD_ISO7810 (54x86 mm ; 2.13x3.37 in)</li>
+	 * <li>BUSINESS_CARD_ISO216 (52x74 mm ; 2.05x2.91 in)</li>
+	 * <li>BUSINESS_CARD_IT, BUSINESS_CARD_UK, BUSINESS_CARD_FR, BUSINESS_CARD_DE, BUSINESS_CARD_ES (55x85 mm ; 2.17x3.35 in)</li>
+	 * <li>BUSINESS_CARD_US, BUSINESS_CARD_CA (51x89 mm ; 2.01x3.50 in)</li>
+	 * <li>BUSINESS_CARD_JP (55x91 mm ; 2.17x3.58 in)</li>
+	 * <li>BUSINESS_CARD_HK (54x90 mm ; 2.13x3.54 in)</li>
+	 * <li>BUSINESS_CARD_AU, BUSINESS_CARD_DK, BUSINESS_CARD_SE (55x90 mm ; 2.17x3.54 in)</li>
+	 * <li>BUSINESS_CARD_RU, BUSINESS_CARD_CZ, BUSINESS_CARD_FI, BUSINESS_CARD_HU, BUSINESS_CARD_IL (50x90 mm ; 1.97x3.54 in)</li>
+	 * <li><b>Billboards</b></li>
+	 * <li>4SHEET (1016x1524 mm ; 40.00x60.00 in)</li>
+	 * <li>6SHEET (1200x1800 mm ; 47.24x70.87 in)</li>
+	 * <li>12SHEET (3048x1524 mm ; 120.00x60.00 in)</li>
+	 * <li>16SHEET (2032x3048 mm ; 80.00x120.00 in)</li>
+	 * <li>32SHEET (4064x3048 mm ; 160.00x120.00 in)</li>
+	 * <li>48SHEET (6096x3048 mm ; 240.00x120.00 in)</li>
+	 * <li>64SHEET (8128x3048 mm ; 320.00x120.00 in)</li>
+	 * <li>96SHEET (12192x3048 mm ; 480.00x120.00 in)</li>
+	 * <li><b>Old Imperial English (some are still used in USA)</b></li>
+	 * <li>EN_EMPEROR (1219x1829 mm ; 48.00x72.00 in)</li>
+	 * <li>EN_ANTIQUARIAN (787x1346 mm ; 31.00x53.00 in)</li>
+	 * <li>EN_GRAND_EAGLE (730x1067 mm ; 28.75x42.00 in)</li>
+	 * <li>EN_DOUBLE_ELEPHANT (679x1016 mm ; 26.75x40.00 in)</li>
+	 * <li>EN_ATLAS (660x864 mm ; 26.00x34.00 in)</li>
+	 * <li>EN_COLOMBIER (597x876 mm ; 23.50x34.50 in)</li>
+	 * <li>EN_ELEPHANT (584x711 mm ; 23.00x28.00 in)</li>
+	 * <li>EN_DOUBLE_DEMY (572x902 mm ; 22.50x35.50 in)</li>
+	 * <li>EN_IMPERIAL (559x762 mm ; 22.00x30.00 in)</li>
+	 * <li>EN_PRINCESS (546x711 mm ; 21.50x28.00 in)</li>
+	 * <li>EN_CARTRIDGE (533x660 mm ; 21.00x26.00 in)</li>
+	 * <li>EN_DOUBLE_LARGE_POST (533x838 mm ; 21.00x33.00 in)</li>
+	 * <li>EN_ROYAL (508x635 mm ; 20.00x25.00 in)</li>
+	 * <li>EN_SHEET, EN_HALF_POST (495x597 mm ; 19.50x23.50 in)</li>
+	 * <li>EN_SUPER_ROYAL (483x686 mm ; 19.00x27.00 in)</li>
+	 * <li>EN_DOUBLE_POST (483x775 mm ; 19.00x30.50 in)</li>
+	 * <li>EN_MEDIUM (445x584 mm ; 17.50x23.00 in)</li>
+	 * <li>EN_DEMY (445x572 mm ; 17.50x22.50 in)</li>
+	 * <li>EN_LARGE_POST (419x533 mm ; 16.50x21.00 in)</li>
+	 * <li>EN_COPY_DRAUGHT (406x508 mm ; 16.00x20.00 in)</li>
+	 * <li>EN_POST (394x489 mm ; 15.50x19.25 in)</li>
+	 * <li>EN_CROWN (381x508 mm ; 15.00x20.00 in)</li>
+	 * <li>EN_PINCHED_POST (375x470 mm ; 14.75x18.50 in)</li>
+	 * <li>EN_BRIEF (343x406 mm ; 13.50x16.00 in)</li>
+	 * <li>EN_FOOLSCAP (343x432 mm ; 13.50x17.00 in)</li>
+	 * <li>EN_SMALL_FOOLSCAP (337x419 mm ; 13.25x16.50 in)</li>
+	 * <li>EN_POTT (318x381 mm ; 12.50x15.00 in)</li>
+	 * <li><b>Old Imperial Belgian</b></li>
+	 * <li>BE_GRAND_AIGLE (700x1040 mm ; 27.56x40.94 in)</li>
+	 * <li>BE_COLOMBIER (620x850 mm ; 24.41x33.46 in)</li>
+	 * <li>BE_DOUBLE_CARRE (620x920 mm ; 24.41x36.22 in)</li>
+	 * <li>BE_ELEPHANT (616x770 mm ; 24.25x30.31 in)</li>
+	 * <li>BE_PETIT_AIGLE (600x840 mm ; 23.62x33.07 in)</li>
+	 * <li>BE_GRAND_JESUS (550x730 mm ; 21.65x28.74 in)</li>
+	 * <li>BE_JESUS (540x730 mm ; 21.26x28.74 in)</li>
+	 * <li>BE_RAISIN (500x650 mm ; 19.69x25.59 in)</li>
+	 * <li>BE_GRAND_MEDIAN (460x605 mm ; 18.11x23.82 in)</li>
+	 * <li>BE_DOUBLE_POSTE (435x565 mm ; 17.13x22.24 in)</li>
+	 * <li>BE_COQUILLE (430x560 mm ; 16.93x22.05 in)</li>
+	 * <li>BE_PETIT_MEDIAN (415x530 mm ; 16.34x20.87 in)</li>
+	 * <li>BE_RUCHE (360x460 mm ; 14.17x18.11 in)</li>
+	 * <li>BE_PROPATRIA (345x430 mm ; 13.58x16.93 in)</li>
+	 * <li>BE_LYS (317x397 mm ; 12.48x15.63 in)</li>
+	 * <li>BE_POT (307x384 mm ; 12.09x15.12 in)</li>
+	 * <li>BE_ROSETTE (270x347 mm ; 10.63x13.66 in)</li>
+	 * <li><b>Old Imperial French</b></li>
+	 * <li>FR_UNIVERS (1000x1300 mm ; 39.37x51.18 in)</li>
+	 * <li>FR_DOUBLE_COLOMBIER (900x1260 mm ; 35.43x49.61 in)</li>
+	 * <li>FR_GRANDE_MONDE (900x1260 mm ; 35.43x49.61 in)</li>
+	 * <li>FR_DOUBLE_SOLEIL (800x1200 mm ; 31.50x47.24 in)</li>
+	 * <li>FR_DOUBLE_JESUS (760x1120 mm ; 29.92x44.09 in)</li>
+	 * <li>FR_GRAND_AIGLE (750x1060 mm ; 29.53x41.73 in)</li>
+	 * <li>FR_PETIT_AIGLE (700x940 mm ; 27.56x37.01 in)</li>
+	 * <li>FR_DOUBLE_RAISIN (650x1000 mm ; 25.59x39.37 in)</li>
+	 * <li>FR_JOURNAL (650x940 mm ; 25.59x37.01 in)</li>
+	 * <li>FR_COLOMBIER_AFFICHE (630x900 mm ; 24.80x35.43 in)</li>
+	 * <li>FR_DOUBLE_CAVALIER (620x920 mm ; 24.41x36.22 in)</li>
+	 * <li>FR_CLOCHE (600x800 mm ; 23.62x31.50 in)</li>
+	 * <li>FR_SOLEIL (600x800 mm ; 23.62x31.50 in)</li>
+	 * <li>FR_DOUBLE_CARRE (560x900 mm ; 22.05x35.43 in)</li>
+	 * <li>FR_DOUBLE_COQUILLE (560x880 mm ; 22.05x34.65 in)</li>
+	 * <li>FR_JESUS (560x760 mm ; 22.05x29.92 in)</li>
+	 * <li>FR_RAISIN (500x650 mm ; 19.69x25.59 in)</li>
+	 * <li>FR_CAVALIER (460x620 mm ; 18.11x24.41 in)</li>
+	 * <li>FR_DOUBLE_COURONNE (460x720 mm ; 18.11x28.35 in)</li>
+	 * <li>FR_CARRE (450x560 mm ; 17.72x22.05 in)</li>
+	 * <li>FR_COQUILLE (440x560 mm ; 17.32x22.05 in)</li>
+	 * <li>FR_DOUBLE_TELLIERE (440x680 mm ; 17.32x26.77 in)</li>
+	 * <li>FR_DOUBLE_CLOCHE (400x600 mm ; 15.75x23.62 in)</li>
+	 * <li>FR_DOUBLE_POT (400x620 mm ; 15.75x24.41 in)</li>
+	 * <li>FR_ECU (400x520 mm ; 15.75x20.47 in)</li>
+	 * <li>FR_COURONNE (360x460 mm ; 14.17x18.11 in)</li>
+	 * <li>FR_TELLIERE (340x440 mm ; 13.39x17.32 in)</li>
+	 * <li>FR_POT (310x400 mm ; 12.20x15.75 in)</li>
+	 * </ul>
+	 * @return array containing page width and height in points
+	 * @since 5.0.010 (2010-05-17)
+	 * @public static
+	 */
+	public static function getPageSizeFromFormat($format) {
+		// Paper cordinates are calculated in this way: (inches * 72) where (1 inch = 25.4 mm)
+		switch (strtoupper($format)) {
+			// ISO 216 A Series + 2 SIS 014711 extensions
+			case 'A0' : {$pf = array( 2383.937, 3370.394); break;}
+			case 'A1' : {$pf = array( 1683.780, 2383.937); break;}
+			case 'A2' : {$pf = array( 1190.551, 1683.780); break;}
+			case 'A3' : {$pf = array(  841.890, 1190.551); break;}
+			case 'A4' : {$pf = array(  595.276,  841.890); break;}
+			case 'A5' : {$pf = array(  419.528,  595.276); break;}
+			case 'A6' : {$pf = array(  297.638,  419.528); break;}
+			case 'A7' : {$pf = array(  209.764,  297.638); break;}
+			case 'A8' : {$pf = array(  147.402,  209.764); break;}
+			case 'A9' : {$pf = array(  104.882,  147.402); break;}
+			case 'A10': {$pf = array(   73.701,  104.882); break;}
+			case 'A11': {$pf = array(   51.024,   73.701); break;}
+			case 'A12': {$pf = array(   36.850,   51.024); break;}
+			// ISO 216 B Series + 2 SIS 014711 extensions
+			case 'B0' : {$pf = array( 2834.646, 4008.189); break;}
+			case 'B1' : {$pf = array( 2004.094, 2834.646); break;}
+			case 'B2' : {$pf = array( 1417.323, 2004.094); break;}
+			case 'B3' : {$pf = array( 1000.630, 1417.323); break;}
+			case 'B4' : {$pf = array(  708.661, 1000.630); break;}
+			case 'B5' : {$pf = array(  498.898,  708.661); break;}
+			case 'B6' : {$pf = array(  354.331,  498.898); break;}
+			case 'B7' : {$pf = array(  249.449,  354.331); break;}
+			case 'B8' : {$pf = array(  175.748,  249.449); break;}
+			case 'B9' : {$pf = array(  124.724,  175.748); break;}
+			case 'B10': {$pf = array(   87.874,  124.724); break;}
+			case 'B11': {$pf = array(   62.362,   87.874); break;}
+			case 'B12': {$pf = array(   42.520,   62.362); break;}
+			// ISO 216 C Series + 2 SIS 014711 extensions + 2 EXTENSION
+			case 'C0' : {$pf = array( 2599.370, 3676.535); break;}
+			case 'C1' : {$pf = array( 1836.850, 2599.370); break;}
+			case 'C2' : {$pf = array( 1298.268, 1836.850); break;}
+			case 'C3' : {$pf = array(  918.425, 1298.268); break;}
+			case 'C4' : {$pf = array(  649.134,  918.425); break;}
+			case 'C5' : {$pf = array(  459.213,  649.134); break;}
+			case 'C6' : {$pf = array(  323.150,  459.213); break;}
+			case 'C7' : {$pf = array(  229.606,  323.150); break;}
+			case 'C8' : {$pf = array(  161.575,  229.606); break;}
+			case 'C9' : {$pf = array(  113.386,  161.575); break;}
+			case 'C10': {$pf = array(   79.370,  113.386); break;}
+			case 'C11': {$pf = array(   56.693,   79.370); break;}
+			case 'C12': {$pf = array(   39.685,   56.693); break;}
+			case 'C76': {$pf = array(  229.606,  459.213); break;}
+			case 'DL' : {$pf = array(  311.811,  623.622); break;}
+			// SIS 014711 E Series
+			case 'E0' : {$pf = array( 2491.654, 3517.795); break;}
+			case 'E1' : {$pf = array( 1757.480, 2491.654); break;}
+			case 'E2' : {$pf = array( 1247.244, 1757.480); break;}
+			case 'E3' : {$pf = array(  878.740, 1247.244); break;}
+			case 'E4' : {$pf = array(  623.622,  878.740); break;}
+			case 'E5' : {$pf = array(  439.370,  623.622); break;}
+			case 'E6' : {$pf = array(  311.811,  439.370); break;}
+			case 'E7' : {$pf = array(  221.102,  311.811); break;}
+			case 'E8' : {$pf = array(  155.906,  221.102); break;}
+			case 'E9' : {$pf = array(  110.551,  155.906); break;}
+			case 'E10': {$pf = array(   76.535,  110.551); break;}
+			case 'E11': {$pf = array(   53.858,   76.535); break;}
+			case 'E12': {$pf = array(   36.850,   53.858); break;}
+			// SIS 014711 G Series
+			case 'G0' : {$pf = array( 2715.591, 3838.110); break;}
+			case 'G1' : {$pf = array( 1919.055, 2715.591); break;}
+			case 'G2' : {$pf = array( 1357.795, 1919.055); break;}
+			case 'G3' : {$pf = array(  958.110, 1357.795); break;}
+			case 'G4' : {$pf = array(  677.480,  958.110); break;}
+			case 'G5' : {$pf = array(  479.055,  677.480); break;}
+			case 'G6' : {$pf = array(  337.323,  479.055); break;}
+			case 'G7' : {$pf = array(  238.110,  337.323); break;}
+			case 'G8' : {$pf = array(  167.244,  238.110); break;}
+			case 'G9' : {$pf = array(  119.055,  167.244); break;}
+			case 'G10': {$pf = array(   82.205,  119.055); break;}
+			case 'G11': {$pf = array(   59.528,   82.205); break;}
+			case 'G12': {$pf = array(   39.685,   59.528); break;}
+			// ISO Press
+			case 'RA0': {$pf = array( 2437.795, 3458.268); break;}
+			case 'RA1': {$pf = array( 1729.134, 2437.795); break;}
+			case 'RA2': {$pf = array( 1218.898, 1729.134); break;}
+			case 'RA3': {$pf = array(  864.567, 1218.898); break;}
+			case 'RA4': {$pf = array(  609.449,  864.567); break;}
+			case 'SRA0': {$pf = array( 2551.181, 3628.346); break;}
+			case 'SRA1': {$pf = array( 1814.173, 2551.181); break;}
+			case 'SRA2': {$pf = array( 1275.591, 1814.173); break;}
+			case 'SRA3': {$pf = array(  907.087, 1275.591); break;}
+			case 'SRA4': {$pf = array(  637.795,  907.087); break;}
+			// German  DIN 476
+			case '4A0': {$pf = array( 4767.874, 6740.787); break;}
+			case '2A0': {$pf = array( 3370.394, 4767.874); break;}
+			// Variations on the ISO Standard
+			case 'A2_EXTRA'   : {$pf = array( 1261.417, 1754.646); break;}
+			case 'A3+'        : {$pf = array(  932.598, 1369.134); break;}
+			case 'A3_EXTRA'   : {$pf = array(  912.756, 1261.417); break;}
+			case 'A3_SUPER'   : {$pf = array(  864.567, 1440.000); break;}
+			case 'SUPER_A3'   : {$pf = array(  864.567, 1380.472); break;}
+			case 'A4_EXTRA'   : {$pf = array(  666.142,  912.756); break;}
+			case 'A4_SUPER'   : {$pf = array(  649.134,  912.756); break;}
+			case 'SUPER_A4'   : {$pf = array(  643.465, 1009.134); break;}
+			case 'A4_LONG'    : {$pf = array(  595.276,  986.457); break;}
+			case 'F4'         : {$pf = array(  595.276,  935.433); break;}
+			case 'SO_B5_EXTRA': {$pf = array(  572.598,  782.362); break;}
+			case 'A5_EXTRA'   : {$pf = array(  490.394,  666.142); break;}
+			// ANSI Series
+			case 'ANSI_E': {$pf = array( 2448.000, 3168.000); break;}
+			case 'ANSI_D': {$pf = array( 1584.000, 2448.000); break;}
+			case 'ANSI_C': {$pf = array( 1224.000, 1584.000); break;}
+			case 'ANSI_B': {$pf = array(  792.000, 1224.000); break;}
+			case 'ANSI_A': {$pf = array(  612.000,  792.000); break;}
+			// Traditional 'Loose' North American Paper Sizes
+			case 'USLEDGER':
+			case 'LEDGER' : {$pf = array( 1224.000,  792.000); break;}
+			case 'ORGANIZERK':
+			case 'BIBLE':
+			case 'USTABLOID':
+			case 'TABLOID': {$pf = array(  792.000, 1224.000); break;}
+			case 'ORGANIZERM':
+			case 'USLETTER':
+			case 'LETTER' : {$pf = array(  612.000,  792.000); break;}
+			case 'USLEGAL':
+			case 'LEGAL'  : {$pf = array(  612.000, 1008.000); break;}
+			case 'GOVERNMENTLETTER':
+			case 'GLETTER': {$pf = array(  576.000,  756.000); break;}
+			case 'JUNIORLEGAL':
+			case 'JLEGAL' : {$pf = array(  576.000,  360.000); break;}
+			// Other North American Paper Sizes
+			case 'QUADDEMY': {$pf = array( 2520.000, 3240.000); break;}
+			case 'SUPER_B': {$pf = array(  936.000, 1368.000); break;}
+			case 'QUARTO': {$pf = array(  648.000,  792.000); break;}
+			case 'GOVERNMENTLEGAL':
+			case 'FOLIO': {$pf = array(  612.000,  936.000); break;}
+			case 'MONARCH':
+			case 'EXECUTIVE': {$pf = array(  522.000,  756.000); break;}
+			case 'ORGANIZERL':
+			case 'STATEMENT':
+			case 'MEMO': {$pf = array(  396.000,  612.000); break;}
+			case 'FOOLSCAP': {$pf = array(  595.440,  936.000); break;}
+			case 'COMPACT': {$pf = array(  306.000,  486.000); break;}
+			case 'ORGANIZERJ': {$pf = array(  198.000,  360.000); break;}
+			// Canadian standard CAN 2-9.60M
+			case 'P1': {$pf = array( 1587.402, 2437.795); break;}
+			case 'P2': {$pf = array( 1218.898, 1587.402); break;}
+			case 'P3': {$pf = array(  793.701, 1218.898); break;}
+			case 'P4': {$pf = array(  609.449,  793.701); break;}
+			case 'P5': {$pf = array(  396.850,  609.449); break;}
+			case 'P6': {$pf = array(  303.307,  396.850); break;}
+			// North American Architectural Sizes
+			case 'ARCH_E' : {$pf = array( 2592.000, 3456.000); break;}
+			case 'ARCH_E1': {$pf = array( 2160.000, 3024.000); break;}
+			case 'ARCH_D' : {$pf = array( 1728.000, 2592.000); break;}
+			case 'BROADSHEET':
+			case 'ARCH_C' : {$pf = array( 1296.000, 1728.000); break;}
+			case 'ARCH_B' : {$pf = array(  864.000, 1296.000); break;}
+			case 'ARCH_A' : {$pf = array(  648.000,  864.000); break;}
+			// --- North American Envelope Sizes ---
+			//   - Announcement Envelopes
+			case 'ANNENV_A2'  : {$pf = array(  314.640,  414.000); break;}
+			case 'ANNENV_A6'  : {$pf = array(  342.000,  468.000); break;}
+			case 'ANNENV_A7'  : {$pf = array(  378.000,  522.000); break;}
+			case 'ANNENV_A8'  : {$pf = array(  396.000,  584.640); break;}
+			case 'ANNENV_A10' : {$pf = array(  450.000,  692.640); break;}
+			case 'ANNENV_SLIM': {$pf = array(  278.640,  638.640); break;}
+			//   - Commercial Envelopes
+			case 'COMMENV_N6_1/4': {$pf = array(  252.000,  432.000); break;}
+			case 'COMMENV_N6_3/4': {$pf = array(  260.640,  468.000); break;}
+			case 'COMMENV_N8'    : {$pf = array(  278.640,  540.000); break;}
+			case 'COMMENV_N9'    : {$pf = array(  278.640,  638.640); break;}
+			case 'COMMENV_N10'   : {$pf = array(  296.640,  684.000); break;}
+			case 'COMMENV_N11'   : {$pf = array(  324.000,  746.640); break;}
+			case 'COMMENV_N12'   : {$pf = array(  342.000,  792.000); break;}
+			case 'COMMENV_N14'   : {$pf = array(  360.000,  828.000); break;}
+			//   - Catalogue Envelopes
+			case 'CATENV_N1'     : {$pf = array(  432.000,  648.000); break;}
+			case 'CATENV_N1_3/4' : {$pf = array(  468.000,  684.000); break;}
+			case 'CATENV_N2'     : {$pf = array(  468.000,  720.000); break;}
+			case 'CATENV_N3'     : {$pf = array(  504.000,  720.000); break;}
+			case 'CATENV_N6'     : {$pf = array(  540.000,  756.000); break;}
+			case 'CATENV_N7'     : {$pf = array(  576.000,  792.000); break;}
+			case 'CATENV_N8'     : {$pf = array(  594.000,  810.000); break;}
+			case 'CATENV_N9_1/2' : {$pf = array(  612.000,  756.000); break;}
+			case 'CATENV_N9_3/4' : {$pf = array(  630.000,  810.000); break;}
+			case 'CATENV_N10_1/2': {$pf = array(  648.000,  864.000); break;}
+			case 'CATENV_N12_1/2': {$pf = array(  684.000,  900.000); break;}
+			case 'CATENV_N13_1/2': {$pf = array(  720.000,  936.000); break;}
+			case 'CATENV_N14_1/4': {$pf = array(  810.000,  882.000); break;}
+			case 'CATENV_N14_1/2': {$pf = array(  828.000, 1044.000); break;}
+			// Japanese (JIS P 0138-61) Standard B-Series
+			case 'JIS_B0' : {$pf = array( 2919.685, 4127.244); break;}
+			case 'JIS_B1' : {$pf = array( 2063.622, 2919.685); break;}
+			case 'JIS_B2' : {$pf = array( 1459.843, 2063.622); break;}
+			case 'JIS_B3' : {$pf = array( 1031.811, 1459.843); break;}
+			case 'JIS_B4' : {$pf = array(  728.504, 1031.811); break;}
+			case 'JIS_B5' : {$pf = array(  515.906,  728.504); break;}
+			case 'JIS_B6' : {$pf = array(  362.835,  515.906); break;}
+			case 'JIS_B7' : {$pf = array(  257.953,  362.835); break;}
+			case 'JIS_B8' : {$pf = array(  181.417,  257.953); break;}
+			case 'JIS_B9' : {$pf = array(  127.559,  181.417); break;}
+			case 'JIS_B10': {$pf = array(   90.709,  127.559); break;}
+			case 'JIS_B11': {$pf = array(   62.362,   90.709); break;}
+			case 'JIS_B12': {$pf = array(   45.354,   62.362); break;}
+			// PA Series
+			case 'PA0' : {$pf = array( 2381.102, 3174.803,); break;}
+			case 'PA1' : {$pf = array( 1587.402, 2381.102); break;}
+			case 'PA2' : {$pf = array( 1190.551, 1587.402); break;}
+			case 'PA3' : {$pf = array(  793.701, 1190.551); break;}
+			case 'PA4' : {$pf = array(  595.276,  793.701); break;}
+			case 'PA5' : {$pf = array(  396.850,  595.276); break;}
+			case 'PA6' : {$pf = array(  297.638,  396.850); break;}
+			case 'PA7' : {$pf = array(  198.425,  297.638); break;}
+			case 'PA8' : {$pf = array(  147.402,  198.425); break;}
+			case 'PA9' : {$pf = array(   99.213,  147.402); break;}
+			case 'PA10': {$pf = array(   73.701,   99.213); break;}
+			// Standard Photographic Print Sizes
+			case 'PASSPORT_PHOTO': {$pf = array(   99.213,  127.559); break;}
+			case 'E'   : {$pf = array(  233.858,  340.157); break;}
+			case 'L':
+			case '3R'  : {$pf = array(  252.283,  360.000); break;}
+			case 'KG':
+			case '4R'  : {$pf = array(  289.134,  430.866); break;}
+			case '4D'  : {$pf = array(  340.157,  430.866); break;}
+			case '2L':
+			case '5R'  : {$pf = array(  360.000,  504.567); break;}
+			case '8P':
+			case '6R'  : {$pf = array(  430.866,  575.433); break;}
+			case '6P':
+			case '8R'  : {$pf = array(  575.433,  720.000); break;}
+			case '6PW':
+			case 'S8R' : {$pf = array(  575.433,  864.567); break;}
+			case '4P':
+			case '10R' : {$pf = array(  720.000,  864.567); break;}
+			case '4PW':
+			case 'S10R': {$pf = array(  720.000, 1080.000); break;}
+			case '11R' : {$pf = array(  790.866, 1009.134); break;}
+			case 'S11R': {$pf = array(  790.866, 1224.567); break;}
+			case '12R' : {$pf = array(  864.567, 1080.000); break;}
+			case 'S12R': {$pf = array(  864.567, 1292.598); break;}
+			// Common Newspaper Sizes
+			case 'NEWSPAPER_BROADSHEET': {$pf = array( 2125.984, 1700.787); break;}
+			case 'NEWSPAPER_BERLINER'  : {$pf = array( 1332.283,  892.913); break;}
+			case 'NEWSPAPER_TABLOID':
+			case 'NEWSPAPER_COMPACT'   : {$pf = array( 1218.898,  793.701); break;}
+			// Business Cards
+			case 'CREDIT_CARD':
+			case 'BUSINESS_CARD':
+			case 'BUSINESS_CARD_ISO7810': {$pf = array(  153.014,  242.646); break;}
+			case 'BUSINESS_CARD_ISO216' : {$pf = array(  147.402,  209.764); break;}
+			case 'BUSINESS_CARD_IT':
+			case 'BUSINESS_CARD_UK':
+			case 'BUSINESS_CARD_FR':
+			case 'BUSINESS_CARD_DE':
+			case 'BUSINESS_CARD_ES'     : {$pf = array(  155.906,  240.945); break;}
+			case 'BUSINESS_CARD_CA':
+			case 'BUSINESS_CARD_US'     : {$pf = array(  144.567,  252.283); break;}
+			case 'BUSINESS_CARD_JP'     : {$pf = array(  155.906,  257.953); break;}
+			case 'BUSINESS_CARD_HK'     : {$pf = array(  153.071,  255.118); break;}
+			case 'BUSINESS_CARD_AU':
+			case 'BUSINESS_CARD_DK':
+			case 'BUSINESS_CARD_SE'     : {$pf = array(  155.906,  255.118); break;}
+			case 'BUSINESS_CARD_RU':
+			case 'BUSINESS_CARD_CZ':
+			case 'BUSINESS_CARD_FI':
+			case 'BUSINESS_CARD_HU':
+			case 'BUSINESS_CARD_IL'     : {$pf = array(  141.732,  255.118); break;}
+			// Billboards
+			case '4SHEET' : {$pf = array( 2880.000, 4320.000); break;}
+			case '6SHEET' : {$pf = array( 3401.575, 5102.362); break;}
+			case '12SHEET': {$pf = array( 8640.000, 4320.000); break;}
+			case '16SHEET': {$pf = array( 5760.000, 8640.000); break;}
+			case '32SHEET': {$pf = array(11520.000, 8640.000); break;}
+			case '48SHEET': {$pf = array(17280.000, 8640.000); break;}
+			case '64SHEET': {$pf = array(23040.000, 8640.000); break;}
+			case '96SHEET': {$pf = array(34560.000, 8640.000); break;}
+			// Old European Sizes
+			//   - Old Imperial English Sizes
+			case 'EN_EMPEROR'          : {$pf = array( 3456.000, 5184.000); break;}
+			case 'EN_ANTIQUARIAN'      : {$pf = array( 2232.000, 3816.000); break;}
+			case 'EN_GRAND_EAGLE'      : {$pf = array( 2070.000, 3024.000); break;}
+			case 'EN_DOUBLE_ELEPHANT'  : {$pf = array( 1926.000, 2880.000); break;}
+			case 'EN_ATLAS'            : {$pf = array( 1872.000, 2448.000); break;}
+			case 'EN_COLOMBIER'        : {$pf = array( 1692.000, 2484.000); break;}
+			case 'EN_ELEPHANT'         : {$pf = array( 1656.000, 2016.000); break;}
+			case 'EN_DOUBLE_DEMY'      : {$pf = array( 1620.000, 2556.000); break;}
+			case 'EN_IMPERIAL'         : {$pf = array( 1584.000, 2160.000); break;}
+			case 'EN_PRINCESS'         : {$pf = array( 1548.000, 2016.000); break;}
+			case 'EN_CARTRIDGE'        : {$pf = array( 1512.000, 1872.000); break;}
+			case 'EN_DOUBLE_LARGE_POST': {$pf = array( 1512.000, 2376.000); break;}
+			case 'EN_ROYAL'            : {$pf = array( 1440.000, 1800.000); break;}
+			case 'EN_SHEET':
+			case 'EN_HALF_POST'        : {$pf = array( 1404.000, 1692.000); break;}
+			case 'EN_SUPER_ROYAL'      : {$pf = array( 1368.000, 1944.000); break;}
+			case 'EN_DOUBLE_POST'      : {$pf = array( 1368.000, 2196.000); break;}
+			case 'EN_MEDIUM'           : {$pf = array( 1260.000, 1656.000); break;}
+			case 'EN_DEMY'             : {$pf = array( 1260.000, 1620.000); break;}
+			case 'EN_LARGE_POST'       : {$pf = array( 1188.000, 1512.000); break;}
+			case 'EN_COPY_DRAUGHT'     : {$pf = array( 1152.000, 1440.000); break;}
+			case 'EN_POST'             : {$pf = array( 1116.000, 1386.000); break;}
+			case 'EN_CROWN'            : {$pf = array( 1080.000, 1440.000); break;}
+			case 'EN_PINCHED_POST'     : {$pf = array( 1062.000, 1332.000); break;}
+			case 'EN_BRIEF'            : {$pf = array(  972.000, 1152.000); break;}
+			case 'EN_FOOLSCAP'         : {$pf = array(  972.000, 1224.000); break;}
+			case 'EN_SMALL_FOOLSCAP'   : {$pf = array(  954.000, 1188.000); break;}
+			case 'EN_POTT'             : {$pf = array(  900.000, 1080.000); break;}
+			//   - Old Imperial Belgian Sizes
+			case 'BE_GRAND_AIGLE' : {$pf = array( 1984.252, 2948.031); break;}
+			case 'BE_COLOMBIER'   : {$pf = array( 1757.480, 2409.449); break;}
+			case 'BE_DOUBLE_CARRE': {$pf = array( 1757.480, 2607.874); break;}
+			case 'BE_ELEPHANT'    : {$pf = array( 1746.142, 2182.677); break;}
+			case 'BE_PETIT_AIGLE' : {$pf = array( 1700.787, 2381.102); break;}
+			case 'BE_GRAND_JESUS' : {$pf = array( 1559.055, 2069.291); break;}
+			case 'BE_JESUS'       : {$pf = array( 1530.709, 2069.291); break;}
+			case 'BE_RAISIN'      : {$pf = array( 1417.323, 1842.520); break;}
+			case 'BE_GRAND_MEDIAN': {$pf = array( 1303.937, 1714.961); break;}
+			case 'BE_DOUBLE_POSTE': {$pf = array( 1233.071, 1601.575); break;}
+			case 'BE_COQUILLE'    : {$pf = array( 1218.898, 1587.402); break;}
+			case 'BE_PETIT_MEDIAN': {$pf = array( 1176.378, 1502.362); break;}
+			case 'BE_RUCHE'       : {$pf = array( 1020.472, 1303.937); break;}
+			case 'BE_PROPATRIA'   : {$pf = array(  977.953, 1218.898); break;}
+			case 'BE_LYS'         : {$pf = array(  898.583, 1125.354); break;}
+			case 'BE_POT'         : {$pf = array(  870.236, 1088.504); break;}
+			case 'BE_ROSETTE'     : {$pf = array(  765.354,  983.622); break;}
+			//   - Old Imperial French Sizes
+			case 'FR_UNIVERS'          : {$pf = array( 2834.646, 3685.039); break;}
+			case 'FR_DOUBLE_COLOMBIER' : {$pf = array( 2551.181, 3571.654); break;}
+			case 'FR_GRANDE_MONDE'     : {$pf = array( 2551.181, 3571.654); break;}
+			case 'FR_DOUBLE_SOLEIL'    : {$pf = array( 2267.717, 3401.575); break;}
+			case 'FR_DOUBLE_JESUS'     : {$pf = array( 2154.331, 3174.803); break;}
+			case 'FR_GRAND_AIGLE'      : {$pf = array( 2125.984, 3004.724); break;}
+			case 'FR_PETIT_AIGLE'      : {$pf = array( 1984.252, 2664.567); break;}
+			case 'FR_DOUBLE_RAISIN'    : {$pf = array( 1842.520, 2834.646); break;}
+			case 'FR_JOURNAL'          : {$pf = array( 1842.520, 2664.567); break;}
+			case 'FR_COLOMBIER_AFFICHE': {$pf = array( 1785.827, 2551.181); break;}
+			case 'FR_DOUBLE_CAVALIER'  : {$pf = array( 1757.480, 2607.874); break;}
+			case 'FR_CLOCHE'           : {$pf = array( 1700.787, 2267.717); break;}
+			case 'FR_SOLEIL'           : {$pf = array( 1700.787, 2267.717); break;}
+			case 'FR_DOUBLE_CARRE'     : {$pf = array( 1587.402, 2551.181); break;}
+			case 'FR_DOUBLE_COQUILLE'  : {$pf = array( 1587.402, 2494.488); break;}
+			case 'FR_JESUS'            : {$pf = array( 1587.402, 2154.331); break;}
+			case 'FR_RAISIN'           : {$pf = array( 1417.323, 1842.520); break;}
+			case 'FR_CAVALIER'         : {$pf = array( 1303.937, 1757.480); break;}
+			case 'FR_DOUBLE_COURONNE'  : {$pf = array( 1303.937, 2040.945); break;}
+			case 'FR_CARRE'            : {$pf = array( 1275.591, 1587.402); break;}
+			case 'FR_COQUILLE'         : {$pf = array( 1247.244, 1587.402); break;}
+			case 'FR_DOUBLE_TELLIERE'  : {$pf = array( 1247.244, 1927.559); break;}
+			case 'FR_DOUBLE_CLOCHE'    : {$pf = array( 1133.858, 1700.787); break;}
+			case 'FR_DOUBLE_POT'       : {$pf = array( 1133.858, 1757.480); break;}
+			case 'FR_ECU'              : {$pf = array( 1133.858, 1474.016); break;}
+			case 'FR_COURONNE'         : {$pf = array( 1020.472, 1303.937); break;}
+			case 'FR_TELLIERE'         : {$pf = array(  963.780, 1247.244); break;}
+			case 'FR_POT'              : {$pf = array(  878.740, 1133.858); break;}
+			// DEFAULT ISO A4
+			default: {$pf = array(  595.276,  841.890); break;}
+		}
+		return $pf;
+	}
+
+	/**
+	 * Set page boundaries.
+	 * @param $page (int) page number
+	 * @param $type (string) valid values are: <ul><li>'MediaBox' : the boundaries of the physical medium on which the page shall be displayed or printed;</li><li>'CropBox' : the visible region of default user space;</li><li>'BleedBox' : the region to which the contents of the page shall be clipped when output in a production environment;</li><li>'TrimBox' : the intended dimensions of the finished page after trimming;</li><li>'ArtBox' : the page's meaningful content (including potential white space).</li></ul>
+	 * @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:<ul><li>SinglePage Display one page at a time</li><li>OneColumn Display the pages in one column</li><li>TwoColumnLeft Display the pages in two columns, with odd-numbered pages on the left</li><li>TwoColumnRight Display the pages in two columns, with odd-numbered pages on the right</li><li>TwoPageLeft (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the left</li><li>TwoPageRight (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the right</li></ul>
+	 * @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:<ul><li>UseNone Neither document outline nor thumbnail images visible</li><li>UseOutlines Document outline visible</li><li>UseThumbs Thumbnail images visible</li><li>FullScreen Full-screen mode, with no menu bar, window controls, or any other window visible</li><li>UseOC (PDF 1.5) Optional content group panel visible</li><li>UseAttachments (PDF 1.6) Attachments panel visible</li></ul>
+	 * @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.
+	 * @return Boolean true if the URl exist, false otherwise.
+	 * @since 5.9.204 (2013-01-28)
+	 * @public static
+	 */
+	public static function isValidURL($url) {
+		$headers = @get_headers($url);
+    	return (strpos($headers[0], '200') !== false);
+	}
+
+	/**
+	 * Removes SHY characters from text.
+	 * Unicode Data:<ul>
+	 * <li>Name : SOFT HYPHEN, commonly abbreviated as SHY</li>
+	 * <li>HTML Entity (decimal): "&amp;#173;"</li>
+	 * <li>HTML Entity (hex): "&amp;#xad;"</li>
+	 * <li>HTML Entity (named): "&amp;shy;"</li>
+	 * <li>How to type in Microsoft Windows: [Alt +00AD] or [Alt 0173]</li>
+	 * <li>UTF-8 (hex): 0xC2 0xAD (c2ad)</li>
+	 * <li>UTF-8 character: chr(194).chr(173)</li>
+	 * </ul>
+	 * @param $txt (string) input string
+	 * @param $unicode (boolean) True if we are in unicode mode, false otherwise.
+	 * @return string without SHY characters.
+	 * @since (4.5.019) 2009-02-28
+	 * @public static
+	 */
+	public static function removeSHY($txt='', $unicode=true) {
+		$txt = preg_replace('/([\\xc2]{1}[\\xad]{1})/', '', $txt);
+		if (!$unicode) {
+			$txt = preg_replace('/([\\xad]{1})/', '', $txt);
+		}
+		return $txt;
+	}
+
+
+	/**
+	 * Get the border mode accounting for multicell position (opens bottom side of multicell crossing pages)
+	 * @param $brd (mixed) Indicates if borders must be drawn around the cell block. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul>or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
+	 * @param $position (string) multicell position: 'start', 'middle', 'end'
+	 * @param $opencell (boolean) True when the cell is left open at the page bottom, false otherwise.
+	 * @return border mode array
+	 * @since 4.4.002 (2008-12-09)
+	 * @public static
+	 */
+	public static function getBorderMode($brd, $position='start', $opencell=true) {
+		if ((!$opencell) OR empty($brd)) {
+			return $brd;
+		}
+		if ($brd == 1) {
+			$brd = 'LTRB';
+		}
+		if (is_string($brd)) {
+			// convert string to array
+			$slen = strlen($brd);
+			$newbrd = array();
+			for ($i = 0; $i < $slen; ++$i) {
+				$newbrd[$brd[$i]] = array('cap' => 'square', 'join' => 'miter');
+			}
+			$brd = $newbrd;
+		}
+		foreach ($brd as $border => $style) {
+			switch ($position) {
+				case 'start': {
+					if (strpos($border, 'B') !== false) {
+						// remove bottom line
+						$newkey = str_replace('B', '', $border);
+						if (strlen($newkey) > 0) {
+							$brd[$newkey] = $style;
+						}
+						unset($brd[$border]);
+					}
+					break;
+				}
+				case 'middle': {
+					if (strpos($border, 'B') !== false) {
+						// remove bottom line
+						$newkey = str_replace('B', '', $border);
+						if (strlen($newkey) > 0) {
+							$brd[$newkey] = $style;
+						}
+						unset($brd[$border]);
+						$border = $newkey;
+					}
+					if (strpos($border, 'T') !== false) {
+						// remove bottom line
+						$newkey = str_replace('T', '', $border);
+						if (strlen($newkey) > 0) {
+							$brd[$newkey] = $style;
+						}
+						unset($brd[$border]);
+					}
+					break;
+				}
+				case 'end': {
+					if (strpos($border, 'T') !== false) {
+						// remove bottom line
+						$newkey = str_replace('T', '', $border);
+						if (strlen($newkey) > 0) {
+							$brd[$newkey] = $style;
+						}
+						unset($brd[$border]);
+					}
+					break;
+				}
+			}
+		}
+		return $brd;
+	}
+
+	/**
+	 * Determine whether a string is empty.
+	 * @param $str (string) string to be checked
+	 * @return boolean true if string is empty
+	 * @since 4.5.044 (2009-04-16)
+	 * @public static
+	 */
+	public static function empty_string($str) {
+		return (is_null($str) OR (is_string($str) AND (strlen($str) == 0)));
+	}
+
+	/**
+	 * Returns a temporary filename for caching object on filesystem.
+	 * @param $name (string) Prefix to add to the file name.
+	 * @return string filename.
+	 * @since 4.5.000 (2008-12-31)
+	 * @public static
+	 */
+	public static function getObjFilename($name) {
+		return tempnam(K_PATH_CACHE, $name.'_');
+	}
+
+	/**
+	 * Add "\" before "\", "(" and ")"
+	 * @param $s (string) string to escape.
+	 * @return string escaped string.
+	 * @public static
+	 */
+	public static function _escape($s) {
+		// the chr(13) substitution fixes the Bugs item #1421290.
+		return strtr($s, array(')' => '\\)', '(' => '\\(', '\\' => '\\\\', chr(13) => '\r'));
+	}
+
+	/**
+	* Escape some special characters (&lt; &gt; &amp;) for XML output.
+	* @param $str (string) Input string to convert.
+	* @return converted string
+	* @since 5.9.121 (2011-09-28)
+	 * @public static
+	 */
+	public static function _escapeXML($str) {
+		$replaceTable = array("\0" => '', '&' => '&amp;', '<' => '&lt;', '>' => '&gt;');
+		$str = strtr($str, $replaceTable);
+		return $str;
+	}
+
+	/**
+	 * Creates a copy of a class object
+	 * @param $object (object) class object to be cloned
+	 * @return cloned object
+	 * @since 4.5.029 (2009-03-19)
+	 * @public static
+	 */
+	public static function objclone($object) {
+		if (($object instanceof Imagick) AND (version_compare(phpversion('imagick'), '3.0.1') !== 1)) {
+			// on the versions after 3.0.1 the clone() method was deprecated in favour of clone keyword
+			return @$object->clone();
+		}
+		return @clone($object);
+	}
+
+	/**
+	 * Ouput input data and compress it if possible.
+	 * @param $data (string) Data to output.
+	 * @param $length (int) Data length in bytes.
+	 * @since 5.9.086
+	 * @public static
+	 */
+	public static function sendOutputData($data, $length) {
+		if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
+			// the content length may vary if the server is using compression
+			header('Content-Length: '.$length);
+		}
+		echo $data;
+	}
+
+	/**
+	 * Replace page number aliases with number.
+	 * @param $page (string) Page content.
+	 * @param $replace (array) Array of replacements (array keys are replacement strings, values are alias arrays).
+	 * @param $diff (int) If passed, this will be set to the total char number difference between alias and replacements.
+	 * @return replaced page content and updated $diff parameter as array.
+	 * @public static
+	 */
+	public static function replacePageNumAliases($page, $replace, $diff=0) {
+		foreach ($replace as $rep) {
+			foreach ($rep[3] as $a) {
+				if (strpos($page, $a) !== false) {
+					$page = str_replace($a, $rep[0], $page);
+					$diff += ($rep[2] - $rep[1]);
+				}
+			}
+		}
+		return array($page, $diff);
+	}
+
+	/**
+	 * Returns timestamp in seconds from formatted date-time.
+	 * @param $date (string) Formatted date-time.
+	 * @return int seconds.
+	 * @since 5.9.152 (2012-03-23)
+	 * @public static
+	 */
+	public static function getTimestamp($date) {
+		if (($date[0] == 'D') AND ($date[1] == ':')) {
+			// remove date prefix if present
+			$date = substr($date, 2);
+		}
+		return strtotime($date);
+	}
+
+	/**
+	 * Returns a formatted date-time.
+	 * @param $time (int) Time in seconds.
+	 * @return string escaped date string.
+	 * @since 5.9.152 (2012-03-23)
+	 * @public static
+	 */
+	public static function getFormattedDate($time) {
+		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
+	 * @return string containing random data
+	 * @author Nicola Asuni
+	 * @since 5.9.006 (2010-10-19)
+	 * @public static
+	 */
+	public static function getRandomSeed($seed='') {
+		$seed .= microtime();
+		if (function_exists('openssl_random_pseudo_bytes') AND (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')) {
+			// this is not used on windows systems because it is very slow for a know bug
+			$seed .= openssl_random_pseudo_bytes(512);
+		} else {
+			for ($i = 0; $i < 23; ++$i) {
+				$seed .= uniqid('', true);
+			}
+		}
+		$seed .= uniqid('', true);
+		$seed .= rand();
+		$seed .= getmypid();
+		$seed .= __FILE__;
+		if (isset($_SERVER['REMOTE_ADDR'])) {
+			$seed .= $_SERVER['REMOTE_ADDR'];
+		}
+		if (isset($_SERVER['HTTP_USER_AGENT'])) {
+			$seed .= $_SERVER['HTTP_USER_AGENT'];
+		}
+		if (isset($_SERVER['HTTP_ACCEPT'])) {
+			$seed .= $_SERVER['HTTP_ACCEPT'];
+		}
+		if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) {
+			$seed .= $_SERVER['HTTP_ACCEPT_ENCODING'];
+		}
+		if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
+			$seed .= $_SERVER['HTTP_ACCEPT_LANGUAGE'];
+		}
+		if (isset($_SERVER['HTTP_ACCEPT_CHARSET'])) {
+			$seed .= $_SERVER['HTTP_ACCEPT_CHARSET'];
+		}
+		$seed .= rand();
+		$seed .= uniqid('', true);
+		$seed .= microtime();
+		return $seed;
+	}
+
+	/**
+	 * Encrypts a string using MD5 and returns it's value as a binary string.
+	 * @param $str (string) input string
+	 * @return String MD5 encrypted binary string
+	 * @since 2.0.000 (2008-01-02)
+	 * @public static
+	 */
+	public static function _md5_16($str) {
+		return pack('H*', md5($str));
+	}
+
+	/**
+	 * Returns the input text exrypted using AES algorithm and the specified key.
+	 * This method requires mcrypt.
+	 * @param $key (string) encryption key
+	 * @param $text (String) input text to be encrypted
+	 * @return String encrypted text
+	 * @author Nicola Asuni
+	 * @since 5.0.005 (2010-05-11)
+	 * @public static
+	 */
+	public static function _AES($key, $text) {
+		// padding (RFC 2898, PKCS #5: Password-Based Cryptography Specification Version 2.0)
+		$padding = 16 - (strlen($text) % 16);
+		$text .= str_repeat(chr($padding), $padding);
+		$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 encrypted using RC4 algorithm and the specified key.
+	 * RC4 is the standard encryption algorithm used in PDF format
+	 * @param $key (string) Encryption key.
+	 * @param $text (String) Input text to be encrypted.
+	 * @param $last_enc_key (String) Reference to last RC4 key encrypted.
+	 * @param $last_enc_key_c (String) Reference to last RC4 computed key.
+	 * @return String encrypted text
+	 * @since 2.0.000 (2008-01-02)
+	 * @author Klemen Vodopivec, Nicola Asuni
+	 * @public static
+	 */
+	public static function _RC4($key, $text, &$last_enc_key, &$last_enc_key_c) {
+		if (function_exists('mcrypt_encrypt') AND ($out = @mcrypt_encrypt(MCRYPT_ARCFOUR, $key, $text, MCRYPT_MODE_STREAM, ''))) {
+			// try to use mcrypt function if exist
+			return $out;
+		}
+		if ($last_enc_key != $key) {
+			$k = str_repeat($key, ((256 / strlen($key)) + 1));
+			$rc4 = range(0, 255);
+			$j = 0;
+			for ($i = 0; $i < 256; ++$i) {
+				$t = $rc4[$i];
+				$j = ($j + $t + ord($k[$i])) % 256;
+				$rc4[$i] = $rc4[$j];
+				$rc4[$j] = $t;
+			}
+			$last_enc_key = $key;
+			$last_enc_key_c = $rc4;
+		} else {
+			$rc4 = $last_enc_key_c;
+		}
+		$len = strlen($text);
+		$a = 0;
+		$b = 0;
+		$out = '';
+		for ($i = 0; $i < $len; ++$i) {
+			$a = ($a + 1) % 256;
+			$t = $rc4[$a];
+			$b = ($b + $t) % 256;
+			$rc4[$a] = $rc4[$b];
+			$rc4[$b] = $t;
+			$k = $rc4[($rc4[$a] + $rc4[$b]) % 256];
+			$out .= chr(ord($text[$i]) ^ $k);
+		}
+		return $out;
+	}
+
+	/**
+	 * Return the premission code used on encryption (P value).
+	 * @param $permissions (Array) the set of permissions (specify the ones you want to block).
+	 * @param $mode (int) encryption strength: 0 = RC4 40 bit; 1 = RC4 128 bit; 2 = AES 128 bit; 3 = AES 256 bit.
+	 * @since 5.0.005 (2010-05-12)
+	 * @author Nicola Asuni
+	 * @public static
+	 */
+	public static function getUserPermissionCode($permissions, $mode=0) {
+		$options = array(
+			'owner' => 2, // bit 2 -- inverted logic: cleared by default
+			'print' => 4, // bit 3
+			'modify' => 8, // bit 4
+			'copy' => 16, // bit 5
+			'annot-forms' => 32, // bit 6
+			'fill-forms' => 256, // bit 9
+			'extract' => 512, // bit 10
+			'assemble' => 1024,// bit 11
+			'print-high' => 2048 // bit 12
+			);
+		$protection = 2147422012; // 32 bit: (01111111 11111111 00001111 00111100)
+		foreach ($permissions as $permission) {
+			if (isset($options[$permission])) {
+				if (($mode > 0) OR ($options[$permission] <= 32)) {
+					// set only valid permissions
+					if ($options[$permission] == 2) {
+						// the logic for bit 2 is inverted (cleared by default)
+						$protection += $options[$permission];
+					} else {
+						$protection -= $options[$permission];
+					}
+				}
+			}
+		}
+		return $protection;
+	}
+
+	/**
+	 * Convert hexadecimal string to string
+	 * @param $bs (string) byte-string to convert
+	 * @return String
+	 * @since 5.0.005 (2010-05-12)
+	 * @author Nicola Asuni
+	 * @public static
+	 */
+	public static function convertHexStringToString($bs) {
+		$string = ''; // string to be returned
+		$bslength = strlen($bs);
+		if (($bslength % 2) != 0) {
+			// padding
+			$bs .= '0';
+			++$bslength;
+		}
+		for ($i = 0; $i < $bslength; $i += 2) {
+			$string .= chr(hexdec($bs[$i].$bs[($i + 1)]));
+		}
+		return $string;
+	}
+
+	/**
+	 * Convert string to hexadecimal string (byte string)
+	 * @param $s (string) string to convert
+	 * @return byte string
+	 * @since 5.0.010 (2010-05-17)
+	 * @author Nicola Asuni
+	 * @public static
+	 */
+	public static function convertStringToHexString($s) {
+		$bs = '';
+		$chars = preg_split('//', $s, -1, PREG_SPLIT_NO_EMPTY);
+		foreach ($chars as $c) {
+			$bs .= sprintf('%02s', dechex(ord($c)));
+		}
+		return $bs;
+	}
+
+	/**
+	 * Convert encryption P value to a string of bytes, low-order byte first.
+	 * @param $protection (string) 32bit encryption permission value (P value)
+	 * @return String
+	 * @since 5.0.005 (2010-05-12)
+	 * @author Nicola Asuni
+	 * @public static
+	 */
+	public static function getEncPermissionsString($protection) {
+		$binprot = sprintf('%032b', $protection);
+		$str = chr(bindec(substr($binprot, 24, 8)));
+		$str .= chr(bindec(substr($binprot, 16, 8)));
+		$str .= chr(bindec(substr($binprot, 8, 8)));
+		$str .= chr(bindec(substr($binprot, 0, 8)));
+		return $str;
+	}
+
+	/**
+	 * Encode a name object.
+	 * @param $name (string) Name object to encode.
+	 * @return (string) Encoded name object.
+	 * @author Nicola Asuni
+	 * @since 5.9.097 (2011-06-23)
+	 * @public static
+	 */
+	public static function encodeNameObject($name) {
+		$escname = '';
+		$length = strlen($name);
+		for ($i = 0; $i < $length; ++$i) {
+			$chr = $name[$i];
+			if (preg_match('/[0-9a-zA-Z]/', $chr) == 1) {
+				$escname .= $chr;
+			} else {
+				$escname .= sprintf('#%02X', ord($chr));
+			}
+		}
+		return $escname;
+	}
+
+	/**
+	 * Convert JavaScript form fields properties array to Annotation Properties array.
+	 * @param $prop (array) javascript field properties. Possible values are described on official Javascript for Acrobat API reference.
+	 * @param $spot_colors (array) Reference to spot colors array.
+	 * @param $rtl (boolean) True if in Right-To-Left text direction mode, false otherwise.
+	 * @return array of annotation properties
+	 * @author Nicola Asuni
+	 * @since 4.8.000 (2009-09-06)
+	 * @public static
+	 */
+	public static function getAnnotOptFromJSProp($prop, &$spot_colors, $rtl=false) {
+		if (isset($prop['aopt']) AND is_array($prop['aopt'])) {
+			// the annotation options area lready defined
+			return $prop['aopt'];
+		}
+		$opt = array(); // value to be returned
+		// alignment: Controls how the text is laid out within the text field.
+		if (isset($prop['alignment'])) {
+			switch ($prop['alignment']) {
+				case 'left': {
+					$opt['q'] = 0;
+					break;
+				}
+				case 'center': {
+					$opt['q'] = 1;
+					break;
+				}
+				case 'right': {
+					$opt['q'] = 2;
+					break;
+				}
+				default: {
+					$opt['q'] = ($rtl)?2:0;
+					break;
+				}
+			}
+		}
+		// lineWidth: Specifies the thickness of the border when stroking the perimeter of a field's rectangle.
+		if (isset($prop['lineWidth'])) {
+			$linewidth = intval($prop['lineWidth']);
+		} else {
+			$linewidth = 1;
+		}
+		// borderStyle: The border style for a field.
+		if (isset($prop['borderStyle'])) {
+			switch ($prop['borderStyle']) {
+				case 'border.d':
+				case 'dashed': {
+					$opt['border'] = array(0, 0, $linewidth, array(3, 2));
+					$opt['bs'] = array('w'=>$linewidth, 's'=>'D', 'd'=>array(3, 2));
+					break;
+				}
+				case 'border.b':
+				case 'beveled': {
+					$opt['border'] = array(0, 0, $linewidth);
+					$opt['bs'] = array('w'=>$linewidth, 's'=>'B');
+					break;
+				}
+				case 'border.i':
+				case 'inset': {
+					$opt['border'] = array(0, 0, $linewidth);
+					$opt['bs'] = array('w'=>$linewidth, 's'=>'I');
+					break;
+				}
+				case 'border.u':
+				case 'underline': {
+					$opt['border'] = array(0, 0, $linewidth);
+					$opt['bs'] = array('w'=>$linewidth, 's'=>'U');
+					break;
+				}
+				case 'border.s':
+				case 'solid': {
+					$opt['border'] = array(0, 0, $linewidth);
+					$opt['bs'] = array('w'=>$linewidth, 's'=>'S');
+					break;
+				}
+				default: {
+					break;
+				}
+			}
+		}
+		if (isset($prop['border']) AND is_array($prop['border'])) {
+			$opt['border'] = $prop['border'];
+		}
+		if (!isset($opt['mk'])) {
+			$opt['mk'] = array();
+		}
+		if (!isset($opt['mk']['if'])) {
+			$opt['mk']['if'] = array();
+		}
+		$opt['mk']['if']['a'] = array(0.5, 0.5);
+		// buttonAlignX: Controls how space is distributed from the left of the button face with respect to the icon.
+		if (isset($prop['buttonAlignX'])) {
+			$opt['mk']['if']['a'][0] = $prop['buttonAlignX'];
+		}
+		// buttonAlignY: Controls how unused space is distributed from the bottom of the button face with respect to the icon.
+		if (isset($prop['buttonAlignY'])) {
+			$opt['mk']['if']['a'][1] = $prop['buttonAlignY'];
+		}
+		// buttonFitBounds: If true, the extent to which the icon may be scaled is set to the bounds of the button field.
+		if (isset($prop['buttonFitBounds']) AND ($prop['buttonFitBounds'] == 'true')) {
+			$opt['mk']['if']['fb'] = true;
+		}
+		// buttonScaleHow: Controls how the icon is scaled (if necessary) to fit inside the button face.
+		if (isset($prop['buttonScaleHow'])) {
+			switch ($prop['buttonScaleHow']) {
+				case 'scaleHow.proportional': {
+					$opt['mk']['if']['s'] = 'P';
+					break;
+				}
+				case 'scaleHow.anamorphic': {
+					$opt['mk']['if']['s'] = 'A';
+					break;
+				}
+			}
+		}
+		// buttonScaleWhen: Controls when an icon is scaled to fit inside the button face.
+		if (isset($prop['buttonScaleWhen'])) {
+			switch ($prop['buttonScaleWhen']) {
+				case 'scaleWhen.always': {
+					$opt['mk']['if']['sw'] = 'A';
+					break;
+				}
+				case 'scaleWhen.never': {
+					$opt['mk']['if']['sw'] = 'N';
+					break;
+				}
+				case 'scaleWhen.tooBig': {
+					$opt['mk']['if']['sw'] = 'B';
+					break;
+				}
+				case 'scaleWhen.tooSmall': {
+					$opt['mk']['if']['sw'] = 'S';
+					break;
+				}
+			}
+		}
+		// buttonPosition: Controls how the text and the icon of the button are positioned with respect to each other within the button face.
+		if (isset($prop['buttonPosition'])) {
+			switch ($prop['buttonPosition']) {
+				case 0:
+				case 'position.textOnly': {
+					$opt['mk']['tp'] = 0;
+					break;
+				}
+				case 1:
+				case 'position.iconOnly': {
+					$opt['mk']['tp'] = 1;
+					break;
+				}
+				case 2:
+				case 'position.iconTextV': {
+					$opt['mk']['tp'] = 2;
+					break;
+				}
+				case 3:
+				case 'position.textIconV': {
+					$opt['mk']['tp'] = 3;
+					break;
+				}
+				case 4:
+				case 'position.iconTextH': {
+					$opt['mk']['tp'] = 4;
+					break;
+				}
+				case 5:
+				case 'position.textIconH': {
+					$opt['mk']['tp'] = 5;
+					break;
+				}
+				case 6:
+				case 'position.overlay': {
+					$opt['mk']['tp'] = 6;
+					break;
+				}
+			}
+		}
+		// fillColor: Specifies the background color for a field.
+		if (isset($prop['fillColor'])) {
+			if (is_array($prop['fillColor'])) {
+				$opt['mk']['bg'] = $prop['fillColor'];
+			} else {
+				$opt['mk']['bg'] = TCPDF_COLORS::convertHTMLColorToDec($prop['fillColor'], $spot_colors);
+			}
+		}
+		// strokeColor: Specifies the stroke color for a field that is used to stroke the rectangle of the field with a line as large as the line width.
+		if (isset($prop['strokeColor'])) {
+			if (is_array($prop['strokeColor'])) {
+				$opt['mk']['bc'] = $prop['strokeColor'];
+			} else {
+				$opt['mk']['bc'] = TCPDF_COLORS::convertHTMLColorToDec($prop['strokeColor'], $spot_colors);
+			}
+		}
+		// rotation: The rotation of a widget in counterclockwise increments.
+		if (isset($prop['rotation'])) {
+			$opt['mk']['r'] = $prop['rotation'];
+		}
+		// charLimit: Limits the number of characters that a user can type into a text field.
+		if (isset($prop['charLimit'])) {
+			$opt['maxlen'] = intval($prop['charLimit']);
+		}
+		if (!isset($ff)) {
+			$ff = 0; // default value
+		}
+		// readonly: The read-only characteristic of a field. If a field is read-only, the user can see the field but cannot change it.
+		if (isset($prop['readonly']) AND ($prop['readonly'] == 'true')) {
+			$ff += 1 << 0;
+		}
+		// required: Specifies whether a field requires a value.
+		if (isset($prop['required']) AND ($prop['required'] == 'true')) {
+			$ff += 1 << 1;
+		}
+		// multiline: Controls how text is wrapped within the field.
+		if (isset($prop['multiline']) AND ($prop['multiline'] == 'true')) {
+			$ff += 1 << 12;
+		}
+		// password: Specifies whether the field should display asterisks when data is entered in the field.
+		if (isset($prop['password']) AND ($prop['password'] == 'true')) {
+			$ff += 1 << 13;
+		}
+		// NoToggleToOff: If set, exactly one radio button shall be selected at all times; selecting the currently selected button has no effect.
+		if (isset($prop['NoToggleToOff']) AND ($prop['NoToggleToOff'] == 'true')) {
+			$ff += 1 << 14;
+		}
+		// Radio: If set, the field is a set of radio buttons.
+		if (isset($prop['Radio']) AND ($prop['Radio'] == 'true')) {
+			$ff += 1 << 15;
+		}
+		// Pushbutton: If set, the field is a pushbutton that does not retain a permanent value.
+		if (isset($prop['Pushbutton']) AND ($prop['Pushbutton'] == 'true')) {
+			$ff += 1 << 16;
+		}
+		// Combo: If set, the field is a combo box; if clear, the field is a list box.
+		if (isset($prop['Combo']) AND ($prop['Combo'] == 'true')) {
+			$ff += 1 << 17;
+		}
+		// editable: Controls whether a combo box is editable.
+		if (isset($prop['editable']) AND ($prop['editable'] == 'true')) {
+			$ff += 1 << 18;
+		}
+		// Sort: If set, the field's option items shall be sorted alphabetically.
+		if (isset($prop['Sort']) AND ($prop['Sort'] == 'true')) {
+			$ff += 1 << 19;
+		}
+		// fileSelect: If true, sets the file-select flag in the Options tab of the text field (Field is Used for File Selection).
+		if (isset($prop['fileSelect']) AND ($prop['fileSelect'] == 'true')) {
+			$ff += 1 << 20;
+		}
+		// multipleSelection: If true, indicates that a list box allows a multiple selection of items.
+		if (isset($prop['multipleSelection']) AND ($prop['multipleSelection'] == 'true')) {
+			$ff += 1 << 21;
+		}
+		// doNotSpellCheck: If true, spell checking is not performed on this editable text field.
+		if (isset($prop['doNotSpellCheck']) AND ($prop['doNotSpellCheck'] == 'true')) {
+			$ff += 1 << 22;
+		}
+		// doNotScroll: If true, the text field does not scroll and the user, therefore, is limited by the rectangular region designed for the field.
+		if (isset($prop['doNotScroll']) AND ($prop['doNotScroll'] == 'true')) {
+			$ff += 1 << 23;
+		}
+		// comb: If set to true, the field background is drawn as series of boxes (one for each character in the value of the field) and each character of the content is drawn within those boxes. The number of boxes drawn is determined from the charLimit property. It applies only to text fields. The setter will also raise if any of the following field properties are also set multiline, password, and fileSelect. A side-effect of setting this property is that the doNotScroll property is also set.
+		if (isset($prop['comb']) AND ($prop['comb'] == 'true')) {
+			$ff += 1 << 24;
+		}
+		// radiosInUnison: If false, even if a group of radio buttons have the same name and export value, they behave in a mutually exclusive fashion, like HTML radio buttons.
+		if (isset($prop['radiosInUnison']) AND ($prop['radiosInUnison'] == 'true')) {
+			$ff += 1 << 25;
+		}
+		// richText: If true, the field allows rich text formatting.
+		if (isset($prop['richText']) AND ($prop['richText'] == 'true')) {
+			$ff += 1 << 25;
+		}
+		// commitOnSelChange: Controls whether a field value is committed after a selection change.
+		if (isset($prop['commitOnSelChange']) AND ($prop['commitOnSelChange'] == 'true')) {
+			$ff += 1 << 26;
+		}
+		$opt['ff'] = $ff;
+		// defaultValue: The default value of a field - that is, the value that the field is set to when the form is reset.
+		if (isset($prop['defaultValue'])) {
+			$opt['dv'] = $prop['defaultValue'];
+		}
+		$f = 4; // default value for annotation flags
+		// readonly: The read-only characteristic of a field. If a field is read-only, the user can see the field but cannot change it.
+		if (isset($prop['readonly']) AND ($prop['readonly'] == 'true')) {
+			$f += 1 << 6;
+		}
+		// display: Controls whether the field is hidden or visible on screen and in print.
+		if (isset($prop['display'])) {
+			if ($prop['display'] == 'display.visible') {
+				//
+			} elseif ($prop['display'] == 'display.hidden') {
+				$f += 1 << 1;
+			} elseif ($prop['display'] == 'display.noPrint') {
+				$f -= 1 << 2;
+			} elseif ($prop['display'] == 'display.noView') {
+				$f += 1 << 5;
+			}
+		}
+		$opt['f'] = $f;
+		// currentValueIndices: Reads and writes single or multiple values of a list box or combo box.
+		if (isset($prop['currentValueIndices']) AND is_array($prop['currentValueIndices'])) {
+			$opt['i'] = $prop['currentValueIndices'];
+		}
+		// value: The value of the field data that the user has entered.
+		if (isset($prop['value'])) {
+			if (is_array($prop['value'])) {
+				$opt['opt'] = array();
+				foreach ($prop['value'] AS $key => $optval) {
+					// exportValues: An array of strings representing the export values for the field.
+					if (isset($prop['exportValues'][$key])) {
+						$opt['opt'][$key] = array($prop['exportValues'][$key], $prop['value'][$key]);
+					} else {
+						$opt['opt'][$key] = $prop['value'][$key];
+					}
+				}
+			} else {
+				$opt['v'] = $prop['value'];
+			}
+		}
+		// richValue: This property specifies the text contents and formatting of a rich text field.
+		if (isset($prop['richValue'])) {
+			$opt['rv'] = $prop['richValue'];
+		}
+		// submitName: If nonempty, used during form submission instead of name. Only applicable if submitting in HTML format (that is, URL-encoded).
+		if (isset($prop['submitName'])) {
+			$opt['tm'] = $prop['submitName'];
+		}
+		// name: Fully qualified field name.
+		if (isset($prop['name'])) {
+			$opt['t'] = $prop['name'];
+		}
+		// userName: The user name (short description string) of the field.
+		if (isset($prop['userName'])) {
+			$opt['tu'] = $prop['userName'];
+		}
+		// highlight: Defines how a button reacts when a user clicks it.
+		if (isset($prop['highlight'])) {
+			switch ($prop['highlight']) {
+				case 'none':
+				case 'highlight.n': {
+					$opt['h'] = 'N';
+					break;
+				}
+				case 'invert':
+				case 'highlight.i': {
+					$opt['h'] = 'i';
+					break;
+				}
+				case 'push':
+				case 'highlight.p': {
+					$opt['h'] = 'P';
+					break;
+				}
+				case 'outline':
+				case 'highlight.o': {
+					$opt['h'] = 'O';
+					break;
+				}
+			}
+		}
+		// Unsupported options:
+		// - calcOrderIndex: Changes the calculation order of fields in the document.
+		// - delay: Delays the redrawing of a field's appearance.
+		// - defaultStyle: This property defines the default style attributes for the form field.
+		// - style: Allows the user to set the glyph style of a check box or radio button.
+		// - textColor, textFont, textSize
+		return $opt;
+	}
+
+	/**
+	 * Format the page numbers.
+	 * This method can be overriden for custom formats.
+	 * @param $num (int) page number
+	 * @since 4.2.005 (2008-11-06)
+	 * @public static
+	 */
+	public static function formatPageNumber($num) {
+		return number_format((float)$num, 0, '', '.');
+	}
+
+	/**
+	 * Format the page numbers on the Table Of Content.
+	 * This method can be overriden for custom formats.
+	 * @param $num (int) page number
+	 * @since 4.5.001 (2009-01-04)
+	 * @see addTOC(), addHTMLTOC()
+	 * @public static
+	 */
+	public static function formatTOCPageNumber($num) {
+		return number_format((float)$num, 0, '', '.');
+	}
+
+	/**
+	 * Extracts the CSS properties from a CSS string.
+	 * @param $cssdata (string) string containing CSS definitions.
+	 * @return An array where the keys are the CSS selectors and the values are the CSS properties.
+	 * @author Nicola Asuni
+	 * @since 5.1.000 (2010-05-25)
+	 * @public static
+	 */
+	public static function extractCSSproperties($cssdata) {
+		if (empty($cssdata)) {
+			return array();
+		}
+		// remove comments
+		$cssdata = preg_replace('/\/\*[^\*]*\*\//', '', $cssdata);
+		// remove newlines and multiple spaces
+		$cssdata = preg_replace('/[\s]+/', ' ', $cssdata);
+		// remove some spaces
+		$cssdata = preg_replace('/[\s]*([;:\{\}]{1})[\s]*/', '\\1', $cssdata);
+		// remove empty blocks
+		$cssdata = preg_replace('/([^\}\{]+)\{\}/', '', $cssdata);
+		// replace media type parenthesis
+		$cssdata = preg_replace('/@media[\s]+([^\{]*)\{/i', '@media \\1§', $cssdata);
+		$cssdata = preg_replace('/\}\}/si', '}§', $cssdata);
+		// trim string
+		$cssdata = trim($cssdata);
+		// find media blocks (all, braille, embossed, handheld, print, projection, screen, speech, tty, tv)
+		$cssblocks = array();
+		$matches = array();
+		if (preg_match_all('/@media[\s]+([^\§]*)§([^§]*)§/i', $cssdata, $matches) > 0) {
+			foreach ($matches[1] as $key => $type) {
+				$cssblocks[$type] = $matches[2][$key];
+			}
+			// remove media blocks
+			$cssdata = preg_replace('/@media[\s]+([^\§]*)§([^§]*)§/i', '', $cssdata);
+		}
+		// keep 'all' and 'print' media, other media types are discarded
+		if (isset($cssblocks['all']) AND !empty($cssblocks['all'])) {
+			$cssdata .= $cssblocks['all'];
+		}
+		if (isset($cssblocks['print']) AND !empty($cssblocks['print'])) {
+			$cssdata .= $cssblocks['print'];
+		}
+		// reset css blocks array
+		$cssblocks = array();
+		$matches = array();
+		// explode css data string into array
+		if (substr($cssdata, -1) == '}') {
+			// remove last parethesis
+			$cssdata = substr($cssdata, 0, -1);
+		}
+		$matches = explode('}', $cssdata);
+		foreach ($matches as $key => $block) {
+			// index 0 contains the CSS selector, index 1 contains CSS properties
+			$cssblocks[$key] = explode('{', $block);
+			if (!isset($cssblocks[$key][1])) {
+				// remove empty definitions
+				unset($cssblocks[$key]);
+			}
+		}
+		// split groups of selectors (comma-separated list of selectors)
+		foreach ($cssblocks as $key => $block) {
+			if (strpos($block[0], ',') > 0) {
+				$selectors = explode(',', $block[0]);
+				foreach ($selectors as $sel) {
+					$cssblocks[] = array(0 => trim($sel), 1 => $block[1]);
+				}
+				unset($cssblocks[$key]);
+			}
+		}
+		// covert array to selector => properties
+		$cssdata = array();
+		foreach ($cssblocks as $block) {
+			$selector = $block[0];
+			// calculate selector's specificity
+			$matches = array();
+			$a = 0; // the declaration is not from is a 'style' attribute
+			$b = intval(preg_match_all('/[\#]/', $selector, $matches)); // number of ID attributes
+			$c = intval(preg_match_all('/[\[\.]/', $selector, $matches)); // number of other attributes
+			$c += intval(preg_match_all('/[\:]link|visited|hover|active|focus|target|lang|enabled|disabled|checked|indeterminate|root|nth|first|last|only|empty|contains|not/i', $selector, $matches)); // number of pseudo-classes
+			$d = intval(preg_match_all('/[\>\+\~\s]{1}[a-zA-Z0-9]+/', ' '.$selector, $matches)); // number of element names
+			$d += intval(preg_match_all('/[\:][\:]/', $selector, $matches)); // number of pseudo-elements
+			$specificity = $a.$b.$c.$d;
+			// add specificity to the beginning of the selector
+			$cssdata[$specificity.' '.$selector] = $block[1];
+		}
+		// sort selectors alphabetically to account for specificity
+		ksort($cssdata, SORT_STRING);
+		// return array
+		return $cssdata;
+	}
+
+	/**
+	 * Cleanup HTML code (requires HTML Tidy library).
+	 * @param $html (string) htmlcode to fix
+	 * @param $default_css (string) CSS commands to add
+	 * @param $tagvs (array) parameters for setHtmlVSpace method
+	 * @param $tidy_options (array) options for tidy_parse_string function
+	 * @param $tagvspaces (array) Array of vertical spaces for tags.
+	 * @return string XHTML code cleaned up
+	 * @author Nicola Asuni
+	 * @since 5.9.017 (2010-11-16)
+	 * @see setHtmlVSpace()
+	 * @public static
+	 */
+	public static function fixHTMLCode($html, $default_css='', $tagvs='', $tidy_options='', &$tagvspaces) {
+		// configure parameters for HTML Tidy
+		if ($tidy_options === '') {
+			$tidy_options = array (
+				'clean' => 1,
+				'drop-empty-paras' => 0,
+				'drop-proprietary-attributes' => 1,
+				'fix-backslash' => 1,
+				'hide-comments' => 1,
+				'join-styles' => 1,
+				'lower-literals' => 1,
+				'merge-divs' => 1,
+				'merge-spans' => 1,
+				'output-xhtml' => 1,
+				'word-2000' => 1,
+				'wrap' => 0,
+				'output-bom' => 0,
+				//'char-encoding' => 'utf8',
+				//'input-encoding' => 'utf8',
+				//'output-encoding' => 'utf8'
+			);
+		}
+		// clean up the HTML code
+		$tidy = tidy_parse_string($html, $tidy_options);
+		// fix the HTML
+		$tidy->cleanRepair();
+		// get the CSS part
+		$tidy_head = tidy_get_head($tidy);
+		$css = $tidy_head->value;
+		$css = preg_replace('/<style([^>]+)>/ims', '<style>', $css);
+		$css = preg_replace('/<\/style>(.*)<style>/ims', "\n", $css);
+		$css = str_replace('/*<![CDATA[*/', '', $css);
+		$css = str_replace('/*]]>*/', '', $css);
+		preg_match('/<style>(.*)<\/style>/ims', $css, $matches);
+		if (isset($matches[1])) {
+			$css = strtolower($matches[1]);
+		} else {
+			$css = '';
+		}
+		// include default css
+		$css = '<style>'.$default_css.$css.'</style>';
+		// get the body part
+		$tidy_body = tidy_get_body($tidy);
+		$html = $tidy_body->value;
+		// fix some self-closing tags
+		$html = str_replace('<br>', '<br />', $html);
+		// remove some empty tag blocks
+		$html = preg_replace('/<div([^\>]*)><\/div>/', '', $html);
+		$html = preg_replace('/<p([^\>]*)><\/p>/', '', $html);
+		if ($tagvs !== '') {
+			// set vertical space for some XHTML tags
+			$tagvspaces = $tagvs;
+		}
+		// return the cleaned XHTML code + CSS
+		return $css.$html;
+	}
+
+	/**
+	 * Returns true if the CSS selector is valid for the selected HTML tag
+	 * @param $dom (array) array of HTML tags and properties
+	 * @param $key (int) key of the current HTML tag
+	 * @param $selector (string) CSS selector string
+	 * @return true if the selector is valid, false otherwise
+	 * @since 5.1.000 (2010-05-25)
+	 * @public static
+	 */
+	public static function isValidCSSSelectorForTag($dom, $key, $selector) {
+		$valid = false; // value to be returned
+		$tag = $dom[$key]['value'];
+		$class = array();
+		if (isset($dom[$key]['attribute']['class']) AND !empty($dom[$key]['attribute']['class'])) {
+			$class = explode(' ', strtolower($dom[$key]['attribute']['class']));
+		}
+		$id = '';
+		if (isset($dom[$key]['attribute']['id']) AND !empty($dom[$key]['attribute']['id'])) {
+			$id = strtolower($dom[$key]['attribute']['id']);
+		}
+		$selector = preg_replace('/([\>\+\~\s]{1})([\.]{1})([^\>\+\~\s]*)/si', '\\1*.\\3', $selector);
+		$matches = array();
+		if (preg_match_all('/([\>\+\~\s]{1})([a-zA-Z0-9\*]+)([^\>\+\~\s]*)/si', $selector, $matches, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE) > 0) {
+			$parentop = array_pop($matches[1]);
+			$operator = $parentop[0];
+			$offset = $parentop[1];
+			$lasttag = array_pop($matches[2]);
+			$lasttag = strtolower(trim($lasttag[0]));
+			if (($lasttag == '*') OR ($lasttag == $tag)) {
+				// the last element on selector is our tag or 'any tag'
+				$attrib = array_pop($matches[3]);
+				$attrib = strtolower(trim($attrib[0]));
+				if (!empty($attrib)) {
+					// check if matches class, id, attribute, pseudo-class or pseudo-element
+					switch ($attrib{0}) {
+						case '.': { // class
+							if (in_array(substr($attrib, 1), $class)) {
+								$valid = true;
+							}
+							break;
+						}
+						case '#': { // ID
+							if (substr($attrib, 1) == $id) {
+								$valid = true;
+							}
+							break;
+						}
+						case '[': { // attribute
+							$attrmatch = array();
+							if (preg_match('/\[([a-zA-Z0-9]*)[\s]*([\~\^\$\*\|\=]*)[\s]*["]?([^"\]]*)["]?\]/i', $attrib, $attrmatch) > 0) {
+								$att = strtolower($attrmatch[1]);
+								$val = $attrmatch[3];
+								if (isset($dom[$key]['attribute'][$att])) {
+									switch ($attrmatch[2]) {
+										case '=': {
+											if ($dom[$key]['attribute'][$att] == $val) {
+												$valid = true;
+											}
+											break;
+										}
+										case '~=': {
+											if (in_array($val, explode(' ', $dom[$key]['attribute'][$att]))) {
+												$valid = true;
+											}
+											break;
+										}
+										case '^=': {
+											if ($val == substr($dom[$key]['attribute'][$att], 0, strlen($val))) {
+												$valid = true;
+											}
+											break;
+										}
+										case '$=': {
+											if ($val == substr($dom[$key]['attribute'][$att], -strlen($val))) {
+												$valid = true;
+											}
+											break;
+										}
+										case '*=': {
+											if (strpos($dom[$key]['attribute'][$att], $val) !== false) {
+												$valid = true;
+											}
+											break;
+										}
+										case '|=': {
+											if ($dom[$key]['attribute'][$att] == $val) {
+												$valid = true;
+											} elseif (preg_match('/'.$val.'[\-]{1}/i', $dom[$key]['attribute'][$att]) > 0) {
+												$valid = true;
+											}
+											break;
+										}
+										default: {
+											$valid = true;
+										}
+									}
+								}
+							}
+							break;
+						}
+						case ':': { // pseudo-class or pseudo-element
+							if ($attrib{1} == ':') { // pseudo-element
+								// pseudo-elements are not supported!
+								// (::first-line, ::first-letter, ::before, ::after)
+							} else { // pseudo-class
+								// pseudo-classes are not supported!
+								// (:root, :nth-child(n), :nth-last-child(n), :nth-of-type(n), :nth-last-of-type(n), :first-child, :last-child, :first-of-type, :last-of-type, :only-child, :only-of-type, :empty, :link, :visited, :active, :hover, :focus, :target, :lang(fr), :enabled, :disabled, :checked)
+							}
+							break;
+						}
+					} // end of switch
+				} else {
+					$valid = true;
+				}
+				if ($valid AND ($offset > 0)) {
+					$valid = false;
+					// check remaining selector part
+					$selector = substr($selector, 0, $offset);
+					switch ($operator) {
+						case ' ': { // descendant of an element
+							while ($dom[$key]['parent'] > 0) {
+								if (self::isValidCSSSelectorForTag($dom, $dom[$key]['parent'], $selector)) {
+									$valid = true;
+									break;
+								} else {
+									$key = $dom[$key]['parent'];
+								}
+							}
+							break;
+						}
+						case '>': { // child of an element
+							$valid = self::isValidCSSSelectorForTag($dom, $dom[$key]['parent'], $selector);
+							break;
+						}
+						case '+': { // immediately preceded by an element
+							for ($i = ($key - 1); $i > $dom[$key]['parent']; --$i) {
+								if ($dom[$i]['tag'] AND $dom[$i]['opening']) {
+									$valid = self::isValidCSSSelectorForTag($dom, $i, $selector);
+									break;
+								}
+							}
+							break;
+						}
+						case '~': { // preceded by an element
+							for ($i = ($key - 1); $i > $dom[$key]['parent']; --$i) {
+								if ($dom[$i]['tag'] AND $dom[$i]['opening']) {
+									if (self::isValidCSSSelectorForTag($dom, $i, $selector)) {
+										break;
+									}
+								}
+							}
+							break;
+						}
+					}
+				}
+			}
+		}
+		return $valid;
+	}
+
+	/**
+	 * Returns the styles array that apply for the selected HTML tag.
+	 * @param $dom (array) array of HTML tags and properties
+	 * @param $key (int) key of the current HTML tag
+	 * @param $css (array) array of CSS properties
+	 * @return array containing CSS properties
+	 * @since 5.1.000 (2010-05-25)
+	 * @public static
+	 */
+	public static function getCSSdataArray($dom, $key, $css) {
+		$cssarray = array(); // style to be returned
+		// get parent CSS selectors
+		$selectors = array();
+		if (isset($dom[($dom[$key]['parent'])]['csssel'])) {
+			$selectors = $dom[($dom[$key]['parent'])]['csssel'];
+		}
+		// get all styles that apply
+		foreach($css as $selector => $style) {
+			$pos = strpos($selector, ' ');
+			// get specificity
+			$specificity = substr($selector, 0, $pos);
+			// remove specificity
+			$selector = substr($selector, $pos);
+			// check if this selector apply to current tag
+			if (self::isValidCSSSelectorForTag($dom, $key, $selector)) {
+				if (!in_array($selector, $selectors)) {
+					// add style if not already added on parent selector
+					$cssarray[] = array('k' => $selector, 's' => $specificity, 'c' => $style);
+					$selectors[] = $selector;
+				}
+			}
+		}
+		if (isset($dom[$key]['attribute']['style'])) {
+			// attach inline style (latest properties have high priority)
+			$cssarray[] = array('k' => '', 's' => '1000', 'c' => $dom[$key]['attribute']['style']);
+		}
+		// order the css array to account for specificity
+		$cssordered = array();
+		foreach ($cssarray as $key => $val) {
+			$skey = sprintf('%04d', $key);
+			$cssordered[$val['s'].'_'.$skey] = $val;
+		}
+		// sort selectors alphabetically to account for specificity
+		ksort($cssordered, SORT_STRING);
+		return array($selectors, $cssordered);
+	}
+
+	/**
+	 * Compact CSS data array into single string.
+	 * @param $css (array) array of CSS properties
+	 * @return string containing merged CSS properties
+	 * @since 5.9.070 (2011-04-19)
+	 * @public static
+	 */
+	public static function getTagStyleFromCSSarray($css) {
+		$tagstyle = ''; // value to be returned
+		foreach ($css as $style) {
+			// split single css commands
+			$csscmds = explode(';', $style['c']);
+			foreach ($csscmds as $cmd) {
+				if (!empty($cmd)) {
+					$pos = strpos($cmd, ':');
+					if ($pos !== false) {
+						$cmd = substr($cmd, 0, ($pos + 1));
+						if (strpos($tagstyle, $cmd) !== false) {
+							// remove duplicate commands (last commands have high priority)
+							$tagstyle = preg_replace('/'.$cmd.'[^;]+/i', '', $tagstyle);
+						}
+					}
+				}
+			}
+			$tagstyle .= ';'.$style['c'];
+		}
+		// remove multiple semicolons
+		$tagstyle = preg_replace('/[;]+/', ';', $tagstyle);
+		return $tagstyle;
+	}
+
+	/**
+	 * Returns the Roman representation of an integer number
+	 * @param $number (int) number to convert
+	 * @return string roman representation of the specified number
+	 * @since 4.4.004 (2008-12-10)
+	 * @public static
+	 */
+	public static function intToRoman($number) {
+		$roman = '';
+		while ($number >= 1000) {
+			$roman .= 'M';
+			$number -= 1000;
+		}
+		while ($number >= 900) {
+			$roman .= 'CM';
+			$number -= 900;
+		}
+		while ($number >= 500) {
+			$roman .= 'D';
+			$number -= 500;
+		}
+		while ($number >= 400) {
+			$roman .= 'CD';
+			$number -= 400;
+		}
+		while ($number >= 100) {
+			$roman .= 'C';
+			$number -= 100;
+		}
+		while ($number >= 90) {
+			$roman .= 'XC';
+			$number -= 90;
+		}
+		while ($number >= 50) {
+			$roman .= 'L';
+			$number -= 50;
+		}
+		while ($number >= 40) {
+			$roman .= 'XL';
+			$number -= 40;
+		}
+		while ($number >= 10) {
+			$roman .= 'X';
+			$number -= 10;
+		}
+		while ($number >= 9) {
+			$roman .= 'IX';
+			$number -= 9;
+		}
+		while ($number >= 5) {
+			$roman .= 'V';
+			$number -= 5;
+		}
+		while ($number >= 4) {
+			$roman .= 'IV';
+			$number -= 4;
+		}
+		while ($number >= 1) {
+			$roman .= 'I';
+			--$number;
+		}
+		return $roman;
+	}
+
+	/**
+	 * Find position of last occurrence of a substring in a string
+	 * @param $haystack (string) The string to search in.
+	 * @param $needle (string) substring to search.
+	 * @param $offset (int) May be specified to begin searching an arbitrary number of characters into the string.
+	 * @return Returns the position where the needle exists. Returns FALSE if the needle was not found.
+	 * @since 4.8.038 (2010-03-13)
+	 * @public static
+	 */
+	public static function revstrpos($haystack, $needle, $offset = 0) {
+		$length = strlen($haystack);
+		$offset = ($offset > 0)?($length - $offset):abs($offset);
+		$pos = strpos(strrev($haystack), strrev($needle), $offset);
+		return ($pos === false)?false:($length - $pos - strlen($needle));
+	}
+
+	/**
+	 * Serialize an array of parameters to be used with TCPDF tag in HTML code.
+	 * @param $pararray (array) parameters array
+	 * @return sting containing serialized data
+	 * @since 4.9.006 (2010-04-02)
+	 * @public static
+	 */
+	public static function serializeTCPDFtagParameters($pararray) {
+		return urlencode(serialize($pararray));
+	}
+
+	/**
+	 * Returns an array of hyphenation patterns.
+	 * @param $file (string) TEX file containing hypenation patterns. TEX pattrns can be downloaded from http://www.ctan.org/tex-archive/language/hyph-utf8/tex/generic/hyph-utf8/patterns/
+	 * @return array of hyphenation patterns
+	 * @author Nicola Asuni
+	 * @since 4.9.012 (2010-04-12)
+	 * @public static
+	 */
+	public static function getHyphenPatternsFromTEX($file) {
+		// TEX patterns are available at:
+		// http://www.ctan.org/tex-archive/language/hyph-utf8/tex/generic/hyph-utf8/patterns/
+		$data = file_get_contents($file);
+		$patterns = array();
+		// remove comments
+		$data = preg_replace('/\%[^\n]*/', '', $data);
+		// extract the patterns part
+		preg_match('/\\\\patterns\{([^\}]*)\}/i', $data, $matches);
+		$data = trim(substr($matches[0], 10, -1));
+		// extract each pattern
+		$patterns_array = preg_split('/[\s]+/', $data);
+		// create new language array of patterns
+		$patterns = array();
+		foreach($patterns_array as $val) {
+			if (!TCPDF_STATIC::empty_string($val)) {
+				$val = trim($val);
+				$val = str_replace('\'', '\\\'', $val);
+				$key = preg_replace('/[0-9]+/', '', $val);
+				$patterns[$key] = $val;
+			}
+		}
+		return $patterns;
+	}
+
+	/**
+	 * Get the Path-Painting Operators.
+	 * @param $style (string) Style of rendering. Possible values are:
+	 * <ul>
+	 *   <li>S or D: Stroke the path.</li>
+	 *   <li>s or d: Close and stroke the path.</li>
+	 *   <li>f or F: Fill the path, using the nonzero winding number rule to determine the region to fill.</li>
+	 *   <li>f* or F*: Fill the path, using the even-odd rule to determine the region to fill.</li>
+	 *   <li>B or FD or DF: Fill and then stroke the path, using the nonzero winding number rule to determine the region to fill.</li>
+	 *   <li>B* or F*D or DF*: Fill and then stroke the path, using the even-odd rule to determine the region to fill.</li>
+	 *   <li>b or fd or df: Close, fill, and then stroke the path, using the nonzero winding number rule to determine the region to fill.</li>
+	 *   <li>b or f*d or df*: Close, fill, and then stroke the path, using the even-odd rule to determine the region to fill.</li>
+	 *   <li>CNZ: Clipping mode using the even-odd rule to determine which regions lie inside the clipping path.</li>
+	 *   <li>CEO: Clipping mode using the nonzero winding number rule to determine which regions lie inside the clipping path</li>
+	 *   <li>n: End the path object without filling or stroking it.</li>
+	 * </ul>
+	 * @param $default (string) default style
+	 * @author Nicola Asuni
+	 * @since 5.0.000 (2010-04-30)
+	 * @public static
+	 */
+	public static function getPathPaintOperator($style, $default='S') {
+		$op = '';
+		switch($style) {
+			case 'S':
+			case 'D': {
+				$op = 'S';
+				break;
+			}
+			case 's':
+			case 'd': {
+				$op = 's';
+				break;
+			}
+			case 'f':
+			case 'F': {
+				$op = 'f';
+				break;
+			}
+			case 'f*':
+			case 'F*': {
+				$op = 'f*';
+				break;
+			}
+			case 'B':
+			case 'FD':
+			case 'DF': {
+				$op = 'B';
+				break;
+			}
+			case 'B*':
+			case 'F*D':
+			case 'DF*': {
+				$op = 'B*';
+				break;
+			}
+			case 'b':
+			case 'fd':
+			case 'df': {
+				$op = 'b';
+				break;
+			}
+			case 'b*':
+			case 'f*d':
+			case 'df*': {
+				$op = 'b*';
+				break;
+			}
+			case 'CNZ': {
+				$op = 'W n';
+				break;
+			}
+			case 'CEO': {
+				$op = 'W* n';
+				break;
+			}
+			case 'n': {
+				$op = 'n';
+				break;
+			}
+			default: {
+				if (!empty($default)) {
+					$op = self::getPathPaintOperator($default, '');
+				} else {
+					$op = '';
+				}
+			}
+		}
+		return $op;
+	}
+
+	/**
+	 * Get the product of two SVG tranformation matrices
+	 * @param $ta (array) first SVG tranformation matrix
+	 * @param $tb (array) second SVG tranformation matrix
+	 * @return transformation array
+	 * @author Nicola Asuni
+	 * @since 5.0.000 (2010-05-02)
+	 * @public static
+	 */
+	public static function getTransformationMatrixProduct($ta, $tb) {
+		$tm = array();
+		$tm[0] = ($ta[0] * $tb[0]) + ($ta[2] * $tb[1]);
+		$tm[1] = ($ta[1] * $tb[0]) + ($ta[3] * $tb[1]);
+		$tm[2] = ($ta[0] * $tb[2]) + ($ta[2] * $tb[3]);
+		$tm[3] = ($ta[1] * $tb[2]) + ($ta[3] * $tb[3]);
+		$tm[4] = ($ta[0] * $tb[4]) + ($ta[2] * $tb[5]) + $ta[4];
+		$tm[5] = ($ta[1] * $tb[4]) + ($ta[3] * $tb[5]) + $ta[5];
+		return $tm;
+	}
+
+	/**
+	 * Get the tranformation matrix from SVG transform attribute
+	 * @param $attribute (string) transformation
+	 * @return array of transformations
+	 * @author Nicola Asuni
+	 * @since 5.0.000 (2010-05-02)
+	 * @public static
+	 */
+	public static function getSVGTransformMatrix($attribute) {
+		// identity matrix
+		$tm = array(1, 0, 0, 1, 0, 0);
+		$transform = array();
+		if (preg_match_all('/(matrix|translate|scale|rotate|skewX|skewY)[\s]*\(([^\)]+)\)/si', $attribute, $transform, PREG_SET_ORDER) > 0) {
+			foreach ($transform as $key => $data) {
+				if (!empty($data[2])) {
+					$a = 1;
+					$b = 0;
+					$c = 0;
+					$d = 1;
+					$e = 0;
+					$f = 0;
+					$regs = array();
+					switch ($data[1]) {
+						case 'matrix': {
+							if (preg_match('/([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) {
+								$a = $regs[1];
+								$b = $regs[2];
+								$c = $regs[3];
+								$d = $regs[4];
+								$e = $regs[5];
+								$f = $regs[6];
+							}
+							break;
+						}
+						case 'translate': {
+							if (preg_match('/([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) {
+								$e = $regs[1];
+								$f = $regs[2];
+							} elseif (preg_match('/([a-z0-9\-\.]+)/si', $data[2], $regs)) {
+								$e = $regs[1];
+							}
+							break;
+						}
+						case 'scale': {
+							if (preg_match('/([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) {
+								$a = $regs[1];
+								$d = $regs[2];
+							} elseif (preg_match('/([a-z0-9\-\.]+)/si', $data[2], $regs)) {
+								$a = $regs[1];
+								$d = $a;
+							}
+							break;
+						}
+						case 'rotate': {
+							if (preg_match('/([0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) {
+								$ang = deg2rad($regs[1]);
+								$x = $regs[2];
+								$y = $regs[3];
+								$a = cos($ang);
+								$b = sin($ang);
+								$c = -$b;
+								$d = $a;
+								$e = ($x * (1 - $a)) - ($y * $c);
+								$f = ($y * (1 - $d)) - ($x * $b);
+							} elseif (preg_match('/([0-9\-\.]+)/si', $data[2], $regs)) {
+								$ang = deg2rad($regs[1]);
+								$a = cos($ang);
+								$b = sin($ang);
+								$c = -$b;
+								$d = $a;
+								$e = 0;
+								$f = 0;
+							}
+							break;
+						}
+						case 'skewX': {
+							if (preg_match('/([0-9\-\.]+)/si', $data[2], $regs)) {
+								$c = tan(deg2rad($regs[1]));
+							}
+							break;
+						}
+						case 'skewY': {
+							if (preg_match('/([0-9\-\.]+)/si', $data[2], $regs)) {
+								$b = tan(deg2rad($regs[1]));
+							}
+							break;
+						}
+					}
+					$tm = self::getTransformationMatrixProduct($tm, array($a, $b, $c, $d, $e, $f));
+				}
+			}
+		}
+		return $tm;
+	}
+
+	/**
+	 * Returns the angle in radiants between two vectors
+	 * @param $x1 (int) X coordinate of first vector point
+	 * @param $y1 (int) Y coordinate of first vector point
+	 * @param $x2 (int) X coordinate of second vector point
+	 * @param $y2 (int) Y coordinate of second vector point
+	 * @author Nicola Asuni
+	 * @since 5.0.000 (2010-05-04)
+	 * @public static
+	 */
+	public static function getVectorsAngle($x1, $y1, $x2, $y2) {
+		$dprod = ($x1 * $x2) + ($y1 * $y2);
+		$dist1 = sqrt(($x1 * $x1) + ($y1 * $y1));
+		$dist2 = sqrt(($x2 * $x2) + ($y2 * $y2));
+		$angle = acos($dprod / ($dist1 * $dist2));
+		if (is_nan($angle)) {
+			$angle = M_PI;
+		}
+		if ((($x1 * $y2) - ($x2 * $y1)) < 0) {
+			$angle *= -1;
+		}
+		return $angle;
+	}
+
+	/**
+	 * 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
+	 * @param $pattern (string) The regular expression pattern to search for without the modifiers, as a string.
+	 * @param $modifiers (string) The modifiers part of the pattern,
+	 * @param $subject (string) The input string.
+	 * @param $limit (int) If specified, then only substrings up to limit are returned with the rest of the string being placed in the last substring. A limit of -1, 0 or NULL means "no limit" and, as is standard across PHP, you can use NULL to skip to the flags parameter.
+	 * @param $flags (int) The flags as specified on the preg_split PHP function.
+	 * @return Returns an array containing substrings of subject split along boundaries matched by pattern.modifier
+	 * @author Nicola Asuni
+	 * @since 6.0.023
+	 * @public static
+	 */
+	public static function pregSplit($pattern, $modifiers, $subject, $limit=NULL, $flags=NULL) {
+		// the bug only happens on PHP 5.2 when using the u modifier
+		if ((strpos($modifiers, 'u') === FALSE) OR (count(preg_split('//u', "\n\t", -1, PREG_SPLIT_NO_EMPTY)) == 2)) {
+			return preg_split($pattern.$modifiers, $subject, $limit, $flags);
+		}
+		// preg_split is bugged - try alternative solution
+		$ret = array();
+		while (($nl = strpos($subject, "\n")) !== FALSE) {
+			$ret = array_merge($ret, preg_split($pattern.$modifiers, substr($subject, 0, $nl), $limit, $flags));
+			$ret[] = "\n";
+			$subject = substr($subject, ($nl + 1));
+		}
+		if (strlen($subject) > 0) {
+			$ret = array_merge($ret, preg_split($pattern.$modifiers, $subject, $limit, $flags));
+		}
+		return $ret;
+	}
+
+	/**
+	 * Reads entire file into a string.
+	 * The file can be also an URL.
+	 * @param $file (string) Name of the file or URL to read.
+	 * @return The function returns the read data or FALSE on failure. 
+	 * @author Nicola Asuni
+	 * @since 6.0.025
+	 * @public static
+	 */
+	public static function fileGetContents($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));
+			}
+		}
+		// URL mode
+		$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;
+			}
+		}
+		$urldata = @parse_url($url);
+		if (!isset($urldata['query']) OR (strlen($urldata['query']) <= 0)) {
+			if (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;
+			}
+		}
+		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, $file);
+				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);
+				}
+				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) {
+				break;
+			}
+		}
+		return $ret;
+	}
+
+} // END OF TCPDF_STATIC CLASS
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/tcpdf.php b/htmltest/sites/all/libraries/tcpdf-version/tcpdf.php
new file mode 100644
index 00000000..4ba8dbac
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/tcpdf.php
@@ -0,0 +1,24121 @@
+<?php
+//============================================================+
+// File name   : tcpdf.php
+// Version     : 6.0.038
+// Begin       : 2002-08-03
+// Last Update : 2013-10-06
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2002-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF is free software: you can ioredistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 License
+// along with TCPDF. If not, see
+// <http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description :
+//   This is a PHP class for generating PDF documents without requiring external extensions.
+//
+// NOTE:
+//   This class was originally derived in 2002 from the Public
+//   Domain FPDF class by Olivier Plathey (http://www.fpdf.org),
+//   but now is almost entirely rewritten and contains thousands of
+//   new lines of code and hundreds new features.
+//
+// Main features:
+//  * no external libraries are required for the basic functions;
+//  * all standard page formats, custom page formats, custom margins and units of measure;
+//  * UTF-8 Unicode and Right-To-Left languages;
+//  * TrueTypeUnicode, TrueType, Type1 and CID-0 fonts;
+//  * 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)
+//  * 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 Extention, 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;
+//  * document encryption up to 256 bit and digital signature certifications;
+//  * transactions to UNDO commands;
+//  * PDF annotations, including links, text and file attachments;
+//  * text rendering modes (fill, stroke and clipping);
+//  * multiple columns mode;
+//  * no-write page regions;
+//  * bookmarks, named destinations and table of content;
+//  * text hyphenation;
+//  * text stretching and spacing (tracking);
+//  * automatic page break, line break and text alignments including justification;
+//  * automatic page numbering and page groups;
+//  * move and delete pages;
+//  * page compression (requires php-zlib extension);
+//  * XOBject Templates;
+//  * Layers and object visibility.
+//	* PDF/A-1b support
+//============================================================+
+
+/**
+ * @file
+ * This is a PHP class for generating PDF documents without requiring external extensions.<br>
+ * TCPDF project (http://www.tcpdf.org) was originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.<br>
+ * <h3>TCPDF main features are:</h3>
+ * <ul>
+ * <li>no external libraries are required for the basic functions;</li>
+ * <li>all standard page formats, custom page formats, custom margins and units of measure;</li>
+ * <li>UTF-8 Unicode and Right-To-Left languages;</li>
+ * <li>TrueTypeUnicode, TrueType, Type1 and CID-0 fonts;</li>
+ * <li>font subsetting;</li>
+ * <li>methods to publish some XHTML + CSS code, Javascript and Forms;</li>
+ * <li>images, graphic (geometric figures) and transformation methods;
+ * <li>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)</li>
+ * <li>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 Extention, 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;</li>
+ * <li>JPEG and PNG ICC profiles, Grayscale, RGB, CMYK, Spot Colors and Transparencies;</li>
+ * <li>automatic page header and footer management;</li>
+ * <li>document encryption up to 256 bit and digital signature certifications;</li>
+ * <li>transactions to UNDO commands;</li>
+ * <li>PDF annotations, including links, text and file attachments;</li>
+ * <li>text rendering modes (fill, stroke and clipping);</li>
+ * <li>multiple columns mode;</li>
+ * <li>no-write page regions;</li>
+ * <li>bookmarks, named destinations and table of content;</li>
+ * <li>text hyphenation;</li>
+ * <li>text stretching and spacing (tracking);</li>
+ * <li>automatic page break, line break and text alignments including justification;</li>
+ * <li>automatic page numbering and page groups;</li>
+ * <li>move and delete pages;</li>
+ * <li>page compression (requires php-zlib extension);</li>
+ * <li>XOBject Templates;</li>
+ * <li>Layers and object visibility;</li>
+ * <li>PDF/A-1b support.</li>
+ * </ul>
+ * Tools to encode your unicode fonts are on fonts/utils directory.</p>
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 6.0.038
+ */
+
+// TCPDF configuration
+require_once(dirname(__FILE__).'/tcpdf_autoconfig.php');
+// TCPDF static font methods and data
+require_once(dirname(__FILE__).'/include/tcpdf_font_data.php');
+// TCPDF static font methods and data
+require_once(dirname(__FILE__).'/include/tcpdf_fonts.php');
+// TCPDF static color methods and data
+require_once(dirname(__FILE__).'/include/tcpdf_colors.php');
+// TCPDF static image methods and data
+require_once(dirname(__FILE__).'/include/tcpdf_images.php');
+// TCPDF static methods and data
+require_once(dirname(__FILE__).'/include/tcpdf_static.php');
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+/**
+ * @class TCPDF
+ * PHP class for generating PDF documents without requiring external extensions.
+ * 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.<br>
+ * @package com.tecnick.tcpdf
+ * @brief PHP class for generating PDF documents without requiring external extensions.
+ * @version 6.0.038
+ * @author Nicola Asuni - info@tecnick.com
+ */
+class TCPDF {
+
+	// Protected properties
+
+	/**
+	 * Current page number.
+	 * @protected
+	 */
+	protected $page;
+
+	/**
+	 * Current object number.
+	 * @protected
+	 */
+	protected $n;
+
+	/**
+	 * Array of object offsets.
+	 * @protected
+	 */
+	protected $offsets = array();
+
+	/**
+	 * Array of object IDs for each page.
+	 * @protected
+	 */
+	protected $pageobjects = array();
+
+	/**
+	 * Buffer holding in-memory PDF.
+	 * @protected
+	 */
+	protected $buffer;
+
+	/**
+	 * Array containing pages.
+	 * @protected
+	 */
+	protected $pages = array();
+
+	/**
+	 * Current document state.
+	 * @protected
+	 */
+	protected $state;
+
+	/**
+	 * Compression flag.
+	 * @protected
+	 */
+	protected $compress;
+
+	/**
+	 * Current page orientation (P = Portrait, L = Landscape).
+	 * @protected
+	 */
+	protected $CurOrientation;
+
+	/**
+	 * Page dimensions.
+	 * @protected
+	 */
+	protected $pagedim = array();
+
+	/**
+	 * Scale factor (number of points in user unit).
+	 * @protected
+	 */
+	protected $k;
+
+	/**
+	 * Width of page format in points.
+	 * @protected
+	 */
+	protected $fwPt;
+
+	/**
+	 * Height of page format in points.
+	 * @protected
+	 */
+	protected $fhPt;
+
+	/**
+	 * Current width of page in points.
+	 * @protected
+	 */
+	protected $wPt;
+
+	/**
+	 * Current height of page in points.
+	 * @protected
+	 */
+	protected $hPt;
+
+	/**
+	 * Current width of page in user unit.
+	 * @protected
+	 */
+	protected $w;
+
+	/**
+	 * Current height of page in user unit.
+	 * @protected
+	 */
+	protected $h;
+
+	/**
+	 * Left margin.
+	 * @protected
+	 */
+	protected $lMargin;
+
+	/**
+	 * Right margin.
+	 * @protected
+	 */
+	protected $rMargin;
+
+	/**
+	 * Cell left margin (used by regions).
+	 * @protected
+	 */
+	protected $clMargin;
+
+	/**
+	 * Cell right margin (used by regions).
+	 * @protected
+	 */
+	protected $crMargin;
+
+	/**
+	 * Top margin.
+	 * @protected
+	 */
+	protected $tMargin;
+
+	/**
+	 * Page break margin.
+	 * @protected
+	 */
+	protected $bMargin;
+
+	/**
+	 * Array of cell internal paddings ('T' => top, 'R' => right, 'B' => bottom, 'L' => left).
+	 * @since 5.9.000 (2010-10-03)
+	 * @protected
+	 */
+	protected $cell_padding = array('T' => 0, 'R' => 0, 'B' => 0, 'L' => 0);
+
+	/**
+	 * Array of cell margins ('T' => top, 'R' => right, 'B' => bottom, 'L' => left).
+	 * @since 5.9.000 (2010-10-04)
+	 * @protected
+	 */
+	protected $cell_margin = array('T' => 0, 'R' => 0, 'B' => 0, 'L' => 0);
+
+	/**
+	 * Current horizontal position in user unit for cell positioning.
+	 * @protected
+	 */
+	protected $x;
+
+	/**
+	 * Current vertical position in user unit for cell positioning.
+	 * @protected
+	 */
+	protected $y;
+
+	/**
+	 * Height of last cell printed.
+	 * @protected
+	 */
+	protected $lasth;
+
+	/**
+	 * Line width in user unit.
+	 * @protected
+	 */
+	protected $LineWidth;
+
+	/**
+	 * Array of standard font names.
+	 * @protected
+	 */
+	protected $CoreFonts;
+
+	/**
+	 * Array of used fonts.
+	 * @protected
+	 */
+	protected $fonts = array();
+
+	/**
+	 * Array of font files.
+	 * @protected
+	 */
+	protected $FontFiles = array();
+
+	/**
+	 * Array of encoding differences.
+	 * @protected
+	 */
+	protected $diffs = array();
+
+	/**
+	 * Array of used images.
+	 * @protected
+	 */
+	protected $images = array();
+
+	/**
+	 * Array of cached files.
+	 * @protected
+	 */
+	protected $cached_files = array();
+
+	/**
+	 * Array of Annotations in pages.
+	 * @protected
+	 */
+	protected $PageAnnots = array();
+
+	/**
+	 * Array of internal links.
+	 * @protected
+	 */
+	protected $links = array();
+
+	/**
+	 * Current font family.
+	 * @protected
+	 */
+	protected $FontFamily;
+
+	/**
+	 * Current font style.
+	 * @protected
+	 */
+	protected $FontStyle;
+
+	/**
+	 * Current font ascent (distance between font top and baseline).
+	 * @protected
+	 * @since 2.8.000 (2007-03-29)
+	 */
+	protected $FontAscent;
+
+	/**
+	 * Current font descent (distance between font bottom and baseline).
+	 * @protected
+	 * @since 2.8.000 (2007-03-29)
+	 */
+	protected $FontDescent;
+
+	/**
+	 * Underlining flag.
+	 * @protected
+	 */
+	protected $underline;
+
+	/**
+	 * Overlining flag.
+	 * @protected
+	 */
+	protected $overline;
+
+	/**
+	 * Current font info.
+	 * @protected
+	 */
+	protected $CurrentFont;
+
+	/**
+	 * Current font size in points.
+	 * @protected
+	 */
+	protected $FontSizePt;
+
+	/**
+	 * Current font size in user unit.
+	 * @protected
+	 */
+	protected $FontSize;
+
+	/**
+	 * Commands for drawing color.
+	 * @protected
+	 */
+	protected $DrawColor;
+
+	/**
+	 * Commands for filling color.
+	 * @protected
+	 */
+	protected $FillColor;
+
+	/**
+	 * Commands for text color.
+	 * @protected
+	 */
+	protected $TextColor;
+
+	/**
+	 * Indicates whether fill and text colors are different.
+	 * @protected
+	 */
+	protected $ColorFlag;
+
+	/**
+	 * Automatic page breaking.
+	 * @protected
+	 */
+	protected $AutoPageBreak;
+
+	/**
+	 * Threshold used to trigger page breaks.
+	 * @protected
+	 */
+	protected $PageBreakTrigger;
+
+	/**
+	 * Flag set when processing page header.
+	 * @protected
+	 */
+	protected $InHeader = false;
+
+	/**
+	 * Flag set when processing page footer.
+	 * @protected
+	 */
+	protected $InFooter = false;
+
+	/**
+	 * Zoom display mode.
+	 * @protected
+	 */
+	protected $ZoomMode;
+
+	/**
+	 * Layout display mode.
+	 * @protected
+	 */
+	protected $LayoutMode;
+
+	/**
+	 * If true set the document information dictionary in Unicode.
+	 * @protected
+	 */
+	protected $docinfounicode = true;
+
+	/**
+	 * Document title.
+	 * @protected
+	 */
+	protected $title = '';
+
+	/**
+	 * Document subject.
+	 * @protected
+	 */
+	protected $subject = '';
+
+	/**
+	 * Document author.
+	 * @protected
+	 */
+	protected $author = '';
+
+	/**
+	 * Document keywords.
+	 * @protected
+	 */
+	protected $keywords = '';
+
+	/**
+	 * Document creator.
+	 * @protected
+	 */
+	protected $creator = '';
+
+	/**
+	 * Starting page number.
+	 * @protected
+	 */
+	protected $starting_page_number = 1;
+
+	/**
+	 * The right-bottom (or left-bottom for RTL) corner X coordinate of last inserted image.
+	 * @since 2002-07-31
+	 * @author Nicola Asuni
+	 * @protected
+	 */
+	protected $img_rb_x;
+
+	/**
+	 * The right-bottom corner Y coordinate of last inserted image.
+	 * @since 2002-07-31
+	 * @author Nicola Asuni
+	 * @protected
+	 */
+	protected $img_rb_y;
+
+	/**
+	 * Adjusting factor to convert pixels to user units.
+	 * @since 2004-06-14
+	 * @author Nicola Asuni
+	 * @protected
+	 */
+	protected $imgscale = 1;
+
+	/**
+	 * Boolean flag set to true when the input text is unicode (require unicode fonts).
+	 * @since 2005-01-02
+	 * @author Nicola Asuni
+	 * @protected
+	 */
+	protected $isunicode = false;
+
+	/**
+	 * PDF version.
+	 * @since 1.5.3
+	 * @protected
+	 */
+	protected $PDFVersion = '1.7';
+
+	/**
+	 * ID of the stored default header template (-1 = not set).
+	 * @protected
+	 */
+	protected $header_xobjid = -1;
+
+	/**
+	 * If true reset the Header Xobject template at each page
+	 * @protected
+	 */
+	protected $header_xobj_autoreset = false;
+
+	/**
+	 * Minimum distance between header and top page margin.
+	 * @protected
+	 */
+	protected $header_margin;
+
+	/**
+	 * Minimum distance between footer and bottom page margin.
+	 * @protected
+	 */
+	protected $footer_margin;
+
+	/**
+	 * Original left margin value.
+	 * @protected
+	 * @since 1.53.0.TC013
+	 */
+	protected $original_lMargin;
+
+	/**
+	 * Original right margin value.
+	 * @protected
+	 * @since 1.53.0.TC013
+	 */
+	protected $original_rMargin;
+
+	/**
+	 * Default font used on page header.
+	 * @protected
+	 */
+	protected $header_font;
+
+	/**
+	 * Default font used on page footer.
+	 * @protected
+	 */
+	protected $footer_font;
+
+	/**
+	 * Language templates.
+	 * @protected
+	 */
+	protected $l;
+
+	/**
+	 * Barcode to print on page footer (only if set).
+	 * @protected
+	 */
+	protected $barcode = false;
+
+	/**
+	 * Boolean flag to print/hide page header.
+	 * @protected
+	 */
+	protected $print_header = true;
+
+	/**
+	 * Boolean flag to print/hide page footer.
+	 * @protected
+	 */
+	protected $print_footer = true;
+
+	/**
+	 * Header image logo.
+	 * @protected
+	 */
+	protected $header_logo = '';
+
+	/**
+	 * Width of header image logo in user units.
+	 * @protected
+	 */
+	protected $header_logo_width = 30;
+
+	/**
+	 * Title to be printed on default page header.
+	 * @protected
+	 */
+	protected $header_title = '';
+
+	/**
+	 * String to pring on page header after title.
+	 * @protected
+	 */
+	protected $header_string = '';
+
+	/**
+	 * Color for header text (RGB array).
+	 * @since 5.9.174 (2012-07-25)
+	 * @protected
+	 */
+	protected $header_text_color = array(0,0,0);
+
+	/**
+	 * Color for header line (RGB array).
+	 * @since 5.9.174 (2012-07-25)
+	 * @protected
+	 */
+	protected $header_line_color = array(0,0,0);
+
+	/**
+	 * Color for footer text (RGB array).
+	 * @since 5.9.174 (2012-07-25)
+	 * @protected
+	 */
+	protected $footer_text_color = array(0,0,0);
+
+	/**
+	 * Color for footer line (RGB array).
+	 * @since 5.9.174 (2012-07-25)
+	 * @protected
+	 */
+	protected $footer_line_color = array(0,0,0);
+
+	/**
+	 * Text shadow data array.
+	 * @since 5.9.174 (2012-07-25)
+	 * @protected
+	 */
+	protected $txtshadow = array('enabled'=>false, 'depth_w'=>0, 'depth_h'=>0, 'color'=>false, 'opacity'=>1, 'blend_mode'=>'Normal');
+
+	/**
+	 * Default number of columns for html table.
+	 * @protected
+	 */
+	protected $default_table_columns = 4;
+
+	// variables for html parser
+
+	/**
+	 * HTML PARSER: array to store current link and rendering styles.
+	 * @protected
+	 */
+	protected $HREF = array();
+
+	/**
+	 * List of available fonts on filesystem.
+	 * @protected
+	 */
+	protected $fontlist = array();
+
+	/**
+	 * Current foreground color.
+	 * @protected
+	 */
+	protected $fgcolor;
+
+	/**
+	 * HTML PARSER: array of boolean values, true in case of ordered list (OL), false otherwise.
+	 * @protected
+	 */
+	protected $listordered = array();
+
+	/**
+	 * HTML PARSER: array count list items on nested lists.
+	 * @protected
+	 */
+	protected $listcount = array();
+
+	/**
+	 * HTML PARSER: current list nesting level.
+	 * @protected
+	 */
+	protected $listnum = 0;
+
+	/**
+	 * HTML PARSER: indent amount for lists.
+	 * @protected
+	 */
+	protected $listindent = 0;
+
+	/**
+	 * HTML PARSER: current list indententation level.
+	 * @protected
+	 */
+	protected $listindentlevel = 0;
+
+	/**
+	 * Current background color.
+	 * @protected
+	 */
+	protected $bgcolor;
+
+	/**
+	 * Temporary font size in points.
+	 * @protected
+	 */
+	protected $tempfontsize = 10;
+
+	/**
+	 * Spacer string for LI tags.
+	 * @protected
+	 */
+	protected $lispacer = '';
+
+	/**
+	 * Default encoding.
+	 * @protected
+	 * @since 1.53.0.TC010
+	 */
+	protected $encoding = 'UTF-8';
+
+	/**
+	 * PHP internal encoding.
+	 * @protected
+	 * @since 1.53.0.TC016
+	 */
+	protected $internal_encoding;
+
+	/**
+	 * Boolean flag to indicate if the document language is Right-To-Left.
+	 * @protected
+	 * @since 2.0.000
+	 */
+	protected $rtl = false;
+
+	/**
+	 * Boolean flag used to force RTL or LTR string direction.
+	 * @protected
+	 * @since 2.0.000
+	 */
+	protected $tmprtl = false;
+
+	// --- Variables used for document encryption:
+
+	/**
+	 * IBoolean flag indicating whether document is protected.
+	 * @protected
+	 * @since 2.0.000 (2008-01-02)
+	 */
+	protected $encrypted;
+
+	/**
+	 * Array containing encryption settings.
+	 * @protected
+	 * @since 5.0.005 (2010-05-11)
+	 */
+	protected $encryptdata = array();
+
+	/**
+	 * Last RC4 key encrypted (cached for optimisation).
+	 * @protected
+	 * @since 2.0.000 (2008-01-02)
+	 */
+	protected $last_enc_key;
+
+	/**
+	 * Last RC4 computed key.
+	 * @protected
+	 * @since 2.0.000 (2008-01-02)
+	 */
+	protected $last_enc_key_c;
+
+	/**
+	 * File ID (used on document trailer).
+	 * @protected
+	 * @since 5.0.005 (2010-05-12)
+	 */
+	protected $file_id;
+
+	// --- bookmark ---
+
+	/**
+	 * Outlines for bookmark.
+	 * @protected
+	 * @since 2.1.002 (2008-02-12)
+	 */
+	protected $outlines = array();
+
+	/**
+	 * Outline root for bookmark.
+	 * @protected
+	 * @since 2.1.002 (2008-02-12)
+	 */
+	protected $OutlineRoot;
+
+	// --- javascript and form ---
+
+	/**
+	 * Javascript code.
+	 * @protected
+	 * @since 2.1.002 (2008-02-12)
+	 */
+	protected $javascript = '';
+
+	/**
+	 * Javascript counter.
+	 * @protected
+	 * @since 2.1.002 (2008-02-12)
+	 */
+	protected $n_js;
+
+	/**
+	 * line through state
+	 * @protected
+	 * @since 2.8.000 (2008-03-19)
+	 */
+	protected $linethrough;
+
+	/**
+	 * Array with additional document-wide usage rights for the document.
+	 * @protected
+	 * @since 5.8.014 (2010-08-23)
+	 */
+	protected $ur = array();
+
+	/**
+	 * DPI (Dot Per Inch) Document Resolution (do not change).
+	 * @protected
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	protected $dpi = 72;
+
+	/**
+	 * Array of page numbers were a new page group was started (the page numbers are the keys of the array).
+	 * @protected
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	protected $newpagegroup = array();
+
+	/**
+	 * Array that contains the number of pages in each page group.
+	 * @protected
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	protected $pagegroups = array();
+
+	/**
+	 * Current page group number.
+	 * @protected
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	protected $currpagegroup = 0;
+
+	/**
+	 * Array of transparency objects and parameters.
+	 * @protected
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	protected $extgstates;
+
+	/**
+	 * Set the default JPEG compression quality (1-100).
+	 * @protected
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	protected $jpeg_quality;
+
+	/**
+	 * Default cell height ratio.
+	 * @protected
+	 * @since 3.0.014 (2008-05-23)
+	 */
+	protected $cell_height_ratio = K_CELL_HEIGHT_RATIO;
+
+	/**
+	 * PDF viewer preferences.
+	 * @protected
+	 * @since 3.1.000 (2008-06-09)
+	 */
+	protected $viewer_preferences;
+
+	/**
+	 * A name object specifying how the document should be displayed when opened.
+	 * @protected
+	 * @since 3.1.000 (2008-06-09)
+	 */
+	protected $PageMode;
+
+	/**
+	 * Array for storing gradient information.
+	 * @protected
+	 * @since 3.1.000 (2008-06-09)
+	 */
+	protected $gradients = array();
+
+	/**
+	 * Array used to store positions inside the pages buffer (keys are the page numbers).
+	 * @protected
+	 * @since 3.2.000 (2008-06-26)
+	 */
+	protected $intmrk = array();
+
+	/**
+	 * Array used to store positions inside the pages buffer (keys are the page numbers).
+	 * @protected
+	 * @since 5.7.000 (2010-08-03)
+	 */
+	protected $bordermrk = array();
+
+	/**
+	 * Array used to store page positions to track empty pages (keys are the page numbers).
+	 * @protected
+	 * @since 5.8.007 (2010-08-18)
+	 */
+	protected $emptypagemrk = array();
+
+	/**
+	 * Array used to store content positions inside the pages buffer (keys are the page numbers).
+	 * @protected
+	 * @since 4.6.021 (2009-07-20)
+	 */
+	protected $cntmrk = array();
+
+	/**
+	 * Array used to store footer positions of each page.
+	 * @protected
+	 * @since 3.2.000 (2008-07-01)
+	 */
+	protected $footerpos = array();
+
+	/**
+	 * Array used to store footer length of each page.
+	 * @protected
+	 * @since 4.0.014 (2008-07-29)
+	 */
+	protected $footerlen = array();
+
+	/**
+	 * Boolean flag to indicate if a new line is created.
+	 * @protected
+	 * @since 3.2.000 (2008-07-01)
+	 */
+	protected $newline = true;
+
+	/**
+	 * End position of the latest inserted line.
+	 * @protected
+	 * @since 3.2.000 (2008-07-01)
+	 */
+	protected $endlinex = 0;
+
+	/**
+	 * PDF string for width value of the last line.
+	 * @protected
+	 * @since 4.0.006 (2008-07-16)
+	 */
+	protected $linestyleWidth = '';
+
+	/**
+	 * PDF string for CAP value of the last line.
+	 * @protected
+	 * @since 4.0.006 (2008-07-16)
+	 */
+	protected $linestyleCap = '0 J';
+
+	/**
+	 * PDF string for join value of the last line.
+	 * @protected
+	 * @since 4.0.006 (2008-07-16)
+	 */
+	protected $linestyleJoin = '0 j';
+
+	/**
+	 * PDF string for dash value of the last line.
+	 * @protected
+	 * @since 4.0.006 (2008-07-16)
+	 */
+	protected $linestyleDash = '[] 0 d';
+
+	/**
+	 * Boolean flag to indicate if marked-content sequence is open.
+	 * @protected
+	 * @since 4.0.013 (2008-07-28)
+	 */
+	protected $openMarkedContent = false;
+
+	/**
+	 * Count the latest inserted vertical spaces on HTML.
+	 * @protected
+	 * @since 4.0.021 (2008-08-24)
+	 */
+	protected $htmlvspace = 0;
+
+	/**
+	 * Array of Spot colors.
+	 * @protected
+	 * @since 4.0.024 (2008-09-12)
+	 */
+	protected $spot_colors = array();
+
+	/**
+	 * Symbol used for HTML unordered list items.
+	 * @protected
+	 * @since 4.0.028 (2008-09-26)
+	 */
+	protected $lisymbol = '';
+
+	/**
+	 * String used to mark the beginning and end of EPS image blocks.
+	 * @protected
+	 * @since 4.1.000 (2008-10-18)
+	 */
+	protected $epsmarker = 'x#!#EPS#!#x';
+
+	/**
+	 * Array of transformation matrix.
+	 * @protected
+	 * @since 4.2.000 (2008-10-29)
+	 */
+	protected $transfmatrix = array();
+
+	/**
+	 * Current key for transformation matrix.
+	 * @protected
+	 * @since 4.8.005 (2009-09-17)
+	 */
+	protected $transfmatrix_key = 0;
+
+	/**
+	 * Booklet mode for double-sided pages.
+	 * @protected
+	 * @since 4.2.000 (2008-10-29)
+	 */
+	protected $booklet = false;
+
+	/**
+	 * Epsilon value used for float calculations.
+	 * @protected
+	 * @since 4.2.000 (2008-10-29)
+	 */
+	protected $feps = 0.005;
+
+	/**
+	 * Array used for custom vertical spaces for HTML tags.
+	 * @protected
+	 * @since 4.2.001 (2008-10-30)
+	 */
+	protected $tagvspaces = array();
+
+	/**
+	 * HTML PARSER: custom indent amount for lists. Negative value means disabled.
+	 * @protected
+	 * @since 4.2.007 (2008-11-12)
+	 */
+	protected $customlistindent = -1;
+
+	/**
+	 * Boolean flag to indicate if the border of the cell sides that cross the page should be removed.
+	 * @protected
+	 * @since 4.2.010 (2008-11-14)
+	 */
+	protected $opencell = true;
+
+	/**
+	 * Array of files to embedd.
+	 * @protected
+	 * @since 4.4.000 (2008-12-07)
+	 */
+	protected $embeddedfiles = array();
+
+	/**
+	 * Boolean flag to indicate if we are inside a PRE tag.
+	 * @protected
+	 * @since 4.4.001 (2008-12-08)
+	 */
+	protected $premode = false;
+
+	/**
+	 * Array used to store positions of graphics transformation blocks inside the page buffer.
+	 * keys are the page numbers
+	 * @protected
+	 * @since 4.4.002 (2008-12-09)
+	 */
+	protected $transfmrk = array();
+
+	/**
+	 * Default color for html links.
+	 * @protected
+	 * @since 4.4.003 (2008-12-09)
+	 */
+	protected $htmlLinkColorArray = array(0, 0, 255);
+
+	/**
+	 * Default font style to add to html links.
+	 * @protected
+	 * @since 4.4.003 (2008-12-09)
+	 */
+	protected $htmlLinkFontStyle = 'U';
+
+	/**
+	 * Counts the number of pages.
+	 * @protected
+	 * @since 4.5.000 (2008-12-31)
+	 */
+	protected $numpages = 0;
+
+	/**
+	 * Array containing page lengths in bytes.
+	 * @protected
+	 * @since 4.5.000 (2008-12-31)
+	 */
+	protected $pagelen = array();
+
+	/**
+	 * Counts the number of pages.
+	 * @protected
+	 * @since 4.5.000 (2008-12-31)
+	 */
+	protected $numimages = 0;
+
+	/**
+	 * Store the image keys.
+	 * @protected
+	 * @since 4.5.000 (2008-12-31)
+	 */
+	protected $imagekeys = array();
+
+	/**
+	 * Length of the buffer in bytes.
+	 * @protected
+	 * @since 4.5.000 (2008-12-31)
+	 */
+	protected $bufferlen = 0;
+
+	/**
+	 * If true enables disk caching.
+	 * @protected
+	 * @since 4.5.000 (2008-12-31)
+	 */
+	protected $diskcache = false;
+
+	/**
+	 * Counts the number of fonts.
+	 * @protected
+	 * @since 4.5.000 (2009-01-02)
+	 */
+	protected $numfonts = 0;
+
+	/**
+	 * Store the font keys.
+	 * @protected
+	 * @since 4.5.000 (2009-01-02)
+	 */
+	protected $fontkeys = array();
+
+	/**
+	 * Store the font object IDs.
+	 * @protected
+	 * @since 4.8.001 (2009-09-09)
+	 */
+	protected $font_obj_ids = array();
+
+	/**
+	 * Store the fage status (true when opened, false when closed).
+	 * @protected
+	 * @since 4.5.000 (2009-01-02)
+	 */
+	protected $pageopen = array();
+
+	/**
+	 * Default monospace font.
+	 * @protected
+	 * @since 4.5.025 (2009-03-10)
+	 */
+	protected $default_monospaced_font = 'courier';
+
+	/**
+	 * Cloned copy of the current class object.
+	 * @protected
+	 * @since 4.5.029 (2009-03-19)
+	 */
+	protected $objcopy;
+
+	/**
+	 * Array used to store the lengths of cache files.
+	 * @protected
+	 * @since 4.5.029 (2009-03-19)
+	 */
+	protected $cache_file_length = array();
+
+	/**
+	 * Table header content to be repeated on each new page.
+	 * @protected
+	 * @since 4.5.030 (2009-03-20)
+	 */
+	protected $thead = '';
+
+	/**
+	 * Margins used for table header.
+	 * @protected
+	 * @since 4.5.030 (2009-03-20)
+	 */
+	protected $theadMargins = array();
+
+	/**
+	 * Boolean flag to enable document digital signature.
+	 * @protected
+	 * @since 4.6.005 (2009-04-24)
+	 */
+	protected $sign = false;
+
+	/**
+	 * Digital signature data.
+	 * @protected
+	 * @since 4.6.005 (2009-04-24)
+	 */
+	protected $signature_data = array();
+
+	/**
+	 * Digital signature max length.
+	 * @protected
+	 * @since 4.6.005 (2009-04-24)
+	 */
+	protected $signature_max_length = 11742;
+
+	/**
+	 * Data for digital signature appearance.
+	 * @protected
+	 * @since 5.3.011 (2010-06-16)
+	 */
+	protected $signature_appearance = array('page' => 1, 'rect' => '0 0 0 0');
+
+	/**
+	 * Array of empty digital signature appearances.
+	 * @protected
+	 * @since 5.9.101 (2011-07-06)
+	 */
+	protected $empty_signature_appearance = array();
+
+	/**
+	 * Regular expression used to find blank characters (required for word-wrapping).
+	 * @protected
+	 * @since 4.6.006 (2009-04-28)
+	 */
+	protected $re_spaces = '/[^\S\xa0]/';
+
+	/**
+	 * Array of $re_spaces parts.
+	 * @protected
+	 * @since 5.5.011 (2010-07-09)
+	 */
+	protected $re_space = array('p' => '[^\S\xa0]', 'm' => '');
+
+	/**
+	 * Digital signature object ID.
+	 * @protected
+	 * @since 4.6.022 (2009-06-23)
+	 */
+	protected $sig_obj_id = 0;
+
+	/**
+	 * ID of page objects.
+	 * @protected
+	 * @since 4.7.000 (2009-08-29)
+	 */
+	protected $page_obj_id = array();
+
+	/**
+	 * List of form annotations IDs.
+	 * @protected
+	 * @since 4.8.000 (2009-09-07)
+	 */
+	protected $form_obj_id = array();
+
+	/**
+	 * Deafult Javascript field properties. Possible values are described on official Javascript for Acrobat API reference. Annotation options can be directly specified using the 'aopt' entry.
+	 * @protected
+	 * @since 4.8.000 (2009-09-07)
+	 */
+	protected $default_form_prop = array('lineWidth'=>1, 'borderStyle'=>'solid', 'fillColor'=>array(255, 255, 255), 'strokeColor'=>array(128, 128, 128));
+
+	/**
+	 * Javascript objects array.
+	 * @protected
+	 * @since 4.8.000 (2009-09-07)
+	 */
+	protected $js_objects = array();
+
+	/**
+	 * Current form action (used during XHTML rendering).
+	 * @protected
+	 * @since 4.8.000 (2009-09-07)
+	 */
+	protected $form_action = '';
+
+	/**
+	 * Current form encryption type (used during XHTML rendering).
+	 * @protected
+	 * @since 4.8.000 (2009-09-07)
+	 */
+	protected $form_enctype = 'application/x-www-form-urlencoded';
+
+	/**
+	 * Current method to submit forms.
+	 * @protected
+	 * @since 4.8.000 (2009-09-07)
+	 */
+	protected $form_mode = 'post';
+
+	/**
+	 * List of fonts used on form fields (fontname => fontkey).
+	 * @protected
+	 * @since 4.8.001 (2009-09-09)
+	 */
+	protected $annotation_fonts = array();
+
+	/**
+	 * List of radio buttons parent objects.
+	 * @protected
+	 * @since 4.8.001 (2009-09-09)
+	 */
+	protected $radiobutton_groups = array();
+
+	/**
+	 * List of radio group objects IDs.
+	 * @protected
+	 * @since 4.8.001 (2009-09-09)
+	 */
+	protected $radio_groups = array();
+
+	/**
+	 * Text indentation value (used for text-indent CSS attribute).
+	 * @protected
+	 * @since 4.8.006 (2009-09-23)
+	 */
+	protected $textindent = 0;
+
+	/**
+	 * Store page number when startTransaction() is called.
+	 * @protected
+	 * @since 4.8.006 (2009-09-23)
+	 */
+	protected $start_transaction_page = 0;
+
+	/**
+	 * Store Y position when startTransaction() is called.
+	 * @protected
+	 * @since 4.9.001 (2010-03-28)
+	 */
+	protected $start_transaction_y = 0;
+
+	/**
+	 * True when we are printing the thead section on a new page.
+	 * @protected
+	 * @since 4.8.027 (2010-01-25)
+	 */
+	protected $inthead = false;
+
+	/**
+	 * Array of column measures (width, space, starting Y position).
+	 * @protected
+	 * @since 4.9.001 (2010-03-28)
+	 */
+	protected $columns = array();
+
+	/**
+	 * Number of colums.
+	 * @protected
+	 * @since 4.9.001 (2010-03-28)
+	 */
+	protected $num_columns = 1;
+
+	/**
+	 * Current column number.
+	 * @protected
+	 * @since 4.9.001 (2010-03-28)
+	 */
+	protected $current_column = 0;
+
+	/**
+	 * Starting page for columns.
+	 * @protected
+	 * @since 4.9.001 (2010-03-28)
+	 */
+	protected $column_start_page = 0;
+
+	/**
+	 * Maximum page and column selected.
+	 * @protected
+	 * @since 5.8.000 (2010-08-11)
+	 */
+	protected $maxselcol = array('page' => 0, 'column' => 0);
+
+	/**
+	 * Array of: X difference between table cell x start and starting page margin, cellspacing, cellpadding.
+	 * @protected
+	 * @since 5.8.000 (2010-08-11)
+	 */
+	protected $colxshift = array('x' => 0, 's' => array('H' => 0, 'V' => 0), 'p' => array('L' => 0, 'T' => 0, 'R' => 0, 'B' => 0));
+
+	/**
+	 * Text rendering mode: 0 = Fill text; 1 = Stroke text; 2 = Fill, then stroke text; 3 = Neither fill nor stroke text (invisible); 4 = Fill text and add to path for clipping; 5 = Stroke text and add to path for clipping; 6 = Fill, then stroke text and add to path for clipping; 7 = Add text to path for clipping.
+	 * @protected
+	 * @since 4.9.008 (2010-04-03)
+	 */
+	protected $textrendermode = 0;
+
+	/**
+	 * Text stroke width in doc units.
+	 * @protected
+	 * @since 4.9.008 (2010-04-03)
+	 */
+	protected $textstrokewidth = 0;
+
+	/**
+	 * Current stroke color.
+	 * @protected
+	 * @since 4.9.008 (2010-04-03)
+	 */
+	protected $strokecolor;
+
+	/**
+	 * Default unit of measure for document.
+	 * @protected
+	 * @since 5.0.000 (2010-04-22)
+	 */
+	protected $pdfunit = 'mm';
+
+	/**
+	 * Boolean flag true when we are on TOC (Table Of Content) page.
+	 * @protected
+	 */
+	protected $tocpage = false;
+
+	/**
+	 * Boolean flag: if true convert vector images (SVG, EPS) to raster image using GD or ImageMagick library.
+	 * @protected
+	 * @since 5.0.000 (2010-04-26)
+	 */
+	protected $rasterize_vector_images = false;
+
+	/**
+	 * Boolean flag: if true enables font subsetting by default.
+	 * @protected
+	 * @since 5.3.002 (2010-06-07)
+	 */
+	protected $font_subsetting = true;
+
+	/**
+	 * Array of default graphic settings.
+	 * @protected
+	 * @since 5.5.008 (2010-07-02)
+	 */
+	protected $default_graphic_vars = array();
+
+	/**
+	 * Array of XObjects.
+	 * @protected
+	 * @since 5.8.014 (2010-08-23)
+	 */
+	protected $xobjects = array();
+
+	/**
+	 * Boolean value true when we are inside an XObject.
+	 * @protected
+	 * @since 5.8.017 (2010-08-24)
+	 */
+	protected $inxobj = false;
+
+	/**
+	 * Current XObject ID.
+	 * @protected
+	 * @since 5.8.017 (2010-08-24)
+	 */
+	protected $xobjid = '';
+
+	/**
+	 * Percentage of character stretching.
+	 * @protected
+	 * @since 5.9.000 (2010-09-29)
+	 */
+	protected $font_stretching = 100;
+
+	/**
+	 * Increases or decreases the space between characters in a text by the specified amount (tracking).
+	 * @protected
+	 * @since 5.9.000 (2010-09-29)
+	 */
+	protected $font_spacing = 0;
+
+	/**
+	 * Array of no-write regions.
+	 * ('page' => page number or empy for current page, 'xt' => X top, 'yt' => Y top, 'xb' => X bottom, 'yb' => Y bottom, 'side' => page side 'L' = left or 'R' = right)
+	 * @protected
+	 * @since 5.9.003 (2010-10-14)
+	 */
+	protected $page_regions = array();
+
+	/**
+	 * Boolean value true when page region check is active.
+	 * @protected
+	 */
+	protected $check_page_regions = true;
+
+	/**
+	 * Array of PDF layers data.
+	 * @protected
+	 * @since 5.9.102 (2011-07-13)
+	 */
+	protected $pdflayers = array();
+
+	/**
+	 * A dictionary of names and corresponding destinations (Dests key on document Catalog).
+	 * @protected
+	 * @since 5.9.097 (2011-06-23)
+	 */
+	protected $dests = array();
+
+	/**
+	 * Object ID for Named Destinations
+	 * @protected
+	 * @since 5.9.097 (2011-06-23)
+	 */
+	protected $n_dests;
+
+	/**
+	 * Embedded Files Names
+	 * @protected
+	 * @since 5.9.204 (2013-01-23)
+	 */
+	protected $efnames = array();
+
+	/**
+	 * Directory used for the last SVG image.
+	 * @protected
+	 * @since 5.0.000 (2010-05-05)
+	 */
+	protected $svgdir = '';
+
+	/**
+	 *  Deafult unit of measure for SVG.
+	 * @protected
+	 * @since 5.0.000 (2010-05-02)
+	 */
+	protected $svgunit = 'px';
+
+	/**
+	 * Array of SVG gradients.
+	 * @protected
+	 * @since 5.0.000 (2010-05-02)
+	 */
+	protected $svggradients = array();
+
+	/**
+	 * ID of last SVG gradient.
+	 * @protected
+	 * @since 5.0.000 (2010-05-02)
+	 */
+	protected $svggradientid = 0;
+
+	/**
+	 * Boolean value true when in SVG defs group.
+	 * @protected
+	 * @since 5.0.000 (2010-05-02)
+	 */
+	protected $svgdefsmode = false;
+
+	/**
+	 * Array of SVG defs.
+	 * @protected
+	 * @since 5.0.000 (2010-05-02)
+	 */
+	protected $svgdefs = array();
+
+	/**
+	 * Boolean value true when in SVG clipPath tag.
+	 * @protected
+	 * @since 5.0.000 (2010-04-26)
+	 */
+	protected $svgclipmode = false;
+
+	/**
+	 * Array of SVG clipPath commands.
+	 * @protected
+	 * @since 5.0.000 (2010-05-02)
+	 */
+	protected $svgclippaths = array();
+
+	/**
+	 * Array of SVG clipPath tranformation matrix.
+	 * @protected
+	 * @since 5.8.022 (2010-08-31)
+	 */
+	protected $svgcliptm = array();
+
+	/**
+	 * ID of last SVG clipPath.
+	 * @protected
+	 * @since 5.0.000 (2010-05-02)
+	 */
+	protected $svgclipid = 0;
+
+	/**
+	 * SVG text.
+	 * @protected
+	 * @since 5.0.000 (2010-05-02)
+	 */
+	protected $svgtext = '';
+
+	/**
+	 * SVG text properties.
+	 * @protected
+	 * @since 5.8.013 (2010-08-23)
+	 */
+	protected $svgtextmode = array();
+
+	/**
+	 * Array of SVG properties.
+	 * @protected
+	 * @since 5.0.000 (2010-05-02)
+	 */
+	protected $svgstyles = array(array(
+		'alignment-baseline' => 'auto',
+		'baseline-shift' => 'baseline',
+		'clip' => 'auto',
+		'clip-path' => 'none',
+		'clip-rule' => 'nonzero',
+		'color' => 'black',
+		'color-interpolation' => 'sRGB',
+		'color-interpolation-filters' => 'linearRGB',
+		'color-profile' => 'auto',
+		'color-rendering' => 'auto',
+		'cursor' => 'auto',
+		'direction' => 'ltr',
+		'display' => 'inline',
+		'dominant-baseline' => 'auto',
+		'enable-background' => 'accumulate',
+		'fill' => 'black',
+		'fill-opacity' => 1,
+		'fill-rule' => 'nonzero',
+		'filter' => 'none',
+		'flood-color' => 'black',
+		'flood-opacity' => 1,
+		'font' => '',
+		'font-family' => 'helvetica',
+		'font-size' => 'medium',
+		'font-size-adjust' => 'none',
+		'font-stretch' => 'normal',
+		'font-style' => 'normal',
+		'font-variant' => 'normal',
+		'font-weight' => 'normal',
+		'glyph-orientation-horizontal' => '0deg',
+		'glyph-orientation-vertical' => 'auto',
+		'image-rendering' => 'auto',
+		'kerning' => 'auto',
+		'letter-spacing' => 'normal',
+		'lighting-color' => 'white',
+		'marker' => '',
+		'marker-end' => 'none',
+		'marker-mid' => 'none',
+		'marker-start' => 'none',
+		'mask' => 'none',
+		'opacity' => 1,
+		'overflow' => 'auto',
+		'pointer-events' => 'visiblePainted',
+		'shape-rendering' => 'auto',
+		'stop-color' => 'black',
+		'stop-opacity' => 1,
+		'stroke' => 'none',
+		'stroke-dasharray' => 'none',
+		'stroke-dashoffset' => 0,
+		'stroke-linecap' => 'butt',
+		'stroke-linejoin' => 'miter',
+		'stroke-miterlimit' => 4,
+		'stroke-opacity' => 1,
+		'stroke-width' => 1,
+		'text-anchor' => 'start',
+		'text-decoration' => 'none',
+		'text-rendering' => 'auto',
+		'unicode-bidi' => 'normal',
+		'visibility' => 'visible',
+		'word-spacing' => 'normal',
+		'writing-mode' => 'lr-tb',
+		'text-color' => 'black',
+		'transfmatrix' => array(1, 0, 0, 1, 0, 0)
+		));
+
+	/**
+	 * If true force sRGB color profile for all document.
+	 * @protected
+	 * @since 5.9.121 (2011-09-28)
+	 */
+	protected $force_srgb = false;
+
+	/**
+	 * If true set the document to PDF/A mode.
+	 * @protected
+	 * @since 5.9.121 (2011-09-27)
+	 */
+	protected $pdfa_mode = false;
+
+	/**
+	 * Document creation date-time
+	 * @protected
+	 * @since 5.9.152 (2012-03-22)
+	 */
+	protected $doc_creation_timestamp;
+
+	/**
+	 * Document modification date-time
+	 * @protected
+	 * @since 5.9.152 (2012-03-22)
+	 */
+	protected $doc_modification_timestamp;
+
+	/**
+	 * Custom XMP data.
+	 * @protected
+	 * @since 5.9.128 (2011-10-06)
+	 */
+	protected $custom_xmp = '';
+
+	/**
+	 * Overprint mode array.
+	 * (Check the "Entries in a Graphics State Parameter Dictionary" on PDF 32000-1:2008).
+	 * @protected
+	 * @since 5.9.152 (2012-03-23)
+	 */
+	protected $overprint = array('OP' => false, 'op' => false, 'OPM' => 0);
+
+	/**
+	 * Alpha mode array.
+	 * (Check the "Entries in a Graphics State Parameter Dictionary" on PDF 32000-1:2008).
+	 * @protected
+	 * @since 5.9.152 (2012-03-23)
+	 */
+	protected $alpha = array('CA' => 1, 'ca' => 1, 'BM' => '/Normal', 'AIS' => false);
+
+	/**
+	 * Define the page boundaries boxes to be set on document.
+	 * @protected
+	 * @since 5.9.152 (2012-03-23)
+	 */
+	protected $page_boxes = array('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox');
+
+	/**
+	 * If true print TCPDF meta link.
+	 * @protected
+	 * @since 5.9.152 (2012-03-23)
+	 */
+	protected $tcpdflink = true;
+
+	/**
+	 * Cache array for computed GD gamma values.
+	 * @protected
+	 * @since 5.9.1632 (2012-06-05)
+	 */
+	protected $gdgammacache = array();
+
+	//------------------------------------------------------------
+	// METHODS
+	//------------------------------------------------------------
+
+	/**
+	 * This is the class constructor.
+	 * It allows to set up the page format, the orientation and the measure unit used in all the methods (except for the font sizes).
+	 * 
+	 * IMPORTANT: Please note that this method sets the mb_internal_encoding to ASCII, so if you are using the mbstring module functions with TCPDF you need to correctly set/unset the mb_internal_encoding when needed.
+	 * 
+	 * @param $orientation (string) page orientation. Possible values are (case insensitive):<ul><li>P or Portrait (default)</li><li>L or Landscape</li><li>'' (empty string) for automatic orientation</li></ul>
+	 * @param $unit (string) User measure unit. Possible values are:<ul><li>pt: point</li><li>mm: millimeter (default)</li><li>cm: centimeter</li><li>in: inch</li></ul><br />A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This is a very common unit in typography; font sizes are expressed in that unit.
+	 * @param $format (mixed) The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat().
+	 * @param $unicode (boolean) TRUE means that the input text is unicode (default = true)
+	 * @param $encoding (string) Charset encoding (used only when converting back html entities); default is UTF-8.
+	 * @param $diskcache (boolean) If TRUE reduce the RAM memory usage by caching temporary data on filesystem (slower).
+	 * @param $pdfa (boolean) If TRUE set the document to PDF/A mode.
+	 * @public
+	 * @see getPageSizeFromFormat(), setPageFormat()
+	 */
+	public function __construct($orientation='P', $unit='mm', $format='A4', $unicode=true, $encoding='UTF-8', $diskcache=false, $pdfa=false) {
+		/* Set internal character encoding to ASCII */
+		if (function_exists('mb_internal_encoding') AND mb_internal_encoding()) {
+			$this->internal_encoding = mb_internal_encoding();
+			mb_internal_encoding('ASCII');
+		}
+		$this->font_obj_ids = array();
+		$this->page_obj_id = array();
+		$this->form_obj_id = array();
+		// set pdf/a mode
+		$this->pdfa_mode = $pdfa;
+		$this->force_srgb = false;
+		// set disk caching
+		$this->diskcache = $diskcache ? true : false;
+		// set language direction
+		$this->rtl = false;
+		$this->tmprtl = false;
+		// some checks
+		$this->_dochecks();
+		// initialization of properties
+		$this->isunicode = $unicode;
+		$this->page = 0;
+		$this->transfmrk[0] = array();
+		$this->pagedim = array();
+		$this->n = 2;
+		$this->buffer = '';
+		$this->pages = array();
+		$this->state = 0;
+		$this->fonts = array();
+		$this->FontFiles = array();
+		$this->diffs = array();
+		$this->images = array();
+		$this->links = array();
+		$this->gradients = array();
+		$this->InFooter = false;
+		$this->lasth = 0;
+		$this->FontFamily = defined('PDF_FONT_NAME_MAIN')?PDF_FONT_NAME_MAIN:'helvetica';
+		$this->FontStyle = '';
+		$this->FontSizePt = 12;
+		$this->underline = false;
+		$this->overline = false;
+		$this->linethrough = false;
+		$this->DrawColor = '0 G';
+		$this->FillColor = '0 g';
+		$this->TextColor = '0 g';
+		$this->ColorFlag = false;
+		$this->pdflayers = array();
+		// encryption values
+		$this->encrypted = false;
+		$this->last_enc_key = '';
+		// standard Unicode fonts
+		$this->CoreFonts = array(
+			'courier'=>'Courier',
+			'courierB'=>'Courier-Bold',
+			'courierI'=>'Courier-Oblique',
+			'courierBI'=>'Courier-BoldOblique',
+			'helvetica'=>'Helvetica',
+			'helveticaB'=>'Helvetica-Bold',
+			'helveticaI'=>'Helvetica-Oblique',
+			'helveticaBI'=>'Helvetica-BoldOblique',
+			'times'=>'Times-Roman',
+			'timesB'=>'Times-Bold',
+			'timesI'=>'Times-Italic',
+			'timesBI'=>'Times-BoldItalic',
+			'symbol'=>'Symbol',
+			'zapfdingbats'=>'ZapfDingbats'
+		);
+		// set scale factor
+		$this->setPageUnit($unit);
+		// set page format and orientation
+		$this->setPageFormat($format, $orientation);
+		// page margins (1 cm)
+		$margin = 28.35 / $this->k;
+		$this->SetMargins($margin, $margin);
+		$this->clMargin = $this->lMargin;
+		$this->crMargin = $this->rMargin;
+		// internal cell padding
+		$cpadding = $margin / 10;
+		$this->setCellPaddings($cpadding, 0, $cpadding, 0);
+		// cell margins
+		$this->setCellMargins(0, 0, 0, 0);
+		// line width (0.2 mm)
+		$this->LineWidth = 0.57 / $this->k;
+		$this->linestyleWidth = sprintf('%F w', ($this->LineWidth * $this->k));
+		$this->linestyleCap = '0 J';
+		$this->linestyleJoin = '0 j';
+		$this->linestyleDash = '[] 0 d';
+		// automatic page break
+		$this->SetAutoPageBreak(true, (2 * $margin));
+		// full width display mode
+		$this->SetDisplayMode('fullwidth');
+		// compression
+		$this->SetCompression();
+		// set default PDF version number
+		$this->setPDFVersion();
+		$this->tcpdflink = true;
+		$this->encoding = $encoding;
+		$this->HREF = array();
+		$this->getFontsList();
+		$this->fgcolor = array('R' => 0, 'G' => 0, 'B' => 0);
+		$this->strokecolor = array('R' => 0, 'G' => 0, 'B' => 0);
+		$this->bgcolor = array('R' => 255, 'G' => 255, 'B' => 255);
+		$this->extgstates = array();
+		$this->setTextShadow();
+		// user's rights
+		$this->sign = false;
+		$this->ur['enabled'] = false;
+		$this->ur['document'] = '/FullSave';
+		$this->ur['annots'] = '/Create/Delete/Modify/Copy/Import/Export';
+		$this->ur['form'] = '/Add/Delete/FillIn/Import/Export/SubmitStandalone/SpawnTemplate';
+		$this->ur['signature'] = '/Modify';
+		$this->ur['ef'] = '/Create/Delete/Modify/Import';
+		$this->ur['formex'] = '';
+		$this->signature_appearance = array('page' => 1, 'rect' => '0 0 0 0', 'name' => 'Signature');
+		$this->empty_signature_appearance = array();
+		// set default JPEG quality
+		$this->jpeg_quality = 75;
+		// initialize some settings
+		TCPDF_FONTS::utf8Bidi(array(''), '', false, $this->isunicode, $this->CurrentFont);
+		// set default font
+		$this->SetFont($this->FontFamily, $this->FontStyle, $this->FontSizePt);
+		// check if PCRE Unicode support is enabled
+		if ($this->isunicode AND (@preg_match('/\pL/u', 'a') == 1)) {
+			// PCRE unicode support is turned ON
+			// \p{Z} or \p{Separator}: any kind of Unicode whitespace or invisible separator.
+			// \p{Lo} or \p{Other_Letter}: a Unicode letter or ideograph that does not have lowercase and uppercase variants.
+			// \p{Lo} is needed because Chinese characters are packed next to each other without spaces in between.
+			//$this->setSpacesRE('/[^\S\P{Z}\P{Lo}\xa0]/u');
+			$this->setSpacesRE('/[^\S\P{Z}\xa0]/u');
+		} else {
+			// PCRE unicode support is turned OFF
+			$this->setSpacesRE('/[^\S\xa0]/');
+		}
+		$this->default_form_prop = array('lineWidth'=>1, 'borderStyle'=>'solid', 'fillColor'=>array(255, 255, 255), 'strokeColor'=>array(128, 128, 128));
+		// set file ID for trailer
+		$serformat = (is_array($format) ? serialize($format) : $format);
+		$this->file_id = md5(TCPDF_STATIC::getRandomSeed('TCPDF'.$orientation.$unit.$serformat.$encoding));
+		// set document creation and modification timestamp
+		$this->doc_creation_timestamp = time();
+		$this->doc_modification_timestamp = $this->doc_creation_timestamp;
+		// get default graphic vars
+		$this->default_graphic_vars = $this->getGraphicVars();
+		$this->header_xobj_autoreset = false;
+		$this->custom_xmp = '';
+	}
+
+	/**
+	 * Default destructor.
+	 * @public
+	 * @since 1.53.0.TC016
+	 */
+	public function __destruct() {
+		// restore internal encoding
+		if (isset($this->internal_encoding) AND !empty($this->internal_encoding)) {
+			mb_internal_encoding($this->internal_encoding);
+		}
+		// unset all class variables
+		$this->_destroy(true);
+	}
+
+	/**
+	 * Set the units of measure for the document.
+	 * @param $unit (string) User measure unit. Possible values are:<ul><li>pt: point</li><li>mm: millimeter (default)</li><li>cm: centimeter</li><li>in: inch</li></ul><br />A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This is a very common unit in typography; font sizes are expressed in that unit.
+	 * @public
+	 * @since 3.0.015 (2008-06-06)
+	 */
+	public function setPageUnit($unit) {
+		$unit = strtolower($unit);
+		//Set scale factor
+		switch ($unit) {
+			// points
+			case 'px':
+			case 'pt': {
+				$this->k = 1;
+				break;
+			}
+			// millimeters
+			case 'mm': {
+				$this->k = $this->dpi / 25.4;
+				break;
+			}
+			// centimeters
+			case 'cm': {
+				$this->k = $this->dpi / 2.54;
+				break;
+			}
+			// inches
+			case 'in': {
+				$this->k = $this->dpi;
+				break;
+			}
+			// unsupported unit
+			default : {
+				$this->Error('Incorrect unit: '.$unit);
+				break;
+			}
+		}
+		$this->pdfunit = $unit;
+		if (isset($this->CurOrientation)) {
+			$this->setPageOrientation($this->CurOrientation);
+		}
+	}
+
+	/**
+	 * Change the format of the current page
+	 * @param $format (mixed) The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() documentation or an array of two numners (width, height) or an array containing the following measures and options:<ul>
+	 * <li>['format'] = page format name (one of the above);</li>
+	 * <li>['Rotate'] : The number of degrees by which the page shall be rotated clockwise when displayed or printed. The value shall be a multiple of 90.</li>
+	 * <li>['PZ'] : The page's preferred zoom (magnification) factor.</li>
+	 * <li>['MediaBox'] : the boundaries of the physical medium on which the page shall be displayed or printed:</li>
+	 * <li>['MediaBox']['llx'] : lower-left x coordinate in points</li>
+	 * <li>['MediaBox']['lly'] : lower-left y coordinate in points</li>
+	 * <li>['MediaBox']['urx'] : upper-right x coordinate in points</li>
+	 * <li>['MediaBox']['ury'] : upper-right y coordinate in points</li>
+	 * <li>['CropBox'] : the visible region of default user space:</li>
+	 * <li>['CropBox']['llx'] : lower-left x coordinate in points</li>
+	 * <li>['CropBox']['lly'] : lower-left y coordinate in points</li>
+	 * <li>['CropBox']['urx'] : upper-right x coordinate in points</li>
+	 * <li>['CropBox']['ury'] : upper-right y coordinate in points</li>
+	 * <li>['BleedBox'] : the region to which the contents of the page shall be clipped when output in a production environment:</li>
+	 * <li>['BleedBox']['llx'] : lower-left x coordinate in points</li>
+	 * <li>['BleedBox']['lly'] : lower-left y coordinate in points</li>
+	 * <li>['BleedBox']['urx'] : upper-right x coordinate in points</li>
+	 * <li>['BleedBox']['ury'] : upper-right y coordinate in points</li>
+	 * <li>['TrimBox'] : the intended dimensions of the finished page after trimming:</li>
+	 * <li>['TrimBox']['llx'] : lower-left x coordinate in points</li>
+	 * <li>['TrimBox']['lly'] : lower-left y coordinate in points</li>
+	 * <li>['TrimBox']['urx'] : upper-right x coordinate in points</li>
+	 * <li>['TrimBox']['ury'] : upper-right y coordinate in points</li>
+	 * <li>['ArtBox'] : the extent of the page's meaningful content:</li>
+	 * <li>['ArtBox']['llx'] : lower-left x coordinate in points</li>
+	 * <li>['ArtBox']['lly'] : lower-left y coordinate in points</li>
+	 * <li>['ArtBox']['urx'] : upper-right x coordinate in points</li>
+	 * <li>['ArtBox']['ury'] : upper-right y coordinate in points</li>
+	 * <li>['BoxColorInfo'] :specify the colours and other visual characteristics that should be used in displaying guidelines on the screen for each of the possible page boundaries other than the MediaBox:</li>
+	 * <li>['BoxColorInfo'][BOXTYPE]['C'] : an array of three numbers in the range 0-255, representing the components in the DeviceRGB colour space.</li>
+	 * <li>['BoxColorInfo'][BOXTYPE]['W'] : the guideline width in default user units</li>
+	 * <li>['BoxColorInfo'][BOXTYPE]['S'] : the guideline style: S = Solid; D = Dashed</li>
+	 * <li>['BoxColorInfo'][BOXTYPE]['D'] : dash array defining a pattern of dashes and gaps to be used in drawing dashed guidelines</li>
+	 * <li>['trans'] : the style and duration of the visual transition to use when moving from another page to the given page during a presentation</li>
+	 * <li>['trans']['Dur'] : The page's display duration (also called its advance timing): the maximum length of time, in seconds, that the page shall be displayed during presentations before the viewer application shall automatically advance to the next page.</li>
+	 * <li>['trans']['S'] : transition style : Split, Blinds, Box, Wipe, Dissolve, Glitter, R, Fly, Push, Cover, Uncover, Fade</li>
+	 * <li>['trans']['D'] : The duration of the transition effect, in seconds.</li>
+	 * <li>['trans']['Dm'] : (Split and Blinds transition styles only) The dimension in which the specified transition effect shall occur: H = Horizontal, V = Vertical. Default value: H.</li>
+	 * <li>['trans']['M'] : (Split, Box and Fly transition styles only) The direction of motion for the specified transition effect: I = Inward from the edges of the page, O = Outward from the center of the pageDefault value: I.</li>
+	 * <li>['trans']['Di'] : (Wipe, Glitter, Fly, Cover, Uncover and Push transition styles only) The direction in which the specified transition effect shall moves, expressed in degrees counterclockwise starting from a left-to-right direction. If the value is a number, it shall be one of: 0 = Left to right, 90 = Bottom to top (Wipe only), 180 = Right to left (Wipe only), 270 = Top to bottom, 315 = Top-left to bottom-right (Glitter only). If the value is a name, it shall be None, which is relevant only for the Fly transition when the value of SS is not 1.0. Default value: 0.</li>
+	 * <li>['trans']['SS'] : (Fly transition style only) The starting or ending scale at which the changes shall be drawn. If M specifies an inward transition, the scale of the changes drawn shall progress from SS to 1.0 over the course of the transition. If M specifies an outward transition, the scale of the changes drawn shall progress from 1.0 to SS over the course of the transition. Default: 1.0.</li>
+	 * <li>['trans']['B'] : (Fly transition style only) If true, the area that shall be flown in is rectangular and opaque. Default: false.</li>
+	 * </ul>
+	 * @param $orientation (string) page orientation. Possible values are (case insensitive):<ul>
+	 * <li>P or Portrait (default)</li>
+	 * <li>L or Landscape</li>
+	 * <li>'' (empty string) for automatic orientation</li>
+	 * </ul>
+	 * @protected
+	 * @since 3.0.015 (2008-06-06)
+	 * @see getPageSizeFromFormat()
+	 */
+	protected function setPageFormat($format, $orientation='P') {
+		if (!empty($format) AND isset($this->pagedim[$this->page])) {
+			// remove inherited values
+			unset($this->pagedim[$this->page]);
+		}
+		if (is_string($format)) {
+			// get page measures from format name
+			$pf = TCPDF_STATIC::getPageSizeFromFormat($format);
+			$this->fwPt = $pf[0];
+			$this->fhPt = $pf[1];
+		} else {
+			// the boundaries of the physical medium on which the page shall be displayed or printed
+			if (isset($format['MediaBox'])) {
+				$this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'MediaBox', $format['MediaBox']['llx'], $format['MediaBox']['lly'], $format['MediaBox']['urx'], $format['MediaBox']['ury'], false, $this->k, $this->pagedim);
+				$this->fwPt = (($format['MediaBox']['urx'] - $format['MediaBox']['llx']) * $this->k);
+				$this->fhPt = (($format['MediaBox']['ury'] - $format['MediaBox']['lly']) * $this->k);
+			} else {
+				if (isset($format[0]) AND is_numeric($format[0]) AND isset($format[1]) AND is_numeric($format[1])) {
+					$pf = array(($format[0] * $this->k), ($format[1] * $this->k));
+				} else {
+					if (!isset($format['format'])) {
+						// default value
+						$format['format'] = 'A4';
+					}
+					$pf = TCPDF_STATIC::getPageSizeFromFormat($format['format']);
+				}
+				$this->fwPt = $pf[0];
+				$this->fhPt = $pf[1];
+				$this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'MediaBox', 0, 0, $this->fwPt, $this->fhPt, true, $this->k, $this->pagedim);
+			}
+			// the visible region of default user space
+			if (isset($format['CropBox'])) {
+				$this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'CropBox', $format['CropBox']['llx'], $format['CropBox']['lly'], $format['CropBox']['urx'], $format['CropBox']['ury'], false, $this->k, $this->pagedim);
+			}
+			// the region to which the contents of the page shall be clipped when output in a production environment
+			if (isset($format['BleedBox'])) {
+				$this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'BleedBox', $format['BleedBox']['llx'], $format['BleedBox']['lly'], $format['BleedBox']['urx'], $format['BleedBox']['ury'], false, $this->k, $this->pagedim);
+			}
+			// the intended dimensions of the finished page after trimming
+			if (isset($format['TrimBox'])) {
+				$this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'TrimBox', $format['TrimBox']['llx'], $format['TrimBox']['lly'], $format['TrimBox']['urx'], $format['TrimBox']['ury'], false, $this->k, $this->pagedim);
+			}
+			// the page's meaningful content (including potential white space)
+			if (isset($format['ArtBox'])) {
+				$this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'ArtBox', $format['ArtBox']['llx'], $format['ArtBox']['lly'], $format['ArtBox']['urx'], $format['ArtBox']['ury'], false, $this->k, $this->pagedim);
+			}
+			// specify the colours and other visual characteristics that should be used in displaying guidelines on the screen for the various page boundaries
+			if (isset($format['BoxColorInfo'])) {
+				$this->pagedim[$this->page]['BoxColorInfo'] = $format['BoxColorInfo'];
+			}
+			if (isset($format['Rotate']) AND (($format['Rotate'] % 90) == 0)) {
+				// The number of degrees by which the page shall be rotated clockwise when displayed or printed. The value shall be a multiple of 90.
+				$this->pagedim[$this->page]['Rotate'] = intval($format['Rotate']);
+			}
+			if (isset($format['PZ'])) {
+				// The page's preferred zoom (magnification) factor
+				$this->pagedim[$this->page]['PZ'] = floatval($format['PZ']);
+			}
+			if (isset($format['trans'])) {
+				// The style and duration of the visual transition to use when moving from another page to the given page during a presentation
+				if (isset($format['trans']['Dur'])) {
+					// The page's display duration
+					$this->pagedim[$this->page]['trans']['Dur'] = floatval($format['trans']['Dur']);
+				}
+				$stansition_styles = array('Split', 'Blinds', 'Box', 'Wipe', 'Dissolve', 'Glitter', 'R', 'Fly', 'Push', 'Cover', 'Uncover', 'Fade');
+				if (isset($format['trans']['S']) AND in_array($format['trans']['S'], $stansition_styles)) {
+					// The transition style that shall be used when moving to this page from another during a presentation
+					$this->pagedim[$this->page]['trans']['S'] = $format['trans']['S'];
+					$valid_effect = array('Split', 'Blinds');
+					$valid_vals = array('H', 'V');
+					if (isset($format['trans']['Dm']) AND in_array($format['trans']['S'], $valid_effect) AND in_array($format['trans']['Dm'], $valid_vals)) {
+						$this->pagedim[$this->page]['trans']['Dm'] = $format['trans']['Dm'];
+					}
+					$valid_effect = array('Split', 'Box', 'Fly');
+					$valid_vals = array('I', 'O');
+					if (isset($format['trans']['M']) AND in_array($format['trans']['S'], $valid_effect) AND in_array($format['trans']['M'], $valid_vals)) {
+						$this->pagedim[$this->page]['trans']['M'] = $format['trans']['M'];
+					}
+					$valid_effect = array('Wipe', 'Glitter', 'Fly', 'Cover', 'Uncover', 'Push');
+					if (isset($format['trans']['Di']) AND in_array($format['trans']['S'], $valid_effect)) {
+						if (((($format['trans']['Di'] == 90) OR ($format['trans']['Di'] == 180)) AND ($format['trans']['S'] == 'Wipe'))
+							OR (($format['trans']['Di'] == 315) AND ($format['trans']['S'] == 'Glitter'))
+							OR (($format['trans']['Di'] == 0) OR ($format['trans']['Di'] == 270))) {
+							$this->pagedim[$this->page]['trans']['Di'] = intval($format['trans']['Di']);
+						}
+					}
+					if (isset($format['trans']['SS']) AND ($format['trans']['S'] == 'Fly')) {
+						$this->pagedim[$this->page]['trans']['SS'] = floatval($format['trans']['SS']);
+					}
+					if (isset($format['trans']['B']) AND ($format['trans']['B'] === true) AND ($format['trans']['S'] == 'Fly')) {
+						$this->pagedim[$this->page]['trans']['B'] = 'true';
+					}
+				} else {
+					$this->pagedim[$this->page]['trans']['S'] = 'R';
+				}
+				if (isset($format['trans']['D'])) {
+					// The duration of the transition effect, in seconds
+					$this->pagedim[$this->page]['trans']['D'] = floatval($format['trans']['D']);
+				} else {
+					$this->pagedim[$this->page]['trans']['D'] = 1;
+				}
+			}
+		}
+		$this->setPageOrientation($orientation);
+	}
+
+	/**
+	 * Set page orientation.
+	 * @param $orientation (string) page orientation. Possible values are (case insensitive):<ul><li>P or Portrait (default)</li><li>L or Landscape</li><li>'' (empty string) for automatic orientation</li></ul>
+	 * @param $autopagebreak (boolean) Boolean indicating if auto-page-break mode should be on or off.
+	 * @param $bottommargin (float) bottom margin of the page.
+	 * @public
+	 * @since 3.0.015 (2008-06-06)
+	 */
+	public function setPageOrientation($orientation, $autopagebreak='', $bottommargin='') {
+		if (!isset($this->pagedim[$this->page]['MediaBox'])) {
+			// the boundaries of the physical medium on which the page shall be displayed or printed
+			$this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'MediaBox', 0, 0, $this->fwPt, $this->fhPt, true, $this->k, $this->pagedim);
+		}
+		if (!isset($this->pagedim[$this->page]['CropBox'])) {
+			// the visible region of default user space
+			$this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'CropBox', $this->pagedim[$this->page]['MediaBox']['llx'], $this->pagedim[$this->page]['MediaBox']['lly'], $this->pagedim[$this->page]['MediaBox']['urx'], $this->pagedim[$this->page]['MediaBox']['ury'], true, $this->k, $this->pagedim);
+		}
+		if (!isset($this->pagedim[$this->page]['BleedBox'])) {
+			// the region to which the contents of the page shall be clipped when output in a production environment
+			$this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'BleedBox', $this->pagedim[$this->page]['CropBox']['llx'], $this->pagedim[$this->page]['CropBox']['lly'], $this->pagedim[$this->page]['CropBox']['urx'], $this->pagedim[$this->page]['CropBox']['ury'], true, $this->k, $this->pagedim);
+		}
+		if (!isset($this->pagedim[$this->page]['TrimBox'])) {
+			// the intended dimensions of the finished page after trimming
+			$this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'TrimBox', $this->pagedim[$this->page]['CropBox']['llx'], $this->pagedim[$this->page]['CropBox']['lly'], $this->pagedim[$this->page]['CropBox']['urx'], $this->pagedim[$this->page]['CropBox']['ury'], true, $this->k, $this->pagedim);
+		}
+		if (!isset($this->pagedim[$this->page]['ArtBox'])) {
+			// the page's meaningful content (including potential white space)
+			$this->pagedim = TCPDF_STATIC::setPageBoxes($this->page, 'ArtBox', $this->pagedim[$this->page]['CropBox']['llx'], $this->pagedim[$this->page]['CropBox']['lly'], $this->pagedim[$this->page]['CropBox']['urx'], $this->pagedim[$this->page]['CropBox']['ury'], true, $this->k, $this->pagedim);
+		}
+		if (!isset($this->pagedim[$this->page]['Rotate'])) {
+			// The number of degrees by which the page shall be rotated clockwise when displayed or printed. The value shall be a multiple of 90.
+			$this->pagedim[$this->page]['Rotate'] = 0;
+		}
+		if (!isset($this->pagedim[$this->page]['PZ'])) {
+			// The page's preferred zoom (magnification) factor
+			$this->pagedim[$this->page]['PZ'] = 1;
+		}
+		if ($this->fwPt > $this->fhPt) {
+			// landscape
+			$default_orientation = 'L';
+		} else {
+			// portrait
+			$default_orientation = 'P';
+		}
+		$valid_orientations = array('P', 'L');
+		if (empty($orientation)) {
+			$orientation = $default_orientation;
+		} else {
+			$orientation = strtoupper($orientation{0});
+		}
+		if (in_array($orientation, $valid_orientations) AND ($orientation != $default_orientation)) {
+			$this->CurOrientation = $orientation;
+			$this->wPt = $this->fhPt;
+			$this->hPt = $this->fwPt;
+		} else {
+			$this->CurOrientation = $default_orientation;
+			$this->wPt = $this->fwPt;
+			$this->hPt = $this->fhPt;
+		}
+		if ((abs($this->pagedim[$this->page]['MediaBox']['urx'] - $this->hPt) < $this->feps) AND (abs($this->pagedim[$this->page]['MediaBox']['ury'] - $this->wPt) < $this->feps)){
+			// swap X and Y coordinates (change page orientation)
+			$this->pagedim = TCPDF_STATIC::swapPageBoxCoordinates($this->page, $this->pagedim);
+		}
+		$this->w = ($this->wPt / $this->k);
+		$this->h = ($this->hPt / $this->k);
+		if (TCPDF_STATIC::empty_string($autopagebreak)) {
+			if (isset($this->AutoPageBreak)) {
+				$autopagebreak = $this->AutoPageBreak;
+			} else {
+				$autopagebreak = true;
+			}
+		}
+		if (TCPDF_STATIC::empty_string($bottommargin)) {
+			if (isset($this->bMargin)) {
+				$bottommargin = $this->bMargin;
+			} else {
+				// default value = 2 cm
+				$bottommargin = 2 * 28.35 / $this->k;
+			}
+		}
+		$this->SetAutoPageBreak($autopagebreak, $bottommargin);
+		// store page dimensions
+		$this->pagedim[$this->page]['w'] = $this->wPt;
+		$this->pagedim[$this->page]['h'] = $this->hPt;
+		$this->pagedim[$this->page]['wk'] = $this->w;
+		$this->pagedim[$this->page]['hk'] = $this->h;
+		$this->pagedim[$this->page]['tm'] = $this->tMargin;
+		$this->pagedim[$this->page]['bm'] = $bottommargin;
+		$this->pagedim[$this->page]['lm'] = $this->lMargin;
+		$this->pagedim[$this->page]['rm'] = $this->rMargin;
+		$this->pagedim[$this->page]['pb'] = $autopagebreak;
+		$this->pagedim[$this->page]['or'] = $this->CurOrientation;
+		$this->pagedim[$this->page]['olm'] = $this->original_lMargin;
+		$this->pagedim[$this->page]['orm'] = $this->original_rMargin;
+	}
+
+	/**
+	 * Set regular expression to detect withespaces or word separators.
+	 * The pattern delimiter must be the forward-slash character "/".
+	 * Some example patterns are:
+	 * <pre>
+	 * Non-Unicode or missing PCRE unicode support: "/[^\S\xa0]/"
+	 * Unicode and PCRE unicode support: "/[^\S\P{Z}\xa0]/u"
+	 * Unicode and PCRE unicode support in Chinese mode: "/[^\S\P{Z}\P{Lo}\xa0]/u"
+	 * if PCRE unicode support is turned ON ("\P" is the negate class of "\p"):
+	 * "\p{Z}" or "\p{Separator}": any kind of Unicode whitespace or invisible separator.
+	 * "\p{Lo}" or "\p{Other_Letter}": a Unicode letter or ideograph that does not have lowercase and uppercase variants.
+	 * "\p{Lo}" is needed for Chinese characters because are packed next to each other without spaces in between.
+	 * </pre>
+	 * @param $re (string) regular expression (leave empty for default).
+	 * @public
+	 * @since 4.6.016 (2009-06-15)
+	 */
+	public function setSpacesRE($re='/[^\S\xa0]/') {
+		$this->re_spaces = $re;
+		$re_parts = explode('/', $re);
+		// get pattern parts
+		$this->re_space = array();
+		if (isset($re_parts[1]) AND !empty($re_parts[1])) {
+			$this->re_space['p'] = $re_parts[1];
+		} else {
+			$this->re_space['p'] = '[\s]';
+		}
+		// set pattern modifiers
+		if (isset($re_parts[2]) AND !empty($re_parts[2])) {
+			$this->re_space['m'] = $re_parts[2];
+		} else {
+			$this->re_space['m'] = '';
+		}
+	}
+
+	/**
+	 * Enable or disable Right-To-Left language mode
+	 * @param $enable (Boolean) if true enable Right-To-Left language mode.
+	 * @param $resetx (Boolean) if true reset the X position on direction change.
+	 * @public
+	 * @since 2.0.000 (2008-01-03)
+	 */
+	public function setRTL($enable, $resetx=true) {
+		$enable = $enable ? true : false;
+		$resetx = ($resetx AND ($enable != $this->rtl));
+		$this->rtl = $enable;
+		$this->tmprtl = false;
+		if ($resetx) {
+			$this->Ln(0);
+		}
+	}
+
+	/**
+	 * Return the RTL status
+	 * @return boolean
+	 * @public
+	 * @since 4.0.012 (2008-07-24)
+	 */
+	public function getRTL() {
+		return $this->rtl;
+	}
+
+	/**
+	 * Force temporary RTL language direction
+	 * @param $mode (mixed) can be false, 'L' for LTR or 'R' for RTL
+	 * @public
+	 * @since 2.1.000 (2008-01-09)
+	 */
+	public function setTempRTL($mode) {
+		$newmode = false;
+		switch (strtoupper($mode)) {
+			case 'LTR':
+			case 'L': {
+				if ($this->rtl) {
+					$newmode = 'L';
+				}
+				break;
+			}
+			case 'RTL':
+			case 'R': {
+				if (!$this->rtl) {
+					$newmode = 'R';
+				}
+				break;
+			}
+			case false:
+			default: {
+				$newmode = false;
+				break;
+			}
+		}
+		$this->tmprtl = $newmode;
+	}
+
+	/**
+	 * Return the current temporary RTL status
+	 * @return boolean
+	 * @public
+	 * @since 4.8.014 (2009-11-04)
+	 */
+	public function isRTLTextDir() {
+		return ($this->rtl OR ($this->tmprtl == 'R'));
+	}
+
+	/**
+	 * Set the last cell height.
+	 * @param $h (float) cell height.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 1.53.0.TC034
+	 */
+	public function setLastH($h) {
+		$this->lasth = $h;
+	}
+
+	/**
+	 * Reset the last cell height.
+	 * @public
+	 * @since 5.9.000 (2010-10-03)
+	 */
+	public function resetLastH() {
+		$this->lasth = ($this->FontSize * $this->cell_height_ratio) + $this->cell_padding['T'] + $this->cell_padding['B'];
+	}
+
+	/**
+	 * Get the last cell height.
+	 * @return last cell height
+	 * @public
+	 * @since 4.0.017 (2008-08-05)
+	 */
+	public function getLastH() {
+		return $this->lasth;
+	}
+
+	/**
+	 * Set the adjusting factor to convert pixels to user units.
+	 * @param $scale (float) adjusting factor to convert pixels to user units.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 1.5.2
+	 */
+	public function setImageScale($scale) {
+		$this->imgscale = $scale;
+	}
+
+	/**
+	 * Returns the adjusting factor to convert pixels to user units.
+	 * @return float adjusting factor to convert pixels to user units.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 1.5.2
+	 */
+	public function getImageScale() {
+		return $this->imgscale;
+	}
+
+	/**
+	 * Returns an array of page dimensions:
+	 * <ul><li>$this->pagedim[$this->page]['w'] = page width in points</li><li>$this->pagedim[$this->page]['h'] = height in points</li><li>$this->pagedim[$this->page]['wk'] = page width in user units</li><li>$this->pagedim[$this->page]['hk'] = page height in user units</li><li>$this->pagedim[$this->page]['tm'] = top margin</li><li>$this->pagedim[$this->page]['bm'] = bottom margin</li><li>$this->pagedim[$this->page]['lm'] = left margin</li><li>$this->pagedim[$this->page]['rm'] = right margin</li><li>$this->pagedim[$this->page]['pb'] = auto page break</li><li>$this->pagedim[$this->page]['or'] = page orientation</li><li>$this->pagedim[$this->page]['olm'] = original left margin</li><li>$this->pagedim[$this->page]['orm'] = original right margin</li><li>$this->pagedim[$this->page]['Rotate'] = The number of degrees by which the page shall be rotated clockwise when displayed or printed. The value shall be a multiple of 90.</li><li>$this->pagedim[$this->page]['PZ'] = The page's preferred zoom (magnification) factor.</li><li>$this->pagedim[$this->page]['trans'] : the style and duration of the visual transition to use when moving from another page to the given page during a presentation<ul><li>$this->pagedim[$this->page]['trans']['Dur'] = The page's display duration (also called its advance timing): the maximum length of time, in seconds, that the page shall be displayed during presentations before the viewer application shall automatically advance to the next page.</li><li>$this->pagedim[$this->page]['trans']['S'] = transition style : Split, Blinds, Box, Wipe, Dissolve, Glitter, R, Fly, Push, Cover, Uncover, Fade</li><li>$this->pagedim[$this->page]['trans']['D'] = The duration of the transition effect, in seconds.</li><li>$this->pagedim[$this->page]['trans']['Dm'] = (Split and Blinds transition styles only) The dimension in which the specified transition effect shall occur: H = Horizontal, V = Vertical. Default value: H.</li><li>$this->pagedim[$this->page]['trans']['M'] = (Split, Box and Fly transition styles only) The direction of motion for the specified transition effect: I = Inward from the edges of the page, O = Outward from the center of the pageDefault value: I.</li><li>$this->pagedim[$this->page]['trans']['Di'] = (Wipe, Glitter, Fly, Cover, Uncover and Push transition styles only) The direction in which the specified transition effect shall moves, expressed in degrees counterclockwise starting from a left-to-right direction. If the value is a number, it shall be one of: 0 = Left to right, 90 = Bottom to top (Wipe only), 180 = Right to left (Wipe only), 270 = Top to bottom, 315 = Top-left to bottom-right (Glitter only). If the value is a name, it shall be None, which is relevant only for the Fly transition when the value of SS is not 1.0. Default value: 0.</li><li>$this->pagedim[$this->page]['trans']['SS'] = (Fly transition style only) The starting or ending scale at which the changes shall be drawn. If M specifies an inward transition, the scale of the changes drawn shall progress from SS to 1.0 over the course of the transition. If M specifies an outward transition, the scale of the changes drawn shall progress from 1.0 to SS over the course of the transition. Default: 1.0. </li><li>$this->pagedim[$this->page]['trans']['B'] = (Fly transition style only) If true, the area that shall be flown in is rectangular and opaque. Default: false.</li></ul></li><li>$this->pagedim[$this->page]['MediaBox'] : the boundaries of the physical medium on which the page shall be displayed or printed<ul><li>$this->pagedim[$this->page]['MediaBox']['llx'] = lower-left x coordinate in points</li><li>$this->pagedim[$this->page]['MediaBox']['lly'] = lower-left y coordinate in points</li><li>$this->pagedim[$this->page]['MediaBox']['urx'] = upper-right x coordinate in points</li><li>$this->pagedim[$this->page]['MediaBox']['ury'] = upper-right y coordinate in points</li></ul></li><li>$this->pagedim[$this->page]['CropBox'] : the visible region of default user space<ul><li>$this->pagedim[$this->page]['CropBox']['llx'] = lower-left x coordinate in points</li><li>$this->pagedim[$this->page]['CropBox']['lly'] = lower-left y coordinate in points</li><li>$this->pagedim[$this->page]['CropBox']['urx'] = upper-right x coordinate in points</li><li>$this->pagedim[$this->page]['CropBox']['ury'] = upper-right y coordinate in points</li></ul></li><li>$this->pagedim[$this->page]['BleedBox'] : the region to which the contents of the page shall be clipped when output in a production environment<ul><li>$this->pagedim[$this->page]['BleedBox']['llx'] = lower-left x coordinate in points</li><li>$this->pagedim[$this->page]['BleedBox']['lly'] = lower-left y coordinate in points</li><li>$this->pagedim[$this->page]['BleedBox']['urx'] = upper-right x coordinate in points</li><li>$this->pagedim[$this->page]['BleedBox']['ury'] = upper-right y coordinate in points</li></ul></li><li>$this->pagedim[$this->page]['TrimBox'] : the intended dimensions of the finished page after trimming<ul><li>$this->pagedim[$this->page]['TrimBox']['llx'] = lower-left x coordinate in points</li><li>$this->pagedim[$this->page]['TrimBox']['lly'] = lower-left y coordinate in points</li><li>$this->pagedim[$this->page]['TrimBox']['urx'] = upper-right x coordinate in points</li><li>$this->pagedim[$this->page]['TrimBox']['ury'] = upper-right y coordinate in points</li></ul></li><li>$this->pagedim[$this->page]['ArtBox'] : the extent of the page's meaningful content<ul><li>$this->pagedim[$this->page]['ArtBox']['llx'] = lower-left x coordinate in points</li><li>$this->pagedim[$this->page]['ArtBox']['lly'] = lower-left y coordinate in points</li><li>$this->pagedim[$this->page]['ArtBox']['urx'] = upper-right x coordinate in points</li><li>$this->pagedim[$this->page]['ArtBox']['ury'] = upper-right y coordinate in points</li></ul></li></ul>
+	 * @param $pagenum (int) page number (empty = current page)
+	 * @return array of page dimensions.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 4.5.027 (2009-03-16)
+	 */
+	public function getPageDimensions($pagenum='') {
+		if (empty($pagenum)) {
+			$pagenum = $this->page;
+		}
+		return $this->pagedim[$pagenum];
+	}
+
+	/**
+	 * Returns the page width in units.
+	 * @param $pagenum (int) page number (empty = current page)
+	 * @return int page width.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 1.5.2
+	 * @see getPageDimensions()
+	 */
+	public function getPageWidth($pagenum='') {
+		if (empty($pagenum)) {
+			return $this->w;
+		}
+		return $this->pagedim[$pagenum]['w'];
+	}
+
+	/**
+	 * Returns the page height in units.
+	 * @param $pagenum (int) page number (empty = current page)
+	 * @return int page height.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 1.5.2
+	 * @see getPageDimensions()
+	 */
+	public function getPageHeight($pagenum='') {
+		if (empty($pagenum)) {
+			return $this->h;
+		}
+		return $this->pagedim[$pagenum]['h'];
+	}
+
+	/**
+	 * Returns the page break margin.
+	 * @param $pagenum (int) page number (empty = current page)
+	 * @return int page break margin.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 1.5.2
+	 * @see getPageDimensions()
+	 */
+	public function getBreakMargin($pagenum='') {
+		if (empty($pagenum)) {
+			return $this->bMargin;
+		}
+		return $this->pagedim[$pagenum]['bm'];
+	}
+
+	/**
+	 * Returns the scale factor (number of points in user unit).
+	 * @return int scale factor.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 1.5.2
+	 */
+	public function getScaleFactor() {
+		return $this->k;
+	}
+
+	/**
+	 * Defines the left, top and right margins.
+	 * @param $left (float) Left margin.
+	 * @param $top (float) Top margin.
+	 * @param $right (float) Right margin. Default value is the left one.
+	 * @param $keepmargins (boolean) if true overwrites the default page margins
+	 * @public
+	 * @since 1.0
+	 * @see SetLeftMargin(), SetTopMargin(), SetRightMargin(), SetAutoPageBreak()
+	 */
+	public function SetMargins($left, $top, $right=-1, $keepmargins=false) {
+		//Set left, top and right margins
+		$this->lMargin = $left;
+		$this->tMargin = $top;
+		if ($right == -1) {
+			$right = $left;
+		}
+		$this->rMargin = $right;
+		if ($keepmargins) {
+			// overwrite original values
+			$this->original_lMargin = $this->lMargin;
+			$this->original_rMargin = $this->rMargin;
+		}
+	}
+
+	/**
+	 * Defines the left margin. The method can be called before creating the first page. If the current abscissa gets out of page, it is brought back to the margin.
+	 * @param $margin (float) The margin.
+	 * @public
+	 * @since 1.4
+	 * @see SetTopMargin(), SetRightMargin(), SetAutoPageBreak(), SetMargins()
+	 */
+	public function SetLeftMargin($margin) {
+		//Set left margin
+		$this->lMargin = $margin;
+		if (($this->page > 0) AND ($this->x < $margin)) {
+			$this->x = $margin;
+		}
+	}
+
+	/**
+	 * Defines the top margin. The method can be called before creating the first page.
+	 * @param $margin (float) The margin.
+	 * @public
+	 * @since 1.5
+	 * @see SetLeftMargin(), SetRightMargin(), SetAutoPageBreak(), SetMargins()
+	 */
+	public function SetTopMargin($margin) {
+		//Set top margin
+		$this->tMargin = $margin;
+		if (($this->page > 0) AND ($this->y < $margin)) {
+			$this->y = $margin;
+		}
+	}
+
+	/**
+	 * Defines the right margin. The method can be called before creating the first page.
+	 * @param $margin (float) The margin.
+	 * @public
+	 * @since 1.5
+	 * @see SetLeftMargin(), SetTopMargin(), SetAutoPageBreak(), SetMargins()
+	 */
+	public function SetRightMargin($margin) {
+		$this->rMargin = $margin;
+		if (($this->page > 0) AND ($this->x > ($this->w - $margin))) {
+			$this->x = $this->w - $margin;
+		}
+	}
+
+	/**
+	 * Set the same internal Cell padding for top, right, bottom, left-
+	 * @param $pad (float) internal padding.
+	 * @public
+	 * @since 2.1.000 (2008-01-09)
+	 * @see getCellPaddings(), setCellPaddings()
+	 */
+	public function SetCellPadding($pad) {
+		if ($pad >= 0) {
+			$this->cell_padding['L'] = $pad;
+			$this->cell_padding['T'] = $pad;
+			$this->cell_padding['R'] = $pad;
+			$this->cell_padding['B'] = $pad;
+		}
+	}
+
+	/**
+	 * Set the internal Cell paddings.
+	 * @param $left (float) left padding
+	 * @param $top (float) top padding
+	 * @param $right (float) right padding
+	 * @param $bottom (float) bottom padding
+	 * @public
+	 * @since 5.9.000 (2010-10-03)
+	 * @see getCellPaddings(), SetCellPadding()
+	 */
+	public function setCellPaddings($left='', $top='', $right='', $bottom='') {
+		if (($left !== '') AND ($left >= 0)) {
+			$this->cell_padding['L'] = $left;
+		}
+		if (($top !== '') AND ($top >= 0)) {
+			$this->cell_padding['T'] = $top;
+		}
+		if (($right !== '') AND ($right >= 0)) {
+			$this->cell_padding['R'] = $right;
+		}
+		if (($bottom !== '') AND ($bottom >= 0)) {
+			$this->cell_padding['B'] = $bottom;
+		}
+	}
+
+	/**
+	 * Get the internal Cell padding array.
+	 * @return array of padding values
+	 * @public
+	 * @since 5.9.000 (2010-10-03)
+	 * @see setCellPaddings(), SetCellPadding()
+	 */
+	public function getCellPaddings() {
+		return $this->cell_padding;
+	}
+
+	/**
+	 * Set the internal Cell margins.
+	 * @param $left (float) left margin
+	 * @param $top (float) top margin
+	 * @param $right (float) right margin
+	 * @param $bottom (float) bottom margin
+	 * @public
+	 * @since 5.9.000 (2010-10-03)
+	 * @see getCellMargins()
+	 */
+	public function setCellMargins($left='', $top='', $right='', $bottom='') {
+		if (($left !== '') AND ($left >= 0)) {
+			$this->cell_margin['L'] = $left;
+		}
+		if (($top !== '') AND ($top >= 0)) {
+			$this->cell_margin['T'] = $top;
+		}
+		if (($right !== '') AND ($right >= 0)) {
+			$this->cell_margin['R'] = $right;
+		}
+		if (($bottom !== '') AND ($bottom >= 0)) {
+			$this->cell_margin['B'] = $bottom;
+		}
+	}
+
+	/**
+	 * Get the internal Cell margin array.
+	 * @return array of margin values
+	 * @public
+	 * @since 5.9.000 (2010-10-03)
+	 * @see setCellMargins()
+	 */
+	public function getCellMargins() {
+		return $this->cell_margin;
+	}
+
+	/**
+	 * Adjust the internal Cell padding array to take account of the line width.
+	 * @param $brd (mixed) Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
+	 * @return array of adjustments
+	 * @public
+	 * @since 5.9.000 (2010-10-03)
+	 */
+	protected function adjustCellPadding($brd=0) {
+		if (empty($brd)) {
+			return;
+		}
+		if (is_string($brd)) {
+			// convert string to array
+			$slen = strlen($brd);
+			$newbrd = array();
+			for ($i = 0; $i < $slen; ++$i) {
+				$newbrd[$brd[$i]] = true;
+			}
+			$brd = $newbrd;
+		} elseif (($brd === 1) OR ($brd === true) OR (is_numeric($brd) AND (intval($brd) > 0))) {
+			$brd = array('LRTB' => true);
+		}
+		if (!is_array($brd)) {
+			return;
+		}
+		// store current cell padding
+		$cp = $this->cell_padding;
+		// select border mode
+		if (isset($brd['mode'])) {
+			$mode = $brd['mode'];
+			unset($brd['mode']);
+		} else {
+			$mode = 'normal';
+		}
+		// process borders
+		foreach ($brd as $border => $style) {
+			$line_width = $this->LineWidth;
+			if (is_array($style) AND isset($style['width'])) {
+				// get border width
+				$line_width = $style['width'];
+			}
+			$adj = 0; // line width inside the cell
+			switch ($mode) {
+				case 'ext': {
+					$adj = 0;
+					break;
+				}
+				case 'int': {
+					$adj = $line_width;
+					break;
+				}
+				case 'normal':
+				default: {
+					$adj = ($line_width / 2);
+					break;
+				}
+			}
+			// correct internal cell padding if required to avoid overlap between text and lines
+			if ((strpos($border,'T') !== false) AND ($this->cell_padding['T'] < $adj)) {
+				$this->cell_padding['T'] = $adj;
+			}
+			if ((strpos($border,'R') !== false) AND ($this->cell_padding['R'] < $adj)) {
+				$this->cell_padding['R'] = $adj;
+			}
+			if ((strpos($border,'B') !== false) AND ($this->cell_padding['B'] < $adj)) {
+				$this->cell_padding['B'] = $adj;
+			}
+			if ((strpos($border,'L') !== false) AND ($this->cell_padding['L'] < $adj)) {
+				$this->cell_padding['L'] = $adj;
+			}
+		}
+		return array('T' => ($this->cell_padding['T'] - $cp['T']), 'R' => ($this->cell_padding['R'] - $cp['R']), 'B' => ($this->cell_padding['B'] - $cp['B']), 'L' => ($this->cell_padding['L'] - $cp['L']));
+	}
+
+	/**
+	 * Enables or disables the automatic page breaking mode. When enabling, the second parameter is the distance from the bottom of the page that defines the triggering limit. By default, the mode is on and the margin is 2 cm.
+	 * @param $auto (boolean) Boolean indicating if mode should be on or off.
+	 * @param $margin (float) Distance from the bottom of the page.
+	 * @public
+	 * @since 1.0
+	 * @see Cell(), MultiCell(), AcceptPageBreak()
+	 */
+	public function SetAutoPageBreak($auto, $margin=0) {
+		$this->AutoPageBreak = $auto ? true : false;
+		$this->bMargin = $margin;
+		$this->PageBreakTrigger = $this->h - $margin;
+	}
+
+	/**
+	 * Return the auto-page-break mode (true or false).
+	 * @return boolean auto-page-break mode
+	 * @public
+	 * @since 5.9.088
+	 */
+	public function getAutoPageBreak() {
+		return $this->AutoPageBreak;
+	}
+
+	/**
+	 * Defines the way the document is to be displayed by the viewer.
+	 * @param $zoom (mixed) The zoom to use. It can be one of the following string values or a number indicating the zooming factor to use. <ul><li>fullpage: displays the entire page on screen </li><li>fullwidth: uses maximum width of window</li><li>real: uses real size (equivalent to 100% zoom)</li><li>default: uses viewer default mode</li></ul>
+	 * @param $layout (string) The page layout. Possible values are:<ul><li>SinglePage Display one page at a time</li><li>OneColumn Display the pages in one column</li><li>TwoColumnLeft Display the pages in two columns, with odd-numbered pages on the left</li><li>TwoColumnRight Display the pages in two columns, with odd-numbered pages on the right</li><li>TwoPageLeft (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the left</li><li>TwoPageRight (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the right</li></ul>
+	 * @param $mode (string) A name object specifying how the document should be displayed when opened:<ul><li>UseNone Neither document outline nor thumbnail images visible</li><li>UseOutlines Document outline visible</li><li>UseThumbs Thumbnail images visible</li><li>FullScreen Full-screen mode, with no menu bar, window controls, or any other window visible</li><li>UseOC (PDF 1.5) Optional content group panel visible</li><li>UseAttachments (PDF 1.6) Attachments panel visible</li></ul>
+	 * @public
+	 * @since 1.2
+	 */
+	public function SetDisplayMode($zoom, $layout='SinglePage', $mode='UseNone') {
+		if (($zoom == 'fullpage') OR ($zoom == 'fullwidth') OR ($zoom == 'real') OR ($zoom == 'default') OR (!is_string($zoom))) {
+			$this->ZoomMode = $zoom;
+		} else {
+			$this->Error('Incorrect zoom display mode: '.$zoom);
+		}
+		$this->LayoutMode = TCPDF_STATIC::getPageLayoutMode($layout);
+		$this->PageMode = TCPDF_STATIC::getPageMode($mode);
+	}
+
+	/**
+	 * Activates or deactivates page compression. When activated, the internal representation of each page is compressed, which leads to a compression ratio of about 2 for the resulting document. Compression is on by default.
+	 * Note: the Zlib extension is required for this feature. If not present, compression will be turned off.
+	 * @param $compress (boolean) Boolean indicating if compression must be enabled.
+	 * @public
+	 * @since 1.4
+	 */
+	public function SetCompression($compress=true) {
+		if (function_exists('gzcompress')) {
+			$this->compress = $compress ? true : false;
+		} else {
+			$this->compress = false;
+		}
+	}
+
+	/**
+	 * Set flag to force sRGB_IEC61966-2.1 black scaled ICC color profile for the whole document.
+	 * @param $mode (boolean) If true force sRGB output intent.
+	 * @public
+	 * @since 5.9.121 (2011-09-28)
+	 */
+	public function setSRGBmode($mode=false) {
+		$this->force_srgb = $mode ? true : false;
+	}
+
+	/**
+	 * Turn on/off Unicode mode for document information dictionary (meta tags).
+	 * This has effect only when unicode mode is set to false.
+	 * @param $unicode (boolean) if true set the meta information in Unicode
+	 * @since 5.9.027 (2010-12-01)
+	 * @public
+	 */
+	public function SetDocInfoUnicode($unicode=true) {
+		$this->docinfounicode = $unicode ? true : false;
+	}
+
+	/**
+	 * Defines the title of the document.
+	 * @param $title (string) The title.
+	 * @public
+	 * @since 1.2
+	 * @see SetAuthor(), SetCreator(), SetKeywords(), SetSubject()
+	 */
+	public function SetTitle($title) {
+		$this->title = $title;
+	}
+
+	/**
+	 * Defines the subject of the document.
+	 * @param $subject (string) The subject.
+	 * @public
+	 * @since 1.2
+	 * @see SetAuthor(), SetCreator(), SetKeywords(), SetTitle()
+	 */
+	public function SetSubject($subject) {
+		$this->subject = $subject;
+	}
+
+	/**
+	 * Defines the author of the document.
+	 * @param $author (string) The name of the author.
+	 * @public
+	 * @since 1.2
+	 * @see SetCreator(), SetKeywords(), SetSubject(), SetTitle()
+	 */
+	public function SetAuthor($author) {
+		$this->author = $author;
+	}
+
+	/**
+	 * Associates keywords with the document, generally in the form 'keyword1 keyword2 ...'.
+	 * @param $keywords (string) The list of keywords.
+	 * @public
+	 * @since 1.2
+	 * @see SetAuthor(), SetCreator(), SetSubject(), SetTitle()
+	 */
+	public function SetKeywords($keywords) {
+		$this->keywords = $keywords;
+	}
+
+	/**
+	 * Defines the creator of the document. This is typically the name of the application that generates the PDF.
+	 * @param $creator (string) The name of the creator.
+	 * @public
+	 * @since 1.2
+	 * @see SetAuthor(), SetKeywords(), SetSubject(), SetTitle()
+	 */
+	public function SetCreator($creator) {
+		$this->creator = $creator;
+	}
+
+	/**
+	 * Throw an exception or print an error message and die if the K_TCPDF_PARSER_THROW_EXCEPTION_ERROR constant is set to true.
+	 * @param $msg (string) The error message
+	 * @public
+	 * @since 1.0
+	 */
+	public function Error($msg) {
+		// unset all class variables
+		$this->_destroy(true);
+		if (defined('K_TCPDF_THROW_EXCEPTION_ERROR') AND !K_TCPDF_THROW_EXCEPTION_ERROR) {
+			die('<strong>TCPDF ERROR: </strong>'.$msg);
+		} else {
+			throw new Exception('TCPDF ERROR: '.$msg);
+		}
+	}
+
+	/**
+	 * This method begins the generation of the PDF document.
+	 * It is not necessary to call it explicitly because AddPage() does it automatically.
+	 * Note: no page is created by this method
+	 * @public
+	 * @since 1.0
+	 * @see AddPage(), Close()
+	 */
+	public function Open() {
+		$this->state = 1;
+	}
+
+	/**
+	 * Terminates the PDF document.
+	 * It is not necessary to call this method explicitly because Output() does it automatically.
+	 * If the document contains no page, AddPage() is called to prevent from getting an invalid document.
+	 * @public
+	 * @since 1.0
+	 * @see Open(), Output()
+	 */
+	public function Close() {
+		if ($this->state == 3) {
+			return;
+		}
+		if ($this->page == 0) {
+			$this->AddPage();
+		}
+		$this->endLayer();
+		if ($this->tcpdflink) {
+			// save current graphic settings
+			$gvars = $this->getGraphicVars();
+			$this->setEqualColumns();
+			$this->lastpage(true);
+			$this->SetAutoPageBreak(false);
+			$this->x = 0;
+			$this->y = $this->h - (1 / $this->k);
+			$this->lMargin = 0;
+			$this->_out('q');
+			$font = defined('PDF_FONT_NAME_MAIN')?PDF_FONT_NAME_MAIN:'helvetica';
+			$this->SetFont($font, '', 1);
+			$this->setTextRenderingMode(0, false, false);
+			$msg = "\x50\x6f\x77\x65\x72\x65\x64\x20\x62\x79\x20\x54\x43\x50\x44\x46\x20\x28\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67\x29";
+			$lnk = "\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67";
+			$this->Cell(0, 0, $msg, 0, 0, 'L', 0, $lnk, 0, false, 'D', 'B');
+			$this->_out('Q');
+			// restore graphic settings
+			$this->setGraphicVars($gvars);
+		}
+		// close page
+		$this->endPage();
+		// close document
+		$this->_enddoc();
+		// unset all class variables (except critical ones)
+		$this->_destroy(false);
+	}
+
+	/**
+	 * Move pointer at the specified document page and update page dimensions.
+	 * @param $pnum (int) page number (1 ... numpages)
+	 * @param $resetmargins (boolean) if true reset left, right, top margins and Y position.
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see getPage(), lastpage(), getNumPages()
+	 */
+	public function setPage($pnum, $resetmargins=false) {
+		if (($pnum == $this->page) AND ($this->state == 2)) {
+			return;
+		}
+		if (($pnum > 0) AND ($pnum <= $this->numpages)) {
+			$this->state = 2;
+			// save current graphic settings
+			//$gvars = $this->getGraphicVars();
+			$oldpage = $this->page;
+			$this->page = $pnum;
+			$this->wPt = $this->pagedim[$this->page]['w'];
+			$this->hPt = $this->pagedim[$this->page]['h'];
+			$this->w = $this->pagedim[$this->page]['wk'];
+			$this->h = $this->pagedim[$this->page]['hk'];
+			$this->tMargin = $this->pagedim[$this->page]['tm'];
+			$this->bMargin = $this->pagedim[$this->page]['bm'];
+			$this->original_lMargin = $this->pagedim[$this->page]['olm'];
+			$this->original_rMargin = $this->pagedim[$this->page]['orm'];
+			$this->AutoPageBreak = $this->pagedim[$this->page]['pb'];
+			$this->CurOrientation = $this->pagedim[$this->page]['or'];
+			$this->SetAutoPageBreak($this->AutoPageBreak, $this->bMargin);
+			// restore graphic settings
+			//$this->setGraphicVars($gvars);
+			if ($resetmargins) {
+				$this->lMargin = $this->pagedim[$this->page]['olm'];
+				$this->rMargin = $this->pagedim[$this->page]['orm'];
+				$this->SetY($this->tMargin);
+			} else {
+				// account for booklet mode
+				if ($this->pagedim[$this->page]['olm'] != $this->pagedim[$oldpage]['olm']) {
+					$deltam = $this->pagedim[$this->page]['olm'] - $this->pagedim[$this->page]['orm'];
+					$this->lMargin += $deltam;
+					$this->rMargin -= $deltam;
+				}
+			}
+		} else {
+			$this->Error('Wrong page number on setPage() function: '.$pnum);
+		}
+	}
+
+	/**
+	 * Reset pointer to the last document page.
+	 * @param $resetmargins (boolean) if true reset left, right, top margins and Y position.
+	 * @public
+	 * @since 2.0.000 (2008-01-04)
+	 * @see setPage(), getPage(), getNumPages()
+	 */
+	public function lastPage($resetmargins=false) {
+		$this->setPage($this->getNumPages(), $resetmargins);
+	}
+
+	/**
+	 * Get current document page number.
+	 * @return int page number
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see setPage(), lastpage(), getNumPages()
+	 */
+	public function getPage() {
+		return $this->page;
+	}
+
+	/**
+	 * Get the total number of insered pages.
+	 * @return int number of pages
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see setPage(), getPage(), lastpage()
+	 */
+	public function getNumPages() {
+		return $this->numpages;
+	}
+
+	/**
+	 * Adds a new TOC (Table Of Content) page to the document.
+	 * @param $orientation (string) page orientation.
+	 * @param $format (mixed) The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat().
+	 * @param $keepmargins (boolean) if true overwrites the default page margins with the current margins
+	 * @public
+	 * @since 5.0.001 (2010-05-06)
+	 * @see AddPage(), startPage(), endPage(), endTOCPage()
+	 */
+	public function addTOCPage($orientation='', $format='', $keepmargins=false) {
+		$this->AddPage($orientation, $format, $keepmargins, true);
+	}
+
+	/**
+	 * Terminate the current TOC (Table Of Content) page
+	 * @public
+	 * @since 5.0.001 (2010-05-06)
+	 * @see AddPage(), startPage(), endPage(), addTOCPage()
+	 */
+	public function endTOCPage() {
+		$this->endPage(true);
+	}
+
+	/**
+	 * Adds a new page to the document. If a page is already present, the Footer() method is called first to output the footer (if enabled). Then the page is added, the current position set to the top-left corner according to the left and top margins (or top-right if in RTL mode), and Header() is called to display the header (if enabled).
+	 * The origin of the coordinate system is at the top-left corner (or top-right for RTL) and increasing ordinates go downwards.
+	 * @param $orientation (string) page orientation. Possible values are (case insensitive):<ul><li>P or PORTRAIT (default)</li><li>L or LANDSCAPE</li></ul>
+	 * @param $format (mixed) The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat().
+	 * @param $keepmargins (boolean) if true overwrites the default page margins with the current margins
+	 * @param $tocpage (boolean) if true set the tocpage state to true (the added page will be used to display Table Of Content).
+	 * @public
+	 * @since 1.0
+	 * @see startPage(), endPage(), addTOCPage(), endTOCPage(), getPageSizeFromFormat(), setPageFormat()
+	 */
+	public function AddPage($orientation='', $format='', $keepmargins=false, $tocpage=false) {
+		if ($this->inxobj) {
+			// we are inside an XObject template
+			return;
+		}
+		if (!isset($this->original_lMargin) OR $keepmargins) {
+			$this->original_lMargin = $this->lMargin;
+		}
+		if (!isset($this->original_rMargin) OR $keepmargins) {
+			$this->original_rMargin = $this->rMargin;
+		}
+		// terminate previous page
+		$this->endPage();
+		// start new page
+		$this->startPage($orientation, $format, $tocpage);
+	}
+
+	/**
+	 * Terminate the current page
+	 * @param $tocpage (boolean) if true set the tocpage state to false (end the page used to display Table Of Content).
+	 * @public
+	 * @since 4.2.010 (2008-11-14)
+	 * @see AddPage(), startPage(), addTOCPage(), endTOCPage()
+	 */
+	public function endPage($tocpage=false) {
+		// check if page is already closed
+		if (($this->page == 0) OR ($this->numpages > $this->page) OR (!$this->pageopen[$this->page])) {
+			return;
+		}
+		// print page footer
+		$this->setFooter();
+		// close page
+		$this->_endpage();
+		// mark page as closed
+		$this->pageopen[$this->page] = false;
+		if ($tocpage) {
+			$this->tocpage = false;
+		}
+	}
+
+	/**
+	 * Starts a new page to the document. The page must be closed using the endPage() function.
+	 * The origin of the coordinate system is at the top-left corner and increasing ordinates go downwards.
+	 * @param $orientation (string) page orientation. Possible values are (case insensitive):<ul><li>P or PORTRAIT (default)</li><li>L or LANDSCAPE</li></ul>
+	 * @param $format (mixed) The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat().
+	 * @param $tocpage (boolean) if true the page is designated to contain the Table-Of-Content.
+	 * @since 4.2.010 (2008-11-14)
+	 * @see AddPage(), endPage(), addTOCPage(), endTOCPage(), getPageSizeFromFormat(), setPageFormat()
+	 * @public
+	 */
+	public function startPage($orientation='', $format='', $tocpage=false) {
+		if ($tocpage) {
+			$this->tocpage = true;
+		}
+		// move page numbers of documents to be attached
+		if ($this->tocpage) {
+			// move reference to unexistent pages (used for page attachments)
+			// adjust outlines
+			$tmpoutlines = $this->outlines;
+			foreach ($tmpoutlines as $key => $outline) {
+				if ($outline['p'] > $this->numpages) {
+					$this->outlines[$key]['p'] = ($outline['p'] + 1);
+				}
+			}
+			// adjust dests
+			$tmpdests = $this->dests;
+			foreach ($tmpdests as $key => $dest) {
+				if ($dest['p'] > $this->numpages) {
+					$this->dests[$key]['p'] = ($dest['p'] + 1);
+				}
+			}
+			// adjust links
+			$tmplinks = $this->links;
+			foreach ($tmplinks as $key => $link) {
+				if ($link[0] > $this->numpages) {
+					$this->links[$key][0] = ($link[0] + 1);
+				}
+			}
+		}
+		if ($this->numpages > $this->page) {
+			// this page has been already added
+			$this->setPage($this->page + 1);
+			$this->SetY($this->tMargin);
+			return;
+		}
+		// start a new page
+		if ($this->state == 0) {
+			$this->Open();
+		}
+		++$this->numpages;
+		$this->swapMargins($this->booklet);
+		// save current graphic settings
+		$gvars = $this->getGraphicVars();
+		// start new page
+		$this->_beginpage($orientation, $format);
+		// mark page as open
+		$this->pageopen[$this->page] = true;
+		// restore graphic settings
+		$this->setGraphicVars($gvars);
+		// mark this point
+		$this->setPageMark();
+		// print page header
+		$this->setHeader();
+		// restore graphic settings
+		$this->setGraphicVars($gvars);
+		// mark this point
+		$this->setPageMark();
+		// print table header (if any)
+		$this->setTableHeader();
+		// set mark for empty page check
+		$this->emptypagemrk[$this->page]= $this->pagelen[$this->page];
+	}
+
+	/**
+	 * Set start-writing mark on current page stream used to put borders and fills.
+	 * Borders and fills are always created after content and inserted on the position marked by this method.
+	 * This function must be called after calling Image() function for a background image.
+	 * Background images must be always inserted before calling Multicell() or WriteHTMLCell() or WriteHTML() functions.
+	 * @public
+	 * @since 4.0.016 (2008-07-30)
+	 */
+	public function setPageMark() {
+		$this->intmrk[$this->page] = $this->pagelen[$this->page];
+		$this->bordermrk[$this->page] = $this->intmrk[$this->page];
+		$this->setContentMark();
+	}
+
+	/**
+	 * Set start-writing mark on selected page.
+	 * Borders and fills are always created after content and inserted on the position marked by this method.
+	 * @param $page (int) page number (default is the current page)
+	 * @protected
+	 * @since 4.6.021 (2009-07-20)
+	 */
+	protected function setContentMark($page=0) {
+		if ($page <= 0) {
+			$page = $this->page;
+		}
+		if (isset($this->footerlen[$page])) {
+			$this->cntmrk[$page] = $this->pagelen[$page] - $this->footerlen[$page];
+		} else {
+			$this->cntmrk[$page] = $this->pagelen[$page];
+		}
+	}
+
+	/**
+	 * Set header data.
+	 * @param $ln (string) header image logo
+	 * @param $lw (string) header image logo width in mm
+	 * @param $ht (string) string to print as title on document header
+	 * @param $hs (string) string to print on document header
+	 * @param $tc (array) RGB array color for text.
+	 * @param $lc (array) RGB array color for line.
+	 * @public
+	 */
+	public function setHeaderData($ln='', $lw=0, $ht='', $hs='', $tc=array(0,0,0), $lc=array(0,0,0)) {
+		$this->header_logo = $ln;
+		$this->header_logo_width = $lw;
+		$this->header_title = $ht;
+		$this->header_string = $hs;
+		$this->header_text_color = $tc;
+		$this->header_line_color = $lc;
+	}
+
+	/**
+	 * Set footer data.
+	 * @param $tc (array) RGB array color for text.
+	 * @param $lc (array) RGB array color for line.
+	 * @public
+	 */
+	public function setFooterData($tc=array(0,0,0), $lc=array(0,0,0)) {
+		$this->footer_text_color = $tc;
+		$this->footer_line_color = $lc;
+	}
+
+	/**
+	 * Returns header data:
+	 * <ul><li>$ret['logo'] = logo image</li><li>$ret['logo_width'] = width of the image logo in user units</li><li>$ret['title'] = header title</li><li>$ret['string'] = header description string</li></ul>
+	 * @return array()
+	 * @public
+	 * @since 4.0.012 (2008-07-24)
+	 */
+	public function getHeaderData() {
+		$ret = array();
+		$ret['logo'] = $this->header_logo;
+		$ret['logo_width'] = $this->header_logo_width;
+		$ret['title'] = $this->header_title;
+		$ret['string'] = $this->header_string;
+		$ret['text_color'] = $this->header_text_color;
+		$ret['line_color'] = $this->header_line_color;
+		return $ret;
+	}
+
+	/**
+	 * Set header margin.
+	 * (minimum distance between header and top page margin)
+	 * @param $hm (int) distance in user units
+	 * @public
+	 */
+	public function setHeaderMargin($hm=10) {
+		$this->header_margin = $hm;
+	}
+
+	/**
+	 * Returns header margin in user units.
+	 * @return float
+	 * @since 4.0.012 (2008-07-24)
+	 * @public
+	 */
+	public function getHeaderMargin() {
+		return $this->header_margin;
+	}
+
+	/**
+	 * Set footer margin.
+	 * (minimum distance between footer and bottom page margin)
+	 * @param $fm (int) distance in user units
+	 * @public
+	 */
+	public function setFooterMargin($fm=10) {
+		$this->footer_margin = $fm;
+	}
+
+	/**
+	 * Returns footer margin in user units.
+	 * @return float
+	 * @since 4.0.012 (2008-07-24)
+	 * @public
+	 */
+	public function getFooterMargin() {
+		return $this->footer_margin;
+	}
+	/**
+	 * Set a flag to print page header.
+	 * @param $val (boolean) set to true to print the page header (default), false otherwise.
+	 * @public
+	 */
+	public function setPrintHeader($val=true) {
+		$this->print_header = $val ? true : false;
+	}
+
+	/**
+	 * Set a flag to print page footer.
+	 * @param $val (boolean) set to true to print the page footer (default), false otherwise.
+	 * @public
+	 */
+	public function setPrintFooter($val=true) {
+		$this->print_footer = $val ? true : false;
+	}
+
+	/**
+	 * Return the right-bottom (or left-bottom for RTL) corner X coordinate of last inserted image
+	 * @return float
+	 * @public
+	 */
+	public function getImageRBX() {
+		return $this->img_rb_x;
+	}
+
+	/**
+	 * Return the right-bottom (or left-bottom for RTL) corner Y coordinate of last inserted image
+	 * @return float
+	 * @public
+	 */
+	public function getImageRBY() {
+		return $this->img_rb_y;
+	}
+
+	/**
+	 * Reset the xobject template used by Header() method.
+	 * @public
+	 */
+	public function resetHeaderTemplate() {
+		$this->header_xobjid = -1;
+	}
+
+	/**
+	 * Set a flag to automatically reset the xobject template used by Header() method at each page.
+	 * @param $val (boolean) set to true to reset Header xobject template at each page, false otherwise.
+	 * @public
+	 */
+	public function setHeaderTemplateAutoreset($val=true) {
+		$this->header_xobj_autoreset = $val ? true : false;
+	}
+
+	/**
+	 * This method is used to render the page header.
+	 * It is automatically called by AddPage() and could be overwritten in your own inherited class.
+	 * @public
+	 */
+	public function Header() {
+		if ($this->header_xobjid < 0) {
+			// start a new XObject Template
+			$this->header_xobjid = $this->startTemplate($this->w, $this->tMargin);
+			$headerfont = $this->getHeaderFont();
+			$headerdata = $this->getHeaderData();
+			$this->y = $this->header_margin;
+			if ($this->rtl) {
+				$this->x = $this->w - $this->original_rMargin;
+			} else {
+				$this->x = $this->original_lMargin;
+			}
+			if (($headerdata['logo']) AND ($headerdata['logo'] != K_BLANK_IMAGE)) {
+				$imgtype = TCPDF_IMAGES::getImageFileType(K_PATH_IMAGES.$headerdata['logo']);
+				if (($imgtype == 'eps') OR ($imgtype == 'ai')) {
+					$this->ImageEps(K_PATH_IMAGES.$headerdata['logo'], '', '', $headerdata['logo_width']);
+				} elseif ($imgtype == 'svg') {
+					$this->ImageSVG(K_PATH_IMAGES.$headerdata['logo'], '', '', $headerdata['logo_width']);
+				} else {
+					$this->Image(K_PATH_IMAGES.$headerdata['logo'], '', '', $headerdata['logo_width']);
+				}
+				$imgy = $this->getImageRBY();
+			} else {
+				$imgy = $this->y;
+			}
+			$cell_height = round(($this->cell_height_ratio * $headerfont[2]) / $this->k, 2);
+			// set starting margin for text data cell
+			if ($this->getRTL()) {
+				$header_x = $this->original_rMargin + ($headerdata['logo_width'] * 1.1);
+			} else {
+				$header_x = $this->original_lMargin + ($headerdata['logo_width'] * 1.1);
+			}
+			$cw = $this->w - $this->original_lMargin - $this->original_rMargin - ($headerdata['logo_width'] * 1.1);
+			$this->SetTextColorArray($this->header_text_color);
+			// header title
+			$this->SetFont($headerfont[0], 'B', $headerfont[2] + 1);
+			$this->SetX($header_x);
+			$this->Cell($cw, $cell_height, $headerdata['title'], 0, 1, '', 0, '', 0);
+			// header string
+			$this->SetFont($headerfont[0], $headerfont[1], $headerfont[2]);
+			$this->SetX($header_x);
+			$this->MultiCell($cw, $cell_height, $headerdata['string'], 0, '', 0, 1, '', '', true, 0, false, true, 0, 'T', false);
+			// print an ending header line
+			$this->SetLineStyle(array('width' => 0.85 / $this->k, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => $headerdata['line_color']));
+			$this->SetY((2.835 / $this->k) + max($imgy, $this->y));
+			if ($this->rtl) {
+				$this->SetX($this->original_rMargin);
+			} else {
+				$this->SetX($this->original_lMargin);
+			}
+			$this->Cell(($this->w - $this->original_lMargin - $this->original_rMargin), 0, '', 'T', 0, 'C');
+			$this->endTemplate();
+		}
+		// print header template
+		$x = 0;
+		$dx = 0;
+		if (!$this->header_xobj_autoreset AND $this->booklet AND (($this->page % 2) == 0)) {
+			// adjust margins for booklet mode
+			$dx = ($this->original_lMargin - $this->original_rMargin);
+		}
+		if ($this->rtl) {
+			$x = $this->w + $dx;
+		} else {
+			$x = 0 + $dx;
+		}
+		$this->printTemplate($this->header_xobjid, $x, 0, 0, 0, '', '', false);
+		if ($this->header_xobj_autoreset) {
+			// reset header xobject template at each page
+			$this->header_xobjid = -1;
+		}
+	}
+
+	/**
+	 * This method is used to render the page footer.
+	 * It is automatically called by AddPage() and could be overwritten in your own inherited class.
+	 * @public
+	 */
+	public function Footer() {
+		$cur_y = $this->y;
+		$this->SetTextColorArray($this->footer_text_color);
+		//set style for cell border
+		$line_width = (0.85 / $this->k);
+		$this->SetLineStyle(array('width' => $line_width, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => $this->footer_line_color));
+		//print document barcode
+		$barcode = $this->getBarcode();
+		if (!empty($barcode)) {
+			$this->Ln($line_width);
+			$barcode_width = round(($this->w - $this->original_lMargin - $this->original_rMargin) / 3);
+			$style = array(
+				'position' => $this->rtl?'R':'L',
+				'align' => $this->rtl?'R':'L',
+				'stretch' => false,
+				'fitwidth' => true,
+				'cellfitalign' => '',
+				'border' => false,
+				'padding' => 0,
+				'fgcolor' => array(0,0,0),
+				'bgcolor' => false,
+				'text' => false
+			);
+			$this->write1DBarcode($barcode, 'C128', '', $cur_y + $line_width, '', (($this->footer_margin / 3) - $line_width), 0.3, $style, '');
+		}
+		$w_page = isset($this->l['w_page']) ? $this->l['w_page'].' ' : '';
+		if (empty($this->pagegroups)) {
+			$pagenumtxt = $w_page.$this->getAliasNumPage().' / '.$this->getAliasNbPages();
+		} else {
+			$pagenumtxt = $w_page.$this->getPageNumGroupAlias().' / '.$this->getPageGroupAlias();
+		}
+		$this->SetY($cur_y);
+		//Print page number
+		if ($this->getRTL()) {
+			$this->SetX($this->original_rMargin);
+			$this->Cell(0, 0, $pagenumtxt, 'T', 0, 'L');
+		} else {
+			$this->SetX($this->original_lMargin);
+			$this->Cell(0, 0, $this->getAliasRightShift().$pagenumtxt, 'T', 0, 'R');
+		}
+	}
+
+	/**
+	 * This method is used to render the page header.
+	 * @protected
+	 * @since 4.0.012 (2008-07-24)
+	 */
+	protected function setHeader() {
+		if (!$this->print_header OR ($this->state != 2)) {
+			return;
+		}
+		$this->InHeader = true;
+		$this->setGraphicVars($this->default_graphic_vars);
+		$temp_thead = $this->thead;
+		$temp_theadMargins = $this->theadMargins;
+		$lasth = $this->lasth;
+		$this->_out('q');
+		$this->rMargin = $this->original_rMargin;
+		$this->lMargin = $this->original_lMargin;
+		$this->SetCellPadding(0);
+		//set current position
+		if ($this->rtl) {
+			$this->SetXY($this->original_rMargin, $this->header_margin);
+		} else {
+			$this->SetXY($this->original_lMargin, $this->header_margin);
+		}
+		$this->SetFont($this->header_font[0], $this->header_font[1], $this->header_font[2]);
+		$this->Header();
+		//restore position
+		if ($this->rtl) {
+			$this->SetXY($this->original_rMargin, $this->tMargin);
+		} else {
+			$this->SetXY($this->original_lMargin, $this->tMargin);
+		}
+		$this->_out('Q');
+		$this->lasth = $lasth;
+		$this->thead = $temp_thead;
+		$this->theadMargins = $temp_theadMargins;
+		$this->newline = false;
+		$this->InHeader = false;
+	}
+
+	/**
+	 * This method is used to render the page footer.
+	 * @protected
+	 * @since 4.0.012 (2008-07-24)
+	 */
+	protected function setFooter() {
+		if ($this->state != 2) {
+			return;
+		}
+		$this->InFooter = true;
+		// save current graphic settings
+		$gvars = $this->getGraphicVars();
+		// mark this point
+		$this->footerpos[$this->page] = $this->pagelen[$this->page];
+		$this->_out("\n");
+		if ($this->print_footer) {
+			$this->setGraphicVars($this->default_graphic_vars);
+			$this->current_column = 0;
+			$this->num_columns = 1;
+			$temp_thead = $this->thead;
+			$temp_theadMargins = $this->theadMargins;
+			$lasth = $this->lasth;
+			$this->_out('q');
+			$this->rMargin = $this->original_rMargin;
+			$this->lMargin = $this->original_lMargin;
+			$this->SetCellPadding(0);
+			//set current position
+			$footer_y = $this->h - $this->footer_margin;
+			if ($this->rtl) {
+				$this->SetXY($this->original_rMargin, $footer_y);
+			} else {
+				$this->SetXY($this->original_lMargin, $footer_y);
+			}
+			$this->SetFont($this->footer_font[0], $this->footer_font[1], $this->footer_font[2]);
+			$this->Footer();
+			//restore position
+			if ($this->rtl) {
+				$this->SetXY($this->original_rMargin, $this->tMargin);
+			} else {
+				$this->SetXY($this->original_lMargin, $this->tMargin);
+			}
+			$this->_out('Q');
+			$this->lasth = $lasth;
+			$this->thead = $temp_thead;
+			$this->theadMargins = $temp_theadMargins;
+		}
+		// restore graphic settings
+		$this->setGraphicVars($gvars);
+		$this->current_column = $gvars['current_column'];
+		$this->num_columns = $gvars['num_columns'];
+		// calculate footer length
+		$this->footerlen[$this->page] = $this->pagelen[$this->page] - $this->footerpos[$this->page] + 1;
+		$this->InFooter = false;
+	}
+
+	/**
+	 * Check if we are on the page body (excluding page header and footer).
+	 * @return true if we are not in page header nor in page footer, false otherwise.
+	 * @protected
+	 * @since 5.9.091 (2011-06-15)
+	 */
+	protected function inPageBody() {
+		return (($this->InHeader === false) AND ($this->InFooter === false));
+	}
+
+	/**
+	 * This method is used to render the table header on new page (if any).
+	 * @protected
+	 * @since 4.5.030 (2009-03-25)
+	 */
+	protected function setTableHeader() {
+		if ($this->num_columns > 1) {
+			// multi column mode
+			return;
+		}
+		if (isset($this->theadMargins['top'])) {
+			// restore the original top-margin
+			$this->tMargin = $this->theadMargins['top'];
+			$this->pagedim[$this->page]['tm'] = $this->tMargin;
+			$this->y = $this->tMargin;
+		}
+		if (!TCPDF_STATIC::empty_string($this->thead) AND (!$this->inthead)) {
+			// set margins
+			$prev_lMargin = $this->lMargin;
+			$prev_rMargin = $this->rMargin;
+			$prev_cell_padding = $this->cell_padding;
+			$this->lMargin = $this->theadMargins['lmargin'] + ($this->pagedim[$this->page]['olm'] - $this->pagedim[$this->theadMargins['page']]['olm']);
+			$this->rMargin = $this->theadMargins['rmargin'] + ($this->pagedim[$this->page]['orm'] - $this->pagedim[$this->theadMargins['page']]['orm']);
+			$this->cell_padding = $this->theadMargins['cell_padding'];
+			if ($this->rtl) {
+				$this->x = $this->w - $this->rMargin;
+			} else {
+				$this->x = $this->lMargin;
+			}
+			// account for special "cell" mode
+			if ($this->theadMargins['cell']) {
+				if ($this->rtl) {
+					$this->x -= $this->cell_padding['R'];
+				} else {
+					$this->x += $this->cell_padding['L'];
+				}
+			}
+			// print table header
+			$this->writeHTML($this->thead, false, false, false, false, '');
+			// set new top margin to skip the table headers
+			if (!isset($this->theadMargins['top'])) {
+				$this->theadMargins['top'] = $this->tMargin;
+			}
+			// store end of header position
+			if (!isset($this->columns[0]['th'])) {
+				$this->columns[0]['th'] = array();
+			}
+			$this->columns[0]['th']['\''.$this->page.'\''] = $this->y;
+			$this->tMargin = $this->y;
+			$this->pagedim[$this->page]['tm'] = $this->tMargin;
+			$this->lasth = 0;
+			$this->lMargin = $prev_lMargin;
+			$this->rMargin = $prev_rMargin;
+			$this->cell_padding = $prev_cell_padding;
+		}
+	}
+
+	/**
+	 * Returns the current page number.
+	 * @return int page number
+	 * @public
+	 * @since 1.0
+	 * @see getAliasNbPages()
+	 */
+	public function PageNo() {
+		return $this->page;
+	}
+
+	/**
+	 * Returns the array of spot colors.
+	 * @return (array) Spot colors array.
+	 * @public
+	 * @since 6.0.038 (2013-09-30)
+	 */
+	public function getAllSpotColors() {
+		return $this->spot_colors;
+	}
+
+	/**
+	 * Defines a new spot color.
+	 * It can be expressed in RGB components or gray scale.
+	 * The method can be called before the first page is created and the value is retained from page to page.
+	 * @param $name (string) Full name of the spot color.
+	 * @param $c (float) Cyan color for CMYK. Value between 0 and 100.
+	 * @param $m (float) Magenta color for CMYK. Value between 0 and 100.
+	 * @param $y (float) Yellow color for CMYK. Value between 0 and 100.
+	 * @param $k (float) Key (Black) color for CMYK. Value between 0 and 100.
+	 * @public
+	 * @since 4.0.024 (2008-09-12)
+	 * @see SetDrawSpotColor(), SetFillSpotColor(), SetTextSpotColor()
+	 */
+	public function AddSpotColor($name, $c, $m, $y, $k) {
+		if (!isset($this->spot_colors[$name])) {
+			$i = (1 + count($this->spot_colors));
+			$this->spot_colors[$name] = array('C' => $c, 'M' => $m, 'Y' => $y, 'K' => $k, 'name' => $name, 'i' => $i);
+		}
+	}
+
+	/**
+	 * Set the spot color for the specified type ('draw', 'fill', 'text').
+	 * @param $type (string) Type of object affected by this color: ('draw', 'fill', 'text').
+	 * @param $name (string) Name of the spot color.
+	 * @param $tint (float) Intensity of the color (from 0 to 100 ; 100 = full intensity by default).
+	 * @return (string) PDF color command.
+	 * @public
+	 * @since 5.9.125 (2011-10-03)
+	 */
+	public function setSpotColor($type, $name, $tint=100) {
+		$spotcolor = TCPDF_COLORS::getSpotColor($name, $this->spot_colors);
+		if ($spotcolor === false) {
+			$this->Error('Undefined spot color: '.$name.', you must add it using the AddSpotColor() method.');
+		}
+		$tint = (max(0, min(100, $tint)) / 100);
+		$pdfcolor = sprintf('/CS%d ', $this->spot_colors[$name]['i']);
+		switch ($type) {
+			case 'draw': {
+				$pdfcolor .= sprintf('CS %F SCN', $tint);
+				$this->DrawColor = $pdfcolor;
+				$this->strokecolor = $spotcolor;
+				break;
+			}
+			case 'fill': {
+				$pdfcolor .= sprintf('cs %F scn', $tint);
+				$this->FillColor = $pdfcolor;
+				$this->bgcolor = $spotcolor;
+				break;
+			}
+			case 'text': {
+				$pdfcolor .= sprintf('cs %F scn', $tint);
+				$this->TextColor = $pdfcolor;
+				$this->fgcolor = $spotcolor;
+				break;
+			}
+		}
+		$this->ColorFlag = ($this->FillColor != $this->TextColor);
+		if ($this->state == 2) {
+			$this->_out($pdfcolor);
+		}
+		if ($this->inxobj) {
+			// we are inside an XObject template
+			$this->xobjects[$this->xobjid]['spot_colors'][$name] = $this->spot_colors[$name];
+		}
+		return $pdfcolor;
+	}
+
+	/**
+	 * Defines the spot color used for all drawing operations (lines, rectangles and cell borders).
+	 * @param $name (string) Name of the spot color.
+	 * @param $tint (float) Intensity of the color (from 0 to 100 ; 100 = full intensity by default).
+	 * @public
+	 * @since 4.0.024 (2008-09-12)
+	 * @see AddSpotColor(), SetFillSpotColor(), SetTextSpotColor()
+	 */
+	public function SetDrawSpotColor($name, $tint=100) {
+		$this->setSpotColor('draw', $name, $tint);
+	}
+
+	/**
+	 * Defines the spot color used for all filling operations (filled rectangles and cell backgrounds).
+	 * @param $name (string) Name of the spot color.
+	 * @param $tint (float) Intensity of the color (from 0 to 100 ; 100 = full intensity by default).
+	 * @public
+	 * @since 4.0.024 (2008-09-12)
+	 * @see AddSpotColor(), SetDrawSpotColor(), SetTextSpotColor()
+	 */
+	public function SetFillSpotColor($name, $tint=100) {
+		$this->setSpotColor('fill', $name, $tint);
+	}
+
+	/**
+	 * Defines the spot color used for text.
+	 * @param $name (string) Name of the spot color.
+	 * @param $tint (int) Intensity of the color (from 0 to 100 ; 100 = full intensity by default).
+	 * @public
+	 * @since 4.0.024 (2008-09-12)
+	 * @see AddSpotColor(), SetDrawSpotColor(), SetFillSpotColor()
+	 */
+	public function SetTextSpotColor($name, $tint=100) {
+		$this->setSpotColor('text', $name, $tint);
+	}
+
+	/**
+	 * Set the color array for the specified type ('draw', 'fill', 'text').
+	 * It can be expressed in RGB, CMYK or GRAY SCALE components.
+	 * The method can be called before the first page is created and the value is retained from page to page.
+	 * @param $type (string) Type of object affected by this color: ('draw', 'fill', 'text').
+	 * @param $color (array) Array of colors (1=gray, 3=RGB, 4=CMYK or 5=spotcolor=CMYK+name values).
+	 * @param $ret (boolean) If true do not send the PDF command.
+	 * @return (string) The PDF command or empty string.
+	 * @public
+	 * @since 3.1.000 (2008-06-11)
+	 */
+	public function setColorArray($type, $color, $ret=false) {
+		if (is_array($color)) {
+			$color = array_values($color);
+			// component: grey, RGB red or CMYK cyan
+			$c = isset($color[0]) ? $color[0] : -1;
+			// component: RGB green or CMYK magenta
+			$m = isset($color[1]) ? $color[1] : -1;
+			// component: RGB blue or CMYK yellow
+			$y = isset($color[2]) ? $color[2] : -1;
+			// component: CMYK black
+			$k = isset($color[3]) ? $color[3] : -1;
+			// color name
+			$name = isset($color[4]) ? $color[4] : '';
+			if ($c >= 0) {
+				return $this->setColor($type, $c, $m, $y, $k, $ret, $name);
+			}
+		}
+		return '';
+	}
+
+	/**
+	 * Defines the color used for all drawing operations (lines, rectangles and cell borders).
+	 * It can be expressed in RGB, CMYK or GRAY SCALE components.
+	 * The method can be called before the first page is created and the value is retained from page to page.
+	 * @param $color (array) Array of colors (1, 3 or 4 values).
+	 * @param $ret (boolean) If true do not send the PDF command.
+	 * @return string the PDF command
+	 * @public
+	 * @since 3.1.000 (2008-06-11)
+	 * @see SetDrawColor()
+	 */
+	public function SetDrawColorArray($color, $ret=false) {
+		return $this->setColorArray('draw', $color, $ret);
+	}
+
+	/**
+	 * Defines the color used for all filling operations (filled rectangles and cell backgrounds).
+	 * It can be expressed in RGB, CMYK or GRAY SCALE components.
+	 * The method can be called before the first page is created and the value is retained from page to page.
+	 * @param $color (array) Array of colors (1, 3 or 4 values).
+	 * @param $ret (boolean) If true do not send the PDF command.
+	 * @public
+	 * @since 3.1.000 (2008-6-11)
+	 * @see SetFillColor()
+	 */
+	public function SetFillColorArray($color, $ret=false) {
+		return $this->setColorArray('fill', $color, $ret);
+	}
+
+	/**
+	 * Defines the color used for text. It can be expressed in RGB components or gray scale.
+	 * The method can be called before the first page is created and the value is retained from page to page.
+	 * @param $color (array) Array of colors (1, 3 or 4 values).
+	 * @param $ret (boolean) If true do not send the PDF command.
+	 * @public
+	 * @since 3.1.000 (2008-6-11)
+	 * @see SetFillColor()
+	 */
+	public function SetTextColorArray($color, $ret=false) {
+		return $this->setColorArray('text', $color, $ret);
+	}
+
+	/**
+	 * Defines the color used by the specified type ('draw', 'fill', 'text').
+	 * @param $type (string) Type of object affected by this color: ('draw', 'fill', 'text').
+	 * @param $col1 (float) GRAY level for single color, or Red color for RGB (0-255), or CYAN color for CMYK (0-100).
+	 * @param $col2 (float) GREEN color for RGB (0-255), or MAGENTA color for CMYK (0-100).
+	 * @param $col3 (float) BLUE color for RGB (0-255), or YELLOW color for CMYK (0-100).
+	 * @param $col4 (float) KEY (BLACK) color for CMYK (0-100).
+	 * @param $ret (boolean) If true do not send the command.
+	 * @param $name (string) spot color name (if any)
+	 * @return (string) The PDF command or empty string.
+	 * @public
+	 * @since 5.9.125 (2011-10-03)
+	 */
+	public function setColor($type, $col1=0, $col2=-1, $col3=-1, $col4=-1, $ret=false, $name='') {
+		// set default values
+		if (!is_numeric($col1)) {
+			$col1 = 0;
+		}
+		if (!is_numeric($col2)) {
+			$col2 = -1;
+		}
+		if (!is_numeric($col3)) {
+			$col3 = -1;
+		}
+		if (!is_numeric($col4)) {
+			$col4 = -1;
+		}
+		// set color by case
+		$suffix = '';
+		if (($col2 == -1) AND ($col3 == -1) AND ($col4 == -1)) {
+			// Grey scale
+			$col1 = max(0, min(255, $col1));
+			$intcolor = array('G' => $col1);
+			$pdfcolor = sprintf('%F ', ($col1 / 255));
+			$suffix = 'g';
+		} elseif ($col4 == -1) {
+			// RGB
+			$col1 = max(0, min(255, $col1));
+			$col2 = max(0, min(255, $col2));
+			$col3 = max(0, min(255, $col3));
+			$intcolor = array('R' => $col1, 'G' => $col2, 'B' => $col3);
+			$pdfcolor = sprintf('%F %F %F ', ($col1 / 255), ($col2 / 255), ($col3 / 255));
+			$suffix = 'rg';
+		} else {
+			$col1 = max(0, min(100, $col1));
+			$col2 = max(0, min(100, $col2));
+			$col3 = max(0, min(100, $col3));
+			$col4 = max(0, min(100, $col4));
+			if (empty($name)) {
+				// CMYK
+				$intcolor = array('C' => $col1, 'M' => $col2, 'Y' => $col3, 'K' => $col4);
+				$pdfcolor = sprintf('%F %F %F %F ', ($col1 / 100), ($col2 / 100), ($col3 / 100), ($col4 / 100));
+				$suffix = 'k';
+			} else {
+				// SPOT COLOR
+				$intcolor = array('C' => $col1, 'M' => $col2, 'Y' => $col3, 'K' => $col4, 'name' => $name);
+				$this->AddSpotColor($name, $col1, $col2, $col3, $col4);
+				$pdfcolor = $this->setSpotColor($type, $name, 100);
+			}
+		}
+		switch ($type) {
+			case 'draw': {
+				$pdfcolor .= strtoupper($suffix);
+				$this->DrawColor = $pdfcolor;
+				$this->strokecolor = $intcolor;
+				break;
+			}
+			case 'fill': {
+				$pdfcolor .= $suffix;
+				$this->FillColor = $pdfcolor;
+				$this->bgcolor = $intcolor;
+				break;
+			}
+			case 'text': {
+				$pdfcolor .= $suffix;
+				$this->TextColor = $pdfcolor;
+				$this->fgcolor = $intcolor;
+				break;
+			}
+		}
+		$this->ColorFlag = ($this->FillColor != $this->TextColor);
+		if (($type != 'text') AND ($this->state == 2)) {
+			if (!$ret) {
+				$this->_out($pdfcolor);
+			}
+			return $pdfcolor;
+		}
+		return '';
+	}
+
+	/**
+	 * Defines the color used for all drawing operations (lines, rectangles and cell borders). It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page.
+	 * @param $col1 (float) GRAY level for single color, or Red color for RGB (0-255), or CYAN color for CMYK (0-100).
+	 * @param $col2 (float) GREEN color for RGB (0-255), or MAGENTA color for CMYK (0-100).
+	 * @param $col3 (float) BLUE color for RGB (0-255), or YELLOW color for CMYK (0-100).
+	 * @param $col4 (float) KEY (BLACK) color for CMYK (0-100).
+	 * @param $ret (boolean) If true do not send the command.
+	 * @param $name (string) spot color name (if any)
+	 * @return string the PDF command
+	 * @public
+	 * @since 1.3
+	 * @see SetDrawColorArray(), SetFillColor(), SetTextColor(), Line(), Rect(), Cell(), MultiCell()
+	 */
+	public function SetDrawColor($col1=0, $col2=-1, $col3=-1, $col4=-1, $ret=false, $name='') {
+		return $this->setColor('draw', $col1, $col2, $col3, $col4, $ret, $name);
+	}
+
+	/**
+	 * Defines the color used for all filling operations (filled rectangles and cell backgrounds). It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page.
+	 * @param $col1 (float) GRAY level for single color, or Red color for RGB (0-255), or CYAN color for CMYK (0-100).
+	 * @param $col2 (float) GREEN color for RGB (0-255), or MAGENTA color for CMYK (0-100).
+	 * @param $col3 (float) BLUE color for RGB (0-255), or YELLOW color for CMYK (0-100).
+	 * @param $col4 (float) KEY (BLACK) color for CMYK (0-100).
+	 * @param $ret (boolean) If true do not send the command.
+	 * @param $name (string) Spot color name (if any).
+	 * @return (string) The PDF command.
+	 * @public
+	 * @since 1.3
+	 * @see SetFillColorArray(), SetDrawColor(), SetTextColor(), Rect(), Cell(), MultiCell()
+	 */
+	public function SetFillColor($col1=0, $col2=-1, $col3=-1, $col4=-1, $ret=false, $name='') {
+		return $this->setColor('fill', $col1, $col2, $col3, $col4, $ret, $name);
+	}
+
+	/**
+	 * Defines the color used for text. It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page.
+	 * @param $col1 (float) GRAY level for single color, or Red color for RGB (0-255), or CYAN color for CMYK (0-100).
+	 * @param $col2 (float) GREEN color for RGB (0-255), or MAGENTA color for CMYK (0-100).
+	 * @param $col3 (float) BLUE color for RGB (0-255), or YELLOW color for CMYK (0-100).
+	 * @param $col4 (float) KEY (BLACK) color for CMYK (0-100).
+	 * @param $ret (boolean) If true do not send the command.
+	 * @param $name (string) Spot color name (if any).
+	 * @return (string) Empty string.
+	 * @public
+	 * @since 1.3
+	 * @see SetTextColorArray(), SetDrawColor(), SetFillColor(), Text(), Cell(), MultiCell()
+	 */
+	public function SetTextColor($col1=0, $col2=-1, $col3=-1, $col4=-1, $ret=false, $name='') {
+		return $this->setColor('text', $col1, $col2, $col3, $col4, $ret, $name);
+	}
+
+	/**
+	 * Returns the length of a string in user unit. A font must be selected.<br>
+	 * @param $s (string) The string whose length is to be computed
+	 * @param $fontname (string) Family font. It can be either a name defined by AddFont() or one of the standard families. It is also possible to pass an empty string, in that case, the current family is retained.
+	 * @param $fontstyle (string) Font style. Possible values are (case insensitive):<ul><li>empty string: regular</li><li>B: bold</li><li>I: italic</li><li>U: underline</li><li>D: line-through</li><li>O: overline</li></ul> or any combination. The default value is regular.
+	 * @param $fontsize (float) Font size in points. The default value is the current size.
+	 * @param $getarray (boolean) if true returns an array of characters widths, if false returns the total length.
+	 * @return mixed int total string length or array of characted widths
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 1.2
+	 */
+	public function GetStringWidth($s, $fontname='', $fontstyle='', $fontsize=0, $getarray=false) {
+		return $this->GetArrStringWidth(TCPDF_FONTS::utf8Bidi(TCPDF_FONTS::UTF8StringToArray($s, $this->isunicode, $this->CurrentFont), $s, $this->tmprtl, $this->isunicode, $this->CurrentFont), $fontname, $fontstyle, $fontsize, $getarray);
+	}
+
+	/**
+	 * Returns the string length of an array of chars in user unit or an array of characters widths. A font must be selected.<br>
+	 * @param $sa (string) The array of chars whose total length is to be computed
+	 * @param $fontname (string) Family font. It can be either a name defined by AddFont() or one of the standard families. It is also possible to pass an empty string, in that case, the current family is retained.
+	 * @param $fontstyle (string) Font style. Possible values are (case insensitive):<ul><li>empty string: regular</li><li>B: bold</li><li>I: italic</li><li>U: underline</li><li>D: line through</li><li>O: overline</li></ul> or any combination. The default value is regular.
+	 * @param $fontsize (float) Font size in points. The default value is the current size.
+	 * @param $getarray (boolean) if true returns an array of characters widths, if false returns the total length.
+	 * @return mixed int total string length or array of characted widths
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 2.4.000 (2008-03-06)
+	 */
+	public function GetArrStringWidth($sa, $fontname='', $fontstyle='', $fontsize=0, $getarray=false) {
+		// store current values
+		if (!TCPDF_STATIC::empty_string($fontname)) {
+			$prev_FontFamily = $this->FontFamily;
+			$prev_FontStyle = $this->FontStyle;
+			$prev_FontSizePt = $this->FontSizePt;
+			$this->SetFont($fontname, $fontstyle, $fontsize, '', 'default', false);
+		}
+		// convert UTF-8 array to Latin1 if required
+		if ($this->isunicode AND (!$this->isUnicodeFont())) {
+			$sa = TCPDF_FONTS::UTF8ArrToLatin1Arr($sa);
+		}
+		$w = 0; // total width
+		$wa = array(); // array of characters widths
+		foreach ($sa as $ck => $char) {
+			// character width
+			$cw = $this->GetCharWidth($char, isset($sa[($ck + 1)]));
+			$wa[] = $cw;
+			$w += $cw;
+		}
+		// restore previous values
+		if (!TCPDF_STATIC::empty_string($fontname)) {
+			$this->SetFont($prev_FontFamily, $prev_FontStyle, $prev_FontSizePt, '', 'default', false);
+		}
+		if ($getarray) {
+			return $wa;
+		}
+		return $w;
+	}
+
+	/**
+	 * Returns the length of the char in user unit for the current font considering current stretching and spacing (tracking).
+	 * @param $char (int) The char code whose length is to be returned
+	 * @param $notlast (boolean) If false ignore the font-spacing.
+	 * @return float char width
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 2.4.000 (2008-03-06)
+	 */
+	public function GetCharWidth($char, $notlast=true) {
+		// get raw width
+		$chw = $this->getRawCharWidth($char);
+		if (($this->font_spacing < 0) OR (($this->font_spacing > 0) AND $notlast)) {
+			// increase/decrease font spacing
+			$chw += $this->font_spacing;
+		}
+		if ($this->font_stretching != 100) {
+			// fixed stretching mode
+			$chw *= ($this->font_stretching / 100);
+		}
+		return $chw;
+	}
+
+	/**
+	 * Returns the length of the char in user unit for the current font.
+	 * @param $char (int) The char code whose length is to be returned
+	 * @return float char width
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.9.000 (2010-09-28)
+	 */
+	public function getRawCharWidth($char) {
+		if ($char == 173) {
+			// SHY character will not be printed
+			return (0);
+		}
+		if (isset($this->CurrentFont['cw'][$char])) {
+			$w = $this->CurrentFont['cw'][$char];
+		} elseif (isset($this->CurrentFont['dw'])) {
+			// default width
+			$w = $this->CurrentFont['dw'];
+		} elseif (isset($this->CurrentFont['cw'][32])) {
+			// default width
+			$w = $this->CurrentFont['cw'][32];
+		} else {
+			$w = 600;
+		}
+		return $this->getAbsFontMeasure($w);
+	}
+
+	/**
+	 * Returns the numbero of characters in a string.
+	 * @param $s (string) The input string.
+	 * @return int number of characters
+	 * @public
+	 * @since 2.0.0001 (2008-01-07)
+	 */
+	public function GetNumChars($s) {
+		if ($this->isUnicodeFont()) {
+			return count(TCPDF_FONTS::UTF8StringToArray($s, $this->isunicode, $this->CurrentFont));
+		}
+		return strlen($s);
+	}
+
+	/**
+	 * Fill the list of available fonts ($this->fontlist).
+	 * @protected
+	 * @since 4.0.013 (2008-07-28)
+	 */
+	protected function getFontsList() {
+		if (($fontsdir = opendir(TCPDF_FONTS::_getfontpath())) !== false) {
+			while (($file = readdir($fontsdir)) !== false) {
+				if (substr($file, -4) == '.php') {
+					array_push($this->fontlist, strtolower(basename($file, '.php')));
+				}
+			}
+			closedir($fontsdir);
+		}
+	}
+
+	/**
+	 * Returns the unicode caracter specified by the value
+	 * @param $c (int) UTF-8 value
+	 * @return Returns the specified character.
+	 * @since 2.3.000 (2008-03-05)
+	 * @public
+	 * @deprecated
+	 */
+	public function unichr($c) {
+		return TCPDF_FONTS::unichr($c, $this->isunicode);
+	}
+
+	/**
+	 * Convert and add the selected TrueType or Type1 font to the fonts folder (that must be writeable).
+	 * @param $fontfile (string) Font file (full path).
+	 * @param $fonttype (string) Font type. Leave empty for autodetect mode. Valid values are: TrueTypeUnicode, TrueType, Type1, CID0JP = CID-0 Japanese, CID0KR = CID-0 Korean, CID0CS = CID-0 Chinese Simplified, CID0CT = CID-0 Chinese Traditional.
+	 * @param $enc (string) Name of the encoding table to use. Leave empty for default mode. Omit this parameter for TrueType Unicode and symbolic fonts like Symbol or ZapfDingBats.
+	 * @param $flags (int) Unsigned 32-bit integer containing flags specifying various characteristics of the font (PDF32000:2008 - 9.8.2 Font Descriptor Flags): +1 for fixed font; +4 for symbol or +32 for non-symbol; +64 for italic. Fixed and Italic mode are generally autodetected so you have to set it to 32 = non-symbolic font (default) or 4 = symbolic font.
+	 * @param $outpath (string) Output path for generated font files (must be writeable by the web server). Leave empty for default font folder.
+	 * @param $platid (int) Platform ID for CMAP table to extract (when building a Unicode font for Windows this value should be 3, for Macintosh should be 1).
+	 * @param $encid (int) Encoding ID for CMAP table to extract (when building a Unicode font for Windows this value should be 1, for Macintosh should be 0). When Platform ID is 3, legal values for Encoding ID are: 0=Symbol, 1=Unicode, 2=ShiftJIS, 3=PRC, 4=Big5, 5=Wansung, 6=Johab, 7=Reserved, 8=Reserved, 9=Reserved, 10=UCS-4.
+	 * @param $addcbbox (boolean) If true includes the character bounding box information on the php font file.
+	 * @return (string) TCPDF font name.
+	 * @author Nicola Asuni
+	 * @since 5.9.123 (2010-09-30)
+	 * @public
+	 * @deprecated
+	 */
+	public function addTTFfont($fontfile, $fonttype='', $enc='', $flags=32, $outpath='', $platid=3, $encid=1, $addcbbox=false) {
+		return TCPDF_FONTS::addTTFfont($fontfile, $fonttype, $enc, $flags, $outpath, $platid, $encid, $addcbbox);
+	}
+
+	/**
+	 * Imports a TrueType, Type1, core, or CID0 font and makes it available.
+	 * It is necessary to generate a font definition file first (read /fonts/utils/README.TXT).
+	 * The definition file (and the font file itself when embedding) must be present either in the current directory or in the one indicated by K_PATH_FONTS if the constant is defined. If it could not be found, the error "Could not include font definition file" is generated.
+	 * @param $family (string) Font family. The name can be chosen arbitrarily. If it is a standard family name, it will override the corresponding font.
+	 * @param $style (string) Font style. Possible values are (case insensitive):<ul><li>empty string: regular (default)</li><li>B: bold</li><li>I: italic</li><li>BI or IB: bold italic</li></ul>
+	 * @param $fontfile (string) The font definition file. By default, the name is built from the family and style, in lower case with no spaces.
+	 * @return array containing the font data, or false in case of error.
+	 * @param $subset (mixed) if true embedd only a subset of the font (stores only the information related to the used characters); if false embedd full font; if 'default' uses the default value set using setFontSubsetting(). This option is valid only for TrueTypeUnicode fonts. If you want to enable users to change the document, set this parameter to false. If you subset the font, the person who receives your PDF would need to have your same font in order to make changes to your PDF. The file size of the PDF would also be smaller because you are embedding only part of a font.
+	 * @public
+	 * @since 1.5
+	 * @see SetFont(), setFontSubsetting()
+	 */
+	public function AddFont($family, $style='', $fontfile='', $subset='default') {
+		if ($subset === 'default') {
+			$subset = $this->font_subsetting;
+		}
+		if ($this->pdfa_mode) {
+			$subset = false;
+		}
+		if (TCPDF_STATIC::empty_string($family)) {
+			if (!TCPDF_STATIC::empty_string($this->FontFamily)) {
+				$family = $this->FontFamily;
+			} else {
+				$this->Error('Empty font family');
+			}
+		}
+		// move embedded styles on $style
+		if (substr($family, -1) == 'I') {
+			$style .= 'I';
+			$family = substr($family, 0, -1);
+		}
+		if (substr($family, -1) == 'B') {
+			$style .= 'B';
+			$family = substr($family, 0, -1);
+		}
+		// normalize family name
+		$family = strtolower($family);
+		if ((!$this->isunicode) AND ($family == 'arial')) {
+			$family = 'helvetica';
+		}
+		if (($family == 'symbol') OR ($family == 'zapfdingbats')) {
+			$style = '';
+		}
+		if ($this->pdfa_mode AND (isset($this->CoreFonts[$family]))) {
+			// all fonts must be embedded
+			$family = 'pdfa'.$family;
+		}
+		$tempstyle = strtoupper($style);
+		$style = '';
+		// underline
+		if (strpos($tempstyle, 'U') !== false) {
+			$this->underline = true;
+		} else {
+			$this->underline = false;
+		}
+		// line-through (deleted)
+		if (strpos($tempstyle, 'D') !== false) {
+			$this->linethrough = true;
+		} else {
+			$this->linethrough = false;
+		}
+		// overline
+		if (strpos($tempstyle, 'O') !== false) {
+			$this->overline = true;
+		} else {
+			$this->overline = false;
+		}
+		// bold
+		if (strpos($tempstyle, 'B') !== false) {
+			$style .= 'B';
+		}
+		// oblique
+		if (strpos($tempstyle, 'I') !== false) {
+			$style .= 'I';
+		}
+		$bistyle = $style;
+		$fontkey = $family.$style;
+		$font_style = $style.($this->underline ? 'U' : '').($this->linethrough ? 'D' : '').($this->overline ? 'O' : '');
+		$fontdata = array('fontkey' => $fontkey, 'family' => $family, 'style' => $font_style);
+		// check if the font has been already added
+		$fb = $this->getFontBuffer($fontkey);
+		if ($fb !== false) {
+			if ($this->inxobj) {
+				// we are inside an XObject template
+				$this->xobjects[$this->xobjid]['fonts'][$fontkey] = $fb['i'];
+			}
+			return $fontdata;
+		}
+		// get specified font directory (if any)
+		$fontdir = false;
+		if (!TCPDF_STATIC::empty_string($fontfile)) {
+			$fontdir = dirname($fontfile);
+			if (TCPDF_STATIC::empty_string($fontdir) OR ($fontdir == '.')) {
+				$fontdir = '';
+			} else {
+				$fontdir .= '/';
+			}
+		}
+		// true when the font style variation is missing
+		$missing_style = false;
+		// search and include font file
+		if (TCPDF_STATIC::empty_string($fontfile) OR (!@file_exists($fontfile))) {
+			// build a standard filenames for specified font
+			$tmp_fontfile = str_replace(' ', '', $family).strtolower($style).'.php';
+			$fontfile = TCPDF_FONTS::getFontFullPath($tmp_fontfile, $fontdir);
+			if (TCPDF_STATIC::empty_string($fontfile)) {
+				$missing_style = true;
+				// try to remove the style part
+				$tmp_fontfile = str_replace(' ', '', $family).'.php';
+				$fontfile = TCPDF_FONTS::getFontFullPath($tmp_fontfile, $fontdir);
+			}
+		}
+		// include font file
+		if (!TCPDF_STATIC::empty_string($fontfile) AND (@file_exists($fontfile))) {
+			include($fontfile);
+		} else {
+			$this->Error('Could not include font definition file: '.$family.'');
+		}
+		// check font parameters
+		if ((!isset($type)) OR (!isset($cw))) {
+			$this->Error('The font definition file has a bad format: '.$fontfile.'');
+		}
+		// SET default parameters
+		if (!isset($file) OR TCPDF_STATIC::empty_string($file)) {
+			$file = '';
+		}
+		if (!isset($enc) OR TCPDF_STATIC::empty_string($enc)) {
+			$enc = '';
+		}
+		if (!isset($cidinfo) OR TCPDF_STATIC::empty_string($cidinfo)) {
+			$cidinfo = array('Registry'=>'Adobe', 'Ordering'=>'Identity', 'Supplement'=>0);
+			$cidinfo['uni2cid'] = array();
+		}
+		if (!isset($ctg) OR TCPDF_STATIC::empty_string($ctg)) {
+			$ctg = '';
+		}
+		if (!isset($desc) OR TCPDF_STATIC::empty_string($desc)) {
+			$desc = array();
+		}
+		if (!isset($up) OR TCPDF_STATIC::empty_string($up)) {
+			$up = -100;
+		}
+		if (!isset($ut) OR TCPDF_STATIC::empty_string($ut)) {
+			$ut = 50;
+		}
+		if (!isset($cw) OR TCPDF_STATIC::empty_string($cw)) {
+			$cw = array();
+		}
+		if (!isset($dw) OR TCPDF_STATIC::empty_string($dw)) {
+			// set default width
+			if (isset($desc['MissingWidth']) AND ($desc['MissingWidth'] > 0)) {
+				$dw = $desc['MissingWidth'];
+			} elseif (isset($cw[32])) {
+				$dw = $cw[32];
+			} else {
+				$dw = 600;
+			}
+		}
+		++$this->numfonts;
+		if ($type == 'core') {
+			$name = $this->CoreFonts[$fontkey];
+			$subset = false;
+		} elseif (($type == 'TrueType') OR ($type == 'Type1')) {
+			$subset = false;
+		} elseif ($type == 'TrueTypeUnicode') {
+			$enc = 'Identity-H';
+		} elseif ($type == 'cidfont0') {
+			if ($this->pdfa_mode) {
+				$this->Error('All fonts must be embedded in PDF/A mode!');
+			}
+		} else {
+			$this->Error('Unknow font type: '.$type.'');
+		}
+		// set name if unset
+		if (!isset($name) OR empty($name)) {
+			$name = $fontkey;
+		}
+		// create artificial font style variations if missing (only works with non-embedded fonts)
+		if (($type != 'core') AND $missing_style) {
+			// style variations
+			$styles = array('' => '', 'B' => ',Bold', 'I' => ',Italic', 'BI' => ',BoldItalic');
+			$name .= $styles[$bistyle];
+			// artificial bold
+			if (strpos($bistyle, 'B') !== false) {
+				if (isset($desc['StemV'])) {
+					// from normal to bold
+					$desc['StemV'] = round($desc['StemV'] * 1.75);
+				} else {
+					// bold
+					$desc['StemV'] = 123;
+				}
+			}
+			// artificial italic
+			if (strpos($bistyle, 'I') !== false) {
+				if (isset($desc['ItalicAngle'])) {
+					$desc['ItalicAngle'] -= 11;
+				} else {
+					$desc['ItalicAngle'] = -11;
+				}
+				if (isset($desc['Flags'])) {
+					$desc['Flags'] |= 64; //bit 7
+				} else {
+					$desc['Flags'] = 64;
+				}
+			}
+		}
+		// check if the array of characters bounding boxes is defined
+		if (!isset($cbbox)) {
+			$cbbox = array();
+		}
+		// initialize subsetchars
+		$subsetchars = array_fill(0, 255, true);
+		$this->setFontBuffer($fontkey, array('fontkey' => $fontkey, 'i' => $this->numfonts, 'type' => $type, 'name' => $name, 'desc' => $desc, 'up' => $up, 'ut' => $ut, 'cw' => $cw, 'cbbox' => $cbbox, 'dw' => $dw, 'enc' => $enc, 'cidinfo' => $cidinfo, 'file' => $file, 'ctg' => $ctg, 'subset' => $subset, 'subsetchars' => $subsetchars));
+		if ($this->inxobj) {
+			// we are inside an XObject template
+			$this->xobjects[$this->xobjid]['fonts'][$fontkey] = $this->numfonts;
+		}
+		if (isset($diff) AND (!empty($diff))) {
+			//Search existing encodings
+			$d = 0;
+			$nb = count($this->diffs);
+			for ($i=1; $i <= $nb; ++$i) {
+				if ($this->diffs[$i] == $diff) {
+					$d = $i;
+					break;
+				}
+			}
+			if ($d == 0) {
+				$d = $nb + 1;
+				$this->diffs[$d] = $diff;
+			}
+			$this->setFontSubBuffer($fontkey, 'diff', $d);
+		}
+		if (!TCPDF_STATIC::empty_string($file)) {
+			if (!isset($this->FontFiles[$file])) {
+				if ((strcasecmp($type,'TrueType') == 0) OR (strcasecmp($type, 'TrueTypeUnicode') == 0)) {
+					$this->FontFiles[$file] = array('length1' => $originalsize, 'fontdir' => $fontdir, 'subset' => $subset, 'fontkeys' => array($fontkey));
+				} elseif ($type != 'core') {
+					$this->FontFiles[$file] = array('length1' => $size1, 'length2' => $size2, 'fontdir' => $fontdir, 'subset' => $subset, 'fontkeys' => array($fontkey));
+				}
+			} else {
+				// update fontkeys that are sharing this font file
+				$this->FontFiles[$file]['subset'] = ($this->FontFiles[$file]['subset'] AND $subset);
+				if (!in_array($fontkey, $this->FontFiles[$file]['fontkeys'])) {
+					$this->FontFiles[$file]['fontkeys'][] = $fontkey;
+				}
+			}
+		}
+		return $fontdata;
+	}
+
+	/**
+	 * Sets the font used to print character strings.
+	 * The font can be either a standard one or a font added via the AddFont() method. Standard fonts use Windows encoding cp1252 (Western Europe).
+	 * The method can be called before the first page is created and the font is retained from page to page.
+	 * If you just wish to change the current font size, it is simpler to call SetFontSize().
+	 * Note: for the standard fonts, the font metric files must be accessible. There are three possibilities for this:<ul><li>They are in the current directory (the one where the running script lies)</li><li>They are in one of the directories defined by the include_path parameter</li><li>They are in the directory defined by the K_PATH_FONTS constant</li></ul><br />
+	 * @param $family (string) Family font. It can be either a name defined by AddFont() or one of the standard Type1 families (case insensitive):<ul><li>times (Times-Roman)</li><li>timesb (Times-Bold)</li><li>timesi (Times-Italic)</li><li>timesbi (Times-BoldItalic)</li><li>helvetica (Helvetica)</li><li>helveticab (Helvetica-Bold)</li><li>helveticai (Helvetica-Oblique)</li><li>helveticabi (Helvetica-BoldOblique)</li><li>courier (Courier)</li><li>courierb (Courier-Bold)</li><li>courieri (Courier-Oblique)</li><li>courierbi (Courier-BoldOblique)</li><li>symbol (Symbol)</li><li>zapfdingbats (ZapfDingbats)</li></ul> It is also possible to pass an empty string. In that case, the current family is retained.
+	 * @param $style (string) Font style. Possible values are (case insensitive):<ul><li>empty string: regular</li><li>B: bold</li><li>I: italic</li><li>U: underline</li><li>D: line through</li><li>O: overline</li></ul> or any combination. The default value is regular. Bold and italic styles do not apply to Symbol and ZapfDingbats basic fonts or other fonts when not defined.
+	 * @param $size (float) Font size in points. The default value is the current size. If no size has been specified since the beginning of the document, the value taken is 12
+	 * @param $fontfile (string) The font definition file. By default, the name is built from the family and style, in lower case with no spaces.
+	 * @param $subset (mixed) if true embedd only a subset of the font (stores only the information related to the used characters); if false embedd full font; if 'default' uses the default value set using setFontSubsetting(). This option is valid only for TrueTypeUnicode fonts. If you want to enable users to change the document, set this parameter to false. If you subset the font, the person who receives your PDF would need to have your same font in order to make changes to your PDF. The file size of the PDF would also be smaller because you are embedding only part of a font.
+	 * @param $out (boolean) if true output the font size command, otherwise only set the font properties.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 1.0
+	 * @see AddFont(), SetFontSize()
+	 */
+	public function SetFont($family, $style='', $size=null, $fontfile='', $subset='default', $out=true) {
+		//Select a font; size given in points
+		if ($size === null) {
+			$size = $this->FontSizePt;
+		}
+		if ($size < 0) {
+			$size = 0;
+		}
+		// try to add font (if not already added)
+		$fontdata = $this->AddFont($family, $style, $fontfile, $subset);
+		$this->FontFamily = $fontdata['family'];
+		$this->FontStyle = $fontdata['style'];
+		if (isset($this->CurrentFont['fontkey']) AND isset($this->CurrentFont['subsetchars'])) {
+			// save subset chars of the previous font
+			$this->setFontSubBuffer($this->CurrentFont['fontkey'], 'subsetchars', $this->CurrentFont['subsetchars']);
+		}
+		$this->CurrentFont = $this->getFontBuffer($fontdata['fontkey']);
+		$this->SetFontSize($size, $out);
+	}
+
+	/**
+	 * Defines the size of the current font.
+	 * @param $size (float) The font size in points.
+	 * @param $out (boolean) if true output the font size command, otherwise only set the font properties.
+	 * @public
+	 * @since 1.0
+	 * @see SetFont()
+	 */
+	public function SetFontSize($size, $out=true) {
+		// font size in points
+		$this->FontSizePt = $size;
+		// font size in user units
+		$this->FontSize = $size / $this->k;
+		// calculate some font metrics
+		if (isset($this->CurrentFont['desc']['FontBBox'])) {
+			$bbox = explode(' ', substr($this->CurrentFont['desc']['FontBBox'], 1, -1));
+			$font_height = ((intval($bbox[3]) - intval($bbox[1])) * $size / 1000);
+		} else {
+			$font_height = $size * 1.219;
+		}
+		if (isset($this->CurrentFont['desc']['Ascent']) AND ($this->CurrentFont['desc']['Ascent'] > 0)) {
+			$font_ascent = ($this->CurrentFont['desc']['Ascent'] * $size / 1000);
+		}
+		if (isset($this->CurrentFont['desc']['Descent']) AND ($this->CurrentFont['desc']['Descent'] <= 0)) {
+			$font_descent = (- $this->CurrentFont['desc']['Descent'] * $size / 1000);
+		}
+		if (!isset($font_ascent) AND !isset($font_descent)) {
+			// core font
+			$font_ascent = 0.76 * $font_height;
+			$font_descent = $font_height - $font_ascent;
+		} elseif (!isset($font_descent)) {
+			$font_descent = $font_height - $font_ascent;
+		} elseif (!isset($font_ascent)) {
+			$font_ascent = $font_height - $font_descent;
+		}
+		$this->FontAscent = ($font_ascent / $this->k);
+		$this->FontDescent = ($font_descent / $this->k);
+		if ($out AND ($this->page > 0) AND (isset($this->CurrentFont['i'])) AND ($this->state == 2)) {
+			$this->_out(sprintf('BT /F%d %F Tf ET', $this->CurrentFont['i'], $this->FontSizePt));
+		}
+	}
+
+	/**
+	 * Returns the bounding box of the current font in user units.
+	 * @return array
+	 * @public
+	 * @since 5.9.152 (2012-03-23)
+	 */
+	public function getFontBBox() {
+		$fbbox = array();
+		if (isset($this->CurrentFont['desc']['FontBBox'])) {
+			$tmpbbox = explode(' ', substr($this->CurrentFont['desc']['FontBBox'], 1, -1));
+			$fbbox = array_map(array($this,'getAbsFontMeasure'), $tmpbbox);
+		} else {
+			// Find max width
+			if (isset($this->CurrentFont['desc']['MaxWidth'])) {
+				$maxw = $this->getAbsFontMeasure(intval($this->CurrentFont['desc']['MaxWidth']));
+			} else {
+				$maxw = 0;
+				if (isset($this->CurrentFont['desc']['MissingWidth'])) {
+					$maxw = max($maxw, $this->CurrentFont['desc']['MissingWidth']);
+				}
+				if (isset($this->CurrentFont['desc']['AvgWidth'])) {
+					$maxw = max($maxw, $this->CurrentFont['desc']['AvgWidth']);
+				}
+				if (isset($this->CurrentFont['dw'])) {
+					$maxw = max($maxw, $this->CurrentFont['dw']);
+				}
+				foreach ($this->CurrentFont['cw'] as $char => $w) {
+					$maxw = max($maxw, $w);
+				}
+				if ($maxw == 0) {
+					$maxw = 600;
+				}
+				$maxw = $this->getAbsFontMeasure($maxw);
+			}
+			$fbbox = array(0, (0 - $this->FontDescent), $maxw, $this->FontAscent);
+		}
+		return $fbbox;
+	}
+
+	/**
+	 * Convert a relative font measure into absolute value.
+	 * @param $s (int) Font measure.
+	 * @return float Absolute measure.
+	 * @since 5.9.186 (2012-09-13)
+	 */
+	public function getAbsFontMeasure($s) {
+		return ($s * $this->FontSize / 1000);
+	}
+
+	/**
+	 * Returns the glyph bounding box of the specified character in the current font in user units.
+	 * @param $char (int) Input character code.
+	 * @return mixed array(xMin, yMin, xMax, yMax) or FALSE if not defined.
+	 * @since 5.9.186 (2012-09-13)
+	 */
+	public function getCharBBox($char) {
+		if (isset($this->CurrentFont['cbbox'][$char])) {
+			return array_map(array($this,'getAbsFontMeasure'), $this->CurrentFont['cbbox'][intval($char)]);
+		}
+		return false;
+	}
+
+	/**
+	 * Return the font descent value
+	 * @param $font (string) font name
+	 * @param $style (string) font style
+	 * @param $size (float) The size (in points)
+	 * @return int font descent
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 4.9.003 (2010-03-30)
+	 */
+	public function getFontDescent($font, $style='', $size=0) {
+		$fontdata = $this->AddFont($font, $style);
+		$fontinfo = $this->getFontBuffer($fontdata['fontkey']);
+		if (isset($fontinfo['desc']['Descent']) AND ($fontinfo['desc']['Descent'] <= 0)) {
+			$descent = (- $fontinfo['desc']['Descent'] * $size / 1000);
+		} else {
+			$descent = (1.219 * 0.24 * $size);
+		}
+		return ($descent / $this->k);
+	}
+
+	/**
+	 * Return the font ascent value.
+	 * @param $font (string) font name
+	 * @param $style (string) font style
+	 * @param $size (float) The size (in points)
+	 * @return int font ascent
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 4.9.003 (2010-03-30)
+	 */
+	public function getFontAscent($font, $style='', $size=0) {
+		$fontdata = $this->AddFont($font, $style);
+		$fontinfo = $this->getFontBuffer($fontdata['fontkey']);
+		if (isset($fontinfo['desc']['Ascent']) AND ($fontinfo['desc']['Ascent'] > 0)) {
+			$ascent = ($fontinfo['desc']['Ascent'] * $size / 1000);
+		} else {
+			$ascent = 1.219 * 0.76 * $size;
+		}
+		return ($ascent / $this->k);
+	}
+
+	/**
+	 * Return true in the character is present in the specified font.
+	 * @param $char (mixed) Character to check (integer value or string)
+	 * @param $font (string) Font name (family name).
+	 * @param $style (string) Font style.
+	 * @return (boolean) true if the char is defined, false otherwise.
+	 * @public
+	 * @since 5.9.153 (2012-03-28)
+	 */
+	public function isCharDefined($char, $font='', $style='') {
+		if (is_string($char)) {
+			// get character code
+			$char = TCPDF_FONTS::UTF8StringToArray($char, $this->isunicode, $this->CurrentFont);
+			$char = $char[0];
+		}
+		if (TCPDF_STATIC::empty_string($font)) {
+			if (TCPDF_STATIC::empty_string($style)) {
+				return (isset($this->CurrentFont['cw'][intval($char)]));
+			}
+			$font = $this->FontFamily;
+		}
+		$fontdata = $this->AddFont($font, $style);
+		$fontinfo = $this->getFontBuffer($fontdata['fontkey']);
+		return (isset($fontinfo['cw'][intval($char)]));
+	}
+
+	/**
+	 * Replace missing font characters on selected font with specified substitutions.
+	 * @param $text (string) Text to process.
+	 * @param $font (string) Font name (family name).
+	 * @param $style (string) Font style.
+	 * @param $subs (array) Array of possible character substitutions. The key is the character to check (integer value) and the value is a single intege value or an array of possible substitutes.
+	 * @return (string) Processed text.
+	 * @public
+	 * @since 5.9.153 (2012-03-28)
+	 */
+	public function replaceMissingChars($text, $font='', $style='', $subs=array()) {
+		if (empty($subs)) {
+			return $text;
+		}
+		if (TCPDF_STATIC::empty_string($font)) {
+			$font = $this->FontFamily;
+		}
+		$fontdata = $this->AddFont($font, $style);
+		$fontinfo = $this->getFontBuffer($fontdata['fontkey']);
+		$uniarr = TCPDF_FONTS::UTF8StringToArray($text, $this->isunicode, $this->CurrentFont);
+		foreach ($uniarr as $k => $chr) {
+			if (!isset($fontinfo['cw'][$chr])) {
+				// this character is missing on the selected font
+				if (isset($subs[$chr])) {
+					// we have available substitutions
+					if (is_array($subs[$chr])) {
+						foreach($subs[$chr] as $s) {
+							if (isset($fontinfo['cw'][$s])) {
+								$uniarr[$k] = $s;
+								break;
+							}
+						}
+					} elseif (isset($fontinfo['cw'][$subs[$chr]])) {
+						$uniarr[$k] = $subs[$chr];
+					}
+				}
+			}
+		}
+		return TCPDF_FONTS::UniArrSubString(TCPDF_FONTS::UTF8ArrayToUniArray($uniarr, $this->isunicode));
+	}
+
+	/**
+	 * Defines the default monospaced font.
+	 * @param $font (string) Font name.
+	 * @public
+	 * @since 4.5.025
+	 */
+	public function SetDefaultMonospacedFont($font) {
+		$this->default_monospaced_font = $font;
+	}
+
+	/**
+	 * Creates a new internal link and returns its identifier. An internal link is a clickable area which directs to another place within the document.<br />
+	 * The identifier can then be passed to Cell(), Write(), Image() or Link(). The destination is defined with SetLink().
+	 * @public
+	 * @since 1.5
+	 * @see Cell(), Write(), Image(), Link(), SetLink()
+	 */
+	public function AddLink() {
+		//Create a new internal link
+		$n = count($this->links) + 1;
+		$this->links[$n] = array(0, 0);
+		return $n;
+	}
+
+	/**
+	 * Defines the page and position a link points to.
+	 * @param $link (int) The link identifier returned by AddLink()
+	 * @param $y (float) Ordinate of target position; -1 indicates the current position. The default value is 0 (top of page)
+	 * @param $page (int) Number of target page; -1 indicates the current page. This is the default value
+	 * @public
+	 * @since 1.5
+	 * @see AddLink()
+	 */
+	public function SetLink($link, $y=0, $page=-1) {
+		if ($y == -1) {
+			$y = $this->y;
+		}
+		if ($page == -1) {
+			$page = $this->page;
+		}
+		$this->links[$link] = array($page, $y);
+	}
+
+	/**
+	 * Puts a link on a rectangular area of the page.
+	 * Text or image links are generally put via Cell(), Write() or Image(), but this method can be useful for instance to define a clickable area inside an image.
+	 * @param $x (float) Abscissa of the upper-left corner of the rectangle
+	 * @param $y (float) Ordinate of the upper-left corner of the rectangle
+	 * @param $w (float) Width of the rectangle
+	 * @param $h (float) Height of the rectangle
+	 * @param $link (mixed) URL or identifier returned by AddLink()
+	 * @param $spaces (int) number of spaces on the text to link
+	 * @public
+	 * @since 1.5
+	 * @see AddLink(), Annotation(), Cell(), Write(), Image()
+	 */
+	public function Link($x, $y, $w, $h, $link, $spaces=0) {
+		$this->Annotation($x, $y, $w, $h, $link, array('Subtype'=>'Link'), $spaces);
+	}
+
+	/**
+	 * Puts a markup annotation on a rectangular area of the page.
+	 * !!!!THE ANNOTATION SUPPORT IS NOT YET FULLY IMPLEMENTED !!!!
+	 * @param $x (float) Abscissa of the upper-left corner of the rectangle
+	 * @param $y (float) Ordinate of the upper-left corner of the rectangle
+	 * @param $w (float) Width of the rectangle
+	 * @param $h (float) Height of the rectangle
+	 * @param $text (string) annotation text or alternate content
+	 * @param $opt (array) array of options (see section 8.4 of PDF reference 1.7).
+	 * @param $spaces (int) number of spaces on the text to link
+	 * @public
+	 * @since 4.0.018 (2008-08-06)
+	 */
+	public function Annotation($x, $y, $w, $h, $text, $opt=array('Subtype'=>'Text'), $spaces=0) {
+		if ($this->inxobj) {
+			// store parameters for later use on template
+			$this->xobjects[$this->xobjid]['annotations'][] = array('x' => $x, 'y' => $y, 'w' => $w, 'h' => $h, 'text' => $text, 'opt' => $opt, 'spaces' => $spaces);
+			return;
+		}
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		// check page for no-write regions and adapt page margins if necessary
+		list($x, $y) = $this->checkPageRegions($h, $x, $y);
+		// recalculate coordinates to account for graphic transformations
+		if (isset($this->transfmatrix) AND !empty($this->transfmatrix)) {
+			for ($i=$this->transfmatrix_key; $i > 0; --$i) {
+				$maxid = count($this->transfmatrix[$i]) - 1;
+				for ($j=$maxid; $j >= 0; --$j) {
+					$ctm = $this->transfmatrix[$i][$j];
+					if (isset($ctm['a'])) {
+						$x = $x * $this->k;
+						$y = ($this->h - $y) * $this->k;
+						$w = $w * $this->k;
+						$h = $h * $this->k;
+						// top left
+						$xt = $x;
+						$yt = $y;
+						$x1 = ($ctm['a'] * $xt) + ($ctm['c'] * $yt) + $ctm['e'];
+						$y1 = ($ctm['b'] * $xt) + ($ctm['d'] * $yt) + $ctm['f'];
+						// top right
+						$xt = $x + $w;
+						$yt = $y;
+						$x2 = ($ctm['a'] * $xt) + ($ctm['c'] * $yt) + $ctm['e'];
+						$y2 = ($ctm['b'] * $xt) + ($ctm['d'] * $yt) + $ctm['f'];
+						// bottom left
+						$xt = $x;
+						$yt = $y - $h;
+						$x3 = ($ctm['a'] * $xt) + ($ctm['c'] * $yt) + $ctm['e'];
+						$y3 = ($ctm['b'] * $xt) + ($ctm['d'] * $yt) + $ctm['f'];
+						// bottom right
+						$xt = $x + $w;
+						$yt = $y - $h;
+						$x4 = ($ctm['a'] * $xt) + ($ctm['c'] * $yt) + $ctm['e'];
+						$y4 = ($ctm['b'] * $xt) + ($ctm['d'] * $yt) + $ctm['f'];
+						// new coordinates (rectangle area)
+						$x = min($x1, $x2, $x3, $x4);
+						$y = max($y1, $y2, $y3, $y4);
+						$w = (max($x1, $x2, $x3, $x4) - $x) / $this->k;
+						$h = ($y - min($y1, $y2, $y3, $y4)) / $this->k;
+						$x = $x / $this->k;
+						$y = $this->h - ($y / $this->k);
+					}
+				}
+			}
+		}
+		if ($this->page <= 0) {
+			$page = 1;
+		} else {
+			$page = $this->page;
+		}
+		if (!isset($this->PageAnnots[$page])) {
+			$this->PageAnnots[$page] = array();
+		}
+		$this->PageAnnots[$page][] = array('n' => ++$this->n, 'x' => $x, 'y' => $y, 'w' => $w, 'h' => $h, 'txt' => $text, 'opt' => $opt, 'numspaces' => $spaces);
+		if (!$this->pdfa_mode) {
+			if ((($opt['Subtype'] == 'FileAttachment') OR ($opt['Subtype'] == 'Sound')) AND (!TCPDF_STATIC::empty_string($opt['FS']))
+				AND (@file_exists($opt['FS']) OR TCPDF_STATIC::isValidURL($opt['FS']))
+				AND (!isset($this->embeddedfiles[basename($opt['FS'])]))) {
+				$this->embeddedfiles[basename($opt['FS'])] = array('f' => ++$this->n, 'n' => ++$this->n, 'file' => $opt['FS']);
+			}
+		}
+		// Add widgets annotation's icons
+		if (isset($opt['mk']['i']) AND @file_exists($opt['mk']['i'])) {
+			$this->Image($opt['mk']['i'], '', '', 10, 10, '', '', '', false, 300, '', false, false, 0, false, true);
+		}
+		if (isset($opt['mk']['ri']) AND @file_exists($opt['mk']['ri'])) {
+			$this->Image($opt['mk']['ri'], '', '', 0, 0, '', '', '', false, 300, '', false, false, 0, false, true);
+		}
+		if (isset($opt['mk']['ix']) AND @file_exists($opt['mk']['ix'])) {
+			$this->Image($opt['mk']['ix'], '', '', 0, 0, '', '', '', false, 300, '', false, false, 0, false, true);
+		}
+	}
+
+	/**
+	 * Embedd the attached files.
+	 * @since 4.4.000 (2008-12-07)
+	 * @protected
+	 * @see Annotation()
+	 */
+	protected function _putEmbeddedFiles() {
+		if ($this->pdfa_mode) {
+			// embedded files are not allowed in PDF/A mode
+			return;
+		}
+		reset($this->embeddedfiles);
+		foreach ($this->embeddedfiles as $filename => $filedata) {
+			$data = TCPDF_STATIC::fileGetContents($filedata['file']);
+			if ($data !== FALSE) {
+				$rawsize = strlen($data);
+				if ($rawsize > 0) {
+					// update name tree
+					$this->efnames[$filename] = $filedata['f'].' 0 R';
+					// embedded file specification object
+					$out = $this->_getobj($filedata['f'])."\n";
+					$out .= '<</Type /Filespec /F '.$this->_datastring($filename, $filedata['f']).' /EF <</F '.$filedata['n'].' 0 R>> >>';
+					$out .= "\n".'endobj';
+					$this->_out($out);
+					// embedded file object
+					$filter = '';
+					if ($this->compress) {
+						$data = gzcompress($data);
+						$filter = ' /Filter /FlateDecode';
+					}
+					$stream = $this->_getrawstream($data, $filedata['n']);
+					$out = $this->_getobj($filedata['n'])."\n";
+					$out .= '<< /Type /EmbeddedFile'.$filter.' /Length '.strlen($stream).' /Params <</Size '.$rawsize.'>> >>';
+					$out .= ' stream'."\n".$stream."\n".'endstream';
+					$out .= "\n".'endobj';
+					$this->_out($out);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Prints a text cell at the specified position.
+	 * This method allows to place a string precisely on the page.
+	 * @param $x (float) Abscissa of the cell origin
+	 * @param $y (float) Ordinate of the cell origin
+	 * @param $txt (string) String to print
+	 * @param $fstroke (int) outline size in user units (false = disable)
+	 * @param $fclip (boolean) if true activate clipping mode (you must call StartTransform() before this function and StopTransform() to stop the clipping tranformation).
+	 * @param $ffill (boolean) if true fills the text
+	 * @param $border (mixed) Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
+	 * @param $ln (int) Indicates where the current position should go after the call. Possible values are:<ul><li>0: to the right (or left for RTL languages)</li><li>1: to the beginning of the next line</li><li>2: below</li></ul>Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0.
+	 * @param $align (string) Allows to center or align the text. Possible values are:<ul><li>L or empty string: left align (default value)</li><li>C: center</li><li>R: right align</li><li>J: justify</li></ul>
+	 * @param $fill (boolean) Indicates if the cell background must be painted (true) or transparent (false).
+	 * @param $link (mixed) URL or identifier returned by AddLink().
+	 * @param $stretch (int) font stretch mode: <ul><li>0 = disabled</li><li>1 = horizontal scaling only if text is larger than cell width</li><li>2 = forced horizontal scaling to fit cell width</li><li>3 = character spacing only if text is larger than cell width</li><li>4 = forced character spacing to fit cell width</li></ul> General font stretching and scaling values will be preserved when possible.
+	 * @param $ignore_min_height (boolean) if true ignore automatic minimum height value.
+	 * @param $calign (string) cell vertical alignment relative to the specified Y value. Possible values are:<ul><li>T : cell top</li><li>A : font top</li><li>L : font baseline</li><li>D : font bottom</li><li>B : cell bottom</li></ul>
+	 * @param $valign (string) text vertical alignment inside the cell. Possible values are:<ul><li>T : top</li><li>C : center</li><li>B : bottom</li></ul>
+	 * @param $rtloff (boolean) if true uses the page top-left corner as origin of axis for $x and $y initial position.
+	 * @public
+	 * @since 1.0
+	 * @see Cell(), Write(), MultiCell(), WriteHTML(), WriteHTMLCell()
+	 */
+	public function Text($x, $y, $txt, $fstroke=false, $fclip=false, $ffill=true, $border=0, $ln=0, $align='', $fill=false, $link='', $stretch=0, $ignore_min_height=false, $calign='T', $valign='M', $rtloff=false) {
+		$textrendermode = $this->textrendermode;
+		$textstrokewidth = $this->textstrokewidth;
+		$this->setTextRenderingMode($fstroke, $ffill, $fclip);
+		$this->SetXY($x, $y, $rtloff);
+		$this->Cell(0, 0, $txt, $border, $ln, $align, $fill, $link, $stretch, $ignore_min_height, $calign, $valign);
+		// restore previous rendering mode
+		$this->textrendermode = $textrendermode;
+		$this->textstrokewidth = $textstrokewidth;
+	}
+
+	/**
+	 * Whenever a page break condition is met, the method is called, and the break is issued or not depending on the returned value.
+	 * The default implementation returns a value according to the mode selected by SetAutoPageBreak().<br />
+	 * This method is called automatically and should not be called directly by the application.
+	 * @return boolean
+	 * @public
+	 * @since 1.4
+	 * @see SetAutoPageBreak()
+	 */
+	public function AcceptPageBreak() {
+		if ($this->num_columns > 1) {
+			// multi column mode
+			if ($this->current_column < ($this->num_columns - 1)) {
+				// go to next column
+				$this->selectColumn($this->current_column + 1);
+			} elseif ($this->AutoPageBreak) {
+				// add a new page
+				$this->AddPage();
+				// set first column
+				$this->selectColumn(0);
+			}
+			// avoid page breaking from checkPageBreak()
+			return false;
+		}
+		return $this->AutoPageBreak;
+	}
+
+	/**
+	 * Add page if needed.
+	 * @param $h (float) Cell height. Default value: 0.
+	 * @param $y (mixed) starting y position, leave empty for current position.
+	 * @param $addpage (boolean) if true add a page, otherwise only return the true/false state
+	 * @return boolean true in case of page break, false otherwise.
+	 * @since 3.2.000 (2008-07-01)
+	 * @protected
+	 */
+	protected function checkPageBreak($h=0, $y='', $addpage=true) {
+		if (TCPDF_STATIC::empty_string($y)) {
+			$y = $this->y;
+		}
+		$current_page = $this->page;
+		if ((($y + $h) > $this->PageBreakTrigger) AND ($this->inPageBody()) AND ($this->AcceptPageBreak())) {
+			if ($addpage) {
+				//Automatic page break
+				$x = $this->x;
+				$this->AddPage($this->CurOrientation);
+				$this->y = $this->tMargin;
+				$oldpage = $this->page - 1;
+				if ($this->rtl) {
+					if ($this->pagedim[$this->page]['orm'] != $this->pagedim[$oldpage]['orm']) {
+						$this->x = $x - ($this->pagedim[$this->page]['orm'] - $this->pagedim[$oldpage]['orm']);
+					} else {
+						$this->x = $x;
+					}
+				} else {
+					if ($this->pagedim[$this->page]['olm'] != $this->pagedim[$oldpage]['olm']) {
+						$this->x = $x + ($this->pagedim[$this->page]['olm'] - $this->pagedim[$oldpage]['olm']);
+					} else {
+						$this->x = $x;
+					}
+				}
+			}
+			return true;
+		}
+		if ($current_page != $this->page) {
+			// account for columns mode
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Prints a cell (rectangular area) with optional borders, background color and character string. The upper-left corner of the cell corresponds to the current position. The text can be aligned or centered. After the call, the current position moves to the right or to the next line. It is possible to put a link on the text.<br />
+	 * If automatic page breaking is enabled and the cell goes beyond the limit, a page break is done before outputting.
+	 * @param $w (float) Cell width. If 0, the cell extends up to the right margin.
+	 * @param $h (float) Cell height. Default value: 0.
+	 * @param $txt (string) String to print. Default value: empty string.
+	 * @param $border (mixed) Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
+	 * @param $ln (int) Indicates where the current position should go after the call. Possible values are:<ul><li>0: to the right (or left for RTL languages)</li><li>1: to the beginning of the next line</li><li>2: below</li></ul> Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0.
+	 * @param $align (string) Allows to center or align the text. Possible values are:<ul><li>L or empty string: left align (default value)</li><li>C: center</li><li>R: right align</li><li>J: justify</li></ul>
+	 * @param $fill (boolean) Indicates if the cell background must be painted (true) or transparent (false).
+	 * @param $link (mixed) URL or identifier returned by AddLink().
+	 * @param $stretch (int) font stretch mode: <ul><li>0 = disabled</li><li>1 = horizontal scaling only if text is larger than cell width</li><li>2 = forced horizontal scaling to fit cell width</li><li>3 = character spacing only if text is larger than cell width</li><li>4 = forced character spacing to fit cell width</li></ul> General font stretching and scaling values will be preserved when possible.
+	 * @param $ignore_min_height (boolean) if true ignore automatic minimum height value.
+	 * @param $calign (string) cell vertical alignment relative to the specified Y value. Possible values are:<ul><li>T : cell top</li><li>C : center</li><li>B : cell bottom</li><li>A : font top</li><li>L : font baseline</li><li>D : font bottom</li></ul>
+	 * @param $valign (string) text vertical alignment inside the cell. Possible values are:<ul><li>T : top</li><li>C : center</li><li>B : bottom</li></ul>
+	 * @public
+	 * @since 1.0
+	 * @see SetFont(), SetDrawColor(), SetFillColor(), SetTextColor(), SetLineWidth(), AddLink(), Ln(), MultiCell(), Write(), SetAutoPageBreak()
+	 */
+	public function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='', $stretch=0, $ignore_min_height=false, $calign='T', $valign='M') {
+		$prev_cell_margin = $this->cell_margin;
+		$prev_cell_padding = $this->cell_padding;
+		$this->adjustCellPadding($border);
+		if (!$ignore_min_height) {
+			$min_cell_height = ($this->FontSize * $this->cell_height_ratio) + $this->cell_padding['T'] + $this->cell_padding['B'];
+			if ($h < $min_cell_height) {
+				$h = $min_cell_height;
+			}
+		}
+		$this->checkPageBreak($h + $this->cell_margin['T'] + $this->cell_margin['B']);
+		// apply text shadow if enabled
+		if ($this->txtshadow['enabled']) {
+			// save data
+			$x = $this->x;
+			$y = $this->y;
+			$bc = $this->bgcolor;
+			$fc = $this->fgcolor;
+			$sc = $this->strokecolor;
+			$alpha = $this->alpha;
+			// print shadow
+			$this->x += $this->txtshadow['depth_w'];
+			$this->y += $this->txtshadow['depth_h'];
+			$this->SetFillColorArray($this->txtshadow['color']);
+			$this->SetTextColorArray($this->txtshadow['color']);
+			$this->SetDrawColorArray($this->txtshadow['color']);
+			if ($this->txtshadow['opacity'] != $alpha['CA']) {
+				$this->setAlpha($this->txtshadow['opacity'], $this->txtshadow['blend_mode']);
+			}
+			if ($this->state == 2) {
+				$this->_out($this->getCellCode($w, $h, $txt, $border, $ln, $align, $fill, $link, $stretch, true, $calign, $valign));
+			}
+			//restore data
+			$this->x = $x;
+			$this->y = $y;
+			$this->SetFillColorArray($bc);
+			$this->SetTextColorArray($fc);
+			$this->SetDrawColorArray($sc);
+			if ($this->txtshadow['opacity'] != $alpha['CA']) {
+				$this->setAlpha($alpha['CA'], $alpha['BM'], $alpha['ca'], $alpha['AIS']);
+			}
+		}
+		if ($this->state == 2) {
+			$this->_out($this->getCellCode($w, $h, $txt, $border, $ln, $align, $fill, $link, $stretch, true, $calign, $valign));
+		}
+		$this->cell_padding = $prev_cell_padding;
+		$this->cell_margin = $prev_cell_margin;
+	}
+
+	/**
+	 * Returns the PDF string code to print a cell (rectangular area) with optional borders, background color and character string. The upper-left corner of the cell corresponds to the current position. The text can be aligned or centered. After the call, the current position moves to the right or to the next line. It is possible to put a link on the text.<br />
+	 * If automatic page breaking is enabled and the cell goes beyond the limit, a page break is done before outputting.
+	 * @param $w (float) Cell width. If 0, the cell extends up to the right margin.
+	 * @param $h (float) Cell height. Default value: 0.
+	 * @param $txt (string) String to print. Default value: empty string.
+	 * @param $border (mixed) Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
+	 * @param $ln (int) Indicates where the current position should go after the call. Possible values are:<ul><li>0: to the right (or left for RTL languages)</li><li>1: to the beginning of the next line</li><li>2: below</li></ul>Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0.
+	 * @param $align (string) Allows to center or align the text. Possible values are:<ul><li>L or empty string: left align (default value)</li><li>C: center</li><li>R: right align</li><li>J: justify</li></ul>
+	 * @param $fill (boolean) Indicates if the cell background must be painted (true) or transparent (false).
+	 * @param $link (mixed) URL or identifier returned by AddLink().
+	 * @param $stretch (int) font stretch mode: <ul><li>0 = disabled</li><li>1 = horizontal scaling only if text is larger than cell width</li><li>2 = forced horizontal scaling to fit cell width</li><li>3 = character spacing only if text is larger than cell width</li><li>4 = forced character spacing to fit cell width</li></ul> General font stretching and scaling values will be preserved when possible.
+	 * @param $ignore_min_height (boolean) if true ignore automatic minimum height value.
+	 * @param $calign (string) cell vertical alignment relative to the specified Y value. Possible values are:<ul><li>T : cell top</li><li>C : center</li><li>B : cell bottom</li><li>A : font top</li><li>L : font baseline</li><li>D : font bottom</li></ul>
+	 * @param $valign (string) text vertical alignment inside the cell. Possible values are:<ul><li>T : top</li><li>M : middle</li><li>B : bottom</li></ul>
+	 * @return string containing cell code
+	 * @protected
+	 * @since 1.0
+	 * @see Cell()
+	 */
+	protected function getCellCode($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='', $stretch=0, $ignore_min_height=false, $calign='T', $valign='M') {
+		// replace 'NO-BREAK SPACE' (U+00A0) character with a simple space
+		$txt = str_replace(TCPDF_FONTS::unichr(160, $this->isunicode), ' ', $txt);
+		$prev_cell_margin = $this->cell_margin;
+		$prev_cell_padding = $this->cell_padding;
+		$txt = TCPDF_STATIC::removeSHY($txt, $this->isunicode);
+		$rs = ''; //string to be returned
+		$this->adjustCellPadding($border);
+		if (!$ignore_min_height) {
+			$min_cell_height = ($this->FontSize * $this->cell_height_ratio) + $this->cell_padding['T'] + $this->cell_padding['B'];
+			if ($h < $min_cell_height) {
+				$h = $min_cell_height;
+			}
+		}
+		$k = $this->k;
+		// check page for no-write regions and adapt page margins if necessary
+		list($this->x, $this->y) = $this->checkPageRegions($h, $this->x, $this->y);
+		if ($this->rtl) {
+			$x = $this->x - $this->cell_margin['R'];
+		} else {
+			$x = $this->x + $this->cell_margin['L'];
+		}
+		$y = $this->y + $this->cell_margin['T'];
+		$prev_font_stretching = $this->font_stretching;
+		$prev_font_spacing = $this->font_spacing;
+		// cell vertical alignment
+		switch ($calign) {
+			case 'A': {
+				// font top
+				switch ($valign) {
+					case 'T': {
+						// top
+						$y -= $this->cell_padding['T'];
+						break;
+					}
+					case 'B': {
+						// bottom
+						$y -= ($h - $this->cell_padding['B'] - $this->FontAscent - $this->FontDescent);
+						break;
+					}
+					default:
+					case 'C':
+					case 'M': {
+						// center
+						$y -= (($h - $this->FontAscent - $this->FontDescent) / 2);
+						break;
+					}
+				}
+				break;
+			}
+			case 'L': {
+				// font baseline
+				switch ($valign) {
+					case 'T': {
+						// top
+						$y -= ($this->cell_padding['T'] + $this->FontAscent);
+						break;
+					}
+					case 'B': {
+						// bottom
+						$y -= ($h - $this->cell_padding['B'] - $this->FontDescent);
+						break;
+					}
+					default:
+					case 'C':
+					case 'M': {
+						// center
+						$y -= (($h + $this->FontAscent - $this->FontDescent) / 2);
+						break;
+					}
+				}
+				break;
+			}
+			case 'D': {
+				// font bottom
+				switch ($valign) {
+					case 'T': {
+						// top
+						$y -= ($this->cell_padding['T'] + $this->FontAscent + $this->FontDescent);
+						break;
+					}
+					case 'B': {
+						// bottom
+						$y -= ($h - $this->cell_padding['B']);
+						break;
+					}
+					default:
+					case 'C':
+					case 'M': {
+						// center
+						$y -= (($h + $this->FontAscent + $this->FontDescent) / 2);
+						break;
+					}
+				}
+				break;
+			}
+			case 'B': {
+				// cell bottom
+				$y -= $h;
+				break;
+			}
+			case 'C':
+			case 'M': {
+				// cell center
+				$y -= ($h / 2);
+				break;
+			}
+			default:
+			case 'T': {
+				// cell top
+				break;
+			}
+		}
+		// text vertical alignment
+		switch ($valign) {
+			case 'T': {
+				// top
+				$yt = $y + $this->cell_padding['T'];
+				break;
+			}
+			case 'B': {
+				// bottom
+				$yt = $y + $h - $this->cell_padding['B'] - $this->FontAscent - $this->FontDescent;
+				break;
+			}
+			default:
+			case 'C':
+			case 'M': {
+				// center
+				$yt = $y + (($h - $this->FontAscent - $this->FontDescent) / 2);
+				break;
+			}
+		}
+		$basefonty = $yt + $this->FontAscent;
+		if (TCPDF_STATIC::empty_string($w) OR ($w <= 0)) {
+			if ($this->rtl) {
+				$w = $x - $this->lMargin;
+			} else {
+				$w = $this->w - $this->rMargin - $x;
+			}
+		}
+		$s = '';
+		// fill and borders
+		if (is_string($border) AND (strlen($border) == 4)) {
+			// full border
+			$border = 1;
+		}
+		if ($fill OR ($border == 1)) {
+			if ($fill) {
+				$op = ($border == 1) ? 'B' : 'f';
+			} else {
+				$op = 'S';
+			}
+			if ($this->rtl) {
+				$xk = (($x - $w) * $k);
+			} else {
+				$xk = ($x * $k);
+			}
+			$s .= sprintf('%F %F %F %F re %s ', $xk, (($this->h - $y) * $k), ($w * $k), (-$h * $k), $op);
+		}
+		// draw borders
+		$s .= $this->getCellBorder($x, $y, $w, $h, $border);
+		if ($txt != '') {
+			$txt2 = $txt;
+			if ($this->isunicode) {
+				if (($this->CurrentFont['type'] == 'core') OR ($this->CurrentFont['type'] == 'TrueType') OR ($this->CurrentFont['type'] == 'Type1')) {
+					$txt2 = TCPDF_FONTS::UTF8ToLatin1($txt2, $this->isunicode, $this->CurrentFont);
+				} else {
+					$unicode = TCPDF_FONTS::UTF8StringToArray($txt, $this->isunicode, $this->CurrentFont); // array of UTF-8 unicode values
+					$unicode = TCPDF_FONTS::utf8Bidi($unicode, '', $this->tmprtl, $this->isunicode, $this->CurrentFont);
+					// replace thai chars (if any)
+					if (defined('K_THAI_TOPCHARS') AND (K_THAI_TOPCHARS == true)) {
+						// number of chars
+						$numchars = count($unicode);
+						// po pla, for far, for fan
+						$longtail = array(0x0e1b, 0x0e1d, 0x0e1f);
+						// do chada, to patak
+						$lowtail = array(0x0e0e, 0x0e0f);
+						// mai hun arkad, sara i, sara ii, sara ue, sara uee
+						$upvowel = array(0x0e31, 0x0e34, 0x0e35, 0x0e36, 0x0e37);
+						// mai ek, mai tho, mai tri, mai chattawa, karan
+						$tonemark = array(0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c);
+						// sara u, sara uu, pinthu
+						$lowvowel = array(0x0e38, 0x0e39, 0x0e3a);
+						$output = array();
+						for ($i = 0; $i < $numchars; $i++) {
+							if (($unicode[$i] >= 0x0e00) && ($unicode[$i] <= 0x0e5b)) {
+								$ch0 = $unicode[$i];
+								$ch1 = ($i > 0) ? $unicode[($i - 1)] : 0;
+								$ch2 = ($i > 1) ? $unicode[($i - 2)] : 0;
+								$chn = ($i < ($numchars - 1)) ? $unicode[($i + 1)] : 0;
+								if (in_array($ch0, $tonemark)) {
+									if ($chn == 0x0e33) {
+										// sara um
+										if (in_array($ch1, $longtail)) {
+											// tonemark at upper left
+											$output[] = $this->replaceChar($ch0, (0xf713 + $ch0 - 0x0e48));
+										} else {
+											// tonemark at upper right (normal position)
+											$output[] = $ch0;
+										}
+									} elseif (in_array($ch1, $longtail) OR (in_array($ch2, $longtail) AND in_array($ch1, $lowvowel))) {
+										// tonemark at lower left
+										$output[] = $this->replaceChar($ch0, (0xf705 + $ch0 - 0x0e48));
+									} elseif (in_array($ch1, $upvowel)) {
+										if (in_array($ch2, $longtail)) {
+											// tonemark at upper left
+											$output[] = $this->replaceChar($ch0, (0xf713 + $ch0 - 0x0e48));
+										} else {
+											// tonemark at upper right (normal position)
+											$output[] = $ch0;
+										}
+									} else {
+										// tonemark at lower right
+										$output[] = $this->replaceChar($ch0, (0xf70a + $ch0 - 0x0e48));
+									}
+								} elseif (($ch0 == 0x0e33) AND (in_array($ch1, $longtail) OR (in_array($ch2, $longtail) AND in_array($ch1, $tonemark)))) {
+									// add lower left nikhahit and sara aa
+									if ($this->isCharDefined(0xf711) AND $this->isCharDefined(0x0e32)) {
+										$output[] = 0xf711;
+										$this->CurrentFont['subsetchars'][0xf711] = true;
+										$output[] = 0x0e32;
+										$this->CurrentFont['subsetchars'][0x0e32] = true;
+									} else {
+										$output[] = $ch0;
+									}
+								} elseif (in_array($ch1, $longtail)) {
+									if ($ch0 == 0x0e31) {
+										// lower left mai hun arkad
+										$output[] = $this->replaceChar($ch0, 0xf710);
+									} elseif (in_array($ch0, $upvowel)) {
+										// lower left
+										$output[] = $this->replaceChar($ch0, (0xf701 + $ch0 - 0x0e34));
+									} elseif ($ch0 == 0x0e47) {
+										// lower left mai tai koo
+										$output[] = $this->replaceChar($ch0, 0xf712);
+									} else {
+										// normal character
+										$output[] = $ch0;
+									}
+								} elseif (in_array($ch1, $lowtail) AND in_array($ch0, $lowvowel)) {
+									// lower vowel
+									$output[] = $this->replaceChar($ch0, (0xf718 + $ch0 - 0x0e38));
+								} elseif (($ch0 == 0x0e0d) AND in_array($chn, $lowvowel)) {
+									// yo ying without lower part
+									$output[] = $this->replaceChar($ch0, 0xf70f);
+								} elseif (($ch0 == 0x0e10) AND in_array($chn, $lowvowel)) {
+									// tho santan without lower part
+									$output[] = $this->replaceChar($ch0, 0xf700);
+								} else {
+									$output[] = $ch0;
+								}
+							} else {
+								// non-thai character
+								$output[] = $unicode[$i];
+							}
+						}
+						$unicode = $output;
+						// update font subsetchars
+						$this->setFontSubBuffer($this->CurrentFont['fontkey'], 'subsetchars', $this->CurrentFont['subsetchars']);
+					} // end of K_THAI_TOPCHARS
+					$txt2 = TCPDF_FONTS::arrUTF8ToUTF16BE($unicode, false);
+				}
+			}
+			$txt2 = TCPDF_STATIC::_escape($txt2);
+			// get current text width (considering general font stretching and spacing)
+			$txwidth = $this->GetStringWidth($txt);
+			$width = $txwidth;
+			// check for stretch mode
+			if ($stretch > 0) {
+				// calculate ratio between cell width and text width
+				if ($width <= 0) {
+					$ratio = 1;
+				} else {
+					$ratio = (($w - $this->cell_padding['L'] - $this->cell_padding['R']) / $width);
+				}
+				// check if stretching is required
+				if (($ratio < 1) OR (($ratio > 1) AND (($stretch % 2) == 0))) {
+					// the text will be stretched to fit cell width
+					if ($stretch > 2) {
+						// set new character spacing
+						$this->font_spacing += ($w - $this->cell_padding['L'] - $this->cell_padding['R'] - $width) / (max(($this->GetNumChars($txt) - 1), 1) * ($this->font_stretching / 100));
+					} else {
+						// set new horizontal stretching
+						$this->font_stretching *= $ratio;
+					}
+					// recalculate text width (the text fills the entire cell)
+					$width = $w - $this->cell_padding['L'] - $this->cell_padding['R'];
+					// reset alignment
+					$align = '';
+				}
+			}
+			if ($this->font_stretching != 100) {
+				// apply font stretching
+				$rs .= sprintf('BT %F Tz ET ', $this->font_stretching);
+			}
+			if ($this->font_spacing != 0) {
+				// increase/decrease font spacing
+				$rs .= sprintf('BT %F Tc ET ', ($this->font_spacing * $this->k));
+			}
+			if ($this->ColorFlag AND ($this->textrendermode < 4)) {
+				$s .= 'q '.$this->TextColor.' ';
+			}
+			// rendering mode
+			$s .= sprintf('BT %d Tr %F w ET ', $this->textrendermode, ($this->textstrokewidth * $this->k));
+			// count number of spaces
+			$ns = substr_count($txt, chr(32));
+			// Justification
+			$spacewidth = 0;
+			if (($align == 'J') AND ($ns > 0)) {
+				if ($this->isUnicodeFont()) {
+					// get string width without spaces
+					$width = $this->GetStringWidth(str_replace(' ', '', $txt));
+					// calculate average space width
+					$spacewidth = -1000 * ($w - $width - $this->cell_padding['L'] - $this->cell_padding['R']) / ($ns?$ns:1) / ($this->FontSize?$this->FontSize:1);
+					if ($this->font_stretching != 100) {
+						// word spacing is affected by stretching
+						$spacewidth /= ($this->font_stretching / 100);
+					}
+					// set word position to be used with TJ operator
+					$txt2 = str_replace(chr(0).chr(32), ') '.sprintf('%F', $spacewidth).' (', $txt2);
+					$unicode_justification = true;
+				} else {
+					// get string width
+					$width = $txwidth;
+					// new space width
+					$spacewidth = (($w - $width - $this->cell_padding['L'] - $this->cell_padding['R']) / ($ns?$ns:1)) * $this->k;
+					if ($this->font_stretching != 100) {
+						// word spacing (Tw) is affected by stretching
+						$spacewidth /= ($this->font_stretching / 100);
+					}
+					// set word spacing
+					$rs .= sprintf('BT %F Tw ET ', $spacewidth);
+				}
+				$width = $w - $this->cell_padding['L'] - $this->cell_padding['R'];
+			}
+			// replace carriage return characters
+			$txt2 = str_replace("\r", ' ', $txt2);
+			switch ($align) {
+				case 'C': {
+					$dx = ($w - $width) / 2;
+					break;
+				}
+				case 'R': {
+					if ($this->rtl) {
+						$dx = $this->cell_padding['R'];
+					} else {
+						$dx = $w - $width - $this->cell_padding['R'];
+					}
+					break;
+				}
+				case 'L': {
+					if ($this->rtl) {
+						$dx = $w - $width - $this->cell_padding['L'];
+					} else {
+						$dx = $this->cell_padding['L'];
+					}
+					break;
+				}
+				case 'J':
+				default: {
+					if ($this->rtl) {
+						$dx = $this->cell_padding['R'];
+					} else {
+						$dx = $this->cell_padding['L'];
+					}
+					break;
+				}
+			}
+			if ($this->rtl) {
+				$xdx = $x - $dx - $width;
+			} else {
+				$xdx = $x + $dx;
+			}
+			$xdk = $xdx * $k;
+			// print text
+			$s .= sprintf('BT %F %F Td [(%s)] TJ ET', $xdk, (($this->h - $basefonty) * $k), $txt2);
+			if (isset($uniblock)) {
+				// print overlapping characters as separate string
+				$xshift = 0; // horizontal shift
+				$ty = (($this->h - $basefonty + (0.2 * $this->FontSize)) * $k);
+				$spw = (($w - $txwidth - $this->cell_padding['L'] - $this->cell_padding['R']) / ($ns?$ns:1));
+				foreach ($uniblock as $uk => $uniarr) {
+					if (($uk % 2) == 0) {
+						// x space to skip
+						if ($spacewidth != 0) {
+							// justification shift
+							$xshift += (count(array_keys($uniarr, 32)) * $spw);
+						}
+						$xshift += $this->GetArrStringWidth($uniarr); // + shift justification
+					} else {
+						// character to print
+						$topchr = TCPDF_FONTS::arrUTF8ToUTF16BE($uniarr, false);
+						$topchr = TCPDF_STATIC::_escape($topchr);
+						$s .= sprintf(' BT %F %F Td [(%s)] TJ ET', ($xdk + ($xshift * $k)), $ty, $topchr);
+					}
+				}
+			}
+			if ($this->underline) {
+				$s .= ' '.$this->_dounderlinew($xdx, $basefonty, $width);
+			}
+			if ($this->linethrough) {
+				$s .= ' '.$this->_dolinethroughw($xdx, $basefonty, $width);
+			}
+			if ($this->overline) {
+				$s .= ' '.$this->_dooverlinew($xdx, $basefonty, $width);
+			}
+			if ($this->ColorFlag AND ($this->textrendermode < 4)) {
+				$s .= ' Q';
+			}
+			if ($link) {
+				$this->Link($xdx, $yt, $width, ($this->FontAscent + $this->FontDescent), $link, $ns);
+			}
+		}
+		// output cell
+		if ($s) {
+			// output cell
+			$rs .= $s;
+			if ($this->font_spacing != 0) {
+				// reset font spacing mode
+				$rs .= ' BT 0 Tc ET';
+			}
+			if ($this->font_stretching != 100) {
+				// reset font stretching mode
+				$rs .= ' BT 100 Tz ET';
+			}
+		}
+		// reset word spacing
+		if (!$this->isUnicodeFont() AND ($align == 'J')) {
+			$rs .= ' BT 0 Tw ET';
+		}
+		// reset stretching and spacing
+		$this->font_stretching = $prev_font_stretching;
+		$this->font_spacing = $prev_font_spacing;
+		$this->lasth = $h;
+		if ($ln > 0) {
+			//Go to the beginning of the next line
+			$this->y = $y + $h + $this->cell_margin['B'];
+			if ($ln == 1) {
+				if ($this->rtl) {
+					$this->x = $this->w - $this->rMargin;
+				} else {
+					$this->x = $this->lMargin;
+				}
+			}
+		} else {
+			// go left or right by case
+			if ($this->rtl) {
+				$this->x = $x - $w - $this->cell_margin['L'];
+			} else {
+				$this->x = $x + $w + $this->cell_margin['R'];
+			}
+		}
+		$gstyles = ''.$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor.' '.$this->FillColor."\n";
+		$rs = $gstyles.$rs;
+		$this->cell_padding = $prev_cell_padding;
+		$this->cell_margin = $prev_cell_margin;
+		return $rs;
+	}
+
+	/**
+	 * Replace a char if is defined on the current font.
+	 * @param $oldchar (int) Integer code (unicode) of the character to replace.
+	 * @param $newchar (int) Integer code (unicode) of the new character.
+	 * @return int the replaced char or the old char in case the new char i not defined
+	 * @protected
+	 * @since 5.9.167 (2012-06-22)
+	 */
+	protected function replaceChar($oldchar, $newchar) {
+		if ($this->isCharDefined($newchar)) {
+			// add the new char on the subset list
+			$this->CurrentFont['subsetchars'][$newchar] = true;
+			// return the new character
+			return $newchar;
+		}
+		// return the old char
+		return $oldchar;
+	}
+
+	/**
+	 * Returns the code to draw the cell border
+	 * @param $x (float) X coordinate.
+	 * @param $y (float) Y coordinate.
+	 * @param $w (float) Cell width.
+	 * @param $h (float) Cell height.
+	 * @param $brd (mixed) Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
+	 * @return string containing cell border code
+	 * @protected
+	 * @see SetLineStyle()
+	 * @since 5.7.000 (2010-08-02)
+	 */
+	protected function getCellBorder($x, $y, $w, $h, $brd) {
+		$s = ''; // string to be returned
+		if (empty($brd)) {
+			return $s;
+		}
+		if ($brd == 1) {
+			$brd = array('LRTB' => true);
+		}
+		// calculate coordinates for border
+		$k = $this->k;
+		if ($this->rtl) {
+			$xeL = ($x - $w) * $k;
+			$xeR = $x * $k;
+		} else {
+			$xeL = $x * $k;
+			$xeR = ($x + $w) * $k;
+		}
+		$yeL = (($this->h - ($y + $h)) * $k);
+		$yeT = (($this->h - $y) * $k);
+		$xeT = $xeL;
+		$xeB = $xeR;
+		$yeR = $yeT;
+		$yeB = $yeL;
+		if (is_string($brd)) {
+			// convert string to array
+			$slen = strlen($brd);
+			$newbrd = array();
+			for ($i = 0; $i < $slen; ++$i) {
+				$newbrd[$brd[$i]] = array('cap' => 'square', 'join' => 'miter');
+			}
+			$brd = $newbrd;
+		}
+		if (isset($brd['mode'])) {
+			$mode = $brd['mode'];
+			unset($brd['mode']);
+		} else {
+			$mode = 'normal';
+		}
+		foreach ($brd as $border => $style) {
+			if (is_array($style) AND !empty($style)) {
+				// apply border style
+				$prev_style = $this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor.' ';
+				$s .= $this->SetLineStyle($style, true)."\n";
+			}
+			switch ($mode) {
+				case 'ext': {
+					$off = (($this->LineWidth / 2) * $k);
+					$xL = $xeL - $off;
+					$xR = $xeR + $off;
+					$yT = $yeT + $off;
+					$yL = $yeL - $off;
+					$xT = $xL;
+					$xB = $xR;
+					$yR = $yT;
+					$yB = $yL;
+					$w += $this->LineWidth;
+					$h += $this->LineWidth;
+					break;
+				}
+				case 'int': {
+					$off = ($this->LineWidth / 2) * $k;
+					$xL = $xeL + $off;
+					$xR = $xeR - $off;
+					$yT = $yeT - $off;
+					$yL = $yeL + $off;
+					$xT = $xL;
+					$xB = $xR;
+					$yR = $yT;
+					$yB = $yL;
+					$w -= $this->LineWidth;
+					$h -= $this->LineWidth;
+					break;
+				}
+				case 'normal':
+				default: {
+					$xL = $xeL;
+					$xT = $xeT;
+					$xB = $xeB;
+					$xR = $xeR;
+					$yL = $yeL;
+					$yT = $yeT;
+					$yB = $yeB;
+					$yR = $yeR;
+					break;
+				}
+			}
+			// draw borders by case
+			if (strlen($border) == 4) {
+				$s .= sprintf('%F %F %F %F re S ', $xT, $yT, ($w * $k), (-$h * $k));
+			} elseif (strlen($border) == 3) {
+				if (strpos($border,'B') === false) { // LTR
+					$s .= sprintf('%F %F m ', $xL, $yL);
+					$s .= sprintf('%F %F l ', $xT, $yT);
+					$s .= sprintf('%F %F l ', $xR, $yR);
+					$s .= sprintf('%F %F l ', $xB, $yB);
+					$s .= 'S ';
+				} elseif (strpos($border,'L') === false) { // TRB
+					$s .= sprintf('%F %F m ', $xT, $yT);
+					$s .= sprintf('%F %F l ', $xR, $yR);
+					$s .= sprintf('%F %F l ', $xB, $yB);
+					$s .= sprintf('%F %F l ', $xL, $yL);
+					$s .= 'S ';
+				} elseif (strpos($border,'T') === false) { // RBL
+					$s .= sprintf('%F %F m ', $xR, $yR);
+					$s .= sprintf('%F %F l ', $xB, $yB);
+					$s .= sprintf('%F %F l ', $xL, $yL);
+					$s .= sprintf('%F %F l ', $xT, $yT);
+					$s .= 'S ';
+				} elseif (strpos($border,'R') === false) { // BLT
+					$s .= sprintf('%F %F m ', $xB, $yB);
+					$s .= sprintf('%F %F l ', $xL, $yL);
+					$s .= sprintf('%F %F l ', $xT, $yT);
+					$s .= sprintf('%F %F l ', $xR, $yR);
+					$s .= 'S ';
+				}
+			} elseif (strlen($border) == 2) {
+				if ((strpos($border,'L') !== false) AND (strpos($border,'T') !== false)) { // LT
+					$s .= sprintf('%F %F m ', $xL, $yL);
+					$s .= sprintf('%F %F l ', $xT, $yT);
+					$s .= sprintf('%F %F l ', $xR, $yR);
+					$s .= 'S ';
+				} elseif ((strpos($border,'T') !== false) AND (strpos($border,'R') !== false)) { // TR
+					$s .= sprintf('%F %F m ', $xT, $yT);
+					$s .= sprintf('%F %F l ', $xR, $yR);
+					$s .= sprintf('%F %F l ', $xB, $yB);
+					$s .= 'S ';
+				} elseif ((strpos($border,'R') !== false) AND (strpos($border,'B') !== false)) { // RB
+					$s .= sprintf('%F %F m ', $xR, $yR);
+					$s .= sprintf('%F %F l ', $xB, $yB);
+					$s .= sprintf('%F %F l ', $xL, $yL);
+					$s .= 'S ';
+				} elseif ((strpos($border,'B') !== false) AND (strpos($border,'L') !== false)) { // BL
+					$s .= sprintf('%F %F m ', $xB, $yB);
+					$s .= sprintf('%F %F l ', $xL, $yL);
+					$s .= sprintf('%F %F l ', $xT, $yT);
+					$s .= 'S ';
+				} elseif ((strpos($border,'L') !== false) AND (strpos($border,'R') !== false)) { // LR
+					$s .= sprintf('%F %F m ', $xL, $yL);
+					$s .= sprintf('%F %F l ', $xT, $yT);
+					$s .= 'S ';
+					$s .= sprintf('%F %F m ', $xR, $yR);
+					$s .= sprintf('%F %F l ', $xB, $yB);
+					$s .= 'S ';
+				} elseif ((strpos($border,'T') !== false) AND (strpos($border,'B') !== false)) { // TB
+					$s .= sprintf('%F %F m ', $xT, $yT);
+					$s .= sprintf('%F %F l ', $xR, $yR);
+					$s .= 'S ';
+					$s .= sprintf('%F %F m ', $xB, $yB);
+					$s .= sprintf('%F %F l ', $xL, $yL);
+					$s .= 'S ';
+				}
+			} else { // strlen($border) == 1
+				if (strpos($border,'L') !== false) { // L
+					$s .= sprintf('%F %F m ', $xL, $yL);
+					$s .= sprintf('%F %F l ', $xT, $yT);
+					$s .= 'S ';
+				} elseif (strpos($border,'T') !== false) { // T
+					$s .= sprintf('%F %F m ', $xT, $yT);
+					$s .= sprintf('%F %F l ', $xR, $yR);
+					$s .= 'S ';
+				} elseif (strpos($border,'R') !== false) { // R
+					$s .= sprintf('%F %F m ', $xR, $yR);
+					$s .= sprintf('%F %F l ', $xB, $yB);
+					$s .= 'S ';
+				} elseif (strpos($border,'B') !== false) { // B
+					$s .= sprintf('%F %F m ', $xB, $yB);
+					$s .= sprintf('%F %F l ', $xL, $yL);
+					$s .= 'S ';
+				}
+			}
+			if (is_array($style) AND !empty($style)) {
+				// reset border style to previous value
+				$s .= "\n".$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor."\n";
+			}
+		}
+		return $s;
+	}
+
+	/**
+	 * This method allows printing text with line breaks.
+	 * They can be automatic (as soon as the text reaches the right border of the cell) or explicit (via the \n character). As many cells as necessary are output, one below the other.<br />
+	 * Text can be aligned, centered or justified. The cell block can be framed and the background painted.
+	 * @param $w (float) Width of cells. If 0, they extend up to the right margin of the page.
+	 * @param $h (float) Cell minimum height. The cell extends automatically if needed.
+	 * @param $txt (string) String to print
+	 * @param $border (mixed) Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
+	 * @param $align (string) Allows to center or align the text. Possible values are:<ul><li>L or empty string: left align</li><li>C: center</li><li>R: right align</li><li>J: justification (default value when $ishtml=false)</li></ul>
+	 * @param $fill (boolean) Indicates if the cell background must be painted (true) or transparent (false).
+	 * @param $ln (int) Indicates where the current position should go after the call. Possible values are:<ul><li>0: to the right</li><li>1: to the beginning of the next line [DEFAULT]</li><li>2: below</li></ul>
+	 * @param $x (float) x position in user units
+	 * @param $y (float) y position in user units
+	 * @param $reseth (boolean) if true reset the last cell height (default true).
+	 * @param $stretch (int) font stretch mode: <ul><li>0 = disabled</li><li>1 = horizontal scaling only if text is larger than cell width</li><li>2 = forced horizontal scaling to fit cell width</li><li>3 = character spacing only if text is larger than cell width</li><li>4 = forced character spacing to fit cell width</li></ul> General font stretching and scaling values will be preserved when possible.
+	 * @param $ishtml (boolean) INTERNAL USE ONLY -- set to true if $txt is HTML content (default = false). Never set this parameter to true, use instead writeHTMLCell() or writeHTML() methods.
+	 * @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:<ul><li>T: TOP</li><li>M: middle</li><li>B: bottom</li></ul>. 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).
+	 * @return int Return the number of cells or 1 for html mode.
+	 * @public
+	 * @since 1.3
+	 * @see SetFont(), SetDrawColor(), SetFillColor(), SetTextColor(), SetLineWidth(), Cell(), Write(), SetAutoPageBreak()
+	 */
+	public function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false, $ln=1, $x='', $y='', $reseth=true, $stretch=0, $ishtml=false, $autopadding=true, $maxh=0, $valign='T', $fitcell=false) {
+		$prev_cell_margin = $this->cell_margin;
+		$prev_cell_padding = $this->cell_padding;
+		// adjust internal padding
+		$this->adjustCellPadding($border);
+		$mc_padding = $this->cell_padding;
+		$mc_margin = $this->cell_margin;
+		$this->cell_padding['T'] = 0;
+		$this->cell_padding['B'] = 0;
+		$this->setCellMargins(0, 0, 0, 0);
+		if (TCPDF_STATIC::empty_string($this->lasth) OR $reseth) {
+			// reset row height
+			$this->resetLastH();
+		}
+		if (!TCPDF_STATIC::empty_string($y)) {
+			$this->SetY($y);
+		} else {
+			$y = $this->GetY();
+		}
+		$resth = 0;
+		if (($h > 0) AND $this->inPageBody() AND (($y + $h + $mc_margin['T'] + $mc_margin['B']) > $this->PageBreakTrigger)) {
+			// spit cell in more pages/columns
+			$newh = ($this->PageBreakTrigger - $y);
+			$resth = ($h - $newh); // cell to be printed on the next page/column
+			$h = $newh;
+		}
+		// get current page number
+		$startpage = $this->page;
+		// get current column
+		$startcolumn = $this->current_column;
+		if (!TCPDF_STATIC::empty_string($x)) {
+			$this->SetX($x);
+		} else {
+			$x = $this->GetX();
+		}
+		// check page for no-write regions and adapt page margins if necessary
+		list($x, $y) = $this->checkPageRegions(0, $x, $y);
+		// apply margins
+		$oy = $y + $mc_margin['T'];
+		if ($this->rtl) {
+			$ox = ($this->w - $x - $mc_margin['R']);
+		} else {
+			$ox = ($x + $mc_margin['L']);
+		}
+		$this->x = $ox;
+		$this->y = $oy;
+		// set width
+		if (TCPDF_STATIC::empty_string($w) OR ($w <= 0)) {
+			if ($this->rtl) {
+				$w = ($this->x - $this->lMargin - $mc_margin['L']);
+			} else {
+				$w = ($this->w - $this->x - $this->rMargin - $mc_margin['R']);
+			}
+		}
+		// store original margin values
+		$lMargin = $this->lMargin;
+		$rMargin = $this->rMargin;
+		if ($this->rtl) {
+			$this->rMargin = ($this->w - $this->x);
+			$this->lMargin = ($this->x - $w);
+		} else {
+			$this->lMargin = ($this->x);
+			$this->rMargin = ($this->w - $this->x - $w);
+		}
+		$this->clMargin = $this->lMargin;
+		$this->crMargin = $this->rMargin;
+		if ($autopadding) {
+			// add top padding
+			$this->y += $mc_padding['T'];
+		}
+		if ($ishtml) { // ******* Write HTML text
+			$this->writeHTML($txt, true, false, $reseth, true, $align);
+			$nl = 1;
+		} else { // ******* Write simple text
+			$prev_FontSizePt = $this->FontSizePt;
+			// vertical alignment
+			if ($maxh > 0) {
+				// get text height
+				$text_height = $this->getStringHeight($w, $txt, $reseth, $autopadding, $mc_padding, $border);
+				if ($fitcell) {
+					// try to reduce font size to fit text on cell (use a quick search algorithm)
+					$fmin = 1;
+					$fmax = $this->FontSizePt;
+					$prev_text_height = $text_height;
+					$maxit = 100; // max number of iterations
+					while ($maxit > 0) {
+						$fmid = (($fmax + $fmin) / 2);
+						$this->SetFontSize($fmid, false);
+						$this->resetLastH();
+						$text_height = $this->getStringHeight($w, $txt, $reseth, $autopadding, $mc_padding, $border);
+						if (($text_height == $maxh) OR (($text_height < $maxh) AND ($fmin >= ($fmax - 0.01)))) {
+							break;
+						} elseif ($text_height < $maxh) {
+							$fmin = $fmid;
+						} else {
+							$fmax = $fmid;
+						}
+						--$maxit;
+					}
+					$this->SetFontSize($this->FontSizePt);
+				}
+				if ($text_height < $maxh) {
+					if ($valign == 'M') {
+						// text vertically centered
+						$this->y += (($maxh - $text_height) / 2);
+					} elseif ($valign == 'B') {
+						// text vertically aligned on bottom
+						$this->y += ($maxh - $text_height);
+					}
+				}
+			}
+			$nl = $this->Write($this->lasth, $txt, '', 0, $align, true, $stretch, false, true, $maxh, 0, $mc_margin);
+			if ($fitcell) {
+				// restore font size
+				$this->SetFontSize($prev_FontSizePt);
+			}
+		}
+		if ($autopadding) {
+			// add bottom padding
+			$this->y += $mc_padding['B'];
+		}
+		// Get end-of-text Y position
+		$currentY = $this->y;
+		// get latest page number
+		$endpage = $this->page;
+		if ($resth > 0) {
+			$skip = ($endpage - $startpage);
+			$tmpresth = $resth;
+			while ($tmpresth > 0) {
+				if ($skip <= 0) {
+					// add a page (or trig AcceptPageBreak() for multicolumn mode)
+					$this->checkPageBreak($this->PageBreakTrigger + 1);
+				}
+				if ($this->num_columns > 1) {
+					$tmpresth -= ($this->h - $this->y - $this->bMargin);
+				} else {
+					$tmpresth -= ($this->h - $this->tMargin - $this->bMargin);
+				}
+				--$skip;
+			}
+			$currentY = $this->y;
+			$endpage = $this->page;
+		}
+		// get latest column
+		$endcolumn = $this->current_column;
+		if ($this->num_columns == 0) {
+			$this->num_columns = 1;
+		}
+		// disable page regions check
+		$check_page_regions = $this->check_page_regions;
+		$this->check_page_regions = false;
+		// get border modes
+		$border_start = TCPDF_STATIC::getBorderMode($border, $position='start', $this->opencell);
+		$border_end = TCPDF_STATIC::getBorderMode($border, $position='end', $this->opencell);
+		$border_middle = TCPDF_STATIC::getBorderMode($border, $position='middle', $this->opencell);
+		// design borders around HTML cells.
+		for ($page = $startpage; $page <= $endpage; ++$page) { // for each page
+			$ccode = '';
+			$this->setPage($page);
+			if ($this->num_columns < 2) {
+				// single-column mode
+				$this->SetX($x);
+				$this->y = $this->tMargin;
+			}
+			// account for margin changes
+			if ($page > $startpage) {
+				if (($this->rtl) AND ($this->pagedim[$page]['orm'] != $this->pagedim[$startpage]['orm'])) {
+					$this->x -= ($this->pagedim[$page]['orm'] - $this->pagedim[$startpage]['orm']);
+				} elseif ((!$this->rtl) AND ($this->pagedim[$page]['olm'] != $this->pagedim[$startpage]['olm'])) {
+					$this->x += ($this->pagedim[$page]['olm'] - $this->pagedim[$startpage]['olm']);
+				}
+			}
+			if ($startpage == $endpage) {
+				// single page
+				for ($column = $startcolumn; $column <= $endcolumn; ++$column) { // for each column
+					$this->selectColumn($column);
+					if ($this->rtl) {
+						$this->x -= $mc_margin['R'];
+					} else {
+						$this->x += $mc_margin['L'];
+					}
+					if ($startcolumn == $endcolumn) { // single column
+						$cborder = $border;
+						$h = max($h, ($currentY - $oy));
+						$this->y = $oy;
+					} elseif ($column == $startcolumn) { // first column
+						$cborder = $border_start;
+						$this->y = $oy;
+						$h = $this->h - $this->y - $this->bMargin;
+					} elseif ($column == $endcolumn) { // end column
+						$cborder = $border_end;
+						$h = $currentY - $this->y;
+						if ($resth > $h) {
+							$h = $resth;
+						}
+					} else { // middle column
+						$cborder = $border_middle;
+						$h = $this->h - $this->y - $this->bMargin;
+						$resth -= $h;
+					}
+					$ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n";
+				} // end for each column
+			} elseif ($page == $startpage) { // first page
+				for ($column = $startcolumn; $column < $this->num_columns; ++$column) { // for each column
+					$this->selectColumn($column);
+					if ($this->rtl) {
+						$this->x -= $mc_margin['R'];
+					} else {
+						$this->x += $mc_margin['L'];
+					}
+					if ($column == $startcolumn) { // first column
+						$cborder = $border_start;
+						$this->y = $oy;
+						$h = $this->h - $this->y - $this->bMargin;
+					} else { // middle column
+						$cborder = $border_middle;
+						$h = $this->h - $this->y - $this->bMargin;
+						$resth -= $h;
+					}
+					$ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n";
+				} // end for each column
+			} elseif ($page == $endpage) { // last page
+				for ($column = 0; $column <= $endcolumn; ++$column) { // for each column
+					$this->selectColumn($column);
+					if ($this->rtl) {
+						$this->x -= $mc_margin['R'];
+					} else {
+						$this->x += $mc_margin['L'];
+					}
+					if ($column == $endcolumn) {
+						// end column
+						$cborder = $border_end;
+						$h = $currentY - $this->y;
+						if ($resth > $h) {
+							$h = $resth;
+						}
+					} else {
+						// middle column
+						$cborder = $border_middle;
+						$h = $this->h - $this->y - $this->bMargin;
+						$resth -= $h;
+					}
+					$ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n";
+				} // end for each column
+			} else { // middle page
+				for ($column = 0; $column < $this->num_columns; ++$column) { // for each column
+					$this->selectColumn($column);
+					if ($this->rtl) {
+						$this->x -= $mc_margin['R'];
+					} else {
+						$this->x += $mc_margin['L'];
+					}
+					$cborder = $border_middle;
+					$h = $this->h - $this->y - $this->bMargin;
+					$resth -= $h;
+					$ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n";
+				} // end for each column
+			}
+			if ($cborder OR $fill) {
+				$offsetlen = strlen($ccode);
+				// draw border and fill
+				if ($this->inxobj) {
+					// we are inside an XObject template
+					if (end($this->xobjects[$this->xobjid]['transfmrk']) !== false) {
+						$pagemarkkey = key($this->xobjects[$this->xobjid]['transfmrk']);
+						$pagemark = $this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey];
+						$this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey] += $offsetlen;
+					} else {
+						$pagemark = $this->xobjects[$this->xobjid]['intmrk'];
+						$this->xobjects[$this->xobjid]['intmrk'] += $offsetlen;
+					}
+					$pagebuff = $this->xobjects[$this->xobjid]['outdata'];
+					$pstart = substr($pagebuff, 0, $pagemark);
+					$pend = substr($pagebuff, $pagemark);
+					$this->xobjects[$this->xobjid]['outdata'] = $pstart.$ccode.$pend;
+				} else {
+					if (end($this->transfmrk[$this->page]) !== false) {
+						$pagemarkkey = key($this->transfmrk[$this->page]);
+						$pagemark = $this->transfmrk[$this->page][$pagemarkkey];
+						$this->transfmrk[$this->page][$pagemarkkey] += $offsetlen;
+					} elseif ($this->InFooter) {
+						$pagemark = $this->footerpos[$this->page];
+						$this->footerpos[$this->page] += $offsetlen;
+					} else {
+						$pagemark = $this->intmrk[$this->page];
+						$this->intmrk[$this->page] += $offsetlen;
+					}
+					$pagebuff = $this->getPageBuffer($this->page);
+					$pstart = substr($pagebuff, 0, $pagemark);
+					$pend = substr($pagebuff, $pagemark);
+					$this->setPageBuffer($this->page, $pstart.$ccode.$pend);
+				}
+			}
+		} // end for each page
+		// restore page regions check
+		$this->check_page_regions = $check_page_regions;
+		// Get end-of-cell Y position
+		$currentY = $this->GetY();
+		// restore previous values
+		if ($this->num_columns > 1) {
+			$this->selectColumn();
+		} else {
+			// restore original margins
+			$this->lMargin = $lMargin;
+			$this->rMargin = $rMargin;
+			if ($this->page > $startpage) {
+				// check for margin variations between pages (i.e. booklet mode)
+				$dl = ($this->pagedim[$this->page]['olm'] - $this->pagedim[$startpage]['olm']);
+				$dr = ($this->pagedim[$this->page]['orm'] - $this->pagedim[$startpage]['orm']);
+				if (($dl != 0) OR ($dr != 0)) {
+					$this->lMargin += $dl;
+					$this->rMargin += $dr;
+				}
+			}
+		}
+		if ($ln > 0) {
+			//Go to the beginning of the next line
+			$this->SetY($currentY + $mc_margin['B']);
+			if ($ln == 2) {
+				$this->SetX($x + $w + $mc_margin['L'] + $mc_margin['R']);
+			}
+		} else {
+			// go left or right by case
+			$this->setPage($startpage);
+			$this->y = $y;
+			$this->SetX($x + $w + $mc_margin['L'] + $mc_margin['R']);
+		}
+		$this->setContentMark();
+		$this->cell_padding = $prev_cell_padding;
+		$this->cell_margin = $prev_cell_margin;
+		$this->clMargin = $this->lMargin;
+		$this->crMargin = $this->rMargin;
+		return $nl;
+	}
+
+	/**
+	 * This method return the estimated number of lines for print a simple text string using Multicell() method.
+	 * @param $txt (string) String for calculating his height
+	 * @param $w (float) Width of cells. If 0, they extend up to the right margin of the page.
+	 * @param $reseth (boolean) if true reset the last cell height (default false).
+	 * @param $autopadding (boolean) if true, uses internal padding and automatically adjust it to account for line width (default true).
+	 * @param $cellpadding (float) Internal cell padding, if empty uses default cell padding.
+	 * @param $border (mixed) Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
+	 * @return float Return the minimal height needed for multicell method for printing the $txt param.
+	 * @author Alexander Escalona Fern�ndez, Nicola Asuni
+	 * @public
+	 * @since 4.5.011
+	 */
+	public function getNumLines($txt, $w=0, $reseth=false, $autopadding=true, $cellpadding='', $border=0) {
+		if ($txt === '') {
+			// empty string
+			return 1;
+		}
+		// adjust internal padding
+		$prev_cell_padding = $this->cell_padding;
+		$prev_lasth = $this->lasth;
+		if (is_array($cellpadding)) {
+			$this->cell_padding = $cellpadding;
+		}
+		$this->adjustCellPadding($border);
+		if (TCPDF_STATIC::empty_string($w) OR ($w <= 0)) {
+			if ($this->rtl) {
+				$w = $this->x - $this->lMargin;
+			} else {
+				$w = $this->w - $this->rMargin - $this->x;
+			}
+		}
+		$wmax = $w - $this->cell_padding['L'] - $this->cell_padding['R'];
+		if ($reseth) {
+			// reset row height
+			$this->resetLastH();
+		}
+		$lines = 1;
+		$sum = 0;
+		$chars = TCPDF_FONTS::utf8Bidi(TCPDF_FONTS::UTF8StringToArray($txt, $this->isunicode, $this->CurrentFont), $txt, $this->tmprtl, $this->isunicode, $this->CurrentFont);
+		$charsWidth = $this->GetArrStringWidth($chars, '', '', 0, true);
+		$length = count($chars);
+		$lastSeparator = -1;
+		for ($i = 0; $i < $length; ++$i) {
+			$charWidth = $charsWidth[$i];
+			if (preg_match($this->re_spaces, TCPDF_FONTS::unichr($chars[$i], $this->isunicode))) {
+				$lastSeparator = $i;
+			}
+			if ((($sum + $charWidth) > $wmax) OR ($chars[$i] == 10)) {
+				++$lines;
+				if ($chars[$i] == 10) {
+					$lastSeparator = -1;
+					$sum = 0;
+				} elseif ($lastSeparator != -1) {
+					$i = $lastSeparator;
+					$lastSeparator = -1;
+					$sum = 0;
+				} else {
+					$sum = $charWidth;
+				}
+			} else {
+				$sum += $charWidth;
+			}
+		}
+		if ($chars[($length - 1)] == 10) {
+			--$lines;
+		}
+		$this->cell_padding = $prev_cell_padding;
+		$this->lasth = $prev_lasth;
+		return $lines;
+	}
+
+	/**
+	 * This method return the estimated height needed for printing a simple text string using the Multicell() method.
+	 * Generally, if you want to know the exact height for a block of content you can use the following alternative technique:
+	 * @pre
+	 *  // store current object
+	 *  $pdf->startTransaction();
+	 *  // store starting values
+	 *  $start_y = $pdf->GetY();
+	 *  $start_page = $pdf->getPage();
+	 *  // call your printing functions with your parameters
+	 *  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+	 *  $pdf->MultiCell($w=0, $h=0, $txt, $border=1, $align='L', $fill=false, $ln=1, $x='', $y='', $reseth=true, $stretch=0, $ishtml=false, $autopadding=true, $maxh=0);
+	 *  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+	 *  // get the new Y
+	 *  $end_y = $pdf->GetY();
+	 *  $end_page = $pdf->getPage();
+	 *  // calculate height
+	 *  $height = 0;
+	 *  if ($end_page == $start_page) {
+	 *  	$height = $end_y - $start_y;
+	 *  } else {
+	 *  	for ($page=$start_page; $page <= $end_page; ++$page) {
+	 *  		$this->setPage($page);
+	 *  		if ($page == $start_page) {
+	 *  			// first page
+	 *  			$height = $this->h - $start_y - $this->bMargin;
+	 *  		} elseif ($page == $end_page) {
+	 *  			// last page
+	 *  			$height = $end_y - $this->tMargin;
+	 *  		} else {
+	 *  			$height = $this->h - $this->tMargin - $this->bMargin;
+	 *  		}
+	 *  	}
+	 *  }
+	 *  // restore previous object
+	 *  $pdf = $pdf->rollbackTransaction();
+	 *
+	 * @param $w (float) Width of cells. If 0, they extend up to the right margin of the page.
+	 * @param $txt (string) String for calculating his height
+	 * @param $reseth (boolean) if true reset the last cell height (default false).
+	 * @param $autopadding (boolean) if true, uses internal padding and automatically adjust it to account for line width (default true).
+	 * @param $cellpadding (float) Internal cell padding, if empty uses default cell padding.
+	 * @param $border (mixed) Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
+	 * @return float Return the minimal height needed for multicell method for printing the $txt param.
+	 * @author Nicola Asuni, Alexander Escalona Fern�ndez
+	 * @public
+	 */
+	public function getStringHeight($w, $txt, $reseth=false, $autopadding=true, $cellpadding='', $border=0) {
+		// adjust internal padding
+		$prev_cell_padding = $this->cell_padding;
+		$prev_lasth = $this->lasth;
+		if (is_array($cellpadding)) {
+			$this->cell_padding = $cellpadding;
+		}
+		$this->adjustCellPadding($border);
+		$lines = $this->getNumLines($txt, $w, $reseth, $autopadding, $cellpadding, $border);
+		$height = $lines * ($this->FontSize * $this->cell_height_ratio);
+		if ($autopadding) {
+			// add top and bottom padding
+			$height += ($this->cell_padding['T'] + $this->cell_padding['B']);
+		}
+		$this->cell_padding = $prev_cell_padding;
+		$this->lasth = $prev_lasth;
+		return $height;
+	}
+
+	/**
+	 * This method prints text from the current position.<br />
+	 * @param $h (float) Line height
+	 * @param $txt (string) String to print
+	 * @param $link (mixed) URL or identifier returned by AddLink()
+	 * @param $fill (boolean) Indicates if the cell background must be painted (true) or transparent (false).
+	 * @param $align (string) Allows to center or align the text. Possible values are:<ul><li>L or empty string: left align (default value)</li><li>C: center</li><li>R: right align</li><li>J: justify</li></ul>
+	 * @param $ln (boolean) if true set cursor at the bottom of the line, otherwise set cursor at the top of the line.
+	 * @param $stretch (int) font stretch mode: <ul><li>0 = disabled</li><li>1 = horizontal scaling only if text is larger than cell width</li><li>2 = forced horizontal scaling to fit cell width</li><li>3 = character spacing only if text is larger than cell width</li><li>4 = forced character spacing to fit cell width</li></ul> General font stretching and scaling values will be preserved when possible.
+	 * @param $firstline (boolean) if true prints only the first line and return the remaining string.
+	 * @param $firstblock (boolean) if true the string is the starting of a line.
+	 * @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.
+	 * @param $wadj (float) first line width will be reduced by this amount (used in HTML mode).
+	 * @param $margin (array) margin array of the parent container
+	 * @return mixed Return the number of cells or the remaining string if $firstline = true.
+	 * @public
+	 * @since 1.5
+	 */
+	public function Write($h, $txt, $link='', $fill=false, $align='', $ln=false, $stretch=0, $firstline=false, $firstblock=false, $maxh=0, $wadj=0, $margin='') {
+		// check page for no-write regions and adapt page margins if necessary
+		list($this->x, $this->y) = $this->checkPageRegions($h, $this->x, $this->y);
+		if (strlen($txt) == 0) {
+			// fix empty text
+			$txt = ' ';
+		}
+		if ($margin === '') {
+			// set default margins
+			$margin = $this->cell_margin;
+		}
+		// remove carriage returns
+		$s = str_replace("\r", '', $txt);
+		// check if string contains arabic text
+		if (preg_match(TCPDF_FONT_DATA::$uni_RE_PATTERN_ARABIC, $s)) {
+			$arabic = true;
+		} else {
+			$arabic = false;
+		}
+		// check if string contains RTL text
+		if ($arabic OR ($this->tmprtl == 'R') OR preg_match(TCPDF_FONT_DATA::$uni_RE_PATTERN_RTL, $s)) {
+			$rtlmode = true;
+		} else {
+			$rtlmode = false;
+		}
+		// get a char width
+		$chrwidth = $this->GetCharWidth(46); // dot character
+		// get array of unicode values
+		$chars = TCPDF_FONTS::UTF8StringToArray($s, $this->isunicode, $this->CurrentFont);
+		// calculate maximum width for a single character on string
+		$chrw = $this->GetArrStringWidth($chars, '', '', 0, true);
+		array_walk($chrw, array($this, 'getRawCharWidth'));
+		$maxchwidth = max($chrw);
+		// get array of chars
+		$uchars = TCPDF_FONTS::UTF8ArrayToUniArray($chars, $this->isunicode);
+		// get the number of characters
+		$nb = count($chars);
+		// replacement for SHY character (minus symbol)
+		$shy_replacement = 45;
+		$shy_replacement_char = TCPDF_FONTS::unichr($shy_replacement, $this->isunicode);
+		// widht for SHY replacement
+		$shy_replacement_width = $this->GetCharWidth($shy_replacement);
+		// max Y
+		$maxy = $this->y + $maxh - $h - $this->cell_padding['T'] - $this->cell_padding['B'];
+		// page width
+		$pw = $w = $this->w - $this->lMargin - $this->rMargin;
+		// calculate remaining line width ($w)
+		if ($this->rtl) {
+			$w = $this->x - $this->lMargin;
+		} else {
+			$w = $this->w - $this->rMargin - $this->x;
+		}
+		// max column width
+		$wmax = ($w - $wadj);
+		if (!$firstline) {
+			$wmax -= ($this->cell_padding['L'] + $this->cell_padding['R']);
+		}
+		if ((!$firstline) AND (($chrwidth > $wmax) OR ($maxchwidth > $wmax))) {
+			// the maximum width character do not fit on column
+			return '';
+		}
+		// minimum row height
+		$row_height = max($h, $this->FontSize * $this->cell_height_ratio);
+		$start_page = $this->page;
+		$i = 0; // character position
+		$j = 0; // current starting position
+		$sep = -1; // position of the last blank space
+		$shy = false; // true if the last blank is a soft hypen (SHY)
+		$l = 0; // current string length
+		$nl = 0; //number of lines
+		$linebreak = false;
+		$pc = 0; // previous character
+		// for each character
+		while ($i < $nb) {
+			if (($maxh > 0) AND ($this->y >= $maxy) ) {
+				break;
+			}
+			//Get the current character
+			$c = $chars[$i];
+			if ($c == 10) { // 10 = "\n" = new line
+				//Explicit line break
+				if ($align == 'J') {
+					if ($this->rtl) {
+						$talign = 'R';
+					} else {
+						$talign = 'L';
+					}
+				} else {
+					$talign = $align;
+				}
+				$tmpstr = TCPDF_FONTS::UniArrSubString($uchars, $j, $i);
+				if ($firstline) {
+					$startx = $this->x;
+					$tmparr = array_slice($chars, $j, ($i - $j));
+					if ($rtlmode) {
+						$tmparr = TCPDF_FONTS::utf8Bidi($tmparr, $tmpstr, $this->tmprtl, $this->isunicode, $this->CurrentFont);
+					}
+					$linew = $this->GetArrStringWidth($tmparr);
+					unset($tmparr);
+					if ($this->rtl) {
+						$this->endlinex = $startx - $linew;
+					} else {
+						$this->endlinex = $startx + $linew;
+					}
+					$w = $linew;
+					$tmpcellpadding = $this->cell_padding;
+					if ($maxh == 0) {
+						$this->SetCellPadding(0);
+					}
+				}
+				if ($firstblock AND $this->isRTLTextDir()) {
+					$tmpstr = $this->stringRightTrim($tmpstr);
+				}
+				// Skip newlines at the begining of a page or column
+				if (!empty($tmpstr) OR ($this->y < ($this->PageBreakTrigger - $row_height))) {
+					$this->Cell($w, $h, $tmpstr, 0, 1, $talign, $fill, $link, $stretch);
+				}
+				unset($tmpstr);
+				if ($firstline) {
+					$this->cell_padding = $tmpcellpadding;
+					return (TCPDF_FONTS::UniArrSubString($uchars, $i));
+				}
+				++$nl;
+				$j = $i + 1;
+				$l = 0;
+				$sep = -1;
+				$shy = false;
+				// account for margin changes
+				if ((($this->y + $this->lasth) > $this->PageBreakTrigger) AND ($this->inPageBody())) {
+					$this->AcceptPageBreak();
+					if ($this->rtl) {
+						$this->x -= $margin['R'];
+					} else {
+						$this->x += $margin['L'];
+					}
+					$this->lMargin += $margin['L'];
+					$this->rMargin += $margin['R'];
+				}
+				$w = $this->getRemainingWidth();
+				$wmax = ($w - $this->cell_padding['L'] - $this->cell_padding['R']);
+			} else {
+				// 160 is the non-breaking space.
+				// 173 is SHY (Soft Hypen).
+				// \p{Z} or \p{Separator}: any kind of Unicode whitespace or invisible separator.
+				// \p{Lo} or \p{Other_Letter}: a Unicode letter or ideograph that does not have lowercase and uppercase variants.
+				// \p{Lo} is needed because Chinese characters are packed next to each other without spaces in between.
+				if (($c != 160)
+					AND (($c == 173)
+						OR preg_match($this->re_spaces, TCPDF_FONTS::unichr($c, $this->isunicode))
+						OR (($c == 45)
+							AND ($i < ($nb - 1))
+							AND @preg_match('/[\p{L}]/'.$this->re_space['m'], TCPDF_FONTS::unichr($pc, $this->isunicode))
+							AND @preg_match('/[\p{L}]/'.$this->re_space['m'], TCPDF_FONTS::unichr($chars[($i + 1)], $this->isunicode))
+						)
+					)
+				) {
+					// update last blank space position
+					$sep = $i;
+					// check if is a SHY
+					if (($c == 173) OR ($c == 45)) {
+						$shy = true;
+						if ($pc == 45) {
+							$tmp_shy_replacement_width = 0;
+							$tmp_shy_replacement_char = '';
+						} else {
+							$tmp_shy_replacement_width = $shy_replacement_width;
+							$tmp_shy_replacement_char = $shy_replacement_char;
+						}
+					} else {
+						$shy = false;
+					}
+				}
+				// update string length
+				if ($this->isUnicodeFont() AND ($arabic)) {
+					// with bidirectional algorithm some chars may be changed affecting the line length
+					// *** very slow ***
+					$l = $this->GetArrStringWidth(TCPDF_FONTS::utf8Bidi(array_slice($chars, $j, ($i - $j)), '', $this->tmprtl, $this->isunicode, $this->CurrentFont));
+				} else {
+					$l += $this->GetCharWidth($c);
+				}
+				if (($l > $wmax) OR (($c == 173) AND (($l + $tmp_shy_replacement_width) > $wmax)) ) {
+					// we have reached the end of column
+					if ($sep == -1) {
+						// check if the line was already started
+						if (($this->rtl AND ($this->x <= ($this->w - $this->rMargin - $this->cell_padding['R'] - $margin['R'] - $chrwidth)))
+							OR ((!$this->rtl) AND ($this->x >= ($this->lMargin + $this->cell_padding['L'] + $margin['L'] + $chrwidth)))) {
+							// print a void cell and go to next line
+							$this->Cell($w, $h, '', 0, 1);
+							$linebreak = true;
+							if ($firstline) {
+								return (TCPDF_FONTS::UniArrSubString($uchars, $j));
+							}
+						} else {
+							// truncate the word because do not fit on column
+							$tmpstr = TCPDF_FONTS::UniArrSubString($uchars, $j, $i);
+							if ($firstline) {
+								$startx = $this->x;
+								$tmparr = array_slice($chars, $j, ($i - $j));
+								if ($rtlmode) {
+									$tmparr = TCPDF_FONTS::utf8Bidi($tmparr, $tmpstr, $this->tmprtl, $this->isunicode, $this->CurrentFont);
+								}
+								$linew = $this->GetArrStringWidth($tmparr);
+								unset($tmparr);
+								if ($this->rtl) {
+									$this->endlinex = $startx - $linew;
+								} else {
+									$this->endlinex = $startx + $linew;
+								}
+								$w = $linew;
+								$tmpcellpadding = $this->cell_padding;
+								if ($maxh == 0) {
+									$this->SetCellPadding(0);
+								}
+							}
+							if ($firstblock AND $this->isRTLTextDir()) {
+								$tmpstr = $this->stringRightTrim($tmpstr);
+							}
+							$this->Cell($w, $h, $tmpstr, 0, 1, $align, $fill, $link, $stretch);
+							unset($tmpstr);
+							if ($firstline) {
+								$this->cell_padding = $tmpcellpadding;
+								return (TCPDF_FONTS::UniArrSubString($uchars, $i));
+							}
+							$j = $i;
+							--$i;
+						}
+					} else {
+						// word wrapping
+						if ($this->rtl AND (!$firstblock) AND ($sep < $i)) {
+							$endspace = 1;
+						} else {
+							$endspace = 0;
+						}
+						// check the length of the next string
+						$strrest = TCPDF_FONTS::UniArrSubString($uchars, ($sep + $endspace));
+						$nextstr = TCPDF_STATIC::pregSplit('/'.$this->re_space['p'].'/', $this->re_space['m'], $this->stringTrim($strrest));
+						if (isset($nextstr[0]) AND ($this->GetStringWidth($nextstr[0]) > $pw)) {
+							// truncate the word because do not fit on a full page width
+							$tmpstr = TCPDF_FONTS::UniArrSubString($uchars, $j, $i);
+							if ($firstline) {
+								$startx = $this->x;
+								$tmparr = array_slice($chars, $j, ($i - $j));
+								if ($rtlmode) {
+									$tmparr = TCPDF_FONTS::utf8Bidi($tmparr, $tmpstr, $this->tmprtl, $this->isunicode, $this->CurrentFont);
+								}
+								$linew = $this->GetArrStringWidth($tmparr);
+								unset($tmparr);
+								if ($this->rtl) {
+									$this->endlinex = ($startx - $linew);
+								} else {
+									$this->endlinex = ($startx + $linew);
+								}
+								$w = $linew;
+								$tmpcellpadding = $this->cell_padding;
+								if ($maxh == 0) {
+									$this->SetCellPadding(0);
+								}
+							}
+							if ($firstblock AND $this->isRTLTextDir()) {
+								$tmpstr = $this->stringRightTrim($tmpstr);
+							}
+							$this->Cell($w, $h, $tmpstr, 0, 1, $align, $fill, $link, $stretch);
+							unset($tmpstr);
+							if ($firstline) {
+								$this->cell_padding = $tmpcellpadding;
+								return (TCPDF_FONTS::UniArrSubString($uchars, $i));
+							}
+							$j = $i;
+							--$i;
+						} else {
+							// word wrapping
+							if ($shy) {
+								// add hypen (minus symbol) at the end of the line
+								$shy_width = $tmp_shy_replacement_width;
+								if ($this->rtl) {
+									$shy_char_left = $tmp_shy_replacement_char;
+									$shy_char_right = '';
+								} else {
+									$shy_char_left = '';
+									$shy_char_right = $tmp_shy_replacement_char;
+								}
+							} else {
+								$shy_width = 0;
+								$shy_char_left = '';
+								$shy_char_right = '';
+							}
+							$tmpstr = TCPDF_FONTS::UniArrSubString($uchars, $j, ($sep + $endspace));
+							if ($firstline) {
+								$startx = $this->x;
+								$tmparr = array_slice($chars, $j, (($sep + $endspace) - $j));
+								if ($rtlmode) {
+									$tmparr = TCPDF_FONTS::utf8Bidi($tmparr, $tmpstr, $this->tmprtl, $this->isunicode, $this->CurrentFont);
+								}
+								$linew = $this->GetArrStringWidth($tmparr);
+								unset($tmparr);
+								if ($this->rtl) {
+									$this->endlinex = $startx - $linew - $shy_width;
+								} else {
+									$this->endlinex = $startx + $linew + $shy_width;
+								}
+								$w = $linew;
+								$tmpcellpadding = $this->cell_padding;
+								if ($maxh == 0) {
+									$this->SetCellPadding(0);
+								}
+							}
+							// print the line
+							if ($firstblock AND $this->isRTLTextDir()) {
+								$tmpstr = $this->stringRightTrim($tmpstr);
+							}
+							$this->Cell($w, $h, $shy_char_left.$tmpstr.$shy_char_right, 0, 1, $align, $fill, $link, $stretch);
+							unset($tmpstr);
+							if ($firstline) {
+								if ($chars[$sep] == 45) {
+									$endspace += 1;
+								}
+								// return the remaining text
+								$this->cell_padding = $tmpcellpadding;
+								return (TCPDF_FONTS::UniArrSubString($uchars, ($sep + $endspace)));
+							}
+							$i = $sep;
+							$sep = -1;
+							$shy = false;
+							$j = ($i + 1);
+						}
+					}
+					// account for margin changes
+					if ((($this->y + $this->lasth) > $this->PageBreakTrigger) AND ($this->inPageBody())) {
+						$this->AcceptPageBreak();
+						if ($this->rtl) {
+							$this->x -= $margin['R'];
+						} else {
+							$this->x += $margin['L'];
+						}
+						$this->lMargin += $margin['L'];
+						$this->rMargin += $margin['R'];
+					}
+					$w = $this->getRemainingWidth();
+					$wmax = $w - $this->cell_padding['L'] - $this->cell_padding['R'];
+					if ($linebreak) {
+						$linebreak = false;
+					} else {
+						++$nl;
+						$l = 0;
+					}
+				}
+			}
+			// save last character
+			$pc = $c;
+			++$i;
+		} // end while i < nb
+		// print last substring (if any)
+		if ($l > 0) {
+			switch ($align) {
+				case 'J':
+				case 'C': {
+					$w = $w;
+					break;
+				}
+				case 'L': {
+					if ($this->rtl) {
+						$w = $w;
+					} else {
+						$w = $l;
+					}
+					break;
+				}
+				case 'R': {
+					if ($this->rtl) {
+						$w = $l;
+					} else {
+						$w = $w;
+					}
+					break;
+				}
+				default: {
+					$w = $l;
+					break;
+				}
+			}
+			$tmpstr = TCPDF_FONTS::UniArrSubString($uchars, $j, $nb);
+			if ($firstline) {
+				$startx = $this->x;
+				$tmparr = array_slice($chars, $j, ($nb - $j));
+				if ($rtlmode) {
+					$tmparr = TCPDF_FONTS::utf8Bidi($tmparr, $tmpstr, $this->tmprtl, $this->isunicode, $this->CurrentFont);
+				}
+				$linew = $this->GetArrStringWidth($tmparr);
+				unset($tmparr);
+				if ($this->rtl) {
+					$this->endlinex = $startx - $linew;
+				} else {
+					$this->endlinex = $startx + $linew;
+				}
+				$w = $linew;
+				$tmpcellpadding = $this->cell_padding;
+				if ($maxh == 0) {
+					$this->SetCellPadding(0);
+				}
+			}
+			if ($firstblock AND $this->isRTLTextDir()) {
+				$tmpstr = $this->stringRightTrim($tmpstr);
+			}
+			$this->Cell($w, $h, $tmpstr, 0, $ln, $align, $fill, $link, $stretch);
+			unset($tmpstr);
+			if ($firstline) {
+				$this->cell_padding = $tmpcellpadding;
+				return (TCPDF_FONTS::UniArrSubString($uchars, $nb));
+			}
+			++$nl;
+		}
+		if ($firstline) {
+			return '';
+		}
+		return $nl;
+	}
+
+	/**
+	 * Returns the remaining width between the current position and margins.
+	 * @return int Return the remaining width
+	 * @protected
+	 */
+	protected function getRemainingWidth() {
+		list($this->x, $this->y) = $this->checkPageRegions(0, $this->x, $this->y);
+		if ($this->rtl) {
+			return ($this->x - $this->lMargin);
+		} else {
+			return ($this->w - $this->rMargin - $this->x);
+		}
+	}
+
+	/**
+	 * Set the block dimensions accounting for page breaks and page/column fitting
+	 * @param $w (float) width
+	 * @param $h (float) height
+	 * @param $x (float) X coordinate
+	 * @param $y (float) Y coodiante
+	 * @param $fitonpage (boolean) if true the block is resized to not exceed page dimensions.
+	 * @return array($w, $h, $x, $y)
+	 * @protected
+	 * @since 5.5.009 (2010-07-05)
+	 */
+	protected function fitBlock($w, $h, $x, $y, $fitonpage=false) {
+		if ($w <= 0) {
+			// set maximum width
+			$w = ($this->w - $this->lMargin - $this->rMargin);
+			if ($w <= 0) {
+				$w = 1;
+			}
+		}
+		if ($h <= 0) {
+			// set maximum height
+			$h = ($this->PageBreakTrigger - $this->tMargin);
+			if ($h <= 0) {
+				$h = 1;
+			}
+		}
+		// resize the block to be vertically contained on a single page or single column
+		if ($fitonpage OR $this->AutoPageBreak) {
+			$ratio_wh = ($w / $h);
+			if ($h > ($this->PageBreakTrigger - $this->tMargin)) {
+				$h = $this->PageBreakTrigger - $this->tMargin;
+				$w = ($h * $ratio_wh);
+			}
+			// resize the block to be horizontally contained on a single page or single column
+			if ($fitonpage) {
+				$maxw = ($this->w - $this->lMargin - $this->rMargin);
+				if ($w > $maxw) {
+					$w = $maxw;
+					$h = ($w / $ratio_wh);
+				}
+			}
+		}
+		// Check whether we need a new page or new column first as this does not fit
+		$prev_x = $this->x;
+		$prev_y = $this->y;
+		if ($this->checkPageBreak($h, $y) OR ($this->y < $prev_y)) {
+			$y = $this->y;
+			if ($this->rtl) {
+				$x += ($prev_x - $this->x);
+			} else {
+				$x += ($this->x - $prev_x);
+			}
+			$this->newline = true;
+		}
+		// resize the block to be contained on the remaining available page or column space
+		if ($fitonpage) {
+			$ratio_wh = ($w / $h);
+			if (($y + $h) > $this->PageBreakTrigger) {
+				$h = $this->PageBreakTrigger - $y;
+				$w = ($h * $ratio_wh);
+			}
+			if ((!$this->rtl) AND (($x + $w) > ($this->w - $this->rMargin))) {
+				$w = $this->w - $this->rMargin - $x;
+				$h = ($w / $ratio_wh);
+			} elseif (($this->rtl) AND (($x - $w) < ($this->lMargin))) {
+				$w = $x - $this->lMargin;
+				$h = ($w / $ratio_wh);
+			}
+		}
+		return array($w, $h, $x, $y);
+	}
+
+	/**
+	 * Puts an image in the page.
+	 * The upper-left corner must be given.
+	 * The dimensions can be specified in different ways:<ul>
+	 * <li>explicit width and height (expressed in user unit)</li>
+	 * <li>one explicit dimension, the other being calculated automatically in order to keep the original proportions</li>
+	 * <li>no explicit dimension, in which case the image is put at 72 dpi</li></ul>
+	 * Supported formats are JPEG and PNG images whitout GD library and all images supported by GD: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM;
+	 * The format can be specified explicitly or inferred from the file extension.<br />
+	 * It is possible to put a link on the image.<br />
+	 * Remark: if an image is used several times, only one copy will be embedded in the file.<br />
+	 * @param $file (string) Name of the file containing the image or a '@' character followed by the image data string. To link an image without embedding it on the document, set an asterisk character before the URL (i.e.: '*http://www.example.com/image.jpg').
+	 * @param $x (float) Abscissa of the upper-left corner (LTR) or upper-right corner (RTL).
+	 * @param $y (float) Ordinate of the upper-left corner (LTR) or upper-right corner (RTL).
+	 * @param $w (float) Width of the image in the page. If not specified or equal to zero, it is automatically calculated.
+	 * @param $h (float) Height of the image in the page. If not specified or equal to zero, it is automatically calculated.
+	 * @param $type (string) Image format. Possible values are (case insensitive): JPEG and PNG (whitout GD library) and all images supported by GD: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM;. If not specified, the type is inferred from the file extension.
+	 * @param $link (mixed) URL or identifier returned by AddLink().
+	 * @param $align (string) Indicates the alignment of the pointer next to image insertion relative to image height. The value can be:<ul><li>T: top-right for LTR or top-left for RTL</li><li>M: middle-right for LTR or middle-left for RTL</li><li>B: bottom-right for LTR or bottom-left for RTL</li><li>N: next line</li></ul>
+	 * @param $resize (mixed) If true resize (reduce) the image to fit $w and $h (requires GD or ImageMagick library); if false do not resize; if 2 force resize in all cases (upscaling and downscaling).
+	 * @param $dpi (int) dot-per-inch resolution used on resize
+	 * @param $palign (string) Allows to center or align the image on the current line. Possible values are:<ul><li>L : left align</li><li>C : center</li><li>R : right align</li><li>'' : empty string : left for LTR or right for RTL</li></ul>
+	 * @param $ismask (boolean) true if this image is a mask, false otherwise
+	 * @param $imgmask (mixed) image object returned by this function or false
+	 * @param $border (mixed) Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
+	 * @param $fitbox (mixed) If not false scale image dimensions proportionally to fit within the ($w, $h) box. $fitbox can be true or a 2 characters string indicating the image alignment inside the box. The first character indicate the horizontal alignment (L = left, C = center, R = right) the second character indicate the vertical algnment (T = top, M = middle, B = bottom).
+	 * @param $hidden (boolean) If true do not display the image.
+	 * @param $fitonpage (boolean) If true the image is resized to not exceed page dimensions.
+	 * @param $alt (boolean) If true the image will be added as alternative and not directly printed (the ID of the image will be returned).
+	 * @param $altimgs (array) Array of alternate images IDs. Each alternative image must be an array with two values: an integer representing the image ID (the value returned by the Image method) and a boolean value to indicate if the image is the default for printing.
+	 * @return image information
+	 * @public
+	 * @since 1.1
+	 */
+	public function Image($file, $x='', $y='', $w=0, $h=0, $type='', $link='', $align='', $resize=false, $dpi=300, $palign='', $ismask=false, $imgmask=false, $border=0, $fitbox=false, $hidden=false, $fitonpage=false, $alt=false, $altimgs=array()) {
+		if ($this->state != 2) {
+			return;
+		}
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		// check page for no-write regions and adapt page margins if necessary
+		list($x, $y) = $this->checkPageRegions($h, $x, $y);
+		$exurl = ''; // external streams
+		$imsize = FALSE;
+		// check if we are passing an image as file or string
+		if ($file[0] === '@') {
+			// image from string
+			$imgdata = substr($file, 1);
+		} else { // image file
+			if ($file{0} === '*') {
+				// image as external stream
+				$file = substr($file, 1);
+				$exurl = $file;
+			}
+			// check if is local file
+			if (!@file_exists($file)) {
+				// encode spaces on filename (file is probably an URL)
+				$file = str_replace(' ', '%20', $file);
+			}
+			if (@file_exists($file)) {
+				// get image dimensions
+				$imsize = @getimagesize($file);
+			}
+			if ($imsize === FALSE) {
+				$imgdata = TCPDF_STATIC::fileGetContents($file);
+			}
+		}
+		if (isset($imgdata) AND ($imgdata !== FALSE)) {
+			// copy image to cache
+			$file = TCPDF_STATIC::getObjFilename('img');
+			$fp = fopen($file, 'w');
+			fwrite($fp, $imgdata);
+			fclose($fp);
+			unset($imgdata);
+			$imsize = @getimagesize($file);
+			if ($imsize === FALSE) {
+				unlink($file);
+			} else {
+				$this->cached_files[] = $file;
+			}
+		}
+		if ($imsize === FALSE) {
+			if (($w > 0) AND ($h > 0)) {
+				// get measures from specified data
+				$pw = $this->getHTMLUnitToUnits($w, 0, $this->pdfunit, true) * $this->imgscale * $this->k;
+				$ph = $this->getHTMLUnitToUnits($h, 0, $this->pdfunit, true) * $this->imgscale * $this->k;
+				$imsize = array($pw, $ph);
+			} else {
+				$this->Error('[Image] Unable to get image: '.$file);
+			}
+		}
+		// file hash
+		$filehash = md5($this->file_id.$file);
+		// get original image width and height in pixels
+		list($pixw, $pixh) = $imsize;
+		// calculate image width and height on document
+		if (($w <= 0) AND ($h <= 0)) {
+			// convert image size to document unit
+			$w = $this->pixelsToUnits($pixw);
+			$h = $this->pixelsToUnits($pixh);
+		} elseif ($w <= 0) {
+			$w = $h * $pixw / $pixh;
+		} elseif ($h <= 0) {
+			$h = $w * $pixh / $pixw;
+		} elseif (($fitbox !== false) AND ($w > 0) AND ($h > 0)) {
+			if (strlen($fitbox) !== 2) {
+				// set default alignment
+				$fitbox = '--';
+			}
+			// scale image dimensions proportionally to fit within the ($w, $h) box
+			if ((($w * $pixh) / ($h * $pixw)) < 1) {
+				// store current height
+				$oldh = $h;
+				// calculate new height
+				$h = $w * $pixh / $pixw;
+				// height difference
+				$hdiff = ($oldh - $h);
+				// vertical alignment
+				switch (strtoupper($fitbox{1})) {
+					case 'T': {
+						break;
+					}
+					case 'M': {
+						$y += ($hdiff / 2);
+						break;
+					}
+					case 'B': {
+						$y += $hdiff;
+						break;
+					}
+				}
+			} else {
+				// store current width
+				$oldw = $w;
+				// calculate new width
+				$w = $h * $pixw / $pixh;
+				// width difference
+				$wdiff = ($oldw - $w);
+				// horizontal alignment
+				switch (strtoupper($fitbox{0})) {
+					case 'L': {
+						if ($this->rtl) {
+							$x -= $wdiff;
+						}
+						break;
+					}
+					case 'C': {
+						if ($this->rtl) {
+							$x -= ($wdiff / 2);
+						} else {
+							$x += ($wdiff / 2);
+						}
+						break;
+					}
+					case 'R': {
+						if (!$this->rtl) {
+							$x += $wdiff;
+						}
+						break;
+					}
+				}
+			}
+		}
+		// fit the image on available space
+		list($w, $h, $x, $y) = $this->fitBlock($w, $h, $x, $y, $fitonpage);
+		// calculate new minimum dimensions in pixels
+		$neww = round($w * $this->k * $dpi / $this->dpi);
+		$newh = round($h * $this->k * $dpi / $this->dpi);
+		// check if resize is necessary (resize is used only to reduce the image)
+		$newsize = ($neww * $newh);
+		$pixsize = ($pixw * $pixh);
+		if (intval($resize) == 2) {
+			$resize = true;
+		} elseif ($newsize >= $pixsize) {
+			$resize = false;
+		}
+		// check if image has been already added on document
+		$newimage = true;
+		if (in_array($file, $this->imagekeys)) {
+			$newimage = false;
+			// get existing image data
+			$info = $this->getImageBuffer($file);
+			if (substr($file, 0, -34) != K_PATH_CACHE.'msk') {
+				// check if the newer image is larger
+				$oldsize = ($info['w'] * $info['h']);
+				if ((($oldsize < $newsize) AND ($resize)) OR (($oldsize < $pixsize) AND (!$resize))) {
+					$newimage = true;
+				}
+			}
+		} elseif (substr($file, 0, -34) != K_PATH_CACHE.'msk') {
+			// check for cached images with alpha channel
+			$tempfile_plain = K_PATH_CACHE.'mskp_'.$filehash;
+			$tempfile_alpha = K_PATH_CACHE.'mska_'.$filehash;
+			if (in_array($tempfile_plain, $this->imagekeys)) {
+				// get existing image data
+				$info = $this->getImageBuffer($tempfile_plain);
+				// check if the newer image is larger
+				$oldsize = ($info['w'] * $info['h']);
+				if ((($oldsize < $newsize) AND ($resize)) OR (($oldsize < $pixsize) AND (!$resize))) {
+					$newimage = true;
+				} else {
+					$newimage = false;
+					// embed mask image
+					$imgmask = $this->Image($tempfile_alpha, $x, $y, $w, $h, 'PNG', '', '', $resize, $dpi, '', true, false);
+					// embed image, masked with previously embedded mask
+					return $this->Image($tempfile_plain, $x, $y, $w, $h, $type, $link, $align, $resize, $dpi, $palign, false, $imgmask);
+				}
+			}
+		}
+		if ($newimage) {
+			//First use of image, get info
+			$type = strtolower($type);
+			if ($type == '') {
+				$type = TCPDF_IMAGES::getImageFileType($file, $imsize);
+			} elseif ($type == 'jpg') {
+				$type = 'jpeg';
+			}
+			$mqr = TCPDF_STATIC::get_mqr();
+			TCPDF_STATIC::set_mqr(false);
+			// Specific image handlers (defined on TCPDF_IMAGES CLASS)
+			$mtd = '_parse'.$type;
+			// GD image handler function
+			$gdfunction = 'imagecreatefrom'.$type;
+			$info = false;
+			if ((method_exists('TCPDF_IMAGES', $mtd)) AND (!($resize AND (function_exists($gdfunction) OR extension_loaded('imagick'))))) {
+				// TCPDF image functions
+				$info = TCPDF_IMAGES::$mtd($file);
+				if (($info === 'pngalpha') OR (isset($info['trns']) AND !empty($info['trns']))) {
+					return $this->ImagePngAlpha($file, $x, $y, $pixw, $pixh, $w, $h, 'PNG', $link, $align, $resize, $dpi, $palign, $filehash);
+				}
+			}
+			if (($info === false) AND function_exists($gdfunction)) {
+				try {
+					// GD library
+					$img = $gdfunction($file);
+					if ($resize) {
+						$imgr = imagecreatetruecolor($neww, $newh);
+						if (($type == 'gif') OR ($type == 'png')) {
+							$imgr = TCPDF_IMAGES::setGDImageTransparency($imgr, $img);
+						}
+						imagecopyresampled($imgr, $img, 0, 0, 0, 0, $neww, $newh, $pixw, $pixh);
+						if (($type == 'gif') OR ($type == 'png')) {
+							$info = TCPDF_IMAGES::_toPNG($imgr);
+						} else {
+							$info = TCPDF_IMAGES::_toJPEG($imgr, $this->jpeg_quality);
+						}
+					} else {
+						if (($type == 'gif') OR ($type == 'png')) {
+							$info = TCPDF_IMAGES::_toPNG($img);
+						} else {
+							$info = TCPDF_IMAGES::_toJPEG($img, $this->jpeg_quality);
+						}
+					}
+				} catch(Exception $e) {
+					$info = false;
+				}
+			}
+			if (($info === false) AND extension_loaded('imagick')) {
+				try {
+					// ImageMagick library
+					$img = new Imagick();
+					if ($type == 'SVG') {
+						// get SVG file content
+						$svgimg = TCPDF_STATIC::fileGetContents($file);
+						if ($svgimg !== FALSE) {
+							// get width and height
+							$regs = array();
+							if (preg_match('/<svg([^\>]*)>/si', $svgimg, $regs)) {
+								$svgtag = $regs[1];
+								$tmp = array();
+								if (preg_match('/[\s]+width[\s]*=[\s]*"([^"]*)"/si', $svgtag, $tmp)) {
+									$ow = $this->getHTMLUnitToUnits($tmp[1], 1, $this->svgunit, false);
+									$owu = sprintf('%F', ($ow * $dpi / 72)).$this->pdfunit;
+									$svgtag = preg_replace('/[\s]+width[\s]*=[\s]*"[^"]*"/si', ' width="'.$owu.'"', $svgtag, 1);
+								} else {
+									$ow = $w;
+								}
+								$tmp = array();
+								if (preg_match('/[\s]+height[\s]*=[\s]*"([^"]*)"/si', $svgtag, $tmp)) {
+									$oh = $this->getHTMLUnitToUnits($tmp[1], 1, $this->svgunit, false);
+									$ohu = sprintf('%F', ($oh * $dpi / 72)).$this->pdfunit;
+									$svgtag = preg_replace('/[\s]+height[\s]*=[\s]*"[^"]*"/si', ' height="'.$ohu.'"', $svgtag, 1);
+								} else {
+									$oh = $h;
+								}
+								$tmp = array();
+								if (!preg_match('/[\s]+viewBox[\s]*=[\s]*"[\s]*([0-9\.]+)[\s]+([0-9\.]+)[\s]+([0-9\.]+)[\s]+([0-9\.]+)[\s]*"/si', $svgtag, $tmp)) {
+									$vbw = ($ow * $this->imgscale * $this->k);
+									$vbh = ($oh * $this->imgscale * $this->k);
+									$vbox = sprintf(' viewBox="0 0 %F %F" ', $vbw, $vbh);
+									$svgtag = $vbox.$svgtag;
+								}
+								$svgimg = preg_replace('/<svg([^\>]*)>/si', '<svg'.$svgtag.'>', $svgimg, 1);
+							}
+							$img->readImageBlob($svgimg);
+						}
+					} else {
+						$img->readImage($file);
+					}
+					if ($resize) {
+						$img->resizeImage($neww, $newh, 10, 1, false);
+					}
+					$img->setCompressionQuality($this->jpeg_quality);
+					$img->setImageFormat('jpeg');
+					$tempname = TCPDF_STATIC::getObjFilename('jpg');
+					$img->writeImage($tempname);
+					$info = TCPDF_IMAGES::_parsejpeg($tempname);
+					unlink($tempname);
+					$img->destroy();
+				} catch(Exception $e) {
+					$info = false;
+				}
+			}
+			if ($info === false) {
+				// unable to process image
+				return;
+			}
+			TCPDF_STATIC::set_mqr($mqr);
+			if ($ismask) {
+				// force grayscale
+				$info['cs'] = 'DeviceGray';
+			}
+			if ($imgmask !== false) {
+				$info['masked'] = $imgmask;
+			}
+			if (!empty($exurl)) {
+				$info['exurl'] = $exurl;
+			}
+			// array of alternative images
+			$info['altimgs'] = $altimgs;
+			// add image to document
+			$info['i'] = $this->setImageBuffer($file, $info);
+		}
+		// set alignment
+		$this->img_rb_y = $y + $h;
+		// set alignment
+		if ($this->rtl) {
+			if ($palign == 'L') {
+				$ximg = $this->lMargin;
+			} elseif ($palign == 'C') {
+				$ximg = ($this->w + $this->lMargin - $this->rMargin - $w) / 2;
+			} elseif ($palign == 'R') {
+				$ximg = $this->w - $this->rMargin - $w;
+			} else {
+				$ximg = $x - $w;
+			}
+			$this->img_rb_x = $ximg;
+		} else {
+			if ($palign == 'L') {
+				$ximg = $this->lMargin;
+			} elseif ($palign == 'C') {
+				$ximg = ($this->w + $this->lMargin - $this->rMargin - $w) / 2;
+			} elseif ($palign == 'R') {
+				$ximg = $this->w - $this->rMargin - $w;
+			} else {
+				$ximg = $x;
+			}
+			$this->img_rb_x = $ximg + $w;
+		}
+		if ($ismask OR $hidden) {
+			// image is not displayed
+			return $info['i'];
+		}
+		$xkimg = $ximg * $this->k;
+		if (!$alt) {
+			// only non-alternative immages will be set
+			$this->_out(sprintf('q %F 0 0 %F %F %F cm /I%u Do Q', ($w * $this->k), ($h * $this->k), $xkimg, (($this->h - ($y + $h)) * $this->k), $info['i']));
+		}
+		if (!empty($border)) {
+			$bx = $this->x;
+			$by = $this->y;
+			$this->x = $ximg;
+			if ($this->rtl) {
+				$this->x += $w;
+			}
+			$this->y = $y;
+			$this->Cell($w, $h, '', $border, 0, '', 0, '', 0, true);
+			$this->x = $bx;
+			$this->y = $by;
+		}
+		if ($link) {
+			$this->Link($ximg, $y, $w, $h, $link, 0);
+		}
+		// set pointer to align the next text/objects
+		switch($align) {
+			case 'T': {
+				$this->y = $y;
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'M': {
+				$this->y = $y + round($h/2);
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'B': {
+				$this->y = $this->img_rb_y;
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'N': {
+				$this->SetY($this->img_rb_y);
+				break;
+			}
+			default:{
+				break;
+			}
+		}
+		$this->endlinex = $this->img_rb_x;
+		if ($this->inxobj) {
+			// we are inside an XObject template
+			$this->xobjects[$this->xobjid]['images'][] = $info['i'];
+		}
+		return $info['i'];
+	}
+
+	/**
+	 * Extract info from a PNG image with alpha channel using the Imagick or GD library.
+	 * @param $file (string) Name of the file containing the image.
+	 * @param $x (float) Abscissa of the upper-left corner.
+	 * @param $y (float) Ordinate of the upper-left corner.
+	 * @param $wpx (float) Original width of the image in pixels.
+	 * @param $hpx (float) original height of the image in pixels.
+	 * @param $w (float) Width of the image in the page. If not specified or equal to zero, it is automatically calculated.
+	 * @param $h (float) Height of the image in the page. If not specified or equal to zero, it is automatically calculated.
+	 * @param $type (string) Image format. Possible values are (case insensitive): JPEG and PNG (whitout GD library) and all images supported by GD: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM;. If not specified, the type is inferred from the file extension.
+	 * @param $link (mixed) URL or identifier returned by AddLink().
+	 * @param $align (string) Indicates the alignment of the pointer next to image insertion relative to image height. The value can be:<ul><li>T: top-right for LTR or top-left for RTL</li><li>M: middle-right for LTR or middle-left for RTL</li><li>B: bottom-right for LTR or bottom-left for RTL</li><li>N: next line</li></ul>
+	 * @param $resize (boolean) If true resize (reduce) the image to fit $w and $h (requires GD library).
+	 * @param $dpi (int) dot-per-inch resolution used on resize
+	 * @param $palign (string) Allows to center or align the image on the current line. Possible values are:<ul><li>L : left align</li><li>C : center</li><li>R : right align</li><li>'' : empty string : left for LTR or right for RTL</li></ul>
+	 * @param $filehash (string) File hash used to build unique file names.
+	 * @author Nicola Asuni
+	 * @protected
+	 * @since 4.3.007 (2008-12-04)
+	 * @see Image()
+	 */
+	protected function ImagePngAlpha($file, $x, $y, $wpx, $hpx, $w, $h, $type, $link, $align, $resize, $dpi, $palign, $filehash='') {
+		if (empty($filehash)) {
+			$filehash = md5($this->file_id.$file);
+		}
+		// create temp image file (without alpha channel)
+		$tempfile_plain = K_PATH_CACHE.'mskp_'.$filehash;
+		// create temp alpha file
+		$tempfile_alpha = K_PATH_CACHE.'mska_'.$filehash;
+		$parsed = false;
+		$parse_error = '';
+		// ImageMagick extension
+		if (($parsed === false) AND extension_loaded('imagick')) {
+			try {
+				// ImageMagick library
+				$img = new Imagick();
+				$img->readImage($file);
+				// clone image object
+				$imga = TCPDF_STATIC::objclone($img);
+				// extract alpha channel
+				if (method_exists($img, 'setImageAlphaChannel') AND defined('Imagick::ALPHACHANNEL_EXTRACT')) {
+					$img->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT);
+				} else {
+					$img->separateImageChannel(8); // 8 = (imagick::CHANNEL_ALPHA | imagick::CHANNEL_OPACITY | imagick::CHANNEL_MATTE);
+					$img->negateImage(true);
+				}
+				$img->setImageFormat('png');
+				$img->writeImage($tempfile_alpha);
+				// remove alpha channel
+				if (method_exists($imga, 'setImageMatte')) {
+					$imga->setImageMatte(false);
+				} else {
+					$imga->separateImageChannel(39); // 39 = (imagick::CHANNEL_ALL & ~(imagick::CHANNEL_ALPHA | imagick::CHANNEL_OPACITY | imagick::CHANNEL_MATTE));
+				}
+				$imga->setImageFormat('png');
+				$imga->writeImage($tempfile_plain);
+				$parsed = true;
+			} catch (Exception $e) {
+				// Imagemagick fails, try with GD
+				$parse_error = 'Imagick library error: '.$e->getMessage();
+			}
+		}
+		// GD extension
+		if (($parsed === false) AND function_exists('imagecreatefrompng')) {
+			try {
+				// generate images
+				$img = imagecreatefrompng($file);
+				$imgalpha = imagecreate($wpx, $hpx);
+				// generate gray scale palette (0 -> 255)
+				for ($c = 0; $c < 256; ++$c) {
+					ImageColorAllocate($imgalpha, $c, $c, $c);
+				}
+				// extract alpha channel
+				for ($xpx = 0; $xpx < $wpx; ++$xpx) {
+					for ($ypx = 0; $ypx < $hpx; ++$ypx) {
+						$color = imagecolorat($img, $xpx, $ypx);
+						// get and correct gamma color
+						$alpha = $this->getGDgamma($img, $color);
+						imagesetpixel($imgalpha, $xpx, $ypx, $alpha);
+					}
+				}
+				imagepng($imgalpha, $tempfile_alpha);
+				imagedestroy($imgalpha);
+				// extract image without alpha channel
+				$imgplain = imagecreatetruecolor($wpx, $hpx);
+				imagecopy($imgplain, $img, 0, 0, 0, 0, $wpx, $hpx);
+				imagepng($imgplain, $tempfile_plain);
+				imagedestroy($imgplain);
+				$parsed = true;
+			} catch (Exception $e) {
+				// GD fails
+				$parse_error = 'GD library error: '.$e->getMessage();
+			}
+		}
+		if ($parsed === false) {
+			if (empty($parse_error)) {
+				$this->Error('TCPDF requires the Imagick or GD extension to handle PNG images with alpha channel.');
+			} else {
+				$this->Error($parse_error);
+			}
+		}
+		// embed mask image
+		$imgmask = $this->Image($tempfile_alpha, $x, $y, $w, $h, 'PNG', '', '', $resize, $dpi, '', true, false);
+		// embed image, masked with previously embedded mask
+		$this->Image($tempfile_plain, $x, $y, $w, $h, $type, $link, $align, $resize, $dpi, $palign, false, $imgmask);
+		// remove temp files
+		unlink($tempfile_alpha);
+		unlink($tempfile_plain);
+	}
+
+	/**
+	 * Get the GD-corrected PNG gamma value from alpha color
+	 * @param $img (int) GD image Resource ID.
+	 * @param $c (int) alpha color
+	 * @protected
+	 * @since 4.3.007 (2008-12-04)
+	 */
+	protected function getGDgamma($img, $c) {
+		if (!isset($this->gdgammacache['#'.$c])) {
+			$colors = imagecolorsforindex($img, $c);
+			// GD alpha is only 7 bit (0 -> 127)
+			$this->gdgammacache['#'.$c] = (((127 - $colors['alpha']) / 127) * 255);
+			// correct gamma
+			$this->gdgammacache['#'.$c] = (pow(($this->gdgammacache['#'.$c] / 255), 2.2) * 255);
+			// store the latest values on cache to improve performances
+			if (count($this->gdgammacache) > 8) {
+				// remove one element from the cache array
+				array_shift($this->gdgammacache);
+			}
+		}
+		return $this->gdgammacache['#'.$c];
+	}
+
+	/**
+	 * Performs a line break.
+	 * The current abscissa goes back to the left margin and the ordinate increases by the amount passed in parameter.
+	 * @param $h (float) The height of the break. By default, the value equals the height of the last printed cell.
+	 * @param $cell (boolean) if true add the current left (or right o for RTL) padding to the X coordinate
+	 * @public
+	 * @since 1.0
+	 * @see Cell()
+	 */
+	public function Ln($h='', $cell=false) {
+		if (($this->num_columns > 1) AND ($this->y == $this->columns[$this->current_column]['y']) AND isset($this->columns[$this->current_column]['x']) AND ($this->x == $this->columns[$this->current_column]['x'])) {
+			// revove vertical space from the top of the column
+			return;
+		}
+		if ($cell) {
+			if ($this->rtl) {
+				$cellpadding = $this->cell_padding['R'];
+			} else {
+				$cellpadding = $this->cell_padding['L'];
+			}
+		} else {
+			$cellpadding = 0;
+		}
+		if ($this->rtl) {
+			$this->x = $this->w - $this->rMargin - $cellpadding;
+		} else {
+			$this->x = $this->lMargin + $cellpadding;
+		}
+		if (is_string($h)) {
+			$this->y += $this->lasth;
+		} else {
+			$this->y += $h;
+		}
+		$this->newline = true;
+	}
+
+	/**
+	 * Returns the relative X value of current position.
+	 * The value is relative to the left border for LTR languages and to the right border for RTL languages.
+	 * @return float
+	 * @public
+	 * @since 1.2
+	 * @see SetX(), GetY(), SetY()
+	 */
+	public function GetX() {
+		//Get x position
+		if ($this->rtl) {
+			return ($this->w - $this->x);
+		} else {
+			return $this->x;
+		}
+	}
+
+	/**
+	 * Returns the absolute X value of current position.
+	 * @return float
+	 * @public
+	 * @since 1.2
+	 * @see SetX(), GetY(), SetY()
+	 */
+	public function GetAbsX() {
+		return $this->x;
+	}
+
+	/**
+	 * Returns the ordinate of the current position.
+	 * @return float
+	 * @public
+	 * @since 1.0
+	 * @see SetY(), GetX(), SetX()
+	 */
+	public function GetY() {
+		return $this->y;
+	}
+
+	/**
+	 * Defines the abscissa of the current position.
+	 * If the passed value is negative, it is relative to the right of the page (or left if language is RTL).
+	 * @param $x (float) The value of the abscissa in user units.
+	 * @param $rtloff (boolean) if true always uses the page top-left corner as origin of axis.
+	 * @public
+	 * @since 1.2
+	 * @see GetX(), GetY(), SetY(), SetXY()
+	 */
+	public function SetX($x, $rtloff=false) {
+		$x = floatval($x);
+		if (!$rtloff AND $this->rtl) {
+			if ($x >= 0) {
+				$this->x = $this->w - $x;
+			} else {
+				$this->x = abs($x);
+			}
+		} else {
+			if ($x >= 0) {
+				$this->x = $x;
+			} else {
+				$this->x = $this->w + $x;
+			}
+		}
+		if ($this->x < 0) {
+			$this->x = 0;
+		}
+		if ($this->x > $this->w) {
+			$this->x = $this->w;
+		}
+	}
+
+	/**
+	 * Moves the current abscissa back to the left margin and sets the ordinate.
+	 * If the passed value is negative, it is relative to the bottom of the page.
+	 * @param $y (float) The value of the ordinate in user units.
+	 * @param $resetx (bool) if true (default) reset the X position.
+	 * @param $rtloff (boolean) if true always uses the page top-left corner as origin of axis.
+	 * @public
+	 * @since 1.0
+	 * @see GetX(), GetY(), SetY(), SetXY()
+	 */
+	public function SetY($y, $resetx=true, $rtloff=false) {
+		$y = floatval($y);
+		if ($resetx) {
+			//reset x
+			if (!$rtloff AND $this->rtl) {
+				$this->x = $this->w - $this->rMargin;
+			} else {
+				$this->x = $this->lMargin;
+			}
+		}
+		if ($y >= 0) {
+			$this->y = $y;
+		} else {
+			$this->y = $this->h + $y;
+		}
+		if ($this->y < 0) {
+			$this->y = 0;
+		}
+		if ($this->y > $this->h) {
+			$this->y = $this->h;
+		}
+	}
+
+	/**
+	 * Defines the abscissa and ordinate of the current position.
+	 * If the passed values are negative, they are relative respectively to the right and bottom of the page.
+	 * @param $x (float) The value of the abscissa.
+	 * @param $y (float) The value of the ordinate.
+	 * @param $rtloff (boolean) if true always uses the page top-left corner as origin of axis.
+	 * @public
+	 * @since 1.2
+	 * @see SetX(), SetY()
+	 */
+	public function SetXY($x, $y, $rtloff=false) {
+		$this->SetY($y, false, $rtloff);
+		$this->SetX($x, $rtloff);
+	}
+
+	/**
+	 * Set the absolute X coordinate of the current pointer.
+	 * @param $x (float) The value of the abscissa in user units.
+	 * @public
+	 * @since 5.9.186 (2012-09-13)
+	 * @see setAbsX(), setAbsY(), SetAbsXY()
+	 */
+	public function SetAbsX($x) {
+		$this->x = floatval($x);
+	}
+
+	/**
+	 * Set the absolute Y coordinate of the current pointer.
+	 * @param $y (float) (float) The value of the ordinate in user units.
+	 * @public
+	 * @since 5.9.186 (2012-09-13)
+	 * @see setAbsX(), setAbsY(), SetAbsXY()
+	 */
+	public function SetAbsY($y) {
+		$this->y = floatval($y);
+	}
+
+	/**
+	 * Set the absolute X and Y coordinates of the current pointer.
+	 * @param $x (float) The value of the abscissa in user units.
+	 * @param $y (float) (float) The value of the ordinate in user units.
+	 * @public
+	 * @since 5.9.186 (2012-09-13)
+	 * @see setAbsX(), setAbsY(), SetAbsXY()
+	 */
+	public function SetAbsXY($x, $y) {
+		$this->SetAbsX($x);
+		$this->SetAbsY($y);
+	}
+
+	/**
+	 * Send the document to a given destination: string, local file or browser.
+	 * In the last case, the plug-in may be used (if present) or a download ("Save as" dialog box) may be forced.<br />
+	 * The method first calls Close() if necessary to terminate the document.
+	 * @param $name (string) The name of the file when saved. Note that special characters are removed and blanks characters are replaced with the underscore character.
+	 * @param $dest (string) Destination where to send the document. It can take one of the following values:<ul><li>I: send the file inline to the browser (default). The plug-in is used if available. The name given by name is used when one selects the "Save as" option on the link generating the PDF.</li><li>D: send to the browser and force a file download with the name given by name.</li><li>F: save to a local server file with the name given by name.</li><li>S: return the document as a string (name is ignored).</li><li>FI: equivalent to F + I option</li><li>FD: equivalent to F + D option</li><li>E: return the document as base64 mime multi-part email attachment (RFC 2045)</li></ul>
+	 * @public
+	 * @since 1.0
+	 * @see Close()
+	 */
+	public function Output($name='doc.pdf', $dest='I') {
+		//Output PDF to some destination
+		//Finish document if necessary
+		if ($this->state < 3) {
+			$this->Close();
+		}
+		//Normalize parameters
+		if (is_bool($dest)) {
+			$dest = $dest ? 'D' : 'F';
+		}
+		$dest = strtoupper($dest);
+		if ($dest{0} != 'F') {
+			$name = preg_replace('/[\s]+/', '_', $name);
+			$name = preg_replace('/[^a-zA-Z0-9_\.-]/', '', $name);
+		}
+		if ($this->sign) {
+			// *** apply digital signature to the document ***
+			// get the document content
+			$pdfdoc = $this->getBuffer();
+			// remove last newline
+			$pdfdoc = substr($pdfdoc, 0, -1);
+			// Remove the original buffer
+			if (isset($this->diskcache) AND $this->diskcache) {
+				// remove buffer file from cache
+				unlink($this->buffer);
+			}
+			unset($this->buffer);
+			// remove filler space
+			$byterange_string_len = strlen(TCPDF_STATIC::$byterange_string);
+			// define the ByteRange
+			$byte_range = array();
+			$byte_range[0] = 0;
+			$byte_range[1] = strpos($pdfdoc, TCPDF_STATIC::$byterange_string) + $byterange_string_len + 10;
+			$byte_range[2] = $byte_range[1] + $this->signature_max_length + 2;
+			$byte_range[3] = strlen($pdfdoc) - $byte_range[2];
+			$pdfdoc = substr($pdfdoc, 0, $byte_range[1]).substr($pdfdoc, $byte_range[2]);
+			// replace the ByteRange
+			$byterange = sprintf('/ByteRange[0 %u %u %u]', $byte_range[1], $byte_range[2], $byte_range[3]);
+			$byterange .= str_repeat(' ', ($byterange_string_len - strlen($byterange)));
+			$pdfdoc = str_replace(TCPDF_STATIC::$byterange_string, $byterange, $pdfdoc);
+			// write the document to a temporary folder
+			$tempdoc = TCPDF_STATIC::getObjFilename('tmppdf');
+			$f = fopen($tempdoc, 'wb');
+			if (!$f) {
+				$this->Error('Unable to create temporary file: '.$tempdoc);
+			}
+			$pdfdoc_length = strlen($pdfdoc);
+			fwrite($f, $pdfdoc, $pdfdoc_length);
+			fclose($f);
+			// get digital signature via openssl library
+			$tempsign = TCPDF_STATIC::getObjFilename('tmpsig');
+			if (empty($this->signature_data['extracerts'])) {
+				openssl_pkcs7_sign($tempdoc, $tempsign, $this->signature_data['signcert'], array($this->signature_data['privkey'], $this->signature_data['password']), array(), PKCS7_BINARY | PKCS7_DETACHED);
+			} else {
+				openssl_pkcs7_sign($tempdoc, $tempsign, $this->signature_data['signcert'], array($this->signature_data['privkey'], $this->signature_data['password']), array(), PKCS7_BINARY | PKCS7_DETACHED, $this->signature_data['extracerts']);
+			}
+			unlink($tempdoc);
+			// read signature
+			$signature = file_get_contents($tempsign);
+			unlink($tempsign);
+			// extract signature
+			$signature = substr($signature, $pdfdoc_length);
+			$signature = substr($signature, (strpos($signature, "%%EOF\n\n------") + 13));
+			$tmparr = explode("\n\n", $signature);
+			$signature = $tmparr[1];
+			unset($tmparr);
+			// decode signature
+			$signature = base64_decode(trim($signature));
+			// convert signature to hex
+			$signature = current(unpack('H*', $signature));
+			$signature = str_pad($signature, $this->signature_max_length, '0');
+			// disable disk caching
+			$this->diskcache = false;
+			// Add signature to the document
+			$this->buffer = substr($pdfdoc, 0, $byte_range[1]).'<'.$signature.'>'.substr($pdfdoc, $byte_range[1]);
+			$this->bufferlen = strlen($this->buffer);
+		}
+		switch($dest) {
+			case 'I': {
+				// Send PDF to the standard output
+				if (ob_get_contents()) {
+					$this->Error('Some data has already been output, can\'t send PDF file');
+				}
+				if (php_sapi_name() != 'cli') {
+					// send output to a browser
+					header('Content-Type: application/pdf');
+					if (headers_sent()) {
+						$this->Error('Some data has already been output to browser, can\'t send PDF file');
+					}
+					header('Cache-Control: private, must-revalidate, post-check=0, pre-check=0, max-age=1');
+					//header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
+					header('Pragma: public');
+					header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
+					header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+					header('Content-Disposition: inline; filename="'.basename($name).'"');
+					TCPDF_STATIC::sendOutputData($this->getBuffer(), $this->bufferlen);
+				} else {
+					echo $this->getBuffer();
+				}
+				break;
+			}
+			case 'D': {
+				// download PDF as file
+				if (ob_get_contents()) {
+					$this->Error('Some data has already been output, can\'t send PDF file');
+				}
+				header('Content-Description: File Transfer');
+				if (headers_sent()) {
+					$this->Error('Some data has already been output to browser, can\'t send PDF file');
+				}
+				header('Cache-Control: private, must-revalidate, post-check=0, pre-check=0, max-age=1');
+				//header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
+				header('Pragma: public');
+				header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
+				header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+				// force download dialog
+				if (strpos(php_sapi_name(), 'cgi') === false) {
+					header('Content-Type: application/force-download');
+					header('Content-Type: application/octet-stream', false);
+					header('Content-Type: application/download', false);
+					header('Content-Type: application/pdf', false);
+				} else {
+					header('Content-Type: application/pdf');
+				}
+				// use the Content-Disposition header to supply a recommended filename
+				header('Content-Disposition: attachment; filename="'.basename($name).'"');
+				header('Content-Transfer-Encoding: binary');
+				TCPDF_STATIC::sendOutputData($this->getBuffer(), $this->bufferlen);
+				break;
+			}
+			case 'F':
+			case 'FI':
+			case 'FD': {
+				// save PDF to a local file
+				if ($this->diskcache) {
+					copy($this->buffer, $name);
+				} else {
+					$f = fopen($name, 'wb');
+					if (!$f) {
+						$this->Error('Unable to create output file: '.$name);
+					}
+					fwrite($f, $this->getBuffer(), $this->bufferlen);
+					fclose($f);
+				}
+				if ($dest == 'FI') {
+					// send headers to browser
+					header('Content-Type: application/pdf');
+					header('Cache-Control: private, must-revalidate, post-check=0, pre-check=0, max-age=1');
+					//header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
+					header('Pragma: public');
+					header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
+					header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+					header('Content-Disposition: inline; filename="'.basename($name).'"');
+					TCPDF_STATIC::sendOutputData(file_get_contents($name), filesize($name));
+				} elseif ($dest == 'FD') {
+					// send headers to browser
+					if (ob_get_contents()) {
+						$this->Error('Some data has already been output, can\'t send PDF file');
+					}
+					header('Content-Description: File Transfer');
+					if (headers_sent()) {
+						$this->Error('Some data has already been output to browser, can\'t send PDF file');
+					}
+					header('Cache-Control: private, must-revalidate, post-check=0, pre-check=0, max-age=1');
+					header('Pragma: public');
+					header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
+					header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+					// force download dialog
+					if (strpos(php_sapi_name(), 'cgi') === false) {
+						header('Content-Type: application/force-download');
+						header('Content-Type: application/octet-stream', false);
+						header('Content-Type: application/download', false);
+						header('Content-Type: application/pdf', false);
+					} else {
+						header('Content-Type: application/pdf');
+					}
+					// use the Content-Disposition header to supply a recommended filename
+					header('Content-Disposition: attachment; filename="'.basename($name).'"');
+					header('Content-Transfer-Encoding: binary');
+					TCPDF_STATIC::sendOutputData(file_get_contents($name), filesize($name));
+				}
+				break;
+			}
+			case 'E': {
+				// return PDF as base64 mime multi-part email attachment (RFC 2045)
+				$retval = 'Content-Type: application/pdf;'."\r\n";
+				$retval .= ' name="'.$name.'"'."\r\n";
+				$retval .= 'Content-Transfer-Encoding: base64'."\r\n";
+				$retval .= 'Content-Disposition: attachment;'."\r\n";
+				$retval .= ' filename="'.$name.'"'."\r\n\r\n";
+				$retval .= chunk_split(base64_encode($this->getBuffer()), 76, "\r\n");
+				return $retval;
+			}
+			case 'S': {
+				// returns PDF as a string
+				return $this->getBuffer();
+			}
+			default: {
+				$this->Error('Incorrect output destination: '.$dest);
+			}
+		}
+		return '';
+	}
+
+	/**
+	 * Unset all class variables except the following critical variables.
+	 * @param $destroyall (boolean) if true destroys all class variables, otherwise preserves critical variables.
+	 * @param $preserve_objcopy (boolean) if true preserves the objcopy variable
+	 * @public
+	 * @since 4.5.016 (2009-02-24)
+	 */
+	public function _destroy($destroyall=false, $preserve_objcopy=false) {
+		if ($destroyall AND isset($this->diskcache) AND $this->diskcache AND (!$preserve_objcopy) AND (!TCPDF_STATIC::empty_string($this->buffer))) {
+			// remove buffer file from cache
+			unlink($this->buffer);
+		}
+		if ($destroyall AND isset($this->cached_files) AND !empty($this->cached_files)) {
+			// remove cached files
+			foreach ($this->cached_files as $cachefile) {
+				if (is_file($cachefile)) {
+					unlink($cachefile);
+				}
+			}
+			unset($this->cached_files);
+		}
+		foreach (array_keys(get_object_vars($this)) as $val) {
+			if ($destroyall OR (
+				($val != 'internal_encoding')
+				AND ($val != 'state')
+				AND ($val != 'bufferlen')
+				AND ($val != 'buffer')
+				AND ($val != 'diskcache')
+				AND ($val != 'cached_files')
+				AND ($val != 'sign')
+				AND ($val != 'signature_data')
+				AND ($val != 'signature_max_length')
+				AND ($val != 'byterange_string')
+				)) {
+				if ((!$preserve_objcopy OR ($val != 'objcopy')) AND isset($this->$val)) {
+					unset($this->$val);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Check for locale-related bug
+	 * @protected
+	 */
+	protected function _dochecks() {
+		//Check for locale-related bug
+		if (1.1 == 1) {
+			$this->Error('Don\'t alter the locale before including class file');
+		}
+		//Check for decimal separator
+		if (sprintf('%.1F', 1.0) != '1.0') {
+			setlocale(LC_NUMERIC, 'C');
+		}
+	}
+
+	/**
+	 * Return an array containing variations for the basic page number alias.
+	 * @param $a (string) Base alias.
+	 * @return array of page number aliases
+	 * @protected
+	 */
+	protected function getInternalPageNumberAliases($a= '') {
+		$alias = array();
+		// build array of Unicode + ASCII variants (the order is important)
+		$alias = array('u' => array(), 'a' => array());
+		$u = '{'.$a.'}';
+		$alias['u'][] = TCPDF_STATIC::_escape($u);
+		if ($this->isunicode) {
+			$alias['u'][] = TCPDF_STATIC::_escape(TCPDF_FONTS::UTF8ToLatin1($u, $this->isunicode, $this->CurrentFont));
+			$alias['u'][] = TCPDF_STATIC::_escape(TCPDF_FONTS::utf8StrRev($u, false, $this->tmprtl, $this->isunicode, $this->CurrentFont));
+			$alias['a'][] = TCPDF_STATIC::_escape(TCPDF_FONTS::UTF8ToLatin1($a, $this->isunicode, $this->CurrentFont));
+			$alias['a'][] = TCPDF_STATIC::_escape(TCPDF_FONTS::utf8StrRev($a, false, $this->tmprtl, $this->isunicode, $this->CurrentFont));
+		}
+		$alias['a'][] = TCPDF_STATIC::_escape($a);
+		return $alias;
+	}
+
+	/**
+	 * Return an array containing all internal page aliases.
+	 * @return array of page number aliases
+	 * @protected
+	 */
+	protected function getAllInternalPageNumberAliases() {
+		$basic_alias = array(TCPDF_STATIC::$alias_tot_pages, TCPDF_STATIC::$alias_num_page, TCPDF_STATIC::$alias_group_tot_pages, TCPDF_STATIC::$alias_group_num_page, TCPDF_STATIC::$alias_right_shift);
+		$pnalias = array();
+		foreach($basic_alias as $k => $a) {
+			$pnalias[$k] = $this->getInternalPageNumberAliases($a);
+		}
+		return $pnalias;
+	}
+
+	/**
+	 * Replace right shift page number aliases with spaces to correct right alignment.
+	 * This works perfectly only when using monospaced fonts.
+	 * @param $page (string) Page content.
+	 * @param $aliases (array) Array of page aliases.
+	 * @param $diff (int) initial difference to add.
+	 * @return replaced page content.
+	 * @protected
+	 */
+	protected function replaceRightShiftPageNumAliases($page, $aliases, $diff) {
+		foreach ($aliases as $type => $alias) {
+			foreach ($alias as $a) {
+				// find position of compensation factor
+				$startnum = (strpos($a, ':') + 1);
+				$a = substr($a, 0, $startnum);
+				if (($pos = strpos($page, $a)) !== false) {
+					// end of alias
+					$endnum = strpos($page, '}', $pos);
+					// string to be replaced
+					$aa = substr($page, $pos, ($endnum - $pos + 1));
+					// get compensation factor
+					$ratio = substr($page, ($pos + $startnum), ($endnum - $pos - $startnum));
+					$ratio = preg_replace('/[^0-9\.]/', '', $ratio);
+					$ratio = floatval($ratio);
+					if ($type == 'u') {
+						$chrdiff = floor(($diff + 12) * $ratio);
+						$shift = str_repeat(' ', $chrdiff);
+						$shift = TCPDF_FONTS::UTF8ToUTF16BE($shift, false, $this->isunicode, $this->CurrentFont);
+					} else {
+						$chrdiff = floor(($diff + 11) * $ratio);
+						$shift = str_repeat(' ', $chrdiff);
+					}
+					$page = str_replace($aa, $shift, $page);
+				}
+			}
+		}
+		return $page;
+	}
+
+	/**
+	 * Set page boxes to be included on page descriptions.
+	 * @param $boxes (array) Array of page boxes to set on document: ('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox').
+	 * @protected
+	 */
+	protected function setPageBoxTypes($boxes) {
+		$this->page_boxes = array();
+		foreach ($boxes as $box) {
+			if (in_array($box, TCPDF_STATIC::$pageboxes)) {
+				$this->page_boxes[] = $box;
+			}
+		}
+	}
+
+	/**
+	 * Output pages (and replace page number aliases).
+	 * @protected
+	 */
+	protected function _putpages() {
+		$filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
+		// get internal aliases for page numbers
+		$pnalias = $this->getAllInternalPageNumberAliases();
+		$num_pages = $this->numpages;
+		$ptpa = TCPDF_STATIC::formatPageNumber(($this->starting_page_number + $num_pages - 1));
+		$ptpu = TCPDF_FONTS::UTF8ToUTF16BE($ptpa, false, $this->isunicode, $this->CurrentFont);
+		$ptp_num_chars = $this->GetNumChars($ptpa);
+		$pagegroupnum = 0;
+		$groupnum = 0;
+		$ptgu = 1;
+		$ptga = 1;
+		$ptg_num_chars = 1;
+		for ($n = 1; $n <= $num_pages; ++$n) {
+			// get current page
+			$temppage = $this->getPageBuffer($n);
+			$pagelen = strlen($temppage);
+			// set replacements for total pages number
+			$pnpa = TCPDF_STATIC::formatPageNumber(($this->starting_page_number + $n - 1));
+			$pnpu = TCPDF_FONTS::UTF8ToUTF16BE($pnpa, false, $this->isunicode, $this->CurrentFont);
+			$pnp_num_chars = $this->GetNumChars($pnpa);
+			$pdiff = 0; // difference used for right shift alignment of page numbers
+			$gdiff = 0; // difference used for right shift alignment of page group numbers
+			if (!empty($this->pagegroups)) {
+				if (isset($this->newpagegroup[$n])) {
+					$pagegroupnum = 0;
+					++$groupnum;
+					$ptga = TCPDF_STATIC::formatPageNumber($this->pagegroups[$groupnum]);
+					$ptgu = TCPDF_FONTS::UTF8ToUTF16BE($ptga, false, $this->isunicode, $this->CurrentFont);
+					$ptg_num_chars = $this->GetNumChars($ptga);
+				}
+				++$pagegroupnum;
+				$pnga = TCPDF_STATIC::formatPageNumber($pagegroupnum);
+				$pngu = TCPDF_FONTS::UTF8ToUTF16BE($pnga, false, $this->isunicode, $this->CurrentFont);
+				$png_num_chars = $this->GetNumChars($pnga);
+				// replace page numbers
+				$replace = array();
+				$replace[] = array($ptgu, $ptg_num_chars, 9, $pnalias[2]['u']);
+				$replace[] = array($ptga, $ptg_num_chars, 7, $pnalias[2]['a']);
+				$replace[] = array($pngu, $png_num_chars, 9, $pnalias[3]['u']);
+				$replace[] = array($pnga, $png_num_chars, 7, $pnalias[3]['a']);
+				list($temppage, $gdiff) = TCPDF_STATIC::replacePageNumAliases($temppage, $replace, $gdiff);
+			}
+			// replace page numbers
+			$replace = array();
+			$replace[] = array($ptpu, $ptp_num_chars, 9, $pnalias[0]['u']);
+			$replace[] = array($ptpa, $ptp_num_chars, 7, $pnalias[0]['a']);
+			$replace[] = array($pnpu, $pnp_num_chars, 9, $pnalias[1]['u']);
+			$replace[] = array($pnpa, $pnp_num_chars, 7, $pnalias[1]['a']);
+			list($temppage, $pdiff) = TCPDF_STATIC::replacePageNumAliases($temppage, $replace, $pdiff);
+			// replace right shift alias
+			$temppage = $this->replaceRightShiftPageNumAliases($temppage, $pnalias[4], max($pdiff, $gdiff));
+			// replace EPS marker
+			$temppage = str_replace($this->epsmarker, '', $temppage);
+			//Page
+			$this->page_obj_id[$n] = $this->_newobj();
+			$out = '<<';
+			$out .= ' /Type /Page';
+			$out .= ' /Parent 1 0 R';
+			$out .= ' /LastModified '.$this->_datestring(0, $this->doc_modification_timestamp);
+			$out .= ' /Resources 2 0 R';
+			foreach ($this->page_boxes as $box) {
+				$out .= ' /'.$box;
+				$out .= sprintf(' [%F %F %F %F]', $this->pagedim[$n][$box]['llx'], $this->pagedim[$n][$box]['lly'], $this->pagedim[$n][$box]['urx'], $this->pagedim[$n][$box]['ury']);
+			}
+			if (isset($this->pagedim[$n]['BoxColorInfo']) AND !empty($this->pagedim[$n]['BoxColorInfo'])) {
+				$out .= ' /BoxColorInfo <<';
+				foreach ($this->page_boxes as $box) {
+					if (isset($this->pagedim[$n]['BoxColorInfo'][$box])) {
+						$out .= ' /'.$box.' <<';
+						if (isset($this->pagedim[$n]['BoxColorInfo'][$box]['C'])) {
+							$color = $this->pagedim[$n]['BoxColorInfo'][$box]['C'];
+							$out .= ' /C [';
+							$out .= sprintf(' %F %F %F', ($color[0] / 255), ($color[1] / 255), ($color[2] / 255));
+							$out .= ' ]';
+						}
+						if (isset($this->pagedim[$n]['BoxColorInfo'][$box]['W'])) {
+							$out .= ' /W '.($this->pagedim[$n]['BoxColorInfo'][$box]['W'] * $this->k);
+						}
+						if (isset($this->pagedim[$n]['BoxColorInfo'][$box]['S'])) {
+							$out .= ' /S /'.$this->pagedim[$n]['BoxColorInfo'][$box]['S'];
+						}
+						if (isset($this->pagedim[$n]['BoxColorInfo'][$box]['D'])) {
+							$dashes = $this->pagedim[$n]['BoxColorInfo'][$box]['D'];
+							$out .= ' /D [';
+							foreach ($dashes as $dash) {
+								$out .= sprintf(' %F', ($dash * $this->k));
+							}
+							$out .= ' ]';
+						}
+						$out .= ' >>';
+					}
+				}
+				$out .= ' >>';
+			}
+			$out .= ' /Contents '.($this->n + 1).' 0 R';
+			$out .= ' /Rotate '.$this->pagedim[$n]['Rotate'];
+			if (!$this->pdfa_mode) {
+				$out .= ' /Group << /Type /Group /S /Transparency /CS /DeviceRGB >>';
+			}
+			if (isset($this->pagedim[$n]['trans']) AND !empty($this->pagedim[$n]['trans'])) {
+				// page transitions
+				if (isset($this->pagedim[$n]['trans']['Dur'])) {
+					$out .= ' /Dur '.$this->pagedim[$n]['trans']['Dur'];
+				}
+				$out .= ' /Trans <<';
+				$out .= ' /Type /Trans';
+				if (isset($this->pagedim[$n]['trans']['S'])) {
+					$out .= ' /S /'.$this->pagedim[$n]['trans']['S'];
+				}
+				if (isset($this->pagedim[$n]['trans']['D'])) {
+					$out .= ' /D '.$this->pagedim[$n]['trans']['D'];
+				}
+				if (isset($this->pagedim[$n]['trans']['Dm'])) {
+					$out .= ' /Dm /'.$this->pagedim[$n]['trans']['Dm'];
+				}
+				if (isset($this->pagedim[$n]['trans']['M'])) {
+					$out .= ' /M /'.$this->pagedim[$n]['trans']['M'];
+				}
+				if (isset($this->pagedim[$n]['trans']['Di'])) {
+					$out .= ' /Di '.$this->pagedim[$n]['trans']['Di'];
+				}
+				if (isset($this->pagedim[$n]['trans']['SS'])) {
+					$out .= ' /SS '.$this->pagedim[$n]['trans']['SS'];
+				}
+				if (isset($this->pagedim[$n]['trans']['B'])) {
+					$out .= ' /B '.$this->pagedim[$n]['trans']['B'];
+				}
+				$out .= ' >>';
+			}
+			$out .= $this->_getannotsrefs($n);
+			$out .= ' /PZ '.$this->pagedim[$n]['PZ'];
+			$out .= ' >>';
+			$out .= "\n".'endobj';
+			$this->_out($out);
+			//Page content
+			$p = ($this->compress) ? gzcompress($temppage) : $temppage;
+			$this->_newobj();
+			$p = $this->_getrawstream($p);
+			$this->_out('<<'.$filter.'/Length '.strlen($p).'>> stream'."\n".$p."\n".'endstream'."\n".'endobj');
+			if ($this->diskcache) {
+				// remove temporary files
+				unlink($this->pages[$n]);
+			}
+		}
+		//Pages root
+		$out = $this->_getobj(1)."\n";
+		$out .= '<< /Type /Pages /Kids [';
+		foreach($this->page_obj_id as $page_obj) {
+			$out .= ' '.$page_obj.' 0 R';
+		}
+		$out .= ' ] /Count '.$num_pages.' >>';
+		$out .= "\n".'endobj';
+		$this->_out($out);
+	}
+
+	/**
+	 * Output references to page annotations
+	 * @param $n (int) page number
+	 * @protected
+	 * @author Nicola Asuni
+	 * @since 4.7.000 (2008-08-29)
+	 * @deprecated
+	 */
+	protected function _putannotsrefs($n) {
+		$this->_out($this->_getannotsrefs($n));
+	}
+
+	/**
+	 * Get references to page annotations.
+	 * @param $n (int) page number
+	 * @return string
+	 * @protected
+	 * @author Nicola Asuni
+	 * @since 5.0.010 (2010-05-17)
+	 */
+	protected function _getannotsrefs($n) {
+		if (!(isset($this->PageAnnots[$n]) OR ($this->sign AND isset($this->signature_data['cert_type'])))) {
+			return '';
+		}
+		$out = ' /Annots [';
+		if (isset($this->PageAnnots[$n])) {
+			foreach ($this->PageAnnots[$n] as $key => $val) {
+				if (!in_array($val['n'], $this->radio_groups)) {
+					$out .= ' '.$val['n'].' 0 R';
+				}
+			}
+			// add radiobutton groups
+			if (isset($this->radiobutton_groups[$n])) {
+				foreach ($this->radiobutton_groups[$n] as $key => $data) {
+					if (isset($data['n'])) {
+						$out .= ' '.$data['n'].' 0 R';
+					}
+				}
+			}
+		}
+		if ($this->sign AND ($n == $this->signature_appearance['page']) AND isset($this->signature_data['cert_type'])) {
+			// set reference for signature object
+			$out .= ' '.$this->sig_obj_id.' 0 R';
+		}
+		if (!empty($this->empty_signature_appearance)) {
+			foreach ($this->empty_signature_appearance as $esa) {
+				if ($esa['page'] == $n) {
+					// set reference for empty signature objects
+					$out .= ' '.$esa['objid'].' 0 R';
+				}
+			}
+		}
+		$out .= ' ]';
+		return $out;
+	}
+
+	/**
+	 * Output annotations objects for all pages.
+	 * !!! THIS METHOD IS NOT YET COMPLETED !!!
+	 * See section 12.5 of PDF 32000_2008 reference.
+	 * @protected
+	 * @author Nicola Asuni
+	 * @since 4.0.018 (2008-08-06)
+	 */
+	protected function _putannotsobjs() {
+		// reset object counter
+		for ($n=1; $n <= $this->numpages; ++$n) {
+			if (isset($this->PageAnnots[$n])) {
+				// set page annotations
+				foreach ($this->PageAnnots[$n] as $key => $pl) {
+					$annot_obj_id = $this->PageAnnots[$n][$key]['n'];
+					// create annotation object for grouping radiobuttons
+					if (isset($this->radiobutton_groups[$n][$pl['txt']]) AND is_array($this->radiobutton_groups[$n][$pl['txt']])) {
+						$radio_button_obj_id = $this->radiobutton_groups[$n][$pl['txt']]['n'];
+						$annots = '<<';
+						$annots .= ' /Type /Annot';
+						$annots .= ' /Subtype /Widget';
+						$annots .= ' /Rect [0 0 0 0]';
+						if ($this->radiobutton_groups[$n][$pl['txt']]['#readonly#']) {
+							// read only
+							$annots .= ' /F 68';
+							$annots .= ' /Ff 49153';
+						} else {
+							$annots .= ' /F 4'; // default print for PDF/A
+							$annots .= ' /Ff 49152';
+						}
+						$annots .= ' /T '.$this->_datastring($pl['txt'], $radio_button_obj_id);
+						if (isset($pl['opt']['tu']) AND is_string($pl['opt']['tu'])) {
+							$annots .= ' /TU '.$this->_datastring($pl['opt']['tu'], $radio_button_obj_id);
+						}
+						$annots .= ' /FT /Btn';
+						$annots .= ' /Kids [';
+						$defval = '';
+						foreach ($this->radiobutton_groups[$n][$pl['txt']] as $key => $data) {
+							if (isset($data['kid'])) {
+								$annots .= ' '.$data['kid'].' 0 R';
+								if ($data['def'] !== 'Off') {
+									$defval = $data['def'];
+								}
+							}
+						}
+						$annots .= ' ]';
+						if (!empty($defval)) {
+							$annots .= ' /V /'.$defval;
+						}
+						$annots .= ' >>';
+						$this->_out($this->_getobj($radio_button_obj_id)."\n".$annots."\n".'endobj');
+						$this->form_obj_id[] = $radio_button_obj_id;
+						// store object id to be used on Parent entry of Kids
+						$this->radiobutton_groups[$n][$pl['txt']] = $radio_button_obj_id;
+					}
+					$formfield = false;
+					$pl['opt'] = array_change_key_case($pl['opt'], CASE_LOWER);
+					$a = $pl['x'] * $this->k;
+					$b = $this->pagedim[$n]['h'] - (($pl['y'] + $pl['h']) * $this->k);
+					$c = $pl['w'] * $this->k;
+					$d = $pl['h'] * $this->k;
+					$rect = sprintf('%F %F %F %F', $a, $b, $a+$c, $b+$d);
+					// create new annotation object
+					$annots = '<</Type /Annot';
+					$annots .= ' /Subtype /'.$pl['opt']['subtype'];
+					$annots .= ' /Rect ['.$rect.']';
+					$ft = array('Btn', 'Tx', 'Ch', 'Sig');
+					if (isset($pl['opt']['ft']) AND in_array($pl['opt']['ft'], $ft)) {
+						$annots .= ' /FT /'.$pl['opt']['ft'];
+						$formfield = true;
+					}
+					$annots .= ' /Contents '.$this->_textstring($pl['txt'], $annot_obj_id);
+					$annots .= ' /P '.$this->page_obj_id[$n].' 0 R';
+					$annots .= ' /NM '.$this->_datastring(sprintf('%04u-%04u', $n, $key), $annot_obj_id);
+					$annots .= ' /M '.$this->_datestring($annot_obj_id, $this->doc_modification_timestamp);
+					if (isset($pl['opt']['f'])) {
+						$fval = 0;
+						if (is_array($pl['opt']['f'])) {
+							foreach ($pl['opt']['f'] as $f) {
+								switch (strtolower($f)) {
+									case 'invisible': {
+										$fval += 1 << 0;
+										break;
+									}
+									case 'hidden': {
+										$fval += 1 << 1;
+										break;
+									}
+									case 'print': {
+										$fval += 1 << 2;
+										break;
+									}
+									case 'nozoom': {
+										$fval += 1 << 3;
+										break;
+									}
+									case 'norotate': {
+										$fval += 1 << 4;
+										break;
+									}
+									case 'noview': {
+										$fval += 1 << 5;
+										break;
+									}
+									case 'readonly': {
+										$fval += 1 << 6;
+										break;
+									}
+									case 'locked': {
+										$fval += 1 << 8;
+										break;
+									}
+									case 'togglenoview': {
+										$fval += 1 << 9;
+										break;
+									}
+									case 'lockedcontents': {
+										$fval += 1 << 10;
+										break;
+									}
+									default: {
+										break;
+									}
+								}
+							}
+						} else {
+							$fval = intval($pl['opt']['f']);
+						}
+					} else {
+						$fval = 4;
+					}
+					if ($this->pdfa_mode) {
+						// force print flag for PDF/A mode
+						$fval |= 4;
+					}
+					$annots .= ' /F '.intval($fval);
+					if (isset($pl['opt']['as']) AND is_string($pl['opt']['as'])) {
+						$annots .= ' /AS /'.$pl['opt']['as'];
+					}
+					if (isset($pl['opt']['ap'])) {
+						// appearance stream
+						$annots .= ' /AP <<';
+						if (is_array($pl['opt']['ap'])) {
+							foreach ($pl['opt']['ap'] as $apmode => $apdef) {
+								// $apmode can be: n = normal; r = rollover; d = down;
+								$annots .= ' /'.strtoupper($apmode);
+								if (is_array($apdef)) {
+									$annots .= ' <<';
+									foreach ($apdef as $apstate => $stream) {
+										// reference to XObject that define the appearance for this mode-state
+										$apsobjid = $this->_putAPXObject($c, $d, $stream);
+										$annots .= ' /'.$apstate.' '.$apsobjid.' 0 R';
+									}
+									$annots .= ' >>';
+								} else {
+									// reference to XObject that define the appearance for this mode
+									$apsobjid = $this->_putAPXObject($c, $d, $apdef);
+									$annots .= ' '.$apsobjid.' 0 R';
+								}
+							}
+						} else {
+							$annots .= $pl['opt']['ap'];
+						}
+						$annots .= ' >>';
+					}
+					if (isset($pl['opt']['bs']) AND (is_array($pl['opt']['bs']))) {
+						$annots .= ' /BS <<';
+						$annots .= ' /Type /Border';
+						if (isset($pl['opt']['bs']['w'])) {
+							$annots .= ' /W '.intval($pl['opt']['bs']['w']);
+						}
+						$bstyles = array('S', 'D', 'B', 'I', 'U');
+						if (isset($pl['opt']['bs']['s']) AND in_array($pl['opt']['bs']['s'], $bstyles)) {
+							$annots .= ' /S /'.$pl['opt']['bs']['s'];
+						}
+						if (isset($pl['opt']['bs']['d']) AND (is_array($pl['opt']['bs']['d']))) {
+							$annots .= ' /D [';
+							foreach ($pl['opt']['bs']['d'] as $cord) {
+								$annots .= ' '.intval($cord);
+							}
+							$annots .= ']';
+						}
+						$annots .= ' >>';
+					} else {
+						$annots .= ' /Border [';
+						if (isset($pl['opt']['border']) AND (count($pl['opt']['border']) >= 3)) {
+							$annots .= intval($pl['opt']['border'][0]).' ';
+							$annots .= intval($pl['opt']['border'][1]).' ';
+							$annots .= intval($pl['opt']['border'][2]);
+							if (isset($pl['opt']['border'][3]) AND is_array($pl['opt']['border'][3])) {
+								$annots .= ' [';
+								foreach ($pl['opt']['border'][3] as $dash) {
+									$annots .= intval($dash).' ';
+								}
+								$annots .= ']';
+							}
+						} else {
+							$annots .= '0 0 0';
+						}
+						$annots .= ']';
+					}
+					if (isset($pl['opt']['be']) AND (is_array($pl['opt']['be']))) {
+						$annots .= ' /BE <<';
+						$bstyles = array('S', 'C');
+						if (isset($pl['opt']['be']['s']) AND in_array($pl['opt']['be']['s'], $bstyles)) {
+							$annots .= ' /S /'.$pl['opt']['bs']['s'];
+						} else {
+							$annots .= ' /S /S';
+						}
+						if (isset($pl['opt']['be']['i']) AND ($pl['opt']['be']['i'] >= 0) AND ($pl['opt']['be']['i'] <= 2)) {
+							$annots .= ' /I '.sprintf(' %F', $pl['opt']['be']['i']);
+						}
+						$annots .= '>>';
+					}
+					if (isset($pl['opt']['c']) AND (is_array($pl['opt']['c'])) AND !empty($pl['opt']['c'])) {
+						$annots .= ' /C '.TCPDF_COLORS::getColorStringFromArray($pl['opt']['c']);
+					}
+					//$annots .= ' /StructParent ';
+					//$annots .= ' /OC ';
+					$markups = array('text', 'freetext', 'line', 'square', 'circle', 'polygon', 'polyline', 'highlight', 'underline', 'squiggly', 'strikeout', 'stamp', 'caret', 'ink', 'fileattachment', 'sound');
+					if (in_array(strtolower($pl['opt']['subtype']), $markups)) {
+						// this is a markup type
+						if (isset($pl['opt']['t']) AND is_string($pl['opt']['t'])) {
+							$annots .= ' /T '.$this->_textstring($pl['opt']['t'], $annot_obj_id);
+						}
+						//$annots .= ' /Popup ';
+						if (isset($pl['opt']['ca'])) {
+							$annots .= ' /CA '.sprintf('%F', floatval($pl['opt']['ca']));
+						}
+						if (isset($pl['opt']['rc'])) {
+							$annots .= ' /RC '.$this->_textstring($pl['opt']['rc'], $annot_obj_id);
+						}
+						$annots .= ' /CreationDate '.$this->_datestring($annot_obj_id, $this->doc_creation_timestamp);
+						//$annots .= ' /IRT ';
+						if (isset($pl['opt']['subj'])) {
+							$annots .= ' /Subj '.$this->_textstring($pl['opt']['subj'], $annot_obj_id);
+						}
+						//$annots .= ' /RT ';
+						//$annots .= ' /IT ';
+						//$annots .= ' /ExData ';
+					}
+					$lineendings = array('Square', 'Circle', 'Diamond', 'OpenArrow', 'ClosedArrow', 'None', 'Butt', 'ROpenArrow', 'RClosedArrow', 'Slash');
+					// Annotation types
+					switch (strtolower($pl['opt']['subtype'])) {
+						case 'text': {
+							if (isset($pl['opt']['open'])) {
+								$annots .= ' /Open '. (strtolower($pl['opt']['open']) == 'true' ? 'true' : 'false');
+							}
+							$iconsapp = array('Comment', 'Help', 'Insert', 'Key', 'NewParagraph', 'Note', 'Paragraph');
+							if (isset($pl['opt']['name']) AND in_array($pl['opt']['name'], $iconsapp)) {
+								$annots .= ' /Name /'.$pl['opt']['name'];
+							} else {
+								$annots .= ' /Name /Note';
+							}
+							$statemodels = array('Marked', 'Review');
+							if (isset($pl['opt']['statemodel']) AND in_array($pl['opt']['statemodel'], $statemodels)) {
+								$annots .= ' /StateModel /'.$pl['opt']['statemodel'];
+							} else {
+								$pl['opt']['statemodel'] = 'Marked';
+								$annots .= ' /StateModel /'.$pl['opt']['statemodel'];
+							}
+							if ($pl['opt']['statemodel'] == 'Marked') {
+								$states = array('Accepted', 'Unmarked');
+							} else {
+								$states = array('Accepted', 'Rejected', 'Cancelled', 'Completed', 'None');
+							}
+							if (isset($pl['opt']['state']) AND in_array($pl['opt']['state'], $states)) {
+								$annots .= ' /State /'.$pl['opt']['state'];
+							} else {
+								if ($pl['opt']['statemodel'] == 'Marked') {
+									$annots .= ' /State /Unmarked';
+								} else {
+									$annots .= ' /State /None';
+								}
+							}
+							break;
+						}
+						case 'link': {
+							if (is_string($pl['txt'])) {
+								if ($pl['txt'][0] == '#') {
+									// internal destination
+									$annots .= ' /Dest /'.TCPDF_STATIC::encodeNameObject(substr($pl['txt'], 1));
+								} elseif ($pl['txt'][0] == '%') {
+									// embedded PDF file
+									$filename = basename(substr($pl['txt'], 1));
+									$annots .= ' /A << /S /GoToE /D [0 /Fit] /NewWindow true /T << /R /C /P '.($n - 1).' /A '.$this->embeddedfiles[$filename]['a'].' >> >>';
+								} elseif ($pl['txt'][0] == '*') {
+									// embedded generic file
+									$filename = basename(substr($pl['txt'], 1));
+									$jsa = 'var D=event.target.doc;var MyData=D.dataObjects;for (var i in MyData) if (MyData[i].path=="'.$filename.'") D.exportDataObject( { cName : MyData[i].name, nLaunch : 2});';
+									$annots .= ' /A << /S /JavaScript /JS '.$this->_textstring($jsa, $annot_obj_id).'>>';
+								} else {
+									// external URI link
+									$annots .= ' /A <</S /URI /URI '.$this->_datastring($this->unhtmlentities($pl['txt']), $annot_obj_id).'>>';
+								}
+							} elseif (isset($this->links[$pl['txt']])) {
+								// internal link ID
+								$l = $this->links[$pl['txt']];
+								if (isset($this->page_obj_id[($l[0])])) {
+									$annots .= sprintf(' /Dest [%u 0 R /XYZ 0 %F null]', $this->page_obj_id[($l[0])], ($this->pagedim[$l[0]]['h'] - ($l[1] * $this->k)));
+								}
+							}
+							$hmodes = array('N', 'I', 'O', 'P');
+							if (isset($pl['opt']['h']) AND in_array($pl['opt']['h'], $hmodes)) {
+								$annots .= ' /H /'.$pl['opt']['h'];
+							} else {
+								$annots .= ' /H /I';
+							}
+							//$annots .= ' /PA ';
+							//$annots .= ' /Quadpoints ';
+							break;
+						}
+						case 'freetext': {
+							if (isset($pl['opt']['da']) AND !empty($pl['opt']['da'])) {
+								$annots .= ' /DA ('.$pl['opt']['da'].')';
+							}
+							if (isset($pl['opt']['q']) AND ($pl['opt']['q'] >= 0) AND ($pl['opt']['q'] <= 2)) {
+								$annots .= ' /Q '.intval($pl['opt']['q']);
+							}
+							if (isset($pl['opt']['rc'])) {
+								$annots .= ' /RC '.$this->_textstring($pl['opt']['rc'], $annot_obj_id);
+							}
+							if (isset($pl['opt']['ds'])) {
+								$annots .= ' /DS '.$this->_textstring($pl['opt']['ds'], $annot_obj_id);
+							}
+							if (isset($pl['opt']['cl']) AND is_array($pl['opt']['cl'])) {
+								$annots .= ' /CL [';
+								foreach ($pl['opt']['cl'] as $cl) {
+									$annots .= sprintf('%F ', $cl * $this->k);
+								}
+								$annots .= ']';
+							}
+							$tfit = array('FreeText', 'FreeTextCallout', 'FreeTextTypeWriter');
+							if (isset($pl['opt']['it']) AND in_array($pl['opt']['it'], $tfit)) {
+								$annots .= ' /IT /'.$pl['opt']['it'];
+							}
+							if (isset($pl['opt']['rd']) AND is_array($pl['opt']['rd'])) {
+								$l = $pl['opt']['rd'][0] * $this->k;
+								$r = $pl['opt']['rd'][1] * $this->k;
+								$t = $pl['opt']['rd'][2] * $this->k;
+								$b = $pl['opt']['rd'][3] * $this->k;
+								$annots .= ' /RD ['.sprintf('%F %F %F %F', $l, $r, $t, $b).']';
+							}
+							if (isset($pl['opt']['le']) AND in_array($pl['opt']['le'], $lineendings)) {
+								$annots .= ' /LE /'.$pl['opt']['le'];
+							}
+							break;
+						}
+						case 'line': {
+							break;
+						}
+						case 'square': {
+							break;
+						}
+						case 'circle': {
+							break;
+						}
+						case 'polygon': {
+							break;
+						}
+						case 'polyline': {
+							break;
+						}
+						case 'highlight': {
+							break;
+						}
+						case 'underline': {
+							break;
+						}
+						case 'squiggly': {
+							break;
+						}
+						case 'strikeout': {
+							break;
+						}
+						case 'stamp': {
+							break;
+						}
+						case 'caret': {
+							break;
+						}
+						case 'ink': {
+							break;
+						}
+						case 'popup': {
+							break;
+						}
+						case 'fileattachment': {
+							if ($this->pdfa_mode) {
+								// embedded files are not allowed in PDF/A mode
+								break;
+							}
+							if (!isset($pl['opt']['fs'])) {
+								break;
+							}
+							$filename = basename($pl['opt']['fs']);
+							if (isset($this->embeddedfiles[$filename]['f'])) {
+								$annots .= ' /FS '.$this->embeddedfiles[$filename]['f'].' 0 R';
+								$iconsapp = array('Graph', 'Paperclip', 'PushPin', 'Tag');
+								if (isset($pl['opt']['name']) AND in_array($pl['opt']['name'], $iconsapp)) {
+									$annots .= ' /Name /'.$pl['opt']['name'];
+								} else {
+									$annots .= ' /Name /PushPin';
+								}
+								// index (zero-based) of the annotation in the Annots array of this page
+								$this->embeddedfiles[$filename]['a'] = $key;
+							}
+							break;
+						}
+						case 'sound': {
+							if (!isset($pl['opt']['fs'])) {
+								break;
+							}
+							$filename = basename($pl['opt']['fs']);
+							if (isset($this->embeddedfiles[$filename]['f'])) {
+								// ... TO BE COMPLETED ...
+								// /R /C /B /E /CO /CP
+								$annots .= ' /Sound '.$this->embeddedfiles[$filename]['f'].' 0 R';
+								$iconsapp = array('Speaker', 'Mic');
+								if (isset($pl['opt']['name']) AND in_array($pl['opt']['name'], $iconsapp)) {
+									$annots .= ' /Name /'.$pl['opt']['name'];
+								} else {
+									$annots .= ' /Name /Speaker';
+								}
+							}
+							break;
+						}
+						case 'movie': {
+							break;
+						}
+						case 'widget': {
+							$hmode = array('N', 'I', 'O', 'P', 'T');
+							if (isset($pl['opt']['h']) AND in_array($pl['opt']['h'], $hmode)) {
+								$annots .= ' /H /'.$pl['opt']['h'];
+							}
+							if (isset($pl['opt']['mk']) AND (is_array($pl['opt']['mk'])) AND !empty($pl['opt']['mk'])) {
+								$annots .= ' /MK <<';
+								if (isset($pl['opt']['mk']['r'])) {
+									$annots .= ' /R '.$pl['opt']['mk']['r'];
+								}
+								if (isset($pl['opt']['mk']['bc']) AND (is_array($pl['opt']['mk']['bc']))) {
+									$annots .= ' /BC '.TCPDF_COLORS::getColorStringFromArray($pl['opt']['mk']['bc']);
+								}
+								if (isset($pl['opt']['mk']['bg']) AND (is_array($pl['opt']['mk']['bg']))) {
+									$annots .= ' /BG '.TCPDF_COLORS::getColorStringFromArray($pl['opt']['mk']['bg']);
+								}
+								if (isset($pl['opt']['mk']['ca'])) {
+									$annots .= ' /CA '.$pl['opt']['mk']['ca'];
+								}
+								if (isset($pl['opt']['mk']['rc'])) {
+									$annots .= ' /RC '.$pl['opt']['mk']['rc'];
+								}
+								if (isset($pl['opt']['mk']['ac'])) {
+									$annots .= ' /AC '.$pl['opt']['mk']['ac'];
+								}
+								if (isset($pl['opt']['mk']['i'])) {
+									$info = $this->getImageBuffer($pl['opt']['mk']['i']);
+									if ($info !== false) {
+										$annots .= ' /I '.$info['n'].' 0 R';
+									}
+								}
+								if (isset($pl['opt']['mk']['ri'])) {
+									$info = $this->getImageBuffer($pl['opt']['mk']['ri']);
+									if ($info !== false) {
+										$annots .= ' /RI '.$info['n'].' 0 R';
+									}
+								}
+								if (isset($pl['opt']['mk']['ix'])) {
+									$info = $this->getImageBuffer($pl['opt']['mk']['ix']);
+									if ($info !== false) {
+										$annots .= ' /IX '.$info['n'].' 0 R';
+									}
+								}
+								if (isset($pl['opt']['mk']['if']) AND (is_array($pl['opt']['mk']['if'])) AND !empty($pl['opt']['mk']['if'])) {
+									$annots .= ' /IF <<';
+									$if_sw = array('A', 'B', 'S', 'N');
+									if (isset($pl['opt']['mk']['if']['sw']) AND in_array($pl['opt']['mk']['if']['sw'], $if_sw)) {
+										$annots .= ' /SW /'.$pl['opt']['mk']['if']['sw'];
+									}
+									$if_s = array('A', 'P');
+									if (isset($pl['opt']['mk']['if']['s']) AND in_array($pl['opt']['mk']['if']['s'], $if_s)) {
+										$annots .= ' /S /'.$pl['opt']['mk']['if']['s'];
+									}
+									if (isset($pl['opt']['mk']['if']['a']) AND (is_array($pl['opt']['mk']['if']['a'])) AND !empty($pl['opt']['mk']['if']['a'])) {
+										$annots .= sprintf(' /A [%F %F]', $pl['opt']['mk']['if']['a'][0], $pl['opt']['mk']['if']['a'][1]);
+									}
+									if (isset($pl['opt']['mk']['if']['fb']) AND ($pl['opt']['mk']['if']['fb'])) {
+										$annots .= ' /FB true';
+									}
+									$annots .= '>>';
+								}
+								if (isset($pl['opt']['mk']['tp']) AND ($pl['opt']['mk']['tp'] >= 0) AND ($pl['opt']['mk']['tp'] <= 6)) {
+									$annots .= ' /TP '.intval($pl['opt']['mk']['tp']);
+								}
+								$annots .= '>>';
+							} // end MK
+							// --- Entries for field dictionaries ---
+							if (isset($this->radiobutton_groups[$n][$pl['txt']])) {
+								// set parent
+								$annots .= ' /Parent '.$this->radiobutton_groups[$n][$pl['txt']].' 0 R';
+							}
+							if (isset($pl['opt']['t']) AND is_string($pl['opt']['t'])) {
+								$annots .= ' /T '.$this->_datastring($pl['opt']['t'], $annot_obj_id);
+							}
+							if (isset($pl['opt']['tu']) AND is_string($pl['opt']['tu'])) {
+								$annots .= ' /TU '.$this->_datastring($pl['opt']['tu'], $annot_obj_id);
+							}
+							if (isset($pl['opt']['tm']) AND is_string($pl['opt']['tm'])) {
+								$annots .= ' /TM '.$this->_datastring($pl['opt']['tm'], $annot_obj_id);
+							}
+							if (isset($pl['opt']['ff'])) {
+								if (is_array($pl['opt']['ff'])) {
+									// array of bit settings
+									$flag = 0;
+									foreach($pl['opt']['ff'] as $val) {
+										$flag += 1 << ($val - 1);
+									}
+								} else {
+									$flag = intval($pl['opt']['ff']);
+								}
+								$annots .= ' /Ff '.$flag;
+							}
+							if (isset($pl['opt']['maxlen'])) {
+								$annots .= ' /MaxLen '.intval($pl['opt']['maxlen']);
+							}
+							if (isset($pl['opt']['v'])) {
+								$annots .= ' /V';
+								if (is_array($pl['opt']['v'])) {
+									foreach ($pl['opt']['v'] AS $optval) {
+										if (is_float($optval)) {
+											$optval = sprintf('%F', $optval);
+										}
+										$annots .= ' '.$optval;
+									}
+								} else {
+									$annots .= ' '.$this->_textstring($pl['opt']['v'], $annot_obj_id);
+								}
+							}
+							if (isset($pl['opt']['dv'])) {
+								$annots .= ' /DV';
+								if (is_array($pl['opt']['dv'])) {
+									foreach ($pl['opt']['dv'] AS $optval) {
+										if (is_float($optval)) {
+											$optval = sprintf('%F', $optval);
+										}
+										$annots .= ' '.$optval;
+									}
+								} else {
+									$annots .= ' '.$this->_textstring($pl['opt']['dv'], $annot_obj_id);
+								}
+							}
+							if (isset($pl['opt']['rv'])) {
+								$annots .= ' /RV';
+								if (is_array($pl['opt']['rv'])) {
+									foreach ($pl['opt']['rv'] AS $optval) {
+										if (is_float($optval)) {
+											$optval = sprintf('%F', $optval);
+										}
+										$annots .= ' '.$optval;
+									}
+								} else {
+									$annots .= ' '.$this->_textstring($pl['opt']['rv'], $annot_obj_id);
+								}
+							}
+							if (isset($pl['opt']['a']) AND !empty($pl['opt']['a'])) {
+								$annots .= ' /A << '.$pl['opt']['a'].' >>';
+							}
+							if (isset($pl['opt']['aa']) AND !empty($pl['opt']['aa'])) {
+								$annots .= ' /AA << '.$pl['opt']['aa'].' >>';
+							}
+							if (isset($pl['opt']['da']) AND !empty($pl['opt']['da'])) {
+								$annots .= ' /DA ('.$pl['opt']['da'].')';
+							}
+							if (isset($pl['opt']['q']) AND ($pl['opt']['q'] >= 0) AND ($pl['opt']['q'] <= 2)) {
+								$annots .= ' /Q '.intval($pl['opt']['q']);
+							}
+							if (isset($pl['opt']['opt']) AND (is_array($pl['opt']['opt'])) AND !empty($pl['opt']['opt'])) {
+								$annots .= ' /Opt [';
+								foreach($pl['opt']['opt'] AS $copt) {
+									if (is_array($copt)) {
+										$annots .= ' ['.$this->_textstring($copt[0], $annot_obj_id).' '.$this->_textstring($copt[1], $annot_obj_id).']';
+									} else {
+										$annots .= ' '.$this->_textstring($copt, $annot_obj_id);
+									}
+								}
+								$annots .= ']';
+							}
+							if (isset($pl['opt']['ti'])) {
+								$annots .= ' /TI '.intval($pl['opt']['ti']);
+							}
+							if (isset($pl['opt']['i']) AND (is_array($pl['opt']['i'])) AND !empty($pl['opt']['i'])) {
+								$annots .= ' /I [';
+								foreach($pl['opt']['i'] AS $copt) {
+									$annots .= intval($copt).' ';
+								}
+								$annots .= ']';
+							}
+							break;
+						}
+						case 'screen': {
+							break;
+						}
+						case 'printermark': {
+							break;
+						}
+						case 'trapnet': {
+							break;
+						}
+						case 'watermark': {
+							break;
+						}
+						case '3d': {
+							break;
+						}
+						default: {
+							break;
+						}
+					}
+					$annots .= '>>';
+					// create new annotation object
+					$this->_out($this->_getobj($annot_obj_id)."\n".$annots."\n".'endobj');
+					if ($formfield AND !isset($this->radiobutton_groups[$n][$pl['txt']])) {
+						// store reference of form object
+						$this->form_obj_id[] = $annot_obj_id;
+					}
+				}
+			}
+		} // end for each page
+	}
+
+	/**
+	 * Put appearance streams XObject used to define annotation's appearance states.
+	 * @param $w (int) annotation width
+	 * @param $h (int) annotation height
+	 * @param $stream (string) appearance stream
+	 * @return int object ID
+	 * @protected
+	 * @since 4.8.001 (2009-09-09)
+	 */
+	protected function _putAPXObject($w=0, $h=0, $stream='') {
+		$stream = trim($stream);
+		$out = $this->_getobj()."\n";
+		$this->xobjects['AX'.$this->n] = array('n' => $this->n);
+		$out .= '<<';
+		$out .= ' /Type /XObject';
+		$out .= ' /Subtype /Form';
+		$out .= ' /FormType 1';
+		if ($this->compress) {
+			$stream = gzcompress($stream);
+			$out .= ' /Filter /FlateDecode';
+		}
+		$rect = sprintf('%F %F', $w, $h);
+		$out .= ' /BBox [0 0 '.$rect.']';
+		$out .= ' /Matrix [1 0 0 1 0 0]';
+		$out .= ' /Resources 2 0 R';
+		$stream = $this->_getrawstream($stream);
+		$out .= ' /Length '.strlen($stream);
+		$out .= ' >>';
+		$out .= ' stream'."\n".$stream."\n".'endstream';
+		$out .= "\n".'endobj';
+		$this->_out($out);
+		return $this->n;
+	}
+
+	/**
+	 * Output fonts.
+	 * @author Nicola Asuni
+	 * @protected
+	 */
+	protected function _putfonts() {
+		$nf = $this->n;
+		foreach ($this->diffs as $diff) {
+			//Encodings
+			$this->_newobj();
+			$this->_out('<< /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.'] >>'."\n".'endobj');
+		}
+		$mqr = TCPDF_STATIC::get_mqr();
+		TCPDF_STATIC::set_mqr(false);
+		foreach ($this->FontFiles as $file => $info) {
+			// search and get font file to embedd
+			$fontfile = TCPDF_FONTS::getFontFullPath($file, $info['fontdir']);
+			if (!TCPDF_STATIC::empty_string($fontfile)) {
+				$font = file_get_contents($fontfile);
+				$compressed = (substr($file, -2) == '.z');
+				if ((!$compressed) AND (isset($info['length2']))) {
+					$header = (ord($font{0}) == 128);
+					if ($header) {
+						// strip first binary header
+						$font = substr($font, 6);
+					}
+					if ($header AND (ord($font[$info['length1']]) == 128)) {
+						// strip second binary header
+						$font = substr($font, 0, $info['length1']).substr($font, ($info['length1'] + 6));
+					}
+				} elseif ($info['subset'] AND ((!$compressed) OR ($compressed AND function_exists('gzcompress')))) {
+					if ($compressed) {
+						// uncompress font
+						$font = gzuncompress($font);
+					}
+					// merge subset characters
+					$subsetchars = array(); // used chars
+					foreach ($info['fontkeys'] as $fontkey) {
+						$fontinfo = $this->getFontBuffer($fontkey);
+						$subsetchars += $fontinfo['subsetchars'];
+					}
+					// rebuild a font subset
+					$font = TCPDF_FONTS::_getTrueTypeFontSubset($font, $subsetchars);
+					// calculate new font length
+					$info['length1'] = strlen($font);
+					if ($compressed) {
+						// recompress font
+						$font = gzcompress($font);
+					}
+				}
+				$this->_newobj();
+				$this->FontFiles[$file]['n'] = $this->n;
+				$stream = $this->_getrawstream($font);
+				$out = '<< /Length '.strlen($stream);
+				if ($compressed) {
+					$out .= ' /Filter /FlateDecode';
+				}
+				$out .= ' /Length1 '.$info['length1'];
+				if (isset($info['length2'])) {
+					$out .= ' /Length2 '.$info['length2'].' /Length3 0';
+				}
+				$out .= ' >>';
+				$out .= ' stream'."\n".$stream."\n".'endstream';
+				$out .= "\n".'endobj';
+				$this->_out($out);
+			}
+		}
+		TCPDF_STATIC::set_mqr($mqr);
+		foreach ($this->fontkeys as $k) {
+			//Font objects
+			$font = $this->getFontBuffer($k);
+			$type = $font['type'];
+			$name = $font['name'];
+			if ($type == 'core') {
+				// standard core font
+				$out = $this->_getobj($this->font_obj_ids[$k])."\n";
+				$out .= '<</Type /Font';
+				$out .= ' /Subtype /Type1';
+				$out .= ' /BaseFont /'.$name;
+				$out .= ' /Name /F'.$font['i'];
+				if ((strtolower($name) != 'symbol') AND (strtolower($name) != 'zapfdingbats')) {
+					$out .= ' /Encoding /WinAnsiEncoding';
+				}
+				if ($k == 'helvetica') {
+					// add default font for annotations
+					$this->annotation_fonts[$k] = $font['i'];
+				}
+				$out .= ' >>';
+				$out .= "\n".'endobj';
+				$this->_out($out);
+			} elseif (($type == 'Type1') OR ($type == 'TrueType')) {
+				// additional Type1 or TrueType font
+				$out = $this->_getobj($this->font_obj_ids[$k])."\n";
+				$out .= '<</Type /Font';
+				$out .= ' /Subtype /'.$type;
+				$out .= ' /BaseFont /'.$name;
+				$out .= ' /Name /F'.$font['i'];
+				$out .= ' /FirstChar 32 /LastChar 255';
+				$out .= ' /Widths '.($this->n + 1).' 0 R';
+				$out .= ' /FontDescriptor '.($this->n + 2).' 0 R';
+				if ($font['enc']) {
+					if (isset($font['diff'])) {
+						$out .= ' /Encoding '.($nf + $font['diff']).' 0 R';
+					} else {
+						$out .= ' /Encoding /WinAnsiEncoding';
+					}
+				}
+				$out .= ' >>';
+				$out .= "\n".'endobj';
+				$this->_out($out);
+				// Widths
+				$this->_newobj();
+				$s = '[';
+				for ($i = 32; $i < 256; ++$i) {
+					if (isset($font['cw'][$i])) {
+						$s .= $font['cw'][$i].' ';
+					} else {
+						$s .= $font['dw'].' ';
+					}
+				}
+				$s .= ']';
+				$s .= "\n".'endobj';
+				$this->_out($s);
+				//Descriptor
+				$this->_newobj();
+				$s = '<</Type /FontDescriptor /FontName /'.$name;
+				foreach ($font['desc'] as $fdk => $fdv) {
+					if (is_float($fdv)) {
+						$fdv = sprintf('%F', $fdv);
+					}
+					$s .= ' /'.$fdk.' '.$fdv.'';
+				}
+				if (!TCPDF_STATIC::empty_string($font['file'])) {
+					$s .= ' /FontFile'.($type == 'Type1' ? '' : '2').' '.$this->FontFiles[$font['file']]['n'].' 0 R';
+				}
+				$s .= '>>';
+				$s .= "\n".'endobj';
+				$this->_out($s);
+			} else {
+				// additional types
+				$mtd = '_put'.strtolower($type);
+				if (!method_exists($this, $mtd)) {
+					$this->Error('Unsupported font type: '.$type);
+				}
+				$this->$mtd($font);
+			}
+		}
+	}
+
+	/**
+	 * Adds unicode fonts.<br>
+	 * Based on PDF Reference 1.3 (section 5)
+	 * @param $font (array) font data
+	 * @protected
+	 * @author Nicola Asuni
+	 * @since 1.52.0.TC005 (2005-01-05)
+	 */
+	protected function _puttruetypeunicode($font) {
+		$fontname = '';
+		if ($font['subset']) {
+			// change name for font subsetting
+			$subtag = sprintf('%06u', $font['i']);
+			$subtag = strtr($subtag, '0123456789', 'ABCDEFGHIJ');
+			$fontname .= $subtag.'+';
+		}
+		$fontname .= $font['name'];
+		// Type0 Font
+		// A composite font composed of other fonts, organized hierarchically
+		$out = $this->_getobj($this->font_obj_ids[$font['fontkey']])."\n";
+		$out .= '<< /Type /Font';
+		$out .= ' /Subtype /Type0';
+		$out .= ' /BaseFont /'.$fontname;
+		$out .= ' /Name /F'.$font['i'];
+		$out .= ' /Encoding /'.$font['enc'];
+		$out .= ' /ToUnicode '.($this->n + 1).' 0 R';
+		$out .= ' /DescendantFonts ['.($this->n + 2).' 0 R]';
+		$out .= ' >>';
+		$out .= "\n".'endobj';
+		$this->_out($out);
+		// ToUnicode map for Identity-H
+		$stream = TCPDF_FONT_DATA::$uni_identity_h;
+		// ToUnicode Object
+		$this->_newobj();
+		$stream = ($this->compress) ? gzcompress($stream) : $stream;
+		$filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
+		$stream = $this->_getrawstream($stream);
+		$this->_out('<<'.$filter.'/Length '.strlen($stream).'>> stream'."\n".$stream."\n".'endstream'."\n".'endobj');
+		// CIDFontType2
+		// A CIDFont whose glyph descriptions are based on TrueType font technology
+		$oid = $this->_newobj();
+		$out = '<< /Type /Font';
+		$out .= ' /Subtype /CIDFontType2';
+		$out .= ' /BaseFont /'.$fontname;
+		// A dictionary containing entries that define the character collection of the CIDFont.
+		$cidinfo = '/Registry '.$this->_datastring($font['cidinfo']['Registry'], $oid);
+		$cidinfo .= ' /Ordering '.$this->_datastring($font['cidinfo']['Ordering'], $oid);
+		$cidinfo .= ' /Supplement '.$font['cidinfo']['Supplement'];
+		$out .= ' /CIDSystemInfo << '.$cidinfo.' >>';
+		$out .= ' /FontDescriptor '.($this->n + 1).' 0 R';
+		$out .= ' /DW '.$font['dw']; // default width
+		$out .= "\n".TCPDF_FONTS::_putfontwidths($font, 0);
+		if (isset($font['ctg']) AND (!TCPDF_STATIC::empty_string($font['ctg']))) {
+			$out .= "\n".'/CIDToGIDMap '.($this->n + 2).' 0 R';
+		}
+		$out .= ' >>';
+		$out .= "\n".'endobj';
+		$this->_out($out);
+		// Font descriptor
+		// A font descriptor describing the CIDFont default metrics other than its glyph widths
+		$this->_newobj();
+		$out = '<< /Type /FontDescriptor';
+		$out .= ' /FontName /'.$fontname;
+		foreach ($font['desc'] as $key => $value) {
+			if (is_float($value)) {
+				$value = sprintf('%F', $value);
+			}
+			$out .= ' /'.$key.' '.$value;
+		}
+		$fontdir = false;
+		if (!TCPDF_STATIC::empty_string($font['file'])) {
+			// A stream containing a TrueType font
+			$out .= ' /FontFile2 '.$this->FontFiles[$font['file']]['n'].' 0 R';
+			$fontdir = $this->FontFiles[$font['file']]['fontdir'];
+		}
+		$out .= ' >>';
+		$out .= "\n".'endobj';
+		$this->_out($out);
+		if (isset($font['ctg']) AND (!TCPDF_STATIC::empty_string($font['ctg']))) {
+			$this->_newobj();
+			// Embed CIDToGIDMap
+			// A specification of the mapping from CIDs to glyph indices
+			// search and get CTG font file to embedd
+			$ctgfile = strtolower($font['ctg']);
+			// search and get ctg font file to embedd
+			$fontfile = TCPDF_FONTS::getFontFullPath($ctgfile, $fontdir);
+			if (TCPDF_STATIC::empty_string($fontfile)) {
+				$this->Error('Font file not found: '.$ctgfile);
+			}
+			$stream = $this->_getrawstream(file_get_contents($fontfile));
+			$out = '<< /Length '.strlen($stream).'';
+			if (substr($fontfile, -2) == '.z') { // check file extension
+				// Decompresses data encoded using the public-domain
+				// zlib/deflate compression method, reproducing the
+				// original text or binary data
+				$out .= ' /Filter /FlateDecode';
+			}
+			$out .= ' >>';
+			$out .= ' stream'."\n".$stream."\n".'endstream';
+			$out .= "\n".'endobj';
+			$this->_out($out);
+		}
+	}
+
+	/**
+	 * Output CID-0 fonts.
+	 * A Type 0 CIDFont contains glyph descriptions based on the Adobe Type 1 font format
+	 * @param $font (array) font data
+	 * @protected
+	 * @author Andrew Whitehead, Nicola Asuni, Yukihiro Nakadaira
+	 * @since 3.2.000 (2008-06-23)
+	 */
+	protected function _putcidfont0($font) {
+		$cidoffset = 0;
+		if (!isset($font['cw'][1])) {
+			$cidoffset = 31;
+		}
+		if (isset($font['cidinfo']['uni2cid'])) {
+			// convert unicode to cid.
+			$uni2cid = $font['cidinfo']['uni2cid'];
+			$cw = array();
+			foreach ($font['cw'] as $uni => $width) {
+				if (isset($uni2cid[$uni])) {
+					$cw[($uni2cid[$uni] + $cidoffset)] = $width;
+				} elseif ($uni < 256) {
+					$cw[$uni] = $width;
+				} // else unknown character
+			}
+			$font = array_merge($font, array('cw' => $cw));
+		}
+		$name = $font['name'];
+		$enc = $font['enc'];
+		if ($enc) {
+			$longname = $name.'-'.$enc;
+		} else {
+			$longname = $name;
+		}
+		$out = $this->_getobj($this->font_obj_ids[$font['fontkey']])."\n";
+		$out .= '<</Type /Font';
+		$out .= ' /Subtype /Type0';
+		$out .= ' /BaseFont /'.$longname;
+		$out .= ' /Name /F'.$font['i'];
+		if ($enc) {
+			$out .= ' /Encoding /'.$enc;
+		}
+		$out .= ' /DescendantFonts ['.($this->n + 1).' 0 R]';
+		$out .= ' >>';
+		$out .= "\n".'endobj';
+		$this->_out($out);
+		$oid = $this->_newobj();
+		$out = '<</Type /Font';
+		$out .= ' /Subtype /CIDFontType0';
+		$out .= ' /BaseFont /'.$name;
+		$cidinfo = '/Registry '.$this->_datastring($font['cidinfo']['Registry'], $oid);
+		$cidinfo .= ' /Ordering '.$this->_datastring($font['cidinfo']['Ordering'], $oid);
+		$cidinfo .= ' /Supplement '.$font['cidinfo']['Supplement'];
+		$out .= ' /CIDSystemInfo <<'.$cidinfo.'>>';
+		$out .= ' /FontDescriptor '.($this->n + 1).' 0 R';
+		$out .= ' /DW '.$font['dw'];
+		$out .= "\n".TCPDF_FONTS::_putfontwidths($font, $cidoffset);
+		$out .= ' >>';
+		$out .= "\n".'endobj';
+		$this->_out($out);
+		$this->_newobj();
+		$s = '<</Type /FontDescriptor /FontName /'.$name;
+		foreach ($font['desc'] as $k => $v) {
+			if ($k != 'Style') {
+				if (is_float($v)) {
+					$v = sprintf('%F', $v);
+				}
+				$s .= ' /'.$k.' '.$v.'';
+			}
+		}
+		$s .= '>>';
+		$s .= "\n".'endobj';
+		$this->_out($s);
+	}
+
+	/**
+	 * Output images.
+	 * @protected
+	 */
+	protected function _putimages() {
+		$filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
+		foreach ($this->imagekeys as $file) {
+			$info = $this->getImageBuffer($file);
+			// set object for alternate images array
+			if ((!$this->pdfa_mode) AND isset($info['altimgs']) AND !empty($info['altimgs'])) {
+				$altoid = $this->_newobj();
+				$out = '[';
+				foreach ($info['altimgs'] as $altimage) {
+					if (isset($this->xobjects['I'.$altimage[0]]['n'])) {
+						$out .= ' << /Image '.$this->xobjects['I'.$altimage[0]]['n'].' 0 R';
+						$out .= ' /DefaultForPrinting';
+						if ($altimage[1] === true) {
+							$out .= ' true';
+						} else {
+							$out .= ' false';
+						}
+						$out .= ' >>';
+					}
+				}
+				$out .= ' ]';
+				$out .= "\n".'endobj';
+				$this->_out($out);
+			}
+			// set image object
+			$oid = $this->_newobj();
+			$this->xobjects['I'.$info['i']] = array('n' => $oid);
+			$this->setImageSubBuffer($file, 'n', $this->n);
+			$out = '<</Type /XObject';
+			$out .= ' /Subtype /Image';
+			$out .= ' /Width '.$info['w'];
+			$out .= ' /Height '.$info['h'];
+			if (array_key_exists('masked', $info)) {
+				$out .= ' /SMask '.($this->n - 1).' 0 R';
+			}
+			// set color space
+			$icc = false;
+			if (isset($info['icc']) AND ($info['icc'] !== false)) {
+				// ICC Colour Space
+				$icc = true;
+				$out .= ' /ColorSpace [/ICCBased '.($this->n + 1).' 0 R]';
+			} elseif ($info['cs'] == 'Indexed') {
+				// Indexed Colour Space
+				$out .= ' /ColorSpace [/Indexed /DeviceRGB '.((strlen($info['pal']) / 3) - 1).' '.($this->n + 1).' 0 R]';
+			} else {
+				// Device Colour Space
+				$out .= ' /ColorSpace /'.$info['cs'];
+			}
+			if ($info['cs'] == 'DeviceCMYK') {
+				$out .= ' /Decode [1 0 1 0 1 0 1 0]';
+			}
+			$out .= ' /BitsPerComponent '.$info['bpc'];
+			if (isset($altoid) AND ($altoid > 0)) {
+				// reference to alternate images dictionary
+				$out .= ' /Alternates '.$altoid.' 0 R';
+			}
+			if (isset($info['exurl']) AND !empty($info['exurl'])) {
+				// external stream
+				$out .= ' /Length 0';
+				$out .= ' /F << /FS /URL /F '.$this->_datastring($info['exurl'], $oid).' >>';
+				if (isset($info['f'])) {
+					$out .= ' /FFilter /'.$info['f'];
+				}
+				$out .= ' >>';
+				$out .= ' stream'."\n".'endstream';
+			} else {
+				if (isset($info['f'])) {
+					$out .= ' /Filter /'.$info['f'];
+				}
+				if (isset($info['parms'])) {
+					$out .= ' '.$info['parms'];
+				}
+				if (isset($info['trns']) AND is_array($info['trns'])) {
+					$trns = '';
+					$count_info = count($info['trns']);
+					for ($i=0; $i < $count_info; ++$i) {
+						$trns .= $info['trns'][$i].' '.$info['trns'][$i].' ';
+					}
+					$out .= ' /Mask ['.$trns.']';
+				}
+				$stream = $this->_getrawstream($info['data']);
+				$out .= ' /Length '.strlen($stream).' >>';
+				$out .= ' stream'."\n".$stream."\n".'endstream';
+			}
+			$out .= "\n".'endobj';
+			$this->_out($out);
+			if ($icc) {
+				// ICC colour profile
+				$this->_newobj();
+				$icc = ($this->compress) ? gzcompress($info['icc']) : $info['icc'];
+				$icc = $this->_getrawstream($icc);
+				$this->_out('<</N '.$info['ch'].' /Alternate /'.$info['cs'].' '.$filter.'/Length '.strlen($icc).'>> stream'."\n".$icc."\n".'endstream'."\n".'endobj');
+			} elseif ($info['cs'] == 'Indexed') {
+				// colour palette
+				$this->_newobj();
+				$pal = ($this->compress) ? gzcompress($info['pal']) : $info['pal'];
+				$pal = $this->_getrawstream($pal);
+				$this->_out('<<'.$filter.'/Length '.strlen($pal).'>> stream'."\n".$pal."\n".'endstream'."\n".'endobj');
+			}
+		}
+	}
+
+	/**
+	 * Output Form XObjects Templates.
+	 * @author Nicola Asuni
+	 * @since 5.8.017 (2010-08-24)
+	 * @protected
+	 * @see startTemplate(), endTemplate(), printTemplate()
+	 */
+	protected function _putxobjects() {
+		foreach ($this->xobjects as $key => $data) {
+			if (isset($data['outdata'])) {
+				$stream = str_replace($this->epsmarker, '', trim($data['outdata']));
+				$out = $this->_getobj($data['n'])."\n";
+				$out .= '<<';
+				$out .= ' /Type /XObject';
+				$out .= ' /Subtype /Form';
+				$out .= ' /FormType 1';
+				if ($this->compress) {
+					$stream = gzcompress($stream);
+					$out .= ' /Filter /FlateDecode';
+				}
+				$out .= sprintf(' /BBox [%F %F %F %F]', ($data['x'] * $this->k), (-$data['y'] * $this->k), (($data['w'] + $data['x']) * $this->k), (($data['h'] - $data['y']) * $this->k));
+				$out .= ' /Matrix [1 0 0 1 0 0]';
+				$out .= ' /Resources <<';
+				$out .= ' /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]';
+				if (!$this->pdfa_mode) {
+					// transparency
+					if (isset($data['extgstates']) AND !empty($data['extgstates'])) {
+						$out .= ' /ExtGState <<';
+						foreach ($data['extgstates'] as $k => $extgstate) {
+							if (isset($this->extgstates[$k]['name'])) {
+								$out .= ' /'.$this->extgstates[$k]['name'];
+							} else {
+								$out .= ' /GS'.$k;
+							}
+							$out .= ' '.$this->extgstates[$k]['n'].' 0 R';
+						}
+						$out .= ' >>';
+					}
+					if (isset($data['gradients']) AND !empty($data['gradients'])) {
+						$gp = '';
+						$gs = '';
+						foreach ($data['gradients'] as $id => $grad) {
+							// gradient patterns
+							$gp .= ' /p'.$id.' '.$this->gradients[$id]['pattern'].' 0 R';
+							// gradient shadings
+							$gs .= ' /Sh'.$id.' '.$this->gradients[$id]['id'].' 0 R';
+						}
+						$out .= ' /Pattern <<'.$gp.' >>';
+						$out .= ' /Shading <<'.$gs.' >>';
+					}
+				}
+				// spot colors
+				if (isset($data['spot_colors']) AND !empty($data['spot_colors'])) {
+					$out .= ' /ColorSpace <<';
+					foreach ($data['spot_colors'] as $name => $color) {
+						$out .= ' /CS'.$color['i'].' '.$this->spot_colors[$name]['n'].' 0 R';
+					}
+					$out .= ' >>';
+				}
+				// fonts
+				if (!empty($data['fonts'])) {
+					$out .= ' /Font <<';
+					foreach ($data['fonts'] as $fontkey => $fontid) {
+						$out .= ' /F'.$fontid.' '.$this->font_obj_ids[$fontkey].' 0 R';
+					}
+					$out .= ' >>';
+				}
+				// images or nested xobjects
+				if (!empty($data['images']) OR !empty($data['xobjects'])) {
+					$out .= ' /XObject <<';
+					foreach ($data['images'] as $imgid) {
+						$out .= ' /I'.$imgid.' '.$this->xobjects['I'.$imgid]['n'].' 0 R';
+					}
+					foreach ($data['xobjects'] as $sub_id => $sub_objid) {
+						$out .= ' /'.$sub_id.' '.$sub_objid['n'].' 0 R';
+					}
+					$out .= ' >>';
+				}
+				$out .= ' >>'; //end resources
+				if (isset($data['group']) AND ($data['group'] !== false)) {
+					// set transparency group
+					$out .= ' /Group << /Type /Group /S /Transparency';
+					if (is_array($data['group'])) {
+						if (isset($data['group']['CS']) AND !empty($data['group']['CS'])) {
+							$out .= ' /CS /'.$data['group']['CS'];
+						}
+						if (isset($data['group']['I'])) {
+							$out .= ' /I /'.($data['group']['I']===true?'true':'false');
+						}
+						if (isset($data['group']['K'])) {
+							$out .= ' /K /'.($data['group']['K']===true?'true':'false');
+						}
+					}
+					$out .= ' >>';
+				}
+				$stream = $this->_getrawstream($stream, $data['n']);
+				$out .= ' /Length '.strlen($stream);
+				$out .= ' >>';
+				$out .= ' stream'."\n".$stream."\n".'endstream';
+				$out .= "\n".'endobj';
+				$this->_out($out);
+			}
+		}
+	}
+
+	/**
+	 * Output Spot Colors Resources.
+	 * @protected
+	 * @since 4.0.024 (2008-09-12)
+	 */
+	protected function _putspotcolors() {
+		foreach ($this->spot_colors as $name => $color) {
+			$this->_newobj();
+			$this->spot_colors[$name]['n'] = $this->n;
+			$out = '[/Separation /'.str_replace(' ', '#20', $name);
+			$out .= ' /DeviceCMYK <<';
+			$out .= ' /Range [0 1 0 1 0 1 0 1] /C0 [0 0 0 0]';
+			$out .= ' '.sprintf('/C1 [%F %F %F %F] ', ($color['C'] / 100), ($color['M'] / 100), ($color['Y'] / 100), ($color['K'] / 100));
+			$out .= ' /FunctionType 2 /Domain [0 1] /N 1>>]';
+			$out .= "\n".'endobj';
+			$this->_out($out);
+		}
+	}
+
+	/**
+	 * Return XObjects Dictionary.
+	 * @return string XObjects dictionary
+	 * @protected
+	 * @since 5.8.014 (2010-08-23)
+	 */
+	protected function _getxobjectdict() {
+		$out = '';
+		foreach ($this->xobjects as $id => $objid) {
+			$out .= ' /'.$id.' '.$objid['n'].' 0 R';
+		}
+		return $out;
+	}
+
+	/**
+	 * Output Resources Dictionary.
+	 * @protected
+	 */
+	protected function _putresourcedict() {
+		$out = $this->_getobj(2)."\n";
+		$out .= '<< /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]';
+		$out .= ' /Font <<';
+		foreach ($this->fontkeys as $fontkey) {
+			$font = $this->getFontBuffer($fontkey);
+			$out .= ' /F'.$font['i'].' '.$font['n'].' 0 R';
+		}
+		$out .= ' >>';
+		$out .= ' /XObject <<';
+		$out .= $this->_getxobjectdict();
+		$out .= ' >>';
+		// layers
+		if (!empty($this->pdflayers)) {
+			$out .= ' /Properties <<';
+			foreach ($this->pdflayers as $layer) {
+				$out .= ' /'.$layer['layer'].' '.$layer['objid'].' 0 R';
+			}
+			$out .= ' >>';
+		}
+		if (!$this->pdfa_mode) {
+			// transparency
+			if (isset($this->extgstates) AND !empty($this->extgstates)) {
+				$out .= ' /ExtGState <<';
+				foreach ($this->extgstates as $k => $extgstate) {
+					if (isset($extgstate['name'])) {
+						$out .= ' /'.$extgstate['name'];
+					} else {
+						$out .= ' /GS'.$k;
+					}
+					$out .= ' '.$extgstate['n'].' 0 R';
+				}
+				$out .= ' >>';
+			}
+			if (isset($this->gradients) AND !empty($this->gradients)) {
+				$gp = '';
+				$gs = '';
+				foreach ($this->gradients as $id => $grad) {
+					// gradient patterns
+					$gp .= ' /p'.$id.' '.$grad['pattern'].' 0 R';
+					// gradient shadings
+					$gs .= ' /Sh'.$id.' '.$grad['id'].' 0 R';
+				}
+				$out .= ' /Pattern <<'.$gp.' >>';
+				$out .= ' /Shading <<'.$gs.' >>';
+			}
+		}
+		// spot colors
+		if (isset($this->spot_colors) AND !empty($this->spot_colors)) {
+			$out .= ' /ColorSpace <<';
+			foreach ($this->spot_colors as $color) {
+				$out .= ' /CS'.$color['i'].' '.$color['n'].' 0 R';
+			}
+			$out .= ' >>';
+		}
+		$out .= ' >>';
+		$out .= "\n".'endobj';
+		$this->_out($out);
+	}
+
+	/**
+	 * Output Resources.
+	 * @protected
+	 */
+	protected function _putresources() {
+		$this->_putextgstates();
+		$this->_putocg();
+		$this->_putfonts();
+		$this->_putimages();
+		$this->_putspotcolors();
+		$this->_putshaders();
+		$this->_putxobjects();
+		$this->_putresourcedict();
+		$this->_putdests();
+		$this->_putEmbeddedFiles();
+		$this->_putannotsobjs();
+		$this->_putjavascript();
+		$this->_putbookmarks();
+		$this->_putencryption();
+	}
+
+	/**
+	 * Adds some Metadata information (Document Information Dictionary)
+	 * (see Chapter 14.3.3 Document Information Dictionary of PDF32000_2008.pdf Reference)
+	 * @return int object id
+	 * @protected
+	 */
+	protected function _putinfo() {
+		$oid = $this->_newobj();
+		$out = '<<';
+		// store current isunicode value
+		$prev_isunicode = $this->isunicode;
+		if ($this->docinfounicode) {
+			$this->isunicode = true;
+		}
+		if (!TCPDF_STATIC::empty_string($this->title)) {
+			// The document's title.
+			$out .= ' /Title '.$this->_textstring($this->title, $oid);
+		}
+		if (!TCPDF_STATIC::empty_string($this->author)) {
+			// The name of the person who created the document.
+			$out .= ' /Author '.$this->_textstring($this->author, $oid);
+		}
+		if (!TCPDF_STATIC::empty_string($this->subject)) {
+			// The subject of the document.
+			$out .= ' /Subject '.$this->_textstring($this->subject, $oid);
+		}
+		if (!TCPDF_STATIC::empty_string($this->keywords)) {
+			// Keywords associated with the document.
+			$out .= ' /Keywords '.$this->_textstring($this->keywords.' TCPDF', $oid);
+		}
+		if (!TCPDF_STATIC::empty_string($this->creator)) {
+			// If the document was converted to PDF from another format, the name of the conforming product that created the original document from which it was converted.
+			$out .= ' /Creator '.$this->_textstring($this->creator, $oid);
+		}
+		// restore previous isunicode value
+		$this->isunicode = $prev_isunicode;
+		// default producer
+		$out .= ' /Producer '.$this->_textstring(TCPDF_STATIC::getTCPDFProducer(), $oid);
+		// The date and time the document was created, in human-readable form
+		$out .= ' /CreationDate '.$this->_datestring(0, $this->doc_creation_timestamp);
+		// The date and time the document was most recently modified, in human-readable form
+		$out .= ' /ModDate '.$this->_datestring(0, $this->doc_modification_timestamp);
+		// A name object indicating whether the document has been modified to include trapping information
+		$out .= ' /Trapped /False';
+		$out .= ' >>';
+		$out .= "\n".'endobj';
+		$this->_out($out);
+		return $oid;
+	}
+
+	/**
+	 * Set additional XMP data to be added on the default XMP data just before the end of "x:xmpmeta" tag.
+	 * IMPORTANT: This data is added as-is without controls, so you have to validate your data before using this method!
+	 * @param $xmp (string) Custom XMP data.
+	 * @since 5.9.128 (2011-10-06)
+	 * @public
+	 */
+	public function setExtraXMP($xmp) {
+		$this->custom_xmp = $xmp;
+	}
+
+	/**
+	 * Put XMP data object and return ID.
+	 * @return (int) The object ID.
+	 * @since 5.9.121 (2011-09-28)
+	 * @protected
+	 */
+	protected function _putXMP() {
+		$oid = $this->_newobj();
+		// store current isunicode value
+		$prev_isunicode = $this->isunicode;
+		$this->isunicode = true;
+		$prev_encrypted = $this->encrypted;
+		$this->encrypted = false;
+		// set XMP data
+		$xmp = '<?xpacket begin="'.TCPDF_FONTS::unichr(0xfeff, $this->isunicode).'" id="W5M0MpCehiHzreSzNTczkc9d"?>'."\n";
+		$xmp .= '<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:08:04">'."\n";
+		$xmp .= "\t".'<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">'."\n";
+		$xmp .= "\t\t".'<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">'."\n";
+		$xmp .= "\t\t\t".'<dc:format>application/pdf</dc:format>'."\n";
+		$xmp .= "\t\t\t".'<dc:title>'."\n";
+		$xmp .= "\t\t\t\t".'<rdf:Alt>'."\n";
+		$xmp .= "\t\t\t\t\t".'<rdf:li xml:lang="x-default">'.TCPDF_STATIC::_escapeXML($this->title).'</rdf:li>'."\n";
+		$xmp .= "\t\t\t\t".'</rdf:Alt>'."\n";
+		$xmp .= "\t\t\t".'</dc:title>'."\n";
+		$xmp .= "\t\t\t".'<dc:creator>'."\n";
+		$xmp .= "\t\t\t\t".'<rdf:Seq>'."\n";
+		$xmp .= "\t\t\t\t\t".'<rdf:li>'.TCPDF_STATIC::_escapeXML($this->author).'</rdf:li>'."\n";
+		$xmp .= "\t\t\t\t".'</rdf:Seq>'."\n";
+		$xmp .= "\t\t\t".'</dc:creator>'."\n";
+		$xmp .= "\t\t\t".'<dc:description>'."\n";
+		$xmp .= "\t\t\t\t".'<rdf:Alt>'."\n";
+		$xmp .= "\t\t\t\t\t".'<rdf:li xml:lang="x-default">'.TCPDF_STATIC::_escapeXML($this->subject).'</rdf:li>'."\n";
+		$xmp .= "\t\t\t\t".'</rdf:Alt>'."\n";
+		$xmp .= "\t\t\t".'</dc:description>'."\n";
+		$xmp .= "\t\t\t".'<dc:subject>'."\n";
+		$xmp .= "\t\t\t\t".'<rdf:Bag>'."\n";
+		$xmp .= "\t\t\t\t\t".'<rdf:li>'.TCPDF_STATIC::_escapeXML($this->keywords).' TCPDF</rdf:li>'."\n";
+		$xmp .= "\t\t\t\t".'</rdf:Bag>'."\n";
+		$xmp .= "\t\t\t".'</dc:subject>'."\n";
+		$xmp .= "\t\t".'</rdf:Description>'."\n";
+		// convert doc creation date format
+		$dcdate = TCPDF_STATIC::getFormattedDate($this->doc_creation_timestamp);
+		$doccreationdate = substr($dcdate, 0, 4).'-'.substr($dcdate, 4, 2).'-'.substr($dcdate, 6, 2);
+		$doccreationdate .= 'T'.substr($dcdate, 8, 2).':'.substr($dcdate, 10, 2).':'.substr($dcdate, 12, 2);
+		$doccreationdate .= '+'.substr($dcdate, 15, 2).':'.substr($dcdate, 18, 2);
+		$doccreationdate = TCPDF_STATIC::_escapeXML($doccreationdate);
+		// convert doc modification date format
+		$dmdate = TCPDF_STATIC::getFormattedDate($this->doc_modification_timestamp);
+		$docmoddate = substr($dmdate, 0, 4).'-'.substr($dmdate, 4, 2).'-'.substr($dmdate, 6, 2);
+		$docmoddate .= 'T'.substr($dmdate, 8, 2).':'.substr($dmdate, 10, 2).':'.substr($dmdate, 12, 2);
+		$docmoddate .= '+'.substr($dmdate, 15, 2).':'.substr($dmdate, 18, 2);
+		$docmoddate = TCPDF_STATIC::_escapeXML($docmoddate);
+		$xmp .= "\t\t".'<rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/">'."\n";
+		$xmp .= "\t\t\t".'<xmp:CreateDate>'.$doccreationdate.'</xmp:CreateDate>'."\n";
+		$xmp .= "\t\t\t".'<xmp:CreatorTool>'.$this->creator.'</xmp:CreatorTool>'."\n";
+		$xmp .= "\t\t\t".'<xmp:ModifyDate>'.$docmoddate.'</xmp:ModifyDate>'."\n";
+		$xmp .= "\t\t\t".'<xmp:MetadataDate>'.$doccreationdate.'</xmp:MetadataDate>'."\n";
+		$xmp .= "\t\t".'</rdf:Description>'."\n";
+		$xmp .= "\t\t".'<rdf:Description rdf:about="" xmlns:pdf="http://ns.adobe.com/pdf/1.3/">'."\n";
+		$xmp .= "\t\t\t".'<pdf:Keywords>'.TCPDF_STATIC::_escapeXML($this->keywords).' TCPDF</pdf:Keywords>'."\n";
+		$xmp .= "\t\t\t".'<pdf:Producer>'.TCPDF_STATIC::_escapeXML(TCPDF_STATIC::getTCPDFProducer()).'</pdf:Producer>'."\n";
+		$xmp .= "\t\t".'</rdf:Description>'."\n";
+		$xmp .= "\t\t".'<rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">'."\n";
+		$uuid = 'uuid:'.substr($this->file_id, 0, 8).'-'.substr($this->file_id, 8, 4).'-'.substr($this->file_id, 12, 4).'-'.substr($this->file_id, 16, 4).'-'.substr($this->file_id, 20, 12);
+		$xmp .= "\t\t\t".'<xmpMM:DocumentID>'.$uuid.'</xmpMM:DocumentID>'."\n";
+		$xmp .= "\t\t\t".'<xmpMM:InstanceID>'.$uuid.'</xmpMM:InstanceID>'."\n";
+		$xmp .= "\t\t".'</rdf:Description>'."\n";
+		if ($this->pdfa_mode) {
+			$xmp .= "\t\t".'<rdf:Description rdf:about="" xmlns:pdfaid="http://www.aiim.org/pdfa/ns/id/">'."\n";
+			$xmp .= "\t\t\t".'<pdfaid:part>1</pdfaid:part>'."\n";
+			$xmp .= "\t\t\t".'<pdfaid:conformance>B</pdfaid:conformance>'."\n";
+			$xmp .= "\t\t".'</rdf:Description>'."\n";
+		}
+		// XMP extension schemas
+		$xmp .= "\t\t".'<rdf:Description rdf:about="" xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/" xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema#" xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#">'."\n";
+		$xmp .= "\t\t\t".'<pdfaExtension:schemas>'."\n";
+		$xmp .= "\t\t\t\t".'<rdf:Bag>'."\n";
+		$xmp .= "\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n";
+		$xmp .= "\t\t\t\t\t\t".'<pdfaSchema:namespaceURI>http://ns.adobe.com/pdf/1.3/</pdfaSchema:namespaceURI>'."\n";
+		$xmp .= "\t\t\t\t\t\t".'<pdfaSchema:prefix>pdf</pdfaSchema:prefix>'."\n";
+		$xmp .= "\t\t\t\t\t\t".'<pdfaSchema:schema>Adobe PDF Schema</pdfaSchema:schema>'."\n";
+		$xmp .= "\t\t\t\t\t".'</rdf:li>'."\n";
+		$xmp .= "\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n";
+		$xmp .= "\t\t\t\t\t\t".'<pdfaSchema:namespaceURI>http://ns.adobe.com/xap/1.0/mm/</pdfaSchema:namespaceURI>'."\n";
+		$xmp .= "\t\t\t\t\t\t".'<pdfaSchema:prefix>xmpMM</pdfaSchema:prefix>'."\n";
+		$xmp .= "\t\t\t\t\t\t".'<pdfaSchema:schema>XMP Media Management Schema</pdfaSchema:schema>'."\n";
+		$xmp .= "\t\t\t\t\t\t".'<pdfaSchema:property>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t".'<rdf:Seq>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:category>internal</pdfaProperty:category>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:description>UUID based identifier for specific incarnation of a document</pdfaProperty:description>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:name>InstanceID</pdfaProperty:name>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:valueType>URI</pdfaProperty:valueType>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t".'</rdf:li>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t".'</rdf:Seq>'."\n";
+		$xmp .= "\t\t\t\t\t\t".'</pdfaSchema:property>'."\n";
+		$xmp .= "\t\t\t\t\t".'</rdf:li>'."\n";
+		$xmp .= "\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n";
+		$xmp .= "\t\t\t\t\t\t".'<pdfaSchema:namespaceURI>http://www.aiim.org/pdfa/ns/id/</pdfaSchema:namespaceURI>'."\n";
+		$xmp .= "\t\t\t\t\t\t".'<pdfaSchema:prefix>pdfaid</pdfaSchema:prefix>'."\n";
+		$xmp .= "\t\t\t\t\t\t".'<pdfaSchema:schema>PDF/A ID Schema</pdfaSchema:schema>'."\n";
+		$xmp .= "\t\t\t\t\t\t".'<pdfaSchema:property>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t".'<rdf:Seq>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:category>internal</pdfaProperty:category>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:description>Part of PDF/A standard</pdfaProperty:description>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:name>part</pdfaProperty:name>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:valueType>Integer</pdfaProperty:valueType>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t".'</rdf:li>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:category>internal</pdfaProperty:category>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:description>Amendment of PDF/A standard</pdfaProperty:description>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:name>amd</pdfaProperty:name>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:valueType>Text</pdfaProperty:valueType>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t".'</rdf:li>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:category>internal</pdfaProperty:category>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:description>Conformance level of PDF/A standard</pdfaProperty:description>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:name>conformance</pdfaProperty:name>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:valueType>Text</pdfaProperty:valueType>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t\t".'</rdf:li>'."\n";
+		$xmp .= "\t\t\t\t\t\t\t".'</rdf:Seq>'."\n";
+		$xmp .= "\t\t\t\t\t\t".'</pdfaSchema:property>'."\n";
+		$xmp .= "\t\t\t\t\t".'</rdf:li>'."\n";
+		$xmp .= "\t\t\t\t".'</rdf:Bag>'."\n";
+		$xmp .= "\t\t\t".'</pdfaExtension:schemas>'."\n";
+		$xmp .= "\t\t".'</rdf:Description>'."\n";
+		$xmp .= "\t".'</rdf:RDF>'."\n";
+		$xmp .= $this->custom_xmp;
+		$xmp .= '</x:xmpmeta>'."\n";
+		$xmp .= '<?xpacket end="w"?>';
+		$out = '<< /Type /Metadata /Subtype /XML /Length '.strlen($xmp).' >> stream'."\n".$xmp."\n".'endstream'."\n".'endobj';
+		// restore previous isunicode value
+		$this->isunicode = $prev_isunicode;
+		$this->encrypted = $prev_encrypted;
+		$this->_out($out);
+		return $oid;
+	}
+
+	/**
+	 * Output Catalog.
+	 * @return int object id
+	 * @protected
+	 */
+	protected function _putcatalog() {
+		// put XMP
+		$xmpobj = $this->_putXMP();
+		// if required, add standard sRGB_IEC61966-2.1 blackscaled ICC colour profile
+		if ($this->pdfa_mode OR $this->force_srgb) {
+			$iccobj = $this->_newobj();
+			$icc = file_get_contents(dirname(__FILE__).'/include/sRGB.icc');
+			$filter = '';
+			if ($this->compress) {
+				$filter = ' /Filter /FlateDecode';
+				$icc = gzcompress($icc);
+			}
+			$icc = $this->_getrawstream($icc);
+			$this->_out('<</N 3 '.$filter.'/Length '.strlen($icc).'>> stream'."\n".$icc."\n".'endstream'."\n".'endobj');
+		}
+		// start catalog
+		$oid = $this->_newobj();
+		$out = '<< /Type /Catalog';
+		$out .= ' /Version /'.$this->PDFVersion;
+		//$out .= ' /Extensions <<>>';
+		$out .= ' /Pages 1 0 R';
+		//$out .= ' /PageLabels ' //...;
+		$out .= ' /Names <<';
+		if ((!$this->pdfa_mode) AND !empty($this->n_js)) {
+			$out .= ' /JavaScript '.$this->n_js;
+		}
+		if (!empty($this->efnames)) {
+			$out .= ' /EmbeddedFiles <</Names [';
+			foreach ($this->efnames AS $fn => $fref) {
+				$out .= ' '.$this->_datastring($fn).' '.$fref;
+			}
+			$out .= ' ]>>';
+		}
+		$out .= ' >>';
+		if (!empty($this->dests)) {
+			$out .= ' /Dests '.($this->n_dests).' 0 R';
+		}
+		$out .= $this->_putviewerpreferences();
+		if (isset($this->LayoutMode) AND (!TCPDF_STATIC::empty_string($this->LayoutMode))) {
+			$out .= ' /PageLayout /'.$this->LayoutMode;
+		}
+		if (isset($this->PageMode) AND (!TCPDF_STATIC::empty_string($this->PageMode))) {
+			$out .= ' /PageMode /'.$this->PageMode;
+		}
+		if (count($this->outlines) > 0) {
+			$out .= ' /Outlines '.$this->OutlineRoot.' 0 R';
+			$out .= ' /PageMode /UseOutlines';
+		}
+		//$out .= ' /Threads []';
+		if ($this->ZoomMode == 'fullpage') {
+			$out .= ' /OpenAction ['.$this->page_obj_id[1].' 0 R /Fit]';
+		} elseif ($this->ZoomMode == 'fullwidth') {
+			$out .= ' /OpenAction ['.$this->page_obj_id[1].' 0 R /FitH null]';
+		} elseif ($this->ZoomMode == 'real') {
+			$out .= ' /OpenAction ['.$this->page_obj_id[1].' 0 R /XYZ null null 1]';
+		} elseif (!is_string($this->ZoomMode)) {
+			$out .= sprintf(' /OpenAction ['.$this->page_obj_id[1].' 0 R /XYZ null null %F]', ($this->ZoomMode / 100));
+		}
+		//$out .= ' /AA <<>>';
+		//$out .= ' /URI <<>>';
+		$out .= ' /Metadata '.$xmpobj.' 0 R';
+		//$out .= ' /StructTreeRoot <<>>';
+		//$out .= ' /MarkInfo <<>>';
+		if (isset($this->l['a_meta_language'])) {
+			$out .= ' /Lang '.$this->_textstring($this->l['a_meta_language'], $oid);
+		}
+		//$out .= ' /SpiderInfo <<>>';
+		// set OutputIntent to sRGB IEC61966-2.1 if required
+		if ($this->pdfa_mode OR $this->force_srgb) {
+			$out .= ' /OutputIntents [<<';
+			$out .= ' /Type /OutputIntent';
+			$out .= ' /S /GTS_PDFA1';
+			$out .= ' /OutputCondition '.$this->_textstring('sRGB IEC61966-2.1', $oid);
+			$out .= ' /OutputConditionIdentifier '.$this->_textstring('sRGB IEC61966-2.1', $oid);
+			$out .= ' /RegistryName '.$this->_textstring('http://www.color.org', $oid);
+			$out .= ' /Info '.$this->_textstring('sRGB IEC61966-2.1', $oid);
+			$out .= ' /DestOutputProfile '.$iccobj.' 0 R';
+			$out .= ' >>]';
+		}
+		//$out .= ' /PieceInfo <<>>';
+		if (!empty($this->pdflayers)) {
+			$lyrobjs = '';
+			$lyrobjs_print = '';
+			$lyrobjs_view = '';
+			foreach ($this->pdflayers as $layer) {
+				$lyrobjs .= ' '.$layer['objid'].' 0 R';
+				if ($layer['print']) {
+					$lyrobjs_print .= ' '.$layer['objid'].' 0 R';
+				}
+				if ($layer['view']) {
+					$lyrobjs_view .= ' '.$layer['objid'].' 0 R';
+				}
+			}
+			$out .= ' /OCProperties << /OCGs ['.$lyrobjs.']';
+			$out .= ' /D <<';
+			$out .= ' /Name '.$this->_textstring('Layers', $oid);
+			$out .= ' /Creator '.$this->_textstring('TCPDF', $oid);
+			$out .= ' /BaseState /ON';
+			$out .= ' /ON ['.$lyrobjs_print.']';
+			$out .= ' /OFF ['.$lyrobjs_view.']';
+			$out .= ' /Intent /View';
+			$out .= ' /AS [';
+			$out .= ' << /Event /Print /OCGs ['.$lyrobjs.'] /Category [/Print] >>';
+			$out .= ' << /Event /View /OCGs ['.$lyrobjs.'] /Category [/View] >>';
+			$out .= ' ]';
+			$out .= ' /Order ['.$lyrobjs.']';
+			$out .= ' /ListMode /AllPages';
+			//$out .= ' /RBGroups ['..']';
+			//$out .= ' /Locked ['..']';
+			$out .= ' >>';
+			$out .= ' >>';
+		}
+		// AcroForm
+		if (!empty($this->form_obj_id)
+			OR ($this->sign AND isset($this->signature_data['cert_type']))
+			OR !empty($this->empty_signature_appearance)) {
+			$out .= ' /AcroForm <<';
+			$objrefs = '';
+			if ($this->sign AND isset($this->signature_data['cert_type'])) {
+				// set reference for signature object
+				$objrefs .= $this->sig_obj_id.' 0 R';
+			}
+			if (!empty($this->empty_signature_appearance)) {
+				foreach ($this->empty_signature_appearance as $esa) {
+					// set reference for empty signature objects
+					$objrefs .= ' '.$esa['objid'].' 0 R';
+				}
+			}
+			if (!empty($this->form_obj_id)) {
+				foreach($this->form_obj_id as $objid) {
+					$objrefs .= ' '.$objid.' 0 R';
+				}
+			}
+			$out .= ' /Fields ['.$objrefs.']';
+			// It's better to turn off this value and set the appearance stream for each annotation (/AP) to avoid conflicts with signature fields.
+			$out .= ' /NeedAppearances false';
+			if ($this->sign AND isset($this->signature_data['cert_type'])) {
+				if ($this->signature_data['cert_type'] > 0) {
+					$out .= ' /SigFlags 3';
+				} else {
+					$out .= ' /SigFlags 1';
+				}
+			}
+			//$out .= ' /CO ';
+			if (isset($this->annotation_fonts) AND !empty($this->annotation_fonts)) {
+				$out .= ' /DR <<';
+				$out .= ' /Font <<';
+				foreach ($this->annotation_fonts as $fontkey => $fontid) {
+					$out .= ' /F'.$fontid.' '.$this->font_obj_ids[$fontkey].' 0 R';
+				}
+				$out .= ' >> >>';
+			}
+			$font = $this->getFontBuffer('helvetica');
+			$out .= ' /DA (/F'.$font['i'].' 0 Tf 0 g)';
+			$out .= ' /Q '.(($this->rtl)?'2':'0');
+			//$out .= ' /XFA ';
+			$out .= ' >>';
+			// signatures
+			if ($this->sign AND isset($this->signature_data['cert_type'])) {
+				if ($this->signature_data['cert_type'] > 0) {
+					$out .= ' /Perms << /DocMDP '.($this->sig_obj_id + 1).' 0 R >>';
+				} else {
+					$out .= ' /Perms << /UR3 '.($this->sig_obj_id + 1).' 0 R >>';
+				}
+			}
+		}
+		//$out .= ' /Legal <<>>';
+		//$out .= ' /Requirements []';
+		//$out .= ' /Collection <<>>';
+		//$out .= ' /NeedsRendering true';
+		$out .= ' >>';
+		$out .= "\n".'endobj';
+		$this->_out($out);
+		return $oid;
+	}
+
+	/**
+	 * Output viewer preferences.
+	 * @return string for viewer preferences
+	 * @author Nicola asuni
+	 * @since 3.1.000 (2008-06-09)
+	 * @protected
+	 */
+	protected function _putviewerpreferences() {
+		$vp = $this->viewer_preferences;
+		$out = ' /ViewerPreferences <<';
+		if ($this->rtl) {
+			$out .= ' /Direction /R2L';
+		} else {
+			$out .= ' /Direction /L2R';
+		}
+		if (isset($vp['HideToolbar']) AND ($vp['HideToolbar'])) {
+			$out .= ' /HideToolbar true';
+		}
+		if (isset($vp['HideMenubar']) AND ($vp['HideMenubar'])) {
+			$out .= ' /HideMenubar true';
+		}
+		if (isset($vp['HideWindowUI']) AND ($vp['HideWindowUI'])) {
+			$out .= ' /HideWindowUI true';
+		}
+		if (isset($vp['FitWindow']) AND ($vp['FitWindow'])) {
+			$out .= ' /FitWindow true';
+		}
+		if (isset($vp['CenterWindow']) AND ($vp['CenterWindow'])) {
+			$out .= ' /CenterWindow true';
+		}
+		if (isset($vp['DisplayDocTitle']) AND ($vp['DisplayDocTitle'])) {
+			$out .= ' /DisplayDocTitle true';
+		}
+		if (isset($vp['NonFullScreenPageMode'])) {
+			$out .= ' /NonFullScreenPageMode /'.$vp['NonFullScreenPageMode'];
+		}
+		if (isset($vp['ViewArea'])) {
+			$out .= ' /ViewArea /'.$vp['ViewArea'];
+		}
+		if (isset($vp['ViewClip'])) {
+			$out .= ' /ViewClip /'.$vp['ViewClip'];
+		}
+		if (isset($vp['PrintArea'])) {
+			$out .= ' /PrintArea /'.$vp['PrintArea'];
+		}
+		if (isset($vp['PrintClip'])) {
+			$out .= ' /PrintClip /'.$vp['PrintClip'];
+		}
+		if (isset($vp['PrintScaling'])) {
+			$out .= ' /PrintScaling /'.$vp['PrintScaling'];
+		}
+		if (isset($vp['Duplex']) AND (!TCPDF_STATIC::empty_string($vp['Duplex']))) {
+			$out .= ' /Duplex /'.$vp['Duplex'];
+		}
+		if (isset($vp['PickTrayByPDFSize'])) {
+			if ($vp['PickTrayByPDFSize']) {
+				$out .= ' /PickTrayByPDFSize true';
+			} else {
+				$out .= ' /PickTrayByPDFSize false';
+			}
+		}
+		if (isset($vp['PrintPageRange'])) {
+			$PrintPageRangeNum = '';
+			foreach ($vp['PrintPageRange'] as $k => $v) {
+				$PrintPageRangeNum .= ' '.($v - 1).'';
+			}
+			$out .= ' /PrintPageRange ['.substr($PrintPageRangeNum,1).']';
+		}
+		if (isset($vp['NumCopies'])) {
+			$out .= ' /NumCopies '.intval($vp['NumCopies']);
+		}
+		$out .= ' >>';
+		return $out;
+	}
+
+	/**
+	 * Output PDF File Header (7.5.2).
+	 * @protected
+	 */
+	protected function _putheader() {
+		$this->_out('%PDF-'.$this->PDFVersion);
+		$this->_out('%'.chr(0xe2).chr(0xe3).chr(0xcf).chr(0xd3));
+	}
+
+	/**
+	 * Output end of document (EOF).
+	 * @protected
+	 */
+	protected function _enddoc() {
+		if (isset($this->CurrentFont['fontkey']) AND isset($this->CurrentFont['subsetchars'])) {
+			// save subset chars of the previous font
+			$this->setFontSubBuffer($this->CurrentFont['fontkey'], 'subsetchars', $this->CurrentFont['subsetchars']);
+		}
+		$this->state = 1;
+		$this->_putheader();
+		$this->_putpages();
+		$this->_putresources();
+		// empty signature fields
+		if (!empty($this->empty_signature_appearance)) {
+			foreach ($this->empty_signature_appearance as $key => $esa) {
+				// widget annotation for empty signature
+				$out = $this->_getobj($esa['objid'])."\n";
+				$out .= '<< /Type /Annot';
+				$out .= ' /Subtype /Widget';
+				$out .= ' /Rect ['.$esa['rect'].']';
+				$out .= ' /P '.$this->page_obj_id[($esa['page'])].' 0 R'; // link to signature appearance page
+				$out .= ' /F 4';
+				$out .= ' /FT /Sig';
+				$signame = $esa['name'].sprintf(' [%03d]', ($key + 1));
+				$out .= ' /T '.$this->_textstring($signame, $esa['objid']);
+				$out .= ' /Ff 0';
+				$out .= ' >>';
+				$out .= "\n".'endobj';
+				$this->_out($out);
+			}
+		}
+		// Signature
+		if ($this->sign AND isset($this->signature_data['cert_type'])) {
+			// widget annotation for signature
+			$out = $this->_getobj($this->sig_obj_id)."\n";
+			$out .= '<< /Type /Annot';
+			$out .= ' /Subtype /Widget';
+			$out .= ' /Rect ['.$this->signature_appearance['rect'].']';
+			$out .= ' /P '.$this->page_obj_id[($this->signature_appearance['page'])].' 0 R'; // link to signature appearance page
+			$out .= ' /F 4';
+			$out .= ' /FT /Sig';
+			$out .= ' /T '.$this->_textstring($this->signature_appearance['name'], $this->sig_obj_id);
+			$out .= ' /Ff 0';
+			$out .= ' /V '.($this->sig_obj_id + 1).' 0 R';
+			$out .= ' >>';
+			$out .= "\n".'endobj';
+			$this->_out($out);
+			// signature
+			$this->_putsignature();
+		}
+		// Info
+		$objid_info = $this->_putinfo();
+		// Catalog
+		$objid_catalog = $this->_putcatalog();
+		// Cross-ref
+		$o = $this->bufferlen;
+		// XREF section
+		$this->_out('xref');
+		$this->_out('0 '.($this->n + 1));
+		$this->_out('0000000000 65535 f ');
+		$freegen = ($this->n + 2);
+		for ($i=1; $i <= $this->n; ++$i) {
+			if (!isset($this->offsets[$i]) AND ($i > 1)) {
+				$this->_out(sprintf('0000000000 %05d f ', $freegen));
+				++$freegen;
+			} else {
+				$this->_out(sprintf('%010d 00000 n ', $this->offsets[$i]));
+			}
+		}
+		// TRAILER
+		$out = 'trailer'."\n";
+		$out .= '<<';
+		$out .= ' /Size '.($this->n + 1);
+		$out .= ' /Root '.$objid_catalog.' 0 R';
+		$out .= ' /Info '.$objid_info.' 0 R';
+		if ($this->encrypted) {
+			$out .= ' /Encrypt '.$this->encryptdata['objid'].' 0 R';
+		}
+		$out .= ' /ID [ <'.$this->file_id.'> <'.$this->file_id.'> ]';
+		$out .= ' >>';
+		$this->_out($out);
+		$this->_out('startxref');
+		$this->_out($o);
+		$this->_out('%%EOF');
+		$this->state = 3; // end-of-doc
+		if ($this->diskcache) {
+			// remove temporary files used for images
+			foreach ($this->imagekeys as $key) {
+				// remove temporary files
+				unlink($this->images[$key]);
+			}
+			foreach ($this->fontkeys as $key) {
+				// remove temporary files
+				unlink($this->fonts[$key]);
+			}
+		}
+	}
+
+	/**
+	 * Initialize a new page.
+	 * @param $orientation (string) page orientation. Possible values are (case insensitive):<ul><li>P or PORTRAIT (default)</li><li>L or LANDSCAPE</li></ul>
+	 * @param $format (mixed) The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat().
+	 * @protected
+	 * @see getPageSizeFromFormat(), setPageFormat()
+	 */
+	protected function _beginpage($orientation='', $format='') {
+		++$this->page;
+		$this->pageobjects[$this->page] = array();
+		$this->setPageBuffer($this->page, '');
+		// initialize array for graphics tranformation positions inside a page buffer
+		$this->transfmrk[$this->page] = array();
+		$this->state = 2;
+		if (TCPDF_STATIC::empty_string($orientation)) {
+			if (isset($this->CurOrientation)) {
+				$orientation = $this->CurOrientation;
+			} elseif ($this->fwPt > $this->fhPt) {
+				// landscape
+				$orientation = 'L';
+			} else {
+				// portrait
+				$orientation = 'P';
+			}
+		}
+		if (TCPDF_STATIC::empty_string($format)) {
+			$this->pagedim[$this->page] = $this->pagedim[($this->page - 1)];
+			$this->setPageOrientation($orientation);
+		} else {
+			$this->setPageFormat($format, $orientation);
+		}
+		if ($this->rtl) {
+			$this->x = $this->w - $this->rMargin;
+		} else {
+			$this->x = $this->lMargin;
+		}
+		$this->y = $this->tMargin;
+		if (isset($this->newpagegroup[$this->page])) {
+			// start a new group
+			$this->currpagegroup = $this->newpagegroup[$this->page];
+			$this->pagegroups[$this->currpagegroup] = 1;
+		} elseif (isset($this->currpagegroup) AND ($this->currpagegroup > 0)) {
+			++$this->pagegroups[$this->currpagegroup];
+		}
+	}
+
+	/**
+	 * Mark end of page.
+	 * @protected
+	 */
+	protected function _endpage() {
+		$this->setVisibility('all');
+		$this->state = 1;
+	}
+
+	/**
+	 * Begin a new object and return the object number.
+	 * @return int object number
+	 * @protected
+	 */
+	protected function _newobj() {
+		$this->_out($this->_getobj());
+		return $this->n;
+	}
+
+	/**
+	 * Return the starting object string for the selected object ID.
+	 * @param $objid (int) Object ID (leave empty to get a new ID).
+	 * @return string the starting object string
+	 * @protected
+	 * @since 5.8.009 (2010-08-20)
+	 */
+	protected function _getobj($objid='') {
+		if ($objid === '') {
+			++$this->n;
+			$objid = $this->n;
+		}
+		$this->offsets[$objid] = $this->bufferlen;
+		$this->pageobjects[$this->page][] = $objid;
+		return $objid.' 0 obj';
+	}
+
+	/**
+	 * Underline text.
+	 * @param $x (int) X coordinate
+	 * @param $y (int) Y coordinate
+	 * @param $txt (string) text to underline
+	 * @protected
+	 */
+	protected function _dounderline($x, $y, $txt) {
+		$w = $this->GetStringWidth($txt);
+		return $this->_dounderlinew($x, $y, $w);
+	}
+
+	/**
+	 * Underline for rectangular text area.
+	 * @param $x (int) X coordinate
+	 * @param $y (int) Y coordinate
+	 * @param $w (int) width to underline
+	 * @protected
+	 * @since 4.8.008 (2009-09-29)
+	 */
+	protected function _dounderlinew($x, $y, $w) {
+		$linew = - $this->CurrentFont['ut'] / 1000 * $this->FontSizePt;
+		return sprintf('%F %F %F %F re f', $x * $this->k, ((($this->h - $y) * $this->k) + $linew), $w * $this->k, $linew);
+	}
+
+	/**
+	 * Line through text.
+	 * @param $x (int) X coordinate
+	 * @param $y (int) Y coordinate
+	 * @param $txt (string) text to linethrough
+	 * @protected
+	 */
+	protected function _dolinethrough($x, $y, $txt) {
+		$w = $this->GetStringWidth($txt);
+		return $this->_dolinethroughw($x, $y, $w);
+	}
+
+	/**
+	 * Line through for rectangular text area.
+	 * @param $x (int) X coordinate
+	 * @param $y (int) Y coordinate
+	 * @param $w (int) line length (width)
+	 * @protected
+	 * @since 4.9.008 (2009-09-29)
+	 */
+	protected function _dolinethroughw($x, $y, $w) {
+		$linew = - $this->CurrentFont['ut'] / 1000 * $this->FontSizePt;
+		return sprintf('%F %F %F %F re f', $x * $this->k, ((($this->h - $y) * $this->k) + $linew + ($this->FontSizePt / 3)), $w * $this->k, $linew);
+	}
+
+	/**
+	 * Overline text.
+	 * @param $x (int) X coordinate
+	 * @param $y (int) Y coordinate
+	 * @param $txt (string) text to overline
+	 * @protected
+	 * @since 4.9.015 (2010-04-19)
+	 */
+	protected function _dooverline($x, $y, $txt) {
+		$w = $this->GetStringWidth($txt);
+		return $this->_dooverlinew($x, $y, $w);
+	}
+
+	/**
+	 * Overline for rectangular text area.
+	 * @param $x (int) X coordinate
+	 * @param $y (int) Y coordinate
+	 * @param $w (int) width to overline
+	 * @protected
+	 * @since 4.9.015 (2010-04-19)
+	 */
+	protected function _dooverlinew($x, $y, $w) {
+		$linew = - $this->CurrentFont['ut'] / 1000 * $this->FontSizePt;
+		return sprintf('%F %F %F %F re f', $x * $this->k, (($this->h - $y + $this->FontAscent) * $this->k) - $linew, $w * $this->k, $linew);
+
+	}
+
+	/**
+	 * Format a data string for meta information
+	 * @param $s (string) data string to escape.
+	 * @param $n (int) object ID
+	 * @return string escaped string.
+	 * @protected
+	 */
+	protected function _datastring($s, $n=0) {
+		if ($n == 0) {
+			$n = $this->n;
+		}
+		$s = $this->_encrypt_data($n, $s);
+		return '('. TCPDF_STATIC::_escape($s).')';
+	}
+
+	/**
+	 * Set the document creation timestamp
+	 * @param $time (mixed) Document creation timestamp in seconds or date-time string.
+	 * @public
+	 * @since 5.9.152 (2012-03-23)
+	 */
+	public function setDocCreationTimestamp($time) {
+		if (is_string($time)) {
+			$time = TCPDF_STATIC::getTimestamp($time);
+		}
+		$this->doc_creation_timestamp = intval($time);
+	}
+
+	/**
+	 * Set the document modification timestamp
+	 * @param $time (mixed) Document modification timestamp in seconds or date-time string.
+	 * @public
+	 * @since 5.9.152 (2012-03-23)
+	 */
+	public function setDocModificationTimestamp($time) {
+		if (is_string($time)) {
+			$time = TCPDF_STATIC::getTimestamp($time);
+		}
+		$this->doc_modification_timestamp = intval($time);
+	}
+
+	/**
+	 * Returns document creation timestamp in seconds.
+	 * @return (int) Creation timestamp in seconds.
+	 * @public
+	 * @since 5.9.152 (2012-03-23)
+	 */
+	public function getDocCreationTimestamp() {
+		return $this->doc_creation_timestamp;
+	}
+
+	/**
+	 * Returns document modification timestamp in seconds.
+	 * @return (int) Modfication timestamp in seconds.
+	 * @public
+	 * @since 5.9.152 (2012-03-23)
+	 */
+	public function getDocModificationTimestamp() {
+		return $this->doc_modification_timestamp;
+	}
+
+	/**
+	 * Returns a formatted date for meta information
+	 * @param $n (int) Object ID.
+	 * @param $timestamp (int) Timestamp to convert.
+	 * @return string escaped date string.
+	 * @protected
+	 * @since 4.6.028 (2009-08-25)
+	 */
+	protected function _datestring($n=0, $timestamp=0) {
+		if ((empty($timestamp)) OR ($timestamp < 0)) {
+			$timestamp = $this->doc_creation_timestamp;
+		}
+		return $this->_datastring('D:'.TCPDF_STATIC::getFormattedDate($timestamp), $n);
+	}
+
+	/**
+	 * Format a text string for meta information
+	 * @param $s (string) string to escape.
+	 * @param $n (int) object ID
+	 * @return string escaped string.
+	 * @protected
+	 */
+	protected function _textstring($s, $n=0) {
+		if ($this->isunicode) {
+			//Convert string to UTF-16BE
+			$s = TCPDF_FONTS::UTF8ToUTF16BE($s, true, $this->isunicode, $this->CurrentFont);
+		}
+		return $this->_datastring($s, $n);
+	}
+
+	/**
+	 * THIS METHOD IS DEPRECATED
+	 * Format a text string
+	 * @param $s (string) string to escape.
+	 * @return string escaped string.
+	 * @protected
+	 * @deprecated
+	 */
+	protected function _escapetext($s) {
+		if ($this->isunicode) {
+			if (($this->CurrentFont['type'] == 'core') OR ($this->CurrentFont['type'] == 'TrueType') OR ($this->CurrentFont['type'] == 'Type1')) {
+				$s = TCPDF_FONTS::UTF8ToLatin1($s, $this->isunicode, $this->CurrentFont);
+			} else {
+				//Convert string to UTF-16BE and reverse RTL language
+				$s = TCPDF_FONTS::utf8StrRev($s, false, $this->tmprtl, $this->isunicode, $this->CurrentFont);
+			}
+		}
+		return TCPDF_STATIC::_escape($s);
+	}
+
+	/**
+	 * get raw output stream.
+	 * @param $s (string) string to output.
+	 * @param $n (int) object reference for encryption mode
+	 * @protected
+	 * @author Nicola Asuni
+	 * @since 5.5.000 (2010-06-22)
+	 */
+	protected function _getrawstream($s, $n=0) {
+		if ($n <= 0) {
+			// default to current object
+			$n = $this->n;
+		}
+		return $this->_encrypt_data($n, $s);
+	}
+
+	/**
+	 * Format output stream (DEPRECATED).
+	 * @param $s (string) string to output.
+	 * @param $n (int) object reference for encryption mode
+	 * @protected
+	 * @deprecated
+	 */
+	protected function _getstream($s, $n=0) {
+		return 'stream'."\n".$this->_getrawstream($s, $n)."\n".'endstream';
+	}
+
+	/**
+	 * Output a stream (DEPRECATED).
+	 * @param $s (string) string to output.
+	 * @param $n (int) object reference for encryption mode
+	 * @protected
+	 * @deprecated
+	 */
+	protected function _putstream($s, $n=0) {
+		$this->_out($this->_getstream($s, $n));
+	}
+
+	/**
+	 * Output a string to the document.
+	 * @param $s (string) string to output.
+	 * @protected
+	 */
+	protected function _out($s) {
+		if ($this->state == 2) {
+			if ($this->inxobj) {
+				// we are inside an XObject template
+				$this->xobjects[$this->xobjid]['outdata'] .= $s."\n";
+			} elseif ((!$this->InFooter) AND isset($this->footerlen[$this->page]) AND ($this->footerlen[$this->page] > 0)) {
+				// puts data before page footer
+				$pagebuff = $this->getPageBuffer($this->page);
+				$page = substr($pagebuff, 0, -$this->footerlen[$this->page]);
+				$footer = substr($pagebuff, -$this->footerlen[$this->page]);
+				$this->setPageBuffer($this->page, $page.$s."\n".$footer);
+				// update footer position
+				$this->footerpos[$this->page] += strlen($s."\n");
+			} else {
+				// set page data
+				$this->setPageBuffer($this->page, $s."\n", true);
+			}
+		} elseif ($this->state > 0) {
+			// set general data
+			$this->setBuffer($s."\n");
+		}
+	}
+
+	/**
+	 * Set header font.
+	 * @param $font (array) font
+	 * @public
+	 * @since 1.1
+	 */
+	public function setHeaderFont($font) {
+		$this->header_font = $font;
+	}
+
+	/**
+	 * Get header font.
+	 * @return array()
+	 * @public
+	 * @since 4.0.012 (2008-07-24)
+	 */
+	public function getHeaderFont() {
+		return $this->header_font;
+	}
+
+	/**
+	 * Set footer font.
+	 * @param $font (array) font
+	 * @public
+	 * @since 1.1
+	 */
+	public function setFooterFont($font) {
+		$this->footer_font = $font;
+	}
+
+	/**
+	 * Get Footer font.
+	 * @return array()
+	 * @public
+	 * @since 4.0.012 (2008-07-24)
+	 */
+	public function getFooterFont() {
+		return $this->footer_font;
+	}
+
+	/**
+	 * Set language array.
+	 * @param $language (array)
+	 * @public
+	 * @since 1.1
+	 */
+	public function setLanguageArray($language) {
+		$this->l = $language;
+		if (isset($this->l['a_meta_dir'])) {
+			$this->rtl = $this->l['a_meta_dir']=='rtl' ? true : false;
+		} else {
+			$this->rtl = false;
+		}
+	}
+
+	/**
+	 * Returns the PDF data.
+	 * @public
+	 */
+	public function getPDFData() {
+		if ($this->state < 3) {
+			$this->Close();
+		}
+		return $this->buffer;
+	}
+
+	/**
+	 * Output anchor link.
+	 * @param $url (string) link URL or internal link (i.e.: &lt;a href="#23,4.5"&gt;link to page 23 at 4.5 Y position&lt;/a&gt;)
+	 * @param $name (string) link name
+	 * @param $fill (boolean) Indicates if the cell background must be painted (true) or transparent (false).
+	 * @param $firstline (boolean) if true prints only the first line and return the remaining string.
+	 * @param $color (array) array of RGB text color
+	 * @param $style (string) font style (U, D, B, I)
+	 * @param $firstblock (boolean) if true the string is the starting of a line.
+	 * @return the number of cells used or the remaining text if $firstline = true;
+	 * @public
+	 */
+	public function addHtmlLink($url, $name, $fill=false, $firstline=false, $color='', $style=-1, $firstblock=false) {
+		if (isset($url[1]) AND ($url[0] == '#') AND is_numeric($url[1])) {
+			// convert url to internal link
+			$lnkdata = explode(',', $url);
+			if (isset($lnkdata[0])) {
+				$page = intval(substr($lnkdata[0], 1));
+				if (empty($page) OR ($page <= 0)) {
+					$page = $this->page;
+				}
+				if (isset($lnkdata[1]) AND (strlen($lnkdata[1]) > 0)) {
+					$lnky = floatval($lnkdata[1]);
+				} else {
+					$lnky = 0;
+				}
+				$url = $this->AddLink();
+				$this->SetLink($url, $lnky, $page);
+			}
+		}
+		// store current settings
+		$prevcolor = $this->fgcolor;
+		$prevstyle = $this->FontStyle;
+		if (empty($color)) {
+			$this->SetTextColorArray($this->htmlLinkColorArray);
+		} else {
+			$this->SetTextColorArray($color);
+		}
+		if ($style == -1) {
+			$this->SetFont('', $this->FontStyle.$this->htmlLinkFontStyle);
+		} else {
+			$this->SetFont('', $this->FontStyle.$style);
+		}
+		$ret = $this->Write($this->lasth, $name, $url, $fill, '', false, 0, $firstline, $firstblock, 0);
+		// restore settings
+		$this->SetFont('', $prevstyle);
+		$this->SetTextColorArray($prevcolor);
+		return $ret;
+	}
+
+	/**
+	 * Converts pixels to User's Units.
+	 * @param $px (int) pixels
+	 * @return float value in user's unit
+	 * @public
+	 * @see setImageScale(), getImageScale()
+	 */
+	public function pixelsToUnits($px) {
+		return ($px / ($this->imgscale * $this->k));
+	}
+
+	/**
+	 * Reverse function for htmlentities.
+	 * Convert entities in UTF-8.
+	 * @param $text_to_convert (string) Text to convert.
+	 * @return string converted text string
+	 * @public
+	 */
+	public function unhtmlentities($text_to_convert) {
+		return @html_entity_decode($text_to_convert, ENT_QUOTES, $this->encoding);
+	}
+
+	// ENCRYPTION METHODS ----------------------------------
+
+	/**
+	 * Compute encryption key depending on object number where the encrypted data is stored.
+	 * This is used for all strings and streams without crypt filter specifier.
+	 * @param $n (int) object number
+	 * @return int object key
+	 * @protected
+	 * @author Nicola Asuni
+	 * @since 2.0.000 (2008-01-02)
+	 */
+	protected function _objectkey($n) {
+		$objkey = $this->encryptdata['key'].pack('VXxx', $n);
+		if ($this->encryptdata['mode'] == 2) { // AES-128
+			// AES padding
+			$objkey .= "\x73\x41\x6C\x54"; // sAlT
+		}
+		$objkey = substr(TCPDF_STATIC::_md5_16($objkey), 0, (($this->encryptdata['Length'] / 8) + 5));
+		$objkey = substr($objkey, 0, 16);
+		return $objkey;
+	}
+
+	/**
+	 * Encrypt the input string.
+	 * @param $n (int) object number
+	 * @param $s (string) data string to encrypt
+	 * @return encrypted string
+	 * @protected
+	 * @author Nicola Asuni
+	 * @since 5.0.005 (2010-05-11)
+	 */
+	protected function _encrypt_data($n, $s) {
+		if (!$this->encrypted) {
+			return $s;
+		}
+		switch ($this->encryptdata['mode']) {
+			case 0:   // RC4-40
+			case 1: { // RC4-128
+				$s = TCPDF_STATIC::_RC4($this->_objectkey($n), $s, $this->last_enc_key, $this->last_enc_key_c);
+				break;
+			}
+			case 2: { // AES-128
+				$s = TCPDF_STATIC::_AES($this->_objectkey($n), $s);
+				break;
+			}
+			case 3: { // AES-256
+				$s = TCPDF_STATIC::_AES($this->encryptdata['key'], $s);
+				break;
+			}
+		}
+		return $s;
+	}
+
+	/**
+	 * Put encryption on PDF document.
+	 * @protected
+	 * @author Nicola Asuni
+	 * @since 2.0.000 (2008-01-02)
+	 */
+	protected function _putencryption() {
+		if (!$this->encrypted) {
+			return;
+		}
+		$this->encryptdata['objid'] = $this->_newobj();
+		$out = '<<';
+		if (!isset($this->encryptdata['Filter']) OR empty($this->encryptdata['Filter'])) {
+			$this->encryptdata['Filter'] = 'Standard';
+		}
+		$out .= ' /Filter /'.$this->encryptdata['Filter'];
+		if (isset($this->encryptdata['SubFilter']) AND !empty($this->encryptdata['SubFilter'])) {
+			$out .= ' /SubFilter /'.$this->encryptdata['SubFilter'];
+		}
+		if (!isset($this->encryptdata['V']) OR empty($this->encryptdata['V'])) {
+			$this->encryptdata['V'] = 1;
+		}
+		// V is a code specifying the algorithm to be used in encrypting and decrypting the document
+		$out .= ' /V '.$this->encryptdata['V'];
+		if (isset($this->encryptdata['Length']) AND !empty($this->encryptdata['Length'])) {
+			// The length of the encryption key, in bits. The value shall be a multiple of 8, in the range 40 to 256
+			$out .= ' /Length '.$this->encryptdata['Length'];
+		} else {
+			$out .= ' /Length 40';
+		}
+		if ($this->encryptdata['V'] >= 4) {
+			if (!isset($this->encryptdata['StmF']) OR empty($this->encryptdata['StmF'])) {
+				$this->encryptdata['StmF'] = 'Identity';
+			}
+			if (!isset($this->encryptdata['StrF']) OR empty($this->encryptdata['StrF'])) {
+				// The name of the crypt filter that shall be used when decrypting all strings in the document.
+				$this->encryptdata['StrF'] = 'Identity';
+			}
+			// A dictionary whose keys shall be crypt filter names and whose values shall be the corresponding crypt filter dictionaries.
+			if (isset($this->encryptdata['CF']) AND !empty($this->encryptdata['CF'])) {
+				$out .= ' /CF <<';
+				$out .= ' /'.$this->encryptdata['StmF'].' <<';
+				$out .= ' /Type /CryptFilter';
+				if (isset($this->encryptdata['CF']['CFM']) AND !empty($this->encryptdata['CF']['CFM'])) {
+					// The method used
+					$out .= ' /CFM /'.$this->encryptdata['CF']['CFM'];
+					if ($this->encryptdata['pubkey']) {
+						$out .= ' /Recipients [';
+						foreach ($this->encryptdata['Recipients'] as $rec) {
+							$out .= ' <'.$rec.'>';
+						}
+						$out .= ' ]';
+						if (isset($this->encryptdata['CF']['EncryptMetadata']) AND (!$this->encryptdata['CF']['EncryptMetadata'])) {
+							$out .= ' /EncryptMetadata false';
+						} else {
+							$out .= ' /EncryptMetadata true';
+						}
+					}
+				} else {
+					$out .= ' /CFM /None';
+				}
+				if (isset($this->encryptdata['CF']['AuthEvent']) AND !empty($this->encryptdata['CF']['AuthEvent'])) {
+					// The event to be used to trigger the authorization that is required to access encryption keys used by this filter.
+					$out .= ' /AuthEvent /'.$this->encryptdata['CF']['AuthEvent'];
+				} else {
+					$out .= ' /AuthEvent /DocOpen';
+				}
+				if (isset($this->encryptdata['CF']['Length']) AND !empty($this->encryptdata['CF']['Length'])) {
+					// The bit length of the encryption key.
+					$out .= ' /Length '.$this->encryptdata['CF']['Length'];
+				}
+				$out .= ' >> >>';
+			}
+			// The name of the crypt filter that shall be used by default when decrypting streams.
+			$out .= ' /StmF /'.$this->encryptdata['StmF'];
+			// The name of the crypt filter that shall be used when decrypting all strings in the document.
+			$out .= ' /StrF /'.$this->encryptdata['StrF'];
+			if (isset($this->encryptdata['EFF']) AND !empty($this->encryptdata['EFF'])) {
+				// The name of the crypt filter that shall be used when encrypting embedded file streams that do not have their own crypt filter specifier.
+				$out .= ' /EFF /'.$this->encryptdata[''];
+			}
+		}
+		// Additional encryption dictionary entries for the standard security handler
+		if ($this->encryptdata['pubkey']) {
+			if (($this->encryptdata['V'] < 4) AND isset($this->encryptdata['Recipients']) AND !empty($this->encryptdata['Recipients'])) {
+				$out .= ' /Recipients [';
+				foreach ($this->encryptdata['Recipients'] as $rec) {
+					$out .= ' <'.$rec.'>';
+				}
+				$out .= ' ]';
+			}
+		} else {
+			$out .= ' /R';
+			if ($this->encryptdata['V'] == 5) { // AES-256
+				$out .= ' 5';
+				$out .= ' /OE ('.TCPDF_STATIC::_escape($this->encryptdata['OE']).')';
+				$out .= ' /UE ('.TCPDF_STATIC::_escape($this->encryptdata['UE']).')';
+				$out .= ' /Perms ('.TCPDF_STATIC::_escape($this->encryptdata['perms']).')';
+			} elseif ($this->encryptdata['V'] == 4) { // AES-128
+				$out .= ' 4';
+			} elseif ($this->encryptdata['V'] < 2) { // RC-40
+				$out .= ' 2';
+			} else { // RC-128
+				$out .= ' 3';
+			}
+			$out .= ' /O ('.TCPDF_STATIC::_escape($this->encryptdata['O']).')';
+			$out .= ' /U ('.TCPDF_STATIC::_escape($this->encryptdata['U']).')';
+			$out .= ' /P '.$this->encryptdata['P'];
+			if (isset($this->encryptdata['EncryptMetadata']) AND (!$this->encryptdata['EncryptMetadata'])) {
+				$out .= ' /EncryptMetadata false';
+			} else {
+				$out .= ' /EncryptMetadata true';
+			}
+		}
+		$out .= ' >>';
+		$out .= "\n".'endobj';
+		$this->_out($out);
+	}
+
+	/**
+	 * Compute U value (used for encryption)
+	 * @return string U value
+	 * @protected
+	 * @since 2.0.000 (2008-01-02)
+	 * @author Nicola Asuni
+	 */
+	protected function _Uvalue() {
+		if ($this->encryptdata['mode'] == 0) { // RC4-40
+			return TCPDF_STATIC::_RC4($this->encryptdata['key'], TCPDF_STATIC::$enc_padding, $this->last_enc_key, $this->last_enc_key_c);
+		} elseif ($this->encryptdata['mode'] < 3) { // RC4-128, AES-128
+			$tmp = TCPDF_STATIC::_md5_16(TCPDF_STATIC::$enc_padding.$this->encryptdata['fileid']);
+			$enc = TCPDF_STATIC::_RC4($this->encryptdata['key'], $tmp, $this->last_enc_key, $this->last_enc_key_c);
+			$len = strlen($tmp);
+			for ($i = 1; $i <= 19; ++$i) {
+				$ek = '';
+				for ($j = 0; $j < $len; ++$j) {
+					$ek .= chr(ord($this->encryptdata['key'][$j]) ^ $i);
+				}
+				$enc = TCPDF_STATIC::_RC4($ek, $enc, $this->last_enc_key, $this->last_enc_key_c);
+			}
+			$enc .= str_repeat("\x00", 16);
+			return substr($enc, 0, 32);
+		} elseif ($this->encryptdata['mode'] == 3) { // AES-256
+			$seed = TCPDF_STATIC::_md5_16(TCPDF_STATIC::getRandomSeed());
+			// User Validation Salt
+			$this->encryptdata['UVS'] = substr($seed, 0, 8);
+			// User Key Salt
+			$this->encryptdata['UKS'] = substr($seed, 8, 16);
+			return hash('sha256', $this->encryptdata['user_password'].$this->encryptdata['UVS'], true).$this->encryptdata['UVS'].$this->encryptdata['UKS'];
+		}
+	}
+
+	/**
+	 * Compute UE value (used for encryption)
+	 * @return string UE value
+	 * @protected
+	 * @since 5.9.006 (2010-10-19)
+	 * @author Nicola Asuni
+	 */
+	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);
+	}
+
+	/**
+	 * Compute O value (used for encryption)
+	 * @return string O value
+	 * @protected
+	 * @since 2.0.000 (2008-01-02)
+	 * @author Nicola Asuni
+	 */
+	protected function _Ovalue() {
+		if ($this->encryptdata['mode'] < 3) { // RC4-40, RC4-128, AES-128
+			$tmp = TCPDF_STATIC::_md5_16($this->encryptdata['owner_password']);
+			if ($this->encryptdata['mode'] > 0) {
+				for ($i = 0; $i < 50; ++$i) {
+					$tmp = TCPDF_STATIC::_md5_16($tmp);
+				}
+			}
+			$owner_key = substr($tmp, 0, ($this->encryptdata['Length'] / 8));
+			$enc = TCPDF_STATIC::_RC4($owner_key, $this->encryptdata['user_password'], $this->last_enc_key, $this->last_enc_key_c);
+			if ($this->encryptdata['mode'] > 0) {
+				$len = strlen($owner_key);
+				for ($i = 1; $i <= 19; ++$i) {
+					$ek = '';
+					for ($j = 0; $j < $len; ++$j) {
+						$ek .= chr(ord($owner_key[$j]) ^ $i);
+					}
+					$enc = TCPDF_STATIC::_RC4($ek, $enc, $this->last_enc_key, $this->last_enc_key_c);
+				}
+			}
+			return $enc;
+		} elseif ($this->encryptdata['mode'] == 3) { // AES-256
+			$seed = TCPDF_STATIC::_md5_16(TCPDF_STATIC::getRandomSeed());
+			// Owner Validation Salt
+			$this->encryptdata['OVS'] = substr($seed, 0, 8);
+			// Owner Key Salt
+			$this->encryptdata['OKS'] = substr($seed, 8, 16);
+			return hash('sha256', $this->encryptdata['owner_password'].$this->encryptdata['OVS'].$this->encryptdata['U'], true).$this->encryptdata['OVS'].$this->encryptdata['OKS'];
+		}
+	}
+
+	/**
+	 * Compute OE value (used for encryption)
+	 * @return string OE value
+	 * @protected
+	 * @since 5.9.006 (2010-10-19)
+	 * @author Nicola Asuni
+	 */
+	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);
+	}
+
+	/**
+	 * Convert password for AES-256 encryption mode
+	 * @param $password (string) password
+	 * @return string password
+	 * @protected
+	 * @since 5.9.006 (2010-10-19)
+	 * @author Nicola Asuni
+	 */
+	protected function _fixAES256Password($password) {
+		$psw = ''; // password to be returned
+		$psw_array = TCPDF_FONTS::utf8Bidi(TCPDF_FONTS::UTF8StringToArray($password, $this->isunicode, $this->CurrentFont), $password, $this->rtl, $this->isunicode, $this->CurrentFont);
+		foreach ($psw_array as $c) {
+			$psw .= TCPDF_FONTS::unichr($c, $this->isunicode);
+		}
+		return substr($psw, 0, 127);
+	}
+
+	/**
+	 * Compute encryption key
+	 * @protected
+	 * @since 2.0.000 (2008-01-02)
+	 * @author Nicola Asuni
+	 */
+	protected function _generateencryptionkey() {
+		$keybytelen = ($this->encryptdata['Length'] / 8);
+		if (!$this->encryptdata['pubkey']) { // standard mode
+			if ($this->encryptdata['mode'] == 3) { // AES-256
+				// generate 256 bit random key
+				$this->encryptdata['key'] = substr(hash('sha256', TCPDF_STATIC::getRandomSeed(), true), 0, $keybytelen);
+				// truncate passwords
+				$this->encryptdata['user_password'] = $this->_fixAES256Password($this->encryptdata['user_password']);
+				$this->encryptdata['owner_password'] = $this->_fixAES256Password($this->encryptdata['owner_password']);
+				// Compute U value
+				$this->encryptdata['U'] = $this->_Uvalue();
+				// Compute UE value
+				$this->encryptdata['UE'] = $this->_UEvalue();
+				// Compute O value
+				$this->encryptdata['O'] = $this->_Ovalue();
+				// Compute OE value
+				$this->encryptdata['OE'] = $this->_OEvalue();
+				// Compute P value
+				$this->encryptdata['P'] = $this->encryptdata['protection'];
+				// Computing the encryption dictionary's Perms (permissions) value
+				$perms = TCPDF_STATIC::getEncPermissionsString($this->encryptdata['protection']); // bytes 0-3
+				$perms .= chr(255).chr(255).chr(255).chr(255); // bytes 4-7
+				if (isset($this->encryptdata['CF']['EncryptMetadata']) AND (!$this->encryptdata['CF']['EncryptMetadata'])) { // byte 8
+					$perms .= 'F';
+				} else {
+					$perms .= 'T';
+				}
+				$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);
+			} else { // RC4-40, RC4-128, AES-128
+				// Pad passwords
+				$this->encryptdata['user_password'] = substr($this->encryptdata['user_password'].TCPDF_STATIC::$enc_padding, 0, 32);
+				$this->encryptdata['owner_password'] = substr($this->encryptdata['owner_password'].TCPDF_STATIC::$enc_padding, 0, 32);
+				// Compute O value
+				$this->encryptdata['O'] = $this->_Ovalue();
+				// get default permissions (reverse byte order)
+				$permissions = TCPDF_STATIC::getEncPermissionsString($this->encryptdata['protection']);
+				// Compute encryption key
+				$tmp = TCPDF_STATIC::_md5_16($this->encryptdata['user_password'].$this->encryptdata['O'].$permissions.$this->encryptdata['fileid']);
+				if ($this->encryptdata['mode'] > 0) {
+					for ($i = 0; $i < 50; ++$i) {
+						$tmp = TCPDF_STATIC::_md5_16(substr($tmp, 0, $keybytelen));
+					}
+				}
+				$this->encryptdata['key'] = substr($tmp, 0, $keybytelen);
+				// Compute U value
+				$this->encryptdata['U'] = $this->_Uvalue();
+				// Compute P value
+				$this->encryptdata['P'] = $this->encryptdata['protection'];
+			}
+		} else { // Public-Key mode
+			// random 20-byte seed
+			$seed = sha1(TCPDF_STATIC::getRandomSeed(), true);
+			$recipient_bytes = '';
+			foreach ($this->encryptdata['pubkeys'] as $pubkey) {
+				// for each public certificate
+				if (isset($pubkey['p'])) {
+					$pkprotection = TCPDF_STATIC::getUserPermissionCode($pubkey['p'], $this->encryptdata['mode']);
+				} else {
+					$pkprotection = $this->encryptdata['protection'];
+				}
+				// get default permissions (reverse byte order)
+				$pkpermissions = TCPDF_STATIC::getEncPermissionsString($pkprotection);
+				// envelope data
+				$envelope = $seed.$pkpermissions;
+				// write the envelope data to a temporary file
+				$tempkeyfile = TCPDF_STATIC::getObjFilename('tmpkey');
+				$f = fopen($tempkeyfile, 'wb');
+				if (!$f) {
+					$this->Error('Unable to create temporary key file: '.$tempkeyfile);
+				}
+				$envelope_length = strlen($envelope);
+				fwrite($f, $envelope, $envelope_length);
+				fclose($f);
+				$tempencfile = TCPDF_STATIC::getObjFilename('tmpenc');
+				if (!openssl_pkcs7_encrypt($tempkeyfile, $tempencfile, $pubkey['c'], array(), PKCS7_BINARY | PKCS7_DETACHED)) {
+					$this->Error('Unable to encrypt the file: '.$tempkeyfile);
+				}
+				unlink($tempkeyfile);
+				// read encryption signature
+				$signature = file_get_contents($tempencfile, false, null, $envelope_length);
+				unlink($tempencfile);
+				// extract signature
+				$signature = substr($signature, strpos($signature, 'Content-Disposition'));
+				$tmparr = explode("\n\n", $signature);
+				$signature = trim($tmparr[1]);
+				unset($tmparr);
+				// decode signature
+				$signature = base64_decode($signature);
+				// convert signature to hex
+				$hexsignature = current(unpack('H*', $signature));
+				// store signature on recipients array
+				$this->encryptdata['Recipients'][] = $hexsignature;
+				// The bytes of each item in the Recipients array of PKCS#7 objects in the order in which they appear in the array
+				$recipient_bytes .= $signature;
+			}
+			// calculate encryption key
+			if ($this->encryptdata['mode'] == 3) { // AES-256
+				$this->encryptdata['key'] = substr(hash('sha256', $seed.$recipient_bytes, true), 0, $keybytelen);
+			} else { // RC4-40, RC4-128, AES-128
+				$this->encryptdata['key'] = substr(sha1($seed.$recipient_bytes, true), 0, $keybytelen);
+			}
+		}
+	}
+
+	/**
+	 * Set document protection
+	 * Remark: the protection against modification is for people who have the full Acrobat product.
+	 * If you don't set any password, the document will open as usual. If you set a user password, the PDF viewer will ask for it before displaying the document. The master password, if different from the user one, can be used to get full access.
+	 * Note: protecting a document requires to encrypt it, which increases the processing time a lot. This can cause a PHP time-out in some cases, especially if the document contains images or fonts.
+	 * @param $permissions (Array) the set of permissions (specify the ones you want to block):<ul><li>print : Print the document;</li><li>modify : Modify the contents of the document by operations other than those controlled by 'fill-forms', 'extract' and 'assemble';</li><li>copy : Copy or otherwise extract text and graphics from the document;</li><li>annot-forms : Add or modify text annotations, fill in interactive form fields, and, if 'modify' is also set, create or modify interactive form fields (including signature fields);</li><li>fill-forms : Fill in existing interactive form fields (including signature fields), even if 'annot-forms' is not specified;</li><li>extract : Extract text and graphics (in support of accessibility to users with disabilities or for other purposes);</li><li>assemble : Assemble the document (insert, rotate, or delete pages and create bookmarks or thumbnail images), even if 'modify' is not set;</li><li>print-high : Print the document to a representation from which a faithful digital copy of the PDF content could be generated. When this is not set, printing is limited to a low-level representation of the appearance, possibly of degraded quality.</li><li>owner : (inverted logic - only for public-key) when set permits change of encryption and enables all other permissions.</li></ul>
+	 * @param $user_pass (String) user password. Empty by default.
+	 * @param $owner_pass (String) owner password. If not specified, a random value is used.
+	 * @param $mode (int) encryption strength: 0 = RC4 40 bit; 1 = RC4 128 bit; 2 = AES 128 bit; 3 = AES 256 bit.
+	 * @param $pubkeys (String) array of recipients containing public-key certificates ('c') and permissions ('p'). For example: array(array('c' => 'file://../examples/data/cert/tcpdf.crt', 'p' => array('print')))
+	 * @public
+	 * @since 2.0.000 (2008-01-02)
+	 * @author Nicola Asuni
+	 */
+	public function SetProtection($permissions=array('print', 'modify', 'copy', 'annot-forms', 'fill-forms', 'extract', 'assemble', 'print-high'), $user_pass='', $owner_pass=null, $mode=0, $pubkeys=null) {
+		if ($this->pdfa_mode) {
+			// encryption is not allowed in PDF/A mode
+			return;
+		}
+		$this->encryptdata['protection'] = TCPDF_STATIC::getUserPermissionCode($permissions, $mode);
+		if (($pubkeys !== null) AND (is_array($pubkeys))) {
+			// public-key mode
+			$this->encryptdata['pubkeys'] = $pubkeys;
+			if ($mode == 0) {
+				// public-Key Security requires at least 128 bit
+				$mode = 1;
+			}
+			if (!function_exists('openssl_pkcs7_encrypt')) {
+				$this->Error('Public-Key Security requires openssl library.');
+			}
+			// Set Public-Key filter (availabe are: Entrust.PPKEF, Adobe.PPKLite, Adobe.PubSec)
+			$this->encryptdata['pubkey'] = true;
+			$this->encryptdata['Filter'] = 'Adobe.PubSec';
+			$this->encryptdata['StmF'] = 'DefaultCryptFilter';
+			$this->encryptdata['StrF'] = 'DefaultCryptFilter';
+		} else {
+			// standard mode (password mode)
+			$this->encryptdata['pubkey'] = false;
+			$this->encryptdata['Filter'] = 'Standard';
+			$this->encryptdata['StmF'] = 'StdCF';
+			$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 (mcrypt_get_cipher_name(MCRYPT_RIJNDAEL_128) === false) {
+				$this->Error('AES encryption requires MCRYPT_RIJNDAEL_128 cypher.');
+			}
+			if (($mode == 3) AND !function_exists('hash')) {
+				// the Hash extension requires no external libraries and is enabled by default as of PHP 5.1.2.
+				$this->Error('AES 256 encryption requires HASH Message Digest Framework (http://www.php.net/manual/en/book.hash.php).');
+			}
+		}
+		if ($owner_pass === null) {
+			$owner_pass = md5(TCPDF_STATIC::getRandomSeed());
+		}
+		$this->encryptdata['user_password'] = $user_pass;
+		$this->encryptdata['owner_password'] = $owner_pass;
+		$this->encryptdata['mode'] = $mode;
+		switch ($mode) {
+			case 0: { // RC4 40 bit
+				$this->encryptdata['V'] = 1;
+				$this->encryptdata['Length'] = 40;
+				$this->encryptdata['CF']['CFM'] = 'V2';
+				break;
+			}
+			case 1: { // RC4 128 bit
+				$this->encryptdata['V'] = 2;
+				$this->encryptdata['Length'] = 128;
+				$this->encryptdata['CF']['CFM'] = 'V2';
+				if ($this->encryptdata['pubkey']) {
+					$this->encryptdata['SubFilter'] = 'adbe.pkcs7.s4';
+					$this->encryptdata['Recipients'] = array();
+				}
+				break;
+			}
+			case 2: { // AES 128 bit
+				$this->encryptdata['V'] = 4;
+				$this->encryptdata['Length'] = 128;
+				$this->encryptdata['CF']['CFM'] = 'AESV2';
+				$this->encryptdata['CF']['Length'] = 128;
+				if ($this->encryptdata['pubkey']) {
+					$this->encryptdata['SubFilter'] = 'adbe.pkcs7.s5';
+					$this->encryptdata['Recipients'] = array();
+				}
+				break;
+			}
+			case 3: { // AES 256 bit
+				$this->encryptdata['V'] = 5;
+				$this->encryptdata['Length'] = 256;
+				$this->encryptdata['CF']['CFM'] = 'AESV3';
+				$this->encryptdata['CF']['Length'] = 256;
+				if ($this->encryptdata['pubkey']) {
+					$this->encryptdata['SubFilter'] = 'adbe.pkcs7.s5';
+					$this->encryptdata['Recipients'] = array();
+				}
+				break;
+			}
+		}
+		$this->encrypted = true;
+		$this->encryptdata['fileid'] = TCPDF_STATIC::convertHexStringToString($this->file_id);
+		$this->_generateencryptionkey();
+	}
+
+	// END OF ENCRYPTION FUNCTIONS -------------------------
+
+	// START TRANSFORMATIONS SECTION -----------------------
+
+	/**
+	 * Starts a 2D tranformation saving current graphic state.
+	 * This function must be called before scaling, mirroring, translation, rotation and skewing.
+	 * Use StartTransform() before, and StopTransform() after the transformations to restore the normal behavior.
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function StartTransform() {
+		if ($this->state != 2) {
+			return;
+		}
+		$this->_out('q');
+		if ($this->inxobj) {
+			// we are inside an XObject template
+			$this->xobjects[$this->xobjid]['transfmrk'][] = strlen($this->xobjects[$this->xobjid]['outdata']);
+		} else {
+			$this->transfmrk[$this->page][] = $this->pagelen[$this->page];
+		}
+		++$this->transfmatrix_key;
+		$this->transfmatrix[$this->transfmatrix_key] = array();
+	}
+
+	/**
+	 * Stops a 2D tranformation restoring previous graphic state.
+	 * This function must be called after scaling, mirroring, translation, rotation and skewing.
+	 * Use StartTransform() before, and StopTransform() after the transformations to restore the normal behavior.
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function StopTransform() {
+		if ($this->state != 2) {
+			return;
+		}
+		$this->_out('Q');
+		if (isset($this->transfmatrix[$this->transfmatrix_key])) {
+			array_pop($this->transfmatrix[$this->transfmatrix_key]);
+			--$this->transfmatrix_key;
+		}
+		if ($this->inxobj) {
+			// we are inside an XObject template
+			array_pop($this->xobjects[$this->xobjid]['transfmrk']);
+		} else {
+			array_pop($this->transfmrk[$this->page]);
+		}
+	}
+	/**
+	 * Horizontal Scaling.
+	 * @param $s_x (float) scaling factor for width as percent. 0 is not allowed.
+	 * @param $x (int) abscissa of the scaling center. Default is current x position
+	 * @param $y (int) ordinate of the scaling center. Default is current y position
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function ScaleX($s_x, $x='', $y='') {
+		$this->Scale($s_x, 100, $x, $y);
+	}
+
+	/**
+	 * Vertical Scaling.
+	 * @param $s_y (float) scaling factor for height as percent. 0 is not allowed.
+	 * @param $x (int) abscissa of the scaling center. Default is current x position
+	 * @param $y (int) ordinate of the scaling center. Default is current y position
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function ScaleY($s_y, $x='', $y='') {
+		$this->Scale(100, $s_y, $x, $y);
+	}
+
+	/**
+	 * Vertical and horizontal proportional Scaling.
+	 * @param $s (float) scaling factor for width and height as percent. 0 is not allowed.
+	 * @param $x (int) abscissa of the scaling center. Default is current x position
+	 * @param $y (int) ordinate of the scaling center. Default is current y position
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function ScaleXY($s, $x='', $y='') {
+		$this->Scale($s, $s, $x, $y);
+	}
+
+	/**
+	 * Vertical and horizontal non-proportional Scaling.
+	 * @param $s_x (float) scaling factor for width as percent. 0 is not allowed.
+	 * @param $s_y (float) scaling factor for height as percent. 0 is not allowed.
+	 * @param $x (int) abscissa of the scaling center. Default is current x position
+	 * @param $y (int) ordinate of the scaling center. Default is current y position
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function Scale($s_x, $s_y, $x='', $y='') {
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		if (($s_x == 0) OR ($s_y == 0)) {
+			$this->Error('Please do not use values equal to zero for scaling');
+		}
+		$y = ($this->h - $y) * $this->k;
+		$x *= $this->k;
+		//calculate elements of transformation matrix
+		$s_x /= 100;
+		$s_y /= 100;
+		$tm = array();
+		$tm[0] = $s_x;
+		$tm[1] = 0;
+		$tm[2] = 0;
+		$tm[3] = $s_y;
+		$tm[4] = $x * (1 - $s_x);
+		$tm[5] = $y * (1 - $s_y);
+		//scale the coordinate system
+		$this->Transform($tm);
+	}
+
+	/**
+	 * Horizontal Mirroring.
+	 * @param $x (int) abscissa of the point. Default is current x position
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function MirrorH($x='') {
+		$this->Scale(-100, 100, $x);
+	}
+
+	/**
+	 * Verical Mirroring.
+	 * @param $y (int) ordinate of the point. Default is current y position
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function MirrorV($y='') {
+		$this->Scale(100, -100, '', $y);
+	}
+
+	/**
+	 * Point reflection mirroring.
+	 * @param $x (int) abscissa of the point. Default is current x position
+	 * @param $y (int) ordinate of the point. Default is current y position
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function MirrorP($x='',$y='') {
+		$this->Scale(-100, -100, $x, $y);
+	}
+
+	/**
+	 * Reflection against a straight line through point (x, y) with the gradient angle (angle).
+	 * @param $angle (float) gradient angle of the straight line. Default is 0 (horizontal line).
+	 * @param $x (int) abscissa of the point. Default is current x position
+	 * @param $y (int) ordinate of the point. Default is current y position
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function MirrorL($angle=0, $x='',$y='') {
+		$this->Scale(-100, 100, $x, $y);
+		$this->Rotate(-2*($angle-90), $x, $y);
+	}
+
+	/**
+	 * Translate graphic object horizontally.
+	 * @param $t_x (int) movement to the right (or left for RTL)
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function TranslateX($t_x) {
+		$this->Translate($t_x, 0);
+	}
+
+	/**
+	 * Translate graphic object vertically.
+	 * @param $t_y (int) movement to the bottom
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function TranslateY($t_y) {
+		$this->Translate(0, $t_y);
+	}
+
+	/**
+	 * Translate graphic object horizontally and vertically.
+	 * @param $t_x (int) movement to the right
+	 * @param $t_y (int) movement to the bottom
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function Translate($t_x, $t_y) {
+		//calculate elements of transformation matrix
+		$tm = array();
+		$tm[0] = 1;
+		$tm[1] = 0;
+		$tm[2] = 0;
+		$tm[3] = 1;
+		$tm[4] = $t_x * $this->k;
+		$tm[5] = -$t_y * $this->k;
+		//translate the coordinate system
+		$this->Transform($tm);
+	}
+
+	/**
+	 * Rotate object.
+	 * @param $angle (float) angle in degrees for counter-clockwise rotation
+	 * @param $x (int) abscissa of the rotation center. Default is current x position
+	 * @param $y (int) ordinate of the rotation center. Default is current y position
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function Rotate($angle, $x='', $y='') {
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		$y = ($this->h - $y) * $this->k;
+		$x *= $this->k;
+		//calculate elements of transformation matrix
+		$tm = array();
+		$tm[0] = cos(deg2rad($angle));
+		$tm[1] = sin(deg2rad($angle));
+		$tm[2] = -$tm[1];
+		$tm[3] = $tm[0];
+		$tm[4] = $x + ($tm[1] * $y) - ($tm[0] * $x);
+		$tm[5] = $y - ($tm[0] * $y) - ($tm[1] * $x);
+		//rotate the coordinate system around ($x,$y)
+		$this->Transform($tm);
+	}
+
+	/**
+	 * Skew horizontally.
+	 * @param $angle_x (float) angle in degrees between -90 (skew to the left) and 90 (skew to the right)
+	 * @param $x (int) abscissa of the skewing center. default is current x position
+	 * @param $y (int) ordinate of the skewing center. default is current y position
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function SkewX($angle_x, $x='', $y='') {
+		$this->Skew($angle_x, 0, $x, $y);
+	}
+
+	/**
+	 * Skew vertically.
+	 * @param $angle_y (float) angle in degrees between -90 (skew to the bottom) and 90 (skew to the top)
+	 * @param $x (int) abscissa of the skewing center. default is current x position
+	 * @param $y (int) ordinate of the skewing center. default is current y position
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function SkewY($angle_y, $x='', $y='') {
+		$this->Skew(0, $angle_y, $x, $y);
+	}
+
+	/**
+	 * Skew.
+	 * @param $angle_x (float) angle in degrees between -90 (skew to the left) and 90 (skew to the right)
+	 * @param $angle_y (float) angle in degrees between -90 (skew to the bottom) and 90 (skew to the top)
+	 * @param $x (int) abscissa of the skewing center. default is current x position
+	 * @param $y (int) ordinate of the skewing center. default is current y position
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	public function Skew($angle_x, $angle_y, $x='', $y='') {
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		if (($angle_x <= -90) OR ($angle_x >= 90) OR ($angle_y <= -90) OR ($angle_y >= 90)) {
+			$this->Error('Please use values between -90 and +90 degrees for Skewing.');
+		}
+		$x *= $this->k;
+		$y = ($this->h - $y) * $this->k;
+		//calculate elements of transformation matrix
+		$tm = array();
+		$tm[0] = 1;
+		$tm[1] = tan(deg2rad($angle_y));
+		$tm[2] = tan(deg2rad($angle_x));
+		$tm[3] = 1;
+		$tm[4] = -$tm[2] * $y;
+		$tm[5] = -$tm[1] * $x;
+		//skew the coordinate system
+		$this->Transform($tm);
+	}
+
+	/**
+	 * Apply graphic transformations.
+	 * @param $tm (array) transformation matrix
+	 * @protected
+	 * @since 2.1.000 (2008-01-07)
+	 * @see StartTransform(), StopTransform()
+	 */
+	protected function Transform($tm) {
+		if ($this->state != 2) {
+			return;
+		}
+		$this->_out(sprintf('%F %F %F %F %F %F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5]));
+		// add tranformation matrix
+		$this->transfmatrix[$this->transfmatrix_key][] = array('a' => $tm[0], 'b' => $tm[1], 'c' => $tm[2], 'd' => $tm[3], 'e' => $tm[4], 'f' => $tm[5]);
+		// update transformation mark
+		if ($this->inxobj) {
+			// we are inside an XObject template
+			if (end($this->xobjects[$this->xobjid]['transfmrk']) !== false) {
+				$key = key($this->xobjects[$this->xobjid]['transfmrk']);
+				$this->xobjects[$this->xobjid]['transfmrk'][$key] = strlen($this->xobjects[$this->xobjid]['outdata']);
+			}
+		} elseif (end($this->transfmrk[$this->page]) !== false) {
+			$key = key($this->transfmrk[$this->page]);
+			$this->transfmrk[$this->page][$key] = $this->pagelen[$this->page];
+		}
+	}
+
+	// END TRANSFORMATIONS SECTION -------------------------
+
+	// START GRAPHIC FUNCTIONS SECTION ---------------------
+	// The following section is based on the code provided by David Hernandez Sanz
+
+	/**
+	 * Defines the line width. By default, the value equals 0.2 mm. The method can be called before the first page is created and the value is retained from page to page.
+	 * @param $width (float) The width.
+	 * @public
+	 * @since 1.0
+	 * @see Line(), Rect(), Cell(), MultiCell()
+	 */
+	public function SetLineWidth($width) {
+		//Set line width
+		$this->LineWidth = $width;
+		$this->linestyleWidth = sprintf('%F w', ($width * $this->k));
+		if ($this->state == 2) {
+			$this->_out($this->linestyleWidth);
+		}
+	}
+
+	/**
+	 * Returns the current the line width.
+	 * @return int Line width
+	 * @public
+	 * @since 2.1.000 (2008-01-07)
+	 * @see Line(), SetLineWidth()
+	 */
+	public function GetLineWidth() {
+		return $this->LineWidth;
+	}
+
+	/**
+	 * Set line style.
+	 * @param $style (array) Line style. Array with keys among the following:
+	 * <ul>
+	 *	 <li>width (float): Width of the line in user units.</li>
+	 *	 <li>cap (string): Type of cap to put on the line. Possible values are:
+	 * butt, round, square. The difference between "square" and "butt" is that
+	 * "square" projects a flat end past the end of the line.</li>
+	 *	 <li>join (string): Type of join. Possible values are: miter, round,
+	 * bevel.</li>
+	 *	 <li>dash (mixed): Dash pattern. Is 0 (without dash) or string with
+	 * series of length values, which are the lengths of the on and off dashes.
+	 * For example: "2" represents 2 on, 2 off, 2 on, 2 off, ...; "2,1" is 2 on,
+	 * 1 off, 2 on, 1 off, ...</li>
+	 *	 <li>phase (integer): Modifier on the dash pattern which is used to shift
+	 * the point at which the pattern starts.</li>
+	 *	 <li>color (array): Draw color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K) or array(C,M,Y,K,SpotColorName).</li>
+	 * </ul>
+	 * @param $ret (boolean) if true do not send the command.
+	 * @return string the PDF command
+	 * @public
+	 * @since 2.1.000 (2008-01-08)
+	 */
+	public function SetLineStyle($style, $ret=false) {
+		$s = ''; // string to be returned
+		if (!is_array($style)) {
+			return;
+		}
+		if (isset($style['width'])) {
+			$this->LineWidth = $style['width'];
+			$this->linestyleWidth = sprintf('%F w', ($style['width'] * $this->k));
+			$s .= $this->linestyleWidth.' ';
+		}
+		if (isset($style['cap'])) {
+			$ca = array('butt' => 0, 'round'=> 1, 'square' => 2);
+			if (isset($ca[$style['cap']])) {
+				$this->linestyleCap = $ca[$style['cap']].' J';
+				$s .= $this->linestyleCap.' ';
+			}
+		}
+		if (isset($style['join'])) {
+			$ja = array('miter' => 0, 'round' => 1, 'bevel' => 2);
+			if (isset($ja[$style['join']])) {
+				$this->linestyleJoin = $ja[$style['join']].' j';
+				$s .= $this->linestyleJoin.' ';
+			}
+		}
+		if (isset($style['dash'])) {
+			$dash_string = '';
+			if ($style['dash']) {
+				if (preg_match('/^.+,/', $style['dash']) > 0) {
+					$tab = explode(',', $style['dash']);
+				} else {
+					$tab = array($style['dash']);
+				}
+				$dash_string = '';
+				foreach ($tab as $i => $v) {
+					if ($i) {
+						$dash_string .= ' ';
+					}
+					$dash_string .= sprintf('%F', $v);
+				}
+			}
+			if (!isset($style['phase']) OR !$style['dash']) {
+				$style['phase'] = 0;
+			}
+			$this->linestyleDash = sprintf('[%s] %F d', $dash_string, $style['phase']);
+			$s .= $this->linestyleDash.' ';
+		}
+		if (isset($style['color'])) {
+			$s .= $this->SetDrawColorArray($style['color'], true).' ';
+		}
+		if (!$ret AND ($this->state == 2)) {
+			$this->_out($s);
+		}
+		return $s;
+	}
+
+	/**
+	 * Begin a new subpath by moving the current point to coordinates (x, y), omitting any connecting line segment.
+	 * @param $x (float) Abscissa of point.
+	 * @param $y (float) Ordinate of point.
+	 * @protected
+	 * @since 2.1.000 (2008-01-08)
+	 */
+	protected function _outPoint($x, $y) {
+		if ($this->state == 2) {
+			$this->_out(sprintf('%F %F m', ($x * $this->k), (($this->h - $y) * $this->k)));
+		}
+	}
+
+	/**
+	 * Append a straight line segment from the current point to the point (x, y).
+	 * The new current point shall be (x, y).
+	 * @param $x (float) Abscissa of end point.
+	 * @param $y (float) Ordinate of end point.
+	 * @protected
+	 * @since 2.1.000 (2008-01-08)
+	 */
+	protected function _outLine($x, $y) {
+		if ($this->state == 2) {
+			$this->_out(sprintf('%F %F l', ($x * $this->k), (($this->h - $y) * $this->k)));
+		}
+	}
+
+	/**
+	 * Append a rectangle to the current path as a complete subpath, with lower-left corner (x, y) and dimensions widthand height in user space.
+	 * @param $x (float) Abscissa of upper-left corner.
+	 * @param $y (float) Ordinate of upper-left corner.
+	 * @param $w (float) Width.
+	 * @param $h (float) Height.
+	 * @param $op (string) options
+	 * @protected
+	 * @since 2.1.000 (2008-01-08)
+	 */
+	protected function _outRect($x, $y, $w, $h, $op) {
+		if ($this->state == 2) {
+			$this->_out(sprintf('%F %F %F %F re %s', ($x * $this->k), (($this->h - $y) * $this->k), ($w * $this->k), (-$h * $this->k), $op));
+		}
+	}
+
+	/**
+	 * Append a cubic B�zier curve to the current path. The curve shall extend from the current point to the point (x3, y3), using (x1, y1) and (x2, y2) as the B�zier control points.
+	 * The new current point shall be (x3, y3).
+	 * @param $x1 (float) Abscissa of control point 1.
+	 * @param $y1 (float) Ordinate of control point 1.
+	 * @param $x2 (float) Abscissa of control point 2.
+	 * @param $y2 (float) Ordinate of control point 2.
+	 * @param $x3 (float) Abscissa of end point.
+	 * @param $y3 (float) Ordinate of end point.
+	 * @protected
+	 * @since 2.1.000 (2008-01-08)
+	 */
+	protected function _outCurve($x1, $y1, $x2, $y2, $x3, $y3) {
+		if ($this->state == 2) {
+			$this->_out(sprintf('%F %F %F %F %F %F c', ($x1 * $this->k), (($this->h - $y1) * $this->k), ($x2 * $this->k), (($this->h - $y2) * $this->k), ($x3 * $this->k), (($this->h - $y3) * $this->k)));
+		}
+	}
+
+	/**
+	 * Append a cubic B�zier curve to the current path. The curve shall extend from the current point to the point (x3, y3), using the current point and (x2, y2) as the B�zier control points.
+	 * The new current point shall be (x3, y3).
+	 * @param $x2 (float) Abscissa of control point 2.
+	 * @param $y2 (float) Ordinate of control point 2.
+	 * @param $x3 (float) Abscissa of end point.
+	 * @param $y3 (float) Ordinate of end point.
+	 * @protected
+	 * @since 4.9.019 (2010-04-26)
+	 */
+	protected function _outCurveV($x2, $y2, $x3, $y3) {
+		if ($this->state == 2) {
+			$this->_out(sprintf('%F %F %F %F v', ($x2 * $this->k), (($this->h - $y2) * $this->k), ($x3 * $this->k), (($this->h - $y3) * $this->k)));
+		}
+	}
+
+	/**
+	 * Append a cubic B�zier curve to the current path. The curve shall extend from the current point to the point (x3, y3), using (x1, y1) and (x3, y3) as the B�zier control points.
+	 * The new current point shall be (x3, y3).
+	 * @param $x1 (float) Abscissa of control point 1.
+	 * @param $y1 (float) Ordinate of control point 1.
+	 * @param $x3 (float) Abscissa of end point.
+	 * @param $y3 (float) Ordinate of end point.
+	 * @protected
+	 * @since 2.1.000 (2008-01-08)
+	 */
+	protected function _outCurveY($x1, $y1, $x3, $y3) {
+		if ($this->state == 2) {
+			$this->_out(sprintf('%F %F %F %F y', ($x1 * $this->k), (($this->h - $y1) * $this->k), ($x3 * $this->k), (($this->h - $y3) * $this->k)));
+		}
+	}
+
+	/**
+	 * Draws a line between two points.
+	 * @param $x1 (float) Abscissa of first point.
+	 * @param $y1 (float) Ordinate of first point.
+	 * @param $x2 (float) Abscissa of second point.
+	 * @param $y2 (float) Ordinate of second point.
+	 * @param $style (array) Line style. Array like for SetLineStyle(). Default value: default line style (empty array).
+	 * @public
+	 * @since 1.0
+	 * @see SetLineWidth(), SetDrawColor(), SetLineStyle()
+	 */
+	public function Line($x1, $y1, $x2, $y2, $style=array()) {
+		if ($this->state != 2) {
+			return;
+		}
+		if (is_array($style)) {
+			$this->SetLineStyle($style);
+		}
+		$this->_outPoint($x1, $y1);
+		$this->_outLine($x2, $y2);
+		$this->_out('S');
+	}
+
+	/**
+	 * Draws a rectangle.
+	 * @param $x (float) Abscissa of upper-left corner.
+	 * @param $y (float) Ordinate of upper-left corner.
+	 * @param $w (float) Width.
+	 * @param $h (float) Height.
+	 * @param $style (string) Style of rendering. See the getPathPaintOperator() function for more information.
+	 * @param $border_style (array) Border style of rectangle. Array with keys among the following:
+	 * <ul>
+	 *	 <li>all: Line style of all borders. Array like for SetLineStyle().</li>
+	 *	 <li>L, T, R, B or combinations: Line style of left, top, right or bottom border. Array like for SetLineStyle().</li>
+	 * </ul>
+	 * If a key is not present or is null, the correspondent border is not drawn. Default value: default line style (empty array).
+	 * @param $fill_color (array) Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K) or array(C,M,Y,K,SpotColorName). Default value: default color (empty array).
+	 * @public
+	 * @since 1.0
+	 * @see SetLineStyle()
+	 */
+	public function Rect($x, $y, $w, $h, $style='', $border_style=array(), $fill_color=array()) {
+		if ($this->state != 2) {
+			return;
+		}
+		if (empty($style)) {
+			$style = 'S';
+		}
+		if (!(strpos($style, 'F') === false) AND !empty($fill_color)) {
+			// set background color
+			$this->SetFillColorArray($fill_color);
+		}
+		if (!empty($border_style)) {
+			if (isset($border_style['all']) AND !empty($border_style['all'])) {
+				//set global style for border
+				$this->SetLineStyle($border_style['all']);
+				$border_style = array();
+			} else {
+				// remove stroke operator from style
+				$opnostroke = array('S' => '', 'D' => '', 's' => '', 'd' => '', 'B' => 'F', 'FD' => 'F', 'DF' => 'F', 'B*' => 'F*', 'F*D' => 'F*', 'DF*' => 'F*', 'b' => 'f', 'fd' => 'f', 'df' => 'f', 'b*' => 'f*', 'f*d' => 'f*', 'df*' => 'f*' );
+				if (isset($opnostroke[$style])) {
+					$style = $opnostroke[$style];
+				}
+			}
+		}
+		if (!empty($style)) {
+			$op = TCPDF_STATIC::getPathPaintOperator($style);
+			$this->_outRect($x, $y, $w, $h, $op);
+		}
+		if (!empty($border_style)) {
+			$border_style2 = array();
+			foreach ($border_style as $line => $value) {
+				$length = strlen($line);
+				for ($i = 0; $i < $length; ++$i) {
+					$border_style2[$line[$i]] = $value;
+				}
+			}
+			$border_style = $border_style2;
+			if (isset($border_style['L']) AND $border_style['L']) {
+				$this->Line($x, $y, $x, $y + $h, $border_style['L']);
+			}
+			if (isset($border_style['T']) AND $border_style['T']) {
+				$this->Line($x, $y, $x + $w, $y, $border_style['T']);
+			}
+			if (isset($border_style['R']) AND $border_style['R']) {
+				$this->Line($x + $w, $y, $x + $w, $y + $h, $border_style['R']);
+			}
+			if (isset($border_style['B']) AND $border_style['B']) {
+				$this->Line($x, $y + $h, $x + $w, $y + $h, $border_style['B']);
+			}
+		}
+	}
+
+	/**
+	 * Draws a Bezier curve.
+	 * The Bezier curve is a tangent to the line between the control points at
+	 * either end of the curve.
+	 * @param $x0 (float) Abscissa of start point.
+	 * @param $y0 (float) Ordinate of start point.
+	 * @param $x1 (float) Abscissa of control point 1.
+	 * @param $y1 (float) Ordinate of control point 1.
+	 * @param $x2 (float) Abscissa of control point 2.
+	 * @param $y2 (float) Ordinate of control point 2.
+	 * @param $x3 (float) Abscissa of end point.
+	 * @param $y3 (float) Ordinate of end point.
+	 * @param $style (string) Style of rendering. See the getPathPaintOperator() function for more information.
+	 * @param $line_style (array) Line style of curve. Array like for SetLineStyle(). Default value: default line style (empty array).
+	 * @param $fill_color (array) Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K) or array(C,M,Y,K,SpotColorName). Default value: default color (empty array).
+	 * @public
+	 * @see SetLineStyle()
+	 * @since 2.1.000 (2008-01-08)
+	 */
+	public function Curve($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3, $style='', $line_style=array(), $fill_color=array()) {
+		if ($this->state != 2) {
+			return;
+		}
+		if (!(false === strpos($style, 'F')) AND isset($fill_color)) {
+			$this->SetFillColorArray($fill_color);
+		}
+		$op = TCPDF_STATIC::getPathPaintOperator($style);
+		if ($line_style) {
+			$this->SetLineStyle($line_style);
+		}
+		$this->_outPoint($x0, $y0);
+		$this->_outCurve($x1, $y1, $x2, $y2, $x3, $y3);
+		$this->_out($op);
+	}
+
+	/**
+	 * Draws a poly-Bezier curve.
+	 * Each Bezier curve segment is a tangent to the line between the control points at
+	 * either end of the curve.
+	 * @param $x0 (float) Abscissa of start point.
+	 * @param $y0 (float) Ordinate of start point.
+	 * @param $segments (float) An array of bezier descriptions. Format: array(x1, y1, x2, y2, x3, y3).
+	 * @param $style (string) Style of rendering. See the getPathPaintOperator() function for more information.
+	 * @param $line_style (array) Line style of curve. Array like for SetLineStyle(). Default value: default line style (empty array).
+	 * @param $fill_color (array) Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K) or array(C,M,Y,K,SpotColorName). Default value: default color (empty array).
+	 * @public
+	 * @see SetLineStyle()
+	 * @since 3.0008 (2008-05-12)
+	 */
+	public function Polycurve($x0, $y0, $segments, $style='', $line_style=array(), $fill_color=array()) {
+		if ($this->state != 2) {
+			return;
+		}
+		if (!(false === strpos($style, 'F')) AND isset($fill_color)) {
+			$this->SetFillColorArray($fill_color);
+		}
+		$op = TCPDF_STATIC::getPathPaintOperator($style);
+		if ($op == 'f') {
+			$line_style = array();
+		}
+		if ($line_style) {
+			$this->SetLineStyle($line_style);
+		}
+		$this->_outPoint($x0, $y0);
+		foreach ($segments as $segment) {
+			list($x1, $y1, $x2, $y2, $x3, $y3) = $segment;
+			$this->_outCurve($x1, $y1, $x2, $y2, $x3, $y3);
+		}
+		$this->_out($op);
+	}
+
+	/**
+	 * Draws an ellipse.
+	 * An ellipse is formed from n Bezier curves.
+	 * @param $x0 (float) Abscissa of center point.
+	 * @param $y0 (float) Ordinate of center point.
+	 * @param $rx (float) Horizontal radius.
+	 * @param $ry (float) Vertical radius (if ry = 0 then is a circle, see Circle()). Default value: 0.
+	 * @param $angle: (float) Angle oriented (anti-clockwise). Default value: 0.
+	 * @param $astart: (float) Angle start of draw line. Default value: 0.
+	 * @param $afinish: (float) Angle finish of draw line. Default value: 360.
+	 * @param $style (string) Style of rendering. See the getPathPaintOperator() function for more information.
+	 * @param $line_style (array) Line style of ellipse. Array like for SetLineStyle(). Default value: default line style (empty array).
+	 * @param $fill_color (array) Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K) or array(C,M,Y,K,SpotColorName). Default value: default color (empty array).
+	 * @param $nc (integer) Number of curves used to draw a 90 degrees portion of ellipse.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 2.1.000 (2008-01-08)
+	 */
+	public function Ellipse($x0, $y0, $rx, $ry='', $angle=0, $astart=0, $afinish=360, $style='', $line_style=array(), $fill_color=array(), $nc=2) {
+		if ($this->state != 2) {
+			return;
+		}
+		if (TCPDF_STATIC::empty_string($ry) OR ($ry == 0)) {
+			$ry = $rx;
+		}
+		if (!(false === strpos($style, 'F')) AND isset($fill_color)) {
+			$this->SetFillColorArray($fill_color);
+		}
+		$op = TCPDF_STATIC::getPathPaintOperator($style);
+		if ($op == 'f') {
+			$line_style = array();
+		}
+		if ($line_style) {
+			$this->SetLineStyle($line_style);
+		}
+		$this->_outellipticalarc($x0, $y0, $rx, $ry, $angle, $astart, $afinish, false, $nc, true, true, false);
+		$this->_out($op);
+	}
+
+	/**
+	 * Append an elliptical arc to the current path.
+	 * An ellipse is formed from n Bezier curves.
+	 * @param $xc (float) Abscissa of center point.
+	 * @param $yc (float) Ordinate of center point.
+	 * @param $rx (float) Horizontal radius.
+	 * @param $ry (float) Vertical radius (if ry = 0 then is a circle, see Circle()). Default value: 0.
+	 * @param $xang: (float) Angle between the X-axis and the major axis of the ellipse. Default value: 0.
+	 * @param $angs: (float) Angle start of draw line. Default value: 0.
+	 * @param $angf: (float) Angle finish of draw line. Default value: 360.
+	 * @param $pie (boolean) if true do not mark the border point (used to draw pie sectors).
+	 * @param $nc (integer) Number of curves used to draw a 90 degrees portion of ellipse.
+	 * @param $startpoint (boolean) if true output a starting point.
+	 * @param $ccw (boolean) if true draws in counter-clockwise.
+	 * @param $svg (boolean) if true the angles are in svg mode (already calculated).
+	 * @return array bounding box coordinates (x min, y min, x max, y max)
+	 * @author Nicola Asuni
+	 * @protected
+	 * @since 4.9.019 (2010-04-26)
+	 */
+	protected function _outellipticalarc($xc, $yc, $rx, $ry, $xang=0, $angs=0, $angf=360, $pie=false, $nc=2, $startpoint=true, $ccw=true, $svg=false) {
+		if (($rx <= 0) OR ($ry < 0)) {
+			return;
+		}
+		$k = $this->k;
+		if ($nc < 2) {
+			$nc = 2;
+		}
+		$xmin = 2147483647;
+		$ymin = 2147483647;
+		$xmax = 0;
+		$ymax = 0;
+		if ($pie) {
+			// center of the arc
+			$this->_outPoint($xc, $yc);
+		}
+		$xang = deg2rad((float) $xang);
+		$angs = deg2rad((float) $angs);
+		$angf = deg2rad((float) $angf);
+		if ($svg) {
+			$as = $angs;
+			$af = $angf;
+		} else {
+			$as = atan2((sin($angs) / $ry), (cos($angs) / $rx));
+			$af = atan2((sin($angf) / $ry), (cos($angf) / $rx));
+		}
+		if ($as < 0) {
+			$as += (2 * M_PI);
+		}
+		if ($af < 0) {
+			$af += (2 * M_PI);
+		}
+		if ($ccw AND ($as > $af)) {
+			// reverse rotation
+			$as -= (2 * M_PI);
+		} elseif (!$ccw AND ($as < $af)) {
+			// reverse rotation
+			$af -= (2 * M_PI);
+		}
+		$total_angle = ($af - $as);
+		if ($nc < 2) {
+			$nc = 2;
+		}
+		// total arcs to draw
+		$nc *= (2 * abs($total_angle) / M_PI);
+		$nc = round($nc) + 1;
+		// angle of each arc
+		$arcang = ($total_angle / $nc);
+		// center point in PDF coordinates
+		$x0 = $xc;
+		$y0 = ($this->h - $yc);
+		// starting angle
+		$ang = $as;
+		$alpha = sin($arcang) * ((sqrt(4 + (3 * pow(tan(($arcang) / 2), 2))) - 1) / 3);
+		$cos_xang = cos($xang);
+		$sin_xang = sin($xang);
+		$cos_ang = cos($ang);
+		$sin_ang = sin($ang);
+		// first arc point
+		$px1 = $x0 + ($rx * $cos_xang * $cos_ang) - ($ry * $sin_xang * $sin_ang);
+		$py1 = $y0 + ($rx * $sin_xang * $cos_ang) + ($ry * $cos_xang * $sin_ang);
+		// first Bezier control point
+		$qx1 = ($alpha * ((-$rx * $cos_xang * $sin_ang) - ($ry * $sin_xang * $cos_ang)));
+		$qy1 = ($alpha * ((-$rx * $sin_xang * $sin_ang) + ($ry * $cos_xang * $cos_ang)));
+		if ($pie) {
+			// line from center to arc starting point
+			$this->_outLine($px1, $this->h - $py1);
+		} elseif ($startpoint) {
+			// arc starting point
+			$this->_outPoint($px1, $this->h - $py1);
+		}
+		// draw arcs
+		for ($i = 1; $i <= $nc; ++$i) {
+			// starting angle
+			$ang = $as + ($i * $arcang);
+			if ($i == $nc) {
+				$ang = $af;
+			}
+			$cos_ang = cos($ang);
+			$sin_ang = sin($ang);
+			// second arc point
+			$px2 = $x0 + ($rx * $cos_xang * $cos_ang) - ($ry * $sin_xang * $sin_ang);
+			$py2 = $y0 + ($rx * $sin_xang * $cos_ang) + ($ry * $cos_xang * $sin_ang);
+			// second Bezier control point
+			$qx2 = ($alpha * ((-$rx * $cos_xang * $sin_ang) - ($ry * $sin_xang * $cos_ang)));
+			$qy2 = ($alpha * ((-$rx * $sin_xang * $sin_ang) + ($ry * $cos_xang * $cos_ang)));
+			// draw arc
+			$cx1 = ($px1 + $qx1);
+			$cy1 = ($this->h - ($py1 + $qy1));
+			$cx2 = ($px2 - $qx2);
+			$cy2 = ($this->h - ($py2 - $qy2));
+			$cx3 = $px2;
+			$cy3 = ($this->h - $py2);
+			$this->_outCurve($cx1, $cy1, $cx2, $cy2, $cx3, $cy3);
+			// get bounding box coordinates
+			$xmin = min($xmin, $cx1, $cx2, $cx3);
+			$ymin = min($ymin, $cy1, $cy2, $cy3);
+			$xmax = max($xmax, $cx1, $cx2, $cx3);
+			$ymax = max($ymax, $cy1, $cy2, $cy3);
+			// move to next point
+			$px1 = $px2;
+			$py1 = $py2;
+			$qx1 = $qx2;
+			$qy1 = $qy2;
+		}
+		if ($pie) {
+			$this->_outLine($xc, $yc);
+			// get bounding box coordinates
+			$xmin = min($xmin, $xc);
+			$ymin = min($ymin, $yc);
+			$xmax = max($xmax, $xc);
+			$ymax = max($ymax, $yc);
+		}
+		return array($xmin, $ymin, $xmax, $ymax);
+	}
+
+	/**
+	 * Draws a circle.
+	 * A circle is formed from n Bezier curves.
+	 * @param $x0 (float) Abscissa of center point.
+	 * @param $y0 (float) Ordinate of center point.
+	 * @param $r (float) Radius.
+	 * @param $angstr: (float) Angle start of draw line. Default value: 0.
+	 * @param $angend: (float) Angle finish of draw line. Default value: 360.
+	 * @param $style (string) Style of rendering. See the getPathPaintOperator() function for more information.
+	 * @param $line_style (array) Line style of circle. Array like for SetLineStyle(). Default value: default line style (empty array).
+	 * @param $fill_color (array) Fill color. Format: array(red, green, blue). Default value: default color (empty array).
+	 * @param $nc (integer) Number of curves used to draw a 90 degrees portion of circle.
+	 * @public
+	 * @since 2.1.000 (2008-01-08)
+	 */
+	public function Circle($x0, $y0, $r, $angstr=0, $angend=360, $style='', $line_style=array(), $fill_color=array(), $nc=2) {
+		$this->Ellipse($x0, $y0, $r, $r, 0, $angstr, $angend, $style, $line_style, $fill_color, $nc);
+	}
+
+	/**
+	 * Draws a polygonal line
+	 * @param $p (array) Points 0 to ($np - 1). Array with values (x0, y0, x1, y1,..., x(np-1), y(np - 1))
+	 * @param $style (string) Style of rendering. See the getPathPaintOperator() function for more information.
+	 * @param $line_style (array) Line style of polygon. Array with keys among the following:
+	 * <ul>
+	 *	 <li>all: Line style of all lines. Array like for SetLineStyle().</li>
+	 *	 <li>0 to ($np - 1): Line style of each line. Array like for SetLineStyle().</li>
+	 * </ul>
+	 * If a key is not present or is null, not draws the line. Default value is default line style (empty array).
+	 * @param $fill_color (array) Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K) or array(C,M,Y,K,SpotColorName). Default value: default color (empty array).
+	 * @since 4.8.003 (2009-09-15)
+	 * @public
+	 */
+	public function PolyLine($p, $style='', $line_style=array(), $fill_color=array()) {
+		$this->Polygon($p, $style, $line_style, $fill_color, false);
+	}
+
+	/**
+	 * Draws a polygon.
+	 * @param $p (array) Points 0 to ($np - 1). Array with values (x0, y0, x1, y1,..., x(np-1), y(np - 1))
+	 * @param $style (string) Style of rendering. See the getPathPaintOperator() function for more information.
+	 * @param $line_style (array) Line style of polygon. Array with keys among the following:
+	 * <ul>
+	 *	 <li>all: Line style of all lines. Array like for SetLineStyle().</li>
+	 *	 <li>0 to ($np - 1): Line style of each line. Array like for SetLineStyle().</li>
+	 * </ul>
+	 * If a key is not present or is null, not draws the line. Default value is default line style (empty array).
+	 * @param $fill_color (array) Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K) or array(C,M,Y,K,SpotColorName). Default value: default color (empty array).
+	 * @param $closed (boolean) if true the polygon is closes, otherwise will remain open
+	 * @public
+	 * @since 2.1.000 (2008-01-08)
+	 */
+	public function Polygon($p, $style='', $line_style=array(), $fill_color=array(), $closed=true) {
+		if ($this->state != 2) {
+			return;
+		}
+		$nc = count($p); // number of coordinates
+		$np = $nc / 2; // number of points
+		if ($closed) {
+			// close polygon by adding the first 2 points at the end (one line)
+			for ($i = 0; $i < 4; ++$i) {
+				$p[$nc + $i] = $p[$i];
+			}
+			// copy style for the last added line
+			if (isset($line_style[0])) {
+				$line_style[$np] = $line_style[0];
+			}
+			$nc += 4;
+		}
+		if (!(false === strpos($style, 'F')) AND isset($fill_color)) {
+			$this->SetFillColorArray($fill_color);
+		}
+		$op = TCPDF_STATIC::getPathPaintOperator($style);
+		if ($op == 'f') {
+			$line_style = array();
+		}
+		$draw = true;
+		if ($line_style) {
+			if (isset($line_style['all'])) {
+				$this->SetLineStyle($line_style['all']);
+			} else {
+				$draw = false;
+				if ($op == 'B') {
+					// draw fill
+					$op = 'f';
+					$this->_outPoint($p[0], $p[1]);
+					for ($i = 2; $i < $nc; $i = $i + 2) {
+						$this->_outLine($p[$i], $p[$i + 1]);
+					}
+					$this->_out($op);
+				}
+				// draw outline
+				$this->_outPoint($p[0], $p[1]);
+				for ($i = 2; $i < $nc; $i = $i + 2) {
+					$line_num = ($i / 2) - 1;
+					if (isset($line_style[$line_num])) {
+						if ($line_style[$line_num] != 0) {
+							if (is_array($line_style[$line_num])) {
+								$this->_out('S');
+								$this->SetLineStyle($line_style[$line_num]);
+								$this->_outPoint($p[$i - 2], $p[$i - 1]);
+								$this->_outLine($p[$i], $p[$i + 1]);
+								$this->_out('S');
+								$this->_outPoint($p[$i], $p[$i + 1]);
+							} else {
+								$this->_outLine($p[$i], $p[$i + 1]);
+							}
+						}
+					} else {
+						$this->_outLine($p[$i], $p[$i + 1]);
+					}
+				}
+				$this->_out($op);
+			}
+		}
+		if ($draw) {
+			$this->_outPoint($p[0], $p[1]);
+			for ($i = 2; $i < $nc; $i = $i + 2) {
+				$this->_outLine($p[$i], $p[$i + 1]);
+			}
+			$this->_out($op);
+		}
+	}
+
+	/**
+	 * Draws a regular polygon.
+	 * @param $x0 (float) Abscissa of center point.
+	 * @param $y0 (float) Ordinate of center point.
+	 * @param $r: (float) Radius of inscribed circle.
+	 * @param $ns (integer) Number of sides.
+	 * @param $angle (float) Angle oriented (anti-clockwise). Default value: 0.
+	 * @param $draw_circle (boolean) Draw inscribed circle or not. Default value: false.
+	 * @param $style (string) Style of rendering. See the getPathPaintOperator() function for more information.
+	 * @param $line_style (array) Line style of polygon sides. Array with keys among the following:
+	 * <ul>
+	 *	 <li>all: Line style of all sides. Array like for SetLineStyle().</li>
+	 *	 <li>0 to ($ns - 1): Line style of each side. Array like for SetLineStyle().</li>
+	 * </ul>
+	 * If a key is not present or is null, not draws the side. Default value is default line style (empty array).
+	 * @param $fill_color (array) Fill color. Format: array(red, green, blue). Default value: default color (empty array).
+	 * @param $circle_style (string) Style of rendering of inscribed circle (if draws). Possible values are:
+	 * <ul>
+	 *	 <li>D or empty string: Draw (default).</li>
+	 *	 <li>F: Fill.</li>
+	 *	 <li>DF or FD: Draw and fill.</li>
+	 *	 <li>CNZ: Clipping mode (using the even-odd rule to determine which regions lie inside the clipping path).</li>
+	 *	 <li>CEO: Clipping mode (using the nonzero winding number rule to determine which regions lie inside the clipping path).</li>
+	 * </ul>
+	 * @param $circle_outLine_style (array) Line style of inscribed circle (if draws). Array like for SetLineStyle(). Default value: default line style (empty array).
+	 * @param $circle_fill_color (array) Fill color of inscribed circle (if draws). Format: array(red, green, blue). Default value: default color (empty array).
+	 * @public
+	 * @since 2.1.000 (2008-01-08)
+	 */
+	public function RegularPolygon($x0, $y0, $r, $ns, $angle=0, $draw_circle=false, $style='', $line_style=array(), $fill_color=array(), $circle_style='', $circle_outLine_style=array(), $circle_fill_color=array()) {
+		if (3 > $ns) {
+			$ns = 3;
+		}
+		if ($draw_circle) {
+			$this->Circle($x0, $y0, $r, 0, 360, $circle_style, $circle_outLine_style, $circle_fill_color);
+		}
+		$p = array();
+		for ($i = 0; $i < $ns; ++$i) {
+			$a = $angle + ($i * 360 / $ns);
+			$a_rad = deg2rad((float) $a);
+			$p[] = $x0 + ($r * sin($a_rad));
+			$p[] = $y0 + ($r * cos($a_rad));
+		}
+		$this->Polygon($p, $style, $line_style, $fill_color);
+	}
+
+	/**
+	 * Draws a star polygon
+	 * @param $x0 (float) Abscissa of center point.
+	 * @param $y0 (float) Ordinate of center point.
+	 * @param $r (float) Radius of inscribed circle.
+	 * @param $nv (integer) Number of vertices.
+	 * @param $ng (integer) Number of gap (if ($ng % $nv = 1) then is a regular polygon).
+	 * @param $angle: (float) Angle oriented (anti-clockwise). Default value: 0.
+	 * @param $draw_circle: (boolean) Draw inscribed circle or not. Default value is false.
+	 * @param $style (string) Style of rendering. See the getPathPaintOperator() function for more information.
+	 * @param $line_style (array) Line style of polygon sides. Array with keys among the following:
+	 * <ul>
+	 *	 <li>all: Line style of all sides. Array like for
+	 * SetLineStyle().</li>
+	 *	 <li>0 to (n - 1): Line style of each side. Array like for SetLineStyle().</li>
+	 * </ul>
+	 * If a key is not present or is null, not draws the side. Default value is default line style (empty array).
+	 * @param $fill_color (array) Fill color. Format: array(red, green, blue). Default value: default color (empty array).
+	 * @param $circle_style (string) Style of rendering of inscribed circle (if draws). Possible values are:
+	 * <ul>
+	 *	 <li>D or empty string: Draw (default).</li>
+	 *	 <li>F: Fill.</li>
+	 *	 <li>DF or FD: Draw and fill.</li>
+	 *	 <li>CNZ: Clipping mode (using the even-odd rule to determine which regions lie inside the clipping path).</li>
+	 *	 <li>CEO: Clipping mode (using the nonzero winding number rule to determine which regions lie inside the clipping path).</li>
+	 * </ul>
+	 * @param $circle_outLine_style (array) Line style of inscribed circle (if draws). Array like for SetLineStyle(). Default value: default line style (empty array).
+	 * @param $circle_fill_color (array) Fill color of inscribed circle (if draws). Format: array(red, green, blue). Default value: default color (empty array).
+	 * @public
+	 * @since 2.1.000 (2008-01-08)
+	 */
+	public function StarPolygon($x0, $y0, $r, $nv, $ng, $angle=0, $draw_circle=false, $style='', $line_style=array(), $fill_color=array(), $circle_style='', $circle_outLine_style=array(), $circle_fill_color=array()) {
+		if ($nv < 2) {
+			$nv = 2;
+		}
+		if ($draw_circle) {
+			$this->Circle($x0, $y0, $r, 0, 360, $circle_style, $circle_outLine_style, $circle_fill_color);
+		}
+		$p2 = array();
+		$visited = array();
+		for ($i = 0; $i < $nv; ++$i) {
+			$a = $angle + ($i * 360 / $nv);
+			$a_rad = deg2rad((float) $a);
+			$p2[] = $x0 + ($r * sin($a_rad));
+			$p2[] = $y0 + ($r * cos($a_rad));
+			$visited[] = false;
+		}
+		$p = array();
+		$i = 0;
+		do {
+			$p[] = $p2[$i * 2];
+			$p[] = $p2[($i * 2) + 1];
+			$visited[$i] = true;
+			$i += $ng;
+			$i %= $nv;
+		} while (!$visited[$i]);
+		$this->Polygon($p, $style, $line_style, $fill_color);
+	}
+
+	/**
+	 * Draws a rounded rectangle.
+	 * @param $x (float) Abscissa of upper-left corner.
+	 * @param $y (float) Ordinate of upper-left corner.
+	 * @param $w (float) Width.
+	 * @param $h (float) Height.
+	 * @param $r (float) the radius of the circle used to round off the corners of the rectangle.
+	 * @param $round_corner (string) Draws rounded corner or not. String with a 0 (not rounded i-corner) or 1 (rounded i-corner) in i-position. Positions are, in order and begin to 0: top right, bottom right, bottom left and top left. Default value: all rounded corner ("1111").
+	 * @param $style (string) Style of rendering. See the getPathPaintOperator() function for more information.
+	 * @param $border_style (array) Border style of rectangle. Array like for SetLineStyle(). Default value: default line style (empty array).
+	 * @param $fill_color (array) Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K) or array(C,M,Y,K,SpotColorName). Default value: default color (empty array).
+	 * @public
+	 * @since 2.1.000 (2008-01-08)
+	 */
+	public function RoundedRect($x, $y, $w, $h, $r, $round_corner='1111', $style='', $border_style=array(), $fill_color=array()) {
+		$this->RoundedRectXY($x, $y, $w, $h, $r, $r, $round_corner, $style, $border_style, $fill_color);
+	}
+
+	/**
+	 * Draws a rounded rectangle.
+	 * @param $x (float) Abscissa of upper-left corner.
+	 * @param $y (float) Ordinate of upper-left corner.
+	 * @param $w (float) Width.
+	 * @param $h (float) Height.
+	 * @param $rx (float) the x-axis radius of the ellipse used to round off the corners of the rectangle.
+	 * @param $ry (float) the y-axis radius of the ellipse used to round off the corners of the rectangle.
+	 * @param $round_corner (string) Draws rounded corner or not. String with a 0 (not rounded i-corner) or 1 (rounded i-corner) in i-position. Positions are, in order and begin to 0: top right, bottom right, bottom left and top left. Default value: all rounded corner ("1111").
+	 * @param $style (string) Style of rendering. See the getPathPaintOperator() function for more information.
+	 * @param $border_style (array) Border style of rectangle. Array like for SetLineStyle(). Default value: default line style (empty array).
+	 * @param $fill_color (array) Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K) or array(C,M,Y,K,SpotColorName). Default value: default color (empty array).
+	 * @public
+	 * @since 4.9.019 (2010-04-22)
+	 */
+	public function RoundedRectXY($x, $y, $w, $h, $rx, $ry, $round_corner='1111', $style='', $border_style=array(), $fill_color=array()) {
+		if ($this->state != 2) {
+			return;
+		}
+		if (($round_corner == '0000') OR (($rx == $ry) AND ($rx == 0))) {
+			// Not rounded
+			$this->Rect($x, $y, $w, $h, $style, $border_style, $fill_color);
+			return;
+		}
+		// Rounded
+		if (!(false === strpos($style, 'F')) AND isset($fill_color)) {
+			$this->SetFillColorArray($fill_color);
+		}
+		$op = TCPDF_STATIC::getPathPaintOperator($style);
+		if ($op == 'f') {
+			$border_style = array();
+		}
+		if ($border_style) {
+			$this->SetLineStyle($border_style);
+		}
+		$MyArc = 4 / 3 * (sqrt(2) - 1);
+		$this->_outPoint($x + $rx, $y);
+		$xc = $x + $w - $rx;
+		$yc = $y + $ry;
+		$this->_outLine($xc, $y);
+		if ($round_corner[0]) {
+			$this->_outCurve($xc + ($rx * $MyArc), $yc - $ry, $xc + $rx, $yc - ($ry * $MyArc), $xc + $rx, $yc);
+		} else {
+			$this->_outLine($x + $w, $y);
+		}
+		$xc = $x + $w - $rx;
+		$yc = $y + $h - $ry;
+		$this->_outLine($x + $w, $yc);
+		if ($round_corner[1]) {
+			$this->_outCurve($xc + $rx, $yc + ($ry * $MyArc), $xc + ($rx * $MyArc), $yc + $ry, $xc, $yc + $ry);
+		} else {
+			$this->_outLine($x + $w, $y + $h);
+		}
+		$xc = $x + $rx;
+		$yc = $y + $h - $ry;
+		$this->_outLine($xc, $y + $h);
+		if ($round_corner[2]) {
+			$this->_outCurve($xc - ($rx * $MyArc), $yc + $ry, $xc - $rx, $yc + ($ry * $MyArc), $xc - $rx, $yc);
+		} else {
+			$this->_outLine($x, $y + $h);
+		}
+		$xc = $x + $rx;
+		$yc = $y + $ry;
+		$this->_outLine($x, $yc);
+		if ($round_corner[3]) {
+			$this->_outCurve($xc - $rx, $yc - ($ry * $MyArc), $xc - ($rx * $MyArc), $yc - $ry, $xc, $yc - $ry);
+		} else {
+			$this->_outLine($x, $y);
+			$this->_outLine($x + $rx, $y);
+		}
+		$this->_out($op);
+	}
+
+	/**
+	 * Draws a grahic arrow.
+	 * @param $x0 (float) Abscissa of first point.
+	 * @param $y0 (float) Ordinate of first point.
+	 * @param $x1 (float) Abscissa of second point.
+	 * @param $y1 (float) Ordinate of second point.
+	 * @param $head_style (int) (0 = draw only arrowhead arms, 1 = draw closed arrowhead, but no fill, 2 = closed and filled arrowhead, 3 = filled arrowhead)
+	 * @param $arm_size (float) length of arrowhead arms
+	 * @param $arm_angle (int) angle between an arm and the shaft
+	 * @author Piotr Galecki, Nicola Asuni, Andy Meier
+	 * @since 4.6.018 (2009-07-10)
+	 */
+	public function Arrow($x0, $y0, $x1, $y1, $head_style=0, $arm_size=5, $arm_angle=15) {
+		// getting arrow direction angle
+		// 0 deg angle is when both arms go along X axis. angle grows clockwise.
+		$dir_angle = atan2(($y0 - $y1), ($x0 - $x1));
+		if ($dir_angle < 0) {
+			$dir_angle += (2 * M_PI);
+		}
+		$arm_angle = deg2rad($arm_angle);
+		$sx1 = $x1;
+		$sy1 = $y1;
+		if ($head_style > 0) {
+			// calculate the stopping point for the arrow shaft
+			$sx1 = $x1 + (($arm_size - $this->LineWidth) * cos($dir_angle));
+			$sy1 = $y1 + (($arm_size - $this->LineWidth) * sin($dir_angle));
+		}
+		// main arrow line / shaft
+		$this->Line($x0, $y0, $sx1, $sy1);
+		// left arrowhead arm tip
+		$x2L = $x1 + ($arm_size * cos($dir_angle + $arm_angle));
+		$y2L = $y1 + ($arm_size * sin($dir_angle + $arm_angle));
+		// right arrowhead arm tip
+		$x2R = $x1 + ($arm_size * cos($dir_angle - $arm_angle));
+		$y2R = $y1 + ($arm_size * sin($dir_angle - $arm_angle));
+		$mode = 'D';
+		$style = array();
+		switch ($head_style) {
+			case 0: {
+				// draw only arrowhead arms
+				$mode = 'D';
+				$style = array(1, 1, 0);
+				break;
+			}
+			case 1: {
+				// draw closed arrowhead, but no fill
+				$mode = 'D';
+				break;
+			}
+			case 2: {
+				// closed and filled arrowhead
+				$mode = 'DF';
+				break;
+			}
+			case 3: {
+				// filled arrowhead
+				$mode = 'F';
+				break;
+			}
+		}
+		$this->Polygon(array($x2L, $y2L, $x1, $y1, $x2R, $y2R), $mode, $style, array());
+	}
+
+	// END GRAPHIC FUNCTIONS SECTION -----------------------
+
+	/**
+	 * Add a Named Destination.
+	 * NOTE: destination names are unique, so only last entry will be saved.
+	 * @param $name (string) Destination name.
+	 * @param $y (float) Y position in user units of the destiantion on the selected page (default = -1 = current position; 0 = page start;).
+	 * @param $page (int) Target page number (leave empty for current page).
+	 * @param $x (float) X position in user units of the destiantion on the selected page (default = -1 = current position;).
+	 * @return (string) Stripped named destination identifier or false in case of error.
+	 * @public
+	 * @author Christian Deligant, Nicola Asuni
+	 * @since 5.9.097 (2011-06-23)
+	 */
+	public function setDestination($name, $y=-1, $page='', $x=-1) {
+		// remove unsupported characters
+		$name = TCPDF_STATIC::encodeNameObject($name);
+		if (TCPDF_STATIC::empty_string($name)) {
+			return false;
+		}
+		if ($y == -1) {
+			$y = $this->GetY();
+		} elseif ($y < 0) {
+			$y = 0;
+		} elseif ($y > $this->h) {
+			$y = $this->h;
+		}
+		if ($x == -1) {
+			$x = $this->GetX();
+		} elseif ($x < 0) {
+			$x = 0;
+		} elseif ($x > $this->w) {
+			$x = $this->w;
+		}
+		if (empty($page)) {
+			$page = $this->PageNo();
+			if (empty($page)) {
+				return;
+			}
+		}
+		$this->dests[$name] = array('x' => $x, 'y' => $y, 'p' => $page);
+		return $name;
+	}
+
+	/**
+	 * Return the Named Destination array.
+	 * @return (array) Named Destination array.
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 5.9.097 (2011-06-23)
+	 */
+	public function getDestination() {
+		return $this->dests;
+	}
+
+	/**
+	 * Insert Named Destinations.
+	 * @protected
+	 * @author Johannes G�ntert, Nicola Asuni
+	 * @since 5.9.098 (2011-06-23)
+	 */
+	protected function _putdests() {
+		if (empty($this->dests)) {
+			return;
+		}
+		$this->n_dests = $this->_newobj();
+		$out = ' <<';
+		foreach($this->dests as $name => $o) {
+			$out .= ' /'.$name.' '.sprintf('[%u 0 R /XYZ %F %F null]', $this->page_obj_id[($o['p'])], ($o['x'] * $this->k), ($this->pagedim[$o['p']]['h'] - ($o['y'] * $this->k)));
+		}
+		$out .= ' >>';
+		$out .= "\n".'endobj';
+		$this->_out($out);
+	}
+
+	/**
+	 * Adds a bookmark - alias for Bookmark().
+	 * @param $txt (string) Bookmark description.
+	 * @param $level (int) Bookmark level (minimum value is 0).
+	 * @param $y (float) Y position in user units of the bookmark on the selected page (default = -1 = current position; 0 = page start;).
+	 * @param $page (int) Target page number (leave empty for current page).
+	 * @param $style (string) Font style: B = Bold, I = Italic, BI = Bold + Italic.
+	 * @param $color (array) RGB color array (values from 0 to 255).
+	 * @param $x (float) X position in user units of the bookmark on the selected page (default = -1 = current position;).
+	 * @param $link (mixed) URL, or numerical link ID, or named destination (# character followed by the destination name), or embedded file (* character followed by the file name).
+	 * @public
+	 */
+	public function setBookmark($txt, $level=0, $y=-1, $page='', $style='', $color=array(0,0,0), $x=-1, $link='') {
+		$this->Bookmark($txt, $level, $y, $page, $style, $color, $x, $link);
+	}
+
+	/**
+	 * Adds a bookmark.
+	 * @param $txt (string) Bookmark description.
+	 * @param $level (int) Bookmark level (minimum value is 0).
+	 * @param $y (float) Y position in user units of the bookmark on the selected page (default = -1 = current position; 0 = page start;).
+	 * @param $page (int) Target page number (leave empty for current page).
+	 * @param $style (string) Font style: B = Bold, I = Italic, BI = Bold + Italic.
+	 * @param $color (array) RGB color array (values from 0 to 255).
+	 * @param $x (float) X position in user units of the bookmark on the selected page (default = -1 = current position;).
+	 * @param $link (mixed) URL, or numerical link ID, or named destination (# character followed by the destination name), or embedded file (* character followed by the file name).
+	 * @public
+	 * @since 2.1.002 (2008-02-12)
+	 */
+	public function Bookmark($txt, $level=0, $y=-1, $page='', $style='', $color=array(0,0,0), $x=-1, $link='') {
+		if ($level < 0) {
+			$level = 0;
+		}
+		if (isset($this->outlines[0])) {
+			$lastoutline = end($this->outlines);
+			$maxlevel = $lastoutline['l'] + 1;
+		} else {
+			$maxlevel = 0;
+		}
+		if ($level > $maxlevel) {
+			$level = $maxlevel;
+		}
+		if ($y == -1) {
+			$y = $this->GetY();
+		} elseif ($y < 0) {
+			$y = 0;
+		} elseif ($y > $this->h) {
+			$y = $this->h;
+		}
+		if ($x == -1) {
+			$x = $this->GetX();
+		} elseif ($x < 0) {
+			$x = 0;
+		} elseif ($x > $this->w) {
+			$x = $this->w;
+		}
+		if (empty($page)) {
+			$page = $this->PageNo();
+			if (empty($page)) {
+				return;
+			}
+		}
+		$this->outlines[] = array('t' => $txt, 'l' => $level, 'x' => $x, 'y' => $y, 'p' => $page, 's' => strtoupper($style), 'c' => $color, 'u' => $link);
+	}
+
+	/**
+	 * Sort bookmarks for page and key.
+	 * @protected
+	 * @since 5.9.119 (2011-09-19)
+	 */
+	protected function sortBookmarks() {
+		// get sorting columns
+		$outline_p = array();
+		$outline_y = array();
+		foreach ($this->outlines as $key => $row) {
+			$outline_p[$key] = $row['p'];
+			$outline_k[$key] = $key;
+		}
+		// sort outlines by page and original position
+		array_multisort($outline_p, SORT_NUMERIC, SORT_ASC, $outline_k, SORT_NUMERIC, SORT_ASC, $this->outlines);
+	}
+
+	/**
+	 * Create a bookmark PDF string.
+	 * @protected
+	 * @author Olivier Plathey, Nicola Asuni
+	 * @since 2.1.002 (2008-02-12)
+	 */
+	protected function _putbookmarks() {
+		$nb = count($this->outlines);
+		if ($nb == 0) {
+			return;
+		}
+		// sort bookmarks
+		$this->sortBookmarks();
+		$lru = array();
+		$level = 0;
+		foreach ($this->outlines as $i => $o) {
+			if ($o['l'] > 0) {
+				$parent = $lru[($o['l'] - 1)];
+				//Set parent and last pointers
+				$this->outlines[$i]['parent'] = $parent;
+				$this->outlines[$parent]['last'] = $i;
+				if ($o['l'] > $level) {
+					//Level increasing: set first pointer
+					$this->outlines[$parent]['first'] = $i;
+				}
+			} else {
+				$this->outlines[$i]['parent'] = $nb;
+			}
+			if (($o['l'] <= $level) AND ($i > 0)) {
+				//Set prev and next pointers
+				$prev = $lru[$o['l']];
+				$this->outlines[$prev]['next'] = $i;
+				$this->outlines[$i]['prev'] = $prev;
+			}
+			$lru[$o['l']] = $i;
+			$level = $o['l'];
+		}
+		//Outline items
+		$n = $this->n + 1;
+		$nltags = '/<br[\s]?\/>|<\/(blockquote|dd|dl|div|dt|h1|h2|h3|h4|h5|h6|hr|li|ol|p|pre|ul|tcpdf|table|tr|td)>/si';
+		foreach ($this->outlines as $i => $o) {
+			$oid = $this->_newobj();
+			// covert HTML title to string
+			$title = preg_replace($nltags, "\n", $o['t']);
+			$title = preg_replace("/[\r]+/si", '', $title);
+			$title = preg_replace("/[\n]+/si", "\n", $title);
+			$title = strip_tags($title);
+			$title = $this->stringTrim($title);
+			$out = '<</Title '.$this->_textstring($title, $oid);
+			$out .= ' /Parent '.($n + $o['parent']).' 0 R';
+			if (isset($o['prev'])) {
+				$out .= ' /Prev '.($n + $o['prev']).' 0 R';
+			}
+			if (isset($o['next'])) {
+				$out .= ' /Next '.($n + $o['next']).' 0 R';
+			}
+			if (isset($o['first'])) {
+				$out .= ' /First '.($n + $o['first']).' 0 R';
+			}
+			if (isset($o['last'])) {
+				$out .= ' /Last '.($n + $o['last']).' 0 R';
+			}
+			if (isset($o['u']) AND !empty($o['u'])) {
+				// link
+				if (is_string($o['u'])) {
+					if ($o['u'][0] == '#') {
+						// internal destination
+						$out .= ' /Dest /'.TCPDF_STATIC::encodeNameObject(substr($o['u'], 1));
+					} elseif ($o['u'][0] == '%') {
+						// embedded PDF file
+						$filename = basename(substr($o['u'], 1));
+						$out .= ' /A <</S /GoToE /D [0 /Fit] /NewWindow true /T << /R /C /P '.($o['p'] - 1).' /A '.$this->embeddedfiles[$filename]['a'].' >> >>';
+					} elseif ($o['u'][0] == '*') {
+						// embedded generic file
+						$filename = basename(substr($o['u'], 1));
+						$jsa = 'var D=event.target.doc;var MyData=D.dataObjects;for (var i in MyData) if (MyData[i].path=="'.$filename.'") D.exportDataObject( { cName : MyData[i].name, nLaunch : 2});';
+						$out .= ' /A <</S /JavaScript /JS '.$this->_textstring($jsa, $oid).'>>';
+					} else {
+						// external URI link
+						$out .= ' /A <</S /URI /URI '.$this->_datastring($this->unhtmlentities($o['u']), $oid).'>>';
+					}
+				} elseif (isset($this->links[$o['u']])) {
+					// internal link ID
+					$l = $this->links[$o['u']];
+					if (isset($this->page_obj_id[($l[0])])) {
+						$out .= sprintf(' /Dest [%u 0 R /XYZ 0 %F null]', $this->page_obj_id[($l[0])], ($this->pagedim[$l[0]]['h'] - ($l[1] * $this->k)));
+					}
+				}
+			} elseif (isset($this->page_obj_id[($o['p'])])) {
+				// link to a page
+				$out .= ' '.sprintf('/Dest [%u 0 R /XYZ %F %F null]', $this->page_obj_id[($o['p'])], ($o['x'] * $this->k), ($this->pagedim[$o['p']]['h'] - ($o['y'] * $this->k)));
+			}
+			// set font style
+			$style = 0;
+			if (!empty($o['s'])) {
+				// bold
+				if (strpos($o['s'], 'B') !== false) {
+					$style |= 2;
+				}
+				// oblique
+				if (strpos($o['s'], 'I') !== false) {
+					$style |= 1;
+				}
+			}
+			$out .= sprintf(' /F %d', $style);
+			// set bookmark color
+			if (isset($o['c']) AND is_array($o['c']) AND (count($o['c']) == 3)) {
+				$color = array_values($o['c']);
+				$out .= sprintf(' /C [%F %F %F]', ($color[0] / 255), ($color[1] / 255), ($color[2] / 255));
+			} else {
+				// black
+				$out .= ' /C [0.0 0.0 0.0]';
+			}
+			$out .= ' /Count 0'; // normally closed item
+			$out .= ' >>';
+			$out .= "\n".'endobj';
+			$this->_out($out);
+		}
+		//Outline root
+		$this->OutlineRoot = $this->_newobj();
+		$this->_out('<< /Type /Outlines /First '.$n.' 0 R /Last '.($n + $lru[0]).' 0 R >>'."\n".'endobj');
+	}
+
+	// --- JAVASCRIPT ------------------------------------------------------
+
+	/**
+	 * Adds a javascript
+	 * @param $script (string) Javascript code
+	 * @public
+	 * @author Johannes G�ntert, Nicola Asuni
+	 * @since 2.1.002 (2008-02-12)
+	 */
+	public function IncludeJS($script) {
+		$this->javascript .= $script;
+	}
+
+	/**
+	 * Adds a javascript object and return object ID
+	 * @param $script (string) Javascript code
+	 * @param $onload (boolean) if true executes this object when opening the document
+	 * @return int internal object ID
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 4.8.000 (2009-09-07)
+	 */
+	public function addJavascriptObject($script, $onload=false) {
+		if ($this->pdfa_mode) {
+			// javascript is not allowed in PDF/A mode
+			return false;
+		}
+		++$this->n;
+		$this->js_objects[$this->n] = array('n' => $this->n, 'js' => $script, 'onload' => $onload);
+		return $this->n;
+	}
+
+	/**
+	 * Create a javascript PDF string.
+	 * @protected
+	 * @author Johannes G�ntert, Nicola Asuni
+	 * @since 2.1.002 (2008-02-12)
+	 */
+	protected function _putjavascript() {
+		if ($this->pdfa_mode OR (empty($this->javascript) AND empty($this->js_objects))) {
+			return;
+		}
+		if (strpos($this->javascript, 'this.addField') > 0) {
+			if (!$this->ur['enabled']) {
+				//$this->setUserRights();
+			}
+			// the following two lines are used to avoid form fields duplication after saving
+			// The addField method only works when releasing user rights (UR3)
+			$jsa = sprintf("ftcpdfdocsaved=this.addField('%s','%s',%d,[%F,%F,%F,%F]);", 'tcpdfdocsaved', 'text', 0, 0, 1, 0, 1);
+			$jsb = "getField('tcpdfdocsaved').value='saved';";
+			$this->javascript = $jsa."\n".$this->javascript."\n".$jsb;
+		}
+		// name tree for javascript
+		$this->n_js = '<< /Names [';
+		if (!empty($this->javascript)) {
+			$this->n_js .= ' (EmbeddedJS) '.($this->n + 1).' 0 R';
+		}
+		if (!empty($this->js_objects)) {
+			foreach ($this->js_objects as $key => $val) {
+				if ($val['onload']) {
+					$this->n_js .= ' (JS'.$key.') '.$key.' 0 R';
+				}
+			}
+		}
+		$this->n_js .= ' ] >>';
+		// default Javascript object
+		if (!empty($this->javascript)) {
+			$obj_id = $this->_newobj();
+			$out = '<< /S /JavaScript';
+			$out .= ' /JS '.$this->_textstring($this->javascript, $obj_id);
+			$out .= ' >>';
+			$out .= "\n".'endobj';
+			$this->_out($out);
+		}
+		// additional Javascript objects
+		if (!empty($this->js_objects)) {
+			foreach ($this->js_objects as $key => $val) {
+				$out = $this->_getobj($key)."\n".' << /S /JavaScript /JS '.$this->_textstring($val['js'], $key).' >>'."\n".'endobj';
+				$this->_out($out);
+			}
+		}
+	}
+
+	/**
+	 * Adds a javascript form field.
+	 * @param $type (string) field type
+	 * @param $name (string) field name
+	 * @param $x (int) horizontal position
+	 * @param $y (int) vertical position
+	 * @param $w (int) width
+	 * @param $h (int) height
+	 * @param $prop (array) javascript field properties. Possible values are described on official Javascript for Acrobat API reference.
+	 * @protected
+	 * @author Denis Van Nuffelen, Nicola Asuni
+	 * @since 2.1.002 (2008-02-12)
+	 */
+	protected function _addfield($type, $name, $x, $y, $w, $h, $prop) {
+		if ($this->rtl) {
+			$x = $x - $w;
+		}
+		// the followind avoid fields duplication after saving the document
+		$this->javascript .= "if (getField('tcpdfdocsaved').value != 'saved') {";
+		$k = $this->k;
+		$this->javascript .= sprintf("f".$name."=this.addField('%s','%s',%u,[%F,%F,%F,%F]);", $name, $type, $this->PageNo()-1, $x*$k, ($this->h-$y)*$k+1, ($x+$w)*$k, ($this->h-$y-$h)*$k+1)."\n";
+		$this->javascript .= 'f'.$name.'.textSize='.$this->FontSizePt.";\n";
+		while (list($key, $val) = each($prop)) {
+			if (strcmp(substr($key, -5), 'Color') == 0) {
+				$val = TCPDF_COLORS::_JScolor($val);
+			} else {
+				$val = "'".$val."'";
+			}
+			$this->javascript .= 'f'.$name.'.'.$key.'='.$val.";\n";
+		}
+		if ($this->rtl) {
+			$this->x -= $w;
+		} else {
+			$this->x += $w;
+		}
+		$this->javascript .= '}';
+	}
+
+	// --- FORM FIELDS -----------------------------------------------------
+
+
+
+	/**
+	 * Set default properties for form fields.
+	 * @param $prop (array) javascript field properties. Possible values are described on official Javascript for Acrobat API reference.
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 4.8.000 (2009-09-06)
+	 */
+	public function setFormDefaultProp($prop=array()) {
+		$this->default_form_prop = $prop;
+	}
+
+	/**
+	 * Return the default properties for form fields.
+	 * @return array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference.
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 4.8.000 (2009-09-06)
+	 */
+	public function getFormDefaultProp() {
+		return $this->default_form_prop;
+	}
+
+	/**
+	 * Creates a text field
+	 * @param $name (string) field name
+	 * @param $w (float) Width of the rectangle
+	 * @param $h (float) Height of the rectangle
+	 * @param $prop (array) javascript field properties. Possible values are described on official Javascript for Acrobat API reference.
+	 * @param $opt (array) annotation parameters. Possible values are described on official PDF32000_2008 reference.
+	 * @param $x (float) Abscissa of the upper-left corner of the rectangle
+	 * @param $y (float) Ordinate of the upper-left corner of the rectangle
+	 * @param $js (boolean) if true put the field using JavaScript (requires Acrobat Writer to be rendered).
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 4.8.000 (2009-09-07)
+	 */
+	public function TextField($name, $w, $h, $prop=array(), $opt=array(), $x='', $y='', $js=false) {
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		// check page for no-write regions and adapt page margins if necessary
+		list($x, $y) = $this->checkPageRegions($h, $x, $y);
+		if ($js) {
+			$this->_addfield('text', $name, $x, $y, $w, $h, $prop);
+			return;
+		}
+		// get default style
+		$prop = array_merge($this->getFormDefaultProp(), $prop);
+		// get annotation data
+		$popt = TCPDF_STATIC::getAnnotOptFromJSProp($prop, $this->spot_colors, $this->rtl);
+		// set default appearance stream
+		$this->annotation_fonts[$this->CurrentFont['fontkey']] = $this->CurrentFont['i'];
+		$fontstyle = sprintf('/F%d %F Tf %s', $this->CurrentFont['i'], $this->FontSizePt, $this->TextColor);
+		$popt['da'] = $fontstyle;
+		// build appearance stream
+		$popt['ap'] = array();
+		$popt['ap']['n'] = '/Tx BMC q '.$fontstyle.' ';
+		$text = '';
+		if (isset($prop['value']) AND !empty($prop['value'])) {
+			$text = $prop['value'];
+		} elseif (isset($opt['v']) AND !empty($opt['v'])) {
+			$text = $opt['v'];
+		}
+		$tmpid = $this->startTemplate($w, $h, false);
+		$align = '';
+		if (isset($popt['q'])) {
+			switch ($popt['q']) {
+				case 0: {
+					$align = 'L';
+					break;
+				}
+				case 1: {
+					$align = 'C';
+					break;
+				}
+				case 2: {
+					$align = 'R';
+					break;
+				}
+				default: {
+					$align = '';
+					break;
+				}
+			}
+		}
+		$this->MultiCell($w, $h, $text, 0, $align, false, 0, 0, 0, true, 0, false, true, 0, 'T', false);
+		$this->endTemplate();
+		--$this->n;
+		$popt['ap']['n'] .= $this->xobjects[$tmpid]['outdata'];
+		unset($this->xobjects[$tmpid]);
+		$popt['ap']['n'] .= 'Q EMC';
+		// merge options
+		$opt = array_merge($popt, $opt);
+		// remove some conflicting options
+		unset($opt['bs']);
+		// set remaining annotation data
+		$opt['Subtype'] = 'Widget';
+		$opt['ft'] = 'Tx';
+		$opt['t'] = $name;
+		// Additional annotation's parameters (check _putannotsobj() method):
+		//$opt['f']
+		//$opt['as']
+		//$opt['bs']
+		//$opt['be']
+		//$opt['c']
+		//$opt['border']
+		//$opt['h']
+		//$opt['mk'];
+		//$opt['mk']['r']
+		//$opt['mk']['bc'];
+		//$opt['mk']['bg'];
+		unset($opt['mk']['ca']);
+		unset($opt['mk']['rc']);
+		unset($opt['mk']['ac']);
+		unset($opt['mk']['i']);
+		unset($opt['mk']['ri']);
+		unset($opt['mk']['ix']);
+		unset($opt['mk']['if']);
+		//$opt['mk']['if']['sw'];
+		//$opt['mk']['if']['s'];
+		//$opt['mk']['if']['a'];
+		//$opt['mk']['if']['fb'];
+		unset($opt['mk']['tp']);
+		//$opt['tu']
+		//$opt['tm']
+		//$opt['ff']
+		//$opt['v']
+		//$opt['dv']
+		//$opt['a']
+		//$opt['aa']
+		//$opt['q']
+		$this->Annotation($x, $y, $w, $h, $name, $opt, 0);
+		if ($this->rtl) {
+			$this->x -= $w;
+		} else {
+			$this->x += $w;
+		}
+	}
+
+	/**
+	 * Creates a RadioButton field.
+	 * @param $name (string) Field name.
+	 * @param $w (int) Width of the radio button.
+	 * @param $prop (array) Javascript field properties. Possible values are described on official Javascript for Acrobat API reference.
+	 * @param $opt (array) Annotation parameters. Possible values are described on official PDF32000_2008 reference.
+	 * @param $onvalue (string) Value to be returned if selected.
+	 * @param $checked (boolean) Define the initial state.
+	 * @param $x (float) Abscissa of the upper-left corner of the rectangle
+	 * @param $y (float) Ordinate of the upper-left corner of the rectangle
+	 * @param $js (boolean) If true put the field using JavaScript (requires Acrobat Writer to be rendered).
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 4.8.000 (2009-09-07)
+	 */
+	public function RadioButton($name, $w, $prop=array(), $opt=array(), $onvalue='On', $checked=false, $x='', $y='', $js=false) {
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		// check page for no-write regions and adapt page margins if necessary
+		list($x, $y) = $this->checkPageRegions($w, $x, $y);
+		if ($js) {
+			$this->_addfield('radiobutton', $name, $x, $y, $w, $w, $prop);
+			return;
+		}
+		if (TCPDF_STATIC::empty_string($onvalue)) {
+			$onvalue = 'On';
+		}
+		if ($checked) {
+			$defval = $onvalue;
+		} else {
+			$defval = 'Off';
+		}
+		// set font
+		$font = 'zapfdingbats';
+		if ($this->pdfa_mode) {
+			// all fonts must be embedded
+			$font = 'pdfa'.$font;
+		}
+		$this->AddFont($font);
+		$tmpfont = $this->getFontBuffer($font);
+		// set data for parent group
+		if (!isset($this->radiobutton_groups[$this->page])) {
+			$this->radiobutton_groups[$this->page] = array();
+		}
+		if (!isset($this->radiobutton_groups[$this->page][$name])) {
+			$this->radiobutton_groups[$this->page][$name] = array();
+			++$this->n;
+			$this->radiobutton_groups[$this->page][$name]['n'] = $this->n;
+			$this->radio_groups[] = $this->n;
+		}
+		$kid = ($this->n + 1);
+		// save object ID to be added on Kids entry on parent object
+		$this->radiobutton_groups[$this->page][$name][] = array('kid' => $kid, 'def' => $defval);
+		// get default style
+		$prop = array_merge($this->getFormDefaultProp(), $prop);
+		$prop['NoToggleToOff'] = 'true';
+		$prop['Radio'] = 'true';
+		$prop['borderStyle'] = 'inset';
+		// get annotation data
+		$popt = TCPDF_STATIC::getAnnotOptFromJSProp($prop, $this->spot_colors, $this->rtl);
+		// set additional default options
+		$this->annotation_fonts[$tmpfont['fontkey']] = $tmpfont['i'];
+		$fontstyle = sprintf('/F%d %F Tf %s', $tmpfont['i'], $this->FontSizePt, $this->TextColor);
+		$popt['da'] = $fontstyle;
+		// build appearance stream
+		$popt['ap'] = array();
+		$popt['ap']['n'] = array();
+		$fx = ((($w - $this->getAbsFontMeasure($tmpfont['cw'][108])) / 2) * $this->k);
+		$fy = (($w - ((($tmpfont['desc']['Ascent'] - $tmpfont['desc']['Descent']) * $this->FontSizePt / 1000) / $this->k)) * $this->k);
+		$popt['ap']['n'][$onvalue] = sprintf('q %s BT /F%d %F Tf %F %F Td ('.chr(108).') Tj ET Q', $this->TextColor, $tmpfont['i'], $this->FontSizePt, $fx, $fy);
+		$popt['ap']['n']['Off'] = sprintf('q %s BT /F%d %F Tf %F %F Td ('.chr(109).') Tj ET Q', $this->TextColor, $tmpfont['i'], $this->FontSizePt, $fx, $fy);
+		if (!isset($popt['mk'])) {
+			$popt['mk'] = array();
+		}
+		$popt['mk']['ca'] = '(l)';
+		// merge options
+		$opt = array_merge($popt, $opt);
+		// set remaining annotation data
+		$opt['Subtype'] = 'Widget';
+		$opt['ft'] = 'Btn';
+		if ($checked) {
+			$opt['v'] = array('/'.$onvalue);
+			$opt['as'] = $onvalue;
+		} else {
+			$opt['as'] = 'Off';
+		}
+		// store readonly flag
+		if (!isset($this->radiobutton_groups[$this->page][$name]['#readonly#'])) {
+			$this->radiobutton_groups[$this->page][$name]['#readonly#'] = false;
+		}
+		$this->radiobutton_groups[$this->page][$name]['#readonly#'] |= ($opt['f'] & 64);
+		$this->Annotation($x, $y, $w, $w, $name, $opt, 0);
+		if ($this->rtl) {
+			$this->x -= $w;
+		} else {
+			$this->x += $w;
+		}
+	}
+
+	/**
+	 * Creates a List-box field
+	 * @param $name (string) field name
+	 * @param $w (int) width
+	 * @param $h (int) height
+	 * @param $values (array) array containing the list of values.
+	 * @param $prop (array) javascript field properties. Possible values are described on official Javascript for Acrobat API reference.
+	 * @param $opt (array) annotation parameters. Possible values are described on official PDF32000_2008 reference.
+	 * @param $x (float) Abscissa of the upper-left corner of the rectangle
+	 * @param $y (float) Ordinate of the upper-left corner of the rectangle
+	 * @param $js (boolean) if true put the field using JavaScript (requires Acrobat Writer to be rendered).
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 4.8.000 (2009-09-07)
+	 */
+	public function ListBox($name, $w, $h, $values, $prop=array(), $opt=array(), $x='', $y='', $js=false) {
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		// check page for no-write regions and adapt page margins if necessary
+		list($x, $y) = $this->checkPageRegions($h, $x, $y);
+		if ($js) {
+			$this->_addfield('listbox', $name, $x, $y, $w, $h, $prop);
+			$s = '';
+			foreach ($values as $value) {
+				if (is_array($value)) {
+					$s .= ',[\''.addslashes($value[1]).'\',\''.addslashes($value[0]).'\']';
+				} else {
+					$s .= ',[\''.addslashes($value).'\',\''.addslashes($value).'\']';
+				}
+			}
+			$this->javascript .= 'f'.$name.'.setItems('.substr($s, 1).');'."\n";
+			return;
+		}
+		// get default style
+		$prop = array_merge($this->getFormDefaultProp(), $prop);
+		// get annotation data
+		$popt = TCPDF_STATIC::getAnnotOptFromJSProp($prop, $this->spot_colors, $this->rtl);
+		// set additional default values
+		$this->annotation_fonts[$this->CurrentFont['fontkey']] = $this->CurrentFont['i'];
+		$fontstyle = sprintf('/F%d %F Tf %s', $this->CurrentFont['i'], $this->FontSizePt, $this->TextColor);
+		$popt['da'] = $fontstyle;
+		// build appearance stream
+		$popt['ap'] = array();
+		$popt['ap']['n'] = '/Tx BMC q '.$fontstyle.' ';
+		$text = '';
+		foreach($values as $item) {
+			if (is_array($item)) {
+				$text .= $item[1]."\n";
+			} else {
+				$text .= $item."\n";
+			}
+		}
+		$tmpid = $this->startTemplate($w, $h, false);
+		$this->MultiCell($w, $h, $text, 0, '', false, 0, 0, 0, true, 0, false, true, 0, 'T', false);
+		$this->endTemplate();
+		--$this->n;
+		$popt['ap']['n'] .= $this->xobjects[$tmpid]['outdata'];
+		unset($this->xobjects[$tmpid]);
+		$popt['ap']['n'] .= 'Q EMC';
+		// merge options
+		$opt = array_merge($popt, $opt);
+		// set remaining annotation data
+		$opt['Subtype'] = 'Widget';
+		$opt['ft'] = 'Ch';
+		$opt['t'] = $name;
+		$opt['opt'] = $values;
+		unset($opt['mk']['ca']);
+		unset($opt['mk']['rc']);
+		unset($opt['mk']['ac']);
+		unset($opt['mk']['i']);
+		unset($opt['mk']['ri']);
+		unset($opt['mk']['ix']);
+		unset($opt['mk']['if']);
+		unset($opt['mk']['tp']);
+		$this->Annotation($x, $y, $w, $h, $name, $opt, 0);
+		if ($this->rtl) {
+			$this->x -= $w;
+		} else {
+			$this->x += $w;
+		}
+	}
+
+	/**
+	 * Creates a Combo-box field
+	 * @param $name (string) field name
+	 * @param $w (int) width
+	 * @param $h (int) height
+	 * @param $values (array) array containing the list of values.
+	 * @param $prop (array) javascript field properties. Possible values are described on official Javascript for Acrobat API reference.
+	 * @param $opt (array) annotation parameters. Possible values are described on official PDF32000_2008 reference.
+	 * @param $x (float) Abscissa of the upper-left corner of the rectangle
+	 * @param $y (float) Ordinate of the upper-left corner of the rectangle
+	 * @param $js (boolean) if true put the field using JavaScript (requires Acrobat Writer to be rendered).
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 4.8.000 (2009-09-07)
+	 */
+	public function ComboBox($name, $w, $h, $values, $prop=array(), $opt=array(), $x='', $y='', $js=false) {
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		// check page for no-write regions and adapt page margins if necessary
+		list($x, $y) = $this->checkPageRegions($h, $x, $y);
+		if ($js) {
+			$this->_addfield('combobox', $name, $x, $y, $w, $h, $prop);
+			$s = '';
+			foreach ($values as $value) {
+				if (is_array($value)) {
+					$s .= ',[\''.addslashes($value[1]).'\',\''.addslashes($value[0]).'\']';
+				} else {
+					$s .= ',[\''.addslashes($value).'\',\''.addslashes($value).'\']';
+				}
+			}
+			$this->javascript .= 'f'.$name.'.setItems('.substr($s, 1).');'."\n";
+			return;
+		}
+		// get default style
+		$prop = array_merge($this->getFormDefaultProp(), $prop);
+		$prop['Combo'] = true;
+		// get annotation data
+		$popt = TCPDF_STATIC::getAnnotOptFromJSProp($prop, $this->spot_colors, $this->rtl);
+		// set additional default options
+		$this->annotation_fonts[$this->CurrentFont['fontkey']] = $this->CurrentFont['i'];
+		$fontstyle = sprintf('/F%d %F Tf %s', $this->CurrentFont['i'], $this->FontSizePt, $this->TextColor);
+		$popt['da'] = $fontstyle;
+		// build appearance stream
+		$popt['ap'] = array();
+		$popt['ap']['n'] = '/Tx BMC q '.$fontstyle.' ';
+		$text = '';
+		foreach($values as $item) {
+			if (is_array($item)) {
+				$text .= $item[1]."\n";
+			} else {
+				$text .= $item."\n";
+			}
+		}
+		$tmpid = $this->startTemplate($w, $h, false);
+		$this->MultiCell($w, $h, $text, 0, '', false, 0, 0, 0, true, 0, false, true, 0, 'T', false);
+		$this->endTemplate();
+		--$this->n;
+		$popt['ap']['n'] .= $this->xobjects[$tmpid]['outdata'];
+		unset($this->xobjects[$tmpid]);
+		$popt['ap']['n'] .= 'Q EMC';
+		// merge options
+		$opt = array_merge($popt, $opt);
+		// set remaining annotation data
+		$opt['Subtype'] = 'Widget';
+		$opt['ft'] = 'Ch';
+		$opt['t'] = $name;
+		$opt['opt'] = $values;
+		unset($opt['mk']['ca']);
+		unset($opt['mk']['rc']);
+		unset($opt['mk']['ac']);
+		unset($opt['mk']['i']);
+		unset($opt['mk']['ri']);
+		unset($opt['mk']['ix']);
+		unset($opt['mk']['if']);
+		unset($opt['mk']['tp']);
+		$this->Annotation($x, $y, $w, $h, $name, $opt, 0);
+		if ($this->rtl) {
+			$this->x -= $w;
+		} else {
+			$this->x += $w;
+		}
+	}
+
+	/**
+	 * Creates a CheckBox field
+	 * @param $name (string) field name
+	 * @param $w (int) width
+	 * @param $checked (boolean) define the initial state.
+	 * @param $prop (array) javascript field properties. Possible values are described on official Javascript for Acrobat API reference.
+	 * @param $opt (array) annotation parameters. Possible values are described on official PDF32000_2008 reference.
+	 * @param $onvalue (string) value to be returned if selected.
+	 * @param $x (float) Abscissa of the upper-left corner of the rectangle
+	 * @param $y (float) Ordinate of the upper-left corner of the rectangle
+	 * @param $js (boolean) if true put the field using JavaScript (requires Acrobat Writer to be rendered).
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 4.8.000 (2009-09-07)
+	 */
+	public function CheckBox($name, $w, $checked=false, $prop=array(), $opt=array(), $onvalue='Yes', $x='', $y='', $js=false) {
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		// check page for no-write regions and adapt page margins if necessary
+		list($x, $y) = $this->checkPageRegions($w, $x, $y);
+		if ($js) {
+			$this->_addfield('checkbox', $name, $x, $y, $w, $w, $prop);
+			return;
+		}
+		if (!isset($prop['value'])) {
+			$prop['value'] = array('Yes');
+		}
+		// get default style
+		$prop = array_merge($this->getFormDefaultProp(), $prop);
+		$prop['borderStyle'] = 'inset';
+		// get annotation data
+		$popt = TCPDF_STATIC::getAnnotOptFromJSProp($prop, $this->spot_colors, $this->rtl);
+		// set additional default options
+		$font = 'zapfdingbats';
+		if ($this->pdfa_mode) {
+			// all fonts must be embedded
+			$font = 'pdfa'.$font;
+		}
+		$this->AddFont($font);
+		$tmpfont = $this->getFontBuffer($font);
+		$this->annotation_fonts[$tmpfont['fontkey']] = $tmpfont['i'];
+		$fontstyle = sprintf('/F%d %F Tf %s', $tmpfont['i'], $this->FontSizePt, $this->TextColor);
+		$popt['da'] = $fontstyle;
+		// build appearance stream
+		$popt['ap'] = array();
+		$popt['ap']['n'] = array();
+		$fx = ((($w - $this->getAbsFontMeasure($tmpfont['cw'][110])) / 2) * $this->k);
+		$fy = (($w - ((($tmpfont['desc']['Ascent'] - $tmpfont['desc']['Descent']) * $this->FontSizePt / 1000) / $this->k)) * $this->k);
+		$popt['ap']['n']['Yes'] = sprintf('q %s BT /F%d %F Tf %F %F Td ('.chr(110).') Tj ET Q', $this->TextColor, $tmpfont['i'], $this->FontSizePt, $fx, $fy);
+		$popt['ap']['n']['Off'] = sprintf('q %s BT /F%d %F Tf %F %F Td ('.chr(111).') Tj ET Q', $this->TextColor, $tmpfont['i'], $this->FontSizePt, $fx, $fy);
+		// merge options
+		$opt = array_merge($popt, $opt);
+		// set remaining annotation data
+		$opt['Subtype'] = 'Widget';
+		$opt['ft'] = 'Btn';
+		$opt['t'] = $name;
+		if (TCPDF_STATIC::empty_string($onvalue)) {
+			$onvalue = 'Yes';
+		}
+		$opt['opt'] = array($onvalue);
+		if ($checked) {
+			$opt['v'] = array('/Yes');
+			$opt['as'] = 'Yes';
+		} else {
+			$opt['v'] = array('/Off');
+			$opt['as'] = 'Off';
+		}
+		$this->Annotation($x, $y, $w, $w, $name, $opt, 0);
+		if ($this->rtl) {
+			$this->x -= $w;
+		} else {
+			$this->x += $w;
+		}
+	}
+
+	/**
+	 * Creates a button field
+	 * @param $name (string) field name
+	 * @param $w (int) width
+	 * @param $h (int) height
+	 * @param $caption (string) caption.
+	 * @param $action (mixed) action triggered by pressing the button. Use a string to specify a javascript action. Use an array to specify a form action options as on section 12.7.5 of PDF32000_2008.
+	 * @param $prop (array) javascript field properties. Possible values are described on official Javascript for Acrobat API reference.
+	 * @param $opt (array) annotation parameters. Possible values are described on official PDF32000_2008 reference.
+	 * @param $x (float) Abscissa of the upper-left corner of the rectangle
+	 * @param $y (float) Ordinate of the upper-left corner of the rectangle
+	 * @param $js (boolean) if true put the field using JavaScript (requires Acrobat Writer to be rendered).
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 4.8.000 (2009-09-07)
+	 */
+	public function Button($name, $w, $h, $caption, $action, $prop=array(), $opt=array(), $x='', $y='', $js=false) {
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		// check page for no-write regions and adapt page margins if necessary
+		list($x, $y) = $this->checkPageRegions($h, $x, $y);
+		if ($js) {
+			$this->_addfield('button', $name, $this->x, $this->y, $w, $h, $prop);
+			$this->javascript .= 'f'.$name.".buttonSetCaption('".addslashes($caption)."');\n";
+			$this->javascript .= 'f'.$name.".setAction('MouseUp','".addslashes($action)."');\n";
+			$this->javascript .= 'f'.$name.".highlight='push';\n";
+			$this->javascript .= 'f'.$name.".print=false;\n";
+			return;
+		}
+		// get default style
+		$prop = array_merge($this->getFormDefaultProp(), $prop);
+		$prop['Pushbutton'] = 'true';
+		$prop['highlight'] = 'push';
+		$prop['display'] = 'display.noPrint';
+		// get annotation data
+		$popt = TCPDF_STATIC::getAnnotOptFromJSProp($prop, $this->spot_colors, $this->rtl);
+		$this->annotation_fonts[$this->CurrentFont['fontkey']] = $this->CurrentFont['i'];
+		$fontstyle = sprintf('/F%d %F Tf %s', $this->CurrentFont['i'], $this->FontSizePt, $this->TextColor);
+		$popt['da'] = $fontstyle;
+		// build appearance stream
+		$popt['ap'] = array();
+		$popt['ap']['n'] = '/Tx BMC q '.$fontstyle.' ';
+		$tmpid = $this->startTemplate($w, $h, false);
+		$bw = (2 / $this->k); // border width
+		$border = array(
+			'L' => array('width' => $bw, 'cap' => 'square', 'join' => 'miter', 'dash' => 0, 'color' => array(231)),
+			'R' => array('width' => $bw, 'cap' => 'square', 'join' => 'miter', 'dash' => 0, 'color' => array(51)),
+			'T' => array('width' => $bw, 'cap' => 'square', 'join' => 'miter', 'dash' => 0, 'color' => array(231)),
+			'B' => array('width' => $bw, 'cap' => 'square', 'join' => 'miter', 'dash' => 0, 'color' => array(51)));
+		$this->SetFillColor(204);
+		$this->Cell($w, $h, $caption, $border, 0, 'C', true, '', 1, false, 'T', 'M');
+		$this->endTemplate();
+		--$this->n;
+		$popt['ap']['n'] .= $this->xobjects[$tmpid]['outdata'];
+		unset($this->xobjects[$tmpid]);
+		$popt['ap']['n'] .= 'Q EMC';
+		// set additional default options
+		if (!isset($popt['mk'])) {
+			$popt['mk'] = array();
+		}
+		$ann_obj_id = ($this->n + 1);
+		if (!empty($action) AND !is_array($action)) {
+			$ann_obj_id = ($this->n + 2);
+		}
+		$popt['mk']['ca'] = $this->_textstring($caption, $ann_obj_id);
+		$popt['mk']['rc'] = $this->_textstring($caption, $ann_obj_id);
+		$popt['mk']['ac'] = $this->_textstring($caption, $ann_obj_id);
+		// merge options
+		$opt = array_merge($popt, $opt);
+		// set remaining annotation data
+		$opt['Subtype'] = 'Widget';
+		$opt['ft'] = 'Btn';
+		$opt['t'] = $caption;
+		$opt['v'] = $name;
+		if (!empty($action)) {
+			if (is_array($action)) {
+				// form action options as on section 12.7.5 of PDF32000_2008.
+				$opt['aa'] = '/D <<';
+				$bmode = array('SubmitForm', 'ResetForm', 'ImportData');
+				foreach ($action AS $key => $val) {
+					if (($key == 'S') AND in_array($val, $bmode)) {
+						$opt['aa'] .= ' /S /'.$val;
+					} elseif (($key == 'F') AND (!empty($val))) {
+						$opt['aa'] .= ' /F '.$this->_datastring($val, $ann_obj_id);
+					} elseif (($key == 'Fields') AND is_array($val) AND !empty($val)) {
+						$opt['aa'] .= ' /Fields [';
+						foreach ($val AS $field) {
+							$opt['aa'] .= ' '.$this->_textstring($field, $ann_obj_id);
+						}
+						$opt['aa'] .= ']';
+					} elseif (($key == 'Flags')) {
+						$ff = 0;
+						if (is_array($val)) {
+							foreach ($val AS $flag) {
+								switch ($flag) {
+									case 'Include/Exclude': {
+										$ff += 1 << 0;
+										break;
+									}
+									case 'IncludeNoValueFields': {
+										$ff += 1 << 1;
+										break;
+									}
+									case 'ExportFormat': {
+										$ff += 1 << 2;
+										break;
+									}
+									case 'GetMethod': {
+										$ff += 1 << 3;
+										break;
+									}
+									case 'SubmitCoordinates': {
+										$ff += 1 << 4;
+										break;
+									}
+									case 'XFDF': {
+										$ff += 1 << 5;
+										break;
+									}
+									case 'IncludeAppendSaves': {
+										$ff += 1 << 6;
+										break;
+									}
+									case 'IncludeAnnotations': {
+										$ff += 1 << 7;
+										break;
+									}
+									case 'SubmitPDF': {
+										$ff += 1 << 8;
+										break;
+									}
+									case 'CanonicalFormat': {
+										$ff += 1 << 9;
+										break;
+									}
+									case 'ExclNonUserAnnots': {
+										$ff += 1 << 10;
+										break;
+									}
+									case 'ExclFKey': {
+										$ff += 1 << 11;
+										break;
+									}
+									case 'EmbedForm': {
+										$ff += 1 << 13;
+										break;
+									}
+								}
+							}
+						} else {
+							$ff = intval($val);
+						}
+						$opt['aa'] .= ' /Flags '.$ff;
+					}
+				}
+				$opt['aa'] .= ' >>';
+			} else {
+				// Javascript action or raw action command
+				$js_obj_id = $this->addJavascriptObject($action);
+				$opt['aa'] = '/D '.$js_obj_id.' 0 R';
+			}
+		}
+		$this->Annotation($x, $y, $w, $h, $name, $opt, 0);
+		if ($this->rtl) {
+			$this->x -= $w;
+		} else {
+			$this->x += $w;
+		}
+	}
+
+	// --- END FORMS FIELDS ------------------------------------------------
+
+	/**
+	 * Add certification signature (DocMDP or UR3)
+	 * You can set only one signature type
+	 * @protected
+	 * @author Nicola Asuni
+	 * @since 4.6.008 (2009-05-07)
+	 */
+	protected function _putsignature() {
+		if ((!$this->sign) OR (!isset($this->signature_data['cert_type']))) {
+			return;
+		}
+		$sigobjid = ($this->sig_obj_id + 1);
+		$out = $this->_getobj($sigobjid)."\n";
+		$out .= '<< /Type /Sig';
+		$out .= ' /Filter /Adobe.PPKLite';
+		$out .= ' /SubFilter /adbe.pkcs7.detached';
+		$out .= ' '.TCPDF_STATIC::$byterange_string;
+		$out .= ' /Contents<'.str_repeat('0', $this->signature_max_length).'>';
+		$out .= ' /Reference ['; // array of signature reference dictionaries
+		$out .= ' << /Type /SigRef';
+		if ($this->signature_data['cert_type'] > 0) {
+			$out .= ' /TransformMethod /DocMDP';
+			$out .= ' /TransformParams <<';
+			$out .= ' /Type /TransformParams';
+			$out .= ' /P '.$this->signature_data['cert_type'];
+			$out .= ' /V /1.2';
+		} else {
+			$out .= ' /TransformMethod /UR3';
+			$out .= ' /TransformParams <<';
+			$out .= ' /Type /TransformParams';
+			$out .= ' /V /2.2';
+			if (!TCPDF_STATIC::empty_string($this->ur['document'])) {
+				$out .= ' /Document['.$this->ur['document'].']';
+			}
+			if (!TCPDF_STATIC::empty_string($this->ur['form'])) {
+				$out .= ' /Form['.$this->ur['form'].']';
+			}
+			if (!TCPDF_STATIC::empty_string($this->ur['signature'])) {
+				$out .= ' /Signature['.$this->ur['signature'].']';
+			}
+			if (!TCPDF_STATIC::empty_string($this->ur['annots'])) {
+				$out .= ' /Annots['.$this->ur['annots'].']';
+			}
+			if (!TCPDF_STATIC::empty_string($this->ur['ef'])) {
+				$out .= ' /EF['.$this->ur['ef'].']';
+			}
+			if (!TCPDF_STATIC::empty_string($this->ur['formex'])) {
+				$out .= ' /FormEX['.$this->ur['formex'].']';
+			}
+		}
+		$out .= ' >>'; // close TransformParams
+		// optional digest data (values must be calculated and replaced later)
+		//$out .= ' /Data ********** 0 R';
+		//$out .= ' /DigestMethod/MD5';
+		//$out .= ' /DigestLocation[********** 34]';
+		//$out .= ' /DigestValue<********************************>';
+		$out .= ' >>';
+		$out .= ' ]'; // end of reference
+		if (isset($this->signature_data['info']['Name']) AND !TCPDF_STATIC::empty_string($this->signature_data['info']['Name'])) {
+			$out .= ' /Name '.$this->_textstring($this->signature_data['info']['Name'], $sigobjid);
+		}
+		if (isset($this->signature_data['info']['Location']) AND !TCPDF_STATIC::empty_string($this->signature_data['info']['Location'])) {
+			$out .= ' /Location '.$this->_textstring($this->signature_data['info']['Location'], $sigobjid);
+		}
+		if (isset($this->signature_data['info']['Reason']) AND !TCPDF_STATIC::empty_string($this->signature_data['info']['Reason'])) {
+			$out .= ' /Reason '.$this->_textstring($this->signature_data['info']['Reason'], $sigobjid);
+		}
+		if (isset($this->signature_data['info']['ContactInfo']) AND !TCPDF_STATIC::empty_string($this->signature_data['info']['ContactInfo'])) {
+			$out .= ' /ContactInfo '.$this->_textstring($this->signature_data['info']['ContactInfo'], $sigobjid);
+		}
+		$out .= ' /M '.$this->_datestring($sigobjid, $this->doc_modification_timestamp);
+		$out .= ' >>';
+		$out .= "\n".'endobj';
+		$this->_out($out);
+	}
+
+	/**
+	 * Set User's Rights for PDF Reader
+	 * WARNING: This is experimental and currently do not work.
+	 * Check the PDF Reference 8.7.1 Transform Methods,
+	 * Table 8.105 Entries in the UR transform parameters dictionary
+	 * @param $enable (boolean) if true enable user's rights on PDF reader
+	 * @param $document (string) Names specifying additional document-wide usage rights for the document. The only defined value is "/FullSave", which permits a user to save the document along with modified form and/or annotation data.
+	 * @param $annots (string) Names specifying additional annotation-related usage rights for the document. Valid names in PDF 1.5 and later are /Create/Delete/Modify/Copy/Import/Export, which permit the user to perform the named operation on annotations.
+	 * @param $form (string) Names specifying additional form-field-related usage rights for the document. Valid names are: /Add/Delete/FillIn/Import/Export/SubmitStandalone/SpawnTemplate
+	 * @param $signature (string) Names specifying additional signature-related usage rights for the document. The only defined value is /Modify, which permits a user to apply a digital signature to an existing signature form field or clear a signed signature form field.
+	 * @param $ef (string) Names specifying additional usage rights for named embedded files in the document. Valid names are /Create/Delete/Modify/Import, which permit the user to perform the named operation on named embedded files
+	 Names specifying additional embedded-files-related usage rights for the document.
+	 * @param $formex (string) Names specifying additional form-field-related usage rights. The only valid name is BarcodePlaintext, which permits text form field data to be encoded as a plaintext two-dimensional barcode.
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 2.9.000 (2008-03-26)
+	 */
+	public function setUserRights(
+			$enable=true,
+			$document='/FullSave',
+			$annots='/Create/Delete/Modify/Copy/Import/Export',
+			$form='/Add/Delete/FillIn/Import/Export/SubmitStandalone/SpawnTemplate',
+			$signature='/Modify',
+			$ef='/Create/Delete/Modify/Import',
+			$formex='') {
+		$this->ur['enabled'] = $enable;
+		$this->ur['document'] = $document;
+		$this->ur['annots'] = $annots;
+		$this->ur['form'] = $form;
+		$this->ur['signature'] = $signature;
+		$this->ur['ef'] = $ef;
+		$this->ur['formex'] = $formex;
+		if (!$this->sign) {
+			$this->setSignature('', '', '', '', 0, array());
+		}
+	}
+
+	/**
+	 * Enable document signature (requires the OpenSSL Library).
+	 * The digital signature improve document authenticity and integrity and allows o enable extra features on Acrobat Reader.
+	 * To create self-signed signature: openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt
+	 * To export crt to p12: openssl pkcs12 -export -in tcpdf.crt -out tcpdf.p12
+	 * To convert pfx certificate to pem: openssl pkcs12 -in tcpdf.pfx -out tcpdf.crt -nodes
+	 * @param $signing_cert (mixed) signing certificate (string or filename prefixed with 'file://')
+	 * @param $private_key (mixed) private key (string or filename prefixed with 'file://')
+	 * @param $private_key_password (string) password
+	 * @param $extracerts (string) specifies the name of a file containing a bunch of extra certificates to include in the signature which can for example be used to help the recipient to verify the certificate that you used.
+	 * @param $cert_type (int) The access permissions granted for this document. Valid values shall be: 1 = No changes to the document shall be permitted; any change to the document shall invalidate the signature; 2 = Permitted changes shall be filling in forms, instantiating page templates, and signing; other changes shall invalidate the signature; 3 = Permitted changes shall be the same as for 2, as well as annotation creation, deletion, and modification; other changes shall invalidate the signature.
+	 * @param $info (array) array of option information: Name, Location, Reason, ContactInfo.
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 4.6.005 (2009-04-24)
+	 */
+	public function setSignature($signing_cert='', $private_key='', $private_key_password='', $extracerts='', $cert_type=2, $info=array()) {
+		// to create self-signed signature: openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt
+		// to export crt to p12: openssl pkcs12 -export -in tcpdf.crt -out tcpdf.p12
+		// to convert pfx certificate to pem: openssl
+		//     OpenSSL> pkcs12 -in <cert.pfx> -out <cert.crt> -nodes
+		$this->sign = true;
+		++$this->n;
+		$this->sig_obj_id = $this->n; // signature widget
+		++$this->n; // signature object ($this->sig_obj_id + 1)
+		$this->signature_data = array();
+		if (strlen($signing_cert) == 0) {
+			$this->Error('Please provide a certificate file and password!');
+		}
+		if (strlen($private_key) == 0) {
+			$private_key = $signing_cert;
+		}
+		$this->signature_data['signcert'] = $signing_cert;
+		$this->signature_data['privkey'] = $private_key;
+		$this->signature_data['password'] = $private_key_password;
+		$this->signature_data['extracerts'] = $extracerts;
+		$this->signature_data['cert_type'] = $cert_type;
+		$this->signature_data['info'] = $info;
+	}
+
+	/**
+	 * Set the digital signature appearance (a cliccable rectangle area to get signature properties)
+	 * @param $x (float) Abscissa of the upper-left corner.
+	 * @param $y (float) Ordinate of the upper-left corner.
+	 * @param $w (float) Width of the signature area.
+	 * @param $h (float) Height of the signature area.
+	 * @param $page (int) option page number (if < 0 the current page is used).
+	 * @param $name (string) Name of the signature.
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 5.3.011 (2010-06-17)
+	 */
+	public function setSignatureAppearance($x=0, $y=0, $w=0, $h=0, $page=-1, $name='') {
+		$this->signature_appearance = $this->getSignatureAppearanceArray($x, $y, $w, $h, $page, $name);
+	}
+
+	/**
+	 * Add an empty digital signature appearance (a cliccable rectangle area to get signature properties)
+	 * @param $x (float) Abscissa of the upper-left corner.
+	 * @param $y (float) Ordinate of the upper-left corner.
+	 * @param $w (float) Width of the signature area.
+	 * @param $h (float) Height of the signature area.
+	 * @param $page (int) option page number (if < 0 the current page is used).
+	 * @param $name (string) Name of the signature.
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 5.9.101 (2011-07-06)
+	 */
+	public function addEmptySignatureAppearance($x=0, $y=0, $w=0, $h=0, $page=-1, $name='') {
+		++$this->n;
+		$this->empty_signature_appearance[] = array('objid' => $this->n) + $this->getSignatureAppearanceArray($x, $y, $w, $h, $page, $name);
+	}
+
+	/**
+	 * Get the array that defines the signature appearance (page and rectangle coordinates).
+	 * @param $x (float) Abscissa of the upper-left corner.
+	 * @param $y (float) Ordinate of the upper-left corner.
+	 * @param $w (float) Width of the signature area.
+	 * @param $h (float) Height of the signature area.
+	 * @param $page (int) option page number (if < 0 the current page is used).
+	 * @param $name (string) Name of the signature.
+	 * @return (array) Array defining page and rectangle coordinates of signature appearance.
+	 * @protected
+	 * @author Nicola Asuni
+	 * @since 5.9.101 (2011-07-06)
+	 */
+	protected function getSignatureAppearanceArray($x=0, $y=0, $w=0, $h=0, $page=-1, $name='') {
+		$sigapp = array();
+		if (($page < 1) OR ($page > $this->numpages)) {
+			$sigapp['page'] = $this->page;
+		} else {
+			$sigapp['page'] = intval($page);
+		}
+		if (empty($name)) {
+			$sigapp['name'] = 'Signature';
+		} else {
+			$sigapp['name'] = $name;
+		}
+		$a = $x * $this->k;
+		$b = $this->pagedim[($sigapp['page'])]['h'] - (($y + $h) * $this->k);
+		$c = $w * $this->k;
+		$d = $h * $this->k;
+		$sigapp['rect'] = sprintf('%F %F %F %F', $a, $b, ($a + $c), ($b + $d));
+		return $sigapp;
+	}
+
+	/**
+	 * Create a new page group.
+	 * NOTE: call this function before calling AddPage()
+	 * @param $page (int) starting group page (leave empty for next page).
+	 * @public
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	public function startPageGroup($page='') {
+		if (empty($page)) {
+			$page = $this->page + 1;
+		}
+		$this->newpagegroup[$page] = sizeof($this->newpagegroup) + 1;
+	}
+
+	/**
+	 * Set the starting page number.
+	 * @param $num (int) Starting page number.
+	 * @since 5.9.093 (2011-06-16)
+	 * @public
+	 */
+	public function setStartingPageNumber($num=1) {
+		$this->starting_page_number = max(0, intval($num));
+	}
+
+	/**
+	 * Returns the string alias used right align page numbers.
+	 * If the current font is unicode type, the returned string wil contain an additional open curly brace.
+	 * @return string
+	 * @since 5.9.099 (2011-06-27)
+	 * @public
+	 */
+	public function getAliasRightShift() {
+		// calculate aproximatively the ratio between widths of aliases and replacements.
+		$ref = '{'.TCPDF_STATIC::$alias_right_shift.'}{'.TCPDF_STATIC::$alias_tot_pages.'}{'.TCPDF_STATIC::$alias_num_page.'}';
+		$rep = str_repeat(' ', $this->GetNumChars($ref));
+		$wrep = $this->GetStringWidth($rep);
+		if ($wrep > 0) {
+			$wdiff = max(1, ($this->GetStringWidth($ref) / $wrep));
+		} else {
+			$wdiff = 1;
+		}
+		$sdiff = sprintf('%F', $wdiff);
+		$alias = TCPDF_STATIC::$alias_right_shift.$sdiff.'}';
+		if ($this->isUnicodeFont()) {
+			$alias = '{'.$alias;
+		}
+		return $alias;
+	}
+
+	/**
+	 * Returns the string alias used for the total number of pages.
+	 * If the current font is unicode type, the returned string is surrounded by additional curly braces.
+	 * This alias will be replaced by the total number of pages in the document.
+	 * @return string
+	 * @since 4.0.018 (2008-08-08)
+	 * @public
+	 */
+	public function getAliasNbPages() {
+		if ($this->isUnicodeFont()) {
+			return '{'.TCPDF_STATIC::$alias_tot_pages.'}';
+		}
+		return TCPDF_STATIC::$alias_tot_pages;
+	}
+
+	/**
+	 * Returns the string alias used for the page number.
+	 * If the current font is unicode type, the returned string is surrounded by additional curly braces.
+	 * This alias will be replaced by the page number.
+	 * @return string
+	 * @since 4.5.000 (2009-01-02)
+	 * @public
+	 */
+	public function getAliasNumPage() {
+		if ($this->isUnicodeFont()) {
+			return '{'.TCPDF_STATIC::$alias_num_page.'}';
+		}
+		return TCPDF_STATIC::$alias_num_page;
+	}
+
+	/**
+	 * Return the alias for the total number of pages in the current page group.
+	 * If the current font is unicode type, the returned string is surrounded by additional curly braces.
+	 * This alias will be replaced by the total number of pages in this group.
+	 * @return alias of the current page group
+	 * @public
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	public function getPageGroupAlias() {
+		if ($this->isUnicodeFont()) {
+			return '{'.TCPDF_STATIC::$alias_group_tot_pages.'}';
+		}
+		return TCPDF_STATIC::$alias_group_tot_pages;
+	}
+
+	/**
+	 * Return the alias for the page number on the current page group.
+	 * If the current font is unicode type, the returned string is surrounded by additional curly braces.
+	 * This alias will be replaced by the page number (relative to the belonging group).
+	 * @return alias of the current page group
+	 * @public
+	 * @since 4.5.000 (2009-01-02)
+	 */
+	public function getPageNumGroupAlias() {
+		if ($this->isUnicodeFont()) {
+			return '{'.TCPDF_STATIC::$alias_group_num_page.'}';
+		}
+		return TCPDF_STATIC::$alias_group_num_page;
+	}
+
+	/**
+	 * Return the current page in the group.
+	 * @return current page in the group
+	 * @public
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	public function getGroupPageNo() {
+		return $this->pagegroups[$this->currpagegroup];
+	}
+
+	/**
+	 * Returns the current group page number formatted as a string.
+	 * @public
+	 * @since 4.3.003 (2008-11-18)
+	 * @see PaneNo(), formatPageNumber()
+	 */
+	public function getGroupPageNoFormatted() {
+		return TCPDF_STATIC::formatPageNumber($this->getGroupPageNo());
+	}
+
+	/**
+	 * Returns the current page number formatted as a string.
+	 * @public
+	 * @since 4.2.005 (2008-11-06)
+	 * @see PaneNo(), formatPageNumber()
+	 */
+	public function PageNoFormatted() {
+		return TCPDF_STATIC::formatPageNumber($this->PageNo());
+	}
+
+	/**
+	 * Put pdf layers.
+	 * @protected
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	protected function _putocg() {
+		if (empty($this->pdflayers)) {
+			return;
+		}
+		foreach ($this->pdflayers as $key => $layer) {
+			 $this->pdflayers[$key]['objid'] = $this->_newobj();
+			 $out = '<< /Type /OCG';
+			 $out .= ' /Name '.$this->_textstring($layer['name'], $this->pdflayers[$key]['objid']);
+			 $out .= ' /Usage <<';
+			 $out .= ' /Print <</PrintState /'.($layer['print']?'ON':'OFF').'>>';
+			 $out .= ' /View <</ViewState /'.($layer['view']?'ON':'OFF').'>>';
+			 $out .= ' >> >>';
+			 $out .= "\n".'endobj';
+			 $this->_out($out);
+		}
+	}
+
+	/**
+	 * Start a new pdf layer.
+	 * @param $name (string) Layer name (only a-z letters and numbers). Leave empty for automatic name.
+	 * @param $print (boolean) Set to true to print this layer.
+	 * @param $view (boolean) Set to true to view this layer.
+	 * @public
+	 * @since 5.9.102 (2011-07-13)
+	 */
+	public function startLayer($name='', $print=true, $view=true) {
+		if ($this->state != 2) {
+			return;
+		}
+		$layer = sprintf('LYR%03d', (count($this->pdflayers) + 1));
+		if (empty($name)) {
+			$name = $layer;
+		} else {
+			$name = preg_replace('/[^a-zA-Z0-9_\-]/', '', $name);
+		}
+		$this->pdflayers[] = array('layer' => $layer, 'name' => $name, 'print' => $print, 'view' => $view);
+		$this->openMarkedContent = true;
+		$this->_out('/OC /'.$layer.' BDC');
+	}
+
+	/**
+	 * End the current PDF layer.
+	 * @public
+	 * @since 5.9.102 (2011-07-13)
+	 */
+	public function endLayer() {
+		if ($this->state != 2) {
+			return;
+		}
+		if ($this->openMarkedContent) {
+			// close existing open marked-content layer
+			$this->_out('EMC');
+			$this->openMarkedContent = false;
+		}
+	}
+
+	/**
+	 * Set the visibility of the successive elements.
+	 * This can be useful, for instance, to put a background
+	 * image or color that will show on screen but won't print.
+	 * @param $v (string) visibility mode. Legal values are: all, print, screen or view.
+	 * @public
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	public function setVisibility($v) {
+		if ($this->state != 2) {
+			return;
+		}
+		$this->endLayer();
+		switch($v) {
+			case 'print': {
+				$this->startLayer('Print', true, false);
+				break;
+			}
+			case 'view':
+			case 'screen': {
+				$this->startLayer('View', false, true);
+				break;
+			}
+			case 'all': {
+				$this->_out('');
+				break;
+			}
+			default: {
+				$this->Error('Incorrect visibility: '.$v);
+				break;
+			}
+		}
+	}
+
+	/**
+	 * Add transparency parameters to the current extgstate
+	 * @param $parms (array) parameters
+	 * @return the number of extgstates
+	 * @protected
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	protected function addExtGState($parms) {
+		if ($this->pdfa_mode) {
+			// transparencies are not allowed in PDF/A mode
+			return;
+		}
+		// check if this ExtGState already exist
+		foreach ($this->extgstates as $i => $ext) {
+			if ($ext['parms'] == $parms) {
+				if ($this->inxobj) {
+					// we are inside an XObject template
+					$this->xobjects[$this->xobjid]['extgstates'][$i] = $ext;
+				}
+				// return reference to existing ExtGState
+				return $i;
+			}
+		}
+		$n = (count($this->extgstates) + 1);
+		$this->extgstates[$n] = array('parms' => $parms);
+		if ($this->inxobj) {
+			// we are inside an XObject template
+			$this->xobjects[$this->xobjid]['extgstates'][$n] = $this->extgstates[$n];
+		}
+		return $n;
+	}
+
+	/**
+	 * Add an extgstate
+	 * @param $gs (array) extgstate
+	 * @protected
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	protected function setExtGState($gs) {
+		if ($this->pdfa_mode OR ($this->state != 2)) {
+			// transparency is not allowed in PDF/A mode
+			return;
+		}
+		$this->_out(sprintf('/GS%d gs', $gs));
+	}
+
+	/**
+	 * Put extgstates for object transparency
+	 * @protected
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	protected function _putextgstates() {
+		foreach ($this->extgstates as $i => $ext) {
+			$this->extgstates[$i]['n'] = $this->_newobj();
+			$out = '<< /Type /ExtGState';
+			foreach ($ext['parms'] as $k => $v) {
+				if (is_float($v)) {
+					$v = sprintf('%F', $v);
+				} elseif ($v === true) {
+					$v = 'true';
+				} elseif ($v === false) {
+					$v = 'false';
+				}
+				$out .= ' /'.$k.' '.$v;
+			}
+			$out .= ' >>';
+			$out .= "\n".'endobj';
+			$this->_out($out);
+		}
+	}
+
+	/**
+	 * Set overprint mode for stroking (OP) and non-stroking (op) painting operations.
+	 * (Check the "Entries in a Graphics State Parameter Dictionary" on PDF 32000-1:2008).
+	 * @param $stroking (boolean) If true apply overprint for stroking operations.
+	 * @param $nonstroking (boolean) If true apply overprint for painting operations other than stroking.
+	 * @param $mode (integer) Overprint mode: (0 = each source colour component value replaces the value previously painted for the corresponding device colorant; 1 = a tint value of 0.0 for a source colour component shall leave the corresponding component of the previously painted colour unchanged).
+	 * @public
+	 * @since 5.9.152 (2012-03-23)
+	 */
+	public function setOverprint($stroking=true, $nonstroking='', $mode=0) {
+		if ($this->state != 2) {
+			return;
+		}
+		$stroking = $stroking ? true : false;
+		if (TCPDF_STATIC::empty_string($nonstroking)) {
+			// default value if not set
+			$nonstroking = $stroking;
+		} else {
+			$nonstroking = $nonstroking ? true : false;
+		}
+		if (($mode != 0) AND ($mode != 1)) {
+			$mode = 0;
+		}
+		$this->overprint = array('OP' => $stroking, 'op' => $nonstroking, 'OPM' => $mode);
+		$gs = $this->addExtGState($this->overprint);
+		$this->setExtGState($gs);
+	}
+
+	/**
+	 * Get the overprint mode array (OP, op, OPM).
+	 * (Check the "Entries in a Graphics State Parameter Dictionary" on PDF 32000-1:2008).
+	 * @return array.
+	 * @public
+	 * @since 5.9.152 (2012-03-23)
+	 */
+	public function getOverprint() {
+		return $this->overprint;
+	}
+
+	/**
+	 * Set alpha for stroking (CA) and non-stroking (ca) operations.
+	 * @param $stroking (float) Alpha value for stroking operations: real value from 0 (transparent) to 1 (opaque).
+	 * @param $bm (string) blend mode, one of the following: Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn, HardLight, SoftLight, Difference, Exclusion, Hue, Saturation, Color, Luminosity
+	 * @param $nonstroking (float) Alpha value for non-stroking operations: real value from 0 (transparent) to 1 (opaque).
+	 * @param $ais (boolean)
+	 * @public
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	public function setAlpha($stroking=1, $bm='Normal', $nonstroking='', $ais=false) {
+		if ($this->pdfa_mode) {
+			// transparency is not allowed in PDF/A mode
+			return;
+		}
+		$stroking = floatval($stroking);
+		if (TCPDF_STATIC::empty_string($nonstroking)) {
+			// default value if not set
+			$nonstroking = $stroking;
+		} else {
+			$nonstroking = floatval($nonstroking);
+		}
+		if ($bm[0] == '/') {
+			// remove trailing slash
+			$bm = substr($bm, 1);
+		}
+		if (!in_array($bm, array('Normal', 'Multiply', 'Screen', 'Overlay', 'Darken', 'Lighten', 'ColorDodge', 'ColorBurn', 'HardLight', 'SoftLight', 'Difference', 'Exclusion', 'Hue', 'Saturation', 'Color', 'Luminosity'))) {
+			$bm = 'Normal';
+		}
+		$ais = $ais ? true : false;
+		$this->alpha = array('CA' => $stroking, 'ca' => $nonstroking, 'BM' => '/'.$bm, 'AIS' => $ais);
+		$gs = $this->addExtGState($this->alpha);
+		$this->setExtGState($gs);
+	}
+
+	/**
+	 * Get the alpha mode array (CA, ca, BM, AIS).
+	 * (Check the "Entries in a Graphics State Parameter Dictionary" on PDF 32000-1:2008).
+	 * @return array.
+	 * @public
+	 * @since 5.9.152 (2012-03-23)
+	 */
+	public function getAlpha() {
+		return $this->alpha;
+	}
+
+	/**
+	 * Set the default JPEG compression quality (1-100)
+	 * @param $quality (int) JPEG quality, integer between 1 and 100
+	 * @public
+	 * @since 3.0.000 (2008-03-27)
+	 */
+	public function setJPEGQuality($quality) {
+		if (($quality < 1) OR ($quality > 100)) {
+			$quality = 75;
+		}
+		$this->jpeg_quality = intval($quality);
+	}
+
+	/**
+	 * Set the default number of columns in a row for HTML tables.
+	 * @param $cols (int) number of columns
+	 * @public
+	 * @since 3.0.014 (2008-06-04)
+	 */
+	public function setDefaultTableColumns($cols=4) {
+		$this->default_table_columns = intval($cols);
+	}
+
+	/**
+	 * Set the height of the cell (line height) respect the font height.
+	 * @param $h (int) cell proportion respect font height (typical value = 1.25).
+	 * @public
+	 * @since 3.0.014 (2008-06-04)
+	 */
+	public function setCellHeightRatio($h) {
+		$this->cell_height_ratio = $h;
+	}
+
+	/**
+	 * return the height of cell repect font height.
+	 * @public
+	 * @since 4.0.012 (2008-07-24)
+	 */
+	public function getCellHeightRatio() {
+		return $this->cell_height_ratio;
+	}
+
+	/**
+	 * Set the PDF version (check PDF reference for valid values).
+	 * @param $version (string) PDF document version.
+	 * @public
+	 * @since 3.1.000 (2008-06-09)
+	 */
+	public function setPDFVersion($version='1.7') {
+		if ($this->pdfa_mode) {
+			// PDF/A mode
+			$this->PDFVersion = '1.4';
+		} else {
+			$this->PDFVersion = $version;
+		}
+	}
+
+	/**
+	 * Set the viewer preferences dictionary controlling the way the document is to be presented on the screen or in print.
+	 * (see Section 8.1 of PDF reference, "Viewer Preferences").
+	 * <ul><li>HideToolbar boolean (Optional) A flag specifying whether to hide the viewer application's tool bars when the document is active. Default value: false.</li><li>HideMenubar boolean (Optional) A flag specifying whether to hide the viewer application's menu bar when the document is active. Default value: false.</li><li>HideWindowUI boolean (Optional) A flag specifying whether to hide user interface elements in the document's window (such as scroll bars and navigation controls), leaving only the document's contents displayed. Default value: false.</li><li>FitWindow boolean (Optional) A flag specifying whether to resize the document's window to fit the size of the first displayed page. Default value: false.</li><li>CenterWindow boolean (Optional) A flag specifying whether to position the document's window in the center of the screen. Default value: false.</li><li>DisplayDocTitle boolean (Optional; PDF 1.4) A flag specifying whether the window's title bar should display the document title taken from the Title entry of the document information dictionary (see Section 10.2.1, "Document Information Dictionary"). If false, the title bar should instead display the name of the PDF file containing the document. Default value: false.</li><li>NonFullScreenPageMode name (Optional) The document's page mode, specifying how to display the document on exiting full-screen mode:<ul><li>UseNone Neither document outline nor thumbnail images visible</li><li>UseOutlines Document outline visible</li><li>UseThumbs Thumbnail images visible</li><li>UseOC Optional content group panel visible</li></ul>This entry is meaningful only if the value of the PageMode entry in the catalog dictionary (see Section 3.6.1, "Document Catalog") is FullScreen; it is ignored otherwise. Default value: UseNone.</li><li>ViewArea name (Optional; PDF 1.4) The name of the page boundary representing the area of a page to be displayed when viewing the document on the screen. Valid values are (see Section 10.10.1, "Page Boundaries").:<ul><li>MediaBox</li><li>CropBox (default)</li><li>BleedBox</li><li>TrimBox</li><li>ArtBox</li></ul></li><li>ViewClip name (Optional; PDF 1.4) The name of the page boundary to which the contents of a page are to be clipped when viewing the document on the screen. Valid values are (see Section 10.10.1, "Page Boundaries").:<ul><li>MediaBox</li><li>CropBox (default)</li><li>BleedBox</li><li>TrimBox</li><li>ArtBox</li></ul></li><li>PrintArea name (Optional; PDF 1.4) The name of the page boundary representing the area of a page to be rendered when printing the document. Valid values are (see Section 10.10.1, "Page Boundaries").:<ul><li>MediaBox</li><li>CropBox (default)</li><li>BleedBox</li><li>TrimBox</li><li>ArtBox</li></ul></li><li>PrintClip name (Optional; PDF 1.4) The name of the page boundary to which the contents of a page are to be clipped when printing the document. Valid values are (see Section 10.10.1, "Page Boundaries").:<ul><li>MediaBox</li><li>CropBox (default)</li><li>BleedBox</li><li>TrimBox</li><li>ArtBox</li></ul></li><li>PrintScaling name (Optional; PDF 1.6) The page scaling option to be selected when a print dialog is displayed for this document. Valid values are: <ul><li>None, which indicates that the print dialog should reflect no page scaling</li><li>AppDefault (default), which indicates that applications should use the current print scaling</li></ul></li><li>Duplex name (Optional; PDF 1.7) The paper handling option to use when printing the file from the print dialog. The following values are valid:<ul><li>Simplex - Print single-sided</li><li>DuplexFlipShortEdge - Duplex and flip on the short edge of the sheet</li><li>DuplexFlipLongEdge - Duplex and flip on the long edge of the sheet</li></ul>Default value: none</li><li>PickTrayByPDFSize boolean (Optional; PDF 1.7) A flag specifying whether the PDF page size is used to select the input paper tray. This setting influences only the preset values used to populate the print dialog presented by a PDF viewer application. If PickTrayByPDFSize is true, the check box in the print dialog associated with input paper tray is checked. Note: This setting has no effect on Mac OS systems, which do not provide the ability to pick the input tray by size.</li><li>PrintPageRange array (Optional; PDF 1.7) The page numbers used to initialize the print dialog box when the file is printed. The first page of the PDF file is denoted by 1. Each pair consists of the first and last pages in the sub-range. An odd number of integers causes this entry to be ignored. Negative numbers cause the entire array to be ignored. Default value: as defined by PDF viewer application</li><li>NumCopies integer (Optional; PDF 1.7) The number of copies to be printed when the print dialog is opened for this file. Supported values are the integers 2 through 5. Values outside this range are ignored. Default value: as defined by PDF viewer application, but typically 1</li></ul>
+	 * @param $preferences (array) array of options.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 3.1.000 (2008-06-09)
+	 */
+	public function setViewerPreferences($preferences) {
+		$this->viewer_preferences = $preferences;
+	}
+
+	/**
+	 * Paints color transition registration bars
+	 * @param $x (float) abscissa of the top left corner of the rectangle.
+	 * @param $y (float) ordinate of the top left corner of the rectangle.
+	 * @param $w (float) width of the rectangle.
+	 * @param $h (float) height of the rectangle.
+	 * @param $transition (boolean) if true prints tcolor transitions to white.
+	 * @param $vertical (boolean) if true prints bar vertically.
+	 * @param $colors (string) colors to print separated by comma. Valid values are: A,W,R,G,B,C,M,Y,K,RGB,CMYK,ALL,ALLSPOT,<SPOT_COLOR_NAME>. Where: A = grayscale black, W = grayscale white, R = RGB red, G RGB green, B RGB blue, C = CMYK cyan, M = CMYK magenta, Y = CMYK yellow, K = CMYK key/black, RGB = RGB registration color, CMYK = CMYK registration color, ALL = Spot registration color, ALLSPOT = print all defined spot colors, <SPOT_COLOR_NAME> = name of the spot color to print.
+	 * @author Nicola Asuni
+	 * @since 4.9.000 (2010-03-26)
+	 * @public
+	 */
+	public function colorRegistrationBar($x, $y, $w, $h, $transition=true, $vertical=false, $colors='A,R,G,B,C,M,Y,K') {
+		if (strpos($colors, 'ALLSPOT') !== false) {
+			// expand spot colors
+			$spot_colors = '';
+			foreach ($this->spot_colors as $spot_color_name => $v) {
+				$spot_colors .= ','.$spot_color_name;
+			}
+			if (!empty($spot_colors)) {
+				$spot_colors = substr($spot_colors, 1);
+				$colors = str_replace('ALLSPOT', $spot_colors, $colors);
+			} else {
+				$colors = str_replace('ALLSPOT', 'NONE', $colors);
+			}
+		}
+		$bars = explode(',', $colors);
+		$numbars = count($bars); // number of bars to print
+		if ($numbars <= 0) {
+			return;
+		}
+		// set bar measures
+		if ($vertical) {
+			$coords = array(0, 0, 0, 1);
+			$wb = $w / $numbars; // bar width
+			$hb = $h; // bar height
+			$xd = $wb; // delta x
+			$yd = 0; // delta y
+		} else {
+			$coords = array(1, 0, 0, 0);
+			$wb = $w; // bar width
+			$hb = $h / $numbars; // bar height
+			$xd = 0; // delta x
+			$yd = $hb; // delta y
+		}
+		$xb = $x;
+		$yb = $y;
+		foreach ($bars as $col) {
+			switch ($col) {
+				// set transition colors
+				case 'A': { // BLACK (GRAYSCALE)
+					$col_a = array(255);
+					$col_b = array(0);
+					break;
+				}
+				case 'W': { // WHITE (GRAYSCALE)
+					$col_a = array(0);
+					$col_b = array(255);
+					break;
+				}
+				case 'R': { // RED (RGB)
+					$col_a = array(255,255,255);
+					$col_b = array(255,0,0);
+					break;
+				}
+				case 'G': { // GREEN (RGB)
+					$col_a = array(255,255,255);
+					$col_b = array(0,255,0);
+					break;
+				}
+				case 'B': { // BLUE (RGB)
+					$col_a = array(255,255,255);
+					$col_b = array(0,0,255);
+					break;
+				}
+				case 'C': { // CYAN (CMYK)
+					$col_a = array(0,0,0,0);
+					$col_b = array(100,0,0,0);
+					break;
+				}
+				case 'M': { // MAGENTA (CMYK)
+					$col_a = array(0,0,0,0);
+					$col_b = array(0,100,0,0);
+					break;
+				}
+				case 'Y': { // YELLOW (CMYK)
+					$col_a = array(0,0,0,0);
+					$col_b = array(0,0,100,0);
+					break;
+				}
+				case 'K': { // KEY - BLACK (CMYK)
+					$col_a = array(0,0,0,0);
+					$col_b = array(0,0,0,100);
+					break;
+				}
+				case 'RGB': { // BLACK REGISTRATION (RGB)
+					$col_a = array(255,255,255);
+					$col_b = array(0,0,0);
+					break;
+				}
+				case 'CMYK': { // BLACK REGISTRATION (CMYK)
+					$col_a = array(0,0,0,0);
+					$col_b = array(100,100,100,100);
+					break;
+				}
+				case 'ALL': { // SPOT COLOR REGISTRATION
+					$col_a = array(0,0,0,0,'None');
+					$col_b = array(100,100,100,100,'All');
+					break;
+				}
+				case 'NONE': { // SKIP THIS COLOR
+					$col_a = array(0,0,0,0,'None');
+					$col_b = array(0,0,0,0,'None');
+					break;
+				}
+				default: { // SPECIFIC SPOT COLOR NAME
+					$col_a = array(0,0,0,0,'None');
+					$col_b = TCPDF_COLORS::getSpotColor($col, $this->spot_colors);
+					if ($col_b === false) {
+						// in case of error defaults to the registration color
+						$col_b = array(100,100,100,100,'All');
+					}
+					break;
+				}
+			}
+			if ($col != 'NONE') {
+				if ($transition) {
+					// color gradient
+					$this->LinearGradient($xb, $yb, $wb, $hb, $col_a, $col_b, $coords);
+				} else {
+					$this->SetFillColorArray($col_b);
+					// colored rectangle
+					$this->Rect($xb, $yb, $wb, $hb, 'F', array());
+				}
+				$xb += $xd;
+				$yb += $yd;
+			}
+		}
+	}
+
+	/**
+	 * Paints crop marks.
+	 * @param $x (float) abscissa of the crop mark center.
+	 * @param $y (float) ordinate of the crop mark center.
+	 * @param $w (float) width of the crop mark.
+	 * @param $h (float) height of the crop mark.
+	 * @param $type (string) type of crop mark, one symbol per type separated by comma: T = TOP, F = BOTTOM, L = LEFT, R = RIGHT, TL = A = TOP-LEFT, TR = B = TOP-RIGHT, BL = C = BOTTOM-LEFT, BR = D = BOTTOM-RIGHT.
+	 * @param $color (array) crop mark color (default spot registration color).
+	 * @author Nicola Asuni
+	 * @since 4.9.000 (2010-03-26)
+	 * @public
+	 */
+	public function cropMark($x, $y, $w, $h, $type='T,R,B,L', $color=array(100,100,100,100,'All')) {
+		$this->SetLineStyle(array('width' => (0.5 / $this->k), 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => $color));
+		$type = strtoupper($type);
+		$type = preg_replace('/[^A-Z\-\,]*/', '', $type);
+		// split type in single components
+		$type = str_replace('-', ',', $type);
+		$type = str_replace('TL', 'T,L', $type);
+		$type = str_replace('TR', 'T,R', $type);
+		$type = str_replace('BL', 'F,L', $type);
+		$type = str_replace('BR', 'F,R', $type);
+		$type = str_replace('A', 'T,L', $type);
+		$type = str_replace('B', 'T,R', $type);
+		$type = str_replace('T,RO', 'BO', $type);
+		$type = str_replace('C', 'F,L', $type);
+		$type = str_replace('D', 'F,R', $type);
+		$crops = explode(',', strtoupper($type));
+		// remove duplicates
+		$crops = array_unique($crops);
+		$dw = ($w / 4); // horizontal space to leave before the intersection point
+		$dh = ($h / 4); // vertical space to leave before the intersection point
+		foreach ($crops as $crop) {
+			switch ($crop) {
+				case 'T':
+				case 'TOP': {
+					$x1 = $x;
+					$y1 = ($y - $h);
+					$x2 = $x;
+					$y2 = ($y - $dh);
+					break;
+				}
+				case 'F':
+				case 'BOTTOM': {
+					$x1 = $x;
+					$y1 = ($y + $dh);
+					$x2 = $x;
+					$y2 = ($y + $h);
+					break;
+				}
+				case 'L':
+				case 'LEFT': {
+					$x1 = ($x - $w);
+					$y1 = $y;
+					$x2 = ($x - $dw);
+					$y2 = $y;
+					break;
+				}
+				case 'R':
+				case 'RIGHT': {
+					$x1 = ($x + $dw);
+					$y1 = $y;
+					$x2 = ($x + $w);
+					$y2 = $y;
+					break;
+				}
+			}
+			$this->Line($x1, $y1, $x2, $y2);
+		}
+	}
+
+	/**
+	 * Paints a registration mark
+	 * @param $x (float) abscissa of the registration mark center.
+	 * @param $y (float) ordinate of the registration mark center.
+	 * @param $r (float) radius of the crop mark.
+	 * @param $double (boolean) if true print two concentric crop marks.
+	 * @param $cola (array) crop mark color (default spot registration color 'All').
+	 * @param $colb (array) second crop mark color (default spot registration color 'None').
+	 * @author Nicola Asuni
+	 * @since 4.9.000 (2010-03-26)
+	 * @public
+	 */
+	public function registrationMark($x, $y, $r, $double=false, $cola=array(100,100,100,100,'All'), $colb=array(0,0,0,0,'None')) {
+		$line_style = array('width' => max((0.5 / $this->k),($r / 30)), 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => $cola);
+		$this->SetFillColorArray($cola);
+		$this->PieSector($x, $y, $r, 90, 180, 'F');
+		$this->PieSector($x, $y, $r, 270, 360, 'F');
+		$this->Circle($x, $y, $r, 0, 360, 'C', $line_style, array(), 8);
+		if ($double) {
+			$ri = $r * 0.5;
+			$this->SetFillColorArray($colb);
+			$this->PieSector($x, $y, $ri, 90, 180, 'F');
+			$this->PieSector($x, $y, $ri, 270, 360, 'F');
+			$this->SetFillColorArray($cola);
+			$this->PieSector($x, $y, $ri, 0, 90, 'F');
+			$this->PieSector($x, $y, $ri, 180, 270, 'F');
+			$this->Circle($x, $y, $ri, 0, 360, 'C', $line_style, array(), 8);
+		}
+	}
+
+	/**
+	 * Paints a CMYK registration mark
+	 * @param $x (float) abscissa of the registration mark center.
+	 * @param $y (float) ordinate of the registration mark center.
+	 * @param $r (float) radius of the crop mark.
+	 * @author Nicola Asuni
+	 * @since 6.0.038 (2013-09-30)
+	 * @public
+	 */
+	public function registrationMarkCMYK($x, $y, $r) {
+		// line width
+		$lw = max((0.5 / $this->k),($r / 8));
+		// internal radius
+		$ri = ($r * 0.6);
+		// external radius
+		$re = ($r * 1.3);
+		// Cyan
+		$this->SetFillColorArray(array(100,0,0,0));
+		$this->PieSector($x, $y, $ri, 270, 360, 'F');
+		// Magenta
+		$this->SetFillColorArray(array(0,100,0,0));
+		$this->PieSector($x, $y, $ri, 0, 90, 'F');
+		// Yellow
+		$this->SetFillColorArray(array(0,0,100,0));
+		$this->PieSector($x, $y, $ri, 90, 180, 'F');
+		// Key - black
+		$this->SetFillColorArray(array(0,0,0,100));
+		$this->PieSector($x, $y, $ri, 180, 270, 'F');
+		// registration color
+		$line_style = array('width' => $lw, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(100,100,100,100,'All'));
+		$this->SetFillColorArray(array(100,100,100,100,'All'));
+		// external circle
+		$this->Circle($x, $y, $r, 0, 360, 'C', $line_style, array(), 8);
+		// cross lines
+		$this->Line($x, ($y - $re), $x, ($y - $ri));
+		$this->Line($x, ($y + $ri), $x, ($y + $re));
+		$this->Line(($x - $re), $y, ($x - $ri), $y);
+		$this->Line(($x + $ri), $y, ($x + $re), $y);
+	}
+
+	/**
+	 * Paints a linear colour gradient.
+	 * @param $x (float) abscissa of the top left corner of the rectangle.
+	 * @param $y (float) ordinate of the top left corner of the rectangle.
+	 * @param $w (float) width of the rectangle.
+	 * @param $h (float) height of the rectangle.
+	 * @param $col1 (array) first color (Grayscale, RGB or CMYK components).
+	 * @param $col2 (array) second color (Grayscale, RGB or CMYK components).
+	 * @param $coords (array) array of the form (x1, y1, x2, y2) which defines the gradient vector (see linear_gradient_coords.jpg). The default value is from left to right (x1=0, y1=0, x2=1, y2=0).
+	 * @author Andreas W�rmser, Nicola Asuni
+	 * @since 3.1.000 (2008-06-09)
+	 * @public
+	 */
+	public function LinearGradient($x, $y, $w, $h, $col1=array(), $col2=array(), $coords=array(0,0,1,0)) {
+		$this->Clip($x, $y, $w, $h);
+		$this->Gradient(2, $coords, array(array('color' => $col1, 'offset' => 0, 'exponent' => 1), array('color' => $col2, 'offset' => 1, 'exponent' => 1)), array(), false);
+	}
+
+	/**
+	 * Paints a radial colour gradient.
+	 * @param $x (float) abscissa of the top left corner of the rectangle.
+	 * @param $y (float) ordinate of the top left corner of the rectangle.
+	 * @param $w (float) width of the rectangle.
+	 * @param $h (float) height of the rectangle.
+	 * @param $col1 (array) first color (Grayscale, RGB or CMYK components).
+	 * @param $col2 (array) second color (Grayscale, RGB or CMYK components).
+	 * @param $coords (array) array of the form (fx, fy, cx, cy, r) where (fx, fy) is the starting point of the gradient with color1, (cx, cy) is the center of the circle with color2, and r is the radius of the circle (see radial_gradient_coords.jpg). (fx, fy) should be inside the circle, otherwise some areas will not be defined.
+	 * @author Andreas W�rmser, Nicola Asuni
+	 * @since 3.1.000 (2008-06-09)
+	 * @public
+	 */
+	public function RadialGradient($x, $y, $w, $h, $col1=array(), $col2=array(), $coords=array(0.5,0.5,0.5,0.5,1)) {
+		$this->Clip($x, $y, $w, $h);
+		$this->Gradient(3, $coords, array(array('color' => $col1, 'offset' => 0, 'exponent' => 1), array('color' => $col2, 'offset' => 1, 'exponent' => 1)), array(), false);
+	}
+
+	/**
+	 * Paints a coons patch mesh.
+	 * @param $x (float) abscissa of the top left corner of the rectangle.
+	 * @param $y (float) ordinate of the top left corner of the rectangle.
+	 * @param $w (float) width of the rectangle.
+	 * @param $h (float) height of the rectangle.
+	 * @param $col1 (array) first color (lower left corner) (RGB components).
+	 * @param $col2 (array) second color (lower right corner) (RGB components).
+	 * @param $col3 (array) third color (upper right corner) (RGB components).
+	 * @param $col4 (array) fourth color (upper left corner) (RGB components).
+	 * @param $coords (array) <ul><li>for one patch mesh: array(float x1, float y1, .... float x12, float y12): 12 pairs of coordinates (normally from 0 to 1) which specify the Bezier control points that define the patch. First pair is the lower left edge point, next is its right control point (control point 2). Then the other points are defined in the order: control point 1, edge point, control point 2 going counter-clockwise around the patch. Last (x12, y12) is the first edge point's left control point (control point 1).</li><li>for two or more patch meshes: array[number of patches]: arrays with the following keys for each patch: f: where to put that patch (0 = first patch, 1, 2, 3 = right, top and left of precedent patch - I didn't figure this out completely - just try and error ;-) points: 12 pairs of coordinates of the Bezier control points as above for the first patch, 8 pairs of coordinates for the following patches, ignoring the coordinates already defined by the precedent patch (I also didn't figure out the order of these - also: try and see what's happening) colors: must be 4 colors for the first patch, 2 colors for the following patches</li></ul>
+	 * @param $coords_min (array) minimum value used by the coordinates. If a coordinate's value is smaller than this it will be cut to coords_min. default: 0
+	 * @param $coords_max (array) maximum value used by the coordinates. If a coordinate's value is greater than this it will be cut to coords_max. default: 1
+	 * @param $antialias (boolean) A flag indicating whether to filter the shading function to prevent aliasing artifacts.
+	 * @author Andreas W�rmser, Nicola Asuni
+	 * @since 3.1.000 (2008-06-09)
+	 * @public
+	 */
+	public function CoonsPatchMesh($x, $y, $w, $h, $col1=array(), $col2=array(), $col3=array(), $col4=array(), $coords=array(0.00,0.0,0.33,0.00,0.67,0.00,1.00,0.00,1.00,0.33,1.00,0.67,1.00,1.00,0.67,1.00,0.33,1.00,0.00,1.00,0.00,0.67,0.00,0.33), $coords_min=0, $coords_max=1, $antialias=false) {
+		if ($this->pdfa_mode OR ($this->state != 2)) {
+			return;
+		}
+		$this->Clip($x, $y, $w, $h);
+		$n = count($this->gradients) + 1;
+		$this->gradients[$n] = array();
+		$this->gradients[$n]['type'] = 6; //coons patch mesh
+		$this->gradients[$n]['coords'] = array();
+		$this->gradients[$n]['antialias'] = $antialias;
+		$this->gradients[$n]['colors'] = array();
+		$this->gradients[$n]['transparency'] = false;
+		//check the coords array if it is the simple array or the multi patch array
+		if (!isset($coords[0]['f'])) {
+			//simple array -> convert to multi patch array
+			if (!isset($col1[1])) {
+				$col1[1] = $col1[2] = $col1[0];
+			}
+			if (!isset($col2[1])) {
+				$col2[1] = $col2[2] = $col2[0];
+			}
+			if (!isset($col3[1])) {
+				$col3[1] = $col3[2] = $col3[0];
+			}
+			if (!isset($col4[1])) {
+				$col4[1] = $col4[2] = $col4[0];
+			}
+			$patch_array[0]['f'] = 0;
+			$patch_array[0]['points'] = $coords;
+			$patch_array[0]['colors'][0]['r'] = $col1[0];
+			$patch_array[0]['colors'][0]['g'] = $col1[1];
+			$patch_array[0]['colors'][0]['b'] = $col1[2];
+			$patch_array[0]['colors'][1]['r'] = $col2[0];
+			$patch_array[0]['colors'][1]['g'] = $col2[1];
+			$patch_array[0]['colors'][1]['b'] = $col2[2];
+			$patch_array[0]['colors'][2]['r'] = $col3[0];
+			$patch_array[0]['colors'][2]['g'] = $col3[1];
+			$patch_array[0]['colors'][2]['b'] = $col3[2];
+			$patch_array[0]['colors'][3]['r'] = $col4[0];
+			$patch_array[0]['colors'][3]['g'] = $col4[1];
+			$patch_array[0]['colors'][3]['b'] = $col4[2];
+		} else {
+			//multi patch array
+			$patch_array = $coords;
+		}
+		$bpcd = 65535; //16 bits per coordinate
+		//build the data stream
+		$this->gradients[$n]['stream'] = '';
+		$count_patch = count($patch_array);
+		for ($i=0; $i < $count_patch; ++$i) {
+			$this->gradients[$n]['stream'] .= chr($patch_array[$i]['f']); //start with the edge flag as 8 bit
+			$count_points = count($patch_array[$i]['points']);
+			for ($j=0; $j < $count_points; ++$j) {
+				//each point as 16 bit
+				$patch_array[$i]['points'][$j] = (($patch_array[$i]['points'][$j] - $coords_min) / ($coords_max - $coords_min)) * $bpcd;
+				if ($patch_array[$i]['points'][$j] < 0) {
+					$patch_array[$i]['points'][$j] = 0;
+				}
+				if ($patch_array[$i]['points'][$j] > $bpcd) {
+					$patch_array[$i]['points'][$j] = $bpcd;
+				}
+				$this->gradients[$n]['stream'] .= chr(floor($patch_array[$i]['points'][$j] / 256));
+				$this->gradients[$n]['stream'] .= chr(floor($patch_array[$i]['points'][$j] % 256));
+			}
+			$count_cols = count($patch_array[$i]['colors']);
+			for ($j=0; $j < $count_cols; ++$j) {
+				//each color component as 8 bit
+				$this->gradients[$n]['stream'] .= chr($patch_array[$i]['colors'][$j]['r']);
+				$this->gradients[$n]['stream'] .= chr($patch_array[$i]['colors'][$j]['g']);
+				$this->gradients[$n]['stream'] .= chr($patch_array[$i]['colors'][$j]['b']);
+			}
+		}
+		//paint the gradient
+		$this->_out('/Sh'.$n.' sh');
+		//restore previous Graphic State
+		$this->_out('Q');
+		if ($this->inxobj) {
+			// we are inside an XObject template
+			$this->xobjects[$this->xobjid]['gradients'][$n] = $this->gradients[$n];
+		}
+	}
+
+	/**
+	 * Set a rectangular clipping area.
+	 * @param $x (float) abscissa of the top left corner of the rectangle (or top right corner for RTL mode).
+	 * @param $y (float) ordinate of the top left corner of the rectangle.
+	 * @param $w (float) width of the rectangle.
+	 * @param $h (float) height of the rectangle.
+	 * @author Andreas W�rmser, Nicola Asuni
+	 * @since 3.1.000 (2008-06-09)
+	 * @protected
+	 */
+	protected function Clip($x, $y, $w, $h) {
+		if ($this->state != 2) {
+			 return;
+		}
+		if ($this->rtl) {
+			$x = $this->w - $x - $w;
+		}
+		//save current Graphic State
+		$s = 'q';
+		//set clipping area
+		$s .= sprintf(' %F %F %F %F re W n', $x*$this->k, ($this->h-$y)*$this->k, $w*$this->k, -$h*$this->k);
+		//set up transformation matrix for gradient
+		$s .= sprintf(' %F 0 0 %F %F %F cm', $w*$this->k, $h*$this->k, $x*$this->k, ($this->h-($y+$h))*$this->k);
+		$this->_out($s);
+	}
+
+	/**
+	 * Output gradient.
+	 * @param $type (int) type of gradient (1 Function-based shading; 2 Axial shading; 3 Radial shading; 4 Free-form Gouraud-shaded triangle mesh; 5 Lattice-form Gouraud-shaded triangle mesh; 6 Coons patch mesh; 7 Tensor-product patch mesh). (Not all types are currently supported)
+	 * @param $coords (array) array of coordinates.
+	 * @param $stops (array) array gradient color components: color = array of GRAY, RGB or CMYK color components; offset = (0 to 1) represents a location along the gradient vector; exponent = exponent of the exponential interpolation function (default = 1).
+	 * @param $background (array) An array of colour components appropriate to the colour space, specifying a single background colour value.
+	 * @param $antialias (boolean) A flag indicating whether to filter the shading function to prevent aliasing artifacts.
+	 * @author Nicola Asuni
+	 * @since 3.1.000 (2008-06-09)
+	 * @public
+	 */
+	public function Gradient($type, $coords, $stops, $background=array(), $antialias=false) {
+		if ($this->pdfa_mode OR ($this->state != 2)) {
+			return;
+		}
+		$n = count($this->gradients) + 1;
+		$this->gradients[$n] = array();
+		$this->gradients[$n]['type'] = $type;
+		$this->gradients[$n]['coords'] = $coords;
+		$this->gradients[$n]['antialias'] = $antialias;
+		$this->gradients[$n]['colors'] = array();
+		$this->gradients[$n]['transparency'] = false;
+		// color space
+		$numcolspace = count($stops[0]['color']);
+		$bcolor = array_values($background);
+		switch($numcolspace) {
+			case 5:   // SPOT
+			case 4: { // CMYK
+				$this->gradients[$n]['colspace'] = 'DeviceCMYK';
+				if (!empty($background)) {
+					$this->gradients[$n]['background'] = sprintf('%F %F %F %F', $bcolor[0]/100, $bcolor[1]/100, $bcolor[2]/100, $bcolor[3]/100);
+				}
+				break;
+			}
+			case 3: { // RGB
+				$this->gradients[$n]['colspace'] = 'DeviceRGB';
+				if (!empty($background)) {
+					$this->gradients[$n]['background'] = sprintf('%F %F %F', $bcolor[0]/255, $bcolor[1]/255, $bcolor[2]/255);
+				}
+				break;
+			}
+			case 1: { // GRAY SCALE
+				$this->gradients[$n]['colspace'] = 'DeviceGray';
+				if (!empty($background)) {
+					$this->gradients[$n]['background'] = sprintf('%F', $bcolor[0]/255);
+				}
+				break;
+			}
+		}
+		$num_stops = count($stops);
+		$last_stop_id = $num_stops - 1;
+		foreach ($stops as $key => $stop) {
+			$this->gradients[$n]['colors'][$key] = array();
+			// offset represents a location along the gradient vector
+			if (isset($stop['offset'])) {
+				$this->gradients[$n]['colors'][$key]['offset'] = $stop['offset'];
+			} else {
+				if ($key == 0) {
+					$this->gradients[$n]['colors'][$key]['offset'] = 0;
+				} elseif ($key == $last_stop_id) {
+					$this->gradients[$n]['colors'][$key]['offset'] = 1;
+				} else {
+					$offsetstep = (1 - $this->gradients[$n]['colors'][($key - 1)]['offset']) / ($num_stops - $key);
+					$this->gradients[$n]['colors'][$key]['offset'] = $this->gradients[$n]['colors'][($key - 1)]['offset'] + $offsetstep;
+				}
+			}
+			if (isset($stop['opacity'])) {
+				$this->gradients[$n]['colors'][$key]['opacity'] = $stop['opacity'];
+				if ((!$this->pdfa_mode) AND ($stop['opacity'] < 1)) {
+					$this->gradients[$n]['transparency'] = true;
+				}
+			} else {
+				$this->gradients[$n]['colors'][$key]['opacity'] = 1;
+			}
+			// exponent for the exponential interpolation function
+			if (isset($stop['exponent'])) {
+				$this->gradients[$n]['colors'][$key]['exponent'] = $stop['exponent'];
+			} else {
+				$this->gradients[$n]['colors'][$key]['exponent'] = 1;
+			}
+			// set colors
+			$color = array_values($stop['color']);
+			switch($numcolspace) {
+				case 5:   // SPOT
+				case 4: { // CMYK
+					$this->gradients[$n]['colors'][$key]['color'] = sprintf('%F %F %F %F', $color[0]/100, $color[1]/100, $color[2]/100, $color[3]/100);
+					break;
+				}
+				case 3: { // RGB
+					$this->gradients[$n]['colors'][$key]['color'] = sprintf('%F %F %F', $color[0]/255, $color[1]/255, $color[2]/255);
+					break;
+				}
+				case 1: { // GRAY SCALE
+					$this->gradients[$n]['colors'][$key]['color'] = sprintf('%F', $color[0]/255);
+					break;
+				}
+			}
+		}
+		if ($this->gradients[$n]['transparency']) {
+			// paint luminosity gradient
+			$this->_out('/TGS'.$n.' gs');
+		}
+		//paint the gradient
+		$this->_out('/Sh'.$n.' sh');
+		//restore previous Graphic State
+		$this->_out('Q');
+		if ($this->inxobj) {
+			// we are inside an XObject template
+			$this->xobjects[$this->xobjid]['gradients'][$n] = $this->gradients[$n];
+		}
+	}
+
+	/**
+	 * Output gradient shaders.
+	 * @author Nicola Asuni
+	 * @since 3.1.000 (2008-06-09)
+	 * @protected
+	 */
+	function _putshaders() {
+		if ($this->pdfa_mode) {
+			return;
+		}
+		$idt = count($this->gradients); //index for transparency gradients
+		foreach ($this->gradients as $id => $grad) {
+			if (($grad['type'] == 2) OR ($grad['type'] == 3)) {
+				$fc = $this->_newobj();
+				$out = '<<';
+				$out .= ' /FunctionType 3';
+				$out .= ' /Domain [0 1]';
+				$functions = '';
+				$bounds = '';
+				$encode = '';
+				$i = 1;
+				$num_cols = count($grad['colors']);
+				$lastcols = $num_cols - 1;
+				for ($i = 1; $i < $num_cols; ++$i) {
+					$functions .= ($fc + $i).' 0 R ';
+					if ($i < $lastcols) {
+						$bounds .= sprintf('%F ', $grad['colors'][$i]['offset']);
+					}
+					$encode .= '0 1 ';
+				}
+				$out .= ' /Functions ['.trim($functions).']';
+				$out .= ' /Bounds ['.trim($bounds).']';
+				$out .= ' /Encode ['.trim($encode).']';
+				$out .= ' >>';
+				$out .= "\n".'endobj';
+				$this->_out($out);
+				for ($i = 1; $i < $num_cols; ++$i) {
+					$this->_newobj();
+					$out = '<<';
+					$out .= ' /FunctionType 2';
+					$out .= ' /Domain [0 1]';
+					$out .= ' /C0 ['.$grad['colors'][($i - 1)]['color'].']';
+					$out .= ' /C1 ['.$grad['colors'][$i]['color'].']';
+					$out .= ' /N '.$grad['colors'][$i]['exponent'];
+					$out .= ' >>';
+					$out .= "\n".'endobj';
+					$this->_out($out);
+				}
+				// set transparency fuctions
+				if ($grad['transparency']) {
+					$ft = $this->_newobj();
+					$out = '<<';
+					$out .= ' /FunctionType 3';
+					$out .= ' /Domain [0 1]';
+					$functions = '';
+					$i = 1;
+					$num_cols = count($grad['colors']);
+					for ($i = 1; $i < $num_cols; ++$i) {
+						$functions .= ($ft + $i).' 0 R ';
+					}
+					$out .= ' /Functions ['.trim($functions).']';
+					$out .= ' /Bounds ['.trim($bounds).']';
+					$out .= ' /Encode ['.trim($encode).']';
+					$out .= ' >>';
+					$out .= "\n".'endobj';
+					$this->_out($out);
+					for ($i = 1; $i < $num_cols; ++$i) {
+						$this->_newobj();
+						$out = '<<';
+						$out .= ' /FunctionType 2';
+						$out .= ' /Domain [0 1]';
+						$out .= ' /C0 ['.$grad['colors'][($i - 1)]['opacity'].']';
+						$out .= ' /C1 ['.$grad['colors'][$i]['opacity'].']';
+						$out .= ' /N '.$grad['colors'][$i]['exponent'];
+						$out .= ' >>';
+						$out .= "\n".'endobj';
+						$this->_out($out);
+					}
+				}
+			}
+			// set shading object
+			$this->_newobj();
+			$out = '<< /ShadingType '.$grad['type'];
+			if (isset($grad['colspace'])) {
+				$out .= ' /ColorSpace /'.$grad['colspace'];
+			} else {
+				$out .= ' /ColorSpace /DeviceRGB';
+			}
+			if (isset($grad['background']) AND !empty($grad['background'])) {
+				$out .= ' /Background ['.$grad['background'].']';
+			}
+			if (isset($grad['antialias']) AND ($grad['antialias'] === true)) {
+				$out .= ' /AntiAlias true';
+			}
+			if ($grad['type'] == 2) {
+				$out .= ' '.sprintf('/Coords [%F %F %F %F]', $grad['coords'][0], $grad['coords'][1], $grad['coords'][2], $grad['coords'][3]);
+				$out .= ' /Domain [0 1]';
+				$out .= ' /Function '.$fc.' 0 R';
+				$out .= ' /Extend [true true]';
+				$out .= ' >>';
+			} elseif ($grad['type'] == 3) {
+				//x0, y0, r0, x1, y1, r1
+				//at this this time radius of inner circle is 0
+				$out .= ' '.sprintf('/Coords [%F %F 0 %F %F %F]', $grad['coords'][0], $grad['coords'][1], $grad['coords'][2], $grad['coords'][3], $grad['coords'][4]);
+				$out .= ' /Domain [0 1]';
+				$out .= ' /Function '.$fc.' 0 R';
+				$out .= ' /Extend [true true]';
+				$out .= ' >>';
+			} elseif ($grad['type'] == 6) {
+				$out .= ' /BitsPerCoordinate 16';
+				$out .= ' /BitsPerComponent 8';
+				$out .= ' /Decode[0 1 0 1 0 1 0 1 0 1]';
+				$out .= ' /BitsPerFlag 8';
+				$stream = $this->_getrawstream($grad['stream']);
+				$out .= ' /Length '.strlen($stream);
+				$out .= ' >>';
+				$out .= ' stream'."\n".$stream."\n".'endstream';
+			}
+			$out .= "\n".'endobj';
+			$this->_out($out);
+			if ($grad['transparency']) {
+				$shading_transparency = preg_replace('/\/ColorSpace \/[^\s]+/si', '/ColorSpace /DeviceGray', $out);
+				$shading_transparency = preg_replace('/\/Function [0-9]+ /si', '/Function '.$ft.' ', $shading_transparency);
+			}
+			$this->gradients[$id]['id'] = $this->n;
+			// set pattern object
+			$this->_newobj();
+			$out = '<< /Type /Pattern /PatternType 2';
+			$out .= ' /Shading '.$this->gradients[$id]['id'].' 0 R';
+			$out .= ' >>';
+			$out .= "\n".'endobj';
+			$this->_out($out);
+			$this->gradients[$id]['pattern'] = $this->n;
+			// set shading and pattern for transparency mask
+			if ($grad['transparency']) {
+				// luminosity pattern
+				$idgs = $id + $idt;
+				$this->_newobj();
+				$this->_out($shading_transparency);
+				$this->gradients[$idgs]['id'] = $this->n;
+				$this->_newobj();
+				$out = '<< /Type /Pattern /PatternType 2';
+				$out .= ' /Shading '.$this->gradients[$idgs]['id'].' 0 R';
+				$out .= ' >>';
+				$out .= "\n".'endobj';
+				$this->_out($out);
+				$this->gradients[$idgs]['pattern'] = $this->n;
+				// luminosity XObject
+				$oid = $this->_newobj();
+				$this->xobjects['LX'.$oid] = array('n' => $oid);
+				$filter = '';
+				$stream = 'q /a0 gs /Pattern cs /p'.$idgs.' scn 0 0 '.$this->wPt.' '.$this->hPt.' re f Q';
+				if ($this->compress) {
+					$filter = ' /Filter /FlateDecode';
+					$stream = gzcompress($stream);
+				}
+				$stream = $this->_getrawstream($stream);
+				$out = '<< /Type /XObject /Subtype /Form /FormType 1'.$filter;
+				$out .= ' /Length '.strlen($stream);
+				$rect = sprintf('%F %F', $this->wPt, $this->hPt);
+				$out .= ' /BBox [0 0 '.$rect.']';
+				$out .= ' /Group << /Type /Group /S /Transparency /CS /DeviceGray >>';
+				$out .= ' /Resources <<';
+				$out .= ' /ExtGState << /a0 << /ca 1 /CA 1 >> >>';
+				$out .= ' /Pattern << /p'.$idgs.' '.$this->gradients[$idgs]['pattern'].' 0 R >>';
+				$out .= ' >>';
+				$out .= ' >> ';
+				$out .= ' stream'."\n".$stream."\n".'endstream';
+				$out .= "\n".'endobj';
+				$this->_out($out);
+				// SMask
+				$this->_newobj();
+				$out = '<< /Type /Mask /S /Luminosity /G '.($this->n - 1).' 0 R >>'."\n".'endobj';
+				$this->_out($out);
+				// ExtGState
+				$this->_newobj();
+				$out = '<< /Type /ExtGState /SMask '.($this->n - 1).' 0 R /AIS false >>'."\n".'endobj';
+				$this->_out($out);
+				$this->extgstates[] = array('n' => $this->n, 'name' => 'TGS'.$id);
+			}
+		}
+	}
+
+	/**
+	 * Draw the sector of a circle.
+	 * It can be used for instance to render pie charts.
+	 * @param $xc (float) abscissa of the center.
+	 * @param $yc (float) ordinate of the center.
+	 * @param $r (float) radius.
+	 * @param $a (float) start angle (in degrees).
+	 * @param $b (float) end angle (in degrees).
+	 * @param $style (string) Style of rendering. See the getPathPaintOperator() function for more information.
+	 * @param $cw: (float) indicates whether to go clockwise (default: true).
+	 * @param $o: (float) origin of angles (0 for 3 o'clock, 90 for noon, 180 for 9 o'clock, 270 for 6 o'clock). Default: 90.
+	 * @author Maxime Delorme, Nicola Asuni
+	 * @since 3.1.000 (2008-06-09)
+	 * @public
+	 */
+	public function PieSector($xc, $yc, $r, $a, $b, $style='FD', $cw=true, $o=90) {
+		$this->PieSectorXY($xc, $yc, $r, $r, $a, $b, $style, $cw, $o);
+	}
+
+	/**
+	 * Draw the sector of an ellipse.
+	 * It can be used for instance to render pie charts.
+	 * @param $xc (float) abscissa of the center.
+	 * @param $yc (float) ordinate of the center.
+	 * @param $rx (float) the x-axis radius.
+	 * @param $ry (float) the y-axis radius.
+	 * @param $a (float) start angle (in degrees).
+	 * @param $b (float) end angle (in degrees).
+	 * @param $style (string) Style of rendering. See the getPathPaintOperator() function for more information.
+	 * @param $cw: (float) indicates whether to go clockwise.
+	 * @param $o: (float) origin of angles (0 for 3 o'clock, 90 for noon, 180 for 9 o'clock, 270 for 6 o'clock).
+	 * @param $nc (integer) Number of curves used to draw a 90 degrees portion of arc.
+	 * @author Maxime Delorme, Nicola Asuni
+	 * @since 3.1.000 (2008-06-09)
+	 * @public
+	 */
+	public function PieSectorXY($xc, $yc, $rx, $ry, $a, $b, $style='FD', $cw=false, $o=0, $nc=2) {
+		if ($this->state != 2) {
+			 return;
+		}
+		if ($this->rtl) {
+			$xc = ($this->w - $xc);
+		}
+		$op = TCPDF_STATIC::getPathPaintOperator($style);
+		if ($op == 'f') {
+			$line_style = array();
+		}
+		if ($cw) {
+			$d = $b;
+			$b = (360 - $a + $o);
+			$a = (360 - $d + $o);
+		} else {
+			$b += $o;
+			$a += $o;
+		}
+		$this->_outellipticalarc($xc, $yc, $rx, $ry, 0, $a, $b, true, $nc);
+		$this->_out($op);
+	}
+
+	/**
+	 * Embed vector-based Adobe Illustrator (AI) or AI-compatible EPS files.
+	 * NOTE: EPS is not yet fully implemented, use the setRasterizeVectorImages() method to enable/disable rasterization of vector images using ImageMagick library.
+	 * Only vector drawing is supported, not text or bitmap.
+	 * Although the script was successfully tested with various AI format versions, best results are probably achieved with files that were exported in the AI3 format (tested with Illustrator CS2, Freehand MX and Photoshop CS2).
+	 * @param $file (string) Name of the file containing the image or a '@' character followed by the EPS/AI data string.
+	 * @param $x (float) Abscissa of the upper-left corner.
+	 * @param $y (float) Ordinate of the upper-left corner.
+	 * @param $w (float) Width of the image in the page. If not specified or equal to zero, it is automatically calculated.
+	 * @param $h (float) Height of the image in the page. If not specified or equal to zero, it is automatically calculated.
+	 * @param $link (mixed) URL or identifier returned by AddLink().
+	 * @param $useBoundingBox (boolean) specifies whether to position the bounding box (true) or the complete canvas (false) at location (x,y). Default value is true.
+	 * @param $align (string) Indicates the alignment of the pointer next to image insertion relative to image height. The value can be:<ul><li>T: top-right for LTR or top-left for RTL</li><li>M: middle-right for LTR or middle-left for RTL</li><li>B: bottom-right for LTR or bottom-left for RTL</li><li>N: next line</li></ul>
+	 * @param $palign (string) Allows to center or align the image on the current line. Possible values are:<ul><li>L : left align</li><li>C : center</li><li>R : right align</li><li>'' : empty string : left for LTR or right for RTL</li></ul>
+	 * @param $border (mixed) Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
+	 * @param $fitonpage (boolean) if true the image is resized to not exceed page dimensions.
+	 * @param $fixoutvals (boolean) if true remove values outside the bounding box.
+	 * @author Valentin Schmidt, Nicola Asuni
+	 * @since 3.1.000 (2008-06-09)
+	 * @public
+	 */
+	public function ImageEps($file, $x='', $y='', $w=0, $h=0, $link='', $useBoundingBox=true, $align='', $palign='', $border=0, $fitonpage=false, $fixoutvals=false) {
+		if ($this->state != 2) {
+			 return;
+		}
+		if ($this->rasterize_vector_images AND ($w > 0) AND ($h > 0)) {
+			// convert EPS to raster image using GD or ImageMagick libraries
+			return $this->Image($file, $x, $y, $w, $h, 'EPS', $link, $align, true, 300, $palign, false, false, $border, false, false, $fitonpage);
+		}
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		// check page for no-write regions and adapt page margins if necessary
+		list($x, $y) = $this->checkPageRegions($h, $x, $y);
+		$k = $this->k;
+		if ($file{0} === '@') { // image from string
+			$data = substr($file, 1);
+		} else { // EPS/AI file
+			$data = TCPDF_STATIC::fileGetContents($file);
+		}
+		if ($data === FALSE) {
+			$this->Error('EPS file not found: '.$file);
+		}
+		$regs = array();
+		// EPS/AI compatibility check (only checks files created by Adobe Illustrator!)
+		preg_match("/%%Creator:([^\r\n]+)/", $data, $regs); # find Creator
+		if (count($regs) > 1) {
+			$version_str = trim($regs[1]); # e.g. "Adobe Illustrator(R) 8.0"
+			if (strpos($version_str, 'Adobe Illustrator') !== false) {
+				$versexp = explode(' ', $version_str);
+				$version = (float)array_pop($versexp);
+				if ($version >= 9) {
+					$this->Error('This version of Adobe Illustrator file is not supported: '.$file);
+				}
+			}
+		}
+		// strip binary bytes in front of PS-header
+		$start = strpos($data, '%!PS-Adobe');
+		if ($start > 0) {
+			$data = substr($data, $start);
+		}
+		// find BoundingBox params
+		preg_match("/%%BoundingBox:([^\r\n]+)/", $data, $regs);
+		if (count($regs) > 1) {
+			list($x1, $y1, $x2, $y2) = explode(' ', trim($regs[1]));
+		} else {
+			$this->Error('No BoundingBox found in EPS/AI file: '.$file);
+		}
+		$start = strpos($data, '%%EndSetup');
+		if ($start === false) {
+			$start = strpos($data, '%%EndProlog');
+		}
+		if ($start === false) {
+			$start = strpos($data, '%%BoundingBox');
+		}
+		$data = substr($data, $start);
+		$end = strpos($data, '%%PageTrailer');
+		if ($end===false) {
+			$end = strpos($data, 'showpage');
+		}
+		if ($end) {
+			$data = substr($data, 0, $end);
+		}
+		// calculate image width and height on document
+		if (($w <= 0) AND ($h <= 0)) {
+			$w = ($x2 - $x1) / $k;
+			$h = ($y2 - $y1) / $k;
+		} elseif ($w <= 0) {
+			$w = ($x2-$x1) / $k * ($h / (($y2 - $y1) / $k));
+		} elseif ($h <= 0) {
+			$h = ($y2 - $y1) / $k * ($w / (($x2 - $x1) / $k));
+		}
+		// fit the image on available space
+		list($w, $h, $x, $y) = $this->fitBlock($w, $h, $x, $y, $fitonpage);
+		if ($this->rasterize_vector_images) {
+			// convert EPS to raster image using GD or ImageMagick libraries
+			return $this->Image($file, $x, $y, $w, $h, 'EPS', $link, $align, true, 300, $palign, false, false, $border, false, false, $fitonpage);
+		}
+		// set scaling factors
+		$scale_x = $w / (($x2 - $x1) / $k);
+		$scale_y = $h / (($y2 - $y1) / $k);
+		// set alignment
+		$this->img_rb_y = $y + $h;
+		// set alignment
+		if ($this->rtl) {
+			if ($palign == 'L') {
+				$ximg = $this->lMargin;
+			} elseif ($palign == 'C') {
+				$ximg = ($this->w + $this->lMargin - $this->rMargin - $w) / 2;
+			} elseif ($palign == 'R') {
+				$ximg = $this->w - $this->rMargin - $w;
+			} else {
+				$ximg = $x - $w;
+			}
+			$this->img_rb_x = $ximg;
+		} else {
+			if ($palign == 'L') {
+				$ximg = $this->lMargin;
+			} elseif ($palign == 'C') {
+				$ximg = ($this->w + $this->lMargin - $this->rMargin - $w) / 2;
+			} elseif ($palign == 'R') {
+				$ximg = $this->w - $this->rMargin - $w;
+			} else {
+				$ximg = $x;
+			}
+			$this->img_rb_x = $ximg + $w;
+		}
+		if ($useBoundingBox) {
+			$dx = $ximg * $k - $x1;
+			$dy = $y * $k - $y1;
+		} else {
+			$dx = $ximg * $k;
+			$dy = $y * $k;
+		}
+		// save the current graphic state
+		$this->_out('q'.$this->epsmarker);
+		// translate
+		$this->_out(sprintf('%F %F %F %F %F %F cm', 1, 0, 0, 1, $dx, $dy + ($this->hPt - (2 * $y * $k) - ($y2 - $y1))));
+		// scale
+		if (isset($scale_x)) {
+			$this->_out(sprintf('%F %F %F %F %F %F cm', $scale_x, 0, 0, $scale_y, $x1 * (1 - $scale_x), $y2 * (1 - $scale_y)));
+		}
+		// handle pc/unix/mac line endings
+		$lines = preg_split('/[\r\n]+/si', $data, -1, PREG_SPLIT_NO_EMPTY);
+		$u=0;
+		$cnt = count($lines);
+		for ($i=0; $i < $cnt; ++$i) {
+			$line = $lines[$i];
+			if (($line == '') OR ($line{0} == '%')) {
+				continue;
+			}
+			$len = strlen($line);
+			// check for spot color names
+			$color_name = '';
+			if (strcasecmp('x', substr(trim($line), -1)) == 0) {
+				if (preg_match('/\([^\)]*\)/', $line, $matches) > 0) {
+					// extract spot color name
+					$color_name = $matches[0];
+					// remove color name from string
+					$line = str_replace(' '.$color_name, '', $line);
+					// remove pharentesis from color name
+					$color_name = substr($color_name, 1, -1);
+				}
+			}
+			$chunks = explode(' ', $line);
+			$cmd = trim(array_pop($chunks));
+			// RGB
+			if (($cmd == 'Xa') OR ($cmd == 'XA')) {
+				$b = array_pop($chunks);
+				$g = array_pop($chunks);
+				$r = array_pop($chunks);
+				$this->_out(''.$r.' '.$g.' '.$b.' '.($cmd=='Xa'?'rg':'RG')); //substr($line, 0, -2).'rg' -> in EPS (AI8): c m y k r g b rg!
+				continue;
+			}
+			$skip = false;
+			if ($fixoutvals) {
+				// check for values outside the bounding box
+				switch ($cmd) {
+					case 'm':
+					case 'l':
+					case 'L': {
+						// skip values outside bounding box
+						foreach ($chunks as $key => $val) {
+							if ((($key % 2) == 0) AND (($val < $x1) OR ($val > $x2))) {
+								$skip = true;
+							} elseif ((($key % 2) != 0) AND (($val < $y1) OR ($val > $y2))) {
+								$skip = true;
+							}
+						}
+					}
+				}
+			}
+			switch ($cmd) {
+				case 'm':
+				case 'l':
+				case 'v':
+				case 'y':
+				case 'c':
+				case 'k':
+				case 'K':
+				case 'g':
+				case 'G':
+				case 's':
+				case 'S':
+				case 'J':
+				case 'j':
+				case 'w':
+				case 'M':
+				case 'd':
+				case 'n': {
+					if ($skip) {
+						break;
+					}
+					$this->_out($line);
+					break;
+				}
+				case 'x': {// custom fill color
+					if (empty($color_name)) {
+						// CMYK color
+						list($col_c, $col_m, $col_y, $col_k) = $chunks;
+						$this->_out(''.$col_c.' '.$col_m.' '.$col_y.' '.$col_k.' k');
+					} else {
+						// Spot Color (CMYK + tint)
+						list($col_c, $col_m, $col_y, $col_k, $col_t) = $chunks;
+						$this->AddSpotColor($color_name, ($col_c * 100), ($col_m * 100), ($col_y * 100), ($col_k * 100));
+						$color_cmd = sprintf('/CS%d cs %F scn', $this->spot_colors[$color_name]['i'], (1 - $col_t));
+						$this->_out($color_cmd);
+					}
+					break;
+				}
+				case 'X': { // custom stroke color
+					if (empty($color_name)) {
+						// CMYK color
+						list($col_c, $col_m, $col_y, $col_k) = $chunks;
+						$this->_out(''.$col_c.' '.$col_m.' '.$col_y.' '.$col_k.' K');
+					} else {
+						// Spot Color (CMYK + tint)
+						list($col_c, $col_m, $col_y, $col_k, $col_t) = $chunks;
+						$this->AddSpotColor($color_name, ($col_c * 100), ($col_m * 100), ($col_y * 100), ($col_k * 100));
+						$color_cmd = sprintf('/CS%d CS %F SCN', $this->spot_colors[$color_name]['i'], (1 - $col_t));
+						$this->_out($color_cmd);
+					}
+					break;
+				}
+				case 'Y':
+				case 'N':
+				case 'V':
+				case 'L':
+				case 'C': {
+					if ($skip) {
+						break;
+					}
+					$line[($len - 1)] = strtolower($cmd);
+					$this->_out($line);
+					break;
+				}
+				case 'b':
+				case 'B': {
+					$this->_out($cmd . '*');
+					break;
+				}
+				case 'f':
+				case 'F': {
+					if ($u > 0) {
+						$isU = false;
+						$max = min(($i + 5), $cnt);
+						for ($j = ($i + 1); $j < $max; ++$j) {
+							$isU = ($isU OR (($lines[$j] == 'U') OR ($lines[$j] == '*U')));
+						}
+						if ($isU) {
+							$this->_out('f*');
+						}
+					} else {
+						$this->_out('f*');
+					}
+					break;
+				}
+				case '*u': {
+					++$u;
+					break;
+				}
+				case '*U': {
+					--$u;
+					break;
+				}
+			}
+		}
+		// restore previous graphic state
+		$this->_out($this->epsmarker.'Q');
+		if (!empty($border)) {
+			$bx = $this->x;
+			$by = $this->y;
+			$this->x = $ximg;
+			if ($this->rtl) {
+				$this->x += $w;
+			}
+			$this->y = $y;
+			$this->Cell($w, $h, '', $border, 0, '', 0, '', 0, true);
+			$this->x = $bx;
+			$this->y = $by;
+		}
+		if ($link) {
+			$this->Link($ximg, $y, $w, $h, $link, 0);
+		}
+		// set pointer to align the next text/objects
+		switch($align) {
+			case 'T':{
+				$this->y = $y;
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'M':{
+				$this->y = $y + round($h/2);
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'B':{
+				$this->y = $this->img_rb_y;
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'N':{
+				$this->SetY($this->img_rb_y);
+				break;
+			}
+			default:{
+				break;
+			}
+		}
+		$this->endlinex = $this->img_rb_x;
+	}
+
+	/**
+	 * Set document barcode.
+	 * @param $bc (string) barcode
+	 * @public
+	 */
+	public function setBarcode($bc='') {
+		$this->barcode = $bc;
+	}
+
+	/**
+	 * Get current barcode.
+	 * @return string
+	 * @public
+	 * @since 4.0.012 (2008-07-24)
+	 */
+	public function getBarcode() {
+		return $this->barcode;
+	}
+
+	/**
+	 * Print a Linear Barcode.
+	 * @param $code (string) code to print
+	 * @param $type (string) type of barcode (see tcpdf_barcodes_1d.php for supported formats).
+	 * @param $x (int) x position in user units (empty string = current x position)
+	 * @param $y (int) y position in user units (empty string = current y position)
+	 * @param $w (int) width in user units (empty string = remaining page width)
+	 * @param $h (int) height in user units (empty string = remaining page height)
+	 * @param $xres (float) width of the smallest bar in user units (empty string = default value = 0.4mm)
+	 * @param $style (array) array of options:<ul>
+	 * <li>boolean $style['border'] if true prints a border</li>
+	 * <li>int $style['padding'] padding to leave around the barcode in user units (set to 'auto' for automatic padding)</li>
+	 * <li>int $style['hpadding'] horizontal padding in user units (set to 'auto' for automatic padding)</li>
+	 * <li>int $style['vpadding'] vertical padding in user units (set to 'auto' for automatic padding)</li>
+	 * <li>array $style['fgcolor'] color array for bars and text</li>
+	 * <li>mixed $style['bgcolor'] color array for background (set to false for transparent)</li>
+	 * <li>boolean $style['text'] if true prints text below the barcode</li>
+	 * <li>string $style['label'] override default label</li>
+	 * <li>string $style['font'] font name for text</li><li>int $style['fontsize'] font size for text</li>
+	 * <li>int $style['stretchtext']: 0 = disabled; 1 = horizontal scaling only if necessary; 2 = forced horizontal scaling; 3 = character spacing only if necessary; 4 = forced character spacing.</li>
+	 * <li>string $style['position'] horizontal position of the containing barcode cell on the page: L = left margin; C = center; R = right margin.</li>
+	 * <li>string $style['align'] horizontal position of the barcode on the containing rectangle: L = left; C = center; R = right.</li>
+	 * <li>string $style['stretch'] if true stretch the barcode to best fit the available width, otherwise uses $xres resolution for a single bar.</li>
+	 * <li>string $style['fitwidth'] if true reduce the width to fit the barcode width + padding. When this option is enabled the 'stretch' option is automatically disabled.</li>
+	 * <li>string $style['cellfitalign'] this option works only when 'fitwidth' is true and 'position' is unset or empty. Set the horizontal position of the containing barcode cell inside the specified rectangle: L = left; C = center; R = right.</li></ul>
+	 * @param $align (string) Indicates the alignment of the pointer next to barcode insertion relative to barcode height. The value can be:<ul><li>T: top-right for LTR or top-left for RTL</li><li>M: middle-right for LTR or middle-left for RTL</li><li>B: bottom-right for LTR or bottom-left for RTL</li><li>N: next line</li></ul>
+	 * @author Nicola Asuni
+	 * @since 3.1.000 (2008-06-09)
+	 * @public
+	 */
+	public function write1DBarcode($code, $type, $x='', $y='', $w='', $h='', $xres='', $style='', $align='') {
+		if (TCPDF_STATIC::empty_string(trim($code))) {
+			return;
+		}
+		require_once(dirname(__FILE__).'/tcpdf_barcodes_1d.php');
+		// save current graphic settings
+		$gvars = $this->getGraphicVars();
+		// create new barcode object
+		$barcodeobj = new TCPDFBarcode($code, $type);
+		$arrcode = $barcodeobj->getBarcodeArray();
+		if (($arrcode === false) OR empty($arrcode) OR ($arrcode['maxw'] <= 0)) {
+			$this->Error('Error in 1D barcode string');
+		}
+		if ($arrcode['maxh'] <= 0) {
+			$arrcode['maxh'] = 1;
+		}
+		// set default values
+		if (!isset($style['position'])) {
+			$style['position'] = '';
+		} elseif ($style['position'] == 'S') {
+			// keep this for backward compatibility
+			$style['position'] = '';
+			$style['stretch'] = true;
+		}
+		if (!isset($style['fitwidth'])) {
+			if (!isset($style['stretch'])) {
+				$style['fitwidth'] = true;
+			} else {
+				$style['fitwidth'] = false;
+			}
+		}
+		if ($style['fitwidth']) {
+			// disable stretch
+			$style['stretch'] = false;
+		}
+		if (!isset($style['stretch'])) {
+			if (($w === '') OR ($w <= 0)) {
+				$style['stretch'] = false;
+			} else {
+				$style['stretch'] = true;
+			}
+		}
+		if (!isset($style['fgcolor'])) {
+			$style['fgcolor'] = array(0,0,0); // default black
+		}
+		if (!isset($style['bgcolor'])) {
+			$style['bgcolor'] = false; // default transparent
+		}
+		if (!isset($style['border'])) {
+			$style['border'] = false;
+		}
+		$fontsize = 0;
+		if (!isset($style['text'])) {
+			$style['text'] = false;
+		}
+		if ($style['text'] AND isset($style['font'])) {
+			if (isset($style['fontsize'])) {
+				$fontsize = $style['fontsize'];
+			}
+			$this->SetFont($style['font'], '', $fontsize);
+		}
+		if (!isset($style['stretchtext'])) {
+			$style['stretchtext'] = 4;
+		}
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		// check page for no-write regions and adapt page margins if necessary
+		list($x, $y) = $this->checkPageRegions($h, $x, $y);
+		if (($w === '') OR ($w <= 0)) {
+			if ($this->rtl) {
+				$w = $x - $this->lMargin;
+			} else {
+				$w = $this->w - $this->rMargin - $x;
+			}
+		}
+		// padding
+		if (!isset($style['padding'])) {
+			$padding = 0;
+		} elseif ($style['padding'] === 'auto') {
+			$padding = 10 * ($w / ($arrcode['maxw'] + 20));
+		} else {
+			$padding = floatval($style['padding']);
+		}
+		// horizontal padding
+		if (!isset($style['hpadding'])) {
+			$hpadding = $padding;
+		} elseif ($style['hpadding'] === 'auto') {
+			$hpadding = 10 * ($w / ($arrcode['maxw'] + 20));
+		} else {
+			$hpadding = floatval($style['hpadding']);
+		}
+		// vertical padding
+		if (!isset($style['vpadding'])) {
+			$vpadding = $padding;
+		} elseif ($style['vpadding'] === 'auto') {
+			$vpadding = ($hpadding / 2);
+		} else {
+			$vpadding = floatval($style['vpadding']);
+		}
+		// calculate xres (single bar width)
+		$max_xres = ($w - (2 * $hpadding)) / $arrcode['maxw'];
+		if ($style['stretch']) {
+			$xres = $max_xres;
+		} else {
+			if (TCPDF_STATIC::empty_string($xres)) {
+				$xres = (0.141 * $this->k); // default bar width = 0.4 mm
+			}
+			if ($xres > $max_xres) {
+				// correct xres to fit on $w
+				$xres = $max_xres;
+			}
+			if ((isset($style['padding']) AND ($style['padding'] === 'auto'))
+				OR (isset($style['hpadding']) AND ($style['hpadding'] === 'auto'))) {
+				$hpadding = 10 * $xres;
+				if (isset($style['vpadding']) AND ($style['vpadding'] === 'auto')) {
+					$vpadding = ($hpadding / 2);
+				}
+			}
+		}
+		if ($style['fitwidth']) {
+			$wold = $w;
+			$w = (($arrcode['maxw'] * $xres) + (2 * $hpadding));
+			if (isset($style['cellfitalign'])) {
+				switch ($style['cellfitalign']) {
+					case 'L': {
+						if ($this->rtl) {
+							$x -= ($wold - $w);
+						}
+						break;
+					}
+					case 'R': {
+						if (!$this->rtl) {
+							$x += ($wold - $w);
+						}
+						break;
+					}
+					case 'C': {
+						if ($this->rtl) {
+							$x -= (($wold - $w) / 2);
+						} else {
+							$x += (($wold - $w) / 2);
+						}
+						break;
+					}
+					default : {
+						break;
+					}
+				}
+			}
+		}
+		$text_height = ($this->cell_height_ratio * $fontsize / $this->k);
+		// height
+		if (($h === '') OR ($h <= 0)) {
+			// set default height
+			$h = (($arrcode['maxw'] * $xres) / 3) + (2 * $vpadding) + $text_height;
+		}
+		$barh = $h - $text_height - (2 * $vpadding);
+		if ($barh <=0) {
+			// try to reduce font or padding to fit barcode on available height
+			if ($text_height > $h) {
+				$fontsize = (($h * $this->k) / (4 * $this->cell_height_ratio));
+				$text_height = ($this->cell_height_ratio * $fontsize / $this->k);
+				$this->SetFont($style['font'], '', $fontsize);
+			}
+			if ($vpadding > 0) {
+				$vpadding = (($h - $text_height) / 4);
+			}
+			$barh = $h - $text_height - (2 * $vpadding);
+		}
+		// fit the barcode on available space
+		list($w, $h, $x, $y) = $this->fitBlock($w, $h, $x, $y, false);
+		// set alignment
+		$this->img_rb_y = $y + $h;
+		// set alignment
+		if ($this->rtl) {
+			if ($style['position'] == 'L') {
+				$xpos = $this->lMargin;
+			} elseif ($style['position'] == 'C') {
+				$xpos = ($this->w + $this->lMargin - $this->rMargin - $w) / 2;
+			} elseif ($style['position'] == 'R') {
+				$xpos = $this->w - $this->rMargin - $w;
+			} else {
+				$xpos = $x - $w;
+			}
+			$this->img_rb_x = $xpos;
+		} else {
+			if ($style['position'] == 'L') {
+				$xpos = $this->lMargin;
+			} elseif ($style['position'] == 'C') {
+				$xpos = ($this->w + $this->lMargin - $this->rMargin - $w) / 2;
+			} elseif ($style['position'] == 'R') {
+				$xpos = $this->w - $this->rMargin - $w;
+			} else {
+				$xpos = $x;
+			}
+			$this->img_rb_x = $xpos + $w;
+		}
+		$xpos_rect = $xpos;
+		if (!isset($style['align'])) {
+			$style['align'] = 'C';
+		}
+		switch ($style['align']) {
+			case 'L': {
+				$xpos = $xpos_rect + $hpadding;
+				break;
+			}
+			case 'R': {
+				$xpos = $xpos_rect + ($w - ($arrcode['maxw'] * $xres)) - $hpadding;
+				break;
+			}
+			case 'C':
+			default : {
+				$xpos = $xpos_rect + (($w - ($arrcode['maxw'] * $xres)) / 2);
+				break;
+			}
+		}
+		$xpos_text = $xpos;
+		// barcode is always printed in LTR direction
+		$tempRTL = $this->rtl;
+		$this->rtl = false;
+		// print background color
+		if ($style['bgcolor']) {
+			$this->Rect($xpos_rect, $y, $w, $h, $style['border'] ? 'DF' : 'F', '', $style['bgcolor']);
+		} elseif ($style['border']) {
+			$this->Rect($xpos_rect, $y, $w, $h, 'D');
+		}
+		// set foreground color
+		$this->SetDrawColorArray($style['fgcolor']);
+		$this->SetTextColorArray($style['fgcolor']);
+		// print bars
+		foreach ($arrcode['bcode'] as $k => $v) {
+			$bw = ($v['w'] * $xres);
+			if ($v['t']) {
+				// draw a vertical bar
+				$ypos = $y + $vpadding + ($v['p'] * $barh / $arrcode['maxh']);
+				$this->Rect($xpos, $ypos, $bw, ($v['h'] * $barh / $arrcode['maxh']), 'F', array(), $style['fgcolor']);
+			}
+			$xpos += $bw;
+		}
+		// print text
+		if ($style['text']) {
+			if (isset($style['label']) AND !TCPDF_STATIC::empty_string($style['label'])) {
+				$label = $style['label'];
+			} else {
+				$label = $code;
+			}
+			$txtwidth = ($arrcode['maxw'] * $xres);
+			if ($this->GetStringWidth($label) > $txtwidth) {
+				$style['stretchtext'] = 2;
+			}
+			// print text
+			$this->x = $xpos_text;
+			$this->y = $y + $vpadding + $barh;
+			$cellpadding = $this->cell_padding;
+			$this->SetCellPadding(0);
+			$this->Cell($txtwidth, '', $label, 0, 0, 'C', false, '', $style['stretchtext'], false, 'T', 'T');
+			$this->cell_padding = $cellpadding;
+		}
+		// restore original direction
+		$this->rtl = $tempRTL;
+		// restore previous settings
+		$this->setGraphicVars($gvars);
+		// set pointer to align the next text/objects
+		switch($align) {
+			case 'T':{
+				$this->y = $y;
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'M':{
+				$this->y = $y + round($h / 2);
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'B':{
+				$this->y = $this->img_rb_y;
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'N':{
+				$this->SetY($this->img_rb_y);
+				break;
+			}
+			default:{
+				break;
+			}
+		}
+		$this->endlinex = $this->img_rb_x;
+	}
+
+	/**
+	 * Print 2D Barcode.
+	 * @param $code (string) code to print
+	 * @param $type (string) type of barcode (see tcpdf_barcodes_2d.php for supported formats).
+	 * @param $x (int) x position in user units
+	 * @param $y (int) y position in user units
+	 * @param $w (int) width in user units
+	 * @param $h (int) height in user units
+	 * @param $style (array) array of options:<ul>
+	 * <li>boolean $style['border'] if true prints a border around the barcode</li>
+	 * <li>int $style['padding'] padding to leave around the barcode in barcode units (set to 'auto' for automatic padding)</li>
+	 * <li>int $style['hpadding'] horizontal padding in barcode units (set to 'auto' for automatic padding)</li>
+	 * <li>int $style['vpadding'] vertical padding in barcode units (set to 'auto' for automatic padding)</li>
+	 * <li>int $style['module_width'] width of a single module in points</li>
+	 * <li>int $style['module_height'] height of a single module in points</li>
+	 * <li>array $style['fgcolor'] color array for bars and text</li>
+	 * <li>mixed $style['bgcolor'] color array for background or false for transparent</li>
+	 * <li>string $style['position'] barcode position on the page: L = left margin; C = center; R = right margin; S = stretch</li><li>$style['module_width'] width of a single module in points</li>
+	 * <li>$style['module_height'] height of a single module in points</li></ul>
+	 * @param $align (string) Indicates the alignment of the pointer next to barcode insertion relative to barcode height. The value can be:<ul><li>T: top-right for LTR or top-left for RTL</li><li>M: middle-right for LTR or middle-left for RTL</li><li>B: bottom-right for LTR or bottom-left for RTL</li><li>N: next line</li></ul>
+	 * @param $distort (boolean) if true distort the barcode to fit width and height, otherwise preserve aspect ratio
+	 * @author Nicola Asuni
+	 * @since 4.5.037 (2009-04-07)
+	 * @public
+	 */
+	public function write2DBarcode($code, $type, $x='', $y='', $w='', $h='', $style='', $align='', $distort=false) {
+		if (TCPDF_STATIC::empty_string(trim($code))) {
+			return;
+		}
+		require_once(dirname(__FILE__).'/tcpdf_barcodes_2d.php');
+		// save current graphic settings
+		$gvars = $this->getGraphicVars();
+		// create new barcode object
+		$barcodeobj = new TCPDF2DBarcode($code, $type);
+		$arrcode = $barcodeobj->getBarcodeArray();
+		if (($arrcode === false) OR empty($arrcode) OR !isset($arrcode['num_rows']) OR ($arrcode['num_rows'] == 0) OR !isset($arrcode['num_cols']) OR ($arrcode['num_cols'] == 0)) {
+			$this->Error('Error in 2D barcode string');
+		}
+		// set default values
+		if (!isset($style['position'])) {
+			$style['position'] = '';
+		}
+		if (!isset($style['fgcolor'])) {
+			$style['fgcolor'] = array(0,0,0); // default black
+		}
+		if (!isset($style['bgcolor'])) {
+			$style['bgcolor'] = false; // default transparent
+		}
+		if (!isset($style['border'])) {
+			$style['border'] = false;
+		}
+		// padding
+		if (!isset($style['padding'])) {
+			$style['padding'] = 0;
+		} elseif ($style['padding'] === 'auto') {
+			$style['padding'] = 4;
+		}
+		if (!isset($style['hpadding'])) {
+			$style['hpadding'] = $style['padding'];
+		} elseif ($style['hpadding'] === 'auto') {
+			$style['hpadding'] = 4;
+		}
+		if (!isset($style['vpadding'])) {
+			$style['vpadding'] = $style['padding'];
+		} elseif ($style['vpadding'] === 'auto') {
+			$style['vpadding'] = 4;
+		}
+		$hpad = (2 * $style['hpadding']);
+		$vpad = (2 * $style['vpadding']);
+		// cell (module) dimension
+		if (!isset($style['module_width'])) {
+			$style['module_width'] = 1; // width of a single module in points
+		}
+		if (!isset($style['module_height'])) {
+			$style['module_height'] = 1; // height of a single module in points
+		}
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		// check page for no-write regions and adapt page margins if necessary
+		list($x, $y) = $this->checkPageRegions($h, $x, $y);
+		// number of barcode columns and rows
+		$rows = $arrcode['num_rows'];
+		$cols = $arrcode['num_cols'];
+		if (($rows <= 0) || ($cols <= 0)){
+			$this->Error('Error in 2D barcode string');
+		}
+		// module width and height
+		$mw = $style['module_width'];
+		$mh = $style['module_height'];
+		if (($mw <= 0) OR ($mh <= 0)) {
+			$this->Error('Error in 2D barcode string');
+		}
+		// get max dimensions
+		if ($this->rtl) {
+			$maxw = $x - $this->lMargin;
+		} else {
+			$maxw = $this->w - $this->rMargin - $x;
+		}
+		$maxh = ($this->h - $this->tMargin - $this->bMargin);
+		$ratioHW = ((($rows * $mh) + $hpad) / (($cols * $mw) + $vpad));
+		$ratioWH = ((($cols * $mw) + $vpad) / (($rows * $mh) + $hpad));
+		if (!$distort) {
+			if (($maxw * $ratioHW) > $maxh) {
+				$maxw = $maxh * $ratioWH;
+			}
+			if (($maxh * $ratioWH) > $maxw) {
+				$maxh = $maxw * $ratioHW;
+			}
+		}
+		// set maximum dimesions
+		if ($w > $maxw) {
+			$w = $maxw;
+		}
+		if ($h > $maxh) {
+			$h = $maxh;
+		}
+		// set dimensions
+		if ((($w === '') OR ($w <= 0)) AND (($h === '') OR ($h <= 0))) {
+			$w = ($cols + $hpad) * ($mw / $this->k);
+			$h = ($rows + $vpad) * ($mh / $this->k);
+		} elseif (($w === '') OR ($w <= 0)) {
+			$w = $h * $ratioWH;
+		} elseif (($h === '') OR ($h <= 0)) {
+			$h = $w * $ratioHW;
+		}
+		// barcode size (excluding padding)
+		$bw = ($w * $cols) / ($cols + $hpad);
+		$bh = ($h * $rows) / ($rows + $vpad);
+		// dimension of single barcode cell unit
+		$cw = $bw / $cols;
+		$ch = $bh / $rows;
+		if (!$distort) {
+			if (($cw / $ch) > ($mw / $mh)) {
+				// correct horizontal distortion
+				$cw = $ch * $mw / $mh;
+				$bw = $cw * $cols;
+				$style['hpadding'] = ($w - $bw) / (2 * $cw);
+			} else {
+				// correct vertical distortion
+				$ch = $cw * $mh / $mw;
+				$bh = $ch * $rows;
+				$style['vpadding'] = ($h - $bh) / (2 * $ch);
+			}
+		}
+		// fit the barcode on available space
+		list($w, $h, $x, $y) = $this->fitBlock($w, $h, $x, $y, false);
+		// set alignment
+		$this->img_rb_y = $y + $h;
+		// set alignment
+		if ($this->rtl) {
+			if ($style['position'] == 'L') {
+				$xpos = $this->lMargin;
+			} elseif ($style['position'] == 'C') {
+				$xpos = ($this->w + $this->lMargin - $this->rMargin - $w) / 2;
+			} elseif ($style['position'] == 'R') {
+				$xpos = $this->w - $this->rMargin - $w;
+			} else {
+				$xpos = $x - $w;
+			}
+			$this->img_rb_x = $xpos;
+		} else {
+			if ($style['position'] == 'L') {
+				$xpos = $this->lMargin;
+			} elseif ($style['position'] == 'C') {
+				$xpos = ($this->w + $this->lMargin - $this->rMargin - $w) / 2;
+			} elseif ($style['position'] == 'R') {
+				$xpos = $this->w - $this->rMargin - $w;
+			} else {
+				$xpos = $x;
+			}
+			$this->img_rb_x = $xpos + $w;
+		}
+		$xstart = $xpos + ($style['hpadding'] * $cw);
+		$ystart = $y + ($style['vpadding'] * $ch);
+		// barcode is always printed in LTR direction
+		$tempRTL = $this->rtl;
+		$this->rtl = false;
+		// print background color
+		if ($style['bgcolor']) {
+			$this->Rect($xpos, $y, $w, $h, $style['border'] ? 'DF' : 'F', '', $style['bgcolor']);
+		} elseif ($style['border']) {
+			$this->Rect($xpos, $y, $w, $h, 'D');
+		}
+		// set foreground color
+		$this->SetDrawColorArray($style['fgcolor']);
+		// print barcode cells
+		// for each row
+		for ($r = 0; $r < $rows; ++$r) {
+			$xr = $xstart;
+			// for each column
+			for ($c = 0; $c < $cols; ++$c) {
+				if ($arrcode['bcode'][$r][$c] == 1) {
+					// draw a single barcode cell
+					$this->Rect($xr, $ystart, $cw, $ch, 'F', array(), $style['fgcolor']);
+				}
+				$xr += $cw;
+			}
+			$ystart += $ch;
+		}
+		// restore original direction
+		$this->rtl = $tempRTL;
+		// restore previous settings
+		$this->setGraphicVars($gvars);
+		// set pointer to align the next text/objects
+		switch($align) {
+			case 'T':{
+				$this->y = $y;
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'M':{
+				$this->y = $y + round($h/2);
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'B':{
+				$this->y = $this->img_rb_y;
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'N':{
+				$this->SetY($this->img_rb_y);
+				break;
+			}
+			default:{
+				break;
+			}
+		}
+		$this->endlinex = $this->img_rb_x;
+	}
+
+	/**
+	 * Returns an array containing current margins:
+	 * <ul>
+			<li>$ret['left'] = left margin</li>
+			<li>$ret['right'] = right margin</li>
+			<li>$ret['top'] = top margin</li>
+			<li>$ret['bottom'] = bottom margin</li>
+			<li>$ret['header'] = header margin</li>
+			<li>$ret['footer'] = footer margin</li>
+			<li>$ret['cell'] = cell padding array</li>
+			<li>$ret['padding_left'] = cell left padding</li>
+			<li>$ret['padding_top'] = cell top padding</li>
+			<li>$ret['padding_right'] = cell right padding</li>
+			<li>$ret['padding_bottom'] = cell bottom padding</li>
+	 * </ul>
+	 * @return array containing all margins measures
+	 * @public
+	 * @since 3.2.000 (2008-06-23)
+	 */
+	public function getMargins() {
+		$ret = array(
+			'left' => $this->lMargin,
+			'right' => $this->rMargin,
+			'top' => $this->tMargin,
+			'bottom' => $this->bMargin,
+			'header' => $this->header_margin,
+			'footer' => $this->footer_margin,
+			'cell' => $this->cell_padding,
+			'padding_left' => $this->cell_padding['L'],
+			'padding_top' => $this->cell_padding['T'],
+			'padding_right' => $this->cell_padding['R'],
+			'padding_bottom' => $this->cell_padding['B']
+		);
+		return $ret;
+	}
+
+	/**
+	 * Returns an array containing original margins:
+	 * <ul>
+			<li>$ret['left'] = left margin</li>
+			<li>$ret['right'] = right margin</li>
+	 * </ul>
+	 * @return array containing all margins measures
+	 * @public
+	 * @since 4.0.012 (2008-07-24)
+	 */
+	public function getOriginalMargins() {
+		$ret = array(
+			'left' => $this->original_lMargin,
+			'right' => $this->original_rMargin
+		);
+		return $ret;
+	}
+
+	/**
+	 * Returns the current font size.
+	 * @return current font size
+	 * @public
+	 * @since 3.2.000 (2008-06-23)
+	 */
+	public function getFontSize() {
+		return $this->FontSize;
+	}
+
+	/**
+	 * Returns the current font size in points unit.
+	 * @return current font size in points unit
+	 * @public
+	 * @since 3.2.000 (2008-06-23)
+	 */
+	public function getFontSizePt() {
+		return $this->FontSizePt;
+	}
+
+	/**
+	 * Returns the current font family name.
+	 * @return string current font family name
+	 * @public
+	 * @since 4.3.008 (2008-12-05)
+	 */
+	public function getFontFamily() {
+		return $this->FontFamily;
+	}
+
+	/**
+	 * Returns the current font style.
+	 * @return string current font style
+	 * @public
+	 * @since 4.3.008 (2008-12-05)
+	 */
+	public function getFontStyle() {
+		return $this->FontStyle;
+	}
+
+	/**
+	 * Cleanup HTML code (requires HTML Tidy library).
+	 * @param $html (string) htmlcode to fix
+	 * @param $default_css (string) CSS commands to add
+	 * @param $tagvs (array) parameters for setHtmlVSpace method
+	 * @param $tidy_options (array) options for tidy_parse_string function
+	 * @return string XHTML code cleaned up
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.9.017 (2010-11-16)
+	 * @see setHtmlVSpace()
+	 */
+	public function fixHTMLCode($html, $default_css='', $tagvs='', $tidy_options='') {
+		return TCPDF_STATIC::fixHTMLCode($html, $default_css, $tagvs, $tidy_options, $this->tagvspaces);
+	}
+
+	/**
+	 * Returns the border width from CSS property
+	 * @param $width (string) border width
+	 * @return int with in user units
+	 * @protected
+	 * @since 5.7.000 (2010-08-02)
+	 */
+	protected function getCSSBorderWidth($width) {
+		if ($width == 'thin') {
+			$width = (2 / $this->k);
+		} elseif ($width == 'medium') {
+			$width = (4 / $this->k);
+		} elseif ($width == 'thick') {
+			$width = (6 / $this->k);
+		} else {
+			$width = $this->getHTMLUnitToUnits($width, 1, 'px', false);
+		}
+		return $width;
+	}
+
+	/**
+	 * Returns the border dash style from CSS property
+	 * @param $style (string) border style to convert
+	 * @return int sash style (return -1 in case of none or hidden border)
+	 * @protected
+	 * @since 5.7.000 (2010-08-02)
+	 */
+	protected function getCSSBorderDashStyle($style) {
+		switch (strtolower($style)) {
+			case 'none':
+			case 'hidden': {
+				$dash = -1;
+				break;
+			}
+			case 'dotted': {
+				$dash = 1;
+				break;
+			}
+			case 'dashed': {
+				$dash = 3;
+				break;
+			}
+			case 'double':
+			case 'groove':
+			case 'ridge':
+			case 'inset':
+			case 'outset':
+			case 'solid':
+			default: {
+				$dash = 0;
+				break;
+			}
+		}
+		return $dash;
+	}
+
+	/**
+	 * Returns the border style array from CSS border properties
+	 * @param $cssborder (string) border properties
+	 * @return array containing border properties
+	 * @protected
+	 * @since 5.7.000 (2010-08-02)
+	 */
+	protected function getCSSBorderStyle($cssborder) {
+		$bprop = preg_split('/[\s]+/', trim($cssborder));
+		$border = array(); // value to be returned
+		switch (count($bprop)) {
+			case 3: {
+				$width = $bprop[0];
+				$style = $bprop[1];
+				$color = $bprop[2];
+				break;
+			}
+			case 2: {
+				$width = 'medium';
+				$style = $bprop[0];
+				$color = $bprop[1];
+				break;
+			}
+			case 1: {
+				$width = 'medium';
+				$style = $bprop[0];
+				$color = 'black';
+				break;
+			}
+			default: {
+				$width = 'medium';
+				$style = 'solid';
+				$color = 'black';
+				break;
+			}
+		}
+		if ($style == 'none') {
+			return array();
+		}
+		$border['cap'] = 'square';
+		$border['join'] = 'miter';
+		$border['dash'] = $this->getCSSBorderDashStyle($style);
+		if ($border['dash'] < 0) {
+			return array();
+		}
+		$border['width'] = $this->getCSSBorderWidth($width);
+		$border['color'] = TCPDF_COLORS::convertHTMLColorToDec($color, $this->spot_colors);
+		return $border;
+	}
+
+	/**
+	 * Get the internal Cell padding from CSS attribute.
+	 * @param $csspadding (string) padding properties
+	 * @param $width (float) width of the containing element
+	 * @return array of cell paddings
+	 * @public
+	 * @since 5.9.000 (2010-10-04)
+	 */
+	public function getCSSPadding($csspadding, $width=0) {
+		$padding = preg_split('/[\s]+/', trim($csspadding));
+		$cell_padding = array(); // value to be returned
+		switch (count($padding)) {
+			case 4: {
+				$cell_padding['T'] = $padding[0];
+				$cell_padding['R'] = $padding[1];
+				$cell_padding['B'] = $padding[2];
+				$cell_padding['L'] = $padding[3];
+				break;
+			}
+			case 3: {
+				$cell_padding['T'] = $padding[0];
+				$cell_padding['R'] = $padding[1];
+				$cell_padding['B'] = $padding[2];
+				$cell_padding['L'] = $padding[1];
+				break;
+			}
+			case 2: {
+				$cell_padding['T'] = $padding[0];
+				$cell_padding['R'] = $padding[1];
+				$cell_padding['B'] = $padding[0];
+				$cell_padding['L'] = $padding[1];
+				break;
+			}
+			case 1: {
+				$cell_padding['T'] = $padding[0];
+				$cell_padding['R'] = $padding[0];
+				$cell_padding['B'] = $padding[0];
+				$cell_padding['L'] = $padding[0];
+				break;
+			}
+			default: {
+				return $this->cell_padding;
+			}
+		}
+		if ($width == 0) {
+			$width = $this->w - $this->lMargin - $this->rMargin;
+		}
+		$cell_padding['T'] = $this->getHTMLUnitToUnits($cell_padding['T'], $width, 'px', false);
+		$cell_padding['R'] = $this->getHTMLUnitToUnits($cell_padding['R'], $width, 'px', false);
+		$cell_padding['B'] = $this->getHTMLUnitToUnits($cell_padding['B'], $width, 'px', false);
+		$cell_padding['L'] = $this->getHTMLUnitToUnits($cell_padding['L'], $width, 'px', false);
+		return $cell_padding;
+	}
+
+	/**
+	 * Get the internal Cell margin from CSS attribute.
+	 * @param $cssmargin (string) margin properties
+	 * @param $width (float) width of the containing element
+	 * @return array of cell margins
+	 * @public
+	 * @since 5.9.000 (2010-10-04)
+	 */
+	public function getCSSMargin($cssmargin, $width=0) {
+		$margin = preg_split('/[\s]+/', trim($cssmargin));
+		$cell_margin = array(); // value to be returned
+		switch (count($margin)) {
+			case 4: {
+				$cell_margin['T'] = $margin[0];
+				$cell_margin['R'] = $margin[1];
+				$cell_margin['B'] = $margin[2];
+				$cell_margin['L'] = $margin[3];
+				break;
+			}
+			case 3: {
+				$cell_margin['T'] = $margin[0];
+				$cell_margin['R'] = $margin[1];
+				$cell_margin['B'] = $margin[2];
+				$cell_margin['L'] = $margin[1];
+				break;
+			}
+			case 2: {
+				$cell_margin['T'] = $margin[0];
+				$cell_margin['R'] = $margin[1];
+				$cell_margin['B'] = $margin[0];
+				$cell_margin['L'] = $margin[1];
+				break;
+			}
+			case 1: {
+				$cell_margin['T'] = $margin[0];
+				$cell_margin['R'] = $margin[0];
+				$cell_margin['B'] = $margin[0];
+				$cell_margin['L'] = $margin[0];
+				break;
+			}
+			default: {
+				return $this->cell_margin;
+			}
+		}
+		if ($width == 0) {
+			$width = $this->w - $this->lMargin - $this->rMargin;
+		}
+		$cell_margin['T'] = $this->getHTMLUnitToUnits(str_replace('auto', '0', $cell_margin['T']), $width, 'px', false);
+		$cell_margin['R'] = $this->getHTMLUnitToUnits(str_replace('auto', '0', $cell_margin['R']), $width, 'px', false);
+		$cell_margin['B'] = $this->getHTMLUnitToUnits(str_replace('auto', '0', $cell_margin['B']), $width, 'px', false);
+		$cell_margin['L'] = $this->getHTMLUnitToUnits(str_replace('auto', '0', $cell_margin['L']), $width, 'px', false);
+		return $cell_margin;
+	}
+
+	/**
+	 * Get the border-spacing from CSS attribute.
+	 * @param $cssbspace (string) border-spacing CSS properties
+	 * @param $width (float) width of the containing element
+	 * @return array of border spacings
+	 * @public
+	 * @since 5.9.010 (2010-10-27)
+	 */
+	public function getCSSBorderMargin($cssbspace, $width=0) {
+		$space = preg_split('/[\s]+/', trim($cssbspace));
+		$border_spacing = array(); // value to be returned
+		switch (count($space)) {
+			case 2: {
+				$border_spacing['H'] = $space[0];
+				$border_spacing['V'] = $space[1];
+				break;
+			}
+			case 1: {
+				$border_spacing['H'] = $space[0];
+				$border_spacing['V'] = $space[0];
+				break;
+			}
+			default: {
+				return array('H' => 0, 'V' => 0);
+			}
+		}
+		if ($width == 0) {
+			$width = $this->w - $this->lMargin - $this->rMargin;
+		}
+		$border_spacing['H'] = $this->getHTMLUnitToUnits($border_spacing['H'], $width, 'px', false);
+		$border_spacing['V'] = $this->getHTMLUnitToUnits($border_spacing['V'], $width, 'px', false);
+		return $border_spacing;
+	}
+
+	/**
+	 * Returns the letter-spacing value from CSS value
+	 * @param $spacing (string) letter-spacing value
+	 * @param $parent (float) font spacing (tracking) value of the parent element
+	 * @return float quantity to increases or decreases the space between characters in a text.
+	 * @protected
+	 * @since 5.9.000 (2010-10-02)
+	 */
+	protected function getCSSFontSpacing($spacing, $parent=0) {
+		$val = 0; // value to be returned
+		$spacing = trim($spacing);
+		switch ($spacing) {
+			case 'normal': {
+				$val = 0;
+				break;
+			}
+			case 'inherit': {
+				if ($parent == 'normal') {
+					$val = 0;
+				} else {
+					$val = $parent;
+				}
+				break;
+			}
+			default: {
+				$val = $this->getHTMLUnitToUnits($spacing, 0, 'px', false);
+			}
+		}
+		return $val;
+	}
+
+	/**
+	 * Returns the percentage of font stretching from CSS value
+	 * @param $stretch (string) stretch mode
+	 * @param $parent (float) stretch value of the parent element
+	 * @return float font stretching percentage
+	 * @protected
+	 * @since 5.9.000 (2010-10-02)
+	 */
+	protected function getCSSFontStretching($stretch, $parent=100) {
+		$val = 100; // value to be returned
+		$stretch = trim($stretch);
+		switch ($stretch) {
+			case 'ultra-condensed': {
+				$val = 40;
+				break;
+			}
+			case 'extra-condensed': {
+				$val = 55;
+				break;
+			}
+			case 'condensed': {
+				$val = 70;
+				break;
+			}
+			case 'semi-condensed': {
+				$val = 85;
+				break;
+			}
+			case 'normal': {
+				$val = 100;
+				break;
+			}
+			case 'semi-expanded': {
+				$val = 115;
+				break;
+			}
+			case 'expanded': {
+				$val = 130;
+				break;
+			}
+			case 'extra-expanded': {
+				$val = 145;
+				break;
+			}
+			case 'ultra-expanded': {
+				$val = 160;
+				break;
+			}
+			case 'wider': {
+				$val = ($parent + 10);
+				break;
+			}
+			case 'narrower': {
+				$val = ($parent - 10);
+				break;
+			}
+			case 'inherit': {
+				if ($parent == 'normal') {
+					$val = 100;
+				} else {
+					$val = $parent;
+				}
+				break;
+			}
+			default: {
+				$val = $this->getHTMLUnitToUnits($stretch, 100, '%', false);
+			}
+		}
+		return $val;
+	}
+
+	/**
+	 * Convert HTML string containing font size value to points
+	 * @param $val (string) String containing font size value and unit.
+	 * @param $refsize (float) Reference font size in points.
+	 * @param $parent_size (float) Parent font size in points.
+	 * @param $defaultunit (string) Default unit (can be one of the following: %, em, ex, px, in, mm, pc, pt).
+	 * @return float value in points
+	 * @public
+	 */
+	public function getHTMLFontUnits($val, $refsize=12, $parent_size=12, $defaultunit='pt') {
+		$refsize = TCPDF_FONTS::getFontRefSize($refsize);
+		$parent_size = TCPDF_FONTS::getFontRefSize($parent_size, $refsize);
+		switch ($val) {
+			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 = ($parent_size - 3);
+				break;
+			}
+			case 'larger': {
+				$size = ($parent_size + 3);
+				break;
+			}
+			default: {
+				$size = $this->getHTMLUnitToUnits($val, $parent_size, $defaultunit, true);
+			}
+		}
+		return $size;
+	}
+
+	/**
+	 * Returns the HTML DOM array.
+	 * @param $html (string) html code
+	 * @return array
+	 * @protected
+	 * @since 3.2.000 (2008-06-20)
+	 */
+	protected function getHtmlDomArray($html) {
+		// array of CSS styles ( selector => properties).
+		$css = array();
+		// get CSS array defined at previous call
+		$matches = array();
+		if (preg_match_all('/<cssarray>([^\<]*)<\/cssarray>/isU', $html, $matches) > 0) {
+			if (isset($matches[1][0])) {
+				$css = array_merge($css, unserialize($this->unhtmlentities($matches[1][0])));
+			}
+			$html = preg_replace('/<cssarray>(.*?)<\/cssarray>/isU', '', $html);
+		}
+		// extract external CSS files
+		$matches = array();
+		if (preg_match_all('/<link([^\>]*)>/isU', $html, $matches) > 0) {
+			foreach ($matches[1] as $key => $link) {
+				$type = array();
+				if (preg_match('/type[\s]*=[\s]*"text\/css"/', $link, $type)) {
+					$type = array();
+					preg_match('/media[\s]*=[\s]*"([^"]*)"/', $link, $type);
+					// get 'all' and 'print' media, other media types are discarded
+					// (all, braille, embossed, handheld, print, projection, screen, speech, tty, tv)
+					if (empty($type) OR (isset($type[1]) AND (($type[1] == 'all') OR ($type[1] == 'print')))) {
+						$type = array();
+						if (preg_match('/href[\s]*=[\s]*"([^"]*)"/', $link, $type) > 0) {
+							// read CSS data file
+							$cssdata = TCPDF_STATIC::fileGetContents(trim($type[1]));
+							if (($cssdata !== FALSE) AND (strlen($cssdata) > 0)) {
+								$css = array_merge($css, TCPDF_STATIC::extractCSSproperties($cssdata));
+							}
+						}
+					}
+				}
+			}
+		}
+		// extract style tags
+		$matches = array();
+		if (preg_match_all('/<style([^\>]*)>([^\<]*)<\/style>/isU', $html, $matches) > 0) {
+			foreach ($matches[1] as $key => $media) {
+				$type = array();
+				preg_match('/media[\s]*=[\s]*"([^"]*)"/', $media, $type);
+				// get 'all' and 'print' media, other media types are discarded
+				// (all, braille, embossed, handheld, print, projection, screen, speech, tty, tv)
+				if (empty($type) OR (isset($type[1]) AND (($type[1] == 'all') OR ($type[1] == 'print')))) {
+					$cssdata = $matches[2][$key];
+					$css = array_merge($css, TCPDF_STATIC::extractCSSproperties($cssdata));
+				}
+			}
+		}
+		// create a special tag to contain the CSS array (used for table content)
+		$csstagarray = '<cssarray>'.htmlentities(serialize($css)).'</cssarray>';
+		// remove head and style blocks
+		$html = preg_replace('/<head([^\>]*)>(.*?)<\/head>/siU', '', $html);
+		$html = preg_replace('/<style([^\>]*)>([^\<]*)<\/style>/isU', '', $html);
+		// define block tags
+		$blocktags = array('blockquote','br','dd','dl','div','dt','h1','h2','h3','h4','h5','h6','hr','li','ol','p','pre','ul','tcpdf','table','tr','td');
+		// define self-closing tags
+		$selfclosingtags = array('area','base','basefont','br','hr','input','img','link','meta');
+		// remove all unsupported tags (the line below lists all supported tags)
+		$html = strip_tags($html, '<marker/><a><b><blockquote><body><br><br/><dd><del><div><dl><dt><em><font><form><h1><h2><h3><h4><h5><h6><hr><hr/><i><img><input><label><li><ol><option><p><pre><s><select><small><span><strike><strong><sub><sup><table><tablehead><tcpdf><td><textarea><th><thead><tr><tt><u><ul>');
+		//replace some blank characters
+		$html = preg_replace('/<pre/', '<xre', $html); // preserve pre tag
+		$html = preg_replace('/<(table|tr|td|th|tcpdf|blockquote|dd|div|dl|dt|form|h1|h2|h3|h4|h5|h6|br|hr|li|ol|ul|p)([^\>]*)>[\n\r\t]+/', '<\\1\\2>', $html);
+		$html = preg_replace('@(\r\n|\r)@', "\n", $html);
+		$repTable = array("\t" => ' ', "\0" => ' ', "\x0B" => ' ', "\\" => "\\\\");
+		$html = strtr($html, $repTable);
+		$offset = 0;
+		while (($offset < strlen($html)) AND ($pos = strpos($html, '</pre>', $offset)) !== false) {
+			$html_a = substr($html, 0, $offset);
+			$html_b = substr($html, $offset, ($pos - $offset + 6));
+			while (preg_match("'<xre([^\>]*)>(.*?)\n(.*?)</pre>'si", $html_b)) {
+				// preserve newlines on <pre> tag
+				$html_b = preg_replace("'<xre([^\>]*)>(.*?)\n(.*?)</pre>'si", "<xre\\1>\\2<br />\\3</pre>", $html_b);
+			}
+			while (preg_match("'<xre([^\>]*)>(.*?)".$this->re_space['p']."(.*?)</pre>'".$this->re_space['m'], $html_b)) {
+				// preserve spaces on <pre> tag
+				$html_b = preg_replace("'<xre([^\>]*)>(.*?)".$this->re_space['p']."(.*?)</pre>'".$this->re_space['m'], "<xre\\1>\\2&nbsp;\\3</pre>", $html_b);
+			}
+			$html = $html_a.$html_b.substr($html, $pos + 6);
+			$offset = strlen($html_a.$html_b);
+		}
+		$offset = 0;
+		while (($offset < strlen($html)) AND ($pos = strpos($html, '</textarea>', $offset)) !== false) {
+			$html_a = substr($html, 0, $offset);
+			$html_b = substr($html, $offset, ($pos - $offset + 11));
+			while (preg_match("'<textarea([^\>]*)>(.*?)\n(.*?)</textarea>'si", $html_b)) {
+				// preserve newlines on <textarea> tag
+				$html_b = preg_replace("'<textarea([^\>]*)>(.*?)\n(.*?)</textarea>'si", "<textarea\\1>\\2<TBR>\\3</textarea>", $html_b);
+				$html_b = preg_replace("'<textarea([^\>]*)>(.*?)[\"](.*?)</textarea>'si", "<textarea\\1>\\2''\\3</textarea>", $html_b);
+			}
+			$html = $html_a.$html_b.substr($html, $pos + 11);
+			$offset = strlen($html_a.$html_b);
+		}
+		$html = preg_replace('/([\s]*)<option/si', '<option', $html);
+		$html = preg_replace('/<\/option>([\s]*)/si', '</option>', $html);
+		$offset = 0;
+		while (($offset < strlen($html)) AND ($pos = strpos($html, '</option>', $offset)) !== false) {
+			$html_a = substr($html, 0, $offset);
+			$html_b = substr($html, $offset, ($pos - $offset + 9));
+			while (preg_match("'<option([^\>]*)>(.*?)</option>'si", $html_b)) {
+				$html_b = preg_replace("'<option([\s]+)value=\"([^\"]*)\"([^\>]*)>(.*?)</option>'si", "\\2#!TaB!#\\4#!NwL!#", $html_b);
+				$html_b = preg_replace("'<option([^\>]*)>(.*?)</option>'si", "\\2#!NwL!#", $html_b);
+			}
+			$html = $html_a.$html_b.substr($html, $pos + 9);
+			$offset = strlen($html_a.$html_b);
+		}
+		if (preg_match("'</select'si", $html)) {
+			$html = preg_replace("'<select([^\>]*)>'si", "<select\\1 opt=\"", $html);
+			$html = preg_replace("'#!NwL!#</select>'si", "\" />", $html);
+		}
+		$html = str_replace("\n", ' ', $html);
+		// restore textarea newlines
+		$html = str_replace('<TBR>', "\n", $html);
+		// remove extra spaces from code
+		$html = preg_replace('/[\s]+<\/(table|tr|ul|ol|dl)>/', '</\\1>', $html);
+		$html = preg_replace('/'.$this->re_space['p'].'+<\/(td|th|li|dt|dd)>/'.$this->re_space['m'], '</\\1>', $html);
+		$html = preg_replace('/[\s]+<(tr|td|th|li|dt|dd)/', '<\\1', $html);
+		$html = preg_replace('/'.$this->re_space['p'].'+<(ul|ol|dl|br)/'.$this->re_space['m'], '<\\1', $html);
+		$html = preg_replace('/<\/(table|tr|td|th|blockquote|dd|dt|dl|div|dt|h1|h2|h3|h4|h5|h6|hr|li|ol|ul|p)>[\s]+</', '</\\1><', $html);
+		$html = preg_replace('/<\/(td|th)>/', '<marker style="font-size:0"/></\\1>', $html);
+		$html = preg_replace('/<\/table>([\s]*)<marker style="font-size:0"\/>/', '</table>', $html);
+		$html = preg_replace('/'.$this->re_space['p'].'+<img/'.$this->re_space['m'], chr(32).'<img', $html);
+		$html = preg_replace('/<img([^\>]*)>[\s]+([^\<])/xi', '<img\\1>&nbsp;\\2', $html);
+		$html = preg_replace('/<img([^\>]*)>/xi', '<img\\1><span><marker style="font-size:0"/></span>', $html);
+		$html = preg_replace('/<xre/', '<pre', $html); // restore pre tag
+		$html = preg_replace('/<textarea([^\>]*)>([^\<]*)<\/textarea>/xi', '<textarea\\1 value="\\2" />', $html);
+		$html = preg_replace('/<li([^\>]*)><\/li>/', '<li\\1>&nbsp;</li>', $html);
+		$html = preg_replace('/<li([^\>]*)>'.$this->re_space['p'].'*<img/'.$this->re_space['m'], '<li\\1><font size="1">&nbsp;</font><img', $html);
+		$html = preg_replace('/<([^\>\/]*)>[\s]/', '<\\1>&nbsp;', $html); // preserve some spaces
+		$html = preg_replace('/[\s]<\/([^\>]*)>/', '&nbsp;</\\1>', $html); // preserve some spaces
+		$html = preg_replace('/<su([bp])/', '<zws/><su\\1', $html); // fix sub/sup alignment
+		$html = preg_replace('/<\/su([bp])>/', '</su\\1><zws/>', $html); // fix sub/sup alignment
+		$html = preg_replace('/'.$this->re_space['p'].'+/'.$this->re_space['m'], chr(32), $html); // replace multiple spaces with a single space
+		// trim string
+		$html = $this->stringTrim($html);
+		// fix br tag after li
+		$html = preg_replace('/<li><br([^\>]*)>/', '<li> <br\\1>', $html);
+		// fix first image tag alignment
+		$html = preg_replace('/^<img/', '<span style="font-size:0"><br /></span> <img', $html, 1);
+		// pattern for generic tag
+		$tagpattern = '/(<[^>]+>)/';
+		// explodes the string
+		$a = preg_split($tagpattern, $html, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
+		// count elements
+		$maxel = count($a);
+		$elkey = 0;
+		$key = 0;
+		// create an array of elements
+		$dom = array();
+		$dom[$key] = array();
+		// set inheritable properties fot the first void element
+		// possible inheritable properties are: azimuth, border-collapse, border-spacing, caption-side, color, cursor, direction, empty-cells, font, font-family, font-stretch, font-size, font-size-adjust, font-style, font-variant, font-weight, letter-spacing, line-height, list-style, list-style-image, list-style-position, list-style-type, orphans, page, page-break-inside, quotes, speak, speak-header, text-align, text-indent, text-transform, volume, white-space, widows, word-spacing
+		$dom[$key]['tag'] = false;
+		$dom[$key]['block'] = false;
+		$dom[$key]['value'] = '';
+		$dom[$key]['parent'] = 0;
+		$dom[$key]['hide'] = false;
+		$dom[$key]['fontname'] = $this->FontFamily;
+		$dom[$key]['fontstyle'] = $this->FontStyle;
+		$dom[$key]['fontsize'] = $this->FontSizePt;
+		$dom[$key]['font-stretch'] = $this->font_stretching;
+		$dom[$key]['letter-spacing'] = $this->font_spacing;
+		$dom[$key]['stroke'] = $this->textstrokewidth;
+		$dom[$key]['fill'] = (($this->textrendermode % 2) == 0);
+		$dom[$key]['clip'] = ($this->textrendermode > 3);
+		$dom[$key]['line-height'] = $this->cell_height_ratio;
+		$dom[$key]['bgcolor'] = false;
+		$dom[$key]['fgcolor'] = $this->fgcolor; // color
+		$dom[$key]['strokecolor'] = $this->strokecolor;
+		$dom[$key]['align'] = '';
+		$dom[$key]['listtype'] = '';
+		$dom[$key]['text-indent'] = 0;
+		$dom[$key]['border'] = array();
+		$dom[$key]['dir'] = $this->rtl?'rtl':'ltr';
+		$thead = false; // true when we are inside the THEAD tag
+		++$key;
+		$level = array();
+		array_push($level, 0); // root
+		while ($elkey < $maxel) {
+			$dom[$key] = array();
+			$element = $a[$elkey];
+			$dom[$key]['elkey'] = $elkey;
+			if (preg_match($tagpattern, $element)) {
+				// html tag
+				$element = substr($element, 1, -1);
+				// get tag name
+				preg_match('/[\/]?([a-zA-Z0-9]*)/', $element, $tag);
+				$tagname = strtolower($tag[1]);
+				// check if we are inside a table header
+				if ($tagname == 'thead') {
+					if ($element{0} == '/') {
+						$thead = false;
+					} else {
+						$thead = true;
+					}
+					++$elkey;
+					continue;
+				}
+				$dom[$key]['tag'] = true;
+				$dom[$key]['value'] = $tagname;
+				if (in_array($dom[$key]['value'], $blocktags)) {
+					$dom[$key]['block'] = true;
+				} else {
+					$dom[$key]['block'] = false;
+				}
+				if ($element{0} == '/') {
+					// *** closing html tag
+					$dom[$key]['opening'] = false;
+					$dom[$key]['parent'] = end($level);
+					array_pop($level);
+					$dom[$key]['hide'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['hide'];
+					$dom[$key]['fontname'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontname'];
+					$dom[$key]['fontstyle'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontstyle'];
+					$dom[$key]['fontsize'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontsize'];
+					$dom[$key]['font-stretch'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['font-stretch'];
+					$dom[$key]['letter-spacing'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['letter-spacing'];
+					$dom[$key]['stroke'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['stroke'];
+					$dom[$key]['fill'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fill'];
+					$dom[$key]['clip'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['clip'];
+					$dom[$key]['line-height'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['line-height'];
+					$dom[$key]['bgcolor'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['bgcolor'];
+					$dom[$key]['fgcolor'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fgcolor'];
+					$dom[$key]['strokecolor'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['strokecolor'];
+					$dom[$key]['align'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['align'];
+					$dom[$key]['dir'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['dir'];
+					if (isset($dom[($dom[($dom[$key]['parent'])]['parent'])]['listtype'])) {
+						$dom[$key]['listtype'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['listtype'];
+					}
+					// set the number of columns in table tag
+					if (($dom[$key]['value'] == 'tr') AND (!isset($dom[($dom[($dom[$key]['parent'])]['parent'])]['cols']))) {
+						$dom[($dom[($dom[$key]['parent'])]['parent'])]['cols'] = $dom[($dom[$key]['parent'])]['cols'];
+					}
+					if (($dom[$key]['value'] == 'td') OR ($dom[$key]['value'] == 'th')) {
+						$dom[($dom[$key]['parent'])]['content'] = $csstagarray;
+						for ($i = ($dom[$key]['parent'] + 1); $i < $key; ++$i) {
+							$dom[($dom[$key]['parent'])]['content'] .= $a[$dom[$i]['elkey']];
+						}
+						$key = $i;
+						// mark nested tables
+						$dom[($dom[$key]['parent'])]['content'] = str_replace('<table', '<table nested="true"', $dom[($dom[$key]['parent'])]['content']);
+						// remove thead sections from nested tables
+						$dom[($dom[$key]['parent'])]['content'] = str_replace('<thead>', '', $dom[($dom[$key]['parent'])]['content']);
+						$dom[($dom[$key]['parent'])]['content'] = str_replace('</thead>', '', $dom[($dom[$key]['parent'])]['content']);
+					}
+					// store header rows on a new table
+					if (($dom[$key]['value'] == 'tr') AND ($dom[($dom[$key]['parent'])]['thead'] === true)) {
+						if (TCPDF_STATIC::empty_string($dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'])) {
+							$dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'] = $csstagarray.$a[$dom[($dom[($dom[$key]['parent'])]['parent'])]['elkey']];
+						}
+						for ($i = $dom[$key]['parent']; $i <= $key; ++$i) {
+							$dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'] .= $a[$dom[$i]['elkey']];
+						}
+						if (!isset($dom[($dom[$key]['parent'])]['attribute'])) {
+							$dom[($dom[$key]['parent'])]['attribute'] = array();
+						}
+						// header elements must be always contained in a single page
+						$dom[($dom[$key]['parent'])]['attribute']['nobr'] = 'true';
+					}
+					if (($dom[$key]['value'] == 'table') AND (!TCPDF_STATIC::empty_string($dom[($dom[$key]['parent'])]['thead']))) {
+						// remove the nobr attributes from the table header
+						$dom[($dom[$key]['parent'])]['thead'] = str_replace(' nobr="true"', '', $dom[($dom[$key]['parent'])]['thead']);
+						$dom[($dom[$key]['parent'])]['thead'] .= '</tablehead>';
+					}
+				} else {
+					// *** opening or self-closing html tag
+					$dom[$key]['opening'] = true;
+					$dom[$key]['parent'] = end($level);
+					if ((substr($element, -1, 1) == '/') OR (in_array($dom[$key]['value'], $selfclosingtags))) {
+						// self-closing tag
+						$dom[$key]['self'] = true;
+					} else {
+						// opening tag
+						array_push($level, $key);
+						$dom[$key]['self'] = false;
+					}
+					// copy some values from parent
+					$parentkey = 0;
+					if ($key > 0) {
+						$parentkey = $dom[$key]['parent'];
+						$dom[$key]['hide'] = $dom[$parentkey]['hide'];
+						$dom[$key]['fontname'] = $dom[$parentkey]['fontname'];
+						$dom[$key]['fontstyle'] = $dom[$parentkey]['fontstyle'];
+						$dom[$key]['fontsize'] = $dom[$parentkey]['fontsize'];
+						$dom[$key]['font-stretch'] = $dom[$parentkey]['font-stretch'];
+						$dom[$key]['letter-spacing'] = $dom[$parentkey]['letter-spacing'];
+						$dom[$key]['stroke'] = $dom[$parentkey]['stroke'];
+						$dom[$key]['fill'] = $dom[$parentkey]['fill'];
+						$dom[$key]['clip'] = $dom[$parentkey]['clip'];
+						$dom[$key]['line-height'] = $dom[$parentkey]['line-height'];
+						$dom[$key]['bgcolor'] = $dom[$parentkey]['bgcolor'];
+						$dom[$key]['fgcolor'] = $dom[$parentkey]['fgcolor'];
+						$dom[$key]['strokecolor'] = $dom[$parentkey]['strokecolor'];
+						$dom[$key]['align'] = $dom[$parentkey]['align'];
+						$dom[$key]['listtype'] = $dom[$parentkey]['listtype'];
+						$dom[$key]['text-indent'] = $dom[$parentkey]['text-indent'];
+						$dom[$key]['border'] = array();
+						$dom[$key]['dir'] = $dom[$parentkey]['dir'];
+					}
+					// get attributes
+					preg_match_all('/([^=\s]*)[\s]*=[\s]*"([^"]*)"/', $element, $attr_array, PREG_PATTERN_ORDER);
+					$dom[$key]['attribute'] = array(); // reset attribute array
+					while (list($id, $name) = each($attr_array[1])) {
+						$dom[$key]['attribute'][strtolower($name)] = $attr_array[2][$id];
+					}
+					if (!empty($css)) {
+						// merge CSS style to current style
+						list($dom[$key]['csssel'], $dom[$key]['cssdata']) = TCPDF_STATIC::getCSSdataArray($dom, $key, $css);
+						$dom[$key]['attribute']['style'] = TCPDF_STATIC::getTagStyleFromCSSarray($dom[$key]['cssdata']);
+					}
+					// split style attributes
+					if (isset($dom[$key]['attribute']['style']) AND !empty($dom[$key]['attribute']['style'])) {
+						// get style attributes
+						preg_match_all('/([^;:\s]*):([^;]*)/', $dom[$key]['attribute']['style'], $style_array, PREG_PATTERN_ORDER);
+						$dom[$key]['style'] = array(); // reset style attribute array
+						while (list($id, $name) = each($style_array[1])) {
+							// in case of duplicate attribute the last replace the previous
+							$dom[$key]['style'][strtolower($name)] = trim($style_array[2][$id]);
+						}
+						// --- get some style attributes ---
+						// text direction
+						if (isset($dom[$key]['style']['direction'])) {
+							$dom[$key]['dir'] = $dom[$key]['style']['direction'];
+						}
+						// display
+						if (isset($dom[$key]['style']['display'])) {
+							$dom[$key]['hide'] = (trim(strtolower($dom[$key]['style']['display'])) == 'none');
+						}
+						// font family
+						if (isset($dom[$key]['style']['font-family'])) {
+							$dom[$key]['fontname'] = $this->getFontFamilyName($dom[$key]['style']['font-family']);
+						}
+						// list-style-type
+						if (isset($dom[$key]['style']['list-style-type'])) {
+							$dom[$key]['listtype'] = trim(strtolower($dom[$key]['style']['list-style-type']));
+							if ($dom[$key]['listtype'] == 'inherit') {
+								$dom[$key]['listtype'] = $dom[$parentkey]['listtype'];
+							}
+						}
+						// text-indent
+						if (isset($dom[$key]['style']['text-indent'])) {
+							$dom[$key]['text-indent'] = $this->getHTMLUnitToUnits($dom[$key]['style']['text-indent']);
+							if ($dom[$key]['text-indent'] == 'inherit') {
+								$dom[$key]['text-indent'] = $dom[$parentkey]['text-indent'];
+							}
+						}
+						// font size
+						if (isset($dom[$key]['style']['font-size'])) {
+							$fsize = trim($dom[$key]['style']['font-size']);
+							$dom[$key]['fontsize'] = $this->getHTMLFontUnits($fsize, $dom[0]['fontsize'], $dom[$parentkey]['fontsize'], 'pt');
+						}
+						// font-stretch
+						if (isset($dom[$key]['style']['font-stretch'])) {
+							$dom[$key]['font-stretch'] = $this->getCSSFontStretching($dom[$key]['style']['font-stretch'], $dom[$parentkey]['font-stretch']);
+						}
+						// letter-spacing
+						if (isset($dom[$key]['style']['letter-spacing'])) {
+							$dom[$key]['letter-spacing'] = $this->getCSSFontSpacing($dom[$key]['style']['letter-spacing'], $dom[$parentkey]['letter-spacing']);
+						}
+						// line-height
+						if (isset($dom[$key]['style']['line-height'])) {
+							$lineheight = trim($dom[$key]['style']['line-height']);
+							switch ($lineheight) {
+								// A normal line height. This is default
+								case 'normal': {
+									$dom[$key]['line-height'] = $dom[0]['line-height'];
+									break;
+								}
+								default: {
+									if (is_numeric($lineheight)) {
+										$lineheight = $lineheight * 100;
+									}
+									$dom[$key]['line-height'] = $this->getHTMLUnitToUnits($lineheight, 1, '%', true);
+								}
+							}
+						}
+						// font style
+						if (isset($dom[$key]['style']['font-weight'])) {
+							if (strtolower($dom[$key]['style']['font-weight']{0}) == 'n') {
+								if (strpos($dom[$key]['fontstyle'], 'B') !== false) {
+									$dom[$key]['fontstyle'] = str_replace('B', '', $dom[$key]['fontstyle']);
+								}
+							} elseif (strtolower($dom[$key]['style']['font-weight']{0}) == 'b') {
+								$dom[$key]['fontstyle'] .= 'B';
+							}
+						}
+						if (isset($dom[$key]['style']['font-style']) AND (strtolower($dom[$key]['style']['font-style']{0}) == 'i')) {
+							$dom[$key]['fontstyle'] .= 'I';
+						}
+						// font color
+						if (isset($dom[$key]['style']['color']) AND (!TCPDF_STATIC::empty_string($dom[$key]['style']['color']))) {
+							$dom[$key]['fgcolor'] = TCPDF_COLORS::convertHTMLColorToDec($dom[$key]['style']['color'], $this->spot_colors);
+						} elseif ($dom[$key]['value'] == 'a') {
+							$dom[$key]['fgcolor'] = $this->htmlLinkColorArray;
+						}
+						// background color
+						if (isset($dom[$key]['style']['background-color']) AND (!TCPDF_STATIC::empty_string($dom[$key]['style']['background-color']))) {
+							$dom[$key]['bgcolor'] = TCPDF_COLORS::convertHTMLColorToDec($dom[$key]['style']['background-color'], $this->spot_colors);
+						}
+						// text-decoration
+						if (isset($dom[$key]['style']['text-decoration'])) {
+							$decors = explode(' ', strtolower($dom[$key]['style']['text-decoration']));
+							foreach ($decors as $dec) {
+								$dec = trim($dec);
+								if (!TCPDF_STATIC::empty_string($dec)) {
+									if ($dec{0} == 'u') {
+										// underline
+										$dom[$key]['fontstyle'] .= 'U';
+									} elseif ($dec{0} == 'l') {
+										// line-through
+										$dom[$key]['fontstyle'] .= 'D';
+									} elseif ($dec{0} == 'o') {
+										// overline
+										$dom[$key]['fontstyle'] .= 'O';
+									}
+								}
+							}
+						} elseif ($dom[$key]['value'] == 'a') {
+							$dom[$key]['fontstyle'] = $this->htmlLinkFontStyle;
+						}
+						// check for width attribute
+						if (isset($dom[$key]['style']['width'])) {
+							$dom[$key]['width'] = $dom[$key]['style']['width'];
+						}
+						// check for height attribute
+						if (isset($dom[$key]['style']['height'])) {
+							$dom[$key]['height'] = $dom[$key]['style']['height'];
+						}
+						// check for text alignment
+						if (isset($dom[$key]['style']['text-align'])) {
+							$dom[$key]['align'] = strtoupper($dom[$key]['style']['text-align']{0});
+						}
+						// check for CSS border properties
+						if (isset($dom[$key]['style']['border'])) {
+							$borderstyle = $this->getCSSBorderStyle($dom[$key]['style']['border']);
+							if (!empty($borderstyle)) {
+								$dom[$key]['border']['LTRB'] = $borderstyle;
+							}
+						}
+						if (isset($dom[$key]['style']['border-color'])) {
+							$brd_colors = preg_split('/[\s]+/', trim($dom[$key]['style']['border-color']));
+							if (isset($brd_colors[3])) {
+								$dom[$key]['border']['L']['color'] = TCPDF_COLORS::convertHTMLColorToDec($brd_colors[3], $this->spot_colors);
+							}
+							if (isset($brd_colors[1])) {
+								$dom[$key]['border']['R']['color'] = TCPDF_COLORS::convertHTMLColorToDec($brd_colors[1], $this->spot_colors);
+							}
+							if (isset($brd_colors[0])) {
+								$dom[$key]['border']['T']['color'] = TCPDF_COLORS::convertHTMLColorToDec($brd_colors[0], $this->spot_colors);
+							}
+							if (isset($brd_colors[2])) {
+								$dom[$key]['border']['B']['color'] = TCPDF_COLORS::convertHTMLColorToDec($brd_colors[2], $this->spot_colors);
+							}
+						}
+						if (isset($dom[$key]['style']['border-width'])) {
+							$brd_widths = preg_split('/[\s]+/', trim($dom[$key]['style']['border-width']));
+							if (isset($brd_widths[3])) {
+								$dom[$key]['border']['L']['width'] = $this->getCSSBorderWidth($brd_widths[3]);
+							}
+							if (isset($brd_widths[1])) {
+								$dom[$key]['border']['R']['width'] = $this->getCSSBorderWidth($brd_widths[1]);
+							}
+							if (isset($brd_widths[0])) {
+								$dom[$key]['border']['T']['width'] = $this->getCSSBorderWidth($brd_widths[0]);
+							}
+							if (isset($brd_widths[2])) {
+								$dom[$key]['border']['B']['width'] = $this->getCSSBorderWidth($brd_widths[2]);
+							}
+						}
+						if (isset($dom[$key]['style']['border-style'])) {
+							$brd_styles = preg_split('/[\s]+/', trim($dom[$key]['style']['border-style']));
+							if (isset($brd_styles[3]) AND ($brd_styles[3]!='none')) {
+								$dom[$key]['border']['L']['cap'] = 'square';
+								$dom[$key]['border']['L']['join'] = 'miter';
+								$dom[$key]['border']['L']['dash'] = $this->getCSSBorderDashStyle($brd_styles[3]);
+								if ($dom[$key]['border']['L']['dash'] < 0) {
+									$dom[$key]['border']['L'] = array();
+								}
+							}
+							if (isset($brd_styles[1])) {
+								$dom[$key]['border']['R']['cap'] = 'square';
+								$dom[$key]['border']['R']['join'] = 'miter';
+								$dom[$key]['border']['R']['dash'] = $this->getCSSBorderDashStyle($brd_styles[1]);
+								if ($dom[$key]['border']['R']['dash'] < 0) {
+									$dom[$key]['border']['R'] = array();
+								}
+							}
+							if (isset($brd_styles[0])) {
+								$dom[$key]['border']['T']['cap'] = 'square';
+								$dom[$key]['border']['T']['join'] = 'miter';
+								$dom[$key]['border']['T']['dash'] = $this->getCSSBorderDashStyle($brd_styles[0]);
+								if ($dom[$key]['border']['T']['dash'] < 0) {
+									$dom[$key]['border']['T'] = array();
+								}
+							}
+							if (isset($brd_styles[2])) {
+								$dom[$key]['border']['B']['cap'] = 'square';
+								$dom[$key]['border']['B']['join'] = 'miter';
+								$dom[$key]['border']['B']['dash'] = $this->getCSSBorderDashStyle($brd_styles[2]);
+								if ($dom[$key]['border']['B']['dash'] < 0) {
+									$dom[$key]['border']['B'] = array();
+								}
+							}
+						}
+						$cellside = array('L' => 'left', 'R' => 'right', 'T' => 'top', 'B' => 'bottom');
+						foreach ($cellside as $bsk => $bsv) {
+							if (isset($dom[$key]['style']['border-'.$bsv])) {
+								$borderstyle = $this->getCSSBorderStyle($dom[$key]['style']['border-'.$bsv]);
+								if (!empty($borderstyle)) {
+									$dom[$key]['border'][$bsk] = $borderstyle;
+								}
+							}
+							if (isset($dom[$key]['style']['border-'.$bsv.'-color'])) {
+								$dom[$key]['border'][$bsk]['color'] = TCPDF_COLORS::convertHTMLColorToDec($dom[$key]['style']['border-'.$bsv.'-color'], $this->spot_colors);
+							}
+							if (isset($dom[$key]['style']['border-'.$bsv.'-width'])) {
+								$dom[$key]['border'][$bsk]['width'] = $this->getCSSBorderWidth($dom[$key]['style']['border-'.$bsv.'-width']);
+							}
+							if (isset($dom[$key]['style']['border-'.$bsv.'-style'])) {
+								$dom[$key]['border'][$bsk]['dash'] = $this->getCSSBorderDashStyle($dom[$key]['style']['border-'.$bsv.'-style']);
+								if ($dom[$key]['border'][$bsk]['dash'] < 0) {
+									$dom[$key]['border'][$bsk] = array();
+								}
+							}
+						}
+						// check for CSS padding properties
+						if (isset($dom[$key]['style']['padding'])) {
+							$dom[$key]['padding'] = $this->getCSSPadding($dom[$key]['style']['padding']);
+						} else {
+							$dom[$key]['padding'] = $this->cell_padding;
+						}
+						foreach ($cellside as $psk => $psv) {
+							if (isset($dom[$key]['style']['padding-'.$psv])) {
+								$dom[$key]['padding'][$psk] = $this->getHTMLUnitToUnits($dom[$key]['style']['padding-'.$psv], 0, 'px', false);
+							}
+						}
+						// check for CSS margin properties
+						if (isset($dom[$key]['style']['margin'])) {
+							$dom[$key]['margin'] = $this->getCSSMargin($dom[$key]['style']['margin']);
+						} else {
+							$dom[$key]['margin'] = $this->cell_margin;
+						}
+						foreach ($cellside as $psk => $psv) {
+							if (isset($dom[$key]['style']['margin-'.$psv])) {
+								$dom[$key]['margin'][$psk] = $this->getHTMLUnitToUnits(str_replace('auto', '0', $dom[$key]['style']['margin-'.$psv]), 0, 'px', false);
+							}
+						}
+						// check for CSS border-spacing properties
+						if (isset($dom[$key]['style']['border-spacing'])) {
+							$dom[$key]['border-spacing'] = $this->getCSSBorderMargin($dom[$key]['style']['border-spacing']);
+						}
+						// page-break-inside
+						if (isset($dom[$key]['style']['page-break-inside']) AND ($dom[$key]['style']['page-break-inside'] == 'avoid')) {
+							$dom[$key]['attribute']['nobr'] = 'true';
+						}
+						// page-break-before
+						if (isset($dom[$key]['style']['page-break-before'])) {
+							if ($dom[$key]['style']['page-break-before'] == 'always') {
+								$dom[$key]['attribute']['pagebreak'] = 'true';
+							} elseif ($dom[$key]['style']['page-break-before'] == 'left') {
+								$dom[$key]['attribute']['pagebreak'] = 'left';
+							} elseif ($dom[$key]['style']['page-break-before'] == 'right') {
+								$dom[$key]['attribute']['pagebreak'] = 'right';
+							}
+						}
+						// page-break-after
+						if (isset($dom[$key]['style']['page-break-after'])) {
+							if ($dom[$key]['style']['page-break-after'] == 'always') {
+								$dom[$key]['attribute']['pagebreakafter'] = 'true';
+							} elseif ($dom[$key]['style']['page-break-after'] == 'left') {
+								$dom[$key]['attribute']['pagebreakafter'] = 'left';
+							} elseif ($dom[$key]['style']['page-break-after'] == 'right') {
+								$dom[$key]['attribute']['pagebreakafter'] = 'right';
+							}
+						}
+					}
+					if (isset($dom[$key]['attribute']['display'])) {
+						$dom[$key]['hide'] = (trim(strtolower($dom[$key]['attribute']['display'])) == 'none');
+					}
+					if (isset($dom[$key]['attribute']['border']) AND ($dom[$key]['attribute']['border'] != 0)) {
+						$borderstyle = $this->getCSSBorderStyle($dom[$key]['attribute']['border'].' solid black');
+						if (!empty($borderstyle)) {
+							$dom[$key]['border']['LTRB'] = $borderstyle;
+						}
+					}
+					// check for font tag
+					if ($dom[$key]['value'] == 'font') {
+						// font family
+						if (isset($dom[$key]['attribute']['face'])) {
+							$dom[$key]['fontname'] = $this->getFontFamilyName($dom[$key]['attribute']['face']);
+						}
+						// font size
+						if (isset($dom[$key]['attribute']['size'])) {
+							if ($key > 0) {
+								if ($dom[$key]['attribute']['size']{0} == '+') {
+									$dom[$key]['fontsize'] = $dom[($dom[$key]['parent'])]['fontsize'] + intval(substr($dom[$key]['attribute']['size'], 1));
+								} elseif ($dom[$key]['attribute']['size']{0} == '-') {
+									$dom[$key]['fontsize'] = $dom[($dom[$key]['parent'])]['fontsize'] - intval(substr($dom[$key]['attribute']['size'], 1));
+								} else {
+									$dom[$key]['fontsize'] = intval($dom[$key]['attribute']['size']);
+								}
+							} else {
+								$dom[$key]['fontsize'] = intval($dom[$key]['attribute']['size']);
+							}
+						}
+					}
+					// force natural alignment for lists
+					if ((($dom[$key]['value'] == 'ul') OR ($dom[$key]['value'] == 'ol') OR ($dom[$key]['value'] == 'dl'))
+						AND (!isset($dom[$key]['align']) OR TCPDF_STATIC::empty_string($dom[$key]['align']) OR ($dom[$key]['align'] != 'J'))) {
+						if ($this->rtl) {
+							$dom[$key]['align'] = 'R';
+						} else {
+							$dom[$key]['align'] = 'L';
+						}
+					}
+					if (($dom[$key]['value'] == 'small') OR ($dom[$key]['value'] == 'sup') OR ($dom[$key]['value'] == 'sub')) {
+						if (!isset($dom[$key]['attribute']['size']) AND !isset($dom[$key]['style']['font-size'])) {
+							$dom[$key]['fontsize'] = $dom[$key]['fontsize'] * K_SMALL_RATIO;
+						}
+					}
+					if (($dom[$key]['value'] == 'strong') OR ($dom[$key]['value'] == 'b')) {
+						$dom[$key]['fontstyle'] .= 'B';
+					}
+					if (($dom[$key]['value'] == 'em') OR ($dom[$key]['value'] == 'i')) {
+						$dom[$key]['fontstyle'] .= 'I';
+					}
+					if ($dom[$key]['value'] == 'u') {
+						$dom[$key]['fontstyle'] .= 'U';
+					}
+					if (($dom[$key]['value'] == 'del') OR ($dom[$key]['value'] == 's') OR ($dom[$key]['value'] == 'strike')) {
+						$dom[$key]['fontstyle'] .= 'D';
+					}
+					if (!isset($dom[$key]['style']['text-decoration']) AND ($dom[$key]['value'] == 'a')) {
+						$dom[$key]['fontstyle'] = $this->htmlLinkFontStyle;
+					}
+					if (($dom[$key]['value'] == 'pre') OR ($dom[$key]['value'] == 'tt')) {
+						$dom[$key]['fontname'] = $this->default_monospaced_font;
+					}
+					if (($dom[$key]['value']{0} == 'h') AND (intval($dom[$key]['value']{1}) > 0) AND (intval($dom[$key]['value']{1}) < 7)) {
+						// headings h1, h2, h3, h4, h5, h6
+						if (!isset($dom[$key]['attribute']['size']) AND !isset($dom[$key]['style']['font-size'])) {
+							$headsize = (4 - intval($dom[$key]['value']{1})) * 2;
+							$dom[$key]['fontsize'] = $dom[0]['fontsize'] + $headsize;
+						}
+						if (!isset($dom[$key]['style']['font-weight'])) {
+							$dom[$key]['fontstyle'] .= 'B';
+						}
+					}
+					if (($dom[$key]['value'] == 'table')) {
+						$dom[$key]['rows'] = 0; // number of rows
+						$dom[$key]['trids'] = array(); // IDs of TR elements
+						$dom[$key]['thead'] = ''; // table header rows
+					}
+					if (($dom[$key]['value'] == 'tr')) {
+						$dom[$key]['cols'] = 0;
+						if ($thead) {
+							$dom[$key]['thead'] = true;
+							// rows on thead block are printed as a separate table
+						} else {
+							$dom[$key]['thead'] = false;
+							// store the number of rows on table element
+							++$dom[($dom[$key]['parent'])]['rows'];
+							// store the TR elements IDs on table element
+							array_push($dom[($dom[$key]['parent'])]['trids'], $key);
+						}
+					}
+					if (($dom[$key]['value'] == 'th') OR ($dom[$key]['value'] == 'td')) {
+						if (isset($dom[$key]['attribute']['colspan'])) {
+							$colspan = intval($dom[$key]['attribute']['colspan']);
+						} else {
+							$colspan = 1;
+						}
+						$dom[$key]['attribute']['colspan'] = $colspan;
+						$dom[($dom[$key]['parent'])]['cols'] += $colspan;
+					}
+					// text direction
+					if (isset($dom[$key]['attribute']['dir'])) {
+						$dom[$key]['dir'] = $dom[$key]['attribute']['dir'];
+					}
+					// set foreground color attribute
+					if (isset($dom[$key]['attribute']['color']) AND (!TCPDF_STATIC::empty_string($dom[$key]['attribute']['color']))) {
+						$dom[$key]['fgcolor'] = TCPDF_COLORS::convertHTMLColorToDec($dom[$key]['attribute']['color'], $this->spot_colors);
+					} elseif (!isset($dom[$key]['style']['color']) AND ($dom[$key]['value'] == 'a')) {
+						$dom[$key]['fgcolor'] = $this->htmlLinkColorArray;
+					}
+					// set background color attribute
+					if (isset($dom[$key]['attribute']['bgcolor']) AND (!TCPDF_STATIC::empty_string($dom[$key]['attribute']['bgcolor']))) {
+						$dom[$key]['bgcolor'] = TCPDF_COLORS::convertHTMLColorToDec($dom[$key]['attribute']['bgcolor'], $this->spot_colors);
+					}
+					// set stroke color attribute
+					if (isset($dom[$key]['attribute']['strokecolor']) AND (!TCPDF_STATIC::empty_string($dom[$key]['attribute']['strokecolor']))) {
+						$dom[$key]['strokecolor'] = TCPDF_COLORS::convertHTMLColorToDec($dom[$key]['attribute']['strokecolor'], $this->spot_colors);
+					}
+					// check for width attribute
+					if (isset($dom[$key]['attribute']['width'])) {
+						$dom[$key]['width'] = $dom[$key]['attribute']['width'];
+					}
+					// check for height attribute
+					if (isset($dom[$key]['attribute']['height'])) {
+						$dom[$key]['height'] = $dom[$key]['attribute']['height'];
+					}
+					// check for text alignment
+					if (isset($dom[$key]['attribute']['align']) AND (!TCPDF_STATIC::empty_string($dom[$key]['attribute']['align'])) AND ($dom[$key]['value'] !== 'img')) {
+						$dom[$key]['align'] = strtoupper($dom[$key]['attribute']['align']{0});
+					}
+					// check for text rendering mode (the following attributes do not exist in HTML)
+					if (isset($dom[$key]['attribute']['stroke'])) {
+						// font stroke width
+						$dom[$key]['stroke'] = $this->getHTMLUnitToUnits($dom[$key]['attribute']['stroke'], $dom[$key]['fontsize'], 'pt', true);
+					}
+					if (isset($dom[$key]['attribute']['fill'])) {
+						// font fill
+						if ($dom[$key]['attribute']['fill'] == 'true') {
+							$dom[$key]['fill'] = true;
+						} else {
+							$dom[$key]['fill'] = false;
+						}
+					}
+					if (isset($dom[$key]['attribute']['clip'])) {
+						// clipping mode
+						if ($dom[$key]['attribute']['clip'] == 'true') {
+							$dom[$key]['clip'] = true;
+						} else {
+							$dom[$key]['clip'] = false;
+						}
+					}
+				} // end opening tag
+			} else {
+				// text
+				$dom[$key]['tag'] = false;
+				$dom[$key]['block'] = false;
+				//$element = str_replace('&nbsp;', TCPDF_FONTS::unichr(160, $this->isunicode), $element);
+				$dom[$key]['value'] = stripslashes($this->unhtmlentities($element));
+				$dom[$key]['parent'] = end($level);
+				$dom[$key]['dir'] = $dom[$dom[$key]['parent']]['dir'];
+			}
+			++$elkey;
+			++$key;
+		}
+		return $dom;
+	}
+
+	/**
+	 * Returns the string used to find spaces
+	 * @return string
+	 * @protected
+	 * @author Nicola Asuni
+	 * @since 4.8.024 (2010-01-15)
+	 */
+	protected function getSpaceString() {
+		$spacestr = chr(32);
+		if ($this->isUnicodeFont()) {
+			$spacestr = chr(0).chr(32);
+		}
+		return $spacestr;
+	}
+
+	/**
+	 * Serialize an array of parameters to be used with TCPDF tag in HTML code.
+	 * @param $pararray (array) parameters array
+	 * @return sting containing serialized data
+	 * @since 4.9.006 (2010-04-02)
+	 * @public
+	 * @deprecated
+	 */
+	public function serializeTCPDFtagParameters($pararray) {
+		return TCPDF_STATIC::serializeTCPDFtagParameters($pararray);
+	}
+
+	/**
+	 * Prints a cell (rectangular area) with optional borders, background color and html text string.
+	 * The upper-left corner of the cell corresponds to the current position. After the call, the current position moves to the right or to the next line.<br />
+	 * If automatic page breaking is enabled and the cell goes beyond the limit, a page break is done before outputting.
+	 * IMPORTANT: The HTML must be well formatted - try to clean-up it using an application like HTML-Tidy before submitting.
+	 * Supported tags are: a, b, blockquote, br, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, img, li, ol, p, pre, small, span, strong, sub, sup, table, tcpdf, td, th, thead, tr, tt, u, ul
+	 * NOTE: all the HTML attributes must be enclosed in double-quote.
+	 * @param $w (float) Cell width. If 0, the cell extends up to the right margin.
+	 * @param $h (float) Cell minimum height. The cell extends automatically if needed.
+	 * @param $x (float) upper-left corner X coordinate
+	 * @param $y (float) upper-left corner Y coordinate
+	 * @param $html (string) html text to print. Default value: empty string.
+	 * @param $border (mixed) Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
+	 * @param $ln (int) Indicates where the current position should go after the call. Possible values are:<ul><li>0: to the right (or left for RTL language)</li><li>1: to the beginning of the next line</li><li>2: below</li></ul>
+Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0.
+	 * @param $fill (boolean) Indicates if the cell background must be painted (true) or transparent (false).
+	 * @param $reseth (boolean) if true reset the last cell height (default true).
+	 * @param $align (string) Allows to center or align the text. Possible values are:<ul><li>L : left align</li><li>C : center</li><li>R : right align</li><li>'' : empty string : left for LTR or right for RTL</li></ul>
+	 * @param $autopadding (boolean) if true, uses internal padding and automatically adjust it to account for line width.
+	 * @see Multicell(), writeHTML()
+	 * @public
+	 */
+	public function writeHTMLCell($w, $h, $x, $y, $html='', $border=0, $ln=0, $fill=false, $reseth=true, $align='', $autopadding=true) {
+		return $this->MultiCell($w, $h, $html, $border, $align, $fill, $ln, $x, $y, $reseth, 0, true, $autopadding, 0, 'T', false);
+	}
+
+	/**
+	 * Allows to preserve some HTML formatting (limited support).<br />
+	 * IMPORTANT: The HTML must be well formatted - try to clean-up it using an application like HTML-Tidy before submitting.
+	 * Supported tags are: a, b, blockquote, br, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, img, li, ol, p, pre, small, span, strong, sub, sup, table, tcpdf, td, th, thead, tr, tt, u, ul
+	 * NOTE: all the HTML attributes must be enclosed in double-quote.
+	 * @param $html (string) text to display
+	 * @param $ln (boolean) if true add a new line after text (default = true)
+	 * @param $fill (boolean) Indicates if the background must be painted (true) or transparent (false).
+	 * @param $reseth (boolean) if true reset the last cell height (default false).
+	 * @param $cell (boolean) if true add the current left (or right for RTL) padding to each Write (default false).
+	 * @param $align (string) Allows to center or align the text. Possible values are:<ul><li>L : left align</li><li>C : center</li><li>R : right align</li><li>'' : empty string : left for LTR or right for RTL</li></ul>
+	 * @public
+	 */
+	public function writeHTML($html, $ln=true, $fill=false, $reseth=false, $cell=false, $align='') {
+		$gvars = $this->getGraphicVars();
+		// store current values
+		$prev_cell_margin = $this->cell_margin;
+		$prev_cell_padding = $this->cell_padding;
+		$prevPage = $this->page;
+		$prevlMargin = $this->lMargin;
+		$prevrMargin = $this->rMargin;
+		$curfontname = $this->FontFamily;
+		$curfontstyle = $this->FontStyle;
+		$curfontsize = $this->FontSizePt;
+		$curfontascent = $this->getFontAscent($curfontname, $curfontstyle, $curfontsize);
+		$curfontdescent = $this->getFontDescent($curfontname, $curfontstyle, $curfontsize);
+		$curfontstretcing = $this->font_stretching;
+		$curfonttracking = $this->font_spacing;
+		$this->newline = true;
+		$newline = true;
+		$startlinepage = $this->page;
+		$minstartliney = $this->y;
+		$maxbottomliney = 0;
+		$startlinex = $this->x;
+		$startliney = $this->y;
+		$yshift = 0;
+		$loop = 0;
+		$curpos = 0;
+		$this_method_vars = array();
+		$undo = false;
+		$fontaligned = false;
+		$reverse_dir = false; // true when the text direction is reversed
+		$this->premode = false;
+		if ($this->inxobj) {
+			// we are inside an XObject template
+			$pask = count($this->xobjects[$this->xobjid]['annotations']);
+		} elseif (isset($this->PageAnnots[$this->page])) {
+			$pask = count($this->PageAnnots[$this->page]);
+		} else {
+			$pask = 0;
+		}
+		if ($this->inxobj) {
+			// we are inside an XObject template
+			$startlinepos = strlen($this->xobjects[$this->xobjid]['outdata']);
+		} elseif (!$this->InFooter) {
+			if (isset($this->footerlen[$this->page])) {
+				$this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page];
+			} else {
+				$this->footerpos[$this->page] = $this->pagelen[$this->page];
+			}
+			$startlinepos = $this->footerpos[$this->page];
+		} else {
+			// we are inside the footer
+			$startlinepos = $this->pagelen[$this->page];
+		}
+		$lalign = $align;
+		$plalign = $align;
+		if ($this->rtl) {
+			$w = $this->x - $this->lMargin;
+		} else {
+			$w = $this->w - $this->rMargin - $this->x;
+		}
+		$w -= ($this->cell_padding['L'] + $this->cell_padding['R']);
+		if ($cell) {
+			if ($this->rtl) {
+				$this->x -= $this->cell_padding['R'];
+				$this->lMargin += $this->cell_padding['R'];
+			} else {
+				$this->x += $this->cell_padding['L'];
+				$this->rMargin += $this->cell_padding['L'];
+			}
+		}
+		if ($this->customlistindent >= 0) {
+			$this->listindent = $this->customlistindent;
+		} else {
+			$this->listindent = $this->GetStringWidth('000000');
+		}
+		$this->listindentlevel = 0;
+		// save previous states
+		$prev_cell_height_ratio = $this->cell_height_ratio;
+		$prev_listnum = $this->listnum;
+		$prev_listordered = $this->listordered;
+		$prev_listcount = $this->listcount;
+		$prev_lispacer = $this->lispacer;
+		$this->listnum = 0;
+		$this->listordered = array();
+		$this->listcount = array();
+		$this->lispacer = '';
+		if ((TCPDF_STATIC::empty_string($this->lasth)) OR ($reseth)) {
+			// reset row height
+			$this->resetLastH();
+		}
+		$dom = $this->getHtmlDomArray($html);
+		$maxel = count($dom);
+		$key = 0;
+		$hidden_node_key = -1;
+		while ($key < $maxel) {
+			if ($dom[$key]['tag']) {
+				if ($dom[$key]['opening']) {
+					if (($hidden_node_key <= 0) AND $dom[$key]['hide']) {
+						// store the node key
+						$hidden_node_key = $key;
+					}
+				} elseif (($hidden_node_key > 0) AND ($dom[$key]['parent'] == $hidden_node_key)) {
+					// we have reached the closing tag of the hidden node
+					$hidden_node_key = 0;
+				}
+			}
+			if ($hidden_node_key >= 0) {
+				// skip this node
+				++$key;
+				if ($hidden_node_key == 0) {
+					// reset hidden mode
+					$hidden_node_key = -1;
+				}
+				continue;
+			}
+			if ($dom[$key]['tag'] AND isset($dom[$key]['attribute']['pagebreak'])) {
+				// check for pagebreak
+				if (($dom[$key]['attribute']['pagebreak'] == 'true') OR ($dom[$key]['attribute']['pagebreak'] == 'left') OR ($dom[$key]['attribute']['pagebreak'] == 'right')) {
+					// add a page (or trig AcceptPageBreak() for multicolumn mode)
+					$this->checkPageBreak($this->PageBreakTrigger + 1);
+					$this->htmlvspace = ($this->PageBreakTrigger + 1);
+				}
+				if ((($dom[$key]['attribute']['pagebreak'] == 'left') AND (((!$this->rtl) AND (($this->page % 2) == 0)) OR (($this->rtl) AND (($this->page % 2) != 0))))
+					OR (($dom[$key]['attribute']['pagebreak'] == 'right') AND (((!$this->rtl) AND (($this->page % 2) != 0)) OR (($this->rtl) AND (($this->page % 2) == 0))))) {
+					// add a page (or trig AcceptPageBreak() for multicolumn mode)
+					$this->checkPageBreak($this->PageBreakTrigger + 1);
+					$this->htmlvspace = ($this->PageBreakTrigger + 1);
+				}
+			}
+			if ($dom[$key]['tag'] AND $dom[$key]['opening'] AND isset($dom[$key]['attribute']['nobr']) AND ($dom[$key]['attribute']['nobr'] == 'true')) {
+				if (isset($dom[($dom[$key]['parent'])]['attribute']['nobr']) AND ($dom[($dom[$key]['parent'])]['attribute']['nobr'] == 'true')) {
+					$dom[$key]['attribute']['nobr'] = false;
+				} else {
+					// store current object
+					$this->startTransaction();
+					// save this method vars
+					$this_method_vars['html'] = $html;
+					$this_method_vars['ln'] = $ln;
+					$this_method_vars['fill'] = $fill;
+					$this_method_vars['reseth'] = $reseth;
+					$this_method_vars['cell'] = $cell;
+					$this_method_vars['align'] = $align;
+					$this_method_vars['gvars'] = $gvars;
+					$this_method_vars['prevPage'] = $prevPage;
+					$this_method_vars['prev_cell_margin'] = $prev_cell_margin;
+					$this_method_vars['prev_cell_padding'] = $prev_cell_padding;
+					$this_method_vars['prevlMargin'] = $prevlMargin;
+					$this_method_vars['prevrMargin'] = $prevrMargin;
+					$this_method_vars['curfontname'] = $curfontname;
+					$this_method_vars['curfontstyle'] = $curfontstyle;
+					$this_method_vars['curfontsize'] = $curfontsize;
+					$this_method_vars['curfontascent'] = $curfontascent;
+					$this_method_vars['curfontdescent'] = $curfontdescent;
+					$this_method_vars['curfontstretcing'] = $curfontstretcing;
+					$this_method_vars['curfonttracking'] = $curfonttracking;
+					$this_method_vars['minstartliney'] = $minstartliney;
+					$this_method_vars['maxbottomliney'] = $maxbottomliney;
+					$this_method_vars['yshift'] = $yshift;
+					$this_method_vars['startlinepage'] = $startlinepage;
+					$this_method_vars['startlinepos'] = $startlinepos;
+					$this_method_vars['startlinex'] = $startlinex;
+					$this_method_vars['startliney'] = $startliney;
+					$this_method_vars['newline'] = $newline;
+					$this_method_vars['loop'] = $loop;
+					$this_method_vars['curpos'] = $curpos;
+					$this_method_vars['pask'] = $pask;
+					$this_method_vars['lalign'] = $lalign;
+					$this_method_vars['plalign'] = $plalign;
+					$this_method_vars['w'] = $w;
+					$this_method_vars['prev_cell_height_ratio'] = $prev_cell_height_ratio;
+					$this_method_vars['prev_listnum'] = $prev_listnum;
+					$this_method_vars['prev_listordered'] = $prev_listordered;
+					$this_method_vars['prev_listcount'] = $prev_listcount;
+					$this_method_vars['prev_lispacer'] = $prev_lispacer;
+					$this_method_vars['fontaligned'] = $fontaligned;
+					$this_method_vars['key'] = $key;
+					$this_method_vars['dom'] = $dom;
+				}
+			}
+			// print THEAD block
+			if (($dom[$key]['value'] == 'tr') AND isset($dom[$key]['thead']) AND $dom[$key]['thead']) {
+				if (isset($dom[$key]['parent']) AND isset($dom[$dom[$key]['parent']]['thead']) AND !TCPDF_STATIC::empty_string($dom[$dom[$key]['parent']]['thead'])) {
+					$this->inthead = true;
+					// print table header (thead)
+					$this->writeHTML($this->thead, false, false, false, false, '');
+					// check if we are on a new page or on a new column
+					if (($this->y < $this->start_transaction_y) OR ($this->checkPageBreak($this->lasth, '', false))) {
+						// we are on a new page or on a new column and the total object height is less than the available vertical space.
+						// restore previous object
+						$this->rollbackTransaction(true);
+						// restore previous values
+						foreach ($this_method_vars as $vkey => $vval) {
+							$$vkey = $vval;
+						}
+						// disable table header
+						$tmp_thead = $this->thead;
+						$this->thead = '';
+						// add a page (or trig AcceptPageBreak() for multicolumn mode)
+						$pre_y = $this->y;
+						if ((!$this->checkPageBreak($this->PageBreakTrigger + 1)) AND ($this->y < $pre_y)) {
+							// fix for multicolumn mode
+							$startliney = $this->y;
+						}
+						$this->start_transaction_page = $this->page;
+						$this->start_transaction_y = $this->y;
+						// restore table header
+						$this->thead = $tmp_thead;
+						// fix table border properties
+						if (isset($dom[$dom[$key]['parent']]['attribute']['cellspacing'])) {
+							$tmp_cellspacing = $this->getHTMLUnitToUnits($dom[$dom[$key]['parent']]['attribute']['cellspacing'], 1, 'px');
+						} elseif (isset($dom[$dom[$key]['parent']]['border-spacing'])) {
+							$tmp_cellspacing = $dom[$dom[$key]['parent']]['border-spacing']['V'];
+						} else {
+							$tmp_cellspacing = 0;
+						}
+						$dom[$dom[$key]['parent']]['borderposition']['page'] = $this->page;
+						$dom[$dom[$key]['parent']]['borderposition']['column'] = $this->current_column;
+						$dom[$dom[$key]['parent']]['borderposition']['y'] = $this->y + $tmp_cellspacing;
+						$xoffset = ($this->x - $dom[$dom[$key]['parent']]['borderposition']['x']);
+						$dom[$dom[$key]['parent']]['borderposition']['x'] += $xoffset;
+						$dom[$dom[$key]['parent']]['borderposition']['xmax'] += $xoffset;
+						// print table header (thead)
+						$this->writeHTML($this->thead, false, false, false, false, '');
+					}
+				}
+				// move $key index forward to skip THEAD block
+				while ( ($key < $maxel) AND (!(
+					($dom[$key]['tag'] AND $dom[$key]['opening'] AND ($dom[$key]['value'] == 'tr') AND (!isset($dom[$key]['thead']) OR !$dom[$key]['thead']))
+					OR ($dom[$key]['tag'] AND (!$dom[$key]['opening']) AND ($dom[$key]['value'] == 'table'))) )) {
+					++$key;
+				}
+			}
+			if ($dom[$key]['tag'] OR ($key == 0)) {
+				if ((($dom[$key]['value'] == 'table') OR ($dom[$key]['value'] == 'tr')) AND (isset($dom[$key]['align']))) {
+					$dom[$key]['align'] = ($this->rtl) ? 'R' : 'L';
+				}
+				// vertically align image in line
+				if ((!$this->newline) AND ($dom[$key]['value'] == 'img') AND (isset($dom[$key]['height'])) AND ($dom[$key]['height'] > 0)) {
+					// get image height
+					$imgh = $this->getHTMLUnitToUnits($dom[$key]['height'], $this->lasth, 'px');
+					$autolinebreak = false;
+					if (isset($dom[$key]['width']) AND ($dom[$key]['width'] > 0)) {
+						$imgw = $this->getHTMLUnitToUnits($dom[$key]['width'], 1, 'px', false);
+						if (($imgw <= ($this->w - $this->lMargin - $this->rMargin - $this->cell_padding['L'] - $this->cell_padding['R']))
+							AND ((($this->rtl) AND (($this->x - $imgw) < ($this->lMargin + $this->cell_padding['L'])))
+							OR ((!$this->rtl) AND (($this->x + $imgw) > ($this->w - $this->rMargin - $this->cell_padding['R']))))) {
+							// add automatic line break
+							$autolinebreak = true;
+							$this->Ln('', $cell);
+							if ((!$dom[($key-1)]['tag']) AND ($dom[($key-1)]['value'] == ' ')) {
+								// go back to evaluate this line break
+								--$key;
+							}
+						}
+					}
+					if (!$autolinebreak) {
+						if ($this->inPageBody()) {
+							$pre_y = $this->y;
+							// check for page break
+							if ((!$this->checkPageBreak($imgh)) AND ($this->y < $pre_y)) {
+								// fix for multicolumn mode
+								$startliney = $this->y;
+							}
+						}
+						if ($this->page > $startlinepage) {
+							// fix line splitted over two pages
+							if (isset($this->footerlen[$startlinepage])) {
+								$curpos = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage];
+							}
+							// line to be moved one page forward
+							$pagebuff = $this->getPageBuffer($startlinepage);
+							$linebeg = substr($pagebuff, $startlinepos, ($curpos - $startlinepos));
+							$tstart = substr($pagebuff, 0, $startlinepos);
+							$tend = substr($this->getPageBuffer($startlinepage), $curpos);
+							// remove line from previous page
+							$this->setPageBuffer($startlinepage, $tstart.''.$tend);
+							$pagebuff = $this->getPageBuffer($this->page);
+							$tstart = substr($pagebuff, 0, $this->cntmrk[$this->page]);
+							$tend = substr($pagebuff, $this->cntmrk[$this->page]);
+							// add line start to current page
+							$yshift = ($minstartliney - $this->y);
+							if ($fontaligned) {
+								$yshift += ($curfontsize / $this->k);
+							}
+							$try = sprintf('1 0 0 1 0 %F cm', ($yshift * $this->k));
+							$this->setPageBuffer($this->page, $tstart."\nq\n".$try."\n".$linebeg."\nQ\n".$tend);
+							// shift the annotations and links
+							if (isset($this->PageAnnots[$this->page])) {
+								$next_pask = count($this->PageAnnots[$this->page]);
+							} else {
+								$next_pask = 0;
+							}
+							if (isset($this->PageAnnots[$startlinepage])) {
+								foreach ($this->PageAnnots[$startlinepage] as $pak => $pac) {
+									if ($pak >= $pask) {
+										$this->PageAnnots[$this->page][] = $pac;
+										unset($this->PageAnnots[$startlinepage][$pak]);
+										$npak = count($this->PageAnnots[$this->page]) - 1;
+										$this->PageAnnots[$this->page][$npak]['y'] -= $yshift;
+									}
+								}
+							}
+							$pask = $next_pask;
+							$startlinepos = $this->cntmrk[$this->page];
+							$startlinepage = $this->page;
+							$startliney = $this->y;
+							$this->newline = false;
+						}
+						$this->y += ((($curfontsize * $this->cell_height_ratio / $this->k) + $curfontascent - $curfontdescent) / 2) - $imgh;
+						$minstartliney = min($this->y, $minstartliney);
+						$maxbottomliney = ($startliney + ($this->FontSize * $this->cell_height_ratio));
+					}
+				} elseif (isset($dom[$key]['fontname']) OR isset($dom[$key]['fontstyle']) OR isset($dom[$key]['fontsize']) OR isset($dom[$key]['line-height'])) {
+					// account for different font size
+					$pfontname = $curfontname;
+					$pfontstyle = $curfontstyle;
+					$pfontsize = $curfontsize;
+					$fontname = (isset($dom[$key]['fontname']) ? $dom[$key]['fontname'] : $curfontname);
+					$fontstyle = (isset($dom[$key]['fontstyle']) ? $dom[$key]['fontstyle'] : $curfontstyle);
+					$fontsize = (isset($dom[$key]['fontsize']) ? $dom[$key]['fontsize'] : $curfontsize);
+					$fontascent = $this->getFontAscent($fontname, $fontstyle, $fontsize);
+					$fontdescent = $this->getFontDescent($fontname, $fontstyle, $fontsize);
+					if (($fontname != $curfontname) OR ($fontstyle != $curfontstyle) OR ($fontsize != $curfontsize)
+						OR ($this->cell_height_ratio != $dom[$key]['line-height'])
+						OR ($dom[$key]['tag'] AND $dom[$key]['opening'] AND ($dom[$key]['value'] == 'li')) ) {
+						if (($key < ($maxel - 1)) AND (
+								($dom[$key]['tag'] AND $dom[$key]['opening'] AND ($dom[$key]['value'] == 'li'))
+								OR ($this->cell_height_ratio != $dom[$key]['line-height'])
+								OR (!$this->newline AND is_numeric($fontsize) AND is_numeric($curfontsize) AND ($fontsize >= 0) AND ($curfontsize >= 0) AND ($fontsize != $curfontsize))
+							)) {
+							if ($this->page > $startlinepage) {
+								// fix lines splitted over two pages
+								if (isset($this->footerlen[$startlinepage])) {
+									$curpos = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage];
+								}
+								// line to be moved one page forward
+								$pagebuff = $this->getPageBuffer($startlinepage);
+								$linebeg = substr($pagebuff, $startlinepos, ($curpos - $startlinepos));
+								$tstart = substr($pagebuff, 0, $startlinepos);
+								$tend = substr($this->getPageBuffer($startlinepage), $curpos);
+								// remove line start from previous page
+								$this->setPageBuffer($startlinepage, $tstart.''.$tend);
+								$pagebuff = $this->getPageBuffer($this->page);
+								$tstart = substr($pagebuff, 0, $this->cntmrk[$this->page]);
+								$tend = substr($pagebuff, $this->cntmrk[$this->page]);
+								// add line start to current page
+								$yshift = ($minstartliney - $this->y);
+								$try = sprintf('1 0 0 1 0 %F cm', ($yshift * $this->k));
+								$this->setPageBuffer($this->page, $tstart."\nq\n".$try."\n".$linebeg."\nQ\n".$tend);
+								// shift the annotations and links
+								if (isset($this->PageAnnots[$this->page])) {
+									$next_pask = count($this->PageAnnots[$this->page]);
+								} else {
+									$next_pask = 0;
+								}
+								if (isset($this->PageAnnots[$startlinepage])) {
+									foreach ($this->PageAnnots[$startlinepage] as $pak => $pac) {
+										if ($pak >= $pask) {
+											$this->PageAnnots[$this->page][] = $pac;
+											unset($this->PageAnnots[$startlinepage][$pak]);
+											$npak = count($this->PageAnnots[$this->page]) - 1;
+											$this->PageAnnots[$this->page][$npak]['y'] -= $yshift;
+										}
+									}
+								}
+								$pask = $next_pask;
+								$startlinepos = $this->cntmrk[$this->page];
+								$startlinepage = $this->page;
+								$startliney = $this->y;
+							}
+							if (!isset($dom[$key]['line-height'])) {
+								$dom[$key]['line-height'] = $this->cell_height_ratio;
+							}
+							if (!$dom[$key]['block']) {
+								if (!(isset($dom[($key + 1)]) AND $dom[($key + 1)]['tag'] AND (!$dom[($key + 1)]['opening']) AND ($dom[($key + 1)]['value'] != 'li') AND $dom[$key]['tag'] AND (!$dom[$key]['opening']))) {
+									$this->y += (((($curfontsize * $this->cell_height_ratio) - ($fontsize * $dom[$key]['line-height'])) / $this->k) + $curfontascent - $fontascent - $curfontdescent + $fontdescent) / 2;
+								}
+								if (($dom[$key]['value'] != 'sup') AND ($dom[$key]['value'] != 'sub')) {
+									$current_line_align_data = array($key, $minstartliney, $maxbottomliney);
+									if (isset($line_align_data) AND (($line_align_data[0] == ($key - 1)) OR (($line_align_data[0] == ($key - 2)) AND (isset($dom[($key - 1)])) AND (preg_match('/^([\s]+)$/', $dom[($key - 1)]['value']) > 0)))) {
+										$minstartliney = min($this->y, $line_align_data[1]);
+										$maxbottomliney = max(($this->y + (($fontsize * $this->cell_height_ratio) / $this->k)), $line_align_data[2]);
+									} else {
+										$minstartliney = min($this->y, $minstartliney);
+										$maxbottomliney = max(($this->y + (($fontsize * $this->cell_height_ratio) / $this->k)), $maxbottomliney);
+									}
+									$line_align_data = $current_line_align_data;
+								}
+							}
+							$this->cell_height_ratio = $dom[$key]['line-height'];
+							$fontaligned = true;
+						}
+						$this->SetFont($fontname, $fontstyle, $fontsize);
+						// reset row height
+						$this->resetLastH();
+						$curfontname = $fontname;
+						$curfontstyle = $fontstyle;
+						$curfontsize = $fontsize;
+						$curfontascent = $fontascent;
+						$curfontdescent = $fontdescent;
+					}
+				}
+				// set text rendering mode
+				$textstroke = isset($dom[$key]['stroke']) ? $dom[$key]['stroke'] : $this->textstrokewidth;
+				$textfill = isset($dom[$key]['fill']) ? $dom[$key]['fill'] : (($this->textrendermode % 2) == 0);
+				$textclip = isset($dom[$key]['clip']) ? $dom[$key]['clip'] : ($this->textrendermode > 3);
+				$this->setTextRenderingMode($textstroke, $textfill, $textclip);
+				if (isset($dom[$key]['font-stretch']) AND ($dom[$key]['font-stretch'] !== false)) {
+					$this->setFontStretching($dom[$key]['font-stretch']);
+				}
+				if (isset($dom[$key]['letter-spacing']) AND ($dom[$key]['letter-spacing'] !== false)) {
+					$this->setFontSpacing($dom[$key]['letter-spacing']);
+				}
+				if (($plalign == 'J') AND $dom[$key]['block']) {
+					$plalign = '';
+				}
+				// get current position on page buffer
+				$curpos = $this->pagelen[$startlinepage];
+				if (isset($dom[$key]['bgcolor']) AND ($dom[$key]['bgcolor'] !== false)) {
+					$this->SetFillColorArray($dom[$key]['bgcolor']);
+					$wfill = true;
+				} else {
+					$wfill = $fill | false;
+				}
+				if (isset($dom[$key]['fgcolor']) AND ($dom[$key]['fgcolor'] !== false)) {
+					$this->SetTextColorArray($dom[$key]['fgcolor']);
+				}
+				if (isset($dom[$key]['strokecolor']) AND ($dom[$key]['strokecolor'] !== false)) {
+					$this->SetDrawColorArray($dom[$key]['strokecolor']);
+				}
+				if (isset($dom[$key]['align'])) {
+					$lalign = $dom[$key]['align'];
+				}
+				if (TCPDF_STATIC::empty_string($lalign)) {
+					$lalign = $align;
+				}
+			}
+			// align lines
+			if ($this->newline AND (strlen($dom[$key]['value']) > 0) AND ($dom[$key]['value'] != 'td') AND ($dom[$key]['value'] != 'th')) {
+				$newline = true;
+				$fontaligned = false;
+				// we are at the beginning of a new line
+				if (isset($startlinex)) {
+					$yshift = ($minstartliney - $startliney);
+					if (($yshift > 0) OR ($this->page > $startlinepage)) {
+						$yshift = 0;
+					}
+					$t_x = 0;
+					// the last line must be shifted to be aligned as requested
+					$linew = abs($this->endlinex - $startlinex);
+					if ($this->inxobj) {
+						// we are inside an XObject template
+						$pstart = substr($this->xobjects[$this->xobjid]['outdata'], 0, $startlinepos);
+						if (isset($opentagpos)) {
+							$midpos = $opentagpos;
+						} else {
+							$midpos = 0;
+						}
+						if ($midpos > 0) {
+							$pmid = substr($this->xobjects[$this->xobjid]['outdata'], $startlinepos, ($midpos - $startlinepos));
+							$pend = substr($this->xobjects[$this->xobjid]['outdata'], $midpos);
+						} else {
+							$pmid = substr($this->xobjects[$this->xobjid]['outdata'], $startlinepos);
+							$pend = '';
+						}
+					} else {
+						$pstart = substr($this->getPageBuffer($startlinepage), 0, $startlinepos);
+						if (isset($opentagpos) AND isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) {
+							$this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage];
+							$midpos = min($opentagpos, $this->footerpos[$startlinepage]);
+						} elseif (isset($opentagpos)) {
+							$midpos = $opentagpos;
+						} elseif (isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) {
+							$this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage];
+							$midpos = $this->footerpos[$startlinepage];
+						} else {
+							$midpos = 0;
+						}
+						if ($midpos > 0) {
+							$pmid = substr($this->getPageBuffer($startlinepage), $startlinepos, ($midpos - $startlinepos));
+							$pend = substr($this->getPageBuffer($startlinepage), $midpos);
+						} else {
+							$pmid = substr($this->getPageBuffer($startlinepage), $startlinepos);
+							$pend = '';
+						}
+					}
+					if ((isset($plalign) AND ((($plalign == 'C') OR ($plalign == 'J') OR (($plalign == 'R') AND (!$this->rtl)) OR (($plalign == 'L') AND ($this->rtl)))))) {
+						// calculate shifting amount
+						$tw = $w;
+						if (($plalign == 'J') AND $this->isRTLTextDir() AND ($this->num_columns > 1)) {
+							$tw += $this->cell_padding['R'];
+						}
+						if ($this->lMargin != $prevlMargin) {
+							$tw += ($prevlMargin - $this->lMargin);
+						}
+						if ($this->rMargin != $prevrMargin) {
+							$tw += ($prevrMargin - $this->rMargin);
+						}
+						$one_space_width = $this->GetStringWidth(chr(32));
+						$no = 0; // number of spaces on a line contained on a single block
+						if ($this->isRTLTextDir()) { // RTL
+							// remove left space if exist
+							$pos1 = TCPDF_STATIC::revstrpos($pmid, '[(');
+							if ($pos1 > 0) {
+								$pos1 = intval($pos1);
+								if ($this->isUnicodeFont()) {
+									$pos2 = intval(TCPDF_STATIC::revstrpos($pmid, '[('.chr(0).chr(32)));
+									$spacelen = 2;
+								} else {
+									$pos2 = intval(TCPDF_STATIC::revstrpos($pmid, '[('.chr(32)));
+									$spacelen = 1;
+								}
+								if ($pos1 == $pos2) {
+									$pmid = substr($pmid, 0, ($pos1 + 2)).substr($pmid, ($pos1 + 2 + $spacelen));
+									if (substr($pmid, $pos1, 4) == '[()]') {
+										$linew -= $one_space_width;
+									} elseif ($pos1 == strpos($pmid, '[(')) {
+										$no = 1;
+									}
+								}
+							}
+						} else { // LTR
+							// remove right space if exist
+							$pos1 = TCPDF_STATIC::revstrpos($pmid, ')]');
+							if ($pos1 > 0) {
+								$pos1 = intval($pos1);
+								if ($this->isUnicodeFont()) {
+									$pos2 = intval(TCPDF_STATIC::revstrpos($pmid, chr(0).chr(32).')]')) + 2;
+									$spacelen = 2;
+								} else {
+									$pos2 = intval(TCPDF_STATIC::revstrpos($pmid, chr(32).')]')) + 1;
+									$spacelen = 1;
+								}
+								if ($pos1 == $pos2) {
+									$pmid = substr($pmid, 0, ($pos1 - $spacelen)).substr($pmid, $pos1);
+									$linew -= $one_space_width;
+								}
+							}
+						}
+						$mdiff = ($tw - $linew);
+						if ($plalign == 'C') {
+							if ($this->rtl) {
+								$t_x = -($mdiff / 2);
+							} else {
+								$t_x = ($mdiff / 2);
+							}
+						} elseif ($plalign == 'R') {
+							// right alignment on LTR document
+							$t_x = $mdiff;
+						} elseif ($plalign == 'L') {
+							// left alignment on RTL document
+							$t_x = -$mdiff;
+						} elseif (($plalign == 'J') AND ($plalign == $lalign)) {
+							// Justification
+							if ($this->isRTLTextDir()) {
+								// align text on the left
+								$t_x = -$mdiff;
+							}
+							$ns = 0; // number of spaces
+							$pmidtemp = $pmid;
+							// escape special characters
+							$pmidtemp = preg_replace('/[\\\][\(]/x', '\\#!#OP#!#', $pmidtemp);
+							$pmidtemp = preg_replace('/[\\\][\)]/x', '\\#!#CP#!#', $pmidtemp);
+							// search spaces
+							if (preg_match_all('/\[\(([^\)]*)\)\]/x', $pmidtemp, $lnstring, PREG_PATTERN_ORDER)) {
+								$spacestr = $this->getSpaceString();
+								$maxkk = count($lnstring[1]) - 1;
+								for ($kk=0; $kk <= $maxkk; ++$kk) {
+									// restore special characters
+									$lnstring[1][$kk] = str_replace('#!#OP#!#', '(', $lnstring[1][$kk]);
+									$lnstring[1][$kk] = str_replace('#!#CP#!#', ')', $lnstring[1][$kk]);
+									// store number of spaces on the strings
+									$lnstring[2][$kk] = substr_count($lnstring[1][$kk], $spacestr);
+									// count total spaces on line
+									$ns += $lnstring[2][$kk];
+									$lnstring[3][$kk] = $ns;
+								}
+								if ($ns == 0) {
+									$ns = 1;
+								}
+								// calculate additional space to add to each existing space
+								$spacewidth = ($mdiff / ($ns - $no)) * $this->k;
+								if ($this->FontSize <= 0) {
+									$this->FontSize = 1;
+								}
+								$spacewidthu = -1000 * ($mdiff + (($ns + $no) * $one_space_width)) / $ns / $this->FontSize;
+								if ($this->font_spacing != 0) {
+									// fixed spacing mode
+									$osw = -1000 * $this->font_spacing / $this->FontSize;
+									$spacewidthu += $osw;
+								}
+								$nsmax = $ns;
+								$ns = 0;
+								reset($lnstring);
+								$offset = 0;
+								$strcount = 0;
+								$prev_epsposbeg = 0;
+								$textpos = 0;
+								if ($this->isRTLTextDir()) {
+									$textpos = $this->wPt;
+								}
+								global $spacew;
+								while (preg_match('/([0-9\.\+\-]*)[\s](Td|cm|m|l|c|re)[\s]/x', $pmid, $strpiece, PREG_OFFSET_CAPTURE, $offset) == 1) {
+									// check if we are inside a string section '[( ... )]'
+									$stroffset = strpos($pmid, '[(', $offset);
+									if (($stroffset !== false) AND ($stroffset <= $strpiece[2][1])) {
+										// set offset to the end of string section
+										$offset = strpos($pmid, ')]', $stroffset);
+										while (($offset !== false) AND ($pmid[($offset - 1)] == '\\')) {
+											$offset = strpos($pmid, ')]', ($offset + 1));
+										}
+										if ($offset === false) {
+											$this->Error('HTML Justification: malformed PDF code.');
+										}
+										continue;
+									}
+									if ($this->isRTLTextDir()) {
+										$spacew = ($spacewidth * ($nsmax - $ns));
+									} else {
+										$spacew = ($spacewidth * $ns);
+									}
+									$offset = $strpiece[2][1] + strlen($strpiece[2][0]);
+									$epsposbeg = strpos($pmid, 'q'.$this->epsmarker, $offset);
+									$epsposend = strpos($pmid, $this->epsmarker.'Q', $offset) + strlen($this->epsmarker.'Q');
+									if ((($epsposbeg > 0) AND ($epsposend > 0) AND ($offset > $epsposbeg) AND ($offset < $epsposend))
+										OR (($epsposbeg === false) AND ($epsposend > 0) AND ($offset < $epsposend))) {
+										// shift EPS images
+										$trx = sprintf('1 0 0 1 %F 0 cm', $spacew);
+										$epsposbeg = strpos($pmid, 'q'.$this->epsmarker, ($prev_epsposbeg - 6));
+										$pmid_b = substr($pmid, 0, $epsposbeg);
+										$pmid_m = substr($pmid, $epsposbeg, ($epsposend - $epsposbeg));
+										$pmid_e = substr($pmid, $epsposend);
+										$pmid = $pmid_b."\nq\n".$trx."\n".$pmid_m."\nQ\n".$pmid_e;
+										$offset = $epsposend;
+										continue;
+
+									}
+									$prev_epsposbeg = $epsposbeg;
+									$currentxpos = 0;
+									// shift blocks of code
+									switch ($strpiece[2][0]) {
+										case 'Td':
+										case 'cm':
+										case 'm':
+										case 'l': {
+											// get current X position
+											preg_match('/([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', $pmid, $xmatches);
+											$currentxpos = $xmatches[1];
+											$textpos = $currentxpos;
+											if (($strcount <= $maxkk) AND ($strpiece[2][0] == 'Td')) {
+												$ns = $lnstring[3][$strcount];
+												if ($this->isRTLTextDir()) {
+													$spacew = ($spacewidth * ($nsmax - $ns));
+												}
+												++$strcount;
+											}
+											// justify block
+											$pmid = preg_replace_callback('/([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x',
+												create_function('$matches', 'global $spacew;
+												$newx = sprintf("%F",(floatval($matches[1]) + $spacew));
+												return "".$newx." ".$matches[2]." x*#!#*x".$matches[3].$matches[4];'), $pmid, 1);
+											break;
+										}
+										case 're': {
+											// justify block
+											if (!TCPDF_STATIC::empty_string($this->lispacer)) {
+												$this->lispacer = '';
+												continue;
+											}
+											preg_match('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s](re)([\s]*)/x', $pmid, $xmatches);
+											$currentxpos = $xmatches[1];
+											global $x_diff, $w_diff;
+											$x_diff = 0;
+											$w_diff = 0;
+											if ($this->isRTLTextDir()) { // RTL
+												if ($currentxpos < $textpos) {
+													$x_diff = ($spacewidth * ($nsmax - $lnstring[3][$strcount]));
+													$w_diff = ($spacewidth * $lnstring[2][$strcount]);
+												} else {
+													if ($strcount > 0) {
+														$x_diff = ($spacewidth * ($nsmax - $lnstring[3][($strcount - 1)]));
+														$w_diff = ($spacewidth * $lnstring[2][($strcount - 1)]);
+													}
+												}
+											} else { // LTR
+												if ($currentxpos > $textpos) {
+													if ($strcount > 0) {
+														$x_diff = ($spacewidth * $lnstring[3][($strcount - 1)]);
+													}
+													$w_diff = ($spacewidth * $lnstring[2][$strcount]);
+												} else {
+													if ($strcount > 1) {
+														$x_diff = ($spacewidth * $lnstring[3][($strcount - 2)]);
+													}
+													if ($strcount > 0) {
+														$w_diff = ($spacewidth * $lnstring[2][($strcount - 1)]);
+													}
+												}
+											}
+											$pmid = preg_replace_callback('/('.$xmatches[1].')[\s]('.$xmatches[2].')[\s]('.$xmatches[3].')[\s]('.$strpiece[1][0].')[\s](re)([\s]*)/x',
+												create_function('$matches', 'global $x_diff, $w_diff;
+												$newx = sprintf("%F",(floatval($matches[1]) + $x_diff));
+												$neww = sprintf("%F",(floatval($matches[3]) + $w_diff));
+												return "".$newx." ".$matches[2]." ".$neww." ".$matches[4]." x*#!#*x".$matches[5].$matches[6];'), $pmid, 1);
+											break;
+										}
+										case 'c': {
+											// get current X position
+											preg_match('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s](c)([\s]*)/x', $pmid, $xmatches);
+											$currentxpos = $xmatches[1];
+											// justify block
+											$pmid = preg_replace_callback('/('.$xmatches[1].')[\s]('.$xmatches[2].')[\s]('.$xmatches[3].')[\s]('.$xmatches[4].')[\s]('.$xmatches[5].')[\s]('.$strpiece[1][0].')[\s](c)([\s]*)/x',
+												create_function('$matches', 'global $spacew;
+												$newx1 = sprintf("%F",(floatval($matches[1]) + $spacew));
+												$newx2 = sprintf("%F",(floatval($matches[3]) + $spacew));
+												$newx3 = sprintf("%F",(floatval($matches[5]) + $spacew));
+												return "".$newx1." ".$matches[2]." ".$newx2." ".$matches[4]." ".$newx3." ".$matches[6]." x*#!#*x".$matches[7].$matches[8];'), $pmid, 1);
+											break;
+										}
+									}
+									// shift the annotations and links
+									$cxpos = ($currentxpos / $this->k);
+									$lmpos = ($this->lMargin + $this->cell_padding['L'] + $this->feps);
+									if ($this->inxobj) {
+										// we are inside an XObject template
+										foreach ($this->xobjects[$this->xobjid]['annotations'] as $pak => $pac) {
+											if (($pac['y'] >= $minstartliney) AND (($pac['x'] * $this->k) >= ($currentxpos - $this->feps)) AND (($pac['x'] * $this->k) <= ($currentxpos + $this->feps))) {
+												if ($cxpos > $lmpos) {
+													$this->xobjects[$this->xobjid]['annotations'][$pak]['x'] += ($spacew / $this->k);
+													$this->xobjects[$this->xobjid]['annotations'][$pak]['w'] += (($spacewidth * $pac['numspaces']) / $this->k);
+												} else {
+													$this->xobjects[$this->xobjid]['annotations'][$pak]['w'] += (($spacewidth * $pac['numspaces']) / $this->k);
+												}
+												break;
+											}
+										}
+									} elseif (isset($this->PageAnnots[$this->page])) {
+										foreach ($this->PageAnnots[$this->page] as $pak => $pac) {
+											if (($pac['y'] >= $minstartliney) AND (($pac['x'] * $this->k) >= ($currentxpos - $this->feps)) AND (($pac['x'] * $this->k) <= ($currentxpos + $this->feps))) {
+												if ($cxpos > $lmpos) {
+													$this->PageAnnots[$this->page][$pak]['x'] += ($spacew / $this->k);
+													$this->PageAnnots[$this->page][$pak]['w'] += (($spacewidth * $pac['numspaces']) / $this->k);
+												} else {
+													$this->PageAnnots[$this->page][$pak]['w'] += (($spacewidth * $pac['numspaces']) / $this->k);
+												}
+												break;
+											}
+										}
+									}
+								} // end of while
+								// remove markers
+								$pmid = str_replace('x*#!#*x', '', $pmid);
+								if ($this->isUnicodeFont()) {
+									// multibyte characters
+									$spacew = $spacewidthu;
+									if ($this->font_stretching != 100) {
+										// word spacing is affected by stretching
+										$spacew /= ($this->font_stretching / 100);
+									}
+									$pmidtemp = $pmid;
+									// escape special characters
+									$pmidtemp = preg_replace('/[\\\][\(]/x', '\\#!#OP#!#', $pmidtemp);
+									$pmidtemp = preg_replace('/[\\\][\)]/x', '\\#!#CP#!#', $pmidtemp);
+									$pmid = preg_replace_callback("/\[\(([^\)]*)\)\]/x",
+												create_function('$matches', 'global $spacew;
+												$matches[1] = str_replace("#!#OP#!#", "(", $matches[1]);
+												$matches[1] = str_replace("#!#CP#!#", ")", $matches[1]);
+												return "[(".str_replace(chr(0).chr(32), ") ".sprintf("%F", $spacew)." (", $matches[1]).")]";'), $pmidtemp);
+									if ($this->inxobj) {
+										// we are inside an XObject template
+										$this->xobjects[$this->xobjid]['outdata'] = $pstart."\n".$pmid."\n".$pend;
+									} else {
+										$this->setPageBuffer($startlinepage, $pstart."\n".$pmid."\n".$pend);
+									}
+									$endlinepos = strlen($pstart."\n".$pmid."\n");
+								} else {
+									// non-unicode (single-byte characters)
+									if ($this->font_stretching != 100) {
+										// word spacing (Tw) is affected by stretching
+										$spacewidth /= ($this->font_stretching / 100);
+									}
+									$rs = sprintf('%F Tw', $spacewidth);
+									$pmid = preg_replace("/\[\(/x", $rs.' [(', $pmid);
+									if ($this->inxobj) {
+										// we are inside an XObject template
+										$this->xobjects[$this->xobjid]['outdata'] = $pstart."\n".$pmid."\nBT 0 Tw ET\n".$pend;
+									} else {
+										$this->setPageBuffer($startlinepage, $pstart."\n".$pmid."\nBT 0 Tw ET\n".$pend);
+									}
+									$endlinepos = strlen($pstart."\n".$pmid."\nBT 0 Tw ET\n");
+								}
+							}
+						} // end of J
+					} // end if $startlinex
+					if (($t_x != 0) OR ($yshift < 0)) {
+						// shift the line
+						$trx = sprintf('1 0 0 1 %F %F cm', ($t_x * $this->k), ($yshift * $this->k));
+						$pstart .= "\nq\n".$trx."\n".$pmid."\nQ\n";
+						$endlinepos = strlen($pstart);
+						if ($this->inxobj) {
+							// we are inside an XObject template
+							$this->xobjects[$this->xobjid]['outdata'] = $pstart.$pend;
+							foreach ($this->xobjects[$this->xobjid]['annotations'] as $pak => $pac) {
+								if ($pak >= $pask) {
+									$this->xobjects[$this->xobjid]['annotations'][$pak]['x'] += $t_x;
+									$this->xobjects[$this->xobjid]['annotations'][$pak]['y'] -= $yshift;
+								}
+							}
+						} else {
+							$this->setPageBuffer($startlinepage, $pstart.$pend);
+							// shift the annotations and links
+							if (isset($this->PageAnnots[$this->page])) {
+								foreach ($this->PageAnnots[$this->page] as $pak => $pac) {
+									if ($pak >= $pask) {
+										$this->PageAnnots[$this->page][$pak]['x'] += $t_x;
+										$this->PageAnnots[$this->page][$pak]['y'] -= $yshift;
+									}
+								}
+							}
+						}
+						$this->y -= $yshift;
+					}
+				}
+				$pbrk = $this->checkPageBreak($this->lasth);
+				$this->newline = false;
+				$startlinex = $this->x;
+				$startliney = $this->y;
+				if ($dom[$dom[$key]['parent']]['value'] == 'sup') {
+					$startliney -= ((0.3 * $this->FontSizePt) / $this->k);
+				} elseif ($dom[$dom[$key]['parent']]['value'] == 'sub') {
+					$startliney -= (($this->FontSizePt / 0.7) / $this->k);
+				} else {
+					$minstartliney = $startliney;
+					$maxbottomliney = ($this->y + (($fontsize * $this->cell_height_ratio) / $this->k));
+				}
+				$startlinepage = $this->page;
+				if (isset($endlinepos) AND (!$pbrk)) {
+					$startlinepos = $endlinepos;
+				} else {
+					if ($this->inxobj) {
+						// we are inside an XObject template
+						$startlinepos = strlen($this->xobjects[$this->xobjid]['outdata']);
+					} elseif (!$this->InFooter) {
+						if (isset($this->footerlen[$this->page])) {
+							$this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page];
+						} else {
+							$this->footerpos[$this->page] = $this->pagelen[$this->page];
+						}
+						$startlinepos = $this->footerpos[$this->page];
+					} else {
+						$startlinepos = $this->pagelen[$this->page];
+					}
+				}
+				unset($endlinepos);
+				$plalign = $lalign;
+				if (isset($this->PageAnnots[$this->page])) {
+					$pask = count($this->PageAnnots[$this->page]);
+				} else {
+					$pask = 0;
+				}
+				if (!($dom[$key]['tag'] AND !$dom[$key]['opening'] AND ($dom[$key]['value'] == 'table')
+					AND (isset($this->emptypagemrk[$this->page]))
+					AND ($this->emptypagemrk[$this->page] == $this->pagelen[$this->page]))) {
+					$this->SetFont($fontname, $fontstyle, $fontsize);
+					if ($wfill) {
+						$this->SetFillColorArray($this->bgcolor);
+					}
+				}
+			} // end newline
+			if (isset($opentagpos)) {
+				unset($opentagpos);
+			}
+			if ($dom[$key]['tag']) {
+				if ($dom[$key]['opening']) {
+					// get text indentation (if any)
+					if (isset($dom[$key]['text-indent']) AND $dom[$key]['block']) {
+						$this->textindent = $dom[$key]['text-indent'];
+						$this->newline = true;
+					}
+					// table
+					if (($dom[$key]['value'] == 'table') AND isset($dom[$key]['cols']) AND ($dom[$key]['cols'] > 0)) {
+						// available page width
+						if ($this->rtl) {
+							$wtmp = $this->x - $this->lMargin;
+						} else {
+							$wtmp = $this->w - $this->rMargin - $this->x;
+						}
+						// get cell spacing
+						if (isset($dom[$key]['attribute']['cellspacing'])) {
+							$clsp = $this->getHTMLUnitToUnits($dom[$key]['attribute']['cellspacing'], 1, 'px');
+							$cellspacing = array('H' => $clsp, 'V' => $clsp);
+						} elseif (isset($dom[$key]['border-spacing'])) {
+							$cellspacing = $dom[$key]['border-spacing'];
+						} else {
+							$cellspacing = array('H' => 0, 'V' => 0);
+						}
+						// table width
+						if (isset($dom[$key]['width'])) {
+							$table_width = $this->getHTMLUnitToUnits($dom[$key]['width'], $wtmp, 'px');
+						} else {
+							$table_width = $wtmp;
+						}
+						$table_width -= (2 * $cellspacing['H']);
+						if (!$this->inthead) {
+							$this->y += $cellspacing['V'];
+						}
+						if ($this->rtl) {
+							$cellspacingx = -$cellspacing['H'];
+						} else {
+							$cellspacingx = $cellspacing['H'];
+						}
+						// total table width without cellspaces
+						$table_columns_width = ($table_width - ($cellspacing['H'] * ($dom[$key]['cols'] - 1)));
+						// minimum column width
+						$table_min_column_width = ($table_columns_width / $dom[$key]['cols']);
+						// array of custom column widths
+						$table_colwidths = array_fill(0, $dom[$key]['cols'], $table_min_column_width);
+					}
+					// table row
+					if ($dom[$key]['value'] == 'tr') {
+						// reset column counter
+						$colid = 0;
+					}
+					// table cell
+					if (($dom[$key]['value'] == 'td') OR ($dom[$key]['value'] == 'th')) {
+						$trid = $dom[$key]['parent'];
+						$table_el = $dom[$trid]['parent'];
+						if (!isset($dom[$table_el]['cols'])) {
+							$dom[$table_el]['cols'] = $dom[$trid]['cols'];
+						}
+						// store border info
+						$tdborder = 0;
+						if (isset($dom[$key]['border']) AND !empty($dom[$key]['border'])) {
+							$tdborder = $dom[$key]['border'];
+						}
+						$colspan = intval($dom[$key]['attribute']['colspan']);
+						if ($colspan <= 0) {
+							$colspan = 1;
+						}
+						$old_cell_padding = $this->cell_padding;
+						if (isset($dom[($dom[$trid]['parent'])]['attribute']['cellpadding'])) {
+							$crclpd = $this->getHTMLUnitToUnits($dom[($dom[$trid]['parent'])]['attribute']['cellpadding'], 1, 'px');
+							$current_cell_padding = array('L' => $crclpd, 'T' => $crclpd, 'R' => $crclpd, 'B' => $crclpd);
+						} elseif (isset($dom[($dom[$trid]['parent'])]['padding'])) {
+							$current_cell_padding = $dom[($dom[$trid]['parent'])]['padding'];
+						} else {
+							$current_cell_padding = array('L' => 0, 'T' => 0, 'R' => 0, 'B' => 0);
+						}
+						$this->cell_padding = $current_cell_padding;
+						if (isset($dom[$key]['height'])) {
+							// minimum cell height
+							$cellh = $this->getHTMLUnitToUnits($dom[$key]['height'], 0, 'px');
+						} else {
+							$cellh = 0;
+						}
+						if (isset($dom[$key]['content'])) {
+							$cell_content = stripslashes($dom[$key]['content']);
+						} else {
+							$cell_content = '&nbsp;';
+						}
+						$tagtype = $dom[$key]['value'];
+						$parentid = $key;
+						while (($key < $maxel) AND (!(($dom[$key]['tag']) AND (!$dom[$key]['opening']) AND ($dom[$key]['value'] == $tagtype) AND ($dom[$key]['parent'] == $parentid)))) {
+							// move $key index forward
+							++$key;
+						}
+						if (!isset($dom[$trid]['startpage'])) {
+							$dom[$trid]['startpage'] = $this->page;
+						} else {
+							$this->setPage($dom[$trid]['startpage']);
+						}
+						if (!isset($dom[$trid]['startcolumn'])) {
+							$dom[$trid]['startcolumn'] = $this->current_column;
+						} elseif ($this->current_column != $dom[$trid]['startcolumn']) {
+							$tmpx = $this->x;
+							$this->selectColumn($dom[$trid]['startcolumn']);
+							$this->x = $tmpx;
+						}
+						if (!isset($dom[$trid]['starty'])) {
+							$dom[$trid]['starty'] = $this->y;
+						} else {
+							$this->y = $dom[$trid]['starty'];
+						}
+						if (!isset($dom[$trid]['startx'])) {
+							$dom[$trid]['startx'] = $this->x;
+							$this->x += $cellspacingx;
+						} else {
+							$this->x += ($cellspacingx / 2);
+						}
+						if (isset($dom[$parentid]['attribute']['rowspan'])) {
+							$rowspan = intval($dom[$parentid]['attribute']['rowspan']);
+						} else {
+							$rowspan = 1;
+						}
+						// skip row-spanned cells started on the previous rows
+						if (isset($dom[$table_el]['rowspans'])) {
+							$rsk = 0;
+							$rskmax = count($dom[$table_el]['rowspans']);
+							while ($rsk < $rskmax) {
+								$trwsp = $dom[$table_el]['rowspans'][$rsk];
+								$rsstartx = $trwsp['startx'];
+								$rsendx = $trwsp['endx'];
+								// account for margin changes
+								if ($trwsp['startpage'] < $this->page) {
+									if (($this->rtl) AND ($this->pagedim[$this->page]['orm'] != $this->pagedim[$trwsp['startpage']]['orm'])) {
+										$dl = ($this->pagedim[$this->page]['orm'] - $this->pagedim[$trwsp['startpage']]['orm']);
+										$rsstartx -= $dl;
+										$rsendx -= $dl;
+									} elseif ((!$this->rtl) AND ($this->pagedim[$this->page]['olm'] != $this->pagedim[$trwsp['startpage']]['olm'])) {
+										$dl = ($this->pagedim[$this->page]['olm'] - $this->pagedim[$trwsp['startpage']]['olm']);
+										$rsstartx += $dl;
+										$rsendx += $dl;
+									}
+								}
+								if (($trwsp['rowspan'] > 0)
+									AND ($rsstartx > ($this->x - $cellspacing['H'] - $current_cell_padding['L'] - $this->feps))
+									AND ($rsstartx < ($this->x + $cellspacing['H'] + $current_cell_padding['R'] + $this->feps))
+									AND (($trwsp['starty'] < ($this->y - $this->feps)) OR ($trwsp['startpage'] < $this->page) OR ($trwsp['startcolumn'] < $this->current_column))) {
+									// set the starting X position of the current cell
+									$this->x = $rsendx + $cellspacingx;
+									// increment column indicator
+									$colid += $trwsp['colspan'];
+									if (($trwsp['rowspan'] == 1)
+										AND (isset($dom[$trid]['endy']))
+										AND (isset($dom[$trid]['endpage']))
+										AND (isset($dom[$trid]['endcolumn']))
+										AND ($trwsp['endpage'] == $dom[$trid]['endpage'])
+										AND ($trwsp['endcolumn'] == $dom[$trid]['endcolumn'])) {
+										// set ending Y position for row
+										$dom[$table_el]['rowspans'][$rsk]['endy'] = max($dom[$trid]['endy'], $trwsp['endy']);
+										$dom[$trid]['endy'] = $dom[$table_el]['rowspans'][$rsk]['endy'];
+									}
+									$rsk = 0;
+								} else {
+									++$rsk;
+								}
+							}
+						}
+						if (isset($dom[$parentid]['width'])) {
+							// user specified width
+							$cellw = $this->getHTMLUnitToUnits($dom[$parentid]['width'], $table_columns_width, 'px');
+							$tmpcw = ($cellw / $colspan);
+							for ($i = 0; $i < $colspan; ++$i) {
+								$table_colwidths[($colid + $i)] = $tmpcw;
+							}
+						} else {
+							// inherit column width
+							$cellw = 0;
+							for ($i = 0; $i < $colspan; ++$i) {
+								$cellw += $table_colwidths[($colid + $i)];
+							}
+						}
+						$cellw += (($colspan - 1) * $cellspacing['H']);
+						// increment column indicator
+						$colid += $colspan;
+						// add rowspan information to table element
+						if ($rowspan > 1) {
+							$trsid = array_push($dom[$table_el]['rowspans'], array('trid' => $trid, 'rowspan' => $rowspan, 'mrowspan' => $rowspan, 'colspan' => $colspan, 'startpage' => $this->page, 'startcolumn' => $this->current_column, 'startx' => $this->x, 'starty' => $this->y));
+						}
+						$cellid = array_push($dom[$trid]['cellpos'], array('startx' => $this->x));
+						if ($rowspan > 1) {
+							$dom[$trid]['cellpos'][($cellid - 1)]['rowspanid'] = ($trsid - 1);
+						}
+						// push background colors
+						if (isset($dom[$parentid]['bgcolor']) AND ($dom[$parentid]['bgcolor'] !== false)) {
+							$dom[$trid]['cellpos'][($cellid - 1)]['bgcolor'] = $dom[$parentid]['bgcolor'];
+						}
+						// store border info
+						if (isset($tdborder) AND !empty($tdborder)) {
+							$dom[$trid]['cellpos'][($cellid - 1)]['border'] = $tdborder;
+						}
+						$prevLastH = $this->lasth;
+						// store some info for multicolumn mode
+						if ($this->rtl) {
+							$this->colxshift['x'] = $this->w - $this->x - $this->rMargin;
+						} else {
+							$this->colxshift['x'] = $this->x - $this->lMargin;
+						}
+						$this->colxshift['s'] = $cellspacing;
+						$this->colxshift['p'] = $current_cell_padding;
+						// ****** write the cell content ******
+						$this->MultiCell($cellw, $cellh, $cell_content, false, $lalign, false, 2, '', '', true, 0, true, true, 0, 'T', false);
+						// restore some values
+						$this->colxshift = array('x' => 0, 's' => array('H' => 0, 'V' => 0), 'p' => array('L' => 0, 'T' => 0, 'R' => 0, 'B' => 0));
+						$this->lasth = $prevLastH;
+						$this->cell_padding = $old_cell_padding;
+						$dom[$trid]['cellpos'][($cellid - 1)]['endx'] = $this->x;
+						// update the end of row position
+						if ($rowspan <= 1) {
+							if (isset($dom[$trid]['endy'])) {
+								if (($this->page == $dom[$trid]['endpage']) AND ($this->current_column == $dom[$trid]['endcolumn'])) {
+									$dom[$trid]['endy'] = max($this->y, $dom[$trid]['endy']);
+								} elseif (($this->page > $dom[$trid]['endpage']) OR ($this->current_column > $dom[$trid]['endcolumn'])) {
+									$dom[$trid]['endy'] = $this->y;
+								}
+							} else {
+								$dom[$trid]['endy'] = $this->y;
+							}
+							if (isset($dom[$trid]['endpage'])) {
+								$dom[$trid]['endpage'] = max($this->page, $dom[$trid]['endpage']);
+							} else {
+								$dom[$trid]['endpage'] = $this->page;
+							}
+							if (isset($dom[$trid]['endcolumn'])) {
+								$dom[$trid]['endcolumn'] = max($this->current_column, $dom[$trid]['endcolumn']);
+							} else {
+								$dom[$trid]['endcolumn'] = $this->current_column;
+							}
+						} else {
+							// account for row-spanned cells
+							$dom[$table_el]['rowspans'][($trsid - 1)]['endx'] = $this->x;
+							$dom[$table_el]['rowspans'][($trsid - 1)]['endy'] = $this->y;
+							$dom[$table_el]['rowspans'][($trsid - 1)]['endpage'] = $this->page;
+							$dom[$table_el]['rowspans'][($trsid - 1)]['endcolumn'] = $this->current_column;
+						}
+						if (isset($dom[$table_el]['rowspans'])) {
+							// update endy and endpage on rowspanned cells
+							foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) {
+								if ($trwsp['rowspan'] > 0) {
+									if (isset($dom[$trid]['endpage'])) {
+										if (($trwsp['endpage'] == $dom[$trid]['endpage']) AND ($trwsp['endcolumn'] == $dom[$trid]['endcolumn'])) {
+											$dom[$table_el]['rowspans'][$k]['endy'] = max($dom[$trid]['endy'], $trwsp['endy']);
+										} elseif (($trwsp['endpage'] < $dom[$trid]['endpage']) OR ($trwsp['endcolumn'] < $dom[$trid]['endcolumn'])) {
+											$dom[$table_el]['rowspans'][$k]['endy'] = $dom[$trid]['endy'];
+											$dom[$table_el]['rowspans'][$k]['endpage'] = $dom[$trid]['endpage'];
+											$dom[$table_el]['rowspans'][$k]['endcolumn'] = $dom[$trid]['endcolumn'];
+										} else {
+											$dom[$trid]['endy'] = $this->pagedim[$dom[$trid]['endpage']]['hk'] - $this->pagedim[$dom[$trid]['endpage']]['bm'];
+										}
+									}
+								}
+							}
+						}
+						$this->x += ($cellspacingx / 2);
+					} else {
+						// opening tag (or self-closing tag)
+						if (!isset($opentagpos)) {
+							if ($this->inxobj) {
+								// we are inside an XObject template
+								$opentagpos = strlen($this->xobjects[$this->xobjid]['outdata']);
+							} elseif (!$this->InFooter) {
+								if (isset($this->footerlen[$this->page])) {
+									$this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page];
+								} else {
+									$this->footerpos[$this->page] = $this->pagelen[$this->page];
+								}
+								$opentagpos = $this->footerpos[$this->page];
+							}
+						}
+						$dom = $this->openHTMLTagHandler($dom, $key, $cell);
+					}
+				} else { // closing tag
+					$prev_numpages = $this->numpages;
+					$old_bordermrk = $this->bordermrk[$this->page];
+					$dom = $this->closeHTMLTagHandler($dom, $key, $cell, $maxbottomliney);
+					if ($this->bordermrk[$this->page] > $old_bordermrk) {
+						$startlinepos += ($this->bordermrk[$this->page] - $old_bordermrk);
+					}
+					if ($prev_numpages > $this->numpages) {
+						$startlinepage = $this->page;
+					}
+				}
+			} elseif (strlen($dom[$key]['value']) > 0) {
+				// print list-item
+				if (!TCPDF_STATIC::empty_string($this->lispacer) AND ($this->lispacer != '^')) {
+					$this->SetFont($pfontname, $pfontstyle, $pfontsize);
+					$this->resetLastH();
+					$minstartliney = $this->y;
+					$maxbottomliney = ($startliney + ($this->FontSize * $this->cell_height_ratio));
+					if (is_numeric($pfontsize) AND ($pfontsize > 0)) {
+						$this->putHtmlListBullet($this->listnum, $this->lispacer, $pfontsize);
+					}
+					$this->SetFont($curfontname, $curfontstyle, $curfontsize);
+					$this->resetLastH();
+					if (is_numeric($pfontsize) AND ($pfontsize > 0) AND is_numeric($curfontsize) AND ($curfontsize > 0) AND ($pfontsize != $curfontsize)) {
+						$pfontascent = $this->getFontAscent($pfontname, $pfontstyle, $pfontsize);
+						$pfontdescent = $this->getFontDescent($pfontname, $pfontstyle, $pfontsize);
+						$this->y += ((($pfontsize - $curfontsize) * $this->cell_height_ratio / $this->k) + $pfontascent - $curfontascent - $pfontdescent + $curfontdescent) / 2;
+						$minstartliney = min($this->y, $minstartliney);
+						$maxbottomliney = max(($this->y + (($pfontsize * $this->cell_height_ratio) / $this->k)), $maxbottomliney);
+					}
+				}
+				// text
+				$this->htmlvspace = 0;
+				if ((!$this->premode) AND $this->isRTLTextDir()) {
+					// reverse spaces order
+					$lsp = ''; // left spaces
+					$rsp = ''; // right spaces
+					if (preg_match('/^('.$this->re_space['p'].'+)/'.$this->re_space['m'], $dom[$key]['value'], $matches)) {
+						$lsp = $matches[1];
+					}
+					if (preg_match('/('.$this->re_space['p'].'+)$/'.$this->re_space['m'], $dom[$key]['value'], $matches)) {
+						$rsp = $matches[1];
+					}
+					$dom[$key]['value'] = $rsp.$this->stringTrim($dom[$key]['value']).$lsp;
+				}
+				if ($newline) {
+					if (!$this->premode) {
+						$prelen = strlen($dom[$key]['value']);
+						if ($this->isRTLTextDir()) {
+							// right trim except non-breaking space
+							$dom[$key]['value'] = $this->stringRightTrim($dom[$key]['value']);
+						} else {
+							// left trim except non-breaking space
+							$dom[$key]['value'] = $this->stringLeftTrim($dom[$key]['value']);
+						}
+						$postlen = strlen($dom[$key]['value']);
+						if (($postlen == 0) AND ($prelen > 0)) {
+							$dom[$key]['trimmed_space'] = true;
+						}
+					}
+					$newline = false;
+					$firstblock = true;
+				} else {
+					$firstblock = false;
+					// replace empty multiple spaces string with a single space
+					$dom[$key]['value'] = preg_replace('/^'.$this->re_space['p'].'+$/'.$this->re_space['m'], chr(32), $dom[$key]['value']);
+				}
+				$strrest = '';
+				if ($this->rtl) {
+					$this->x -= $this->textindent;
+				} else {
+					$this->x += $this->textindent;
+				}
+				if (!isset($dom[$key]['trimmed_space']) OR !$dom[$key]['trimmed_space']) {
+					$strlinelen = $this->GetStringWidth($dom[$key]['value']);
+					if (!empty($this->HREF) AND (isset($this->HREF['url']))) {
+						// HTML <a> Link
+						$hrefcolor = '';
+						if (isset($dom[($dom[$key]['parent'])]['fgcolor']) AND ($dom[($dom[$key]['parent'])]['fgcolor'] !== false)) {
+							$hrefcolor = $dom[($dom[$key]['parent'])]['fgcolor'];
+						}
+						$hrefstyle = -1;
+						if (isset($dom[($dom[$key]['parent'])]['fontstyle']) AND ($dom[($dom[$key]['parent'])]['fontstyle'] !== false)) {
+							$hrefstyle = $dom[($dom[$key]['parent'])]['fontstyle'];
+						}
+						$strrest = $this->addHtmlLink($this->HREF['url'], $dom[$key]['value'], $wfill, true, $hrefcolor, $hrefstyle, true);
+					} else {
+						$wadj = 0; // space to leave for block continuity
+						if ($this->rtl) {
+							$cwa = ($this->x - $this->lMargin);
+						} else {
+							$cwa = ($this->w - $this->rMargin - $this->x);
+						}
+						if (($strlinelen < $cwa) AND (isset($dom[($key + 1)])) AND ($dom[($key + 1)]['tag']) AND (!$dom[($key + 1)]['block'])) {
+							// check the next text blocks for continuity
+							$nkey = ($key + 1);
+							$write_block = true;
+							$same_textdir = true;
+							$tmp_fontname = $this->FontFamily;
+							$tmp_fontstyle = $this->FontStyle;
+							$tmp_fontsize = $this->FontSizePt;
+							while ($write_block AND isset($dom[$nkey])) {
+								if ($dom[$nkey]['tag']) {
+									if ($dom[$nkey]['block']) {
+										// end of block
+										$write_block = false;
+									}
+									$tmp_fontname = isset($dom[$nkey]['fontname']) ? $dom[$nkey]['fontname'] : $this->FontFamily;
+									$tmp_fontstyle = isset($dom[$nkey]['fontstyle']) ? $dom[$nkey]['fontstyle'] : $this->FontStyle;
+									$tmp_fontsize = isset($dom[$nkey]['fontsize']) ? $dom[$nkey]['fontsize'] : $this->FontSizePt;
+									$same_textdir = ($dom[$nkey]['dir'] == $dom[$key]['dir']);
+								} else {
+									$nextstr = TCPDF_STATIC::pregSplit('/'.$this->re_space['p'].'+/', $this->re_space['m'], $dom[$nkey]['value']);
+									if (isset($nextstr[0]) AND $same_textdir) {
+										$wadj += $this->GetStringWidth($nextstr[0], $tmp_fontname, $tmp_fontstyle, $tmp_fontsize);
+										if (isset($nextstr[1])) {
+											$write_block = false;
+										}
+									}
+								}
+								++$nkey;
+							}
+						}
+						if (($wadj > 0) AND (($strlinelen + $wadj) >= $cwa)) {
+							$wadj = 0;
+							$nextstr = TCPDF_STATIC::pregSplit('/'.$this->re_space['p'].'/', $this->re_space['m'], $dom[$key]['value']);
+							$numblks = count($nextstr);
+							if ($numblks > 1) {
+								// try to split on blank spaces
+								$wadj = ($cwa - $strlinelen + $this->GetStringWidth($nextstr[($numblks - 1)]));
+							} else {
+								// set the entire block on new line
+								$wadj = $this->GetStringWidth($nextstr[0]);
+							}
+						}
+						// check for reversed text direction
+						if (($wadj > 0) AND (($this->rtl AND ($this->tmprtl === 'L')) OR (!$this->rtl AND ($this->tmprtl === 'R')))) {
+							// LTR text on RTL direction or RTL text on LTR direction
+							$reverse_dir = true;
+							$this->rtl = !$this->rtl;
+							$revshift = ($strlinelen + $wadj + 0.000001); // add little quantity for rounding problems
+							if ($this->rtl) {
+								$this->x += $revshift;
+							} else {
+								$this->x -= $revshift;
+							}
+							$xws = $this->x;
+						}
+						// ****** write only until the end of the line and get the rest ******
+						$strrest = $this->Write($this->lasth, $dom[$key]['value'], '', $wfill, '', false, 0, true, $firstblock, 0, $wadj);
+						// restore default direction
+						if ($reverse_dir AND ($wadj == 0)) {
+							$this->x = $xws;
+							$this->rtl = !$this->rtl;
+							$reverse_dir = false;
+						}
+					}
+				}
+				$this->textindent = 0;
+				if (strlen($strrest) > 0) {
+					// store the remaining string on the previous $key position
+					$this->newline = true;
+					if ($strrest == $dom[$key]['value']) {
+						// used to avoid infinite loop
+						++$loop;
+					} else {
+						$loop = 0;
+					}
+					$dom[$key]['value'] = $strrest;
+					if ($cell) {
+						if ($this->rtl) {
+							$this->x -= $this->cell_padding['R'];
+						} else {
+							$this->x += $this->cell_padding['L'];
+						}
+					}
+					if ($loop < 3) {
+						--$key;
+					}
+				} else {
+					$loop = 0;
+					// add the positive font spacing of the last character (if any)
+					 if ($this->font_spacing > 0) {
+					 	if ($this->rtl) {
+							$this->x -= $this->font_spacing;
+						} else {
+							$this->x += $this->font_spacing;
+						}
+					}
+				}
+			}
+			++$key;
+			if (isset($dom[$key]['tag']) AND $dom[$key]['tag'] AND (!isset($dom[$key]['opening']) OR !$dom[$key]['opening']) AND isset($dom[($dom[$key]['parent'])]['attribute']['nobr']) AND ($dom[($dom[$key]['parent'])]['attribute']['nobr'] == 'true')) {
+				// check if we are on a new page or on a new column
+				if ((!$undo) AND (($this->y < $this->start_transaction_y) OR (($dom[$key]['value'] == 'tr') AND ($dom[($dom[$key]['parent'])]['endy'] < $this->start_transaction_y)))) {
+					// we are on a new page or on a new column and the total object height is less than the available vertical space.
+					// restore previous object
+					$this->rollbackTransaction(true);
+					// restore previous values
+					foreach ($this_method_vars as $vkey => $vval) {
+						$$vkey = $vval;
+					}
+					// add a page (or trig AcceptPageBreak() for multicolumn mode)
+					$pre_y = $this->y;
+					if ((!$this->checkPageBreak($this->PageBreakTrigger + 1)) AND ($this->y < $pre_y)) {
+						$startliney = $this->y;
+					}
+					$undo = true; // avoid infinite loop
+				} else {
+					$undo = false;
+				}
+			}
+		} // end for each $key
+		// align the last line
+		if (isset($startlinex)) {
+			$yshift = ($minstartliney - $startliney);
+			if (($yshift > 0) OR ($this->page > $startlinepage)) {
+				$yshift = 0;
+			}
+			$t_x = 0;
+			// the last line must be shifted to be aligned as requested
+			$linew = abs($this->endlinex - $startlinex);
+			if ($this->inxobj) {
+				// we are inside an XObject template
+				$pstart = substr($this->xobjects[$this->xobjid]['outdata'], 0, $startlinepos);
+				if (isset($opentagpos)) {
+					$midpos = $opentagpos;
+				} else {
+					$midpos = 0;
+				}
+				if ($midpos > 0) {
+					$pmid = substr($this->xobjects[$this->xobjid]['outdata'], $startlinepos, ($midpos - $startlinepos));
+					$pend = substr($this->xobjects[$this->xobjid]['outdata'], $midpos);
+				} else {
+					$pmid = substr($this->xobjects[$this->xobjid]['outdata'], $startlinepos);
+					$pend = '';
+				}
+			} else {
+				$pstart = substr($this->getPageBuffer($startlinepage), 0, $startlinepos);
+				if (isset($opentagpos) AND isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) {
+					$this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage];
+					$midpos = min($opentagpos, $this->footerpos[$startlinepage]);
+				} elseif (isset($opentagpos)) {
+					$midpos = $opentagpos;
+				} elseif (isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) {
+					$this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage];
+					$midpos = $this->footerpos[$startlinepage];
+				} else {
+					$midpos = 0;
+				}
+				if ($midpos > 0) {
+					$pmid = substr($this->getPageBuffer($startlinepage), $startlinepos, ($midpos - $startlinepos));
+					$pend = substr($this->getPageBuffer($startlinepage), $midpos);
+				} else {
+					$pmid = substr($this->getPageBuffer($startlinepage), $startlinepos);
+					$pend = '';
+				}
+			}
+			if ((isset($plalign) AND ((($plalign == 'C') OR (($plalign == 'R') AND (!$this->rtl)) OR (($plalign == 'L') AND ($this->rtl)))))) {
+				// calculate shifting amount
+				$tw = $w;
+				if ($this->lMargin != $prevlMargin) {
+					$tw += ($prevlMargin - $this->lMargin);
+				}
+				if ($this->rMargin != $prevrMargin) {
+					$tw += ($prevrMargin - $this->rMargin);
+				}
+				$one_space_width = $this->GetStringWidth(chr(32));
+				$no = 0; // number of spaces on a line contained on a single block
+				if ($this->isRTLTextDir()) { // RTL
+					// remove left space if exist
+					$pos1 = TCPDF_STATIC::revstrpos($pmid, '[(');
+					if ($pos1 > 0) {
+						$pos1 = intval($pos1);
+						if ($this->isUnicodeFont()) {
+							$pos2 = intval(TCPDF_STATIC::revstrpos($pmid, '[('.chr(0).chr(32)));
+							$spacelen = 2;
+						} else {
+							$pos2 = intval(TCPDF_STATIC::revstrpos($pmid, '[('.chr(32)));
+							$spacelen = 1;
+						}
+						if ($pos1 == $pos2) {
+							$pmid = substr($pmid, 0, ($pos1 + 2)).substr($pmid, ($pos1 + 2 + $spacelen));
+							if (substr($pmid, $pos1, 4) == '[()]') {
+								$linew -= $one_space_width;
+							} elseif ($pos1 == strpos($pmid, '[(')) {
+								$no = 1;
+							}
+						}
+					}
+				} else { // LTR
+					// remove right space if exist
+					$pos1 = TCPDF_STATIC::revstrpos($pmid, ')]');
+					if ($pos1 > 0) {
+						$pos1 = intval($pos1);
+						if ($this->isUnicodeFont()) {
+							$pos2 = intval(TCPDF_STATIC::revstrpos($pmid, chr(0).chr(32).')]')) + 2;
+							$spacelen = 2;
+						} else {
+							$pos2 = intval(TCPDF_STATIC::revstrpos($pmid, chr(32).')]')) + 1;
+							$spacelen = 1;
+						}
+						if ($pos1 == $pos2) {
+							$pmid = substr($pmid, 0, ($pos1 - $spacelen)).substr($pmid, $pos1);
+							$linew -= $one_space_width;
+						}
+					}
+				}
+				$mdiff = ($tw - $linew);
+				if ($plalign == 'C') {
+					if ($this->rtl) {
+						$t_x = -($mdiff / 2);
+					} else {
+						$t_x = ($mdiff / 2);
+					}
+				} elseif ($plalign == 'R') {
+					// right alignment on LTR document
+					$t_x = $mdiff;
+				} elseif ($plalign == 'L') {
+					// left alignment on RTL document
+					$t_x = -$mdiff;
+				}
+			} // end if startlinex
+			if (($t_x != 0) OR ($yshift < 0)) {
+				// shift the line
+				$trx = sprintf('1 0 0 1 %F %F cm', ($t_x * $this->k), ($yshift * $this->k));
+				$pstart .= "\nq\n".$trx."\n".$pmid."\nQ\n";
+				$endlinepos = strlen($pstart);
+				if ($this->inxobj) {
+					// we are inside an XObject template
+					$this->xobjects[$this->xobjid]['outdata'] = $pstart.$pend;
+					foreach ($this->xobjects[$this->xobjid]['annotations'] as $pak => $pac) {
+						if ($pak >= $pask) {
+							$this->xobjects[$this->xobjid]['annotations'][$pak]['x'] += $t_x;
+							$this->xobjects[$this->xobjid]['annotations'][$pak]['y'] -= $yshift;
+						}
+					}
+				} else {
+					$this->setPageBuffer($startlinepage, $pstart.$pend);
+					// shift the annotations and links
+					if (isset($this->PageAnnots[$this->page])) {
+						foreach ($this->PageAnnots[$this->page] as $pak => $pac) {
+							if ($pak >= $pask) {
+								$this->PageAnnots[$this->page][$pak]['x'] += $t_x;
+								$this->PageAnnots[$this->page][$pak]['y'] -= $yshift;
+							}
+						}
+					}
+				}
+				$this->y -= $yshift;
+				$yshift = 0;
+			}
+		}
+		// restore previous values
+		$this->setGraphicVars($gvars);
+		if ($this->num_columns > 1) {
+			$this->selectColumn();
+		} elseif ($this->page > $prevPage) {
+			$this->lMargin = $this->pagedim[$this->page]['olm'];
+			$this->rMargin = $this->pagedim[$this->page]['orm'];
+		}
+		// restore previous list state
+		$this->cell_height_ratio = $prev_cell_height_ratio;
+		$this->listnum = $prev_listnum;
+		$this->listordered = $prev_listordered;
+		$this->listcount = $prev_listcount;
+		$this->lispacer = $prev_lispacer;
+		if ($ln AND (!($cell AND ($dom[$key-1]['value'] == 'table')))) {
+			$this->Ln($this->lasth);
+			if ($this->y < $maxbottomliney) {
+				$this->y = $maxbottomliney;
+			}
+		}
+		unset($dom);
+	}
+
+	/**
+	 * Process opening tags.
+	 * @param $dom (array) html dom array
+	 * @param $key (int) current element id
+	 * @param $cell (boolean) if true add the default left (or right if RTL) padding to each new line (default false).
+	 * @return $dom array
+	 * @protected
+	 */
+	protected function openHTMLTagHandler($dom, $key, $cell) {
+		$tag = $dom[$key];
+		$parent = $dom[($dom[$key]['parent'])];
+		$firsttag = ($key == 1);
+		// check for text direction attribute
+		if (isset($tag['dir'])) {
+			$this->setTempRTL($tag['dir']);
+		} else {
+			$this->tmprtl = false;
+		}
+		if ($tag['block']) {
+			$hbz = 0; // distance from y to line bottom
+			$hb = 0; // vertical space between block tags
+			// calculate vertical space for block tags
+			if (isset($this->tagvspaces[$tag['value']][0]['h']) AND ($this->tagvspaces[$tag['value']][0]['h'] >= 0)) {
+				$cur_h = $this->tagvspaces[$tag['value']][0]['h'];
+			} elseif (isset($tag['fontsize'])) {
+				$cur_h = ($tag['fontsize'] / $this->k) * $this->cell_height_ratio;
+			} else {
+				$cur_h = $this->FontSize * $this->cell_height_ratio;
+			}
+			if (isset($this->tagvspaces[$tag['value']][0]['n'])) {
+				$n = $this->tagvspaces[$tag['value']][0]['n'];
+			} elseif (preg_match('/[h][0-9]/', $tag['value']) > 0) {
+				$n = 0.6;
+			} else {
+				$n = 1;
+			}
+			if ((!isset($this->tagvspaces[$tag['value']])) AND (in_array($tag['value'], array('div', 'dt', 'dd', 'li', 'br')))) {
+				$hb = 0;
+			} else {
+				$hb = ($n * $cur_h);
+			}
+			if (($this->htmlvspace <= 0) AND ($n > 0)) {
+				if (isset($parent['fontsize'])) {
+					$hbz = (($parent['fontsize'] / $this->k) * $this->cell_height_ratio);
+				} else {
+					$hbz = $this->FontSize * $this->cell_height_ratio;
+				}
+			}
+			if (isset($dom[($key - 1)]) AND ($dom[($key - 1)]['value'] == 'table')) {
+				// fix vertical space after table
+				$hbz = 0;
+			}
+		}
+		// Opening tag
+		switch($tag['value']) {
+			case 'table': {
+				$cp = 0;
+				$cs = 0;
+				$dom[$key]['rowspans'] = array();
+				if (!isset($dom[$key]['attribute']['nested']) OR ($dom[$key]['attribute']['nested'] != 'true')) {
+					$this->htmlvspace = 0;
+					// set table header
+					if (!TCPDF_STATIC::empty_string($dom[$key]['thead'])) {
+						// set table header
+						$this->thead = $dom[$key]['thead'];
+						if (!isset($this->theadMargins) OR (empty($this->theadMargins))) {
+							$this->theadMargins = array();
+							$this->theadMargins['cell_padding'] = $this->cell_padding;
+							$this->theadMargins['lmargin'] = $this->lMargin;
+							$this->theadMargins['rmargin'] = $this->rMargin;
+							$this->theadMargins['page'] = $this->page;
+							$this->theadMargins['cell'] = $cell;
+						}
+					}
+				}
+				// store current margins and page
+				$dom[$key]['old_cell_padding'] = $this->cell_padding;
+				if (isset($tag['attribute']['cellpadding'])) {
+					$pad = $this->getHTMLUnitToUnits($tag['attribute']['cellpadding'], 1, 'px');
+					$this->SetCellPadding($pad);
+				} elseif (isset($tag['padding'])) {
+					$this->cell_padding = $tag['padding'];
+				}
+				if (isset($tag['attribute']['cellspacing'])) {
+					$cs = $this->getHTMLUnitToUnits($tag['attribute']['cellspacing'], 1, 'px');
+				} elseif (isset($tag['border-spacing'])) {
+					$cs = $tag['border-spacing']['V'];
+				}
+				$prev_y = $this->y;
+				if ($this->checkPageBreak(((2 * $cp) + (2 * $cs) + $this->lasth), '', false) OR ($this->y < $prev_y)) {
+					$this->inthead = true;
+					// add a page (or trig AcceptPageBreak() for multicolumn mode)
+					$this->checkPageBreak($this->PageBreakTrigger + 1);
+				}
+				break;
+			}
+			case 'tr': {
+				// array of columns positions
+				$dom[$key]['cellpos'] = array();
+				break;
+			}
+			case 'hr': {
+				if ((isset($tag['height'])) AND ($tag['height'] != '')) {
+					$hrHeight = $this->getHTMLUnitToUnits($tag['height'], 1, 'px');
+				} else {
+					$hrHeight = $this->GetLineWidth();
+				}
+				$this->addHTMLVertSpace($hbz, ($hrHeight / 2), $cell, $firsttag);
+				$x = $this->GetX();
+				$y = $this->GetY();
+				$wtmp = $this->w - $this->lMargin - $this->rMargin;
+				if ($cell) {
+					$wtmp -= ($this->cell_padding['L'] + $this->cell_padding['R']);
+				}
+				if ((isset($tag['width'])) AND ($tag['width'] != '')) {
+					$hrWidth = $this->getHTMLUnitToUnits($tag['width'], $wtmp, 'px');
+				} else {
+					$hrWidth = $wtmp;
+				}
+				$prevlinewidth = $this->GetLineWidth();
+				$this->SetLineWidth($hrHeight);
+				$this->Line($x, $y, $x + $hrWidth, $y);
+				$this->SetLineWidth($prevlinewidth);
+				$this->addHTMLVertSpace(($hrHeight / 2), 0, $cell, !isset($dom[($key + 1)]));
+				break;
+			}
+			case 'a': {
+				if (array_key_exists('href', $tag['attribute'])) {
+					$this->HREF['url'] = $tag['attribute']['href'];
+				}
+				break;
+			}
+			case 'img': {
+				if (isset($tag['attribute']['src'])) {
+					if ($tag['attribute']['src']{0} === '@') {
+						// data stream
+						$tag['attribute']['src'] = '@'.base64_decode(substr($tag['attribute']['src'], 1));
+						$type = '';
+					} else {
+						// get image type
+						$type = TCPDF_IMAGES::getImageFileType($tag['attribute']['src']);
+					}
+					if (!isset($tag['width'])) {
+						$tag['width'] = 0;
+					}
+					if (!isset($tag['height'])) {
+						$tag['height'] = 0;
+					}
+					//if (!isset($tag['attribute']['align'])) {
+						// the only alignment supported is "bottom"
+						// further development is required for other modes.
+						$tag['attribute']['align'] = 'bottom';
+					//}
+					switch($tag['attribute']['align']) {
+						case 'top': {
+							$align = 'T';
+							break;
+						}
+						case 'middle': {
+							$align = 'M';
+							break;
+						}
+						case 'bottom': {
+							$align = 'B';
+							break;
+						}
+						default: {
+							$align = 'B';
+							break;
+						}
+					}
+					$prevy = $this->y;
+					$xpos = $this->x;
+					$imglink = '';
+					if (isset($this->HREF['url']) AND !TCPDF_STATIC::empty_string($this->HREF['url'])) {
+						$imglink = $this->HREF['url'];
+						if ($imglink{0} == '#') {
+							// convert url to internal link
+							$lnkdata = explode(',', $imglink);
+							if (isset($lnkdata[0])) {
+								$page = intval(substr($lnkdata[0], 1));
+								if (empty($page) OR ($page <= 0)) {
+									$page = $this->page;
+								}
+								if (isset($lnkdata[1]) AND (strlen($lnkdata[1]) > 0)) {
+									$lnky = floatval($lnkdata[1]);
+								} else {
+									$lnky = 0;
+								}
+								$imglink = $this->AddLink();
+								$this->SetLink($imglink, $lnky, $page);
+							}
+						}
+					}
+					$border = 0;
+					if (isset($tag['border']) AND !empty($tag['border'])) {
+						// currently only support 1 (frame) or a combination of 'LTRB'
+						$border = $tag['border'];
+					}
+					$iw = '';
+					if (isset($tag['width'])) {
+						$iw = $this->getHTMLUnitToUnits($tag['width'], 1, 'px', false);
+					}
+					$ih = '';
+					if (isset($tag['height'])) {
+						$ih = $this->getHTMLUnitToUnits($tag['height'], 1, 'px', false);
+					}
+					if (($type == 'eps') OR ($type == 'ai')) {
+						$this->ImageEps($tag['attribute']['src'], $xpos, $this->y, $iw, $ih, $imglink, true, $align, '', $border, true);
+					} elseif ($type == 'svg') {
+						$this->ImageSVG($tag['attribute']['src'], $xpos, $this->y, $iw, $ih, $imglink, $align, '', $border, true);
+					} else {
+						$this->Image($tag['attribute']['src'], $xpos, $this->y, $iw, $ih, '', $imglink, $align, false, 300, '', false, false, $border, false, false, true);
+					}
+					switch($align) {
+						case 'T': {
+							$this->y = $prevy;
+							break;
+						}
+						case 'M': {
+							$this->y = (($this->img_rb_y + $prevy - ($tag['fontsize'] / $this->k)) / 2) ;
+							break;
+						}
+						case 'B': {
+							$this->y = $this->img_rb_y - ($tag['fontsize'] / $this->k);
+							break;
+						}
+					}
+				}
+				break;
+			}
+			case 'dl': {
+				++$this->listnum;
+				if ($this->listnum == 1) {
+					$this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
+				} else {
+					$this->addHTMLVertSpace(0, 0, $cell, $firsttag);
+				}
+				break;
+			}
+			case 'dt': {
+				$this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
+				break;
+			}
+			case 'dd': {
+				if ($this->rtl) {
+					$this->rMargin += $this->listindent;
+				} else {
+					$this->lMargin += $this->listindent;
+				}
+				++$this->listindentlevel;
+				$this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
+				break;
+			}
+			case 'ul':
+			case 'ol': {
+				++$this->listnum;
+				if ($tag['value'] == 'ol') {
+					$this->listordered[$this->listnum] = true;
+				} else {
+					$this->listordered[$this->listnum] = false;
+				}
+				if (isset($tag['attribute']['start'])) {
+					$this->listcount[$this->listnum] = intval($tag['attribute']['start']) - 1;
+				} else {
+					$this->listcount[$this->listnum] = 0;
+				}
+				if ($this->rtl) {
+					$this->rMargin += $this->listindent;
+					$this->x -= $this->listindent;
+				} else {
+					$this->lMargin += $this->listindent;
+					$this->x += $this->listindent;
+				}
+				++$this->listindentlevel;
+				if ($this->listnum == 1) {
+					if ($key > 1) {
+						$this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
+					}
+				} else {
+					$this->addHTMLVertSpace(0, 0, $cell, $firsttag);
+				}
+				break;
+			}
+			case 'li': {
+				if ($key > 2) {
+					$this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
+				}
+				if ($this->listordered[$this->listnum]) {
+					// ordered item
+					if (isset($parent['attribute']['type']) AND !TCPDF_STATIC::empty_string($parent['attribute']['type'])) {
+						$this->lispacer = $parent['attribute']['type'];
+					} elseif (isset($parent['listtype']) AND !TCPDF_STATIC::empty_string($parent['listtype'])) {
+						$this->lispacer = $parent['listtype'];
+					} elseif (isset($this->lisymbol) AND !TCPDF_STATIC::empty_string($this->lisymbol)) {
+						$this->lispacer = $this->lisymbol;
+					} else {
+						$this->lispacer = '#';
+					}
+					++$this->listcount[$this->listnum];
+					if (isset($tag['attribute']['value'])) {
+						$this->listcount[$this->listnum] = intval($tag['attribute']['value']);
+					}
+				} else {
+					// unordered item
+					if (isset($parent['attribute']['type']) AND !TCPDF_STATIC::empty_string($parent['attribute']['type'])) {
+						$this->lispacer = $parent['attribute']['type'];
+					} elseif (isset($parent['listtype']) AND !TCPDF_STATIC::empty_string($parent['listtype'])) {
+						$this->lispacer = $parent['listtype'];
+					} elseif (isset($this->lisymbol) AND !TCPDF_STATIC::empty_string($this->lisymbol)) {
+						$this->lispacer = $this->lisymbol;
+					} else {
+						$this->lispacer = '!';
+					}
+				}
+				break;
+			}
+			case 'blockquote': {
+				if ($this->rtl) {
+					$this->rMargin += $this->listindent;
+				} else {
+					$this->lMargin += $this->listindent;
+				}
+				++$this->listindentlevel;
+				$this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
+				break;
+			}
+			case 'br': {
+				$this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
+				break;
+			}
+			case 'div': {
+				$this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
+				break;
+			}
+			case 'p': {
+				$this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
+				break;
+			}
+			case 'pre': {
+				$this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
+				$this->premode = true;
+				break;
+			}
+			case 'sup': {
+				$this->SetXY($this->GetX(), $this->GetY() - ((0.7 * $this->FontSizePt) / $this->k));
+				break;
+			}
+			case 'sub': {
+				$this->SetXY($this->GetX(), $this->GetY() + ((0.3 * $this->FontSizePt) / $this->k));
+				break;
+			}
+			case 'h1':
+			case 'h2':
+			case 'h3':
+			case 'h4':
+			case 'h5':
+			case 'h6': {
+				$this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
+				break;
+			}
+			// Form fields (since 4.8.000 - 2009-09-07)
+			case 'form': {
+				if (isset($tag['attribute']['action'])) {
+					$this->form_action = $tag['attribute']['action'];
+				} else {
+					$this->Error('Please explicitly set action attribute path!');
+				}
+				if (isset($tag['attribute']['enctype'])) {
+					$this->form_enctype = $tag['attribute']['enctype'];
+				} else {
+					$this->form_enctype = 'application/x-www-form-urlencoded';
+				}
+				if (isset($tag['attribute']['method'])) {
+					$this->form_mode = $tag['attribute']['method'];
+				} else {
+					$this->form_mode = 'post';
+				}
+				break;
+			}
+			case 'input': {
+				if (isset($tag['attribute']['name']) AND !TCPDF_STATIC::empty_string($tag['attribute']['name'])) {
+					$name = $tag['attribute']['name'];
+				} else {
+					break;
+				}
+				$prop = array();
+				$opt = array();
+				if (isset($tag['attribute']['readonly']) AND !TCPDF_STATIC::empty_string($tag['attribute']['readonly'])) {
+					$prop['readonly'] = true;
+				}
+				if (isset($tag['attribute']['value']) AND !TCPDF_STATIC::empty_string($tag['attribute']['value'])) {
+					$value = $tag['attribute']['value'];
+				}
+				if (isset($tag['attribute']['maxlength']) AND !TCPDF_STATIC::empty_string($tag['attribute']['maxlength'])) {
+					$opt['maxlen'] = intval($tag['attribute']['maxlength']);
+				}
+				$h = $this->FontSize * $this->cell_height_ratio;
+				if (isset($tag['attribute']['size']) AND !TCPDF_STATIC::empty_string($tag['attribute']['size'])) {
+					$w = intval($tag['attribute']['size']) * $this->GetStringWidth(chr(32)) * 2;
+				} else {
+					$w = $h;
+				}
+				if (isset($tag['attribute']['checked']) AND (($tag['attribute']['checked'] == 'checked') OR ($tag['attribute']['checked'] == 'true'))) {
+					$checked = true;
+				} else {
+					$checked = false;
+				}
+				if (isset($tag['align'])) {
+					switch ($tag['align']) {
+						case 'C': {
+							$opt['q'] = 1;
+							break;
+						}
+						case 'R': {
+							$opt['q'] = 2;
+							break;
+						}
+						case 'L':
+						default: {
+							break;
+						}
+					}
+				}
+				switch ($tag['attribute']['type']) {
+					case 'text': {
+						if (isset($value)) {
+							$opt['v'] = $value;
+						}
+						$this->TextField($name, $w, $h, $prop, $opt, '', '', false);
+						break;
+					}
+					case 'password': {
+						if (isset($value)) {
+							$opt['v'] = $value;
+						}
+						$prop['password'] = 'true';
+						$this->TextField($name, $w, $h, $prop, $opt, '', '', false);
+						break;
+					}
+					case 'checkbox': {
+						if (!isset($value)) {
+							break;
+						}
+						$this->CheckBox($name, $w, $checked, $prop, $opt, $value, '', '', false);
+						break;
+					}
+					case 'radio': {
+						if (!isset($value)) {
+							break;
+						}
+						$this->RadioButton($name, $w, $prop, $opt, $value, $checked, '', '', false);
+						break;
+					}
+					case 'submit': {
+						if (!isset($value)) {
+							$value = 'submit';
+						}
+						$w = $this->GetStringWidth($value) * 1.5;
+						$h *= 1.6;
+						$prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255));
+						$action = array();
+						$action['S'] = 'SubmitForm';
+						$action['F'] = $this->form_action;
+						if ($this->form_enctype != 'FDF') {
+							$action['Flags'] = array('ExportFormat');
+						}
+						if ($this->form_mode == 'get') {
+							$action['Flags'] = array('GetMethod');
+						}
+						$this->Button($name, $w, $h, $value, $action, $prop, $opt, '', '', false);
+						break;
+					}
+					case 'reset': {
+						if (!isset($value)) {
+							$value = 'reset';
+						}
+						$w = $this->GetStringWidth($value) * 1.5;
+						$h *= 1.6;
+						$prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255));
+						$this->Button($name, $w, $h, $value, array('S'=>'ResetForm'), $prop, $opt, '', '', false);
+						break;
+					}
+					case 'file': {
+						$prop['fileSelect'] = 'true';
+						$this->TextField($name, $w, $h, $prop, $opt, '', '', false);
+						if (!isset($value)) {
+							$value = '*';
+						}
+						$w = $this->GetStringWidth($value) * 2;
+						$h *= 1.2;
+						$prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255));
+						$jsaction = 'var f=this.getField(\''.$name.'\'); f.browseForFileToSubmit();';
+						$this->Button('FB_'.$name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false);
+						break;
+					}
+					case 'hidden': {
+						if (isset($value)) {
+							$opt['v'] = $value;
+						}
+						$opt['f'] = array('invisible', 'hidden');
+						$this->TextField($name, 0, 0, $prop, $opt, '', '', false);
+						break;
+					}
+					case 'image': {
+						// THIS TYPE MUST BE FIXED
+						if (isset($tag['attribute']['src']) AND !TCPDF_STATIC::empty_string($tag['attribute']['src'])) {
+							$img = $tag['attribute']['src'];
+						} else {
+							break;
+						}
+						$value = 'img';
+						//$opt['mk'] = array('i'=>$img, 'tp'=>1, 'if'=>array('sw'=>'A', 's'=>'A', 'fb'=>false));
+						if (isset($tag['attribute']['onclick']) AND !empty($tag['attribute']['onclick'])) {
+							$jsaction = $tag['attribute']['onclick'];
+						} else {
+							$jsaction = '';
+						}
+						$this->Button($name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false);
+						break;
+					}
+					case 'button': {
+						if (!isset($value)) {
+							$value = ' ';
+						}
+						$w = $this->GetStringWidth($value) * 1.5;
+						$h *= 1.6;
+						$prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255));
+						if (isset($tag['attribute']['onclick']) AND !empty($tag['attribute']['onclick'])) {
+							$jsaction = $tag['attribute']['onclick'];
+						} else {
+							$jsaction = '';
+						}
+						$this->Button($name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false);
+						break;
+					}
+				}
+				break;
+			}
+			case 'textarea': {
+				$prop = array();
+				$opt = array();
+				if (isset($tag['attribute']['readonly']) AND !TCPDF_STATIC::empty_string($tag['attribute']['readonly'])) {
+					$prop['readonly'] = true;
+				}
+				if (isset($tag['attribute']['name']) AND !TCPDF_STATIC::empty_string($tag['attribute']['name'])) {
+					$name = $tag['attribute']['name'];
+				} else {
+					break;
+				}
+				if (isset($tag['attribute']['value']) AND !TCPDF_STATIC::empty_string($tag['attribute']['value'])) {
+					$opt['v'] = $tag['attribute']['value'];
+				}
+				if (isset($tag['attribute']['cols']) AND !TCPDF_STATIC::empty_string($tag['attribute']['cols'])) {
+					$w = intval($tag['attribute']['cols']) * $this->GetStringWidth(chr(32)) * 2;
+				} else {
+					$w = 40;
+				}
+				if (isset($tag['attribute']['rows']) AND !TCPDF_STATIC::empty_string($tag['attribute']['rows'])) {
+					$h = intval($tag['attribute']['rows']) * $this->FontSize * $this->cell_height_ratio;
+				} else {
+					$h = 10;
+				}
+				$prop['multiline'] = 'true';
+				$this->TextField($name, $w, $h, $prop, $opt, '', '', false);
+				break;
+			}
+			case 'select': {
+				$h = $this->FontSize * $this->cell_height_ratio;
+				if (isset($tag['attribute']['size']) AND !TCPDF_STATIC::empty_string($tag['attribute']['size'])) {
+					$h *= ($tag['attribute']['size'] + 1);
+				}
+				$prop = array();
+				$opt = array();
+				if (isset($tag['attribute']['name']) AND !TCPDF_STATIC::empty_string($tag['attribute']['name'])) {
+					$name = $tag['attribute']['name'];
+				} else {
+					break;
+				}
+				$w = 0;
+				if (isset($tag['attribute']['opt']) AND !TCPDF_STATIC::empty_string($tag['attribute']['opt'])) {
+					$options = explode('#!NwL!#', $tag['attribute']['opt']);
+					$values = array();
+					foreach ($options as $val) {
+						if (strpos($val, '#!TaB!#') !== false) {
+							$opts = explode('#!TaB!#', $val);
+							$values[] = $opts;
+							$w = max($w, $this->GetStringWidth($opts[1]));
+						} else {
+							$values[] = $val;
+							$w = max($w, $this->GetStringWidth($val));
+						}
+					}
+				} else {
+					break;
+				}
+				$w *= 2;
+				if (isset($tag['attribute']['multiple']) AND ($tag['attribute']['multiple']='multiple')) {
+					$prop['multipleSelection'] = 'true';
+					$this->ListBox($name, $w, $h, $values, $prop, $opt, '', '', false);
+				} else {
+					$this->ComboBox($name, $w, $h, $values, $prop, $opt, '', '', false);
+				}
+				break;
+			}
+			case 'tcpdf': {
+				if (defined('K_TCPDF_CALLS_IN_HTML') AND (K_TCPDF_CALLS_IN_HTML === true)) {
+					// Special tag used to call TCPDF methods
+					if (isset($tag['attribute']['method'])) {
+						$tcpdf_method = $tag['attribute']['method'];
+						if (method_exists($this, $tcpdf_method)) {
+							if (isset($tag['attribute']['params']) AND (!empty($tag['attribute']['params']))) {
+								$params = unserialize(urldecode($tag['attribute']['params']));
+								call_user_func_array(array($this, $tcpdf_method), $params);
+							} else {
+								$this->$tcpdf_method();
+							}
+							$this->newline = true;
+						}
+					}
+				}
+				break;
+			}
+			default: {
+				break;
+			}
+		}
+		// define tags that support borders and background colors
+		$bordertags = array('blockquote','br','dd','dl','div','dt','h1','h2','h3','h4','h5','h6','hr','li','ol','p','pre','ul','tcpdf','table');
+		if (in_array($tag['value'], $bordertags)) {
+			// set border
+			$dom[$key]['borderposition'] = $this->getBorderStartPosition();
+		}
+		if ($dom[$key]['self'] AND isset($dom[$key]['attribute']['pagebreakafter'])) {
+			$pba = $dom[$key]['attribute']['pagebreakafter'];
+			// check for pagebreak
+			if (($pba == 'true') OR ($pba == 'left') OR ($pba == 'right')) {
+				// add a page (or trig AcceptPageBreak() for multicolumn mode)
+				$this->checkPageBreak($this->PageBreakTrigger + 1);
+			}
+			if ((($pba == 'left') AND (((!$this->rtl) AND (($this->page % 2) == 0)) OR (($this->rtl) AND (($this->page % 2) != 0))))
+				OR (($pba == 'right') AND (((!$this->rtl) AND (($this->page % 2) != 0)) OR (($this->rtl) AND (($this->page % 2) == 0))))) {
+				// add a page (or trig AcceptPageBreak() for multicolumn mode)
+				$this->checkPageBreak($this->PageBreakTrigger + 1);
+			}
+		}
+		return $dom;
+	}
+
+	/**
+	 * Process closing tags.
+	 * @param $dom (array) html dom array
+	 * @param $key (int) current element id
+	 * @param $cell (boolean) if true add the default left (or right if RTL) padding to each new line (default false).
+	 * @param $maxbottomliney (int) maximum y value of current line
+	 * @return $dom array
+	 * @protected
+	 */
+	protected function closeHTMLTagHandler($dom, $key, $cell, $maxbottomliney=0) {
+		$tag = $dom[$key];
+		$parent = $dom[($dom[$key]['parent'])];
+		$lasttag = ((!isset($dom[($key + 1)])) OR ((!isset($dom[($key + 2)])) AND ($dom[($key + 1)]['value'] == 'marker')));
+		$in_table_head = false;
+		// maximum x position (used to draw borders)
+		if ($this->rtl) {
+			$xmax = $this->w;
+		} else {
+			$xmax = 0;
+		}
+		if ($tag['block']) {
+			$hbz = 0; // distance from y to line bottom
+			$hb = 0; // vertical space between block tags
+			// calculate vertical space for block tags
+			if (isset($this->tagvspaces[$tag['value']][1]['h']) AND ($this->tagvspaces[$tag['value']][1]['h'] >= 0)) {
+				$pre_h = $this->tagvspaces[$tag['value']][1]['h'];
+			} elseif (isset($parent['fontsize'])) {
+				$pre_h = (($parent['fontsize'] / $this->k) * $this->cell_height_ratio);
+			} else {
+				$pre_h = $this->FontSize * $this->cell_height_ratio;
+			}
+			if (isset($this->tagvspaces[$tag['value']][1]['n'])) {
+				$n = $this->tagvspaces[$tag['value']][1]['n'];
+			} elseif (preg_match('/[h][0-9]/', $tag['value']) > 0) {
+				$n = 0.6;
+			} else {
+				$n = 1;
+			}
+			if ((!isset($this->tagvspaces[$tag['value']])) AND ($tag['value'] == 'div')) {
+				$hb = 0;
+			} else {
+				$hb = ($n * $pre_h);
+			}
+			if ($maxbottomliney > $this->PageBreakTrigger) {
+				$hbz = ($this->FontSize * $this->cell_height_ratio);
+			} elseif ($this->y < $maxbottomliney) {
+				$hbz = ($maxbottomliney - $this->y);
+			}
+		}
+		// Closing tag
+		switch($tag['value']) {
+			case 'tr': {
+				$table_el = $dom[($dom[$key]['parent'])]['parent'];
+				if (!isset($parent['endy'])) {
+					$dom[($dom[$key]['parent'])]['endy'] = $this->y;
+					$parent['endy'] = $this->y;
+				}
+				if (!isset($parent['endpage'])) {
+					$dom[($dom[$key]['parent'])]['endpage'] = $this->page;
+					$parent['endpage'] = $this->page;
+				}
+				if (!isset($parent['endcolumn'])) {
+					$dom[($dom[$key]['parent'])]['endcolumn'] = $this->current_column;
+					$parent['endcolumn'] = $this->current_column;
+				}
+				// update row-spanned cells
+				if (isset($dom[$table_el]['rowspans'])) {
+					foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) {
+						$dom[$table_el]['rowspans'][$k]['rowspan'] -= 1;
+						if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) {
+							if (($dom[$table_el]['rowspans'][$k]['endpage'] == $parent['endpage']) AND ($dom[$table_el]['rowspans'][$k]['endcolumn'] == $parent['endcolumn'])) {
+								$dom[($dom[$key]['parent'])]['endy'] = max($dom[$table_el]['rowspans'][$k]['endy'], $parent['endy']);
+							} elseif (($dom[$table_el]['rowspans'][$k]['endpage'] > $parent['endpage']) OR ($dom[$table_el]['rowspans'][$k]['endcolumn'] > $parent['endcolumn'])) {
+								$dom[($dom[$key]['parent'])]['endy'] = $dom[$table_el]['rowspans'][$k]['endy'];
+								$dom[($dom[$key]['parent'])]['endpage'] = $dom[$table_el]['rowspans'][$k]['endpage'];
+								$dom[($dom[$key]['parent'])]['endcolumn'] = $dom[$table_el]['rowspans'][$k]['endcolumn'];
+							}
+						}
+					}
+					// report new endy and endpage to the rowspanned cells
+					foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) {
+						if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) {
+							$dom[$table_el]['rowspans'][$k]['endpage'] = max($dom[$table_el]['rowspans'][$k]['endpage'], $dom[($dom[$key]['parent'])]['endpage']);
+							$dom[($dom[$key]['parent'])]['endpage'] = $dom[$table_el]['rowspans'][$k]['endpage'];
+							$dom[$table_el]['rowspans'][$k]['endcolumn'] = max($dom[$table_el]['rowspans'][$k]['endcolumn'], $dom[($dom[$key]['parent'])]['endcolumn']);
+							$dom[($dom[$key]['parent'])]['endcolumn'] = $dom[$table_el]['rowspans'][$k]['endcolumn'];
+							$dom[$table_el]['rowspans'][$k]['endy'] = max($dom[$table_el]['rowspans'][$k]['endy'], $dom[($dom[$key]['parent'])]['endy']);
+							$dom[($dom[$key]['parent'])]['endy'] = $dom[$table_el]['rowspans'][$k]['endy'];
+						}
+					}
+					// update remaining rowspanned cells
+					foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) {
+						if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) {
+							$dom[$table_el]['rowspans'][$k]['endpage'] = $dom[($dom[$key]['parent'])]['endpage'];
+							$dom[$table_el]['rowspans'][$k]['endcolumn'] = $dom[($dom[$key]['parent'])]['endcolumn'];
+							$dom[$table_el]['rowspans'][$k]['endy'] = $dom[($dom[$key]['parent'])]['endy'];
+						}
+					}
+				}
+				$this->setPage($dom[($dom[$key]['parent'])]['endpage']);
+				if ($this->num_columns > 1) {
+					$this->selectColumn($dom[($dom[$key]['parent'])]['endcolumn']);
+				}
+				$this->y = $dom[($dom[$key]['parent'])]['endy'];
+				if (isset($dom[$table_el]['attribute']['cellspacing'])) {
+					$this->y += $this->getHTMLUnitToUnits($dom[$table_el]['attribute']['cellspacing'], 1, 'px');
+				} elseif (isset($dom[$table_el]['border-spacing'])) {
+					$this->y += $dom[$table_el]['border-spacing']['V'];
+				}
+				$this->Ln(0, $cell);
+				if ($this->current_column == $parent['startcolumn']) {
+					$this->x = $parent['startx'];
+				}
+				// account for booklet mode
+				if ($this->page > $parent['startpage']) {
+					if (($this->rtl) AND ($this->pagedim[$this->page]['orm'] != $this->pagedim[$parent['startpage']]['orm'])) {
+						$this->x -= ($this->pagedim[$this->page]['orm'] - $this->pagedim[$parent['startpage']]['orm']);
+					} elseif ((!$this->rtl) AND ($this->pagedim[$this->page]['olm'] != $this->pagedim[$parent['startpage']]['olm'])) {
+						$this->x += ($this->pagedim[$this->page]['olm'] - $this->pagedim[$parent['startpage']]['olm']);
+					}
+				}
+				break;
+			}
+			case 'tablehead':
+				// closing tag used for the thead part
+				$in_table_head = true;
+				$this->inthead = false;
+			case 'table': {
+				$table_el = $parent;
+				// set default border
+				if (isset($table_el['attribute']['border']) AND ($table_el['attribute']['border'] > 0)) {
+					// set default border
+					$border = array('LTRB' => array('width' => $this->getCSSBorderWidth($table_el['attribute']['border']), 'cap'=>'square', 'join'=>'miter', 'dash'=> 0, 'color'=>array(0,0,0)));
+				} else {
+					$border = 0;
+				}
+				$default_border = $border;
+				// fix bottom line alignment of last line before page break
+				foreach ($dom[($dom[$key]['parent'])]['trids'] as $j => $trkey) {
+					// update row-spanned cells
+					if (isset($dom[($dom[$key]['parent'])]['rowspans'])) {
+						foreach ($dom[($dom[$key]['parent'])]['rowspans'] as $k => $trwsp) {
+							if (isset($prevtrkey) AND ($trwsp['trid'] == $prevtrkey) AND ($trwsp['mrowspan'] > 0)) {
+								$dom[($dom[$key]['parent'])]['rowspans'][$k]['trid'] = $trkey;
+							}
+							if ($dom[($dom[$key]['parent'])]['rowspans'][$k]['trid'] == $trkey) {
+								$dom[($dom[$key]['parent'])]['rowspans'][$k]['mrowspan'] -= 1;
+							}
+						}
+					}
+					if (isset($prevtrkey) AND ($dom[$trkey]['startpage'] > $dom[$prevtrkey]['endpage'])) {
+						$pgendy = $this->pagedim[$dom[$prevtrkey]['endpage']]['hk'] - $this->pagedim[$dom[$prevtrkey]['endpage']]['bm'];
+						$dom[$prevtrkey]['endy'] = $pgendy;
+						// update row-spanned cells
+						if (isset($dom[($dom[$key]['parent'])]['rowspans'])) {
+							foreach ($dom[($dom[$key]['parent'])]['rowspans'] as $k => $trwsp) {
+								if (($trwsp['trid'] == $trkey) AND ($trwsp['mrowspan'] > 1) AND ($trwsp['endpage'] == $dom[$prevtrkey]['endpage'])) {
+									$dom[($dom[$key]['parent'])]['rowspans'][$k]['endy'] = $pgendy;
+									$dom[($dom[$key]['parent'])]['rowspans'][$k]['mrowspan'] = -1;
+								}
+							}
+						}
+					}
+					$prevtrkey = $trkey;
+					$table_el = $dom[($dom[$key]['parent'])];
+				}
+				// for each row
+				if (count($table_el['trids']) > 0) {
+					unset($xmax);
+				}
+				foreach ($table_el['trids'] as $j => $trkey) {
+					$parent = $dom[$trkey];
+					if (!isset($xmax)) {
+						$xmax = $parent['cellpos'][(count($parent['cellpos']) - 1)]['endx'];
+					}
+					// for each cell on the row
+					foreach ($parent['cellpos'] as $k => $cellpos) {
+						if (isset($cellpos['rowspanid']) AND ($cellpos['rowspanid'] >= 0)) {
+							$cellpos['startx'] = $table_el['rowspans'][($cellpos['rowspanid'])]['startx'];
+							$cellpos['endx'] = $table_el['rowspans'][($cellpos['rowspanid'])]['endx'];
+							$endy = $table_el['rowspans'][($cellpos['rowspanid'])]['endy'];
+							$startpage = $table_el['rowspans'][($cellpos['rowspanid'])]['startpage'];
+							$endpage = $table_el['rowspans'][($cellpos['rowspanid'])]['endpage'];
+							$startcolumn = $table_el['rowspans'][($cellpos['rowspanid'])]['startcolumn'];
+							$endcolumn = $table_el['rowspans'][($cellpos['rowspanid'])]['endcolumn'];
+						} else {
+							$endy = $parent['endy'];
+							$startpage = $parent['startpage'];
+							$endpage = $parent['endpage'];
+							$startcolumn = $parent['startcolumn'];
+							$endcolumn = $parent['endcolumn'];
+						}
+						if ($this->num_columns == 0) {
+							$this->num_columns = 1;
+						}
+						if (isset($cellpos['border'])) {
+							$border = $cellpos['border'];
+						}
+						if (isset($cellpos['bgcolor']) AND ($cellpos['bgcolor']) !== false) {
+							$this->SetFillColorArray($cellpos['bgcolor']);
+							$fill = true;
+						} else {
+							$fill = false;
+						}
+						$x = $cellpos['startx'];
+						$y = $parent['starty'];
+						$starty = $y;
+						$w = abs($cellpos['endx'] - $cellpos['startx']);
+						// get border modes
+						$border_start = TCPDF_STATIC::getBorderMode($border, $position='start', $this->opencell);
+						$border_end = TCPDF_STATIC::getBorderMode($border, $position='end', $this->opencell);
+						$border_middle = TCPDF_STATIC::getBorderMode($border, $position='middle', $this->opencell);
+						// design borders around HTML cells.
+						for ($page = $startpage; $page <= $endpage; ++$page) { // for each page
+							$ccode = '';
+							$this->setPage($page);
+							if ($this->num_columns < 2) {
+								// single-column mode
+								$this->x = $x;
+								$this->y = $this->tMargin;
+							}
+							// account for margin changes
+							if ($page > $startpage) {
+								if (($this->rtl) AND ($this->pagedim[$page]['orm'] != $this->pagedim[$startpage]['orm'])) {
+									$this->x -= ($this->pagedim[$page]['orm'] - $this->pagedim[$startpage]['orm']);
+								} elseif ((!$this->rtl) AND ($this->pagedim[$page]['olm'] != $this->pagedim[$startpage]['olm'])) {
+									$this->x += ($this->pagedim[$page]['olm'] - $this->pagedim[$startpage]['olm']);
+								}
+							}
+							if ($startpage == $endpage) { // single page
+								$deltacol = 0;
+								$deltath = 0;
+								for ($column = $startcolumn; $column <= $endcolumn; ++$column) { // for each column
+									$this->selectColumn($column);
+									if ($startcolumn == $endcolumn) { // single column
+										$cborder = $border;
+										$h = $endy - $parent['starty'];
+										$this->y = $y;
+										$this->x = $x;
+									} elseif ($column == $startcolumn) { // first column
+										$cborder = $border_start;
+										$this->y = $starty;
+										$this->x = $x;
+										$h = $this->h - $this->y - $this->bMargin;
+										if ($this->rtl) {
+											$deltacol = $this->x + $this->rMargin - $this->w;
+										} else {
+											$deltacol = $this->x - $this->lMargin;
+										}
+									} elseif ($column == $endcolumn) { // end column
+										$cborder = $border_end;
+										if (isset($this->columns[$column]['th']['\''.$page.'\''])) {
+											$this->y = $this->columns[$column]['th']['\''.$page.'\''];
+										}
+										$this->x += $deltacol;
+										$h = $endy - $this->y;
+									} else { // middle column
+										$cborder = $border_middle;
+										if (isset($this->columns[$column]['th']['\''.$page.'\''])) {
+											$this->y = $this->columns[$column]['th']['\''.$page.'\''];
+										}
+										$this->x += $deltacol;
+										$h = $this->h - $this->y - $this->bMargin;
+									}
+									$ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n";
+								} // end for each column
+							} elseif ($page == $startpage) { // first page
+								$deltacol = 0;
+								$deltath = 0;
+								for ($column = $startcolumn; $column < $this->num_columns; ++$column) { // for each column
+									$this->selectColumn($column);
+									if ($column == $startcolumn) { // first column
+										$cborder = $border_start;
+										$this->y = $starty;
+										$this->x = $x;
+										$h = $this->h - $this->y - $this->bMargin;
+										if ($this->rtl) {
+											$deltacol = $this->x + $this->rMargin - $this->w;
+										} else {
+											$deltacol = $this->x - $this->lMargin;
+										}
+									} else { // middle column
+										$cborder = $border_middle;
+										if (isset($this->columns[$column]['th']['\''.$page.'\''])) {
+											$this->y = $this->columns[$column]['th']['\''.$page.'\''];
+										}
+										$this->x += $deltacol;
+										$h = $this->h - $this->y - $this->bMargin;
+									}
+									$ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n";
+								} // end for each column
+							} elseif ($page == $endpage) { // last page
+								$deltacol = 0;
+								$deltath = 0;
+								for ($column = 0; $column <= $endcolumn; ++$column) { // for each column
+									$this->selectColumn($column);
+									if ($column == $endcolumn) { // end column
+										$cborder = $border_end;
+										if (isset($this->columns[$column]['th']['\''.$page.'\''])) {
+											$this->y = $this->columns[$column]['th']['\''.$page.'\''];
+										}
+										$this->x += $deltacol;
+										$h = $endy - $this->y;
+									} else { // middle column
+										$cborder = $border_middle;
+										if (isset($this->columns[$column]['th']['\''.$page.'\''])) {
+											$this->y = $this->columns[$column]['th']['\''.$page.'\''];
+										}
+										$this->x += $deltacol;
+										$h = $this->h - $this->y - $this->bMargin;
+									}
+									$ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n";
+								} // end for each column
+							} else { // middle page
+								$deltacol = 0;
+								$deltath = 0;
+								for ($column = 0; $column < $this->num_columns; ++$column) { // for each column
+									$this->selectColumn($column);
+									$cborder = $border_middle;
+									if (isset($this->columns[$column]['th']['\''.$page.'\''])) {
+										$this->y = $this->columns[$column]['th']['\''.$page.'\''];
+									}
+									$this->x += $deltacol;
+									$h = $this->h - $this->y - $this->bMargin;
+									$ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n";
+								} // end for each column
+							}
+							if ($cborder OR $fill) {
+								$offsetlen = strlen($ccode);
+								// draw border and fill
+								if ($this->inxobj) {
+									// we are inside an XObject template
+									if (end($this->xobjects[$this->xobjid]['transfmrk']) !== false) {
+										$pagemarkkey = key($this->xobjects[$this->xobjid]['transfmrk']);
+										$pagemark = $this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey];
+										$this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey] += $offsetlen;
+									} else {
+										$pagemark = $this->xobjects[$this->xobjid]['intmrk'];
+										$this->xobjects[$this->xobjid]['intmrk'] += $offsetlen;
+									}
+									$pagebuff = $this->xobjects[$this->xobjid]['outdata'];
+									$pstart = substr($pagebuff, 0, $pagemark);
+									$pend = substr($pagebuff, $pagemark);
+									$this->xobjects[$this->xobjid]['outdata'] = $pstart.$ccode.$pend;
+								} else {
+									// draw border and fill
+									if (end($this->transfmrk[$this->page]) !== false) {
+										$pagemarkkey = key($this->transfmrk[$this->page]);
+										$pagemark = $this->transfmrk[$this->page][$pagemarkkey];
+									} elseif ($this->InFooter) {
+										$pagemark = $this->footerpos[$this->page];
+									} else {
+										$pagemark = $this->intmrk[$this->page];
+									}
+									$pagebuff = $this->getPageBuffer($this->page);
+									$pstart = substr($pagebuff, 0, $pagemark);
+									$pend = substr($pagebuff, $pagemark);
+									$this->setPageBuffer($this->page, $pstart.$ccode.$pend);
+								}
+							}
+						} // end for each page
+						// restore default border
+						$border = $default_border;
+					} // end for each cell on the row
+					if (isset($table_el['attribute']['cellspacing'])) {
+						$this->y += $this->getHTMLUnitToUnits($table_el['attribute']['cellspacing'], 1, 'px');
+					} elseif (isset($table_el['border-spacing'])) {
+						$this->y += $table_el['border-spacing']['V'];
+					}
+					$this->Ln(0, $cell);
+					$this->x = $parent['startx'];
+					if ($endpage > $startpage) {
+						if (($this->rtl) AND ($this->pagedim[$endpage]['orm'] != $this->pagedim[$startpage]['orm'])) {
+							$this->x += ($this->pagedim[$endpage]['orm'] - $this->pagedim[$startpage]['orm']);
+						} elseif ((!$this->rtl) AND ($this->pagedim[$endpage]['olm'] != $this->pagedim[$startpage]['olm'])) {
+							$this->x += ($this->pagedim[$endpage]['olm'] - $this->pagedim[$startpage]['olm']);
+						}
+					}
+				}
+				if (!$in_table_head) { // we are not inside a thead section
+					$this->cell_padding = $table_el['old_cell_padding'];
+					// reset row height
+					$this->resetLastH();
+					if (($this->page == ($this->numpages - 1)) AND ($this->pageopen[$this->numpages])) {
+						$plendiff = ($this->pagelen[$this->numpages] - $this->emptypagemrk[$this->numpages]);
+						if (($plendiff > 0) AND ($plendiff < 60)) {
+							$pagediff = substr($this->getPageBuffer($this->numpages), $this->emptypagemrk[$this->numpages], $plendiff);
+							if (substr($pagediff, 0, 5) == 'BT /F') {
+								// the difference is only a font setting
+								$plendiff = 0;
+							}
+						}
+						if ($plendiff == 0) {
+							// remove last blank page
+							$this->deletePage($this->numpages);
+						}
+					}
+					if (isset($this->theadMargins['top'])) {
+						// restore top margin
+						$this->tMargin = $this->theadMargins['top'];
+					}
+					if (!isset($table_el['attribute']['nested']) OR ($table_el['attribute']['nested'] != 'true')) {
+						// reset main table header
+						$this->thead = '';
+						$this->theadMargins = array();
+						$this->pagedim[$this->page]['tm'] = $this->tMargin;
+					}
+				}
+				$parent = $table_el;
+				break;
+			}
+			case 'a': {
+				$this->HREF = '';
+				break;
+			}
+			case 'sup': {
+				$this->SetXY($this->GetX(), $this->GetY() + ((0.7 * $parent['fontsize']) / $this->k));
+				break;
+			}
+			case 'sub': {
+				$this->SetXY($this->GetX(), $this->GetY() - ((0.3 * $parent['fontsize']) / $this->k));
+				break;
+			}
+			case 'div': {
+				$this->addHTMLVertSpace($hbz, $hb, $cell, false, $lasttag);
+				break;
+			}
+			case 'blockquote': {
+				if ($this->rtl) {
+					$this->rMargin -= $this->listindent;
+				} else {
+					$this->lMargin -= $this->listindent;
+				}
+				--$this->listindentlevel;
+				$this->addHTMLVertSpace($hbz, $hb, $cell, false, $lasttag);
+				break;
+			}
+			case 'p': {
+				$this->addHTMLVertSpace($hbz, $hb, $cell, false, $lasttag);
+				break;
+			}
+			case 'pre': {
+				$this->addHTMLVertSpace($hbz, $hb, $cell, false, $lasttag);
+				$this->premode = false;
+				break;
+			}
+			case 'dl': {
+				--$this->listnum;
+				if ($this->listnum <= 0) {
+					$this->listnum = 0;
+					$this->addHTMLVertSpace($hbz, $hb, $cell, false, $lasttag);
+				} else {
+					$this->addHTMLVertSpace(0, 0, $cell, false, $lasttag);
+				}
+				$this->resetLastH();
+				break;
+			}
+			case 'dt': {
+				$this->lispacer = '';
+				$this->addHTMLVertSpace(0, 0, $cell, false, $lasttag);
+				break;
+			}
+			case 'dd': {
+				$this->lispacer = '';
+				if ($this->rtl) {
+					$this->rMargin -= $this->listindent;
+				} else {
+					$this->lMargin -= $this->listindent;
+				}
+				--$this->listindentlevel;
+				$this->addHTMLVertSpace(0, 0, $cell, false, $lasttag);
+				break;
+			}
+			case 'ul':
+			case 'ol': {
+				--$this->listnum;
+				$this->lispacer = '';
+				if ($this->rtl) {
+					$this->rMargin -= $this->listindent;
+				} else {
+					$this->lMargin -= $this->listindent;
+				}
+				--$this->listindentlevel;
+				if ($this->listnum <= 0) {
+					$this->listnum = 0;
+					$this->addHTMLVertSpace($hbz, $hb, $cell, false, $lasttag);
+				} else {
+					$this->addHTMLVertSpace(0, 0, $cell, false, $lasttag);
+				}
+				$this->resetLastH();
+				break;
+			}
+			case 'li': {
+				$this->lispacer = '';
+				$this->addHTMLVertSpace(0, 0, $cell, false, $lasttag);
+				break;
+			}
+			case 'h1':
+			case 'h2':
+			case 'h3':
+			case 'h4':
+			case 'h5':
+			case 'h6': {
+				$this->addHTMLVertSpace($hbz, $hb, $cell, false, $lasttag);
+				break;
+			}
+			// Form fields (since 4.8.000 - 2009-09-07)
+			case 'form': {
+				$this->form_action = '';
+				$this->form_enctype = 'application/x-www-form-urlencoded';
+				break;
+			}
+			default : {
+				break;
+			}
+		}
+		// draw border and background (if any)
+		$this->drawHTMLTagBorder($parent, $xmax);
+		if (isset($dom[($dom[$key]['parent'])]['attribute']['pagebreakafter'])) {
+			$pba = $dom[($dom[$key]['parent'])]['attribute']['pagebreakafter'];
+			// check for pagebreak
+			if (($pba == 'true') OR ($pba == 'left') OR ($pba == 'right')) {
+				// add a page (or trig AcceptPageBreak() for multicolumn mode)
+				$this->checkPageBreak($this->PageBreakTrigger + 1);
+			}
+			if ((($pba == 'left') AND (((!$this->rtl) AND (($this->page % 2) == 0)) OR (($this->rtl) AND (($this->page % 2) != 0))))
+				OR (($pba == 'right') AND (((!$this->rtl) AND (($this->page % 2) != 0)) OR (($this->rtl) AND (($this->page % 2) == 0))))) {
+				// add a page (or trig AcceptPageBreak() for multicolumn mode)
+				$this->checkPageBreak($this->PageBreakTrigger + 1);
+			}
+		}
+		$this->tmprtl = false;
+		return $dom;
+	}
+
+	/**
+	 * Add vertical spaces if needed.
+	 * @param $hbz (string) Distance between current y and line bottom.
+	 * @param $hb (string) The height of the break.
+	 * @param $cell (boolean) if true add the default left (or right if RTL) padding to each new line (default false).
+	 * @param $firsttag (boolean) set to true when the tag is the first.
+	 * @param $lasttag (boolean) set to true when the tag is the last.
+	 * @protected
+	 */
+	protected function addHTMLVertSpace($hbz=0, $hb=0, $cell=false, $firsttag=false, $lasttag=false) {
+		if ($firsttag) {
+			$this->Ln(0, $cell);
+			$this->htmlvspace = 0;
+			return;
+		}
+		if ($lasttag) {
+			$this->Ln($hbz, $cell);
+			$this->htmlvspace = 0;
+			return;
+		}
+		if ($hb < $this->htmlvspace) {
+			$hd = 0;
+		} else {
+			$hd = $hb - $this->htmlvspace;
+			$this->htmlvspace = $hb;
+		}
+		$this->Ln(($hbz + $hd), $cell);
+	}
+
+	/**
+	 * Return the starting coordinates to draw an html border
+	 * @return array containing top-left border coordinates
+	 * @protected
+	 * @since 5.7.000 (2010-08-03)
+	 */
+	protected function getBorderStartPosition() {
+		if ($this->rtl) {
+			$xmax = $this->lMargin;
+		} else {
+			$xmax = $this->w - $this->rMargin;
+		}
+		return array('page' => $this->page, 'column' => $this->current_column, 'x' => $this->x, 'y' => $this->y, 'xmax' => $xmax);
+	}
+
+	/**
+	 * Draw an HTML block border and fill
+	 * @param $tag (array) array of tag properties.
+	 * @param $xmax (int) end X coordinate for border.
+	 * @protected
+	 * @since 5.7.000 (2010-08-03)
+	 */
+	protected function drawHTMLTagBorder($tag, $xmax) {
+		if (!isset($tag['borderposition'])) {
+			// nothing to draw
+			return;
+		}
+		$prev_x = $this->x;
+		$prev_y = $this->y;
+		$prev_lasth = $this->lasth;
+		$border = 0;
+		$fill = false;
+		$this->lasth = 0;
+		if (isset($tag['border']) AND !empty($tag['border'])) {
+			// get border style
+			$border = $tag['border'];
+			if (!TCPDF_STATIC::empty_string($this->thead) AND (!$this->inthead)) {
+				// border for table header
+				$border = TCPDF_STATIC::getBorderMode($border, $position='middle', $this->opencell);
+			}
+		}
+		if (isset($tag['bgcolor']) AND ($tag['bgcolor'] !== false)) {
+			// get background color
+			$old_bgcolor = $this->bgcolor;
+			$this->SetFillColorArray($tag['bgcolor']);
+			$fill = true;
+		}
+		if (!$border AND !$fill) {
+			// nothing to draw
+			return;
+		}
+		if (isset($tag['attribute']['cellspacing'])) {
+			$clsp = $this->getHTMLUnitToUnits($tag['attribute']['cellspacing'], 1, 'px');
+			$cellspacing = array('H' => $clsp, 'V' => $clsp);
+		} elseif (isset($tag['border-spacing'])) {
+			$cellspacing = $tag['border-spacing'];
+		} else {
+			$cellspacing = array('H' => 0, 'V' => 0);
+		}
+		if (($tag['value'] != 'table') AND (is_array($border)) AND (!empty($border))) {
+			// draw the border externally respect the sqare edge.
+			$border['mode'] = 'ext';
+		}
+		if ($this->rtl) {
+			if ($xmax >= $tag['borderposition']['x']) {
+				$xmax = $tag['borderposition']['xmax'];
+			}
+			$w = ($tag['borderposition']['x'] - $xmax);
+		} else {
+			if ($xmax <= $tag['borderposition']['x']) {
+				$xmax = $tag['borderposition']['xmax'];
+			}
+			$w = ($xmax - $tag['borderposition']['x']);
+		}
+		if ($w <= 0) {
+			return;
+		}
+		$w += $cellspacing['H'];
+		$startpage = $tag['borderposition']['page'];
+		$startcolumn = $tag['borderposition']['column'];
+		$x = $tag['borderposition']['x'];
+		$y = $tag['borderposition']['y'];
+		$endpage = $this->page;
+		$starty = $tag['borderposition']['y'] - $cellspacing['V'];
+		$currentY = $this->y;
+		$this->x = $x;
+		// get latest column
+		$endcolumn = $this->current_column;
+		if ($this->num_columns == 0) {
+			$this->num_columns = 1;
+		}
+		// get border modes
+		$border_start = TCPDF_STATIC::getBorderMode($border, $position='start', $this->opencell);
+		$border_end = TCPDF_STATIC::getBorderMode($border, $position='end', $this->opencell);
+		$border_middle = TCPDF_STATIC::getBorderMode($border, $position='middle', $this->opencell);
+		// temporary disable page regions
+		$temp_page_regions = $this->page_regions;
+		$this->page_regions = array();
+		// design borders around HTML cells.
+		for ($page = $startpage; $page <= $endpage; ++$page) { // for each page
+			$ccode = '';
+			$this->setPage($page);
+			if ($this->num_columns < 2) {
+				// single-column mode
+				$this->x = $x;
+				$this->y = $this->tMargin;
+			}
+			// account for margin changes
+			if ($page > $startpage) {
+				if (($this->rtl) AND ($this->pagedim[$page]['orm'] != $this->pagedim[$startpage]['orm'])) {
+					$this->x -= ($this->pagedim[$page]['orm'] - $this->pagedim[$startpage]['orm']);
+				} elseif ((!$this->rtl) AND ($this->pagedim[$page]['olm'] != $this->pagedim[$startpage]['olm'])) {
+					$this->x += ($this->pagedim[$page]['olm'] - $this->pagedim[$startpage]['olm']);
+				}
+			}
+			if ($startpage == $endpage) {
+				// single page
+				for ($column = $startcolumn; $column <= $endcolumn; ++$column) { // for each column
+					$this->selectColumn($column);
+					if ($startcolumn == $endcolumn) { // single column
+						$cborder = $border;
+						$h = ($currentY - $y) + $cellspacing['V'];
+						$this->y = $starty;
+					} elseif ($column == $startcolumn) { // first column
+						$cborder = $border_start;
+						$this->y = $starty;
+						$h = $this->h - $this->y - $this->bMargin;
+					} elseif ($column == $endcolumn) { // end column
+						$cborder = $border_end;
+						$h = $currentY - $this->y;
+					} else { // middle column
+						$cborder = $border_middle;
+						$h = $this->h - $this->y - $this->bMargin;
+					}
+					$ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n";
+				} // end for each column
+			} elseif ($page == $startpage) { // first page
+				for ($column = $startcolumn; $column < $this->num_columns; ++$column) { // for each column
+					$this->selectColumn($column);
+					if ($column == $startcolumn) { // first column
+						$cborder = $border_start;
+						$this->y = $starty;
+						$h = $this->h - $this->y - $this->bMargin;
+					} else { // middle column
+						$cborder = $border_middle;
+						$h = $this->h - $this->y - $this->bMargin;
+					}
+					$ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n";
+				} // end for each column
+			} elseif ($page == $endpage) { // last page
+				for ($column = 0; $column <= $endcolumn; ++$column) { // for each column
+					$this->selectColumn($column);
+					if ($column == $endcolumn) {
+						// end column
+						$cborder = $border_end;
+						$h = $currentY - $this->y;
+					} else {
+						// middle column
+						$cborder = $border_middle;
+						$h = $this->h - $this->y - $this->bMargin;
+					}
+					$ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n";
+				} // end for each column
+			} else { // middle page
+				for ($column = 0; $column < $this->num_columns; ++$column) { // for each column
+					$this->selectColumn($column);
+					$cborder = $border_middle;
+					$h = $this->h - $this->y - $this->bMargin;
+					$ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true)."\n";
+				} // end for each column
+			}
+			if ($cborder OR $fill) {
+				$offsetlen = strlen($ccode);
+				// draw border and fill
+				if ($this->inxobj) {
+					// we are inside an XObject template
+					if (end($this->xobjects[$this->xobjid]['transfmrk']) !== false) {
+						$pagemarkkey = key($this->xobjects[$this->xobjid]['transfmrk']);
+						$pagemark = $this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey];
+						$this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey] += $offsetlen;
+					} else {
+						$pagemark = $this->xobjects[$this->xobjid]['intmrk'];
+						$this->xobjects[$this->xobjid]['intmrk'] += $offsetlen;
+					}
+					$pagebuff = $this->xobjects[$this->xobjid]['outdata'];
+					$pstart = substr($pagebuff, 0, $pagemark);
+					$pend = substr($pagebuff, $pagemark);
+					$this->xobjects[$this->xobjid]['outdata'] = $pstart.$ccode.$pend;
+				} else {
+					if (end($this->transfmrk[$this->page]) !== false) {
+						$pagemarkkey = key($this->transfmrk[$this->page]);
+						$pagemark = $this->transfmrk[$this->page][$pagemarkkey];
+					} elseif ($this->InFooter) {
+						$pagemark = $this->footerpos[$this->page];
+					} else {
+						$pagemark = $this->intmrk[$this->page];
+					}
+					$pagebuff = $this->getPageBuffer($this->page);
+					$pstart = substr($pagebuff, 0, $pagemark);
+					$pend = substr($pagebuff, $pagemark);
+					$this->setPageBuffer($this->page, $pstart.$ccode.$pend);
+					$this->bordermrk[$this->page] += $offsetlen;
+					$this->cntmrk[$this->page] += $offsetlen;
+				}
+			}
+		} // end for each page
+		// restore page regions
+		$this->page_regions = $temp_page_regions;
+		if (isset($old_bgcolor)) {
+			// restore background color
+			$this->SetFillColorArray($old_bgcolor);
+		}
+		// restore pointer position
+		$this->x = $prev_x;
+		$this->y = $prev_y;
+		$this->lasth = $prev_lasth;
+	}
+
+	/**
+	 * Set the default bullet to be used as LI bullet symbol
+	 * @param $symbol (string) character or string to be used (legal values are: '' = automatic, '!' = auto bullet, '#' = auto numbering, 'disc', 'disc', 'circle', 'square', '1', 'decimal', 'decimal-leading-zero', 'i', 'lower-roman', 'I', 'upper-roman', 'a', 'lower-alpha', 'lower-latin', 'A', 'upper-alpha', 'upper-latin', 'lower-greek', 'img|type|width|height|image.ext')
+	 * @public
+	 * @since 4.0.028 (2008-09-26)
+	 */
+	public function setLIsymbol($symbol='!') {
+		// check for custom image symbol
+		if (substr($symbol, 0, 4) == 'img|') {
+			$this->lisymbol = $symbol;
+			return;
+		}
+		$symbol = strtolower($symbol);
+		$valid_symbols = array('!', '#', 'disc', 'circle', 'square', '1', 'decimal', 'decimal-leading-zero', 'i', 'lower-roman', 'I', 'upper-roman', 'a', 'lower-alpha', 'lower-latin', 'A', 'upper-alpha', 'upper-latin', 'lower-greek');
+		if (in_array($symbol, $valid_symbols)) {
+			$this->lisymbol = $symbol;
+		} else {
+			$this->lisymbol = '';
+		}
+	}
+
+	/**
+	 * Set the booklet mode for double-sided pages.
+	 * @param $booklet (boolean) true set the booklet mode on, false otherwise.
+	 * @param $inner (float) Inner page margin.
+	 * @param $outer (float) Outer page margin.
+	 * @public
+	 * @since 4.2.000 (2008-10-29)
+	 */
+	public function SetBooklet($booklet=true, $inner=-1, $outer=-1) {
+		$this->booklet = $booklet;
+		if ($inner >= 0) {
+			$this->lMargin = $inner;
+		}
+		if ($outer >= 0) {
+			$this->rMargin = $outer;
+		}
+	}
+
+	/**
+	 * Swap the left and right margins.
+	 * @param $reverse (boolean) if true swap left and right margins.
+	 * @protected
+	 * @since 4.2.000 (2008-10-29)
+	 */
+	protected function swapMargins($reverse=true) {
+		if ($reverse) {
+			// swap left and right margins
+			$mtemp = $this->original_lMargin;
+			$this->original_lMargin = $this->original_rMargin;
+			$this->original_rMargin = $mtemp;
+			$deltam = $this->original_lMargin - $this->original_rMargin;
+			$this->lMargin += $deltam;
+			$this->rMargin -= $deltam;
+		}
+	}
+
+	/**
+	 * Set the vertical spaces for HTML tags.
+	 * The array must have the following structure (example):
+	 * $tagvs = array('h1' => array(0 => array('h' => '', 'n' => 2), 1 => array('h' => 1.3, 'n' => 1)));
+	 * The first array level contains the tag names,
+	 * the second level contains 0 for opening tags or 1 for closing tags,
+	 * the third level contains the vertical space unit (h) and the number spaces to add (n).
+	 * If the h parameter is not specified, default values are used.
+	 * @param $tagvs (array) array of tags and relative vertical spaces.
+	 * @public
+	 * @since 4.2.001 (2008-10-30)
+	 */
+	public function setHtmlVSpace($tagvs) {
+		$this->tagvspaces = $tagvs;
+	}
+
+	/**
+	 * Set custom width for list indentation.
+	 * @param $width (float) width of the indentation. Use negative value to disable it.
+	 * @public
+	 * @since 4.2.007 (2008-11-12)
+	 */
+	public function setListIndentWidth($width) {
+		return $this->customlistindent = floatval($width);
+	}
+
+	/**
+	 * Set the top/bottom cell sides to be open or closed when the cell cross the page.
+	 * @param $isopen (boolean) if true keeps the top/bottom border open for the cell sides that cross the page.
+	 * @public
+	 * @since 4.2.010 (2008-11-14)
+	 */
+	public function setOpenCell($isopen) {
+		$this->opencell = $isopen;
+	}
+
+	/**
+	 * Set the color and font style for HTML links.
+	 * @param $color (array) RGB array of colors
+	 * @param $fontstyle (string) additional font styles to add
+	 * @public
+	 * @since 4.4.003 (2008-12-09)
+	 */
+	public function setHtmlLinksStyle($color=array(0,0,255), $fontstyle='U') {
+		$this->htmlLinkColorArray = $color;
+		$this->htmlLinkFontStyle = $fontstyle;
+	}
+
+	/**
+	 * Convert HTML string containing value and unit of measure to user's units or points.
+	 * @param $htmlval (string) String containing values and unit.
+	 * @param $refsize (string) Reference value in points.
+	 * @param $defaultunit (string) Default unit (can be one of the following: %, em, ex, px, in, mm, pc, pt).
+	 * @param $points (boolean) If true returns points, otherwise returns value in user's units.
+	 * @return float value in user's unit or point if $points=true
+	 * @public
+	 * @since 4.4.004 (2008-12-10)
+	 */
+	public function getHTMLUnitToUnits($htmlval, $refsize=1, $defaultunit='px', $points=false) {
+		$supportedunits = array('%', 'em', 'ex', 'px', 'in', 'cm', 'mm', 'pc', 'pt');
+		$retval = 0;
+		$value = 0;
+		$unit = 'px';
+		if ($points) {
+			$k = 1;
+		} else {
+			$k = $this->k;
+		}
+		if (in_array($defaultunit, $supportedunits)) {
+			$unit = $defaultunit;
+		}
+		if (is_numeric($htmlval)) {
+			$value = floatval($htmlval);
+		} elseif (preg_match('/([0-9\.\-\+]+)/', $htmlval, $mnum)) {
+			$value = floatval($mnum[1]);
+			if (preg_match('/([a-z%]+)/', $htmlval, $munit)) {
+				if (in_array($munit[1], $supportedunits)) {
+					$unit = $munit[1];
+				}
+			}
+		}
+		switch ($unit) {
+			// percentage
+			case '%': {
+				$retval = (($value * $refsize) / 100);
+				break;
+			}
+			// relative-size
+			case 'em': {
+				$retval = ($value * $refsize);
+				break;
+			}
+			// height of lower case 'x' (about half the font-size)
+			case 'ex': {
+				$retval = ($value * ($refsize / 2));
+				break;
+			}
+			// absolute-size
+			case 'in': {
+				$retval = (($value * $this->dpi) / $k);
+				break;
+			}
+			// centimeters
+			case 'cm': {
+				$retval = (($value / 2.54 * $this->dpi) / $k);
+				break;
+			}
+			// millimeters
+			case 'mm': {
+				$retval = (($value / 25.4 * $this->dpi) / $k);
+				break;
+			}
+			// one pica is 12 points
+			case 'pc': {
+				$retval = (($value * 12) / $k);
+				break;
+			}
+			// points
+			case 'pt': {
+				$retval = ($value / $k);
+				break;
+			}
+			// pixels
+			case 'px': {
+				$retval = $this->pixelsToUnits($value);
+				if ($points) {
+					$retval *= $this->k;
+				}
+				break;
+			}
+		}
+		return $retval;
+	}
+
+	/**
+	 * Output an HTML list bullet or ordered item symbol
+	 * @param $listdepth (int) list nesting level
+	 * @param $listtype (string) type of list
+	 * @param $size (float) current font size
+	 * @protected
+	 * @since 4.4.004 (2008-12-10)
+	 */
+	protected function putHtmlListBullet($listdepth, $listtype='', $size=10) {
+		if ($this->state != 2) {
+			return;
+		}
+		$size /= $this->k;
+		$fill = '';
+		$bgcolor = $this->bgcolor;
+		$color = $this->fgcolor;
+		$strokecolor = $this->strokecolor;
+		$width = 0;
+		$textitem = '';
+		$tmpx = $this->x;
+		$lspace = $this->GetStringWidth('  ');
+		if ($listtype == '^') {
+			// special symbol used for avoid justification of rect bullet
+			$this->lispacer = '';
+			return;
+		} elseif ($listtype == '!') {
+			// set default list type for unordered list
+			$deftypes = array('disc', 'circle', 'square');
+			$listtype = $deftypes[($listdepth - 1) % 3];
+		} elseif ($listtype == '#') {
+			// set default list type for ordered list
+			$listtype = 'decimal';
+		} elseif (substr($listtype, 0, 4) == 'img|') {
+			// custom image type ('img|type|width|height|image.ext')
+			$img = explode('|', $listtype);
+			$listtype = 'img';
+		}
+		switch ($listtype) {
+			// unordered types
+			case 'none': {
+				break;
+			}
+			case 'disc': {
+				$r = $size / 6;
+				$lspace += (2 * $r);
+				if ($this->rtl) {
+					$this->x += $lspace;
+				} else {
+					$this->x -= $lspace;
+				}
+				$this->Circle(($this->x + $r), ($this->y + ($this->lasth / 2)), $r, 0, 360, 'F', array(), $color, 8);
+				break;
+			}
+			case 'circle': {
+				$r = $size / 6;
+				$lspace += (2 * $r);
+				if ($this->rtl) {
+					$this->x += $lspace;
+				} else {
+					$this->x -= $lspace;
+				}
+				$prev_line_style = $this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor;
+				$new_line_style = array('width' => ($r / 3), 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'phase' => 0, 'color'=>$color);
+				$this->Circle(($this->x + $r), ($this->y + ($this->lasth / 2)), ($r * (1 - (1/6))), 0, 360, 'D', $new_line_style, array(), 8);
+				$this->_out($prev_line_style); // restore line settings
+				break;
+			}
+			case 'square': {
+				$l = $size / 3;
+				$lspace += $l;
+				if ($this->rtl) {;
+					$this->x += $lspace;
+				} else {
+					$this->x -= $lspace;
+				}
+				$this->Rect($this->x, ($this->y + (($this->lasth - $l) / 2)), $l, $l, 'F', array(), $color);
+				break;
+			}
+			case 'img': {
+				// 1=>type, 2=>width, 3=>height, 4=>image.ext
+				$lspace += $img[2];
+				if ($this->rtl) {;
+					$this->x += $lspace;
+				} else {
+					$this->x -= $lspace;
+				}
+				$imgtype = strtolower($img[1]);
+				$prev_y = $this->y;
+				switch ($imgtype) {
+					case 'svg': {
+						$this->ImageSVG($img[4], $this->x, ($this->y + (($this->lasth - $img[3]) / 2)), $img[2], $img[3], '', 'T', '', 0, false);
+						break;
+					}
+					case 'ai':
+					case 'eps': {
+						$this->ImageEps($img[4], $this->x, ($this->y + (($this->lasth - $img[3]) / 2)), $img[2], $img[3], '', true, 'T', '', 0, false);
+						break;
+					}
+					default: {
+						$this->Image($img[4], $this->x, ($this->y + (($this->lasth - $img[3]) / 2)), $img[2], $img[3], $img[1], '', 'T', false, 300, '', false, false, 0, false, false, false);
+						break;
+					}
+				}
+				$this->y = $prev_y;
+				break;
+			}
+			// ordered types
+			// $this->listcount[$this->listnum];
+			// $textitem
+			case '1':
+			case 'decimal': {
+				$textitem = $this->listcount[$this->listnum];
+				break;
+			}
+			case 'decimal-leading-zero': {
+				$textitem = sprintf('%02d', $this->listcount[$this->listnum]);
+				break;
+			}
+			case 'i':
+			case 'lower-roman': {
+				$textitem = strtolower(TCPDF_STATIC::intToRoman($this->listcount[$this->listnum]));
+				break;
+			}
+			case 'I':
+			case 'upper-roman': {
+				$textitem = TCPDF_STATIC::intToRoman($this->listcount[$this->listnum]);
+				break;
+			}
+			case 'a':
+			case 'lower-alpha':
+			case 'lower-latin': {
+				$textitem = chr(97 + $this->listcount[$this->listnum] - 1);
+				break;
+			}
+			case 'A':
+			case 'upper-alpha':
+			case 'upper-latin': {
+				$textitem = chr(65 + $this->listcount[$this->listnum] - 1);
+				break;
+			}
+			case 'lower-greek': {
+				$textitem = TCPDF_FONTS::unichr((945 + $this->listcount[$this->listnum] - 1), $this->isunicode);
+				break;
+			}
+			/*
+			// Types to be implemented (special handling)
+			case 'hebrew': {
+				break;
+			}
+			case 'armenian': {
+				break;
+			}
+			case 'georgian': {
+				break;
+			}
+			case 'cjk-ideographic': {
+				break;
+			}
+			case 'hiragana': {
+				break;
+			}
+			case 'katakana': {
+				break;
+			}
+			case 'hiragana-iroha': {
+				break;
+			}
+			case 'katakana-iroha': {
+				break;
+			}
+			*/
+			default: {
+				$textitem = $this->listcount[$this->listnum];
+			}
+		}
+		if (!TCPDF_STATIC::empty_string($textitem)) {
+			// Check whether we need a new page or new column
+			$prev_y = $this->y;
+			$h = ($this->FontSize * $this->cell_height_ratio) + $this->cell_padding['T'] + $this->cell_padding['B'];
+			if ($this->checkPageBreak($h) OR ($this->y < $prev_y)) {
+				$tmpx = $this->x;
+			}
+			// print ordered item
+			if ($this->rtl) {
+				$textitem = '.'.$textitem;
+			} else {
+				$textitem = $textitem.'.';
+			}
+			$lspace += $this->GetStringWidth($textitem);
+			if ($this->rtl) {
+				$this->x += $lspace;
+			} else {
+				$this->x -= $lspace;
+			}
+			$this->Write($this->lasth, $textitem, '', false, '', false, 0, false);
+		}
+		$this->x = $tmpx;
+		$this->lispacer = '^';
+		// restore colors
+		$this->SetFillColorArray($bgcolor);
+		$this->SetDrawColorArray($strokecolor);
+		$this->SettextColorArray($color);
+	}
+
+	/**
+	 * Returns current graphic variables as array.
+	 * @return array of graphic variables
+	 * @protected
+	 * @since 4.2.010 (2008-11-14)
+	 */
+	protected function getGraphicVars() {
+		$grapvars = array(
+			'FontFamily' => $this->FontFamily,
+			'FontStyle' => $this->FontStyle,
+			'FontSizePt' => $this->FontSizePt,
+			'rMargin' => $this->rMargin,
+			'lMargin' => $this->lMargin,
+			'cell_padding' => $this->cell_padding,
+			'cell_margin' => $this->cell_margin,
+			'LineWidth' => $this->LineWidth,
+			'linestyleWidth' => $this->linestyleWidth,
+			'linestyleCap' => $this->linestyleCap,
+			'linestyleJoin' => $this->linestyleJoin,
+			'linestyleDash' => $this->linestyleDash,
+			'textrendermode' => $this->textrendermode,
+			'textstrokewidth' => $this->textstrokewidth,
+			'DrawColor' => $this->DrawColor,
+			'FillColor' => $this->FillColor,
+			'TextColor' => $this->TextColor,
+			'ColorFlag' => $this->ColorFlag,
+			'bgcolor' => $this->bgcolor,
+			'fgcolor' => $this->fgcolor,
+			'htmlvspace' => $this->htmlvspace,
+			'listindent' => $this->listindent,
+			'listindentlevel' => $this->listindentlevel,
+			'listnum' => $this->listnum,
+			'listordered' => $this->listordered,
+			'listcount' => $this->listcount,
+			'lispacer' => $this->lispacer,
+			'cell_height_ratio' => $this->cell_height_ratio,
+			'font_stretching' => $this->font_stretching,
+			'font_spacing' => $this->font_spacing,
+			'alpha' => $this->alpha,
+			// extended
+			'lasth' => $this->lasth,
+			'tMargin' => $this->tMargin,
+			'bMargin' => $this->bMargin,
+			'AutoPageBreak' => $this->AutoPageBreak,
+			'PageBreakTrigger' => $this->PageBreakTrigger,
+			'x' => $this->x,
+			'y' => $this->y,
+			'w' => $this->w,
+			'h' => $this->h,
+			'wPt' => $this->wPt,
+			'hPt' => $this->hPt,
+			'fwPt' => $this->fwPt,
+			'fhPt' => $this->fhPt,
+			'page' => $this->page,
+			'current_column' => $this->current_column,
+			'num_columns' => $this->num_columns
+			);
+		return $grapvars;
+	}
+
+	/**
+	 * Set graphic variables.
+	 * @param $gvars (array) array of graphic variablesto restore
+	 * @param $extended (boolean) if true restore extended graphic variables
+	 * @protected
+	 * @since 4.2.010 (2008-11-14)
+	 */
+	protected function setGraphicVars($gvars, $extended=false) {
+		if ($this->state != 2) {
+			 return;
+		}
+		$this->FontFamily = $gvars['FontFamily'];
+		$this->FontStyle = $gvars['FontStyle'];
+		$this->FontSizePt = $gvars['FontSizePt'];
+		$this->rMargin = $gvars['rMargin'];
+		$this->lMargin = $gvars['lMargin'];
+		$this->cell_padding = $gvars['cell_padding'];
+		$this->cell_margin = $gvars['cell_margin'];
+		$this->LineWidth = $gvars['LineWidth'];
+		$this->linestyleWidth = $gvars['linestyleWidth'];
+		$this->linestyleCap = $gvars['linestyleCap'];
+		$this->linestyleJoin = $gvars['linestyleJoin'];
+		$this->linestyleDash = $gvars['linestyleDash'];
+		$this->textrendermode = $gvars['textrendermode'];
+		$this->textstrokewidth = $gvars['textstrokewidth'];
+		$this->DrawColor = $gvars['DrawColor'];
+		$this->FillColor = $gvars['FillColor'];
+		$this->TextColor = $gvars['TextColor'];
+		$this->ColorFlag = $gvars['ColorFlag'];
+		$this->bgcolor = $gvars['bgcolor'];
+		$this->fgcolor = $gvars['fgcolor'];
+		$this->htmlvspace = $gvars['htmlvspace'];
+		$this->listindent = $gvars['listindent'];
+		$this->listindentlevel = $gvars['listindentlevel'];
+		$this->listnum = $gvars['listnum'];
+		$this->listordered = $gvars['listordered'];
+		$this->listcount = $gvars['listcount'];
+		$this->lispacer = $gvars['lispacer'];
+		$this->cell_height_ratio = $gvars['cell_height_ratio'];
+		$this->font_stretching = $gvars['font_stretching'];
+		$this->font_spacing = $gvars['font_spacing'];
+		$this->alpha = $gvars['alpha'];
+		if ($extended) {
+			// restore extended values
+			$this->lasth = $gvars['lasth'];
+			$this->tMargin = $gvars['tMargin'];
+			$this->bMargin = $gvars['bMargin'];
+			$this->AutoPageBreak = $gvars['AutoPageBreak'];
+			$this->PageBreakTrigger = $gvars['PageBreakTrigger'];
+			$this->x = $gvars['x'];
+			$this->y = $gvars['y'];
+			$this->w = $gvars['w'];
+			$this->h = $gvars['h'];
+			$this->wPt = $gvars['wPt'];
+			$this->hPt = $gvars['hPt'];
+			$this->fwPt = $gvars['fwPt'];
+			$this->fhPt = $gvars['fhPt'];
+			$this->page = $gvars['page'];
+			$this->current_column = $gvars['current_column'];
+			$this->num_columns = $gvars['num_columns'];
+		}
+		$this->_out(''.$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor.' '.$this->FillColor.'');
+		if (!TCPDF_STATIC::empty_string($this->FontFamily)) {
+			$this->SetFont($this->FontFamily, $this->FontStyle, $this->FontSizePt);
+		}
+	}
+
+	/**
+	 * Writes data to a temporary file on filesystem.
+	 * @param $filename (string) file name
+	 * @param $data (mixed) data to write on file
+	 * @param $append (boolean) if true append data, false replace.
+	 * @since 4.5.000 (2008-12-31)
+	 * @protected
+	 */
+	protected function writeDiskCache($filename, $data, $append=false) {
+		if ($append) {
+			$fmode = 'ab+';
+		} else {
+			$fmode = 'wb+';
+		}
+		$f = @fopen($filename, $fmode);
+		if (!$f) {
+			$this->Error('Unable to write cache file: '.$filename);
+		} else {
+			fwrite($f, $data);
+			fclose($f);
+		}
+		// update file length (needed for transactions)
+		if (!isset($this->cache_file_length['_'.$filename])) {
+			$this->cache_file_length['_'.$filename] = strlen($data);
+		} else {
+			$this->cache_file_length['_'.$filename] += strlen($data);
+		}
+	}
+
+	/**
+	 * Read data from a temporary file on filesystem.
+	 * @param $filename (string) file name
+	 * @return mixed retrieved data
+	 * @since 4.5.000 (2008-12-31)
+	 * @protected
+	 */
+	protected function readDiskCache($filename) {
+		return file_get_contents($filename);
+	}
+
+	/**
+	 * Set buffer content (always append data).
+	 * @param $data (string) data
+	 * @protected
+	 * @since 4.5.000 (2009-01-02)
+	 */
+	protected function setBuffer($data) {
+		$this->bufferlen += strlen($data);
+		if ($this->diskcache) {
+			if (!isset($this->buffer) OR TCPDF_STATIC::empty_string($this->buffer)) {
+				$this->buffer = TCPDF_STATIC::getObjFilename('buffer');
+			}
+			$this->writeDiskCache($this->buffer, $data, true);
+		} else {
+			$this->buffer .= $data;
+		}
+	}
+
+	/**
+	 * Replace the buffer content
+	 * @param $data (string) data
+	 * @protected
+	 * @since 5.5.000 (2010-06-22)
+	 */
+	protected function replaceBuffer($data) {
+		$this->bufferlen = strlen($data);
+		if ($this->diskcache) {
+			if (!isset($this->buffer) OR TCPDF_STATIC::empty_string($this->buffer)) {
+				$this->buffer = TCPDF_STATIC::getObjFilename('buffer');
+			}
+			$this->writeDiskCache($this->buffer, $data, false);
+		} else {
+			$this->buffer = $data;
+		}
+	}
+
+	/**
+	 * Get buffer content.
+	 * @return string buffer content
+	 * @protected
+	 * @since 4.5.000 (2009-01-02)
+	 */
+	protected function getBuffer() {
+		if ($this->diskcache) {
+			return $this->readDiskCache($this->buffer);
+		} else {
+			return $this->buffer;
+		}
+	}
+
+	/**
+	 * Set page buffer content.
+	 * @param $page (int) page number
+	 * @param $data (string) page data
+	 * @param $append (boolean) if true append data, false replace.
+	 * @protected
+	 * @since 4.5.000 (2008-12-31)
+	 */
+	protected function setPageBuffer($page, $data, $append=false) {
+		if ($this->diskcache) {
+			if (!isset($this->pages[$page])) {
+				$this->pages[$page] = TCPDF_STATIC::getObjFilename('page'.$page);
+			}
+			$this->writeDiskCache($this->pages[$page], $data, $append);
+		} else {
+			if ($append) {
+				$this->pages[$page] .= $data;
+			} else {
+				$this->pages[$page] = $data;
+			}
+		}
+		if ($append AND isset($this->pagelen[$page])) {
+			$this->pagelen[$page] += strlen($data);
+		} else {
+			$this->pagelen[$page] = strlen($data);
+		}
+	}
+
+	/**
+	 * Get page buffer content.
+	 * @param $page (int) page number
+	 * @return string page buffer content or false in case of error
+	 * @protected
+	 * @since 4.5.000 (2008-12-31)
+	 */
+	protected function getPageBuffer($page) {
+		if ($this->diskcache) {
+			return $this->readDiskCache($this->pages[$page]);
+		} elseif (isset($this->pages[$page])) {
+			return $this->pages[$page];
+		}
+		return false;
+	}
+
+	/**
+	 * Set image buffer content.
+	 * @param $image (string) image key
+	 * @param $data (array) image data
+	 * @return int image index number
+	 * @protected
+	 * @since 4.5.000 (2008-12-31)
+	 */
+	protected function setImageBuffer($image, $data) {
+		if (($data['i'] = array_search($image, $this->imagekeys)) === FALSE) {
+			$this->imagekeys[$this->numimages] = $image;
+			$data['i'] = $this->numimages;
+			++$this->numimages;
+		}
+		if ($this->diskcache) {
+			if (!isset($this->images[$image])) {
+				$this->images[$image] = TCPDF_STATIC::getObjFilename('image'.$image);
+			}
+			$this->writeDiskCache($this->images[$image], serialize($data));
+		} else {
+			$this->images[$image] = $data;
+		}
+		return $data['i'];
+	}
+
+	/**
+	 * Set image buffer content for a specified sub-key.
+	 * @param $image (string) image key
+	 * @param $key (string) image sub-key
+	 * @param $data (array) image data
+	 * @protected
+	 * @since 4.5.000 (2008-12-31)
+	 */
+	protected function setImageSubBuffer($image, $key, $data) {
+		if (!isset($this->images[$image])) {
+			$this->setImageBuffer($image, array());
+		}
+		if ($this->diskcache) {
+			$tmpimg = $this->getImageBuffer($image);
+			$tmpimg[$key] = $data;
+			$this->writeDiskCache($this->images[$image], serialize($tmpimg));
+		} else {
+			$this->images[$image][$key] = $data;
+		}
+	}
+
+	/**
+	 * Get image buffer content.
+	 * @param $image (string) image key
+	 * @return string image buffer content or false in case of error
+	 * @protected
+	 * @since 4.5.000 (2008-12-31)
+	 */
+	protected function getImageBuffer($image) {
+		if ($this->diskcache AND isset($this->images[$image])) {
+			return unserialize($this->readDiskCache($this->images[$image]));
+		} elseif (isset($this->images[$image])) {
+			return $this->images[$image];
+		}
+		return false;
+	}
+
+	/**
+	 * Set font buffer content.
+	 * @param $font (string) font key
+	 * @param $data (array) font data
+	 * @protected
+	 * @since 4.5.000 (2009-01-02)
+	 */
+	protected function setFontBuffer($font, $data) {
+		if ($this->diskcache) {
+			if (!isset($this->fonts[$font])) {
+				$this->fonts[$font] = TCPDF_STATIC::getObjFilename('font');
+			}
+			$this->writeDiskCache($this->fonts[$font], serialize($data));
+		} else {
+			$this->fonts[$font] = $data;
+		}
+		if (!in_array($font, $this->fontkeys)) {
+			$this->fontkeys[] = $font;
+			// store object ID for current font
+			++$this->n;
+			$this->font_obj_ids[$font] = $this->n;
+			$this->setFontSubBuffer($font, 'n', $this->n);
+		}
+	}
+
+	/**
+	 * Set font buffer content.
+	 * @param $font (string) font key
+	 * @param $key (string) font sub-key
+	 * @param $data (array) font data
+	 * @protected
+	 * @since 4.5.000 (2009-01-02)
+	 */
+	protected function setFontSubBuffer($font, $key, $data) {
+		if (!isset($this->fonts[$font])) {
+			$this->setFontBuffer($font, array());
+		}
+		if ($this->diskcache) {
+			$tmpfont = $this->getFontBuffer($font);
+			$tmpfont[$key] = $data;
+			$this->writeDiskCache($this->fonts[$font], serialize($tmpfont));
+		} else {
+			$this->fonts[$font][$key] = $data;
+		}
+	}
+
+	/**
+	 * Get font buffer content.
+	 * @param $font (string) font key
+	 * @return string font buffer content or false in case of error
+	 * @protected
+	 * @since 4.5.000 (2009-01-02)
+	 */
+	protected function getFontBuffer($font) {
+		if ($this->diskcache AND isset($this->fonts[$font])) {
+			return unserialize($this->readDiskCache($this->fonts[$font]));
+		} elseif (isset($this->fonts[$font])) {
+			return $this->fonts[$font];
+		}
+		return false;
+	}
+
+	/**
+	 * Move a page to a previous position.
+	 * @param $frompage (int) number of the source page
+	 * @param $topage (int) number of the destination page (must be less than $frompage)
+	 * @return true in case of success, false in case of error.
+	 * @public
+	 * @since 4.5.000 (2009-01-02)
+	 */
+	public function movePage($frompage, $topage) {
+		if (($frompage > $this->numpages) OR ($frompage <= $topage)) {
+			return false;
+		}
+		if ($frompage == $this->page) {
+			// close the page before moving it
+			$this->endPage();
+		}
+		// move all page-related states
+		$tmppage = $this->getPageBuffer($frompage);
+		$tmppagedim = $this->pagedim[$frompage];
+		$tmppagelen = $this->pagelen[$frompage];
+		$tmpintmrk = $this->intmrk[$frompage];
+		$tmpbordermrk = $this->bordermrk[$frompage];
+		$tmpcntmrk = $this->cntmrk[$frompage];
+		$tmppageobjects = $this->pageobjects[$frompage];
+		if (isset($this->footerpos[$frompage])) {
+			$tmpfooterpos = $this->footerpos[$frompage];
+		}
+		if (isset($this->footerlen[$frompage])) {
+			$tmpfooterlen = $this->footerlen[$frompage];
+		}
+		if (isset($this->transfmrk[$frompage])) {
+			$tmptransfmrk = $this->transfmrk[$frompage];
+		}
+		if (isset($this->PageAnnots[$frompage])) {
+			$tmpannots = $this->PageAnnots[$frompage];
+		}
+		if (isset($this->newpagegroup) AND !empty($this->newpagegroup)) {
+			for ($i = $frompage; $i > $topage; --$i) {
+				if (isset($this->newpagegroup[$i]) AND (($i + $this->pagegroups[$this->newpagegroup[$i]]) > $frompage)) {
+					--$this->pagegroups[$this->newpagegroup[$i]];
+					break;
+				}
+			}
+			for ($i = $topage; $i > 0; --$i) {
+				if (isset($this->newpagegroup[$i]) AND (($i + $this->pagegroups[$this->newpagegroup[$i]]) > $topage)) {
+					++$this->pagegroups[$this->newpagegroup[$i]];
+					break;
+				}
+			}
+		}
+		for ($i = $frompage; $i > $topage; --$i) {
+			$j = $i - 1;
+			// shift pages down
+			$this->setPageBuffer($i, $this->getPageBuffer($j));
+			$this->pagedim[$i] = $this->pagedim[$j];
+			$this->pagelen[$i] = $this->pagelen[$j];
+			$this->intmrk[$i] = $this->intmrk[$j];
+			$this->bordermrk[$i] = $this->bordermrk[$j];
+			$this->cntmrk[$i] = $this->cntmrk[$j];
+			$this->pageobjects[$i] = $this->pageobjects[$j];
+			if (isset($this->footerpos[$j])) {
+				$this->footerpos[$i] = $this->footerpos[$j];
+			} elseif (isset($this->footerpos[$i])) {
+				unset($this->footerpos[$i]);
+			}
+			if (isset($this->footerlen[$j])) {
+				$this->footerlen[$i] = $this->footerlen[$j];
+			} elseif (isset($this->footerlen[$i])) {
+				unset($this->footerlen[$i]);
+			}
+			if (isset($this->transfmrk[$j])) {
+				$this->transfmrk[$i] = $this->transfmrk[$j];
+			} elseif (isset($this->transfmrk[$i])) {
+				unset($this->transfmrk[$i]);
+			}
+			if (isset($this->PageAnnots[$j])) {
+				$this->PageAnnots[$i] = $this->PageAnnots[$j];
+			} elseif (isset($this->PageAnnots[$i])) {
+				unset($this->PageAnnots[$i]);
+			}
+			if (isset($this->newpagegroup[$j])) {
+				$this->newpagegroup[$i] = $this->newpagegroup[$j];
+				unset($this->newpagegroup[$j]);
+			}
+			if ($this->currpagegroup == $j) {
+				$this->currpagegroup = $i;
+			}
+		}
+		$this->setPageBuffer($topage, $tmppage);
+		$this->pagedim[$topage] = $tmppagedim;
+		$this->pagelen[$topage] = $tmppagelen;
+		$this->intmrk[$topage] = $tmpintmrk;
+		$this->bordermrk[$topage] = $tmpbordermrk;
+		$this->cntmrk[$topage] = $tmpcntmrk;
+		$this->pageobjects[$topage] = $tmppageobjects;
+		if (isset($tmpfooterpos)) {
+			$this->footerpos[$topage] = $tmpfooterpos;
+		} elseif (isset($this->footerpos[$topage])) {
+			unset($this->footerpos[$topage]);
+		}
+		if (isset($tmpfooterlen)) {
+			$this->footerlen[$topage] = $tmpfooterlen;
+		} elseif (isset($this->footerlen[$topage])) {
+			unset($this->footerlen[$topage]);
+		}
+		if (isset($tmptransfmrk)) {
+			$this->transfmrk[$topage] = $tmptransfmrk;
+		} elseif (isset($this->transfmrk[$topage])) {
+			unset($this->transfmrk[$topage]);
+		}
+		if (isset($tmpannots)) {
+			$this->PageAnnots[$topage] = $tmpannots;
+		} elseif (isset($this->PageAnnots[$topage])) {
+			unset($this->PageAnnots[$topage]);
+		}
+		// adjust outlines
+		$tmpoutlines = $this->outlines;
+		foreach ($tmpoutlines as $key => $outline) {
+			if (($outline['p'] >= $topage) AND ($outline['p'] < $frompage)) {
+				$this->outlines[$key]['p'] = ($outline['p'] + 1);
+			} elseif ($outline['p'] == $frompage) {
+				$this->outlines[$key]['p'] = $topage;
+			}
+		}
+		// adjust dests
+		$tmpdests = $this->dests;
+		foreach ($tmpdests as $key => $dest) {
+			if (($dest['p'] >= $topage) AND ($dest['p'] < $frompage)) {
+				$this->dests[$key]['p'] = ($dest['p'] + 1);
+			} elseif ($dest['p'] == $frompage) {
+				$this->dests[$key]['p'] = $topage;
+			}
+		}
+		// adjust links
+		$tmplinks = $this->links;
+		foreach ($tmplinks as $key => $link) {
+			if (($link[0] >= $topage) AND ($link[0] < $frompage)) {
+				$this->links[$key][0] = ($link[0] + 1);
+			} elseif ($link[0] == $frompage) {
+				$this->links[$key][0] = $topage;
+			}
+		}
+		// adjust javascript
+		$tmpjavascript = $this->javascript;
+		global $jfrompage, $jtopage;
+		$jfrompage = $frompage;
+		$jtopage = $topage;
+		$this->javascript = preg_replace_callback('/this\.addField\(\'([^\']*)\',\'([^\']*)\',([0-9]+)/',
+			create_function('$matches', 'global $jfrompage, $jtopage;
+			$pagenum = intval($matches[3]) + 1;
+			if (($pagenum >= $jtopage) AND ($pagenum < $jfrompage)) {
+				$newpage = ($pagenum + 1);
+			} elseif ($pagenum == $jfrompage) {
+				$newpage = $jtopage;
+			} else {
+				$newpage = $pagenum;
+			}
+			--$newpage;
+			return "this.addField(\'".$matches[1]."\',\'".$matches[2]."\',".$newpage."";'), $tmpjavascript);
+		// return to last page
+		$this->lastPage(true);
+		return true;
+	}
+
+	/**
+	 * Remove the specified page.
+	 * @param $page (int) page to remove
+	 * @return true in case of success, false in case of error.
+	 * @public
+	 * @since 4.6.004 (2009-04-23)
+	 */
+	public function deletePage($page) {
+		if (($page < 1) OR ($page > $this->numpages)) {
+			return false;
+		}
+		// delete current page
+		unset($this->pages[$page]);
+		unset($this->pagedim[$page]);
+		unset($this->pagelen[$page]);
+		unset($this->intmrk[$page]);
+		unset($this->bordermrk[$page]);
+		unset($this->cntmrk[$page]);
+		foreach ($this->pageobjects[$page] as $oid) {
+			if (isset($this->offsets[$oid])){
+				unset($this->offsets[$oid]);
+			}
+		}
+		unset($this->pageobjects[$page]);
+		if (isset($this->footerpos[$page])) {
+			unset($this->footerpos[$page]);
+		}
+		if (isset($this->footerlen[$page])) {
+			unset($this->footerlen[$page]);
+		}
+		if (isset($this->transfmrk[$page])) {
+			unset($this->transfmrk[$page]);
+		}
+		if (isset($this->PageAnnots[$page])) {
+			unset($this->PageAnnots[$page]);
+		}
+		if (isset($this->newpagegroup) AND !empty($this->newpagegroup)) {
+			for ($i = $page; $i > 0; --$i) {
+				if (isset($this->newpagegroup[$i]) AND (($i + $this->pagegroups[$this->newpagegroup[$i]]) > $page)) {
+					--$this->pagegroups[$this->newpagegroup[$i]];
+					break;
+				}
+			}
+		}
+		if (isset($this->pageopen[$page])) {
+			unset($this->pageopen[$page]);
+		}
+		if ($page < $this->numpages) {
+			// update remaining pages
+			for ($i = $page; $i < $this->numpages; ++$i) {
+				$j = $i + 1;
+				// shift pages
+				$this->setPageBuffer($i, $this->getPageBuffer($j));
+				$this->pagedim[$i] = $this->pagedim[$j];
+				$this->pagelen[$i] = $this->pagelen[$j];
+				$this->intmrk[$i] = $this->intmrk[$j];
+				$this->bordermrk[$i] = $this->bordermrk[$j];
+				$this->cntmrk[$i] = $this->cntmrk[$j];
+				$this->pageobjects[$i] = $this->pageobjects[$j];
+				if (isset($this->footerpos[$j])) {
+					$this->footerpos[$i] = $this->footerpos[$j];
+				} elseif (isset($this->footerpos[$i])) {
+					unset($this->footerpos[$i]);
+				}
+				if (isset($this->footerlen[$j])) {
+					$this->footerlen[$i] = $this->footerlen[$j];
+				} elseif (isset($this->footerlen[$i])) {
+					unset($this->footerlen[$i]);
+				}
+				if (isset($this->transfmrk[$j])) {
+					$this->transfmrk[$i] = $this->transfmrk[$j];
+				} elseif (isset($this->transfmrk[$i])) {
+					unset($this->transfmrk[$i]);
+				}
+				if (isset($this->PageAnnots[$j])) {
+					$this->PageAnnots[$i] = $this->PageAnnots[$j];
+				} elseif (isset($this->PageAnnots[$i])) {
+					unset($this->PageAnnots[$i]);
+				}
+				if (isset($this->newpagegroup[$j])) {
+					$this->newpagegroup[$i] = $this->newpagegroup[$j];
+					unset($this->newpagegroup[$j]);
+				}
+				if ($this->currpagegroup == $j) {
+					$this->currpagegroup = $i;
+				}
+				if (isset($this->pageopen[$j])) {
+					$this->pageopen[$i] = $this->pageopen[$j];
+				} elseif (isset($this->pageopen[$i])) {
+					unset($this->pageopen[$i]);
+				}
+			}
+			// remove last page
+			unset($this->pages[$this->numpages]);
+			unset($this->pagedim[$this->numpages]);
+			unset($this->pagelen[$this->numpages]);
+			unset($this->intmrk[$this->numpages]);
+			unset($this->bordermrk[$this->numpages]);
+			unset($this->cntmrk[$this->numpages]);
+			foreach ($this->pageobjects[$this->numpages] as $oid) {
+				if (isset($this->offsets[$oid])){
+					unset($this->offsets[$oid]);
+				}
+			}
+			unset($this->pageobjects[$this->numpages]);
+			if (isset($this->footerpos[$this->numpages])) {
+				unset($this->footerpos[$this->numpages]);
+			}
+			if (isset($this->footerlen[$this->numpages])) {
+				unset($this->footerlen[$this->numpages]);
+			}
+			if (isset($this->transfmrk[$this->numpages])) {
+				unset($this->transfmrk[$this->numpages]);
+			}
+			if (isset($this->PageAnnots[$this->numpages])) {
+				unset($this->PageAnnots[$this->numpages]);
+			}
+			if (isset($this->newpagegroup[$this->numpages])) {
+				unset($this->newpagegroup[$this->numpages]);
+			}
+			if ($this->currpagegroup == $this->numpages) {
+				$this->currpagegroup = ($this->numpages - 1);
+			}
+			if (isset($this->pagegroups[$this->numpages])) {
+				unset($this->pagegroups[$this->numpages]);
+			}
+			if (isset($this->pageopen[$this->numpages])) {
+				unset($this->pageopen[$this->numpages]);
+			}
+		}
+		--$this->numpages;
+		$this->page = $this->numpages;
+		// adjust outlines
+		$tmpoutlines = $this->outlines;
+		foreach ($tmpoutlines as $key => $outline) {
+			if ($outline['p'] > $page) {
+				$this->outlines[$key]['p'] = $outline['p'] - 1;
+			} elseif ($outline['p'] == $page) {
+				unset($this->outlines[$key]);
+			}
+		}
+		// adjust dests
+		$tmpdests = $this->dests;
+		foreach ($tmpdests as $key => $dest) {
+			if ($dest['p'] > $page) {
+				$this->dests[$key]['p'] = $dest['p'] - 1;
+			} elseif ($dest['p'] == $page) {
+				unset($this->dests[$key]);
+			}
+		}
+		// adjust links
+		$tmplinks = $this->links;
+		foreach ($tmplinks as $key => $link) {
+			if ($link[0] > $page) {
+				$this->links[$key][0] = $link[0] - 1;
+			} elseif ($link[0] == $page) {
+				unset($this->links[$key]);
+			}
+		}
+		// adjust javascript
+		$tmpjavascript = $this->javascript;
+		global $jpage;
+		$jpage = $page;
+		$this->javascript = preg_replace_callback('/this\.addField\(\'([^\']*)\',\'([^\']*)\',([0-9]+)/',
+			create_function('$matches', 'global $jpage;
+			$pagenum = intval($matches[3]) + 1;
+			if ($pagenum >= $jpage) {
+				$newpage = ($pagenum - 1);
+			} elseif ($pagenum == $jpage) {
+				$newpage = 1;
+			} else {
+				$newpage = $pagenum;
+			}
+			--$newpage;
+			return "this.addField(\'".$matches[1]."\',\'".$matches[2]."\',".$newpage."";'), $tmpjavascript);
+		// return to last page
+		if ($this->numpages > 0) {
+			$this->lastPage(true);
+		}
+		return true;
+	}
+
+	/**
+	 * Clone the specified page to a new page.
+	 * @param $page (int) number of page to copy (0 = current page)
+	 * @return true in case of success, false in case of error.
+	 * @public
+	 * @since 4.9.015 (2010-04-20)
+	 */
+	public function copyPage($page=0) {
+		if ($page == 0) {
+			// default value
+			$page = $this->page;
+		}
+		if (($page < 1) OR ($page > $this->numpages)) {
+			return false;
+		}
+		// close the last page
+		$this->endPage();
+		// copy all page-related states
+		++$this->numpages;
+		$this->page = $this->numpages;
+		$this->setPageBuffer($this->page, $this->getPageBuffer($page));
+		$this->pagedim[$this->page] = $this->pagedim[$page];
+		$this->pagelen[$this->page] = $this->pagelen[$page];
+		$this->intmrk[$this->page] = $this->intmrk[$page];
+		$this->bordermrk[$this->page] = $this->bordermrk[$page];
+		$this->cntmrk[$this->page] = $this->cntmrk[$page];
+		$this->pageobjects[$this->page] = $this->pageobjects[$page];
+		$this->pageopen[$this->page] = false;
+		if (isset($this->footerpos[$page])) {
+			$this->footerpos[$this->page] = $this->footerpos[$page];
+		}
+		if (isset($this->footerlen[$page])) {
+			$this->footerlen[$this->page] = $this->footerlen[$page];
+		}
+		if (isset($this->transfmrk[$page])) {
+			$this->transfmrk[$this->page] = $this->transfmrk[$page];
+		}
+		if (isset($this->PageAnnots[$page])) {
+			$this->PageAnnots[$this->page] = $this->PageAnnots[$page];
+		}
+		if (isset($this->newpagegroup[$page])) {
+			// start a new group
+			$this->newpagegroup[$this->page] = sizeof($this->newpagegroup) + 1;
+			$this->currpagegroup = $this->newpagegroup[$this->page];
+			$this->pagegroups[$this->currpagegroup] = 1;
+		} elseif (isset($this->currpagegroup) AND ($this->currpagegroup > 0)) {
+			++$this->pagegroups[$this->currpagegroup];
+		}
+		// copy outlines
+		$tmpoutlines = $this->outlines;
+		foreach ($tmpoutlines as $key => $outline) {
+			if ($outline['p'] == $page) {
+				$this->outlines[] = array('t' => $outline['t'], 'l' => $outline['l'], 'x' => $outline['x'], 'y' => $outline['y'], 'p' => $this->page, 's' => $outline['s'], 'c' => $outline['c']);
+			}
+		}
+		// copy links
+		$tmplinks = $this->links;
+		foreach ($tmplinks as $key => $link) {
+			if ($link[0] == $page) {
+				$this->links[] = array($this->page, $link[1]);
+			}
+		}
+		// return to last page
+		$this->lastPage(true);
+		return true;
+	}
+
+	/**
+	 * Output a Table of Content Index (TOC).
+	 * This method must be called after all Bookmarks were set.
+	 * Before calling this method you have to open the page using the addTOCPage() method.
+	 * After calling this method you have to call endTOCPage() to close the TOC page.
+	 * You can override this method to achieve different styles.
+	 * @param $page (int) page number where this TOC should be inserted (leave empty for current page).
+	 * @param $numbersfont (string) set the font for page numbers (please use monospaced font for better alignment).
+	 * @param $filler (string) string used to fill the space between text and page number.
+	 * @param $toc_name (string) name to use for TOC bookmark.
+	 * @param $style (string) Font style for title: B = Bold, I = Italic, BI = Bold + Italic.
+	 * @param $color (array) RGB color array for bookmark title (values from 0 to 255).
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 4.5.000 (2009-01-02)
+	 * @see addTOCPage(), endTOCPage(), addHTMLTOC()
+	 */
+	public function addTOC($page='', $numbersfont='', $filler='.', $toc_name='TOC', $style='', $color=array(0,0,0)) {
+		$fontsize = $this->FontSizePt;
+		$fontfamily = $this->FontFamily;
+		$fontstyle = $this->FontStyle;
+		$w = $this->w - $this->lMargin - $this->rMargin;
+		$spacer = $this->GetStringWidth(chr(32)) * 4;
+		$lmargin = $this->lMargin;
+		$rmargin = $this->rMargin;
+		$x_start = $this->GetX();
+		$page_first = $this->page;
+		$current_page = $this->page;
+		$page_fill_start = false;
+		$page_fill_end = false;
+		$current_column = $this->current_column;
+		if (TCPDF_STATIC::empty_string($numbersfont)) {
+			$numbersfont = $this->default_monospaced_font;
+		}
+		if (TCPDF_STATIC::empty_string($filler)) {
+			$filler = ' ';
+		}
+		if (TCPDF_STATIC::empty_string($page)) {
+			$gap = ' ';
+		} else {
+			$gap = '';
+			if ($page < 1) {
+				$page = 1;
+			}
+		}
+		$this->SetFont($numbersfont, $fontstyle, $fontsize);
+		$numwidth = $this->GetStringWidth('00000');
+		$maxpage = 0; //used for pages on attached documents
+		foreach ($this->outlines as $key => $outline) {
+			// check for extra pages (used for attachments)
+			if (($this->page > $page_first) AND ($outline['p'] >= $this->numpages)) {
+				$outline['p'] += ($this->page - $page_first);
+			}
+			if ($this->rtl) {
+				$aligntext = 'R';
+				$alignnum = 'L';
+			} else {
+				$aligntext = 'L';
+				$alignnum = 'R';
+			}
+			if ($outline['l'] == 0) {
+				$this->SetFont($fontfamily, $outline['s'].'B', $fontsize);
+			} else {
+				$this->SetFont($fontfamily, $outline['s'], $fontsize - $outline['l']);
+			}
+			$this->SetTextColorArray($outline['c']);
+			// check for page break
+			$this->checkPageBreak((2 * $this->FontSize * $this->cell_height_ratio));
+			// set margins and X position
+			if (($this->page == $current_page) AND ($this->current_column == $current_column)) {
+				$this->lMargin = $lmargin;
+				$this->rMargin = $rmargin;
+			} else {
+				if ($this->current_column != $current_column) {
+					if ($this->rtl) {
+						$x_start = $this->w - $this->columns[$this->current_column]['x'];
+					} else {
+						$x_start = $this->columns[$this->current_column]['x'];
+					}
+				}
+				$lmargin = $this->lMargin;
+				$rmargin = $this->rMargin;
+				$current_page = $this->page;
+				$current_column = $this->current_column;
+			}
+			$this->SetX($x_start);
+			$indent = ($spacer * $outline['l']);
+			if ($this->rtl) {
+				$this->x -= $indent;
+				$this->rMargin = $this->w - $this->x;
+			} else {
+				$this->x += $indent;
+				$this->lMargin = $this->x;
+			}
+			$link = $this->AddLink();
+			$this->SetLink($link, $outline['y'], $outline['p']);
+			// write the text
+			if ($this->rtl) {
+				$txt = ' '.$outline['t'];
+			} else {
+				$txt = $outline['t'].' ';
+			}
+			$this->Write(0, $txt, $link, false, $aligntext, false, 0, false, false, 0, $numwidth, '');
+			if ($this->rtl) {
+				$tw = $this->x - $this->lMargin;
+			} else {
+				$tw = $this->w - $this->rMargin - $this->x;
+			}
+			$this->SetFont($numbersfont, $fontstyle, $fontsize);
+			if (TCPDF_STATIC::empty_string($page)) {
+				$pagenum = $outline['p'];
+			} else {
+				// placemark to be replaced with the correct number
+				$pagenum = '{#'.($outline['p']).'}';
+				if ($this->isUnicodeFont()) {
+					$pagenum = '{'.$pagenum.'}';
+				}
+				$maxpage = max($maxpage, $outline['p']);
+			}
+			$fw = ($tw - $this->GetStringWidth($pagenum.$filler));
+			$wfiller = $this->GetStringWidth($filler);
+			if ($wfiller > 0) {
+				$numfills = floor($fw / $wfiller);
+			} else {
+				$numfills = 0;
+			}
+			if ($numfills > 0) {
+				$rowfill = str_repeat($filler, $numfills);
+			} else {
+				$rowfill = '';
+			}
+			if ($this->rtl) {
+				$pagenum = $pagenum.$gap.$rowfill;
+			} else {
+				$pagenum = $rowfill.$gap.$pagenum;
+			}
+			// write the number
+			$this->Cell($tw, 0, $pagenum, 0, 1, $alignnum, 0, $link, 0);
+		}
+		$page_last = $this->getPage();
+		$numpages = ($page_last - $page_first + 1);
+		// account for booklet mode
+		if ($this->booklet) {
+			// check if a blank page is required before TOC
+			$page_fill_start = ((($page_first % 2) == 0) XOR (($page % 2) == 0));
+			$page_fill_end = (!((($numpages % 2) == 0) XOR ($page_fill_start)));
+			if ($page_fill_start) {
+				// add a page at the end (to be moved before TOC)
+				$this->addPage();
+				++$page_last;
+				++$numpages;
+			}
+			if ($page_fill_end) {
+				// add a page at the end
+				$this->addPage();
+				++$page_last;
+				++$numpages;
+			}
+		}
+		$maxpage = max($maxpage, $page_last);
+		if (!TCPDF_STATIC::empty_string($page)) {
+			for ($p = $page_first; $p <= $page_last; ++$p) {
+				// get page data
+				$temppage = $this->getPageBuffer($p);
+				for ($n = 1; $n <= $maxpage; ++$n) {
+					// update page numbers
+					$a = '{#'.$n.'}';
+					// get page number aliases
+					$pnalias = $this->getInternalPageNumberAliases($a);
+					// calculate replacement number
+					if (($n >= $page) AND ($n <= $this->numpages)) {
+						$np = $n + $numpages;
+					} else {
+						$np = $n;
+					}
+					$na = TCPDF_STATIC::formatTOCPageNumber(($this->starting_page_number + $np - 1));
+					$nu = TCPDF_FONTS::UTF8ToUTF16BE($na, false, $this->isunicode, $this->CurrentFont);
+					// replace aliases with numbers
+					foreach ($pnalias['u'] as $u) {
+						$sfill = str_repeat($filler, max(0, (strlen($u) - strlen($nu.' '))));
+						if ($this->rtl) {
+							$nr = $nu.TCPDF_FONTS::UTF8ToUTF16BE(' '.$sfill, false, $this->isunicode, $this->CurrentFont);
+						} else {
+							$nr = TCPDF_FONTS::UTF8ToUTF16BE($sfill.' ', false, $this->isunicode, $this->CurrentFont).$nu;
+						}
+						$temppage = str_replace($u, $nr, $temppage);
+					}
+					foreach ($pnalias['a'] as $a) {
+						$sfill = str_repeat($filler, max(0, (strlen($a) - strlen($na.' '))));
+						if ($this->rtl) {
+							$nr = $na.' '.$sfill;
+						} else {
+							$nr = $sfill.' '.$na;
+						}
+						$temppage = str_replace($a, $nr, $temppage);
+					}
+				}
+				// save changes
+				$this->setPageBuffer($p, $temppage);
+			}
+			// move pages
+			$this->Bookmark($toc_name, 0, 0, $page_first, $style, $color);
+			if ($page_fill_start) {
+				$this->movePage($page_last, $page_first);
+			}
+			for ($i = 0; $i < $numpages; ++$i) {
+				$this->movePage($page_last, $page);
+			}
+		}
+	}
+
+	/**
+	 * Output a Table Of Content Index (TOC) using HTML templates.
+	 * This method must be called after all Bookmarks were set.
+	 * Before calling this method you have to open the page using the addTOCPage() method.
+	 * After calling this method you have to call endTOCPage() to close the TOC page.
+	 * @param $page (int) page number where this TOC should be inserted (leave empty for current page).
+	 * @param $toc_name (string) name to use for TOC bookmark.
+	 * @param $templates (array) array of html templates. Use: "#TOC_DESCRIPTION#" for bookmark title, "#TOC_PAGE_NUMBER#" for page number.
+	 * @param $correct_align (boolean) if true correct the number alignment (numbers must be in monospaced font like courier and right aligned on LTR, or left aligned on RTL)
+	 * @param $style (string) Font style for title: B = Bold, I = Italic, BI = Bold + Italic.
+	 * @param $color (array) RGB color array for title (values from 0 to 255).
+	 * @public
+	 * @author Nicola Asuni
+	 * @since 5.0.001 (2010-05-06)
+	 * @see addTOCPage(), endTOCPage(), addTOC()
+	 */
+	public function addHTMLTOC($page='', $toc_name='TOC', $templates=array(), $correct_align=true, $style='', $color=array(0,0,0)) {
+		$filler = ' ';
+		$prev_htmlLinkColorArray = $this->htmlLinkColorArray;
+		$prev_htmlLinkFontStyle = $this->htmlLinkFontStyle;
+		// set new style for link
+		$this->htmlLinkColorArray = array();
+		$this->htmlLinkFontStyle = '';
+		$page_first = $this->getPage();
+		$page_fill_start = false;
+		$page_fill_end = false;
+		// get the font type used for numbers in each template
+		$current_font = $this->FontFamily;
+		foreach ($templates as $level => $html) {
+			$dom = $this->getHtmlDomArray($html);
+			foreach ($dom as $key => $value) {
+				if ($value['value'] == '#TOC_PAGE_NUMBER#') {
+					$this->SetFont($dom[($key - 1)]['fontname']);
+					$templates['F'.$level] = $this->isUnicodeFont();
+				}
+			}
+		}
+		$this->SetFont($current_font);
+		$maxpage = 0; //used for pages on attached documents
+		foreach ($this->outlines as $key => $outline) {
+			// get HTML template
+			$row = $templates[$outline['l']];
+			if (TCPDF_STATIC::empty_string($page)) {
+				$pagenum = $outline['p'];
+			} else {
+				// placemark to be replaced with the correct number
+				$pagenum = '{#'.($outline['p']).'}';
+				if ($templates['F'.$outline['l']]) {
+					$pagenum = '{'.$pagenum.'}';
+				}
+				$maxpage = max($maxpage, $outline['p']);
+			}
+			// replace templates with current values
+			$row = str_replace('#TOC_DESCRIPTION#', $outline['t'], $row);
+			$row = str_replace('#TOC_PAGE_NUMBER#', $pagenum, $row);
+			// add link to page
+			$row = '<a href="#'.$outline['p'].','.$outline['y'].'">'.$row.'</a>';
+			// write bookmark entry
+			$this->writeHTML($row, false, false, true, false, '');
+		}
+		// restore link styles
+		$this->htmlLinkColorArray = $prev_htmlLinkColorArray;
+		$this->htmlLinkFontStyle = $prev_htmlLinkFontStyle;
+		// move TOC page and replace numbers
+		$page_last = $this->getPage();
+		$numpages = ($page_last - $page_first + 1);
+		// account for booklet mode
+		if ($this->booklet) {
+			// check if a blank page is required before TOC
+			$page_fill_start = ((($page_first % 2) == 0) XOR (($page % 2) == 0));
+			$page_fill_end = (!((($numpages % 2) == 0) XOR ($page_fill_start)));
+			if ($page_fill_start) {
+				// add a page at the end (to be moved before TOC)
+				$this->addPage();
+				++$page_last;
+				++$numpages;
+			}
+			if ($page_fill_end) {
+				// add a page at the end
+				$this->addPage();
+				++$page_last;
+				++$numpages;
+			}
+		}
+		$maxpage = max($maxpage, $page_last);
+		if (!TCPDF_STATIC::empty_string($page)) {
+			for ($p = $page_first; $p <= $page_last; ++$p) {
+				// get page data
+				$temppage = $this->getPageBuffer($p);
+				for ($n = 1; $n <= $maxpage; ++$n) {
+					// update page numbers
+					$a = '{#'.$n.'}';
+					// get page number aliases
+					$pnalias = $this->getInternalPageNumberAliases($a);
+					// calculate replacement number
+					if ($n >= $page) {
+						$np = $n + $numpages;
+					} else {
+						$np = $n;
+					}
+					$na = TCPDF_STATIC::formatTOCPageNumber(($this->starting_page_number + $np - 1));
+					$nu = TCPDF_FONTS::UTF8ToUTF16BE($na, false, $this->isunicode, $this->CurrentFont);
+					// replace aliases with numbers
+					foreach ($pnalias['u'] as $u) {
+						if ($correct_align) {
+							$sfill = str_repeat($filler, (strlen($u) - strlen($nu.' ')));
+							if ($this->rtl) {
+								$nr = $nu.TCPDF_FONTS::UTF8ToUTF16BE(' '.$sfill, false, $this->isunicode, $this->CurrentFont);
+							} else {
+								$nr = TCPDF_FONTS::UTF8ToUTF16BE($sfill.' ', false, $this->isunicode, $this->CurrentFont).$nu;
+							}
+						} else {
+							$nr = $nu;
+						}
+						$temppage = str_replace($u, $nr, $temppage);
+					}
+					foreach ($pnalias['a'] as $a) {
+						if ($correct_align) {
+							$sfill = str_repeat($filler, (strlen($a) - strlen($na.' ')));
+							if ($this->rtl) {
+								$nr = $na.' '.$sfill;
+							} else {
+								$nr = $sfill.' '.$na;
+							}
+						} else {
+							$nr = $na;
+						}
+						$temppage = str_replace($a, $nr, $temppage);
+					}
+				}
+				// save changes
+				$this->setPageBuffer($p, $temppage);
+			}
+			// move pages
+			$this->Bookmark($toc_name, 0, 0, $page_first, $style, $color);
+			if ($page_fill_start) {
+				$this->movePage($page_last, $page_first);
+			}
+			for ($i = 0; $i < $numpages; ++$i) {
+				$this->movePage($page_last, $page);
+			}
+		}
+	}
+
+	/**
+	 * Stores a copy of the current TCPDF object used for undo operation.
+	 * @public
+	 * @since 4.5.029 (2009-03-19)
+	 */
+	public function startTransaction() {
+		if (isset($this->objcopy)) {
+			// remove previous copy
+			$this->commitTransaction();
+		}
+		// record current page number and Y position
+		$this->start_transaction_page = $this->page;
+		$this->start_transaction_y = $this->y;
+		// clone current object
+		$this->objcopy = TCPDF_STATIC::objclone($this);
+	}
+
+	/**
+	 * Delete the copy of the current TCPDF object used for undo operation.
+	 * @public
+	 * @since 4.5.029 (2009-03-19)
+	 */
+	public function commitTransaction() {
+		if (isset($this->objcopy)) {
+			$this->objcopy->_destroy(true, true);
+			unset($this->objcopy);
+		}
+	}
+
+	/**
+	 * This method allows to undo the latest transaction by returning the latest saved TCPDF object with startTransaction().
+	 * @param $self (boolean) if true restores current class object to previous state without the need of reassignment via the returned value.
+	 * @return TCPDF object.
+	 * @public
+	 * @since 4.5.029 (2009-03-19)
+	 */
+	public function rollbackTransaction($self=false) {
+		if (isset($this->objcopy)) {
+			if (isset($this->objcopy->diskcache) AND $this->objcopy->diskcache) {
+				// truncate files to previous values
+				foreach ($this->objcopy->cache_file_length as $file => $length) {
+					$file = substr($file, 1);
+					$handle = fopen($file, 'r+');
+					ftruncate($handle, $length);
+				}
+			}
+			$this->_destroy(true, true);
+			if ($self) {
+				$objvars = get_object_vars($this->objcopy);
+				foreach ($objvars as $key => $value) {
+					$this->$key = $value;
+				}
+			}
+			return $this->objcopy;
+		}
+		return $this;
+	}
+
+	// --- MULTI COLUMNS METHODS -----------------------
+
+	/**
+	 * Set multiple columns of the same size
+	 * @param $numcols (int) number of columns (set to zero to disable columns mode)
+	 * @param $width (int) column width
+	 * @param $y (int) column starting Y position (leave empty for current Y position)
+	 * @public
+	 * @since 4.9.001 (2010-03-28)
+	 */
+	public function setEqualColumns($numcols=0, $width=0, $y='') {
+		$this->columns = array();
+		if ($numcols < 2) {
+			$numcols = 0;
+			$this->columns = array();
+		} else {
+			// maximum column width
+			$maxwidth = ($this->w - $this->original_lMargin - $this->original_rMargin) / $numcols;
+			if (($width == 0) OR ($width > $maxwidth)) {
+				$width = $maxwidth;
+			}
+			if (TCPDF_STATIC::empty_string($y)) {
+				$y = $this->y;
+			}
+			// space between columns
+			$space = (($this->w - $this->original_lMargin - $this->original_rMargin - ($numcols * $width)) / ($numcols - 1));
+			// fill the columns array (with, space, starting Y position)
+			for ($i = 0; $i < $numcols; ++$i) {
+				$this->columns[$i] = array('w' => $width, 's' => $space, 'y' => $y);
+			}
+		}
+		$this->num_columns = $numcols;
+		$this->current_column = 0;
+		$this->column_start_page = $this->page;
+		$this->selectColumn(0);
+	}
+
+	/**
+	 * Remove columns and reset page margins.
+	 * @public
+	 * @since 5.9.072 (2011-04-26)
+	 */
+	public function resetColumns() {
+		$this->lMargin = $this->original_lMargin;
+		$this->rMargin = $this->original_rMargin;
+		$this->setEqualColumns();
+	}
+
+	/**
+	 * Set columns array.
+	 * Each column is represented by an array of arrays with the following keys: (w = width, s = space between columns, y = column top position).
+	 * @param $columns (array)
+	 * @public
+	 * @since 4.9.001 (2010-03-28)
+	 */
+	public function setColumnsArray($columns) {
+		$this->columns = $columns;
+		$this->num_columns = count($columns);
+		$this->current_column = 0;
+		$this->column_start_page = $this->page;
+		$this->selectColumn(0);
+	}
+
+	/**
+	 * Set position at a given column
+	 * @param $col (int) column number (from 0 to getNumberOfColumns()-1); empty string = current column.
+	 * @public
+	 * @since 4.9.001 (2010-03-28)
+	 */
+	public function selectColumn($col='') {
+		if (is_string($col)) {
+			$col = $this->current_column;
+		} elseif ($col >= $this->num_columns) {
+			$col = 0;
+		}
+		$xshift = array('x' => 0, 's' => array('H' => 0, 'V' => 0), 'p' => array('L' => 0, 'T' => 0, 'R' => 0, 'B' => 0));
+		$enable_thead = false;
+		if ($this->num_columns > 1) {
+			if ($col != $this->current_column) {
+				// move Y pointer at the top of the column
+				if ($this->column_start_page == $this->page) {
+					$this->y = $this->columns[$col]['y'];
+				} else {
+					$this->y = $this->tMargin;
+				}
+				// Avoid to write table headers more than once
+				if (($this->page > $this->maxselcol['page']) OR (($this->page == $this->maxselcol['page']) AND ($col > $this->maxselcol['column']))) {
+					$enable_thead = true;
+					$this->maxselcol['page'] = $this->page;
+					$this->maxselcol['column'] = $col;
+				}
+			}
+			$xshift = $this->colxshift;
+			// set X position of the current column by case
+			$listindent = ($this->listindentlevel * $this->listindent);
+			// calculate column X position
+			$colpos = 0;
+			for ($i = 0; $i < $col; ++$i) {
+				$colpos += ($this->columns[$i]['w'] + $this->columns[$i]['s']);
+			}
+			if ($this->rtl) {
+				$x = $this->w - $this->original_rMargin - $colpos;
+				$this->rMargin = ($this->w - $x + $listindent);
+				$this->lMargin = ($x - $this->columns[$col]['w']);
+				$this->x = $x - $listindent;
+			} else {
+				$x = $this->original_lMargin + $colpos;
+				$this->lMargin = ($x + $listindent);
+				$this->rMargin = ($this->w - $x - $this->columns[$col]['w']);
+				$this->x = $x + $listindent;
+			}
+			$this->columns[$col]['x'] = $x;
+		}
+		$this->current_column = $col;
+		// fix for HTML mode
+		$this->newline = true;
+		// print HTML table header (if any)
+		if ((!TCPDF_STATIC::empty_string($this->thead)) AND (!$this->inthead)) {
+			if ($enable_thead) {
+				// print table header
+				$this->writeHTML($this->thead, false, false, false, false, '');
+				$this->y += $xshift['s']['V'];
+				// store end of header position
+				if (!isset($this->columns[$col]['th'])) {
+					$this->columns[$col]['th'] = array();
+				}
+				$this->columns[$col]['th']['\''.$this->page.'\''] = $this->y;
+				$this->lasth = 0;
+			} elseif (isset($this->columns[$col]['th']['\''.$this->page.'\''])) {
+				$this->y = $this->columns[$col]['th']['\''.$this->page.'\''];
+			}
+		}
+		// account for an html table cell over multiple columns
+		if ($this->rtl) {
+			$this->rMargin += $xshift['x'];
+			$this->x -= ($xshift['x'] + $xshift['p']['R']);
+		} else {
+			$this->lMargin += $xshift['x'];
+			$this->x += $xshift['x'] + $xshift['p']['L'];
+		}
+	}
+
+	/**
+	 * Return the current column number
+	 * @return int current column number
+	 * @public
+	 * @since 5.5.011 (2010-07-08)
+	 */
+	public function getColumn() {
+		return $this->current_column;
+	}
+
+	/**
+	 * Return the current number of columns.
+	 * @return int number of columns
+	 * @public
+	 * @since 5.8.018 (2010-08-25)
+	 */
+	public function getNumberOfColumns() {
+		return $this->num_columns;
+	}
+
+	/**
+	 * Set Text rendering mode.
+	 * @param $stroke (int) outline size in user units (0 = disable).
+	 * @param $fill (boolean) if true fills the text (default).
+	 * @param $clip (boolean) if true activate clipping mode
+	 * @public
+	 * @since 4.9.008 (2009-04-02)
+	 */
+	public function setTextRenderingMode($stroke=0, $fill=true, $clip=false) {
+		// Ref.: PDF 32000-1:2008 - 9.3.6 Text Rendering Mode
+		// convert text rendering parameters
+		if ($stroke < 0) {
+			$stroke = 0;
+		}
+		if ($fill === true) {
+			if ($stroke > 0) {
+				if ($clip === true) {
+					// Fill, then stroke text and add to path for clipping
+					$textrendermode = 6;
+				} else {
+					// Fill, then stroke text
+					$textrendermode = 2;
+				}
+				$textstrokewidth = $stroke;
+			} else {
+				if ($clip === true) {
+					// Fill text and add to path for clipping
+					$textrendermode = 4;
+				} else {
+					// Fill text
+					$textrendermode = 0;
+				}
+			}
+		} else {
+			if ($stroke > 0) {
+				if ($clip === true) {
+					// Stroke text and add to path for clipping
+					$textrendermode = 5;
+				} else {
+					// Stroke text
+					$textrendermode = 1;
+				}
+				$textstrokewidth = $stroke;
+			} else {
+				if ($clip === true) {
+					// Add text to path for clipping
+					$textrendermode = 7;
+				} else {
+					// Neither fill nor stroke text (invisible)
+					$textrendermode = 3;
+				}
+			}
+		}
+		$this->textrendermode = $textrendermode;
+		$this->textstrokewidth = $stroke;
+	}
+
+	/**
+	 * Set parameters for drop shadow effect for text.
+	 * @param $params (array) Array of parameters: enabled (boolean) set to true to enable shadow; depth_w (float) shadow width in user units; depth_h (float) shadow height in user units; color (array) shadow color or false to use the stroke color; opacity (float) Alpha value: real value from 0 (transparent) to 1 (opaque); blend_mode (string) blend mode, one of the following: Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn, HardLight, SoftLight, Difference, Exclusion, Hue, Saturation, Color, Luminosity.
+	 * @since 5.9.174 (2012-07-25)
+	 * @public
+	*/
+	public function setTextShadow($params=array('enabled'=>false, 'depth_w'=>0, 'depth_h'=>0, 'color'=>false, 'opacity'=>1, 'blend_mode'=>'Normal')) {
+		if (isset($params['enabled'])) {
+			$this->txtshadow['enabled'] = $params['enabled']?true:false;
+		} else {
+			$this->txtshadow['enabled'] = false;
+		}
+		if (isset($params['depth_w'])) {
+			$this->txtshadow['depth_w'] = floatval($params['depth_w']);
+		} else {
+			$this->txtshadow['depth_w'] = 0;
+		}
+		if (isset($params['depth_h'])) {
+			$this->txtshadow['depth_h'] = floatval($params['depth_h']);
+		} else {
+			$this->txtshadow['depth_h'] = 0;
+		}
+		if (isset($params['color']) AND ($params['color'] !== false) AND is_array($params['color'])) {
+			$this->txtshadow['color'] = $params['color'];
+		} else {
+			$this->txtshadow['color'] = $this->strokecolor;
+		}
+		if (isset($params['opacity'])) {
+			$this->txtshadow['opacity'] = min(1, max(0, floatval($params['opacity'])));
+		} else {
+			$this->txtshadow['opacity'] = 1;
+		}
+		if (isset($params['blend_mode']) AND in_array($params['blend_mode'], array('Normal', 'Multiply', 'Screen', 'Overlay', 'Darken', 'Lighten', 'ColorDodge', 'ColorBurn', 'HardLight', 'SoftLight', 'Difference', 'Exclusion', 'Hue', 'Saturation', 'Color', 'Luminosity'))) {
+			$this->txtshadow['blend_mode'] = $params['blend_mode'];
+		} else {
+			$this->txtshadow['blend_mode'] = 'Normal';
+		}
+		if ((($this->txtshadow['depth_w'] == 0) AND ($this->txtshadow['depth_h'] == 0)) OR ($this->txtshadow['opacity'] == 0)) {
+			$this->txtshadow['enabled'] = false;
+		}
+	}
+
+	/**
+	 * Return the text shadow parameters array.
+	 * @return Array of parameters.
+	 * @since 5.9.174 (2012-07-25)
+	 * @public
+	 */
+	public function getTextShadow() {
+		return $this->txtshadow;
+	}
+
+	/**
+	 * Returns an array of chars containing soft hyphens.
+	 * @param $word (array) array of chars
+	 * @param $patterns (array) Array of hypenation patterns.
+	 * @param $dictionary (array) Array of words to be returned without applying the hyphenation algoritm.
+	 * @param $leftmin (int) Minimum number of character to leave on the left of the word without applying the hyphens.
+	 * @param $rightmin (int) Minimum number of character to leave on the right of the word without applying the hyphens.
+	 * @param $charmin (int) Minimum word length to apply the hyphenation algoritm.
+	 * @param $charmax (int) Maximum length of broken piece of word.
+	 * @return array text with soft hyphens
+	 * @author Nicola Asuni
+	 * @since 4.9.012 (2010-04-12)
+	 * @protected
+	 */
+	protected function hyphenateWord($word, $patterns, $dictionary=array(), $leftmin=1, $rightmin=2, $charmin=1, $charmax=8) {
+		$hyphenword = array(); // hyphens positions
+		$numchars = count($word);
+		if ($numchars <= $charmin) {
+			return $word;
+		}
+		$word_string = TCPDF_FONTS::UTF8ArrSubString($word, '', '', $this->isunicode);
+		// some words will be returned as-is
+		$pattern = '/^([a-zA-Z0-9_\.\-]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/';
+		if (preg_match($pattern, $word_string) > 0) {
+			// email
+			return $word;
+		}
+		$pattern = '/(([a-zA-Z0-9\-]+\.)?)((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/';
+		if (preg_match($pattern, $word_string) > 0) {
+			// URL
+			return $word;
+		}
+		if (isset($dictionary[$word_string])) {
+			return TCPDF_FONTS::UTF8StringToArray($dictionary[$word_string], $this->isunicode, $this->CurrentFont);
+		}
+		// suround word with '_' characters
+		$tmpword = array_merge(array(95), $word, array(95));
+		$tmpnumchars = $numchars + 2;
+		$maxpos = $tmpnumchars - $charmin;
+		for ($pos = 0; $pos < $maxpos; ++$pos) {
+			$imax = min(($tmpnumchars - $pos), $charmax);
+			for ($i = $charmin; $i <= $imax; ++$i) {
+				$subword = strtolower(TCPDF_FONTS::UTF8ArrSubString($tmpword, $pos, ($pos + $i), $this->isunicode));
+				if (isset($patterns[$subword])) {
+					$pattern = TCPDF_FONTS::UTF8StringToArray($patterns[$subword], $this->isunicode, $this->CurrentFont);
+					$pattern_length = count($pattern);
+					$digits = 1;
+					for ($j = 0; $j < $pattern_length; ++$j) {
+						// check if $pattern[$j] is a number
+						if (($pattern[$j] >= 48) AND ($pattern[$j] <= 57)) {
+							if ($j == 0) {
+								$zero = $pos - 1;
+							} else {
+								$zero = $pos + $j - $digits;
+							}
+							if (!isset($hyphenword[$zero]) OR ($hyphenword[$zero] != $pattern[$j])) {
+								$hyphenword[$zero] = TCPDF_FONTS::unichr($pattern[$j], $this->isunicode);
+							}
+							++$digits;
+						}
+					}
+				}
+			}
+		}
+		$inserted = 0;
+		$maxpos = $numchars - $rightmin;
+		for ($i = $leftmin; $i <= $maxpos; ++$i) {
+			if (isset($hyphenword[$i]) AND (($hyphenword[$i] % 2) != 0)) {
+				// 173 = soft hyphen character
+				array_splice($word, $i + $inserted, 0, 173);
+				++$inserted;
+			}
+		}
+		return $word;
+	}
+
+	/**
+	 * Returns text with soft hyphens.
+	 * @param $text (string) text to process
+	 * @param $patterns (mixed) Array of hypenation patterns or a TEX file containing hypenation patterns. TEX patterns can be downloaded from http://www.ctan.org/tex-archive/language/hyph-utf8/tex/generic/hyph-utf8/patterns/
+	 * @param $dictionary (array) Array of words to be returned without applying the hyphenation algoritm.
+	 * @param $leftmin (int) Minimum number of character to leave on the left of the word without applying the hyphens.
+	 * @param $rightmin (int) Minimum number of character to leave on the right of the word without applying the hyphens.
+	 * @param $charmin (int) Minimum word length to apply the hyphenation algoritm.
+	 * @param $charmax (int) Maximum length of broken piece of word.
+	 * @return array text with soft hyphens
+	 * @author Nicola Asuni
+	 * @since 4.9.012 (2010-04-12)
+	 * @public
+	 */
+	public function hyphenateText($text, $patterns, $dictionary=array(), $leftmin=1, $rightmin=2, $charmin=1, $charmax=8) {
+		$text = $this->unhtmlentities($text);
+		$word = array(); // last word
+		$txtarr = array(); // text to be returned
+		$intag = false; // true if we are inside an HTML tag
+		if (!is_array($patterns)) {
+			$patterns = TCPDF_STATIC::getHyphenPatternsFromTEX($patterns);
+		}
+		// get array of characters
+		$unichars = TCPDF_FONTS::UTF8StringToArray($text, $this->isunicode, $this->CurrentFont);
+		// for each char
+		foreach ($unichars as $char) {
+			if ((!$intag) AND TCPDF_FONT_DATA::$uni_type[$char] == 'L') {
+				// letter character
+				$word[] = $char;
+			} else {
+				// other type of character
+				if (!TCPDF_STATIC::empty_string($word)) {
+					// hypenate the word
+					$txtarr = array_merge($txtarr, $this->hyphenateWord($word, $patterns, $dictionary, $leftmin, $rightmin, $charmin, $charmax));
+					$word = array();
+				}
+				$txtarr[] = $char;
+				if (chr($char) == '<') {
+					// we are inside an HTML tag
+					$intag = true;
+				} elseif ($intag AND (chr($char) == '>')) {
+					// end of HTML tag
+					$intag = false;
+				}
+			}
+		}
+		if (!TCPDF_STATIC::empty_string($word)) {
+			// hypenate the word
+			$txtarr = array_merge($txtarr, $this->hyphenateWord($word, $patterns, $dictionary, $leftmin, $rightmin, $charmin, $charmax));
+		}
+		// convert char array to string and return
+		return TCPDF_FONTS::UTF8ArrSubString($txtarr, '', '', $this->isunicode);
+	}
+
+	/**
+	 * Enable/disable rasterization of vector images using ImageMagick library.
+	 * @param $mode (boolean) if true enable rasterization, false otherwise.
+	 * @public
+	 * @since 5.0.000 (2010-04-27)
+	 */
+	public function setRasterizeVectorImages($mode) {
+		$this->rasterize_vector_images = $mode;
+	}
+
+	/**
+	 * Enable or disable default option for font subsetting.
+	 * @param $enable (boolean) if true enable font subsetting by default.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.3.002 (2010-06-07)
+	 */
+	public function setFontSubsetting($enable=true) {
+		if ($this->pdfa_mode) {
+			$this->font_subsetting = false;
+		} else {
+			$this->font_subsetting = $enable ? true : false;
+		}
+	}
+
+	/**
+	 * Return the default option for font subsetting.
+	 * @return boolean default font subsetting state.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.3.002 (2010-06-07)
+	 */
+	public function getFontSubsetting() {
+		return $this->font_subsetting;
+	}
+
+	/**
+	 * Left trim the input string
+	 * @param $str (string) string to trim
+	 * @param $replace (string) string that replace spaces.
+	 * @return left trimmed string
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.8.000 (2010-08-11)
+	 */
+	public function stringLeftTrim($str, $replace='') {
+		return preg_replace('/^'.$this->re_space['p'].'+/'.$this->re_space['m'], $replace, $str);
+	}
+
+	/**
+	 * Right trim the input string
+	 * @param $str (string) string to trim
+	 * @param $replace (string) string that replace spaces.
+	 * @return right trimmed string
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.8.000 (2010-08-11)
+	 */
+	public function stringRightTrim($str, $replace='') {
+		return preg_replace('/'.$this->re_space['p'].'+$/'.$this->re_space['m'], $replace, $str);
+	}
+
+	/**
+	 * Trim the input string
+	 * @param $str (string) string to trim
+	 * @param $replace (string) string that replace spaces.
+	 * @return trimmed string
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.8.000 (2010-08-11)
+	 */
+	public function stringTrim($str, $replace='') {
+		$str = $this->stringLeftTrim($str, $replace);
+		$str = $this->stringRightTrim($str, $replace);
+		return $str;
+	}
+
+	/**
+	 * Return true if the current font is unicode type.
+	 * @return true for unicode font, false otherwise.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.8.002 (2010-08-14)
+	 */
+	public function isUnicodeFont() {
+		return (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0'));
+	}
+
+	/**
+	 * Return normalized font name
+	 * @param $fontfamily (string) property string containing font family names
+	 * @return string normalized font name
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.8.004 (2010-08-17)
+	 */
+	public function getFontFamilyName($fontfamily) {
+		// remove spaces and symbols
+		$fontfamily = preg_replace('/[^a-z0-9_\,]/', '', strtolower($fontfamily));
+		// extract all font names
+		$fontslist = preg_split('/[,]/', $fontfamily);
+		// find first valid font name
+		foreach ($fontslist as $font) {
+			// replace font variations
+			$font = preg_replace('/italic$/', 'I', $font);
+			$font = preg_replace('/oblique$/', 'I', $font);
+			$font = preg_replace('/bold([I]?)$/', 'B\\1', $font);
+			// replace common family names and core fonts
+			$pattern = array();
+			$replacement = array();
+			$pattern[] = '/^serif|^cursive|^fantasy|^timesnewroman/';
+			$replacement[] = 'times';
+			$pattern[] = '/^sansserif/';
+			$replacement[] = 'helvetica';
+			$pattern[] = '/^monospace/';
+			$replacement[] = 'courier';
+			$font = preg_replace($pattern, $replacement, $font);
+			if (in_array(strtolower($font), $this->fontlist) OR in_array($font, $this->fontkeys)) {
+				return $font;
+			}
+		}
+		// return current font as default
+		return $this->CurrentFont['fontkey'];
+	}
+
+	/**
+	 * Start a new XObject Template.
+	 * An XObject Template is a PDF block that is a self-contained description of any sequence of graphics objects (including path objects, text objects, and sampled images).
+	 * An XObject Template may be painted multiple times, either on several pages or at several locations on the same page and produces the same results each time, subject only to the graphics state at the time it is invoked.
+	 * Note: X,Y coordinates will be reset to 0,0.
+	 * @param $w (int) Template width in user units (empty string or zero = page width less margins).
+	 * @param $h (int) Template height in user units (empty string or zero = page height less margins).
+	 * @param $group (mixed) Set transparency group. Can be a boolean value or an array specifying optional parameters: 'CS' (solour space name), 'I' (boolean flag to indicate isolated group) and 'K' (boolean flag to indicate knockout group).
+	 * @return int the XObject Template ID in case of success or false in case of error.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.8.017 (2010-08-24)
+	 * @see endTemplate(), printTemplate()
+	 */
+	public function startTemplate($w=0, $h=0, $group=false) {
+		if ($this->inxobj) {
+			// we are already inside an XObject template
+			return false;
+		}
+		$this->inxobj = true;
+		++$this->n;
+		// XObject ID
+		$this->xobjid = 'XT'.$this->n;
+		// object ID
+		$this->xobjects[$this->xobjid] = array('n' => $this->n);
+		// store current graphic state
+		$this->xobjects[$this->xobjid]['gvars'] = $this->getGraphicVars();
+		// initialize data
+		$this->xobjects[$this->xobjid]['intmrk'] = 0;
+		$this->xobjects[$this->xobjid]['transfmrk'] = array();
+		$this->xobjects[$this->xobjid]['outdata'] = '';
+		$this->xobjects[$this->xobjid]['xobjects'] = array();
+		$this->xobjects[$this->xobjid]['images'] = array();
+		$this->xobjects[$this->xobjid]['fonts'] = array();
+		$this->xobjects[$this->xobjid]['annotations'] = array();
+		$this->xobjects[$this->xobjid]['extgstates'] = array();
+		$this->xobjects[$this->xobjid]['gradients'] = array();
+		$this->xobjects[$this->xobjid]['spot_colors'] = array();
+		// set new environment
+		$this->num_columns = 1;
+		$this->current_column = 0;
+		$this->SetAutoPageBreak(false);
+		if (($w === '') OR ($w <= 0)) {
+			$w = $this->w - $this->lMargin - $this->rMargin;
+		}
+		if (($h === '') OR ($h <= 0)) {
+			$h = $this->h - $this->tMargin - $this->bMargin;
+		}
+		$this->xobjects[$this->xobjid]['x'] = 0;
+		$this->xobjects[$this->xobjid]['y'] = 0;
+		$this->xobjects[$this->xobjid]['w'] = $w;
+		$this->xobjects[$this->xobjid]['h'] = $h;
+		$this->w = $w;
+		$this->h = $h;
+		$this->wPt = $this->w * $this->k;
+		$this->hPt = $this->h * $this->k;
+		$this->fwPt = $this->wPt;
+		$this->fhPt = $this->hPt;
+		$this->x = 0;
+		$this->y = 0;
+		$this->lMargin = 0;
+		$this->rMargin = 0;
+		$this->tMargin = 0;
+		$this->bMargin = 0;
+		// set group mode
+		$this->xobjects[$this->xobjid]['group'] = $group;
+		return $this->xobjid;
+	}
+
+	/**
+	 * End the current XObject Template started with startTemplate() and restore the previous graphic state.
+	 * An XObject Template is a PDF block that is a self-contained description of any sequence of graphics objects (including path objects, text objects, and sampled images).
+	 * An XObject Template may be painted multiple times, either on several pages or at several locations on the same page and produces the same results each time, subject only to the graphics state at the time it is invoked.
+	 * @return int the XObject Template ID in case of success or false in case of error.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.8.017 (2010-08-24)
+	 * @see startTemplate(), printTemplate()
+	 */
+	public function endTemplate() {
+		if (!$this->inxobj) {
+			// we are not inside a template
+			return false;
+		}
+		$this->inxobj = false;
+		// restore previous graphic state
+		$this->setGraphicVars($this->xobjects[$this->xobjid]['gvars'], true);
+		return $this->xobjid;
+	}
+
+	/**
+	 * Print an XObject Template.
+	 * You can print an XObject Template inside the currently opened Template.
+	 * An XObject Template is a PDF block that is a self-contained description of any sequence of graphics objects (including path objects, text objects, and sampled images).
+	 * An XObject Template may be painted multiple times, either on several pages or at several locations on the same page and produces the same results each time, subject only to the graphics state at the time it is invoked.
+	 * @param $id (string) The ID of XObject Template to print.
+	 * @param $x (int) X position in user units (empty string = current x position)
+	 * @param $y (int) Y position in user units (empty string = current y position)
+	 * @param $w (int) Width in user units (zero = remaining page width)
+	 * @param $h (int) Height in user units (zero = remaining page height)
+	 * @param $align (string) Indicates the alignment of the pointer next to template insertion relative to template height. The value can be:<ul><li>T: top-right for LTR or top-left for RTL</li><li>M: middle-right for LTR or middle-left for RTL</li><li>B: bottom-right for LTR or bottom-left for RTL</li><li>N: next line</li></ul>
+	 * @param $palign (string) Allows to center or align the template on the current line. Possible values are:<ul><li>L : left align</li><li>C : center</li><li>R : right align</li><li>'' : empty string : left for LTR or right for RTL</li></ul>
+	 * @param $fitonpage (boolean) If true the template is resized to not exceed page dimensions.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.8.017 (2010-08-24)
+	 * @see startTemplate(), endTemplate()
+	 */
+	public function printTemplate($id, $x='', $y='', $w=0, $h=0, $align='', $palign='', $fitonpage=false) {
+		if ($this->state != 2) {
+			 return;
+		}
+		if (!isset($this->xobjects[$id])) {
+			$this->Error('The XObject Template \''.$id.'\' doesn\'t exist!');
+		}
+		if ($this->inxobj) {
+			if ($id == $this->xobjid) {
+				// close current template
+				$this->endTemplate();
+			} else {
+				// use the template as resource for the template currently opened
+				$this->xobjects[$this->xobjid]['xobjects'][$id] = $this->xobjects[$id];
+			}
+		}
+		// set default values
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		// check page for no-write regions and adapt page margins if necessary
+		list($x, $y) = $this->checkPageRegions($h, $x, $y);
+		$ow = $this->xobjects[$id]['w'];
+		if ($ow <= 0) {
+			$ow = 1;
+		}
+		$oh = $this->xobjects[$id]['h'];
+		if ($oh <= 0) {
+			$oh = 1;
+		}
+		// calculate template width and height on document
+		if (($w <= 0) AND ($h <= 0)) {
+			$w = $ow;
+			$h = $oh;
+		} elseif ($w <= 0) {
+			$w = $h * $ow / $oh;
+		} elseif ($h <= 0) {
+			$h = $w * $oh / $ow;
+		}
+		// fit the template on available space
+		list($w, $h, $x, $y) = $this->fitBlock($w, $h, $x, $y, $fitonpage);
+		// set page alignment
+		$rb_y = $y + $h;
+		// set alignment
+		if ($this->rtl) {
+			if ($palign == 'L') {
+				$xt = $this->lMargin;
+			} elseif ($palign == 'C') {
+				$xt = ($this->w + $this->lMargin - $this->rMargin - $w) / 2;
+			} elseif ($palign == 'R') {
+				$xt = $this->w - $this->rMargin - $w;
+			} else {
+				$xt = $x - $w;
+			}
+			$rb_x = $xt;
+		} else {
+			if ($palign == 'L') {
+				$xt = $this->lMargin;
+			} elseif ($palign == 'C') {
+				$xt = ($this->w + $this->lMargin - $this->rMargin - $w) / 2;
+			} elseif ($palign == 'R') {
+				$xt = $this->w - $this->rMargin - $w;
+			} else {
+				$xt = $x;
+			}
+			$rb_x = $xt + $w;
+		}
+		// print XObject Template + Transformation matrix
+		$this->StartTransform();
+		// translate and scale
+		$sx = ($w / $ow);
+		$sy = ($h / $oh);
+		$tm = array();
+		$tm[0] = $sx;
+		$tm[1] = 0;
+		$tm[2] = 0;
+		$tm[3] = $sy;
+		$tm[4] = $xt * $this->k;
+		$tm[5] = ($this->h - $h - $y) * $this->k;
+		$this->Transform($tm);
+		// set object
+		$this->_out('/'.$id.' Do');
+		$this->StopTransform();
+		// add annotations
+		if (!empty($this->xobjects[$id]['annotations'])) {
+			foreach ($this->xobjects[$id]['annotations'] as $annot) {
+				// transform original coordinates
+				$coordlt = TCPDF_STATIC::getTransformationMatrixProduct($tm, array(1, 0, 0, 1, ($annot['x'] * $this->k), (-$annot['y'] * $this->k)));
+				$ax = ($coordlt[4] / $this->k);
+				$ay = ($this->h - $h - ($coordlt[5] / $this->k));
+				$coordrb = TCPDF_STATIC::getTransformationMatrixProduct($tm, array(1, 0, 0, 1, (($annot['x'] + $annot['w']) * $this->k), ((-$annot['y'] - $annot['h']) * $this->k)));
+				$aw = ($coordrb[4] / $this->k) - $ax;
+				$ah = ($this->h - $h - ($coordrb[5] / $this->k)) - $ay;
+				$this->Annotation($ax, $ay, $aw, $ah, $annot['text'], $annot['opt'], $annot['spaces']);
+			}
+		}
+		// set pointer to align the next text/objects
+		switch($align) {
+			case 'T': {
+				$this->y = $y;
+				$this->x = $rb_x;
+				break;
+			}
+			case 'M': {
+				$this->y = $y + round($h/2);
+				$this->x = $rb_x;
+				break;
+			}
+			case 'B': {
+				$this->y = $rb_y;
+				$this->x = $rb_x;
+				break;
+			}
+			case 'N': {
+				$this->SetY($rb_y);
+				break;
+			}
+			default:{
+				break;
+			}
+		}
+	}
+
+	/**
+	 * Set the percentage of character stretching.
+	 * @param $perc (int) percentage of stretching (100 = no stretching)
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.9.000 (2010-09-29)
+	 */
+	public function setFontStretching($perc=100) {
+		$this->font_stretching = $perc;
+	}
+
+	/**
+	 * Get the percentage of character stretching.
+	 * @return float stretching value
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.9.000 (2010-09-29)
+	 */
+	public function getFontStretching() {
+		return $this->font_stretching;
+	}
+
+	/**
+	 * Set the amount to increase or decrease the space between characters in a text.
+	 * @param $spacing (float) amount to increase or decrease the space between characters in a text (0 = default spacing)
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.9.000 (2010-09-29)
+	 */
+	public function setFontSpacing($spacing=0) {
+		$this->font_spacing = $spacing;
+	}
+
+	/**
+	 * Get the amount to increase or decrease the space between characters in a text.
+	 * @return int font spacing (tracking) value
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.9.000 (2010-09-29)
+	 */
+	public function getFontSpacing() {
+		return $this->font_spacing;
+	}
+
+	/**
+	 * Return an array of no-write page regions
+	 * @return array of no-write page regions
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.9.003 (2010-10-13)
+	 * @see setPageRegions(), addPageRegion()
+	 */
+	public function getPageRegions() {
+		return $this->page_regions;
+	}
+
+	/**
+	 * Set no-write regions on page.
+	 * A no-write region is a portion of the page with a rectangular or trapezium shape that will not be covered when writing text or html code.
+	 * A region is always aligned on the left or right side of the page ad is defined using a vertical segment.
+	 * You can set multiple regions for the same page.
+	 * @param $regions (array) array of no-write regions. For each region you can define an array as follow: ('page' => page number or empy for current page, 'xt' => X top, 'yt' => Y top, 'xb' => X bottom, 'yb' => Y bottom, 'side' => page side 'L' = left or 'R' = right). Omit this parameter to remove all regions.
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.9.003 (2010-10-13)
+	 * @see addPageRegion(), getPageRegions()
+	 */
+	public function setPageRegions($regions=array()) {
+		// empty current regions array
+		$this->page_regions = array();
+		// add regions
+		foreach ($regions as $data) {
+			$this->addPageRegion($data);
+		}
+	}
+
+	/**
+	 * Add a single no-write region on selected page.
+	 * A no-write region is a portion of the page with a rectangular or trapezium shape that will not be covered when writing text or html code.
+	 * A region is always aligned on the left or right side of the page ad is defined using a vertical segment.
+	 * You can set multiple regions for the same page.
+	 * @param $region (array) array of a single no-write region array: ('page' => page number or empy for current page, 'xt' => X top, 'yt' => Y top, 'xb' => X bottom, 'yb' => Y bottom, 'side' => page side 'L' = left or 'R' = right).
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.9.003 (2010-10-13)
+	 * @see setPageRegions(), getPageRegions()
+	 */
+	public function addPageRegion($region) {
+		if (!isset($region['page']) OR empty($region['page'])) {
+			$region['page'] = $this->page;
+		}
+		if (isset($region['xt']) AND isset($region['xb']) AND ($region['xt'] > 0) AND ($region['xb'] > 0)
+			AND isset($region['yt'])  AND isset($region['yb']) AND ($region['yt'] >= 0) AND ($region['yt'] < $region['yb'])
+			AND isset($region['side']) AND (($region['side'] == 'L') OR ($region['side'] == 'R'))) {
+			$this->page_regions[] = $region;
+		}
+	}
+
+	/**
+	 * Remove a single no-write region.
+	 * @param $key (int) region key
+	 * @author Nicola Asuni
+	 * @public
+	 * @since 5.9.003 (2010-10-13)
+	 * @see setPageRegions(), getPageRegions()
+	 */
+	public function removePageRegion($key) {
+		if (isset($this->page_regions[$key])) {
+			unset($this->page_regions[$key]);
+		}
+	}
+
+	/**
+	 * Check page for no-write regions and adapt current coordinates and page margins if necessary.
+	 * A no-write region is a portion of the page with a rectangular or trapezium shape that will not be covered when writing text or html code.
+	 * A region is always aligned on the left or right side of the page ad is defined using a vertical segment.
+	 * @param $h (float) height of the text/image/object to print in user units
+	 * @param $x (float) current X coordinate in user units
+	 * @param $y (float) current Y coordinate in user units
+	 * @return array($x, $y)
+	 * @author Nicola Asuni
+	 * @protected
+	 * @since 5.9.003 (2010-10-13)
+	 */
+	protected function checkPageRegions($h, $x, $y) {
+		// set default values
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		if (!$this->check_page_regions OR empty($this->page_regions)) {
+			// no page regions defined
+			return array($x, $y);
+		}
+		if (empty($h)) {
+			$h = ($this->FontSize * $this->cell_height_ratio) + $this->cell_padding['T'] + $this->cell_padding['B'];
+		}
+		// check for page break
+		if ($this->checkPageBreak($h, $y)) {
+			// the content will be printed on a new page
+			$x = $this->x;
+			$y = $this->y;
+		}
+		if ($this->num_columns > 1) {
+			if ($this->rtl) {
+				$this->lMargin = ($this->columns[$this->current_column]['x'] - $this->columns[$this->current_column]['w']);
+			} else {
+				$this->rMargin = ($this->w - $this->columns[$this->current_column]['x'] - $this->columns[$this->current_column]['w']);
+			}
+		} else {
+			if ($this->rtl) {
+				$this->lMargin = max($this->clMargin, $this->original_lMargin);
+			} else {
+				$this->rMargin = max($this->crMargin, $this->original_rMargin);
+			}
+		}
+		// adjust coordinates and page margins
+		foreach ($this->page_regions as $regid => $regdata) {
+			if ($regdata['page'] == $this->page) {
+				// check region boundaries
+				if (($y > ($regdata['yt'] - $h)) AND ($y <= $regdata['yb'])) {
+					// Y is inside the region
+					$minv = ($regdata['xb'] - $regdata['xt']) / ($regdata['yb'] - $regdata['yt']); // inverse of angular coefficient
+					$yt = max($y, $regdata['yt']);
+					$yb = min(($yt + $h), $regdata['yb']);
+					$xt = (($yt - $regdata['yt']) * $minv) + $regdata['xt'];
+					$xb = (($yb - $regdata['yt']) * $minv) + $regdata['xt'];
+					if ($regdata['side'] == 'L') { // left side
+						$new_margin = max($xt, $xb);
+						if ($this->lMargin < $new_margin) {
+							if ($this->rtl) {
+								// adjust left page margin
+								$this->lMargin = max(0, $new_margin);
+							}
+							if ($x < $new_margin) {
+								// adjust x position
+								$x = $new_margin;
+								if ($new_margin > ($this->w - $this->rMargin)) {
+									// adjust y position
+									$y = $regdata['yb'] - $h;
+								}
+							}
+						}
+					} elseif ($regdata['side'] == 'R') { // right side
+						$new_margin = min($xt, $xb);
+						if (($this->w - $this->rMargin) > $new_margin) {
+							if (!$this->rtl) {
+								// adjust right page margin
+								$this->rMargin = max(0, ($this->w - $new_margin));
+							}
+							if ($x > $new_margin) {
+								// adjust x position
+								$x = $new_margin;
+								if ($new_margin > $this->lMargin) {
+									// adjust y position
+									$y = $regdata['yb'] - $h;
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		return array($x, $y);
+	}
+
+	// --- SVG METHODS ---------------------------------------------------------
+
+	/**
+	 * Embedd a Scalable Vector Graphics (SVG) image.
+	 * NOTE: SVG standard is not yet fully implemented, use the setRasterizeVectorImages() method to enable/disable rasterization of vector images using ImageMagick library.
+	 * @param $file (string) Name of the SVG file or a '@' character followed by the SVG data string.
+	 * @param $x (float) Abscissa of the upper-left corner.
+	 * @param $y (float) Ordinate of the upper-left corner.
+	 * @param $w (float) Width of the image in the page. If not specified or equal to zero, it is automatically calculated.
+	 * @param $h (float) Height of the image in the page. If not specified or equal to zero, it is automatically calculated.
+	 * @param $link (mixed) URL or identifier returned by AddLink().
+	 * @param $align (string) Indicates the alignment of the pointer next to image insertion relative to image height. The value can be:<ul><li>T: top-right for LTR or top-left for RTL</li><li>M: middle-right for LTR or middle-left for RTL</li><li>B: bottom-right for LTR or bottom-left for RTL</li><li>N: next line</li></ul> If the alignment is an empty string, then the pointer will be restored on the starting SVG position.
+	 * @param $palign (string) Allows to center or align the image on the current line. Possible values are:<ul><li>L : left align</li><li>C : center</li><li>R : right align</li><li>'' : empty string : left for LTR or right for RTL</li></ul>
+	 * @param $border (mixed) Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
+	 * @param $fitonpage (boolean) if true the image is resized to not exceed page dimensions.
+	 * @author Nicola Asuni
+	 * @since 5.0.000 (2010-05-02)
+	 * @public
+	 */
+	public function ImageSVG($file, $x='', $y='', $w=0, $h=0, $link='', $align='', $palign='', $border=0, $fitonpage=false) {
+		if ($this->state != 2) {
+			 return;
+		}
+		if ($this->rasterize_vector_images AND ($w > 0) AND ($h > 0)) {
+			// convert SVG to raster image using GD or ImageMagick libraries
+			return $this->Image($file, $x, $y, $w, $h, 'SVG', $link, $align, true, 300, $palign, false, false, $border, false, false, false);
+		}
+		if ($file{0} === '@') { // image from string
+			$this->svgdir = '';
+			$svgdata = substr($file, 1);
+		} else { // SVG file
+			$this->svgdir = dirname($file);
+			$svgdata = TCPDF_STATIC::fileGetContents($file);
+		}
+		if ($svgdata === FALSE) {
+			$this->Error('SVG file not found: '.$file);
+		}
+		if ($x === '') {
+			$x = $this->x;
+		}
+		if ($y === '') {
+			$y = $this->y;
+		}
+		// check page for no-write regions and adapt page margins if necessary
+		list($x, $y) = $this->checkPageRegions($h, $x, $y);
+		$k = $this->k;
+		$ox = 0;
+		$oy = 0;
+		$ow = $w;
+		$oh = $h;
+		$aspect_ratio_align = 'xMidYMid';
+		$aspect_ratio_ms = 'meet';
+		$regs = array();
+		// get original image width and height
+		preg_match('/<svg([^\>]*)>/si', $svgdata, $regs);
+		if (isset($regs[1]) AND !empty($regs[1])) {
+			$tmp = array();
+			if (preg_match('/[\s]+x[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) {
+				$ox = $this->getHTMLUnitToUnits($tmp[1], 0, $this->svgunit, false);
+			}
+			$tmp = array();
+			if (preg_match('/[\s]+y[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) {
+				$oy = $this->getHTMLUnitToUnits($tmp[1], 0, $this->svgunit, false);
+			}
+			$tmp = array();
+			if (preg_match('/[\s]+width[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) {
+				$ow = $this->getHTMLUnitToUnits($tmp[1], 1, $this->svgunit, false);
+			}
+			$tmp = array();
+			if (preg_match('/[\s]+height[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) {
+				$oh = $this->getHTMLUnitToUnits($tmp[1], 1, $this->svgunit, false);
+			}
+			$tmp = array();
+			$view_box = array();
+			if (preg_match('/[\s]+viewBox[\s]*=[\s]*"[\s]*([0-9\.\-]+)[\s]+([0-9\.\-]+)[\s]+([0-9\.]+)[\s]+([0-9\.]+)[\s]*"/si', $regs[1], $tmp)) {
+				if (count($tmp) == 5) {
+					array_shift($tmp);
+					foreach ($tmp as $key => $val) {
+						$view_box[$key] = $this->getHTMLUnitToUnits($val, 0, $this->svgunit, false);
+					}
+					$ox = $view_box[0];
+					$oy = $view_box[1];
+				}
+				// get aspect ratio
+				$tmp = array();
+				if (preg_match('/[\s]+preserveAspectRatio[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) {
+					$aspect_ratio = preg_split('/[\s]+/si', $tmp[1]);
+					switch (count($aspect_ratio)) {
+						case 3: {
+							$aspect_ratio_align = $aspect_ratio[1];
+							$aspect_ratio_ms = $aspect_ratio[2];
+							break;
+						}
+						case 2: {
+							$aspect_ratio_align = $aspect_ratio[0];
+							$aspect_ratio_ms = $aspect_ratio[1];
+							break;
+						}
+						case 1: {
+							$aspect_ratio_align = $aspect_ratio[0];
+							$aspect_ratio_ms = 'meet';
+							break;
+						}
+					}
+				}
+			}
+		}
+		if ($ow <= 0) {
+			$ow = 1;
+		}
+		if ($oh <= 0) {
+			$oh = 1;
+		}
+		// calculate image width and height on document
+		if (($w <= 0) AND ($h <= 0)) {
+			// convert image size to document unit
+			$w = $ow;
+			$h = $oh;
+		} elseif ($w <= 0) {
+			$w = $h * $ow / $oh;
+		} elseif ($h <= 0) {
+			$h = $w * $oh / $ow;
+		}
+		// fit the image on available space
+		list($w, $h, $x, $y) = $this->fitBlock($w, $h, $x, $y, $fitonpage);
+		if ($this->rasterize_vector_images) {
+			// convert SVG to raster image using GD or ImageMagick libraries
+			return $this->Image($file, $x, $y, $w, $h, 'SVG', $link, $align, true, 300, $palign, false, false, $border, false, false, false);
+		}
+		// set alignment
+		$this->img_rb_y = $y + $h;
+		// set alignment
+		if ($this->rtl) {
+			if ($palign == 'L') {
+				$ximg = $this->lMargin;
+			} elseif ($palign == 'C') {
+				$ximg = ($this->w + $this->lMargin - $this->rMargin - $w) / 2;
+			} elseif ($palign == 'R') {
+				$ximg = $this->w - $this->rMargin - $w;
+			} else {
+				$ximg = $x - $w;
+			}
+			$this->img_rb_x = $ximg;
+		} else {
+			if ($palign == 'L') {
+				$ximg = $this->lMargin;
+			} elseif ($palign == 'C') {
+				$ximg = ($this->w + $this->lMargin - $this->rMargin - $w) / 2;
+			} elseif ($palign == 'R') {
+				$ximg = $this->w - $this->rMargin - $w;
+			} else {
+				$ximg = $x;
+			}
+			$this->img_rb_x = $ximg + $w;
+		}
+		// store current graphic vars
+		$gvars = $this->getGraphicVars();
+		// store SVG position and scale factors
+		$svgoffset_x = ($ximg - $ox) * $this->k;
+		$svgoffset_y = -($y - $oy) * $this->k;
+		if (isset($view_box[2]) AND ($view_box[2] > 0) AND ($view_box[3] > 0)) {
+			$ow = $view_box[2];
+			$oh = $view_box[3];
+		} else {
+			if ($ow <= 0) {
+				$ow = $w;
+			}
+			if ($oh <= 0) {
+				$oh = $h;
+			}
+		}
+		$svgscale_x = $w / $ow;
+		$svgscale_y = $h / $oh;
+		// scaling and alignment
+		if ($aspect_ratio_align != 'none') {
+			// store current scaling values
+			$svgscale_old_x = $svgscale_x;
+			$svgscale_old_y = $svgscale_y;
+			// force uniform scaling
+			if ($aspect_ratio_ms == 'slice') {
+				// the entire viewport is covered by the viewBox
+				if ($svgscale_x > $svgscale_y) {
+					$svgscale_y = $svgscale_x;
+				} elseif ($svgscale_x < $svgscale_y) {
+					$svgscale_x = $svgscale_y;
+				}
+			} else { // meet
+				// the entire viewBox is visible within the viewport
+				if ($svgscale_x < $svgscale_y) {
+					$svgscale_y = $svgscale_x;
+				} elseif ($svgscale_x > $svgscale_y) {
+					$svgscale_x = $svgscale_y;
+				}
+			}
+			// correct X alignment
+			switch (substr($aspect_ratio_align, 1, 3)) {
+				case 'Min': {
+					// do nothing
+					break;
+				}
+				case 'Max': {
+					$svgoffset_x += (($w * $this->k) - ($ow * $this->k * $svgscale_x));
+					break;
+				}
+				default:
+				case 'Mid': {
+					$svgoffset_x += ((($w * $this->k) - ($ow * $this->k * $svgscale_x)) / 2);
+					break;
+				}
+			}
+			// correct Y alignment
+			switch (substr($aspect_ratio_align, 5)) {
+				case 'Min': {
+					// do nothing
+					break;
+				}
+				case 'Max': {
+					$svgoffset_y -= (($h * $this->k) - ($oh * $this->k * $svgscale_y));
+					break;
+				}
+				default:
+				case 'Mid': {
+					$svgoffset_y -= ((($h * $this->k) - ($oh * $this->k * $svgscale_y)) / 2);
+					break;
+				}
+			}
+		}
+		// store current page break mode
+		$page_break_mode = $this->AutoPageBreak;
+		$page_break_margin = $this->getBreakMargin();
+		$cell_padding = $this->cell_padding;
+		$this->SetCellPadding(0);
+		$this->SetAutoPageBreak(false);
+		// save the current graphic state
+		$this->_out('q'.$this->epsmarker);
+		// set initial clipping mask
+		$this->Rect($x, $y, $w, $h, 'CNZ', array(), array());
+		// scale and translate
+		$e = $ox * $this->k * (1 - $svgscale_x);
+		$f = ($this->h - $oy) * $this->k * (1 - $svgscale_y);
+		$this->_out(sprintf('%F %F %F %F %F %F cm', $svgscale_x, 0, 0, $svgscale_y, ($e + $svgoffset_x), ($f + $svgoffset_y)));
+		// creates a new XML parser to be used by the other XML functions
+		$this->parser = xml_parser_create('UTF-8');
+		// the following function allows to use parser inside object
+		xml_set_object($this->parser, $this);
+		// disable case-folding for this XML parser
+		xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
+		// sets the element handler functions for the XML parser
+		xml_set_element_handler($this->parser, 'startSVGElementHandler', 'endSVGElementHandler');
+		// sets the character data handler function for the XML parser
+		xml_set_character_data_handler($this->parser, 'segSVGContentHandler');
+		// start parsing an XML document
+		if (!xml_parse($this->parser, $svgdata)) {
+			$error_message = sprintf('SVG Error: %s at line %d', xml_error_string(xml_get_error_code($this->parser)), xml_get_current_line_number($this->parser));
+			$this->Error($error_message);
+		}
+		// free this XML parser
+		xml_parser_free($this->parser);
+		// restore previous graphic state
+		$this->_out($this->epsmarker.'Q');
+		// restore graphic vars
+		$this->setGraphicVars($gvars);
+		$this->lasth = $gvars['lasth'];
+		if (!empty($border)) {
+			$bx = $this->x;
+			$by = $this->y;
+			$this->x = $ximg;
+			if ($this->rtl) {
+				$this->x += $w;
+			}
+			$this->y = $y;
+			$this->Cell($w, $h, '', $border, 0, '', 0, '', 0, true);
+			$this->x = $bx;
+			$this->y = $by;
+		}
+		if ($link) {
+			$this->Link($ximg, $y, $w, $h, $link, 0);
+		}
+		// set pointer to align the next text/objects
+		switch($align) {
+			case 'T':{
+				$this->y = $y;
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'M':{
+				$this->y = $y + round($h/2);
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'B':{
+				$this->y = $this->img_rb_y;
+				$this->x = $this->img_rb_x;
+				break;
+			}
+			case 'N':{
+				$this->SetY($this->img_rb_y);
+				break;
+			}
+			default:{
+				// restore pointer to starting position
+				$this->x = $gvars['x'];
+				$this->y = $gvars['y'];
+				$this->page = $gvars['page'];
+				$this->current_column = $gvars['current_column'];
+				$this->tMargin = $gvars['tMargin'];
+				$this->bMargin = $gvars['bMargin'];
+				$this->w = $gvars['w'];
+				$this->h = $gvars['h'];
+				$this->wPt = $gvars['wPt'];
+				$this->hPt = $gvars['hPt'];
+				$this->fwPt = $gvars['fwPt'];
+				$this->fhPt = $gvars['fhPt'];
+				break;
+			}
+		}
+		$this->endlinex = $this->img_rb_x;
+		// restore page break
+		$this->SetAutoPageBreak($page_break_mode, $page_break_margin);
+		$this->cell_padding = $cell_padding;
+	}
+
+	/**
+	 * Convert SVG transformation matrix to PDF.
+	 * @param $tm (array) original SVG transformation matrix
+	 * @return array transformation matrix
+	 * @protected
+	 * @since 5.0.000 (2010-05-02)
+	 */
+	protected function convertSVGtMatrix($tm) {
+		$a = $tm[0];
+		$b = -$tm[1];
+		$c = -$tm[2];
+		$d = $tm[3];
+		$e = $this->getHTMLUnitToUnits($tm[4], 1, $this->svgunit, false) * $this->k;
+		$f = -$this->getHTMLUnitToUnits($tm[5], 1, $this->svgunit, false) * $this->k;
+		$x = 0;
+		$y = $this->h * $this->k;
+		$e = ($x * (1 - $a)) - ($y * $c) + $e;
+		$f = ($y * (1 - $d)) - ($x * $b) + $f;
+		return array($a, $b, $c, $d, $e, $f);
+	}
+
+	/**
+	 * Apply SVG graphic transformation matrix.
+	 * @param $tm (array) original SVG transformation matrix
+	 * @protected
+	 * @since 5.0.000 (2010-05-02)
+	 */
+	protected function SVGTransform($tm) {
+		$this->Transform($this->convertSVGtMatrix($tm));
+	}
+
+	/**
+	 * Apply the requested SVG styles (*** TO BE COMPLETED ***)
+	 * @param $svgstyle (array) array of SVG styles to apply
+	 * @param $prevsvgstyle (array) array of previous SVG style
+	 * @param $x (int) X origin of the bounding box
+	 * @param $y (int) Y origin of the bounding box
+	 * @param $w (int) width of the bounding box
+	 * @param $h (int) height of the bounding box
+	 * @param $clip_function (string) clip function
+	 * @param $clip_params (array) array of parameters for clipping function
+	 * @return object style
+	 * @author Nicola Asuni
+	 * @since 5.0.000 (2010-05-02)
+	 * @protected
+	 */
+	protected function setSVGStyles($svgstyle, $prevsvgstyle, $x=0, $y=0, $w=1, $h=1, $clip_function='', $clip_params=array()) {
+		if ($this->state != 2) {
+			 return;
+		}
+		$objstyle = '';
+		$minlen = (0.01 / $this->k); // minimum acceptable length (3 point)
+		if (!isset($svgstyle['opacity'])) {
+			return $objstyle;
+		}
+		// clip-path
+		$regs = array();
+		if (preg_match('/url\([\s]*\#([^\)]*)\)/si', $svgstyle['clip-path'], $regs)) {
+			$clip_path = $this->svgclippaths[$regs[1]];
+			foreach ($clip_path as $cp) {
+				$this->startSVGElementHandler('clip-path', $cp['name'], $cp['attribs'], $cp['tm']);
+			}
+		}
+		// opacity
+		if ($svgstyle['opacity'] != 1) {
+			$this->setAlpha($svgstyle['opacity'], 'Normal', $svgstyle['opacity'], false);
+		}
+		// color
+		$fill_color = TCPDF_COLORS::convertHTMLColorToDec($svgstyle['color'], $this->spot_colors);
+		$this->SetFillColorArray($fill_color);
+		// text color
+		$text_color = TCPDF_COLORS::convertHTMLColorToDec($svgstyle['text-color'], $this->spot_colors);
+		$this->SetTextColorArray($text_color);
+		// clip
+		if (preg_match('/rect\(([a-z0-9\-\.]*)[\s]*([a-z0-9\-\.]*)[\s]*([a-z0-9\-\.]*)[\s]*([a-z0-9\-\.]*)\)/si', $svgstyle['clip'], $regs)) {
+			$top = (isset($regs[1])?$this->getHTMLUnitToUnits($regs[1], 0, $this->svgunit, false):0);
+			$right = (isset($regs[2])?$this->getHTMLUnitToUnits($regs[2], 0, $this->svgunit, false):0);
+			$bottom = (isset($regs[3])?$this->getHTMLUnitToUnits($regs[3], 0, $this->svgunit, false):0);
+			$left = (isset($regs[4])?$this->getHTMLUnitToUnits($regs[4], 0, $this->svgunit, false):0);
+			$cx = $x + $left;
+			$cy = $y + $top;
+			$cw = $w - $left - $right;
+			$ch = $h - $top - $bottom;
+			if ($svgstyle['clip-rule'] == 'evenodd') {
+				$clip_rule = 'CNZ';
+			} else {
+				$clip_rule = 'CEO';
+			}
+			$this->Rect($cx, $cy, $cw, $ch, $clip_rule, array(), array());
+		}
+		// fill
+		$regs = array();
+		if (preg_match('/url\([\s]*\#([^\)]*)\)/si', $svgstyle['fill'], $regs)) {
+			// gradient
+			$gradient = $this->svggradients[$regs[1]];
+			if (isset($gradient['xref'])) {
+				// reference to another gradient definition
+				$newgradient = $this->svggradients[$gradient['xref']];
+				$newgradient['coords'] = $gradient['coords'];
+				$newgradient['mode'] = $gradient['mode'];
+				$newgradient['gradientUnits'] = $gradient['gradientUnits'];
+				if (isset($gradient['gradientTransform'])) {
+					$newgradient['gradientTransform'] = $gradient['gradientTransform'];
+				}
+				$gradient = $newgradient;
+			}
+			//save current Graphic State
+			$this->_out('q');
+			//set clipping area
+			if (!empty($clip_function) AND method_exists($this, $clip_function)) {
+				$bbox = call_user_func_array(array($this, $clip_function), $clip_params);
+				if (is_array($bbox) AND (count($bbox) == 4)) {
+					list($x, $y, $w, $h) = $bbox;
+				}
+			}
+			if ($gradient['mode'] == 'measure') {
+				if (isset($gradient['gradientTransform']) AND !empty($gradient['gradientTransform'])) {
+					$gtm = $gradient['gradientTransform'];
+					// apply transformation matrix
+					$xa = ($gtm[0] * $gradient['coords'][0]) + ($gtm[2] * $gradient['coords'][1]) + $gtm[4];
+					$ya = ($gtm[1] * $gradient['coords'][0]) + ($gtm[3] * $gradient['coords'][1]) + $gtm[5];
+					$xb = ($gtm[0] * $gradient['coords'][2]) + ($gtm[2] * $gradient['coords'][3]) + $gtm[4];
+					$yb = ($gtm[1] * $gradient['coords'][2]) + ($gtm[3] * $gradient['coords'][3]) + $gtm[5];
+					if (isset($gradient['coords'][4])) {
+						$gradient['coords'][4] = sqrt(pow(($gtm[0] * $gradient['coords'][4]), 2) + pow(($gtm[1] * $gradient['coords'][4]), 2));
+					}
+					$gradient['coords'][0] = $xa;
+					$gradient['coords'][1] = $ya;
+					$gradient['coords'][2] = $xb;
+					$gradient['coords'][3] = $yb;
+				}
+				// convert SVG coordinates to user units
+				$gradient['coords'][0] = $this->getHTMLUnitToUnits($gradient['coords'][0], 0, $this->svgunit, false);
+				$gradient['coords'][1] = $this->getHTMLUnitToUnits($gradient['coords'][1], 0, $this->svgunit, false);
+				$gradient['coords'][2] = $this->getHTMLUnitToUnits($gradient['coords'][2], 0, $this->svgunit, false);
+				$gradient['coords'][3] = $this->getHTMLUnitToUnits($gradient['coords'][3], 0, $this->svgunit, false);
+				if (isset($gradient['coords'][4])) {
+					$gradient['coords'][4] = $this->getHTMLUnitToUnits($gradient['coords'][4], 0, $this->svgunit, false);
+				}
+				if ($w <= $minlen) {
+					$w = $minlen;
+				}
+				if ($h <= $minlen) {
+					$h = $minlen;
+				}
+				// shift units
+				if ($gradient['gradientUnits'] == 'objectBoundingBox') {
+					// convert to SVG coordinate system
+					$gradient['coords'][0] += $x;
+					$gradient['coords'][1] += $y;
+					$gradient['coords'][2] += $x;
+					$gradient['coords'][3] += $y;
+				}
+				// calculate percentages
+				$gradient['coords'][0] = (($gradient['coords'][0] - $x) / $w);
+				$gradient['coords'][1] = (($gradient['coords'][1] - $y) / $h);
+				$gradient['coords'][2] = (($gradient['coords'][2] - $x) / $w);
+				$gradient['coords'][3] = (($gradient['coords'][3] - $y) / $h);
+				if (isset($gradient['coords'][4])) {
+					$gradient['coords'][4] /= $w;
+				}
+			} elseif ($gradient['mode'] == 'percentage') {
+				foreach($gradient['coords'] as $key => $val) {
+					$gradient['coords'][$key] = (intval($val) / 100);
+					if ($val < 0) {
+						$gradient['coords'][$key] = 0;
+					} elseif ($val > 1) {
+						$gradient['coords'][$key] = 1;
+					}
+				}
+			}
+			if (($gradient['type'] == 2) AND ($gradient['coords'][0] == $gradient['coords'][2]) AND ($gradient['coords'][1] == $gradient['coords'][3])) {
+				// single color (no shading)
+				$gradient['coords'][0] = 1;
+				$gradient['coords'][1] = 0;
+				$gradient['coords'][2] = 0.999;
+				$gradient['coords'][3] = 0;
+			}
+			// swap Y coordinates
+			$tmp = $gradient['coords'][1];
+			$gradient['coords'][1] = $gradient['coords'][3];
+			$gradient['coords'][3] = $tmp;
+			// set transformation map for gradient
+			if ($gradient['type'] == 3) {
+				// circular gradient
+				$cy = $this->h - $y - ($gradient['coords'][1] * ($w + $h));
+				$this->_out(sprintf('%F 0 0 %F %F %F cm', ($w * $this->k), ($w * $this->k), ($x * $this->k), ($cy * $this->k)));
+			} else {
+				$this->_out(sprintf('%F 0 0 %F %F %F cm', ($w * $this->k), ($h * $this->k), ($x * $this->k), (($this->h - ($y + $h)) * $this->k)));
+			}
+			if (count($gradient['stops']) > 1) {
+				$this->Gradient($gradient['type'], $gradient['coords'], $gradient['stops'], array(), false);
+			}
+		} elseif ($svgstyle['fill'] != 'none') {
+			$fill_color = TCPDF_COLORS::convertHTMLColorToDec($svgstyle['fill'], $this->spot_colors);
+			if ($svgstyle['fill-opacity'] != 1) {
+				$this->setAlpha($this->alpha['CA'], 'Normal', $svgstyle['fill-opacity'], false);
+			}
+			$this->SetFillColorArray($fill_color);
+			if ($svgstyle['fill-rule'] == 'evenodd') {
+				$objstyle .= 'F*';
+			} else {
+				$objstyle .= 'F';
+			}
+		}
+		// stroke
+		if ($svgstyle['stroke'] != 'none') {
+			if ($svgstyle['stroke-opacity'] != 1) {
+				$this->setAlpha($svgstyle['stroke-opacity'], 'Normal', $this->alpha['ca'], false);
+			}
+			$stroke_style = array(
+				'color' => TCPDF_COLORS::convertHTMLColorToDec($svgstyle['stroke'], $this->spot_colors),
+				'width' => $this->getHTMLUnitToUnits($svgstyle['stroke-width'], 0, $this->svgunit, false),
+				'cap' => $svgstyle['stroke-linecap'],
+				'join' => $svgstyle['stroke-linejoin']
+				);
+			if (isset($svgstyle['stroke-dasharray']) AND !empty($svgstyle['stroke-dasharray']) AND ($svgstyle['stroke-dasharray'] != 'none')) {
+				$stroke_style['dash'] = $svgstyle['stroke-dasharray'];
+			}
+			$this->SetLineStyle($stroke_style);
+			$objstyle .= 'D';
+		}
+		// font
+		$regs = array();
+		if (!empty($svgstyle['font'])) {
+			if (preg_match('/font-family[\s]*:[\s]*([^\;\"]*)/si', $svgstyle['font'], $regs)) {
+				$font_family = $this->getFontFamilyName($regs[1]);
+			} else {
+				$font_family = $svgstyle['font-family'];
+			}
+			if (preg_match('/font-size[\s]*:[\s]*([^\s\;\"]*)/si', $svgstyle['font'], $regs)) {
+				$font_size = trim($regs[1]);
+			} else {
+				$font_size = $svgstyle['font-size'];
+			}
+			if (preg_match('/font-style[\s]*:[\s]*([^\s\;\"]*)/si', $svgstyle['font'], $regs)) {
+				$font_style = trim($regs[1]);
+			} else {
+				$font_style = $svgstyle['font-style'];
+			}
+			if (preg_match('/font-weight[\s]*:[\s]*([^\s\;\"]*)/si', $svgstyle['font'], $regs)) {
+				$font_weight = trim($regs[1]);
+			} else {
+				$font_weight = $svgstyle['font-weight'];
+			}
+			if (preg_match('/font-stretch[\s]*:[\s]*([^\s\;\"]*)/si', $svgstyle['font'], $regs)) {
+				$font_stretch = trim($regs[1]);
+			} else {
+				$font_stretch = $svgstyle['font-stretch'];
+			}
+			if (preg_match('/letter-spacing[\s]*:[\s]*([^\s\;\"]*)/si', $svgstyle['font'], $regs)) {
+				$font_spacing = trim($regs[1]);
+			} else {
+				$font_spacing = $svgstyle['letter-spacing'];
+			}
+		} else {
+			$font_family = $this->getFontFamilyName($svgstyle['font-family']);
+			$font_size = $svgstyle['font-size'];
+			$font_style = $svgstyle['font-style'];
+			$font_weight = $svgstyle['font-weight'];
+			$font_stretch = $svgstyle['font-stretch'];
+			$font_spacing = $svgstyle['letter-spacing'];
+		}
+		$font_size = $this->getHTMLFontUnits($font_size, $this->svgstyles[0]['font-size'], $prevsvgstyle['font-size'], $this->svgunit);
+		$font_stretch = $this->getCSSFontStretching($font_stretch, $svgstyle['font-stretch']);
+		$font_spacing = $this->getCSSFontSpacing($font_spacing, $svgstyle['letter-spacing']);
+		switch ($font_style) {
+			case 'italic': {
+				$font_style = 'I';
+				break;
+			}
+			case 'oblique': {
+				$font_style = 'I';
+				break;
+			}
+			default:
+			case 'normal': {
+				$font_style = '';
+				break;
+			}
+		}
+		switch ($font_weight) {
+			case 'bold':
+			case 'bolder': {
+				$font_style .= 'B';
+				break;
+			}
+		}
+		switch ($svgstyle['text-decoration']) {
+			case 'underline': {
+				$font_style .= 'U';
+				break;
+			}
+			case 'overline': {
+				$font_style .= 'O';
+				break;
+			}
+			case 'line-through': {
+				$font_style .= 'D';
+				break;
+			}
+			default:
+			case 'none': {
+				break;
+			}
+		}
+		$this->SetFont($font_family, $font_style, $font_size);
+		$this->setFontStretching($font_stretch);
+		$this->setFontSpacing($font_spacing);
+		return $objstyle;
+	}
+
+	/**
+	 * Draws an SVG path
+	 * @param $d (string) attribute d of the path SVG element
+	 * @param $style (string) Style of rendering. Possible values are:
+	 * <ul>
+	 *	 <li>D or empty string: Draw (default).</li>
+	 *	 <li>F: Fill.</li>
+	 *	 <li>F*: Fill using the even-odd rule to determine which regions lie inside the clipping path.</li>
+	 *	 <li>DF or FD: Draw and fill.</li>
+	 *	 <li>DF* or FD*: Draw and fill using the even-odd rule to determine which regions lie inside the clipping path.</li>
+	 *	 <li>CNZ: Clipping mode (using the even-odd rule to determine which regions lie inside the clipping path).</li>
+	 *	 <li>CEO: Clipping mode (using the nonzero winding number rule to determine which regions lie inside the clipping path).</li>
+	 * </ul>
+	 * @return array of container box measures (x, y, w, h)
+	 * @author Nicola Asuni
+	 * @since 5.0.000 (2010-05-02)
+	 * @protected
+	 */
+	protected function SVGPath($d, $style='') {
+		if ($this->state != 2) {
+			 return;
+		}
+		// set fill/stroke style
+		$op = TCPDF_STATIC::getPathPaintOperator($style, '');
+		if (empty($op)) {
+			return;
+		}
+		$paths = array();
+		$d = preg_replace('/([0-9ACHLMQSTVZ])([\-\+])/si', '\\1 \\2', $d);
+		preg_match_all('/([ACHLMQSTVZ])[\s]*([^ACHLMQSTVZ\"]*)/si', $d, $paths, PREG_SET_ORDER);
+		$x = 0;
+		$y = 0;
+		$x1 = 0;
+		$y1 = 0;
+		$x2 = 0;
+		$y2 = 0;
+		$xmin = 2147483647;
+		$xmax = 0;
+		$ymin = 2147483647;
+		$ymax = 0;
+		$relcoord = false;
+		$minlen = (0.01 / $this->k); // minimum acceptable length (3 point)
+		$firstcmd = true; // used to print first point
+		// draw curve pieces
+		foreach ($paths as $key => $val) {
+			// get curve type
+			$cmd = trim($val[1]);
+			if (strtolower($cmd) == $cmd) {
+				// use relative coordinated instead of absolute
+				$relcoord = true;
+				$xoffset = $x;
+				$yoffset = $y;
+			} else {
+				$relcoord = false;
+				$xoffset = 0;
+				$yoffset = 0;
+			}
+			$params = array();
+			if (isset($val[2])) {
+				// get curve parameters
+				$rawparams = preg_split('/([\,\s]+)/si', trim($val[2]));
+				$params = array();
+				foreach ($rawparams as $ck => $cp) {
+					$params[$ck] = $this->getHTMLUnitToUnits($cp, 0, $this->svgunit, false);
+					if (abs($params[$ck]) < $minlen) {
+						// aproximate little values to zero
+						$params[$ck] = 0;
+					}
+				}
+			}
+			// store current origin point
+			$x0 = $x;
+			$y0 = $y;
+			switch (strtoupper($cmd)) {
+				case 'M': { // moveto
+					foreach ($params as $ck => $cp) {
+						if (($ck % 2) == 0) {
+							$x = $cp + $xoffset;
+						} else {
+							$y = $cp + $yoffset;
+							if ($firstcmd OR (abs($x0 - $x) >= $minlen) OR (abs($y0 - $y) >= $minlen)) {
+								if ($ck == 1) {
+									$this->_outPoint($x, $y);
+									$firstcmd = false;
+								} else {
+									$this->_outLine($x, $y);
+								}
+								$x0 = $x;
+								$y0 = $y;
+							}
+							$xmin = min($xmin, $x);
+							$ymin = min($ymin, $y);
+							$xmax = max($xmax, $x);
+							$ymax = max($ymax, $y);
+							if ($relcoord) {
+								$xoffset = $x;
+								$yoffset = $y;
+							}
+						}
+					}
+					break;
+				}
+				case 'L': { // lineto
+					foreach ($params as $ck => $cp) {
+						if (($ck % 2) == 0) {
+							$x = $cp + $xoffset;
+						} else {
+							$y = $cp + $yoffset;
+							if ((abs($x0 - $x) >= $minlen) OR (abs($y0 - $y) >= $minlen)) {
+								$this->_outLine($x, $y);
+								$x0 = $x;
+								$y0 = $y;
+							}
+							$xmin = min($xmin, $x);
+							$ymin = min($ymin, $y);
+							$xmax = max($xmax, $x);
+							$ymax = max($ymax, $y);
+							if ($relcoord) {
+								$xoffset = $x;
+								$yoffset = $y;
+							}
+						}
+					}
+					break;
+				}
+				case 'H': { // horizontal lineto
+					foreach ($params as $ck => $cp) {
+						$x = $cp + $xoffset;
+						if ((abs($x0 - $x) >= $minlen) OR (abs($y0 - $y) >= $minlen)) {
+							$this->_outLine($x, $y);
+							$x0 = $x;
+							$y0 = $y;
+						}
+						$xmin = min($xmin, $x);
+						$xmax = max($xmax, $x);
+						if ($relcoord) {
+							$xoffset = $x;
+						}
+					}
+					break;
+				}
+				case 'V': { // vertical lineto
+					foreach ($params as $ck => $cp) {
+						$y = $cp + $yoffset;
+						if ((abs($x0 - $x) >= $minlen) OR (abs($y0 - $y) >= $minlen)) {
+							$this->_outLine($x, $y);
+							$x0 = $x;
+							$y0 = $y;
+						}
+						$ymin = min($ymin, $y);
+						$ymax = max($ymax, $y);
+						if ($relcoord) {
+							$yoffset = $y;
+						}
+					}
+					break;
+				}
+				case 'C': { // curveto
+					foreach ($params as $ck => $cp) {
+						$params[$ck] = $cp;
+						if ((($ck + 1) % 6) == 0) {
+							$x1 = $params[($ck - 5)] + $xoffset;
+							$y1 = $params[($ck - 4)] + $yoffset;
+							$x2 = $params[($ck - 3)] + $xoffset;
+							$y2 = $params[($ck - 2)] + $yoffset;
+							$x = $params[($ck - 1)] + $xoffset;
+							$y = $params[($ck)] + $yoffset;
+							$this->_outCurve($x1, $y1, $x2, $y2, $x, $y);
+							$xmin = min($xmin, $x, $x1, $x2);
+							$ymin = min($ymin, $y, $y1, $y2);
+							$xmax = max($xmax, $x, $x1, $x2);
+							$ymax = max($ymax, $y, $y1, $y2);
+							if ($relcoord) {
+								$xoffset = $x;
+								$yoffset = $y;
+							}
+						}
+					}
+					break;
+				}
+				case 'S': { // shorthand/smooth curveto
+					foreach ($params as $ck => $cp) {
+						$params[$ck] = $cp;
+						if ((($ck + 1) % 4) == 0) {
+							if (($key > 0) AND ((strtoupper($paths[($key - 1)][1]) == 'C') OR (strtoupper($paths[($key - 1)][1]) == 'S'))) {
+								$x1 = (2 * $x) - $x2;
+								$y1 = (2 * $y) - $y2;
+							} else {
+								$x1 = $x;
+								$y1 = $y;
+							}
+							$x2 = $params[($ck - 3)] + $xoffset;
+							$y2 = $params[($ck - 2)] + $yoffset;
+							$x = $params[($ck - 1)] + $xoffset;
+							$y = $params[($ck)] + $yoffset;
+							$this->_outCurve($x1, $y1, $x2, $y2, $x, $y);
+							$xmin = min($xmin, $x, $x1, $x2);
+							$ymin = min($ymin, $y, $y1, $y2);
+							$xmax = max($xmax, $x, $x1, $x2);
+							$ymax = max($ymax, $y, $y1, $y2);
+							if ($relcoord) {
+								$xoffset = $x;
+								$yoffset = $y;
+							}
+						}
+					}
+					break;
+				}
+				case 'Q': { // quadratic B�zier curveto
+					foreach ($params as $ck => $cp) {
+						$params[$ck] = $cp;
+						if ((($ck + 1) % 4) == 0) {
+							// convert quadratic points to cubic points
+							$x1 = $params[($ck - 3)] + $xoffset;
+							$y1 = $params[($ck - 2)] + $yoffset;
+							$xa = ($x + (2 * $x1)) / 3;
+							$ya = ($y + (2 * $y1)) / 3;
+							$x = $params[($ck - 1)] + $xoffset;
+							$y = $params[($ck)] + $yoffset;
+							$xb = ($x + (2 * $x1)) / 3;
+							$yb = ($y + (2 * $y1)) / 3;
+							$this->_outCurve($xa, $ya, $xb, $yb, $x, $y);
+							$xmin = min($xmin, $x, $xa, $xb);
+							$ymin = min($ymin, $y, $ya, $yb);
+							$xmax = max($xmax, $x, $xa, $xb);
+							$ymax = max($ymax, $y, $ya, $yb);
+							if ($relcoord) {
+								$xoffset = $x;
+								$yoffset = $y;
+							}
+						}
+					}
+					break;
+				}
+				case 'T': { // shorthand/smooth quadratic B�zier curveto
+					foreach ($params as $ck => $cp) {
+						$params[$ck] = $cp;
+						if (($ck % 2) != 0) {
+							if (($key > 0) AND ((strtoupper($paths[($key - 1)][1]) == 'Q') OR (strtoupper($paths[($key - 1)][1]) == 'T'))) {
+								$x1 = (2 * $x) - $x1;
+								$y1 = (2 * $y) - $y1;
+							} else {
+								$x1 = $x;
+								$y1 = $y;
+							}
+							// convert quadratic points to cubic points
+							$xa = ($x + (2 * $x1)) / 3;
+							$ya = ($y + (2 * $y1)) / 3;
+							$x = $params[($ck - 1)] + $xoffset;
+							$y = $params[($ck)] + $yoffset;
+							$xb = ($x + (2 * $x1)) / 3;
+							$yb = ($y + (2 * $y1)) / 3;
+							$this->_outCurve($xa, $ya, $xb, $yb, $x, $y);
+							$xmin = min($xmin, $x, $xa, $xb);
+							$ymin = min($ymin, $y, $ya, $yb);
+							$xmax = max($xmax, $x, $xa, $xb);
+							$ymax = max($ymax, $y, $ya, $yb);
+							if ($relcoord) {
+								$xoffset = $x;
+								$yoffset = $y;
+							}
+						}
+					}
+					break;
+				}
+				case 'A': { // elliptical arc
+					foreach ($params as $ck => $cp) {
+						$params[$ck] = $cp;
+						if ((($ck + 1) % 7) == 0) {
+							$x0 = $x;
+							$y0 = $y;
+							$rx = abs($params[($ck - 6)]);
+							$ry = abs($params[($ck - 5)]);
+							$ang = -$rawparams[($ck - 4)];
+							$angle = deg2rad($ang);
+							$fa = $rawparams[($ck - 3)]; // large-arc-flag
+							$fs = $rawparams[($ck - 2)]; // sweep-flag
+							$x = $params[($ck - 1)] + $xoffset;
+							$y = $params[$ck] + $yoffset;
+							if ((abs($x0 - $x) < $minlen) AND (abs($y0 - $y) < $minlen)) {
+								// endpoints are almost identical
+								$xmin = min($xmin, $x);
+								$ymin = min($ymin, $y);
+								$xmax = max($xmax, $x);
+								$ymax = max($ymax, $y);
+							} else {
+								$cos_ang = cos($angle);
+								$sin_ang = sin($angle);
+								$a = (($x0 - $x) / 2);
+								$b = (($y0 - $y) / 2);
+								$xa = ($a * $cos_ang) - ($b * $sin_ang);
+								$ya = ($a * $sin_ang) + ($b * $cos_ang);
+								$rx2 = $rx * $rx;
+								$ry2 = $ry * $ry;
+								$xa2 = $xa * $xa;
+								$ya2 = $ya * $ya;
+								$delta = ($xa2 / $rx2) + ($ya2 / $ry2);
+								if ($delta > 1) {
+									$rx *= sqrt($delta);
+									$ry *= sqrt($delta);
+									$rx2 = $rx * $rx;
+									$ry2 = $ry * $ry;
+								}
+								$numerator = (($rx2 * $ry2) - ($rx2 * $ya2) - ($ry2 * $xa2));
+								if ($numerator < 0) {
+									$root = 0;
+								} else {
+									$root = sqrt($numerator / (($rx2 * $ya2) + ($ry2 * $xa2)));
+								}
+								if ($fa == $fs){
+									$root *= -1;
+								}
+								$cax = $root * (($rx * $ya) / $ry);
+								$cay = -$root * (($ry * $xa) / $rx);
+								// coordinates of ellipse center
+								$cx = ($cax * $cos_ang) - ($cay * $sin_ang) + (($x0 + $x) / 2);
+								$cy = ($cax * $sin_ang) + ($cay * $cos_ang) + (($y0 + $y) / 2);
+								// get angles
+								$angs = TCPDF_STATIC::getVectorsAngle(1, 0, (($xa - $cax) / $rx), (($cay - $ya) / $ry));
+								$dang = TCPDF_STATIC::getVectorsAngle((($xa - $cax) / $rx), (($ya - $cay) / $ry), ((-$xa - $cax) / $rx), ((-$ya - $cay) / $ry));
+								if (($fs == 0) AND ($dang > 0)) {
+									$dang -= (2 * M_PI);
+								} elseif (($fs == 1) AND ($dang < 0)) {
+									$dang += (2 * M_PI);
+								}
+								$angf = $angs - $dang;
+								if ((($fs == 0) AND ($angs > $angf)) OR (($fs == 1) AND ($angs < $angf))) {
+									// reverse angles
+									$tmp = $angs;
+									$angs = $angf;
+									$angf = $tmp;
+								}
+								$angs = round(rad2deg($angs), 6);
+								$angf = round(rad2deg($angf), 6);
+								// covent angles to positive values
+								if (($angs < 0) AND ($angf < 0)) {
+									$angs += 360;
+									$angf += 360;
+								}
+								$pie = false;
+								if (($key == 0) AND (isset($paths[($key + 1)][1])) AND (trim($paths[($key + 1)][1]) == 'z')) {
+									$pie = true;
+								}
+								list($axmin, $aymin, $axmax, $aymax) = $this->_outellipticalarc($cx, $cy, $rx, $ry, $ang, $angs, $angf, $pie, 2, false, ($fs == 0), true);
+								$xmin = min($xmin, $x, $axmin);
+								$ymin = min($ymin, $y, $aymin);
+								$xmax = max($xmax, $x, $axmax);
+								$ymax = max($ymax, $y, $aymax);
+							}
+							if ($relcoord) {
+								$xoffset = $x;
+								$yoffset = $y;
+							}
+						}
+					}
+					break;
+				}
+				case 'Z': {
+					$this->_out('h');
+					break;
+				}
+			}
+			$firstcmd = false;
+		} // end foreach
+		if (!empty($op)) {
+			$this->_out($op);
+		}
+		return array($xmin, $ymin, ($xmax - $xmin), ($ymax - $ymin));
+	}
+
+	/**
+	 * Sets the opening SVG element handler function for the XML parser. (*** TO BE COMPLETED ***)
+	 * @param $parser (resource) The first parameter, parser, is a reference to the XML parser calling the handler.
+	 * @param $name (string) The second parameter, name, contains the name of the element for which this handler is called. If case-folding is in effect for this parser, the element name will be in uppercase letters.
+	 * @param $attribs (array) The third parameter, attribs, contains an associative array with the element's attributes (if any). The keys of this array are the attribute names, the values are the attribute values. Attribute names are case-folded on the same criteria as element names. Attribute values are not case-folded. The original order of the attributes can be retrieved by walking through attribs the normal way, using each(). The first key in the array was the first attribute, and so on.
+	 * @param $ctm (array) tranformation matrix for clipping mode (starting transformation matrix).
+	 * @author Nicola Asuni
+	 * @since 5.0.000 (2010-05-02)
+	 * @protected
+	 */
+	protected function startSVGElementHandler($parser, $name, $attribs, $ctm=array()) {
+		// check if we are in clip mode
+		if ($this->svgclipmode) {
+			$this->svgclippaths[$this->svgclipid][] = array('name' => $name, 'attribs' => $attribs, 'tm' => $this->svgcliptm[$this->svgclipid]);
+			return;
+		}
+		if ($this->svgdefsmode AND !in_array($name, array('clipPath', 'linearGradient', 'radialGradient', 'stop'))) {
+			if (!isset($attribs['id'])) {
+				$attribs['id'] = 'DF_'.(count($this->svgdefs) + 1);
+			}
+			$this->svgdefs[$attribs['id']] = array('name' => $name, 'attribs' => $attribs);
+			return;
+		}
+		$clipping = false;
+		if ($parser == 'clip-path') {
+			// set clipping mode
+			$clipping = true;
+		}
+		// get styling properties
+		$prev_svgstyle = $this->svgstyles[(count($this->svgstyles) - 1)]; // previous style
+		$svgstyle = $this->svgstyles[0]; // set default style
+		if ($clipping AND !isset($attribs['fill']) AND (!isset($attribs['style']) OR (!preg_match('/[;\"\s]{1}fill[\s]*:[\s]*([^;\"]*)/si', $attribs['style'], $attrval)))) {
+			// default fill attribute for clipping
+			$attribs['fill'] = 'none';
+		}
+		if (isset($attribs['style']) AND !TCPDF_STATIC::empty_string($attribs['style'])) {
+			// fix style for regular expression
+			$attribs['style'] = ';'.$attribs['style'];
+		}
+		foreach ($prev_svgstyle as $key => $val) {
+			if (in_array($key, TCPDF_IMAGES::$svginheritprop)) {
+				// inherit previous value
+				$svgstyle[$key] = $val;
+			}
+			if (isset($attribs[$key]) AND !TCPDF_STATIC::empty_string($attribs[$key])) {
+				// specific attribute settings
+				if ($attribs[$key] == 'inherit') {
+					$svgstyle[$key] = $val;
+				} else {
+					$svgstyle[$key] = $attribs[$key];
+				}
+			} elseif (isset($attribs['style']) AND !TCPDF_STATIC::empty_string($attribs['style'])) {
+				// CSS style syntax
+				$attrval = array();
+				if (preg_match('/[;\"\s]{1}'.$key.'[\s]*:[\s]*([^;\"]*)/si', $attribs['style'], $attrval) AND isset($attrval[1])) {
+					if ($attrval[1] == 'inherit') {
+						$svgstyle[$key] = $val;
+					} else {
+						$svgstyle[$key] = $attrval[1];
+					}
+				}
+			}
+		}
+		// transformation matrix
+		if (!empty($ctm)) {
+			$tm = $ctm;
+		} else {
+			//$tm = $this->svgstyles[(count($this->svgstyles) - 1)]['transfmatrix'];
+			$tm = array(1,0,0,1,0,0);
+		}
+		if (isset($attribs['transform']) AND !empty($attribs['transform'])) {
+			$tm = TCPDF_STATIC::getTransformationMatrixProduct($tm, TCPDF_STATIC::getSVGTransformMatrix($attribs['transform']));
+		}
+		$svgstyle['transfmatrix'] = $tm;
+		$invisible = false;
+		if (($svgstyle['visibility'] == 'hidden') OR ($svgstyle['visibility'] == 'collapse') OR ($svgstyle['display'] == 'none')) {
+			// the current graphics element is invisible (nothing is painted)
+			$invisible = true;
+		}
+		// process tag
+		switch($name) {
+			case 'defs': {
+				$this->svgdefsmode = true;
+				break;
+			}
+			// clipPath
+			case 'clipPath': {
+				if ($invisible) {
+					break;
+				}
+				$this->svgclipmode = true;
+				if (!isset($attribs['id'])) {
+					$attribs['id'] = 'CP_'.(count($this->svgcliptm) + 1);
+				}
+				$this->svgclipid = $attribs['id'];
+				$this->svgclippaths[$this->svgclipid] = array();
+				$this->svgcliptm[$this->svgclipid] = $tm;
+				break;
+			}
+			case 'svg': {
+				// start of SVG object
+				break;
+			}
+			case 'g': {
+				// group together related graphics elements
+				array_push($this->svgstyles, $svgstyle);
+				$this->StartTransform();
+				$this->SVGTransform($tm);
+				$this->setSVGStyles($svgstyle, $prev_svgstyle);
+				break;
+			}
+			case 'linearGradient': {
+				if ($this->pdfa_mode) {
+					break;
+				}
+				if (!isset($attribs['id'])) {
+					$attribs['id'] = 'GR_'.(count($this->svggradients) + 1);
+				}
+				$this->svggradientid = $attribs['id'];
+				$this->svggradients[$this->svggradientid] = array();
+				$this->svggradients[$this->svggradientid]['type'] = 2;
+				$this->svggradients[$this->svggradientid]['stops'] = array();
+				if (isset($attribs['gradientUnits'])) {
+					$this->svggradients[$this->svggradientid]['gradientUnits'] = $attribs['gradientUnits'];
+				} else {
+					$this->svggradients[$this->svggradientid]['gradientUnits'] = 'objectBoundingBox';
+				}
+				//$attribs['spreadMethod']
+				if (((!isset($attribs['x1'])) AND (!isset($attribs['y1'])) AND (!isset($attribs['x2'])) AND (!isset($attribs['y2'])))
+					OR ((isset($attribs['x1']) AND (substr($attribs['x1'], -1) == '%'))
+						OR (isset($attribs['y1']) AND (substr($attribs['y1'], -1) == '%'))
+						OR (isset($attribs['x2']) AND (substr($attribs['x2'], -1) == '%'))
+						OR (isset($attribs['y2']) AND (substr($attribs['y2'], -1) == '%')))) {
+					$this->svggradients[$this->svggradientid]['mode'] = 'percentage';
+				} else {
+					$this->svggradients[$this->svggradientid]['mode'] = 'measure';
+				}
+				$x1 = (isset($attribs['x1'])?$attribs['x1']:'0');
+				$y1 = (isset($attribs['y1'])?$attribs['y1']:'0');
+				$x2 = (isset($attribs['x2'])?$attribs['x2']:'100');
+				$y2 = (isset($attribs['y2'])?$attribs['y2']:'0');
+				if (isset($attribs['gradientTransform'])) {
+					$this->svggradients[$this->svggradientid]['gradientTransform'] = TCPDF_STATIC::getSVGTransformMatrix($attribs['gradientTransform']);
+				}
+				$this->svggradients[$this->svggradientid]['coords'] = array($x1, $y1, $x2, $y2);
+				if (isset($attribs['xlink:href']) AND !empty($attribs['xlink:href'])) {
+					// gradient is defined on another place
+					$this->svggradients[$this->svggradientid]['xref'] = substr($attribs['xlink:href'], 1);
+				}
+				break;
+			}
+			case 'radialGradient': {
+				if ($this->pdfa_mode) {
+					break;
+				}
+				if (!isset($attribs['id'])) {
+					$attribs['id'] = 'GR_'.(count($this->svggradients) + 1);
+				}
+				$this->svggradientid = $attribs['id'];
+				$this->svggradients[$this->svggradientid] = array();
+				$this->svggradients[$this->svggradientid]['type'] = 3;
+				$this->svggradients[$this->svggradientid]['stops'] = array();
+				if (isset($attribs['gradientUnits'])) {
+					$this->svggradients[$this->svggradientid]['gradientUnits'] = $attribs['gradientUnits'];
+				} else {
+					$this->svggradients[$this->svggradientid]['gradientUnits'] = 'objectBoundingBox';
+				}
+				//$attribs['spreadMethod']
+				if (((!isset($attribs['cx'])) AND (!isset($attribs['cy'])))
+					OR ((isset($attribs['cx']) AND (substr($attribs['cx'], -1) == '%'))
+						OR (isset($attribs['cy']) AND (substr($attribs['cy'], -1) == '%')) )) {
+					$this->svggradients[$this->svggradientid]['mode'] = 'percentage';
+				} else {
+					$this->svggradients[$this->svggradientid]['mode'] = 'measure';
+				}
+				$cx = (isset($attribs['cx']) ? $attribs['cx'] : 0.5);
+				$cy = (isset($attribs['cy']) ? $attribs['cy'] : 0.5);
+				$fx = (isset($attribs['fx']) ? $attribs['fx'] : $cx);
+				$fy = (isset($attribs['fy']) ? $attribs['fy'] : $cy);
+				$r = (isset($attribs['r']) ? $attribs['r'] : 0.5);
+				if (isset($attribs['gradientTransform'])) {
+					$this->svggradients[$this->svggradientid]['gradientTransform'] = TCPDF_STATIC::getSVGTransformMatrix($attribs['gradientTransform']);
+				}
+				$this->svggradients[$this->svggradientid]['coords'] = array($cx, $cy, $fx, $fy, $r);
+				if (isset($attribs['xlink:href']) AND !empty($attribs['xlink:href'])) {
+					// gradient is defined on another place
+					$this->svggradients[$this->svggradientid]['xref'] = substr($attribs['xlink:href'], 1);
+				}
+				break;
+			}
+			case 'stop': {
+				// gradient stops
+				if (substr($attribs['offset'], -1) == '%') {
+					$offset = floatval(substr($attribs['offset'], -1)) / 100;
+				} else {
+					$offset = floatval($attribs['offset']);
+					if ($offset > 1) {
+						$offset /= 100;
+					}
+				}
+				$stop_color = isset($svgstyle['stop-color'])?TCPDF_COLORS::convertHTMLColorToDec($svgstyle['stop-color'], $this->spot_colors):'black';
+				$opacity = isset($svgstyle['stop-opacity'])?$svgstyle['stop-opacity']:1;
+				$this->svggradients[$this->svggradientid]['stops'][] = array('offset' => $offset, 'color' => $stop_color, 'opacity' => $opacity);
+				break;
+			}
+			// paths
+			case 'path': {
+				if ($invisible) {
+					break;
+				}
+				if (isset($attribs['d'])) {
+					$d = trim($attribs['d']);
+					if (!empty($d)) {
+						if ($clipping) {
+							$this->SVGTransform($tm);
+							$this->SVGPath($d, 'CNZ');
+						} else {
+							$this->StartTransform();
+							$this->SVGTransform($tm);
+							$obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, 0, 0, 1, 1, 'SVGPath', array($d, 'CNZ'));
+							if (!empty($obstyle)) {
+								$this->SVGPath($d, $obstyle);
+							}
+							$this->StopTransform();
+						}
+					}
+				}
+				break;
+			}
+			// shapes
+			case 'rect': {
+				if ($invisible) {
+					break;
+				}
+				$x = (isset($attribs['x'])?$this->getHTMLUnitToUnits($attribs['x'], 0, $this->svgunit, false):0);
+				$y = (isset($attribs['y'])?$this->getHTMLUnitToUnits($attribs['y'], 0, $this->svgunit, false):0);
+				$w = (isset($attribs['width'])?$this->getHTMLUnitToUnits($attribs['width'], 0, $this->svgunit, false):0);
+				$h = (isset($attribs['height'])?$this->getHTMLUnitToUnits($attribs['height'], 0, $this->svgunit, false):0);
+				$rx = (isset($attribs['rx'])?$this->getHTMLUnitToUnits($attribs['rx'], 0, $this->svgunit, false):0);
+				$ry = (isset($attribs['ry'])?$this->getHTMLUnitToUnits($attribs['ry'], 0, $this->svgunit, false):$rx);
+				if ($clipping) {
+					$this->SVGTransform($tm);
+					$this->RoundedRectXY($x, $y, $w, $h, $rx, $ry, '1111', 'CNZ', array(), array());
+				} else {
+					$this->StartTransform();
+					$this->SVGTransform($tm);
+					$obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'RoundedRectXY', array($x, $y, $w, $h, $rx, $ry, '1111', 'CNZ'));
+					if (!empty($obstyle)) {
+						$this->RoundedRectXY($x, $y, $w, $h, $rx, $ry, '1111', $obstyle, array(), array());
+					}
+					$this->StopTransform();
+				}
+				break;
+			}
+			case 'circle': {
+				if ($invisible) {
+					break;
+				}
+				$r = (isset($attribs['r']) ? $this->getHTMLUnitToUnits($attribs['r'], 0, $this->svgunit, false) : 0);
+				$cx = (isset($attribs['cx']) ? $this->getHTMLUnitToUnits($attribs['cx'], 0, $this->svgunit, false) : (isset($attribs['x']) ? $this->getHTMLUnitToUnits($attribs['x'], 0, $this->svgunit, false) : 0));
+				$cy = (isset($attribs['cy']) ? $this->getHTMLUnitToUnits($attribs['cy'], 0, $this->svgunit, false) : (isset($attribs['y']) ? $this->getHTMLUnitToUnits($attribs['y'], 0, $this->svgunit, false) : 0));
+				$x = ($cx - $r);
+				$y = ($cy - $r);
+				$w = (2 * $r);
+				$h = $w;
+				if ($clipping) {
+					$this->SVGTransform($tm);
+					$this->Circle($cx, $cy, $r, 0, 360, 'CNZ', array(), array(), 8);
+				} else {
+					$this->StartTransform();
+					$this->SVGTransform($tm);
+					$obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'Circle', array($cx, $cy, $r, 0, 360, 'CNZ'));
+					if (!empty($obstyle)) {
+						$this->Circle($cx, $cy, $r, 0, 360, $obstyle, array(), array(), 8);
+					}
+					$this->StopTransform();
+				}
+				break;
+			}
+			case 'ellipse': {
+				if ($invisible) {
+					break;
+				}
+				$rx = (isset($attribs['rx']) ? $this->getHTMLUnitToUnits($attribs['rx'], 0, $this->svgunit, false) : 0);
+				$ry = (isset($attribs['ry']) ? $this->getHTMLUnitToUnits($attribs['ry'], 0, $this->svgunit, false) : 0);
+				$cx = (isset($attribs['cx']) ? $this->getHTMLUnitToUnits($attribs['cx'], 0, $this->svgunit, false) : (isset($attribs['x']) ? $this->getHTMLUnitToUnits($attribs['x'], 0, $this->svgunit, false) : 0));
+				$cy = (isset($attribs['cy']) ? $this->getHTMLUnitToUnits($attribs['cy'], 0, $this->svgunit, false) : (isset($attribs['y']) ? $this->getHTMLUnitToUnits($attribs['y'], 0, $this->svgunit, false) : 0));
+				$x = ($cx - $rx);
+				$y = ($cy - $ry);
+				$w = (2 * $rx);
+				$h = (2 * $ry);
+				if ($clipping) {
+					$this->SVGTransform($tm);
+					$this->Ellipse($cx, $cy, $rx, $ry, 0, 0, 360, 'CNZ', array(), array(), 8);
+				} else {
+					$this->StartTransform();
+					$this->SVGTransform($tm);
+					$obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'Ellipse', array($cx, $cy, $rx, $ry, 0, 0, 360, 'CNZ'));
+					if (!empty($obstyle)) {
+						$this->Ellipse($cx, $cy, $rx, $ry, 0, 0, 360, $obstyle, array(), array(), 8);
+					}
+					$this->StopTransform();
+				}
+				break;
+			}
+			case 'line': {
+				if ($invisible) {
+					break;
+				}
+				$x1 = (isset($attribs['x1'])?$this->getHTMLUnitToUnits($attribs['x1'], 0, $this->svgunit, false):0);
+				$y1 = (isset($attribs['y1'])?$this->getHTMLUnitToUnits($attribs['y1'], 0, $this->svgunit, false):0);
+				$x2 = (isset($attribs['x2'])?$this->getHTMLUnitToUnits($attribs['x2'], 0, $this->svgunit, false):0);
+				$y2 = (isset($attribs['y2'])?$this->getHTMLUnitToUnits($attribs['y2'], 0, $this->svgunit, false):0);
+				$x = $x1;
+				$y = $y1;
+				$w = abs($x2 - $x1);
+				$h = abs($y2 - $y1);
+				if (!$clipping) {
+					$this->StartTransform();
+					$this->SVGTransform($tm);
+					$obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'Line', array($x1, $y1, $x2, $y2));
+					$this->Line($x1, $y1, $x2, $y2);
+					$this->StopTransform();
+				}
+				break;
+			}
+			case 'polyline':
+			case 'polygon': {
+				if ($invisible) {
+					break;
+				}
+				$points = (isset($attribs['points'])?$attribs['points']:'0 0');
+				$points = trim($points);
+				// note that point may use a complex syntax not covered here
+				$points = preg_split('/[\,\s]+/si', $points);
+				if (count($points) < 4) {
+					break;
+				}
+				$p = array();
+				$xmin = 2147483647;
+				$xmax = 0;
+				$ymin = 2147483647;
+				$ymax = 0;
+				foreach ($points as $key => $val) {
+					$p[$key] = $this->getHTMLUnitToUnits($val, 0, $this->svgunit, false);
+					if (($key % 2) == 0) {
+						// X coordinate
+						$xmin = min($xmin, $p[$key]);
+						$xmax = max($xmax, $p[$key]);
+					} else {
+						// Y coordinate
+						$ymin = min($ymin, $p[$key]);
+						$ymax = max($ymax, $p[$key]);
+					}
+				}
+				$x = $xmin;
+				$y = $ymin;
+				$w = ($xmax - $xmin);
+				$h = ($ymax - $ymin);
+				if ($name == 'polyline') {
+					$this->StartTransform();
+					$this->SVGTransform($tm);
+					$obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'PolyLine', array($p, 'CNZ'));
+					if (!empty($obstyle)) {
+						$this->PolyLine($p, $obstyle, array(), array());
+					}
+					$this->StopTransform();
+				} else { // polygon
+					if ($clipping) {
+						$this->SVGTransform($tm);
+						$this->Polygon($p, 'CNZ', array(), array(), true);
+					} else {
+						$this->StartTransform();
+						$this->SVGTransform($tm);
+						$obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'Polygon', array($p, 'CNZ'));
+						if (!empty($obstyle)) {
+							$this->Polygon($p, $obstyle, array(), array(), true);
+						}
+						$this->StopTransform();
+					}
+				}
+				break;
+			}
+			// image
+			case 'image': {
+				if ($invisible) {
+					break;
+				}
+				if (!isset($attribs['xlink:href']) OR empty($attribs['xlink:href'])) {
+					break;
+				}
+				$x = (isset($attribs['x'])?$this->getHTMLUnitToUnits($attribs['x'], 0, $this->svgunit, false):0);
+				$y = (isset($attribs['y'])?$this->getHTMLUnitToUnits($attribs['y'], 0, $this->svgunit, false):0);
+				$w = (isset($attribs['width'])?$this->getHTMLUnitToUnits($attribs['width'], 0, $this->svgunit, false):0);
+				$h = (isset($attribs['height'])?$this->getHTMLUnitToUnits($attribs['height'], 0, $this->svgunit, false):0);
+				$img = $attribs['xlink:href'];
+				if (!$clipping) {
+					$this->StartTransform();
+					$this->SVGTransform($tm);
+					$obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h);
+					if (preg_match('/^data:image\/[^;]+;base64,/', $img, $m) > 0) {
+						// embedded image encoded as base64
+						$img = '@'.base64_decode(substr($img, strlen($m[0])));
+					} else {
+						// fix image path
+						if (!TCPDF_STATIC::empty_string($this->svgdir) AND (($img{0} == '.') OR (basename($img) == $img))) {
+							// replace relative path with full server path
+							$img = $this->svgdir.'/'.$img;
+						}
+						if (($img[0] == '/') AND !empty($_SERVER['DOCUMENT_ROOT']) AND ($_SERVER['DOCUMENT_ROOT'] != '/')) {
+							$findroot = strpos($img, $_SERVER['DOCUMENT_ROOT']);
+							if (($findroot === false) OR ($findroot > 1)) {
+								if (substr($_SERVER['DOCUMENT_ROOT'], -1) == '/') {
+									$img = substr($_SERVER['DOCUMENT_ROOT'], 0, -1).$img;
+								} else {
+									$img = $_SERVER['DOCUMENT_ROOT'].$img;
+								}
+							}
+						}
+						$img = urldecode($img);
+						$testscrtype = @parse_url($img);
+						if (!isset($testscrtype['query']) OR empty($testscrtype['query'])) {
+							// convert URL to server path
+							$img = str_replace(K_PATH_URL, K_PATH_MAIN, $img);
+						}
+					}
+					// get image type
+					$imgtype = TCPDF_IMAGES::getImageFileType($img);
+					if (($imgtype == 'eps') OR ($imgtype == 'ai')) {
+						$this->ImageEps($img, $x, $y, $w, $h);
+					} elseif ($imgtype == 'svg') {
+						$this->ImageSVG($img, $x, $y, $w, $h);
+					} else {
+						$this->Image($img, $x, $y, $w, $h);
+					}
+					$this->StopTransform();
+				}
+				break;
+			}
+			// text
+			case 'text':
+			case 'tspan': {
+				// only basic support - advanced features must be implemented
+				$this->svgtextmode['invisible'] = $invisible;
+				if ($invisible) {
+					break;
+				}
+				array_push($this->svgstyles, $svgstyle);
+				if (isset($attribs['x'])) {
+					$x = $this->getHTMLUnitToUnits($attribs['x'], 0, $this->svgunit, false);
+				} elseif ($name == 'tspan') {
+					$x = $this->x;
+				} else {
+					$x = 0;
+				}
+				if (isset($attribs['dx'])) {
+					$x += $this->getHTMLUnitToUnits($attribs['dx'], 0, $this->svgunit, false);
+				}
+				if (isset($attribs['y'])) {
+					$y = $this->getHTMLUnitToUnits($attribs['y'], 0, $this->svgunit, false);
+				} elseif ($name == 'tspan') {
+					$y = $this->y;
+				} else {
+					$y = 0;
+				}
+				if (isset($attribs['dy'])) {
+					$y += $this->getHTMLUnitToUnits($attribs['dy'], 0, $this->svgunit, false);
+				}
+				$svgstyle['text-color'] = $svgstyle['fill'];
+				$this->svgtext = '';
+				if (isset($svgstyle['text-anchor'])) {
+					$this->svgtextmode['text-anchor'] = $svgstyle['text-anchor'];
+				} else {
+					$this->svgtextmode['text-anchor'] = 'start';
+				}
+				if (isset($svgstyle['direction'])) {
+					if ($svgstyle['direction'] == 'rtl') {
+						$this->svgtextmode['rtl'] = true;
+					} else {
+						$this->svgtextmode['rtl'] = false;
+					}
+				} else {
+					$this->svgtextmode['rtl'] = false;
+				}
+				if (isset($svgstyle['stroke']) AND ($svgstyle['stroke'] != 'none') AND isset($svgstyle['stroke-width']) AND ($svgstyle['stroke-width'] > 0)) {
+					$this->svgtextmode['stroke'] = $this->getHTMLUnitToUnits($svgstyle['stroke-width'], 0, $this->svgunit, false);
+				} else {
+					$this->svgtextmode['stroke'] = false;
+				}
+				$this->StartTransform();
+				$this->SVGTransform($tm);
+				$obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, 1, 1);
+				$this->x = $x;
+				$this->y = $y;
+				break;
+			}
+			// use
+			case 'use': {
+				if (isset($attribs['xlink:href']) AND !empty($attribs['xlink:href'])) {
+					$svgdefid = substr($attribs['xlink:href'], 1);
+					if (isset($this->svgdefs[$svgdefid])) {
+						$use = $this->svgdefs[$svgdefid];
+						if (isset($attribs['xlink:href'])) {
+							unset($attribs['xlink:href']);
+						}
+						if (isset($attribs['id'])) {
+							unset($attribs['id']);
+						}
+						$attribs = array_merge($attribs, $use['attribs']);
+						$this->startSVGElementHandler($parser, $use['name'], $attribs);
+					}
+				}
+				break;
+			}
+			default: {
+				break;
+			}
+		} // end of switch
+	}
+
+	/**
+	 * Sets the closing SVG element handler function for the XML parser.
+	 * @param $parser (resource) The first parameter, parser, is a reference to the XML parser calling the handler.
+	 * @param $name (string) The second parameter, name, contains the name of the element for which this handler is called. If case-folding is in effect for this parser, the element name will be in uppercase letters.
+	 * @author Nicola Asuni
+	 * @since 5.0.000 (2010-05-02)
+	 * @protected
+	 */
+	protected function endSVGElementHandler($parser, $name) {
+		switch($name) {
+			case 'defs': {
+				$this->svgdefsmode = false;
+				break;
+			}
+			// clipPath
+			case 'clipPath': {
+				$this->svgclipmode = false;
+				break;
+			}
+			case 'g': {
+				// ungroup: remove last style from array
+				array_pop($this->svgstyles);
+				$this->StopTransform();
+				break;
+			}
+			case 'text':
+			case 'tspan': {
+				if ($this->svgtextmode['invisible']) {
+					// This implementation must be fixed to following the rule:
+					// If the 'visibility' property is set to hidden on a 'tspan', 'tref' or 'altGlyph' element, then the text is invisible but still takes up space in text layout calculations.
+					break;
+				}
+				// print text
+				$text = $this->svgtext;
+				//$text = $this->stringTrim($text);
+				$textlen = $this->GetStringWidth($text);
+				if ($this->svgtextmode['text-anchor'] != 'start') {
+					// check if string is RTL text
+					if ($this->svgtextmode['text-anchor'] == 'end') {
+						if ($this->svgtextmode['rtl']) {
+							$this->x += $textlen;
+						} else {
+							$this->x -= $textlen;
+						}
+					} elseif ($this->svgtextmode['text-anchor'] == 'middle') {
+						if ($this->svgtextmode['rtl']) {
+							$this->x += ($textlen / 2);
+						} else {
+							$this->x -= ($textlen / 2);
+						}
+					}
+				}
+				$textrendermode = $this->textrendermode;
+				$textstrokewidth = $this->textstrokewidth;
+				$this->setTextRenderingMode($this->svgtextmode['stroke'], true, false);
+				if ($name == 'text') {
+					// store current coordinates
+					$tmpx = $this->x;
+					$tmpy = $this->y;
+				}
+				$this->Cell($textlen, 0, $text, 0, 0, '', false, '', 0, false, 'L', 'T');
+				if ($name == 'text') {
+					// restore coordinates
+					$this->x = $tmpx;
+					$this->y = $tmpy;
+				}
+				// restore previous rendering mode
+				$this->textrendermode = $textrendermode;
+				$this->textstrokewidth = $textstrokewidth;
+				$this->svgtext = '';
+				$this->StopTransform();
+				array_pop($this->svgstyles);
+				break;
+			}
+			default: {
+				break;
+			}
+		}
+	}
+
+	/**
+	 * Sets the character data handler function for the XML parser.
+	 * @param $parser (resource) The first parameter, parser, is a reference to the XML parser calling the handler.
+	 * @param $data (string) The second parameter, data, contains the character data as a string.
+	 * @author Nicola Asuni
+	 * @since 5.0.000 (2010-05-02)
+	 * @protected
+	 */
+	protected function segSVGContentHandler($parser, $data) {
+		$this->svgtext .= $data;
+	}
+
+	// --- END SVG METHODS -----------------------------------------------------
+
+} // END OF TCPDF CLASS
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/tcpdf_autoconfig.php b/htmltest/sites/all/libraries/tcpdf-version/tcpdf_autoconfig.php
new file mode 100644
index 00000000..2fc1da6d
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/tcpdf_autoconfig.php
@@ -0,0 +1,233 @@
+<?php
+//============================================================+
+// File name   : tcpdf_autoconfig.php
+// Version     : 1.0.000
+// Begin       : 2013-05-16
+// Last Update : 2013-05-16
+// Authors     : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2011-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 License
+// along with TCPDF. If not, see
+// <http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : Try to automatically configure some TCPDF
+//               constants if not defined.
+//
+//============================================================+
+
+/**
+ * @file
+ * Try to automatically configure some TCPDF constants if not defined.
+ * @package com.tecnick.tcpdf
+ * @version 1.0.000
+ */
+
+// DOCUMENT_ROOT fix for IIS Webserver
+if ((!isset($_SERVER['DOCUMENT_ROOT'])) OR (empty($_SERVER['DOCUMENT_ROOT']))) {
+	if(isset($_SERVER['SCRIPT_FILENAME'])) {
+		$_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr($_SERVER['SCRIPT_FILENAME'], 0, 0-strlen($_SERVER['PHP_SELF'])));
+	} elseif(isset($_SERVER['PATH_TRANSLATED'])) {
+		$_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr(str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']), 0, 0-strlen($_SERVER['PHP_SELF'])));
+	} else {
+		// define here your DOCUMENT_ROOT path if the previous fails (e.g. '/var/www')
+		$_SERVER['DOCUMENT_ROOT'] = '/';
+	}
+}
+$_SERVER['DOCUMENT_ROOT'] = str_replace('//', '/', $_SERVER['DOCUMENT_ROOT']);
+if (substr($_SERVER['DOCUMENT_ROOT'], -1) != '/') {
+	$_SERVER['DOCUMENT_ROOT'] .= '/';
+}
+
+// Load main configuration file only if the K_TCPDF_EXTERNAL_CONFIG constant is set to false.
+if (!defined('K_TCPDF_EXTERNAL_CONFIG') OR !K_TCPDF_EXTERNAL_CONFIG) {
+	// define a list of default config files in order of priority
+	$tcpdf_config_files = array(dirname(__FILE__).'/config/tcpdf_config.php', '/etc/php-tcpdf/tcpdf_config.php', '/etc/tcpdf/tcpdf_config.php', '/etc/tcpdf_config.php');
+	foreach ($tcpdf_config_files as $tcpdf_config) {
+		if (@file_exists($tcpdf_config) AND is_readable($tcpdf_config)) {
+			require_once($tcpdf_config);
+			break;
+		}
+	}
+}
+
+if (!defined('K_PATH_MAIN')) {
+	define ('K_PATH_MAIN', dirname(__FILE__).'/');
+}
+
+if (!defined('K_PATH_FONTS')) {
+	define ('K_PATH_FONTS', K_PATH_MAIN.'fonts/');
+}
+
+if (!defined('K_PATH_URL')) {
+	$k_path_url = K_PATH_MAIN; // default value for console mode
+	if (isset($_SERVER['HTTP_HOST']) AND (!empty($_SERVER['HTTP_HOST']))) {
+		if(isset($_SERVER['HTTPS']) AND (!empty($_SERVER['HTTPS'])) AND (strtolower($_SERVER['HTTPS']) != 'off')) {
+			$k_path_url = 'https://';
+		} else {
+			$k_path_url = 'http://';
+		}
+		$k_path_url .= $_SERVER['HTTP_HOST'];
+		$k_path_url .= str_replace( '\\', '/', substr(K_PATH_MAIN, (strlen($_SERVER['DOCUMENT_ROOT']) - 1)));
+	}
+	define ('K_PATH_URL', $k_path_url);
+}
+
+if (!defined('K_PATH_IMAGES')) {
+	$tcpdf_images_dirs = array(K_PATH_MAIN.'examples/images/', K_PATH_MAIN.'images/', '/usr/share/doc/php-tcpdf/examples/images/', '/usr/share/doc/tcpdf/examples/images/', '/usr/share/doc/php/tcpdf/examples/images/', '/var/www/tcpdf/images/', '/var/www/html/tcpdf/images/', '/usr/local/apache2/htdocs/tcpdf/images/', K_PATH_MAIN);
+	foreach ($tcpdf_images_dirs as $tcpdf_images_path) {
+		if (@file_exists($tcpdf_images_path)) {
+			break;
+		}
+	}
+	define ('K_PATH_IMAGES', $tcpdf_images_path);
+}
+
+if (!defined('PDF_HEADER_LOGO')) {
+	$tcpdf_header_logo = '';
+	if (@file_exists(K_PATH_IMAGES.'tcpdf_logo.jpg')) {
+		$tcpdf_header_logo = 'tcpdf_logo.jpg';
+	}
+	define ('PDF_HEADER_LOGO', $tcpdf_header_logo);
+}
+
+if (!defined('PDF_HEADER_LOGO_WIDTH')) {
+	if (!empty($tcpdf_header_logo)) {
+		define ('PDF_HEADER_LOGO_WIDTH', 30);
+	} else {
+		define ('PDF_HEADER_LOGO_WIDTH', 0);
+	}
+}
+
+if (!defined('K_PATH_CACHE')) {
+	define ('K_PATH_CACHE', sys_get_temp_dir().'/');
+}
+
+if (!defined('K_BLANK_IMAGE')) {
+	define ('K_BLANK_IMAGE', '_blank.png');
+}
+
+if (!defined('PDF_PAGE_FORMAT')) {
+	define ('PDF_PAGE_FORMAT', 'A4');
+}
+
+if (!defined('PDF_PAGE_ORIENTATION')) {
+	define ('PDF_PAGE_ORIENTATION', 'P');
+}
+
+if (!defined('PDF_CREATOR')) {
+	define ('PDF_CREATOR', 'TCPDF');
+}
+
+if (!defined('PDF_AUTHOR')) {
+	define ('PDF_AUTHOR', 'TCPDF');
+}
+
+if (!defined('PDF_HEADER_TITLE')) {
+	define ('PDF_HEADER_TITLE', 'TCPDF Example');
+}
+
+if (!defined('PDF_HEADER_STRING')) {
+	define ('PDF_HEADER_STRING', "by Nicola Asuni - Tecnick.com\nwww.tcpdf.org");
+}
+
+if (!defined('PDF_UNIT')) {
+	define ('PDF_UNIT', 'mm');
+}
+
+if (!defined('PDF_MARGIN_HEADER')) {
+	define ('PDF_MARGIN_HEADER', 5);
+}
+
+if (!defined('PDF_MARGIN_FOOTER')) {
+	define ('PDF_MARGIN_FOOTER', 10);
+}
+
+if (!defined('PDF_MARGIN_TOP')) {
+	define ('PDF_MARGIN_TOP', 27);
+}
+
+if (!defined('PDF_MARGIN_BOTTOM')) {
+	define ('PDF_MARGIN_BOTTOM', 25);
+}
+
+if (!defined('PDF_MARGIN_LEFT')) {
+	define ('PDF_MARGIN_LEFT', 15);
+}
+
+if (!defined('PDF_MARGIN_RIGHT')) {
+	define ('PDF_MARGIN_RIGHT', 15);
+}
+
+if (!defined('PDF_FONT_NAME_MAIN')) {
+	define ('PDF_FONT_NAME_MAIN', 'helvetica');
+}
+
+if (!defined('PDF_FONT_SIZE_MAIN')) {
+	define ('PDF_FONT_SIZE_MAIN', 10);
+}
+
+if (!defined('PDF_FONT_NAME_DATA')) {
+	define ('PDF_FONT_NAME_DATA', 'helvetica');
+}
+
+if (!defined('PDF_FONT_SIZE_DATA')) {
+	define ('PDF_FONT_SIZE_DATA', 8);
+}
+
+if (!defined('PDF_FONT_MONOSPACED')) {
+	define ('PDF_FONT_MONOSPACED', 'courier');
+}
+
+if (!defined('PDF_IMAGE_SCALE_RATIO')) {
+	define ('PDF_IMAGE_SCALE_RATIO', 1.25);
+}
+
+if (!defined('HEAD_MAGNIFICATION')) {
+	define('HEAD_MAGNIFICATION', 1.1);
+}
+
+if (!defined('K_CELL_HEIGHT_RATIO')) {
+	define('K_CELL_HEIGHT_RATIO', 1.25);
+}
+
+if (!defined('K_TITLE_MAGNIFICATION')) {
+	define('K_TITLE_MAGNIFICATION', 1.3);
+}
+
+if (!defined('K_SMALL_RATIO')) {
+	define('K_SMALL_RATIO', 2/3);
+}
+
+if (!defined('K_THAI_TOPCHARS')) {
+	define('K_THAI_TOPCHARS', true);
+}
+
+if (!defined('K_TCPDF_CALLS_IN_HTML')) {
+	define('K_TCPDF_CALLS_IN_HTML', true);
+}
+
+if (!defined('K_TCPDF_THROW_EXCEPTION_ERROR')) {
+	define('K_TCPDF_THROW_EXCEPTION_ERROR', false);
+}
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/tcpdf_barcodes_1d.php b/htmltest/sites/all/libraries/tcpdf-version/tcpdf_barcodes_1d.php
new file mode 100644
index 00000000..83a44ece
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/tcpdf_barcodes_1d.php
@@ -0,0 +1,2287 @@
+<?php
+//============================================================+
+// File name   : tcpdf_barcodes_1d.php
+// Version     : 1.0.025
+// Begin       : 2008-06-09
+// Last Update : 2013-03-17
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2008-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : PHP class to creates array representations for
+//               common 1D barcodes to be used with TCPDF.
+//
+//============================================================+
+
+/**
+ * @file
+ * PHP class to creates array representations for common 1D barcodes to be used with TCPDF.
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.025
+ */
+
+/**
+ * @class TCPDFBarcode
+ * PHP class to creates array representations for common 1D barcodes to be used with TCPDF (http://www.tcpdf.org).<br>
+ * @package com.tecnick.tcpdf
+ * @version 1.0.025
+ * @author Nicola Asuni
+ */
+class TCPDFBarcode {
+
+	/**
+	 * Array representation of barcode.
+	 * @protected
+	 */
+	protected $barcode_array;
+
+	/**
+	 * This is the class constructor.
+	 * Return an array representations for common 1D barcodes:<ul>
+	 * <li>$arrcode['code'] code to be printed on text label</li>
+	 * <li>$arrcode['maxh'] max barcode height</li>
+	 * <li>$arrcode['maxw'] max barcode width</li>
+	 * <li>$arrcode['bcode'][$k] single bar or space in $k position</li>
+	 * <li>$arrcode['bcode'][$k]['t'] bar type: true = bar, false = space.</li>
+	 * <li>$arrcode['bcode'][$k]['w'] bar width in units.</li>
+	 * <li>$arrcode['bcode'][$k]['h'] bar height in units.</li>
+	 * <li>$arrcode['bcode'][$k]['p'] bar top position (0 = top, 1 = middle)</li></ul>
+	 * @param $code (string) code to print
+ 	 * @param $type (string) type of barcode: <ul><li>C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.</li><li>C39+ : CODE 39 with checksum</li><li>C39E : CODE 39 EXTENDED</li><li>C39E+ : CODE 39 EXTENDED + CHECKSUM</li><li>C93 : CODE 93 - USS-93</li><li>S25 : Standard 2 of 5</li><li>S25+ : Standard 2 of 5 + CHECKSUM</li><li>I25 : Interleaved 2 of 5</li><li>I25+ : Interleaved 2 of 5 + CHECKSUM</li><li>C128 : CODE 128</li><li>C128A : CODE 128 A</li><li>C128B : CODE 128 B</li><li>C128C : CODE 128 C</li><li>EAN2 : 2-Digits UPC-Based Extention</li><li>EAN5 : 5-Digits UPC-Based Extention</li><li>EAN8 : EAN 8</li><li>EAN13 : EAN 13</li><li>UPCA : UPC-A</li><li>UPCE : UPC-E</li><li>MSI : MSI (Variation of Plessey code)</li><li>MSI+ : MSI + CHECKSUM (modulo 11)</li><li>POSTNET : POSTNET</li><li>PLANET : PLANET</li><li>RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)</li><li>KIX : KIX (Klant index - Customer index)</li><li>IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200</li><li>CODABAR : CODABAR</li><li>CODE11 : CODE 11</li><li>PHARMA : PHARMACODE</li><li>PHARMA2T : PHARMACODE TWO-TRACKS</li></ul>
+ 	 * @public
+	 */
+	public function __construct($code, $type) {
+		$this->setBarcode($code, $type);
+	}
+
+	/**
+	 * Return an array representations of barcode.
+ 	 * @return array
+ 	 * @public
+	 */
+	public function getBarcodeArray() {
+		return $this->barcode_array;
+	}
+
+	/**
+	 * Send barcode as SVG image object to the standard output.
+	 * @param $w (int) Minimum width of a single bar in user units.
+	 * @param $h (int) Height of barcode in user units.
+	 * @param $color (string) Foreground color (in SVG format) for bar elements (background is transparent).
+ 	 * @public
+	 */
+	public function getBarcodeSVG($w=2, $h=30, $color='black') {
+		// send headers
+		$code = $this->getBarcodeSVGcode($w, $h, $color);
+		header('Content-Type: application/svg+xml');
+		header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
+		header('Pragma: public');
+		header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
+		header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+		header('Content-Disposition: inline; filename="'.md5($code).'.svg";');
+		//header('Content-Length: '.strlen($code));
+		echo $code;
+	}
+
+	/**
+	 * Return a SVG string representation of barcode.
+	 * @param $w (int) Minimum width of a single bar in user units.
+	 * @param $h (int) Height of barcode in user units.
+	 * @param $color (string) Foreground color (in SVG format) for bar elements (background is transparent).
+ 	 * @return string SVG code.
+ 	 * @public
+	 */
+	public function getBarcodeSVGcode($w=2, $h=30, $color='black') {
+		// replace table for special characters
+		$repstr = array("\0" => '', '&' => '&amp;', '<' => '&lt;', '>' => '&gt;');
+		$svg = '<'.'?'.'xml version="1.0" standalone="no"'.'?'.'>'."\n";
+		$svg .= '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'."\n";
+		$svg .= '<svg width="'.round(($this->barcode_array['maxw'] * $w), 3).'" height="'.$h.'" version="1.1" xmlns="http://www.w3.org/2000/svg">'."\n";
+		$svg .= "\t".'<desc>'.strtr($this->barcode_array['code'], $repstr).'</desc>'."\n";
+		$svg .= "\t".'<g id="bars" fill="'.$color.'" stroke="none">'."\n";
+		// print bars
+		$x = 0;
+		foreach ($this->barcode_array['bcode'] as $k => $v) {
+			$bw = round(($v['w'] * $w), 3);
+			$bh = round(($v['h'] * $h / $this->barcode_array['maxh']), 3);
+			if ($v['t']) {
+				$y = round(($v['p'] * $h / $this->barcode_array['maxh']), 3);
+				// draw a vertical bar
+				$svg .= "\t\t".'<rect x="'.$x.'" y="'.$y.'" width="'.$bw.'" height="'.$bh.'" />'."\n";
+			}
+			$x += $bw;
+		}
+		$svg .= "\t".'</g>'."\n";
+		$svg .= '</svg>'."\n";
+		return $svg;
+	}
+
+	/**
+	 * Return an HTML representation of barcode.
+	 * @param $w (int) Width of a single bar element in pixels.
+	 * @param $h (int) Height of a single bar element in pixels.
+	 * @param $color (string) Foreground color for bar elements (background is transparent).
+ 	 * @return string HTML code.
+ 	 * @public
+	 */
+	public function getBarcodeHTML($w=2, $h=30, $color='black') {
+		$html = '<div style="font-size:0;position:relative;width:'.($this->barcode_array['maxw'] * $w).'px;height:'.($h).'px;">'."\n";
+		// print bars
+		$x = 0;
+		foreach ($this->barcode_array['bcode'] as $k => $v) {
+			$bw = round(($v['w'] * $w), 3);
+			$bh = round(($v['h'] * $h / $this->barcode_array['maxh']), 3);
+			if ($v['t']) {
+				$y = round(($v['p'] * $h / $this->barcode_array['maxh']), 3);
+				// draw a vertical bar
+				$html .= '<div style="background-color:'.$color.';width:'.$bw.'px;height:'.$bh.'px;position:absolute;left:'.$x.'px;top:'.$y.'px;">&nbsp;</div>'."\n";
+			}
+			$x += $bw;
+		}
+		$html .= '</div>'."\n";
+		return $html;
+	}
+
+	/**
+	 * Return a PNG image representation of barcode (requires GD or Imagick library).
+	 * @param $w (int) Width of a single bar element in pixels.
+	 * @param $h (int) Height of a single bar element in pixels.
+	 * @param $color (array) RGB (0-255) foreground color for bar elements (background is transparent).
+ 	 * @return image or false in case of error.
+ 	 * @public
+	 */
+	public function getBarcodePNG($w=2, $h=30, $color=array(0,0,0)) {
+		// calculate image size
+		$width = ($this->barcode_array['maxw'] * $w);
+		$height = $h;
+		if (function_exists('imagecreate')) {
+			// GD library
+			$imagick = false;
+			$png = imagecreate($width, $height);
+			$bgcol = imagecolorallocate($png, 255, 255, 255);
+			imagecolortransparent($png, $bgcol);
+			$fgcol = imagecolorallocate($png, $color[0], $color[1], $color[2]);
+		} elseif (extension_loaded('imagick')) {
+			$imagick = true;
+			$bgcol = new imagickpixel('rgb(255,255,255');
+			$fgcol = new imagickpixel('rgb('.$color[0].','.$color[1].','.$color[2].')');
+			$png = new Imagick();
+			$png->newImage($width, $height, 'none', 'png');
+			$bar = new imagickdraw();
+			$bar->setfillcolor($fgcol);
+		} else {
+			return false;
+		}
+		// print bars
+		$x = 0;
+		foreach ($this->barcode_array['bcode'] as $k => $v) {
+			$bw = round(($v['w'] * $w), 3);
+			$bh = round(($v['h'] * $h / $this->barcode_array['maxh']), 3);
+			if ($v['t']) {
+				$y = round(($v['p'] * $h / $this->barcode_array['maxh']), 3);
+				// draw a vertical bar
+				if ($imagick) {
+					$bar->rectangle($x, $y, ($x + $bw - 1), ($y + $bh - 1));
+				} else {
+					imagefilledrectangle($png, $x, $y, ($x + $bw - 1), ($y + $bh - 1), $fgcol);
+				}
+			}
+			$x += $bw;
+		}
+		// send headers
+		header('Content-Type: image/png');
+		header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
+		header('Pragma: public');
+		header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
+		header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+		if ($imagick) {
+			$png->drawimage($bar);
+			echo $png;
+		} else {
+			imagepng($png);
+			imagedestroy($png);
+		}
+	}
+
+	/**
+	 * Set the barcode.
+	 * @param $code (string) code to print
+ 	 * @param $type (string) type of barcode: <ul><li>C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.</li><li>C39+ : CODE 39 with checksum</li><li>C39E : CODE 39 EXTENDED</li><li>C39E+ : CODE 39 EXTENDED + CHECKSUM</li><li>C93 : CODE 93 - USS-93</li><li>S25 : Standard 2 of 5</li><li>S25+ : Standard 2 of 5 + CHECKSUM</li><li>I25 : Interleaved 2 of 5</li><li>I25+ : Interleaved 2 of 5 + CHECKSUM</li><li>C128 : CODE 128</li><li>C128A : CODE 128 A</li><li>C128B : CODE 128 B</li><li>C128C : CODE 128 C</li><li>EAN2 : 2-Digits UPC-Based Extention</li><li>EAN5 : 5-Digits UPC-Based Extention</li><li>EAN8 : EAN 8</li><li>EAN13 : EAN 13</li><li>UPCA : UPC-A</li><li>UPCE : UPC-E</li><li>MSI : MSI (Variation of Plessey code)</li><li>MSI+ : MSI + CHECKSUM (modulo 11)</li><li>POSTNET : POSTNET</li><li>PLANET : PLANET</li><li>RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)</li><li>KIX : KIX (Klant index - Customer index)</li><li>IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200</li><li>CODABAR : CODABAR</li><li>CODE11 : CODE 11</li><li>PHARMA : PHARMACODE</li><li>PHARMA2T : PHARMACODE TWO-TRACKS</li></ul>
+ 	 * @return array barcode array
+ 	 * @public
+	 */
+	public function setBarcode($code, $type) {
+		switch (strtoupper($type)) {
+			case 'C39': { // CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.
+				$arrcode = $this->barcode_code39($code, false, false);
+				break;
+			}
+			case 'C39+': { // CODE 39 with checksum
+				$arrcode = $this->barcode_code39($code, false, true);
+				break;
+			}
+			case 'C39E': { // CODE 39 EXTENDED
+				$arrcode = $this->barcode_code39($code, true, false);
+				break;
+			}
+			case 'C39E+': { // CODE 39 EXTENDED + CHECKSUM
+				$arrcode = $this->barcode_code39($code, true, true);
+				break;
+			}
+			case 'C93': { // CODE 93 - USS-93
+				$arrcode = $this->barcode_code93($code);
+				break;
+			}
+			case 'S25': { // Standard 2 of 5
+				$arrcode = $this->barcode_s25($code, false);
+				break;
+			}
+			case 'S25+': { // Standard 2 of 5 + CHECKSUM
+				$arrcode = $this->barcode_s25($code, true);
+				break;
+			}
+			case 'I25': { // Interleaved 2 of 5
+				$arrcode = $this->barcode_i25($code, false);
+				break;
+			}
+			case 'I25+': { // Interleaved 2 of 5 + CHECKSUM
+				$arrcode = $this->barcode_i25($code, true);
+				break;
+			}
+			case 'C128': { // CODE 128
+				$arrcode = $this->barcode_c128($code, '');
+				break;
+			}
+			case 'C128A': { // CODE 128 A
+				$arrcode = $this->barcode_c128($code, 'A');
+				break;
+			}
+			case 'C128B': { // CODE 128 B
+				$arrcode = $this->barcode_c128($code, 'B');
+				break;
+			}
+			case 'C128C': { // CODE 128 C
+				$arrcode = $this->barcode_c128($code, 'C');
+				break;
+			}
+			case 'EAN2': { // 2-Digits UPC-Based Extention
+				$arrcode = $this->barcode_eanext($code, 2);
+				break;
+			}
+			case 'EAN5': { // 5-Digits UPC-Based Extention
+				$arrcode = $this->barcode_eanext($code, 5);
+				break;
+			}
+			case 'EAN8': { // EAN 8
+				$arrcode = $this->barcode_eanupc($code, 8);
+				break;
+			}
+			case 'EAN13': { // EAN 13
+				$arrcode = $this->barcode_eanupc($code, 13);
+				break;
+			}
+			case 'UPCA': { // UPC-A
+				$arrcode = $this->barcode_eanupc($code, 12);
+				break;
+			}
+			case 'UPCE': { // UPC-E
+				$arrcode = $this->barcode_eanupc($code, 6);
+				break;
+			}
+			case 'MSI': { // MSI (Variation of Plessey code)
+				$arrcode = $this->barcode_msi($code, false);
+				break;
+			}
+			case 'MSI+': { // MSI + CHECKSUM (modulo 11)
+				$arrcode = $this->barcode_msi($code, true);
+				break;
+			}
+			case 'POSTNET': { // POSTNET
+				$arrcode = $this->barcode_postnet($code, false);
+				break;
+			}
+			case 'PLANET': { // PLANET
+				$arrcode = $this->barcode_postnet($code, true);
+				break;
+			}
+			case 'RMS4CC': { // RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)
+				$arrcode = $this->barcode_rms4cc($code, false);
+				break;
+			}
+			case 'KIX': { // KIX (Klant index - Customer index)
+				$arrcode = $this->barcode_rms4cc($code, true);
+				break;
+			}
+			case 'IMB': { // IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200
+				$arrcode = $this->barcode_imb($code);
+				break;
+			}
+			case 'CODABAR': { // CODABAR
+				$arrcode = $this->barcode_codabar($code);
+				break;
+			}
+			case 'CODE11': { // CODE 11
+				$arrcode = $this->barcode_code11($code);
+				break;
+			}
+			case 'PHARMA': { // PHARMACODE
+				$arrcode = $this->barcode_pharmacode($code);
+				break;
+			}
+			case 'PHARMA2T': { // PHARMACODE TWO-TRACKS
+				$arrcode = $this->barcode_pharmacode2t($code);
+				break;
+			}
+			default: {
+				$this->barcode_array = false;
+				$arrcode = false;
+				break;
+			}
+		}
+		$this->barcode_array = $arrcode;
+	}
+
+	/**
+	 * CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.
+	 * General-purpose code in very wide use world-wide
+	 * @param $code (string) code to represent.
+	 * @param $extended (boolean) if true uses the extended mode.
+	 * @param $checksum (boolean) if true add a checksum to the code.
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_code39($code, $extended=false, $checksum=false) {
+		$chr['0'] = '111331311';
+		$chr['1'] = '311311113';
+		$chr['2'] = '113311113';
+		$chr['3'] = '313311111';
+		$chr['4'] = '111331113';
+		$chr['5'] = '311331111';
+		$chr['6'] = '113331111';
+		$chr['7'] = '111311313';
+		$chr['8'] = '311311311';
+		$chr['9'] = '113311311';
+		$chr['A'] = '311113113';
+		$chr['B'] = '113113113';
+		$chr['C'] = '313113111';
+		$chr['D'] = '111133113';
+		$chr['E'] = '311133111';
+		$chr['F'] = '113133111';
+		$chr['G'] = '111113313';
+		$chr['H'] = '311113311';
+		$chr['I'] = '113113311';
+		$chr['J'] = '111133311';
+		$chr['K'] = '311111133';
+		$chr['L'] = '113111133';
+		$chr['M'] = '313111131';
+		$chr['N'] = '111131133';
+		$chr['O'] = '311131131';
+		$chr['P'] = '113131131';
+		$chr['Q'] = '111111333';
+		$chr['R'] = '311111331';
+		$chr['S'] = '113111331';
+		$chr['T'] = '111131331';
+		$chr['U'] = '331111113';
+		$chr['V'] = '133111113';
+		$chr['W'] = '333111111';
+		$chr['X'] = '131131113';
+		$chr['Y'] = '331131111';
+		$chr['Z'] = '133131111';
+		$chr['-'] = '131111313';
+		$chr['.'] = '331111311';
+		$chr[' '] = '133111311';
+		$chr['$'] = '131313111';
+		$chr['/'] = '131311131';
+		$chr['+'] = '131113131';
+		$chr['%'] = '111313131';
+		$chr['*'] = '131131311';
+		$code = strtoupper($code);
+		if ($extended) {
+			// extended mode
+			$code = $this->encode_code39_ext($code);
+		}
+		if ($code === false) {
+			return false;
+		}
+		if ($checksum) {
+			// checksum
+			$code .= $this->checksum_code39($code);
+		}
+		// add start and stop codes
+		$code = '*'.$code.'*';
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+		$k = 0;
+		$clen = strlen($code);
+		for ($i = 0; $i < $clen; ++$i) {
+			$char = $code{$i};
+			if(!isset($chr[$char])) {
+				// invalid character
+				return false;
+			}
+			for ($j = 0; $j < 9; ++$j) {
+				if (($j % 2) == 0) {
+					$t = true; // bar
+				} else {
+					$t = false; // space
+				}
+				$w = $chr[$char]{$j};
+				$bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+				$bararray['maxw'] += $w;
+				++$k;
+			}
+			// intercharacter gap
+			$bararray['bcode'][$k] = array('t' => false, 'w' => 1, 'h' => 1, 'p' => 0);
+			$bararray['maxw'] += 1;
+			++$k;
+		}
+		return $bararray;
+	}
+
+	/**
+	 * Encode a string to be used for CODE 39 Extended mode.
+	 * @param $code (string) code to represent.
+	 * @return encoded string.
+	 * @protected
+	 */
+	protected function encode_code39_ext($code) {
+		$encode = array(
+			chr(0) => '%U', chr(1) => '$A', chr(2) => '$B', chr(3) => '$C',
+			chr(4) => '$D', chr(5) => '$E', chr(6) => '$F', chr(7) => '$G',
+			chr(8) => '$H', chr(9) => '$I', chr(10) => '$J', chr(11) => '£K',
+			chr(12) => '$L', chr(13) => '$M', chr(14) => '$N', chr(15) => '$O',
+			chr(16) => '$P', chr(17) => '$Q', chr(18) => '$R', chr(19) => '$S',
+			chr(20) => '$T', chr(21) => '$U', chr(22) => '$V', chr(23) => '$W',
+			chr(24) => '$X', chr(25) => '$Y', chr(26) => '$Z', chr(27) => '%A',
+			chr(28) => '%B', chr(29) => '%C', chr(30) => '%D', chr(31) => '%E',
+			chr(32) => ' ', chr(33) => '/A', chr(34) => '/B', chr(35) => '/C',
+			chr(36) => '/D', chr(37) => '/E', chr(38) => '/F', chr(39) => '/G',
+			chr(40) => '/H', chr(41) => '/I', chr(42) => '/J', chr(43) => '/K',
+			chr(44) => '/L', chr(45) => '-', chr(46) => '.', chr(47) => '/O',
+			chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3',
+			chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7',
+			chr(56) => '8', chr(57) => '9', chr(58) => '/Z', chr(59) => '%F',
+			chr(60) => '%G', chr(61) => '%H', chr(62) => '%I', chr(63) => '%J',
+			chr(64) => '%V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C',
+			chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G',
+			chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K',
+			chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O',
+			chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S',
+			chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W',
+			chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => '%K',
+			chr(92) => '%L', chr(93) => '%M', chr(94) => '%N', chr(95) => '%O',
+			chr(96) => '%W', chr(97) => '+A', chr(98) => '+B', chr(99) => '+C',
+			chr(100) => '+D', chr(101) => '+E', chr(102) => '+F', chr(103) => '+G',
+			chr(104) => '+H', chr(105) => '+I', chr(106) => '+J', chr(107) => '+K',
+			chr(108) => '+L', chr(109) => '+M', chr(110) => '+N', chr(111) => '+O',
+			chr(112) => '+P', chr(113) => '+Q', chr(114) => '+R', chr(115) => '+S',
+			chr(116) => '+T', chr(117) => '+U', chr(118) => '+V', chr(119) => '+W',
+			chr(120) => '+X', chr(121) => '+Y', chr(122) => '+Z', chr(123) => '%P',
+			chr(124) => '%Q', chr(125) => '%R', chr(126) => '%S', chr(127) => '%T');
+		$code_ext = '';
+		$clen = strlen($code);
+		for ($i = 0 ; $i < $clen; ++$i) {
+			if (ord($code{$i}) > 127) {
+				return false;
+			}
+			$code_ext .= $encode[$code{$i}];
+		}
+		return $code_ext;
+	}
+
+	/**
+	 * Calculate CODE 39 checksum (modulo 43).
+	 * @param $code (string) code to represent.
+	 * @return char checksum.
+	 * @protected
+	 */
+	protected function checksum_code39($code) {
+		$chars = array(
+			'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+			'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
+			'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
+			'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%');
+		$sum = 0;
+		$clen = strlen($code);
+		for ($i = 0 ; $i < $clen; ++$i) {
+			$k = array_keys($chars, $code{$i});
+			$sum += $k[0];
+		}
+		$j = ($sum % 43);
+		return $chars[$j];
+	}
+
+	/**
+	 * CODE 93 - USS-93
+	 * Compact code similar to Code 39
+	 * @param $code (string) code to represent.
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_code93($code) {
+		$chr[48] = '131112'; // 0
+		$chr[49] = '111213'; // 1
+		$chr[50] = '111312'; // 2
+		$chr[51] = '111411'; // 3
+		$chr[52] = '121113'; // 4
+		$chr[53] = '121212'; // 5
+		$chr[54] = '121311'; // 6
+		$chr[55] = '111114'; // 7
+		$chr[56] = '131211'; // 8
+		$chr[57] = '141111'; // 9
+		$chr[65] = '211113'; // A
+		$chr[66] = '211212'; // B
+		$chr[67] = '211311'; // C
+		$chr[68] = '221112'; // D
+		$chr[69] = '221211'; // E
+		$chr[70] = '231111'; // F
+		$chr[71] = '112113'; // G
+		$chr[72] = '112212'; // H
+		$chr[73] = '112311'; // I
+		$chr[74] = '122112'; // J
+		$chr[75] = '132111'; // K
+		$chr[76] = '111123'; // L
+		$chr[77] = '111222'; // M
+		$chr[78] = '111321'; // N
+		$chr[79] = '121122'; // O
+		$chr[80] = '131121'; // P
+		$chr[81] = '212112'; // Q
+		$chr[82] = '212211'; // R
+		$chr[83] = '211122'; // S
+		$chr[84] = '211221'; // T
+		$chr[85] = '221121'; // U
+		$chr[86] = '222111'; // V
+		$chr[87] = '112122'; // W
+		$chr[88] = '112221'; // X
+		$chr[89] = '122121'; // Y
+		$chr[90] = '123111'; // Z
+		$chr[45] = '121131'; // -
+		$chr[46] = '311112'; // .
+		$chr[32] = '311211'; //
+		$chr[36] = '321111'; // $
+		$chr[47] = '112131'; // /
+		$chr[43] = '113121'; // +
+		$chr[37] = '211131'; // %
+		$chr[128] = '121221'; // ($)
+		$chr[129] = '311121'; // (/)
+		$chr[130] = '122211'; // (+)
+		$chr[131] = '312111'; // (%)
+		$chr[42] = '111141'; // start-stop
+		$code = strtoupper($code);
+		$encode = array(
+			chr(0) => chr(131).'U', chr(1) => chr(128).'A', chr(2) => chr(128).'B', chr(3) => chr(128).'C',
+			chr(4) => chr(128).'D', chr(5) => chr(128).'E', chr(6) => chr(128).'F', chr(7) => chr(128).'G',
+			chr(8) => chr(128).'H', chr(9) => chr(128).'I', chr(10) => chr(128).'J', chr(11) => '£K',
+			chr(12) => chr(128).'L', chr(13) => chr(128).'M', chr(14) => chr(128).'N', chr(15) => chr(128).'O',
+			chr(16) => chr(128).'P', chr(17) => chr(128).'Q', chr(18) => chr(128).'R', chr(19) => chr(128).'S',
+			chr(20) => chr(128).'T', chr(21) => chr(128).'U', chr(22) => chr(128).'V', chr(23) => chr(128).'W',
+			chr(24) => chr(128).'X', chr(25) => chr(128).'Y', chr(26) => chr(128).'Z', chr(27) => chr(131).'A',
+			chr(28) => chr(131).'B', chr(29) => chr(131).'C', chr(30) => chr(131).'D', chr(31) => chr(131).'E',
+			chr(32) => ' ', chr(33) => chr(129).'A', chr(34) => chr(129).'B', chr(35) => chr(129).'C',
+			chr(36) => chr(129).'D', chr(37) => chr(129).'E', chr(38) => chr(129).'F', chr(39) => chr(129).'G',
+			chr(40) => chr(129).'H', chr(41) => chr(129).'I', chr(42) => chr(129).'J', chr(43) => chr(129).'K',
+			chr(44) => chr(129).'L', chr(45) => '-', chr(46) => '.', chr(47) => chr(129).'O',
+			chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3',
+			chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7',
+			chr(56) => '8', chr(57) => '9', chr(58) => chr(129).'Z', chr(59) => chr(131).'F',
+			chr(60) => chr(131).'G', chr(61) => chr(131).'H', chr(62) => chr(131).'I', chr(63) => chr(131).'J',
+			chr(64) => chr(131).'V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C',
+			chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G',
+			chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K',
+			chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O',
+			chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S',
+			chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W',
+			chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => chr(131).'K',
+			chr(92) => chr(131).'L', chr(93) => chr(131).'M', chr(94) => chr(131).'N', chr(95) => chr(131).'O',
+			chr(96) => chr(131).'W', chr(97) => chr(130).'A', chr(98) => chr(130).'B', chr(99) => chr(130).'C',
+			chr(100) => chr(130).'D', chr(101) => chr(130).'E', chr(102) => chr(130).'F', chr(103) => chr(130).'G',
+			chr(104) => chr(130).'H', chr(105) => chr(130).'I', chr(106) => chr(130).'J', chr(107) => chr(130).'K',
+			chr(108) => chr(130).'L', chr(109) => chr(130).'M', chr(110) => chr(130).'N', chr(111) => chr(130).'O',
+			chr(112) => chr(130).'P', chr(113) => chr(130).'Q', chr(114) => chr(130).'R', chr(115) => chr(130).'S',
+			chr(116) => chr(130).'T', chr(117) => chr(130).'U', chr(118) => chr(130).'V', chr(119) => chr(130).'W',
+			chr(120) => chr(130).'X', chr(121) => chr(130).'Y', chr(122) => chr(130).'Z', chr(123) => chr(131).'P',
+			chr(124) => chr(131).'Q', chr(125) => chr(131).'R', chr(126) => chr(131).'S', chr(127) => chr(131).'T');
+		$code_ext = '';
+		$clen = strlen($code);
+		for ($i = 0 ; $i < $clen; ++$i) {
+			if (ord($code{$i}) > 127) {
+				return false;
+			}
+			$code_ext .= $encode[$code{$i}];
+		}
+		// checksum
+		$code_ext .= $this->checksum_code93($code_ext);
+		// add start and stop codes
+		$code = '*'.$code_ext.'*';
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+		$k = 0;
+		$clen = strlen($code);
+		for ($i = 0; $i < $clen; ++$i) {
+			$char = ord($code{$i});
+			if(!isset($chr[$char])) {
+				// invalid character
+				return false;
+			}
+			for ($j = 0; $j < 6; ++$j) {
+				if (($j % 2) == 0) {
+					$t = true; // bar
+				} else {
+					$t = false; // space
+				}
+				$w = $chr[$char]{$j};
+				$bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+				$bararray['maxw'] += $w;
+				++$k;
+			}
+		}
+		$bararray['bcode'][$k] = array('t' => true, 'w' => 1, 'h' => 1, 'p' => 0);
+		$bararray['maxw'] += 1;
+		++$k;
+		return $bararray;
+	}
+
+	/**
+	 * Calculate CODE 93 checksum (modulo 47).
+	 * @param $code (string) code to represent.
+	 * @return string checksum code.
+	 * @protected
+	 */
+	protected function checksum_code93($code) {
+		$chars = array(
+			'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+			'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
+			'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
+			'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%',
+			'<', '=', '>', '?');
+		// translate special characters
+		$code = strtr($code, chr(128).chr(131).chr(129).chr(130), '<=>?');
+		$len = strlen($code);
+		// calculate check digit C
+		$p = 1;
+		$check = 0;
+		for ($i = ($len - 1); $i >= 0; --$i) {
+			$k = array_keys($chars, $code{$i});
+			$check += ($k[0] * $p);
+			++$p;
+			if ($p > 20) {
+				$p = 1;
+			}
+		}
+		$check %= 47;
+		$c = $chars[$check];
+		$code .= $c;
+		// calculate check digit K
+		$p = 1;
+		$check = 0;
+		for ($i = $len; $i >= 0; --$i) {
+			$k = array_keys($chars, $code{$i});
+			$check += ($k[0] * $p);
+			++$p;
+			if ($p > 15) {
+				$p = 1;
+			}
+		}
+		$check %= 47;
+		$k = $chars[$check];
+		$checksum = $c.$k;
+		// resto respecial characters
+		$checksum = strtr($checksum, '<=>?', chr(128).chr(131).chr(129).chr(130));
+		return $checksum;
+	}
+
+	/**
+	 * Checksum for standard 2 of 5 barcodes.
+	 * @param $code (string) code to process.
+	 * @return int checksum.
+	 * @protected
+	 */
+	protected function checksum_s25($code) {
+		$len = strlen($code);
+		$sum = 0;
+		for ($i = 0; $i < $len; $i+=2) {
+			$sum += $code{$i};
+		}
+		$sum *= 3;
+		for ($i = 1; $i < $len; $i+=2) {
+			$sum += ($code{$i});
+		}
+		$r = $sum % 10;
+		if($r > 0) {
+			$r = (10 - $r);
+		}
+		return $r;
+	}
+
+	/**
+	 * MSI.
+	 * Variation of Plessey code, with similar applications
+	 * Contains digits (0 to 9) and encodes the data only in the width of bars.
+	 * @param $code (string) code to represent.
+	 * @param $checksum (boolean) if true add a checksum to the code (modulo 11)
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_msi($code, $checksum=false) {
+		$chr['0'] = '100100100100';
+		$chr['1'] = '100100100110';
+		$chr['2'] = '100100110100';
+		$chr['3'] = '100100110110';
+		$chr['4'] = '100110100100';
+		$chr['5'] = '100110100110';
+		$chr['6'] = '100110110100';
+		$chr['7'] = '100110110110';
+		$chr['8'] = '110100100100';
+		$chr['9'] = '110100100110';
+		$chr['A'] = '110100110100';
+		$chr['B'] = '110100110110';
+		$chr['C'] = '110110100100';
+		$chr['D'] = '110110100110';
+		$chr['E'] = '110110110100';
+		$chr['F'] = '110110110110';
+		if ($checksum) {
+			// add checksum
+			$clen = strlen($code);
+			$p = 2;
+			$check = 0;
+			for ($i = ($clen - 1); $i >= 0; --$i) {
+				$check += (hexdec($code{$i}) * $p);
+				++$p;
+				if ($p > 7) {
+					$p = 2;
+				}
+			}
+			$check %= 11;
+			if ($check > 0) {
+				$check = 11 - $check;
+			}
+			$code .= $check;
+		}
+		$seq = '110'; // left guard
+		$clen = strlen($code);
+		for ($i = 0; $i < $clen; ++$i) {
+			$digit = $code{$i};
+			if (!isset($chr[$digit])) {
+				// invalid character
+				return false;
+			}
+			$seq .= $chr[$digit];
+		}
+		$seq .= '1001'; // right guard
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+		return $this->binseq_to_array($seq, $bararray);
+	}
+
+	/**
+	 * Standard 2 of 5 barcodes.
+	 * Used in airline ticket marking, photofinishing
+	 * Contains digits (0 to 9) and encodes the data only in the width of bars.
+	 * @param $code (string) code to represent.
+	 * @param $checksum (boolean) if true add a checksum to the code
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_s25($code, $checksum=false) {
+		$chr['0'] = '10101110111010';
+		$chr['1'] = '11101010101110';
+		$chr['2'] = '10111010101110';
+		$chr['3'] = '11101110101010';
+		$chr['4'] = '10101110101110';
+		$chr['5'] = '11101011101010';
+		$chr['6'] = '10111011101010';
+		$chr['7'] = '10101011101110';
+		$chr['8'] = '10101110111010';
+		$chr['9'] = '10111010111010';
+		if ($checksum) {
+			// add checksum
+			$code .= $this->checksum_s25($code);
+		}
+		if((strlen($code) % 2) != 0) {
+			// add leading zero if code-length is odd
+			$code = '0'.$code;
+		}
+		$seq = '11011010';
+		$clen = strlen($code);
+		for ($i = 0; $i < $clen; ++$i) {
+			$digit = $code{$i};
+			if (!isset($chr[$digit])) {
+				// invalid character
+				return false;
+			}
+			$seq .= $chr[$digit];
+		}
+		$seq .= '1101011';
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+		return $this->binseq_to_array($seq, $bararray);
+	}
+
+	/**
+	 * Convert binary barcode sequence to TCPDF barcode array.
+	 * @param $seq (string) barcode as binary sequence.
+	 * @param $bararray (array) barcode array.
+	 * òparam array $bararray TCPDF barcode array to fill up
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function binseq_to_array($seq, $bararray) {
+		$len = strlen($seq);
+		$w = 0;
+		$k = 0;
+		for ($i = 0; $i < $len; ++$i) {
+			$w += 1;
+			if (($i == ($len - 1)) OR (($i < ($len - 1)) AND ($seq{$i} != $seq{($i+1)}))) {
+				if ($seq{$i} == '1') {
+					$t = true; // bar
+				} else {
+					$t = false; // space
+				}
+				$bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+				$bararray['maxw'] += $w;
+				++$k;
+				$w = 0;
+			}
+		}
+		return $bararray;
+	}
+
+	/**
+	 * Interleaved 2 of 5 barcodes.
+	 * Compact numeric code, widely used in industry, air cargo
+	 * Contains digits (0 to 9) and encodes the data in the width of both bars and spaces.
+	 * @param $code (string) code to represent.
+	 * @param $checksum (boolean) if true add a checksum to the code
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_i25($code, $checksum=false) {
+		$chr['0'] = '11221';
+		$chr['1'] = '21112';
+		$chr['2'] = '12112';
+		$chr['3'] = '22111';
+		$chr['4'] = '11212';
+		$chr['5'] = '21211';
+		$chr['6'] = '12211';
+		$chr['7'] = '11122';
+		$chr['8'] = '21121';
+		$chr['9'] = '12121';
+		$chr['A'] = '11';
+		$chr['Z'] = '21';
+		if ($checksum) {
+			// add checksum
+			$code .= $this->checksum_s25($code);
+		}
+		if((strlen($code) % 2) != 0) {
+			// add leading zero if code-length is odd
+			$code = '0'.$code;
+		}
+		// add start and stop codes
+		$code = 'AA'.strtolower($code).'ZA';
+
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+		$k = 0;
+		$clen = strlen($code);
+		for ($i = 0; $i < $clen; $i = ($i + 2)) {
+			$char_bar = $code{$i};
+			$char_space = $code{$i+1};
+			if((!isset($chr[$char_bar])) OR (!isset($chr[$char_space]))) {
+				// invalid character
+				return false;
+			}
+			// create a bar-space sequence
+			$seq = '';
+			$chrlen = strlen($chr[$char_bar]);
+			for ($s = 0; $s < $chrlen; $s++){
+				$seq .= $chr[$char_bar]{$s} . $chr[$char_space]{$s};
+			}
+			$seqlen = strlen($seq);
+			for ($j = 0; $j < $seqlen; ++$j) {
+				if (($j % 2) == 0) {
+					$t = true; // bar
+				} else {
+					$t = false; // space
+				}
+				$w = $seq{$j};
+				$bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+				$bararray['maxw'] += $w;
+				++$k;
+			}
+		}
+		return $bararray;
+	}
+
+	/**
+	 * C128 barcodes.
+	 * Very capable code, excellent density, high reliability; in very wide use world-wide
+	 * @param $code (string) code to represent.
+	 * @param $type (string) barcode type: A, B, C or empty for automatic switch (AUTO mode)
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_c128($code, $type='') {
+		$chr = array(
+			'212222', /* 00 */
+			'222122', /* 01 */
+			'222221', /* 02 */
+			'121223', /* 03 */
+			'121322', /* 04 */
+			'131222', /* 05 */
+			'122213', /* 06 */
+			'122312', /* 07 */
+			'132212', /* 08 */
+			'221213', /* 09 */
+			'221312', /* 10 */
+			'231212', /* 11 */
+			'112232', /* 12 */
+			'122132', /* 13 */
+			'122231', /* 14 */
+			'113222', /* 15 */
+			'123122', /* 16 */
+			'123221', /* 17 */
+			'223211', /* 18 */
+			'221132', /* 19 */
+			'221231', /* 20 */
+			'213212', /* 21 */
+			'223112', /* 22 */
+			'312131', /* 23 */
+			'311222', /* 24 */
+			'321122', /* 25 */
+			'321221', /* 26 */
+			'312212', /* 27 */
+			'322112', /* 28 */
+			'322211', /* 29 */
+			'212123', /* 30 */
+			'212321', /* 31 */
+			'232121', /* 32 */
+			'111323', /* 33 */
+			'131123', /* 34 */
+			'131321', /* 35 */
+			'112313', /* 36 */
+			'132113', /* 37 */
+			'132311', /* 38 */
+			'211313', /* 39 */
+			'231113', /* 40 */
+			'231311', /* 41 */
+			'112133', /* 42 */
+			'112331', /* 43 */
+			'132131', /* 44 */
+			'113123', /* 45 */
+			'113321', /* 46 */
+			'133121', /* 47 */
+			'313121', /* 48 */
+			'211331', /* 49 */
+			'231131', /* 50 */
+			'213113', /* 51 */
+			'213311', /* 52 */
+			'213131', /* 53 */
+			'311123', /* 54 */
+			'311321', /* 55 */
+			'331121', /* 56 */
+			'312113', /* 57 */
+			'312311', /* 58 */
+			'332111', /* 59 */
+			'314111', /* 60 */
+			'221411', /* 61 */
+			'431111', /* 62 */
+			'111224', /* 63 */
+			'111422', /* 64 */
+			'121124', /* 65 */
+			'121421', /* 66 */
+			'141122', /* 67 */
+			'141221', /* 68 */
+			'112214', /* 69 */
+			'112412', /* 70 */
+			'122114', /* 71 */
+			'122411', /* 72 */
+			'142112', /* 73 */
+			'142211', /* 74 */
+			'241211', /* 75 */
+			'221114', /* 76 */
+			'413111', /* 77 */
+			'241112', /* 78 */
+			'134111', /* 79 */
+			'111242', /* 80 */
+			'121142', /* 81 */
+			'121241', /* 82 */
+			'114212', /* 83 */
+			'124112', /* 84 */
+			'124211', /* 85 */
+			'411212', /* 86 */
+			'421112', /* 87 */
+			'421211', /* 88 */
+			'212141', /* 89 */
+			'214121', /* 90 */
+			'412121', /* 91 */
+			'111143', /* 92 */
+			'111341', /* 93 */
+			'131141', /* 94 */
+			'114113', /* 95 */
+			'114311', /* 96 */
+			'411113', /* 97 */
+			'411311', /* 98 */
+			'113141', /* 99 */
+			'114131', /* 100 */
+			'311141', /* 101 */
+			'411131', /* 102 */
+			'211412', /* 103 START A */
+			'211214', /* 104 START B */
+			'211232', /* 105 START C */
+			'233111', /* STOP */
+			'200000'  /* END */
+		);
+		// ASCII characters for code A (ASCII 00 - 95)
+		$keys_a = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_';
+		$keys_a .= chr(0).chr(1).chr(2).chr(3).chr(4).chr(5).chr(6).chr(7).chr(8).chr(9);
+		$keys_a .= chr(10).chr(11).chr(12).chr(13).chr(14).chr(15).chr(16).chr(17).chr(18).chr(19);
+		$keys_a .= chr(20).chr(21).chr(22).chr(23).chr(24).chr(25).chr(26).chr(27).chr(28).chr(29);
+		$keys_a .= chr(30).chr(31);
+		// ASCII characters for code B (ASCII 32 - 127)
+		$keys_b = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'.chr(127);
+		// special codes
+		$fnc_a = array(241 => 102, 242 => 97, 243 => 96, 244 => 101);
+		$fnc_b = array(241 => 102, 242 => 97, 243 => 96, 244 => 100);
+		// array of symbols
+		$code_data = array();
+		// lenght of the code
+		$len = strlen($code);
+		switch(strtoupper($type)) {
+			case 'A': { // MODE A
+				$startid = 103;
+				for ($i = 0; $i < $len; ++$i) {
+					$char = $code{$i};
+					$char_id = ord($char);
+					if (($char_id >= 241) AND ($char_id <= 244)) {
+						$code_data[] = $fnc_a[$char_id];
+					} elseif (($char_id >= 0) AND ($char_id <= 95)) {
+						$code_data[] = strpos($keys_a, $char);
+					} else {
+						return false;
+					}
+				}
+				break;
+			}
+			case 'B': { // MODE B
+				$startid = 104;
+				for ($i = 0; $i < $len; ++$i) {
+					$char = $code{$i};
+					$char_id = ord($char);
+					if (($char_id >= 241) AND ($char_id <= 244)) {
+						$code_data[] = $fnc_b[$char_id];
+					} elseif (($char_id >= 32) AND ($char_id <= 127)) {
+						$code_data[] = strpos($keys_b, $char);
+					} else {
+						return false;
+					}
+				}
+				break;
+			}
+			case 'C': { // MODE C
+				$startid = 105;
+				if (ord($code{0}) == 241) {
+					$code_data[] = 102;
+					$code = substr($code, 1);
+					--$len;
+				}
+				if (($len % 2) != 0) {
+					// the length must be even
+					return false;
+				}
+				for ($i = 0; $i < $len; $i+=2) {
+					$chrnum = $code{$i}.$code{$i+1};
+					if (preg_match('/([0-9]{2})/', $chrnum) > 0) {
+						$code_data[] = intval($chrnum);
+					} else {
+						return false;
+					}
+				}
+				break;
+			}
+			default: { // MODE AUTO
+				// split code into sequences
+				$sequence = array();
+				// get numeric sequences (if any)
+				$numseq = array();
+				preg_match_all('/([0-9]{4,})/', $code, $numseq, PREG_OFFSET_CAPTURE);
+				if (isset($numseq[1]) AND !empty($numseq[1])) {
+					$end_offset = 0;
+					foreach ($numseq[1] as $val) {
+						$offset = $val[1];
+						if ($offset > $end_offset) {
+							// non numeric sequence
+							$sequence = array_merge($sequence, $this->get128ABsequence(substr($code, $end_offset, ($offset - $end_offset))));
+						}
+						// numeric sequence
+						$slen = strlen($val[0]);
+						if (($slen % 2) != 0) {
+							// the length must be even
+							--$slen;
+						}
+						$sequence[] = array('C', substr($code, $offset, $slen), $slen);
+						$end_offset = $offset + $slen;
+					}
+					if ($end_offset < $len) {
+						$sequence = array_merge($sequence, $this->get128ABsequence(substr($code, $end_offset)));
+					}
+				} else {
+					// text code (non C mode)
+					$sequence = array_merge($sequence, $this->get128ABsequence($code));
+				}
+				// process the sequence
+				foreach ($sequence as $key => $seq) {
+					switch($seq[0]) {
+						case 'A': {
+							if ($key == 0) {
+								$startid = 103;
+							} elseif ($sequence[($key - 1)][0] != 'A') {
+								if (($seq[2] == 1) AND ($key > 0) AND ($sequence[($key - 1)][0] == 'B') AND (!isset($sequence[($key - 1)][3]))) {
+									// single character shift
+									$code_data[] = 98;
+									// mark shift
+									$sequence[$key][3] = true;
+								} elseif (!isset($sequence[($key - 1)][3])) {
+									$code_data[] = 101;
+								}
+							}
+							for ($i = 0; $i < $seq[2]; ++$i) {
+								$char = $seq[1]{$i};
+								$char_id = ord($char);
+								if (($char_id >= 241) AND ($char_id <= 244)) {
+									$code_data[] = $fnc_a[$char_id];
+								} else {
+									$code_data[] = strpos($keys_a, $char);
+								}
+							}
+							break;
+						}
+						case 'B': {
+							if ($key == 0) {
+								$tmpchr = ord($seq[1]{0});
+								if (($seq[2] == 1) AND ($tmpchr >= 241) AND ($tmpchr <= 244) AND isset($sequence[($key + 1)]) AND ($sequence[($key + 1)][0] != 'B')) {
+									switch ($sequence[($key + 1)][0]) {
+										case 'A': {
+											$startid = 103;
+											$sequence[$key][0] = 'A';
+											$code_data[] = $fnc_a[$tmpchr];
+											break;
+										}
+										case 'C': {
+											$startid = 105;
+											$sequence[$key][0] = 'C';
+											$code_data[] = $fnc_a[$tmpchr];
+											break;
+										}
+									}
+									break;
+								} else {
+									$startid = 104;
+								}
+							} elseif ($sequence[($key - 1)][0] != 'B') {
+								if (($seq[2] == 1) AND ($key > 0) AND ($sequence[($key - 1)][0] == 'A') AND (!isset($sequence[($key - 1)][3]))) {
+									// single character shift
+									$code_data[] = 98;
+									// mark shift
+									$sequence[$key][3] = true;
+								} elseif (!isset($sequence[($key - 1)][3])) {
+									$code_data[] = 100;
+								}
+							}
+							for ($i = 0; $i < $seq[2]; ++$i) {
+								$char = $seq[1]{$i};
+								$char_id = ord($char);
+								if (($char_id >= 241) AND ($char_id <= 244)) {
+									$code_data[] = $fnc_b[$char_id];
+								} else {
+									$code_data[] = strpos($keys_b, $char);
+								}
+							}
+							break;
+						}
+						case 'C': {
+							if ($key == 0) {
+								$startid = 105;
+							} elseif ($sequence[($key - 1)][0] != 'C') {
+								$code_data[] = 99;
+							}
+							for ($i = 0; $i < $seq[2]; $i+=2) {
+								$chrnum = $seq[1]{$i}.$seq[1]{$i+1};
+								$code_data[] = intval($chrnum);
+							}
+							break;
+						}
+					}
+				}
+			}
+		}
+		// calculate check character
+		$sum = $startid;
+		foreach ($code_data as $key => $val) {
+			$sum += ($val * ($key + 1));
+		}
+		// add check character
+		$code_data[] = ($sum % 103);
+		// add stop sequence
+		$code_data[] = 106;
+		$code_data[] = 107;
+		// add start code at the beginning
+		array_unshift($code_data, $startid);
+		// build barcode array
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+		foreach ($code_data as $val) {
+			$seq = $chr[$val];
+			for ($j = 0; $j < 6; ++$j) {
+				if (($j % 2) == 0) {
+					$t = true; // bar
+				} else {
+					$t = false; // space
+				}
+				$w = $seq{$j};
+				$bararray['bcode'][] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+				$bararray['maxw'] += $w;
+			}
+		}
+		return $bararray;
+	}
+
+	/**
+	 * Split text code in A/B sequence for 128 code
+	 * @param $code (string) code to split.
+	 * @return array sequence
+	 * @protected
+	 */
+	protected function get128ABsequence($code) {
+		$len = strlen($code);
+		$sequence = array();
+		// get A sequences (if any)
+		$numseq = array();
+		preg_match_all('/([\0-\31])/', $code, $numseq, PREG_OFFSET_CAPTURE);
+		if (isset($numseq[1]) AND !empty($numseq[1])) {
+			$end_offset = 0;
+			foreach ($numseq[1] as $val) {
+				$offset = $val[1];
+				if ($offset > $end_offset) {
+					// B sequence
+					$sequence[] = array('B', substr($code, $end_offset, ($offset - $end_offset)), ($offset - $end_offset));
+				}
+				// A sequence
+				$slen = strlen($val[0]);
+				$sequence[] = array('A', substr($code, $offset, $slen), $slen);
+				$end_offset = $offset + $slen;
+			}
+			if ($end_offset < $len) {
+				$sequence[] = array('B', substr($code, $end_offset), ($len - $end_offset));
+			}
+		} else {
+			// only B sequence
+			$sequence[] = array('B', $code, $len);
+		}
+		return $sequence;
+	}
+
+	/**
+	 * EAN13 and UPC-A barcodes.
+	 * EAN13: European Article Numbering international retail product code
+	 * UPC-A: Universal product code seen on almost all retail products in the USA and Canada
+	 * UPC-E: Short version of UPC symbol
+	 * @param $code (string) code to represent.
+	 * @param $len (string) barcode type: 6 = UPC-E, 8 = EAN8, 13 = EAN13, 12 = UPC-A
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_eanupc($code, $len=13) {
+		$upce = false;
+		if ($len == 6) {
+			$len = 12; // UPC-A
+			$upce = true; // UPC-E mode
+		}
+		$data_len = $len - 1;
+		//Padding
+		$code = str_pad($code, $data_len, '0', STR_PAD_LEFT);
+		$code_len = strlen($code);
+		// calculate check digit
+		$sum_a = 0;
+		for ($i = 1; $i < $data_len; $i+=2) {
+			$sum_a += $code{$i};
+		}
+		if ($len > 12) {
+			$sum_a *= 3;
+		}
+		$sum_b = 0;
+		for ($i = 0; $i < $data_len; $i+=2) {
+			$sum_b += ($code{$i});
+		}
+		if ($len < 13) {
+			$sum_b *= 3;
+		}
+		$r = ($sum_a + $sum_b) % 10;
+		if($r > 0) {
+			$r = (10 - $r);
+		}
+		if ($code_len == $data_len) {
+			// add check digit
+			$code .= $r;
+		} elseif ($r !== intval($code{$data_len})) {
+			// wrong checkdigit
+			return false;
+		}
+		if ($len == 12) {
+			// UPC-A
+			$code = '0'.$code;
+			++$len;
+		}
+		if ($upce) {
+			// convert UPC-A to UPC-E
+			$tmp = substr($code, 4, 3);
+			if (($tmp == '000') OR ($tmp == '100') OR ($tmp == '200')) {
+				// manufacturer code ends in 000, 100, or 200
+				$upce_code = substr($code, 2, 2).substr($code, 9, 3).substr($code, 4, 1);
+			} else {
+				$tmp = substr($code, 5, 2);
+				if ($tmp == '00') {
+					// manufacturer code ends in 00
+					$upce_code = substr($code, 2, 3).substr($code, 10, 2).'3';
+				} else {
+					$tmp = substr($code, 6, 1);
+					if ($tmp == '0') {
+						// manufacturer code ends in 0
+						$upce_code = substr($code, 2, 4).substr($code, 11, 1).'4';
+					} else {
+						// manufacturer code does not end in zero
+						$upce_code = substr($code, 2, 5).substr($code, 11, 1);
+					}
+				}
+			}
+		}
+		//Convert digits to bars
+		$codes = array(
+			'A'=>array( // left odd parity
+				'0'=>'0001101',
+				'1'=>'0011001',
+				'2'=>'0010011',
+				'3'=>'0111101',
+				'4'=>'0100011',
+				'5'=>'0110001',
+				'6'=>'0101111',
+				'7'=>'0111011',
+				'8'=>'0110111',
+				'9'=>'0001011'),
+			'B'=>array( // left even parity
+				'0'=>'0100111',
+				'1'=>'0110011',
+				'2'=>'0011011',
+				'3'=>'0100001',
+				'4'=>'0011101',
+				'5'=>'0111001',
+				'6'=>'0000101',
+				'7'=>'0010001',
+				'8'=>'0001001',
+				'9'=>'0010111'),
+			'C'=>array( // right
+				'0'=>'1110010',
+				'1'=>'1100110',
+				'2'=>'1101100',
+				'3'=>'1000010',
+				'4'=>'1011100',
+				'5'=>'1001110',
+				'6'=>'1010000',
+				'7'=>'1000100',
+				'8'=>'1001000',
+				'9'=>'1110100')
+		);
+		$parities = array(
+			'0'=>array('A','A','A','A','A','A'),
+			'1'=>array('A','A','B','A','B','B'),
+			'2'=>array('A','A','B','B','A','B'),
+			'3'=>array('A','A','B','B','B','A'),
+			'4'=>array('A','B','A','A','B','B'),
+			'5'=>array('A','B','B','A','A','B'),
+			'6'=>array('A','B','B','B','A','A'),
+			'7'=>array('A','B','A','B','A','B'),
+			'8'=>array('A','B','A','B','B','A'),
+			'9'=>array('A','B','B','A','B','A')
+		);
+		$upce_parities = array();
+		$upce_parities[0] = array(
+			'0'=>array('B','B','B','A','A','A'),
+			'1'=>array('B','B','A','B','A','A'),
+			'2'=>array('B','B','A','A','B','A'),
+			'3'=>array('B','B','A','A','A','B'),
+			'4'=>array('B','A','B','B','A','A'),
+			'5'=>array('B','A','A','B','B','A'),
+			'6'=>array('B','A','A','A','B','B'),
+			'7'=>array('B','A','B','A','B','A'),
+			'8'=>array('B','A','B','A','A','B'),
+			'9'=>array('B','A','A','B','A','B')
+		);
+		$upce_parities[1] = array(
+			'0'=>array('A','A','A','B','B','B'),
+			'1'=>array('A','A','B','A','B','B'),
+			'2'=>array('A','A','B','B','A','B'),
+			'3'=>array('A','A','B','B','B','A'),
+			'4'=>array('A','B','A','A','B','B'),
+			'5'=>array('A','B','B','A','A','B'),
+			'6'=>array('A','B','B','B','A','A'),
+			'7'=>array('A','B','A','B','A','B'),
+			'8'=>array('A','B','A','B','B','A'),
+			'9'=>array('A','B','B','A','B','A')
+		);
+		$k = 0;
+		$seq = '101'; // left guard bar
+		if ($upce) {
+			$bararray = array('code' => $upce_code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+			$p = $upce_parities[$code{1}][$r];
+			for ($i = 0; $i < 6; ++$i) {
+				$seq .= $codes[$p[$i]][$upce_code{$i}];
+			}
+			$seq .= '010101'; // right guard bar
+		} else {
+			$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+			$half_len = intval(ceil($len / 2));
+			if ($len == 8) {
+				for ($i = 0; $i < $half_len; ++$i) {
+					$seq .= $codes['A'][$code{$i}];
+				}
+			} else {
+				$p = $parities[$code{0}];
+				for ($i = 1; $i < $half_len; ++$i) {
+					$seq .= $codes[$p[$i-1]][$code{$i}];
+				}
+			}
+			$seq .= '01010'; // center guard bar
+			for ($i = $half_len; $i < $len; ++$i) {
+				$seq .= $codes['C'][$code{$i}];
+			}
+			$seq .= '101'; // right guard bar
+		}
+		$clen = strlen($seq);
+		$w = 0;
+		for ($i = 0; $i < $clen; ++$i) {
+			$w += 1;
+			if (($i == ($clen - 1)) OR (($i < ($clen - 1)) AND ($seq{$i} != $seq{($i+1)}))) {
+				if ($seq{$i} == '1') {
+					$t = true; // bar
+				} else {
+					$t = false; // space
+				}
+				$bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+				$bararray['maxw'] += $w;
+				++$k;
+				$w = 0;
+			}
+		}
+		return $bararray;
+	}
+
+	/**
+	 * UPC-Based Extentions
+	 * 2-Digit Ext.: Used to indicate magazines and newspaper issue numbers
+	 * 5-Digit Ext.: Used to mark suggested retail price of books
+	 * @param $code (string) code to represent.
+	 * @param $len (string) barcode type: 2 = 2-Digit, 5 = 5-Digit
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_eanext($code, $len=5) {
+		//Padding
+		$code = str_pad($code, $len, '0', STR_PAD_LEFT);
+		// calculate check digit
+		if ($len == 2) {
+			$r = $code % 4;
+		} elseif ($len == 5) {
+			$r = (3 * ($code{0} + $code{2} + $code{4})) + (9 * ($code{1} + $code{3}));
+			$r %= 10;
+		} else {
+			return false;
+		}
+		//Convert digits to bars
+		$codes = array(
+			'A'=>array( // left odd parity
+				'0'=>'0001101',
+				'1'=>'0011001',
+				'2'=>'0010011',
+				'3'=>'0111101',
+				'4'=>'0100011',
+				'5'=>'0110001',
+				'6'=>'0101111',
+				'7'=>'0111011',
+				'8'=>'0110111',
+				'9'=>'0001011'),
+			'B'=>array( // left even parity
+				'0'=>'0100111',
+				'1'=>'0110011',
+				'2'=>'0011011',
+				'3'=>'0100001',
+				'4'=>'0011101',
+				'5'=>'0111001',
+				'6'=>'0000101',
+				'7'=>'0010001',
+				'8'=>'0001001',
+				'9'=>'0010111')
+		);
+		$parities = array();
+		$parities[2] = array(
+			'0'=>array('A','A'),
+			'1'=>array('A','B'),
+			'2'=>array('B','A'),
+			'3'=>array('B','B')
+		);
+		$parities[5] = array(
+			'0'=>array('B','B','A','A','A'),
+			'1'=>array('B','A','B','A','A'),
+			'2'=>array('B','A','A','B','A'),
+			'3'=>array('B','A','A','A','B'),
+			'4'=>array('A','B','B','A','A'),
+			'5'=>array('A','A','B','B','A'),
+			'6'=>array('A','A','A','B','B'),
+			'7'=>array('A','B','A','B','A'),
+			'8'=>array('A','B','A','A','B'),
+			'9'=>array('A','A','B','A','B')
+		);
+		$p = $parities[$len][$r];
+		$seq = '1011'; // left guard bar
+		$seq .= $codes[$p[0]][$code{0}];
+		for ($i = 1; $i < $len; ++$i) {
+			$seq .= '01'; // separator
+			$seq .= $codes[$p[$i]][$code{$i}];
+		}
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+		return $this->binseq_to_array($seq, $bararray);
+	}
+
+	/**
+	 * POSTNET and PLANET barcodes.
+	 * Used by U.S. Postal Service for automated mail sorting
+	 * @param $code (string) zip code to represent. Must be a string containing a zip code of the form DDDDD or DDDDD-DDDD.
+	 * @param $planet (boolean) if true print the PLANET barcode, otherwise print POSTNET
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_postnet($code, $planet=false) {
+		// bar lenght
+		if ($planet) {
+			$barlen = Array(
+				0 => Array(1,1,2,2,2),
+				1 => Array(2,2,2,1,1),
+				2 => Array(2,2,1,2,1),
+				3 => Array(2,2,1,1,2),
+				4 => Array(2,1,2,2,1),
+				5 => Array(2,1,2,1,2),
+				6 => Array(2,1,1,2,2),
+				7 => Array(1,2,2,2,1),
+				8 => Array(1,2,2,1,2),
+				9 => Array(1,2,1,2,2)
+			);
+		} else {
+			$barlen = Array(
+				0 => Array(2,2,1,1,1),
+				1 => Array(1,1,1,2,2),
+				2 => Array(1,1,2,1,2),
+				3 => Array(1,1,2,2,1),
+				4 => Array(1,2,1,1,2),
+				5 => Array(1,2,1,2,1),
+				6 => Array(1,2,2,1,1),
+				7 => Array(2,1,1,1,2),
+				8 => Array(2,1,1,2,1),
+				9 => Array(2,1,2,1,1)
+			);
+		}
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 2, 'bcode' => array());
+		$k = 0;
+		$code = str_replace('-', '', $code);
+		$code = str_replace(' ', '', $code);
+		$len = strlen($code);
+		// calculate checksum
+		$sum = 0;
+		for ($i = 0; $i < $len; ++$i) {
+			$sum += intval($code{$i});
+		}
+		$chkd = ($sum % 10);
+		if($chkd > 0) {
+			$chkd = (10 - $chkd);
+		}
+		$code .= $chkd;
+		$len = strlen($code);
+		// start bar
+		$bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 2, 'p' => 0);
+		$bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0);
+		$bararray['maxw'] += 2;
+		for ($i = 0; $i < $len; ++$i) {
+			for ($j = 0; $j < 5; ++$j) {
+				$h = $barlen[$code{$i}][$j];
+				$p = floor(1 / $h);
+				$bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p);
+				$bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0);
+				$bararray['maxw'] += 2;
+			}
+		}
+		// end bar
+		$bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 2, 'p' => 0);
+		$bararray['maxw'] += 1;
+		return $bararray;
+	}
+
+	/**
+	 * RMS4CC - CBC - KIX
+	 * RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) - KIX (Klant index - Customer index)
+	 * RM4SCC is the name of the barcode symbology used by the Royal Mail for its Cleanmail service.
+	 * @param $code (string) code to print
+	 * @param $kix (boolean) if true prints the KIX variation (doesn't use the start and end symbols, and the checksum) - in this case the house number must be sufficed with an X and placed at the end of the code.
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_rms4cc($code, $kix=false) {
+		$notkix = !$kix;
+		// bar mode
+		// 1 = pos 1, length 2
+		// 2 = pos 1, length 3
+		// 3 = pos 2, length 1
+		// 4 = pos 2, length 2
+		$barmode = array(
+			'0' => array(3,3,2,2),
+			'1' => array(3,4,1,2),
+			'2' => array(3,4,2,1),
+			'3' => array(4,3,1,2),
+			'4' => array(4,3,2,1),
+			'5' => array(4,4,1,1),
+			'6' => array(3,1,4,2),
+			'7' => array(3,2,3,2),
+			'8' => array(3,2,4,1),
+			'9' => array(4,1,3,2),
+			'A' => array(4,1,4,1),
+			'B' => array(4,2,3,1),
+			'C' => array(3,1,2,4),
+			'D' => array(3,2,1,4),
+			'E' => array(3,2,2,3),
+			'F' => array(4,1,1,4),
+			'G' => array(4,1,2,3),
+			'H' => array(4,2,1,3),
+			'I' => array(1,3,4,2),
+			'J' => array(1,4,3,2),
+			'K' => array(1,4,4,1),
+			'L' => array(2,3,3,2),
+			'M' => array(2,3,4,1),
+			'N' => array(2,4,3,1),
+			'O' => array(1,3,2,4),
+			'P' => array(1,4,1,4),
+			'Q' => array(1,4,2,3),
+			'R' => array(2,3,1,4),
+			'S' => array(2,3,2,3),
+			'T' => array(2,4,1,3),
+			'U' => array(1,1,4,4),
+			'V' => array(1,2,3,4),
+			'W' => array(1,2,4,3),
+			'X' => array(2,1,3,4),
+			'Y' => array(2,1,4,3),
+			'Z' => array(2,2,3,3)
+		);
+		$code = strtoupper($code);
+		$len = strlen($code);
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 3, 'bcode' => array());
+		if ($notkix) {
+			// table for checksum calculation (row,col)
+			$checktable = array(
+				'0' => array(1,1),
+				'1' => array(1,2),
+				'2' => array(1,3),
+				'3' => array(1,4),
+				'4' => array(1,5),
+				'5' => array(1,0),
+				'6' => array(2,1),
+				'7' => array(2,2),
+				'8' => array(2,3),
+				'9' => array(2,4),
+				'A' => array(2,5),
+				'B' => array(2,0),
+				'C' => array(3,1),
+				'D' => array(3,2),
+				'E' => array(3,3),
+				'F' => array(3,4),
+				'G' => array(3,5),
+				'H' => array(3,0),
+				'I' => array(4,1),
+				'J' => array(4,2),
+				'K' => array(4,3),
+				'L' => array(4,4),
+				'M' => array(4,5),
+				'N' => array(4,0),
+				'O' => array(5,1),
+				'P' => array(5,2),
+				'Q' => array(5,3),
+				'R' => array(5,4),
+				'S' => array(5,5),
+				'T' => array(5,0),
+				'U' => array(0,1),
+				'V' => array(0,2),
+				'W' => array(0,3),
+				'X' => array(0,4),
+				'Y' => array(0,5),
+				'Z' => array(0,0)
+			);
+			$row = 0;
+			$col = 0;
+			for ($i = 0; $i < $len; ++$i) {
+				$row += $checktable[$code{$i}][0];
+				$col += $checktable[$code{$i}][1];
+			}
+			$row %= 6;
+			$col %= 6;
+			$chk = array_keys($checktable, array($row,$col));
+			$code .= $chk[0];
+			++$len;
+		}
+		$k = 0;
+		if ($notkix) {
+			// start bar
+			$bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 2, 'p' => 0);
+			$bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0);
+			$bararray['maxw'] += 2;
+		}
+		for ($i = 0; $i < $len; ++$i) {
+			for ($j = 0; $j < 4; ++$j) {
+				switch ($barmode[$code{$i}][$j]) {
+					case 1: {
+						$p = 0;
+						$h = 2;
+						break;
+					}
+					case 2: {
+						$p = 0;
+						$h = 3;
+						break;
+					}
+					case 3: {
+						$p = 1;
+						$h = 1;
+						break;
+					}
+					case 4: {
+						$p = 1;
+						$h = 2;
+						break;
+					}
+				}
+				$bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p);
+				$bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0);
+				$bararray['maxw'] += 2;
+			}
+		}
+		if ($notkix) {
+			// stop bar
+			$bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 3, 'p' => 0);
+			$bararray['maxw'] += 1;
+		}
+		return $bararray;
+	}
+
+	/**
+	 * CODABAR barcodes.
+	 * Older code often used in library systems, sometimes in blood banks
+	 * @param $code (string) code to represent.
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_codabar($code) {
+		$chr = array(
+			'0' => '11111221',
+			'1' => '11112211',
+			'2' => '11121121',
+			'3' => '22111111',
+			'4' => '11211211',
+			'5' => '21111211',
+			'6' => '12111121',
+			'7' => '12112111',
+			'8' => '12211111',
+			'9' => '21121111',
+			'-' => '11122111',
+			'$' => '11221111',
+			':' => '21112121',
+			'/' => '21211121',
+			'.' => '21212111',
+			'+' => '11222221',
+			'A' => '11221211',
+			'B' => '12121121',
+			'C' => '11121221',
+			'D' => '11122211'
+		);
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+		$k = 0;
+		$w = 0;
+		$seq = '';
+		$code = 'A'.strtoupper($code).'A';
+		$len = strlen($code);
+		for ($i = 0; $i < $len; ++$i) {
+			if (!isset($chr[$code{$i}])) {
+				return false;
+			}
+			$seq = $chr[$code{$i}];
+			for ($j = 0; $j < 8; ++$j) {
+				if (($j % 2) == 0) {
+					$t = true; // bar
+				} else {
+					$t = false; // space
+				}
+				$w = $seq{$j};
+				$bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+				$bararray['maxw'] += $w;
+				++$k;
+			}
+		}
+		return $bararray;
+	}
+
+	/**
+	 * CODE11 barcodes.
+	 * Used primarily for labeling telecommunications equipment
+	 * @param $code (string) code to represent.
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_code11($code) {
+		$chr = array(
+			'0' => '111121',
+			'1' => '211121',
+			'2' => '121121',
+			'3' => '221111',
+			'4' => '112121',
+			'5' => '212111',
+			'6' => '122111',
+			'7' => '111221',
+			'8' => '211211',
+			'9' => '211111',
+			'-' => '112111',
+			'S' => '112211'
+		);
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+		$k = 0;
+		$w = 0;
+		$seq = '';
+		$len = strlen($code);
+		// calculate check digit C
+		$p = 1;
+		$check = 0;
+		for ($i = ($len - 1); $i >= 0; --$i) {
+			$digit = $code{$i};
+			if ($digit == '-') {
+				$dval = 10;
+			} else {
+				$dval = intval($digit);
+			}
+			$check += ($dval * $p);
+			++$p;
+			if ($p > 10) {
+				$p = 1;
+			}
+		}
+		$check %= 11;
+		if ($check == 10) {
+			$check = '-';
+		}
+		$code .= $check;
+		if ($len > 10) {
+			// calculate check digit K
+			$p = 1;
+			$check = 0;
+			for ($i = $len; $i >= 0; --$i) {
+				$digit = $code{$i};
+				if ($digit == '-') {
+					$dval = 10;
+				} else {
+					$dval = intval($digit);
+				}
+				$check += ($dval * $p);
+				++$p;
+				if ($p > 9) {
+					$p = 1;
+				}
+			}
+			$check %= 11;
+			$code .= $check;
+			++$len;
+		}
+		$code = 'S'.$code.'S';
+		$len += 3;
+		for ($i = 0; $i < $len; ++$i) {
+			if (!isset($chr[$code{$i}])) {
+				return false;
+			}
+			$seq = $chr[$code{$i}];
+			for ($j = 0; $j < 6; ++$j) {
+				if (($j % 2) == 0) {
+					$t = true; // bar
+				} else {
+					$t = false; // space
+				}
+				$w = $seq{$j};
+				$bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+				$bararray['maxw'] += $w;
+				++$k;
+			}
+		}
+		return $bararray;
+	}
+
+	/**
+	 * Pharmacode
+	 * Contains digits (0 to 9)
+	 * @param $code (string) code to represent.
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_pharmacode($code) {
+		$seq = '';
+		$code = intval($code);
+		while ($code > 0) {
+			if (($code % 2) == 0) {
+				$seq .= '11100';
+				$code -= 2;
+			} else {
+				$seq .= '100';
+				$code -= 1;
+			}
+			$code /= 2;
+		}
+		$seq = substr($seq, 0, -2);
+		$seq = strrev($seq);
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+		return $this->binseq_to_array($seq, $bararray);
+	}
+
+	/**
+	 * Pharmacode two-track
+	 * Contains digits (0 to 9)
+	 * @param $code (string) code to represent.
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_pharmacode2t($code) {
+		$seq = '';
+		$code = intval($code);
+		do {
+			switch ($code % 3) {
+				case 0: {
+					$seq .= '3';
+					$code = ($code - 3) / 3;
+					break;
+				}
+				case 1: {
+					$seq .= '1';
+					$code = ($code - 1) / 3;
+					break;
+				}
+				case 2: {
+					$seq .= '2';
+					$code = ($code - 2) / 3;
+					break;
+				}
+			}
+		} while($code != 0);
+		$seq = strrev($seq);
+		$k = 0;
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 2, 'bcode' => array());
+		$len = strlen($seq);
+		for ($i = 0; $i < $len; ++$i) {
+			switch ($seq{$i}) {
+				case '1': {
+					$p = 1;
+					$h = 1;
+					break;
+				}
+				case '2': {
+					$p = 0;
+					$h = 1;
+					break;
+				}
+				case '3': {
+					$p = 0;
+					$h = 2;
+					break;
+				}
+			}
+			$bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p);
+			$bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0);
+			$bararray['maxw'] += 2;
+		}
+		unset($bararray['bcode'][($k - 1)]);
+		--$bararray['maxw'];
+		return $bararray;
+	}
+
+
+	/**
+	 * IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200
+	 * (requires PHP bcmath extension)
+	 * Intelligent Mail barcode is a 65-bar code for use on mail in the United States.
+	 * The fields are described as follows:<ul><li>The Barcode Identifier shall be assigned by USPS to encode the presort identification that is currently printed in human readable form on the optional endorsement line (OEL) as well as for future USPS use. This shall be two digits, with the second digit in the range of 0–4. The allowable encoding ranges shall be 00–04, 10–14, 20–24, 30–34, 40–44, 50–54, 60–64, 70–74, 80–84, and 90–94.</li><li>The Service Type Identifier shall be assigned by USPS for any combination of services requested on the mailpiece. The allowable encoding range shall be 000http://it2.php.net/manual/en/function.dechex.php–999. Each 3-digit value shall correspond to a particular mail class with a particular combination of service(s). Each service program, such as OneCode Confirm and OneCode ACS, shall provide the list of Service Type Identifier values.</li><li>The Mailer or Customer Identifier shall be assigned by USPS as a unique, 6 or 9 digit number that identifies a business entity. The allowable encoding range for the 6 digit Mailer ID shall be 000000- 899999, while the allowable encoding range for the 9 digit Mailer ID shall be 900000000-999999999.</li><li>The Serial or Sequence Number shall be assigned by the mailer for uniquely identifying and tracking mailpieces. The allowable encoding range shall be 000000000–999999999 when used with a 6 digit Mailer ID and 000000-999999 when used with a 9 digit Mailer ID. e. The Delivery Point ZIP Code shall be assigned by the mailer for routing the mailpiece. This shall replace POSTNET for routing the mailpiece to its final delivery point. The length may be 0, 5, 9, or 11 digits. The allowable encoding ranges shall be no ZIP Code, 00000–99999,  000000000–999999999, and 00000000000–99999999999.</li></ul>
+	 * @param $code (string) code to print, separate the ZIP (routing code) from the rest using a minus char '-' (BarcodeID_ServiceTypeID_MailerID_SerialNumber-RoutingCode)
+	 * @return array barcode representation.
+	 * @protected
+	 */
+	protected function barcode_imb($code) {
+		$asc_chr = array(4,0,2,6,3,5,1,9,8,7,1,2,0,6,4,8,2,9,5,3,0,1,3,7,4,6,8,9,2,0,5,1,9,4,3,8,6,7,1,2,4,3,9,5,7,8,3,0,2,1,4,0,9,1,7,0,2,4,6,3,7,1,9,5,8);
+		$dsc_chr = array(7,1,9,5,8,0,2,4,6,3,5,8,9,7,3,0,6,1,7,4,6,8,9,2,5,1,7,5,4,3,8,7,6,0,2,5,4,9,3,0,1,6,8,2,0,4,5,9,6,7,5,2,6,3,8,5,1,9,8,7,4,0,2,6,3);
+		$asc_pos = array(3,0,8,11,1,12,8,11,10,6,4,12,2,7,9,6,7,9,2,8,4,0,12,7,10,9,0,7,10,5,7,9,6,8,2,12,1,4,2,0,1,5,4,6,12,1,0,9,4,7,5,10,2,6,9,11,2,12,6,7,5,11,0,3,2);
+		$dsc_pos = array(2,10,12,5,9,1,5,4,3,9,11,5,10,1,6,3,4,1,10,0,2,11,8,6,1,12,3,8,6,4,4,11,0,6,1,9,11,5,3,7,3,10,7,11,8,2,10,3,5,8,0,3,12,11,8,4,5,1,3,0,7,12,9,8,10);
+		$code_arr = explode('-', $code);
+		$tracking_number = $code_arr[0];
+		if (isset($code_arr[1])) {
+			$routing_code = $code_arr[1];
+		} else {
+			$routing_code = '';
+		}
+		// Conversion of Routing Code
+		switch (strlen($routing_code)) {
+			case 0: {
+				$binary_code = 0;
+				break;
+			}
+			case 5: {
+				$binary_code = bcadd($routing_code, '1');
+				break;
+			}
+			case 9: {
+				$binary_code = bcadd($routing_code, '100001');
+				break;
+			}
+			case 11: {
+				$binary_code = bcadd($routing_code, '1000100001');
+				break;
+			}
+			default: {
+				return false;
+				break;
+			}
+		}
+		$binary_code = bcmul($binary_code, 10);
+		$binary_code = bcadd($binary_code, $tracking_number{0});
+		$binary_code = bcmul($binary_code, 5);
+		$binary_code = bcadd($binary_code, $tracking_number{1});
+		$binary_code .= substr($tracking_number, 2, 18);
+		// convert to hexadecimal
+		$binary_code = $this->dec_to_hex($binary_code);
+		// pad to get 13 bytes
+		$binary_code = str_pad($binary_code, 26, '0', STR_PAD_LEFT);
+		// convert string to array of bytes
+		$binary_code_arr = chunk_split($binary_code, 2, "\r");
+		$binary_code_arr = substr($binary_code_arr, 0, -1);
+		$binary_code_arr = explode("\r", $binary_code_arr);
+		// calculate frame check sequence
+		$fcs = $this->imb_crc11fcs($binary_code_arr);
+		// exclude first 2 bits from first byte
+		$first_byte = sprintf('%2s', dechex((hexdec($binary_code_arr[0]) << 2) >> 2));
+		$binary_code_102bit = $first_byte.substr($binary_code, 2);
+		// convert binary data to codewords
+		$codewords = array();
+		$data = $this->hex_to_dec($binary_code_102bit);
+		$codewords[0] = bcmod($data, 636) * 2;
+		$data = bcdiv($data, 636);
+		for ($i = 1; $i < 9; ++$i) {
+			$codewords[$i] = bcmod($data, 1365);
+			$data = bcdiv($data, 1365);
+		}
+		$codewords[9] = $data;
+		if (($fcs >> 10) == 1) {
+			$codewords[9] += 659;
+		}
+		// generate lookup tables
+		$table2of13 = $this->imb_tables(2, 78);
+		$table5of13 = $this->imb_tables(5, 1287);
+		// convert codewords to characters
+		$characters = array();
+		$bitmask = 512;
+		foreach($codewords as $k => $val) {
+			if ($val <= 1286) {
+				$chrcode = $table5of13[$val];
+			} else {
+				$chrcode = $table2of13[($val - 1287)];
+			}
+			if (($fcs & $bitmask) > 0) {
+				// bitwise invert
+				$chrcode = ((~$chrcode) & 8191);
+			}
+			$characters[] = $chrcode;
+			$bitmask /= 2;
+		}
+		$characters = array_reverse($characters);
+		// build bars
+		$k = 0;
+		$bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 3, 'bcode' => array());
+		for ($i = 0; $i < 65; ++$i) {
+			$asc = (($characters[$asc_chr[$i]] & pow(2, $asc_pos[$i])) > 0);
+			$dsc = (($characters[$dsc_chr[$i]] & pow(2, $dsc_pos[$i])) > 0);
+			if ($asc AND $dsc) {
+				// full bar (F)
+				$p = 0;
+				$h = 3;
+			} elseif ($asc) {
+				// ascender (A)
+				$p = 0;
+				$h = 2;
+			} elseif ($dsc) {
+				// descender (D)
+				$p = 1;
+				$h = 2;
+			} else {
+				// tracker (T)
+				$p = 1;
+				$h = 1;
+			}
+			$bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p);
+			$bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0);
+			$bararray['maxw'] += 2;
+		}
+		unset($bararray['bcode'][($k - 1)]);
+		--$bararray['maxw'];
+		return $bararray;
+	}
+
+	/**
+	 * Convert large integer number to hexadecimal representation.
+	 * (requires PHP bcmath extension)
+	 * @param $number (string) number to convert specified as a string
+	 * @return string hexadecimal representation
+	 */
+	public function dec_to_hex($number) {
+		$i = 0;
+		$hex = array();
+		if($number == 0) {
+			return '00';
+		}
+		while($number > 0) {
+			if($number == 0) {
+				array_push($hex, '0');
+			} else {
+				array_push($hex, strtoupper(dechex(bcmod($number, '16'))));
+				$number = bcdiv($number, '16', 0);
+			}
+		}
+		$hex = array_reverse($hex);
+		return implode($hex);
+	}
+
+	/**
+	 * Convert large hexadecimal number to decimal representation (string).
+	 * (requires PHP bcmath extension)
+	 * @param $hex (string) hexadecimal number to convert specified as a string
+	 * @return string hexadecimal representation
+	 */
+	public function hex_to_dec($hex) {
+		$dec = 0;
+		$bitval = 1;
+		$len = strlen($hex);
+		for($pos = ($len - 1); $pos >= 0; --$pos) {
+			$dec = bcadd($dec, bcmul(hexdec($hex{$pos}), $bitval));
+			$bitval = bcmul($bitval, 16);
+		}
+		return $dec;
+	}
+
+	/**
+	 * Intelligent Mail Barcode calculation of Frame Check Sequence
+	 * @param $code_arr (string) array of hexadecimal values (13 bytes holding 102 bits right justified).
+	 * @return int 11 bit Frame Check Sequence as integer (decimal base)
+	 * @protected
+	 */
+	protected function imb_crc11fcs($code_arr) {
+		$genpoly = 0x0F35; // generator polynomial
+		$fcs = 0x07FF; // Frame Check Sequence
+		// do most significant byte skipping the 2 most significant bits
+		$data = hexdec($code_arr[0]) << 5;
+		for ($bit = 2; $bit < 8; ++$bit) {
+			if (($fcs ^ $data) & 0x400) {
+				$fcs = ($fcs << 1) ^ $genpoly;
+			} else {
+				$fcs = ($fcs << 1);
+			}
+			$fcs &= 0x7FF;
+			$data <<= 1;
+		}
+		// do rest of bytes
+		for ($byte = 1; $byte < 13; ++$byte) {
+			$data = hexdec($code_arr[$byte]) << 3;
+			for ($bit = 0; $bit < 8; ++$bit) {
+				if (($fcs ^ $data) & 0x400) {
+					$fcs = ($fcs << 1) ^ $genpoly;
+				} else {
+					$fcs = ($fcs << 1);
+				}
+				$fcs &= 0x7FF;
+				$data <<= 1;
+			}
+		}
+		return $fcs;
+	}
+
+	/**
+	 * Reverse unsigned short value
+	 * @param $num (int) value to reversr
+	 * @return int reversed value
+	 * @protected
+	 */
+	protected function imb_reverse_us($num) {
+		$rev = 0;
+		for ($i = 0; $i < 16; ++$i) {
+			$rev <<= 1;
+			$rev |= ($num & 1);
+			$num >>= 1;
+		}
+		return $rev;
+	}
+
+	/**
+	 * generate Nof13 tables used for Intelligent Mail Barcode
+	 * @param $n (int) is the type of table: 2 for 2of13 table, 5 for 5of13table
+	 * @param $size (int) size of table (78 for n=2 and 1287 for n=5)
+	 * @return array requested table
+	 * @protected
+	 */
+	protected function imb_tables($n, $size) {
+		$table = array();
+		$lli = 0; // LUT lower index
+		$lui = $size - 1; // LUT upper index
+		for ($count = 0; $count < 8192; ++$count) {
+			$bit_count = 0;
+			for ($bit_index = 0; $bit_index < 13; ++$bit_index) {
+				$bit_count += intval(($count & (1 << $bit_index)) != 0);
+			}
+			// if we don't have the right number of bits on, go on to the next value
+			if ($bit_count == $n) {
+				$reverse = ($this->imb_reverse_us($count) >> 3);
+				// if the reverse is less than count, we have already visited this pair before
+				if ($reverse >= $count) {
+					// If count is symmetric, place it at the first free slot from the end of the list.
+					// Otherwise, place it at the first free slot from the beginning of the list AND place $reverse ath the next free slot from the beginning of the list
+					if ($reverse == $count) {
+						$table[$lui] = $count;
+						--$lui;
+					} else {
+						$table[$lli] = $count;
+						++$lli;
+						$table[$lli] = $reverse;
+						++$lli;
+					}
+				}
+			}
+		}
+		return $table;
+	}
+
+} // end of class
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/tcpdf_barcodes_2d.php b/htmltest/sites/all/libraries/tcpdf-version/tcpdf_barcodes_2d.php
new file mode 100644
index 00000000..fd6ff069
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/tcpdf_barcodes_2d.php
@@ -0,0 +1,332 @@
+<?php
+//============================================================+
+// File name   : tcpdf_barcodes_2d.php
+// Version     : 1.0.014
+// Begin       : 2009-04-07
+// Last Update : 2013-03-17
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 TCPDF.  If not, see <http://www.gnu.org/licenses/>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : PHP class to creates array representations for
+//               2D barcodes to be used with TCPDF.
+//
+//============================================================+
+
+/**
+ * @file
+ * PHP class to creates array representations for 2D barcodes to be used with TCPDF.
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.014
+ */
+
+/**
+ * @class TCPDF2DBarcode
+ * PHP class to creates array representations for 2D barcodes to be used with TCPDF (http://www.tcpdf.org).
+ * @package com.tecnick.tcpdf
+ * @version 1.0.014
+ * @author Nicola Asuni
+ */
+class TCPDF2DBarcode {
+
+	/**
+	 * Array representation of barcode.
+	 * @protected
+	 */
+	protected $barcode_array = false;
+
+	/**
+	 * This is the class constructor.
+	 * Return an array representations for 2D barcodes:<ul>
+	 * <li>$arrcode['code'] code to be printed on text label</li>
+	 * <li>$arrcode['num_rows'] required number of rows</li>
+	 * <li>$arrcode['num_cols'] required number of columns</li>
+	 * <li>$arrcode['bcode'][$r][$c] value of the cell is $r row and $c column (0 = transparent, 1 = black)</li></ul>
+	 * @param $code (string) code to print
+ 	 * @param $type (string) type of barcode: <ul><li>DATAMATRIX : Datamatrix (ISO/IEC 16022)</li><li>PDF417 : PDF417 (ISO/IEC 15438:2006)</li><li>PDF417,a,e,t,s,f,o0,o1,o2,o3,o4,o5,o6 : PDF417 with parameters: a = aspect ratio (width/height); e = error correction level (0-8); t = total number of macro segments; s = macro segment index (0-99998); f = file ID; o0 = File Name (text); o1 = Segment Count (numeric); o2 = Time Stamp (numeric); o3 = Sender (text); o4 = Addressee (text); o5 = File Size (numeric); o6 = Checksum (numeric). NOTES: Parameters t, s and f are required for a Macro Control Block, all other parametrs are optional. To use a comma character ',' on text options, replace it with the character 255: "\xff".</li><li>QRCODE : QRcode Low error correction</li><li>QRCODE,L : QRcode Low error correction</li><li>QRCODE,M : QRcode Medium error correction</li><li>QRCODE,Q : QRcode Better error correction</li><li>QRCODE,H : QR-CODE Best error correction</li><li>RAW: raw mode - comma-separad list of array rows</li><li>RAW2: raw mode - array rows are surrounded by square parenthesis.</li><li>TEST : Test matrix</li></ul>
+	 */
+	public function __construct($code, $type) {
+		$this->setBarcode($code, $type);
+	}
+
+	/**
+	 * Return an array representations of barcode.
+ 	 * @return array
+	 */
+	public function getBarcodeArray() {
+		return $this->barcode_array;
+	}
+
+	/**
+	 * Send barcode as SVG image object to the standard output.
+	 * @param $w (int) Width of a single rectangle element in user units.
+	 * @param $h (int) Height of a single rectangle element in user units.
+	 * @param $color (string) Foreground color (in SVG format) for bar elements (background is transparent).
+ 	 * @public
+	 */
+	public function getBarcodeSVG($w=3, $h=3, $color='black') {
+		// send headers
+		$code = $this->getBarcodeSVGcode($w, $h, $color);
+		header('Content-Type: application/svg+xml');
+		header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
+		header('Pragma: public');
+		header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
+		header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+		header('Content-Disposition: inline; filename="'.md5($code).'.svg";');
+		//header('Content-Length: '.strlen($code));
+		echo $code;
+	}
+
+	/**
+	 * Return a SVG string representation of barcode.
+	 * @param $w (int) Width of a single rectangle element in user units.
+	 * @param $h (int) Height of a single rectangle element in user units.
+	 * @param $color (string) Foreground color (in SVG format) for bar elements (background is transparent).
+ 	 * @return string SVG code.
+ 	 * @public
+	 */
+	public function getBarcodeSVGcode($w=3, $h=3, $color='black') {
+		// replace table for special characters
+		$repstr = array("\0" => '', '&' => '&amp;', '<' => '&lt;', '>' => '&gt;');
+		$svg = '<'.'?'.'xml version="1.0" standalone="no"'.'?'.'>'."\n";
+		$svg .= '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'."\n";
+		$svg .= '<svg width="'.round(($this->barcode_array['num_cols'] * $w), 3).'" height="'.round(($this->barcode_array['num_rows'] * $h), 3).'" version="1.1" xmlns="http://www.w3.org/2000/svg">'."\n";
+		$svg .= "\t".'<desc>'.strtr($this->barcode_array['code'], $repstr).'</desc>'."\n";
+		$svg .= "\t".'<g id="elements" fill="'.$color.'" stroke="none">'."\n";
+		// print barcode elements
+		$y = 0;
+		// for each row
+		for ($r = 0; $r < $this->barcode_array['num_rows']; ++$r) {
+			$x = 0;
+			// for each column
+			for ($c = 0; $c < $this->barcode_array['num_cols']; ++$c) {
+				if ($this->barcode_array['bcode'][$r][$c] == 1) {
+					// draw a single barcode cell
+					$svg .= "\t\t".'<rect x="'.$x.'" y="'.$y.'" width="'.$w.'" height="'.$h.'" />'."\n";
+				}
+				$x += $w;
+			}
+			$y += $h;
+		}
+		$svg .= "\t".'</g>'."\n";
+		$svg .= '</svg>'."\n";
+		return $svg;
+	}
+
+	/**
+	 * Return an HTML representation of barcode.
+	 * @param $w (int) Width of a single rectangle element in pixels.
+	 * @param $h (int) Height of a single rectangle element in pixels.
+	 * @param $color (string) Foreground color for bar elements (background is transparent).
+ 	 * @return string HTML code.
+ 	 * @public
+	 */
+	public function getBarcodeHTML($w=10, $h=10, $color='black') {
+		$html = '<div style="font-size:0;position:relative;width:'.($w * $this->barcode_array['num_cols']).'px;height:'.($h * $this->barcode_array['num_rows']).'px;">'."\n";
+		// print barcode elements
+		$y = 0;
+		// for each row
+		for ($r = 0; $r < $this->barcode_array['num_rows']; ++$r) {
+			$x = 0;
+			// for each column
+			for ($c = 0; $c < $this->barcode_array['num_cols']; ++$c) {
+				if ($this->barcode_array['bcode'][$r][$c] == 1) {
+					// draw a single barcode cell
+					$html .= '<div style="background-color:'.$color.';width:'.$w.'px;height:'.$h.'px;position:absolute;left:'.$x.'px;top:'.$y.'px;">&nbsp;</div>'."\n";
+				}
+				$x += $w;
+			}
+			$y += $h;
+		}
+		$html .= '</div>'."\n";
+		return $html;
+	}
+
+	/**
+	 * Return a PNG image representation of barcode (requires GD or Imagick library).
+	 * @param $w (int) Width of a single rectangle element in pixels.
+	 * @param $h (int) Height of a single rectangle element in pixels.
+	 * @param $color (array) RGB (0-255) foreground color for bar elements (background is transparent).
+ 	 * @return image or false in case of error.
+ 	 * @public
+	 */
+	public function getBarcodePNG($w=3, $h=3, $color=array(0,0,0)) {
+		// calculate image size
+		$width = ($this->barcode_array['num_cols'] * $w);
+		$height = ($this->barcode_array['num_rows'] * $h);
+		if (function_exists('imagecreate')) {
+			// GD library
+			$imagick = false;
+			$png = imagecreate($width, $height);
+			$bgcol = imagecolorallocate($png, 255, 255, 255);
+			imagecolortransparent($png, $bgcol);
+			$fgcol = imagecolorallocate($png, $color[0], $color[1], $color[2]);
+		} elseif (extension_loaded('imagick')) {
+			$imagick = true;
+			$bgcol = new imagickpixel('rgb(255,255,255');
+			$fgcol = new imagickpixel('rgb('.$color[0].','.$color[1].','.$color[2].')');
+			$png = new Imagick();
+			$png->newImage($width, $height, 'none', 'png');
+			$bar = new imagickdraw();
+			$bar->setfillcolor($fgcol);
+		} else {
+			return false;
+		}
+		// print barcode elements
+		$y = 0;
+		// for each row
+		for ($r = 0; $r < $this->barcode_array['num_rows']; ++$r) {
+			$x = 0;
+			// for each column
+			for ($c = 0; $c < $this->barcode_array['num_cols']; ++$c) {
+				if ($this->barcode_array['bcode'][$r][$c] == 1) {
+					// draw a single barcode cell
+					if ($imagick) {
+						$bar->rectangle($x, $y, ($x + $w - 1), ($y + $h - 1));
+					} else {
+						imagefilledrectangle($png, $x, $y, ($x + $w - 1), ($y + $h - 1), $fgcol);
+					}
+				}
+				$x += $w;
+			}
+			$y += $h;
+		}
+		// send headers
+		header('Content-Type: image/png');
+		header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
+		header('Pragma: public');
+		header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
+		header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+		if ($imagick) {
+			$png->drawimage($bar);
+			echo $png;
+		} else {
+			imagepng($png);
+			imagedestroy($png);
+		}
+	}
+
+	/**
+	 * Set the barcode.
+	 * @param $code (string) code to print
+ 	 * @param $type (string) type of barcode: <ul><li>DATAMATRIX : Datamatrix (ISO/IEC 16022)</li><li>PDF417 : PDF417 (ISO/IEC 15438:2006)</li><li>PDF417,a,e,t,s,f,o0,o1,o2,o3,o4,o5,o6 : PDF417 with parameters: a = aspect ratio (width/height); e = error correction level (0-8); t = total number of macro segments; s = macro segment index (0-99998); f = file ID; o0 = File Name (text); o1 = Segment Count (numeric); o2 = Time Stamp (numeric); o3 = Sender (text); o4 = Addressee (text); o5 = File Size (numeric); o6 = Checksum (numeric). NOTES: Parameters t, s and f are required for a Macro Control Block, all other parametrs are optional. To use a comma character ',' on text options, replace it with the character 255: "\xff".</li><li>QRCODE : QRcode Low error correction</li><li>QRCODE,L : QRcode Low error correction</li><li>QRCODE,M : QRcode Medium error correction</li><li>QRCODE,Q : QRcode Better error correction</li><li>QRCODE,H : QR-CODE Best error correction</li><li>RAW: raw mode - comma-separad list of array rows</li><li>RAW2: raw mode - array rows are surrounded by square parenthesis.</li><li>TEST : Test matrix</li></ul>
+ 	 * @return array
+	 */
+	public function setBarcode($code, $type) {
+		$mode = explode(',', $type);
+		$qrtype = strtoupper($mode[0]);
+		switch ($qrtype) {
+			case 'DATAMATRIX': { // DATAMATRIX (ISO/IEC 16022)
+				require_once(dirname(__FILE__).'/include/barcodes/datamatrix.php');
+				$qrcode = new Datamatrix($code);
+				$this->barcode_array = $qrcode->getBarcodeArray();
+				$this->barcode_array['code'] = $code;
+				break;
+			}
+			case 'PDF417': { // PDF417 (ISO/IEC 15438:2006)
+				require_once(dirname(__FILE__).'/include/barcodes/pdf417.php');
+				if (!isset($mode[1]) OR ($mode[1] === '')) {
+					$aspectratio = 2; // default aspect ratio (width / height)
+				} else {
+					$aspectratio = floatval($mode[1]);
+				}
+				if (!isset($mode[2]) OR ($mode[2] === '')) {
+					$ecl = -1; // default error correction level (auto)
+				} else {
+					$ecl = intval($mode[2]);
+				}
+				// set macro block
+				$macro = array();
+				if (isset($mode[3]) AND ($mode[3] !== '') AND isset($mode[4]) AND ($mode[4] !== '') AND isset($mode[5]) AND ($mode[5] !== '')) {
+					$macro['segment_total'] = intval($mode[3]);
+					$macro['segment_index'] = intval($mode[4]);
+					$macro['file_id'] = strtr($mode[5], "\xff", ',');
+					for ($i = 0; $i < 7; ++$i) {
+						$o = $i + 6;
+						if (isset($mode[$o]) AND ($mode[$o] !== '')) {
+							// add option
+							$macro['option_'.$i] = strtr($mode[$o], "\xff", ',');
+						}
+					}
+				}
+				$qrcode = new PDF417($code, $ecl, $aspectratio, $macro);
+				$this->barcode_array = $qrcode->getBarcodeArray();
+				$this->barcode_array['code'] = $code;
+				break;
+			}
+			case 'QRCODE': { // QR-CODE
+				require_once(dirname(__FILE__).'/include/barcodes/qrcode.php');
+				if (!isset($mode[1]) OR (!in_array($mode[1],array('L','M','Q','H')))) {
+					$mode[1] = 'L'; // Ddefault: Low error correction
+				}
+				$qrcode = new QRcode($code, strtoupper($mode[1]));
+				$this->barcode_array = $qrcode->getBarcodeArray();
+				$this->barcode_array['code'] = $code;
+				break;
+			}
+			case 'RAW':
+			case 'RAW2': { // RAW MODE
+				// remove spaces
+				$code = preg_replace('/[\s]*/si', '', $code);
+				if (strlen($code) < 3) {
+					break;
+				}
+				if ($qrtype == 'RAW') {
+					// comma-separated rows
+					$rows = explode(',', $code);
+				} else { // RAW2
+					// rows enclosed in square parentheses
+					$code = substr($code, 1, -1);
+					$rows = explode('][', $code);
+				}
+				$this->barcode_array['num_rows'] = count($rows);
+				$this->barcode_array['num_cols'] = strlen($rows[0]);
+				$this->barcode_array['bcode'] = array();
+				foreach ($rows as $r) {
+					$this->barcode_array['bcode'][] = str_split($r, 1);
+				}
+				$this->barcode_array['code'] = $code;
+				break;
+			}
+			case 'TEST': { // TEST MODE
+				$this->barcode_array['num_rows'] = 5;
+				$this->barcode_array['num_cols'] = 15;
+				$this->barcode_array['bcode'] = array(
+					array(1,1,1,0,1,1,1,0,1,1,1,0,1,1,1),
+					array(0,1,0,0,1,0,0,0,1,0,0,0,0,1,0),
+					array(0,1,0,0,1,1,0,0,1,1,1,0,0,1,0),
+					array(0,1,0,0,1,0,0,0,0,0,1,0,0,1,0),
+					array(0,1,0,0,1,1,1,0,1,1,1,0,0,1,0));
+				$this->barcode_array['code'] = $code;
+				break;
+			}
+			default: {
+				$this->barcode_array = false;
+			}
+		}
+	}
+} // end of class
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/tcpdf_import.php b/htmltest/sites/all/libraries/tcpdf-version/tcpdf_import.php
new file mode 100644
index 00000000..09d726ba
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/tcpdf_import.php
@@ -0,0 +1,104 @@
+<?php
+//============================================================+
+// File name   : tcpdf_import.php
+// Version     : 1.0.001
+// Begin       : 2011-05-23
+// Last Update : 2013-09-17
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2011-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 License
+// along with TCPDF. If not, see
+// <http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : This is a PHP class extension of the TCPDF library to
+//               import existing PDF documents.
+//
+//============================================================+
+
+/**
+ * @file
+ * !!! THIS CLASS IS UNDER DEVELOPMENT !!!
+ * This is a PHP class extension of the TCPDF (http://www.tcpdf.org) library to import existing PDF documents.<br>
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.001
+ */
+
+// include the TCPDF class
+require_once(dirname(__FILE__).'/tcpdf.php');
+// include PDF parser class
+require_once(dirname(__FILE__).'/tcpdf_parser.php');
+
+/**
+ * @class TCPDF_IMPORT
+ * !!! THIS CLASS IS UNDER DEVELOPMENT !!!
+ * PHP class extension of the TCPDF (http://www.tcpdf.org) library to import existing PDF documents.<br>
+ * @package com.tecnick.tcpdf
+ * @brief PHP class extension of the TCPDF library to import existing PDF documents.
+ * @version 1.0.001
+ * @author Nicola Asuni - info@tecnick.com
+ */
+class TCPDF_IMPORT extends TCPDF {
+
+	/**
+	 * Import an existing PDF document
+	 * @param $filename (string) Filename of the PDF document to import.
+	 * @return true in case of success, false otherwise
+	 * @public
+	 * @since 1.0.000 (2011-05-24)
+	 */
+	public function importPDF($filename) {
+		// load document
+		$rawdata = file_get_contents($filename);
+		if ($rawdata === false) {
+			$this->Error('Unable to get the content of the file: '.$filename);
+		}
+		// configuration parameters for parser
+		$cfg = array(
+			'die_for_errors' => false,
+			'ignore_filter_decoding_errors' => true,
+			'ignore_missing_filter_decoders' => true,
+		);
+		try {
+			// parse PDF data
+			$pdf = new TCPDF_PARSER($rawdata, $cfg);
+		} catch (Exception $e) {
+			die($e->getMessage());
+		}
+		// get the parsed data
+		$data = $pdf->getParsedData();
+		// release some memory
+		unset($rawdata);
+
+		// ...
+
+
+		print_r($data); // DEBUG
+
+
+		unset($pdf);
+	}
+
+} // END OF CLASS
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/tcpdf_parser.php b/htmltest/sites/all/libraries/tcpdf-version/tcpdf_parser.php
new file mode 100644
index 00000000..666cb32e
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/tcpdf_parser.php
@@ -0,0 +1,796 @@
+<?php
+//============================================================+
+// File name   : tcpdf_parser.php
+// Version     : 1.0.010
+// Begin       : 2011-05-23
+// Last Update : 2013-09-25
+// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+// License     : http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT GNU-LGPLv3
+// -------------------------------------------------------------------
+// Copyright (C) 2011-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 License
+// along with TCPDF. If not, see
+// <http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : This is a PHP class for parsing PDF documents.
+//
+//============================================================+
+
+/**
+ * @file
+ * This is a PHP class for parsing PDF documents.<br>
+ * @package com.tecnick.tcpdf
+ * @author Nicola Asuni
+ * @version 1.0.010
+ */
+
+// include class for decoding filters
+require_once(dirname(__FILE__).'/include/tcpdf_filters.php');
+
+/**
+ * @class TCPDF_PARSER
+ * This is a PHP class for parsing PDF documents.<br>
+ * @package com.tecnick.tcpdf
+ * @brief This is a PHP class for parsing PDF documents..
+ * @version 1.0.010
+ * @author Nicola Asuni - info@tecnick.com
+ */
+class TCPDF_PARSER {
+
+	/**
+	 * Raw content of the PDF document.
+	 * @private
+	 */
+	private $pdfdata = '';
+
+	/**
+	 * XREF data.
+	 * @protected
+	 */
+	protected $xref = array();
+
+	/**
+	 * Array of PDF objects.
+	 * @protected
+	 */
+	protected $objects = array();
+
+	/**
+	 * Class object for decoding filters.
+	 * @private
+	 */
+	private $FilterDecoders;
+
+	/**
+	 * Array of configuration parameters.
+	 * @private
+	 */
+	private $cfg = array(
+		'die_for_errors' => false,
+		'ignore_filter_decoding_errors' => true,
+		'ignore_missing_filter_decoders' => true,
+	);
+
+// -----------------------------------------------------------------------------
+
+	/**
+	 * Parse a PDF document an return an array of objects.
+	 * @param $data (string) PDF data to parse.
+	 * @param $cfg (array) Array of configuration parameters:
+	 * 			'die_for_errors' : if true termitate the program execution in case of error, otherwise thows an exception;
+	 * 			'ignore_filter_decoding_errors' : if true ignore filter decoding errors;
+	 * 			'ignore_missing_filter_decoders' : if true ignore missing filter decoding errors.
+	 * @public
+	 * @since 1.0.000 (2011-05-24)
+	 */
+	public function __construct($data, $cfg=array()) {
+		if (empty($data)) {
+			$this->Error('Empty PDF data.');
+		}
+		// set configuration parameters
+		$this->setConfig($cfg);
+		// get PDF content string
+		$this->pdfdata = $data;
+		// get length
+		$pdflen = strlen($this->pdfdata);
+		// get xref and trailer data
+		$this->xref = $this->getXrefData();
+		// parse all document objects
+		$this->objects = array();
+		foreach ($this->xref['xref'] as $obj => $offset) {
+			if (!isset($this->objects[$obj]) AND ($offset > 0)) {
+				// decode objects with positive offset
+				$this->objects[$obj] = $this->getIndirectObject($obj, $offset, true);
+			}
+		}
+		// release some memory
+		unset($this->pdfdata);
+		$this->pdfdata = '';
+	}
+
+	/**
+	 * Set the configuration parameters.
+	 * @param $cfg (array) Array of configuration parameters:
+	 * 			'die_for_errors' : if true termitate the program execution in case of error, otherwise thows an exception;
+	 * 			'ignore_filter_decoding_errors' : if true ignore filter decoding errors;
+	 * 			'ignore_missing_filter_decoders' : if true ignore missing filter decoding errors.
+	 * @public
+	 */
+	protected function setConfig($cfg) {
+		if (isset($cfg['die_for_errors'])) {
+			$this->cfg['die_for_errors'] = !!$cfg['die_for_errors'];
+		}
+		if (isset($cfg['ignore_filter_decoding_errors'])) {
+			$this->cfg['ignore_filter_decoding_errors'] = !!$cfg['ignore_filter_decoding_errors'];
+		}
+		if (isset($cfg['ignore_missing_filter_decoders'])) {
+			$this->cfg['ignore_missing_filter_decoders'] = !!$cfg['ignore_missing_filter_decoders'];
+		}
+	}
+
+	/**
+	 * Return an array of parsed PDF document objects.
+	 * @return (array) Array of parsed PDF document objects.
+	 * @public
+	 * @since 1.0.000 (2011-06-26)
+	 */
+	public function getParsedData() {
+		return array($this->xref, $this->objects);
+	}
+
+	/**
+	 * Get Cross-Reference (xref) table and trailer data from PDF document data.
+	 * @param $offset (int) xref offset (if know).
+	 * @param $xref (array) previous xref array (if any).
+	 * @return Array containing xref and trailer data.
+	 * @protected
+	 * @since 1.0.000 (2011-05-24)
+	 */
+	protected function getXrefData($offset=0, $xref=array()) {
+		if ($offset == 0) {
+			// find last startxref
+			if (preg_match_all('/[\r\n]startxref[\s]*[\r\n]+([0-9]+)[\s]*[\r\n]+%%EOF/i', $this->pdfdata, $matches, PREG_SET_ORDER, $offset) == 0) {
+				$this->Error('Unable to find startxref');
+			}
+			$matches = array_pop($matches);
+			$startxref = $matches[1];
+		} elseif (strpos($this->pdfdata, 'xref', $offset) == $offset) {
+			// Already pointing at the xref table
+			$startxref = $offset;
+		} elseif (preg_match('/([0-9]+[\s][0-9]+[\s]obj)/i', $this->pdfdata, $matches, PREG_OFFSET_CAPTURE, $offset)) {
+			// Cross-Reference Stream object
+			$startxref = $offset;
+		} elseif (preg_match('/[\r\n]startxref[\s]*[\r\n]+([0-9]+)[\s]*[\r\n]+%%EOF/i', $this->pdfdata, $matches, PREG_OFFSET_CAPTURE, $offset)) {
+			// startxref found
+			$startxref = $matches[1][0];
+		} else {
+			$this->Error('Unable to find startxref');
+		}
+		// check xref position
+		if (strpos($this->pdfdata, 'xref', $startxref) == $startxref) {
+			// Cross-Reference
+			$xref = $this->decodeXref($startxref, $xref);
+		} else {
+			// Cross-Reference Stream
+			$xref = $this->decodeXrefStream($startxref, $xref);
+		}
+		if (empty($xref)) {
+			$this->Error('Unable to find xref');
+		}
+		return $xref;
+	}
+
+	/**
+	 * Decode the Cross-Reference section
+	 * @param $startxref (int) Offset at which the xref section starts (position of the 'xref' keyword).
+	 * @param $xref (array) Previous xref array (if any).
+	 * @return Array containing xref and trailer data.
+	 * @protected
+	 * @since 1.0.000 (2011-06-20)
+	 */
+	protected function decodeXref($startxref, $xref=array()) {
+		$startxref += 4; // 4 is the lenght of the word 'xref'
+		// skip initial white space chars: \x00 null (NUL), \x09 horizontal tab (HT), \x0A line feed (LF), \x0C form feed (FF), \x0D carriage return (CR), \x20 space (SP)
+		$offset = $startxref + strspn($this->pdfdata, "\x00\x09\x0a\x0c\x0d\x20", $startxref);
+		// initialize object number
+		$obj_num = 0;
+		// search for cross-reference entries or subsection
+		while (preg_match('/([0-9]+)[\x20]([0-9]+)[\x20]?([nf]?)(\r\n|[\x20]?[\r\n])/', $this->pdfdata, $matches, PREG_OFFSET_CAPTURE, $offset) > 0) {
+			if ($matches[0][1] != $offset) {
+				// we are on another section
+				break;
+			}
+			$offset += strlen($matches[0][0]);
+			if ($matches[3][0] == 'n') {
+				// create unique object index: [object number]_[generation number]
+				$index = $obj_num.'_'.intval($matches[2][0]);
+				// check if object already exist
+				if (!isset($xref['xref'][$index])) {
+					// store object offset position
+					$xref['xref'][$index] = intval($matches[1][0]);
+				}
+				++$obj_num;
+			} elseif ($matches[3][0] == 'f') {
+				++$obj_num;
+			} else {
+				// object number (index)
+				$obj_num = intval($matches[1][0]);
+			}
+		}
+		// get trailer data
+		if (preg_match('/trailer[\s]*<<(.*)>>[\s]*[\r\n]+startxref[\s]*[\r\n]+/isU', $this->pdfdata, $matches, PREG_OFFSET_CAPTURE, $offset) > 0) {
+			$trailer_data = $matches[1][0];
+			if (!isset($xref['trailer']) OR empty($xref['trailer'])) {
+				// get only the last updated version
+				$xref['trailer'] = array();
+				// parse trailer_data
+				if (preg_match('/Size[\s]+([0-9]+)/i', $trailer_data, $matches) > 0) {
+					$xref['trailer']['size'] = intval($matches[1]);
+				}
+				if (preg_match('/Root[\s]+([0-9]+)[\s]+([0-9]+)[\s]+R/i', $trailer_data, $matches) > 0) {
+					$xref['trailer']['root'] = intval($matches[1]).'_'.intval($matches[2]);
+				}
+				if (preg_match('/Encrypt[\s]+([0-9]+)[\s]+([0-9]+)[\s]+R/i', $trailer_data, $matches) > 0) {
+					$xref['trailer']['encrypt'] = intval($matches[1]).'_'.intval($matches[2]);
+				}
+				if (preg_match('/Info[\s]+([0-9]+)[\s]+([0-9]+)[\s]+R/i', $trailer_data, $matches) > 0) {
+					$xref['trailer']['info'] = intval($matches[1]).'_'.intval($matches[2]);
+				}
+				if (preg_match('/ID[\s]*[\[][\s]*[<]([^>]*)[>][\s]*[<]([^>]*)[>]/i', $trailer_data, $matches) > 0) {
+					$xref['trailer']['id'] = array();
+					$xref['trailer']['id'][0] = $matches[1];
+					$xref['trailer']['id'][1] = $matches[2];
+				}
+			}
+			if (preg_match('/Prev[\s]+([0-9]+)/i', $trailer_data, $matches) > 0) {
+				// get previous xref
+				$xref = $this->getXrefData(intval($matches[1]), $xref);
+			}
+		} else {
+			$this->Error('Unable to find trailer');
+		}
+		return $xref;
+	}
+
+	/**
+	 * Decode the Cross-Reference Stream section
+	 * @param $startxref (int) Offset at which the xref section starts.
+	 * @param $xref (array) Previous xref array (if any).
+	 * @return Array containing xref and trailer data.
+	 * @protected
+	 * @since 1.0.003 (2013-03-16)
+	 */
+	protected function decodeXrefStream($startxref, $xref=array()) {
+		// try to read Cross-Reference Stream
+		$xrefobj = $this->getRawObject($startxref);
+		$xrefcrs = $this->getIndirectObject($xrefobj[1], $startxref, true);
+		if (!isset($xref['trailer']) OR empty($xref['trailer'])) {
+			// get only the last updated version
+			$xref['trailer'] = array();
+			$filltrailer = true;
+		} else {
+			$filltrailer = false;
+		}
+		$valid_crs = false;
+		$sarr = $xrefcrs[0][1];
+		foreach ($sarr as $k => $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;
+			} elseif (($v[0] == '/') AND ($v[1] == 'Index') AND (isset($sarr[($k +1)]))) {
+				// first object number in the subsection
+				$index_first = intval($sarr[($k +1)][1][0][1]);
+				// number of entries in the subsection
+				$index_entries = intval($sarr[($k +1)][1][1][1]);
+			} elseif (($v[0] == '/') AND ($v[1] == 'Prev') AND (isset($sarr[($k +1)]) AND ($sarr[($k +1)][0] == 'numeric'))) {
+				// get previous xref offset
+				$prevxref = intval($sarr[($k +1)][1]);
+			} elseif (($v[0] == '/') AND ($v[1] == 'W') AND (isset($sarr[($k +1)]))) {
+				// number of bytes (in the decoded stream) of the corresponding field
+				$wb = array();
+				$wb[0] = intval($sarr[($k +1)][1][0][1]);
+				$wb[1] = intval($sarr[($k +1)][1][1][1]);
+				$wb[2] = intval($sarr[($k +1)][1][2][1]);
+			} elseif (($v[0] == '/') AND ($v[1] == 'DecodeParms') AND (isset($sarr[($k +1)][1]))) {
+				$decpar = $sarr[($k +1)][1];
+				foreach ($decpar as $kdc => $vdc) {
+					if (($vdc[0] == '/') AND ($vdc[1] == 'Columns') AND (isset($decpar[($kdc +1)]) AND ($decpar[($kdc +1)][0] == 'numeric'))) {
+						$columns = intval($decpar[($kdc +1)][1]);
+					} elseif (($vdc[0] == '/') AND ($vdc[1] == 'Predictor') AND (isset($decpar[($kdc +1)]) AND ($decpar[($kdc +1)][0] == 'numeric'))) {
+						$predictor = intval($decpar[($kdc +1)][1]);
+					}
+				}
+			} elseif ($filltrailer) {
+				if (($v[0] == '/') AND ($v[1] == 'Size') AND (isset($sarr[($k +1)]) AND ($sarr[($k +1)][0] == 'numeric'))) {
+					$xref['trailer']['size'] = $sarr[($k +1)][1];
+				} elseif (($v[0] == '/') AND ($v[1] == 'Root') AND (isset($sarr[($k +1)]) AND ($sarr[($k +1)][0] == 'ojbref'))) {
+					$xref['trailer']['root'] = $sarr[($k +1)][1];
+				} elseif (($v[0] == '/') AND ($v[1] == 'Info') AND (isset($sarr[($k +1)]) AND ($sarr[($k +1)][0] == 'ojbref'))) {
+					$xref['trailer']['info'] = $sarr[($k +1)][1];
+				} elseif (($v[0] == '/') AND ($v[1] == 'ID') AND (isset($sarr[($k +1)]))) {
+					$xref['trailer']['id'] = array();
+					$xref['trailer']['id'][0] = $sarr[($k +1)][1][0][1];
+					$xref['trailer']['id'][1] = $sarr[($k +1)][1][1][1];
+				}
+			}
+		}
+		// decode data
+		if ($valid_crs AND isset($xrefcrs[1][3][0])) {
+			// number of bytes in a row
+			$rowlen = ($columns + 1);
+			// convert the stream into an array of integers
+			$sdata = unpack('C*', $xrefcrs[1][3][0]);
+			// split the rows
+			$sdata = array_chunk($sdata, $rowlen);
+			// initialize decoded array
+			$ddata = array();
+			// initialize first row with zeros
+			$prev_row = array_fill (0, $rowlen, 0);
+			// for each row apply PNG unpredictor
+			foreach ($sdata as $k => $row) {
+				// initialize new row
+				$ddata[$k] = array();
+				// get PNG predictor value
+				$predictor = (10 + $row[0]);
+				// for each byte on the row
+				for ($i=1; $i<=$columns; ++$i) {
+					// new index
+					$j = ($i - 1);
+					$row_up = $prev_row[$j];
+					if ($i == 1) {
+						$row_left = 0;
+						$row_upleft = 0;
+					} else {
+						$row_left = $row[($i - 1)];
+						$row_upleft = $prev_row[($j - 1)];
+					}
+					switch ($predictor) {
+						case 10: { // PNG prediction (on encoding, PNG None on all rows)
+							$ddata[$k][$j] = $row[$i];
+							break;
+						}
+						case 11: { // PNG prediction (on encoding, PNG Sub on all rows)
+							$ddata[$k][$j] = (($row[$i] + $row_left) & 0xff);
+							break;
+						}
+						case 12: { // PNG prediction (on encoding, PNG Up on all rows)
+							$ddata[$k][$j] = (($row[$i] + $row_up) & 0xff);
+							break;
+						}
+						case 13: { // PNG prediction (on encoding, PNG Average on all rows)
+							$ddata[$k][$j] = (($row[$i] + (($row_left + $row_up) / 2)) & 0xff);
+							break;
+						}
+						case 14: { // PNG prediction (on encoding, PNG Paeth on all rows)
+							// initial estimate
+							$p = ($row_left + $row_up - $row_upleft);
+							// distances
+							$pa = abs($p - $row_left);
+							$pb = abs($p - $row_up);
+							$pc = abs($p - $row_upleft);
+							$pmin = min($pa, $pb, $pc);
+							// return minumum distance
+							switch ($pmin) {
+								case $pa: {
+									$ddata[$k][$j] = (($row[$i] + $row_left) & 0xff);
+									break;
+								}
+								case $pb: {
+									$ddata[$k][$j] = (($row[$i] + $row_up) & 0xff);
+									break;
+								}
+								case $pc: {
+									$ddata[$k][$j] = (($row[$i] + $row_upleft) & 0xff);
+									break;
+								}
+							}
+							break;
+						}
+						default: { // PNG prediction (on encoding, PNG optimum)
+							$this->Error('Unknown PNG predictor');
+							break;
+						}
+					}
+				}
+				$prev_row = $ddata[$k];
+			} // end for each row
+			// complete decoding
+			$sdata = array();
+			// for every row
+			foreach ($ddata as $k => $row) {
+				// initialize new row
+				$sdata[$k] = array(0, 0, 0);
+				if ($wb[0] == 0) {
+					// default type field
+					$sdata[$k][0] = 1;
+				}
+				$i = 0; // count bytes on the row
+				// for every column
+				for ($c = 0; $c < 3; ++$c) {
+					// for every byte on the column
+					for ($b = 0; $b < $wb[$c]; ++$b) {
+						$sdata[$k][$c] += ($row[$i] << (($wb[$c] - 1 - $b) * 8));
+						++$i;
+					}
+				}
+			}
+			$ddata = array();
+			// fill xref
+			if (isset($index_first)) {
+				$obj_num = $index_first;
+			} else {
+				$obj_num = 0;
+			}
+			foreach ($sdata as $k => $row) {
+				switch ($row[0]) {
+					case 0: { // (f) linked list of free objects
+						++$obj_num;
+						break;
+					}
+					case 1: { // (n) objects that are in use but are not compressed
+						// create unique object index: [object number]_[generation number]
+						$index = $obj_num.'_'.$row[2];
+						// check if object already exist
+						if (!isset($xref['xref'][$index])) {
+							// store object offset position
+							$xref['xref'][$index] = $row[1];
+						}
+						++$obj_num;
+						break;
+					}
+					case 2: { // compressed objects
+						// $row[1] = object number of the object stream in which this object is stored
+						// $row[2] = index of this object within the object stream
+						$index = $row[1].'_0_'.$row[2];
+						$xref['xref'][$index] = -1;
+						break;
+					}
+					default: { // null objects
+						break;
+					}
+				}
+			}
+		} // end decoding data
+		if (isset($prevxref)) {
+			// get previous xref
+			$xref = $this->getXrefData($prevxref, $xref);
+		}
+		return $xref;
+	}
+
+	/**
+	 * Get object type, raw value and offset to next object
+	 * @param $offset (int) Object offset.
+	 * @return array containing object type, raw value and offset to next object
+	 * @protected
+	 * @since 1.0.000 (2011-06-20)
+	 */
+	protected function getRawObject($offset=0) {
+		$objtype = ''; // object type to be returned
+		$objval = ''; // object value to be returned
+		// skip initial white space chars: \x00 null (NUL), \x09 horizontal tab (HT), \x0A line feed (LF), \x0C form feed (FF), \x0D carriage return (CR), \x20 space (SP)
+		$offset += strspn($this->pdfdata, "\x00\x09\x0a\x0c\x0d\x20", $offset);
+		// get first char
+		$char = $this->pdfdata[$offset];
+		// get object type
+		switch ($char) {
+			case '%': { // \x25 PERCENT SIGN
+				// skip comment and search for next token
+				$next = strcspn($this->pdfdata, "\r\n", $offset);
+				if ($next > 0) {
+					$offset += $next;
+					return $this->getRawObject($this->pdfdata, $offset);
+				}
+				break;
+			}
+			case '/': { // \x2F SOLIDUS
+				// name object
+				$objtype = $char;
+				++$offset;
+				if (preg_match('/^([^\x00\x09\x0a\x0c\x0d\x20\s\x28\x29\x3c\x3e\x5b\x5d\x7b\x7d\x2f\x25]+)/', substr($this->pdfdata, $offset, 256), $matches) == 1) {
+					$objval = $matches[1]; // unescaped value
+					$offset += strlen($objval);
+				}
+				break;
+			}
+			case '(':   // \x28 LEFT PARENTHESIS
+			case ')': { // \x29 RIGHT PARENTHESIS
+				// literal string object
+				$objtype = $char;
+				++$offset;
+				$strpos = $offset;
+				if ($char == '(') {
+					$open_bracket = 1;
+					while ($open_bracket > 0) {
+						if (!isset($this->pdfdata{$strpos})) {
+							break;
+						}
+						$ch = $this->pdfdata{$strpos};
+						switch ($ch) {
+							case '\\': { // REVERSE SOLIDUS (5Ch) (Backslash)
+								// skip next character
+								++$strpos;
+								break;
+							}
+							case '(': { // LEFT PARENHESIS (28h)
+								++$open_bracket;
+								break;
+							}
+							case ')': { // RIGHT PARENTHESIS (29h)
+								--$open_bracket;
+								break;
+							}
+						}
+						++$strpos;
+					}
+					$objval = substr($this->pdfdata, $offset, ($strpos - $offset - 1));
+					$offset = $strpos;
+				}
+				break;
+			}
+			case '[':   // \x5B LEFT SQUARE BRACKET
+			case ']': { // \x5D RIGHT SQUARE BRACKET
+				// array object
+				$objtype = $char;
+				++$offset;
+				if ($char == '[') {
+					// get array content
+					$objval = array();
+					do {
+						// get element
+						$element = $this->getRawObject($offset);
+						$offset = $element[2];
+						$objval[] = $element;
+					} while ($element[0] != ']');
+					// remove closing delimiter
+					array_pop($objval);
+				}
+				break;
+			}
+			case '<':   // \x3C LESS-THAN SIGN
+			case '>': { // \x3E GREATER-THAN SIGN
+				if (isset($this->pdfdata{($offset + 1)}) AND ($this->pdfdata{($offset + 1)} == $char)) {
+					// dictionary object
+					$objtype = $char.$char;
+					$offset += 2;
+					if ($char == '<') {
+						// get array content
+						$objval = array();
+						do {
+							// get element
+							$element = $this->getRawObject($offset);
+							$offset = $element[2];
+							$objval[] = $element;
+						} while ($element[0] != '>>');
+						// remove closing delimiter
+						array_pop($objval);
+					}
+				} else {
+					// hexadecimal string object
+					$objtype = $char;
+					++$offset;
+					if (($char == '<') AND (preg_match('/^([0-9A-Fa-f\x09\x0a\x0c\x0d\x20]+)>/iU', substr($this->pdfdata, $offset), $matches) == 1)) {
+						// remove white space characters
+						$objval = strtr($matches[1], "\x09\x0a\x0c\x0d\x20", '');
+						$offset += strlen($matches[0]);
+					}
+				}
+				break;
+			}
+			default: {
+				if (substr($this->pdfdata, $offset, 6) == 'endobj') {
+					// indirect object
+					$objtype = 'endobj';
+					$offset += 6;
+				} elseif (substr($this->pdfdata, $offset, 4) == 'null') {
+					// null object
+					$objtype = 'null';
+					$offset += 4;
+					$objval = 'null';
+				} elseif (substr($this->pdfdata, $offset, 4) == 'true') {
+					// boolean true object
+					$objtype = 'boolean';
+					$offset += 4;
+					$objval = 'true';
+				} elseif (substr($this->pdfdata, $offset, 5) == 'false') {
+					// boolean false object
+					$objtype = 'boolean';
+					$offset += 5;
+					$objval = 'false';
+				} elseif (substr($this->pdfdata, $offset, 6) == 'stream') {
+					// start stream object
+					$objtype = 'stream';
+					$offset += 6;
+					if (preg_match('/^([\r]?[\n])/isU', substr($this->pdfdata, $offset), $matches) == 1) {
+						$offset += strlen($matches[0]);
+						if (preg_match('/([\r]?[\n])?(endstream)[\x09\x0a\x0c\x0d\x20]/isU', substr($this->pdfdata, $offset), $matches, PREG_OFFSET_CAPTURE) == 1) {
+							$objval = substr($this->pdfdata, $offset, $matches[0][1]);
+							$offset += $matches[2][1];
+						}
+					}
+				} elseif (substr($this->pdfdata, $offset, 9) == 'endstream') {
+					// end stream object
+					$objtype = 'endstream';
+					$offset += 9;
+				} elseif (preg_match('/^([0-9]+)[\s]+([0-9]+)[\s]+R/iU', substr($this->pdfdata, $offset, 33), $matches) == 1) {
+					// indirect object reference
+					$objtype = 'ojbref';
+					$offset += strlen($matches[0]);
+					$objval = intval($matches[1]).'_'.intval($matches[2]);
+				} elseif (preg_match('/^([0-9]+)[\s]+([0-9]+)[\s]+obj/iU', substr($this->pdfdata, $offset, 33), $matches) == 1) {
+					// object start
+					$objtype = 'ojb';
+					$objval = intval($matches[1]).'_'.intval($matches[2]);
+					$offset += strlen ($matches[0]);
+				} elseif (($numlen = strspn($this->pdfdata, '+-.0123456789', $offset)) > 0) {
+					// numeric object
+					$objtype = 'numeric';
+					$objval = substr($this->pdfdata, $offset, $numlen);
+					$offset += $numlen;
+				}
+				break;
+			}
+		}
+		return array($objtype, $objval, $offset);
+	}
+
+	/**
+	 * Get content of indirect object.
+	 * @param $obj_ref (string) Object number and generation number separated by underscore character.
+	 * @param $offset (int) Object offset.
+	 * @param $decoding (boolean) If true decode streams.
+	 * @return array containing object data.
+	 * @protected
+	 * @since 1.0.000 (2011-05-24)
+	 */
+	protected function getIndirectObject($obj_ref, $offset=0, $decoding=true) {
+		$obj = explode('_', $obj_ref);
+		if (($obj === false) OR (count($obj) != 2)) {
+			$this->Error('Invalid object reference: '.$obj);
+			return;
+		}
+		$objref = $obj[0].' '.$obj[1].' obj';
+		if (strpos($this->pdfdata, $objref, $offset) != $offset) {
+			// an indirect reference to an undefined object shall be considered a reference to the null object
+			return array('null', 'null', $offset);
+		}
+		// starting position of object content
+		$offset += strlen($objref);
+		// get array of object content
+		$objdata = array();
+		$i = 0; // object main index
+		do {
+			// get element
+			$element = $this->getRawObject($offset);
+			$offset = $element[2];
+			// decode stream using stream's dictionary information
+			if ($decoding AND ($element[0] == 'stream') AND (isset($objdata[($i - 1)][0])) AND ($objdata[($i - 1)][0] == '<<')) {
+				$element[3] = $this->decodeStream($objdata[($i - 1)][1], $element[1]);
+			}
+			$objdata[$i] = $element;
+			++$i;
+		} while ($element[0] != 'endobj');
+		// remove closing delimiter
+		array_pop($objdata);
+		// return raw object content
+		return $objdata;
+	}
+
+	/**
+	 * Get the content of object, resolving indect object reference if necessary.
+	 * @param $obj (string) Object value.
+	 * @return array containing object data.
+	 * @protected
+	 * @since 1.0.000 (2011-06-26)
+	 */
+	protected function getObjectVal($obj) {
+		if ($obj[0] == 'objref') {
+			// reference to indirect object
+			if (isset($this->objects[$obj[1]])) {
+				// this object has been already parsed
+				return $this->objects[$obj[1]];
+			} elseif (isset($this->xref[$obj[1]])) {
+				// parse new object
+				$this->objects[$obj[1]] = $this->getIndirectObject($obj[1], $this->xref[$obj[1]], false);
+				return $this->objects[$obj[1]];
+			}
+		}
+		return $obj;
+	}
+
+	/**
+	 * Decode the specified stream.
+	 * @param $sdic (array) Stream's dictionary array.
+	 * @param $stream (string) Stream to decode.
+	 * @return array containing decoded stream data and remaining filters.
+	 * @protected
+	 * @since 1.0.000 (2011-06-22)
+	 */
+	protected function decodeStream($sdic, $stream) {
+		// get stream lenght and filters
+		$slength = strlen($stream);
+		if ($slength <= 0) {
+			return array('', array());
+		}
+		$filters = array();
+		foreach ($sdic as $k => $v) {
+			if ($v[0] == '/') {
+				if (($v[1] == 'Length') AND (isset($sdic[($k + 1)])) AND ($sdic[($k + 1)][0] == 'numeric')) {
+					// get declared stream lenght
+					$declength = intval($sdic[($k + 1)][1]);
+					if ($declength < $slength) {
+						$stream = substr($stream, 0, $declength);
+						$slength = $declength;
+					}
+				} elseif (($v[1] == 'Filter') AND (isset($sdic[($k + 1)]))) {
+					// resolve indirect object
+					$objval = $this->getObjectVal($sdic[($k + 1)]);
+					if ($objval[0] == '/') {
+						// single filter
+						$filters[] = $objval[1];
+					} elseif ($objval[0] == '[') {
+						// array of filters
+						foreach ($objval[1] as $flt) {
+							if ($flt[0] == '/') {
+								$filters[] = $flt[1];
+							}
+						}
+					}
+				}
+			}
+		}
+		// decode the stream
+		$remaining_filters = array();
+		foreach ($filters as $filter) {
+			if (in_array($filter, TCPDF_FILTERS::getAvailableFilters())) {
+				try {
+					$stream = TCPDF_FILTERS::decodeFilter($filter, $stream);
+				} catch (Exception $e) {
+					$emsg = $e->getMessage();
+					if ((($emsg[0] == '~') AND !$this->cfg['ignore_missing_filter_decoders'])
+						OR (($emsg[0] != '~') AND !$this->cfg['ignore_filter_decoding_errors'])) {
+						$this->Error($e->getMessage());
+					}
+				}
+			} else {
+				// add missing filter to array
+				$remaining_filters[] = $filter;
+			}
+		}
+		return array($stream, $remaining_filters);
+	}
+
+	/**
+	 * Throw an exception or print an error message and die if the K_TCPDF_PARSER_THROW_EXCEPTION_ERROR constant is set to true.
+	 * @param $msg (string) The error message
+	 * @public
+	 * @since 1.0.000 (2011-05-23)
+	 */
+	public function Error($msg) {
+		if ($this->cfg['die_for_errors']) {
+			die('<strong>TCPDF_PARSER ERROR: </strong>'.$msg);
+		} else {
+			throw new Exception('TCPDF_PARSER ERROR: '.$msg);
+		}
+	}
+
+} // END OF TCPDF_PARSER CLASS
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/libraries/tcpdf-version/tools/tcpdf_addfont.php b/htmltest/sites/all/libraries/tcpdf-version/tools/tcpdf_addfont.php
new file mode 100644
index 00000000..c0b258ec
--- /dev/null
+++ b/htmltest/sites/all/libraries/tcpdf-version/tools/tcpdf_addfont.php
@@ -0,0 +1,269 @@
+#!/usr/bin/php -q
+<?php
+//============================================================+
+// File name   : tcpdf_addfont.php
+// Version     : 1.0.002
+// Begin       : 2013-05-13
+// Last Update : 2013-08-05
+// Authors     : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
+//               Remi Collet
+// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
+// -------------------------------------------------------------------
+// Copyright (C) 2011-2013 Nicola Asuni - Tecnick.com LTD
+//
+// This file is part of TCPDF software library.
+//
+// TCPDF 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 3 of the
+// License, or (at your option) any later version.
+//
+// TCPDF 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 License
+// along with TCPDF. If not, see
+// <http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>.
+//
+// See LICENSE.TXT file for more information.
+// -------------------------------------------------------------------
+//
+// Description : This is a command line script to generate TCPDF fonts.
+//
+//============================================================+
+
+/**
+ * @file
+ * This is a command line script to generate TCPDF fonts.<br>
+ * @package com.tecnick.tcpdf
+ * @version 1.0.000
+ */
+
+if (php_sapi_name() != 'cli') {
+  echo 'You need to run this command from console.';
+  exit(1);
+}
+
+$tcpdf_include_dirs = array(realpath(dirname(__FILE__).'/../tcpdf.php'), '/usr/share/php/tcpdf/tcpdf.php', '/usr/share/tcpdf/tcpdf.php', '/usr/share/php-tcpdf/tcpdf.php', '/var/www/tcpdf/tcpdf.php', '/var/www/html/tcpdf/tcpdf.php', '/usr/local/apache2/htdocs/tcpdf/tcpdf.php');
+foreach ($tcpdf_include_dirs as $tcpdf_include_path) {
+	if (@file_exists($tcpdf_include_path)) {
+		require_once($tcpdf_include_path);
+		break;
+	}
+}
+
+/**
+ * Display help guide for this command.
+ */
+function showHelp() {
+	$help = <<<EOD
+tcpdf_addfont - command line tool to convert fonts for the TCPDF library.
+
+Usage: tcpdf_addfont.php [ options ] -i fontfile[,fontfile]...
+
+Options:
+
+	-t
+	--type      Font type. Leave empty for autodetect mode.
+	            Valid values are:
+					TrueTypeUnicode
+					TrueType
+					Type1
+					CID0JP = CID-0 Japanese
+					CID0KR = CID-0 Korean
+					CID0CS = CID-0 Chinese Simplified
+					CID0CT = CID-0 Chinese Traditional
+
+	-e
+	--enc       Name of the encoding table to use. Leave empty for
+	            default mode. Omit this parameter for TrueType Unicode
+	            and symbolic fonts like Symbol or ZapfDingBats.
+
+	-f
+	--flags     Unsigned 32-bit integer containing flags specifying
+	            various characteristics of the font (PDF32000:2008 -
+	            9.8.2 Font Descriptor Flags): +1 for fixed font; +4 for
+	            symbol or +32 for non-symbol; +64 for italic. Fixed and
+	            Italic mode are generally autodetected so you have to
+	            set it to 32 = non-symbolic font (default) or 4 =
+	            symbolic font.
+
+	-o
+	--outpath   Output path for generated font files (must be writeable
+	            by the web server). Leave empty for default font folder.
+
+	-p
+	--platid    Platform ID for CMAP table to extract (when building a
+	            Unicode font for Windows this value should be 3, for
+	            Macintosh should be 1).
+
+	-n
+	--encid     Encoding ID for CMAP table to extract (when building a
+	            Unicode font for Windows this value should be 1, for
+	            Macintosh should be 0). When Platform ID is 3, legal
+	            values for Encoding ID are: 0=Symbol, 1=Unicode,
+	            2=ShiftJIS, 3=PRC, 4=Big5, 5=Wansung, 6=Johab,
+	            7=Reserved, 8=Reserved, 9=Reserved, 10=UCS-4.
+
+	-b
+	--addcbbox  Includes the character bounding box information on the
+	            php font file.
+
+	-l
+	--link      Link to system font instead of copying the font data #
+	            (not transportable) - Note: do not work with Type1 fonts.
+
+	-i
+	--fonts     Comma-separated list of input font files.
+
+	-h
+	--help      Display this help and exit.
+EOD;
+	echo $help."\n\n";
+	exit(0);
+}
+
+// remove the name of the executing script
+array_shift($argv);
+
+// no options chosen
+if (!is_array($argv)) {
+  showHelp();
+}
+
+// initialize the array of options
+$options = array('type'=>'', 'enc'=>'', 'flags'=>32, 'outpath'=>K_PATH_FONTS, 'platid'=>3, 'encid'=>1, 'addcbbox'=>false, 'link'=>false);
+
+// short input options
+$sopt = '';
+$sopt .= 't:';
+$sopt .= 'e:';
+$sopt .= 'f:';
+$sopt .= 'o:';
+$sopt .= 'p:';
+$sopt .= 'n:';
+$sopt .= 'b';
+$sopt .= 'l';
+$sopt .= 'i:';
+$sopt .= 'h';
+
+// long input options
+$lopt = array();
+$lopt[] = 'type:';
+$lopt[] = 'enc:';
+$lopt[] = 'flags:';
+$lopt[] = 'outpath:';
+$lopt[] = 'platid:';
+$lopt[] = 'encid:';
+$lopt[] = 'addcbbox';
+$lopt[] = 'link';
+$lopt[] = 'fonts:';
+$lopt[] = 'help';
+
+// parse input options
+$inopt = getopt($sopt, $lopt);
+
+// import options (with some sanitization)
+foreach ($inopt as $opt => $val) {
+	switch ($opt) {
+		case 't':
+		case 'type': {
+			if (in_array($val, array('TrueTypeUnicode', 'TrueType', 'Type1', 'CID0JP', 'CID0KR', 'CID0CS', 'CID0CT'))) {
+				$options['type'] = $val;
+			}
+			break;
+		}
+		case 'e':
+		case 'enc': {
+			$options['enc'] = $val;
+			break;
+		}
+		case 'f':
+		case 'flags': {
+			$options['flags'] = intval($val);
+			break;
+		}
+		case 'o':
+		case 'outpath': {
+			$options['outpath'] = realpath($val);
+			if (substr($options['outpath'], -1) != '/') {
+				$options['outpath'] .= '/';
+			}
+			break;
+		}
+		case 'p':
+		case 'platid': {
+			$options['platid'] = min(max(1, intval($val)), 3);
+			break;
+		}
+		case 'n':
+		case 'encid': {
+			$options['encid'] = min(max(0, intval($val)), 10);
+			break;
+		}
+		case 'b':
+		case 'addcbbox': {
+			$options['addcbbox'] = true;
+			break;
+		}
+		case 'l':
+		case 'link': {
+			$options['link'] = true;
+			break;
+		}
+		case 'i':
+		case 'fonts': {
+			$options['fonts'] = explode(',', $val);
+			break;
+		}
+		case 'h':
+		case 'help':
+		default: {
+			showHelp();
+			break;
+		}
+	} // end of switch
+} // end of while loop
+
+if (empty($options['fonts'])) {
+	echo "ERROR: missing input fonts (try --help for usage)\n\n";
+	exit(2);
+}
+
+// check the output path
+if (!is_dir($options['outpath']) OR !is_writable($options['outpath'])) {
+	echo "ERROR: Can't write to ".$options['outpath']."\n\n";
+	exit(3);
+}
+
+echo "\n>>> Converting fonts for TCPDF:\n";
+
+echo '*** Output dir set to '.$options['outpath']."\n";
+
+// check if there are conversion errors
+$errors = false;
+
+foreach ($options['fonts'] as $font) {
+	$fontfile = realpath($font);
+	$fontname = TCPDF_FONTS::addTTFfont($fontfile, $options['type'], $options['enc'], $options['flags'], $options['outpath'], $options['platid'], $options['encid'], $options['addcbbox'], $options['link']);
+	if ($fontname === false) {
+		$errors = true;
+		echo "--- ERROR: can't add ".$font."\n";
+	} else {
+		echo "+++ OK   : ".$fontfile.' added as '.$fontname."\n";
+	}
+}
+
+if ($errors) {
+	echo "--- Process completed with ERRORS!\n\n";
+	exit(4);
+}
+
+echo ">>> Process successfully completed!\n\n";
+exit(0);
+
+//============================================================+
+// END OF FILE
+//============================================================+
diff --git a/htmltest/sites/all/modules/acl/CHANGELOG.txt b/htmltest/sites/all/modules/acl/CHANGELOG.txt
new file mode 100644
index 00000000..3bb31d50
--- /dev/null
+++ b/htmltest/sites/all/modules/acl/CHANGELOG.txt
@@ -0,0 +1,56 @@
+
+CHANGELOG for ACL for Drupal 7
+
+
+acl 7.x-1.0-dev:
+
+
+acl 7.x-1.0 (2011-11-26):
+  Enhancements:
+    - Add acl_node_add_acl_record() function to support extending the {acl_node} table.
+
+
+acl 7.x-1.0-rc1 (2011-08-10):
+  Bug fixes:
+    - Remove version number and file list from .info file now that it's not needed anymore.
+    - Fix typo introduced in prior commit.
+    - #1228214: Fully qualify field parameter in SelectQuery::condition() calls.
+
+acl 7.x-1.0-beta3 (2011-04-17):
+  Enhancements:
+    - Issue #852486 by salvis: Optimize acl_node_clear_acls().
+    - Add tests for acl_node_*().
+    - #968382: Install better indexes.
+  Bug fixes:
+    - Rename acl_create_new_acl() to acl_create_acl().
+    - Fix indenting, spacing, comments; remove useless helper functions. No functional changes.
+    - #1024114: Fix query in acl_get_id_by_name().
+
+acl 7.x-1.0-beta2 (2011-01-08):
+  Enhancements:
+    - Streamline code (no functional change).
+    - Add acl_get_ids_by_user() API.
+    - Add support for ACLs with name /and number/.
+
+acl 7.x-1.0-beta1 (2010-11-06):
+  Enhancements:
+    - Add $number to hook_acl_explain(), too.
+    - Add new acl_add_nodes() function to add access control to multiple nodes selected by a subquery.
+    - #936682: Add a 'number' column and some indexes to the {acl} table.
+    - #761696: Add tests (work in progress).
+    - Create new hook_acl_explain() to allow the client to explain its grant records.
+    - Add acl_has_user($acl_id, $uid) API function.
+  Port to D7:
+    - Need to pass $form_state by reference to _acl_edit_form_after_build().
+    - #946636: Fix WSOD due to core reloading the form from the cache and not loading include files.
+    - #836822: Don't anonymize 'deny' grant records.
+    - #836822: Fix some porting errors.
+    - Fix line endings (no functional change).
+    - #798106: Convert another left-over db_result() call.
+    - #824642: Avoid type conversion problems when FALSE is passed rather than 0.
+    - #798106: Fix incomplete porting (db_query).
+    - #761696: Simpletests: provide some dummy files.
+    - #798108: Remove drupal_install_schema() and drupal_uninstall_schema() calls.
+    - Port database statements.
+    - Use 6.x-1.1 and fix the applicable Coder errors.
+
diff --git a/htmltest/sites/all/modules/acl/INSTALL.txt b/htmltest/sites/all/modules/acl/INSTALL.txt
new file mode 100644
index 00000000..21da9b2a
--- /dev/null
+++ b/htmltest/sites/all/modules/acl/INSTALL.txt
@@ -0,0 +1 @@
+Simply drop this module's directory into your modules directory and install via admin/build/modules.
diff --git a/htmltest/sites/all/modules/acl/LICENSE.txt b/htmltest/sites/all/modules/acl/LICENSE.txt
new file mode 100644
index 00000000..d159169d
--- /dev/null
+++ b/htmltest/sites/all/modules/acl/LICENSE.txt
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/htmltest/sites/all/modules/acl/README.txt b/htmltest/sites/all/modules/acl/README.txt
new file mode 100644
index 00000000..e1cd68cf
--- /dev/null
+++ b/htmltest/sites/all/modules/acl/README.txt
@@ -0,0 +1,3 @@
+This module has no UI of its own and unless some other module uses it,
+it won't appear to add anything to your site. Only bother with this module
+if some other module tells you to.
diff --git a/htmltest/sites/all/modules/acl/acl.admin.inc b/htmltest/sites/all/modules/acl/acl.admin.inc
new file mode 100644
index 00000000..7b8cb820
--- /dev/null
+++ b/htmltest/sites/all/modules/acl/acl.admin.inc
@@ -0,0 +1,149 @@
+<?php
+
+/**
+ * @file
+ * Implementations of administration functions for the acl module.
+ */
+
+/**
+ * Implementation of acl_edit_form().
+ */
+function _acl_edit_form($acl_id, $label = NULL, $new_acl = FALSE) {
+  $users = array();
+  if (!$new_acl) {
+    // Ensure the ACL in question even exists.
+    if (!($record = db_query("SELECT name, number FROM {acl} WHERE acl_id = :acl_id", array(
+      'acl_id' => $acl_id,
+    ))->fetchAssoc())) {
+      return array();
+    }
+    $result = db_query("SELECT u.uid, u.name FROM {users} u LEFT JOIN {acl_user} aclu ON aclu.uid = u.uid WHERE acl_id = :acl_id", array(
+      'acl_id' => $acl_id));
+    foreach ($result as $user) {
+      $users[$user->uid] = $user->name;
+    }
+  }
+  if (!isset($label)) {
+    $label = (isset($record['name']) ? $record['name'] : (isset($record['number']) ? $record['number'] : $acl_id));
+  }
+
+  $form = array(
+    '#type' => 'fieldset',
+    '#collapsible' => TRUE,
+    '#title' => $label,
+    '#tree' => TRUE,
+  );
+
+  $form['acl_id'] = array(
+    '#type' => 'value',
+    '#value' => $acl_id,
+  );
+
+  $form['deletions'] = array(
+    '#type' => 'checkboxes',
+    '#options' => array(),
+  ); // placeholder
+  $form['delete_button'] = array(
+    '#type' => 'button',
+    '#name' => 'acl_' . $acl_id,
+    '#value' => t('Remove Checked'),
+    '#submit' => FALSE,
+  );
+
+  $form['add'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Add user'),
+    '#maxlength' => 60,
+    '#size' => 40,
+    '#autocomplete_path' => 'user/autocomplete',
+  );
+  $form['add_button'] = array(
+    '#type' => 'button',
+    '#name' => 'acl_' . $acl_id,
+    '#value' => t('Add User'),
+    '#submit' => FALSE,
+  );
+
+  $form['user_list'] = array(
+    '#type' => 'hidden',
+    '#default_value' => serialize($users),
+  );
+
+  $form['#after_build'] = array('_acl_edit_form_after_build');
+
+  return $form;
+}
+
+/**
+ * Process a form that had our buttons on it.
+ */
+function _acl_edit_form_after_build($form, &$form_state) {
+  // We can't use the form values because it's the entire structure
+  // and we have no clue where our values actually are. That's
+  // ok tho cause #value still works for us.
+  $user_list = unserialize($form['user_list']['#value']);
+  $button_name = 'acl_' . $form['acl_id']['#value'];
+
+  if (isset($form_state['triggering_element']) && $form_state['triggering_element']['#value'] == $form['delete_button']['#value']) {
+    $deletions = $form['deletions']['#value'];
+    foreach ($deletions as $uid) {
+      unset($user_list[$uid]);
+      unset($form['deletions']['#value'][$uid]);
+    }
+  }
+  elseif (isset($form_state['triggering_element']) && $form_state['triggering_element']['#value'] == $form['add_button']['#value'] && !empty($form['add']['#value'])) {
+    $user = db_query("SELECT uid, name FROM {users} WHERE name = :name", array(
+      'name' => $form['add']['#value'],
+    ))->fetchObject();
+    if (!$user || !$user->uid) {
+      form_error($form['add'], t("Invalid user specified."));
+    }
+    else {
+      $user_list[$user->uid] = $user->name;
+      $form['add']['#value'] = NULL;
+    }
+  }
+
+  if (count($user_list) != 0) {
+    $form['deletions']['#type'] = 'checkboxes';
+    $form['deletions']['#title'] = t("Current users");
+    $form['deletions']['#options'] = $user_list;
+    $form['deletions']['#value'] = array(); // don't carry value through.
+    $form['deletions'] = form_builder(!empty($form['#post']) ? $form['#post']['form_id'] : 'acl_form', $form['deletions'], $form_state);
+  }
+  else {
+    $form['delete_button']['#type'] = 'value';
+  }
+  $form['user_list']['#value'] = serialize($user_list);
+
+  return $form;
+}
+
+/**
+ * Write the results of a form.
+ *
+ * The module that embedded our form must call this function!
+ */
+function acl_save_form($form, $priority = NULL) {
+  $users = unserialize($form['user_list']);
+  db_delete('acl_user')
+    ->condition('acl_id', $form['acl_id'])
+    ->execute();
+  foreach ($users as $uid => $name) {
+    db_insert('acl_user')
+    ->fields(array(
+      'acl_id' => $form['acl_id'],
+      'uid' => $uid,
+    ))
+    ->execute();
+  }
+  if (isset($priority)) {
+    db_update('acl_node')
+      ->fields(array(
+        'priority' => $priority,
+      ))
+      ->condition('acl_id', $form['acl_id'])
+      ->execute();
+  }
+}
+
diff --git a/htmltest/sites/all/modules/acl/acl.api.php b/htmltest/sites/all/modules/acl/acl.api.php
new file mode 100644
index 00000000..0b54fa20
--- /dev/null
+++ b/htmltest/sites/all/modules/acl/acl.api.php
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @file
+ * API documentation for ACL.
+ */
+
+/**
+ * Explain what your ACL grant records mean.
+ */
+function hook_acl_explain($acl_id, $name, $number, $users = NULL) {
+  if (empty($users)) {
+    return "ACL (id=$acl_id) would grant access to $name/$number.";
+  }
+  return "ACL (id=$acl_id) grants access to $name/$number to the listed user(s).";
+}
+
diff --git a/htmltest/sites/all/modules/acl/acl.info b/htmltest/sites/all/modules/acl/acl.info
new file mode 100644
index 00000000..166cdf9e
--- /dev/null
+++ b/htmltest/sites/all/modules/acl/acl.info
@@ -0,0 +1,12 @@
+name = ACL
+description = Access control list API. Has no features on its own.
+core = 7.x
+package = Access control
+
+
+; Information added by drupal.org packaging script on 2011-11-26
+version = "7.x-1.0"
+core = "7.x"
+project = "acl"
+datestamp = "1322308236"
+
diff --git a/htmltest/sites/all/modules/acl/acl.install b/htmltest/sites/all/modules/acl/acl.install
new file mode 100644
index 00000000..0658dfa4
--- /dev/null
+++ b/htmltest/sites/all/modules/acl/acl.install
@@ -0,0 +1,212 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the acl module.
+ */
+
+/**
+ * Implementation of hook_schema().
+ */
+function acl_schema() {
+  $schema['acl'] = array(
+    'description'     => 'The base Access Control Lists table.',
+    'fields'          => array(
+      'acl_id'        => array(
+        'description' => 'Primary key: unique ACL ID.',
+        'type'        => 'serial',
+        'not null'    => TRUE,
+      ),
+      'module'        => array(
+        'description' => 'The name of the module that created this ACL entry.',
+        'type'        => 'varchar',
+        'length'      => 255,
+        'not null'    => TRUE,
+      ),
+      'name'          => array(
+        'description' => 'A name (or other identifying information) for this ACL entry, given by the module that created it.',
+        'type'        => 'varchar',
+        'length'      => 255,
+      ),
+      'number'        => array(
+        'description' => "A number for this ACL entry, given by the module that created it; use either 'name' or 'number'.",
+        'type'        => 'int',
+      ),
+    ),
+    'primary key'     => array('acl_id'),
+    'indexes'         => array(
+      'module_name_number' => array(array('module', 64), array('name', 64), 'number'),
+      'module_number' => array(array('module', 64), 'number'),
+    ),
+  );
+  $schema['acl_user'] = array(
+    'description'     => 'Identifies {users} to which the referenced {acl} entry applies.',
+    'fields'          => array(
+      'acl_id'        => array(
+        'description' => 'The {acl}.acl_id of the entry.',
+        'type'        => 'int',
+        'not null'    => TRUE,
+        'default'     => 0,
+      ),
+      'uid'           => array(
+        'description' => 'The {user}.uid to which this {acl} entry applies.',
+        'type'        => 'int',
+        'not null'    => TRUE,
+        'default'     => 0,
+      ),
+    ),
+    'primary key'     => array('acl_id', 'uid'),
+    'indexes'         => array(
+      'uid'           => array('uid'),
+    ),
+  );
+  $schema['acl_node'] = array(
+    'description'     => 'Identifies {node}s to which the referenced {acl} entry applies and defines the permissions granted.',
+    'fields'          => array(
+      'acl_id'        => array(
+        'description' => 'The {acl}.acl_id of the entry.',
+        'type'        => 'int',
+        'not null'    => TRUE,
+        'default'     => 0,
+      ),
+      'nid'           => array(
+        'description' => 'The {node}.nid to grant permissions for.',
+        'type'        => 'int',
+        'not null'    => TRUE,
+        'default'     => 0,
+      ),
+      'grant_view'    => array(
+        'description' => 'Whether to grant "view" permission.',
+        'type'        => 'int',
+        'size'        => 'tiny',
+        'unsigned'    => TRUE,
+        'not null'    => TRUE,
+        'default'     => 0,
+      ),
+      'grant_update'  => array(
+        'description' => 'Whether to grant "update" permission.',
+        'type'        => 'int',
+        'size'        => 'tiny',
+        'unsigned'    => TRUE,
+        'not null'    => TRUE,
+        'default'     => 0,
+      ),
+      'grant_delete'  => array(
+        'description' => 'Whether to grant "delete" permission.',
+        'type'        => 'int',
+        'size'        => 'tiny',
+        'unsigned'    => TRUE,
+        'not null'    => TRUE,
+        'default'     => 0,
+      ),
+      'priority'      => array(
+        'description' => 'The priority of this grant record (for hook_node_access_records()).',
+        'type'        => 'int',
+        'size'        => 'small',
+        'not null'    => TRUE,
+        'default'     => 0,
+      ),
+    ),
+    'primary key'     => array('acl_id', 'nid'),
+    'indexes'         => array(
+      'nid'           => array('nid'),
+    ),
+  );
+  return $schema;
+}
+
+
+/**
+ * Fixes primary keys
+ */
+function acl_update_2() {
+  $ret = array();
+  // drop the previously created indexes (except for acl_user.uid)
+  db_drop_index($ret, 'acl', 'acl_id');
+  db_drop_index($ret, 'acl_user', 'acl_id');
+  db_drop_index($ret, 'acl_node', 'acl_id');
+  db_drop_index($ret, 'acl_node', 'nid');
+  // create new indexes (as primary keys this time)
+  db_add_primary_key($ret, 'acl', array('acl_id'));
+  db_add_primary_key($ret, 'acl_user', array('acl_id', 'uid'));
+  db_add_primary_key($ret, 'acl_node', array('acl_id', 'nid'));
+  return $ret;
+}
+
+/**
+ * Put back acl_node(nid) index for deleting nodes and clean up {acl_node}.
+ */
+function acl_update_4() {
+  $ret = array();
+  db_add_index($ret, 'acl_node', 'nid', array('nid'));
+  $ret[] = update_sql("DELETE FROM {acl_node} WHERE nid NOT IN (SELECT nid FROM {node})");
+  return $ret;
+}
+
+/**
+ * Clean up {acl_user}.
+ */
+function acl_update_5() {
+  $ret = array();
+  $ret[] = update_sql("DELETE FROM {acl_user} WHERE uid NOT IN (SELECT uid FROM {users})");
+  return $ret;
+}
+
+/**
+ * Add 'priority' column.
+ */
+function acl_update_6() {
+  $ret = array();
+  db_add_field($ret, 'acl_node', 'priority', array('type' => 'int', 'size' => 'small', 'not null' => TRUE, 'default' => 0));
+  return $ret;
+}
+
+/**
+ * Change acl_id to auto-increment.
+ */
+function acl_update_6000() {
+  $ret = array();
+  db_change_field($ret, 'acl', 'acl_id', 'acl_id', array('type' => 'serial', 'not null' => TRUE));
+  // (Dropping and recreating the primary key on an auto_increment column would cause a MySQL failure.)
+  db_change_field($ret, 'acl', 'module', 'module', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE));
+  db_change_field($ret, 'acl', 'name', 'name', array('type' => 'varchar', 'length' => 255));
+  db_add_index($ret, 'acl_node', 'nid', array('nid'));
+  return $ret;
+}
+
+/**
+ * Add index that should have been added when upgrading from D5.
+ */
+function acl_update_6001() {
+  $ret = array();
+  @db_add_index($ret, 'acl_node', 'nid', array('nid'));
+  return ($ret['success'] ? $ret : array()); // ignore possible error, if the index already exists
+}
+
+/**
+ * Add 'number' column if it's not there yet.
+ */
+function acl_update_7000() {
+  if (!db_field_exists('acl', 'number')) {
+    db_add_field('acl', 'number', array('type' => 'int', 'description' => "A number for this ACL entry, given by the module that created it; use either 'name' or 'number'."));
+  }
+}
+
+/**
+ * Install better indexes.
+ */
+function acl_update_7001() {
+  if (db_index_exists('acl', 'name')) {
+    db_drop_index('acl', 'name');
+  }
+  if (!db_index_exists('acl', 'module_name_number')) {
+    db_add_index('acl', 'module_name_number', array(array('module', 64), array('name', 64), 'number'));
+  }
+  if (db_index_exists('acl', 'number')) {
+    db_drop_index('acl', 'number');
+  }
+  if (!db_index_exists('acl', 'module_number')) {
+    db_add_index('acl', 'module_number', array(array('module', 64), 'number'));
+  }
+}
+
diff --git a/htmltest/sites/all/modules/acl/acl.module b/htmltest/sites/all/modules/acl/acl.module
new file mode 100644
index 00000000..7a27ef85
--- /dev/null
+++ b/htmltest/sites/all/modules/acl/acl.module
@@ -0,0 +1,376 @@
+<?php
+
+/**
+ * @file
+ * An API module providing by-user access control lists.
+ *
+ * This module handles ACLs on behalf of other modules. The two main reasons
+ * to do this are so that modules using ACLs can share them with each
+ * other without having to actually know much about them, and so that
+ * ACLs can easily co-exist with the existing node_access system.
+ */
+
+/**
+ * Create a new ACL.
+ *
+ * The client module will have to keep track of the ACL. For that it can
+ * assign either a $name or a $number to this ACL.
+ *
+ * @param $module
+ *   The name of the client module.
+ * @param $name
+ *   An arbitrary name for this ACL, freely defined by the client module.
+ * @param $number
+ *   An arbitrary number for this ACL, freely defined by the client module.
+ * @return
+ *   The ID of the newly created ACL.
+ */
+function acl_create_acl($module, $name = NULL, $number = NULL) {
+  $acl = array(
+    'module' => $module,
+    'name' => $name,
+    'number' => $number
+  );
+  drupal_write_record('acl', $acl);
+  return $acl['acl_id'];
+}
+
+/**
+ * Create a new ACL (obsolete).
+ *
+ * @see acl_create_acl()
+ */
+function acl_create_new_acl($module, $name = NULL, $number = NULL) {
+  return acl_create_acl($module, $name, $number);
+}
+
+/**
+ * Delete an existing ACL.
+ */
+function acl_delete_acl($acl_id) {
+  db_delete('acl')
+    ->condition('acl_id', $acl_id)
+    ->execute();
+  db_delete('acl_user')
+    ->condition('acl_id', $acl_id)
+    ->execute();
+  db_delete('acl_node')
+    ->condition('acl_id', $acl_id)
+    ->execute();
+}
+
+/**
+ * Add the specified UID to an ACL.
+ */
+function acl_add_user($acl_id, $uid) {
+  $test_uid = db_query("SELECT uid FROM {acl_user} WHERE acl_id = :acl_id AND uid = :uid", array(
+    'acl_id' => $acl_id,
+    'uid' => $uid,
+  ))->fetchField();
+  if (!$test_uid) {
+    db_insert('acl_user')
+    ->fields(array(
+      'acl_id' => $acl_id,
+      'uid' => $uid,
+    ))
+    ->execute();
+  }
+}
+
+/**
+ * Remove the specified UID from an ACL.
+ */
+function acl_remove_user($acl_id, $uid) {
+  db_delete('acl_user')
+    ->condition('acl_id', $acl_id)
+    ->condition('uid', $uid)
+    ->execute();
+}
+
+/**
+ * Provide a form to edit the ACL that can be embedded in other forms.
+ * Pass $new_acl=TRUE if you have no ACL yet, but do supply a string
+ * like 'my_module_new_acl' as $acl_id anyway.
+ */
+function acl_edit_form(&$form_state, $acl_id, $label = NULL, $new_acl = FALSE) {
+  $form_state['build_info']['files'][] = _acl_module_load_include('admin.inc');
+  return _acl_edit_form($acl_id, $label, $new_acl);
+}
+
+/**
+ * Provide access control to all nodes selected by a subquery, based upon an ACL id.
+ */
+function acl_add_nodes($subselect, $acl_id, $view, $update, $delete, $priority = 0) {
+  db_delete('acl_node')
+    ->condition('acl_id', $acl_id)
+    ->condition('nid', $subselect, 'IN')
+    ->execute();
+  $subselect->addExpression($acl_id, 'acl_id');
+  $subselect->addExpression((int) $view, 'grant_view');
+  $subselect->addExpression((int) $update, 'grant_update');
+  $subselect->addExpression((int) $delete, 'grant_delete');
+  $subselect->addExpression($priority, 'priority');
+  db_insert('acl_node')
+    ->from($subselect)
+    ->execute();
+}
+
+/**
+ * Provide access control to a node based upon an ACL id.
+ */
+function acl_node_add_acl($nid, $acl_id, $view, $update, $delete, $priority = 0) {
+  acl_node_add_acl_record(array(
+    'acl_id'       => $acl_id,
+    'nid'          => $nid,
+    'grant_view'   => (int) $view,
+    'grant_update' => (int) $update,
+    'grant_delete' => (int) $delete,
+    'priority'     => $priority,
+  ));
+}
+
+/**
+ * Provide access control to a node based upon an ACL id.
+ */
+function acl_node_add_acl_record(array $record) {
+  db_delete('acl_node')
+    ->condition('acl_id', $record['acl_id'])
+    ->condition('nid', $record['nid'])
+    ->execute();
+  db_insert('acl_node')
+    ->fields($record)
+    ->execute();
+}
+
+/**
+ * Remove an ACL completely from a node.
+ */
+function acl_node_remove_acl($nid, $acl_id) {
+  db_delete('acl_node')
+    ->condition('acl_id', $acl_id)
+    ->condition('nid', $nid)
+    ->execute();
+}
+
+/**
+ * Clear all of a module's ACLs from a node.
+ */
+function acl_node_clear_acls($nid, $module) {
+  $select = db_select('acl', 'a')
+    ->fields('a', array('acl_id'))
+    ->condition('a.module', $module);
+  db_delete('acl_node')
+    ->condition('nid', $nid)
+    ->condition('acl_id', $select, 'IN')
+    ->execute();
+}
+
+/**
+ * Get the id of an ACL by name (+ optionally number).
+ */
+function acl_get_id_by_name($module, $name, $number = NULL) {
+  $query = db_select('acl', 'a')
+    ->fields('a', array('acl_id'))
+    ->condition('a.module', $module)
+    ->condition('a.name', $name);
+  if (isset($number)) {
+    $query->condition('a.number', $number);
+  }
+  return $query->execute()->fetchField();
+}
+
+/**
+ * Get the id of an ACL by number.
+ */
+function acl_get_id_by_number($module, $number) {
+  $query = db_select('acl', 'a')
+    ->fields('a', array('acl_id'))
+    ->condition('a.module', $module)
+    ->condition('a.number', $number);
+  return $query->execute()->fetchField();
+}
+
+/**
+ * Determine whether an ACL has some assigned users.
+ */
+function acl_has_users($acl_id) {
+  return db_query("SELECT COUNT(uid) FROM {acl_user} WHERE acl_id = :acl_id", array(
+    'acl_id' => $acl_id,
+  ))->fetchField();
+}
+
+/**
+ * Determine whether an ACL has a specific assigned user.
+ */
+function acl_has_user($acl_id, $uid) {
+  return db_query("SELECT COUNT(uid) FROM {acl_user} WHERE acl_id = :acl_id AND uid = :uid", array(
+    'acl_id' => $acl_id,
+    'uid' => $uid,
+  ))->fetchField();
+}
+
+/**
+ * Get an array of acl_ids held by a user.
+ */
+function acl_get_ids_by_user($module, $uid, $name = NULL, $number = NULL) {
+  $query = db_select('acl', 'a');
+  $query->join('acl_user', 'au', 'a.acl_id = au.acl_id');
+  $query
+    ->fields('a', array('acl_id'))
+    ->condition('a.module', $module)
+    ->condition('au.uid', $uid);
+  if (isset($name)) {
+    $query->condition('a.name', $name);
+  }
+  if (isset($number)) {
+    $query->condition('a.number', $number);
+  }
+  $acl_ids = $query->execute()->fetchCol();
+  return $acl_ids;
+}
+
+/**
+ * Get the uids of an ACL.
+ */
+function acl_get_uids($acl_id) {
+  $uids = db_query("SELECT uid FROM {acl_user} WHERE acl_id = :acl_id", array(
+    'acl_id' => $acl_id,
+  ))->fetchCol();
+  return $uids;
+}
+
+/**
+ * Implements hook_node_access_records().
+ */
+function acl_node_access_records($node) {
+  if (!$node->nid) {
+    return;
+  }
+  $result = db_query("SELECT n.*, 'acl' AS realm, n.acl_id AS gid, a.module FROM {acl_node} n INNER JOIN {acl} a ON n.acl_id = a.acl_id WHERE nid = :nid", array(
+    'nid' => $node->nid,
+  ), array('fetch' => PDO::FETCH_ASSOC));
+  $grants = array();
+  foreach ($result as $grant) {
+    if (module_invoke($grant['module'], 'enabled')) {
+      if (acl_has_users($grant['gid'])) {
+        $grants[] = $grant;
+      }
+      else {
+        //just deny access
+        $grants[] = array(
+          'realm' => 'acl',
+          'gid' => $grant['gid'],
+          'grant_view' => 0,
+          'grant_update' => 0,
+          'grant_delete' => 0,
+          'priority' => $grant['priority'],
+        );
+      }
+    }
+  }
+  return $grants;
+}
+
+/**
+ * Implements hook_node_grants().
+ */
+function acl_node_grants($account, $op) {
+  $acl_ids = db_query("SELECT acl_id FROM {acl_user} WHERE uid = :uid", array(
+    'uid' => $account->uid,
+  ))->fetchCol();
+  return (!empty($acl_ids) ? array('acl' => $acl_ids) : NULL);
+}
+
+/**
+ * Implements hook_node_delete().
+ */
+function acl_node_delete($node) {
+  db_delete('acl_node')
+    ->condition('nid', $node->nid)
+    ->execute();
+}
+
+/**
+ * Implements hook_user_cancel().
+ */
+function acl_user_cancel($edit, $account, $method) {
+  db_delete('acl_user')
+    ->condition('uid', $account->uid)
+    ->execute();
+}
+
+/**
+ * Helper function to load include files.
+ */
+function _acl_module_load_include($type) {
+  static $loaded = array();
+
+  if (!isset($loaded[$type])) {
+    $path = module_load_include($type, 'acl');
+    $loaded[$type] = drupal_get_path('module', 'acl') . "/acl.$type";
+  }
+  return $loaded[$type];
+}
+
+/**
+ * Implements hook_node_access_explain().
+ */
+function acl_node_access_explain($row) {
+  static $interpretations = array();
+  if ($row->realm == 'acl') {
+    if (!isset($interpretations[$row->gid])) {
+      $acl = db_query("SELECT * FROM {acl} WHERE acl_id = :acl_id", array(
+        'acl_id' => $row->gid,
+      ))->fetchObject();
+      $acl->tag = '?';
+      if (!isset($acl->name)) {
+        $acl->tag = $acl->number;
+      }
+      elseif (!isset($acl->number)) {
+        $acl->tag = $acl->name;
+      }
+      else {
+        $acl->tag = $acl->name . '-' . $acl->number;
+      }
+      $result = db_query("SELECT u.name FROM {acl_user} au, {users} u WHERE au.acl_id = :acl_id AND au.uid = u.uid", array(
+        'acl_id' => $row->gid,
+      ));
+      foreach ($result as $user) {
+        $users[] = $user->name;
+      }
+      if (isset($users)) {
+        $users = implode(', ', $users);
+        $interpretations[$row->gid] = _acl_get_explanation("$acl->module/$acl->tag: $users", $acl->acl_id, $acl->module, $acl->name, $acl->number, $users);
+      }
+      elseif ($row->gid == 0) {
+        $result = db_query("SELECT an.acl_id, a.module, a.name FROM {acl_node} an JOIN {acl} a ON an.acl_id = a.acl_id LEFT JOIN {acl_user} au ON a.acl_id = au.acl_id WHERE an.nid = :nid AND au.uid IS NULL", array(
+          'nid' => $row->nid,
+        ));
+        foreach ($result as $acl) {
+          $rows[] = _acl_get_explanation("$acl->acl_id:&nbsp;$acl->module/$acl->tag", $acl->acl_id, $acl->module, $acl->name, $acl->number);
+        }
+        if (!empty($rows)) {
+          return implode('<br />', $rows);
+        }
+        return 'No access via ACL.';
+      }
+      else {
+        $interpretations[$row->gid] = _acl_get_explanation("$acl->module/$acl->tag: no users!", $acl->acl_id, $acl->module, $acl->name, $acl->number);
+      }
+    }
+    return $interpretations[$row->gid];
+  }
+}
+
+/**
+ * Helper function to ask the client for its interpretation of the given
+ * grant record.
+ */
+function _acl_get_explanation($text, $acl_id, $module, $name, $number, $users = NULL) {
+  $hook = $module .'_acl_explain';
+  if (function_exists($hook)) {
+    return '<span title="'. $hook($acl_id, $name, $number, $users) .'">'. $text .'</span>';
+  }
+  return $text;
+}
+
diff --git a/htmltest/sites/all/modules/acl/acl.test b/htmltest/sites/all/modules/acl/acl.test
new file mode 100644
index 00000000..1b3bbf61
--- /dev/null
+++ b/htmltest/sites/all/modules/acl/acl.test
@@ -0,0 +1,150 @@
+<?php
+// $Id:
+
+class AclWebTestCase extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'ACL access permissions',
+      'description' => 'Test ACL permissions for reading a node.',
+      'group' => 'ACL',
+    );
+  }
+
+  /**
+   * Implementation setUp().
+   */
+  function setUp() {
+    parent::setUp('acl', 'acl_node_test');
+    $web_user = $this->drupalCreateUser(array('create page content'));
+    $this->drupalLogin($web_user);
+  }
+
+  /**
+   * Includes acl_create_acl, acl_delete_acl, acl_get_id_by_name
+   */
+  function testNodeAclCreateDelete() {
+    // Add a node.
+    $node1 = $this->drupalCreateNode(array('type' => 'page', 'promote' => 0));
+    $this->assertTrue(node_load($node1->nid), t('Page node created.'));
+
+    acl_create_acl('test1', $node1->title);
+    $acl_id = acl_get_id_by_name('test1', $node1->title);
+    $this->assertNotNull($acl_id, t('ACL ID was succesfully found.'), $group = 'ACL');
+    $records = db_query('SELECT acl_id, name FROM {acl} WHERE acl_id = :acl_id', array(':acl_id' => $acl_id))->fetchAll();
+    $this->assertEqual(count($records), 1, t('ACL was succesfully created.'), $group = 'ACL');
+    acl_delete_acl($records[0]->acl_id);
+
+    $records = db_query('SELECT acl_id, name FROM {acl} WHERE acl_id = :acl_id', array(':acl_id' => $records[0]->acl_id))->fetchAll();
+    $this->pass(var_export($records, TRUE));
+    $this->assertEqual(count($records), 0, t('ACL was succesfully removed.'), $group = 'ACL');
+  }
+
+  /**
+   * Includes acl_add_user, acl_remove_user, acl_has_users,
+   * acl_get_id_by_name, acl_has_user, acl_get_uids
+   */
+  function testNodeAclSingleUserAddRemove() {
+    // Add a node.
+    $node1 = $this->drupalCreateNode(array('type' => 'page', 'promote' => 0));
+    $this->assertTrue(node_load($node1->nid), t('Page node created.'));
+
+    acl_create_acl('test2', $node1->title);
+    // Check to see if grants added by node_test_node_access_records()
+    // made it in.
+    $acl_id = acl_get_id_by_name('test2', $node1->title);
+    $this->assertNotNull($acl_id, t('ACL ID was succesfully found.'), $group = 'ACL');
+    $records = db_query('SELECT acl_id, name FROM {acl} WHERE acl_id = :acl_id', array(':acl_id' => $acl_id))->fetchAll();
+    $this->assertEqual(count($records), 1, t('ACL was succesfully created.'), $group = 'ACL');
+
+    // Add user (can't we use the user created in setup?).
+    $web_user_1 = $this->drupalCreateUser();
+    //$this->drupalLogin($web_user);
+    acl_add_user($acl_id, $web_user_1->uid);
+    $records = db_query('SELECT acl_id, uid FROM {acl_user} WHERE uid = :uid', array(':uid' => $web_user_1->uid))->fetchAll();
+    // Verify user is added.
+    $this->assertEqual(count($records), 1, t('User was succesfully added.'), $group = 'ACL');
+
+    // Remove user.
+    acl_remove_user($acl_id, $web_user_1->uid);
+    $records = db_query('SELECT acl_id, uid FROM {acl_user} WHERE uid = :uid', array(':uid' => $web_user_1->uid))->fetchAll();
+    // Verify user is removed.
+    $this->assertEqual(count($records), 0, t('User was succesfully removed.'), $group = 'ACL');
+  }
+
+  /**
+   * Includes acl_node_add_acl, acl_node_remove_acl, acl_node_clear_acls
+   */
+  function testNodeAclAddRemoveFromNode() {
+    // Add nodes.
+    $node1 = $this->drupalCreateNode(array('type' => 'page', 'promote' => 0));
+    $this->assertTrue(node_load($node1->nid), t('Page node created.'));
+    $node2 = $this->drupalCreateNode(array('type' => 'page', 'promote' => 0));
+    $this->assertTrue(node_load($node2->nid), t('Page node created.'));
+    $node3 = $this->drupalCreateNode(array('type' => 'page', 'promote' => 0));
+    $this->assertTrue(node_load($node3->nid), t('Page node created.'));
+
+    // Create an ACL and add nodes.
+    $acl_id1 = acl_create_acl('test3', 'test', 1);
+    $this->assertNotNull($acl_id1, t('ACL ID was created.'), $group = 'ACL');
+    // Add two nodes.
+    $query = db_select('node', 'n')
+      ->fields('n', array('nid'))
+      ->condition('nid', array($node1->nid, $node2->nid), 'IN');
+    acl_add_nodes($query, $acl_id1, 1, 1, 1);
+    $count = db_query('SELECT COUNT(nid) FROM {acl_node} WHERE acl_id = :acl_id', array(':acl_id' => $acl_id1))->fetchField();
+    $this->assertEqual($count, 2, t("2 nodes under control ($count)."), $group = 'ACL');
+    // Add a third node.
+    acl_node_add_acl($node3->nid, $acl_id1, 1, 1, 1);
+    $count = db_query('SELECT COUNT(nid) FROM {acl_node} WHERE acl_id = :acl_id', array(':acl_id' => $acl_id1))->fetchField();
+    $this->assertEqual($count, 3, t('3 nodes under control.'), $group = 'ACL');
+    // Add the second node again.
+    acl_node_add_acl($node2->nid, $acl_id1, 1, 1, 1);
+    $count = db_query('SELECT COUNT(nid) FROM {acl_node} WHERE acl_id = :acl_id', array(':acl_id' => $acl_id1))->fetchField();
+    $this->assertEqual($count, 3, t('Still only 3 nodes under control.'), $group = 'ACL');
+
+    // Remove the second node again.
+    acl_node_remove_acl($node2->nid, $acl_id1);
+    $count = db_query('SELECT COUNT(nid) FROM {acl_node} WHERE acl_id = :acl_id', array(':acl_id' => $acl_id1))->fetchField();
+    $this->assertEqual($count, 2, t('2 nodes left under control.'), $group = 'ACL');
+    // Remove the second node again.
+    acl_node_remove_acl($node2->nid, $acl_id1);
+    $count = db_query('SELECT COUNT(nid) FROM {acl_node} WHERE acl_id = :acl_id', array(':acl_id' => $acl_id1))->fetchField();
+    $this->assertEqual($count, 2, t('Still 2 nodes left under control.'), $group = 'ACL');
+
+    // Create another ACL and add nodes.
+    $acl_id2 = acl_create_acl('test3', 'test', 2);
+    $this->assertNotNull($acl_id2, t('ACL ID was created.'), $group = 'ACL');
+    acl_node_add_acl($node1->nid, $acl_id2, 1, 1, 1);
+    acl_node_add_acl($node2->nid, $acl_id2, 1, 1, 1);
+    $count = db_query('SELECT COUNT(nid) FROM {acl_node} WHERE acl_id = :acl_id', array(':acl_id' => $acl_id2))->fetchField();
+    $this->assertEqual($count, 2, t('2 nodes under control.'), $group = 'ACL');
+    // Remove a node (which has two ACLs).
+    acl_node_clear_acls($node1->nid, 'test3');
+    $count = db_query('SELECT COUNT(nid) FROM {acl_node} WHERE acl_id = :acl_id', array(':acl_id' => $acl_id1))->fetchField();
+    $this->assertEqual($count, 1, t('1 node left under control.'), $group = 'ACL');
+    $count = db_query('SELECT COUNT(nid) FROM {acl_node} WHERE acl_id = :acl_id', array(':acl_id' => $acl_id2))->fetchField();
+    $this->assertEqual($count, 1, t('1 node left under control.'), $group = 'ACL');
+  }
+
+}
+
+/**
+ * Included acl_node_delete
+ */
+function testNodeAclAddAndRemoveNode() {
+}
+
+/**
+ * Included acl_user_cancel
+ */
+function testNodeAclAddAndRemoveUser() {
+}
+
+/**
+ * Includes independ check of the permissions by checking the grants
+ * table AND by trying to view the node as a unauthorised user and an
+ * authorized user for each of the 3 use cases (view, edit, delete)
+ */
+function testNodeAclPermissionCheck() {
+}
diff --git a/htmltest/sites/all/modules/acl/tests/acl_node_test.info b/htmltest/sites/all/modules/acl/tests/acl_node_test.info
new file mode 100644
index 00000000..7a2d235a
--- /dev/null
+++ b/htmltest/sites/all/modules/acl/tests/acl_node_test.info
@@ -0,0 +1,16 @@
+; $Id:$
+name = "ACL Node module tests"
+description = "Support module for ACL node related testing."
+package = Testing
+version = VERSION
+core = 7.x
+hidden = TRUE
+
+files[] = acl_node_test.module
+
+; Information added by drupal.org packaging script on 2011-11-26
+version = "7.x-1.0"
+core = "7.x"
+project = "acl"
+datestamp = "1322308236"
+
diff --git a/htmltest/sites/all/modules/acl/tests/acl_node_test.module b/htmltest/sites/all/modules/acl/tests/acl_node_test.module
new file mode 100644
index 00000000..1056f941
--- /dev/null
+++ b/htmltest/sites/all/modules/acl/tests/acl_node_test.module
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * @file
+ * Dummy module implementing node related hooks to test API interaction with
+ * the Node module.
+ */
+
+/**
+ * Implements hook_node_grants().
+ */
+function acl_node_test_node_grants($account, $op) {
+  // Give everyone full grants so we don't break other node tests.
+  // Our node access tests asserts three realms of access.
+  // See testGrantAlter().
+  return array(
+    'test_article_realm' => array(1),
+    'test_page_realm' => array(1),
+    'test_alter_realm' => array(2),
+  );
+}
+
+/**
+ * Implements hook_node_access_records().
+ *
+ * Implicit View by All is allowed.
+ */
+function acl_node_test_node_access_records($node) {
+  $grants = array();
+  if ($node->type == 'article') {
+    // Create grant in arbitrary article_realm for article nodes.
+    $grants[] = array(
+      'realm' => 'test_article_realm',
+      'gid' => 1,
+      'grant_view' => 1,
+      'grant_update' => 0,
+      'grant_delete' => 0,
+      'priority' => 0,
+    );
+  }
+  elseif ($node->type == 'page') {
+    // Create grant in arbitrary page_realm for page nodes.
+    $grants[] = array(
+      'realm' => 'test_page_realm',
+      'gid' => 1,
+      'grant_view' => 1,
+      'grant_update' => 0,
+      'grant_delete' => 0,
+      'priority' => 0,
+    );
+  }
+  return $grants;
+}
+
+/**
+ * Implements hook_node_access_records_alter().
+ */
+function acl_node_test_node_access_records_alter(&$grants, $node) {
+  if (!empty($grants)) {
+    foreach ($grants as $key => $grant) {
+      // Alter grant from test_page_realm to test_alter_realm and modify the gid.
+      if ($grant['realm'] == 'test_page_realm' && $node->promote) {
+        $grants[$key]['realm'] = 'test_alter_realm';
+        $grants[$key]['gid'] = 2;
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_node_grants_alter().
+ *
+ * Returns an empty array of grants to prove that we can alter by reference.
+ */
+function acl_node_test_node_grants_alter(&$grants, $account, $op) {
+  $grants = array();
+}
+
+/**
+ * Implements hook_node_presave().
+ */
+function acl_node_test_node_presave($node) {
+  if ($node->title == 'testing_node_presave') {
+    // Sun, 19 Nov 1978 05:00:00 GMT
+    $node->created = 280299600;
+    // Drupal 1.0 release.
+    $node->changed = 979534800;
+  }
+}
diff --git a/htmltest/sites/all/modules/adaptive_image/LICENSE.txt b/htmltest/sites/all/modules/adaptive_image/LICENSE.txt
new file mode 100644
index 00000000..d159169d
--- /dev/null
+++ b/htmltest/sites/all/modules/adaptive_image/LICENSE.txt
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/htmltest/sites/all/modules/adaptive_image/README.txt b/htmltest/sites/all/modules/adaptive_image/README.txt
new file mode 100644
index 00000000..6cd0ddac
--- /dev/null
+++ b/htmltest/sites/all/modules/adaptive_image/README.txt
@@ -0,0 +1,53 @@
+Adaptive Image
+http://drupal.org/project/adaptive_image
+====================================
+
+
+DESCRIPTION
+-----------
+The Adaptive image module provides device-appropriate versions of images from your fields.
+You can activate adaptive images by adding an adaptive effect to any of your image styles.
+
+The used technique is derived from http://adaptive-images.com/ by Matt Wilcox.
+The hard work is done by Drupal core no need for any additional rewrites.
+If image styles work on your website, this module will too.
+
+REQUIREMENTS
+------------
+Drupal 7.x
+
+CLIENTSIDE REQUIREMENTS
+------------------------
+JavaScript enabled
+
+INSTALLING
+----------
+1. To install the module copy the 'adaptive_image' folder to your sites/all/modules directory.
+
+2. Read more about installing modules at http://drupal.org/node/70151
+
+
+CONFIGURING AND USING
+---------------------
+1. Go to admin/config/media/image-styles
+   Edit an existing or add a new style. Add the Adaptive image effect.
+   Click on 'Update style' button. 
+
+2. Go to admin/structure/types
+   Click on "manage display".
+   Choose a "image" field and click on the edit button.
+   Choose the previously updated style as image style.
+   Click on "Update".
+
+
+REPORTING ISSUE. REQUESTING SUPPORT. REQUESTING NEW FEATURE
+-----------------------------------------------------------
+1. Go to the module issue queue at http://drupal.org/project/issues/adaptive_image?status=All&categories=All
+2. Click on CREATE A NEW ISSUE link.
+3. Fill the form.
+4. To get a status report on your request go to http://drupal.org/project/issues/user
+
+
+UPGRADING
+---------
+Read more at http://drupal.org/node/250790
diff --git a/htmltest/sites/all/modules/adaptive_image/adaptive_image.image.inc b/htmltest/sites/all/modules/adaptive_image/adaptive_image.image.inc
new file mode 100644
index 00000000..3a0e3df5
--- /dev/null
+++ b/htmltest/sites/all/modules/adaptive_image/adaptive_image.image.inc
@@ -0,0 +1,127 @@
+<?php
+
+/**
+ * @file
+ * Adaptive Image - Adaptive images for Drupal
+ * @see http://adaptive-images.com/
+ *
+ * @author
+ * Stefan Auditor <stefan.auditor@erdfisch.de>
+ */
+
+/**
+ * Copy of image_style_deliver() for use with adaptive images.
+ */
+function adaptive_image_style_deliver($style, $scheme) {
+  $settings = $resolutions = array();
+  $settings = adaptive_image_effect_settings($style);
+
+  $mobile_first = (boolean) $settings['mobile_first'];
+  $resolutions = explode(',', $settings['resolutions']);
+
+  /* Do we need to switch mobile first off? */
+  if (adaptive_image_browser_detect()) {
+    $mobile_first = FALSE;
+  }
+
+  $resolution = adaptive_image_resolution($resolutions);
+
+  /* No resolution was found (no cookie or invalid cookie) */
+  if (!$resolution && count($resolutions)) {
+    // We send the lowest resolution for mobile-first approach, and highest otherwise
+    $resolution = $mobile_first ? min($resolutions) : max($resolutions);
+  }
+
+  // Check that the style is defined and the scheme is valid.
+  if (!$style || !file_stream_wrapper_valid_scheme($scheme)) {
+    drupal_exit();
+  }
+
+  foreach ($style['effects'] as $id => $effect) {
+    if ($effect['name'] == 'adaptive_image') {
+      $style['effects'][$id]['data']['width'] = $resolution;
+      $style['effects'][$id]['data']['height'] = NULL;
+      break;
+    }
+  }
+
+  $args = func_get_args();
+  array_shift($args);
+  array_shift($args);
+  $target = implode('/', $args);
+
+  $image_uri = $scheme . '://' . $target;
+  $derivative_uri = image_style_path($style['name'], $image_uri);
+
+  if ($resolution) {
+    $path_parts = pathinfo($derivative_uri);
+    $derivative_uri = $path_parts['dirname'] . '/' . $resolution . '/' . $path_parts['basename'];
+  }
+
+  // If using the private scheme, let other modules provide headers and
+  // control access to the file.
+  if ($scheme == 'private') {
+    if (file_exists($derivative_uri)) {
+      file_download($scheme, file_uri_target($derivative_uri));
+    }
+    else {
+      $headers = module_invoke_all('file_download', $image_uri);
+      if (in_array(-1, $headers) || empty($headers)) {
+        return drupal_access_denied();
+      }
+      if (count($headers)) {
+        foreach ($headers as $name => $value) {
+          drupal_add_http_header($name, $value);
+        }
+      }
+    }
+  }
+
+  // Don't start generating the image if the derivative already exists or if
+  // generation is in progress in another thread.
+  $lock_name = 'image_style_deliver:' . $style['name'] . ':' . drupal_hash_base64($image_uri);
+  if (!file_exists($derivative_uri)) {
+    $lock_acquired = lock_acquire($lock_name);
+    if (!$lock_acquired) {
+      // Tell client to retry again in 3 seconds. Currently no browsers are known
+      // to support Retry-After.
+      drupal_add_http_header('Status', '503 Service Unavailable');
+      drupal_add_http_header('Retry-After', 3);
+      print t('Image generation in progress. Try again shortly.');
+      drupal_exit();
+    }
+  }
+
+  // Try to generate the image, unless another thread just did it while we were
+  // acquiring the lock.
+  $success = file_exists($derivative_uri) || image_style_create_derivative($style, $image_uri, $derivative_uri);
+
+  if (!empty($lock_acquired)) {
+    lock_release($lock_name);
+  }
+
+  if ($success) {
+    $image = image_load($derivative_uri);
+    file_transfer($image->source, array('Content-Type' => $image->info['mime_type'], 'Content-Length' => $image->info['file_size']));
+  }
+  else {
+    watchdog('image', 'Unable to generate the derived image located at %path.', array('%path' => $derivative_uri));
+    drupal_add_http_header('Status', '500 Internal Server Error');
+    print t('Error generating image.');
+    drupal_exit();
+  }
+}
+
+/**
+ * Check for common desktop patterns in the user agent
+ */
+function adaptive_image_browser_detect() {
+  $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
+
+  // Identify the OS platform. Match only desktop OSs
+  if (strpos($userAgent,'macintosh') ||
+      strpos($userAgent,'windows nt') ||
+      strpos($userAgent,'x11')) {
+    return TRUE;
+  }
+}
diff --git a/htmltest/sites/all/modules/adaptive_image/adaptive_image.info b/htmltest/sites/all/modules/adaptive_image/adaptive_image.info
new file mode 100644
index 00000000..72ae7b77
--- /dev/null
+++ b/htmltest/sites/all/modules/adaptive_image/adaptive_image.info
@@ -0,0 +1,13 @@
+name = Adaptive Image
+description = Support for adaptive images.
+core = 7.x
+
+dependencies[] = image
+
+stylesheets[all][] = css/adaptive-image.css
+; Information added by drupal.org packaging script on 2012-02-24
+version = "7.x-1.4"
+core = "7.x"
+project = "adaptive_image"
+datestamp = "1330097138"
+
diff --git a/htmltest/sites/all/modules/adaptive_image/adaptive_image.module b/htmltest/sites/all/modules/adaptive_image/adaptive_image.module
new file mode 100644
index 00000000..a3c4b5a0
--- /dev/null
+++ b/htmltest/sites/all/modules/adaptive_image/adaptive_image.module
@@ -0,0 +1,237 @@
+<?php
+
+/**
+ * @file
+ * Adaptive Image - Adaptive images for Drupal
+ * @see http://adaptive-images.com/
+ *
+ * @author
+ * Stefan Auditor <stefan.auditor@erdfisch.de>
+ */
+
+/**
+ * Implements hook_init().
+ */
+function adaptive_image_init() {
+  // According to the documentation of hook_init() it should not be used to
+  // load JS or CSS. The CSS case has been moved to the info file. But the JS is
+  // here by intention, as we want it inline to prevent wait time while loading
+  // the script
+
+  // No need for drupal behaviours, jquery compatibility wrapper nor ready event
+  $js = "document.cookie = 'adaptive_image=' + Math.max(screen.width, screen.height) + '; path=/';";
+  drupal_add_js($js,
+    // First-come, first-served
+    array(
+      'type' => 'inline',
+      'scope' => 'header',
+      'group' => JS_LIBRARY,
+      'every_page' => TRUE,
+      'weight' => -500,
+    )
+  );
+}
+
+/**
+ * Implements hook_menu().
+ */
+function adaptive_image_menu() {
+  $items = array();
+
+  // Add image style generation paths adaptive URLs.
+  if (module_exists('image')) {
+    // Generate and deliver image derivatives of public files.
+    $directory_path = file_stream_wrapper_get_instance_by_scheme('public')->getDirectoryPath();
+    $items[$directory_path . '/styles/%image_style/adaptive-image'] = array(
+      'title' => 'Generate image style',
+      'page callback' => 'adaptive_image_style_deliver',
+      'page arguments' => array(count(explode('/', $directory_path)) + 1),
+      'access callback' => TRUE,
+      'type' => MENU_CALLBACK,
+      'file' => 'adaptive_image.image.inc',
+    );
+    // Generate and deliver image derivatives of private files.
+    $items['system/files/styles/%image_style/adaptive-image'] = array(
+      'title' => 'Generate adaptive image style',
+      'page callback' => 'adaptive_image_style_deliver',
+      'page arguments' => array(3),
+      'access callback' => TRUE,
+      'type' => MENU_CALLBACK,
+      'file' => 'adaptive_image.image.inc',
+    );
+  }
+
+  return $items;
+}
+
+/**
+ * Implements hook_image_effect_info().
+ */
+function adaptive_image_image_effect_info() {
+  $effects = array();
+  $effects['adaptive_image'] = array(
+    'label' => t('Adaptive'),
+    'help' => t('Adaptive image scale according to client resolution.'),
+    'effect callback' => 'image_scale_effect',
+    'dimensions callback' => 'image_scale_dimensions',
+    'form callback' => 'adaptive_image_scale_form',
+    'summary theme' => 'adaptive_image_scale_summary',
+  );
+  return $effects;
+}
+
+/**
+ * Form structure for the image scale form.
+ *
+ * Note that this is not a complete form, it only contains the portion of the
+ * form for configuring the scale options. Therefore it does not not need to
+ * include metadata about the effect, nor a submit button.
+ *
+ * @param $data
+ *   The current configuration for this scale effect.
+ */
+function adaptive_image_scale_form($data) {
+  $form['resolutions'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Resolutions'),
+    '#default_value' => isset($data['resolutions']) ? $data['resolutions'] : '1382, 992, 768, 480',
+    '#required' => TRUE,
+    '#description' => t('The resolution break-points to use (screen widths, in pixels).'),
+  );
+  $form['mobile_first'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Mobile first'),
+    '#default_value' => isset($data['mobile_first']) ? $data['mobile_first'] : TRUE,
+    '#description' => t("Check this to send the smallest version when the resolution can not be determined."),
+  );
+
+  $resolutions = explode(',', str_replace(' ', '', $form['resolutions']['#default_value']));
+  $resolution = adaptive_image_resolution($resolutions);
+  // Provide needed defaults
+  $form['height']  = array('#type' => 'hidden','#default_value' => NULL);
+  $form['width']   = array('#type' => 'hidden','#default_value' => $resolution);
+  $form['upscale'] = array('#type' => 'hidden','#default_value' => NULL);
+  return $form;
+}
+
+/**
+ * Implements hook_theme().
+ */
+function adaptive_image_theme() {
+  return array(
+    'adaptive_image_scale_summary' => array(
+      'variables' => array('data' => NULL),
+    ),
+  );
+}
+
+/**
+ * Returns HTML for a summary of an image scale effect.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - data: The current configuration for this scale effect.
+ *
+ * @ingroup themeable
+ */
+function theme_adaptive_image_scale_summary($variables) {
+  $data = $variables['data'];
+  if ($data['resolutions']) {
+    return check_plain($data['resolutions']);
+  }
+}
+
+/**
+ * Implements template_preprocess_image().
+ *
+ * Adds a class to adaptive images for max-width.
+ */
+function adaptive_image_preprocess_image(&$variables) {
+  global $base_url;
+
+  if (isset($variables['style_name'])) {
+    // Get image style settings
+    $style = image_style_load($variables['style_name']);
+
+    // Check if style contains the adaptive image effect
+    if ($style && adaptive_image_contains_effect($style)) {
+      $settings = adaptive_image_effect_settings($style);
+      $resolutions = explode(',', $settings['resolutions']);
+      $resolution = adaptive_image_resolution($resolutions);
+
+      // Only construct direct path if not private
+      if (!strpos($variables['path'], '/system/') && is_numeric($resolution)) {
+        $path_parts = pathinfo($variables['path']);
+        $derivative_uri = $path_parts['dirname'] . '/' . $resolution . '/' . $path_parts['basename'];
+      }
+
+      if (isset($derivative_uri) && file_exists(str_replace($base_url, '.', $derivative_uri))) {
+        // Deliver existing path to bypass menu callback
+        $variables['path'] = $derivative_uri;
+      }
+      else {
+        // Reconstruct the image path to %/%style_name/adaptive-image/% to
+        // trigger image generation or file access check
+        $variables['path'] = str_replace('styles/' . $variables['style_name'], 'styles/' . $variables['style_name'] . '/adaptive-image', $variables['path']);
+      }
+
+      // Add class for styling
+      $variables['attributes']['class'] = 'adaptive-image';
+
+      // Remove fixed image dimensions
+      unset($variables['height']);
+      unset($variables['width']);
+    }
+  }
+}
+
+/**
+ * Check for adaptive image effect from style
+ */
+function adaptive_image_contains_effect($style) {
+  foreach ($style['effects'] as $effect) {
+    if ($effect['name'] == 'adaptive_image') {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Get adaptive image effect from style settings
+ */
+function adaptive_image_effect_settings($style) {
+  $settings = array();
+  foreach ($style['effects'] as $effect) {
+    if ($effect['name'] == 'adaptive_image') {
+      $settings = $effect['data'];
+    }
+  }
+  return $settings;
+}
+
+/**
+ * Determine current resolution
+ */
+function adaptive_image_resolution($resolutions) {
+  $resolution = '';
+  /* Check to see if a valid cookie exists */
+  if (count($resolutions) && isset($_COOKIE['adaptive_image'])) {
+    if (is_numeric($_COOKIE['adaptive_image'])) {
+      $client_width = (int) $_COOKIE['adaptive_image']; // store the cookie value in a variable
+
+      /* the client width in the cookie is valid, now fit that number into the correct resolution break point */
+      rsort($resolutions); // make sure the supplied break-points are in reverse size order
+      $resolution = $resolutions[0]; // by default it's the largest supported break-point
+
+      foreach ($resolutions as $break_point) { // filter down
+        if ($client_width <= $break_point) {
+          $resolution = $break_point;
+        }
+      }
+    } else {
+      setcookie("adaptive_image", "", time() -1); // delete the mangled cookie
+    }
+  }
+  return $resolution;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/modules/adaptive_image/css/adaptive-image.css b/htmltest/sites/all/modules/adaptive_image/css/adaptive-image.css
new file mode 100644
index 00000000..11041d2f
--- /dev/null
+++ b/htmltest/sites/all/modules/adaptive_image/css/adaptive-image.css
@@ -0,0 +1,3 @@
+img.adaptive-image {
+  max-width: 100%;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/modules/addressfield/LICENSE.txt b/htmltest/sites/all/modules/addressfield/LICENSE.txt
new file mode 100644
index 00000000..d159169d
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/LICENSE.txt
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/htmltest/sites/all/modules/addressfield/addresses.txt b/htmltest/sites/all/modules/addressfield/addresses.txt
new file mode 100644
index 00000000..e64b8202
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/addresses.txt
@@ -0,0 +1,298 @@
+AT		NULL	Feldkirch	NULL	6800	Pater Grimm Weg 20	
+AU		NULL	Melbourne	NULL			
+AU		NULL	Sydney	NULL			
+AU	04	NULL	NORMANBY	NULL	4059	30 Normanby Terrace	
+BD		NULL	Dhaka	NULL	1205	23, Subal Das Road, Chowdhury Bazar, Lalbagh	
+BD		NULL	Dhaka	NULL	1207	R-1,H-19,Kallaynpur,Mirpur,Dhaka	
+BD		NULL	Dhaka	NULL	1207	World Bank Office Dhaka, 	 Plot E 32, Agargaon, Sher-E-Bangla Nagar
+BD		NULL	Dhaka	NULL	1209	House# 66B, Flat# B2 	Zigatola
+BD		NULL	Dhaka	NULL	1219	390 West Rampura Dhaka	
+BD		NULL	Dhaka	NULL	1230	Uttara	
+BD	81	NULL	Dhaka	NULL	1000	Institute of Water and Flood Management	
+BD	81	NULL	Dhaka	NULL	1203	84/a maniknagar	
+BD	81	NULL	Dhaka	NULL	1205	Dhaka	Bangladesh
+BD	81	NULL	Dhaka	NULL	1207	BetterStories Limited	17 West Panthopath
+BD	81	NULL	Dhaka	NULL	1216	Mirpur, Dhaka	
+BD	81	NULL	Dhaka	NULL	1230	830, Prembagan, Dhakshin Khan	
+BD	82	NULL	khulna	NULL	9203		
+BD	NULL	NULL	Dhaka	NULL	1000	Institute of Water and Flood Management	
+BD	NULL	NULL	Dhaka	NULL	1207	World Bank Office Dhaka, 	 Plot E 32, Agargaon, Sher-E-Bangla Nagar
+BE		NULL	Brussels	NULL			
+BE		NULL	Watermael-Boitsfort	NULL	1170	Avenue des Staphylins	
+BH		NULL	Manama	NULL	00973	Manama Bahrain	Manama Bahrain
+BR		NULL	Porto Alegre	NULL			
+BR		NULL	Recife	NULL			
+BR	RJ	NULL	Rio de Janeiro	NULL			
+BW		NULL	Francistown	NULL	NULL		
+BW	NULL	NULL	Francistown	NULL	NULL		
+CA		NULL	Montreal	NULL			
+CA		NULL	Toronto	NULL			
+CA	BC	NULL	Vancouver	NULL			
+CA	ON	NULL	Kitchener	NULL			
+CA	ON	NULL	wterloo	NULL	n2l3g1	200 University Avenue West 	
+CH		NULL	Geneva	NULL	1202	15, chemin Louis-Dunant	
+CH	25	NULL	Zurich	NULL	8098	UBS Optimus Foundation	Augustinerhof 1
+DE		NULL	Berlin	NULL			
+DE	05	NULL	Frankfurt am Main	NULL	60386	Johanna-Tesch-Platz 7	
+DK		NULL	Aarhus	NULL			
+ES		NULL	Bilbao	NULL			
+ET	44	NULL	ADDIS ABABA	NULL	11945	ADDIS ABABA,P.O.BOX 11945	
+FI		NULL	Espoo	NULL	02130	Mahlarinne 3B	
+FI		NULL	Helsinki	NULL	00580	Hermannin rantatie 2 A	Hermannin rantatie 2 A
+FI		NULL	Tampere	NULL	33101	Tampere Univerity of Technology	
+FI	13	NULL	Espoo	NULL	02150	Aalto Venture Garage	Betonimiehenkuja 3
+GB		NULL	Exeter	NULL			
+GB		NULL	London	NULL			
+GB		NULL	London	NULL	N4 2DP	2 Myddleton Ave	
+GB		NULL	London	NULL	N7 0AH 	104 St George’s Avenue	
+GB		NULL	London	NULL	SE16 3UL	25 Blue Anchor Lane	
+GB		NULL	London	NULL	SW18 5SP	Flat 1 150 Merton road 	
+GB		NULL	London	NULL	W1T 4BQ	13 Fitzroy Street	
+GB		NULL	Oxford	NULL			
+GB		NULL	Southampton	NULL			
+GB	C3	NULL		NULL	cb244qg	32 market street 	swavesey
+GB	E7	NULL	London	NULL	SE3 7TP		
+GB	F3	NULL	Wood Green	NULL	N22 5RU	6 Cedar House	
+GB	H1	NULL	London	NULL	SE11 5JD	47-49 Durham Street	
+GB	H6	NULL	London	NULL	SE8 4DD	8 Harton St	Deptford
+GB	K2	NULL	Oxford	NULL	OX2 6QY	3 The Villas, Rutherway	
+GH	05	NULL	NSAWAM	NULL	NULL	P.O.BOX 455	
+GH	NULL	NULL	Accra	NULL	NULL		
+ID		NULL	Bandung	NULL	40134	Jalan Sadang Hegar 1 No. 12	RT04 RW13 Sadang Serang
+ID		NULL	Bekasi	NULL	17411	Jl.Binadharma 1 No.62. Jatiwaringin	
+ID		NULL	Jakarta	NULL			
+ID		NULL	Jakarta	NULL	12440	Jl. H. Niin 7	Lebak Bulus, Cilandak
+ID		NULL	Jakarta	NULL	13330	Otista	
+ID		NULL	Jakarta selatan	NULL	12000	jl. rawa jati timur 6 no. 10	
+ID		NULL	Jakarta Timur	NULL		Jl.Mulia No.15B Kel.Bidara Cina, Kec.Jatinegara, Jakarta Timur	
+ID		NULL	Pematang Siantar	NULL	51511	Jl. Durian I 30	
+ID	04	NULL	Bogor	NULL	16165		
+ID	04	NULL	jakarta	NULL		otista	
+ID	04	NULL	Jakarta	NULL	12520	Jl. Pertanian Raya III No.42 Jakarta Selatan Pasar Minggu	
+ID	04	NULL	Jakarta	NULL	13330	Jakarta	
+ID	04	NULL	Jakarta	NULL	13330	Jl Sensus IIC Bidaracina Jaktim	
+ID	04	NULL	Jakarta	NULL	13330	Jl. Bonasut 2 no.22	
+ID	04	NULL	Jakarta	NULL	13330	Otista 64c	
+ID	04	NULL	jakarta	NULL	13330	Otista jaktim	
+ID	04	NULL	Jakarta Timur	NULL	13330	Kebon Sayur I no. 1 RT 10/15	
+ID	04	NULL	Jakarta Timur	NULL	13460	Jl. Pondok Kopi Blok G4/5 RT. 005/08 Jakarta Timur	
+ID	04	NULL	Jakarta Timur	NULL	13810	Jl. Raya Pondok Gede Rt03 Rw08 no.35 , Lubang Buaya, Jakarta Timur	Jl. Raya Pondok Gede Rt03 Rw08 no.35 , Lubang Buaya, Jakarta Timur
+ID	07	NULL	Brebes	NULL	54321	Jl Kersem Blok D14 Perum Taman Indo Kaligangsa Wetan Brebes	
+ID	07	NULL	Semarang	NULL	50143	Puspowarno Tengah 2/2	
+ID	08	NULL	Lumajang	NULL	67373	Desa Tumpeng Kecamatan Candipuro	Lumajang
+ID	30	NULL	Bandung	NULL	55241	Jl Pelesiran No 55A/56	
+ID	30	NULL	Bekasi	NULL	17510	bekasi West Java Indonesia	
+ID	30	NULL	Depok	NULL	16245	Jalan juragan sinda 2 no 10	
+ID	30	NULL	Depok	NULL	16424	Jalan Margonda RayaJalan Kober Gang Mawar 	
+ID	30	NULL	Depok	NULL	16424	Jl. Haji Yahya Nuih no.24, Pondok Cina	
+ID	30	NULL	Depok	NULL	16425	Kukusan Kelurahan	
+ID	30	NULL	Depok	NULL	16518	Jl. Salak No.1/C.88 Durenseribu Bojongsari	
+ID	30	NULL	Depok	NULL	16952	Jl. Merak No.34 -36 Rt.004/014	Jl. Merak No. 34 -36 Rt. 004/014
+ID	36	NULL	biak numfor	NULL	98111	jl. s. mamberamo no 6782 biak numfor	
+IL		NULL	Tel Aviv	NULL			
+IN		NULL	Bangalore	NULL			
+IN		NULL	India	NULL			
+IN		NULL	new delhi	NULL	110003	55 lodi estate	
+IN	07	NULL	NEW DELHI	NULL	110018	15/11 A 1ST FLOOR	TILAK NAGAR
+IN	07	NULL	New Delhu	NULL	110075	B 54 Hilansh Apartments	Plot No 1, Sector 10, Dwarka
+IN	10	NULL	Gurgaon	NULL		D- 201 Ivy Apartments Sushant Lok 1 Gurgaon Haryana	
+IN	13	NULL	Trivandrum	NULL	695010	TC 9/1615, SRMH Road, 	Sasthamangalam, Trivandrum
+IN	16	NULL	Mumbai	NULL	400020	Bharat Mahal, Flat#55	Marine Drive
+IN	16	NULL	Mumbai	NULL	400028	303,Shree Parvati Co-Op Housing Society,	D.L.Vaidya Road,Dadar
+IN	16	NULL	Pune	NULL			
+IN	16	NULL	Pune	NULL		Infosys Campus	Hinjewadi Phase 2
+IN	16	NULL	Pune	NULL	400705	#22 Iris Garden	Gokhale Road
+IN	16	NULL	PUNE	NULL	411043		
+IN	16	NULL	Pune	NULL	411051		
+IN	16	NULL	Pune	NULL	411057	Infosys Ltd. Rajiv gandhi infostech park	Hinjewadi phase 2
+IN	16	NULL	Pune	NULL	412108	Pune	Maharatshtra
+IN	16	NULL	Pune	NULL	433011	502 utkarsh vihar golande state pune	
+IN	19	NULL	Bangalore	NULL	560080	Indian Institute for Human Settlements	IIHS Bangalore City Campus, Sadashivanagar,
+IN	19	NULL	Bangalore	NULL	560100	electronic city	
+IN	19	NULL	Bhalki	NULL	585411	bhalki,bidar ,karnataka	karnataka
+IN	24	NULL	Jaipur	NULL	302011	Institute of Health Management Research	1, Prabhu Dayal Marg
+IR	26	NULL	Tehran	NULL	1118844454	Baharestan sq. mostafa khomeini str., javahery Ave., no. 11, 	
+IT		NULL	Trento	NULL			
+JM	08	NULL	Kingston	NULL	Kgn 7	MOna Campus UWI	
+KE		NULL	Nairobi	NULL			
+KE	05	NULL	Nairobi	NULL	30300	212,kapsabet 	
+KH	NULL	NULL	Phnom Penh	NULL			
+LR		NULL	Monrovia	NULL	00000		
+NG	11	NULL	Abuja	NULL	930001	17 Bechar street	Wuse zone 2
+PE	15	NULL	Lima	NULL	18	Lima	Lima
+PE	15	NULL	Lima	NULL	Lima 18	123	Miraflores
+PE	NULL	NULL	Lima	NULL	03	Calle Granada 104	
+PE	NULL	NULL	Lima	NULL	18	Lima	Lima
+PH		NULL	Manila	NULL		Globe Telepark	111 Valero Street
+PH		NULL	Quezon Coty	NULL	1109	86 Harvard Street,  Cubao, Quezon City, Philippines	84 Harvard Street, Cubao, Quezon City,hilippines
+PH	20	NULL	Silang	NULL	4118	370 Bayungan Kaong Silang Cavite	
+PH	57	NULL	Kidapawan	NULL	9400	Kidapawan City	Kidapawan City
+PH	66	NULL	zamboanga	NULL	7000	29-tripplet rd san jose	29-tripplet rd san jose
+PH	D9	NULL	Pasig City	NULL		World Bank Office Manila, 20/F Taipan Place	F. Ortigas Jr. Road, Ortigas Center 
+PK		NULL	Lahore	NULL	54000	17-R Model Town Lahore	
+PK		NULL	Lahore	NULL	54000	53- chamber lane road Lahore	
+PK		NULL	Lahore	NULL	54000	85 E block Model Town 	
+PK		NULL	Lahore	NULL	54000	House no 227, street no 5, Imamia Colony Shahadra Lahore	
+PK		NULL	LAHORE	NULL	54000	room no.6 khalid bim waleed hall, near New Anarkali,  LAHORE	room no.6 khalid bim waleed hall, near New Anarkali,  LAHORE
+PK		NULL	Lahore	NULL	pk097	LUMS, Lahore, 	
+PK		NULL	Sheikhupura	NULL	03935	D.H.Q.Hospital Sheikhupura House number 08.	Room no 109 Khalid bin waleed haal, punjab University lahore old campus.
+PK	02	NULL	Quetta	NULL	87000	Postal Address 87000, Kuchlak, Quetta, Balochistan.	H#24 Peer Abul Khair road Quetta, Balochistan.
+PK	02	NULL	Quetta	NULL	87300	block no-1 falt no. 7 New Crime Branch Abbas Ali Road Cantt	
+PK	02	NULL	Quetta	NULL	87300	Flat no. 3 Shafeen Centre Jinnah Town ,Near I.T university , Quetta	
+PK	02	NULL	Quetta	NULL	87300	H-no. C-220 Zarghoonabad Phase-2 , Nawa Killi ,Quetta 	
+PK	04	NULL	burewala	NULL	60101	 Fatima Fayyaz Hazrat Sakina hall girls hostel number 9 Punjab university Lahore Pakistan	Sardar Wajid Azim Azeem abad Burewala dist Vehari Pakistan
+PK	04	NULL	Faisalabad	NULL	38000	P 101/1, Green Town, Millat Road, Faisalabad	
+PK	04	NULL	Islamabad	NULL	44000	P.O Tarlai kalan chappar Islamabad	
+PK	04	NULL	lahore	NULL			
+PK	04	NULL	Lahore	NULL	54000		
+PK	04	NULL	lahore	NULL	54000	 Street No.63 House 36/A  Al-madad Pak Colony Ravi Road, Lahore.	 Street No.63 House 36/A  Al-madad Pak Colony Ravi Road, Lahore.
+PK	04	NULL	Lahore	NULL	54000	1149-1-D2 Green Town 	Lahore
+PK	04	NULL	Lahore	NULL	54000	124, street# 2, karim block Allama Iqbal Town lahore.	124, street# 2, karim block Allama Iqbal Town lahore.
+PK	04	NULL	Lahore	NULL	54000	150 A Qila Lachman Singh Ravi Road lahore	
+PK	04	NULL	Lahore	NULL	54000	166/1L DHA Lahore	
+PK	04	NULL	Lahore	NULL	54000	172 A2 Township Lahore	
+PK	04	NULL	Lahore	NULL	54000	183,S/Block, Model Town, Lhr	
+PK	04	NULL	lahore	NULL	54000	19- A block ,Eden Lane Villas Raiwind Road ,Lahore	
+PK	04	NULL	lahore	NULL	54000	3-c kaliyar road opposite kids lyceum, rustam park near mor samnabad	
+PK	04	NULL	Lahore	NULL	54000	31 Saeed Block, Canal Bank Scheme	
+PK	04	NULL	Lahore	NULL	54000	31c DHA Lahore	
+PK	04	NULL	Lahore	NULL	54000	387 E1 wapda town, Lahore	
+PK	04	NULL	Lahore	NULL	54000	45-D dha eme sector multan road,lahore	
+PK	04	NULL	Lahore	NULL	54000	5 Zafar Ali Road	
+PK	04	NULL	Lahore	NULL	54000	54-R	PGECHS
+PK	04	NULL	lahore	NULL	54000	566 E-1 johar town lahore	566 E-1 johar town lahore
+PK	04	NULL	Lahore	NULL	54000	82/1 Z Block, Phase 3	DHA
+PK	04	NULL	Lahore	NULL	54000	A-1 VRI Zarrar shaheed road lahore cantt	A-1 VRI Zarrar shaheed road lahore cantt
+PK	04	NULL	lahore	NULL	54000	e5/39D street 6 zaman colony cavalry ground ext	
+PK	04	NULL	Lahore	NULL	54000	Ho # 61, Block G3, Johar Town Lahore	
+PK	04	NULL	LAhore	NULL	54000	House #19-A street #5 Usman nagr Ghaziabad  Lahore	
+PK	04	NULL	lahore	NULL	54000	House no 692 street no 67 sadar bazar	
+PK	04	NULL	Lahore	NULL	54000	Khosa Law Chamber	1 Turner Road
+PK	04	NULL	Lahore	NULL	54000	Lahore,Pakistan	Lahore,Pakistan
+PK	04	NULL	Lahore	NULL	54000	room no 69, khalid bin waleed hall, anarkali	
+PK	04	NULL	Lahore	NULL	54000	Suite # 8, Al-Hafeez Suites,	Gulberg II
+PK	04	NULL	Lahore	NULL	54085	199 Shadman 2	
+PK	04	NULL	Lahore	NULL	54300	Mughalpura Lahore Pakistan	
+PK	04	NULL	Lahore	NULL	54660	SD 69 falcon complex gulberg III lahore	
+PK	04	NULL	lahore	NULL	54800	764-G4 johar town ,lahore	
+PK	04	NULL	Rawalpindi	NULL	44000	House 522, F-Block Sattellite Town, Rawalpindi	
+PK	04	NULL	Rawalpindi	NULL	46000	1950/c, Indusroad 2, Tariqabad, Rawalpindi Cantt	
+PK	04	NULL	Rawalpindi	NULL	46000	House 54-E Lane 9 Sector 4, AECHS Chaklala Rawalpindi	
+PK	04	NULL	Rawalpindi	NULL	46000	House B-1343, Sattellite town Rawalpindi	
+PK	04	NULL	Rawalpindi	NULL	46000	House CB-299F, Street 1, Lane 4 Peshawar Road Rawalpindi	
+PK	04	NULL	Rawalpindi	NULL	46300	House No 1518 Umer Block phase 8 	BehriaTown
+PK	04	NULL	sialkot	NULL	51310	The National Model School, Ismaiealabad, Pacca Garah Sialkot	
+PK	08	NULL	Islamabad	NULL		CIomsats Institute of Information Technology Islamabad	
+PK	08	NULL	Islamabad	NULL	38700	COMSATS tarlai boys hostel Islamabad.	COMSATS tarlai boys hostel Islamabad (Room 30)
+PK	08	NULL	Islamabad	NULL	44000		
+PK	08	NULL	Islamabad	NULL	44000	House # 256, Street # 9, Shahzad Town, Islamabad.	
+PK	08	NULL	Islamabad	NULL	44000	Islamabad , Comsats University Islamabd ,Pakistan	
+PK	08	NULL	Islamabad	NULL	44000	World Bank Building	Sector G 5
+PK	08	NULL	lahore	NULL	54000	3c zafar ali road gulburg 5	3c zafar ali road gulburg 5
+PK	08	NULL	lahore	NULL	54000	49-a bilal park, chaburgy 	49-a bilal park, chaburgy 
+PK	NULL	NULL	Lahore	NULL	54000		
+PK	NULL	NULL	Lahore	NULL	54000	85 E block Model Town 	
+SN	01	NULL		NULL		ouakam cité comico en face 217	
+SN	01	NULL	Dakar	NULL			
+SN	01	NULL	Dakar	NULL		IDEV-ic Patte d'oie Builder's Villa B11	
+SN	01	NULL	Dakar	NULL		liberte 6/ dakar	
+SN	01	NULL	Dakar	NULL		ngor	
+SN	01	NULL	Dakar	NULL	4027	ZAC Mbao	Cité Fadia
+SN	NULL	NULL	Dakar	NULL		IDEV-ic Patte d'oie Builder's Villa B11	
+TZ		NULL	Dar es Salaam	NULL	NULL		
+TZ		NULL	Dar es salaam	NULL	NULL	76021 Dar es salaam	1507 Morogoro
+TZ		NULL	Dar es salaam	NULL	NULL	dar es salaam	nassoro.ahmedy@yahoo.com
+TZ		NULL	DAR ES SALAAM	NULL	NULL	dar es salaam	UDSM
+TZ		NULL	Dar es salaam	NULL	NULL	NA	
+TZ		NULL	DAR ES SALAAM	NULL	NULL	P O BOX 23409 	
+TZ		NULL	dar es salaam	NULL	NULL	p. o. box 104994	
+TZ		NULL	Dar es Salaam	NULL	NULL	P.o. BOX 71415 Dar es Salaam	
+TZ		NULL	Dar es Salaam	NULL	NULL	P.O.BOx 66675 DSM	
+TZ		NULL	Dar es salaam	NULL	NULL	Tz	Tz
+TZ		NULL	dsm	NULL	NULL		
+TZ	02	NULL	Bagamoyo	NULL	NULL	PO.Box 393 	
+TZ	02	NULL	Dar es salaam	NULL	NULL	22548	
+TZ	03	NULL	Dar-es-salaam	NULL	NULL	Dodoma Municipal	Kimara, Dar-es-salaa,
+TZ	23	NULL	Dar es Salaam	NULL	NULL		
+TZ	23	NULL	dar es salaam	NULL	NULL	35074 	
+TZ	23	NULL	dar es salaam	NULL	NULL	67389	
+TZ	23	NULL	Dar es Salaam	NULL	NULL	COSTECH, Dar es Salaam, Tanzania	
+TZ	23	NULL	Dar es salaam	NULL	NULL	na	
+TZ	23	NULL	dar es salaam	NULL	NULL	p o box 60164	
+TZ	23	NULL	dar es salaam	NULL	NULL	P. O. Box 77588	
+TZ	23	NULL	dar es salaam	NULL	NULL	P.O BOX 78144	
+TZ	23	NULL	Dar es Salaam	NULL	NULL	P.O.BOX 78373	
+TZ	23	NULL	Dar es salaam	NULL	NULL	UDSM	Dar es Salaam
+TZ	23	NULL	Dar es salaam	NULL	NULL	udsm	udsm
+TZ	23	NULL	Temeke	NULL	NULL	P.O. Box 50127	
+TZ	NULL	NULL	Dar es Salaam	NULL	NULL		
+TZ	NULL	NULL	Dar es Salaam	NULL	NULL	Kigoma	
+TZ	NULL	NULL	Dar es Salaam	NULL	NULL	Mwanza	
+UG		NULL	Kampala	NULL	NULL		
+UG		NULL	Kampala	NULL	NULL	Kampala Uganda East Africa	
+US		NULL	London	NULL	SE1 8RT	Capital Tower	91 Waterloo Road
+US	CA	NULL	Los Angeles	NULL			
+US	CA	NULL	Pleasanton	NULL	94588	3412 Pickens Lane	
+US	CA	NULL	Sacramento	NULL			
+US	CA	NULL	San Francisco	NULL			
+US	CA	NULL	seattle	NULL	98113	1234 1st st	
+US	CO	NULL	Denver	NULL	80235	6666 West Quincy Ave	
+US	CT	NULL	Greenwich	NULL	06830	140 Milbank	
+US	CT	NULL	Hartford	NULL	06106	Center for Urban and Global Studies at Trinity College, 	70 Vernon Street
+US	DC	NULL	Washington	NULL			
+US	DC	NULL	Washington	NULL	20007	World Bank Headquarters	1818 H Street NW
+US	DC	NULL	Washington	NULL	20010		
+US	DC	NULL	Washington	NULL	20036		
+US	DC	NULL	Washington	NULL	20405	1889 F St NW	
+US	DC	NULL	Washington	NULL	20433		
+US	DC	NULL	Washington	NULL	20433	1818 H Street NW	
+US	DC	NULL	Washington	NULL	20433	1818H St	
+US	DC	NULL	Washington 	NULL	20433	1818 H Street NW	
+US	DC	NULL	Washington DC	NULL	20005	1424, K Street, NW	Suite 600
+US	DC	NULL	Washington DC	NULL	20010	1818 H Street, NW	
+US	DC	NULL	Washington, DC	NULL	20003	1818 H Street NW	
+US	DE	NULL	Virgin Islands|Charlotte Amalie,Cruz Bay,Christiansted	NULL		Morocco|Tafraout,Rabat,Tangier,Tetouan,Casablanca,Marrakesh,Fez,Oujda,Meknes,Agadir	United Arab Emirates|Garhoud,Dubai,Bur Dubai,Ras al Khaymah,Abu Dhabi,Ajman,Al Fujayrah,Sharjah
+US	FL	NULL	Falmouth	NULL		Falmouth	Falmouth
+US	FL	NULL	Lilongwe	NULL		Lilongwe	Lilongwe
+US	GA	NULL	Atlanta	NULL			
+US	GU	NULL	Herndon	NULL	15642	Ht	USA
+US	GU	NULL	Miami	NULL		Miami	Miami
+US	MD	NULL	Gaithersburg	NULL	20877	554 N Frederick Avenue Suite 216	
+US	MD	NULL	Potomac	NULL	20854	14 Sandalfoot Court	
+US	MD	NULL	Silver Spring	NULL	20901	9202 Whitney St.	
+US	MI	NULL	Traverse City	NULL	49685	PO Box 792	
+US	ND	NULL	Pirassununga	NULL		Pirassununga	Pirassununga
+US	NJ	NULL	Princeton	NULL			
+US	NY	NULL	Brooklyn	NULL	11206-1980	25 Montrose Ave. Apt 304	
+US	NY	NULL	Brooklyn	NULL	11225	975 washington ave	2d
+US	NY	NULL	Brooklyn	NULL	11217	150 4TH AVE APT 9E	
+US	NY	NULL	New York	NULL			
+US	NY	NULL	New York	NULL	10013	148 Lafayette St. PH	
+US	NY	NULL	New York	NULL	10017	UNICEF	3 UN Plaza
+US	NY	NULL	New York	NULL	10019	25 Columbus Circle	Suite 52E
+US	NY	NULL	New York	NULL	10024	65 West 85th Street	3A
+US	NY	NULL	New York	NULL	10027	606 W. 116th Street #22	
+US	NY	NULL	New York	NULL	10037		
+US	NY	NULL	Rochester	NULL			
+US	NY	NULL	Scarsdale	NULL	10583-1423	54 Walworth Avenue	
+US	OR	NULL	Portland	NULL			
+US	PA	NULL	Philadelphia	NULL			
+US	PA	NULL	Philadelphia	NULL			
+US	PR	NULL	Colonel Hill	NULL		Colonel Hill	Colonel Hill
+US	SD	NULL	Banjul	NULL		Banjul	Banjul
+US	SD	NULL	London	NULL		London	London
+US	TX	NULL	Aledo	NULL	76008	1588 Hunterglenn Dr	
+US	TX	NULL	Keller	NULL	76248	810 Placid View Ct.	
+US	WA	NULL	Seattle	NULL			
+ZA		NULL	Cape Town	NULL			
+ZA		NULL	Cape Town	NULL	7945	Alexander Road	Muizenberg
+ZA		NULL	Pretoria	NULL			
+ZA	11	NULL	Cape Town	NULL			
+ZA	11	NULL	Cape Town	NULL	7435	PostNet Suite #57, Private Bag X18	Milnerton
+ZA	11	NULL	Cape town	NULL	7508	24 Solyet Court, Lansdowne Road	Claremont
+ZA	11	NULL	Cape Town	NULL	7701		
+ZA	11	NULL	Cape Town	NULL	7785	10 Nyamakazi Road Luzuko Park Phillipi East 	
+ZA	11	NULL	Cape Town	NULL	7915	66 Albert Rd 	
+ZA	11	NULL	Cape Town	NULL	8001	210 Long Street	
+ZM		NULL	Lusaka	NULL			
+ZM	09	NULL	LUSAKA	NULL	10101	P.O. BOX FW 174	
diff --git a/htmltest/sites/all/modules/addressfield/addressfield-rtl.css b/htmltest/sites/all/modules/addressfield/addressfield-rtl.css
new file mode 100644
index 00000000..d979946d
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/addressfield-rtl.css
@@ -0,0 +1,10 @@
+div.addressfield-container-inline > div.form-item {
+  float: right;
+  margin-right: 0;
+  margin-left: 1em;
+}
+
+div.addressfield-container-inline.country-GB > div.form-item {
+  margin-left: auto;
+  margin-right: 0;
+}
diff --git a/htmltest/sites/all/modules/addressfield/addressfield.api.php b/htmltest/sites/all/modules/addressfield/addressfield.api.php
new file mode 100644
index 00000000..0d0d964b
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/addressfield.api.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * @file
+ * API documentation for Addressfield.
+ */
+
+/**
+ * Format generation callback.
+ *
+ * @param $format
+ *   The address format being generated.
+ * @param $address
+ *   The address this format is generated for.
+ * @param $context
+ *   An associative array of context information pertaining to how the address
+ *   format should be generated. If no mode is given, it will initialize to the
+ *   default value. The remaining context keys should only be present when the
+ *   address format is being generated for a field:
+ *   - mode: either 'form' or 'render'; defaults to 'render'.
+ *   - field: the field info array.
+ *   - instance: the field instance array.
+ *   - langcode: the langcode of the language the field is being rendered in.
+ *   - delta: the delta value of the given address.
+ *
+ * @ingroup addressfield_format
+ */
+function CALLBACK_addressfield_format_callback(&$format, $address, $context = array()) {
+  // No example.
+}
+
+/**
+ * Allows modules to add arbitrary AJAX commands to the array returned from the
+ * standard address field widget refresh.
+ *
+ * @param &$commands
+ *   The array of AJAX commands used to refresh the address field widget.
+ * @param $form
+ *   The rebuilt form array.
+ * @param $form_state
+ *   The form state array from the form.
+ *
+ * @see addressfield_standard_widget_refresh()
+ */
+function hook_addressfield_standard_widget_refresh_alter(&$commands, $form, $form_state) {
+  // Display an alert message.
+  $commands[] = ajax_command_alert(t('The address field widget has been updated.'));
+}
diff --git a/htmltest/sites/all/modules/addressfield/addressfield.css b/htmltest/sites/all/modules/addressfield/addressfield.css
new file mode 100644
index 00000000..c72f468f
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/addressfield.css
@@ -0,0 +1,33 @@
+div.addressfield-container-inline > div.form-item {
+  float: left; /* LTR */
+  margin-right: 1em; /* LTR */
+}
+
+div.addressfield-container-inline.country-GB > div.form-item {
+  float: none;
+  margin-right: auto; /* LTR */
+}
+
+div.addressfield-container-inline.country-BR > div.form-item:first-child,
+div.addressfield-container-inline.country-BR > div.form-item:last-child {
+  clear: both;
+  float: none;
+  margin-right: auto; /* LTR */
+}
+
+/* Clear-fix markup for the inline container */
+div.addressfield-container-inline:after {
+  content: ".";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+}
+/* IE6 */
+* html div.addressfield-container-inline {
+  height: 1%;
+}
+/* IE7 */
+*:first-child + html div.addressfield-container-inline {
+  min-height: 1%;
+}
diff --git a/htmltest/sites/all/modules/addressfield/addressfield.devel_generate.inc b/htmltest/sites/all/modules/addressfield/addressfield.devel_generate.inc
new file mode 100644
index 00000000..36810703
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/addressfield.devel_generate.inc
@@ -0,0 +1,65 @@
+<?php
+
+/*
+ * @file
+ * Devel Generate for addressfield module
+ *
+ */
+
+/*
+ * Implements hook_devel_generate();
+ */
+function addressfield_devel_generate($object, $field, $instance, $bundle) {
+  if (field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_CUSTOM) {
+    return devel_generate_multiple('_addressfield_devel_generate', $object, $field, $instance, $bundle);
+  }
+  else {
+    return _addressfield_devel_generate($object, $field, $instance, $bundle);
+  }
+}
+
+/*
+ * Helper function to generate a greeky US-based address
+ */
+function _addressfield_devel_generate($object, $field, $instance, $bundle) {
+  // Set default value
+  $object_field = addressfield_default_values();
+  $addresses = _addressfield_sample_addresses();
+  $object_field = array_merge($object_field, $addresses[array_rand($addresses)]);
+  unset($object_field['data']);
+  return $object_field;
+}
+
+/**
+ * Returns an array of sample addresses.
+ *
+ * @return
+ *   An array of addressfield arrays
+ */
+function _addressfield_sample_addresses() {
+  $fields = &drupal_static(__FUNCTION__);
+  if (!isset($fields)) {
+    $filepath = DRUPAL_ROOT . '/' . drupal_get_path('module', 'addressfield');
+    $fields = array();
+    if ($handle = @fopen("$filepath/addresses.txt",'r')) {
+      if (is_resource($handle)) {
+        $addresses = array();
+        while (($buffer = fgets($handle)) !== false) {
+          list($country, $administrative_area, $sub_administrative_area, $locality, $dependent_locality, $postal_code, $thoroughfare, $premise) = explode("\t", $buffer);
+          $fields[] = array(
+            'country' => ($country == 'NULL') ? NULL : trim($country),
+            'administrative_area' => ($administrative_area == 'NULL') ? NULL : trim($administrative_area),
+            'sub_administrative_area' => ($sub_administrative_area == 'NULL') ? NULL : trim($sub_administrative_area),
+            'locality' => ($locality == 'NULL') ? NULL : trim($locality),
+            'dependent_locality' => ($dependent_locality == 'NULL') ? NULL : trim($dependent_locality),
+            'postal_code' => ($postal_code == 'NULL') ? NULL : trim($postal_code),
+            'thoroughfare' => ($thoroughfare == 'NULL') ? NULL : trim($thoroughfare),
+            'premise' => ($premise == 'NULL') ? NULL : trim($premise),
+          );
+        }
+      }
+      fclose($handle);
+    }
+  }
+  return $fields;
+}
diff --git a/htmltest/sites/all/modules/addressfield/addressfield.feeds.inc b/htmltest/sites/all/modules/addressfield/addressfield.feeds.inc
new file mode 100644
index 00000000..2b8537ad
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/addressfield.feeds.inc
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * @file
+ * Integration with the Feeds module.
+ */
+
+/**
+ * Implements hook_feeds_node_processor_targets_alter().
+ */
+function addressfield_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_name) {
+  foreach (field_info_instances($entity_type, $bundle_name) as $name => $instance) {
+    $info = field_info_field($name);
+    if ($info['type'] == 'addressfield') {
+      foreach ($info['columns'] as $sub_field => $schema_info) {
+        $name_label = $instance['label'] . ': ' . drupal_ucfirst(str_replace('_', ' ', $sub_field));
+        $targets[$name . ':' . $sub_field] = array(
+          'name' => $name_label,
+          'callback' => 'addressfield_set_target',
+          'real_target' => $info['field_name'],
+          'description' => $schema_info['description'],
+        );
+      }
+    }
+  }
+}
+
+/**
+ * Callback for hook_feeds_processor_targets_alter().
+ *
+ * @param $source
+ *   Field mapper source settings.
+ * @param $entity
+ *   An entity object, for instance a node object.
+ * @param $target
+ *   A string identifying the target on the node.
+ * @param $value
+ *   The value to populate the target with.
+ */
+function addressfield_set_target($source, $entity, $target, $values) {
+  list($field_name, $sub_field) = explode(':', $target, 2);
+
+  // Convert the values into an array if it isn't one already to correspond to
+  // Drupal's handling of field value arrays.
+  if (!is_array($values)) {
+    $values = array($values);
+  }
+
+  // If the field is already set on the given entity, update the existing value
+  // array. Otherwise start with a fresh field value array.
+  $field = isset($entity->$field_name) ? $entity->$field_name : array();
+
+  // Loop over the field values array...
+  foreach ($values as $delta => $value) {
+    $field[LANGUAGE_NONE][$delta][$sub_field] = $value;
+  }
+
+  $entity->$field_name = $field;
+}
diff --git a/htmltest/sites/all/modules/addressfield/addressfield.info b/htmltest/sites/all/modules/addressfield/addressfield.info
new file mode 100644
index 00000000..41c4c26f
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/addressfield.info
@@ -0,0 +1,17 @@
+name = Address Field
+description = Manage a flexible address field, implementing the xNAL standard.
+core = 7.x
+package = Fields
+
+dependencies[] = ctools
+
+files[] = addressfield.migrate.inc
+files[] = views/addressfield_views_handler_field_country.inc
+files[] = views/addressfield_views_handler_filter_country.inc
+
+; Information added by Drupal.org packaging script on 2013-12-06
+version = "7.x-1.0-beta5"
+core = "7.x"
+project = "addressfield"
+datestamp = "1386309505"
+
diff --git a/htmltest/sites/all/modules/addressfield/addressfield.install b/htmltest/sites/all/modules/addressfield/addressfield.install
new file mode 100644
index 00000000..ada59129
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/addressfield.install
@@ -0,0 +1,186 @@
+<?php
+
+/**
+ * Implements hook_field_schema()
+ */
+function addressfield_field_schema() {
+  $columns = array(
+    'country' => array(
+      'description' => 'Two letter ISO country code of this address.',
+      'type' => 'varchar',
+      'length' => 2,
+      'not null' => FALSE,
+      'default' => '',
+    ),
+    'administrative_area' => array(
+      'description' => 'The administrative area of this address. (i.e. State/Province)',
+      'type' => 'varchar',
+      'length' => 255,
+      'default' => '',
+      'not null' => FALSE,
+    ),
+    'sub_administrative_area' => array(
+      'description' => 'The sub administrative area of this address.',
+      'type' => 'varchar',
+      'length' => 255,
+      'default' => '',
+      'not null' => FALSE,
+    ),
+    'locality' => array(
+      'description' => 'The locality of this address. (i.e. City)',
+      'type' => 'varchar',
+      'length' => 255,
+      'default' => '',
+      'not null' => FALSE,
+    ),
+    'dependent_locality' => array(
+      'description' => 'The dependent locality of this address.',
+      'type' => 'varchar',
+      'length' => 255,
+      'default' => '',
+      'not null' => FALSE,
+    ),
+    'postal_code' => array(
+      'description' => 'The postal code of this address.',
+      'type' => 'varchar',
+      'length' => 255,
+      'default' => '',
+      'not null' => FALSE,
+    ),
+    'thoroughfare' => array(
+      'description' => 'The thoroughfare of this address. (i.e. Street address)',
+      'type' => 'varchar',
+      'length' => 255,
+      'default' => '',
+      'not null' => FALSE,
+    ),
+    'premise' => array(
+      'description' => 'The premise of this address. (i.e. Apartment / Suite number)',
+      'type' => 'varchar',
+      'length' => 255,
+      'default' => '',
+      'not null' => FALSE,
+    ),
+    'sub_premise' => array(
+      'description' => 'The sub_premise of this address.',
+      'type' => 'varchar',
+      'length' => 255,
+      'default' => '',
+      'not null' => FALSE,
+    ),
+    'organisation_name' => array(
+      'description' => 'Contents of a primary OrganisationName element in the xNL XML.',
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => FALSE,
+      'default' => '',
+    ),
+    'name_line' => array(
+      'description' => 'Contents of a primary NameLine element in the xNL XML.',
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => FALSE,
+      'default' => '',
+    ),
+    'first_name' => array(
+      'description' => 'Contents of the FirstName element of a primary PersonName element in the xNL XML.',
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => FALSE,
+      'default' => '',
+    ),
+    'last_name' => array(
+      'description' => 'Contents of the LastName element of a primary PersonName element in the xNL XML.',
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => FALSE,
+      'default' => '',
+    ),
+    'data' => array(
+      'description' => 'Additional data for this address.',
+      'type' => 'text',
+      'size' => 'big',
+      'not null' => FALSE,
+      'serialize' => TRUE,
+    ),
+  );
+
+  return array(
+    'columns' => $columns,
+    // TODO Add indexes.
+  );
+}
+
+/**
+ * Update the field configuration to the new plugin structure.
+ */
+function addressfield_update_7000() {
+  // Enable ctools.
+  if (!module_enable(array('ctools'))) {
+    throw new Exception('This version of addressfield requires ctools, but it could not be enabled.');
+  }
+
+  // Get the list of fields of type 'addressfield'.
+  $address_fields = array();
+  foreach (field_info_fields() as $field_name => $field_info) {
+    if ($field_info['type'] == 'addressfield') {
+      $address_fields[$field_name] = $field_name;
+    }
+  }
+
+  foreach (field_info_instances() as $entity_type => $bundles) {
+    foreach ($bundles as $bundle_name => $instances) {
+      foreach (array_intersect_key($instances, $address_fields) as $field_name => $instance) {
+        $widget_settings = &$instance['widget']['settings'];
+
+        if ($instance['widget']['type'] == 'addressfield_standard') {
+          // Default to use the country-based address widget.
+          $format_handlers = array('address');
+
+          // Map the old 'name_format' setting to the name and organization widgets.
+          if (in_array($widget_settings['name_format'], array('name_line_organisation', 'first_last_organisation'))) {
+            $format_handlers[] = 'organisation';
+          }
+          if (in_array($widget_settings['name_format'], array('name_line', 'name_line_organisation'))) {
+            $format_handlers[] = 'name-oneline';
+          }
+          else {
+            $format_handlers[] = 'name-full';
+          }
+          unset($widget_settings['name_format']);
+          $widget_settings['format_handlers'] = $format_handlers;
+        }
+
+        // Update displays.
+        foreach ($instance['display'] as $view_mode => &$view_mode_info) {
+          $display_settings = &$view_mode_info['settings'];
+
+          if ($view_mode_info['type'] == 'addressfield_default') {
+            if (isset($widget_settings['format_handlers'])) {
+              $display_settings['use_widget_handlers'] = 1;
+            }
+            else {
+              // If the widget is non-standard, just use a sane default.
+              $display_settings['use_widget_handlers'] = 0;
+              $display_settings['format_handlers'] = array('address', 'name-oneline');
+            }
+          }
+          else if ($view_mode_info['type'] == 'addressfield_name') {
+            // Migrate the 'addressfield_name' formatter to the new framework.
+            $view_mode_info['type'] = 'addressfield_default';
+            // Start from the widget configuration.
+            $display_settings['use_widget_handlers'] = 0;
+            $display_settings['format_handlers'] = isset($widget_settings['format_handlers']) ? $widget_settings['format_handlers'] : array('address', 'name-oneline');
+
+            if (empty($display_settings['organisation'])) {
+              $display_settings['format_handlers'] = array_diff( $display_settings['format_handlers'], array('organisation'));
+            }
+            unset($display_settings['organisation']);
+          }
+        }
+
+        field_update_instance($instance);
+      }
+    }
+  }
+}
diff --git a/htmltest/sites/all/modules/addressfield/addressfield.migrate.inc b/htmltest/sites/all/modules/addressfield/addressfield.migrate.inc
new file mode 100644
index 00000000..6e74d63f
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/addressfield.migrate.inc
@@ -0,0 +1,172 @@
+<?php
+
+/**
+ * @file
+ * Base integration with the Migrate API class.
+ */
+
+/**
+ * Implements hook_migrate_api().
+ */
+function addressfield_migrate_api() {
+  $api = array(
+    'api' => 2,
+    'field handlers' => array('MigrateAddressFieldHandler'),
+  );
+  return $api;
+}
+
+/**
+ * Primary value passed to this field must be the two letter ISO country code of
+ * the address.
+ *
+ * Arguments are used to specify all the other values:
+ *   'administrative_area' - The administrative area of this address. (i.e. State/Province)
+ *   'sub_administrative_area' - The sub administrative area of this address.
+ *   'locality' - The locality of this address. (i.e. City)
+ *   'dependent_locality' - The dependent locality of this address.
+ *   'postal_code' - The postal code of this address.
+ *   'thoroughfare' - The thoroughfare of this address. (i.e. Street address)
+ *   'premise' - The premise of this address. (i.e. Apartment / Suite number)
+ *   'sub_premise' - The sub_premise of this address.
+ *   'organisation_name' - Contents of a primary OrganisationName element in the xNL XML.
+ *   'name_line' - Contents of a primary NameLine element in the xNL XML.
+ *   'first_name' - Contents of the FirstName element of a primary PersonName element in the xNL XML.
+ *   'last_name' - Contents of the LastName element of a primary PersonName element in the xNL XML.
+ *   'data' - Additional data for this address.
+ *
+ * Add the source field mappings to the argument array then add null mappings to
+ * avoid having fields flagged as as unmapped:
+ * @code
+ *   // The country should be passed in as the primary value.
+ *   $this->addFieldMapping('field_address', 'profile_country');
+ *   $this->addFieldMapping('field_address:thoroughfare', 'profile_address');
+ *   $this->addFieldMapping('field_address:locality', 'profile_city');
+ *   $this->addFieldMapping('field_address:administrative_area', 'profile_state');
+ * @endcode
+ */
+class MigrateAddressFieldHandler extends MigrateFieldHandler {
+  public function __construct() {
+    $this->registerTypes(array('addressfield'));
+  }
+
+  /**
+   * Provide subfields for the addressfield columns.
+   */
+  public function fields() {
+    // Declare our arguments to also be available as subfields.
+    $fields = array(
+      'administrative_area' => t('<a href="@doc">The administrative area of ' .
+          'this address (i.e. State/Province)</a>',
+        array('@doc' => 'http://drupal.org/node/1996546#administrative_area')),
+      'sub_administrative_area' => t('<a href="@doc">The sub administrative ' .
+          'area of this address</a>',
+        array('@doc' => 'http://drupal.org/node/1996546#sub_administrative_area')),
+      'locality' => t('<a href="@doc">The locality of this address (i.e. ' .
+          'City)</a>',
+        array('@doc' => 'http://drupal.org/node/1996546#locality')),
+      'dependent_locality' => t('<a href="@doc">The dependent locality of ' .
+          'this address</a>',
+        array('@doc' => 'http://drupal.org/node/1996546#dependent_locality')),
+      'postal_code' => t('<a href="@doc">The postal code of this address</a>',
+        array('@doc' => 'http://drupal.org/node/1996546#postal_code')),
+      'thoroughfare' => t('<a href="@doc">The thoroughfare of this address ' .
+          '(i.e. Street address)</a>',
+        array('@doc' => 'http://drupal.org/node/1996546#thoroughfare')),
+      'premise' => t('<a href="@doc">The premise of this address (i.e. Apartment / Suite number)</a>',
+        array('@doc' => 'http://drupal.org/node/1996546#premise')),
+      'sub_premise' => t('<a href="@doc">The sub_premise of this address</a>',
+        array('@doc' => 'http://drupal.org/node/1996546#sub_premise')),
+      'organisation_name' => t('<a href="@doc">Contents of a primary ' .
+          'OrganisationName element in the xNL XML</a>',
+        array('@doc' => 'http://drupal.org/node/1996546#organisation_name')),
+      'name_line' => t('<a href="@doc">Contents of a primary NameLine element ' .
+          'in the xNL XML</a>',
+        array('@doc' => 'http://drupal.org/node/1996546#name_line')),
+      'first_name' => t('<a href="@doc">Contents of the FirstName element of ' .
+          'a primary PersonName element in the xNL XML</a>',
+        array('@doc' => 'http://drupal.org/node/1996546#first_name')),
+      'last_name' => t('<a href="@doc">Contents of the LastName element of a ' .
+          'primary PersonName element in the xNL XML</a>',
+        array('@doc' => 'http://drupal.org/node/1996546#last_name')),
+      'data' => t('<a href="@doc">Additional data for this address</a>',
+        array('@doc' => 'http://drupal.org/node/1996546#data')),
+    );
+    return $fields;
+  }
+
+  /**
+   * Implements MigrateFieldHandler::prepare().
+   *
+   * @param $entity
+   * @param array $field_info
+   * @param array $instance
+   * @param array $values
+   *
+   * @return null
+   */
+  public function prepare($entity, array $field_info, array $instance,
+                          array $values) {
+    $arguments = array();
+    if (isset($values['arguments'])) {
+      $arguments = array_filter($values['arguments']);
+      unset($values['arguments']);
+    }
+    $language = $this->getFieldLanguage($entity, $field_info, $arguments);
+
+    // Setup the standard Field API array for saving.
+    $delta = 0;
+    foreach ($values as $value) {
+      $return[$language][$delta] = array('country' => $value)
+        + $this->prepareArguments($arguments, $field_info, $delta);
+      $delta++;
+    }
+
+    return isset($return) ? $return : NULL;
+  }
+
+  /**
+   * Builds an array with additional data for the current $delta.
+   *
+   * @param  array $arguments
+   * @param  array $field_info
+   * @param  $delta
+   *
+   * @return array
+   */
+  protected function prepareArguments(array $arguments, array $field_info, $delta) {
+    $result = array();
+    $data = array();
+
+    foreach ($arguments as $column_key => $column_value) {
+      $value = NULL;
+
+      if (is_array($arguments[$column_key])) {
+        if (!empty($arguments[$column_key][$delta])) {
+          $value = $arguments[$column_key][$delta];
+        }
+      }
+      else {
+        $value = $arguments[$column_key];
+      }
+
+      if ($value) {
+        if (isset($field_info['columns'][$column_key])) {
+          // Store the data in a seperate column.
+          $result[$column_key] = $value;
+        }
+        else {
+          // Add the data to the 'data' column.
+          $data[$column_key] = $value;
+        }
+      }
+    }
+
+    // Store all the other data as a serialized array in the data field.
+    if (!empty($data)) {
+      $result['data'] = serialize($data);
+    }
+
+    return $result;
+  }
+}
diff --git a/htmltest/sites/all/modules/addressfield/addressfield.module b/htmltest/sites/all/modules/addressfield/addressfield.module
new file mode 100644
index 00000000..c0105148
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/addressfield.module
@@ -0,0 +1,846 @@
+<?php
+
+/**
+ * @file
+ * Defines a field for attaching country-specific addresses to entities.
+ */
+
+/**
+ * Implements hook_ctools_plugin_directory().
+ */
+function addressfield_ctools_plugin_directory($module, $plugin) {
+  if ($module == 'addressfield') {
+    return 'plugins/' . $plugin;
+  }
+}
+
+/**
+ * Implements hook_ctools_plugin_type().
+ */
+function addressfield_ctools_plugin_type() {
+  $plugins['format'] = array(
+    'load themes' => TRUE,
+  );
+  return $plugins;
+}
+
+/**
+ * Implements hook_views_api().
+ */
+function addressfield_views_api() {
+  return array(
+    'api' => 3,
+    'path' => drupal_get_path('module', 'addressfield') . '/views',
+  );
+}
+
+/**
+ * Implements hook_module_implements_alter().
+ *
+ * Moves the hook_token_info_alter() implementation to the bottom so it is
+ * invoked after all modules implementing the same hook.
+ */
+function addressfield_module_implements_alter(&$implementations, $hook) {
+  if ($hook == 'token_info_alter') {
+    $group = $implementations['addressfield'];
+    unset($implementations['addressfield']);
+    $implementations['addressfield'] = $group;
+  }
+}
+
+/**
+ * Returns TRUE if a field map array value represents an addressfield.
+ *
+ * Provided for use as a callback by array_filter().
+ */
+function addressfield_field_map_filter($field) {
+  return !empty($field['type']) && $field['type'] == 'addressfield';
+}
+
+/**
+ * Get the list of format plugins.
+ */
+function addressfield_format_plugins() {
+  ctools_include('plugins');
+  $plugins = ctools_get_plugins('addressfield', 'format');
+  uasort($plugins, 'ctools_plugin_sort');
+
+  return $plugins;
+}
+
+/**
+ * Get the list of format plugins in a format suitable for #options.
+ */
+function addressfield_format_plugins_options() {
+  $options = array();
+  foreach (addressfield_format_plugins() as $widget => $info) {
+    $options[$widget] = check_plain($info['title']);
+  }
+  return $options;
+}
+
+/**
+ * @defgroup addressfield_format Address format API
+ * @{
+ * API for generating address forms and display formats.
+ *
+ * Addresses forms and display formats are collaboratively generated by one or
+ * more format handler plugins. An address with a name and a company, for example,
+ * will be generated by three handlers:
+ *   - 'address' that will generate the country, locality, street blocks
+ *   - 'organisation' that will add the organisation block to the address
+ *   - 'name-full' that will add a first name and last name block to the address
+ *
+ * A format handler is a CTools plugin of type 'addressfield' / 'format'. Each
+ * handler is passed the format in turn, and can add to or modify the format.
+ *
+ * The format itself is a renderable array stub. This stub will be transformed
+ * into either a Form API array suitable for use as part of a form or into a
+ * renderable array suitable for use with drupal_render(). The following
+ * modifications are done:
+ *   - when rendering as a form, every element which name (its key in the array)
+ *     is a valid addressfield column (see addressfield_field_schema()), will
+ *     be transformed into a form element, either using a type explicitly
+ *     defined in '#widget_type' or using 'select' if '#options' is set or
+ *     'textfield' if it is not. In addition, the '#default_value' of every
+ *     field will be populated from the address being edited.
+ *   - when rendering as a formatter, every element which name (its key in the array)
+ *     is a valid addressfield column (see addressfield_field_schema()), will
+ *     be transformed into a renderable element, either using a type explicitly
+ *     defined in '#render_type' or else using 'addressfield_container'. When
+ *     the type is 'addressfield_container' the element will be rendered as
+ *     an HTML element set by '#tag' (default: span).
+ */
+
+/**
+ * Generate a format for a given address.
+ *
+ * @param $address
+ *   The address format being generated.
+ * @param $handlers
+ *   The format handlers to use to generate the format.
+ * @param $context
+ *   An associative array of context information pertaining to how the address
+ *   format should be generated. If no mode is given, it will initialize to the
+ *   default value. The remaining context keys should only be present when the
+ *   address format is being generated for a field:
+ *   - mode: either 'form' or 'render'; defaults to 'render'.
+ *   - field: the field info array.
+ *   - instance: the field instance array.
+ *   - langcode: the langcode of the language the field is being rendered in.
+ *   - delta: the delta value of the given address.
+ *
+ * @return
+ *   A renderable array suitable for use as part of a form (if 'mode' is 'form')
+ *   or for formatted address output when passed to drupal_render().
+ */
+function addressfield_generate($address, array $handlers, array $context = array()) {
+  // If no mode is given in the context array, default it to 'render'.
+  if (empty($context['mode'])) {
+    $context['mode'] = 'render';
+  }
+
+  ctools_include('plugins');
+  $format = array();
+  $format['#handlers'] = $handlers;
+  foreach ($format['#handlers'] as $handler) {
+    if ($callback = ctools_plugin_load_function('addressfield', 'format', $handler, 'format callback')) {
+      $callback($format, $address, $context);
+    }
+  }
+
+  // Store the address in the format, for processing.
+  $format['#address'] = $address;
+
+  // Post-process the format stub, depending on the rendering mode.
+  if ($context['mode'] == 'form') {
+    $format['#addressfield'] = TRUE;
+    $format['#process'][] = 'addressfield_process_format_form';
+    $format['#required'] = FALSE;
+  }
+  elseif ($context['mode'] == 'render') {
+    $format['#pre_render'][] = 'addressfield_render_address';
+  }
+
+  return $format;
+}
+
+/**
+ * Generate a full-fledged form from a format snippet, as returned by addressfield_formats().
+ */
+function addressfield_process_format_form($format, &$form_state, $complete_form) {
+  // Make sure to load all the plugins that participated in this format.
+  ctools_include('plugins');
+  foreach ($format['#handlers'] as $handler) {
+    ctools_plugin_load_function('addressfield', 'format', $handler, 'format callback');
+  }
+
+  _addressfield_process_format_form($format, $format['#address'], $format['#required']);
+  return $format;
+}
+
+function _addressfield_process_format_form(&$format, $address, $required) {
+  foreach (element_children($format) as $key) {
+    $child = &$format[$key];
+
+    // Automatically convert any element in the format array to an appropriate
+    // form element that matches one of the address component names.
+    if (in_array($key, array('name_line', 'first_name', 'last_name', 'organisation_name', 'country', 'administrative_area', 'sub_administrative_area', 'locality', 'dependent_locality', 'postal_code', 'thoroughfare', 'premise', 'sub_premise'))) {
+      // Set the form element type for the address component to whatever the
+      // address format specified in its #widget_type property.
+      if (isset($child['#widget_type'])) {
+        $child['#type'] = $child['#widget_type'];
+      }
+      else {
+        // If the element didn't specify a #widget_type and has options, turn it
+        // into a select list and unset its #size value, which is typically used
+        // to provide the width of a textfield.
+        if (isset($child['#options'])) {
+          $child['#type'] = 'select';
+          unset($child['#size']);
+        }
+        else {
+          // Otherwise go ahead and make it a textfield.
+          $child['#type'] = 'textfield';
+        }
+      }
+
+      if (!$required) {
+        unset($child['#required']);
+      }
+
+      if (isset($address[$key])) {
+        $child['#default_value'] = $address[$key];
+      }
+    }
+
+    // Recurse through the element's children if it has any.
+    _addressfield_process_format_form($child, $address, $required);
+  }
+}
+
+/**
+ * Render an address in a given format.
+ */
+function addressfield_render_address($format) {
+  _addressfield_render_address($format, $format['#address']);
+  return $format;
+}
+
+function _addressfield_render_address(&$format, $address) {
+  foreach (element_children($format) as $key) {
+    $child = &$format[$key];
+
+    // Automatically expand elements that match one of the fields of the address
+    // structure.
+    if (in_array($key, array('name_line', 'first_name', 'last_name', 'organisation_name', 'country', 'administrative_area', 'sub_administrative_area', 'locality', 'dependent_locality', 'postal_code', 'thoroughfare', 'premise', 'sub_premise'), TRUE)) {
+      if (isset($child['#render_type'])) {
+        $child['#type'] = $child['#render_type'];
+      }
+      else {
+        $child['#type'] = 'addressfield_container';
+        if (!isset($child['#tag'])) {
+          $child['#tag'] = 'span';
+        }
+      }
+
+      // If the element instructs us to render the option value instead of the
+      // raw address element value and its #options array has a matching key,
+      // swap it out for the option value now.
+      $child['#children'] = '';
+
+      if (!empty($child['#render_option_value']) && isset($child['#options'][$address[$key]])) {
+        $child['#children'] = check_plain($child['#options'][$address[$key]]);
+      }
+      elseif (isset($address[$key])) {
+        $child['#children'] = check_plain($address[$key]);
+      }
+
+      // Skip empty elements.
+      if ((string) $child['#children'] === '') {
+        $child['#access'] = FALSE;
+      }
+
+      // Add #field_prefix and #field_suffix to the prefixes and suffixes.
+      if (isset($child['#field_prefix'])) {
+        $child['#prefix'] = (isset($child['#prefix']) ? $child['#prefix'] : '') . $child['#field_prefix'];
+      }
+      if (isset($child['#field_suffix'])) {
+        $child['#suffix'] = (isset($child['#suffix']) ? $child['#suffix'] : '') . $child['#field_suffix'];
+      }
+    }
+
+    // Recurse through the child.
+    _addressfield_render_address($child, $address);
+  }
+}
+
+/**
+ * @} End of "ingroup addressfield_format"
+ */
+
+/**
+ * Implementation of hook_theme().
+ */
+function addressfield_theme() {
+  $hooks['addressfield_container'] = array(
+    'render element' => 'element',
+  );
+  return $hooks;
+}
+
+/**
+ * Render a container for a set of address fields.
+ */
+function theme_addressfield_container($variables) {
+  $element = $variables['element'];
+
+  $element['#children'] = trim($element['#children']);
+  if (strlen($element['#children']) > 0) {
+    $output = '<' . $element['#tag'] . drupal_attributes($element['#attributes']) . '>';
+    $output .= $element['#children'];
+    $output .= '</' . $element['#tag'] . ">";
+    return $output;
+  }
+  else {
+    return '';
+  }
+}
+
+/**
+ * Implementation of hook_element_info().
+ */
+function addressfield_element_info() {
+  $types['addressfield_container'] = array(
+    '#theme_wrappers' => array('addressfield_container'),
+    '#process' => array('addressfield_widget_process'),
+    '#attributes' => array(),
+    '#tag' => 'div',
+  );
+  return $types;
+}
+
+/**
+ * Form API process function: set the #parents of the children of this element so they appear at the same level as the parent.
+ */
+function addressfield_widget_process($element) {
+  foreach (element_children($element) as $key) {
+    $element[$key]['#parents'] = $element['#parents'];
+    $element[$key]['#parents'][count($element[$key]['#parents']) - 1] = $key;
+  }
+
+  return $element;
+}
+
+/**
+ * Implements hook_field_info()
+ */
+function addressfield_field_info() {
+  $fields = array();
+
+  $fields['addressfield'] = array(
+    'label' => t('Postal address'),
+    'description' => t('A field type used for storing postal addresses according the xNAL standard.'),
+    'settings' => array(),
+    'instance_settings' => array(),
+    'default_widget' => 'addressfield_standard',
+    'default_formatter' => 'addressfield_default',
+    'property_type' => 'addressfield',
+    'property_callbacks' => array('addressfield_property_info_callback'),
+  );
+
+  return $fields;
+}
+
+/**
+ * Returns an array of default values for the addressfield form elements.
+ */
+function addressfield_default_values($available_countries = NULL) {
+  if (!isset($available_countries)) {
+    $available_countries = _addressfield_country_options_list();
+  }
+
+  // Use the default country of the site if possible.
+  $default_country = variable_get('site_default_country', NULL);
+
+  // If the default country is undefined or not in the list of available countries,
+  // just fallback to the first country in the list.
+  if (!$default_country || !isset($available_countries[$default_country])) {
+    $default_country = key($available_countries);
+  }
+
+  return array(
+    'country' => $default_country,
+    'name_line' => '',
+    'first_name' => '',
+    'last_name' => '',
+    'organisation_name' => '',
+    'administrative_area' => '',
+    'sub_administrative_area' => '',
+    'locality' => '',
+    'dependent_locality' => '',
+    'postal_code' => '',
+    'thoroughfare' => '',
+    'premise' => '',
+    'sub_premise' => '',
+    'data' => '',
+  );
+}
+
+/**
+ * Implements hook_field_is_empty().
+ */
+function addressfield_field_is_empty($item, $field) {
+  // Every address field must have at least a country value or it is considered
+  // empty, even if it has name information.
+  return empty($item['country']);
+}
+
+/**
+ * Implements hook_field_presave().
+ */
+function addressfield_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  foreach ($items as $delta => &$item) {
+    // If the first name and last name are set but the name line isn't...
+    if (isset($item['first_name']) && isset($item['last_name']) && !isset($item['name_line'])) {
+      // Combine the first and last name to be the name line.
+      $items[$delta]['name_line'] = $items[$delta]['first_name'] . ' ' . $items[$delta]['last_name'];
+    }
+    elseif (isset($item['name_line'])) {
+      // Otherwise if the name line is set, separate it out into a best guess at
+      // the first and last name.
+      $names = explode(' ', $item['name_line']);
+
+      $item['first_name'] = array_shift($names);
+      $item['last_name'] = implode(' ', $names);
+    }
+
+    // Trim whitespace from all of the address components and convert any double
+    // spaces to single spaces.
+    foreach ($item as $key => &$value) {
+      if (!in_array($key, array('element_key', 'data')) && is_string($value)) {
+        $value = trim(str_replace('  ', ' ', $value));
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_widget_info()
+ */
+function addressfield_field_widget_info() {
+  $widgets = array();
+
+  $widgets['addressfield_standard'] = array(
+    'label' => t('Dynamic address form'),
+    'field types' => array('addressfield'),
+    'settings' => array(
+      'available_countries' => array(),
+      'format_handlers' => array('address'),
+    ),
+  );
+
+  return $widgets;
+}
+
+/**
+ * Implements hook_field_widget_settings_form()
+ */
+function addressfield_field_widget_settings_form($field, $instance) {
+  $widget = $instance['widget'];
+  $defaults = field_info_widget_settings($widget['type']);
+  $settings = array_merge($defaults, $widget['settings']);
+  $form = array();
+
+  if ($widget['type'] == 'addressfield_standard') {
+    $form['available_countries'] = array(
+      '#type' => 'select',
+      '#multiple' => TRUE,
+      '#title' => t('Available countries'),
+      '#description' => t('If no countries are selected, all countries will be available.'),
+      '#options' => _addressfield_country_options_list(),
+      '#default_value' => $settings['available_countries'],
+    );
+
+    $form['format_handlers'] = array(
+      '#type' => 'checkboxes',
+      '#title' => t('Format handlers'),
+      '#options' => addressfield_format_plugins_options(),
+      '#default_value' => $settings['format_handlers'],
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_widget_form()
+ */
+function addressfield_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  $settings = $instance['widget']['settings'];
+
+  // Generate a specific key used to identify this element to restore a default
+  // value upon AJAX submission regardless of where this element is in the
+  // $form array.
+  $element_key = implode('|', array($element['#entity_type'], $element['#bundle'], $element['#field_name'], $element['#language'], $element['#delta']));
+
+  // Store the key in the element array as a value so it can be easily retrieved
+  // in context in the $form_state['values'] array in the element validator.
+  $element['element_key'] = array(
+    '#type' => 'value',
+    '#value' => $element_key,
+  );
+
+  // Get the default address used to build the widget form elements, looking
+  // first in the form state, then in the stored value for the field, and then
+  // in the default values of the instance.
+  $address = array();
+
+  if (!empty($form_state['addressfield'][$element_key])) {
+    // Use the value from the form_state if available.
+    $address = $form_state['addressfield'][$element_key];
+  }
+  elseif (!empty($items[$delta]['country'])) {
+    // Else use the saved value for the field.
+    $address = $items[$delta];
+  }
+  else {
+    // Otherwise use the instance default.
+    $address = (array) $instance['default_value'][0];
+  }
+
+  // Determine the list of available countries, and if the currently selected
+  // country is not in it, unset it so it can be reset to the default country.
+  $countries = _addressfield_country_options_list($field, $instance);
+  if (!empty($address['country']) && !isset($countries[$address['country']])) {
+    unset($address['country']);
+  }
+
+  // Merge in default values to provide a value for every expected array key.
+  $address += addressfield_default_values($countries);
+
+  // Add the form elements for the standard widget, which includes a country
+  // select list at the top that reloads the available address elements when the
+  // country is changed.
+  if ($instance['widget']['type'] == 'addressfield_standard') {
+    // Wrap everything in a fieldset. This is not the best looking element,
+    // but it's the only wrapper available in Drupal we can properly use
+    // in that context, and it is overridable if necessary.
+    $element['#type'] = 'fieldset';
+
+    // Generate the address form.
+    $context = array(
+      'mode' => 'form',
+      'field' => $field,
+      'instance' => $instance,
+      'langcode' => $langcode,
+      'delta' => $delta,
+    );
+    $element += addressfield_generate($address, $settings['format_handlers'], $context);
+
+    // Mark the form element as required if necessary.
+    $element['#required'] = $delta == 0 && $instance['required'];
+  }
+
+  return $element;
+}
+
+/**
+ * Element validate callback: rebuilds the form on country change and stores the
+ * current address value in the $form_state for retrieval on rebuild.
+ */
+function addressfield_standard_country_validate($element, &$form_state) {
+  // If the country was changed, rebuild the form.
+  if ($element['#default_value'] != $element['#value']) {
+    $form_state['rebuild'] = TRUE;
+  }
+
+  $parents = $element['#parents'];
+  array_pop($parents);
+
+  // Search through the form values to find the current address.
+  $address = drupal_array_get_nested_value($form_state['values'], $parents);
+
+  // Store the present address values in the form state for retrieval by the
+  // widget form regardless of where the widget sits in the $form array.
+  $form_state['addressfield'][$address['element_key']] = array_diff_key($address, array('element_key' => ''));
+}
+
+/**
+ * Ajax callback in response to a change of country in an address field.
+ *
+ * The only thing we have to do is to find the proper element to render.
+ */
+function addressfield_standard_widget_refresh($form, $form_state) {
+  // The target element is one element below the triggering country selector.
+  $array_parents = $form_state['triggering_element']['#array_parents'];
+  array_pop($array_parents);
+
+  // Iterate over the form parents to find the element.
+  $element = $form;
+  foreach ($array_parents as $name) {
+    $element = &$element[$name];
+    if (!empty($element['#addressfield'])) {
+      break;
+    }
+  }
+
+  // Return the address block, but remove the '_weight' element inserted
+  // by the field API.
+  unset($element['_weight']);
+
+  // Replace the address field widget with the updated widget and focus on the
+  // new country select list.
+  $commands[] = ajax_command_replace(NULL, render($element));
+  $commands[] = ajax_command_invoke('#' . $element['country']['#id'], 'focus');
+
+  // Allow other modules to add arbitrary AJAX commands on the refresh.
+  drupal_alter('addressfield_standard_widget_refresh', $commands, $form, $form_state);
+
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
+ * Implements hook_field_formatter_info().
+ */
+function addressfield_field_formatter_info() {
+  return array(
+    'addressfield_default' => array(
+      'label' => t('Default'),
+      'field types' => array('addressfield'),
+      'settings' => array(
+        'use_widget_handlers' => 1,
+        'format_handlers' => array('address'),
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_formatter_settings_form().
+ */
+function addressfield_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $element['use_widget_handlers'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Use the same configuration as the widget.'),
+    '#default_value' => !empty($settings['use_widget_handlers']),
+  );
+
+  $element['format_handlers'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Format handlers'),
+    '#options' => addressfield_format_plugins_options(),
+    '#default_value' => $settings['format_handlers'],
+    '#process' => array('form_process_checkboxes', '_addressfield_field_formatter_settings_form_process_add_state'),
+    '#element_validate' => array('_addressfield_field_formatter_settings_form_validate')
+  );
+
+  return $element;
+}
+
+/**
+ * Helper function: set the proper #states to the use widget handlers checkbox.
+ */
+function _addressfield_field_formatter_settings_form_process_add_state($element, $form_state) {
+  // Build a #parents based on the current checkbox.
+  $target_parents = array_slice($element['#parents'], 0, -1);
+  $target_parents[] = 'use_widget_handlers';
+  $target_parents = array_shift($target_parents) . ($target_parents ? '[' . implode('][', $target_parents) . ']' : '');
+
+  $element['#states']['visible'] = array(
+    ':input[name="' . $target_parents . '"]' => array('checked' => FALSE),
+  );
+
+  return $element;
+}
+
+/**
+ * Helper function: filter the results of the checkboxes form element.
+ */
+function _addressfield_field_formatter_settings_form_validate($element, &$element_state) {
+  form_set_value($element, array_filter($element['#value']), $element_state);
+}
+
+/**
+ * Implements hook_field_formatter_settings_summary().
+ */
+function addressfield_field_formatter_settings_summary($field, $instance, $view_mode) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $summary = '';
+
+  if ($settings['use_widget_handlers']) {
+    return t('Use widget configuration');
+  }
+  else {
+    $summary = array();
+    $plugins = addressfield_format_plugins();
+    foreach ($settings['format_handlers'] as $handler) {
+      $summary[] = $plugins[$handler]['title'];
+    }
+    return $summary ? implode(', ', $summary) : t('No handler');
+  }
+}
+
+/**
+ * Implements hook_field_formatter_view().
+ */
+function addressfield_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  $settings = $display['settings'];
+  $element = array();
+
+  switch ($display['type']) {
+    case 'addressfield_default':
+      if (!empty($settings['use_widget_handlers'])) {
+        $handlers = $instance['widget']['settings']['format_handlers'];
+      }
+      else {
+        $handlers = $settings['format_handlers'];
+      }
+      foreach ($items as $delta => $address) {
+        // Generate the address format.
+        $context = array(
+          'mode' => 'render',
+          'field' => $field,
+          'instance' => $instance,
+          'langcode' => $langcode,
+          'delta' => $delta,
+        );
+        $element[$delta] = addressfield_generate($address, $handlers, $context);
+      }
+      break;
+  }
+
+  return $element;
+}
+
+/**
+ * Callback to alter the property info of address fields.
+ *
+ * @see addressfield_field_info().
+ */
+function addressfield_property_info_callback(&$info, $entity_type, $field, $instance, $field_type) {
+  $name = $field['field_name'];
+  $property = &$info[$entity_type]['bundles'][$instance['bundle']]['properties'][$name];
+
+  $property['type'] = ($field['cardinality'] != 1) ? 'list<addressfield>' : 'addressfield';
+  $property['getter callback'] = 'entity_metadata_field_verbatim_get';
+  $property['setter callback'] = 'entity_metadata_field_verbatim_set';
+  $property['auto creation'] = 'addressfield_auto_creation';
+  $property['property info'] = addressfield_data_property_info();
+
+  unset($property['query callback']);
+}
+
+/**
+ * Auto creation callback for an addressfield value array.
+ *
+ * @see addressfield_property_info_callback()
+ */
+function addressfield_auto_creation() {
+  // We can't call addressfield_default_values() directly, because it has an
+  // optional array argument that will receive an invalid value when Entity API
+  // tries to call it directly with its usual $property_name and $context
+  // arguments.
+  return addressfield_default_values();
+}
+
+/**
+ * Defines info for the properties of the address field data structure.
+ */
+function addressfield_data_property_info($name = NULL) {
+  // Build an array of basic property information for the address field.
+  $properties = array(
+    'country' => array(
+      'label' => t('Country'),
+      'options list' => '_addressfield_country_options_list',
+    ),
+    'name_line' => array(
+      'label' => t('Full name'),
+    ),
+    'first_name' => array(
+      'label' => t('First name'),
+    ),
+    'last_name' => array(
+      'label' => t('Last name'),
+    ),
+    'organisation_name' => array(
+      'label' => t('Company'),
+    ),
+    'administrative_area' => array(
+      'label' => t('Administrative area (i.e. State / Province)'),
+    ),
+    'sub_administrative_area' => array(
+      'label' => t('Sub administrative area'),
+    ),
+    'locality' => array(
+      'label' => t('Locality (i.e. City)'),
+    ),
+    'dependent_locality' => array(
+      'label' => t('Dependent locality'),
+    ),
+    'postal_code' => array(
+      'label' => t('Postal code'),
+    ),
+    'thoroughfare' => array(
+      'label' => t('Thoroughfare (i.e. Street address)'),
+    ),
+    'premise' => array(
+      'label' => t('Premise (i.e. Apartment / Suite number)'),
+    ),
+  );
+
+  // Add the default values for each of the address field properties.
+  foreach ($properties as $key => &$value) {
+    $value += array(
+      'description' => !empty($name) ? t('!label of field %name', array('!label' => $value['label'], '%name' => $name)) : '',
+      'type' => 'text',
+      'getter callback' => 'entity_property_verbatim_get',
+      'setter callback' => 'entity_property_verbatim_set',
+    );
+  }
+
+  return $properties;
+}
+
+/**
+ * Wraps country_get_list() for use as an Entity API options list.
+ */
+function _addressfield_country_options_list($field = NULL, $instance = NULL) {
+  // Necessary for country_get_list().
+  require_once DRUPAL_ROOT . '/includes/locale.inc';
+
+  $countries = country_get_list();
+
+  if (isset($field)) {
+    // If the instance is not specified, loop against all the instances of the field.
+    if (!isset($instance)) {
+      $instances = array();
+      foreach ($field['bundles'] as $entity_type => $bundles) {
+        foreach ($bundles as $bundle_name) {
+          $instances[] = field_info_instance($entity_type, $field['field_name'], $bundle_name);
+        }
+      }
+    }
+    else {
+      $instances = array($instance);
+    }
+
+    foreach ($instances as $instance) {
+      if (!empty($instance['widget']['settings']['available_countries'])) {
+        $countries = array_intersect_key($countries, $instance['widget']['settings']['available_countries']);
+      }
+      else {
+        // This instance allow all the countries.
+        $countries = country_get_list();
+        break;
+      }
+    }
+  }
+
+  return $countries;
+}
diff --git a/htmltest/sites/all/modules/addressfield/addressfield.tokens.inc b/htmltest/sites/all/modules/addressfield/addressfield.tokens.inc
new file mode 100644
index 00000000..c96ff83b
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/addressfield.tokens.inc
@@ -0,0 +1,225 @@
+<?php
+
+/**
+ * @file
+ * Token module integration.
+ */
+
+/**
+ * Implements hook_token_info().
+ */
+function addressfield_token_info() {
+  $type = array(
+    'name' => t('Address field'),
+    'description' => t('Tokens related to address field values and their components.'),
+    'needs-data' => 'address-field',
+    'field' => TRUE,
+  );
+
+  // Define tokens for the various components of addresses supported through the
+  // user interface along with two helper tokens for country and administrative
+  // area to distinguish between names and abbreviations.
+  $info['country'] = array(
+    'name' => t('Country name'),
+    'description' => t('The full name of the country.'),
+  );
+  $info['country-code'] = array(
+    'name' => t('Country code'),
+    'description' => t('The two letter ISO country code.'),
+  );
+  $info['administrative-area'] = array(
+    'name' => t('Administrative area (i.e. State/Province)'),
+    'description' => t('The administrative area value, expanded to the full name if applicable.'),
+  );
+  $info['administrative-area-raw'] = array(
+    'name' => t('Administrative area (raw value)'),
+    'description' => t('The raw administrative area value.'),
+  );
+  $info['locality'] = array(
+    'name' => t('Locality (i.e. City)'),
+    'description' => t('The locality value.'),
+  );
+  $info['postal-code'] = array(
+    'name' => t('Postal code'),
+    'description' => t('The postal code value.'),
+  );
+  $info['thoroughfare'] = array(
+    'name' => t('Thoroughfare (i.e. Street address)'),
+    'description' => t('The thoroughfare value.'),
+  );
+  $info['premise'] = array(
+    'name' => t('Premise (i.e. Street address)'),
+    'description' => t('The thoroughfare value.'),
+  );
+  $info['organisation'] = array(
+    'name' => t('Organisation'),
+    'description' => t('The organisation name value.'),
+  );
+  $info['name-line'] = array(
+    'name' => t('Full name'),
+    'description' => t('The name line value of the address.'),
+  );
+  $info['first-name'] = array(
+    'name' => t('First name'),
+    'description' => t('The first name value.'),
+  );
+  $info['last-name'] = array(
+    'name' => t('Last name'),
+    'description' => t('The last name value.'),
+  );
+
+  // Add a helper token to format addresses as expected by MailChimp.
+  $info['format-mailchimp'] = array(
+    'name' => t('Address formatted for MailChimp'),
+    'description' => t('The full address formatted for import into MailChimp.'),
+  );
+
+  return array(
+    'types' => array('address-field' => $type),
+    'tokens' => array('address-field' => $info),
+  );
+}
+
+/**
+ * Implements hook_token_info_alter().
+ */
+function addressfield_token_info_alter(&$data) {
+  // Loop over every address field on the site.
+  foreach (array_filter(field_info_field_map(), 'addressfield_field_map_filter') as $field_name => $field) {
+    foreach ($data['tokens'] as $group => $token){
+      if (isset($data['tokens'][$group][$field_name]) && is_array($data['tokens'][$group][$field_name])) {
+        // Set the token type for the field to use the addressfield child tokens.
+        $data['tokens'][$group][$field_name]['type'] = 'address-field';
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_tokens().
+ */
+function addressfield_tokens($type, $tokens, array $data = array(), array $options = array()) {
+  if (isset($options['language'])) {
+    $language_code = $options['language']->language;
+  }
+  else {
+    $language_code = LANGUAGE_NONE;
+  }
+
+  $sanitize = !empty($options['sanitize']);
+
+  $replacements = array();
+
+  // If we're generating tokens for an address field, extract the address data
+  // from the field value array and generate the necessary replacements.
+  if ($type == 'address-field' && !empty($data['address-field'][$language_code]) && is_array($data['address-field'][$language_code])) {
+    $address = reset($data['address-field'][$language_code]);
+
+    foreach ($tokens as $name => $original) {
+      switch ($name) {
+        case 'country':
+          $countries = _addressfield_country_options_list();
+          $replacements[$original] = $sanitize ? check_plain($countries[$address['country']]) : $countries[$address['country']];
+          break;
+
+        case 'country-code':
+          $replacements[$original] = $sanitize ? check_plain($address['country']) : $address['country'];
+          break;
+
+        case 'administrative-area':
+          // If we received format handlers in the data array, generate the form
+          // for the address field to see if the administrative area should be
+          // expanded from an abbreviation to a related name.
+          $administrative_area = $address['administrative_area'];
+
+          if (!empty($data['format_handlers'])) {
+            $form = addressfield_generate($address, $data['format_handlers'], array('mode' => 'form'));
+
+            if (!empty($form['locality_block']['administrative_area']['#options'][$administrative_area])) {
+              $administrative_area = $form['locality_block']['administrative_area']['#options'][$administrative_area];
+            }
+          }
+
+          $replacements[$original] = $sanitize ? check_plain($administrative_area) : $administrative_area;
+          break;
+
+        case 'administrative-area-raw':
+          $replacements[$original] = $sanitize ? check_plain($address['administrative_area']) : $address['administrative_area'];
+          break;
+
+        case 'locality':
+          $replacements[$original] = $sanitize ? check_plain($address['locality']) : $address['locality'];
+          break;
+
+        case 'postal-code':
+          $replacements[$original] = $sanitize ? check_plain($address['postal_code']) : $address['postal_code'];
+          break;
+
+        case 'thoroughfare':
+          $replacements[$original] = $sanitize ? check_plain($address['thoroughfare']) : $address['thoroughfare'];
+          break;
+
+        case 'premise':
+          $replacements[$original] = $sanitize ? check_plain($address['premise']) : $address['premise'];
+          break;
+
+        case 'organisation':
+          $replacements[$original] = $sanitize ? check_plain($address['organisation_name']) : $address['organisation_name'];
+          break;
+
+        case 'name-line':
+          $replacements[$original] = $sanitize ? check_plain($address['name_line']) : $address['name_line'];
+          break;
+
+        case 'first-name':
+          $replacements[$original] = $sanitize ? check_plain($address['first_name']) : $address['first_name'];
+          break;
+
+        case 'last-name':
+          $replacements[$original] = $sanitize ? check_plain($address['last_name']) : $address['last_name'];
+          break;
+
+        // See: http://kb.mailchimp.com/article/how-do-i-format-my-list-fields-to-import-them
+        case 'format-mailchimp':
+          $components = array();
+
+          foreach (array('thoroughfare', 'premise', 'locality', 'administrative_area', 'postal_code', 'country') as $component) {
+            if (!empty($address[$component])) {
+              $components[] = $address[$component];
+            }
+          }
+
+          $format_mailchimp = implode('  ', $components);
+          $replacements[$original] = $sanitize ? check_plain($format_mailchimp) : $format_mailchimp;
+          break;
+      }
+    }
+  }
+
+  // The Token module extends direct token generation by using a generic entity
+  // token generation process. Since we intend to overwrite the default Token
+  // module implementation of address field tokens, we use this generic token
+  // generation process to find and replace address field tokens on relevant
+  // entities. This ensures our tokens aren't overwritten by the Token module
+  // and helps us avoid having to do the entity detection ourselves.
+  if ($type == 'entity') {
+    // Loop over the address fields defined on the site.
+    foreach (array_filter(field_info_field_map(), 'addressfield_field_map_filter') as $field_name => $field) {
+      // If there are any address field tokens in the token list...
+      if ($addressfield_tokens = token_find_with_prefix($tokens, $field_name)) {
+        // If the current field is on the matching entity type...
+        if (!empty($field['bundles'][$data['entity_type']])) {
+          // Extract the format handlers selected in a representative instance
+          // settings form for use in formatting tokens.
+          $instance = field_info_instance($data['entity_type'], $field_name, reset($field['bundles'][$data['entity_type']]));
+          $format_handlers = $instance['widget']['settings']['format_handlers'];
+        }
+
+        // Generate the necessary address field tokens for the entity.
+        $replacements += token_generate('address-field', $addressfield_tokens, array('address-field' => $data['entity']->$field_name, 'format_handlers' => $format_handlers), $options);
+      }
+    }
+  }
+
+  return $replacements;
+}
diff --git a/htmltest/sites/all/modules/addressfield/example/addressfield_example.info b/htmltest/sites/all/modules/addressfield/example/addressfield_example.info
new file mode 100644
index 00000000..fceb6392
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/example/addressfield_example.info
@@ -0,0 +1,15 @@
+name = Address Field Example
+description = Example module for how to implement an addressfield format handler.
+core = 7.x
+package = Fields
+hidden = TRUE
+
+dependencies[] = ctools
+dependencies[] = addressfield
+
+; Information added by Drupal.org packaging script on 2013-12-06
+version = "7.x-1.0-beta5"
+core = "7.x"
+project = "addressfield"
+datestamp = "1386309505"
+
diff --git a/htmltest/sites/all/modules/addressfield/example/addressfield_example.module b/htmltest/sites/all/modules/addressfield/example/addressfield_example.module
new file mode 100644
index 00000000..453b6259
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/example/addressfield_example.module
@@ -0,0 +1,10 @@
+<?php
+
+/**
+ * Implements hook_ctools_plugin_directory().
+ */
+function addressfield_example_ctools_plugin_directory($module, $plugin) {
+  if ($module == 'addressfield') {
+    return 'plugins/' . $plugin;
+  }
+}
diff --git a/htmltest/sites/all/modules/addressfield/example/plugins/format/addressfield-example.inc b/htmltest/sites/all/modules/addressfield/example/plugins/format/addressfield-example.inc
new file mode 100644
index 00000000..db3a98e2
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/example/plugins/format/addressfield-example.inc
@@ -0,0 +1,3567 @@
+<?php
+
+/**
+ * @file
+ * A specific handler for CH.
+ */
+
+$plugin = array(
+  'title' => t('Address form (CH add-on)'),
+  'format callback' => 'addressfield_format_address_ch_generate',
+  'type' => 'address',
+  'weight' => -80,
+);
+
+function addressfield_format_address_ch_generate(&$format, $address, $context = array()) {
+  if ($address['country'] == 'CH' && $context['mode'] == 'form') {
+    $format['locality_block']['postal_code']['#wrapper_id'] = $format['#wrapper_id'];
+    $format['locality_block']['postal_code']['#process'][] = 'ajax_process_form';
+    $format['locality_block']['postal_code']['#process'][] = 'addressfield_format_address_ch_postal_code_process';
+
+    $format['locality_block']['postal_code']['#element_validate'] = array('addressfield_form_ch_postal_code_validation');
+    $format['locality_block']['postal_code']['#ajax'] = array(
+      'callback' => 'addressfield_standard_widget_refresh',
+      'wrapper' => $format['#wrapper_id'],
+    );
+  }
+  else {
+    if (isset($format['locality_block']['postal_code'])) {
+      // Cancel the AJAX for forms we don't control.
+      $format['locality_block']['postal_code']['#ajax'] = array();
+    }
+  }
+}
+
+function addressfield_format_address_ch_postal_code_process($element) {
+  $element['#limit_validation_errors'] = array($element['#parents']);
+
+  return $element;
+}
+
+function addressfield_form_ch_postal_code_validation($element, &$form_state, &$form) {
+  $data = array(
+    '1000' => array('town' => 'Lausanne', 'canton' => 'VD'),
+    '1001' => array('town' => 'Lausanne', 'canton' => 'VD'),
+    '1002' => array('town' => 'Lausanne', 'canton' => 'VD'),
+    '1003' => array('town' => 'Lausanne', 'canton' => 'VD'),
+    '1004' => array('town' => 'Lausanne', 'canton' => 'VD'),
+    '1005' => array('town' => 'Lausanne', 'canton' => 'VD'),
+    '1006' => array('town' => 'Lausanne', 'canton' => 'VD'),
+    '1007' => array('town' => 'Lausanne', 'canton' => 'VD'),
+    '1008' => array('town' => 'Prilly', 'canton' => 'VD'),
+    '1009' => array('town' => 'Pully', 'canton' => 'VD'),
+    '1010' => array('town' => 'Lausanne', 'canton' => 'VD'),
+    '1011' => array('town' => 'Lausanne', 'canton' => 'VD'),
+    '1012' => array('town' => 'Lausanne', 'canton' => 'VD'),
+    '1014' => array('town' => 'Lausanne Adm cant', 'canton' => 'VD'),
+    '1015' => array('town' => 'Lausanne', 'canton' => 'VD'),
+    '1018' => array('town' => 'Lausanne', 'canton' => 'VD'),
+    '1020' => array('town' => 'Renens VD', 'canton' => 'VD'),
+    '1022' => array('town' => 'Chavannes-Renens', 'canton' => 'VD'),
+    '1023' => array('town' => 'Crissier', 'canton' => 'VD'),
+    '1024' => array('town' => 'Ecublens VD', 'canton' => 'VD'),
+    '1025' => array('town' => 'St-Sulpice VD', 'canton' => 'VD'),
+    '1026' => array('town' => 'Echandens-Denges', 'canton' => 'VD'),
+    '1027' => array('town' => 'Lonay', 'canton' => 'VD'),
+    '1028' => array('town' => 'Préverenges', 'canton' => 'VD'),
+    '1030' => array('town' => 'Bussigny-Lausanne', 'canton' => 'VD'),
+    '1032' => array('town' => 'Romanel-s-Lausanne', 'canton' => 'VD'),
+    '1033' => array('town' => 'Cheseaux-Lausanne', 'canton' => 'VD'),
+    '1037' => array('town' => 'Etagnières', 'canton' => 'VD'),
+    '1038' => array('town' => 'Bercher', 'canton' => 'VD'),
+    '1040' => array('town' => 'Echallens', 'canton' => 'VD'),
+    '1377' => array('town' => 'Oulens-Echallens', 'canton' => 'VD'),
+    '1042' => array('town' => 'Bettens', 'canton' => 'VD'),
+    '1417' => array('town' => 'Epautheyres', 'canton' => 'VD'),
+    '1041' => array('town' => 'Dommartin', 'canton' => 'VD'),
+    '1063' => array('town' => 'Peyres-Possens', 'canton' => 'VD'),
+    '1053' => array('town' => 'Bretigny-Morrens', 'canton' => 'VD'),
+    '1034' => array('town' => 'Boussens', 'canton' => 'VD'),
+    '1035' => array('town' => 'Bournens', 'canton' => 'VD'),
+    '1036' => array('town' => 'Sullens', 'canton' => 'VD'),
+    '1043' => array('town' => 'Sugnens', 'canton' => 'VD'),
+    '1044' => array('town' => 'Fey', 'canton' => 'VD'),
+    '1045' => array('town' => 'Ogens', 'canton' => 'VD'),
+    '1407' => array('town' => 'Bioley-Magnoux', 'canton' => 'VD'),
+    '1052' => array('town' => 'Mont-sur-Lausanne', 'canton' => 'VD'),
+    '1054' => array('town' => 'Morrens VD', 'canton' => 'VD'),
+    '1055' => array('town' => 'Froideville', 'canton' => 'VD'),
+    '1410' => array('town' => 'Thierrens', 'canton' => 'VD'),
+    '1066' => array('town' => 'Epalinges', 'canton' => 'VD'),
+    '1073' => array('town' => 'Savigny', 'canton' => 'VD'),
+    '1083' => array('town' => 'Mézières VD', 'canton' => 'VD'),
+    '1092' => array('town' => 'Belmont-Lausanne', 'canton' => 'VD'),
+    '1093' => array('town' => 'La Conversion', 'canton' => 'VD'),
+    '1094' => array('town' => 'Paudex', 'canton' => 'VD'),
+    '1095' => array('town' => 'Lutry', 'canton' => 'VD'),
+    '1096' => array('town' => 'Cully', 'canton' => 'VD'),
+    '1097' => array('town' => 'Riex', 'canton' => 'VD'),
+    '1098' => array('town' => 'Epesses', 'canton' => 'VD'),
+    '1058' => array('town' => 'Villars-Tiercelin', 'canton' => 'VD'),
+    '1059' => array('town' => 'Peney-le-Jorat', 'canton' => 'VD'),
+    '1061' => array('town' => 'Villars-Mendraz', 'canton' => 'VD'),
+    '1062' => array('town' => 'Sottens', 'canton' => 'VD'),
+    '1080' => array('town' => 'Les Cullayes', 'canton' => 'VD'),
+    '1081' => array('town' => 'Montpreveyres', 'canton' => 'VD'),
+    '1082' => array('town' => 'Corcelles-le-Jorat', 'canton' => 'VD'),
+    '1088' => array('town' => 'Ropraz', 'canton' => 'VD'),
+    '1084' => array('town' => 'Carrouge VD', 'canton' => 'VD'),
+    '1085' => array('town' => 'Vulliens', 'canton' => 'VD'),
+    '1509' => array('town' => 'Vucherens', 'canton' => 'VD'),
+    '1510' => array('town' => 'Syens', 'canton' => 'VD'),
+    '1076' => array('town' => 'Ferlens VD', 'canton' => 'VD'),
+    '1077' => array('town' => 'Servion', 'canton' => 'VD'),
+    '1078' => array('town' => 'Essertes', 'canton' => 'VD'),
+    '1673' => array('town' => 'Auboranges', 'canton' => 'FR'),
+    '1110' => array('town' => 'Morges', 'canton' => 'VD'),
+    '1112' => array('town' => 'Echichens', 'canton' => 'VD'),
+    '1167' => array('town' => 'Lussy-sur-Morges', 'canton' => 'VD'),
+    '1132' => array('town' => 'Lully VD', 'canton' => 'VD'),
+    '1131' => array('town' => 'Tolochenaz', 'canton' => 'VD'),
+    '1125' => array('town' => 'Monnaz', 'canton' => 'VD'),
+    '1126' => array('town' => 'Vaux-sur-Morges', 'canton' => 'VD'),
+    '1127' => array('town' => 'Clarmont', 'canton' => 'VD'),
+    '1128' => array('town' => 'Reverolle', 'canton' => 'VD'),
+    '1113' => array('town' => 'St-Saphorin-Morges', 'canton' => 'VD'),
+    '1114' => array('town' => 'Colombier VD', 'canton' => 'VD'),
+    '1115' => array('town' => 'Vullierens', 'canton' => 'VD'),
+    '1116' => array('town' => 'Cottens VD', 'canton' => 'VD'),
+    '1117' => array('town' => 'Grancy', 'canton' => 'VD'),
+    '1304' => array('town' => 'Senarclens', 'canton' => 'VD'),
+    '1121' => array('town' => 'Bremblens', 'canton' => 'VD'),
+    '1122' => array('town' => 'Romanel-sur-Morges', 'canton' => 'VD'),
+    '1123' => array('town' => 'Aclens', 'canton' => 'VD'),
+    '1124' => array('town' => 'Gollion', 'canton' => 'VD'),
+    '1134' => array('town' => 'Vufflens-Château', 'canton' => 'VD'),
+    '1135' => array('town' => 'Denens', 'canton' => 'VD'),
+    '1136' => array('town' => 'Bussy-Chardonney', 'canton' => 'VD'),
+    '1169' => array('town' => 'Yens', 'canton' => 'VD'),
+    '1168' => array('town' => 'Villars-sous-Yens', 'canton' => 'VD'),
+    '1144' => array('town' => 'Ballens', 'canton' => 'VD'),
+    '1149' => array('town' => 'Berolle', 'canton' => 'VD'),
+    '1146' => array('town' => 'Mollens VD', 'canton' => 'VD'),
+    '1147' => array('town' => 'Montricher', 'canton' => 'VD'),
+    '1142' => array('town' => 'Pampigny', 'canton' => 'VD'),
+    '1141' => array('town' => 'Sévery', 'canton' => 'VD'),
+    '1143' => array('town' => 'Apples', 'canton' => 'VD'),
+    '1145' => array('town' => 'Bière', 'canton' => 'VD'),
+    '1148' => array('town' => 'L\'Isle', 'canton' => 'VD'),
+    '1162' => array('town' => 'St-Prex', 'canton' => 'VD'),
+    '1163' => array('town' => 'Etoy', 'canton' => 'VD'),
+    '1164' => array('town' => 'Buchillon', 'canton' => 'VD'),
+    '1165' => array('town' => 'Allaman', 'canton' => 'VD'),
+    '1166' => array('town' => 'Perroy', 'canton' => 'VD'),
+    '1170' => array('town' => 'Aubonne', 'canton' => 'VD'),
+    '1172' => array('town' => 'Bougy-Villars', 'canton' => 'VD'),
+    '1173' => array('town' => 'Féchy', 'canton' => 'VD'),
+    '1174' => array('town' => 'Montherod', 'canton' => 'VD'),
+    '1175' => array('town' => 'Lavigny', 'canton' => 'VD'),
+    '1176' => array('town' => 'St-Livres', 'canton' => 'VD'),
+    '1180' => array('town' => 'Rolle', 'canton' => 'VD'),
+    '1182' => array('town' => 'Gilly', 'canton' => 'VD'),
+    '1183' => array('town' => 'Bursins', 'canton' => 'VD'),
+    '1184' => array('town' => 'Vinzel', 'canton' => 'VD'),
+    '1185' => array('town' => 'Mont-sur-Rolle', 'canton' => 'VD'),
+    '1186' => array('town' => 'Essertines-Rolle', 'canton' => 'VD'),
+    '1187' => array('town' => 'St-Oyens', 'canton' => 'VD'),
+    '1189' => array('town' => 'Saubraz', 'canton' => 'VD'),
+    '1188' => array('town' => 'Gimel', 'canton' => 'VD'),
+    '1195' => array('town' => 'Dully-Bursinel', 'canton' => 'VD'),
+    '1196' => array('town' => 'Gland', 'canton' => 'VD'),
+    '1197' => array('town' => 'Prangins', 'canton' => 'VD'),
+    '1200' => array('town' => 'Genève', 'canton' => 'GE'),
+    '1201' => array('town' => 'Genève', 'canton' => 'GE'),
+    '1202' => array('town' => 'Genève', 'canton' => 'GE'),
+    '1203' => array('town' => 'Genève', 'canton' => 'GE'),
+    '1204' => array('town' => 'Genève', 'canton' => 'GE'),
+    '1205' => array('town' => 'Genève', 'canton' => 'GE'),
+    '1206' => array('town' => 'Genève', 'canton' => 'GE'),
+    '1207' => array('town' => 'Genève', 'canton' => 'GE'),
+    '1208' => array('town' => 'Genève', 'canton' => 'GE'),
+    '1209' => array('town' => 'Genève', 'canton' => 'GE'),
+    '1211' => array('town' => 'Genève 1', 'canton' => 'GE'),
+    '1212' => array('town' => 'Grand-Lancy', 'canton' => 'GE'),
+    '1213' => array('town' => 'Petit-Lancy', 'canton' => 'GE'),
+    '1214' => array('town' => 'Vernier', 'canton' => 'GE'),
+    '1215' => array('town' => 'Genève', 'canton' => 'GE'),
+    '1216' => array('town' => 'Cointrin', 'canton' => 'GE'),
+    '1217' => array('town' => 'Meyrin', 'canton' => 'GE'),
+    '1218' => array('town' => 'Le Grand-Saconnex', 'canton' => 'GE'),
+    '1219' => array('town' => 'Le Lignon', 'canton' => 'GE'),
+    '1220' => array('town' => 'Les Avanchets', 'canton' => 'GE'),
+    '1222' => array('town' => 'Vésenaz', 'canton' => 'GE'),
+    '1223' => array('town' => 'Cologny', 'canton' => 'GE'),
+    '1224' => array('town' => 'Chêne-Bougeries', 'canton' => 'GE'),
+    '1225' => array('town' => 'Chêne-Bourg', 'canton' => 'GE'),
+    '1226' => array('town' => 'Thônex', 'canton' => 'GE'),
+    '1227' => array('town' => 'Carouge GE', 'canton' => 'GE'),
+    '1228' => array('town' => 'Plan-les-Ouates', 'canton' => 'GE'),
+    '1231' => array('town' => 'Conches', 'canton' => 'GE'),
+    '1232' => array('town' => 'Confignon', 'canton' => 'GE'),
+    '1233' => array('town' => 'Bernex', 'canton' => 'GE'),
+    '1234' => array('town' => 'Vessy', 'canton' => 'GE'),
+    '1236' => array('town' => 'Cartigny', 'canton' => 'GE'),
+    '1237' => array('town' => 'Avully', 'canton' => 'GE'),
+    '1239' => array('town' => 'Collex', 'canton' => 'GE'),
+    '1241' => array('town' => 'Puplinge', 'canton' => 'GE'),
+    '1242' => array('town' => 'Satigny', 'canton' => 'GE'),
+    '1243' => array('town' => 'Presinge', 'canton' => 'GE'),
+    '1244' => array('town' => 'Choulex', 'canton' => 'GE'),
+    '1245' => array('town' => 'Collonge-Bellerive', 'canton' => 'GE'),
+    '1246' => array('town' => 'Corsier GE', 'canton' => 'GE'),
+    '1247' => array('town' => 'Anières', 'canton' => 'GE'),
+    '1248' => array('town' => 'Hermance', 'canton' => 'GE'),
+    '1251' => array('town' => 'Gy', 'canton' => 'GE'),
+    '1252' => array('town' => 'Meinier', 'canton' => 'GE'),
+    '1253' => array('town' => 'Vandoeuvres', 'canton' => 'GE'),
+    '1254' => array('town' => 'Jussy', 'canton' => 'GE'),
+    '1255' => array('town' => 'Veyrier', 'canton' => 'GE'),
+    '1256' => array('town' => 'Troinex', 'canton' => 'GE'),
+    '1257' => array('town' => 'La Croix-de-Rozon', 'canton' => 'GE'),
+    '1258' => array('town' => 'Perly', 'canton' => 'GE'),
+    '1260' => array('town' => 'Nyon', 'canton' => 'VD'),
+    '1277' => array('town' => 'Borex', 'canton' => 'VD'),
+    '1278' => array('town' => 'La Rippe', 'canton' => 'VD'),
+    '1279' => array('town' => 'Chavannes-de-Bogis', 'canton' => 'VD'),
+    '1274' => array('town' => 'Grens', 'canton' => 'VD'),
+    '1275' => array('town' => 'Chéserex', 'canton' => 'VD'),
+    '1276' => array('town' => 'Gingins', 'canton' => 'VD'),
+    '1270' => array('town' => 'Trélex', 'canton' => 'VD'),
+    '1271' => array('town' => 'Givrins', 'canton' => 'VD'),
+    '1272' => array('town' => 'Genolier', 'canton' => 'VD'),
+    '1273' => array('town' => 'Le Muids', 'canton' => 'VD'),
+    '1268' => array('town' => 'Burtigny', 'canton' => 'VD'),
+    '1261' => array('town' => 'Marchissy', 'canton' => 'VD'),
+    '1269' => array('town' => 'Bassins', 'canton' => 'VD'),
+    '1262' => array('town' => 'Eysins', 'canton' => 'VD'),
+    '1263' => array('town' => 'Crassier', 'canton' => 'VD'),
+    '1264' => array('town' => 'St-Cergue', 'canton' => 'VD'),
+    '1265' => array('town' => 'La Cure', 'canton' => 'VD'),
+    '1266' => array('town' => 'Duillier', 'canton' => 'VD'),
+    '1267' => array('town' => 'Vich-Coinsins', 'canton' => 'VD'),
+    '1281' => array('town' => 'Russin', 'canton' => 'GE'),
+    '1283' => array('town' => 'Dardagny', 'canton' => 'GE'),
+    '1284' => array('town' => 'Chancy', 'canton' => 'GE'),
+    '1285' => array('town' => 'Athenaz (Avusy)', 'canton' => 'GE'),
+    '1286' => array('town' => 'Soral', 'canton' => 'GE'),
+    '1287' => array('town' => 'Laconnex', 'canton' => 'GE'),
+    '1288' => array('town' => 'Aire-la-Ville', 'canton' => 'GE'),
+    '1290' => array('town' => 'Versoix', 'canton' => 'GE'),
+    '1291' => array('town' => 'Commugny', 'canton' => 'VD'),
+    '1292' => array('town' => 'Chambésy', 'canton' => 'GE'),
+    '1293' => array('town' => 'Bellevue', 'canton' => 'GE'),
+    '1294' => array('town' => 'Genthod', 'canton' => 'GE'),
+    '1295' => array('town' => 'Mies-Tannay', 'canton' => 'VD'),
+    '1296' => array('town' => 'Coppet', 'canton' => 'VD'),
+    '1297' => array('town' => 'Founex', 'canton' => 'VD'),
+    '1298' => array('town' => 'Céligny', 'canton' => 'GE'),
+    '1299' => array('town' => 'Crans-près-Céligny', 'canton' => 'VD'),
+    '1302' => array('town' => 'Vufflens-la-Ville', 'canton' => 'VD'),
+    '1307' => array('town' => 'Lussery-Villars', 'canton' => 'VD'),
+    '1305' => array('town' => 'Penthalaz', 'canton' => 'VD'),
+    '1315' => array('town' => 'La Sarraz', 'canton' => 'VD'),
+    '1317' => array('town' => 'Orny', 'canton' => 'VD'),
+    '1316' => array('town' => 'Chevilly', 'canton' => 'VD'),
+    '1337' => array('town' => 'Vallorbe', 'canton' => 'VD'),
+    '1338' => array('town' => 'Ballaigues', 'canton' => 'VD'),
+    '1341' => array('town' => 'Orient', 'canton' => 'VD'),
+    '1346' => array('town' => 'Les Bioux', 'canton' => 'VD'),
+    '1344' => array('town' => 'L\'Abbaye', 'canton' => 'VD'),
+    '1342' => array('town' => 'Le Pont', 'canton' => 'VD'),
+    '1343' => array('town' => 'Les Charbonnières', 'canton' => 'VD'),
+    '1345' => array('town' => 'Le Lieu', 'canton' => 'VD'),
+    '1347' => array('town' => 'Le Sentier', 'canton' => 'VD'),
+    '1348' => array('town' => 'Le Brassus', 'canton' => 'VD'),
+    '1306' => array('town' => 'Daillens', 'canton' => 'VD'),
+    '1303' => array('town' => 'Penthaz', 'canton' => 'VD'),
+    '1308' => array('town' => 'La Chaux-Cossonay', 'canton' => 'VD'),
+    '1313' => array('town' => 'Ferreyres', 'canton' => 'VD'),
+    '1321' => array('town' => 'Arnex-sur-Orbe', 'canton' => 'VD'),
+    '1318' => array('town' => 'Pompaples', 'canton' => 'VD'),
+    '1312' => array('town' => 'Eclépens', 'canton' => 'VD'),
+    '1329' => array('town' => 'Bretonnières', 'canton' => 'VD'),
+    '1322' => array('town' => 'Croy', 'canton' => 'VD'),
+    '1323' => array('town' => 'Romainmôtier', 'canton' => 'VD'),
+    '1324' => array('town' => 'Premier', 'canton' => 'VD'),
+    '1325' => array('town' => 'Vaulion', 'canton' => 'VD'),
+    '1326' => array('town' => 'Juriens', 'canton' => 'VD'),
+    '1350' => array('town' => 'Orbe', 'canton' => 'VD'),
+    '1352' => array('town' => 'Agiez', 'canton' => 'VD'),
+    '1353' => array('town' => 'Bofflens', 'canton' => 'VD'),
+    '1354' => array('town' => 'Montcherand', 'canton' => 'VD'),
+    '1355' => array('town' => 'L\'Abergement', 'canton' => 'VD'),
+    '1356' => array('town' => 'Les Clées', 'canton' => 'VD'),
+    '1357' => array('town' => 'Lignerolle', 'canton' => 'VD'),
+    '1358' => array('town' => 'Valeyres-Rances', 'canton' => 'VD'),
+    '1439' => array('town' => 'Rances', 'canton' => 'VD'),
+    '1373' => array('town' => 'Chavornay', 'canton' => 'VD'),
+    '1372' => array('town' => 'Bavois', 'canton' => 'VD'),
+    '1374' => array('town' => 'Corcelles-Chavorn', 'canton' => 'VD'),
+    '1375' => array('town' => 'Penthéréaz', 'canton' => 'VD'),
+    '1376' => array('town' => 'Goumoens-la-Ville', 'canton' => 'VD'),
+    '1400' => array('town' => 'Yverdon-les-Bains', 'canton' => 'VD'),
+    '1401' => array('town' => 'Yverdon-les-Bains', 'canton' => 'VD'),
+    '1416' => array('town' => 'Pailly', 'canton' => 'VD'),
+    '1418' => array('town' => 'Vuarrens', 'canton' => 'VD'),
+    '1420' => array('town' => 'Fiez', 'canton' => 'VD'),
+    '1421' => array('town' => 'Fontaines-Grandson', 'canton' => 'VD'),
+    '1423' => array('town' => 'Villars-Burquin', 'canton' => 'VD'),
+    '1453' => array('town' => 'Mauborget', 'canton' => 'VD'),
+    '1429' => array('town' => 'Giez', 'canton' => 'VD'),
+    '1430' => array('town' => 'Orges', 'canton' => 'VD'),
+    '1431' => array('town' => 'Vugelles-La Mothe', 'canton' => 'VD'),
+    '1405' => array('town' => 'Pomy', 'canton' => 'VD'),
+    '1406' => array('town' => 'Cronay', 'canton' => 'VD'),
+    '1408' => array('town' => 'Prahins', 'canton' => 'VD'),
+    '1409' => array('town' => 'Chanéaz', 'canton' => 'VD'),
+    '1412' => array('town' => 'Valeyres-Ursins', 'canton' => 'VD'),
+    '1413' => array('town' => 'Orzens', 'canton' => 'VD'),
+    '1046' => array('town' => 'Rueyres', 'canton' => 'VD'),
+    '1404' => array('town' => 'Cuarny', 'canton' => 'VD'),
+    '1427' => array('town' => 'Bonvillars', 'canton' => 'VD'),
+    '1424' => array('town' => 'Champagne', 'canton' => 'VD'),
+    '1415' => array('town' => 'Molondin', 'canton' => 'VD'),
+    '1422' => array('town' => 'Grandson', 'canton' => 'VD'),
+    '1425' => array('town' => 'Onnens VD', 'canton' => 'VD'),
+    '1426' => array('town' => 'Concise', 'canton' => 'VD'),
+    '1432' => array('town' => 'Belmont-Yverdon', 'canton' => 'VD'),
+    '1433' => array('town' => 'Suchy', 'canton' => 'VD'),
+    '1434' => array('town' => 'Ependes VD', 'canton' => 'VD'),
+    '1435' => array('town' => 'Essert-Pittet', 'canton' => 'VD'),
+    '1436' => array('town' => 'Treycovagnes', 'canton' => 'VD'),
+    '1437' => array('town' => 'Suscévaz', 'canton' => 'VD'),
+    '1438' => array('town' => 'Mathod', 'canton' => 'VD'),
+    '1441' => array('town' => 'Valeyres-Montagny', 'canton' => 'VD'),
+    '1442' => array('town' => 'Montagny-Yverdon', 'canton' => 'VD'),
+    '1443' => array('town' => 'Champvent', 'canton' => 'VD'),
+    '1445' => array('town' => 'Vuiteboeuf', 'canton' => 'VD'),
+    '1446' => array('town' => 'Baulmes', 'canton' => 'VD'),
+    '1450' => array('town' => 'Ste-Croix', 'canton' => 'VD'),
+    '1454' => array('town' => 'L\'Auberson', 'canton' => 'VD'),
+    '1452' => array('town' => 'Les Rasses', 'canton' => 'VD'),
+    '1462' => array('town' => 'Yvonand', 'canton' => 'VD'),
+    '1463' => array('town' => 'Rovray', 'canton' => 'VD'),
+    '1464' => array('town' => 'Chavannes-le-Chêne', 'canton' => 'VD'),
+    '1468' => array('town' => 'Cheyres', 'canton' => 'FR'),
+    '1470' => array('town' => 'Estavayer-le-Lac', 'canton' => 'FR'),
+    '1473' => array('town' => 'Font', 'canton' => 'FR'),
+    '1474' => array('town' => 'Châbles FR', 'canton' => 'FR'),
+    '1483' => array('town' => 'Montet (Broye)', 'canton' => 'FR'),
+    '1482' => array('town' => 'Cugy FR', 'canton' => 'FR'),
+    '1541' => array('town' => 'Bussy FR', 'canton' => 'FR'),
+    '1484' => array('town' => 'Aumont', 'canton' => 'FR'),
+    '1485' => array('town' => 'Nuvilly', 'canton' => 'FR'),
+    '1486' => array('town' => 'Vuissens', 'canton' => 'FR'),
+    '1537' => array('town' => 'Champtauroz', 'canton' => 'VD'),
+    '1538' => array('town' => 'Treytorrens-Payern', 'canton' => 'VD'),
+    '1489' => array('town' => 'Murist', 'canton' => 'FR'),
+    '1512' => array('town' => 'Chavannes-s-Moudon', 'canton' => 'VD'),
+    '1513' => array('town' => 'Hermenches', 'canton' => 'VD'),
+    '1514' => array('town' => 'Bussy-sur-Moudon', 'canton' => 'VD'),
+    '1522' => array('town' => 'Oulens-sur-Lucens', 'canton' => 'VD'),
+    '1515' => array('town' => 'Villars-le-Comte', 'canton' => 'VD'),
+    '1521' => array('town' => 'Curtilles', 'canton' => 'VD'),
+    '1523' => array('town' => 'Granges-Marnand', 'canton' => 'VD'),
+    '1527' => array('town' => 'Villeneuve FR', 'canton' => 'FR'),
+    '1528' => array('town' => 'Surpierre', 'canton' => 'FR'),
+    '1529' => array('town' => 'Cheiry', 'canton' => 'FR'),
+    '1530' => array('town' => 'Payerne', 'canton' => 'VD'),
+    '1532' => array('town' => 'Fétigny', 'canton' => 'FR'),
+    '1533' => array('town' => 'Ménières', 'canton' => 'FR'),
+    '1534' => array('town' => 'Sassel', 'canton' => 'VD'),
+    '1536' => array('town' => 'Combremont-Petit', 'canton' => 'VD'),
+    '1526' => array('town' => 'Forel-sur-Lucens', 'canton' => 'VD'),
+    '1542' => array('town' => 'Rueyres-les-Prés', 'canton' => 'FR'),
+    '1543' => array('town' => 'Grandcour', 'canton' => 'VD'),
+    '1544' => array('town' => 'Gletterens', 'canton' => 'FR'),
+    '1545' => array('town' => 'Chevroux', 'canton' => 'VD'),
+    '1551' => array('town' => 'Vers-chez-Perrin', 'canton' => 'VD'),
+    '1552' => array('town' => 'Trey', 'canton' => 'VD'),
+    '1553' => array('town' => 'Châtonnaye', 'canton' => 'FR'),
+    '1554' => array('town' => 'Sédeilles', 'canton' => 'VD'),
+    '1555' => array('town' => 'Villarzel', 'canton' => 'VD'),
+    '1682' => array('town' => 'Villars-Bramard', 'canton' => 'VD'),
+    '1535' => array('town' => 'Combremont-Grand', 'canton' => 'VD'),
+    '1562' => array('town' => 'Corcelles-Payerne', 'canton' => 'VD'),
+    '1563' => array('town' => 'Dompierre FR', 'canton' => 'FR'),
+    '1564' => array('town' => 'Domdidier', 'canton' => 'FR'),
+    '1565' => array('town' => 'Missy', 'canton' => 'VD'),
+    '1475' => array('town' => 'Autavaux', 'canton' => 'FR'),
+    '1567' => array('town' => 'Delley', 'canton' => 'FR'),
+    '1568' => array('town' => 'Portalban', 'canton' => 'FR'),
+    '1566' => array('town' => 'St-Aubin FR', 'canton' => 'FR'),
+    '1580' => array('town' => 'Avenches', 'canton' => 'VD'),
+    '1582' => array('town' => 'Donatyre', 'canton' => 'VD'),
+    '1583' => array('town' => 'Villarepos', 'canton' => 'FR'),
+    '1584' => array('town' => 'Villars-le-Grand', 'canton' => 'VD'),
+    '1585' => array('town' => 'Salavaux', 'canton' => 'VD'),
+    '1586' => array('town' => 'Vallamand', 'canton' => 'VD'),
+    '1587' => array('town' => 'Montmagny', 'canton' => 'VD'),
+    '1589' => array('town' => 'Chabrey', 'canton' => 'VD'),
+    '1588' => array('town' => 'Cudrefin', 'canton' => 'VD'),
+    '1595' => array('town' => 'Faoug', 'canton' => 'VD'),
+    '1607' => array('town' => 'Palézieux-Village', 'canton' => 'VD'),
+    '1610' => array('town' => 'Châtillens', 'canton' => 'VD'),
+    '1525' => array('town' => 'Henniez', 'canton' => 'VD'),
+    '1524' => array('town' => 'Marnand', 'canton' => 'VD'),
+    '1090' => array('town' => 'La Croix (Lutry)', 'canton' => 'VD'),
+    '1091' => array('town' => 'Grandvaux', 'canton' => 'VD'),
+    '1070' => array('town' => 'Puidoux-Gare', 'canton' => 'VD'),
+    '1071' => array('town' => 'Chexbres', 'canton' => 'VD'),
+    '1072' => array('town' => 'Forel (Lavaux)', 'canton' => 'VD'),
+    '1614' => array('town' => 'Granges (Veveyse)', 'canton' => 'FR'),
+    '1615' => array('town' => 'Bossonnens', 'canton' => 'FR'),
+    '1616' => array('town' => 'Attalens', 'canton' => 'FR'),
+    '1617' => array('town' => 'Remaufens', 'canton' => 'FR'),
+    '1618' => array('town' => 'Châtel-St-Denis', 'canton' => 'FR'),
+    '1619' => array('town' => 'Les Paccots', 'canton' => 'FR'),
+    '1623' => array('town' => 'Semsales', 'canton' => 'FR'),
+    '1624' => array('town' => 'La Verrerie', 'canton' => 'FR'),
+    '1627' => array('town' => 'Vaulruz', 'canton' => 'FR'),
+    '1628' => array('town' => 'Vuadens', 'canton' => 'FR'),
+    '1630' => array('town' => 'Bulle', 'canton' => 'FR'),
+    '1633' => array('town' => 'Vuippens', 'canton' => 'FR'),
+    '1642' => array('town' => 'Sorens', 'canton' => 'FR'),
+    '1643' => array('town' => 'Gumefens', 'canton' => 'FR'),
+    '1644' => array('town' => 'Avry-devant-Pont', 'canton' => 'FR'),
+    '1645' => array('town' => 'Le Bry', 'canton' => 'FR'),
+    '1646' => array('town' => 'Echarlens', 'canton' => 'FR'),
+    '1647' => array('town' => 'Corbières', 'canton' => 'FR'),
+    '1648' => array('town' => 'Hauteville', 'canton' => 'FR'),
+    '1656' => array('town' => 'Im Fang', 'canton' => 'FR'),
+    '1657' => array('town' => 'Abländschen', 'canton' => 'BE'),
+    '1654' => array('town' => 'Cerniat FR', 'canton' => 'FR'),
+    '1651' => array('town' => 'Villarvolard', 'canton' => 'FR'),
+    '1652' => array('town' => 'Botterens', 'canton' => 'FR'),
+    '1638' => array('town' => 'Morlon', 'canton' => 'FR'),
+    '1663' => array('town' => 'Moléson-s-Gruyères', 'canton' => 'FR'),
+    '1632' => array('town' => 'Riaz', 'canton' => 'FR'),
+    '1634' => array('town' => 'La Roche FR', 'canton' => 'FR'),
+    '1649' => array('town' => 'Pont-la-Ville', 'canton' => 'FR'),
+    '1635' => array('town' => 'La Tour-de-Trême', 'canton' => 'FR'),
+    '1636' => array('town' => 'Broc', 'canton' => 'FR'),
+    '1637' => array('town' => 'Charmey (Gruyère)', 'canton' => 'FR'),
+    '1661' => array('town' => 'Pâquier-Montbarry', 'canton' => 'FR'),
+    '1665' => array('town' => 'Estavannens', 'canton' => 'FR'),
+    '1667' => array('town' => 'Enney', 'canton' => 'FR'),
+    '1669' => array('town' => 'Neirivue', 'canton' => 'FR'),
+    '1666' => array('town' => 'Grandvillard', 'canton' => 'FR'),
+    '1675' => array('town' => 'Vauderens', 'canton' => 'FR'),
+    '1670' => array('town' => 'Ursy', 'canton' => 'FR'),
+    '1674' => array('town' => 'Vuarmarens', 'canton' => 'FR'),
+    '1678' => array('town' => 'Siviriez', 'canton' => 'FR'),
+    '1679' => array('town' => 'Villaraboud', 'canton' => 'FR'),
+    '1676' => array('town' => 'Chavannes-Forts', 'canton' => 'FR'),
+    '1677' => array('town' => 'Prez-vers-Siviriez', 'canton' => 'FR'),
+    '1680' => array('town' => 'Romont FR', 'canton' => 'FR'),
+    '1681' => array('town' => 'Billens', 'canton' => 'FR'),
+    '1683' => array('town' => 'Brenles', 'canton' => 'VD'),
+    '1694' => array('town' => 'Orsonnens', 'canton' => 'FR'),
+    '1695' => array('town' => 'Villarlod', 'canton' => 'FR'),
+    '1696' => array('town' => 'Vuisternens-Ogoz', 'canton' => 'FR'),
+    '1684' => array('town' => 'Mézières FR', 'canton' => 'FR'),
+    '1685' => array('town' => 'Villariaz', 'canton' => 'FR'),
+    '1687' => array('town' => 'Estévenens', 'canton' => 'FR'),
+    '1686' => array('town' => 'Grangettes-Romont', 'canton' => 'FR'),
+    '1689' => array('town' => 'Châtelard-p-Romont', 'canton' => 'FR'),
+    '1688' => array('town' => 'Sommentier', 'canton' => 'FR'),
+    '1626' => array('town' => 'Romanens', 'canton' => 'FR'),
+    '1692' => array('town' => 'Massonnens', 'canton' => 'FR'),
+    '1625' => array('town' => 'Sâles (Gruyère)', 'canton' => 'FR'),
+    '1612' => array('town' => 'Ecoteaux', 'canton' => 'VD'),
+    '1613' => array('town' => 'Maracon', 'canton' => 'VD'),
+    '1608' => array('town' => 'Oron-le-Châtel', 'canton' => 'VD'),
+    '1609' => array('town' => 'St-Martin FR', 'canton' => 'FR'),
+    '1611' => array('town' => 'Le Crêt-p-Semsales', 'canton' => 'FR'),
+    '1697' => array('town' => 'La Joux FR', 'canton' => 'FR'),
+    '1699' => array('town' => 'Bouloz', 'canton' => 'FR'),
+    '1700' => array('town' => 'Fribourg', 'canton' => 'FR'),
+    '1702' => array('town' => 'Fribourg', 'canton' => 'FR'),
+    '1704' => array('town' => 'Fribourg', 'canton' => 'FR'),
+    '1705' => array('town' => 'Fribourg', 'canton' => 'FR'),
+    '1707' => array('town' => 'Fribourg', 'canton' => 'FR'),
+    '1708' => array('town' => 'Fribourg', 'canton' => 'FR'),
+    '1763' => array('town' => 'Granges-Paccot', 'canton' => 'FR'),
+    '1701' => array('town' => 'Fribourg', 'canton' => 'FR'),
+    '1720' => array('town' => 'Corminboeuf', 'canton' => 'FR'),
+    '1721' => array('town' => 'Misery-Courtion', 'canton' => 'FR'),
+    '1735' => array('town' => 'Giffers', 'canton' => 'FR'),
+    '1736' => array('town' => 'St. Silvester', 'canton' => 'FR'),
+    '1737' => array('town' => 'Plasselb', 'canton' => 'FR'),
+    '1738' => array('town' => 'Sangernboden', 'canton' => 'BE'),
+    '1716' => array('town' => 'Schwarzsee', 'canton' => 'FR'),
+    '1724' => array('town' => 'Bonnefontaine', 'canton' => 'FR'),
+    '1727' => array('town' => 'Corpataux-Magneden', 'canton' => 'FR'),
+    '1728' => array('town' => 'Rossens FR', 'canton' => 'FR'),
+    '1719' => array('town' => 'Brünisried', 'canton' => 'FR'),
+    '1731' => array('town' => 'Ependes FR', 'canton' => 'FR'),
+    '1732' => array('town' => 'Arconciel', 'canton' => 'FR'),
+    '1733' => array('town' => 'Treyvaux', 'canton' => 'FR'),
+    '1712' => array('town' => 'Tafers', 'canton' => 'FR'),
+    '1713' => array('town' => 'St. Antoni', 'canton' => 'FR'),
+    '1714' => array('town' => 'Heitenried', 'canton' => 'FR'),
+    '1715' => array('town' => 'Alterswil FR', 'canton' => 'FR'),
+    '1717' => array('town' => 'St. Ursen', 'canton' => 'FR'),
+    '1718' => array('town' => 'Rechthalten', 'canton' => 'FR'),
+    '1722' => array('town' => 'Bourguillon', 'canton' => 'FR'),
+    '1723' => array('town' => 'Marly', 'canton' => 'FR'),
+    '1725' => array('town' => 'Posieux', 'canton' => 'FR'),
+    '1726' => array('town' => 'Farvagny', 'canton' => 'FR'),
+    '1746' => array('town' => 'Prez-vers-Noréaz', 'canton' => 'FR'),
+    '1747' => array('town' => 'Corserey', 'canton' => 'FR'),
+    '1748' => array('town' => 'Torny-le-Grand', 'canton' => 'FR'),
+    '1749' => array('town' => 'Middes', 'canton' => 'FR'),
+    '1740' => array('town' => 'Neyruz FR', 'canton' => 'FR'),
+    '1741' => array('town' => 'Cottens FR', 'canton' => 'FR'),
+    '1744' => array('town' => 'Chénens', 'canton' => 'FR'),
+    '1745' => array('town' => 'Lentigny', 'canton' => 'FR'),
+    '1742' => array('town' => 'Autigny', 'canton' => 'FR'),
+    '1691' => array('town' => 'Villarimboud', 'canton' => 'FR'),
+    '1752' => array('town' => 'Villars-sur-Glâne', 'canton' => 'FR'),
+    '1753' => array('town' => 'Matran', 'canton' => 'FR'),
+    '1754' => array('town' => 'Rosé', 'canton' => 'FR'),
+    '1756' => array('town' => 'Onnens FR', 'canton' => 'FR'),
+    '1757' => array('town' => 'Noréaz', 'canton' => 'FR'),
+    '1690' => array('town' => 'Villaz-St-Pierre', 'canton' => 'FR'),
+    '1762' => array('town' => 'Givisiez', 'canton' => 'FR'),
+    '1772' => array('town' => 'Grolley', 'canton' => 'FR'),
+    '1773' => array('town' => 'Léchelles', 'canton' => 'FR'),
+    '1774' => array('town' => 'Cousset', 'canton' => 'FR'),
+    '1776' => array('town' => 'Montagny-la-Ville', 'canton' => 'FR'),
+    '1795' => array('town' => 'Courlevon', 'canton' => 'FR'),
+    '1796' => array('town' => 'Courgevaux', 'canton' => 'FR'),
+    '1797' => array('town' => 'Münchenwiler', 'canton' => 'BE'),
+    '1794' => array('town' => 'Salvenach', 'canton' => 'FR'),
+    '1793' => array('town' => 'Jeuss', 'canton' => 'FR'),
+    '1792' => array('town' => 'Cordast', 'canton' => 'FR'),
+    '1791' => array('town' => 'Courtaman', 'canton' => 'FR'),
+    '1788' => array('town' => 'Praz (Vully)', 'canton' => 'FR'),
+    '1789' => array('town' => 'Lugnorre', 'canton' => 'FR'),
+    '1782' => array('town' => 'Belfaux', 'canton' => 'FR'),
+    '1783' => array('town' => 'Pensier', 'canton' => 'FR'),
+    '1784' => array('town' => 'Courtepin', 'canton' => 'FR'),
+    '1785' => array('town' => 'Cressier FR', 'canton' => 'FR'),
+    '1786' => array('town' => 'Sugiez', 'canton' => 'FR'),
+    '1787' => array('town' => 'Môtier (Vully)', 'canton' => 'FR'),
+    '1800' => array('town' => 'Vevey', 'canton' => 'VD'),
+    '1801' => array('town' => 'Le Mont-Pèlerin', 'canton' => 'VD'),
+    '1808' => array('town' => 'Monts-de-Corsier', 'canton' => 'VD'),
+    '1809' => array('town' => 'Fenil-sur-Corsier', 'canton' => 'VD'),
+    '1802' => array('town' => 'Corseaux', 'canton' => 'VD'),
+    '1803' => array('town' => 'Chardonne', 'canton' => 'VD'),
+    '1804' => array('town' => 'Corsier-sur-Vevey', 'canton' => 'VD'),
+    '1805' => array('town' => 'Jongny', 'canton' => 'VD'),
+    '1806' => array('town' => 'St-Légier-Chiésaz', 'canton' => 'VD'),
+    '1807' => array('town' => 'Blonay', 'canton' => 'VD'),
+    '1814' => array('town' => 'La Tour-de-Peilz', 'canton' => 'VD'),
+    '1815' => array('town' => 'Clarens', 'canton' => 'VD'),
+    '1816' => array('town' => 'Chailly-Montreux', 'canton' => 'VD'),
+    '1817' => array('town' => 'Brent', 'canton' => 'VD'),
+    '1820' => array('town' => 'Montreux', 'canton' => 'VD'),
+    '1822' => array('town' => 'Chernex', 'canton' => 'VD'),
+    '1823' => array('town' => 'Glion', 'canton' => 'VD'),
+    '1824' => array('town' => 'Caux', 'canton' => 'VD'),
+    '1832' => array('town' => 'Villard-sur-Chamby', 'canton' => 'VD'),
+    '1658' => array('town' => 'La Tine', 'canton' => 'VD'),
+    '1660' => array('town' => 'Les Moulins', 'canton' => 'VD'),
+    '1659' => array('town' => 'Flendruz', 'canton' => 'VD'),
+    '1833' => array('town' => 'Les Avants', 'canton' => 'VD'),
+    '1844' => array('town' => 'Villeneuve VD', 'canton' => 'VD'),
+    '1847' => array('town' => 'Rennaz', 'canton' => 'VD'),
+    '1845' => array('town' => 'Noville', 'canton' => 'VD'),
+    '1846' => array('town' => 'Chessel', 'canton' => 'VD'),
+    '1852' => array('town' => 'Roche VD', 'canton' => 'VD'),
+    '1853' => array('town' => 'Yvorne', 'canton' => 'VD'),
+    '1854' => array('town' => 'Leysin', 'canton' => 'VD'),
+    '1867' => array('town' => 'St-Triphon', 'canton' => 'VD'),
+    '1860' => array('town' => 'Aigle', 'canton' => 'VD'),
+    '1856' => array('town' => 'Corbeyrier', 'canton' => 'VD'),
+    '1862' => array('town' => 'La Comballaz', 'canton' => 'VD'),
+    '1866' => array('town' => 'La Forclaz VD', 'canton' => 'VD'),
+    '1884' => array('town' => 'Huémoz', 'canton' => 'VD'),
+    '1863' => array('town' => 'Le Sépey', 'canton' => 'VD'),
+    '1864' => array('town' => 'Vers-l\'Eglise', 'canton' => 'VD'),
+    '1865' => array('town' => 'Les Diablerets', 'canton' => 'VD'),
+    '1868' => array('town' => 'Collombey', 'canton' => 'VS'),
+    '1870' => array('town' => 'Monthey', 'canton' => 'VS'),
+    '1871' => array('town' => 'Choëx', 'canton' => 'VS'),
+    '1872' => array('town' => 'Troistorrents', 'canton' => 'VS'),
+    '1873' => array('town' => 'Val-d\'Illiez', 'canton' => 'VS'),
+    '1874' => array('town' => 'Champéry', 'canton' => 'VS'),
+    '1875' => array('town' => 'Morgins', 'canton' => 'VS'),
+    '1880' => array('town' => 'Bex', 'canton' => 'VD'),
+    '1882' => array('town' => 'Les Posses-sur-Bex', 'canton' => 'VD'),
+    '1885' => array('town' => 'Chesières', 'canton' => 'VD'),
+    '1890' => array('town' => 'St-Maurice', 'canton' => 'VS'),
+    '1891' => array('town' => 'Vérossaz', 'canton' => 'VS'),
+    '1869' => array('town' => 'Massongex', 'canton' => 'VS'),
+    '1895' => array('town' => 'Vionnaz', 'canton' => 'VS'),
+    '1897' => array('town' => 'Les Evouettes', 'canton' => 'VS'),
+    '1899' => array('town' => 'Torgon', 'canton' => 'VS'),
+    '1892' => array('town' => 'Lavey-Village', 'canton' => 'VD'),
+    '1893' => array('town' => 'Muraz (Collombey)', 'canton' => 'VS'),
+    '1896' => array('town' => 'Vouvry', 'canton' => 'VS'),
+    '1898' => array('town' => 'St-Gingolph', 'canton' => 'VS'),
+    '1902' => array('town' => 'Evionnaz', 'canton' => 'VS'),
+    '1903' => array('town' => 'Collonges', 'canton' => 'VS'),
+    '1904' => array('town' => 'Vernayaz', 'canton' => 'VS'),
+    '1905' => array('town' => 'Dorénaz', 'canton' => 'VS'),
+    '1906' => array('town' => 'Charrat', 'canton' => 'VS'),
+    '1907' => array('town' => 'Saxon', 'canton' => 'VS'),
+    '1908' => array('town' => 'Riddes', 'canton' => 'VS'),
+    '1912' => array('town' => 'Leytron', 'canton' => 'VS'),
+    '1911' => array('town' => 'Ovronnaz', 'canton' => 'VS'),
+    '1913' => array('town' => 'Saillon', 'canton' => 'VS'),
+    '1914' => array('town' => 'Isérables', 'canton' => 'VS'),
+    '1918' => array('town' => 'La Tzoumaz', 'canton' => 'VS'),
+    '1955' => array('town' => 'Chamoson', 'canton' => 'VS'),
+    '1957' => array('town' => 'Ardon', 'canton' => 'VS'),
+    '1920' => array('town' => 'Martigny', 'canton' => 'VS'),
+    '1921' => array('town' => 'Martigny-Croix', 'canton' => 'VS'),
+    '1923' => array('town' => 'Le Trétien', 'canton' => 'VS'),
+    '1925' => array('town' => 'Le Châtelard VS', 'canton' => 'VS'),
+    '1927' => array('town' => 'Chemin', 'canton' => 'VS'),
+    '1929' => array('town' => 'Trient', 'canton' => 'VS'),
+    '1928' => array('town' => 'Ravoire', 'canton' => 'VS'),
+    '1922' => array('town' => 'Salvan', 'canton' => 'VS'),
+    '1926' => array('town' => 'Fully', 'canton' => 'VS'),
+    '1932' => array('town' => 'Bovernier', 'canton' => 'VS'),
+    '1947' => array('town' => 'Versegères', 'canton' => 'VS'),
+    '1941' => array('town' => 'Vollèges', 'canton' => 'VS'),
+    '1942' => array('town' => 'Levron', 'canton' => 'VS'),
+    '1948' => array('town' => 'Lourtier', 'canton' => 'VS'),
+    '1945' => array('town' => 'Liddes', 'canton' => 'VS'),
+    '1946' => array('town' => 'Bourg-St-Pierre', 'canton' => 'VS'),
+    '1943' => array('town' => 'Praz-de-Fort', 'canton' => 'VS'),
+    '1944' => array('town' => 'La Fouly VS', 'canton' => 'VS'),
+    '1933' => array('town' => 'Sembrancher', 'canton' => 'VS'),
+    '1934' => array('town' => 'Le Châble VS', 'canton' => 'VS'),
+    '1936' => array('town' => 'Verbier', 'canton' => 'VS'),
+    '1937' => array('town' => 'Orsières', 'canton' => 'VS'),
+    '1938' => array('town' => 'Champex-Lac', 'canton' => 'VS'),
+    '1950' => array('town' => 'Sion', 'canton' => 'VS'),
+    '1951' => array('town' => 'Sion', 'canton' => 'VS'),
+    '1975' => array('town' => 'St-Séverin', 'canton' => 'VS'),
+    '1976' => array('town' => 'Erde', 'canton' => 'VS'),
+    '1971' => array('town' => 'Grimisuat', 'canton' => 'VS'),
+    '1974' => array('town' => 'Arbaz', 'canton' => 'VS'),
+    '1961' => array('town' => 'Vernamiège', 'canton' => 'VS'),
+    '1973' => array('town' => 'Nax', 'canton' => 'VS'),
+    '1968' => array('town' => 'Mase', 'canton' => 'VS'),
+    '1969' => array('town' => 'St-Martin VS', 'canton' => 'VS'),
+    '1981' => array('town' => 'Vex', 'canton' => 'VS'),
+    '1982' => array('town' => 'Euseigne', 'canton' => 'VS'),
+    '1984' => array('town' => 'Les Haudères', 'canton' => 'VS'),
+    '1986' => array('town' => 'Arolla', 'canton' => 'VS'),
+    '1985' => array('town' => 'La Sage', 'canton' => 'VS'),
+    '1987' => array('town' => 'Hérémence', 'canton' => 'VS'),
+    '1988' => array('town' => 'Les Collons', 'canton' => 'VS'),
+    '1991' => array('town' => 'Salins', 'canton' => 'VS'),
+    '1992' => array('town' => 'Les Agettes', 'canton' => 'VS'),
+    '1993' => array('town' => 'Veysonnaz', 'canton' => 'VS'),
+    '1997' => array('town' => 'Siviez (Nendaz)', 'canton' => 'VS'),
+    '1996' => array('town' => 'Fey (Nendaz)', 'canton' => 'VS'),
+    '1994' => array('town' => 'Aproz (Nendaz)', 'canton' => 'VS'),
+    '1962' => array('town' => 'Pont-de-la-Morge', 'canton' => 'VS'),
+    '1963' => array('town' => 'Vétroz', 'canton' => 'VS'),
+    '1964' => array('town' => 'Conthey', 'canton' => 'VS'),
+    '1965' => array('town' => 'Savièse', 'canton' => 'VS'),
+    '1966' => array('town' => 'Ayent', 'canton' => 'VS'),
+    '1967' => array('town' => 'Bramois', 'canton' => 'VS'),
+    '1983' => array('town' => 'Evolène', 'canton' => 'VS'),
+    '1972' => array('town' => 'Anzère', 'canton' => 'VS'),
+    '2000' => array('town' => 'Neuchâtel', 'canton' => 'NE'),
+    '2004' => array('town' => 'Neuchâtel 4', 'canton' => 'NE'),
+    '2007' => array('town' => 'Neuchâtel 7', 'canton' => 'NE'),
+    '2008' => array('town' => 'Neuchâtel', 'canton' => 'NE'),
+    '2009' => array('town' => 'Neuchâtel 9', 'canton' => 'NE'),
+    '2001' => array('town' => 'Neuchâtel 1', 'canton' => 'NE'),
+    '2002' => array('town' => 'Neuchâtel 2', 'canton' => 'NE'),
+    '2003' => array('town' => 'Neuchâtel 3', 'canton' => 'NE'),
+    '2006' => array('town' => 'Neuchâtel 6', 'canton' => 'NE'),
+    '2012' => array('town' => 'Auvernier', 'canton' => 'NE'),
+    '2013' => array('town' => 'Colombier NE', 'canton' => 'NE'),
+    '2014' => array('town' => 'Bôle', 'canton' => 'NE'),
+    '2015' => array('town' => 'Areuse', 'canton' => 'NE'),
+    '2016' => array('town' => 'Cortaillod', 'canton' => 'NE'),
+    '2017' => array('town' => 'Boudry', 'canton' => 'NE'),
+    '2022' => array('town' => 'Bevaix', 'canton' => 'NE'),
+    '2023' => array('town' => 'Gorgier', 'canton' => 'NE'),
+    '2024' => array('town' => 'St-Aubin-Sauges', 'canton' => 'NE'),
+    '2025' => array('town' => 'Chez-le-Bart', 'canton' => 'NE'),
+    '2028' => array('town' => 'Vaumarcus', 'canton' => 'NE'),
+    '2034' => array('town' => 'Peseux', 'canton' => 'NE'),
+    '2035' => array('town' => 'Corcelles NE', 'canton' => 'NE'),
+    '2036' => array('town' => 'Cormondrèche', 'canton' => 'NE'),
+    '2042' => array('town' => 'Valangin', 'canton' => 'NE'),
+    '2043' => array('town' => 'Boudevilliers', 'canton' => 'NE'),
+    '2046' => array('town' => 'Fontaines NE', 'canton' => 'NE'),
+    '2052' => array('town' => 'Fontainemelon', 'canton' => 'NE'),
+    '2053' => array('town' => 'Cernier', 'canton' => 'NE'),
+    '2054' => array('town' => 'Chézard-St-Martin', 'canton' => 'NE'),
+    '2056' => array('town' => 'Dombresson', 'canton' => 'NE'),
+    '2057' => array('town' => 'Villiers', 'canton' => 'NE'),
+    '2058' => array('town' => 'Le Pâquier NE', 'canton' => 'NE'),
+    '2063' => array('town' => 'Vilars NE', 'canton' => 'NE'),
+    '2065' => array('town' => 'Savagnier', 'canton' => 'NE'),
+    '2067' => array('town' => 'Chaumont', 'canton' => 'NE'),
+    '2068' => array('town' => 'Hauterive NE', 'canton' => 'NE'),
+    '2072' => array('town' => 'St-Blaise', 'canton' => 'NE'),
+    '2073' => array('town' => 'Enges', 'canton' => 'NE'),
+    '2074' => array('town' => 'Marin-Epagnier', 'canton' => 'NE'),
+    '3238' => array('town' => 'Gals', 'canton' => 'BE'),
+    '2087' => array('town' => 'Cornaux NE', 'canton' => 'NE'),
+    '2088' => array('town' => 'Cressier NE', 'canton' => 'NE'),
+    '2318' => array('town' => 'Brot-Plamboz', 'canton' => 'NE'),
+    '2103' => array('town' => 'Noiraigue', 'canton' => 'NE'),
+    '2105' => array('town' => 'Travers', 'canton' => 'NE'),
+    '2108' => array('town' => 'Couvet', 'canton' => 'NE'),
+    '2112' => array('town' => 'Môtiers NE', 'canton' => 'NE'),
+    '2113' => array('town' => 'Boveresse', 'canton' => 'NE'),
+    '2114' => array('town' => 'Fleurier', 'canton' => 'NE'),
+    '2115' => array('town' => 'Buttes', 'canton' => 'NE'),
+    '2117' => array('town' => 'La Côte-aux-Fées', 'canton' => 'NE'),
+    '2123' => array('town' => 'St-Sulpice NE', 'canton' => 'NE'),
+    '2406' => array('town' => 'La Brévine', 'canton' => 'NE'),
+    '2126' => array('town' => 'Les Verrières', 'canton' => 'NE'),
+    '2127' => array('town' => 'Les Bayards', 'canton' => 'NE'),
+    '2149' => array('town' => 'Champ-du-Moulin', 'canton' => 'NE'),
+    '2124' => array('town' => 'Les Sagnettes', 'canton' => 'NE'),
+    '2116' => array('town' => 'Mont-de-Buttes', 'canton' => 'NE'),
+    '2019' => array('town' => 'Chambrelien', 'canton' => 'NE'),
+    '2037' => array('town' => 'Montmollin', 'canton' => 'NE'),
+    '2206' => array('town' => 'Geneveys-Coffrane', 'canton' => 'NE'),
+    '2207' => array('town' => 'Coffrane', 'canton' => 'NE'),
+    '2208' => array('town' => 'Les Hauts-Geneveys', 'canton' => 'NE'),
+    '2300' => array('town' => 'La Chaux-de-Fonds', 'canton' => 'NE'),
+    '2302' => array('town' => 'La Chaux-de-Fonds', 'canton' => 'NE'),
+    '2303' => array('town' => 'La Chaux-de-Fonds', 'canton' => 'NE'),
+    '2306' => array('town' => 'La Chaux-de-Fonds', 'canton' => 'NE'),
+    '2301' => array('town' => 'La Chaux-de-Fonds', 'canton' => 'NE'),
+    '2304' => array('town' => 'La Chaux-de-Fonds', 'canton' => 'NE'),
+    '2316' => array('town' => 'Petit-Martel', 'canton' => 'NE'),
+    '2338' => array('town' => 'Les Emibois', 'canton' => 'JU'),
+    '2314' => array('town' => 'La Sagne NE', 'canton' => 'NE'),
+    '2322' => array('town' => 'Le Crêt-du-Locle', 'canton' => 'NE'),
+    '2325' => array('town' => 'Les Planchettes', 'canton' => 'NE'),
+    '2333' => array('town' => 'La Ferrière', 'canton' => 'BE'),
+    '2336' => array('town' => 'Les Bois', 'canton' => 'JU'),
+    '2400' => array('town' => 'Le Locle', 'canton' => 'NE'),
+    '2405' => array('town' => 'La Chaux-du-Milieu', 'canton' => 'NE'),
+    '2414' => array('town' => 'Cerneux-Péquignot', 'canton' => 'NE'),
+    '2416' => array('town' => 'Les Brenets', 'canton' => 'NE'),
+    '2500' => array('town' => 'Biel/Bienne', 'canton' => 'BE'),
+    '2501' => array('town' => 'Biel/Bienne', 'canton' => 'BE'),
+    '2502' => array('town' => 'Biel/Bienne', 'canton' => 'BE'),
+    '2503' => array('town' => 'Biel/Bienne', 'canton' => 'BE'),
+    '2504' => array('town' => 'Biel/Bienne', 'canton' => 'BE'),
+    '2505' => array('town' => 'Biel/Bienne', 'canton' => 'BE'),
+    '2512' => array('town' => 'Tüscherz-Alfermée', 'canton' => 'BE'),
+    '2513' => array('town' => 'Twann', 'canton' => 'BE'),
+    '2514' => array('town' => 'Ligerz', 'canton' => 'BE'),
+    '2515' => array('town' => 'Prêles', 'canton' => 'BE'),
+    '2516' => array('town' => 'Lamboing', 'canton' => 'BE'),
+    '2517' => array('town' => 'Diesse', 'canton' => 'BE'),
+    '2518' => array('town' => 'Nods', 'canton' => 'BE'),
+    '2520' => array('town' => 'La Neuveville', 'canton' => 'BE'),
+    '2523' => array('town' => 'Lignières', 'canton' => 'NE'),
+    '2525' => array('town' => 'Le Landeron', 'canton' => 'NE'),
+    '2532' => array('town' => 'Magglingen/Macolin', 'canton' => 'BE'),
+    '2533' => array('town' => 'Evilard', 'canton' => 'BE'),
+    '2534' => array('town' => 'Orvin', 'canton' => 'BE'),
+    '2535' => array('town' => 'Frinvillier', 'canton' => 'BE'),
+    '2536' => array('town' => 'Plagne', 'canton' => 'BE'),
+    '2537' => array('town' => 'Vauffelin', 'canton' => 'BE'),
+    '2538' => array('town' => 'Romont BE', 'canton' => 'BE'),
+    '2540' => array('town' => 'Grenchen', 'canton' => 'SO'),
+    '2542' => array('town' => 'Pieterlen', 'canton' => 'BE'),
+    '2543' => array('town' => 'Lengnau BE', 'canton' => 'BE'),
+    '2544' => array('town' => 'Bettlach', 'canton' => 'SO'),
+    '2545' => array('town' => 'Selzach', 'canton' => 'SO'),
+    '2552' => array('town' => 'Orpund', 'canton' => 'BE'),
+    '2553' => array('town' => 'Safnern', 'canton' => 'BE'),
+    '2554' => array('town' => 'Meinisberg', 'canton' => 'BE'),
+    '2555' => array('town' => 'Brügg BE', 'canton' => 'BE'),
+    '2556' => array('town' => 'Scheuren', 'canton' => 'BE'),
+    '2557' => array('town' => 'Studen BE', 'canton' => 'BE'),
+    '2558' => array('town' => 'Aegerten', 'canton' => 'BE'),
+    '2560' => array('town' => 'Nidau', 'canton' => 'BE'),
+    '2562' => array('town' => 'Port', 'canton' => 'BE'),
+    '2563' => array('town' => 'Ipsach', 'canton' => 'BE'),
+    '2564' => array('town' => 'Bellmund', 'canton' => 'BE'),
+    '2565' => array('town' => 'Jens', 'canton' => 'BE'),
+    '2572' => array('town' => 'Sutz', 'canton' => 'BE'),
+    '2575' => array('town' => 'Täuffelen', 'canton' => 'BE'),
+    '2576' => array('town' => 'Lüscherz', 'canton' => 'BE'),
+    '2577' => array('town' => 'Siselen BE', 'canton' => 'BE'),
+    '3237' => array('town' => 'Brüttelen', 'canton' => 'BE'),
+    '2603' => array('town' => 'Péry', 'canton' => 'BE'),
+    '2604' => array('town' => 'La Heutte', 'canton' => 'BE'),
+    '2605' => array('town' => 'Sonceboz-Sombeval', 'canton' => 'BE'),
+    '2606' => array('town' => 'Corgémont', 'canton' => 'BE'),
+    '2607' => array('town' => 'Cortébert', 'canton' => 'BE'),
+    '2608' => array('town' => 'Courtelary', 'canton' => 'BE'),
+    '2610' => array('town' => 'St-Imier', 'canton' => 'BE'),
+    '2612' => array('town' => 'Cormoret', 'canton' => 'BE'),
+    '2613' => array('town' => 'Villeret', 'canton' => 'BE'),
+    '2615' => array('town' => 'Sonvilier', 'canton' => 'BE'),
+    '2616' => array('town' => 'Renan BE', 'canton' => 'BE'),
+    '2710' => array('town' => 'Tavannes', 'canton' => 'BE'),
+    '2712' => array('town' => 'Le Fuet', 'canton' => 'BE'),
+    '2714' => array('town' => 'Le Prédame', 'canton' => 'JU'),
+    '2717' => array('town' => 'Fornet-Dessous', 'canton' => 'BE'),
+    '2718' => array('town' => 'Fornet-Dessus', 'canton' => 'JU'),
+    '2716' => array('town' => 'Sornetan', 'canton' => 'BE'),
+    '2713' => array('town' => 'Bellelay', 'canton' => 'BE'),
+    '2720' => array('town' => 'Tramelan', 'canton' => 'BE'),
+    '2722' => array('town' => 'Les Reussilles', 'canton' => 'BE'),
+    '2723' => array('town' => 'Mont-Tramelan', 'canton' => 'BE'),
+    '2345' => array('town' => 'Les Breuleux', 'canton' => 'JU'),
+    '2340' => array('town' => 'Le Noirmont', 'canton' => 'JU'),
+    '2350' => array('town' => 'Saignelégier', 'canton' => 'JU'),
+    '2353' => array('town' => 'Les Pommerats', 'canton' => 'JU'),
+    '2354' => array('town' => 'Goumois', 'canton' => 'JU'),
+    '2732' => array('town' => 'Reconvilier', 'canton' => 'BE'),
+    '2733' => array('town' => 'Pontenet', 'canton' => 'BE'),
+    '2735' => array('town' => 'Malleray-Bévilard', 'canton' => 'BE'),
+    '2736' => array('town' => 'Sorvilier', 'canton' => 'BE'),
+    '2738' => array('town' => 'Court', 'canton' => 'BE'),
+    '2740' => array('town' => 'Moutier', 'canton' => 'BE'),
+    '2742' => array('town' => 'Perrefitte', 'canton' => 'BE'),
+    '2748' => array('town' => 'Souboz', 'canton' => 'BE'),
+    '2743' => array('town' => 'Eschert', 'canton' => 'BE'),
+    '2744' => array('town' => 'Belprahon', 'canton' => 'BE'),
+    '2747' => array('town' => 'Seehof', 'canton' => 'BE'),
+    '2745' => array('town' => 'Grandval', 'canton' => 'BE'),
+    '2746' => array('town' => 'Crémines', 'canton' => 'BE'),
+    '2762' => array('town' => 'Roches BE', 'canton' => 'BE'),
+    '2832' => array('town' => 'Rebeuvelier', 'canton' => 'JU'),
+    '2830' => array('town' => 'Courrendlin', 'canton' => 'JU'),
+    '2800' => array('town' => 'Delémont', 'canton' => 'JU'),
+    '2802' => array('town' => 'Develier', 'canton' => 'JU'),
+    '2803' => array('town' => 'Bourrignon', 'canton' => 'JU'),
+    '2805' => array('town' => 'Soyhières', 'canton' => 'JU'),
+    '2806' => array('town' => 'Mettembert', 'canton' => 'JU'),
+    '2807' => array('town' => 'Pleigne', 'canton' => 'JU'),
+    '2812' => array('town' => 'Movelier', 'canton' => 'JU'),
+    '2813' => array('town' => 'Ederswiler', 'canton' => 'JU'),
+    '2814' => array('town' => 'Roggenburg', 'canton' => 'BL'),
+    '2822' => array('town' => 'Courroux', 'canton' => 'JU'),
+    '2823' => array('town' => 'Courcelon', 'canton' => 'JU'),
+    '2824' => array('town' => 'Vicques', 'canton' => 'JU'),
+    '2825' => array('town' => 'Courchapoix', 'canton' => 'JU'),
+    '2826' => array('town' => 'Corban', 'canton' => 'JU'),
+    '2827' => array('town' => 'Mervelier', 'canton' => 'JU'),
+    '2828' => array('town' => 'Montsevelier', 'canton' => 'JU'),
+    '2829' => array('town' => 'Vermes', 'canton' => 'JU'),
+    '2842' => array('town' => 'Rossemaison', 'canton' => 'JU'),
+    '2843' => array('town' => 'Châtillon JU', 'canton' => 'JU'),
+    '2852' => array('town' => 'Courtételle', 'canton' => 'JU'),
+    '2853' => array('town' => 'Courfaivre', 'canton' => 'JU'),
+    '2854' => array('town' => 'Bassecourt', 'canton' => 'JU'),
+    '2855' => array('town' => 'Glovelier', 'canton' => 'JU'),
+    '2856' => array('town' => 'Boécourt', 'canton' => 'JU'),
+    '2857' => array('town' => 'Montavon', 'canton' => 'JU'),
+    '2863' => array('town' => 'Undervelier', 'canton' => 'JU'),
+    '2864' => array('town' => 'Soulce', 'canton' => 'JU'),
+    '2873' => array('town' => 'Saulcy', 'canton' => 'JU'),
+    '2882' => array('town' => 'St-Ursanne', 'canton' => 'JU'),
+    '2883' => array('town' => 'Montmelon', 'canton' => 'JU'),
+    '2884' => array('town' => 'Montenol', 'canton' => 'JU'),
+    '2885' => array('town' => 'Epauvillers', 'canton' => 'JU'),
+    '2886' => array('town' => 'Epiquerez', 'canton' => 'JU'),
+    '2887' => array('town' => 'Soubey', 'canton' => 'JU'),
+    '2888' => array('town' => 'Seleute', 'canton' => 'JU'),
+    '2889' => array('town' => 'Ocourt', 'canton' => 'JU'),
+    '2950' => array('town' => 'Courgenay', 'canton' => 'JU'),
+    '2900' => array('town' => 'Porrentruy', 'canton' => 'JU'),
+    '2902' => array('town' => 'Fontenais', 'canton' => 'JU'),
+    '2903' => array('town' => 'Villars-Fontenais', 'canton' => 'JU'),
+    '2904' => array('town' => 'Bressaucourt', 'canton' => 'JU'),
+    '2905' => array('town' => 'Courtedoux', 'canton' => 'JU'),
+    '2906' => array('town' => 'Chevenez', 'canton' => 'JU'),
+    '2907' => array('town' => 'Rocourt', 'canton' => 'JU'),
+    '2908' => array('town' => 'Grandfontaine', 'canton' => 'JU'),
+    '2912' => array('town' => 'Roche-d\'Or', 'canton' => 'JU'),
+    '2914' => array('town' => 'Damvant', 'canton' => 'JU'),
+    '2915' => array('town' => 'Bure', 'canton' => 'JU'),
+    '2916' => array('town' => 'Fahy', 'canton' => 'JU'),
+    '2922' => array('town' => 'Courchavon', 'canton' => 'JU'),
+    '2923' => array('town' => 'Courtemaîche', 'canton' => 'JU'),
+    '2924' => array('town' => 'Montignez', 'canton' => 'JU'),
+    '2925' => array('town' => 'Buix', 'canton' => 'JU'),
+    '2926' => array('town' => 'Boncourt', 'canton' => 'JU'),
+    '2932' => array('town' => 'Coeuve', 'canton' => 'JU'),
+    '2935' => array('town' => 'Beurnevésin', 'canton' => 'JU'),
+    '2942' => array('town' => 'Alle', 'canton' => 'JU'),
+    '2943' => array('town' => 'Vendlincourt', 'canton' => 'JU'),
+    '2944' => array('town' => 'Bonfol', 'canton' => 'JU'),
+    '2946' => array('town' => 'Miécourt', 'canton' => 'JU'),
+    '2947' => array('town' => 'Charmoille', 'canton' => 'JU'),
+    '2952' => array('town' => 'Cornol', 'canton' => 'JU'),
+    '2953' => array('town' => 'Fregiécourt-Pleuj', 'canton' => 'JU'),
+    '2954' => array('town' => 'Asuel', 'canton' => 'JU'),
+    '3000' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3001' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3002' => array('town' => 'Bern Postfinance', 'canton' => 'BE'),
+    '3003' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3004' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3005' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3006' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3007' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3008' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3010' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3011' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3012' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3013' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3014' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3015' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3018' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3019' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3020' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3027' => array('town' => 'Bern', 'canton' => 'BE'),
+    '3095' => array('town' => 'Spiegel b. Bern', 'canton' => 'BE'),
+    '3032' => array('town' => 'Hinterkappelen', 'canton' => 'BE'),
+    '3033' => array('town' => 'Wohlen b. Bern', 'canton' => 'BE'),
+    '3034' => array('town' => 'Murzelen', 'canton' => 'BE'),
+    '3035' => array('town' => 'Frieswil', 'canton' => 'BE'),
+    '3036' => array('town' => 'Detligen', 'canton' => 'BE'),
+    '3037' => array('town' => 'Herrenschwanden', 'canton' => 'BE'),
+    '3038' => array('town' => 'Kirchlindach', 'canton' => 'BE'),
+    '3042' => array('town' => 'Ortschwaben', 'canton' => 'BE'),
+    '3043' => array('town' => 'Uettligen', 'canton' => 'BE'),
+    '3049' => array('town' => 'Säriswil', 'canton' => 'BE'),
+    '3045' => array('town' => 'Meikirch', 'canton' => 'BE'),
+    '3046' => array('town' => 'Wahlendorf', 'canton' => 'BE'),
+    '3047' => array('town' => 'Bremgarten b. Bern', 'canton' => 'BE'),
+    '3048' => array('town' => 'Worblaufen', 'canton' => 'BE'),
+    '3052' => array('town' => 'Zollikofen', 'canton' => 'BE'),
+    '3053' => array('town' => 'Münchenbuchsee', 'canton' => 'BE'),
+    '3054' => array('town' => 'Schüpfen', 'canton' => 'BE'),
+    '3063' => array('town' => 'Ittigen', 'canton' => 'BE'),
+    '3065' => array('town' => 'Bolligen', 'canton' => 'BE'),
+    '3066' => array('town' => 'Stettlen', 'canton' => 'BE'),
+    '3067' => array('town' => 'Boll', 'canton' => 'BE'),
+    '3068' => array('town' => 'Utzigen', 'canton' => 'BE'),
+    '3072' => array('town' => 'Ostermundigen', 'canton' => 'BE'),
+    '3073' => array('town' => 'Gümligen', 'canton' => 'BE'),
+    '3074' => array('town' => 'Muri b. Bern', 'canton' => 'BE'),
+    '3075' => array('town' => 'Rüfenacht BE', 'canton' => 'BE'),
+    '3076' => array('town' => 'Worb', 'canton' => 'BE'),
+    '3077' => array('town' => 'Enggistein', 'canton' => 'BE'),
+    '3078' => array('town' => 'Richigen', 'canton' => 'BE'),
+    '3082' => array('town' => 'Schlosswil', 'canton' => 'BE'),
+    '3083' => array('town' => 'Trimstein', 'canton' => 'BE'),
+    '3084' => array('town' => 'Wabern', 'canton' => 'BE'),
+    '3088' => array('town' => 'Oberbütschel', 'canton' => 'BE'),
+    '3086' => array('town' => 'Zimmerwald', 'canton' => 'BE'),
+    '3087' => array('town' => 'Niedermuhlern', 'canton' => 'BE'),
+    '3089' => array('town' => 'Hinterfultigen', 'canton' => 'BE'),
+    '3096' => array('town' => 'Oberbalm', 'canton' => 'BE'),
+    '3097' => array('town' => 'Liebefeld', 'canton' => 'BE'),
+    '3098' => array('town' => 'Köniz', 'canton' => 'BE'),
+    '3099' => array('town' => 'Rüti b. Riggisberg', 'canton' => 'BE'),
+    '3110' => array('town' => 'Münsingen', 'canton' => 'BE'),
+    '3112' => array('town' => 'Allmendingen b. BE', 'canton' => 'BE'),
+    '3114' => array('town' => 'Wichtrach', 'canton' => 'BE'),
+    '3115' => array('town' => 'Gerzensee', 'canton' => 'BE'),
+    '3116' => array('town' => 'Kirchdorf BE', 'canton' => 'BE'),
+    '3629' => array('town' => 'Kiesen', 'canton' => 'BE'),
+    '3628' => array('town' => 'Uttigen', 'canton' => 'BE'),
+    '3122' => array('town' => 'Kehrsatz', 'canton' => 'BE'),
+    '3123' => array('town' => 'Belp', 'canton' => 'BE'),
+    '3124' => array('town' => 'Belpberg', 'canton' => 'BE'),
+    '3125' => array('town' => 'Toffen', 'canton' => 'BE'),
+    '3126' => array('town' => 'Kaufdorf', 'canton' => 'BE'),
+    '3127' => array('town' => 'Mühlethurnen', 'canton' => 'BE'),
+    '3128' => array('town' => 'Kirchenthurnen', 'canton' => 'BE'),
+    '3132' => array('town' => 'Riggisberg', 'canton' => 'BE'),
+    '3664' => array('town' => 'Burgistein', 'canton' => 'BE'),
+    '3665' => array('town' => 'Wattenwil', 'canton' => 'BE'),
+    '3662' => array('town' => 'Seftigen', 'canton' => 'BE'),
+    '3663' => array('town' => 'Gurzelen', 'canton' => 'BE'),
+    '3661' => array('town' => 'Uetendorf', 'canton' => 'BE'),
+    '3144' => array('town' => 'Gasel', 'canton' => 'BE'),
+    '3145' => array('town' => 'Niederscherli', 'canton' => 'BE'),
+    '3147' => array('town' => 'Mittelhäusern', 'canton' => 'BE'),
+    '3148' => array('town' => 'Lanzenhäusern', 'canton' => 'BE'),
+    '3150' => array('town' => 'Schwarzenburg', 'canton' => 'BE'),
+    '3152' => array('town' => 'Mamishaus', 'canton' => 'BE'),
+    '3153' => array('town' => 'Rüschegg Gambach', 'canton' => 'BE'),
+    '3154' => array('town' => 'Rüschegg Heubach', 'canton' => 'BE'),
+    '3155' => array('town' => 'Helgisried', 'canton' => 'BE'),
+    '3156' => array('town' => 'Riffenmatt', 'canton' => 'BE'),
+    '3157' => array('town' => 'Milken', 'canton' => 'BE'),
+    '3158' => array('town' => 'Guggisberg', 'canton' => 'BE'),
+    '3159' => array('town' => 'Riedstätt', 'canton' => 'BE'),
+    '3172' => array('town' => 'Niederwangen BE', 'canton' => 'BE'),
+    '3173' => array('town' => 'Oberwangen b. Bern', 'canton' => 'BE'),
+    '3174' => array('town' => 'Thörishaus', 'canton' => 'BE'),
+    '3175' => array('town' => 'Flamatt', 'canton' => 'FR'),
+    '3176' => array('town' => 'Neuenegg', 'canton' => 'BE'),
+    '3177' => array('town' => 'Laupen BE', 'canton' => 'BE'),
+    '3178' => array('town' => 'Bösingen', 'canton' => 'FR'),
+    '3179' => array('town' => 'Kriechenwil', 'canton' => 'BE'),
+    '3182' => array('town' => 'Ueberstorf', 'canton' => 'FR'),
+    '3183' => array('town' => 'Albligen', 'canton' => 'BE'),
+    '3184' => array('town' => 'Wünnewil', 'canton' => 'FR'),
+    '3186' => array('town' => 'Düdingen', 'canton' => 'FR'),
+    '3202' => array('town' => 'Frauenkappelen', 'canton' => 'BE'),
+    '3203' => array('town' => 'Mühleberg', 'canton' => 'BE'),
+    '3204' => array('town' => 'Rosshäusern', 'canton' => 'BE'),
+    '3205' => array('town' => 'Gümmenen', 'canton' => 'BE'),
+    '3206' => array('town' => 'Rizenbach', 'canton' => 'BE'),
+    '3207' => array('town' => 'Wileroltigen', 'canton' => 'BE'),
+    '3208' => array('town' => 'Gurbrü', 'canton' => 'BE'),
+    '3210' => array('town' => 'Kerzers', 'canton' => 'FR'),
+    '3216' => array('town' => 'Ried b. Kerzers', 'canton' => 'FR'),
+    '3215' => array('town' => 'Gempenach', 'canton' => 'FR'),
+    '3214' => array('town' => 'Ulmiz', 'canton' => 'FR'),
+    '3213' => array('town' => 'Liebistorf', 'canton' => 'FR'),
+    '3212' => array('town' => 'Gurmels', 'canton' => 'FR'),
+    '3225' => array('town' => 'Müntschemier', 'canton' => 'BE'),
+    '3226' => array('town' => 'Treiten', 'canton' => 'BE'),
+    '3232' => array('town' => 'Ins', 'canton' => 'BE'),
+    '3233' => array('town' => 'Tschugg', 'canton' => 'BE'),
+    '3234' => array('town' => 'Vinelz', 'canton' => 'BE'),
+    '3235' => array('town' => 'Erlach', 'canton' => 'BE'),
+    '3236' => array('town' => 'Gampelen', 'canton' => 'BE'),
+    '3250' => array('town' => 'Lyss', 'canton' => 'BE'),
+    '3251' => array('town' => 'Wengi b. Büren', 'canton' => 'BE'),
+    '3252' => array('town' => 'Worben', 'canton' => 'BE'),
+    '3253' => array('town' => 'Schnottwil', 'canton' => 'SO'),
+    '3254' => array('town' => 'Messen', 'canton' => 'SO'),
+    '3255' => array('town' => 'Rapperswil BE', 'canton' => 'BE'),
+    '3256' => array('town' => 'Dieterswil', 'canton' => 'BE'),
+    '3257' => array('town' => 'Grossaffoltern', 'canton' => 'BE'),
+    '3262' => array('town' => 'Suberg', 'canton' => 'BE'),
+    '3263' => array('town' => 'Büetigen', 'canton' => 'BE'),
+    '3264' => array('town' => 'Diessbach b. Büren', 'canton' => 'BE'),
+    '3266' => array('town' => 'Wiler b. Seedorf', 'canton' => 'BE'),
+    '3267' => array('town' => 'Seedorf BE', 'canton' => 'BE'),
+    '3268' => array('town' => 'Lobsigen', 'canton' => 'BE'),
+    '3270' => array('town' => 'Aarberg', 'canton' => 'BE'),
+    '3271' => array('town' => 'Radelfingen', 'canton' => 'BE'),
+    '3272' => array('town' => 'Walperswil', 'canton' => 'BE'),
+    '3273' => array('town' => 'Kappelen', 'canton' => 'BE'),
+    '3274' => array('town' => 'Hermrigen', 'canton' => 'BE'),
+    '3280' => array('town' => 'Murten', 'canton' => 'FR'),
+    '3282' => array('town' => 'Bargen BE', 'canton' => 'BE'),
+    '3283' => array('town' => 'Kallnach', 'canton' => 'BE'),
+    '3284' => array('town' => 'Fräschels', 'canton' => 'FR'),
+    '3285' => array('town' => 'Galmiz', 'canton' => 'FR'),
+    '3286' => array('town' => 'Muntelier', 'canton' => 'FR'),
+    '3292' => array('town' => 'Busswil b. Büren', 'canton' => 'BE'),
+    '3293' => array('town' => 'Dotzigen', 'canton' => 'BE'),
+    '3294' => array('town' => 'Büren an der Aare', 'canton' => 'BE'),
+    '3295' => array('town' => 'Rüti b. Büren', 'canton' => 'BE'),
+    '3296' => array('town' => 'Arch', 'canton' => 'BE'),
+    '3297' => array('town' => 'Leuzigen', 'canton' => 'BE'),
+    '3298' => array('town' => 'Oberwil b. Büren', 'canton' => 'BE'),
+    '3302' => array('town' => 'Moosseedorf', 'canton' => 'BE'),
+    '3303' => array('town' => 'Jegenstorf', 'canton' => 'BE'),
+    '3308' => array('town' => 'Grafenried', 'canton' => 'BE'),
+    '3312' => array('town' => 'Fraubrunnen', 'canton' => 'BE'),
+    '3313' => array('town' => 'Büren zum Hof', 'canton' => 'BE'),
+    '3314' => array('town' => 'Schalunen', 'canton' => 'BE'),
+    '3315' => array('town' => 'Bätterkinden', 'canton' => 'BE'),
+    '3321' => array('town' => 'Schönbühl EKZ', 'canton' => 'BE'),
+    '3322' => array('town' => 'Urtenen-Schönbühl', 'canton' => 'BE'),
+    '3323' => array('town' => 'Bäriswil BE', 'canton' => 'BE'),
+    '3324' => array('town' => 'Hindelbank', 'canton' => 'BE'),
+    '3325' => array('town' => 'Hettiswil', 'canton' => 'BE'),
+    '3326' => array('town' => 'Krauchthal', 'canton' => 'BE'),
+    '3305' => array('town' => 'Iffwil', 'canton' => 'BE'),
+    '3306' => array('town' => 'Etzelkofen', 'canton' => 'BE'),
+    '3307' => array('town' => 'Brunnenthal', 'canton' => 'SO'),
+    '3309' => array('town' => 'Kernenried', 'canton' => 'BE'),
+    '3317' => array('town' => 'Limpach', 'canton' => 'BE'),
+    '3360' => array('town' => 'Herzogenbuchsee', 'canton' => 'BE'),
+    '4556' => array('town' => 'Aeschi SO', 'canton' => 'SO'),
+    '3376' => array('town' => 'Graben', 'canton' => 'BE'),
+    '3372' => array('town' => 'Wanzwil', 'canton' => 'BE'),
+    '3373' => array('town' => 'Heimenhausen', 'canton' => 'BE'),
+    '3374' => array('town' => 'Wangenried', 'canton' => 'BE'),
+    '3362' => array('town' => 'Niederönz', 'canton' => 'BE'),
+    '3363' => array('town' => 'Oberönz', 'canton' => 'BE'),
+    '3365' => array('town' => 'Seeberg', 'canton' => 'BE'),
+    '3366' => array('town' => 'Bettenhausen', 'canton' => 'BE'),
+    '3367' => array('town' => 'Thörigen', 'canton' => 'BE'),
+    '3368' => array('town' => 'Bleienbach', 'canton' => 'BE'),
+    '3400' => array('town' => 'Burgdorf', 'canton' => 'BE'),
+    '3401' => array('town' => 'Burgdorf', 'canton' => 'BE'),
+    '3402' => array('town' => 'Burgdorf', 'canton' => 'BE'),
+    '3412' => array('town' => 'Heimiswil', 'canton' => 'BE'),
+    '3413' => array('town' => 'Kaltacker', 'canton' => 'BE'),
+    '3414' => array('town' => 'Oberburg', 'canton' => 'BE'),
+    '3415' => array('town' => 'Hasle-Rüegsau', 'canton' => 'BE'),
+    '3416' => array('town' => 'Affoltern BE', 'canton' => 'BE'),
+    '3417' => array('town' => 'Rüegsau', 'canton' => 'BE'),
+    '3418' => array('town' => 'Rüegsbach', 'canton' => 'BE'),
+    '3419' => array('town' => 'Biembach', 'canton' => 'BE'),
+    '3421' => array('town' => 'Lyssach', 'canton' => 'BE'),
+    '3422' => array('town' => 'Kirchberg BE', 'canton' => 'BE'),
+    '3423' => array('town' => 'Ersigen', 'canton' => 'BE'),
+    '3424' => array('town' => 'Niederösch', 'canton' => 'BE'),
+    '3425' => array('town' => 'Koppigen', 'canton' => 'BE'),
+    '3426' => array('town' => 'Aefligen', 'canton' => 'BE'),
+    '3427' => array('town' => 'Utzenstorf', 'canton' => 'BE'),
+    '3428' => array('town' => 'Wiler b.Utzenstorf', 'canton' => 'BE'),
+    '3432' => array('town' => 'Lützelflüh-Goldb', 'canton' => 'BE'),
+    '3433' => array('town' => 'Schwanden i. E.', 'canton' => 'BE'),
+    '3434' => array('town' => 'Obergoldbach', 'canton' => 'BE'),
+    '3435' => array('town' => 'Ramsei', 'canton' => 'BE'),
+    '3436' => array('town' => 'Zollbrück', 'canton' => 'BE'),
+    '3437' => array('town' => 'Rüderswil', 'canton' => 'BE'),
+    '3438' => array('town' => 'Lauperswil', 'canton' => 'BE'),
+    '3439' => array('town' => 'Ranflüh', 'canton' => 'BE'),
+    '3452' => array('town' => 'Grünenmatt', 'canton' => 'BE'),
+    '3453' => array('town' => 'Heimisbach', 'canton' => 'BE'),
+    '3454' => array('town' => 'Sumiswald', 'canton' => 'BE'),
+    '3455' => array('town' => 'Grünen', 'canton' => 'BE'),
+    '3456' => array('town' => 'Trachselwald', 'canton' => 'BE'),
+    '3457' => array('town' => 'Wasen im Emmental', 'canton' => 'BE'),
+    '3462' => array('town' => 'Weier im Emmental', 'canton' => 'BE'),
+    '3463' => array('town' => 'Häusernmoos', 'canton' => 'BE'),
+    '3464' => array('town' => 'Schmidigen-Mühlew', 'canton' => 'BE'),
+    '3465' => array('town' => 'Dürrenroth', 'canton' => 'BE'),
+    '3472' => array('town' => 'Wynigen', 'canton' => 'BE'),
+    '3473' => array('town' => 'Alchenstorf', 'canton' => 'BE'),
+    '3474' => array('town' => 'Rüedisbach', 'canton' => 'BE'),
+    '3475' => array('town' => 'Riedtwil', 'canton' => 'BE'),
+    '3476' => array('town' => 'Oschwand', 'canton' => 'BE'),
+    '3111' => array('town' => 'Tägertschi', 'canton' => 'BE'),
+    '3503' => array('town' => 'Gysenstein', 'canton' => 'BE'),
+    '3504' => array('town' => 'Niederhünigen', 'canton' => 'BE'),
+    '3506' => array('town' => 'Grosshöchstetten', 'canton' => 'BE'),
+    '3507' => array('town' => 'Biglen', 'canton' => 'BE'),
+    '3508' => array('town' => 'Arni BE', 'canton' => 'BE'),
+    '3510' => array('town' => 'Konolfingen', 'canton' => 'BE'),
+    '3512' => array('town' => 'Walkringen', 'canton' => 'BE'),
+    '3513' => array('town' => 'Bigenthal', 'canton' => 'BE'),
+    '3672' => array('town' => 'Oberdiessbach', 'canton' => 'BE'),
+    '3673' => array('town' => 'Linden', 'canton' => 'BE'),
+    '3674' => array('town' => 'Bleiken', 'canton' => 'BE'),
+    '3671' => array('town' => 'Brenzikofen', 'canton' => 'BE'),
+    '3531' => array('town' => 'Oberthal', 'canton' => 'BE'),
+    '3532' => array('town' => 'Zäziwil', 'canton' => 'BE'),
+    '3533' => array('town' => 'Bowil', 'canton' => 'BE'),
+    '3534' => array('town' => 'Signau', 'canton' => 'BE'),
+    '3535' => array('town' => 'Schüpbach', 'canton' => 'BE'),
+    '3536' => array('town' => 'Aeschau', 'canton' => 'BE'),
+    '3537' => array('town' => 'Eggiwil', 'canton' => 'BE'),
+    '3538' => array('town' => 'Röthenbach i. E.', 'canton' => 'BE'),
+    '3543' => array('town' => 'Emmenmatt', 'canton' => 'BE'),
+    '3550' => array('town' => 'Langnau i. E.', 'canton' => 'BE'),
+    '3551' => array('town' => 'Oberfrittenbach', 'canton' => 'BE'),
+    '3552' => array('town' => 'Bärau', 'canton' => 'BE'),
+    '3553' => array('town' => 'Gohl', 'canton' => 'BE'),
+    '3555' => array('town' => 'Trubschachen', 'canton' => 'BE'),
+    '3556' => array('town' => 'Trub', 'canton' => 'BE'),
+    '3557' => array('town' => 'Fankhaus (Trub)', 'canton' => 'BE'),
+    '3600' => array('town' => 'Thun', 'canton' => 'BE'),
+    '3601' => array('town' => 'Thun', 'canton' => 'BE'),
+    '3602' => array('town' => 'Thun 2', 'canton' => 'BE'),
+    '3603' => array('town' => 'Thun', 'canton' => 'BE'),
+    '3604' => array('town' => 'Thun', 'canton' => 'BE'),
+    '3605' => array('town' => 'Thun', 'canton' => 'BE'),
+    '3607' => array('town' => 'Thun', 'canton' => 'BE'),
+    '3608' => array('town' => 'Thun', 'canton' => 'BE'),
+    '3617' => array('town' => 'Fahrni b. Thun', 'canton' => 'BE'),
+    '3618' => array('town' => 'Süderen', 'canton' => 'BE'),
+    '3619' => array('town' => 'Eriz', 'canton' => 'BE'),
+    '3622' => array('town' => 'Homberg b. Thun', 'canton' => 'BE'),
+    '3635' => array('town' => 'Uebeschi', 'canton' => 'BE'),
+    '3631' => array('town' => 'Höfen b. Thun', 'canton' => 'BE'),
+    '3636' => array('town' => 'Längenbühl', 'canton' => 'BE'),
+    '3612' => array('town' => 'Steffisburg', 'canton' => 'BE'),
+    '3613' => array('town' => 'Steffisburg', 'canton' => 'BE'),
+    '3614' => array('town' => 'Unterlangenegg', 'canton' => 'BE'),
+    '3615' => array('town' => 'Heimenschwand', 'canton' => 'BE'),
+    '3616' => array('town' => 'Schwarzenegg', 'canton' => 'BE'),
+    '3623' => array('town' => 'Teuffenthal BE', 'canton' => 'BE'),
+    '3624' => array('town' => 'Goldiwil (Thun)', 'canton' => 'BE'),
+    '3625' => array('town' => 'Heiligenschwendi', 'canton' => 'BE'),
+    '3626' => array('town' => 'Hünibach', 'canton' => 'BE'),
+    '3627' => array('town' => 'Heimberg', 'canton' => 'BE'),
+    '3633' => array('town' => 'Amsoldingen', 'canton' => 'BE'),
+    '3634' => array('town' => 'Thierachern', 'canton' => 'BE'),
+    '3638' => array('town' => 'Blumenstein', 'canton' => 'BE'),
+    '3645' => array('town' => 'Gwatt (Thun)', 'canton' => 'BE'),
+    '3646' => array('town' => 'Einigen', 'canton' => 'BE'),
+    '3647' => array('town' => 'Reutigen', 'canton' => 'BE'),
+    '3652' => array('town' => 'Hilterfingen', 'canton' => 'BE'),
+    '3653' => array('town' => 'Oberhofen Thun\'see', 'canton' => 'BE'),
+    '3654' => array('town' => 'Gunten', 'canton' => 'BE'),
+    '3655' => array('town' => 'Sigriswil', 'canton' => 'BE'),
+    '3656' => array('town' => 'Tschingel', 'canton' => 'BE'),
+    '3657' => array('town' => 'Schwanden Sigrisw', 'canton' => 'BE'),
+    '3658' => array('town' => 'Merligen', 'canton' => 'BE'),
+    '3700' => array('town' => 'Spiez', 'canton' => 'BE'),
+    '3702' => array('town' => 'Hondrich', 'canton' => 'BE'),
+    '3703' => array('town' => 'Aeschi b. Spiez', 'canton' => 'BE'),
+    '3704' => array('town' => 'Krattigen', 'canton' => 'BE'),
+    '3705' => array('town' => 'Faulensee', 'canton' => 'BE'),
+    '3706' => array('town' => 'Leissigen', 'canton' => 'BE'),
+    '3707' => array('town' => 'Därligen', 'canton' => 'BE'),
+    '3711' => array('town' => 'Emdthal', 'canton' => 'BE'),
+    '3713' => array('town' => 'Reichenbach i. K.', 'canton' => 'BE'),
+    '3714' => array('town' => 'Frutigen', 'canton' => 'BE'),
+    '3715' => array('town' => 'Adelboden', 'canton' => 'BE'),
+    '3716' => array('town' => 'Kandergrund', 'canton' => 'BE'),
+    '3717' => array('town' => 'Blausee-Mitholz', 'canton' => 'BE'),
+    '3718' => array('town' => 'Kandersteg', 'canton' => 'BE'),
+    '3722' => array('town' => 'Scharnachtal', 'canton' => 'BE'),
+    '3723' => array('town' => 'Kiental', 'canton' => 'BE'),
+    '3724' => array('town' => 'Ried (Frutigen)', 'canton' => 'BE'),
+    '3725' => array('town' => 'Achseten', 'canton' => 'BE'),
+    '3752' => array('town' => 'Wimmis', 'canton' => 'BE'),
+    '3753' => array('town' => 'Oey', 'canton' => 'BE'),
+    '3754' => array('town' => 'Diemtigen', 'canton' => 'BE'),
+    '3755' => array('town' => 'Horboden', 'canton' => 'BE'),
+    '3756' => array('town' => 'Zwischenflüh', 'canton' => 'BE'),
+    '3757' => array('town' => 'Schwenden', 'canton' => 'BE'),
+    '3758' => array('town' => 'Latterbach', 'canton' => 'BE'),
+    '3762' => array('town' => 'Erlenbach i. S.', 'canton' => 'BE'),
+    '3763' => array('town' => 'Därstetten', 'canton' => 'BE'),
+    '3764' => array('town' => 'Weissenburg', 'canton' => 'BE'),
+    '3765' => array('town' => 'Oberwil i. S.', 'canton' => 'BE'),
+    '3766' => array('town' => 'Boltigen', 'canton' => 'BE'),
+    '3770' => array('town' => 'Zweisimmen', 'canton' => 'BE'),
+    '3771' => array('town' => 'Blankenburg', 'canton' => 'BE'),
+    '3772' => array('town' => 'St. Stephan', 'canton' => 'BE'),
+    '3773' => array('town' => 'Matten(St.Stephan)', 'canton' => 'BE'),
+    '3775' => array('town' => 'Lenk im Simmental', 'canton' => 'BE'),
+    '3776' => array('town' => 'Oeschseite', 'canton' => 'BE'),
+    '3777' => array('town' => 'Saanenmöser', 'canton' => 'BE'),
+    '3778' => array('town' => 'Schönried', 'canton' => 'BE'),
+    '3780' => array('town' => 'Gstaad', 'canton' => 'BE'),
+    '3781' => array('town' => 'Turbach', 'canton' => 'BE'),
+    '3782' => array('town' => 'Lauenen b. Gstaad', 'canton' => 'BE'),
+    '3783' => array('town' => 'Grund b. Gstaad', 'canton' => 'BE'),
+    '3784' => array('town' => 'Feutersoey', 'canton' => 'BE'),
+    '3785' => array('town' => 'Gsteig b. Gstaad', 'canton' => 'BE'),
+    '3792' => array('town' => 'Saanen', 'canton' => 'BE'),
+    '3800' => array('town' => 'Interlaken', 'canton' => 'BE'),
+    '3801' => array('town' => 'Jungfraujoch', 'canton' => 'VS'),
+    '3803' => array('town' => 'Beatenberg', 'canton' => 'BE'),
+    '3804' => array('town' => 'Habkern', 'canton' => 'BE'),
+    '3805' => array('town' => 'Goldswil', 'canton' => 'BE'),
+    '3806' => array('town' => 'Bönigen', 'canton' => 'BE'),
+    '3807' => array('town' => 'Iseltwald', 'canton' => 'BE'),
+    '3812' => array('town' => 'Wilderswil', 'canton' => 'BE'),
+    '3813' => array('town' => 'Saxeten', 'canton' => 'BE'),
+    '3814' => array('town' => 'Gsteigwiler', 'canton' => 'BE'),
+    '3815' => array('town' => 'Zweilütschinen', 'canton' => 'BE'),
+    '3816' => array('town' => 'Lütschental', 'canton' => 'BE'),
+    '3818' => array('town' => 'Grindelwald', 'canton' => 'BE'),
+    '3822' => array('town' => 'Lauterbrunnen', 'canton' => 'BE'),
+    '3823' => array('town' => 'Wengen', 'canton' => 'BE'),
+    '3824' => array('town' => 'Stechelberg', 'canton' => 'BE'),
+    '3825' => array('town' => 'Mürren', 'canton' => 'BE'),
+    '3826' => array('town' => 'Gimmelwald', 'canton' => 'BE'),
+    '3852' => array('town' => 'Ringgenberg BE', 'canton' => 'BE'),
+    '3853' => array('town' => 'Niederried Interl', 'canton' => 'BE'),
+    '3854' => array('town' => 'Oberried Brienz', 'canton' => 'BE'),
+    '3855' => array('town' => 'Brienz BE', 'canton' => 'BE'),
+    '3856' => array('town' => 'Brienzwiler', 'canton' => 'BE'),
+    '3857' => array('town' => 'Unterbach BE', 'canton' => 'BE'),
+    '3858' => array('town' => 'Hofstetten BE', 'canton' => 'BE'),
+    '3860' => array('town' => 'Meiringen', 'canton' => 'BE'),
+    '3862' => array('town' => 'Innertkirchen', 'canton' => 'BE'),
+    '3863' => array('town' => 'Gadmen', 'canton' => 'BE'),
+    '3864' => array('town' => 'Guttannen', 'canton' => 'BE'),
+    '3900' => array('town' => 'Brig', 'canton' => 'VS'),
+    '3949' => array('town' => 'Hohtenn', 'canton' => 'VS'),
+    '3903' => array('town' => 'Birgisch', 'canton' => 'VS'),
+    '3914' => array('town' => 'Blatten b. Naters', 'canton' => 'VS'),
+    '3913' => array('town' => 'Rosswald', 'canton' => 'VS'),
+    '3911' => array('town' => 'Ried-Brig', 'canton' => 'VS'),
+    '3912' => array('town' => 'Termen', 'canton' => 'VS'),
+    '3901' => array('town' => 'Rothwald', 'canton' => 'VS'),
+    '3907' => array('town' => 'Simplon Hospiz', 'canton' => 'VS'),
+    '3922' => array('town' => 'Eisten', 'canton' => 'VS'),
+    '3908' => array('town' => 'Saas-Balen', 'canton' => 'VS'),
+    '3910' => array('town' => 'Saas-Grund', 'canton' => 'VS'),
+    '3902' => array('town' => 'Glis', 'canton' => 'VS'),
+    '3917' => array('town' => 'Goppenstein', 'canton' => 'VS'),
+    '3916' => array('town' => 'Ferden', 'canton' => 'VS'),
+    '3918' => array('town' => 'Wiler (Lötschen)', 'canton' => 'VS'),
+    '3919' => array('town' => 'Blatten(Lötschen)', 'canton' => 'VS'),
+    '3904' => array('town' => 'Naters', 'canton' => 'VS'),
+    '3905' => array('town' => 'Saas-Almagell', 'canton' => 'VS'),
+    '3906' => array('town' => 'Saas-Fee', 'canton' => 'VS'),
+    '3920' => array('town' => 'Zermatt', 'canton' => 'VS'),
+    '3923' => array('town' => 'Törbel', 'canton' => 'VS'),
+    '3926' => array('town' => 'Embd', 'canton' => 'VS'),
+    '3927' => array('town' => 'Herbriggen', 'canton' => 'VS'),
+    '3928' => array('town' => 'Randa', 'canton' => 'VS'),
+    '3929' => array('town' => 'Täsch', 'canton' => 'VS'),
+    '3924' => array('town' => 'St. Niklaus VS', 'canton' => 'VS'),
+    '3925' => array('town' => 'Grächen', 'canton' => 'VS'),
+    '3930' => array('town' => 'Visp', 'canton' => 'VS'),
+    '3942' => array('town' => 'St. German', 'canton' => 'VS'),
+    '3933' => array('town' => 'Staldenried', 'canton' => 'VS'),
+    '3937' => array('town' => 'Baltschieder', 'canton' => 'VS'),
+    '3938' => array('town' => 'Ausserberg', 'canton' => 'VS'),
+    '3939' => array('town' => 'Eggerberg', 'canton' => 'VS'),
+    '3931' => array('town' => 'Lalden', 'canton' => 'VS'),
+    '3932' => array('town' => 'Visperterminen', 'canton' => 'VS'),
+    '3934' => array('town' => 'Zeneggen', 'canton' => 'VS'),
+    '3935' => array('town' => 'Bürchen', 'canton' => 'VS'),
+    '3943' => array('town' => 'Eischoll', 'canton' => 'VS'),
+    '3944' => array('town' => 'Unterbäch VS', 'canton' => 'VS'),
+    '3947' => array('town' => 'Ergisch', 'canton' => 'VS'),
+    '3948' => array('town' => 'Unterems', 'canton' => 'VS'),
+    '3946' => array('town' => 'Gruben', 'canton' => 'VS'),
+    '3951' => array('town' => 'Agarn', 'canton' => 'VS'),
+    '3955' => array('town' => 'Albinen', 'canton' => 'VS'),
+    '3956' => array('town' => 'Guttet-Feschel', 'canton' => 'VS'),
+    '3957' => array('town' => 'Erschmatt', 'canton' => 'VS'),
+    '3953' => array('town' => 'Varen', 'canton' => 'VS'),
+    '3976' => array('town' => 'Noës', 'canton' => 'VS'),
+    '3978' => array('town' => 'Flanthey', 'canton' => 'VS'),
+    '1978' => array('town' => 'Lens', 'canton' => 'VS'),
+    '1977' => array('town' => 'Icogne', 'canton' => 'VS'),
+    '3979' => array('town' => 'Grône', 'canton' => 'VS'),
+    '3945' => array('town' => 'Gampel', 'canton' => 'VS'),
+    '3952' => array('town' => 'Susten', 'canton' => 'VS'),
+    '3954' => array('town' => 'Leukerbad', 'canton' => 'VS'),
+    '3970' => array('town' => 'Salgesch', 'canton' => 'VS'),
+    '3977' => array('town' => 'Granges VS', 'canton' => 'VS'),
+    '1958' => array('town' => 'St-Léonard', 'canton' => 'VS'),
+    '3960' => array('town' => 'Sierre', 'canton' => 'VS'),
+    '3971' => array('town' => 'Chermignon', 'canton' => 'VS'),
+    '3972' => array('town' => 'Miège', 'canton' => 'VS'),
+    '3973' => array('town' => 'Venthône', 'canton' => 'VS'),
+    '3974' => array('town' => 'Mollens VS', 'canton' => 'VS'),
+    '3975' => array('town' => 'Randogne', 'canton' => 'VS'),
+    '3961' => array('town' => 'Vissoie', 'canton' => 'VS'),
+    '3967' => array('town' => 'Vercorin', 'canton' => 'VS'),
+    '3963' => array('town' => 'Montana', 'canton' => 'VS'),
+    '3965' => array('town' => 'Chippis', 'canton' => 'VS'),
+    '3966' => array('town' => 'Chalais', 'canton' => 'VS'),
+    '3968' => array('town' => 'Veyras', 'canton' => 'VS'),
+    '3982' => array('town' => 'Bitsch', 'canton' => 'VS'),
+    '3993' => array('town' => 'Grengiols', 'canton' => 'VS'),
+    '3994' => array('town' => 'Lax', 'canton' => 'VS'),
+    '3997' => array('town' => 'Bellwald', 'canton' => 'VS'),
+    '3989' => array('town' => 'Niederwald', 'canton' => 'VS'),
+    '3998' => array('town' => 'Gluringen', 'canton' => 'VS'),
+    '3985' => array('town' => 'Geschinen', 'canton' => 'VS'),
+    '3988' => array('town' => 'Obergesteln', 'canton' => 'VS'),
+    '3999' => array('town' => 'Oberwald', 'canton' => 'VS'),
+    '3986' => array('town' => 'Ried-Mörel', 'canton' => 'VS'),
+    '3987' => array('town' => 'Riederalp', 'canton' => 'VS'),
+    '3991' => array('town' => 'Betten', 'canton' => 'VS'),
+    '3992' => array('town' => 'Bettmeralp', 'canton' => 'VS'),
+    '3995' => array('town' => 'Ernen', 'canton' => 'VS'),
+    '3996' => array('town' => 'Binn', 'canton' => 'VS'),
+    '3983' => array('town' => 'Mörel', 'canton' => 'VS'),
+    '3984' => array('town' => 'Fiesch', 'canton' => 'VS'),
+    '4000' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4001' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4002' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4003' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4004' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4005' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4007' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4008' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4009' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4010' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4011' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4012' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4013' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4015' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4016' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4017' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4018' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4019' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4020' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4023' => array('town' => 'Basel', 'canton' => 'BL'),
+    '4024' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4025' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4030' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4031' => array('town' => 'Basel UniSpital', 'canton' => 'BS'),
+    '4032' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4051' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4052' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4053' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4054' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4055' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4056' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4057' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4058' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4059' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4091' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4101' => array('town' => 'Bruderholz', 'canton' => 'BL'),
+    '4102' => array('town' => 'Binningen', 'canton' => 'BL'),
+    '4103' => array('town' => 'Bottmingen', 'canton' => 'BL'),
+    '4104' => array('town' => 'Oberwil BL', 'canton' => 'BL'),
+    '4105' => array('town' => 'Biel-Benken BL', 'canton' => 'BL'),
+    '4106' => array('town' => 'Therwil', 'canton' => 'BL'),
+    '4107' => array('town' => 'Ettingen', 'canton' => 'BL'),
+    '4108' => array('town' => 'Witterswil', 'canton' => 'SO'),
+    '4112' => array('town' => 'Bättwil-Flüh', 'canton' => 'SO'),
+    '4114' => array('town' => 'Hofstetten SO', 'canton' => 'SO'),
+    '4115' => array('town' => 'Mariastein', 'canton' => 'SO'),
+    '4116' => array('town' => 'Metzerlen', 'canton' => 'SO'),
+    '4117' => array('town' => 'Burg im Leimental', 'canton' => 'BL'),
+    '4118' => array('town' => 'Rodersdorf', 'canton' => 'SO'),
+    '4123' => array('town' => 'Allschwil', 'canton' => 'BL'),
+    '4124' => array('town' => 'Schönenbuch', 'canton' => 'BL'),
+    '4125' => array('town' => 'Riehen', 'canton' => 'BS'),
+    '4126' => array('town' => 'Bettingen', 'canton' => 'BS'),
+    '4127' => array('town' => 'Birsfelden', 'canton' => 'BL'),
+    '4132' => array('town' => 'Muttenz', 'canton' => 'BL'),
+    '4133' => array('town' => 'Pratteln', 'canton' => 'BL'),
+    '4142' => array('town' => 'Münchenstein', 'canton' => 'BL'),
+    '4143' => array('town' => 'Dornach', 'canton' => 'SO'),
+    '4144' => array('town' => 'Arlesheim', 'canton' => 'BL'),
+    '4145' => array('town' => 'Gempen', 'canton' => 'SO'),
+    '4146' => array('town' => 'Hochwald', 'canton' => 'SO'),
+    '4147' => array('town' => 'Aesch BL', 'canton' => 'BL'),
+    '4148' => array('town' => 'Pfeffingen', 'canton' => 'BL'),
+    '4153' => array('town' => 'Reinach BL', 'canton' => 'BL'),
+    '4202' => array('town' => 'Duggingen', 'canton' => 'BL'),
+    '4203' => array('town' => 'Grellingen', 'canton' => 'BL'),
+    '4206' => array('town' => 'Seewen SO', 'canton' => 'SO'),
+    '4207' => array('town' => 'Bretzwil', 'canton' => 'BL'),
+    '4208' => array('town' => 'Nunningen', 'canton' => 'SO'),
+    '4222' => array('town' => 'Zwingen', 'canton' => 'BL'),
+    '4225' => array('town' => 'Brislach', 'canton' => 'BL'),
+    '4226' => array('town' => 'Breitenbach', 'canton' => 'SO'),
+    '4227' => array('town' => 'Büsserach', 'canton' => 'SO'),
+    '4228' => array('town' => 'Erschwil', 'canton' => 'SO'),
+    '4242' => array('town' => 'Laufen', 'canton' => 'BL'),
+    '4243' => array('town' => 'Dittingen', 'canton' => 'BL'),
+    '4244' => array('town' => 'Röschenz', 'canton' => 'BL'),
+    '4245' => array('town' => 'Kleinlützel', 'canton' => 'SO'),
+    '4204' => array('town' => 'Himmelried', 'canton' => 'SO'),
+    '4223' => array('town' => 'Blauen', 'canton' => 'BL'),
+    '4224' => array('town' => 'Nenzlingen', 'canton' => 'BL'),
+    '4229' => array('town' => 'Beinwil SO', 'canton' => 'SO'),
+    '4232' => array('town' => 'Fehren', 'canton' => 'SO'),
+    '4233' => array('town' => 'Meltingen', 'canton' => 'SO'),
+    '4234' => array('town' => 'Zullwil', 'canton' => 'SO'),
+    '4246' => array('town' => 'Wahlen b. Laufen', 'canton' => 'BL'),
+    '4247' => array('town' => 'Grindel', 'canton' => 'SO'),
+    '4252' => array('town' => 'Bärschwil', 'canton' => 'SO'),
+    '4253' => array('town' => 'Liesberg', 'canton' => 'BL'),
+    '4254' => array('town' => 'Liesberg Dorf', 'canton' => 'BL'),
+    '4302' => array('town' => 'Augst BL', 'canton' => 'BL'),
+    '4303' => array('town' => 'Kaiseraugst', 'canton' => 'AG'),
+    '4304' => array('town' => 'Giebenach', 'canton' => 'BL'),
+    '4305' => array('town' => 'Olsberg', 'canton' => 'AG'),
+    '4310' => array('town' => 'Rheinfelden', 'canton' => 'AG'),
+    '4312' => array('town' => 'Magden', 'canton' => 'AG'),
+    '4313' => array('town' => 'Möhlin', 'canton' => 'AG'),
+    '4314' => array('town' => 'Zeiningen', 'canton' => 'AG'),
+    '4315' => array('town' => 'Zuzgen', 'canton' => 'AG'),
+    '4316' => array('town' => 'Hellikon', 'canton' => 'AG'),
+    '4317' => array('town' => 'Wegenstetten', 'canton' => 'AG'),
+    '4322' => array('town' => 'Mumpf', 'canton' => 'AG'),
+    '4323' => array('town' => 'Wallbach', 'canton' => 'AG'),
+    '4324' => array('town' => 'Obermumpf', 'canton' => 'AG'),
+    '4325' => array('town' => 'Schupfart', 'canton' => 'AG'),
+    '4332' => array('town' => 'Stein AG', 'canton' => 'AG'),
+    '4333' => array('town' => 'Münchwilen AG', 'canton' => 'AG'),
+    '4334' => array('town' => 'Sisseln AG', 'canton' => 'AG'),
+    '5080' => array('town' => 'Laufenburg', 'canton' => 'AG'),
+    '5082' => array('town' => 'Kaisten', 'canton' => 'AG'),
+    '5083' => array('town' => 'Ittenthal', 'canton' => 'AG'),
+    '5084' => array('town' => 'Rheinsulz', 'canton' => 'AG'),
+    '5085' => array('town' => 'Sulz AG', 'canton' => 'AG'),
+    '5275' => array('town' => 'Etzgen', 'canton' => 'AG'),
+    '5274' => array('town' => 'Mettau', 'canton' => 'AG'),
+    '5273' => array('town' => 'Oberhofen AG', 'canton' => 'AG'),
+    '5272' => array('town' => 'Gansingen', 'canton' => 'AG'),
+    '5276' => array('town' => 'Wil AG', 'canton' => 'AG'),
+    '5277' => array('town' => 'Hottwil', 'canton' => 'AG'),
+    '5326' => array('town' => 'Schwaderloch', 'canton' => 'AG'),
+    '5325' => array('town' => 'Leibstadt', 'canton' => 'AG'),
+    '5324' => array('town' => 'Full-Reuenthal', 'canton' => 'AG'),
+    '4402' => array('town' => 'Frenkendorf', 'canton' => 'BL'),
+    '4410' => array('town' => 'Liestal', 'canton' => 'BL'),
+    '4411' => array('town' => 'Seltisberg', 'canton' => 'BL'),
+    '4412' => array('town' => 'Nuglar', 'canton' => 'SO'),
+    '4413' => array('town' => 'Büren SO', 'canton' => 'SO'),
+    '4414' => array('town' => 'Füllinsdorf', 'canton' => 'BL'),
+    '4415' => array('town' => 'Lausen', 'canton' => 'BL'),
+    '4416' => array('town' => 'Bubendorf', 'canton' => 'BL'),
+    '4417' => array('town' => 'Ziefen', 'canton' => 'BL'),
+    '4418' => array('town' => 'Reigoldswil', 'canton' => 'BL'),
+    '4419' => array('town' => 'Lupsingen', 'canton' => 'BL'),
+    '4421' => array('town' => 'St. Pantaleon', 'canton' => 'SO'),
+    '4422' => array('town' => 'Arisdorf', 'canton' => 'BL'),
+    '4423' => array('town' => 'Hersberg', 'canton' => 'BL'),
+    '4424' => array('town' => 'Arboldswil', 'canton' => 'BL'),
+    '4425' => array('town' => 'Titterten', 'canton' => 'BL'),
+    '4426' => array('town' => 'Lauwil', 'canton' => 'BL'),
+    '4431' => array('town' => 'Bennwil', 'canton' => 'BL'),
+    '4432' => array('town' => 'Lampenberg', 'canton' => 'BL'),
+    '4433' => array('town' => 'Ramlinsburg', 'canton' => 'BL'),
+    '4434' => array('town' => 'Hölstein', 'canton' => 'BL'),
+    '4435' => array('town' => 'Niederdorf', 'canton' => 'BL'),
+    '4436' => array('town' => 'Oberdorf BL', 'canton' => 'BL'),
+    '4437' => array('town' => 'Waldenburg', 'canton' => 'BL'),
+    '4438' => array('town' => 'Langenbruck', 'canton' => 'BL'),
+    '4441' => array('town' => 'Thürnen', 'canton' => 'BL'),
+    '4442' => array('town' => 'Diepflingen', 'canton' => 'BL'),
+    '4443' => array('town' => 'Wittinsburg', 'canton' => 'BL'),
+    '4444' => array('town' => 'Rümlingen', 'canton' => 'BL'),
+    '4445' => array('town' => 'Häfelfingen', 'canton' => 'BL'),
+    '4446' => array('town' => 'Buckten', 'canton' => 'BL'),
+    '4447' => array('town' => 'Känerkinden', 'canton' => 'BL'),
+    '4448' => array('town' => 'Läufelfingen', 'canton' => 'BL'),
+    '4450' => array('town' => 'Sissach', 'canton' => 'BL'),
+    '4451' => array('town' => 'Wintersingen', 'canton' => 'BL'),
+    '4452' => array('town' => 'Itingen', 'canton' => 'BL'),
+    '4453' => array('town' => 'Nusshof', 'canton' => 'BL'),
+    '4455' => array('town' => 'Zunzgen', 'canton' => 'BL'),
+    '4456' => array('town' => 'Tenniken', 'canton' => 'BL'),
+    '4457' => array('town' => 'Diegten', 'canton' => 'BL'),
+    '4458' => array('town' => 'Eptingen', 'canton' => 'BL'),
+    '4460' => array('town' => 'Gelterkinden', 'canton' => 'BL'),
+    '4461' => array('town' => 'Böckten', 'canton' => 'BL'),
+    '4465' => array('town' => 'Hemmiken', 'canton' => 'BL'),
+    '4469' => array('town' => 'Anwil', 'canton' => 'BL'),
+    '4462' => array('town' => 'Rickenbach BL', 'canton' => 'BL'),
+    '4463' => array('town' => 'Buus', 'canton' => 'BL'),
+    '4464' => array('town' => 'Maisprach', 'canton' => 'BL'),
+    '4466' => array('town' => 'Ormalingen', 'canton' => 'BL'),
+    '4467' => array('town' => 'Rothenfluh', 'canton' => 'BL'),
+    '4468' => array('town' => 'Kienberg', 'canton' => 'SO'),
+    '4492' => array('town' => 'Tecknau', 'canton' => 'BL'),
+    '4493' => array('town' => 'Wenslingen', 'canton' => 'BL'),
+    '4494' => array('town' => 'Oltingen', 'canton' => 'BL'),
+    '4495' => array('town' => 'Zeglingen', 'canton' => 'BL'),
+    '4496' => array('town' => 'Kilchberg BL', 'canton' => 'BL'),
+    '4497' => array('town' => 'Rünenberg', 'canton' => 'BL'),
+    '4500' => array('town' => 'Solothurn', 'canton' => 'SO'),
+    '4501' => array('town' => 'Solothurn', 'canton' => 'SO'),
+    '4502' => array('town' => 'Solothurn', 'canton' => 'SO'),
+    '4503' => array('town' => 'Solothurn', 'canton' => 'SO'),
+    '4515' => array('town' => 'Weissenstein', 'canton' => 'SO'),
+    '4525' => array('town' => 'Balm b. Günsberg', 'canton' => 'SO'),
+    '4523' => array('town' => 'Niederwil SO', 'canton' => 'SO'),
+    '4535' => array('town' => 'Hubersdorf', 'canton' => 'SO'),
+    '4539' => array('town' => 'Rumisberg', 'canton' => 'BE'),
+    '4557' => array('town' => 'Horriwil', 'canton' => 'SO'),
+    '4558' => array('town' => 'Hersiwil', 'canton' => 'SO'),
+    '4512' => array('town' => 'Bellach', 'canton' => 'SO'),
+    '4513' => array('town' => 'Langendorf', 'canton' => 'SO'),
+    '4514' => array('town' => 'Lommiswil', 'canton' => 'SO'),
+    '4522' => array('town' => 'Rüttenen', 'canton' => 'SO'),
+    '4524' => array('town' => 'Günsberg', 'canton' => 'SO'),
+    '4528' => array('town' => 'Zuchwil', 'canton' => 'SO'),
+    '4532' => array('town' => 'Feldbrunnen', 'canton' => 'SO'),
+    '4533' => array('town' => 'Riedholz', 'canton' => 'SO'),
+    '4534' => array('town' => 'Flumenthal', 'canton' => 'SO'),
+    '4536' => array('town' => 'Attiswil', 'canton' => 'BE'),
+    '4537' => array('town' => 'Wiedlisbach', 'canton' => 'BE'),
+    '4538' => array('town' => 'Oberbipp', 'canton' => 'BE'),
+    '4552' => array('town' => 'Derendingen', 'canton' => 'SO'),
+    '4553' => array('town' => 'Subingen', 'canton' => 'SO'),
+    '4554' => array('town' => 'Etziken', 'canton' => 'SO'),
+    '3375' => array('town' => 'Inkwil', 'canton' => 'BE'),
+    '4562' => array('town' => 'Biberist', 'canton' => 'SO'),
+    '4563' => array('town' => 'Gerlafingen', 'canton' => 'SO'),
+    '4564' => array('town' => 'Obergerlafingen', 'canton' => 'SO'),
+    '4565' => array('town' => 'Recherswil', 'canton' => 'SO'),
+    '4566' => array('town' => 'Kriegstetten', 'canton' => 'SO'),
+    '4581' => array('town' => 'Küttigkofen', 'canton' => 'SO'),
+    '4586' => array('town' => 'Kyburg-Buchegg', 'canton' => 'SO'),
+    '4582' => array('town' => 'Brügglen', 'canton' => 'SO'),
+    '4583' => array('town' => 'Mühledorf SO', 'canton' => 'SO'),
+    '4579' => array('town' => 'Gossliwil', 'canton' => 'SO'),
+    '4578' => array('town' => 'Bibern SO', 'canton' => 'SO'),
+    '4571' => array('town' => 'Lüterkofen-Ichert', 'canton' => 'SO'),
+    '4576' => array('town' => 'Tscheppach', 'canton' => 'SO'),
+    '4577' => array('town' => 'Hessigkofen', 'canton' => 'SO'),
+    '4585' => array('town' => 'Biezwil', 'canton' => 'SO'),
+    '4587' => array('town' => 'Aetingen', 'canton' => 'SO'),
+    '4588' => array('town' => 'Unterramsern', 'canton' => 'SO'),
+    '4574' => array('town' => 'Nennigkofen', 'canton' => 'SO'),
+    '4600' => array('town' => 'Olten', 'canton' => 'SO'),
+    '4601' => array('town' => 'Olten', 'canton' => 'SO'),
+    '4603' => array('town' => 'Olten', 'canton' => 'SO'),
+    '4612' => array('town' => 'Wangen b. Olten', 'canton' => 'SO'),
+    '4613' => array('town' => 'Rickenbach SO', 'canton' => 'SO'),
+    '4614' => array('town' => 'Hägendorf', 'canton' => 'SO'),
+    '4616' => array('town' => 'Kappel SO', 'canton' => 'SO'),
+    '4617' => array('town' => 'Gunzgen', 'canton' => 'SO'),
+    '4618' => array('town' => 'Boningen', 'canton' => 'SO'),
+    '4622' => array('town' => 'Egerkingen', 'canton' => 'SO'),
+    '4623' => array('town' => 'Neuendorf', 'canton' => 'SO'),
+    '4624' => array('town' => 'Härkingen', 'canton' => 'SO'),
+    '4625' => array('town' => 'Oberbuchsiten', 'canton' => 'SO'),
+    '4626' => array('town' => 'Niederbuchsiten', 'canton' => 'SO'),
+    '4632' => array('town' => 'Trimbach', 'canton' => 'SO'),
+    '4652' => array('town' => 'Winznau', 'canton' => 'SO'),
+    '4653' => array('town' => 'Obergösgen', 'canton' => 'SO'),
+    '4654' => array('town' => 'Lostorf', 'canton' => 'SO'),
+    '4655' => array('town' => 'Stüsslingen', 'canton' => 'SO'),
+    '4656' => array('town' => 'Starrkirch-Wil', 'canton' => 'SO'),
+    '4657' => array('town' => 'Dulliken', 'canton' => 'SO'),
+    '4658' => array('town' => 'Däniken SO', 'canton' => 'SO'),
+    '5010' => array('town' => 'Däniken PZ', 'canton' => 'SO'),
+    '4663' => array('town' => 'Aarburg', 'canton' => 'AG'),
+    '4665' => array('town' => 'Oftringen', 'canton' => 'AG'),
+    '4615' => array('town' => 'Allerheiligenberg', 'canton' => 'SO'),
+    '4633' => array('town' => 'Hauenstein', 'canton' => 'SO'),
+    '4634' => array('town' => 'Wisen SO', 'canton' => 'SO'),
+    '4702' => array('town' => 'Oensingen', 'canton' => 'SO'),
+    '4703' => array('town' => 'Kestenholz', 'canton' => 'SO'),
+    '4704' => array('town' => 'Niederbipp', 'canton' => 'BE'),
+    '3380' => array('town' => 'Wangen an der Aare', 'canton' => 'BE'),
+    '3377' => array('town' => 'Walliswil b.Wangen', 'canton' => 'BE'),
+    '4543' => array('town' => 'Deitingen', 'canton' => 'SO'),
+    '4542' => array('town' => 'Luterbach', 'canton' => 'SO'),
+    '4710' => array('town' => 'Balsthal', 'canton' => 'SO'),
+    '4714' => array('town' => 'Aedermannsdorf', 'canton' => 'SO'),
+    '4715' => array('town' => 'Herbetswil', 'canton' => 'SO'),
+    '4719' => array('town' => 'Ramiswil', 'canton' => 'SO'),
+    '4712' => array('town' => 'Laupersdorf', 'canton' => 'SO'),
+    '4713' => array('town' => 'Matzendorf', 'canton' => 'SO'),
+    '4716' => array('town' => 'Welschenrohr', 'canton' => 'SO'),
+    '4717' => array('town' => 'Mümliswil', 'canton' => 'SO'),
+    '4718' => array('town' => 'Holderbank SO', 'canton' => 'SO'),
+    '4800' => array('town' => 'Zofingen', 'canton' => 'AG'),
+    '4801' => array('town' => 'Zofingen', 'canton' => 'AG'),
+    '4802' => array('town' => 'Strengelbach', 'canton' => 'AG'),
+    '4803' => array('town' => 'Vordemwald', 'canton' => 'AG'),
+    '4805' => array('town' => 'Brittnau', 'canton' => 'AG'),
+    '4806' => array('town' => 'Wikon', 'canton' => 'LU'),
+    '4812' => array('town' => 'Mühlethal', 'canton' => 'AG'),
+    '4813' => array('town' => 'Uerkheim', 'canton' => 'AG'),
+    '4814' => array('town' => 'Bottenwil', 'canton' => 'AG'),
+    '4852' => array('town' => 'Rothrist', 'canton' => 'AG'),
+    '4853' => array('town' => 'Murgenthal', 'canton' => 'AG'),
+    '4629' => array('town' => 'Fulenbach', 'canton' => 'SO'),
+    '4628' => array('town' => 'Wolfwil', 'canton' => 'SO'),
+    '4856' => array('town' => 'Glashütten', 'canton' => 'AG'),
+    '4900' => array('town' => 'Langenthal', 'canton' => 'BE'),
+    '4901' => array('town' => 'Langenthal', 'canton' => 'BE'),
+    '4902' => array('town' => 'Langenthal', 'canton' => 'BE'),
+    '4911' => array('town' => 'Schwarzhäusern', 'canton' => 'BE'),
+    '4912' => array('town' => 'Aarwangen', 'canton' => 'BE'),
+    '4913' => array('town' => 'Bannwil', 'canton' => 'BE'),
+    '4914' => array('town' => 'Roggwil BE', 'canton' => 'BE'),
+    '4915' => array('town' => 'St. Urban', 'canton' => 'LU'),
+    '4916' => array('town' => 'Untersteckholz', 'canton' => 'BE'),
+    '4917' => array('town' => 'Melchnau', 'canton' => 'BE'),
+    '4955' => array('town' => 'Gondiswil', 'canton' => 'BE'),
+    '4919' => array('town' => 'Reisiswil', 'canton' => 'BE'),
+    '4922' => array('town' => 'Bützberg', 'canton' => 'BE'),
+    '4923' => array('town' => 'Wynau', 'canton' => 'BE'),
+    '4924' => array('town' => 'Obersteckholz', 'canton' => 'BE'),
+    '4932' => array('town' => 'Lotzwil', 'canton' => 'BE'),
+    '4933' => array('town' => 'Rütschelen', 'canton' => 'BE'),
+    '4934' => array('town' => 'Madiswil', 'canton' => 'BE'),
+    '4935' => array('town' => 'Leimiswil', 'canton' => 'BE'),
+    '4936' => array('town' => 'Kleindietwil', 'canton' => 'BE'),
+    '4937' => array('town' => 'Ursenbach', 'canton' => 'BE'),
+    '4938' => array('town' => 'Rohrbach', 'canton' => 'BE'),
+    '4942' => array('town' => 'Walterswil BE', 'canton' => 'BE'),
+    '4943' => array('town' => 'Oeschenbach', 'canton' => 'BE'),
+    '4944' => array('town' => 'Auswil', 'canton' => 'BE'),
+    '4950' => array('town' => 'Huttwil', 'canton' => 'BE'),
+    '4952' => array('town' => 'Eriswil', 'canton' => 'BE'),
+    '4953' => array('town' => 'Schwarzenbach BE', 'canton' => 'BE'),
+    '4954' => array('town' => 'Wyssachen', 'canton' => 'BE'),
+    '5000' => array('town' => 'Aarau', 'canton' => 'AG'),
+    '5001' => array('town' => 'Aarau', 'canton' => 'AG'),
+    '5004' => array('town' => 'Aarau', 'canton' => 'AG'),
+    '5012' => array('town' => 'Schönenwerd', 'canton' => 'SO'),
+    '5013' => array('town' => 'Niedergösgen', 'canton' => 'SO'),
+    '5014' => array('town' => 'Gretzenbach', 'canton' => 'SO'),
+    '5015' => array('town' => 'Erlinsbach SO', 'canton' => 'SO'),
+    '5017' => array('town' => 'Barmelweid', 'canton' => 'AG'),
+    '5022' => array('town' => 'Rombach', 'canton' => 'AG'),
+    '5023' => array('town' => 'Biberstein', 'canton' => 'AG'),
+    '5024' => array('town' => 'Küttigen', 'canton' => 'AG'),
+    '5025' => array('town' => 'Asp', 'canton' => 'AG'),
+    '5026' => array('town' => 'Densbüren', 'canton' => 'AG'),
+    '5027' => array('town' => 'Herznach', 'canton' => 'AG'),
+    '5028' => array('town' => 'Ueken', 'canton' => 'AG'),
+    '5032' => array('town' => 'Aarau Rohr', 'canton' => 'AG'),
+    '5033' => array('town' => 'Buchs AG', 'canton' => 'AG'),
+    '5034' => array('town' => 'Suhr', 'canton' => 'AG'),
+    '5035' => array('town' => 'Unterentfelden', 'canton' => 'AG'),
+    '5036' => array('town' => 'Oberentfelden', 'canton' => 'AG'),
+    '5037' => array('town' => 'Muhen', 'canton' => 'AG'),
+    '5040' => array('town' => 'Schöftland', 'canton' => 'AG'),
+    '5042' => array('town' => 'Hirschthal', 'canton' => 'AG'),
+    '5043' => array('town' => 'Holziken', 'canton' => 'AG'),
+    '5044' => array('town' => 'Schlossrued', 'canton' => 'AG'),
+    '5046' => array('town' => 'Schmiedrued', 'canton' => 'AG'),
+    '5053' => array('town' => 'Staffelbach', 'canton' => 'AG'),
+    '5054' => array('town' => 'Kirchleerau-Moosle', 'canton' => 'AG'),
+    '5056' => array('town' => 'Attelwil', 'canton' => 'AG'),
+    '5057' => array('town' => 'Reitnau', 'canton' => 'AG'),
+    '5102' => array('town' => 'Rupperswil', 'canton' => 'AG'),
+    '5103' => array('town' => 'Wildegg', 'canton' => 'AG'),
+    '5105' => array('town' => 'Auenstein', 'canton' => 'AG'),
+    '5106' => array('town' => 'Veltheim AG', 'canton' => 'AG'),
+    '5107' => array('town' => 'Schinznach Dorf', 'canton' => 'AG'),
+    '5108' => array('town' => 'Oberflachs', 'canton' => 'AG'),
+    '5112' => array('town' => 'Thalheim AG', 'canton' => 'AG'),
+    '5113' => array('town' => 'Holderbank AG', 'canton' => 'AG'),
+    '5116' => array('town' => 'Schinznach Bad', 'canton' => 'AG'),
+    '5245' => array('town' => 'Habsburg', 'canton' => 'AG'),
+    '5246' => array('town' => 'Scherz', 'canton' => 'AG'),
+    '5200' => array('town' => 'Brugg AG', 'canton' => 'AG'),
+    '5210' => array('town' => 'Windisch', 'canton' => 'AG'),
+    '5201' => array('town' => 'Brugg AG', 'canton' => 'AG'),
+    '5212' => array('town' => 'Hausen AG', 'canton' => 'AG'),
+    '5213' => array('town' => 'Villnachern', 'canton' => 'AG'),
+    '5222' => array('town' => 'Umiken', 'canton' => 'AG'),
+    '5223' => array('town' => 'Riniken', 'canton' => 'AG'),
+    '5224' => array('town' => 'Unterbözberg', 'canton' => 'AG'),
+    '5225' => array('town' => 'Oberbözberg', 'canton' => 'AG'),
+    '5233' => array('town' => 'Stilli', 'canton' => 'AG'),
+    '5234' => array('town' => 'Villigen', 'canton' => 'AG'),
+    '5235' => array('town' => 'Rüfenach AG', 'canton' => 'AG'),
+    '5236' => array('town' => 'Remigen', 'canton' => 'AG'),
+    '5237' => array('town' => 'Mönthal', 'canton' => 'AG'),
+    '5242' => array('town' => 'Birr-Lupfig', 'canton' => 'AG'),
+    '5243' => array('town' => 'Mülligen', 'canton' => 'AG'),
+    '5244' => array('town' => 'Birrhard', 'canton' => 'AG'),
+    '5078' => array('town' => 'Effingen', 'canton' => 'AG'),
+    '5076' => array('town' => 'Bözen', 'canton' => 'AG'),
+    '5077' => array('town' => 'Elfingen', 'canton' => 'AG'),
+    '5079' => array('town' => 'Zeihen', 'canton' => 'AG'),
+    '5075' => array('town' => 'Hornussen', 'canton' => 'AG'),
+    '5070' => array('town' => 'Frick', 'canton' => 'AG'),
+    '5072' => array('town' => 'Oeschgen', 'canton' => 'AG'),
+    '5073' => array('town' => 'Gipf-Oberfrick', 'canton' => 'AG'),
+    '5064' => array('town' => 'Wittnau', 'canton' => 'AG'),
+    '5063' => array('town' => 'Wölflinswil', 'canton' => 'AG'),
+    '5062' => array('town' => 'Oberhof', 'canton' => 'AG'),
+    '5074' => array('town' => 'Eiken', 'canton' => 'AG'),
+    '5300' => array('town' => 'Turgi', 'canton' => 'AG'),
+    '5301' => array('town' => 'Siggenthal Station', 'canton' => 'AG'),
+    '5303' => array('town' => 'Würenlingen', 'canton' => 'AG'),
+    '5304' => array('town' => 'Endingen', 'canton' => 'AG'),
+    '5305' => array('town' => 'Unterendingen', 'canton' => 'AG'),
+    '5306' => array('town' => 'Tegerfelden', 'canton' => 'AG'),
+    '5312' => array('town' => 'Döttingen', 'canton' => 'AG'),
+    '5313' => array('town' => 'Klingnau', 'canton' => 'AG'),
+    '5314' => array('town' => 'Kleindöttingen', 'canton' => 'AG'),
+    '5315' => array('town' => 'Böttstein', 'canton' => 'AG'),
+    '5316' => array('town' => 'Leuggern', 'canton' => 'AG'),
+    '5317' => array('town' => 'Hettenschwil', 'canton' => 'AG'),
+    '5318' => array('town' => 'Mandach', 'canton' => 'AG'),
+    '5322' => array('town' => 'Koblenz', 'canton' => 'AG'),
+    '5400' => array('town' => 'Baden', 'canton' => 'AG'),
+    '5408' => array('town' => 'Ennetbaden', 'canton' => 'AG'),
+    '5401' => array('town' => 'Baden', 'canton' => 'AG'),
+    '5402' => array('town' => 'Baden', 'canton' => 'AG'),
+    '5404' => array('town' => 'Baden', 'canton' => 'AG'),
+    '5405' => array('town' => 'Baden', 'canton' => 'AG'),
+    '5406' => array('town' => 'Baden', 'canton' => 'AG'),
+    '5412' => array('town' => 'Gebenstorf', 'canton' => 'AG'),
+    '5413' => array('town' => 'Birmenstorf AG', 'canton' => 'AG'),
+    '5415' => array('town' => 'Nussbaumen AG', 'canton' => 'AG'),
+    '5416' => array('town' => 'Kirchdorf AG', 'canton' => 'AG'),
+    '5417' => array('town' => 'Untersiggenthal', 'canton' => 'AG'),
+    '5420' => array('town' => 'Ehrendingen', 'canton' => 'AG'),
+    '5423' => array('town' => 'Freienwil', 'canton' => 'AG'),
+    '5425' => array('town' => 'Schneisingen', 'canton' => 'AG'),
+    '5426' => array('town' => 'Lengnau AG', 'canton' => 'AG'),
+    '5430' => array('town' => 'Wettingen', 'canton' => 'AG'),
+    '5431' => array('town' => 'Wettingen Sonderd', 'canton' => 'AG'),
+    '5432' => array('town' => 'Neuenhof', 'canton' => 'AG'),
+    '5442' => array('town' => 'Fislisbach', 'canton' => 'AG'),
+    '5443' => array('town' => 'Niederrohrdorf', 'canton' => 'AG'),
+    '5444' => array('town' => 'Künten', 'canton' => 'AG'),
+    '5445' => array('town' => 'Eggenwil', 'canton' => 'AG'),
+    '5452' => array('town' => 'Oberrohrdorf', 'canton' => 'AG'),
+    '5453' => array('town' => 'Remetschwil', 'canton' => 'AG'),
+    '5454' => array('town' => 'Bellikon', 'canton' => 'AG'),
+    '5502' => array('town' => 'Hunzenschwil', 'canton' => 'AG'),
+    '5503' => array('town' => 'Schafisheim', 'canton' => 'AG'),
+    '5504' => array('town' => 'Othmarsingen', 'canton' => 'AG'),
+    '5505' => array('town' => 'Brunegg', 'canton' => 'AG'),
+    '5506' => array('town' => 'Mägenwil', 'canton' => 'AG'),
+    '5507' => array('town' => 'Mellingen', 'canton' => 'AG'),
+    '5512' => array('town' => 'Wohlenschwil', 'canton' => 'AG'),
+    '5522' => array('town' => 'Tägerig', 'canton' => 'AG'),
+    '5524' => array('town' => 'Nesselnbach', 'canton' => 'AG'),
+    '5525' => array('town' => 'Fischbach-Göslikon', 'canton' => 'AG'),
+    '5600' => array('town' => 'Lenzburg', 'canton' => 'AG'),
+    '5603' => array('town' => 'Staufen', 'canton' => 'AG'),
+    '5604' => array('town' => 'Hendschiken', 'canton' => 'AG'),
+    '5605' => array('town' => 'Dottikon', 'canton' => 'AG'),
+    '5606' => array('town' => 'Dintikon', 'canton' => 'AG'),
+    '5607' => array('town' => 'Hägglingen', 'canton' => 'AG'),
+    '5608' => array('town' => 'Stetten AG', 'canton' => 'AG'),
+    '5610' => array('town' => 'Wohlen AG', 'canton' => 'AG'),
+    '5611' => array('town' => 'Anglikon', 'canton' => 'AG'),
+    '5619' => array('town' => 'Büttikon AG', 'canton' => 'AG'),
+    '5612' => array('town' => 'Villmergen', 'canton' => 'AG'),
+    '5613' => array('town' => 'Hilfikon', 'canton' => 'AG'),
+    '5614' => array('town' => 'Sarmenstorf', 'canton' => 'AG'),
+    '5615' => array('town' => 'Fahrwangen', 'canton' => 'AG'),
+    '5616' => array('town' => 'Meisterschwanden', 'canton' => 'AG'),
+    '5617' => array('town' => 'Tennwil', 'canton' => 'AG'),
+    '5618' => array('town' => 'Bettwil', 'canton' => 'AG'),
+    '5620' => array('town' => 'Bremgarten AG', 'canton' => 'AG'),
+    '5621' => array('town' => 'Zufikon', 'canton' => 'AG'),
+    '5622' => array('town' => 'Waltenschwil', 'canton' => 'AG'),
+    '5623' => array('town' => 'Boswil', 'canton' => 'AG'),
+    '5624' => array('town' => 'Bünzen', 'canton' => 'AG'),
+    '5625' => array('town' => 'Kallern', 'canton' => 'AG'),
+    '5626' => array('town' => 'Hermetschwil-Staff', 'canton' => 'AG'),
+    '5627' => array('town' => 'Besenbüren', 'canton' => 'AG'),
+    '5628' => array('town' => 'Aristau', 'canton' => 'AG'),
+    '5630' => array('town' => 'Muri AG', 'canton' => 'AG'),
+    '5632' => array('town' => 'Buttwil', 'canton' => 'AG'),
+    '5634' => array('town' => 'Merenschwand', 'canton' => 'AG'),
+    '5636' => array('town' => 'Benzenschwil', 'canton' => 'AG'),
+    '5637' => array('town' => 'Beinwil (Freiamt)', 'canton' => 'AG'),
+    '5642' => array('town' => 'Mühlau', 'canton' => 'AG'),
+    '5643' => array('town' => 'Sins', 'canton' => 'AG'),
+    '5644' => array('town' => 'Auw', 'canton' => 'AG'),
+    '5645' => array('town' => 'Aettenschwil', 'canton' => 'AG'),
+    '5646' => array('town' => 'Abtwil AG', 'canton' => 'AG'),
+    '5647' => array('town' => 'Oberrüti', 'canton' => 'AG'),
+    '5702' => array('town' => 'Niederlenz', 'canton' => 'AG'),
+    '5703' => array('town' => 'Seon', 'canton' => 'AG'),
+    '5704' => array('town' => 'Egliswil', 'canton' => 'AG'),
+    '5705' => array('town' => 'Hallwil', 'canton' => 'AG'),
+    '5706' => array('town' => 'Boniswil', 'canton' => 'AG'),
+    '5707' => array('town' => 'Seengen', 'canton' => 'AG'),
+    '5708' => array('town' => 'Birrwil', 'canton' => 'AG'),
+    '5712' => array('town' => 'Beinwil am See', 'canton' => 'AG'),
+    '5722' => array('town' => 'Gränichen', 'canton' => 'AG'),
+    '5723' => array('town' => 'Teufenthal AG', 'canton' => 'AG'),
+    '5724' => array('town' => 'Dürrenäsch', 'canton' => 'AG'),
+    '5725' => array('town' => 'Leutwil', 'canton' => 'AG'),
+    '5726' => array('town' => 'Unterkulm', 'canton' => 'AG'),
+    '5727' => array('town' => 'Oberkulm', 'canton' => 'AG'),
+    '5728' => array('town' => 'Gontenschwil', 'canton' => 'AG'),
+    '5732' => array('town' => 'Zetzwil', 'canton' => 'AG'),
+    '5733' => array('town' => 'Leimbach AG', 'canton' => 'AG'),
+    '5734' => array('town' => 'Reinach AG', 'canton' => 'AG'),
+    '5735' => array('town' => 'Pfeffikon LU', 'canton' => 'LU'),
+    '5736' => array('town' => 'Burg AG', 'canton' => 'AG'),
+    '5737' => array('town' => 'Menziken', 'canton' => 'AG'),
+    '5742' => array('town' => 'Kölliken', 'canton' => 'AG'),
+    '5745' => array('town' => 'Safenwil', 'canton' => 'AG'),
+    '5746' => array('town' => 'Walterswil SO', 'canton' => 'SO'),
+    '6000' => array('town' => 'Luzern', 'canton' => 'LU'),
+    '6002' => array('town' => 'Luzern', 'canton' => 'LU'),
+    '6003' => array('town' => 'Luzern', 'canton' => 'LU'),
+    '6004' => array('town' => 'Luzern', 'canton' => 'LU'),
+    '6005' => array('town' => 'Luzern', 'canton' => 'LU'),
+    '6006' => array('town' => 'Luzern', 'canton' => 'LU'),
+    '6010' => array('town' => 'Kriens', 'canton' => 'LU'),
+    '6012' => array('town' => 'Obernau', 'canton' => 'LU'),
+    '6013' => array('town' => 'Eigenthal', 'canton' => 'LU'),
+    '6014' => array('town' => 'Luzern', 'canton' => 'LU'),
+    '6015' => array('town' => 'Luzern', 'canton' => 'LU'),
+    '6016' => array('town' => 'Hellbühl', 'canton' => 'LU'),
+    '6017' => array('town' => 'Ruswil', 'canton' => 'LU'),
+    '6019' => array('town' => 'Sigigen', 'canton' => 'LU'),
+    '6018' => array('town' => 'Buttisholz', 'canton' => 'LU'),
+    '6020' => array('town' => 'Emmenbrücke', 'canton' => 'LU'),
+    '6022' => array('town' => 'Grosswangen', 'canton' => 'LU'),
+    '6023' => array('town' => 'Rothenburg', 'canton' => 'LU'),
+    '6024' => array('town' => 'Hildisrieden', 'canton' => 'LU'),
+    '6025' => array('town' => 'Neudorf', 'canton' => 'LU'),
+    '6026' => array('town' => 'Rain', 'canton' => 'LU'),
+    '6027' => array('town' => 'Römerswil LU', 'canton' => 'LU'),
+    '6028' => array('town' => 'Herlisberg', 'canton' => 'LU'),
+    '6030' => array('town' => 'Ebikon', 'canton' => 'LU'),
+    '6032' => array('town' => 'Emmen', 'canton' => 'LU'),
+    '6033' => array('town' => 'Buchrain', 'canton' => 'LU'),
+    '6034' => array('town' => 'Inwil', 'canton' => 'LU'),
+    '6035' => array('town' => 'Perlen', 'canton' => 'LU'),
+    '6036' => array('town' => 'Dierikon', 'canton' => 'LU'),
+    '6037' => array('town' => 'Root', 'canton' => 'LU'),
+    '6038' => array('town' => 'Gisikon', 'canton' => 'LU'),
+    '6042' => array('town' => 'Dietwil', 'canton' => 'AG'),
+    '6043' => array('town' => 'Adligenswil', 'canton' => 'LU'),
+    '6044' => array('town' => 'Udligenswil', 'canton' => 'LU'),
+    '6045' => array('town' => 'Meggen', 'canton' => 'LU'),
+    '6047' => array('town' => 'Kastanienbaum', 'canton' => 'LU'),
+    '6048' => array('town' => 'Horw', 'canton' => 'LU'),
+    '6052' => array('town' => 'Hergiswil NW', 'canton' => 'NW'),
+    '6053' => array('town' => 'Alpnachstad', 'canton' => 'OW'),
+    '6055' => array('town' => 'Alpnach Dorf', 'canton' => 'OW'),
+    '6056' => array('town' => 'Kägiswil', 'canton' => 'OW'),
+    '6060' => array('town' => 'Sarnen', 'canton' => 'OW'),
+    '6068' => array('town' => 'Melchsee-Frutt', 'canton' => 'OW'),
+    '6062' => array('town' => 'Wilen (Sarnen)', 'canton' => 'OW'),
+    '6063' => array('town' => 'Stalden (Sarnen)', 'canton' => 'OW'),
+    '6064' => array('town' => 'Kerns', 'canton' => 'OW'),
+    '6066' => array('town' => 'St. Niklausen OW', 'canton' => 'OW'),
+    '6067' => array('town' => 'Melchtal', 'canton' => 'OW'),
+    '6072' => array('town' => 'Sachseln', 'canton' => 'OW'),
+    '6073' => array('town' => 'Flüeli-Ranft', 'canton' => 'OW'),
+    '6074' => array('town' => 'Giswil', 'canton' => 'OW'),
+    '6078' => array('town' => 'Bürglen OW', 'canton' => 'OW'),
+    '6083' => array('town' => 'Hasliberg Hohfluh', 'canton' => 'BE'),
+    '6084' => array('town' => 'Hasliberg Wasserw', 'canton' => 'BE'),
+    '6085' => array('town' => 'Hasliberg Goldern', 'canton' => 'BE'),
+    '6086' => array('town' => 'Hasliberg Reuti', 'canton' => 'BE'),
+    '6102' => array('town' => 'Malters', 'canton' => 'LU'),
+    '6103' => array('town' => 'Schwarzenberg LU', 'canton' => 'LU'),
+    '6105' => array('town' => 'Schachen LU', 'canton' => 'LU'),
+    '6106' => array('town' => 'Werthenstein', 'canton' => 'LU'),
+    '6110' => array('town' => 'Wolhusen', 'canton' => 'LU'),
+    '6114' => array('town' => 'Steinhuserberg', 'canton' => 'LU'),
+    '6112' => array('town' => 'Doppleschwand', 'canton' => 'LU'),
+    '6113' => array('town' => 'Romoos', 'canton' => 'LU'),
+    '6122' => array('town' => 'Menznau', 'canton' => 'LU'),
+    '6123' => array('town' => 'Geiss', 'canton' => 'LU'),
+    '6125' => array('town' => 'Menzberg', 'canton' => 'LU'),
+    '6126' => array('town' => 'Daiwil', 'canton' => 'LU'),
+    '6130' => array('town' => 'Willisau', 'canton' => 'LU'),
+    '6132' => array('town' => 'Rohrmatt', 'canton' => 'LU'),
+    '6133' => array('town' => 'Hergiswil LU', 'canton' => 'LU'),
+    '6142' => array('town' => 'Gettnau', 'canton' => 'LU'),
+    '6143' => array('town' => 'Ohmstal', 'canton' => 'LU'),
+    '6144' => array('town' => 'Zell LU', 'canton' => 'LU'),
+    '6145' => array('town' => 'Fischbach LU', 'canton' => 'LU'),
+    '6146' => array('town' => 'Grossdietwil', 'canton' => 'LU'),
+    '6147' => array('town' => 'Altbüron', 'canton' => 'LU'),
+    '6152' => array('town' => 'Hüswil', 'canton' => 'LU'),
+    '6153' => array('town' => 'Ufhusen', 'canton' => 'LU'),
+    '6154' => array('town' => 'Hofstatt', 'canton' => 'LU'),
+    '6156' => array('town' => 'Luthern', 'canton' => 'LU'),
+    '6160' => array('town' => 'Entlebuch', 'canton' => 'LU'),
+    '6162' => array('town' => 'Entlebuch', 'canton' => 'LU'),
+    '6163' => array('town' => 'Ebnet', 'canton' => 'LU'),
+    '6166' => array('town' => 'Hasle LU', 'canton' => 'LU'),
+    '6167' => array('town' => 'Bramboden', 'canton' => 'LU'),
+    '6170' => array('town' => 'Schüpfheim', 'canton' => 'LU'),
+    '6173' => array('town' => 'Flühli LU', 'canton' => 'LU'),
+    '6174' => array('town' => 'Sörenberg', 'canton' => 'LU'),
+    '6182' => array('town' => 'Escholzmatt', 'canton' => 'LU'),
+    '6192' => array('town' => 'Wiggen', 'canton' => 'LU'),
+    '6196' => array('town' => 'Marbach LU', 'canton' => 'LU'),
+    '6197' => array('town' => 'Schangnau', 'canton' => 'BE'),
+    '6203' => array('town' => 'Sempach Station', 'canton' => 'LU'),
+    '6204' => array('town' => 'Sempach', 'canton' => 'LU'),
+    '6205' => array('town' => 'Eich', 'canton' => 'LU'),
+    '6206' => array('town' => 'Neuenkirch', 'canton' => 'LU'),
+    '6207' => array('town' => 'Nottwil', 'canton' => 'LU'),
+    '6208' => array('town' => 'Oberkirch LU', 'canton' => 'LU'),
+    '6210' => array('town' => 'Sursee', 'canton' => 'LU'),
+    '6211' => array('town' => 'Buchs LU', 'canton' => 'LU'),
+    '6212' => array('town' => 'St. Erhard', 'canton' => 'LU'),
+    '6213' => array('town' => 'Knutwil', 'canton' => 'LU'),
+    '6214' => array('town' => 'Schenkon', 'canton' => 'LU'),
+    '6215' => array('town' => 'Beromünster', 'canton' => 'LU'),
+    '6216' => array('town' => 'Mauensee', 'canton' => 'LU'),
+    '6217' => array('town' => 'Kottwil', 'canton' => 'LU'),
+    '6218' => array('town' => 'Ettiswil', 'canton' => 'LU'),
+    '6221' => array('town' => 'Rickenbach LU', 'canton' => 'LU'),
+    '6222' => array('town' => 'Gunzwil', 'canton' => 'LU'),
+    '6231' => array('town' => 'Schlierbach', 'canton' => 'LU'),
+    '6232' => array('town' => 'Geuensee', 'canton' => 'LU'),
+    '6233' => array('town' => 'Büron', 'canton' => 'LU'),
+    '6234' => array('town' => 'Triengen', 'canton' => 'LU'),
+    '6236' => array('town' => 'Wilihof', 'canton' => 'LU'),
+    '6235' => array('town' => 'Winikon', 'canton' => 'LU'),
+    '6242' => array('town' => 'Wauwil', 'canton' => 'LU'),
+    '6243' => array('town' => 'Egolzwil', 'canton' => 'LU'),
+    '6244' => array('town' => 'Nebikon', 'canton' => 'LU'),
+    '6245' => array('town' => 'Ebersecken', 'canton' => 'LU'),
+    '6246' => array('town' => 'Altishofen', 'canton' => 'LU'),
+    '6247' => array('town' => 'Schötz', 'canton' => 'LU'),
+    '6248' => array('town' => 'Alberswil', 'canton' => 'LU'),
+    '6252' => array('town' => 'Dagmersellen', 'canton' => 'LU'),
+    '6253' => array('town' => 'Uffikon', 'canton' => 'LU'),
+    '6260' => array('town' => 'Reiden', 'canton' => 'LU'),
+    '6262' => array('town' => 'Langnau b. Reiden', 'canton' => 'LU'),
+    '6263' => array('town' => 'Richenthal', 'canton' => 'LU'),
+    '6264' => array('town' => 'Pfaffnau', 'canton' => 'LU'),
+    '6265' => array('town' => 'Roggliswil', 'canton' => 'LU'),
+    '6274' => array('town' => 'Eschenbach LU', 'canton' => 'LU'),
+    '6275' => array('town' => 'Ballwil', 'canton' => 'LU'),
+    '6276' => array('town' => 'Hohenrain', 'canton' => 'LU'),
+    '6277' => array('town' => 'Kleinwangen', 'canton' => 'LU'),
+    '6280' => array('town' => 'Hochdorf', 'canton' => 'LU'),
+    '6283' => array('town' => 'Baldegg', 'canton' => 'LU'),
+    '6284' => array('town' => 'Gelfingen', 'canton' => 'LU'),
+    '6285' => array('town' => 'Hitzkirch', 'canton' => 'LU'),
+    '6289' => array('town' => 'Müswangen', 'canton' => 'LU'),
+    '6286' => array('town' => 'Altwis', 'canton' => 'LU'),
+    '6287' => array('town' => 'Aesch LU', 'canton' => 'LU'),
+    '6288' => array('town' => 'Schongau', 'canton' => 'LU'),
+    '6294' => array('town' => 'Ermensee', 'canton' => 'LU'),
+    '6295' => array('town' => 'Mosen', 'canton' => 'LU'),
+    '6300' => array('town' => 'Zug', 'canton' => 'ZG'),
+    '6330' => array('town' => 'Cham 2', 'canton' => 'ZG'),
+    '6301' => array('town' => 'Zug', 'canton' => 'ZG'),
+    '6310' => array('town' => 'Zug', 'canton' => 'ZG'),
+    '6313' => array('town' => 'Edlibach', 'canton' => 'ZG'),
+    '6319' => array('town' => 'Allenwinden', 'canton' => 'ZG'),
+    '6315' => array('town' => 'Morgarten', 'canton' => 'ZG'),
+    '6312' => array('town' => 'Steinhausen', 'canton' => 'ZG'),
+    '6314' => array('town' => 'Unterägeri', 'canton' => 'ZG'),
+    '6317' => array('town' => 'Oberwil b. Zug', 'canton' => 'ZG'),
+    '6318' => array('town' => 'Walchwil', 'canton' => 'ZG'),
+    '6331' => array('town' => 'Hünenberg', 'canton' => 'ZG'),
+    '6332' => array('town' => 'Hagendorn', 'canton' => 'ZG'),
+    '6340' => array('town' => 'Baar', 'canton' => 'ZG'),
+    '6343' => array('town' => 'Rotkreuz', 'canton' => 'ZG'),
+    '6344' => array('town' => 'Meierskappel', 'canton' => 'LU'),
+    '6345' => array('town' => 'Neuheim', 'canton' => 'ZG'),
+    '6353' => array('town' => 'Weggis', 'canton' => 'LU'),
+    '6354' => array('town' => 'Vitznau', 'canton' => 'LU'),
+    '6356' => array('town' => 'Rigi Kaltbad', 'canton' => 'LU'),
+    '6362' => array('town' => 'Stansstad', 'canton' => 'NW'),
+    '6363' => array('town' => 'Obbürgen', 'canton' => 'NW'),
+    '6365' => array('town' => 'Kehrsiten', 'canton' => 'NW'),
+    '6370' => array('town' => 'Stans', 'canton' => 'NW'),
+    '6372' => array('town' => 'Ennetmoos', 'canton' => 'NW'),
+    '6373' => array('town' => 'Ennetbürgen', 'canton' => 'NW'),
+    '6374' => array('town' => 'Buochs', 'canton' => 'NW'),
+    '6375' => array('town' => 'Beckenried', 'canton' => 'NW'),
+    '6376' => array('town' => 'Emmetten', 'canton' => 'NW'),
+    '6377' => array('town' => 'Seelisberg', 'canton' => 'UR'),
+    '6382' => array('town' => 'Büren NW', 'canton' => 'NW'),
+    '6383' => array('town' => 'Dallenwil', 'canton' => 'NW'),
+    '6386' => array('town' => 'Wolfenschiessen', 'canton' => 'NW'),
+    '6387' => array('town' => 'Oberrickenbach', 'canton' => 'NW'),
+    '6388' => array('town' => 'Grafenort', 'canton' => 'OW'),
+    '6390' => array('town' => 'Engelberg', 'canton' => 'OW'),
+    '6402' => array('town' => 'Merlischachen', 'canton' => 'SZ'),
+    '6403' => array('town' => 'Küssnacht am Rigi', 'canton' => 'SZ'),
+    '6404' => array('town' => 'Greppen', 'canton' => 'LU'),
+    '6405' => array('town' => 'Immensee', 'canton' => 'SZ'),
+    '6410' => array('town' => 'Goldau', 'canton' => 'SZ'),
+    '6414' => array('town' => 'Oberarth', 'canton' => 'SZ'),
+    '6415' => array('town' => 'Arth', 'canton' => 'SZ'),
+    '6416' => array('town' => 'Steinerberg', 'canton' => 'SZ'),
+    '6417' => array('town' => 'Sattel', 'canton' => 'SZ'),
+    '6418' => array('town' => 'Rothenthurm', 'canton' => 'SZ'),
+    '6422' => array('town' => 'Steinen', 'canton' => 'SZ'),
+    '6423' => array('town' => 'Seewen SZ', 'canton' => 'SZ'),
+    '6424' => array('town' => 'Lauerz', 'canton' => 'SZ'),
+    '6430' => array('town' => 'Schwyz', 'canton' => 'SZ'),
+    '6436' => array('town' => 'Ried (Muotathal)', 'canton' => 'SZ'),
+    '6432' => array('town' => 'Rickenbach SZ', 'canton' => 'SZ'),
+    '6433' => array('town' => 'Stoos SZ', 'canton' => 'SZ'),
+    '6434' => array('town' => 'Illgau', 'canton' => 'SZ'),
+    '6438' => array('town' => 'Ibach', 'canton' => 'SZ'),
+    '6440' => array('town' => 'Brunnen', 'canton' => 'SZ'),
+    '6441' => array('town' => 'Rütli', 'canton' => 'UR'),
+    '6442' => array('town' => 'Gersau', 'canton' => 'SZ'),
+    '6443' => array('town' => 'Morschach', 'canton' => 'SZ'),
+    '6452' => array('town' => 'Sisikon', 'canton' => 'UR'),
+    '6454' => array('town' => 'Flüelen', 'canton' => 'UR'),
+    '6460' => array('town' => 'Altdorf UR', 'canton' => 'UR'),
+    '6461' => array('town' => 'Isenthal', 'canton' => 'UR'),
+    '6462' => array('town' => 'Seedorf UR', 'canton' => 'UR'),
+    '6463' => array('town' => 'Bürglen UR', 'canton' => 'UR'),
+    '6464' => array('town' => 'Spiringen', 'canton' => 'UR'),
+    '6465' => array('town' => 'Unterschächen', 'canton' => 'UR'),
+    '6466' => array('town' => 'Bauen', 'canton' => 'UR'),
+    '6467' => array('town' => 'Schattdorf', 'canton' => 'UR'),
+    '6469' => array('town' => 'Haldi b.Schattdorf', 'canton' => 'UR'),
+    '6468' => array('town' => 'Attinghausen', 'canton' => 'UR'),
+    '6472' => array('town' => 'Erstfeld', 'canton' => 'UR'),
+    '6473' => array('town' => 'Silenen', 'canton' => 'UR'),
+    '6474' => array('town' => 'Amsteg', 'canton' => 'UR'),
+    '6475' => array('town' => 'Bristen', 'canton' => 'UR'),
+    '6476' => array('town' => 'Intschi', 'canton' => 'UR'),
+    '6482' => array('town' => 'Gurtnellen', 'canton' => 'UR'),
+    '6484' => array('town' => 'Wassen UR', 'canton' => 'UR'),
+    '6485' => array('town' => 'Meien', 'canton' => 'UR'),
+    '6487' => array('town' => 'Göschenen', 'canton' => 'UR'),
+    '6490' => array('town' => 'Andermatt', 'canton' => 'UR'),
+    '6491' => array('town' => 'Realp', 'canton' => 'UR'),
+    '6493' => array('town' => 'Hospental', 'canton' => 'UR'),
+    '6500' => array('town' => 'Bellinzona', 'canton' => 'TI'),
+    '6501' => array('town' => 'Bellinzona', 'canton' => 'TI'),
+    '6503' => array('town' => 'Bellinzona', 'canton' => 'TI'),
+    '6506' => array('town' => 'Bellinzona 6 Autop', 'canton' => 'TI'),
+    '6512' => array('town' => 'Giubiasco', 'canton' => 'TI'),
+    '6513' => array('town' => 'Monte Carasso', 'canton' => 'TI'),
+    '6514' => array('town' => 'Sementina', 'canton' => 'TI'),
+    '6515' => array('town' => 'Gudo', 'canton' => 'TI'),
+    '6516' => array('town' => 'Cugnasco', 'canton' => 'TI'),
+    '6517' => array('town' => 'Arbedo', 'canton' => 'TI'),
+    '6518' => array('town' => 'Gorduno', 'canton' => 'TI'),
+    '6525' => array('town' => 'Gnosca', 'canton' => 'TI'),
+    '6526' => array('town' => 'Prosito', 'canton' => 'TI'),
+    '6527' => array('town' => 'Lodrino', 'canton' => 'TI'),
+    '6528' => array('town' => 'Camorino', 'canton' => 'TI'),
+    '6532' => array('town' => 'Castione', 'canton' => 'TI'),
+    '6533' => array('town' => 'Lumino', 'canton' => 'TI'),
+    '6534' => array('town' => 'S. Vittore', 'canton' => 'GR'),
+    '6535' => array('town' => 'Roveredo GR', 'canton' => 'GR'),
+    '6537' => array('town' => 'Grono', 'canton' => 'GR'),
+    '6523' => array('town' => 'Preonzo', 'canton' => 'TI'),
+    '6524' => array('town' => 'Moleno', 'canton' => 'TI'),
+    '6582' => array('town' => 'Pianezzo', 'canton' => 'TI'),
+    '6583' => array('town' => 'S. Antonio', 'canton' => 'TI'),
+    '6584' => array('town' => 'Carena', 'canton' => 'TI'),
+    '6549' => array('town' => 'Laura', 'canton' => 'GR'),
+    '6540' => array('town' => 'Castaneda', 'canton' => 'GR'),
+    '6541' => array('town' => 'Sta. Maria', 'canton' => 'GR'),
+    '6538' => array('town' => 'Verdabbio', 'canton' => 'GR'),
+    '6542' => array('town' => 'Buseno', 'canton' => 'GR'),
+    '6543' => array('town' => 'Arvigo', 'canton' => 'GR'),
+    '6544' => array('town' => 'Braggio', 'canton' => 'GR'),
+    '6545' => array('town' => 'Selma', 'canton' => 'GR'),
+    '6546' => array('town' => 'Cauco', 'canton' => 'GR'),
+    '6547' => array('town' => 'Augio', 'canton' => 'GR'),
+    '6548' => array('town' => 'Rossa', 'canton' => 'GR'),
+    '6556' => array('town' => 'Leggia', 'canton' => 'GR'),
+    '6565' => array('town' => 'S. Bernardino', 'canton' => 'GR'),
+    '6557' => array('town' => 'Cama', 'canton' => 'GR'),
+    '6558' => array('town' => 'Lostallo', 'canton' => 'GR'),
+    '6562' => array('town' => 'Soazza', 'canton' => 'GR'),
+    '6563' => array('town' => 'Mesocco', 'canton' => 'GR'),
+    '6572' => array('town' => 'Quartino', 'canton' => 'TI'),
+    '6573' => array('town' => 'Magadino', 'canton' => 'TI'),
+    '6574' => array('town' => 'Vira (Gambarogno)', 'canton' => 'TI'),
+    '6575' => array('town' => 'S. Nazzaro', 'canton' => 'TI'),
+    '6576' => array('town' => 'Gerra (Gambarogno)', 'canton' => 'TI'),
+    '6577' => array('town' => 'Ranzo', 'canton' => 'TI'),
+    '6578' => array('town' => 'Caviano', 'canton' => 'TI'),
+    '6579' => array('town' => 'Piazzogna', 'canton' => 'TI'),
+    '6571' => array('town' => 'Indemini', 'canton' => 'TI'),
+    '6592' => array('town' => 'S. Antonino', 'canton' => 'TI'),
+    '6593' => array('town' => 'Cadenazzo', 'canton' => 'TI'),
+    '6594' => array('town' => 'Contone', 'canton' => 'TI'),
+    '6595' => array('town' => 'Riazzino', 'canton' => 'TI'),
+    '6596' => array('town' => 'Gordola', 'canton' => 'TI'),
+    '6597' => array('town' => 'Agarone', 'canton' => 'TI'),
+    '6598' => array('town' => 'Tenero', 'canton' => 'TI'),
+    '6599' => array('town' => 'Robasacco', 'canton' => 'TI'),
+    '6600' => array('town' => 'Locarno', 'canton' => 'TI'),
+    '6601' => array('town' => 'Locarno', 'canton' => 'TI'),
+    '6604' => array('town' => 'Locarno', 'canton' => 'TI'),
+    '6605' => array('town' => 'Locarno', 'canton' => 'TI'),
+    '6656' => array('town' => 'Golino', 'canton' => 'TI'),
+    '6618' => array('town' => 'Arcegno', 'canton' => 'TI'),
+    '6646' => array('town' => 'Contra', 'canton' => 'TI'),
+    '6647' => array('town' => 'Mergoscia', 'canton' => 'TI'),
+    '6661' => array('town' => 'Auressio', 'canton' => 'TI'),
+    '6611' => array('town' => 'Mosogno', 'canton' => 'TI'),
+    '6662' => array('town' => 'Russo', 'canton' => 'TI'),
+    '6664' => array('town' => 'Vergeletto', 'canton' => 'TI'),
+    '6663' => array('town' => 'Comologno', 'canton' => 'TI'),
+    '6632' => array('town' => 'Vogorno', 'canton' => 'TI'),
+    '6631' => array('town' => 'Corippo', 'canton' => 'TI'),
+    '6633' => array('town' => 'Lavertezzo', 'canton' => 'TI'),
+    '6634' => array('town' => 'Brione (Verzasca)', 'canton' => 'TI'),
+    '6635' => array('town' => 'Gerra (Verzasca)', 'canton' => 'TI'),
+    '6636' => array('town' => 'Frasco', 'canton' => 'TI'),
+    '6637' => array('town' => 'Sonogno', 'canton' => 'TI'),
+    '6612' => array('town' => 'Ascona', 'canton' => 'TI'),
+    '6613' => array('town' => 'Porto Ronco', 'canton' => 'TI'),
+    '6614' => array('town' => 'Brissago', 'canton' => 'TI'),
+    '6616' => array('town' => 'Losone', 'canton' => 'TI'),
+    '6622' => array('town' => 'Ronco sopra Ascona', 'canton' => 'TI'),
+    '6644' => array('town' => 'Orselina', 'canton' => 'TI'),
+    '6645' => array('town' => 'Brione s. Minusio', 'canton' => 'TI'),
+    '6648' => array('town' => 'Minusio', 'canton' => 'TI'),
+    '6655' => array('town' => 'Verdasio', 'canton' => 'TI'),
+    '6657' => array('town' => 'Palagnedra', 'canton' => 'TI'),
+    '6658' => array('town' => 'Borgnone', 'canton' => 'TI'),
+    '6659' => array('town' => 'Camedo', 'canton' => 'TI'),
+    '6652' => array('town' => 'Tegna', 'canton' => 'TI'),
+    '6653' => array('town' => 'Verscio', 'canton' => 'TI'),
+    '6654' => array('town' => 'Cavigliano', 'canton' => 'TI'),
+    '6670' => array('town' => 'Avegno', 'canton' => 'TI'),
+    '6677' => array('town' => 'Moghegno', 'canton' => 'TI'),
+    '6678' => array('town' => 'Coglio', 'canton' => 'TI'),
+    '6674' => array('town' => 'Riveo', 'canton' => 'TI'),
+    '6682' => array('town' => 'Linescio', 'canton' => 'TI'),
+    '6683' => array('town' => 'Cerentino', 'canton' => 'TI'),
+    '6685' => array('town' => 'Bosco/Gurin', 'canton' => 'TI'),
+    '6684' => array('town' => 'Campo (VM)', 'canton' => 'TI'),
+    '6690' => array('town' => 'Cavergno', 'canton' => 'TI'),
+    '6692' => array('town' => 'Brontallo', 'canton' => 'TI'),
+    '6693' => array('town' => 'Broglio', 'canton' => 'TI'),
+    '6694' => array('town' => 'Prato-Sornico', 'canton' => 'TI'),
+    '6695' => array('town' => 'Peccia', 'canton' => 'TI'),
+    '6696' => array('town' => 'Fusio', 'canton' => 'TI'),
+    '6672' => array('town' => 'Gordevio', 'canton' => 'TI'),
+    '6673' => array('town' => 'Maggia', 'canton' => 'TI'),
+    '6675' => array('town' => 'Cevio', 'canton' => 'TI'),
+    '6676' => array('town' => 'Bignasco', 'canton' => 'TI'),
+    '6702' => array('town' => 'Claro', 'canton' => 'TI'),
+    '6703' => array('town' => 'Osogna', 'canton' => 'TI'),
+    '6705' => array('town' => 'Cresciano', 'canton' => 'TI'),
+    '6707' => array('town' => 'Iragna', 'canton' => 'TI'),
+    '6710' => array('town' => 'Biasca', 'canton' => 'TI'),
+    '6721' => array('town' => 'Ludiano', 'canton' => 'TI'),
+    '6722' => array('town' => 'Corzoneso', 'canton' => 'TI'),
+    '6716' => array('town' => 'Leontica', 'canton' => 'TI'),
+    '6723' => array('town' => 'Prugiasco', 'canton' => 'TI'),
+    '6724' => array('town' => 'Ponto Valentino', 'canton' => 'TI'),
+    '6719' => array('town' => 'Aquila', 'canton' => 'TI'),
+    '6720' => array('town' => 'Campo (Blenio)', 'canton' => 'TI'),
+    '6713' => array('town' => 'Malvaglia', 'canton' => 'TI'),
+    '6714' => array('town' => 'Semione', 'canton' => 'TI'),
+    '6715' => array('town' => 'Dongio', 'canton' => 'TI'),
+    '6717' => array('town' => 'Dangio-Torre', 'canton' => 'TI'),
+    '6718' => array('town' => 'Olivone', 'canton' => 'TI'),
+    '6742' => array('town' => 'Pollegio', 'canton' => 'TI'),
+    '6743' => array('town' => 'Bodio TI', 'canton' => 'TI'),
+    '6745' => array('town' => 'Giornico', 'canton' => 'TI'),
+    '6746' => array('town' => 'Lavorgo', 'canton' => 'TI'),
+    '6747' => array('town' => 'Chironico', 'canton' => 'TI'),
+    '6760' => array('town' => 'Faido', 'canton' => 'TI'),
+    '6772' => array('town' => 'Rodi-Fiesso', 'canton' => 'TI'),
+    '6775' => array('town' => 'Ambrì', 'canton' => 'TI'),
+    '6776' => array('town' => 'Piotta', 'canton' => 'TI'),
+    '6777' => array('town' => 'Quinto', 'canton' => 'TI'),
+    '6780' => array('town' => 'Airolo', 'canton' => 'TI'),
+    '6781' => array('town' => 'Villa Bedretto', 'canton' => 'TI'),
+    '6744' => array('town' => 'Personico', 'canton' => 'TI'),
+    '6748' => array('town' => 'Anzonico', 'canton' => 'TI'),
+    '6749' => array('town' => 'Sobrio', 'canton' => 'TI'),
+    '6763' => array('town' => 'Mairengo', 'canton' => 'TI'),
+    '6764' => array('town' => 'Chiggiogna', 'canton' => 'TI'),
+    '6773' => array('town' => 'Prato (Leventina)', 'canton' => 'TI'),
+    '6774' => array('town' => 'Dalpe', 'canton' => 'TI'),
+    '6802' => array('town' => 'Rivera', 'canton' => 'TI'),
+    '6804' => array('town' => 'Bironico', 'canton' => 'TI'),
+    '6803' => array('town' => 'Camignolo', 'canton' => 'TI'),
+    '6807' => array('town' => 'Taverne', 'canton' => 'TI'),
+    '6808' => array('town' => 'Torricella', 'canton' => 'TI'),
+    '6814' => array('town' => 'Lamone-Cadempino', 'canton' => 'TI'),
+    '6815' => array('town' => 'Melide', 'canton' => 'TI'),
+    '6816' => array('town' => 'Bissone', 'canton' => 'TI'),
+    '6817' => array('town' => 'Maroggia', 'canton' => 'TI'),
+    '6818' => array('town' => 'Melano', 'canton' => 'TI'),
+    '6822' => array('town' => 'Arogno', 'canton' => 'TI'),
+    '6825' => array('town' => 'Capolago', 'canton' => 'TI'),
+    '6826' => array('town' => 'Riva San Vitale', 'canton' => 'TI'),
+    '6828' => array('town' => 'Balerna', 'canton' => 'TI'),
+    '6830' => array('town' => 'Chiasso', 'canton' => 'TI'),
+    '6839' => array('town' => 'Sagno', 'canton' => 'TI'),
+    '6837' => array('town' => 'Caneggio', 'canton' => 'TI'),
+    '6838' => array('town' => 'Cabbio', 'canton' => 'TI'),
+    '6832' => array('town' => 'Pedrinate', 'canton' => 'TI'),
+    '6833' => array('town' => 'Vacallo', 'canton' => 'TI'),
+    '6834' => array('town' => 'Morbio Inferiore', 'canton' => 'TI'),
+    '6836' => array('town' => 'Serfontana', 'canton' => 'TI'),
+    '6835' => array('town' => 'Morbio Superiore', 'canton' => 'TI'),
+    '6809' => array('town' => 'Medeglia', 'canton' => 'TI'),
+    '6810' => array('town' => 'Isone', 'canton' => 'TI'),
+    '6805' => array('town' => 'Mezzovico', 'canton' => 'TI'),
+    '6806' => array('town' => 'Sigirino', 'canton' => 'TI'),
+    '6821' => array('town' => 'Rovio', 'canton' => 'TI'),
+    '6823' => array('town' => 'Pugerna', 'canton' => 'TI'),
+    '6850' => array('town' => 'Mendrisio', 'canton' => 'TI'),
+    '6875' => array('town' => 'Monte', 'canton' => 'TI'),
+    '6873' => array('town' => 'Corteglia', 'canton' => 'TI'),
+    '6852' => array('town' => 'Genestrerio', 'canton' => 'TI'),
+    '6853' => array('town' => 'Ligornetto', 'canton' => 'TI'),
+    '6854' => array('town' => 'S. Pietro', 'canton' => 'TI'),
+    '6855' => array('town' => 'Stabio', 'canton' => 'TI'),
+    '6862' => array('town' => 'Rancate', 'canton' => 'TI'),
+    '6863' => array('town' => 'Besazio', 'canton' => 'TI'),
+    '6864' => array('town' => 'Arzo', 'canton' => 'TI'),
+    '6865' => array('town' => 'Tremona', 'canton' => 'TI'),
+    '6866' => array('town' => 'Meride', 'canton' => 'TI'),
+    '6867' => array('town' => 'Serpiano', 'canton' => 'TI'),
+    '6872' => array('town' => 'Salorino', 'canton' => 'TI'),
+    '6874' => array('town' => 'Castel San Pietro', 'canton' => 'TI'),
+    '6877' => array('town' => 'Coldrerio', 'canton' => 'TI'),
+    '6883' => array('town' => 'Novazzano', 'canton' => 'TI'),
+    '6900' => array('town' => 'Lugano', 'canton' => 'TI'),
+    '6901' => array('town' => 'Lugano', 'canton' => 'TI'),
+    '6902' => array('town' => 'Lugano 2 Caselle', 'canton' => 'TI'),
+    '6903' => array('town' => 'Lugano', 'canton' => 'TI'),
+    '6904' => array('town' => 'Lugano 4 Caselle', 'canton' => 'TI'),
+    '6905' => array('town' => 'Lugano 5 Autoposta', 'canton' => 'TI'),
+    '6906' => array('town' => 'Lugano 6 Caselle', 'canton' => 'TI'),
+    '6913' => array('town' => 'Carabbia', 'canton' => 'TI'),
+    '6915' => array('town' => 'Pambio-Noranco', 'canton' => 'TI'),
+    '6916' => array('town' => 'Grancia', 'canton' => 'TI'),
+    '6917' => array('town' => 'Barbengo', 'canton' => 'TI'),
+    '6919' => array('town' => 'Carabietta', 'canton' => 'TI'),
+    '6921' => array('town' => 'Vico Morcote', 'canton' => 'TI'),
+    '6928' => array('town' => 'Manno', 'canton' => 'TI'),
+    '6929' => array('town' => 'Gravesano', 'canton' => 'TI'),
+    '6930' => array('town' => 'Bedano', 'canton' => 'TI'),
+    '6939' => array('town' => 'Arosio', 'canton' => 'TI'),
+    '6938' => array('town' => 'Vezio', 'canton' => 'TI'),
+    '6937' => array('town' => 'Breno', 'canton' => 'TI'),
+    '6949' => array('town' => 'Comano', 'canton' => 'TI'),
+    '6979' => array('town' => 'Brè sopra Lugano', 'canton' => 'TI'),
+    '6827' => array('town' => 'Brusino Arsizio', 'canton' => 'TI'),
+    '6912' => array('town' => 'Pazzallo', 'canton' => 'TI'),
+    '6914' => array('town' => 'Carona', 'canton' => 'TI'),
+    '6918' => array('town' => 'Figino', 'canton' => 'TI'),
+    '6922' => array('town' => 'Morcote', 'canton' => 'TI'),
+    '6924' => array('town' => 'Sorengo', 'canton' => 'TI'),
+    '6925' => array('town' => 'Gentilino', 'canton' => 'TI'),
+    '6926' => array('town' => 'Montagnola', 'canton' => 'TI'),
+    '6927' => array('town' => 'Agra', 'canton' => 'TI'),
+    '6932' => array('town' => 'Breganzona', 'canton' => 'TI'),
+    '6933' => array('town' => 'Muzzano', 'canton' => 'TI'),
+    '6934' => array('town' => 'Bioggio', 'canton' => 'TI'),
+    '6935' => array('town' => 'Bosco Luganese', 'canton' => 'TI'),
+    '6936' => array('town' => 'Cademario', 'canton' => 'TI'),
+    '6942' => array('town' => 'Savosa', 'canton' => 'TI'),
+    '6943' => array('town' => 'Vezia', 'canton' => 'TI'),
+    '6948' => array('town' => 'Porza', 'canton' => 'TI'),
+    '6950' => array('town' => 'Tesserete', 'canton' => 'TI'),
+    '6944' => array('town' => 'Cureglia', 'canton' => 'TI'),
+    '6945' => array('town' => 'Origlio', 'canton' => 'TI'),
+    '6946' => array('town' => 'Ponte Capriasca', 'canton' => 'TI'),
+    '6947' => array('town' => 'Vaglio', 'canton' => 'TI'),
+    '6954' => array('town' => 'Sala Capriasca', 'canton' => 'TI'),
+    '6953' => array('town' => 'Lugaggia', 'canton' => 'TI'),
+    '6951' => array('town' => 'Insone', 'canton' => 'TI'),
+    '6956' => array('town' => 'Lopagno', 'canton' => 'TI'),
+    '6957' => array('town' => 'Roveredo TI', 'canton' => 'TI'),
+    '6958' => array('town' => 'Bidogno', 'canton' => 'TI'),
+    '6955' => array('town' => 'Cagiallo', 'canton' => 'TI'),
+    '6959' => array('town' => 'Cimadera', 'canton' => 'TI'),
+    '6952' => array('town' => 'Canobbio', 'canton' => 'TI'),
+    '6962' => array('town' => 'Viganello', 'canton' => 'TI'),
+    '6963' => array('town' => 'Pregassona', 'canton' => 'TI'),
+    '6964' => array('town' => 'Davesco-Soragno', 'canton' => 'TI'),
+    '6965' => array('town' => 'Cadro', 'canton' => 'TI'),
+    '6966' => array('town' => 'Villa Luganese', 'canton' => 'TI'),
+    '6967' => array('town' => 'Dino', 'canton' => 'TI'),
+    '6968' => array('town' => 'Sonvico', 'canton' => 'TI'),
+    '6974' => array('town' => 'Aldesago', 'canton' => 'TI'),
+    '6976' => array('town' => 'Castagnola', 'canton' => 'TI'),
+    '6977' => array('town' => 'Ruvigliana', 'canton' => 'TI'),
+    '6978' => array('town' => 'Gandria', 'canton' => 'TI'),
+    '6990' => array('town' => 'Cassina d\'Agno', 'canton' => 'TI'),
+    '6991' => array('town' => 'Neggio', 'canton' => 'TI'),
+    '6992' => array('town' => 'Vernate', 'canton' => 'TI'),
+    '6993' => array('town' => 'Iseo', 'canton' => 'TI'),
+    '6994' => array('town' => 'Aranno', 'canton' => 'TI'),
+    '6981' => array('town' => 'Bedigliora', 'canton' => 'TI'),
+    '6980' => array('town' => 'Castelrotto', 'canton' => 'TI'),
+    '6999' => array('town' => 'Astano', 'canton' => 'TI'),
+    '6986' => array('town' => 'Miglieglia', 'canton' => 'TI'),
+    '6989' => array('town' => 'Purasca', 'canton' => 'TI'),
+    '6995' => array('town' => 'Molinazzo', 'canton' => 'TI'),
+    '6996' => array('town' => 'Ponte Cremenaga', 'canton' => 'TI'),
+    '6997' => array('town' => 'Sessa', 'canton' => 'TI'),
+    '6998' => array('town' => 'Termine', 'canton' => 'TI'),
+    '6982' => array('town' => 'Agno', 'canton' => 'TI'),
+    '6983' => array('town' => 'Magliaso', 'canton' => 'TI'),
+    '6984' => array('town' => 'Pura', 'canton' => 'TI'),
+    '6987' => array('town' => 'Caslano', 'canton' => 'TI'),
+    '6988' => array('town' => 'Ponte Tresa', 'canton' => 'TI'),
+    '7000' => array('town' => 'Chur', 'canton' => 'GR'),
+    '7001' => array('town' => 'Chur', 'canton' => 'GR'),
+    '7002' => array('town' => 'Chur', 'canton' => 'GR'),
+    '7004' => array('town' => 'Chur', 'canton' => 'GR'),
+    '7006' => array('town' => 'Chur', 'canton' => 'GR'),
+    '7007' => array('town' => 'Chur', 'canton' => 'GR'),
+    '7012' => array('town' => 'Felsberg', 'canton' => 'GR'),
+    '7013' => array('town' => 'Domat/Ems', 'canton' => 'GR'),
+    '7015' => array('town' => 'Tamins', 'canton' => 'GR'),
+    '7017' => array('town' => 'Flims Dorf', 'canton' => 'GR'),
+    '7018' => array('town' => 'Flims Waldhaus', 'canton' => 'GR'),
+    '7023' => array('town' => 'Haldenstein', 'canton' => 'GR'),
+    '7026' => array('town' => 'Maladers', 'canton' => 'GR'),
+    '7031' => array('town' => 'Laax GR', 'canton' => 'GR'),
+    '7032' => array('town' => 'Laax GR 2', 'canton' => 'GR'),
+    '7050' => array('town' => 'Arosa', 'canton' => 'GR'),
+    '7062' => array('town' => 'Passugg-Araschgen', 'canton' => 'GR'),
+    '7063' => array('town' => 'Praden', 'canton' => 'GR'),
+    '7064' => array('town' => 'Tschiertschen', 'canton' => 'GR'),
+    '7074' => array('town' => 'Malix', 'canton' => 'GR'),
+    '7075' => array('town' => 'Churwalden', 'canton' => 'GR'),
+    '7076' => array('town' => 'Parpan', 'canton' => 'GR'),
+    '7077' => array('town' => 'Valbella', 'canton' => 'GR'),
+    '7078' => array('town' => 'Lenzerheide/Lai', 'canton' => 'GR'),
+    '7082' => array('town' => 'Vaz/Obervaz', 'canton' => 'GR'),
+    '7083' => array('town' => 'Lantsch/Lenz', 'canton' => 'GR'),
+    '7084' => array('town' => 'Brienz/Brinzauls', 'canton' => 'GR'),
+    '7014' => array('town' => 'Trin', 'canton' => 'GR'),
+    '7016' => array('town' => 'Trin Mulin', 'canton' => 'GR'),
+    '7019' => array('town' => 'Fidaz', 'canton' => 'GR'),
+    '7027' => array('town' => 'Lüen', 'canton' => 'GR'),
+    '7028' => array('town' => 'St. Peter', 'canton' => 'GR'),
+    '7056' => array('town' => 'Molinis', 'canton' => 'GR'),
+    '7029' => array('town' => 'Peist', 'canton' => 'GR'),
+    '7057' => array('town' => 'Langwies', 'canton' => 'GR'),
+    '7058' => array('town' => 'Litzirüti', 'canton' => 'GR'),
+    '7104' => array('town' => 'Versam', 'canton' => 'GR'),
+    '7106' => array('town' => 'Tenna', 'canton' => 'GR'),
+    '7107' => array('town' => 'Safien Platz', 'canton' => 'GR'),
+    '7109' => array('town' => 'Thalkirch', 'canton' => 'GR'),
+    '7122' => array('town' => 'Valendas', 'canton' => 'GR'),
+    '7126' => array('town' => 'Castrisch', 'canton' => 'GR'),
+    '7130' => array('town' => 'Ilanz', 'canton' => 'GR'),
+    '7154' => array('town' => 'Ruschein', 'canton' => 'GR'),
+    '7155' => array('town' => 'Ladir', 'canton' => 'GR'),
+    '7151' => array('town' => 'Schluein', 'canton' => 'GR'),
+    '7153' => array('town' => 'Falera', 'canton' => 'GR'),
+    '7152' => array('town' => 'Sagogn', 'canton' => 'GR'),
+    '7127' => array('town' => 'Sevgein', 'canton' => 'GR'),
+    '7128' => array('town' => 'Riein', 'canton' => 'GR'),
+    '7111' => array('town' => 'Pitasch', 'canton' => 'GR'),
+    '7112' => array('town' => 'Duvin', 'canton' => 'GR'),
+    '7113' => array('town' => 'Camuns', 'canton' => 'GR'),
+    '7114' => array('town' => 'Uors (Lumnezia)', 'canton' => 'GR'),
+    '7115' => array('town' => 'Surcasti', 'canton' => 'GR'),
+    '7116' => array('town' => 'Tersnaus', 'canton' => 'GR'),
+    '7141' => array('town' => 'Luven', 'canton' => 'GR'),
+    '7142' => array('town' => 'Cumbel', 'canton' => 'GR'),
+    '7143' => array('town' => 'Morissen', 'canton' => 'GR'),
+    '7144' => array('town' => 'Vella', 'canton' => 'GR'),
+    '7145' => array('town' => 'Degen', 'canton' => 'GR'),
+    '7146' => array('town' => 'Vattiz', 'canton' => 'GR'),
+    '7147' => array('town' => 'Vignogn', 'canton' => 'GR'),
+    '7148' => array('town' => 'Lumbrein', 'canton' => 'GR'),
+    '7149' => array('town' => 'Vrin', 'canton' => 'GR'),
+    '7137' => array('town' => 'Flond', 'canton' => 'GR'),
+    '7138' => array('town' => 'Surcuolm', 'canton' => 'GR'),
+    '7132' => array('town' => 'Vals', 'canton' => 'GR'),
+    '7133' => array('town' => 'Obersaxen Affeier', 'canton' => 'GR'),
+    '7134' => array('town' => 'Obersaxen Meierhof', 'canton' => 'GR'),
+    '7135' => array('town' => 'Obersaxen Giraniga', 'canton' => 'GR'),
+    '7136' => array('town' => 'Obers Friggahüs', 'canton' => 'GR'),
+    '7156' => array('town' => 'Pigniu', 'canton' => 'GR'),
+    '7157' => array('town' => 'Siat', 'canton' => 'GR'),
+    '7158' => array('town' => 'Waltensburg/Vuorz', 'canton' => 'GR'),
+    '7159' => array('town' => 'Andiast', 'canton' => 'GR'),
+    '7162' => array('town' => 'Tavanasa', 'canton' => 'GR'),
+    '7163' => array('town' => 'Danis', 'canton' => 'GR'),
+    '7164' => array('town' => 'Dardin', 'canton' => 'GR'),
+    '7165' => array('town' => 'Breil/Brigels', 'canton' => 'GR'),
+    '7166' => array('town' => 'Trun', 'canton' => 'GR'),
+    '7168' => array('town' => 'Schlans', 'canton' => 'GR'),
+    '7167' => array('town' => 'Zignau', 'canton' => 'GR'),
+    '7172' => array('town' => 'Rabius', 'canton' => 'GR'),
+    '7175' => array('town' => 'Sumvitg', 'canton' => 'GR'),
+    '7174' => array('town' => 'S. Benedetg', 'canton' => 'GR'),
+    '7180' => array('town' => 'Disentis/Mustér', 'canton' => 'GR'),
+    '7182' => array('town' => 'Cavardiras', 'canton' => 'GR'),
+    '7183' => array('town' => 'Mompé Medel', 'canton' => 'GR'),
+    '7184' => array('town' => 'Curaglia', 'canton' => 'GR'),
+    '7185' => array('town' => 'Platta', 'canton' => 'GR'),
+    '7186' => array('town' => 'Segnas', 'canton' => 'GR'),
+    '7187' => array('town' => 'Camischolas', 'canton' => 'GR'),
+    '7189' => array('town' => 'Rueras', 'canton' => 'GR'),
+    '7188' => array('town' => 'Sedrun', 'canton' => 'GR'),
+    '7173' => array('town' => 'Surrein', 'canton' => 'GR'),
+    '7176' => array('town' => 'Cumpadials', 'canton' => 'GR'),
+    '7201' => array('town' => 'Untervaz Bahnhof', 'canton' => 'GR'),
+    '7203' => array('town' => 'Trimmis', 'canton' => 'GR'),
+    '7202' => array('town' => 'Says', 'canton' => 'GR'),
+    '7204' => array('town' => 'Untervaz', 'canton' => 'GR'),
+    '7205' => array('town' => 'Zizers', 'canton' => 'GR'),
+    '7206' => array('town' => 'Igis', 'canton' => 'GR'),
+    '7208' => array('town' => 'Malans GR', 'canton' => 'GR'),
+    '7212' => array('town' => 'Seewis Dorf', 'canton' => 'GR'),
+    '7213' => array('town' => 'Valzeina', 'canton' => 'GR'),
+    '7214' => array('town' => 'Grüsch', 'canton' => 'GR'),
+    '7215' => array('town' => 'Fanas', 'canton' => 'GR'),
+    '7220' => array('town' => 'Schiers', 'canton' => 'GR'),
+    '7228' => array('town' => 'Schuders', 'canton' => 'GR'),
+    '7226' => array('town' => 'Stels', 'canton' => 'GR'),
+    '7222' => array('town' => 'Mittellunden', 'canton' => 'GR'),
+    '7223' => array('town' => 'Buchen', 'canton' => 'GR'),
+    '7224' => array('town' => 'Putz', 'canton' => 'GR'),
+    '7231' => array('town' => 'Pragg-Jenaz', 'canton' => 'GR'),
+    '7232' => array('town' => 'Furna', 'canton' => 'GR'),
+    '7233' => array('town' => 'Jenaz', 'canton' => 'GR'),
+    '7235' => array('town' => 'Fideris', 'canton' => 'GR'),
+    '7240' => array('town' => 'Küblis', 'canton' => 'GR'),
+    '7242' => array('town' => 'Luzein', 'canton' => 'GR'),
+    '7243' => array('town' => 'Pany', 'canton' => 'GR'),
+    '7244' => array('town' => 'Gadenstätt', 'canton' => 'GR'),
+    '7245' => array('town' => 'Ascharina', 'canton' => 'GR'),
+    '7246' => array('town' => 'St. Antönien', 'canton' => 'GR'),
+    '7241' => array('town' => 'Conters', 'canton' => 'GR'),
+    '7247' => array('town' => 'Saas im Prättigau', 'canton' => 'GR'),
+    '7249' => array('town' => 'Serneus', 'canton' => 'GR'),
+    '7250' => array('town' => 'Klosters', 'canton' => 'GR'),
+    '7252' => array('town' => 'Klosters Dorf', 'canton' => 'GR'),
+    '7260' => array('town' => 'Davos Dorf', 'canton' => 'GR'),
+    '7265' => array('town' => 'Davos Wolfgang', 'canton' => 'GR'),
+    '7270' => array('town' => 'Davos Platz', 'canton' => 'GR'),
+    '7272' => array('town' => 'Davos Clavadel', 'canton' => 'GR'),
+    '7276' => array('town' => 'Davos Frauenkirch', 'canton' => 'GR'),
+    '7277' => array('town' => 'Davos Glaris', 'canton' => 'GR'),
+    '7278' => array('town' => 'Davos Monstein', 'canton' => 'GR'),
+    '7302' => array('town' => 'Landquart', 'canton' => 'GR'),
+    '7303' => array('town' => 'Mastrils', 'canton' => 'GR'),
+    '7304' => array('town' => 'Maienfeld', 'canton' => 'GR'),
+    '7306' => array('town' => 'Fläsch', 'canton' => 'GR'),
+    '7307' => array('town' => 'Jenins', 'canton' => 'GR'),
+    '7310' => array('town' => 'Bad Ragaz', 'canton' => 'SG'),
+    '7317' => array('town' => 'Valens', 'canton' => 'SG'),
+    '7314' => array('town' => 'Vadura', 'canton' => 'SG'),
+    '7315' => array('town' => 'Vättis', 'canton' => 'SG'),
+    '7312' => array('town' => 'Pfäfers', 'canton' => 'SG'),
+    '7313' => array('town' => 'St. Margrethenberg', 'canton' => 'SG'),
+    '7320' => array('town' => 'Sargans', 'canton' => 'SG'),
+    '7325' => array('town' => 'Schwendi', 'canton' => 'SG'),
+    '7326' => array('town' => 'Weisstannen', 'canton' => 'SG'),
+    '7323' => array('town' => 'Wangs', 'canton' => 'SG'),
+    '7324' => array('town' => 'Vilters', 'canton' => 'SG'),
+    '7402' => array('town' => 'Bonaduz', 'canton' => 'GR'),
+    '7403' => array('town' => 'Rhäzüns', 'canton' => 'GR'),
+    '7404' => array('town' => 'Feldis/Veulden', 'canton' => 'GR'),
+    '7405' => array('town' => 'Rothenbrunnen', 'canton' => 'GR'),
+    '7408' => array('town' => 'Cazis', 'canton' => 'GR'),
+    '7411' => array('town' => 'Sils im Domleschg', 'canton' => 'GR'),
+    '7412' => array('town' => 'Scharans', 'canton' => 'GR'),
+    '7413' => array('town' => 'Fürstenaubruck', 'canton' => 'GR'),
+    '7414' => array('town' => 'Fürstenau', 'canton' => 'GR'),
+    '7415' => array('town' => 'Rodels', 'canton' => 'GR'),
+    '7416' => array('town' => 'Almens', 'canton' => 'GR'),
+    '7417' => array('town' => 'Paspels', 'canton' => 'GR'),
+    '7407' => array('town' => 'Trans', 'canton' => 'GR'),
+    '7418' => array('town' => 'Tumegl/Tomils', 'canton' => 'GR'),
+    '7419' => array('town' => 'Scheid', 'canton' => 'GR'),
+    '7430' => array('town' => 'Thusis', 'canton' => 'GR'),
+    '7425' => array('town' => 'Masein', 'canton' => 'GR'),
+    '7426' => array('town' => 'Flerden', 'canton' => 'GR'),
+    '7427' => array('town' => 'Urmein', 'canton' => 'GR'),
+    '7428' => array('town' => 'Tschappina', 'canton' => 'GR'),
+    '7421' => array('town' => 'Summaprada', 'canton' => 'GR'),
+    '7422' => array('town' => 'Tartar', 'canton' => 'GR'),
+    '7423' => array('town' => 'Sarn', 'canton' => 'GR'),
+    '7424' => array('town' => 'Präz', 'canton' => 'GR'),
+    '7431' => array('town' => 'Mutten', 'canton' => 'GR'),
+    '7432' => array('town' => 'Zillis', 'canton' => 'GR'),
+    '7433' => array('town' => 'Donat', 'canton' => 'GR'),
+    '7434' => array('town' => 'Sufers', 'canton' => 'GR'),
+    '7435' => array('town' => 'Splügen', 'canton' => 'GR'),
+    '7436' => array('town' => 'Medels', 'canton' => 'GR'),
+    '7437' => array('town' => 'Nufenen', 'canton' => 'GR'),
+    '7438' => array('town' => 'Hinterrhein', 'canton' => 'GR'),
+    '7440' => array('town' => 'Andeer', 'canton' => 'GR'),
+    '7442' => array('town' => 'Clugin', 'canton' => 'GR'),
+    '7443' => array('town' => 'Pignia', 'canton' => 'GR'),
+    '7444' => array('town' => 'Ausserferrera', 'canton' => 'GR'),
+    '7445' => array('town' => 'Innerferrera', 'canton' => 'GR'),
+    '7446' => array('town' => 'Campsut-Cröt', 'canton' => 'GR'),
+    '7447' => array('town' => 'Cresta (Avers)', 'canton' => 'GR'),
+    '7448' => array('town' => 'Juf', 'canton' => 'GR'),
+    '7450' => array('town' => 'Tiefencastel', 'canton' => 'GR'),
+    '7458' => array('town' => 'Mon', 'canton' => 'GR'),
+    '7459' => array('town' => 'Stierva', 'canton' => 'GR'),
+    '7451' => array('town' => 'Alvaschein', 'canton' => 'GR'),
+    '7452' => array('town' => 'Cunter', 'canton' => 'GR'),
+    '7453' => array('town' => 'Tinizong', 'canton' => 'GR'),
+    '7454' => array('town' => 'Rona', 'canton' => 'GR'),
+    '7455' => array('town' => 'Mulegns', 'canton' => 'GR'),
+    '7456' => array('town' => 'Sur', 'canton' => 'GR'),
+    '7457' => array('town' => 'Bivio', 'canton' => 'GR'),
+    '7460' => array('town' => 'Savognin', 'canton' => 'GR'),
+    '7462' => array('town' => 'Salouf', 'canton' => 'GR'),
+    '7463' => array('town' => 'Riom', 'canton' => 'GR'),
+    '7464' => array('town' => 'Parsonz', 'canton' => 'GR'),
+    '7472' => array('town' => 'Surava', 'canton' => 'GR'),
+    '7473' => array('town' => 'Alvaneu Bad', 'canton' => 'GR'),
+    '7477' => array('town' => 'Filisur', 'canton' => 'GR'),
+    '7482' => array('town' => 'Bergün/Bravuogn', 'canton' => 'GR'),
+    '7484' => array('town' => 'Latsch', 'canton' => 'GR'),
+    '7492' => array('town' => 'Alvaneu Dorf', 'canton' => 'GR'),
+    '7493' => array('town' => 'Schmitten (Albula)', 'canton' => 'GR'),
+    '7494' => array('town' => 'Davos Wiesen', 'canton' => 'GR'),
+    '7500' => array('town' => 'St. Moritz', 'canton' => 'GR'),
+    '7502' => array('town' => 'Bever', 'canton' => 'GR'),
+    '7503' => array('town' => 'Samedan', 'canton' => 'GR'),
+    '7504' => array('town' => 'Pontresina', 'canton' => 'GR'),
+    '7505' => array('town' => 'Celerina', 'canton' => 'GR'),
+    '7512' => array('town' => 'Champfèr', 'canton' => 'GR'),
+    '7513' => array('town' => 'Silvaplana', 'canton' => 'GR'),
+    '7514' => array('town' => 'Sils/Segl Maria', 'canton' => 'GR'),
+    '7515' => array('town' => 'Sils/Segl Baselgia', 'canton' => 'GR'),
+    '7516' => array('town' => 'Maloja', 'canton' => 'GR'),
+    '7517' => array('town' => 'Plaun da Lej', 'canton' => 'GR'),
+    '7522' => array('town' => 'La Punt-Chamues-ch', 'canton' => 'GR'),
+    '7523' => array('town' => 'Madulain', 'canton' => 'GR'),
+    '7524' => array('town' => 'Zuoz', 'canton' => 'GR'),
+    '7525' => array('town' => 'S-chanf', 'canton' => 'GR'),
+    '7526' => array('town' => 'Cinuos-chel', 'canton' => 'GR'),
+    '7527' => array('town' => 'Brail', 'canton' => 'GR'),
+    '7530' => array('town' => 'Zernez', 'canton' => 'GR'),
+    '7532' => array('town' => 'Tschierv', 'canton' => 'GR'),
+    '7533' => array('town' => 'Fuldera', 'canton' => 'GR'),
+    '7534' => array('town' => 'Lü', 'canton' => 'GR'),
+    '7535' => array('town' => 'Valchava', 'canton' => 'GR'),
+    '7536' => array('town' => 'Sta. Maria V. M.', 'canton' => 'GR'),
+    '7537' => array('town' => 'Müstair', 'canton' => 'GR'),
+    '7542' => array('town' => 'Susch', 'canton' => 'GR'),
+    '7543' => array('town' => 'Lavin', 'canton' => 'GR'),
+    '7545' => array('town' => 'Guarda', 'canton' => 'GR'),
+    '7546' => array('town' => 'Ardez', 'canton' => 'GR'),
+    '7550' => array('town' => 'Scuol', 'canton' => 'GR'),
+    '7551' => array('town' => 'Ftan', 'canton' => 'GR'),
+    '7552' => array('town' => 'Vulpera', 'canton' => 'GR'),
+    '7553' => array('town' => 'Tarasp', 'canton' => 'GR'),
+    '7554' => array('town' => 'Sent', 'canton' => 'GR'),
+    '7556' => array('town' => 'Ramosch', 'canton' => 'GR'),
+    '7557' => array('town' => 'Vnà', 'canton' => 'GR'),
+    '7558' => array('town' => 'Strada', 'canton' => 'GR'),
+    '7559' => array('town' => 'Tschlin', 'canton' => 'GR'),
+    '7560' => array('town' => 'Martina', 'canton' => 'GR'),
+    '7562' => array('town' => 'Samnaun-Compatsch', 'canton' => 'GR'),
+    '7563' => array('town' => 'Samnaun Dorf', 'canton' => 'GR'),
+    '7602' => array('town' => 'Casaccia', 'canton' => 'GR'),
+    '7603' => array('town' => 'Vicosoprano', 'canton' => 'GR'),
+    '7604' => array('town' => 'Borgonovo', 'canton' => 'GR'),
+    '7605' => array('town' => 'Stampa', 'canton' => 'GR'),
+    '7606' => array('town' => 'Promontogno', 'canton' => 'GR'),
+    '7610' => array('town' => 'Soglio', 'canton' => 'GR'),
+    '7608' => array('town' => 'Castasegna', 'canton' => 'GR'),
+    '7742' => array('town' => 'Poschiavo', 'canton' => 'GR'),
+    '7743' => array('town' => 'Brusio', 'canton' => 'GR'),
+    '7747' => array('town' => 'Viano', 'canton' => 'GR'),
+    '7744' => array('town' => 'Campocologno', 'canton' => 'GR'),
+    '7710' => array('town' => 'Ospizio Bernina', 'canton' => 'GR'),
+    '7741' => array('town' => 'S. Carlo GR', 'canton' => 'GR'),
+    '7745' => array('town' => 'Li Curt', 'canton' => 'GR'),
+    '7746' => array('town' => 'Le Prese', 'canton' => 'GR'),
+    '7748' => array('town' => 'Campascio', 'canton' => 'GR'),
+    '8000' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8001' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8002' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8003' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8004' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8005' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8006' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8008' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8010' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8020' => array('town' => 'Zürich 1', 'canton' => 'ZH'),
+    '8016' => array('town' => 'Zürich 16 Zust', 'canton' => 'ZH'),
+    '8080' => array('town' => 'Zürich 80', 'canton' => 'ZH'),
+    '8021' => array('town' => 'Zürich 1 Sihlpost', 'canton' => 'ZH'),
+    '8022' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8023' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8024' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8026' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8027' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8030' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8031' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8032' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8033' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8034' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8036' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8037' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8038' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8039' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8040' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8041' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8042' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8044' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8045' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8046' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8047' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8048' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8049' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8050' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8051' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8052' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8053' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8055' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8057' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8058' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8061' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8063' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8064' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8065' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8088' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8090' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8091' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8092' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8093' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8099' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8102' => array('town' => 'Oberengstringen', 'canton' => 'ZH'),
+    '8103' => array('town' => 'Unterengstringen', 'canton' => 'ZH'),
+    '8104' => array('town' => 'Weiningen ZH', 'canton' => 'ZH'),
+    '8105' => array('town' => 'Regensdorf', 'canton' => 'ZH'),
+    '8107' => array('town' => 'Buchs ZH', 'canton' => 'ZH'),
+    '8108' => array('town' => 'Dällikon', 'canton' => 'ZH'),
+    '8112' => array('town' => 'Otelfingen', 'canton' => 'ZH'),
+    '8113' => array('town' => 'Boppelsen', 'canton' => 'ZH'),
+    '8114' => array('town' => 'Dänikon ZH', 'canton' => 'ZH'),
+    '8115' => array('town' => 'Hüttikon', 'canton' => 'ZH'),
+    '5436' => array('town' => 'Würenlos', 'canton' => 'AG'),
+    '8117' => array('town' => 'Fällanden', 'canton' => 'ZH'),
+    '8121' => array('town' => 'Benglen', 'canton' => 'ZH'),
+    '8122' => array('town' => 'Binz', 'canton' => 'ZH'),
+    '8123' => array('town' => 'Ebmatingen', 'canton' => 'ZH'),
+    '8124' => array('town' => 'Maur', 'canton' => 'ZH'),
+    '8125' => array('town' => 'Zollikerberg', 'canton' => 'ZH'),
+    '8126' => array('town' => 'Zumikon', 'canton' => 'ZH'),
+    '8127' => array('town' => 'Forch', 'canton' => 'ZH'),
+    '8132' => array('town' => 'Hinteregg', 'canton' => 'ZH'),
+    '8133' => array('town' => 'Esslingen', 'canton' => 'ZH'),
+    '8134' => array('town' => 'Adliswil', 'canton' => 'ZH'),
+    '8135' => array('town' => 'Langnau am Albis', 'canton' => 'ZH'),
+    '8136' => array('town' => 'Gattikon', 'canton' => 'ZH'),
+    '8143' => array('town' => 'Uetliberg', 'canton' => 'ZH'),
+    '8142' => array('town' => 'Uitikon Waldegg', 'canton' => 'ZH'),
+    '8152' => array('town' => 'Glattbrugg', 'canton' => 'ZH'),
+    '8153' => array('town' => 'Rümlang', 'canton' => 'ZH'),
+    '8154' => array('town' => 'Oberglatt ZH', 'canton' => 'ZH'),
+    '8155' => array('town' => 'Niederhasli', 'canton' => 'ZH'),
+    '8156' => array('town' => 'Oberhasli', 'canton' => 'ZH'),
+    '8157' => array('town' => 'Dielsdorf', 'canton' => 'ZH'),
+    '8158' => array('town' => 'Regensberg', 'canton' => 'ZH'),
+    '8162' => array('town' => 'Steinmaur', 'canton' => 'ZH'),
+    '8164' => array('town' => 'Bachs', 'canton' => 'ZH'),
+    '8165' => array('town' => 'Schöfflisdorf', 'canton' => 'ZH'),
+    '8166' => array('town' => 'Niederweningen', 'canton' => 'ZH'),
+    '8172' => array('town' => 'Niederglatt ZH', 'canton' => 'ZH'),
+    '8173' => array('town' => 'Neerach', 'canton' => 'ZH'),
+    '8174' => array('town' => 'Stadel', 'canton' => 'ZH'),
+    '8175' => array('town' => 'Windlach', 'canton' => 'ZH'),
+    '8180' => array('town' => 'Bülach', 'canton' => 'ZH'),
+    '8181' => array('town' => 'Höri', 'canton' => 'ZH'),
+    '8182' => array('town' => 'Hochfelden', 'canton' => 'ZH'),
+    '8184' => array('town' => 'Bachenbülach', 'canton' => 'ZH'),
+    '8185' => array('town' => 'Winkel', 'canton' => 'ZH'),
+    '8192' => array('town' => 'Glattfelden', 'canton' => 'ZH'),
+    '8193' => array('town' => 'Eglisau', 'canton' => 'ZH'),
+    '8194' => array('town' => 'Hüntwangen', 'canton' => 'ZH'),
+    '8195' => array('town' => 'Wasterkingen', 'canton' => 'ZH'),
+    '8196' => array('town' => 'Wil ZH', 'canton' => 'ZH'),
+    '8197' => array('town' => 'Rafz', 'canton' => 'ZH'),
+    '8200' => array('town' => 'Schaffhausen', 'canton' => 'SH'),
+    '8201' => array('town' => 'Schaffhausen', 'canton' => 'SH'),
+    '8202' => array('town' => 'Schaffhausen', 'canton' => 'SH'),
+    '8203' => array('town' => 'Schaffhausen', 'canton' => 'SH'),
+    '8204' => array('town' => 'Schaffhausen', 'canton' => 'SH'),
+    '8205' => array('town' => 'Schaffhausen', 'canton' => 'SH'),
+    '8207' => array('town' => 'Schaffhausen', 'canton' => 'SH'),
+    '8208' => array('town' => 'Schaffhausen', 'canton' => 'SH'),
+    '8219' => array('town' => 'Trasadingen', 'canton' => 'SH'),
+    '8228' => array('town' => 'Beggingen', 'canton' => 'SH'),
+    '8231' => array('town' => 'Hemmental', 'canton' => 'SH'),
+    '8234' => array('town' => 'Stetten SH', 'canton' => 'SH'),
+    '8235' => array('town' => 'Lohn SH', 'canton' => 'SH'),
+    '8236' => array('town' => 'Opfertshofen SH', 'canton' => 'SH'),
+    '8242' => array('town' => 'Bibern SH', 'canton' => 'SH'),
+    '8243' => array('town' => 'Altdorf SH', 'canton' => 'SH'),
+    '8239' => array('town' => 'Dörflingen', 'canton' => 'SH'),
+    '8212' => array('town' => 'Neuhausen', 'canton' => 'SH'),
+    '8213' => array('town' => 'Neunkirch', 'canton' => 'SH'),
+    '8214' => array('town' => 'Gächlingen', 'canton' => 'SH'),
+    '8215' => array('town' => 'Hallau', 'canton' => 'SH'),
+    '8216' => array('town' => 'Oberhallau', 'canton' => 'SH'),
+    '8217' => array('town' => 'Wilchingen', 'canton' => 'SH'),
+    '8218' => array('town' => 'Osterfingen', 'canton' => 'SH'),
+    '8222' => array('town' => 'Beringen', 'canton' => 'SH'),
+    '8223' => array('town' => 'Guntmadingen', 'canton' => 'SH'),
+    '8224' => array('town' => 'Löhningen', 'canton' => 'SH'),
+    '8225' => array('town' => 'Siblingen', 'canton' => 'SH'),
+    '8226' => array('town' => 'Schleitheim', 'canton' => 'SH'),
+    '8232' => array('town' => 'Merishausen', 'canton' => 'SH'),
+    '8233' => array('town' => 'Bargen SH', 'canton' => 'SH'),
+    '8240' => array('town' => 'Thayngen', 'canton' => 'SH'),
+    '8241' => array('town' => 'Barzheim', 'canton' => 'SH'),
+    '8245' => array('town' => 'Feuerthalen', 'canton' => 'ZH'),
+    '8246' => array('town' => 'Langwiesen', 'canton' => 'ZH'),
+    '8247' => array('town' => 'Flurlingen', 'canton' => 'ZH'),
+    '8252' => array('town' => 'Schlatt TG', 'canton' => 'TG'),
+    '8254' => array('town' => 'Basadingen', 'canton' => 'TG'),
+    '8259' => array('town' => 'Kaltenbach', 'canton' => 'TG'),
+    '8253' => array('town' => 'Diessenhofen', 'canton' => 'TG'),
+    '8255' => array('town' => 'Schlattingen', 'canton' => 'TG'),
+    '8260' => array('town' => 'Stein am Rhein', 'canton' => 'SH'),
+    '8261' => array('town' => 'Hemishofen', 'canton' => 'SH'),
+    '8262' => array('town' => 'Ramsen', 'canton' => 'SH'),
+    '8263' => array('town' => 'Buch SH', 'canton' => 'SH'),
+    '8264' => array('town' => 'Eschenz', 'canton' => 'TG'),
+    '8265' => array('town' => 'Mammern', 'canton' => 'TG'),
+    '8266' => array('town' => 'Steckborn', 'canton' => 'TG'),
+    '8267' => array('town' => 'Berlingen', 'canton' => 'TG'),
+    '8268' => array('town' => 'Mannenbach-Salenst', 'canton' => 'TG'),
+    '8272' => array('town' => 'Ermatingen', 'canton' => 'TG'),
+    '8273' => array('town' => 'Triboltingen', 'canton' => 'TG'),
+    '8274' => array('town' => 'Tägerwilen', 'canton' => 'TG'),
+    '8280' => array('town' => 'Kreuzlingen', 'canton' => 'TG'),
+    '8301' => array('town' => 'Glattzentrum', 'canton' => 'ZH'),
+    '8302' => array('town' => 'Kloten', 'canton' => 'ZH'),
+    '8303' => array('town' => 'Bassersdorf', 'canton' => 'ZH'),
+    '8304' => array('town' => 'Wallisellen', 'canton' => 'ZH'),
+    '8305' => array('town' => 'Dietlikon', 'canton' => 'ZH'),
+    '8306' => array('town' => 'Brüttisellen', 'canton' => 'ZH'),
+    '8307' => array('town' => 'Effretikon', 'canton' => 'ZH'),
+    '8315' => array('town' => 'Lindau', 'canton' => 'ZH'),
+    '8308' => array('town' => 'Illnau', 'canton' => 'ZH'),
+    '8309' => array('town' => 'Nürensdorf', 'canton' => 'ZH'),
+    '8310' => array('town' => 'Kemptthal', 'canton' => 'ZH'),
+    '8312' => array('town' => 'Winterberg ZH', 'canton' => 'ZH'),
+    '8311' => array('town' => 'Brütten', 'canton' => 'ZH'),
+    '8314' => array('town' => 'Kyburg', 'canton' => 'ZH'),
+    '8130' => array('town' => 'Zumikon Y. Rocher', 'canton' => 'ZH'),
+    '8320' => array('town' => 'Fehraltorf', 'canton' => 'ZH'),
+    '8489' => array('town' => 'Wildberg', 'canton' => 'ZH'),
+    '8322' => array('town' => 'Madetswil', 'canton' => 'ZH'),
+    '8330' => array('town' => 'Pfäffikon ZH', 'canton' => 'ZH'),
+    '8331' => array('town' => 'Auslikon', 'canton' => 'ZH'),
+    '8332' => array('town' => 'Russikon', 'canton' => 'ZH'),
+    '8335' => array('town' => 'Hittnau', 'canton' => 'ZH'),
+    '8340' => array('town' => 'Hinwil', 'canton' => 'ZH'),
+    '8342' => array('town' => 'Wernetshausen', 'canton' => 'ZH'),
+    '8344' => array('town' => 'Bäretswil', 'canton' => 'ZH'),
+    '8345' => array('town' => 'Adetswil', 'canton' => 'ZH'),
+    '8352' => array('town' => 'Elsau', 'canton' => 'ZH'),
+    '8353' => array('town' => 'Elgg', 'canton' => 'ZH'),
+    '8354' => array('town' => 'Hofstetten ZH', 'canton' => 'ZH'),
+    '8355' => array('town' => 'Aadorf', 'canton' => 'TG'),
+    '8356' => array('town' => 'Ettenhausen TG', 'canton' => 'TG'),
+    '8357' => array('town' => 'Guntershausen', 'canton' => 'TG'),
+    '8360' => array('town' => 'Eschlikon TG', 'canton' => 'TG'),
+    '8362' => array('town' => 'Balterswil', 'canton' => 'TG'),
+    '8363' => array('town' => 'Bichelsee', 'canton' => 'TG'),
+    '8370' => array('town' => 'Sirnach', 'canton' => 'TG'),
+    '8372' => array('town' => 'Wiezikon b.Sirnach', 'canton' => 'TG'),
+    '8374' => array('town' => 'Oberwangen TG', 'canton' => 'TG'),
+    '8376' => array('town' => 'Fischingen', 'canton' => 'TG'),
+    '8400' => array('town' => 'Winterthur', 'canton' => 'ZH'),
+    '8401' => array('town' => 'Winterthur', 'canton' => 'ZH'),
+    '8402' => array('town' => 'Winterthur', 'canton' => 'ZH'),
+    '8404' => array('town' => 'Winterthur', 'canton' => 'ZH'),
+    '8405' => array('town' => 'Winterthur', 'canton' => 'ZH'),
+    '8406' => array('town' => 'Winterthur', 'canton' => 'ZH'),
+    '8408' => array('town' => 'Winterthur', 'canton' => 'ZH'),
+    '8409' => array('town' => 'Winterthur', 'canton' => 'ZH'),
+    '8410' => array('town' => 'Winterthur', 'canton' => 'ZH'),
+    '8411' => array('town' => 'Winterthur', 'canton' => 'ZH'),
+    '8412' => array('town' => 'Aesch (Neftenbach)', 'canton' => 'ZH'),
+    '8413' => array('town' => 'Neftenbach', 'canton' => 'ZH'),
+    '8414' => array('town' => 'Buch am Irchel', 'canton' => 'ZH'),
+    '8415' => array('town' => 'Berg am Irchel', 'canton' => 'ZH'),
+    '8416' => array('town' => 'Flaach', 'canton' => 'ZH'),
+    '8418' => array('town' => 'Schlatt', 'canton' => 'ZH'),
+    '8422' => array('town' => 'Pfungen', 'canton' => 'ZH'),
+    '8421' => array('town' => 'Dättlikon', 'canton' => 'ZH'),
+    '8423' => array('town' => 'Embrach-Embraport', 'canton' => 'ZH'),
+    '8424' => array('town' => 'Embrach', 'canton' => 'ZH'),
+    '8425' => array('town' => 'Oberembrach', 'canton' => 'ZH'),
+    '8426' => array('town' => 'Lufingen', 'canton' => 'ZH'),
+    '8427' => array('town' => 'Rorbas-Freienstein', 'canton' => 'ZH'),
+    '8428' => array('town' => 'Teufen ZH', 'canton' => 'ZH'),
+    '8187' => array('town' => 'Weiach', 'canton' => 'ZH'),
+    '5466' => array('town' => 'Kaiserstuhl AG', 'canton' => 'AG'),
+    '5467' => array('town' => 'Fisibach', 'canton' => 'AG'),
+    '5332' => array('town' => 'Rekingen AG', 'canton' => 'AG'),
+    '5330' => array('town' => 'Bad Zurzach', 'canton' => 'AG'),
+    '5323' => array('town' => 'Rietheim', 'canton' => 'AG'),
+    '5464' => array('town' => 'Rümikon AG', 'canton' => 'AG'),
+    '5465' => array('town' => 'Mellikon', 'canton' => 'AG'),
+    '5463' => array('town' => 'Wislikofen', 'canton' => 'AG'),
+    '5462' => array('town' => 'Siglistorf', 'canton' => 'AG'),
+    '5333' => array('town' => 'Baldingen', 'canton' => 'AG'),
+    '5334' => array('town' => 'Böbikon', 'canton' => 'AG'),
+    '8442' => array('town' => 'Hettlingen', 'canton' => 'ZH'),
+    '8444' => array('town' => 'Henggart', 'canton' => 'ZH'),
+    '8447' => array('town' => 'Dachsen', 'canton' => 'ZH'),
+    '8248' => array('town' => 'Uhwiesen', 'canton' => 'ZH'),
+    '8450' => array('town' => 'Andelfingen', 'canton' => 'ZH'),
+    '8453' => array('town' => 'Alten', 'canton' => 'ZH'),
+    '8451' => array('town' => 'Kleinandelfingen', 'canton' => 'ZH'),
+    '8452' => array('town' => 'Adlikon', 'canton' => 'ZH'),
+    '8457' => array('town' => 'Humlikon', 'canton' => 'ZH'),
+    '8458' => array('town' => 'Dorf', 'canton' => 'ZH'),
+    '8459' => array('town' => 'Volken', 'canton' => 'ZH'),
+    '8454' => array('town' => 'Buchberg', 'canton' => 'SH'),
+    '8455' => array('town' => 'Rüdlingen', 'canton' => 'SH'),
+    '8460' => array('town' => 'Marthalen', 'canton' => 'ZH'),
+    '8464' => array('town' => 'Ellikon am Rhein', 'canton' => 'ZH'),
+    '8461' => array('town' => 'Oerlingen', 'canton' => 'ZH'),
+    '8465' => array('town' => 'Rudolfingen', 'canton' => 'ZH'),
+    '8466' => array('town' => 'Trüllikon', 'canton' => 'ZH'),
+    '8462' => array('town' => 'Rheinau', 'canton' => 'ZH'),
+    '8463' => array('town' => 'Benken ZH', 'canton' => 'ZH'),
+    '8472' => array('town' => 'Seuzach', 'canton' => 'ZH'),
+    '8474' => array('town' => 'Dinhard', 'canton' => 'ZH'),
+    '8475' => array('town' => 'Ossingen', 'canton' => 'ZH'),
+    '8476' => array('town' => 'Unterstammheim', 'canton' => 'ZH'),
+    '8477' => array('town' => 'Oberstammheim', 'canton' => 'ZH'),
+    '8471' => array('town' => 'Rutschwil', 'canton' => 'ZH'),
+    '8478' => array('town' => 'Thalheim', 'canton' => 'ZH'),
+    '8479' => array('town' => 'Altikon', 'canton' => 'ZH'),
+    '8467' => array('town' => 'Truttikon', 'canton' => 'ZH'),
+    '8468' => array('town' => 'Guntalingen', 'canton' => 'ZH'),
+    '8482' => array('town' => 'Sennhof', 'canton' => 'ZH'),
+    '8483' => array('town' => 'Kollbrunn', 'canton' => 'ZH'),
+    '8484' => array('town' => 'Weisslingen', 'canton' => 'ZH'),
+    '8486' => array('town' => 'Rikon im Tösstal', 'canton' => 'ZH'),
+    '8487' => array('town' => 'Rämismühle', 'canton' => 'ZH'),
+    '8488' => array('town' => 'Turbenthal', 'canton' => 'ZH'),
+    '8492' => array('town' => 'Wila', 'canton' => 'ZH'),
+    '8493' => array('town' => 'Saland', 'canton' => 'ZH'),
+    '8494' => array('town' => 'Bauma', 'canton' => 'ZH'),
+    '8496' => array('town' => 'Steg im Tösstal', 'canton' => 'ZH'),
+    '8497' => array('town' => 'Fischenthal', 'canton' => 'ZH'),
+    '8498' => array('town' => 'Gibswil-Ried', 'canton' => 'ZH'),
+    '8495' => array('town' => 'Schmidrüti', 'canton' => 'ZH'),
+    '8499' => array('town' => 'Sternenberg', 'canton' => 'ZH'),
+    '8500' => array('town' => 'Frauenfeld', 'canton' => 'TG'),
+    '8501' => array('town' => 'Frauenfeld', 'canton' => 'TG'),
+    '8502' => array('town' => 'Frauenfeld', 'canton' => 'TG'),
+    '8503' => array('town' => 'Frauenfeld', 'canton' => 'TG'),
+    '8505' => array('town' => 'Pfyn', 'canton' => 'TG'),
+    '8506' => array('town' => 'Lanzenneunforn', 'canton' => 'TG'),
+    '8507' => array('town' => 'Hörhausen', 'canton' => 'TG'),
+    '8508' => array('town' => 'Homburg', 'canton' => 'TG'),
+    '8512' => array('town' => 'Thundorf', 'canton' => 'TG'),
+    '8514' => array('town' => 'Amlikon-Bissegg', 'canton' => 'TG'),
+    '8522' => array('town' => 'Häuslenen', 'canton' => 'TG'),
+    '8523' => array('town' => 'Hagenbuch ZH', 'canton' => 'ZH'),
+    '8524' => array('town' => 'Uesslingen', 'canton' => 'TG'),
+    '8525' => array('town' => 'Niederneunforn', 'canton' => 'TG'),
+    '8526' => array('town' => 'Oberneunforn', 'canton' => 'TG'),
+    '8532' => array('town' => 'Warth', 'canton' => 'TG'),
+    '8535' => array('town' => 'Herdern', 'canton' => 'TG'),
+    '8536' => array('town' => 'Hüttwilen', 'canton' => 'TG'),
+    '8537' => array('town' => 'Nussbaumen TG', 'canton' => 'TG'),
+    '8542' => array('town' => 'Wiesendangen', 'canton' => 'ZH'),
+    '8545' => array('town' => 'Rickenbach ZH', 'canton' => 'ZH'),
+    '8544' => array('town' => 'Attikon', 'canton' => 'ZH'),
+    '8546' => array('town' => 'Islikon', 'canton' => 'TG'),
+    '8547' => array('town' => 'Gachnang', 'canton' => 'TG'),
+    '8548' => array('town' => 'Ellikon a d Thur', 'canton' => 'ZH'),
+    '8552' => array('town' => 'Felben-Wellhausen', 'canton' => 'TG'),
+    '8553' => array('town' => 'Hüttlingen-Mettdf', 'canton' => 'TG'),
+    '8554' => array('town' => 'Müllheim-Wigoltgn', 'canton' => 'TG'),
+    '8555' => array('town' => 'Müllheim Dorf', 'canton' => 'TG'),
+    '8556' => array('town' => 'Wigoltingen', 'canton' => 'TG'),
+    '8564' => array('town' => 'Lipperswil', 'canton' => 'TG'),
+    '8558' => array('town' => 'Raperswilen', 'canton' => 'TG'),
+    '8269' => array('town' => 'Fruthwilen', 'canton' => 'TG'),
+    '8560' => array('town' => 'Märstetten', 'canton' => 'TG'),
+    '8561' => array('town' => 'Ottoberg', 'canton' => 'TG'),
+    '8565' => array('town' => 'Hugelshofen', 'canton' => 'TG'),
+    '8566' => array('town' => 'Dotnacht', 'canton' => 'TG'),
+    '8570' => array('town' => 'Weinfelden', 'canton' => 'TG'),
+    '8572' => array('town' => 'Berg TG', 'canton' => 'TG'),
+    '8573' => array('town' => 'Siegershausen', 'canton' => 'TG'),
+    '8574' => array('town' => 'Lengwil-Oberhofen', 'canton' => 'TG'),
+    '8575' => array('town' => 'Bürglen TG', 'canton' => 'TG'),
+    '8576' => array('town' => 'Mauren TG', 'canton' => 'TG'),
+    '8577' => array('town' => 'Schönholzerswilen', 'canton' => 'TG'),
+    '9217' => array('town' => 'Neukirch', 'canton' => 'TG'),
+    '8580' => array('town' => 'Amriswil', 'canton' => 'TG'),
+    '8582' => array('town' => 'Dozwil', 'canton' => 'TG'),
+    '8581' => array('town' => 'Schocherswil', 'canton' => 'TG'),
+    '8588' => array('town' => 'Zihlschlacht', 'canton' => 'TG'),
+    '8589' => array('town' => 'Sitterdorf', 'canton' => 'TG'),
+    '8583' => array('town' => 'Sulgen', 'canton' => 'TG'),
+    '8584' => array('town' => 'Leimbach TG', 'canton' => 'TG'),
+    '8585' => array('town' => 'Mattwil', 'canton' => 'TG'),
+    '8586' => array('town' => 'Erlen', 'canton' => 'TG'),
+    '8587' => array('town' => 'Oberaach', 'canton' => 'TG'),
+    '8590' => array('town' => 'Romanshorn', 'canton' => 'TG'),
+    '8599' => array('town' => 'Salmsach', 'canton' => 'TG'),
+    '8592' => array('town' => 'Uttwil', 'canton' => 'TG'),
+    '8593' => array('town' => 'Kesswil', 'canton' => 'TG'),
+    '8594' => array('town' => 'Güttingen', 'canton' => 'TG'),
+    '8595' => array('town' => 'Altnau', 'canton' => 'TG'),
+    '8596' => array('town' => 'Scherzingen', 'canton' => 'TG'),
+    '8597' => array('town' => 'Landschlacht', 'canton' => 'TG'),
+    '8598' => array('town' => 'Bottighofen', 'canton' => 'TG'),
+    '8600' => array('town' => 'Dübendorf', 'canton' => 'ZH'),
+    '8602' => array('town' => 'Wangen ZH', 'canton' => 'ZH'),
+    '8603' => array('town' => 'Schwerzenbach', 'canton' => 'ZH'),
+    '8604' => array('town' => 'Volketswil', 'canton' => 'ZH'),
+    '8605' => array('town' => 'Gutenswil', 'canton' => 'ZH'),
+    '8606' => array('town' => 'Nänikon', 'canton' => 'ZH'),
+    '8607' => array('town' => 'Aathal-Seegräben', 'canton' => 'ZH'),
+    '8608' => array('town' => 'Bubikon', 'canton' => 'ZH'),
+    '8610' => array('town' => 'Uster', 'canton' => 'ZH'),
+    '8612' => array('town' => 'Uster 2', 'canton' => 'ZH'),
+    '8613' => array('town' => 'Uster 3', 'canton' => 'ZH'),
+    '8614' => array('town' => 'Bertschikon Gossau', 'canton' => 'ZH'),
+    '8615' => array('town' => 'Wermatswil', 'canton' => 'ZH'),
+    '8616' => array('town' => 'Riedikon', 'canton' => 'ZH'),
+    '8617' => array('town' => 'Mönchaltorf', 'canton' => 'ZH'),
+    '8618' => array('town' => 'Oetwil am See', 'canton' => 'ZH'),
+    '8620' => array('town' => 'Wetzikon ZH', 'canton' => 'ZH'),
+    '8621' => array('town' => 'Wetzikon ZH 4', 'canton' => 'ZH'),
+    '8622' => array('town' => 'Wetzikon ZH', 'canton' => 'ZH'),
+    '8623' => array('town' => 'Wetzikon ZH', 'canton' => 'ZH'),
+    '8624' => array('town' => 'Grüt (Gossau ZH)', 'canton' => 'ZH'),
+    '8625' => array('town' => 'Gossau ZH', 'canton' => 'ZH'),
+    '8626' => array('town' => 'Ottikon', 'canton' => 'ZH'),
+    '8627' => array('town' => 'Grüningen', 'canton' => 'ZH'),
+    '8630' => array('town' => 'Rüti ZH', 'canton' => 'ZH'),
+    '8632' => array('town' => 'Tann', 'canton' => 'ZH'),
+    '8633' => array('town' => 'Wolfhausen', 'canton' => 'ZH'),
+    '8634' => array('town' => 'Hombrechtikon', 'canton' => 'ZH'),
+    '8635' => array('town' => 'Dürnten', 'canton' => 'ZH'),
+    '8636' => array('town' => 'Wald ZH', 'canton' => 'ZH'),
+    '8639' => array('town' => 'Faltigberg', 'canton' => 'ZH'),
+    '8637' => array('town' => 'Laupen ZH', 'canton' => 'ZH'),
+    '8638' => array('town' => 'Goldingen', 'canton' => 'SG'),
+    '8640' => array('town' => 'Rapperswil SG', 'canton' => 'SG'),
+    '8645' => array('town' => 'Jona', 'canton' => 'SG'),
+    '8646' => array('town' => 'Wagen', 'canton' => 'SG'),
+    '8700' => array('town' => 'Küsnacht ZH', 'canton' => 'ZH'),
+    '8702' => array('town' => 'Zollikon', 'canton' => 'ZH'),
+    '8703' => array('town' => 'Erlenbach ZH', 'canton' => 'ZH'),
+    '8704' => array('town' => 'Herrliberg', 'canton' => 'ZH'),
+    '8706' => array('town' => 'Meilen', 'canton' => 'ZH'),
+    '8707' => array('town' => 'Uetikon am See', 'canton' => 'ZH'),
+    '8708' => array('town' => 'Männedorf', 'canton' => 'ZH'),
+    '8712' => array('town' => 'Stäfa', 'canton' => 'ZH'),
+    '8713' => array('town' => 'Uerikon', 'canton' => 'ZH'),
+    '8714' => array('town' => 'Feldbach', 'canton' => 'ZH'),
+    '8715' => array('town' => 'Bollingen', 'canton' => 'SG'),
+    '8716' => array('town' => 'Schmerikon', 'canton' => 'SG'),
+    '8717' => array('town' => 'Benken SG', 'canton' => 'SG'),
+    '8718' => array('town' => 'Schänis', 'canton' => 'SG'),
+    '8722' => array('town' => 'Kaltbrunn', 'canton' => 'SG'),
+    '8723' => array('town' => 'Rufi', 'canton' => 'SG'),
+    '8725' => array('town' => 'Ernetschwil', 'canton' => 'SG'),
+    '8726' => array('town' => 'Ricken SG', 'canton' => 'SG'),
+    '8727' => array('town' => 'Walde SG', 'canton' => 'SG'),
+    '8730' => array('town' => 'Uznach', 'canton' => 'SG'),
+    '8732' => array('town' => 'Neuhaus SG', 'canton' => 'SG'),
+    '8733' => array('town' => 'Eschenbach SG', 'canton' => 'SG'),
+    '8734' => array('town' => 'Ermenswil', 'canton' => 'SG'),
+    '8735' => array('town' => 'St. Gallenkappel', 'canton' => 'SG'),
+    '8737' => array('town' => 'Gommiswald', 'canton' => 'SG'),
+    '8738' => array('town' => 'Uetliburg SG', 'canton' => 'SG'),
+    '8739' => array('town' => 'Rieden SG', 'canton' => 'SG'),
+    '8740' => array('town' => 'Uznach Vögele AG', 'canton' => 'SG'),
+    '8750' => array('town' => 'Glarus', 'canton' => 'GL'),
+    '8751' => array('town' => 'Urnerboden', 'canton' => 'UR'),
+    '8752' => array('town' => 'Näfels', 'canton' => 'GL'),
+    '8753' => array('town' => 'Mollis', 'canton' => 'GL'),
+    '8754' => array('town' => 'Netstal', 'canton' => 'GL'),
+    '8755' => array('town' => 'Ennenda', 'canton' => 'GL'),
+    '8756' => array('town' => 'Mitlödi', 'canton' => 'GL'),
+    '8762' => array('town' => 'Schwanden GL', 'canton' => 'GL'),
+    '8765' => array('town' => 'Engi', 'canton' => 'GL'),
+    '8766' => array('town' => 'Matt', 'canton' => 'GL'),
+    '8767' => array('town' => 'Elm', 'canton' => 'GL'),
+    '8772' => array('town' => 'Nidfurn', 'canton' => 'GL'),
+    '8773' => array('town' => 'Haslen GL', 'canton' => 'GL'),
+    '8775' => array('town' => 'Luchsingen', 'canton' => 'GL'),
+    '8777' => array('town' => 'Diesbach GL', 'canton' => 'GL'),
+    '8782' => array('town' => 'Rüti GL', 'canton' => 'GL'),
+    '8783' => array('town' => 'Linthal', 'canton' => 'GL'),
+    '8784' => array('town' => 'Braunwald', 'canton' => 'GL'),
+    '8800' => array('town' => 'Thalwil', 'canton' => 'ZH'),
+    '8802' => array('town' => 'Kilchberg ZH', 'canton' => 'ZH'),
+    '8803' => array('town' => 'Rüschlikon', 'canton' => 'ZH'),
+    '8804' => array('town' => 'Au ZH', 'canton' => 'ZH'),
+    '8805' => array('town' => 'Richterswil', 'canton' => 'ZH'),
+    '8806' => array('town' => 'Bäch SZ', 'canton' => 'SZ'),
+    '8807' => array('town' => 'Freienbach', 'canton' => 'SZ'),
+    '8808' => array('town' => 'Pfäffikon SZ', 'canton' => 'SZ'),
+    '8810' => array('town' => 'Horgen', 'canton' => 'ZH'),
+    '8812' => array('town' => 'Horgen', 'canton' => 'ZH'),
+    '8813' => array('town' => 'Horgen', 'canton' => 'ZH'),
+    '8815' => array('town' => 'Horgenberg', 'canton' => 'ZH'),
+    '8816' => array('town' => 'Hirzel', 'canton' => 'ZH'),
+    '8820' => array('town' => 'Wädenswil', 'canton' => 'ZH'),
+    '8824' => array('town' => 'Schönenberg ZH', 'canton' => 'ZH'),
+    '8825' => array('town' => 'Hütten', 'canton' => 'ZH'),
+    '8832' => array('town' => 'Wollerau', 'canton' => 'SZ'),
+    '8833' => array('town' => 'Samstagern', 'canton' => 'ZH'),
+    '8834' => array('town' => 'Schindellegi', 'canton' => 'SZ'),
+    '8835' => array('town' => 'Feusisberg', 'canton' => 'SZ'),
+    '8836' => array('town' => 'Bennau', 'canton' => 'SZ'),
+    '8840' => array('town' => 'Einsiedeln', 'canton' => 'SZ'),
+    '8849' => array('town' => 'Alpthal', 'canton' => 'SZ'),
+    '8846' => array('town' => 'Willerzell', 'canton' => 'SZ'),
+    '8847' => array('town' => 'Egg SZ', 'canton' => 'SZ'),
+    '8841' => array('town' => 'Gross', 'canton' => 'SZ'),
+    '8844' => array('town' => 'Euthal', 'canton' => 'SZ'),
+    '8845' => array('town' => 'Studen SZ', 'canton' => 'SZ'),
+    '8842' => array('town' => 'Unteriberg', 'canton' => 'SZ'),
+    '8843' => array('town' => 'Oberiberg', 'canton' => 'SZ'),
+    '8852' => array('town' => 'Altendorf', 'canton' => 'SZ'),
+    '8853' => array('town' => 'Lachen SZ', 'canton' => 'SZ'),
+    '8854' => array('town' => 'Siebnen', 'canton' => 'SZ'),
+    '8855' => array('town' => 'Wangen SZ', 'canton' => 'SZ'),
+    '8856' => array('town' => 'Tuggen', 'canton' => 'SZ'),
+    '8857' => array('town' => 'Vorderthal', 'canton' => 'SZ'),
+    '8858' => array('town' => 'Innerthal', 'canton' => 'SZ'),
+    '8862' => array('town' => 'Schübelbach', 'canton' => 'SZ'),
+    '8863' => array('town' => 'Buttikon SZ', 'canton' => 'SZ'),
+    '8864' => array('town' => 'Reichenburg', 'canton' => 'SZ'),
+    '8865' => array('town' => 'Bilten', 'canton' => 'GL'),
+    '8866' => array('town' => 'Ziegelbrücke', 'canton' => 'GL'),
+    '8867' => array('town' => 'Niederurnen', 'canton' => 'GL'),
+    '8868' => array('town' => 'Oberurnen', 'canton' => 'GL'),
+    '8872' => array('town' => 'Weesen', 'canton' => 'SG'),
+    '8873' => array('town' => 'Amden', 'canton' => 'SG'),
+    '8874' => array('town' => 'Mühlehorn', 'canton' => 'GL'),
+    '8758' => array('town' => 'Obstalden', 'canton' => 'GL'),
+    '8757' => array('town' => 'Filzbach', 'canton' => 'GL'),
+    '8877' => array('town' => 'Murg', 'canton' => 'SG'),
+    '8878' => array('town' => 'Quinten', 'canton' => 'SG'),
+    '8880' => array('town' => 'Walenstadt', 'canton' => 'SG'),
+    '8881' => array('town' => 'Walenstadtberg', 'canton' => 'SG'),
+    '8882' => array('town' => 'Unterterzen', 'canton' => 'SG'),
+    '8883' => array('town' => 'Quarten', 'canton' => 'SG'),
+    '8884' => array('town' => 'Oberterzen', 'canton' => 'SG'),
+    '8885' => array('town' => 'Mols', 'canton' => 'SG'),
+    '8887' => array('town' => 'Mels', 'canton' => 'SG'),
+    '8886' => array('town' => 'Mädris-Vermol', 'canton' => 'SG'),
+    '8889' => array('town' => 'Plons', 'canton' => 'SG'),
+    '8888' => array('town' => 'Heiligkreuz (Mels)', 'canton' => 'SG'),
+    '8890' => array('town' => 'Flums', 'canton' => 'SG'),
+    '8892' => array('town' => 'Berschis', 'canton' => 'SG'),
+    '8893' => array('town' => 'Flums Hochwiese', 'canton' => 'SG'),
+    '8894' => array('town' => 'Flumserberg Saxli', 'canton' => 'SG'),
+    '8895' => array('town' => 'Flumserberg Portel', 'canton' => 'SG'),
+    '8896' => array('town' => 'Flumserberg Bergh', 'canton' => 'SG'),
+    '8897' => array('town' => 'Flumserberg Theim', 'canton' => 'SG'),
+    '8898' => array('town' => 'Flumserberg Tboden', 'canton' => 'SG'),
+    '8902' => array('town' => 'Urdorf', 'canton' => 'ZH'),
+    '8903' => array('town' => 'Birmensdorf ZH', 'canton' => 'ZH'),
+    '8904' => array('town' => 'Aesch ZH', 'canton' => 'ZH'),
+    '8905' => array('town' => 'Arni-Islisberg', 'canton' => 'AG'),
+    '8906' => array('town' => 'Bonstetten', 'canton' => 'ZH'),
+    '8907' => array('town' => 'Wettswil', 'canton' => 'ZH'),
+    '8908' => array('town' => 'Hedingen', 'canton' => 'ZH'),
+    '8910' => array('town' => 'Affoltern am Albis', 'canton' => 'ZH'),
+    '8909' => array('town' => 'Zwillikon', 'canton' => 'ZH'),
+    '8911' => array('town' => 'Rifferswil', 'canton' => 'ZH'),
+    '8912' => array('town' => 'Obfelden', 'canton' => 'ZH'),
+    '8913' => array('town' => 'Ottenbach', 'canton' => 'ZH'),
+    '8914' => array('town' => 'Aeugst am Albis', 'canton' => 'ZH'),
+    '8915' => array('town' => 'Hausen am Albis', 'canton' => 'ZH'),
+    '8916' => array('town' => 'Jonen', 'canton' => 'AG'),
+    '8917' => array('town' => 'Oberlunkhofen', 'canton' => 'AG'),
+    '8918' => array('town' => 'Unterlunkhofen', 'canton' => 'AG'),
+    '8919' => array('town' => 'Rottenschwil', 'canton' => 'AG'),
+    '8925' => array('town' => 'Ebertswil', 'canton' => 'ZH'),
+    '8926' => array('town' => 'Kappel am Albis', 'canton' => 'ZH'),
+    '8932' => array('town' => 'Mettmenstetten', 'canton' => 'ZH'),
+    '8933' => array('town' => 'Maschwanden', 'canton' => 'ZH'),
+    '8934' => array('town' => 'Knonau', 'canton' => 'ZH'),
+    '8942' => array('town' => 'Oberrieden', 'canton' => 'ZH'),
+    '8951' => array('town' => 'Fahrweid', 'canton' => 'ZH'),
+    '8952' => array('town' => 'Schlieren', 'canton' => 'ZH'),
+    '8953' => array('town' => 'Dietikon', 'canton' => 'ZH'),
+    '8954' => array('town' => 'Geroldswil', 'canton' => 'ZH'),
+    '8955' => array('town' => 'Oetwil a.d. Limmat', 'canton' => 'ZH'),
+    '8956' => array('town' => 'Killwangen', 'canton' => 'AG'),
+    '8957' => array('town' => 'Spreitenbach', 'canton' => 'AG'),
+    '8962' => array('town' => 'Bergdietikon', 'canton' => 'AG'),
+    '8964' => array('town' => 'Rudolfstetten', 'canton' => 'AG'),
+    '8965' => array('town' => 'Berikon', 'canton' => 'AG'),
+    '8966' => array('town' => 'Oberwil-Lieli', 'canton' => 'AG'),
+    '8967' => array('town' => 'Widen', 'canton' => 'AG'),
+    '9000' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '9001' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '9004' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '9006' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '9007' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '9008' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '9009' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '9010' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '9011' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '9012' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '9013' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '9014' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '9015' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '9016' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '9030' => array('town' => 'Abtwil SG', 'canton' => 'SG'),
+    '9032' => array('town' => 'Engelburg', 'canton' => 'SG'),
+    '9033' => array('town' => 'Untereggen', 'canton' => 'SG'),
+    '9034' => array('town' => 'Eggersriet', 'canton' => 'SG'),
+    '9035' => array('town' => 'Grub AR', 'canton' => 'AR'),
+    '9036' => array('town' => 'Grub SG', 'canton' => 'SG'),
+    '9037' => array('town' => 'Speicherschwendi', 'canton' => 'AR'),
+    '9038' => array('town' => 'Rehetobel', 'canton' => 'AR'),
+    '9042' => array('town' => 'Speicher', 'canton' => 'AR'),
+    '9043' => array('town' => 'Trogen', 'canton' => 'AR'),
+    '9044' => array('town' => 'Wald AR', 'canton' => 'AR'),
+    '9050' => array('town' => 'Appenzell', 'canton' => 'AI'),
+    '9052' => array('town' => 'Niederteufen', 'canton' => 'AR'),
+    '9053' => array('town' => 'Teufen AR', 'canton' => 'AR'),
+    '9054' => array('town' => 'Haslen AI', 'canton' => 'AI'),
+    '9055' => array('town' => 'Bühler', 'canton' => 'AR'),
+    '9056' => array('town' => 'Gais', 'canton' => 'AR'),
+    '9057' => array('town' => 'Weissbad', 'canton' => 'AI'),
+    '9058' => array('town' => 'Brülisau', 'canton' => 'AI'),
+    '9062' => array('town' => 'Lustmühle', 'canton' => 'AR'),
+    '9063' => array('town' => 'Stein AR', 'canton' => 'AR'),
+    '9064' => array('town' => 'Hundwil', 'canton' => 'AR'),
+    '9100' => array('town' => 'Herisau', 'canton' => 'AR'),
+    '9102' => array('town' => 'Herisau', 'canton' => 'AR'),
+    '9103' => array('town' => 'Schwellbrunn', 'canton' => 'AR'),
+    '9104' => array('town' => 'Waldstatt', 'canton' => 'AR'),
+    '9105' => array('town' => 'Schönengrund', 'canton' => 'AR'),
+    '9107' => array('town' => 'Urnäsch', 'canton' => 'AR'),
+    '9108' => array('town' => 'Gonten', 'canton' => 'AI'),
+    '9112' => array('town' => 'Schachen b.Herisau', 'canton' => 'AR'),
+    '9113' => array('town' => 'Degersheim', 'canton' => 'SG'),
+    '9114' => array('town' => 'Hoffeld', 'canton' => 'SG'),
+    '9115' => array('town' => 'Dicken', 'canton' => 'SG'),
+    '9116' => array('town' => 'Wolfertswil', 'canton' => 'SG'),
+    '9122' => array('town' => 'Mogelsberg', 'canton' => 'SG'),
+    '9123' => array('town' => 'Nassen', 'canton' => 'SG'),
+    '9125' => array('town' => 'Brunnadern', 'canton' => 'SG'),
+    '9126' => array('town' => 'Necker', 'canton' => 'SG'),
+    '9127' => array('town' => 'St. Peterzell', 'canton' => 'SG'),
+    '9633' => array('town' => 'Bächli (Hemberg)', 'canton' => 'SG'),
+    '9200' => array('town' => 'Gossau SG', 'canton' => 'SG'),
+    '9203' => array('town' => 'Niederwil SG', 'canton' => 'SG'),
+    '9204' => array('town' => 'Andwil SG', 'canton' => 'SG'),
+    '9205' => array('town' => 'Waldkirch', 'canton' => 'SG'),
+    '9212' => array('town' => 'Arnegg', 'canton' => 'SG'),
+    '9213' => array('town' => 'Hauptwil', 'canton' => 'TG'),
+    '9214' => array('town' => 'Kradolf-Schönenb.', 'canton' => 'TG'),
+    '9216' => array('town' => 'Heldswil', 'canton' => 'TG'),
+    '9215' => array('town' => 'Schönenberg TG', 'canton' => 'TG'),
+    '9220' => array('town' => 'Bischofszell', 'canton' => 'TG'),
+    '9223' => array('town' => 'Schweizersholz', 'canton' => 'TG'),
+    '9225' => array('town' => 'Wilen (Gottshaus)', 'canton' => 'TG'),
+    '9230' => array('town' => 'Flawil', 'canton' => 'SG'),
+    '9231' => array('town' => 'Egg (Flawil)', 'canton' => 'SG'),
+    '9604' => array('town' => 'Oberrindal', 'canton' => 'SG'),
+    '9240' => array('town' => 'Uzwil', 'canton' => 'SG'),
+    '9242' => array('town' => 'Oberuzwil', 'canton' => 'SG'),
+    '9248' => array('town' => 'Bichwil', 'canton' => 'SG'),
+    '9243' => array('town' => 'Jonschwil', 'canton' => 'SG'),
+    '9244' => array('town' => 'Niederuzwil', 'canton' => 'SG'),
+    '9245' => array('town' => 'Oberbüren', 'canton' => 'SG'),
+    '9246' => array('town' => 'Niederbüren', 'canton' => 'SG'),
+    '9247' => array('town' => 'Henau', 'canton' => 'SG'),
+    '9249' => array('town' => 'Algetshausen', 'canton' => 'SG'),
+    '9300' => array('town' => 'Wittenbach', 'canton' => 'SG'),
+    '9304' => array('town' => 'Bernhardzell', 'canton' => 'SG'),
+    '9305' => array('town' => 'Berg SG', 'canton' => 'SG'),
+    '9306' => array('town' => 'Freidorf TG', 'canton' => 'TG'),
+    '9315' => array('town' => 'Winden', 'canton' => 'TG'),
+    '9308' => array('town' => 'Lömmenschwil', 'canton' => 'SG'),
+    '9312' => array('town' => 'Häggenschwil', 'canton' => 'SG'),
+    '9313' => array('town' => 'Muolen', 'canton' => 'SG'),
+    '9314' => array('town' => 'Steinebrunn', 'canton' => 'TG'),
+    '9320' => array('town' => 'Arbon', 'canton' => 'TG'),
+    '9322' => array('town' => 'Egnach', 'canton' => 'TG'),
+    '9323' => array('town' => 'Steinach', 'canton' => 'SG'),
+    '9325' => array('town' => 'Roggwil TG', 'canton' => 'TG'),
+    '9326' => array('town' => 'Horn', 'canton' => 'TG'),
+    '9327' => array('town' => 'Tübach', 'canton' => 'SG'),
+    '9400' => array('town' => 'Rorschach', 'canton' => 'SG'),
+    '9404' => array('town' => 'Rorschacherberg', 'canton' => 'SG'),
+    '9402' => array('town' => 'Mörschwil', 'canton' => 'SG'),
+    '9403' => array('town' => 'Goldach', 'canton' => 'SG'),
+    '9405' => array('town' => 'Wienacht-Tobel', 'canton' => 'AR'),
+    '9410' => array('town' => 'Heiden', 'canton' => 'AR'),
+    '9411' => array('town' => 'Reute AR', 'canton' => 'AR'),
+    '9413' => array('town' => 'Oberegg', 'canton' => 'AI'),
+    '9414' => array('town' => 'Schachen b. Reute', 'canton' => 'AR'),
+    '9422' => array('town' => 'Staad SG', 'canton' => 'SG'),
+    '9423' => array('town' => 'Altenrhein', 'canton' => 'SG'),
+    '9424' => array('town' => 'Rheineck', 'canton' => 'SG'),
+    '9425' => array('town' => 'Thal', 'canton' => 'SG'),
+    '9426' => array('town' => 'Lutzenberg', 'canton' => 'AR'),
+    '9427' => array('town' => 'Wolfhalden', 'canton' => 'AR'),
+    '9428' => array('town' => 'Walzenhausen', 'canton' => 'AR'),
+    '9430' => array('town' => 'St. Margrethen SG', 'canton' => 'SG'),
+    '9434' => array('town' => 'Au SG', 'canton' => 'SG'),
+    '9435' => array('town' => 'Heerbrugg', 'canton' => 'SG'),
+    '9436' => array('town' => 'Balgach', 'canton' => 'SG'),
+    '9437' => array('town' => 'Marbach SG', 'canton' => 'SG'),
+    '9450' => array('town' => 'Lüchingen', 'canton' => 'SG'),
+    '9442' => array('town' => 'Berneck', 'canton' => 'SG'),
+    '9443' => array('town' => 'Widnau', 'canton' => 'SG'),
+    '9444' => array('town' => 'Diepoldsau', 'canton' => 'SG'),
+    '9445' => array('town' => 'Rebstein', 'canton' => 'SG'),
+    '9451' => array('town' => 'Kriessern', 'canton' => 'SG'),
+    '9452' => array('town' => 'Hinterforst', 'canton' => 'SG'),
+    '9453' => array('town' => 'Eichberg', 'canton' => 'SG'),
+    '9462' => array('town' => 'Montlingen', 'canton' => 'SG'),
+    '9463' => array('town' => 'Oberriet SG', 'canton' => 'SG'),
+    '9464' => array('town' => 'Rüthi (Rheintal)', 'canton' => 'SG'),
+    '9465' => array('town' => 'Salez', 'canton' => 'SG'),
+    '9466' => array('town' => 'Sennwald', 'canton' => 'SG'),
+    '9467' => array('town' => 'Frümsen', 'canton' => 'SG'),
+    '9468' => array('town' => 'Sax', 'canton' => 'SG'),
+    '9469' => array('town' => 'Haag (Rheintal)', 'canton' => 'SG'),
+    '9470' => array('town' => 'Buchs SG', 'canton' => 'SG'),
+    '9472' => array('town' => 'Grabs', 'canton' => 'SG'),
+    '9473' => array('town' => 'Gams', 'canton' => 'SG'),
+    '9475' => array('town' => 'Sevelen', 'canton' => 'SG'),
+    '9476' => array('town' => 'Weite', 'canton' => 'SG'),
+    '9477' => array('town' => 'Trübbach', 'canton' => 'SG'),
+    '9478' => array('town' => 'Azmoos', 'canton' => 'SG'),
+    '9479' => array('town' => 'Oberschan', 'canton' => 'SG'),
+    '9485' => array('town' => 'Nendeln', 'canton' => 'FL'),
+    '9486' => array('town' => 'Schaanwald', 'canton' => 'FL'),
+    '9487' => array('town' => 'Gamprin-Bendern', 'canton' => 'FL'),
+    '9488' => array('town' => 'Schellenberg', 'canton' => 'FL'),
+    '9490' => array('town' => 'Vaduz', 'canton' => 'FL'),
+    '9491' => array('town' => 'Ruggell', 'canton' => 'FL'),
+    '9492' => array('town' => 'Eschen', 'canton' => 'FL'),
+    '9493' => array('town' => 'Mauren FL', 'canton' => 'FL'),
+    '9494' => array('town' => 'Schaan', 'canton' => 'FL'),
+    '9495' => array('town' => 'Triesen', 'canton' => 'FL'),
+    '9496' => array('town' => 'Balzers', 'canton' => 'FL'),
+    '9497' => array('town' => 'Triesenberg', 'canton' => 'FL'),
+    '9500' => array('town' => 'Wil SG', 'canton' => 'SG'),
+    '9502' => array('town' => 'Braunau', 'canton' => 'TG'),
+    '9503' => array('town' => 'Stehrenberg', 'canton' => 'TG'),
+    '9504' => array('town' => 'Friltschen', 'canton' => 'TG'),
+    '9506' => array('town' => 'Lommis', 'canton' => 'TG'),
+    '9507' => array('town' => 'Stettfurt', 'canton' => 'TG'),
+    '9508' => array('town' => 'Weingarten-Kalth', 'canton' => 'TG'),
+    '9512' => array('town' => 'Rossrüti', 'canton' => 'SG'),
+    '9514' => array('town' => 'Wuppenau', 'canton' => 'TG'),
+    '9515' => array('town' => 'Hosenruck', 'canton' => 'TG'),
+    '9517' => array('town' => 'Mettlen', 'canton' => 'TG'),
+    '9565' => array('town' => 'Rothenhausen', 'canton' => 'TG'),
+    '9523' => array('town' => 'Züberwangen', 'canton' => 'SG'),
+    '9524' => array('town' => 'Zuzwil SG', 'canton' => 'SG'),
+    '9525' => array('town' => 'Lenggenwil', 'canton' => 'SG'),
+    '9526' => array('town' => 'Zuckenriet', 'canton' => 'SG'),
+    '9527' => array('town' => 'Niederhelfenschwil', 'canton' => 'SG'),
+    '9532' => array('town' => 'Rickenbach b. Wil', 'canton' => 'TG'),
+    '9533' => array('town' => 'Kirchberg SG', 'canton' => 'SG'),
+    '9534' => array('town' => 'Gähwil', 'canton' => 'SG'),
+    '9535' => array('town' => 'Wilen b. Wil', 'canton' => 'TG'),
+    '9536' => array('town' => 'Schwarzenbach SG', 'canton' => 'SG'),
+    '9542' => array('town' => 'Münchwilen TG', 'canton' => 'TG'),
+    '9543' => array('town' => 'St. Margarethen TG', 'canton' => 'TG'),
+    '9545' => array('town' => 'Wängi', 'canton' => 'TG'),
+    '9546' => array('town' => 'Tuttwil', 'canton' => 'TG'),
+    '9547' => array('town' => 'Wittenwil', 'canton' => 'TG'),
+    '9548' => array('town' => 'Matzingen', 'canton' => 'TG'),
+    '9552' => array('town' => 'Bronschhofen', 'canton' => 'SG'),
+    '9553' => array('town' => 'Bettwiesen', 'canton' => 'TG'),
+    '9554' => array('town' => 'Tägerschen', 'canton' => 'TG'),
+    '9555' => array('town' => 'Tobel', 'canton' => 'TG'),
+    '9556' => array('town' => 'Affeltrangen', 'canton' => 'TG'),
+    '9562' => array('town' => 'Märwil', 'canton' => 'TG'),
+    '9573' => array('town' => 'Littenheid', 'canton' => 'TG'),
+    '9601' => array('town' => 'Lütisburg Station', 'canton' => 'SG'),
+    '9602' => array('town' => 'Bazenheid', 'canton' => 'SG'),
+    '9606' => array('town' => 'Bütschwil', 'canton' => 'SG'),
+    '9607' => array('town' => 'Mosnang', 'canton' => 'SG'),
+    '9608' => array('town' => 'Ganterschwil', 'canton' => 'SG'),
+    '9612' => array('town' => 'Dreien', 'canton' => 'SG'),
+    '9613' => array('town' => 'Mühlrüti', 'canton' => 'SG'),
+    '9614' => array('town' => 'Libingen', 'canton' => 'SG'),
+    '9615' => array('town' => 'Dietfurt', 'canton' => 'SG'),
+    '9620' => array('town' => 'Lichtensteig', 'canton' => 'SG'),
+    '9621' => array('town' => 'Oberhelfenschwil', 'canton' => 'SG'),
+    '9622' => array('town' => 'Krinau', 'canton' => 'SG'),
+    '9630' => array('town' => 'Wattwil', 'canton' => 'SG'),
+    '9631' => array('town' => 'Ulisbach', 'canton' => 'SG'),
+    '9642' => array('town' => 'Ebnat-Kappel', 'canton' => 'SG'),
+    '9643' => array('town' => 'Krummenau', 'canton' => 'SG'),
+    '9650' => array('town' => 'Nesslau', 'canton' => 'SG'),
+    '9651' => array('town' => 'Ennetbühl', 'canton' => 'SG'),
+    '9655' => array('town' => 'Stein SG', 'canton' => 'SG'),
+    '9652' => array('town' => 'Neu St. Johann', 'canton' => 'SG'),
+    '9656' => array('town' => 'Alt St. Johann', 'canton' => 'SG'),
+    '9657' => array('town' => 'Unterwasser', 'canton' => 'SG'),
+    '9658' => array('town' => 'Wildhaus', 'canton' => 'SG'),
+    '3185' => array('town' => 'Schmitten FR', 'canton' => 'FR'),
+    '3113' => array('town' => 'Rubigen', 'canton' => 'BE'),
+    '6304' => array('town' => 'Zug', 'canton' => 'ZG'),
+    '6911' => array('town' => 'Campione', 'canton' => 'IT'),
+    '8238' => array('town' => 'Büsingen', 'canton' => 'DE'),
+    '6302' => array('town' => 'Zug', 'canton' => 'ZG'),
+    '6303' => array('town' => 'Zug', 'canton' => 'ZG'),
+    '1289' => array('town' => 'Genève Serv. Spéc.', 'canton' => 'GE'),
+    '7003' => array('town' => 'Chur Postauto', 'canton' => 'GR'),
+    '3024' => array('town' => 'Bern', 'canton' => 'BE'),
+    '1017' => array('town' => 'Lausanne Veillon', 'canton' => 'VD'),
+    '1099' => array('town' => 'Montpreveyres Foto', 'canton' => 'VD'),
+    '3030' => array('town' => 'Bern', 'canton' => 'BE'),
+    '1031' => array('town' => 'Mex VD', 'canton' => 'VD'),
+    '1734' => array('town' => 'Tentlingen', 'canton' => 'FR'),
+    '1029' => array('town' => 'Villars-Ste-Croix', 'canton' => 'VD'),
+    '9101' => array('town' => 'Herisau', 'canton' => 'AR'),
+    '3044' => array('town' => 'Innerberg', 'canton' => 'BE'),
+    '8317' => array('town' => 'Tagelswangen', 'canton' => 'ZH'),
+    '6908' => array('town' => 'Massagno Caselle', 'canton' => 'TI'),
+    '6009' => array('town' => 'Luzern', 'canton' => 'LU'),
+    '6910' => array('town' => 'Lugano', 'canton' => 'TI'),
+    '5232' => array('town' => 'Villigen PSI', 'canton' => 'AG'),
+    '6349' => array('town' => 'Baar', 'canton' => 'ZG'),
+    '2715' => array('town' => 'Monible', 'canton' => 'BE'),
+    '1653' => array('town' => 'Châtel-Montsalvens', 'canton' => 'FR'),
+    '1730' => array('town' => 'Ecuvillens', 'canton' => 'FR'),
+    '1428' => array('town' => 'Mutrux', 'canton' => 'VD'),
+    '1047' => array('town' => 'Oppens', 'canton' => 'VD'),
+    '2027' => array('town' => 'Montalchez', 'canton' => 'NE'),
+    '2933' => array('town' => 'Damphreux', 'canton' => 'JU'),
+    '8543' => array('town' => 'Bertschikon', 'canton' => 'ZH'),
+    '3429' => array('town' => 'Hellsau', 'canton' => 'BE'),
+    '3632' => array('town' => 'Niederstocken', 'canton' => 'BE'),
+    '8774' => array('town' => 'Leuggelbach', 'canton' => 'GL'),
+    '4584' => array('town' => 'Gächliwil', 'canton' => 'SO'),
+    '5058' => array('town' => 'Wiliberg', 'canton' => 'AG'),
+    '3940' => array('town' => 'Steg VS', 'canton' => 'VS'),
+    '9498' => array('town' => 'Planken', 'canton' => 'FL'),
+    '8801' => array('town' => 'Thalwil', 'canton' => 'ZH'),
+    '6341' => array('town' => 'Baar', 'canton' => 'ZG'),
+    '6342' => array('town' => 'Baar', 'canton' => 'ZG'),
+    '9029' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '1709' => array('town' => 'Fribourg', 'canton' => 'FR'),
+    '8879' => array('town' => 'Pizolpark (Mels)', 'canton' => 'SG'),
+    '8118' => array('town' => 'Pfaffhausen', 'canton' => 'ZH'),
+    '5601' => array('town' => 'Lenzburg Sonderdst', 'canton' => 'AG'),
+    '9028' => array('town' => 'St. Gallen CV AG', 'canton' => 'SG'),
+    '9027' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '1811' => array('town' => 'Vevey', 'canton' => 'VD'),
+    '3609' => array('town' => 'Thun', 'canton' => 'BE'),
+    '1775' => array('town' => 'Mannens', 'canton' => 'FR'),
+    '8106' => array('town' => 'Adlikon b.Regensdf', 'canton' => 'ZH'),
+    '8070' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8071' => array('town' => 'Zürich CS PZ', 'canton' => 'ZH'),
+    '1631' => array('town' => 'Bulle', 'canton' => 'FR'),
+    '3040' => array('town' => 'Bern', 'canton' => 'BE'),
+    '4040' => array('town' => 'Basel', 'canton' => 'BL'),
+    '6007' => array('town' => 'Luzern', 'canton' => 'LU'),
+    '8759' => array('town' => 'Netstal', 'canton' => 'GL'),
+    '9020' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '4573' => array('town' => 'Lohn-Ammannsegg', 'canton' => 'SO'),
+    '9026' => array('town' => 'St. Gallen K AG', 'canton' => 'SG'),
+    '6031' => array('town' => 'Ebikon', 'canton' => 'LU'),
+    '6021' => array('town' => 'Emmenbrücke 1', 'canton' => 'LU'),
+    '6391' => array('town' => 'Engelberg', 'canton' => 'OW'),
+    '6281' => array('town' => 'Hochdorf', 'canton' => 'LU'),
+    '6011' => array('town' => 'Kriens', 'canton' => 'LU'),
+    '6061' => array('town' => 'Sarnen 1', 'canton' => 'OW'),
+    '6371' => array('town' => 'Stans', 'canton' => 'NW'),
+    '6431' => array('town' => 'Schwyz', 'canton' => 'SZ'),
+    '9025' => array('town' => 'St. Gallen Quelle', 'canton' => 'SG'),
+    '6907' => array('town' => 'Lugano 7 Caselle', 'canton' => 'TI'),
+    '1240' => array('town' => 'Genève', 'canton' => 'GE'),
+    '9471' => array('town' => 'Buchs SG 1', 'canton' => 'SG'),
+    '9401' => array('town' => 'Rorschach', 'canton' => 'SG'),
+    '9501' => array('town' => 'Wil SG 1', 'canton' => 'SG'),
+    '4509' => array('town' => 'Solothurn', 'canton' => 'SO'),
+    '4070' => array('town' => 'Basel', 'canton' => 'BS'),
+    '8609' => array('town' => 'Schwerzenbach', 'canton' => 'ZH'),
+    '6602' => array('town' => 'Muralto', 'canton' => 'TI'),
+    '6161' => array('town' => 'Entlebuch', 'canton' => 'LU'),
+    '9201' => array('town' => 'Gossau SG', 'canton' => 'SG'),
+    '8510' => array('town' => 'Frauenfeld', 'canton' => 'TG'),
+    '3050' => array('town' => 'Bern', 'canton' => 'BE'),
+    '8086' => array('town' => 'Zürich R Digest', 'canton' => 'ZH'),
+    '8085' => array('town' => 'Zürich Versich.', 'canton' => 'ZH'),
+    '2075' => array('town' => 'Thielle', 'canton' => 'NE'),
+    '1068' => array('town' => 'Les Monts-de-Pully', 'canton' => 'VD'),
+    '2010' => array('town' => 'Neuchâtel OFS', 'canton' => 'NE'),
+    '8285' => array('town' => 'Kreuzlingen Ifolor', 'canton' => 'TG'),
+    '4039' => array('town' => 'Basel', 'canton' => 'BS'),
+    '2510' => array('town' => 'Biel/Bienne DistBa', 'canton' => 'BE'),
+    '5510' => array('town' => 'Hunzenschwil DistB', 'canton' => 'AG'),
+    '8210' => array('town' => 'Schaffhausen DistB', 'canton' => 'SH'),
+    '9510' => array('town' => 'Wil SG Dist Ba', 'canton' => 'SG'),
+    '5018' => array('town' => 'Erlinsbach', 'canton' => 'AG'),
+    '1310' => array('town' => 'Daillens Dist Ba', 'canton' => 'VD'),
+    '8098' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '8066' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '4620' => array('town' => 'Härkingen PZ', 'canton' => 'SO'),
+    '8183' => array('town' => 'Bülach Dist Ba', 'canton' => 'ZH'),
+    '8325' => array('town' => 'Effretikon Dist Ba', 'canton' => 'ZH'),
+    '8520' => array('town' => 'Frauenfeld PZ', 'canton' => 'TG'),
+    '8343' => array('town' => 'Hinwil Dist Ba', 'canton' => 'ZH'),
+    '8087' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '4078' => array('town' => 'Basel Reader\'s D.', 'canton' => 'BS'),
+    '9024' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '4609' => array('town' => 'Olten', 'canton' => 'SO'),
+    '8015' => array('town' => 'Zürich 15', 'canton' => 'ZH'),
+    '1818' => array('town' => 'Montreux Redoute', 'canton' => 'VD'),
+    '8540' => array('town' => 'Frauenfeld ST PP 1', 'canton' => 'TG'),
+    '8530' => array('town' => 'Frauenfeld CALL', 'canton' => 'TG'),
+    '4640' => array('town' => 'Härkingen ST PP 1', 'canton' => 'SO'),
+    '4630' => array('town' => 'Härkingen CALL', 'canton' => 'SO'),
+    '1330' => array('town' => 'Daillens CALL', 'canton' => 'VD'),
+    '1320' => array('town' => 'Daillens ST PP 1', 'canton' => 'VD'),
+    '1440' => array('town' => 'Montagny-Chamard', 'canton' => 'VD'),
+    '4065' => array('town' => 'Basel SBB Cargo AG', 'canton' => 'BS'),
+    '8075' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '4080' => array('town' => 'Basel', 'canton' => 'BS'),
+    '6039' => array('town' => 'Root Längenbold', 'canton' => 'LU'),
+    '4034' => array('town' => 'Basel 34 Breite', 'canton' => 'BS'),
+    '4035' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4089' => array('town' => 'Basel', 'canton' => 'BS'),
+    '8068' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '3071' => array('town' => 'Ostermundigen Zust', 'canton' => 'BE'),
+    '4033' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4081' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4082' => array('town' => 'Basel', 'canton' => 'BS'),
+    '8186' => array('town' => 'Bülach', 'canton' => 'ZH'),
+    '3039' => array('town' => 'Bern PF OC', 'canton' => 'BE'),
+    '4042' => array('town' => 'Basel PF OC', 'canton' => 'BL'),
+    '4083' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4084' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4085' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4086' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4087' => array('town' => 'Basel', 'canton' => 'BS'),
+    '4088' => array('town' => 'Basel', 'canton' => 'BS'),
+    '8081' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '4092' => array('town' => 'Basel SPI AS 22', 'canton' => 'BS'),
+    '4093' => array('town' => 'Basel SPI AS 23', 'canton' => 'BS'),
+    '4094' => array('town' => 'Basel SPI AS 24', 'canton' => 'BS'),
+    '4095' => array('town' => 'Basel SPI AS 25', 'canton' => 'BS'),
+    '4096' => array('town' => 'Basel SPI AS 26', 'canton' => 'BS'),
+    '8901' => array('town' => 'Urdorf', 'canton' => 'ZH'),
+    '3041' => array('town' => 'Bern', 'canton' => 'BE'),
+    '6008' => array('town' => 'Luzern', 'canton' => 'LU'),
+    '4041' => array('town' => 'Basel', 'canton' => 'BS'),
+    '9489' => array('town' => 'Vaduz', 'canton' => 'FL'),
+    '4551' => array('town' => 'Derendingen', 'canton' => 'SO'),
+    '4075' => array('town' => 'Basel', 'canton' => 'BS'),
+    '9022' => array('town' => 'St. Gallen', 'canton' => 'SG'),
+    '8109' => array('town' => 'Kloster Fahr', 'canton' => 'AG'),
+    '1019' => array('town' => 'Lausanne', 'canton' => 'VD'),
+    '1039' => array('town' => 'Cheseaux Polyval', 'canton' => 'VD'),
+    '6346' => array('town' => 'Baar 3', 'canton' => 'ZG'),
+    '3085' => array('town' => 'Wabern Weihnachten', 'canton' => 'BE'),
+    '1300' => array('town' => 'Eclépens CC', 'canton' => 'VD'),
+    '3070' => array('town' => 'Ostermundigen LZB', 'canton' => 'BE'),
+    '4621' => array('town' => 'Härkingen BZ', 'canton' => 'SO'),
+    '6590' => array('town' => 'Cadenazzo (CLL)', 'canton' => 'TI'),
+    '1919' => array('town' => 'Martigny Mutuel', 'canton' => 'VS'),
+    '8096' => array('town' => 'Zürich IBRS local', 'canton' => 'ZH'),
+    '4808' => array('town' => 'Zofingen PF', 'canton' => 'AG'),
+    '4807' => array('town' => 'Zofingen PF', 'canton' => 'AG'),
+    '1311' => array('town' => 'Eclépens SC', 'canton' => 'VD'),
+    '4611' => array('town' => 'Härkingen SC', 'canton' => 'SO'),
+    '8011' => array('town' => 'Zürich Mülligen SC', 'canton' => 'ZH'),
+    '8060' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '6333' => array('town' => 'Hünenberg See', 'canton' => 'ZG'),
+    '4809' => array('town' => 'Zofingen PF', 'canton' => 'AG'),
+    '8059' => array('town' => 'Zürich 59 EO', 'canton' => 'ZH'),
+    '3017' => array('town' => 'Bern Zustellung', 'canton' => 'BE'),
+    '9301' => array('town' => 'Wittenbach', 'canton' => 'SG'),
+    '6511' => array('town' => 'Cadenazzo SC', 'canton' => 'TI'),
+    '8074' => array('town' => 'Zürich Voice Pub', 'canton' => 'ZH'),
+    '3029' => array('town' => 'Bern Entris', 'canton' => 'BE'),
+    '7110' => array('town' => 'Peiden', 'canton' => 'GR'),
+    '8012' => array('town' => 'Zürich', 'canton' => 'ZH'),
+    '2360' => array('town' => 'Le Bémont', 'canton' => 'JU'),
+    '2362' => array('town' => 'Montfaucon', 'canton' => 'JU'),
+    '2363' => array('town' => 'Les Enfers', 'canton' => 'JU'),
+    '2364' => array('town' => 'St-Brais', 'canton' => 'JU'),
+    '8970' => array('town' => 'Urdorf Exchange', 'canton' => 'ZH'),
+  );
+
+  // Check if theres something for autocomplete
+  if (!empty($element['#value']) && (isset($data[$element['#value']]))) {
+    // Get the base #parents for this address form.
+    $base_parents = array_slice($element['#parents'], 0, -1);
+    $base_array_parents = array_slice($element['#array_parents'], 0, -2);
+
+    $city = $data[$element['#value']];
+
+    // Set the new values in the form.
+    drupal_array_set_nested_value($form_state['values'], array_merge($base_parents, array('locality')), $city['town'], TRUE);
+    drupal_array_set_nested_value($form_state['values'], array_merge($base_parents, array('administrative_area')), $city['canton'], TRUE);
+
+    // Discard value the user has already entered there.
+    drupal_array_set_nested_value($form_state['input'], array_merge($base_parents, array('locality')), NULL, TRUE);
+    drupal_array_set_nested_value($form_state['input'], array_merge($base_parents, array('administrative_area')), NULL, TRUE);
+  }
+}
diff --git a/htmltest/sites/all/modules/addressfield/plugins/format/address-hide-country.inc b/htmltest/sites/all/modules/addressfield/plugins/format/address-hide-country.inc
new file mode 100644
index 00000000..c826b000
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/plugins/format/address-hide-country.inc
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Hide the country when only one country is available.
+ */
+
+$plugin = array(
+  'title' => t('Hide the country when only one is available'),
+  'format callback' => 'addressfield_format_address_hide_country',
+  'type' => 'address',
+  'weight' => -80,
+);
+
+/**
+ * Format callback.
+ *
+ * @see CALLBACK_addressfield_format_callback()
+ */
+function addressfield_format_address_hide_country(&$format, $address, $context = array()) {
+  // When building the format for a form, we expect the country element to have
+  // an #options list. If it does, and there is only one option, hide the field
+  // by setting #access to FALSE.
+  if ($context['mode'] == 'form') {
+    if (!empty($format['country']['#options']) && count($format['country']['#options']) == 1) {
+      $format['country']['#access'] =  FALSE;
+    }
+  }
+  elseif ($context['mode'] == 'render') {
+    // However, in render mode, the element does not have an #options list, so
+    // we look instead in the field instance settings if given. If we find a
+    // single country option and it matches the country of the current address,
+    // go ahead and hide it.
+    if (!empty($context['instance']['widget']['settings']['available_countries']) &&
+      count($context['instance']['widget']['settings']['available_countries']) == 1) {
+      if (isset($context['instance']['widget']['settings']['available_countries'][$address['country']])) {
+        $format['country']['#access'] = FALSE;
+      }
+    }
+  }
+}
diff --git a/htmltest/sites/all/modules/addressfield/plugins/format/address.inc b/htmltest/sites/all/modules/addressfield/plugins/format/address.inc
new file mode 100644
index 00000000..d5426ad0
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/plugins/format/address.inc
@@ -0,0 +1,544 @@
+<?php
+
+/**
+ * @file
+ * The default format for adresses.
+ */
+
+$plugin = array(
+  'title' => t('Address form (country-specific)'),
+  'format callback' => 'addressfield_format_address_generate',
+  'type' => 'address',
+  'weight' => -100,
+);
+
+/**
+ * Format callback.
+ *
+ * @see CALLBACK_addressfield_format_callback()
+ */
+function addressfield_format_address_generate(&$format, $address, $context = array()) {
+  // We start with a reasonable default: a simple block format suitable
+  // for international shipping. We extend it with country-specific heuristics
+  // below.
+
+  // The street block.
+  $format['street_block'] = array(
+    '#type' => 'addressfield_container',
+    '#attributes' => array(
+      'class' => array('street-block'),
+    ),
+    '#weight' => 0,
+  );
+  $format['street_block']['thoroughfare'] = array(
+    '#title' => t('Address 1'),
+    '#tag' => 'div',
+    '#attributes' => array(
+      'class' => array('thoroughfare'),
+      'x-autocompletetype' => 'address-line1',
+      'autocomplete' => 'address-line1',
+    ),
+    '#size' => 30,
+    // The #required will be automatically set to FALSE when processing.
+    '#required' => TRUE,
+  );
+  $format['street_block']['premise'] = array(
+    '#title' => t('Address 2'),
+    '#tag' => 'div',
+    '#attributes' => array(
+      'class' => array('premise'),
+      'x-autocompletetype' => 'address-line2',
+      'autocomplete' => 'address-line2',
+    ),
+    '#size' => 30,
+  );
+  $format['locality_block'] = array(
+    '#type' => 'addressfield_container',
+    '#attributes' => array(
+      'class' => array('addressfield-container-inline', 'locality-block', 'country-' . $address['country']),
+    ),
+    '#weight' => 50,
+  );
+  $format['locality_block']['#attached']['css'][] = drupal_get_path('module', 'addressfield') . '/addressfield.css';
+  $format['locality_block']['postal_code'] = array(
+    '#title' => t('Postal code'),
+    '#size' => 10,
+    '#required' => TRUE,
+    '#attributes' => array(
+      'class' => array('postal-code'),
+      'x-autocompletetype' => 'postal-code',
+      'autocomplete' => 'postal-code',
+    ),
+  );
+  $format['locality_block']['locality'] = array(
+    '#title' => t('City'),
+    '#size' => 30,
+    '#required' => TRUE,
+    '#prefix' => ' ',
+    '#attributes' => array(
+      'class' => array('locality'),
+      'x-autocompletetype' => 'locality',
+      'autocomplete' => 'locality',
+    ),
+  );
+  $format['country'] = array(
+    '#title' => t('Country'),
+    '#options' => _addressfield_country_options_list(),
+    '#render_option_value' => TRUE,
+    '#required' => TRUE,
+    '#attributes' => array(
+      'class' => array('country'),
+      'x-autocompletetype' => 'country',
+      'autocomplete' => 'country',
+    ),
+    '#weight' => 100,
+  );
+
+  // Those countries do not seem to have a relevant postal code.
+  static $countries_no_postal_code = array('AF', 'AG', 'AL', 'AO', 'BB', 'BI', 'BJ', 'BO', 'BS', 'BW', 'BZ', 'CF', 'CG', 'CM', 'CO', 'DJ', 'DM', 'EG', 'ER', 'FJ', 'GD', 'GH', 'GM', 'GQ', 'GY', 'HK', 'IE', 'KI', 'KM', 'KP', 'KY', 'LC', 'LY', 'ML', 'MR', 'NA', 'NR', 'RW', 'SB', 'SC', 'SL', 'SR', 'ST', 'TD', 'TG', 'TL', 'TO', 'TT', 'TV', 'TZ', 'UG', 'VC', 'VU', 'WS', 'ZW');
+  if (in_array($address['country'], $countries_no_postal_code)) {
+    unset($format['locality_block']['postal_code']);
+
+    // Remove the prefix from the first widget of the block.
+    $element_children = element_children($format['locality_block']);
+    $first_child = reset($element_children);
+    unset($format['locality_block'][$first_child]['#prefix']);
+  }
+
+  // Those countries generally use the administrative area in postal addresses.
+  static $countries_administrative_area = array('AR', 'AU', 'BR', 'BS', 'BY', 'BZ', 'CA', 'CN', 'DO', 'EG', 'ES', 'FJ', 'FM', 'GB', 'HN', 'ID', 'IE', 'IN', 'IT', 'JO', 'JP', 'KI', 'KN', 'KR', 'KW', 'KY', 'KZ', 'MX', 'MY', 'MZ', 'NG', 'NI', 'NR', 'NZ', 'OM', 'PA', 'PF', 'PG', 'PH', 'PR', 'PW', 'RU', 'SM', 'SO', 'SR', 'SV', 'TH', 'TW', 'UA', 'US', 'UY', 'VE', 'VI', 'VN', 'YU', 'ZA');
+  if (in_array($address['country'], $countries_administrative_area)) {
+    $format['locality_block']['administrative_area'] = array(
+      '#title' => t('State', array(), array('context' => 'Territory of a country')),
+      '#size' => 10,
+      '#required' => TRUE,
+      '#prefix' => ' ',
+      '#attributes' => array(
+        'class' => array('state'),
+        'x-autocompletetype' => 'region',
+        'autocomplete' => 'region',
+      ),
+    );
+  }
+
+  // A few countries have a well-known list of administrative divisions.
+  if ($address['country'] == 'US') {
+    $format['locality_block']['administrative_area']['#options'] = array(
+      ''   => t('--'),
+      'AL' => t('Alabama'),
+      'AK' => t('Alaska'),
+      'AZ' => t('Arizona'),
+      'AR' => t('Arkansas'),
+      'CA' => t('California'),
+      'CO' => t('Colorado'),
+      'CT' => t('Connecticut'),
+      'DE' => t('Delaware'),
+      'DC' => t('District Of Columbia'),
+      'FL' => t('Florida'),
+      'GA' => t('Georgia'),
+      'HI' => t('Hawaii'),
+      'ID' => t('Idaho'),
+      'IL' => t('Illinois'),
+      'IN' => t('Indiana'),
+      'IA' => t('Iowa'),
+      'KS' => t('Kansas'),
+      'KY' => t('Kentucky'),
+      'LA' => t('Louisiana'),
+      'ME' => t('Maine'),
+      'MD' => t('Maryland'),
+      'MA' => t('Massachusetts'),
+      'MI' => t('Michigan'),
+      'MN' => t('Minnesota'),
+      'MS' => t('Mississippi'),
+      'MO' => t('Missouri'),
+      'MT' => t('Montana'),
+      'NE' => t('Nebraska'),
+      'NV' => t('Nevada'),
+      'NH' => t('New Hampshire'),
+      'NJ' => t('New Jersey'),
+      'NM' => t('New Mexico'),
+      'NY' => t('New York'),
+      'NC' => t('North Carolina'),
+      'ND' => t('North Dakota'),
+      'OH' => t('Ohio'),
+      'OK' => t('Oklahoma'),
+      'OR' => t('Oregon'),
+      'PA' => t('Pennsylvania'),
+      'RI' => t('Rhode Island'),
+      'SC' => t('South Carolina'),
+      'SD' => t('South Dakota'),
+      'TN' => t('Tennessee'),
+      'TX' => t('Texas'),
+      'UT' => t('Utah'),
+      'VT' => t('Vermont'),
+      'VA' => t('Virginia'),
+      'WA' => t('Washington'),
+      'WV' => t('West Virginia'),
+      'WI' => t('Wisconsin'),
+      'WY' => t('Wyoming'),
+      ' ' => t('--'),
+      'AA' => t('Armed Forces (Americas)'),
+      'AE' => t('Armed Forces (Europe, Canada, Middle East, Africa)'),
+      'AP' => t('Armed Forces (Pacific)'),
+      'AS' => t('American Samoa'),
+      'FM' => t('Federated States of Micronesia'),
+      'GU' => t('Guam'),
+      'MH' => t('Marshall Islands'),
+      'MP' => t('Northern Mariana Islands'),
+      'PW' => t('Palau'),
+      'PR' => t('Puerto Rico'),
+      'VI' => t('Virgin Islands'),
+    );
+    $format['locality_block']['postal_code']['#title'] = t('ZIP Code');
+
+    if ($context['mode'] == 'render') {
+      $format['locality_block']['locality']['#suffix'] = ',';
+    }
+  }
+  else if ($address['country'] == 'IT') {
+    $format['locality_block']['administrative_area']['#options'] = array(
+      '' => t('--'),
+      'AG' => t('Agrigento'),
+      'AL' => t('Alessandria'),
+      'AN' => t('Ancona'),
+      'AO' => t("Valle d'Aosta/Vallée d'Aoste"),
+      'AP' => t('Ascoli Piceno'),
+      'AQ' => t("L'Aquila"),
+      'AR' => t('Arezzo'),
+      'AT' => t('Asti'),
+      'AV' => t('Avellino'),
+      'BA' => t('Bari'),
+      'BG' => t('Bergamo'),
+      'BI' => t('Biella'),
+      'BL' => t('Belluno'),
+      'BN' => t('Benevento'),
+      'BO' => t('Bologna'),
+      'BR' => t('Brindisi'),
+      'BS' => t('Brescia'),
+      'BT' => t('Barletta-Andria-Trani'),
+      'BZ' => t('Bolzano/Bozen'),
+      'CA' => t('Cagliari'),
+      'CB' => t('Campobasso'),
+      'CE' => t('Caserta'),
+      'CH' => t('Chieti'),
+      'CI' => t('Carbonia-Iglesias'),
+      'CL' => t('Caltanissetta'),
+      'CN' => t('Cuneo'),
+      'CO' => t('Como'),
+      'CR' => t('Cremona'),
+      'CS' => t('Cosenza'),
+      'CT' => t('Catania'),
+      'CZ' => t('Catanzaro'),
+      'EN' => t('Enna'),
+      'FC' => t('Forlì-Cesena'),
+      'FE' => t('Ferrara'),
+      'FG' => t('Foggia'),
+      'FI' => t('Firenze'),
+      'FM' => t('Fermo'),
+      'FR' => t('Frosinone'),
+      'GE' => t('Genova'),
+      'GO' => t('Gorizia'),
+      'GR' => t('Grosseto'),
+      'IM' => t('Imperia'),
+      'IS' => t('Isernia'),
+      'KR' => t('Crotone'),
+      'LC' => t('Lecco'),
+      'LE' => t('Lecce'),
+      'LI' => t('Livorno'),
+      'LO' => t('Lodi'),
+      'LT' => t('Latina'),
+      'LU' => t('Lucca'),
+      'MB' => t('Monza e Brianza'),
+      'MC' => t('Macerata'),
+      'ME' => t('Messina'),
+      'MI' => t('Milano'),
+      'MN' => t('Mantova'),
+      'MO' => t('Modena'),
+      'MS' => t('Massa-Carrara'),
+      'MT' => t('Matera'),
+      'NA' => t('Napoli'),
+      'NO' => t('Novara'),
+      'NU' => t('Nuoro'),
+      'OG' => t('Ogliastra'),
+      'OR' => t('Oristano'),
+      'OT' => t('Olbia-Tempio'),
+      'PA' => t('Palermo'),
+      'PC' => t('Piacenza'),
+      'PD' => t('Padova'),
+      'PE' => t('Pescara'),
+      'PG' => t('Perugia'),
+      'PI' => t('Pisa'),
+      'PN' => t('Pordenone'),
+      'PO' => t('Prato'),
+      'PR' => t('Parma'),
+      'PT' => t('Pistoia'),
+      'PU' => t('Pesaro e Urbino'),
+      'PV' => t('Pavia'),
+      'PZ' => t('Potenza'),
+      'RA' => t('Ravenna'),
+      'RC' => t('Reggio di Calabria'),
+      'RE' => t("Reggio nell'Emilia"),
+      'RG' => t('Ragusa'),
+      'RI' => t('Rieti'),
+      'RM' => t('Roma'),
+      'RN' => t('Rimini'),
+      'RO' => t('Rovigo'),
+      'SA' => t('Salerno'),
+      'SI' => t('Siena'),
+      'SO' => t('Sondrio'),
+      'SP' => t('La Spezia'),
+      'SR' => t('Siracusa'),
+      'SS' => t('Sassari'),
+      'SV' => t('Savona'),
+      'TA' => t('Taranto'),
+      'TE' => t('Teramo'),
+      'TN' => t('Trento'),
+      'TO' => t('Torino'),
+      'TP' => t('Trapani'),
+      'TR' => t('Terni'),
+      'TS' => t('Trieste'),
+      'TV' => t('Treviso'),
+      'UD' => t('Udine'),
+      'VA' => t('Varese'),
+      'VB' => t('Verbano-Cusio-Ossola'),
+      'VC' => t('Vercelli'),
+      'VE' => t('Venezia'),
+      'VI' => t('Vicenza'),
+      'VR' => t('Verona'),
+      'VS' => t('Medio Campidano'),
+      'VT' => t('Viterbo'),
+      'VV' => t('Vibo Valentia'),
+    );
+    $format['locality_block']['administrative_area']['#title'] = t('Province');
+  }
+  elseif ($address['country'] == 'BR') {
+    $format['locality_block']['dependent_locality'] = array(
+      '#title' => t('Neighborhood'),
+      '#tag' => 'div',
+      '#attributes' => array('class' => array('dependent-locality')),
+      '#size' => 25,
+      '#render_option_value' => FALSE,
+    );
+    $format['locality_block']['administrative_area']['#render_option_value'] = TRUE;
+    $format['locality_block']['administrative_area']['#options'] = array(
+      '' => t('--'),
+      'AC' => t('Acre'),
+      'AL' => t('Alagoas'),
+      'AM' => t('Amazonas'),
+      'AP' => t('Amapá'),
+      'BA' => t('Bahia'),
+      'CE' => t('Ceará'),
+      'DF' => t('Distrito Federal'),
+      'ES' => t('Espírito Santo'),
+      'GO' => t('Goiás'),
+      'MA' => t('Maranhão'),
+      'MG' => t('Minas Gerais'),
+      'MS' => t('Mato Grosso do Sul'),
+      'MT' => t('Mato Grosso'),
+      'PA' => t('Pará'),
+      'PB' => t('Paraíba'),
+      'PE' => t('Pernambuco'),
+      'PI' => t('Piauí'),
+      'PR' => t('Paraná'),
+      'RJ' => t('Rio de Janeiro'),
+      'RN' => t('Rio Grande do Norte'),
+      'RO' => t('Rondônia'),
+      'RR' => t('Roraima'),
+      'RS' => t('Rio Grande do Sul'),
+      'SC' => t('Santa Catarina'),
+      'SE' => t('Sergipe'),
+      'SP' => t('São Paulo'),
+      'TO' => t('Tocantins'),
+    );
+    // Change some titles to make translation easier.
+    $format['street_block']['#attributes'] = array(
+      'class' => array('addressfield-container-inline'),
+    );
+    $format['street_block']['thoroughfare'] = array(
+      '#title' => t('Thoroughfare'),
+      '#tag'   => NULL,
+      '#attributes' => array('class' => array('thoroughfare')),
+      '#size' => 30,
+      // The #required will be automatically set to FALSE when processing.
+      '#required' => TRUE,
+    );
+    $format['street_block']['premise'] = array(
+      '#title' => t('Complement'),
+      '#tag' => NULL,
+      '#attributes' => array('class' => array('premise')),
+      '#size' => 20,
+      '#prefix' => ', ',
+    );
+    $format['locality_block']['locality']['#suffix'] = ' - ';
+    // Hide suffixes and prefixes while in form.
+    if ($context['mode'] == 'form') {
+      $format['street_block']['premise']['#prefix'] = NULL;
+      $format['street_block']['premise']['#suffix'] = NULL;
+      $format['locality_block']['locality']['#suffix'] = NULL;
+    }
+    // Render an extra field for 'Neighborhood'.
+    $format['locality_block']['dependent_locality']['#render_option_value'] = TRUE;
+    // Change some weights to conform local standards
+    // Neighborhood.
+    $format['locality_block']['dependent_locality']['#weight'] = 0;
+    // City.
+    $format['locality_block']['locality']['#weight'] = 5;
+    // State.
+    $format['locality_block']['administrative_area']['#weight'] = 10;
+    // Postal Code.
+    $format['locality_block']['postal_code']['#weight'] = 16;
+    $format['locality_block']['postal_code']['#tag'] = 'div';
+  }
+  else if ($address['country'] == 'CA') {
+    $format['locality_block']['administrative_area']['#options'] = array(
+      '' => t('--'),
+      'AB' => t('Alberta'),
+      'BC' => t('British Columbia'),
+      'MB' => t('Manitoba'),
+      'NB' => t('New Brunswick'),
+      'NL' => t('Newfoundland and Labrador'),
+      'NT' => t('Northwest Territories'),
+      'NS' => t('Nova Scotia'),
+      'NU' => t('Nunavut'),
+      'ON' => t('Ontario'),
+      'PE' => t('Prince Edward Island'),
+      'QC' => t('Quebec'),
+      'SK' => t('Saskatchewan'),
+      'YT' => t('Yukon Territory'),
+    );
+    $format['locality_block']['administrative_area']['#title'] = t('Province');
+
+    if ($context['mode'] == 'render') {
+      $format['locality_block']['locality']['#suffix'] = ',';
+    }
+  }
+  else if ($address['country'] == 'AU') {
+    $format['locality_block']['administrative_area']['#options'] = array(
+      '' => t('--'),
+      'ACT' => t('Australian Capital Territory'),
+      'NSW' => t('New South Wales'),
+      'NT' => t('Northern Territory'),
+      'QLD' => t('Queensland'),
+      'SA' => t('South Australia'),
+      'TAS' => t('Tasmania'),
+      'VIC' => t('Victoria'),
+      'WA' => t('Western Australia'),
+    );
+  }
+  else if ($address['country'] == 'NZ') {
+    $format['locality_block']['locality']['#title'] = ('Town/City');
+    $format['locality_block']['postal_code']['#title'] = t('Postcode');
+    $format['locality_block']['administrative_area']['#render_option_value'] = TRUE;
+    $format['locality_block']['administrative_area']['#title'] = t('Region');
+    $format['locality_block']['administrative_area']['#required'] = FALSE;
+    $format['locality_block']['administrative_area']['#options'] = array(
+      ''   => t('--'),
+      'AUK' => t('Auckland'),
+      'BOP' => t('Bay of Plenty'),
+      'CAN' => t('Canterbury'),
+      'HKB' => t("Hawke's Bay"),
+      'MWT' => t('Manawatu-Wanganui'),
+      'NTL' => t('Northland'),
+      'OTA' => t('Otago'),
+      'STL' => t('Southland'),
+      'TKI' => t('Taranaki'),
+      'WKO' => t('Waikato'),
+      'WGN' => t('Wellington'),
+      'WTC' => t('West Coast'),
+      'GIS' => t('Gisborne District'),
+      'MBH' => t('Marlborough District'),
+      'NSN' => t('Nelson'),
+      'TAS' => t('Tasman District'),
+      'CIT' => t('Chatham Islands Territory'),
+    );
+  }
+
+  // Those countries tend to put the postal code after the locality.
+  static $countries_postal_code_after_locality = array('AU', 'BD', 'BF', 'BH', 'BM', 'BN', 'BT', 'CA', 'FM', 'GB', 'ID', 'IN', 'JM', 'JO', 'KH', 'LB', 'LS', 'LV', 'MM', 'MN', 'MV', 'MW', 'NG', 'NP', 'NZ', 'PE', 'PK', 'PR', 'PW', 'SA', 'SG', 'SO', 'TH', 'US', 'VI', 'VG', 'VN');
+  if (in_array($address['country'], $countries_postal_code_after_locality)) {
+    // Take the widget out of the array.
+    $postal_code_widget = $format['locality_block']['postal_code'];
+    $postal_code_widget['#prefix'] = ' ';
+    unset($format['locality_block']['postal_code']);
+
+    // Add it back.
+    $format['locality_block']['postal_code'] = $postal_code_widget;
+
+    // Remove the prefix from the first widget of the block.
+    $element_children = element_children($format['locality_block']);
+    $first_child = reset($element_children);
+    unset($format['locality_block'][$first_child]['#prefix']);
+  }
+
+  // GB-specific tweaks
+  if ($address['country'] == 'GB') {
+    // Locality
+    $format['locality_block']['locality'] = array_merge(
+      $format['locality_block']['locality'],
+      array(
+        '#title' => t('Town/City'),
+        '#weight' => 40,
+        '#prefix' => '',
+        '#tag' => 'div',
+      )
+    );
+
+    // Administrative
+    $format['locality_block']['administrative_area'] = array_merge(
+      $format['locality_block']['administrative_area'],
+      array(
+        '#title' => t('County'),
+        '#required' => FALSE,
+        '#weight' => 50,
+        '#size' => 30,
+        '#prefix' => '',
+        '#tag' => 'div',
+      )
+    );
+
+    // Postal code
+    $format['locality_block']['postal_code'] = array_merge(
+      $format['locality_block']['postal_code'],
+      array(
+        '#title' => t('Postcode'),
+        '#weight' => 60,
+        '#prefix' => '',
+        '#tag' => 'div',
+      )
+    );
+  }
+
+  if ($context['mode'] == 'form') {
+    // Provide a wrapper ID for AJAX replacement based on country selection.
+    if (!isset($format['#wrapper_id'])) {
+      $format['#wrapper_id'] = drupal_html_id('addressfield-wrapper');
+      $format['#prefix'] = '<div id="' . $format['#wrapper_id'] . '">';
+      $format['#suffix'] = '</div>';
+    }
+
+    // Form mode, move the country selector to the top of the form.
+    $format['country']['#weight'] = -10;
+
+    // Limit it to the countries supported by the widget.
+    if (isset($context['field'])) {
+      $format['country']['#options'] = _addressfield_country_options_list($context['field'], $context['instance']);
+    }
+
+    // AJAX enable it.
+    $format['country']['#ajax'] = array(
+      'callback' => 'addressfield_standard_widget_refresh',
+      'wrapper' => $format['#wrapper_id'],
+    );
+    $format['country']['#element_validate'] = array('addressfield_standard_country_validate');
+    // Don't validate any element when the country is changed.
+    $format['country']['#limit_validation_errors'] = array();
+
+    if (isset($context['delta']) && $context['delta'] > 0) {
+      // On subsequent elements of a field, we make the country field non
+      // required and add a ' - None - ' option to it, so as to allow the
+      // user to remove the address by clearing the country field.
+      $format['country']['#required'] = FALSE;
+      $format['country']['#empty_value'] = '';
+    }
+  }
+}
diff --git a/htmltest/sites/all/modules/addressfield/plugins/format/name-full.inc b/htmltest/sites/all/modules/addressfield/plugins/format/name-full.inc
new file mode 100644
index 00000000..84d7316b
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/plugins/format/name-full.inc
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Generates a first name + last name format.
+ */
+
+$plugin = array(
+  'title' => t('Name (First name, Last name)'),
+  'format callback' => 'addressfield_format_name_full_generate',
+  'type' => 'name',
+  'weight' => 0,
+);
+
+/**
+ * Format callback.
+ *
+ * @see CALLBACK_addressfield_format_callback()
+ */
+function addressfield_format_name_full_generate(&$format, $address) {
+  $format['name_block'] = array(
+    '#type' => 'addressfield_container',
+    '#attributes' => array(
+      'class' => array('addressfield-container-inline', 'name-block'),
+    ),
+    '#weight' => -100,
+  );
+  $format['name_block']['first_name'] = array(
+    '#title' => t('First name'),
+    '#size' => 30,
+    '#required' => TRUE,
+    '#attributes' => array(
+      'class' => array('first-name'),
+      'x-autocompletetype' => 'given-name',
+      'autocomplete' => 'given-name',
+    ),
+  );
+  $format['name_block']['last_name'] = array(
+    '#title' => t('Last name'),
+    '#size' => 30,
+    '#required' => TRUE,
+    '#prefix' => ' ',
+    '#attributes' => array(
+      'class' => array('last-name'),
+      'x-autocompletetype' => 'family-name',
+      'autocomplete' => 'family-name',
+    ),
+  );
+}
diff --git a/htmltest/sites/all/modules/addressfield/plugins/format/name-oneline.inc b/htmltest/sites/all/modules/addressfield/plugins/format/name-oneline.inc
new file mode 100644
index 00000000..14324a5c
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/plugins/format/name-oneline.inc
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Generates a first name + last name format.
+ */
+
+$plugin = array(
+  'title' => t('Name (single line)'),
+  'format callback' => 'addressfield_format_name_oneline_generate',
+  'type' => 'name',
+  'weight' => 0,
+);
+
+/**
+ * Format callback.
+ *
+ * @see CALLBACK_addressfield_format_callback()
+ */
+function addressfield_format_name_oneline_generate(&$format, $address) {
+  $format['name_block'] = array(
+    '#type' => 'addressfield_container',
+    '#attributes' => array('class' => array('addressfield-container-inline', 'name-block')),
+    '#weight' => -100,
+  );
+  $format['name_block']['name_line'] = array(
+    '#title' => t('Full name'),
+    '#tag' => 'div',
+    '#attributes' => array(
+      'class' => array('name-block'),
+      'x-autocompletetype' => 'name',
+      'autocomplete' => 'name',
+    ),
+    '#size' => 30,
+    '#required' => TRUE,
+  );
+}
diff --git a/htmltest/sites/all/modules/addressfield/plugins/format/organisation.inc b/htmltest/sites/all/modules/addressfield/plugins/format/organisation.inc
new file mode 100644
index 00000000..9edb290b
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/plugins/format/organisation.inc
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @file
+ * Generates a first name + last name format.
+ */
+
+$plugin = array(
+  'title' => t('Organisation (single line)'),
+  'format callback' => 'addressfield_format_organisation_generate',
+  'type' => 'organisation',
+  'weight' => -10,
+);
+
+/**
+ * Format callback.
+ *
+ * @see CALLBACK_addressfield_format_callback()
+ */
+function addressfield_format_organisation_generate(&$format, $address) {
+  $format['organisation_block'] = array(
+    '#type' => 'addressfield_container',
+    '#attributes' => array('class' => array('addressfield-container-inline', 'name-block')),
+    '#weight' => -50,
+  );
+  $format['organisation_block']['organisation_name'] = array(
+    '#title' => t('Company'),
+    '#size' => 30,
+    '#attributes' => array(
+      'class' => array('organisation-name'),
+      'x-autocompletetype' => 'organization',
+      'autocomplete' => 'organization',
+    ),
+  );
+}
diff --git a/htmltest/sites/all/modules/addressfield/views/addressfield.views.inc b/htmltest/sites/all/modules/addressfield/views/addressfield.views.inc
new file mode 100644
index 00000000..2f8f4e73
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/views/addressfield.views.inc
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * Implements hook_field_views_data().
+ */
+function addressfield_field_views_data($field) {
+  $data = field_views_field_default_views_data($field);
+
+  // Add a filter handler for countries.
+  $key = key($field['storage']['details']);
+  foreach ($field['storage']['details'][$key] as $type => $tables) {
+    foreach ($tables as $table_name => $columns) {
+      if (!isset($columns['country'])) {
+        continue;
+      }
+
+      $column_real_name = $columns['country'];
+      if (!isset($data[$table_name][$column_real_name]['filter'])) {
+        continue;
+      }
+
+      $data[$table_name][$column_real_name]['filter']['handler'] = 'addressfield_views_handler_filter_country';
+    }
+  }
+
+  // Only expose these components as Views field handlers.
+  $implemented = array(
+    'country' => 'addressfield_views_handler_field_country',
+    'administrative_area' => 'views_handler_field',
+    'locality' => 'views_handler_field',
+    'postal_code' => 'views_handler_field',
+    'thoroughfare' => 'views_handler_field',
+    'premise' => 'views_handler_field',
+    'organisation_name' => 'views_handler_field',
+    'name_line' => 'views_handler_field',
+    'first_name' => 'views_handler_field',
+    'last_name' => 'views_handler_field',
+  );
+
+  // Get the translated field information.
+  $properties = addressfield_data_property_info();
+
+  // Iterate over addressfield defined tables.
+  foreach ($data as &$table) {
+    // Make sure the parent Views field (addressfield) is defined.
+    if (isset($table[$field['field_name']]['field'])) {
+      // Use the parent field definition as a template for component columns.
+      $field_def = $table[$field['field_name']]['field'];
+
+      // Remove 'additional fields' from the field definition. We don't
+      // necessarily want all our sibling columns.
+      unset($field_def['additional fields']);
+
+      // Define the valid columns.
+      $valid_columns = array();
+      foreach ($implemented as $implement => $handler) {
+        $column_name = $field['field_name'] . '_' . $implement;
+        $valid_columns[$column_name] = $handler;
+      }
+
+      // Iterate over the addressfield components.
+      foreach ($table as $column_name => &$column) {
+        if (empty($column['field']) && isset($valid_columns[$column_name])) {
+          // Assign the default component definition.
+          $column['field'] = $field_def;
+          $column['field']['real field'] = $column_name;
+          $column['field']['handler'] = $valid_columns[$column_name];
+
+          // Assign human-friendly field labels for addressfield components.
+          $field_labels = field_views_field_label($field['field_name']);
+          $field_label = array_shift($field_labels);
+          $property = str_replace($field_def['field_name'] . '_', '', $column_name);
+
+          if (!empty($properties[$property])) {
+            $property_label = $properties[$property]['label'];
+
+            $title = t('@field-label - @property-label', array(
+              '@field-label' => $field_label,
+              '@property-label' => $property_label,
+            ));
+
+            $column['title'] = $title;
+            $column['title short'] = $title;
+          }
+        }
+      }
+    }
+  }
+
+  return $data;
+}
diff --git a/htmltest/sites/all/modules/addressfield/views/addressfield_views_handler_field_country.inc b/htmltest/sites/all/modules/addressfield/views/addressfield_views_handler_field_country.inc
new file mode 100644
index 00000000..65ca79d3
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/views/addressfield_views_handler_field_country.inc
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Defines a field handler that can display the country name instead of the two
+ * character country code for an address field country value.
+ */
+class addressfield_views_handler_field_country extends views_handler_field {
+
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['display_name'] = array('default' => TRUE);
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+
+    $form['display_name'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Display the localized country name instead of the two character country code'),
+      '#default_value' => $this->options['display_name'],
+    );
+  }
+
+  function get_value($values, $field = NULL) {
+    $value = parent::get_value($values, $field);
+
+    // If we have a value for the field, look for the country name in the
+    // Address Field options list array if specified.
+    if (!empty($value) && !empty($this->options['display_name'])) {
+      $countries = _addressfield_country_options_list();
+
+      if (!empty($countries[$value])) {
+        $value = $countries[$value];
+      }
+    }
+
+    return $value;
+  }
+}
diff --git a/htmltest/sites/all/modules/addressfield/views/addressfield_views_handler_filter_country.inc b/htmltest/sites/all/modules/addressfield/views/addressfield_views_handler_filter_country.inc
new file mode 100644
index 00000000..d1b11c19
--- /dev/null
+++ b/htmltest/sites/all/modules/addressfield/views/addressfield_views_handler_filter_country.inc
@@ -0,0 +1,9 @@
+<?php
+
+class addressfield_views_handler_filter_country extends views_handler_filter_in_operator {
+  function get_value_options() {
+    $this->value_title = t('Country');
+    $field = field_info_field($this->definition['field_name']);
+    $this->value_options = _addressfield_country_options_list($field);
+  }
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/modules/addthis/CHANGELOG.txt b/htmltest/sites/all/modules/addthis/CHANGELOG.txt
new file mode 100644
index 00000000..04a302fd
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/CHANGELOG.txt
@@ -0,0 +1,21 @@
+Added namespace adding for Facebook Like.
+Added counter bubble orientation in Basic Toolbox display type.
+Fixed getDisplayTypes() to work with blocks. Also provide default settings always.
+Add t() to description of Google Analytics elements in config page.
+
+Removed legacy display types.
+  AddThis module contained some small non generic display types. They where
+  removed in favor of the display types added in the addthis_displays submodule.
+
+Redesigned the config page.
+  The settings page has been made more condensed and options have been merged
+  into clear categories. There are some options that where removed because of
+  legacy functionality that is now support inside the display types.
+
+Fixed default value for ui_co_brand setting.
+Added alter hook for configuration.
+Added alter hook for markup options.
+Added alter hook for markup render array.
+Fixed async loading of widget.js.
+Fix for #1308970 reported by vasike,fixed by matglas86. Error in block configure.
+Changed dir name for submodule from addthis_display to addthis_displays.
diff --git a/htmltest/sites/all/modules/addthis/LICENSE.txt b/htmltest/sites/all/modules/addthis/LICENSE.txt
new file mode 100644
index 00000000..d159169d
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/LICENSE.txt
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/htmltest/sites/all/modules/addthis/README.txt b/htmltest/sites/all/modules/addthis/README.txt
new file mode 100644
index 00000000..a388012c
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/README.txt
@@ -0,0 +1,41 @@
+
+-- SUMMARY --
+
+Add This module provides Drupal integration to addthis.com link sharing service. Integration has been implemented as a field.
+
+Description from addthis.com: 
+The AddThis button spreads your content across the Web by making it easier for your visitors to bookmark and
+share it with other people, again... and again... and again. This simple yet powerful button is very easy to 
+install and provides valuable Analytics about the bookmarking and sharing activity of your users. AddThis helps 
+your visitors create a buzz for your site and increase its popularity and ranking.
+
+AddThis is already on hundreds of thousands of websites including SAP, TIME Magazine, Oracle, Freewebs, 
+Entertainment Weekly, Topix, Lonely Planet, MapQuest, MySpace, PGA Tour, Tower Records, Squidoo, Zappos, Funny 
+or Die, FOX, ABC, CBS, Glamour, PostSecret, WebMD, American Idol, and ReadWriteWeb, just to name a few. Each 
+month our button is displayed 20 billion times.
+
+-- REQUIREMENTS --
+
+Field, Block
+
+-- INSTALLATION --
+
+Normal Drupal module installation, see http://drupal.org/node/70151 for further information.
+
+For link sharing statistics registration at http://addthis.com/ is required, but the module will work even without registration.
+
+-- CONFIGURATION --
+
+Use the admin configuration page to configure settings and see http://drupal.org/node/1309922
+for a walkthrough on how to configure the rest.
+
+
+-- CONTACT --
+
+Current maintainers:
+* Vesa Palmu (wesku) - http://drupal.org/user/75070
+* Jani Palsamäki (janip) - http://drupal.org/user/1356218
+* Matthias Glastra (matglas86) - http://drupal.org/user/573464
+
+Major contributions by:
+Lesmana Lim (lesmana) - http://drupal.org/user/84263
diff --git a/htmltest/sites/all/modules/addthis/TODO.txt b/htmltest/sites/all/modules/addthis/TODO.txt
new file mode 100644
index 00000000..3d751423
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/TODO.txt
@@ -0,0 +1,7 @@
+- Update README.txt to refer to the addthis.api.php for implementation options.
+- Write addthis.api.php file with example of implementation.
+- Add custom button with upload functionality for a custom button image.
+- Move basic button to main module to provide a basic implementation.
+- Create a column view of the services on the settings page.
+- Create asynchronous load checkbox in settings page.
+- Refactor the order of methods in the AddThis class to collect same type of methods.
diff --git a/htmltest/sites/all/modules/addthis/addthis.addthis.inc b/htmltest/sites/all/modules/addthis/addthis.addthis.inc
new file mode 100644
index 00000000..fc491505
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/addthis.addthis.inc
@@ -0,0 +1,15 @@
+<?php
+/**
+ * @file
+ * This file contains the definitions for the AddThis Display types and the
+ * rendering of markup.
+ */
+
+/**
+ * Implements hook_addthis_display_markup().
+ */
+function addthis_addthis_display_markup($display, $variables = NULL) {
+  return array();
+}
+
+// @todo Move the basic button implementation over here.
diff --git a/htmltest/sites/all/modules/addthis/addthis.admin.css b/htmltest/sites/all/modules/addthis/addthis.admin.css
new file mode 100644
index 00000000..d888579a
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/addthis.admin.css
@@ -0,0 +1,4 @@
+.addthis_service_icon {
+  display: inline-block;
+  padding-left: 20px;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/modules/addthis/addthis.api.php b/htmltest/sites/all/modules/addthis/addthis.api.php
new file mode 100644
index 00000000..9637126f
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/addthis.api.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * @file
+ * This is currently a stub file that will be used to describe the addthis
+ * implementation API.
+ */
+
+/**
+ * Implements hook_TYPE_alter().
+ *
+ * @param array $options
+ *   $options contains an array with configurations settings for used in the
+ *   creation of the markup. The following elements may be in here.
+ *
+ *   - '#entity_type': The entity type this markup is define when called by a
+ *                     field.
+ *   - '#entity': Is the entity object when called by a field.
+ *   - '#display': Is always defined and provide all the formatter
+ *                 configuration.
+ *   - '#url': The link to the entity when the entity has a url.
+ */
+function hook_addthis_markup_options_alter(&$options) {
+  global $base_root;
+
+  // Change the url used on the share buttons.
+  $options['#url'] = $base_root . request_uri();
+
+  // To apply different service this to the block implementation try this.
+  if (isset($options['#block']) && $options['#display']['type'] == 'addthis_basic_toolbox') {
+
+    // Change the var below to add other services.
+    $displayed_services = 'twitter,google_plusone,facebook';
+    $options['#display']['settings']['share_services'] = $displayed_services;
+    $options['#display']['settings']['buttons_size'] = AddThis::CSS_16x16;
+
+  }
+}
+
+/**
+ * Implements hook_TYPE_alter().
+ *
+ * @param array $markup
+ *   $markup contains an array with the structure of the addthis markup.
+ */
+function hook_addthis_markup_alter(&$markup) {
+
+  // Let's add a custom CSS class for given a particular design to our
+  // twitter button, so we can change the look.
+  if (!empty($markup['twitter'])) {
+    $markup['twitter']['#attributes']['class'][] = "custom_twitter_class";
+  }
+
+  // Or change button size for Google +1 for example.
+  if (!empty($markup['google_plusone'])) {
+    $markup['google_plusone']['#attributes']['g:plusone:size'] = 'small';
+  }
+}
diff --git a/htmltest/sites/all/modules/addthis/addthis.info b/htmltest/sites/all/modules/addthis/addthis.info
new file mode 100644
index 00000000..1ad64d85
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/addthis.info
@@ -0,0 +1,22 @@
+name = AddThis
+description = AddThis.com provides an easy way to share your content across the web.
+core = 7.x
+package = Sharing
+dependencies[] = block
+dependencies[] = field
+files[] = addthis.module
+files[] = addthis.install
+files[] = addthis.test
+files[] = includes/addthis.admin.inc
+files[] = includes/addthis.block.inc
+files[] = includes/addthis.field.inc
+files[] = classes/AddThis.php
+files[] = classes/AddThisJson.php
+configure = admin/config/user-interface/addthis
+
+; Information added by drupal.org packaging script on 2013-01-30
+version = "7.x-4.0-alpha2"
+core = "7.x"
+project = "addthis"
+datestamp = "1359545712"
+
diff --git a/htmltest/sites/all/modules/addthis/addthis.install b/htmltest/sites/all/modules/addthis/addthis.install
new file mode 100644
index 00000000..b58aeac6
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/addthis.install
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the AddThis module.
+ */
+
+// We need some constant values from the AddThis class.
+include_once('classes/AddThis.php');
+
+/**
+ * Implements hook_field_schema().
+ */
+function addthis_field_schema($field) {
+  $schema = array();
+  if ($field['type'] == AddThis::FIELD_TYPE) {
+    $columns = array(
+      'value' => array(
+        'type' => 'varchar',
+        'length' => $field['settings']['max_length'],
+        'not null' => FALSE,
+      ),
+    );
+    $schema = array(
+      'columns' => $columns,
+      'indexes' => array(),
+      'foreign keys' => array(),
+    );
+  }
+  return $schema;
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function addthis_uninstall() {
+  variable_del(AddThis::ADDRESSBOOK_ENABLED_KEY);
+  variable_del(AddThis::BLOCK_WIDGET_TYPE_KEY);
+  variable_del(AddThis::BOOKMARK_URL_KEY);
+  variable_del(AddThis::CLICKBACK_TRACKING_ENABLED_KEY);
+  variable_del(AddThis::CLICK_TO_OPEN_COMPACT_MENU_ENABLED_KEY);
+  variable_del(AddThis::CO_BRAND_KEY);
+  variable_del(AddThis::COMPLIANT_508_KEY);
+  variable_del(AddThis::CUSTOM_CONFIGURATION_CODE_ENABLED_KEY);
+  variable_del(AddThis::CUSTOM_CONFIGURATION_CODE_KEY);
+  variable_del(AddThis::ENABLED_SERVICES_KEY);
+  variable_del(AddThis::OPEN_WINDOWS_ENABLED_KEY);
+  variable_del(AddThis::PROFILE_ID_KEY);
+  variable_del(AddThis::SERVICES_CSS_URL_KEY);
+  variable_del(AddThis::SERVICES_JSON_URL_KEY);
+  variable_del(AddThis::STANDARD_CSS_ENABLED_KEY);
+  variable_del(AddThis::UI_DELAY_KEY);
+  variable_del(AddThis::UI_HEADER_BACKGROUND_COLOR_KEY);
+  variable_del(AddThis::UI_HEADER_COLOR_KEY);
+  variable_del(AddThis::WIDGET_JS_URL_KEY);
+}
diff --git a/htmltest/sites/all/modules/addthis/addthis.js b/htmltest/sites/all/modules/addthis/addthis.js
new file mode 100644
index 00000000..1705eee2
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/addthis.js
@@ -0,0 +1,18 @@
+(function ($) {
+
+  Drupal.behaviors.addthis = {
+    attach: function(context, settings) {
+      $.getScript(
+        Drupal.settings.addthis.widget_url,
+        function(data, textStatus) {
+          addthis.init();
+        }
+      );
+      if (context != window.document && window.addthis != null) {
+        window.addthis.ost = 0;
+        window.addthis.ready();
+      }
+    }
+  };
+
+}(jQuery));
diff --git a/htmltest/sites/all/modules/addthis/addthis.module b/htmltest/sites/all/modules/addthis/addthis.module
new file mode 100644
index 00000000..2988ac5c
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/addthis.module
@@ -0,0 +1,203 @@
+<?php
+/**
+ * @file
+ * Hook implementations for the AddThis-module. Most of the logic is defined
+ * in a separate AddThis-class to keep the .module-file clean.
+ */
+
+module_load_include('inc', 'addthis', 'includes/addthis.block');
+module_load_include('inc', 'addthis', 'includes/addthis.field');
+
+/**
+ * Implements hook_hook_info().
+ *
+ * Define hook_addthis_display_markup in the addthis group so that
+ * $module.addthis.inc files will be included. See addthis.addthis.inc for
+ * examples of the hook implementation.
+ */
+function addthis_hook_info() {
+  $hooks['addthis_display_markup'] = array(
+    'group' => 'addthis',
+  );
+  return $hooks;
+}
+
+/**
+ * Implements hook_help().
+ */
+function addthis_help($path, $arg) {
+  switch ($path) {
+    case 'admin/help#addthis':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>';
+      $output .= t('The AddThis module defines AddThis field type for the Field module. A AddThis field may contain a button, toolbox, sharecount or customized sharing tool using <a href="http://addthis.com/">AddThis.com</a>.');
+      $output .= '</p>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_filter_format_update().
+ */
+function addthis_filter_format_update($format) {
+  field_cache_clear();
+}
+
+/**
+ * Implements hook_filter_format_disable().
+ */
+function addthis_filter_format_disable($format) {
+  field_cache_clear();
+}
+
+
+/**
+ * Implements hook_menu().
+ */
+function addthis_menu() {
+  $menu_items['admin/config/user-interface/addthis'] = array(
+    'title' => 'AddThis',
+    'description' => 'Configure AddThis settings.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('addthis_admin_settings_form'),
+    'access arguments' => array(AddThis::PERMISSION_ADMINISTER_ADDTHIS),
+    'type' => MENU_NORMAL_ITEM,
+    'file' => AddThis::ADMIN_INCLUDE_FILE,
+    'weight' => 0,
+  );
+  $menu_items['admin/config/user-interface/addthis/basic'] = array(
+    'title' => t('Basic settings'),
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $menu_items['admin/config/user-interface/addthis/advanced'] = array(
+    'title' => t('Advanced settings'),
+    'type' => MENU_LOCAL_TASK,
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('addthis_admin_settings_advanced_form'),
+    'access arguments' => array(AddThis::PERMISSION_ADMINISTER_ADDTHIS),
+    'file' => AddThis::ADMIN_INCLUDE_FILE,
+    'weight' => 10
+  );
+  return $menu_items;
+}
+
+/**
+ * Implements hook_permission().
+ */
+function addthis_permission() {
+  return array(
+    AddThis::PERMISSION_ADMINISTER_ADDTHIS => array(
+      'title' => t('Administer AddThis'),
+      'description' => t('Perform maintenance tasks for AddThis.'),
+    ),
+    AddThis::PERMISSION_ADMINISTER_ADVANCED_ADDTHIS => array(
+      'title' => t('Administer advanced AddThis'),
+      'description' => t('Perform advanced maintenance tasks for AddThis.'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_page_alter().
+ */
+function addthis_page_alter(&$page) {
+  AddThis::getInstance()->addWidgetJs();
+  AddThis::getInstance()->addConfigurationOptionsJs();
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Hide the instance fieldset because there aren't any values per instance.
+ */
+function addthis_form_field_ui_field_edit_form_alter(&$form, &$form_state, $form_id) {
+  if ($form['#field']['type'] == AddThis::FIELD_TYPE && $form['#field']['type'] == AddThis::MODULE_NAME) {
+    $form['field']['#access'] = FALSE;
+    $form['instance']['required']['#access'] = FALSE;
+    $form['instance']['description']['#access'] = FALSE;
+    $form['instance']['default_value_widget']['#access'] = FALSE;
+  }
+}
+
+/**
+ * Implements hook_rdf_namespaces().
+ */
+function addthis_rdf_namespaces() {
+  if (AddThis::getInstance()->isFacebookLikeCountSupportEnabled()) {
+    return array(
+      'fb' => 'http://www.facebook.com/2008/fbml',
+    );
+  }
+  return array();
+}
+
+/**
+ * Implements hook_theme().
+ */
+function addthis_theme($existing, $type, $theme, $path) {
+  return array(
+    'addthis_wrapper' => array(
+      'render element' => 'addthis_wrapper',
+    ),
+    'addthis_element' => array(
+      'render element' => 'addthis_element',
+    ),
+    'addthis' => array(
+      'render element' => 'addthis',
+    ),
+  );
+}
+
+/**
+ * Implements hook_preprocess() for theme_addthis.
+ */
+function template_preprocess_addthis(&$variables) {
+  if (isset($variables[0]) && count($variables) == 3) {
+    $variables['#display'] = $variables[0];
+    unset($variables[0]);
+  }
+}
+
+function theme_addthis($variables) {
+  $markup = AddThis::getInstance()->getDisplayMarkup($variables['#display']);
+  return render($markup);
+}
+
+function theme_addthis_wrapper($variables) {
+  $element = $variables['addthis_wrapper'];
+  $output = '<' . $element['#tag'] . drupal_attributes($element['#attributes']) . '>';
+  $children = element_children($element);
+
+  if (count($children) > 0) {
+    foreach ($children as $child) {
+      $output .= render($element[$child]);
+    }
+  }
+
+  $output .= '</' . $element['#tag'] . ">\n";
+  return $output;
+}
+
+/**
+ * Theme the elements that are created in the AddThis module.
+ *
+ * This is created with hook_addthis_element.
+ */
+function theme_addthis_element($variables) {
+  $element = $variables['addthis_element'];
+
+  if (!isset($element['#value'])) {
+    return '<' . $element['#tag'] . drupal_attributes($element['#attributes']) . " />\n";
+  }
+
+  $output = '<' . $element['#tag'] . drupal_attributes($element['#attributes']) . '>';
+  if (isset($element['#value_prefix'])) {
+    $output .= $element['#value_prefix'];
+  }
+  $output .= $element['#value'];
+  if (isset($element['#value_suffix'])) {
+    $output .= $element['#value_suffix'];
+  }
+  $output .= '</' . $element['#tag'] . ">\n";
+  return $output;
+}
diff --git a/htmltest/sites/all/modules/addthis/addthis.test b/htmltest/sites/all/modules/addthis/addthis.test
new file mode 100644
index 00000000..8ce0f10f
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/addthis.test
@@ -0,0 +1,336 @@
+<?php
+
+/**
+ * @file
+ * Tests for the AddThis-module.
+ */
+
+class AddThisFunctionalityTestCase extends DrupalWebTestCase {
+
+  private $user;
+
+  public function setUp() {
+    parent::setUp(AddThis::MODULE_NAME);
+    $this->createAndLoginUser();
+  }
+
+  public function getInfo() {
+    return array(
+      'name' => 'AddThis: Functionality tests',
+      'description' => 'Functionality tests for the AddThis-module.',
+      'group' => 'AddThis',
+    );
+  }
+
+  public function testFunctionality() {
+    $this->addThisShouldProvideHelp();
+
+    $this->addThisShouldDefineField();
+
+    $this->addThisShouldDefineBlock();
+
+    $this->addThisShouldBeAbleToBeUsedAsField();
+
+    $this->addThisSystemSettingsShouldBeAbleToBeSaved();
+  }
+
+  private function addThisShouldProvideHelp() {
+    $helpText = module_invoke(AddThis::MODULE_NAME, 'help', 'admin/help#addthis', NULL);
+    $this->assertTrue(TestHelper::stringContains($helpText, t('About')), 'AddThis-module should provide help.');
+  }
+
+  private function addThisShouldDefineField() {
+    $fieldInfo = module_invoke(AddThis::MODULE_NAME, 'field_info');
+    $this->assertTrue(is_array($fieldInfo), t('AddThis-module should define a field.'));
+  }
+
+  private function addThisShouldDefineBlock() {
+    $blockInfo = module_invoke(AddThis::MODULE_NAME, 'block_info');
+    $this->assertTrue(is_array($blockInfo), t('AddThis-module should define a block.'));
+  }
+
+  private function addThisShouldBeAbleToBeUsedAsField() {
+    $edit = array();
+    $label = TestHelper::generateRandomLowercaseString();
+    $edit["fields[_add_new_field][label]"] = $label;
+    $edit["fields[_add_new_field][field_name]"] = $label;
+    $edit["fields[_add_new_field][type]"] = AddThis::FIELD_TYPE;
+    $edit["fields[_add_new_field][widget_type]"] = AddThis::WIDGET_TYPE;
+
+    $this->drupalPost('admin/structure/types/manage/article/fields', $edit, t('Save'));
+
+    $this->assertText($label, 'AddThis-module should be able to be added as a field.');
+
+    $this->addThisShouldNotHaveConfigurableFieldLevelSettings($label);
+
+    $this->drupalGet('admin/structure/types/manage/article/display');
+  }
+
+  private function addThisShouldNotHaveConfigurableFieldLevelSettings($label) {
+    $this->assertText(t("@name has no field settings.", array('@name' => $label)),
+                     'AddThis-module should not have configurable field level settings.');
+  }
+
+  private function addThisSystemSettingsShouldBeAbleToBeSaved() {
+    $edit_basic = array();
+
+    // Basic settings
+    $profileId = TestHelper::generateRandomLowercaseString();
+    $edit_basic[AddThis::PROFILE_ID_KEY] = $profileId;
+
+    $uiDelay = 400;
+    $edit_basic[AddThis::UI_DELAY_KEY] = $uiDelay;
+
+    $uiHeaderBackgroundColor = '#000000';
+    $edit_basic[AddThis::UI_HEADER_BACKGROUND_COLOR_KEY] = $uiHeaderBackgroundColor;
+
+    $uiHeaderColor = '#ffffff';
+    $edit_basic[AddThis::UI_HEADER_COLOR_KEY] = $uiHeaderColor;
+
+    $coBrand = TestHelper::generateRandomLowercaseString();
+    $edit_basic[AddThis::CO_BRAND_KEY] = $coBrand;
+
+    $edit_basic[AddThis::COMPLIANT_508_KEY] = TRUE;
+
+    $edit[AddThis::CLICKBACK_TRACKING_ENABLED_KEY] = TRUE;
+
+    // Can only be tested with Google Analytics module installed.
+    //$edit_basic[AddThis::GOOGLE_ANALYTICS_TRACKING_ENABLED_KEY] = TRUE;
+
+    //$edit_basic[AddThis::GOOGLE_ANALYTICS_SOCIAL_TRACKING_ENABLED_KEY] = TRUE;
+
+    $edit_basic[AddThis::ADDRESSBOOK_ENABLED_KEY] = TRUE;
+
+    $edit_basic[AddThis::CLICK_TO_OPEN_COMPACT_MENU_ENABLED_KEY] = TRUE;
+
+    $edit_basic[AddThis::OPEN_WINDOWS_ENABLED_KEY] = TRUE;
+
+    $edit_basic[AddThis::STANDARD_CSS_ENABLED_KEY] = TRUE;
+
+    $serviceName = '2linkme';
+    $edit_basic["addthis_enabled_services[$serviceName]"] = $serviceName;
+
+    $this->drupalPost('admin/config/user-interface/addthis', $edit_basic, t('Save configuration'));
+
+    $this->assertText(t('The configuration options have been saved.'), 'AddThis system settings should be able to be saved.');
+
+    $this->addThisProfileIdShouldBeAbleToBeSaved($profileId);
+
+    $this->addThisUiDelayShouldBeAbleToBeSaved($uiDelay);
+
+    $this->addThisUiHeaderBackgroundColorShouldBeAbleToBeSaved($uiHeaderBackgroundColor);
+
+    $this->addThisUiHeaderColorShouldBeAbleToBeSaved($uiHeaderColor);
+
+    $this->addThisCoBrandShouldBeAbleToBeSaved($coBrand);
+
+    $this->addThis508CompliantSettingShouldBeAbleToBeSaved();
+
+    $this->addThisClickbackTrackingEnabledSettingShouldBeAbleToBeSaved();
+
+    // Can only be tested with Google Analytics module installed.
+    //$this->addThisGoogleAnalyticsTrackingEnabledSettingShouldBeAbleToBeSaved();
+
+    //$this->addThisGoogleAnalyticsSocialTrackingEnabledSettingShouldBeAbleToBeSaved();
+
+    $this->addThisClickToOpenCompactMenuEnabledSettingShouldBeAbleToBeSaved();
+
+    $this->addThisOpenWindowsEnabledSettingShouldBeAbleToBeSaved();
+
+    $this->addThisStandardCssEnabledSettingShouldBeAbleToBeSaved();
+
+    $this->addThisEnabledServicesShouldBeAbleToBeSaved($serviceName);
+
+    // Advanced configuration
+    $edit_basic = array();
+
+    $servicesCssUrl = AddThis::DEFAULT_SERVICES_CSS_URL;
+    $edit_basic[AddThis::SERVICES_CSS_URL_KEY] = $servicesCssUrl;
+
+    $servicesJsonUrl = AddThis::DEFAULT_SERVICES_JSON_URL;
+    $edit_basic[AddThis::SERVICES_JSON_URL_KEY] = $servicesJsonUrl;
+
+    $widgetJsUrl = AddThis::DEFAULT_WIDGET_JS_URL;
+    $edit_basic[AddThis::WIDGET_JS_URL_KEY] = $widgetJsUrl;
+
+    $edit_basic[AddThis::CUSTOM_CONFIGURATION_CODE_ENABLED_KEY] = TRUE;
+
+    $customConfigurationCode = TestHelper::generateRandomLowercaseString();
+    $edit_basic[AddThis::CUSTOM_CONFIGURATION_CODE_KEY] = $customConfigurationCode;
+
+    $this->drupalPost('admin/config/user-interface/addthis/advanced', $edit_basic, t('Save configuration'));
+
+    $this->addThisServicesCssUrlShouldBeAbleToBeSaved($servicesCssUrl);
+
+    $this->addThisServicesJsonUrlShouldBeAbleToBeSaved($servicesJsonUrl);
+
+    $this->addThisWidgetJsUrlShouldBeAbleToBeSaved($widgetJsUrl);
+
+    $this->addThisCustomConfigurationCodeEnabledSettingShouldBeAbleToBeSaved();
+  }
+
+  private function addThisProfileIdShouldBeAbleToBeSaved($profileId) {
+    $this->assertFieldByName(AddThis::PROFILE_ID_KEY, $profileId, 
+                             'AddThis profile ID should be able to be saved.');
+  }
+
+  private function addThisServicesCssUrlShouldBeAbleToBeSaved($servicesCssUrl) {
+    $this->assertFieldByName(AddThis::SERVICES_CSS_URL_KEY, $servicesCssUrl,
+                             'AddThis services stylesheet URL should be able to be saved.');
+  }
+
+  private function addThisServicesJsonUrlShouldBeAbleToBeSaved($servicesJsonUrl) {
+    $this->assertFieldByName(AddThis::SERVICES_JSON_URL_KEY, $servicesJsonUrl,
+                             'AddThis services json URL should be able to be saved.');
+  }
+
+  private function addThisWidgetJsUrlShouldBeAbleToBeSaved($widgetJsUrl) {
+    $this->assertFieldByName(AddThis::WIDGET_JS_URL_KEY, $widgetJsUrl,
+                             'AddThis javascript widget URL should be able to be saved.');
+  }
+
+  private function addThis508CompliantSettingShouldBeAbleToBeSaved() {
+    $this->assertFieldChecked('edit-addthis-508-compliant',
+                              'AddThis 508 compliant setting should be able to be saved.');
+  }
+
+  private function addThisClickbackTrackingEnabledSettingShouldBeAbleToBeSaved() {
+    $this->assertFieldChecked('edit-addthis-clickback-tracking-enabled',
+                              'AddThis clickback tracking enabled setting should be able to be saved.');
+  }
+
+  private function addThisGoogleAnalyticsTrackingEnabledSettingShouldBeAbleToBeSaved() {
+    $this->assertFieldChecked('edit-addthis-google-analytics-tracking-enabled',
+                              'AddThis Google Analytics tracking enabled setting should be able to be saved.');
+  }
+
+  private function addThisGoogleAnalyticsSocialTrackingEnabledSettingShouldBeAbleToBeSaved() {
+    $this->assertFieldChecked('edit-addthis-google-analytics-tracking-enabled',
+                              'AddThis Google Analytics social tracking enabled setting should be able to be saved.');
+  }
+
+  private function addThisClickToOpenCompactMenuEnabledSettingShouldBeAbleToBeSaved() {
+    $this->assertFieldChecked('edit-addthis-click-to-open-compact-menu-enabled',
+                              'AddThis click to open compact menu setting should be able to be saved.');
+  }
+
+  private function addThisOpenWindowsEnabledSettingShouldBeAbleToBeSaved() {
+    $this->assertFieldChecked('edit-addthis-open-windows-enabled',
+                              'AddThis open windows setting should be able to be saved.');
+  }
+
+  private function addThisStandardCssEnabledSettingShouldBeAbleToBeSaved() {
+    $this->assertFieldChecked('edit-addthis-open-windows-enabled',
+                              'AddThis open windows setting should be able to be saved.');
+  }
+
+  private function addThisFacebookLikeEnabledSettingShouldBeAbleToBeSaved() {
+    $this->assertFieldChecked('edit-addthis-facebook-like-enabled',
+                              'AddThis Facebook Like enabled setting should be able to be saved.');
+  }
+
+  private function addThisAddressbookEnabledSettingShouldBeAbleToBeSaved() {
+    $this->assertFieldChecked('edit-addthis-addressbook-enabled',
+                              'AddThis addressbook enabled setting should be able to be saved.');
+  }
+
+  private function addThisCustomConfigurationCodeEnabledSettingShouldBeAbleToBeSaved() {
+    $this->assertFieldChecked('edit-addthis-custom-configuration-code-enabled',
+                              'AddThis custom configuration code enabled setting should be able to be saved.');
+  }
+
+  private function addThisCustomConfigurationCodeShouldBeAbleToBeSaved($customConfigurationCode) {
+    $this->assertFieldByName(AddThis::CUSTOM_CONFIGURATION_CODE_KEY, $customConfigurationCode,
+                             'AddThis custom configuration code should be able to be saved.');
+  }
+
+  private function addThisUiHeaderColorShouldBeAbleToBeSaved($uiHeaderColor) {
+    $this->assertFieldByName(AddThis::UI_HEADER_COLOR_KEY, $uiHeaderColor,
+                             'AddThis UI header color should be able to be saved.');
+  }
+
+  private function addThisUiDelayShouldBeAbleToBeSaved($uiDelay) {
+    $this->assertFieldByName(AddThis::UI_DELAY_KEY, $uiDelay,
+                             'AddThis UI delay should be able to be saved.');
+  }
+
+  private function addThisUiHeaderBackgroundColorShouldBeAbleToBeSaved($uiHeaderBackgroundColor) {
+    $this->assertFieldByName(AddThis::UI_HEADER_BACKGROUND_COLOR_KEY, $uiHeaderBackgroundColor,
+                             'AddThis UI header background color should be able to be saved.');
+  }
+
+  private function addThisCoBrandShouldBeAbleToBeSaved($coBrand) {
+    $this->assertFieldByName(AddThis::CO_BRAND_KEY, $coBrand,
+                             'AddThis co-brand should be able to be saved.');
+  }
+
+  private function addThisEnabledServicesShouldBeAbleToBeSaved($serviceName) {
+    $this->assertFieldChecked('edit-addthis-enabled-services-' . $serviceName,
+                              'AddThis enabled services should be able to be saved.');
+  }
+
+  private function createAndLoginUser() {
+    $this->user = $this->createAdminUser();
+    $this->drupalLogin($this->user);
+  }
+
+  private function createAdminUser() {
+    return $this->drupalCreateUser(
+      array(
+        AddThis::PERMISSION_ADMINISTER_ADDTHIS,
+        AddThis::PERMISSION_ADMINISTER_ADVANCED_ADDTHIS,
+        'administer blocks',
+        'administer content types',
+        'administer nodes'
+      )
+    );
+  }
+}
+
+class AddThisPermissionsTestCase extends DrupalWebTestCase {
+
+  public function setUp() {
+    parent::setUp(AddThis::MODULE_NAME);
+  }
+
+  public function getInfo() {
+    return array(
+      'name' => 'AddThis: Permission tests',
+      'description' => 'Permission tests for the AddThis-module.',
+      'group' => 'AddThis',
+    );
+  }
+
+  public function testUserWithoutAdministerAddThisPermissionShouldNotBeAllowedToAccessAddThisSystemSettings() {
+    $this->drupalLogin($this->createAdminUserWithoutAddThisAdministrationPermission());
+    $this->drupalGet('admin/config/system/addthis');
+    $this->assertRaw(t('Access denied'),
+                     'A user without administer addthis permission should not be able to access AddThis system settings.');
+  }
+
+  public function testUserWithoutAdministerAdvancedAddThisPermissionShouldNotBeAllowedToAccessAdvancedAddThisSystemSettings() {
+    $this->drupalLogin($this->createAdminUserWithoutAdvancedAddThisAdministrationPermission());
+    $this->drupalGet('admin/config/system/addthis');
+    $this->assertNoRaw(t('Advanced settings'),
+                       'A user without administer advanced addthis permission should not be able to access advanced AddThis system settings.');
+  }
+
+  private function createAdminUserWithoutAddThisAdministrationPermission() {
+    return $this->drupalCreateUser(array('administer content types'));
+  }
+
+  private function createAdminUserWithoutAdvancedAddThisAdministrationPermission() {
+    return $this->drupalCreateUser(array('administer content types', AddThis::PERMISSION_ADMINISTER_ADDTHIS));
+  }
+}
+
+class TestHelper {
+
+  public static function stringContains($string, $contains) {
+    return strpos($string, $contains) !== FALSE;
+  }
+
+  public static function generateRandomLowercaseString() {
+    return drupal_strtolower(DrupalWebTestCase::randomName());
+  }
+}
diff --git a/htmltest/sites/all/modules/addthis/addthis_displays/addthis_displays.addthis.inc b/htmltest/sites/all/modules/addthis/addthis_displays/addthis_displays.addthis.inc
new file mode 100644
index 00000000..3437d95d
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/addthis_displays/addthis_displays.addthis.inc
@@ -0,0 +1,121 @@
+<?php
+
+/**
+ * @file
+ * Implements AddThis markup functions.
+ */
+
+function addthis_displays_addthis_display_markup($display, $variables = NULL) {
+  return NULL;
+}
+
+/**
+ * Implements hook_addthis_display_markup__[display]().
+ */
+function addthis_displays_addthis_display_markup__addthis_basic_toolbox($options = array()) {
+  $addthis = AddThis::getInstance();
+
+  // Create a render array for the widget.
+  $element = array(
+    // Use #theme_wrappers to include the rendered children. Otherwise the
+    // result is an empty element like <div></div>.
+    '#theme' => 'addthis_wrapper',
+    '#tag' => 'div',
+    '#attributes' => array(
+      'class' => array(
+        'addthis_toolbox',
+        'addthis_default_style',
+        ($options['#display']['settings']['buttons_size'] == AddThis::CSS_32x32 ? AddThis::CSS_32x32 : NULL),
+        $options['#display']['settings']['extra_css'],
+      ),
+    ),
+  );
+  $element['#attributes'] += $addthis->getAddThisAttributesMarkup($options);
+
+  $services = trim($options['#display']['settings']['share_services']);
+  $services = str_replace(' ', '', $services);
+  $services = explode(',', $services);
+
+  // All service elements
+  $items = array();
+  foreach ($services as $service) {
+    $items[$service] = array(
+      '#theme' => 'addthis_element',
+      '#tag' => 'a',
+      '#value' => '',
+      '#attributes' => array(
+        'href' => $addthis->getBaseBookmarkUrl(),
+        'class' => array(
+          'addthis_button_' . $service,
+        ),
+      ),
+      '#addthis_service' => $service,
+    );
+
+    // Basic implementations of bubble counter orientation.
+    // @todo Figure all the bubbles out and add them.
+    //   Still missing: tweetme, hyves and stubleupon.
+    //
+    // @todo Fix a way to use addthis_bubble_style.
+    //   There is a conflict now with using the class addthis_button_[service].
+    //   You can't add this bubble style now.
+    $orientation = ($options['#display']['settings']['counter_orientation'] == 'horizontal' ? TRUE : FALSE);
+    switch ($service) {
+      case 'facebook_like':
+        $items[$service]['#attributes'] += array(
+          'fb:like:layout' => ($orientation ? 'button_count' : 'box_count')
+        );
+        break;
+      case 'google_plusone':
+        $items[$service]['#attributes'] += array(
+          'g:plusone:size' => ($orientation ? 'standard' : 'tall')
+        );
+        break;
+      case 'tweet':
+        $items[$service]['#attributes'] += array(
+          'tw:count' => ($orientation ? 'horizontal' : 'vertical'),
+          'tw:via' => AddThis::getInstance()->getTwitterVia(),
+        );
+        break;
+    }
+  }
+  $element += $items;
+
+  return $element;
+}
+
+/**
+ * Implements hook_addthis_display_markup__[display]().
+ */
+function addthis_displays_addthis_display_markup__addthis_basic_button($options = array()) {
+
+  $button_img = 'http://s7.addthis.com/static/btn/sm-share-en.gif';
+  if ($options['#display']['settings']['button_size'] == 'big') {
+    $button_img = 'http://s7.addthis.com/static/btn/v2/lg-share-en.gif';
+  }
+
+  $element = array(
+    '#theme' => 'addthis_wrapper',
+    '#tag' => 'a',
+    '#attributes' => array(
+      'class' => array(
+        'addthis_button',
+        $options['#display']['settings']['extra_css'],
+      ),
+    ),
+  );
+  $element['#attributes'] += AddThis::getInstance()->getAddThisAttributesMarkup($options);
+
+  // Create img button
+  $image = array(
+    '#theme' => 'addthis_element',
+    '#tag' => 'img',
+    '#attributes' => array(
+      'src' => $button_img,
+      'alt' => t('Share page with AddThis'),
+    ),
+  );
+  $element[] = $image;
+
+  return $element;
+}
diff --git a/htmltest/sites/all/modules/addthis/addthis_displays/addthis_displays.field.inc b/htmltest/sites/all/modules/addthis/addthis_displays/addthis_displays.field.inc
new file mode 100644
index 00000000..aa0231ba
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/addthis_displays/addthis_displays.field.inc
@@ -0,0 +1,158 @@
+<?php
+
+/**
+ * @file
+ * Defines field implementations.
+ */
+
+/**
+ * Implements hook_field_formatter_info().
+ */
+function addthis_displays_field_formatter_info() {
+  $formatters = array();
+
+  $formatters['addthis_basic_toolbox'] = array(
+    'label' => t('Basic Toolbox'),
+    'field types' => array(AddThis::FIELD_TYPE),
+    'settings' => array(
+      'share_services' => 'facebook,twitter',
+      'buttons_size' => 'addthis_16x16_style',
+      'counter_orientation' => 'horizontal',
+      'extra_css' => '',
+    ),
+  );
+  $formatters['addthis_basic_button'] = array(
+    'label' => t('Basic Button'),
+    'field types' => array(AddThis::FIELD_TYPE),
+    'settings' => array(
+      'button_size' => 'small',
+      'extra_css' => '',
+    ),
+  );
+  return $formatters;
+}
+
+/**
+ * Implementss hook_field_formatter_settings_form().
+ */
+function addthis_displays_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+  $element = array();
+
+  switch ($display['type']) {
+    case 'addthis_basic_toolbox':
+      $element['share_services'] = array(
+        '#title' => t('Services'),
+        '#type' => 'textfield',
+        '#size' => 80,
+        '#default_value' => $settings['share_services'],
+        '#required' => TRUE,
+        '#element_validate' => array('_addthis_display_element_validate_services'),
+        '#description' => t('Specify the names of the sharing services and seperate them with a , (comma). <a href="http://www.addthis.com/services/list">The names on this list are valid.</a>'),
+      );
+      $element['buttons_size'] = array(
+        '#title' => t('Buttons size'),
+        '#type' => 'select',
+        '#default_value' => $settings['buttons_size'],
+        '#options' => array(
+          AddThis::CSS_16x16 => t('Small (16x16)'),
+          AddThis::CSS_32x32 => t('Big (32x32)'),
+        ),
+      );
+      $element['counter_orientation'] = array(
+        '#title' => t('Counter orientation'),
+        '#description' => t('Specify the way service counters are oriented.'),
+        '#type' => 'select',
+        '#default_value' => $settings['counter_orientation'],
+        '#options' => array(
+          'horizontal' => t('Horizontal'),
+          'vertical' => t('Vertical'),
+        )
+      );
+      $element['extra_css'] = array(
+        '#title' => t('Extra CSS declaration'),
+        '#type' => 'textfield',
+        '#size' => 40,
+        '#default_value' => $settings['extra_css'],
+        '#description' => t('Specify extra CSS classes to apply to the toolbox'),
+      );
+      break;
+    case 'addthis_basic_button':
+      $element['button_size'] = array(
+        '#title' => t('Image'),
+        '#type' => 'select',
+        '#default_value' => $settings['button_size'],
+        '#options' => array(
+          'small' => t('Small'),
+          'big' => t('Big'),
+        ),
+      );
+      $element['extra_css'] = array(
+        '#title' => t('Extra CSS declaration'),
+        '#type' => 'textfield',
+        '#size' => 40,
+        '#default_value' => $settings['extra_css'],
+        '#description' => t('Specify extra CSS classes to apply to the button'),
+      );
+      break;
+  }
+
+  return $element;
+}
+
+/**
+ * Validate the services text field to validate if services are correct.
+ */
+function _addthis_display_element_validate_services($element, &$form_state, $form) {
+  $bad = FALSE;
+
+  $services = trim($element['#value']);
+  $services = str_replace(' ', '', $services);
+
+  if (!preg_match('/^[a-z\_\,]+$/', $services)) {
+    $bad = TRUE;
+  }
+  // @todo Validate the service names against AddThis.com. Give a notice when there are bad names.
+
+  // Return error.
+  if ($bad) {
+    form_error($element, t('The declared services are incorrect or nonexistent.'));
+  }
+}
+
+/**
+ * Implements hook_field_formatter_settings_summary().
+ */
+function addthis_displays_field_formatter_settings_summary($field, $instance, $view_mode) {
+  $view = $instance['display'][$view_mode];
+  $info = '';
+  switch ($view['type']) {
+    case 'addthis_basic_toolbox':
+      $settings = $view['settings'];
+
+      $services = trim($settings['share_services']);
+      $services = str_replace(' ', '', $services);
+      $services = '<b>' . implode(', ', explode(',', $services)) . '</b>';
+
+      $info =  t('Toolbox with the following services: !services', array('!services' => $services));
+      break;
+
+    case 'addthis_basic_button':
+      $settings = $view['settings'];
+
+      $size = '<b>' . $settings['button_size'] . '</b>';
+      $info = t('Basic button size: !size', array('!size' => $size));
+      break;
+  }
+
+  return $info;
+}
+
+/**
+ * Implements hook_field_formatter_view().
+ */
+function addthis_displays_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  // We use the helper function addthis_render_formatter_view with literally all the arguments.
+  return addthis_render_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display);
+}
diff --git a/htmltest/sites/all/modules/addthis/addthis_displays/addthis_displays.info b/htmltest/sites/all/modules/addthis/addthis_displays/addthis_displays.info
new file mode 100644
index 00000000..29bb01e1
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/addthis_displays/addthis_displays.info
@@ -0,0 +1,13 @@
+name = AddThis Displays
+description = Adds the AddThis display types to render several basic types of AddThis buttons.
+core = 7.x
+package = Sharing
+dependencies[] = addthis
+files[] = addthis_displays.field.inc
+
+; Information added by drupal.org packaging script on 2013-01-30
+version = "7.x-4.0-alpha2"
+core = "7.x"
+project = "addthis"
+datestamp = "1359545712"
+
diff --git a/htmltest/sites/all/modules/addthis/addthis_displays/addthis_displays.module b/htmltest/sites/all/modules/addthis/addthis_displays/addthis_displays.module
new file mode 100644
index 00000000..35645e85
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/addthis_displays/addthis_displays.module
@@ -0,0 +1,4 @@
+<?php
+
+// Seperated field hooks for the purpose of keeping it clean.
+module_load_include('inc', 'addthis_displays', 'addthis_displays.field');
diff --git a/htmltest/sites/all/modules/addthis/classes/AddThis.php b/htmltest/sites/all/modules/addthis/classes/AddThis.php
new file mode 100644
index 00000000..9089c8ca
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/classes/AddThis.php
@@ -0,0 +1,460 @@
+<?php
+/**
+ * @file
+ * An AddThis-class.
+ */
+
+class AddThis {
+
+  const BLOCK_NAME = 'addthis_block';
+  const DEFAULT_CUSTOM_CONFIGURATION_CODE = 'var addthis_config = {}';
+  const DEFAULT_FORMATTER = 'addthis_default_formatter';
+  const DEFAULT_NUMBER_OF_PREFERRED_SERVICES = 4;
+  const FIELD_TYPE = 'addthis';
+  const MODULE_NAME = 'addthis';
+  const PERMISSION_ADMINISTER_ADDTHIS = 'administer addthis';
+  const PERMISSION_ADMINISTER_ADVANCED_ADDTHIS = 'administer advanced addthis';
+  const STYLE_KEY = 'addthis_style';
+  const WIDGET_TYPE = 'addthis_button_widget';
+
+  // AddThis attribute and parameter names (as defined in AddThis APIs)
+  const PROFILE_ID_QUERY_PARAMETER = 'pubid';
+  const TITLE_ATTRIBUTE = 'addthis:title';
+  const URL_ATTRIBUTE = 'addthis:url';
+
+  // Persistent variable keys
+  const ADDRESSBOOK_ENABLED_KEY = 'addthis_addressbook_enabled';
+  const BLOCK_WIDGET_TYPE_KEY = 'addthis_block_widget_type';
+  const BOOKMARK_URL_KEY = 'addthis_bookmark_url';
+  const CLICKBACK_TRACKING_ENABLED_KEY = 'addthis_clickback_tracking_enabled';
+  const CLICK_TO_OPEN_COMPACT_MENU_ENABLED_KEY = 'addthis_click_to_open_compact_menu_enabled';
+  const CO_BRAND_KEY = 'addthis_co_brand';
+  const COMPLIANT_508_KEY = 'addthis_508_compliant';
+  const CUSTOM_CONFIGURATION_CODE_ENABLED_KEY = 'addthis_custom_configuration_code_enabled';
+  const CUSTOM_CONFIGURATION_CODE_KEY = 'addthis_custom_configuration_code';
+  const ENABLED_SERVICES_KEY = 'addthis_enabled_services';
+  const GOOGLE_ANALYTICS_TRACKING_ENABLED_KEY = 'addthis_google_analytics_tracking_enabled';
+  const GOOGLE_ANALYTICS_SOCIAL_TRACKING_ENABLED_KEY = 'addthis_google_analytics_social_tracking_enabled';
+  const FACEBOOK_LIKE_COUNT_SUPPORT_ENABLED = 'addthis_facebook_like_count_support_enabled';
+  const OPEN_WINDOWS_ENABLED_KEY = 'addthis_open_windows_enabled';
+  const PROFILE_ID_KEY = 'addthis_profile_id';
+  const SERVICES_CSS_URL_KEY = 'addthis_services_css_url';
+  const SERVICES_JSON_URL_KEY = 'addthis_services_json_url';
+  const STANDARD_CSS_ENABLED_KEY = 'addthis_standard_css_enabled';
+  const UI_DELAY_KEY = 'addthis_ui_delay';
+  const UI_HEADER_BACKGROUND_COLOR_KEY = 'addthis_ui_header_background_color';
+  const UI_HEADER_COLOR_KEY = 'addthis_ui_header_color';
+  const WIDGET_JS_URL_KEY = 'addthis_widget_js_url';
+  const WIDGET_JS_ASYNC = 'addthis_widget_async';
+
+  // Twitter
+  const TWITTER_VIA_KEY = 'addthis_twitter_via';
+  const TWITTER_VIA_DEFAULT = 'AddThis';
+  const TWITTER_TEMPLATE_KEY = 'addthis_twitter_template';
+  const TWITTER_TEMPLATE_DEFAULT = '{{title}} {{url}} via @AddThis';
+
+  // External resources
+  const DEFAULT_BOOKMARK_URL = 'http://www.addthis.com/bookmark.php?v=250';
+  const DEFAULT_SERVICES_CSS_URL = 'http://cache.addthiscdn.com/icons/v1/sprites/services.css';
+  const DEFAULT_SERVICES_JSON_URL = 'http://cache.addthiscdn.com/services/v1/sharing.en.json';
+  const DEFAULT_WIDGET_JS_URL = 'http://s7.addthis.com/js/250/addthis_widget.js';
+  const DEFAULT_WIDGET_JS_ASYNC = TRUE;
+
+  // Internal resources
+  const ADMIN_CSS_FILE = 'addthis.admin.css';
+  const ADMIN_INCLUDE_FILE = 'includes/addthis.admin.inc';
+
+  // Widget types
+  const WIDGET_TYPE_DISABLED = 'addthis_disabled';
+
+  // Styles
+  const CSS_32x32 = 'addthis_32x32_style';
+  const CSS_16x16 = 'addthis_16x16_style';
+
+  private static $instance;
+
+  /* @var AddThisJson */
+  private $json;
+
+  /**
+   * @return AddThis
+   */
+  public static function getInstance() {
+    module_load_include('php', 'addthis', 'classes/AddThisJson');
+    if (!isset(self::$instance)) {
+      $addThis = new AddThis();
+      $addThis->setJson(new AddThisJson());
+      self::$instance = $addThis;
+    }
+    return self::$instance;
+  }
+
+  public function setJson(AddThisJson $json) {
+    $this->json = $json;
+  }
+
+  public function getDefaultFormatterTypes() {
+    return array(
+      self::WIDGET_TYPE_DISABLED => t('Disabled'),
+    );
+  }
+
+  public function getDisplayTypes() {
+    $displays = array();
+    foreach ($display_impl = _addthis_field_info_formatter_field_type() as $key => $display) {
+      $displays[$key] = t(check_plain($display['label']));
+    }
+    return $displays;
+  }
+
+  /*
+   * Get markup for a given display type.
+   *
+   * When $options does not contain #entity, link to the current URL.
+   * When $options does not contain #display, use default settings.
+   */
+  public function getDisplayMarkup($display, $options = array()) {
+    if (empty($display)) {
+      return array();
+    }
+
+    $formatters = _addthis_field_info_formatter_field_type();
+
+    if (!array_key_exists($display, $formatters)) {
+      return array();
+    }
+
+    // The display type exists. Now get it and get the markup.
+    $display_information = $formatters[$display];
+
+    // Theme function might only give a display name and
+    // render on default implementation.
+    if (!isset($options['#display']) ||
+        (isset($options['#display']['type']) && $options['#display']['type'] != $display)) {
+
+      $options['#display'] = isset($options['#display']) ? $options['#display'] : array();
+      $options['#display'] = array_merge($options['#display'], $display_information);
+      $options['#display']['type'] = $display;
+
+    }
+
+    // When #entity and #entity_type exist, use the entity's URL.
+    if (isset($options['#entity']) && isset($options['#entity_type'])) {
+      $uri = entity_uri($options['#entity_type'], $options['#entity']);
+      $uri['options'] += array(
+        'absolute' => TRUE,
+      );
+
+      // @todo Add a hook to alter the uri also based on fields from the
+      // entity (such as custom share link). Pass $options and $uri. Return
+      // a uri object to which we can reset it. Maybe use the alter structure.
+
+      $options['#url'] = url($uri['path'], $uri['options']);
+    }
+    // @todo Hash the options array and cache the markup.
+    // This will save all the extra calls to modules and alters.
+
+    // Allow other modules to alter markup options.
+    drupal_alter('addthis_markup_options', $options);
+
+    $markup = array(
+      '#display' => $options['#display'],
+    );
+    // Get all hook implementation to verify later if we can call it.
+    $addthis_display_markup_implementations = module_implements('addthis_display_markup');
+
+    // Look for a targeted implementation to call.
+    // This should be the default implementation that is called.
+    if (function_exists($display_information['module'] . '_addthis_display_markup__' . $display)) {
+      $markup += call_user_func_array($display_information['module'] . '_addthis_display_markup__' . $display, array($options));
+    }
+    elseif (in_array($display_information['module'], $addthis_display_markup_implementations)) {
+      $markup += module_invoke($display_information['module'], 'addthis_display_markup', $display, $options);
+    }
+    // Allow other modules to alter markup.
+    drupal_alter('addthis_markup', $markup);
+    return $markup;
+  }
+
+  public function getServices() {
+    $rows = array();
+    $services = $this->json->decode($this->getServicesJsonUrl());
+    if (empty($services)) {
+      drupal_set_message(t('AddThis services could not be loaded from @service_url', array('@service_url', $this->getServicesJsonUrl())), 'warning');
+    }
+    else {
+      foreach ($services['data'] as $service) {
+        $serviceCode = check_plain($service['code']);
+        $serviceName = check_plain($service['name']);
+        $rows[$serviceCode] = '<span class="addthis_service_icon icon_' . $serviceCode . '"></span> ' . $serviceName;
+      }
+    }
+    return $rows;
+  }
+
+  public function addWidgetJs() {
+    $async_parameter = self::isWidgetJsAsync() ? '?async=1' : '';
+    $url = self::getWidgetUrl() . $async_parameter;
+    if (self::isWidgetJsAsync()) {
+      drupal_add_js(
+        array(
+        'addthis' => array(
+          'widget_url' => $url,
+        ),
+      ),
+        'setting'
+      );
+    }
+    else {
+      // Add AddThis.com resources
+      drupal_add_js(
+        $url,
+        array(
+        'type' => 'external',
+        'group' => JS_LIBRARY,
+        'every_page' => TRUE,
+        'weight' => 9,
+      )
+      );
+    }
+    // Add local internal behaviours
+    if (self::isWidgetJsAsync()) {
+      drupal_add_js(
+        drupal_get_path('module', 'addthis') . '/addthis.js',
+        array(
+        'group' => JS_DEFAULT,
+        'weight' => 10,
+        'every_page' => TRUE,
+        'preprocess' => TRUE,
+      )
+      );
+    }
+  }
+
+  public function addConfigurationOptionsJs() {
+    if ($this->isCustomConfigurationCodeEnabled()) {
+      $configurationOptionsJavascript = $this->getCustomConfigurationCode();
+    }
+    else {
+      $enabledServices = $this->getServiceNamesAsCommaSeparatedString() . 'more';
+
+      global $language;
+      $configuration = array(
+        'services_compact' => $enabledServices,
+        'data_track_clickback' => $this->isClickbackTrackingEnabled(),
+        'ui_508_compliant' => $this->get508Compliant(),
+        'ui_click' => $this->isClickToOpenCompactMenuEnabled(),
+        'ui_cobrand' => $this->getCoBrand(),
+        'ui_delay' => $this->getUiDelay(),
+        'ui_header_background' => $this->getUiHeaderBackgroundColor(),
+        'ui_header_color' => $this->getUiHeaderColor(),
+        'ui_open_windows' => $this->isOpenWindowsEnabled(),
+        'ui_use_css' => $this->isStandardCssEnabled(),
+        'ui_use_addressbook' => $this->isAddressbookEnabled(),
+        'ui_language' => $language->language,
+      );
+      if (module_exists('googleanalytics')) {
+        if ($this->isGoogleAnalyticsTrackingEnabled()) {
+          $configuration['data_ga_property'] = variable_get('googleanalytics_account', '');
+          $configuration['data_ga_social'] = $this->isGoogleAnalyticsSocialTrackingEnabled();
+        }
+      }
+      $configuration['templates']['twitter'] = $this->getTwitterTemplate();
+      drupal_alter('addthis_configuration', $configuration);
+
+      $templates = array('templates' => $configuration['templates']);
+      unset($configuration['templates']);
+      $configurationOptionsJavascript = 'var addthis_config = ' . drupal_json_encode($configuration) . "\n";
+      $configurationOptionsJavascript .= 'var addthis_share = ' . drupal_json_encode($templates);
+    }
+    drupal_add_js(
+      $configurationOptionsJavascript,
+      array(
+      'type' => 'inline',
+      'scope' => 'footer',
+      'every_page' => TRUE,
+    )
+    );
+  }
+
+  public function getAddThisAttributesMarkup($options) {
+    if (isset($options)) {
+      $attributes = array();
+
+      if (isset($options['#entity'])) {
+        $attributes += $this->getAttributeTitle($options['#entity']);
+      }
+      $attributes += $this->getAttributeUrl($options);
+
+      return $attributes;
+    }
+    return array();
+  }
+
+  public function getBlockDisplayType() {
+    return variable_get(self::BLOCK_WIDGET_TYPE_KEY, self::WIDGET_TYPE_DISABLED);
+  }
+
+  public function getProfileId() {
+    return check_plain(variable_get(AddThis::PROFILE_ID_KEY));
+  }
+
+  public function getServicesCssUrl() {
+    return check_url(variable_get(AddThis::SERVICES_CSS_URL_KEY, self::DEFAULT_SERVICES_CSS_URL));
+  }
+
+  public function getServicesJsonUrl() {
+    return check_url(variable_get(AddThis::SERVICES_JSON_URL_KEY, self::DEFAULT_SERVICES_JSON_URL));
+  }
+
+  public function getEnabledServices() {
+    return variable_get(self::ENABLED_SERVICES_KEY, array());
+  }
+
+  public function isWidgetJsAsync() {
+    return variable_get(self::WIDGET_JS_ASYNC, self::DEFAULT_WIDGET_JS_ASYNC);
+  }
+
+  public function isClickToOpenCompactMenuEnabled() {
+    return (boolean) variable_get(self::CLICK_TO_OPEN_COMPACT_MENU_ENABLED_KEY, FALSE);
+  }
+
+  public function isOpenWindowsEnabled() {
+    return (boolean) variable_get(self::OPEN_WINDOWS_ENABLED_KEY, FALSE);
+  }
+
+  public function getUiDelay() {
+    return (int) check_plain(variable_get(self::UI_DELAY_KEY));
+  }
+
+  public function getUiHeaderColor() {
+    return check_plain(variable_get(self::UI_HEADER_COLOR_KEY));
+  }
+
+  public function getUiHeaderBackgroundColor() {
+    return check_plain(variable_get(self::UI_HEADER_BACKGROUND_COLOR_KEY));
+  }
+
+  public function isStandardCssEnabled() {
+    return (boolean) variable_get(self::STANDARD_CSS_ENABLED_KEY, TRUE);
+  }
+
+  public function getCustomConfigurationCode() {
+    return variable_get(self::CUSTOM_CONFIGURATION_CODE_KEY, self::DEFAULT_CUSTOM_CONFIGURATION_CODE);
+  }
+
+  public function isCustomConfigurationCodeEnabled() {
+    return (boolean) variable_get(self::CUSTOM_CONFIGURATION_CODE_ENABLED_KEY, FALSE);
+  }
+
+  public function getBaseWidgetJsUrl() {
+    return check_url(variable_get(self::WIDGET_JS_URL_KEY, self::DEFAULT_WIDGET_JS_URL));
+  }
+
+  public function getBaseBookmarkUrl() {
+    return check_url(variable_get(self::BOOKMARK_URL_KEY, self::DEFAULT_BOOKMARK_URL));
+  }
+
+  public function getCoBrand() {
+    return variable_get(self::CO_BRAND_KEY, '');
+  }
+
+  public function get508Compliant() {
+    return (boolean) variable_get(self::COMPLIANT_508_KEY, FALSE);
+  }
+
+  public function getTwitterVia() {
+    return variable_get(self::TWITTER_VIA_KEY, self::TWITTER_VIA_DEFAULT);
+  }
+
+  public function getTwitterTemplate() {
+    return variable_get(self::TWITTER_TEMPLATE_KEY, self::TWITTER_TEMPLATE_DEFAULT);
+  }
+
+  public function isClickbackTrackingEnabled() {
+    return (boolean) variable_get(self::CLICKBACK_TRACKING_ENABLED_KEY, FALSE);
+  }
+
+  public function isAddressbookEnabled() {
+    return (boolean) variable_get(self::ADDRESSBOOK_ENABLED_KEY, FALSE);
+  }
+
+  public function isGoogleAnalyticsTrackingEnabled() {
+    return (boolean) variable_get(self::GOOGLE_ANALYTICS_TRACKING_ENABLED_KEY, FALSE);
+  }
+
+  public function isGoogleAnalyticsSocialTrackingEnabled() {
+    return (boolean) variable_get(self::GOOGLE_ANALYTICS_SOCIAL_TRACKING_ENABLED_KEY, FALSE);
+  }
+
+  public function isFacebookLikeCountSupportEnabled() {
+    return (boolean) variable_get(self::FACEBOOK_LIKE_COUNT_SUPPORT_ENABLED, TRUE);
+  }
+
+  public function addStylesheets() {
+    drupal_add_css($this->getServicesCssUrl(), 'external');
+    drupal_add_css($this->getAdminCssFilePath(), 'file');
+  }
+
+  public function getFullBookmarkUrl() {
+    return $this->getBaseBookmarkUrl() . $this->getProfileIdQueryParameterPrefixedWithAmp();
+  }
+
+  private function getAttributeTitle($entity) {
+    if (isset($entity->title)) {
+      return array(
+        self::TITLE_ATTRIBUTE => (check_plain($entity->title) . ' - ' . variable_get('site_name')),
+      );
+    }
+    return array();
+  }
+
+  private function getAttributeUrl($options) {
+    if (isset($options['#url'])) {
+      return array(
+        self::URL_ATTRIBUTE => $options['#url'],
+      );
+    }
+    return array();
+  }
+
+  private function getServiceNamesAsCommaSeparatedString() {
+    $enabledServiceNames = array_values($this->getEnabledServices());
+    $enabledServicesAsCommaSeparatedString = '';
+    foreach ($enabledServiceNames as $enabledServiceName) {
+      if ($enabledServiceName != '0') {
+        $enabledServicesAsCommaSeparatedString .= $enabledServiceName . ',';
+      }
+    }
+    return $enabledServicesAsCommaSeparatedString;
+  }
+
+  private function getAdminCssFilePath() {
+    return drupal_get_path('module', self::MODULE_NAME) . '/' . self::ADMIN_CSS_FILE;
+  }
+
+  private function getProfileIdQueryParameter($prefix) {
+    $profileId = $this->getProfileId();
+    return !empty($profileId) ? $prefix . self::PROFILE_ID_QUERY_PARAMETER . '=' . $profileId : '';
+  }
+
+  private function getProfileIdQueryParameterPrefixedWithAmp() {
+    return $this->getProfileIdQueryParameter('&');
+  }
+
+  private function getProfileIdQueryParameterPrefixedWithHash() {
+    return $this->getProfileIdQueryParameter('#');
+  }
+
+  private function getWidgetUrl() {
+    return check_url($this->validateSecureUrl($this->getBaseWidgetJsUrl()) . $this->getProfileIdQueryParameterPrefixedWithHash());
+  }
+
+  private function validateSecureUrl($url) {
+    global $base_root;
+    if (strpos($base_root, 'https://') !== FALSE) {
+      $url = (strpos($url, 'http://') === 0 ? 'https://' . substr($url, 7) : $url);
+    }
+    return $url;
+  }
+}
diff --git a/htmltest/sites/all/modules/addthis/classes/AddThisJson.php b/htmltest/sites/all/modules/addthis/classes/AddThisJson.php
new file mode 100644
index 00000000..3f6898fb
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/classes/AddThisJson.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * @file
+ * A class containing utility methods for json-related functionality.
+ */
+
+class AddThisJson {
+
+  public function decode($url) {
+    $response = drupal_http_request($url);
+    $responseOk = $response->code == 200;
+    return $responseOk ? drupal_json_decode($response->data) : NULL;
+  }
+}
diff --git a/htmltest/sites/all/modules/addthis/includes/addthis.admin.inc b/htmltest/sites/all/modules/addthis/includes/addthis.admin.inc
new file mode 100644
index 00000000..22ed1909
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/includes/addthis.admin.inc
@@ -0,0 +1,313 @@
+<?php
+
+/**
+ * @file
+ * Administrative page callbacks for the AddThis-module.
+ */
+
+function addthis_admin_settings_form($form_state) {
+  AddThis::getInstance()->addStylesheets();
+
+  // Visual settings.
+  $form['fieldset_compact_menu'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Compact menu'),
+    '#collapsible' => FALSE,
+    '#collapsed' => TRUE,
+    '#description' => '<p>' . t('Configure the global behavior and style of the compact menu and some additional settings related to the interface.') . '</p>'
+  );
+  $form['fieldset_compact_menu']['fieldset_menu_style'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Style'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['fieldset_compact_menu']['fieldset_menu_style'][AddThis::CO_BRAND_KEY] = array(
+      '#type' => 'textfield',
+      '#title' => t('Branding text'),
+      '#description' => t('Additional branding message to be rendered in the upper-right-hand corner of the compact menus.<br />Should be less than 15 characters in most cases to render properly.'),
+      '#default_value' => AddThis::getInstance()->getCoBrand(),
+      '#required' => FALSE,
+      '#maxlength' => 15,
+  );
+  $form['fieldset_compact_menu']['fieldset_menu_style'][AddThis::UI_HEADER_COLOR_KEY] = array(
+      '#type' => 'textfield',
+      '#title' => t('Header text color'),
+      '#default_value' => AddThis::getInstance()->getUiHeaderColor(),
+      '#description' => t('Something like #FFFFFF'),
+      '#size' => 8,
+      '#maxlength' => 7,
+      '#required' => FALSE,
+  );
+  $form['fieldset_compact_menu']['fieldset_menu_style'][AddThis::UI_HEADER_BACKGROUND_COLOR_KEY] = array(
+      '#type' => 'textfield',
+      '#title' => t('Header background color'),
+      '#default_value' => AddThis::getInstance()->getUiHeaderBackgroundColor(),
+      '#description' => t('Something like #000000'),
+      '#size' => 8,
+      '#maxlength' => 7,
+      '#required' => FALSE,
+  );
+  $form['fieldset_compact_menu']['fieldset_menu_style'][AddThis::CLICK_TO_OPEN_COMPACT_MENU_ENABLED_KEY] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Open compact menu on click'),
+    '#description' => t('Default behavior is to open compact menu on hover.'),
+    '#default_value' => AddThis::getInstance()->isClickToOpenCompactMenuEnabled(),
+    '#required' => FALSE,
+  );
+  $form['fieldset_compact_menu']['fieldset_menu_style'][AddThis::OPEN_WINDOWS_ENABLED_KEY] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Use pop-up windows'),
+    '#description' => t('If checked, all shares will open in a new pop-up window instead of a new tab or regular browser window.'),
+    '#default_value' => AddThis::getInstance()->isOpenWindowsEnabled(),
+    '#required' => FALSE,
+  );
+  $form['fieldset_compact_menu']['fieldset_menu_style'][AddThis::UI_DELAY_KEY] = array(
+    '#type' => 'textfield',
+    '#title' => t('Menu open delay'),
+    '#description' => t('Delay, in milliseconds, before compact menu appears when mousing over a regular button. Capped at 500 ms.'),
+    '#default_value' => AddThis::getInstance()->getUiDelay(),
+    '#required' => FALSE,
+    '#size' => 3,
+    '#maxlength' => 3,
+  );
+
+  // Enabled services settings.
+  $form['fieldset_compact_menu']['enabled_services_fieldset'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Enabled services'),
+    '#description' => t('The sharing services you select here will be displayed in the compact menu. If you select no services, AddThis will provide a list of frequently used services. This list is updated regularly. <b>Notice that this setting does not define what services should be display in a toolbox.</b>'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['fieldset_compact_menu']['enabled_services_fieldset'][AddThis::ENABLED_SERVICES_KEY] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Enabled services'),
+    '#options' => AddThis::getInstance()->getServices(),
+    '#default_value' => AddThis::getInstance()->getEnabledServices(),
+    '#required' => FALSE,
+    '#columns' => 3,
+  );
+
+  // Additional visual settings.
+  $form['fieldset_compact_menu']['fieldset_additionals'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Additional configuration'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+  );
+  $form['fieldset_compact_menu']['fieldset_additionals'][AddThis::STANDARD_CSS_ENABLED_KEY] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Use standard AddThis stylesheet'),
+      '#description' => t('If not checked, AddThis will not load standard CSS file, allowing you to style everything yourself without incurring the cost of an additional load.'),
+      '#default_value' => AddThis::getInstance()->isStandardCssEnabled(),
+      '#required' => FALSE,
+  );
+  $form['fieldset_compact_menu']['fieldset_additionals'][AddThis::COMPLIANT_508_KEY] = array(
+      '#type' => 'checkbox',
+      '#title' => t('508 compliant'),
+      '#description' => 'If checked, clicking the AddThis button will open a new window to a page that is keyboard navigable.',
+      '#default_value' => AddThis::getInstance()->get508Compliant(),
+      '#required' => FALSE,
+  );
+  $form['fieldset_compact_menu']['fieldset_additionals'][AddThis::ADDRESSBOOK_ENABLED_KEY] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Use addressbook'),
+      '#description' => 'If checked, the user will be able import their contacts from popular webmail services when using AddThis\'s email sharing.',
+      '#default_value' => AddThis::getInstance()->isAddressbookEnabled(),
+      '#required' => FALSE,
+  );
+
+  // Analytics settings.
+  $profile_id = AddThis::getInstance()->getProfileId();
+  $can_track_clicks = empty($profile_id) ? FALSE : TRUE;
+  $form['fieldset_analytics'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('Analytics & Tracking'),
+        '#collapsible' => TRUE,
+        '#collapsed' => $can_track_clicks ? TRUE : FALSE,
+  );
+
+  if (!$can_track_clicks) {
+    $form['fieldset_analytics']['can_track_notice'] = array(
+      '#theme' => 'html_tag',
+      '#tag' => 'div',
+      '#value' => t('For click analytics and statistics you have to provide a ProfileID from <a href="http://www.addthis.com">AddThis.com</a>. Register <a href="https://www.addthis.com/register" targt="_blank">here</a>.'),
+      '#attributes' => array('class' => array('messages', 'warning')),
+    );
+  }
+  $form['fieldset_analytics'][AddThis::PROFILE_ID_KEY] = array(
+    '#type' => 'textfield',
+    '#title' => t('AddThis ProfileID'),
+    '#default_value' => AddThis::getInstance()->getProfileId(),
+    '#required' => FALSE,
+    '#size' => 25,
+    '#description' => t('ProfileID at <a href="http://addthis.com/" target="_blank">AddThis.com</a>. Required for statistics.'),
+  );
+  $form['fieldset_analytics'][AddThis::CLICKBACK_TRACKING_ENABLED_KEY] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Track clickback'),
+    '#description' => 'Check to allow AddThis to append a variable to your URLs upon sharing. AddThis will use this to track how many people come back to your content via links shared with AddThis. Highly recommended. Always global.',
+    '#default_value' => AddThis::getInstance()->isClickbackTrackingEnabled(),
+    '#required' => FALSE,
+  );
+
+  // Facebook Like tracking requires a namespace to be added.
+  $rdf_enabled = module_exists('rdf');
+  if (!$rdf_enabled) {
+    $rdf_description = '<span class="admin-disabled">' . t('The RDF module needs to be enabled to support Facebook Like tracking support.<br>Enable the module on <a href="!modules">modules</a> page.',
+      array('!modules' => base_path() . 'admin/modules')
+    ) . '</span>';
+  }
+  else {
+    $rdf_description = t('Check to enable Facebook Like tracking support. Always global.');
+  }
+  $form['fieldset_analytics']['title_facebook'] = array(
+    '#theme' => 'html_tag',
+    '#tag' => 'div',
+    '#value' => '<b>' . t('Facebook') . '</b>',
+  );
+  $form['fieldset_analytics']['facebook_notice'] = array(
+    '#theme' => 'html_tag',
+    '#tag' => 'p',
+    '#value' => $rdf_description,
+    '#access' => !$rdf_enabled,
+  );
+
+  $form['fieldset_analytics'][AddThis::FACEBOOK_LIKE_COUNT_SUPPORT_ENABLED] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Enable Facebook Like tracking'),
+        '#description' => filter_xss($rdf_description, array('span')),
+        '#default_value' => AddThis::getInstance()->isFacebookLikeCountSupportEnabled(),
+        '#required' => FALSE,
+        '#disabled' => !$rdf_enabled,
+  );
+
+  // Google Analytics and Google Social Tracking support
+  $can_do_google_social_tracking = module_exists('googleanalytics');
+  $is_google_analytics_setup = $can_do_google_social_tracking && variable_get('googleanalytics_account', '');
+  $form['fieldset_analytics']['google_analytics'] = array(
+    '#theme' => 'html_tag',
+    '#tag' => 'div',
+    '#value' => '<b>' . t('Google Analytics') . '</b>',
+  );
+  if (!$can_do_google_social_tracking) {
+    $form['fieldset_analytics']['can_do_google_analytics'] = array(
+      '#theme' => 'html_tag',
+      '#tag' => 'p',
+      '#value' => '<span class="admin-disabled">' . t('Install/enable the <a href="http://drupal.org/project/google_analytics" target="_blank">Google Analytics</a> module for Social Tracking support.') . '</span>',
+    );
+  }
+  elseif ($can_do_google_social_tracking && !$is_google_analytics_setup) {
+    $form['fieldset_analytics']['can_do_google_analytics'] = array(
+      '#theme' => 'html_tag',
+      '#tag' => 'p',
+      '#value' => '<span class="admin-disabled">' . t('Configure the Google Analytics module correctly with the account code to use this feature.') . '</span>',
+    );
+  }
+  $form['fieldset_analytics'][AddThis::GOOGLE_ANALYTICS_TRACKING_ENABLED_KEY] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Track with Google Analytics'),
+    '#description' => t('Check to track shares in your Google Analytics account reports (<a href="http://www.addthis.com/help/google-analytics-integration">more info</a>). Always global.'),
+    '#default_value' => AddThis::getInstance()->isGoogleAnalyticsTrackingEnabled(),
+    '#required' => FALSE,
+    '#disabled' => !$is_google_analytics_setup,
+  );
+  $form['fieldset_analytics'][AddThis::GOOGLE_ANALYTICS_SOCIAL_TRACKING_ENABLED_KEY] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Track with Google Analytics social'),
+    '#description' => t('Check to track shares in the new Google Analytics social interaction reports (<a href="http://www.addthis.com/help/google-analytics-integration#social">more info</a>). Always global.'),
+    '#default_value' => AddThis::getInstance()->isGoogleAnalyticsSocialTrackingEnabled(),
+    '#required' => FALSE,
+    '#disabled' => !$is_google_analytics_setup,
+  );
+
+
+  // Third party settings.
+  $form['third_party_fieldset'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Third party settings'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['third_party_fieldset']['twitter_service'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Twitter'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['third_party_fieldset']['twitter_service'][AddThis::TWITTER_VIA_KEY] = array(
+    '#type' => 'textfield',
+    '#title' => t('Send via'),
+    '#description' => t('When sending a tweet this is the screen name of the user to attribute the Tweet to. (Relates to Tweet Button)'),
+    '#default_value' => AddThis::getInstance()->getTwitterVia(),
+    '#size' => 15,
+  );
+  $form['third_party_fieldset']['twitter_service'][AddThis::TWITTER_TEMPLATE_KEY] = array(
+    '#type' => 'textfield',
+    '#title' => t('Template text'),
+    '#description' => t('The {{title}} and {{url}} are replaced from the Twitter Button.'),
+    '#default_value' => AddThis::getInstance()->getTwitterTemplate(),
+  );
+
+  return system_settings_form($form);
+}
+
+function addthis_admin_settings_advanced_form($form_state) {
+
+  // Service URL's settings.
+  $form['service_urls_fieldset'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Service URLs'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+  );
+  $form['service_urls_fieldset'][AddThis::BOOKMARK_URL_KEY] = array(
+      '#type' => 'textfield',
+      '#title' => t('AddThis bookmark URL'),
+      '#default_value' => AddThis::getInstance()->getBaseBookmarkUrl(),
+      '#required' => TRUE,
+  );
+  $form['service_urls_fieldset'][AddThis::SERVICES_CSS_URL_KEY] = array(
+      '#type' => 'textfield',
+      '#title' => t('AddThis services stylesheet URL'),
+      '#default_value' => AddThis::getInstance()->getServicesCssUrl(),
+      '#required' => TRUE,
+  );
+  $form['service_urls_fieldset'][AddThis::SERVICES_JSON_URL_KEY] = array(
+      '#type' => 'textfield',
+      '#title' => t('AddThis services json URL'),
+      '#default_value' => AddThis::getInstance()->getServicesJsonUrl(),
+      '#required' => TRUE,
+  );
+  $form['service_urls_fieldset'][AddThis::WIDGET_JS_URL_KEY] = array(
+      '#type' => 'textfield',
+      '#title' => t('AddThis javascript widget URL'),
+      '#default_value' => AddThis::getInstance()->getBaseWidgetJsUrl(),
+      '#required' => TRUE,
+  );
+
+  // Advanced settings.
+  $form['advanced_settings_fieldset'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Advanced settings'),
+    '#access' => user_access(AddThis::PERMISSION_ADMINISTER_ADVANCED_ADDTHIS),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['advanced_settings_fieldset'][AddThis::CUSTOM_CONFIGURATION_CODE_ENABLED_KEY] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Use custom AddThis configuration code'),
+    '#default_value' => AddThis::getInstance()->isCustomConfigurationCodeEnabled(),
+    '#required' => FALSE,
+    '#description' => t('Use custom AddThis configuration code. If checked, custom configuration will be used instead of other configuration settings provided in AddThis administration user interface.'),
+  );
+  $form['advanced_settings_fieldset'][AddThis::CUSTOM_CONFIGURATION_CODE_KEY] = array(
+    '#type' => 'textarea',
+    '#title' => t('AddThis custom configuration code'),
+    '#default_value' => AddThis::getInstance()->getCustomConfigurationCode(),
+    '#required' => FALSE,
+    '#description' => t('AddThis custom configuration code. See format at <a href="http://addthis.com/" target="_blank">AddThis.com</a>'),
+  );
+  return system_settings_form($form);
+}
diff --git a/htmltest/sites/all/modules/addthis/includes/addthis.block.inc b/htmltest/sites/all/modules/addthis/includes/addthis.block.inc
new file mode 100644
index 00000000..62486b0e
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/includes/addthis.block.inc
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Block related hook implementations for the AddThis-module.
+ */
+
+/**
+ * Implements hook_block_info().
+ */
+function addthis_block_info() {
+  $block_info = array();
+  $block_info[AddThis::BLOCK_NAME] = array(
+    'info' => t('AddThis'),
+    'cache' => DRUPAL_NO_CACHE,
+  );
+  return $block_info;
+}
+
+/**
+ * Implements hook_block_view().
+ *
+ * #block key allows alter hooks to react on this information. Someone might
+ * want to change this specific display.
+ */
+function addthis_block_view($block_name = '') {
+  if ($block_name == AddThis::BLOCK_NAME) {
+    $widget_type = AddThis::getInstance()->getBlockDisplayType();
+    $markup = AddThis::getInstance()->getDisplayMarkup($widget_type, array('#block' => AddThis::BLOCK_NAME));
+    return array(
+      'subject' => '',
+      'content' => $markup,
+    );
+  }
+}
+
+/**
+ * Implements hook_block_configure().
+ */
+function addthis_block_configure($delta = '') {
+  $form[AddThis::BLOCK_WIDGET_TYPE_KEY] = array(
+    '#type' => 'select',
+    '#title' => t('AddThis display type'),
+    '#options' => AddThis::getInstance()->getDisplayTypes(),
+    '#default_value' => AddThis::getInstance()->getBlockDisplayType(),
+  );
+  return $form;
+}
+
+/**
+ * Implements hook_block_save().
+ */
+function addthis_block_save($delta = '', $edit = array()) {
+  variable_set(AddThis::BLOCK_WIDGET_TYPE_KEY, $edit[AddThis::BLOCK_WIDGET_TYPE_KEY]);
+}
diff --git a/htmltest/sites/all/modules/addthis/includes/addthis.field.inc b/htmltest/sites/all/modules/addthis/includes/addthis.field.inc
new file mode 100644
index 00000000..8e597259
--- /dev/null
+++ b/htmltest/sites/all/modules/addthis/includes/addthis.field.inc
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * @file
+ * Field related hook implementations for the AddThis-module.
+ */
+
+/**
+ * Implements hook_field_info().
+ */
+function addthis_field_info() {
+  return array(
+    AddThis::FIELD_TYPE => array(
+      'label' => t('AddThis'),
+      'description' => t('This field stores addthis settings in the database.'),
+      'settings' => array('max_length' => 255),
+      'default_widget' => AddThis::WIDGET_TYPE,
+      'default_formatter' => AddThis::WIDGET_TYPE_DISABLED,
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_is_empty().
+ */
+function addthis_field_is_empty($item, $field) {
+  return empty($item['value']) && (string) $item['value'] !== '0';
+}
+
+/**
+ * Implements hook_field_formatter_info().
+ *
+ * Creates a formatter element for all the default formatter types.
+ */
+function addthis_field_formatter_info() {
+  $formatters = array();
+
+  foreach (AddThis::getInstance()->getDefaultFormatterTypes() as $key => $label) {
+    $formatters[$key] = array(
+      'label' => $label,
+      'field types' => array(AddThis::FIELD_TYPE),
+    );
+  }
+
+  return $formatters;
+}
+
+/**
+ * Implementation to retrieve formatters for a given type of field.
+ */
+function _addthis_field_info_formatter_field_type($field_type = NULL) {
+  $formatters = field_info_formatter_types();
+  foreach ($formatters as $key => $formatter) {
+    if (!in_array((!isset($field_type) ? AddThis::FIELD_TYPE : $field_type), $formatter['field types'])) {
+      unset($formatters[$key]);
+    }
+  }
+  return $formatters;
+}
+
+/**
+ * Implements hook_field_formatter_view().
+ */
+function addthis_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  return addthis_render_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display);
+}
+
+// There is only one item to display, the share item.
+// Get the markup for the display type and add that to the $element[0] to display.
+function addthis_render_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+
+  $element = array();
+  $display_type = $display['type'];
+
+  $options = array(
+    '#entity_type' => $entity_type,
+    '#entity' => $entity,
+    '#display' => $display,
+  );
+
+  $markup = AddThis::getInstance()->getDisplayMarkup($display_type, $options);
+  if (!isset($element[0])) {
+    $element[0] = $markup;
+  }
+  return $element;
+}
+
+/**
+ * Implements hook_field_prepare_view().
+ *
+ * Adds a dummy value in AddThis field for nodes that do not have any value for
+ * the field to make rendering possible.
+ */
+function addthis_field_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items) {
+  foreach ($items as $key => $item) {
+    if (!isset($item[0]['value'])) {
+      $items[$key][0]['value'] = 'Dummy value';
+    }
+  }
+}
+
+/**
+ * Implements hook_field_presave().
+ *
+ * Adds a dummy value to $items to make rendering possible.
+ */
+function addthis_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  $dummy_value = 'Dummy value';
+
+  if (count($items) == 0) {
+    $items += array(array('value' => $dummy_value));
+  }
+  else {
+    foreach ($items as $delta => $value) {
+      $items[$delta]['value'] = $dummy_value;
+    }
+  }
+}
+
+/**
+ * Implements hook_field_widget_info().
+ */
+function addthis_field_widget_info() {
+  return array(
+    AddThis::WIDGET_TYPE => array(
+      'label' => t('AddThis button'),
+      'field types' => array(AddThis::FIELD_TYPE),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_widget_form().
+ *
+ * The AddThis field is a placeholder field and has no widget settings.
+ * To suppress the form, #access is set to FALSE.
+ */
+function addthis_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+
+  if ($instance['widget']['type'] == AddThis::WIDGET_TYPE) {
+    $main_widget = $element + array(
+      '#access' => FALSE,
+    );
+    $element['value'] = $main_widget;
+  }
+
+  return $element;
+}
+
+/**
+ * Implements hook_field_widget_error().
+ */
+function addthis_field_widget_error($element, $error, $form, &$form_state) {
+  switch ($error['error']) {
+    default:
+      $error_element = $element[$element['#columns'][0]];
+      break;
+  }
+
+  form_error($error_element, $error['message']);
+}
diff --git a/htmltest/sites/all/modules/admin_menu/CHANGELOG.txt b/htmltest/sites/all/modules/admin_menu/CHANGELOG.txt
new file mode 100644
index 00000000..b2dcdfef
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/CHANGELOG.txt
@@ -0,0 +1,366 @@
+
+Admin Menu 7.x-3.x, xxxx-xx-xx
+------------------------------
+#1177202 by das-peter, dereine, sun: Fixed copying and re-injection of child
+  router items breaks badly. Change them by reference instead.
+  Requires latest Views 3.x code.
+#1212064 by sun: Updated admin_views default views for VBO 3.x.
+#1196590 by sun: Fixed errors and notices for admin_views with Views 3.
+#1144768 by idlewilder, sun: Fixed devel modules to skip are not displayed.
+#1079374 by WillHall: Fixed JS Error: unrecognized expression: [href=/].
+#1114132 by joelstein, sun: Added Field UI to list of developer modules.
+#1008380 by bdragon, sun: Updated admin_views for D7.
+#1146644 by sun: Fixed PHP 5.3 compability in tests.
+#442560 by sun: Fixed 'defer' script attribute breaks Drupal.behaviors in FF3.6.
+#1022902 by matglas86, sun: Updated for changed core Toolbar styles.
+
+
+Admin Menu 7.x-3.0-RC1, 2010-01-07
+----------------------------------
+#990774 by sun: Updated for $closure renamed to $page_bottom.
+#991906 by johnv, sun: Added configure to .info file.
+#947198 by sun: Added hint about disabling Toolbar.
+by sun: Updated administrative settings form for D7 UX guidelines.
+by sun: Disabled "Rebuild system links" button on settings form.
+#420816 by sun, smk-ka: Improved on-demand loading of dynamic paths.
+#420816 by tim.plunkett: Fixed dynamic Field UI paths for vocabularies.
+#871774 by swentel: Fixed developer modules toggle still uses referer_uri().
+#671760 by sun: Updated for new preprocess defaults.
+#731462 by sun: Updated for system_rebuild_theme_data().
+by sun: Re-added a "Rebuild system links" button to settings form.
+#420816 by tim.plunkett: Updated taxonomy path map for machine names.
+#857688 by sun: Updated for reverted system_settings_form().
+#420816 by smk-ka, sun: Added merging of menu trees containing dynamic paths.
+by sun: Fixed tests and minor admin_menu_toolbar styling issues.
+by sun: Fixed various styling issues for admin_menu and admin_menu_toolbar.
+by sun: Updated for Schema API, DBTNG, coding standards.
+by sun: Updated for new admin/modules path.
+#701424 by hutch: Updated for new admin/people/people path.
+by sun: Removed orphan menu rewrite function.
+#667858 by sun: Don't remove the current user from the switch user list.
+#631550 by sun: Updated for fixed MENU_VISIBLE_IN_BREADCRUMB behavior.
+#658344 by dereine, sun: Updated for removed drupal_session_count().
+by sun: Added separate permission to flush cashes.
+by sun: Updated for changed Devel settings form.
+by sun: Updated for new {system}.info module data.
+#614730 by azriprajwala, sun: Updated for hook_theme() key changes.
+by sun: Updated for all theme functions should take a single argument.
+by sun: Reverted removal of registry cache flushing option.
+#578520 by sun: Fixed destination query parameter is processed wrongly.
+#578520 by sun: Updated for $query in url() should always be an array.
+by Dave Reid: Updated for PHP 5 date constants.
+by sun: Updated for new database API.
+by smk-ka: Removed remnants of the registry. Fixed flush admin menu cache
+  command.
+#567618 by smk-ka: Revised test cases. Abstracted out base web test class.
+by sun: Updated for removed registry, new admin paths.
+#326539 by sun: Updated for class attribute array.
+#519782 by sun: Updated for hook_footer() replaced by hook_page_alter().
+#525638 by Razorraser: Updated for admin/build renamed to admin/structure.
+by Dave Reid: Updated for hook_permission().
+#482314 by Dave Reid: Updated for node_type_get_types().
+#437506 by yched, Dave Reid: Updated for menu_router_build().
+#376816 by sun: Updated for compatibility for other JavaScript libraries.
+#337820 by Dave Reid: Updated for new user/logout path.
+#340546 by Dave Reid: Updated for drupal_add_js().
+#340531 by Dave Reid: Updated for module_list().
+#266358 by sun: Updated for drupal_add_css().
+#320526 by yettyn, sun: Updated to UNSTABLE-2 (DBTNG queries, permissions, etc).
+by sun: Changed admin_menu_wipe() to admin_menu_flush_caches().
+by sun: Updated content-type edit menu item locations.
+by sun: Fixed sess_count() changed to drupal_session_count().
+
+
+Admin Menu 6.x-3.x, xxxx-xx-xx
+------------------------------
+#588936 by fenstrat: Fixed Toolbar shortcuts not visible.
+#860390 by Kevin Rogers: Fixed .info file parsing error on uncertain platform.
+#551484 by sun: Fixed stale hook_admin_menu_output_alter() docs.
+
+
+Admin Menu 6.x-3.0-ALPHA4, 2010-03-11
+-------------------------------------
+#730156 by sun: Fixed Administration views.
+by sun: Fixed missing .element-hidden style in D6 for permissions tweak.
+#645526 by TravisCarden: Fixed stale local tasks markup after moving them.
+#366442 by sun: Added tweak to collapse modules on permissions page.
+#655926 by donquixote, sun: Improved performance of delayed mouseout.
+#557062 by sun: Fixed admin_menu_toolbar JS/CSS loaded before admin_menu's.
+#599462 by sun, koyama: Added background-color to avoid unintentional override.
+#601918 by BWPanda: Fixed admin_menu.css overrides admin_menu_toolbar.css.
+#586228 by Island Usurper: Fixed for PHP 5.3.
+#554124 by Dave Reid: Added missing toolbar.png.
+#557062 by Dave Reid: Fixed undefined Drupal.admin error when including
+  admin_menu_toolbar.js before admin_menu.js.
+#511744 by smk-ka, sun: Fixed /admin page links are broken.
+by smk-ka: Added missing variables to hook_uninstall().
+#571038 by smk-ka: Removed call to admin_menu_wipe() and cleaned install file.
+#552190 by Bartezz: Fixed missing t() for user logout link.
+
+
+Admin Menu 6.x-3.0-ALPHA3, 2009-08-16
+-------------------------------------
+#502500 by sun: Added "Create content" menu.
+#538714 by sun: Fixed wrong re-parenting in Drupal's menu system.
+#550132 by sun: Fixed (temporarily) admin_views menu items.
+by sun: Added Administration views sub-module, converting all administrative
+  listing pages in Drupal core into real, ajaxified, and alterable views.
+#547206 by sun: Fixed menu link descriptions lead to mouseover clashes.
+#540954 by Rob Loach: Added String Overrides to list of developer modules.
+#540762 by Deslack: Added Malay translation.
+
+
+Admin Menu 6.x-3.0-ALPHA2, 2009-08-02
+-------------------------------------
+#527908 by sun: Changed theme_admin_menu_links() to use $element['#children'].
+#527908 by markus_petrux, sun: Changed admin menu into a renderable array.
+#420812 by sun, smk-ka: Added support for hook_js().
+by sun: Fixed destination query string of current page not applied to links.
+by sun: Changed Drupal.admin.attachBehaviors() to accept local JS settings.
+#276751 by sun: Revamped rendering of menu additions/widgets.
+#500866 by sun: Updated for removed t() from getInfo() in tests.
+#402058 by sun: Added Administration menu toolbar module.
+by markus_petrux, sun: Added API documentation.
+#461264 by sun: Added site/domain as CSS class.
+#451270 by smk-ka, sun: Changed visual indication for uid1.
+by sun: Minor code clean-up.
+#490670 by sun: Fixed missing menu after installation/upgrade.
+#515718 by joelstein, sun: Added rules_admin module to developer modules list.
+#352065 by sun: Added setting to select developer modules to keep enabled.
+#511854 by psynaptic: Fixed logout link.
+#424960 by markus_petrux, sun: Fixed gzip compression for cached output.
+by sun: Fixed opacity of links in sub-menus.
+#479922 by sun: Fixed fieldsets not collapsed on admin/build/modules/list*.
+#495148 by sun: Fixed MENU_NORMAL_ITEMs do not appear in administration menu.
+by sun: Fixed tests for new content-type locations.
+#345984 by markus_petrux, sun: Fixed old menu links not removed on upgrade.
+#276751 by sun: Major rewrite. Fixed menu items cannot be moved, altered, or
+  added as well as various performance issues.
+by sun: Added variable to allow to disable caching (rewrite).
+
+
+Admin Menu 6.x-3.0-ALPHA1, 2009-06-10
+-------------------------------------
+#236657 by sun: Updated for corrected arguments of system_clear_cache_submit().
+#483870 by sun: Fixed compatibility with new Admin module.
+#483152 by sun: Fixed admin_menu caches not flushed when clean URLs are toggled.
+#479922 by danep: Fixed fieldsets not collapsed on admin/build/modules/list.
+#469716 by sun: Fixed wrong AJAX callback URL under various conditions.
+#471504 by wulff: Updated Danish translation.
+by sun: Fixed admin_menu_suppress() does not suppress margin-top.
+#451270 by sun: Added visual indication when working as uid 1.
+by Dave Reid: Updated for getInfo() in tests.
+#420828 by sun: Added dynamic replacements for cached administration menu.
+#420840 by sun: Fixed Drupal.behaviors.adminMenu must be only executed once.
+#345984 by markus_petrux, sun: Added client-side caching of administration menu.
+  Attention: A new era of Drupal user experience starts here.  This is the very
+  first issue of a series of improvements targeting plain awesomeness.
+#349169 by sun: Fixed Devel switch user links contain multiple path prefixes.
+#345984 by sun: Code clean-up in preparation for client-side caching.
+#415196 by psynaptic: Updated for CSS coding standards.
+#406672 by mr.j, sun: Fixed "Move local tasks" option leaves stale UL.
+by sun: Major code clean-up and sync across 3.x branches.
+#349505 by smk-ka, sun: Performance: Added caching of entire menu output.
+#315342 by wulff: Added "My account" link (by splitting the "Log out" item).
+#384100 by kepol, sun: Fixed content-type items displayed in wrong place.
+#373339 by sun: Fixed double-escaped 'Edit <content-type>' link titles.
+#373372 by sun: Turned procedural JavaScript into admin menu behaviors.
+by sun: Fixed admin menu tests (and updated to 6.x for SimpleTest 2.x).
+#359158 by nitrospectide, sun: Fixed Devel Themer breaks admin menu.
+#365335 by sun: Fixed not all variables removed after uninstall.
+
+
+Admin Menu 6.x-1.3, 2009-01-24
+------------------------------
+#362454 by sun: Fixed Drupal.settings.admin_menu is undefined JS error in some
+  browsers.
+
+
+Admin Menu 6.x-1.2, 2009-01-20
+------------------------------
+#358697 by sun: Added docs about admin_menu_suppress() to README.txt.
+#342684 by darumaki, sun: Added notice about Opera configuration to README.txt.
+#350932 by sun: Fixed "Run updates" link repeated per language/site.
+#342298 by gustz: Updated Spanish translation.
+#346106 by sun: Fixed XHTML-Strict validation for admin menu icon.
+#287448 by sun: Fixed unnecessary menu rebuild for users without permission to
+  use admin menu.
+#342002 by AltaVida: Fixed improper test for node/add paths.
+#272920 by keith.smith: Changed all text strings throughout the module.
+#322731 by sun: Fixed improper use of t() in module install file.
+#282030 by sun: Fixed "Run updates" item visible for unprivileged users.
+#322877 by sun: Added tweak to move page tabs into administration menu.
+#287468 by sun: Fixed module paths directly below "admin" get the wrong parent.
+#310423 by sun: Added optional position: fixed configuration setting.
+#292657 by smk-ka: Improved rendering performance.
+#234149 by yhager, sun: Fixed RTL support for IE.
+#323726 by danez1972: Added Spanish translation.
+#325057 by sun: Updated README.txt.
+#234149 by yhager, levavie, sun: Added RTL support.
+#325057 by sun: Added links to flush specific caches.
+#324334 by AltaVida: Fixed usernames with spaces not in Devel user switch links.
+#319382 by betz: Added Dutch translation.
+
+
+Admin Menu 6.x-1.1, 2008-09-12
+------------------------------
+#295476 by pwolanin, use <front> for icon path to fix front-page path-change
+  bug and pathauto conflict, add wipe button to admin form.
+#301370 by sun: Disabled module fieldset collapsing behavior by default.
+#288672 by sun: Fixed JS hover behavior not working in IE.
+#290803 by sun: Fixed missing devel_themer in devel modules; added some others.
+#286636 by sun: Fixed menus do not drop down in IE6.
+#249537 by pwolanin, sun: Added admin_menu_suppress() to allow other modules to
+  disable the display of admin_menu on certain pages (f.e. popups).
+#268211 by sun: Fixed invalid issue queue links for custom modules and
+  sub-modules of projects.
+#261461 by sun: Added FAQ entry for displaying other menus like admin_menu.
+#264067 by sun: Added FAQ entry for huge amount of anonymous users displayed.
+#280002 by pwolanin: Clean up .test setUp function.
+#242377 by sun: Fixed sub-level menu items exceed total document height.
+
+
+Admin Menu 6.x-1.0, 2008-06-26
+------------------------------
+#266308 by sun: Fixed jQuery 1.0.x incompatible selector for collapsing modules.
+#268373 by sun: Added hook_update to cleanup for alpha/beta testers.
+#268373 by sun: Added menu callback to disable/enable developer modules.
+#132524 by pwolanin: Fixed admin_menu links are re-inserted each time menu links
+  are rebuilt.
+by smk-ka: Performance: Use 'defer' attribute for JavaScript to delay execution.
+#266099 by sun: Fixed description of "Apply margin-top" configuration setting.
+#266308 by sun: Usability: Added Utility module features to collapse module
+  fieldsets on Modules page.
+#251341 by sun: Added docs about display drupal links permission.
+
+
+Admin Menu 6.x-1.0-BETA, 2008-06-08
+-----------------------------------
+#132524 by sun: Fixed support for sub-content-types below node/add.
+#132524 by pwolanin: Added support for localizable menu links.
+#132524 by pwolanin, sun: Fixed menu links adjustments.
+#132524 by pwolanin: Added simpletest.
+#132524 by pwolanin: Major rewrite to better use Drupal 6 menu system.
+#132524 by sun: Moved gettext translation files into translations.
+#132524 by sun: Committing pre-alpha code for D6 due to public demand.
+
+
+Admin Menu 5.x-2.x, xxxx-xx-xx
+------------------------------
+#246221 by sun: Fixed user counter displays different values than Who's online
+  block.
+#239022 by mikl: Added Danish translation.
+#234444 by smk-ka: Fixed admin_menu icon does not respect theme settings.
+#198240 by sun: Fixed admin_menu displayed in print output.
+
+
+Admin Menu 5.x-2.4, 2008-02-24
+------------------------------
+#214740 by sun: Regression: Fixed directly applied marginTop not supported by IE.
+#214725 by sun: Fixed wrong CSS id in admin_menu.js (missed in 5.x-2.3).
+
+
+Admin Menu 5.x-2.3, 2008-02-24
+------------------------------
+#214725 by sun: Fixed CSS id and classes should not contain underscores.
+#209390 by sun: Added note about interaction with user role permissions.
+#214740 by jjeff, sun: Added module settings to configure margin-top CSS.
+#200737 by sun: Changed admin_menu (fav)icon to use theme setting, if defined.
+#203116 by smk-ka: Improved performance of non-cached admin_menu by storing
+  already processed URLs in the cache.
+#224605 by sun: 'Add <content_type>' items do not appear without 'administer
+  nodes' permission.
+#210615 by robertgarrigos: Fixed Mozilla Mac: Collapsible fieldsets display
+  error.
+
+
+Admin Menu 5.x-2.2, 2007-01-08
+------------------------------
+#204884 by jjeff: Usability: Override theme font family declaration.
+#204935 by jjeff: Added mouseout delay for hovered menus (yay!).
+#193941 by downgang: Fixed margin in IE6 using Garland theme.
+#197306 by sun: Fixed 'Run updates' leads to wrong url with clean URLs disabled.
+Moved images into sub-folder.
+by smk-ka: Fixed icon title for user counter not displayed & coding style.
+Fixed user count not displayed without 'administer users' permission.
+
+
+Admin Menu 5.x-2.1, 2007-12-02
+------------------------------
+Fixed adding menu items with negative weight not always working.
+Fixed admin_menu_copy_items() is overwriting already existing items.
+Fixed display menu item ids in devel settings does not work.
+
+
+Admin Menu 5.x-2.0, 2007-12-02
+------------------------------
+Added devel_admin_menu() for fast access to clear-cache, variable editor and
+  switch_user.
+Added username to logout button.
+Added hook_admin_menu() to allow other modules to alter admin_menu.
+#194189 by sun: Added counter for current anonymous/authenticated users.
+Added Drupal.org project issue queue links for all enabled contrib modules.
+#189701 by sun: Changed admin_menu icon to be a menu.
+#193925 by sun: Removed obsolete menu slicing code.
+#193669 by smk-ka: Moved admin_menu builder functions into include file.
+
+
+Admin Menu 5.x-1.2, 2007-11-18
+------------------------------
+#176969 by smk-ka: Fixed performance issues with path(auto) module by
+  introducing a menu cache for admin_menu.
+#179648 by sun: Inject admin_menu into theme.
+  Fixes several CSS bugs in various themes and also activation of admin_menu
+  immediately after installation.
+#191213 by Standard: Fixed block info shouldn't contain the word "block".
+#187816 by sun: Fixed "Add" not translatable.
+#186218 by sun: Fixed admin menu icon too big in Safari.
+#182563 by sun: Fixed wrong datatype for array_search in _admin_menu_get_children().
+#183496 by sun: Fixed invalid argument supplied for foreach in admin_menu_copy_items().
+
+
+Admin Menu 5.x-1.1, 2007-10-10
+------------------------------
+#178876 by sun: Fixed 3rd-level submenus expand without hover over.
+#153455 by sun: Fixed add product node sub-elements are empty.
+Fixed path_to_theme() call breaking blocks page.
+#177582 by sun: Fixed bluebreeze theme compatibility.
+
+
+Admin Menu 5.x-1.0, 2007-09-06
+------------------------------
+#156952 by sun: Fixed admin menu inaccessible due to margins.
+#149229 by sun: Fixed admin menu not expanding in IE7.
+#172545 by sun: Use opacity instead of -moz-opacity.
+#132867 Fixed z-index too low.
+- Fixed admin menu block selectors to override any other theme styles.
+#155589 by sun: Added permission to access administration menu.
+- Fixed a PHP warning when there are no content types defined in the system, as
+  node/add then has no child menu items.
+#155312 by sun: Fixed menu item tooltip clashes.
+Added support for custom stylesheets per theme.
+Removed 4.7.x compatibility.
+
+
+Admin Menu 4.7-1.3, 2007-03-30
+------------------------------
+#126601 Fixed Users can see inaccessible items.
+#121027 Fixed Page not found entries for menu-collapsed.png.
+
+
+Admin Menu 4.7-1.2, 2007-03-04
+------------------------------
+- Fixed menu item adjustments
+- Fixed IE / Safari support
+- Fixed base_path for IE support
+- Added create content options to content management menu
+
+
+Admin Menu 4.7-1.1, 2007-01-24
+------------------------------
+First stable release, compatible to Drupal 4.7.x and 5.x.
+
+
+Admin Menu 4.7-1.0, 2007-01-16
+------------------------------
+Initial release of admin_menu module. Already supporting Drupal 5.0.
diff --git a/htmltest/sites/all/modules/admin_menu/LICENSE.txt b/htmltest/sites/all/modules/admin_menu/LICENSE.txt
new file mode 100644
index 00000000..d159169d
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/LICENSE.txt
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/htmltest/sites/all/modules/admin_menu/README.txt b/htmltest/sites/all/modules/admin_menu/README.txt
new file mode 100644
index 00000000..f66a61e3
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/README.txt
@@ -0,0 +1,188 @@
+
+-- SUMMARY --
+
+The Administration menu module displays the entire administrative menu tree (and
+most local tasks) in a drop-down menu, providing administrators one- or
+two-click access to most pages.  Other modules may also add menu links to the
+menu using hook_admin_menu_output_alter().
+
+For a full description of the module, visit the project page:
+  http://drupal.org/project/admin_menu
+
+To submit bug reports and feature suggestions, or to track changes:
+  http://drupal.org/project/issues/admin_menu
+
+
+-- REQUIREMENTS --
+
+None.
+
+
+-- INSTALLATION --
+
+* Install as usual, see http://drupal.org/node/70151 for further information.
+
+* You likely want to disable Toolbar module, since its output clashes with
+  Administration menu.
+
+
+-- CONFIGURATION --
+
+* Configure user permissions in Administration » People » Permissions:
+
+  - Use the administration pages and help (System module)
+
+    The top-level administration categories require this permission to be
+    accessible. The administration menu will be empty unless this permission is
+    granted.
+
+  - Access administration menu
+
+    Users in roles with the "Access administration menu" permission will see
+    the administration menu at the top of each page.
+
+  - Display Drupal links
+
+    Users in roles with the "Display drupal links" permission will receive
+    links to drupal.org issue queues for all enabled contributed modules. The
+    issue queue links appear under the administration menu icon.
+
+  Note that the menu items displayed in the administration menu depend on the
+  actual permissions of the viewing user. For example, the "People" menu item
+  is not displayed to a user who is not a member of a role with the "Administer
+  users" permission.
+
+* Customize the menu settings in Administration » Configuration and modules »
+  Administration » Administration menu.
+
+* To prevent administrative menu items from appearing twice, you may hide the
+  "Management" menu block.
+
+
+-- CUSTOMIZATION --
+
+* To override the default administration menu icon, you may:
+
+  1) Disable it via CSS in your theme:
+
+     body #admin-menu-icon { display: none; }
+
+  2) Alter the image by overriding the theme function:
+
+     Copy the entire theme_admin_menu_icon() function into your template.php,
+     rename it to phptemplate_admin_menu_icon() or THEMENAME_admin_menu_icon(),
+     and customize the output according to your needs.
+
+  Remember that the output of the administration menu is cached. To see changes
+  from your theme override function, you must clear your site cache (via
+  the "Flush all caches" link on the menu).
+
+* To override the font size, add the following line to your theme's stylesheet:
+
+  body #admin-menu { font-size: 10px; }
+
+
+-- TROUBLESHOOTING --
+
+* If the menu does not display, check the following:
+
+  - Are the "Access administration menu" and "Use the administration pages and help"
+    permissions enabled for the appropriate roles?
+
+  - Does html.tpl.php of your theme output the $page_bottom variable?
+
+* If the menu is rendered behind a Flash movie object, add this property to your
+  Flash object(s):
+
+  <param name="wmode" value="transparent" />
+
+  See http://drupal.org/node/195386 for further information.
+
+
+-- FAQ --
+
+Q: When the administration menu module is enabled, blank space is added to the
+   bottom of my theme. Why?
+
+A: This is caused by a long list of links to module issue queues at Drupal.org.
+   Use Administer >> User management >> Permissions to disable the "display
+   drupal links" permission for all appropriate roles. Note that since UID 1
+   automatically receives all permissions, the list of issue queue links cannot
+   be disabled for UID 1.
+
+
+Q: After upgrading to 6.x-1.x, the menu disappeared. Why?
+
+A: You may need to regenerate your menu. Visit
+   http://example.com/admin/build/modules to regenerate your menu (substitute
+   your site name for example.com).
+
+
+Q: Can I configure the administration menu module to display another menu (like
+   the Navigation menu, for instance)?
+
+A: No. As the name implies, administration menu module is for administrative
+   menu links only. However, you can copy and paste the contents of
+   admin_menu.css into your theme's stylesheet and replace #admin-menu with any
+   other menu block id (#block-menu-1, for example).
+
+
+Q: Sometimes, the user counter displays a lot of anonymous users, but no spike
+   of users or requests appear in Google Analytics or other tracking tools.
+
+A: If your site was concurrently spidered by search-engine robots, it may have
+   a significant number of anonymous users for a short time. Most web tracking
+   tools like Google Analytics automatically filter out these requests.
+
+
+Q: I enabled "Aggregate and compress CSS files", but admin_menu.css is still
+   there. Is this normal?
+
+A: Yes, this is the intended behavior. the administration menu module only loads
+   its stylesheet as needed (i.e., on page requests by logged-on, administrative
+   users).
+
+
+Q: Why are sub-menus not visible in Opera?
+
+A: In the Opera browser preferences under "web pages" there is an option to fit
+   to width. By disabling this option, sub-menus in the administration menu
+   should appear.
+
+
+Q: How can the administration menu be hidden on certain pages?
+
+A: You can suppress it by simply calling the following function in PHP:
+
+     module_invoke('admin_menu', 'suppress');
+
+   However, this needs to happen as early as possible in the page request, so
+   placing it in the theming layer (resp. a page template file) is too late.
+   Ideally, the function is called in hook_init() in a custom module.  If you do
+   not have a custom module, placing it into some conditional code at the top of
+   template.php may work out, too.
+
+
+-- CONTACT --
+
+Current maintainers:
+* Daniel F. Kudwien (sun) - http://drupal.org/user/54136
+* Peter Wolanin (pwolanin) - http://drupal.org/user/49851
+* Stefan M. Kudwien (smk-ka) - http://drupal.org/user/48898
+* Dave Reid (Dave Reid) - http://drupal.org/user/53892
+
+Major rewrite for Drupal 6 by Peter Wolanin (pwolanin).
+
+This project has been sponsored by:
+* UNLEASHED MIND
+  Specialized in consulting and planning of Drupal powered sites, UNLEASHED
+  MIND offers installation, development, theming, customization, and hosting
+  to get you started. Visit http://www.unleashedmind.com for more information.
+
+* Lullabot
+  Friendly Drupal experts providing professional consulting & education
+  services. Visit http://www.lullabot.com for more information.
+
+* Acquia
+  Commercially Supported Drupal. Visit http://acquia.com for more information.
+
diff --git a/htmltest/sites/all/modules/admin_menu/admin_devel/admin_devel.info b/htmltest/sites/all/modules/admin_menu/admin_devel/admin_devel.info
new file mode 100644
index 00000000..6408a1bb
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_devel/admin_devel.info
@@ -0,0 +1,12 @@
+name = Administration Development tools
+description = Administration and debugging functionality for developers and site builders.
+package = Administration
+core = 7.x
+scripts[] = admin_devel.js
+
+; Information added by drupal.org packaging script on 2013-01-31
+version = "7.x-3.0-rc4"
+core = "7.x"
+project = "admin_menu"
+datestamp = "1359651687"
+
diff --git a/htmltest/sites/all/modules/admin_menu/admin_devel/admin_devel.js b/htmltest/sites/all/modules/admin_menu/admin_devel/admin_devel.js
new file mode 100644
index 00000000..833197a1
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_devel/admin_devel.js
@@ -0,0 +1,40 @@
+(function($) {
+
+/**
+ * jQuery debugging helper.
+ *
+ * Invented for Dreditor.
+ *
+ * @usage
+ *   $.debug(var [, name]);
+ *   $variable.debug( [name] );
+ */
+jQuery.extend({
+  debug: function () {
+    // Setup debug storage in global window. We want to look into it.
+    window.debug = window.debug || [];
+
+    args = jQuery.makeArray(arguments);
+    // Determine data source; this is an object for $variable.debug().
+    // Also determine the identifier to store data with.
+    if (typeof this == 'object') {
+      var name = (args.length ? args[0] : window.debug.length);
+      var data = this;
+    }
+    else {
+      var name = (args.length > 1 ? args.pop() : window.debug.length);
+      var data = args[0];
+    }
+    // Store data.
+    window.debug[name] = data;
+    // Dump data into Firebug console.
+    if (typeof console != 'undefined') {
+      console.log(name, data);
+    }
+    return this;
+  }
+});
+// @todo Is this the right way?
+jQuery.fn.debug = jQuery.debug;
+
+})(jQuery);
diff --git a/htmltest/sites/all/modules/admin_menu/admin_devel/admin_devel.module b/htmltest/sites/all/modules/admin_menu/admin_devel/admin_devel.module
new file mode 100644
index 00000000..5884f54e
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_devel/admin_devel.module
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Administration and debugging functionality for developers and site builders.
+ */
+
+/**
+ * Implements hook_form_FORMID_alter().
+ */
+function admin_devel_form_admin_menu_theme_settings_alter(&$form, &$form_state) {
+  $form['actions']['wipe_rebuild'] = array(
+    '#type' => 'submit',
+    '#value' => t('Rebuild system links'),
+    '#submit' => array('admin_devel_form_admin_menu_theme_settings_alter_rebuild_submit'),
+    // @todo Not necessarily ready for mass-consumption yet.
+    '#access' => FALSE,
+  );
+}
+
+/**
+ * Form submit handler to wipe and rebuild all 'module' = 'system' menu links.
+ */
+function admin_devel_form_admin_menu_theme_settings_alter_rebuild_submit($form, &$form_state) {
+  // Delete all auto-generated menu links derived from menu router items.
+  db_delete('menu_links')
+    ->condition('module', 'system')
+    ->execute();
+  // Rebuild menu links from current menu router items.
+  menu_rebuild();
+
+  drupal_set_message(t('System links derived from menu router paths have been rebuilt.'));
+}
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu-rtl.css b/htmltest/sites/all/modules/admin_menu/admin_menu-rtl.css
new file mode 100644
index 00000000..9414dcf9
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu-rtl.css
@@ -0,0 +1,64 @@
+
+#admin-menu {
+  text-align: right;
+}
+#admin-menu .dropdown .admin-menu-users a {
+  background-position: 10% center;
+  padding-left: 22px;
+  padding-right: 0;
+}
+#admin-menu .dropdown .admin-menu-action,
+#admin-menu .dropdown .admin-menu-search {
+  float: left;
+}
+#admin-menu .dropdown .admin-menu-action a {
+  border-left: none;
+  border-right: 1px solid #323232;
+}
+
+/* All lists */
+#admin-menu a {
+  text-align: right;
+}
+#admin-menu .dropdown a {
+  border-left: 1px solid #323232;
+  border-right: 0;
+}
+#admin-menu .dropdown .admin-menu-tab a {
+  border-left: 1px solid #52565E;
+  border-right: 0;
+}
+#admin-menu .dropdown li li a {
+  border-left: 0;
+}
+
+/* All list items */
+#admin-menu .dropdown li {
+  float: right;
+}
+#admin-menu .dropdown li li {
+}
+
+/* Second-level lists */
+#admin-menu .dropdown li ul {
+  left: auto;
+  right: -999em;
+}
+
+/* Third-and-above-level lists */
+#admin-menu .dropdown li li.expandable ul {
+  margin-left: 0;
+  margin-right: 160px;
+}
+
+/* Lists nested under hovered list items */
+#admin-menu .dropdown li.admin-menu-action:hover ul {
+  left: 0 !important;
+  right: auto;
+}
+
+/* Second-and-more-level hovering */
+#admin-menu .dropdown li li.expandable {
+  background-image: url(images/arrow-rtl.png);
+  background-position: 5px 6px;
+}
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu.admin.js b/htmltest/sites/all/modules/admin_menu/admin_menu.admin.js
new file mode 100644
index 00000000..9ee9f36f
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu.admin.js
@@ -0,0 +1,62 @@
+(function($) {
+
+/**
+ * Live preview of Administration menu components.
+ */
+Drupal.behaviors.adminMenuLivePreview = {
+  attach: function (context, settings) {
+    $('input[name^="admin_menu_components"]', context).once('admin-menu-live-preview')
+      .change(function () {
+        var target = $(this).attr('rel');
+        $(target).toggle(this.checked);
+      })
+      .trigger('change');
+  }
+};
+
+/**
+ * Automatically enables required permissions on demand.
+ *
+ * Many users do not understand that two permissions are required for the
+ * administration menu to appear. Since Drupal core provides no facility for
+ * this, we implement a simple manual confirmation for automatically enabling
+ * the "other" permission.
+ */
+Drupal.behaviors.adminMenuPermissionsSetupHelp = {
+  attach: function (context, settings) {
+    $('#permissions', context).once('admin-menu-permissions-setup', function () {
+      // Retrieve matrix/mapping - these need to use the same indexes for the
+      // same permissions and roles.
+      var $roles = $(this).find('th:not(:first)');
+      var $admin = $(this).find('input[name$="[access administration pages]"]');
+      var $menu = $(this).find('input[name$="[access administration menu]"]');
+
+      // Retrieve the permission label - without description.
+      var adminPermission = $.trim($admin.eq(0).parents('td').prev().children().get(0).firstChild.textContent);
+      var menuPermission = $.trim($menu.eq(0).parents('td').prev().children().get(0).firstChild.textContent);
+
+      $admin.each(function (index) {
+        // Only proceed if both are not enabled already.
+        if (!(this.checked && $menu[index].checked)) {
+          // Stack both checkboxes and attach a click event handler to both.
+          $(this).add($menu[index]).click(function () {
+            // Do nothing when disabling a permission.
+            if (this.checked) {
+              // Figure out which is the other, check whether it still disabled,
+              // and if so, ask whether to auto-enable it.
+              var other = (this == $admin[index] ? $menu[index] : $admin[index]);
+              if (!other.checked && confirm(Drupal.t('Also allow !name role to !permission?', {
+                '!name': $roles[index].textContent,
+                '!permission': (this == $admin[index] ? menuPermission : adminPermission)
+              }))) {
+                other.checked = 'checked';
+              }
+            }
+          });
+        }
+      });
+    });
+  }
+};
+
+})(jQuery);
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu.api.php b/htmltest/sites/all/modules/admin_menu/admin_menu.api.php
new file mode 100644
index 00000000..2d212fbc
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu.api.php
@@ -0,0 +1,164 @@
+<?php
+
+/**
+ * @file
+ * API documentation for Administration menu.
+ */
+
+/**
+ * Provide expansion arguments for dynamic menu items.
+ *
+ * The map items must be keyed by the dynamic path to expand, i.e. a menu path
+ * containing one or more '%' placeholders. Each map item may have the following
+ * properties:
+ * - parent: The parent menu path to link the expanded items to.
+ * - arguments: An array of argument sets that will be used in the expansion.
+ *   Each set consists of an array of one or more placeholders, which again is
+ *   an array of possible expansion values. Upon expansion, each argument is
+ *   combined with every other argument from the set (technically, the cartesian
+ *   product of all arguments). The expansion values may be empty; that is, you
+ *   do not need to insert logic to skip map items for which no values exist,
+ *   since Administration menu will take care of that.
+ *
+ * @see admin_menu.map.inc
+ */
+function hook_admin_menu_map() {
+  // Expand content types below Structure > Content types.
+  // The key denotes the dynamic path to expand to multiple menu items.
+  $map['admin/structure/types/manage/%node_type'] = array(
+    // Link generated items directly to the "Content types" item.
+    'parent' => 'admin/structure/types',
+    // Create expansion arguments for the '%node_type' placeholder.
+    'arguments' => array(
+      array(
+        '%node_type' => array_keys(node_type_get_types()),
+      ),
+    ),
+  );
+  return $map;
+}
+
+/**
+ * Add to the administration menu content before it is rendered.
+ *
+ * Only use this hook to add new data to the menu structure. Use
+ * hook_admin_menu_output_alter() to *alter* existing data.
+ *
+ * @param array $content
+ *   A structured array suitable for drupal_render(), potentially containing:
+ *   - menu: The administrative menu of links below the path 'admin/*'.
+ *   - icon: The icon menu.
+ *   - account: The user account name and log out link.
+ *   - users: The user counter.
+ *   Additionally, these special properties:
+ *   - #components: The actual components contained in $content are configurable
+ *     and depend on the 'admin_menu_components' configuration value. #components
+ *     holds a copy of that for convenience.
+ *   - #complete: A Boolean indicating whether the complete menu should be built,
+ *     ignoring the current configuration in #components.
+ *   Passed by reference.
+ *
+ * @see hook_admin_menu_output_alter()
+ * @see admin_menu_links_menu()
+ * @see admin_menu_links_icon()
+ * @see admin_menu_links_user()
+ * @see theme_admin_menu_links()
+ */
+function hook_admin_menu_output_build(&$content) {
+  // In case your implementation provides a configurable component, check
+  // whether the component should be displayed:
+  if (empty($content['#components']['shortcut.links']) && !$content['#complete']) {
+    return;
+  }
+
+  // Add new top-level item to the menu.
+  if (isset($content['menu'])) {
+    $content['menu']['myitem'] = array(
+      '#title' => t('My item'),
+      // #attributes are used for list items (LI).
+      '#attributes' => array('class' => array('mymodule-myitem')),
+      '#href' => 'mymodule/path',
+      // #options are passed to l().
+      '#options' => array(
+        'query' => drupal_get_destination(),
+        // Apply a class on the link (anchor).
+        'attributes' => array('class' => array('myitem-link-anchor')),
+      ),
+      // #weight controls the order of links in the resulting item list.
+      '#weight' => 50,
+    );
+  }
+  // Add link to the icon menu to manually run cron.
+  if (isset($content['icon'])) {
+    $content['icon']['myitem']['cron'] = array(
+      '#title' => t('Run cron'),
+      '#access' => user_access('administer site configuration'),
+      '#href' => 'admin/reports/status/run-cron',
+    );
+  }
+}
+
+/**
+ * Change the administration menu content before it is rendered.
+ *
+ * Only use this hook to alter existing data in the menu structure. Use
+ * hook_admin_menu_output_build() to *add* new data.
+ *
+ * @param array $content
+ *   A structured array suitable for drupal_render(). Passed by reference.
+ *
+ * @see hook_admin_menu_output_build()
+ */
+function hook_admin_menu_output_alter(&$content) {
+}
+
+/**
+ * Return content to be replace via JS in the cached menu output.
+ *
+ * @param bool $complete
+ *   A Boolean indicating whether all available components of the menu will be
+ *   output and the cache will be skipped.
+ *
+ * @return array
+ *   An associative array whose keys are jQuery selectors and whose values are
+ *   strings containing the replacement content.
+ */
+function hook_admin_menu_replacements($complete) {
+  $items = array();
+  // If the complete menu is output, then it is uncached and will contain the
+  // current counts already.
+  if (!$complete) {
+    // Check whether the users count component is enabled.
+    $components = variable_get('admin_menu_components', array());
+    if (!empty($components['admin_menu.users']) && ($user_count = admin_menu_get_user_count())) {
+      // Replace the counters in the cached menu output with current counts.
+      $items['.admin-menu-users a'] = $user_count;
+    }
+  }
+  return $items;
+}
+
+/**
+ * Inform about additional module-specific caches that can be cleared.
+ *
+ * Administration menu uses this hook to gather information about available
+ * caches that can be flushed individually. Each returned item forms a separate
+ * menu link below the "Flush all caches" link in the icon menu.
+ *
+ * @return array
+ *   An associative array whose keys denote internal identifiers for a
+ *   particular caches (which can be freely defined, but should be in a module's
+ *   namespace) and whose values are associative arrays containing:
+ *   - title: The name of the cache, without "cache" suffix. This label is
+ *     output as link text, but also for the "!title cache cleared."
+ *     confirmation message after flushing the cache; make sure it works and
+ *     makes sense to users in both locations.
+ *   - callback: The name of a function to invoke to flush the individual cache.
+ */
+function hook_admin_menu_cache_info() {
+  $caches['update'] = array(
+    'title' => t('Update data'),
+    'callback' => '_update_cache_clear',
+  );
+  return $caches;
+}
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu.color.css b/htmltest/sites/all/modules/admin_menu/admin_menu.color.css
new file mode 100644
index 00000000..f2491cd5
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu.color.css
@@ -0,0 +1,46 @@
+
+/**
+ * @file
+ * Administration menu color override.
+ */
+
+#admin-menu {
+  background-color: #911;
+  background-image: url(images/bkg-red.png);
+}
+#admin-menu li.admin-menu-action a {
+  border-left-color: #a91f1f;
+}
+
+/* All lists */
+#admin-menu ul a {
+  border-right-color: #a91f1f;
+}
+#admin-menu ul li.admin-menu-tab a {
+  border-right-color: #52565E;
+}
+#admin-menu li li a {
+  border-top-color: #801f1f;
+}
+
+/* All list items */
+#admin-menu li li {
+  background-color: #991f1f;
+}
+
+/* Second-and-more-level hovering */
+#admin-menu li li.expandable {
+  background-color: #b93f3f;
+}
+#admin-menu li li:hover,
+#admin-menu li li.iehover {
+  background-color: #690f0f;
+}
+#admin-menu li li.expandable:hover a,
+#admin-menu li li.expandable:hover li.expandable:hover a {
+  border-color: #801f1f;
+}
+#admin-menu li li.expandable:hover li a,
+#admin-menu li li.expandable:hover li.expandable:hover li a {
+  border-color: #801f1f;
+}
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu.css b/htmltest/sites/all/modules/admin_menu/admin_menu.css
new file mode 100644
index 00000000..fd86dd79
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu.css
@@ -0,0 +1,250 @@
+
+/**
+ * @file
+ * Administration menu.
+ *
+ * Implementation of Sons of Suckerfish Dropdowns.
+ *
+ * @see www.htmldog.com/articles/suckerfish
+ */
+
+#admin-menu {
+  background: #101010 url(images/bkg.png) bottom left repeat-x;
+  font-size: 9px;
+  font-family: "lucida grande", tahoma, verdana, arial, sans-serif;
+  left: 0;
+  position: absolute;
+  text-align: left;
+  top: 0;
+  width: 100%;
+}
+#admin-menu-wrapper {
+  overflow: hidden;
+}
+#admin-menu .dropdown .admin-menu-icon a {
+  padding: 1px 8px 4px;
+}
+#admin-menu .dropdown .admin-menu-icon ul a {
+  padding: 4px 8px;
+}
+#admin-menu .dropdown .admin-menu-icon img {
+  vertical-align: bottom;
+}
+#admin-menu .dropdown .admin-menu-users a {
+  background: transparent url(images/icon_users.png) 90% center no-repeat;
+  padding-right: 22px;
+}
+#admin-menu .dropdown .admin-menu-action,
+#admin-menu .dropdown .admin-menu-search {
+  float: right;
+}
+#admin-menu .dropdown .admin-menu-action a {
+  border-left: 1px solid #323232;
+  border-right: none;
+}
+body.admin-menu {
+  margin-top: 20px !important;
+}
+
+/* All lists */
+#admin-menu,
+#admin-menu .dropdown {
+  line-height: 1.4em;
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  z-index: 999;
+}
+#admin-menu .dropdown {
+  position: static;
+}
+#admin-menu a,
+#admin-menu li > span {
+  background: transparent none;
+  border: none;
+  color: #EEE;
+  font-weight: normal;
+  text-align: left; /* LTR */
+  text-decoration: none;
+}
+#admin-menu .dropdown a,
+#admin-menu .dropdown li > span {
+  border-right: 1px solid #323232; /* LTR */
+  display: block;
+  padding: 4px 8px;
+}
+#admin-menu .dropdown .admin-menu-tab a {
+  border-right: 1px solid #52565E; /* LTR */
+}
+#admin-menu .dropdown li li a {
+  border-right: none; /* LTR */
+  border-top: 1px solid #323232;
+}
+
+/* All list items */
+#admin-menu .dropdown li {
+  background-image: none;
+  float: left; /* LTR */
+  height: 100%;
+  list-style-image: none;
+  list-style-type: none;
+  margin: 0 !important;
+  padding: 0;
+}
+#admin-menu .dropdown .admin-menu-tab {
+  background: url(images/bkg_tab.png) repeat-x left bottom;
+  padding-bottom: 1px;
+}
+#admin-menu .dropdown li li {
+  background: #202020;
+  filter: Alpha(opacity=88);
+  opacity: 0.88;
+  width: 160px; /* Required for Opera */
+}
+#admin-menu .dropdown li li li {
+  filter: Alpha(opacity=100);
+  opacity: 1;
+}
+
+/* Second-level lists */
+/* Note: We must hide sub-lists or scrollbars might appear (display: none is not read by screen readers). */
+#admin-menu .dropdown li ul {
+  background: none;
+  display: none;
+  left: -999em; /* LTR */
+  line-height: 1.2em;
+  margin: 0;
+  position: absolute;
+  width: 160px;
+}
+
+/* Third-and-above-level lists */
+#admin-menu .dropdown li li.expandable ul {
+  margin: -20px 0 0 160px; /* LTR */
+}
+
+#admin-menu .dropdown li:hover ul ul,
+#admin-menu .dropdown li:hover ul ul ul,
+#admin-menu .dropdown li:hover ul ul ul ul,
+#admin-menu .dropdown li:hover ul ul ul ul ul,
+#admin-menu .dropdown li.iehover ul ul,
+#admin-menu .dropdown li.iehover ul ul ul,
+#admin-menu .dropdown li.iehover ul ul ul ul,
+#admin-menu .dropdown li.iehover ul ul ul ul ul {
+  display: none;
+  left: -999em; /* LTR */
+}
+
+/* Lists nested under hovered list items */
+#admin-menu .dropdown li:hover ul,
+#admin-menu .dropdown li li:hover ul,
+#admin-menu .dropdown li li li:hover ul,
+#admin-menu .dropdown li li li li:hover ul,
+#admin-menu .dropdown li li li li li:hover ul,
+#admin-menu .dropdown li.iehover ul,
+#admin-menu .dropdown li li.iehover ul,
+#admin-menu .dropdown li li li.iehover ul,
+#admin-menu .dropdown li li li li.iehover ul,
+#admin-menu .dropdown li li li li li.iehover ul {
+  display: block;
+  left: auto; /* LTR */
+}
+#admin-menu .dropdown li.admin-menu-action:hover ul {
+  right: 0; /* LTR */
+}
+
+/* Second-and-more-level hovering */
+#admin-menu .dropdown li li.expandable {
+  background: #45454A url(images/arrow.png) no-repeat 145px 6px;
+}
+#admin-menu .dropdown li li:hover,
+#admin-menu .dropdown li li.iehover {
+  background-color: #111;
+}
+#admin-menu .dropdown li li:hover a,
+#admin-menu .dropdown li li:hover li:hover a,
+#admin-menu .dropdown li li:hover li:hover li:hover a {
+  color: #FFF;
+}
+#admin-menu .dropdown li li.expandable:hover a,
+#admin-menu .dropdown li li.expandable:hover li.expandable:hover a {
+  border-color: #444;
+  color: #EEE;
+}
+#admin-menu .dropdown li li.expandable:hover li a,
+#admin-menu .dropdown li li.expandable:hover li.expandable:hover li a {
+  border-color: #323232;
+}
+#admin-menu .dropdown li li:hover li a,
+#admin-menu .dropdown li li.iehover li a,
+#admin-menu .dropdown li li.iehover li.iehover li a {
+  color: #EEE;
+}
+#admin-menu .dropdown li li.iehover a,
+#admin-menu .dropdown li li.iehover li.iehover a,
+#admin-menu .dropdown li li.iehover li.iehover li.iehover a {
+  color: #FFF;
+  width: 90%; /* IE */
+}
+
+/* Search form */
+#admin-menu .admin-menu-search .form-item {
+  margin: 0;
+  padding: 0;
+}
+#admin-menu .admin-menu-search input {
+  background: #fff none center right no-repeat;
+  border: none;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  font-size: 10px;
+  margin: 1px 0;
+  outline: none;
+  padding: 2px 22px 2px 4px;
+  width: 158px;
+}
+
+#admin-menu .dropdown .admin-menu-search-results {
+  display: block !important;
+  left: auto !important;
+  top: 100%;
+}
+#admin-menu .admin-menu-search-results,
+#admin-menu .admin-menu-search-results li {
+  width: 186px;
+}
+
+#admin-menu li.highlight {
+  background-color: #eee !important;
+}
+#admin-menu li.highlight > a {
+  border-color: #ccc !important;
+  color: #111 !important;
+}
+
+/* #210615: Mozilla on Mac fix */
+html.js fieldset.collapsible div.fieldset-wrapper {
+  overflow: visible;
+}
+
+/* Hide the menu on print output. */
+@media print {
+  #admin-menu {
+    display: none !important;
+  }
+  body.admin-menu {
+    margin-top: 0 !important;
+  }
+}
+
+/**
+ * Tweaks permissions, if enabled.
+ */
+tr.admin-menu-tweak-permissions-processed {
+  cursor: pointer;
+  cursor: hand;
+}
+tr.admin-menu-tweak-permissions-processed td.module {
+  border-top: 0;
+}
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu.inc b/htmltest/sites/all/modules/admin_menu/admin_menu.inc
new file mode 100644
index 00000000..e212970c
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu.inc
@@ -0,0 +1,1033 @@
+<?php
+
+/**
+ * @file
+ * Menu builder functions for Administration menu.
+ */
+
+/**
+ * Build the full administration menu tree from static and expanded dynamic items.
+ *
+ * @param $menu_name
+ *   The menu name to use as base for the tree.
+ */
+function admin_menu_tree($menu_name) {
+  // Get placeholder expansion arguments from hook_admin_menu_map()
+  // implementations.
+  module_load_include('inc', 'admin_menu', 'admin_menu.map');
+  $expand_map = module_invoke_all('admin_menu_map');
+  // Allow modules to alter the expansion map.
+  drupal_alter('admin_menu_map', $expand_map);
+
+  $new_map = array();
+  foreach ($expand_map as $path => $data) {
+    // Convert named placeholders to anonymous placeholders, since the menu
+    // system stores paths using anonymous placeholders.
+    $replacements = array_fill_keys(array_keys($data['arguments'][0]), '%');
+    $data['parent'] = strtr($data['parent'], $replacements);
+    $new_map[strtr($path, $replacements)] = $data;
+  }
+  $expand_map = $new_map;
+  unset($new_map);
+
+  // Retrieve dynamic menu link tree for the expansion mappings.
+  // @todo Skip entire processing if initial $expand_map is empty and directly
+  //   return $tree?
+  if (!empty($expand_map)) {
+    $tree_dynamic = admin_menu_tree_dynamic($expand_map);
+  }
+  else {
+    $tree_dynamic = array();
+  }
+
+  // Merge local tasks with static menu tree.
+  $tree = menu_tree_all_data($menu_name);
+  admin_menu_merge_tree($tree, $tree_dynamic, array());
+
+  return $tree;
+}
+
+/**
+ * Load menu link trees for router paths containing dynamic arguments.
+ *
+ * @param $expand_map
+ *   An array containing menu router path placeholder expansion argument
+ *   mappings.
+ *
+ * @return
+ *   An associative array whose keys are the parent paths of the menu router
+ *   paths given in $expand_map as well as the parent paths of any child link
+ *   deeper down the tree. The parent paths are used in admin_menu_merge_tree()
+ *   to check whether anything needs to be merged.
+ *
+ * @see hook_admin_menu_map()
+ */
+function admin_menu_tree_dynamic(array $expand_map) {
+  $p_columns = array();
+  for ($i = 1; $i <= MENU_MAX_DEPTH; $i++) {
+    $p_columns[] = 'p' . $i;
+  }
+
+  // Fetch p* columns for all router paths to expand.
+  $router_paths = array_keys($expand_map);
+  $plids = db_select('menu_links', 'ml')
+    ->fields('ml', $p_columns)
+    ->condition('router_path', $router_paths)
+    ->execute()
+    ->fetchAll(PDO::FETCH_ASSOC);
+
+  // Unlikely, but possible.
+  if (empty($plids)) {
+    return array();
+  }
+
+  // Use queried plid columns to query sub-trees for the router paths.
+  $query = db_select('menu_links', 'ml');
+  $query->join('menu_router', 'm', 'ml.router_path = m.path');
+  $query
+    ->fields('ml')
+    ->fields('m', array_diff(drupal_schema_fields_sql('menu_router'), drupal_schema_fields_sql('menu_links')));
+
+  // The retrieved menu link trees have to be ordered by depth, so parents
+  // always come before their children for the storage logic below.
+  foreach ($p_columns as $column) {
+    $query->orderBy($column, 'ASC');
+  }
+
+  $db_or = db_or();
+  foreach ($plids as $path_plids) {
+    $db_and = db_and();
+    // plids with value 0 may be ignored.
+    foreach (array_filter($path_plids) as $column => $plid) {
+      $db_and->condition($column, $plid);
+    }
+    $db_or->condition($db_and);
+  }
+  $query->condition($db_or);
+  $result = $query
+    ->execute()
+    ->fetchAllAssoc('mlid', PDO::FETCH_ASSOC);
+
+  // Store dynamic links grouped by parent path for later merging and assign
+  // placeholder expansion arguments.
+  $tree_dynamic = array();
+  foreach ($result as $mlid => $link) {
+    // If contained in $expand_map, then this is a (first) parent, and we need
+    // to store by the defined 'parent' path for later merging, as well as
+    // provide the expansion map arguments to apply to the dynamic tree.
+    if (isset($expand_map[$link['path']])) {
+      $parent_path = $expand_map[$link['path']]['parent'];
+      $link['expand_map'] = $expand_map[$link['path']]['arguments'];
+    }
+    // Otherwise, just store this link keyed by its parent path; the expand_map
+    // is automatically derived from parent paths.
+    else {
+      $parent_path = $result[$link['plid']]['path'];
+    }
+
+    $tree_dynamic[$parent_path][] = $link;
+  }
+
+  return $tree_dynamic;
+}
+
+/**
+ * Walk through the entire menu tree and merge in expanded dynamic menu links.
+ *
+ * @param &$tree
+ *   A menu tree structure as returned by menu_tree_all_data().
+ * @param $tree_dynamic
+ *   A dynamic menu tree structure as returned by admin_menu_tree_dynamic().
+ * @param $expand_map
+ *   An array containing menu router path placeholder expansion argument
+ *   mappings.
+ *
+ * @see hook_admin_menu_map()
+ * @see admin_menu_tree_dynamic()
+ * @see menu_tree_all_data()
+ */
+function admin_menu_merge_tree(array &$tree, array $tree_dynamic, array $expand_map) {
+  foreach ($tree as $key => $data) {
+    $path = $data['link']['router_path'];
+
+    // Recurse into regular menu tree.
+    if ($tree[$key]['below']) {
+      admin_menu_merge_tree($tree[$key]['below'], $tree_dynamic, $expand_map);
+    }
+    // Nothing to merge, if this parent path is not in our dynamic tree.
+    if (!isset($tree_dynamic[$path])) {
+      continue;
+    }
+
+    // Add expanded dynamic items.
+    foreach ($tree_dynamic[$path] as $link) {
+      // If the dynamic item has custom placeholder expansion parameters set,
+      // use them, otherwise keep current.
+      if (isset($link['expand_map'])) {
+        // If there are currently no expansion parameters, we may use the new
+        // set immediately.
+        if (empty($expand_map)) {
+          $current_expand_map = $link['expand_map'];
+        }
+        else {
+          // Otherwise we need to filter out elements that differ from the
+          // current set, i.e. that are not in the same path.
+          $current_expand_map = array();
+          foreach ($expand_map as $arguments) {
+            foreach ($arguments as $placeholder => $value) {
+              foreach ($link['expand_map'] as $new_arguments) {
+                // Skip the new argument if it doesn't contain the current
+                // replacement placeholders or if their values differ.
+                if (!isset($new_arguments[$placeholder]) || $new_arguments[$placeholder] != $value) {
+                  continue;
+                }
+                $current_expand_map[] = $new_arguments;
+              }
+            }
+          }
+        }
+      }
+      else {
+        $current_expand_map = $expand_map;
+      }
+
+      // Skip dynamic items without expansion parameters.
+      if (empty($current_expand_map)) {
+        continue;
+      }
+
+      // Expand anonymous to named placeholders.
+      // @see _menu_load_objects()
+      $path_args = explode('/', $link['path']);
+      $load_functions = unserialize($link['load_functions']);
+      if (is_array($load_functions)) {
+        foreach ($load_functions as $index => $function) {
+          if ($function) {
+            if (is_array($function)) {
+              list($function,) = each($function);
+            }
+            // Add the loader function name minus "_load".
+            $placeholder = '%' . substr($function, 0, -5);
+            $path_args[$index] = $placeholder;
+          }
+        }
+      }
+      $path_dynamic = implode('/', $path_args);
+
+      // Create new menu items using expansion arguments.
+      foreach ($current_expand_map as $arguments) {
+        // Create the cartesian product for all arguments and create new
+        // menu items for each generated combination thereof.
+        foreach (admin_menu_expand_args($arguments) as $replacements) {
+          $newpath = strtr($path_dynamic, $replacements);
+          // Skip this item, if any placeholder could not be replaced.
+          // Faster than trying to invoke _menu_translate().
+          if (strpos($newpath, '%') !== FALSE) {
+            continue;
+          }
+          $map = explode('/', $newpath);
+          $item = admin_menu_translate($link, $map);
+          // Skip this item, if the current user does not have access.
+          if (empty($item)) {
+            continue;
+          }
+          // Build subtree using current replacement arguments.
+          $new_expand_map = array();
+          foreach ($replacements as $placeholder => $value) {
+            $new_expand_map[$placeholder] = array($value);
+          }
+          admin_menu_merge_tree($item, $tree_dynamic, array($new_expand_map));
+          $tree[$key]['below'] += $item;
+        }
+      }
+    }
+    // Sort new subtree items.
+    ksort($tree[$key]['below']);
+  }
+}
+
+/**
+ * Translate an expanded router item into a menu link suitable for rendering.
+ *
+ * @param $router_item
+ *   A menu router item.
+ * @param $map
+ *   A path map with placeholders replaced.
+ */
+function admin_menu_translate($router_item, $map) {
+  _menu_translate($router_item, $map, TRUE);
+
+  // Run through hook_translated_menu_link_alter() to add devel information,
+  // if configured.
+  $router_item['menu_name'] = 'management';
+  // @todo Invoke as usual like _menu_link_translate().
+  admin_menu_translated_menu_link_alter($router_item, NULL);
+
+  if ($router_item['access']) {
+    // Override mlid to make this item unique; since these items are expanded
+    // from dynamic items, the mlid is always the same, so each item would
+    // replace any other.
+    // @todo Doing this instead leads to plenty of duplicate links below
+    //   admin/structure/menu; likely a hidden recursion problem.
+    // $router_item['mlid'] = $router_item['href'] . $router_item['mlid'];
+    $router_item['mlid'] = $router_item['href'];
+    // Turn menu callbacks into regular menu items to make them visible.
+    if ($router_item['type'] == MENU_CALLBACK) {
+      $router_item['type'] = MENU_NORMAL_ITEM;
+    }
+
+    // @see _menu_tree_check_access()
+    $key = (50000 + $router_item['weight']) . ' ' . $router_item['title'] . ' ' . $router_item['mlid'];
+    return array($key => array(
+      'link' => $router_item,
+      'below' => array(),
+    ));
+  }
+
+  return array();
+}
+
+/**
+ * Create the cartesian product of multiple varying sized argument arrays.
+ *
+ * @param $arguments
+ *   A two dimensional array of arguments.
+ *
+ * @see hook_admin_menu_map()
+ */
+function admin_menu_expand_args($arguments) {
+  $replacements = array();
+
+  // Initialize line cursors, move out array keys (placeholders) and assign
+  // numeric keys instead.
+  $i = 0;
+  $placeholders = array();
+  $new_arguments = array();
+  foreach ($arguments as $placeholder => $values) {
+    // Skip empty arguments.
+    if (empty($values)) {
+      continue;
+    }
+    $cursor[$i] = 0;
+    $placeholders[$i] = $placeholder;
+    $new_arguments[$i] = $values;
+    $i++;
+  }
+  $arguments = $new_arguments;
+  unset($new_arguments);
+
+  if ($rows = count($arguments)) {
+    do {
+      // Collect current argument from each row.
+      $row = array();
+      for ($i = 0; $i < $rows; ++$i) {
+        $row[$placeholders[$i]] = $arguments[$i][$cursor[$i]];
+      }
+      $replacements[] = $row;
+
+      // Increment cursor position.
+      $j = $rows - 1;
+      $cursor[$j]++;
+      while (!array_key_exists($cursor[$j], $arguments[$j])) {
+        // No more arguments left: reset cursor, go to next line and increment
+        // that cursor instead. Repeat until argument found or out of rows.
+        $cursor[$j] = 0;
+        if (--$j < 0) {
+          // We're done.
+          break 2;
+        }
+        $cursor[$j]++;
+      }
+    } while (1);
+  }
+
+  return $replacements;
+}
+
+/**
+ * Build the administration menu as renderable menu links.
+ *
+ * @param $tree
+ *   A data structure representing the administration menu tree as returned from
+ *   menu_tree_all_data().
+ *
+ * @return
+ *   The complete administration menu, suitable for theme_admin_menu_links().
+ *
+ * @see theme_admin_menu_links()
+ * @see admin_menu_menu_alter()
+ */
+function admin_menu_links_menu($tree) {
+  $links = array();
+  foreach ($tree as $data) {
+    // Skip items that are inaccessible, invisible, or link to their parent.
+    // (MENU_DEFAULT_LOCAL_TASK), and MENU_CALLBACK-alike items that should only
+    // appear in the breadcrumb.
+    if (!$data['link']['access'] || $data['link']['type'] & MENU_LINKS_TO_PARENT || $data['link']['type'] == MENU_VISIBLE_IN_BREADCRUMB || $data['link']['hidden'] == 1) {
+      continue;
+    }
+    // Hide 'Administer' and make child links appear on this level.
+    // @todo Make this configurable.
+    if ($data['link']['router_path'] == 'admin') {
+      if ($data['below']) {
+        $links = array_merge($links, admin_menu_links_menu($data['below']));
+      }
+      continue;
+    }
+    // Omit alias lookups.
+    $data['link']['localized_options']['alias'] = TRUE;
+    // Remove description to prevent mouseover tooltip clashes.
+    unset($data['link']['localized_options']['attributes']['title']);
+
+    // Make action links (typically "Add ...") appear first in dropdowns.
+    // They might appear first already, but only as long as there is no link
+    // that comes alphabetically first (e.g., a node type with label "Ad").
+    if ($data['link']['type'] & MENU_IS_LOCAL_ACTION) {
+      $data['link']['weight'] -= 1000;
+    }
+
+    $links[$data['link']['href']] = array(
+      '#title' => $data['link']['title'],
+      '#href' => $data['link']['href'],
+      '#options' => $data['link']['localized_options'],
+      '#weight' => $data['link']['weight'],
+    );
+
+    // Recurse to add any child links.
+    $children = array();
+    if ($data['below']) {
+      $children = admin_menu_links_menu($data['below']);
+      $links[$data['link']['href']] += $children;
+    }
+
+    // Handle links pointing to category/overview pages.
+    if ($data['link']['page_callback'] == 'system_admin_menu_block_page' || $data['link']['page_callback'] == 'system_admin_config_page') {
+      // Apply a marker for others to consume.
+      $links[$data['link']['href']]['#is_category'] = TRUE;
+      // Automatically hide empty categories.
+      // Check for empty children first for performance. Only when non-empty
+      // (typically 'admin/config'), check whether children are accessible.
+      if (empty($children) || !element_get_visible_children($children)) {
+        $links[$data['link']['href']]['#access'] = FALSE;
+      }
+    }
+  }
+  return $links;
+}
+
+/**
+ * Build icon menu links; mostly containing maintenance helpers.
+ *
+ * @see theme_admin_menu_links()
+ */
+function admin_menu_links_icon() {
+  $destination = drupal_get_destination();
+
+  $links = array(
+    '#theme' => 'admin_menu_links',
+    '#wrapper_attributes' => array('id' => 'admin-menu-icon'),
+    '#weight' => -100,
+  );
+  $links['icon'] = array(
+    '#title' => theme('admin_menu_icon'),
+    '#attributes' => array('class' => array('admin-menu-icon')),
+    '#href' => '<front>',
+    '#options' => array(
+      'html' => TRUE,
+    ),
+  );
+  // Add link to manually run cron.
+  $links['icon']['cron'] = array(
+    '#title' => t('Run cron'),
+    '#weight' => 50,
+    '#access' => user_access('administer site configuration'),
+    '#href' => 'admin/reports/status/run-cron',
+  );
+  // Add link to run update.php.
+  $links['icon']['update'] = array(
+    '#title' => t('Run updates'),
+    '#weight' => 50,
+    // @see update_access_allowed()
+    '#access' => $GLOBALS['user']->uid == 1 || !empty($GLOBALS['update_free_access']) || user_access('administer software updates'),
+    '#href' => base_path() . 'update.php',
+    '#options' => array(
+      'external' => TRUE,
+    ),
+  );
+  // Add link to drupal.org.
+  $links['icon']['drupal.org'] = array(
+    '#title' => 'Drupal.org',
+    '#weight' => 100,
+    '#access' => user_access('display drupal links'),
+    '#href' => 'http://drupal.org',
+  );
+  // Add links to project issue queues.
+  foreach (module_list(FALSE, TRUE) as $module) {
+    $info = drupal_parse_info_file(drupal_get_path('module', $module) . '/' . $module . '.info');
+    if (!isset($info['project']) || isset($links['icon']['drupal.org'][$info['project']])) {
+      continue;
+    }
+    $links['icon']['drupal.org'][$info['project']] = array(
+      '#title' => t('@project issue queue', array('@project' => $info['name'])),
+      '#weight' => ($info['project'] == 'drupal' ? -10 : 0),
+      '#href' => 'http://drupal.org/project/issues/' . $info['project'],
+      '#options' => array(
+        'query' => array('version' => (isset($info['core']) ? $info['core'] : 'All')),
+      ),
+    );
+  }
+  // Add items to flush caches.
+  $links['icon']['flush-cache'] = array(
+    '#title' => t('Flush all caches'),
+    '#weight' => 20,
+    '#access' => user_access('flush caches'),
+    '#href' => 'admin_menu/flush-cache',
+    '#options' => array(
+      'query' => $destination + array('token' => drupal_get_token('admin_menu/flush-cache')),
+    ),
+  );
+  $caches = module_invoke_all('admin_menu_cache_info');
+  foreach ($caches as $name => $cache) {
+    $links['icon']['flush-cache'][$name] = array(
+      '#title' => $cache['title'],
+      '#href' => 'admin_menu/flush-cache/' . $name,
+      '#options' => array(
+        'query' => $destination + array('token' => drupal_get_token('admin_menu/flush-cache/' . $name)),
+      ),
+    );
+  }
+
+  // Add link to toggle developer modules (performance).
+  $saved_state = variable_get('admin_menu_devel_modules_enabled', NULL);
+  $links['icon']['toggle-modules'] = array(
+    '#title' => isset($saved_state) ? t('Enable developer modules') : t('Disable developer modules'),
+    '#weight' => 88,
+    '#access' => user_access('administer modules'),
+    '#href' => 'admin_menu/toggle-modules',
+    '#options' => array(
+      'query' => $destination + array('token' => drupal_get_token('admin_menu/toggle-modules')),
+    ),
+  );
+
+  // Add Devel module menu links.
+  if (module_exists('devel')) {
+    $devel_tree = menu_build_tree('devel');
+    $devel_links = admin_menu_links_menu($devel_tree);
+    if (element_get_visible_children($devel_links)) {
+      $links['icon']['devel'] = array(
+        '#title' => t('Development'),
+        '#weight' => 30,
+      ) + $devel_links;
+    }
+  }
+
+  return $links;
+}
+
+/**
+ * Builds the account links.
+ *
+ * @see theme_admin_menu_links()
+ */
+function admin_menu_links_account() {
+  $links = array(
+    '#theme' => 'admin_menu_links',
+    '#wrapper_attributes' => array('id' => 'admin-menu-account'),
+    '#weight' => 100,
+  );
+  $links['account'] = array(
+    '#title' => format_username($GLOBALS['user']),
+    '#weight' => -99,
+    '#attributes' => array('class' => array('admin-menu-action', 'admin-menu-account')),
+    '#href' => 'user/' . $GLOBALS['user']->uid,
+  );
+  $links['logout'] = array(
+    '#title' => t('Log out'),
+    '#weight' => -100,
+    '#attributes' => array('class' => array('admin-menu-action')),
+    '#href' => 'user/logout',
+  );
+  // Add Devel module switch user links.
+  $switch_links = module_invoke('devel', 'switch_user_list');
+  if (!empty($switch_links) && count($switch_links) > 1) {
+    foreach ($switch_links as $uid => $link) {
+      $links['account'][$link['title']] = array(
+        '#title' => $link['title'],
+        '#description' => $link['attributes']['title'],
+        '#href' => $link['href'],
+        '#options' => array(
+          'query' => $link['query'],
+          'html' => !empty($link['html']),
+        ),
+      );
+    }
+  }
+  return $links;
+}
+
+/**
+ * Builds user counter.
+ *
+ * @see theme_admin_menu_links()
+ */
+function admin_menu_links_users() {
+  $links = array(
+    '#theme' => 'admin_menu_links',
+    '#wrapper_attributes' => array('id' => 'admin-menu-users'),
+    '#weight' => 150,
+  );
+  // Add link to show current authenticated/anonymous users.
+  $links['user-counter'] = array(
+    '#title' => admin_menu_get_user_count(),
+    '#description' => t('Current anonymous / authenticated users'),
+    '#weight' => -90,
+    '#attributes' => array('class' => array('admin-menu-action', 'admin-menu-users')),
+    '#href' => (user_access('administer users') ? 'admin/people/people' : 'user'),
+  );
+  return $links;
+}
+
+/**
+ * Build search widget.
+ *
+ * @see theme_admin_menu_links()
+ */
+function admin_menu_links_search() {
+  $links = array(
+    '#theme' => 'admin_menu_links',
+    '#wrapper_attributes' => array('id' => 'admin-menu-search'),
+    '#weight' => 180,
+  );
+  $links['search'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Search'),
+    '#title_display' => 'attribute',
+    '#attributes' => array(
+      'placeholder' => t('Search'),
+      'class' => array('admin-menu-search'),
+    ),
+  );
+  return $links;
+}
+
+/**
+ * Form builder function for module settings.
+ */
+function admin_menu_theme_settings() {
+  $form['admin_menu_margin_top'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Adjust top margin'),
+    '#default_value' => variable_get('admin_menu_margin_top', 1),
+    '#description' => t('Shifts the site output down by approximately 20 pixels from the top of the viewport. If disabled, absolute- or fixed-positioned page elements may be covered by the administration menu.'),
+  );
+  $form['admin_menu_position_fixed'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Keep menu at top of page'),
+    '#default_value' => variable_get('admin_menu_position_fixed', 1),
+    '#description' => t('Displays the administration menu always at the top of the browser viewport (even when scrolling the page).'),
+  );
+  // @todo Re-confirm this with latest browser versions.
+  $form['admin_menu_position_fixed']['#description'] .= '<br /><strong>' . t('In some browsers, this setting may result in a malformed page, an invisible cursor, non-selectable elements in forms, or other issues.') . '</strong>';
+
+  $form['advanced'] = array(
+    '#type' => 'vertical_tabs',
+    '#title' => t('Advanced settings'),
+  );
+
+  $form['plugins'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Plugins'),
+    '#group' => 'advanced',
+  );
+  $form['plugins']['admin_menu_components'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Enabled components'),
+    '#options' => array(
+      'admin_menu.icon' => t('Icon menu'),
+      'admin_menu.menu' => t('Administration menu'),
+      'admin_menu.search' => t('Search bar'),
+      'admin_menu.users' => t('User counts'),
+      'admin_menu.account' => t('Account links'),
+    ),
+  );
+  $form['plugins']['admin_menu_components']['#default_value'] = array_keys(array_filter(variable_get('admin_menu_components', $form['plugins']['admin_menu_components']['#options'])));
+
+  $process = element_info_property('checkboxes', '#process', array());
+  $form['plugins']['admin_menu_components']['#process'] = array_merge(array('admin_menu_settings_process_components'), $process);
+  $form['#attached']['js'][] = drupal_get_path('module', 'admin_menu') . '/admin_menu.admin.js';
+
+  $form['tweaks'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('System tweaks'),
+    '#group' => 'advanced',
+  );
+  $form['tweaks']['admin_menu_tweak_modules'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Collapse module groups on the <a href="!modules-url">%modules</a> page', array(
+      '%modules' => t('Modules'),
+      '!modules-url' => url('admin/modules'),
+    )),
+    '#default_value' => variable_get('admin_menu_tweak_modules', 0),
+  );
+  if (module_exists('util')) {
+    $form['tweaks']['admin_menu_tweak_modules']['#description'] .= '<br /><strong>' . t('If the Utility module was installed for this purpose, it can be safely disabled and uninstalled.') . '</strong>';
+  }
+  $form['tweaks']['admin_menu_tweak_permissions'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Collapse module groups on the <a href="@permissions-url">%permissions</a> page', array(
+      '%permissions' => t('Permissions'),
+      '@permissions-url' => url('admin/people/permissions'),
+    )),
+    '#default_value' => variable_get('admin_menu_tweak_permissions', 0),
+  );
+  $form['tweaks']['admin_menu_tweak_tabs'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Move local tasks into menu'),
+    '#default_value' => variable_get('admin_menu_tweak_tabs', 0),
+    '#description' => t('Moves the tabs on all pages into the administration menu. Only possible for themes using the CSS classes <code>tabs primary</code> and <code>tabs secondary</code>.'),
+  );
+
+  $form['performance'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Performance'),
+    '#group' => 'advanced',
+  );
+  $form['performance']['admin_menu_cache_client'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Cache menu in client-side browser'),
+    '#default_value' => variable_get('admin_menu_cache_client', 1),
+  );
+  // Fetch all available modules manually, since module_list() only returns
+  // currently enabled modules, which makes this setting pointless if developer
+  // modules are currently disabled.
+  $all_modules = array();
+  $result = db_query("SELECT name, filename, info FROM {system} WHERE type = 'module' ORDER BY name ASC");
+  foreach ($result as $module) {
+    if (file_exists($module->filename)) {
+      $info = unserialize($module->info);
+      $all_modules[$module->name] = $info['name'];
+    }
+  }
+  $devel_modules = variable_get('admin_menu_devel_modules', _admin_menu_developer_modules());
+  $devel_modules = array_intersect_key($all_modules, array_flip($devel_modules));
+  $form['performance']['admin_menu_devel_modules_skip'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Developer modules to keep enabled'),
+    '#default_value' => variable_get('admin_menu_devel_modules_skip', array()),
+    '#options' => $devel_modules,
+    '#access' => !empty($devel_modules),
+    '#description' => t('The selected modules will not be disabled when the link %disable-developer-modules below the icon in the menu is invoked.', array(
+      '%disable-developer-modules' => t('Disable developer modules'),
+    )),
+  );
+
+  return system_settings_form($form);
+}
+
+/**
+ * #process callback for component plugin form element in admin_menu_theme_settings().
+ */
+function admin_menu_settings_process_components($element) {
+  // Assign 'rel' attributes to all options to achieve a live preview.
+  // Unfortunately, #states relies on wrapping .form-wrapper classes, so it
+  // cannot be used here.
+  foreach ($element['#options'] as $key => $label) {
+    if (!isset($element[$key]['#attributes']['rel'])) {
+      $id = preg_replace('/[^a-z]/', '-', $key);
+      $element[$key]['#attributes']['rel'] = '#' . $id;
+    }
+  }
+  return $element;
+}
+
+/**
+ * Form validation handler for admin_menu_theme_settings().
+ */
+function admin_menu_theme_settings_validate(&$form, &$form_state) {
+  // Change the configured components to Boolean values.
+  foreach ($form_state['values']['admin_menu_components'] as $component => &$enabled) {
+    $enabled = (bool) $enabled;
+  }
+}
+
+/**
+ * Implementation of hook_form_FORM_ID_alter().
+ *
+ * Extends Devel module with Administration menu developer settings.
+ */
+function _admin_menu_form_devel_admin_settings_alter(&$form, $form_state) {
+  // Shift system_settings_form buttons.
+  $weight = isset($form['buttons']['#weight']) ? $form['buttons']['#weight'] : 0;
+  $form['buttons']['#weight'] = $weight + 1;
+
+  $form['admin_menu'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Administration menu settings'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $display_options = array('mid', 'weight', 'pid');
+  $display_options = array(0 => t('None'), 'mlid' => t('Menu link ID'), 'weight' => t('Weight'), 'plid' => t('Parent link ID'));
+  $form['admin_menu']['admin_menu_display'] = array(
+    '#type' => 'radios',
+    '#title' => t('Display additional data for each menu item'),
+    '#default_value' => variable_get('admin_menu_display', 0),
+    '#options' => $display_options,
+    '#description' => t('Display the selected items next to each menu item link.'),
+  );
+  $form['admin_menu']['admin_menu_show_all'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Display all menu items'),
+    '#default_value' => variable_get('admin_menu_show_all', 0),
+    '#description' => t('If enabled, all menu items are displayed regardless of your site permissions. <em>Note: Do not enable on a production site.</em>'),
+  );
+}
+
+/**
+ * Menu callback; Enable/disable developer modules.
+ *
+ * This can save up to 150ms on each uncached page request.
+ */
+function admin_menu_toggle_modules() {
+  if (!isset($_GET['token']) || !drupal_valid_token($_GET['token'], current_path())) {
+    return MENU_ACCESS_DENIED;
+  }
+
+  $rebuild = FALSE;
+  $saved_state = variable_get('admin_menu_devel_modules_enabled', NULL);
+  if (isset($saved_state)) {
+    // Re-enable modules that were enabled before.
+    module_enable($saved_state);
+    variable_del('admin_menu_devel_modules_enabled');
+    drupal_set_message(t('Enabled these modules: !module-list.', array('!module-list' => implode(', ', $saved_state))));
+    $rebuild = TRUE;
+  }
+  else {
+    // Allow site admins to override this variable via settings.php.
+    $devel_modules = variable_get('admin_menu_devel_modules', _admin_menu_developer_modules());
+    // Store currently enabled modules in a variable.
+    $devel_modules = array_intersect(module_list(FALSE, FALSE), $devel_modules);
+    $devel_modules = array_diff($devel_modules, variable_get('admin_menu_devel_modules_skip', array()));
+    if (!empty($devel_modules)) {
+      variable_set('admin_menu_devel_modules_enabled', $devel_modules);
+      // Disable developer modules.
+      module_disable($devel_modules);
+      drupal_set_message(t('Disabled these modules: !module-list.', array('!module-list' => implode(', ', $devel_modules))));
+      $rebuild = TRUE;
+    }
+    else {
+      drupal_set_message(t('No developer modules are enabled.'));
+    }
+  }
+  if ($rebuild) {
+    // Make sure everything is rebuilt, basically a combination of the calls
+    // from system_modules() and system_modules_submit().
+    drupal_theme_rebuild();
+    menu_rebuild();
+    cache_clear_all('schema', 'cache');
+    cache_clear_all();
+    drupal_clear_css_cache();
+    drupal_clear_js_cache();
+    // Synchronize to catch any actions that were added or removed.
+    actions_synchronize();
+    // Finally, flush admin_menu's cache.
+    admin_menu_flush_caches();
+  }
+  drupal_goto();
+}
+
+/**
+ * Helper function to return a default list of developer modules.
+ */
+function _admin_menu_developer_modules() {
+  return array(
+    'admin_devel',
+    'cache_disable',
+    'coder',
+    'content_copy',
+    'context_ui',
+    'debug',
+    'delete_all',
+    'demo',
+    'devel',
+    'devel_node_access',
+    'devel_themer',
+    'field_ui',
+    'fontyourface_ui',
+    'form_controller',
+    'imagecache_ui',
+    'journal',
+    'l10n_client',
+    'l10n_update',
+    'macro',
+    'rules_admin',
+    'stringoverrides',
+    'trace',
+    'upgrade_status',
+    'user_display_ui',
+    'util',
+    'views_ui',
+    'views_theme_wizard',
+  );
+}
+
+/**
+ * Flush all caches or a specific one.
+ *
+ * @param $name
+ *   (optional) Name of cache to flush.
+ */
+function admin_menu_flush_cache($name = NULL) {
+  if (!isset($_GET['token']) || !drupal_valid_token($_GET['token'], current_path())) {
+    return MENU_ACCESS_DENIED;
+  }
+  if (isset($name)) {
+    $caches = module_invoke_all('admin_menu_cache_info');
+    if (!isset($caches[$name])) {
+      return MENU_NOT_FOUND;
+    }
+  }
+  else {
+    $caches[$name] = array(
+      'title' => t('Every'),
+      'callback' => 'drupal_flush_all_caches',
+    );
+  }
+  // Pass the cache to flush forward to the callback.
+  $function = $caches[$name]['callback'];
+  $function($name);
+
+  drupal_set_message(t('!title cache cleared.', array('!title' => $caches[$name]['title'])));
+
+  // The JavaScript injects a destination request parameter pointing to the
+  // originating page, so the user is redirected back to that page. Without
+  // destination parameter, the redirect ends on the front page.
+  drupal_goto();
+}
+
+/**
+ * Implements hook_admin_menu_cache_info().
+ */
+function admin_menu_admin_menu_cache_info() {
+  $caches['admin_menu'] = array(
+    'title' => t('Administration menu'),
+    'callback' => '_admin_menu_flush_cache',
+  );
+  return $caches;
+}
+
+/**
+ * Implements hook_admin_menu_cache_info() on behalf of System module.
+ */
+function system_admin_menu_cache_info() {
+  $caches = array(
+    'assets' => t('CSS and JavaScript'),
+    'cache' => t('Page and else'),
+    'menu' => t('Menu'),
+    'registry' => t('Class registry'),
+    'theme' => t('Theme registry'),
+  );
+  foreach ($caches as $name => $cache) {
+    $caches[$name] = array(
+      'title' => $cache,
+      'callback' => '_admin_menu_flush_cache',
+    );
+  }
+  return $caches;
+}
+
+/**
+ * Implements hook_admin_menu_cache_info() on behalf of Update module.
+ */
+function update_admin_menu_cache_info() {
+  $caches['update'] = array(
+    'title' => t('Update data'),
+    'callback' => '_update_cache_clear',
+  );
+  return $caches;
+}
+
+/**
+ * Flush all caches or a specific one.
+ *
+ * @param $name
+ *   (optional) Name of cache to flush.
+ *
+ * @see system_admin_menu_cache_info()
+ */
+function _admin_menu_flush_cache($name = NULL) {
+  switch ($name) {
+    case 'admin_menu':
+      admin_menu_flush_caches();
+      break;
+
+    case 'menu':
+      menu_rebuild();
+      break;
+
+    case 'registry':
+      registry_rebuild();
+      // Fall-through to clear cache tables, since registry information is
+      // usually the base for other data that is cached (e.g. SimpleTests).
+    case 'cache':
+      // Don't clear cache_form - in-progress form submissions may break.
+      // Ordered so clearing the page cache will always be the last action.
+      // @see drupal_flush_all_caches()
+      $core = array('cache', 'cache_bootstrap', 'cache_filter', 'cache_page');
+      $cache_tables = array_merge(module_invoke_all('flush_caches'), $core);
+      foreach ($cache_tables as $table) {
+        cache_clear_all('*', $table, TRUE);
+      }
+      break;
+
+    case 'assets':
+      // Change query-strings on css/js files to enforce reload for all users.
+      _drupal_flush_css_js();
+
+      drupal_clear_css_cache();
+      drupal_clear_js_cache();
+
+      // Clear the page cache, since cached HTML pages might link to old CSS and
+      // JS aggregates.
+      cache_clear_all('*', 'cache_page', TRUE);
+      break;
+
+    case 'theme':
+      system_rebuild_theme_data();
+      drupal_theme_rebuild();
+      break;
+  }
+}
+
+/**
+ * Preprocesses variables for theme_admin_menu_icon().
+ */
+function template_preprocess_admin_menu_icon(&$variables) {
+  // Image source might have been passed in as theme variable.
+  if (!isset($variables['src'])) {
+    if (theme_get_setting('toggle_favicon')) {
+      $variables['src'] = theme_get_setting('favicon');
+    }
+    else {
+      $variables['src'] = base_path() . 'misc/favicon.ico';
+    }
+  }
+  // Strip the protocol without delimiters for transient HTTP/HTTPS support.
+  // Since the menu is cached on the server-side and client-side, the cached
+  // version might contain a HTTP link, whereas the actual page is on HTTPS.
+  // Relative paths will work fine, but theme_get_setting() returns an
+  // absolute URI.
+  $variables['src'] = preg_replace('@^https?:@', '', $variables['src']);
+  $variables['src'] = check_plain($variables['src']);
+  $variables['alt'] = t('Home');
+}
+
+/**
+ * Renders an icon to display in the administration menu.
+ *
+ * @ingroup themeable
+ */
+function theme_admin_menu_icon($variables) {
+  return '<img class="admin-menu-icon" src="' . $variables['src'] . '" width="16" height="16" alt="' . $variables['alt'] . '" />';
+}
+
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu.info b/htmltest/sites/all/modules/admin_menu/admin_menu.info
new file mode 100644
index 00000000..ee58c66c
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu.info
@@ -0,0 +1,16 @@
+name = Administration menu
+description = "Provides a dropdown menu to most administrative tasks and other common destinations (to users with the proper permissions)."
+package = Administration
+core = 7.x
+configure = admin/config/administration/admin_menu
+; Requires menu_build_tree() conditions; available after 7.10.
+; @see http://drupal.org/node/1025582
+dependencies[] = system (>7.10)
+files[] = tests/admin_menu.test
+
+; Information added by drupal.org packaging script on 2013-01-31
+version = "7.x-3.0-rc4"
+core = "7.x"
+project = "admin_menu"
+datestamp = "1359651687"
+
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu.install b/htmltest/sites/all/modules/admin_menu/admin_menu.install
new file mode 100644
index 00000000..70e31c6c
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu.install
@@ -0,0 +1,122 @@
+<?php
+
+/**
+ * @file
+ * Install, update, and uninstall functions for the admin menu module.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function admin_menu_schema() {
+  $schema['cache_admin_menu'] = drupal_get_schema_unprocessed('system', 'cache');
+  $schema['cache_admin_menu']['description'] = 'Cache table for Administration menu to store client-side caching hashes.';
+  return $schema;
+}
+
+/**
+ * Implements hook_install().
+ */
+function admin_menu_install() {
+  // Increase the module weight, so admin_menu catches any alterations made by
+  // other modules in hook_menu_alter().
+  db_update('system')
+    ->fields(array('weight' => 100))
+    ->condition('type', 'module')
+    ->condition('name', 'admin_menu')
+    ->execute();
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function admin_menu_uninstall() {
+  // Delete variables.
+  variable_del('admin_menu_components');
+  variable_del('admin_menu_devel_modules');
+  variable_del('admin_menu_devel_modules_enabled');
+  variable_del('admin_menu_devel_modules_skip');
+  variable_del('admin_menu_margin_top');
+  variable_del('admin_menu_position_fixed');
+  variable_del('admin_menu_tweak_modules');
+  variable_del('admin_menu_tweak_tabs');
+  variable_del('admin_menu_show_all');
+  variable_del('admin_menu_display');
+  variable_del('admin_menu_cache_server');
+  variable_del('admin_menu_cache_client');
+}
+
+/**
+ * Ensure that admin_menu is rebuilt after upgrading to D6.
+ */
+function admin_menu_update_6000() {
+  // Drop the {admin_menu} table in admin_menu_update_6000() on sites that used
+  // one of the later patches in #132524.
+  if (db_table_exists('admin_menu')) {
+    db_drop_table('admin_menu');
+  }
+}
+
+/**
+ * Wipe and rebuild so we can switch the icon path to <front>.
+ */
+function admin_menu_update_6001() {
+  db_delete('menu_links')->condition('module', 'admin_menu')->execute();
+  menu_cache_clear('admin_menu');
+}
+
+/**
+ * Add {cache_admin_menu} table.
+ */
+function admin_menu_update_7300() {
+  if (!db_table_exists('cache_admin_menu')) {
+    $schema = drupal_get_schema_unprocessed('system', 'cache');
+    db_create_table('cache_admin_menu', $schema);
+  }
+}
+
+/**
+ * Increase the module weight.
+ *
+ * @see admin_menu_install()
+ */
+function admin_menu_update_7302() {
+  db_update('system')
+    ->fields(array('weight' => 100))
+    ->condition('type', 'module')
+    ->condition('name', 'admin_menu')
+    ->execute();
+}
+
+/**
+ * Remove local tasks from {menu_links} table.
+ */
+function admin_menu_update_7303() {
+  db_delete('menu_router')
+    ->condition('path', 'admin/%', 'LIKE')
+    ->condition('type', MENU_IS_LOCAL_TASK, '&')
+    ->execute();
+}
+
+/**
+ * Remove obsolete 'admin_menu' menu and all orphan links in it.
+ */
+function admin_menu_update_7304() {
+  // Remove the custom menu used by 6.x-1.x.
+  if (db_table_exists('menu_custom')) {
+    db_delete('menu_custom')->condition('menu_name', 'admin_menu')->execute();
+  }
+
+  // 6.x-1.x cloned the entire link structure below the path 'admin' into a
+  // separate 'menu_name' "admin_menu" with 'module' "admin_menu". 6.x-3.x and
+  // early alpha versions of 7.x-3.x still did something similar. All of these
+  // records are obsolete. Removal of the 'module' records (without different
+  // menu_name) is particularly important, since they would otherwise appear
+  // as duplicate links.
+  db_delete('menu_links')
+    ->condition(db_or()
+      ->condition('module', 'admin_menu')
+      ->condition('menu_name', 'admin_menu')
+    )
+    ->execute();
+}
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu.js b/htmltest/sites/all/modules/admin_menu/admin_menu.js
new file mode 100644
index 00000000..de0bb906
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu.js
@@ -0,0 +1,397 @@
+(function($) {
+
+Drupal.admin = Drupal.admin || {};
+Drupal.admin.behaviors = Drupal.admin.behaviors || {};
+Drupal.admin.hashes = Drupal.admin.hashes || {};
+
+/**
+ * Core behavior for Administration menu.
+ *
+ * Test whether there is an administration menu is in the output and execute all
+ * registered behaviors.
+ */
+Drupal.behaviors.adminMenu = {
+  attach: function (context, settings) {
+    // Initialize settings.
+    settings.admin_menu = $.extend({
+      suppress: false,
+      margin_top: false,
+      position_fixed: false,
+      tweak_modules: false,
+      tweak_permissions: false,
+      tweak_tabs: false,
+      destination: '',
+      basePath: settings.basePath,
+      hash: 0,
+      replacements: {}
+    }, settings.admin_menu || {});
+    // Check whether administration menu should be suppressed.
+    if (settings.admin_menu.suppress) {
+      return;
+    }
+    var $adminMenu = $('#admin-menu:not(.admin-menu-processed)', context);
+    // Client-side caching; if administration menu is not in the output, it is
+    // fetched from the server and cached in the browser.
+    if (!$adminMenu.length && settings.admin_menu.hash) {
+      Drupal.admin.getCache(settings.admin_menu.hash, function (response) {
+          if (typeof response == 'string' && response.length > 0) {
+            $('body', context).append(response);
+          }
+          var $adminMenu = $('#admin-menu:not(.admin-menu-processed)', context);
+          // Apply our behaviors.
+          Drupal.admin.attachBehaviors(context, settings, $adminMenu);
+          // Allow resize event handlers to recalculate sizes/positions.
+          $(window).triggerHandler('resize');
+      });
+    }
+    // If the menu is in the output already, this means there is a new version.
+    else {
+      // Apply our behaviors.
+      Drupal.admin.attachBehaviors(context, settings, $adminMenu);
+    }
+  }
+};
+
+/**
+ * Collapse fieldsets on Modules page.
+ */
+Drupal.behaviors.adminMenuCollapseModules = {
+  attach: function (context, settings) {
+    if (settings.admin_menu.tweak_modules) {
+      $('#system-modules fieldset:not(.collapsed)', context).addClass('collapsed');
+    }
+  }
+};
+
+/**
+ * Collapse modules on Permissions page.
+ */
+Drupal.behaviors.adminMenuCollapsePermissions = {
+  attach: function (context, settings) {
+    if (settings.admin_menu.tweak_permissions) {
+      // Freeze width of first column to prevent jumping.
+      $('#permissions th:first', context).css({ width: $('#permissions th:first', context).width() });
+      // Attach click handler.
+      $modules = $('#permissions tr:has(td.module)', context).once('admin-menu-tweak-permissions', function () {
+        var $module = $(this);
+        $module.bind('click.admin-menu', function () {
+          // @todo Replace with .nextUntil() in jQuery 1.4.
+          $module.nextAll().each(function () {
+            var $row = $(this);
+            if ($row.is(':has(td.module)')) {
+              return false;
+            }
+            $row.toggleClass('element-hidden');
+          });
+        });
+      });
+      // Collapse all but the targeted permission rows set.
+      if (window.location.hash.length) {
+        $modules = $modules.not(':has(' + window.location.hash + ')');
+      }
+      $modules.trigger('click.admin-menu');
+    }
+  }
+};
+
+/**
+ * Apply margin to page.
+ *
+ * Note that directly applying marginTop does not work in IE. To prevent
+ * flickering/jumping page content with client-side caching, this is a regular
+ * Drupal behavior.
+ */
+Drupal.behaviors.adminMenuMarginTop = {
+  attach: function (context, settings) {
+    if (!settings.admin_menu.suppress && settings.admin_menu.margin_top) {
+      $('body:not(.admin-menu)', context).addClass('admin-menu');
+    }
+  }
+};
+
+/**
+ * Retrieve content from client-side cache.
+ *
+ * @param hash
+ *   The md5 hash of the content to retrieve.
+ * @param onSuccess
+ *   A callback function invoked when the cache request was successful.
+ */
+Drupal.admin.getCache = function (hash, onSuccess) {
+  if (Drupal.admin.hashes.hash !== undefined) {
+    return Drupal.admin.hashes.hash;
+  }
+  $.ajax({
+    cache: true,
+    type: 'GET',
+    dataType: 'text', // Prevent auto-evaluation of response.
+    global: false, // Do not trigger global AJAX events.
+    url: Drupal.settings.admin_menu.basePath.replace(/admin_menu/, 'js/admin_menu/cache/' + hash),
+    success: onSuccess,
+    complete: function (XMLHttpRequest, status) {
+      Drupal.admin.hashes.hash = status;
+    }
+  });
+};
+
+/**
+ * TableHeader callback to determine top viewport offset.
+ *
+ * @see toolbar.js
+ */
+Drupal.admin.height = function() {
+  var $adminMenu = $('#admin-menu');
+  var height = $adminMenu.outerHeight();
+  // In IE, Shadow filter adds some extra height, so we need to remove it from
+  // the returned height.
+  if ($adminMenu.css('filter') && $adminMenu.css('filter').match(/DXImageTransform\.Microsoft\.Shadow/)) {
+    height -= $adminMenu.get(0).filters.item("DXImageTransform.Microsoft.Shadow").strength;
+  }
+  return height;
+};
+
+/**
+ * @defgroup admin_behaviors Administration behaviors.
+ * @{
+ */
+
+/**
+ * Attach administrative behaviors.
+ */
+Drupal.admin.attachBehaviors = function (context, settings, $adminMenu) {
+  if ($adminMenu.length) {
+    $adminMenu.addClass('admin-menu-processed');
+    $.each(Drupal.admin.behaviors, function() {
+      this(context, settings, $adminMenu);
+    });
+  }
+};
+
+/**
+ * Apply 'position: fixed'.
+ */
+Drupal.admin.behaviors.positionFixed = function (context, settings, $adminMenu) {
+  if (settings.admin_menu.position_fixed) {
+    $adminMenu.addClass('admin-menu-position-fixed');
+    $adminMenu.css('position', 'fixed');
+  }
+};
+
+/**
+ * Move page tabs into administration menu.
+ */
+Drupal.admin.behaviors.pageTabs = function (context, settings, $adminMenu) {
+  if (settings.admin_menu.tweak_tabs) {
+    var $tabs = $(context).find('ul.tabs.primary');
+    $adminMenu.find('#admin-menu-wrapper > ul').eq(1)
+      .append($tabs.find('li').addClass('admin-menu-tab'));
+    $(context).find('ul.tabs.secondary')
+      .appendTo('#admin-menu-wrapper > ul > li.admin-menu-tab.active')
+      .removeClass('secondary');
+    $tabs.remove();
+  }
+};
+
+/**
+ * Perform dynamic replacements in cached menu.
+ */
+Drupal.admin.behaviors.replacements = function (context, settings, $adminMenu) {
+  for (var item in settings.admin_menu.replacements) {
+    $(item, $adminMenu).html(settings.admin_menu.replacements[item]);
+  }
+};
+
+/**
+ * Inject destination query strings for current page.
+ */
+Drupal.admin.behaviors.destination = function (context, settings, $adminMenu) {
+  if (settings.admin_menu.destination) {
+    $('a.admin-menu-destination', $adminMenu).each(function() {
+      this.search += (!this.search.length ? '?' : '&') + Drupal.settings.admin_menu.destination;
+    });
+  }
+};
+
+/**
+ * Apply JavaScript-based hovering behaviors.
+ *
+ * @todo This has to run last.  If another script registers additional behaviors
+ *   it will not run last.
+ */
+Drupal.admin.behaviors.hover = function (context, settings, $adminMenu) {
+  // Hover emulation for IE 6.
+  if ($.browser.msie && parseInt(jQuery.browser.version) == 6) {
+    $('li', $adminMenu).hover(
+      function () {
+        $(this).addClass('iehover');
+      },
+      function () {
+        $(this).removeClass('iehover');
+      }
+    );
+  }
+
+  // Delayed mouseout.
+  $('li.expandable', $adminMenu).hover(
+    function () {
+      // Stop the timer.
+      clearTimeout(this.sfTimer);
+      // Display child lists.
+      $('> ul', this)
+        .css({left: 'auto', display: 'block'})
+        // Immediately hide nephew lists.
+        .parent().siblings('li').children('ul').css({left: '-999em', display: 'none'});
+    },
+    function () {
+      // Start the timer.
+      var uls = $('> ul', this);
+      this.sfTimer = setTimeout(function () {
+        uls.css({left: '-999em', display: 'none'});
+      }, 400);
+    }
+  );
+};
+
+/**
+ * Apply the search bar functionality.
+ */
+Drupal.admin.behaviors.search = function (context, settings, $adminMenu) {
+  // @todo Add a HTML ID.
+  var $input = $('input.admin-menu-search', $adminMenu);
+  // Initialize the current search needle.
+  var needle = $input.val();
+  // Cache of all links that can be matched in the menu.
+  var links;
+  // Minimum search needle length.
+  var needleMinLength = 2;
+  // Append the results container.
+  var $results = $('<div />').insertAfter($input);
+
+  /**
+   * Executes the search upon user input.
+   */
+  function keyupHandler() {
+    var matches, $html, value = $(this).val();
+    // Only proceed if the search needle has changed.
+    if (value !== needle) {
+      needle = value;
+      // Initialize the cache of menu links upon first search.
+      if (!links && needle.length >= needleMinLength) {
+        // @todo Limit to links in dropdown menus; i.e., skip menu additions.
+        links = buildSearchIndex($adminMenu.find('li:not(.admin-menu-action, .admin-menu-action li) > a'));
+      }
+      // Empty results container when deleting search text.
+      if (needle.length < needleMinLength) {
+        $results.empty();
+      }
+      // Only search if the needle is long enough.
+      if (needle.length >= needleMinLength && links) {
+        matches = findMatches(needle, links);
+        // Build the list in a detached DOM node.
+        $html = buildResultsList(matches);
+        // Display results.
+        $results.empty().append($html);
+      }
+    }
+  }
+
+  /**
+   * Builds the search index.
+   */
+  function buildSearchIndex($links) {
+    return $links
+      .map(function () {
+        var text = (this.textContent || this.innerText);
+        // Skip menu entries that do not contain any text (e.g., the icon).
+        if (typeof text === 'undefined') {
+          return;
+        }
+        return {
+          text: text,
+          textMatch: text.toLowerCase(),
+          element: this
+        };
+      });
+  }
+
+  /**
+   * Searches the index for a given needle and returns matching entries.
+   */
+  function findMatches(needle, links) {
+    var needleMatch = needle.toLowerCase();
+    // Select matching links from the cache.
+    return $.grep(links, function (link) {
+      return link.textMatch.indexOf(needleMatch) !== -1;
+    });
+  }
+
+  /**
+   * Builds the search result list in a detached DOM node.
+   */
+  function buildResultsList(matches) {
+    var $html = $('<ul class="dropdown admin-menu-search-results" />');
+    $.each(matches, function () {
+      var result = this.text;
+      var $element = $(this.element);
+
+      // Check whether there is a top-level category that can be prepended.
+      var $category = $element.closest('#admin-menu-wrapper > ul > li');
+      var categoryText = $category.find('> a').text()
+      if ($category.length && categoryText) {
+        result = categoryText + ': ' + result;
+      }
+
+      var $result = $('<li><a href="' + $element.attr('href') + '">' + result + '</a></li>');
+      $result.data('original-link', $(this.element).parent());
+      $html.append($result);
+    });
+    return $html;
+  }
+
+  /**
+   * Highlights selected result.
+   */
+  function resultsHandler(e) {
+    var $this = $(this);
+    var show = e.type === 'mouseenter' || e.type === 'focusin';
+    $this.trigger(show ? 'showPath' : 'hidePath', [this]);
+  }
+
+  /**
+   * Closes the search results and clears the search input.
+   */
+  function resultsClickHandler(e, link) {
+    var $original = $(this).data('original-link');
+    $original.trigger('mouseleave');
+    $input.val('').trigger('keyup');
+  }
+
+  /**
+   * Shows the link in the menu that corresponds to a search result.
+   */
+  function highlightPathHandler(e, link) {
+    if (link) {
+      var $original = $(link).data('original-link');
+      var show = e.type === 'showPath';
+      // Toggle an additional CSS class to visually highlight the matching link.
+      // @todo Consider using same visual appearance as regular hover.
+      $original.toggleClass('highlight', show);
+      $original.trigger(show ? 'mouseenter' : 'mouseleave');
+    }
+  }
+
+  // Attach showPath/hidePath handler to search result entries.
+  $results.delegate('li', 'mouseenter mouseleave focus blur', resultsHandler);
+  // Hide the result list after a link has been clicked, useful for overlay.
+  $results.delegate('li', 'click', resultsClickHandler);
+  // Attach hover/active highlight behavior to search result entries.
+  $adminMenu.delegate('.admin-menu-search-results li', 'showPath hidePath', highlightPathHandler);
+  // Attach the search input event handler.
+  $input.bind('keyup search', keyupHandler);
+};
+
+/**
+ * @} End of "defgroup admin_behaviors".
+ */
+
+})(jQuery);
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu.map.inc b/htmltest/sites/all/modules/admin_menu/admin_menu.map.inc
new file mode 100644
index 00000000..72a89602
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu.map.inc
@@ -0,0 +1,164 @@
+<?php
+
+/**
+ * @file
+ * Implements hook_admin_menu_map() on behalf of core modules.
+ *
+ * @todo Replace all/most of those API functions with direct DB queries;
+ *   we only need the menu arguments (keys), not fully loaded objects.
+ */
+
+/**
+ * Implements hook_admin_menu_map() on behalf of Filter module.
+ */
+function filter_admin_menu_map() {
+  if (!user_access('administer filters')) {
+    return;
+  }
+  $map['admin/config/content/formats/%filter_format'] = array(
+    'parent' => 'admin/config/content/formats',
+    'arguments' => array(
+      array('%filter_format' => array_keys(filter_formats())),
+    ),
+  );
+  return $map;
+}
+
+/**
+ * Implements hook_admin_menu_map() on behalf of Menu module.
+ */
+function menu_admin_menu_map() {
+  if (!user_access('administer menu')) {
+    return;
+  }
+  $map['admin/structure/menu/manage/%menu'] = array(
+    'parent' => 'admin/structure/menu',
+    'arguments' => array(
+      array('%menu' => array_keys(menu_get_menus())),
+    ),
+  );
+  return $map;
+}
+
+/**
+ * Implements hook_admin_menu_map() on behalf of Node module.
+ */
+function node_admin_menu_map() {
+  if (!user_access('administer content types')) {
+    return;
+  }
+  $map['admin/structure/types/manage/%node_type'] = array(
+    'parent' => 'admin/structure/types',
+    'arguments' => array(
+      array('%node_type' => array_keys(node_type_get_types())),
+    ),
+  );
+  return $map;
+}
+
+/**
+ * Implements hook_admin_menu_map() on behalf of Field UI module.
+ */
+function field_ui_admin_menu_map() {
+  $map = array();
+  foreach (entity_get_info() as $obj_type => $info) {
+    foreach ($info['bundles'] as $bundle_name => $bundle_info) {
+      if (isset($bundle_info['admin'])) {
+        $arguments = array();
+        switch ($obj_type) {
+          case 'comment':
+            $fields = array();
+            foreach (field_info_instances($obj_type, $bundle_name) as $field) {
+              $fields[] = $field['field_name'];
+            }
+            // @todo Make Comment module expose the original node type bundle,
+            //   pretty please.
+            if (drupal_substr($bundle_name, 0, 13) == 'comment_node_') {
+              $bundle_name = drupal_substr($bundle_name, 13);
+            }
+            // @todo Doesn't work yet. Why?
+            $arguments = array(
+              '%comment_node_type' => array($bundle_name),
+              '%field_ui_menu' => $fields,
+            );
+            break;
+
+          case 'node':
+            $fields = array();
+            foreach (field_info_instances($obj_type, $bundle_name) as $field) {
+              $fields[] = $field['field_name'];
+            }
+            $arguments = array(
+              '%node_type' => array($bundle_name),
+              '%field_ui_menu' => $fields,
+            );
+            break;
+
+          case 'taxonomy_term':
+            $fields = array();
+            foreach (field_info_instances($obj_type, $bundle_name) as $field) {
+              $fields[] = $field['field_name'];
+            }
+            // Map machine_name to vid.
+            $arguments = array(
+              '%taxonomy_vocabulary_machine_name' => array($bundle_name),
+              '%field_ui_menu' => $fields,
+            );
+            break;
+
+          case 'user':
+            $arguments = array(
+              '%field_ui_menu' => array_keys(field_info_fields('user')),
+            );
+            break;
+        }
+        if (!empty($arguments)) {
+          $path = $bundle_info['admin']['path'];
+          $map["$path/fields/%field_ui_menu"]['parent'] = "$path/fields";
+          $map["$path/fields/%field_ui_menu"]['arguments'][] = $arguments;
+        }
+      }
+    }
+  }
+  return $map;
+}
+
+/**
+ * Implements hook_admin_menu_map() on behalf of Taxonomy module.
+ */
+function taxonomy_admin_menu_map() {
+  if (!user_access('administer taxonomy')) {
+    return;
+  }
+  $map['admin/structure/taxonomy/%taxonomy_vocabulary_machine_name'] = array(
+    'parent' => 'admin/structure/taxonomy',
+    'arguments' => array(
+      array('%taxonomy_vocabulary_machine_name' => array_keys(taxonomy_vocabulary_get_names())),
+    ),
+  );
+  return $map;
+}
+
+/**
+ * Implements hook_admin_menu_map() on behalf of Views UI module.
+ */
+function views_ui_admin_menu_map() {
+  if (!user_access('administer views')) {
+    return;
+  }
+  $views = array();
+  foreach (views_get_enabled_views() as $name => $view) {
+    $views[] = $name;
+  }
+  if (empty($views)) {
+    return;
+  }
+  $map['admin/structure/views/view/%views_ui_cache'] = array(
+    'parent' => 'admin/structure/views',
+    'arguments' => array(
+      array('%views_ui_cache' => $views),
+    ),
+  );
+  return $map;
+}
+
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu.module b/htmltest/sites/all/modules/admin_menu/admin_menu.module
new file mode 100644
index 00000000..8a8dee14
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu.module
@@ -0,0 +1,858 @@
+<?php
+
+/**
+ * @file
+ * Render an administrative menu as a dropdown menu at the top of the window.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function admin_menu_help($path, $arg) {
+  switch ($path) {
+    case 'admin/config/administration/admin_menu':
+      return '<p>' . t('The administration menu module provides a dropdown menu arranged for one- or two-click access to most administrative tasks and other common destinations (to users with the proper permissions). Use the settings below to customize the appearance of the menu.') . '</p>';
+
+    case 'admin/help#admin_menu':
+      $output = '';
+      $output .= '<p>' . t('The administration menu module provides a dropdown menu arranged for one- or two-click access to most administrative tasks and other common destinations (to users with the proper permissions). Administration menu also displays the number of anonymous and authenticated users, and allows modules to add their own custom menu items. Integration with the menu varies from module to module; the contributed module <a href="@drupal">Devel</a>, for instance, makes strong use of the administration menu module to provide quick access to development tools.', array('@drupal' => 'http://drupal.org/project/devel')) . '</p>';
+      $output .= '<p>' . t('The administration menu <a href="@settings">settings page</a> allows you to modify some elements of the menu\'s behavior and appearance. Since the appearance of the menu is dependent on your site theme, substantial customizations require modifications to your site\'s theme and CSS files. See the advanced module README.txt file for more information on theme and CSS customizations.', array('@settings' => url('admin/config/administration/admin_menu'))) . '</p>';
+      $output .= '<p>' . t('The menu items displayed in the administration menu depend upon the actual permissions of the viewer. First, the administration menu is only displayed to users in roles with the <em>Access administration menu</em> (admin_menu module) permission. Second, a user must be a member of a role with the <em>Access administration pages</em> (system module) permission to view administrative links. And, third, only currently permitted links are displayed; for example, if a user is not a member of a role with the permissions <em>Administer permissions</em> (user module) and <em>Administer users</em> (user module), the <em>User management</em> menu item is not displayed.') . '</p>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_permission().
+ */
+function admin_menu_permission() {
+  return array(
+    'access administration menu' => array(
+      'title' => t('Access administration menu'),
+      'description' => t('Display the administration menu at the top of each page.'),
+    ),
+    'flush caches' => array(
+      'title' => t('Flush caches'),
+      'description' => t('Access links to flush caches in the administration menu.'),
+    ),
+    'display drupal links' => array(
+      'title' => t('Display Drupal links'),
+      'description' => t('Provide Drupal.org links in the administration menu.'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_theme().
+ */
+function admin_menu_theme() {
+  return array(
+    'admin_menu_links' => array(
+      'render element' => 'elements',
+    ),
+    'admin_menu_icon' => array(
+      'variables' => array('src' => NULL, 'alt' => NULL),
+      'file' => 'admin_menu.inc',
+    ),
+  );
+}
+
+/**
+ * Implements hook_menu().
+ */
+function admin_menu_menu() {
+  // AJAX callback.
+  // @see http://drupal.org/project/js
+  $items['js/admin_menu/cache'] = array(
+    'page callback' => 'admin_menu_js_cache',
+    'delivery callback' => 'admin_menu_deliver',
+    'access arguments' => array('access administration menu'),
+    'type' => MENU_CALLBACK,
+  );
+  // Module settings.
+  $items['admin/config/administration'] = array(
+    'title' => 'Administration',
+    'description' => 'Administration tools.',
+    'page callback' => 'system_admin_menu_block_page',
+    'access arguments' => array('access administration pages'),
+    'file' => 'system.admin.inc',
+    'file path' => drupal_get_path('module', 'system'),
+  );
+  $items['admin/config/administration/admin_menu'] = array(
+    'title' => 'Administration menu',
+    'description' => 'Adjust administration menu settings.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('admin_menu_theme_settings'),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'admin_menu.inc',
+  );
+  // Menu link callbacks.
+  $items['admin_menu/toggle-modules'] = array(
+    'page callback' => 'admin_menu_toggle_modules',
+    'access arguments' => array('administer modules'),
+    'type' => MENU_CALLBACK,
+    'file' => 'admin_menu.inc',
+  );
+  $items['admin_menu/flush-cache'] = array(
+    'page callback' => 'admin_menu_flush_cache',
+    'access arguments' => array('flush caches'),
+    'type' => MENU_CALLBACK,
+    'file' => 'admin_menu.inc',
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_menu_alter().
+ */
+function admin_menu_menu_alter(&$items) {
+  // Flush client-side caches whenever the menu is rebuilt.
+  admin_menu_flush_caches();
+}
+
+/**
+ * Implements hook_menu_link_insert().
+ */
+function admin_menu_menu_link_insert($link) {
+  // Flush all of our caches to pick up the link.
+  admin_menu_flush_caches();
+}
+
+/**
+ * Implements hook_menu_link_update().
+ */
+function admin_menu_menu_link_update($link) {
+  // Flush all of our caches to pick up the link.
+  admin_menu_flush_caches();
+}
+
+/**
+ * Implements hook_menu_link_delete().
+ */
+function admin_menu_menu_link_delete($link) {
+  // Flush all of our caches to pick up the link.
+  admin_menu_flush_caches();
+}
+
+/**
+ * Implements hook_system_info_alter().
+ *
+ * Indicate that the 'page_bottom' region (in which the administration menu
+ * is displayed) is an overlay supplemental region that should be refreshed
+ * whenever its content is updated.
+ *
+ * @see toolbar_system_info_alter()
+ */
+function admin_menu_system_info_alter(&$info, $file, $type) {
+  if ($type == 'theme') {
+    $info['overlay_supplemental_regions'][] = 'page_bottom';
+  }
+}
+
+/**
+ * Implements hook_page_build().
+ */
+function admin_menu_page_build(&$page) {
+  if (!user_access('access administration menu') || admin_menu_suppress(FALSE)) {
+    return;
+  }
+  // Performance: Skip this entirely for AJAX requests.
+  if (strpos($_GET['q'], 'js/') === 0) {
+    return;
+  }
+  global $user, $language;
+  $path = drupal_get_path('module', 'admin_menu');
+
+  $page['page_bottom']['admin_menu'] = array(
+    '#attached' => array(),
+  );
+  $attached = &$page['page_bottom']['admin_menu']['#attached'];
+  $options = array('every_page' => TRUE);
+
+  $attached['css'][$path . '/admin_menu.css'] = $options;
+  if ($user->uid == 1) {
+    $attached['css'][$path . '/admin_menu.uid1.css'] = $options;
+  }
+  // Previous versions used the 'defer' attribute to increase browser rendering
+  // performance. At least starting with Firefox 3.6, deferred .js files are
+  // loaded, but Drupal.behaviors are not contained in the DOM when drupal.js
+  // executes Drupal.attachBehaviors().
+  $attached['js'][$path . '/admin_menu.js'] = $options;
+
+  // Destination query strings are applied via JS.
+  $settings['destination'] = drupal_http_build_query(drupal_get_destination());
+
+  // Determine whether we need to show all components and disable all caches.
+  $complete = FALSE;
+  if (current_path() == 'admin/config/administration/admin_menu' && $_SERVER['REQUEST_METHOD'] == 'GET') {
+    $complete = TRUE;
+  }
+
+  // If the client supports JavaScript and we have a cached menu for the current
+  // user, only output the hash for the client-side HTTP cache callback URL.
+  $cid = 'admin_menu:' . $user->uid . ':' . session_id() . ':' . $language->language;
+  if (!$complete && !empty($_COOKIE['has_js']) && ($hash = admin_menu_cache_get($cid))) {
+    $settings['hash'] = $hash;
+    // The base path to use for cache requests depends on whether clean URLs
+    // are enabled, whether Drupal runs in a sub-directory, and on the language
+    // system configuration. url() already provides us the proper path and also
+    // invokes potentially existing custom_url_rewrite() functions, which may
+    // add further required components to the URL to provide context. Due to
+    // those components, and since url('') returns only base_path() when clean
+    // URLs are disabled, we need to use a replacement token as path.  Yuck.
+    $settings['basePath'] = url('admin_menu');
+  }
+  // Otherwise, add the full menu to the page.
+  else {
+    $page['page_bottom']['admin_menu']['#markup'] = admin_menu_output($complete);
+  }
+
+  $replacements = module_invoke_all('admin_menu_replacements', $complete);
+  if (!empty($replacements)) {
+    $settings['replacements'] = $replacements;
+  }
+
+  if ($setting = variable_get('admin_menu_margin_top', 1)) {
+    $settings['margin_top'] = $setting;
+    // @todo Drupal.behaviors.adminMenuMarginTop is obsolete, but
+    //   hook_page_build() does not allow to set a CSS class on the body yet.
+    // @see http://drupal.org/node/1473548, http://drupal.org/node/1194528
+    //$page['#attributes']['class'][] = 'admin-menu';
+  }
+  if ($setting = variable_get('admin_menu_position_fixed', 1)) {
+    $settings['position_fixed'] = $setting;
+
+    // In fixed positioning, supply a callback function for tableheader.js to
+    // allow it to determine the top viewport offset.
+    // @see admin_menu.js, toolbar.js
+    $attached['js'][] = array(
+      'data' => array('tableHeaderOffset' => 'Drupal.admin.height'),
+      'type' => 'setting',
+    );
+  }
+  if ($setting = variable_get('admin_menu_tweak_tabs', 0)) {
+    $settings['tweak_tabs'] = $setting;
+  }
+  if ($_GET['q'] == 'admin/modules' || strpos($_GET['q'], 'admin/modules/list') === 0) {
+    $settings['tweak_modules'] = variable_get('admin_menu_tweak_modules', 0);
+  }
+  if ($_GET['q'] == 'admin/people/permissions' || $_GET['q'] == 'admin/people/permissions/list') {
+    $settings['tweak_permissions'] = variable_get('admin_menu_tweak_permissions', 0);
+  }
+
+  $attached['js'][] = array(
+    'data' => array('admin_menu' => $settings),
+    'type' => 'setting',
+  );
+}
+
+/**
+ * Suppress display of administration menu.
+ *
+ * This function should be called from within another module's page callback
+ * (preferably using module_invoke()) when the menu should not be displayed.
+ * This is useful for modules that implement popup pages or other special
+ * pages where the menu would be distracting or break the layout.
+ *
+ * @param $set
+ *   Defaults to TRUE. If called before hook_footer(), the menu will not be
+ *   displayed. If FALSE is passed, the suppression state is returned.
+ */
+function admin_menu_suppress($set = TRUE) {
+  static $suppress = FALSE;
+  // drupal_add_js() must only be invoked once.
+  if (!empty($set) && $suppress === FALSE) {
+    $suppress = TRUE;
+    drupal_add_js(array('admin_menu' => array('suppress' => 1)), 'setting');
+  }
+  return $suppress;
+}
+
+/**
+ * Implements hook_js().
+ */
+function admin_menu_js() {
+  return array(
+    'cache' => array(
+      'callback' => 'admin_menu_js_cache',
+      'includes' => array('common', 'theme', 'unicode'),
+      'dependencies' => array('devel', 'filter', 'user'),
+    ),
+  );
+}
+
+/**
+ * Retrieve a client-side cache hash from cache.
+ *
+ * The hash cache is consulted more than once per request; we therefore cache
+ * the results statically to avoid multiple database requests.
+ *
+ * This should only be used for client-side cache hashes. Use cache_menu for
+ * administration menu content.
+ *
+ * @param $cid
+ *   The cache ID of the data to retrieve.
+ */
+function admin_menu_cache_get($cid) {
+  $cache = &drupal_static(__FUNCTION__, array());
+
+  if (!variable_get('admin_menu_cache_client', TRUE)) {
+    return FALSE;
+  }
+  if (!array_key_exists($cid, $cache)) {
+    $cache[$cid] = cache_get($cid, 'cache_admin_menu');
+    if ($cache[$cid] && isset($cache[$cid]->data)) {
+      $cache[$cid] = $cache[$cid]->data;
+    }
+  }
+
+  return $cache[$cid];
+}
+
+/**
+ * Store a client-side cache hash in persistent cache.
+ *
+ * This should only be used for client-side cache hashes. Use cache_menu for
+ * administration menu content.
+ *
+ * @param $cid
+ *   The cache ID of the data to retrieve.
+ */
+function admin_menu_cache_set($cid, $data) {
+  if (variable_get('admin_menu_cache_client', TRUE)) {
+    cache_set($cid, $data, 'cache_admin_menu');
+  }
+}
+
+/**
+ * Menu callback; Output administration menu for HTTP caching via AJAX request.
+ *
+ * @see admin_menu_deliver()
+ */
+function admin_menu_js_cache() {
+  global $conf;
+
+  // Suppress Devel module.
+  $GLOBALS['devel_shutdown'] = FALSE;
+
+  // Enforce page caching.
+  $conf['cache'] = 1;
+  drupal_page_is_cacheable(TRUE);
+
+  // If we have a cache, serve it.
+  // @see _drupal_bootstrap_page_cache()
+  $cache = drupal_page_get_cache();
+  if (is_object($cache)) {
+    header('X-Drupal-Cache: HIT');
+    // Restore the metadata cached with the page.
+    $_GET['q'] = $cache->data['path'];
+    date_default_timezone_set(drupal_get_user_timezone());
+
+    drupal_serve_page_from_cache($cache);
+
+    // We are done.
+    exit;
+  }
+
+  // Otherwise, create a new page response (that will be cached).
+  header('X-Drupal-Cache: MISS');
+
+  // The Expires HTTP header is the heart of the client-side HTTP caching. The
+  // additional server-side page cache only takes effect when the client
+  // accesses the callback URL again (e.g., after clearing the browser cache or
+  // when force-reloading a Drupal page).
+  $max_age = 3600 * 24 * 365;
+  drupal_add_http_header('Expires', gmdate(DATE_RFC1123, REQUEST_TIME + $max_age));
+  drupal_add_http_header('Cache-Control', 'private, max-age=' . $max_age);
+
+  // Retrieve and return the rendered menu.
+  return admin_menu_output();
+}
+
+/**
+ * Delivery callback for client-side HTTP caching.
+ *
+ * @see admin_menu_js_cache()
+ */
+function admin_menu_deliver($page_callback_result) {
+  drupal_add_http_header('Content-Type', 'text/html; charset=utf-8');
+
+  // Send appropriate language header for browsers.
+  global $language;
+  drupal_add_http_header('Content-Language', $language->language);
+
+  // The page callback is always admin_menu_js_cache(), which always returns a
+  // string, and is only accessed when the user actually has access to it.
+  // Therefore, we do not care for the other possible page callback results.
+  print $page_callback_result;
+
+  // Perform end-of-request tasks. The page cache is created here.
+  drupal_page_footer();
+}
+
+/**
+ * Implements hook_admin_menu_replacements().
+ */
+function admin_menu_admin_menu_replacements($complete) {
+  $items = array();
+  // If the complete menu is output, then it is uncached and will contain the
+  // current counts already.
+  if (!$complete) {
+    // Check whether the users count component is enabled.
+    $components = variable_get('admin_menu_components', array());
+    if (!empty($components['admin_menu.users']) && ($user_count = admin_menu_get_user_count())) {
+      // Replace the counters in the cached menu output with current counts.
+      $items['.admin-menu-users a'] = $user_count;
+    }
+  }
+  return $items;
+}
+
+/**
+ * Return count of online anonymous/authenticated users.
+ *
+ * @see user_block(), user.module
+ */
+function admin_menu_get_user_count() {
+  $interval   = REQUEST_TIME - variable_get('user_block_seconds_online', 900);
+  $count_anon = admin_menu_session_count($interval, TRUE);
+  $count_auth = admin_menu_session_count($interval, FALSE);
+
+  return t('@count-anon / @count-auth', array('@count-anon' => $count_anon, '@count-auth' => $count_auth));
+}
+
+/**
+ * Counts how many users are active on the site.
+ *
+ * Counts how many users have sessions which have been active since the
+ * specified time. Can count either anonymous sessions or authenticated
+ * sessions.
+ *
+ * @param $timestamp
+ *   A Unix timestamp. Users who have been active since this time will be
+ *   counted. The default is 0, which counts all existing sessions.
+ * @param $anonymous
+ *   TRUE counts only anonymous users. FALSE counts only authenticated users.
+ *
+ * @return
+ *   The number of users with sessions.
+ *
+ * @todo There are mostly no anonymous sessions anymore. Split this into a
+ *   separate module providing proper user statistics.
+ */
+function admin_menu_session_count($timestamp = 0, $anonymous = TRUE) {
+  $query = db_select('sessions');
+  $query->addExpression('COUNT(sid)', 'count');
+  $query->condition('timestamp', $timestamp, '>=');
+  $query->condition('uid', 0, $anonymous ? '=' : '>');
+  return $query->execute()->fetchField();
+}
+
+/**
+ * Build the administration menu output.
+ *
+ * @param bool $complete
+ *   (optional) Whether to build to the complete menu including all components
+ *   and ignore the cache. Defaults to FALSE. Internally used for the settings
+ *   page.
+ */
+function admin_menu_output($complete = FALSE) {
+  global $user, $language;
+
+  $cache_server_enabled = !$complete && variable_get('admin_menu_cache_server', TRUE);
+  $cid = 'admin_menu:' . $user->uid . ':' . session_id() . ':' . $language->language;
+
+  // Try to load and output administration menu from server-side cache.
+  // @todo Duplicates the page cache? Page cache ID contains the hash that is
+  //   generated at the bottom of this function, which is based on $content,
+  //   but logically identical to the $cid. Investigate whether not only the
+  //   cache_menu but also the cache_admin_menu could be dropped; the
+  //   client-side HTTP cache hash check could be based on a cid lookup in
+  //   cache_page instead? (i.e., one cache to rule them all) However,
+  //   cache_page is cleared very often.
+  if ($cache_server_enabled) {
+    $cache = cache_get($cid, 'cache_menu');
+    if ($cache && isset($cache->data)) {
+      $content = $cache->data;
+    }
+  }
+
+  // Rebuild the output.
+  if (!isset($content)) {
+    // Retrieve enabled components to display and make them available for others.
+    $components = variable_get('admin_menu_components', array());
+    $components += array(
+      'admin_menu.menu' => TRUE,
+      'admin_menu.icon' => TRUE,
+      'admin_menu.account' => TRUE,
+    );
+    $content['#components'] = $components;
+    $content['#complete'] = $complete;
+
+    // Add site name as CSS class for development/staging theming purposes. We
+    // leverage the cookie domain instead of HTTP_HOST to account for many (but
+    // not all) multi-domain setups (e.g. language-based sub-domains).
+    $classes = 'admin-menu-site' . drupal_strtolower(preg_replace('/[^a-zA-Z0-9-]/', '-', $GLOBALS['cookie_domain']));
+    // Displace overlay.
+    // @see Drupal.overlay.create
+    // @see toolbar_preprocess_toolbar()
+    if (module_exists('overlay')) {
+      $classes .= ' overlay-displace-top';
+    }
+    // @todo Always output container to harden JS-less support.
+    $content['#prefix'] = '<div id="admin-menu" class="' . $classes . '"><div id="admin-menu-wrapper">';
+    $content['#suffix'] = '</div></div>';
+
+    // Load menu builder functions.
+    module_load_include('inc', 'admin_menu');
+
+    // @todo Move the below callbacks into hook_admin_menu_build()
+    //   implementations (and $module.admin_menu.inc).
+
+    // Add administration menu.
+    if (!empty($components['admin_menu.menu']) || $complete) {
+      $content['menu'] = admin_menu_links_menu(admin_menu_tree('management'));
+      $content['menu']['#theme'] = 'admin_menu_links';
+      $content['menu']['#wrapper_attributes']['id'] = 'admin-menu-menu';
+      // Ensure the menu tree is rendered between the icon and user links.
+      $content['menu']['#weight'] = 0;
+    }
+
+    // Add menu additions.
+    if (!empty($components['admin_menu.icon']) || $complete) {
+      $content['icon'] = admin_menu_links_icon();
+    }
+    if (!empty($components['admin_menu.account']) || $complete) {
+      $content['account'] = admin_menu_links_account();
+    }
+    if (!empty($components['admin_menu.users']) || $complete) {
+      $content['users'] = admin_menu_links_users();
+    }
+    if (!empty($components['admin_menu.search']) || $complete) {
+      $content['search'] = admin_menu_links_search();
+    }
+
+    // Allow modules to enhance the menu.
+    // Uses '_output' suffix for consistency with the alter hook (see below).
+    foreach (module_implements('admin_menu_output_build') as $module) {
+      $function = $module . '_admin_menu_output_build';
+      $function($content);
+    }
+
+    // Allow modules to alter the output.
+    // The '_output' suffix is required to prevent hook implementation function
+    // name clashes with the contributed Admin module.
+    drupal_alter('admin_menu_output', $content);
+
+    $content = drupal_render($content);
+
+    // Cache the menu for this user.
+    if ($cache_server_enabled) {
+      cache_set($cid, $content, 'cache_menu');
+    }
+  }
+
+  // Store the new hash for this user.
+  if (!empty($_COOKIE['has_js']) && !$complete) {
+    admin_menu_cache_set($cid, md5($content));
+  }
+
+  return $content;
+}
+
+/**
+ * Implements hook_admin_menu_output_build().
+ */
+function admin_menu_admin_menu_output_build(&$content) {
+  if (!isset($content['menu'])) {
+    return;
+  }
+
+  // Unassign weights for categories below Configuration.
+  // An alphabetical order is more natural for a dropdown menu.
+  if (isset($content['menu']['admin/config'])) {
+    foreach (element_children($content['menu']['admin/config']) as $key) {
+      $content['menu']['admin/config'][$key]['#weight_original'] = $content['menu']['admin/config'][$key]['#weight'];
+      unset($content['menu']['admin/config'][$key]['#weight']);
+    }
+  }
+
+  // Retrieve the "Add content" link tree.
+  $link = db_query("SELECT * FROM {menu_links} WHERE router_path = 'node/add' AND module = 'system'")->fetchAssoc();
+  $conditions = array();
+  for ($i = 1; $i < MENU_MAX_DEPTH; $i++) {
+    if (!empty($link["p$i"])) {
+      $conditions["p$i"] = $link["p$i"];
+    }
+  }
+  $tree = menu_build_tree($link['menu_name'], array(
+    'conditions' => $conditions,
+    'min_depth' => $link['depth'],
+  ));
+  $links = admin_menu_links_menu($tree);
+  if (!empty($links)) {
+    // If the user has access to the top-level "Content" category, insert the
+    // "Add content" link tree there.
+    if (isset($content['menu']['admin/content'])) {
+      $content['menu']['admin/content'] += $links;
+    }
+    // Otherwise make insert "Add content" as top-level category.
+    else {
+      $key = key($links);
+      $links[$key]['#weight'] = -100;
+      $content['menu'] += $links;
+    }
+  }
+}
+
+/**
+ * Implements hook_admin_menu_output_alter().
+ */
+function admin_menu_admin_menu_output_alter(&$content) {
+  foreach ($content['menu'] as $key => $link) {
+    // Move local tasks on 'admin' into icon menu.
+    if ($key == 'admin/tasks' || $key == 'admin/index') {
+      $content['icon']['icon'][$key] = $link;
+      unset($content['menu'][$key]);
+    }
+  }
+}
+
+/**
+ * Render a themed list of links.
+ *
+ * @param $variables
+ *   - elements: A renderable array of links using the following keys:
+ *     - #attributes: Optional array of attributes for the list item, processed
+ *       via drupal_attributes().
+ *     - #title: Title of the link, passed to l().
+ *     - #href: Optional path of the link, passed to l(). When omitted, the
+ *       element's '#title' is rendered without link.
+ *     - #description: Optional alternative text for the link, passed to l().
+ *     - #options: Optional alternative text for the link, passed to l().
+ *     The array key of each child element itself is passed as path for l().
+ */
+function theme_admin_menu_links($variables) {
+  $destination = &drupal_static('admin_menu_destination');
+  $elements = $variables['elements'];
+
+  if (!isset($destination)) {
+    $destination = drupal_get_destination();
+    $destination = $destination['destination'];
+  }
+
+  // The majority of items in the menu are sorted already, but since modules
+  // may add or change arbitrary items anywhere, there is no way around sorting
+  // everything again. element_sort() is not sufficient here, as it
+  // intentionally retains the order of elements having the same #weight,
+  // whereas menu links are supposed to be ordered by #weight and #title.
+  uasort($elements, 'admin_menu_element_sort');
+  $elements['#sorted'] = TRUE;
+
+  $output = '';
+  foreach (element_children($elements) as $path) {
+    // Early-return nothing if user does not have access.
+    if (isset($elements[$path]['#access']) && !$elements[$path]['#access']) {
+      continue;
+    }
+    $elements[$path] += array(
+      '#attributes' => array(),
+      '#options' => array(),
+    );
+    // Render children to determine whether this link is expandable.
+    if (isset($elements[$path]['#type']) || isset($elements[$path]['#theme']) || isset($elements[$path]['#pre_render'])) {
+      $elements[$path]['#children'] = drupal_render($elements[$path]);
+    }
+    else {
+      $elements[$path]['#children'] = theme('admin_menu_links', array('elements' => $elements[$path]));
+      if (!empty($elements[$path]['#children'])) {
+        $elements[$path]['#attributes']['class'][] = 'expandable';
+      }
+      if (isset($elements[$path]['#attributes']['class'])) {
+        $elements[$path]['#attributes']['class'] = $elements[$path]['#attributes']['class'];
+      }
+    }
+
+    $link = '';
+    // Handle menu links.
+    if (isset($elements[$path]['#href'])) {
+      // Strip destination query string from href attribute and apply a CSS class
+      // for our JavaScript behavior instead.
+      if (isset($elements[$path]['#options']['query']['destination']) && $elements[$path]['#options']['query']['destination'] == $destination) {
+        unset($elements[$path]['#options']['query']['destination']);
+        $elements[$path]['#options']['attributes']['class'][] = 'admin-menu-destination';
+      }
+
+      $link = l($elements[$path]['#title'], $elements[$path]['#href'], $elements[$path]['#options']);
+    }
+    // Handle plain text items, but do not interfere with menu additions.
+    elseif (!isset($elements[$path]['#type']) && isset($elements[$path]['#title'])) {
+      if (!empty($elements[$path]['#options']['html'])) {
+        $title = $elements[$path]['#title'];
+      }
+      else {
+        $title = check_plain($elements[$path]['#title']);
+      }
+      $attributes = '';
+      if (isset($elements[$path]['#options']['attributes'])) {
+        $attributes = drupal_attributes($elements[$path]['#options']['attributes']);
+      }
+      $link = '<span' . $attributes . '>' . $title . '</span>';
+    }
+
+    $output .= '<li' . drupal_attributes($elements[$path]['#attributes']) . '>';
+    $output .= $link . $elements[$path]['#children'];
+    $output .= '</li>';
+  }
+  // @todo #attributes probably required for UL, but already used for LI.
+  // @todo Use $element['#children'] here instead.
+  if ($output) {
+    $elements['#wrapper_attributes']['class'][] = 'dropdown';
+    $attributes = drupal_attributes($elements['#wrapper_attributes']);
+    $output = "\n" . '<ul' . $attributes . '>' . $output . '</ul>';
+  }
+  return $output;
+}
+
+/**
+ * Function used by uasort to sort structured arrays by #weight AND #title.
+ */
+function admin_menu_element_sort($a, $b) {
+  // @see element_sort()
+  $a_weight = isset($a['#weight']) ? $a['#weight'] : 0;
+  $b_weight = isset($b['#weight']) ? $b['#weight'] : 0;
+  if ($a_weight == $b_weight) {
+    // @see element_sort_by_title()
+    $a_title = isset($a['#title']) ? $a['#title'] : '';
+    $b_title = isset($b['#title']) ? $b['#title'] : '';
+    return strnatcasecmp($a_title, $b_title);
+  }
+  return ($a_weight < $b_weight) ? -1 : 1;
+}
+
+/**
+ * Implements hook_translated_menu_link_alter().
+ *
+ * Here is where we make changes to links that need dynamic information such
+ * as the current page path or the number of users.
+ */
+function admin_menu_translated_menu_link_alter(&$item, $map) {
+  global $user, $base_url;
+  static $access_all;
+
+  if ($item['menu_name'] != 'admin_menu') {
+    return;
+  }
+
+  // Check whether additional development output is enabled.
+  if (!isset($access_all)) {
+    $access_all = variable_get('admin_menu_show_all', 0) && module_exists('devel');
+  }
+  // Prepare links that would not be displayed normally.
+  if ($access_all && !$item['access']) {
+    $item['access'] = TRUE;
+    // Prepare for http://drupal.org/node/266596
+    if (!isset($item['localized_options'])) {
+      _menu_item_localize($item, $map, TRUE);
+    }
+  }
+
+  // Don't waste cycles altering items that are not visible
+  if (!$item['access']) {
+    return;
+  }
+
+  // Add developer information to all links, if enabled.
+  if ($extra = variable_get('admin_menu_display', 0)) {
+    $item['title'] .= ' ' . $extra[0] . ': ' . $item[$extra];
+  }
+}
+
+/**
+ * Implements hook_flush_caches().
+ *
+ * Flushes client-side caches.
+ *
+ * @param int $uid
+ *   (optional) A user ID to limit the cache flush to.
+ */
+function admin_menu_flush_caches($uid = NULL) {
+  // A call to menu_rebuild() will trigger potentially thousands of calls into
+  // menu_link_save(), for which admin_menu has to implement the corresponding
+  // CRUD hooks, in order to take up any menu link changes, since any menu link
+  // change could affect the admin menu (which essentially is an aggregate) and
+  // since there is no other way to get notified about stale caches. The cache
+  // only needs to be flushed once though, so we prevent a ton of needless
+  // subsequent calls with this static.
+  // @see http://drupal.org/node/918538
+  $was_flushed = &drupal_static(__FUNCTION__, array());
+  // $uid can be NULL. PHP automatically converts that into '' (empty string),
+  // which is different to uid 0 (zero).
+  if (isset($was_flushed[$uid])) {
+    return;
+  }
+  $was_flushed[$uid] = TRUE;
+
+  $cid = 'admin_menu:';
+  if (isset($uid)) {
+    $cid .= $uid . ':';
+  }
+  // Flush cached output of admin_menu.
+  cache_clear_all($cid, 'cache_menu', TRUE);
+  // Flush client-side cache hashes.
+  drupal_static_reset('admin_menu_cache_get');
+  // db_table_exists() required for SimpleTest.
+  if (db_table_exists('cache_admin_menu')) {
+    cache_clear_all(isset($uid) ? $cid : '*', 'cache_admin_menu', TRUE);
+  }
+}
+
+/**
+ * Implements hook_form_alter().
+ */
+function admin_menu_form_alter(&$form, &$form_state, $form_id) {
+  $global_flush_ids = array(
+    'admin_menu_theme_settings' => 1,
+    // Update links for clean/non-clean URLs.
+    'system_clean_url_settings' => 1,
+    // Incorporate changed user permissions.
+    'user_admin_permissions' => 1,
+    // Removing a role potentially means less permissions.
+    'user_admin_role_delete_confirm' => 1,
+    // User name and roles may be changed on the user account form.
+    'user_profile_form' => 1,
+  );
+  if (isset($global_flush_ids[$form_id])) {
+    $form['#submit'][] = 'admin_menu_form_alter_flush_cache_submit';
+
+    // Optionally limit the cache flush to a certain user ID.
+    $form_state['admin_menu_uid'] = NULL;
+    if ($form_id == 'user_profile_form') {
+      $form_state['admin_menu_uid'] = $form_state['user']->uid;
+    }
+  }
+
+  // UX: Add a confirmation to the permissions form to ask the user whether to
+  // auto-enable the 'access administration menu' permission along with
+  // 'access administration pages'.
+  if ($form_id == 'user_admin_permissions') {
+    $form['#attached']['js'][] = drupal_get_path('module', 'admin_menu') . '/admin_menu.admin.js';
+  }
+}
+
+/**
+ * Form submission handler to flush Administration menu caches.
+ */
+function admin_menu_form_alter_flush_cache_submit($form, &$form_state) {
+  admin_menu_flush_caches($form_state['admin_menu_uid']);
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Extends Devel module with Administration menu developer settings.
+ */
+function admin_menu_form_devel_admin_settings_alter(&$form, &$form_state) {
+  form_load_include($form_state, 'inc', 'admin_menu');
+  _admin_menu_form_devel_admin_settings_alter($form, $form_state);
+}
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu.uid1.css b/htmltest/sites/all/modules/admin_menu/admin_menu.uid1.css
new file mode 100644
index 00000000..e375cfe6
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu.uid1.css
@@ -0,0 +1,9 @@
+
+/**
+ * @file
+ * Administration menu color override for uid1.
+ */
+
+#admin-menu li.admin-menu-account > a {
+  background: #911 url(images/bkg-red.png) bottom left repeat-x;
+}
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.css b/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.css
new file mode 100644
index 00000000..a3e9f3e3
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.css
@@ -0,0 +1,145 @@
+
+/**
+ * @file
+ * Toolbar style for Administration menu.
+ *
+ * Important: We cannot re-use toolbar.png from Toolbar module, since we cannot
+ * reliably determine the path to it.
+ *
+ * @todo Separate shortcut functionality into own module/widget.
+ */
+
+/* Adjust margin/height */
+html body.admin-menu {
+  margin-top: 29px !important;
+}
+html body.admin-menu-with-shortcuts {
+  margin-top: 65px !important;
+}
+/* Displace the core Toolbar, if concurrently output. */
+body div#toolbar.toolbar {
+  top: 30px;
+}
+
+/**
+ * Base styles.
+ *
+ * We use a keyword for the toolbar font size to make it display consistently
+ * across different themes, while still allowing browsers to resize the text.
+ */
+#admin-menu {
+  font: normal small "Lucida Grande", Verdana, sans-serif;
+  -moz-box-shadow: 0 -10px 20px 13px #000;
+  -webkit-box-shadow: 0 -10px 20px 13px #000;
+  box-shadow: 0 -10px 20px 13px #000;
+  right: 0;
+  width: auto;
+}
+#admin-menu-wrapper {
+  font-size: .846em;
+  padding: 5px 10px 0;
+}
+
+#admin-menu .dropdown a {
+  color: #fafafa;
+}
+
+/* Remove border from all lists and actions */
+#admin-menu .dropdown .admin-menu-action a {
+  border-left: 0;
+}
+#admin-menu .dropdown .admin-menu-icon > a {
+  padding: 2px 10px 3px;
+}
+
+/**
+ * Administration menu.
+ */
+#admin-menu .dropdown .admin-menu-icon > a span {
+  vertical-align: text-bottom;
+  width: 11px;
+  height: 14px;
+  display: block;
+  background: url(toolbar.png) no-repeat 0 -45px;
+  text-indent: -9999px;
+}
+#admin-menu > div > .dropdown > li > a {
+  border-right: 0;
+  margin-bottom: 4px;
+  padding: 2px 10px 3px;
+}
+#admin-menu .dropdown .admin-menu-toolbar-category > a,
+#admin-menu .dropdown .admin-menu-action > a {
+  border-radius: 10px;
+  -moz-border-radius: 10px;
+  -webkit-border-radius: 10px;
+}
+#admin-menu .dropdown .admin-menu-toolbar-category > a.active-trail {
+  text-shadow: #333 0 1px 0;
+  background: url(toolbar.png) 0 0 repeat-x;
+}
+#admin-menu .dropdown .admin-menu-toolbar-category > a:hover {
+  background-color: #444;
+}
+#admin-menu .dropdown .admin-menu-tab a {
+  border-right: 0;
+}
+#admin-menu .dropdown li li.expandable ul {
+  margin: -22px 0 0 160px;
+}
+
+/**
+ * Shortcuts toggle.
+ */
+#admin-menu .shortcut-toggle {
+  cursor: pointer;
+  background: url(toolbar.png) 0 -20px no-repeat;
+  display: block;
+  float: right;
+  margin: 0 0 0 1.3em;
+  text-indent: -9999px;
+  overflow: hidden;
+  width: 25px;
+  height: 25px;
+}
+#admin-menu .shortcut-toggle:focus,
+#admin-menu .shortcut-toggle:hover {
+  background-position: -50px -20px;
+}
+#admin-menu .shortcut-toggle.active {
+  background-position: -25px -20px;
+}
+#admin-menu .shortcut-toggle.active:focus,
+#admin-menu .shortcut-toggle.active:hover {
+  background-position: -75px -20px;
+}
+
+/**
+ * Shortcuts widget.
+ */
+#admin-menu .shortcut-toolbar {
+  background-color: #666;
+  clear: both;
+  display: none;
+  margin: 0 -10px;
+  overflow: hidden;
+  /* Align with icon; @see shortcut.css */
+  padding-left: 5px;
+}
+#admin-menu .shortcut-toolbar.active {
+  display: block;
+}
+/* Override theme list style; @see shortcut.css */
+#admin-menu .shortcut-toolbar ul {
+  margin: 0;
+}
+/* @see toolbar.css */
+#admin-menu .shortcut-toolbar li {
+  float: left;
+  list-style-image: none;
+  list-style-type: none;
+}
+#admin-menu .shortcut-toolbar a {
+  display: block;
+}
+
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.info b/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.info
new file mode 100644
index 00000000..2514776c
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.info
@@ -0,0 +1,12 @@
+name = Administration menu Toolbar style
+description = A better Toolbar.
+package = Administration
+core = 7.x
+dependencies[] = admin_menu
+
+; Information added by drupal.org packaging script on 2013-01-31
+version = "7.x-3.0-rc4"
+core = "7.x"
+project = "admin_menu"
+datestamp = "1359651687"
+
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.install b/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.install
new file mode 100644
index 00000000..bf067d78
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.install
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Installation functionality for Administration menu toolbar module.
+ */
+
+/**
+ * Implements hook_install().
+ */
+function admin_menu_toolbar_install() {
+  // Required to load JS/CSS in hook_init() after admin_menu.
+  db_update('system')
+    ->fields(array('weight' => 101))
+    ->condition('type', 'module')
+    ->condition('name', 'admin_menu_toolbar')
+    ->execute();
+}
+
+/**
+ * Set module weight to a value higher than admin_menu.
+ *
+ * At this point, admin_menu should have a weight of 100. To account for
+ * customized weights, we increase the weight relatively.
+ *
+ * @see admin_menu_toolbar_install()
+ */
+function admin_menu_toolbar_update_6300() {
+  $weight = db_query("SELECT weight FROM {system} WHERE type = 'module' AND name = 'admin_menu'")->fetchField();
+  $weight++;
+  db_update('system')
+    ->fields(array('weight' => $weight))
+    ->condition('type', 'module')
+    ->condition('name', 'admin_menu_toolbar')
+    ->execute();
+}
+
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.js b/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.js
new file mode 100644
index 00000000..809d9ead
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.js
@@ -0,0 +1,56 @@
+(function($) {
+
+Drupal.admin = Drupal.admin || {};
+Drupal.admin.behaviors = Drupal.admin.behaviors || {};
+
+/**
+ * @ingroup admin_behaviors
+ * @{
+ */
+
+/**
+ * Apply active trail highlighting based on current path.
+ *
+ * @todo Not limited to toolbar; move into core?
+ */
+Drupal.admin.behaviors.toolbarActiveTrail = function (context, settings, $adminMenu) {
+  if (settings.admin_menu.toolbar && settings.admin_menu.toolbar.activeTrail) {
+    $adminMenu.find('> div > ul > li > a[href="' + settings.admin_menu.toolbar.activeTrail + '"]').addClass('active-trail');
+  }
+};
+
+/**
+ * Toggles the shortcuts bar.
+ */
+Drupal.admin.behaviors.shortcutToggle = function (context, settings, $adminMenu) {
+  var $shortcuts = $adminMenu.find('.shortcut-toolbar');
+  if (!$shortcuts.length) {
+    return;
+  }
+  var storage = window.localStorage || false;
+  var storageKey = 'Drupal.admin_menu.shortcut';
+  var $body = $(context).find('body');
+  var $toggle = $adminMenu.find('.shortcut-toggle');
+  $toggle.click(function () {
+    var enable = !$shortcuts.hasClass('active');
+    $shortcuts.toggleClass('active', enable);
+    $toggle.toggleClass('active', enable);
+    if (settings.admin_menu.margin_top) {
+      $body.toggleClass('admin-menu-with-shortcuts', enable);
+    }
+    // Persist toggle state across requests.
+    storage && enable ? storage.setItem(storageKey, 1) : storage.removeItem(storageKey);
+    this.blur();
+    return false;
+  });
+
+  if (!storage || storage.getItem(storageKey)) {
+    $toggle.trigger('click');
+  }
+};
+
+/**
+ * @} End of "ingroup admin_behaviors".
+ */
+
+})(jQuery);
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.module b/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.module
new file mode 100644
index 00000000..74a9ee1f
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/admin_menu_toolbar.module
@@ -0,0 +1,118 @@
+<?php
+
+/**
+ * @file
+ * Renders Administration menu like Toolbar (core) module.
+ *
+ * @todo Separate shortcut functionality into own module/widget.
+ */
+
+/**
+ * Implements hook_form_FORMID_alter().
+ */
+function admin_menu_toolbar_form_admin_menu_theme_settings_alter(&$form) {
+  // Add the shortcut links as component on behalf of Shortcut module.
+  $form['plugins']['admin_menu_components']['#options']['shortcut.links'] = t('Shortcuts');
+  // The shortcut bar consists of two elements, so we target their class names
+  // instead of cluttering the markup with additional IDs.
+  $form['plugins']['admin_menu_components']['shortcut.links']['#attributes']['rel'] = '.shortcut-toggle, .shortcut-toolbar';
+}
+
+/**
+ * Implementation of hook_page_build().
+ */
+function admin_menu_toolbar_page_build(&$page) {
+  if (!isset($page['page_bottom']['admin_menu'])) {
+    return;
+  }
+  $path = drupal_get_path('module', 'admin_menu_toolbar');
+  $attached = &$page['page_bottom']['admin_menu']['#attached'];
+  $options = array('every_page' => TRUE);
+
+  $attached['css'][$path . '/admin_menu_toolbar.css'] = $options;
+  $attached['js'][$path . '/admin_menu_toolbar.js'] = $options;
+
+  // @todo Stop-gap fix until cached rendering is resolved.
+  // @see http://drupal.org/node/1567622
+  if (module_exists('shortcut')) {
+    $attached['css'][drupal_get_path('module', 'shortcut') . '/shortcut.css'] = $options;
+  }
+
+  $settings = array();
+  // Add current path to support menu item highlighting.
+  // @todo Compile real active trail here?
+  $args = explode('/', $_GET['q']);
+  if ($args[0] == 'admin' && !empty($args[1])) {
+    $settings['activeTrail'] = url($args[0] . '/' . $args[1]);
+  }
+  elseif (drupal_is_front_page()) {
+    $settings['activeTrail'] = url('<front>');
+  }
+
+  $attached['js'][] = array(
+    'data' => array('admin_menu' => array('toolbar' => $settings)),
+    'type' => 'setting',
+  );
+}
+
+/**
+ * Implements hook_admin_menu_output_build().
+ */
+function admin_menu_toolbar_admin_menu_output_build(&$content) {
+  if (empty($content['#components']['shortcut.links']) && !$content['#complete']) {
+    return;
+  }
+  // Add shortcuts toggle.
+  $content['shortcut-toggle'] = array(
+    '#access' => module_exists('shortcut'),
+    '#weight' => -200,
+    '#type' => 'link',
+    '#title' => t('Show shortcuts'),
+    '#href' => '',
+    '#options' => array(
+      'attributes' => array('class' => 'shortcut-toggle'),
+    ),
+  );
+
+  // Add shortcuts bar.
+  $content['shortcut'] = array(
+    '#access' => module_exists('shortcut'),
+    '#weight' => 200,
+    '#prefix' => '<div class="shortcut-toolbar">',
+    '#suffix' => '</div>',
+  );
+  $content['shortcut']['shortcuts'] = array(
+    // Shortcut module's CSS relies on Toolbar module's markup.
+    // @see http://drupal.org/node/1217038
+    '#prefix' => '<div id="toolbar">',
+    '#suffix' => '</div>',
+    // @todo Links may contain .active-trail classes.
+    '#pre_render' => array('shortcut_toolbar_pre_render'),
+  );
+}
+
+/**
+ * Implements hook_admin_menu_output_alter().
+ */
+function admin_menu_toolbar_admin_menu_output_alter(&$content) {
+  // Add a class to top-level items for styling.
+  if (isset($content['menu'])) {
+    foreach (element_children($content['menu']) as $link) {
+      $content['menu'][$link]['#attributes']['class'][] = 'admin-menu-toolbar-category';
+    }
+  }
+
+  // Alter icon.
+  if (isset($content['icon'])) {
+    unset($content['icon']['icon']['#theme']);
+    $content['icon']['icon']['#title'] = '<span>' . t('Home') . '</span>';
+    $content['icon']['icon']['#attributes']['class'][] = 'admin-menu-toolbar-category';
+  }
+
+  // Alter user account link.
+  if (isset($content['account'])) {
+    $content['account']['account']['#title'] = t('Hello <strong>@username</strong>', array('@username' => $content['account']['account']['#title']));
+    $content['account']['account']['#options']['html'] = TRUE;
+  }
+}
+
diff --git a/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/toolbar.png b/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/toolbar.png
new file mode 100644
index 00000000..f2c7f355
Binary files /dev/null and b/htmltest/sites/all/modules/admin_menu/admin_menu_toolbar/toolbar.png differ
diff --git a/htmltest/sites/all/modules/admin_menu/images/arrow-rtl.png b/htmltest/sites/all/modules/admin_menu/images/arrow-rtl.png
new file mode 100644
index 00000000..dccaad7f
Binary files /dev/null and b/htmltest/sites/all/modules/admin_menu/images/arrow-rtl.png differ
diff --git a/htmltest/sites/all/modules/admin_menu/images/arrow.png b/htmltest/sites/all/modules/admin_menu/images/arrow.png
new file mode 100644
index 00000000..3c3166ff
Binary files /dev/null and b/htmltest/sites/all/modules/admin_menu/images/arrow.png differ
diff --git a/htmltest/sites/all/modules/admin_menu/images/bkg-red.png b/htmltest/sites/all/modules/admin_menu/images/bkg-red.png
new file mode 100644
index 00000000..80647b0e
Binary files /dev/null and b/htmltest/sites/all/modules/admin_menu/images/bkg-red.png differ
diff --git a/htmltest/sites/all/modules/admin_menu/images/bkg.png b/htmltest/sites/all/modules/admin_menu/images/bkg.png
new file mode 100644
index 00000000..9de137bf
Binary files /dev/null and b/htmltest/sites/all/modules/admin_menu/images/bkg.png differ
diff --git a/htmltest/sites/all/modules/admin_menu/images/bkg_tab.png b/htmltest/sites/all/modules/admin_menu/images/bkg_tab.png
new file mode 100644
index 00000000..6ee3de0b
Binary files /dev/null and b/htmltest/sites/all/modules/admin_menu/images/bkg_tab.png differ
diff --git a/htmltest/sites/all/modules/admin_menu/images/icon_users.png b/htmltest/sites/all/modules/admin_menu/images/icon_users.png
new file mode 100644
index 00000000..0923fda0
Binary files /dev/null and b/htmltest/sites/all/modules/admin_menu/images/icon_users.png differ
diff --git a/htmltest/sites/all/modules/admin_menu/tests/admin_menu.test b/htmltest/sites/all/modules/admin_menu/tests/admin_menu.test
new file mode 100644
index 00000000..4b48c9ab
--- /dev/null
+++ b/htmltest/sites/all/modules/admin_menu/tests/admin_menu.test
@@ -0,0 +1,520 @@
+<?php
+
+/**
+ * @file
+ * Tests for the Administration menu module.
+ */
+
+/**
+ * Base class for all administration menu web test cases.
+ */
+class AdminMenuWebTestCase extends DrupalWebTestCase {
+  protected $profile = 'testing';
+
+  protected $basePermissions = array(
+    'system' => 'access administration pages',
+    'admin_menu' => 'access administration menu',
+  );
+
+  function setUp() {
+    // Enable admin menu module and any other modules.
+    $modules = func_get_args();
+    $modules = isset($modules[0]) ? $modules[0] : $modules;
+    $modules[] = 'admin_menu';
+    parent::setUp($modules);
+
+    // Disable client-side caching.
+    variable_set('admin_menu_cache_client', FALSE);
+    // Disable Clean URLs to ensure drupal.org testbot compatibility.
+    variable_set('clean_url', 0);
+  }
+
+  /**
+   * Check that an element exists in HTML markup.
+   *
+   * @param $xpath
+   *   An XPath expression.
+   * @param array $arguments
+   *   (optional) An associative array of XPath replacement tokens to pass to
+   *   DrupalWebTestCase::buildXPathQuery().
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   *
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertElementByXPath($xpath, array $arguments = array(), $message, $group = 'Other') {
+    $elements = $this->xpath($xpath, $arguments);
+    return $this->assertTrue(!empty($elements[0]), $message, $group);
+  }
+
+  /**
+   * Check that an element does not exist in HTML markup.
+   *
+   * @param $xpath
+   *   An XPath expression.
+   * @param array $arguments
+   *   (optional) An associative array of XPath replacement tokens to pass to
+   *   DrupalWebTestCase::buildXPathQuery().
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   *
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertNoElementByXPath($xpath, array $arguments = array(), $message, $group = 'Other') {
+    $elements = $this->xpath($xpath, $arguments);
+    return $this->assertTrue(empty($elements), $message, $group);
+  }
+
+  /**
+   * Asserts that links appear in the menu in a specified trail.
+   *
+   * @param array $trail
+   *   A list of menu link titles to assert in the menu.
+   */
+  protected function assertLinkTrailByTitle(array $trail) {
+    $xpath = array();
+    $args = array();
+    $message = '';
+    foreach ($trail as $i => $title) {
+      $xpath[] = '/li/a[text()=:title' . $i . ']';
+      $args[':title' . $i] = $title;
+      $message .= ($i ? ' » ' : '') . check_plain($title);
+    }
+    $xpath = '//div[@id="admin-menu"]/div/ul' . implode('/parent::li/ul', $xpath);
+    $this->assertElementByXPath($xpath, $args, $message . ' link found.');
+  }
+
+  /**
+   * Asserts that no link appears in the menu for a specified trail.
+   *
+   * @param array $trail
+   *   A list of menu link titles to assert in the menu.
+   */
+  protected function assertNoLinkTrailByTitle(array $trail) {
+    $xpath = array();
+    $args = array();
+    $message = '';
+    foreach ($trail as $i => $title) {
+      $xpath[] = '/li/a[text()=:title' . $i . ']';
+      $args[':title' . $i] = $title;
+      $message .= ($i ? ' » ' : '') . check_plain($title);
+    }
+    $xpath = '//div[@id="admin-menu"]/div/ul' . implode('/parent::li/ul', $xpath);
+    $this->assertNoElementByXPath($xpath, $args, $message . ' link not found.');
+  }
+}
+
+/**
+ * Tests menu links depending on user permissions.
+ */
+class AdminMenuPermissionsTestCase extends AdminMenuWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Menu link access permissions',
+      'description' => 'Tests appearance of menu links depending on user permissions.',
+      'group' => 'Administration menu',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('node'));
+  }
+
+  /**
+   * Test that the links are added to the page (no JS testing).
+   */
+  function testPermissions() {
+    module_enable(array('contact'));
+    $this->resetAll();
+
+    // Anonymous users should not see the menu.
+    $this->drupalGet('');
+    $this->assertNoElementByXPath('//div[@id="admin-menu"]', array(), t('Administration menu not found.'));
+
+    // Create a user who
+    // - can access content overview
+    // - cannot access drupal.org links
+    // - cannot administer Contact module
+    $permissions = $this->basePermissions + array(
+      'access content overview',
+    );
+    $admin_user = $this->drupalCreateUser($permissions);
+    $this->drupalLogin($admin_user);
+
+    // Check that the user can see the admin links, but not the drupal links.
+    $this->assertElementByXPath('//div[@id="admin-menu"]', array(), 'Administration menu found.');
+    $this->assertElementByXPath('//div[@id="admin-menu"]//a[contains(@href, :path)]', array(':path' => 'admin/content'), 'Content link found.');
+    $this->assertNoElementByXPath('//div[@id="admin-menu"]//a[@href=:path]', array(':path' => 'http://drupal.org'), 'Icon » Drupal.org link not found.');
+    $this->assertNoElementByXPath('//div[@id="admin-menu"]//a[contains(@href, :path)]', array(':path' => 'admin/structure/contact'), 'Structure » Contact link not found.');
+
+    // Create a user "reversed" to the above; i.e., who
+    // - cannot access content overview
+    // - can access drupal.org links
+    // - can administer Contact module
+    $permissions = $this->basePermissions + array(
+      'display drupal links',
+      'administer contact forms',
+    );
+    $admin_user2 = $this->drupalCreateUser($permissions);
+    $this->drupalLogin($admin_user2);
+    $this->assertElementByXPath('//div[@id="admin-menu"]', array(), 'Administration menu found.');
+    $this->assertNoElementByXPath('//div[@id="admin-menu"]//a[contains(@href, :path)]', array(':path' => 'admin/content'), 'Content link not found.');
+    $this->assertElementByXPath('//div[@id="admin-menu"]//a[@href=:path]', array(':path' => 'http://drupal.org'), 'Icon » Drupal.org link found.');
+    $this->assertElementByXPath('//div[@id="admin-menu"]//a[contains(@href, :path)]', array(':path' => 'admin/structure/contact'), 'Structure » Contact link found.');
+  }
+
+  /**
+   * Tests handling of links pointing to category/overview pages.
+   */
+  function testCategories() {
+    // Create a user with minimum permissions.
+    $admin_user = $this->drupalCreateUser($this->basePermissions);
+    $this->drupalLogin($admin_user);
+
+    // Verify that no category links appear.
+    $this->assertNoLinkTrailByTitle(array(t('Structure')));
+    $this->assertNoLinkTrailByTitle(array(t('Configuration')));
+
+    // Create a user with access to one configuration category.
+    $permissions = $this->basePermissions + array(
+      'administer users',
+    );
+    $admin_user = $this->drupalCreateUser($permissions);
+    $this->drupalLogin($admin_user);
+
+    // Verify that only expected category links appear.
+    $this->assertNoLinkTrailByTitle(array(t('Structure')));
+    $this->assertLinkTrailByTitle(array(t('People')));
+    $this->assertLinkTrailByTitle(array(t('Configuration')));
+    $this->assertLinkTrailByTitle(array(t('Configuration'), t('People')));
+    // Random picks are sufficient.
+    $this->assertNoLinkTrailByTitle(array(t('Configuration'), t('Media')));
+    $this->assertNoLinkTrailByTitle(array(t('Configuration'), t('System')));
+  }
+
+  /**
+   * Tests that user role and permission changes are properly taken up.
+   */
+  function testPermissionChanges() {
+    // Create a user who is able to change permissions.
+    $permissions = $this->basePermissions + array(
+      'administer permissions',
+    );
+    $admin_user = $this->drupalCreateUser($permissions);
+    $this->drupalLogin($admin_user);
+
+    // Extract the user role ID that was created for above permissions.
+    $rid = key(array_diff_key($admin_user->roles, array(DRUPAL_AUTHENTICATED_RID => 0)));
+
+    // Verify that Configuration does not appear.
+    $this->assertNoLinkTrailByTitle(array(t('Configuration')));
+    // Grant the 'administer site configuration' permission to ourselves.
+    $edit = array(
+      $rid . '[administer site configuration]' => TRUE,
+    );
+    $this->drupalPost('admin/people/permissions', $edit, t('Save permissions'));
+    // Verify that Configuration appears.
+    $this->assertLinkTrailByTitle(array(t('Configuration')));
+
+    // Verify that Structure » Content types does not appear.
+    $this->assertNoLinkTrailByTitle(array(t('Structure'), t('Content types')));
+    // Create a new role.
+    $edit = array(
+      'name' => 'test',
+    );
+    $this->drupalPost('admin/people/permissions/roles', $edit, t('Add role'));
+    // It should be safe to assume that the new role gets the next ID.
+    $test_rid = $rid + 1;
+    // Grant the 'administer content types' permission for the role.
+    $edit = array(
+      $test_rid . '[administer content types]' => TRUE,
+    );
+    $this->drupalPost('admin/people/permissions/' . $test_rid, $edit, t('Save permissions'));
+    // Verify that Structure » Content types does not appear.
+    $this->assertNoLinkTrailByTitle(array(t('Structure'), t('Content types')));
+
+    // Assign the role to ourselves.
+    $edit = array(
+      'roles[' . $test_rid . ']' => TRUE,
+    );
+    $this->drupalPost('user/' . $admin_user->uid . '/edit', $edit, t('Save'));
+    // Verify that Structure » Content types appears.
+    $this->assertLinkTrailByTitle(array(t('Structure'), t('Content types')));
+
+    // Delete the role.
+    $this->drupalPost('admin/people/permissions/roles/edit/' . $test_rid, array(), t('Delete role'));
+    $this->drupalPost(NULL, array(), t('Delete'));
+    // Verify that Structure » Content types does not appear.
+    $this->assertNoLinkTrailByTitle(array(t('Structure'), t('Content types')));
+  }
+}
+
+/**
+ * Tests appearance, localization, and escaping of dynamic links.
+ */
+class AdminMenuDynamicLinksTestCase extends AdminMenuWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Dynamic links',
+      'description' => 'Tests appearance, localization, and escaping of dynamic links.',
+      'group' => 'Administration menu',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('node'));
+  }
+
+  /**
+   * Tests node type links.
+   */
+  function testNode() {
+    $type = $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article'));
+    // Create a content-type with special characters.
+    $type = $this->drupalCreateContentType(array('type' => 'special', 'name' => 'Cool & Special'));
+
+    $permissions = $this->basePermissions + array(
+      'administer content types',
+      'create article content',
+      'create special content',
+    );
+    $this->admin_user = $this->drupalCreateUser($permissions);
+    $this->drupalLogin($this->admin_user);
+
+    // Verify that dynamic links are displayed.
+    $this->drupalGet('');
+    $this->assertElementByXPath('//div[@id="admin-menu"]', array(), t('Administration menu found.'));
+    $this->assertElementByXPath('//div[@id="admin-menu"]//a[contains(@href, :path)]', array(':path' => 'admin/structure/types'), "Structure » Content types link found.");
+
+    // Verify link title output escaping.
+    $this->assertNoRaw('Cool & Special');
+    $this->assertRaw(check_plain('Cool & Special'));
+
+    // Verify Manage content type links.
+    $links = array(
+      'admin/structure/types/manage/article' => 'Article',
+      'admin/structure/types/manage/special' => 'Cool & Special',
+    );
+    foreach ($links as $path => $title) {
+      $this->assertElementByXPath('//div[@id="admin-menu"]//a[contains(@href, :path) and text()=:title]', array(
+        ':path' => $path,
+        ':title' => $title,
+      ), "Structure » Content types » $title link found.");
+    }
+
+    // Verify Add content links.
+    $links = array(
+      'node/add/article' => 'Article',
+      'node/add/special' => 'Cool & Special',
+    );
+    foreach ($links as $path => $title) {
+      $this->assertElementByXPath('//div[@id="admin-menu"]//a[contains(@href, :path) and text()=:title]', array(
+        ':path' => $path,
+        ':title' => $title,
+      ), "Add content » $title link found.");
+    }
+  }
+
+  /**
+   * Tests Add content links.
+   */
+  function testNodeAdd() {
+    $type = $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article'));
+
+    // Verify that "Add content" does not appear for unprivileged users.
+    $permissions = $this->basePermissions + array(
+      'access content',
+    );
+    $this->web_user = $this->drupalCreateUser($permissions);
+    $this->drupalLogin($this->web_user);
+    $this->assertNoText(t('Add content'));
+
+    // Verify "Add content" appears below "Content" for administrative users.
+    $permissions = $this->basePermissions + array(
+      'access content overview',
+      'access content',
+      'create article content',
+    );
+    $this->admin_user = $this->drupalCreateUser($permissions);
+    $this->drupalLogin($this->admin_user);
+    $this->assertLinkTrailByTitle(array(
+      t('Content'),
+      t('Add content'),
+    ));
+
+    // Verify "Add content" appears on the top-level for regular users.
+    $permissions = $this->basePermissions + array(
+      'access content',
+      'create article content',
+    );
+    $this->web_user = $this->drupalCreateUser($permissions);
+    $this->drupalLogin($this->web_user);
+    $this->assertLinkTrailByTitle(array(
+      t('Add content'),
+    ));
+  }
+}
+
+/**
+ * Tests appearance of different types of links.
+ */
+class AdminMenuLinkTypesTestCase extends AdminMenuWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Link types',
+      'description' => 'Tests appearance of different types of links.',
+      'group' => 'Administration menu',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('help'));
+
+    $permissions = module_invoke_all('permission');
+    $permissions = array_keys($permissions);
+    $this->admin_user = $this->drupalCreateUser($permissions);
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Tests appearance of different router item link types.
+   */
+  function testLinkTypes() {
+    // Verify that MENU_NORMAL_ITEMs appear.
+    $this->assertLinkTrailByTitle(array(
+      t('Configuration'),
+      t('System'),
+      t('Site information'),
+    ));
+
+    // Verify that MENU_LOCAL_TASKs appear.
+    $this->assertLinkTrailByTitle(array(t('People'), t('Permissions')));
+    $this->assertLinkTrailByTitle(array(t('Appearance'), t('Settings')));
+    $this->assertLinkTrailByTitle(array(t('Modules'), t('Uninstall')));
+
+    // Verify that MENU_LOCAL_ACTIONs appear.
+    $this->assertLinkTrailByTitle(array(
+      t('People'),
+      t('Add user'),
+    ));
+
+    // Verify that MENU_DEFAULT_LOCAL_TASKs do NOT appear.
+    $this->assertNoLinkTrailByTitle(array(t('Modules'), t('List')));
+    $this->assertNoLinkTrailByTitle(array(t('People'), t('List')));
+    $this->assertNoLinkTrailByTitle(array(t('People'), t('Permissions'), t('Permissions')));
+    $this->assertNoLinkTrailByTitle(array(t('Appearance'), t('List')));
+
+    // Verify that MENU_VISIBLE_IN_BREADCRUMB items (exact type) do NOT appear.
+    $this->assertNoLinkTrailByTitle(array(t('Modules'), t('Uninstall'), t('Uninstall')));
+    $this->assertNoLinkTrailByTitle(array(t('Help'), 'admin_menu'));
+
+    // Verify that special "Index" link appears below icon.
+    $this->assertElementByXPath('//div[@id="admin-menu"]//a[contains(@href, :path) and text()=:title]', array(
+      ':path' => 'admin/index',
+      ':title' => t('Index'),
+    ), "Icon » Index link found.");
+  }
+}
+
+/**
+ * Tests customized menu links.
+ */
+class AdminMenuCustomizedTestCase extends AdminMenuWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Customized links',
+      'description' => 'Tests customized menu links.',
+      'group' => 'Administration menu',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('menu'));
+
+    $this->admin_user = $this->drupalCreateUser($this->basePermissions + array(
+      'administer menu',
+    ));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Test disabled custom links.
+   */
+  function testCustomDisabled() {
+    $type = $this->drupalCreateContentType();
+    $node = $this->drupalCreateNode(array('type' => $type->type));
+    $text = $this->randomName();
+    $xpath = $this->buildXPathQuery('//div[@id=:id]//a[contains(text(), :text)]', array(
+      ':id' => 'admin-menu',
+      ':text' => $text,
+    ));
+
+    // Verify that the link does not appear in the menu.
+    $this->drupalGet('node');
+    $elements = $this->xpath($xpath);
+    $this->assertFalse($elements, 'Custom link not found.');
+
+    // Add a custom link to the node to the menu.
+    $edit = array(
+      'link_path' => 'node/' . $node->nid,
+      'link_title' => $text,
+      'parent' => 'management:' . $this->queryMlidByPath('admin'),
+    );
+    $this->drupalPost('admin/structure/menu/manage/management/add', $edit, t('Save'));
+
+    // Verify that the link appears in the menu.
+    $this->drupalGet('node');
+    $elements = $this->xpath($xpath);
+    $this->assertTrue($elements, 'Custom link found.');
+
+    // Disable the link.
+    $edit = array(
+      'enabled' => FALSE,
+    );
+    $this->drupalPost('admin/structure/menu/item/' . $this->queryMlidByPath('node/' . $node->nid) . '/edit', $edit, t('Save'));
+
+    // Verify that the disabled link does not appear in the menu.
+    $this->drupalGet('node');
+    $elements = $this->xpath($xpath);
+    $this->assertFalse($elements, 'Disabled custom link not found.');
+  }
+
+  /**
+   * Tests external links.
+   */
+  function testCustomExternal() {
+    // Add a custom link to the node to the menu.
+    $edit = array(
+      'link_path' => 'http://example.com',
+      'link_title' => 'Example',
+      'parent' => 'management:' . $this->queryMlidByPath('admin'),
+    );
+    $this->drupalPost('admin/structure/menu/manage/management/add', $edit, t('Save'));
+
+    // Verify that the link appears in the menu.
+    $this->drupalGet('');
+    $elements = $this->xpath('//div[@id=:id]//a[@href=:href and contains(text(), :text)]', array(
+      ':id' => 'admin-menu',
+      ':href' => $edit['link_path'],
+      ':text' => $edit['link_title'],
+    ));
+    $this->assertTrue($elements, 'External link found.');
+  }
+
+  /**
+   * Returns the menu link ID for a given link path in the management menu.
+   */
+  protected function queryMlidByPath($path) {
+    return db_query('SELECT mlid FROM {menu_links} WHERE menu_name = :menu AND link_path = :path', array(
+      ':menu' => 'management',
+      ':path' => $path,
+    ))->fetchField();
+  }
+}
+
diff --git a/htmltest/sites/all/modules/advanced_forum/CHANGELOG.txt b/htmltest/sites/all/modules/advanced_forum/CHANGELOG.txt
new file mode 100644
index 00000000..b4fc9f13
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/CHANGELOG.txt
@@ -0,0 +1,1533 @@
+
+****************************** DRUPAL 7 - 2.x BRANCH ********************************
+
+July 07, 2013
+-------------
+7.x-2.3 RELEASE
+
+July 07, 2013
+-------------
+by troky: Code cleanup.
+Issue #2035217 by BertjeC: Reverting commit #5047fcb.
+
+July 04, 2013
+-------------
+7.x-2.2 RELEASE
+
+June 28, 2013
+-------------
+Issue #1948652 by EuroDomenii: Fixed wrong topics and posts count - removed recursive call.
+
+June 04, 2013
+-------------
+Issue #2011380 by pc-wurm: Fixed forum contextual links.
+
+May 20, 2013
+------------
+Issue #1998300 by inventlogic: Comment edit does not use the post_preview template file when previewing edited comments.
+
+May 07, 2013
+------------
+Issue #1946386 by troky: Fixed incorrect number of new replies when node has more revisions v2.
+
+May 04, 2013
+------------
+Issue #1982030 by rooby: Added labels to select fields on forum topic sort form.
+Issue #1975746 by troky: Fixed notice in advanced_forum_settings_page().
+
+March 19, 2013
+--------------
+Issue #1946386 by troky: Fixed incorrect number of new replies when node has more revisions.
+
+March 18, 2013
+--------------
+Issue #1941338 by troky: Fixed AF menu alteration. Changed forum/%forum_forum to forum/%advanced_forum_forum.
+
+March 17, 2013
+--------------
+Issue #1944162 by nsalyzyn: Added check for $view->style_plugin existance.
+
+March 07, 2013
+--------------
+Issue #1936476 by troky: Fixed query (added table reference) in advanced_forum_post_position()
+
+February 24, 2013
+-----------------
+by troky: Fixed forum topic preview display.
+Issue #720118 ny troky: Fixed forum hierarchy rendering on forum frontpage. Fixed subforum/subcontainer post count.
+by troky: Decreased forum description font size.
+Issue #1906536 by troky: Fixed forum styled comment numbering for non-forum nodes.
+
+February 20, 2013
+-----------------
+Issue #1921238 by regilero: Class attribute should be an array in comment_preprocess
+Issue #1635800 by troky: Removed anonymous/guest user count since it isn't supported by Drupal core.
+
+February 19, 2013
+-----------------
+7.x-2.1 RELEASE
+
+October 26, 2012
+----------------
+Issue #1817854 by troky: Fixed divide by zero in topic pager initialization.
+Issue #1823770 by GBurg: Added node type to topic icon template.
+
+October 23, 2012
+----------------
+Issue #1537826 by troky: Changed forum image detection mechanism.
+Issue #1812966 by troky: Fixed date format in theme.inc.
+Issue #1817854 by jakelitwicki: Fixed topic pager initialization.
+Issue #1730740 by troky: Fixed JavaScript error in IE8.
+
+October 18, 2012
+----------------
+Issue #1812966 by troky: Fixed theme variables in advanced_forum_preprocess_forum_submitted().
+
+September 25, 2012
+------------------
+Issue #1779000 by troky: Unset core forum menu_local_tasks_alter hook to prevent calling forum_forum_load().
+
+September 21, 2012
+------------------
+Issue #1775248 by dmitriytrt: Fixed breadcrumb generation for Page manager page.
+Issue #1783340 by troky: Returned $forums variable to forum-list template.
+
+August 28, 2012
+---------------
+Issue #418992 by troky: Fixed 'mark as read' function.
+
+August 24, 2012
+---------------
+by troky: Performance improvements as per http://drupal.org/node/145353
+
+August 12, 2012
+---------------
+Issue #1711680 by troky: Fixed Post reply button visible with no permissions to reply with Forum Access.
+
+August 11, 2012
+---------------
+Issue #1724080 by troky: Fixed wrong post position displayed in topic replies when comments displaed in threaded mode.
+by troky: Views re-exported to version 3.0.
+
+August 08, 2012
+---------------
+Issue #1705628 by Scyther: Update integration for Author Pane.
+Issue #1689236 by victoriachan: Fixed Undefined index: teaser in _template_preprocess_advanced_forum_topic_list_view().
+Issue #1719156 by clude: Fixed terms localization.
+
+July 16, 2012
+-------------
+Issue #1668740 by deviantintegral: Limit the count query to only node types that can actually be associated with the forum vocabulary.
+
+July 05, 2012
+-------------
+Issue #1121208 by vidu_ram: Added default configuration for collapsible container.
+Issue #962218 by troky: Changed strings to match core forum module.
+
+July 01, 2012
+-------------
+Issue #1635800 by troky: Redone online users count.
+
+June 29, 2012
+-------------
+Issue #1632260 by mcdruid, troky: Fixed performance issues with advanced_forum_statistics_replies.
+Issue #1617840 by liquidcms: Added forum term translation support.
+
+June 12, 2012
+-------------
+Issue #1621218 by sebcorbin: Fixed notices when non-forum associated content types are used.
+
+June 09, 2012
+-------------
+Issue #1621956 by samsouk: Added missing "topics per page" parameter to forum list view.
+
+June 02, 2012
+-------------
+Issue #210453 by troky: Added drop down list of forum hierarchy as template variable $forum_jump.
+
+June 01, 2012
+-------------
+Issue #1612710 by troky: Fixed new post icon css in Blue lagoon style.
+
+May 14, 2012
+------------
+Issue #1218894 by tomfriedhof: Removed Panels related conditional from Views preprocess function.
+Issue #1218894 by troky: Fixed advanced_forum_forum_disabled variable function in registry.
+
+May 13, 2012
+------------
+by troky: Panels adjusted and reexported.
+Issue #1212964 by troky: CTools plugins redone/updated to D7 with bugfixes.
+
+May 03, 2012
+------------
+Issue #1559340 by troky: Fixed notice while displaying orphaned forum shadow topic.
+
+March 31, 2012
+--------------
+Issue #1506628 by BTMash: Added [Content Type Name] button localization.
+
+March 19, 2012
+-----------------
+7.x-2.0 RELEASE
+
+March 01, 2012
+-----------------
+by troky: Fixed undefined variable introduced in previous patch.
+
+February 29, 2012
+-----------------
+Issue #1351392 by aidanlis: Added drupal_alter to advanced_forum_process_forum.
+
+February 11, 2012
+-----------------
+by troky: Code cleanup in advanced_forum_allowed_node_types()
+
+February 10, 2012
+-----------------
+Issue #1433566 by roderik: Reduce number of SQL queries on main forum page.
+
+February 06, 2012
+-----------------
+Issue #1429936 by GANYANCI: Removed leftover function dpm().
+
+January 22, 2012
+----------------
+Issue #1395164 by troky: Fixed hot icons don't show problem.
+
+January 21, 2012
+----------------
+Issue #1396428 by troky: Fixed strict warning in advanced_forum_preprocess_comment.inc.
+Issue #1309104 by mcdruid: Fixed table header text alignment.
+Issue #1115950 by sahunt83: Changed Cloudless Day base theme to Naked.
+
+December 24, 2011
+-----------------
+Issue #1369468 by mcdruid: Minor CSS fix.
+
+December 13, 2011
+-----------------
+Issue #1369468 by troky: Fixed the same class name is being used for the title 'Topics' and for the total number of topics
+Issue #1367808 by troky: Fixed duplication of div IDs for forum posts and comments.
+
+December 05, 2011
+-----------------
+7.x-2.0rc1 release
+
+December 04, 2011
+-----------------
+Issue #1339882 by troky: Fixed undefined index in in advanced_forum_links_alter().
+
+November 16, 2011
+-----------------
+Issue #1340512 by troky: Removed obsolete Signatures for forums code.
+Issue #1337470 by troky: Fixed Blue lagoon style.
+Issue #1337412 by salvis: Fixed hook_menu specifies access arguments but not access callback, so can break if something other than user_access is inherited as the callback.
+
+November 05, 2011
+-----------------
+7.x-2.0-BETA2 RELEASE
+Issue #1309966 by troky: Fixed panel initialization code.
+
+October 09, 2011
+------------------
+Issue #1303882 by cburschka: Fixed dangling </div> tag in forum list
+Issue #1298272 by heymjo: Fixed strict warning in advanced_forum_process_forum()
+
+October 01, 2011
+------------------
+Issue #1291556 by dloone: Fixed SQL exception when using "Mark all topics as read" when multiple revisions exist.
+
+September 25, 2011
+------------------
+Issue #1286696 by troky: Fixed default topic sort order.
+Issue #1286696 by troky: Changed default topic list sorting to desc (last_updated).
+Issue #1287512 by troky: Fixed topic list view to display 0 replies instead of empty string.
+
+September 17, 2011
+------------------
+Issue #1270710 by bxc, troky: Fixed error when AF doesn't include its files if Drupal installed in non-default folder.
+Issue #1280736 by Scyther: Fixed default value for advanced_forum_style variable.
+
+September 05, 2011
+------------------
+by troky: Fixed bugs in Panels and CTools plugins related code and re-exported panel handlers.
+by troky: Removed duplicate forum_node_create_links content from forum panel.
+
+September 01, 2011
+------------------
+7.x-2.0-BETA1 RELEASE
+
+August 12, 2011
+---------------
+Issue #1264676 by troky: Added Image module existance check on settings page.
+
+August 12, 2011
+---------------
+Issue #1109114 by troky: Fixed core template overrides.
+Issue #1254866 by troky: Added 'forum_description' template variable to forum topic list page.
+
+August 10, 2011
+---------------
+Issue #1243292 by troky: Added fallback to default style if current style doesnt exist anymore.
+
+July 11, 2011
+-------------
+Issue #1197940 by a.ross: Added forum image option (was taxonomy image in D6).
+Issue #1208128 by troky: Fixed permalink text when page is out of range.
+
+July 01, 2011
+-------------
+7.x-2.0-ALPHA2 RELEASE
+
+June 29, 2011
+-------------
+by troky: Views updated to 7.x-3.0-rc1.
+by troky: Removed all Nodecomment relaed code.
+
+June 22, 2011
+-------------
+Issue #1194792 by a.ross: Removed 3px margin between post header and post body.
+
+June 21, 2011
+-------------
+Issue #1194792 by a.ross: Changed .forum-post selector to div.forum-post to avoid some themes (bad) overrides.
+
+June 18, 2011
+-------------
+by troky: Fixed theme views search path again.
+by troky: Updated comment-wrapper.tpl
+
+June 17, 2011
+-------------
+by troky: Changed code to delete all related AF variables on uninstall.
+
+June 10,2011
+------------
+Issue #1182632 by troky: Added pager variable to topic header template.
+
+June 06,2011
+------------
+Issue #1154588 by troky: Removed 'User picture preset' option from settings page when Author Pane is not installed.
+by troky: Moved post-edited to template and removed theme function.
+by troky: Moved shadow-topic to template and removed theme function.
+
+June 05,2011
+------------
+Issue #1145852 by troky: Fixed permissions issue when upgraded from D6.
+by troky: Fixed hardcoded 'forums' vocabulary machine_name in views.
+Issue #1157054 by troky: Fixed bug in 'mark as read' code.
+
+June 04, 2011
+-------------
+by troky: Updated topic_list preprocess function: getting 'tid' usig arg() replaced by using menu_get_item() function.
+by troky: Fixed notice in views introduced by above patch.
+by troky: Moved topic-pager to template and removed theme function.
+
+June 02, 2011
+-------------
+by troky: Upgraded template_preprocess_advanced_forum_topic_list_view to Views 3.x
+
+May 31, 2011
+------------
+by troky: Fixed missing forum data when only container is displayed.
+by troky: Fixed theme views search path.
+
+May 30, 2011
+------------
+by troky: Fixed ignored comment wrapper template.
+by troky: Changed collapsible containers javascript code to allow any element as handle. Added 'collapsible' class to handle parent element, too.
+by troky: Added more (fragmented) variables for themers in advanced_forum_preprocess_forum_submitted.
+by troky: Added option to load/override AF views from theme folder.
+
+May 12, 2011
+------------
+by troky: Added new mark_as_read code.
+by troky: Removed unused views.
+
+May 08, 2011
+------------
+Issue #1150278 by troky: Fixed notice when statistics module is disabled.
+
+May 07, 2011
+------------
+by troky: Unanswered topics view rebuilt. Removed unnecessary columns and changed sort criteria to topic/post creation date because there is no sense sorting it by last comment time since there are no comments by definition.
+
+May 03, 2011
+------------
+Issue #1145852 by troky: Fixed topic-icon render code to display prober topic status.
+
+May 02, 2011
+------------
+Issue #1140636 by troky: Updated views and few view-related notices.
+
+April 28, 2011
+--------------
+Issue #1140636 by troky: Unanswered topics view rebuilt from scratch and re-exported. Fixed related code.
+
+April 12, 2011
+--------------
+Issue #1124116 by dereine: Fixed notice and updated Views fields render code in template preprocess function.
+
+April 07, 2011
+--------------
+Issue #1118822 by troky: Fixed Organic Groups view definition.
+
+April 03, 2011
+--------------
+Issue #1114334 by niklas: Added a configure link on the module page.
+
+March 31, 2011
+--------------
+Issue #1111218 by troky: Fixed notice when comment links missing.
+Issue #1111856 by troky: Removed "Last Post" button when there are no comments/replies.
+
+March 30, 2011
+--------------
+Issue #1109820 by troky: Fixed broken link to new posts in subforums.
+
+March 29, 2011
+--------------
+Issue #1109114 by troky: Fixed and improved styles and templates handling code.
+
+March 28, 2011
+--------------
+Issue #1105218 by troky: Fixed subcontainer theme rendering.
+
+March 25, 2011
+--------------
+Issue #1104832 by troky: Fixed hook_views_api() initialization and some other Views related stuff.
+
+March 24, 2011
+--------------
+Issue #1102510 by troky: Changed post_* and comment_* class names to match D7 core classes. Synced with commit #60bc64a.
+Issue #1044322 by rcurtin, Michelle: Fixed topic listing icon not showing new posts on brand new topics.
+Issue #1104314 by troky: Fixed problem with styling node types other than forum.
+
+March 22, 2011
+--------------
+Issue #1096090 by Michelle: Initialized items property of  to avoid notices when a container is empty. Undoing fix from #1088836.
+Issue #1100054 by troky: Fixed strict warning: Creating default object from empty value in _advanced_forum_preprocess_forum_list().
+
+March 20, 2011
+--------------
+#1098542 by lasac: Fixed IE javascript bug in collapsible containers code.
+#1088836 by troky: Fixed notices about undefined arrays in forum list preprocess.
+
+March 07, 2011
+--------------
+#291084 by Michelle: Moved collapsible containers option to correct fieldset.
+#291084 by troky: More JavaScript code cleanup.
+
+March 05, 2011
+--------------
+#720118 by Michelle, troky: Redid forum listing page to handle subcontainers and forums better. This required CSS changes that led to more changes and so there's more here than is strictly related to the issue including re-parenting Blue Lagoon to Naked.
+
+February 28, 2011
+-----------------
+#1074710 by troky: Fixed update schema.
+
+February 11, 2011
+----------------
+#1056710 by djjoshuad, troky: Fixed Panel handlers.
+
+February 10, 2011
+-----------------
+#291084 by troky: Added slide effect to collapsible containters. JavaScript code cleanup.
+
+February 06, 2011
+-----------------
+#868942 by Michelle: Changed forum-folder and forum-icon to forum-list-icon to reflect the fact that the icon is not necessarily a folder.
+#1012238 by Michelle: Removed undead boxy and boxy_stacked that came back to life.
+
+February 03, 2011
+-----------------
+#1041402 by troky: Fix css for forum table(s).
+
+February 02, 2011
+-----------------
+#1048606 by troky: Fixed missing title/link to the last post.
+
+February 01, 2011
+-----------------
+#1045200 by troky: Fixed 'reply_link' variable initialization in advanced_forum_preprocess_comment_wrapper().
+
+January 31, 2011
+----------------
+#1046436 by troky: Fixed duplicate comment text.
+
+January 29, 2011
+----------------
+#1044082 by troky: Fixed node templates to show all fields, not only body text.
+NOISSUE by troky: Fixed line breaks in template_preprocess_advanced_forum_topic_list_view.
+
+January 29, 2011
+----------------
+NOISSUE by troky: Fixed wrongly constructed query in advanced_forum_unread_replies_in_forum().
+#1042636 by troky: Fixed Forum Access module compatibility.
+
+January 28, 2011
+----------------
+#1042664 by troky: Fixed variable name mismatch in advanced_forum_statistics_replies().
+#1031712 by troky: Improved CSS to give structure to empty forums.
+#1041426 by __Sander__: Wrapped forum tools menu items in t().
+
+January 27, 2011
+----------------
+#1041128 by troky: Fixed PHP 5.3 strict warnings.
+#992428 by Michelle: Fixed mark as read so it's not displayed on containers.
+
+January 26, 2011
+----------------
+#935778 by troky, Michelle: Remove 'views' column when statistics not enabled.
+NOISSUE by Michelle: Removed topic icon from unsanswered view as it caused notices and served no purposes.
+#1031712 by Michelle: Gave structure to topic list empty view div to avoid layout issues when there are no topics in a forum.
+#1001524 by Michelle: Created content types for forum tools and node create list.
+#935322 / #1001524 by Michelle Got PM version in sync with non PM version.
+#1031712 by troky: Fixed parsing of advanced_forum_forum_disabled variable.
+#1040958 by troky: Fixed deleting all module variables in advanced_forum_uninstall()
+NOISSUE by troky: Fixed formatting of some files, mostly newline characters.
+NOISSUE by troky: Fixed 'Empty text' field in views definitions.
+
+January 24, 2011
+----------------
+NOISSUE by troky: Removed extra character from advanced_forum_group_topic_list.view.
+NOISSUE by troky: Fixed/changed default style to Silver Bells in settings.
+NOISSUE by troky: Added missing filter parameter to views definition. Updated unanswered topics view.
+#1023078 by troky: Fixed bunch of notices and undefined variable errors when previewing new topic.
+#1037724 by gordon: Moved Advanced forum configuration menu into configuration page.
+#291084 by troky: Added jquery.cookie dependency before including module javascript file.
+#1037752 by troky: Fixed notices for "forum/0" case.
+#1037722 by gordon: Added support for the core image module instead deprecated imagecache module.
+NOISSUE by troky: Removed duplicate view definition from advanced_forum_topic_list.view
+
+January 23, 2011
+----------------
+#1021826 by troky: Fixed missing comment form if "Show reply form on the same page as comments" set.
+#1036012 by troky: Fixed extra space in default style name.
+#1020190 by troky: Fixed undefined index from passing language into request for node's terms for multi-language site.
+#1030130 by troky: Fixed undefined index error in active_topics view.
+NOISSUE by troky: Re-exported common views (except those used by NC).
+#1023078 by troky: Fixed undefined variables in post preview.
+#291084 by troky: Updated collapsed containers code.
+
+January 21, 2011
+----------------
+NOISSUE by Michelle: Minor template changes to keep all three modules in synch. Synced to commit #479936.
+#654718 by Michelle: Check if Panels is enabled before trying to build the forum displays to avoid errors when Page Manager is used without Panels. Synced to commit #480122.
+#866562 by Michelle, vladgur: Don't show any create content links if Forum Access doesn't allow it. Synced to commit #480174.
+NOISSUE by troky: Added silver_bells_stacked. Synced to commit #480366.
+#1012238 by Michelle: Updated Cloudless Day with new style changes. Synced to commit #480414.
+#1012238 by Michelle: Made Silver Bells the default style. Synced to commit #480426.
+#982604 by Michelle: Made 'post-by-viewer' class work with caching. Synced to commit #482276.
+#1015118 by paolomainardi: Fixed hardcoded column span that was incompatable with taxonomy image. Synced to commit #482588.
+#291084 by WorldFallz, Michelle, troky: Added/ported collapsed containers patch.
+
+January 20, 2011
+----------------
+#1032750 by GStegemann: Fixed call to undefined function db_fetch_array().
+#1019196 by jonb_cirris: Fixed broken hook_permission(). Impossible to set permissions on D7 + AF.
+
+
+January 14, 2011
+----------------
+#1024626 by federico: Changed comments to comment to reflect change in table name in D7.
+
+January 5, 2011
+----------------
+#1015922 by troky: Initial Drupal 7 port. Serious Kudos to Troky ( http://drupal.org/user/1013060 ). He did _all_ the work on this port. The only part I had in it is a little clean up to sync with CVS. Thank you very much!
+
+
+
+
+****************************** DRUPAL 6 - 2.x BRANCH ********************************
+
+December 7, 2010
+----------------
+#974840 by Michelle: Fixed CSS / HTML so topic header links aren't floating around messily.
+#974840 by Michelle: Fiddled a bit more with the CSS.
+#933862 by Michelle: Added new permission to view post edited message and excluded it from the NC cache.
+#982604 by Michelle: Added core signatures to cache avoiding tokens. Impossible to do with SfF because it needs too much node info.
+
+December 4, 2010
+----------------
+#982238 by Michelle: Forced 'New topic' to first in list of node creation links.
+#982238 by Michelle: Added ability to get nodes allowed in a particular vocabulary and set up stub for per term.
+#974840 by Michelle: Redid 'Post reply' link handling.
+NOISSUE by Michelle: Created new theme function theme_advanced_forum_l() to centralize link printing and give themers more control.
+NOISSUE by Michelle: Expanded statistics to show last 5 new users.
+#868942 by Michelle: Fixed node links to only buttonize specific ones so it doesn't try to buttonize the tags.
+NOISSUE by Michelle: Lots of cleanup, fixing, re-arranging, simplifying code.
+#961050 by designerbrent: Made forum 'folder' CSS more specific to avoid themes overriding it.
+#869006 by carlthuringer, Michelle: Changed @ to ! in topic navigation t() to avoid a second run through check_plain.
+#829540 by Michelle: Added sanity check on teaser split removal to avoid edge case error.
+
+December 2, 2010
+----------------
+#935322 by Michelle: Fixed node add links being relative.
+#935322 by Michelle: Fixed unclosed 'a' causing wonkiness.
+NOISSUE by Michelle: Fixed missing t() on View Forums tab.
+#868942 by Michelle, WorldFallz: Added CSS for image-less button to boxy. More of an example than anything at this point as it's likely to be changed.
+#868942 by Michelle: Removed all language dependent button images.
+#868942 by Michelle: Added small AF buttons to boxy CSS only example and made the colors a bit better.
+
+November 17, 2010
+-----------------
+#559536 by troky, Michelle: Fixed $vars/$variables mixup in the topic list view include and removed the extra <br> from the last author field rewrite that had been compensating.
+#831364 by Michelle, Heine: Reverted changing form alter paramater to pass by value that shouldn't have been done.
+
+November 16, 2010
+-----------------
+NOISSUE by Michelle: Removed unneeded CSS left over from before Views was a dependency.
+#868942 by Michelle: Changed new content links to use divs instead of a link and added button code.
+#935322 by Michelle: Moved what was 'secondary links' into a 'forum tools' jump menu.
+#935322 by Michelle: Switched tabs to being on by default.
+#868942 by Michelle: Changed to new HTML for buttonized links, removed old CSS, and replaced with skeleton CSS.
+#868942 by Michelle: Added jump to top button to the list of buttonized links.
+
+November 14, 2010
+-----------------
+#933862 by Michelle: Restored compatability with the Comment Edited module that was inadvertantly lost.
+
+October 14, 2010
+----------------
+#868942 by Michelle: Redid image handling on pseudo buttons to use background image with actual text on top instead of image replacement.
+
+October 8, 2010
+---------------
+#933862 by Michelle: Added 'last edited' note based on node revisions. Changed Commented Edited integration to make use of new variable.
+NOISSUE by Michelle: Fixed missing print statement around unpublished post note.
+
+October 4, 2010
+---------------
+#905860 by Michelle: Ensure advanced_forum_get_forum_types returns an array()
+#876294 by RedKing: Updated French translation.
+NOISSUE by Michelle: Made submit button IDs more specific on searching. Tangently related to #883452.
+#883452 by rodrigoaguilera: Added a specific ID to the topic list sort form.
+NOISSUE by Michelle: Changed 'search' buttons to 'search forum' and 'search topic'.
+NOISSUE by Michelle: Added message about unpublished post to post template.
+NOISSUE by Michelle: Fixed bug with new comment jump link on topic not working with nodecomment.
+
+September 23, 2010
+------------------
+#376039 by Michelle with thanks to NowPublic for code reference: Added 'in reply to' for core comments.
+#376039 by Michelle with thanks to NowPublic for code reference: Added 'in reply to' for node comments.
+#913822 by Michelle, meustrus: Changed sorting so updates only bump on the New & My views.
+NOISSUE by Michelle: Many tweaks to the included views.
+NOISSUE by Michelle: Added setting to turn on local tabs for the stand alone included views.
+
+September 22, 2010
+------------------
+#829456 by Michelle, meustrus: Added Permalink integration.
+NOISSUE by Michelle: Cleaned up node and comment preprocessing including starting #1 at the node, fixing bad logic in the class collection, re-arranging in display order, and more.
+#525194 by Michelle: Removed Author Pane dependency.
+#751890 by Michelle: Missed removing advanced_forum.naked.topic-list.tpl.php when Views was made a dependency.
+#725720 by ltwinner: Added variable for reply link to node preprocess.
+
+September 21, 2010
+------------------
+#868550 by enzipher, szantog: Added missing brackets in query.
+#872294 by merlinofchaos, jeckman: Fixed query part of link for forum views so they can take multiple forum arguments.
+#857982 by aenw: Checked if $added is empty rather than !$added.
+#908938 by Michelle: Changed how check for node's being displayed as a teaser works.
+
+August 26, 2010
+-------------
+#850508 by Michelle: Updated Author Pane template.
+NOISSUE by Michelle: Author Pane tokenizing should not happen on topic starting node.
+
+July 11, 2010
+-------------
+#768348 by Michelle: Fixed node comment incompatability with new link alter.
+
+July 9, 2010
+------------
+#571114 by Michelle: Added ability to disable the breadcrumb setting by AF to avoid incompatibility with custom breadcrumbs.
+#848964 by vladgur: Fixed 'My posts' view which wasn't showing replies to a topic started by another user.
+
+July 8, 2010
+------------
+#768348 by Michelle: Moved node/comment link handling to hook_link and hook_link_alter.
+#547824 by Michelle: When deleting a node from the node links, it now goes back to the front page like in core.
+#757804 by G-son, Michelle: Added back in code for 'new' markers on replies when using core comments that was accidentially removed when making it compatable with node comments.
+#831364 by Michelle, smerrill: Removed & from form_state paramater in form_alter to make php 5.3 happy.
+#559536 by Michelle: Fixed notices.
+#751890 by Michelle: Removed legacy code that was replaced by Views.
+#736802 by Michelle: Organized code.
+
+July 5, 2010 - ALPHA 3
+------------
+#821744 by Michelle: Updated Author Pane integration to work with beta 1.
+#830102 by merlinofchaos: Added setting for 'Inject hierarchy of first term into breadcrumb trail' to forum page.
+#832286 by Scyther: Allow users to see a signature in an input format they don't have access to.
+
+May 27, 2010
+------------
+#787454 by berdir, mikey_p, merlinofchaos, and Michelle: Fixed error in SQL that caused new posts to be counted twice if revisions were on when the node was moved to another forum.
+#801260 by dereine: advanced_forum_statistics_replies performance improved.
+
+May 24, 2010
+------------
+#807742 by Michelle: Started work on documenting the templates.
+
+May 11, 2010
+------------
+#793020 by Michelle: Fixed issue with no-style-name template file not being found.
+#793664 by crea: Fixed Author Pane not showing on nodecomment reply preview.
+#622670 by neclimdul: Fixed clipped folder icons when no posts in forum.
+
+May 10, 2010
+------------
+#697234 by ericduran, nenne: Fixed issue with ampersand encoding in subforum list.
+#791956 by friolator: Fixed missing closing bracked on comment anchor.
+#583674 by Michelle: Confirmed and fixed regression with views column and 0 views.
+#755940 by Michelle: Removed (hopefully!) unneeded a id forum-reply-NNN and removed suspected bad copy/paste line.
+#769954 by Michelle, gege2061: Make sure there is a body field before trying to form alter it. Silly poll. :P
+
+March 24, 2010
+--------------
+#741902 by Michelle: Added "forum" as a default type to be styled if settings form has never been submitted.
+
+March 23, 2010
+--------------
+#687196 by iva2k, merlinofchaos, SupermanScott: Changed loading of views to use require instead of require once and use the view name instead of the filename.
+#492794 by Michelle: Now themes the node preview for forum nodes.
+#492794 by Michelle: Fixed issue where $node->teaser in manually loaded node prevented comment previews from being themed when on their own page.
+#751890 by Michelle: Made Views a dependency.
+#738074 by yaslama: Adapted version of the core patch on [#113611].
+#702128 by Michelle: Added checks for nodecomment around search views as well as link to my posts view in secondary links.
+#692900 by Michelle, marcus0263: Fixed regression with #forum-topic-top link.
+
+March 8, 2010
+-------------
+#736798 by Michelle: Added setting that will switch on a default local task for the main forum listing.
+NOISSUE by Michelle: Split out fetching the mark read link as its own function to make it easier to use independent of the secondary links.
+NOISSUE by Michelle: Added CTools content type for mark read.
+
+January 14, 2010
+----------------
+#655128 by sanduhrs: Fixed missed closing bracket.
+#658706 by ssm2017 Binder: Added missing t().
+
+November 16, 2009
+-----------------
+NOISSUE by Michelle: Small fixes to make nodecomment previews work better.
+
+November 9, 2009 -- ALPHA 2
+-----------------
+#627808 by Michelle: Account for insconsistancy in nodecomment's handling of the comment anchor link.
+
+October 25, 2009
+-----------------
+#492794 by Michelle: Rewrote code that determines what AF applies a style to.
+#586652 by Michelle: Removed modification to $submitted.
+
+October 21, 2009
+-----------------
+#568422 by Michelle: Removed 'My topics' view and made 'My posts' much better.
+#568422 by Michelle: Made 'My posts' view use forum topic list style
+
+September 6, 2009
+-----------------
+#561448 by Michelle: Fixed problem with active forum topics topic titles not linking.
+#542998 by Michelle: Moved user picture handling to Author Pane.
+
+September 3, 2009
+-----------------
+#561448 by Michelle: Cleaned up all the views except user topics/posts and the searches.
+
+August 28, 2009
+---------------
+#510772 by Michelle: Added form alter so AF's OG topics view can be used as a group's RON.
+#561448 by Michelle: Made unanswered topics view make more sense.
+
+August 27, 2009
+---------------
+#545590 by Michelle: Removed dependency in CSS on markup being within a #forum div.
+
+August 24, 2009
+---------------
+#538344 by merlinofchaos: Added view of a user's topics.
+#537822 by Michelle, stephthegeek: Added forum-topic-title class to title in topic listing. Also fixed spacing on items in topic listing.
+
+August 22, 2009
+---------------
+#551548 by Michelle, crea: Added check to make sure links array isn't empty before iterating through it.
+#537018 by bas.hr: Removed typo extra . in class name.
+
+August 10, 2009
+---------------
+NOISSUE by merlinofchaos: Add a sort widget for the forum topic list that utilizes the tablesort headers.
+NOISSUE by merlinofchaos: Add a time period plus role exclusion to the most active poster pane.
+
+August 3, 2009
+--------------
+NOISSUE by merlinofchaos: Add a "most active poster" block and a view of "My forum posts" to easily follow what a person has posted.
+
+August 2, 2009
+--------------
+NOISSUE by Michelle: Fixed notices.
+#413494 by Michelle, snufkin: Added support for commend edited message in the post template.
+#479124 by Michelle: Merged some topic list preprocessing into advanced_forum_get_topics and cleaned up topic list when views is not enabled.
+
+August 1, 2009
+--------------
+#528480 by Michelle: Added extra divs around topics / latest user on statistics for seperate styling.
+#436084 by MGParisi: Reduced size of some Blue Lagoon images.
+#537018 by Michelle: Indented subbody of statistics in Naked and removed indenting from Boxy/Cloudless Day
+#537018 by Michelle: Added a margin to the right of the post reply button on top of topics to Naked.
+                     Put padding around .forum-post-content and .forum-post-title in Naked.
+                     Added boxes around .forum-top-post-footer and .forum-topic-navigation in Boxy.
+                     Made post number white on Boxy and Blue Lagoon.
+                     Added odd/even table shading to Boxy as well as borders around the TDs.
+#537018 by Michelle: Added span around 'subforums' label so it can be styled.
+                     Made .forum-table a generic class for both types of tables and added .forum-table-forums and .forum-table-topics.
+                     Made classes in forum tables more specific.
+#518110 by Michelle: Documented the chunk of code in the post .tpl there to keep the new markers from being cached.
+
+July 31, 2009
+-------------
+#524592 by Dave Reid: Added email to fake user object sent to Author Pane on comments for anon users.
+#534816 by Michelle: Made sure all classes / IDs were forum specific.
+NOISSUE by Michelle: Added a page preprocess to add a variable "forum_page" when a page is either the main forum/ pages or a node that can go in the forums.
+#497450 by Michelle: Fixed not working image replacement on node links.
+#537018 by Michelle: Made Cloudless Day Stacked the default style since it's the nicest one.
+
+July 30, 2009
+-------------
+#525206 by Michelle: Fixed error with search results template not being found.
+#531572 by Michelle: Fixed error that caused incorrect 'new posts' amounts on forum overview.
+#267859 by Michelle: Bypassed core forum list preprocess to avoid running forum title thru check_plain twice and also remove redundant code.
+#502466 by neclimdul: Mark as read improvements.
+
+July 29, 2009
+-------------
+#510772 by Michelle: Added group topic list view and outer template.
+#534816 by Michelle: Changed top anchor to forum-topic-top to avoid conflicts with some themes.
+#527020 by merlinofchaos: Panelize advanced forum. This introduces a "task" or a system page
+                          for Panels for the forum page. It introduces 3 default handlers
+                          for that page which cover the top page, a forum container page
+                          and a forum topic list page. It includes a bunch of panels/ctools
+                          plugins in order to cover all this content and makes it possible
+                          to change the layout and easily add/remove content to these pages.
+#533818 by merlinofchaos: Allow styles to use preprocesses.
+
+July 28, 2009
+-------------
+#520758 by merlinofchaos: Allow forums not in containers to have a fake container so they still render okay.
+
+July 23, 2009
+-------------
+#497450 by Michelle: More work on the text replacement images.
+
+July 21, 2009
+-------------
+#523422 by Michelle: Fixed wrong location variable name.
+
+July 20, 2009
+------------
+#523942 by Michelle: Normalized table widths on forum listing.
+#520694 by Michelle: Improved layout on narrow themes.
+NOISSUE by Michelle: Many small changes to styles, fixing layout, markup and style, making Naked nakeder, etc.
+#523958 by merlinofchaos: Added new style Cloudless Day.
+#525460 by Michelle, robertdjung: Removed extra slash from CSS path.
+#523958 by Michelle, merlinofchaos: Small change to sats borders in CD.
+
+July 15, 2009 -- ALPHA 1
+------------
+#276577 by Michelle: Added taxonomy image support for main forum listing.
+NOISSUE by Michelle: Lost adding in $node_classes / $comment_classes when I restructured the $classes variable. Putting that back.
+
+July 14, 2009
+------------
+#497450 by Michelle: Changed topic legend classes to match classes in topic icons themselves. The names aren't as clear but it's more consistant.
+#497450 by Michelle: Cleaned up and re-organized image css, including removing all images from Naked's CSS except forum folder / topic icons.
+NOISSUE by Michelle: Cleaned up Author Pane of stacked styles.
+NOISSUE by Michelle: More cleaning up of blue lagoon stacked. Also made it the default style since it looks most like modern forums.
+
+July 13, 2009
+------------
+#500988 by Michelle: Now works without nodecomment.
+#500988 by Michelle: Some work on getting AF to work without NC.
+NOISSUE by Michelle: Various notice fixes.
+#497450 by Michelle: More work on Author Pane image conversion.
+#512222 by Michelle: Fixed typo preventing 'submitted' template from being found.
+#515966 by Michelle: Moved topic navigation out of node content and down to bottom of topic.
+NOISSUE by Michelle: Fixed post reply button incorrectly showing up at the bottom of topic when using nodecomment.
+NOISSUE by Michelle: Made the pager at the bottom of a topic look better in blue lagoon.
+#483544 by Michelle: Copied code from Nodecomment to remove the teaser splitter.
+NOISSUE by Michelle: Added functions to return node types that can be in a forum and tell if a given node type is in the forum.
+
+July 8, 2009
+------------
+#512222 by Michelle: Added in Naked as an automatic base theme for templates to avoid errors if a style does not include templates.
+#512222 by Michelle: Changed over to using style name in template files to avoid problems with styles defined by themes.
+
+July 5, 2009
+------------
+#383116 by Michelle: Added terms to post and added new top post footer to hold them.
+#268421 by Michelle: Added edit/delete links to nodes of types that can be in the forums. Thanks to nodecomment for some of the code.
+
+July 4, 2009
+------------
+NOISSUE by Michelle: Moved around the forum legend & link lists to reduce clutter and organize them better on the page.
+#509878 by Michelle: Fixed broken link on 'post reply' with help from marsilainen on IRC.
+NOISSUE by Michelle: Switched order of links div and search div to line them up better on the main forums page.
+#509716 by Michelle, merlinofchaos: Fixed problem with views not getting style applied.
+#497450 by Michelle: Made translated images work. Moved all images into new directories.
+NOISSUE by Michelle: Cleaned up the id/class printing on post template.
+#497450 by Michelle: Added the language class to the topic header and comment wrapper.
+
+July 3, 2009
+------------
+#497450 by Michelle: More fixes for link lists including some renaming and repositioning.
+#497450 by Michelle: Removed setting options for images since this is all handled via# CSS now.
+
+July 1, 2009
+------------
+#497450 by Michelle: Changed to a better image replacement technique that works if images are disabled.
+
+June 25, 2009
+-------------
+#497450 by Michelle: reply, edit, delete node links now working.
+#501616 by Michelle, neclimlap: Stripped the tags from the teaser for the title popup.
+#501616 by Michelle, neclimlap, merlinofchaos: More fixes for the title popup.
+#501616 by merlinofchaos, Michelle: Changed over to doing the whole popup in the view. Left old way in as an alternate.
+#502370 by neclimdul: E-ALL fixes.
+#470202 by tom_o_t, merlinofchaos: Changed mark all read to look at node changed instead of node created to fix weird edge cases.
+
+June 24, 2009
+-------------
+NOISSUE by merlinofchaos: Made blue lagoon pager smaller and italic.
+#500978 by Michelle: Got topic list icons working. The reports of their functionality have been greatly exaggerated.
+NOISSUE by Michelle: Put the functions in theme.inc into a more logical order so I can find things.
+#497450 by Michelle: Changed how forum links are handled. Split core links and added links into two and removed theme_links from reply button.
+#497450 by Michelle: More work on the image replacement. Node links are still not right.
+#290327 by merlinofchaos:  Add "active topics" view (only for all forums), add "Forum" column to unread, unanswered and active views, and make unread only visible to logged in users.
+
+June 23, 2009
+-------------
+#497450 by Michelle: Images on the forum list page converted to CSS.
+#497450 by Michelle: Topic list page images converted.
+NOISSUE by merlinofchaos: Fix a bug causing Views to think default Views are in the database.
+#290327 by merlinofchaos: Add views and links for unread and unanswered posts
+NOISSUE by merlinofchaos: pager on top and bottom of topic list view
+
+June 22, 2009
+-------------
+#497474 by Michelle: Rewrite of the style system that adds a dependency on CTools as well as substyles. Adjusted all included styles to take advantage of that.
+
+June 21, 2009
+-------------
+#219549 by Michelle: Made subforum list generation into a theme function.
+NOISSUE by Michelle: Small style fixes.
+
+June 20, 2009
+-------------
+#303544 by Michelle: Added popup preview of post in topic list.
+#462502 by Michelle: Seperated each container on the forum list into its own table.
+#219549 by Michelle: Moved subforums into comma seperated list.
+#312958 by Michelle: Show container description on container pages.
+
+June 18, 2009
+-------------
+#484052 by merlinofchaos: Made forum topic list view work with new forum topic list style and also added sticky and shadow post changes.
+#484052 by Michelle: Fixed up the topic list pager & the #new.
+#484052 by Michelle: Moved topic list view preprocess to its own .inc
+#484052 by Michelle: Improved shadow topics including adding a new theme function for them.
+#484052 by Michelle: Added "Sticky:" label and changed background color.
+
+June 17, 2009
+-------------
+#494642 by merlinofchaos: Integrate better with new Views post rendering
+NOISSUE by merlinofchaos, Michelle: Fixed two typos with _advanced_forum_preprocess_forum_topic_list.
+#474552 by webchick: Default forum menu link to enabled.
+
+June 16, 2009
+-------------
+#492922 by conchur: Fixed typo in comment preprocess.
+
+June 15, 2009
+-------------
+#489044 by Michelle: Split code up into smaller files both to reduce memory requirements and to make it easier to navigate the code.
+#491692 by neclimdul: Removed typo'd backslash.
+#472736 by Michelle, merlinofchaos: Made jump to last post work with nodecomment.
+NOISSUE by Michelle: Code clean up, more comments added.
+#472736 by Michelle: Made topic icon recognize new posts in nodecomment.
+NOISSUE by Michelle: Added update to set AF's weight to 15. This is needed for the views to work and was missed on earlier commits.
+#492590 by merlinofchaos: Wrench comment wrapper back from the clutches of the evil Garland.
+#483408 by neclimdul: Notices cleanup.
+
+June 14, 2009
+-------------
+#484052 by Michelle: Prevent original topic list page from being created when views is enabled.
+
+June 9, 2009
+------------
+#484052 by Michelle, merlinofchaos: Created view for topic lists.
+#484052 by Michelle: Added topic pager.
+
+June 8, 2009
+------------
+NOISSUE by Michelle: Some cleanup on the node/comment preprocesses.
+#472736 by Michelle, merlinofchaos: Made "new posts in forum" work with nodecomment and also made comment version more efficient.
+
+June 7, 2009
+------------
+#460734 by MGParisi: Removed typo'd extra space.
+#473336 by Michelle: Changed to custom version of comment_new_page_count to make it easier to use the NC version when it is ready.
+
+June 5, 2009
+------------
+#481278 by merlinofchaos: Added search views to forums and individual topics.
+
+June 4, 2009
+------------
+#473336 by Michelle: Made post count in statistics work with nodecomment and also added caching.
+
+June 3, 2009
+------------
+#473336 by Michelle: Made post topic button on top/bottom work properly.
+
+June 1, 2009
+------------
+#473336 by Michelle, merlinofchaos: Made new replies counting compatable with nodecomment.
+#472736 by Michelle: Recognize nodecomment reply posts as "comments".
+
+May 29, 2009 -- START OF 2.x BRANCH
+------------
+NOISSUE by Michelle: Synched up with changes made to 1.x since branching.
+NOISSUE by Michelle: Renamed templates and other instances of advf- and advforum to use the proper name.
+
+April 4, 2009
+-------------
+#422652 by NeoID: Closed tag on break in advanced_forum-forum-legend.tpl.php
+
+March 31, 2009 -- 6.x-1.0
+--------------
+#419782 by Michelle: Fixed wording on time ago/actual date option as it was backwards.
+
+March 30, 2009
+--------------
+#412906 by Michelle: Fixed typo in the author pane template and cleaned up comments.
+
+March 21, 2009
+--------------
+#402352 by Michelle: Removed logic to print user title image. Variable is still there.
+#408006, #397860 by Michelle: Changed online/offline default to be small icon plus words.
+#365578 by joostvdl: Added ability to have language specific image directories.
+
+March 4, 2009
+-------------
+#384180 by Michelle: Switched file format to UTF-8 [This failed to update in CVS]
+#373371 by Michelle: Synched up Author Pane template and updated CSS for Author Pane.
+
+March 3, 2009 -- RC 3
+-------------
+#375187 by nbz: Fixed switched variable name that caused fallback to Garland rather than the default theme.
+#388504 by pebosi: Updated German translation.
+
+February 26, 2009
+-----------------
+NOISSUE by Michelle: Fleshed out the readme.txt file more.
+#373371 by Michelle: Syncing up Author Pane.
+
+February 25, 2009 -- RC 2
+-----------------
+#375187 by Michelle: Fall back to default site theme when $theme not set.
+#374009 by rastatt@drupal.org: Updated German translation.
+#260397 by BlackNexus: Updated Spanish translation.
+#256174 by seals: Updated Swedish translation.
+
+February 20, 2009
+-----------------
+#376540 by Michelle: Passed all image file names through t() to make them translatable as suggested by klavs.
+
+February 11, 2009 -- RC 1
+----------------
+#303548 by Michelle: Added default avatar support to custom user picture function and also linked to profile.
+#361407 by black silence: Updated German translation.
+#310547 by Michelle: Organized and cleaned up settings page.
+
+February 9, 2009
+----------------
+#370422 by Michelle, merlinofchaos: Hopefully the last fix to get around path_to_theme's flakiness.
+#371859 by lamigo: Fixed postgress error.
+
+February 8, 2009 -- BETA 2
+----------------
+NOISSUE by Michelle: Check to make sure $links isn't empty before iterating thru it. Thanks to ghankstef for testing.
+
+February 7, 2009
+----------------
+#315972 by Michelle: Finished the reply link theming started yesterday.
+#369078 by lamigo: Fixed postgres errors.
+#370422 by Michelle: Replaced path_to_theme with my own function that always has the path to the actual site theme.
+#367496 by Michelle: Added check for link text when buttonifying.
+
+February 6, 2009
+----------------
+#315972 by Michelle: Separated out topic header into its own theme file and made the reply link a themeable function.
+
+February 4, 2009
+----------------
+#367481 by Michelle: Fixed up statistics including changing to use theme_username.
+
+February 3, 2009
+----------------
+#366301 by Michelle, ipwa: Fixed author pane layout on stacked styles.
+#365491 by Michelle, bouton: Cleaned up legend markup / css.
+
+January 27, 2009
+----------------
+#315972 by Michelle: Small fix to link to jump to last post.
+NOISSUE by Michelle: Making coder happy.
+NOISSUE by Michelle: Updated readme with Author Pane dependency.
+
+January 26, 2009
+----------------
+#102743 by yoroy: Updated topic icons.
+#363061 by Michelle, paulcouture: Eliminated duplicate users from statistics.
+Style clean up. Fixed #364385 and #360888 along the way.
+
+January 23, 2009
+----------------
+#303548 by Michelle: Added imagecache support for forum avatars.
+
+January 22, 2009
+----------------
+
+#360897 by RedKing: Added french translation.
+#352945 by Michelle, Heine: Added check that user is confirmed for last user in statistics.
+#351390 by Matafleur: Allow treat as forum post override to set item to _not_ be treated as a forum post.
+#328029 by Michelle: Added updated label in topic list.
+#328029 by Michelle: Added new label as well.
+
+January 18, 2009
+----------------
+#303564 by Psicomante, Michelle: Added legend for forum icons.
+
+January 16, 2009 -- BETA 1
+----------------
+#354704 by Michelle: Added check to be sure template is in use before adding the module path to it.
+#351395 by elfur: Added missing t() around link to top.
+#338722 by catch: Fixed bug in mark topics as read.
+NOISSUE by Michelle: Removed unneeded js file.
+#357361 by ron_s: Fixed created column class name.
+
+December 27, 2008
+-----------------
+NOISSUE by Michelle: Removed author pane preprocess and switched to passing the template in the theme call.
+NOISSUE by Michelle: Moved main author pane div from post template to author pane template & generally updated template.
+
+
+December 21, 2008
+-----------------
+#343853 by Michelle: Removed author pane code. This marks the start of dependency on the new author pane module.
+
+December 16, 2008
+-----------------
+#315972 by Michelle: Initial commit of jump to last post. Needs clean up and porting to D5.
+
+December 12, 2008 -- ALPHA 16
+-----------------
+#330000 and #328800 by Michelle: Redid image handling to ensure all images have alt text. Also made it possible for link images to be picked up automatically if they have a file name that matches the link key.
+#344697 by Michelle: Added permission to view statistics and also broke out statistics into its own template.
+
+December 11, 2008
+-----------------
+#345908 by Michelle: Fixed profile integration to account for change in core in D6.
+NOISSUE by Michelle: Fixed up author pane template comments and added facebook_status variable.
+#343848 by Michelle: Added variable for fasttoggle to author pane.
+
+December 9, 2008
+----------------
+NOISSUE by Michelle: Made 'naked' the base style so all other styles only need to include changed files.
+
+December 8, 2008
+----------------
+#320635 by Michelle: Added logic to 'treat as forum post' to account for reply pages. CSS is now loaded whenever AF determines the content is to be treated as a forum post.
+#320635 by Michelle: Improvements on theming reply pages, including using a seperate template for previews.
+#338268 by marcingy: Added option to set length of abbreviated topic title on forum overview.
+#338268 by Michelle: Added option to set 'time ago' cutoff.
+#303563 by Michelle: Clear readpath when marking read. (Outside module integration.)
+Redid table headers on topic list pages in an attempt to fix #334198 . Turned out not to be the problem but I like the new method better so am committing it anyway. Won't backport to D5, though.
+
+#339982 by Michelle: Fixed bug with comment wrapper template not loading.
+
+December 7, 2008
+----------------
+#339890 by Michelle: Fixed short script opener in advf-forum-repeat-post.tpl.php (500 errors on paged threads)
+
+November 26, 2008 -- ALPHA 15
+-----------------
+NOISSUE by Michelle: Stripped naked down to bare layout.
+NOISSUE by Michelle: Added boxy and boxy_stacked styles.
+#335770 by Michelle: Removed update that tried to clear up long unused variables as it was giving false fails.
+
+November 22, 2008
+-----------------
+#325675 by Morbus: Implemented min-height IE fix suggested by Morbus.
+#337457 by Dave Reid: Fixed code that creates links array for comments to match missed change in core.
+
+November 17, 2008 -- ALPHA 14
+
+November 11, 2008
+----------------
+NOISSUE by Michelle: Reverted changes to author pane auto file load patch.
+NOISSUE by Michelle: Code clean up.
+
+November 9, 2008
+----------------
+NOISSUE by Michelle: Simplified code for including author-pane.inc files.
+#331609 by Michelle, dvessel: Fixed problem with advf-author-user.tpl.php not being called from theme.
+NOISSUE by Michelle: advf-forum-repeat-post.tpl.php still had clearfix instead of clear-block.
+
+November 8, 2008
+----------------
+NOISSUE by Michelle: More style tweaking in naked and blue_lagoon. Still broken in IE.
+
+November 7, 2008
+----------------
+NOISSUE by Michelle: Changed naked_stacked to match recent changes to forum threads in naked.
+
+November 2, 2008
+----------------
+NOISSUE by Michelle: Contact link was using the D5 version of the l() function probably due to bad copy.
+NOISSUE by Michelle: Made sure all the icons in CVS matched my local copies.
+
+November 1, 2008
+----------------
+#326706 by Michelle: Changed query that calculates number of new comments to try and fix problem with old comments. Minimally tested.
+#327057 by Michelle: Refactored treat_as_forum_post() to add a hook and generally condense and clean up the code.
+#328617 by Michelle: If there are no new comments on a thread, don't put the # at the end of the URL on the link from the forum list page.
+
+October 27, 2008
+---------------
+#326460 by Michelle: Changed included contrib modules to new format.
+
+October 22, 2008
+---------------
+#266682 by Morbus, Michelle: Added forum statistics. Also a few minor fixes and extra docs that slipped in at the same time.
+
+October 20, 2008
+---------------
+NOISSUE by Michelle: Added blue_lagoon_stacked style.
+NOISSUE by paris: Added blank icons for blue_lagoon and naked.
+
+October 20, 2008
+---------------
+#323631 by Morbus: Style fixes for blue_lagoon. Removed need for background image.
+#323632 by Michelle: Removed member ID from naked & blue_lagoon templates as requested by Morbus.
+#323656 by Michelle: Removed override that set table row borders to 0.
+#319942 by Michelle: Thanks to Morbus for pointing out that Drupal code comes with a clearer. Changed over to using it.
+NOISSUE by Michelle: Small fixes to all styles based partially on Morbus' patch from #323631
+#323653 by Michelle: Set a minimum height for the author pane. Also some other minor fixes.
+#321590 by Morbus: Gets rid of div when forum description is empty.
+#321041 by derhasi, swill, Michelle: Fixed errors in Mark as Read functionality.
+#322125 by swill: Fixed bug with comment link array recreation.
+
+October 7, 2008 -- ALPHA 13
+---------------
+#291084 by Michelle: Removed all collapsable container code as it caused too many issues. Many thanks to jmorahan for tracing the bizarre pagers to this code.
+#316525 by CompShack, samuelet: Minor CSS fixes to forum posts to fix IE 7 issues.
+#318303 by Michelle, waawaamilk: Added static variable to avoid making multiple trips to the cache per page.
+
+October 1, 2008 -- ALPHA 12
+---------------
+#314205 by Michelle: More style cleanup.
+NOISSUE by Michelle: Code cleanup.
+
+September 30, 2008
+------------------
+#313693 by nigel: Sped up function to retrieve the count of new comments in a forum.
+#312958 by Michelle: Added $container_description to forum list template.
+NOISSUE by Michelle: Code cleanup.
+
+September 29, 2008
+------------------
+#314108 by Michelle: Fixed shadow post message.
+
+September 28, 2008
+------------------
+#314205 by Michelle, stephthegeek: Lots of style cleanup.
+#314186 by Michelle: Fixed broken comment numbering.
+NOISSUE by Michelle: Changed 'forum user' to 'author pane' for clarity.
+
+September 26, 2008
+------------------
+#303549 by Michelle: Cleaned up author info pane.
+#250112 by Michelle: Added userpoints categorization. Also added branding suggested by Vuds in #310460. Also fixed missing t()s.
+#314205 by Michelle: First round of style cleanup.
+
+September 25, 2008
+------------------
+#312602 by Michelle, merlinofchaos: Fixed broken query for counting the unread comments in a forum.
+#303740 by nigel, Michelle: Fixed lots of little bugs found with E_ALL warnings.
+
+September 24, 2008
+------------------
+#306633 by Michelle: Added more icons.
+#291084 by halkeye: Cleared options before collapsable container setting.
+NOISSUE by waawaamilk: Fixed bug with counting forums in forum list preprocess.
+#306633 by Michelle: Renamed most of the icons for a more consistant naming and replaced some.
+
+September 18, 2008
+------------------
+#310547 by Michelle: Added 'hidden options' to settings page as well as other work on the settings page. This also necessitated a change to the collapsable container code.
+NOISSUE by Michelle: Added check for css files in theme directory so they can be overridden.
+#309955 by Michelle: Comment wrapper preprocess was not checking that we are on a forum node.
+
+September 17, 2008
+------------------
+#291084 by cridenour: More work on the collapsable forum containers: setting initial state and remembering state.
+
+September 16, 2008
+------------------
+#309233 by merlinofchaos, Michelle: Adjusted theme registry manipulation to properly find .tpl files in themes and subthemes.
+NOISSUE by Michelle: Made killing of topic navigation optional since there are a few people out there who like it.
+#309066 by asxnot: Fixed PHP 4 issue with forum list icons.
+
+September 14, 2008
+------------------
+#291084 by grn, Michelle: More fixes for collapsable containers.
+#303542 by Michelle: Updated README.txt
+#299258 by Michelle: Documented icon sources.
+
+September 13, 2008
+------------------
+#291084 by grn: Added initial jquery to make collapsable containers work. Still rough but usable.
+#303556 by alpritt: Fixed no background showing in header on forum icon column.
+NOISSUE by Michelle: Changed jump to first reply on top of forum nodes to show total replies as well.
+#303556 by Michelle: Fixed issue with topic list header.
+
+September 10, 2008
+------------------
+#303816 by Michelle: Fixed post reply bug.
+#303556 by Michelle: Added blue_lagoon style.
+
+September 8, 2008
+-----------------
+#291084 by Michelle: Some preliminary work to set up the classes for collapsable containers.
+
+September 7, 2008
+-----------------
+NOISSUE by Michelle: Cleaned up user info .tpl and modules that feed it.
+#303799 by Michelle: Moved folder icons into their own column. Also cleaned up forum list tpl.
+#303799 by Michelle: Fixed issue with indenting when no containers.
+
+September 6, 2008
+-----------------
+#303553 by stephthegeek: Tweaks to naked style.
+#303740 by nigel, Michelle, neclimdul: Fixed some E_ALL warnings.
+#228557 by neclimdul: Collect extra user info variables via hook.
+
+September 2, 2008
+-----------------
+NOISSUE by Michelle: Fixed joined date to not use hardcoded format. Regex provided by Morbus.
+#274978 by Michelle: Fixed signatures so they work with and without signature for forums installed.
+NOISSUE by Michelle: Re-arranged functions and cleaned up some comments.
+#268684 by Michelle: Removed old themes directory.
+#268684 by Michelle: Added code to change forum icon when new posts.
+#268684 by Michelle: Added new forum icons.
+#268684 by Michelle: Changed 'mark as read' to use new icon.
+#268684 by Michelle: Added advf-comment-wrapper.tpl.php and used it to add reply link at bottom of each page.
+#301089 by George2: Only print title div if there is a title on the comment.
+NOISSUE by Michelle: Fixed bad copy of &variables when calling functions. Thanks afeijo for reporting it.
+NOISSUE by Michelle: Changed 'ago' to showing actual dates when over 48 hours.
+#302125 by IceCreamYou, Michelle: Added facebook status support.
+
+September 1, 2008
+-----------------
+#238668 by Michelle: Added advanced setting to turn this off if it causes performance problems.
+#268684 by Michelle: Added support for flatgrey style. Actual style has not been added yet.
+#228557 by Michelle: Moved contrib code into individual files to pave the way for plugin system. Removed modules not yet ported to D6.
+#300594 by Michelle: Updated private message code to work with D6 rewrite.
+
+August 21, 2008
+---------------
+#295562 by catch: Make 'views' column in topic list statistics.module dependent.
+#268684 by Michelle: Cleaned up advf-forum-topic-list.tpl.php and moved some logic into the preprocess.
+#268684 by Michelle: Added classes to table header for topic list and cleaned up empty fields.
+Made advanced setting for turning off created column.
+#238668 by ixeft, Michelle: Added N new posts to forum overview.
+
+August 20, 2008
+---------------
+#268684 by merlinofchaos, sdboyer, and a tiny bit Michelle: Adapted panels plug in system to allow any module to add styles to advanced forum. This paves the way for offering multiple styles with the module as well as letting others contribute styles. Also 'renamed' themes directory to styles so much moving around of files. (Theme changes: The default advforum style as well as any customized themes won't work at this point. Instructions coming once this stabalizes.)
+
+August 15, 2008
+---------------
+#297227 by Michelle: Missed spot affected by D6's change to per type comment settings.
+
+August 15, 2008
+---------------
+#268684 by stephthegeek: Added new "naked" style. This completely revamped basic style will be the base for future styles.
+#268684 by Michelle: Simplified style switching / icon finding to pave the way for this issue. This is a temporary measure until the new style plugin system is written. (Theme changes: Themes are now styles and these notes will be called "Style changes" after this. As of this change, you need to set the name of the style on the options page. Advf will look for a directory by that name first in the active theme and then in the module. If you want to customize a style, copy the entire directory into your theme and make changes there.)
+
+August 1, 2008
+--------------
+#268273 by Michelle: Another fix for the last comment in forum mess.
+
+June 9, 2008
+------------
+#268680 by Morbus: Whitespace / comment cleanup.
+Code cleanup and syncing the branches.
+
+June 6, 2008 - ALPHA 1
+------------
+#241982 by Michelle: Fixed install function for filling table so it doesn't give warnings and returns success/failure properly. Since it was filling the table even with the warnings, there's no need to rerun this.
+#242527 by Michelle: Re-fixed the problem with views showing blank instead of 0.
+
+June 5, 2008
+------------
+#241982 by Michelle: Added function to .install to fill last post table with initial values.
+#241982 by Michelle: Adjusted comment link to account for multiple pages.
+#241982 by Michelle: Added icon linked to most recent comment. (Theme changes: advf-forum-submitted.tpl.php, added newest_comment.gif)
+#266765 by aMakUzr: Fixed class markup on forum posts.
+
+June 3, 2008
+------------
+#242527 by Michelle: Initialized view count to 0 so it doesn't show blank when no views of topic.
+#208440 by Michelle: Made reference post use forum theme when replying. Also removed links from comment in reply mode.
+#241982 by Michelle: Updated variable list in comments of advf-forum-submitted.tpl.php to account for changes.
+
+June 2, 2008
+------------
+#241982 by Michelle: Added checking to see if last topic has been deleted or unpublished.
+
+May 30, 2008
+------------
+#241982 by Michelle with tons of help from litwol and neclimdul: Updated install file to create the new table.
+#241982 by Michelle (based on idea from Bdragon): Use a table to store reference to last posts in forum to replace the monster query.
+
+Still to do: Account for deleted/unpublished comments and nodes. Write something in the install file to backfill table with existing posts. More testing.
+
+Theme changes:
+advf-forum-submitted.tpl.php - Added an extra section for adding more info when a comment is the latest.
+
+#No issue by Michelle, Added some doxygen comments and moved around some functions for better readability.
+
+May 27, 2008
+------------
+#263943 by SkoalFyfan: Changed template name from forums to advf-forums in preprocess code.
+#256174 by seals: Swedish translation update.
+
+May 27, 2008
+------------
+Fixed up function advanced_forum_treat_as_forum_post() to be better commented, more logical, #232513 allow other content types (thanks nbz for the starter code), and fix #260640 comment theming not defaulting to off.
+#217194 Added template file to theme the repeated node on paginated forum threads. Thanks, Morbus. (Theme changes: advf-forum-repeat-post.tpl.php)
+Pulled creating the 'topic pager' out of advanced_forum_preprocess_forum_topic_list to simplify it.
+#242527 Added number of views to the topic listing page. Thanks to Zandroc for the starter code. (Theme changes: advf-forum-topic-list.tpl.php, advanced_forum-structure.css)
+Removed some unused CSS from advanced_forum.css
+
+May 13, 2008
+------------
+Removed debug code left in MAR and cleaned up comments. Thanks afeijo.
+
+May 12, 2008
+------------
+Port from D5: #255949 Added link to top of forum threads that lists the number of unread comments and links to the first one. This links to the comment id and so will work across pages. (Theme changes: advf-forum-post.tpl.php - Added $jump_first_new)
+Added extra markup for the post header area. (Theme changes: advf-forum-post.tpl.php - Added div.forum-post-header)
+#253155 Changed _is_forum() to advanced_forum_treat_as_forum_post() to comply with coding standards and clarify purpose.
+#253155 Changed _topic_nid() to _advanced_forum_topic_nid().
+#253155 Changed theme_image... to theme('image'...
+Ported path_to_subtheme() related code from D5.
+#246701 IE 6 fixes. Thanks, CompShack. (Theme changes: Affects both .css files)
+
+May 9, 2008
+-----------
+#241071 Mark as read function rewritten by afeijo (with some early help from konfuzed) on IRC. Thanks for the late night debugging to get this working.
+
+May 8, 2008
+-----------
+#238125 Removed the sql rewrite since it doesn't work with subqueries.
+#248652 Fixed PHP 4 incompatibility in showing last post in forum. Thanks jamix.
+#249651 Added check that contact module is enabled.
+#254051 Fixed error in mark as read menu item.
+#256174 Added Swedish translation. Thanks seals.
+Ported settings page from 5.x.
+#241071 Got mark as read partially working. Still an error.
+
+May 7, 2008
+-----------
+#254892 Added variable for forum description to forum topic list. Theme changes: advf-forums.tpl.php - Added description. advf-forum-topic-list.tpl.php - Updated variable list to include $forum_description. advf-forum-topic-list.tpl.php - padding around new class.
+
+May 1, 2008
+-----------
+Ported some small fixes that were done for D5 but not D6.
+Updated D6 with all D5 theme changes.
+#237362 Loaded user object in preprocesses for node and comment rather than in template_preprocess_author_pane so it is available in the main forum post template. Fixed #236870 in the process.
+
+March 22, 2008
+--------------
+Fixed remaining issues with advanced_forum_get_all_last_topics (I hope!)
+Updated README.txt and CHANGELOG.txt
+Fixed $Id at the tops of all the files.
+
+March 18, 2008
+--------------
+#222212 #235749 Removed caching from advanced_forum_get_all_last_topics due to too many problems.
+
+March 3, 2008
+-------------
+Added some tweaks to the user info pane
+
+Feb 25, 2008
+------------
+Added better shadow topic link.
+
+Feb 24, 2008
+------------
+Fixed last topics in forums list. Thanks to LasseP.
+
+Feb 23, 2008
+------------
+Added back in mark as read buttons.
+Added extra formatting to sticky topics.
+Added folder icon to forum list.
+More CSS tweaks
+
+Feb 22, 2008
+------------
+#204281 Fixed indenting on forum overview.
+#219958 Added reply button to top of thread.
+Recreated links on comments so we can theme them better and changed CSS to match.
+Small CSS fixes to adapt to new .tpl files.
+
+FEB 21, 2008 - D6 BRANCH
+Massive changes to begin porting this to 6.x
+
+----------------------- Pre-Port -----------------------------------------------
+
+Feb 07, 2008 - ALPHA 2
+------------
+Minor theme tweaks - Fixed mark as read button & lightened post info background
+Added rest of CSS to theme links on forum topics like buttons
+#212329 Changed 'Add comment' link to 'Reply' on top post.
+
+Feb 5, 2008
+------------
+Incorporated mark as read code into main module
+Themed forum links to look like buttons
+Changed link for shadow posts to give name of forum and link to the moved post
+
+Feb 3, 2008 - ALPHA 1
+-----------
+Committed all of eigentor's changes to the default theme
+
+Jan 23, 2007
+------------
+Added t() to 'posted on'
+
+Dec 22, 2007
+------------
+Created this changelog to help early adopters keep up with my changes. Will only be recording major changes until the module gets non-dev releases.
+Notable recent changes:
+ - Moved all theme related files into themes/advforum to enable alternate themes
+ - Removed call to _is_forum() at the top of node-forum.tpl.php and rolled logic into the function
+ - Renamed node-forum.tpl.php to forum-thread.tpl.php
+
+Nov 18, 2007
+------------
+Created project for advanced forum and uploaded some early code
\ No newline at end of file
diff --git a/htmltest/sites/all/modules/advanced_forum/LICENSE.txt b/htmltest/sites/all/modules/advanced_forum/LICENSE.txt
new file mode 100644
index 00000000..d159169d
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/LICENSE.txt
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/htmltest/sites/all/modules/advanced_forum/README.txt b/htmltest/sites/all/modules/advanced_forum/README.txt
new file mode 100644
index 00000000..b51be99e
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/README.txt
@@ -0,0 +1,107 @@
+
+CONTENTS OF THIS FILE
+---------------------
+ * Introduction
+ * Installation
+ * Other configuration
+ * Credits
+ 
+INTRODUCTION
+------------
+Advanced Forum (http://drupal.org/project/advanced_forum) enhances Drupal's forum module to provide the look and, with the help of other modules, much of the functionality found in common forum software. Because it uses the core forum module, it uses the node and comment system built into Drupal and is completely integrated, not a bridge.
+
+INSTALLATION
+------------
+
+1. Enable all dependencies: Author Pane ( http://drupal.org/project/author_pane ), Forum, 
+   Taxonomy, Comment. (Optionally: Statistics)
+   
+2. Copy the entire advanced_forum project directory (not just the contents) to your 
+   normal module directory (ie: sites/all/modules)
+   
+3. Enable the advanced forum module at ?q=admin/build/modules
+
+4. Visit the Advanced Forum settings page at ?q=admin/settings/advanced-forum 
+   # General:
+     * "Advanced forum style directory" Select the style you are using. 
+       See http://drupal.org/node/234042 for more information on this.
+     * "Use graphical buttons for links" Check this if you want links to use graphical 
+        buttons (where available).
+     * "Treat all site comments like forum comments" If you would like advanced forum to 
+       take over the theming of all comments, even those outside the forum, choose yes.
+   # Forum and topic lists
+     * "Hide the created column on the topic list" This option hides the created column
+       on the topic list page, which can't be done purely in theming due to the header
+       tablesort. If you hide this column, it is up to you to change the tenplate to
+       display the information elsewhere.
+     * "Get the number of new comments per forum on the forum list" Core forum shows the 
+       number of new topics. If checked, Advanced Forum will get the number of new 
+       comments as well and show it under "posts" on the forum overview. Slow query not 
+       recommended on large forums.
+     * "Number of characters to display for the topic title" On the main forums page, the
+       title of the last topic is shown. Because this is a narrow column, it is 
+       truncated. This option sets how many characters are shown.
+     * "Number of hours before switching to date posted in displays" In the forum / topic
+       listing, recent posts are shown like "1 day, 3 hours ago" and older posts will
+       have the actual date. You control the cutoff here.
+   # Topics
+     * "Use topic navigation" Core forum gets the next and previous topics and shows 
+       links to them under the top post. This is turned off by default as the query has 
+       performance issues and the placement of the links is poor.
+     * "User picture preset" You will only see this option if you have imagecache 2
+        enabled. If you choose a preset here, it will be used for the avatars in forum
+        posts. This can be used to give a more uniform appearance if people have many
+        different sizes for avatars. If you don't want to use a preset, just leave it
+        blank.
+
+OTHER CONFIGURATION
+-------------------
+   
+1. Forum settings ( ?q=admin/content/forum/settings ) 
+    * Hot topic threshold: Up to you.
+    * Topics per page: Up to you.
+    * Default order: "Date - newest first" so the most recent posts are at the top of the 
+      topic list.
+2. Select content types to use in forums ( ?q=admin/content/taxonomy ) 
+3. Edit the forum vocabulary
+   * Check all content types you want to use in forums.
+4. Comment settings ( ?q=admin/content/node-type/forum ) [Note: do this for each content 
+   type used in forums] 
+   * Expand "Comment settings" fieldset.
+   * Default comment setting: "Read/write"
+   * Set Default display mode: Flat list - expanded. (Advforum is intended to be used 
+     flat. Using it threaded should mostly work but is unsupported and may have some 
+     issues.) 
+   * Default display order: Date - oldest first 
+   * Default comments per page: Up to you. (If you chose to have a threaded forum, 
+     setting this number to the maximum will reduce issues with pagination and threading.) 
+   * Comment controls: "Do not display" is recommended.
+   * Anonymous commenting: Up to you.
+   * Comment subject field: Up to you. If disabled, advforum will not display the Drupal 
+     default subject, which is the first few words of the comment.
+   * Preview comment: Up to you.
+   * Location of comment submission form: Up to you. Displaying below provides a non-ajax 
+     quick reply.
+5. User settings ( ?q=admin/user/settings ) 
+   * Signature support: Enabled
+   * Picture support: Enable this for avatars in the forum.
+   * Picture maximum dimensions: If you change this from the default 85x85, you will want 
+     to size it in either CSS or with imagecache to avoid breaking the forum layout.
+6. Statistics settings ( ?q=admin/reports/settings ) 
+   * Enable access log: Enabled
+   * Count content views: Enabled - Needed for topic views count.   
+    
+CREDITS
+-------
+Developer and maintainer: Michelle Cox ( http://drupal.org/user/23570 )
+
+Advanced forum was originally based on flatforum. Though there is little or no code left
+from that module, its authors deserve credit for the idea.
+
+The Naked styles, which are the basis of all the other styles, were created by 
+stephthegeek (http://drupal.org/user/47874). Previous theme work was done by eigentor 
+(http://drupal.org/user/96718) and jacine (http://drupal.org/user/88931)
+
+Icons provided by paris (http://drupal.org/user/14747) and yoroy 
+(http://drupal.org/user/41502)
+
diff --git a/htmltest/sites/all/modules/advanced_forum/advanced_forum.info b/htmltest/sites/all/modules/advanced_forum/advanced_forum.info
new file mode 100644
index 00000000..0a8dfd3a
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/advanced_forum.info
@@ -0,0 +1,23 @@
+
+name = Advanced Forum
+description = Enables the look and feel of other popular forum software.
+version = 7.x-2.x-dev
+dependencies[] = forum
+dependencies[] = ctools
+dependencies[] = views
+
+configure = admin/config/content/advanced-forum
+
+; Views handlers
+files[] = includes/views/advanced_forum_handler_field_node_topic_icon.inc
+files[] = includes/views/advanced_forum_handler_field_node_topic_pager.inc
+files[] = includes/views/advanced_forum_plugin_style_forum_topic_list.inc
+
+core = 7.x
+
+; Information added by drupal.org packaging script on 2013-07-07
+version = "7.x-2.3"
+core = "7.x"
+project = "advanced_forum"
+datestamp = "1373223651"
+
diff --git a/htmltest/sites/all/modules/advanced_forum/advanced_forum.install b/htmltest/sites/all/modules/advanced_forum/advanced_forum.install
new file mode 100644
index 00000000..70c89134
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/advanced_forum.install
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * @file
+ * Installation code for Advanced Forum.
+ */
+function advanced_forum_install() {
+  db_update('system')
+      ->fields(array('weight' => 15))
+      ->condition('name', 'advanced_forum')
+      ->execute();
+}
+
+function advanced_forum_uninstall() {
+  db_delete('variable')
+      ->condition('name', "advanced_forum_%", "LIKE")
+      ->execute();
+  cache_clear_all('variables', 'cache_bootstrap');
+}
+
+function advanced_forum_update_5000() {
+  db_update('system')
+      ->fields(array('weight' => 10))
+      ->condition('name', 'advanced_forum')
+      ->execute();
+}
+
+function advanced_forum_update_5003() {
+  db_drop_table('advforum_last_post');
+}
+
+function advanced_forum_update_5005() {
+  db_update('system')
+      ->fields(array('weight' => 15))
+      ->condition('name', 'advanced_forum')
+      ->execute();
+}
+
+function advanced_forum_update_7200() {
+  if (variable_get('advanced_forum_forum_disabled') == NULL) {
+    variable_set('advanced_forum_forum_disabled', FALSE);
+  }
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/modules/advanced_forum/advanced_forum.module b/htmltest/sites/all/modules/advanced_forum/advanced_forum.module
new file mode 100644
index 00000000..1b469b3f
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/advanced_forum.module
@@ -0,0 +1,1389 @@
+<?php
+
+/**
+ * @file
+ * Enables the look and feel of other popular forum software.
+ */
+// DRUPAL HOOKS **************************************************************/
+
+/**
+ * Implementation of hook_perm().
+ */
+function advanced_forum_permission() {
+  return array(
+    'administer advanced forum' => array(
+      'title' => t('Administer Advanced Forum')
+    ),
+    'view forum statistics' => array(
+      'title' => t('View Advanced Forum statistics')
+    ),
+    'view last edited notice' => array(
+      'title' => t('View last edited notice')
+    )
+  );
+}
+
+/**
+ * Implementation of hook_menu().
+ */
+function advanced_forum_menu() {
+  $items['admin/config/content/advanced-forum'] = array(
+    'access arguments' => array('administer advanced forum'),
+    'description' => 'Configure Advanced Forum with these settings.',
+    'page arguments' => array('advanced_forum_settings_page'),
+    'page callback' => 'drupal_get_form',
+    'title' => 'Advanced Forum',
+    'file' => 'includes/settings.inc'
+  );
+
+  $items['forum/markasread'] = array(
+    'access callback' => 'advanced_forum_markasread_access',
+    'page callback' => 'advanced_forum_markasread',
+    'type' => MENU_CALLBACK,
+  );
+
+  if (variable_get('advanced_forum_add_local_task', TRUE)) {
+    $items['forum/view'] = array(
+      'title' => 'View Forums',
+      'page callback' => 'advanced_forum_page',
+      'type' => MENU_DEFAULT_LOCAL_TASK,
+      'weight' => -100,
+    );
+  }
+
+  return $items;
+}
+
+/**
+ * Implementation of hook_cron().
+ */
+function advanced_forum_cron() {
+  // ensure the reply stats are up-to-date
+  advanced_forum_statistics_replies(NULL, TRUE);
+}
+
+/**
+ * Implementation of hook_menu_alter().
+ */
+function advanced_forum_menu_alter(&$items) {
+  // Take over the forum page creation so we can add more information.
+  $items['forum']['page callback'] = 'advanced_forum_page';
+  $items['forum']['module'] = 'advanced_forum';
+  unset($items['forum']['file']);
+
+
+  // Take over forum/%forum_forum page because we want advanced_forum_forum_load
+  // is called instead of core forum_forum_load
+  $items['forum/%advanced_forum_forum'] = $items['forum/%forum_forum'];
+  $items['forum/%advanced_forum_forum']['page callback'] = 'advanced_forum_page';
+  $items['forum/%advanced_forum_forum']['module'] = 'advanced_forum';
+  unset($items['forum/%advanced_forum_forum']['file']);
+  unset($items['forum/%forum_forum']);
+}
+
+/**
+ * Implements hook_menu_local_tasks_alter().
+ *
+ * Unset all items set in core forum_menu_local_tasks_alter
+ */
+function advanced_forum_menu_local_tasks_alter(&$data, $router_item, $root_path) {
+  if ($root_path == 'forum' || $root_path == 'forum/%') {
+    $data['actions']['output'] = array();
+  }
+}
+
+/**
+ * Implementation of hook_module_implements_alter().
+ *
+ * We don't want forum_menu_local_tasks_alter() to be called and mess with our links.
+ *
+ */
+function advanced_forum_module_implements_alter(&$implementations, $hook) {
+  if ($hook == 'menu_local_tasks_alter') {
+    unset($implementations['forum']);
+  }
+}
+
+/**
+ * Implementation of hook_theme().
+ */
+function advanced_forum_theme() {
+  advanced_forum_load_style_includes();
+
+  // Bulk read all available (active) style templates
+  $existing_items = advanced_forum_find_style_templates();
+
+  $items['advanced_forum_l'] = array(
+    'variables' => array(
+      'text' => NULL,
+      'path' => NULL,
+      'options' => array(),
+      'button_class' => NULL,
+    )
+  );
+
+  $items['advanced_forum_topic_header'] = array(
+    'variables' => array(
+      'node' => NULL,
+      'comment_count' => NULL,
+    )
+  );
+
+  $items['advanced_forum_active_poster'] = array(
+    'variables' => array(
+      'forum' => NULL,
+      'account' => NULL,
+      'posts' => NULL,
+      'topics' => NULL,
+      'last_post' => NULL,
+    )
+  );
+
+  $items['advanced_forum_user_picture'] = array(
+    'variables' => array(
+      'account' => NULL,
+    )
+  );
+
+  $items['advanced_forum_reply_link'] = array(
+    'variables' => array(
+      'node' => NULL,
+    )
+  );
+
+  $items['advanced_forum_topic_pager'] = array(
+    'variables' => array(
+      'pagecount' => NULL,
+      'topic' => NULL,
+    )
+  );
+
+  $items['advanced_forum_shadow_topic'] = array(
+    'variables' => array(
+      'title' => NULL,
+      'nid' => NULL,
+      'new_forum' => NULL,
+    )
+  );
+
+  $items['advanced_forum_subforum_list'] = array(
+    'variables' => array(
+      'subforum_list' => NULL,
+    )
+  );
+
+  $items['advanced_forum_subcontainer_list'] = array(
+    'variables' => array(
+      'subcontainer_list' => NULL,
+    )
+  );
+
+  $items['advanced_forum_simple_author_pane'] = array(
+    'variables' => array(
+      'context' => NULL,
+    )
+  );
+
+  $items['advanced_forum_post_edited'] = array(
+    'variables' => array(
+      'who' => NULL,
+      'when' => NULL,
+      'why' => NULL,
+    )
+  );
+
+  $items['advanced_forum_node_type_create_list'] = array(
+    'variables' => array(
+      'forum_id' => NULL,
+    )
+  );
+  /*
+    // Templates for features added by Views
+
+    // style
+    $items['views_view_forum_topic_list__advanced_forum_topic_list'] = array(
+    'variables' => array('view' => NULL, 'options' => NULL, 'rows' => NULL, 'title' => NULL),
+    'template' => 'advanced-forum-topic-list-view',
+    //'base hook' => 'views_view_forum_topic_list',
+    );
+   */
+  //display
+  $items['views_view__advanced_forum_topic_list'] = array(
+    'variables' => array('view' => NULL),
+    'template' => 'advanced-forum-topic-list-outer-view',
+      //'base hook' => 'views_view',
+  );
+
+  //display group
+  $items['views_view__advanced_forum_group_topic_list'] = array(
+    'variables' => array('view' => NULL),
+    'template' => 'advanced-forum-group-topic-list-outer-view',
+      //'base hook' => 'views_view',
+  );
+
+  // Return merged items found in style folder with new ones
+  // array_merge_recursive doesn't work as desired
+  foreach ($items as $key => $item) {
+    if (array_key_exists($key, $existing_items)) {
+      $existing_items[$key] += $item;
+    }
+    else {
+      $existing_items[$key] = $item;
+    }
+  }
+
+  return $existing_items;
+}
+
+/**
+ * Implementation of hook_theme_registry_alter().
+ */
+function advanced_forum_theme_registry_alter(&$theme_registry) {
+  advanced_forum_load_style_includes();
+
+  // Don't let core do its basic preprocess for forums, as we want to do
+  // other stuff now.
+  foreach ($theme_registry['forums']['preprocess functions'] as $key => $value) {
+    if ($value == 'template_preprocess_forums') {
+      unset($theme_registry['forums']['preprocess functions'][$key]);
+    }
+  }
+
+  // We duplicate all of core's forum list preprocessing so no need to run
+  // it twice. Running twice also causes problems with & in forum name.
+  foreach ($theme_registry['forum_list']['preprocess functions'] as $key => $value) {
+    if ($value == 'template_preprocess_forum_list') {
+      unset($theme_registry['forum_list']['preprocess functions'][$key]);
+    }
+  }
+
+  // Views handles the topic list pages so remove the core template preprocess.
+  foreach ($theme_registry['forum_topic_list']['preprocess functions'] as $key => $value) {
+    if ($value == 'template_preprocess_forum_topic_list') {
+      unset($theme_registry['forum_topic_list']['preprocess functions'][$key]);
+    }
+  }
+
+  // --- The following section manipulates the theme registry so the .tpl files
+  // --- for the given templates can be found first in the (sub)theme directory
+  // --- then in ancestor themes, if any, then in the active style directory
+  // --- for advanced forum or any ancestor styles.
+  // Affected templates
+  $templates = array(
+    'node',
+    'comment',
+    'comment_wrapper',
+    'forums',
+    'forum_list',
+    'forum_topic_list',
+    'forum_icon',
+    'forum_submitted',
+    'author_pane',
+      /*
+        'advanced_forum_statistics',
+        'advanced_forum_topic_list_view',
+        'advanced_forum_topic_legend',
+        'advanced_forum_forum_legend',
+        'advanced_forum_topic_header',
+        'advanced_forum_active_poster', */
+  );
+
+  // Get the sequence of styles to look in for templates
+  $lineage = advanced_forum_style_lineage();
+
+  if (!array_key_exists('naked', $lineage)) {
+    // Add naked in at the end of the line to prevent problems if a style
+    // doesn't include all needed templates.
+    $lineage['naked'] = drupal_get_path('module', 'advanced_forum') . '/styles/naked';
+  }
+
+  // Get theme engine extension
+  global $theme_engine;
+  $extension = '.tpl.php';
+  if (isset($theme_engine)) {
+    $extension_function = $theme_engine . '_extension';
+    if (function_exists($extension_function)) {
+      $extension = $extension_function();
+    }
+  }
+
+  foreach ($templates as $template) {
+    // Sanity check in case the template is not being used.
+    if (!empty($theme_registry[$template])) {
+      // There are preprocess functions to add, so figure out where we want to add
+      // them.
+      if (!empty($preprocess)) {
+        $position = 0;
+        foreach ($theme_registry[$template]['preprocess functions'] as $function) {
+          $position++;
+          // If we see either of these items, that means we can place our
+          // preprocess functions after this.
+          if (substr($function, 0, 25) == 'advanced_forum_preprocess' || substr($function, 0, 34) == 'template_preprocess_advanced_forum') {
+            break;
+          }
+        }
+        // Add in our new preprocess functions:
+        array_splice($theme_registry[$template]['preprocess functions'], $position, 0, $preprocess);
+      }
+    }
+  }
+
+
+  // temp workaround
+  array_splice($theme_registry['views_view__advanced_forum_topic_list']['preprocess functions'], 1, 0, 'template_preprocess_views_view');
+  array_splice($theme_registry['views_view__advanced_forum_group_topic_list']['preprocess functions'], 1, 0, 'template_preprocess_views_view');
+  //array_splice($theme_registry['views_view_forum_topic_list__advanced_forum_topic_list']['preprocess functions'], 1, 0, 'template_preprocess_views_view_forum_topic_list');
+}
+
+/**
+ * Own link alteration implementaion because there are no
+ * hook_link nor hook_link_alter in D7
+ *
+ * Name changed intentionally to avoid confusion with hook_link_alter!
+ */
+function advanced_forum_links_alter(&$object, $view_mode, $object_type = 'node') {
+  // Don't alter anything if in preview mode
+  if (!empty($object->in_preview)) {
+    return;
+  }
+
+  if (!advanced_forum_is_styled($object, ($view_mode == 'teaser'), $object_type)) {
+    return;
+  }
+
+  if (!empty($object->content['links']['comment'])) {
+    $comment_links = $object->content['links']['comment'];
+    $links = empty($comment_links['#links']) ? array() : $comment_links['#links'];
+  }
+  else {
+    $comment_links = array();
+    $links = array();
+  }
+
+  if ($object_type == 'node') {
+
+    $node = $object;
+    // Add edit / delete links to the node links to match replies.
+    if (node_access('update', $node)) {
+      $links['post-edit'] = array(
+        'title' => t('edit'),
+        'href' => 'node/' . $node->nid . '/edit',
+        'query' => drupal_get_destination(),
+      );
+    }
+
+    if (node_access('delete', $node)) {
+      $links['post-delete'] = array(
+        'title' => t('delete'),
+        'href' => 'node/' . $node->nid . '/delete',
+      );
+    }
+  }
+
+  // Change first post from "add comment" to "reply" if it isn't already.
+  if (!empty($links['comment-add'])) {
+    $links['comment-add']['title'] = t('reply');
+    $links['comment-add']['href'] = "comment/reply/$node->nid";
+  }
+
+
+  // List the keys we are interested in.
+  $affected_keys = array('post-edit', 'comment-edit', 'post-delete', 'comment-delete', 'quote', 'comment-add', 'comment-reply');
+
+  // Add extra span tags for image replacement.
+  foreach ($links AS $key => $link) {
+    if (in_array($key, $affected_keys)) {
+      $links[$key]['attributes']['class'][] = "af-button-small";
+      $links[$key]['title'] = '<span>' . $links[$key]['title'] . '</span>';
+      $links[$key]['html'] = TRUE;
+    }
+  }
+
+  // Put the links in a consistent order.
+  foreach ($affected_keys as $key) {
+    if (isset($links[$key])) {
+      $temp = $links[$key];
+      unset($links[$key]);
+      $links[$key] = $temp;
+    }
+  }
+
+  // we want to put comment links last
+  unset($object->content['links']['comment']);
+  $object->content['links']['comment'] = $comment_links;
+
+  // put links back
+  $object->content['links']['comment']['#links'] = $links;
+}
+
+/**
+ * Implementation of hook_node_view().
+ *
+ * hook_link() and hook_link_alter() functionalty implemented here
+ */
+function advanced_forum_node_view($node, $view_mode, $langcode) {
+  advanced_forum_links_alter($node, $view_mode, 'node');
+}
+
+/**
+ * Implementation of hook_comment_view().
+ */
+function advanced_forum_comment_view($comment, $view_mode, $langcode) {
+  advanced_forum_links_alter($comment, $view_mode, 'comment');
+}
+
+/**
+ * Implementation of hook_comment_delete().
+ */
+function advanced_forum_comment_delete($comment) {
+  if (!empty($comment->node_type) && ($comment->node_type == "comment_node_forum")) {
+    advanced_forum_statistics_replies(-1);
+  }
+}
+
+/**
+ * Implementation of hook_comment_insert().
+ */
+function advanced_forum_comment_insert($comment) {
+  if (!empty($comment->node_type) && ($comment->node_type == "comment_node_forum")) {
+    advanced_forum_statistics_replies(1);
+  }
+}
+
+/**
+ * Implementation of hook_comment_update().
+ */
+function advanced_forum_comment_update($comment) {
+  if (!empty($comment->node_type) && ($comment->node_type == "comment_node_forum")) {
+    // comment unpublished?
+    if (!$comment->status) {
+      advanced_forum_statistics_replies(-1);
+    }
+  }
+}
+
+/**
+ * Implementation of hook_comment_publish().
+ */
+function advanced_forum_comment_publish($comment) {
+  if (!empty($comment->node_type) && ($comment->node_type == "comment_node_forum")) {
+    advanced_forum_statistics_replies(1);
+  }
+}
+
+/**
+ * Implementation of hook_form_alter().
+ */
+function advanced_forum_form_alter(&$form, &$form_state, $form_id) {
+  if (!empty($form['#node']->type) && advanced_forum_type_is_in_forum($form['#node']) && isset($form['body_field']) && isset($form['body_field']['#after_build'])) {
+    // Remove the teaser splitter.
+    $teaser_js_build = array_search('node_teaser_js', $form['body_field']['#after_build']);
+    unset($form['body_field']['#after_build'][$teaser_js_build]);
+    $form['body_field']['teaser_js']['#access'] = FALSE;
+    $form['body_field']['teaser_include']['#access'] = FALSE;
+  }
+
+  // Add our OG view as a potential RON for organic groups.
+  if (!empty($form['og_settings']['group_details']['og_home_page_view'])) {
+    $form['og_settings']['group_details']['og_home_page_view']['#options']['advanced_forum_group_topic_list'] = 'advanced_forum_group_topic_list';
+  }
+}
+
+// MAKE VIEWS BITS WORK *****************************************************/
+function advanced_forum_views_api() {
+  return array(
+    'api' => '3.0-alpha1',
+    'path' => drupal_get_path('module', 'advanced_forum') . '/includes/views',
+  );
+}
+
+// MAKE CTOOLS BITS WORK *****************************************************/
+/**
+ * Tell CTools about what plugins we support.
+ */
+function advanced_forum_ctools_plugin_directory($module, $plugin) {
+  if ($module == 'advanced_forum') {
+    return 'styles';
+  }
+
+  if ($module == 'page_manager' || $module == 'ctools') {
+    return 'plugins/' . $plugin;
+  }
+}
+
+function advanced_forum_ctools_plugin_api($module, $api) {
+  if ($module == 'page_manager' && $api = 'pages_default') {
+    return array(
+      'version' => 1,
+      'path' => drupal_get_path('module', 'advanced_forum') . '/includes/panels',
+    );
+  }
+}
+
+// THEME FUNCTIONS AND TEMPLATE PREPROCESSES **********************************/
+module_load_include('inc', 'advanced_forum', 'includes/theme');
+
+// STYLE RELATED FUNCTIONS ****************************************************/
+module_load_include('inc', 'advanced_forum', 'includes/style');
+
+// CORE FORUM PAGE OVERRIDES **************************************************/
+module_load_include('inc', 'advanced_forum', 'includes/core-overrides');
+
+// MARK AS READ ***************************************************************/
+module_load_include('inc', 'advanced_forum', 'includes/mark-read');
+
+// VIEWS RELATED GOODIES ******************************************************/
+
+/**
+ * Post render a view and replace any advanced forum tokens.
+ */
+function advanced_forum_views_post_render(&$view, &$output) {
+  if (empty($view->style_plugin) || !$view->style_plugin->uses_row_plugin()) {
+    return;
+  }
+
+  $plugin = $view->display_handler->get_option('row_plugin');
+  if ($plugin == 'node') {
+    // Look for token matches in the output:
+    $matches = array();
+    $tokens = array();
+
+    // We want to change the look of the 'new' marker from the default, slightly:
+    $tokens['<span class="new">' . t('new') . '</span>'] = '<span class="new">(' . t('new') . ')</span>';
+
+    // Replace the Author Pane token with the actual Author Pane.
+    if (preg_match_all('/<!--post:author-pane-([\d]+)-->/us', $output, $matches)) {
+      foreach ($matches[1] as $match => $uid) {
+        $token = $matches[0][$match]; // This is the exact string that matched.
+        if (!isset($tokens[$token])) {
+          $account = user_load($uid);
+          $tokens[$token] = theme('author_pane', array(
+            'account' => $account,
+            'caller' => 'advanced_forum',
+            'picture_preset' => variable_get('advanced_forum_user_picture_preset', ''),
+            'context' => NULL,
+            'disable_css' => TRUE,
+            'join_date_type' => variable_get('advanced_forum_author_pane_join_date_type', 'short'),
+          ));
+        }
+      }
+    }
+
+    // Replace the Post edited token.
+    if (preg_match_all('/<!--post:post-edited-([\d]+)-->/us', $output, $matches)) {
+      foreach ($matches[1] as $match => $nid) {
+        $token = $matches[0][$match]; // This is the exact string that matched.
+        if (!isset($tokens[$token])) {
+          if (user_access('view last edited notice')) {
+            $sql = 'SELECT uid, log, timestamp FROM {node_revision} WHERE nid = %d ORDER BY timestamp DESC';
+            $row = db_fetch_object(db_query($sql, $nid));
+            $tokens[$token] = theme('advanced_forum_post_edited', array(
+              'who' => $row->uid,
+              'when' => $row->timestamp,
+              'why' => $row->log
+            ));
+          }
+          else {
+            // No access; remove token.
+            $tokens[$token] = '';
+          }
+        }
+      }
+    }
+
+    // Replace the core Signature token.
+    if (preg_match_all('/<!--post:signature-core-([\d]+)-->/us', $output, $matches)) {
+      foreach ($matches[1] as $match => $uid) {
+        $token = $matches[0][$match]; // This is the exact string that matched.
+        if (!isset($tokens[$token])) {
+          $account = user_load($uid);
+          if ($account->signature) {
+            $tokens[$token] = check_markup($account->signature, $account->signature_format, FALSE);
+          }
+        }
+      }
+    }
+
+    // Perform replacements.
+    $output = strtr($output, $tokens);
+  }
+}
+
+/**
+ * Display the "sort" widget. This is a specially hacked widget that only
+ * works with tablesorting. Tablesorting MUST be on for these widgets
+ * to appear.
+ */
+function advanced_forum_forum_topic_list_sort() {
+  $form_state = array(
+    'method' => 'get',
+    'no_redirect' => TRUE,
+    'rerender' => TRUE,
+    'input' => $_GET,
+    'drop tokens' => TRUE,
+  );
+
+  $form = drupal_build_form('advanced_forum_forum_topic_list_sort_form', $form_state);
+  return drupal_render($form);
+}
+
+function advanced_forum_forum_topic_list_sort_form($form_state) {
+  $view = views_get_view('advanced_forum_topic_list');
+  $view->set_display('default');
+  $view->init_handlers();
+  $view->init_style();
+
+  // Work up a list of possible fields.
+  $handler = &$view->style_plugin;
+  $fields = &$view->field;
+  $columns = $handler->sanitize_columns($handler->options['columns'], $fields);
+
+  $options = array();
+  foreach ($columns as $field => $column) {
+    if ($field == $column && empty($fields[$field]->options['exclude'])) {
+      if (empty($handler->options['info'][$field]['sortable']) || !$fields[$field]->click_sortable()) {
+        continue;
+      }
+      $label = check_plain(!empty($fields[$field]) ? $fields[$field]->label() : '');
+      $options[$field] = $label;
+    }
+  }
+
+  $form['inline'] = array(
+    '#prefix' => '<div class="container-inline">',
+    '#suffix' => '</div>',
+  );
+  $form['inline']['order'] = array(
+    '#type' => 'select',
+    '#title' => t('Order by'),
+    '#title_display' => 'invisible',
+    '#options' => $options,
+    '#default_value' => $handler->options['default'],
+  );
+
+  $form['inline']['sort'] = array(
+    '#type' => 'select',
+    '#title' => t('Sort'),
+    '#title_display' => 'invisible',
+    '#options' => array(
+      'asc' => t('Up'),
+      'desc' => t('Down'),
+    ),
+    '#default_value' => 'desc',
+  );
+
+  $form['inline']['submit'] = array(
+    '#id' => 'sort-topic-submit',
+    '#name' => '',
+    '#type' => 'submit',
+    '#value' => t('Sort'),
+  );
+
+  if (isset($_GET['page'])) {
+    $form['page'] = array(
+      '#type' => 'hidden',
+      '#default_value' => $_GET['page'],
+    );
+  }
+
+  if (!variable_get('clean_url', FALSE)) {
+    $form['q'] = array(
+      '#type' => 'hidden',
+      '#value' => $_GET['q'],
+    );
+  }
+
+  $view->destroy();
+  return $form;
+}
+
+// STATISTICS *****************************************************************/
+
+/**
+ * Count total amount of forum threads.
+ */
+function advanced_forum_statistics_topics() {
+  return db_query('SELECT COUNT(DISTINCT(nid)) FROM {forum}')->fetchField();
+}
+
+/**
+ * Counts total amount of replies. Initial posts are added to this total
+ * in the calling function.
+ *
+ * @param $delta
+ *   if not NULL, a numerical delta which should be applied to the count
+ * @param $refresh
+ * @param $refresh
+ *   TRUE if the stored count should be updated.
+ * @return
+ *   Total number of replies in the forum.
+ */
+function advanced_forum_statistics_replies($delta = NULL, $refresh = FALSE) {
+
+  if ($refresh || !($cache = cache_get('advanced_forum_stats_replies'))) {
+    $total_replies = db_query('SELECT SUM(comment_count) FROM {forum_index}')->fetchField();
+    cache_set('advanced_forum_stats_replies', $total_replies);
+  }
+  else {
+    $total_replies = $cache->data;
+  }
+
+
+  if (!empty($delta) && is_numeric($delta)) {
+    $total_replies += $delta;
+    cache_set('advanced_forum_stats_replies', $total_replies);
+  }
+
+  return $total_replies;
+}
+
+/**
+ * Count total amount of active users.
+ */
+function advanced_forum_statistics_users() {
+  return db_query('SELECT COUNT(uid) FROM {users} WHERE status = 1')->fetchField();
+}
+
+/**
+ * Return the newest X active (not blocked) users, linked to their profiles.
+ */
+function advanced_forum_statistics_latest_users() {
+  $number_to_fetch = 5; // @TODO: Make this a setting.
+
+  $query = db_select("users", "u")
+      ->fields("u", array("uid", "name"))
+      ->condition("status", 0, "<>")
+      ->condition("access", 0, "<>")
+      ->orderBy("created", "DESC");
+
+  $latest_users = $query->range(NULL, $number_to_fetch)->execute();
+  while ($account = $latest_users->fetchObject()) {
+    $list[] = theme('username', array('account' => $account));
+  }
+
+  return $list;
+}
+
+function advanced_forum_session_count($anonymous = TRUE) {
+
+  $interval = REQUEST_TIME - variable_get('user_block_seconds_online', 900);
+
+  $query = db_select("sessions", "s")
+      ->fields("s", array("uid"))
+      ->distinct()
+      ->condition('s.timestamp', $interval, '>=')
+      ->condition('s.uid', 0, $anonymous ? '=' : '>')
+      ->countQuery();
+
+  return $query->execute()->fetchField();
+}
+
+/**
+ * Return an array of online usernames, linked to their profiles.
+ */
+function advanced_forum_statistics_online_users() {
+  $list = array();
+
+  $interval = REQUEST_TIME - variable_get('user_block_seconds_online', 900);
+
+  $query = db_select("users", "u")->distinct()->fields("u", array("uid", "name"));
+  $s_alias = $query->join("sessions", "s", "u.uid = s.uid");
+
+  $query->addExpression("MAX({$s_alias}.timestamp)", "maxtime");
+  $query
+      ->condition("{$s_alias}.timestamp", $interval, ">=")
+      ->condition("{$s_alias}.uid", "0", ">")
+      ->groupBy("u.uid, u.name")
+      ->orderBy("maxtime", "DESC");
+
+  $authenticated_users = $query->execute();
+
+  while ($account = $authenticated_users->fetchObject()) {
+    $list[] = theme('username', array('account' => $account));
+  }
+
+  return $list;
+}
+
+// CALCULATING LINKS - New, Last, Etc *****************************************/
+
+function advanced_forum_get_reply_link($node) {
+  $reply_link = array();
+
+  $comment_setting = $node->comment;
+  $fragment = 'comment-form';
+
+  if ($comment_setting == COMMENT_NODE_OPEN) {
+
+    $allowed = FALSE;
+    if (module_exists('forum_access')) {
+      // get tid
+      if (!empty($node->taxonomy_forums)) {
+        reset($node->taxonomy_forums);
+        $langcode = key($node->taxonomy_forums);
+        if (!empty($node->taxonomy_forums[$langcode])) {
+          $tid = $node->taxonomy_forums[$langcode][0]['tid'];
+          if (forum_access_access('create', $tid)) {
+            $allowed = TRUE;
+          }
+        }
+      }
+    }
+    else {
+      $allowed = user_access('post comments');
+    }
+
+    if ($allowed) {
+      if (variable_get('comment_form_location_' . $node->type, COMMENT_FORM_SEPARATE_PAGE) == COMMENT_FORM_SEPARATE_PAGE) {
+        // Reply form is on separate page. Grab the href from the node links
+        // so it's automatically corrected for Node Comments if needed.
+        $reply_link['href'] = "comment/reply/$node->nid";
+        $reply_link['options']['fragment'] = $fragment;
+
+        $reply_link['class'] = 'reply-allowed';
+        $reply_link['title'] = t('Post reply');
+
+        return $reply_link;
+      }
+      else {
+        // Reply form is on same page. The reply button should jump down to it
+        // rather than going to a new page.
+        $reply_link['href'] = $_GET['q'];
+        $reply_link['options']['fragment'] = $fragment;
+        $current_page = isset($_GET['page']) ? $_GET['page'] : 0;
+        if ($current_page)
+          $reply_link['options']['query'] = array('page' => $current_page);
+
+        $reply_link['class'] = 'reply-allowed';
+        $reply_link['title'] = t('Quick reply');
+
+        return $reply_link;
+      }
+    }
+    else {
+      // User does not have access to post replies on this node.
+      return 'reply-forbidden';
+    }
+  }
+  else {
+    // Topic is locked.
+    return 'reply-locked';
+  }
+}
+
+/**
+ * Get a link to the last post in a topic.
+ *
+ * @param $node
+ *   Node object
+ * @return
+ *   Text linking to the last post in a topic.
+ */
+function advanced_forum_last_post_link($node) {
+  $last_comment_id = advanced_forum_last_post_in_topic($node->nid);
+  // Return empty link if post doesn't have comments.
+  if (empty($last_comment_id))
+    return '';
+
+  $last_page = advanced_forum_get_last_page($node);
+
+  if ($last_page > 0)
+    $query = array('page' => $last_page);
+
+  $options = array(
+    'html' => TRUE,
+    'query' => empty($query) ? array() : $query,
+    'fragment' => "comment-$last_comment_id",
+  );
+
+  return theme('advanced_forum_l', array(
+    'text' => t('Last post'),
+    'path' => "node/$node->nid",
+    'options' => $options,
+    'button_class' => 'large'
+  ));
+}
+
+/**
+ * Returns a link directly to the first new post in a topic.
+ *
+ * @param $node
+ *   Node object
+ * @param $comment_count
+ *   Number of comments on passed node.
+ * @return
+ *   Link to the first unread post.
+ */
+function advanced_forum_first_new_post_link($node, $comment_count) {
+  $nid = $node->nid;
+
+  $current_page = isset($_GET['page']) ? $_GET['page'] : 0;
+  $number_new_comments = advanced_forum_reply_num_new($nid);
+
+  if ($number_new_comments > 0) {
+    $page_of_first_new = advanced_forum_page_first_new($comment_count, $number_new_comments, $node);
+
+    // Note that we are linking to the cid anchor rather than "new" because
+    // the new links will be gone if we go to another page.
+    $cid_of_first_new = advanced_forum_first_new_comment($nid);
+
+    $number_new = t("(!new new)", array('!new' => $number_new_comments));
+
+    $options = array(
+      'html' => TRUE,
+      'query' => $page_of_first_new,
+      'fragment' => "comment-$cid_of_first_new"
+    );
+
+    return theme('advanced_forum_l', array(
+      'text' => t('First unread'),
+      'path' => "node/$nid",
+      'options' => $options,
+      'button_class' => 'large'
+    ));
+  }
+}
+
+/**
+ * Get the page number with the first new post.
+ */
+function advanced_forum_page_first_new($comment_count, $new_replies, $node) {
+  return comment_new_page_count($comment_count, $new_replies, $node);
+}
+
+/**
+ * Get the number of new posts on a topic.
+ */
+function advanced_forum_reply_num_new($nid, $timestamp = 0) {
+  // Make a static cache because this function is called twice from the topic
+  // header. Once to display the number and once to make the link to first new.
+  static $number_new_for_node = array();
+
+  // $nid is empty if new topic in preview.
+  if (empty($nid))
+    return 0;
+
+  if (empty($number_new_for_node[$nid])) {
+    global $user;
+
+    $node = node_load($nid);
+
+    // We must also check the forum post itself to see if we have viewed it
+    $viewed = 0; // If not told otherwise, it has been viewed before
+    if ($user->uid) {
+      $viewed = node_last_viewed($nid);
+      // Set it to 1 if it has not been viewed before.
+      $viewed = ($viewed == 0 ? 1 : 0);
+    }
+
+    $number_new_for_node[$nid] = comment_num_new($nid, $timestamp) + $viewed;
+  }
+
+  return $number_new_for_node[$nid];
+}
+
+/**
+ * Get the comment id of the last post in a topic.
+ *
+ * @param $node
+ *   Node object
+ * @return
+ *   cid of last post.
+ */
+function advanced_forum_last_post_in_topic($nid) {
+  // $nid is empty if new topic in preview.
+  if (empty($nid))
+    return NULL;
+
+  $node = node_load($nid);
+
+  // Comment module version
+  $query = 'SELECT c.cid
+            FROM {comment} c
+            WHERE c.nid = :nid AND c.status = :status
+            ORDER BY c.cid DESC';
+  $result = db_query_range($query, 0, 1, array(':nid' => $nid, ':status' => COMMENT_PUBLISHED))->fetchField();
+
+  return $result;
+}
+
+/**
+ * Returns the page number of the last page starting at 0 like the pager does.
+ */
+function advanced_forum_get_last_page($node) {
+  $comments_per_page = variable_get('comment_default_per_page_' . $node->type, 50);
+  $comment_count = isset($node->comment_count) ? $node->comment_count : 0;
+  $last_page = ceil($comment_count / $comments_per_page) - 1;
+  return $last_page;
+}
+
+/**
+ * Returns the ID of the first unread comment.
+ *
+ * @param $nid
+ *   Node ID
+ * @param $timestamp
+ *   Date/time used to override when the user last viewed the node.
+ * @return
+ *   Comment ID
+ */
+function advanced_forum_first_new_comment($nid, $timestamp = 0) {
+  global $user;
+
+  if ($user->uid) {
+    // Retrieve the timestamp at which the current user last viewed the
+    // specified node.
+    if (!$timestamp) {
+      $timestamp = node_last_viewed($nid);
+    }
+
+    // Set the timestamp to the limit if the node was last read past the cutoff
+    $timestamp = ($timestamp > NODE_NEW_LIMIT ? $timestamp : NODE_NEW_LIMIT);
+
+    // Use the timestamp to retrieve the oldest new comment.
+    $query = db_select('comment', 'c')
+        ->fields('c', array('cid'))
+        ->condition('nid', $nid)
+        ->condition('changed', $timestamp, '>')
+        ->condition('status', COMMENT_PUBLISHED)
+        ->range(0, 1)
+        ->execute();
+    return $query->fetchField();
+  }
+  else {
+    return 0;
+  }
+}
+
+// GENERAL UTILITY FUNCTIONS *************************************************/
+
+/**
+ * Return an array of node types allowed in a given vocabulary or term ID.
+ */
+function advanced_forum_allowed_node_types($tid = 0) {
+  if (module_exists('forum_access')) {
+    // Check with forum access to see if this forum allows node creation.
+    // If it doesn't, send back an empty list.
+    if (!forum_access_access('create', $tid)) {
+      return array();
+    }
+  }
+
+  $field = field_info_field('taxonomy_forums');
+  if (!empty($field['bundles']['node'])) {
+    return $field['bundles']['node'];
+  }
+  else {
+    return array();
+  }
+}
+
+/**
+ * Return whether a given node type is allowed in the whole forum or given forum.
+ */
+function advanced_forum_type_is_in_forum($node, $tid = 0) {
+  $vid = (empty($vid)) ? variable_get('forum_nav_vocabulary', 0) : $vid;
+  if (!empty($node->taxonomy_forums)) {
+    // Check for language used
+    if (!isset($node->taxonomy_forums[$node->language])) {
+      $langcode = LANGUAGE_NONE;
+    }
+    else {
+      $langcode = $node->language;
+    }
+
+    foreach ($node->taxonomy_forums[$langcode] as $tforum) {
+      if (!isset($tforum['taxonomy_term'])) {
+        continue;
+      }
+      if (($tforum['taxonomy_term']->vid == $vid) || ($tforum['taxonomy_term']->tid == $tid))
+        return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Generate a list of node creation links for a forum.
+ *
+ * This is used on the forum list, allowing us to have direct
+ * links to create new nodes in the forum.
+ */
+function advanced_forum_node_type_create_list($tid) {
+  $allowed_types = advanced_forum_allowed_node_types($tid);
+
+  // Ensure "new topic" is first.
+  if (isset($allowed_types['forum'])) {
+    unset($allowed_types['forum']);
+    array_unshift($allowed_types, 'forum');
+  }
+  // Loop through all node types allowed in this forum.
+  foreach ($allowed_types as $type) {
+    // Check if this node type can be created by current user.
+    if (node_access('create', $type)) {
+      // Fetch the "General" name of the content type.
+      $node_type = t(node_type_get_name($type));
+
+      // Remove the word "Forum" out of "Forum topic" to shorten it.
+      // @TODO: this is a little dodgy and may not work right with
+      // translations. Should be replaced if there's a better way.
+      $node_type = str_replace('Forum', '', $node_type);
+
+      // Push the link with title and url to the array.
+      $forum_types[$type] = array(
+        'name' => $node_type,
+        'href' => 'node/add/' . str_replace('_', '-', $type) . '/' . $tid,
+      );
+    }
+  }
+
+  if (empty($forum_types)) {
+    // The user is logged-in; but denied access to create any new forum content type.
+    global $user;
+    if ($user->uid) {
+      return t('You are not allowed to post new content in the forum.');
+    }
+    // The user is not logged-in; and denied access to create any new forum content type.
+    else {
+      return t('<a href="@login">Log in</a> to post new content in the forum.', array(
+        '@login' => url('user/login', array('query' => drupal_get_destination())),
+      ));
+    }
+  }
+  else {
+    return $forum_types;
+  }
+}
+
+/**
+ * Create a drop down list of forum actions.
+ */
+function advanced_forum_forum_tools($tid = 0) {
+  global $user;
+  $options = array();
+
+  ctools_include('jump-menu');
+  if ($tid > 0) {
+    $select[url("forum/active", array('query' => array('forum[]' => $tid)))] = t("View active posts in this forum");
+    $select[url("forum/unanswered", array('query' => array('forum[]' => $tid)))] = t("View unanswered posts in this forum");
+
+    if ($user->uid) {
+      $select[url("forum/new", array('query' => array('forum[]' => $tid)))] = t("View new posts in this forum");
+    }
+  }
+  else {
+    $select[url("forum/active")] = t("View active forum posts");
+    $select[url("forum/unanswered")] = t("View unanswered forum posts");
+
+    if ($user->uid) {
+      $select[url("forum/new")] = t("View new forum posts");
+    }
+  }
+
+  // Add mark as read to the jump list.
+  // This code is a little odd and needs explaining. The return value of
+  // the mark_as_read function is already formed HTML and so is unsuitable
+  // for the jump list. The function already has built in the ability
+  // to add to an existing $links array, which has the URL and title text
+  // separated. Rather than add a third method just for the jump menu, I
+  // reused that functionality here.
+  $mark_as_read = array();
+  advanced_forum_get_mark_read_link($tid, $mark_as_read);
+  if (!empty($mark_as_read['mark-read']['href'])) {
+    $select[url($mark_as_read['mark-read']['href'])] = $mark_as_read['mark-read']['title'];
+  }
+
+  $options['choose'] = t("- Forum Tools -");
+
+  // Create and return the jump menu.
+  $form = drupal_get_form('ctools_jump_menu', $select, $options);
+  return drupal_render($form);
+}
+
+/**
+ * Creates a pager to place on each multi-page topic of the topic listing page.
+ *
+ * @param $max_pages_to_display
+ *   Number of pages to include on the pager.
+ * @param $topic
+ *   Topic object to create a pager for.
+ * @return
+ *   Object containing the linked pages ready assembly by the theme function.
+ */
+function advanced_forum_create_topic_pager($max_pages_to_display, $topic) {
+  // Find the number of comments per page for the node type of the topic.
+  $comments_per_page = variable_get('comment_default_per_page_' . $topic->type, 50);
+
+  if ($max_pages_to_display > 0 && $topic->comment_count > $comments_per_page) {
+    // Topic has more than one page and a pager is wanted. Start off the
+    // first page because that doesn't have a query.
+    $pager_array = array();
+    $current_display_page = 1;
+    $pager_array[0] = l('1', "node/$topic->nid");
+
+    // Find the ending point. The pager URL is always 1 less than
+    // the number being displayed because the first page is 0.
+    $last_display_page = ceil($topic->comment_count / $comments_per_page);
+    $last_pager_page = $last_display_page - 1;
+
+    // Add pages until we run out or until we hit the max to show.
+    while (($current_display_page < $last_display_page) && ($current_display_page < $max_pages_to_display)) {
+      // Move to the next page
+      $current_display_page++;
+
+      // The page number we link to is 1 less than what's displayed
+      $link_to_page = $current_display_page - 1;
+
+      // Add the link to the array
+      $pager_array[$link_to_page] = l($current_display_page, "node/$topic->nid", array('query' => array('page' => $link_to_page)));
+    }
+
+    // Move to the next page
+    $current_display_page++;
+
+    if ($current_display_page == $last_display_page) {
+      // We are one past the max to display, but it's the last page,
+      // so putting the ...last is silly. Just display it normally.
+      $link_to_page = $current_display_page - 1;
+      $pager_array[$link_to_page] = l($current_display_page, "node/$topic->nid", array('query' => array('page' => $link_to_page)));
+    }
+
+    if ($current_display_page < $last_display_page) {
+      // We are one past the max to display and still aren't
+      // on the last page, so put in ... Last Page(N)
+      $text = t('Last Page');
+      $pager_last_text = l($text, "node/$topic->nid", array('query' => array('page' => $last_pager_page)));
+      $pager_last_number = l($last_display_page, "node/$topic->nid", array('query' => array('page' => $last_pager_page)));
+      // Create last page array to enable more customization for themers.
+      $pager_last = array(
+        'number' => $last_display_page,
+        'link' => "node/$topic->nid",
+        'options' => array('query' => array('page' => $last_pager_page)),
+      );
+    }
+
+    $topic_pager = new stdClass();
+    $topic_pager->initial_pages = (empty($pager_array)) ? array() : $pager_array;
+    $topic_pager->last_page_text = (empty($pager_last_text)) ? '' : $pager_last_text;
+    $topic_pager->last_page_number = (empty($pager_last_number)) ? '' : $pager_last_number;
+    $topic_pager->last_page = (empty($pager_last)) ? array() : $pager_last;
+
+    return $topic_pager;
+  }
+}
+
+/**
+ * Create a drop down list of forum hierarchy
+ */
+function advanced_forum_forum_jump($tid = 0) {
+  global $user;
+  ctools_include('jump-menu');
+  $select = array();
+  $options = array();
+  $vid = variable_get('forum_nav_vocabulary', 0);
+  if ($tid > 0) {
+    $forum_tree = taxonomy_get_tree($vid);
+    foreach ($forum_tree as $forum) {
+      $select[url("forum/" . $forum->tid)] = str_repeat("-", $forum->depth) . $forum->name;
+    }
+  }
+  else {
+    // nothing
+  }
+
+  $options['choose'] = t("- Select a forum -");
+
+  // Create and return the jump menu.
+  $form = drupal_get_form('ctools_jump_menu', $select, $options);
+  return drupal_render($form);
+}
+
+/**
+ * Calculates the number of unread replies for each forum and returns the
+ * count for the requested forum.
+ */
+function advanced_forum_unread_replies_in_forum($tid, $uid) {
+  static $result_cache = NULL;
+
+  if (is_null($result_cache)) {
+    $result_cache = array();
+
+    $query = db_select("comment", "c");
+    $f_alias = $query->join("forum", "f", "c.nid = f.nid");
+    //$n_alias = $query->join("node", "n", "f.vid = n.vid");
+    $h_alias = $query->leftJoin("history", "h", "c.nid = h.nid AND h.uid = :uid", array(":uid" => $uid));
+    $query->addExpression("COUNT(DISTINCT(c.cid))", "count");
+    $query->addField($f_alias, "tid");
+
+    $query->condition("c.status", COMMENT_PUBLISHED)
+        ->condition("c.changed", NODE_NEW_LIMIT, ">")
+        ->condition(db_or()->where("c.changed > {$h_alias}.timestamp")->isNull("h.timestamp"))
+        ->groupBy("{$f_alias}.tid")
+        ->addTag("node_access");
+
+    $result = $query->execute();
+    foreach ($result as $row) {
+      $result_cache[$row->tid] = $row->count;
+    }
+  }
+
+  return (isset($result_cache[$tid])) ? $result_cache[$tid] : 0;
+}
+
+/**
+ * Returns the display position of a given reply post ID on a given node.
+ */
+function advanced_forum_post_position($node, $comment) {
+  static $post_order = array();
+
+  if (empty($node) || empty($comment)) {
+    return 0;
+  }
+
+  $node_id = $node->nid;
+  $post_id = $comment->pid;
+
+  if (!isset($post_order[$node_id])) {
+    // Initialize the spot for this node's list.
+    $post_order[$node_id] = array();
+
+    $mode = variable_get('comment_default_mode_' . $node->type, COMMENT_MODE_THREADED);
+
+    // Get the list of CIDs from the database in order of oldest first.
+    // We are going to make that assumption for now for simplicity but may
+    // revisit in the future if there are requests for newest first.
+    $query = db_select('comment', 'c')
+        ->fields('c', array('cid'))
+        ->condition('c.nid', $node_id)
+        ->addTag('node_access')
+        ->addTag('comment_filter');
+
+    if ($mode === COMMENT_MODE_FLAT) {
+      $query->orderBy('c.cid', 'ASC');
+    }
+    else {
+      $query->addExpression('SUBSTRING(c.thread, 1, (LENGTH(c.thread) - 1))', 'torder');
+      $query->orderBy('torder', 'ASC');
+    }
+
+    $query = $query->execute();
+    // Cycle through the results and fill in the array.
+    while ($post = $query->fetchAssoc()) {
+      $post_order[$node_id][] = reset($post);
+    }
+  }
+
+  // Find the position of the passed in post ID.
+  $post_position = 0;
+  if (is_array($post_order[$node_id])) {
+    if (($index = array_search($post_id, $post_order[$node_id])) !== FALSE) {
+      $post_position = $index;
+
+      // We need to add 2 because the array starts at 0 and also because the topic
+      // node is post #1 on display but is not included in the index.
+      $post_position = $post_position + 2;
+    }
+  }
+
+  return $post_position;
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/advanced_forum_preprocess_comment.inc b/htmltest/sites/all/modules/advanced_forum/includes/advanced_forum_preprocess_comment.inc
new file mode 100644
index 00000000..3c44636c
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/advanced_forum_preprocess_comment.inc
@@ -0,0 +1,167 @@
+<?php
+
+/**
+ * @file
+ * Holds the contents of a preprocess function moved into its own file
+ * to ease memory requirements and having too much code in one file.
+ */
+function _advanced_forum_preprocess_comment(&$variables) {
+  /* Easy links to the comment and parent node */
+  $comment = $variables['comment'];
+  $node = node_load($comment->nid);
+  $variables['first_post'] = $node;
+
+  // This is a comment, not the node.
+  $variables['top_post'] = FALSE;
+
+  /* Determine the template file to use for the comment. */
+  if (arg(1) == 'reply' || arg(2) == 'edit') {
+    // Use the preview version
+    advanced_forum_add_template_suggestions("post-preview", $variables);
+  }
+  else {
+    // Use our combined node/comment template file
+    advanced_forum_add_template_suggestions("post", $variables);
+  }
+
+
+  // Add in our classes overwriting existing.
+  $variables['classes_array'] = array();
+  $variables['classes_array'][] = 'forum-post clearfix';
+
+  // Add the current language to the classes for image handling.
+  global $language;
+  if (!empty($language->language)) {
+    $variables['classes_array'][] = $language->language;
+  }
+
+  // Add the poster's UID
+  $variables['classes_array'][] = "posted-by-$comment->uid";
+
+  // Add class if the poster is the viewer.
+  global $user;
+  if ($user->uid > 0 && $user->uid == $comment->uid) {
+    $variables['classes_array'][] = "post-by-viewer";
+  }
+
+  // Add class if the poster is the topic starter.
+  if ($node->uid > 0 && $node->uid == $comment->uid) {
+    $variables['classes_array'][] = "post-by-starter";
+  }
+
+  // Set the post ID for theming / targetting
+  $variables['post_id'] = "post-$comment->cid";
+
+  
+
+  $num_comments = $node->comment_count;
+  $posts_per_page = variable_get('comment_default_per_page_' . $node->type, 50);
+
+  $page_number = !empty($_GET['page']) ? $_GET['page'] : 0;
+
+  // page_number sanity check
+  if ($page_number > floor($num_comments / $posts_per_page))
+    $page_number = floor($num_comments / $posts_per_page);
+
+  if (!$page_number) {
+    $page_number = 0;
+  }
+  
+  /* Linked post number */
+  if (!isset($post_number)) {
+    static $post_number = 1;
+  }
+ 
+  // check if node type is forum
+  $topic_id = advanced_forum_node_is_styled($variables['node']);
+  $post_number_delta = ($topic_id) ? 1 : 0;
+   
+  $linktext = '#' . (($page_number * $posts_per_page) + $post_number + $post_number_delta);
+  
+  $post_number++;
+  
+  // Permalink
+  //  You can erase next 3 lines if you wish to use built-in Permalink.
+  //  Template adjusted: $post_link -> $permalink
+  $uri = entity_uri('comment', $comment);
+  $uri['options'] += array('attributes' => array('class' => array('permalink'), 'rel' => 'bookmark'));
+  $variables['permalink'] = l($linktext, $uri['path'], $uri['options']);
+
+  /* In reply to */
+  $variables['in_reply_to'] = "";
+  if ($comment->pid > 0) {
+    // Find the display position of the parent post;.
+    $post_position = advanced_forum_post_position($node, $comment);
+
+    // This extra if test is a sanity check in case the comment being replied
+    // to no longer exists.
+    if ($post_position > 0) {
+      // Find the page the post is on. We need to compensate for the topic node
+      // being #1 which puts an extra post on the first page but not on the rest.
+      $page_number = floor(($post_position - 2) / $posts_per_page);
+
+      // Assemble the link.
+      $fragment = 'comment-' . $comment->pid;
+
+      if ($page_number)
+        $query = array('page' => $page_number);
+
+      $linktext = t("(Reply to #!post_position)", array('!post_position' => $post_position));
+      $linkpath = "node/$node->nid";
+      $variables['in_reply_to'] = l($linktext, $linkpath, array('query' => empty($query) ? array() : $query, 'fragment' => $fragment));
+    }
+  }
+
+  /* Title */
+  if (variable_get('comment_subject_field_' . $node->type, 1) == 0) {
+    // if comment titles are disabled, don't display it.
+    $variables['title'] = '';
+  }
+  else {
+    // Assign the subject to the title variable for consistancy with nodes.
+    $variables['title'] = check_plain($comment->subject);
+  }
+
+  $variables['account'] = new stdClass();
+  /* User information / author pane */
+  if ($comment->uid == 0) {
+    // Anonymous user. Make a fake user object for theme_username
+    $variables['account']->name = empty($comment->name) ? "" : $comment->name;
+    $variables['account']->homepage = empty($comment->homepage) ? "" : $comment->homepage;
+    $variables['account']->email = empty($comment->email) ? "" : $comment->email;
+  }
+  else {
+    // Load up the real user object
+    $variables['account'] = user_load($comment->uid);
+  }
+
+  // Create the author pane
+  if (module_exists('author_pane')) {
+    $variables['author_pane'] = theme('author_pane', array(
+      'account' => $variables['account'],
+      'caller' => 'advanced_forum',
+      'picture_preset' => variable_get('advanced_forum_user_picture_preset', ''),
+      'context' => $comment,
+      'disable_css' => TRUE,
+      'join_date_type' => variable_get('advanced_forum_author_pane_join_date_type', 'short'),
+        ));
+  }
+  else {
+    $variables['author_pane'] = theme('advanced_forum_simple_author_pane', array('context' => $comment));
+  }
+  /* Content */
+  // Helpful $content variable for templates.
+  foreach (element_children($variables['elements']) as $key) {
+    // Adjust content vriable to suit post template
+    if ($key == 'comment_body')
+      $variables['content']['body'] = $variables['elements'][$key];
+    else
+      $variables['content'][$key] = $variables['elements'][$key];
+  }
+
+  // Adjust comment timestamp to match node template
+  $variables['date'] = $variables['created'];
+
+  /* Post edited */
+  $variables['post_edited'] = (isset($variables['comment_edited'])) ? $variables['comment_edited'] : "";
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/advanced_forum_preprocess_forum_list.inc b/htmltest/sites/all/modules/advanced_forum/includes/advanced_forum_preprocess_forum_list.inc
new file mode 100644
index 00000000..086c8e92
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/advanced_forum_preprocess_forum_list.inc
@@ -0,0 +1,390 @@
+<?php
+
+/**
+ * @file
+ * Holds the contents of a preprocess function moved into its own file
+ * to ease memory requirements and having too much code in one file.
+ */
+function _advanced_forum_preprocess_forum_list(&$variables) {
+  advanced_forum_add_template_suggestions("forum_list", $variables);
+
+  // Added variable for default collapsed configuration
+  $variables['collapsed_main_list'] = variable_get('advanced_forum_default_collapsed_list', array());
+
+  // Add needed items for the collapsible containers.
+  $collapsible = variable_get('advanced_forum_collapsible_containers', 'toggle');
+  $variables['collapsible'] = FALSE;
+  if ($collapsible != 'none') {
+    drupal_add_library('system', 'jquery.cookie');
+    drupal_add_js(drupal_get_path('module', 'advanced_forum') . '/js/advanced_forum.js');
+    $settings['advanced_forum'] = array(
+      'modulePath' => drupal_get_path('module', 'advanced_forum'),
+      'effect' => $collapsible,
+      'default_collapsed_list' => $variables['collapsed_main_list'],
+    );
+
+    drupal_add_js($settings, array('type' => 'setting'));
+    $variables['collapsible'] = TRUE;
+  }
+
+  // The tid is the ID of the container or forum we are in. Assign it to
+  // $parent_id for easy reference, assign it to the forum_id template variable
+  // to give it a nice name for themers, then get rid of the original variable.
+  $parent_id = isset($variables['tid']) ? $variables['tid'] : 0;
+  $variables['forum_id'] = $parent_id;
+
+  unset($variables['tid']);
+
+  $variables['use_taxonomy_image'] = (function_exists('taxonomy_image_display') && variable_get('advanced_forum_use_taxonomy_image', TRUE));
+
+  // Process the containers and forums and move them to a new variable.
+  $items = array();
+  $lowest_depth = 0;
+  foreach ($variables['forums'] as $id => $forum) {
+    if (empty($forum->container)) {
+      $items[$id] = advanced_forum_process_forum($forum);
+    }
+    else {
+      $items[$id] = advanced_forum_process_container($forum);
+    }
+
+    // Figure out how deep the hierarchy goes for the next step.
+    if ($forum->depth > $lowest_depth) {
+      $lowest_depth = $forum->depth;
+    }
+  }
+
+  // Calculate number of and number of new child posts for each item.
+  for ($depth = $lowest_depth + 1; $depth > 0; $depth--) {
+    foreach ($items as $id => $item) {
+      if ($depth <= $lowest_depth) {
+        if (empty($item->depth)) {
+          $item->depth = 0;
+        }
+        if ($item->depth == $depth) {
+          $items[$item->parents[0]]->child_total_topics += $item->total_topics + $item->child_total_topics;
+          $items[$item->parents[0]]->child_new_topics += $item->new_topics + $item->child_new_topics;
+          $items[$item->parents[0]]->child_total_posts += $item->total_posts + $item->child_total_posts;
+          $items[$item->parents[0]]->child_new_posts += $item->new_posts + $item->child_new_posts;
+        }
+      }
+
+      if ($item->depth + 1 == $depth) {
+        $parent = $items[$id]->parents[0];
+        if (($parent != 0) && (!empty($items[$item->parents[0]]))) {
+          $items[$item->parents[0]]->total_posts += $item->total_posts;
+          $items[$item->parents[0]]->total_topics += $item->total_topics;
+          $items[$item->parents[0]]->new_posts += $item->new_posts;
+          $items[$item->parents[0]]->new_topics += $item->new_topics;
+          if (isset($items[$parent]->link)) {
+            $items[$parent]->new_posts_link = $items[$parent]->link . "#new";
+            $items[$parent]->new_topics_link = $items[$parent]->link . "#new";
+          }
+          $items[$parent]->new_topics_text = $items[$parent]->new_topics . " new";
+          $items[$parent]->new_posts_text = $items[$parent]->new_posts . " new";
+        }
+      }
+    }
+  }
+
+  // Loop through all the items and fill the $tables variable that will
+  // hold all the tables with the containers and forums organized, processed,
+  // and ready for the template.
+  if ($parent_id) {
+    // On a container page. Fake the main table.
+    $table_counter = 1;
+    $tables[$table_counter]['table_info'] = advanced_forum_process_container($variables['parents'][0]);
+  }
+  else {
+    $table_counter = 0;
+  }
+
+  // workaround for container-less forums on main page
+  $depth_offset = 0;
+  foreach ($items as $id => $item) {
+    // Get a handle on the parent of this item.
+    if ($parent_id && $item->depth == 0) {
+      // If we are on a container page, the parent of root items is the main
+      // container that is being used for the table info.
+      $parent = $tables[$table_counter]['table_info'];
+    }
+    elseif (!empty($variables['forums'][$item->parents[0]])) {
+      // For simplicity, we assume forums/containers have only one parent.
+      $parent = $variables['forums'][$item->parents[0]];
+    }
+    else {
+      $depth_offset = 0;
+    }
+
+    // If we aren't on the main forum page, we need to bump up the depth.
+    $item_depth = ($parent_id) ? $item->depth + 1 : $item->depth;
+    $item_depth += $depth_offset;
+
+    if (!empty($item->container)) {
+      // CONTAINERS.
+      if ($item_depth == 0) {
+        // Top level container always starts a new table.
+        $table_counter++;
+        $tables[$table_counter]['table_info'] = $item;
+        $tables[$table_counter]['items'] = array();
+
+        // Reset the striping.
+        advanced_forum_stripe(TRUE);
+      }
+      elseif ($item_depth == 1) {
+        // Subcontainer at top level is treated like a forum.
+        // We set the forum icon here, rather than in the process_forum
+        // function because we need to take into account new content
+        // in children.
+        if ($item->new_topics || $item->new_posts || $item->child_new_topics || $item->child_new_posts) {
+          $item->icon_classes = "forum-list-icon forum-list-icon-new-posts";
+          $item->icon_text = t("New posts");
+        }
+        else {
+          $item->icon_classes = "forum-list-icon forum-list-icon-default";
+          $item->icon_text = t("No new");
+        }
+
+        // Set the variable to control the row striping.
+        $item->zebra = advanced_forum_stripe();
+
+        // Add the container info to the table's item list.
+        $tables[$table_counter]['items'][$id] = $item;
+      }
+      elseif ($item_depth == 2) {
+        // A container elsewhere gets added to the parent's subcontainer list.
+        $tables[$table_counter]['items'][$parent->tid]->subcontainer_list[$id] = $item;
+      }
+    }
+    else {
+      // FORUMS.
+      // We set the forum icon here, rather than in the process_forum
+      // function because we need to take into account new content
+      // in children.
+      if ($item->new_topics || $item->new_posts || $item->child_new_topics || $item->child_new_posts) {
+        $item->icon_classes = "forum-list-icon forum-list-icon-new-posts";
+        $item->icon_text = t("New posts");
+      }
+      else {
+        $item->icon_classes = "forum-list-icon forum-list-icon-default";
+        $item->icon_text = t("No new");
+      }
+
+      if ($item_depth == 0) {
+        // This is a forum at the root. If it is the first or the first
+        // since the last container, make a new table. Otherwise, put it in
+        // the previous table.
+        if (empty($table_counter) || !empty($tables[$table_counter]['table_info']->container)) {
+          // This is the first root item or the current table belongs to a
+          // container. Start a new generic one. We need a tid so just grab
+          // the tid of the current forum for it.
+          $table_counter++;
+          if (!isset($tables[$table_counter]['table_info']))
+            $tables[$table_counter]['table_info'] = new stdClass();
+          $tables[$table_counter]['table_info']->name = t('Forums');
+          $tables[$table_counter]['table_info']->description = '';
+          $tables[$table_counter]['table_info']->tid = $item->tid;
+
+          // Reset the striping.
+          advanced_forum_stripe(TRUE);
+          $depth_offset = 1;
+        }
+
+        // Set the variable to control the row striping.
+        $item->zebra = advanced_forum_stripe();
+
+        // Add the forum info to the table's item list.
+        $tables[$table_counter]['items'][$id] = $item;
+      }
+      elseif ($item_depth == 1) {
+        // Main forum. Add it to the item list.
+        if (empty($item->container)) {
+          $item->zebra = advanced_forum_stripe();
+        }
+
+        $tables[$table_counter]['items'][$id] = $item;
+      }
+      elseif ($item_depth == 2) {
+        // Subforum.
+        $tables[$table_counter]['items'][$parent->tid]->subforum_list[$id] = $item;
+      }
+    }
+  }
+
+  // Theme subcontainers and subforums.
+  foreach ($tables as $table_id => $table) {
+    foreach ($table['items'] as $item_id => $item) {
+      if (!empty($item->subforum_list)) {
+        $tables[$table_id]['items'][$item_id]->subforums = theme('advanced_forum_subforum_list', array('subforum_list' => $item->subforum_list));
+      }
+
+      if (!empty($item->subcontainer_list)) {
+        $tables[$table_id]['items'][$item_id]->subcontainers = theme('advanced_forum_subcontainer_list', array('subcontainer_list' => $item->subcontainer_list));
+      }
+    }
+  }
+
+  $variables['tables'] = $tables;
+
+  // Remove unneeded variables.
+  unset($variables['zebra']);
+}
+
+function advanced_forum_stripe($reset = FALSE) {
+  static $stripe = 'odd';
+
+  if ($reset) {
+    $stripe = 'odd';
+  }
+  else {
+    $stripe = ($stripe == 'odd') ? 'even' : 'odd';
+  }
+
+  return $stripe;
+}
+
+/**
+ * Prepare an individual container for display.
+ */
+function advanced_forum_process_container($container) {
+  // Create the link to the container.
+  $container->link = url("forum/$container->tid");
+
+  // Sanitise the name and description so they can be safely printed.
+  $container->name = check_plain($container->name);
+  $container->description = !empty($container->description) ? filter_xss_admin($container->description) : '';
+
+  // Create a variable to check if the item is a container in the template.
+  $container->is_container = TRUE;
+
+  // @TODO: Make the icon change if subforums have posts.
+  $container->icon_classes = "forum-list-icon forum-list-icon-default";
+  $container->icon_text = t("No new");
+
+  // Initialize these variables to avoid notices later.
+  $container->total_topics = 0;
+  $container->new_topics = 0;
+  $container->total_posts = 0;
+  $container->new_posts = 0;
+  $container->child_total_topics = 0;
+  $container->child_new_topics = 0;
+  $container->child_total_posts = 0;
+  $container->child_new_posts = 0;
+
+  // Rename these to make them more descriptive.
+  if (isset($container->num_topics)) {
+    $container->total_topics = $container->num_topics;
+    unset($container->num_topics);
+  }
+
+  if (isset($container->num_posts)) {
+    $container->total_posts = $container->num_posts;
+    unset($container->num_posts);
+  }
+
+  return $container;
+}
+
+/**
+ * Prepare an individual forum for display.
+ */
+function advanced_forum_process_forum($forum) {
+  // Create a variable to check if the item is a container in the template.
+  $forum->is_container = FALSE;
+
+  // Create the link to the forum.
+  $forum->link = url("forum/$forum->tid");
+
+  // Sanitise the name and description so they can be safely printed.
+  // We don't do this for subforum names because that is sent through l()
+  // in the theme function which runs it through check_plain().
+  $forum->name = empty($forum->parents[0]) ? check_plain($forum->name) : $forum->name;
+  $forum->description = !empty($forum->description) ? filter_xss_admin($forum->description) : '';
+
+  // Initialize these variables to avoid notices later since not all forums
+  // have new content or even any content at all.
+  $forum->total_topics = 0;
+  $forum->child_total_topics = 0;
+
+  $forum->new_topics = 0;
+  $forum->new_topics_text = '';
+  $forum->new_topics_link = '';
+  $forum->child_new_topics = 0;
+
+  $forum->total_posts = 0;
+  $forum->child_total_posts = 0;
+
+  $forum->new_posts = 0;
+  $forum->new_posts_text = '';
+  $forum->new_posts_link = '';
+  $forum->child_new_posts = 0;
+
+  // Rename these to make them more descriptive.
+  if (isset($forum->num_topics)) {
+    $forum->total_topics = $forum->num_topics;
+    unset($forum->num_topics);
+  }
+
+  if (isset($forum->num_posts)) {
+    $forum->total_posts = $forum->num_posts;
+    unset($forum->num_posts);
+  }
+
+  // If the viewer is authenticated, check for new topics and posts.
+  global $user;
+  if ($user->uid) {
+    // New topics.
+    $forum->new_topics = _forum_topics_unread($forum->tid, $user->uid);
+    if ($forum->new_topics) {
+      $forum->new_topics_text = format_plural($forum->new_topics, '1 new', '@count new');
+      $forum->new_topics_link = url("forum/$forum->tid", array('fragment' => 'new'));
+    }
+
+    // New posts are optional because the query is slow.
+    if (variable_get('advanced_forum_get_new_comments', 0)) {
+      $forum->new_posts = advanced_forum_unread_replies_in_forum($forum->tid, $user->uid) + $forum->new_topics;
+
+      if ($forum->new_posts) {
+        $forum->new_posts_text = format_plural($forum->new_posts, '1 new', '@count new');
+        $forum->new_posts_path = "forum/$forum->tid";
+        $forum->new_posts_link = url("forum/$forum->tid", array('fragment' => 'new'));
+      }
+    }
+  }
+
+  // Process the "last post" object into a printable string.
+  // Trying to copy the string back into the variable directly caused odd bugs
+  // so we move it to a temp variable then unset the original.
+  // Before doing so, however, we make a copy in case another module implementing
+  // hook_TYPE_alter() needs access to the raw data.
+  $forum->last_post_obj = empty($forum->last_post) ? new stdClass() : $forum->last_post;
+  $last_post = (empty($forum->last_post)) ? '' : $forum->last_post;
+  unset($forum->last_post);
+  $forum->last_post = theme('forum_submitted', array('topic' => $last_post));
+
+  // Display forum images using Field API
+  $entity = entity_load('taxonomy_term', array($forum->tid));
+  $field_name = variable_get('advanced_forum_forum_image_field', '');
+
+  if (!empty($entity[$forum->tid]->$field_name)) {
+    $field = $entity[$forum->tid]->$field_name;
+    global $language;
+    $langcode = isset($field[$language->language]) ? $language->language : LANGUAGE_NONE;
+
+    if (isset($field[$langcode])) {
+      $display = array(
+        'label' => 'hidden',
+        'type' => 'image',
+        'settings' => array(
+          'image_style' => variable_get('advanced_forum_forum_image_preset', ''),
+          'image_link' => '',
+        ),
+      );
+      $output = field_view_value('taxonomy_term', $entity[$forum->tid], $field_name, $field[$langcode][0], $display);
+      $forum->forum_image = render($output);
+    }
+  }
+
+  drupal_alter('advanced_forum', $forum);
+  return $forum;
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/advanced_forum_preprocess_forums.inc b/htmltest/sites/all/modules/advanced_forum/includes/advanced_forum_preprocess_forums.inc
new file mode 100644
index 00000000..cf31aa7c
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/advanced_forum_preprocess_forums.inc
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Holds the contents of a preprocess function moved into its own file
+ * to ease memory requirements and having too much code in one file.
+ */
+
+function _advanced_forum_preprocess_forums(&$variables) {
+  $variables['forums_defined'] = count($variables['forums']) || count($variables['parents']);
+
+  advanced_forum_add_template_suggestions("forums", $variables);
+  $tid = intval($variables['tid']);
+
+  if (!empty($variables['forums'])) {
+    $variables['forums'] = theme('forum_list', $variables);
+  }
+  else {
+    $variables['forums'] = '';
+  }
+
+  if (intval(arg(1)) == 0) {
+    // We're on the front page of the forums.
+
+    // Remove forum description.
+    $variables['forum_description'] = '';
+
+    // This is normally attached to the topic list so we need to create it
+    // here as well since the main page has no topics.
+    $variables['forum_tools'] = advanced_forum_forum_tools(0);
+
+    // Fetch the forum statistics.
+    $variables['forum_statistics'] = '';
+    if (user_access('view forum statistics')) {
+      $variables['forum_statistics'] = theme('advanced_forum_statistics');
+    }
+
+    // Fetch the forum legend.
+    $variables['forum_legend'] = theme('advanced_forum_forum_legend');
+  }
+  else {
+    // Grab the forum description and make it available to the template file
+    $forum = taxonomy_term_load($tid);
+    $variables['forum_description'] = $forum->description;
+
+    // Get the themed list of node types that can be posted in this forum.
+    $variables['forum_links'] = theme('advanced_forum_node_type_create_list', array('forum_id' => $variables['tid']));
+
+    // Set a variable for displaying the topic legend.
+    $variables['topic_legend'] = theme('advanced_forum_topic_legend');
+  }
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/advanced_forum_preprocess_node.inc b/htmltest/sites/all/modules/advanced_forum/includes/advanced_forum_preprocess_node.inc
new file mode 100644
index 00000000..a5b369b2
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/advanced_forum_preprocess_node.inc
@@ -0,0 +1,139 @@
+<?php
+
+/**
+ * @file
+ * Holds the contents of a preprocess function moved into its own file
+ * to ease memory requirements and having too much code in one file.
+ */
+
+function _advanced_forum_preprocess_node(&$variables) {
+  /* Shortcut variables */
+  $node = $variables['node'];
+
+  // Determine the template file to use for the node.
+  if (isset($_GET['page']) && $_GET['page'] > 0) {
+    // This is the repeated node on the top of subsequent pages.
+    // We send this to a special .tpl so people can adjust it to their needs.
+    advanced_forum_add_template_suggestions("post-repeated", $variables);
+  }
+  elseif (arg(1) == 'reply' || (arg(0) == 'node' && arg(1) == 'add') || !empty($node->in_preview) ) {
+    // 'reply' deals with the first post being shown when adding a comment.
+    // 'node/add' is when previewing a new forum post.
+    advanced_forum_add_template_suggestions("post-preview", $variables);
+  }
+  else {
+    // Use our combined node/comment template file
+    advanced_forum_add_template_suggestions("post", $variables);
+  }
+
+  /* Topic header */
+  $variables['top_post'] = TRUE;
+
+  // Build the topic header
+  $variables['topic_header'] = theme('advanced_forum_topic_header', array(
+    'node' => $node,
+    'comment_count' => isset($variables['comment_count']) ? $variables['comment_count'] : 0,
+    ));
+
+
+  // Add in our classes merging with existing.
+  if (!is_array($variables['classes_array'])) {
+    $variables['classes_array'] = array();
+  }
+
+  $variables['classes_array'] = array('forum-post clearfix');
+
+  // Add the current language to the classes for image handling.
+  global $language;
+  if (!empty($language->language)) {
+    $variables['classes_array'][] = $language->language;
+  }
+
+   // Add the poster's UID
+  $variables['classes_array'][] = "posted-by-$node->uid";
+
+  /* Post ID */
+  // Set the post ID for theming / targetting
+  $variables['post_id'] = "post-$node->nid";
+
+  /* Linked post number */
+  if (!isset($post_number)) {
+    static $post_number = 1;
+  }
+
+  $page_number = !empty($_GET['page']) ? $_GET['page'] : 0;
+
+  // If this is the topic starting node, we need to start off the numbering.
+  // variable changed from post_link to permalink to match core variable
+  $variables['permalink'] = l('#1', "node/$node->nid");
+
+
+  /* In reply to */
+  $variables['in_reply_to'] = "";
+
+  /* User information / author pane */
+  $variables['account'] = user_load($node->uid);
+
+  if (!module_exists('author_pane')) {
+    // If not using the Author Pane module, create a simple version with just
+    // name and photo. If using AP, that's handled down in the
+    // "uncached variables" section.
+    $variables['author_pane'] = theme('advanced_forum_simple_author_pane', array('context' => $node));
+  }
+
+  /* Reply link */
+  // Build the reply link / button. This isn't used in the default template
+  // but is provided as a convenience to people who want to customize theirs.
+  $variables['reply_link'] = theme('advanced_forum_reply_link', array('node' => $node));
+
+  /* Uncached variables */
+  if (!$variables['top_post'] && method_exists('views_plugin_cache', 'post_render') && !$variables['node']->in_preview) {
+    /* Author Pane */
+    if (module_exists('author_pane')) {
+      $variables['author_pane'] = '<!--post:author-pane-' . $node->uid . '-->';
+    }
+
+    /* Revisions */
+    if (!empty($variables['revision_timestamp']) && user_access('view last edited notice') && $variables['created'] != $variables['revision_timestamp']) {
+      $variables['post_edited'] = '<!--post:post-edited-' . $node->nid . '-->';
+    }
+
+    /* Signatures */
+    if (variable_get('user_signatures', 0)) {
+      $variables['signature'] =  '<!--post:signature-core-' . $node->uid . '-->';
+    }
+
+    /* User specific node theming class */
+    // Add class if the poster is the viewer.
+    $variables['classes_array'][] = "<!--post:poster-id-' . $node->uid . '-->";
+  }
+  else {
+    // Create variables normally.
+    /* Author Pane */
+    if (module_exists('author_pane')) {
+      $variables['author_pane'] = theme('author_pane', array(
+            'account' => $variables['account'],
+            'caller' => 'advanced_forum',
+            'picture_preset' => variable_get('advanced_forum_user_picture_preset', ''),
+            'context' => $node,
+            'disable_css' => TRUE,
+            'join_date_type' => variable_get('advanced_forum_author_pane_join_date_type', 'short'),
+          ));
+    }
+
+    /* Revisions */
+    if (isset($variables['revision_timestamp']) && user_access('view last edited notice') && $variables['created'] != $variables['revision_timestamp']) {
+      $variables['post_edited'] = theme('advanced_forum_post_edited', array(
+        'who' => $variables['revision_uid'],
+        'when' => $variables['revision_timestamp'],
+        'why' => $variables['log']
+      ));
+    }
+
+    /* Viewer is poster class */
+    global $user;
+    if ($user->uid > 0 && $user->uid == $node->uid) {
+      $variables['classes_array'][] = " post-by-viewer";
+    }
+  }
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/core-overrides.inc b/htmltest/sites/all/modules/advanced_forum/includes/core-overrides.inc
new file mode 100644
index 00000000..c2b38d87
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/core-overrides.inc
@@ -0,0 +1,266 @@
+<?php
+
+/**
+ * @file
+ * User page callbacks for the forum module.
+ */
+
+/**
+ * Menu callback; prints a forum listing.
+ */
+function advanced_forum_page($forum_term = NULL) {
+  if (!isset($forum_term)) {
+    // On the main page, display all the top-level forums.
+    $forum_term = advanced_forum_forum_load(0);
+  }
+
+  // Set tid for <root> container
+  if (!isset($forum_term->tid)) {
+    $forum_term->tid = 0;
+  }
+  _advanced_forum_add_files();
+
+  $forum_per_page = variable_get('forum_per_page', 25);
+  $sortby = variable_get('forum_order', 1);
+
+  if (empty($forum_term->container)) {
+    $topics = advanced_forum_get_topics($forum_term->tid, $sortby, $forum_per_page);
+  }
+  else {
+    $topics = '';
+  }
+
+  $vid = variable_get('forum_nav_vocabulary', 0);
+  $vocabulary = taxonomy_vocabulary_load($vid);
+
+  // Breadcrumb navigation:
+  $breadcrumb[] = l(t('Home'), NULL);
+  if ($forum_term->tid) {
+    $breadcrumb[] = l($vocabulary->name, 'forum');
+  }
+
+  if ($forum_term->parents) {
+    foreach (array_reverse($forum_term->parents) as $p) {
+      if ($p->tid != $forum_term->tid) {
+        $breadcrumb[] = l($p->name, 'forum/' . $p->tid);
+      }
+      else {
+        $title = $p->name;
+      }
+    }
+  }
+
+  if (empty($title)) {
+    $title = $vocabulary->name;
+  }
+
+
+  if (!variable_get('advanced_forum_disable_breadcrumbs', FALSE)) {
+    drupal_set_breadcrumb($breadcrumb);
+  }
+
+  drupal_set_title($title);
+
+  return theme('forums', array(
+    'forums' => $forum_term->forums,
+    'topics' => $topics,
+    'parents' => $forum_term->parents,
+    'tid' => $forum_term->tid,
+    'sortby' => $sortby,
+    'forums_per_page' => $forum_per_page
+  ));
+}
+
+/**
+ * Returns a tree of all forums for a given taxonomy term ID.
+ *
+ * This is copied from the forum module and adapted.
+ *
+ * @param $tid
+ *    (optional) Taxonomy ID of the forum, if not givin all forums will be returned.
+ * @return
+ *   A tree of taxonomy objects, with the following additional properties:
+ *    - 'num_topics': Number of topics in the forum
+ *    - 'num_posts': Total number of posts in all topics
+ *    - 'last_post': Most recent post for the forum
+ *    - 'forums': An array of child forums
+ */
+function advanced_forum_forum_load($tid = NULL) {
+  $cache = &drupal_static(__FUNCTION__, array());
+
+
+  // Return a cached forum tree if available.
+  if (!isset($tid)) {
+    $tid = 0;
+  }
+  if (isset($cache[$tid])) {
+    return $cache[$tid];
+  }
+
+  // Find out from the style's .info how many posts per forum to collect.
+  $info = advanced_forum_style_info();
+  $post_count = isset($info['forum list post count']) ? intval($info['forum list post count']) : 1;
+
+  $vid = variable_get('forum_nav_vocabulary', 0);
+
+  // Load and validate the parent term.
+  if ($tid) {
+    $forum_term = taxonomy_term_load($tid);
+
+    if (module_exists('i18n_taxonomy')) {
+      $forum_term = i18n_taxonomy_localize_terms($forum_term);
+    }
+    if (!$forum_term || ($forum_term->vid != $vid)) {
+      return $cache[$tid] = FALSE;
+    }
+  }
+  // If $tid is 0, create an empty object to hold the child terms.
+  elseif ($tid === 0) {
+    $forum_term = (object) array(
+          'tid' => 0,
+    );
+  }
+
+  // Determine if the requested term is a container.
+  if (!$forum_term->tid || in_array($forum_term->tid, variable_get('forum_containers', array()))) {
+    $forum_term->container = 1;
+  }
+
+  // Load parent terms.
+  $forum_term->parents = taxonomy_get_parents_all($forum_term->tid);
+
+  // Load the tree below.
+  $forums = array();
+  $_forums = taxonomy_get_tree($vid, $tid);
+
+  if (module_exists('i18n_taxonomy')) {
+    $_forums = i18n_taxonomy_localize_terms($_forums);
+  }
+
+  if (count($_forums)) {
+    $query = db_select('node', 'n');
+    $query->join('node_comment_statistics', 'ncs', 'n.nid = ncs.nid');
+    $query->join('forum_index', 'f', 'n.nid = f.nid');
+    $query->addExpression('COUNT(DISTINCT(f.nid))', 'topic_count');
+    $query->addExpression('SUM(f.comment_count)', 'comment_count');
+
+    // Limit the query to only node types that can actually be associated with
+    // the forum vocabulary.
+    if ($vid) {
+      $vocabulary = taxonomy_vocabulary_load($vid);
+      $vocabulary_fields = field_read_fields(array('module' => 'taxonomy'));
+      $node_types = array();
+      foreach ($vocabulary_fields as $field_name => $vocabulary_field) {
+        foreach ($vocabulary_field['settings']['allowed_values'] as $key => $allowed_value) {
+          if ($allowed_value['vocabulary'] == $vocabulary->machine_name) {
+            $field_info = field_info_field($field_name);
+            if (isset($field_info['bundles']['node'])) {
+              $node_types += $field_info['bundles']['node'];
+            }
+          }
+        }
+      }
+
+      if (!empty($node_types)) {
+        $query->condition('type', $node_types, 'IN');
+      }
+    }
+
+    $counts = $query
+        ->fields('f', array('tid'))
+        ->condition('status', 1)
+        ->groupBy('tid')
+        ->addTag('node_access')
+        ->execute()
+        ->fetchAllAssoc('tid');
+  }
+
+  foreach ($_forums as $forum) {
+    // Determine if the child term is a container.
+    if (in_array($forum->tid, variable_get('forum_containers', array()))) {
+      $forum->container = 1;
+    }
+
+    // Merge in the topic and post counters.
+    if (!empty($counts[$forum->tid])) {
+      $forum->num_topics = $counts[$forum->tid]->topic_count;
+      $forum->num_posts = $counts[$forum->tid]->topic_count + $counts[$forum->tid]->comment_count;
+    }
+    else {
+      $forum->num_topics = 0;
+      $forum->num_posts = 0;
+    }
+
+    // Query "Last Post" information for this forum.
+    $query = db_select('node', 'n');
+    $query->join('forum_index', 'f', 'n.nid = f.nid AND f.tid = :tid', array(':tid' => $forum->tid));
+    $query->join('node_comment_statistics', 'ncs', 'n.nid = ncs.nid');
+    $query->join('users', 'u', 'ncs.last_comment_uid = u.uid');
+    $query->addExpression('CASE ncs.last_comment_uid WHEN 0 THEN ncs.last_comment_name ELSE u.name END', 'last_comment_name');
+
+    $topics = $query
+        ->fields('ncs', array('last_comment_timestamp', 'last_comment_uid'))
+        ->fields('n', array('nid', 'title', 'type'))
+        ->condition('n.status', 1)
+        ->orderBy('last_comment_timestamp', 'DESC')
+        ->range(0, $post_count)
+        ->addTag('node_access')
+        ->execute();
+
+    while ($topic = $topics->fetchObject()) {
+      // Merge in the "Last Post" information.
+      $last_post = new stdClass();
+      if (!empty($topic->last_comment_timestamp)) {
+        $last_post->nid = $topic->nid;
+        $last_post->node_title = $topic->title;
+        $last_post->type = $topic->type;
+        $last_post->created = $topic->last_comment_timestamp;
+        $last_post->name = $topic->last_comment_name;
+        $last_post->uid = $topic->last_comment_uid;
+      }
+      if ($post_count > 1) {
+        $forum->last_post[] = $last_post;
+      }
+      else {
+        $forum->last_post = $last_post;
+      }
+    }
+
+    $forums[$forum->tid] = $forum;
+  }
+
+  // Cache the result, and return the tree.
+  $forum_term->forums = $forums;
+  $cache[$tid] = $forum_term;
+  return $forum_term;
+}
+
+function _advanced_forum_update_parent_post_count(&$forums, $forum) {
+  foreach ($forum->parents as $parent_tid) {
+    if (!empty($forums[$parent_tid])) {
+      $forums[$parent_tid]->num_topics += $forum->num_topics;
+      $forums[$parent_tid]->num_posts += $forum->num_posts;
+
+      // recursive loop to update all parents
+      if (!empty($forums[$parent_tid]->parents)) {
+        _advanced_forum_update_parent_post_count($forums, $forums[$parent_tid]);
+      }
+    }
+  }
+}
+
+/**
+ * This is copied from the forum module and adapted.
+ */
+function advanced_forum_get_topics($tid, $sortby, $forum_per_page, $sort_form = TRUE) {
+  $term = taxonomy_term_load($tid);
+  drupal_add_feed('taxonomy/term/' . $tid . '/feed', 'RSS - ' . check_plain($term->name));
+
+  // Views handles this page
+  $view = views_get_view('advanced_forum_topic_list');
+  $view->set_items_per_page($forum_per_page);
+  $view->sort_form = $sort_form;
+
+  return $view->preview('default', array($tid));
+}
+
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/mark-read.inc b/htmltest/sites/all/modules/advanced_forum/includes/mark-read.inc
new file mode 100644
index 00000000..59f94ec7
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/mark-read.inc
@@ -0,0 +1,88 @@
+<?php
+
+
+/**
+ * @file
+ * Holds functions relating to the Mark Forum/All Read functionality.
+ */
+
+/**
+ * Either fill a $links array or return a string version of the link to mark read.
+ */
+function advanced_forum_get_mark_read_link($tid = 0, &$links = array()) {
+  if (advanced_forum_markasread_access() && !in_array($tid, variable_get('forum_containers', array()))) {
+    if ($tid) {
+      $links['mark-read']['title'] = t('Mark all topics read');
+      $links['mark-read']['href'] = "forum/markasread/$tid";
+
+      return l(t('Mark all topics read') . '<span class="image-replace"></span>', "forum/markasread/$tid", array('html' => TRUE));
+    }
+    else {
+      $links['mark-read']['title'] = t('Mark all forums read');
+      $links['mark-read']['href'] = "forum/markasread";
+
+      return l(t('Mark all forums read') . '<span class="image-replace"></span>', "forum/markasread", array('html' => TRUE));
+    }
+  }
+}
+
+/**
+ * Marks all posts in forums or in a given forum as read by the current user.
+ */
+function advanced_forum_markasread($tid = NULL) {
+  global $user;
+  $vid = variable_get('forum_nav_vocabulary', 0);
+
+  // Don't bother trying to mark things read for anonymous users.
+  if (empty($user->uid)) {
+    return;
+  }
+  // Delete all entries in the history table for the current $uid and
+  // optionally a forum term id.
+
+  // Subquery to find nids to delete from history table.
+  $query_node = db_select('node', 'n');
+  $query_node->join('forum', 'f', 'n.vid = f.vid');
+  $query_node->join('taxonomy_term_data', 't', 'f.tid = t.tid');
+  $query_node->join('node_comment_statistics', 'ncs', 'n.nid = ncs.nid');
+
+  if (isset($tid)) {
+    $query_node->condition('f.tid', $tid);
+  }
+  
+  $query_node->condition('t.vid', $vid);
+  $query_node->addField('n', 'nid');
+  // Select query objects are one-shot, so clone for INSERT below.
+  $query_history_insert = clone($query_node);
+  // Delete values based upon sub-query.
+  $query = db_delete('history')
+    ->condition('uid', $user->uid)
+    ->condition('nid', $query_node, 'IN')
+    ->execute();
+
+  // Now insert the nids into the history table.
+  $query_history_insert->addExpression(':uid', 'uid', array(':uid' => $user->uid));
+  $query_history_insert->addExpression(':time', 'timestamp', array(':time' => REQUEST_TIME));
+
+  db_insert('history')
+    ->fields(array('nid', 'uid', 'timestamp'))
+    ->from($query_history_insert)
+    ->execute();
+
+  drupal_goto(empty($tid) ? 'forum' : 'forum/' . $tid);
+}
+
+/**
+ * Access callback for menus and link display.
+ *
+ * @TODO: D7 check if needed
+ *
+ * This separate function is needed because the Drupal 6 menu system doesn't
+ * run hook_menu() every time and the logged-in status of the user can get
+ * cached and re-used for other users.
+ */
+function advanced_forum_markasread_access() {
+  global $user;
+  return user_access('access content') && $user->uid;
+}
+
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/panels/advanced_forum.pages_default.inc b/htmltest/sites/all/modules/advanced_forum/includes/panels/advanced_forum.pages_default.inc
new file mode 100644
index 00000000..cc0ded20
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/panels/advanced_forum.pages_default.inc
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Default panel handlers for Advanced Forum.
+ */
+
+/**
+ * Loads the included panels.
+ *
+ * This function is used instead of panels ability to autodiscover a panels
+ * export .inc because this allows us to put each page in its own file.
+ * Thanks to Moshe and OG for the code.
+ */
+function advanced_forum_default_page_manager_handlers() {
+  static $handlers = array();
+
+  if (empty($handlers)) {
+    $files = file_scan_directory(drupal_get_path('module', 'advanced_forum') . '/includes/panels', '/\.handler$/');
+    foreach ($files as $absolute => $file) {
+      $handler = NULL;
+      require_once $absolute;
+      if (isset($handler)) {
+        $handlers[$file->name] = $handler;
+      }
+    }
+  }
+  
+  return $handlers;
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/panels/forum_panel_context_container.handler b/htmltest/sites/all/modules/advanced_forum/includes/panels/forum_panel_context_container.handler
new file mode 100644
index 00000000..c5e898d4
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/panels/forum_panel_context_container.handler
@@ -0,0 +1,93 @@
+<?php
+
+$handler = new stdClass();
+$handler->disabled = FALSE; /* Edit this to true to make a default handler disabled initially */
+$handler->api_version = 1;
+$handler->name = 'forum_panel_context_container';
+$handler->task = 'forum';
+$handler->subtask = '';
+$handler->handler = 'panel_context';
+$handler->weight = 1;
+$handler->conf = array(
+  'title' => 'Container',
+  'no_blocks' => 0,
+  'css_id' => 'forum',
+  'css' => '',
+  'contexts' => array(),
+  'relationships' => array(),
+  'access' => array(
+    'plugins' => array(
+      0 => array(
+        'name' => 'forum_container',
+        'settings' => array(
+          'container' => '0',
+        ),
+        'context' => 'argument_forum_id_1',
+      ),
+    ),
+    'logic' => 'and',
+  ),
+  'pipeline' => 'standard',
+);
+if (module_exists('panels')) {
+  $display = new panels_display();
+  $display->layout = 'flexible';
+  $display->layout_settings = array();
+  $display->panel_settings = array(
+    'style_settings' => array(
+      'default' => NULL,
+      'center' => NULL,
+    ),
+  );
+  $display->cache = array();
+  $display->title = '%forum:name';
+  $display->content = array();
+  $display->panels = array();
+  $pane = new stdClass();
+  $pane->pid = 'new-1';
+  $pane->panel = 'center';
+  $pane->type = 'forum_list';
+  $pane->subtype = 'forum_list';
+  $pane->shown = TRUE;
+  $pane->access = array();
+  $pane->configuration = array(
+    'context' => 'argument_forum_id_1',
+    'override_title' => 0,
+    'override_title_text' => '',
+  );
+  $pane->cache = array();
+  $pane->style = array(
+    'settings' => NULL,
+  );
+  $pane->css = array();
+  $pane->extras = array();
+  $pane->position = 0;
+  $pane->locks = '';
+  $display->content['new-1'] = $pane;
+  $display->panels['center'][0] = 'new-1';
+  $pane = new stdClass();
+  $pane->pid = 'new-2';
+  $pane->panel = 'center';
+  $pane->type = 'forum_legend';
+  $pane->subtype = 'forum_legend';
+  $pane->shown = TRUE;
+  $pane->access = array();
+  $pane->configuration = array(
+    'context' => 'argument_forum_id_1',
+    'override_title' => 0,
+    'override_title_text' => '',
+  );
+  $pane->cache = array();
+  $pane->style = array(
+    'settings' => NULL,
+  );
+  $pane->css = array();
+  $pane->extras = array();
+  $pane->position = 1;
+  $pane->locks = '';
+  $display->content['new-2'] = $pane;
+  $display->panels['center'][1] = 'new-2';
+  $display->hide_title = PANELS_TITLE_FIXED;
+  $display->title_pane = '0';
+  $handler->conf['display'] = $display;
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/panels/forum_panel_context_forum.handler b/htmltest/sites/all/modules/advanced_forum/includes/panels/forum_panel_context_forum.handler
new file mode 100644
index 00000000..85636c8c
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/panels/forum_panel_context_forum.handler
@@ -0,0 +1,137 @@
+<?php
+
+$handler = new stdClass();
+$handler->disabled = FALSE; /* Edit this to true to make a default handler disabled initially */
+$handler->api_version = 1;
+$handler->name = 'forum_panel_context_forum';
+$handler->task = 'forum';
+$handler->subtask = '';
+$handler->handler = 'panel_context';
+$handler->weight = 2;
+$handler->conf = array(
+  'title' => 'Forum',
+  'no_blocks' => 0,
+  'css_id' => 'forum',
+  'css' => '',
+  'contexts' => array(),
+  'relationships' => array(),
+  'access' => array(
+    'plugins' => array(
+      0 => array(
+        'name' => 'forum_container',
+        'settings' => array(
+          'container' => '1',
+        ),
+        'context' => 'argument_forum_id_1',
+      ),
+    ),
+    'logic' => 'and',
+  ),
+  'pipeline' => 'standard',
+);
+if (module_exists('panels')) {
+  $display = new panels_display();
+  $display->layout = 'flexible';
+  $display->layout_settings = array();
+  $display->panel_settings = array(
+    'style_settings' => array(
+      'default' => NULL,
+      'center' => NULL,
+    ),
+  );
+  $display->cache = array();
+  $display->title = '%forum:name';
+  $display->content = array();
+  $display->panels = array();
+  $pane = new stdClass();
+  $pane->pid = 'new-1';
+  $pane->panel = 'center';
+  $pane->type = 'forum_list';
+  $pane->subtype = 'forum_list';
+  $pane->shown = TRUE;
+  $pane->access = array();
+  $pane->configuration = array(
+    'context' => 'argument_forum_id_1',
+    'override_title' => 0,
+    'override_title_text' => '',
+  );
+  $pane->cache = array();
+  $pane->style = array(
+    'settings' => NULL,
+  );
+  $pane->css = array();
+  $pane->extras = array();
+  $pane->position = 0;
+  $pane->locks = '';
+  $display->content['new-1'] = $pane;
+  $display->panels['center'][0] = 'new-1';
+  $pane = new stdClass();
+  $pane->pid = 'new-2';
+  $pane->panel = 'center';
+  $pane->type = 'forum_topic_list';
+  $pane->subtype = 'forum_topic_list';
+  $pane->shown = TRUE;
+  $pane->access = array();
+  $pane->configuration = array(
+    'context' => 'argument_forum_id_1',
+    'override_title' => 0,
+    'override_title_text' => '',
+  );
+  $pane->cache = array();
+  $pane->style = array(
+    'settings' => NULL,
+  );
+  $pane->css = array();
+  $pane->extras = array();
+  $pane->position = 1;
+  $pane->locks = '';
+  $display->content['new-2'] = $pane;
+  $display->panels['center'][1] = 'new-2';
+  $pane = new stdClass();
+  $pane->pid = 'new-3';
+  $pane->panel = 'center';
+  $pane->type = 'forum_topic_list_sort';
+  $pane->subtype = 'forum_topic_list_sort';
+  $pane->shown = TRUE;
+  $pane->access = array();
+  $pane->configuration = array(
+    'context' => 'argument_forum_id_1',
+    'override_title' => 0,
+    'override_title_text' => '',
+  );
+  $pane->cache = array();
+  $pane->style = array(
+    'settings' => NULL,
+  );
+  $pane->css = array();
+  $pane->extras = array();
+  $pane->position = 2;
+  $pane->locks = array();
+  $display->content['new-3'] = $pane;
+  $display->panels['center'][2] = 'new-3';
+  $pane = new stdClass();
+  $pane->pid = 'new-4';
+  $pane->panel = 'center';
+  $pane->type = 'forum_topic_legend';
+  $pane->subtype = 'forum_topic_legend';
+  $pane->shown = TRUE;
+  $pane->access = array();
+  $pane->configuration = array(
+    'context' => 'argument_forum_id_1',
+    'override_title' => 0,
+    'override_title_text' => '',
+  );
+  $pane->cache = array();
+  $pane->style = array(
+    'settings' => NULL,
+  );
+  $pane->css = array();
+  $pane->extras = array();
+  $pane->position = 3;
+  $pane->locks = '';
+  $display->content['new-4'] = $pane;
+  $display->panels['center'][3] = 'new-4';
+  $display->hide_title = PANELS_TITLE_FIXED;
+  $display->title_pane = '0';
+  $handler->conf['display'] = $display;
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/panels/forum_panel_context_top.handler b/htmltest/sites/all/modules/advanced_forum/includes/panels/forum_panel_context_top.handler
new file mode 100644
index 00000000..5887045d
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/panels/forum_panel_context_top.handler
@@ -0,0 +1,118 @@
+<?php
+
+$handler = new stdClass();
+$handler->disabled = FALSE; /* Edit this to true to make a default handler disabled initially */
+$handler->api_version = 1;
+$handler->name = 'forum_panel_context_top';
+$handler->task = 'forum';
+$handler->subtask = '';
+$handler->handler = 'panel_context';
+$handler->weight = 0;
+$handler->conf = array(
+  'title' => 'Top Level Forum',
+  'no_blocks' => 0,
+  'css_id' => 'forum',
+  'css' => '',
+  'contexts' => array(),
+  'relationships' => array(),
+  'access' => array(
+    'plugins' => array(
+      0 => array(
+        'name' => 'forum_id',
+        'settings' => array(
+          'tids' => array(
+            0 => '0',
+          ),
+        ),
+        'context' => 'argument_forum_id_1',
+      ),
+    ),
+    'logic' => 'and',
+  ),
+  'pipeline' => 'standard',
+);
+
+if (module_exists('panels')) {
+  $display = new panels_display();
+  $display->layout = 'flexible';
+  $display->layout_settings = array();
+  $display->panel_settings = array(
+    'style_settings' => array(
+      'default' => NULL,
+      'center' => NULL,
+    ),
+  );
+  $display->cache = array();
+  $display->title = '%forum:name';
+  $display->content = array();
+  $display->panels = array();
+  $pane = new stdClass();
+  $pane->pid = 'new-1';
+  $pane->panel = 'center';
+  $pane->type = 'forum_list';
+  $pane->subtype = 'forum_list';
+  $pane->shown = TRUE;
+  $pane->access = array();
+  $pane->configuration = array(
+    'context' => 'argument_forum_id_1',
+    'override_title' => 0,
+    'override_title_text' => '',
+  );
+  $pane->cache = array();
+  $pane->style = array(
+    'settings' => NULL,
+  );
+  $pane->css = array();
+  $pane->extras = array();
+  $pane->position = 0;
+  $pane->locks = '';
+  $display->content['new-1'] = $pane;
+  $display->panels['center'][0] = 'new-1';
+  $pane = new stdClass();
+  $pane->pid = 'new-2';
+  $pane->panel = 'center';
+  $pane->type = 'forum_legend';
+  $pane->subtype = 'forum_legend';
+  $pane->shown = TRUE;
+  $pane->access = array();
+  $pane->configuration = array(
+    'context' => 'argument_forum_id_1',
+    'override_title' => 0,
+    'override_title_text' => '',
+  );
+  $pane->cache = array();
+  $pane->style = array(
+    'settings' => NULL,
+  );
+  $pane->css = array();
+  $pane->extras = array();
+  $pane->position = 1;
+  $pane->locks = '';
+  $display->content['new-2'] = $pane;
+  $display->panels['center'][1] = 'new-2';
+  $pane = new stdClass();
+  $pane->pid = 'new-3';
+  $pane->panel = 'center';
+  $pane->type = 'forum_statistics';
+  $pane->subtype = 'forum_statistics';
+  $pane->shown = TRUE;
+  $pane->access = array();
+  $pane->configuration = array(
+    'context' => 'argument_forum_id_1',
+    'override_title' => 0,
+    'override_title_text' => '',
+  );
+  $pane->cache = array();
+  $pane->style = array(
+    'settings' => NULL,
+  );
+  $pane->css = array();
+  $pane->extras = array();
+  $pane->position = 2;
+  $pane->locks = '';
+  $display->content['new-3'] = $pane;
+  $display->panels['center'][2] = 'new-3';
+  $display->hide_title = PANELS_TITLE_FIXED;
+  $display->title_pane = '0';
+  $handler->conf['display'] = $display;
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/plugins.inc b/htmltest/sites/all/modules/advanced_forum/includes/plugins.inc
new file mode 100644
index 00000000..7fc15bba
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/plugins.inc
@@ -0,0 +1,128 @@
+<?php
+
+
+/**
+ * @file
+ * Allows modules to contribute styles.
+ */
+
+// -----------------------------------------------------------------------
+// REQUEST FUNCTIONS
+
+/**
+ * Fetch an advanced forum style plugin
+ *
+ * @param $style
+ *   Name of the style plugin
+ *
+ * @return
+ *   An array with information about the requested style plugin.
+ */
+function advanced_forum_get_style($style) {
+  return advanced_forum_get_plugins('styles', 'advanced_forum_styles', $style);
+}
+
+/**
+ * Collate information about all available advanced_forum styles.
+ *
+ * @return
+ *   An array with information about the requested forum style.
+ */
+function advanced_forum_get_styles() {
+  return advanced_forum_get_plugins('styles', 'advanced_forum_styles');
+}
+
+// -----------------------------------------------------------------------
+// MASTER HANDLER
+
+/**
+ * Fetch a group of plugins by name.
+ *
+ * @param $plugin
+ *   This is the name of the plugin, and also the name of the directory.
+ * @param $hook
+ *   This is the hook to call to get the info for the plugin.
+ *
+ * @return
+ *   An array of information arrays about the plugins received.
+ */
+function advanced_forum_get_plugins($plugin, $hook, $id = NULL) {
+  static $plugins = array();
+  static $all_hooks = array();
+
+  // Always load all hooks if we need them.
+  if (!isset($all_hooks[$plugin])) {
+    $all_hooks[$plugin] = TRUE;
+    $plugins[$plugin] = advanced_forum_load_hooks($hook);
+  }
+
+  // If a specific plugin $id is being requested, return it.
+  if ($id && array_key_exists($id, $plugins[$plugin])) {
+    return $plugins[$plugin][$id];
+  }
+
+  // If no $id was requested, return the lot.
+  if (!$id) {
+    return $plugins[$plugin];
+  }
+}
+
+// -----------------------------------------------------------------------
+// WORKER/RETRIEVER FUNCTIONS
+
+/**
+ * Load plugin info for all hooks; this is handled separately from plugins
+ * from files.
+ *
+ * @param $hook
+ *   The hook being invoked.
+ *
+ * @return
+ *   An array of info supplied by any hook implementations.
+ */
+function advanced_forum_load_hooks($hook) {
+  $info = array();
+  foreach (module_implements($hook) as $module) {
+    $result = _advanced_forum_process_plugin($module, $module, drupal_get_path('module', $module), $hook);
+    if (is_array($result)) {
+      $info = array_merge($info, $result);
+    }
+  }
+  return $info;
+}
+
+/**
+ * Process a single hook implementation of a advanced_forum plugin.
+ *
+ * @param $module
+ *   The module that owns the hook.
+ * @param $identifier
+ *   Either the module or 'advanced_forum_' . $file->name
+ * @param $hook
+ *   The name of the hook being invoked.
+ */
+function _advanced_forum_process_plugin($module, $identifier, $path, $hook) {
+  $function = $identifier . '_' . $hook;
+  if (!function_exists($function)) {
+    return NULL;
+  }
+  $result = $function();
+  if (!isset($result) || !is_array($result)) {
+    return NULL;
+  }
+
+  // Fill in defaults.
+  foreach ($result as $name => $plugin) {
+    if (!is_dir($path . '/' . $plugin['directory'])) {
+      unset($result[$name]);
+      continue;
+    }
+    $result[$name] += array(
+      'module' => $module,
+      'name' => $name,
+      'path' => $path . '/' . $plugin['directory'],
+    );
+  }
+
+  return !empty($result) ? $result : NULL;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/settings.inc b/htmltest/sites/all/modules/advanced_forum/includes/settings.inc
new file mode 100644
index 00000000..6860023f
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/settings.inc
@@ -0,0 +1,230 @@
+<?php
+
+/**
+ * @file
+ * Advanced forum settings / configuration page.
+ */
+
+/**
+ * Defines the Advanced Forum settings form.
+ */
+function advanced_forum_settings_page() {
+  /* General settings */
+  $form['advanced_forum_general'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('General'),
+    '#collapsible' => TRUE,
+    '#collapsed' => FALSE,
+  );
+
+  // Choose style
+  $options = array();
+  $available_styles = advanced_forum_get_all_styles();
+  foreach ($available_styles as $style_machine_name => $style) {
+    $options[$style_machine_name] = $style['name'];
+  }
+  asort($options);
+
+  $form['advanced_forum_general']['advanced_forum_style'] = array(
+    '#type' => 'select',
+    '#title' => t('Advanced forum style'),
+    '#options' => $options,
+    '#description' => t('Choose which style to use for your forums. This will apply independent of site theme.'),
+    '#default_value' => variable_get('advanced_forum_style', 'silver_bells'),
+  );
+
+  // Choose node types that are styled.
+  $node_types = _node_types_build()->types;
+  $options = array();
+  foreach ($node_types as $node_machine_name => $node_type) {
+    $options[$node_machine_name] = $node_type->name;
+  }
+
+  $form['advanced_forum_general']['advanced_forum_styled_node_types'] = array(
+    '#type' => 'select',
+    '#title' => t('Node types to style'),
+    '#options' => $options,
+    '#multiple' => TRUE,
+    '#description' => t('Choose which node types will have the forum style applied.'),
+    '#default_value' => variable_get('advanced_forum_styled_node_types', array('forum')),
+  );
+
+  // Style nodes presented in teaser form.
+  $form['advanced_forum_general']['advanced_forum_style_teasers'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Style nodes when being displayed as teasers.'),
+    '#default_value' => variable_get('advanced_forum_style_teasers', 0),
+    '#description' => t('If checked, selected node types will be styled even when they are in a teaser list.'),
+  );
+
+  // Style nodes only if tagged for the forum.
+  $form['advanced_forum_general']['advanced_forum_style_only_forum_tagged'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Style nodes only if they have a forum term attached.'),
+    '#default_value' => variable_get('advanced_forum_style_only_forum_tagged', 1),
+    '#description' => t('If checked, selected node types will be only styled if they are associated with a forum term.'),
+  );
+
+  // Style all site comments as forums
+  $form['advanced_forum_general']['advanced_forum_style_all_comments'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Style all comments like forum replies.'),
+    '#default_value' => variable_get('advanced_forum_style_all_comments', 0),
+    '#description' => t('If checked, every comment will be styled as if it were a forum reply.'),
+  );
+
+  $form['advanced_forum_general']['advanced_forum_add_local_task'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Add a tab for forum view page.'),
+    '#default_value' => variable_get('advanced_forum_add_local_task', TRUE),
+    '#description' => t('If checked, this will add a local task tab for "View forums". Use this in conjunction with making the included views have local tasks. If you don\'t know what this means, leave it unchecked. You must clear the cache before this will take effect.'),
+  );
+
+  $form['advanced_forum_general']['advanced_forum_views_as_tabs'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Add a tab for included views that have their own pages.'),
+    '#default_value' => variable_get('advanced_forum_views_as_tabs', TRUE),
+    '#description' => t('If checked, this will add a local task tab for "Active topics," "New posts," "My posts," and "Unanswered topics." If you don\'t know what this means, leave it unchecked. You must clear the cache before this will take effect.'),
+  );
+
+  /* Forum / topic list settings */
+  $form['advanced_forum_lists'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Forum and topic lists'),
+    '#collapsible' => TRUE,
+    '#collapsed' => FALSE,
+  );
+
+  // Disable breadcrumbs
+  $form['advanced_forum_lists']['advanced_forum_disable_breadcrumbs'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Disable breadcrumbs'),
+    '#default_value' => variable_get('advanced_forum_disable_breadcrumbs', 0),
+    '#description' => t('Check this to disable breadcrumbs in the forum if you are using another module to customize them. Does not affect node pages and does not work when Page Manager is overriding forum pages.'),
+  );
+
+  $form['advanced_forum_lists']['advanced_forum_collapsible_containers'] = array(
+    '#type' => 'select',
+    '#title' => t('Collapsible forum containers'),
+    '#options' => array(
+      'none' => t("None"),
+      'toggle' => t("Toggle"),
+      'fade' => t("Fade"),
+      'slide' => t("Slide"),
+    ),
+    '#description' => t('Select whether or not to enable collapsible forum containers and what type of animation to use.'),
+    '#default_value' => variable_get('advanced_forum_collapsible_containers', 'toggle'),
+  );
+
+  // For default collapsed state configuration
+  $collapsed_list_name = variable_get('forum_containers', array());
+  $collapsed_list_description = array();
+  foreach ($collapsed_list_name as $id) {
+    $term = taxonomy_term_load($id);
+    if (!empty($term)) {
+      $collapsed_list_description[$id] = empty($term->name) ? '' : $term->name;
+    }
+  }
+  $form['advanced_forum_lists']['advanced_forum_default_collapsed_list'] = array(
+    '#type' => 'select',
+    '#title' => t('Containers collapsed by default'),
+    '#default_value' => variable_get('advanced_forum_default_collapsed_list', array()),
+    '#options' => $collapsed_list_description,
+    '#multiple' => TRUE,
+    '#description' => t('Select containers which should be collapsed by default.'),
+  );
+
+  if (module_exists('image')) {
+
+    /* Forum image settings */
+    $form['advanced_forum_forum_image'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Forum image settings'),
+      '#collapsible' => TRUE,
+      '#collapsed' => FALSE,
+    );
+
+    $forum_vocabulary = taxonomy_vocabulary_load(variable_get('forum_nav_vocabulary', 0));
+    $field_info = field_info_instances('taxonomy_term', $forum_vocabulary->machine_name);
+    $image_fields = array();
+    foreach ($field_info as $bundle => $field) {
+      if (!empty($field['display']['default']['type']) && ($field['display']['default']['type'] == 'image')) {
+        $image_fields[$bundle] = $bundle;
+      }
+    }
+    $form['advanced_forum_forum_image']['advanced_forum_forum_image_field'] = array(
+      '#title' => t('Image field'),
+      '#description' => t('The image field to use to display forum images.'),
+      '#type' => 'select',
+      '#default_value' => variable_get('advanced_forum_forum_image_field', ''),
+      '#empty_option' => t('None'),
+      '#options' => $image_fields,
+    );
+
+    $form['advanced_forum_forum_image']['advanced_forum_forum_image_preset'] = array(
+      '#title' => t('Forum image style'),
+      '#description' => t('The image style to apply to the images.'),
+      '#type' => 'select',
+      '#default_value' => variable_get('advanced_forum_forum_image_preset', ''),
+      '#empty_option' => t('None (original image)'),
+      '#options' => image_style_options(FALSE),
+    );
+  }
+  else {
+    variable_set('advanced_forum_forum_image_field', '');
+  }
+  // Picture preset
+  if (module_exists('image') && module_exists('author_pane')) {
+    $options = array('' => '');
+    $styles = image_styles();
+    foreach ($styles AS $style) {
+      $options[$style['name']] = $style['name'];
+    }
+
+    $form['advanced_forum_general']['advanced_forum_user_picture_preset'] = array(
+      '#type' => 'select',
+      '#title' => t('User picture preset'),
+      '#options' => $options,
+      '#description' => t('Image preset to use for forum avatars. Leave blank to not use this feature.'),
+      '#default_value' => variable_get('advanced_forum_user_picture_preset', ''),
+    );
+  }
+  else {
+    variable_set('advanced_forum_user_picture_preset', '');
+  }
+
+  if (module_exists('author_pane')) {
+    $join_date_options = array();
+    foreach (system_get_date_types() as $date_type) {
+      $join_date_options[$date_type['type']] = $date_type['title'];
+    }
+
+    $form['advanced_forum_general']['advanced_forum_author_pane_join_date_type'] = array(
+      '#type' => 'select',
+      '#title' => t('Author Pane - Join date, date type'),
+      '#options' => $join_date_options,
+      '#description' => t('Select which <a href="@date-type-url">date type</a> to use for displaying the join date in the Author Pane.', array('@date-type-url' => url('admin/config/regional/date-time'))),
+      '#default_value' => variable_get('advanced_forum_author_pane_join_date_type', 'short'),
+    );
+  }
+
+  // Retrieve new comments on forum listing
+  $form['advanced_forum_lists']['advanced_forum_get_new_comments'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Get the number of new comments per forum on the forum list'),
+    '#default_value' => variable_get('advanced_forum_get_new_comments', 0),
+    '#description' => t('Core forum shows the number of new topics. If checked, Advanced Forum will get the number of new comments as well and show it under "posts" on the forum overview. Slow query not recommended on large forums.'),
+  );
+
+  // Title length max
+  $form['advanced_forum_lists']['advanced_forum_topic_title_length'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Number of characters to display for the topic title'),
+    '#size' => 5,
+    '#description' => t('Used on main forum page. Enter 0 to use the full title.'),
+    '#default_value' => variable_get('advanced_forum_topic_title_length', 20),
+  );
+
+  // Send our form to Drupal to make a settings page
+  return system_settings_form($form);
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/style.inc b/htmltest/sites/all/modules/advanced_forum/includes/style.inc
new file mode 100644
index 00000000..eebe79c5
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/style.inc
@@ -0,0 +1,441 @@
+<?php
+
+/**
+ * @file
+ * Functions relating to the style system, not including core hooks and
+ * preprocess / theme functions.
+ */
+
+// STYLE API ****************************************************************/
+/**
+ * Returns the name of the forum style to use.
+ */
+function advanced_forum_get_current_style() {
+  return variable_get('advanced_forum_style', 'silver_bells');
+}
+
+function advanced_forum_get_style($style) {
+  ctools_include('plugins');
+  return ctools_get_plugins('advanced_forum', 'styles', $style);
+}
+
+function advanced_forum_get_all_styles() {
+  ctools_include('plugins') ;
+  return ctools_get_plugins('advanced_forum', 'styles');
+}
+
+/**
+ * Returns the path to the advanced forum style
+ */
+function advanced_forum_path_to_style($requested_style = NULL) {
+  // Set a static variable so this is cached after the first call.
+  static $style_paths = array();
+
+  if (empty($requested_style)) {
+    // If no style is passed in, assume the current style is wanted.
+    $requested_style = advanced_forum_get_current_style();
+  }
+
+  if (empty($style_path)) {
+    // Get the path information
+    $styles = advanced_forum_get_all_styles();
+    foreach ($styles as $key => $style) {
+      $style_paths[$key] = $style['path'];
+    }
+  }
+  return $style_paths[$requested_style];
+}
+
+/**
+ * Starting at a given style, return paths of it and all ancestor styles
+ */
+function advanced_forum_style_lineage($style = NULL) {
+  static $lineages = array();
+  if (empty($style)) {
+    // If no style is passed in, assume the current style is wanted.
+    $style = advanced_forum_get_current_style();
+  }
+
+  if (!array_key_exists($style, $lineages)) {
+    $lineage = array();
+
+    // Get an array with information from all styles.
+    $all_styles = advanced_forum_get_all_styles();
+
+    // Fallback
+    if (empty($all_styles[$style]))
+      $style = "silver_bells";
+
+    // Add the current style to the lineage first
+    $lineage[$style] = $all_styles[$style]['path'];
+
+    // Check if there is an "extra style" listed. This allows you to grab the
+    // CSS of one other style and toss it in as a pseudo parent. We do not
+    // follow the path up its parent. The primary use is for adding in the
+    // "stacked" CSS but could be used for other purposes as well.
+    if (!empty($all_styles[$style]['extra style']) && !empty($all_styles[$all_styles[$style]['extra style']]['path'])) {
+      $extra_style = $all_styles[$style]['extra style'];
+      $lineage[$extra_style] = $all_styles[$extra_style]['path'];
+    }
+
+    // Grab the style we are looking at. This variable starts out as the current
+    // style in use on the page but will change as we move up the chain.
+    $current_style = $style;
+
+    while (!empty($all_styles[$current_style]['base style'])) {
+      // There is a parent style, so move up to it.
+      $current_style = $all_styles[$current_style]['base style'];
+
+      // Make sure the listed parent style actually exists.
+      if (!empty($all_styles[$current_style]['path'])) {
+        // Add the style to our list.
+        $lineage[$current_style] = $all_styles[$current_style]['path'];
+      }
+    }
+
+    $lineages[$style] = $lineage;
+  }
+
+  return $lineages[$style];
+}
+
+/**
+ * Starting at a given style, return path of template file
+ */
+function advanced_forum_style_template_path($template_name, $style = NULL) {
+  static $styles_files = array();
+
+  if (empty($styles_files)) {
+    $styles_files = file_scan_directory(drupal_get_path('module', 'advanced_forum') . '/styles', '/(.*)/', array(), 2);
+  }
+
+  $lineage = advanced_forum_style_lineage($style);
+
+  $path = '';
+  foreach ($lineage as $key => $path) {
+    $template_path ="";
+  }
+    return $path;
+}
+
+function advanced_forum_template_basename(&$file, $key, $extension) {
+  $file->name = basename($file->uri, $extension);
+}
+
+function advanced_forum_find_style_templates($style = NULL) {
+  // Get theme engine extension
+  global $theme_engine;
+  $extension = '.tpl.php';
+  if (isset($theme_engine)) {
+    $extension_function = $theme_engine . '_extension';
+    if (function_exists($extension_function)) {
+      $extension = $extension_function();
+    }
+  }
+
+  // Most significant style template comes first in lineage array
+  $lineage = array_reverse(advanced_forum_style_lineage($style), TRUE);
+
+  $templates = array();
+
+  // Loop through each style folder looking for templates
+  foreach ($lineage as $key => $path) {
+    $styles_files = file_scan_directory($path, '/' . str_replace('.', '\.', $extension) . '$/', array('key' => 'filename'));
+    // Fix name - file_scan_directory returns template.tpl as name
+    //array_walk($styles_files, 'advanced_forum_template_basename', $extension);
+    foreach ($styles_files as $file) {
+      $file->name = basename($file->uri, $extension);
+      $theme_file = $file->name;
+      $theme_path = advanced_forum_path_to_theme();
+
+      // Remove style name from file name
+      $theme_base_file = str_replace(".$key.", "-", $file->name);
+
+      // Transform - in filenames to _ to match function naming scheme
+      // and create proper hook name
+      $hook = strtr($theme_base_file, '-', '_');
+
+      // Check for user theme template override
+      // 1. check for <theme>/<style>/advanced-forum.<style>.<template>.tpl.php
+      if (file_exists($theme_path . "/$key/" . $file->name . $extension)) {
+        $theme_path = $theme_path . "/$key";
+      }
+      // 2. check for <theme>/advanced-forum-<template>.tpl.php
+      elseif (file_exists($theme_path . "/" . $theme_base_file . $extension)) {
+        $theme_file = $theme_base_file;
+      }
+      // 3. check for advanced_forum/styles/<style>/... template
+      else {
+        $theme_path = dirname($file->uri);
+      }
+
+      $templates[$hook] = array(
+        'template' => $theme_file,
+        'path' => $theme_path,
+      );
+    }
+  }
+  return $templates;
+}
+
+/**
+ * Load any .inc files related to the style so that preprocess
+ * functions can run as appropriate.
+ */
+function advanced_forum_load_style_includes($style = NULL) {
+  $lineage = advanced_forum_style_lineage($style);
+  foreach ($lineage as $key => $path) {
+    if (file_exists("$path/$key.inc")) {
+      require_once("$path/$key.inc");
+    }
+  }
+}
+
+/**
+ * Get the info for a style, using an additive notation to
+ * include all items from the parent lineage.
+ */
+function advanced_forum_style_info($style = NULL) {
+  static $info = array();
+  if (empty($style)) {
+    // If no style is passed in, assume the current style is wanted.
+    $style = advanced_forum_get_current_style();
+  }
+
+  if (!array_key_exists($style, $info)) {
+    $info[$style] = array();
+    $lineage = advanced_forum_style_lineage();
+    foreach ($lineage as $key => $dir) {
+      // using the + operator is additive but will not overwrite.
+      // $lineage comes out as the actual style with each
+      // successive style after it, so simply adding the arrays
+      // together means that all info will be combined and keys
+      // in the parent info will be defaults passed down to children
+      // only if they do not override them.
+      $info[$style] += advanced_forum_get_style($key);
+    }
+  }
+
+  return $info[$style];
+}
+
+function advanced_forum_is_styled($content, $teaser = FALSE, $type = 'node') {
+  // This is the ID of the topic starting node
+  static $master_topic_id;
+
+  // Give other modules a first crack at making the decision. To keep this
+  // simple, he last one in the array wins.
+  $topic_ids = module_invoke_all('advanced_forum_is_styled_alter', $content, $teaser, $type);
+  $topic_id = end($topic_ids);
+
+  if (!$topic_id) {
+    // If no other modules made a decision on this, we look at it.
+    switch ($type) {
+      case 'node':
+        // See if the node should be styled.
+        $topic_id = advanced_forum_node_is_styled($content, $teaser);
+        break;
+
+      case 'comment':
+        $topic_id = advanced_forum_comment_is_styled($content, $master_topic_id);
+        break;
+
+      case 'comment-wrapper':
+        if ($content->nid == $master_topic_id) {
+          // Use our comment wrapper only if we are on a styled node.
+          $topic_id = $master_topic_id;
+        }
+        break;
+      }
+    }
+
+  if ($topic_id > 0) {
+    // If we have a positive number for the topic ID, then this item is styled.
+    // We need to update the master ID, add the CSS/JS files, and tell the caller
+    // our decision.
+    $master_topic_id = $topic_id;
+    _advanced_forum_add_files();
+    return TRUE;
+  }
+  elseif ($topic_id == -42) {
+    // A -42 means all the tests passed but the node is being previewed so there
+    // is no node id, yet. Add the files and return true but don't update the
+    // master topic ID.
+    _advanced_forum_add_files();
+    return TRUE;
+  }
+
+}
+
+function advanced_forum_node_is_styled($node, $teaser = FALSE) {
+  // Get the list of types that should have the style applied
+  $styled_node_types = variable_get('advanced_forum_styled_node_types', array('forum'));
+  // If this type is in the list of types that should be styled...
+  if (in_array($node->type, $styled_node_types)) {
+    // ...and if we are styling teasers or this isn't a teaser...
+    if (variable_get('advanced_forum_style_teasers', FALSE) || !$teaser) {
+      // ...and if this is not a new node being previewed...
+      if (!empty($node->nid)) {
+        // ...and if we are styling non forum tagged nodes or this is forum tagged...
+        if (!variable_get('advanced_forum_style_only_forum_tagged', TRUE) || advanced_forum_is_forum_tagged($node)) {
+          // ... then return the node ID.
+          return $node->nid;
+        }
+      }
+      // ...or if this _is_ a new node being previewed...
+      else {
+        // ...and if we are styling non forum tagged nodes or this is forum tagged...
+        if (!variable_get('advanced_forum_style_only_forum_tagged', TRUE) || advanced_forum_is_forum_tagged($node, TRUE)) {
+          // ...Send back -42 as a special code to say that this should be
+          // styled but that it isn't the actual node id.
+          return -42;
+        }
+      }
+    }
+  }
+}
+
+function advanced_forum_comment_is_styled($comment, $master_topic_id) {
+  if (isset($master_topic_id) && ($comment->nid == $master_topic_id)) {
+    // This comment is on a node we already know is styled, or a previous
+    // comment on this node is styled, so the comment is styled.
+    return $master_topic_id;
+  }
+
+  if (variable_get("advanced_forum_style_all_comments", 0)) {
+    // All comments on this site should be styled.
+    return $comment->nid;
+  }
+
+  // Load up the node this comment is attached to and see if it is styled.
+  // This should not happen often, only in a case where the comment is
+  // displayed seperately from the node (such as a reply preview).
+  $node = node_load($comment->nid);
+  if (advanced_forum_node_is_styled($node, FALSE)) {
+    return $comment->nid;
+  }
+
+  // Comment doesn't pass any styling test
+  return -1;
+}
+
+function advanced_forum_is_forum_tagged($node, $preview = FALSE) {
+  // Is this a forum node at all?
+  if (empty($node->taxonomy_forums)) {
+    return FALSE;
+  }
+  $vid = variable_get('forum_nav_vocabulary');
+
+  // Check for language used
+  if (empty($node->taxonomy_forums[$node->language])) {
+    $langcode = LANGUAGE_NONE;
+  }
+  else {
+    $langcode = $node->language;
+  }
+
+  if ($preview) {
+     foreach ($node->taxonomy_forums[$langcode] as $tforum) {
+      if ($tforum['taxonomy_term']->vid == $vid) {
+        return TRUE;
+      }
+    }
+  }
+  else {
+    // Get a list of the terms attached to this node
+    $terms = $node->taxonomy_forums[$langcode];
+    if (count($terms) > 0) {
+      return TRUE;
+    }
+  }
+}
+
+/**
+ * Returns the path to actual site theme in use because path_to_theme is flaky.
+ */
+function advanced_forum_path_to_theme() {
+  global $theme;
+
+  if (!empty($theme)) {
+    // Normally, the global theme variable is set, so we use that.
+    return drupal_get_path('theme', $theme);
+  }
+
+  // For some reason I've never figured out, some users are reporting
+  // that the global theme variable is not set when this is called.
+  // As a band-aid solution, this will pull the default theme out of the
+  // database and use that.
+  $default_theme = variable_get('theme_default', 'garland');
+  return drupal_get_path('theme', $default_theme);
+}
+
+/**
+ * Manipulate the template suggestions to add in one for each style as well
+ * as the default.
+ */
+function advanced_forum_add_template_suggestions($template, &$variables) {
+  // adjust template name
+  $template = strtr($template, '-', '_');
+  if (strpos($template, 'advanced_forum') === FALSE) {
+    $template = "advanced_forum_" . $template;
+  }
+  // Set AF template as most significant suggestion
+  $variables['theme_hook_suggestion'] = $template;
+  $variables['theme_hook_suggestions'][] = $template;
+  return;
+}
+
+/**
+ * Adds extra files needed for styling.
+ * This is currently just CSS files but was made generic to allow adding
+ * javascript in the future.
+ */
+function _advanced_forum_add_files() {
+  // This could get called more than once on a page and we only need to do it once.
+  static $added;
+
+  if (empty($added)) {
+    $added = TRUE;
+    $lineage = advanced_forum_style_lineage();
+    $lineage = array_reverse($lineage, TRUE);
+    $theme_path = advanced_forum_path_to_theme();
+
+    foreach (array('structure.css', 'style.css', 'images.css') as $css_type) {
+      $css_file = "$theme_path/advanced-forum.$css_type";
+      if (file_exists($css_file)) {
+        // CSS files with no style name in the theme directory trump all
+        // to provide a theme specific style override.
+        drupal_add_css($css_file);
+      }
+      else {
+        // For each style from the current style on up through each parent
+        // style, look for the style specific CSS file first in the active
+        // theme and then in the style directory.
+        foreach ($lineage AS $key => $path) {
+          $css_file = "/advanced-forum.$key.$css_type";
+          if (file_exists("$theme_path/$css_file")) {
+            // If the style specific file is in the theme, use that.
+            drupal_add_css("$theme_path/$css_file");
+          }
+          elseif (file_exists("$path/$css_file")) {
+            // Otherwise look in the style for it.
+            drupal_add_css("$path" . "$css_file");
+          }
+        }
+      }
+    }
+
+    advanced_forum_load_style_includes();
+  }
+}
+
+// CTOOLS INTEGRATION FOR STYLES ********************************************/
+
+function advanced_forum_ctools_plugin_type() {
+  return array(
+    'styles' => array(
+      'info file' => TRUE,
+      'load themes' => TRUE,
+    ),
+  );
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/template_preprocess_advanced_forum_topic_list_view.inc b/htmltest/sites/all/modules/advanced_forum/includes/template_preprocess_advanced_forum_topic_list_view.inc
new file mode 100644
index 00000000..efb7deff
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/template_preprocess_advanced_forum_topic_list_view.inc
@@ -0,0 +1,231 @@
+<?php
+
+/**
+ * @file
+ * Holds the contents of a preprocess function moved into its own file
+ * to ease memory requirements and having too much code in one file.
+ */
+function _template_preprocess_advanced_forum_topic_list_view(&$variables) {
+
+  // Even though this isn't needed for the actual topic list view, the other
+  // views use this same style and need the AF style files added.
+  _advanced_forum_add_files();
+  advanced_forum_add_template_suggestions("topic-list-view", $variables);
+
+  $view = $variables['view'];
+
+  // We need the raw data for this grouping, which is passed in as $variables['rows'].
+  // However, the template also needs to use for the rendered fields.  We
+  // therefore swap the raw data out to a new variable and reset $variables['rows']
+  // so that it can get rebuilt.
+  $result = $variables['rows'];
+  $variables['rows'] = array();
+  $variables['field_classes'] = array();
+
+  $options = $view->style_plugin->options;
+  $handler = $view->style_plugin;
+
+  $fields = &$view->field;
+  $columns = $handler->sanitize_columns($options['columns'], $fields);
+
+  $active = !empty($handler->active) ? $handler->active : '';
+  $order = !empty($handler->order) ? $handler->order : 'asc';
+
+  $query = tablesort_get_query_parameters();
+  if (isset($view->exposed_raw_input)) {
+    $query += $view->exposed_raw_input;
+  }
+
+  $header = array();
+
+  $forum = $view->style_plugin->get_forum_ids();
+
+  // Fields must be rendered in order as of Views 2.3, so we will pre-render
+  // everything.
+  $renders = $handler->render_fields($result);
+
+  $keys = array_keys($view->field);
+  $stickies_done = FALSE;
+  $sticky_count = 0;
+
+  foreach ($result as $count => $row) {
+    // Grab the teaser so it can be used on the title of the td as a popup
+    // preview. By default, the view provides the teaser as a popup on the
+    // title link.
+    if (!empty($renders[$count]['teaser'])) {
+      $teaser = $renders[$count]['teaser'];
+      $teaser = htmlentities($teaser);
+      $teasers[$count] = $teaser;
+    }
+
+    // Determine stickiness.
+    if (!$stickies_done) {
+      $sticky[$count] = !empty($row->topic_is_sticky);
+      if ($sticky[$count]) {
+        $sticky_count++;
+        $variables['row_classes'][$count][] = 'sticky';
+      }
+      else {
+        $stickies_done = TRUE;
+        if ($sticky_count) {
+          // This ends up appearing only if we have both sticky and non sticky posts.
+          // Otherwise it will never show up.
+          $variables['row_classes'][$count - 1][] = 'forum-last-sticky';
+        }
+      }
+    }
+
+    // Shadow (moved) topics.
+    if ($forum && !in_array($row->topic_actual_forum, $forum)) {
+      $term = taxonomy_term_load($row->topic_actual_forum);
+      $variables['shadow'][$count] = theme('advanced_forum_shadow_topic', array(
+        'title' => $row->node_title,
+        'nid' => $row->nid,
+        'new_forum' => empty($term->name) ? "" : $term->name
+          ));
+    }
+    else {
+      $variables['shadow'][$count] = FALSE;
+    }
+  }
+
+  // Make the sticky variable available to the template.
+  $variables['sticky'] = $sticky;
+  $variables['teasers'] = empty($teasers) ? NULL : $teasers;
+
+  foreach ($columns as $field => $column) {
+    // Create a second variable so we can easily find what fields we have and what the
+    // CSS classes should be.
+    $variables['fields'][$field] = drupal_clean_css_identifier($field);
+    if ($active == $field) {
+      $variables['fields'][$field] .= ' active';
+    }
+
+    // render the header labels
+    if ($field == $column && empty($fields[$field]->options['exclude'])) {
+      $label = check_plain(!empty($fields[$field]) ? $fields[$field]->label() : '');
+      if (empty($options['info'][$field]['sortable']) || !$fields[$field]->click_sortable()) {
+        $variables['header'][$field] = $label;
+      }
+      else {
+        $initial = !empty($options['info'][$field]['default_sort_order']) ? $options['info'][$field]['default_sort_order'] : 'asc';
+
+        if ($active == $field) {
+          $initial = ($order == 'asc') ? 'desc' : 'asc';
+        }
+
+        $title = t('sort by @s', array('@s' => $label));
+        if ($active == $field) {
+          $label .= theme('tablesort_indicator', array('style' => $initial));
+        }
+
+        $query['order'] = $field;
+        $query['sort'] = $initial;
+        $link_options = array(
+          'html' => TRUE,
+          'attributes' => array('title' => $title),
+          'query' => $query,
+        );
+        $variables['header'][$field] = l($label, $_GET['q'], $link_options);
+      }
+
+      $variables['header_classes'][$field] = '';
+      // Set up the header label class.
+      if ($fields[$field]->options['element_default_classes']) {
+        $variables['header_classes'][$field] .= "views-field views-field-" . $variables['fields'][$field];
+      }
+      $class = $fields[$field]->element_label_classes(0);
+      if ($class) {
+        if ($variables['header_classes'][$field]) {
+          $variables['header_classes'][$field] .= ' ';
+        }
+        $variables['header_classes'][$field] .= $class;
+      }
+
+      // Add a header label wrapper if one was selected.
+      if ($variables['header'][$field]) {
+        $element_label_type = $fields[$field]->element_label_type(TRUE, TRUE);
+        if ($element_label_type) {
+          $variables['header'][$field] = '<' . $element_label_type . '>' . $variables['header'][$field] . '</' . $element_label_type . '>';
+        }
+      }
+    }
+
+    // Add a CSS align class to each field if one was set
+    if (!empty($options['info'][$field]['align'])) {
+      $variables['fields'][$field] .= ' ' . drupal_clean_css_identifier($options['info'][$field]['align']);
+    }
+
+    // Render each field into its appropriate column.
+    foreach ($result as $num => $row) {
+      // Add field classes
+      $variables['field_classes'][$field][$num] = '';
+      if ($fields[$field]->options['element_default_classes']) {
+        $variables['field_classes'][$field][$num] = "views-field views-field-" . $variables['fields'][$field];
+      }
+      if ($classes = $fields[$field]->element_classes($num)) {
+        if ($variables['field_classes'][$field][$num]) {
+          $variables['field_classes'][$field][$num] .= ' ';
+        }
+
+        $variables['field_classes'][$field][$num] .= $classes;
+      }
+      $variables['field_attributes'][$field][$num] = array();
+
+      if (!empty($fields[$field]) && empty($fields[$field]->options['exclude'])) {
+        $field_output = $renders[$num][$field];
+        $element_type = $fields[$field]->element_type(TRUE, TRUE);
+        if ($element_type) {
+          $field_output = '<' . $element_type . '>' . $field_output . '</' . $element_type . '>';
+        }
+
+        // Don't bother with separators and stuff if the field does not show up.
+        if (empty($field_output) && !empty($variables['rows'][$num][$column])) {
+          continue;
+        }
+
+        // Place the field into the column, along with an optional separator.
+        if (!empty($variables['rows'][$num][$column])) {
+          if (!empty($options['info'][$column]['separator'])) {
+            $variables['rows'][$num][$column] .= filter_xss_admin($options['info'][$column]['separator']);
+          }
+        }
+        else {
+          $variables['rows'][$num][$column] = '';
+        }
+
+        $variables['rows'][$num][$column] .= $field_output;
+      }
+    }
+  }
+
+  $count = 0;
+  foreach ($variables['rows'] as $num => $row) {
+    $variables['row_classes'][$num][] = ($count++ % 2 == 0) ? 'odd' : 'even';
+    if ($row_class = $handler->get_row_class($num)) {
+      $variables['row_classes'][$num][] = $row_class;
+    }
+  }
+
+  $variables['row_classes'][0][] = 'views-row-first';
+  $variables['row_classes'][count($variables['row_classes']) - 1][] = 'views-row-last';
+
+  $variables['classes_array'] = array('forum-table', 'forum-table-topics');
+  if (empty($variables['rows']) && !empty($options['empty_table'])) {
+    $variables['rows'][0][0] = $view->display_handler->render_area('empty');
+    // Calculate the amounts of rows with output.
+    $variables['field_attributes'][0][0]['colspan'] = count($variables['header']);
+    $variables['field_classes'][0][0] = 'views-empty';
+  }
+
+
+  if (!empty($options['sticky'])) {
+    drupal_add_js('misc/tableheader.js');
+    $variables['classes_array'][] = "sticky-enabled";
+  }
+  $variables['classes_array'][] = 'cols-' . count($variables['header']);
+
+  if (!empty($handler->options['summary'])) {
+    $variables['attributes_array'] = array('summary' => $handler->options['summary']);
+  }
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/theme.inc b/htmltest/sites/all/modules/advanced_forum/includes/theme.inc
new file mode 100644
index 00000000..4f27ae3f
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/theme.inc
@@ -0,0 +1,543 @@
+<?php
+
+/**
+ * @file
+ * Holds theme functions and template preprocesses.
+ * Other style related functions are in style.inc
+ */
+// THEME FUNCTIONS **********************************************************/
+
+/**
+ * Theme function to display a link, optionally buttonized.
+ */
+function theme_advanced_forum_l(&$variables) {
+  $text = $variables['text'];
+  $path = empty($variables['path']) ? NULL : $variables['path'];
+  $options = empty($variables['options']) ? array() : $variables['options'];
+  $button_class = empty($variables['button_class']) ? NULL : $variables['button_class'];
+
+  $l = '';
+  if (!isset($options['attributes'])) {
+    $options['attributes'] = array();
+  }
+  if (!is_null($button_class)) {
+    // Buttonized link: add our button class and the span.
+    if (!isset($options['attributes']['class'])) {
+      $options['attributes']['class'] = array("af-button-$button_class");
+    }
+    else {
+      $options['attributes']['class'][] = "af-button-$button_class";
+    }
+    $options['html'] = TRUE;
+    $l = l('<span>' . $text . '</span>', $path, $options);
+  }
+  else {
+    // Standard link: just send it through l().
+    $l = l($text, $path, $options);
+  }
+
+  return $l;
+}
+
+/**
+ * Theme function to show list of types that can be posted in forum.
+ */
+function theme_advanced_forum_node_type_create_list(&$variables) {
+  $forum_id = $variables['forum_id'];
+
+  // Get the list of node types to display links for.
+  $type_list = advanced_forum_node_type_create_list($forum_id);
+
+  $output = '';
+  if (is_array($type_list)) {
+    foreach ($type_list as $type => $item) {
+      $output .= '<div class="forum-add-node forum-add-' . $type . '">';
+      $output .= theme('advanced_forum_l', array(
+        'text' => t('New @node_type', array('@node_type' => $item['name'])),
+        'path' => $item['href'],
+        'options' => NULL,
+        'button_class' => 'large'
+          ));
+      $output .= '</div>';
+    }
+  }
+  else {
+    // User did not have access to create any node types in this fourm so
+    // we just return the denial text / login prompt.
+    $output = $type_list;
+  }
+
+  return $output;
+}
+
+/**
+ * Theme function to show simple author pane when not using Author Pane.
+ */
+function theme_advanced_forum_simple_author_pane(&$variables) {
+  $context = $variables['context'];
+  // Sending the context rather than the account makes it work for anon comments.
+  $name = theme('username', array('account' => $context));
+
+  $account = user_load($context->uid);
+  $picture = theme('user_picture', array('account' => $account));
+
+  return '<div class="author-pane">' . $name . $picture . '</div>';
+}
+
+/**
+ * Theme function to format the reply link at the top/bottom of topic.
+ */
+function theme_advanced_forum_reply_link(&$variables) {
+  $node = $variables['node'];
+
+  // Get the information about whether the user can reply and the link to do
+  // so if the user is allowed to.
+  $reply_link = advanced_forum_get_reply_link($node);
+
+  if (is_array($reply_link)) {
+    // Reply is allowed. Variable contains the link information.
+    $output = '<div class="topic-reply-allowed">';
+    $output .= theme('advanced_forum_l', array(
+      'text' => $reply_link['title'],
+      'path' => $reply_link['href'],
+      'options' => $reply_link['options'],
+      'button_class' => 'large'
+        ));
+    $output .= '</div>';
+    return $output;
+  }
+  elseif ($reply_link == 'reply-locked') {
+    // @TODO: The double span here is icky but I don't know how else to get
+    // around the fact that there's no "a" to put the button class on.
+    return '<div class="topic-reply-locked"><span class="af-button-large"><span>' . t('Topic locked') . '</span></span></div>';
+  }
+  elseif ($reply_link == 'reply-forbidden') {
+    // User is not allowed to reply to this topic.
+    return theme('comment_post_forbidden', array('node' => $node));
+  }
+}
+
+/**
+ * Theme function to a formatted list of subforums.
+ *
+ * @param $subforum_list
+ *   Array of subforums.
+ * @return
+ *   Formatted list of subforums.
+ */
+function theme_advanced_forum_subforum_list(&$variables) {
+  $subforums = array();
+  foreach ($variables['subforum_list'] as $tid => $subforum) {
+    // Note: $subforum->name has not been run through check_plain because
+    // it ends up going through there when l() is called without the HTML
+    // option. If you change this to set HTML to TRUE, you must sanitize it.
+    $text = l($subforum->name, "forum/$tid");
+    $text .= ' (' . $subforum->total_posts;
+
+    if (empty($subforum->new_posts)) {
+      $text .= ')';
+    }
+    else {
+      $text .= ' - ' . l($subforum->new_posts_text, $subforum->new_posts_path, array('fragment' => 'new')) . ')';
+    }
+
+    $subforums[] = $text;
+  }
+  return implode(', ', $subforums);
+}
+
+/**
+ * Theme function to a formatted list of subcontainers.
+ *
+ * @param $subcontainer_list
+ *   Array of subcontainers.
+ * @return
+ *   Formatted list of subcontainers.
+ */
+function theme_advanced_forum_subcontainer_list(&$variables) {
+  $subcontainers = array();
+  foreach ($variables['subcontainer_list'] as $tid => $subcontainer) {
+    // Note: $subcontainer->name has not been run through check_plain because
+    // it ends up going through there when l() is called without the HTML
+    // option. If you change this to set HTML to TRUE, you must sanitize it.
+    $text = l($subcontainer->name, "forum/$tid");
+    $text .= ' (' . $subcontainer->total_posts;
+
+    if (empty($subcontainer->new_posts)) {
+      $text .= ')';
+    }
+    else {
+      $text .= ' - ' . l($subforum->new_posts_text, $subforum->new_posts_path, array('fragment' => 'new')) . ')';
+    }
+
+    $subcontainers[] = $text;
+  }
+
+  return implode(', ', $subcontainers);
+}
+
+// TEMPLATE PREPROCESS ******************************************************/
+
+/* * * FORUM OVERVIEW & TOPIC LIST PAGES ************************************* */
+
+/**
+ * Preprocesses template variables for the forum template.
+ */
+function advanced_forum_preprocess_forums(&$variables) {
+  include_once drupal_get_path('module', 'advanced_forum') . '/includes/advanced_forum_preprocess_forums.inc';
+  _advanced_forum_preprocess_forums($variables);
+}
+
+/**
+ * Preprocesses template variables for the forum search form template.
+ */
+function advanced_forum_preprocess_advanced_forum_search_forum(&$variables) {
+  advanced_forum_add_template_suggestions("search_forum", $variables);
+
+  $variables['forum'] = !empty($variables['tid']) ? $variables['tid'] : 'All';
+  $variables['path'] = url('forum/search');
+}
+
+/**
+ * Preprocesses template variables for the search results template.
+ */
+function advanced_forum_preprocess_views_view_fields__advanced_forum_search(&$variables) {
+  _advanced_forum_add_files();
+  advanced_forum_add_template_suggestions("search_result", $variables);
+}
+
+/**
+ * Preprocesses template variables for the submitted by/in template.
+ */
+function advanced_forum_preprocess_forum_submitted(&$variables) {
+  advanced_forum_add_template_suggestions("submitted", $variables);
+  // Avoid E_ALL warning
+  $variables['topic_link'] = '';
+
+  if (isset($variables['topic']->node_title)) {
+    $nid = $variables['topic']->nid;
+
+    // Make a fake node object to avoid the node load
+    $node = new stdClass();
+    $node->nid = $nid;
+    $node->type = $variables['topic']->type;
+
+    // Find the page of the first unread comment, if any
+    $comment_count = db_query('SELECT COUNT(cid) FROM {comment} WHERE nid = :nid', array(':nid' => $nid))->fetchField();
+    $new_replies = advanced_forum_reply_num_new($nid);
+    $query = advanced_forum_page_first_new($comment_count, $new_replies, $node);
+
+    // Format the node title with a link
+    $title_length = variable_get('advanced_forum_topic_title_length', 15);
+    if ($title_length == 0) {
+      $short_topic_title = $variables['topic']->node_title;
+    }
+    else {
+      $short_topic_title = truncate_utf8($variables['topic']->node_title, $title_length, TRUE, TRUE);
+    }
+
+    $variables['short_topic_title'] = $short_topic_title;
+
+    $fragment = ($new_replies) ? 'new' : NULL;
+
+    $variables['topic_link_fragment'] = $fragment;
+    $variables['topic_link_query'] = $query;
+    $variables['topic_link'] = l($short_topic_title, "node/$nid", array('query' => $query, 'fragment' => $fragment));
+  }
+
+  if (isset($variables['topic']->created)) {
+    $timestamp = $variables['topic']->created;
+    $interval = REQUEST_TIME - $timestamp;
+    $variables['time'] = format_interval($interval);
+
+    // For items posted more than $cutoff hours ago, offer an actual date.
+    $cutoff = variable_get('advanced_forum_time_ago_cutoff', 48) * 60 * 60;
+    if ($interval > $cutoff) {
+      $variables['date_posted'] = format_date($timestamp, 'short');
+    }
+    else {
+      unset($variables['date_posted']);
+    }
+  }
+}
+
+function advanced_forum_preprocess_advanced_forum_topic_pager(&$variables) {
+  $pagecount = $variables['pagecount'];
+  $topic = $variables['topic'];
+
+  // Get the information to assemble the pager. This returns an object with
+  // the following properties:
+  //  initial_pages: Array of linked numbers for first set of pages
+  //  last_page_text: Linked text "Last page" (translatable)
+  //  last_page_number: Linked number pointing to the last page.
+  $topic_pager = advanced_forum_create_topic_pager($pagecount, $topic);
+
+
+  $variables['last_page_text'] = '';
+
+  if (!empty($topic_pager->initial_pages)) {
+    $variables['pages'] = $topic_pager->initial_pages;
+    if (!empty($topic_pager->last_page_text)) {
+      $variables['last_page'] = $topic_pager->last_page;
+      $variables['last_page_text'] = $topic_pager->last_page_text;
+      $variables['last_page_number'] = $topic_pager->last_page_number;
+
+      // If you prefer to end with the number, replace
+      // $topic_pager->last_page_text with $topic_pager->last_page_number
+      $variables['last_page_text'] = ' &hellip; ' . $topic_pager->last_page_text;
+    }
+  }
+}
+
+/**
+ * Preprocess variables for advanced-forum.naked.post-edited.tpl.php
+ *
+ */
+function advanced_forum_preprocess_advanced_forum_post_edited(&$variables) {
+  $editor = user_load($variables['who']);
+
+  $variables['edited_name'] = theme('username', array('account' => $editor));
+  $variables['edited_datetime'] = format_date($variables['when'], 'custom', variable_get('date_format_short', 'm/d/Y - H:i'));
+  $variables['edited_reason'] = empty($variables['why']) ? '' : $variables['why'];
+}
+
+function advanced_forum_preprocess_advanced_forum_shadow_topic(&$variables) {
+  $nid = $variables['nid'];
+
+  $variables['new_forum_url'] = url("node/$nid");
+  // compatibility variable
+  $variables['new_forum_link'] = l(t('View topic'), "node/$nid");
+}
+
+/* * * JUST FORUM OVERVIEW PAGE ********************************************** */
+
+/**
+ * Preprocesses template variables for the forum legend template.
+ */
+function advanced_forum_preprocess_advanced_forum_forum_legend(&$variables) {
+  advanced_forum_add_template_suggestions("forum_legend", $variables);
+}
+
+/**
+ * Preprocesses template variables for the forum statistics template.
+ */
+function advanced_forum_preprocess_advanced_forum_statistics(&$variables) {
+  advanced_forum_add_template_suggestions("statistics", $variables);
+
+  $variables['topics'] = advanced_forum_statistics_topics();
+  $variables['posts'] = advanced_forum_statistics_replies() + $variables['topics'];
+  $variables['users'] = advanced_forum_statistics_users();
+
+  $authenticated_users = advanced_forum_statistics_online_users();
+  $variables['online_users'] = implode(', ', $authenticated_users);
+  $variables['current_users'] = advanced_forum_session_count(FALSE);
+  $variables['current_guests'] = 0; // for backwards compatibility
+  $variables['current_total'] = $variables['current_users'] + $variables['current_guests'];
+
+  $latest_users = advanced_forum_statistics_latest_users();
+  $variables['latest_users'] = implode(', ', $latest_users);
+}
+
+/**
+ * Preprocesses template variables for the forum list template.
+ */
+function advanced_forum_preprocess_forum_list(&$variables) {
+  include_once drupal_get_path('module', 'advanced_forum') . '/includes/advanced_forum_preprocess_forum_list.inc';
+  _advanced_forum_preprocess_forum_list($variables);
+}
+
+/* * * JUST TOPIC LIST PAGES ************************************************* */
+
+function advanced_forum_preprocess_views_view_forum_topic_list__advanced_forum_topic_list(&$variables) {
+  _advanced_forum_add_files();
+  // debug
+  die("advanced_forum_preprocess_views_view_forum_topic_list__advanced_forum_topic_list");
+  advanced_forum_add_template_suggestions("topic_list_view", $variables);
+  // Set a variable for displaying the topic legend.
+  $variables['topic_legend'] = theme('advanced_forum_topic_legend');
+}
+
+function advanced_forum_preprocess_views_view__advanced_forum_topic_list(&$variables) {
+  _advanced_forum_add_files();
+  advanced_forum_add_template_suggestions("topic_list_outer_view", $variables);
+
+  $variables['node_create_list'] = '';
+  $variables['forum_tools'] = '';
+  $variables['forum_jump'] = '';
+
+  $menu_item = menu_get_item();
+
+  if (!empty($menu_item) && $menu_item['access']) {
+    if (($menu_item['map'][0] == 'forum') && (!empty($menu_item['map'][1]))) {
+      $forum = $menu_item['map'][1];
+      if ($forum->vid == variable_get('forum_nav_vocabulary') && $forum->tid > 0) {
+        $variables['node_create_list'] = theme('advanced_forum_node_type_create_list', array('forum_id' => $forum->tid));
+        $variables['forum_description'] = $forum->description;
+        $variables['forum_tools'] = advanced_forum_forum_tools($forum->tid);
+        $variables['forum_jump'] = advanced_forum_forum_jump($forum->tid);
+      }
+    }
+  }
+}
+
+/**
+ * Display a view as a forum topic list style.
+ */
+function template_preprocess_advanced_forum_topic_list_view(&$variables) {
+  include_once drupal_get_path('module', 'advanced_forum') . '/includes/template_preprocess_advanced_forum_topic_list_view.inc';
+  _template_preprocess_advanced_forum_topic_list_view($variables);
+}
+
+/**
+ * Preprocesses template variables for the topic list template.
+ */
+function advanced_forum_preprocess_forum_topic_list(&$variables) {
+  advanced_forum_add_template_suggestions("topic_list", $variables);
+}
+
+/**
+ * Preprocesses template variables for the forum icon template.
+ */
+function advanced_forum_preprocess_forum_icon(&$variables) {
+  advanced_forum_add_template_suggestions("topic_icon", $variables);
+}
+
+/**
+ * Preprocesses template variables for the topic legend template.
+ */
+function advanced_forum_preprocess_advanced_forum_topic_legend(&$variables) {
+  advanced_forum_add_template_suggestions("topic_legend", $variables);
+}
+
+/* * * TOPIC PAGES *********************************************************** */
+
+function advanced_forum_preprocess_advanced_forum_search_topic(&$variables) {
+  advanced_forum_add_template_suggestions("search_topic", $variables);
+
+  $variables['path'] = url('node/' . $variables['node']->nid . '/search');
+}
+
+function advanced_forum_preprocess_views_view_fields__advanced_forum_search_topic(&$variables) {
+  _advanced_forum_add_files();
+  advanced_forum_add_template_suggestions("search_result", $variables);
+}
+
+/**
+ * Preprocesses template variables for the topic header template.
+ */
+function advanced_forum_preprocess_advanced_forum_topic_header(&$variables) {
+  advanced_forum_add_template_suggestions("topic_header", $variables);
+
+  $node = $variables['node'];
+
+
+  // Reply link / button
+  $variables['reply_link'] = theme('advanced_forum_reply_link', array('node' => $node));
+
+  // Total posts, including first post.
+  $posts = (empty($variables['comment_count'])) ? 1 : $variables['comment_count'] + 1;
+  $variables['total_posts_count'] = format_plural($posts, '1 post', '@count posts');
+
+  // Number of new posts on topic.
+  $variables['new_posts_count'] = advanced_forum_reply_num_new($node->nid);
+
+  // Link to first new post.
+  $variables['first_new_post_link'] = '';
+  if ($posts > 1) {
+    $variables['first_new_post_link'] = advanced_forum_first_new_post_link($variables['node'], $variables['comment_count']);
+  }
+
+  // Link to last post in topic.
+  $variables['last_post_link'] = advanced_forum_last_post_link($node);
+
+  // Pager
+  if (isset($variables['node']->comment_count))
+    pager_default_initialize($variables['node']->comment_count, variable_get('comment_default_per_page_' . $variables['node']->type, 50));
+
+
+  $variables['pager'] = theme('pager');
+}
+
+/**
+ * Preprocesses template variables for the active poster template.
+ */
+function advanced_forum_preprocess_advanced_forum_active_poster(&$variables) {
+  advanced_forum_add_template_suggestions("active_poster", $variables);
+
+  $variables['account_name'] = theme('username', array('account' => $variables['account']));
+  $variables['picture'] = theme('advanced_forum_user_picture', array('account' => $variables['account']));
+
+  $node = $variables['last_post'];
+  $variables['last_post_title'] = l($node->title, "node/$node->nid");
+  $variables['last_post_date'] = format_date($node->created);
+}
+
+/**
+ * Preprocesses template variables for the author pane.
+ */
+function advanced_forum_preprocess_author_pane(&$variables) {
+  // Author pane is used in various places. Check the caller to make sure
+  // we are the one that called it.
+  if (!empty($variables['caller']) && $variables['caller'] == 'advanced_forum') {
+    advanced_forum_add_template_suggestions("author_pane", $variables);
+  }
+}
+
+/**
+ * Preprocesses template variables for the page template.
+ */
+function advanced_forum_preprocess_page(&$variables) {
+  if (arg(0) == 'forum') {
+    $variables['forum_page'] = TRUE;
+  }
+  elseif (arg(0) == 'node' && !empty($variables['node']) && advanced_forum_type_is_in_forum($variables['node']->type)) {
+    $variables['forum_page'] = TRUE;
+  }
+}
+
+/**
+ * Preprocesses template variables for the node template.
+ */
+function advanced_forum_preprocess_node(&$variables) {
+  if (advanced_forum_is_styled($variables['node'], $variables['teaser'], 'node')) {
+    include_once drupal_get_path('module', 'advanced_forum') . '/includes/advanced_forum_preprocess_node.inc';
+    _advanced_forum_preprocess_node($variables);
+  }
+}
+
+function advanced_forum_preprocess_comment_wrapper(&$variables) {
+  $variables['reply_link'] = '';
+  if (advanced_forum_is_styled($variables['node'], FALSE, 'comment-wrapper')) {
+    advanced_forum_add_template_suggestions("advanced_forum_comment_wrapper", $variables);
+
+    $form_on_seperate_page = variable_get('comment_form_location_' . $variables['node']->type, COMMENT_FORM_SEPARATE_PAGE) == COMMENT_FORM_SEPARATE_PAGE;
+
+    $comments_locked = $variables['node']->comment != COMMENT_NODE_OPEN;
+
+    if ($form_on_seperate_page || $comments_locked) {
+      // If the post is locked or the comment form is on a seperate page,
+      // build the reply/locked link / button
+      $variables['reply_link'] = theme('advanced_forum_reply_link', array('node' => $variables['node']));
+    }
+  }
+}
+
+/**
+ * Preprocesses template variables for the comment template.
+ */
+function advanced_forum_preprocess_comment(&$variables) {
+  if (advanced_forum_is_styled($variables['comment'], FALSE, 'comment')) {
+    include_once drupal_get_path('module', 'advanced_forum') . '/includes/advanced_forum_preprocess_comment.inc';
+    _advanced_forum_preprocess_comment($variables);
+  }
+}
+
+/* * * ORGANIC GROUPS ******************************************************** */
+
+function advanced_forum_preprocess_views_view__advanced_forum_group_topic_list(&$variables) {
+  _advanced_forum_add_files();
+  advanced_forum_add_template_suggestions("group_topic_list_outer_view", $variables);
+
+  // Set a variable for displaying the topic legend.
+  $variables['topic_legend'] = theme('advanced_forum_topic_legend');
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum.views.inc b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum.views.inc
new file mode 100644
index 00000000..070f033e
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum.views.inc
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * @file
+ * Views integration for advanced_forum.
+ */
+
+
+/**
+ * Loads the included views
+ *
+ * This function is used instead of views ability to autodiscover a views
+ * export .inc because this allows us to put each view in its own file.
+ * Thanks to Moshe and OG for the code.
+ */
+function advanced_forum_views_default_views() {
+  global $theme, $theme_path;
+  $files = file_scan_directory(drupal_get_path('module', 'advanced_forum') . '/includes/views', '/\.view$/');
+  $files += file_scan_directory(drupal_get_path('theme', variable_get('theme_default', 'garland')) . '/advanced_forum/views', '/\.view$/');
+
+  foreach ($files as $absolute => $file) {
+    $view = NULL;
+    require $absolute;
+    if (isset($view)) {
+      $views[$view->name] = $view;
+    }
+  }
+  
+  return $views;
+}
+
+/**
+ * Use views_data_alter to add items to the node table that are
+ * relevant to topic icons.
+ */
+function advanced_forum_views_data_alter(&$data) {
+  // Topic icon
+  $data['node']['topic_icon'] = array(
+    'title' => t('Topic Icon'),
+    'help' => t('Icon that shows new posts, hot, sticky, locked, etc.'),
+    'field' => array(
+      'handler' => 'advanced_forum_handler_field_node_topic_icon',
+    ),
+  );
+
+  $data['node']['topic_pager'] = array(
+    'title' => t('Topic Pager'),
+    'help' => t('Small pager for individual topics.'),
+    'field' => array(
+      'handler' => 'advanced_forum_handler_field_node_topic_pager',
+    ),
+  );
+}
+
+/**
+ * Implementation of hook_views_plugins
+ */
+function advanced_forum_views_plugins() {
+  $path = drupal_get_path('module', 'advanced_forum') . '/includes/views';
+  return array(
+    'style' => array(
+      'forum_topic_list' => array(
+        'parent' => 'table',
+        'path' => $path,
+        'title' => t('Forum topic list'),
+        'help' => t('Displays the forum topic list as a view.'),
+        'handler' => 'advanced_forum_plugin_style_forum_topic_list',
+        'theme path' => drupal_get_path('module', 'advanced_forum') . '/includes',
+        'theme file' => 'theme.inc',
+        'theme' => 'advanced_forum_topic_list_view',
+        'uses row plugin' => FALSE,
+        'uses fields' => TRUE,
+        'uses options' => TRUE,
+        'type' => 'normal',
+      ),
+    ),
+  );
+}
+
+/**
+ * Implementation of hook_views_data()
+ */
+function advanced_forum_views_data() {
+  $data = array();
+  // ----------------------------------------------------------------------
+  // forum table
+
+  // Have not defined $data['forum']['table']['group'] since
+  // no fields are defined here yet.
+  $data['forum']['table']['join'] = array(
+    'node_revisions' => array(
+      'left_field' => 'vid',
+      'field' => 'vid',
+    ),
+    'node' => array(
+      'left_field' => 'vid',
+      'field' => 'vid',
+    ),
+  );
+
+  return $data;
+}
\ No newline at end of file
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_active_topics.view b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_active_topics.view
new file mode 100644
index 00000000..48cdc032
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_active_topics.view
@@ -0,0 +1,490 @@
+<?php
+
+// $Id$
+
+/**
+ * DO NOT RE-EXPORT THIS VIEW WITHOUT CHECKING THE FORUM VID.
+ *
+ * When you export, please note the calls to variable_get('forum_nav_vocabulary')
+ * to ensure that the forum vocabulary gets the right vid.
+ */
+$vid = variable_get('forum_nav_vocabulary');
+$vocabulary = taxonomy_vocabulary_load($vid);
+
+/*
+ * View 'advanced_forum_active_topics'
+ */
+
+$view = new view;
+$view->name = 'advanced_forum_active_topics';
+$view->description = 'Shows the active topics in all forums.';
+$view->tag = 'Advanced Forum';
+$view->base_table = 'node';
+$view->human_name = 'Advanced Forum active topics';
+$view->core = 7;
+$view->api_version = '3.0';
+$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+/* Display: Defaults */
+$handler = $view->new_display('default', 'Defaults', 'default');
+$handler->display->display_options['title'] = 'Active forum topics';
+$handler->display->display_options['access']['type'] = 'none';
+$handler->display->display_options['cache']['type'] = 'none';
+$handler->display->display_options['query']['type'] = 'views_query';
+$handler->display->display_options['query']['options']['distinct'] = TRUE;
+$handler->display->display_options['query']['options']['query_comment'] = FALSE;
+$handler->display->display_options['exposed_form']['type'] = 'basic';
+$handler->display->display_options['pager']['type'] = 'full';
+$handler->display->display_options['pager']['options']['items_per_page'] = 20;
+$handler->display->display_options['style_plugin'] = 'forum_topic_list';
+$handler->display->display_options['style_options']['columns'] = array(
+  'nid' => 'nid',
+  'teaser' => 'teaser',
+  'topic_icon' => 'topic_icon',
+  'title' => 'title',
+  'name' => 'name',
+  'timestamp' => 'title',
+  'topic_pager' => 'title',
+  'name_1' => 'title',
+  'created' => 'title',
+  'comment_count' => 'comment_count',
+  'new_comments' => 'comment_count',
+  'totalcount' => 'totalcount',
+  'last_comment_name' => 'last_updated',
+  'last_updated' => 'last_updated',
+  'sticky' => 'sticky',
+  'comment' => 'comment',
+);
+$handler->display->display_options['style_options']['default'] = 'last_updated';
+$handler->display->display_options['style_options']['info'] = array(
+  'nid' => array(
+    'sortable' => 0,
+    'separator' => '',
+  ),
+  'topic_icon' => array(
+    'separator' => '',
+  ),
+  'title' => array(
+    'sortable' => 1,
+    'separator' => ' ',
+  ),
+  'name' => array(
+    'sortable' => 1,
+    'separator' => '',
+  ),
+  'timestamp' => array(
+    'separator' => '',
+  ),
+  'topic_pager' => array(
+    'separator' => '',
+  ),
+  'name_1' => array(
+    'sortable' => 0,
+    'separator' => '',
+  ),
+  'created' => array(
+    'sortable' => 0,
+    'separator' => '',
+  ),
+  'comment_count' => array(
+    'sortable' => 1,
+    'separator' => '<br />',
+  ),
+  'new_comments' => array(
+    'separator' => '',
+  ),
+  'totalcount' => array(
+    'sortable' => 1,
+    'separator' => '',
+  ),
+  'last_comment_name' => array(
+    'sortable' => 1,
+    'separator' => '<br />',
+  ),
+  'last_updated' => array(
+    'sortable' => 1,
+    'separator' => '<br />',
+  ),
+  'sticky' => array(
+    'sortable' => 0,
+    'separator' => '',
+  ),
+  'teaser' => array(
+    'separator' => '',
+  ),
+  'comment' => array(
+    'sortable' => 0,
+    'separator' => '',
+  ),
+);
+$handler->display->display_options['style_options']['override'] = 0;
+$handler->display->display_options['style_options']['sticky'] = 1;
+$handler->display->display_options['style_options']['order'] = 'desc';
+$handler->display->display_options['style_options']['tid'] = 'filter.term_node_tid_depth';
+/* No results behavior: Global: Text area */
+$handler->display->display_options['empty']['text']['id'] = 'area';
+$handler->display->display_options['empty']['text']['table'] = 'views';
+$handler->display->display_options['empty']['text']['field'] = 'area';
+$handler->display->display_options['empty']['text']['empty'] = FALSE;
+$handler->display->display_options['empty']['text']['content'] = 'No active topics.';
+/* Relationship: Content: Taxonomy terms on node */
+$handler->display->display_options['relationships']['term_node_tid']['id'] = 'term_node_tid';
+$handler->display->display_options['relationships']['term_node_tid']['table'] = 'node';
+$handler->display->display_options['relationships']['term_node_tid']['field'] = 'term_node_tid';
+/* Relationship: Content: Author */
+$handler->display->display_options['relationships']['uid']['id'] = 'uid';
+$handler->display->display_options['relationships']['uid']['table'] = 'node';
+$handler->display->display_options['relationships']['uid']['field'] = 'uid';
+/* Field: Content: Nid */
+$handler->display->display_options['fields']['nid']['id'] = 'nid';
+$handler->display->display_options['fields']['nid']['table'] = 'node';
+$handler->display->display_options['fields']['nid']['field'] = 'nid';
+$handler->display->display_options['fields']['nid']['exclude'] = TRUE;
+$handler->display->display_options['fields']['nid']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['nid']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['nid']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['nid']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['nid']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['nid']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['nid']['alter']['html'] = 0;
+$handler->display->display_options['fields']['nid']['hide_empty'] = 0;
+$handler->display->display_options['fields']['nid']['empty_zero'] = 0;
+$handler->display->display_options['fields']['nid']['link_to_node'] = 0;
+/* Field: Content: Body */
+$handler->display->display_options['fields']['teaser']['id'] = 'teaser';
+$handler->display->display_options['fields']['teaser']['table'] = 'field_data_body';
+$handler->display->display_options['fields']['teaser']['field'] = 'body';
+$handler->display->display_options['fields']['teaser']['label'] = 'Teaser';
+$handler->display->display_options['fields']['teaser']['exclude'] = TRUE;
+$handler->display->display_options['fields']['teaser']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['teaser']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['teaser']['alter']['max_length'] = '200';
+$handler->display->display_options['fields']['teaser']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['teaser']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['teaser']['alter']['strip_tags'] = 1;
+$handler->display->display_options['fields']['teaser']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['teaser']['alter']['html'] = 0;
+$handler->display->display_options['fields']['teaser']['hide_empty'] = 0;
+$handler->display->display_options['fields']['teaser']['type'] = 'text_summary_or_trimmed';
+$handler->display->display_options['fields']['teaser']['settings'] = array(
+  'trim_length' => '200',
+);
+/* Field: Content: Topic Icon */
+$handler->display->display_options['fields']['topic_icon']['id'] = 'topic_icon';
+$handler->display->display_options['fields']['topic_icon']['table'] = 'node';
+$handler->display->display_options['fields']['topic_icon']['field'] = 'topic_icon';
+$handler->display->display_options['fields']['topic_icon']['label'] = '';
+$handler->display->display_options['fields']['topic_icon']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['topic_icon']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['topic_icon']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['topic_icon']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['topic_icon']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['topic_icon']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['topic_icon']['alter']['html'] = 0;
+$handler->display->display_options['fields']['topic_icon']['hot_topic_threshold'] = '15';
+/* Field: Content: Title */
+$handler->display->display_options['fields']['title']['id'] = 'title';
+$handler->display->display_options['fields']['title']['table'] = 'node';
+$handler->display->display_options['fields']['title']['field'] = 'title';
+$handler->display->display_options['fields']['title']['label'] = 'Topic';
+$handler->display->display_options['fields']['title']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['title']['alter']['text'] = '<span class="forum-topic-title">[title]</span> ';
+$handler->display->display_options['fields']['title']['alter']['make_link'] = 1;
+$handler->display->display_options['fields']['title']['alter']['path'] = 'node/[nid]';
+$handler->display->display_options['fields']['title']['alter']['alt'] = '[teaser]';
+$handler->display->display_options['fields']['title']['alter']['link_class'] = 'topic-title';
+$handler->display->display_options['fields']['title']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['title']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['title']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['title']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['title']['alter']['html'] = 0;
+$handler->display->display_options['fields']['title']['hide_empty'] = 0;
+$handler->display->display_options['fields']['title']['empty_zero'] = 0;
+$handler->display->display_options['fields']['title']['link_to_node'] = 0;
+/* Field: Content: Has new content */
+$handler->display->display_options['fields']['timestamp']['id'] = 'timestamp';
+$handler->display->display_options['fields']['timestamp']['table'] = 'history';
+$handler->display->display_options['fields']['timestamp']['field'] = 'timestamp';
+$handler->display->display_options['fields']['timestamp']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['timestamp']['alter']['text'] = '[timestamp] ';
+$handler->display->display_options['fields']['timestamp']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['timestamp']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['timestamp']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['timestamp']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['timestamp']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['timestamp']['alter']['html'] = 0;
+$handler->display->display_options['fields']['timestamp']['hide_empty'] = 0;
+$handler->display->display_options['fields']['timestamp']['empty_zero'] = 0;
+$handler->display->display_options['fields']['timestamp']['link_to_node'] = 0;
+$handler->display->display_options['fields']['timestamp']['comments'] = 1;
+/* Field: Content: Topic Pager */
+$handler->display->display_options['fields']['topic_pager']['id'] = 'topic_pager';
+$handler->display->display_options['fields']['topic_pager']['table'] = 'node';
+$handler->display->display_options['fields']['topic_pager']['field'] = 'topic_pager';
+$handler->display->display_options['fields']['topic_pager']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['topic_pager']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['topic_pager']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['topic_pager']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['topic_pager']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['topic_pager']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['topic_pager']['alter']['html'] = 0;
+$handler->display->display_options['fields']['topic_pager']['total_pages_shown'] = '3';
+/* Field: User: Name */
+$handler->display->display_options['fields']['name_1']['id'] = 'name_1';
+$handler->display->display_options['fields']['name_1']['table'] = 'users';
+$handler->display->display_options['fields']['name_1']['field'] = 'name';
+$handler->display->display_options['fields']['name_1']['relationship'] = 'uid';
+$handler->display->display_options['fields']['name_1']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['name_1']['alter']['text'] = '<br /> by [name_1] ';
+$handler->display->display_options['fields']['name_1']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['name_1']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['name_1']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['name_1']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['name_1']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['name_1']['alter']['html'] = 0;
+$handler->display->display_options['fields']['name_1']['hide_empty'] = 0;
+$handler->display->display_options['fields']['name_1']['empty_zero'] = 0;
+$handler->display->display_options['fields']['name_1']['link_to_user'] = 1;
+$handler->display->display_options['fields']['name_1']['overwrite_anonymous'] = 0;
+/* Field: Content: Post date */
+$handler->display->display_options['fields']['created']['id'] = 'created';
+$handler->display->display_options['fields']['created']['table'] = 'node';
+$handler->display->display_options['fields']['created']['field'] = 'created';
+$handler->display->display_options['fields']['created']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['created']['alter']['text'] = 'on [created]';
+$handler->display->display_options['fields']['created']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['created']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['created']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['created']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['created']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['created']['alter']['html'] = 0;
+$handler->display->display_options['fields']['created']['hide_empty'] = 0;
+$handler->display->display_options['fields']['created']['empty_zero'] = 0;
+/* Field: Content: Comment count */
+$handler->display->display_options['fields']['comment_count']['id'] = 'comment_count';
+$handler->display->display_options['fields']['comment_count']['table'] = 'node_comment_statistics';
+$handler->display->display_options['fields']['comment_count']['field'] = 'comment_count';
+$handler->display->display_options['fields']['comment_count']['label'] = 'Replies';
+$handler->display->display_options['fields']['comment_count']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['absolute'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['external'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['replace_spaces'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['trim_whitespace'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['nl2br'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['comment_count']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['comment_count']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['html'] = 0;
+$handler->display->display_options['fields']['comment_count']['element_label_colon'] = 1;
+$handler->display->display_options['fields']['comment_count']['element_default_classes'] = 1;
+$handler->display->display_options['fields']['comment_count']['empty'] = '0';
+$handler->display->display_options['fields']['comment_count']['hide_empty'] = 0;
+$handler->display->display_options['fields']['comment_count']['empty_zero'] = 0;
+$handler->display->display_options['fields']['comment_count']['hide_alter_empty'] = 0;
+$handler->display->display_options['fields']['comment_count']['format_plural'] = 0;
+/* Field: Content: New comments */
+$handler->display->display_options['fields']['new_comments']['id'] = 'new_comments';
+$handler->display->display_options['fields']['new_comments']['table'] = 'node';
+$handler->display->display_options['fields']['new_comments']['field'] = 'new_comments';
+$handler->display->display_options['fields']['new_comments']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['new_comments']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['new_comments']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['html'] = 0;
+$handler->display->display_options['fields']['new_comments']['hide_empty'] = 1;
+$handler->display->display_options['fields']['new_comments']['empty_zero'] = 0;
+$handler->display->display_options['fields']['new_comments']['prefix'] = 'View ';
+$handler->display->display_options['fields']['new_comments']['suffix'] = ' new';
+$handler->display->display_options['fields']['new_comments']['link_to_comment'] = 1;
+/* Field: Content statistics: Total views */
+$handler->display->display_options['fields']['totalcount']['id'] = 'totalcount';
+$handler->display->display_options['fields']['totalcount']['table'] = 'node_counter';
+$handler->display->display_options['fields']['totalcount']['field'] = 'totalcount';
+$handler->display->display_options['fields']['totalcount']['label'] = 'Views';
+$handler->display->display_options['fields']['totalcount']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['totalcount']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['totalcount']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['totalcount']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['totalcount']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['totalcount']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['totalcount']['alter']['html'] = 0;
+$handler->display->display_options['fields']['totalcount']['empty'] = '0';
+$handler->display->display_options['fields']['totalcount']['hide_empty'] = 0;
+$handler->display->display_options['fields']['totalcount']['empty_zero'] = 1;
+/* Field: Content: Last comment author */
+$handler->display->display_options['fields']['last_comment_name']['id'] = 'last_comment_name';
+$handler->display->display_options['fields']['last_comment_name']['table'] = 'node_comment_statistics';
+$handler->display->display_options['fields']['last_comment_name']['field'] = 'last_comment_name';
+$handler->display->display_options['fields']['last_comment_name']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['last_comment_name']['alter']['text'] = 'by [last_comment_name]';
+$handler->display->display_options['fields']['last_comment_name']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['last_comment_name']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['last_comment_name']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['alter']['html'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['hide_empty'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['empty_zero'] = 0;
+/* Field: Content: Updated/commented date */
+$handler->display->display_options['fields']['last_updated']['id'] = 'last_updated';
+$handler->display->display_options['fields']['last_updated']['table'] = 'node_comment_statistics';
+$handler->display->display_options['fields']['last_updated']['field'] = 'last_updated';
+$handler->display->display_options['fields']['last_updated']['label'] = 'Last post';
+$handler->display->display_options['fields']['last_updated']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['last_updated']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['last_updated']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['last_updated']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['last_updated']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['last_updated']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['last_updated']['alter']['html'] = 0;
+$handler->display->display_options['fields']['last_updated']['hide_empty'] = 0;
+$handler->display->display_options['fields']['last_updated']['empty_zero'] = 0;
+/* Field: Content: Sticky */
+$handler->display->display_options['fields']['sticky']['id'] = 'sticky';
+$handler->display->display_options['fields']['sticky']['table'] = 'node';
+$handler->display->display_options['fields']['sticky']['field'] = 'sticky';
+$handler->display->display_options['fields']['sticky']['exclude'] = TRUE;
+$handler->display->display_options['fields']['sticky']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['sticky']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['sticky']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['sticky']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['sticky']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['sticky']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['sticky']['alter']['html'] = 0;
+$handler->display->display_options['fields']['sticky']['not'] = 0;
+/* Field: Content: Comment status */
+$handler->display->display_options['fields']['comment']['id'] = 'comment';
+$handler->display->display_options['fields']['comment']['table'] = 'node';
+$handler->display->display_options['fields']['comment']['field'] = 'comment';
+$handler->display->display_options['fields']['comment']['exclude'] = TRUE;
+$handler->display->display_options['fields']['comment']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['comment']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['comment']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['comment']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['comment']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['comment']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['comment']['alter']['html'] = 0;
+/* Field: Taxonomy term: Name */
+$handler->display->display_options['fields']['name']['id'] = 'name';
+$handler->display->display_options['fields']['name']['table'] = 'taxonomy_term_data';
+$handler->display->display_options['fields']['name']['field'] = 'name';
+$handler->display->display_options['fields']['name']['relationship'] = 'term_node_tid';
+$handler->display->display_options['fields']['name']['label'] = 'Forum';
+$handler->display->display_options['fields']['name']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['name']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['name']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['name']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['name']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['name']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['name']['alter']['html'] = 0;
+$handler->display->display_options['fields']['name']['hide_empty'] = 0;
+$handler->display->display_options['fields']['name']['empty_zero'] = 0;
+$handler->display->display_options['fields']['name']['link_to_taxonomy'] = 1;
+/* Filter criterion: Content: Published */
+$handler->display->display_options['filters']['status']['id'] = 'status';
+$handler->display->display_options['filters']['status']['table'] = 'node';
+$handler->display->display_options['filters']['status']['field'] = 'status';
+$handler->display->display_options['filters']['status']['value'] = '1';
+$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
+/* Filter criterion: Taxonomy term: Vocabulary */
+$handler->display->display_options['filters']['vid']['id'] = 'vid';
+$handler->display->display_options['filters']['vid']['table'] = 'taxonomy_term_data';
+$handler->display->display_options['filters']['vid']['field'] = 'vid';
+$handler->display->display_options['filters']['vid']['relationship'] = 'term_node_tid';
+$handler->display->display_options['filters']['vid']['value'] = array(
+  $vid => $vid,
+);
+$handler->display->display_options['filters']['vid']['expose']['operator'] = FALSE;
+/* Filter criterion: Content: Has taxonomy terms (with depth) */
+$handler->display->display_options['filters']['term_node_tid_depth']['id'] = 'term_node_tid_depth';
+$handler->display->display_options['filters']['term_node_tid_depth']['table'] = 'node';
+$handler->display->display_options['filters']['term_node_tid_depth']['field'] = 'term_node_tid_depth';
+$handler->display->display_options['filters']['term_node_tid_depth']['exposed'] = TRUE;
+$handler->display->display_options['filters']['term_node_tid_depth']['expose']['operator_id'] = 'term_node_tid_depth_op';
+$handler->display->display_options['filters']['term_node_tid_depth']['expose']['label'] = 'Show active topics in:';
+$handler->display->display_options['filters']['term_node_tid_depth']['expose']['operator'] = 'term_node_tid_depth_op';
+$handler->display->display_options['filters']['term_node_tid_depth']['expose']['identifier'] = 'forum';
+$handler->display->display_options['filters']['term_node_tid_depth']['expose']['remember'] = 1;
+$handler->display->display_options['filters']['term_node_tid_depth']['expose']['reduce'] = 0;
+$handler->display->display_options['filters']['term_node_tid_depth']['reduce_duplicates'] = 0;
+$handler->display->display_options['filters']['term_node_tid_depth']['type'] = 'select';
+$handler->display->display_options['filters']['term_node_tid_depth']['vocabulary'] = $vocabulary->machine_name;
+$handler->display->display_options['filters']['term_node_tid_depth']['hierarchy'] = 1;
+$handler->display->display_options['filters']['term_node_tid_depth']['error_message'] = 1;
+$handler->display->display_options['filters']['term_node_tid_depth']['depth'] = '2';
+
+/* Display: Page */
+$handler = $view->new_display('page', 'Page', 'page_1');
+$handler->display->display_options['path'] = 'forum/active';
+$handler->display->display_options['menu']['type'] = 'tab';
+$handler->display->display_options['menu']['title'] = 'Active topics';
+$handler->display->display_options['menu']['weight'] = '1';
+$handler->display->display_options['tab_options']['weight'] = '0';
+
+/* Display: Feed */
+$handler = $view->new_display('feed', 'Feed', 'feed_1');
+$handler->display->display_options['defaults']['link_display'] = FALSE;
+$handler->display->display_options['link_display'] = 'feed_1';
+$handler->display->display_options['pager']['type'] = 'some';
+$handler->display->display_options['style_plugin'] = 'rss';
+$handler->display->display_options['row_plugin'] = 'node_rss';
+$handler->display->display_options['path'] = 'forum/active/feed';
+$handler->display->display_options['displays'] = array(
+  'page_1' => 'page_1',
+  'default' => 0,
+);
+$translatables['advanced_forum_active_topics'] = array(
+  t('Defaults'),
+  t('Active forum topics'),
+  t('more'),
+  t('Apply'),
+  t('Reset'),
+  t('Sort by'),
+  t('Asc'),
+  t('Desc'),
+  t('Items per page'),
+  t('- All -'),
+  t('Offset'),
+  t('No active topics.'),
+  t('term'),
+  t('author'),
+  t('Nid'),
+  t('Teaser'),
+  t('Topic'),
+  t('<span class="forum-topic-title">[title]</span> '),
+  t('node/[nid]'),
+  t('[teaser]'),
+  t('Has new content'),
+  t('[timestamp] '),
+  t('Topic Pager'),
+  t('Name'),
+  t('<br /> by [name_1] '),
+  t('Post date'),
+  t('on [created]'),
+  t('Replies'),
+  t('.'),
+  t(','),
+  t('New comments'),
+  t('View '),
+  t(' new'),
+  t('Views'),
+  t('Last comment author'),
+  t('by [last_comment_name]'),
+  t('Last post'),
+  t('Sticky'),
+  t('Comment status'),
+  t('Forum'),
+  t('Show active topics in:'),
+  t('Page'),
+  t('Feed'),
+);
+
+// Get rid of the views counter if statistics not enabled.
+if (!module_exists('statistics')) {
+  unset($handler->display->display_options['fields']['totalcount']);
+  unset($handler->display->display_options['style_options']['columns']['totalcount']);
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_group_topic_list.view b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_group_topic_list.view
new file mode 100644
index 00000000..2c44afa1
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_group_topic_list.view
@@ -0,0 +1,404 @@
+<?php
+
+// $Id$
+
+/*
+ * View 'advanced_forum_group_topic_list'
+ */
+
+if (module_exists('og')) {
+  $view = new view;
+  $view->name = 'advanced_forum_group_topic_list';
+  $view->description = 'Shows the topics in a given group as if it were a forum';
+  $view->tag = 'Advanced Forum';
+  $view->base_table = 'node';
+  $view->human_name = '';
+  $view->core = 0;
+  $view->api_version = '3.0-alpha1';
+  $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+  /* Display: Defaults */
+  $handler = $view->new_display('default', 'Defaults', 'default');
+  $handler->display->display_options['title'] = 'Group Name';
+  $handler->display->display_options['access']['type'] = 'none';
+  $handler->display->display_options['cache']['type'] = 'none';
+  $handler->display->display_options['query']['type'] = 'views_query';
+  $handler->display->display_options['exposed_form']['type'] = 'basic';
+  $handler->display->display_options['pager']['type'] = 'full';
+  $handler->display->display_options['pager']['options']['items_per_page'] = 20;
+  $handler->display->display_options['style_plugin'] = 'forum_topic_list';
+  $handler->display->display_options['style_options']['columns'] = array(
+    'nid' => 'nid',
+    'teaser' => 'teaser',
+    'topic_icon' => 'topic_icon',
+    'title' => 'title',
+    'timestamp' => 'title',
+    'topic_pager' => 'title',
+    'name_1' => 'title',
+    'created' => 'title',
+    'comment_count' => 'comment_count',
+    'new_comments' => 'comment_count',
+    'totalcount' => 'totalcount',
+    'last_comment_name' => 'last_updated',
+    'last_updated' => 'last_updated',
+    'sticky' => 'sticky',
+    'comment' => 'comment',
+  );
+  $handler->display->display_options['style_options']['default'] = 'last_updated';
+  $handler->display->display_options['style_options']['info'] = array(
+    'nid' => array(
+      'sortable' => 0,
+      'separator' => '',
+    ),
+    'teaser' => array(
+      'separator' => '',
+    ),
+    'topic_icon' => array(
+      'separator' => '',
+    ),
+    'title' => array(
+      'sortable' => 1,
+      'separator' => ' ',
+    ),
+    'timestamp' => array(
+      'separator' => '',
+    ),
+    'topic_pager' => array(
+      'separator' => '',
+    ),
+    'name_1' => array(
+      'sortable' => 0,
+      'separator' => '',
+    ),
+    'created' => array(
+      'sortable' => 0,
+      'separator' => '',
+    ),
+    'comment_count' => array(
+      'sortable' => 1,
+      'separator' => '',
+    ),
+    'new_comments' => array(
+      'separator' => '',
+    ),
+    'totalcount' => array(
+      'sortable' => 1,
+      'separator' => '',
+    ),
+    'last_comment_name' => array(
+      'sortable' => 1,
+      'separator' => '<br />',
+    ),
+    'last_updated' => array(
+      'sortable' => 1,
+      'separator' => '<br />',
+    ),
+    'sticky' => array(
+      'sortable' => 0,
+      'separator' => '',
+    ),
+    'comment' => array(
+      'sortable' => 0,
+      'separator' => '',
+    ),
+  );
+  $handler->display->display_options['style_options']['override'] = 0;
+  $handler->display->display_options['style_options']['sticky'] = 1;
+  $handler->display->display_options['style_options']['order'] = 'desc';
+  /* Empty text: Global: Text area */
+  $handler->display->display_options['empty']['text']['id'] = 'area';
+  $handler->display->display_options['empty']['text']['table'] = 'views';
+  $handler->display->display_options['empty']['text']['field'] = 'area';
+  $handler->display->display_options['empty']['text']['empty'] = FALSE;
+  $handler->display->display_options['empty']['text']['content'] = 'No posts in this group.';
+  $handler->display->display_options['empty']['text']['format'] = 'filtered_html';
+  /* Field: Node: Nid */
+  $handler->display->display_options['fields']['nid']['id'] = 'nid';
+  $handler->display->display_options['fields']['nid']['table'] = 'node';
+  $handler->display->display_options['fields']['nid']['field'] = 'nid';
+  $handler->display->display_options['fields']['nid']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['nid']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['nid']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['nid']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['nid']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['nid']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['nid']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['nid']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['nid']['link_to_node'] = 0;
+  /* Field: Fields: body */
+  $handler->display->display_options['fields']['teaser']['id'] = 'teaser';
+  $handler->display->display_options['fields']['teaser']['table'] = 'field_data_body';
+  $handler->display->display_options['fields']['teaser']['field'] = 'entity_id';
+  $handler->display->display_options['fields']['teaser']['label'] = 'Teaser';
+  $handler->display->display_options['fields']['teaser']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['teaser']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['teaser']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['teaser']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['teaser']['alter']['max_length'] = '200';
+  $handler->display->display_options['fields']['teaser']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['teaser']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['teaser']['alter']['strip_tags'] = 1;
+  $handler->display->display_options['fields']['teaser']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['teaser']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['teaser']['type'] = 'text_summary_or_trimmed';
+  $handler->display->display_options['fields']['teaser']['settings'] = array(
+    'trim_length' => '600',
+  );
+  /* Field: Node: Topic Icon */
+  $handler->display->display_options['fields']['topic_icon']['id'] = 'topic_icon';
+  $handler->display->display_options['fields']['topic_icon']['table'] = 'node';
+  $handler->display->display_options['fields']['topic_icon']['field'] = 'topic_icon';
+  $handler->display->display_options['fields']['topic_icon']['label'] = '';
+  $handler->display->display_options['fields']['topic_icon']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['topic_icon']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['topic_icon']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['topic_icon']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['topic_icon']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['topic_icon']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['topic_icon']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['topic_icon']['hot_topic_threshold'] = '15';
+  /* Field: Node: Title */
+  $handler->display->display_options['fields']['title']['id'] = 'title';
+  $handler->display->display_options['fields']['title']['table'] = 'node';
+  $handler->display->display_options['fields']['title']['field'] = 'title';
+  $handler->display->display_options['fields']['title']['label'] = 'Topic / Topic starter';
+  $handler->display->display_options['fields']['title']['alter']['alter_text'] = 1;
+  $handler->display->display_options['fields']['title']['alter']['text'] = '<span class="forum-topic-title">[title]</span> ';
+  $handler->display->display_options['fields']['title']['alter']['make_link'] = 1;
+  $handler->display->display_options['fields']['title']['alter']['path'] = 'node/[nid]';
+  $handler->display->display_options['fields']['title']['alter']['alt'] = '[teaser]';
+  $handler->display->display_options['fields']['title']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['title']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['title']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['title']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['title']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['title']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['title']['empty_zero'] = 0;
+  $handler->display->display_options['fields']['title']['link_to_node'] = 0;
+  /* Field: Has new content */
+  $handler->display->display_options['fields']['timestamp']['id'] = 'timestamp';
+  $handler->display->display_options['fields']['timestamp']['table'] = 'history';
+  $handler->display->display_options['fields']['timestamp']['field'] = 'timestamp';
+  $handler->display->display_options['fields']['timestamp']['ui_name'] = 'Has new content';
+  $handler->display->display_options['fields']['timestamp']['alter']['alter_text'] = 1;
+  $handler->display->display_options['fields']['timestamp']['alter']['text'] = '[timestamp] ';
+  $handler->display->display_options['fields']['timestamp']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['timestamp']['alter']['absolute'] = 0;
+  $handler->display->display_options['fields']['timestamp']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['timestamp']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['timestamp']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['timestamp']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['timestamp']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['timestamp']['element_label_colon'] = 1;
+  $handler->display->display_options['fields']['timestamp']['element_default_classes'] = 1;
+  $handler->display->display_options['fields']['timestamp']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['timestamp']['link_to_node'] = 0;
+  $handler->display->display_options['fields']['timestamp']['comments'] = 1;
+  /* Field: Node: Topic Pager */
+  $handler->display->display_options['fields']['topic_pager']['id'] = 'topic_pager';
+  $handler->display->display_options['fields']['topic_pager']['table'] = 'node';
+  $handler->display->display_options['fields']['topic_pager']['field'] = 'topic_pager';
+  $handler->display->display_options['fields']['topic_pager']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['topic_pager']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['topic_pager']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['topic_pager']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['topic_pager']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['topic_pager']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['topic_pager']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['topic_pager']['total_pages_shown'] = '3';
+  /* Field: User: Name */
+  $handler->display->display_options['fields']['name_1']['id'] = 'name_1';
+  $handler->display->display_options['fields']['name_1']['table'] = 'users';
+  $handler->display->display_options['fields']['name_1']['field'] = 'name';
+  $handler->display->display_options['fields']['name_1']['alter']['alter_text'] = 1;
+  $handler->display->display_options['fields']['name_1']['alter']['text'] = '<br /> by [name_1] ';
+  $handler->display->display_options['fields']['name_1']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['name_1']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['name_1']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['name_1']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['name_1']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['name_1']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['name_1']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['name_1']['empty_zero'] = 0;
+  $handler->display->display_options['fields']['name_1']['link_to_user'] = 1;
+  $handler->display->display_options['fields']['name_1']['overwrite_anonymous'] = 0;
+  /* Field: Node: Post date */
+  $handler->display->display_options['fields']['created']['id'] = 'created';
+  $handler->display->display_options['fields']['created']['table'] = 'node';
+  $handler->display->display_options['fields']['created']['field'] = 'created';
+  $handler->display->display_options['fields']['created']['alter']['alter_text'] = 1;
+  $handler->display->display_options['fields']['created']['alter']['text'] = 'on [created]';
+  $handler->display->display_options['fields']['created']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['created']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['created']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['created']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['created']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['created']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['created']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['created']['empty_zero'] = 0;
+  /* Field: Node: Comment count */
+  $handler->display->display_options['fields']['comment_count']['id'] = 'comment_count';
+  $handler->display->display_options['fields']['comment_count']['table'] = 'node_comment_statistics';
+  $handler->display->display_options['fields']['comment_count']['field'] = 'comment_count';
+  $handler->display->display_options['fields']['comment_count']['label'] = 'Replies';
+  $handler->display->display_options['fields']['comment_count']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['comment_count']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['comment_count']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['comment_count']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['comment_count']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['comment_count']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['comment_count']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['comment_count']['empty'] = '0';
+  $handler->display->display_options['fields']['comment_count']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['comment_count']['empty_zero'] = 1;
+  /* Field: Node: New comments */
+  $handler->display->display_options['fields']['new_comments']['id'] = 'new_comments';
+  $handler->display->display_options['fields']['new_comments']['table'] = 'node';
+  $handler->display->display_options['fields']['new_comments']['field'] = 'new_comments';
+  $handler->display->display_options['fields']['new_comments']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['new_comments']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['new_comments']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['new_comments']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['new_comments']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['new_comments']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['new_comments']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['new_comments']['hide_empty'] = TRUE;
+  $handler->display->display_options['fields']['new_comments']['prefix'] = ' View ';
+  $handler->display->display_options['fields']['new_comments']['suffix'] = ' new';
+  $handler->display->display_options['fields']['new_comments']['link_to_comment'] = 1;
+  /* Field: Node statistics: Total views */
+  $handler->display->display_options['fields']['totalcount']['id'] = 'totalcount';
+  $handler->display->display_options['fields']['totalcount']['table'] = 'node_counter';
+  $handler->display->display_options['fields']['totalcount']['field'] = 'totalcount';
+  $handler->display->display_options['fields']['totalcount']['label'] = 'Views';
+  $handler->display->display_options['fields']['totalcount']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['totalcount']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['totalcount']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['totalcount']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['totalcount']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['totalcount']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['totalcount']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['totalcount']['empty'] = '0';
+  $handler->display->display_options['fields']['totalcount']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['totalcount']['empty_zero'] = 1;
+  /* Field: Node: Last comment author */
+  $handler->display->display_options['fields']['last_comment_name']['id'] = 'last_comment_name';
+  $handler->display->display_options['fields']['last_comment_name']['table'] = 'node_comment_statistics';
+  $handler->display->display_options['fields']['last_comment_name']['field'] = 'last_comment_name';
+  $handler->display->display_options['fields']['last_comment_name']['alter']['alter_text'] = 1;
+  $handler->display->display_options['fields']['last_comment_name']['alter']['text'] = 'by [last_comment_name]';
+  $handler->display->display_options['fields']['last_comment_name']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['last_comment_name']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['last_comment_name']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['last_comment_name']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['last_comment_name']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['last_comment_name']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['last_comment_name']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['last_comment_name']['empty_zero'] = 0;
+  /* Field: Node: Updated/commented date */
+  $handler->display->display_options['fields']['last_updated']['id'] = 'last_updated';
+  $handler->display->display_options['fields']['last_updated']['table'] = 'node_comment_statistics';
+  $handler->display->display_options['fields']['last_updated']['field'] = 'last_updated';
+  $handler->display->display_options['fields']['last_updated']['label'] = 'Last post';
+  $handler->display->display_options['fields']['last_updated']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['last_updated']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['last_updated']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['last_updated']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['last_updated']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['last_updated']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['last_updated']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['last_updated']['hide_empty'] = 0;
+  $handler->display->display_options['fields']['last_updated']['empty_zero'] = 0;
+  /* Field: Node: Sticky */
+  $handler->display->display_options['fields']['sticky']['id'] = 'sticky';
+  $handler->display->display_options['fields']['sticky']['table'] = 'node';
+  $handler->display->display_options['fields']['sticky']['field'] = 'sticky';
+  $handler->display->display_options['fields']['sticky']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['sticky']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['sticky']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['sticky']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['sticky']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['sticky']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['sticky']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['sticky']['alter']['html'] = 0;
+  $handler->display->display_options['fields']['sticky']['not'] = 0;
+  /* Field: Node: Comment status */
+  $handler->display->display_options['fields']['comment']['id'] = 'comment';
+  $handler->display->display_options['fields']['comment']['table'] = 'node';
+  $handler->display->display_options['fields']['comment']['field'] = 'comment';
+  $handler->display->display_options['fields']['comment']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['comment']['alter']['alter_text'] = 0;
+  $handler->display->display_options['fields']['comment']['alter']['make_link'] = 0;
+  $handler->display->display_options['fields']['comment']['alter']['trim'] = 0;
+  $handler->display->display_options['fields']['comment']['alter']['word_boundary'] = 1;
+  $handler->display->display_options['fields']['comment']['alter']['ellipsis'] = 1;
+  $handler->display->display_options['fields']['comment']['alter']['strip_tags'] = 0;
+  $handler->display->display_options['fields']['comment']['alter']['html'] = 0;
+  /* Sort criterion: Node: Sticky */
+  $handler->display->display_options['sorts']['sticky']['id'] = 'sticky';
+  $handler->display->display_options['sorts']['sticky']['table'] = 'node';
+  $handler->display->display_options['sorts']['sticky']['field'] = 'sticky';
+  $handler->display->display_options['sorts']['sticky']['order'] = 'DESC';
+  /* Contextual filter: Fields: Groups audience (group_audience) - gid */
+  $handler->display->display_options['arguments']['group_audience_gid']['id'] = 'group_audience_gid';
+  $handler->display->display_options['arguments']['group_audience_gid']['table'] = 'field_data_group_audience';
+  $handler->display->display_options['arguments']['group_audience_gid']['field'] = 'group_audience_gid';
+  $handler->display->display_options['arguments']['group_audience_gid']['default_action'] = 'default';
+  $handler->display->display_options['arguments']['group_audience_gid']['default_argument_type'] = 'fixed';
+  $handler->display->display_options['arguments']['group_audience_gid']['summary']['format'] = 'default_summary';
+  $handler->display->display_options['arguments']['group_audience_gid']['break_phrase'] = 0;
+  $handler->display->display_options['arguments']['group_audience_gid']['not'] = 0;
+  /* Filter: Node: Published */
+  $handler->display->display_options['filters']['status']['id'] = 'status';
+  $handler->display->display_options['filters']['status']['table'] = 'node';
+  $handler->display->display_options['filters']['status']['field'] = 'status';
+  $handler->display->display_options['filters']['status']['value'] = '1';
+  $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
+  $translatables['advanced_forum_group_topic_list'] = array(
+    t('Defaults'),
+    t('Group Name'),
+    t('more'),
+    t('Apply'),
+    t('Reset'),
+    t('Sort By'),
+    t('Asc'),
+    t('Desc'),
+    t('Items per page'),
+    t('- All -'),
+    t('Offset'),
+    t('No posts in this group.'),
+    t('Nid'),
+    t('Teaser'),
+    t('Topic / Topic starter'),
+    t('<span class="forum-topic-title">[title]</span> '),
+    t('node/[nid]'),
+    t('[teaser]'),
+    t('Has new content'),
+    t('[timestamp] '),
+    t('Topic Pager'),
+    t('Name'),
+    t('<br /> by [name_1] '),
+    t('Post date'),
+    t('on [created]'),
+    t('Replies'),
+    t('.'),
+    t(','),
+    t('New comments'),
+    t(' View '),
+    t(' new'),
+    t('Views'),
+    t('Last comment author'),
+    t('by [last_comment_name]'),
+    t('Last post'),
+    t('Sticky'),
+    t('Comment status'),
+    t('All'),
+    t('%1'),
+  );
+
+  // Get rid of the views counter if statistics not enabled.
+  if (!module_exists('statistics')) {
+    unset($handler->display->display_options['fields']['totalcount']);
+    unset($handler->display->display_options['style_options']['columns']['totalcount']);
+  }
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_handler_field_node_topic_icon.inc b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_handler_field_node_topic_icon.inc
new file mode 100644
index 00000000..d9aeb8d6
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_handler_field_node_topic_icon.inc
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * @file
+ * Field handler to display the topic icon.
+ */
+
+ class advanced_forum_handler_field_node_topic_icon extends views_handler_field{
+  function construct() {
+    parent::construct();
+    $this->additional_fields = array('nid' => 'nid', 'type' => 'type');
+  }
+
+  function option_definition() {
+    $options = parent::option_definition();
+
+    $options['hot_topic_threshold'] = array('default' => 15);
+
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    $form['hot_topic_threshold'] = array(
+      '#title' => t('Hot topic threshold'),
+      '#description' => t('The number of posts a topic must have to be considered "hot".'),
+      '#type' => 'textfield',
+      '#default_value' => $this->options['hot_topic_threshold'],
+    );
+  }
+
+  function query() {
+    $this->ensure_my_table();
+    $this->add_additional_fields();
+    $this->field_alias = $this->table . '_' . $this->field;
+  }
+
+  function render($values) {
+    $new_posts = advanced_forum_reply_num_new($values->nid);
+    return theme('forum_icon', array(
+      'new_posts' => $new_posts,
+      'num_posts' => empty($values->node_comment_statistics_comment_count) ? 1 : $values->node_comment_statistics_comment_count + 1,
+      'comment_mode' => $values->node_comment,
+      'sticky' => $values->node_sticky,
+      'node_type' => $values->node_type,
+    ));
+  }
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_handler_field_node_topic_pager.inc b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_handler_field_node_topic_pager.inc
new file mode 100644
index 00000000..2353c63d
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_handler_field_node_topic_pager.inc
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Field handler to display the topic pager.
+ */
+
+class advanced_forum_handler_field_node_topic_pager extends views_handler_field{
+  function construct() {
+    parent::construct();
+    $this->additional_fields = array('nid' => 'nid', 'type' => 'type');
+  }
+
+  function option_definition() {
+    $options = parent::option_definition();
+
+    $options['total_pages_shown'] = array('default' => 6);
+
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    $form['total_pages_shown'] = array(
+      '#title' => t('Total pages shown'),
+      '#description' => t('Total number of page numbers to show, including initial numbers and one final. 0 hides pager.'),
+      '#type' => 'textfield',
+      '#default_value' => $this->options['total_pages_shown'],
+    );
+  }
+
+  function query() {
+    $this->ensure_my_table();
+    $this->add_additional_fields();
+    $this->field_alias = $this->table . '_' . $this->field;
+  }
+
+  function render($values) {
+    // Make a fake topic object with the information that the core one has.
+    $topic = new stdClass();
+    $topic->nid = $values->nid;
+    $topic->type = $values->node_type;
+    $topic->comment_count = $values->node_comment_statistics_comment_count;
+
+    return theme('advanced_forum_topic_pager', array(
+      'pagecount' => $this->options['total_pages_shown'], 
+      'topic' => $topic
+    ));
+  }
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_new_topics.view b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_new_topics.view
new file mode 100644
index 00000000..3a94b375
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_new_topics.view
@@ -0,0 +1,462 @@
+<?php
+
+// $Id$
+
+/**
+ * DO NOT RE-EXPORT THIS VIEW WITHOUT CHECKING THE FORUM VID.
+ *
+ * When you export, please note the calls to variable_get('forum_nav_vocabulary')
+ * to ensure that the forum vocabulary gets the right vid.
+ */
+$vid = variable_get('forum_nav_vocabulary');
+$vocabulary = taxonomy_vocabulary_load($vid);
+
+/*
+ * View 'advanced_forum_new_topics'
+ */
+
+$view = new view;
+$view->name = 'advanced_forum_new_topics';
+$view->description = 'Shows the new or update topics in a given forum (or all forums)';
+$view->tag = 'Advanced Forum';
+$view->base_table = 'node';
+$view->human_name = 'Advanced Forum new topics';
+$view->core = 7;
+$view->api_version = '3.0';
+$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+/* Display: Defaults */
+$handler = $view->new_display('default', 'Defaults', 'default');
+$handler->display->display_options['title'] = 'Topics with new and updated posts';
+$handler->display->display_options['access']['type'] = 'role';
+$handler->display->display_options['access']['role'] = array(
+  2 => 2,
+);
+$handler->display->display_options['cache']['type'] = 'none';
+$handler->display->display_options['query']['type'] = 'views_query';
+$handler->display->display_options['query']['options']['distinct'] = TRUE;
+$handler->display->display_options['query']['options']['query_comment'] = FALSE;
+$handler->display->display_options['exposed_form']['type'] = 'basic';
+$handler->display->display_options['pager']['type'] = 'full';
+$handler->display->display_options['pager']['options']['items_per_page'] = 20;
+$handler->display->display_options['style_plugin'] = 'forum_topic_list';
+$handler->display->display_options['style_options']['columns'] = array(
+  'topic_icon' => 'topic_icon',
+  'title' => 'title',
+  'timestamp' => 'title',
+  'topic_pager' => 'title',
+  'name_1' => 'title',
+  'created' => 'title',
+  'comment_count' => 'comment_count',
+  'new_comments' => 'comment_count',
+  'totalcount' => 'totalcount',
+  'last_comment_name' => 'last_updated',
+  'last_updated' => 'last_updated',
+  'sticky' => 'sticky',
+  'teaser' => 'teaser',
+  'comment' => 'comment',
+);
+$handler->display->display_options['style_options']['default'] = 'last_updated';
+$handler->display->display_options['style_options']['info'] = array(
+  'topic_icon' => array(
+    'separator' => '',
+  ),
+  'title' => array(
+    'sortable' => 1,
+    'separator' => ' ',
+  ),
+  'name' => array(
+    'sortable' => 1,
+    'separator' => '',
+  ),
+  'timestamp' => array(
+    'separator' => '',
+  ),
+  'topic_pager' => array(
+    'separator' => '',
+  ),
+  'name_1' => array(
+    'sortable' => 0,
+    'separator' => '',
+  ),
+  'created' => array(
+    'sortable' => 0,
+    'separator' => '',
+  ),
+  'comment_count' => array(
+    'sortable' => 1,
+    'separator' => '<br />',
+  ),
+  'new_comments' => array(
+    'separator' => '',
+  ),
+  'totalcount' => array(
+    'sortable' => 1,
+    'separator' => '',
+  ),
+  'last_comment_name' => array(
+    'sortable' => 1,
+    'separator' => '<br />',
+  ),
+  'last_updated' => array(
+    'sortable' => 1,
+    'separator' => '<br />',
+  ),
+  'sticky' => array(
+    'sortable' => 0,
+    'separator' => '',
+  ),
+  'teaser' => array(
+    'separator' => '',
+  ),
+  'comment' => array(
+    'sortable' => 0,
+    'separator' => '',
+  ),
+);
+$handler->display->display_options['style_options']['override'] = 0;
+$handler->display->display_options['style_options']['sticky'] = 1;
+$handler->display->display_options['style_options']['order'] = 'desc';
+$handler->display->display_options['style_options']['tid'] = 'filter.term_node_tid_depth';
+/* No results behavior: Global: Text area */
+$handler->display->display_options['empty']['text']['id'] = 'area';
+$handler->display->display_options['empty']['text']['table'] = 'views';
+$handler->display->display_options['empty']['text']['field'] = 'area';
+$handler->display->display_options['empty']['text']['empty'] = FALSE;
+$handler->display->display_options['empty']['text']['content'] = 'No new or updated posts.';
+/* Relationship: Content: Taxonomy terms on node */
+$handler->display->display_options['relationships']['term_node_tid']['id'] = 'term_node_tid';
+$handler->display->display_options['relationships']['term_node_tid']['table'] = 'node';
+$handler->display->display_options['relationships']['term_node_tid']['field'] = 'term_node_tid';
+/* Relationship: Content: Author */
+$handler->display->display_options['relationships']['uid']['id'] = 'uid';
+$handler->display->display_options['relationships']['uid']['table'] = 'node';
+$handler->display->display_options['relationships']['uid']['field'] = 'uid';
+/* Field: Content: Body */
+$handler->display->display_options['fields']['teaser']['id'] = 'teaser';
+$handler->display->display_options['fields']['teaser']['table'] = 'field_data_body';
+$handler->display->display_options['fields']['teaser']['field'] = 'body';
+$handler->display->display_options['fields']['teaser']['label'] = 'Teaser';
+$handler->display->display_options['fields']['teaser']['exclude'] = TRUE;
+$handler->display->display_options['fields']['teaser']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['teaser']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['teaser']['alter']['max_length'] = '200';
+$handler->display->display_options['fields']['teaser']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['teaser']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['teaser']['alter']['strip_tags'] = 1;
+$handler->display->display_options['fields']['teaser']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['teaser']['alter']['html'] = 0;
+$handler->display->display_options['fields']['teaser']['hide_empty'] = 0;
+$handler->display->display_options['fields']['teaser']['type'] = 'text_summary_or_trimmed';
+$handler->display->display_options['fields']['teaser']['settings'] = array(
+  'trim_length' => '200',
+);
+/* Field: Content: Topic Icon */
+$handler->display->display_options['fields']['topic_icon']['id'] = 'topic_icon';
+$handler->display->display_options['fields']['topic_icon']['table'] = 'node';
+$handler->display->display_options['fields']['topic_icon']['field'] = 'topic_icon';
+$handler->display->display_options['fields']['topic_icon']['label'] = '';
+$handler->display->display_options['fields']['topic_icon']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['topic_icon']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['topic_icon']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['topic_icon']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['topic_icon']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['topic_icon']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['topic_icon']['alter']['html'] = 0;
+$handler->display->display_options['fields']['topic_icon']['hot_topic_threshold'] = '15';
+/* Field: Content: Title */
+$handler->display->display_options['fields']['title']['id'] = 'title';
+$handler->display->display_options['fields']['title']['table'] = 'node';
+$handler->display->display_options['fields']['title']['field'] = 'title';
+$handler->display->display_options['fields']['title']['label'] = 'Topic / Topic starter';
+$handler->display->display_options['fields']['title']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['title']['alter']['text'] = '<span class="forum-topic-title">[title]</span> ';
+$handler->display->display_options['fields']['title']['alter']['make_link'] = 1;
+$handler->display->display_options['fields']['title']['alter']['path'] = 'node/[nid]';
+$handler->display->display_options['fields']['title']['alter']['alt'] = '[teaser]';
+$handler->display->display_options['fields']['title']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['title']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['title']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['title']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['title']['alter']['html'] = 0;
+$handler->display->display_options['fields']['title']['hide_empty'] = 0;
+$handler->display->display_options['fields']['title']['empty_zero'] = 0;
+$handler->display->display_options['fields']['title']['link_to_node'] = 1;
+/* Field: Has new content */
+$handler->display->display_options['fields']['timestamp']['id'] = 'timestamp';
+$handler->display->display_options['fields']['timestamp']['table'] = 'history';
+$handler->display->display_options['fields']['timestamp']['field'] = 'timestamp';
+$handler->display->display_options['fields']['timestamp']['ui_name'] = 'Has new content';
+$handler->display->display_options['fields']['timestamp']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['timestamp']['alter']['text'] = '[timestamp] ';
+$handler->display->display_options['fields']['timestamp']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['timestamp']['alter']['absolute'] = 0;
+$handler->display->display_options['fields']['timestamp']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['timestamp']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['timestamp']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['timestamp']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['timestamp']['alter']['html'] = 0;
+$handler->display->display_options['fields']['timestamp']['element_label_colon'] = 1;
+$handler->display->display_options['fields']['timestamp']['element_default_classes'] = 1;
+$handler->display->display_options['fields']['timestamp']['hide_empty'] = 0;
+$handler->display->display_options['fields']['timestamp']['link_to_node'] = 0;
+$handler->display->display_options['fields']['timestamp']['comments'] = 1;
+/* Field: Content: Topic Pager */
+$handler->display->display_options['fields']['topic_pager']['id'] = 'topic_pager';
+$handler->display->display_options['fields']['topic_pager']['table'] = 'node';
+$handler->display->display_options['fields']['topic_pager']['field'] = 'topic_pager';
+$handler->display->display_options['fields']['topic_pager']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['topic_pager']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['topic_pager']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['topic_pager']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['topic_pager']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['topic_pager']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['topic_pager']['alter']['html'] = 0;
+$handler->display->display_options['fields']['topic_pager']['total_pages_shown'] = '3';
+/* Field: User: Name */
+$handler->display->display_options['fields']['name_1']['id'] = 'name_1';
+$handler->display->display_options['fields']['name_1']['table'] = 'users';
+$handler->display->display_options['fields']['name_1']['field'] = 'name';
+$handler->display->display_options['fields']['name_1']['relationship'] = 'uid';
+$handler->display->display_options['fields']['name_1']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['name_1']['alter']['text'] = '<br /> by [name_1] ';
+$handler->display->display_options['fields']['name_1']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['name_1']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['name_1']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['name_1']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['name_1']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['name_1']['alter']['html'] = 0;
+$handler->display->display_options['fields']['name_1']['hide_empty'] = 0;
+$handler->display->display_options['fields']['name_1']['empty_zero'] = 0;
+$handler->display->display_options['fields']['name_1']['link_to_user'] = 1;
+$handler->display->display_options['fields']['name_1']['overwrite_anonymous'] = 0;
+/* Field: Content: Post date */
+$handler->display->display_options['fields']['created']['id'] = 'created';
+$handler->display->display_options['fields']['created']['table'] = 'node';
+$handler->display->display_options['fields']['created']['field'] = 'created';
+$handler->display->display_options['fields']['created']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['created']['alter']['text'] = 'on [created]';
+$handler->display->display_options['fields']['created']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['created']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['created']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['created']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['created']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['created']['alter']['html'] = 0;
+$handler->display->display_options['fields']['created']['hide_empty'] = 0;
+$handler->display->display_options['fields']['created']['empty_zero'] = 0;
+/* Field: Content: Comment count */
+$handler->display->display_options['fields']['comment_count']['id'] = 'comment_count';
+$handler->display->display_options['fields']['comment_count']['table'] = 'node_comment_statistics';
+$handler->display->display_options['fields']['comment_count']['field'] = 'comment_count';
+$handler->display->display_options['fields']['comment_count']['label'] = 'Replies';
+$handler->display->display_options['fields']['comment_count']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['comment_count']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['comment_count']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['html'] = 0;
+$handler->display->display_options['fields']['comment_count']['empty'] = '0';
+$handler->display->display_options['fields']['comment_count']['hide_empty'] = 0;
+$handler->display->display_options['fields']['comment_count']['empty_zero'] = 1;
+/* Field: Content: New comments */
+$handler->display->display_options['fields']['new_comments']['id'] = 'new_comments';
+$handler->display->display_options['fields']['new_comments']['table'] = 'node';
+$handler->display->display_options['fields']['new_comments']['field'] = 'new_comments';
+$handler->display->display_options['fields']['new_comments']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['new_comments']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['new_comments']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['html'] = 0;
+$handler->display->display_options['fields']['new_comments']['hide_empty'] = 1;
+$handler->display->display_options['fields']['new_comments']['empty_zero'] = 0;
+$handler->display->display_options['fields']['new_comments']['prefix'] = ' View ';
+$handler->display->display_options['fields']['new_comments']['suffix'] = ' new';
+$handler->display->display_options['fields']['new_comments']['link_to_comment'] = 1;
+/* Field: Content statistics: Total views */
+$handler->display->display_options['fields']['totalcount']['id'] = 'totalcount';
+$handler->display->display_options['fields']['totalcount']['table'] = 'node_counter';
+$handler->display->display_options['fields']['totalcount']['field'] = 'totalcount';
+$handler->display->display_options['fields']['totalcount']['label'] = 'Views';
+$handler->display->display_options['fields']['totalcount']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['totalcount']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['totalcount']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['totalcount']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['totalcount']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['totalcount']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['totalcount']['alter']['html'] = 0;
+$handler->display->display_options['fields']['totalcount']['empty'] = '0';
+$handler->display->display_options['fields']['totalcount']['hide_empty'] = 0;
+$handler->display->display_options['fields']['totalcount']['empty_zero'] = 1;
+/* Field: Content: Last comment author */
+$handler->display->display_options['fields']['last_comment_name']['id'] = 'last_comment_name';
+$handler->display->display_options['fields']['last_comment_name']['table'] = 'node_comment_statistics';
+$handler->display->display_options['fields']['last_comment_name']['field'] = 'last_comment_name';
+$handler->display->display_options['fields']['last_comment_name']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['last_comment_name']['alter']['text'] = 'by [last_comment_name]';
+$handler->display->display_options['fields']['last_comment_name']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['last_comment_name']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['last_comment_name']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['alter']['html'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['hide_empty'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['empty_zero'] = 0;
+/* Field: Content: Updated/commented date */
+$handler->display->display_options['fields']['last_updated']['id'] = 'last_updated';
+$handler->display->display_options['fields']['last_updated']['table'] = 'node_comment_statistics';
+$handler->display->display_options['fields']['last_updated']['field'] = 'last_updated';
+$handler->display->display_options['fields']['last_updated']['label'] = 'Last update';
+$handler->display->display_options['fields']['last_updated']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['last_updated']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['last_updated']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['last_updated']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['last_updated']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['last_updated']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['last_updated']['alter']['html'] = 0;
+$handler->display->display_options['fields']['last_updated']['hide_empty'] = 0;
+$handler->display->display_options['fields']['last_updated']['empty_zero'] = 0;
+/* Field: Taxonomy term: Name */
+$handler->display->display_options['fields']['name']['id'] = 'name';
+$handler->display->display_options['fields']['name']['table'] = 'taxonomy_term_data';
+$handler->display->display_options['fields']['name']['field'] = 'name';
+$handler->display->display_options['fields']['name']['relationship'] = 'term_node_tid';
+$handler->display->display_options['fields']['name']['label'] = 'Forum';
+$handler->display->display_options['fields']['name']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['name']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['name']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['name']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['name']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['name']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['name']['alter']['html'] = 0;
+$handler->display->display_options['fields']['name']['link_to_taxonomy'] = 1;
+/* Field: Content: Sticky */
+$handler->display->display_options['fields']['sticky']['id'] = 'sticky';
+$handler->display->display_options['fields']['sticky']['table'] = 'node';
+$handler->display->display_options['fields']['sticky']['field'] = 'sticky';
+$handler->display->display_options['fields']['sticky']['exclude'] = TRUE;
+$handler->display->display_options['fields']['sticky']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['sticky']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['sticky']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['sticky']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['sticky']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['sticky']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['sticky']['alter']['html'] = 0;
+$handler->display->display_options['fields']['sticky']['not'] = 0;
+/* Field: Content: Comment status */
+$handler->display->display_options['fields']['comment']['id'] = 'comment';
+$handler->display->display_options['fields']['comment']['table'] = 'node';
+$handler->display->display_options['fields']['comment']['field'] = 'comment';
+$handler->display->display_options['fields']['comment']['exclude'] = TRUE;
+$handler->display->display_options['fields']['comment']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['comment']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['comment']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['comment']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['comment']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['comment']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['comment']['alter']['html'] = 0;
+/* Sort criterion: Content: Sticky */
+$handler->display->display_options['sorts']['sticky']['id'] = 'sticky';
+$handler->display->display_options['sorts']['sticky']['table'] = 'node';
+$handler->display->display_options['sorts']['sticky']['field'] = 'sticky';
+$handler->display->display_options['sorts']['sticky']['order'] = 'DESC';
+/* Sort criterion: Content: Updated/commented date */
+$handler->display->display_options['sorts']['last_updated']['id'] = 'last_updated';
+$handler->display->display_options['sorts']['last_updated']['table'] = 'node_comment_statistics';
+$handler->display->display_options['sorts']['last_updated']['field'] = 'last_updated';
+$handler->display->display_options['sorts']['last_updated']['order'] = 'DESC';
+/* Filter criterion: Content: Published */
+$handler->display->display_options['filters']['status']['id'] = 'status';
+$handler->display->display_options['filters']['status']['table'] = 'node';
+$handler->display->display_options['filters']['status']['field'] = 'status';
+$handler->display->display_options['filters']['status']['value'] = '1';
+$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
+/* Filter criterion: Content: Has new content */
+$handler->display->display_options['filters']['timestamp']['id'] = 'timestamp';
+$handler->display->display_options['filters']['timestamp']['table'] = 'history';
+$handler->display->display_options['filters']['timestamp']['field'] = 'timestamp';
+$handler->display->display_options['filters']['timestamp']['expose']['operator'] = FALSE;
+/* Filter criterion: Taxonomy term: Vocabulary */
+$handler->display->display_options['filters']['vid']['id'] = 'vid';
+$handler->display->display_options['filters']['vid']['table'] = 'taxonomy_term_data';
+$handler->display->display_options['filters']['vid']['field'] = 'vid';
+$handler->display->display_options['filters']['vid']['relationship'] = 'term_node_tid';
+$handler->display->display_options['filters']['vid']['value'] = array(
+  $vid => $vid,
+);
+$handler->display->display_options['filters']['vid']['expose']['operator'] = FALSE;
+/* Filter criterion: Content: Has taxonomy terms (with depth) */
+$handler->display->display_options['filters']['term_node_tid_depth']['id'] = 'term_node_tid_depth';
+$handler->display->display_options['filters']['term_node_tid_depth']['table'] = 'node';
+$handler->display->display_options['filters']['term_node_tid_depth']['field'] = 'term_node_tid_depth';
+$handler->display->display_options['filters']['term_node_tid_depth']['exposed'] = TRUE;
+$handler->display->display_options['filters']['term_node_tid_depth']['expose']['operator_id'] = 'term_node_tid_depth_op';
+$handler->display->display_options['filters']['term_node_tid_depth']['expose']['label'] = 'Show new & updated topics in:';
+$handler->display->display_options['filters']['term_node_tid_depth']['expose']['operator'] = 'term_node_tid_depth_op';
+$handler->display->display_options['filters']['term_node_tid_depth']['expose']['identifier'] = 'forum';
+$handler->display->display_options['filters']['term_node_tid_depth']['expose']['remember'] = 1;
+$handler->display->display_options['filters']['term_node_tid_depth']['expose']['reduce'] = 0;
+$handler->display->display_options['filters']['term_node_tid_depth']['reduce_duplicates'] = 0;
+$handler->display->display_options['filters']['term_node_tid_depth']['type'] = 'select';
+$handler->display->display_options['filters']['term_node_tid_depth']['vocabulary'] = $vocabulary->machine_name;
+$handler->display->display_options['filters']['term_node_tid_depth']['hierarchy'] = 1;
+$handler->display->display_options['filters']['term_node_tid_depth']['error_message'] = 1;
+$handler->display->display_options['filters']['term_node_tid_depth']['depth'] = '2';
+
+/* Display: Page */
+$handler = $view->new_display('page', 'Page', 'page_1');
+$handler->display->display_options['path'] = 'forum/new';
+$handler->display->display_options['menu']['type'] = 'tab';
+$handler->display->display_options['menu']['title'] = 'New & updated topics';
+$handler->display->display_options['menu']['weight'] = '2';
+$translatables['advanced_forum_new_topics'] = array(
+  t('Defaults'),
+  t('Topics with new and updated posts'),
+  t('more'),
+  t('Apply'),
+  t('Reset'),
+  t('Sort by'),
+  t('Asc'),
+  t('Desc'),
+  t('Items per page'),
+  t('- All -'),
+  t('Offset'),
+  t('No new or updated posts.'),
+  t('term'),
+  t('author'),
+  t('Teaser'),
+  t('Topic / Topic starter'),
+  t('<span class="forum-topic-title">[title]</span> '),
+  t('node/[nid]'),
+  t('[teaser]'),
+  t('Has new content'),
+  t('[timestamp] '),
+  t('Topic Pager'),
+  t('Name'),
+  t('<br /> by [name_1] '),
+  t('Post date'),
+  t('on [created]'),
+  t('Replies'),
+  t('.'),
+  t(','),
+  t('New comments'),
+  t(' View '),
+  t(' new'),
+  t('Views'),
+  t('Last comment author'),
+  t('by [last_comment_name]'),
+  t('Last update'),
+  t('Forum'),
+  t('Sticky'),
+  t('Comment status'),
+  t('Show new & updated topics in:'),
+  t('Page'),
+);
+
+// Get rid of the views counter if statistics not enabled.
+if (!module_exists('statistics')) {
+  unset($handler->display->display_options['fields']['totalcount']);
+  unset($handler->display->display_options['style_options']['columns']['totalcount']);
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_plugin_style_forum_topic_list.inc b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_plugin_style_forum_topic_list.inc
new file mode 100644
index 00000000..a753d385
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_plugin_style_forum_topic_list.inc
@@ -0,0 +1,80 @@
+<?php
+/**
+ * @file
+ * Contains the topic list style plugin.
+ */
+
+/**
+ * Style plugin to render each item as a row in a table.
+ *
+ * @ingroup views_style_plugins
+ */
+class advanced_forum_plugin_style_forum_topic_list extends views_plugin_style_table {
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['tid'] = array('default' => '');
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    $options = array('' => t('None'));
+
+    $arguments = $this->display->handler->get_handlers('argument');
+    foreach ($arguments as $id => $argument) {
+      $options['argument.' . $id] = $argument->ui_name();
+
+    }
+    $filters = $this->display->handler->get_handlers('filter');
+    foreach ($filters as $id => $filter) {
+      $options['filter.' . $id] = $filter->ui_name();
+    }
+
+    $form['tid'] = array(
+      '#type' => 'select',
+      '#title' => t('Source of forum ID'),
+      '#options' => $options,
+      '#default_value' => $this->options['tid'],
+    );
+  }
+
+  /**
+   * Add a couple of fields to the query that we can later use. We are going to
+   * specificly alias them because this style is not meant to be used on relationships.
+   */
+  function query() {
+    $this->view->query->add_field('node', 'sticky', 'topic_is_sticky');
+    $this->view->query->add_field('forum', 'tid', 'topic_actual_forum');
+  }
+
+  /**
+   * Figure out what the forum ID is. It could have come from an argument
+   * or a filter or nowhere. This source would be set by the user in the
+   * options.
+   */
+  function get_forum_ids() {
+    $where = $this->options['tid'];
+    if (empty($where)) {
+      return;
+    }
+
+    $term = '';
+
+    list($type, $id) = explode('.', $where, 2);
+    $handler = $this->display->handler->get_handler($type, $id);
+    if ($type == 'argument') {
+      return empty($handler->argument) ? array() : array($handler->argument);
+    }
+    else {
+      $terms = is_array($handler->value) ? $handler->value : array($handler->value) ;
+      if (isset($handler->options['depth'])) {
+        foreach ($terms as $tid) {
+          $term = taxonomy_term_load($tid);
+          $tree = taxonomy_get_tree($term->vid, $tid, -1, $handler->options['depth']);
+          $terms = array_merge($terms, array_map('_taxonomy_get_tid_from_term', $tree));
+        }
+      }
+      return $terms;
+    }
+  }
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_topic_list.view b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_topic_list.view
new file mode 100644
index 00000000..3eed441a
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_topic_list.view
@@ -0,0 +1,467 @@
+<?php
+
+// $Id$
+
+/**
+ * DO NOT RE-EXPORT THIS VIEW WITHOUT CHECKING THE FORUM VID.
+ *
+ * When you export, please note the calls to variable_get('forum_nav_vocabulary')
+ * to ensure that the forum vocabulary gets the right vid.
+ */
+
+/*
+ * View 'advanced_forum_topic_list'
+ */
+
+$view = new view;
+$view->name = 'advanced_forum_topic_list';
+$view->description = 'Shows the topics in a given forum';
+$view->tag = 'Advanced Forum';
+$view->base_table = 'node';
+$view->human_name = 'Advanced Forum topic list';
+$view->core = 7;
+$view->api_version = '3.0';
+$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+/* Display: Defaults */
+$handler = $view->new_display('default', 'Defaults', 'default');
+$handler->display->display_options['title'] = 'Forum Name';
+$handler->display->display_options['access']['type'] = 'none';
+$handler->display->display_options['cache']['type'] = 'none';
+$handler->display->display_options['query']['type'] = 'views_query';
+$handler->display->display_options['query']['options']['query_comment'] = FALSE;
+$handler->display->display_options['exposed_form']['type'] = 'basic';
+$handler->display->display_options['pager']['type'] = 'full';
+$handler->display->display_options['pager']['options']['items_per_page'] = 20;
+$handler->display->display_options['style_plugin'] = 'forum_topic_list';
+$handler->display->display_options['style_options']['columns'] = array(
+  'nid' => 'nid',
+  'teaser' => 'teaser',
+  'topic_icon' => 'topic_icon',
+  'title' => 'title',
+  'timestamp' => 'title',
+  'topic_pager' => 'title',
+  'name_1' => 'title',
+  'created' => 'title',
+  'comment_count' => 'comment_count',
+  'new_comments' => 'comment_count',
+  'totalcount' => 'totalcount',
+  'last_comment_name' => 'last_updated',
+  'last_updated' => 'last_updated',
+  'sticky' => 'sticky',
+  'comment' => 'comment',
+);
+$handler->display->display_options['style_options']['default'] = 'last_updated';
+$handler->display->display_options['style_options']['info'] = array(
+  'nid' => array(
+    'sortable' => 0,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+  ),
+  'teaser' => array(
+    'sortable' => 0,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+  ),
+  'topic_icon' => array(
+    'align' => '',
+    'separator' => '',
+  ),
+  'title' => array(
+    'sortable' => 1,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => ' ',
+  ),
+  'timestamp' => array(
+    'align' => '',
+    'separator' => '',
+  ),
+  'topic_pager' => array(
+    'align' => '',
+    'separator' => '',
+  ),
+  'name_1' => array(
+    'sortable' => 0,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+  ),
+  'created' => array(
+    'sortable' => 0,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+  ),
+  'comment_count' => array(
+    'sortable' => 1,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '<br />',
+  ),
+  'new_comments' => array(
+    'align' => '',
+    'separator' => '',
+  ),
+  'totalcount' => array(
+    'sortable' => 1,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+  ),
+  'last_comment_name' => array(
+    'sortable' => 1,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '<br />',
+  ),
+  'last_updated' => array(
+    'sortable' => 1,
+    'default_sort_order' => 'desc',
+    'align' => '',
+    'separator' => '<br />',
+  ),
+  'sticky' => array(
+    'sortable' => 0,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+  ),
+  'comment' => array(
+    'sortable' => 0,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+  ),
+);
+$handler->display->display_options['style_options']['override'] = 0;
+$handler->display->display_options['style_options']['sticky'] = 1;
+$handler->display->display_options['style_options']['order'] = 'desc';
+$handler->display->display_options['style_options']['empty_table'] = 0;
+$handler->display->display_options['style_options']['tid'] = 'argument.tid';
+/* No results behavior: Global: Text area */
+$handler->display->display_options['empty']['text']['id'] = 'text';
+$handler->display->display_options['empty']['text']['table'] = 'views';
+$handler->display->display_options['empty']['text']['field'] = 'area';
+$handler->display->display_options['empty']['text']['empty'] = FALSE;
+$handler->display->display_options['empty']['text']['content'] = 'No posts in this forum.';
+$handler->display->display_options['empty']['text']['format'] = 'filtered_html';
+/* Relationship: Content: Author */
+$handler->display->display_options['relationships']['uid']['id'] = 'uid';
+$handler->display->display_options['relationships']['uid']['table'] = 'node';
+$handler->display->display_options['relationships']['uid']['field'] = 'uid';
+/* Field: Content: Nid */
+$handler->display->display_options['fields']['nid']['id'] = 'nid';
+$handler->display->display_options['fields']['nid']['table'] = 'node';
+$handler->display->display_options['fields']['nid']['field'] = 'nid';
+$handler->display->display_options['fields']['nid']['exclude'] = TRUE;
+$handler->display->display_options['fields']['nid']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['nid']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['nid']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['nid']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['nid']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['nid']['alter']['html'] = 0;
+$handler->display->display_options['fields']['nid']['link_to_node'] = 0;
+/* Field: Content: Body */
+$handler->display->display_options['fields']['teaser']['id'] = 'teaser';
+$handler->display->display_options['fields']['teaser']['table'] = 'field_data_body';
+$handler->display->display_options['fields']['teaser']['field'] = 'body';
+$handler->display->display_options['fields']['teaser']['label'] = 'Teaser';
+$handler->display->display_options['fields']['teaser']['exclude'] = TRUE;
+$handler->display->display_options['fields']['teaser']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['teaser']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['teaser']['alter']['max_length'] = '200';
+$handler->display->display_options['fields']['teaser']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['teaser']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['teaser']['alter']['strip_tags'] = 1;
+$handler->display->display_options['fields']['teaser']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['teaser']['alter']['html'] = 0;
+$handler->display->display_options['fields']['teaser']['hide_empty'] = 0;
+$handler->display->display_options['fields']['teaser']['type'] = 'text_summary_or_trimmed';
+$handler->display->display_options['fields']['teaser']['settings'] = array(
+  'trim_length' => '200',
+);
+/* Field: Content: Topic Icon */
+$handler->display->display_options['fields']['topic_icon']['id'] = 'topic_icon';
+$handler->display->display_options['fields']['topic_icon']['table'] = 'node';
+$handler->display->display_options['fields']['topic_icon']['field'] = 'topic_icon';
+$handler->display->display_options['fields']['topic_icon']['label'] = '';
+$handler->display->display_options['fields']['topic_icon']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['topic_icon']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['topic_icon']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['topic_icon']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['topic_icon']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['topic_icon']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['topic_icon']['alter']['html'] = 0;
+$handler->display->display_options['fields']['topic_icon']['hot_topic_threshold'] = '15';
+/* Field: Content: Title */
+$handler->display->display_options['fields']['title']['id'] = 'title';
+$handler->display->display_options['fields']['title']['table'] = 'node';
+$handler->display->display_options['fields']['title']['field'] = 'title';
+$handler->display->display_options['fields']['title']['label'] = 'Topic / Topic starter';
+$handler->display->display_options['fields']['title']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['title']['alter']['text'] = '<span class="forum-topic-title">[title]</span> ';
+$handler->display->display_options['fields']['title']['alter']['make_link'] = 1;
+$handler->display->display_options['fields']['title']['alter']['path'] = 'node/[nid]';
+$handler->display->display_options['fields']['title']['alter']['alt'] = '[teaser]';
+$handler->display->display_options['fields']['title']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['title']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['title']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['title']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['title']['alter']['html'] = 0;
+$handler->display->display_options['fields']['title']['hide_empty'] = 0;
+$handler->display->display_options['fields']['title']['empty_zero'] = 0;
+$handler->display->display_options['fields']['title']['link_to_node'] = 0;
+/* Field: Has new content */
+$handler->display->display_options['fields']['timestamp']['id'] = 'timestamp';
+$handler->display->display_options['fields']['timestamp']['table'] = 'history';
+$handler->display->display_options['fields']['timestamp']['field'] = 'timestamp';
+$handler->display->display_options['fields']['timestamp']['ui_name'] = 'Has new content';
+$handler->display->display_options['fields']['timestamp']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['timestamp']['alter']['text'] = '[timestamp] ';
+$handler->display->display_options['fields']['timestamp']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['timestamp']['alter']['absolute'] = 0;
+$handler->display->display_options['fields']['timestamp']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['timestamp']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['timestamp']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['timestamp']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['timestamp']['alter']['html'] = 0;
+$handler->display->display_options['fields']['timestamp']['element_label_colon'] = 1;
+$handler->display->display_options['fields']['timestamp']['element_default_classes'] = 1;
+$handler->display->display_options['fields']['timestamp']['hide_empty'] = 0;
+$handler->display->display_options['fields']['timestamp']['link_to_node'] = 0;
+$handler->display->display_options['fields']['timestamp']['comments'] = 1;
+/* Field: Content: Topic Pager */
+$handler->display->display_options['fields']['topic_pager']['id'] = 'topic_pager';
+$handler->display->display_options['fields']['topic_pager']['table'] = 'node';
+$handler->display->display_options['fields']['topic_pager']['field'] = 'topic_pager';
+$handler->display->display_options['fields']['topic_pager']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['topic_pager']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['topic_pager']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['topic_pager']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['topic_pager']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['topic_pager']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['topic_pager']['alter']['html'] = 0;
+$handler->display->display_options['fields']['topic_pager']['total_pages_shown'] = '3';
+/* Field: User: Name */
+$handler->display->display_options['fields']['name_1']['id'] = 'name_1';
+$handler->display->display_options['fields']['name_1']['table'] = 'users';
+$handler->display->display_options['fields']['name_1']['field'] = 'name';
+$handler->display->display_options['fields']['name_1']['relationship'] = 'uid';
+$handler->display->display_options['fields']['name_1']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['name_1']['alter']['text'] = '<br /> by [name_1]';
+$handler->display->display_options['fields']['name_1']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['name_1']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['name_1']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['name_1']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['name_1']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['name_1']['alter']['html'] = 0;
+$handler->display->display_options['fields']['name_1']['hide_empty'] = 0;
+$handler->display->display_options['fields']['name_1']['empty_zero'] = 0;
+$handler->display->display_options['fields']['name_1']['link_to_user'] = 1;
+$handler->display->display_options['fields']['name_1']['overwrite_anonymous'] = 0;
+/* Field: Content: Post date */
+$handler->display->display_options['fields']['created']['id'] = 'created';
+$handler->display->display_options['fields']['created']['table'] = 'node';
+$handler->display->display_options['fields']['created']['field'] = 'created';
+$handler->display->display_options['fields']['created']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['created']['alter']['text'] = '» [created]';
+$handler->display->display_options['fields']['created']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['created']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['created']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['created']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['created']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['created']['alter']['html'] = 0;
+$handler->display->display_options['fields']['created']['hide_empty'] = 0;
+$handler->display->display_options['fields']['created']['empty_zero'] = 0;
+/* Field: Content: New comments */
+$handler->display->display_options['fields']['new_comments']['id'] = 'new_comments';
+$handler->display->display_options['fields']['new_comments']['table'] = 'node';
+$handler->display->display_options['fields']['new_comments']['field'] = 'new_comments';
+$handler->display->display_options['fields']['new_comments']['exclude'] = TRUE;
+$handler->display->display_options['fields']['new_comments']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['absolute'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['external'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['replace_spaces'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['trim_whitespace'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['nl2br'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['new_comments']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['new_comments']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['new_comments']['alter']['html'] = 0;
+$handler->display->display_options['fields']['new_comments']['element_label_colon'] = 1;
+$handler->display->display_options['fields']['new_comments']['element_default_classes'] = 1;
+$handler->display->display_options['fields']['new_comments']['hide_empty'] = 1;
+$handler->display->display_options['fields']['new_comments']['empty_zero'] = 0;
+$handler->display->display_options['fields']['new_comments']['hide_alter_empty'] = 0;
+$handler->display->display_options['fields']['new_comments']['format_plural'] = 0;
+$handler->display->display_options['fields']['new_comments']['prefix'] = 'View ';
+$handler->display->display_options['fields']['new_comments']['suffix'] = ' new';
+$handler->display->display_options['fields']['new_comments']['link_to_comment'] = 1;
+/* Field: Content: Comment count */
+$handler->display->display_options['fields']['comment_count']['id'] = 'comment_count';
+$handler->display->display_options['fields']['comment_count']['table'] = 'node_comment_statistics';
+$handler->display->display_options['fields']['comment_count']['field'] = 'comment_count';
+$handler->display->display_options['fields']['comment_count']['label'] = 'Replies';
+$handler->display->display_options['fields']['comment_count']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['comment_count']['alter']['text'] = '[comment_count]<br />[new_comments] ';
+$handler->display->display_options['fields']['comment_count']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['absolute'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['external'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['replace_spaces'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['trim_whitespace'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['nl2br'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['comment_count']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['comment_count']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['comment_count']['alter']['html'] = 0;
+$handler->display->display_options['fields']['comment_count']['element_label_colon'] = 1;
+$handler->display->display_options['fields']['comment_count']['element_default_classes'] = 1;
+$handler->display->display_options['fields']['comment_count']['empty'] = '0';
+$handler->display->display_options['fields']['comment_count']['hide_empty'] = 0;
+$handler->display->display_options['fields']['comment_count']['empty_zero'] = 1;
+$handler->display->display_options['fields']['comment_count']['hide_alter_empty'] = 0;
+$handler->display->display_options['fields']['comment_count']['format_plural'] = 0;
+/* Field: Content statistics: Total views */
+$handler->display->display_options['fields']['totalcount']['id'] = 'totalcount';
+$handler->display->display_options['fields']['totalcount']['table'] = 'node_counter';
+$handler->display->display_options['fields']['totalcount']['field'] = 'totalcount';
+$handler->display->display_options['fields']['totalcount']['label'] = 'Views';
+$handler->display->display_options['fields']['totalcount']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['totalcount']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['totalcount']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['totalcount']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['totalcount']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['totalcount']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['totalcount']['alter']['html'] = 0;
+$handler->display->display_options['fields']['totalcount']['empty'] = '0';
+$handler->display->display_options['fields']['totalcount']['hide_empty'] = 0;
+$handler->display->display_options['fields']['totalcount']['empty_zero'] = 1;
+/* Field: Content: Last comment author */
+$handler->display->display_options['fields']['last_comment_name']['id'] = 'last_comment_name';
+$handler->display->display_options['fields']['last_comment_name']['table'] = 'node_comment_statistics';
+$handler->display->display_options['fields']['last_comment_name']['field'] = 'last_comment_name';
+$handler->display->display_options['fields']['last_comment_name']['alter']['alter_text'] = 1;
+$handler->display->display_options['fields']['last_comment_name']['alter']['text'] = 'by [last_comment_name]';
+$handler->display->display_options['fields']['last_comment_name']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['last_comment_name']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['last_comment_name']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['alter']['html'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['hide_empty'] = 0;
+$handler->display->display_options['fields']['last_comment_name']['empty_zero'] = 0;
+/* Field: Content: Updated/commented date */
+$handler->display->display_options['fields']['last_updated']['id'] = 'last_updated';
+$handler->display->display_options['fields']['last_updated']['table'] = 'node_comment_statistics';
+$handler->display->display_options['fields']['last_updated']['field'] = 'last_updated';
+$handler->display->display_options['fields']['last_updated']['label'] = 'Last post';
+$handler->display->display_options['fields']['last_updated']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['last_updated']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['last_updated']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['last_updated']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['last_updated']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['last_updated']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['last_updated']['alter']['html'] = 0;
+$handler->display->display_options['fields']['last_updated']['hide_empty'] = 0;
+$handler->display->display_options['fields']['last_updated']['empty_zero'] = 0;
+/* Field: Content: Sticky */
+$handler->display->display_options['fields']['sticky']['id'] = 'sticky';
+$handler->display->display_options['fields']['sticky']['table'] = 'node';
+$handler->display->display_options['fields']['sticky']['field'] = 'sticky';
+$handler->display->display_options['fields']['sticky']['exclude'] = TRUE;
+$handler->display->display_options['fields']['sticky']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['sticky']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['sticky']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['sticky']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['sticky']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['sticky']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['sticky']['alter']['html'] = 0;
+$handler->display->display_options['fields']['sticky']['not'] = 0;
+/* Field: Content: Comment status */
+$handler->display->display_options['fields']['comment']['id'] = 'comment';
+$handler->display->display_options['fields']['comment']['table'] = 'node';
+$handler->display->display_options['fields']['comment']['field'] = 'comment';
+$handler->display->display_options['fields']['comment']['exclude'] = TRUE;
+$handler->display->display_options['fields']['comment']['alter']['alter_text'] = 0;
+$handler->display->display_options['fields']['comment']['alter']['make_link'] = 0;
+$handler->display->display_options['fields']['comment']['alter']['word_boundary'] = 1;
+$handler->display->display_options['fields']['comment']['alter']['ellipsis'] = 1;
+$handler->display->display_options['fields']['comment']['alter']['strip_tags'] = 0;
+$handler->display->display_options['fields']['comment']['alter']['trim'] = 0;
+$handler->display->display_options['fields']['comment']['alter']['html'] = 0;
+/* Sort criterion: Content: Sticky */
+$handler->display->display_options['sorts']['sticky']['id'] = 'sticky';
+$handler->display->display_options['sorts']['sticky']['table'] = 'node';
+$handler->display->display_options['sorts']['sticky']['field'] = 'sticky';
+$handler->display->display_options['sorts']['sticky']['order'] = 'DESC';
+/* Contextual filter: Content: Has taxonomy term ID */
+$handler->display->display_options['arguments']['tid']['id'] = 'tid';
+$handler->display->display_options['arguments']['tid']['table'] = 'taxonomy_index';
+$handler->display->display_options['arguments']['tid']['field'] = 'tid';
+$handler->display->display_options['arguments']['tid']['default_argument_type'] = 'fixed';
+$handler->display->display_options['arguments']['tid']['summary']['format'] = 'default_summary';
+$handler->display->display_options['arguments']['tid']['break_phrase'] = 0;
+$handler->display->display_options['arguments']['tid']['add_table'] = 0;
+$handler->display->display_options['arguments']['tid']['require_value'] = 0;
+$handler->display->display_options['arguments']['tid']['reduce_duplicates'] = 0;
+$handler->display->display_options['arguments']['tid']['set_breadcrumb'] = 0;
+/* Filter criterion: Content: Published */
+$handler->display->display_options['filters']['status']['id'] = 'status';
+$handler->display->display_options['filters']['status']['table'] = 'node';
+$handler->display->display_options['filters']['status']['field'] = 'status';
+$handler->display->display_options['filters']['status']['value'] = '1';
+$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
+$translatables['advanced_forum_topic_list'] = array(
+  t('Defaults'),
+  t('Forum Name'),
+  t('more'),
+  t('Apply'),
+  t('Reset'),
+  t('Sort by'),
+  t('Asc'),
+  t('Desc'),
+  t('Items per page'),
+  t('- All -'),
+  t('Offset'),
+  t('No posts in this forum.'),
+  t('author'),
+  t('Nid'),
+  t('Teaser'),
+  t('Topic / Topic starter'),
+  t('<span class="forum-topic-title">[title]</span> '),
+  t('node/[nid]'),
+  t('[teaser]'),
+  t('Has new content'),
+  t('[timestamp] '),
+  t('Topic Pager'),
+  t('Name'),
+  t('<br /> by [name_1]'),
+  t('Post date'),
+  t('» [created]'),
+  t('New comments'),
+  t('.'),
+  t(','),
+  t('View '),
+  t(' new'),
+  t('Replies'),
+  t('[comment_count]<br />[new_comments] '),
+  t('Views'),
+  t('Last comment author'),
+  t('by [last_comment_name]'),
+  t('Last post'),
+  t('Sticky'),
+  t('Comment status'),
+  t('All'),
+);
+
+// Get rid of the views counter if statistics not enabled.
+if (!module_exists('statistics')) {
+  unset($handler->display->display_options['fields']['totalcount']);
+  unset($handler->display->display_options['style_options']['columns']['totalcount']);
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_unanswered_topics.view b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_unanswered_topics.view
new file mode 100644
index 00000000..105c8979
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/includes/views/advanced_forum_unanswered_topics.view
@@ -0,0 +1 @@
+<?php

// $Id$

/**
 * DO NOT RE-EXPORT THIS VIEW WITHOUT CHECKING THE FORUM VID.
 *
 * When you export, please note the calls to variable_get('forum_nav_vocabulary')
 * to ensure that the forum vocabulary gets the right vid.
 */
$vid = variable_get('forum_nav_vocabulary');
$vocabulary = taxonomy_vocabulary_load($vid);

/*
 * View 'advanced_forum_unanswered_topics'
 */

$view = new view;
$view->name = 'advanced_forum_unanswered_topics';
$view->description = 'Shows unanswered topics in a given forum';
$view->tag = 'Advanced Forum';
$view->base_table = 'node';
$view->human_name = 'Advanced Forum unanswered topics';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Defaults */
$handler = $view->new_display('default', 'Defaults', 'default');
$handler->display->display_options['title'] = 'Unanswered forum topics';
$handler->display->display_options['access']['type'] = 'none';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['query']['options']['distinct'] = TRUE;
$handler->display->display_options['query']['options']['query_comment'] = FALSE;
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'full';
$handler->display->display_options['pager']['options']['items_per_page'] = 20;
$handler->display->display_options['style_plugin'] = 'forum_topic_list';
$handler->display->display_options['style_options']['columns'] = array(
  'nid' => 'nid',
  'teaser' => 'teaser',
  'topic_icon' => 'topic_icon',
  'title' => 'title',
  'timestamp' => 'title',
  'topic_pager' => 'title',
  'name_1' => 'title',
  'created' => 'title',
  'new_comments' => 'new_comments',
  'totalcount' => 'totalcount',
  'last_comment_name' => 'last_updated',
  'last_updated' => 'last_updated',
  'sticky' => 'sticky',
  'comment' => 'comment',
  'name' => 'name',
);
$handler->display->display_options['style_options']['default'] = 'last_updated';
$handler->display->display_options['style_options']['info'] = array(
  'nid' => array(
    'sortable' => 0,
    'default_sort_order' => 'asc',
    'align' => '',
    'separator' => '',
  ),
  'teaser' => array(
    'sortable' => 0,
    'default_sort_order' => 'asc',
    'align' => '',
    'separator' => '',
  ),
  'topic_icon' => array(
    'align' => '',
    'separator' => '',
  ),
  'title' => array(
    'sortable' => 1,
    'default_sort_order' => 'asc',
    'align' => '',
    'separator' => ' ',
  ),
  'timestamp' => array(
    'align' => '',
    'separator' => '',
  ),
  'topic_pager' => array(
    'align' => '',
    'separator' => '',
  ),
  'name_1' => array(
    'sortable' => 0,
    'default_sort_order' => 'asc',
    'align' => '',
    'separator' => '',
  ),
  'created' => array(
    'sortable' => 0,
    'default_sort_order' => 'asc',
    'align' => '',
    'separator' => '',
  ),
  'new_comments' => array(
    'align' => '',
    'separator' => '',
  ),
  'totalcount' => array(
    'sortable' => 1,
    'default_sort_order' => 'asc',
    'align' => '',
    'separator' => '',
  ),
  'last_comment_name' => array(
    'sortable' => 1,
    'default_sort_order' => 'asc',
    'align' => '',
    'separator' => '<br />',
  ),
  'last_updated' => array(
    'sortable' => 1,
    'default_sort_order' => 'desc',
    'align' => '',
    'separator' => '<br />',
  ),
  'sticky' => array(
    'sortable' => 0,
    'default_sort_order' => 'asc',
    'align' => '',
    'separator' => '',
  ),
  'comment' => array(
    'sortable' => 0,
    'default_sort_order' => 'asc',
    'align' => '',
    'separator' => '',
  ),
  'name' => array(
    'sortable' => 1,
    'default_sort_order' => 'asc',
    'align' => '',
    'separator' => '',
  ),
);
$handler->display->display_options['style_options']['override'] = 0;
$handler->display->display_options['style_options']['sticky'] = 1;
$handler->display->display_options['style_options']['order'] = 'desc';
$handler->display->display_options['style_options']['empty_table'] = 0;
$handler->display->display_options['style_options']['tid'] = 'filter.term_node_tid_depth';
/* No results behavior: Global: Text area */
$handler->display->display_options['empty']['text']['id'] = 'area';
$handler->display->display_options['empty']['text']['table'] = 'views';
$handler->display->display_options['empty']['text']['field'] = 'area';
$handler->display->display_options['empty']['text']['empty'] = FALSE;
$handler->display->display_options['empty']['text']['content'] = 'No unanswered topics.';
/* Relationship: Content: Taxonomy terms on node */
$handler->display->display_options['relationships']['term_node_tid']['id'] = 'term_node_tid';
$handler->display->display_options['relationships']['term_node_tid']['table'] = 'node';
$handler->display->display_options['relationships']['term_node_tid']['field'] = 'term_node_tid';
/* Relationship: Content: Author */
$handler->display->display_options['relationships']['uid']['id'] = 'uid';
$handler->display->display_options['relationships']['uid']['table'] = 'node';
$handler->display->display_options['relationships']['uid']['field'] = 'uid';
/* Field: Content: Nid */
$handler->display->display_options['fields']['nid']['id'] = 'nid';
$handler->display->display_options['fields']['nid']['table'] = 'node';
$handler->display->display_options['fields']['nid']['field'] = 'nid';
$handler->display->display_options['fields']['nid']['exclude'] = TRUE;
$handler->display->display_options['fields']['nid']['alter']['alter_text'] = 0;
$handler->display->display_options['fields']['nid']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['nid']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['nid']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['nid']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['nid']['alter']['trim'] = 0;
$handler->display->display_options['fields']['nid']['alter']['html'] = 0;
$handler->display->display_options['fields']['nid']['hide_empty'] = 0;
$handler->display->display_options['fields']['nid']['empty_zero'] = 0;
$handler->display->display_options['fields']['nid']['link_to_node'] = 0;
/* Field: Content: Body */
$handler->display->display_options['fields']['teaser']['id'] = 'teaser';
$handler->display->display_options['fields']['teaser']['table'] = 'field_data_body';
$handler->display->display_options['fields']['teaser']['field'] = 'body';
$handler->display->display_options['fields']['teaser']['label'] = 'Teaser';
$handler->display->display_options['fields']['teaser']['exclude'] = TRUE;
$handler->display->display_options['fields']['teaser']['alter']['alter_text'] = 0;
$handler->display->display_options['fields']['teaser']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['teaser']['alter']['max_length'] = '200';
$handler->display->display_options['fields']['teaser']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['teaser']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['teaser']['alter']['strip_tags'] = 1;
$handler->display->display_options['fields']['teaser']['alter']['trim'] = 0;
$handler->display->display_options['fields']['teaser']['alter']['html'] = 0;
$handler->display->display_options['fields']['teaser']['hide_empty'] = 0;
$handler->display->display_options['fields']['teaser']['type'] = 'text_summary_or_trimmed';
$handler->display->display_options['fields']['teaser']['settings'] = array(
  'trim_length' => '200',
);
/* Field: Content: Topic Icon */
$handler->display->display_options['fields']['topic_icon']['id'] = 'topic_icon';
$handler->display->display_options['fields']['topic_icon']['table'] = 'node';
$handler->display->display_options['fields']['topic_icon']['field'] = 'topic_icon';
$handler->display->display_options['fields']['topic_icon']['label'] = '';
$handler->display->display_options['fields']['topic_icon']['alter']['alter_text'] = 0;
$handler->display->display_options['fields']['topic_icon']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['topic_icon']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['topic_icon']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['topic_icon']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['topic_icon']['alter']['trim'] = 0;
$handler->display->display_options['fields']['topic_icon']['alter']['html'] = 0;
$handler->display->display_options['fields']['topic_icon']['hot_topic_threshold'] = '15';
/* Field: Content: Title */
$handler->display->display_options['fields']['title']['id'] = 'title';
$handler->display->display_options['fields']['title']['table'] = 'node';
$handler->display->display_options['fields']['title']['field'] = 'title';
$handler->display->display_options['fields']['title']['label'] = 'Topic';
$handler->display->display_options['fields']['title']['alter']['alter_text'] = 0;
$handler->display->display_options['fields']['title']['alter']['text'] = '<span class="forum-topic-title">[title]</span> ';
$handler->display->display_options['fields']['title']['alter']['make_link'] = 1;
$handler->display->display_options['fields']['title']['alter']['path'] = 'node/[nid]';
$handler->display->display_options['fields']['title']['alter']['alt'] = '[teaser]';
$handler->display->display_options['fields']['title']['alter']['link_class'] = 'topic-title';
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['title']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['title']['alter']['trim'] = 0;
$handler->display->display_options['fields']['title']['alter']['html'] = 0;
$handler->display->display_options['fields']['title']['hide_empty'] = 0;
$handler->display->display_options['fields']['title']['empty_zero'] = 0;
$handler->display->display_options['fields']['title']['link_to_node'] = 0;
/* Field: Content: Has new content */
$handler->display->display_options['fields']['timestamp']['id'] = 'timestamp';
$handler->display->display_options['fields']['timestamp']['table'] = 'history';
$handler->display->display_options['fields']['timestamp']['field'] = 'timestamp';
$handler->display->display_options['fields']['timestamp']['alter']['alter_text'] = 1;
$handler->display->display_options['fields']['timestamp']['alter']['text'] = '[timestamp] ';
$handler->display->display_options['fields']['timestamp']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['timestamp']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['timestamp']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['timestamp']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['timestamp']['alter']['trim'] = 0;
$handler->display->display_options['fields']['timestamp']['alter']['html'] = 0;
$handler->display->display_options['fields']['timestamp']['hide_empty'] = 0;
$handler->display->display_options['fields']['timestamp']['empty_zero'] = 0;
$handler->display->display_options['fields']['timestamp']['link_to_node'] = 0;
$handler->display->display_options['fields']['timestamp']['comments'] = 1;
/* Field: Content: Topic Pager */
$handler->display->display_options['fields']['topic_pager']['id'] = 'topic_pager';
$handler->display->display_options['fields']['topic_pager']['table'] = 'node';
$handler->display->display_options['fields']['topic_pager']['field'] = 'topic_pager';
$handler->display->display_options['fields']['topic_pager']['alter']['alter_text'] = 0;
$handler->display->display_options['fields']['topic_pager']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['topic_pager']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['topic_pager']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['topic_pager']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['topic_pager']['alter']['trim'] = 0;
$handler->display->display_options['fields']['topic_pager']['alter']['html'] = 0;
$handler->display->display_options['fields']['topic_pager']['total_pages_shown'] = '3';
/* Field: User: Name */
$handler->display->display_options['fields']['name_1']['id'] = 'name_1';
$handler->display->display_options['fields']['name_1']['table'] = 'users';
$handler->display->display_options['fields']['name_1']['field'] = 'name';
$handler->display->display_options['fields']['name_1']['relationship'] = 'uid';
$handler->display->display_options['fields']['name_1']['alter']['alter_text'] = 1;
$handler->display->display_options['fields']['name_1']['alter']['text'] = '<br /> by [name_1] ';
$handler->display->display_options['fields']['name_1']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['name_1']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['name_1']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['name_1']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['name_1']['alter']['trim'] = 0;
$handler->display->display_options['fields']['name_1']['alter']['html'] = 0;
$handler->display->display_options['fields']['name_1']['hide_empty'] = 0;
$handler->display->display_options['fields']['name_1']['empty_zero'] = 0;
$handler->display->display_options['fields']['name_1']['link_to_user'] = 1;
$handler->display->display_options['fields']['name_1']['overwrite_anonymous'] = 0;
/* Field: Content: Post date */
$handler->display->display_options['fields']['created']['id'] = 'created';
$handler->display->display_options['fields']['created']['table'] = 'node';
$handler->display->display_options['fields']['created']['field'] = 'created';
$handler->display->display_options['fields']['created']['alter']['alter_text'] = 1;
$handler->display->display_options['fields']['created']['alter']['text'] = 'on [created]';
$handler->display->display_options['fields']['created']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['created']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['created']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['created']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['created']['alter']['trim'] = 0;
$handler->display->display_options['fields']['created']['alter']['html'] = 0;
$handler->display->display_options['fields']['created']['hide_empty'] = 0;
$handler->display->display_options['fields']['created']['empty_zero'] = 0;
/* Field: Content statistics: Total views */
$handler->display->display_options['fields']['totalcount']['id'] = 'totalcount';
$handler->display->display_options['fields']['totalcount']['table'] = 'node_counter';
$handler->display->display_options['fields']['totalcount']['field'] = 'totalcount';
$handler->display->display_options['fields']['totalcount']['label'] = 'Views';
$handler->display->display_options['fields']['totalcount']['alter']['alter_text'] = 0;
$handler->display->display_options['fields']['totalcount']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['totalcount']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['totalcount']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['totalcount']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['totalcount']['alter']['trim'] = 0;
$handler->display->display_options['fields']['totalcount']['alter']['html'] = 0;
$handler->display->display_options['fields']['totalcount']['empty'] = '0';
$handler->display->display_options['fields']['totalcount']['hide_empty'] = 0;
$handler->display->display_options['fields']['totalcount']['empty_zero'] = 1;
/* Field: Content: Sticky */
$handler->display->display_options['fields']['sticky']['id'] = 'sticky';
$handler->display->display_options['fields']['sticky']['table'] = 'node';
$handler->display->display_options['fields']['sticky']['field'] = 'sticky';
$handler->display->display_options['fields']['sticky']['exclude'] = TRUE;
$handler->display->display_options['fields']['sticky']['alter']['alter_text'] = 0;
$handler->display->display_options['fields']['sticky']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['sticky']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['sticky']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['sticky']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['sticky']['alter']['trim'] = 0;
$handler->display->display_options['fields']['sticky']['alter']['html'] = 0;
$handler->display->display_options['fields']['sticky']['not'] = 0;
/* Field: Content: Comment status */
$handler->display->display_options['fields']['comment']['id'] = 'comment';
$handler->display->display_options['fields']['comment']['table'] = 'node';
$handler->display->display_options['fields']['comment']['field'] = 'comment';
$handler->display->display_options['fields']['comment']['exclude'] = TRUE;
$handler->display->display_options['fields']['comment']['alter']['alter_text'] = 0;
$handler->display->display_options['fields']['comment']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['comment']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['comment']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['comment']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['comment']['alter']['trim'] = 0;
$handler->display->display_options['fields']['comment']['alter']['html'] = 0;
/* Field: Taxonomy term: Name */
$handler->display->display_options['fields']['name']['id'] = 'name';
$handler->display->display_options['fields']['name']['table'] = 'taxonomy_term_data';
$handler->display->display_options['fields']['name']['field'] = 'name';
$handler->display->display_options['fields']['name']['relationship'] = 'term_node_tid';
$handler->display->display_options['fields']['name']['label'] = 'Forum';
$handler->display->display_options['fields']['name']['alter']['alter_text'] = 0;
$handler->display->display_options['fields']['name']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['name']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['name']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['name']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['name']['alter']['trim'] = 0;
$handler->display->display_options['fields']['name']['alter']['html'] = 0;
$handler->display->display_options['fields']['name']['hide_empty'] = 0;
$handler->display->display_options['fields']['name']['empty_zero'] = 0;
$handler->display->display_options['fields']['name']['link_to_taxonomy'] = 1;
/* Field: Content: Comment count */
$handler->display->display_options['fields']['comment_count']['id'] = 'comment_count';
$handler->display->display_options['fields']['comment_count']['table'] = 'node_comment_statistics';
$handler->display->display_options['fields']['comment_count']['field'] = 'comment_count';
$handler->display->display_options['fields']['comment_count']['label'] = '';
$handler->display->display_options['fields']['comment_count']['exclude'] = TRUE;
$handler->display->display_options['fields']['comment_count']['alter']['alter_text'] = 0;
$handler->display->display_options['fields']['comment_count']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['comment_count']['alter']['absolute'] = 0;
$handler->display->display_options['fields']['comment_count']['alter']['external'] = 0;
$handler->display->display_options['fields']['comment_count']['alter']['replace_spaces'] = 0;
$handler->display->display_options['fields']['comment_count']['alter']['nl2br'] = 0;
$handler->display->display_options['fields']['comment_count']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['comment_count']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['comment_count']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['comment_count']['alter']['trim'] = 0;
$handler->display->display_options['fields']['comment_count']['alter']['html'] = 0;
$handler->display->display_options['fields']['comment_count']['element_label_colon'] = FALSE;
$handler->display->display_options['fields']['comment_count']['element_default_classes'] = 1;
$handler->display->display_options['fields']['comment_count']['hide_empty'] = 0;
$handler->display->display_options['fields']['comment_count']['empty_zero'] = 1;
$handler->display->display_options['fields']['comment_count']['format_plural'] = 0;
/* Sort criterion: Content: Post date */
$handler->display->display_options['sorts']['created']['id'] = 'created';
$handler->display->display_options['sorts']['created']['table'] = 'node';
$handler->display->display_options['sorts']['created']['field'] = 'created';
$handler->display->display_options['sorts']['created']['order'] = 'DESC';
/* Filter criterion: Content: Published */
$handler->display->display_options['filters']['status']['id'] = 'status';
$handler->display->display_options['filters']['status']['table'] = 'node';
$handler->display->display_options['filters']['status']['field'] = 'status';
$handler->display->display_options['filters']['status']['value'] = '1';
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
/* Filter criterion: Taxonomy term: Vocabulary */
$handler->display->display_options['filters']['vid']['id'] = 'vid';
$handler->display->display_options['filters']['vid']['table'] = 'taxonomy_term_data';
$handler->display->display_options['filters']['vid']['field'] = 'vid';
$handler->display->display_options['filters']['vid']['relationship'] = 'term_node_tid';
$handler->display->display_options['filters']['vid']['value'] = array(
  $vid => $vid,
);
$handler->display->display_options['filters']['vid']['expose']['operator'] = FALSE;
/* Filter criterion: Content: Has taxonomy terms (with depth) */
$handler->display->display_options['filters']['term_node_tid_depth']['id'] = 'term_node_tid_depth';
$handler->display->display_options['filters']['term_node_tid_depth']['table'] = 'node';
$handler->display->display_options['filters']['term_node_tid_depth']['field'] = 'term_node_tid_depth';
$handler->display->display_options['filters']['term_node_tid_depth']['exposed'] = TRUE;
$handler->display->display_options['filters']['term_node_tid_depth']['expose']['operator_id'] = 'term_node_tid_depth_op';
$handler->display->display_options['filters']['term_node_tid_depth']['expose']['label'] = 'Show unanswered topics in:';
$handler->display->display_options['filters']['term_node_tid_depth']['expose']['use_operator'] = FALSE;
$handler->display->display_options['filters']['term_node_tid_depth']['expose']['operator'] = 'term_node_tid_depth_op';
$handler->display->display_options['filters']['term_node_tid_depth']['expose']['identifier'] = 'forum';
$handler->display->display_options['filters']['term_node_tid_depth']['expose']['remember'] = 1;
$handler->display->display_options['filters']['term_node_tid_depth']['expose']['reduce'] = 0;
$handler->display->display_options['filters']['term_node_tid_depth']['reduce_duplicates'] = 0;
$handler->display->display_options['filters']['term_node_tid_depth']['type'] = 'select';
$handler->display->display_options['filters']['term_node_tid_depth']['vocabulary'] = $vocabulary->machine_name;
$handler->display->display_options['filters']['term_node_tid_depth']['hierarchy'] = 1;
$handler->display->display_options['filters']['term_node_tid_depth']['depth'] = '2';
/* Filter criterion: Content: Comment count */
$handler->display->display_options['filters']['comment_count']['id'] = 'comment_count';
$handler->display->display_options['filters']['comment_count']['table'] = 'node_comment_statistics';
$handler->display->display_options['filters']['comment_count']['field'] = 'comment_count';
$handler->display->display_options['filters']['comment_count']['value']['value'] = '0';
$handler->display->display_options['filters']['comment_count']['expose']['operator_id'] = 'comment_count_op';
$handler->display->display_options['filters']['comment_count']['expose']['label'] = 'Comment count';
$handler->display->display_options['filters']['comment_count']['expose']['operator'] = 'comment_count_op';
$handler->display->display_options['filters']['comment_count']['expose']['identifier'] = 'comment_count';
$handler->display->display_options['filters']['comment_count']['expose']['multiple'] = FALSE;

/* Display: Page */
$handler = $view->new_display('page', 'Page', 'page_1');
$handler->display->display_options['path'] = 'forum/unanswered';
$handler->display->display_options['menu']['type'] = 'tab';
$handler->display->display_options['menu']['title'] = 'Unanswered topics';
$handler->display->display_options['menu']['weight'] = '1';
$handler->display->display_options['tab_options']['weight'] = '0';

/* Display: Feed */
$handler = $view->new_display('feed', 'Feed', 'feed_1');
$handler->display->display_options['defaults']['link_display'] = FALSE;
$handler->display->display_options['link_display'] = 'feed_1';
$handler->display->display_options['pager']['type'] = 'some';
$handler->display->display_options['style_plugin'] = 'rss';
$handler->display->display_options['row_plugin'] = 'node_rss';
$handler->display->display_options['path'] = 'forum/unanswered/feed';
$handler->display->display_options['displays'] = array(
  'page_1' => 'page_1',
  'default' => 0,
);
$translatables['advanced_forum_unanswered_topics'] = array(
  t('Defaults'),
  t('Unanswered forum topics'),
  t('more'),
  t('Apply'),
  t('Reset'),
  t('Sort by'),
  t('Asc'),
  t('Desc'),
  t('Items per page'),
  t('- All -'),
  t('Offset'),
  t('No unanswered topics.'),
  t('term'),
  t('author'),
  t('Nid'),
  t('Teaser'),
  t('Topic'),
  t('<span class="forum-topic-title">[title]</span> '),
  t('node/[nid]'),
  t('[teaser]'),
  t('Has new content'),
  t('[timestamp] '),
  t('Topic Pager'),
  t('Name'),
  t('<br /> by [name_1] '),
  t('Post date'),
  t('on [created]'),
  t('Views'),
  t('.'),
  t(','),
  t('Sticky'),
  t('Comment status'),
  t('Forum'),
  t('Show unanswered topics in:'),
  t('Comment count'),
  t('Page'),
  t('Feed'),
);

// Get rid of the views counter if statistics not enabled.
if (!module_exists('statistics')) {
  unset($handler->display->display_options['fields']['totalcount']);
  unset($handler->display->display_options['style_options']['columns']['totalcount']);
}
\ No newline at end of file
diff --git a/htmltest/sites/all/modules/advanced_forum/js/advanced_forum.js b/htmltest/sites/all/modules/advanced_forum/js/advanced_forum.js
new file mode 100644
index 00000000..3c26fee6
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/js/advanced_forum.js
@@ -0,0 +1,142 @@
+(function ($) {
+  Drupal.advanced_forum = Drupal.advanced_forum || {};
+
+  Drupal.behaviors.advanced_forum = {
+    attach: function(context) {
+      // Retrieve the collapsed status from a stored cookie.
+      // cookie format is: page1=1,2,3/page2=1,4,5/page3=5,6,1...
+      var cookie = $.cookie('Drupal.advanced_forum.collapsed');
+      var pages = cookie ? cookie.split('/') : new Array();
+      // Create associative array where key=page path and value=comma-separated list of collapsed forum ids
+      Drupal.advanced_forum.collapsed_page = new Array();
+      if (pages) {
+        for (var i = 0; i < pages.length; i++) {
+          var tmp = pages[i].split('=');
+          Drupal.advanced_forum.collapsed_page[tmp[0]] = tmp[1].split(',');
+        }
+      }
+
+      // Get data for current page
+      Drupal.advanced_forum.collapsed_current = Drupal.advanced_forum.collapsed_page[encodeURIComponent(window.location.pathname)];
+
+      if (!Drupal.advanced_forum.collapsed_current) {
+        Drupal.advanced_forum.collapsed_current = new Array();
+        // For intial load default collapsed state settings needs to checked in init function.
+        Drupal.advanced_forum.initial_load = 1;
+      }
+      else {
+        Drupal.advanced_forum.initial_load = 0;
+      }
+
+      var handleElement = $('.forum-collapsible', context);
+
+      // Set initial collapsed state
+      handleElement.once('forum-collapsible', Drupal.advanced_forum.init);
+
+      handleElement.addClass('clickable').click(function(event) {
+        event.preventDefault();
+
+        // Get forum id
+        var id = $(this).attr('id').split('-')[2];
+        if ( $(this).hasClass('container-collapsed')) {
+          Drupal.advanced_forum.expand(id, Drupal.settings.advanced_forum.effect);
+          // Reset collapsed status
+          Drupal.advanced_forum.collapsed_current.splice($.inArray(id, Drupal.advanced_forum.collapsed_current),1);
+        }
+        else {
+          Drupal.advanced_forum.collapse(id, Drupal.settings.advanced_forum.effect);
+          // Set collapsed status
+          Drupal.advanced_forum.collapsed_current.push(id);
+        }
+
+        // Put status back
+        Drupal.advanced_forum.collapsed_page[encodeURIComponent(window.location.pathname)] = Drupal.advanced_forum.collapsed_current;
+
+        // Build cookie string
+        cookie = '';
+        for(x in Drupal.advanced_forum.collapsed_page) {
+          cookie += '/' + x + '=' + Drupal.advanced_forum.collapsed_page[x];
+        }
+        // Save new cookie
+        $.cookie(
+          'Drupal.advanced_forum.collapsed',
+          cookie.substr(1),
+          {
+            path: '/',
+            // The cookie should "never" expire.
+            expires: 36500
+          }
+          );
+      });
+    }
+  };
+
+  /**
+   * Initialize and set collapsible status.
+   * Initial collapsing/expanding effect is set to 'toggle' to avoid flickers.
+   */
+  Drupal.advanced_forum.init = function() {
+    // get forum id
+    var id = $(this).attr('id').split('-')[2];
+
+    // On initial load, deal with default collapsed state of containers.
+    if(Drupal.advanced_forum.initial_load) {
+      var list = 0;
+      for(list in Drupal.settings.advanced_forum.default_collapsed_list) {
+        if (id == list) {
+          Drupal.advanced_forum.collapse(id, 'toggle');
+          break;
+        }
+      }
+    }
+    else {
+      // Check if item is collapsed
+      if ($.inArray(id, Drupal.advanced_forum.collapsed_current) > -1) {
+        $(this)
+        .addClass('container-collapsed')
+        .parent().addClass('container-collapsed');
+        Drupal.advanced_forum.collapse(id, 'toggle');
+      }
+      else {
+        $(this)
+        .removeClass('container-collapsed')
+        .parent().removeClass('container-collapsed');
+        Drupal.advanced_forum.expand(id, 'toggle');
+      }
+    }
+
+  };
+
+  Drupal.advanced_forum.collapse = function(id, effect) {
+    switch(effect) {
+      case 'fade':
+        $('#forum-table-' + id).fadeOut('fast');
+        break;
+      case 'slide':
+        $('#forum-table-' + id).slideUp('fast');
+        break;
+      default:
+        $('#forum-table-' + id).hide();
+    }
+    $('#forum-collapsible-' + id)
+    .addClass('container-collapsed')
+    .parent().addClass('container-collapsed');
+  };
+
+  Drupal.advanced_forum.expand = function(id, effect) {
+    switch(effect) {
+      case 'fade':
+        $('#forum-table-' + id).fadeIn('fast');
+        break;
+      case 'slide':
+        $('#forum-table-' + id).slideDown('fast');
+        break;
+      default:
+        $('#forum-table-' + id).show();
+    }
+    $('#forum-collapsible-' + id)
+    .removeClass('container-collapsed')
+    .parent().removeClass('container-collapsed');
+  };
+
+})(jQuery);
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/access/forum_container.inc b/htmltest/sites/all/modules/advanced_forum/plugins/access/forum_container.inc
new file mode 100644
index 00000000..bff87af0
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/access/forum_container.inc
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @file
+ * Plugin to provide access control based upon term vocabulary
+ */
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'title' => t("Forum: container"),
+  'description' => t('Control access by whether or not the forum is a container.'),
+  'callback' => 'advanced_forum_forum_container_ctools_access_check',
+  'default' => array('container' => 0),
+  'settings form' => 'advanced_forum_forum_container_ctools_access_settings',
+  'settings form submit' => 'advanced_forum_forum_container_ctools_access_settings_submit',
+  'summary' => 'advanced_forum_forum_container_ctools_acesss_summary',
+  'required context' => new ctools_context_required(t('Forum'), array('forum')),
+);
+
+/**
+ * Settings form for the 'by term_vocabulary' access plugin
+ */
+function advanced_forum_forum_container_ctools_access_settings($form, &$form_state, $conf) {
+  $form['settings']['container'] = array(
+    '#type' => 'select',
+    '#title' => t('Container'),
+    '#options' => array(
+      0 => t('Pass if forum is a container'),
+      1 => t('Pass if forum is not a container')
+    ),
+    '#default_value' => $conf['container'],
+  );
+
+  return $form;
+}
+
+/**
+ * Compress the term_vocabularys allowed to the minimum.
+ */
+function advanced_forum_forum_container_ctools_access_settings_submit($form, &$form_state) {
+  $form_state['values']['settings']['rids'] = array_keys(array_filter($form_state['values']['settings']['rids']));
+}
+
+/**
+ * Check for access.
+ */
+function advanced_forum_forum_container_ctools_access_check($conf, $context) {
+  // As far as I know there should always be a context at this point, but this
+  // is safe.
+  if (empty($context) || empty($context->data)) {
+    return FALSE;
+  }
+
+  // xor returns false if the two bools are the same, and true if they are not.
+  return $context->data->container xor !empty($conf['container']);
+}
+
+/**
+ * Provide a summary description based upon the checked term_vocabularys.
+ */
+function advanced_forum_forum_container_ctools_acesss_summary($conf, $context) {
+  $comparison = empty($conf['container']) ? "is" : 'is not';
+
+  return t('@id1 @comp a forum container', array('@comp' => $comparison, '@id1' => $context->identifier));
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/access/forum_id.inc b/htmltest/sites/all/modules/advanced_forum/plugins/access/forum_id.inc
new file mode 100644
index 00000000..b532b90d
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/access/forum_id.inc
@@ -0,0 +1,101 @@
+<?php
+
+/**
+ * @file
+ * Plugin to provide access control based upon term vocabulary
+ */
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'title' => t("Forum: forum"),
+  'description' => t('Control access by which forum is in use.'),
+  'callback' => 'advanced_forum_forum_id_ctools_access_check',
+  'default' => array('tids' => array()),
+  'settings form' => 'advanced_forum_forum_id_ctools_access_settings',
+  'settings form submit' => 'advanced_forum_forum_id_ctools_access_settings_submit',
+  'summary' => 'advanced_forum_forum_id_ctools_acesss_summary',
+  'required context' => new ctools_context_required(t('Forum'), array('forum')),
+);
+
+/**
+ * Settings form for the 'by term_vocabulary' access plugin
+ */
+function advanced_forum_forum_id_ctools_access_settings($form, &$form_state, $conf) {
+  $options = array();
+  $vocabulary = taxonomy_vocabulary_load(variable_get('forum_nav_vocabulary', ''));
+  $options[0] = $vocabulary->name;
+
+  $tree = taxonomy_get_tree($vocabulary->vid);
+  if ($tree) {
+    foreach ($tree as $term) {
+      $choice = new stdClass();
+      $choice->option = array($term->tid => str_repeat('-', $term->depth + 1) . $term->name);
+      $options[] = $choice;
+    }
+  }
+
+  $form['settings']['tids'] = array(
+    '#type' => 'select',
+    '#title' => t('Forums'),
+    '#default_value' => $conf['tids'],
+    '#options' => $options,
+    '#multiple' => TRUE,
+    '#size' => $multiple ? min(9, count($options)) : 0,
+  );
+
+  return $form;
+}
+
+/**
+ * Compress the term_vocabularys allowed to the minimum.
+ */
+function advanced_forum_forum_id_ctools_access_settings_submit($form, &$form_state) {
+  $form_state['values']['settings']['rids'] = array_keys(array_filter($form_state['values']['settings']['rids']));
+}
+
+/**
+ * Check for access.
+ */
+function advanced_forum_forum_id_ctools_access_check($conf, $context) {
+  // As far as I know there should always be a context at this point, but this
+  // is safe.
+  if (empty($context) || empty($context->data) || !isset($context->data->tid)) {
+    return FALSE;
+  }
+
+  if (!empty($conf['tids']) && !isset($conf['tids'][$context->data->tid])) {
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+/**
+ * Provide a summary description based upon the checked term_vocabularys.
+ */
+function advanced_forum_forum_id_ctools_acesss_summary($conf, $context) {
+  $vocabulary = taxonomy_vocabulary_load(variable_get('forum_nav_vocabulary', ''));
+  if (empty($conf['tids'])) {
+    return t('@identifier is any forum', array('@identifier' => $context->identifier));
+  }
+
+  $names = array();
+  if (in_array(0, $conf['tids'])) {
+    $names[] = check_plain($vocabulary->name);
+  }
+  $result = db_query("SELECT name FROM {taxonomy_term_data} WHERE tid IN (" . implode(',', $conf['tids']) . ")");
+
+  while ($term = $result->fetchObject()) {
+    $names[] = check_plain($term->name);
+  }
+
+  if (empty($names)) {
+    return t('@identifier is any forum', array('@identifier' => $context->identifier));
+  }
+
+  return format_plural(count($names), '@identifier is "@tids"', '@identifier is one of "@tids"', array('@tids' => implode(', ', $names), '@identifier' => $context->identifier));
+}
+
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/arguments/forum_id.inc b/htmltest/sites/all/modules/advanced_forum/plugins/arguments/forum_id.inc
new file mode 100644
index 00000000..45860551
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/arguments/forum_id.inc
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * @file
+ *
+ * Plugin to provide an argument handler for a user id
+ */
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'title' => t("Forum: ID"),
+  // keyword to use for %substitution
+  'keyword' => 'forum',
+  'description' => t('Creates a forum context from a forum ID argument.'),
+  'context' => 'advanced_forum_argument_forum_id_context',
+  'placeholder form' => array(
+    '#type' => 'textfield',
+    '#description' => t('Enter the forum ID of a form for this argument'),
+  ),
+  'settings form' => 'advanced_forum_forum_id_settings_form',
+  'breadcrumb' => 'advanced_forum_forum_id_breadcrumb',
+  'default' => array('breadcrumb' => TRUE),
+);
+
+/**
+ * Discover if this argument gives us the user we crave.
+ */
+function advanced_forum_argument_forum_id_context($arg = NULL, $conf = NULL, $empty = FALSE) {
+  // If unset it wants a generic, unfilled context.
+  if ($empty) {
+    return ctools_context_create_empty('forum');
+  }
+
+  if (!is_numeric($arg)) {
+    return NULL;
+  }
+
+  if ($arg != 0) {
+    $term = taxonomy_term_load($arg);
+  }
+
+  if ($arg == 0 || empty($term) || $term->vid != variable_get('forum_nav_vocabulary', 0)) {
+    $term = taxonomy_vocabulary_load(variable_get('forum_nav_vocabulary', 0));
+    $term->tid = 0;
+  }
+
+  if (!$term) {
+    return NULL;
+  }
+
+  return ctools_context_create('forum', $term);
+}
+
+/**
+ * Settings form for the argument
+ */
+function advanced_forum_forum_id_settings_form(&$form, &$form_state, $conf) {
+  $form['settings']['breadcrumb'] = array(
+    '#title' => t('Inject hierarchy into breadcrumb trail'),
+    '#type' => 'checkbox',
+    '#default_value' => !empty($conf['breadcrumb']),
+    '#description' => t('If checked, forum parents will appear in the breadcrumb trail.'),
+  );
+}
+
+/**
+ * Inject the breadcrumb trail if necessary.
+ */
+function advanced_forum_forum_id_breadcrumb($conf, $context) {
+  if (empty($conf['breadcrumb'])) {
+    return;
+  }
+
+  $breadcrumb = array();
+  if (isset($context->data->parents)) {
+    $parents = array_reverse($context->data->parents);
+    if (!empty($parents)) {
+      foreach ($parents as $p) {
+        if ($p->tid != $context->data->tid) {
+          $breadcrumb[] = l($p->name, 'forum/' . $p->tid);
+        }
+      }
+    }
+  }
+
+  $breadcrumb = array_merge(drupal_get_breadcrumb(), $breadcrumb);
+  drupal_set_breadcrumb($breadcrumb);
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_legend.inc b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_legend.inc
new file mode 100644
index 00000000..3be1a9fd
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_legend.inc
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'single' => TRUE,
+  'title' => t('Forum legend'),
+  'icon' => 'icon_forum.png',
+  'description' => t('The forum legend widget.'),
+  'required context' => new ctools_context_required(t('Forum'), 'forum'),
+  'category' => t('Forum'),
+  'defaults' => array(),
+);
+
+/**
+ * Render the content.
+ */
+function advanced_forum_forum_legend_content_type_render($subtype, $conf, $panel_args, $context) {
+  if (!empty($context) && empty($context->data)) {
+    return;
+  }
+
+  if (empty($context)) {
+    $tid = 0;
+  }
+  else {
+    $tid = $context->data->tid;
+  }
+
+  $block = new stdClass();
+  $block->module = 'forum-secondary-links';
+  $block->delta = $tid;
+
+  $block->title = ''; // by default this has no title.
+  _advanced_forum_add_files();
+
+  $block->content = theme('advanced_forum_forum_legend');
+
+  return $block;
+}
+
+/**
+ * Returns an edit form for the custom type.
+ */
+function advanced_forum_forum_legend_content_type_edit_form($form, &$form_state) {
+  return $form;
+}
+
+function advanced_forum_forum_legend_content_type_edit_form_submit($form, &$form_state) {
+  // Copy everything from our defaults.
+  foreach (array_keys($form_state['plugin']['defaults']) as $key) {
+    $form_state['conf'][$key] = $form_state['values'][$key];
+  }
+}
+
+function advanced_forum_forum_legend_content_type_admin_title($subtype, $conf, $context) {
+  return t('"@s" legend', array('@s' => $context->identifier));
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_list.inc b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_list.inc
new file mode 100644
index 00000000..3f0241df
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_list.inc
@@ -0,0 +1,86 @@
+<?php
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'single' => TRUE,
+  'title' => t('Forum list'),
+  'icon' => 'icon_forum.png',
+  'description' => t('A list of forums for the forum.'),
+  'required context' => new ctools_context_required(t('Forum'), 'forum'),
+  'category' => t('Forum'),
+  'defaults' => array(),
+);
+
+/**
+ * Render the content.
+ */
+function advanced_forum_forum_list_content_type_render($subtype, $conf, $panel_args, $context) {
+  if (!empty($context) && empty($context->data)) {
+    return;
+  }
+
+  if (empty($context)) {
+    $tid = 0;
+  }
+  else {
+    $tid = $context->data->tid;
+  }
+
+  $block = new stdClass();
+  $block->module = 'forum-list';
+  $block->delta = $tid;
+
+  _advanced_forum_add_files();
+
+  $forum_term = advanced_forum_forum_load($tid);
+  $forums = isset($forum_term->forums) ? $forum_term->forums : array();
+
+  if (!empty($forums)) {
+    // No parents on the main forum page.
+    $block->content = theme('forum_list', array(
+      'forums' => $forums,
+      'parents' => empty($context->parents) ? array() : $context->parents,
+      'tid' => $tid
+        ));
+
+
+    if (user_access('administer forums')) {
+      $block->admin_links['administer_forums'] = array(
+        'title' => t('Administer forums'),
+        'alt' => t("Add, delete or modify forums"),
+        'href' => "admin/structure/forum",
+      );
+
+      if ($tid) {
+        $block->admin_links['edit_forum'] = array(
+          'title' => t('Edit forum'),
+          'alt' => t("Modify this forum"),
+          'href' => "admin/structure/forum/edit/" . ($context->data->container ? 'container/' : 'forum/') . $tid,
+          'query' => drupal_get_destination(),
+        );
+      }
+    }
+  }
+  return $block;
+}
+
+/**
+ * Returns an edit form for the custom type.
+ */
+function advanced_forum_forum_list_content_type_edit_form($form, &$form_state) {
+  return $form;
+}
+
+function advanced_forum_forum_list_content_type_edit_form_submit($form, &$form_state) {
+  // Copy everything from our defaults.
+  foreach (array_keys($form_state['plugin']['defaults']) as $key) {
+    $form_state['conf'][$key] = $form_state['values'][$key];
+  }
+}
+
+function advanced_forum_forum_list_content_type_admin_title($subtype, $conf, $context) {
+  return t('"@s" forum list', array('@s' => $context->identifier));
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_mark_read.inc b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_mark_read.inc
new file mode 100644
index 00000000..6dde0bfc
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_mark_read.inc
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'single' => TRUE,
+  'title' => t('Forum mark read'),
+  'icon' => 'icon_forum.png',
+  'description' => t('Link to mark all forums / individual forum read.'),
+  'required context' => new ctools_context_required(t('Forum'), 'forum'),
+  'category' => t('Forum'),
+  'defaults' => array(),
+);
+
+/**
+ * Render the content.
+ */
+function advanced_forum_forum_mark_read_content_type_render($subtype, $conf, $panel_args, $context) {
+  if (!empty($context) && empty($context->data)) {
+    return;
+  }
+
+  if (empty($context)) {
+    $tid = 0;
+  }
+  else {
+    $tid = $context->data->tid;
+  }
+
+  $block = new stdClass();
+  $block->module = 'forum-mark-read';
+  $block->delta = $tid;
+
+  $block->title = ''; // by default this has no title.
+  _advanced_forum_add_files();
+
+  $mar_link = advanced_forum_get_mark_read_link($tid);
+  $block->content = (empty($mar_link)) ? '' : '<div class="forum-mark-read">' . advanced_forum_get_mark_read_link($tid) . '</div>';
+
+  return $block;
+}
+
+/**
+ * Returns an edit form for the custom type.
+ */
+function advanced_forum_forum_mark_read_content_type_edit_form($form, &$form_state) {
+  return $form;
+}
+
+function advanced_forum_forum_mark_read_content_type_edit_form_submit($form, &$form_state) {
+  // Copy everything from our defaults.
+  foreach (array_keys($form_state['plugin']['defaults']) as $key) {
+    $form_state['conf'][$key] = $form_state['values'][$key];
+  }
+}
+
+function advanced_forum_forum_mark_read_content_type_admin_title($subtype, $conf, $context) {
+  return t('"@s" mark read', array('@s' => $context->identifier));
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_most_active_poster.inc b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_most_active_poster.inc
new file mode 100644
index 00000000..ed8bb088
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_most_active_poster.inc
@@ -0,0 +1,210 @@
+<?php
+
+/**
+ * Callback function to supply a list of content types.
+ */
+function advanced_forum_forum_most_active_poster_ctools_content_types() {
+  if (module_exists('nodecomment')) {
+    return array(
+      'single' => TRUE,
+      'title' => t('Most active forum poster'),
+      'icon' => 'icon_forum.png',
+      'description' => t('A block with information about the most active forum poster.'),
+      'required context' => new ctools_context_required(t('Forum'), 'forum'),
+      'category' => t('Forum'),
+      'defaults' => array('period' => 'ever', 'exclude' => 0, 'uidone' => TRUE),
+    );
+  }
+}
+
+/**
+ * Render the content.
+ */
+function advanced_forum_forum_most_active_poster_content_type_render($subtype, $conf, $panel_args, $context) {
+  if (!empty($context) && empty($context->data)) {
+    return;
+  }
+
+  if (empty($context)) {
+    $tid = 0;
+  }
+  else {
+    $tid = $context->data->tid;
+  }
+
+  $period = empty($conf['period']) ? 'ever' : $conf['period'];
+
+  switch ($period) {
+    case 'day':
+      $period_arg = 60 * 60 * 24;
+      break;
+    case 'week':
+      $period_arg = 60 * 60 * 24 * 7;
+      break;
+    case 'month':
+      $period_arg = 60 * 60 * 24 * 30;
+      break;
+    case 'quarter':
+      $period_arg = 60 * 60 * 24 * 91;
+      break;
+    case 'year':
+      $period_arg = 60 * 60 * 24 * 365;
+      break;
+  }
+
+  $block = new stdClass();
+  $block->module = 'forum-active-poster';
+  $block->delta = $tid;
+  _advanced_forum_add_files();
+
+  $args = array();
+  $query = "SELECT n.uid, COUNT(DISTINCT n.nid) AS posts FROM {node} n ";
+  $query .= "LEFT JOIN {node_comments} nc ON n.nid = nc.cid ";
+  $query .= "INNER JOIN {node} n2 ON COALESCE(nc.nid, n.nid) = n2.nid ";
+  $query .= "INNER JOIN {forum} f ON f.vid = n2.vid ";
+
+  // Add a join to exclude our roles if needed.
+  if (!empty($conf['exclude'])) {
+    $query .= "LEFT JOIN {users_roles} ur ON n.uid = ur.uid AND ur.rid = %d ";
+    $args[] = $conf['exclude'];
+  }
+
+  $query .= "WHERE n2.status <> 0 AND n.uid <> 0 ";
+
+  if ($tid) {
+    $forum = taxonomy_term_load($tid);
+    $block->title = t('Most active poster in @forum', array('@forum' => $forum->name));
+    $query .= "AND f.tid = %d ";
+    $args = array($tid);
+  }
+  else {
+    $block->title = t('Most active poster');
+  }
+
+  // Add a WHERE to make sure our excluded role is not present.
+  if (!empty($conf['exclude'])) {
+    $query .= "AND ur.rid IS NULL ";
+  }
+
+  // Exclude the superuser if configged to do so.
+  if (!empty($conf['uidone'])) {
+    $query .= "AND n.uid <> 1 ";
+  }
+
+  if (!empty($period_arg)) {
+    $query .= "AND n2.created >= %d ";
+    $args[] = REQUEST_TIME - $period_arg;
+  }
+
+  $query .= "GROUP BY n.uid ";
+  $query .= "ORDER BY COUNT(DISTINCT n.nid) DESC LIMIT 1";
+
+  $info = db_fetch_object(db_query($query, $args));
+
+  // This can happen if there are no posts.
+  if (!$info) {
+    return;
+  }
+
+  $account = user_load($info->uid);
+
+  // Now that we have a user and that user's # of posts, get # of topics for
+  // this forum.
+  $args = array($info->uid);
+  $query = "SELECT COUNT(n.nid) AS posts FROM {node} n ";
+  $query .= "INNER JOIN {forum} f ON f.vid = n.vid ";
+  $query .= "WHERE n.status <> 0 AND n.uid = %d";
+  if ($tid) {
+    $query .= " AND f.tid = %d";
+    $args[] = $tid;
+  }
+
+  if (!empty($period_arg)) {
+    $query .= " AND n.created >= %d";
+    $args[] = REQUEST_TIME - $period_arg;
+  }
+  $topics = db_result(db_query($query, $args));
+
+  // And get their last post.
+  $args = array($info->uid);
+  $query = "SELECT n.nid FROM {node} n ";
+  $query .= "LEFT JOIN {node_comments} nc ON n.nid = nc.cid ";
+  $query .= "INNER JOIN {node} n2 ON COALESCE(nc.nid, n.nid) = n2.nid ";
+  $query .= "INNER JOIN {forum} f ON f.vid = n2.vid ";
+  $query .= "WHERE n.status <> 0 AND n.uid = %d ";
+  if ($tid) {
+    $query .= " AND f.tid = %d ";
+    $args[] = $tid;
+  }
+
+  $query .= "ORDER BY n.created DESC LIMIT 1";
+
+  $last_post = node_load(db_result(db_query($query, $args)));
+  $block->content = theme('advanced_forum_active_poster', array(
+    'forum' => $tid,
+    'account' => $account,
+    'posts' => $info->posts,
+    'topics' => $topics,
+    'last_post' => $last_post
+      ));
+  $block->more = array(
+    'title' => t('More posts'),
+    'href' => 'forum/user/' . $info->uid,
+  );
+  return $block;
+}
+
+/**
+ * Returns an edit form for the custom type.
+ */
+function advanced_forum_forum_most_active_poster_content_type_edit_form($form, &$form_state) {
+  // make sure conf contains newer defaults. CTools should do this for us:
+  $conf = $form_state['conf'];
+  $conf += $form_state['plugin']['defaults'];
+
+  $form['period'] = array(
+    '#type' => 'select',
+    '#title' => t('Period'),
+    '#options' => array(
+      'day' => t('In the last day'),
+      'week' => t('In the last week'),
+      'month' => t('In the last month'),
+      'quarter' => t('In the last quarter'),
+      'year' => t('In the last year'),
+      'ever' => t('Ever'),
+    ),
+    '#description' => t('Select what period you want to search for the most active poster.'),
+    '#default_value' => $conf['period'],
+  );
+
+  $roles = array('0' => t('Allow all roles')) + user_roles(TRUE);
+  unset($roles[DRUPAL_AUTHENTICATED_RID]);
+
+  $form['exclude'] = array(
+    '#type' => 'select',
+    '#title' => t('Exclude role'),
+    '#options' => $roles,
+    '#description' => t('Choose a role that will be excluded from being an active poster.'),
+    '#default_value' => $conf['exclude'],
+  );
+
+  $form['uidone'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Exclude UID 1'),
+    '#description' => t('If checked the super user will not be a possible most active poster.'),
+    '#default_value' => $conf['uidone'],
+  );
+
+  return $form;
+}
+
+function advanced_forum_forum_most_active_poster_content_type_edit_form_submit($form, &$form_state) {
+  // Copy everything from our defaults.
+  foreach (array_keys($form_state['plugin']['defaults']) as $key) {
+    $form_state['conf'][$key] = $form_state['values'][$key];
+  }
+}
+
+function advanced_forum_forum_most_active_poster_content_type_admin_title($subtype, $conf, $context) {
+  return t('"@s" most active poster', array('@s' => $context->identifier));
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_node_create_list.inc b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_node_create_list.inc
new file mode 100644
index 00000000..edd27d44
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_node_create_list.inc
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * Callback function to supply a list of content types.
+ */
+function advanced_forum_forum_node_create_list_ctools_content_types() {
+  return array(
+    'single' => TRUE,
+    'title' => t('Forum node create list'),
+    'icon' => 'icon_forum.png',
+    'description' => t('List of links to create new forum content nodes.'),
+    'required context' => new ctools_context_required(t('Forum'), 'forum'),
+    'category' => t('Forum'),
+    'defaults' => array(),
+  );
+}
+
+/**
+ * Render the content.
+ */
+function advanced_forum_forum_node_create_list_content_type_render($subtype, $conf, $panel_args, $context) {
+  if (!empty($context) && empty($context->data)) {
+    return;
+  }
+
+  if (empty($context)) {
+    $tid = 0;
+  }
+  else {
+    $tid = $context->data->tid;
+  }
+
+  $block = new stdClass();
+  $block->module = 'forum-node-create-list';
+  $block->delta = $tid;
+
+  $block->title = ''; // by default this has no title.
+  _advanced_forum_add_files();
+
+  $block->content = '<div class="forum-node-create-links">' . theme('advanced_forum_node_type_create_list', $tid) . '</div>';
+
+  return $block;
+}
+
+/**
+ * Returns an edit form for the custom type.
+ */
+function advanced_forum_forum_node_create_list_content_type_edit_form($form, &$form_state) {
+  return $form;
+}
+
+function advanced_forum_forum_node_create_list_content_type_edit_form_submit($form, &$form_state) {
+  // Copy everything from our defaults.
+  foreach (array_keys($form_state['plugin']['defaults']) as $key) {
+    $form_state['conf'][$key] = $form_state['values'][$key];
+  }
+}
+
+function advanced_forum_forum_node_create_list_content_type_admin_title($subtype, $conf, $context) {
+  return t('"@s" forum node create list', array('@s' => $context->identifier));
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_search.inc b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_search.inc
new file mode 100644
index 00000000..c9b4550c
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_search.inc
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'single' => TRUE,
+  'title' => t('Forum search'),
+  'icon' => 'icon_forum.png',
+  'description' => t('The forum search widget.'),
+  'required context' => new ctools_context_required(t('Forum'), 'forum'),
+  'category' => t('Forum'),
+  'defaults' => array(),
+);
+
+/**
+ * Render the content.
+ */
+function advanced_forum_forum_search_content_type_render($subtype, $conf, $panel_args, $context) {
+  if (!empty($context) && empty($context->data)) {
+    return;
+  }
+
+  if (empty($context)) {
+    $tid = 0;
+  }
+  else {
+    $tid = $context->data->tid;
+  }
+
+  $block = new stdClass();
+  $block->module = 'forum-secondary-links';
+  $block->delta = $tid;
+
+  $block->title = ''; // by default this has no title.
+  _advanced_forum_add_files();
+
+  $block->content = '<div id="search-all-forums">' . theme('advanced_forum_search_forum') . '</div>';
+
+  return $block;
+}
+
+/**
+ * Returns an edit form for the custom type.
+ */
+function advanced_forum_forum_search_content_type_edit_form($form, &$form_state) {
+  return $form;
+}
+
+function advanced_forum_forum_search_content_type_edit_form_submit($form, &$form_state) {
+  // Copy everything from our defaults.
+  foreach (array_keys($form_state['plugin']['defaults']) as $key) {
+    $form_state['conf'][$key] = $form_state['values'][$key];
+  }
+}
+
+function advanced_forum_forum_search_content_type_admin_title($subtype, $conf, $context) {
+  return t('"@s" search', array('@s' => $context->identifier));
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_statistics.inc b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_statistics.inc
new file mode 100644
index 00000000..8c0e2e40
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_statistics.inc
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'single' => TRUE,
+  'title' => t('Forum statistics'),
+  'icon' => 'icon_forum.png',
+  'description' => t('The forum statistics widget.'),
+  'required context' => new ctools_context_required(t('Forum'), 'forum'),
+  'category' => t('Forum'),
+  'defaults' => array(),
+);
+
+/**
+ * Render the content.
+ */
+function advanced_forum_forum_statistics_content_type_render($subtype, $conf, $panel_args, $context) {
+  if (!empty($context) && empty($context->data)) {
+    return;
+  }
+
+  if (empty($context)) {
+    $tid = 0;
+  }
+  else {
+    $tid = $context->data->tid;
+  }
+
+  $block = new stdClass();
+  $block->module = 'forum-secondary-links';
+  $block->delta = $tid;
+
+  $block->title = ''; // by default this has no title.
+  _advanced_forum_add_files();
+
+  $block->content = theme('advanced_forum_statistics');
+
+  return $block;
+}
+
+/**
+ * Returns an edit form for the custom type.
+ */
+function advanced_forum_forum_statistics_content_type_edit_form($form, &$form_state) {
+  return $form;
+}
+
+function advanced_forum_forum_statistics_content_type_edit_form_submit($form, &$form_state) {
+  // Copy everything from our defaults.
+  foreach (array_keys($form_state['plugin']['defaults']) as $key) {
+    $form_state['conf'][$key] = $form_state['values'][$key];
+  }
+}
+
+function advanced_forum_forum_statistics_content_type_admin_title($subtype, $conf, $context) {
+  return t('"@s" statistics', array('@s' => $context->identifier));
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_tools.inc b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_tools.inc
new file mode 100644
index 00000000..e79687f2
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_tools.inc
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'single' => TRUE,
+  'title' => t('Forum tools'),
+  'icon' => 'icon_forum.png',
+  'description' => t('Jump list with various forum destinations.'),
+  'required context' => new ctools_context_required(t('Forum'), 'forum'),
+  'category' => t('Forum'),
+  'defaults' => array(),
+);
+
+/**
+ * Render the content.
+ */
+function advanced_forum_forum_tools_content_type_render($subtype, $conf, $panel_args, $context) {
+  if (!empty($context) && empty($context->data)) {
+    return;
+  }
+
+  if (empty($context)) {
+    $tid = 0;
+  }
+  else {
+    $tid = $context->data->tid;
+  }
+
+  $block = new stdClass();
+  $block->module = 'forum-tools';
+  $block->delta = $tid;
+
+  $block->title = ''; // by default this has no title.
+  _advanced_forum_add_files();
+
+  $block->content = advanced_forum_forum_tools($tid);
+
+  return $block;
+}
+
+/**
+ * Returns an edit form for the custom type.
+ */
+function advanced_forum_forum_tools_content_type_edit_form($form, &$form_state) {
+  return $form;
+}
+
+function advanced_forum_forum_tools_content_type_edit_form_submit($form, &$form_state) {
+  // Copy everything from our defaults.
+  foreach (array_keys($form_state['plugin']['defaults']) as $key) {
+    $form_state['conf'][$key] = $form_state['values'][$key];
+  }
+}
+
+function advanced_forum_forum_tools_content_type_admin_title($subtype, $conf, $context) {
+  return t('"@s" forum tools', array('@s' => $context->identifier));
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_topic_legend.inc b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_topic_legend.inc
new file mode 100644
index 00000000..020c7b22
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_topic_legend.inc
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'single' => TRUE,
+  'title' => t('Forum topic_legend'),
+  'icon' => 'icon_forum.png',
+  'description' => t('The forum topic_legend widget.'),
+  'required context' => new ctools_context_required(t('Forum'), 'forum'),
+  'category' => t('Forum'),
+  'defaults' => array(),
+);
+
+/**
+ * Render the content.
+ */
+function advanced_forum_forum_topic_legend_content_type_render($subtype, $conf, $panel_args, $context) {
+  if (!empty($context) && empty($context->data)) {
+    return;
+  }
+
+  if (empty($context)) {
+    $tid = 0;
+  }
+  else {
+    $tid = $context->data->tid;
+  }
+
+  $block = new stdClass();
+  $block->module = 'forum-secondary-links';
+  $block->delta = $tid;
+
+  $block->title = ''; // by default this has no title.
+  _advanced_forum_add_files();
+
+  $block->content = theme('advanced_forum_topic_legend');
+
+  return $block;
+}
+
+/**
+ * Returns an edit form for the custom type.
+ */
+function advanced_forum_forum_topic_legend_content_type_edit_form($form, &$form_state) {
+  return $form;
+}
+
+function advanced_forum_forum_topic_legend_content_type_edit_form_submit($form, &$form_state) {
+  // Copy everything from our defaults.
+  foreach (array_keys($form_state['plugin']['defaults']) as $key) {
+    $form_state['conf'][$key] = $form_state['values'][$key];
+  }
+}
+
+function advanced_forum_forum_topic_legend_content_type_admin_title($subtype, $conf, $context) {
+  return t('"@s" topic legend', array('@s' => $context->identifier));
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_topic_list.inc b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_topic_list.inc
new file mode 100644
index 00000000..1cc4056e
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_topic_list.inc
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'single' => TRUE,
+  'title' => t('Forum topic list'),
+  'icon' => 'icon_forum.png',
+  'description' => t('The list of all topics for a forum.'),
+  'required context' => new ctools_context_required(t('Forum'), 'forum'),
+  'category' => t('Forum'),
+  'defaults' => array('show_sort' => TRUE),
+);
+
+/**
+ * Render the content.
+ */
+function advanced_forum_forum_topic_list_content_type_render($subtype, $conf, $panel_args, $context) {
+  if (!empty($context) && empty($context->data)) {
+    return;
+  }
+
+  if (!empty($context->data->container)) {
+    return;
+  }
+
+  if (empty($context)) {
+    $tid = 0;
+  }
+  else {
+    $tid = $context->data->tid;
+  }
+
+  $block = new stdClass();
+  $block->module = 'forum-secondary-links';
+  $block->delta = $tid;
+
+  $block->title = ''; // by default this has no title.
+  _advanced_forum_add_files();
+
+  // TODO: We could make these settings, but they're ignored if it isusing
+  // the view, so we have to be careful about that.
+  $forum_per_page = variable_get('forum_per_page', 25);
+  $sortby = variable_get('forum_order', 1);
+
+  $block->content = advanced_forum_get_topics($tid, $sortby, $forum_per_page, !empty($conf['show_sort']));
+
+  return $block;
+}
+
+/**
+ * Returns an edit form for the custom type.
+ */
+function advanced_forum_forum_topic_list_content_type_edit_form($form, &$form_state) {
+  $conf = $form_state['conf'];
+  $form['show_sort'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Show sort form'),
+    '#description' => t('If checked the sort form will appear at the top of the table. Uncheck this if you wish it to appear in a separate pane.'),
+    '#default_value' => !empty($conf['show_sort']),
+  );
+
+  return $form;
+}
+
+function advanced_forum_forum_topic_list_content_type_edit_form_submit($form, &$form_state) {
+  // Copy everything from our defaults.
+  foreach (array_keys($form_state['plugin']['defaults']) as $key) {
+    $form_state['conf'][$key] = $form_state['values'][$key];
+  }
+}
+
+function advanced_forum_forum_topic_list_content_type_admin_title($subtype, $conf, $context) {
+  return t('"@s" topic list', array('@s' => $context->identifier));
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_topic_list_sort.inc b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_topic_list_sort.inc
new file mode 100644
index 00000000..a6b4cb6d
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/content_types/forum_topic_list_sort.inc
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'single' => TRUE,
+  'title' => t('Forum topic list sort widget'),
+  'icon' => 'icon_forum.png',
+  'description' => t('A small select widget to change the sort order of the forum topic list'),
+  'required context' => new ctools_context_required(t('Forum'), 'forum'),
+  'category' => t('Forum'),
+  'defaults' => array(),
+);
+
+/**
+ * Render the content.
+ */
+function advanced_forum_forum_topic_list_sort_content_type_render($subtype, $conf, $panel_args, $context) {
+  if (!empty($context) && empty($context->data)) {
+    return;
+  }
+
+  if (empty($context)) {
+    $tid = 0;
+  }
+  else {
+    $tid = $context->data->tid;
+  }
+
+  if (empty($tid)) {
+    return;
+  }
+
+  $block = new stdClass();
+  $block->module = 'forum-secondary-links';
+  $block->delta = $tid;
+
+  $block->title = ''; // by default this has no title.
+  _advanced_forum_add_files();
+
+  $block->content = advanced_forum_forum_topic_list_sort();
+
+  return $block;
+}
+
+/**
+ * Returns an edit form for the custom type.
+ */
+function advanced_forum_forum_topic_list_sort_content_type_edit_form($form, &$form_state) {
+  return $form;
+}
+
+function advanced_forum_forum_topic_list_sort_content_type_edit_form_submit($form, &$form_state) {
+  // Copy everything from our defaults.
+  foreach (array_keys($form_state['plugin']['defaults']) as $key) {
+    $form_state['conf'][$key] = $form_state['values'][$key];
+  }
+}
+
+function advanced_forum_forum_topic_list_sort_content_type_admin_title($subtype, $conf, $context) {
+  return t('"@s" topic list sort widget', array('@s' => $context->identifier));
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/contexts/forum.inc b/htmltest/sites/all/modules/advanced_forum/plugins/contexts/forum.inc
new file mode 100644
index 00000000..2840d96f
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/contexts/forum.inc
@@ -0,0 +1,119 @@
+<?php
+
+/**
+ * @file
+ *
+ * Plugin to provide a user context
+ */
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'title' => t("Forum"),
+  'description' => t('A single forum object.'),
+  'context' => 'advanced_forum_forum_context_create_forum',
+  'settings form' => 'advanced_forum_forum_context_settings_form',
+  'settings form validate' => 'advanced_forum_forum_context_settings_form_validate',
+  'keyword' => 'forum',
+  'context name' => 'forum',
+  'convert list' => array(
+    'tid' => t('Forum ID'),
+    'name' => t('Forum name'),
+  ),
+  'convert' => 'advanced_forum_forum_context_convert',
+  'defaults' => array('tid' => 0),
+);
+
+/**
+ * Create a context, either from manual configuration or from an argument on the URL.
+ *
+ * @param $empty
+ *   If true, just return an empty context.
+ * @param $data
+ *   If from settings form, an array as from a form. If from argument, a string.
+ * @param $conf
+ *   TRUE if the $data is coming from admin configuration, FALSE if it's from a URL arg.
+ *
+ * @return
+ *   a Context object/
+ */
+function advanced_forum_forum_context_create_forum($empty, $data = NULL, $conf = FALSE) {
+  $context = new ctools_context(array('forum', 'term'));
+  $context->plugin = 'forum';
+
+  if ($empty) {
+    return $context;
+  }
+
+  if ($conf) {
+    if (!empty($data['tid'])) {
+      $data = taxonomy_term_load($data['tid']);
+    }
+    else {
+      $data = taxonomy_vocabulary_load(variable_get('forum_nav_vocabulary', 0));
+      $data->tid = 0;
+    }
+  }
+
+  if (!empty($data)) {
+    $data->container = (!$data->tid || in_array($data->tid, variable_get('forum_containers', array())));
+    $context->data = clone $data;
+    $context->title = $data->name;
+    $context->argument = $data->tid;
+    $context->vid = variable_get('forum_nav_vocabulary', '');
+    $context->vocabulary = taxonomy_vocabulary_load($context->vid);
+    if ($data->tid) {
+      $context->parents = taxonomy_get_parents_all($data->tid);
+    }
+
+    return $context;
+  }
+}
+
+function advanced_forum_forum_context_settings_form($form, &$form_state) {
+  $conf = $form_state['conf'];
+
+  if (empty($conf)) {
+    $conf = array('tid' => 0);
+  }
+
+  $options = array();
+  $vocabulary = taxonomy_vocabulary_load(variable_get('forum_nav_vocabulary', 0));
+  $options[$vocabulary->vid] = $vocabulary->name;
+
+  $tree = taxonomy_get_tree($vocabulary->vid);
+  if ($tree) {
+    foreach ($tree as $term) {
+      $choice = new stdClass();
+      $choice->option = array($term->tid => str_repeat('-', $term->depth + 1) . $term->name);
+      $options[] = $choice;
+    }
+  }
+
+  $form['tid'] = array(
+    '#type' => 'select',
+    '#title' => t('Forum'),
+    '#default_value' => $conf['tid'],
+    '#options' => $options,
+  );
+
+  return $form;
+}
+
+/**
+ * Convert a context into a string.
+ */
+function advanced_forum_forum_context_convert($context, $type) {
+  switch ($type) {
+    case 'tid':
+      return $context->data->tid;
+    case 'name':
+      $forum_term = $context->data;
+
+      if (module_exists('i18n_taxonomy'))
+        $forum_term = i18n_taxonomy_localize_terms($forum_term);
+
+      return $forum_term->name;
+  }
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/plugins/tasks/forum.inc b/htmltest/sites/all/modules/advanced_forum/plugins/tasks/forum.inc
new file mode 100644
index 00000000..119689dc
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/plugins/tasks/forum.inc
@@ -0,0 +1,166 @@
+<?php
+
+function advanced_forum_forum_page_manager_tasks() {
+  return array(
+    // This is a 'page' task and will fall under the page admin UI
+    'task type' => 'page',
+    'title' => t('Forum page'),
+    'admin title' => t('Forum page'),
+    'admin description' => t('When enabled, this overrides the default Drupal behavior for displaying forum listings at <em>forum</em> and <em>forum/%forum</em>. If you add variants, you may use selection criteria such as roles or user access to provide different views of the forums. If no variant is selected, the normal advanced forum view will be selected.'),
+    'admin path' => 'forum/%advanced_forum_forum',
+    'hook menu' => 'advanced_forum_forum_menu',
+    'hook menu alter' => 'advanced_forum_forum_menu_alter',
+    // This is task uses 'context' handlers and must implement these to give the
+    // handler data it needs.
+    'handler type' => 'context', // handler type -- misnamed
+    'get arguments' => 'advanced_forum_forum_get_arguments',
+    'get context placeholders' => 'advanced_forum_forum_get_contexts',
+    // Allow this to be enabled or disabled:
+    'disabled' => variable_get('advanced_forum_forum_disabled', TRUE),
+    'enable callback' => 'advanced_forum_forum_enable',
+    'access callback' => 'advanced_forum_forum_access_check',
+    // Allow additional operations
+    'operations' => array(
+      'settings' => array(
+        'title' => t('Settings'),
+        'description' => t('Edit name, path and other basic settings for the page.'),
+        'form' => 'advanced_forum_forum_page_settings',
+      ),
+    ),
+    // Even though we don't have subtasks, this allows us to save our settings.
+    'save subtask callback' => 'advanced_forum_forum_page_save',
+  );
+}
+
+/**
+ * Callback defined by advanced_forum_forum_page_manager_tasks().
+ *
+ * Alter the user view input so that user view comes to us rather than the
+ * normal user view process.
+ */
+function advanced_forum_forum_menu_alter(&$items, $task) {
+  if (variable_get('advanced_forum_forum_disabled')) {
+    return;
+  }
+  
+  $items['forum']['page callback'] = 'advanced_forum_forum_page';
+  $items['forum']['file path'] = $task['path'];
+  $items['forum']['file'] = $task['file'];
+
+  // Take over forum/%advanced_forum_forum page
+  $items['forum/%advanced_forum_forum']['page callback'] = 'advanced_forum_forum_page';
+  $items['forum/%advanced_forum_forum']['file path'] = $task['path'];
+  $items['forum/%advanced_forum_forum']['file'] = $task['file'];
+  
+}
+
+/**
+ * Entry point for our overridden user view.
+ *
+ * This function asks its assigned handlers who, if anyone, would like
+ * to run with it. If no one does, it passes through to advanced_forum_page().
+ */
+function advanced_forum_forum_page($forum_term = NULL) {
+  if (!isset($forum_term)) {
+    // On the main page, display all the top-level forums.
+    $forum_term = advanced_forum_forum_load(0);
+  }
+
+  // Set tid for <root> container
+  if (!isset($forum_term->tid)) {
+    $forum_term->tid = 0;
+  }
+
+  // Load my task plugin:
+  $task = page_manager_get_task('forum');
+
+  // Load the account into a context.
+  ctools_include('context');
+  ctools_include('context-task-handler');
+  $contexts = ctools_context_handler_get_task_contexts($task, '', array($forum_term->tid));
+
+  $output = ctools_context_handler_render($task, '', $contexts, array($forum_term->tid));
+  if ($output === FALSE) {
+    $output = advanced_forum_page($forum_term);
+  }
+
+  return $output;
+}
+
+/**
+ * Callback to get arguments provided by this task handler.
+ *
+ * Since this is the node view and there is no UI on the arguments, we
+ * create dummy arguments that contain the needed data.
+ */
+function advanced_forum_forum_get_arguments($task, $subtask_id) {
+  return array(
+    array(
+      'keyword' => 'forum',
+      'identifier' => t('Forum'),
+      'id' => 1,
+      'name' => 'forum_id',
+      'settings' => array('breadcrumb' => variable_get('advanced_forum_forum_page_breadcrumb', FALSE)),
+    ),
+  );
+}
+
+/**
+ * Callback to get context placeholders provided by this handler.
+ */
+function advanced_forum_forum_get_contexts($task, $subtask_id) {
+  return ctools_context_get_placeholders_from_argument(advanced_forum_forum_get_arguments($task, $subtask_id));
+}
+
+/**
+ * Callback to enable/disable the page from the UI.
+ */
+function advanced_forum_forum_enable($cache, $status) {
+  if ($status == NULL)
+    $status = FALSE;
+  variable_set('advanced_forum_forum_disabled', $status);
+}
+
+/**
+ * Settings page for this item.
+ */
+function advanced_forum_forum_page_settings($form, &$form_state) {
+  if (empty($form_state['page']->update_values)) {
+    $settings = array(
+      'advanced_forum_forum_page_breadcrumb' => variable_get('advanced_forum_forum_page_breadcrumb', FALSE),
+    );
+  }
+  else {
+    $settings = $form_state['page']->update_values;
+  }
+
+  $form['advanced_forum_forum_page_breadcrumb'] = array(
+    '#title' => t('Inject hierarchy of first term into breadcrumb trail'),
+    '#type' => 'checkbox',
+    '#default_value' => $settings['advanced_forum_forum_page_breadcrumb'],
+    '#description' => t('If checked, taxonomy term parents will appear in the breadcrumb trail.'),
+  );
+
+  return $form;
+}
+
+/**
+ * Copy form values into the page cache.
+ */
+function advanced_forum_forum_page_settings_submit($form, &$form_state) {
+  $form_state['page']->update_values = $form_state['values'];
+}
+
+/**
+ * Save when the page cache is saved.
+ */
+function advanced_forum_forum_page_save($subtask, $cache) {
+  if (isset($cache->update_values)) {
+    variable_set('advanced_forum_forum_page_breadcrumb', $cache->update_values['advanced_forum_forum_page_breadcrumb']);
+  }
+}
+
+function advanced_forum_forum_access_check($task, $subtask_id, $contexts) {
+  $context = reset($contexts);
+  return node_access('view', $context->data);
+}
diff --git a/htmltest/sites/all/modules/advanced_forum/styles/blue_lagoon/advanced-forum.blue_lagoon.images.css b/htmltest/sites/all/modules/advanced_forum/styles/blue_lagoon/advanced-forum.blue_lagoon.images.css
new file mode 100644
index 00000000..1ea96b84
--- /dev/null
+++ b/htmltest/sites/all/modules/advanced_forum/styles/blue_lagoon/advanced-forum.blue_lagoon.images.css
@@ -0,0 +1,257 @@
+/* FORUM LIST ICONS *********************************************************/
+
+.forum-list-icon-wrapper {
+  font-family: Helvetica, Arial, Sans-Serif;
+  text-decoration: none;
+  vertical-align: middle;
+  margin: 10px;
+  width: 50px;
+  height: 50px;
+  display: block;
+}
+
+tr.even td.forum-list-icon-default .forum-list-icon-wrapper span,
+tr.odd td.forum-list-icon-default .forum-list-icon-wrapper span,
+.forum-list-icon-legend .forum-list-icon-default {
+  background: transparent url(images/forum_list_default.png) no-repeat center center;
+}
+
+tr.even td.forum-list-icon-new-posts .forum-list-icon-wrapper span,
+tr.odd td.forum-list-icon-new-posts .forum-list-icon-wrapper span,
+.forum-list-icon-legend .forum-list-icon-new-posts {
+  background: transparent url(images/forum_list_new_posts.png) no-repeat center center;
+}
+
+/* TOPIC LIST ICONS *********************************************************/
+span.topic-icon {
+  width: 24px;
+  height: 24px;
+  text-indent: -9999px;
+}
+
+.topic-icon-default {
+  background: transparent url(images/topic_list_default.png) no-repeat center center;
+}
+
+.topic-icon-new {
+  background: transparent url(images/topic_list_new.png) no-repeat center center;
+}
+
+.topic-icon-hot {
+  background: transparent url(images/topic_list_hot.png) no-repeat center center;
+}
+
+.topic-icon-hot-new {
+  background: transparent url(images/topic_list_hot_new.png) no-repeat center center;
+}
+
+.topic-icon-sticky {
+  background: transparent url(images/topic_list_sticky.png) no-repeat center center;
+}
+
+.topic-icon-closed {
+  background: transparent url(images/topic_list_closed.png) no-repeat center center;
+}
+
+/* TOPIC LIST ICON LEGEND ***************************************************/
+.topic-icon-default {
+  background: transparent url(images/topic_list_default.png) no-repeat top left;
+}
+
+.topic-icon-new {
+  background: transparent url(images/topic_list_new.png) no-repeat top left;
+}
+
+.topic-icon-hot {
+  background: transparent url(images/topic_list_hot.png) no-repeat top left;
+}
+
+.topic-icon-hot-new {
+  background: transparent url(images/topic_list_hot_new.png) no-repeat top left;
+}
+
+.topic-icon-sticky {
+  background: transparent url(images/topic_list_sticky.png) no-repeat top left;
+}
+
+.topic-icon-closed {
+  background: transparent url(images/topic_list_closed.png) no-repeat top left;
+}
+
+/* AUTHOR PANE **************************************************************/
+
+.forum-post-panel-sub .author-online {
+  background: transparent url(images/ap_user_online.png) no-repeat;
+  padding-left: 20px;
+  height: 20px;
+  width: 125px;
+  display: block;
+}
+
+.forum-post-panel-sub .author-offline {
+  background: transparent url(images/ap_user_offline.png) no-repeat;
+  padding-left: 20px;
+  height: 20px;
+  width: 125px;
+  display: block;
+}
+
+/* BUTTONIZED LINKS - GENERAL ***********************************************/
+/* Based on http://css-tricks.com/examples/ButtonMaker */
+
+a.af-button-large,
+a.af-button-large:link,
+a.af-button-large:visited,
+a.af-button-small,
+a.af-button-small:link,
+a.af-button-small:visited,
+a.author-pane-link,
+a.author-pane-link:link,
+a.author-pane-link:visited {
+  color: #FFFFFF;
+  text-decoration: none;
+}
+
+.af-button-large,
+.af-button-small,
+.author-pane-link {
+  display: block;
+  border-top: 1px solid #1659AC;
+  background: #2587C4;
+  background: -webkit-gradient(linear, left top, left bottom, from(#2587C4), to(#58B3ED));
+  background: -moz-linear-gradient(top, #2587C4, #58B3ED);
+  color: #FFFFFF;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  -webkit-box-shadow: rgba(0,0,0,1) 0 1px 0;
+  -moz-box-shadow: rgba(0,0,0,1) 0 1px 0;
+  box-shadow: rgba(0,0,0,1) 0 1px 0;
+  text-shadow: rgba(0,0,0,.4) 0 1px 0;
+  color: #333